diff --git a/.env b/.env index 874cf90e..d4068901 100644 --- a/.env +++ b/.env @@ -1,5 +1,5 @@ API_ID=1025907 API_HASH=452b0359b988148995f22ff0f4229750 -VERSION=1.7.1 -VERSION_FULL=1.7.1 (305) -BUILD=305 +VERSION=1.7.2 +VERSION_FULL=1.7.2 (306) +BUILD=306 diff --git a/public/110.22ad5bfa72c27ec78066.bundle.js b/public/110.745cc657737d24b5aea0.bundle.js similarity index 99% rename from public/110.22ad5bfa72c27ec78066.bundle.js rename to public/110.745cc657737d24b5aea0.bundle.js index a2d223b7..eab5ce52 100644 --- a/public/110.22ad5bfa72c27ec78066.bundle.js +++ b/public/110.745cc657737d24b5aea0.bundle.js @@ -1,2 +1,2 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[110],{4159:(d,e,u)=>{var t;u.d(e,{Z:()=>s});const f=["web.telegram.org","webk.telegram.org"],r=Math.min(4,null!==(t=navigator.hardwareConcurrency)&&void 0!==t?t:4),c={id:1025907,hash:"452b0359b988148995f22ff0f4229750",version:"1.7.1",versionFull:"1.7.1 (305)",build:305,langPackVersion:"0.8.5",langPack:"webk",langPackCode:"en",domains:f,baseDcId:2,isMainDomain:f.includes(location.hostname),suffix:"K",threads:r,cryptoWorkers:r};c.isMainDomain&&(c.id=2496,c.hash="8da85b0d5bfe62527e5b244c209159c3");const s=c},3127:(d,e,u)=>{u.d(e,{Z:()=>t});const t={name:"tweb",version:7,stores:[{name:"session"},{name:"stickerSets"},{name:"users"},{name:"chats"},{name:"dialogs"},{name:"messages"}]}},8975:(d,e,u)=>{u.d(e,{Z:()=>f});var t=u(7119);function f(d,e=""){Array.isArray(d)||(d=[d]);const u=(0,t.Z)(e);return new Blob(d,{type:u})}},7119:(d,e,u)=>{function t(d){return-1===["image/jpeg","image/png","image/gif","image/svg+xml","image/webp","image/bmp","video/mp4","video/webm","video/quicktime","audio/ogg","audio/mpeg","audio/mp4","audio/wav","application/json","application/pdf"].indexOf(d)?"application/octet-stream":d}u.d(e,{Z:()=>t})},4903:(d,e,u)=>{function t(...d){const e=d.reduce(((d,e)=>d+(e.byteLength||e.length)),0),u=new Uint8Array(e);let t=0;return d.forEach((d=>{u.set(d instanceof ArrayBuffer?new Uint8Array(d):d,t),t+=d.byteLength||d.length})),u}u.d(e,{Z:()=>t})},3725:(d,e,u)=>{u.d(e,{Z:()=>f});var t=u(319);function f(){const d={isFulfilled:!1,isRejected:!1,notify:()=>{},notifyAll:(...e)=>{d.lastNotify=e,d.listeners.forEach((d=>d(...e)))},listeners:[],addNotifyListener:e=>{d.lastNotify&&e(...d.lastNotify),d.listeners.push(e)}},e=new Promise(((u,t)=>{d.resolve=d=>{e.isFulfilled||e.isRejected||(e.isFulfilled=!0,u(d))},d.reject=(...d)=>{e.isRejected||e.isFulfilled||(e.isRejected=!0,t(...d))}}));return e.catch(t.Z).finally((()=>{e.notify=e.notifyAll=e.lastNotify=null,e.listeners.length=0,e.cancel&&(e.cancel=t.Z)})),Object.assign(e,d),e}},1352:(d,e,u)=>{u.d(e,{N5:()=>f,SU:()=>t,kC:()=>r});const t="undefined"!=typeof ServiceWorkerGlobalScope&&self instanceof ServiceWorkerGlobalScope,f="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&!t,r=f||t,c=(d,...e)=>{try{d.postMessage(...e)}catch(d){console.error("[worker] postMessage error:",d,e)}},s=(d,...e)=>{self.clients.matchAll({includeUncontrolled:!1,type:"window"}).then((u=>{u.length&&u.slice(d?0:-1).forEach((d=>{c(d,...e)}))}))};t&&s.bind(null,!1),t&&s.bind(null,!0)},319:(d,e,u)=>{function t(){}u.d(e,{Z:()=>t})},8479:(d,e,u)=>{function t(d){if(null===d||"object"!=typeof d)return d;if(d instanceof Date)return new Date(d.getTime());if(Array.isArray(d))return d.map((d=>t(d)));if(ArrayBuffer.isView(d))return d.slice();const e=new d.constructor;for(var u in d)d.hasOwnProperty(u)&&(e[u]=t(d[u]));return e}u.d(e,{Z:()=>t})},6848:(d,e,u)=>{function t(d,e){const u=Object.keys,f=typeof d;return d&&e&&"object"===f&&f===typeof e?u(d).length===u(e).length&&u(d).every((u=>t(d[u],e[u]))):d===e}u.d(e,{Z:()=>t})},5880:(d,e,u)=>{function t(d){return"object"==typeof d&&null!==d}u.d(e,{Z:()=>t})},5953:(d,e,u)=>{function t(d,e){if(e)for(const u in e)void 0!==e[u]&&(d[u]=e[u]);return d}u.d(e,{Z:()=>t})},946:(d,e,u)=>{u.d(e,{Z:()=>r});var t=u(8479),f=u(5880);function r(d,e,u,c,s,n){for(const o in d){const i=n?`${n}.${o}`:o;(null==s?void 0:s.has(i))||(typeof e[o]!=typeof d[o]?(e[o]=(0,t.Z)(d[o]),null==u||u(c||o)):(0,f.Z)(d[o])&&r(d[o],e[o],u,c||o,s,i))}}},4110:(d,e,u)=>{var t=u(7361),f=u(617);String.prototype.toUserId=function(){return(+this).toUserId()},String.prototype.toChatId=function(){return(+this).toChatId()},String.prototype.toPeerId=function(d){return(+this).toPeerId(d)},String.prototype.isPeerId=function(){return/^[\d-]/.test(this.toString())},Number.prototype.toUserId=function(){return this},Number.prototype.toChatId=function(){return Math.abs(this)},Number.prototype.toPeerId=function(d){return void 0===d?this:d?-Math.abs(this):this},Number.prototype.isPeerId=function(){return!0},[["isUser",f.Z],["isAnyChat",t.Z]].forEach((d=>{const e=Array.isArray(d)?d[0]:d,u=Array.isArray(d)?d[1]:d;String.prototype[e]=function(){return u.call(null,this.toString())},Number.prototype[e]=function(){return u.call(null,this)}}))},144:(d,e,u)=>{u.d(e,{a:()=>r,d:()=>f});const t={8:new Uint8Array(1),16:new Uint16Array(1),32:new Uint32Array(1)};function f(d){const e=t[d];return crypto.getRandomValues(e),e[0]}function r(){return""+f(32)+f(32)%16777215}},5466:(d,e,u)=>{u.d(e,{$:()=>f});var t=u(5289);function f(d){return(...e)=>function(d,e,u){const f=performance.now();return(u||console).warn((0,t.Z)(),"start",e),d.then((()=>{(u||console).warn((0,t.Z)(),"end",e,performance.now()-f)})),d}(...e,d)}},5418:(d,e,u)=>{function t(d){return new Promise((e=>{setTimeout(e,d)}))}u.d(e,{Z:()=>t})},6724:(d,e,u)=>{function t(d,e,u=!0){let t,f,r=null;return(...c)=>{t=!0,f=c,r||(u&&(t=!1,d(...f)),r=setInterval((()=>{if(!t)return clearInterval(r),void(r=null);t=!1,d(...f)}),e))}}u.d(e,{Z:()=>t})},9005:(d,e,u)=>{function t(d){return d.charAt(0).toUpperCase()+d.slice(1)}u.d(e,{Z:()=>t})},8453:(d,e,u)=>{u.d(e,{Z:()=>s});var t=u(5936),f=u(3989),r=u(7487),c=u(319);function s(d,e){return Promise.all([f.Z.toggleStorage(d,e),t.Z.toggleStorage(d,e),r.Z.toggleStorage(d,e)]).then(c.Z,c.Z)}},7298:(d,e,u)=>{function t(d){const e=Date.now();return d?e/1e3|0:e}u.d(e,{Z:()=>t})},2790:(d,e,u)=>{u.d(e,{Z:()=>f});var t=u(7082);function f(d){return function(d,e){const u=t.t;if(d{u.d(e,{o:()=>t,t:()=>f});const t=65536,f=4294967295},7361:(d,e,u)=>{function t(d){return+d<0}u.d(e,{Z:()=>t})},617:(d,e,u)=>{function t(d){return+d>=0}u.d(e,{Z:()=>t})},8630:(d,e,u)=>{u.d(e,{Z:()=>n});var t=u(153),f=u(410),r=u(1352);class c extends t.Z{constructor(){super("CRYPTO"),this.lastIndex=-1}invokeCryptoNew({method:d,args:e,transfer:u}){const t={method:d,args:e},f=this.listeners.invoke;if(null==f?void 0:f.length){let d=f[0].callback(t);return r.kC||d instanceof Promise||(d=Promise.resolve(d)),d}const c="aes-encrypt"===d||"aes-decrypt"===d?this.lastIndex=(this.lastIndex+1)%this.sendPorts.length:0;return this.invoke("invoke",t,void 0,this.sendPorts[c],u)}invokeCrypto(d,...e){return this.invokeCryptoNew({method:d,args:e})}}const s=new c;f.GO&&(f.GO.cryptoMessagePort=s);const n=s},5936:(d,e,u)=>{u.d(e,{Z:()=>n});var t=u(1267),f=u(8975),r=u(5753),c=u(5471),s=u(3725);class n{constructor(d){this.dbName=d,this.useStorage=!0,t.Z.test&&(this.dbName+="_test"),n.STORAGES.length&&(this.useStorage=n.STORAGES[0].useStorage),this.openDatabase(),n.STORAGES.push(this)}openDatabase(){var d;return null!==(d=this.openDbPromise)&&void 0!==d?d:this.openDbPromise=caches.open(this.dbName)}delete(d){return this.timeoutOperation((e=>e.delete("/"+d)))}deleteAll(){return caches.delete(this.dbName)}get(d){return this.timeoutOperation((e=>e.match("/"+d)))}save(d,e){return this.timeoutOperation((u=>u.put("/"+d,e)))}getFile(d,e="blob"){return this.get(d).then((d=>{if(!d)throw(0,c.Z)("NO_ENTRY_FOUND");return d[e]()}))}saveFile(d,e){e instanceof Blob||(e=(0,f.Z)(e));const u=new Response(e,{headers:{"Content-Length":""+e.size}});return this.save(d,u).then((()=>e))}timeoutOperation(d){return this.useStorage?new Promise(((e,u)=>{return t=this,f=void 0,c=function*(){let t=!1;const f=setTimeout((()=>{u(),t=!0}),15e3);try{const u=yield this.openDatabase();if(!u)throw this.useStorage=!1,this.openDbPromise=void 0,"no cache?";const f=yield d(u);if(t)return;e(f)}catch(d){u(d)}clearTimeout(f)},new((r=void 0)||(r=Promise))((function(d,e){function u(d){try{n(c.next(d))}catch(d){e(d)}}function s(d){try{n(c.throw(d))}catch(d){e(d)}}function n(e){var t;e.done?d(e.value):(t=e.value,t instanceof r?t:new r((function(d){d(t)}))).then(u,s)}n((c=c.apply(t,f||[])).next())}));var t,f,r,c})):Promise.reject((0,c.Z)("STORAGE_OFFLINE"))}prepareWriting(d,e,u){return{deferred:(0,s.Z)(),getWriter:()=>new r.Z(u,e,(e=>this.saveFile(d,e).catch((()=>e))))}}static toggleStorage(d,e){return Promise.all(this.STORAGES.map((u=>{if(u.useStorage=d,e)return d?void 0:u.deleteAll()})))}}n.STORAGES=[]},5753:(d,e,u)=>{u.d(e,{Z:()=>f});var t=u(8975);class f{constructor(d,e,u){this.mimeType=d,this.size=e,this.saveFileCallback=u,this.bytes=new Uint8Array(e)}write(d,e){return u=this,t=void 0,r=function*(){const u=e+d.byteLength;if(u>this.bytes.byteLength){const d=new Uint8Array(u);d.set(this.bytes,0),this.bytes=d}this.bytes.set(d,e)},new((f=void 0)||(f=Promise))((function(d,e){function c(d){try{n(r.next(d))}catch(d){e(d)}}function s(d){try{n(r.throw(d))}catch(d){e(d)}}function n(e){var u;e.done?d(e.value):(u=e.value,u instanceof f?u:new f((function(d){d(u)}))).then(c,s)}n((r=r.apply(u,t||[])).next())}));var u,t,f,r}truncate(){this.bytes=new Uint8Array}trim(d){this.bytes=this.bytes.slice(0,d)}finalize(d=!0){const e=(0,t.Z)(this.bytes,this.mimeType);return d&&this.saveFileCallback&&this.saveFileCallback(e),e}getParts(){return this.bytes}replaceParts(d){this.bytes=d}}},5003:(d,e,u)=>{u.d(e,{kg:()=>l,v9:()=>t});var t,f=u(410),r=u(4762),c=u(1352),s=u(5289);!function(d){d[d.None=0]="None",d[d.Error=1]="Error",d[d.Warn=2]="Warn",d[d.Log=4]="Log",d[d.Debug=8]="Debug"}(t||(t={}));const n=[t.None,t.Error,t.Warn,t.Log,t.Debug],o=!(r.IS_SAFARI||r.IS_FIREFOX),i="",a="",h=[["debug",t.Debug],["info",t.Log],["warn",t.Warn],["error",t.Error],["assert",t.Error],["trace",t.Log],["group",t.Log],["groupCollapsed",t.Log],["groupEnd",t.Log]];function l(d,e=t.Log|t.Warn|t.Error,u=!1,r=""){let b;f.ZP||u||(e=t.Error),o?r||(c.SU?r=i:c.N5&&(r=a)):r="";const g=r;r=r?`%s ${r}%s`:"%s";const p=function(...u){return e&t.Log&&console.log(r,(0,s.Z)(),d,...u)};return h.forEach((([u,t])=>{p[u]=function(...f){return e&t&&console[u](r,(0,s.Z)(),d,...f)}})),p.setPrefix=function(e){b=e,d="["+e+"]"},p.setPrefix(d),p.setLevel=function(d){e=n.slice(0,d+1).reduce(((d,e)=>d|e),0)},p.bindPrefix=function(d){return l(`${b}] [${d}`,e,u,g)},p}},3206:(d,e,u)=>{u.d(e,{Z:()=>r});var t=u(410),f=u(153);class r extends f.Z{constructor(){super("MTPROTO"),r.INSTANCE=this,t.GO&&(t.GO.mtprotoMessagePort=this)}static getInstance(){return this.INSTANCE}}},690:(d,e,u)=>{var t=u(4903);Uint8Array.prototype.concat=function(...d){return(0,t.Z)(this,...d)},Uint8Array.prototype.toJSON=function(){return[...this]},Promise.prototype.finally=Promise.prototype.finally||function(d){const e=e=>Promise.resolve(d()).then(e);return this.then((d=>e((()=>d))),(d=>e((()=>Promise.reject(d)))))}},6637:(d,e,u)=>{u.d(e,{Z:()=>f});var t=u(2423);function f(d){return d?d.match(t.bu):null}},3655:(d,e,u)=>{u.d(e,{Z:()=>r});var t=u(153),f=u(410);class r extends t.Z{constructor(){super("SERVICE"),f.GO&&(f.GO.serviceMessagePort=this)}}},7487:(d,e,u)=>{u.d(e,{Z:()=>i});var t=u(410),f=u(1267),r=u(1352),c=u(3206);class s{constructor(){this.prefix="",this.cache={},this.useStorage=!0,f.Z.test&&(this.prefix="t_")}get(d,e=!0){if(this.cache.hasOwnProperty(d)&&e)return this.cache[d];if(this.useStorage){let e;try{e=localStorage.getItem(this.prefix+d)}catch(d){this.useStorage=!1}if(null!==e)try{e=JSON.parse(e)}catch(d){}else e=void 0;return e}}set(d,e=!1){for(const u in d)if(d.hasOwnProperty(u)){const t=d[u];if(this.cache[u]=t,this.useStorage&&!e)try{const d=JSON.stringify(t);localStorage.setItem(this.prefix+u,d)}catch(d){this.useStorage=!1}}}delete(d,e=!1){d=""+d,e||delete this.cache[d];try{localStorage.removeItem(this.prefix+d)}catch(d){}}clear(){const d=["dc","server_time_offset","xt_instance","user_auth","state_id","k_build"];for(let e=1;e<=5;++e)d.push(`dc${e}_server_salt`),d.push(`dc${e}_auth_key`);for(const e of d)this.delete(e,!0)}toggleStorage(d,e){if(this.useStorage=d,e)return d?this.set(this.cache):void this.clear()}}class n{constructor(){n.STORAGES.push(this),r.kC||(this.storage=new s)}proxy(d,...e){return u=this,t=void 0,s=function*(){return r.kC?c.Z.getInstance().invoke("localStorageProxy",{type:d,args:e}):(e=Array.prototype.slice.call(e),this.storage[d].apply(this.storage,e))},new((f=void 0)||(f=Promise))((function(d,e){function r(d){try{n(s.next(d))}catch(d){e(d)}}function c(d){try{n(s.throw(d))}catch(d){e(d)}}function n(e){var u;e.done?d(e.value):(u=e.value,u instanceof f?u:new f((function(d){d(u)}))).then(r,c)}n((s=s.apply(u,t||[])).next())}));var u,t,f,s}get(d,e){return this.proxy("get",d,e)}set(d,e){return this.proxy("set",d,e)}delete(d,e){return this.proxy("delete",d,e)}clear(){return this.proxy("clear")}toggleStorage(d,e){return this.proxy("toggleStorage",d,e)}}n.STORAGES=[];const o=new n;t.GO.appStorage=o;const i=o},7922:(d,e,u)=>{u.d(e,{Z:()=>n});var t=u(410),f=u(3989),r=u(3127);class c extends f.Z{constructor(){super(r.Z,"session")}}const s=new c;t.GO.stateStorage=s;const n=s},3989:(d,e,u)=>{u.d(e,{Z:()=>i});var t=u(410),f=u(3725),r=u(1352),c=u(6724),s=u(6666),n=function(d,e,u,t){return new(u||(u=Promise))((function(f,r){function c(d){try{n(t.next(d))}catch(d){r(d)}}function s(d){try{n(t.throw(d))}catch(d){r(d)}}function n(d){var e;d.done?f(d.value):(e=d.value,e instanceof u?e:new u((function(d){d(e)}))).then(c,s)}n((t=t.apply(d,e||[])).next())}))};function o(){}class i{constructor(d,e){this.db=d,this.storeName=e,this.cache={},this.getPromises=new Map,this.keysToSet=new Set,this.saveDeferred=(0,f.Z)(),this.keysToDelete=new Set,this.deleteDeferred=(0,f.Z)(),this.storage=new s.Z(d,e),i.STORAGES.length?this.useStorage=i.STORAGES[0].useStorage:this.useStorage=!0,this.savingFreezed=!1,i.STORAGES.push(this),this.saveThrottled=(0,c.Z)((()=>n(this,void 0,void 0,(function*(){const d=this.saveDeferred;this.saveDeferred=(0,f.Z)();const e=this.keysToSet;if(e.size){const d=Array.from(e.values());e.clear();const u=d.map((d=>this.cache[d]));try{yield this.storage.save(d,u)}catch(e){console.error("[AS]: set error:",e,d,u)}}d.resolve(),e.size&&this.saveThrottled()}))),16,!1),this.deleteThrottled=(0,c.Z)((()=>n(this,void 0,void 0,(function*(){const d=this.deleteDeferred;this.deleteDeferred=(0,f.Z)();const e=this.keysToDelete;if(e.size){const d=Array.from(e.values());e.clear();try{yield this.storage.delete(d)}catch(e){console.error("[AS]: delete error:",e,d)}}d.resolve(),e.size&&this.deleteThrottled()}))),16,!1),this.getThrottled=(0,c.Z)((()=>n(this,void 0,void 0,(function*(){const d=Array.from(this.getPromises.keys());this.storage.get(d).then((e=>{for(let u=0,t=d.length;u{new Set(["NO_ENTRY_FOUND","STORAGE_OFFLINE"]).has(u.type)||(this.useStorage=!1,console.error("[AS]: get error:",u,d,e));for(let e=0,u=d.length;e{this.getPromises.size&&this.getThrottled()}))}))),16,!1)}isAvailable(){return this.useStorage}getCache(){return this.cache}getFromCache(d){return this.cache[d]}setToCache(d,e){return this.cache[d]=e}get(d,e=!0){return n(this,void 0,void 0,(function*(){if(this.cache.hasOwnProperty(d)&&e)return this.getFromCache(d);if(this.useStorage){const e=this.getPromises.get(d);if(e)return e;const u=(0,f.Z)();return this.getPromises.set(d,u),this.getThrottled(),u}}))}getAll(){return this.storage.getAll().catch((()=>[]))}set(d,e=!1){const u=this.useStorage&&!e&&!this.savingFreezed;for(const e in d)if(d.hasOwnProperty(e)){const t=d[e];this.setToCache(e,t),u&&(this.keysToSet.add(e),this.keysToDelete.delete(e),this.saveThrottled())}return u?this.saveDeferred:Promise.resolve()}delete(d,e=!1){return d=""+d,e||delete this.cache[d],this.useStorage&&(this.keysToSet.delete(d),this.keysToDelete.add(d),this.deleteThrottled()),this.useStorage?this.deleteDeferred:Promise.resolve()}clear(d=!1){if(!d)for(const d in this.cache)delete this.cache[d];return this.storage.clear().catch(o)}static toggleStorage(d,e){return Promise.all(this.STORAGES.map((u=>{if(u.useStorage=d,r.kC&&e)return d?u.set(u.cache):(u.keysToSet.clear(),u.keysToDelete.clear(),u.getPromises.forEach((d=>d.resolve(void 0))),u.getPromises.clear(),u.clear(!0))}))).catch(o)}static freezeSaving(d,e){this.STORAGES.forEach((d=>d.savingFreezed=!0));try{d()}catch(d){console.error("freezeSaving callback error:",d)}this.STORAGES.forEach((d=>d.savingFreezed=!1))}}i.STORAGES=[],t.GO&&(t.GO.AppStorage=i)},1229:(d,e,u)=>{u.d(e,{Z:()=>t});const t="((?:๐Ÿ‘จ๐Ÿปโ€โค๏ธ?โ€๐Ÿ’‹โ€๐Ÿ‘จ\ud83c[\udffb-\udfff]|๐Ÿ‘จ๐Ÿผโ€โค๏ธ?โ€๐Ÿ’‹โ€๐Ÿ‘จ\ud83c[\udffb-\udfff]|๐Ÿ‘จ๐Ÿฝโ€โค๏ธ?โ€๐Ÿ’‹โ€๐Ÿ‘จ\ud83c[\udffb-\udfff]|๐Ÿ‘จ๐Ÿพโ€โค๏ธ?โ€๐Ÿ’‹โ€๐Ÿ‘จ\ud83c[\udffb-\udfff]|๐Ÿ‘จ๐Ÿฟโ€โค๏ธ?โ€๐Ÿ’‹โ€๐Ÿ‘จ\ud83c[\udffb-\udfff]|๐Ÿ‘ฉ๐Ÿปโ€โค๏ธ?โ€๐Ÿ’‹โ€๐Ÿ‘จ\ud83c[\udffb-\udfff]|๐Ÿ‘ฉ๐Ÿปโ€โค๏ธ?โ€๐Ÿ’‹โ€๐Ÿ‘ฉ\ud83c[\udffb-\udfff]|๐Ÿ‘ฉ๐Ÿผโ€โค๏ธ?โ€๐Ÿ’‹โ€๐Ÿ‘จ\ud83c[\udffb-\udfff]|๐Ÿ‘ฉ๐Ÿผโ€โค๏ธ?โ€๐Ÿ’‹โ€๐Ÿ‘ฉ\ud83c[\udffb-\udfff]|๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธ?โ€๐Ÿ’‹โ€๐Ÿ‘จ\ud83c[\udffb-\udfff]|๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธ?โ€๐Ÿ’‹โ€๐Ÿ‘ฉ\ud83c[\udffb-\udfff]|๐Ÿ‘ฉ๐Ÿพโ€โค๏ธ?โ€๐Ÿ’‹โ€๐Ÿ‘จ\ud83c[\udffb-\udfff]|๐Ÿ‘ฉ๐Ÿพโ€โค๏ธ?โ€๐Ÿ’‹โ€๐Ÿ‘ฉ\ud83c[\udffb-\udfff]|๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธ?โ€๐Ÿ’‹โ€๐Ÿ‘จ\ud83c[\udffb-\udfff]|๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธ?โ€๐Ÿ’‹โ€๐Ÿ‘ฉ\ud83c[\udffb-\udfff]|๐Ÿง‘๐Ÿปโ€โค๏ธ?โ€๐Ÿ’‹โ€๐Ÿง‘\ud83c[\udffc-\udfff]|๐Ÿง‘๐Ÿผโ€โค๏ธ?โ€๐Ÿ’‹โ€๐Ÿง‘\ud83c[\udffb\udffd-\udfff]|๐Ÿง‘๐Ÿฝโ€โค๏ธ?โ€๐Ÿ’‹โ€๐Ÿง‘\ud83c[\udffb\udffc\udffe\udfff]|๐Ÿง‘๐Ÿพโ€โค๏ธ?โ€๐Ÿ’‹โ€๐Ÿง‘\ud83c[\udffb-\udffd\udfff]|๐Ÿง‘๐Ÿฟโ€โค๏ธ?โ€๐Ÿ’‹โ€๐Ÿง‘\ud83c[\udffb-\udffe]|๐Ÿ‘จ๐Ÿปโ€โค๏ธ?โ€๐Ÿ‘จ\ud83c[\udffb-\udfff]|๐Ÿ‘จ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ\ud83c[\udffc-\udfff]|๐Ÿ‘จ๐Ÿผโ€โค๏ธ?โ€๐Ÿ‘จ\ud83c[\udffb-\udfff]|๐Ÿ‘จ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ\ud83c[\udffb\udffd-\udfff]|๐Ÿ‘จ๐Ÿฝโ€โค๏ธ?โ€๐Ÿ‘จ\ud83c[\udffb-\udfff]|๐Ÿ‘จ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ\ud83c[\udffb\udffc\udffe\udfff]|๐Ÿ‘จ๐Ÿพโ€โค๏ธ?โ€๐Ÿ‘จ\ud83c[\udffb-\udfff]|๐Ÿ‘จ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ\ud83c[\udffb-\udffd\udfff]|๐Ÿ‘จ๐Ÿฟโ€โค๏ธ?โ€๐Ÿ‘จ\ud83c[\udffb-\udfff]|๐Ÿ‘จ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ\ud83c[\udffb-\udffe]|๐Ÿ‘ฉ๐Ÿปโ€โค๏ธ?โ€๐Ÿ‘จ\ud83c[\udffb-\udfff]|๐Ÿ‘ฉ๐Ÿปโ€โค๏ธ?โ€๐Ÿ‘ฉ\ud83c[\udffb-\udfff]|๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ\ud83c[\udffc-\udfff]|๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘ฉ\ud83c[\udffc-\udfff]|๐Ÿ‘ฉ๐Ÿผโ€โค๏ธ?โ€๐Ÿ‘จ\ud83c[\udffb-\udfff]|๐Ÿ‘ฉ๐Ÿผโ€โค๏ธ?โ€๐Ÿ‘ฉ\ud83c[\udffb-\udfff]|๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ\ud83c[\udffb\udffd-\udfff]|๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘ฉ\ud83c[\udffb\udffd-\udfff]|๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธ?โ€๐Ÿ‘จ\ud83c[\udffb-\udfff]|๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธ?โ€๐Ÿ‘ฉ\ud83c[\udffb-\udfff]|๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ\ud83c[\udffb\udffc\udffe\udfff]|๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘ฉ\ud83c[\udffb\udffc\udffe\udfff]|๐Ÿ‘ฉ๐Ÿพโ€โค๏ธ?โ€๐Ÿ‘จ\ud83c[\udffb-\udfff]|๐Ÿ‘ฉ๐Ÿพโ€โค๏ธ?โ€๐Ÿ‘ฉ\ud83c[\udffb-\udfff]|๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ\ud83c[\udffb-\udffd\udfff]|๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘ฉ\ud83c[\udffb-\udffd\udfff]|๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธ?โ€๐Ÿ‘จ\ud83c[\udffb-\udfff]|๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธ?โ€๐Ÿ‘ฉ\ud83c[\udffb-\udfff]|๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ\ud83c[\udffb-\udffe]|๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘ฉ\ud83c[\udffb-\udffe]|๐Ÿง‘๐Ÿปโ€โค๏ธ?โ€๐Ÿง‘\ud83c[\udffc-\udfff]|๐Ÿง‘๐Ÿปโ€๐Ÿคโ€๐Ÿง‘\ud83c[\udffb-\udfff]|๐Ÿง‘๐Ÿผโ€โค๏ธ?โ€๐Ÿง‘\ud83c[\udffb\udffd-\udfff]|๐Ÿง‘๐Ÿผโ€๐Ÿคโ€๐Ÿง‘\ud83c[\udffb-\udfff]|๐Ÿง‘๐Ÿฝโ€โค๏ธ?โ€๐Ÿง‘\ud83c[\udffb\udffc\udffe\udfff]|๐Ÿง‘๐Ÿฝโ€๐Ÿคโ€๐Ÿง‘\ud83c[\udffb-\udfff]|๐Ÿง‘๐Ÿพโ€โค๏ธ?โ€๐Ÿง‘\ud83c[\udffb-\udffd\udfff]|๐Ÿง‘๐Ÿพโ€๐Ÿคโ€๐Ÿง‘\ud83c[\udffb-\udfff]|๐Ÿง‘๐Ÿฟโ€โค๏ธ?โ€๐Ÿง‘\ud83c[\udffb-\udffe]|๐Ÿง‘๐Ÿฟโ€๐Ÿคโ€๐Ÿง‘\ud83c[\udffb-\udfff]|๐Ÿ‘จโ€โค๏ธ?โ€๐Ÿ’‹โ€๐Ÿ‘จ|๐Ÿ‘ฉโ€โค๏ธ?โ€๐Ÿ’‹โ€\ud83d[\udc68\udc69]|๐Ÿซฑ๐Ÿปโ€๐Ÿซฒ\ud83c[\udffc-\udfff]|๐Ÿซฑ๐Ÿผโ€๐Ÿซฒ\ud83c[\udffb\udffd-\udfff]|๐Ÿซฑ๐Ÿฝโ€๐Ÿซฒ\ud83c[\udffb\udffc\udffe\udfff]|๐Ÿซฑ๐Ÿพโ€๐Ÿซฒ\ud83c[\udffb-\udffd\udfff]|๐Ÿซฑ๐Ÿฟโ€๐Ÿซฒ\ud83c[\udffb-\udffe]|๐Ÿ‘จโ€โค๏ธ?โ€๐Ÿ‘จ|๐Ÿ‘ฉโ€โค๏ธ?โ€\ud83d[\udc68\udc69]|๐Ÿง‘โ€๐Ÿคโ€๐Ÿง‘|๐Ÿ‘ซ\ud83c[\udffb-\udfff]|๐Ÿ‘ฌ\ud83c[\udffb-\udfff]|๐Ÿ‘ญ\ud83c[\udffb-\udfff]|๐Ÿ’\ud83c[\udffb-\udfff]|๐Ÿ’‘\ud83c[\udffb-\udfff]|๐Ÿค\ud83c[\udffb-\udfff]|\ud83d[\udc6b-\udc6d\udc8f\udc91]|๐Ÿค)|(?:\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\uddd4\uddd6-\udddd])(?:\ud83c[\udffb-\udfff])?โ€[โ™€โ™‚]๏ธ?|(?:๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ|๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘งโ€\ud83d[\udc66\udc67]|๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ|๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€\ud83d[\udc66\udc67]|๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ|๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€\ud83d[\udc66\udc67]|๐Ÿ‘จโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ|๐Ÿ‘จโ€๐Ÿ‘งโ€\ud83d[\udc66\udc67]|๐Ÿ‘จโ€๐Ÿ‘จโ€\ud83d[\udc66\udc67]|๐Ÿ‘จโ€๐Ÿ‘ฉโ€\ud83d[\udc66\udc67]|๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ|๐Ÿ‘ฉโ€๐Ÿ‘งโ€\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\udec3-\udec5\udef0-\udef6]|[โœŠโœ‹]))(?:\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-\udc8e\udc90\udc92-\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\udedd-\udedf\udeeb\udeec\udef4-\udefc\udfe0-\udfeb\udff0]|\ud83e[\udd0d\udd0e\udd10-\udd17\udd20-\udd25\udd27-\udd2f\udd3a\udd3c\udd3f-\udd45\udd47-\udd76\udd78-\uddb4\uddb7\uddba\uddbc-\uddcc\uddd0\uddde-\uddff\ude70-\ude74\ude78-\ude7c\ude80-\ude86\ude90-\udeac\udeb0-\udeba\udec0-\udec2\uded0-\uded9\udee0-\udee7]|[โฉ-โฌโฐโณโ™พโ›Žโœ…โœจโŒโŽโ“-โ•โž•-โž—โžฐโžฟ๎”Š])|๏ธ)"}}]); -//# sourceMappingURL=110.22ad5bfa72c27ec78066.bundle.js.map \ No newline at end of file +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[110],{4159:(d,e,u)=>{var t;u.d(e,{Z:()=>s});const f=["web.telegram.org","webk.telegram.org"],r=Math.min(4,null!==(t=navigator.hardwareConcurrency)&&void 0!==t?t:4),c={id:1025907,hash:"452b0359b988148995f22ff0f4229750",version:"1.7.2",versionFull:"1.7.2 (306)",build:306,langPackVersion:"0.8.5",langPack:"webk",langPackCode:"en",domains:f,baseDcId:2,isMainDomain:f.includes(location.hostname),suffix:"K",threads:r,cryptoWorkers:r};c.isMainDomain&&(c.id=2496,c.hash="8da85b0d5bfe62527e5b244c209159c3");const s=c},3127:(d,e,u)=>{u.d(e,{Z:()=>t});const t={name:"tweb",version:7,stores:[{name:"session"},{name:"stickerSets"},{name:"users"},{name:"chats"},{name:"dialogs"},{name:"messages"}]}},8975:(d,e,u)=>{u.d(e,{Z:()=>f});var t=u(7119);function f(d,e=""){Array.isArray(d)||(d=[d]);const u=(0,t.Z)(e);return new Blob(d,{type:u})}},7119:(d,e,u)=>{function t(d){return-1===["image/jpeg","image/png","image/gif","image/svg+xml","image/webp","image/bmp","video/mp4","video/webm","video/quicktime","audio/ogg","audio/mpeg","audio/mp4","audio/wav","application/json","application/pdf"].indexOf(d)?"application/octet-stream":d}u.d(e,{Z:()=>t})},4903:(d,e,u)=>{function t(...d){const e=d.reduce(((d,e)=>d+(e.byteLength||e.length)),0),u=new Uint8Array(e);let t=0;return d.forEach((d=>{u.set(d instanceof ArrayBuffer?new Uint8Array(d):d,t),t+=d.byteLength||d.length})),u}u.d(e,{Z:()=>t})},3725:(d,e,u)=>{u.d(e,{Z:()=>f});var t=u(319);function f(){const d={isFulfilled:!1,isRejected:!1,notify:()=>{},notifyAll:(...e)=>{d.lastNotify=e,d.listeners.forEach((d=>d(...e)))},listeners:[],addNotifyListener:e=>{d.lastNotify&&e(...d.lastNotify),d.listeners.push(e)}},e=new Promise(((u,t)=>{d.resolve=d=>{e.isFulfilled||e.isRejected||(e.isFulfilled=!0,u(d))},d.reject=(...d)=>{e.isRejected||e.isFulfilled||(e.isRejected=!0,t(...d))}}));return e.catch(t.Z).finally((()=>{e.notify=e.notifyAll=e.lastNotify=null,e.listeners.length=0,e.cancel&&(e.cancel=t.Z)})),Object.assign(e,d),e}},1352:(d,e,u)=>{u.d(e,{N5:()=>f,SU:()=>t,kC:()=>r});const t="undefined"!=typeof ServiceWorkerGlobalScope&&self instanceof ServiceWorkerGlobalScope,f="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&!t,r=f||t,c=(d,...e)=>{try{d.postMessage(...e)}catch(d){console.error("[worker] postMessage error:",d,e)}},s=(d,...e)=>{self.clients.matchAll({includeUncontrolled:!1,type:"window"}).then((u=>{u.length&&u.slice(d?0:-1).forEach((d=>{c(d,...e)}))}))};t&&s.bind(null,!1),t&&s.bind(null,!0)},319:(d,e,u)=>{function t(){}u.d(e,{Z:()=>t})},8479:(d,e,u)=>{function t(d){if(null===d||"object"!=typeof d)return d;if(d instanceof Date)return new Date(d.getTime());if(Array.isArray(d))return d.map((d=>t(d)));if(ArrayBuffer.isView(d))return d.slice();const e=new d.constructor;for(var u in d)d.hasOwnProperty(u)&&(e[u]=t(d[u]));return e}u.d(e,{Z:()=>t})},6848:(d,e,u)=>{function t(d,e){const u=Object.keys,f=typeof d;return d&&e&&"object"===f&&f===typeof e?u(d).length===u(e).length&&u(d).every((u=>t(d[u],e[u]))):d===e}u.d(e,{Z:()=>t})},5880:(d,e,u)=>{function t(d){return"object"==typeof d&&null!==d}u.d(e,{Z:()=>t})},5953:(d,e,u)=>{function t(d,e){if(e)for(const u in e)void 0!==e[u]&&(d[u]=e[u]);return d}u.d(e,{Z:()=>t})},946:(d,e,u)=>{u.d(e,{Z:()=>r});var t=u(8479),f=u(5880);function r(d,e,u,c,s,n){for(const o in d){const i=n?`${n}.${o}`:o;(null==s?void 0:s.has(i))||(typeof e[o]!=typeof d[o]?(e[o]=(0,t.Z)(d[o]),null==u||u(c||o)):(0,f.Z)(d[o])&&r(d[o],e[o],u,c||o,s,i))}}},4110:(d,e,u)=>{var t=u(7361),f=u(617);String.prototype.toUserId=function(){return(+this).toUserId()},String.prototype.toChatId=function(){return(+this).toChatId()},String.prototype.toPeerId=function(d){return(+this).toPeerId(d)},String.prototype.isPeerId=function(){return/^[\d-]/.test(this.toString())},Number.prototype.toUserId=function(){return this},Number.prototype.toChatId=function(){return Math.abs(this)},Number.prototype.toPeerId=function(d){return void 0===d?this:d?-Math.abs(this):this},Number.prototype.isPeerId=function(){return!0},[["isUser",f.Z],["isAnyChat",t.Z]].forEach((d=>{const e=Array.isArray(d)?d[0]:d,u=Array.isArray(d)?d[1]:d;String.prototype[e]=function(){return u.call(null,this.toString())},Number.prototype[e]=function(){return u.call(null,this)}}))},144:(d,e,u)=>{u.d(e,{a:()=>r,d:()=>f});const t={8:new Uint8Array(1),16:new Uint16Array(1),32:new Uint32Array(1)};function f(d){const e=t[d];return crypto.getRandomValues(e),e[0]}function r(){return""+f(32)+f(32)%16777215}},5466:(d,e,u)=>{u.d(e,{$:()=>f});var t=u(5289);function f(d){return(...e)=>function(d,e,u){const f=performance.now();return(u||console).warn((0,t.Z)(),"start",e),d.then((()=>{(u||console).warn((0,t.Z)(),"end",e,performance.now()-f)})),d}(...e,d)}},5418:(d,e,u)=>{function t(d){return new Promise((e=>{setTimeout(e,d)}))}u.d(e,{Z:()=>t})},6724:(d,e,u)=>{function t(d,e,u=!0){let t,f,r=null;return(...c)=>{t=!0,f=c,r||(u&&(t=!1,d(...f)),r=setInterval((()=>{if(!t)return clearInterval(r),void(r=null);t=!1,d(...f)}),e))}}u.d(e,{Z:()=>t})},9005:(d,e,u)=>{function t(d){return d.charAt(0).toUpperCase()+d.slice(1)}u.d(e,{Z:()=>t})},8453:(d,e,u)=>{u.d(e,{Z:()=>s});var t=u(5936),f=u(3989),r=u(7487),c=u(319);function s(d,e){return Promise.all([f.Z.toggleStorage(d,e),t.Z.toggleStorage(d,e),r.Z.toggleStorage(d,e)]).then(c.Z,c.Z)}},7298:(d,e,u)=>{function t(d){const e=Date.now();return d?e/1e3|0:e}u.d(e,{Z:()=>t})},2790:(d,e,u)=>{u.d(e,{Z:()=>f});var t=u(7082);function f(d){return function(d,e){const u=t.t;if(d{u.d(e,{o:()=>t,t:()=>f});const t=65536,f=4294967295},7361:(d,e,u)=>{function t(d){return+d<0}u.d(e,{Z:()=>t})},617:(d,e,u)=>{function t(d){return+d>=0}u.d(e,{Z:()=>t})},8630:(d,e,u)=>{u.d(e,{Z:()=>n});var t=u(153),f=u(410),r=u(1352);class c extends t.Z{constructor(){super("CRYPTO"),this.lastIndex=-1}invokeCryptoNew({method:d,args:e,transfer:u}){const t={method:d,args:e},f=this.listeners.invoke;if(null==f?void 0:f.length){let d=f[0].callback(t);return r.kC||d instanceof Promise||(d=Promise.resolve(d)),d}const c="aes-encrypt"===d||"aes-decrypt"===d?this.lastIndex=(this.lastIndex+1)%this.sendPorts.length:0;return this.invoke("invoke",t,void 0,this.sendPorts[c],u)}invokeCrypto(d,...e){return this.invokeCryptoNew({method:d,args:e})}}const s=new c;f.GO&&(f.GO.cryptoMessagePort=s);const n=s},5936:(d,e,u)=>{u.d(e,{Z:()=>n});var t=u(1267),f=u(8975),r=u(5753),c=u(5471),s=u(3725);class n{constructor(d){this.dbName=d,this.useStorage=!0,t.Z.test&&(this.dbName+="_test"),n.STORAGES.length&&(this.useStorage=n.STORAGES[0].useStorage),this.openDatabase(),n.STORAGES.push(this)}openDatabase(){var d;return null!==(d=this.openDbPromise)&&void 0!==d?d:this.openDbPromise=caches.open(this.dbName)}delete(d){return this.timeoutOperation((e=>e.delete("/"+d)))}deleteAll(){return caches.delete(this.dbName)}get(d){return this.timeoutOperation((e=>e.match("/"+d)))}save(d,e){return this.timeoutOperation((u=>u.put("/"+d,e)))}getFile(d,e="blob"){return this.get(d).then((d=>{if(!d)throw(0,c.Z)("NO_ENTRY_FOUND");return d[e]()}))}saveFile(d,e){e instanceof Blob||(e=(0,f.Z)(e));const u=new Response(e,{headers:{"Content-Length":""+e.size}});return this.save(d,u).then((()=>e))}timeoutOperation(d){return this.useStorage?new Promise(((e,u)=>{return t=this,f=void 0,c=function*(){let t=!1;const f=setTimeout((()=>{u(),t=!0}),15e3);try{const u=yield this.openDatabase();if(!u)throw this.useStorage=!1,this.openDbPromise=void 0,"no cache?";const f=yield d(u);if(t)return;e(f)}catch(d){u(d)}clearTimeout(f)},new((r=void 0)||(r=Promise))((function(d,e){function u(d){try{n(c.next(d))}catch(d){e(d)}}function s(d){try{n(c.throw(d))}catch(d){e(d)}}function n(e){var t;e.done?d(e.value):(t=e.value,t instanceof r?t:new r((function(d){d(t)}))).then(u,s)}n((c=c.apply(t,f||[])).next())}));var t,f,r,c})):Promise.reject((0,c.Z)("STORAGE_OFFLINE"))}prepareWriting(d,e,u){return{deferred:(0,s.Z)(),getWriter:()=>new r.Z(u,e,(e=>this.saveFile(d,e).catch((()=>e))))}}static toggleStorage(d,e){return Promise.all(this.STORAGES.map((u=>{if(u.useStorage=d,e)return d?void 0:u.deleteAll()})))}}n.STORAGES=[]},5753:(d,e,u)=>{u.d(e,{Z:()=>f});var t=u(8975);class f{constructor(d,e,u){this.mimeType=d,this.size=e,this.saveFileCallback=u,this.bytes=new Uint8Array(e)}write(d,e){return u=this,t=void 0,r=function*(){const u=e+d.byteLength;if(u>this.bytes.byteLength){const d=new Uint8Array(u);d.set(this.bytes,0),this.bytes=d}this.bytes.set(d,e)},new((f=void 0)||(f=Promise))((function(d,e){function c(d){try{n(r.next(d))}catch(d){e(d)}}function s(d){try{n(r.throw(d))}catch(d){e(d)}}function n(e){var u;e.done?d(e.value):(u=e.value,u instanceof f?u:new f((function(d){d(u)}))).then(c,s)}n((r=r.apply(u,t||[])).next())}));var u,t,f,r}truncate(){this.bytes=new Uint8Array}trim(d){this.bytes=this.bytes.slice(0,d)}finalize(d=!0){const e=(0,t.Z)(this.bytes,this.mimeType);return d&&this.saveFileCallback&&this.saveFileCallback(e),e}getParts(){return this.bytes}replaceParts(d){this.bytes=d}}},5003:(d,e,u)=>{u.d(e,{kg:()=>l,v9:()=>t});var t,f=u(410),r=u(4762),c=u(1352),s=u(5289);!function(d){d[d.None=0]="None",d[d.Error=1]="Error",d[d.Warn=2]="Warn",d[d.Log=4]="Log",d[d.Debug=8]="Debug"}(t||(t={}));const n=[t.None,t.Error,t.Warn,t.Log,t.Debug],o=!(r.IS_SAFARI||r.IS_FIREFOX),i="",a="",h=[["debug",t.Debug],["info",t.Log],["warn",t.Warn],["error",t.Error],["assert",t.Error],["trace",t.Log],["group",t.Log],["groupCollapsed",t.Log],["groupEnd",t.Log]];function l(d,e=t.Log|t.Warn|t.Error,u=!1,r=""){let b;f.ZP||u||(e=t.Error),o?r||(c.SU?r=i:c.N5&&(r=a)):r="";const g=r;r=r?`%s ${r}%s`:"%s";const p=function(...u){return e&t.Log&&console.log(r,(0,s.Z)(),d,...u)};return h.forEach((([u,t])=>{p[u]=function(...f){return e&t&&console[u](r,(0,s.Z)(),d,...f)}})),p.setPrefix=function(e){b=e,d="["+e+"]"},p.setPrefix(d),p.setLevel=function(d){e=n.slice(0,d+1).reduce(((d,e)=>d|e),0)},p.bindPrefix=function(d){return l(`${b}] [${d}`,e,u,g)},p}},3206:(d,e,u)=>{u.d(e,{Z:()=>r});var t=u(410),f=u(153);class r extends f.Z{constructor(){super("MTPROTO"),r.INSTANCE=this,t.GO&&(t.GO.mtprotoMessagePort=this)}static getInstance(){return this.INSTANCE}}},690:(d,e,u)=>{var t=u(4903);Uint8Array.prototype.concat=function(...d){return(0,t.Z)(this,...d)},Uint8Array.prototype.toJSON=function(){return[...this]},Promise.prototype.finally=Promise.prototype.finally||function(d){const e=e=>Promise.resolve(d()).then(e);return this.then((d=>e((()=>d))),(d=>e((()=>Promise.reject(d)))))}},6637:(d,e,u)=>{u.d(e,{Z:()=>f});var t=u(2423);function f(d){return d?d.match(t.bu):null}},3655:(d,e,u)=>{u.d(e,{Z:()=>r});var t=u(153),f=u(410);class r extends t.Z{constructor(){super("SERVICE"),f.GO&&(f.GO.serviceMessagePort=this)}}},7487:(d,e,u)=>{u.d(e,{Z:()=>i});var t=u(410),f=u(1267),r=u(1352),c=u(3206);class s{constructor(){this.prefix="",this.cache={},this.useStorage=!0,f.Z.test&&(this.prefix="t_")}get(d,e=!0){if(this.cache.hasOwnProperty(d)&&e)return this.cache[d];if(this.useStorage){let e;try{e=localStorage.getItem(this.prefix+d)}catch(d){this.useStorage=!1}if(null!==e)try{e=JSON.parse(e)}catch(d){}else e=void 0;return e}}set(d,e=!1){for(const u in d)if(d.hasOwnProperty(u)){const t=d[u];if(this.cache[u]=t,this.useStorage&&!e)try{const d=JSON.stringify(t);localStorage.setItem(this.prefix+u,d)}catch(d){this.useStorage=!1}}}delete(d,e=!1){d=""+d,e||delete this.cache[d];try{localStorage.removeItem(this.prefix+d)}catch(d){}}clear(){const d=["dc","server_time_offset","xt_instance","user_auth","state_id","k_build"];for(let e=1;e<=5;++e)d.push(`dc${e}_server_salt`),d.push(`dc${e}_auth_key`);for(const e of d)this.delete(e,!0)}toggleStorage(d,e){if(this.useStorage=d,e)return d?this.set(this.cache):void this.clear()}}class n{constructor(){n.STORAGES.push(this),r.kC||(this.storage=new s)}proxy(d,...e){return u=this,t=void 0,s=function*(){return r.kC?c.Z.getInstance().invoke("localStorageProxy",{type:d,args:e}):(e=Array.prototype.slice.call(e),this.storage[d].apply(this.storage,e))},new((f=void 0)||(f=Promise))((function(d,e){function r(d){try{n(s.next(d))}catch(d){e(d)}}function c(d){try{n(s.throw(d))}catch(d){e(d)}}function n(e){var u;e.done?d(e.value):(u=e.value,u instanceof f?u:new f((function(d){d(u)}))).then(r,c)}n((s=s.apply(u,t||[])).next())}));var u,t,f,s}get(d,e){return this.proxy("get",d,e)}set(d,e){return this.proxy("set",d,e)}delete(d,e){return this.proxy("delete",d,e)}clear(){return this.proxy("clear")}toggleStorage(d,e){return this.proxy("toggleStorage",d,e)}}n.STORAGES=[];const o=new n;t.GO.appStorage=o;const i=o},7922:(d,e,u)=>{u.d(e,{Z:()=>n});var t=u(410),f=u(3989),r=u(3127);class c extends f.Z{constructor(){super(r.Z,"session")}}const s=new c;t.GO.stateStorage=s;const n=s},3989:(d,e,u)=>{u.d(e,{Z:()=>i});var t=u(410),f=u(3725),r=u(1352),c=u(6724),s=u(6666),n=function(d,e,u,t){return new(u||(u=Promise))((function(f,r){function c(d){try{n(t.next(d))}catch(d){r(d)}}function s(d){try{n(t.throw(d))}catch(d){r(d)}}function n(d){var e;d.done?f(d.value):(e=d.value,e instanceof u?e:new u((function(d){d(e)}))).then(c,s)}n((t=t.apply(d,e||[])).next())}))};function o(){}class i{constructor(d,e){this.db=d,this.storeName=e,this.cache={},this.getPromises=new Map,this.keysToSet=new Set,this.saveDeferred=(0,f.Z)(),this.keysToDelete=new Set,this.deleteDeferred=(0,f.Z)(),this.storage=new s.Z(d,e),i.STORAGES.length?this.useStorage=i.STORAGES[0].useStorage:this.useStorage=!0,this.savingFreezed=!1,i.STORAGES.push(this),this.saveThrottled=(0,c.Z)((()=>n(this,void 0,void 0,(function*(){const d=this.saveDeferred;this.saveDeferred=(0,f.Z)();const e=this.keysToSet;if(e.size){const d=Array.from(e.values());e.clear();const u=d.map((d=>this.cache[d]));try{yield this.storage.save(d,u)}catch(e){console.error("[AS]: set error:",e,d,u)}}d.resolve(),e.size&&this.saveThrottled()}))),16,!1),this.deleteThrottled=(0,c.Z)((()=>n(this,void 0,void 0,(function*(){const d=this.deleteDeferred;this.deleteDeferred=(0,f.Z)();const e=this.keysToDelete;if(e.size){const d=Array.from(e.values());e.clear();try{yield this.storage.delete(d)}catch(e){console.error("[AS]: delete error:",e,d)}}d.resolve(),e.size&&this.deleteThrottled()}))),16,!1),this.getThrottled=(0,c.Z)((()=>n(this,void 0,void 0,(function*(){const d=Array.from(this.getPromises.keys());this.storage.get(d).then((e=>{for(let u=0,t=d.length;u{new Set(["NO_ENTRY_FOUND","STORAGE_OFFLINE"]).has(u.type)||(this.useStorage=!1,console.error("[AS]: get error:",u,d,e));for(let e=0,u=d.length;e{this.getPromises.size&&this.getThrottled()}))}))),16,!1)}isAvailable(){return this.useStorage}getCache(){return this.cache}getFromCache(d){return this.cache[d]}setToCache(d,e){return this.cache[d]=e}get(d,e=!0){return n(this,void 0,void 0,(function*(){if(this.cache.hasOwnProperty(d)&&e)return this.getFromCache(d);if(this.useStorage){const e=this.getPromises.get(d);if(e)return e;const u=(0,f.Z)();return this.getPromises.set(d,u),this.getThrottled(),u}}))}getAll(){return this.storage.getAll().catch((()=>[]))}set(d,e=!1){const u=this.useStorage&&!e&&!this.savingFreezed;for(const e in d)if(d.hasOwnProperty(e)){const t=d[e];this.setToCache(e,t),u&&(this.keysToSet.add(e),this.keysToDelete.delete(e),this.saveThrottled())}return u?this.saveDeferred:Promise.resolve()}delete(d,e=!1){return d=""+d,e||delete this.cache[d],this.useStorage&&(this.keysToSet.delete(d),this.keysToDelete.add(d),this.deleteThrottled()),this.useStorage?this.deleteDeferred:Promise.resolve()}clear(d=!1){if(!d)for(const d in this.cache)delete this.cache[d];return this.storage.clear().catch(o)}static toggleStorage(d,e){return Promise.all(this.STORAGES.map((u=>{if(u.useStorage=d,r.kC&&e)return d?u.set(u.cache):(u.keysToSet.clear(),u.keysToDelete.clear(),u.getPromises.forEach((d=>d.resolve(void 0))),u.getPromises.clear(),u.clear(!0))}))).catch(o)}static freezeSaving(d,e){this.STORAGES.forEach((d=>d.savingFreezed=!0));try{d()}catch(d){console.error("freezeSaving callback error:",d)}this.STORAGES.forEach((d=>d.savingFreezed=!1))}}i.STORAGES=[],t.GO&&(t.GO.AppStorage=i)},1229:(d,e,u)=>{u.d(e,{Z:()=>t});const t="((?:๐Ÿ‘จ๐Ÿปโ€โค๏ธ?โ€๐Ÿ’‹โ€๐Ÿ‘จ\ud83c[\udffb-\udfff]|๐Ÿ‘จ๐Ÿผโ€โค๏ธ?โ€๐Ÿ’‹โ€๐Ÿ‘จ\ud83c[\udffb-\udfff]|๐Ÿ‘จ๐Ÿฝโ€โค๏ธ?โ€๐Ÿ’‹โ€๐Ÿ‘จ\ud83c[\udffb-\udfff]|๐Ÿ‘จ๐Ÿพโ€โค๏ธ?โ€๐Ÿ’‹โ€๐Ÿ‘จ\ud83c[\udffb-\udfff]|๐Ÿ‘จ๐Ÿฟโ€โค๏ธ?โ€๐Ÿ’‹โ€๐Ÿ‘จ\ud83c[\udffb-\udfff]|๐Ÿ‘ฉ๐Ÿปโ€โค๏ธ?โ€๐Ÿ’‹โ€๐Ÿ‘จ\ud83c[\udffb-\udfff]|๐Ÿ‘ฉ๐Ÿปโ€โค๏ธ?โ€๐Ÿ’‹โ€๐Ÿ‘ฉ\ud83c[\udffb-\udfff]|๐Ÿ‘ฉ๐Ÿผโ€โค๏ธ?โ€๐Ÿ’‹โ€๐Ÿ‘จ\ud83c[\udffb-\udfff]|๐Ÿ‘ฉ๐Ÿผโ€โค๏ธ?โ€๐Ÿ’‹โ€๐Ÿ‘ฉ\ud83c[\udffb-\udfff]|๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธ?โ€๐Ÿ’‹โ€๐Ÿ‘จ\ud83c[\udffb-\udfff]|๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธ?โ€๐Ÿ’‹โ€๐Ÿ‘ฉ\ud83c[\udffb-\udfff]|๐Ÿ‘ฉ๐Ÿพโ€โค๏ธ?โ€๐Ÿ’‹โ€๐Ÿ‘จ\ud83c[\udffb-\udfff]|๐Ÿ‘ฉ๐Ÿพโ€โค๏ธ?โ€๐Ÿ’‹โ€๐Ÿ‘ฉ\ud83c[\udffb-\udfff]|๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธ?โ€๐Ÿ’‹โ€๐Ÿ‘จ\ud83c[\udffb-\udfff]|๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธ?โ€๐Ÿ’‹โ€๐Ÿ‘ฉ\ud83c[\udffb-\udfff]|๐Ÿง‘๐Ÿปโ€โค๏ธ?โ€๐Ÿ’‹โ€๐Ÿง‘\ud83c[\udffc-\udfff]|๐Ÿง‘๐Ÿผโ€โค๏ธ?โ€๐Ÿ’‹โ€๐Ÿง‘\ud83c[\udffb\udffd-\udfff]|๐Ÿง‘๐Ÿฝโ€โค๏ธ?โ€๐Ÿ’‹โ€๐Ÿง‘\ud83c[\udffb\udffc\udffe\udfff]|๐Ÿง‘๐Ÿพโ€โค๏ธ?โ€๐Ÿ’‹โ€๐Ÿง‘\ud83c[\udffb-\udffd\udfff]|๐Ÿง‘๐Ÿฟโ€โค๏ธ?โ€๐Ÿ’‹โ€๐Ÿง‘\ud83c[\udffb-\udffe]|๐Ÿ‘จ๐Ÿปโ€โค๏ธ?โ€๐Ÿ‘จ\ud83c[\udffb-\udfff]|๐Ÿ‘จ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ\ud83c[\udffc-\udfff]|๐Ÿ‘จ๐Ÿผโ€โค๏ธ?โ€๐Ÿ‘จ\ud83c[\udffb-\udfff]|๐Ÿ‘จ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ\ud83c[\udffb\udffd-\udfff]|๐Ÿ‘จ๐Ÿฝโ€โค๏ธ?โ€๐Ÿ‘จ\ud83c[\udffb-\udfff]|๐Ÿ‘จ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ\ud83c[\udffb\udffc\udffe\udfff]|๐Ÿ‘จ๐Ÿพโ€โค๏ธ?โ€๐Ÿ‘จ\ud83c[\udffb-\udfff]|๐Ÿ‘จ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ\ud83c[\udffb-\udffd\udfff]|๐Ÿ‘จ๐Ÿฟโ€โค๏ธ?โ€๐Ÿ‘จ\ud83c[\udffb-\udfff]|๐Ÿ‘จ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ\ud83c[\udffb-\udffe]|๐Ÿ‘ฉ๐Ÿปโ€โค๏ธ?โ€๐Ÿ‘จ\ud83c[\udffb-\udfff]|๐Ÿ‘ฉ๐Ÿปโ€โค๏ธ?โ€๐Ÿ‘ฉ\ud83c[\udffb-\udfff]|๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ\ud83c[\udffc-\udfff]|๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘ฉ\ud83c[\udffc-\udfff]|๐Ÿ‘ฉ๐Ÿผโ€โค๏ธ?โ€๐Ÿ‘จ\ud83c[\udffb-\udfff]|๐Ÿ‘ฉ๐Ÿผโ€โค๏ธ?โ€๐Ÿ‘ฉ\ud83c[\udffb-\udfff]|๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ\ud83c[\udffb\udffd-\udfff]|๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘ฉ\ud83c[\udffb\udffd-\udfff]|๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธ?โ€๐Ÿ‘จ\ud83c[\udffb-\udfff]|๐Ÿ‘ฉ๐Ÿฝโ€โค๏ธ?โ€๐Ÿ‘ฉ\ud83c[\udffb-\udfff]|๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ\ud83c[\udffb\udffc\udffe\udfff]|๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘ฉ\ud83c[\udffb\udffc\udffe\udfff]|๐Ÿ‘ฉ๐Ÿพโ€โค๏ธ?โ€๐Ÿ‘จ\ud83c[\udffb-\udfff]|๐Ÿ‘ฉ๐Ÿพโ€โค๏ธ?โ€๐Ÿ‘ฉ\ud83c[\udffb-\udfff]|๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ\ud83c[\udffb-\udffd\udfff]|๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘ฉ\ud83c[\udffb-\udffd\udfff]|๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธ?โ€๐Ÿ‘จ\ud83c[\udffb-\udfff]|๐Ÿ‘ฉ๐Ÿฟโ€โค๏ธ?โ€๐Ÿ‘ฉ\ud83c[\udffb-\udfff]|๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ\ud83c[\udffb-\udffe]|๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘ฉ\ud83c[\udffb-\udffe]|๐Ÿง‘๐Ÿปโ€โค๏ธ?โ€๐Ÿง‘\ud83c[\udffc-\udfff]|๐Ÿง‘๐Ÿปโ€๐Ÿคโ€๐Ÿง‘\ud83c[\udffb-\udfff]|๐Ÿง‘๐Ÿผโ€โค๏ธ?โ€๐Ÿง‘\ud83c[\udffb\udffd-\udfff]|๐Ÿง‘๐Ÿผโ€๐Ÿคโ€๐Ÿง‘\ud83c[\udffb-\udfff]|๐Ÿง‘๐Ÿฝโ€โค๏ธ?โ€๐Ÿง‘\ud83c[\udffb\udffc\udffe\udfff]|๐Ÿง‘๐Ÿฝโ€๐Ÿคโ€๐Ÿง‘\ud83c[\udffb-\udfff]|๐Ÿง‘๐Ÿพโ€โค๏ธ?โ€๐Ÿง‘\ud83c[\udffb-\udffd\udfff]|๐Ÿง‘๐Ÿพโ€๐Ÿคโ€๐Ÿง‘\ud83c[\udffb-\udfff]|๐Ÿง‘๐Ÿฟโ€โค๏ธ?โ€๐Ÿง‘\ud83c[\udffb-\udffe]|๐Ÿง‘๐Ÿฟโ€๐Ÿคโ€๐Ÿง‘\ud83c[\udffb-\udfff]|๐Ÿ‘จโ€โค๏ธ?โ€๐Ÿ’‹โ€๐Ÿ‘จ|๐Ÿ‘ฉโ€โค๏ธ?โ€๐Ÿ’‹โ€\ud83d[\udc68\udc69]|๐Ÿซฑ๐Ÿปโ€๐Ÿซฒ\ud83c[\udffc-\udfff]|๐Ÿซฑ๐Ÿผโ€๐Ÿซฒ\ud83c[\udffb\udffd-\udfff]|๐Ÿซฑ๐Ÿฝโ€๐Ÿซฒ\ud83c[\udffb\udffc\udffe\udfff]|๐Ÿซฑ๐Ÿพโ€๐Ÿซฒ\ud83c[\udffb-\udffd\udfff]|๐Ÿซฑ๐Ÿฟโ€๐Ÿซฒ\ud83c[\udffb-\udffe]|๐Ÿ‘จโ€โค๏ธ?โ€๐Ÿ‘จ|๐Ÿ‘ฉโ€โค๏ธ?โ€\ud83d[\udc68\udc69]|๐Ÿง‘โ€๐Ÿคโ€๐Ÿง‘|๐Ÿ‘ซ\ud83c[\udffb-\udfff]|๐Ÿ‘ฌ\ud83c[\udffb-\udfff]|๐Ÿ‘ญ\ud83c[\udffb-\udfff]|๐Ÿ’\ud83c[\udffb-\udfff]|๐Ÿ’‘\ud83c[\udffb-\udfff]|๐Ÿค\ud83c[\udffb-\udfff]|\ud83d[\udc6b-\udc6d\udc8f\udc91]|๐Ÿค)|(?:\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\uddd4\uddd6-\udddd])(?:\ud83c[\udffb-\udfff])?โ€[โ™€โ™‚]๏ธ?|(?:๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ|๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘งโ€\ud83d[\udc66\udc67]|๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ|๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€\ud83d[\udc66\udc67]|๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ|๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€\ud83d[\udc66\udc67]|๐Ÿ‘จโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ|๐Ÿ‘จโ€๐Ÿ‘งโ€\ud83d[\udc66\udc67]|๐Ÿ‘จโ€๐Ÿ‘จโ€\ud83d[\udc66\udc67]|๐Ÿ‘จโ€๐Ÿ‘ฉโ€\ud83d[\udc66\udc67]|๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ|๐Ÿ‘ฉโ€๐Ÿ‘งโ€\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\udec3-\udec5\udef0-\udef6]|[โœŠโœ‹]))(?:\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-\udc8e\udc90\udc92-\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\udedd-\udedf\udeeb\udeec\udef4-\udefc\udfe0-\udfeb\udff0]|\ud83e[\udd0d\udd0e\udd10-\udd17\udd20-\udd25\udd27-\udd2f\udd3a\udd3c\udd3f-\udd45\udd47-\udd76\udd78-\uddb4\uddb7\uddba\uddbc-\uddcc\uddd0\uddde-\uddff\ude70-\ude74\ude78-\ude7c\ude80-\ude86\ude90-\udeac\udeb0-\udeba\udec0-\udec2\uded0-\uded9\udee0-\udee7]|[โฉ-โฌโฐโณโ™พโ›Žโœ…โœจโŒโŽโ“-โ•โž•-โž—โžฐโžฟ๎”Š])|๏ธ)"}}]); +//# sourceMappingURL=110.745cc657737d24b5aea0.bundle.js.map \ No newline at end of file diff --git a/public/110.22ad5bfa72c27ec78066.bundle.js.map b/public/110.745cc657737d24b5aea0.bundle.js.map similarity index 99% rename from public/110.22ad5bfa72c27ec78066.bundle.js.map rename to public/110.745cc657737d24b5aea0.bundle.js.map index d585019b..820e1c5d 100644 --- a/public/110.22ad5bfa72c27ec78066.bundle.js.map +++ b/public/110.745cc657737d24b5aea0.bundle.js.map @@ -1 +1 @@ -{"version":3,"file":"110.22ad5bfa72c27ec78066.bundle.js","mappings":"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","sources":["webpack://tweb/./src/config/app.ts","webpack://tweb/./src/config/databases/state.ts","webpack://tweb/./src/helpers/blob/blobConstruct.ts","webpack://tweb/./src/helpers/blob/blobSafeMimeType.ts","webpack://tweb/./src/helpers/bytes/bufferConcats.ts","webpack://tweb/./src/helpers/cancellablePromise.ts","webpack://tweb/./src/helpers/context.ts","webpack://tweb/./src/helpers/noop.ts","webpack://tweb/./src/helpers/object/copy.ts","webpack://tweb/./src/helpers/object/deepEqual.ts","webpack://tweb/./src/helpers/object/isObject.ts","webpack://tweb/./src/helpers/object/safeAssign.ts","webpack://tweb/./src/helpers/object/validateInitObject.ts","webpack://tweb/./src/helpers/peerIdPolyfill.ts","webpack://tweb/./src/helpers/random.ts","webpack://tweb/./src/helpers/recordPromise.ts","webpack://tweb/./src/helpers/schedulers/pause.ts","webpack://tweb/./src/helpers/schedulers/throttle.ts","webpack://tweb/./src/helpers/string/capitalizeFirstLetter.ts","webpack://tweb/./src/helpers/toggleStorages.ts","webpack://tweb/./src/helpers/tsNow.ts","webpack://tweb/./src/lib/appManagers/utils/messageId/getServerMessageId.ts","webpack://tweb/./src/lib/appManagers/utils/messageId/clearMessageId.ts","webpack://tweb/./src/lib/appManagers/utils/messageId/index.ts","webpack://tweb/./src/lib/appManagers/utils/peers/isAnyChat.ts","webpack://tweb/./src/lib/appManagers/utils/peers/isUser.ts","webpack://tweb/./src/lib/crypto/cryptoMessagePort.ts","webpack://tweb/./src/lib/files/cacheStorage.ts","webpack://tweb/./src/lib/files/memoryWriter.ts","webpack://tweb/./src/lib/logger.ts","webpack://tweb/./src/lib/mtproto/mtprotoMessagePort.ts","webpack://tweb/./src/lib/polyfill.ts","webpack://tweb/./src/lib/richTextProcessor/matchUrlProtocol.ts","webpack://tweb/./src/lib/serviceWorker/serviceMessagePort.ts","webpack://tweb/./src/lib/localStorage.ts","webpack://tweb/./src/lib/sessionStorage.ts","webpack://tweb/./src/lib/stateStorage.ts","webpack://tweb/./src/lib/storage.ts","webpack://tweb/./src/vendor/emoji/regex.ts"],"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 * 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_DOMAINS = ['web.telegram.org', 'webk.telegram.org'];\n\nconst threads = Math.min(4, navigator.hardwareConcurrency ?? 4);\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.8.5',\n langPack: 'webk',\n langPackCode: 'en',\n domains: MAIN_DOMAINS,\n baseDcId: 2 as DcId,\n isMainDomain: MAIN_DOMAINS.includes(location.hostname),\n suffix: 'K',\n threads,\n cryptoWorkers: threads\n};\n\nif(App.isMainDomain) { // use Webogram credentials then\n App.id = 2496;\n App.hash = '8da85b0d5bfe62527e5b244c209159c3';\n}\n\nexport default App;\n","/*\n * 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 {Database} from '.';\nimport type {IDBIndex} from '../../lib/files/idb';\n\nconst DATABASE_STATE: Database<'session' | 'stickerSets' | 'users' | 'chats' | 'messages' | 'dialogs'> = {\n name: 'tweb',\n version: 7,\n stores: [{\n name: 'session'\n }, {\n name: 'stickerSets'\n }, {\n name: 'users'\n }, {\n name: 'chats'\n }, {\n name: 'dialogs'\n // indexes: [\n // ...(new Array(20 + 2).fill(0)).map((_, idx) => {\n // const name = `index_${idx}`;\n // const index: IDBIndex = {\n // indexName: name,\n // keyPath: name,\n // objectParameters: {}\n // };\n\n // return index\n // })\n // ]\n }, {\n name: 'messages'\n }]\n};\n\nexport default DATABASE_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 blobSafeMimeType from './blobSafeMimeType';\n\nexport default function blobConstruct(blobParts: Array | T, mimeType: string = ''): Blob {\n if(!Array.isArray(blobParts)) {\n blobParts = [blobParts];\n }\n\n const safeMimeType = blobSafeMimeType(mimeType);\n const blob = new Blob(blobParts, {type: safeMimeType});\n return blob;\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// https://www.iana.org/assignments/media-types/media-types.xhtml\nexport default function blobSafeMimeType(mimeType: string) {\n if([\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/svg+xml',\n 'image/webp',\n 'image/bmp',\n 'video/mp4',\n 'video/webm',\n 'video/quicktime',\n 'audio/ogg',\n 'audio/mpeg',\n 'audio/mp4',\n 'audio/wav', // though it is not in list\n 'application/json',\n 'application/pdf'\n ].indexOf(mimeType) === -1) {\n return 'application/octet-stream';\n }\n\n return mimeType;\n}\n","export default function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\n\n const tmp = new Uint8Array(length);\n\n let lastLength = 0;\n args.forEach((b) => {\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\n });\n\n return tmp/* .buffer */;\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 './noop';\n\nexport interface CancellablePromise extends Promise {\n resolve?: (value: T) => void,\n reject?: (...args: any[]) => void,\n cancel?: (reason?: any) => void,\n\n notify?: (...args: any[]) => void,\n notifyAll?: (...args: any[]) => void,\n lastNotify?: any,\n listeners?: Array<(...args: any[]) => void>,\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\n\n isFulfilled?: boolean,\n isRejected?: boolean\n}\n\nexport default function deferredPromise() {\n const deferredHelper: any = {\n isFulfilled: false,\n isRejected: false,\n\n notify: () => {},\n notifyAll: (...args: any[]) => {\n deferredHelper.lastNotify = args;\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\n },\n\n listeners: [],\n addNotifyListener: (callback: (...args: any[]) => void) => {\n if(deferredHelper.lastNotify) {\n callback(...deferredHelper.lastNotify);\n }\n\n deferredHelper.listeners.push(callback);\n }\n };\n\n const deferred: CancellablePromise = new Promise((resolve, reject) => {\n deferredHelper.resolve = (value: T) => {\n if(deferred.isFulfilled || deferred.isRejected) return;\n\n deferred.isFulfilled = true;\n resolve(value);\n };\n\n deferredHelper.reject = (...args: any[]) => {\n if(deferred.isRejected || deferred.isFulfilled) return;\n\n deferred.isRejected = true;\n reject(...args);\n };\n });\n\n // @ts-ignore\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\n const n = deferredPromise>();\n\n }; */\n\n deferred.catch(noop).finally(() => {\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\n deferred.listeners.length = 0;\n\n if(deferred.cancel) {\n deferred.cancel = noop;\n }\n });\n\n Object.assign(deferred, deferredHelper);\n\n return deferred;\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// ะฒ SW ะผะพะถะตั‚ ะฑั‹ั‚ัŒ ัั€ะฐะทัƒ ะดะฒะต ะฟะตั€ะตะผะตะฝะฝั‹ั… TRUE\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\n\nexport const getWindowClients = () => {\n return (self as any as ServiceWorkerGlobalScope)\n .clients\n .matchAll({includeUncontrolled: false, type: 'window'});\n};\n\nexport const getLastWindowClient = () => getWindowClients().then((windowClients) => windowClients.slice(-1)[0]);\n\nconst postMessage = (listener: WindowClient | DedicatedWorkerGlobalScope, ...args: any[]) => {\n try {\n // @ts-ignore\n listener.postMessage(...args);\n } catch(err) {\n console.error('[worker] postMessage error:', err, args);\n }\n};\n\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\n getWindowClients().then((listeners) => {\n if(!listeners.length) {\n // console.trace('no listeners?', self, listeners);\n return;\n }\n\n listeners.slice(all ? 0 : -1).forEach((listener) => {\n postMessage(listener, ...args);\n });\n });\n};\n\nconst notifyWorker = (...args: any[]) => {\n postMessage(self as any as DedicatedWorkerGlobalScope, ...args);\n};\n\nconst noop = () => {};\n\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\n","export default function noop() {}\n","export default function copy(obj: T): T {\n // in case of premitives\n if(obj === null || typeof(obj) !== 'object') {\n return obj;\n }\n\n // date objects should be\n if(obj instanceof Date) {\n return new Date(obj.getTime()) as any;\n }\n\n // handle Array\n if(Array.isArray(obj)) {\n // @ts-ignore\n const clonedArr: T = obj.map((el) => copy(el)) as any as T;\n return clonedArr;\n }\n\n if(ArrayBuffer.isView(obj)) {\n // @ts-ignore\n return obj.slice();\n }\n\n // lastly, handle objects\n // @ts-ignore\n const clonedObj = new obj.constructor();\n for(var prop in obj) {\n if(obj.hasOwnProperty(prop)) {\n clonedObj[prop] = copy(obj[prop]);\n }\n }\n return clonedObj;\n}\n","export default function deepEqual(x: any, y: any): boolean {\n const ok = Object.keys, tx = typeof x, ty = typeof y;\n return x && y && tx === 'object' && tx === ty ? (\n ok(x).length === ok(y).length &&\n ok(x).every((key) => deepEqual(x[key], y[key]))\n ) : (x === y);\n}\n","export default function isObject>(object: any): object is T {\n return typeof(object) === 'object' && object !== null;\n}\n","export default function safeAssign(object: T, fromObject: any) {\n if(fromObject) {\n for(const i in fromObject) {\n if(fromObject[i] !== undefined) {\n // @ts-ignore\n object[i] = fromObject[i];\n }\n }\n }\n\n return object;\n}\n","import copy from './copy';\nimport isObject from './isObject';\n\nexport default function validateInitObject(\n initObject: any,\n currentObject: any,\n onReplace?: (key: string) => void,\n previousKey?: string,\n ignorePaths?: Set,\n path?: string\n) {\n for(const key in initObject) {\n const _path = path ? `${path}.${key}` : key;\n if(ignorePaths?.has(_path)) {\n continue;\n }\n\n if(typeof(currentObject[key]) !== typeof(initObject[key])) {\n currentObject[key] = copy(initObject[key]);\n onReplace?.(previousKey || key);\n } else if(isObject(initObject[key])) {\n validateInitObject(initObject[key], currentObject[key], onReplace, previousKey || key, ignorePaths, _path);\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 isAnyChat from '../lib/appManagers/utils/peers/isAnyChat';\nimport isUser from '../lib/appManagers/utils/peers/isUser';\n\nString.prototype.toUserId = function() {\n return (+this).toUserId();\n};\n\nString.prototype.toChatId = function() {\n return (+this).toChatId();\n};\n\nString.prototype.toPeerId = function(isChat?: boolean) {\n return (+this).toPeerId(isChat);\n};\n\nString.prototype.isPeerId = function() {\n return /^[\\d-]/.test(this.toString());\n};\n\nNumber.prototype.toUserId = function() {\n return this as any;\n};\n\nNumber.prototype.toChatId = function() {\n return Math.abs(this as any);\n};\n\nNumber.prototype.toPeerId = function(isChat?: boolean) {\n return isChat === undefined ? this as number : (isChat ? -Math.abs(this as number) : this as number);\n};\n\nNumber.prototype.isPeerId = function() {\n return true;\n};\n\n[\n ['isUser' as const, isUser],\n ['isAnyChat' as const, isAnyChat]\n].forEach((value) => {\n const newMethod = Array.isArray(value) ? value[0] : value;\n const originMethod = Array.isArray(value) ? value[1] : value;\n // @ts-ignore\n String.prototype[newMethod] = function() {\n // @ts-ignore\n // eslint-disable-next-line no-useless-call\n return originMethod.call(null, this.toString());\n };\n\n // @ts-ignore\n Number.prototype[newMethod] = function() {\n // @ts-ignore\n // eslint-disable-next-line no-useless-call\n return originMethod.call(null, this);\n };\n});\n\ndeclare global {\n interface String {\n toUserId(): UserId;\n toChatId(): ChatId;\n toPeerId(isChat?: boolean): PeerId;\n isPeerId(): this is string;\n\n isUser(): boolean;\n isAnyChat(): boolean;\n }\n\n interface Number {\n toUserId(): UserId;\n toChatId(): ChatId;\n toPeerId(isChat?: boolean): PeerId;\n isPeerId(): this is PeerId;\n\n isUser(): boolean;\n isAnyChat(): boolean;\n }\n}\n\nexport {};\n","/*\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","import {logger} from '../lib/logger';\nimport dT from './dT';\n\nexport function recordPromise>(promise: T, description: string, log?: ReturnType | Console) {\n const perf = performance.now();\n (log || console).warn(dT(), 'start', description);\n promise.then(() => {\n (log || console).warn(dT(), 'end', description, performance.now() - perf);\n });\n return promise;\n}\n\nexport function recordPromiseBound(log: ReturnType | Console) {\n return (...args: [Parameters[0], Parameters[1]]) => {\n return recordPromise(...args, log);\n };\n}\n","export default function pause(ms: number) {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n","// * Jolly Cobra's schedulers\n\nimport {AnyToVoidFunction} from '../../types';\n\nexport default function throttle(\n fn: F,\n ms: number,\n shouldRunFirst = true\n) {\n let interval: number | null = null;\n let isPending: boolean;\n let args: Parameters;\n\n return (..._args: Parameters) => {\n isPending = true;\n args = _args;\n\n if(!interval) {\n if(shouldRunFirst) {\n isPending = false;\n // @ts-ignore\n fn(...args);\n }\n\n interval = setInterval(() => {\n if(!isPending) {\n clearInterval(interval!);\n interval = null;\n return;\n }\n\n isPending = false;\n // @ts-ignore\n fn(...args);\n }, ms) as any;\n }\n };\n}\n","export default function capitalizeFirstLetter(string: string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\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 CacheStorageController from '../lib/files/cacheStorage';\nimport AppStorage from '../lib/storage';\nimport sessionStorage from '../lib/sessionStorage';\nimport noop from './noop';\n\nexport default function toggleStorages(enabled: boolean, clearWrite: boolean) {\n return Promise.all([\n AppStorage.toggleStorage(enabled, clearWrite),\n CacheStorageController.toggleStorage(enabled, clearWrite),\n sessionStorage.toggleStorage(enabled, clearWrite)\n ]).then(noop, noop);\n}\n","export default function tsNow(seconds?: true) {\n const t = Date.now();\n return seconds ? t / 1000 | 0 : t;\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 clearMessageId from './clearMessageId';\n\n/**\n * * will ignore outgoing offset\n */\nexport default function getServerMessageId(messageId: number) {\n return clearMessageId(messageId, true);\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_ID_OFFSET, MESSAGE_ID_INCREMENT} from '.';\n\nexport default function clearMessageId(messageId: number, toServer?: boolean) {\n const q = MESSAGE_ID_OFFSET;\n if(messageId < q) { // id 0 -> mid 0xFFFFFFFF, so 0xFFFFFFFF must convert to 0\n return messageId;\n }\n\n const l = MESSAGE_ID_INCREMENT - 1;\n const used = messageId & l;\n if(used !== l) {\n messageId -= used + 1;\n }\n\n return toServer ? (messageId - q) / MESSAGE_ID_INCREMENT : messageId;\n}\n","export const MESSAGE_ID_INCREMENT = 0x10000;\nexport const MESSAGE_ID_OFFSET = 0xFFFFFFFF;\n","export default function isAnyChat(peerId: PeerId) {\n return +peerId < 0;\n}\n","export default function isUser(peerId: PeerId) {\n return +peerId >= 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 {CryptoMethods} from './crypto_methods';\nimport SuperMessagePort from '../mtproto/superMessagePort';\nimport {Awaited} from '../../types';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {IS_WORKER} from '../../helpers/context';\n\ntype CryptoEvent = {\n invoke: (payload: {method: T, args: Parameters}) => ReturnType,\n port: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n terminate: () => void\n};\n\nexport class CryptoMessagePort extends SuperMessagePort {\n private lastIndex: number;\n\n constructor() {\n super('CRYPTO');\n this.lastIndex = -1;\n }\n\n public invokeCryptoNew({method, args, transfer}: {\n method: T,\n args: Parameters,\n transfer?: Transferable[]\n }): Promise>> {\n const payload = {method, args};\n const listeners = this.listeners['invoke'];\n if(listeners?.length) { // already in worker\n // try {\n // @ts-ignore\n let result: any = listeners[0].callback(payload);\n if(!IS_WORKER && !(result instanceof Promise)) {\n result = Promise.resolve(result);\n }\n\n return result;\n // } catch(err) {\n // return Promise.reject(err);\n // }\n }\n\n const sendPortIndex = method === 'aes-encrypt' || method === 'aes-decrypt' ?\n this.lastIndex = (this.lastIndex + 1) % this.sendPorts.length :\n 0;\n // @ts-ignore\n return this.invoke('invoke', payload, undefined, this.sendPorts[sendPortIndex], transfer);\n }\n\n public invokeCrypto(method: T, ...args: Parameters): Promise>> {\n return this.invokeCryptoNew({method, args});\n }\n}\n\nconst cryptoMessagePort = new CryptoMessagePort();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.cryptoMessagePort = cryptoMessagePort);\nexport default cryptoMessagePort;\n","/*\n * 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 blobConstruct from '../../helpers/blob/blobConstruct';\nimport MemoryWriter from './memoryWriter';\nimport FileManager from './memoryWriter';\nimport FileStorage from './fileStorage';\nimport makeError from '../../helpers/makeError';\nimport deferredPromise from '../../helpers/cancellablePromise';\n\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\n\nexport default class CacheStorageController implements FileStorage {\n private static STORAGES: CacheStorageController[] = [];\n private openDbPromise: Promise;\n\n private useStorage = true;\n\n // private log: ReturnType = logger('CS');\n\n constructor(private dbName: CacheStorageDbName) {\n if(Modes.test) {\n this.dbName += '_test';\n }\n\n if(CacheStorageController.STORAGES.length) {\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\n }\n\n this.openDatabase();\n CacheStorageController.STORAGES.push(this);\n }\n\n private openDatabase(): Promise {\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\n }\n\n public delete(entryName: string) {\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\n }\n\n public deleteAll() {\n return caches.delete(this.dbName);\n }\n\n public get(entryName: string) {\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\n }\n\n public save(entryName: string, response: Response) {\n // return new Promise((resolve) => {}); // DEBUG\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\n }\n\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\n /* if(method === 'blob') {\n return Promise.reject();\n } */\n\n // const str = `get fileName: ${fileName}`;\n // console.time(str);\n return this.get(fileName).then((response) => {\n if(!response) {\n // console.warn('getFile:', response, fileName);\n throw makeError('NO_ENTRY_FOUND');\n }\n\n const promise = response[method]();\n // promise.then(() => {\n // console.timeEnd(str);\n // });\n return promise;\n });\n }\n\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\n // return Promise.resolve(blobConstruct([blob]));\n if(!(blob instanceof Blob)) {\n blob = blobConstruct(blob);\n }\n\n const response = new Response(blob, {\n headers: {\n 'Content-Length': '' + blob.size\n }\n });\n\n return this.save(fileName, response).then(() => blob as Blob);\n }\n\n public timeoutOperation(callback: (cache: Cache) => Promise) {\n if(!this.useStorage) {\n return Promise.reject(makeError('STORAGE_OFFLINE'));\n }\n\n return new Promise(async(resolve, reject) => {\n let rejected = false;\n const timeout = setTimeout(() => {\n reject();\n // console.warn('CACHESTORAGE TIMEOUT');\n rejected = true;\n }, 15e3);\n\n try {\n const cache = await this.openDatabase();\n if(!cache) {\n this.useStorage = false;\n this.openDbPromise = undefined;\n throw 'no cache?';\n }\n\n const res = await callback(cache);\n\n if(rejected) return;\n resolve(res);\n } catch(err) {\n reject(err);\n }\n\n clearTimeout(timeout);\n });\n }\n\n public prepareWriting(fileName: string, fileSize: number, mimeType: string) {\n return {\n deferred: deferredPromise(),\n getWriter: () => {\n const writer = new MemoryWriter(mimeType, fileSize, (blob) => {\n return this.saveFile(fileName, blob).catch(() => blob);\n });\n\n return writer;\n }\n };\n }\n\n public static toggleStorage(enabled: boolean, clearWrite: boolean) {\n return Promise.all(this.STORAGES.map((storage) => {\n storage.useStorage = enabled;\n\n if(!clearWrite) {\n return;\n }\n\n if(!enabled) {\n return storage.deleteAll();\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 blobConstruct from '../../helpers/blob/blobConstruct';\nimport StreamWriter from './streamWriter';\n\nexport default class MemoryWriter implements StreamWriter {\n private bytes: Uint8Array;\n\n constructor(\n private mimeType: string,\n private size: number,\n private saveFileCallback?: (blob: Blob) => Promise\n ) {\n this.bytes = new Uint8Array(size);\n }\n\n public async write(part: Uint8Array, offset: number) {\n // sometimes file size can be bigger than the prov\n const endOffset = offset + part.byteLength;\n if(endOffset > this.bytes.byteLength) {\n const newBytes = new Uint8Array(endOffset);\n newBytes.set(this.bytes, 0);\n this.bytes = newBytes;\n }\n\n this.bytes.set(part, offset);\n };\n\n public truncate() {\n this.bytes = new Uint8Array();\n }\n\n public trim(size: number) {\n this.bytes = this.bytes.slice(0, size);\n }\n\n public finalize(saveToStorage = true) {\n const blob = blobConstruct(this.bytes, this.mimeType);\n\n if(saveToStorage && this.saveFileCallback) {\n this.saveFileCallback(blob);\n }\n\n return blob;\n }\n\n public getParts() {\n return this.bytes;\n }\n\n public replaceParts(parts: Uint8Array) {\n this.bytes = parts;\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 DEBUG from '../config/debug';\nimport {IS_FIREFOX, IS_SAFARI} from '../environment/userAgent';\nimport {IS_SERVICE_WORKER, IS_WEB_WORKER} from '../helpers/context';\nimport dT from '../helpers/dT';\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 IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\n// let getCallerFunctionNameFromLine: (line: string) => string;\n// if(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;\n// const LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\n// function 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 group(...args: any[]): void;\n groupCollapsed(...args: any[]): void;\n groupEnd(...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' */ | 'group' | 'groupCollapsed' | 'groupEnd', 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 ['group', LogTypes.Log],\n ['groupCollapsed', LogTypes.Log],\n ['groupEnd', 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 const 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","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport type {getEnvironment} from '../../environment/utils';\nimport type loadState from '../appManagers/utils/state/loadState';\nimport type {StoragesResults} from '../appManagers/utils/storages/loadStorages';\nimport type {LocalStorageProxyTask} from '../localStorage';\nimport type {Awaited} from '../../types';\nimport type {Mirrors, MirrorTaskPayload, NotificationBuildTaskPayload, TabState} from './mtprotoworker';\nimport type toggleStorages from '../../helpers/toggleStorages';\nimport SuperMessagePort from './superMessagePort';\n\nexport type MTProtoManagerTaskPayload = {name: string, method: string, args: any[]};\n\ntype MTProtoBroadcastEvent = {\n event: (payload: {name: string, args: any[]}, source: MessageEventSource) => void\n};\n\nexport default class MTProtoMessagePort extends SuperMessagePort<{\n environment: (environment: ReturnType) => void,\n crypto: (payload: {method: string, args: any[]}) => Promise,\n state: (payload: {userId: UserId} & Awaited> & {storagesResults?: StoragesResults}) => void,\n manager: (payload: MTProtoManagerTaskPayload) => any,\n toggleStorages: (payload: {enabled: boolean, clearWrite: boolean}) => ReturnType,\n serviceWorkerOnline: (online: boolean) => void,\n serviceWorkerPort: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n cryptoPort: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n createObjectURL: (blob: Blob) => string,\n tabState: (payload: TabState, source: MessageEventSource) => void,\n createProxyWorkerURLs: (payload: {originalUrl: string, blob: Blob}) => string[],\n} & MTProtoBroadcastEvent, {\n convertWebp: (payload: {fileName: string, bytes: Uint8Array}) => Promise,\n convertOpus: (payload: {fileName: string, bytes: Uint8Array}) => Promise,\n localStorageProxy: (payload: LocalStorageProxyTask['payload']) => Promise,\n mirror: (payload: MirrorTaskPayload) => void,\n notificationBuild: (payload: NotificationBuildTaskPayload) => void,\n // hello: () => void\n} & MTProtoBroadcastEvent, Master> {\n private static INSTANCE: MTProtoMessagePort;\n\n constructor() {\n super('MTPROTO');\n\n MTProtoMessagePort.INSTANCE = this;\n\n MOUNT_CLASS_TO && (MOUNT_CLASS_TO.mtprotoMessagePort = this);\n }\n\n public static getInstance() {\n return this.INSTANCE as MTProtoMessagePort;\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 bufferConcats from '../helpers/bytes/bufferConcats';\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\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\ndeclare global {\n interface Uint8Array {\n concat: (...args: Array) => Uint8Array,\n // toString: () => string,\n toJSON: () => number[],\n // toJSON: () => {type: 'bytes', value: number[]},\n }\n\n interface Promise {\n finally: (onfinally?: () => void) => Promise;\n }\n}\n","import {URL_ANY_PROTOCOL_REG_EXP} from '.';\n\nexport default function matchUrlProtocol(text: string) {\n return !text ? null : text.match(URL_ANY_PROTOCOL_REG_EXP);\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 {WebPushApiManager} from '../mtproto/webPushApiManager';\nimport type {PushNotificationObject} from './push';\nimport type {MyUploadFile} from '../mtproto/apiFileManager';\nimport SuperMessagePort from '../mtproto/superMessagePort';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\n\nexport type ServicePushPingTaskPayload = {\n localNotifications: boolean,\n lang: {\n push_action_mute1d: string\n push_action_settings: string\n push_message_nopreview: string\n },\n settings: WebPushApiManager['settings']\n};\n\nexport type ServiceRequestFilePartTaskPayload = {\n docId: DocId,\n dcId: number,\n offset: number,\n limit: number\n};\n\nexport type ServiceDownloadTaskPayload = {\n headers: any,\n id: string\n};\n\nexport type ServiceEvent = {\n port: (payload: void, source: MessageEventSource, event: MessageEvent) => void\n};\n\nexport default class ServiceMessagePort extends SuperMessagePort<{\n // from main thread to service worker\n notificationsClear: () => void,\n toggleStorages: (payload: {enabled: boolean, clearWrite: boolean}) => void,\n pushPing: (payload: ServicePushPingTaskPayload, source: MessageEventSource, event: MessageEvent) => void,\n hello: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n shownNotification: (payload: string) => void,\n\n // from mtproto worker\n download: (payload: ServiceDownloadTaskPayload) => void,\n downloadChunk: (payload: {id: ServiceDownloadTaskPayload['id'], chunk: Uint8Array}) => void\n downloadFinalize: (payload: ServiceDownloadTaskPayload['id']) => void,\n downloadCancel: (payload: ServiceDownloadTaskPayload['id']) => void\n}, {\n // to main thread\n pushClick: (payload: PushNotificationObject) => void,\n hello: (payload: void, source: MessageEventSource) => void,\n share: (payload: ShareData) => void,\n\n // to mtproto worker\n requestFilePart: (payload: ServiceRequestFilePartTaskPayload) => Promise | MyUploadFile\n} & ServiceEvent, Master> {\n constructor() {\n super('SERVICE');\n\n MOUNT_CLASS_TO && (MOUNT_CLASS_TO.serviceMessagePort = this);\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 Modes from '../config/modes';\nimport {IS_WORKER} from '../helpers/context';\nimport {WorkerTaskTemplate} from '../types';\nimport MTProtoMessagePort from './mtproto/mtprotoMessagePort';\n// import { stringify } from '../helpers/json';\n\nclass LocalStorage> {\n private prefix = '';\n private cache: Partial = {};\n private useStorage = true;\n\n constructor(/* private preserveKeys: (keyof Storage)[] */) {\n if(Modes.test) {\n this.prefix = 't_';\n }\n }\n\n public get(key: T, useCache = true): Storage[T] {\n if(this.cache.hasOwnProperty(key) && useCache) {\n return this.cache[key];\n } else if(this.useStorage) {\n let value: Storage[T];\n try {\n value = localStorage.getItem(this.prefix + (key as string)) as any;\n } catch(err) {\n this.useStorage = false;\n }\n\n if(value !== null) {\n try {\n value = JSON.parse(value);\n } catch(err) {\n // console.error(err);\n }\n } else {\n value = undefined;\n }\n\n return value;\n }/* else {\n throw 'something went wrong';\n } */\n }\n\n public set(obj: Partial, onlyLocal = false) {\n for(const key in obj) {\n if(obj.hasOwnProperty(key)) {\n const value = obj[key];\n this.cache[key] = value;\n\n if(this.useStorage && !onlyLocal) {\n try {\n const stringified = JSON.stringify(value);\n localStorage.setItem(this.prefix + key, stringified);\n } catch(err) {\n this.useStorage = false;\n }\n }\n }\n }\n }\n\n public delete(key: keyof Storage, saveLocal = false) {\n // ! it is needed here\n key = '' + (key as string);\n\n if(!saveLocal) {\n delete this.cache[key];\n }\n\n // if(this.useStorage) {\n try {\n localStorage.removeItem(this.prefix + (key as string));\n } catch(err) {\n\n }\n // }\n }\n\n /* public clear(preserveKeys: (keyof Storage)[] = this.preserveKeys) {\n // if(this.useStorage) {\n try {\n let obj: Partial = {};\n if(preserveKeys) {\n preserveKeys.forEach((key) => {\n const value = this.get(key);\n if(value !== undefined) {\n obj[key] = value;\n }\n });\n }\n\n localStorage.clear();\n\n if(preserveKeys) {\n this.set(obj);\n }\n } catch(err) {\n\n }\n // }\n } */\n\n public clear() {\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance', 'user_auth', 'state_id', 'k_build'];\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 for(const key of keys) {\n this.delete(key, true);\n }\n }\n\n public toggleStorage(enabled: boolean, clearWrite: boolean) {\n this.useStorage = enabled;\n\n if(!clearWrite) {\n return;\n }\n\n if(!enabled) {\n this.clear();\n } else {\n return this.set(this.cache);\n }\n }\n}\n\nexport interface LocalStorageProxyTask extends WorkerTaskTemplate {\n type: 'localStorageProxy',\n payload: {\n type: 'set' | 'get' | 'delete' | 'clear' | 'toggleStorage',\n args: any[]\n }\n};\n\nexport interface LocalStorageProxyTaskResponse extends WorkerTaskTemplate {\n type: 'localStorageProxy',\n payload: any\n};\n\nexport default class LocalStorageController> {\n private static STORAGES: LocalStorageController[] = [];\n // private log = (...args: any[]) => console.log('[SW LS]', ...args);\n // private log = (...args: any[]) => {};\n\n private storage: LocalStorage;\n\n constructor(/* private preserveKeys: (keyof Storage)[] = [] */) {\n LocalStorageController.STORAGES.push(this);\n\n if(!IS_WORKER) {\n this.storage = new LocalStorage(/* preserveKeys */);\n }\n }\n\n private async proxy(type: LocalStorageProxyTask['payload']['type'], ...args: LocalStorageProxyTask['payload']['args']): Promise {\n if(IS_WORKER) {\n const port = MTProtoMessagePort.getInstance();\n return port.invoke('localStorageProxy', {type, args});\n }\n\n args = Array.prototype.slice.call(args);\n\n // @ts-ignore\n return this.storage[type].apply(this.storage, args as any);\n }\n\n public get(key: T, useCache?: boolean) {\n return this.proxy('get', key, useCache);\n }\n\n public set(obj: Partial, onlyLocal?: boolean) {\n return this.proxy('set', obj, onlyLocal);\n }\n\n public delete(key: keyof Storage, saveLocal?: boolean) {\n return this.proxy('delete', key, saveLocal);\n }\n\n public clear(/* preserveKeys?: (keyof Storage)[] */) {\n return this.proxy('clear'/* , preserveKeys */);\n }\n\n public toggleStorage(enabled: boolean, clearWrite: boolean) {\n return this.proxy('toggleStorage', enabled, clearWrite);\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 {AppInstance} from './mtproto/singleInstance';\nimport type {UserAuth} from './mtproto/mtproto_config';\nimport type {DcId} from '../types';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport LocalStorageController from './localStorage';\n\nconst sessionStorage = new LocalStorageController<{\n dc: DcId,\n user_auth: UserAuth,\n state_id: number,\n dc1_auth_key: string,\n dc2_auth_key: string,\n dc3_auth_key: string,\n dc4_auth_key: string,\n dc5_auth_key: string,\n dc1_server_salt: string,\n dc2_server_salt: string,\n dc3_server_salt: string,\n dc4_server_salt: string,\n dc5_server_salt: string,\n server_time_offset: number,\n xt_instance: AppInstance,\n kz_version: 'K' | 'Z',\n tgme_sync: {\n canRedirect: boolean,\n ts: number\n },\n k_build: number\n}>(/* ['kz_version'] */);\nMOUNT_CLASS_TO.appStorage = sessionStorage;\nexport default sessionStorage;\n","/*\n * 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 {ChatSavedPosition} from './appManagers/appImManager';\nimport type {AppDraftsManager} from './appManagers/appDraftsManager';\nimport type {State} from '../config/state';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport {LangPackDifference} from '../layer';\nimport AppStorage from './storage';\nimport DATABASE_STATE from '../config/databases/state';\n\nclass StateStorage extends AppStorage<{\n chatPositions: {\n [peerId_threadId: string]: ChatSavedPosition\n },\n langPack: LangPackDifference,\n drafts: AppDraftsManager['drafts'],\n user_auth: any, // support old webk format\n} & State, typeof DATABASE_STATE> {\n constructor() {\n super(DATABASE_STATE, 'session');\n }\n}\n\nconst stateStorage = new StateStorage();\nMOUNT_CLASS_TO.stateStorage = stateStorage;\nexport default stateStorage;\n","/*\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 {Database} from '../config/databases';\nimport {MOUNT_CLASS_TO} from '../config/debug';\n// import DATABASE_SESSION from \"../config/databases/session\";\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport {IS_WORKER} from '../helpers/context';\nimport throttle from '../helpers/schedulers/throttle';\n// import { WorkerTaskTemplate } from \"../types\";\nimport IDBStorage from './files/idb';\n\nfunction noop() {}\n\n/* export interface LocalStorageProxySetTask extends WorkerTaskTemplate {\n type: 'localStorageProxy',\n payload: {\n type: 'set',\n keys: string[],\n values: any[]\n }\n};\n\nexport interface LocalStorageProxyDeleteTask extends WorkerTaskTemplate {\n type: 'localStorageProxy',\n payload: {\n type: 'delete',\n keys: string[]\n }\n}; */\n\nconst THROTTLE_TIME = 16;\n\n/* Storage extends {[name: string]: any} *//* Storage extends Record */\nexport default class AppStorage<\n Storage extends Record,\n T extends Database\n> {\n private static STORAGES: AppStorage>[] = [];\n private storage: IDBStorage;// new CacheStorageController('session');\n\n // private cache: Partial<{[key: string]: Storage[typeof key]}> = {};\n private cache: Partial = {};\n private useStorage: boolean;\n private savingFreezed: boolean;\n\n private getPromises: Map> = new Map();\n private getThrottled: () => void;\n\n private keysToSet: Set = new Set();\n private saveThrottled: () => void;\n private saveDeferred = deferredPromise();\n\n private keysToDelete: Set = new Set();\n private deleteThrottled: () => void;\n private deleteDeferred = deferredPromise();\n\n constructor(private db: T, private storeName: typeof db['stores'][number]['name']) {\n this.storage = new IDBStorage(db, storeName);\n\n if(AppStorage.STORAGES.length) {\n this.useStorage = AppStorage.STORAGES[0].useStorage;\n } else {\n this.useStorage = true;\n }\n\n this.savingFreezed = false;\n\n AppStorage.STORAGES.push(this);\n\n this.saveThrottled = throttle(async() => {\n const deferred = this.saveDeferred;\n this.saveDeferred = deferredPromise();\n\n const set = this.keysToSet;\n if(set.size) {\n const keys = Array.from(set.values()) as string[];\n set.clear();\n\n const values = keys.map((key) => this.cache[key]);\n try {\n // console.log('setItem: will set', key/* , value */);\n // await this.cacheStorage.delete(key); // * try to prevent memory leak in Chrome leading to 'Unexpected internal error.'\n // await this.storage.save(key, new Response(value, {headers: {'Content-Type': 'application/json'}}));\n\n /* if(db === DATABASE_SESSION && !('localStorage' in self)) { // * support legacy Webogram's localStorage\n self.postMessage({\n type: 'localStorageProxy',\n payload: {\n type: 'set',\n keys,\n values\n }\n } as LocalStorageProxySetTask);\n } */\n\n await this.storage.save(keys, values);\n // console.log('setItem: have set', key/* , value */);\n } catch(e) {\n // this.useCS = false;\n console.error('[AS]: set error:', e, keys, values);\n }\n }\n\n deferred.resolve();\n\n if(set.size) {\n this.saveThrottled();\n }\n }, THROTTLE_TIME, false);\n\n this.deleteThrottled = throttle(async() => {\n const deferred = this.deleteDeferred;\n this.deleteDeferred = deferredPromise();\n\n const set = this.keysToDelete;\n if(set.size) {\n const keys = Array.from(set.values()) as string[];\n set.clear();\n\n try {\n /* if(db === DATABASE_SESSION && !('localStorage' in self)) { // * support legacy Webogram's localStorage\n self.postMessage({\n type: 'localStorageProxy',\n payload: {\n type: 'delete',\n keys\n }\n } as LocalStorageProxyDeleteTask);\n } */\n\n await this.storage.delete(keys);\n } catch(e) {\n console.error('[AS]: delete error:', e, keys);\n }\n }\n\n deferred.resolve();\n\n if(set.size) {\n this.deleteThrottled();\n }\n }, THROTTLE_TIME, false);\n\n this.getThrottled = throttle(async() => {\n const keys = Array.from(this.getPromises.keys());\n\n // const perf = performance.now();\n this.storage.get(keys as string[]).then((values) => {\n for(let i = 0, length = keys.length; i < length; ++i) {\n const key = keys[i];\n const deferred = this.getPromises.get(key);\n if(deferred) {\n // @ts-ignore\n deferred.resolve(this.cache[key] = values[i]);\n this.getPromises.delete(key);\n }\n }\n\n // console.log('[AS]: get time', keys, performance.now() - perf);\n }, (error: ApiError) => {\n const ignoreErrors: Set = new Set(['NO_ENTRY_FOUND', 'STORAGE_OFFLINE']);\n if(!ignoreErrors.has(error.type)) {\n this.useStorage = false;\n console.error('[AS]: get error:', error, keys, storeName);\n }\n\n for(let i = 0, length = keys.length; i < length; ++i) {\n const key = keys[i];\n const deferred = this.getPromises.get(key);\n if(deferred) {\n // deferred.reject(error);\n deferred.resolve(undefined);\n this.getPromises.delete(key);\n }\n }\n }).finally(() => {\n if(this.getPromises.size) {\n this.getThrottled();\n }\n });\n }, THROTTLE_TIME, false);\n }\n\n public isAvailable() {\n return this.useStorage;\n }\n\n public getCache() {\n return this.cache;\n }\n\n public getFromCache(key: T) {\n return this.cache[key];\n }\n\n public setToCache(key: keyof Storage, value: Storage[typeof key]) {\n return this.cache[key] = value;\n }\n\n public async get(key: T, useCache = true): Promise {\n if(this.cache.hasOwnProperty(key) && useCache) {\n return this.getFromCache(key);\n } else if(this.useStorage) {\n const r = this.getPromises.get(key);\n if(r) return r as any;\n\n const p = deferredPromise();\n this.getPromises.set(key, p as any);\n\n this.getThrottled();\n\n return p;\n }/* else {\n throw 'something went wrong';\n } */\n }\n\n public getAll() {\n return this.storage.getAll().catch(() => []);\n }\n\n public set(obj: Partial, onlyLocal = false) {\n // console.log('storageSetValue', obj, callback, arguments);\n\n const canUseStorage = this.useStorage && !onlyLocal && !this.savingFreezed;\n for(const key in obj) {\n if(obj.hasOwnProperty(key)) {\n const value = obj[key];\n this.setToCache(key, value);\n\n // let perf = /* DEBUG */false ? performance.now() : 0;\n // value = JSON.stringify(value);\n\n // if(perf) {\n // let elapsedTime = performance.now() - perf;\n // if(elapsedTime > 10) {\n // console.warn('LocalStorage set: stringify time by JSON.stringify:', elapsedTime, key);\n // }\n // }\n\n /* perf = performance.now();\n value = stringify(value);\n console.log('LocalStorage set: stringify time by own stringify:', performance.now() - perf); */\n\n if(canUseStorage) {\n this.keysToSet.add(key);\n this.keysToDelete.delete(key);\n this.saveThrottled();\n }\n }\n }\n\n return canUseStorage ? this.saveDeferred : Promise.resolve();\n }\n\n public delete(key: keyof Storage, saveLocal = false) {\n /* if(!this.cache.hasOwnProperty(key)) {\n return;\n } */\n\n // ! it is needed here\n key = '' + (key as string);\n\n if(!saveLocal) {\n delete this.cache[key];\n }\n\n if(this.useStorage) {\n this.keysToSet.delete(key);\n this.keysToDelete.add(key);\n this.deleteThrottled();\n }\n\n return this.useStorage ? this.deleteDeferred : Promise.resolve();\n }\n\n public clear(saveLocal = false) {\n if(!saveLocal) {\n for(const i in this.cache) {\n delete this.cache[i];\n }\n }\n\n return this.storage.clear().catch(noop);\n }\n\n public static toggleStorage(enabled: boolean, clearWrite: boolean) {\n return Promise.all(this.STORAGES.map((storage) => {\n storage.useStorage = enabled;\n\n if(!IS_WORKER || !clearWrite) {\n return;\n }\n\n if(!enabled) {\n storage.keysToSet.clear();\n storage.keysToDelete.clear();\n storage.getPromises.forEach((deferred) => deferred.resolve(undefined));\n storage.getPromises.clear();\n return storage.clear(true);\n } else {\n return storage.set(storage.cache);\n }\n })).catch(noop);\n }\n\n public static freezeSaving>(callback: () => any, names: T['stores'][number]['name'][]) {\n this.STORAGES.forEach((storage) => storage.savingFreezed = true);\n try {\n callback();\n } catch(err) {\n console.error('freezeSaving callback error:', err);\n }\n this.STORAGES.forEach((storage) => storage.savingFreezed = false);\n }\n\n /* public deleteDatabase() {\n return IDBStorage.deleteDatabase().catch(noop);\n } */\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.AppStorage = AppStorage);\n","// Copyright Twitter Inc. Licensed under MIT\n// https://github.com/twitter/twemoji-parser/blob/master/LICENSE.md\n\nconst originalString = '((?:\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\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\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\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\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\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\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\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\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\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\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d[\\udc68\\udc69]|\\ud83e\\udef1\\ud83c\\udffb\\u200d\\ud83e\\udef2\\ud83c[\\udffc-\\udfff]|\\ud83e\\udef1\\ud83c\\udffc\\u200d\\ud83e\\udef2\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\udef1\\ud83c\\udffd\\u200d\\ud83e\\udef2\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\udef1\\ud83c\\udffe\\u200d\\ud83e\\udef2\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\udef1\\ud83c\\udfff\\u200d\\ud83e\\udef2\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f?\\u200d\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1|\\ud83d\\udc6b\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6c\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6d\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc8f\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc91\\ud83c[\\udffb-\\udfff]|\\ud83e\\udd1d\\ud83c[\\udffb-\\udfff]|\\ud83d[\\udc6b-\\udc6d\\udc8f\\udc91]|\\ud83e\\udd1d)|(?:\\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\\uddd4\\uddd6-\\udddd])(?:\\ud83c[\\udffb-\\udfff])?\\u200d[\\u2640\\u2642]\\ufe0f?|(?:\\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\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\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\\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|\\ud83d\\ude36\\u200d\\ud83c\\udf2b\\ufe0f?|\\u2764\\ufe0f?\\u200d\\ud83d\\udd25|\\u2764\\ufe0f?\\u200d\\ud83e\\ude79|\\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?|\\ud83d\\ude2e\\u200d\\ud83d\\udca8|\\ud83d\\ude35\\u200d\\ud83d\\udcab|\\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\\udec3-\\udec5\\udef0-\\udef6]|[\\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-\\udc8e\\udc90\\udc92-\\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\\udedd-\\udedf\\udeeb\\udeec\\udef4-\\udefc\\udfe0-\\udfeb\\udff0]|\\ud83e[\\udd0d\\udd0e\\udd10-\\udd17\\udd20-\\udd25\\udd27-\\udd2f\\udd3a\\udd3c\\udd3f-\\udd45\\udd47-\\udd76\\udd78-\\uddb4\\uddb7\\uddba\\uddbc-\\uddcc\\uddd0\\uddde-\\uddff\\ude70-\\ude74\\ude78-\\ude7c\\ude80-\\ude86\\ude90-\\udeac\\udeb0-\\udeba\\udec0-\\udec2\\uded0-\\uded9\\udee0-\\udee7]|[\\u23e9-\\u23ec\\u23f0\\u23f3\\u267e\\u26ce\\u2705\\u2728\\u274c\\u274e\\u2753-\\u2755\\u2795-\\u2797\\u27b0\\u27bf\\ue50a])|\\ufe0f)';\nexport default originalString;\n"],"names":["MAIN_DOMAINS","threads","Math","min","navigator","hardwareConcurrency","App","id","hash","version","versionFull","build","langPackVersion","langPack","langPackCode","domains","baseDcId","isMainDomain","includes","location","hostname","suffix","cryptoWorkers","name","stores","blobConstruct","blobParts","mimeType","Array","isArray","safeMimeType","Blob","type","blobSafeMimeType","indexOf","bufferConcats","args","length","reduce","acc","v","byteLength","tmp","Uint8Array","lastLength","forEach","b","set","ArrayBuffer","deferredPromise","deferredHelper","isFulfilled","isRejected","notify","notifyAll","lastNotify","listeners","callback","addNotifyListener","push","deferred","Promise","resolve","reject","value","catch","finally","cancel","Object","assign","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","self","IS_WEB_WORKER","WorkerGlobalScope","IS_WORKER","postMessage","listener","err","console","error","notifyServiceWorker","all","clients","matchAll","includeUncontrolled","then","slice","bind","noop","copy","obj","Date","getTime","map","el","isView","clonedObj","constructor","prop","hasOwnProperty","deepEqual","x","y","ok","keys","tx","every","key","isObject","object","safeAssign","fromObject","i","undefined","validateInitObject","initObject","currentObject","onReplace","previousKey","ignorePaths","path","_path","has","String","prototype","toUserId","this","toChatId","toPeerId","isChat","isPeerId","test","toString","Number","abs","newMethod","originMethod","call","arrays","Uint16Array","Uint32Array","nextRandomUint","bits","array","crypto","getRandomValues","randomLong","recordPromiseBound","log","promise","description","perf","performance","now","warn","recordPromise","pause","ms","setTimeout","throttle","fn","shouldRunFirst","isPending","interval","_args","setInterval","clearInterval","capitalizeFirstLetter","string","charAt","toUpperCase","toggleStorages","enabled","clearWrite","tsNow","seconds","t","getServerMessageId","messageId","toServer","q","l","used","clearMessageId","MESSAGE_ID_INCREMENT","MESSAGE_ID_OFFSET","isAnyChat","peerId","isUser","CryptoMessagePort","super","lastIndex","invokeCryptoNew","method","transfer","payload","result","sendPortIndex","sendPorts","invoke","invokeCrypto","cryptoMessagePort","CacheStorageController","dbName","useStorage","STORAGES","openDatabase","openDbPromise","caches","open","delete","entryName","timeoutOperation","cache","deleteAll","get","match","save","response","put","getFile","fileName","saveFile","blob","Response","headers","size","rejected","timeout","res","clearTimeout","prepareWriting","fileSize","getWriter","static","storage","MemoryWriter","saveFileCallback","bytes","write","part","offset","endOffset","newBytes","truncate","trim","finalize","saveToStorage","getParts","replaceParts","parts","LogTypes","LOG_LEVELS","None","Error","Warn","Log","Debug","STYLES_SUPPORTED","IS_SAFARI","IS_FIREFOX","LOGGER_STYLES","methods","logger","prefix","ignoreDebugReset","style","originalPrefix","originalStyle","logType","setPrefix","newPrefix","setLevel","level","bindPrefix","MTProtoMessagePort","INSTANCE","concat","toJSON","onFinally","reason","matchUrlProtocol","text","ServiceMessagePort","LocalStorage","useCache","localStorage","getItem","JSON","parse","onlyLocal","stringified","stringify","setItem","saveLocal","removeItem","clear","toggleStorage","LocalStorageController","proxy","apply","sessionStorage","StateStorage","stateStorage","AppStorage","db","storeName","getPromises","Map","keysToSet","Set","saveDeferred","keysToDelete","deleteDeferred","savingFreezed","saveThrottled","from","values","e","deleteThrottled","getThrottled","isAvailable","getCache","getFromCache","setToCache","r","p","getAll","canUseStorage","add","names"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"110.745cc657737d24b5aea0.bundle.js","mappings":"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","sources":["webpack://tweb/./src/config/app.ts","webpack://tweb/./src/config/databases/state.ts","webpack://tweb/./src/helpers/blob/blobConstruct.ts","webpack://tweb/./src/helpers/blob/blobSafeMimeType.ts","webpack://tweb/./src/helpers/bytes/bufferConcats.ts","webpack://tweb/./src/helpers/cancellablePromise.ts","webpack://tweb/./src/helpers/context.ts","webpack://tweb/./src/helpers/noop.ts","webpack://tweb/./src/helpers/object/copy.ts","webpack://tweb/./src/helpers/object/deepEqual.ts","webpack://tweb/./src/helpers/object/isObject.ts","webpack://tweb/./src/helpers/object/safeAssign.ts","webpack://tweb/./src/helpers/object/validateInitObject.ts","webpack://tweb/./src/helpers/peerIdPolyfill.ts","webpack://tweb/./src/helpers/random.ts","webpack://tweb/./src/helpers/recordPromise.ts","webpack://tweb/./src/helpers/schedulers/pause.ts","webpack://tweb/./src/helpers/schedulers/throttle.ts","webpack://tweb/./src/helpers/string/capitalizeFirstLetter.ts","webpack://tweb/./src/helpers/toggleStorages.ts","webpack://tweb/./src/helpers/tsNow.ts","webpack://tweb/./src/lib/appManagers/utils/messageId/getServerMessageId.ts","webpack://tweb/./src/lib/appManagers/utils/messageId/clearMessageId.ts","webpack://tweb/./src/lib/appManagers/utils/messageId/index.ts","webpack://tweb/./src/lib/appManagers/utils/peers/isAnyChat.ts","webpack://tweb/./src/lib/appManagers/utils/peers/isUser.ts","webpack://tweb/./src/lib/crypto/cryptoMessagePort.ts","webpack://tweb/./src/lib/files/cacheStorage.ts","webpack://tweb/./src/lib/files/memoryWriter.ts","webpack://tweb/./src/lib/logger.ts","webpack://tweb/./src/lib/mtproto/mtprotoMessagePort.ts","webpack://tweb/./src/lib/polyfill.ts","webpack://tweb/./src/lib/richTextProcessor/matchUrlProtocol.ts","webpack://tweb/./src/lib/serviceWorker/serviceMessagePort.ts","webpack://tweb/./src/lib/localStorage.ts","webpack://tweb/./src/lib/sessionStorage.ts","webpack://tweb/./src/lib/stateStorage.ts","webpack://tweb/./src/lib/storage.ts","webpack://tweb/./src/vendor/emoji/regex.ts"],"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 * 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_DOMAINS = ['web.telegram.org', 'webk.telegram.org'];\n\nconst threads = Math.min(4, navigator.hardwareConcurrency ?? 4);\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.8.5',\n langPack: 'webk',\n langPackCode: 'en',\n domains: MAIN_DOMAINS,\n baseDcId: 2 as DcId,\n isMainDomain: MAIN_DOMAINS.includes(location.hostname),\n suffix: 'K',\n threads,\n cryptoWorkers: threads\n};\n\nif(App.isMainDomain) { // use Webogram credentials then\n App.id = 2496;\n App.hash = '8da85b0d5bfe62527e5b244c209159c3';\n}\n\nexport default App;\n","/*\n * 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 {Database} from '.';\nimport type {IDBIndex} from '../../lib/files/idb';\n\nconst DATABASE_STATE: Database<'session' | 'stickerSets' | 'users' | 'chats' | 'messages' | 'dialogs'> = {\n name: 'tweb',\n version: 7,\n stores: [{\n name: 'session'\n }, {\n name: 'stickerSets'\n }, {\n name: 'users'\n }, {\n name: 'chats'\n }, {\n name: 'dialogs'\n // indexes: [\n // ...(new Array(20 + 2).fill(0)).map((_, idx) => {\n // const name = `index_${idx}`;\n // const index: IDBIndex = {\n // indexName: name,\n // keyPath: name,\n // objectParameters: {}\n // };\n\n // return index\n // })\n // ]\n }, {\n name: 'messages'\n }]\n};\n\nexport default DATABASE_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 blobSafeMimeType from './blobSafeMimeType';\n\nexport default function blobConstruct(blobParts: Array | T, mimeType: string = ''): Blob {\n if(!Array.isArray(blobParts)) {\n blobParts = [blobParts];\n }\n\n const safeMimeType = blobSafeMimeType(mimeType);\n const blob = new Blob(blobParts, {type: safeMimeType});\n return blob;\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// https://www.iana.org/assignments/media-types/media-types.xhtml\nexport default function blobSafeMimeType(mimeType: string) {\n if([\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/svg+xml',\n 'image/webp',\n 'image/bmp',\n 'video/mp4',\n 'video/webm',\n 'video/quicktime',\n 'audio/ogg',\n 'audio/mpeg',\n 'audio/mp4',\n 'audio/wav', // though it is not in list\n 'application/json',\n 'application/pdf'\n ].indexOf(mimeType) === -1) {\n return 'application/octet-stream';\n }\n\n return mimeType;\n}\n","export default function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\n\n const tmp = new Uint8Array(length);\n\n let lastLength = 0;\n args.forEach((b) => {\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\n });\n\n return tmp/* .buffer */;\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 './noop';\n\nexport interface CancellablePromise extends Promise {\n resolve?: (value: T) => void,\n reject?: (...args: any[]) => void,\n cancel?: (reason?: any) => void,\n\n notify?: (...args: any[]) => void,\n notifyAll?: (...args: any[]) => void,\n lastNotify?: any,\n listeners?: Array<(...args: any[]) => void>,\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\n\n isFulfilled?: boolean,\n isRejected?: boolean\n}\n\nexport default function deferredPromise() {\n const deferredHelper: any = {\n isFulfilled: false,\n isRejected: false,\n\n notify: () => {},\n notifyAll: (...args: any[]) => {\n deferredHelper.lastNotify = args;\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\n },\n\n listeners: [],\n addNotifyListener: (callback: (...args: any[]) => void) => {\n if(deferredHelper.lastNotify) {\n callback(...deferredHelper.lastNotify);\n }\n\n deferredHelper.listeners.push(callback);\n }\n };\n\n const deferred: CancellablePromise = new Promise((resolve, reject) => {\n deferredHelper.resolve = (value: T) => {\n if(deferred.isFulfilled || deferred.isRejected) return;\n\n deferred.isFulfilled = true;\n resolve(value);\n };\n\n deferredHelper.reject = (...args: any[]) => {\n if(deferred.isRejected || deferred.isFulfilled) return;\n\n deferred.isRejected = true;\n reject(...args);\n };\n });\n\n // @ts-ignore\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\n const n = deferredPromise>();\n\n }; */\n\n deferred.catch(noop).finally(() => {\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\n deferred.listeners.length = 0;\n\n if(deferred.cancel) {\n deferred.cancel = noop;\n }\n });\n\n Object.assign(deferred, deferredHelper);\n\n return deferred;\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// ะฒ SW ะผะพะถะตั‚ ะฑั‹ั‚ัŒ ัั€ะฐะทัƒ ะดะฒะต ะฟะตั€ะตะผะตะฝะฝั‹ั… TRUE\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\n\nexport const getWindowClients = () => {\n return (self as any as ServiceWorkerGlobalScope)\n .clients\n .matchAll({includeUncontrolled: false, type: 'window'});\n};\n\nexport const getLastWindowClient = () => getWindowClients().then((windowClients) => windowClients.slice(-1)[0]);\n\nconst postMessage = (listener: WindowClient | DedicatedWorkerGlobalScope, ...args: any[]) => {\n try {\n // @ts-ignore\n listener.postMessage(...args);\n } catch(err) {\n console.error('[worker] postMessage error:', err, args);\n }\n};\n\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\n getWindowClients().then((listeners) => {\n if(!listeners.length) {\n // console.trace('no listeners?', self, listeners);\n return;\n }\n\n listeners.slice(all ? 0 : -1).forEach((listener) => {\n postMessage(listener, ...args);\n });\n });\n};\n\nconst notifyWorker = (...args: any[]) => {\n postMessage(self as any as DedicatedWorkerGlobalScope, ...args);\n};\n\nconst noop = () => {};\n\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\n","export default function noop() {}\n","export default function copy(obj: T): T {\n // in case of premitives\n if(obj === null || typeof(obj) !== 'object') {\n return obj;\n }\n\n // date objects should be\n if(obj instanceof Date) {\n return new Date(obj.getTime()) as any;\n }\n\n // handle Array\n if(Array.isArray(obj)) {\n // @ts-ignore\n const clonedArr: T = obj.map((el) => copy(el)) as any as T;\n return clonedArr;\n }\n\n if(ArrayBuffer.isView(obj)) {\n // @ts-ignore\n return obj.slice();\n }\n\n // lastly, handle objects\n // @ts-ignore\n const clonedObj = new obj.constructor();\n for(var prop in obj) {\n if(obj.hasOwnProperty(prop)) {\n clonedObj[prop] = copy(obj[prop]);\n }\n }\n return clonedObj;\n}\n","export default function deepEqual(x: any, y: any): boolean {\n const ok = Object.keys, tx = typeof x, ty = typeof y;\n return x && y && tx === 'object' && tx === ty ? (\n ok(x).length === ok(y).length &&\n ok(x).every((key) => deepEqual(x[key], y[key]))\n ) : (x === y);\n}\n","export default function isObject>(object: any): object is T {\n return typeof(object) === 'object' && object !== null;\n}\n","export default function safeAssign(object: T, fromObject: any) {\n if(fromObject) {\n for(const i in fromObject) {\n if(fromObject[i] !== undefined) {\n // @ts-ignore\n object[i] = fromObject[i];\n }\n }\n }\n\n return object;\n}\n","import copy from './copy';\nimport isObject from './isObject';\n\nexport default function validateInitObject(\n initObject: any,\n currentObject: any,\n onReplace?: (key: string) => void,\n previousKey?: string,\n ignorePaths?: Set,\n path?: string\n) {\n for(const key in initObject) {\n const _path = path ? `${path}.${key}` : key;\n if(ignorePaths?.has(_path)) {\n continue;\n }\n\n if(typeof(currentObject[key]) !== typeof(initObject[key])) {\n currentObject[key] = copy(initObject[key]);\n onReplace?.(previousKey || key);\n } else if(isObject(initObject[key])) {\n validateInitObject(initObject[key], currentObject[key], onReplace, previousKey || key, ignorePaths, _path);\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 isAnyChat from '../lib/appManagers/utils/peers/isAnyChat';\nimport isUser from '../lib/appManagers/utils/peers/isUser';\n\nString.prototype.toUserId = function() {\n return (+this).toUserId();\n};\n\nString.prototype.toChatId = function() {\n return (+this).toChatId();\n};\n\nString.prototype.toPeerId = function(isChat?: boolean) {\n return (+this).toPeerId(isChat);\n};\n\nString.prototype.isPeerId = function() {\n return /^[\\d-]/.test(this.toString());\n};\n\nNumber.prototype.toUserId = function() {\n return this as any;\n};\n\nNumber.prototype.toChatId = function() {\n return Math.abs(this as any);\n};\n\nNumber.prototype.toPeerId = function(isChat?: boolean) {\n return isChat === undefined ? this as number : (isChat ? -Math.abs(this as number) : this as number);\n};\n\nNumber.prototype.isPeerId = function() {\n return true;\n};\n\n[\n ['isUser' as const, isUser],\n ['isAnyChat' as const, isAnyChat]\n].forEach((value) => {\n const newMethod = Array.isArray(value) ? value[0] : value;\n const originMethod = Array.isArray(value) ? value[1] : value;\n // @ts-ignore\n String.prototype[newMethod] = function() {\n // @ts-ignore\n // eslint-disable-next-line no-useless-call\n return originMethod.call(null, this.toString());\n };\n\n // @ts-ignore\n Number.prototype[newMethod] = function() {\n // @ts-ignore\n // eslint-disable-next-line no-useless-call\n return originMethod.call(null, this);\n };\n});\n\ndeclare global {\n interface String {\n toUserId(): UserId;\n toChatId(): ChatId;\n toPeerId(isChat?: boolean): PeerId;\n isPeerId(): this is string;\n\n isUser(): boolean;\n isAnyChat(): boolean;\n }\n\n interface Number {\n toUserId(): UserId;\n toChatId(): ChatId;\n toPeerId(isChat?: boolean): PeerId;\n isPeerId(): this is PeerId;\n\n isUser(): boolean;\n isAnyChat(): boolean;\n }\n}\n\nexport {};\n","/*\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","import {logger} from '../lib/logger';\nimport dT from './dT';\n\nexport function recordPromise>(promise: T, description: string, log?: ReturnType | Console) {\n const perf = performance.now();\n (log || console).warn(dT(), 'start', description);\n promise.then(() => {\n (log || console).warn(dT(), 'end', description, performance.now() - perf);\n });\n return promise;\n}\n\nexport function recordPromiseBound(log: ReturnType | Console) {\n return (...args: [Parameters[0], Parameters[1]]) => {\n return recordPromise(...args, log);\n };\n}\n","export default function pause(ms: number) {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n","// * Jolly Cobra's schedulers\n\nimport {AnyToVoidFunction} from '../../types';\n\nexport default function throttle(\n fn: F,\n ms: number,\n shouldRunFirst = true\n) {\n let interval: number | null = null;\n let isPending: boolean;\n let args: Parameters;\n\n return (..._args: Parameters) => {\n isPending = true;\n args = _args;\n\n if(!interval) {\n if(shouldRunFirst) {\n isPending = false;\n // @ts-ignore\n fn(...args);\n }\n\n interval = setInterval(() => {\n if(!isPending) {\n clearInterval(interval!);\n interval = null;\n return;\n }\n\n isPending = false;\n // @ts-ignore\n fn(...args);\n }, ms) as any;\n }\n };\n}\n","export default function capitalizeFirstLetter(string: string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\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 CacheStorageController from '../lib/files/cacheStorage';\nimport AppStorage from '../lib/storage';\nimport sessionStorage from '../lib/sessionStorage';\nimport noop from './noop';\n\nexport default function toggleStorages(enabled: boolean, clearWrite: boolean) {\n return Promise.all([\n AppStorage.toggleStorage(enabled, clearWrite),\n CacheStorageController.toggleStorage(enabled, clearWrite),\n sessionStorage.toggleStorage(enabled, clearWrite)\n ]).then(noop, noop);\n}\n","export default function tsNow(seconds?: true) {\n const t = Date.now();\n return seconds ? t / 1000 | 0 : t;\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 clearMessageId from './clearMessageId';\n\n/**\n * * will ignore outgoing offset\n */\nexport default function getServerMessageId(messageId: number) {\n return clearMessageId(messageId, true);\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_ID_OFFSET, MESSAGE_ID_INCREMENT} from '.';\n\nexport default function clearMessageId(messageId: number, toServer?: boolean) {\n const q = MESSAGE_ID_OFFSET;\n if(messageId < q) { // id 0 -> mid 0xFFFFFFFF, so 0xFFFFFFFF must convert to 0\n return messageId;\n }\n\n const l = MESSAGE_ID_INCREMENT - 1;\n const used = messageId & l;\n if(used !== l) {\n messageId -= used + 1;\n }\n\n return toServer ? (messageId - q) / MESSAGE_ID_INCREMENT : messageId;\n}\n","export const MESSAGE_ID_INCREMENT = 0x10000;\nexport const MESSAGE_ID_OFFSET = 0xFFFFFFFF;\n","export default function isAnyChat(peerId: PeerId) {\n return +peerId < 0;\n}\n","export default function isUser(peerId: PeerId) {\n return +peerId >= 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 {CryptoMethods} from './crypto_methods';\nimport SuperMessagePort from '../mtproto/superMessagePort';\nimport {Awaited} from '../../types';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {IS_WORKER} from '../../helpers/context';\n\ntype CryptoEvent = {\n invoke: (payload: {method: T, args: Parameters}) => ReturnType,\n port: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n terminate: () => void\n};\n\nexport class CryptoMessagePort extends SuperMessagePort {\n private lastIndex: number;\n\n constructor() {\n super('CRYPTO');\n this.lastIndex = -1;\n }\n\n public invokeCryptoNew({method, args, transfer}: {\n method: T,\n args: Parameters,\n transfer?: Transferable[]\n }): Promise>> {\n const payload = {method, args};\n const listeners = this.listeners['invoke'];\n if(listeners?.length) { // already in worker\n // try {\n // @ts-ignore\n let result: any = listeners[0].callback(payload);\n if(!IS_WORKER && !(result instanceof Promise)) {\n result = Promise.resolve(result);\n }\n\n return result;\n // } catch(err) {\n // return Promise.reject(err);\n // }\n }\n\n const sendPortIndex = method === 'aes-encrypt' || method === 'aes-decrypt' ?\n this.lastIndex = (this.lastIndex + 1) % this.sendPorts.length :\n 0;\n // @ts-ignore\n return this.invoke('invoke', payload, undefined, this.sendPorts[sendPortIndex], transfer);\n }\n\n public invokeCrypto(method: T, ...args: Parameters): Promise>> {\n return this.invokeCryptoNew({method, args});\n }\n}\n\nconst cryptoMessagePort = new CryptoMessagePort();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.cryptoMessagePort = cryptoMessagePort);\nexport default cryptoMessagePort;\n","/*\n * 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 blobConstruct from '../../helpers/blob/blobConstruct';\nimport MemoryWriter from './memoryWriter';\nimport FileManager from './memoryWriter';\nimport FileStorage from './fileStorage';\nimport makeError from '../../helpers/makeError';\nimport deferredPromise from '../../helpers/cancellablePromise';\n\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\n\nexport default class CacheStorageController implements FileStorage {\n private static STORAGES: CacheStorageController[] = [];\n private openDbPromise: Promise;\n\n private useStorage = true;\n\n // private log: ReturnType = logger('CS');\n\n constructor(private dbName: CacheStorageDbName) {\n if(Modes.test) {\n this.dbName += '_test';\n }\n\n if(CacheStorageController.STORAGES.length) {\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\n }\n\n this.openDatabase();\n CacheStorageController.STORAGES.push(this);\n }\n\n private openDatabase(): Promise {\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\n }\n\n public delete(entryName: string) {\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\n }\n\n public deleteAll() {\n return caches.delete(this.dbName);\n }\n\n public get(entryName: string) {\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\n }\n\n public save(entryName: string, response: Response) {\n // return new Promise((resolve) => {}); // DEBUG\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\n }\n\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\n /* if(method === 'blob') {\n return Promise.reject();\n } */\n\n // const str = `get fileName: ${fileName}`;\n // console.time(str);\n return this.get(fileName).then((response) => {\n if(!response) {\n // console.warn('getFile:', response, fileName);\n throw makeError('NO_ENTRY_FOUND');\n }\n\n const promise = response[method]();\n // promise.then(() => {\n // console.timeEnd(str);\n // });\n return promise;\n });\n }\n\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\n // return Promise.resolve(blobConstruct([blob]));\n if(!(blob instanceof Blob)) {\n blob = blobConstruct(blob);\n }\n\n const response = new Response(blob, {\n headers: {\n 'Content-Length': '' + blob.size\n }\n });\n\n return this.save(fileName, response).then(() => blob as Blob);\n }\n\n public timeoutOperation(callback: (cache: Cache) => Promise) {\n if(!this.useStorage) {\n return Promise.reject(makeError('STORAGE_OFFLINE'));\n }\n\n return new Promise(async(resolve, reject) => {\n let rejected = false;\n const timeout = setTimeout(() => {\n reject();\n // console.warn('CACHESTORAGE TIMEOUT');\n rejected = true;\n }, 15e3);\n\n try {\n const cache = await this.openDatabase();\n if(!cache) {\n this.useStorage = false;\n this.openDbPromise = undefined;\n throw 'no cache?';\n }\n\n const res = await callback(cache);\n\n if(rejected) return;\n resolve(res);\n } catch(err) {\n reject(err);\n }\n\n clearTimeout(timeout);\n });\n }\n\n public prepareWriting(fileName: string, fileSize: number, mimeType: string) {\n return {\n deferred: deferredPromise(),\n getWriter: () => {\n const writer = new MemoryWriter(mimeType, fileSize, (blob) => {\n return this.saveFile(fileName, blob).catch(() => blob);\n });\n\n return writer;\n }\n };\n }\n\n public static toggleStorage(enabled: boolean, clearWrite: boolean) {\n return Promise.all(this.STORAGES.map((storage) => {\n storage.useStorage = enabled;\n\n if(!clearWrite) {\n return;\n }\n\n if(!enabled) {\n return storage.deleteAll();\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 blobConstruct from '../../helpers/blob/blobConstruct';\nimport StreamWriter from './streamWriter';\n\nexport default class MemoryWriter implements StreamWriter {\n private bytes: Uint8Array;\n\n constructor(\n private mimeType: string,\n private size: number,\n private saveFileCallback?: (blob: Blob) => Promise\n ) {\n this.bytes = new Uint8Array(size);\n }\n\n public async write(part: Uint8Array, offset: number) {\n // sometimes file size can be bigger than the prov\n const endOffset = offset + part.byteLength;\n if(endOffset > this.bytes.byteLength) {\n const newBytes = new Uint8Array(endOffset);\n newBytes.set(this.bytes, 0);\n this.bytes = newBytes;\n }\n\n this.bytes.set(part, offset);\n };\n\n public truncate() {\n this.bytes = new Uint8Array();\n }\n\n public trim(size: number) {\n this.bytes = this.bytes.slice(0, size);\n }\n\n public finalize(saveToStorage = true) {\n const blob = blobConstruct(this.bytes, this.mimeType);\n\n if(saveToStorage && this.saveFileCallback) {\n this.saveFileCallback(blob);\n }\n\n return blob;\n }\n\n public getParts() {\n return this.bytes;\n }\n\n public replaceParts(parts: Uint8Array) {\n this.bytes = parts;\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 DEBUG from '../config/debug';\nimport {IS_FIREFOX, IS_SAFARI} from '../environment/userAgent';\nimport {IS_SERVICE_WORKER, IS_WEB_WORKER} from '../helpers/context';\nimport dT from '../helpers/dT';\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 IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\n// let getCallerFunctionNameFromLine: (line: string) => string;\n// if(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;\n// const LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\n// function 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 group(...args: any[]): void;\n groupCollapsed(...args: any[]): void;\n groupEnd(...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' */ | 'group' | 'groupCollapsed' | 'groupEnd', 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 ['group', LogTypes.Log],\n ['groupCollapsed', LogTypes.Log],\n ['groupEnd', 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 const 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","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport type {getEnvironment} from '../../environment/utils';\nimport type loadState from '../appManagers/utils/state/loadState';\nimport type {StoragesResults} from '../appManagers/utils/storages/loadStorages';\nimport type {LocalStorageProxyTask} from '../localStorage';\nimport type {Awaited} from '../../types';\nimport type {Mirrors, MirrorTaskPayload, NotificationBuildTaskPayload, TabState} from './mtprotoworker';\nimport type toggleStorages from '../../helpers/toggleStorages';\nimport SuperMessagePort from './superMessagePort';\n\nexport type MTProtoManagerTaskPayload = {name: string, method: string, args: any[]};\n\ntype MTProtoBroadcastEvent = {\n event: (payload: {name: string, args: any[]}, source: MessageEventSource) => void\n};\n\nexport default class MTProtoMessagePort extends SuperMessagePort<{\n environment: (environment: ReturnType) => void,\n crypto: (payload: {method: string, args: any[]}) => Promise,\n state: (payload: {userId: UserId} & Awaited> & {storagesResults?: StoragesResults}) => void,\n manager: (payload: MTProtoManagerTaskPayload) => any,\n toggleStorages: (payload: {enabled: boolean, clearWrite: boolean}) => ReturnType,\n serviceWorkerOnline: (online: boolean) => void,\n serviceWorkerPort: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n cryptoPort: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n createObjectURL: (blob: Blob) => string,\n tabState: (payload: TabState, source: MessageEventSource) => void,\n createProxyWorkerURLs: (payload: {originalUrl: string, blob: Blob}) => string[],\n} & MTProtoBroadcastEvent, {\n convertWebp: (payload: {fileName: string, bytes: Uint8Array}) => Promise,\n convertOpus: (payload: {fileName: string, bytes: Uint8Array}) => Promise,\n localStorageProxy: (payload: LocalStorageProxyTask['payload']) => Promise,\n mirror: (payload: MirrorTaskPayload) => void,\n notificationBuild: (payload: NotificationBuildTaskPayload) => void,\n // hello: () => void\n} & MTProtoBroadcastEvent, Master> {\n private static INSTANCE: MTProtoMessagePort;\n\n constructor() {\n super('MTPROTO');\n\n MTProtoMessagePort.INSTANCE = this;\n\n MOUNT_CLASS_TO && (MOUNT_CLASS_TO.mtprotoMessagePort = this);\n }\n\n public static getInstance() {\n return this.INSTANCE as MTProtoMessagePort;\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 bufferConcats from '../helpers/bytes/bufferConcats';\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\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\ndeclare global {\n interface Uint8Array {\n concat: (...args: Array) => Uint8Array,\n // toString: () => string,\n toJSON: () => number[],\n // toJSON: () => {type: 'bytes', value: number[]},\n }\n\n interface Promise {\n finally: (onfinally?: () => void) => Promise;\n }\n}\n","import {URL_ANY_PROTOCOL_REG_EXP} from '.';\n\nexport default function matchUrlProtocol(text: string) {\n return !text ? null : text.match(URL_ANY_PROTOCOL_REG_EXP);\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 {WebPushApiManager} from '../mtproto/webPushApiManager';\nimport type {PushNotificationObject} from './push';\nimport type {MyUploadFile} from '../mtproto/apiFileManager';\nimport SuperMessagePort from '../mtproto/superMessagePort';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\n\nexport type ServicePushPingTaskPayload = {\n localNotifications: boolean,\n lang: {\n push_action_mute1d: string\n push_action_settings: string\n push_message_nopreview: string\n },\n settings: WebPushApiManager['settings']\n};\n\nexport type ServiceRequestFilePartTaskPayload = {\n docId: DocId,\n dcId: number,\n offset: number,\n limit: number\n};\n\nexport type ServiceDownloadTaskPayload = {\n headers: any,\n id: string\n};\n\nexport type ServiceEvent = {\n port: (payload: void, source: MessageEventSource, event: MessageEvent) => void\n};\n\nexport default class ServiceMessagePort extends SuperMessagePort<{\n // from main thread to service worker\n notificationsClear: () => void,\n toggleStorages: (payload: {enabled: boolean, clearWrite: boolean}) => void,\n pushPing: (payload: ServicePushPingTaskPayload, source: MessageEventSource, event: MessageEvent) => void,\n hello: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n shownNotification: (payload: string) => void,\n\n // from mtproto worker\n download: (payload: ServiceDownloadTaskPayload) => void,\n downloadChunk: (payload: {id: ServiceDownloadTaskPayload['id'], chunk: Uint8Array}) => void\n downloadFinalize: (payload: ServiceDownloadTaskPayload['id']) => void,\n downloadCancel: (payload: ServiceDownloadTaskPayload['id']) => void\n}, {\n // to main thread\n pushClick: (payload: PushNotificationObject) => void,\n hello: (payload: void, source: MessageEventSource) => void,\n share: (payload: ShareData) => void,\n\n // to mtproto worker\n requestFilePart: (payload: ServiceRequestFilePartTaskPayload) => Promise | MyUploadFile\n} & ServiceEvent, Master> {\n constructor() {\n super('SERVICE');\n\n MOUNT_CLASS_TO && (MOUNT_CLASS_TO.serviceMessagePort = this);\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 Modes from '../config/modes';\nimport {IS_WORKER} from '../helpers/context';\nimport {WorkerTaskTemplate} from '../types';\nimport MTProtoMessagePort from './mtproto/mtprotoMessagePort';\n// import { stringify } from '../helpers/json';\n\nclass LocalStorage> {\n private prefix = '';\n private cache: Partial = {};\n private useStorage = true;\n\n constructor(/* private preserveKeys: (keyof Storage)[] */) {\n if(Modes.test) {\n this.prefix = 't_';\n }\n }\n\n public get(key: T, useCache = true): Storage[T] {\n if(this.cache.hasOwnProperty(key) && useCache) {\n return this.cache[key];\n } else if(this.useStorage) {\n let value: Storage[T];\n try {\n value = localStorage.getItem(this.prefix + (key as string)) as any;\n } catch(err) {\n this.useStorage = false;\n }\n\n if(value !== null) {\n try {\n value = JSON.parse(value);\n } catch(err) {\n // console.error(err);\n }\n } else {\n value = undefined;\n }\n\n return value;\n }/* else {\n throw 'something went wrong';\n } */\n }\n\n public set(obj: Partial, onlyLocal = false) {\n for(const key in obj) {\n if(obj.hasOwnProperty(key)) {\n const value = obj[key];\n this.cache[key] = value;\n\n if(this.useStorage && !onlyLocal) {\n try {\n const stringified = JSON.stringify(value);\n localStorage.setItem(this.prefix + key, stringified);\n } catch(err) {\n this.useStorage = false;\n }\n }\n }\n }\n }\n\n public delete(key: keyof Storage, saveLocal = false) {\n // ! it is needed here\n key = '' + (key as string);\n\n if(!saveLocal) {\n delete this.cache[key];\n }\n\n // if(this.useStorage) {\n try {\n localStorage.removeItem(this.prefix + (key as string));\n } catch(err) {\n\n }\n // }\n }\n\n /* public clear(preserveKeys: (keyof Storage)[] = this.preserveKeys) {\n // if(this.useStorage) {\n try {\n let obj: Partial = {};\n if(preserveKeys) {\n preserveKeys.forEach((key) => {\n const value = this.get(key);\n if(value !== undefined) {\n obj[key] = value;\n }\n });\n }\n\n localStorage.clear();\n\n if(preserveKeys) {\n this.set(obj);\n }\n } catch(err) {\n\n }\n // }\n } */\n\n public clear() {\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance', 'user_auth', 'state_id', 'k_build'];\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 for(const key of keys) {\n this.delete(key, true);\n }\n }\n\n public toggleStorage(enabled: boolean, clearWrite: boolean) {\n this.useStorage = enabled;\n\n if(!clearWrite) {\n return;\n }\n\n if(!enabled) {\n this.clear();\n } else {\n return this.set(this.cache);\n }\n }\n}\n\nexport interface LocalStorageProxyTask extends WorkerTaskTemplate {\n type: 'localStorageProxy',\n payload: {\n type: 'set' | 'get' | 'delete' | 'clear' | 'toggleStorage',\n args: any[]\n }\n};\n\nexport interface LocalStorageProxyTaskResponse extends WorkerTaskTemplate {\n type: 'localStorageProxy',\n payload: any\n};\n\nexport default class LocalStorageController> {\n private static STORAGES: LocalStorageController[] = [];\n // private log = (...args: any[]) => console.log('[SW LS]', ...args);\n // private log = (...args: any[]) => {};\n\n private storage: LocalStorage;\n\n constructor(/* private preserveKeys: (keyof Storage)[] = [] */) {\n LocalStorageController.STORAGES.push(this);\n\n if(!IS_WORKER) {\n this.storage = new LocalStorage(/* preserveKeys */);\n }\n }\n\n private async proxy(type: LocalStorageProxyTask['payload']['type'], ...args: LocalStorageProxyTask['payload']['args']): Promise {\n if(IS_WORKER) {\n const port = MTProtoMessagePort.getInstance();\n return port.invoke('localStorageProxy', {type, args});\n }\n\n args = Array.prototype.slice.call(args);\n\n // @ts-ignore\n return this.storage[type].apply(this.storage, args as any);\n }\n\n public get(key: T, useCache?: boolean) {\n return this.proxy('get', key, useCache);\n }\n\n public set(obj: Partial, onlyLocal?: boolean) {\n return this.proxy('set', obj, onlyLocal);\n }\n\n public delete(key: keyof Storage, saveLocal?: boolean) {\n return this.proxy('delete', key, saveLocal);\n }\n\n public clear(/* preserveKeys?: (keyof Storage)[] */) {\n return this.proxy('clear'/* , preserveKeys */);\n }\n\n public toggleStorage(enabled: boolean, clearWrite: boolean) {\n return this.proxy('toggleStorage', enabled, clearWrite);\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 {AppInstance} from './mtproto/singleInstance';\nimport type {UserAuth} from './mtproto/mtproto_config';\nimport type {DcId} from '../types';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport LocalStorageController from './localStorage';\n\nconst sessionStorage = new LocalStorageController<{\n dc: DcId,\n user_auth: UserAuth,\n state_id: number,\n dc1_auth_key: string,\n dc2_auth_key: string,\n dc3_auth_key: string,\n dc4_auth_key: string,\n dc5_auth_key: string,\n dc1_server_salt: string,\n dc2_server_salt: string,\n dc3_server_salt: string,\n dc4_server_salt: string,\n dc5_server_salt: string,\n server_time_offset: number,\n xt_instance: AppInstance,\n kz_version: 'K' | 'Z',\n tgme_sync: {\n canRedirect: boolean,\n ts: number\n },\n k_build: number\n}>(/* ['kz_version'] */);\nMOUNT_CLASS_TO.appStorage = sessionStorage;\nexport default sessionStorage;\n","/*\n * 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 {ChatSavedPosition} from './appManagers/appImManager';\nimport type {AppDraftsManager} from './appManagers/appDraftsManager';\nimport type {State} from '../config/state';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport {LangPackDifference} from '../layer';\nimport AppStorage from './storage';\nimport DATABASE_STATE from '../config/databases/state';\n\nclass StateStorage extends AppStorage<{\n chatPositions: {\n [peerId_threadId: string]: ChatSavedPosition\n },\n langPack: LangPackDifference,\n drafts: AppDraftsManager['drafts'],\n user_auth: any, // support old webk format\n} & State, typeof DATABASE_STATE> {\n constructor() {\n super(DATABASE_STATE, 'session');\n }\n}\n\nconst stateStorage = new StateStorage();\nMOUNT_CLASS_TO.stateStorage = stateStorage;\nexport default stateStorage;\n","/*\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 {Database} from '../config/databases';\nimport {MOUNT_CLASS_TO} from '../config/debug';\n// import DATABASE_SESSION from \"../config/databases/session\";\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport {IS_WORKER} from '../helpers/context';\nimport throttle from '../helpers/schedulers/throttle';\n// import { WorkerTaskTemplate } from \"../types\";\nimport IDBStorage from './files/idb';\n\nfunction noop() {}\n\n/* export interface LocalStorageProxySetTask extends WorkerTaskTemplate {\n type: 'localStorageProxy',\n payload: {\n type: 'set',\n keys: string[],\n values: any[]\n }\n};\n\nexport interface LocalStorageProxyDeleteTask extends WorkerTaskTemplate {\n type: 'localStorageProxy',\n payload: {\n type: 'delete',\n keys: string[]\n }\n}; */\n\nconst THROTTLE_TIME = 16;\n\n/* Storage extends {[name: string]: any} *//* Storage extends Record */\nexport default class AppStorage<\n Storage extends Record,\n T extends Database\n> {\n private static STORAGES: AppStorage>[] = [];\n private storage: IDBStorage;// new CacheStorageController('session');\n\n // private cache: Partial<{[key: string]: Storage[typeof key]}> = {};\n private cache: Partial = {};\n private useStorage: boolean;\n private savingFreezed: boolean;\n\n private getPromises: Map> = new Map();\n private getThrottled: () => void;\n\n private keysToSet: Set = new Set();\n private saveThrottled: () => void;\n private saveDeferred = deferredPromise();\n\n private keysToDelete: Set = new Set();\n private deleteThrottled: () => void;\n private deleteDeferred = deferredPromise();\n\n constructor(private db: T, private storeName: typeof db['stores'][number]['name']) {\n this.storage = new IDBStorage(db, storeName);\n\n if(AppStorage.STORAGES.length) {\n this.useStorage = AppStorage.STORAGES[0].useStorage;\n } else {\n this.useStorage = true;\n }\n\n this.savingFreezed = false;\n\n AppStorage.STORAGES.push(this);\n\n this.saveThrottled = throttle(async() => {\n const deferred = this.saveDeferred;\n this.saveDeferred = deferredPromise();\n\n const set = this.keysToSet;\n if(set.size) {\n const keys = Array.from(set.values()) as string[];\n set.clear();\n\n const values = keys.map((key) => this.cache[key]);\n try {\n // console.log('setItem: will set', key/* , value */);\n // await this.cacheStorage.delete(key); // * try to prevent memory leak in Chrome leading to 'Unexpected internal error.'\n // await this.storage.save(key, new Response(value, {headers: {'Content-Type': 'application/json'}}));\n\n /* if(db === DATABASE_SESSION && !('localStorage' in self)) { // * support legacy Webogram's localStorage\n self.postMessage({\n type: 'localStorageProxy',\n payload: {\n type: 'set',\n keys,\n values\n }\n } as LocalStorageProxySetTask);\n } */\n\n await this.storage.save(keys, values);\n // console.log('setItem: have set', key/* , value */);\n } catch(e) {\n // this.useCS = false;\n console.error('[AS]: set error:', e, keys, values);\n }\n }\n\n deferred.resolve();\n\n if(set.size) {\n this.saveThrottled();\n }\n }, THROTTLE_TIME, false);\n\n this.deleteThrottled = throttle(async() => {\n const deferred = this.deleteDeferred;\n this.deleteDeferred = deferredPromise();\n\n const set = this.keysToDelete;\n if(set.size) {\n const keys = Array.from(set.values()) as string[];\n set.clear();\n\n try {\n /* if(db === DATABASE_SESSION && !('localStorage' in self)) { // * support legacy Webogram's localStorage\n self.postMessage({\n type: 'localStorageProxy',\n payload: {\n type: 'delete',\n keys\n }\n } as LocalStorageProxyDeleteTask);\n } */\n\n await this.storage.delete(keys);\n } catch(e) {\n console.error('[AS]: delete error:', e, keys);\n }\n }\n\n deferred.resolve();\n\n if(set.size) {\n this.deleteThrottled();\n }\n }, THROTTLE_TIME, false);\n\n this.getThrottled = throttle(async() => {\n const keys = Array.from(this.getPromises.keys());\n\n // const perf = performance.now();\n this.storage.get(keys as string[]).then((values) => {\n for(let i = 0, length = keys.length; i < length; ++i) {\n const key = keys[i];\n const deferred = this.getPromises.get(key);\n if(deferred) {\n // @ts-ignore\n deferred.resolve(this.cache[key] = values[i]);\n this.getPromises.delete(key);\n }\n }\n\n // console.log('[AS]: get time', keys, performance.now() - perf);\n }, (error: ApiError) => {\n const ignoreErrors: Set = new Set(['NO_ENTRY_FOUND', 'STORAGE_OFFLINE']);\n if(!ignoreErrors.has(error.type)) {\n this.useStorage = false;\n console.error('[AS]: get error:', error, keys, storeName);\n }\n\n for(let i = 0, length = keys.length; i < length; ++i) {\n const key = keys[i];\n const deferred = this.getPromises.get(key);\n if(deferred) {\n // deferred.reject(error);\n deferred.resolve(undefined);\n this.getPromises.delete(key);\n }\n }\n }).finally(() => {\n if(this.getPromises.size) {\n this.getThrottled();\n }\n });\n }, THROTTLE_TIME, false);\n }\n\n public isAvailable() {\n return this.useStorage;\n }\n\n public getCache() {\n return this.cache;\n }\n\n public getFromCache(key: T) {\n return this.cache[key];\n }\n\n public setToCache(key: keyof Storage, value: Storage[typeof key]) {\n return this.cache[key] = value;\n }\n\n public async get(key: T, useCache = true): Promise {\n if(this.cache.hasOwnProperty(key) && useCache) {\n return this.getFromCache(key);\n } else if(this.useStorage) {\n const r = this.getPromises.get(key);\n if(r) return r as any;\n\n const p = deferredPromise();\n this.getPromises.set(key, p as any);\n\n this.getThrottled();\n\n return p;\n }/* else {\n throw 'something went wrong';\n } */\n }\n\n public getAll() {\n return this.storage.getAll().catch(() => []);\n }\n\n public set(obj: Partial, onlyLocal = false) {\n // console.log('storageSetValue', obj, callback, arguments);\n\n const canUseStorage = this.useStorage && !onlyLocal && !this.savingFreezed;\n for(const key in obj) {\n if(obj.hasOwnProperty(key)) {\n const value = obj[key];\n this.setToCache(key, value);\n\n // let perf = /* DEBUG */false ? performance.now() : 0;\n // value = JSON.stringify(value);\n\n // if(perf) {\n // let elapsedTime = performance.now() - perf;\n // if(elapsedTime > 10) {\n // console.warn('LocalStorage set: stringify time by JSON.stringify:', elapsedTime, key);\n // }\n // }\n\n /* perf = performance.now();\n value = stringify(value);\n console.log('LocalStorage set: stringify time by own stringify:', performance.now() - perf); */\n\n if(canUseStorage) {\n this.keysToSet.add(key);\n this.keysToDelete.delete(key);\n this.saveThrottled();\n }\n }\n }\n\n return canUseStorage ? this.saveDeferred : Promise.resolve();\n }\n\n public delete(key: keyof Storage, saveLocal = false) {\n /* if(!this.cache.hasOwnProperty(key)) {\n return;\n } */\n\n // ! it is needed here\n key = '' + (key as string);\n\n if(!saveLocal) {\n delete this.cache[key];\n }\n\n if(this.useStorage) {\n this.keysToSet.delete(key);\n this.keysToDelete.add(key);\n this.deleteThrottled();\n }\n\n return this.useStorage ? this.deleteDeferred : Promise.resolve();\n }\n\n public clear(saveLocal = false) {\n if(!saveLocal) {\n for(const i in this.cache) {\n delete this.cache[i];\n }\n }\n\n return this.storage.clear().catch(noop);\n }\n\n public static toggleStorage(enabled: boolean, clearWrite: boolean) {\n return Promise.all(this.STORAGES.map((storage) => {\n storage.useStorage = enabled;\n\n if(!IS_WORKER || !clearWrite) {\n return;\n }\n\n if(!enabled) {\n storage.keysToSet.clear();\n storage.keysToDelete.clear();\n storage.getPromises.forEach((deferred) => deferred.resolve(undefined));\n storage.getPromises.clear();\n return storage.clear(true);\n } else {\n return storage.set(storage.cache);\n }\n })).catch(noop);\n }\n\n public static freezeSaving>(callback: () => any, names: T['stores'][number]['name'][]) {\n this.STORAGES.forEach((storage) => storage.savingFreezed = true);\n try {\n callback();\n } catch(err) {\n console.error('freezeSaving callback error:', err);\n }\n this.STORAGES.forEach((storage) => storage.savingFreezed = false);\n }\n\n /* public deleteDatabase() {\n return IDBStorage.deleteDatabase().catch(noop);\n } */\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.AppStorage = AppStorage);\n","// Copyright Twitter Inc. Licensed under MIT\n// https://github.com/twitter/twemoji-parser/blob/master/LICENSE.md\n\nconst originalString = '((?:\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\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\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\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\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\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\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\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\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\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\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d[\\udc68\\udc69]|\\ud83e\\udef1\\ud83c\\udffb\\u200d\\ud83e\\udef2\\ud83c[\\udffc-\\udfff]|\\ud83e\\udef1\\ud83c\\udffc\\u200d\\ud83e\\udef2\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\udef1\\ud83c\\udffd\\u200d\\ud83e\\udef2\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\udef1\\ud83c\\udffe\\u200d\\ud83e\\udef2\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\udef1\\ud83c\\udfff\\u200d\\ud83e\\udef2\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f?\\u200d\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1|\\ud83d\\udc6b\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6c\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6d\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc8f\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc91\\ud83c[\\udffb-\\udfff]|\\ud83e\\udd1d\\ud83c[\\udffb-\\udfff]|\\ud83d[\\udc6b-\\udc6d\\udc8f\\udc91]|\\ud83e\\udd1d)|(?:\\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\\uddd4\\uddd6-\\udddd])(?:\\ud83c[\\udffb-\\udfff])?\\u200d[\\u2640\\u2642]\\ufe0f?|(?:\\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\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\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\\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|\\ud83d\\ude36\\u200d\\ud83c\\udf2b\\ufe0f?|\\u2764\\ufe0f?\\u200d\\ud83d\\udd25|\\u2764\\ufe0f?\\u200d\\ud83e\\ude79|\\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?|\\ud83d\\ude2e\\u200d\\ud83d\\udca8|\\ud83d\\ude35\\u200d\\ud83d\\udcab|\\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\\udec3-\\udec5\\udef0-\\udef6]|[\\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-\\udc8e\\udc90\\udc92-\\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\\udedd-\\udedf\\udeeb\\udeec\\udef4-\\udefc\\udfe0-\\udfeb\\udff0]|\\ud83e[\\udd0d\\udd0e\\udd10-\\udd17\\udd20-\\udd25\\udd27-\\udd2f\\udd3a\\udd3c\\udd3f-\\udd45\\udd47-\\udd76\\udd78-\\uddb4\\uddb7\\uddba\\uddbc-\\uddcc\\uddd0\\uddde-\\uddff\\ude70-\\ude74\\ude78-\\ude7c\\ude80-\\ude86\\ude90-\\udeac\\udeb0-\\udeba\\udec0-\\udec2\\uded0-\\uded9\\udee0-\\udee7]|[\\u23e9-\\u23ec\\u23f0\\u23f3\\u267e\\u26ce\\u2705\\u2728\\u274c\\u274e\\u2753-\\u2755\\u2795-\\u2797\\u27b0\\u27bf\\ue50a])|\\ufe0f)';\nexport default originalString;\n"],"names":["MAIN_DOMAINS","threads","Math","min","navigator","hardwareConcurrency","App","id","hash","version","versionFull","build","langPackVersion","langPack","langPackCode","domains","baseDcId","isMainDomain","includes","location","hostname","suffix","cryptoWorkers","name","stores","blobConstruct","blobParts","mimeType","Array","isArray","safeMimeType","Blob","type","blobSafeMimeType","indexOf","bufferConcats","args","length","reduce","acc","v","byteLength","tmp","Uint8Array","lastLength","forEach","b","set","ArrayBuffer","deferredPromise","deferredHelper","isFulfilled","isRejected","notify","notifyAll","lastNotify","listeners","callback","addNotifyListener","push","deferred","Promise","resolve","reject","value","catch","finally","cancel","Object","assign","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","self","IS_WEB_WORKER","WorkerGlobalScope","IS_WORKER","postMessage","listener","err","console","error","notifyServiceWorker","all","clients","matchAll","includeUncontrolled","then","slice","bind","noop","copy","obj","Date","getTime","map","el","isView","clonedObj","constructor","prop","hasOwnProperty","deepEqual","x","y","ok","keys","tx","every","key","isObject","object","safeAssign","fromObject","i","undefined","validateInitObject","initObject","currentObject","onReplace","previousKey","ignorePaths","path","_path","has","String","prototype","toUserId","this","toChatId","toPeerId","isChat","isPeerId","test","toString","Number","abs","newMethod","originMethod","call","arrays","Uint16Array","Uint32Array","nextRandomUint","bits","array","crypto","getRandomValues","randomLong","recordPromiseBound","log","promise","description","perf","performance","now","warn","recordPromise","pause","ms","setTimeout","throttle","fn","shouldRunFirst","isPending","interval","_args","setInterval","clearInterval","capitalizeFirstLetter","string","charAt","toUpperCase","toggleStorages","enabled","clearWrite","tsNow","seconds","t","getServerMessageId","messageId","toServer","q","l","used","clearMessageId","MESSAGE_ID_INCREMENT","MESSAGE_ID_OFFSET","isAnyChat","peerId","isUser","CryptoMessagePort","super","lastIndex","invokeCryptoNew","method","transfer","payload","result","sendPortIndex","sendPorts","invoke","invokeCrypto","cryptoMessagePort","CacheStorageController","dbName","useStorage","STORAGES","openDatabase","openDbPromise","caches","open","delete","entryName","timeoutOperation","cache","deleteAll","get","match","save","response","put","getFile","fileName","saveFile","blob","Response","headers","size","rejected","timeout","res","clearTimeout","prepareWriting","fileSize","getWriter","static","storage","MemoryWriter","saveFileCallback","bytes","write","part","offset","endOffset","newBytes","truncate","trim","finalize","saveToStorage","getParts","replaceParts","parts","LogTypes","LOG_LEVELS","None","Error","Warn","Log","Debug","STYLES_SUPPORTED","IS_SAFARI","IS_FIREFOX","LOGGER_STYLES","methods","logger","prefix","ignoreDebugReset","style","originalPrefix","originalStyle","logType","setPrefix","newPrefix","setLevel","level","bindPrefix","MTProtoMessagePort","INSTANCE","concat","toJSON","onFinally","reason","matchUrlProtocol","text","ServiceMessagePort","LocalStorage","useCache","localStorage","getItem","JSON","parse","onlyLocal","stringified","stringify","setItem","saveLocal","removeItem","clear","toggleStorage","LocalStorageController","proxy","apply","sessionStorage","StateStorage","stateStorage","AppStorage","db","storeName","getPromises","Map","keysToSet","Set","saveDeferred","keysToDelete","deleteDeferred","savingFreezed","saveThrottled","from","values","e","deleteThrottled","getThrottled","isAvailable","getCache","getFromCache","setToCache","r","p","getAll","canUseStorage","add","names"],"sourceRoot":""} \ No newline at end of file diff --git a/public/508.a90261547e5af541e4e8.chunk.js b/public/508.049a695db07b5a81eb8b.chunk.js similarity index 98% rename from public/508.a90261547e5af541e4e8.chunk.js rename to public/508.049a695db07b5a81eb8b.chunk.js index 735ff102..b3ddb3b8 100644 --- a/public/508.a90261547e5af541e4e8.chunk.js +++ b/public/508.049a695db07b5a81eb8b.chunk.js @@ -1,2 +1,2 @@ (()=>{"use strict";(()=>{if("undefined"!=typeof __webpack_require__){var e=__webpack_require__.u,t=__webpack_require__.e,r={},i={};__webpack_require__.u=function(t){return e(t)+(r.hasOwnProperty(t)?"?"+r[t]:"")},__webpack_require__.e=function(n){return t(n).catch((function(t){var a=i.hasOwnProperty(n)?i[n]:999999;if(a<1){var o=e(n);throw t.message="Loading chunk "+n+" failed after 999999 retries.\n("+o+")",t.request=o,t}return new Promise((function(e){setTimeout((function(){var t=Date.now();r[n]=t,i[n]=a-1,e(__webpack_require__.e(n))}),3e3)}))}))}}})();const e="undefined"!=typeof window?window:self,t=navigator?navigator.userAgent:null,r=(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)&&e.MSStream,!!("safari"in e)||!(!t||!(/\b(iPad|iPhone|iPod)\b/.test(t)||t.match("Safari")&&!t.match("Chrome"))));let i;if(navigator.userAgent.toLowerCase().indexOf("firefox"),(void 0===navigator.maxTouchPoints||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),r)try{i=+navigator.userAgent.match(/Version\/(.+?) /)[1]>=14}catch(e){i=!1}else i=!0;const n=i,a="undefined"!=typeof ImageBitmap;const o=[[[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]]],s=e=>Math.round(255*Math.min(Math.max(e,0),1));importScripts("rlottie-wasm.js");const h=self.Module;class d{constructor(e,t,r,i){this.reqId=e,this.width=t,this.height=r,this.raw=i}init(e,t){if(!this.dead){this.fps=Math.max(1,Math.min(60,t||60));try{this.handle=c.Api.init(),this.stringOnWasmHeap=allocate(intArrayFromString(e),"i8",0),this.frameCount=c.Api.loadFromData(this.handle,this.stringOnWasmHeap),c.Api.resize(this.handle,this.width,this.height),m(["loaded",this.reqId,this.frameCount,this.fps]),!this.raw&&a&&(this.imageData=new ImageData(this.width,this.height))}catch(e){console.error("init RLottieItem error:",e),m(["error",this.reqId,e])}}}render(e,t){if(!this.dead&&void 0!==this.handle&&!(this.frameCount{m(["frame",this.reqId,e,t],[t])}))):(t?t.set(i):t=new Uint8ClampedArray(i),m(["frame",this.reqId,e,t],[t.buffer]))}catch(e){console.error("Render error:",e),this.dead=!0,m(["error",this.reqId,e])}}destroy(){this.dead=!0,void 0!==this.handle&&c.Api.destroy(this.handle)}}const c=new class{constructor(){this.Api={}}initApi(){this.Api={init:h.cwrap("lottie_init","",[]),destroy:h.cwrap("lottie_destroy","",["number"]),resize:h.cwrap("lottie_resize","",["number","number","number"]),buffer:h.cwrap("lottie_buffer","number",["number"]),render:h.cwrap("lottie_render","",["number","number"]),loadFromData:h.cwrap("lottie_load_from_data","number",["number","number"])}}init(){this.initApi(),m(["ready"])}};h.onRuntimeInitialized=function(){c.init()};const u={},f={loadFromData:function(e,t,r,i,n,a){const h=u[e]=new d(e,r,i,a);(function(e){return function(e,t){return new Promise((t=>{const r=new FileReader;r.addEventListener("loadend",(e=>{t(e.target.result)})),r.readAsText(e)}))}(e)})(t).then((t=>{try{if("number"==typeof n&&n>=1&&n<=5){const e=JSON.parse(t);(function(e,t){const r=o[Math.max(t-1,0)],i=e=>{switch(e.ty){case"st":case"fl":(e=>{const t=e.c.k,i=s(t[2])|s(t[1])<<8|s(t[0])<<16,n=r.find((e=>e[0]===i));n&&(t[0]=(n[1]>>16&255)/255,t[1]=(n[1]>>8&255)/255,t[2]=(255&n[1])/255)})(e)}e.hasOwnProperty("it")&&n(e.it)},n=e=>{for(const t of e)i(t)};try{for(const t of e.layers)if(t.shapes)for(const e of t.shapes)e.it?n(e.it):i(e)}catch(r){console.warn("cant apply replacements",r,e,t)}})(e,n),t=JSON.stringify(e)}const e=t.match(/"fr":\s*?(\d+?),/),r=+(null==e?void 0:e[1])||60;h.init(t,r)}catch(r){console.error("Invalid file for sticker:",t),m(["error",e,r])}}))},destroy:function(e){const t=u[e];t&&(t.destroy(),delete u[e])},renderFrame:function(e,t,r){u[e].render(t,r)}};function m(e,t){postMessage({queryMethodListener:e.shift(),queryMethodArguments:e},n?t:void 0)}onmessage=function(e){f[e.data.queryMethod].apply(f,e.data.queryMethodArguments)}})(); -//# sourceMappingURL=508.a90261547e5af541e4e8.chunk.js.map \ No newline at end of file +//# sourceMappingURL=508.049a695db07b5a81eb8b.chunk.js.map \ No newline at end of file diff --git a/public/508.a90261547e5af541e4e8.chunk.js.map b/public/508.049a695db07b5a81eb8b.chunk.js.map similarity index 99% rename from public/508.a90261547e5af541e4e8.chunk.js.map rename to public/508.049a695db07b5a81eb8b.chunk.js.map index 8a1d1c1b..ef4275e0 100644 --- a/public/508.a90261547e5af541e4e8.chunk.js.map +++ b/public/508.049a695db07b5a81eb8b.chunk.js.map @@ -1 +1 @@ -{"version":3,"file":"508.a90261547e5af541e4e8.chunk.js","mappings":"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","sources":["webpack://tweb/webpack/runtime/compat","webpack://tweb/./src/environment/ctx.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/environment/canUseTransferables.ts","webpack://tweb/./src/environment/imageBitmapSupport.ts","webpack://tweb/./src/lib/rlottie/applyReplacements.ts","webpack://tweb/./src/lib/rlottie/rlottie.worker.ts","webpack://tweb/./src/helpers/blob/readBlobAsText.ts","webpack://tweb/./src/helpers/blob/readBlobAs.ts"],"sourcesContent":["(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = {};\n var countMap = {};\n var getRetryDelay = function () {\n return 3000;\n };\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result +\n (queryMap.hasOwnProperty(chunkId) ? '?' + queryMap[chunkId] : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.hasOwnProperty(chunkId)\n ? countMap[chunkId]\n : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n var retryAttempt = 999999 - retries + 1;\n setTimeout(function () {\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap[chunkId] = cacheBust;\n countMap[chunkId] = retries - 1;\n resolve(__webpack_require__.e(chunkId));\n }, getRetryDelay(retryAttempt));\n });\n });\n };\n }\n})();\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 ctx from './ctx';\n\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\n\n// https://stackoverflow.com/a/58065241\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\n !(ctx as any).MSStream;\n\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 */;\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\n\nexport const IS_MOBILE = (navigator.maxTouchPoints === undefined || 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;\n","import {IS_SAFARI} from './userAgent';\n\n/*\n * This is used as a workaround for a memory leak in Safari caused by using Transferable objects to\n * transfer data between WebWorkers and the main thread.\n * https://github.com/mapbox/mapbox-gl-js/issues/8771\n *\n * This should be removed once the underlying Safari issue is fixed.\n */\n\nlet CAN_USE_TRANSFERABLES: boolean;\nif(!IS_SAFARI) CAN_USE_TRANSFERABLES = true;\nelse {\n try {\n const match = navigator.userAgent.match(/Version\\/(.+?) /);\n CAN_USE_TRANSFERABLES = +match[1] >= 14;\n } catch(err) {\n CAN_USE_TRANSFERABLES = false;\n }\n}\n\nexport default CAN_USE_TRANSFERABLES;\n","const IS_IMAGE_BITMAP_SUPPORTED = typeof(ImageBitmap) !== 'undefined';\n\nexport default IS_IMAGE_BITMAP_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\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\nconst convert = (value: number) => {\n return 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","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport CAN_USE_TRANSFERABLES from '../../environment/canUseTransferables';\nimport IS_IMAGE_BITMAP_SUPPORTED from '../../environment/imageBitmapSupport';\nimport readBlobAsText from '../../helpers/blob/readBlobAsText';\nimport applyReplacements from './applyReplacements';\n\nimportScripts('rlottie-wasm.js');\n// import Module, { allocate, intArrayFromString } from './rlottie-wasm';\n\nconst _Module = (self as any).Module as any;\n\nconst DEFAULT_FPS = 60;\n\ntype LottieHandlePointer = number;\n\n// throw new Error('test');\n\nexport class RLottieItem {\n private stringOnWasmHeap: number;\n private handle: LottieHandlePointer;\n private frameCount: number;\n private fps: number;\n\n private dead: boolean;\n // private context: OffscreenCanvasRenderingContext2D;\n\n private imageData: ImageData;\n\n constructor(\n private reqId: number,\n private width: number,\n private height: number,\n private raw?: boolean/* ,\n private canvas: OffscreenCanvas */\n ) {\n }\n\n public init(json: string, fps: number) {\n if(this.dead) {\n return;\n }\n\n this.fps = Math.max(1, Math.min(60, fps || DEFAULT_FPS));\n\n // this.context = canvas.getContext('2d');\n /* let frame = 0;\n setInterval(() => {\n if(frame >= this.frameCount) frame = 0;\n let _frame = frame++;\n this.render(_frame, null);\n }, 1000 / this.fps); */\n\n try {\n this.handle = worker.Api.init();\n\n // @ts-ignore\n this.stringOnWasmHeap = allocate(intArrayFromString(json), 'i8', 0);\n\n this.frameCount = worker.Api.loadFromData(this.handle, this.stringOnWasmHeap);\n\n worker.Api.resize(this.handle, this.width, this.height);\n\n reply(['loaded', this.reqId, this.frameCount, this.fps]);\n\n if(!this.raw && IS_IMAGE_BITMAP_SUPPORTED) {\n this.imageData = new ImageData(this.width, this.height);\n }\n } catch(e) {\n console.error('init RLottieItem error:', e);\n reply(['error', this.reqId, e]);\n }\n }\n\n public render(frameNo: number, clamped?: Uint8ClampedArray) {\n if(this.dead || this.handle === undefined) return;\n // return;\n\n if(this.frameCount < frameNo || frameNo < 0) {\n return;\n }\n\n try {\n worker.Api.render(this.handle, frameNo);\n\n const bufferPointer = worker.Api.buffer(this.handle);\n\n const data = _Module.HEAPU8.subarray(bufferPointer, bufferPointer + (this.width * this.height * 4));\n\n if(this.imageData) {\n this.imageData.data.set(data);\n createImageBitmap(this.imageData).then((imageBitmap) => {\n reply(['frame', this.reqId, frameNo, imageBitmap], [imageBitmap]);\n });\n } else {\n if(!clamped) {\n clamped = new Uint8ClampedArray(data);\n } else {\n clamped.set(data);\n }\n\n // this.context.putImageData(new ImageData(clamped, this.width, this.height), 0, 0);\n\n reply(['frame', this.reqId, frameNo, clamped], [clamped.buffer]);\n }\n } catch(e) {\n console.error('Render error:', e);\n this.dead = true;\n reply(['error', this.reqId, e]);\n }\n }\n\n public destroy() {\n this.dead = true;\n\n if(this.handle !== undefined) {\n worker.Api.destroy(this.handle);\n }\n }\n}\n\nclass RLottieWorker {\n public Api: {\n init: () => LottieHandlePointer,\n destroy: (handle: LottieHandlePointer) => void,\n resize: (handle: LottieHandlePointer, width: number, height: number) => void,\n buffer: (handle: LottieHandlePointer) => number,\n render: (handle: LottieHandlePointer, frameNo: number) => void,\n loadFromData: (handle: LottieHandlePointer, bufferPointer: number) => number\n } = {} as any;\n\n public initApi() {\n this.Api = {\n init: _Module.cwrap('lottie_init', '', []),\n destroy: _Module.cwrap('lottie_destroy', '', ['number']),\n resize: _Module.cwrap('lottie_resize', '', ['number', 'number', 'number']),\n buffer: _Module.cwrap('lottie_buffer', 'number', ['number']),\n render: _Module.cwrap('lottie_render', '', ['number', 'number']),\n loadFromData: _Module.cwrap('lottie_load_from_data', 'number', ['number', 'number'])\n };\n }\n\n public init() {\n this.initApi();\n reply(['ready']);\n }\n}\n\nconst worker = new RLottieWorker();\n\n_Module.onRuntimeInitialized = function() {\n worker.init();\n};\n\nconst items: {[reqId: string]: RLottieItem} = {};\nconst queryableFunctions = {\n loadFromData: function(reqId: number, blob: Blob, width: number, height: number, toneIndex: number, raw: boolean/* , canvas: OffscreenCanvas */) {\n const item = items[reqId] = new RLottieItem(reqId, width, height, raw/* , canvas */);\n readBlobAsText(blob).then((json) => {\n try {\n if(typeof(toneIndex) === 'number' && toneIndex >= 1 && toneIndex <= 5) {\n /* params.animationData = copy(params.animationData);\n this.applyReplacements(params.animationData, toneIndex); */\n\n const newAnimationData = JSON.parse(json);\n applyReplacements(newAnimationData, toneIndex);\n json = JSON.stringify(newAnimationData);\n }\n\n // ! WARNING, ั ัั‚ะพะน ะฟั€ะพะฒะตั€ะบะพะน ะฝะต ะฒัะต ัั‚ะธะบะตั€ั‹ ั€ะฐะฑะพั‚ะฐัŽั‚, ะฝะฐะฟั€ะธะผะตั€ - ะ”ะฃะ ะšะ\n /* if(!/\"tgs\":\\s*?1./.test(jsString)) {\n throw new Error('Invalid file');\n } */\n\n /* let perf = performance.now();\n let json = JSON.parse(jsString);\n console.log('sticker decode:', performance.now() - perf); */\n\n const match = json.match(/\"fr\":\\s*?(\\d+?),/);\n const frameRate = +match?.[1] || DEFAULT_FPS;\n\n // console.log('Rendering sticker:', reqId, frameRate, 'now rendered:', Object.keys(items).length);\n\n item.init(json, frameRate);\n } catch(err) {\n console.error('Invalid file for sticker:', json);\n reply(['error', reqId, err]);\n }\n });\n },\n destroy: function(reqId: number) {\n const item = items[reqId];\n if(!item) {\n return;\n }\n\n item.destroy();\n delete items[reqId];\n },\n renderFrame: function(reqId: number, frameNo: number, clamped?: Uint8ClampedArray) {\n // console.log('worker renderFrame', reqId, frameNo, clamped);\n items[reqId].render(frameNo, clamped);\n }\n};\n\nfunction reply(args: any[], transfer?: Transferable[]) {\n postMessage({queryMethodListener: args.shift(), queryMethodArguments: args}, CAN_USE_TRANSFERABLES ? transfer : undefined);\n}\n\nonmessage = function(e) {\n // @ts-ignore\n queryableFunctions[e.data.queryMethod].apply(queryableFunctions, e.data.queryMethodArguments);\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 readBlobAs from './readBlobAs';\n\nexport default function readBlobAsText(blob: Blob) {\n return readBlobAs(blob, 'readAsText');\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 { IS_WEB_WORKER } from \"../context\";\n\n// const id = IS_WEB_WORKER ? Math.random() * 0x1000 | 0 : 0;\nexport default function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\n // const perf = performance.now();\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (e) => {\n // console.log(`readBlobAs [${id}] ${method} time ${performance.now() - perf}`);\n resolve(e.target.result);\n });\n reader[method](blob);\n });\n}\n"],"names":["__webpack_require__","oldGetScript","u","oldLoadScript","e","queryMap","countMap","chunkId","hasOwnProperty","catch","error","retries","realSrc","message","request","Promise","resolve","setTimeout","cacheBust","Date","now","window","self","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","CAN_USE_TRANSFERABLES","undefined","err","COLORREPLACEMENTS","convert","value","Math","round","min","max","importScripts","_Module","Module","RLottieItem","constructor","reqId","width","height","raw","init","json","fps","this","dead","handle","worker","Api","stringOnWasmHeap","allocate","intArrayFromString","frameCount","loadFromData","resize","reply","imageData","ImageData","console","render","frameNo","clamped","bufferPointer","buffer","data","HEAPU8","subarray","set","createImageBitmap","then","imageBitmap","Uint8ClampedArray","destroy","initApi","cwrap","onRuntimeInitialized","items","queryableFunctions","blob","toneIndex","item","method","reader","FileReader","addEventListener","target","result","readBlobAs","readBlobAsText","newAnimationData","JSON","parse","object","replacements","checkSmth","smth","ty","k","c","color","foundReplacement","find","p","applyTo","iterateIt","it","layer","layers","shapes","shape","warn","applyReplacements","stringify","frameRate","renderFrame","args","transfer","postMessage","queryMethodListener","shift","queryMethodArguments","onmessage","queryMethod","apply"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"508.049a695db07b5a81eb8b.chunk.js","mappings":"mBAAA,MACE,GAAmC,oBAAxBA,oBAAqC,CAC9C,IAAIC,EAAeD,oBAAoBE,EACnCC,EAAgBH,oBAAoBI,EACpCC,EAAW,CAAC,EACZC,EAAW,CAAC,EAIhBN,oBAAoBE,EAAI,SAAUK,GAEhC,OADaN,EAAaM,IAGvBF,EAASG,eAAeD,GAAW,IAAMF,EAASE,GAAW,GAElE,EACAP,oBAAoBI,EAAI,SAAUG,GAEhC,OADaJ,EAAcI,GACbE,OAAM,SAAUC,GAC5B,IAAIC,EAAUL,EAASE,eAAeD,GAClCD,EAASC,GACT,OACJ,GAAII,EAAU,EAAG,CACf,IAAIC,EAAUX,EAAaM,GAQ3B,MAPAG,EAAMG,QACJ,iBACAN,EACA,mCACAK,EACA,IACFF,EAAMI,QAAUF,EACVF,CACR,CACA,OAAO,IAAIK,SAAQ,SAAUC,GAE3BC,YAAW,WACT,IACIC,EACKC,KAAKC,MAGdf,EAASE,GAAWW,EACpBZ,EAASC,GAAWI,EAAU,EAC9BK,EAAQhB,oBAAoBI,EAAEG,GAChC,GArCG,IAsCL,GACF,GACF,CACF,CACD,EAjDD,GCAA,MAEA,EAF+B,oBAAb,OAA2Bc,OAASC,KCQzCC,EAAaC,UAAYA,UAAUC,UAAY,KAU/CC,GATWF,UAAUC,UAAUE,OAAO,yBACzBH,UAAUC,UAAUG,cAAcC,QAAQ,WACzC,SAASC,KAAKN,UAAUC,YAAc,aAAaK,KAAKN,UAAUO,SAG7D,mBAAmBD,KAAKN,UAAUQ,WACxC,aAAvBR,UAAUQ,UAA2BR,UAAUS,eAAiB,IAC/D,cAEwB,kBAAuBV,KAAe,yBAAyBO,KAAKP,IAAkBA,EAAWW,MAAM,YAAcX,EAAWW,MAAM,aCRlK,IAAIC,EACJ,GDQ0BX,UAAUC,UAAUG,cAAcC,QAAQ,iBAIbO,IAA7BZ,UAAUS,gBAAgCT,UAAUS,eAAiB,IAAMT,UAAUC,UAAUE,OAAO,kHCZ5HD,EAEF,IAEES,GADcX,UAAUC,UAAUS,MAAM,mBACT,IAAM,E,CACrC,MAAMG,GACNF,GAAwB,C,MANbA,GAAwB,EAUvC,UCnBA,EAF0D,oBAAlB,YCOxC,MAAMG,EAAoB,CACxB,CACE,CAAC,SAAU,UACX,CAAC,SAAU,UACX,CAAC,SAAU,UACX,CAAC,SAAU,WAGb,CACE,CAAC,SAAU,SACX,CAAC,SAAU,UACX,CAAC,SAAU,UACX,CAAC,SAAU,WAGb,CACE,CAAC,SAAU,SACX,CAAC,SAAU,UACX,CAAC,SAAU,UACX,CAAC,SAAU,WAGb,CACE,CAAC,SAAU,SACX,CAAC,SAAU,SACX,CAAC,SAAU,SACX,CAAC,SAAU,WAGb,CACE,CAAC,SAAU,SACX,CAAC,SAAU,SACX,CAAC,SAAU,SACX,CAAC,SAAU,WAITC,EAAWC,GACRC,KAAKC,MAAwC,IAAlCD,KAAKE,IAAIF,KAAKG,IAAIJ,EAAO,GAAI,IClCjDK,cAAc,mBAGd,MAAMC,EAAWxB,KAAayB,OAQvB,MAAMC,EAWXC,YACUC,EACAC,EACAC,EACAC,GAHA,KAAAH,MAAAA,EACA,KAAAC,MAAAA,EACA,KAAAC,OAAAA,EACA,KAAAC,IAAAA,CAGV,CAEOC,KAAKC,EAAcC,GACxB,IAAGC,KAAKC,KAAR,CAIAD,KAAKD,IAAMf,KAAKG,IAAI,EAAGH,KAAKE,IAAI,GAAIa,GA/BpB,KAyChB,IACEC,KAAKE,OAASC,EAAOC,IAAIP,OAGzBG,KAAKK,iBAAmBC,SAASC,mBAAmBT,GAAO,KAAM,GAEjEE,KAAKQ,WAAaL,EAAOC,IAAIK,aAAaT,KAAKE,OAAQF,KAAKK,kBAE5DF,EAAOC,IAAIM,OAAOV,KAAKE,OAAQF,KAAKN,MAAOM,KAAKL,QAEhDgB,EAAM,CAAC,SAAUX,KAAKP,MAAOO,KAAKQ,WAAYR,KAAKD,OAE/CC,KAAKJ,KAAO,IACdI,KAAKY,UAAY,IAAIC,UAAUb,KAAKN,MAAOM,KAAKL,Q,CAElD,MAAMhD,GACNmE,QAAQ7D,MAAM,0BAA2BN,GACzCgE,EAAM,CAAC,QAASX,KAAKP,MAAO9C,G,EAEhC,CAEOoE,OAAOC,EAAiBC,GAC7B,IAAGjB,KAAKC,WAAwBtB,IAAhBqB,KAAKE,UAGlBF,KAAKQ,WAAaQ,GAAWA,EAAU,GAI1C,IACEb,EAAOC,IAAIW,OAAOf,KAAKE,OAAQc,GAE/B,MAAME,EAAgBf,EAAOC,IAAIe,OAAOnB,KAAKE,QAEvCkB,EAAO/B,EAAQgC,OAAOC,SAASJ,EAAeA,EAAiBlB,KAAKN,MAAQM,KAAKL,OAAS,GAE7FK,KAAKY,WACNZ,KAAKY,UAAUQ,KAAKG,IAAIH,GACxBI,kBAAkBxB,KAAKY,WAAWa,MAAMC,IACtCf,EAAM,CAAC,QAASX,KAAKP,MAAOuB,EAASU,GAAc,CAACA,GAAa,MAG/DT,EAGFA,EAAQM,IAAIH,GAFZH,EAAU,IAAIU,kBAAkBP,GAOlCT,EAAM,CAAC,QAASX,KAAKP,MAAOuB,EAASC,GAAU,CAACA,EAAQE,S,CAE1D,MAAMxE,GACNmE,QAAQ7D,MAAM,gBAAiBN,GAC/BqD,KAAKC,MAAO,EACZU,EAAM,CAAC,QAASX,KAAKP,MAAO9C,G,CAEhC,CAEOiF,UACL5B,KAAKC,MAAO,OAEOtB,IAAhBqB,KAAKE,QACNC,EAAOC,IAAIwB,QAAQ5B,KAAKE,OAE5B,EA8BF,MAAMC,EAAS,IA3Bf,oBACS,KAAAC,IAOH,CAAC,CAiBP,CAfSyB,UACL7B,KAAKI,IAAM,CACTP,KAAMR,EAAQyC,MAAM,cAAe,GAAI,IACvCF,QAASvC,EAAQyC,MAAM,iBAAkB,GAAI,CAAC,WAC9CpB,OAAQrB,EAAQyC,MAAM,gBAAiB,GAAI,CAAC,SAAU,SAAU,WAChEX,OAAQ9B,EAAQyC,MAAM,gBAAiB,SAAU,CAAC,WAClDf,OAAQ1B,EAAQyC,MAAM,gBAAiB,GAAI,CAAC,SAAU,WACtDrB,aAAcpB,EAAQyC,MAAM,wBAAyB,SAAU,CAAC,SAAU,WAE9E,CAEOjC,OACLG,KAAK6B,UACLlB,EAAM,CAAC,SACT,GAKFtB,EAAQ0C,qBAAuB,WAC7B5B,EAAON,MACT,EAEA,MAAMmC,EAAwC,CAAC,EACzCC,EAAqB,CACzBxB,aAAc,SAAShB,EAAeyC,EAAYxC,EAAeC,EAAgBwC,EAAmBvC,GAClG,MAAMwC,EAAOJ,EAAMvC,GAAS,IAAIF,EAAYE,EAAOC,EAAOC,EAAQC,ICzJvD,SAAwBsC,GACrC,OCGa,SAAoBA,EAAYG,GAE7C,OAAO,IAAI/E,SAAcC,IACvB,MAAM+E,EAAS,IAAIC,WACnBD,EAAOE,iBAAiB,WAAY7F,IAElCY,EAAQZ,EAAE8F,OAAOC,OAAO,IAE1BJ,EAAa,WAAEJ,EAAK,GAExB,CDbSS,CAAWT,EACpB,EDwJIU,CAAeV,GAAMT,MAAM3B,IACzB,IACE,GAAyB,iBAAhB,GAA4BqC,GAAa,GAAKA,GAAa,EAAG,CAIrE,MAAMU,EAAmBC,KAAKC,MAAMjD,IDhH/B,SAA2BkD,EAEvCb,GACD,MAAMc,EAAepE,EAAkBG,KAAKG,IAAIgD,EAAY,EAAG,IAgBzDe,EAAaC,IACjB,OAAOA,EAAKC,IACV,IAAK,KACL,IAAK,KAjBO,CAACD,IACf,MAAME,EAAIF,EAAKG,EAAED,EACXE,EAAQzE,EAAQuE,EAAE,IAAOvE,EAAQuE,EAAE,KAAO,EAAMvE,EAAQuE,EAAE,KAAO,GAEjEG,EAAmBP,EAAaQ,MAAMC,GAAMA,EAAE,KAAOH,IACxDC,IACDH,EAAE,IAAOG,EAAiB,IAAM,GAAM,KAAO,IAC7CH,EAAE,IAAOG,EAAiB,IAAM,EAAK,KAAO,IAC5CH,EAAE,IAA4B,IAAtBG,EAAiB,IAAY,I,EAUnCG,CAAQR,GAITA,EAAKpG,eAAe,OACrB6G,EAAUT,EAAKU,G,EAIbD,EAAaC,IACjB,IAAI,MAAMV,KAAQU,EAChBX,EAAUC,E,EAId,IACE,IAAI,MAAMW,KAASd,EAAOe,OACxB,GAAID,EAAME,OAEV,IAAI,MAAMC,KAASH,EAAME,OACnBC,EAAMJ,GAKVD,EAAUK,EAAMJ,IAJdX,EAAUe,E,CAOhB,MAAMrF,GACNkC,QAAQoD,KAAK,0BAA2BtF,EAAKoE,EAAQb,E,CAEzD,EC2DUgC,CAAkBtB,EAAkBV,GACpCrC,EAAOgD,KAAKsB,UAAUvB,E,CAYxB,MAAMpE,EAAQqB,EAAKrB,MAAM,oBACnB4F,IAAa5F,aAAK,EAALA,EAAQ,KAvKf,GA2KZ2D,EAAKvC,KAAKC,EAAMuE,E,CAChB,MAAMzF,GACNkC,QAAQ7D,MAAM,4BAA6B6C,GAC3Ca,EAAM,CAAC,QAASlB,EAAOb,G,IAG7B,EACAgD,QAAS,SAASnC,GAChB,MAAM2C,EAAOJ,EAAMvC,GACf2C,IAIJA,EAAKR,iBACEI,EAAMvC,GACf,EACA6E,YAAa,SAAS7E,EAAeuB,EAAiBC,GAEpDe,EAAMvC,GAAOsB,OAAOC,EAASC,EAC/B,GAGF,SAASN,EAAM4D,EAAaC,GAC1BC,YAAY,CAACC,oBAAqBH,EAAKI,QAASC,qBAAsBL,GAAO,EAAwBC,OAAW7F,EAClH,CAEAkG,UAAY,SAASlI,GAEnBsF,EAAmBtF,EAAEyE,KAAK0D,aAAaC,MAAM9C,EAAoBtF,EAAEyE,KAAKwD,qBAC1E,C","sources":["webpack://tweb/webpack/runtime/compat","webpack://tweb/./src/environment/ctx.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/environment/canUseTransferables.ts","webpack://tweb/./src/environment/imageBitmapSupport.ts","webpack://tweb/./src/lib/rlottie/applyReplacements.ts","webpack://tweb/./src/lib/rlottie/rlottie.worker.ts","webpack://tweb/./src/helpers/blob/readBlobAsText.ts","webpack://tweb/./src/helpers/blob/readBlobAs.ts"],"sourcesContent":["(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = {};\n var countMap = {};\n var getRetryDelay = function () {\n return 3000;\n };\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result +\n (queryMap.hasOwnProperty(chunkId) ? '?' + queryMap[chunkId] : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.hasOwnProperty(chunkId)\n ? countMap[chunkId]\n : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n var retryAttempt = 999999 - retries + 1;\n setTimeout(function () {\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap[chunkId] = cacheBust;\n countMap[chunkId] = retries - 1;\n resolve(__webpack_require__.e(chunkId));\n }, getRetryDelay(retryAttempt));\n });\n });\n };\n }\n})();\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 ctx from './ctx';\n\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\n\n// https://stackoverflow.com/a/58065241\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\n !(ctx as any).MSStream;\n\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 */;\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\n\nexport const IS_MOBILE = (navigator.maxTouchPoints === undefined || 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;\n","import {IS_SAFARI} from './userAgent';\n\n/*\n * This is used as a workaround for a memory leak in Safari caused by using Transferable objects to\n * transfer data between WebWorkers and the main thread.\n * https://github.com/mapbox/mapbox-gl-js/issues/8771\n *\n * This should be removed once the underlying Safari issue is fixed.\n */\n\nlet CAN_USE_TRANSFERABLES: boolean;\nif(!IS_SAFARI) CAN_USE_TRANSFERABLES = true;\nelse {\n try {\n const match = navigator.userAgent.match(/Version\\/(.+?) /);\n CAN_USE_TRANSFERABLES = +match[1] >= 14;\n } catch(err) {\n CAN_USE_TRANSFERABLES = false;\n }\n}\n\nexport default CAN_USE_TRANSFERABLES;\n","const IS_IMAGE_BITMAP_SUPPORTED = typeof(ImageBitmap) !== 'undefined';\n\nexport default IS_IMAGE_BITMAP_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\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\nconst convert = (value: number) => {\n return 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","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport CAN_USE_TRANSFERABLES from '../../environment/canUseTransferables';\nimport IS_IMAGE_BITMAP_SUPPORTED from '../../environment/imageBitmapSupport';\nimport readBlobAsText from '../../helpers/blob/readBlobAsText';\nimport applyReplacements from './applyReplacements';\n\nimportScripts('rlottie-wasm.js');\n// import Module, { allocate, intArrayFromString } from './rlottie-wasm';\n\nconst _Module = (self as any).Module as any;\n\nconst DEFAULT_FPS = 60;\n\ntype LottieHandlePointer = number;\n\n// throw new Error('test');\n\nexport class RLottieItem {\n private stringOnWasmHeap: number;\n private handle: LottieHandlePointer;\n private frameCount: number;\n private fps: number;\n\n private dead: boolean;\n // private context: OffscreenCanvasRenderingContext2D;\n\n private imageData: ImageData;\n\n constructor(\n private reqId: number,\n private width: number,\n private height: number,\n private raw?: boolean/* ,\n private canvas: OffscreenCanvas */\n ) {\n }\n\n public init(json: string, fps: number) {\n if(this.dead) {\n return;\n }\n\n this.fps = Math.max(1, Math.min(60, fps || DEFAULT_FPS));\n\n // this.context = canvas.getContext('2d');\n /* let frame = 0;\n setInterval(() => {\n if(frame >= this.frameCount) frame = 0;\n let _frame = frame++;\n this.render(_frame, null);\n }, 1000 / this.fps); */\n\n try {\n this.handle = worker.Api.init();\n\n // @ts-ignore\n this.stringOnWasmHeap = allocate(intArrayFromString(json), 'i8', 0);\n\n this.frameCount = worker.Api.loadFromData(this.handle, this.stringOnWasmHeap);\n\n worker.Api.resize(this.handle, this.width, this.height);\n\n reply(['loaded', this.reqId, this.frameCount, this.fps]);\n\n if(!this.raw && IS_IMAGE_BITMAP_SUPPORTED) {\n this.imageData = new ImageData(this.width, this.height);\n }\n } catch(e) {\n console.error('init RLottieItem error:', e);\n reply(['error', this.reqId, e]);\n }\n }\n\n public render(frameNo: number, clamped?: Uint8ClampedArray) {\n if(this.dead || this.handle === undefined) return;\n // return;\n\n if(this.frameCount < frameNo || frameNo < 0) {\n return;\n }\n\n try {\n worker.Api.render(this.handle, frameNo);\n\n const bufferPointer = worker.Api.buffer(this.handle);\n\n const data = _Module.HEAPU8.subarray(bufferPointer, bufferPointer + (this.width * this.height * 4));\n\n if(this.imageData) {\n this.imageData.data.set(data);\n createImageBitmap(this.imageData).then((imageBitmap) => {\n reply(['frame', this.reqId, frameNo, imageBitmap], [imageBitmap]);\n });\n } else {\n if(!clamped) {\n clamped = new Uint8ClampedArray(data);\n } else {\n clamped.set(data);\n }\n\n // this.context.putImageData(new ImageData(clamped, this.width, this.height), 0, 0);\n\n reply(['frame', this.reqId, frameNo, clamped], [clamped.buffer]);\n }\n } catch(e) {\n console.error('Render error:', e);\n this.dead = true;\n reply(['error', this.reqId, e]);\n }\n }\n\n public destroy() {\n this.dead = true;\n\n if(this.handle !== undefined) {\n worker.Api.destroy(this.handle);\n }\n }\n}\n\nclass RLottieWorker {\n public Api: {\n init: () => LottieHandlePointer,\n destroy: (handle: LottieHandlePointer) => void,\n resize: (handle: LottieHandlePointer, width: number, height: number) => void,\n buffer: (handle: LottieHandlePointer) => number,\n render: (handle: LottieHandlePointer, frameNo: number) => void,\n loadFromData: (handle: LottieHandlePointer, bufferPointer: number) => number\n } = {} as any;\n\n public initApi() {\n this.Api = {\n init: _Module.cwrap('lottie_init', '', []),\n destroy: _Module.cwrap('lottie_destroy', '', ['number']),\n resize: _Module.cwrap('lottie_resize', '', ['number', 'number', 'number']),\n buffer: _Module.cwrap('lottie_buffer', 'number', ['number']),\n render: _Module.cwrap('lottie_render', '', ['number', 'number']),\n loadFromData: _Module.cwrap('lottie_load_from_data', 'number', ['number', 'number'])\n };\n }\n\n public init() {\n this.initApi();\n reply(['ready']);\n }\n}\n\nconst worker = new RLottieWorker();\n\n_Module.onRuntimeInitialized = function() {\n worker.init();\n};\n\nconst items: {[reqId: string]: RLottieItem} = {};\nconst queryableFunctions = {\n loadFromData: function(reqId: number, blob: Blob, width: number, height: number, toneIndex: number, raw: boolean/* , canvas: OffscreenCanvas */) {\n const item = items[reqId] = new RLottieItem(reqId, width, height, raw/* , canvas */);\n readBlobAsText(blob).then((json) => {\n try {\n if(typeof(toneIndex) === 'number' && toneIndex >= 1 && toneIndex <= 5) {\n /* params.animationData = copy(params.animationData);\n this.applyReplacements(params.animationData, toneIndex); */\n\n const newAnimationData = JSON.parse(json);\n applyReplacements(newAnimationData, toneIndex);\n json = JSON.stringify(newAnimationData);\n }\n\n // ! WARNING, ั ัั‚ะพะน ะฟั€ะพะฒะตั€ะบะพะน ะฝะต ะฒัะต ัั‚ะธะบะตั€ั‹ ั€ะฐะฑะพั‚ะฐัŽั‚, ะฝะฐะฟั€ะธะผะตั€ - ะ”ะฃะ ะšะ\n /* if(!/\"tgs\":\\s*?1./.test(jsString)) {\n throw new Error('Invalid file');\n } */\n\n /* let perf = performance.now();\n let json = JSON.parse(jsString);\n console.log('sticker decode:', performance.now() - perf); */\n\n const match = json.match(/\"fr\":\\s*?(\\d+?),/);\n const frameRate = +match?.[1] || DEFAULT_FPS;\n\n // console.log('Rendering sticker:', reqId, frameRate, 'now rendered:', Object.keys(items).length);\n\n item.init(json, frameRate);\n } catch(err) {\n console.error('Invalid file for sticker:', json);\n reply(['error', reqId, err]);\n }\n });\n },\n destroy: function(reqId: number) {\n const item = items[reqId];\n if(!item) {\n return;\n }\n\n item.destroy();\n delete items[reqId];\n },\n renderFrame: function(reqId: number, frameNo: number, clamped?: Uint8ClampedArray) {\n // console.log('worker renderFrame', reqId, frameNo, clamped);\n items[reqId].render(frameNo, clamped);\n }\n};\n\nfunction reply(args: any[], transfer?: Transferable[]) {\n postMessage({queryMethodListener: args.shift(), queryMethodArguments: args}, CAN_USE_TRANSFERABLES ? transfer : undefined);\n}\n\nonmessage = function(e) {\n // @ts-ignore\n queryableFunctions[e.data.queryMethod].apply(queryableFunctions, e.data.queryMethodArguments);\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 readBlobAs from './readBlobAs';\n\nexport default function readBlobAsText(blob: Blob) {\n return readBlobAs(blob, 'readAsText');\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 { IS_WEB_WORKER } from \"../context\";\n\n// const id = IS_WEB_WORKER ? Math.random() * 0x1000 | 0 : 0;\nexport default function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\n // const perf = performance.now();\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (e) => {\n // console.log(`readBlobAs [${id}] ${method} time ${performance.now() - perf}`);\n resolve(e.target.result);\n });\n reader[method](blob);\n });\n}\n"],"names":["__webpack_require__","oldGetScript","u","oldLoadScript","e","queryMap","countMap","chunkId","hasOwnProperty","catch","error","retries","realSrc","message","request","Promise","resolve","setTimeout","cacheBust","Date","now","window","self","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","CAN_USE_TRANSFERABLES","undefined","err","COLORREPLACEMENTS","convert","value","Math","round","min","max","importScripts","_Module","Module","RLottieItem","constructor","reqId","width","height","raw","init","json","fps","this","dead","handle","worker","Api","stringOnWasmHeap","allocate","intArrayFromString","frameCount","loadFromData","resize","reply","imageData","ImageData","console","render","frameNo","clamped","bufferPointer","buffer","data","HEAPU8","subarray","set","createImageBitmap","then","imageBitmap","Uint8ClampedArray","destroy","initApi","cwrap","onRuntimeInitialized","items","queryableFunctions","blob","toneIndex","item","method","reader","FileReader","addEventListener","target","result","readBlobAs","readBlobAsText","newAnimationData","JSON","parse","object","replacements","checkSmth","smth","ty","k","c","color","foundReplacement","find","p","applyTo","iterateIt","it","layer","layers","shapes","shape","warn","applyReplacements","stringify","frameRate","renderFrame","args","transfer","postMessage","queryMethodListener","shift","queryMethodArguments","onmessage","queryMethod","apply"],"sourceRoot":""} \ No newline at end of file diff --git a/public/61.99941a688bad81e71e09.chunk.js b/public/61.5a1b64b6ed7885fd6d34.chunk.js similarity index 99% rename from public/61.99941a688bad81e71e09.chunk.js rename to public/61.5a1b64b6ed7885fd6d34.chunk.js index 006e0fe2..29f2a012 100644 --- a/public/61.99941a688bad81e71e09.chunk.js +++ b/public/61.5a1b64b6ed7885fd6d34.chunk.js @@ -1,2 +1,2 @@ (()=>{"use strict";var t,e,r={2061:(t,e,r)=>{let n,a;const o=null;function f(t){return JSON.parse(JSON.stringify(t))}function c(t,e,r,a,o){for(n=0;n=0;--r)e=f(d(t[r],e));return e}function g(t){if(!t)throw Error("assert :P")}const P=function(){function t(t){return t==Ee||t==je||t==Ce||t==Fe}function e(t){return A(t,1)}function r(t,e){const r=1+((t.la-1)*e>>8),n=r<<8;let a=0;for(t.Z>=n?(a=1,t.la-=r,t.Z-=n):(a=0,t.la=r);t.la<128;)t.Z<<=1,t.la<<=1,8==++t.gc&&(t.gc=0,t.bc&&(t.Z+=t.qa[t.Ia++],t.bc--));return a}function P(t,e,r,n){(n-=r)>=2?(t.Z=e[r+0]<<8|e[r+1],t.qa=e,t.Ia=r+2,t.bc=n-2):(t.Z=0,t.qa=o,t.bc=0),t.la=255,t.gc=0}function A(t,e){var n=0,a=0;for(a=e-1;a>=0;a--)n|=r(t,128)<=8&&t.Q>>=8,t.T+=t.qa[t.Ia+t.Q]<<24>>>0,++t.Q,t.g-=8}function y(t){t.g>=8&&w(t),t.Q==t.ya&&32==t.g&&(t.L=1)}function S(t,e){let r=0;if(g(e>=0),!t.L&&e=32&&(t.L=1,t.g+e>32))return r;r=t.T>>t.g&fr[e],t.g+=e,t.g>=8&&t.g>=8&&w(t)}else t.fa=1;return r}function T(t){return t.Pa==t.gb}function R(t,e){return g(t!=o),0==e?0:(t.gb=2*e-1,t.Y=v(t.gb,Dr),t.Y==o?0:(t.Y[0].s=-1,t.Pa=1))}function O(t){t!=o&&(t.Y=o,t.Y=o,t.gb=0,t.Pa=0)}function V(t,e,r,n){for(var a=t.Y,o=0,f=+t.gb;n-- >0;){if(o>=f)return 0;if(a[o].s<0){if(T(t))return 0;const e=t,r=e.Y,n=+e.Pa;a[o].s=n-o,e.Pa+=2,r[n+0].s=-1,r[n+1].s=-1}else if(0==a[o].s)return 0;o+=a[o].s+(r>>n&1)}if(a[o].s<0)a[o].s=0;else if(0!=a[o].s)return 0;return a[o].kc=e,1}function I(t,e,r){var n=0;let a=0,f=0;for(g(t!=o),g(e!=o),n=0;n0&&(++a,f=n);if(!R(t,a))return 0;if(1==a)return f<0||f>=r?(O(t),0):V(t,f,0,0);if(a=0,f=d(r,0),f==o)return(a=a&&T(t))||O(t),a;var c=0;c=0,n=d(pr+1,0);let i=0;const u=d(pr+1,0);let b=0;for(g(e!=o),g(r>0),g(f!=o),c=0;cb&&(b=e[c]);if(b>pr)n=0;else{for(c=0;c0?u[e[c]]++:jr;n=1}if(!n)return(a=a&&T(t))||O(t),a;for(n=0;n0&&!V(t,n,f[n],e[n]))return(a=a&&T(t))||O(t),a;return(a=T(t))||O(t),a}function _(t,e,r,n,a,o,f){var c=0;for(c=0;ct.P.v)&&(r=0==e)){t:{let e=t.Ga;var a=t.G,i=t.ub;r=t.P.l;let h=t.P.v;const v=t.Xb;var u=[o];let p=o,P=h*r;var b=o,s=o;s="WEBP_FILTER_TYPE";let A=0;u=0;var l=0;let k=0;if(g(r>0&&h>0&&n>=r),g(e!=o&&v!=o),i<=Sr)r=0;else if(k=e[a+0]>>0&3,s=e[a+0]>>2&3,A=e[a+0]>>4&3,u=e[a+0]>>6&3,kRr||s>=Sn||A>Or||0!=u)r=0;else{if(k==Tr)l=i>=P,u=e,p=a+Sr;else{if(p=0,(u=d(P,0))==o){r=0;break t}l=a+Sr,i-=Sr,a=u,b=f(tr);let t=0;const n=qt();n==o?l=0:(n.l=r,n.v=h,n.N=b,st(Ve),b.put=Pe,b.Mb=ge,b.Pb=Ae,b.ka=o,b.ka=a,b.fd=0,b.width=r,b.height=h,n.a=ze,m(n.o,e,l,i),n.Wa=An,Jt(r,h,1,n,o)&&Yt(n,r)&&(n.Wa=Pn,t=Ht(n,n.V,n.Ha,n.l,n.v,xt)),n!=o&&Kt(n),l=t)}if(l){for(e=Tn[s],e!=o?((b=d(P,0))==o&&(l=0,k!=Tr&&(p=u=o)),e(u,p,r,h,1,r,b,s=0),P=b,k=s):(P=u,k=p),e=0;h-- >0;)c(v,e,P,k,r),k+=r,e+=n;A==Or&&(l=u==o||p<=0||r<=0?0:1)}r=l}}r=!r}return r?o:0==e?t.Xb:+e*n}function U(t,e,r,n){if(n==o||t<=0||e<=0)return Ke;if(r!=o){if(r.Ua){const n=r.wc,a=r.vc,o=-2&r.t,f=-2&r.k;if(o<0||f<0||n<=0||a<=0||o+n>t||f+a>e)return Ke;t=n,e=a}if(r.I){if(r.Ba<=0||r.Aa<=0)return Ke;t=r.Ba,e=r.Aa}}return n.width=t,n.height=e,function(t){let e=t.width;const r=t.height;let n=t.J;if(e<=0||r<=0||!(n>=Ie&&n=Ie&&f=c*Rn[f],n&=t.ma!=o):(u=(t=t.c.Va).nb*parseInt((i+1)/2,10),b=t.rb*parseInt((i+1)/2,10),s=t.Fa*i,n&=t.F*i<=t.Wc,n&=u<=t.Rc,n&=b<=t.Uc,n&=s<=t.Wb,n&=t.F>=c,n&=t.nb>=parseInt((c+1)/2,10),n&=t.rb>=parseInt((c+1)/2,10),n&=t.y!=o,n&=t.c!=o,n&=t.S!=o,f==Ne&&(n&=t.Fa>=c,n&=s<=t.Wb,n&=t.p!=o)):n=0,n?ze:Ke}(n)}function M(t){return-256&t?t<0?0:255:t}function B(t,e,r,n){const a=d(16,0);let o,f;for(o=0,f=0;f<4;++f){var c=t[e+0]+t[e+8],i=t[e+0]-t[e+8],u=(t[e+4]*Bn>>16)-(t[e+12]*Mn>>16),b=(t[e+4]*Mn>>16)+(t[e+12]*Bn>>16);a[o+0]=c+b,a[o+1]=i+u,a[o+2]=i-u,a[o+3]=c-b,o+=4,e++}for(f=o=0;f<4;++f)c=(t=a[o+0]+4)+a[o+8],i=t-a[o+8],u=(a[o+4]*Bn>>16)-(a[o+12]*Mn>>16),b=(a[o+4]*Mn>>16)+(a[o+12]*Bn>>16),r[n+0+0*en]=M(r[n+0+0*en]+(c+b>>3)),r[n+1+0*en]=M(r[n+1+0*en]+(i+u>>3)),r[n+2+0*en]=M(r[n+2+0*en]+(i-u>>3)),r[n+3+0*en]=M(r[n+3+0*en]+(c-b>>3)),o++,n+=en}function D(t,e,r,n,a){B(t,e,r,n),a&&B(t,e+16,r,n+4)}function E(t,e,r,n){Cn(t,e+0,r,n+0,1),Cn(t,e+32,r,n+4*en,1)}function C(t,e,r,n){let a;for(t=t[e+0]+4,a=0;a<4;++a)for(e=0;e<4;++e)r[n+e+a*en]=M(r[n+e+a*en]+(t>>3))}function F(t,e,r,n){t[e+0]&&C(t,e+0,r,n+0),t[e+16]&&C(t,e+16,r,n+4),t[e+32]&&C(t,e+32,r,n+4*en),t[e+48]&&C(t,e+48,r,n+4*en+4)}function G(t,e,r){const n=e-en,a=Wn,o=255-t[n-1];let f;for(f=0;f>2}function H(t,e,r){let n,a;for(n=0;n<8;++n)for(a=0;a<8;++a)e[r+a+n*en]=t}function z(t,e,r){const n=t[e-r],a=t[e+0],o=3*(a-n)+In[1020+t[e-2*r]-t[e+r]],f=_n[112+(o+4>>3)];t[e-r]=Wn[255+n+_n[112+(o+3>>3)]],t[e+0]=Wn[255+a-f]}function q(t,e,r,n){const a=t[e+0],o=t[e+r];return On[255+t[e-2*r]-t[e-r]]>n||On[255+o-a]>n}function K(t,e,r,n,a){const o=t[e-3*r],f=t[e-2*r],c=t[e-r],i=t[e+0],u=t[e+r],b=t[e+2*r],s=t[e+3*r];return 2*On[255+c-i]+Vn[255+f-u]>n?0:On[255+t[e-4*r]-o]<=a&&On[255+o-f]<=a&&On[255+f-c]<=a&&On[255+s-b]<=a&&On[255+b-u]<=a&&On[255+u-i]<=a}function J(t,e,r,n){let a;for(a=0;a<16;++a)2*On[255+t[e+a-r]-t[e+a+0]]+Vn[255+t[e+a-2*r]-t[e+a+r]]<=n&&z(t,e+a,r)}function Y(t,e,r,n){let a;for(a=0;a<16;++a)2*On[255+t[e+a*r-1]-t[e+a*r+0]]+Vn[255+t[e+a*r-2]-t[e+a*r+1]]<=n&&z(t,e+a*r,1)}function x(t,e,r,n){let a;for(a=3;a>0;--a)J(t,(e+=4*r)+0,r,n)}function Q(t,e,r,n){let a;for(a=3;a>0;--a)Y(t,(e+=4)+0,r,n)}function $(t,e,r,n,a,o,f,c){for(;a-- >0;){if(K(t,e+0,r,o,f))if(q(t,e+0,r,c))z(t,e+0,r);else{const n=t,a=e+0,o=r,f=n[a-2*o],c=n[a-o],u=n[a+0],b=n[a+o],s=n[a+2*o],l=27*(i=In[1020+3*(u-c)+In[1020+f-b]])+63>>7,h=18*i+63>>7;var i=9*i+63>>7;n[a-3*o]=Wn[255+n[a-3*o]+i],n[a-2*o]=Wn[255+f+h],n[a-o]=Wn[255+c+l],n[a+0]=Wn[255+u-l],n[a+o]=Wn[255+b-h],n[a+2*o]=Wn[255+s-i]}e+=n}}function X(t,e,r,n,a,o,f,c){for(;a-- >0;){if(K(t,e+0,r,o,f))if(q(t,e+0,r,c))z(t,e+0,r);else{const n=t,a=e+0,o=r,f=n[a-o],c=n[a+0],u=n[a+o],b=_n[112+(4+(i=3*(c-f))>>3)];var i=_n[112+(i+3>>3)];const s=b+1>>1;n[a-2*o]=Wn[255+n[a-2*o]+s],n[a-o]=Wn[255+f+i],n[a+0]=Wn[255+c-b],n[a+o]=Wn[255+u-s]}e+=n}}function Z(t,e,r,n,a,o){$(t,e+0,r,1,16,n,a,o)}function tt(t,e,r,n,a,o){$(t,e+0,1,r,16,n,a,o)}function et(t,e,r,n,a,o){let f;for(f=3;f>0;--f)X(t,(e+=4*r)+0,r,1,16,n,a,o)}function rt(t,e,r,n,a,o){let f;for(f=3;f>0;--f)X(t,(e+=4)+0,1,r,16,n,a,o)}function nt(t,e,r,n,a,o,f,c){$(t,e,a,1,8,o,f,c),$(r,n,a,1,8,o,f,c)}function at(t,e,r,n,a,o,f,c){$(t,e,1,a,8,o,f,c),$(r,n,1,a,8,o,f,c)}function ot(t,e,r,n,a,o,f,c){X(t,e+4*a,a,1,8,o,f,c),X(r,n+4*a,a,1,8,o,f,c)}function ft(t,e,r,n,a,o,f,c){X(t,e+4,1,a,8,o,f,c),X(r,n+4,1,a,8,o,f,c)}function ct(t,e){return e==Fr?0==t.i?0==t.d?Kr:qr:0==t.d?zr:Fr:e}function it(t,e,r,a){for(n=0;n<4;++n)t[e+n]=r[a+n]}function ut(t,e){return t<0?0:t>e?e:t}function bt(t){t.a="VP8_STATUS_OK",t.xc="OK"}function st(t){t>>>8!=Ve>>>8&&alert("mismatch error")}function lt(t,e,r){return t.a==ze&&(t.a=e,t.xc=r,t.za=0),0}function ht(t,a){let c=[0],i=0;var u=[0],b=f(fn),s=f(cn);let l=f(nr);if(u="VP8StatusCode",b=f(rr),t==o)return alert("(dec == null)"),0;if(bt(t),a==o)return lt(t,"VP8_STATUS_INVALID_PARAM","null VP8Io passed to VP8GetHeaders()");if(b.data=a.data,b.b=a.b,b.e=a.e,b.b=[b.b],b.e=[b.e],(u=ye(b=[b]))!=ze)return lt(t,u,"Incorrect/incomplete header.");if((b=b[0]).b=b.b[0],b.e=b.e[0],b.ia)return lt(t,Je,"Unexpected lossless format encountered.");if(t.Ga==o&&(g(0==t.ub),t.Ga=b.$,t.G=b.G,t.ub=b.pa),i=b.data,c=b.b+b.offset,u=b.e-b.offset,g(b.e>=b.offset),u[0]<4)return lt(t,$e,"Truncated header.");if(l=i[c+0]|i[c+1]<<8|i[c+2]<<16,(b=t.Ac).fb=!(1&l)+0,b.Jc=l>>1&7,b.Nc=l>>4&1,b.Ra=l>>5,b.Jc>3)return lt(t,"VP8_STATUS_BITSTREAM_ERROR","Incorrect keyframe parameters.");if(!b.Nc)return lt(t,"VP8_STATUS_UNSUPPORTED_FEATURE","Frame not displayable.");if(c+=3,u-=3,s=t.P,b.fb){if(u<7)return lt(t,"VP8_STATUS_NOT_ENOUGH_DATA","cannot parse picture header");if(!(u>=3&&157==i[c+0]&&1==i[c+1]&&42==i[c+2]))return lt(t,"VP8_STATUS_BITSTREAM_ERROR","Bad code word");for(s.l=16383&(i[c+4]<<8|i[c+3]),s.gd=i[c+4]>>6,s.v=16383&(i[c+6]<<8|i[c+5]),s.hd=i[c+6]>>6,c+=7,u-=7,t.Ma=s.l+15>>4,t.hb=s.v+15>>4,a.width=s.l,a.height=s.v,a.I=0,a.Ua=0,a.k=0,a.t=0,a.Ka=a.width,a.K=a.height,a.m=a.width,a.h=a.height,l=t.R,n=0;nu)return lt(t,"VP8_STATUS_NOT_ENOUGH_DATA","bad partition length");l=t.o,P(l,i,c,c+b.Ra),c+=b.Ra,u-=b.Ra,b.fb&&(s.uc=e(l),s.$c=e(l)),s=l;var h=t.Ca;let d=t.R;if(g(s!=o),g(h!=o),h.pb=e(s),h.pb){if(h.ob=e(s),e(s)){var v;for(h.tb=e(s),v=0;v0)if(t.Ca.pb)for(d=0;du&&(w=s),P(t.ic[+m],d,v,y),d=w,v=y,h+=3}P(t.ic[+p],d,v,u),u=v0){t.yb[w]=t.yb[0];continue}y=u}const e=t.yb[w];e.sc[0]=oa[ut(y+s,127)],e.sc[1]=fa[ut(y+0,127)],e.sb[0]=2*oa[ut(y+h,127)],e.sb[1]=101581*fa[ut(y+d,127)]>>16,e.sb[1]<8&&(e.sb[1]=8),e.qc[0]=oa[ut(y+v,117)],e.qc[1]=fa[ut(y+p,127)]}if(!b.fb)return lt(t,Ye,"Not a key frame.");for(t.Zc=259,e(l),u=t.R,s=0;s<$r;++s)for(h=0;h0)+0],16==o||!r(t,c[0]))return o}else c=e[sa[o]][0];if(16==o)return 16}}function vt(t,e){return((16777216*t[0]+65536*t[1]+256*t[2]+1*t[3])*pa&4278190080)>>e}function pt(t,e){let a,f=0;if(t==o)return 0;if(e==o)return lt(t,"VP8_STATUS_INVALID_PARAM","NULL VP8Io parameter in VP8Decode().");if(!t.za&&!ht(t,e))return 0;if(g(t.za),e.Mb&&!e.Mb(e))lt(t,Qe,"Frame setup failed"),a=t.a;else{e.Za&&(t.A=0);const r=ea[t.A];2==t.A?(t.lb=0,t.mb=0):(t.lb=e.t-r>>4,t.mb=e.k-r>>4,t.lb<0&&(t.lb=0),t.mb<0&&(t.mb=0)),t.Ya=e.K+15+r>>4,t.wb=e.Ka+15+r>>4,t.wb>t.Ma&&(t.wb=t.Ma),t.Ya>t.hb&&(t.Ya=t.hb),a=ze}if(f=a==ze){if(f){let r,n;t:{if(t.Ja=0,t.qb){const e=t.rc;if(!WebPWorkerReset(e)){r=lt(t,qe,"thread initialization failed.");break t}e.Qd=t,e.Rd=t.oa.N,e.Ud=FinishRow,t.jb=t.A>0?ra:ra-1}else t.jb=na;r=1}if(!(n=!r)){let e;t:{const r=t.jb,n=t.Ma,a=4*n,f=32*n,c=n+1,i=t.A>0?n*(t.qb?2:1):0,s=rn,l=f*(16*r+parseInt(3*ea[t.A]/2,10)),h=t.Ga!=o?t.P.l*t.P.v:0,v=a+f+c+i+s+384+l+h+ta;if(v!=v)e=0;else{if(v>t.Gb){if(t.ib=0,t.Gb=0,t.ib==o){e=lt(t,"VP8_STATUS_OUT_OF_MEMORY","no memory during frame initialization.");break t}t.Gb=v}t.dc=205,t.Xc=b(205,16*n),t.Sc=b(205,8*n),t.Vc=b(205,8*n),t.M=i?u(ln,i):o,t.Sd=i?0:o,t.oa.ha=0,t.oa.M=t.M,g(0==(s&ta)),t.Ea=b(205,1*s),t.z=-12851,t.H=16*n,t.r=8*n;const f=ea[t.A],p=f*t.H,P=f/2*t.r;t.ca=d(l,205),t.da=+p,t.aa=t.ca,t.ba=t.da+16*r*t.H+P,t.ra=t.aa,t.sa=t.ba+8*r*t.r+P,t.Xb=h?d(h,0):o,t.La=u(hn,c),t.dc=b(Fr,a),e=1}}n=!e}if(n)f=0;else{if(e.width=t.P.l,e.height=t.P.v,e.w=0,e.y=t.ca,e.D=t.da,e.c=t.aa,e.B=t.ba,e.S=t.ra,e.C=t.sa,e.F=t.H,e.Da=t.r,e.p=o,e.q=o,!Un){let t;for(t=-255;t<=255;++t)On[255+t]=t<0?-t:t,Vn[255+t]=On[255+t]>>1;for(t=-1020;t<=1020;++t)In[1020+t]=t<-128?-128:t>127?127:t;for(t=-112;t<=112;++t)_n[112+t]=t<-16?-16:t>15?15:t;for(t=-255;t<=510;++t)Wn[255+t]=t<0?0:t>255?255:t;Un=1}Cn=D,Fn=E,Gn=C,Nn=F,Ln=Z,Hn=tt,zn=nt,qn=at,Kn=et,Jn=rt,Yn=ot,xn=ft,Qn=J,$n=Y,Xn=x,Zn=Q,f=1}}if(f)t:{for(t.d=0;t.d0&&u.d>=u.mb&&u.d<=u.Ya)+0,t.i=0;t.i0);A=-k,W[W[W.length-1]+P]=A,h[v]=A,v++}D[p]=A}}else{for(A=r(u,156)?r(u,128)?Hr:Lr:r(u,163)?Nr:Gr,e.Eb[0]=A,k=0;k<4;++k)W[k+W[W.length-1]]=A;for(k=0;k<4;++k)D[k]=A}if(e.Tc=r(u,142)?r(u,114)?r(u,183)?Hr:Lr:Nr:Gr,u.Ab)s=0;else{if(g.Nb)l.X=g.X=0,e.wa||(l.ua=g.ua=0),e.ja=0,e.Oa=0;else{let t=0,r=0;var m=0,w=da;const n=e.yb[e.Lb];var y=e.z;const a=e.La[0],f=d(4,0),c=d(4,0);let u=d(4,0),s=d(4,0),l=0,h=0;var S=0;let v=0,p=0;if(y=b(0,384),e.wa)m=0,w=e.R.z[3];else{const t=d(16,0);var T=g.ua+a.ua;g.ua=a.ua=(dt(o,e.R.z[1],T,n.sb,0,t)>0)+0,m=1,w=e.R.z[0];var R=t,O=y,V=d(16,0),I=0;for(I=0;I<4;++I){var _=R[0+I]+R[12+I],U=R[4+I]+R[8+I],M=R[4+I]-R[8+I],B=R[0+I]-R[12+I];V[0+I]=_+U,V[8+I]=_-U,V[4+I]=B+M,V[12+I]=B-M}for(I=0;I<4;++I){const t=O[O.length-1],e=V[0+4*I]+3;_=e+V[3+4*I],U=V[1+4*I]+V[2+4*I],M=V[1+4*I]-V[2+4*I],B=e-V[3+4*I],O[t+0]=_+U>>3,O[t+16]=B+M>>3,O[t+32]=_-U>>3,O[t+48]=B-M>>3,O[O.length-1]+=64}y[y.length-1]=0}for(u=i(va[15&g.X]),s=i(va[15&a.X]),v=0;v<4;++v){var j=s[v];for(S=0;S<4;++S){var G=dt(o,w,T=j+u[S],n.sc,m,y);u[S]=j=(G>0)+0,c[S]=(0!=y[y[y.length-1]+0])+0,f[S]=(G>1)+0,y[y.length-1]+=16}s[v]=j,h|=vt(c,24-4*v),l|=vt(f,24-4*v)}for(t=vt(u,24),r=vt(s,24),u=i(va[g.X>>4]),s=i(va[a.X>>4]),p=0;p<4;p+=2){for(v=0;v<2;++v){for(j=s[p+v],S=0;S<2;++S)T=j+u[p+S],G=dt(o,e.R.z[2],T,n.qc,0,y),u[p+S]=j=(G>0)+0,c[2*v+S]=(0!=y[y[y.length-1]+0])+0,f[2*v+S]=(G>1)+0,y[y.length-1]+=16;s[p+v]=j}h|=vt(c,8-2*p),l|=vt(f,8-2*p)}t|=vt(u,20),r|=vt(s,20),g.X=t,a.X=r,e.z=y,e.Oa=l+0,e.ja=l|h,g.Nb=!e.ja+0}s=!o.Ab}if(!s){f=lt(t,"VP8_STATUS_NOT_ENOUGH_DATA",`Premature end-of-file encountered.${t.i} ${t.d}`);break t}const E=t,C=E.Ea,F=nn,J=E.Ea,Y=an,x=E.Ea,Q=on;if(E.i>0){var N=0;for(N=-1;N<16;++N)it(C,F+N*en-4,C,F+N*en+12);for(N=-1;N<8;++N)it(J,Y+N*en-4,J,Y+N*en+4),it(x,Q+N*en-4,x,Q+N*en+4)}else{for(N=0;N<16;++N)C[F+N*en-1]=129;for(N=0;N<8;++N)J[Y+N*en-1]=129,x[Q+N*en-1]=129;E.d>0&&(C[F-1-en]=J[Y-1-en]=x[Q-1-en]=129)}const Z=E.Xc,tt=16*+E.i,et=E.Sc,rt=8*+E.i,nt=E.Vc,at=8*+E.i,ot=E.z;let ft=0;if(E.d>0)c(C,F-en,Z,tt,16),c(J,Y-en,et,rt,8),c(x,Q-en,nt,at,8);else if(0==E.i){for(n=0;n<21;++n)C[F-en-1+n]=127;for(n=0;n<9;++n)J[Y-en-1+n]=127;for(n=0;n<9;++n)x[Q-en-1+n]=127}if(E.wa){const t=F-en+16;E.d>0&&(E.i>=E.Ma-1?C[t+0]=C[t+1]=C[t+2]=C[t+3]=Z[tt+15]:c(C,t+0,Z,tt+16,4));for(let e=0;e<4;++e)C[e+t+4*en]=C[e+t+4*en]=C[e+t+8*en]=C[e+t+12*en]=C[e+t+0];for(ft=0;ft<16;ft++){var L=C,H=F+aa[ft];Dn[E.Eb[ft]](L,H),E.Oa&1<0){const t=ht.M[1+ht.i],e=ht.La[1+ht.i].Nb;let r=ht.Zb[ht.Lb];ht.ga.oc&&(r+=ht.ga.Lc[0],ht.wa&&(r+=ht.ga.Gc[0])),r=r<0?0:r>63?63:r,t.zc=r,ht.ga.kb>0&&(r=ht.ga.kb>4?r>>2:r>>1,r>9-ht.ga.kb&&(r=9-ht.ga.kb)),t.yc=r<1?1:r,t.ab=(!e||ht.wa)+0}var K=0,$=8*ht.Ja*ht.r,X=ht.ca,ut=ht.da+16*ht.i+16*ht.Ja*ht.H,bt=ht.aa,st=ht.ba+8*ht.i+$,pt=ht.ra,Pt=ht.sa+8*ht.i+$;for(K=0;K<16;++K)c(X,ut+K*ht.H,ht.Ea,+nn+K*en,16);for(K=0;K<8;++K)c(bt,st+K*ht.r,ht.Ea,+an+K*en,8),c(pt,Pt+K*ht.r,ht.Ea,+on+K*en,8)}const E=t,C=e;var At=1;const F=E.oa;if(E.qb){const t=E.rc;if(At&=WebPWorkerSync(t),g(t.a==OK),At){if(F.N=C,F.ha=E.Ja,F.d=E.d,F.W=E.W,F.W){const t=F.M;F.M=E.M,E.M=t}WebPWorkerLaunch(t),++E.Ja==E.jb&&(E.Ja=0)}}else{F.d=E.d,F.W=E.W;e:{let t=1;const e=E.oa,r=ea[E.A],n=r*E.H,a=parseInt(r/2)*E.r,f=16*e.ha*E.H,i=8*e.ha*E.r,u=E.ca,b=E.da-n+f,s=E.aa,l=E.ba-a+i,h=E.ra,d=E.sa-a+i,v=0==e.d,p=(e.d>=E.hb-1)+0;var kt=16*e.d;let P=16*(e.d+1);if(e.W){const t=E;let e=0;const r=t.oa.d;for(g(t.oa.W),e=t.lb;e0&&$n(u,b,c,h+4),i.ab&&Zn(u,b,c,h),o>0&&Qn(u,b,c,h+4),i.ab&&Xn(u,b,c,h);else{const t=n.r,e=n.aa,r=n.ba+8*f.ha*t+8*a,d=n.ra,v=n.sa+8*f.ha*t+8*a,p=n.Ac.fb?s>=40?2:s>=15?1:0:s>=40?3:s>=20?2:s>=15?1:0;a>0&&(Hn(u,b,c,h+4,l,p),qn(e,r,d,v,t,h+4,l,p)),i.ab&&(Jn(u,b,c,h,l,p),xn(e,r,d,v,t,h,l,p)),o>0&&(Ln(u,b,c,h+4,l,p),zn(e,r,d,v,t,h+4,l,p)),i.ab&&(Kn(u,b,c,h,l,p),Yn(e,r,d,v,t,h,l,p))}}}if(C.put){if(v?(C.y=E.ca,C.D=E.da+f,C.c=E.aa,C.B=E.ba+i,C.S=E.ra,C.C=E.sa+i):(kt-=r,C.y=u,C.D=b,C.c=s,C.B=l,C.S=h,C.C=d),p||(P-=r),P>C.K&&(P=C.K),E.Ga!=o&&kt>1),C.C+=E.r*(t>>1),C.p!=o&&(C.q+=C.width*t)}kt>1,C.C+=C.t>>1,C.p!=o&&(C.q+=C.t),C.w=kt-C.k,C.m=C.Ka-C.t,C.h=P-kt,t=C.put(C))}e.ha+1==E.jb&&!p&&(c(E.ca,E.da-n,u,b+16*E.H,n),c(E.aa,E.ba-a,s,l+8*E.r,a),c(E.ra,E.sa-a,h,d+8*E.r,a)),At=t}}if(!At){f=lt(t,"VP8_STATUS_USER_ABORT","Output aborted.");break t}}let a;if(!(a=t.qb&&!WebPWorkerSync(t.rc))){let e;(e=t.fc>0)&&(g(t),g(t.fc>0),e=!1),a=e}f=a?0:1}const a=f;e.Pb&&e.Pb(e),f=1&a}return f?(t.za=0,f):(gt(t),0)}function gt(t){t!=o&&(t.ib&&(t.ib=0),t.ib=o,t.Gb=0,t.za=0)}function Pt(t,e){return t+(1<>e}function At(t,e,r,n,a){const o=Ga[r]+Na[e]>>ga;e=Fa[e],n[a+0]=La[t+Ca[r]-Pa],n[a+1]=La[t+o-Pa],n[a+2]=La[t+e-Pa]}function kt(t,e,r,n,a){const o=Ga[r]+Na[e]>>ga;e=Fa[e],n[a+0]=248&La[t+Ca[r]-Pa]|La[t+o-Pa]>>5,n[a+1]=La[t+o-Pa]<<3&224|La[t+e-Pa]>>3}function mt(t,e,r,n,a){n[a+0]=255,At(t,e,r,n,a+1)}function wt(t,e,r,n,a){const o=Fa[e];n[a+0]=Ha[t+Ca[r]-Pa]<<4|Ha[t+(Ga[r]+Na[e]>>ga)-Pa],n[a+1]=15|Ha[t+o-Pa]<<4}function yt(t,e,r,n,a){const o=Ca[r];r=Ga[r]+Na[e]>>ga,n[a+0]=La[t+Fa[e]-Pa],n[a+1]=La[t+r-Pa],n[a+2]=La[t+o-Pa]}function St(t,e,r,n,a){yt(t,e,r,n,a),n[a+3]=255}function Tt(t,e,r,n,a){At(t,e,r,n,a),n[a+3]=255}function Rt(t,e,r){t[e]=((((4278255360&t[e])>>>0)+((4278255360&r)>>>0)&4278255360)>>>0|(16711935&t[e])+(16711935&r)&16711935)>>>0}function Ot(t,e){return((4278124286&(t^e))>>>1)+((t&e)>>>0)>>>0}function Vt(t){return t<256&&t>0?t:t<=0?0:~t>>24&255}function It(t,e){return Vt(t+parseInt((t-e)/2,10))}function _t(){return dr}function Wt(t,e){return(t&=255)>127&&(t-=256),(e&=255)>127&&(e-=256),t*e>>>5}function Ut(t,e,r,n,a,o,f){var c=0;const i=8>>t.n,u=t.U,b=t.u;if(i<8){t=(1<>8&255),o[f++]=b[e&s],e>>=i}}else for(c=e;c>8&255]}function Mt(t,e,r,n,a){for(r=e+r;e>16&255,n[a++]=r>>8&255,n[a++]=r>>0&255,n[a++]=r>>24&255}}function Bt(t,e,r,n,a){for(r=e+r;e>16&240|r>>12&15,n[a++]=r>>0&240|r>>28&15}}function Dt(t,e,r,n,a){for(r=e+r;e>24&255,n[a++]=r>>16&255,n[a++]=r>>8&255,n[a++]=r>>0&255}}function Et(t,e,r,n){return S(t,8)!=ir?0:(e[0]=S(t,ur)+1,r[0]=S(t,ur)+1,n[0]=S(t,1),S(t,br),1)}function jt(t,e){let r=0;return t<4?t+1:(r=t-2>>1,(2+(1&t)<e.ya){var r=t.Y,n=0;for(g(r!=o);0!=r[n].s;){var a=r,f=e;const t=f.T>>f.g&1;f.L?f.fa=1:(++f.g,f.g>=8&&w(f),f.Q==f.ya&&32==f.g&&(f.L=1)),n=n+a[n].s+t}return r[n].kc}for(n=0,g((r=t.Y)!=o);0!=r[n].s;)a=r,f=e.T>>e.g&1,++e.g,n=n+a[n].s+f;return r[n].kc}function Ft(t,e){if(t!=o){var r=0,n=0;for(r=0;r>t.eb)+(e>>t.eb)])0;){e=t.nc[a];let O=i;var h=b,d=l;switch(l=n,b=r,g(O<(v=u)),g(v<=e.Vb),e.Qc){case wr:for(h=0,e=b+(v-O)*e.U;b>8&255,P=16711935&(P=(P=(16711935&v[d])>>>0)+(p<<16|p));l[b++]=((4278255360&v[d])>>>0|P)>>>0,32==O&&h++}break;case kr:var A=O;if(h=v,d=l,p=b,P=(S=e).U,0==A){var k=0;for(Rt(d,p,dr),k=1;k>S.n)*w;A>8&15],k=1;k>8&15]),e=t(d[p+k-1],d,p+k-P),Rt(d,p+k,e)}p+=P,0==(++A&m)&&(S+=w)}v!=e.Vb&&c(l,b-(e=e.U),l,b+(v-O-1)*e,e);break;case mr:for(h=e.U,d=(1<>e.n)*p;O>0&255,S.Bc=y>>8&255,S.Kc=y>>16&255),S=(y=l[b+w])>>>8,T=y>>>16,R=y,T+=Wt(m.Cc,S),T&=255,R+=Wt(m.Bc,S),R+=Wt(m.Kc,T),R&=255,l[b+w]=(4278255360&y|T<<16|R)>>>0;b+=h,++O,0==(O&d)&&(e+=p)}break;case yr:h==l&&e.n>0?(h=(v-O)*Pt(e.U,e.n),s(l,d=b+(v-O)*e.U-h,l,b,h),Ut(e,O,v,l,d,l,b)):Ut(e,O,v,h,d,l,b)}b=n,l=r}}function Lt(t,e){var r=t.V,n=t.Ha+t.l*t.O;if(!((o=e-t.O)<=0)){Nt(t,o,r,n);var a=t.N;r=t.Xa;let l=[t.vb];n=t.O;var o=e,f=l,c=a.width;if(g(na.K&&(o=a.K),n=o?n=0:(f[0]+=a.t,a.w=n-a.k,a.m=a.Ka-a.t,a.h=o-n,n=1),n){if(l=l[0],n=t.Ib,o=a.width,n.J0;){const t=r;let n=l,a=i;const b=f;let h=e;switch(c){case Ie:for(a=n+a;n>16&255,b[h++]=s>>8&255,b[h++]=s>>0&255}break;case _e:Mt(t,n,a,b,h);break;case Ee:Mt(t,n,a,b,h),WebPApplyAlphaMultiply(b,0,a,1,0);break;case We:for(a=n+a;n>0&255,b[h++]=s>>8&255,b[h++]=s>>16&255;break;case Ue:Dt(t,n,a,b,h);break;case je:Dt(t,n,a,b,h),WebPApplyAlphaMultiply(b,0,a,1,0);break;case Me:Dt(t,n,a,b,h);break;case Ce:Dt(t,n,a,b,h),WebPApplyAlphaMultiply(b,1,a,1,0);break;case Be:Bt(t,n,a,b,h);break;case Fe:Bt(t,n,a,b,h),WebPApplyAlphaMultiply4444(b,a,1,0);break;case De:for(a=n+a;n>16&248|s>>13&7,b[h++]=s>>5&224|s>>3&31;break;default:g(0)}l+=o,e+=u}r=a}t.xa+=r}else t.xa=a.I?EmitRescaledRowsYUVA(t,r,l,o,a.h):EmitRowsYUVA(t,r,l,o,a.m,a.h);g(t.xa<=n.height)}t.O=e,g(t.O<=t.v)}}function Ht(t,e,r,n,a,f){let c=1,i=0,u=0;const b=t.o,s=t.cb;let l=s.Db,h=r,d=r;r+=n*a;const v=(a=gr+Pr)+s.xb,p=s.xb>0?s.Yb:o,P=s.Dc;let A=!1;for(g(l!=o);!b.L&&h>>0)+(A<<16)+(c<<8)+k}if(A=!1,++h,++i,i>=n&&(i=0,++u,f!=o&&u%wa==0&&f(t,u),p!=o))for(;d>>p.bb]=c}else if(wDa?k-=Da:(w=Ea[k-1],w=(w>>4)*n+(8-(15&w)),k=w>=1?w:1),w=0,w=0;w=n;)i-=n,++u,f!=o&&u%wa==0&&f(t,u);if(h>>p.bb]=c}else if(w>>p.bb]=w;w=e,k=h,g(A<=-1>>>(m=p).bb),w[k]=m.ea[A],A=!0;continue}(c=!b.fa)||End}return f!=o&&f(t,u),b.fa||!c||b.L&&h16?0:h>4?1:h>2?2:3,l[0]=Pt(c.U,p),c.n=p,l=p=Jt(h,1,0,_,c.u))if(l=h,p=0,h=1<<(8>>>(_=c).n)>>>0,(P=Array(h))==o)l=0;else{A=_.u[0];var k=_.b;for(P[0]=_.u[0][_.b+0],p=1;p>>0)+((4278255360&P[p-1])>>>0)&4278255360)>>>0|(16711935&A[k+p])+(16711935&P[p-1])&16711935)>>>0;for(;p=1&&s<=lr)){n.a=Je;break}if(c)t:{c=n;var m=t[0],w=e[0],_=(l=s,k=A=0,k=c.o,c.cb);if(p=[o],h=o,P=1,r&&S(k,1)){if(w=(m=Pt(m,A=S(k,3)+2))*(W=Pt(w,A)),!Jt(m,W,0,c,p)){c.a=Je,Ft(h,P),c=0;break t}for(p=p[0],_.eb=A,A=0;A>>8&65535,p[A]=m,m>=P&&(P=m+1)}if(k.fa)Ft(h,P),c=0;else if(g(P<=65536),(h=v(P,mn))==o)c.a=qe,Ft(h,P),c=0;else{for(A=0;A0&&(m+=1<=t){(E=E&&T(e))||O(e),U=E;break r}if(!V(e,M[j],B[j],D[j])){(E=E&&T(e))||O(e),U=E;break r}}(E=(E=1)&&T(e))||O(e),U=E}else U=0}}else{if(U=0,B=[],(M=S(W,4)+4)>Ma){m.a=Je,m=0;break e}if((D=Array(t))==o){m.a=qe,m=0;break e}for(U=0;UB){U.a=Je,O(a),U=E;break r}}else r=B;for(e=0;eB){U.a=Je,O(a),U=E;break r}for(C=C?n:0;F-- >0;)M[e++]=C}}E=1,O(a),U=E}else U.a=Je,U=0}U&&(U=I(e,D,t))}(U=U&&!W.fa)?m=1:(m.a=Je,m=0)}if(!m){Ft(h,P),c=0;break t}}_.ac=p,_.hc=P,_.Db=h,c=1}}if(!c){n.a=Je;break}if(s>0){if(u.xb=1<0),l.ea=d(_,0),l.ea==o?s=0:(l.bb=32-s,s=1),!s){n.a=qe,c=0;break}}else u.xb=0;if(s=n,l=t[0],_=e[0],h=(p=s.cb).eb,s.l=l,s.v=_,p.Ec=Pt(l,h),p.Dc=0==h?-1:(1<>>8&255;t.O=t.xa=e}}function ut(t,e){return t<0?0:t>e?e:t}function Qt(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p,g,P){let A;const k=p-1>>1;let m=a[o+0]|f[c+0]<<16,w=i[u+0]|b[s+0]<<16;if(t){var y=3*m+w+131074>>2;g(t[e+0],255&y,y>>16,l,h)}for(r&&(y=3*w+m+131074>>2,g(r[n+0],255&y,y>>16,d,v)),A=1;A<=k;++A){const p=a[o+A]|f[c+A]<<16,k=i[u+A]|b[s+A]<<16,S=(y=m+p+w+k+524296)+2*(p+w)>>3,T=y+2*(m+k)>>3;t&&(y=S+m>>1,m=T+p>>1,g(t[e+2*A-1],255&y,y>>16,l,h+(2*A-1)*P),g(t[e+2*A-0],255&m,m>>16,l,h+(2*A-0)*P)),r&&(y=T+w>>1,m=S+k>>1,g(r[n+2*A-1],255&y,y>>16,d,v+(2*A-1)*P),g(r[n+2*A+0],255&m,m>>16,d,v+(2*A+0)*P)),m=p,w=k}1&p||(t&&(y=3*m+w+131074>>2,g(t[e+p-1],255&y,y>>16,l,h+(p-1)*P)),r&&(y=3*w+m+131074>>2,g(r[n+p-1],255&y,y>>16,d,v+(p-1)*P)))}function $t(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p){Qt(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p,At,3)}function Xt(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p){Qt(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p,yt,3)}function Zt(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p){Qt(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p,Tt,4)}function te(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p){Qt(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p,St,4)}function ee(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p){Qt(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p,mt,4)}function re(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p){Qt(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p,wt,2)}function ne(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p){Qt(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p,kt,2)}function ae(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d){let v;for(v=0;v0;){var f=t,c=e+(r?1:0),i=t,u=e+(r?0:3),b=0;for(b=0;b>1)*r.nb,i=r.S,u=r.C+(t.w>>1)*r.rb,b=t.m,s=t.h,l=parseInt((b+1)/2,10),h=parseInt((s+1)/2,10);let d;for(d=0;d>4;b[s+2*h]=240&b[s+2*h]|t,l&=t}a+=e.width,s+=i.f}15!=l&&t(c)&&WebPApplyAlphaMultiply4444(b,f,o,u,i.f)}return 0}function ge(e){let r=e.ka;const n=r.j.J,a=n>1,n=e.m+2*t;let a;const f=[];for(a=0;a>ga,Na[e]=-22014*(e-128)+ja,Ga[e]=-45773*(e-128),Fa[e]=113618*(e-128)+ja>>ga;for(e=Pa;e>ga,La[e-Pa]=ut(r,255),Ha[e-Pa]=ut(r+8>>4,15);za=1}return 1}function Pe(t){const e=t.ka;let r=t.m;const n=t.h;return g(!(1&t.w)),r<=0||n<=0?0:(r=e.$a(t,e),e.ec+=r,e.zb&&e.zb(t,e),1)}function Ae(t){(t=t.ka).memory="",t.memory=o}function ke(t,e){return t[e+0]|t[e+1]<<8|t[e+2]<<16}function me(t,e){return(ke(t,e)|t[e+3]<<24)>>>0}function we(t,e,r,n,a,c,i){var u=0,b=[0],s="VP8StatusCode";const l=f(rr);if(t==o||r[0]<_r)return $e;l.data=t,l.b=[e[0]],l.e=[r[0]],l.na=[l.na];t:{if(u=l.na,g(t!=o),g(r!=o),g(u!=o),u[0]=0,r[0]>=_r&&!h(t,e[0],"RIFF",Vr)){if(h(t,e[0]+8,"WEBP",Vr)){s=Je;break t}if((P=me(t,e[0]+Vr))0,P=[0];t:if(s=Ir+Wr,g(t!=o),g(r!=o),g(b!=o),b[0]=0,r[0]=Mr){s=Je;break t}P!=o&&(P[0]=p),n!=o&&(n[0]=d),a!=o&&(a[0]=v),e[0]+=s,r[0]-=s,b[0]=1}s=ze}if(s!=ze)return s;if(!u&&b[0])return Je;if(c!=o&&(c[0]=!!(P[0]&Ur)),b&&i==o)return ze;if(r0&&n>b){s=Je;break t}if(p=d&&v>b-d){s=Je;break t}u[0]=v,e[0]+=Ir,r[0]-=Ir,P[0]=s}else P[0]=r>=1&&t[e+0]==ir,u[0]=r[0];s=ze}if(l.ta=l.ta[0],l.ia=l.ia[0],s!=ze)return s;if(l.ta>Br)return Je;if(l.ia){if(r[0]=3&&157==t[b+3+0]&&1==t[b+3+1]&&42==t[b+3+2]?(u=t[b+0]|t[b+1]<<8|t[b+2]<<16,P=16383&(t[b+7]<<8|t[b+6]),t=16383&(t[b+9]<<8|t[b+8]),!(!(1&u)+0)||(u>>1&7)>3||!(u>>4&1)||u>>5>=l.ta?t=0:(n&&(n[0]=P),a&&(a[0]=t),t=1)):t=0}return t?(c!=o&&(c[0]|=l.$!=o),i!=o&&(i[0]=l,i[0].offset=e[0]-i[0].b,g(e[0]-i[0].b0,e.Ua&&(i=t.wc,u=t.vc,f=t.t,c=t.k,rn||c+u>a))return 0;if(e.t=f,e.k=c,e.Ka=f+i,e.K=c+u,e.m=i,e.h=u,e.I=t!=o&&t.I>0,e.I){if(t.Ba<=0||t.Aa<=0)return 0;e.Ba=t.Ba,e.Aa=t.Aa}return e.Za=t&&t.Za,e.Bb=t==o||!t.ed,e.I&&(e.Za=e.Ba<3*n/4&&e.Aa<3*a/4,e.Bb=0),1}var Ve=512,Ie=0,_e=1,We=2,Ue=3,Me=4,Be=5,De=6,Ee=7,je=8,Ce=9,Fe=10,Ge=11,Ne=12,Le=13;this.WEBP_CSP_MODE=this.Cd={nd:0,od:1,kd:2,ld:3,jd:4,pd:5,qd:6,rd:7,sd:8,md:9};var He={J:"WEBP_CSP_MODE",width:0,height:0,Fc:0,c:{RGBA:{ma:0,Sa:0,f:0,size:0},Va:{y:0,c:0,S:0,p:0,D:0,B:0,C:0,q:0,F:0,nb:0,rb:0,Fa:0,Wc:0,Rc:0,Uc:0,Wb:0}},Ic:d(4,0),Jb:o,jc:0},ze=0,qe=1,Ke=2,Je=3,Ye=4,xe=5,Qe=6,$e=7;this.VP8StatusCode=this.td={xd:0,yd:1,vd:2,ud:3,Ad:4,zd:5,Bd:6,wd:7};var Xe={width:{value:0},height:{value:0},$b:{value:0},tc:0,Yd:0,rotate:0,be:0,Ic:d(3,0)};this.WebPGetFeatures=this.Md=function(t,e,r){let n="VP8StatusCode";return Ve>>>8!=Ve>>>8||r==o?t=Ke:(n=Re(t,[0],e=[e],r),t=n==$e?Je:n),t};const Ze={Za:0,ed:0,Ua:0,t:0,k:0,wc:0,vc:0,I:0,Ba:0,Aa:0,ae:0,Td:0,Xd:0,Ic:d(6,0)};this.WebPDecoderConfig=this.Kd={input:f(Xe),j:f(He),options:f(Ze)},this.WebPInitDecoderConfig=this.Nd=function(t){return Ve>>>8!=Ve>>>8||t==o?t=0:(g((t=t.input)!=o),t.tc=0,t=1),t};var tr={width:0,height:0,w:0,m:0,h:0,y:0,c:0,S:0,D:0,B:0,C:0,F:0,Da:0,ka:0,put:0,Mb:0,Pb:0,Bb:0,e:0,data:0,b:0,Za:0,Ua:0,t:0,Ka:0,k:0,K:0,I:0,Ba:0,Aa:0,p:0,q:0},er={j:f(He),Sb:0,Qb:0,lc:0,Tb:0,Rb:0,mc:0,ec:0,Qa:f(Ze),memory:0,$a:"(OutputFunc)",zb:"(OutputFunc)",ad:"(OutputRowFunc)"},rr={data:0,b:0,e:0,offset:0,$:o,G:0,pa:0,ta:0,na:0,ia:0},nr={qa:0,Ia:o,Pd:0,Ab:0,la:0,Z:0,gc:0},ar={T:0,qa:0,Ia:0,ya:0,Q:0,g:0,L:0,fa:0},or=25,fr=[0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535,131071,262143,524287,1048575,2097151,4194303,8388607,16777215],cr=10,ir=47,ur=14,br=3,sr=5,lr=11,hr=5,dr=4278190080,vr=8,pr=15,gr=256,Pr=24,Ar=4,kr=0,mr=1,wr=2,yr=3,Sr=1,Tr=0,Rr=1,Or=1,Vr=4,Ir=8,_r=12,Wr=10,Ur=16,Mr=1*Math.pow(2,32),Br=-1-Ir-1>>>0,Dr={kc:0,s:0},Er={Y:"HuffmanTreeNode*",gb:0,Pa:0},jr=-1;var Cr=506832829,Fr=0,Gr=Fr,Nr=2,Lr=3,Hr=1,zr=4,qr=5,Kr=6,Jr=3,Yr=4,xr=4,Qr=4,$r=4,Xr=8,Zr=3,tn=11,en=32,rn=17*en+9*en,nn=1*en+8,an=nn+16*en+en,on=an+16,fn={fb:0,Jc:0,Nc:0,Ra:0},cn={l:0,v:0,gd:0,hd:0,uc:0,$c:0};const un={pb:0,ob:0,tb:0,Kb:d(Yr,0),Cb:d(Yr,0)},bn={Ta:d(Jr,0),z:p([$r,Xr,Zr,tn],0)},sn={Oc:0,Fb:0,kb:0,oc:0,Lc:d(xr,0),Gc:d(xr,0)};var ln={zc:0,yc:0,ab:0},hn={X:0,ua:0,Nb:0};const dn=d(2,0),vn={sc:f(dn),sb:f(dn),qc:f(dn)},pn={ha:0,d:0,W:0,M:ln,N:tr};var gn={a:"VP8StatusCode",za:0,xc:0,o:f(nr),Ac:f(fn),P:f(cn),ga:f(sn),Ca:f(un),rc:"WebPWorker",qb:0,Ja:0,jb:0,oa:pn,Ma:0,hb:0,lb:0,mb:0,wb:0,Ya:0,Hb:0,ic:v(8,nr),Zc:0,yb:v(Yr,vn),R:f(bn),pc:0,Pc:0,dc:0,cc:d(4,0),Xc:0,Sc:0,Vc:0,La:f(hn),M:f(ln),Ea:0,z:0,ca:0,aa:0,ra:0,da:0,ba:0,sa:0,H:0,r:0,ib:0,Gb:0,i:0,d:0,wa:0,Eb:d(16,0),Vd:0,Tc:0,Lb:0,ja:0,Oa:0,A:0,W:0,Zb:d(Yr,0),Ga:o,G:0,ub:0,Xb:0,Od:0,cd:0,dd:0,Wd:0,fc:0},Pn=0,An=1,kn=2;var mn={va:v(hr,Er)};const wn={xb:0,Yb:f({ea:0,bb:0}),Dc:0,eb:0,Ec:0,ac:0,bd:0,hc:0,Db:"HTreeGroup"};var yn={a:"VP8StatusCode",Wa:"VP8LDecodeState",Ob:"VP8LDecodeState",N:"VP8Io",Ib:"WebPDecBuffer",Hc:"WebPDecBuffer",V:0,Ha:0,Xa:0,vb:0,o:f(ar),l:0,v:0,O:0,xa:0,cb:f(wn),Na:0,nc:v(Ar,{Qc:"VP8LImageTransformType",n:0,U:0,Vb:0,u:0,b:0}),Ub:0,Mc:0,$d:0,Zd:"*WebPRescaler"},Sn=4,Tn=[o,function(t,e,r,n,a,f,i,u){let b=0,s=u;for(g(t!=o),g(i!=o),g(r>0),g(n>0),g(a>0),g(f>=r*a),b=0;b0),g(n>0),g(a>0),g(f>=r*a),c(i,u,t,e,a),_(t,e+a,i,s,i,u+a,a*(r-1)),b=1;b0),g(n>0),g(a>0),g(f>=r*a),c(i,u,t,e,a),_(t,e+a,i,b,i,u+a,a*(r-1)),s=1;s255?255:r)&255}}}],Rn=[3,4,3,4,4,2,2,4,4,4,2,1,1];this.WebPFreeDecBuffer=this.Yc=function(t){t!=o&&(t.Fc||(t.Jb=""),t.jc=0,t.Jb=t.jc=o)},a=this;var On=d(511,0),Vn=d(511,0),In=d(2041,0),_n=d(225,0),Wn=d(766,0),Un=0,Mn=85627,Bn=35468,Dn=[function(t,e){let r,n=4;for(r=0;r<4;++r)n+=t[e+r-en]+t[e-1+r*en];for(n>>=3,r=0;r<4;++r)l(t,e+r*en,n,4)},function(t,e){G(t,e,4)},function(t,e){let r=e-en;const n=[];for(n.push(L(t[r-1],t[r+0],t[r+1])),n.push(L(t[r+0],t[r+1],t[r+2])),n.push(L(t[r+1],t[r+2],t[r+3])),n.push(L(t[r+2],t[r+3],t[r+4])),r=0;r<4;++r)c(t,e+r*en,n,0,4)},function(t,e){const r=t[e-1],n=t[e-1+en],a=t[e-1+2*en],o=t[e-1+3*en];t[e+0+0*en]=t[e+1+0*en]=t[e+2+0*en]=t[e+3+0*en]=L(t[e-1-en],r,n),t[e+0+1*en]=t[e+1+1*en]=t[e+2+1*en]=t[e+3+1*en]=L(r,n,a),t[e+0+2*en]=t[e+1+2*en]=t[e+2+2*en]=t[e+3+2*en]=L(n,a,o),t[e+0+3*en]=t[e+1+3*en]=t[e+2+3*en]=t[e+3+3*en]=L(a,o,o)},function(t,e){const r=t[e-1+0*en],n=t[e-1+1*en],a=t[e-1+2*en],o=t[e-1-en],f=t[e+0-en],c=t[e+1-en],i=t[e+2-en],u=t[e+3-en];t[e+0+3*en]=L(n,a,t[e-1+3*en]),t[e+0+2*en]=t[e+1+3*en]=L(r,n,a),t[e+0+1*en]=t[e+1+2*en]=t[e+2+3*en]=L(o,r,n),t[e+0+0*en]=t[e+1+1*en]=t[e+2+2*en]=t[e+3+3*en]=L(f,o,r),t[e+1+0*en]=t[e+2+1*en]=t[e+3+2*en]=L(c,f,o),t[e+2+0*en]=t[e+3+1*en]=L(i,c,f),t[e+3+0*en]=L(u,i,c)},function(t,e){const r=t[e-1+0*en],n=t[e-1+1*en],a=t[e-1+2*en],o=t[e-1-en],f=t[e+0-en],c=t[e+1-en],i=t[e+2-en],u=t[e+3-en];t[e+0+0*en]=t[e+1+2*en]=o+f+1>>1,t[e+1+0*en]=t[e+2+2*en]=f+c+1>>1,t[e+2+0*en]=t[e+3+2*en]=c+i+1>>1,t[e+3+0*en]=i+u+1>>1,t[e+0+3*en]=L(a,n,r),t[e+0+2*en]=L(n,r,o),t[e+0+1*en]=t[e+1+3*en]=L(r,o,f),t[e+1+1*en]=t[e+2+3*en]=L(o,f,c),t[e+2+1*en]=t[e+3+3*en]=L(f,c,i),t[e+3+1*en]=L(c,i,u)},function(t,e){const r=t[e+1-en],n=t[e+2-en],a=t[e+3-en],o=t[e+4-en],f=t[e+5-en],c=t[e+6-en],i=t[e+7-en];t[e+0+0*en]=L(t[e+0-en],r,n),t[e+1+0*en]=t[e+0+1*en]=L(r,n,a),t[e+2+0*en]=t[e+1+1*en]=t[e+0+2*en]=L(n,a,o),t[e+3+0*en]=t[e+2+1*en]=t[e+1+2*en]=t[e+0+3*en]=L(a,o,f),t[e+3+1*en]=t[e+2+2*en]=t[e+1+3*en]=L(o,f,c),t[e+3+2*en]=t[e+2+3*en]=L(f,c,i),t[e+3+3*en]=L(c,i,i)},function(t,e){const r=t[e+0-en],n=t[e+1-en],a=t[e+2-en],o=t[e+3-en],f=t[e+4-en],c=t[e+5-en],i=t[e+6-en],u=t[e+7-en];t[e+0+0*en]=r+n+1>>1,t[e+1+0*en]=t[e+0+2*en]=n+a+1>>1,t[e+2+0*en]=t[e+1+2*en]=a+o+1>>1,t[e+3+0*en]=t[e+2+2*en]=o+f+1>>1,t[e+0+1*en]=L(r,n,a),t[e+1+1*en]=t[e+0+3*en]=L(n,a,o),t[e+2+1*en]=t[e+1+3*en]=L(a,o,f),t[e+3+1*en]=t[e+2+3*en]=L(o,f,c),t[e+3+2*en]=L(f,c,i),t[e+3+3*en]=L(c,i,u)},function(t,e){const r=t[e-1+0*en],n=t[e-1+1*en],a=t[e-1+2*en],o=t[e-1+3*en],f=t[e-1-en],c=t[e+0-en],i=t[e+1-en],u=t[e+2-en];t[e+0+0*en]=t[e+2+1*en]=r+f+1>>1,t[e+0+1*en]=t[e+2+2*en]=n+r+1>>1,t[e+0+2*en]=t[e+2+3*en]=a+n+1>>1,t[e+0+3*en]=o+a+1>>1,t[e+3+0*en]=L(c,i,u),t[e+2+0*en]=L(f,c,i),t[e+1+0*en]=t[e+3+1*en]=L(r,f,c),t[e+1+1*en]=t[e+3+2*en]=L(n,r,f),t[e+1+2*en]=t[e+3+3*en]=L(a,n,r),t[e+1+3*en]=L(o,a,n)},function(t,e){const r=t[e-1+0*en],n=t[e-1+1*en],a=t[e-1+2*en],o=t[e-1+3*en];t[e+0+0*en]=r+n+1>>1,t[e+2+0*en]=t[e+0+1*en]=n+a+1>>1,t[e+2+1*en]=t[e+0+2*en]=a+o+1>>1,t[e+1+0*en]=L(r,n,a),t[e+3+0*en]=t[e+1+1*en]=L(n,a,o),t[e+3+1*en]=t[e+1+2*en]=L(a,o,o),t[e+3+2*en]=t[e+2+2*en]=t[e+0+3*en]=t[e+1+3*en]=t[e+2+3*en]=t[e+3+3*en]=o}],En=[function(t,e){let r,n=16;for(r=0;r<16;++r)n+=t[e-1+r*en]+t[e+r-en];N(n>>5,t,e)},function(t,e){G(t,e,16)},function(t,e){let r;for(r=0;r<16;++r)c(t,e+r*en,t,e-en,16)},function(t,e){let r;for(r=16;r>0;--r)l(t,e+0,t[e-1],16),e+=en},function(t,e){let r,n=8;for(r=0;r<16;++r)n+=t[e-1+r*en];N(n>>4,t,e)},function(t,e){let r,n=8;for(r=0;r<16;++r)n+=t[e+r-en];N(n>>4,t,e)},function(t,e){N(128,t,e)}],jn=[function(t,e){let r,n=8;for(r=0;r<8;++r)n+=t[e+r-en]+t[e-1+r*en];H(1*(n>>4),t,e)},function(t,e){G(t,e,8)},function(t,e){let r;for(r=0;r<8;++r)c(t,e+r*en,t,e-en,8)},function(t,e){let r;for(r=0;r<8;++r)l(t,e+0,t[e-1],8),e+=en},function(t,e){let r,n=4;for(r=0;r<8;++r)n+=t[e-1+r*en];H(1*(n>>3),t,e)},function(t,e){let r,n=4;for(r=0;r<8;++r)n+=t[e+r-en];H(1*(n>>3),t,e)},function(t,e){H(128,t,e)}];let Cn,Fn,Gn,Nn,Ln,Hn,zn,qn,Kn,Jn,Yn,xn,Qn,$n,Xn,Zn;var ta=31,ea=[0,2,8],ra=3,na=1,aa=[0+0*en,4+0*en,8+0*en,12+0*en,0+4*en,4+4*en,8+4*en,12+4*en,0+8*en,4+8*en,8+8*en,12+8*en,0+12*en,4+12*en,8+12*en,12+12*en],oa=[4,5,6,7,8,9,10,10,11,12,13,14,15,16,17,17,18,19,20,20,21,21,22,22,23,23,24,25,25,26,27,28,29,30,31,32,33,34,35,36,37,37,38,39,40,41,42,43,44,45,46,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,76,77,78,79,80,81,82,83,84,85,86,87,88,89,91,93,95,96,98,100,101,102,104,106,108,110,112,114,116,118,122,124,126,128,130,132,134,136,138,140,143,145,148,151,154,157],fa=[4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116,119,122,125,128,131,134,137,140,143,146,149,152,155,158,161,164,167,170,173,177,181,185,189,193,197,201,205,209,213,217,221,225,229,234,239,245,249,254,259,264,269,274,279,284],ca=[-Fr,1,-1,2,-2,3,4,6,-3,5,-4,-5,-6,7,-7,8,-8,-9],ia=[[[[128,128,128,128,128,128,128,128,128,128,128],[128,128,128,128,128,128,128,128,128,128,128],[128,128,128,128,128,128,128,128,128,128,128]],[[253,136,254,255,228,219,128,128,128,128,128],[189,129,242,255,227,213,255,219,128,128,128],[106,126,227,252,214,209,255,255,128,128,128]],[[1,98,248,255,236,226,255,255,128,128,128],[181,133,238,254,221,234,255,154,128,128,128],[78,134,202,247,198,180,255,219,128,128,128]],[[1,185,249,255,243,255,128,128,128,128,128],[184,150,247,255,236,224,128,128,128,128,128],[77,110,216,255,236,230,128,128,128,128,128]],[[1,101,251,255,241,255,128,128,128,128,128],[170,139,241,252,236,209,255,255,128,128,128],[37,116,196,243,228,255,255,255,128,128,128]],[[1,204,254,255,245,255,128,128,128,128,128],[207,160,250,255,238,128,128,128,128,128,128],[102,103,231,255,211,171,128,128,128,128,128]],[[1,152,252,255,240,255,128,128,128,128,128],[177,135,243,255,234,225,128,128,128,128,128],[80,129,211,255,194,224,128,128,128,128,128]],[[1,1,255,128,128,128,128,128,128,128,128],[246,1,255,128,128,128,128,128,128,128,128],[255,128,128,128,128,128,128,128,128,128,128]]],[[[198,35,237,223,193,187,162,160,145,155,62],[131,45,198,221,172,176,220,157,252,221,1],[68,47,146,208,149,167,221,162,255,223,128]],[[1,149,241,255,221,224,255,255,128,128,128],[184,141,234,253,222,220,255,199,128,128,128],[81,99,181,242,176,190,249,202,255,255,128]],[[1,129,232,253,214,197,242,196,255,255,128],[99,121,210,250,201,198,255,202,128,128,128],[23,91,163,242,170,187,247,210,255,255,128]],[[1,200,246,255,234,255,128,128,128,128,128],[109,178,241,255,231,245,255,255,128,128,128],[44,130,201,253,205,192,255,255,128,128,128]],[[1,132,239,251,219,209,255,165,128,128,128],[94,136,225,251,218,190,255,255,128,128,128],[22,100,174,245,186,161,255,199,128,128,128]],[[1,182,249,255,232,235,128,128,128,128,128],[124,143,241,255,227,234,128,128,128,128,128],[35,77,181,251,193,211,255,205,128,128,128]],[[1,157,247,255,236,231,255,255,128,128,128],[121,141,235,255,225,227,255,255,128,128,128],[45,99,188,251,195,217,255,224,128,128,128]],[[1,1,251,255,213,255,128,128,128,128,128],[203,1,248,255,255,128,128,128,128,128,128],[137,1,177,255,224,255,128,128,128,128,128]]],[[[253,9,248,251,207,208,255,192,128,128,128],[175,13,224,243,193,185,249,198,255,255,128],[73,17,171,221,161,179,236,167,255,234,128]],[[1,95,247,253,212,183,255,255,128,128,128],[239,90,244,250,211,209,255,255,128,128,128],[155,77,195,248,188,195,255,255,128,128,128]],[[1,24,239,251,218,219,255,205,128,128,128],[201,51,219,255,196,186,128,128,128,128,128],[69,46,190,239,201,218,255,228,128,128,128]],[[1,191,251,255,255,128,128,128,128,128,128],[223,165,249,255,213,255,128,128,128,128,128],[141,124,248,255,255,128,128,128,128,128,128]],[[1,16,248,255,255,128,128,128,128,128,128],[190,36,230,255,236,255,128,128,128,128,128],[149,1,255,128,128,128,128,128,128,128,128]],[[1,226,255,128,128,128,128,128,128,128,128],[247,192,255,128,128,128,128,128,128,128,128],[240,128,255,128,128,128,128,128,128,128,128]],[[1,134,252,255,255,128,128,128,128,128,128],[213,62,250,255,255,128,128,128,128,128,128],[55,93,255,128,128,128,128,128,128,128,128]],[[128,128,128,128,128,128,128,128,128,128,128],[128,128,128,128,128,128,128,128,128,128,128],[128,128,128,128,128,128,128,128,128,128,128]]],[[[202,24,213,235,186,191,220,160,240,175,255],[126,38,182,232,169,184,228,174,255,187,128],[61,46,138,219,151,178,240,170,255,216,128]],[[1,112,230,250,199,191,247,159,255,255,128],[166,109,228,252,211,215,255,174,128,128,128],[39,77,162,232,172,180,245,178,255,255,128]],[[1,52,220,246,198,199,249,220,255,255,128],[124,74,191,243,183,193,250,221,255,255,128],[24,71,130,219,154,170,243,182,255,255,128]],[[1,182,225,249,219,240,255,224,128,128,128],[149,150,226,252,216,205,255,171,128,128,128],[28,108,170,242,183,194,254,223,255,255,128]],[[1,81,230,252,204,203,255,192,128,128,128],[123,102,209,247,188,196,255,233,128,128,128],[20,95,153,243,164,173,255,203,128,128,128]],[[1,222,248,255,216,213,128,128,128,128,128],[168,175,246,252,235,205,255,255,128,128,128],[47,116,215,255,211,212,255,255,128,128,128]],[[1,121,236,253,212,214,255,255,128,128,128],[141,84,213,252,201,202,255,219,128,128,128],[42,80,160,240,162,185,255,205,128,128,128]],[[1,1,255,128,128,128,128,128,128,128,128],[244,1,255,128,128,128,128,128,128,128,128],[238,1,255,128,128,128,128,128,128,128,128]]]],ua=[[[231,120,48,89,115,113,120,152,112],[152,179,64,126,170,118,46,70,95],[175,69,143,80,85,82,72,155,103],[56,58,10,171,218,189,17,13,152],[114,26,17,163,44,195,21,10,173],[121,24,80,195,26,62,44,64,85],[144,71,10,38,171,213,144,34,26],[170,46,55,19,136,160,33,206,71],[63,20,8,114,114,208,12,9,226],[81,40,11,96,182,84,29,16,36]],[[134,183,89,137,98,101,106,165,148],[72,187,100,130,157,111,32,75,80],[66,102,167,99,74,62,40,234,128],[41,53,9,178,241,141,26,8,107],[74,43,26,146,73,166,49,23,157],[65,38,105,160,51,52,31,115,128],[104,79,12,27,217,255,87,17,7],[87,68,71,44,114,51,15,186,23],[47,41,14,110,182,183,21,17,194],[66,45,25,102,197,189,23,18,22]],[[88,88,147,150,42,46,45,196,205],[43,97,183,117,85,38,35,179,61],[39,53,200,87,26,21,43,232,171],[56,34,51,104,114,102,29,93,77],[39,28,85,171,58,165,90,98,64],[34,22,116,206,23,34,43,166,73],[107,54,32,26,51,1,81,43,31],[68,25,106,22,64,171,36,225,114],[34,19,21,102,132,188,16,76,124],[62,18,78,95,85,57,50,48,51]],[[193,101,35,159,215,111,89,46,111],[60,148,31,172,219,228,21,18,111],[112,113,77,85,179,255,38,120,114],[40,42,1,196,245,209,10,25,109],[88,43,29,140,166,213,37,43,154],[61,63,30,155,67,45,68,1,209],[100,80,8,43,154,1,51,26,71],[142,78,78,16,255,128,34,197,171],[41,40,5,102,211,183,4,1,221],[51,50,17,168,209,192,23,25,82]],[[138,31,36,171,27,166,38,44,229],[67,87,58,169,82,115,26,59,179],[63,59,90,180,59,166,93,73,154],[40,40,21,116,143,209,34,39,175],[47,15,16,183,34,223,49,45,183],[46,17,33,183,6,98,15,32,183],[57,46,22,24,128,1,54,17,37],[65,32,73,115,28,128,23,128,205],[40,3,9,115,51,192,18,6,223],[87,37,9,115,59,77,64,21,47]],[[104,55,44,218,9,54,53,130,226],[64,90,70,205,40,41,23,26,57],[54,57,112,184,5,41,38,166,213],[30,34,26,133,152,116,10,32,134],[39,19,53,221,26,114,32,73,255],[31,9,65,234,2,15,1,118,73],[75,32,12,51,192,255,160,43,51],[88,31,35,67,102,85,55,186,85],[56,21,23,111,59,205,45,37,192],[55,38,70,124,73,102,1,34,98]],[[125,98,42,88,104,85,117,175,82],[95,84,53,89,128,100,113,101,45],[75,79,123,47,51,128,81,171,1],[57,17,5,71,102,57,53,41,49],[38,33,13,121,57,73,26,1,85],[41,10,67,138,77,110,90,47,114],[115,21,2,10,102,255,166,23,6],[101,29,16,10,85,128,101,196,26],[57,18,10,102,102,213,34,20,43],[117,20,15,36,163,128,68,1,26]],[[102,61,71,37,34,53,31,243,192],[69,60,71,38,73,119,28,222,37],[68,45,128,34,1,47,11,245,171],[62,17,19,70,146,85,55,62,70],[37,43,37,154,100,163,85,160,1],[63,9,92,136,28,64,32,201,85],[75,15,9,9,64,255,184,119,16],[86,6,28,5,64,255,25,248,1],[56,8,17,132,137,255,55,116,128],[58,15,20,82,135,57,26,121,40]],[[164,50,31,137,154,133,25,35,218],[51,103,44,131,131,123,31,6,158],[86,40,64,135,148,224,45,183,128],[22,26,17,131,240,154,14,1,209],[45,16,21,91,64,222,7,1,197],[56,21,39,155,60,138,23,102,213],[83,12,13,54,192,255,68,47,28],[85,26,85,85,128,128,32,146,171],[18,11,7,63,144,171,4,4,246],[35,27,10,146,174,171,12,26,128]],[[190,80,35,99,180,80,126,54,45],[85,126,47,87,176,51,41,20,32],[101,75,128,139,118,146,116,128,85],[56,41,15,176,236,85,37,9,62],[71,30,17,119,118,255,17,18,138],[101,38,60,138,55,70,43,26,142],[146,36,19,30,171,255,97,27,20],[138,45,61,62,219,1,81,188,64],[32,41,20,117,151,142,20,21,163],[112,19,12,61,195,128,48,4,24]]],ba=[[[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[176,246,255,255,255,255,255,255,255,255,255],[223,241,252,255,255,255,255,255,255,255,255],[249,253,253,255,255,255,255,255,255,255,255]],[[255,244,252,255,255,255,255,255,255,255,255],[234,254,254,255,255,255,255,255,255,255,255],[253,255,255,255,255,255,255,255,255,255,255]],[[255,246,254,255,255,255,255,255,255,255,255],[239,253,254,255,255,255,255,255,255,255,255],[254,255,254,255,255,255,255,255,255,255,255]],[[255,248,254,255,255,255,255,255,255,255,255],[251,255,254,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,253,254,255,255,255,255,255,255,255,255],[251,254,254,255,255,255,255,255,255,255,255],[254,255,254,255,255,255,255,255,255,255,255]],[[255,254,253,255,254,255,255,255,255,255,255],[250,255,254,255,254,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]]],[[[217,255,255,255,255,255,255,255,255,255,255],[225,252,241,253,255,255,254,255,255,255,255],[234,250,241,250,253,255,253,254,255,255,255]],[[255,254,255,255,255,255,255,255,255,255,255],[223,254,254,255,255,255,255,255,255,255,255],[238,253,254,254,255,255,255,255,255,255,255]],[[255,248,254,255,255,255,255,255,255,255,255],[249,254,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,253,255,255,255,255,255,255,255,255,255],[247,254,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,253,254,255,255,255,255,255,255,255,255],[252,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,254,254,255,255,255,255,255,255,255,255],[253,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,254,253,255,255,255,255,255,255,255,255],[250,255,255,255,255,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]]],[[[186,251,250,255,255,255,255,255,255,255,255],[234,251,244,254,255,255,255,255,255,255,255],[251,251,243,253,254,255,254,255,255,255,255]],[[255,253,254,255,255,255,255,255,255,255,255],[236,253,254,255,255,255,255,255,255,255,255],[251,253,253,254,254,255,255,255,255,255,255]],[[255,254,254,255,255,255,255,255,255,255,255],[254,254,254,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,254,255,255,255,255,255,255,255,255,255],[254,254,255,255,255,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]]],[[[248,255,255,255,255,255,255,255,255,255,255],[250,254,252,254,255,255,255,255,255,255,255],[248,254,249,253,255,255,255,255,255,255,255]],[[255,253,253,255,255,255,255,255,255,255,255],[246,253,253,255,255,255,255,255,255,255,255],[252,254,251,254,254,255,255,255,255,255,255]],[[255,254,252,255,255,255,255,255,255,255,255],[248,254,253,255,255,255,255,255,255,255,255],[253,255,254,254,255,255,255,255,255,255,255]],[[255,251,254,255,255,255,255,255,255,255,255],[245,251,254,255,255,255,255,255,255,255,255],[253,253,254,255,255,255,255,255,255,255,255]],[[255,251,253,255,255,255,255,255,255,255,255],[252,253,254,255,255,255,255,255,255,255,255],[255,254,255,255,255,255,255,255,255,255,255]],[[255,252,255,255,255,255,255,255,255,255,255],[249,255,254,255,255,255,255,255,255,255,255],[255,255,254,255,255,255,255,255,255,255,255]],[[255,255,253,255,255,255,255,255,255,255,255],[250,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]]]];this.WebPGetDecoderVersion=this.Ld=function(){return 512};var sa=[0,1,2,3,6,4,5,6,6,6,6,6,6,6,6,7,0],la=[[173,148,140,0],[176,155,140,135,0],[180,157,141,134,130,0],[254,254,243,230,196,177,153,140,133,130,129,0]],ha=[0,1,4,8,5,2,3,6,9,12,13,10,7,11,14,15],da=p([Zr,tn],"");d(4,0);var va=[[0,0,0,0],[1,0,0,0],[0,1,0,0],[1,1,0,0],[0,0,1,0],[1,0,1,0],[0,1,1,0],[1,1,1,0],[0,0,0,1],[1,0,0,1],[0,1,0,1],[1,1,0,1],[0,0,1,1],[1,0,1,1],[0,1,1,1],[1,1,1,1]],pa=134480385,ga=16,Pa=-227,Aa=482,ka=[_t,function(t){return t},function(t,e,r){return e[r+0]},function(t,e,r){return e[r+1]},function(t,e,r){return e[r-1]},function(t,e,r){return Ot(Ot(t,e[r+1]),e[r+0])},function(t,e,r){return Ot(t,e[r-1])},function(t,e,r){return Ot(t,e[r+0])},function(t,e,r){return Ot(e[r-1],e[r+0])},function(t,e,r){return Ot(e[r+0],e[r+1])},function(t,e,r){return Ot(Ot(t,e[r-1]),Ot(e[r+0],e[r+1]))},function(t,e,r){return Math.abs((t>>24&255)-(e[r-1]>>24&255))-Math.abs((e[r+0]>>24&255)-(e[r-1]>>24&255))+(Math.abs((t>>16&255)-(e[r-1]>>16&255))-Math.abs((e[r+0]>>16&255)-(e[r-1]>>16&255)))+(Math.abs((t>>8&255)-(e[r-1]>>8&255))-Math.abs((e[r+0]>>8&255)-(e[r-1]>>8&255)))+(Math.abs((255&t)-(255&e[r-1]))-Math.abs((255&e[r+0])-(255&e[r-1])))<=0?e[r+0]:t},function(t,e,r){return(Vt((t>>24&255)+(e[r+0]>>24&255)-(e[r-1]>>24&255))<<24|Vt((t>>16&255)+(e[r+0]>>16&255)-(e[r-1]>>16&255))<<16|Vt((t>>8&255)+(e[r+0]>>8&255)-(e[r-1]>>8&255))<<8|Vt((255&t)+(255&e[r+0])-(255&e[r-1])))>>>0},function(t,e,r){const n=e[r-1];return(It((t=Ot(t,e[r+0]))>>24&255,n>>24&255)<<24|It(t>>16&255,n>>16&255)<<16|It(t>>8&255,n>>8&255)<<8|It(t>>0&255,n>>0&255))>>>0},_t,_t],ma={Cc:0,Bc:0,Kc:0},wa=16,ya=16,Sa=16,Ta=[2,3,7],Ra=[3,3,11],Oa=0,Va=1,Ia=2,_a=3,Wa=4,Ua=[gr+Pr,gr,gr,gr,40],Ma=19,Ba=[17,18,0,1,2,3,4,5,16,6,7,8,9,10,11,12,13,14,15],Da=120,Ea=[24,7,23,25,40,6,39,41,22,26,38,42,56,5,55,57,21,27,54,58,37,43,72,4,71,73,20,28,53,59,70,74,36,44,88,69,75,52,60,3,87,89,19,29,86,90,35,45,68,76,85,91,51,61,104,2,103,105,18,30,102,106,34,46,84,92,67,77,101,107,50,62,120,1,119,121,83,93,17,31,100,108,66,78,118,122,33,47,117,123,49,63,99,109,82,94,0,116,124,65,79,16,32,98,110,48,115,125,81,95,64,114,126,97,111,80,113,127,96,112],ja=1<{var e;e=t.data,m.push(e),y()}))}},n={};function a(t){var e=n[t];if(void 0!==e)return e.exports;var o=n[t]={exports:{}};return r[t].call(o.exports,o,o.exports,a),o.exports}a.m=r,a.x=()=>{var t=a.O(void 0,[699,866,158],(()=>a(2061)));return a.O(t)},t=[],a.O=(e,r,n,o)=>{if(!r){var f=1/0;for(b=0;b=o)&&Object.keys(a.O).every((t=>a.O[t](r[i])))?r.splice(i--,1):(c=!1,o0&&t[b-1][2]>o;b--)t[b]=t[b-1];t[b]=[r,n,o]},a.d=(t,e)=>{for(var r in e)a.o(e,r)&&!a.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:e[r]})},a.f={},a.e=t=>Promise.all(Object.keys(a.f).reduce(((e,r)=>(a.f[r](t,e),e)),[])),a.u=t=>({158:"npm.iobuffer",699:"npm.pako",866:"npm.fast-png"}[t]+"."+{158:"8fe11aa09121a6fd9200",699:"89deb457201f16c93925",866:"a7cba17ee621cb2ad512"}[t]+".chunk.js"),a.miniCssF=t=>{},a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),a.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),(()=>{var t;a.g.importScripts&&(t=a.g.location+"");var e=a.g.document;if(!t&&e&&(e.currentScript&&(t=e.currentScript.src),!t)){var r=e.getElementsByTagName("script");r.length&&(t=r[r.length-1].src)}if(!t)throw new Error("Automatic publicPath is not supported in this browser");t=t.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),a.p=t})(),(()=>{if(void 0!==a){var t=a.u,e=a.e,r={},n={};a.u=function(e){return t(e)+(r.hasOwnProperty(e)?"?"+r[e]:"")},a.e=function(o){return e(o).catch((function(e){var f=n.hasOwnProperty(o)?n[o]:999999;if(f<1){var c=t(o);throw e.message="Loading chunk "+o+" failed after 999999 retries.\n("+c+")",e.request=c,e}return new Promise((function(t){setTimeout((function(){var e=Date.now();r[o]=e,n[o]=f-1,t(a.e(o))}),3e3)}))}))}}})(),(()=>{var t={61:1};a.f.i=(e,r)=>{t[e]||importScripts(a.p+a.u(e))};var e=this.webpackChunktweb=this.webpackChunktweb||[],r=e.push.bind(e);e.push=e=>{var[n,o,f]=e;for(var c in o)a.o(o,c)&&(a.m[c]=o[c]);for(f&&f(a);n.length;)t[n.pop()]=1;r(e)}})(),e=a.x,a.x=()=>Promise.all([699,866,158].map(a.e,a)).then(e),a.x()})(); -//# sourceMappingURL=61.99941a688bad81e71e09.chunk.js.map \ No newline at end of file +//# sourceMappingURL=61.5a1b64b6ed7885fd6d34.chunk.js.map \ No newline at end of file diff --git a/public/61.99941a688bad81e71e09.chunk.js.map b/public/61.5a1b64b6ed7885fd6d34.chunk.js.map similarity index 99% rename from public/61.99941a688bad81e71e09.chunk.js.map rename to public/61.5a1b64b6ed7885fd6d34.chunk.js.map index 1bf03786..793f94ae 100644 --- a/public/61.99941a688bad81e71e09.chunk.js.map +++ b/public/61.5a1b64b6ed7885fd6d34.chunk.js.map @@ -1 +1 @@ -{"version":3,"file":"61.99941a688bad81e71e09.chunk.js","mappings":"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,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,OAGvD,CACE,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAClC,IAAK,IAAK,KAEZ,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IACnB,IAAK,IAAK,IAAK,IAAK,IAAK,KAE3B,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IACT,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,OAIzC,CACE,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACvC,IAAK,MAGT,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,OAGvD,CACE,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IACxB,IAAK,IAAK,IAAK,IAAK,KAEtB,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IACT,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAErC,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/startup chunk dependencies","webpack://tweb/./src/vendor/libwebp-0.2.0.js","webpack://tweb/./src/lib/webp/webp.worker.ts","webpack://tweb/./src/lib/webp/webp.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/importScripts chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn Promise.all([699,866,158].map(__webpack_require__.e, __webpack_require__)).then(next);\n};","// Copyright 2011 Google Inc.\n//\n// This code is licensed under the same terms as WebM:\n// Software License Agreement: http://www.webmproject.org/license/software/\n// Additional IP Rights Grant: http://www.webmproject.org/license/additional/\n// -----------------------------------------------------------------------------\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// -----------------------------------------------------------------------------\n//\n// Copyright 2011-2013 Dominik Homberger\n// Libwebp Javascript / libwebpjs - the libwebp implementation in javascript (v0.2.0)\n//\n// Author: Dominik Homberger (dominik.homberger@gmail.com)\n\nlet i;\nlet a;\nlet self;\nconst ca = 0;\nconst p = null;\nconst s = 0;\nconst x = 0;\nconst la = s;\nconst E = s;\nconst bb = 0;\nconst Mb = 0;\n\nfunction M(F) {\n return JSON.parse(JSON.stringify(F));\n}\n\nfunction N(F, G, w, D, S) {\n for (i = 0; i < S; ++i) F[G + i] = w[D + i];\n}\n\nfunction Nb(F) {\n const G = [];\n const w = F.length;\n let D;\n for (D = 0; D < w; ++D) G.push(F[D]);\n return G;\n}\n\nfunction ic(F, G) {\n const w = [];\n w.push(M(F));\n let D;\n for (D = 0; D < G; ++D) w.push(M(F));\n w.push(0);\n return w;\n}\n\nfunction rc(F, G) {\n const w = [];\n let D;\n for (D = 0; D < G; ++D) w.push(F);\n w.push(0);\n return w;\n}\n\nfunction memmove(arr1, index1, arr2, index2, length) {\n let i;\n for (i = 0; i < length; i++) {\n arr1[index1 + i] = arr2[index2 + i];\n }\n}\n\nfunction jd(F, G, w, D) {\n let S;\n for (S = 0; S < D; ++S) F[G + S] = w;\n}\n\nfunction kd(F, G, w, D) {\n let S = '';\n let ga;\n for (ga = 0; ga < D; ++ga) S += String.fromCharCode(F[G + ga]);\n return w == S ? 0 : 1;\n}\n\nfunction U(F, G) {\n let w; const\n D = [];\n for (w = 0; w < F; ++w) D.push(G);\n return D;\n}\n\nfunction ld(F, G) {\n let w; const\n D = [];\n for (w = 0; w < F; ++w) D.push(M(G));\n return D;\n}\n\nfunction md(F, G) {\n let w;\n for (w = F.length - 1; w >= 0; --w) G = M(U(F[w], G));\n return G;\n}\n\nfunction $(F) {\n if (!F) throw Error('assert :P');\n}\nexport const WebPDecoder = function () {\n function F(a) {\n return a == Ob || a == Pb || a == Bb || a == Qb;\n }\n\n function G(a) {\n return S(a, 1);\n }\n\n function w(a, b) {\n const c = 1 + ((a.la - 1) * b >> 8);\n const d = c << 8;\n let e = s;\n a.Z >= d ? (e = 1, a.la -= c, a.Z -= d) : (e = 0, a.la = c);\n for (; a.la < 128;) a.Z <<= 1, a.la <<= 1, ++a.gc == 8 && (a.gc = 0, a.bc && (a.Z += a.qa[a.Ia++], a.bc--));\n return e;\n }\n\n function D(a, b, c, d) {\n d -= c;\n d >= 2 ? (a.Z = b[c + 0] << 8 | b[c + 1], a.qa = b, a.Ia = c + 2, a.bc = d - 2) : (a.Z = 0, a.qa = p, a.bc = 0);\n a.la = 255;\n a.gc = 0;\n }\n\n function S(a, b) {\n for (var c = 0, d = s, d = b - 1; d >= 0; d--) c |= w(a, 128) << d;\n return c;\n }\n\n function ga(a, b) {\n const c = S(a, b);\n return G(a) ? -c : c;\n }\n\n function Rb(a, b, c, d) {\n let e = Mb;\n $(a != p);\n $(b != p);\n $(d < 4294967288);\n a.qa = b;\n a.Ia = c;\n a.ya = d;\n a.T = 0;\n a.Q = 0;\n a.g = 0;\n a.L = 0;\n for (e = a.fa = 0; e < 4 && e < a.ya; ++e) a.T |= a.qa[a.Ia + a.Q] << 8 * e, ++a.Q;\n }\n\n function Sb(a) {\n for (; a.g >= 8 && a.Q < a.ya;) a.T >>>= 8, a.T += a.qa[a.Ia + a.Q] << 24 >>> 0, ++a.Q, a.g -= 8;\n }\n\n function Da(a) {\n a.g >= 8 && Sb(a);\n a.Q == a.ya && a.g == 32 && (a.L = 1);\n }\n\n function T(a, b) {\n let c = 0;\n $(b >= 0);\n if (!a.L && b < gf) {\n if (a.Q == a.ya && a.g + b >= 32 && (a.L = 1, a.g + b > 32)) return c;\n c = a.T >> a.g & hf[b];\n a.g += b;\n a.g >= 8 && a.g >= 8 && Sb(a);\n } else a.fa = 1;\n return c;\n }\n\n function ma(a) {\n return a.Pa == a.gb;\n }\n\n function nd(a, b) {\n $(a != p);\n if (b == 0) return 0;\n a.gb = 2 * b - 1;\n a.Y = ld(a.gb, jf);\n if (a.Y == p) return 0;\n a.Y[0].s = -1;\n return a.Pa = 1;\n }\n\n function ja(a) {\n a != p && (a.Y = p, a.Y = p, a.gb = 0, a.Pa = 0);\n }\n\n function jc(a, b, c, d) {\n for (var e = a.Y, g = 0, k = +a.gb; d-- > 0;) {\n if (g >= k) return 0;\n if (e[g].s < 0) {\n if (ma(a)) return 0;\n const h = a;\n const n = h.Y;\n const l = +h.Pa;\n e[g].s = l - g;\n h.Pa += 2;\n n[l + 0].s = -1;\n n[l + 1].s = -1;\n } else if (e[g].s == 0) return 0;\n g += e[g].s + (c >> d & 1);\n }\n if (e[g].s < 0) e[g].s = 0;\n else if (e[g].s != 0) return 0;\n e[g].kc = b;\n return 1;\n }\n\n function od(a, b, c) {\n var d = s;\n let e = 0;\n let g = 0;\n $(a != p);\n $(b != p);\n for (d = 0; d < c; ++d) b[d] > 0 && (++e, g = d);\n if (!nd(a, e)) return 0;\n if (e == 1) return g < 0 || g >= c ? (ja(a), 0) : jc(a, g, 0, 0);\n e = 0;\n g = U(c, s);\n if (g == p) return (e = e && ma(a)) || ja(a), e;\n var k = s;\n var k = s;\n var d = U(Tb + 1, 0);\n let h = s;\n const n = U(Tb + 1, 0);\n let l = 0;\n $(b != p);\n $(c > 0);\n $(g != p);\n for (k = 0; k < c; ++k) b[k] > l && (l = b[k]);\n if (l > Tb) d = 0;\n else {\n for (k = 0; k < c; ++k) ++d[b[k]];\n h = d[0] = 0;\n n[0] = -1;\n for (k = 1; k <= l; ++k) h = h + d[k - 1] << 1, n[k] = h;\n for (k = 0; k < c; ++k) g[k] = b[k] > 0 ? n[b[k]]++ : pd;\n d = 1;\n }\n if (!d) return (e = e && ma(a)) || ja(a), e;\n for (d = 0; d < c; ++d) {\n if (b[d] > 0 && !jc(a, d, g[d], b[d])) {\n return (e = e && ma(a)) || ja(a), e;\n }\n }\n (e = ma(a)) || ja(a);\n return e;\n }\n\n function Ea(a, b, c, d, e, g, k) {\n for (var h = s, h = 0; h < k; ++h) e[g + h] = a[b + h] + c[d + h] & 255;\n }\n\n function qd(a, b, c) {\n const d = a.P.l;\n if (!(c = b < 0 || c < 0 || b + c > a.P.v)) {\n if (c = b == 0) {\n a: {\n let e = a.Ga;\n var g = a.G;\n var k = a.ub;\n c = a.P.l;\n let h = a.P.v;\n const n = a.Xb;\n var l = [p];\n let m = p;\n let f = h * c;\n var q = p;\n var r = p;\n var r = 'WEBP_FILTER_TYPE';\n let u = s;\n var l = s;\n var v = 0;\n let C = s;\n $(c > 0 && h > 0 && d >= c);\n $(e != p && n != p);\n if (k <= Ub) c = 0;\n else if (C = e[g + 0] >> 0 & 3, r = e[g + 0] >> 2 & 3, u = e[g + 0] >> 4 & 3, l = e[g + 0] >> 6 & 3, C < kc || C > kf || r >= lf || u > rd || l != 0) c = 0;\n else {\n if (C == kc) v = k >= f, l = e, m = g + Ub;\n else {\n l = U(f, 0);\n m = 0;\n if (l\n == p) {\n c = 0;\n break a;\n }\n var v = g + Ub;\n var k = k - Ub;\n var g = l;\n var q = M(Vb);\n let A = 0;\n const z = sd();\n z == p ? v = 0 : (z.l = c, z.v = h, z.N = q, td(na), q.put = ud, q.Mb = vd, q.Pb = wd, q.ka = p, q.ka = g, q.fd = 0, q.width = c, q.height = h, z.a = L, Rb(z.o, e, v, k), z.Wa = Cb, Ka(c, h, 1, z, p) && xd(z, c) && (z.Wa = Db, A = lc(z, z.V, z.Ha, z.l, z.v, mf)), z != p && sa(z), v = A);\n }\n if (v) {\n e = nf[r];\n e != p ? (q = U(f, 0), r = 0, q == p && (v = 0, C != kc && (m = l = p)), e(l, m, c, h, 1, c, q, r), f = q, C = r) : (f = l, C = m);\n for (e = 0; h-- > 0;) N(n, e, f, C, c), C += c, e += d;\n u == rd && (v = l == p || m <= 0 || c <= 0 ? 0 : 1);\n }\n c = v;\n }\n }\n c = !c;\n }\n }\n return c ? p : b == 0 ? a.Xb : +b * d;\n }\n\n function of(a) {\n let b = a.width;\n const c = a.height;\n let d = a.J;\n if (b <= 0 || c <= 0 || !(d >= Qa && d < Cc)) return ta;\n if (!a.Fc && a.Jb == p) {\n var e = p;\n var g = 0;\n var k = 0;\n var h = 0;\n var n = 0;\n var e = bb;\n var l = b * yd[d];\n var m = l * c;\n d < ua || (g = parseInt((b + 1) / 2, 10), h = g * parseInt((c + 1) / 2, 10), d == Ra && (k = b, n = k * c));\n e = m + 2 * h + n;\n if (e != e) return ta;\n e = U(e, 205);\n if (e == p) return cb;\n a.Jb = e;\n a.jc = p;\n d < ua ? (b = a.c.RGBA, b.ma = e, b.Sa = p, b.f = l, b.size = m) : (b = a.c.Va, b.y = e, b.D = p, b.F = l, b.Wc = m, b.c = e, b.B = p + m, b.nb = g, b.Rc = h, b.S = e, b.C = p + m + h, b.rb = g, b.Uc = h, d == Ra && (b.p = e, b.q = p + m + 2 * h), b.Wb = n, b.Fa = k);\n }\n d = 1;\n g = a.J;\n k = a.width;\n h = a.height;\n g >= Qa && g < Cc ? g < ua ? (a = a.c.RGBA, d\n &= a.f * h <= a.size, d &= a.f >= k * yd[g], d &= a.ma != p) : (a = a.c.Va, n = a.nb * parseInt((h + 1) / 2, 10), l = a.rb * parseInt((h + 1) / 2, 10), m = a.Fa * h, d &= a.F * h <= a.Wc, d &= n <= a.Rc, d &= l <= a.Uc, d &= m <= a.Wb, d &= a.F >= k, d &= a.nb >= parseInt((k + 1) / 2, 10), d &= a.rb >= parseInt((k + 1) / 2, 10), d &= a.y != p, d &= a.c != p, d &= a.S != p, g == Ra && (d &= a.Fa >= k, d &= m <= a.Wb, d &= a.p != p)) : d = 0;\n return d ? L : ta;\n }\n\n function zd(a, b, c, d) {\n if (d == p || a <= 0 || b <= 0) return ta;\n if (c != p) {\n if (c.Ua) {\n const e = c.wc;\n const g = c.vc;\n const k = c.t & -2;\n const h = c.k & -2;\n if (k < 0 || h < 0 || e <= 0 || g <= 0 || k + e > a || h + g > b) return ta;\n a = e;\n b = g;\n }\n if (c.I) {\n if (c.Ba <= 0\n || c.Aa <= 0) return ta;\n a = c.Ba;\n b = c.Aa;\n }\n }\n d.width = a;\n d.height = b;\n return of(d);\n }\n\n function mb(a) {\n return !(a & -256) ? a : a < 0 ? 0 : 255;\n }\n\n function Ad(a, b, c, d) {\n const e = U(16, 0);\n let g;\n g = 0;\n let k;\n for (k = 0; k < 4; ++k) {\n var h = a[b + 0] + a[b + 8];\n var n = a[b + 0] - a[b + 8];\n var l = (a[b + 4] * Wb >> 16) - (a[b + 12] * Xb >> 16);\n var m = (a[b + 4] * Xb >> 16) + (a[b + 12] * Wb >> 16);\n e[g + 0] = h + m;\n e[g + 1] = n + l;\n e[g + 2] = n - l;\n e[g + 3] = h - m;\n g += 4;\n b++;\n }\n for (k = g = 0; k < 4; ++k) {\n a = e[g + 0] + 4, h = a + e[g + 8], n = a - e[g + 8], l = (e[g + 4] * Wb >> 16) - (e[g + 12] * Xb >> 16), m = (e[g + 4] * Xb >> 16) + (e[g + 12] * Wb >> 16), c[d + 0 + 0 * f] = mb(c[d + 0 + 0 * f] + (h + m >> 3)), c[d + 1 + 0 * f] = mb(c[d\n + 1 + 0 * f] + (n + l >> 3)), c[d + 2 + 0 * f] = mb(c[d + 2 + 0 * f] + (n - l >> 3)), c[d + 3 + 0 * f] = mb(c[d + 3 + 0 * f] + (h - m >> 3)), g++, d += f;\n }\n }\n\n function pf(a, b, c, d, e) {\n Ad(a, b, c, d);\n e && Ad(a, b + 16, c, d + 4);\n }\n\n function qf(a, b, c, d) {\n mc(a, b + 0, c, d + 0, 1);\n mc(a, b + 32, c, d + 4 * f, 1);\n }\n\n function nc(a, b, c, d) {\n a = a[b + 0] + 4;\n let e;\n for (e = 0; e < 4; ++e) for (b = 0; b < 4; ++b) c[d + b + e * f] = mb(c[d + b + e * f] + (a >> 3));\n }\n\n function rf(a, b, c, d) {\n a[b + 0] && nc(a, b + 0, c, d + 0);\n a[b + 16] && nc(a, b + 16, c, d + 4);\n a[b + 32] && nc(a, b + 32, c, d + 4 * f);\n a[b + 48] && nc(a, b + 48, c, d + 4 * f + 4);\n }\n\n function Dc(a, b, c) {\n const d = b - f;\n const e = oa;\n const g = 255 - a[d - 1];\n let k;\n for (k = 0; k\n < c; ++k) {\n const h = e;\n const n = g + a[b - 1];\n var l;\n for (l = 0; l < c; ++l) a[b + l] = h[n + a[d + l]];\n b += f;\n }\n }\n\n function Yb(a, b, c) {\n let d;\n for (d = 0; d < 16; ++d) for (i = 0; i < 16; ++i) b[c + d * f + i] = a;\n }\n\n function y(a, b, c) {\n return a + 2 * b + c + 2 >> 2;\n }\n\n function Zb(a, b, c) {\n let d; let\n e;\n for (d = 0; d < 8; ++d) for (e = 0; e < 8; ++e) b[c + e + d * f] = a;\n }\n\n function nb(a, b, c) {\n const d = a[b - c];\n const e = a[b + 0];\n const g = 3 * (e - d) + sc[1020 + a[b - 2 * c] - a[b + c]];\n const k = oc[112 + (g + 4 >> 3)];\n a[b - c] = oa[255 + d + oc[112 + (g + 3 >> 3)]];\n a[b + 0] = oa[255 + e - k];\n }\n\n function Bd(a, b, c, d) {\n const e = a[b + 0];\n const g = a[b + c];\n return va[255 + a[b - 2 * c] - a[b - c]] > d || va[255 + g - e] > d;\n }\n\n function Cd(a,\n b, c, d, e) {\n const g = a[b - 3 * c];\n const k = a[b - 2 * c];\n const h = a[b - c];\n const n = a[b + 0];\n const l = a[b + c];\n const m = a[b + 2 * c];\n const f = a[b + 3 * c];\n return 2 * va[255 + h - n] + tc[255 + k - l] > d ? 0 : va[255 + a[b - 4 * c] - g] <= e && va[255 + g - k] <= e && va[255 + k - h] <= e && va[255 + f - m] <= e && va[255 + m - l] <= e && va[255 + l - n] <= e;\n }\n\n function Dd(a, b, c, d) {\n let e;\n for (e = 0; e < 16; ++e) 2 * va[255 + a[b + e - c] - a[b + e + 0]] + tc[255 + a[b + e - 2 * c] - a[b + e + c]] <= d && nb(a, b + e, c);\n }\n\n function Ed(a, b, c, d) {\n let e;\n for (e = 0; e < 16; ++e) 2 * va[255 + a[b + e * c - 1] - a[b + e * c + 0]] + tc[255 + a[b + e * c - 2] - a[b + e * c + 1]] <= d && nb(a, b + e * c, 1);\n }\n\n function sf(a, b, c, d) {\n let e;\n for (e = 3; e > 0; --e) {\n b\n += 4 * c, Dd(a, b + 0, c, d);\n }\n }\n\n function tf(a, b, c, d) {\n let e;\n for (e = 3; e > 0; --e) b += 4, Ed(a, b + 0, c, d);\n }\n\n function Fa(a, b, c, d, e, g, k, h) {\n for (; e-- > 0;) {\n if (Cd(a, b + 0, c, g, k)) {\n if (Bd(a, b + 0, c, h)) nb(a, b + 0, c);\n else {\n const n = a;\n const l = b + 0;\n const m = c;\n const f = n[l - 2 * m];\n const q = n[l - m];\n const r = n[l + 0];\n const u = n[l + m];\n const v = n[l + 2 * m];\n var C = sc[1020 + 3 * (r - q) + sc[1020 + f - u]];\n const A = 27 * C + 63 >> 7;\n const z = 18 * C + 63 >> 7;\n var C = 9 * C + 63 >> 7;\n n[l - 3 * m] = oa[255 + n[l - 3 * m] + C];\n n[l - 2 * m] = oa[255 + f + z];\n n[l - m] = oa[255 + q + A];\n n[l + 0] = oa[255 + r - A];\n n[l + m] = oa[255 + u - z];\n n[l + 2 * m] = oa[255 + v - C];\n }\n }\n b += d;\n }\n }\n\n function Ga(a, b, c, d, e, g, k, h) {\n for (; e-- > 0;) {\n if (Cd(a, b + 0, c,\n g, k)) {\n if (Bd(a, b + 0, c, h)) nb(a, b + 0, c);\n else {\n const n = a;\n const l = b + 0;\n const m = c;\n const f = n[l - m];\n const q = n[l + 0];\n const r = n[l + m];\n var u = 3 * (q - f);\n const v = oc[112 + (u + 4 >> 3)];\n var u = oc[112 + (u + 3 >> 3)];\n const C = v + 1 >> 1;\n n[l - 2 * m] = oa[255 + n[l - 2 * m] + C];\n n[l - m] = oa[255 + f + u];\n n[l + 0] = oa[255 + q - v];\n n[l + m] = oa[255 + r - C];\n }\n }\n b += d;\n }\n }\n\n function uf(a, b, c, d, e, g) {\n Fa(a, b + 0, c, 1, 16, d, e, g);\n }\n\n function vf(a, b, c, d, e, g) {\n Fa(a, b + 0, 1, c, 16, d, e, g);\n }\n\n function wf(a, b, c, d, e, g) {\n let k;\n for (k = 3; k > 0; --k) b += 4 * c, Ga(a, b + 0, c, 1, 16, d, e, g);\n }\n\n function xf(a, b, c, d, e, g) {\n let k;\n for (k = 3; k > 0; --k) b += 4, Ga(a, b + 0, 1, c, 16, d, e, g);\n }\n\n function yf(a, b, c, d, e,\n g, k, h) {\n Fa(a, b, e, 1, 8, g, k, h);\n Fa(c, d, e, 1, 8, g, k, h);\n }\n\n function zf(a, b, c, d, e, g, k, h) {\n Fa(a, b, 1, e, 8, g, k, h);\n Fa(c, d, 1, e, 8, g, k, h);\n }\n\n function Af(a, b, c, d, e, g, k, h) {\n Ga(a, b + 4 * e, e, 1, 8, g, k, h);\n Ga(c, d + 4 * e, e, 1, 8, g, k, h);\n }\n\n function Bf(a, b, c, d, e, g, k, h) {\n Ga(a, b + 4, 1, e, 8, g, k, h);\n Ga(c, d + 4, 1, e, 8, g, k, h);\n }\n\n function Fd(a, b) {\n return b == $b ? a.i == 0 ? a.d == 0 ? Cf : Df : a.d == 0 ? Ef : $b : b;\n }\n\n function Ec(a, b, c, d) {\n for (i = 0; i < 4; ++i) a[b + i] = c[d + i];\n }\n\n function wa(a, b) {\n return a < 0 ? 0 : a > b ? b : a;\n }\n\n function Gd(a) {\n a.a = 'VP8_STATUS_OK';\n a.xc = 'OK';\n }\n\n function td(a) {\n a >>> 8 != na >>> 8 && alert('mismatch error');\n }\n\n function Y(a, b, c) {\n a.a == L && (a.a = b, a.xc = c, a.za = 0);\n // alert(b + \": \" + c);\n return 0;\n }\n\n function Hd(a, b) {\n let c = [0];\n let d = x;\n var e = [Mb];\n var g = M(Id);\n var k = M(Jd);\n let h = M(Fc);\n var e = 'VP8StatusCode';\n var g = M(Gc);\n if (a == p) return alert('(dec == null)'), 0;\n Gd(a);\n if (b == p) return Y(a, 'VP8_STATUS_INVALID_PARAM', 'null VP8Io passed to VP8GetHeaders()');\n g.data = b.data;\n g.b = b.b;\n g.e = b.e;\n g.b = [g.b];\n g.e = [g.e];\n g = [g];\n e = Kd(g);\n if (e != L) return Y(a, e, 'Incorrect/incomplete header.');\n g = g[0];\n g.b = g.b[0];\n g.e = g.e[0];\n if (g.ia) return Y(a, W, 'Unexpected lossless format encountered.');\n a.Ga == p && ($(a.ub == 0), a.Ga = g.$, a.G = g.G, a.ub = g.pa);\n d = g.data;\n c = g.b + g.offset;\n e = g.e - g.offset;\n $(g.e >= g.offset);\n if (e[0] < 4) return Y(a, Z, 'Truncated header.');\n h = d[c + 0] | d[c + 1] << 8 | d[c + 2] << 16;\n g = a.Ac;\n g.fb = !(h & 1) + 0;\n g.Jc = h >> 1 & 7;\n g.Nc = h >> 4 & 1;\n g.Ra = h >> 5;\n if (g.Jc > 3) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'Incorrect keyframe parameters.');\n if (!g.Nc) return Y(a, 'VP8_STATUS_UNSUPPORTED_FEATURE', 'Frame not displayable.');\n c += 3;\n e -= 3;\n k = a.P;\n if (g.fb) {\n if (e < 7) return Y(a, 'VP8_STATUS_NOT_ENOUGH_DATA', 'cannot parse picture header');\n if (!(e\n >= 3 && d[c + 0] == 157 && d[c + 1] == 1 && d[c + 2] == 42)) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'Bad code word');\n k.l = (d[c + 4] << 8 | d[c + 3]) & 16383;\n k.gd = d[c + 4] >> 6;\n k.v = (d[c + 6] << 8 | d[c + 5]) & 16383;\n k.hd = d[c + 6] >> 6;\n c += 7;\n e -= 7;\n a.Ma = k.l + 15 >> 4;\n a.hb = k.v + 15 >> 4;\n b.width = k.l;\n b.height = k.v;\n b.I = 0;\n b.Ua = 0;\n b.k = 0;\n b.t = 0;\n b.Ka = b.width;\n b.K = b.height;\n b.m = b.width;\n b.h = b.height;\n h = a.R;\n for (i = 0; i < h.Ta.length; ++i) h.Ta[i] = 255;\n h.z = M(Ff);\n h = a.Ca;\n $(h != p);\n h.pb = 0;\n h.ob = 0;\n h.tb = 1;\n for (i = 0; i < h.Kb.length; ++i) h.Kb[i] = 0;\n for (i = 0; i < h.Cb.length; ++i) h.Cb[i] = 0;\n a.Lb = 0;\n }\n if (g.Ra\n > e) return Y(a, 'VP8_STATUS_NOT_ENOUGH_DATA', 'bad partition length');\n h = a.o;\n D(h, d, c, c + g.Ra);\n c += g.Ra;\n e -= g.Ra;\n g.fb && (k.uc = G(h), k.$c = G(h));\n var k = h;\n var n = a.Ca;\n let l = a.R;\n $(k != p);\n $(n != p);\n n.pb = G(k);\n if (n.pb) {\n n.ob = G(k);\n if (G(k)) {\n var m;\n n.tb = G(k);\n for (m = 0; m < xa; ++m) n.Kb[m] = G(k) ? ga(k, 7) : 0;\n for (m = 0; m < xa; ++m) n.Cb[m] = G(k) ? ga(k, 6) : 0;\n }\n if (n.ob) for (m = 0; m < Ld; ++m) l.Ta[m] = G(k) ? S(k, 8) : 255;\n } else n.ob = 0;\n if (k.Ab) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'cannot parse segment header');\n k = h;\n n = a.ga;\n n.Oc = G(k);\n n.Fb = S(k, 6);\n n.kb = S(k, 3);\n n.oc = G(k);\n if (n.oc\n && G(k)) {\n for (l = 0; l < Hc; ++l) G(k) && (n.Lc[l] = ga(k, 6));\n for (l = 0; l < Gf; ++l) G(k) && (n.Gc[l] = ga(k, 6));\n }\n a.A = n.Fb == 0 ? 0 : n.Oc ? 1 : 2;\n if (a.A > 0) {\n if (a.Ca.pb) for (l = 0; l < xa; ++l) m = a.Ca.Cb[l], a.Ca.tb || (m += n.Fb), a.Zb[l] = m;\n else a.Zb[0] = n.Fb;\n }\n if (k.Ab) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'cannot parse filter header');\n var k = d;\n var f = c;\n var n = f;\n var e = f + e;\n m = 0;\n let q = s;\n let r = s;\n a.Hb = 1 << S(a.o, 2);\n q = a.Hb - 1;\n l = k;\n m = f + 3 * q;\n if (e < m) e = 'VP8_STATUS_NOT_ENOUGH_DATA';\n else {\n for (r = 0; r < q; ++r) {\n var f = l;\n var u = m + (k[n + 0] | k[n + 1] << 8 | k[n + 2] << 16);\n u > e && (f = k);\n D(a.ic[+r], l, m, u);\n l = f;\n m = u;\n n += 3;\n }\n D(a.ic[+q], l, m, e);\n e = m < e ? 'VP8_STATUS_OK' : 'VP8_STATUS_SUSPENDED';\n }\n if (e != 'VP8_STATUS_OK') return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'cannot parse partitions');\n q = a.o;\n e = S(q, 7);\n k = G(q) ? ga(q, 4) : 0;\n n = G(q) ? ga(q, 4) : 0;\n l = G(q) ? ga(q, 4) : 0;\n m = G(q) ? ga(q, 4) : 0;\n q = G(q) ? ga(q, 4) : 0;\n r = a.Ca;\n f = s;\n for (f = 0; f < xa; ++f) {\n u = s;\n if (r.pb) u = r.Kb[f], r.tb || (u += e);\n else if (f > 0) {\n a.yb[f] = a.yb[0];\n continue;\n } else u = e;\n const v = a.yb[f];\n v.sc[0] = Ic[wa(u + k, 127)];\n v.sc[1] = Jc[wa(u + 0, 127)];\n v.sb[0] = 2 * Ic[wa(u + n, 127)];\n v.sb[1] = 101581 * Jc[wa(u + l, 127)] >> 16;\n v.sb[1] < 8\n && (v.sb[1] = 8);\n v.qc[0] = Ic[wa(u + m, 117)];\n v.qc[1] = Jc[wa(u + q, 127)];\n }\n if (g.fb) a.Zc = 259;\n else return Y(a, Hf, 'Not a key frame.');\n G(h);\n e = a.R;\n for (k = 0; k < Md; ++k) for (n = 0; n < Nd; ++n) for (l = 0; l < Kc; ++l) for (m = 0; m < Lc; ++m) w(h, If[k][n][l][m]) && (e.z[k][n][l][m] = S(h, 8));\n a.pc = G(h);\n a.pc && (a.Pc = S(h, 8));\n if (a.P.uc) {\n c -= 8;\n h = Mb;\n if (g.Ra < 8 || d[c + 8 - 1] != 1) return Y(a, W, 'RIFF: Inconsistent extra information.');\n h = d[c + 0] << 0 | d[c + 1] << 8 | d[c + 2] << 16;\n a.fc = h;\n a.dd = p;\n a.cd = d[c + 3];\n }\n return a.za = 1;\n }\n\n function Mc(a, b, c, d, e, g) {\n let k = b[e][c];\n if (!w(a, k[0])) return 0;\n for (;;) {\n ++e;\n if (w(a, k[1])) {\n var h;\n if (w(a, k[2])) {\n if (w(a, k[3])) {\n if (w(a, k[6])) {\n h = x;\n c = w(a, k[8]);\n k = w(a, k[9 + c]);\n k = 2 * c + k;\n c = 0;\n h = Jf[k];\n var n;\n for (n = 0; n < h.length - 1; ++n) c += c + w(a, h[n]);\n c += 3 + (8 << k);\n } else w(a, k[7]) ? (c = 7 + 2 * w(a, 165), c += w(a, 145)) : c = 5 + w(a, 159);\n } else c = w(a, k[4]) ? 3 + w(a, k[5]) : 2;\n k = b[Nc[e]][2];\n } else k = b[Nc[e]][1], c = 1;\n h = Kf[e - 1];\n g[g[g.length - 1] + h] = (w(a, 128) ? -c : c) * d[(h > 0) + 0];\n if (e == 16 || !w(a, k[0])) return e;\n } else k = b[Nc[e]][0];\n if (e == 16) return 16;\n }\n }\n\n function ob(a, b) {\n return ((16777216 * a[0] + 65536 * a[1] + 256 * a[2] + 1 * a[3]) * Lf\n & 4278190080) >> b;\n }\n\n function Mf(a, b) {\n let c = 0;\n if (a == p) return 0;\n if (b == p) return Y(a, 'VP8_STATUS_INVALID_PARAM', 'NULL VP8Io parameter in VP8Decode().');\n if (!a.za && !Hd(a, b)) return 0;\n $(a.za);\n let d;\n if (b.Mb && !b.Mb(b)) Y(a, Nf, 'Frame setup failed'), d = a.a;\n else {\n b.Za && (a.A = 0);\n const e = uc[a.A];\n a.A == 2 ? (a.lb = 0, a.mb = 0) : (a.lb = b.t - e >> 4, a.mb = b.k - e >> 4, a.lb < 0 && (a.lb = 0), a.mb < 0 && (a.mb = 0));\n a.Ya = b.K + 15 + e >> 4;\n a.wb = b.Ka + 15 + e >> 4;\n a.wb > a.Ma && (a.wb = a.Ma);\n a.Ya > a.hb && (a.Ya = a.hb);\n d = L;\n }\n if (c = d == L) {\n if (c) {\n let g;\n b: {\n a.Ja = 0;\n if (a.qb) {\n const k = a.rc;\n if (!WebPWorkerReset(k)) {\n g = Y(a, cb, 'thread initialization failed.');\n break b;\n }\n k.Qd = a;\n k.Rd = a.oa.N;\n k.Ud = FinishRow;\n a.jb = a.A > 0 ? Od : Od - 1;\n } else a.jb = Of;\n g = 1;\n }\n let h;\n if (!(h = !g)) {\n let n;\n b: {\n const l = a.jb;\n const m = a.Ma;\n const t = 4 * m;\n const q = 32 * m;\n const r = m + 1;\n const u = a.A > 0 ? m * (a.qb ? 2 : 1) : 0;\n const v = Pf;\n const C = q * (16 * l + parseInt(3 * uc[a.A] / 2, 10));\n const A = a.Ga != p ? a.P.l * a.P.v : 0;\n const z = t + q + r + u + v + 384 + C + A + Pd;\n if (z != z) n = 0;\n else {\n if (z > a.Gb) {\n a.ib = 0;\n a.Gb = 0;\n if (a.ib == p) {\n n = Y(a, 'VP8_STATUS_OUT_OF_MEMORY', 'no memory during frame initialization.');\n break b;\n }\n a.Gb = z;\n }\n a.dc = 205;\n a.Xc = rc(205, 16 * m);\n a.Sc = rc(205, 8 * m);\n a.Vc = rc(205, 8 * m);\n a.M = u ? ic(Oc, u) : p;\n a.Sd = u ? 0 : p;\n a.oa.ha = 0;\n a.oa.M = a.M;\n $((v & Pd) == 0);\n a.Ea = rc(205, 1 * v);\n a.z = -12851;\n a.H = 16 * m;\n a.r = 8 * m;\n const Ha = uc[a.A];\n const G = Ha * a.H;\n const y = Ha / 2 * a.r;\n a.ca = U(C, 205);\n a.da = +G;\n a.aa = a.ca;\n a.ba = a.da + 16 * l * a.H + y;\n a.ra = a.aa;\n a.sa = a.ba + 8 * l * a.r + y;\n a.Xb = A ? U(A, x) : p;\n a.La = ic(Qd, r);\n a.dc = rc($b, t);\n n = 1;\n }\n }\n h = !n;\n }\n if (h) c = 0;\n else {\n b.width = a.P.l;\n b.height = a.P.v;\n b.w = 0;\n b.y = a.ca;\n b.D = a.da;\n b.c = a.aa;\n b.B = a.ba;\n b.S = a.ra;\n b.C = a.sa;\n b.F = a.H;\n b.Da = a.r;\n b.p = p;\n b.q = p;\n if (!Rd) {\n let B;\n for (B = -255; B <= 255; ++B) va[255 + B] = B < 0 ? -B : B, tc[255 + B] = va[255 + B] >> 1;\n for (B = -1020; B\n <= 1020; ++B) sc[1020 + B] = B < -128 ? -128 : B > 127 ? 127 : B;\n for (B = -112; B <= 112; ++B) oc[112 + B] = B < -16 ? -16 : B > 15 ? 15 : B;\n for (B = -255; B <= 510; ++B) oa[255 + B] = B < 0 ? 0 : B > 255 ? 255 : B;\n Rd = 1;\n }\n mc = pf;\n Pc = qf;\n Qc = nc;\n Rc = rf;\n Sd = uf;\n Td = vf;\n Ud = yf;\n Vd = zf;\n Wd = wf;\n Xd = xf;\n Yd = Af;\n Zd = Bf;\n $d = Dd;\n ae = Ed;\n be = sf;\n ce = tf;\n c = 1;\n }\n }\n if (c) {\n a: {\n for (a.d = 0; a.d < a.Ya; ++a.d) {\n const Qf = a.ic[a.d & a.Hb - 1];\n const db = a;\n const F = db.La[0];\n F.X = 0;\n F.ua = 0;\n jd(db.cc, 0, $b, db.cc.length);\n db.W = (db.A > 0 && db.d >= db.mb && db.d <= db.Ya) + 0;\n for (a.i = 0; a.i < a.Ma; a.i++) {\n var D;\n const H = a;\n const T = Qf;\n const ya = H.o;\n const S = H.La[0];\n const J = H.La[1 + H.i];\n H.Ca.ob && (H.Lb = !w(ya,\n H.R.Ta[0]) ? 0 + w(ya, H.R.Ta[1]) : 2 + w(ya, H.R.Ta[2]));\n J.Nb = H.pc ? w(ya, H.Pc) : 0;\n const O = H.dc;\n O[O.length - 1] = 0 + 4 * H.i;\n const Sc = H.cc;\n H.wa = !w(ya, 145);\n if (H.wa) {\n for (var ga = H.Eb, ja = 0, Z = ca, Z = 0; Z < 4; ++Z) {\n var V = Sc[Z];\n var R;\n for (R = 0; R < 4; ++R) {\n const ta = Rf[O[O[O.length - 1] + R]][V];\n var za = 0;\n do za = Sf[2 * za + w(ya, ta[za])]; while (za > 0);\n V = -za;\n O[O[O.length - 1] + R] = V;\n ga[ja] = V;\n ja++;\n }\n Sc[Z] = V;\n }\n } else {\n var V = w(ya, 156) ? w(ya, 128) ? de : ee : w(ya, 163) ? fe : ge;\n H.Eb[0] = V;\n for (za = 0; za < 4; ++za) O[za + O[O.length - 1]] = V;\n for (za = 0; za < 4; ++za) Sc[za] = V;\n }\n H.Tc = !w(ya, 142) ? ge : !w(ya, 114) ? fe\n : w(ya, 183) ? de : ee;\n if (ya.Ab) D = 0;\n else {\n if (J.Nb) S.X = J.X = 0, H.wa || (S.ua = J.ua = 0), H.ja = 0, H.Oa = 0;\n else {\n let ia = ca;\n let ka = ca;\n var sa = ca;\n var wa = Tf;\n const Aa = H.yb[H.Lb];\n var aa = H.z;\n const ma = H.La[0];\n const ua = U(4, 0);\n const xa = U(4, 0);\n let ea = U(4, 0);\n let pb = U(4, 0);\n let na = 0;\n let Ba = 0;\n var pa = ca;\n let qa = ca;\n let Sa = ca;\n var aa = rc(0, 384);\n if (H.wa) sa = 0, wa = H.R.z[3];\n else {\n const ab = U(16, 0);\n var Ca = J.ua + ma.ua;\n J.ua = ma.ua = (Mc(T, H.R.z[1], Ca, Aa.sb, 0, ab) > 0) + 0;\n for (var sa = 1, wa = H.R.z[0], qb = ab, Ta = aa, La = U(16, s), X = s, X = 0; X < 4; ++X) {\n var Da = qb[0 + X] + qb[12 + X];\n var Ea = qb[4 + X] + qb[8 + X];\n var Fa = qb[4 + X] - qb[8 + X];\n var Ga = qb[0 + X] - qb[12 + X];\n La[0 + X] = Da + Ea;\n La[8\n + X] = Da - Ea;\n La[4 + X] = Ga + Fa;\n La[12 + X] = Ga - Fa;\n }\n for (X = 0; X < 4; ++X) {\n const Oa = Ta[Ta.length - 1];\n const lb = La[0 + 4 * X] + 3;\n var Da = lb + La[3 + 4 * X];\n var Ea = La[1 + 4 * X] + La[2 + 4 * X];\n var Fa = La[1 + 4 * X] - La[2 + 4 * X];\n var Ga = lb - La[3 + 4 * X];\n Ta[Oa + 0] = Da + Ea >> 3;\n Ta[Oa + 16] = Ga + Fa >> 3;\n Ta[Oa + 32] = Da - Ea >> 3;\n Ta[Oa + 48] = Ga - Fa >> 3;\n Ta[Ta.length - 1] += 64;\n }\n aa[aa.length - 1] = 0;\n }\n ea = Nb(vc[J.X & 15]);\n pb = Nb(vc[ma.X & 15]);\n for (qa = 0; qa < 4; ++qa) {\n for (var Eb = pb[qa], pa = 0; pa < 4; ++pa) {\n var Ca = Eb + ea[pa];\n var Ka = Mc(T, wa, Ca, Aa.sc, sa, aa);\n ea[pa] = Eb = (Ka > 0) + 0;\n xa[pa] = (aa[aa[aa.length - 1] + 0] != 0) + 0;\n ua[pa] = (Ka > 1) + 0;\n aa[aa.length\n - 1] += 16;\n }\n pb[qa] = Eb;\n Ba |= ob(xa, 24 - 4 * qa);\n na |= ob(ua, 24 - 4 * qa);\n }\n ia = ob(ea, 24);\n ka = ob(pb, 24);\n ea = Nb(vc[J.X >> 4]);\n pb = Nb(vc[ma.X >> 4]);\n for (Sa = 0; Sa < 4; Sa += 2) {\n for (qa = 0; qa < 2; ++qa) {\n Eb = pb[Sa + qa];\n for (pa = 0; pa < 2; ++pa) Ca = Eb + ea[Sa + pa], Ka = Mc(T, H.R.z[2], Ca, Aa.qc, 0, aa), ea[Sa + pa] = Eb = (Ka > 0) + 0, xa[2 * qa + pa] = (aa[aa[aa.length - 1] + 0] != 0) + 0, ua[2 * qa + pa] = (Ka > 1) + 0, aa[aa.length - 1] += 16;\n pb[Sa + qa] = Eb;\n }\n Ba |= ob(xa, 8 - 2 * Sa);\n na |= ob(ua, 8 - 2 * Sa);\n }\n ia |= ob(ea, 20);\n ka |= ob(pb, 20);\n J.X = ia;\n ma.X = ka;\n H.z = aa;\n H.Oa = na + 0;\n H.ja = na | Ba;\n J.Nb = !H.ja + 0;\n }\n D = !T.Ab;\n }\n if (!D) {\n c = Y(a, 'VP8_STATUS_NOT_ENOUGH_DATA',\n `Premature end-of-file encountered.${a.i} ${a.d}`);\n break a;\n }\n const P = a;\n const da = P.Ea;\n const Ma = Tc;\n const Ua = P.Ea;\n const Va = Uc;\n const Wa = P.Ea;\n const Xa = he;\n if (P.i > 0) {\n for (var ba = ca, ba = -1; ba < 16; ++ba) Ec(da, Ma + ba * f - 4, da, Ma + ba * f + 12);\n for (ba = -1; ba < 8; ++ba) Ec(Ua, Va + ba * f - 4, Ua, Va + ba * f + 4), Ec(Wa, Xa + ba * f - 4, Wa, Xa + ba * f + 4);\n } else {\n for (ba = 0; ba < 16; ++ba) da[Ma + ba * f - 1] = 129;\n for (ba = 0; ba < 8; ++ba) Ua[Va + ba * f - 1] = 129, Wa[Xa + ba * f - 1] = 129;\n P.d > 0 && (da[Ma - 1 - f] = Ua[Va - 1 - f] = Wa[Xa - 1 - f] = 129);\n }\n const Qa = P.Xc;\n const Ra = 16 * +P.i;\n const mb = P.Sc;\n const vb = 8 * +P.i;\n const wb = P.Vc;\n const xb = 8 * +P.i;\n const Za = P.z;\n let fa = ca;\n if (P.d > 0) {\n N(da, Ma - f, Qa, Ra,\n 16), N(Ua, Va - f, mb, vb, 8), N(Wa, Xa - f, wb, xb, 8);\n } else if (P.i == 0) {\n for (i = 0; i < 21; ++i) da[Ma - f - 1 + i] = 127;\n for (i = 0; i < 9; ++i) Ua[Va - f - 1 + i] = 127;\n for (i = 0; i < 9; ++i) Wa[Xa - f - 1 + i] = 127;\n }\n if (P.wa) {\n const Ya = Ma - f + 16;\n P.d > 0 && (P.i >= P.Ma - 1 ? da[Ya + 0] = da[Ya + 1] = da[Ya + 2] = da[Ya + 3] = Qa[Ra + 15] : N(da, Ya + 0, Qa, Ra + 16, 4));\n for (let Fb = 0; Fb < 4; ++Fb) da[Fb + Ya + 4 * f] = da[Fb + Ya + 4 * f] = da[Fb + Ya + 8 * f] = da[Fb + Ya + 12 * f] = da[Fb + Ya + 0];\n for (fa = 0; fa < 16; fa++) {\n var ac = da;\n var bc = Ma + ie[fa];\n Uf[P.Eb[fa]](ac, bc);\n P.Oa & 1 << fa ? mc(Za, 16 * +fa, ac, bc, 0) : P.ja & 1 << fa && Qc(Za, 16 * +fa, ac, bc);\n }\n } else {\n var $a = Fd(P, P.Eb[0]);\n Vf[$a](da, Ma);\n if (P.ja) for (fa = 0; fa < 16; fa++) ac = da, bc = Ma + ie[fa], P.Oa & 1 << fa ? mc(Za, 16 * +fa, ac, bc, 0) : P.ja & 1 << fa && Qc(Za, 16 * +fa, ac, bc);\n }\n $a = Fd(P, P.Tc);\n je[$a](Ua, Va);\n je[$a](Wa, Xa);\n if (P.ja & 983040) {\n const zb = P.z;\n var Pa = 256;\n P.Oa & 983040 ? Pc(zb, Pa, Ua, Va) : Rc(zb, Pa, Ua, Va);\n }\n if (P.ja & 15728640) {\n const Ab = P.z;\n var Pa = 320;\n P.Oa & 15728640 ? Pc(Ab, Pa, Wa, Xa) : Rc(Ab, Pa, Wa, Xa);\n }\n P.d < P.hb - 1 && (N(Qa, Ra, da, Ma + 15 * f, 16), N(mb, vb, Ua, Va + 7 * f, 8), N(wb, xb, Wa, Xa + 7 * f, 8));\n const Q = a;\n if (Q.A > 0) {\n const kb = Q.M[1 + Q.i];\n const Kb = Q.La[1 + Q.i].Nb;\n let ha = Q.Zb[Q.Lb];\n Q.ga.oc && (ha\n += Q.ga.Lc[0], Q.wa && (ha += Q.ga.Gc[0]));\n ha = ha < 0 ? 0 : ha > 63 ? 63 : ha;\n kb.zc = ha;\n Q.ga.kb > 0 && (ha = Q.ga.kb > 4 ? ha >> 2 : ha >> 1, ha > 9 - Q.ga.kb && (ha = 9 - Q.ga.kb));\n kb.yc = ha < 1 ? 1 : ha;\n kb.ab = (!Kb || Q.wa) + 0;\n }\n for (var Ia = ca, Bb = 8 * Q.Ja * Q.r, Qb = Q.ca, Ub = Q.da + 16 * Q.i + 16 * Q.Ja * Q.H, Wb = Q.aa, Xb = Q.ba + 8 * Q.i + Bb, Yb = Q.ra, Zb = Q.sa + 8 * Q.i + Bb, Ia = 0; Ia < 16; ++Ia) N(Qb, Ub + Ia * Q.H, Q.Ea, +Tc + Ia * f, 16);\n for (Ia = 0; Ia < 8; ++Ia) N(Wb, Xb + Ia * Q.r, Q.Ea, +Uc + Ia * f, 8), N(Yb, Zb + Ia * Q.r, Q.Ea, +he + Ia * f, 8);\n }\n const K = a;\n const I = b;\n var cc = 1;\n const eb = K.oa;\n if (K.qb) {\n const nb = K.rc;\n var cc = cc & WebPWorkerSync(nb);\n $(nb.a == OK);\n if (cc) {\n eb.N = I;\n eb.ha = K.Ja;\n eb.d = K.d;\n eb.W = K.W;\n if (eb.W) {\n const hc = eb.M;\n eb.M = K.M;\n K.M = hc;\n }\n WebPWorkerLaunch(nb);\n ++K.Ja == K.jb && (K.Ja = 0);\n }\n } else {\n eb.d = K.d;\n eb.W = K.W;\n b: {\n let Hb = 1;\n const rb = K.oa;\n const ib = uc[K.A];\n const yb = ib * K.H;\n const dc = parseInt(ib / 2) * K.r;\n const Ib = 16 * rb.ha * K.H;\n const jb = 8 * rb.ha * K.r;\n const Jb = K.ca;\n const Lb = K.da - yb + Ib;\n const Ob = K.aa;\n const Pb = K.ba - dc + jb;\n const Rb = K.ra;\n const Sb = K.sa - dc + jb;\n const jc = rb.d == 0;\n const Tb = (rb.d >= K.hb - 1) + 0;\n var ra = 16 * rb.d;\n let fb = 16 * (rb.d + 1);\n if (rb.W) {\n const pc = K;\n let wc = s;\n const kc = pc.oa.d;\n $(pc.oa.W);\n for (wc = pc.lb; wc < pc.wb; ++wc) {\n const Na = pc;\n const ec = wc;\n const Vb = kc;\n const xc = Na.oa;\n const gb = Na.H;\n const fc = xc.M[1 + ec];\n const sb = Na.ca;\n const tb = Na.da + 16 * xc.ha\n * gb + 16 * ec;\n const Gb = fc.zc;\n const hb = fc.yc;\n const Ja = 2 * Gb + hb;\n if (Gb != 0) {\n if (Na.A == 1) ec > 0 && ae(sb, tb, gb, Ja + 4), fc.ab && ce(sb, tb, gb, Ja), Vb > 0 && $d(sb, tb, gb, Ja + 4), fc.ab && be(sb, tb, gb, Ja);\n else {\n const gc = Na.r;\n const yc = Na.aa;\n const zc = Na.ba + 8 * xc.ha * gc + 8 * ec;\n const Ac = Na.ra;\n const Bc = Na.sa + 8 * xc.ha * gc + 8 * ec;\n const ub = Na.Ac.fb ? Gb >= 40 ? 2 : Gb >= 15 ? 1 : 0 : Gb >= 40 ? 3 : Gb >= 20 ? 2 : Gb >= 15 ? 1 : 0;\n ec > 0 && (Td(sb, tb, gb, Ja + 4, hb, ub), Vd(yc, zc, Ac, Bc, gc, Ja + 4, hb, ub));\n fc.ab && (Xd(sb, tb, gb, Ja, hb, ub), Zd(yc, zc, Ac, Bc, gc, Ja, hb, ub));\n Vb > 0 && (Sd(sb, tb, gb, Ja + 4, hb, ub), Ud(yc, zc, Ac, Bc, gc, Ja + 4, hb, ub));\n fc.ab && (Wd(sb, tb, gb,\n Ja, hb, ub), Yd(yc, zc, Ac, Bc, gc, Ja, hb, ub));\n }\n }\n }\n }\n if (I.put) {\n jc ? (I.y = K.ca, I.D = K.da + Ib, I.c = K.aa, I.B = K.ba + jb, I.S = K.ra, I.C = K.sa + jb) : (ra -= ib, I.y = Jb, I.D = Lb, I.c = Ob, I.B = Pb, I.S = Rb, I.C = Sb);\n Tb || (fb -= ib);\n fb > I.K && (fb = I.K);\n if (K.Ga != p && ra < fb && (ra == 0 ? (I.p = qd(K, ra, fb - ra), I.q = 0) : I.q = qd(K, ra, fb - ra), I.p == p)) {\n cc = Y(K, W, 'Could not decode alpha data.');\n break b;\n }\n if (ra < I.k) {\n const qc = I.k - ra;\n var ra = I.k;\n $(!(qc & 1));\n I.D += K.H * qc;\n I.B += K.r * (qc >> 1);\n I.C += K.r * (qc >> 1);\n I.p != p && (I.q += I.width * qc);\n }\n ra < fb && (I.D += I.t, I.B += I.t >> 1, I.C += I.t >> 1, I.p != p && (I.q += I.t),\n I.w = ra - I.k, I.m = I.Ka - I.t, I.h = fb - ra, Hb = I.put(I));\n }\n rb.ha + 1 == K.jb && !Tb && (N(K.ca, K.da - yb, Jb, Lb + 16 * K.H, yb), N(K.aa, K.ba - dc, Ob, Pb + 8 * K.r, dc), N(K.ra, K.sa - dc, Rb, Sb + 8 * K.r, dc));\n cc = Hb;\n }\n }\n if (!cc) {\n c = Y(a, 'VP8_STATUS_USER_ABORT', 'Output aborted.');\n break a;\n }\n }\n let Cb;\n if (!(Cb = a.qb && !WebPWorkerSync(a.rc))) {\n let Db;\n if (Db = a.fc > 0) $(a), $(a.fc > 0), Db = !1;\n Cb = Db;\n }\n c = Cb ? 0 : 1;\n }\n }\n const lc = c;\n b.Pb && b.Pb(b);\n c = lc & 1;\n }\n if (!c) return ke(a), 0;\n a.za = 0;\n return c;\n }\n\n function ke(a) {\n a != p && (a.ib && (a.ib = 0), a.ib = p, a.Gb = 0, a.za = 0);\n }\n\n function Aa(a, b) {\n return a + (1 << b) - 1 >> b;\n }\n\n function hc(a, b, c, d, e) {\n const g = vb[c] + wb[b] >> ea;\n b = xb[b];\n d[e + 0] = ia[a + Za[c] - J];\n d[e + 1] = ia[a + g - J];\n d[e + 2] = ia[a + b - J];\n }\n\n function le(a, b, c, d, e) {\n const g = vb[c] + wb[b] >> ea;\n b = xb[b];\n d[e + 0] = ia[a + Za[c] - J] & 248 | ia[a + g - J] >> 5;\n d[e + 1] = ia[a + g - J] << 3 & 224 | ia[a + b - J] >> 3;\n }\n\n function me(a, b, c, d, e) {\n d[e + 0] = 255;\n hc(a, b, c, d, e + 1);\n }\n\n function ne(a, b, c, d, e) {\n const g = xb[b];\n d[e + 0] = Hb[a + Za[c] - J] << 4 | Hb[a + (vb[c] + wb[b] >> ea) - J];\n d[e + 1] = 15 | Hb[a + g - J] << 4;\n }\n\n function Vc(a, b, c, d, e) {\n const g = Za[c];\n c = vb[c] + wb[b] >> ea;\n d[e + 0] = ia[a + xb[b] - J];\n d[e + 1] = ia[a + c - J];\n d[e + 2] = ia[a + g - J];\n }\n\n function oe(a, b, c, d, e) {\n Vc(a, b, c, d, e);\n d[e + 3] = 255;\n }\n\n function pe(a, b, c, d, e) {\n hc(a, b, c, d, e);\n d[e + 3] = 255;\n }\n\n function ib(a, b, c) {\n a[b] = ((((a[b] & 4278255360) >>> 0) + ((c & 4278255360) >>> 0) & 4278255360) >>> 0 | (a[b] & 16711935) + (c & 16711935) & 16711935) >>> 0;\n }\n\n function ka(a, b) {\n return (((a ^ b) & 4278124286) >>> 1) + ((a & b) >>> 0) >>> 0;\n }\n\n function $a(a) {\n return a < 256 && a > 0 ? a : a <= 0 ? 0 : ~a >> 24 & 255;\n }\n\n function yb(a, b) {\n return $a(a + parseInt((a - b) / 2, 10));\n }\n\n function Wc() {\n return qe;\n }\n\n function Xc(a, b) {\n a &= 255;\n b &= 255;\n a > 127 && (a -= 256);\n b > 127 && (b -= 256);\n return a * b >>> 5;\n }\n\n function re(a,\n b, c, d, e, g, k) {\n var h = s;\n const n = 8 >> a.n;\n const l = a.U;\n const f = a.u;\n if (n < 8) {\n a = (1 << a.n) - 1;\n for (var t = (1 << n) - 1, h = b; h < c; ++h) {\n b = 0;\n for (var q = s, q = 0; q < l; ++q) (q & a) == 0 && (b = d[e++] >> 8 & 255), g[k++] = f[b & t], b >>= n;\n }\n } else for (h = b; h < c; ++h) for (q = 0; q < l; ++q) g[k++] = f[d[e++] >> 8 & 255];\n }\n\n function se(a, b, c, d, e) {\n for (c = b + c; b < c;) {\n const g = a[b++];\n d[e++] = g >> 16 & 255;\n d[e++] = g >> 8 & 255;\n d[e++] = g >> 0 & 255;\n d[e++] = g >> 24 & 255;\n }\n }\n\n function te(a, b, c, d, e) {\n for (c = b + c; b < c;) {\n const g = a[b++];\n d[e++] = g >> 16 & 240 | g >> 12 & 15;\n d[e++] = g >> 0 & 240 | g >> 28 & 15;\n }\n }\n\n function Ib(a, b, c, d, e) {\n for (c = b + c; b < c;) {\n const g = a[b++];\n d[e++] = g >> 24 & 255;\n d[e++] = g >> 16 & 255;\n d[e++] = g >> 8 & 255;\n d[e++] = g >> 0 & 255;\n }\n }\n\n function ue(a, b, c, d) {\n if (T(a, 8) != ve) return 0;\n b[0] = T(a, we) + 1;\n c[0] = T(a, we) + 1;\n d[0] = T(a, 1);\n T(a, Wf);\n return 1;\n }\n\n function xe(a, b) {\n let c = s;\n if (a < 4) return a + 1;\n c = a - 2 >> 1;\n return (2 + (a & 1) << c) + T(b, c) + 1;\n }\n\n function Oa(a, b) {\n if (b.Q + 8 > b.ya) {\n var c = a.Y;\n var d = 0;\n for ($(c != p); c[d].s != 0;) {\n var e = c;\n var g = b;\n const k = g.T >> g.g & 1;\n g.L ? g.fa = 1 : (++g.g, g.g >= 8 && Sb(g), g.Q == g.ya && g.g == 32 && (g.L = 1));\n d = d + e[d].s + k;\n }\n return c[d].kc;\n }\n c = a.Y;\n d = 0;\n for ($(c != p); c[d].s != 0;) {\n e = c, g = b.T >> b.g & 1, ++b.g, d = d\n + e[d].s + g;\n }\n return c[d].kc;\n }\n\n function zb(a, b) {\n if (a != p) for (var c = s, d = s, c = 0; c < b; ++c) for (var e = a[c].va, d = 0; d < Yc; ++d) ja(e[d]);\n }\n\n function ye(a, b, c) {\n b = a.eb == 0 ? 0 : a.ac[a.bd + a.Ec * (c >> a.eb) + (b >> a.eb)];\n $(b < a.hc);\n return a.Db[+b];\n }\n\n function ze(a, b, c, d) {\n let e = a.Na;\n const g = a.O;\n const k = g + b;\n var h = c;\n var f = d;\n d = a.Xa;\n c = a.vb;\n for (N(d, c, h, f, a.l * b); e-- > 0;) {\n b = a.nc[e];\n let l = g;\n var m = k;\n var t = h;\n var q = f;\n var f = d;\n var h = c;\n $(l < m);\n $(m <= b.Vb);\n switch (b.Qc) {\n case Ae:\n t = 0;\n for (b = h + (m - l) * b.U; h < b;) {\n var m = f;\n var q = h;\n var r = m[q] >> 8 & 255;\n var u = (m[q] & 16711935) >>> 0;\n var u = u + (r << 16 | r);\n var u = u & 16711935;\n f[h++] = ((m[q] & 4278255360)\n >>> 0 | u) >>> 0;\n l == 32 && t++;\n }\n break;\n case Be:\n var v = b;\n var C = l;\n var t = m;\n var q = f;\n var r = h;\n var u = v.U;\n if (C == 0) {\n var A = s;\n ib(q, r, qe);\n for (A = 1; A < u; ++A) ib(q, r + A, q[r + A - 1]);\n r += u;\n ++C;\n }\n for (var z = (1 << v.n) - 1, Ha = Aa(u, v.n), w = v.u, v = +(C >> v.n) * Ha; C < t;) {\n var y = w;\n var B = v;\n let G = p;\n ib(q, r, q[r - u + 0]);\n G = Ce[y[B++] >> 8 & 15];\n for (A = 1; A < u; ++A) {\n let F = E;\n (A & z) == 0 && (G = Ce[y[B++] >> 8 & 15]);\n F = G(q[r + A - 1], q, r + A - u);\n ib(q, r + A, F);\n }\n r += u;\n ++C;\n (C & z) == 0 && (v += Ha);\n }\n m != b.Vb && (b = b.U, N(f, h - b, f, h + (m - l - 1) * b, b));\n break;\n case De:\n t = b.U;\n q = (1 << b.n) - 1;\n r = Aa(t, b.n);\n u = b.u;\n for (b = +(l >> b.n) * r; l < m;) {\n A = u;\n C = b;\n z = M(Xf);\n Ha = s;\n for (Ha = 0; Ha < t; ++Ha) (Ha & q) == 0 && (w = A[C++], v = z, v.Cc = w >> 0 & 255, v.Bc = w >> 8 & 255, v.Kc = w >> 16 & 255), w = f[h + Ha], v = w >>> 8, y = w >>> 16, B = w, y += Xc(z.Cc, v), y &= 255, B += Xc(z.Bc, v), B += Xc(z.Kc, y), B &= 255, f[h + Ha] = (w & 4278255360 | y << 16 | B) >>> 0;\n h += t;\n ++l;\n (l & q) == 0 && (b += r);\n }\n break;\n case Ee:\n t == f && b.n > 0 ? (t = (m - l) * Aa(b.U, b.n), q = h + (m - l) * b.U - t, memmove(f, q, f, h, t), re(b, l, m, f, q, f, h)) : re(b, l, m, t, q, f, h);\n }\n h = d;\n f = c;\n }\n }\n\n function Yf(a, b) {\n var c = a.V;\n var d = a.Ha + a.l * a.O;\n var e = b - a.O;\n if (!(e <= 0)) {\n ze(a, e, c, d);\n var g = a.N;\n var c = a.Xa;\n let k = [a.vb];\n var d = a.O;\n var e = b;\n var h = k;\n var f = g.width;\n $(d < e);\n $(g.t < g.Ka);\n e > g.K && (e = g.K);\n if (d < g.k) {\n var l = g.k - d;\n var d = g.k;\n h[0] += f * l;\n }\n d >= e ? d = 0 : (h[0] += g.t, g.w = d - g.k, g.m = g.Ka - g.t, g.h = e - d, d = 1);\n if (d) {\n k = k[0];\n d = a.Ib;\n e = g.width;\n if (d.J < ua) {\n var m = d.c.RGBA;\n var h = m.ma;\n let t = m.Sa + a.xa * m.f;\n if (g.I) c = EmitRescaledRows(a, c, k, e, g.h, h, t, m.f);\n else {\n for (var f = d.J, l = g.m, g = g.h, m = m.f, q = g; q-- > 0;) {\n const r = c;\n let u = k;\n let v = l;\n const C = h;\n let A = t;\n switch (f) {\n case Qa:\n for (v = u + v; u < v;) {\n var z = r[u++];\n C[A++] = z >> 16 & 255;\n C[A++] = z >> 8 & 255;\n C[A++] = z >> 0 & 255;\n }\n break;\n case jb:\n se(r, u, v, C, A);\n break;\n case Ob:\n se(r, u, v, C, A);\n WebPApplyAlphaMultiply(C, 0, v,\n 1, 0);\n break;\n case Zc:\n for (v = u + v; u < v;) z = r[u++], C[A++] = z >> 0 & 255, C[A++] = z >> 8 & 255, C[A++] = z >> 16 & 255;\n break;\n case Pa:\n Ib(r, u, v, C, A);\n break;\n case Pb:\n Ib(r, u, v, C, A);\n WebPApplyAlphaMultiply(C, 0, v, 1, 0);\n break;\n case Ab:\n Ib(r, u, v, C, A);\n break;\n case Bb:\n Ib(r, u, v, C, A);\n WebPApplyAlphaMultiply(C, 1, v, 1, 0);\n break;\n case kb:\n te(r, u, v, C, A);\n break;\n case Qb:\n te(r, u, v, C, A);\n WebPApplyAlphaMultiply4444(C, v, 1, 0);\n break;\n case Fe:\n for (v = u + v; u < v;) z = r[u++], C[A++] = z >> 16 & 248 | z >> 13 & 7, C[A++] = z >> 5 & 224 | z >> 3 & 31;\n break;\n default:\n $(0);\n }\n k += e;\n t += m;\n }\n c = g;\n }\n a.xa += c;\n } else {\n a.xa = g.I ? EmitRescaledRowsYUVA(a, c, k, e, g.h) : EmitRowsYUVA(a, c, k, e, g.m, g.h);\n }\n $(a.xa <= d.height);\n }\n a.O = b;\n $(a.O <= a.v);\n }\n }\n\n function lc(a, b, c, d, e, g) {\n let k = 1;\n let h = 0;\n let f = 0;\n const l = a.o;\n const m = a.cb;\n let t = m.Db;\n let q = c;\n let r = c;\n c += d * e;\n e = Ba + Ge;\n const u = e + m.xb;\n const v = m.xb > 0 ? m.Yb : p;\n const C = m.Dc;\n let A = !1;\n $(t != p);\n for (; !l.L && q < c;) {\n let z = s;\n A || ((h & C) == 0 && (t = ye(m, h, f)), Da(l), z = Oa(t.va[Zf], l));\n if (z < Ba || A) {\n if (!A) {\n var w = k = A = s;\n var y = s;\n Da(l);\n A = Oa(t.va[$f], l);\n k = z;\n Da(l);\n w = Oa(t.va[ag], l);\n Da(l);\n y = Oa(t.va[bg], l);\n b[q] = (y << 24 >>> 0) + (A << 16) + (k << 8) + w;\n }\n A = !1;\n ++q;\n ++h;\n if (h >= d && (h = 0, ++f, g != p && f\n % $c == 0 && g(a, f), v != p)) for (; r < q;) k = b[r++], v.ea[ad * k >>> v.bb] = k;\n } else if (z < e) {\n w = w = s;\n k = xe(z - Ba, l);\n z = Oa(t.va[cg], l);\n Da(l);\n w = xe(z, l);\n w > He ? w -= He : (z = dg[w - 1], z = (z >> 4) * d + (8 - (z & 15)), w = z >= 1 ? z : 1);\n z = s;\n for (z = 0; z < k; ++z) b[q + z] = b[q + z - w];\n q += k;\n for (h += k; h >= d;) h -= d, ++f, g != p && f % $c == 0 && g(a, f);\n if (q < c && (t = ye(m, h, f), v != p)) for (; r < q;) k = b[r++], v.ea[ad * k >>> v.bb] = k;\n } else if (z < u) {\n A = z - e;\n for ($(v != p); r < q;) z = b[r++], v.ea[ad * z >>> v.bb] = z;\n z = b;\n w = q;\n y = v;\n $(A <= -1 >>> y.bb);\n z[w] = y.ea[A];\n A = !0;\n continue;\n }(k = !l.fa) || End;\n }\n g != p && g(a, f);\n l.fa || !k || l.L && q < c ? (k = 0, a.a = !l.L ? W : Ie) : q == c && (a.Ob = Db);\n return k;\n }\n\n function bd(a) {\n $(a);\n a.ac = p;\n zb(a.Db, a.hc);\n const b = a.Yb;\n b != p && (b.ea = p, b.ea = p);\n $(a);\n }\n\n function sd() {\n const a = M(eg);\n if (a == p) return p;\n a.a = L;\n a.Wa = cd;\n a.Ob = cd;\n return a;\n }\n\n function sa(a) {\n let b = s;\n if (a != p) {\n bd(a.cb);\n a.V = p;\n a.V = p;\n for (b = 0; b < a.Na; ++b) {\n const c = a.nc[b];\n c.u = p;\n c.u = p;\n }\n a.Na = 0;\n a.Ub = 0;\n a.Mc = p;\n a.Mc = p;\n a.Ib = p;\n }\n }\n\n function Ka(a, b, c, d, e) {\n var g = 1;\n a = [a];\n b = [b];\n for (var k = d.o, h = d.cb, f = p, l = p, l = 0; ;) {\n if (c) {\n for (; g && T(k, 1);) {\n var m = a;\n var t = b;\n var q = d;\n var r = 1;\n var u = q.o;\n var g = q.nc[q.Na];\n var v = T(u, 2);\n if (q.Ub & 1 << v) g = 0;\n else {\n q.Ub\n |= 1 << v;\n g.Qc = v;\n g.U = m[0];\n g.Vb = t[0];\n g.u = [p];\n g.b = 0;\n ++q.Na;\n $(q.Na <= Je);\n switch (v) {\n case Be:\n case De:\n g.n = T(u, 3) + 2;\n r = Ka(Aa(g.U, g.n), Aa(g.Vb, g.n), 0, q, g.u);\n break;\n case Ee:\n t = T(u, 8) + 1;\n r = t > 16 ? 0 : t > 4 ? 1 : t > 2 ? 2 : 3;\n m[0] = Aa(g.U, r);\n g.n = r;\n if (m = r = Ka(t, 1, 0, q, g.u)) {\n if (m = t, q = g, r = s, t = 1 << (8 >>> q.n) >>> 0, u = Array(t), u == p) m = 0;\n else {\n var v = q.u[0];\n var C = q.b;\n u[0] = q.u[0][q.b + 0];\n for (r = 1; r < m; ++r) u[r] = ((((v[C + r] & 4278255360) >>> 0) + ((u[r - 1] & 4278255360) >>> 0) & 4278255360) >>> 0 | (v[C + r] & 16711935) + (u[r - 1] & 16711935) & 16711935) >>> 0;\n for (; r < t; ++r) u[r] = 0;\n q.u[0] = p;\n q.b = p;\n q.u[0] = u;\n q.b = 0;\n m = 1;\n }\n }\n r = m;\n break;\n case Ae:\n break;\n default:\n $(0);\n }\n g.u = g.u[0];\n g = r;\n }\n }\n }\n if (g && T(k, 1) && (l = T(k, 4), g = l >= 1 && l <= fg, !g)) {\n d.a = W;\n break;\n }\n if (g) {\n a: {\n var g = d;\n var A = a[0];\n var z = b[0];\n var m = l;\n var C = v = s;\n var C = g.o;\n var q = g.cb;\n var r = [p];\n var t = p;\n var u = 1;\n if (c && T(C, 1)) {\n var v = T(C, 3) + 2;\n var A = Aa(A, v);\n var w = Aa(z, v);\n var z = A * w;\n if (!Ka(A, w, 0, g, r)) {\n g.a = W;\n zb(t, u);\n g = 0;\n break a;\n }\n r = r[0];\n q.eb = v;\n for (v = 0; v < z; ++v) A = r[v] >>> 8 & 65535, r[v] = A, A >= u && (u = A + 1);\n }\n if (C.fa) zb(t, u), g = 0;\n else if ($(u <= 65536), t = ld(u, gg), t == p) g.a = cb, zb(t, u), g = 0;\n else {\n for (v = 0; v < u; ++v) {\n z = t[v].va;\n for (C = 0; C < Yc; ++C) {\n A = hg[C];\n C == 0 && m > 0 && (A += 1 << m);\n b: {\n const y = A;\n var A = g;\n const G = z[+C];\n var B = 0;\n var w = A.o;\n if (T(w, 1)) {\n var F = Array(2);\n var D = Array(2);\n var L = Array(2);\n var B = T(w, 1) + 1;\n var J = T(w, 1);\n F[0] = T(w, J == 0 ? 1 : 8);\n D[0] = 0;\n L[0] = B - 1;\n B == 2 && (F[1] = T(w, 8), D[1] = 1, L[1] = B - 1);\n c: {\n var J = 0;\n var H = s;\n $(G != p);\n $(L != p);\n $(D != p);\n $(F != p);\n if (nd(G, B)) {\n for (H = 0; H < B; ++H) {\n if (D[H] != pd) {\n if (F[H] < 0 || F[H] >= y) {\n (J = J && ma(G)) || ja(G);\n B = J;\n break c;\n }\n if (!jc(G, F[H], D[H], L[H])) {\n (J = J && ma(G)) || ja(G);\n B = J;\n break c;\n }\n }\n }(J = (J = 1) && ma(G)) || ja(G);\n B = J;\n } else B = 0;\n }\n } else {\n B = s;\n D = [];\n F = T(w, 4) + 4;\n if (F > Ke) {\n A.a = W;\n A = 0;\n break b;\n }\n L = Array(y);\n if (L == p) {\n A.a = cb;\n A = 0;\n break b;\n }\n for (B = 0; B < F; ++B) D[ig[B]] = T(w, 3);\n c: {\n var B = A;\n var O = D;\n var D = y;\n var F = L;\n var J = 0;\n var H = B.o;\n let S = s;\n let V = s;\n let Y = jg;\n const Z = M(Le);\n if (od(Z, O, Ke)) {\n if (T(H, 1)) {\n if (S = 2 + 2 * T(H, 3), V = 2 + T(H, S), V > D) {\n B.a = W;\n ja(Z);\n B = J;\n break c;\n }\n } else V = D;\n for (S = 0; S < D;) {\n var R = s;\n if (V-- == 0) break;\n Da(H);\n R = Oa(Z, H);\n if (R < Me) F[S++] = R, R != 0 && (Y = R);\n else {\n var O = R == kg;\n var R = R - Me;\n const ea = lg[R];\n var R = T(H, mg[R]) + ea;\n if (S + R > D) {\n B.a = W;\n ja(Z);\n B = J;\n break c;\n }\n for (O = O ? Y : 0; R-- > 0;) F[S++] = O;\n }\n }\n J = 1;\n ja(Z);\n B = J;\n } else B.a = W, B = 0;\n }\n B && (B = od(G, L, y));\n }(B = B && !w.fa) ? A = 1 : (A.a = W, A = 0);\n }\n if (!A) {\n zb(t, u);\n g = 0;\n break a;\n }\n }\n }\n q.ac = r;\n q.hc = u;\n q.Db = t;\n g = 1;\n }\n }\n }\n if (!g) {\n d.a = W;\n break;\n }\n if (l > 0) {\n if (h.xb = 1 << l, m = h.Yb, q = 1 << l, $(m != p), $(l > 0), m.ea = U(q, 0), m.ea == p ? l = 0 : (m.bb = 32 - l, l = 1), !l) {\n d.a = cb;\n g = 0;\n break;\n }\n } else h.xb = 0;\n l = d;\n m = a[0];\n q = b[0];\n r = l.cb;\n t = r.eb;\n l.l = m;\n l.v = q;\n r.Ec = Aa(m, t);\n r.Dc = t == 0 ? -1 : (1 << t) - 1;\n if (c) {\n d.Ob = Cb;\n break;\n }\n f = Array(a * b);\n l = 0;\n if (f == p) {\n d.a = cb;\n g = 0;\n break;\n }\n g = (g = lc(d, f, l, a, b, p)) && !k.fa;\n break;\n }\n g ? (e != p ? e[0] = f : ($(f == p), $(c)), c || bd(h)) : (bd(h), d.a == W && d.o.L && (d.a = Ie));\n return g;\n }\n\n function xd(a, b) {\n const c = a.l * a.v;\n const d = c + b + b * $c;\n $(a.l <= b);\n a.V = Array(d);\n a.Ha = 0;\n if (a.V == p) {\n return a.Xa = p, a.a = cb, 0;\n }\n a.Xa = a.V;\n a.vb = a.Ha + c + b;\n return 1;\n }\n\n function mf(a, b) {\n var c = b - a.O;\n var d = a.V;\n var e = a.Ha + a.l * a.O;\n if (!(c <= 0)) {\n ze(a, c, d, e);\n for (var e = a.N.width, c = e * c, d = a.N.ka, e = a.N.fd + e * a.O, g = a.Xa, k = a.vb, h = s, h = 0; h < c; ++h) d[e + h] = g[k + h] >>> 8 & 255;\n a.O = a.xa = b;\n }\n }\n\n function ng(a, b) {\n const c = [s];\n const d = [s];\n const e = [s];\n if (a == p) return 0;\n if (b == p) return a.a = ta, 0;\n a.N = b;\n a.a = L;\n Rb(a.o, b.data, b.b, b.e);\n if (!ue(a.o, c, d, e)) return a.a = W, sa(a), $(a.a != L), 0;\n a.Ob = cd;\n b.width = c[0];\n b.height = d[0];\n a.Wa = Cb;\n return !Ka(c[0], d[0], 1, a, p) ? (sa(a), $(a.a != L), 0) : 1;\n }\n\n function og(a) {\n let b = p;\n let c = p;\n if (a == p) return 0;\n b = a.N;\n $(b != p);\n c = b.ka;\n $(c != p);\n a.Ib = c.j;\n a.Hc = c.Hc;\n $(a.Ib != p);\n if (!Ne(c.Qa, b, Pa)) return a.a = ta, sa(a), $(a.a != L), 0;\n if (!xd(a, b.width) || b.I && !AllocateAndInitRescaler(a, b)) return sa(a), $(a.a != L), 0;\n a.Wa = Db;\n if (!lc(a, a.V, a.Ha, a.l, a.v, Yf)) return sa(a), $(a.a != L), 0;\n c.ec = a.xa;\n sa(a);\n return 1;\n }\n\n function wa(a, b) {\n return a < 0 ? 0 : a > b ? b : a;\n }\n\n function ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, C, w, z) {\n let y; const G = C - 1 >> 1;\n let F = e[g + 0] | k[h + 0] << 16;\n let B = f[l + 0] | m[t + 0] << 16;\n if (a) {\n var D = 3 * F + B + 131074 >> 2;\n w(a[b + 0], D & 255, D >> 16, q, r);\n }\n c && (D = 3 * B + F + 131074 >> 2, w(c[d + 0], D & 255, D >> 16, u, v));\n for (y = 1; y <= G; ++y) {\n const J = e[g + y] | k[h + y] << 16;\n const L = f[l + y] | m[t + y] << 16;\n var D = F + J + B + L + 524296;\n const O = D + 2 * (J + B) >> 3;\n const H = D + 2 * (F + L) >> 3;\n a && (D = O + F >> 1, F = H + J >> 1, w(a[b + 2 * y - 1], D & 255, D >> 16, q, r + (2 * y - 1) * z), w(a[b + 2 * y - 0], F & 255, F >> 16, q, r + (2 * y - 0) * z));\n c && (D = H + B >> 1, F = O + L >> 1, w(c[d + 2 * y - 1], D & 255, D >> 16, u, v + (2 * y - 1) * z), w(c[d + 2 * y + 0], F & 255, F >> 16, u, v + (2 * y + 0) * z));\n F = J;\n B = L;\n }\n C & 1 || (a && (D = 3 * F + B + 131074 >> 2, w(a[b + C - 1], D & 255, D >> 16, q, r + (C - 1) * z)), c && (D = 3 * B + F + 131074 >> 2, w(c[d + C - 1], D & 255, D >> 16, u, v + (C - 1) * z)));\n }\n\n function pg(a,\n b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, hc, 3);\n }\n\n function qg(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, Vc, 3);\n }\n\n function Oe(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, pe, 4);\n }\n\n function Pe(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, oe, 4);\n }\n\n function Qe(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, me, 4);\n }\n\n function Re(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h,\n f, l, m, t, q, r, u, v, w, ne, 2);\n }\n\n function rg(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, le, 2);\n }\n\n function Ca(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u) {\n let v;\n for (v = 0; v < q - 1; v += 2) r(a[b + 0], e[g + 0], k[h + 0], f, l), r(a[b + 1], e[g + 0], k[h + 0], f, l + u), r(c[d + 0], e[g + 0], k[h + 0], m, t), r(c[d + 1], e[g + 0], k[h + 0], m, t + u), b += 2, d += 2, g++, h++, l += 2 * u, t += 2 * u;\n v == q - 1 && (r(a[b + 0], e[g + 0], k[h + 0], f, l), r(c[d + 0], e[g + 0], k[h + 0], m, t));\n }\n\n function Se(a, b, c, d, e, g, k, f, n, l, m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, pe, 4);\n }\n\n function Te(a, b, c, d, e, g, k, f, n, l,\n m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, oe, 4);\n }\n\n function Ue(a, b, c, d, e, g, k, f, n, l, m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, me, 4);\n }\n\n function Ve(a, b, c, d, e, g, k, f, n, l, m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, ne, 2);\n }\n\n function sg(a, b, c, d, e, g) {\n for (; e-- > 0;) {\n for (var k = a, f = b + (c ? 1 : 0), n = a, l = b + (c ? 0 : 3), m = s, m = 0; m < d; ++m) {\n var t = n[l + 4 * m];\n if (t != 255) {\n var t = 32897 * t;\n let q = k;\n let r = f + 4 * m + 0;\n k[f + 4 * m + 0] * t >>> 23;\n q[r] = ca;\n q = k;\n r = f + 4 * m + 1;\n k[f + 4 * m + 1] * t >>> 23;\n q[r] = ca;\n q = k;\n r = f + 4 * m + 2;\n k[f + 4 * m + 2] * t >>> 23;\n q[r] = ca;\n }\n }\n b += g;\n }\n }\n\n function tg(a, b) {\n const c = b.j.c.Va;\n const d = c.y;\n const e = c.D + a.w * c.F;\n const g = c.c;\n const k = c.B + (a.w >> 1) * c.nb;\n const f = c.S;\n const n = c.C + (a.w >> 1) * c.rb;\n const l = a.m;\n const m = a.h;\n const t = parseInt((l + 1) / 2, 10);\n const q = parseInt((m + 1) / 2, 10);\n let r;\n for (r = 0; r < m; ++r) N(d, e + r * c.F, a.y, a.D + r * a.F, l);\n for (r = 0; r < q; ++r) N(g, k + r * c.nb, a.c, a.B + r * a.Da, t), N(f, n + r * c.rb, a.S, a.C + r * a.Da, t);\n return a.h;\n }\n\n function ug(a, b) {\n var c = b.j;\n const d = c.c.RGBA;\n const e = d.ma;\n let g = d.Sa + a.w * d.f;\n const k = a.y;\n let f = a.D;\n const n = a.c;\n let l = a.B;\n const m = a.S;\n let t = a.C;\n var c = vg[c.J];\n const q = a.m;\n const r = a.h - 1;\n let u;\n for (u = 0; u < r; u += 2) c(k, f, k, f + a.F, n, l, m, t, e, g, e, g + d.f, q), f += 2 * a.F, l += a.Da, t += a.Da, g += 2 * d.f;\n u == r && c(k, f, k, f, n, l, m, t, e, g, e, g, q);\n return a.h;\n }\n\n function wg(a, b) {\n let c = a.h;\n const d = b.j.c.RGBA;\n const e = d.ma;\n let g = d.Sa + a.w * d.f;\n const k = V[b.j.J];\n const f = a.y;\n let n = a.D;\n const l = a.c;\n let m = a.B;\n const t = a.S;\n let q = a.C;\n let r = b.Qb;\n let u = b.Rb;\n let v = b.lc;\n let w = b.mc;\n let A = a.w;\n const z = a.w + a.h;\n const y = a.m;\n const D = parseInt((y + 1) / 2, 10);\n A == 0 ? k(p, p, f, n, l, m, t, q, l, m, t, q, p, p, e, g, y) : (k(b.Sb, b.Tb, f, n, r, u, v, w, l, m, t, q, e, g - d.f, e, g, y), ++c);\n for (; A + 2 < z; A += 2) r = l, u = m, v = t, w = q, m += a.Da, q += a.Da, g += 2 * d.f, n += 2 * a.F, k(f, n - a.F, f, n, r, u, v, w, l, m, t, q, e, g - d.f, e, g, y);\n n += a.F;\n a.k + z < a.K ? (N(b.Sb, b.Tb, f, n, 1 * y), N(b.Qb, b.Rb, l, m, 1 * D), N(b.lc, b.mc, t, q, 1 * D), c--) : z & 1 || k(f, n, p, p, l, m, t, q, l, m,\n t, q, e, g + d.f, p, p, y);\n return c;\n }\n\n function xg(a, b) {\n var c = a.p;\n var d = a.q;\n const e = b.j.c.Va;\n const g = a.m;\n const f = a.h;\n const h = e.p;\n let n = e.q + a.w * e.Fa;\n var c = a.p;\n var d = a.q;\n let l = s;\n if (c != p) for (l = 0; l < f; ++l) N(h, n, c, d, 1 * g), d += a.width, n += e.Fa;\n else if (e.p != p) for (l = 0; l < f; ++l) jd(h, n, 255, g), n += e.Fa;\n return 0;\n }\n\n function We(a, b, c) {\n let d = a.w;\n c[0] = a.h;\n a.Bb && (d == 0 ? --c[0] : (--d, b[0] -= a.width), a.k + a.w + a.h == a.K && (c[0] = a.K - a.k - d));\n return d;\n }\n\n function yg(a, b) {\n const c = a.p;\n var d = [a.q];\n if (c != p) {\n for (var e = a.m, g = b.j.J, f = g == Ab || g == Bb, h = b.j.c.RGBA, n = [s], l = We(a, d, n), d = d[0], m = h.ma, l = h.Sa + l * h.f,\n t = l + (f ? 0 : 3), q = 255, r = s, u = s, u = 0; u < n[0]; ++u) {\n for (r = 0; r < e; ++r) {\n const v = c[d + r];\n m[t + 4 * r] = v;\n q &= v;\n }\n d += a.width;\n t += h.f;\n }\n q != 255 && F(g) && WebPApplyAlphaMultiply(m, l, f, e, n, h.f);\n }\n return 0;\n }\n\n function zg(a, b) {\n const c = a.p;\n var d = [a.q];\n if (c != p) {\n const e = a.m;\n const g = b.j.J;\n const f = b.j.c.RGBA;\n const h = [s];\n var n = We(a, d, h);\n var d = d[0];\n const l = f.ma;\n var n = f.Sa + n * f.f;\n let m = n + 1;\n let t = 15;\n let q = s;\n for (j = 0; j < h[0]; ++j) {\n for (q = 0; q < e; ++q) {\n const r = c[d + q] >> 4;\n l[m + 2 * q] = l[m + 2 * q] & 240 | r;\n t &= r;\n }\n d += a.width;\n m += f.f;\n }\n t != 15 && F(g) && WebPApplyAlphaMultiply4444(l, n, e, h, f.f);\n }\n return 0;\n }\n\n function vd(a) {\n let b = a.ka;\n const c = b.j.J;\n const d = c\n < ua;\n const e = c == jb || c == Pa || c == Ab || c == kb || c == Ra || F(c);\n b.memory = p;\n b.$a = p;\n b.zb = p;\n b.ad = p;\n if (!Ne(b.Qa, a, e ? ua : Ra)) return 0;\n if (a.I) {\n if (!(d ? InitRGBRescaler(a, b) : InitYUVRescaler(a, b))) return alert('memory error #1'), 0;\n } else {\n if (d) {\n if (b.$a = ug, a.Bb) {\n const g = a.m + 1 >> 1;\n const f = a.m + 2 * g;\n let h; const\n n = [];\n for (h = 0; h < f; ++h) n.push(205);\n n.push(0);\n b.memory = n;\n if (b.memory == p) return alert('memory error #2'), 0;\n b.Sb = b.memory;\n b.Tb = 0;\n b.Qb = b.Sb;\n b.Rb = b.Tb + a.m;\n b.lc = b.Qb;\n b.mc = b.Rb + g;\n b.$a = wg;\n V[Qa] = pg;\n V[jb] = Oe;\n V[Zc] = qg;\n V[Pa] = Pe;\n V[Ab] = Qe;\n V[kb] = Re;\n V[Fe] = rg;\n }\n } else {\n b.$a = tg;\n }\n e && (F(c) && (WebPApplyAlphaMultiply = sg, V[Ob] = Oe, V[Pb] = Pe, V[Bb] = Qe, V[Qb] = Re), b.zb = c == kb || c == Qb ? zg : d ? yg : xg);\n }\n if (d && !Xe) {\n for (a = 0; a < 256; ++a) Za[a] = 89858 * (a - 128) + Jb >> ea, wb[a] = -22014 * (a - 128) + Jb, vb[a] = -45773 * (a - 128), xb[a] = 113618 * (a - 128) + Jb >> ea;\n for (a = J; a < dd; ++a) b = 76283 * (a - 16) + Jb >> ea, ia[a - J] = wa(b, 255), Hb[a - J] = wa(b + 8 >> 4, 15);\n Xe = 1;\n }\n return 1;\n }\n\n function ud(a) {\n const b = a.ka;\n let c = a.m;\n const d = a.h;\n $(!(a.w & 1));\n if (c <= 0 || d <= 0) return 0;\n c = b.$a(a, b);\n b.ec += c;\n b.zb && b.zb(a, b);\n return 1;\n }\n\n function wd(a) {\n a = a.ka;\n a.memory = '';\n a.memory = p;\n }\n\n function ed(a,\n b) {\n return a[b + 0] | a[b + 1] << 8 | a[b + 2] << 16;\n }\n\n function Kb(a, b) {\n return (ed(a, b) | a[b + 3] << 24) >>> 0;\n }\n\n function Ye(a, b, c, d, e, g, f) {\n var h = 0;\n var n = [0];\n var l = 'VP8StatusCode';\n const m = M(Gc);\n if (a == p || c[0] < Lb) return Z;\n m.data = a;\n m.b = [b[0]];\n m.e = [c[0]];\n m.na = [m.na];\n a: {\n h = m.na;\n $(a != p);\n $(c != p);\n $(h != p);\n h[0] = 0;\n if (c[0] >= Lb && !kd(a, b[0], 'RIFF', O)) {\n if (kd(a, b[0] + 8, 'WEBP', O)) {\n l = W;\n break a;\n }\n var t = Kb(a, b[0] + O);\n if (t < O + R) {\n l = W;\n break a;\n }\n h[0] = t;\n b[0] += Lb;\n c[0] -= Lb;\n } else h[0] = 0;\n l = L;\n }\n m.na = m.na[0];\n if (l != L) return l;\n h = m.na > 0;\n t = [0];\n a: if (l = R + fd, $(a != p), $(c != p), $(n != p), n[0] = 0, c[0] < R) l = Z;\n else {\n if (!kd(a, b[0], 'VP8X', O)) {\n var q = s;\n var r = s;\n var u = E;\n if (Kb(a, b[0] + O) != fd) {\n l = W;\n break a;\n }\n if (c[0] < l) {\n l = Z;\n break a;\n }\n u = Kb(a, b[0] + 8);\n q = 1 + ed(a, b[0] + 12);\n r = 1 + ed(a, b[0] + 15);\n if (q * r >= Ag) {\n l = W;\n break a;\n }\n t != p && (t[0] = u);\n d != p && (d[0] = q);\n e != p && (e[0] = r);\n b[0] += l;\n c[0] -= l;\n n[0] = 1;\n }\n l = L;\n }\n if (l != L) return l;\n if (!h && n[0]) return W;\n g != p && (g[0] = !!(t[0] & Bg));\n if (n && f == p) return L;\n if (c < O) return Z;\n if (h && n[0] || !h && !n[0] && !kd(a, b[0], 'ALPH', O)) {\n m.$ = [m.$];\n m.G = [m.G];\n m.pa = [m.pa];\n a: {\n var n = m.na;\n var h = m.$;\n var t = m.G;\n var l = m.pa;\n var q = x;\n var r = 0;\n var u = Mb;\n let v = O + R + fd;\n $(a != p);\n $(c != p);\n q = a;\n r = b[0];\n u = c[0];\n $(h != p);\n $(l != p);\n h[0] = p;\n t[0] = p;\n for (l[0] = 0; ;) {\n let w = E;\n let y = E;\n b[0] = r;\n c[0] = u;\n if (u < R) {\n l = Z;\n break a;\n }\n w = Kb(q, r + O);\n y = R + w + 1 & -2;\n v += y;\n if (n > 0 && v > n) {\n l = W;\n break a;\n }\n if (u < y) {\n l = Z;\n break a;\n }\n if (kd(q, r, 'ALPH', O)) {\n if (!kd(q, r, 'VP8 ', O) || !kd(q, 'VP8L', O)) {\n l = L;\n break a;\n }\n } else h[0] = q, t[0] = r + R, l[0] = w;\n r += y;\n u -= y;\n }\n l = ca;\n }\n m.$ = m.$[0];\n m.G = m.G[0];\n m.pa = m.pa[0];\n if (l != L) return l;\n }\n m.ta = [m.ta];\n m.ia = [m.ia];\n a: if (n = m.na, h = m.ta, t = m.ia, r = !kd(a, b[0], 'VP8 ', O), l = !kd(a, b[0], 'VP8L', O), q = O + R, $(a != p), $(c != p), $(h != p), $(t != p), c[0] < R) l = Z;\n else {\n if (r || l) {\n r = Kb(a, b[0] + O);\n if (n >= q && r > n - q) {\n l = W;\n break a;\n }\n h[0] = r;\n b[0] += R;\n c[0] -= R;\n t[0] = l;\n } else t[0] = c >= 1 && a[b + 0] == ve, h[0] = c[0];\n l = L;\n }\n m.ta = m.ta[0];\n m.ia = m.ia[0];\n if (l != L) return l;\n if (m.ta > Ze) return W;\n if (m.ia) {\n if (c[0] < $e) return Z;\n n = b[0];\n h = c[0];\n d = d ? d[0] : p;\n e = e ? e[0] : p;\n t = g ? g[0] : p;\n a == p || h < $e ? a = 0 : (l = [s], q = [s], r = [s], u = M(af), Rb(u, a, n, h), ue(u, l, q, r) ? (d != p && (d[0] = l[0]), e != p && (e[0] = q[0]), t != p && (t[0] = r[0]), a = 1) : a = 0);\n } else {\n if (c < bf) return Z;\n n = b[0];\n h = c[0];\n d = d ? d[0] : p;\n e = e ? e[0] : p;\n !(a == p || h < bf) && h - 3 >= 3 && a[n + 3 + 0] == 157 && a[n\n + 3 + 1] == 1 && a[n + 3 + 2] == 42 ? (h = a[n + 0] | a[n + 1] << 8 | a[n + 2] << 16, t = (a[n + 7] << 8 | a[n + 6]) & 16383, a = (a[n + 9] << 8 | a[n + 8]) & 16383, !(!(h & 1) + 0) || (h >> 1 & 7) > 3 || !(h >> 4 & 1) || h >> 5 >= m.ta ? a = 0 : (d && (d[0] = t), e && (e[0] = a), a = 1)) : a = 0;\n }\n if (!a) return W;\n g != p && (g[0] |= m.$ != p);\n f != p && (f[0] = m, f[0].offset = b[0] - f[0].b, $(b[0] - f[0].b < Ze), $(f[0].offset == f[0].e - c[0]));\n return L;\n }\n\n function Kd(a) {\n $(a != p);\n return Ye(a[0].data, a[0].b, a[0].e, p, p, p, a);\n }\n\n function cf(a, b, c, d) {\n let e = 'VP8StatusCode';\n const g = M(Vb);\n let f = M(Gc);\n f.data = a;\n f.b = b;\n f.e = c;\n f.b = [f.b];\n f.e = [f.e];\n f = [f];\n e = Kd(f);\n if (e\n != L) return e;\n f = f[0];\n f.b = f.b[0];\n f.e = f.e[0];\n $(d != p);\n td(na);\n g.data = f.data;\n g.b = b + f.offset;\n g.e = f.e - f.offset;\n g.put = ud;\n g.Mb = vd;\n g.Pb = wd;\n g.ka = d;\n if (f.ia) {\n a = sd();\n if (a == p) return cb;\n ng(a, g) ? (e = zd(g.width, g.height, d.Qa, d.j), e == L && !og(a) && (e = a.a)) : e = a.a;\n a != p && sa(a);\n } else {\n e = M(Cg);\n e != p && (Gd(e), e.za = 0, e.Hb = 1);\n a = e;\n if (a == p) return cb;\n a.qb = 0;\n a.Ga = f.$;\n a.G = f.G;\n a.ub = f.pa;\n Hd(a, g) ? (e = zd(g.width, g.height, d.Qa, d.j), e == L && !Mf(a, g) && (e = a.a)) : e = a.a;\n a != p && ke(a);\n }\n e != L && (self || this).Yc(d.j);\n return e;\n }\n\n function lb(a, b, c, d, e) {\n const g = {\n value: 0,\n };\n c = {\n value: c,\n };\n const f = M(df);\n const h = M(gd);\n f.j = h;\n h.J = a;\n const n = {\n value: h.width,\n };\n const l = {\n value: h.height,\n };\n let m;\n m = c;\n const t = M(ef);\n hd(b, g, m, t) != L ? m = 0 : (n != p && (n.value = t.width), l != p && (l.value = t.height), m = 1);\n if (!m) return p;\n h.width = n.value;\n h.height = l.value;\n d != p && (d.value = h.width.value);\n e != p && (e.value = h.height.value);\n return cf(b, g.value, c.value, f) != L ? p : a < ua ? h.c.RGBA.ma : h.c.Va.y;\n }\n\n function hd(a, b, c, d) {\n if (d == p || a == p) return ta;\n $(d != p);\n d.tc = 0;\n d.width = [d.width];\n d.height = [d.height];\n d.$b = [d.$b];\n return Ye(a, b, c, d.width, d.height, d.$b, p);\n }\n\n function Ne(a,\n b, c) {\n const d = b.width;\n const e = b.height;\n let g = 0;\n let f = 0;\n let h = d;\n let n = e;\n b.Ua = a != p && a.Ua > 0;\n if (b.Ua && (h = a.wc, n = a.vc, g = a.t, f = a.k, c < ua || (g &= -2, f &= -2), g < 0 || f < 0 || h <= 0 || n <= 0 || g + h > d || f + n > e)) return 0;\n b.t = g;\n b.k = f;\n b.Ka = g + h;\n b.K = f + n;\n b.m = h;\n b.h = n;\n b.I = a != p && a.I > 0;\n if (b.I) {\n if (a.Ba <= 0 || a.Aa <= 0) return 0;\n b.Ba = a.Ba;\n b.Aa = a.Aa;\n }\n b.Za = a && a.Za;\n b.Bb = a == p || !a.ed;\n b.I && (b.Za = b.Ba < 3 * d / 4 && b.Aa < 3 * e / 4, b.Bb = 0);\n return 1;\n }\n var na = 512;\n var Qa = 0;\n var jb = 1;\n var Zc = 2;\n var Pa = 3;\n var Ab = 4;\n var kb = 5;\n var Fe = 6;\n var Ob = 7;\n var Pb = 8;\n var Bb = 9;\n var Qb = 10;\n var ua = 11;\n var Ra = 12;\n var Cc = 13;\n this.WEBP_CSP_MODE = this.Cd = {\n nd: 0,\n od: 1,\n kd: 2,\n ld: 3,\n jd: 4,\n pd: 5,\n qd: 6,\n rd: 7,\n sd: 8,\n md: 9,\n };\n var gd = {\n J: 'WEBP_CSP_MODE',\n width: s,\n height: s,\n Fc: s,\n c: {\n RGBA: {\n ma: x,\n Sa: 0,\n f: s,\n size: Mb,\n },\n Va: {\n y: x,\n c: x,\n S: x,\n p: x,\n D: x,\n B: x,\n C: x,\n q: x,\n F: s,\n nb: s,\n rb: s,\n Fa: s,\n Wc: Mb,\n Rc: Mb,\n Uc: Mb,\n Wb: Mb,\n },\n },\n Ic: U(4, E),\n Jb: p,\n jc: x,\n };\n var L = 0;\n var cb = 1;\n var ta = 2;\n var W = 3;\n var Hf = 4;\n var Ie = 5;\n var Nf = 6;\n var Z = 7;\n this.VP8StatusCode = this.td = {\n xd: 0,\n yd: 1,\n vd: 2,\n ud: 3,\n Ad: 4,\n zd: 5,\n Bd: 6,\n wd: 7,\n };\n var ef = {\n width: {\n value: s,\n },\n height: {\n value: s,\n },\n $b: {\n value: s,\n },\n tc: s,\n Yd: s,\n rotate: s,\n be: s,\n Ic: U(3, E),\n };\n this.WebPGetFeatures = this.Md = function (a, b, c) {\n let d = 'VP8StatusCode';\n na >>> 8 != na >>> 8 || c == p ? a = ta : (b = [b], d = hd(a, [0], b, c), a = d == Z ? W : d);\n return a;\n };\n const ff = {\n Za: s,\n ed: s,\n Ua: s,\n t: s,\n k: s,\n wc: s,\n vc: s,\n I: s,\n Ba: s,\n Aa: s,\n ae: s,\n Td: s,\n Xd: s,\n Ic: U(6, E),\n };\n this.WebPDecoderConfig = this.Kd = {\n input: M(ef),\n j: M(gd),\n options: M(ff),\n };\n this.WebPInitDecoderConfig = this.Nd = function (a) {\n na >>> 8 != na >>> 8 || a == p ? a = 0 : (a = a.input, $(a != p), a.tc = 0, a = 1);\n return a;\n };\n var Vb = {\n width: s,\n height: s,\n w: s,\n m: s,\n h: s,\n y: x,\n c: x,\n S: x,\n D: 0,\n B: 0,\n C: 0,\n F: s,\n Da: s,\n ka: 0,\n put: 0,\n Mb: 0,\n Pb: 0,\n Bb: s,\n e: Mb,\n data: x,\n b: 0,\n Za: s,\n Ua: s,\n t: s,\n Ka: s,\n k: s,\n K: s,\n I: s,\n Ba: s,\n Aa: s,\n p: x,\n q: 0,\n };\n var df = {\n j: M(gd),\n Sb: x,\n Qb: x,\n lc: x,\n Tb: 0,\n Rb: 0,\n mc: 0,\n ec: s,\n Qa: M(ff),\n memory: 0,\n $a: '(OutputFunc)',\n zb: '(OutputFunc)',\n ad: '(OutputRowFunc)',\n };\n var Gc = {\n data: x,\n b: x,\n e: Mb,\n offset: Mb,\n $: p,\n G: x,\n pa: Mb,\n ta: Mb,\n na: Mb,\n ia: s,\n };\n var Fc = {\n qa: x,\n Ia: p,\n Pd: x,\n Ab: s,\n la: E,\n Z: E,\n gc: s,\n };\n var af = {\n T: bb,\n qa: x,\n Ia: x,\n ya: Mb,\n Q: Mb,\n g: s,\n L: s,\n fa: s,\n };\n var gf = 25;\n var hf = [0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535, 131071, 262143, 524287, 1048575, 2097151, 4194303, 8388607, 16777215];\n var bf = 10;\n var ve = 47;\n var we = 14;\n var Wf = 3;\n var $e = 5;\n var fg = 11;\n var Yc = 5;\n var qe = 4278190080;\n var jg = 8;\n var Tb = 15;\n var Ba = 256;\n var Ge = 24;\n var Je = 4;\n var Be = 0;\n var De = 1;\n var Ae = 2;\n var Ee = 3;\n var Ub = 1;\n var kc = 0;\n var kf = 1;\n var rd = 1;\n var O = 4;\n var R = 8;\n var Lb = 12;\n var fd = 10;\n var Bg = 16;\n var Ag = 1 * Math.pow(2, 32);\n var Ze = -1 - R - 1 >>> 0;\n var jf = {\n kc: s,\n s,\n };\n var Le = {\n Y: 'HuffmanTreeNode*',\n gb: s,\n Pa: s,\n };\n var pd = -1;\n const Dg = {\n ea: E,\n bb: s,\n };\n var ad = 506832829;\n var $b = 0;\n var ge = $b;\n var fe = 2;\n var ee = 3;\n var de = 1;\n var Ef = 4;\n var Df = 5;\n var Cf = 6;\n var Ld = 3;\n var xa = 4;\n var Hc = 4;\n var Gf = 4;\n var Md = 4;\n var Nd = 8;\n var Kc = 3;\n var Lc = 11;\n var f = 32;\n var Pf = 17 * f + 9 * f;\n var Tc = 1 * f + 8;\n var Uc = Tc + 16 * f + f;\n var he = Uc + 16;\n var Id = {\n fb: x,\n Jc: x,\n Nc: x,\n Ra: E,\n };\n var Jd = {\n l: 0,\n v: 0,\n gd: x,\n hd: x,\n uc: x,\n $c: x,\n };\n const Eg = {\n pb: s,\n ob: s,\n tb: s,\n Kb: U(xa, 0),\n Cb: U(xa, 0),\n };\n const Fg = {\n Ta: U(Ld, x),\n z: md([Md, Nd, Kc, Lc], x),\n };\n const Gg = {\n Oc: s,\n Fb: s,\n kb: s,\n oc: s,\n Lc: U(Hc, s),\n Gc: U(Hc, s),\n };\n var Oc = {\n zc: s,\n yc: s,\n ab: s,\n };\n var Qd = {\n X: s,\n ua: s,\n Nb: s,\n };\n const id = U(2, s);\n const Hg = {\n sc: M(id),\n sb: M(id),\n qc: M(id),\n };\n const Ig = {\n ha: s,\n d: s,\n W: s,\n M: Oc,\n N: Vb,\n };\n var Cg = {\n a: 'VP8StatusCode',\n za: s,\n xc: 0,\n o: M(Fc),\n Ac: M(Id),\n P: M(Jd),\n ga: M(Gg),\n Ca: M(Eg),\n rc: 'WebPWorker',\n qb: s,\n Ja: s,\n jb: s,\n oa: Ig,\n Ma: s,\n hb: s,\n lb: s,\n mb: s,\n wb: s,\n Ya: s,\n Hb: s,\n ic: ld(8, Fc),\n Zc: E,\n yb: ld(xa, Hg),\n R: M(Fg),\n pc: s,\n Pc: x,\n dc: x,\n cc: U(4, x),\n Xc: x,\n Sc: x,\n Vc: x,\n La: M(Qd),\n M: M(Oc),\n Ea: x,\n z: 0,\n ca: x,\n aa: x,\n ra: x,\n da: s,\n ba: s,\n sa: s,\n H: s,\n r: s,\n ib: 0,\n Gb: Mb,\n i: s,\n d: s,\n wa: x,\n Eb: U(16, x),\n Vd: 0,\n Tc: x,\n Lb: x,\n ja: E,\n Oa: E,\n A: s,\n W: s,\n Zb: U(xa, x),\n Ga: p,\n G: 0,\n ub: Mb,\n Xb: x,\n Od: 0,\n cd: s,\n dd: x,\n Wd: 0,\n fc: Mb,\n };\n var Db = 0;\n var Cb = 1;\n var cd = 2;\n const Jg = {\n Qc: 'VP8LImageTransformType',\n n: s,\n U: s,\n Vb: s,\n u: E,\n b: E,\n };\n var gg = {\n va: ld(Yc, Le),\n };\n const Kg = {\n xb: s,\n Yb: M(Dg),\n Dc: s,\n eb: s,\n Ec: s,\n ac: E,\n bd: E,\n hc: s,\n Db: 'HTreeGroup',\n };\n var eg = {\n a: 'VP8StatusCode',\n Wa: 'VP8LDecodeState',\n Ob: 'VP8LDecodeState',\n N: 'VP8Io',\n Ib: 'WebPDecBuffer',\n Hc: 'WebPDecBuffer',\n V: E,\n Ha: E,\n Xa: E,\n vb: E,\n o: M(af),\n l: s,\n v: s,\n O: s,\n xa: s,\n cb: M(Kg),\n Na: s,\n nc: ld(Je, Jg),\n Ub: E,\n Mc: x,\n $d: x,\n Zd: '*WebPRescaler',\n };\n var lf = 4;\n var nf = [p, function (a, b, c, d, e, g, f, h) {\n let n = s;\n let l = h;\n $(a != p);\n $(f != p);\n $(c > 0);\n $(d > 0);\n $(e > 0);\n $(g >= c * e);\n for (n = 0; n < d; ++n) {\n n == 0 ? N(f, h, a, b, e) : Ea(a, b, f, l - g, f, h, e), Ea(a, b + e, f, l, f, h + e, e * (c - 1)),\n l += g, b += g, h += g;\n }\n }, function (a, b, c, d, e, f, k, h) {\n let n = s;\n let l = h;\n $(a != p);\n $(k != p);\n $(c > 0);\n $(d > 0);\n $(e > 0);\n $(f >= c * e);\n N(k, h, a, b, e);\n Ea(a, b + e, k, l, k, h + e, e * (c - 1));\n for (n = 1; n < d; ++n) b += f, h += f, Ea(a, b, k, l, k, h, e * c), l += f;\n }, function (a, b, c, d, e, f, k, h) {\n var n = h;\n let l = s;\n $(a != p);\n $(k != p);\n $(c > 0);\n $(d > 0);\n $(e > 0);\n $(f >= c * e);\n N(k, h, a, b, e);\n Ea(a, b + e, k, n, k, h + e, e * (c - 1));\n for (l = 1; l < d; ++l) {\n let m = s;\n var n = n + f;\n b += f;\n h += f;\n Ea(a, b, k, n - f, k, h, e);\n for (m = e; m < c * e; ++m) {\n const t = k[n + m - e] + k[n + m - f] - k[n + m - f - e];\n k[h + m] = a[b + m] + (t < 0 ? 0 : t > 255 ? 255 : t) & 255;\n }\n }\n }];\n var yd = [3, 4, 3, 4, 4, 2, 2, 4, 4, 4,\n 2, 1, 1,\n ];\n this.WebPFreeDecBuffer = this.Yc = function (a) {\n a != p && (a.Fc || (a.Jb = ''), a.jc = 0, a.Jb = a.jc = p);\n };\n self = this;\n var va = U(511, x);\n var tc = U(511, x);\n var sc = U(2041, 0);\n var oc = U(225, 0);\n var oa = U(766, x);\n var Rd = 0;\n var Xb = 85627;\n var Wb = 35468;\n var Uf = [function (a, b) {\n let c = 4;\n let d;\n for (d = 0; d < 4; ++d) c += a[b + d - f] + a[b - 1 + d * f];\n c >>= 3;\n for (d = 0; d < 4; ++d) jd(a, b + d * f, c, 4);\n }, function (a, b) {\n Dc(a, b, 4);\n }, function (a, b) {\n let c = b - f;\n const d = [];\n d.push(y(a[c - 1], a[c + 0], a[c + 1]));\n d.push(y(a[c + 0], a[c + 1], a[c + 2]));\n d.push(y(a[c + 1], a[c + 2], a[c + 3]));\n d.push(y(a[c + 2], a[c + 3], a[c + 4]));\n for (c = 0; c < 4; ++c) N(a, b + c * f, d, 0, 4);\n },\n function (a, b) {\n const c = a[b - 1];\n const d = a[b - 1 + f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 + 3 * f];\n a[b + 0 + 0 * f] = a[b + 1 + 0 * f] = a[b + 2 + 0 * f] = a[b + 3 + 0 * f] = y(a[b - 1 - f], c, d);\n a[b + 0 + 1 * f] = a[b + 1 + 1 * f] = a[b + 2 + 1 * f] = a[b + 3 + 1 * f] = y(c, d, e);\n a[b + 0 + 2 * f] = a[b + 1 + 2 * f] = a[b + 2 + 2 * f] = a[b + 3 + 2 * f] = y(d, e, g);\n a[b + 0 + 3 * f] = a[b + 1 + 3 * f] = a[b + 2 + 3 * f] = a[b + 3 + 3 * f] = y(e, g, g);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 - f];\n const k = a[b + 0 - f];\n const h = a[b + 1 - f];\n const n = a[b + 2 - f];\n const l = a[b + 3 - f];\n a[b + 0 + 3 * f] = y(d, e, a[b - 1 + 3 * f]);\n a[b + 0 + 2 * f] = a[b + 1 + 3 * f] = y(c, d, e);\n a[b + 0 + 1 * f] = a[b + 1 + 2 * f] = a[b + 2 + 3 * f] = y(g, c, d);\n a[b\n + 0 + 0 * f] = a[b + 1 + 1 * f] = a[b + 2 + 2 * f] = a[b + 3 + 3 * f] = y(k, g, c);\n a[b + 1 + 0 * f] = a[b + 2 + 1 * f] = a[b + 3 + 2 * f] = y(h, k, g);\n a[b + 2 + 0 * f] = a[b + 3 + 1 * f] = y(n, h, k);\n a[b + 3 + 0 * f] = y(l, n, h);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 - f];\n const k = a[b + 0 - f];\n const h = a[b + 1 - f];\n const n = a[b + 2 - f];\n const l = a[b + 3 - f];\n a[b + 0 + 0 * f] = a[b + 1 + 2 * f] = g + k + 1 >> 1;\n a[b + 1 + 0 * f] = a[b + 2 + 2 * f] = k + h + 1 >> 1;\n a[b + 2 + 0 * f] = a[b + 3 + 2 * f] = h + n + 1 >> 1;\n a[b + 3 + 0 * f] = n + l + 1 >> 1;\n a[b + 0 + 3 * f] = y(e, d, c);\n a[b + 0 + 2 * f] = y(d, c, g);\n a[b + 0 + 1 * f] = a[b + 1 + 3 * f] = y(c, g, k);\n a[b + 1 + 1 * f] = a[b + 2 + 3 * f] = y(g, k, h);\n a[b + 2 + 1 * f] = a[b + 3 + 3 * f] = y(k, h, n);\n a[b + 3 + 1 * f] = y(h, n, l);\n },\n function (a, b) {\n const c = a[b + 1 - f];\n const d = a[b + 2 - f];\n const e = a[b + 3 - f];\n const g = a[b + 4 - f];\n const k = a[b + 5 - f];\n const h = a[b + 6 - f];\n const n = a[b + 7 - f];\n a[b + 0 + 0 * f] = y(a[b + 0 - f], c, d);\n a[b + 1 + 0 * f] = a[b + 0 + 1 * f] = y(c, d, e);\n a[b + 2 + 0 * f] = a[b + 1 + 1 * f] = a[b + 0 + 2 * f] = y(d, e, g);\n a[b + 3 + 0 * f] = a[b + 2 + 1 * f] = a[b + 1 + 2 * f] = a[b + 0 + 3 * f] = y(e, g, k);\n a[b + 3 + 1 * f] = a[b + 2 + 2 * f] = a[b + 1 + 3 * f] = y(g, k, h);\n a[b + 3 + 2 * f] = a[b + 2 + 3 * f] = y(k, h, n);\n a[b + 3 + 3 * f] = y(h, n, n);\n },\n function (a, b) {\n const c = a[b + 0 - f];\n const d = a[b + 1 - f];\n const e = a[b + 2 - f];\n const g = a[b + 3 - f];\n const k = a[b + 4 - f];\n const h = a[b + 5 - f];\n const n = a[b + 6 - f];\n const l = a[b + 7 - f];\n a[b + 0 + 0 * f] = c + d + 1 >> 1;\n a[b + 1 + 0 * f] = a[b\n + 0 + 2 * f] = d + e + 1 >> 1;\n a[b + 2 + 0 * f] = a[b + 1 + 2 * f] = e + g + 1 >> 1;\n a[b + 3 + 0 * f] = a[b + 2 + 2 * f] = g + k + 1 >> 1;\n a[b + 0 + 1 * f] = y(c, d, e);\n a[b + 1 + 1 * f] = a[b + 0 + 3 * f] = y(d, e, g);\n a[b + 2 + 1 * f] = a[b + 1 + 3 * f] = y(e, g, k);\n a[b + 3 + 1 * f] = a[b + 2 + 3 * f] = y(g, k, h);\n a[b + 3 + 2 * f] = y(k, h, n);\n a[b + 3 + 3 * f] = y(h, n, l);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 + 3 * f];\n const k = a[b - 1 - f];\n const h = a[b + 0 - f];\n const n = a[b + 1 - f];\n const l = a[b + 2 - f];\n a[b + 0 + 0 * f] = a[b + 2 + 1 * f] = c + k + 1 >> 1;\n a[b + 0 + 1 * f] = a[b + 2 + 2 * f] = d + c + 1 >> 1;\n a[b + 0 + 2 * f] = a[b + 2 + 3 * f] = e + d + 1 >> 1;\n a[b + 0 + 3 * f] = g + e + 1 >> 1;\n a[b + 3 + 0 * f] = y(h, n, l);\n a[b + 2 + 0 * f] = y(k, h, n);\n a[b\n + 1 + 0 * f] = a[b + 3 + 1 * f] = y(c, k, h);\n a[b + 1 + 1 * f] = a[b + 3 + 2 * f] = y(d, c, k);\n a[b + 1 + 2 * f] = a[b + 3 + 3 * f] = y(e, d, c);\n a[b + 1 + 3 * f] = y(g, e, d);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 + 3 * f];\n a[b + 0 + 0 * f] = c + d + 1 >> 1;\n a[b + 2 + 0 * f] = a[b + 0 + 1 * f] = d + e + 1 >> 1;\n a[b + 2 + 1 * f] = a[b + 0 + 2 * f] = e + g + 1 >> 1;\n a[b + 1 + 0 * f] = y(c, d, e);\n a[b + 3 + 0 * f] = a[b + 1 + 1 * f] = y(d, e, g);\n a[b + 3 + 1 * f] = a[b + 1 + 2 * f] = y(e, g, g);\n a[b + 3 + 2 * f] = a[b + 2 + 2 * f] = a[b + 0 + 3 * f] = a[b + 1 + 3 * f] = a[b + 2 + 3 * f] = a[b + 3 + 3 * f] = g;\n },\n ];\n var Vf = [function (a, b) {\n let c = 16;\n let d;\n for (d = 0; d < 16; ++d) c += a[b - 1 + d * f] + a[b + d - f];\n Yb(c >> 5, a, b);\n }, function (a,\n b) {\n Dc(a, b, 16);\n }, function (a, b) {\n let c;\n for (c = 0; c < 16; ++c) N(a, b + c * f, a, b - f, 16);\n }, function (a, b) {\n let c;\n for (c = 16; c > 0; --c) jd(a, b + 0, a[b - 1], 16), b += f;\n }, function (a, b) {\n let c = 8;\n let d;\n for (d = 0; d < 16; ++d) c += a[b - 1 + d * f];\n Yb(c >> 4, a, b);\n }, function (a, b) {\n let c = 8;\n let d;\n for (d = 0; d < 16; ++d) c += a[b + d - f];\n Yb(c >> 4, a, b);\n }, function (a, b) {\n Yb(128, a, b);\n }];\n var je = [function (a, b) {\n let c = 8;\n let d;\n for (d = 0; d < 8; ++d) c += a[b + d - f] + a[b - 1 + d * f];\n Zb(1 * (c >> 4), a, b);\n }, function (a, b) {\n Dc(a, b, 8);\n }, function (a, b) {\n let c;\n for (c = 0; c < 8; ++c) N(a, b + c * f, a, b - f, 8);\n }, function (a, b) {\n let c;\n for (c = 0; c < 8; ++c) {\n jd(a,\n b + 0, a[b - 1], 8), b += f;\n }\n }, function (a, b) {\n let c = 4;\n let d;\n for (d = 0; d < 8; ++d) c += a[b - 1 + d * f];\n Zb(1 * (c >> 3), a, b);\n }, function (a, b) {\n let c = 4;\n let d;\n for (d = 0; d < 8; ++d) c += a[b + d - f];\n Zb(1 * (c >> 3), a, b);\n }, function (a, b) {\n Zb(128, a, b);\n }];\n let mc; let Pc; let Qc; let Rc; let Sd; let Td; let Ud; let Vd; let Wd; let Xd; let Yd; let Zd; let $d; let ae; let be; let ce; var Pd = 31;\n var uc = [0, 2, 8];\n var Od = 3;\n var Of = 1;\n var ie = [0 + 0 * f, 4 + 0 * f, 8 + 0 * f, 12 + 0 * f, 0 + 4 * f, 4 + 4 * f, 8 + 4 * f, 12 + 4 * f, 0 + 8 * f, 4 + 8 * f, 8 + 8 * f, 12 + 8 * f, 0 + 12 * f, 4 + 12 * f, 8 + 12 * f, 12 + 12 * f];\n var Ic = [4, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 17, 18, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 25, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38,\n 39, 40, 41, 42, 43, 44, 45, 46, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 91, 93, 95, 96, 98, 100, 101, 102, 104, 106, 108, 110, 112, 114, 116, 118, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 143, 145, 148, 151, 154, 157,\n ];\n var Jc = [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96,\n 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 119, 122, 125, 128, 131, 134, 137, 140, 143, 146, 149, 152, 155, 158, 161, 164, 167, 170, 173, 177, 181, 185, 189, 193, 197, 201, 205, 209, 213, 217, 221, 225, 229, 234, 239, 245, 249, 254, 259, 264, 269, 274, 279, 284,\n ];\n var Sf = [-$b, 1, -1, 2, -2, 3, 4, 6, -3, 5, -4, -5, -6, 7, -7, 8, -8, -9];\n var Ff = [\n [\n [\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [253, 136, 254, 255, 228, 219, 128, 128, 128, 128, 128],\n [189, 129, 242, 255, 227, 213, 255, 219, 128, 128,\n 128,\n ],\n [106, 126, 227, 252, 214, 209, 255, 255, 128, 128, 128],\n ],\n [\n [1, 98, 248, 255, 236, 226, 255, 255, 128, 128, 128],\n [181, 133, 238, 254, 221, 234, 255, 154, 128, 128, 128],\n [78, 134, 202, 247, 198, 180, 255, 219, 128, 128, 128],\n ],\n [\n [1, 185, 249, 255, 243, 255, 128, 128, 128, 128, 128],\n [184, 150, 247, 255, 236, 224, 128, 128, 128, 128, 128],\n [77, 110, 216, 255, 236, 230, 128, 128, 128, 128, 128],\n ],\n [\n [1, 101, 251, 255, 241, 255, 128, 128, 128, 128, 128],\n [170, 139, 241, 252, 236, 209, 255, 255, 128, 128, 128],\n [37, 116, 196, 243, 228, 255, 255, 255, 128, 128, 128],\n ],\n [\n [1, 204, 254, 255, 245, 255, 128, 128, 128, 128,\n 128,\n ],\n [207, 160, 250, 255, 238, 128, 128, 128, 128, 128, 128],\n [102, 103, 231, 255, 211, 171, 128, 128, 128, 128, 128],\n ],\n [\n [1, 152, 252, 255, 240, 255, 128, 128, 128, 128, 128],\n [177, 135, 243, 255, 234, 225, 128, 128, 128, 128, 128],\n [80, 129, 211, 255, 194, 224, 128, 128, 128, 128, 128],\n ],\n [\n [1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [246, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n ],\n [\n [\n [198, 35, 237, 223, 193, 187, 162, 160, 145, 155, 62],\n [131, 45, 198, 221, 172, 176, 220, 157, 252, 221, 1],\n [68, 47, 146, 208, 149, 167, 221, 162, 255, 223, 128],\n ],\n [\n [1, 149, 241, 255, 221, 224, 255, 255, 128, 128, 128],\n [184, 141, 234, 253, 222, 220, 255, 199, 128, 128, 128],\n [81, 99, 181, 242, 176, 190, 249, 202, 255, 255, 128],\n ],\n [\n [1, 129, 232, 253, 214, 197, 242, 196, 255, 255, 128],\n [99, 121, 210, 250, 201, 198, 255, 202, 128, 128, 128],\n [23, 91, 163, 242, 170, 187, 247, 210, 255, 255, 128],\n ],\n [\n [1, 200, 246, 255, 234, 255, 128, 128, 128, 128, 128],\n [109, 178, 241, 255, 231, 245, 255, 255, 128, 128, 128],\n [44, 130, 201, 253, 205, 192, 255, 255, 128, 128, 128],\n ],\n [\n [1, 132, 239, 251, 219, 209, 255, 165, 128, 128, 128],\n [94, 136, 225, 251, 218, 190, 255, 255, 128, 128, 128],\n [22,\n 100, 174, 245, 186, 161, 255, 199, 128, 128, 128,\n ],\n ],\n [\n [1, 182, 249, 255, 232, 235, 128, 128, 128, 128, 128],\n [124, 143, 241, 255, 227, 234, 128, 128, 128, 128, 128],\n [35, 77, 181, 251, 193, 211, 255, 205, 128, 128, 128],\n ],\n [\n [1, 157, 247, 255, 236, 231, 255, 255, 128, 128, 128],\n [121, 141, 235, 255, 225, 227, 255, 255, 128, 128, 128],\n [45, 99, 188, 251, 195, 217, 255, 224, 128, 128, 128],\n ],\n [\n [1, 1, 251, 255, 213, 255, 128, 128, 128, 128, 128],\n [203, 1, 248, 255, 255, 128, 128, 128, 128, 128, 128],\n [137, 1, 177, 255, 224, 255, 128, 128, 128, 128, 128],\n ],\n ],\n [\n [\n [253, 9, 248, 251, 207, 208, 255, 192, 128, 128, 128],\n [175, 13,\n 224, 243, 193, 185, 249, 198, 255, 255, 128,\n ],\n [73, 17, 171, 221, 161, 179, 236, 167, 255, 234, 128],\n ],\n [\n [1, 95, 247, 253, 212, 183, 255, 255, 128, 128, 128],\n [239, 90, 244, 250, 211, 209, 255, 255, 128, 128, 128],\n [155, 77, 195, 248, 188, 195, 255, 255, 128, 128, 128],\n ],\n [\n [1, 24, 239, 251, 218, 219, 255, 205, 128, 128, 128],\n [201, 51, 219, 255, 196, 186, 128, 128, 128, 128, 128],\n [69, 46, 190, 239, 201, 218, 255, 228, 128, 128, 128],\n ],\n [\n [1, 191, 251, 255, 255, 128, 128, 128, 128, 128, 128],\n [223, 165, 249, 255, 213, 255, 128, 128, 128, 128, 128],\n [141, 124, 248, 255, 255, 128, 128, 128, 128, 128, 128],\n ],\n [\n [1, 16, 248, 255,\n 255, 128, 128, 128, 128, 128, 128,\n ],\n [190, 36, 230, 255, 236, 255, 128, 128, 128, 128, 128],\n [149, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [1, 226, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [247, 192, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [240, 128, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [1, 134, 252, 255, 255, 128, 128, 128, 128, 128, 128],\n [213, 62, 250, 255, 255, 128, 128, 128, 128, 128, 128],\n [55, 93, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128,\n 128, 128, 128, 128, 128, 128, 128,\n ],\n ],\n ],\n [\n [\n [202, 24, 213, 235, 186, 191, 220, 160, 240, 175, 255],\n [126, 38, 182, 232, 169, 184, 228, 174, 255, 187, 128],\n [61, 46, 138, 219, 151, 178, 240, 170, 255, 216, 128],\n ],\n [\n [1, 112, 230, 250, 199, 191, 247, 159, 255, 255, 128],\n [166, 109, 228, 252, 211, 215, 255, 174, 128, 128, 128],\n [39, 77, 162, 232, 172, 180, 245, 178, 255, 255, 128],\n ],\n [\n [1, 52, 220, 246, 198, 199, 249, 220, 255, 255, 128],\n [124, 74, 191, 243, 183, 193, 250, 221, 255, 255, 128],\n [24, 71, 130, 219, 154, 170, 243, 182, 255, 255, 128],\n ],\n [\n [1, 182, 225, 249, 219, 240, 255, 224, 128, 128, 128],\n [149, 150, 226, 252, 216,\n 205, 255, 171, 128, 128, 128,\n ],\n [28, 108, 170, 242, 183, 194, 254, 223, 255, 255, 128],\n ],\n [\n [1, 81, 230, 252, 204, 203, 255, 192, 128, 128, 128],\n [123, 102, 209, 247, 188, 196, 255, 233, 128, 128, 128],\n [20, 95, 153, 243, 164, 173, 255, 203, 128, 128, 128],\n ],\n [\n [1, 222, 248, 255, 216, 213, 128, 128, 128, 128, 128],\n [168, 175, 246, 252, 235, 205, 255, 255, 128, 128, 128],\n [47, 116, 215, 255, 211, 212, 255, 255, 128, 128, 128],\n ],\n [\n [1, 121, 236, 253, 212, 214, 255, 255, 128, 128, 128],\n [141, 84, 213, 252, 201, 202, 255, 219, 128, 128, 128],\n [42, 80, 160, 240, 162, 185, 255, 205, 128, 128, 128],\n ],\n [\n [1, 1, 255, 128, 128, 128, 128,\n 128, 128, 128, 128,\n ],\n [244, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [238, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n ],\n ];\n var Rf = [\n [\n [231, 120, 48, 89, 115, 113, 120, 152, 112],\n [152, 179, 64, 126, 170, 118, 46, 70, 95],\n [175, 69, 143, 80, 85, 82, 72, 155, 103],\n [56, 58, 10, 171, 218, 189, 17, 13, 152],\n [114, 26, 17, 163, 44, 195, 21, 10, 173],\n [121, 24, 80, 195, 26, 62, 44, 64, 85],\n [144, 71, 10, 38, 171, 213, 144, 34, 26],\n [170, 46, 55, 19, 136, 160, 33, 206, 71],\n [63, 20, 8, 114, 114, 208, 12, 9, 226],\n [81, 40, 11, 96, 182, 84, 29, 16, 36],\n ],\n [\n [134, 183, 89, 137, 98, 101, 106, 165, 148],\n [72, 187, 100, 130, 157, 111,\n 32, 75, 80,\n ],\n [66, 102, 167, 99, 74, 62, 40, 234, 128],\n [41, 53, 9, 178, 241, 141, 26, 8, 107],\n [74, 43, 26, 146, 73, 166, 49, 23, 157],\n [65, 38, 105, 160, 51, 52, 31, 115, 128],\n [104, 79, 12, 27, 217, 255, 87, 17, 7],\n [87, 68, 71, 44, 114, 51, 15, 186, 23],\n [47, 41, 14, 110, 182, 183, 21, 17, 194],\n [66, 45, 25, 102, 197, 189, 23, 18, 22],\n ],\n [\n [88, 88, 147, 150, 42, 46, 45, 196, 205],\n [43, 97, 183, 117, 85, 38, 35, 179, 61],\n [39, 53, 200, 87, 26, 21, 43, 232, 171],\n [56, 34, 51, 104, 114, 102, 29, 93, 77],\n [39, 28, 85, 171, 58, 165, 90, 98, 64],\n [34, 22, 116, 206, 23, 34, 43, 166, 73],\n [107, 54, 32, 26, 51, 1, 81, 43, 31],\n [68, 25, 106, 22,\n 64, 171, 36, 225, 114,\n ],\n [34, 19, 21, 102, 132, 188, 16, 76, 124],\n [62, 18, 78, 95, 85, 57, 50, 48, 51],\n ],\n [\n [193, 101, 35, 159, 215, 111, 89, 46, 111],\n [60, 148, 31, 172, 219, 228, 21, 18, 111],\n [112, 113, 77, 85, 179, 255, 38, 120, 114],\n [40, 42, 1, 196, 245, 209, 10, 25, 109],\n [88, 43, 29, 140, 166, 213, 37, 43, 154],\n [61, 63, 30, 155, 67, 45, 68, 1, 209],\n [100, 80, 8, 43, 154, 1, 51, 26, 71],\n [142, 78, 78, 16, 255, 128, 34, 197, 171],\n [41, 40, 5, 102, 211, 183, 4, 1, 221],\n [51, 50, 17, 168, 209, 192, 23, 25, 82],\n ],\n [\n [138, 31, 36, 171, 27, 166, 38, 44, 229],\n [67, 87, 58, 169, 82, 115, 26, 59, 179],\n [63, 59, 90, 180, 59, 166, 93, 73,\n 154,\n ],\n [40, 40, 21, 116, 143, 209, 34, 39, 175],\n [47, 15, 16, 183, 34, 223, 49, 45, 183],\n [46, 17, 33, 183, 6, 98, 15, 32, 183],\n [57, 46, 22, 24, 128, 1, 54, 17, 37],\n [65, 32, 73, 115, 28, 128, 23, 128, 205],\n [40, 3, 9, 115, 51, 192, 18, 6, 223],\n [87, 37, 9, 115, 59, 77, 64, 21, 47],\n ],\n [\n [104, 55, 44, 218, 9, 54, 53, 130, 226],\n [64, 90, 70, 205, 40, 41, 23, 26, 57],\n [54, 57, 112, 184, 5, 41, 38, 166, 213],\n [30, 34, 26, 133, 152, 116, 10, 32, 134],\n [39, 19, 53, 221, 26, 114, 32, 73, 255],\n [31, 9, 65, 234, 2, 15, 1, 118, 73],\n [75, 32, 12, 51, 192, 255, 160, 43, 51],\n [88, 31, 35, 67, 102, 85, 55, 186, 85],\n [56, 21, 23, 111, 59, 205, 45, 37, 192],\n [55, 38, 70, 124, 73, 102, 1, 34, 98],\n ],\n [\n [125, 98, 42, 88, 104, 85, 117, 175, 82],\n [95, 84, 53, 89, 128, 100, 113, 101, 45],\n [75, 79, 123, 47, 51, 128, 81, 171, 1],\n [57, 17, 5, 71, 102, 57, 53, 41, 49],\n [38, 33, 13, 121, 57, 73, 26, 1, 85],\n [41, 10, 67, 138, 77, 110, 90, 47, 114],\n [115, 21, 2, 10, 102, 255, 166, 23, 6],\n [101, 29, 16, 10, 85, 128, 101, 196, 26],\n [57, 18, 10, 102, 102, 213, 34, 20, 43],\n [117, 20, 15, 36, 163, 128, 68, 1, 26],\n ],\n [\n [102, 61, 71, 37, 34, 53, 31, 243, 192],\n [69, 60, 71, 38, 73, 119, 28, 222, 37],\n [68, 45, 128, 34, 1, 47, 11, 245, 171],\n [62, 17, 19, 70, 146, 85, 55, 62, 70],\n [37, 43, 37, 154, 100, 163, 85, 160,\n 1,\n ],\n [63, 9, 92, 136, 28, 64, 32, 201, 85],\n [75, 15, 9, 9, 64, 255, 184, 119, 16],\n [86, 6, 28, 5, 64, 255, 25, 248, 1],\n [56, 8, 17, 132, 137, 255, 55, 116, 128],\n [58, 15, 20, 82, 135, 57, 26, 121, 40],\n ],\n [\n [164, 50, 31, 137, 154, 133, 25, 35, 218],\n [51, 103, 44, 131, 131, 123, 31, 6, 158],\n [86, 40, 64, 135, 148, 224, 45, 183, 128],\n [22, 26, 17, 131, 240, 154, 14, 1, 209],\n [45, 16, 21, 91, 64, 222, 7, 1, 197],\n [56, 21, 39, 155, 60, 138, 23, 102, 213],\n [83, 12, 13, 54, 192, 255, 68, 47, 28],\n [85, 26, 85, 85, 128, 128, 32, 146, 171],\n [18, 11, 7, 63, 144, 171, 4, 4, 246],\n [35, 27, 10, 146, 174, 171, 12, 26, 128],\n ],\n [\n [190, 80, 35, 99, 180, 80,\n 126, 54, 45,\n ],\n [85, 126, 47, 87, 176, 51, 41, 20, 32],\n [101, 75, 128, 139, 118, 146, 116, 128, 85],\n [56, 41, 15, 176, 236, 85, 37, 9, 62],\n [71, 30, 17, 119, 118, 255, 17, 18, 138],\n [101, 38, 60, 138, 55, 70, 43, 26, 142],\n [146, 36, 19, 30, 171, 255, 97, 27, 20],\n [138, 45, 61, 62, 219, 1, 81, 188, 64],\n [32, 41, 20, 117, 151, 142, 20, 21, 163],\n [112, 19, 12, 61, 195, 128, 48, 4, 24],\n ],\n ];\n var If = [\n [\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [176, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [223, 241,\n 252, 255, 255, 255, 255, 255, 255, 255, 255,\n ],\n [249, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 244, 252, 255, 255, 255, 255, 255, 255, 255, 255],\n [234, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 246, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [239, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [251, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [251, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 253, 255, 254, 255, 255, 255, 255, 255, 255],\n [250, 255, 254, 255, 254, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n ],\n [\n [\n [217, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [225, 252, 241, 253, 255, 255, 254, 255,\n 255, 255, 255,\n ],\n [234, 250, 241, 250, 253, 255, 253, 254, 255, 255, 255],\n ],\n [\n [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [223, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [238, 253, 254, 254, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [249, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [247, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 254, 255, 255,\n 255, 255, 255, 255, 255, 255,\n ],\n [252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255,\n 255, 255, 255, 255, 255, 255, 255, 255,\n ],\n ],\n ],\n [\n [\n [186, 251, 250, 255, 255, 255, 255, 255, 255, 255, 255],\n [234, 251, 244, 254, 255, 255, 255, 255, 255, 255, 255],\n [251, 251, 243, 253, 254, 255, 254, 255, 255, 255, 255],\n ],\n [\n [255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [236, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [251, 253, 253, 254, 254, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255,\n 255, 255,\n ],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n ],\n [\n [\n [248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [250, 254, 252, 254, 255, 255, 255, 255, 255, 255, 255],\n [248, 254, 249, 253, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [246, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [252, 254, 251, 254, 254, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 252, 255, 255, 255, 255, 255, 255, 255, 255],\n [248, 254, 253, 255, 255, 255,\n 255, 255, 255, 255, 255,\n ],\n [253, 255, 254, 254, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [245, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [253, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 251, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [252, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [249, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 253,\n 255, 255, 255, 255, 255, 255, 255, 255,\n ],\n [250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n ],\n ];\n this.WebPGetDecoderVersion = this.Ld = function () {\n return 512;\n };\n var Nc = [0, 1, 2, 3, 6, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 0];\n var Jf = [\n [173, 148, 140, 0],\n [176, 155, 140, 135, 0],\n [180, 157, 141, 134, 130, 0],\n [254, 254, 243, 230, 196, 177, 153, 140, 133, 130, 129, 0],\n ];\n var Kf = [0, 1, 4, 8, 5, 2, 3, 6,\n 9, 12, 13, 10, 7, 11, 14, 15,\n ];\n var Tf = md([Kc, Lc], '');\n U(4, x);\n var vc = [\n [0, 0, 0, 0],\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [1, 1, 0, 0],\n [0, 0, 1, 0],\n [1, 0, 1, 0],\n [0, 1, 1, 0],\n [1, 1, 1, 0],\n [0, 0, 0, 1],\n [1, 0, 0, 1],\n [0, 1, 0, 1],\n [1, 1, 0, 1],\n [0, 0, 1, 1],\n [1, 0, 1, 1],\n [0, 1, 1, 1],\n [1, 1, 1, 1],\n ];\n var Lf = 134480385;\n var ea = 16;\n var J = -227;\n var dd = 482;\n var Ce = [Wc, function (a) {\n return a;\n }, function (a, b, c) {\n return b[c + 0];\n }, function (a, b, c) {\n return b[c + 1];\n }, function (a, b, c) {\n return b[c - 1];\n }, function (a, b, c) {\n return ka(ka(a, b[c + 1]), b[c + 0]);\n }, function (a, b, c) {\n return ka(a, b[c - 1]);\n }, function (a, b, c) {\n return ka(a, b[c + 0]);\n }, function (a,\n b, c) {\n return ka(b[c - 1], b[c + 0]);\n }, function (a, b, c) {\n return ka(b[c + 0], b[c + 1]);\n }, function (a, b, c) {\n return ka(ka(a, b[c - 1]), ka(b[c + 0], b[c + 1]));\n }, function (a, b, c) {\n return Math.abs((a >> 24 & 255) - (b[c - 1] >> 24 & 255)) - Math.abs((b[c + 0] >> 24 & 255) - (b[c - 1] >> 24 & 255)) + (Math.abs((a >> 16 & 255) - (b[c - 1] >> 16 & 255)) - Math.abs((b[c + 0] >> 16 & 255) - (b[c - 1] >> 16 & 255))) + (Math.abs((a >> 8 & 255) - (b[c - 1] >> 8 & 255)) - Math.abs((b[c + 0] >> 8 & 255) - (b[c - 1] >> 8 & 255))) + (Math.abs((a & 255) - (b[c - 1] & 255)) - Math.abs((b[c + 0] & 255) - (b[c - 1] & 255))) <= 0 ? b[c + 0] : a;\n }, function (a, b, c) {\n return ($a((a\n >> 24 & 255) + (b[c + 0] >> 24 & 255) - (b[c - 1] >> 24 & 255)) << 24 | $a((a >> 16 & 255) + (b[c + 0] >> 16 & 255) - (b[c - 1] >> 16 & 255)) << 16 | $a((a >> 8 & 255) + (b[c + 0] >> 8 & 255) - (b[c - 1] >> 8 & 255)) << 8 | $a((a & 255) + (b[c + 0] & 255) - (b[c - 1] & 255))) >>> 0;\n }, function (a, b, c) {\n const d = b[c - 1];\n a = ka(a, b[c + 0]);\n return (yb(a >> 24 & 255, d >> 24 & 255) << 24 | yb(a >> 16 & 255, d >> 16 & 255) << 16 | yb(a >> 8 & 255, d >> 8 & 255) << 8 | yb(a >> 0 & 255, d >> 0 & 255)) >>> 0;\n }, Wc, Wc];\n var Xf = {\n Cc: x,\n Bc: x,\n Kc: x,\n };\n var $c = 16;\n var Me = 16;\n var kg = 16;\n var mg = [2, 3, 7];\n var lg = [3, 3, 11];\n var Zf = 0;\n var $f = 1;\n var ag = 2;\n var bg = 3;\n var cg = 4;\n var hg = [Ba + Ge, Ba, Ba, Ba, 40];\n var Ke = 19;\n var ig = [17, 18, 0, 1, 2, 3, 4, 5, 16,\n 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n ];\n var He = 120;\n var dg = [24, 7, 23, 25, 40, 6, 39, 41, 22, 26, 38, 42, 56, 5, 55, 57, 21, 27, 54, 58, 37, 43, 72, 4, 71, 73, 20, 28, 53, 59, 70, 74, 36, 44, 88, 69, 75, 52, 60, 3, 87, 89, 19, 29, 86, 90, 35, 45, 68, 76, 85, 91, 51, 61, 104, 2, 103, 105, 18, 30, 102, 106, 34, 46, 84, 92, 67, 77, 101, 107, 50, 62, 120, 1, 119, 121, 83, 93, 17, 31, 100, 108, 66, 78, 118, 122, 33, 47, 117, 123, 49, 63, 99, 109, 82, 94, 0, 116, 124, 65, 79, 16, 32, 98, 110, 48, 115, 125, 81, 95, 64, 114, 126, 97, 111, 80, 113, 127, 96, 112];\n var Jb = 1 << ea - 1;\n var Za = U(256, 0);\n var xb = U(256, 0);\n var vb = U(256, la);\n var wb = U(256, la);\n var ia = U(dd - J, x);\n var Hb = U(dd\n - J, x);\n var Xe = 0;\n var V = Array(Cc);\n var vg = [function (a, b, c, d, e, f, k, h, n, l, m, t, q) {\n Ca(a, b, c, d, e, f, k, h, n, l, m, t, q, hc, 3);\n }, Se, function (a, b, c, d, e, f, k, h, n, l, m, t, q) {\n Ca(a, b, c, d, e, f, k, h, n, l, m, t, q, Vc, 3);\n }, Te, Ue, Ve, function (a, b, c, d, e, f, k, h, n, l, m, t, q) {\n Ca(a, b, c, d, e, f, k, h, n, l, m, t, q, le, 2);\n }, Se, Te, Ue, Ve];\n this.Hd = function (a, b, c, d) {\n return lb(Qa, a, b, c, d);\n };\n this.Id = function (a, b, c, d) {\n return lb(jb, a, b, c, d);\n };\n this.Jd = function (a, b, c, d) {\n return lb(kb, a, b, c, d);\n };\n this.Ed = function (a, b, c, d) {\n return lb(Ab, a, b, c, d);\n };\n this.Fd = function (a, b, c, d) {\n return lb(Zc,\n a, b, c, d);\n };\n this.Gd = function (a, b, c, d) {\n return lb(Pa, a, b, c, d);\n };\n this.WebPDecode = this.Dd = function (a, b, c) {\n const d = M(df);\n let e = 'VP8StatusCode';\n if (c == p) return ta;\n e = hd(a, [0], [b], c.input);\n if (e != L) return e == Z ? W : e;\n d.j = c.j;\n d.Qa = c.Qa;\n return e = cf(a, 0, [b], d);\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 {webp2png} from './webp';\nimport type {ConvertWebPTask} from './webpWorkerController';\n\nconst ctx = self as any as DedicatedWorkerGlobalScope;\nconst tasks: ConvertWebPTask[] = [];\n// let isProcessing = false;\n\nfunction finishTask() {\n // isProcessing = false;\n processTasks();\n}\n\nfunction processTasks() {\n // if(isProcessing) return;\n\n const task = tasks.shift();\n if(!task) return;\n\n // isProcessing = true;\n\n switch(task.type) {\n case 'convertWebp': {\n const {fileName, bytes} = task.payload;\n\n let convertedBytes: Uint8Array;\n try {\n convertedBytes = webp2png(bytes).bytes;\n } catch(err) {\n console.error('Convert webp2png error:', err, 'payload:', task.payload);\n }\n\n ctx.postMessage({\n type: 'convertWebp',\n payload: {\n fileName,\n bytes: convertedBytes\n }\n });\n\n finishTask();\n\n break;\n }\n\n default:\n finishTask();\n }\n}\n\nfunction scheduleTask(task: ConvertWebPTask) {\n tasks.push(task);\n /* if(task.payload.fileName.indexOf('main-') === 0) {\n tasks.push(task);\n } else {\n tasks.unshift(task);\n } */\n\n processTasks();\n}\n\nctx.addEventListener('message', (event) => {\n scheduleTask(event.data);\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 {WebPDecoder} from '../../vendor/libwebp-0.2.0';\nimport {encode} from 'fast-png';\n\nexport function webp2png(data: Uint8Array) {\n const decoder = new WebPDecoder();\n const config: any = decoder.WebPDecoderConfig;\n const buffer = config.j || config.output;\n const bitstream = config.input;\n\n decoder.WebPInitDecoderConfig(config);\n decoder.WebPGetFeatures(data, data.length, bitstream);\n\n /** MODE_RGBA = 1 MODE_ARGB = 4, */\n buffer.J = 1;\n\n let status;\n try {\n status = decoder.WebPDecode(data, data.length, config);\n } catch(e) {\n status = e;\n }\n\n if(status === 0) {\n const rgbaData = buffer.Jb;\n const pngData = encode({\n data: rgbaData,\n width: buffer.width,\n height: buffer.height,\n channels: 4,\n depth: 8\n });\n\n return {status, bytes: pngData};\n }\n\n return {status, bytes: data};\n}\n\nexport function webp2pngAsBlob(data: Uint8Array) {\n const {status, bytes} = webp2png(data);\n return new Blob([bytes], {type: status === 0 ? 'image/png' : 'image/webp'});\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [699,866,158], () => (__webpack_require__(2061)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + {\"158\":\"npm.iobuffer\",\"699\":\"npm.pako\",\"866\":\"npm.fast-png\"}[chunkId] + \".\" + {\"158\":\"8fe11aa09121a6fd9200\",\"699\":\"89deb457201f16c93925\",\"866\":\"a7cba17ee621cb2ad512\"}[chunkId] + \".chunk.js\";\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = {};\n var countMap = {};\n var getRetryDelay = function () {\n return 3000;\n };\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result +\n (queryMap.hasOwnProperty(chunkId) ? '?' + queryMap[chunkId] : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.hasOwnProperty(chunkId)\n ? countMap[chunkId]\n : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n var retryAttempt = 999999 - retries + 1;\n setTimeout(function () {\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap[chunkId] = cacheBust;\n countMap[chunkId] = retries - 1;\n resolve(__webpack_require__.e(chunkId));\n }, getRetryDelay(retryAttempt));\n });\n });\n };\n }\n})();\n","// no baseURI\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t61: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","next","i","p","M","F","JSON","parse","stringify","N","G","w","D","S","Nb","length","push","ic","rc","memmove","arr1","index1","arr2","index2","jd","kd","ga","String","fromCharCode","U","ld","md","$","Error","WebPDecoder","a","Ob","Pb","Bb","Qb","b","c","la","d","e","Z","gc","bc","qa","Ia","Rb","ya","T","Q","g","L","fa","Sb","Da","gf","hf","ma","Pa","gb","nd","Y","jf","s","ja","jc","k","h","n","l","kc","od","Tb","pd","Ea","qd","P","v","Ga","ub","Xb","m","f","q","r","u","C","Ub","kf","lf","rd","Vb","A","z","sd","td","na","put","ud","Mb","vd","wd","ka","fd","width","height","o","Wa","Cb","Ka","xd","Db","lc","V","Ha","mf","sa","nf","zd","ta","Ua","wc","vc","t","I","Ba","Aa","J","Qa","Cc","Fc","Jb","yd","ua","parseInt","Ra","cb","RGBA","Sa","size","Va","y","Wc","B","nb","Rc","rb","Uc","Wb","Fa","of","mb","Ad","pf","qf","mc","nc","rf","Dc","oa","Yb","Zb","sc","oc","Bd","va","Cd","tc","Dd","Ed","sf","tf","uf","vf","wf","xf","yf","zf","Af","Bf","Fd","$b","Cf","Df","Ef","Ec","wa","Gd","xc","alert","za","Hd","Id","Jd","Gc","data","Kd","ia","W","pa","offset","Ac","fb","Jc","Nc","gd","hd","Ma","hb","K","R","Ta","Ff","Ca","pb","ob","tb","Kb","Lb","uc","$c","xa","Ld","Ab","Oc","Fb","kb","Hc","Lc","Gf","Hb","yb","Ic","sb","qc","Hf","Zc","Md","Nd","Kc","If","pc","Pc","fc","dd","cd","Mc","Jf","Kf","Lf","Mf","Nf","Za","lb","Ya","wb","Ja","qb","WebPWorkerReset","Qd","Rd","Ud","FinishRow","jb","Od","Of","Pf","Pd","Gb","ib","dc","Xc","Sc","Vc","Sd","ha","H","ca","da","aa","ba","ra","La","Qc","Td","Vd","Wd","Xd","Yd","Zd","$d","ae","be","ce","Qf","db","X","cc","O","Eb","Rf","Sf","de","ee","fe","ge","Tc","Oa","Tf","ea","ab","Xa","he","vb","xb","ac","ie","Uf","$a","Vf","je","zb","zc","yc","eb","WebPWorkerSync","OK","hc","WebPWorkerLaunch","Ib","Na","ec","Bc","ke","le","me","ne","oe","pe","qe","re","se","te","ue","ve","we","Wf","xe","Yc","ye","bd","ze","Ae","Be","Ce","De","Xf","Ee","Yf","EmitRescaledRows","WebPApplyAlphaMultiply","WebPApplyAlphaMultiply4444","Fe","EmitRescaledRowsYUVA","EmitRowsYUVA","Ge","Zf","$f","ag","bg","ad","bb","cg","He","dg","End","Ie","eg","Je","Array","fg","gg","hg","Ke","ig","jg","Le","Me","kg","lg","mg","pg","qg","Oe","Pe","Qe","Re","rg","Se","Te","Ue","Ve","sg","tg","j","ug","vg","wg","xg","We","yg","zg","memory","Ne","InitRGBRescaler","InitYUVRescaler","Xe","ed","Ye","Ag","Bg","Ze","$e","af","bf","cf","ng","AllocateAndInitRescaler","og","Cg","this","value","df","ef","WEBP_CSP_MODE","VP8StatusCode","rotate","WebPGetFeatures","ff","WebPDecoderConfig","input","options","WebPInitDecoderConfig","Math","pow","Eg","Fg","Gg","id","Hg","Ig","Kg","WebPFreeDecBuffer","WebPGetDecoderVersion","abs","WebPDecode","ctx","self","tasks","finishTask","processTasks","task","shift","type","fileName","bytes","payload","convertedBytes","decoder","config","buffer","output","bitstream","status","rgbaData","channels","depth","webp2png","err","console","error","postMessage","addEventListener","event","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","call","x","__webpack_exports__","result","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","Object","keys","every","key","splice","definition","defineProperty","enumerable","get","chunkId","Promise","all","reduce","promises","miniCssF","globalThis","Function","window","obj","prop","prototype","hasOwnProperty","scriptUrl","importScripts","location","document","currentScript","src","scripts","getElementsByTagName","replace","oldGetScript","oldLoadScript","queryMap","countMap","catch","retries","realSrc","message","request","resolve","setTimeout","cacheBust","Date","now","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","bind","moreModules","runtime","pop","map","then"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"61.5a1b64b6ed7885fd6d34.chunk.js","mappings":"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,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,OAGvD,CACE,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAClC,IAAK,IAAK,KAEZ,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IACnB,IAAK,IAAK,IAAK,IAAK,IAAK,KAE3B,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IACT,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,OAIzC,CACE,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACvC,IAAK,MAGT,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,OAGvD,CACE,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IACxB,IAAK,IAAK,IAAK,IAAK,KAEtB,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IACT,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAErC,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/startup chunk dependencies","webpack://tweb/./src/vendor/libwebp-0.2.0.js","webpack://tweb/./src/lib/webp/webp.worker.ts","webpack://tweb/./src/lib/webp/webp.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/importScripts chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn Promise.all([699,866,158].map(__webpack_require__.e, __webpack_require__)).then(next);\n};","// Copyright 2011 Google Inc.\n//\n// This code is licensed under the same terms as WebM:\n// Software License Agreement: http://www.webmproject.org/license/software/\n// Additional IP Rights Grant: http://www.webmproject.org/license/additional/\n// -----------------------------------------------------------------------------\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// -----------------------------------------------------------------------------\n//\n// Copyright 2011-2013 Dominik Homberger\n// Libwebp Javascript / libwebpjs - the libwebp implementation in javascript (v0.2.0)\n//\n// Author: Dominik Homberger (dominik.homberger@gmail.com)\n\nlet i;\nlet a;\nlet self;\nconst ca = 0;\nconst p = null;\nconst s = 0;\nconst x = 0;\nconst la = s;\nconst E = s;\nconst bb = 0;\nconst Mb = 0;\n\nfunction M(F) {\n return JSON.parse(JSON.stringify(F));\n}\n\nfunction N(F, G, w, D, S) {\n for (i = 0; i < S; ++i) F[G + i] = w[D + i];\n}\n\nfunction Nb(F) {\n const G = [];\n const w = F.length;\n let D;\n for (D = 0; D < w; ++D) G.push(F[D]);\n return G;\n}\n\nfunction ic(F, G) {\n const w = [];\n w.push(M(F));\n let D;\n for (D = 0; D < G; ++D) w.push(M(F));\n w.push(0);\n return w;\n}\n\nfunction rc(F, G) {\n const w = [];\n let D;\n for (D = 0; D < G; ++D) w.push(F);\n w.push(0);\n return w;\n}\n\nfunction memmove(arr1, index1, arr2, index2, length) {\n let i;\n for (i = 0; i < length; i++) {\n arr1[index1 + i] = arr2[index2 + i];\n }\n}\n\nfunction jd(F, G, w, D) {\n let S;\n for (S = 0; S < D; ++S) F[G + S] = w;\n}\n\nfunction kd(F, G, w, D) {\n let S = '';\n let ga;\n for (ga = 0; ga < D; ++ga) S += String.fromCharCode(F[G + ga]);\n return w == S ? 0 : 1;\n}\n\nfunction U(F, G) {\n let w; const\n D = [];\n for (w = 0; w < F; ++w) D.push(G);\n return D;\n}\n\nfunction ld(F, G) {\n let w; const\n D = [];\n for (w = 0; w < F; ++w) D.push(M(G));\n return D;\n}\n\nfunction md(F, G) {\n let w;\n for (w = F.length - 1; w >= 0; --w) G = M(U(F[w], G));\n return G;\n}\n\nfunction $(F) {\n if (!F) throw Error('assert :P');\n}\nexport const WebPDecoder = function () {\n function F(a) {\n return a == Ob || a == Pb || a == Bb || a == Qb;\n }\n\n function G(a) {\n return S(a, 1);\n }\n\n function w(a, b) {\n const c = 1 + ((a.la - 1) * b >> 8);\n const d = c << 8;\n let e = s;\n a.Z >= d ? (e = 1, a.la -= c, a.Z -= d) : (e = 0, a.la = c);\n for (; a.la < 128;) a.Z <<= 1, a.la <<= 1, ++a.gc == 8 && (a.gc = 0, a.bc && (a.Z += a.qa[a.Ia++], a.bc--));\n return e;\n }\n\n function D(a, b, c, d) {\n d -= c;\n d >= 2 ? (a.Z = b[c + 0] << 8 | b[c + 1], a.qa = b, a.Ia = c + 2, a.bc = d - 2) : (a.Z = 0, a.qa = p, a.bc = 0);\n a.la = 255;\n a.gc = 0;\n }\n\n function S(a, b) {\n for (var c = 0, d = s, d = b - 1; d >= 0; d--) c |= w(a, 128) << d;\n return c;\n }\n\n function ga(a, b) {\n const c = S(a, b);\n return G(a) ? -c : c;\n }\n\n function Rb(a, b, c, d) {\n let e = Mb;\n $(a != p);\n $(b != p);\n $(d < 4294967288);\n a.qa = b;\n a.Ia = c;\n a.ya = d;\n a.T = 0;\n a.Q = 0;\n a.g = 0;\n a.L = 0;\n for (e = a.fa = 0; e < 4 && e < a.ya; ++e) a.T |= a.qa[a.Ia + a.Q] << 8 * e, ++a.Q;\n }\n\n function Sb(a) {\n for (; a.g >= 8 && a.Q < a.ya;) a.T >>>= 8, a.T += a.qa[a.Ia + a.Q] << 24 >>> 0, ++a.Q, a.g -= 8;\n }\n\n function Da(a) {\n a.g >= 8 && Sb(a);\n a.Q == a.ya && a.g == 32 && (a.L = 1);\n }\n\n function T(a, b) {\n let c = 0;\n $(b >= 0);\n if (!a.L && b < gf) {\n if (a.Q == a.ya && a.g + b >= 32 && (a.L = 1, a.g + b > 32)) return c;\n c = a.T >> a.g & hf[b];\n a.g += b;\n a.g >= 8 && a.g >= 8 && Sb(a);\n } else a.fa = 1;\n return c;\n }\n\n function ma(a) {\n return a.Pa == a.gb;\n }\n\n function nd(a, b) {\n $(a != p);\n if (b == 0) return 0;\n a.gb = 2 * b - 1;\n a.Y = ld(a.gb, jf);\n if (a.Y == p) return 0;\n a.Y[0].s = -1;\n return a.Pa = 1;\n }\n\n function ja(a) {\n a != p && (a.Y = p, a.Y = p, a.gb = 0, a.Pa = 0);\n }\n\n function jc(a, b, c, d) {\n for (var e = a.Y, g = 0, k = +a.gb; d-- > 0;) {\n if (g >= k) return 0;\n if (e[g].s < 0) {\n if (ma(a)) return 0;\n const h = a;\n const n = h.Y;\n const l = +h.Pa;\n e[g].s = l - g;\n h.Pa += 2;\n n[l + 0].s = -1;\n n[l + 1].s = -1;\n } else if (e[g].s == 0) return 0;\n g += e[g].s + (c >> d & 1);\n }\n if (e[g].s < 0) e[g].s = 0;\n else if (e[g].s != 0) return 0;\n e[g].kc = b;\n return 1;\n }\n\n function od(a, b, c) {\n var d = s;\n let e = 0;\n let g = 0;\n $(a != p);\n $(b != p);\n for (d = 0; d < c; ++d) b[d] > 0 && (++e, g = d);\n if (!nd(a, e)) return 0;\n if (e == 1) return g < 0 || g >= c ? (ja(a), 0) : jc(a, g, 0, 0);\n e = 0;\n g = U(c, s);\n if (g == p) return (e = e && ma(a)) || ja(a), e;\n var k = s;\n var k = s;\n var d = U(Tb + 1, 0);\n let h = s;\n const n = U(Tb + 1, 0);\n let l = 0;\n $(b != p);\n $(c > 0);\n $(g != p);\n for (k = 0; k < c; ++k) b[k] > l && (l = b[k]);\n if (l > Tb) d = 0;\n else {\n for (k = 0; k < c; ++k) ++d[b[k]];\n h = d[0] = 0;\n n[0] = -1;\n for (k = 1; k <= l; ++k) h = h + d[k - 1] << 1, n[k] = h;\n for (k = 0; k < c; ++k) g[k] = b[k] > 0 ? n[b[k]]++ : pd;\n d = 1;\n }\n if (!d) return (e = e && ma(a)) || ja(a), e;\n for (d = 0; d < c; ++d) {\n if (b[d] > 0 && !jc(a, d, g[d], b[d])) {\n return (e = e && ma(a)) || ja(a), e;\n }\n }\n (e = ma(a)) || ja(a);\n return e;\n }\n\n function Ea(a, b, c, d, e, g, k) {\n for (var h = s, h = 0; h < k; ++h) e[g + h] = a[b + h] + c[d + h] & 255;\n }\n\n function qd(a, b, c) {\n const d = a.P.l;\n if (!(c = b < 0 || c < 0 || b + c > a.P.v)) {\n if (c = b == 0) {\n a: {\n let e = a.Ga;\n var g = a.G;\n var k = a.ub;\n c = a.P.l;\n let h = a.P.v;\n const n = a.Xb;\n var l = [p];\n let m = p;\n let f = h * c;\n var q = p;\n var r = p;\n var r = 'WEBP_FILTER_TYPE';\n let u = s;\n var l = s;\n var v = 0;\n let C = s;\n $(c > 0 && h > 0 && d >= c);\n $(e != p && n != p);\n if (k <= Ub) c = 0;\n else if (C = e[g + 0] >> 0 & 3, r = e[g + 0] >> 2 & 3, u = e[g + 0] >> 4 & 3, l = e[g + 0] >> 6 & 3, C < kc || C > kf || r >= lf || u > rd || l != 0) c = 0;\n else {\n if (C == kc) v = k >= f, l = e, m = g + Ub;\n else {\n l = U(f, 0);\n m = 0;\n if (l\n == p) {\n c = 0;\n break a;\n }\n var v = g + Ub;\n var k = k - Ub;\n var g = l;\n var q = M(Vb);\n let A = 0;\n const z = sd();\n z == p ? v = 0 : (z.l = c, z.v = h, z.N = q, td(na), q.put = ud, q.Mb = vd, q.Pb = wd, q.ka = p, q.ka = g, q.fd = 0, q.width = c, q.height = h, z.a = L, Rb(z.o, e, v, k), z.Wa = Cb, Ka(c, h, 1, z, p) && xd(z, c) && (z.Wa = Db, A = lc(z, z.V, z.Ha, z.l, z.v, mf)), z != p && sa(z), v = A);\n }\n if (v) {\n e = nf[r];\n e != p ? (q = U(f, 0), r = 0, q == p && (v = 0, C != kc && (m = l = p)), e(l, m, c, h, 1, c, q, r), f = q, C = r) : (f = l, C = m);\n for (e = 0; h-- > 0;) N(n, e, f, C, c), C += c, e += d;\n u == rd && (v = l == p || m <= 0 || c <= 0 ? 0 : 1);\n }\n c = v;\n }\n }\n c = !c;\n }\n }\n return c ? p : b == 0 ? a.Xb : +b * d;\n }\n\n function of(a) {\n let b = a.width;\n const c = a.height;\n let d = a.J;\n if (b <= 0 || c <= 0 || !(d >= Qa && d < Cc)) return ta;\n if (!a.Fc && a.Jb == p) {\n var e = p;\n var g = 0;\n var k = 0;\n var h = 0;\n var n = 0;\n var e = bb;\n var l = b * yd[d];\n var m = l * c;\n d < ua || (g = parseInt((b + 1) / 2, 10), h = g * parseInt((c + 1) / 2, 10), d == Ra && (k = b, n = k * c));\n e = m + 2 * h + n;\n if (e != e) return ta;\n e = U(e, 205);\n if (e == p) return cb;\n a.Jb = e;\n a.jc = p;\n d < ua ? (b = a.c.RGBA, b.ma = e, b.Sa = p, b.f = l, b.size = m) : (b = a.c.Va, b.y = e, b.D = p, b.F = l, b.Wc = m, b.c = e, b.B = p + m, b.nb = g, b.Rc = h, b.S = e, b.C = p + m + h, b.rb = g, b.Uc = h, d == Ra && (b.p = e, b.q = p + m + 2 * h), b.Wb = n, b.Fa = k);\n }\n d = 1;\n g = a.J;\n k = a.width;\n h = a.height;\n g >= Qa && g < Cc ? g < ua ? (a = a.c.RGBA, d\n &= a.f * h <= a.size, d &= a.f >= k * yd[g], d &= a.ma != p) : (a = a.c.Va, n = a.nb * parseInt((h + 1) / 2, 10), l = a.rb * parseInt((h + 1) / 2, 10), m = a.Fa * h, d &= a.F * h <= a.Wc, d &= n <= a.Rc, d &= l <= a.Uc, d &= m <= a.Wb, d &= a.F >= k, d &= a.nb >= parseInt((k + 1) / 2, 10), d &= a.rb >= parseInt((k + 1) / 2, 10), d &= a.y != p, d &= a.c != p, d &= a.S != p, g == Ra && (d &= a.Fa >= k, d &= m <= a.Wb, d &= a.p != p)) : d = 0;\n return d ? L : ta;\n }\n\n function zd(a, b, c, d) {\n if (d == p || a <= 0 || b <= 0) return ta;\n if (c != p) {\n if (c.Ua) {\n const e = c.wc;\n const g = c.vc;\n const k = c.t & -2;\n const h = c.k & -2;\n if (k < 0 || h < 0 || e <= 0 || g <= 0 || k + e > a || h + g > b) return ta;\n a = e;\n b = g;\n }\n if (c.I) {\n if (c.Ba <= 0\n || c.Aa <= 0) return ta;\n a = c.Ba;\n b = c.Aa;\n }\n }\n d.width = a;\n d.height = b;\n return of(d);\n }\n\n function mb(a) {\n return !(a & -256) ? a : a < 0 ? 0 : 255;\n }\n\n function Ad(a, b, c, d) {\n const e = U(16, 0);\n let g;\n g = 0;\n let k;\n for (k = 0; k < 4; ++k) {\n var h = a[b + 0] + a[b + 8];\n var n = a[b + 0] - a[b + 8];\n var l = (a[b + 4] * Wb >> 16) - (a[b + 12] * Xb >> 16);\n var m = (a[b + 4] * Xb >> 16) + (a[b + 12] * Wb >> 16);\n e[g + 0] = h + m;\n e[g + 1] = n + l;\n e[g + 2] = n - l;\n e[g + 3] = h - m;\n g += 4;\n b++;\n }\n for (k = g = 0; k < 4; ++k) {\n a = e[g + 0] + 4, h = a + e[g + 8], n = a - e[g + 8], l = (e[g + 4] * Wb >> 16) - (e[g + 12] * Xb >> 16), m = (e[g + 4] * Xb >> 16) + (e[g + 12] * Wb >> 16), c[d + 0 + 0 * f] = mb(c[d + 0 + 0 * f] + (h + m >> 3)), c[d + 1 + 0 * f] = mb(c[d\n + 1 + 0 * f] + (n + l >> 3)), c[d + 2 + 0 * f] = mb(c[d + 2 + 0 * f] + (n - l >> 3)), c[d + 3 + 0 * f] = mb(c[d + 3 + 0 * f] + (h - m >> 3)), g++, d += f;\n }\n }\n\n function pf(a, b, c, d, e) {\n Ad(a, b, c, d);\n e && Ad(a, b + 16, c, d + 4);\n }\n\n function qf(a, b, c, d) {\n mc(a, b + 0, c, d + 0, 1);\n mc(a, b + 32, c, d + 4 * f, 1);\n }\n\n function nc(a, b, c, d) {\n a = a[b + 0] + 4;\n let e;\n for (e = 0; e < 4; ++e) for (b = 0; b < 4; ++b) c[d + b + e * f] = mb(c[d + b + e * f] + (a >> 3));\n }\n\n function rf(a, b, c, d) {\n a[b + 0] && nc(a, b + 0, c, d + 0);\n a[b + 16] && nc(a, b + 16, c, d + 4);\n a[b + 32] && nc(a, b + 32, c, d + 4 * f);\n a[b + 48] && nc(a, b + 48, c, d + 4 * f + 4);\n }\n\n function Dc(a, b, c) {\n const d = b - f;\n const e = oa;\n const g = 255 - a[d - 1];\n let k;\n for (k = 0; k\n < c; ++k) {\n const h = e;\n const n = g + a[b - 1];\n var l;\n for (l = 0; l < c; ++l) a[b + l] = h[n + a[d + l]];\n b += f;\n }\n }\n\n function Yb(a, b, c) {\n let d;\n for (d = 0; d < 16; ++d) for (i = 0; i < 16; ++i) b[c + d * f + i] = a;\n }\n\n function y(a, b, c) {\n return a + 2 * b + c + 2 >> 2;\n }\n\n function Zb(a, b, c) {\n let d; let\n e;\n for (d = 0; d < 8; ++d) for (e = 0; e < 8; ++e) b[c + e + d * f] = a;\n }\n\n function nb(a, b, c) {\n const d = a[b - c];\n const e = a[b + 0];\n const g = 3 * (e - d) + sc[1020 + a[b - 2 * c] - a[b + c]];\n const k = oc[112 + (g + 4 >> 3)];\n a[b - c] = oa[255 + d + oc[112 + (g + 3 >> 3)]];\n a[b + 0] = oa[255 + e - k];\n }\n\n function Bd(a, b, c, d) {\n const e = a[b + 0];\n const g = a[b + c];\n return va[255 + a[b - 2 * c] - a[b - c]] > d || va[255 + g - e] > d;\n }\n\n function Cd(a,\n b, c, d, e) {\n const g = a[b - 3 * c];\n const k = a[b - 2 * c];\n const h = a[b - c];\n const n = a[b + 0];\n const l = a[b + c];\n const m = a[b + 2 * c];\n const f = a[b + 3 * c];\n return 2 * va[255 + h - n] + tc[255 + k - l] > d ? 0 : va[255 + a[b - 4 * c] - g] <= e && va[255 + g - k] <= e && va[255 + k - h] <= e && va[255 + f - m] <= e && va[255 + m - l] <= e && va[255 + l - n] <= e;\n }\n\n function Dd(a, b, c, d) {\n let e;\n for (e = 0; e < 16; ++e) 2 * va[255 + a[b + e - c] - a[b + e + 0]] + tc[255 + a[b + e - 2 * c] - a[b + e + c]] <= d && nb(a, b + e, c);\n }\n\n function Ed(a, b, c, d) {\n let e;\n for (e = 0; e < 16; ++e) 2 * va[255 + a[b + e * c - 1] - a[b + e * c + 0]] + tc[255 + a[b + e * c - 2] - a[b + e * c + 1]] <= d && nb(a, b + e * c, 1);\n }\n\n function sf(a, b, c, d) {\n let e;\n for (e = 3; e > 0; --e) {\n b\n += 4 * c, Dd(a, b + 0, c, d);\n }\n }\n\n function tf(a, b, c, d) {\n let e;\n for (e = 3; e > 0; --e) b += 4, Ed(a, b + 0, c, d);\n }\n\n function Fa(a, b, c, d, e, g, k, h) {\n for (; e-- > 0;) {\n if (Cd(a, b + 0, c, g, k)) {\n if (Bd(a, b + 0, c, h)) nb(a, b + 0, c);\n else {\n const n = a;\n const l = b + 0;\n const m = c;\n const f = n[l - 2 * m];\n const q = n[l - m];\n const r = n[l + 0];\n const u = n[l + m];\n const v = n[l + 2 * m];\n var C = sc[1020 + 3 * (r - q) + sc[1020 + f - u]];\n const A = 27 * C + 63 >> 7;\n const z = 18 * C + 63 >> 7;\n var C = 9 * C + 63 >> 7;\n n[l - 3 * m] = oa[255 + n[l - 3 * m] + C];\n n[l - 2 * m] = oa[255 + f + z];\n n[l - m] = oa[255 + q + A];\n n[l + 0] = oa[255 + r - A];\n n[l + m] = oa[255 + u - z];\n n[l + 2 * m] = oa[255 + v - C];\n }\n }\n b += d;\n }\n }\n\n function Ga(a, b, c, d, e, g, k, h) {\n for (; e-- > 0;) {\n if (Cd(a, b + 0, c,\n g, k)) {\n if (Bd(a, b + 0, c, h)) nb(a, b + 0, c);\n else {\n const n = a;\n const l = b + 0;\n const m = c;\n const f = n[l - m];\n const q = n[l + 0];\n const r = n[l + m];\n var u = 3 * (q - f);\n const v = oc[112 + (u + 4 >> 3)];\n var u = oc[112 + (u + 3 >> 3)];\n const C = v + 1 >> 1;\n n[l - 2 * m] = oa[255 + n[l - 2 * m] + C];\n n[l - m] = oa[255 + f + u];\n n[l + 0] = oa[255 + q - v];\n n[l + m] = oa[255 + r - C];\n }\n }\n b += d;\n }\n }\n\n function uf(a, b, c, d, e, g) {\n Fa(a, b + 0, c, 1, 16, d, e, g);\n }\n\n function vf(a, b, c, d, e, g) {\n Fa(a, b + 0, 1, c, 16, d, e, g);\n }\n\n function wf(a, b, c, d, e, g) {\n let k;\n for (k = 3; k > 0; --k) b += 4 * c, Ga(a, b + 0, c, 1, 16, d, e, g);\n }\n\n function xf(a, b, c, d, e, g) {\n let k;\n for (k = 3; k > 0; --k) b += 4, Ga(a, b + 0, 1, c, 16, d, e, g);\n }\n\n function yf(a, b, c, d, e,\n g, k, h) {\n Fa(a, b, e, 1, 8, g, k, h);\n Fa(c, d, e, 1, 8, g, k, h);\n }\n\n function zf(a, b, c, d, e, g, k, h) {\n Fa(a, b, 1, e, 8, g, k, h);\n Fa(c, d, 1, e, 8, g, k, h);\n }\n\n function Af(a, b, c, d, e, g, k, h) {\n Ga(a, b + 4 * e, e, 1, 8, g, k, h);\n Ga(c, d + 4 * e, e, 1, 8, g, k, h);\n }\n\n function Bf(a, b, c, d, e, g, k, h) {\n Ga(a, b + 4, 1, e, 8, g, k, h);\n Ga(c, d + 4, 1, e, 8, g, k, h);\n }\n\n function Fd(a, b) {\n return b == $b ? a.i == 0 ? a.d == 0 ? Cf : Df : a.d == 0 ? Ef : $b : b;\n }\n\n function Ec(a, b, c, d) {\n for (i = 0; i < 4; ++i) a[b + i] = c[d + i];\n }\n\n function wa(a, b) {\n return a < 0 ? 0 : a > b ? b : a;\n }\n\n function Gd(a) {\n a.a = 'VP8_STATUS_OK';\n a.xc = 'OK';\n }\n\n function td(a) {\n a >>> 8 != na >>> 8 && alert('mismatch error');\n }\n\n function Y(a, b, c) {\n a.a == L && (a.a = b, a.xc = c, a.za = 0);\n // alert(b + \": \" + c);\n return 0;\n }\n\n function Hd(a, b) {\n let c = [0];\n let d = x;\n var e = [Mb];\n var g = M(Id);\n var k = M(Jd);\n let h = M(Fc);\n var e = 'VP8StatusCode';\n var g = M(Gc);\n if (a == p) return alert('(dec == null)'), 0;\n Gd(a);\n if (b == p) return Y(a, 'VP8_STATUS_INVALID_PARAM', 'null VP8Io passed to VP8GetHeaders()');\n g.data = b.data;\n g.b = b.b;\n g.e = b.e;\n g.b = [g.b];\n g.e = [g.e];\n g = [g];\n e = Kd(g);\n if (e != L) return Y(a, e, 'Incorrect/incomplete header.');\n g = g[0];\n g.b = g.b[0];\n g.e = g.e[0];\n if (g.ia) return Y(a, W, 'Unexpected lossless format encountered.');\n a.Ga == p && ($(a.ub == 0), a.Ga = g.$, a.G = g.G, a.ub = g.pa);\n d = g.data;\n c = g.b + g.offset;\n e = g.e - g.offset;\n $(g.e >= g.offset);\n if (e[0] < 4) return Y(a, Z, 'Truncated header.');\n h = d[c + 0] | d[c + 1] << 8 | d[c + 2] << 16;\n g = a.Ac;\n g.fb = !(h & 1) + 0;\n g.Jc = h >> 1 & 7;\n g.Nc = h >> 4 & 1;\n g.Ra = h >> 5;\n if (g.Jc > 3) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'Incorrect keyframe parameters.');\n if (!g.Nc) return Y(a, 'VP8_STATUS_UNSUPPORTED_FEATURE', 'Frame not displayable.');\n c += 3;\n e -= 3;\n k = a.P;\n if (g.fb) {\n if (e < 7) return Y(a, 'VP8_STATUS_NOT_ENOUGH_DATA', 'cannot parse picture header');\n if (!(e\n >= 3 && d[c + 0] == 157 && d[c + 1] == 1 && d[c + 2] == 42)) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'Bad code word');\n k.l = (d[c + 4] << 8 | d[c + 3]) & 16383;\n k.gd = d[c + 4] >> 6;\n k.v = (d[c + 6] << 8 | d[c + 5]) & 16383;\n k.hd = d[c + 6] >> 6;\n c += 7;\n e -= 7;\n a.Ma = k.l + 15 >> 4;\n a.hb = k.v + 15 >> 4;\n b.width = k.l;\n b.height = k.v;\n b.I = 0;\n b.Ua = 0;\n b.k = 0;\n b.t = 0;\n b.Ka = b.width;\n b.K = b.height;\n b.m = b.width;\n b.h = b.height;\n h = a.R;\n for (i = 0; i < h.Ta.length; ++i) h.Ta[i] = 255;\n h.z = M(Ff);\n h = a.Ca;\n $(h != p);\n h.pb = 0;\n h.ob = 0;\n h.tb = 1;\n for (i = 0; i < h.Kb.length; ++i) h.Kb[i] = 0;\n for (i = 0; i < h.Cb.length; ++i) h.Cb[i] = 0;\n a.Lb = 0;\n }\n if (g.Ra\n > e) return Y(a, 'VP8_STATUS_NOT_ENOUGH_DATA', 'bad partition length');\n h = a.o;\n D(h, d, c, c + g.Ra);\n c += g.Ra;\n e -= g.Ra;\n g.fb && (k.uc = G(h), k.$c = G(h));\n var k = h;\n var n = a.Ca;\n let l = a.R;\n $(k != p);\n $(n != p);\n n.pb = G(k);\n if (n.pb) {\n n.ob = G(k);\n if (G(k)) {\n var m;\n n.tb = G(k);\n for (m = 0; m < xa; ++m) n.Kb[m] = G(k) ? ga(k, 7) : 0;\n for (m = 0; m < xa; ++m) n.Cb[m] = G(k) ? ga(k, 6) : 0;\n }\n if (n.ob) for (m = 0; m < Ld; ++m) l.Ta[m] = G(k) ? S(k, 8) : 255;\n } else n.ob = 0;\n if (k.Ab) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'cannot parse segment header');\n k = h;\n n = a.ga;\n n.Oc = G(k);\n n.Fb = S(k, 6);\n n.kb = S(k, 3);\n n.oc = G(k);\n if (n.oc\n && G(k)) {\n for (l = 0; l < Hc; ++l) G(k) && (n.Lc[l] = ga(k, 6));\n for (l = 0; l < Gf; ++l) G(k) && (n.Gc[l] = ga(k, 6));\n }\n a.A = n.Fb == 0 ? 0 : n.Oc ? 1 : 2;\n if (a.A > 0) {\n if (a.Ca.pb) for (l = 0; l < xa; ++l) m = a.Ca.Cb[l], a.Ca.tb || (m += n.Fb), a.Zb[l] = m;\n else a.Zb[0] = n.Fb;\n }\n if (k.Ab) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'cannot parse filter header');\n var k = d;\n var f = c;\n var n = f;\n var e = f + e;\n m = 0;\n let q = s;\n let r = s;\n a.Hb = 1 << S(a.o, 2);\n q = a.Hb - 1;\n l = k;\n m = f + 3 * q;\n if (e < m) e = 'VP8_STATUS_NOT_ENOUGH_DATA';\n else {\n for (r = 0; r < q; ++r) {\n var f = l;\n var u = m + (k[n + 0] | k[n + 1] << 8 | k[n + 2] << 16);\n u > e && (f = k);\n D(a.ic[+r], l, m, u);\n l = f;\n m = u;\n n += 3;\n }\n D(a.ic[+q], l, m, e);\n e = m < e ? 'VP8_STATUS_OK' : 'VP8_STATUS_SUSPENDED';\n }\n if (e != 'VP8_STATUS_OK') return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'cannot parse partitions');\n q = a.o;\n e = S(q, 7);\n k = G(q) ? ga(q, 4) : 0;\n n = G(q) ? ga(q, 4) : 0;\n l = G(q) ? ga(q, 4) : 0;\n m = G(q) ? ga(q, 4) : 0;\n q = G(q) ? ga(q, 4) : 0;\n r = a.Ca;\n f = s;\n for (f = 0; f < xa; ++f) {\n u = s;\n if (r.pb) u = r.Kb[f], r.tb || (u += e);\n else if (f > 0) {\n a.yb[f] = a.yb[0];\n continue;\n } else u = e;\n const v = a.yb[f];\n v.sc[0] = Ic[wa(u + k, 127)];\n v.sc[1] = Jc[wa(u + 0, 127)];\n v.sb[0] = 2 * Ic[wa(u + n, 127)];\n v.sb[1] = 101581 * Jc[wa(u + l, 127)] >> 16;\n v.sb[1] < 8\n && (v.sb[1] = 8);\n v.qc[0] = Ic[wa(u + m, 117)];\n v.qc[1] = Jc[wa(u + q, 127)];\n }\n if (g.fb) a.Zc = 259;\n else return Y(a, Hf, 'Not a key frame.');\n G(h);\n e = a.R;\n for (k = 0; k < Md; ++k) for (n = 0; n < Nd; ++n) for (l = 0; l < Kc; ++l) for (m = 0; m < Lc; ++m) w(h, If[k][n][l][m]) && (e.z[k][n][l][m] = S(h, 8));\n a.pc = G(h);\n a.pc && (a.Pc = S(h, 8));\n if (a.P.uc) {\n c -= 8;\n h = Mb;\n if (g.Ra < 8 || d[c + 8 - 1] != 1) return Y(a, W, 'RIFF: Inconsistent extra information.');\n h = d[c + 0] << 0 | d[c + 1] << 8 | d[c + 2] << 16;\n a.fc = h;\n a.dd = p;\n a.cd = d[c + 3];\n }\n return a.za = 1;\n }\n\n function Mc(a, b, c, d, e, g) {\n let k = b[e][c];\n if (!w(a, k[0])) return 0;\n for (;;) {\n ++e;\n if (w(a, k[1])) {\n var h;\n if (w(a, k[2])) {\n if (w(a, k[3])) {\n if (w(a, k[6])) {\n h = x;\n c = w(a, k[8]);\n k = w(a, k[9 + c]);\n k = 2 * c + k;\n c = 0;\n h = Jf[k];\n var n;\n for (n = 0; n < h.length - 1; ++n) c += c + w(a, h[n]);\n c += 3 + (8 << k);\n } else w(a, k[7]) ? (c = 7 + 2 * w(a, 165), c += w(a, 145)) : c = 5 + w(a, 159);\n } else c = w(a, k[4]) ? 3 + w(a, k[5]) : 2;\n k = b[Nc[e]][2];\n } else k = b[Nc[e]][1], c = 1;\n h = Kf[e - 1];\n g[g[g.length - 1] + h] = (w(a, 128) ? -c : c) * d[(h > 0) + 0];\n if (e == 16 || !w(a, k[0])) return e;\n } else k = b[Nc[e]][0];\n if (e == 16) return 16;\n }\n }\n\n function ob(a, b) {\n return ((16777216 * a[0] + 65536 * a[1] + 256 * a[2] + 1 * a[3]) * Lf\n & 4278190080) >> b;\n }\n\n function Mf(a, b) {\n let c = 0;\n if (a == p) return 0;\n if (b == p) return Y(a, 'VP8_STATUS_INVALID_PARAM', 'NULL VP8Io parameter in VP8Decode().');\n if (!a.za && !Hd(a, b)) return 0;\n $(a.za);\n let d;\n if (b.Mb && !b.Mb(b)) Y(a, Nf, 'Frame setup failed'), d = a.a;\n else {\n b.Za && (a.A = 0);\n const e = uc[a.A];\n a.A == 2 ? (a.lb = 0, a.mb = 0) : (a.lb = b.t - e >> 4, a.mb = b.k - e >> 4, a.lb < 0 && (a.lb = 0), a.mb < 0 && (a.mb = 0));\n a.Ya = b.K + 15 + e >> 4;\n a.wb = b.Ka + 15 + e >> 4;\n a.wb > a.Ma && (a.wb = a.Ma);\n a.Ya > a.hb && (a.Ya = a.hb);\n d = L;\n }\n if (c = d == L) {\n if (c) {\n let g;\n b: {\n a.Ja = 0;\n if (a.qb) {\n const k = a.rc;\n if (!WebPWorkerReset(k)) {\n g = Y(a, cb, 'thread initialization failed.');\n break b;\n }\n k.Qd = a;\n k.Rd = a.oa.N;\n k.Ud = FinishRow;\n a.jb = a.A > 0 ? Od : Od - 1;\n } else a.jb = Of;\n g = 1;\n }\n let h;\n if (!(h = !g)) {\n let n;\n b: {\n const l = a.jb;\n const m = a.Ma;\n const t = 4 * m;\n const q = 32 * m;\n const r = m + 1;\n const u = a.A > 0 ? m * (a.qb ? 2 : 1) : 0;\n const v = Pf;\n const C = q * (16 * l + parseInt(3 * uc[a.A] / 2, 10));\n const A = a.Ga != p ? a.P.l * a.P.v : 0;\n const z = t + q + r + u + v + 384 + C + A + Pd;\n if (z != z) n = 0;\n else {\n if (z > a.Gb) {\n a.ib = 0;\n a.Gb = 0;\n if (a.ib == p) {\n n = Y(a, 'VP8_STATUS_OUT_OF_MEMORY', 'no memory during frame initialization.');\n break b;\n }\n a.Gb = z;\n }\n a.dc = 205;\n a.Xc = rc(205, 16 * m);\n a.Sc = rc(205, 8 * m);\n a.Vc = rc(205, 8 * m);\n a.M = u ? ic(Oc, u) : p;\n a.Sd = u ? 0 : p;\n a.oa.ha = 0;\n a.oa.M = a.M;\n $((v & Pd) == 0);\n a.Ea = rc(205, 1 * v);\n a.z = -12851;\n a.H = 16 * m;\n a.r = 8 * m;\n const Ha = uc[a.A];\n const G = Ha * a.H;\n const y = Ha / 2 * a.r;\n a.ca = U(C, 205);\n a.da = +G;\n a.aa = a.ca;\n a.ba = a.da + 16 * l * a.H + y;\n a.ra = a.aa;\n a.sa = a.ba + 8 * l * a.r + y;\n a.Xb = A ? U(A, x) : p;\n a.La = ic(Qd, r);\n a.dc = rc($b, t);\n n = 1;\n }\n }\n h = !n;\n }\n if (h) c = 0;\n else {\n b.width = a.P.l;\n b.height = a.P.v;\n b.w = 0;\n b.y = a.ca;\n b.D = a.da;\n b.c = a.aa;\n b.B = a.ba;\n b.S = a.ra;\n b.C = a.sa;\n b.F = a.H;\n b.Da = a.r;\n b.p = p;\n b.q = p;\n if (!Rd) {\n let B;\n for (B = -255; B <= 255; ++B) va[255 + B] = B < 0 ? -B : B, tc[255 + B] = va[255 + B] >> 1;\n for (B = -1020; B\n <= 1020; ++B) sc[1020 + B] = B < -128 ? -128 : B > 127 ? 127 : B;\n for (B = -112; B <= 112; ++B) oc[112 + B] = B < -16 ? -16 : B > 15 ? 15 : B;\n for (B = -255; B <= 510; ++B) oa[255 + B] = B < 0 ? 0 : B > 255 ? 255 : B;\n Rd = 1;\n }\n mc = pf;\n Pc = qf;\n Qc = nc;\n Rc = rf;\n Sd = uf;\n Td = vf;\n Ud = yf;\n Vd = zf;\n Wd = wf;\n Xd = xf;\n Yd = Af;\n Zd = Bf;\n $d = Dd;\n ae = Ed;\n be = sf;\n ce = tf;\n c = 1;\n }\n }\n if (c) {\n a: {\n for (a.d = 0; a.d < a.Ya; ++a.d) {\n const Qf = a.ic[a.d & a.Hb - 1];\n const db = a;\n const F = db.La[0];\n F.X = 0;\n F.ua = 0;\n jd(db.cc, 0, $b, db.cc.length);\n db.W = (db.A > 0 && db.d >= db.mb && db.d <= db.Ya) + 0;\n for (a.i = 0; a.i < a.Ma; a.i++) {\n var D;\n const H = a;\n const T = Qf;\n const ya = H.o;\n const S = H.La[0];\n const J = H.La[1 + H.i];\n H.Ca.ob && (H.Lb = !w(ya,\n H.R.Ta[0]) ? 0 + w(ya, H.R.Ta[1]) : 2 + w(ya, H.R.Ta[2]));\n J.Nb = H.pc ? w(ya, H.Pc) : 0;\n const O = H.dc;\n O[O.length - 1] = 0 + 4 * H.i;\n const Sc = H.cc;\n H.wa = !w(ya, 145);\n if (H.wa) {\n for (var ga = H.Eb, ja = 0, Z = ca, Z = 0; Z < 4; ++Z) {\n var V = Sc[Z];\n var R;\n for (R = 0; R < 4; ++R) {\n const ta = Rf[O[O[O.length - 1] + R]][V];\n var za = 0;\n do za = Sf[2 * za + w(ya, ta[za])]; while (za > 0);\n V = -za;\n O[O[O.length - 1] + R] = V;\n ga[ja] = V;\n ja++;\n }\n Sc[Z] = V;\n }\n } else {\n var V = w(ya, 156) ? w(ya, 128) ? de : ee : w(ya, 163) ? fe : ge;\n H.Eb[0] = V;\n for (za = 0; za < 4; ++za) O[za + O[O.length - 1]] = V;\n for (za = 0; za < 4; ++za) Sc[za] = V;\n }\n H.Tc = !w(ya, 142) ? ge : !w(ya, 114) ? fe\n : w(ya, 183) ? de : ee;\n if (ya.Ab) D = 0;\n else {\n if (J.Nb) S.X = J.X = 0, H.wa || (S.ua = J.ua = 0), H.ja = 0, H.Oa = 0;\n else {\n let ia = ca;\n let ka = ca;\n var sa = ca;\n var wa = Tf;\n const Aa = H.yb[H.Lb];\n var aa = H.z;\n const ma = H.La[0];\n const ua = U(4, 0);\n const xa = U(4, 0);\n let ea = U(4, 0);\n let pb = U(4, 0);\n let na = 0;\n let Ba = 0;\n var pa = ca;\n let qa = ca;\n let Sa = ca;\n var aa = rc(0, 384);\n if (H.wa) sa = 0, wa = H.R.z[3];\n else {\n const ab = U(16, 0);\n var Ca = J.ua + ma.ua;\n J.ua = ma.ua = (Mc(T, H.R.z[1], Ca, Aa.sb, 0, ab) > 0) + 0;\n for (var sa = 1, wa = H.R.z[0], qb = ab, Ta = aa, La = U(16, s), X = s, X = 0; X < 4; ++X) {\n var Da = qb[0 + X] + qb[12 + X];\n var Ea = qb[4 + X] + qb[8 + X];\n var Fa = qb[4 + X] - qb[8 + X];\n var Ga = qb[0 + X] - qb[12 + X];\n La[0 + X] = Da + Ea;\n La[8\n + X] = Da - Ea;\n La[4 + X] = Ga + Fa;\n La[12 + X] = Ga - Fa;\n }\n for (X = 0; X < 4; ++X) {\n const Oa = Ta[Ta.length - 1];\n const lb = La[0 + 4 * X] + 3;\n var Da = lb + La[3 + 4 * X];\n var Ea = La[1 + 4 * X] + La[2 + 4 * X];\n var Fa = La[1 + 4 * X] - La[2 + 4 * X];\n var Ga = lb - La[3 + 4 * X];\n Ta[Oa + 0] = Da + Ea >> 3;\n Ta[Oa + 16] = Ga + Fa >> 3;\n Ta[Oa + 32] = Da - Ea >> 3;\n Ta[Oa + 48] = Ga - Fa >> 3;\n Ta[Ta.length - 1] += 64;\n }\n aa[aa.length - 1] = 0;\n }\n ea = Nb(vc[J.X & 15]);\n pb = Nb(vc[ma.X & 15]);\n for (qa = 0; qa < 4; ++qa) {\n for (var Eb = pb[qa], pa = 0; pa < 4; ++pa) {\n var Ca = Eb + ea[pa];\n var Ka = Mc(T, wa, Ca, Aa.sc, sa, aa);\n ea[pa] = Eb = (Ka > 0) + 0;\n xa[pa] = (aa[aa[aa.length - 1] + 0] != 0) + 0;\n ua[pa] = (Ka > 1) + 0;\n aa[aa.length\n - 1] += 16;\n }\n pb[qa] = Eb;\n Ba |= ob(xa, 24 - 4 * qa);\n na |= ob(ua, 24 - 4 * qa);\n }\n ia = ob(ea, 24);\n ka = ob(pb, 24);\n ea = Nb(vc[J.X >> 4]);\n pb = Nb(vc[ma.X >> 4]);\n for (Sa = 0; Sa < 4; Sa += 2) {\n for (qa = 0; qa < 2; ++qa) {\n Eb = pb[Sa + qa];\n for (pa = 0; pa < 2; ++pa) Ca = Eb + ea[Sa + pa], Ka = Mc(T, H.R.z[2], Ca, Aa.qc, 0, aa), ea[Sa + pa] = Eb = (Ka > 0) + 0, xa[2 * qa + pa] = (aa[aa[aa.length - 1] + 0] != 0) + 0, ua[2 * qa + pa] = (Ka > 1) + 0, aa[aa.length - 1] += 16;\n pb[Sa + qa] = Eb;\n }\n Ba |= ob(xa, 8 - 2 * Sa);\n na |= ob(ua, 8 - 2 * Sa);\n }\n ia |= ob(ea, 20);\n ka |= ob(pb, 20);\n J.X = ia;\n ma.X = ka;\n H.z = aa;\n H.Oa = na + 0;\n H.ja = na | Ba;\n J.Nb = !H.ja + 0;\n }\n D = !T.Ab;\n }\n if (!D) {\n c = Y(a, 'VP8_STATUS_NOT_ENOUGH_DATA',\n `Premature end-of-file encountered.${a.i} ${a.d}`);\n break a;\n }\n const P = a;\n const da = P.Ea;\n const Ma = Tc;\n const Ua = P.Ea;\n const Va = Uc;\n const Wa = P.Ea;\n const Xa = he;\n if (P.i > 0) {\n for (var ba = ca, ba = -1; ba < 16; ++ba) Ec(da, Ma + ba * f - 4, da, Ma + ba * f + 12);\n for (ba = -1; ba < 8; ++ba) Ec(Ua, Va + ba * f - 4, Ua, Va + ba * f + 4), Ec(Wa, Xa + ba * f - 4, Wa, Xa + ba * f + 4);\n } else {\n for (ba = 0; ba < 16; ++ba) da[Ma + ba * f - 1] = 129;\n for (ba = 0; ba < 8; ++ba) Ua[Va + ba * f - 1] = 129, Wa[Xa + ba * f - 1] = 129;\n P.d > 0 && (da[Ma - 1 - f] = Ua[Va - 1 - f] = Wa[Xa - 1 - f] = 129);\n }\n const Qa = P.Xc;\n const Ra = 16 * +P.i;\n const mb = P.Sc;\n const vb = 8 * +P.i;\n const wb = P.Vc;\n const xb = 8 * +P.i;\n const Za = P.z;\n let fa = ca;\n if (P.d > 0) {\n N(da, Ma - f, Qa, Ra,\n 16), N(Ua, Va - f, mb, vb, 8), N(Wa, Xa - f, wb, xb, 8);\n } else if (P.i == 0) {\n for (i = 0; i < 21; ++i) da[Ma - f - 1 + i] = 127;\n for (i = 0; i < 9; ++i) Ua[Va - f - 1 + i] = 127;\n for (i = 0; i < 9; ++i) Wa[Xa - f - 1 + i] = 127;\n }\n if (P.wa) {\n const Ya = Ma - f + 16;\n P.d > 0 && (P.i >= P.Ma - 1 ? da[Ya + 0] = da[Ya + 1] = da[Ya + 2] = da[Ya + 3] = Qa[Ra + 15] : N(da, Ya + 0, Qa, Ra + 16, 4));\n for (let Fb = 0; Fb < 4; ++Fb) da[Fb + Ya + 4 * f] = da[Fb + Ya + 4 * f] = da[Fb + Ya + 8 * f] = da[Fb + Ya + 12 * f] = da[Fb + Ya + 0];\n for (fa = 0; fa < 16; fa++) {\n var ac = da;\n var bc = Ma + ie[fa];\n Uf[P.Eb[fa]](ac, bc);\n P.Oa & 1 << fa ? mc(Za, 16 * +fa, ac, bc, 0) : P.ja & 1 << fa && Qc(Za, 16 * +fa, ac, bc);\n }\n } else {\n var $a = Fd(P, P.Eb[0]);\n Vf[$a](da, Ma);\n if (P.ja) for (fa = 0; fa < 16; fa++) ac = da, bc = Ma + ie[fa], P.Oa & 1 << fa ? mc(Za, 16 * +fa, ac, bc, 0) : P.ja & 1 << fa && Qc(Za, 16 * +fa, ac, bc);\n }\n $a = Fd(P, P.Tc);\n je[$a](Ua, Va);\n je[$a](Wa, Xa);\n if (P.ja & 983040) {\n const zb = P.z;\n var Pa = 256;\n P.Oa & 983040 ? Pc(zb, Pa, Ua, Va) : Rc(zb, Pa, Ua, Va);\n }\n if (P.ja & 15728640) {\n const Ab = P.z;\n var Pa = 320;\n P.Oa & 15728640 ? Pc(Ab, Pa, Wa, Xa) : Rc(Ab, Pa, Wa, Xa);\n }\n P.d < P.hb - 1 && (N(Qa, Ra, da, Ma + 15 * f, 16), N(mb, vb, Ua, Va + 7 * f, 8), N(wb, xb, Wa, Xa + 7 * f, 8));\n const Q = a;\n if (Q.A > 0) {\n const kb = Q.M[1 + Q.i];\n const Kb = Q.La[1 + Q.i].Nb;\n let ha = Q.Zb[Q.Lb];\n Q.ga.oc && (ha\n += Q.ga.Lc[0], Q.wa && (ha += Q.ga.Gc[0]));\n ha = ha < 0 ? 0 : ha > 63 ? 63 : ha;\n kb.zc = ha;\n Q.ga.kb > 0 && (ha = Q.ga.kb > 4 ? ha >> 2 : ha >> 1, ha > 9 - Q.ga.kb && (ha = 9 - Q.ga.kb));\n kb.yc = ha < 1 ? 1 : ha;\n kb.ab = (!Kb || Q.wa) + 0;\n }\n for (var Ia = ca, Bb = 8 * Q.Ja * Q.r, Qb = Q.ca, Ub = Q.da + 16 * Q.i + 16 * Q.Ja * Q.H, Wb = Q.aa, Xb = Q.ba + 8 * Q.i + Bb, Yb = Q.ra, Zb = Q.sa + 8 * Q.i + Bb, Ia = 0; Ia < 16; ++Ia) N(Qb, Ub + Ia * Q.H, Q.Ea, +Tc + Ia * f, 16);\n for (Ia = 0; Ia < 8; ++Ia) N(Wb, Xb + Ia * Q.r, Q.Ea, +Uc + Ia * f, 8), N(Yb, Zb + Ia * Q.r, Q.Ea, +he + Ia * f, 8);\n }\n const K = a;\n const I = b;\n var cc = 1;\n const eb = K.oa;\n if (K.qb) {\n const nb = K.rc;\n var cc = cc & WebPWorkerSync(nb);\n $(nb.a == OK);\n if (cc) {\n eb.N = I;\n eb.ha = K.Ja;\n eb.d = K.d;\n eb.W = K.W;\n if (eb.W) {\n const hc = eb.M;\n eb.M = K.M;\n K.M = hc;\n }\n WebPWorkerLaunch(nb);\n ++K.Ja == K.jb && (K.Ja = 0);\n }\n } else {\n eb.d = K.d;\n eb.W = K.W;\n b: {\n let Hb = 1;\n const rb = K.oa;\n const ib = uc[K.A];\n const yb = ib * K.H;\n const dc = parseInt(ib / 2) * K.r;\n const Ib = 16 * rb.ha * K.H;\n const jb = 8 * rb.ha * K.r;\n const Jb = K.ca;\n const Lb = K.da - yb + Ib;\n const Ob = K.aa;\n const Pb = K.ba - dc + jb;\n const Rb = K.ra;\n const Sb = K.sa - dc + jb;\n const jc = rb.d == 0;\n const Tb = (rb.d >= K.hb - 1) + 0;\n var ra = 16 * rb.d;\n let fb = 16 * (rb.d + 1);\n if (rb.W) {\n const pc = K;\n let wc = s;\n const kc = pc.oa.d;\n $(pc.oa.W);\n for (wc = pc.lb; wc < pc.wb; ++wc) {\n const Na = pc;\n const ec = wc;\n const Vb = kc;\n const xc = Na.oa;\n const gb = Na.H;\n const fc = xc.M[1 + ec];\n const sb = Na.ca;\n const tb = Na.da + 16 * xc.ha\n * gb + 16 * ec;\n const Gb = fc.zc;\n const hb = fc.yc;\n const Ja = 2 * Gb + hb;\n if (Gb != 0) {\n if (Na.A == 1) ec > 0 && ae(sb, tb, gb, Ja + 4), fc.ab && ce(sb, tb, gb, Ja), Vb > 0 && $d(sb, tb, gb, Ja + 4), fc.ab && be(sb, tb, gb, Ja);\n else {\n const gc = Na.r;\n const yc = Na.aa;\n const zc = Na.ba + 8 * xc.ha * gc + 8 * ec;\n const Ac = Na.ra;\n const Bc = Na.sa + 8 * xc.ha * gc + 8 * ec;\n const ub = Na.Ac.fb ? Gb >= 40 ? 2 : Gb >= 15 ? 1 : 0 : Gb >= 40 ? 3 : Gb >= 20 ? 2 : Gb >= 15 ? 1 : 0;\n ec > 0 && (Td(sb, tb, gb, Ja + 4, hb, ub), Vd(yc, zc, Ac, Bc, gc, Ja + 4, hb, ub));\n fc.ab && (Xd(sb, tb, gb, Ja, hb, ub), Zd(yc, zc, Ac, Bc, gc, Ja, hb, ub));\n Vb > 0 && (Sd(sb, tb, gb, Ja + 4, hb, ub), Ud(yc, zc, Ac, Bc, gc, Ja + 4, hb, ub));\n fc.ab && (Wd(sb, tb, gb,\n Ja, hb, ub), Yd(yc, zc, Ac, Bc, gc, Ja, hb, ub));\n }\n }\n }\n }\n if (I.put) {\n jc ? (I.y = K.ca, I.D = K.da + Ib, I.c = K.aa, I.B = K.ba + jb, I.S = K.ra, I.C = K.sa + jb) : (ra -= ib, I.y = Jb, I.D = Lb, I.c = Ob, I.B = Pb, I.S = Rb, I.C = Sb);\n Tb || (fb -= ib);\n fb > I.K && (fb = I.K);\n if (K.Ga != p && ra < fb && (ra == 0 ? (I.p = qd(K, ra, fb - ra), I.q = 0) : I.q = qd(K, ra, fb - ra), I.p == p)) {\n cc = Y(K, W, 'Could not decode alpha data.');\n break b;\n }\n if (ra < I.k) {\n const qc = I.k - ra;\n var ra = I.k;\n $(!(qc & 1));\n I.D += K.H * qc;\n I.B += K.r * (qc >> 1);\n I.C += K.r * (qc >> 1);\n I.p != p && (I.q += I.width * qc);\n }\n ra < fb && (I.D += I.t, I.B += I.t >> 1, I.C += I.t >> 1, I.p != p && (I.q += I.t),\n I.w = ra - I.k, I.m = I.Ka - I.t, I.h = fb - ra, Hb = I.put(I));\n }\n rb.ha + 1 == K.jb && !Tb && (N(K.ca, K.da - yb, Jb, Lb + 16 * K.H, yb), N(K.aa, K.ba - dc, Ob, Pb + 8 * K.r, dc), N(K.ra, K.sa - dc, Rb, Sb + 8 * K.r, dc));\n cc = Hb;\n }\n }\n if (!cc) {\n c = Y(a, 'VP8_STATUS_USER_ABORT', 'Output aborted.');\n break a;\n }\n }\n let Cb;\n if (!(Cb = a.qb && !WebPWorkerSync(a.rc))) {\n let Db;\n if (Db = a.fc > 0) $(a), $(a.fc > 0), Db = !1;\n Cb = Db;\n }\n c = Cb ? 0 : 1;\n }\n }\n const lc = c;\n b.Pb && b.Pb(b);\n c = lc & 1;\n }\n if (!c) return ke(a), 0;\n a.za = 0;\n return c;\n }\n\n function ke(a) {\n a != p && (a.ib && (a.ib = 0), a.ib = p, a.Gb = 0, a.za = 0);\n }\n\n function Aa(a, b) {\n return a + (1 << b) - 1 >> b;\n }\n\n function hc(a, b, c, d, e) {\n const g = vb[c] + wb[b] >> ea;\n b = xb[b];\n d[e + 0] = ia[a + Za[c] - J];\n d[e + 1] = ia[a + g - J];\n d[e + 2] = ia[a + b - J];\n }\n\n function le(a, b, c, d, e) {\n const g = vb[c] + wb[b] >> ea;\n b = xb[b];\n d[e + 0] = ia[a + Za[c] - J] & 248 | ia[a + g - J] >> 5;\n d[e + 1] = ia[a + g - J] << 3 & 224 | ia[a + b - J] >> 3;\n }\n\n function me(a, b, c, d, e) {\n d[e + 0] = 255;\n hc(a, b, c, d, e + 1);\n }\n\n function ne(a, b, c, d, e) {\n const g = xb[b];\n d[e + 0] = Hb[a + Za[c] - J] << 4 | Hb[a + (vb[c] + wb[b] >> ea) - J];\n d[e + 1] = 15 | Hb[a + g - J] << 4;\n }\n\n function Vc(a, b, c, d, e) {\n const g = Za[c];\n c = vb[c] + wb[b] >> ea;\n d[e + 0] = ia[a + xb[b] - J];\n d[e + 1] = ia[a + c - J];\n d[e + 2] = ia[a + g - J];\n }\n\n function oe(a, b, c, d, e) {\n Vc(a, b, c, d, e);\n d[e + 3] = 255;\n }\n\n function pe(a, b, c, d, e) {\n hc(a, b, c, d, e);\n d[e + 3] = 255;\n }\n\n function ib(a, b, c) {\n a[b] = ((((a[b] & 4278255360) >>> 0) + ((c & 4278255360) >>> 0) & 4278255360) >>> 0 | (a[b] & 16711935) + (c & 16711935) & 16711935) >>> 0;\n }\n\n function ka(a, b) {\n return (((a ^ b) & 4278124286) >>> 1) + ((a & b) >>> 0) >>> 0;\n }\n\n function $a(a) {\n return a < 256 && a > 0 ? a : a <= 0 ? 0 : ~a >> 24 & 255;\n }\n\n function yb(a, b) {\n return $a(a + parseInt((a - b) / 2, 10));\n }\n\n function Wc() {\n return qe;\n }\n\n function Xc(a, b) {\n a &= 255;\n b &= 255;\n a > 127 && (a -= 256);\n b > 127 && (b -= 256);\n return a * b >>> 5;\n }\n\n function re(a,\n b, c, d, e, g, k) {\n var h = s;\n const n = 8 >> a.n;\n const l = a.U;\n const f = a.u;\n if (n < 8) {\n a = (1 << a.n) - 1;\n for (var t = (1 << n) - 1, h = b; h < c; ++h) {\n b = 0;\n for (var q = s, q = 0; q < l; ++q) (q & a) == 0 && (b = d[e++] >> 8 & 255), g[k++] = f[b & t], b >>= n;\n }\n } else for (h = b; h < c; ++h) for (q = 0; q < l; ++q) g[k++] = f[d[e++] >> 8 & 255];\n }\n\n function se(a, b, c, d, e) {\n for (c = b + c; b < c;) {\n const g = a[b++];\n d[e++] = g >> 16 & 255;\n d[e++] = g >> 8 & 255;\n d[e++] = g >> 0 & 255;\n d[e++] = g >> 24 & 255;\n }\n }\n\n function te(a, b, c, d, e) {\n for (c = b + c; b < c;) {\n const g = a[b++];\n d[e++] = g >> 16 & 240 | g >> 12 & 15;\n d[e++] = g >> 0 & 240 | g >> 28 & 15;\n }\n }\n\n function Ib(a, b, c, d, e) {\n for (c = b + c; b < c;) {\n const g = a[b++];\n d[e++] = g >> 24 & 255;\n d[e++] = g >> 16 & 255;\n d[e++] = g >> 8 & 255;\n d[e++] = g >> 0 & 255;\n }\n }\n\n function ue(a, b, c, d) {\n if (T(a, 8) != ve) return 0;\n b[0] = T(a, we) + 1;\n c[0] = T(a, we) + 1;\n d[0] = T(a, 1);\n T(a, Wf);\n return 1;\n }\n\n function xe(a, b) {\n let c = s;\n if (a < 4) return a + 1;\n c = a - 2 >> 1;\n return (2 + (a & 1) << c) + T(b, c) + 1;\n }\n\n function Oa(a, b) {\n if (b.Q + 8 > b.ya) {\n var c = a.Y;\n var d = 0;\n for ($(c != p); c[d].s != 0;) {\n var e = c;\n var g = b;\n const k = g.T >> g.g & 1;\n g.L ? g.fa = 1 : (++g.g, g.g >= 8 && Sb(g), g.Q == g.ya && g.g == 32 && (g.L = 1));\n d = d + e[d].s + k;\n }\n return c[d].kc;\n }\n c = a.Y;\n d = 0;\n for ($(c != p); c[d].s != 0;) {\n e = c, g = b.T >> b.g & 1, ++b.g, d = d\n + e[d].s + g;\n }\n return c[d].kc;\n }\n\n function zb(a, b) {\n if (a != p) for (var c = s, d = s, c = 0; c < b; ++c) for (var e = a[c].va, d = 0; d < Yc; ++d) ja(e[d]);\n }\n\n function ye(a, b, c) {\n b = a.eb == 0 ? 0 : a.ac[a.bd + a.Ec * (c >> a.eb) + (b >> a.eb)];\n $(b < a.hc);\n return a.Db[+b];\n }\n\n function ze(a, b, c, d) {\n let e = a.Na;\n const g = a.O;\n const k = g + b;\n var h = c;\n var f = d;\n d = a.Xa;\n c = a.vb;\n for (N(d, c, h, f, a.l * b); e-- > 0;) {\n b = a.nc[e];\n let l = g;\n var m = k;\n var t = h;\n var q = f;\n var f = d;\n var h = c;\n $(l < m);\n $(m <= b.Vb);\n switch (b.Qc) {\n case Ae:\n t = 0;\n for (b = h + (m - l) * b.U; h < b;) {\n var m = f;\n var q = h;\n var r = m[q] >> 8 & 255;\n var u = (m[q] & 16711935) >>> 0;\n var u = u + (r << 16 | r);\n var u = u & 16711935;\n f[h++] = ((m[q] & 4278255360)\n >>> 0 | u) >>> 0;\n l == 32 && t++;\n }\n break;\n case Be:\n var v = b;\n var C = l;\n var t = m;\n var q = f;\n var r = h;\n var u = v.U;\n if (C == 0) {\n var A = s;\n ib(q, r, qe);\n for (A = 1; A < u; ++A) ib(q, r + A, q[r + A - 1]);\n r += u;\n ++C;\n }\n for (var z = (1 << v.n) - 1, Ha = Aa(u, v.n), w = v.u, v = +(C >> v.n) * Ha; C < t;) {\n var y = w;\n var B = v;\n let G = p;\n ib(q, r, q[r - u + 0]);\n G = Ce[y[B++] >> 8 & 15];\n for (A = 1; A < u; ++A) {\n let F = E;\n (A & z) == 0 && (G = Ce[y[B++] >> 8 & 15]);\n F = G(q[r + A - 1], q, r + A - u);\n ib(q, r + A, F);\n }\n r += u;\n ++C;\n (C & z) == 0 && (v += Ha);\n }\n m != b.Vb && (b = b.U, N(f, h - b, f, h + (m - l - 1) * b, b));\n break;\n case De:\n t = b.U;\n q = (1 << b.n) - 1;\n r = Aa(t, b.n);\n u = b.u;\n for (b = +(l >> b.n) * r; l < m;) {\n A = u;\n C = b;\n z = M(Xf);\n Ha = s;\n for (Ha = 0; Ha < t; ++Ha) (Ha & q) == 0 && (w = A[C++], v = z, v.Cc = w >> 0 & 255, v.Bc = w >> 8 & 255, v.Kc = w >> 16 & 255), w = f[h + Ha], v = w >>> 8, y = w >>> 16, B = w, y += Xc(z.Cc, v), y &= 255, B += Xc(z.Bc, v), B += Xc(z.Kc, y), B &= 255, f[h + Ha] = (w & 4278255360 | y << 16 | B) >>> 0;\n h += t;\n ++l;\n (l & q) == 0 && (b += r);\n }\n break;\n case Ee:\n t == f && b.n > 0 ? (t = (m - l) * Aa(b.U, b.n), q = h + (m - l) * b.U - t, memmove(f, q, f, h, t), re(b, l, m, f, q, f, h)) : re(b, l, m, t, q, f, h);\n }\n h = d;\n f = c;\n }\n }\n\n function Yf(a, b) {\n var c = a.V;\n var d = a.Ha + a.l * a.O;\n var e = b - a.O;\n if (!(e <= 0)) {\n ze(a, e, c, d);\n var g = a.N;\n var c = a.Xa;\n let k = [a.vb];\n var d = a.O;\n var e = b;\n var h = k;\n var f = g.width;\n $(d < e);\n $(g.t < g.Ka);\n e > g.K && (e = g.K);\n if (d < g.k) {\n var l = g.k - d;\n var d = g.k;\n h[0] += f * l;\n }\n d >= e ? d = 0 : (h[0] += g.t, g.w = d - g.k, g.m = g.Ka - g.t, g.h = e - d, d = 1);\n if (d) {\n k = k[0];\n d = a.Ib;\n e = g.width;\n if (d.J < ua) {\n var m = d.c.RGBA;\n var h = m.ma;\n let t = m.Sa + a.xa * m.f;\n if (g.I) c = EmitRescaledRows(a, c, k, e, g.h, h, t, m.f);\n else {\n for (var f = d.J, l = g.m, g = g.h, m = m.f, q = g; q-- > 0;) {\n const r = c;\n let u = k;\n let v = l;\n const C = h;\n let A = t;\n switch (f) {\n case Qa:\n for (v = u + v; u < v;) {\n var z = r[u++];\n C[A++] = z >> 16 & 255;\n C[A++] = z >> 8 & 255;\n C[A++] = z >> 0 & 255;\n }\n break;\n case jb:\n se(r, u, v, C, A);\n break;\n case Ob:\n se(r, u, v, C, A);\n WebPApplyAlphaMultiply(C, 0, v,\n 1, 0);\n break;\n case Zc:\n for (v = u + v; u < v;) z = r[u++], C[A++] = z >> 0 & 255, C[A++] = z >> 8 & 255, C[A++] = z >> 16 & 255;\n break;\n case Pa:\n Ib(r, u, v, C, A);\n break;\n case Pb:\n Ib(r, u, v, C, A);\n WebPApplyAlphaMultiply(C, 0, v, 1, 0);\n break;\n case Ab:\n Ib(r, u, v, C, A);\n break;\n case Bb:\n Ib(r, u, v, C, A);\n WebPApplyAlphaMultiply(C, 1, v, 1, 0);\n break;\n case kb:\n te(r, u, v, C, A);\n break;\n case Qb:\n te(r, u, v, C, A);\n WebPApplyAlphaMultiply4444(C, v, 1, 0);\n break;\n case Fe:\n for (v = u + v; u < v;) z = r[u++], C[A++] = z >> 16 & 248 | z >> 13 & 7, C[A++] = z >> 5 & 224 | z >> 3 & 31;\n break;\n default:\n $(0);\n }\n k += e;\n t += m;\n }\n c = g;\n }\n a.xa += c;\n } else {\n a.xa = g.I ? EmitRescaledRowsYUVA(a, c, k, e, g.h) : EmitRowsYUVA(a, c, k, e, g.m, g.h);\n }\n $(a.xa <= d.height);\n }\n a.O = b;\n $(a.O <= a.v);\n }\n }\n\n function lc(a, b, c, d, e, g) {\n let k = 1;\n let h = 0;\n let f = 0;\n const l = a.o;\n const m = a.cb;\n let t = m.Db;\n let q = c;\n let r = c;\n c += d * e;\n e = Ba + Ge;\n const u = e + m.xb;\n const v = m.xb > 0 ? m.Yb : p;\n const C = m.Dc;\n let A = !1;\n $(t != p);\n for (; !l.L && q < c;) {\n let z = s;\n A || ((h & C) == 0 && (t = ye(m, h, f)), Da(l), z = Oa(t.va[Zf], l));\n if (z < Ba || A) {\n if (!A) {\n var w = k = A = s;\n var y = s;\n Da(l);\n A = Oa(t.va[$f], l);\n k = z;\n Da(l);\n w = Oa(t.va[ag], l);\n Da(l);\n y = Oa(t.va[bg], l);\n b[q] = (y << 24 >>> 0) + (A << 16) + (k << 8) + w;\n }\n A = !1;\n ++q;\n ++h;\n if (h >= d && (h = 0, ++f, g != p && f\n % $c == 0 && g(a, f), v != p)) for (; r < q;) k = b[r++], v.ea[ad * k >>> v.bb] = k;\n } else if (z < e) {\n w = w = s;\n k = xe(z - Ba, l);\n z = Oa(t.va[cg], l);\n Da(l);\n w = xe(z, l);\n w > He ? w -= He : (z = dg[w - 1], z = (z >> 4) * d + (8 - (z & 15)), w = z >= 1 ? z : 1);\n z = s;\n for (z = 0; z < k; ++z) b[q + z] = b[q + z - w];\n q += k;\n for (h += k; h >= d;) h -= d, ++f, g != p && f % $c == 0 && g(a, f);\n if (q < c && (t = ye(m, h, f), v != p)) for (; r < q;) k = b[r++], v.ea[ad * k >>> v.bb] = k;\n } else if (z < u) {\n A = z - e;\n for ($(v != p); r < q;) z = b[r++], v.ea[ad * z >>> v.bb] = z;\n z = b;\n w = q;\n y = v;\n $(A <= -1 >>> y.bb);\n z[w] = y.ea[A];\n A = !0;\n continue;\n }(k = !l.fa) || End;\n }\n g != p && g(a, f);\n l.fa || !k || l.L && q < c ? (k = 0, a.a = !l.L ? W : Ie) : q == c && (a.Ob = Db);\n return k;\n }\n\n function bd(a) {\n $(a);\n a.ac = p;\n zb(a.Db, a.hc);\n const b = a.Yb;\n b != p && (b.ea = p, b.ea = p);\n $(a);\n }\n\n function sd() {\n const a = M(eg);\n if (a == p) return p;\n a.a = L;\n a.Wa = cd;\n a.Ob = cd;\n return a;\n }\n\n function sa(a) {\n let b = s;\n if (a != p) {\n bd(a.cb);\n a.V = p;\n a.V = p;\n for (b = 0; b < a.Na; ++b) {\n const c = a.nc[b];\n c.u = p;\n c.u = p;\n }\n a.Na = 0;\n a.Ub = 0;\n a.Mc = p;\n a.Mc = p;\n a.Ib = p;\n }\n }\n\n function Ka(a, b, c, d, e) {\n var g = 1;\n a = [a];\n b = [b];\n for (var k = d.o, h = d.cb, f = p, l = p, l = 0; ;) {\n if (c) {\n for (; g && T(k, 1);) {\n var m = a;\n var t = b;\n var q = d;\n var r = 1;\n var u = q.o;\n var g = q.nc[q.Na];\n var v = T(u, 2);\n if (q.Ub & 1 << v) g = 0;\n else {\n q.Ub\n |= 1 << v;\n g.Qc = v;\n g.U = m[0];\n g.Vb = t[0];\n g.u = [p];\n g.b = 0;\n ++q.Na;\n $(q.Na <= Je);\n switch (v) {\n case Be:\n case De:\n g.n = T(u, 3) + 2;\n r = Ka(Aa(g.U, g.n), Aa(g.Vb, g.n), 0, q, g.u);\n break;\n case Ee:\n t = T(u, 8) + 1;\n r = t > 16 ? 0 : t > 4 ? 1 : t > 2 ? 2 : 3;\n m[0] = Aa(g.U, r);\n g.n = r;\n if (m = r = Ka(t, 1, 0, q, g.u)) {\n if (m = t, q = g, r = s, t = 1 << (8 >>> q.n) >>> 0, u = Array(t), u == p) m = 0;\n else {\n var v = q.u[0];\n var C = q.b;\n u[0] = q.u[0][q.b + 0];\n for (r = 1; r < m; ++r) u[r] = ((((v[C + r] & 4278255360) >>> 0) + ((u[r - 1] & 4278255360) >>> 0) & 4278255360) >>> 0 | (v[C + r] & 16711935) + (u[r - 1] & 16711935) & 16711935) >>> 0;\n for (; r < t; ++r) u[r] = 0;\n q.u[0] = p;\n q.b = p;\n q.u[0] = u;\n q.b = 0;\n m = 1;\n }\n }\n r = m;\n break;\n case Ae:\n break;\n default:\n $(0);\n }\n g.u = g.u[0];\n g = r;\n }\n }\n }\n if (g && T(k, 1) && (l = T(k, 4), g = l >= 1 && l <= fg, !g)) {\n d.a = W;\n break;\n }\n if (g) {\n a: {\n var g = d;\n var A = a[0];\n var z = b[0];\n var m = l;\n var C = v = s;\n var C = g.o;\n var q = g.cb;\n var r = [p];\n var t = p;\n var u = 1;\n if (c && T(C, 1)) {\n var v = T(C, 3) + 2;\n var A = Aa(A, v);\n var w = Aa(z, v);\n var z = A * w;\n if (!Ka(A, w, 0, g, r)) {\n g.a = W;\n zb(t, u);\n g = 0;\n break a;\n }\n r = r[0];\n q.eb = v;\n for (v = 0; v < z; ++v) A = r[v] >>> 8 & 65535, r[v] = A, A >= u && (u = A + 1);\n }\n if (C.fa) zb(t, u), g = 0;\n else if ($(u <= 65536), t = ld(u, gg), t == p) g.a = cb, zb(t, u), g = 0;\n else {\n for (v = 0; v < u; ++v) {\n z = t[v].va;\n for (C = 0; C < Yc; ++C) {\n A = hg[C];\n C == 0 && m > 0 && (A += 1 << m);\n b: {\n const y = A;\n var A = g;\n const G = z[+C];\n var B = 0;\n var w = A.o;\n if (T(w, 1)) {\n var F = Array(2);\n var D = Array(2);\n var L = Array(2);\n var B = T(w, 1) + 1;\n var J = T(w, 1);\n F[0] = T(w, J == 0 ? 1 : 8);\n D[0] = 0;\n L[0] = B - 1;\n B == 2 && (F[1] = T(w, 8), D[1] = 1, L[1] = B - 1);\n c: {\n var J = 0;\n var H = s;\n $(G != p);\n $(L != p);\n $(D != p);\n $(F != p);\n if (nd(G, B)) {\n for (H = 0; H < B; ++H) {\n if (D[H] != pd) {\n if (F[H] < 0 || F[H] >= y) {\n (J = J && ma(G)) || ja(G);\n B = J;\n break c;\n }\n if (!jc(G, F[H], D[H], L[H])) {\n (J = J && ma(G)) || ja(G);\n B = J;\n break c;\n }\n }\n }(J = (J = 1) && ma(G)) || ja(G);\n B = J;\n } else B = 0;\n }\n } else {\n B = s;\n D = [];\n F = T(w, 4) + 4;\n if (F > Ke) {\n A.a = W;\n A = 0;\n break b;\n }\n L = Array(y);\n if (L == p) {\n A.a = cb;\n A = 0;\n break b;\n }\n for (B = 0; B < F; ++B) D[ig[B]] = T(w, 3);\n c: {\n var B = A;\n var O = D;\n var D = y;\n var F = L;\n var J = 0;\n var H = B.o;\n let S = s;\n let V = s;\n let Y = jg;\n const Z = M(Le);\n if (od(Z, O, Ke)) {\n if (T(H, 1)) {\n if (S = 2 + 2 * T(H, 3), V = 2 + T(H, S), V > D) {\n B.a = W;\n ja(Z);\n B = J;\n break c;\n }\n } else V = D;\n for (S = 0; S < D;) {\n var R = s;\n if (V-- == 0) break;\n Da(H);\n R = Oa(Z, H);\n if (R < Me) F[S++] = R, R != 0 && (Y = R);\n else {\n var O = R == kg;\n var R = R - Me;\n const ea = lg[R];\n var R = T(H, mg[R]) + ea;\n if (S + R > D) {\n B.a = W;\n ja(Z);\n B = J;\n break c;\n }\n for (O = O ? Y : 0; R-- > 0;) F[S++] = O;\n }\n }\n J = 1;\n ja(Z);\n B = J;\n } else B.a = W, B = 0;\n }\n B && (B = od(G, L, y));\n }(B = B && !w.fa) ? A = 1 : (A.a = W, A = 0);\n }\n if (!A) {\n zb(t, u);\n g = 0;\n break a;\n }\n }\n }\n q.ac = r;\n q.hc = u;\n q.Db = t;\n g = 1;\n }\n }\n }\n if (!g) {\n d.a = W;\n break;\n }\n if (l > 0) {\n if (h.xb = 1 << l, m = h.Yb, q = 1 << l, $(m != p), $(l > 0), m.ea = U(q, 0), m.ea == p ? l = 0 : (m.bb = 32 - l, l = 1), !l) {\n d.a = cb;\n g = 0;\n break;\n }\n } else h.xb = 0;\n l = d;\n m = a[0];\n q = b[0];\n r = l.cb;\n t = r.eb;\n l.l = m;\n l.v = q;\n r.Ec = Aa(m, t);\n r.Dc = t == 0 ? -1 : (1 << t) - 1;\n if (c) {\n d.Ob = Cb;\n break;\n }\n f = Array(a * b);\n l = 0;\n if (f == p) {\n d.a = cb;\n g = 0;\n break;\n }\n g = (g = lc(d, f, l, a, b, p)) && !k.fa;\n break;\n }\n g ? (e != p ? e[0] = f : ($(f == p), $(c)), c || bd(h)) : (bd(h), d.a == W && d.o.L && (d.a = Ie));\n return g;\n }\n\n function xd(a, b) {\n const c = a.l * a.v;\n const d = c + b + b * $c;\n $(a.l <= b);\n a.V = Array(d);\n a.Ha = 0;\n if (a.V == p) {\n return a.Xa = p, a.a = cb, 0;\n }\n a.Xa = a.V;\n a.vb = a.Ha + c + b;\n return 1;\n }\n\n function mf(a, b) {\n var c = b - a.O;\n var d = a.V;\n var e = a.Ha + a.l * a.O;\n if (!(c <= 0)) {\n ze(a, c, d, e);\n for (var e = a.N.width, c = e * c, d = a.N.ka, e = a.N.fd + e * a.O, g = a.Xa, k = a.vb, h = s, h = 0; h < c; ++h) d[e + h] = g[k + h] >>> 8 & 255;\n a.O = a.xa = b;\n }\n }\n\n function ng(a, b) {\n const c = [s];\n const d = [s];\n const e = [s];\n if (a == p) return 0;\n if (b == p) return a.a = ta, 0;\n a.N = b;\n a.a = L;\n Rb(a.o, b.data, b.b, b.e);\n if (!ue(a.o, c, d, e)) return a.a = W, sa(a), $(a.a != L), 0;\n a.Ob = cd;\n b.width = c[0];\n b.height = d[0];\n a.Wa = Cb;\n return !Ka(c[0], d[0], 1, a, p) ? (sa(a), $(a.a != L), 0) : 1;\n }\n\n function og(a) {\n let b = p;\n let c = p;\n if (a == p) return 0;\n b = a.N;\n $(b != p);\n c = b.ka;\n $(c != p);\n a.Ib = c.j;\n a.Hc = c.Hc;\n $(a.Ib != p);\n if (!Ne(c.Qa, b, Pa)) return a.a = ta, sa(a), $(a.a != L), 0;\n if (!xd(a, b.width) || b.I && !AllocateAndInitRescaler(a, b)) return sa(a), $(a.a != L), 0;\n a.Wa = Db;\n if (!lc(a, a.V, a.Ha, a.l, a.v, Yf)) return sa(a), $(a.a != L), 0;\n c.ec = a.xa;\n sa(a);\n return 1;\n }\n\n function wa(a, b) {\n return a < 0 ? 0 : a > b ? b : a;\n }\n\n function ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, C, w, z) {\n let y; const G = C - 1 >> 1;\n let F = e[g + 0] | k[h + 0] << 16;\n let B = f[l + 0] | m[t + 0] << 16;\n if (a) {\n var D = 3 * F + B + 131074 >> 2;\n w(a[b + 0], D & 255, D >> 16, q, r);\n }\n c && (D = 3 * B + F + 131074 >> 2, w(c[d + 0], D & 255, D >> 16, u, v));\n for (y = 1; y <= G; ++y) {\n const J = e[g + y] | k[h + y] << 16;\n const L = f[l + y] | m[t + y] << 16;\n var D = F + J + B + L + 524296;\n const O = D + 2 * (J + B) >> 3;\n const H = D + 2 * (F + L) >> 3;\n a && (D = O + F >> 1, F = H + J >> 1, w(a[b + 2 * y - 1], D & 255, D >> 16, q, r + (2 * y - 1) * z), w(a[b + 2 * y - 0], F & 255, F >> 16, q, r + (2 * y - 0) * z));\n c && (D = H + B >> 1, F = O + L >> 1, w(c[d + 2 * y - 1], D & 255, D >> 16, u, v + (2 * y - 1) * z), w(c[d + 2 * y + 0], F & 255, F >> 16, u, v + (2 * y + 0) * z));\n F = J;\n B = L;\n }\n C & 1 || (a && (D = 3 * F + B + 131074 >> 2, w(a[b + C - 1], D & 255, D >> 16, q, r + (C - 1) * z)), c && (D = 3 * B + F + 131074 >> 2, w(c[d + C - 1], D & 255, D >> 16, u, v + (C - 1) * z)));\n }\n\n function pg(a,\n b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, hc, 3);\n }\n\n function qg(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, Vc, 3);\n }\n\n function Oe(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, pe, 4);\n }\n\n function Pe(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, oe, 4);\n }\n\n function Qe(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, me, 4);\n }\n\n function Re(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h,\n f, l, m, t, q, r, u, v, w, ne, 2);\n }\n\n function rg(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, le, 2);\n }\n\n function Ca(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u) {\n let v;\n for (v = 0; v < q - 1; v += 2) r(a[b + 0], e[g + 0], k[h + 0], f, l), r(a[b + 1], e[g + 0], k[h + 0], f, l + u), r(c[d + 0], e[g + 0], k[h + 0], m, t), r(c[d + 1], e[g + 0], k[h + 0], m, t + u), b += 2, d += 2, g++, h++, l += 2 * u, t += 2 * u;\n v == q - 1 && (r(a[b + 0], e[g + 0], k[h + 0], f, l), r(c[d + 0], e[g + 0], k[h + 0], m, t));\n }\n\n function Se(a, b, c, d, e, g, k, f, n, l, m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, pe, 4);\n }\n\n function Te(a, b, c, d, e, g, k, f, n, l,\n m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, oe, 4);\n }\n\n function Ue(a, b, c, d, e, g, k, f, n, l, m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, me, 4);\n }\n\n function Ve(a, b, c, d, e, g, k, f, n, l, m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, ne, 2);\n }\n\n function sg(a, b, c, d, e, g) {\n for (; e-- > 0;) {\n for (var k = a, f = b + (c ? 1 : 0), n = a, l = b + (c ? 0 : 3), m = s, m = 0; m < d; ++m) {\n var t = n[l + 4 * m];\n if (t != 255) {\n var t = 32897 * t;\n let q = k;\n let r = f + 4 * m + 0;\n k[f + 4 * m + 0] * t >>> 23;\n q[r] = ca;\n q = k;\n r = f + 4 * m + 1;\n k[f + 4 * m + 1] * t >>> 23;\n q[r] = ca;\n q = k;\n r = f + 4 * m + 2;\n k[f + 4 * m + 2] * t >>> 23;\n q[r] = ca;\n }\n }\n b += g;\n }\n }\n\n function tg(a, b) {\n const c = b.j.c.Va;\n const d = c.y;\n const e = c.D + a.w * c.F;\n const g = c.c;\n const k = c.B + (a.w >> 1) * c.nb;\n const f = c.S;\n const n = c.C + (a.w >> 1) * c.rb;\n const l = a.m;\n const m = a.h;\n const t = parseInt((l + 1) / 2, 10);\n const q = parseInt((m + 1) / 2, 10);\n let r;\n for (r = 0; r < m; ++r) N(d, e + r * c.F, a.y, a.D + r * a.F, l);\n for (r = 0; r < q; ++r) N(g, k + r * c.nb, a.c, a.B + r * a.Da, t), N(f, n + r * c.rb, a.S, a.C + r * a.Da, t);\n return a.h;\n }\n\n function ug(a, b) {\n var c = b.j;\n const d = c.c.RGBA;\n const e = d.ma;\n let g = d.Sa + a.w * d.f;\n const k = a.y;\n let f = a.D;\n const n = a.c;\n let l = a.B;\n const m = a.S;\n let t = a.C;\n var c = vg[c.J];\n const q = a.m;\n const r = a.h - 1;\n let u;\n for (u = 0; u < r; u += 2) c(k, f, k, f + a.F, n, l, m, t, e, g, e, g + d.f, q), f += 2 * a.F, l += a.Da, t += a.Da, g += 2 * d.f;\n u == r && c(k, f, k, f, n, l, m, t, e, g, e, g, q);\n return a.h;\n }\n\n function wg(a, b) {\n let c = a.h;\n const d = b.j.c.RGBA;\n const e = d.ma;\n let g = d.Sa + a.w * d.f;\n const k = V[b.j.J];\n const f = a.y;\n let n = a.D;\n const l = a.c;\n let m = a.B;\n const t = a.S;\n let q = a.C;\n let r = b.Qb;\n let u = b.Rb;\n let v = b.lc;\n let w = b.mc;\n let A = a.w;\n const z = a.w + a.h;\n const y = a.m;\n const D = parseInt((y + 1) / 2, 10);\n A == 0 ? k(p, p, f, n, l, m, t, q, l, m, t, q, p, p, e, g, y) : (k(b.Sb, b.Tb, f, n, r, u, v, w, l, m, t, q, e, g - d.f, e, g, y), ++c);\n for (; A + 2 < z; A += 2) r = l, u = m, v = t, w = q, m += a.Da, q += a.Da, g += 2 * d.f, n += 2 * a.F, k(f, n - a.F, f, n, r, u, v, w, l, m, t, q, e, g - d.f, e, g, y);\n n += a.F;\n a.k + z < a.K ? (N(b.Sb, b.Tb, f, n, 1 * y), N(b.Qb, b.Rb, l, m, 1 * D), N(b.lc, b.mc, t, q, 1 * D), c--) : z & 1 || k(f, n, p, p, l, m, t, q, l, m,\n t, q, e, g + d.f, p, p, y);\n return c;\n }\n\n function xg(a, b) {\n var c = a.p;\n var d = a.q;\n const e = b.j.c.Va;\n const g = a.m;\n const f = a.h;\n const h = e.p;\n let n = e.q + a.w * e.Fa;\n var c = a.p;\n var d = a.q;\n let l = s;\n if (c != p) for (l = 0; l < f; ++l) N(h, n, c, d, 1 * g), d += a.width, n += e.Fa;\n else if (e.p != p) for (l = 0; l < f; ++l) jd(h, n, 255, g), n += e.Fa;\n return 0;\n }\n\n function We(a, b, c) {\n let d = a.w;\n c[0] = a.h;\n a.Bb && (d == 0 ? --c[0] : (--d, b[0] -= a.width), a.k + a.w + a.h == a.K && (c[0] = a.K - a.k - d));\n return d;\n }\n\n function yg(a, b) {\n const c = a.p;\n var d = [a.q];\n if (c != p) {\n for (var e = a.m, g = b.j.J, f = g == Ab || g == Bb, h = b.j.c.RGBA, n = [s], l = We(a, d, n), d = d[0], m = h.ma, l = h.Sa + l * h.f,\n t = l + (f ? 0 : 3), q = 255, r = s, u = s, u = 0; u < n[0]; ++u) {\n for (r = 0; r < e; ++r) {\n const v = c[d + r];\n m[t + 4 * r] = v;\n q &= v;\n }\n d += a.width;\n t += h.f;\n }\n q != 255 && F(g) && WebPApplyAlphaMultiply(m, l, f, e, n, h.f);\n }\n return 0;\n }\n\n function zg(a, b) {\n const c = a.p;\n var d = [a.q];\n if (c != p) {\n const e = a.m;\n const g = b.j.J;\n const f = b.j.c.RGBA;\n const h = [s];\n var n = We(a, d, h);\n var d = d[0];\n const l = f.ma;\n var n = f.Sa + n * f.f;\n let m = n + 1;\n let t = 15;\n let q = s;\n for (j = 0; j < h[0]; ++j) {\n for (q = 0; q < e; ++q) {\n const r = c[d + q] >> 4;\n l[m + 2 * q] = l[m + 2 * q] & 240 | r;\n t &= r;\n }\n d += a.width;\n m += f.f;\n }\n t != 15 && F(g) && WebPApplyAlphaMultiply4444(l, n, e, h, f.f);\n }\n return 0;\n }\n\n function vd(a) {\n let b = a.ka;\n const c = b.j.J;\n const d = c\n < ua;\n const e = c == jb || c == Pa || c == Ab || c == kb || c == Ra || F(c);\n b.memory = p;\n b.$a = p;\n b.zb = p;\n b.ad = p;\n if (!Ne(b.Qa, a, e ? ua : Ra)) return 0;\n if (a.I) {\n if (!(d ? InitRGBRescaler(a, b) : InitYUVRescaler(a, b))) return alert('memory error #1'), 0;\n } else {\n if (d) {\n if (b.$a = ug, a.Bb) {\n const g = a.m + 1 >> 1;\n const f = a.m + 2 * g;\n let h; const\n n = [];\n for (h = 0; h < f; ++h) n.push(205);\n n.push(0);\n b.memory = n;\n if (b.memory == p) return alert('memory error #2'), 0;\n b.Sb = b.memory;\n b.Tb = 0;\n b.Qb = b.Sb;\n b.Rb = b.Tb + a.m;\n b.lc = b.Qb;\n b.mc = b.Rb + g;\n b.$a = wg;\n V[Qa] = pg;\n V[jb] = Oe;\n V[Zc] = qg;\n V[Pa] = Pe;\n V[Ab] = Qe;\n V[kb] = Re;\n V[Fe] = rg;\n }\n } else {\n b.$a = tg;\n }\n e && (F(c) && (WebPApplyAlphaMultiply = sg, V[Ob] = Oe, V[Pb] = Pe, V[Bb] = Qe, V[Qb] = Re), b.zb = c == kb || c == Qb ? zg : d ? yg : xg);\n }\n if (d && !Xe) {\n for (a = 0; a < 256; ++a) Za[a] = 89858 * (a - 128) + Jb >> ea, wb[a] = -22014 * (a - 128) + Jb, vb[a] = -45773 * (a - 128), xb[a] = 113618 * (a - 128) + Jb >> ea;\n for (a = J; a < dd; ++a) b = 76283 * (a - 16) + Jb >> ea, ia[a - J] = wa(b, 255), Hb[a - J] = wa(b + 8 >> 4, 15);\n Xe = 1;\n }\n return 1;\n }\n\n function ud(a) {\n const b = a.ka;\n let c = a.m;\n const d = a.h;\n $(!(a.w & 1));\n if (c <= 0 || d <= 0) return 0;\n c = b.$a(a, b);\n b.ec += c;\n b.zb && b.zb(a, b);\n return 1;\n }\n\n function wd(a) {\n a = a.ka;\n a.memory = '';\n a.memory = p;\n }\n\n function ed(a,\n b) {\n return a[b + 0] | a[b + 1] << 8 | a[b + 2] << 16;\n }\n\n function Kb(a, b) {\n return (ed(a, b) | a[b + 3] << 24) >>> 0;\n }\n\n function Ye(a, b, c, d, e, g, f) {\n var h = 0;\n var n = [0];\n var l = 'VP8StatusCode';\n const m = M(Gc);\n if (a == p || c[0] < Lb) return Z;\n m.data = a;\n m.b = [b[0]];\n m.e = [c[0]];\n m.na = [m.na];\n a: {\n h = m.na;\n $(a != p);\n $(c != p);\n $(h != p);\n h[0] = 0;\n if (c[0] >= Lb && !kd(a, b[0], 'RIFF', O)) {\n if (kd(a, b[0] + 8, 'WEBP', O)) {\n l = W;\n break a;\n }\n var t = Kb(a, b[0] + O);\n if (t < O + R) {\n l = W;\n break a;\n }\n h[0] = t;\n b[0] += Lb;\n c[0] -= Lb;\n } else h[0] = 0;\n l = L;\n }\n m.na = m.na[0];\n if (l != L) return l;\n h = m.na > 0;\n t = [0];\n a: if (l = R + fd, $(a != p), $(c != p), $(n != p), n[0] = 0, c[0] < R) l = Z;\n else {\n if (!kd(a, b[0], 'VP8X', O)) {\n var q = s;\n var r = s;\n var u = E;\n if (Kb(a, b[0] + O) != fd) {\n l = W;\n break a;\n }\n if (c[0] < l) {\n l = Z;\n break a;\n }\n u = Kb(a, b[0] + 8);\n q = 1 + ed(a, b[0] + 12);\n r = 1 + ed(a, b[0] + 15);\n if (q * r >= Ag) {\n l = W;\n break a;\n }\n t != p && (t[0] = u);\n d != p && (d[0] = q);\n e != p && (e[0] = r);\n b[0] += l;\n c[0] -= l;\n n[0] = 1;\n }\n l = L;\n }\n if (l != L) return l;\n if (!h && n[0]) return W;\n g != p && (g[0] = !!(t[0] & Bg));\n if (n && f == p) return L;\n if (c < O) return Z;\n if (h && n[0] || !h && !n[0] && !kd(a, b[0], 'ALPH', O)) {\n m.$ = [m.$];\n m.G = [m.G];\n m.pa = [m.pa];\n a: {\n var n = m.na;\n var h = m.$;\n var t = m.G;\n var l = m.pa;\n var q = x;\n var r = 0;\n var u = Mb;\n let v = O + R + fd;\n $(a != p);\n $(c != p);\n q = a;\n r = b[0];\n u = c[0];\n $(h != p);\n $(l != p);\n h[0] = p;\n t[0] = p;\n for (l[0] = 0; ;) {\n let w = E;\n let y = E;\n b[0] = r;\n c[0] = u;\n if (u < R) {\n l = Z;\n break a;\n }\n w = Kb(q, r + O);\n y = R + w + 1 & -2;\n v += y;\n if (n > 0 && v > n) {\n l = W;\n break a;\n }\n if (u < y) {\n l = Z;\n break a;\n }\n if (kd(q, r, 'ALPH', O)) {\n if (!kd(q, r, 'VP8 ', O) || !kd(q, 'VP8L', O)) {\n l = L;\n break a;\n }\n } else h[0] = q, t[0] = r + R, l[0] = w;\n r += y;\n u -= y;\n }\n l = ca;\n }\n m.$ = m.$[0];\n m.G = m.G[0];\n m.pa = m.pa[0];\n if (l != L) return l;\n }\n m.ta = [m.ta];\n m.ia = [m.ia];\n a: if (n = m.na, h = m.ta, t = m.ia, r = !kd(a, b[0], 'VP8 ', O), l = !kd(a, b[0], 'VP8L', O), q = O + R, $(a != p), $(c != p), $(h != p), $(t != p), c[0] < R) l = Z;\n else {\n if (r || l) {\n r = Kb(a, b[0] + O);\n if (n >= q && r > n - q) {\n l = W;\n break a;\n }\n h[0] = r;\n b[0] += R;\n c[0] -= R;\n t[0] = l;\n } else t[0] = c >= 1 && a[b + 0] == ve, h[0] = c[0];\n l = L;\n }\n m.ta = m.ta[0];\n m.ia = m.ia[0];\n if (l != L) return l;\n if (m.ta > Ze) return W;\n if (m.ia) {\n if (c[0] < $e) return Z;\n n = b[0];\n h = c[0];\n d = d ? d[0] : p;\n e = e ? e[0] : p;\n t = g ? g[0] : p;\n a == p || h < $e ? a = 0 : (l = [s], q = [s], r = [s], u = M(af), Rb(u, a, n, h), ue(u, l, q, r) ? (d != p && (d[0] = l[0]), e != p && (e[0] = q[0]), t != p && (t[0] = r[0]), a = 1) : a = 0);\n } else {\n if (c < bf) return Z;\n n = b[0];\n h = c[0];\n d = d ? d[0] : p;\n e = e ? e[0] : p;\n !(a == p || h < bf) && h - 3 >= 3 && a[n + 3 + 0] == 157 && a[n\n + 3 + 1] == 1 && a[n + 3 + 2] == 42 ? (h = a[n + 0] | a[n + 1] << 8 | a[n + 2] << 16, t = (a[n + 7] << 8 | a[n + 6]) & 16383, a = (a[n + 9] << 8 | a[n + 8]) & 16383, !(!(h & 1) + 0) || (h >> 1 & 7) > 3 || !(h >> 4 & 1) || h >> 5 >= m.ta ? a = 0 : (d && (d[0] = t), e && (e[0] = a), a = 1)) : a = 0;\n }\n if (!a) return W;\n g != p && (g[0] |= m.$ != p);\n f != p && (f[0] = m, f[0].offset = b[0] - f[0].b, $(b[0] - f[0].b < Ze), $(f[0].offset == f[0].e - c[0]));\n return L;\n }\n\n function Kd(a) {\n $(a != p);\n return Ye(a[0].data, a[0].b, a[0].e, p, p, p, a);\n }\n\n function cf(a, b, c, d) {\n let e = 'VP8StatusCode';\n const g = M(Vb);\n let f = M(Gc);\n f.data = a;\n f.b = b;\n f.e = c;\n f.b = [f.b];\n f.e = [f.e];\n f = [f];\n e = Kd(f);\n if (e\n != L) return e;\n f = f[0];\n f.b = f.b[0];\n f.e = f.e[0];\n $(d != p);\n td(na);\n g.data = f.data;\n g.b = b + f.offset;\n g.e = f.e - f.offset;\n g.put = ud;\n g.Mb = vd;\n g.Pb = wd;\n g.ka = d;\n if (f.ia) {\n a = sd();\n if (a == p) return cb;\n ng(a, g) ? (e = zd(g.width, g.height, d.Qa, d.j), e == L && !og(a) && (e = a.a)) : e = a.a;\n a != p && sa(a);\n } else {\n e = M(Cg);\n e != p && (Gd(e), e.za = 0, e.Hb = 1);\n a = e;\n if (a == p) return cb;\n a.qb = 0;\n a.Ga = f.$;\n a.G = f.G;\n a.ub = f.pa;\n Hd(a, g) ? (e = zd(g.width, g.height, d.Qa, d.j), e == L && !Mf(a, g) && (e = a.a)) : e = a.a;\n a != p && ke(a);\n }\n e != L && (self || this).Yc(d.j);\n return e;\n }\n\n function lb(a, b, c, d, e) {\n const g = {\n value: 0,\n };\n c = {\n value: c,\n };\n const f = M(df);\n const h = M(gd);\n f.j = h;\n h.J = a;\n const n = {\n value: h.width,\n };\n const l = {\n value: h.height,\n };\n let m;\n m = c;\n const t = M(ef);\n hd(b, g, m, t) != L ? m = 0 : (n != p && (n.value = t.width), l != p && (l.value = t.height), m = 1);\n if (!m) return p;\n h.width = n.value;\n h.height = l.value;\n d != p && (d.value = h.width.value);\n e != p && (e.value = h.height.value);\n return cf(b, g.value, c.value, f) != L ? p : a < ua ? h.c.RGBA.ma : h.c.Va.y;\n }\n\n function hd(a, b, c, d) {\n if (d == p || a == p) return ta;\n $(d != p);\n d.tc = 0;\n d.width = [d.width];\n d.height = [d.height];\n d.$b = [d.$b];\n return Ye(a, b, c, d.width, d.height, d.$b, p);\n }\n\n function Ne(a,\n b, c) {\n const d = b.width;\n const e = b.height;\n let g = 0;\n let f = 0;\n let h = d;\n let n = e;\n b.Ua = a != p && a.Ua > 0;\n if (b.Ua && (h = a.wc, n = a.vc, g = a.t, f = a.k, c < ua || (g &= -2, f &= -2), g < 0 || f < 0 || h <= 0 || n <= 0 || g + h > d || f + n > e)) return 0;\n b.t = g;\n b.k = f;\n b.Ka = g + h;\n b.K = f + n;\n b.m = h;\n b.h = n;\n b.I = a != p && a.I > 0;\n if (b.I) {\n if (a.Ba <= 0 || a.Aa <= 0) return 0;\n b.Ba = a.Ba;\n b.Aa = a.Aa;\n }\n b.Za = a && a.Za;\n b.Bb = a == p || !a.ed;\n b.I && (b.Za = b.Ba < 3 * d / 4 && b.Aa < 3 * e / 4, b.Bb = 0);\n return 1;\n }\n var na = 512;\n var Qa = 0;\n var jb = 1;\n var Zc = 2;\n var Pa = 3;\n var Ab = 4;\n var kb = 5;\n var Fe = 6;\n var Ob = 7;\n var Pb = 8;\n var Bb = 9;\n var Qb = 10;\n var ua = 11;\n var Ra = 12;\n var Cc = 13;\n this.WEBP_CSP_MODE = this.Cd = {\n nd: 0,\n od: 1,\n kd: 2,\n ld: 3,\n jd: 4,\n pd: 5,\n qd: 6,\n rd: 7,\n sd: 8,\n md: 9,\n };\n var gd = {\n J: 'WEBP_CSP_MODE',\n width: s,\n height: s,\n Fc: s,\n c: {\n RGBA: {\n ma: x,\n Sa: 0,\n f: s,\n size: Mb,\n },\n Va: {\n y: x,\n c: x,\n S: x,\n p: x,\n D: x,\n B: x,\n C: x,\n q: x,\n F: s,\n nb: s,\n rb: s,\n Fa: s,\n Wc: Mb,\n Rc: Mb,\n Uc: Mb,\n Wb: Mb,\n },\n },\n Ic: U(4, E),\n Jb: p,\n jc: x,\n };\n var L = 0;\n var cb = 1;\n var ta = 2;\n var W = 3;\n var Hf = 4;\n var Ie = 5;\n var Nf = 6;\n var Z = 7;\n this.VP8StatusCode = this.td = {\n xd: 0,\n yd: 1,\n vd: 2,\n ud: 3,\n Ad: 4,\n zd: 5,\n Bd: 6,\n wd: 7,\n };\n var ef = {\n width: {\n value: s,\n },\n height: {\n value: s,\n },\n $b: {\n value: s,\n },\n tc: s,\n Yd: s,\n rotate: s,\n be: s,\n Ic: U(3, E),\n };\n this.WebPGetFeatures = this.Md = function (a, b, c) {\n let d = 'VP8StatusCode';\n na >>> 8 != na >>> 8 || c == p ? a = ta : (b = [b], d = hd(a, [0], b, c), a = d == Z ? W : d);\n return a;\n };\n const ff = {\n Za: s,\n ed: s,\n Ua: s,\n t: s,\n k: s,\n wc: s,\n vc: s,\n I: s,\n Ba: s,\n Aa: s,\n ae: s,\n Td: s,\n Xd: s,\n Ic: U(6, E),\n };\n this.WebPDecoderConfig = this.Kd = {\n input: M(ef),\n j: M(gd),\n options: M(ff),\n };\n this.WebPInitDecoderConfig = this.Nd = function (a) {\n na >>> 8 != na >>> 8 || a == p ? a = 0 : (a = a.input, $(a != p), a.tc = 0, a = 1);\n return a;\n };\n var Vb = {\n width: s,\n height: s,\n w: s,\n m: s,\n h: s,\n y: x,\n c: x,\n S: x,\n D: 0,\n B: 0,\n C: 0,\n F: s,\n Da: s,\n ka: 0,\n put: 0,\n Mb: 0,\n Pb: 0,\n Bb: s,\n e: Mb,\n data: x,\n b: 0,\n Za: s,\n Ua: s,\n t: s,\n Ka: s,\n k: s,\n K: s,\n I: s,\n Ba: s,\n Aa: s,\n p: x,\n q: 0,\n };\n var df = {\n j: M(gd),\n Sb: x,\n Qb: x,\n lc: x,\n Tb: 0,\n Rb: 0,\n mc: 0,\n ec: s,\n Qa: M(ff),\n memory: 0,\n $a: '(OutputFunc)',\n zb: '(OutputFunc)',\n ad: '(OutputRowFunc)',\n };\n var Gc = {\n data: x,\n b: x,\n e: Mb,\n offset: Mb,\n $: p,\n G: x,\n pa: Mb,\n ta: Mb,\n na: Mb,\n ia: s,\n };\n var Fc = {\n qa: x,\n Ia: p,\n Pd: x,\n Ab: s,\n la: E,\n Z: E,\n gc: s,\n };\n var af = {\n T: bb,\n qa: x,\n Ia: x,\n ya: Mb,\n Q: Mb,\n g: s,\n L: s,\n fa: s,\n };\n var gf = 25;\n var hf = [0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535, 131071, 262143, 524287, 1048575, 2097151, 4194303, 8388607, 16777215];\n var bf = 10;\n var ve = 47;\n var we = 14;\n var Wf = 3;\n var $e = 5;\n var fg = 11;\n var Yc = 5;\n var qe = 4278190080;\n var jg = 8;\n var Tb = 15;\n var Ba = 256;\n var Ge = 24;\n var Je = 4;\n var Be = 0;\n var De = 1;\n var Ae = 2;\n var Ee = 3;\n var Ub = 1;\n var kc = 0;\n var kf = 1;\n var rd = 1;\n var O = 4;\n var R = 8;\n var Lb = 12;\n var fd = 10;\n var Bg = 16;\n var Ag = 1 * Math.pow(2, 32);\n var Ze = -1 - R - 1 >>> 0;\n var jf = {\n kc: s,\n s,\n };\n var Le = {\n Y: 'HuffmanTreeNode*',\n gb: s,\n Pa: s,\n };\n var pd = -1;\n const Dg = {\n ea: E,\n bb: s,\n };\n var ad = 506832829;\n var $b = 0;\n var ge = $b;\n var fe = 2;\n var ee = 3;\n var de = 1;\n var Ef = 4;\n var Df = 5;\n var Cf = 6;\n var Ld = 3;\n var xa = 4;\n var Hc = 4;\n var Gf = 4;\n var Md = 4;\n var Nd = 8;\n var Kc = 3;\n var Lc = 11;\n var f = 32;\n var Pf = 17 * f + 9 * f;\n var Tc = 1 * f + 8;\n var Uc = Tc + 16 * f + f;\n var he = Uc + 16;\n var Id = {\n fb: x,\n Jc: x,\n Nc: x,\n Ra: E,\n };\n var Jd = {\n l: 0,\n v: 0,\n gd: x,\n hd: x,\n uc: x,\n $c: x,\n };\n const Eg = {\n pb: s,\n ob: s,\n tb: s,\n Kb: U(xa, 0),\n Cb: U(xa, 0),\n };\n const Fg = {\n Ta: U(Ld, x),\n z: md([Md, Nd, Kc, Lc], x),\n };\n const Gg = {\n Oc: s,\n Fb: s,\n kb: s,\n oc: s,\n Lc: U(Hc, s),\n Gc: U(Hc, s),\n };\n var Oc = {\n zc: s,\n yc: s,\n ab: s,\n };\n var Qd = {\n X: s,\n ua: s,\n Nb: s,\n };\n const id = U(2, s);\n const Hg = {\n sc: M(id),\n sb: M(id),\n qc: M(id),\n };\n const Ig = {\n ha: s,\n d: s,\n W: s,\n M: Oc,\n N: Vb,\n };\n var Cg = {\n a: 'VP8StatusCode',\n za: s,\n xc: 0,\n o: M(Fc),\n Ac: M(Id),\n P: M(Jd),\n ga: M(Gg),\n Ca: M(Eg),\n rc: 'WebPWorker',\n qb: s,\n Ja: s,\n jb: s,\n oa: Ig,\n Ma: s,\n hb: s,\n lb: s,\n mb: s,\n wb: s,\n Ya: s,\n Hb: s,\n ic: ld(8, Fc),\n Zc: E,\n yb: ld(xa, Hg),\n R: M(Fg),\n pc: s,\n Pc: x,\n dc: x,\n cc: U(4, x),\n Xc: x,\n Sc: x,\n Vc: x,\n La: M(Qd),\n M: M(Oc),\n Ea: x,\n z: 0,\n ca: x,\n aa: x,\n ra: x,\n da: s,\n ba: s,\n sa: s,\n H: s,\n r: s,\n ib: 0,\n Gb: Mb,\n i: s,\n d: s,\n wa: x,\n Eb: U(16, x),\n Vd: 0,\n Tc: x,\n Lb: x,\n ja: E,\n Oa: E,\n A: s,\n W: s,\n Zb: U(xa, x),\n Ga: p,\n G: 0,\n ub: Mb,\n Xb: x,\n Od: 0,\n cd: s,\n dd: x,\n Wd: 0,\n fc: Mb,\n };\n var Db = 0;\n var Cb = 1;\n var cd = 2;\n const Jg = {\n Qc: 'VP8LImageTransformType',\n n: s,\n U: s,\n Vb: s,\n u: E,\n b: E,\n };\n var gg = {\n va: ld(Yc, Le),\n };\n const Kg = {\n xb: s,\n Yb: M(Dg),\n Dc: s,\n eb: s,\n Ec: s,\n ac: E,\n bd: E,\n hc: s,\n Db: 'HTreeGroup',\n };\n var eg = {\n a: 'VP8StatusCode',\n Wa: 'VP8LDecodeState',\n Ob: 'VP8LDecodeState',\n N: 'VP8Io',\n Ib: 'WebPDecBuffer',\n Hc: 'WebPDecBuffer',\n V: E,\n Ha: E,\n Xa: E,\n vb: E,\n o: M(af),\n l: s,\n v: s,\n O: s,\n xa: s,\n cb: M(Kg),\n Na: s,\n nc: ld(Je, Jg),\n Ub: E,\n Mc: x,\n $d: x,\n Zd: '*WebPRescaler',\n };\n var lf = 4;\n var nf = [p, function (a, b, c, d, e, g, f, h) {\n let n = s;\n let l = h;\n $(a != p);\n $(f != p);\n $(c > 0);\n $(d > 0);\n $(e > 0);\n $(g >= c * e);\n for (n = 0; n < d; ++n) {\n n == 0 ? N(f, h, a, b, e) : Ea(a, b, f, l - g, f, h, e), Ea(a, b + e, f, l, f, h + e, e * (c - 1)),\n l += g, b += g, h += g;\n }\n }, function (a, b, c, d, e, f, k, h) {\n let n = s;\n let l = h;\n $(a != p);\n $(k != p);\n $(c > 0);\n $(d > 0);\n $(e > 0);\n $(f >= c * e);\n N(k, h, a, b, e);\n Ea(a, b + e, k, l, k, h + e, e * (c - 1));\n for (n = 1; n < d; ++n) b += f, h += f, Ea(a, b, k, l, k, h, e * c), l += f;\n }, function (a, b, c, d, e, f, k, h) {\n var n = h;\n let l = s;\n $(a != p);\n $(k != p);\n $(c > 0);\n $(d > 0);\n $(e > 0);\n $(f >= c * e);\n N(k, h, a, b, e);\n Ea(a, b + e, k, n, k, h + e, e * (c - 1));\n for (l = 1; l < d; ++l) {\n let m = s;\n var n = n + f;\n b += f;\n h += f;\n Ea(a, b, k, n - f, k, h, e);\n for (m = e; m < c * e; ++m) {\n const t = k[n + m - e] + k[n + m - f] - k[n + m - f - e];\n k[h + m] = a[b + m] + (t < 0 ? 0 : t > 255 ? 255 : t) & 255;\n }\n }\n }];\n var yd = [3, 4, 3, 4, 4, 2, 2, 4, 4, 4,\n 2, 1, 1,\n ];\n this.WebPFreeDecBuffer = this.Yc = function (a) {\n a != p && (a.Fc || (a.Jb = ''), a.jc = 0, a.Jb = a.jc = p);\n };\n self = this;\n var va = U(511, x);\n var tc = U(511, x);\n var sc = U(2041, 0);\n var oc = U(225, 0);\n var oa = U(766, x);\n var Rd = 0;\n var Xb = 85627;\n var Wb = 35468;\n var Uf = [function (a, b) {\n let c = 4;\n let d;\n for (d = 0; d < 4; ++d) c += a[b + d - f] + a[b - 1 + d * f];\n c >>= 3;\n for (d = 0; d < 4; ++d) jd(a, b + d * f, c, 4);\n }, function (a, b) {\n Dc(a, b, 4);\n }, function (a, b) {\n let c = b - f;\n const d = [];\n d.push(y(a[c - 1], a[c + 0], a[c + 1]));\n d.push(y(a[c + 0], a[c + 1], a[c + 2]));\n d.push(y(a[c + 1], a[c + 2], a[c + 3]));\n d.push(y(a[c + 2], a[c + 3], a[c + 4]));\n for (c = 0; c < 4; ++c) N(a, b + c * f, d, 0, 4);\n },\n function (a, b) {\n const c = a[b - 1];\n const d = a[b - 1 + f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 + 3 * f];\n a[b + 0 + 0 * f] = a[b + 1 + 0 * f] = a[b + 2 + 0 * f] = a[b + 3 + 0 * f] = y(a[b - 1 - f], c, d);\n a[b + 0 + 1 * f] = a[b + 1 + 1 * f] = a[b + 2 + 1 * f] = a[b + 3 + 1 * f] = y(c, d, e);\n a[b + 0 + 2 * f] = a[b + 1 + 2 * f] = a[b + 2 + 2 * f] = a[b + 3 + 2 * f] = y(d, e, g);\n a[b + 0 + 3 * f] = a[b + 1 + 3 * f] = a[b + 2 + 3 * f] = a[b + 3 + 3 * f] = y(e, g, g);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 - f];\n const k = a[b + 0 - f];\n const h = a[b + 1 - f];\n const n = a[b + 2 - f];\n const l = a[b + 3 - f];\n a[b + 0 + 3 * f] = y(d, e, a[b - 1 + 3 * f]);\n a[b + 0 + 2 * f] = a[b + 1 + 3 * f] = y(c, d, e);\n a[b + 0 + 1 * f] = a[b + 1 + 2 * f] = a[b + 2 + 3 * f] = y(g, c, d);\n a[b\n + 0 + 0 * f] = a[b + 1 + 1 * f] = a[b + 2 + 2 * f] = a[b + 3 + 3 * f] = y(k, g, c);\n a[b + 1 + 0 * f] = a[b + 2 + 1 * f] = a[b + 3 + 2 * f] = y(h, k, g);\n a[b + 2 + 0 * f] = a[b + 3 + 1 * f] = y(n, h, k);\n a[b + 3 + 0 * f] = y(l, n, h);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 - f];\n const k = a[b + 0 - f];\n const h = a[b + 1 - f];\n const n = a[b + 2 - f];\n const l = a[b + 3 - f];\n a[b + 0 + 0 * f] = a[b + 1 + 2 * f] = g + k + 1 >> 1;\n a[b + 1 + 0 * f] = a[b + 2 + 2 * f] = k + h + 1 >> 1;\n a[b + 2 + 0 * f] = a[b + 3 + 2 * f] = h + n + 1 >> 1;\n a[b + 3 + 0 * f] = n + l + 1 >> 1;\n a[b + 0 + 3 * f] = y(e, d, c);\n a[b + 0 + 2 * f] = y(d, c, g);\n a[b + 0 + 1 * f] = a[b + 1 + 3 * f] = y(c, g, k);\n a[b + 1 + 1 * f] = a[b + 2 + 3 * f] = y(g, k, h);\n a[b + 2 + 1 * f] = a[b + 3 + 3 * f] = y(k, h, n);\n a[b + 3 + 1 * f] = y(h, n, l);\n },\n function (a, b) {\n const c = a[b + 1 - f];\n const d = a[b + 2 - f];\n const e = a[b + 3 - f];\n const g = a[b + 4 - f];\n const k = a[b + 5 - f];\n const h = a[b + 6 - f];\n const n = a[b + 7 - f];\n a[b + 0 + 0 * f] = y(a[b + 0 - f], c, d);\n a[b + 1 + 0 * f] = a[b + 0 + 1 * f] = y(c, d, e);\n a[b + 2 + 0 * f] = a[b + 1 + 1 * f] = a[b + 0 + 2 * f] = y(d, e, g);\n a[b + 3 + 0 * f] = a[b + 2 + 1 * f] = a[b + 1 + 2 * f] = a[b + 0 + 3 * f] = y(e, g, k);\n a[b + 3 + 1 * f] = a[b + 2 + 2 * f] = a[b + 1 + 3 * f] = y(g, k, h);\n a[b + 3 + 2 * f] = a[b + 2 + 3 * f] = y(k, h, n);\n a[b + 3 + 3 * f] = y(h, n, n);\n },\n function (a, b) {\n const c = a[b + 0 - f];\n const d = a[b + 1 - f];\n const e = a[b + 2 - f];\n const g = a[b + 3 - f];\n const k = a[b + 4 - f];\n const h = a[b + 5 - f];\n const n = a[b + 6 - f];\n const l = a[b + 7 - f];\n a[b + 0 + 0 * f] = c + d + 1 >> 1;\n a[b + 1 + 0 * f] = a[b\n + 0 + 2 * f] = d + e + 1 >> 1;\n a[b + 2 + 0 * f] = a[b + 1 + 2 * f] = e + g + 1 >> 1;\n a[b + 3 + 0 * f] = a[b + 2 + 2 * f] = g + k + 1 >> 1;\n a[b + 0 + 1 * f] = y(c, d, e);\n a[b + 1 + 1 * f] = a[b + 0 + 3 * f] = y(d, e, g);\n a[b + 2 + 1 * f] = a[b + 1 + 3 * f] = y(e, g, k);\n a[b + 3 + 1 * f] = a[b + 2 + 3 * f] = y(g, k, h);\n a[b + 3 + 2 * f] = y(k, h, n);\n a[b + 3 + 3 * f] = y(h, n, l);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 + 3 * f];\n const k = a[b - 1 - f];\n const h = a[b + 0 - f];\n const n = a[b + 1 - f];\n const l = a[b + 2 - f];\n a[b + 0 + 0 * f] = a[b + 2 + 1 * f] = c + k + 1 >> 1;\n a[b + 0 + 1 * f] = a[b + 2 + 2 * f] = d + c + 1 >> 1;\n a[b + 0 + 2 * f] = a[b + 2 + 3 * f] = e + d + 1 >> 1;\n a[b + 0 + 3 * f] = g + e + 1 >> 1;\n a[b + 3 + 0 * f] = y(h, n, l);\n a[b + 2 + 0 * f] = y(k, h, n);\n a[b\n + 1 + 0 * f] = a[b + 3 + 1 * f] = y(c, k, h);\n a[b + 1 + 1 * f] = a[b + 3 + 2 * f] = y(d, c, k);\n a[b + 1 + 2 * f] = a[b + 3 + 3 * f] = y(e, d, c);\n a[b + 1 + 3 * f] = y(g, e, d);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 + 3 * f];\n a[b + 0 + 0 * f] = c + d + 1 >> 1;\n a[b + 2 + 0 * f] = a[b + 0 + 1 * f] = d + e + 1 >> 1;\n a[b + 2 + 1 * f] = a[b + 0 + 2 * f] = e + g + 1 >> 1;\n a[b + 1 + 0 * f] = y(c, d, e);\n a[b + 3 + 0 * f] = a[b + 1 + 1 * f] = y(d, e, g);\n a[b + 3 + 1 * f] = a[b + 1 + 2 * f] = y(e, g, g);\n a[b + 3 + 2 * f] = a[b + 2 + 2 * f] = a[b + 0 + 3 * f] = a[b + 1 + 3 * f] = a[b + 2 + 3 * f] = a[b + 3 + 3 * f] = g;\n },\n ];\n var Vf = [function (a, b) {\n let c = 16;\n let d;\n for (d = 0; d < 16; ++d) c += a[b - 1 + d * f] + a[b + d - f];\n Yb(c >> 5, a, b);\n }, function (a,\n b) {\n Dc(a, b, 16);\n }, function (a, b) {\n let c;\n for (c = 0; c < 16; ++c) N(a, b + c * f, a, b - f, 16);\n }, function (a, b) {\n let c;\n for (c = 16; c > 0; --c) jd(a, b + 0, a[b - 1], 16), b += f;\n }, function (a, b) {\n let c = 8;\n let d;\n for (d = 0; d < 16; ++d) c += a[b - 1 + d * f];\n Yb(c >> 4, a, b);\n }, function (a, b) {\n let c = 8;\n let d;\n for (d = 0; d < 16; ++d) c += a[b + d - f];\n Yb(c >> 4, a, b);\n }, function (a, b) {\n Yb(128, a, b);\n }];\n var je = [function (a, b) {\n let c = 8;\n let d;\n for (d = 0; d < 8; ++d) c += a[b + d - f] + a[b - 1 + d * f];\n Zb(1 * (c >> 4), a, b);\n }, function (a, b) {\n Dc(a, b, 8);\n }, function (a, b) {\n let c;\n for (c = 0; c < 8; ++c) N(a, b + c * f, a, b - f, 8);\n }, function (a, b) {\n let c;\n for (c = 0; c < 8; ++c) {\n jd(a,\n b + 0, a[b - 1], 8), b += f;\n }\n }, function (a, b) {\n let c = 4;\n let d;\n for (d = 0; d < 8; ++d) c += a[b - 1 + d * f];\n Zb(1 * (c >> 3), a, b);\n }, function (a, b) {\n let c = 4;\n let d;\n for (d = 0; d < 8; ++d) c += a[b + d - f];\n Zb(1 * (c >> 3), a, b);\n }, function (a, b) {\n Zb(128, a, b);\n }];\n let mc; let Pc; let Qc; let Rc; let Sd; let Td; let Ud; let Vd; let Wd; let Xd; let Yd; let Zd; let $d; let ae; let be; let ce; var Pd = 31;\n var uc = [0, 2, 8];\n var Od = 3;\n var Of = 1;\n var ie = [0 + 0 * f, 4 + 0 * f, 8 + 0 * f, 12 + 0 * f, 0 + 4 * f, 4 + 4 * f, 8 + 4 * f, 12 + 4 * f, 0 + 8 * f, 4 + 8 * f, 8 + 8 * f, 12 + 8 * f, 0 + 12 * f, 4 + 12 * f, 8 + 12 * f, 12 + 12 * f];\n var Ic = [4, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 17, 18, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 25, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38,\n 39, 40, 41, 42, 43, 44, 45, 46, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 91, 93, 95, 96, 98, 100, 101, 102, 104, 106, 108, 110, 112, 114, 116, 118, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 143, 145, 148, 151, 154, 157,\n ];\n var Jc = [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96,\n 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 119, 122, 125, 128, 131, 134, 137, 140, 143, 146, 149, 152, 155, 158, 161, 164, 167, 170, 173, 177, 181, 185, 189, 193, 197, 201, 205, 209, 213, 217, 221, 225, 229, 234, 239, 245, 249, 254, 259, 264, 269, 274, 279, 284,\n ];\n var Sf = [-$b, 1, -1, 2, -2, 3, 4, 6, -3, 5, -4, -5, -6, 7, -7, 8, -8, -9];\n var Ff = [\n [\n [\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [253, 136, 254, 255, 228, 219, 128, 128, 128, 128, 128],\n [189, 129, 242, 255, 227, 213, 255, 219, 128, 128,\n 128,\n ],\n [106, 126, 227, 252, 214, 209, 255, 255, 128, 128, 128],\n ],\n [\n [1, 98, 248, 255, 236, 226, 255, 255, 128, 128, 128],\n [181, 133, 238, 254, 221, 234, 255, 154, 128, 128, 128],\n [78, 134, 202, 247, 198, 180, 255, 219, 128, 128, 128],\n ],\n [\n [1, 185, 249, 255, 243, 255, 128, 128, 128, 128, 128],\n [184, 150, 247, 255, 236, 224, 128, 128, 128, 128, 128],\n [77, 110, 216, 255, 236, 230, 128, 128, 128, 128, 128],\n ],\n [\n [1, 101, 251, 255, 241, 255, 128, 128, 128, 128, 128],\n [170, 139, 241, 252, 236, 209, 255, 255, 128, 128, 128],\n [37, 116, 196, 243, 228, 255, 255, 255, 128, 128, 128],\n ],\n [\n [1, 204, 254, 255, 245, 255, 128, 128, 128, 128,\n 128,\n ],\n [207, 160, 250, 255, 238, 128, 128, 128, 128, 128, 128],\n [102, 103, 231, 255, 211, 171, 128, 128, 128, 128, 128],\n ],\n [\n [1, 152, 252, 255, 240, 255, 128, 128, 128, 128, 128],\n [177, 135, 243, 255, 234, 225, 128, 128, 128, 128, 128],\n [80, 129, 211, 255, 194, 224, 128, 128, 128, 128, 128],\n ],\n [\n [1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [246, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n ],\n [\n [\n [198, 35, 237, 223, 193, 187, 162, 160, 145, 155, 62],\n [131, 45, 198, 221, 172, 176, 220, 157, 252, 221, 1],\n [68, 47, 146, 208, 149, 167, 221, 162, 255, 223, 128],\n ],\n [\n [1, 149, 241, 255, 221, 224, 255, 255, 128, 128, 128],\n [184, 141, 234, 253, 222, 220, 255, 199, 128, 128, 128],\n [81, 99, 181, 242, 176, 190, 249, 202, 255, 255, 128],\n ],\n [\n [1, 129, 232, 253, 214, 197, 242, 196, 255, 255, 128],\n [99, 121, 210, 250, 201, 198, 255, 202, 128, 128, 128],\n [23, 91, 163, 242, 170, 187, 247, 210, 255, 255, 128],\n ],\n [\n [1, 200, 246, 255, 234, 255, 128, 128, 128, 128, 128],\n [109, 178, 241, 255, 231, 245, 255, 255, 128, 128, 128],\n [44, 130, 201, 253, 205, 192, 255, 255, 128, 128, 128],\n ],\n [\n [1, 132, 239, 251, 219, 209, 255, 165, 128, 128, 128],\n [94, 136, 225, 251, 218, 190, 255, 255, 128, 128, 128],\n [22,\n 100, 174, 245, 186, 161, 255, 199, 128, 128, 128,\n ],\n ],\n [\n [1, 182, 249, 255, 232, 235, 128, 128, 128, 128, 128],\n [124, 143, 241, 255, 227, 234, 128, 128, 128, 128, 128],\n [35, 77, 181, 251, 193, 211, 255, 205, 128, 128, 128],\n ],\n [\n [1, 157, 247, 255, 236, 231, 255, 255, 128, 128, 128],\n [121, 141, 235, 255, 225, 227, 255, 255, 128, 128, 128],\n [45, 99, 188, 251, 195, 217, 255, 224, 128, 128, 128],\n ],\n [\n [1, 1, 251, 255, 213, 255, 128, 128, 128, 128, 128],\n [203, 1, 248, 255, 255, 128, 128, 128, 128, 128, 128],\n [137, 1, 177, 255, 224, 255, 128, 128, 128, 128, 128],\n ],\n ],\n [\n [\n [253, 9, 248, 251, 207, 208, 255, 192, 128, 128, 128],\n [175, 13,\n 224, 243, 193, 185, 249, 198, 255, 255, 128,\n ],\n [73, 17, 171, 221, 161, 179, 236, 167, 255, 234, 128],\n ],\n [\n [1, 95, 247, 253, 212, 183, 255, 255, 128, 128, 128],\n [239, 90, 244, 250, 211, 209, 255, 255, 128, 128, 128],\n [155, 77, 195, 248, 188, 195, 255, 255, 128, 128, 128],\n ],\n [\n [1, 24, 239, 251, 218, 219, 255, 205, 128, 128, 128],\n [201, 51, 219, 255, 196, 186, 128, 128, 128, 128, 128],\n [69, 46, 190, 239, 201, 218, 255, 228, 128, 128, 128],\n ],\n [\n [1, 191, 251, 255, 255, 128, 128, 128, 128, 128, 128],\n [223, 165, 249, 255, 213, 255, 128, 128, 128, 128, 128],\n [141, 124, 248, 255, 255, 128, 128, 128, 128, 128, 128],\n ],\n [\n [1, 16, 248, 255,\n 255, 128, 128, 128, 128, 128, 128,\n ],\n [190, 36, 230, 255, 236, 255, 128, 128, 128, 128, 128],\n [149, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [1, 226, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [247, 192, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [240, 128, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [1, 134, 252, 255, 255, 128, 128, 128, 128, 128, 128],\n [213, 62, 250, 255, 255, 128, 128, 128, 128, 128, 128],\n [55, 93, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128,\n 128, 128, 128, 128, 128, 128, 128,\n ],\n ],\n ],\n [\n [\n [202, 24, 213, 235, 186, 191, 220, 160, 240, 175, 255],\n [126, 38, 182, 232, 169, 184, 228, 174, 255, 187, 128],\n [61, 46, 138, 219, 151, 178, 240, 170, 255, 216, 128],\n ],\n [\n [1, 112, 230, 250, 199, 191, 247, 159, 255, 255, 128],\n [166, 109, 228, 252, 211, 215, 255, 174, 128, 128, 128],\n [39, 77, 162, 232, 172, 180, 245, 178, 255, 255, 128],\n ],\n [\n [1, 52, 220, 246, 198, 199, 249, 220, 255, 255, 128],\n [124, 74, 191, 243, 183, 193, 250, 221, 255, 255, 128],\n [24, 71, 130, 219, 154, 170, 243, 182, 255, 255, 128],\n ],\n [\n [1, 182, 225, 249, 219, 240, 255, 224, 128, 128, 128],\n [149, 150, 226, 252, 216,\n 205, 255, 171, 128, 128, 128,\n ],\n [28, 108, 170, 242, 183, 194, 254, 223, 255, 255, 128],\n ],\n [\n [1, 81, 230, 252, 204, 203, 255, 192, 128, 128, 128],\n [123, 102, 209, 247, 188, 196, 255, 233, 128, 128, 128],\n [20, 95, 153, 243, 164, 173, 255, 203, 128, 128, 128],\n ],\n [\n [1, 222, 248, 255, 216, 213, 128, 128, 128, 128, 128],\n [168, 175, 246, 252, 235, 205, 255, 255, 128, 128, 128],\n [47, 116, 215, 255, 211, 212, 255, 255, 128, 128, 128],\n ],\n [\n [1, 121, 236, 253, 212, 214, 255, 255, 128, 128, 128],\n [141, 84, 213, 252, 201, 202, 255, 219, 128, 128, 128],\n [42, 80, 160, 240, 162, 185, 255, 205, 128, 128, 128],\n ],\n [\n [1, 1, 255, 128, 128, 128, 128,\n 128, 128, 128, 128,\n ],\n [244, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [238, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n ],\n ];\n var Rf = [\n [\n [231, 120, 48, 89, 115, 113, 120, 152, 112],\n [152, 179, 64, 126, 170, 118, 46, 70, 95],\n [175, 69, 143, 80, 85, 82, 72, 155, 103],\n [56, 58, 10, 171, 218, 189, 17, 13, 152],\n [114, 26, 17, 163, 44, 195, 21, 10, 173],\n [121, 24, 80, 195, 26, 62, 44, 64, 85],\n [144, 71, 10, 38, 171, 213, 144, 34, 26],\n [170, 46, 55, 19, 136, 160, 33, 206, 71],\n [63, 20, 8, 114, 114, 208, 12, 9, 226],\n [81, 40, 11, 96, 182, 84, 29, 16, 36],\n ],\n [\n [134, 183, 89, 137, 98, 101, 106, 165, 148],\n [72, 187, 100, 130, 157, 111,\n 32, 75, 80,\n ],\n [66, 102, 167, 99, 74, 62, 40, 234, 128],\n [41, 53, 9, 178, 241, 141, 26, 8, 107],\n [74, 43, 26, 146, 73, 166, 49, 23, 157],\n [65, 38, 105, 160, 51, 52, 31, 115, 128],\n [104, 79, 12, 27, 217, 255, 87, 17, 7],\n [87, 68, 71, 44, 114, 51, 15, 186, 23],\n [47, 41, 14, 110, 182, 183, 21, 17, 194],\n [66, 45, 25, 102, 197, 189, 23, 18, 22],\n ],\n [\n [88, 88, 147, 150, 42, 46, 45, 196, 205],\n [43, 97, 183, 117, 85, 38, 35, 179, 61],\n [39, 53, 200, 87, 26, 21, 43, 232, 171],\n [56, 34, 51, 104, 114, 102, 29, 93, 77],\n [39, 28, 85, 171, 58, 165, 90, 98, 64],\n [34, 22, 116, 206, 23, 34, 43, 166, 73],\n [107, 54, 32, 26, 51, 1, 81, 43, 31],\n [68, 25, 106, 22,\n 64, 171, 36, 225, 114,\n ],\n [34, 19, 21, 102, 132, 188, 16, 76, 124],\n [62, 18, 78, 95, 85, 57, 50, 48, 51],\n ],\n [\n [193, 101, 35, 159, 215, 111, 89, 46, 111],\n [60, 148, 31, 172, 219, 228, 21, 18, 111],\n [112, 113, 77, 85, 179, 255, 38, 120, 114],\n [40, 42, 1, 196, 245, 209, 10, 25, 109],\n [88, 43, 29, 140, 166, 213, 37, 43, 154],\n [61, 63, 30, 155, 67, 45, 68, 1, 209],\n [100, 80, 8, 43, 154, 1, 51, 26, 71],\n [142, 78, 78, 16, 255, 128, 34, 197, 171],\n [41, 40, 5, 102, 211, 183, 4, 1, 221],\n [51, 50, 17, 168, 209, 192, 23, 25, 82],\n ],\n [\n [138, 31, 36, 171, 27, 166, 38, 44, 229],\n [67, 87, 58, 169, 82, 115, 26, 59, 179],\n [63, 59, 90, 180, 59, 166, 93, 73,\n 154,\n ],\n [40, 40, 21, 116, 143, 209, 34, 39, 175],\n [47, 15, 16, 183, 34, 223, 49, 45, 183],\n [46, 17, 33, 183, 6, 98, 15, 32, 183],\n [57, 46, 22, 24, 128, 1, 54, 17, 37],\n [65, 32, 73, 115, 28, 128, 23, 128, 205],\n [40, 3, 9, 115, 51, 192, 18, 6, 223],\n [87, 37, 9, 115, 59, 77, 64, 21, 47],\n ],\n [\n [104, 55, 44, 218, 9, 54, 53, 130, 226],\n [64, 90, 70, 205, 40, 41, 23, 26, 57],\n [54, 57, 112, 184, 5, 41, 38, 166, 213],\n [30, 34, 26, 133, 152, 116, 10, 32, 134],\n [39, 19, 53, 221, 26, 114, 32, 73, 255],\n [31, 9, 65, 234, 2, 15, 1, 118, 73],\n [75, 32, 12, 51, 192, 255, 160, 43, 51],\n [88, 31, 35, 67, 102, 85, 55, 186, 85],\n [56, 21, 23, 111, 59, 205, 45, 37, 192],\n [55, 38, 70, 124, 73, 102, 1, 34, 98],\n ],\n [\n [125, 98, 42, 88, 104, 85, 117, 175, 82],\n [95, 84, 53, 89, 128, 100, 113, 101, 45],\n [75, 79, 123, 47, 51, 128, 81, 171, 1],\n [57, 17, 5, 71, 102, 57, 53, 41, 49],\n [38, 33, 13, 121, 57, 73, 26, 1, 85],\n [41, 10, 67, 138, 77, 110, 90, 47, 114],\n [115, 21, 2, 10, 102, 255, 166, 23, 6],\n [101, 29, 16, 10, 85, 128, 101, 196, 26],\n [57, 18, 10, 102, 102, 213, 34, 20, 43],\n [117, 20, 15, 36, 163, 128, 68, 1, 26],\n ],\n [\n [102, 61, 71, 37, 34, 53, 31, 243, 192],\n [69, 60, 71, 38, 73, 119, 28, 222, 37],\n [68, 45, 128, 34, 1, 47, 11, 245, 171],\n [62, 17, 19, 70, 146, 85, 55, 62, 70],\n [37, 43, 37, 154, 100, 163, 85, 160,\n 1,\n ],\n [63, 9, 92, 136, 28, 64, 32, 201, 85],\n [75, 15, 9, 9, 64, 255, 184, 119, 16],\n [86, 6, 28, 5, 64, 255, 25, 248, 1],\n [56, 8, 17, 132, 137, 255, 55, 116, 128],\n [58, 15, 20, 82, 135, 57, 26, 121, 40],\n ],\n [\n [164, 50, 31, 137, 154, 133, 25, 35, 218],\n [51, 103, 44, 131, 131, 123, 31, 6, 158],\n [86, 40, 64, 135, 148, 224, 45, 183, 128],\n [22, 26, 17, 131, 240, 154, 14, 1, 209],\n [45, 16, 21, 91, 64, 222, 7, 1, 197],\n [56, 21, 39, 155, 60, 138, 23, 102, 213],\n [83, 12, 13, 54, 192, 255, 68, 47, 28],\n [85, 26, 85, 85, 128, 128, 32, 146, 171],\n [18, 11, 7, 63, 144, 171, 4, 4, 246],\n [35, 27, 10, 146, 174, 171, 12, 26, 128],\n ],\n [\n [190, 80, 35, 99, 180, 80,\n 126, 54, 45,\n ],\n [85, 126, 47, 87, 176, 51, 41, 20, 32],\n [101, 75, 128, 139, 118, 146, 116, 128, 85],\n [56, 41, 15, 176, 236, 85, 37, 9, 62],\n [71, 30, 17, 119, 118, 255, 17, 18, 138],\n [101, 38, 60, 138, 55, 70, 43, 26, 142],\n [146, 36, 19, 30, 171, 255, 97, 27, 20],\n [138, 45, 61, 62, 219, 1, 81, 188, 64],\n [32, 41, 20, 117, 151, 142, 20, 21, 163],\n [112, 19, 12, 61, 195, 128, 48, 4, 24],\n ],\n ];\n var If = [\n [\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [176, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [223, 241,\n 252, 255, 255, 255, 255, 255, 255, 255, 255,\n ],\n [249, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 244, 252, 255, 255, 255, 255, 255, 255, 255, 255],\n [234, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 246, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [239, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [251, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [251, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 253, 255, 254, 255, 255, 255, 255, 255, 255],\n [250, 255, 254, 255, 254, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n ],\n [\n [\n [217, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [225, 252, 241, 253, 255, 255, 254, 255,\n 255, 255, 255,\n ],\n [234, 250, 241, 250, 253, 255, 253, 254, 255, 255, 255],\n ],\n [\n [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [223, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [238, 253, 254, 254, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [249, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [247, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 254, 255, 255,\n 255, 255, 255, 255, 255, 255,\n ],\n [252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255,\n 255, 255, 255, 255, 255, 255, 255, 255,\n ],\n ],\n ],\n [\n [\n [186, 251, 250, 255, 255, 255, 255, 255, 255, 255, 255],\n [234, 251, 244, 254, 255, 255, 255, 255, 255, 255, 255],\n [251, 251, 243, 253, 254, 255, 254, 255, 255, 255, 255],\n ],\n [\n [255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [236, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [251, 253, 253, 254, 254, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255,\n 255, 255,\n ],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n ],\n [\n [\n [248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [250, 254, 252, 254, 255, 255, 255, 255, 255, 255, 255],\n [248, 254, 249, 253, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [246, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [252, 254, 251, 254, 254, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 252, 255, 255, 255, 255, 255, 255, 255, 255],\n [248, 254, 253, 255, 255, 255,\n 255, 255, 255, 255, 255,\n ],\n [253, 255, 254, 254, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [245, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [253, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 251, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [252, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [249, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 253,\n 255, 255, 255, 255, 255, 255, 255, 255,\n ],\n [250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n ],\n ];\n this.WebPGetDecoderVersion = this.Ld = function () {\n return 512;\n };\n var Nc = [0, 1, 2, 3, 6, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 0];\n var Jf = [\n [173, 148, 140, 0],\n [176, 155, 140, 135, 0],\n [180, 157, 141, 134, 130, 0],\n [254, 254, 243, 230, 196, 177, 153, 140, 133, 130, 129, 0],\n ];\n var Kf = [0, 1, 4, 8, 5, 2, 3, 6,\n 9, 12, 13, 10, 7, 11, 14, 15,\n ];\n var Tf = md([Kc, Lc], '');\n U(4, x);\n var vc = [\n [0, 0, 0, 0],\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [1, 1, 0, 0],\n [0, 0, 1, 0],\n [1, 0, 1, 0],\n [0, 1, 1, 0],\n [1, 1, 1, 0],\n [0, 0, 0, 1],\n [1, 0, 0, 1],\n [0, 1, 0, 1],\n [1, 1, 0, 1],\n [0, 0, 1, 1],\n [1, 0, 1, 1],\n [0, 1, 1, 1],\n [1, 1, 1, 1],\n ];\n var Lf = 134480385;\n var ea = 16;\n var J = -227;\n var dd = 482;\n var Ce = [Wc, function (a) {\n return a;\n }, function (a, b, c) {\n return b[c + 0];\n }, function (a, b, c) {\n return b[c + 1];\n }, function (a, b, c) {\n return b[c - 1];\n }, function (a, b, c) {\n return ka(ka(a, b[c + 1]), b[c + 0]);\n }, function (a, b, c) {\n return ka(a, b[c - 1]);\n }, function (a, b, c) {\n return ka(a, b[c + 0]);\n }, function (a,\n b, c) {\n return ka(b[c - 1], b[c + 0]);\n }, function (a, b, c) {\n return ka(b[c + 0], b[c + 1]);\n }, function (a, b, c) {\n return ka(ka(a, b[c - 1]), ka(b[c + 0], b[c + 1]));\n }, function (a, b, c) {\n return Math.abs((a >> 24 & 255) - (b[c - 1] >> 24 & 255)) - Math.abs((b[c + 0] >> 24 & 255) - (b[c - 1] >> 24 & 255)) + (Math.abs((a >> 16 & 255) - (b[c - 1] >> 16 & 255)) - Math.abs((b[c + 0] >> 16 & 255) - (b[c - 1] >> 16 & 255))) + (Math.abs((a >> 8 & 255) - (b[c - 1] >> 8 & 255)) - Math.abs((b[c + 0] >> 8 & 255) - (b[c - 1] >> 8 & 255))) + (Math.abs((a & 255) - (b[c - 1] & 255)) - Math.abs((b[c + 0] & 255) - (b[c - 1] & 255))) <= 0 ? b[c + 0] : a;\n }, function (a, b, c) {\n return ($a((a\n >> 24 & 255) + (b[c + 0] >> 24 & 255) - (b[c - 1] >> 24 & 255)) << 24 | $a((a >> 16 & 255) + (b[c + 0] >> 16 & 255) - (b[c - 1] >> 16 & 255)) << 16 | $a((a >> 8 & 255) + (b[c + 0] >> 8 & 255) - (b[c - 1] >> 8 & 255)) << 8 | $a((a & 255) + (b[c + 0] & 255) - (b[c - 1] & 255))) >>> 0;\n }, function (a, b, c) {\n const d = b[c - 1];\n a = ka(a, b[c + 0]);\n return (yb(a >> 24 & 255, d >> 24 & 255) << 24 | yb(a >> 16 & 255, d >> 16 & 255) << 16 | yb(a >> 8 & 255, d >> 8 & 255) << 8 | yb(a >> 0 & 255, d >> 0 & 255)) >>> 0;\n }, Wc, Wc];\n var Xf = {\n Cc: x,\n Bc: x,\n Kc: x,\n };\n var $c = 16;\n var Me = 16;\n var kg = 16;\n var mg = [2, 3, 7];\n var lg = [3, 3, 11];\n var Zf = 0;\n var $f = 1;\n var ag = 2;\n var bg = 3;\n var cg = 4;\n var hg = [Ba + Ge, Ba, Ba, Ba, 40];\n var Ke = 19;\n var ig = [17, 18, 0, 1, 2, 3, 4, 5, 16,\n 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n ];\n var He = 120;\n var dg = [24, 7, 23, 25, 40, 6, 39, 41, 22, 26, 38, 42, 56, 5, 55, 57, 21, 27, 54, 58, 37, 43, 72, 4, 71, 73, 20, 28, 53, 59, 70, 74, 36, 44, 88, 69, 75, 52, 60, 3, 87, 89, 19, 29, 86, 90, 35, 45, 68, 76, 85, 91, 51, 61, 104, 2, 103, 105, 18, 30, 102, 106, 34, 46, 84, 92, 67, 77, 101, 107, 50, 62, 120, 1, 119, 121, 83, 93, 17, 31, 100, 108, 66, 78, 118, 122, 33, 47, 117, 123, 49, 63, 99, 109, 82, 94, 0, 116, 124, 65, 79, 16, 32, 98, 110, 48, 115, 125, 81, 95, 64, 114, 126, 97, 111, 80, 113, 127, 96, 112];\n var Jb = 1 << ea - 1;\n var Za = U(256, 0);\n var xb = U(256, 0);\n var vb = U(256, la);\n var wb = U(256, la);\n var ia = U(dd - J, x);\n var Hb = U(dd\n - J, x);\n var Xe = 0;\n var V = Array(Cc);\n var vg = [function (a, b, c, d, e, f, k, h, n, l, m, t, q) {\n Ca(a, b, c, d, e, f, k, h, n, l, m, t, q, hc, 3);\n }, Se, function (a, b, c, d, e, f, k, h, n, l, m, t, q) {\n Ca(a, b, c, d, e, f, k, h, n, l, m, t, q, Vc, 3);\n }, Te, Ue, Ve, function (a, b, c, d, e, f, k, h, n, l, m, t, q) {\n Ca(a, b, c, d, e, f, k, h, n, l, m, t, q, le, 2);\n }, Se, Te, Ue, Ve];\n this.Hd = function (a, b, c, d) {\n return lb(Qa, a, b, c, d);\n };\n this.Id = function (a, b, c, d) {\n return lb(jb, a, b, c, d);\n };\n this.Jd = function (a, b, c, d) {\n return lb(kb, a, b, c, d);\n };\n this.Ed = function (a, b, c, d) {\n return lb(Ab, a, b, c, d);\n };\n this.Fd = function (a, b, c, d) {\n return lb(Zc,\n a, b, c, d);\n };\n this.Gd = function (a, b, c, d) {\n return lb(Pa, a, b, c, d);\n };\n this.WebPDecode = this.Dd = function (a, b, c) {\n const d = M(df);\n let e = 'VP8StatusCode';\n if (c == p) return ta;\n e = hd(a, [0], [b], c.input);\n if (e != L) return e == Z ? W : e;\n d.j = c.j;\n d.Qa = c.Qa;\n return e = cf(a, 0, [b], d);\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 {webp2png} from './webp';\nimport type {ConvertWebPTask} from './webpWorkerController';\n\nconst ctx = self as any as DedicatedWorkerGlobalScope;\nconst tasks: ConvertWebPTask[] = [];\n// let isProcessing = false;\n\nfunction finishTask() {\n // isProcessing = false;\n processTasks();\n}\n\nfunction processTasks() {\n // if(isProcessing) return;\n\n const task = tasks.shift();\n if(!task) return;\n\n // isProcessing = true;\n\n switch(task.type) {\n case 'convertWebp': {\n const {fileName, bytes} = task.payload;\n\n let convertedBytes: Uint8Array;\n try {\n convertedBytes = webp2png(bytes).bytes;\n } catch(err) {\n console.error('Convert webp2png error:', err, 'payload:', task.payload);\n }\n\n ctx.postMessage({\n type: 'convertWebp',\n payload: {\n fileName,\n bytes: convertedBytes\n }\n });\n\n finishTask();\n\n break;\n }\n\n default:\n finishTask();\n }\n}\n\nfunction scheduleTask(task: ConvertWebPTask) {\n tasks.push(task);\n /* if(task.payload.fileName.indexOf('main-') === 0) {\n tasks.push(task);\n } else {\n tasks.unshift(task);\n } */\n\n processTasks();\n}\n\nctx.addEventListener('message', (event) => {\n scheduleTask(event.data);\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 {WebPDecoder} from '../../vendor/libwebp-0.2.0';\nimport {encode} from 'fast-png';\n\nexport function webp2png(data: Uint8Array) {\n const decoder = new WebPDecoder();\n const config: any = decoder.WebPDecoderConfig;\n const buffer = config.j || config.output;\n const bitstream = config.input;\n\n decoder.WebPInitDecoderConfig(config);\n decoder.WebPGetFeatures(data, data.length, bitstream);\n\n /** MODE_RGBA = 1 MODE_ARGB = 4, */\n buffer.J = 1;\n\n let status;\n try {\n status = decoder.WebPDecode(data, data.length, config);\n } catch(e) {\n status = e;\n }\n\n if(status === 0) {\n const rgbaData = buffer.Jb;\n const pngData = encode({\n data: rgbaData,\n width: buffer.width,\n height: buffer.height,\n channels: 4,\n depth: 8\n });\n\n return {status, bytes: pngData};\n }\n\n return {status, bytes: data};\n}\n\nexport function webp2pngAsBlob(data: Uint8Array) {\n const {status, bytes} = webp2png(data);\n return new Blob([bytes], {type: status === 0 ? 'image/png' : 'image/webp'});\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [699,866,158], () => (__webpack_require__(2061)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + {\"158\":\"npm.iobuffer\",\"699\":\"npm.pako\",\"866\":\"npm.fast-png\"}[chunkId] + \".\" + {\"158\":\"8fe11aa09121a6fd9200\",\"699\":\"89deb457201f16c93925\",\"866\":\"a7cba17ee621cb2ad512\"}[chunkId] + \".chunk.js\";\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = {};\n var countMap = {};\n var getRetryDelay = function () {\n return 3000;\n };\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result +\n (queryMap.hasOwnProperty(chunkId) ? '?' + queryMap[chunkId] : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.hasOwnProperty(chunkId)\n ? countMap[chunkId]\n : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n var retryAttempt = 999999 - retries + 1;\n setTimeout(function () {\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap[chunkId] = cacheBust;\n countMap[chunkId] = retries - 1;\n resolve(__webpack_require__.e(chunkId));\n }, getRetryDelay(retryAttempt));\n });\n });\n };\n }\n})();\n","// no baseURI\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t61: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","next","i","p","M","F","JSON","parse","stringify","N","G","w","D","S","Nb","length","push","ic","rc","memmove","arr1","index1","arr2","index2","jd","kd","ga","String","fromCharCode","U","ld","md","$","Error","WebPDecoder","a","Ob","Pb","Bb","Qb","b","c","la","d","e","Z","gc","bc","qa","Ia","Rb","ya","T","Q","g","L","fa","Sb","Da","gf","hf","ma","Pa","gb","nd","Y","jf","s","ja","jc","k","h","n","l","kc","od","Tb","pd","Ea","qd","P","v","Ga","ub","Xb","m","f","q","r","u","C","Ub","kf","lf","rd","Vb","A","z","sd","td","na","put","ud","Mb","vd","wd","ka","fd","width","height","o","Wa","Cb","Ka","xd","Db","lc","V","Ha","mf","sa","nf","zd","ta","Ua","wc","vc","t","I","Ba","Aa","J","Qa","Cc","Fc","Jb","yd","ua","parseInt","Ra","cb","RGBA","Sa","size","Va","y","Wc","B","nb","Rc","rb","Uc","Wb","Fa","of","mb","Ad","pf","qf","mc","nc","rf","Dc","oa","Yb","Zb","sc","oc","Bd","va","Cd","tc","Dd","Ed","sf","tf","uf","vf","wf","xf","yf","zf","Af","Bf","Fd","$b","Cf","Df","Ef","Ec","wa","Gd","xc","alert","za","Hd","Id","Jd","Gc","data","Kd","ia","W","pa","offset","Ac","fb","Jc","Nc","gd","hd","Ma","hb","K","R","Ta","Ff","Ca","pb","ob","tb","Kb","Lb","uc","$c","xa","Ld","Ab","Oc","Fb","kb","Hc","Lc","Gf","Hb","yb","Ic","sb","qc","Hf","Zc","Md","Nd","Kc","If","pc","Pc","fc","dd","cd","Mc","Jf","Kf","Lf","Mf","Nf","Za","lb","Ya","wb","Ja","qb","WebPWorkerReset","Qd","Rd","Ud","FinishRow","jb","Od","Of","Pf","Pd","Gb","ib","dc","Xc","Sc","Vc","Sd","ha","H","ca","da","aa","ba","ra","La","Qc","Td","Vd","Wd","Xd","Yd","Zd","$d","ae","be","ce","Qf","db","X","cc","O","Eb","Rf","Sf","de","ee","fe","ge","Tc","Oa","Tf","ea","ab","Xa","he","vb","xb","ac","ie","Uf","$a","Vf","je","zb","zc","yc","eb","WebPWorkerSync","OK","hc","WebPWorkerLaunch","Ib","Na","ec","Bc","ke","le","me","ne","oe","pe","qe","re","se","te","ue","ve","we","Wf","xe","Yc","ye","bd","ze","Ae","Be","Ce","De","Xf","Ee","Yf","EmitRescaledRows","WebPApplyAlphaMultiply","WebPApplyAlphaMultiply4444","Fe","EmitRescaledRowsYUVA","EmitRowsYUVA","Ge","Zf","$f","ag","bg","ad","bb","cg","He","dg","End","Ie","eg","Je","Array","fg","gg","hg","Ke","ig","jg","Le","Me","kg","lg","mg","pg","qg","Oe","Pe","Qe","Re","rg","Se","Te","Ue","Ve","sg","tg","j","ug","vg","wg","xg","We","yg","zg","memory","Ne","InitRGBRescaler","InitYUVRescaler","Xe","ed","Ye","Ag","Bg","Ze","$e","af","bf","cf","ng","AllocateAndInitRescaler","og","Cg","this","value","df","ef","WEBP_CSP_MODE","VP8StatusCode","rotate","WebPGetFeatures","ff","WebPDecoderConfig","input","options","WebPInitDecoderConfig","Math","pow","Eg","Fg","Gg","id","Hg","Ig","Kg","WebPFreeDecBuffer","WebPGetDecoderVersion","abs","WebPDecode","ctx","self","tasks","finishTask","processTasks","task","shift","type","fileName","bytes","payload","convertedBytes","decoder","config","buffer","output","bitstream","status","rgbaData","channels","depth","webp2png","err","console","error","postMessage","addEventListener","event","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","call","x","__webpack_exports__","result","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","Object","keys","every","key","splice","definition","defineProperty","enumerable","get","chunkId","Promise","all","reduce","promises","miniCssF","globalThis","Function","window","obj","prop","prototype","hasOwnProperty","scriptUrl","importScripts","location","document","currentScript","src","scripts","getElementsByTagName","replace","oldGetScript","oldLoadScript","queryMap","countMap","catch","retries","realSrc","message","request","resolve","setTimeout","cacheBust","Date","now","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","bind","moreModules","runtime","pop","map","then"],"sourceRoot":""} \ No newline at end of file diff --git a/public/684.a0a965e6cfe303d2345a.chunk.js b/public/684.a0a965e6cfe303d2345a.chunk.js deleted file mode 100644 index 313f0c59..00000000 --- a/public/684.a0a965e6cfe303d2345a.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackChunktweb=this.webpackChunktweb||[]).push([[684],{5814:(e,t,i)=>{"use strict";i.d(t,{Z:()=>m});var s=i(5400),n=i(3512),a=i(4762),o=i(410),r=i(8487),d=i(3772),l=i(1655),c=i(7625),h=i(2586),u=i(3013),p=i(3035);const f=new class{constructor(){this.observer=new IntersectionObserver((e=>{for(const t of e){const e=t.target;for(const i in this.byGroups){if(this.intersectionLockedGroups[i])continue;const s=this.byGroups[i].find((t=>t.el===e));if(s){if(t.isIntersecting)this.visible.add(s),this.checkAnimation(s,!1);else{this.visible.delete(s),this.checkAnimation(s,!0);const e=s.animation;e instanceof d.Z&&e.clearCache()}break}}}})),this.visible=new Set,this.overrideIdleGroups=new Set,this.byGroups={},this.byPlayer=new Map,this.lockedGroups={},this.onlyOnePlayableGroup="",this.intersectionLockedGroups={},this.videosLocked=!1,u.Z.addEventListener("play",(({doc:e})=>{"round"===e.type&&(this.videosLocked=!0,this.checkAnimations2())})),u.Z.addEventListener("pause",(()=>{this.videosLocked&&(this.videosLocked=!1,this.checkAnimations2())})),h.Z.addEventListener("change",(e=>{this.checkAnimations2(e)}))}setOverrideIdleGroup(e,t){t?this.overrideIdleGroups.add(e):this.overrideIdleGroups.delete(e)}getAnimations(e){const t=[];for(const i in this.byGroups)for(const s of this.byGroups[i])s.el===e&&t.push(s);return t}removeAnimation(e){const{el:t,animation:i}=e;i instanceof HTMLVideoElement||i.remove(),i instanceof HTMLVideoElement&&a.IS_SAFARI&&setTimeout((()=>{i.src="",i.load()}),1e3);const s=this.byGroups[e.group];s&&((0,l.Z)(s,e),s.length||delete this.byGroups[e.group]),this.observer.unobserve(t),this.visible.delete(e),this.byPlayer.delete(i)}removeAnimationByPlayer(e){const t=this.byPlayer.get(e);t&&this.removeAnimation(t)}addAnimation(e,t="",i,a){var o,r,l,c;if("none"===t||this.byPlayer.has(e))return;i||(e instanceof d.Z?i=e.el[0]:e instanceof s.KZ?i=e.canvas:e instanceof s.LD?i=null!==(o=e.placeholder)&&void 0!==o?o:e:e instanceof HTMLElement&&(i=e));const h={el:i,animation:e,group:t,controlled:a};a&&"boolean"!=typeof a&&a.onClean((()=>{this.removeAnimationByPlayer(e)})),e instanceof d.Z&&!n.Z.settings.stickers.loop&&e.loop&&(e.loop=n.Z.settings.stickers.loop),(null!==(r=(l=this.byGroups)[c=t])&&void 0!==r?r:l[c]=[]).push(h),this.observer.observe(h.el),this.byPlayer.set(e,h)}checkAnimations(e,t,i,s){if(void 0!==t&&!this.byGroups[t])return;const n=void 0!==t?[t]:Object.keys(this.byGroups);for(const t of n){if(s&&this.intersectionLockedGroups[t])continue;const n=this.byGroups[t];(0,c.Z)(n,(t=>{this.checkAnimation(t,e,i)}))}}checkAnimations2(e){this.checkAnimations(e,void 0,void 0,!0)}checkAnimation(e,t,i){const{el:s,animation:n,group:a}=e;i||!this.lockedGroups[a]&&!(0,r.Z)(s)?e.controlled&&!i||this.removeAnimation(e):t||this.onlyOnePlayableGroup&&this.onlyOnePlayableGroup!==a||n instanceof HTMLVideoElement&&this.videosLocked?n.paused||n.pause():!(n.paused&&this.visible.has(e)&&n.autoplay)||this.onlyOnePlayableGroup&&this.onlyOnePlayableGroup!==a||h.Z.isIdle&&!this.overrideIdleGroups.has(e.group)||n.play()}getOnlyOnePlayableGroup(){return this.onlyOnePlayableGroup}setOnlyOnePlayableGroup(e=""){this.onlyOnePlayableGroup=e}lockGroup(e){this.lockedGroups[e]=!0}unlockGroup(e){delete this.lockedGroups[e],this.checkAnimations(void 0,e)}refreshGroup(e){const t=this.byGroups[e];(null==t?void 0:t.length)&&(t.forEach((e=>{this.observer.unobserve(e.el)})),(0,p.T2)((()=>{t.forEach((e=>{this.observer.observe(e.el)}))})))}lockIntersectionGroup(e){this.intersectionLockedGroups[e]=!0}unlockIntersectionGroup(e){delete this.intersectionLockedGroups[e],this.refreshGroup(e)}toggleIntersectionGroup(e,t){t?this.lockIntersectionGroup(e):this.unlockIntersectionGroup(e)}};o.GO&&(o.GO.animationIntersector=f);const m=f},3013:(e,t,i)=>{"use strict";i.d(t,{Z:()=>L});var s=i(3512),n=i(3725),a=i(4762),o=i(410),r=i(6669),d=i(5432),l=i(2325),c=i(3719),h=i(8479),u=i(6848),p=i(3699),f=i(7530),m=i(493),g=i(2312),v=i(925),b=i(3241),y=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const w=(()=>{try{return a.IS_SAFARI&&+navigator.userAgent.match(/ Version\/(\d+)/)[1]<14}catch(e){return!1}})();class S extends b.Z{constructor(){super(...arguments),this.media=new Map,this.scheduled=new Map,this.mediaDetails=new Map,this.waitingMediaForLoad=new Map,this.waitingScheduledMediaForLoad=new Map,this.waitingDocumentsForLoad={},this.playbackRates={voice:1,video:1,audio:1},this.seekBackward=(e,t=this.playingMedia)=>{t&&(t.currentTime=Math.max(0,t.currentTime-(e.seekOffset||10)))},this.seekForward=(e,t=this.playingMedia)=>{t&&(t.currentTime=Math.min(t.duration,t.currentTime+(e.seekOffset||10)))},this.seekTo=(e,t=this.playingMedia)=>{t&&(t.currentTime=e.seekTime)},this.onMediaDocumentLoad=e=>y(this,void 0,void 0,(function*(){const t=this.mediaDetails.get(e),i=yield this.managers.appDocsManager.getDoc(t.docId);"audio"===i.type&&i.supportsStreaming&&w&&this.handleSafariStreamable(e);const s=yield this.managers.thumbsStorage.getCacheContext(i);e.src=s.url,this.playingMedia===e&&(e.playbackRate=this.playbackRate,"audio"===i.type&&(e.loop=this.loop));const n=this.waitingDocumentsForLoad[i.id];n&&(n.delete(e),n.size||delete this.waitingDocumentsForLoad[i.id])})),this.onPlay=e=>{const t=e.target,i=this.mediaDetails.get(t),{peerId:s,mid:n}=i,a=this.pip;a&&a.pause();const o=this.getMessageByMedia(t);if(this.playingMedia!==t){this.stop(),this.setMedia(t,o);const e=e=>e.mid===n&&e.peerId===s,i=this.listLoader,a=i.getCurrent();if(!a||!e(a)){let t;for(const s of[!1,!0]){const n=i.getPrevious(s);let a=n.findIndex(e);if(-1!==a?t=-(n.length-a):(a=i.getNext(s).findIndex(e),-1!==a&&(t=a+1)),void 0!==t)break}t?this.go(t,!1):this.setTargets({peerId:s,mid:n})}}setTimeout((()=>{this.playingMedia===t&&(this.dispatchEvent("play",this.getPlayingDetails()),this.pauseMediaInOtherTabs())}),0)},this.onPause=e=>{this.dispatchEvent("pause")},this.onEnded=e=>{if(!e.isTrusted)return;this.onPause(e);const t=this.listLoader;!this.lockedSwitchers&&(this.round||!t.current||t.next.length)&&t.getNext(!0).length&&this.next()||(this.stop(),this.dispatchEvent("stop"))},this.play=()=>this.toggle(!0),this.pause=()=>this.toggle(!1),this.stop=(e=this.playingMedia)=>{if(!e)return!1;if(e.paused||e.pause(),e.currentTime=0,(0,r.Z)(e,"ended"),e===this.playingMedia){const t=this.mediaDetails.get(e);if(null==t?void 0:t.clean){e.src="";const i=t.peerId,s=t.isScheduled?this.scheduled:this.media,n=s.get(i);n&&(n.delete(t.mid),n.size||s.delete(i)),e.remove(),this.mediaDetails.delete(e)}this.playingMedia=void 0,this.playingMediaType=void 0}return!0},this.playItem=e=>{const{peerId:t,mid:i}=e,s=this.searchContext.isScheduled;this.getMedia(t,i,s).play(),setTimeout((()=>{this.resolveWaitingForLoadMedia(t,i,s)}),0)},this.go=(e,t)=>{const i=this.listLoader;if(!this.lockedSwitchers&&i)return"audio"===this.playingMediaType?i.goRound(e,t):i.go(e,t)},this.browserPlay=this.bindBrowserCallback((e=>this.toggle(!0,e))),this.browserPause=this.bindBrowserCallback((e=>this.toggle(!1,e))),this.browserStop=this.bindBrowserCallback((e=>this.stop(e))),this.browserSeekBackward=this.bindBrowserCallback(((e,t)=>this.seekBackward(t,e))),this.browserSeekForward=this.bindBrowserCallback(((e,t)=>this.seekForward(t,e))),this.browserSeekTo=this.bindBrowserCallback(((e,t)=>this.seekTo(t,e))),this.browserNext=this.bindBrowserCallback((e=>e||this.next())),this.browserPrevious=this.bindBrowserCallback((e=>e?this.seekToStart(e):this.previous())),this.next=()=>this.go(1),this.previous=()=>{if(!this.seekToStart(this.playingMedia))return this.go(-1)}}construct(e){if(this.managers=e,this.container=document.createElement("div"),this.container.style.cssText="display: none;",document.body.append(this.container),navigator.mediaSession){const e={play:this.browserPlay,pause:this.browserPause,stop:this.browserStop,seekbackward:this.browserSeekBackward,seekforward:this.browserSeekForward,seekto:this.browserSeekTo,previoustrack:this.browserPrevious,nexttrack:this.browserNext};for(const t in e)try{navigator.mediaSession.setActionHandler(t,e[t])}catch(e){console.warn("MediaSession action is not supported:",t)}}s.Z.addEventListener("document_downloaded",(e=>{const t=this.waitingDocumentsForLoad[e];if(t)for(const e of t)this.onMediaDocumentLoad(e)})),s.Z.addEventListener("media_play",(()=>{this.skipMediaPlayEvent?this.skipMediaPlayEvent=!1:!this.pause()&&this.pip&&this.pip.pause()}));const t={};["volume","muted","playbackRate","loop","round"].forEach((e=>{const i="_"+e;t[e]={get:()=>this[i],set:t=>{this[i]!==t&&(this[i]=t,!this.playingMedia||"loop"===e&&"audio"!==this.playingMediaType||"round"===e||(this.playingMedia[e]=t),"playbackRate"===e&&void 0!==this.playingMediaType&&(this.playbackRates[this.playingMediaType]=t),this.dispatchPlaybackParams())}}})),Object.defineProperties(this,t)}dispatchPlaybackParams(){this.dispatchEvent("playbackParams",this.getPlaybackParams())}getPlaybackParams(){const{volume:e,muted:t,playbackRate:i,playbackRates:s,loop:n,round:a}=this;return{volume:e,muted:t,playbackRate:i,playbackRates:s,loop:n,round:a}}setPlaybackParams(e){this.playbackRates=e.playbackRates,this._volume=e.volume,this._muted=e.muted,this._playbackRate=e.playbackRate,this._loop=e.loop,this._round=e.round}addMedia(e,t,i){const{peerId:a,mid:o}=e,r=e.pFlags.is_scheduled?this.scheduled:this.media;let d=r.get(e.peerId);d||r.set(e.peerId,d=new Map);let l=d.get(o);if(l)return l;const c=(0,f.Z)(e);d.set(o,l=document.createElement("round"===c.type||"video"===c.type?"video":"audio")),"round"===c.type&&l.setAttribute("playsinline","true");const h={peerId:a,mid:o,docId:c.id,doc:c,message:e,clean:i,isScheduled:e.pFlags.is_scheduled};this.mediaDetails.set(l,h),l.volume=1,this.container.append(l),l.addEventListener("play",this.onPlay),l.addEventListener("pause",this.onPause),l.addEventListener("ended",this.onEnded),"audio"!==c.type&&(null==e?void 0:e.pFlags.media_unread)&&e.fromId!==s.Z.myId&&l.addEventListener("timeupdate",(()=>{this.managers.appMessagesManager.readMessages(a,[o])}),{once:!0});const u=(0,n.Z)();if(t)u.resolve();else{const t=e.pFlags.is_scheduled?this.waitingScheduledMediaForLoad:this.waitingMediaForLoad;let i=t.get(a);i||t.set(a,i=new Map),i.set(o,u)}return u.then((()=>y(this,void 0,void 0,(function*(){if(c.supportsStreaming||(yield this.managers.thumbsStorage.getCacheContext(c)).url)this.onMediaDocumentLoad(l);else{let e=this.waitingDocumentsForLoad[c.id];e||(e=this.waitingDocumentsForLoad[c.id]=new Set),e.add(l),g.Z.downloadMediaURL({media:c})}})))),l}getMedia(e,t,i){const s=(i?this.scheduled:this.media).get(e);return null==s?void 0:s.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,i){const s=i?this.waitingScheduledMediaForLoad:this.waitingMediaForLoad,n=s.get(e);if(!n)return;const a=n.get(t);a&&(a.resolve(),n.delete(t),n.size||s.delete(e))}isSafariBuffering(e){return!!e.safariBuffering}setSafariBuffering(e,t){e.safariBuffering=t}setNewMediadata(e,t=this.playingMedia){var i,s;return y(this,void 0,void 0,(function*(){if(document.pictureInPictureElement)return;yield(0,v.Z)(t,void 0,!1);const n=(0,f.Z)(e),o=[],r="voice"===n.type||"round"===n.type;let c="",h="";if(null===(i=n.thumbs)||void 0===i?void 0:i.length){const i=n.thumbs[n.thumbs.length-1];if(!i.bytes){const s=yield this.managers.thumbsStorage.getCacheContext(n,i.type);s.url?o.push({src:s.url,sizes:`${i.w}x${i.h}`,type:"image/jpeg"}):g.Z.downloadMediaURL({media:n,thumb:i}).then((()=>{this.playingMedia===t&&s.url&&this.setNewMediadata(e)}))}}else if(r){const t=e.fromId||e.peerId;yield this.managers.appPeersManager.getPeerPhoto(t),c=yield(0,m.Z)({peerId:t,plainText:!0,onlyFirstName:!1}),h=l.ZP.format("voice"===n.type?"AttachAudio":"AttachRound",!0)}if(!r){const e=n.attributes.find((e=>"documentAttributeAudio"===e._));c=null!==(s=null==e?void 0:e.title)&&void 0!==s?s:n.file_name,h=null==e?void 0:e.performer}o.length||(a.IS_APPLE?d.Z?o.push({src:"assets/img/apple-touch-icon-precomposed.png",sizes:"180x180",type:"image/png"}):o.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}`;o.push({src:`assets/img/android-chrome-${t}.png`,sizes:t,type:"image/png"})})));const u=new MediaMetadata({title:c,artist:h,artwork:o});navigator.mediaSession.metadata=u}))}setCurrentMediadata(){const{playingMedia:e}=this;if(!e)return;const t=this.getMessageByMedia(e);this.setNewMediadata(t,e)}getMessageByMedia(e){return this.mediaDetails.get(e).message}getPlayingDetails(){const{playingMedia:e}=this;if(!e)return;const t=this.getMessageByMedia(e);return{doc:(0,f.Z)(t),message:t,media:e,playbackParams:this.getPlaybackParams()}}pauseMediaInOtherTabs(){this.skipMediaPlayEvent=!0,s.Z.dispatchEvent("media_play")}toggle(e,t=this.playingMedia){return!!t&&(void 0===e&&(e=t.paused),t.paused===e&&(e?t.play():t.pause(),!0))}bindBrowserCallback(e){return t=>{e(this.pip,t)}}seekToStart(e){return(null==e?void 0:e.currentTime)>5&&(e.currentTime=0,this.toggle(!0,e),!0)}willBePlayed(e){this.willBePlayedMedia=e}setSearchContext(e){return!(0,u.Z)(this.searchContext,e)&&(this.searchContext=(0,h.Z)(e),!0)}getSearchContext(){return this.searchContext}setTargets(e,t,i){let s=this.listLoader;s?s.reset():s=this.listLoader=new c.Z({loadCount:10,loadWhenLeft:5,processItem:e=>(this.addMedia(e,!1),{peerId:e.peerId,mid:e.mid}),onJump:(e,t)=>{this.playItem(e)},onEmptied:()=>{this.dispatchEvent("stop"),this.stop()}});const n=void 0===this.searchContext.folderId;t?s.setTargets(t,i,n):s.reverse=n,s.setSearchContext(this.searchContext),s.current=e,s.load(!0),s.load(!1)}getPlaybackMediaTypeFromMessage(e){const t=(0,f.Z)(e);let i="audio";return(null==t?void 0:t.type)&&("voice"===t.type||"round"===t.type?i="voice":"video"===t.type&&(i="video")),i}setMedia(e,t){const i=this.getPlaybackMediaTypeFromMessage(t);this._playbackRate=this.playbackRates[i],this.playingMedia=e,this.playingMediaType=i,this.playingMedia.volume=this.volume,this.playingMedia.muted=this.muted,this.playingMedia.playbackRate=this.playbackRate,"audio"===i&&(this.playingMedia.loop=this.loop),"mediaSession"in navigator&&this.setNewMediadata(t)}setSingleMedia(e,t){const i=this.playingMedia,s=this.pause();let n;return e?(n=()=>{const e=this.pip;e&&e.pause(),this.pauseMediaInOtherTabs()},e.paused||n(),e.addEventListener("play",n)):this.pauseMediaInOtherTabs(),this.willBePlayed(void 0),e?this.setMedia(e,t):this.playingMedia=void 0,this.toggleSwitchers(!1),(t=s)=>{this.toggleSwitchers(!0),i&&(this.mediaDetails.get(i)?this.setMedia(i,this.getMessageByMedia(i)):this.next()||this.previous()),this.playingMedia===e&&(this.playingMedia=void 0,this.playingMediaType=void 0),e&&e.removeEventListener("play",n),t&&this.play()}}toggleSwitchers(e){this.lockedSwitchers=!e}setPictureInPicture(e){this.pip=e;const t=new p.Z;t.add(e)("leavepictureinpicture",(()=>{this.pip===e&&(this.pip=void 0,t.removeAll())}),{once:!0}),t.add(e)("play",(t=>{this.playingMedia!==e&&this.pause(),this.pauseMediaInOtherTabs()}))}}const C=new S;o.GO.appMediaPlaybackController=C;const L=C},1784:(e,t,i)=>{"use strict";i.d(t,{Z:()=>L});var s=i(2341),n=i(3910),a=i(2738),o=i(8497),r=i(4668),d=i(130),l=i(4755),c=i(3719),h=i(2312),u=i(9322),p=i(3709),f=i(7530),m=i(5400),g=i(5824),v=i(5128),b=i(4524),y=i(8805),w=i(4332),S=i(1669),C=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class L extends g.Z{get searchContext(){return this.listLoader.searchContext}constructor(){let e;super(new c.Z({processItem:e=>{const t="inputMessagesFilterDocument"===this.searchContext.inputFilter._,{mid:i,peerId:s}=e,n=(0,f.Z)(e);if(n&&(!t||L.isMediaCompatibleForDocumentViewer(n)))return{element:null,mid:i,peerId:s}}}),["delete","forward"]),this.onPrevClick=e=>C(this,void 0,void 0,(function*(){this.openMedia(yield this.getMessageByPeer(e.peerId,e.mid),e.element,-1)})),this.onNextClick=e=>C(this,void 0,void 0,(function*(){this.openMedia(yield this.getMessageByPeer(e.peerId,e.mid),e.element,1)})),this.onDeleteClick=()=>{const e=this.target;new v.Z(e.peerId,[e.mid],"chat",(()=>{this.target={element:this.content.media},this.close()}))},this.onForwardClick=()=>{const e=this.target;e.mid&&new b.Z({[e.peerId]:[e.mid]},(()=>this.close()))},this.onAuthorClick=e=>C(this,void 0,void 0,(function*(){const{mid:t,peerId:i}=this.target;if(t&&t!==Number.MAX_SAFE_INTEGER){const s=this.searchContext.threadId,n=yield this.getMessageByPeer(i,t);this.close(e).then((()=>C(this,void 0,void 0,(function*(){if(l.Z.isMobile){const e=w.ZP.getTab(S.Z);e&&e.close()}u.ZP.setInnerPeer({peerId:n.peerId,lastMsgId:t,type:s?"discussion":void 0,threadId:s})}))))}})),this.onDownloadClick=()=>{const{message:e}=this.target,t=(0,f.Z)(e);t&&h.Z.downloadToDisc({media:t,queueId:u.ZP.chat.bubbles.lazyLoadQueue.queueId})},this.listLoader.onEmptied=()=>{this.close()},this.content.caption=document.createElement("div"),this.content.caption.classList.add(g.x+"-caption","spoilers-container");const t=()=>{e&&clearTimeout(e),e=window.setTimeout((()=>{e=void 0,this.content.caption.classList.remove("is-focused")}),800)};this.content.caption.addEventListener("touchstart",(()=>{l.Z.isMobile&&(this.content.caption.classList.add("is-focused"),e&&(clearTimeout(e),e=void 0),document.addEventListener("touchend",t,{once:!0}))})),new y.ZP(this.content.caption).onAdditionalScroll=t,this.wholeDiv.append(this.content.caption),(0,a.fc)(this.buttons.delete,this.onDeleteClick);const i=[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(i),this.setListeners()}setListeners(){super.setListeners(),(0,a.fc)(this.buttons.forward,this.onForwardClick),(0,a.fc)(this.author.container,this.onAuthorClick);const e=t=>{const i=(0,r.Z)(t.target,"A"),s=(0,o.Z)(t.target,"spoiler");if(i instanceof HTMLAnchorElement&&(!s||this.content.caption.classList.contains("is-spoiler-visible"))){const s=i.getAttribute("onclick");if(!s||s.includes("showMaskedAlert"))return;return(0,n.Z)(t),this.close().then((()=>{this.content.caption.removeEventListener("click",e,{capture:!0}),i.click()})),!1}};this.content.caption.addEventListener("click",e,{capture:!0})}getMessageByPeer(e,t){return this.searchContext.isScheduled?this.managers.appMessagesManager.getScheduledMessageByPeer(e,t):this.managers.appMessagesManager.getMessageByPeer(e,t)}setCaption(e){const t=e.message;let i="";t&&(i=(0,m.ZP)(t,{entities:e.totalEntities})),(0,d.Z)(this.content.caption.firstElementChild,i),this.content.caption.classList.toggle("hide",!t)}setSearchContext(e){return this.listLoader.setSearchContext(e),this}openMedia(e,t,i=0,s=!1,n=[],a=[]){const o=Object.create(null,{_openMedia:{get:()=>super._openMedia}});return C(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;const r=e.mid,d=e.fwd_from&&!e.fromId?e.fwd_from.from_name:e.fromId,l=(0,f.Z)(e),c=yield this.managers.appPeersManager.noForwards(e.peerId),h="messageService"===e._,u=h||!(yield this.managers.appMessagesManager.canForward(e)),m=(h?c:u)||!(0,p.Z)(e);[[[this.buttons.forward,this.btnMenuForward],u],[[this.buttons.download,this.btnMenuDownload],m],[[this.buttons.delete,this.btnMenuDelete],!(yield this.managers.appMessagesManager.canDeleteMessage(e))]].forEach((([e,t])=>{e.forEach((e=>{e instanceof HTMLElement?e.classList.toggle("hide",t):e.verify=()=>!t}))})),this.wholeDiv.classList.toggle("no-forwards",m),this.setCaption(e);const g=o._openMedia.call(this,l,e.date,d,i,t,s,n,a,e);return this.target.mid=r,this.target.peerId=e.peerId,this.target.message=e,g}))}static isMediaCompatibleForDocumentViewer(e){return"photo"===e._||s.Z.has(e.mime_type)}}},5824:(e,t,i)=>{"use strict";i.d(t,{x:()=>Q,Z:()=>Y});var s=i(3725),n=i(4755),a=i(5432),o=i(4762),r=i(5003),d=i(3013),l=i(3910),c=i(3699),h=i(3003),u=i(5322),p=i(7529),f=i(6733),m=i(5157),g=i(7207),v=i(8427),b=i(5701),y=i(3815),w=i(925),S=i(2738);class C extends p.Z{constructor({video:e,play:t=!1,streamable:i=!1,duration:s,onPlaybackRackMenuToggle:n,onPip:a,onPipClose:o}){if(super(),this.video=e,this.wrapper=document.createElement("div"),this.wrapper.classList.add("ckin__player"),this.onPlaybackRackMenuToggle=n,this.onPip=a,this.onPipClose=o,this.listenerSetter=new c.Z,this.setup({element:this.wrapper,listenerSetter:this.listenerSetter,canHideControls:()=>!(this.video.paused||this.playbackRateButton&&this.playbackRateButton.classList.contains("menu-open")),showOnLeaveToClassName:"media-viewer-caption",ignoreClickClassName:"ckin__controls"}),e.parentNode.insertBefore(this.wrapper,e),this.wrapper.appendChild(e),this.skin="default",this.stylePlayer(s),this.setBtnMenuToggle(),"default"===this.skin){const t=this.wrapper.querySelector(".default__controls.ckin__controls");this.progress=new g.Z({media:e,streamable:i,onSeekStart:()=>{this.wrapper.classList.add("is-seeking")},onSeekEnd:()=>{this.wrapper.classList.remove("is-seeking")}}),t.prepend(this.progress.container)}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:i,skin:s,listenerSetter:n}=this;t.classList.add(s);const o=this.buildControls();let r;if(t.insertAdjacentHTML("beforeend",o),"default"===s){this.playbackRateButton=this.wrapper.querySelector(".playback-rate"),this.pipButton=this.wrapper.querySelector(".pip");const e=t.querySelectorAll(".toggle"),s=t.querySelector(".fullscreen"),o=t.querySelector("#time-elapsed");r=t.querySelector("#time-duration"),r.textContent=(0,m.Z)(0|i.duration);const c=new v.Z(n),h=t.querySelector(".left-controls");if(c.btn.classList.remove("btn-icon"),h.insertBefore(c.btn,o.parentElement),Array.from(e).forEach((e=>{(0,S.fc)(e,(()=>{this.togglePlay()}),{listenerSetter:this.listenerSetter})})),this.pipButton){(0,S.fc)(this.pipButton,(()=>{this.video.requestPictureInPicture()}),{listenerSetter:this.listenerSetter});const e=e=>{this.wrapper.style.visibility=e?"hidden":"",this.onPip&&this.onPip(e)},t=20,s=(0,b.Z)(e,t,!1,!0);n.add(i)("enterpictureinpicture",(()=>{s(!0),n.add(i)("leavepictureinpicture",(()=>{const e=n.add(i)("pause",(()=>{clearTimeout(s),this.onPipClose&&this.onPipClose()}),{once:!0}),s=setTimeout((()=>{n.remove(e)}),t)}),{once:!0})})),n.add(i)("leavepictureinpicture",(()=>{s(!1)}))}a.Z||((0,S.fc)(i,(()=>{this.togglePlay()}),{listenerSetter:this.listenerSetter}),n.add(document)("keydown",(e=>{if(y.Z.overlaysActive>1||document.pictureInPictureElement===i)return;const{key:s,code:n}=e;let a=!0;if("KeyF"===n)this.toggleFullScreen();else if("KeyM"===n)d.Z.muted=!d.Z.muted;else if("Space"===n)this.togglePlay();else if(!e.altKey||"Equal"!==n&&"Minus"!==n)!t.classList.contains("ckin__fullscreen")||"ArrowLeft"!==s&&"ArrowRight"!==s?a=!1:"ArrowLeft"===s?d.Z.seekBackward({action:"seekbackward"}):d.Z.seekForward({action:"seekforward"});else{const e="Equal"===n?1:-1,t=d.Z.playbackRate,i=C.PLAYBACK_RATES.indexOf(t)+e;i>=0&&i{a.Z||this.toggleFullScreen()})),(0,S.fc)(s,(()=>{this.toggleFullScreen()}),{listenerSetter:this.listenerSetter}),(0,f.Ms)(t,this.onFullScreen.bind(this,s),n),n.add(i)("timeupdate",(()=>{o.textContent=(0,m.Z)(0|i.currentTime)})),n.add(i)("play",(()=>{t.classList.add("played"),a.Z||n.add(i)("play",(()=>{this.hideControls(!0)}))}),{once:!0}),n.add(i)("pause",(()=>{this.showControls(!1)})),n.add(d.Z)("playbackParams",(()=>{this.setPlaybackRateIcon()}))}n.add(i)("play",(()=>{t.classList.add("is-playing")})),n.add(i)("pause",(()=>{t.classList.remove("is-playing")})),i.duration||e?r.textContent=(0,m.Z)(Math.round(i.duration||e)):(0,w.Z)(i).then((()=>{r.textContent=(0,m.Z)(Math.round(i.duration))}))}togglePlay(){const e=this.video.paused;this.video[e?"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 ${!o.IS_MOBILE&&document.pictureInPictureEnabled?``:""}\n \n
\n
\n
`}setBtnMenuToggle(){const e=C.PLAYBACK_RATES.map(((e,t)=>({regularText:e+"x",onClick:()=>{d.Z.playbackRate=e}}))),t=(0,h.b)({buttons:e});t.classList.add("top-left"),(0,u.v)({el:this.playbackRateButton,onOpen:this.onPlaybackRackMenuToggle?()=>{this.onPlaybackRackMenuToggle(!0)}:void 0,onClose:this.onPlaybackRackMenuToggle?()=>{this.onPlaybackRackMenuToggle(!1)}:void 0}),this.playbackRateButton.append(t),this.setPlaybackRateIcon()}setPlaybackRateIcon(){const e=this.playbackRateButton;C.PLAYBACK_RATES_ICONS.forEach((t=>{t="tgico-"+t,e.classList.remove(t)}));let t=C.PLAYBACK_RATES.indexOf(d.Z.playbackRate);-1===t&&(t=C.PLAYBACK_RATES.indexOf(1)),e.classList.add("tgico-"+C.PLAYBACK_RATES_ICONS[t])}toggleFullScreen(){const e=this.wrapper;if(o.IS_APPLE_MOBILE){const e=this.video;return e.webkitEnterFullscreen(),void e.enterFullscreen()}(0,f.rB)()?(0,f.C8)():(0,f.Dj)(e)}onFullScreen(e){const t=(0,f.rB)();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"))}cleanup(){super.cleanup(),this.listenerSetter.removeAll(),this.progress.removeListeners(),this.onPlaybackRackMenuToggle=this.onPip=void 0}}C.PLAYBACK_RATES=[.5,1,1.5,2],C.PLAYBACK_RATES_ICONS=["playback_05","playback_1x","playback_15","playback_2x"];var L=i(3512),E=i(5814),I=i(9331),M=i(2230),P=i(3442),Z=i(3757),T=i(632),k=i(6385),x=i(8497),A=i(6740),_=i(8204),F=i(9171),D=i(5565),R=i(3035),B=i(65),N=i(241),O=i(3241),U=i(1507),H=i(7660),z=i(8580),j=i(1713),G=i(8115),V=i(4421),K=i(2312),W=i(7362),$=i(2796),q=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Q="media-viewer";class Y extends O.Z{get target(){return this.listLoader.current}set target(e){this.listLoader.current=e}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((0,l.Z)(e),a.Z)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 i=this.isZooming();let s=null;const n=["ckin__player","media-viewer-buttons","media-viewer-author","media-viewer-caption","zoom-container"];i&&n.push("media-viewer-movers"),n.find((e=>{try{if(s=(0,x.Z)(t,e),s)return!0}catch(e){return!1}})),s&&(i||"IMG"!==t.tagName&&"image"!==t.tagName)||this.close()},this.onKeyDown=e=>{if(y.Z.overlaysActive>1)return;const t=e.key;let i=!0;"ArrowRight"===t?this.buttons.next.click():"ArrowLeft"===t?this.buttons.prev.click():"-"===t||"="===t?this.ctrlKeyDown&&this.changeZoom("="===t):i=!1,(e.ctrlKey||e.metaKey)&&(this.ctrlKeyDown=!0),i&&(0,l.Z)(e)},this.onKeyUp=e=>{y.Z.overlaysActive>1||e.ctrlKey||e.metaKey||(this.ctrlKeyDown=!1,this.isZooming()&&this.setZoomValue())},this.onWheel=e=>{if(!(y.Z.overlaysActive>1||(0,x.Z)(e.target,"media-viewer-caption")&&!this.ctrlKeyDown)&&((0,l.Z)(e),this.ctrlKeyDown)){const t=e.deltaY<0;this.changeZoom(!!t)}},this.managers=L.Z.managers,this.log=(0,r.kg)("AMV"),this.preloader=new P.Z,this.preloaderStreamable=new P.Z({cancelable:!1,streamable:!0}),this.preloader.construct(),this.preloaderStreamable.construct(),this.lazyLoadQueue=new V.Z,this.wholeDiv=document.createElement("div"),this.wholeDiv.classList.add(Q+"-whole"),this.overlaysDiv=document.createElement("div"),this.overlaysDiv.classList.add("overlays");const i=document.createElement("div");i.classList.add(Q);const s=this.topbar=document.createElement("div");s.classList.add(Q+"-topbar",Q+"-appear");const n=document.createElement("div");n.classList.add(Q+"-topbar-left"),this.buttons["mobile-close"]=(0,M.Z)("close",{onlyMobile:!0}),this.author.container=document.createElement("div"),this.author.container.classList.add(Q+"-author","no-select");const o=document.createElement("div");this.author.avatarEl=new I.Z,this.author.avatarEl.classList.add(Q+"-userpic","avatar-44"),this.author.nameEl=document.createElement("div"),this.author.nameEl.classList.add(Q+"-name"),this.author.date=document.createElement("div"),this.author.date.classList.add(Q+"-date"),o.append(this.author.nameEl,this.author.date),this.author.container.append(this.author.avatarEl,o);const d=document.createElement("div");d.classList.add(Q+"-buttons"),t.concat(["download","zoom","close"]).forEach((e=>{const t=(0,M.Z)(e,{noRipple:!0});this.buttons[e]=t,d.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=(0,M.Z)("zoomout",{noRipple:!0}),(0,S.fc)(this.zoomElements.btnOut,(()=>this.changeZoom(!1))),this.zoomElements.btnIn=(0,M.Z)("zoomin",{noRipple:!0}),(0,S.fc)(this.zoomElements.btnIn,(()=>this.changeZoom(!0))),this.zoomElements.rangeSelector=new B.Z({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(Q+"-content"),this.content.container=document.createElement("div"),this.content.container.classList.add(Q+"-container"),this.content.media=document.createElement("div"),this.content.media.classList.add(Q+"-media"),this.content.container.append(this.content.media),this.content.main.append(this.content.container),i.append(this.content.main),this.overlaysDiv.append(i),n.append(this.buttons["mobile-close"],this.author.container),s.append(n,d),this.buttons.prev=document.createElement("div"),this.buttons.prev.className=`${Q}-switcher ${Q}-switcher-left`,this.buttons.prev.innerHTML=``,this.buttons.next=document.createElement("div"),this.buttons.next.className=`${Q}-switcher ${Q}-switcher-right`,this.buttons.next.innerHTML=``,this.moversContainer=document.createElement("div"),this.moversContainer.classList.add(Q+"-movers"),this.moversContainer.append(this.buttons.prev,this.buttons.next),this.wholeDiv.append(this.overlaysDiv,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()}setListeners(){(0,S.fc)(this.buttons.download,this.onDownloadClick),[this.buttons.close,this.buttons["mobile-close"],this.preloaderStreamable.preloader].forEach((e=>{(0,S.fc)(e,this.close.bind(this))})),[[-1,this.buttons.prev],[1,this.buttons.next]].forEach((([e,t])=>{t.addEventListener("click",(t=>{(0,l.Z)(t),this.setMoverPromise||this.listLoader.go(e)}))})),(0,S.fc)(this.buttons.zoom,(()=>{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)},a.Z&&new Z.Z({element:this.wholeDiv,onSwipe:(e,t)=>{if(!(0,f.rB)())return Math.abs(e)/N.Z.width>.2||e>125?(e>0?this.buttons.prev.click():this.buttons.next.click(),!0):(Math.abs(t)/N.Z.height>.2||t>125)&&(this.close(),!0)},verifyTouchTarget:e=>!((0,x.Z)(e.target,"ckin__controls")||(0,x.Z)(e.target,"media-viewer-caption")||(0,x.Z)(e.target,"media-viewer-topbar"))})}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 i=e?this.zoomElements.rangeSelector.value:1;if(this.setZoomValue(i),this.zoomElements.rangeSelector.setProgress(i),this.videoPlayer&&this.videoPlayer.lockControls(!e&&void 0),e){if(this.zoomSwipeHandler)this.zoomSwipeHandler.setListeners();else{let e,t;const i=1;this.zoomSwipeHandler=new Z.Z({element:this.moversContainer,onFirstSwipe:()=>{e=t=0,this.moversContainer.classList.add("no-transition")},onSwipe:(s,n)=>{[s,n]=[s*i,n*i],this.zoomSwipeX+=s-e,this.zoomSwipeY+=n-t,[e,t]=[s,n],this.setZoomValue()},onReset:()=>{this.moversContainer.classList.remove("no-transition")},cursor:"move"})}this.zoomElements.rangeSelector.setProgress(i)}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=(0,u.Z)({buttonOptions:{onlyMobile:!0},direction:"bottom-left",buttons:e});this.topbar.append(t)}close(e){var t;if(e&&(0,l.Z)(e),this.setMoverAnimationPromise)return Promise.reject();this.navigationItem&&k.Z.removeItem(this.navigationItem),this.lazyLoadQueue.clear();const i=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===this&&(window.appMediaViewer=void 0),this.removeGlobalListeners(),this.zoomSwipeHandler=void 0,i.finally((()=>{this.wholeDiv.remove(),this.toggleOverlay(!1)})),i}toggleOverlay(e){y.Z.isOverlayActive=e,E.Z.checkAnimations2(e)}toggleGlobalListeners(e){e?this.setGlobalListeners():this.removeGlobalListeners()}removeGlobalListeners(){this.zoomSwipeHandler&&this.zoomSwipeHandler.removeListeners(),window.removeEventListener("keydown",this.onKeyDown),window.removeEventListener("keyup",this.onKeyUp),window.removeEventListener("wheel",this.onWheel,{capture:!0})}setGlobalListeners(){this.isZooming()&&this.zoomSwipeHandler.setListeners(),window.addEventListener("keydown",this.onKeyDown),window.addEventListener("keyup",this.onKeyUp),a.Z||window.addEventListener("wheel",this.onWheel,{passive:!1,capture:!0})}setMoverToTarget(e,t=!1,i=0){return q(this,void 0,void 0,(function*(){this.dispatchEvent("setMoverBefore");const n=this.content.mover;t||(n.innerHTML="");const a=this.isZooming()&&t?this.zoomElements.rangeSelector.value:1;this.removeCenterFromMover(n);const o=0!==i,r=L.Z.settings.animationsEnabled?o?350:200:0;let d,l;e&&(e instanceof I.Z||e.classList.contains("grid-item")?(d=e,l=e.getBoundingClientRect()):e instanceof SVGImageElement||e.parentElement instanceof SVGForeignObjectElement?(d=(0,x.Z)(e,"attachment"),l=d.getBoundingClientRect()):e.classList.contains("profile-avatars-avatar")&&(d=(0,x.Z)(e,"profile-avatars-container"),l=d.getBoundingClientRect(),t&&e.getBoundingClientRect().left!==l.left&&(e=d=l=void 0))),e||(e=this.content.media),l||(d=e.parentElement,l=e.getBoundingClientRect());let c=!1;if(e!==this.content.media&&!e.classList.contains("profile-avatars-avatar")){const i=(0,x.Z)(d,"scrollable"),s=(0,_.Z)(d,i,!0);!t||s&&2!==s.overflow.vertical&&2!==s.overflow.horizontal?!s||1!==s.overflow.vertical&&1!==s.overflow.horizontal||(c=!0):(d=(e=this.content.media).parentElement,l=e.getBoundingClientRect())}const h=this.content.media.getBoundingClientRect();let u,p,f,m="";if(o?(u=1===i?N.Z.width:-h.width,p=h.top):(u=l.left,p=l.top),m+=`translate3d(${u}px,${p}px,0) `,e instanceof HTMLImageElement||e instanceof HTMLVideoElement||"DIV"===e.tagName){if(n.firstElementChild&&n.firstElementChild.classList.contains("media-viewer-aspecter")){f=n.firstElementChild;const e=f.querySelector(".ckin__player");if(e){const t=e.firstElementChild;f.append(t),e.remove()}f.style.cssText||(n.classList.remove("active"),this.setFullAspect(f,h,l),n.offsetLeft,n.classList.add("active"))}else f=document.createElement("div"),f.classList.add("media-viewer-aspecter"),n.prepend(f);f.style.cssText=`width: ${l.width}px; height: ${l.height}px; transform: scale3d(${h.width/l.width}, ${h.height/l.height}, 1);`}n.style.width=h.width+"px",n.style.height=h.height+"px";const g=l.width/h.width,v=l.height/h.height;o||(m+=`scale3d(${g},${v},1) `);let b=window.getComputedStyle(d).getPropertyValue("border-radius");const y=function(e){const 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}(b);if(b=y.map((e=>parseInt(e)/g+"px")).join(" "),o||(n.style.borderRadius=b),t&&1!==a){const e=N.Z.width/2-l.width/2,t=N.Z.height/2-l.height/2,i=l.left-e,s=l.top-t;this.moversContainer.style.transform=`matrix(${g}, 0, 0, ${v}, ${i}, ${s})`}else n.style.transform=m;let w;c&&(n.style.opacity="0");const S=e.classList.contains("is-out"),C=this.setMoverAnimationPromise=(0,s.Z)(),E={onAnimationEnd:C},M=setTimeout((()=>{C.isFulfilled||C.isRejected||C.resolve()}),1e3);if(C.finally((()=>{this.dispatchEvent("setMoverAfter"),this.setMoverAnimationPromise===C&&(this.setMoverAnimationPromise=null),clearTimeout(M)})),t)return e instanceof SVGSVGElement&&(w=n.querySelector("path"),w&&this.sizeTailPath(w,h,g,r,!1,S,b)),e.classList.contains("media-viewer-media")&&n.classList.add("hiding"),this.toggleWholeActive(!1),setTimeout((()=>{n.style.borderRadius=b,n.firstElementChild&&(n.firstElementChild.style.borderRadius=b)}),r/2),setTimeout((()=>{n.innerHTML="",n.classList.remove("moving","active","hiding"),n.style.cssText="display: none;",C.resolve()}),r),n.classList.remove("opening"),E;{let t,i;const s="video, img, .canvas-thumbnail",a=e.matches(s)?e.parentElement:e,r=Array.from(a.querySelectorAll(s));if(r.length){e=r.pop();const t=document.createElement("canvas"),i=t.getContext("2d");e instanceof HTMLImageElement?(t.width=e.naturalWidth,t.height=e.naturalHeight):e instanceof HTMLVideoElement?(t.width=e.videoWidth,t.height=e.videoHeight):e instanceof HTMLCanvasElement&&(t.width=e.width,t.height=e.height),t.className="canvas-thumbnail thumbnail media-photo",i.drawImage(e,0,0),e=t}if("DIV"===e.tagName||"AVATAR-ELEMENT"===e.tagName){const s=Array.from(e.querySelectorAll("img")).pop();s&&(t=new Image,i=s.src,n.append(t))}else if(e instanceof HTMLImageElement)t=new Image,i=e.src;else if(e instanceof HTMLVideoElement)t=(0,H.Z)(),t.src=e.src;else if(e instanceof SVGSVGElement){const t=e.dataset.clipId,i=t+"-mv",{width:s,height:a}=h,o=document.createElementNS("http://www.w3.org/2000/svg","svg");o.setAttributeNS(null,"width",""+s),o.setAttributeNS(null,"height",""+a),o.setAttributeNS(null,"viewBox",`0 0 ${s} ${a}`),o.setAttributeNS(null,"preserveAspectRatio","xMidYMid meet"),o.insertAdjacentHTML("beforeend",e.firstElementChild.outerHTML.replace(t,i)),o.insertAdjacentHTML("beforeend",e.lastElementChild.outerHTML.replace(t,i));const r=o.firstElementChild,d=r.firstElementChild.firstElementChild;if(d instanceof SVGUseElement){let e,t=d.getAttributeNS(null,"transform");t=t.replace(/translate\((.+?), (.+?)\) scale\((.+?), (.+?)\)/,((e,t,i,n,o)=>`translate(${t=2!=(t=+t)?s-2/g:2/g}, ${a}) scale(${+n/g}, ${+o/v})`)),d.setAttributeNS(null,"transform",t),w=r.firstElementChild.lastElementChild;const i=b.split(" ").map((e=>parseInt(e)));e=S?(0,F.Z)(0,0,s-9/g,a,...i):(0,F.Z)(9/g,0,s-9/g,a,...i),w.setAttributeNS(null,"d",e)}const l=o.lastElementChild;l.setAttributeNS(null,"width",""+h.width),l.setAttributeNS(null,"height",""+h.height),n.prepend(o)}else e instanceof HTMLCanvasElement&&(t=e);f&&(f.style.borderRadius=b,t&&f.append(t)),t=n.querySelector("video, img"),t instanceof HTMLImageElement&&(t.classList.add("thumbnail"),f||(t.style.width=h.width+"px",t.style.height=h.height+"px"),i&&(yield(0,A.cj)(t,i))),n.style.display="",(0,R.T2)((()=>{n.classList.add(o?"moving":"active")}))}return n.classList.add("opening"),yield(0,R.d1)(),n.style.transform=`translate3d(${h.left}px,${h.top}px,0) scale3d(1,1,1)`,c&&(n.style.opacity=""),f&&this.setFullAspect(f,h,l),setTimeout((()=>{n.style.borderRadius="",n.firstElementChild&&(n.firstElementChild.style.borderRadius="")}),0),n.dataset.timeout=""+setTimeout((()=>{n.classList.remove("moving","opening"),f&&(n.querySelector("video"),n.classList.remove("active"),f.style.cssText="",n.offsetLeft),n.classList.add("center","no-transition"),n.classList.add("active"),delete n.dataset.timeout,C.resolve()}),r),w&&this.sizeTailPath(w,h,g,r,!0,S,b),E}))}toggleWholeActive(e){e?this.wholeDiv.classList.add("active"):(this.wholeDiv.classList.add("backwards"),setTimeout((()=>{this.wholeDiv.classList.remove("active")}),0))}setFullAspect(e,t,i){const s=t.width/t.height;let{width:n,height:a}=i;s>0?n=a*s:a=n*s,e.style.cssText=`width: ${n}px; height: ${a}px; transform: scale3d(${t.width/n}, ${t.height/a}, 1);`}sizeTailPath(e,t,i,s,n,a,o){const r=Date.now(),{width:d,height:l}=t;s/=2;const c=o.split(" ").map((e=>parseInt(e))),h=()=>{const t=Date.now()-r;let o=s?t/s:1;o>1&&(o=1),n&&(o=1-o);const u=c.map((e=>e*o));let p;p=a?(0,F.Z)(0,0,d-9/i*o,l,...u):(0,F.Z)(9/i*o,0,d,l,...u),e.setAttributeNS(null,"d",p),t{const a=t?-s.width:i;return e.replace(n,a+"px")}));e.style.transform=n,setTimeout((()=>{e.remove()}),350)}setNewMover(){const e=document.createElement("div");return e.classList.add("media-viewer-mover"),e.style.display="none",this.content.mover?this.content.mover.parentElement.append(e):this.moversContainer.append(e),this.content.mover=e}updateMediaSource(e,t,i){const s=e.tagName.toLowerCase()===i?e:e.querySelector(i);if(s&&!(0,x.Z)(e,"document")){if((0,x.Z)(e,"attachment")){const t=e.parentElement.parentElement.querySelector(".preloader-container");if(t){if("video"===i)return void(t.classList.contains("manual")&&t.click());t.remove()}}s.src!==t&&(0,A.ZP)(s,t),s.classList.contains("thumbnail")&&s.parentElement.classList.contains("media-container-aspecter")&&s.classList.remove("thumbnail")}}setAuthorInfo(e,t){const i=e.isPeerId();let s;if(i)s=(0,W.Z)({peerId:e,dialog:!1,onlyFirstName:!1,plainText:!1});else{const t=s=document.createElement("span");t.append((0,G.Z)(e)),t.classList.add("peer-title")}const n=this.author.avatarEl,a=this.author.avatarEl=n.cloneNode();return Promise.all([this.author.avatarEl.updateWithOptions({peerId:e||U.NM,peerTitle:i?void 0:""+e}),s]).then((([e,i])=>{this.author.avatarEl===a&&((0,D.Z)(this.author.date,(0,T.OD)(t)),(0,D.Z)(this.author.nameEl,i),n.replaceWith(this.author.avatarEl))}))}_openMedia(e,t,i,s,a,r=!1,c=[],h=[],u){return q(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;const p=this.setAuthorInfo(i,t),f="document"===e._,m=f&&e.mime_type&&(["video","gif"].includes(e.type)||0===e.mime_type.indexOf("video/"));this.isFirstOpen&&(this.isFirstOpen=!1,this.listLoader.setTargets(c,h,r),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 g=this.content.media,v=!a||a===g;v&&(a=g),this.target={element:a};const b=++this.tempId;g.firstElementChild&&(g.innerHTML=""),0!==s?(this.moveTheMover(this.content.mover,1===s),this.setNewMover()):(this.toggleOverlay(!0),this.setGlobalListeners(),yield p,this.wholeDiv.parentElement||(this.pageEl.insertBefore(this.wholeDiv,document.getElementById("main-columns")),this.wholeDiv.offsetLeft),this.toggleWholeActive(!0),o.IS_MOBILE_SAFARI||(this.navigationItem={type:"media",onPop:e=>{if(this.setMoverAnimationPromise)return!1;this.close()}},k.Z.pushItem(this.navigationItem)));const y=this.content.mover,w=N.Z.width;let S=0;const L=N.Z.height;L<1e6&&!n.Z.isMobile&&(S=120);const E=L-120-S;let I=Promise.resolve();const M=(0,j.Z)(e,g,w,E,!n.Z.isMobile,void 0,!!(f&&e.w&&e.h)).photoSize;if(v){const t=yield this.managers.thumbsStorage.getCacheContext(e,M.type);let i;if(t.downloaded)i=new Image,i.src=t.url;else{const s=(0,z.Z)(e,t,!0);s&&(I=s.loadPromise,i=s.image)}i&&(i.classList.add("thumbnail"),g.append(i))}const P=!(!f||!e.supportsStreaming),Z=P?this.preloaderStreamable:this.preloader,T=()=>this.managers.thumbsStorage.getCacheContext(e,null==M?void 0:M.type);let x;if(m){const t=u&&"gif"!==e.type,i=(0,H.Z)({pip:t});this.wholeDiv.classList.contains("no-forwards")&&i.addEventListener("contextmenu",l.Z);const n=()=>this.setMoverToTarget(a,!1,s).then((({onAnimationEnd:s})=>{const n=y.firstElementChild&&y.firstElementChild.classList.contains("media-viewer-aspecter")?y.firstElementChild:y,r=y.querySelector("video");r&&r.remove(),i.setAttribute("playsinline","true"),i.addEventListener("timeupdate",(()=>{this.tempId!==b&&i.pause()})),this.addEventListener("setMoverAfter",(()=>{i.src="",i.load()}),{once:!0}),o.IS_SAFARI&&(i.autoplay=!0),"gif"===e.type?(i.muted=!0,i.autoplay=!0,i.loop=!0):e.duration<60&&(i.loop=!0),n.append(i);const c=new Promise((e=>{i.addEventListener("canplay",e,{once:!0})})),h=()=>{"gif"!==e.type&&(i.dataset.ckin="default",i.dataset.overlay="1",Promise.all([c,s]).then((()=>{this.tempId===b&&((this.videoPlayer=new C({video:i,play:!0,streamable:P,onPlaybackRackMenuToggle:e=>{this.wholeDiv.classList.toggle("hide-caption",!!e)},onPip:e=>{const s=window.appMediaViewer;if(!e&&s&&s!==this)return this.releaseSingleMedia=void 0,void this.close();this.moversContainer.lastElementChild.classList.toggle("hiding",e),this.toggleWholeActive(!e),this.toggleOverlay(!e),this.toggleGlobalListeners(!e),this.navigationItem&&(e?k.Z.removeItem(this.navigationItem):k.Z.pushItem(this.navigationItem)),t&&(e?(this.releaseSingleMedia(!1),this.releaseSingleMedia=void 0,d.Z.setPictureInPicture(i)):this.releaseSingleMedia=d.Z.setSingleMedia(i,u))},onPipClose:()=>{this.close()}})).addEventListener("toggleControls",(e=>{this.wholeDiv.classList.toggle("has-video-controls",e)})),this.addEventListener("setMoverBefore",(()=>{this.wholeDiv.classList.remove("has-video-controls"),this.videoPlayer.cleanup(),this.videoPlayer=void 0}),{once:!0}),this.isZooming()&&this.videoPlayer.lockControls(!1))})))};if(P){s.then((()=>{i.readyState{i.addEventListener("canplay",(()=>{Z.detach(),i.parentElement.classList.remove("is-buffering")}),{once:!0})};i.addEventListener("waiting",(()=>{const t=i.networkState===i.NETWORK_LOADING,s=i.readyState{(0,l.Z)(e)})),e()}this.lazyLoadQueue.unshift({load:()=>q(this,void 0,void 0,(function*(){const r=P?Promise.resolve():K.Z.downloadMediaURL({media:e});return P||s.then((()=>q(this,void 0,void 0,(function*(){(yield T()).url||Z.attach(y,!0,r)})))),Promise.all([r,s]).then((()=>q(this,void 0,void 0,(function*(){if(this.tempId!==b)return void this.log.warn("media viewer changed video");const e=(yield T()).url;i.addEventListener("error",(()=>{(0,$.bC)({langPackKey:o.IS_MOBILE?"Video.Unsupported.Mobile":"Video.Unsupported.Desktop"}),4!==i.error.code&&this.log.error("Error "+i.error.code+"; details: "+i.error.message),null==Z||Z.detach()}),{once:!0}),a instanceof SVGSVGElement?n.firstElementChild.lastElementChild.append(i):(0,A.ZP)(i,e),t&&(this.releaseSingleMedia=d.Z.setSingleMedia(i,u),this.addEventListener("setMoverBefore",(()=>{this.releaseSingleMedia&&(this.releaseSingleMedia(),this.releaseSingleMedia=void 0)}),{once:!0})),this.updateMediaSource(a,e,"video"),h()})))),r}))})}));x=I.then(n)}else{const t=()=>this.setMoverToTarget(a,!1,s).then((({onAnimationEnd:t})=>{this.lazyLoadQueue.unshift({load:()=>q(this,void 0,void 0,(function*(){const i=f?K.Z.downloadMediaURL({media:e}):K.Z.downloadMediaURL({media:e,thumb:M});return t.then((()=>q(this,void 0,void 0,(function*(){(yield T()).url||this.preloader.attachPromise(i)})))),Promise.all([t,i]).then((()=>q(this,void 0,void 0,(function*(){var e;if(this.tempId!==b)return void this.log.warn("media viewer changed photo");const t=(yield T()).url;if(a instanceof SVGSVGElement){if(this.updateMediaSource(a,t,"img"),this.updateMediaSource(y,t,"img"),n.Z.isMobile){const e=y.querySelectorAll("img");e&&e.length&&e.forEach((e=>{e.classList.remove("thumbnail")}))}}else{const i=y.firstElementChild&&y.firstElementChild.classList.contains("media-viewer-aspecter")?y.firstElementChild:y,s="IMG"===(null===(e=i.firstElementChild)||void 0===e?void 0:e.tagName)?i.firstElementChild:null;if(!s||s.src!==t){const e=new Image;e.classList.add("thumbnail"),(0,A.ZP)(e,t,(()=>{this.updateMediaSource(a,t,"img"),s&&(0,R.T2)((()=>{s.remove()})),i.append(e)}))}}})))).catch((e=>{this.log.error(e),this.preloader.attach(y),this.preloader.setManual()})),i}))})}));x=I.then(t)}return this.setMoverPromise=x.catch((()=>{this.setMoverAnimationPromise=null})).finally((()=>{this.setMoverPromise=null}))}))}}},6385:(e,t,i)=>{"use strict";i.d(t,{Z:()=>h});var s=i(410),n=i(4762),a=i(5003),o=i(8799),r=i(3910),d=i(3444),l=i(1655);const c=new class{constructor(){if(this.onPopState=e=>{const t=window.location.hash,i=e.state;if(this.debug&&this.log("popstate",e,this.isPossibleSwipe,t),t!==this.currentHash)if(this.debug&&this.log.warn(`hash changed, new=${t}, current=${this.currentHash}, overridden=${this.overriddenHash}`),i===this.id&&this.overriddenHash&&this.overriddenHash!==t)this.overrideHash(this.overriddenHash);else{if(!i||this.overriddenHash||!t)return this.currentHash=t,void(this.onHashChange&&this.onHashChange());this.overrideHash()}if(i!==this.id&&(this.pushState(),!this.navigations.length))return;const s=this.navigations.pop();s?(this.manual=!this.isPossibleSwipe,this.handleItem(s)):this.pushState()},this.onKeyDown=e=>{const t=this.navigations[this.navigations.length-1];t&&("Escape"!==e.key||t.onEscape&&!t.onEscape()||((0,r.Z)(e),this.back(t.type)))},this.onTouchStart=e=>{e.touches.length>1||(this.debug&&this.log("touchstart"),(0,d.Z)(e)&&(this.isPossibleSwipe=!0,window.addEventListener("touchend",(()=>{setTimeout((()=>{this.isPossibleSwipe=!1}),100)}),{passive:!0,once:!0})))},this.navigations=[],this.id=Date.now(),this.manual=!1,this.log=(0,a.kg)("NC"),this.debug=!0,this.currentHash=window.location.hash,this.overriddenHash="",this.isPossibleSwipe=!1,window.addEventListener("popstate",this.onPopState),window.addEventListener("keydown",this.onKeyDown,{capture:!0,passive:!1}),n.IS_MOBILE_SAFARI){const e={passive:!0};window.addEventListener("touchstart",this.onTouchStart,e)}history.scrollRestoration="manual",this.pushState()}overrideHash(e=""){e&&"#"!==e[0]?e="#"+e:"#"===e&&(e=""),this.currentHash!==e&&(this.overriddenHash=this.currentHash=e,this.replaceState(),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||(0,o.Z)(),this.manual=!1}findItemByType(e){for(let t=this.navigations.length-1;t>=0;--t){const i=this.navigations[t];if(i.type===e)return{item:i,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)}onItemAdded(e){this.debug&&this.log("onItemAdded",e,this.navigations),e.noHistory||this.pushState()}pushItem(e){this.navigations.push(e),this.onItemAdded(e)}unshiftItem(e){this.navigations.unshift(e),this.onItemAdded(e)}spliceItems(e,t,...i){this.navigations.splice(e,t,...i),i.forEach((e=>{this.onItemAdded(e)}))}pushState(){this.debug&&this.log("push"),this.manual=!1,history.pushState(this.id,"")}replaceState(){this.debug&&this.log.warn("replace");const e=location.origin+location.pathname+location.search+this.overriddenHash;history.replaceState(this.id,"",e)}removeItem(e){e&&(0,l.Z)(this.navigations,e)}removeByType(e,t=!1){for(let i=this.navigations.length-1;i>=0&&(this.navigations[i].type!==e||(this.navigations.splice(i,1),!t));--i);}};s.GO.appNavigationController=c;const h=c},5884:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l,z:()=>d});var s=i(4277),n=i(8805),a=i(5565),o=i(2325),r=i(3512);class d{constructor(e,t,i=!0,n,a=!0,r=!0,d,l){this.name=e,this.type=t,this.clearable=i,this.autonomous=r,this.onFound=d,this.noIcons=l,this.list=s.default.createChatList(),this.container=document.createElement("div"),n&&(this.container.className=n),e&&(this.nameEl=document.createElement("div"),this.nameEl.classList.add("search-group__name"),"string"==typeof e&&this.nameEl.append((0,o.ag)(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",a&&s.default.setListClickListener(this.list,d,void 0,r)}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 l{constructor(e,t,i,s,a){this.container=e,this.searchInput=t,this.searchGroups=i,this.onSearch=s,this.noIcons=a,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 n.ZP(this.container),this.listsContainer=this.scrollable.container;for(const 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(const e in this.searchGroups)this.searchGroups[e].clear();this.searchPromise=null}beginSearch(e,t=0,i=""){this.peerId=e,this.threadId=t,this.query!==i&&(this.searchInput.inputField.value=i),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=r.Z.managers.appMessagesManager.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:i,history:n}=t;n.length&&n[0].mid===this.minMsgId&&n.shift();const r=this.searchGroups.messages;n.forEach((t=>{try{const i=this.peerId?t.fromId:t.peerId;s.default.addDialogAndSetLastMessage({peerId:i,container:this.scrollable,avatarSize:"bigger",meAsSaved:!1,message:t,query:e,noIcons:this.noIcons})}catch(e){console.error("[appSearch] render search result",e)}})),r.toggle(),this.minMsgId=n.length&&n[n.length-1].mid,-1===this.loadedCount&&(this.loadedCount=0),this.loadedCount+=n.length,-1===this.foundCount&&(this.foundCount=i,r.nameEl&&(0,a.Z)(r.nameEl,(0,o.ag)(i?"Chat.Search.MessagesFound":"Chat.Search.NoMessagesFound",[i])),this.onSearch&&this.onSearch(this.foundCount))})).catch((e=>{console.error("search error",e),this.searchPromise=null}))}}},6360:(e,t,i)=>{"use strict";i.d(t,{Z:()=>fe});var s=i(4277),n=i(5003),a=i(3512),o=i(5884),r=i(6008),d=i(2153),l=i(279),c=i(1405),h=i(8805),u=i(8594),p=i(2325),f=i(8497),m=i(3624),g=i(2894),v=i(4668),b=i(4332),y=i(4755),w=i(9322),S=i(4484),C=i(467),L=i(5432),E=i(1154),I=i(241),M=i(6272),P=i(3003),Z=i(4524),T=i(5128),k=i(7479),x=i(5705),A=i(6054),_=i(3910),F=i(2738),D=i(1784),R=i(8479),B=i(7401),N=i(5953),O=i(3738),U=i(4064),H=i(130),z=i(7030),j=i(2498),G=i(1336),V=i(5798),K=i(2342),W=i(2491),$=i(5400),q=i(5671),Q=i(1604),Y=i(7530),X=i(6566),J=i(177),ee=i(3061),te=i(2566),ie=i(6976),se=i(3416),ne=i(1483),ae=i(3855),oe=i(3699),re=i(296),de=i(9492),le=i(2887),ce=i(319),he=i(6131),ue=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class pe{constructor(e,t,i){this.attachTo=e,this.searchSuper=t,this.listenerSetter=i,this.onGotoClick=()=>{w.ZP.setInnerPeer({peerId:this.peerId,lastMsgId:this.mid,threadId:this.searchSuper.searchContext.threadId})},this.onForwardClick=()=>{this.searchSuper.selection.isSelecting?(0,F.tH)(this.searchSuper.selection.selectionForwardBtn):new Z.Z({[this.peerId]:[this.mid]})},this.onSelectClick=()=>{this.searchSuper.selection.toggleByElement(this.target)},this.onClearSelectionClick=()=>{this.searchSuper.selection.cancelSelection()},this.onDeleteClick=()=>{this.searchSuper.selection.isSelecting?(0,F.tH)(this.searchSuper.selection.selectionDeleteBtn):new T.Z(this.peerId,[this.mid],"chat")},this.managers=t.managers;L.Z||(0,ie.E)({element:e,callback:e=>{let i;this.init&&(this.init(),this.init=null);try{i=(0,f.Z)(e.target,"search-super-item")}catch(e){}if(i){if(e instanceof MouseEvent&&e.preventDefault(),this.element.classList.contains("active"))return!1;e instanceof MouseEvent&&(e.cancelBubble=!0),(()=>{ue(this,void 0,void 0,(function*(){this.target=i,this.peerId=i.dataset.peerId.toPeerId(),this.mid=+i.dataset.mid,this.isSelected=t.selection.isMidSelected(this.peerId,this.mid),yield Promise.all(this.buttons.map((e=>ue(this,void 0,void 0,(function*(){let t;t=!(this.isSelected&&!e.withSelection)&&(!e.verify||(yield e.verify())),e.element.classList.toggle("hide",!t)}))))),i.classList.add("menu-open"),(0,ne.Z)(e,this.element),se.Z.openBtnMenu(this.element,(()=>{i.classList.remove("menu-open")}))}))})()}},listenerSetter:i})}init(){this.buttons=[{icon:"forward",text:"Forward",onClick:this.onForwardClick,verify:()=>ue(this,void 0,void 0,(function*(){return this.managers.appMessagesManager.canForward(yield this.managers.appMessagesManager.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:()=>ue(this,void 0,void 0,(function*(){return this.managers.appMessagesManager.canDeleteMessage(yield this.managers.appMessagesManager.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=(0,P.b)({buttons:this.buttons,listenerSetter:this.listenerSetter}),this.element.classList.add("search-contextmenu","contextmenu"),document.getElementById("page-chats").append(this.element)}}class fe{constructor(e){this.tabs={},this.prevTabId=-1,this.lazyLoadQueue=new d.Z,this.middleware=(0,m.k)(),this.historyStorage={},this.usedFromHistory={},this.loadMutex=Promise.resolve(),this.nextRates={},this.loadPromises={},this.loaded={},this.loadedChats=!1,this.firstLoad=!0,this.log=(0,n.kg)("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")},(0,N.Z)(this,e),this.container=document.createElement("div"),this.container.classList.add("search-super"),this.listenerSetter=new oe.Z,this.searchContextMenu=new pe(this.container,this,this.listenerSetter),this.selection=new A.e(this,this.managers,this.listenerSetter);const t=this.navScrollableContainer=document.createElement("div");t.classList.add("search-super-tabs-scrollable","menu-horizontal-scrollable","sticky");const i=this.navScrollable=new h.v7(t);i.container.classList.add("search-super-nav-scrollable");const s=this.nav=document.createElement("nav");s.classList.add("search-super-tabs","menu-horizontal-div"),this.tabsMenu=s,i.container.append(s);for(const e of this.mediaTabs){const t=document.createElement("div");t.classList.add("menu-horizontal-div-item");const i=document.createElement("span"),s=document.createElement("i");i.append((0,p.ag)(e.name)),i.append(s),t.append(i),(0,c.Z)(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"),L.Z&&(this.swipeHandler=(0,E.Z)({element:this.tabsContainer,onSwipe:(e,t,i)=>{e*=-1;const s=this.selectTab.prevId(),n=Array.from(this.tabsMenu.children);let o;if(e>0){for(let e=s+1;e=0;--e)if(!n[e].classList.contains("hide")){o=e;break}void 0!==o&&(a=function(e){const t=e=>{(0,_.Z)(e)};let i=2;const s=()=>{--i||e.removeEventListener("touchmove",t,{capture:!0})};return e.addEventListener("touchmove",t,{capture:!0,passive:!1}),e.addEventListener("touchend",s,{once:!0}),s}(this.tabsContainer),this.selectTab(o))},verifyTouchTarget:e=>!(0,f.Z)(e.target,"scrollable-x")}));for(const e of this.mediaTabs){const t=document.createElement("div");t.classList.add("search-super-container-"+e.type,"tabs-tab");const i=document.createElement("div");i.classList.add("search-super-content-"+e.type),t.append(i),this.tabsContainer.append(t),this.tabs[e.inputFilter]=i,e.contentTab=i}this.container.append(t,this.tabsContainer),this.searchGroupMedia=new o.z(!1,"messages",!0),this.scrollable.onScrolledBottom=()=>{this.mediaTab.contentTab&&this.canLoadMediaTab(this.mediaTab)&&this.load(!0)},this.selectTab=(0,r.X)(this.tabsMenu,this.tabsContainer,((e,t,i)=>{if(this.prevTabId===e&&!this.skipScroll)return void this.scrollable.scrollIntoViewNew({element:this.container,position:"start",startCallback:this.scrollStartCallback});const s=this.mediaTabs[e];this.onChangeTab&&this.onChangeTab(s);const n=this.mediaTab;if(this.mediaTab=s,-1!==this.prevTabId&&i&&this.onTransitionStart(),this.skipScroll)this.skipScroll=!1;else{const e=this.container.offsetTop;let t=this.scrollable.scrollTop;if(tn&&(s.scroll={scrollTop:n,scrollHeight:0})}if(s.scroll){const e=n.scroll.scrollTop-s.scroll.scrollTop;e&&(s.contentTab.style.transform=`translateY(${e}px)`)}}-1===this.prevTabId||s.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,i,this.listenerSetter),(0,F.fc)(this.tabsContainer,(e=>{this.selection.isSelecting&&((0,_.Z)(e),this.selection.toggleByElement((0,f.Z)(e.target,"search-super-item")))}),{capture:!0,passive:!1,listenerSetter:this.listenerSetter});const l=(e,t,i,s)=>ue(this,void 0,void 0,(function*(){const n=(0,f.Z)(s.target,e);if(!n)return;const a=+n.dataset.mid;if(!a)return void this.log.warn("no messageId by click on target:",n);const o=n.querySelector(".media-spoiler-container");if(o)return void(0,he.kN)({event:s,mediaSpoiler:o});const r=n.dataset.peerId.toPeerId(),d=Array.from(this.tabs[i].querySelectorAll("."+t)).map((t=>{const i=(0,f.Z)(t,e);return{element:t,mid:+i.dataset.mid,peerId:i.dataset.peerId.toPeerId()}})),l=d.findIndex((e=>e.mid===a&&e.peerId===r)),c=yield this.managers.appMessagesManager.getMessageByPeer(r,a);(new D.Z).setSearchContext(this.copySearchContext(i)).openMedia(c,d[l].element,0,!1,d.slice(0,l),d.slice(l+1))}));(0,F.fc)(this.tabs.inputMessagesFilterPhotoVideo,l.bind(null,"grid-item","grid-item","inputMessagesFilterPhotoVideo"),{listenerSetter:this.listenerSetter}),(0,F.fc)(this.tabs.inputMessagesFilterDocument,l.bind(null,"document-with-thumb","media-container","inputMessagesFilterDocument"),{listenerSetter:this.listenerSetter}),this.mediaTab=this.mediaTabs[0],(0,u.ZP)((()=>{this.lazyLoadQueue.lock()}),(()=>{this.lazyLoadQueue.unlockAndRefresh()}),this.listenerSetter)}filterMessagesByType(e,t){return(0,X.Z)(t,e,e.length)}processEmptyFilter({message:e,searchGroup:t}){const i=[],n=s.default.addDialogNew({peerId:e.peerId,container:t.list,avatarSize:"bigger",loadPromises:i}),a=s.default.setLastMessageN({dialog:{_:"dialog",peerId:e.peerId},lastMessage:e,dialogElement:n,highlightWord:this.searchContext.query});return i.push(a),Promise.all(i).then(ce.Z)}processPhotoVideoFilter({message:e,promises:t,middleware:i}){return ue(this,void 0,void 0,(function*(){const s=(0,Y.Z)(e),n=document.createElement("div");let a;n.classList.add("grid-item");const o=(0,z.Z)(s,200,200);if(a="photo"!==s._?yield(yield(0,le.Z)({doc:s,message:e,container:n,boxWidth:0,boxHeight:0,lazyLoadQueue:this.lazyLoadQueue,middleware:i,onlyPreview:!0,withoutPreloader:!0,noPlayButton:!0,photoSize:o})).thumb:yield(0,de.Z)({photo:s,message:e,container:n,boxWidth:0,boxHeight:0,lazyLoadQueue:this.lazyLoadQueue,middleware:i,withoutPreloader:!0,noBlur:!0,size:o}),e.media.pFlags.spoiler){const e=yield(0,he.ZP)({animationGroup:"chat",media:s,middleware:i,width:140,height:140,multiply:.3});n.append(e)}return[a.images.thumb,a.images.full].filter(Boolean).forEach((e=>{e.classList.add("grid-item-media")})),t.push(a.loadPromises.thumb),{element:n,message:e}}))}processDocumentFilter({message:e,inputFilter:t}){return ue(this,void 0,void 0,(function*(){const i=(0,Y.Z)(e),s=this.showSender||["voice","round"].includes(i.type),n=yield(0,re.Z)({message:e,withTime:!s,fontWeight:400,voiceAsMusic:!0,showSender:s,searchContext:this.copySearchContext(t),lazyLoadQueue:this.lazyLoadQueue,autoDownloadSize:0,getSize:()=>320});return["audio","voice","round"].includes(i.type)&&n.classList.add("audio-48"),{message:e,element:n}}))}processUrlFilter({message:e,promises:t,middleware:i}){var s;return ue(this,void 0,void 0,(function*(){let n=null===(s=e.media)||void 0===s?void 0:s.webpage;if(!n){const t=e.totalEntities?e.totalEntities.find((e=>"messageEntityUrl"===e._||"messageEntityTextUrl"===e._)):null;let i,s,a;if(t)a=e.message.slice(t.offset,t.offset+t.length);else{const t=(0,K.Z)(e.message);if(!t)return;i=t[0]}i="messageEntityTextUrl"===(null==t?void 0:t._)?t.url:i||a,s=i;const o=e.message===i;i.match(/^(ftp|http|https):\/\//)||(s="https://"+i,i=i.includes("@")?i:"https://"+i),s=new URL(s).hostname,n={_:"webPage",url:i,display_url:s,id:"",hash:0},o||(n.description=e.message)}if("webPageEmpty"===n._)return;const a=document.createElement("div");a.classList.add("preview"),n.photo?(0,de.Z)({container:a,message:null,photo:n.photo,boxWidth:0,boxHeight:0,withoutPreloader:!0,lazyLoadQueue:this.lazyLoadQueue,middleware:i,size:(0,z.Z)(n.photo,60,60,!1),loadPromises:t,noBlur:!0}):(a.classList.add("empty"),(0,H.Z)(a,(0,V.Z)(n.title||n.display_url||n.description||n.url,!0)));const o=(0,G.Z)(n),r=(0,j.Z)(n),d=(0,x.Z)((0,$.ZP)(n.url||"")).firstElementChild;if(d instanceof HTMLAnchorElement)try{d.innerText=decodeURIComponent(d.href)}catch(e){}r.firstChild&&r.append("\n"),r.append(d),this.showSender&&r.append("\n",yield(0,q.Z)(e)),o.textContent||o.append((0,W.Z)(n.display_url.split("/",1)[0]));const l=new k.ZP({title:o,titleRight:(0,Q.Z)(e),subtitle:r,havePadding:!0,clickable:!0,noRipple:!0});return l.applyMediaElement(a,"big"),l.container.innerText.trim().length?{message:e,element:l.container}:void 0}))}performSearchResult(e,t,i=!0){return ue(this,void 0,void 0,(function*(){const s=[],n=t.contentTab,a=[],o=this.middleware.get();let r,d=t.inputFilter;yield(0,u.e9)(),"inputMessagesFilterPhotoVideo"===d&&this.searchContext.query.trim()?(d="inputMessagesFilterEmpty",r=this.searchGroupMedia,n.append(r.container)):"inputMessagesFilterEmpty"===d&&(r=this.searchGroups.messages);const l={elemsToAppend:s,inputFilter:d,message:void 0,middleware:o,promises:a,searchGroup:r};let c;switch(d){case"inputMessagesFilterEmpty":c=this.processEmptyFilter;break;case"inputMessagesFilterPhotoVideo":c=this.processPhotoVideoFilter;break;case"inputMessagesFilterVoice":case"inputMessagesFilterRoundVoice":case"inputMessagesFilterMusic":case"inputMessagesFilterDocument":c=this.processDocumentFilter;break;case"inputMessagesFilterUrl":c=this.processUrlFilter}if(c){c=c.bind(this);const t=e.map((e=>ue(this,void 0,void 0,(function*(){try{return l.message=e,yield c(l)}catch(t){this.log.error("error rendering filter",d,l,e,t)}})))),i=(yield Promise.all(t)).filter(Boolean);s.push(...i)}if(r&&r.list.childElementCount&&r.setActive(),this.loadMutex&&a.push(this.loadMutex),!a.length||(yield Promise.all(a),o())){if(s.length){const e=i?"append":"prepend";s.forEach((t=>{var i;const{element:s,message:n}=t,a=this.getMonthContainerByTimestamp(this.groupByMonth?n.date:0,d);s.classList.add("search-super-item"),s.dataset.mid=""+n.mid,s.dataset.peerId=""+n.peerId,a.items[e](s),(null===(i=this.selection)||void 0===i?void 0:i.isSelecting)&&this.selection.toggleElementCheckbox(s,!0)}))}this.afterPerforming("inputMessagesFilterEmpty"===d?1:s.length,n)}}))}afterPerforming(e,t){if(t){const i=t.parentElement;if(Array.from(i.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"),i.append(e)}}}loadChats(){const e=new Set,t=this.middleware.get();for(const e in this.searchGroups){const t=this.searchGroups[e];this.tabs.inputMessagesFilterEmpty.append(t.container),t.clear()}const i=this.searchContext.query;if(i){const n=(t,n,o=!1)=>{t.map((t=>{if(e.has(t))return;e.add(t);const{dom:i}=s.default.addDialogNew({peerId:t,container:n.list,avatarSize:"abitbigger",autonomous:n.autonomous});return{dom:i,peerId:t}})).filter(Boolean).forEach((({dom:e,peerId:t})=>ue(this,void 0,void 0,(function*(){const s=yield this.managers.appPeersManager.getPeer(t);if(o&&(s.participants_count||s.participants)){const s=new RegExp(`(${(0,O.Z)(i)}|${(0,O.Z)((0,C.ZP)(i))})`,"gi");e.titleSpan.innerHTML=e.titleSpan.innerHTML.replace(s,"$1"),e.lastMessageSpan.append(yield(0,J.Z)(t.toChatId()))}else if(t===a.Z.myId)e.lastMessageSpan.append((0,p.ag)("Presence.YourChat"));else{let i=yield this.managers.appPeersManager.getPeerUsername(t);if(i)i="@"+i;else{const e=yield this.managers.appUsersManager.getUser(t);e&&e.phone&&(i="+"+(0,M.u)(e.phone).formatted)}e.lastMessageSpan.textContent=i}})))),n.toggle()},o=e=>{if(t())return e};return Promise.all([this.managers.appUsersManager.getContactsPeerIds(i,!0,void 0,10).then(o).then((e=>{e&&n(e,this.searchGroups.contacts,!0)})),this.managers.appUsersManager.searchContacts(i,20).then(o).then((e=>{if(e&&(n(e.my_results,this.searchGroups.contacts,!0),n(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 p.ZP.IntlElement({key:"Separator.ShowMore"});e.append(t.element),this.searchGroups.globalContacts.nameEl.append(e),(0,F.fc)(e,(()=>{const e=this.searchGroups.globalContacts.container.classList.toggle("is-short");t.key=e?"Separator.ShowMore":"Separator.ShowLess",t.update()}))}})),this.managers.dialogsStorage.getDialogs({query:i,offsetIndex:0,limit:20,filterId:0}).then(o).then((e=>{e&&n(e.dialogs.map((e=>e.peerId)),this.searchGroups.contacts,!0)}))])}if(this.searchContext.peerId||this.searchContext.minDate)return Promise.resolve();{const e=(e=!0)=>ae.Z.getState().then((i=>{t()&&(this.searchGroups.recent.list.replaceChildren(),i.recentSearch.slice(0,20).forEach((e=>ue(this,void 0,void 0,(function*(){const{dom:t}=s.default.addDialogNew({peerId:e,container:this.searchGroups.recent.list,meAsSaved:!0,avatarSize:"abitbigger",autonomous:!0});t.lastMessageSpan.append(yield e.isUser()?(0,ee.Z)(yield this.managers.appUsersManager.getUser(e.toUserId())):(0,J.Z)(e.toChatId()))})))),i.recentSearch.length?e&&this.searchGroups.recent.setActive():this.searchGroups.recent.clear())}));return Promise.all([this.managers.appUsersManager.getTopPeers("correspondents").then((e=>{if(!t())return;const i=e.findIndex((e=>e.id===a.Z.myId));-1!==i&&(e=e.slice()).splice(i,1),e.forEach((e=>{const{dom:t}=s.default.addDialogNew({peerId:e.id,container:this.searchGroups.people.list,onlyFirstName:!0,avatarSize:"bigger",autonomous:!1,noIcons:this.searchGroups.people.noIcons});t.subtitleEl.remove()})),this.searchGroups.people.toggle()})),e()])}}loadMembers(e){return ue(this,void 0,void 0,(function*(){const t=this.searchContext.peerId.toChatId(),i=this.middleware.get();let n;const a=t=>ue(this,void 0,void 0,(function*(){if(this.loadMutex&&(yield this.loadMutex,!i()))return;let n=this.membersList;n||(n=new g.Z({lazyLoadQueue:this.lazyLoadQueue,rippleEnabled:!1,managers:this.managers}),(0,F.fc)(n.list,(e=>{const t=(0,v.Z)(e.target,s.DIALOG_LIST_ELEMENT_TAG);if(!t)return;const i=t.dataset.peerId.toPeerId();let n=Promise.resolve();y.Z.isMobile&&(n=b.ZP.toggleSidebar(!1)),n.then((()=>{w.ZP.setInnerPeer({peerId:i})}))})),e.contentTab.append(n.list),this.afterPerforming(1,e.contentTab));for(const e of t){const t=(0,te.Z)(e);if(t.isAnyChat())continue;const s=yield this.managers.appUsersManager.getUser(t);if(!i())return;s.pFlags.deleted||n.add(t)}}));if(yield this.managers.appChatsManager.isChannel(t)){const s=this.membersList?200:50;n=this.managers.appProfileManager.getChannelParticipants(t,void 0,s,this.nextRates[e.inputFilter]).then((t=>{if(!i())return;const n=e.contentTab.firstElementChild;return this.nextRates[e.inputFilter]=(n?n.childElementCount:0)+t.participants.length,t.participants.length{if(!i())return;this.loaded[e.inputFilter]=!0;const s=t.participants;return"chatParticipantsForbidden"!==s._?a(s.participants):void 0}));return this.loadPromises[e.inputFilter]=n.finally((()=>{i()&&(this.loadPromises[e.inputFilter]=null)}))}))}loadType(e,t,i,s){var n,a;const o=e.inputFilter;if(this.loadPromises[o])return this.loadPromises[o];if("members"===e.type)return this.loadMembers(e);const r=null!==(n=(a=this.historyStorage)[o])&&void 0!==n?n:a[o]=[];if(!("inputMessagesFilterEmpty"!==o||r.length||(this.loadedChats||(this.loadChats(),this.loadedChats=!0),this.searchContext.query.trim()||this.searchContext.peerId||this.searchContext.minDate)))return this.loaded[o]=!0,Promise.resolve();const d=this.loadPromises[o]=Promise.resolve().then((()=>ue(this,void 0,void 0,(function*(){var n,a;if(r.length&&this.usedFromHistory[o]this.managers.appMessagesManager.getMessageByPeer(e.peerId,e.mid))));t.push(...this.filterMessagesByType(a,o))}while(n{setTimeout((()=>{this.scrollable.checkForTriggers()}),0)}))}const l=r.length?r[r.length-1].mid:0,c=yield this.managers.appMessagesManager.getSearch(Object.assign(Object.assign({},this.searchContext),{inputFilter:{_:o},maxId:l,limit:i,nextRate:null!==(n=(a=this.nextRates)[o])&&void 0!==n?n:a[o]=0}));if(r.push(...c.history.map((e=>({mid:e.mid,peerId:e.peerId})))),s()&&((c.history.length{setTimeout((()=>{if(s()&&this.mediaTab===e){const e=this.load(!0,!0);e&&e.then((()=>{s()&&setTimeout((()=>{this.scrollable.checkForTriggers()}),0)}))}}),0)})),this.performSearchResult(this.filterMessagesByType(c.history,o),e)})))).catch((e=>{this.log.error("load error:",e)})).finally((()=>{this.loadPromises[o]=null}));return d}canLoadMediaTab(e){const t=e.inputFilter;return!this.loaded[t]||this.historyStorage[t]&&this.usedFromHistory[t]"inputMessagesFilterEmpty"!==e.inputFilter)),n=s.map((e=>({_:e.inputFilter}))),[a,o]=yield Promise.all([this.managers.appMessagesManager.getSearchCounters(t,n,void 0,i),this.canViewMembers()]);if(!e())return;if(this.loadMutex&&(yield this.loadMutex,!e()))return;let r,d=0;s.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===r&&(r=e),++d)}));const l=this.mediaTabsMap.get("members");l.menuTab.classList.toggle("hide",!o),o&&(r=l,++d),this.container.classList.toggle("hide",!r),this.container.parentElement.classList.toggle("search-empty",!r),r&&(this.skipScroll=!0,this.selectTab(this.mediaTabs.indexOf(r),!1),this.navScrollableContainer.classList.toggle("hide",d<=1))}))}load(e=!1,t=!1){var i;return ue(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(yield null!==(i=this.loadFirstTimePromise)&&void 0!==i?i:this.loadFirstTimePromise=this.loadFirstTime(),!n())return;this.loadFirstTimePromise=void 0,this.firstLoad=!1}let a=e?[this.mediaTab]:this.mediaTabs.filter((e=>e!==this.mediaTab));if(a=a.filter((e=>this.canLoadMediaTab(e))),s.isUser()&&(0,U.Z)(a,(e=>"members"===e.type)),!a.length)return;const o=t?50:Math.round(3*(I.Z.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 i;const s=new Date(1e3*e);s.setHours(0,0,0),s.setDate(1);const n=s.getTime(),a=null!==(i=this.monthContainers[t])&&void 0!==i?i:this.monthContainers[t]={};if(!(n in a)){const e=document.createElement("div");e.className="search-super-month";const i=document.createElement("div");i.classList.add("search-super-month-name");const o={month:"long"};s.getFullYear()!==(new Date).getFullYear()&&(o.year="numeric");const r=new p.ZP.IntlDateElement({date:s,options:o}).element;i.append(r),e.append(i);const d=document.createElement("div");d.classList.add("search-super-month-items"),e.append(i,d);const l=(0,B.Z)(a,"desc");let c=0;for(;cl[c]);++c);a[n]={container:e,items:d},(0,S.Z)(e,this.tabs[t],c)}return a[n]}canViewMembers(){const{peerId:e}=this.searchContext;if(!e.isAnyChat())return Promise.resolve(!1);const t=e.toChatId();return Promise.all([this.managers.appChatsManager.isBroadcast(t),this.managers.appChatsManager.hasRights(t,"view_participants"),this.managers.appChatsManager.isForum(t)]).then((([e,t,i])=>!e&&t&&(!this.searchContext.threadId||!i)))}cleanup(){var e;this.loadPromises={},this.loaded={},this.loadedChats=!1,this.nextRates={},this.firstLoad=!0,this.prevTabId=-1,this.lazyLoadQueue.clear(),this.mediaTabs.forEach((e=>{this.usedFromHistory[e.inputFilter]=-1})),(null===(e=this.selection)||void 0===e?void 0:e.isSelecting)&&this.selection.cancelSelection(),this.middleware.clean(),this.loadFirstTimePromise=void 0,this.cleanScrollPositions(),this.membersList=void 0}cleanScrollPositions(){this.mediaTabs.forEach((e=>{e.scroll=void 0}))}cleanupHTML(e=!1){this.mediaTabs.forEach((e=>{if(e.contentTab.replaceChildren(),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")||(0,l.y)(t,!0);const i=t.querySelector(".content-empty");i&&i.remove()}})),this.monthContainers={},this.searchGroupMedia.clear(),this.scrollable.scrollTop=0}copySearchContext(e){const t=(0,R.Z)(this.searchContext);return t.inputFilter={_:e},t.nextRate=this.nextRates[e],t}setQuery({peerId:e,query:t,threadId:i,historyStorage:s,folderId:n,minDate:a,maxDate:o}){this.searchContext={peerId:e,query:t||"",inputFilter:{_:this.mediaTab.inputFilter},threadId:i,folderId:n,minDate:a,maxDate:o},this.historyStorage=null!=s?s:{},this.cleanup()}destroy(){var e,t;this.cleanup(),this.listenerSetter.removeAll(),this.scrollable.destroy(),null===(e=this.swipeHandler)||void 0===e||e.removeListeners(),null===(t=this.selection)||void 0===t||t.cleanup(),this.scrollStartCallback=void 0,this.onChangeTab=void 0,this.selectTab=void 0,this.searchContextMenu=void 0,this.swipeHandler=void 0,this.selection=void 0}}},5644:(e,t,i)=>{"use strict";i.d(t,{Z:()=>A});var s=i(4277),n=i(3512),a=i(8805),o=i(4789),r=i(9807),d=i(2325),l=i(8763),c=i(8497),h=i(8842),u=i(3910),p=i(5565),f=i(5701),m=i(241),g=i(2738),v=i(6690),b=i(1655),y=i(5953),w=i(4064),S=i(9331),C=i(2353),L=i(2566),E=i(177),I=i(3061),M=i(8493),P=i(7120),Z=i(8050),T=i(36),k=i(5029),x=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class A{constructor(e){this.container=document.createElement("div"),this.list=s.default.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="abitbigger",this.exceptSelf=!1,this.tempIds={},this.selfPresence="Presence.YourChat",this.needSwitchList=!1,this.design="round",this.onInput=()=>{const e=this.input.value;if(this.query!==e){(this.peerType.includes("contacts")||this.peerType.includes("dialogs"))&&(this.cachedContacts=void 0),this.peerType.includes("dialogs")&&(this.folderId=0,this.offsetIndex=0);for(const e in this.tempIds)++this.tempIds[e];this.list=s.default.createChatList(),this.promise=void 0,this.loadedWhat={},this.query=e,this.renderedPeerIds.clear(),this.needSwitchList=!0,this.getMoreResults()}},this.checkForTriggers=()=>{this.scrollable.checkForTriggers()},(0,y.Z)(this,e),this.container.classList.add("selector","selector-"+this.design);const t=(this.renderResultsFunc||this.renderResults).bind(this);if(this.renderResultsFunc=e=>x(this,void 0,void 0,(function*(){return 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=yield(0,C.Z)(e,(e=>x(this,void 0,void 0,(function*(){if(e.isPeerId()&&(yield this.managers.appPeersManager.getPeer(e)))for(const t of this.filterPeerTypeBy)if(yield this.managers.appPeersManager[t](e))return!0;return!0}))))),t(e)})),this.input=document.createElement("input"),this.input.classList.add("selector-search-input"),this.placeholder?(0,d.$d)(this.input,this.placeholder,void 0,"placeholder"):(0,d.$d)(this.input,"SendMessageTo",void 0,"placeholder"),this.input.type="text",this.multiSelect){const e=new k.Z({});e.innerContainer.classList.add("selector-search-section");const 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 a.ZP(t),(0,g.fc)(this.selectedContainer,(e=>{if(this.freezed)return;let t=e.target;if(t=(0,c.Z)(t,"selector-user"),!t)return;const i=t.dataset.key,s=this.chatsContainer.querySelector('[data-peer-id="'+i+'"]');s?(0,g.tH)(s):this.remove(i.toPeerId())})),e.content.append(t),this.container.append(e.container)}this.chatsContainer.classList.add("chatlist-container");const i=new k.Z({name:this.sectionNameLangPackKey,noShadow:!0});i.content.append(this.list),this.chatsContainer.append(i.container),this.scrollable=new a.ZP(this.chatsContainer),this.scrollable.setVirtualContainer(this.list),(0,g.fc)(this.chatsContainer,(e=>{const t=(0,l.Z)(e.target,"data-peer-id");if((0,u.Z)(e),!t)return;if(this.freezed)return;let i=t.dataset.peerId;if(i=i.isPeerId()?i.toPeerId():i,!this.multiSelect)return void this.add(i);this.selected.has(i)?this.remove(i):this.add(i);const s=t.querySelector("input");s.checked=!s.checked}));const n=(0,f.Z)(this.onInput,200,!1,!0);this.input.addEventListener("input",n),this.scrollable.onScrolledBottom=()=>{this.getMoreResults()},this.scrollable.container.prepend((0,T.G)()),this.container.append(this.chatsContainer),this.appendTo.append(this.container),setTimeout((()=>{const t=this.getMoreResults();e.onFirstRender&&t.then((()=>{e.onFirstRender()}))}),0)}renderSaved(){return x(this,void 0,void 0,(function*(){this.exceptSelf||this.offsetIndex||0!==this.folderId||!this.peerType.includes("dialogs")||this.query&&!(yield this.managers.appUsersManager.testSelfSearch(this.query))||(yield this.renderResultsFunc([n.Z.myId]))}))}getTempId(e){var t,i;null!==(t=(i=this.tempIds)[e])&&void 0!==t||(i[e]=0);const s=++this.tempIds[e];return{tempId:s,middleware:()=>this.tempIds[e]===s}}getMoreDialogs(){return x(this,void 0,void 0,(function*(){if(this.loadedWhat.dialogs&&this.loadedWhat.archived)return;const e=m.Z.height/56*1.25|0,{middleware:t}=this.getTempId("dialogs"),i=this.managers.dialogsStorage.getDialogs({query:this.query,offsetIndex:this.offsetIndex,limit:e,filterId:this.folderId,skipMigrated:!0});i.catch((()=>{t()&&(this.loadedWhat[this.loadedWhat.dialogs?"archived":"dialogs"]=!0)}));const s=yield i;if(!t())return;let a=s.dialogs;if(a.length){const e=(0,Z.Z)(a[a.length-1])||0;if(a=a.slice(),(0,w.Z)(a,(e=>e.peerId===n.Z.myId)),this.chatRightsAction&&(a=yield(0,C.Z)(a,(e=>this.filterByRights(e.peerId))),!t()))return;if(yield this.renderSaved(),!t())return;this.offsetIndex=e}if(this.renderResultsFunc(a.map((e=>e.peerId))),s.isEnd){if(!this.loadedWhat.dialogs){if(yield this.renderSaved(),!t())return;return 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 x(this,void 0,void 0,(function*(){const t=yield this.managers.appPeersManager.getPeer(e);return e.isUser()?"send_messages"!==this.chatRightsAction||(0,M.Z)(t):!!(0,P.Z)(t,this.chatRightsAction)||void 0}))}getMoreContacts(){return x(this,void 0,void 0,(function*(){if(this.loadedWhat.contacts)return;const e=this.peerType.includes("contacts");if(!this.cachedContacts){const{middleware:t}=this.getTempId("contacts"),i=Promise.all([e?this.managers.appUsersManager.getContactsPeerIds(this.query):[],this.query?this.managers.appUsersManager.searchContacts(this.query):void 0]);i.catch((()=>{t()&&(this.loadedWhat.contacts=!0)}));const[s,a]=yield i;if(!t())return;if(a){let i=e?a.my_results.concat(a.results):a.my_results;if(this.chatRightsAction&&(i=yield(0,C.Z)(i,(e=>this.filterByRights(e))),!t()))return;this.peerType.includes("dialogs")||(i=i.filter((e=>e.isUser()))),this.cachedContacts=(0,v.Z)(s.concat(i))}else this.cachedContacts=s.slice();(0,b.Z)(this.cachedContacts,n.Z.myId)}const t=m.Z.height/56*1.25|0,i=this.cachedContacts.splice(0,t);this.renderResultsFunc(i),this.cachedContacts.length||(this.loadedWhat.contacts=!0)}))}getMoreChannelParticipants(){return x(this,void 0,void 0,(function*(){if(this.loadedWhat.channelParticipants)return;const{middleware:e}=this.getTempId("channelParticipants"),t=this.managers.appProfileManager.getChannelParticipants(this.peerId.toChatId(),{_:"channelParticipantsSearch",q:this.query},50,this.list.childElementCount);t.catch((()=>{e()&&(this.loadedWhat.channelParticipants=!0)}));const i=yield t;if(!e())return;const s=i.participants.map((e=>(0,L.Z)(e)));(0,b.Z)(s,n.Z.myId),this.renderResultsFunc(s),(this.list.childElementCount>=i.count||i.participants.length<50)&&(this.loadedWhat.channelParticipants=!0)}))}getMoreResults(){if(this.promise)return this.promise;const e=(()=>this.peerType.includes("dialogs")&&!this.loadedWhat.archived?this.getMoreSomething("dialogs"):!this.peerType.includes("contacts")&&!this.peerType.includes("dialogs")||this.loadedWhat.contacts?this.peerType.includes("channelParticipants")&&!this.loadedWhat.channelParticipants?this.getMoreSomething("channelParticipants"):void 0:this.getMoreSomething("contacts"))();if(!e)return Promise.resolve();const t=this.promise=e.catch((e=>{console.error("get more result error",e)})).finally((()=>{this.promise===t&&(this.promise=void 0),this.checkForTriggers()}));return t}getMoreSomething(e){return{dialogs:this.getMoreDialogs,contacts:this.getMoreContacts,channelParticipants:this.getMoreChannelParticipants}[e].call(this)}renderResults(e){return x(this,void 0,void 0,(function*(){!this.peerType.includes("dialogs")&&this.loadedWhat.contacts&&(e=yield(0,C.Z)(e,(e=>this.managers.appUsersManager.isNonContactUser(e)))),e.forEach((e=>x(this,void 0,void 0,(function*(){const{dom:t}=s.default.addDialogNew({peerId:e,container:this.scrollable,rippleEnabled:this.rippleEnabled,avatarSize:this.avatarSize});if(this.multiSelect){const i=this.selected.has(e),s=new r.Z;i&&(s.input.checked=!0),t.containerEl.prepend(s.label)}let i;i=e.isAnyChat()?yield(0,E.Z)(e.toChatId()):e===n.Z.myId?(0,d.ag)(this.selfPresence):(0,I.Z)(yield this.managers.appUsersManager.getUser(e.toUserId())),t.lastMessageSpan.append(i)}))))}))}add(e,t,i=!0){var s;if(this.selected.add(e),!this.multiSelect)return void this.onChange(this.selected.size);this.query.trim()&&(this.input.value="",this.onInput());const n=document.createElement("div");n.classList.add("selector-user","scale-in");const a=new S.Z;if(a.classList.add("selector-user-avatar","tgico","avatar-32"),a.isDialog=!0,n.dataset.key=""+e,e.isPeerId()){if(void 0===t){const i=new h.Z;i.update({peerId:e.toPeerId(),dialog:!0}),t=i.element}a.updateWithOptions({peerId:e})}return t&&("string"==typeof t?n.innerHTML=t:((0,p.Z)(n,t),n.append(t))),n.insertAdjacentElement("afterbegin",a),this.selectedContainer.insertBefore(n,this.input),null===(s=this.onChange)||void 0===s||s.call(this,this.selected.size),i&&this.selectedScrollable.scrollIntoViewNew({element:this.input,position:"center"}),n}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 i=()=>{this.selected.delete(e),t.remove(),this.onChange&&this.onChange(this.selected.size)};n.Z.settings.animationsEnabled?t.addEventListener("animationend",i,{once:!0}):i()}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:o.f.Static})}))}}},8448:(e,t,i)=>{"use strict";i.d(t,{ZP:()=>F,ns:()=>_});var s=i(3442),n=i(3013),a=i(4755),o=i(4762),r=i(3512),d=i(3910),l=i(2738),c=i(3725),h=i(3699),u=i(319),p=i(8497),f=i(2325),m=i(3251),g=i(632),v=i(9966),b=i(1507),y=i(4081),w=i(5296),S=i(3228),C=i(5157),L=i(7207),E=i(130),I=i(8115),M=i(5671),P=i(1604),Z=i(7530),T=i(2312),k=i(9492),x=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function A(e=!0){const t=new s.Z({cancelable:!0,tryAgainOnFail:e});return t.construct(),e||(t.circle.setAttributeNS(null,"r","23"),t.totalLength=143.58203125),t}r.Z.addEventListener("messages_media_read",(({mids:e,peerId:t})=>{e.forEach((e=>{const i=`[data-mid="${e}"][data-peer-id="${t}"]`;Array.from(document.querySelectorAll(`audio-element.is-unread${i}, .media-round.is-unread${i}`)).forEach((e=>{e.classList.remove("is-unread")}))}))}));const _=(e,t)=>{let i,s;const n=!e.classList.contains("search-super-item"),a=(0,p.Z)(e,n?"bubbles-inner":"tabs-tab");if(a){const t=':not([data-is-outgoing="1"])',o=`.audio:not(.is-voice)${t}`;let r;if(r=e.matches(o)?[o]:[`.audio.is-voice${t}`,`.media-round${t}`],n){const e=".bubble:not(.webpage) ";r=r.map((t=>e+t))}const d=r.join(", "),l=Array.from(a.querySelectorAll(d)),c=l.indexOf(e),h=l.map((e=>({peerId:e.dataset.peerId.toPeerId(),mid:+e.dataset.mid})));i=h.slice(0,c),s=h.slice(c+1)}return(s.length&&s[0].midt)&&([i,s]=[s.reverse(),i.reverse()]),[i,s]};class F extends HTMLElement{constructor(){super(...arguments),this.withTime=!1,this.voiceAsMusic=!1,this.showSender=!1,this.listenerSetter=new h.Z}render(){var e,t,i;return x(this,void 0,void 0,(function*(){this.classList.add("audio"),this.managers=r.Z.managers,this.dataset.mid=""+this.message.mid,this.dataset.peerId=""+this.message.peerId;const s=(0,Z.Z)(this.message),h="voice"===s.type,p=!this.voiceAsMusic&&h,F=this.message.pFlags.is_outgoing,D=null===(e=this.message)||void 0===e?void 0:e.uploadingFileName,R=(0,C.Z)(0|s.duration);this.innerHTML='\n
\n
\n
\n
\n
\n
';const B=this.firstElementChild,N=document.createElement("div");N.classList.add("audio-download"),"audio"!==s.type&&this.message&&this.message.pFlags.media_unread&&this.classList.add("is-unread"),D&&(this.classList.add("is-outgoing"),this.append(N));const O=yield p?function(e){return x(this,void 0,void 0,(function*(){e.classList.add("is-voice");const t=e.message,i=(0,Z.Z)(t);t.pFlags.out&&e.classList.add("is-out");let s=i.attributes.find((e=>"documentAttributeAudio"===e._)).waveform||new Uint8Array([]);s=function(e){e instanceof Uint8Array||(e=new Uint8Array(e));const t=8*e.length/5|0;if(!t)return new Uint8Array([]);let i;try{const s=new DataView(e.buffer);i=new Uint8Array(t);for(let e=0;e>n&31}}catch(e){i=new Uint8Array([])}return i}(s.slice(0,63));const{svg:n,container:o,availW:r}=function(e,t){const i=a.Z.isMobile?16:23,s=a.Z.isMobile?152:190,n=a.Z.isMobile?190:256,o=(0,S.Z)(t/60*n,s,n),r=document.createElementNS("http://www.w3.org/2000/svg","svg");r.classList.add("audio-waveform-bars"),r.setAttributeNS(null,"width",""+o),r.setAttributeNS(null,"height",""+i),r.setAttributeNS(null,"viewBox",`0 0 ${o} ${i}`);const d=Math.max(...e),l=e.length?e.length:100,c=Math.min(o/4|0,l);let h=0;const u=i-4;let p="";for(let t=0,s=0,n=0;t=l){n=n+c-l,n<(c+1)/2&&h\n `,s+=4,h=n<(c+1)/2?0:a}else h{let t=e.audio;const i=()=>{c.style.width=t.currentTime/t.duration*100+"%"};(!t.paused||t.currentTime>0&&t.currentTime!==t.duration)&&i();const s=(0,v.Z)(i);return e.addAudioListener("timeupdate",s),e.addAudioListener("ended",s),e.addAudioListener("play",(()=>{(0,w.cK)((()=>!!t&&(i(),!t.paused)),e)})),e.readyPromise.then((()=>{let e=!1,i=!1;function s(e){let i;if(e instanceof MouseEvent)i=e.offsetX;else{const t=e.target.getBoundingClientRect();i=e.targetTouches[0].pageX-t.left}const s=i/r*t.duration;t.currentTime=s}f.addEventListener("mouseleave",(s=>{e&&(t.play(),e=!1),i=!1})),f.addEventListener("mousemove",(t=>{i=!0,e&&s(t)})),f.addEventListener("mousedown",(i=>{i.preventDefault(),0===i.button&&(t.paused||t.pause(),s(i),e=!0)})),f.addEventListener("mouseup",(s=>{i&&e&&(t.play(),e=!1)})),(0,l.fc)(f,(e=>{(0,d.Z)(e),t.paused||s(e)}))}),u.Z),()=>{f.remove(),f=null,t=null}}}))}(this):function(e){var t;return x(this,void 0,void 0,(function*(){const i=e.withTime,s=e.message,n=(0,Z.Z)(s),a="voice"===n.type||"round"===n.type,o=document.createElement("div");o.classList.add("audio-description");const r=n.attributes.find((e=>"documentAttributeAudio"===e._));if(!a){const t=[];(null==r?void 0:r.performer)&&t.push((0,I.Z)(r.performer)),i?t.push((0,g.OD)(s.date)):t.length||t.push((0,y.Z)(n.size)),e.showSender&&t.push(yield(0,M.Z)(s)),o.append(...(0,f.A1)(t," โ€ข "))}e.insertAdjacentHTML("beforeend",'\n
\n
\n
\n
');const d=e.querySelector(".audio-title"),l=new m.I;l.dataset.fontWeight=e.dataset.fontWeight,l.dataset.fontSize=e.dataset.fontSize,l.dataset.sizeType=e.dataset.sizeType,l.getSize=e.getSize,a?l.append(yield(0,M.Z)(s)):(0,E.Z)(l,(0,I.Z)(null!==(t=null==r?void 0:r.title)&&void 0!==t?t:n.file_name)),d.append(l),e.showSender&&d.append((0,P.Z)(s));const c=e.querySelector(".audio-subtitle");return c.append(o),()=>{let t=!1,i=new L.Z({media:e.audio,streamable:n.supportsStreaming});e.addAudioListener("ended",(()=>{e.classList.remove("audio-show-progress"),c.lastChild.replaceWith(o),t=!1}));const s=()=>{t||(e.classList.add("audio-show-progress"),t=!0,i&&c.lastChild.replaceWith(i.container))};return e.addAudioListener("play",s),(!e.audio.paused||e.audio.currentTime>0)&&s(),()=>{i.removeListeners(),i.container.remove(),i=null}}}))}(this),U=this.querySelector(".audio-time");U.innerHTML=R;const H=this.onLoad=e=>{this.onLoad=void 0;const t=this.audio=n.Z.addMedia(this.message,e),i=this.readyPromise=(0,c.Z)();this.audio.readyState>=this.audio.HAVE_CURRENT_DATA?i.resolve():this.addAudioListener("canplay",(()=>i.resolve()),{once:!0}),this.onTypeDisconnect=O();const s=()=>(0,C.Z)(0|t.currentTime)+(p?" / "+R:""),a=()=>{U.innerText=s(),B.classList.toggle("playing",!t.paused)};(!t.paused||t.currentTime>0&&t.currentTime!==t.duration)&&a();const o=(e,i=t.paused)=>{if(e&&(0,d.Z)(e),i){const e=!!this.searchContext;if(n.Z.setSearchContext(this.searchContext||{peerId:b.NM,inputFilter:{_:"inputMessagesFilterEmpty"},useSearch:!1})){const[t,i]=e?_(this,this.message.mid):[];n.Z.setTargets({peerId:this.message.peerId,mid:this.message.mid},t,i)}t.play().catch((()=>{}))}else t.pause()};return(0,l.fc)(B,(e=>o(e)),{listenerSetter:this.listenerSetter}),this.addAudioListener("ended",(()=>{B.classList.remove("playing"),U.innerText=R})),this.addAudioListener("timeupdate",(()=>{!t.currentTime&&t.paused||n.Z.isSafariBuffering(t)||(U.innerText=s())})),this.addAudioListener("pause",(()=>{B.classList.remove("playing")})),this.addAudioListener("play",a),o};if(null===(t=s.thumbs)||void 0===t?void 0:t.length){const e=[],t=yield(0,k.Z)({photo:s,message:null,container:B,boxWidth:48,boxHeight:48,loadPromises:this.loadPromises,withoutPreloader:!0,lazyLoadQueue:this.lazyLoadQueue});B.style.width=B.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(F)D&&(this.preloader=A(!1),this.preloader.attachPromise(T.Z.getUpload(D)),this.dataset.isOutgoing="1",this.preloader.attach(N,!1));else{let e=this.preloader;const t="audio"!==s.type;H(t);const a=t=>{if(this.audio.src)return;n.Z.resolveWaitingForLoadMedia(this.message.peerId,this.message.mid,this.message.pFlags.is_scheduled);const i=()=>{t&&(n.Z.willBePlayed(this.audio),o.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=A(!1),s=(0,c.Z)();s.notifyAll({done:75,total:100}),s.catch((()=>{this.audio.pause(),n.Z.willBePlayed(void 0)})),s.cancel=()=>{s.cancel=u.Z;const e=new Error;e.type="CANCELED",s.reject(e)},t.attach(N,!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=A(),t||(this.readyPromise=(0,c.Z)());const n=()=>{i();const n=T.Z.downloadMediaURL({media:s});return t||n.then((()=>{this.readyPromise.resolve()})),e.attach(N,!1,n),{download:n}};e.setDownloadFunction(n),n()}this.classList.contains("corner-download")?B.append(N):this.append(N),this.classList.add("downloading"),this.readyPromise.then((()=>{this.classList.remove("downloading"),N.classList.add("downloaded"),setTimeout((()=>{N.remove()}),200),n.Z.willBePlayedMedia===this.audio&&(this.audio.play(),n.Z.willBePlayed(void 0))}))};(null===(i=this.audio)||void 0===i?void 0:i.src)||(t?a(!1):(0,l.fc)(B,(()=>{a(!0)}),{once:!0,capture:!0,passive:!1,listenerSetter:this.listenerSetter}))}}))}get addAudioListener(){return this.listenerSetter.add(this.audio)}disconnectedCallback(){setTimeout((()=>{this.isConnected||(this.onTypeDisconnect&&(this.onTypeDisconnect(),this.onTypeDisconnect=null),this.readyPromise&&this.readyPromise.reject(),this.listenerSetter&&(this.listenerSetter.removeAll(),this.listenerSetter=null),this.preloader&&(this.preloader=null))}),100)}}customElements.define("audio-element",F)},9331:(e,t,i)=>{"use strict";i.d(t,{Z:()=>C,C:()=>b});var s=i(3512),n=i(2738),a=i(3910),o=i(1784),r=i(6074);class d extends r.Z{constructor(e){super(Object.assign(Object.assign({},e),{loadMore:(e,t,i)=>{if(this.peerId.isAnyChat()||!t)return Promise.resolve({count:0,items:[]});const s=null==e?void 0:e.photoId;return this.managers.appPhotosManager.getUserPhotos(this.peerId,s,i).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 l=i(2312),c=i(9322),h=i(5824);class u extends h.Z{constructor(e){super(new d({peerId:e,managers:s.Z.managers}),[]),this.onPrevClick=e=>{this.openMedia(e.photoId,e.element,-1)},this.onNextClick=e=>{this.openMedia(e.photoId,e.element,1)},this.onDownloadClick=()=>{l.Z.downloadToDisc({media:this.target.photo,queueId:c.ZP.chat.bubbles.lazyLoadQueue.queueId})},this.peerId=e,this.setBtnMenuToggle([{icon:"download",text:"MediaViewer.Context.Download",onClick:this.onDownloadClick}]),this.setListeners()}openMedia(e,t,i=0,s,n){const a=Object.create(null,{_openMedia:{get:()=>super._openMedia}});return o=this,r=void 0,l=function*(){if(this.setMoverPromise)return this.setMoverPromise;const o=yield this.managers.appPhotosManager.getPhoto(e),r=a._openMedia.call(this,o,o.date,this.peerId,i,t,!1,s,n);return this.target.photoId=o.id,this.target.photo=o,r},new((d=void 0)||(d=Promise))((function(e,t){function i(e){try{n(l.next(e))}catch(e){t(e)}}function s(e){try{n(l.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof d?n:new d((function(e){e(n)}))).then(i,s)}n((l=l.apply(o,r||[])).next())}));var o,r,d,l}}var p=i(5880),f=i(9931),m=i(3624),g=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const v=({peerId:e,threadId:t})=>{let i='avatar-element[data-peer-id="'+e+'"]';t&&(i+='[data-thread-id="'+t+'"]'),Array.from(document.querySelectorAll(i)).forEach((e=>{e.update()}))};function b(e,t,i,n,a,r){return g(this,void 0,void 0,(function*(){let d=yield s.Z.managers.appProfileManager.getFullPhoto(t);if(!i()||!d)return;const l=()=>Array.from(e.querySelectorAll("img")).find((e=>!e.classList.contains("emoji")))?e:null;if(t.isAnyChat()){const e=!!n,c="inputMessagesFilterChatPhotos";if(!n&&(n=yield s.Z.managers.appMessagesManager.getSearch({peerId:t,inputFilter:{_:c},maxId:0,limit:1}).then((e=>e.history[0])),!i()))return;if(n){n.action.photo.id!==d.id&&(e||(n=s.Z.managers.appMessagesManager.generateFakeAvatarMessage(t,d)));const i=e=>e.map((e=>({element:e.element,mid:e.item.mid,peerId:e.item.peerId})));return void(new o.Z).setSearchContext({peerId:t,inputFilter:{_:c}}).openMedia(n,l(),void 0,void 0,a?i(a):void 0,r?i(r):void 0)}}if(d){!(0,p.Z)(n)&&n&&(d=yield s.Z.managers.appPhotosManager.getPhoto(n));const e=e=>e.map((e=>({element:e.element,photoId:e.item})));new u(t).openMedia(d.id,l(),void 0,a?e(a):void 0,r?e(r):void 0)}}))}s.Z.addEventListener("avatar_update",v),s.Z.addEventListener("peer_title_edit",(e=>g(void 0,void 0,void 0,(function*(){(yield s.Z.managers.appAvatarsManager.isAvatarCached(e.peerId))||v(e)}))));const y=new Map,w=new Set;function S(e,t){return e+(t?"_"+t:"")}class C extends HTMLElement{constructor(){super(),this.addedToQueue=!1,this.classList.add("avatar-like"),this.middlewareHelper=(0,m.k)()}disconnectedCallback(){var e;const t=S(this.peerId,this.threadId),i=y.get(t);(null==i?void 0:i.has(this))&&(i.delete(this),i.size||y.delete(t)),null===(e=this.lazyLoadQueue)||void 0===e||e.delete({div:this})}attachClickEvent(){let e=!1;(0,n.fc)(this,(t=>g(this,void 0,void 0,(function*(){if((0,a.Z)(t),e)return;const i=this.peerId;e=!0,yield b(this,this.peerId,(()=>this.peerId===i)),e=!1}))))}updateOptions(e){for(const t in e)this[t]=e[t]}updateWithOptions(e){var t;const i=this.peerId,s=this.threadId;this.updateOptions(e);const n=this.peerId,a=this.threadId;if(i===n&&s===a)return;if(this.dataset.peerId=""+n,a?this.dataset.threadId=""+a:s&&delete this.dataset.threadId,i){const e=S(i,s),t=y.get(e);t&&(t.delete(this),t.size||y.delete(e))}const o=null===(t=e.wrapOptions)||void 0===t?void 0:t.middleware;return this.middlewareHelper.destroy(),o?this.middlewareHelper=o.create():this.middlewareHelper.destroy(),this.update()}remove(){this.middlewareHelper.destroy(),super.remove()}r(e=!1){const t=(0,f.Z)({div:this,peerId:this.peerId,isDialog:this.isDialog,title:this.peerTitle,onlyThumb:e,isBig:this.isBig,threadId:this.threadId,wrapOptions:Object.assign({middleware:this.middlewareHelper.get()},this.wrapOptions||{})});return this.loadPromises&&(this.loadPromises.push(t),t.finally((()=>{this.loadPromises=void 0}))),t}update(){if(this.lazyLoadQueue){if(!w.has(this.peerId)){if(this.addedToQueue)return;this.addedToQueue=!0;const e=S(this.peerId,this.threadId);let t=y.get(e);return t||y.set(e,t=new Set),t.add(this),this.lazyLoadQueue.push({div:this,load:()=>(w.add(this.peerId),this.update())}),this.r(!0)}this.addedToQueue&&this.lazyLoadQueue.delete({div:this})}w.add(this.peerId);const e=this.r();this.addedToQueue&&e.finally((()=>{this.addedToQueue=!1}));const t=S(this.peerId,this.threadId),i=y.get(t);if(i){i.delete(this);const e=Array.from(i);y.delete(t);for(let t=0,i=e.length;t{"use strict";i.d(t,{Z:()=>o});var s=i(2738),n=i(1168),a=i(6765);class o{constructor(e,t){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),(0,s.fc)(this.container,(()=>{n.Z.createPopup(a.Z,t).open(this.canvas,e)}))}clear(){this.canvas.getContext("2d").clearRect(0,0,this.canvas.width,this.canvas.height)}}},4494:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(2325),n=i(1405);function a(e,t={}){const i=document.createElement(t.asLink?"a":t.asDiv?"div":"button");return i.className=e+(t.icon?" tgico-"+t.icon:""),t.noRipple||(t.rippleSquare&&i.classList.add("rp-square"),(0,n.Z)(i)),t.onlyMobile&&i.classList.add("only-handhelds"),t.disabled&&i.setAttribute("disabled","true"),t.text&&i.append((0,s.ag)(t.text)),i}},8119:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4494);const n=(e={})=>(0,s.Z)("btn-circle btn-corner z-depth-1"+(e.className?" "+e.className:""),e)},2230:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4494);const n=(e,t={})=>(0,s.Z)("btn-icon",Object.assign({icon:e||void 0},t))},3003:(e,t,i)=>{"use strict";i.d(t,{Z:()=>v,b:()=>g});var s=i(7238),n=i(3416),a=i(3910),o=i(2738),r=i(8497),d=i(130),l=i(2325),c=i(9492),h=i(8812),u=i(8222),p=i(4762),f=i(1405);function m(e){if(e.element)return[e.separator,e.element].filter(Boolean);const{icon:t,iconDoc:i,text:s,onClick:m,checkboxField:g,noCheckboxClickListener:v}=e,b=document.createElement("div");b.className="btn-menu-item rp-overflow"+(t?" tgico-"+t:""),p.IS_MOBILE&&(0,f.Z)(b);let y=e.textElement;if(y||(y=e.textElement=s?(0,l.ag)(s,e.textArgs):document.createElement("span"),e.regularText&&(0,d.Z)(y,e.regularText)),i){const t=document.createElement("span");t.classList.add("btn-menu-item-icon"),b.append(t),e.loadPromise=(0,c.Z)({container:t,photo:i,boxWidth:24,boxHeight:24,withoutPreloader:!0,noFadeIn:!0,noBlur:!0,processUrl:e=>fetch(e).then((e=>e.text())).then((e=>{const t=u.Z.getProperty("primary-text-color"),i=(new DOMParser).parseFromString(e,"image/svg+xml").firstElementChild;return i.querySelectorAll("path").forEach((e=>{e.setAttributeNS(null,"fill",t),e.style.stroke=t,e.style.strokeWidth=".25px"})),(0,h.Z)(i.outerHTML)}))}).then((e=>e.loadPromises.thumb))}y.classList.add("btn-menu-item-text"),b.append(y);const w=!!g||!!e.keepOpen;return m&&(0,o.fc)(b,(t=>{var i;(0,a.Z)(t);const s=(0,r.Z)(t.target,"btn-menu");s&&!s.classList.contains("active")||(m(t),!1!==(null===(i=e.checkForClose)||void 0===i?void 0:i.call(e))&&(w||n.Z.close(),g&&!v&&(g.checked="radio"===g.input.type||!g.checked)))}),e.options),g&&b.append(g.label),!0===e.separator&&(e.separator=document.createElement("hr")),e.multiline&&b.classList.add("is-multiline"),[e.separator,e.element=b].filter(Boolean)}function g({listenerSetter:e,buttons:t}){const i=document.createElement("div");i.classList.add("btn-menu"),e&&t.forEach((t=>{t.options?t.options.listenerSetter=e:t.options={listenerSetter:e}}));const n=t.map(m);return i.append(...(0,s.Z)(n)),i}function v(e){return t=this,i=void 0,n=function*(){const t=g(e);return yield Promise.all(e.buttons.map((({loadPromise:e})=>e))),t},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}},5322:(e,t,i)=>{"use strict";i.d(t,{Z:()=>u,v:()=>h});var s=i(3416),n=i(3910),a=i(2738),o=i(3699),r=i(2230),d=i(3003),l=i(2353),c=i(3035);function h({el:e,onOpen:t,options:i,onClose:o}){((null==i?void 0:i.listenerSetter)?i.listenerSetter.add(e):e.addEventListener.bind(e))(a.pf,(i=>{if(!e.classList.contains("btn-menu-toggle"))return!1;if((0,n.Z)(i),e.classList.contains("menu-open"))s.Z.close();else{const n=null==t?void 0:t(i),a=()=>{const t=e.querySelector(".btn-menu");s.Z.openBtnMenu(t,o)};n instanceof Promise?n.then(a):a()}}))}function u({buttonOptions:e,listenerSetter:t,container:i,direction:s,buttons:n,onOpenBefore:a,onOpen:u,onClose:p,onCloseAfter:f}){e&&(e.asDiv=!0);const m=null!=i?i:(0,r.Z)("more",e);m.classList.add("btn-menu-toggle");const g=new o.Z;let v,b;return h({el:m,onOpen:e=>{return t=this,i=void 0,r=function*(){if(yield null==a?void 0:a(e),b)return clearTimeout(b),void(b=void 0);const t=yield(i=n,(0,l.Z)(i,(e=>{var t,i;return null===(i=null===(t=null==e?void 0:e.verify)||void 0===t?void 0:t.call(e))||void 0===i||i})));var i;if(!t.length)return;const o=v=yield(0,d.Z)({buttons:t,listenerSetter:g});o.classList.add(s),yield null==u?void 0:u(e,o),m.append(o),yield(0,c.d1)()},new((o=void 0)||(o=Promise))((function(e,s){function n(e){try{d(r.next(e))}catch(e){s(e)}}function a(e){try{d(r.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof o?i:new o((function(e){e(i)}))).then(n,a)}d((r=r.apply(t,i||[])).next())}));var t,i,o,r},options:{listenerSetter:t},onClose:()=>{null==p||p(),b=window.setTimeout((()=>{null==f||f(),b=void 0,g.removeAll(),n.forEach((e=>e.element=void 0)),v.remove()}),300)}}),m}},1571:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(5296),n=i(2064);class a{constructor(){this._width=50,this._height=50,this._tails=90,this._scrollTails=50,this._curve=[0,.25,.5,.75,1,1.5,2,2.5,3,3.5,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,18.3,18.6,18.9,19.2,19.5,19.8,20.1,20.4,20.7,21,21.3,21.6,21.9,22.2,22.5,22.8,23.1,23.4,23.7,24,24.3,24.6,24.9,25.2,25.5,25.8,26.1,26.3,26.4,26.5,26.6,26.7,26.8,26.9,27],this._positions=[{x:.8,y:.1},{x:.6,y:.2},{x:.35,y:.25},{x:.25,y:.6},{x:.2,y:.9},{x:.4,y:.8},{x:.65,y:.75},{x:.75,y:.4}],this._phases=this._positions.length,this.onWheel=e=>{this._animatingToNextPosition||(this._scrollDelta+=e.deltaY,void 0===this._onWheelRAF&&(this._onWheelRAF=requestAnimationFrame(this.drawOnWheel)))},this.drawOnWheel=()=>{const e=this._scrollDelta/this._scrollTails;this._scrollDelta%=this._scrollTails;const t=e>0?Math.floor(e):Math.ceil(e);t&&this.changeTailAndDraw(t),this._onWheelRAF=void 0},this.drawNextPositionAnimated=e=>{var t;let i,s;if(e){const s=e();i=s>=1;const a=-1*(n=s)*(n-2),o=null!==(t=this._nextPositionTail)&&void 0!==t?t:0,r=(this._nextPositionTail=this._nextPositionTails*a)-o;r&&(this._nextPositionLeft-=r,this.changeTailAndDraw(r))}else{const e=this._frames;s=e.shift(),i=!e.length}var n;return s&&this.drawImageData(s),i&&(this._nextPositionLeft=void 0,this._nextPositionTails=void 0,this._nextPositionTail=void 0,this._animatingToNextPosition=void 0),!i};const e=this._tails/this._curve[this._curve.length-1];for(let t=0,i=this._curve.length;t{var s;return e-(null!==(s=i[t-1])&&void 0!==s?s:0)}))}hexToRgb(e){const t=(0,n.oo)(e);return{r:t[0],g:t[1],b:t[2]}}getPositions(e){const t=this._positions.slice();t.push(...t.splice(0,e));const i=[];for(let e=0;e({x:(e.x-s[i].x)/t,y:(e.y-s[i].y)/t})));return i.map((e=>n.map(((t,i)=>({x:s[i].x+t.x*e,y:s[i].y+t.y*e})))))}curPosition(e,t){return this.getNextPositions(e,this._tails,[t])[0]}changeTail(e){for(this._tail+=e;this._tail>=this._tails;)this._tail-=this._tails,++this._phase>=this._phases&&(this._phase-=this._phases);for(;this._tail<0;)this._tail+=this._tails,--this._phase<0&&(this._phase+=this._phases)}changeTailAndDraw(e){this.changeTail(e);const t=this.curPosition(this._phase,this._tail);this.drawGradient(t)}getGradientImageData(e){const t=this._hctx.createImageData(this._width,this._height),i=t.data;let s=0;for(let t=0;tthis.hexToRgb(e))),this._hc||(this._hc=document.createElement("canvas"),this._hc.width=this._width,this._hc.height=this._height,this._hctx=this._hc.getContext("2d",{alpha:!1})),this._canvas=e,this._ctx=this._canvas.getContext("2d",{alpha:!1}),this.update()}update(){if(this._colors.length<2){const e=this._colors[0];return this._ctx.fillStyle=`rgb(${e.r}, ${e.g}, ${e.b})`,void this._ctx.fillRect(0,0,this._width,this._height)}const e=this.curPosition(this._phase,this._tail);this.drawGradient(e)}toNextPosition(e){var t,i;if(this._colors.length<2)return;if(e)return this._nextPositionLeft=this._tails+(null!==(t=this._nextPositionLeft)&&void 0!==t?t:0),this._nextPositionTails=this._nextPositionLeft,this._nextPositionTail=void 0,this._animatingToNextPosition=!0,void(0,s.cK)(this.drawNextPositionAnimated.bind(this,e),this);const n=this._tail,a=this._tails;let o;const r=[];for(let e=0,t=this._incrementalCurve.length;ea&&void 0===o&&(o=e,s%=a),r.push(s)}[r.slice(0,o),void 0!==o?r.slice(o):[]].forEach(((e,t,i)=>{const s=e[e.length-1];if(void 0!==s&&s>a&&(e[e.length-1]=+s.toFixed(2)),this._tail=null!=s?s:0,!e.length)return;const n=this.getNextPositions(this._phase,a,e);t!==i.length-1&&++this._phase>=this._phases&&(this._phase-=this._phases);const o=n.map((e=>this.getGradientImageData(e)));this._frames.push(...o)})),this._animatingToNextPosition=!0,(0,s.cK)(this.drawNextPositionAnimated,this)}scrollAnimate(e){}cleanup(){this.scrollAnimate(!1)}static createCanvas(e){const t=document.createElement("canvas");return t.width=50,t.height=50,void 0!==e&&(t.dataset.colors=e),t}static create(e){const t=this.createCanvas(e),i=new a;return i.init(t),{gradientRenderer:i,canvas:t}}}},6054:(e,t,i)=>{"use strict";i.d(t,{e:()=>k,Z:()=>x});var s=i(5432),n=i(4494),a=i(2230),o=i(9807),r=i(5128),d=i(4524),l=i(9099),c=i(1962),h=i(6385),u=i(4762),p=i(2325),f=i(8497),m=i(8799),g=i(3910),v=i(6760),b=i(5565),y=i(8487),w=i(144),S=i(2738),C=i(5975),L=i(3241),E=i(5953),I=i(6976),M=(i(6690),i(9322)),P=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Z=e=>[...e.values()].reduce(((e,t)=>e+t.size),0);class T extends L.Z{constructor(e){super(!1),this.selectedMids=new Map,this.isSelecting=!1,this.onMouseDown=e=>{const t=(0,f.Z)(e.target,this.targetLookupClassName);if(0!==e.button)return;if(this.verifyTarget&&!this.verifyTarget(e,t))return;const i=new Map;let s,n=t;const a=(e,t=!0)=>{const o=+e.dataset.mid;if(!o||!e.dataset.peerId)return;const r=e.dataset.peerId.toPeerId();(0,y.Z)(n)||(n=e);let d=i.get(r);if(d||i.set(r,d=new Set),d.has(o))return;const l=this.isMidSelected(r,o);if(void 0===s&&(s=!l),d.add(o),s&&!l||!s&&l){const s=Z(i);if(this.toggleByElement&&t){s<2&&(0,C.Z)(e,n)&&(n=e);const t=this.getElementsBetween(n,e);t.length&&t.forEach((e=>{a(e,!1)}))}if(this.selectedMids.size)this.toggleByElement&&this.toggleByElement(e);else if(2===s&&this.toggleByMid)for(const[e,t]of i)for(const i of t)this.toggleByMid(e,i)}};let o=!1;const r=e=>{o||((0,v.Z)(),o=!0);const t=this.getElementFromTarget(e.target);if(t)return this.verifyMouseMoveTarget&&!this.verifyMouseMoveTarget(e,t,s)?(this.listenerSetter.removeManual(this.listenElement,"mousemove",r),void this.listenerSetter.removeManual(document,"mouseup",d,l)):void a(t)},d=e=>{i.size&&(0,S.fc)(window,g.Z,{capture:!0,once:!0,passive:!1}),this.listenerSetter.removeManual(this.listenElement,"mousemove",r),(0,v.Z)()},l={once:!0};this.listenerSetter.add(this.listenElement)("mousemove",r),this.listenerSetter.add(document)("mouseup",d,l)},this.getElementsBetween=(e,t)=>{if(e===t)return[];const i=e.getBoundingClientRect(),s=t.getBoundingClientRect(),n=(i.top-s.top||i.left-s.left)<0,a=(0,f.Z)(e,this.lookupBetweenParentClassName);if(!a)return[];const o=Array.from(a.querySelectorAll(this.lookupBetweenElementsQuery));let r=o.indexOf(e),d=o.indexOf(t);return n||([d,r]=[r,d]),o.slice(r+1,d)},this.cancelSelection=e=>P(this,void 0,void 0,(function*(){e&&(this.doNotAnimate=!0),this.onCancelSelection&&(yield this.onCancelSelection()),this.selectedMids.clear(),this.toggleSelection(),(0,v.Z)(),e&&(this.doNotAnimate=void 0)})),(0,E.Z)(this,e),this.navigationType="multiselect-"+(0,w.a)()}attachListeners(e,t){if(this.listenElement&&this.listenerSetter.removeAll(),this.listenElement=e,this.listenerSetter=t,e)return s.Z?(t.add(e)("touchend",(()=>{this.isSelecting&&(this.selectedText=window.getSelection?window.getSelection().toString():document.selection?document.selection.createRange().text:"")})),void(0,I.E)({element:e,callback:t=>{if(this.isSelecting||this.verifyTouchLongPress&&!this.verifyTouchLongPress())return;document.body.classList.add("no-select"),e.addEventListener("touchend",(e=>{(0,g.Z)(e),document.body.classList.remove("no-select")}),{once:!0,capture:!0}),(0,v.Z)();const i=this.getElementFromTarget(t.target);i&&this.toggleByElement(i)},listenerSetter:t})):void t.add(e)("mousedown",this.onMouseDown)}isElementShouldBeSelected(e){return this.isMidSelected(e.dataset.peerId.toPeerId(),+e.dataset.mid)}appendCheckbox(e,t){e.prepend(t.label)}toggleElementCheckbox(e,t){const i=!!this.getCheckboxInputFromElement(e);if(t){if(i)return!1;const t=new o.Z({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 i&&(this.getCheckboxInputFromElement(e).parentElement.remove(),(0,l.Z)({element:e,className:"is-selected",forwards:!1,duration:200}));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){var t;return P(this,void 0,void 0,(function*(){const i=this.selectedMids.size;if(!i&&!e)return;let s=!i,n=!i;const a=!i;for(const[e,t]of this.selectedMids){const i=`${e}_${this.isScheduled?"scheduled":"history"}`,a=yield this.managers.appMessagesManager.cantForwardDeleteMids(i,Array.from(t));if(s=a.cantForward,n=a.cantDelete,s&&n)break}null===(t=this.onUpdateContainer)||void 0===t||t.call(this,s,n,a)}))}toggleSelection(e=!0,t=!1){var i;const n=this.isSelecting,a=this.selectedMids.size;if(this.isSelecting=!!a||t,n===this.isSelecting)return!1;this.dispatchEvent("toggle",this.isSelecting),s.Z||(this.listenElement.classList.toggle("no-select",this.isSelecting),n&&(0,v.Z)()),(0,m.Z)();const o=!!a||t,r=null===(i=this.onToggleSelection)||void 0===i?void 0:i.call(this,o,!this.doNotAnimate);return u.IS_MOBILE_SAFARI||(o?h.Z.pushItem({type:this.navigationType,onPop:()=>{this.cancelSelection()}}):h.Z.removeByType(this.navigationType)),t&&(r||Promise.resolve()).then((()=>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(),(0,l.Z)({element:e,className:"is-selected",forwards:t,duration:200})}isMidSelected(e,t){const i=this.selectedMids.get(e);return null==i?void 0:i.has(t)}length(){return Z(this.selectedMids)}toggleMid(e,t,i){let s=this.selectedMids.get(e);return i||void 0===i&&(null==s?void 0:s.has(t))?s&&(s.delete(t),s.size||this.selectedMids.delete(e)):(s||(s=new Set,this.selectedMids.set(e,s)),s.add(t)),!0}deleteSelectedMids(e,t){const i=this.selectedMids.get(e);i&&(t.forEach((e=>{i.delete(e)})),i.size||this.selectedMids.delete(e),this.updateContainer(),this.toggleSelection())}}class k extends T{constructor(e,t,i){super({managers:t,verifyTarget:(e,t)=>!!t&&this.isSelecting,getElementFromTarget:e=>(0,f.Z)(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,i=e.dataset.peerId.toPeerId();this.toggleMid(i,t)&&this.updateElementSelection(e,this.isMidSelected(i,t))},this.toggleByMid=(e,t)=>{const i=this.searchSuper.mediaTab.contentTab.querySelector(`.search-super-item[data-peer-id="${e}"][data-mid="${t}"]`);this.toggleByElement(i)},this.onUpdateContainer=(e,t,i)=>{const s=this.length();(0,b.Z)(this.selectionCountEl,(0,p.ag)("messages",[s])),this.selectionGotoBtn.classList.toggle("hide",1!==s),this.selectionForwardBtn.classList.toggle("hide",e),this.selectionDeleteBtn&&this.selectionDeleteBtn.classList.toggle("hide",t)},this.onToggleSelection=(e,t)=>{if((0,l.Z)({element:this.searchSuper.navScrollableContainer,className:"is-selecting",forwards:e,duration:t?200:0,onTransitionEnd:()=>{this.isSelecting||(this.selectionContainer.remove(),this.selectionContainer=this.selectionForwardBtn=this.selectionDeleteBtn=null,this.selectedText=void 0)}}),(0,l.Z)({element:this.searchSuper.container,className:"is-selecting",forwards:e,duration:200}),this.isSelecting&&!this.selectionContainer){const e="search-super-selection";this.selectionContainer=document.createElement("div"),this.selectionContainer.classList.add(e+"-container");const t=(0,a.Z)(`close ${e}-cancel`,{noRipple:!0});(0,S.fc)(t,(()=>this.cancelSelection()),{listenerSetter:this.listenerSetter,once:!0}),this.selectionCountEl=document.createElement("div"),this.selectionCountEl.classList.add(e+"-count"),this.selectionGotoBtn=(0,a.Z)(`message ${e}-goto`);const i={listenerSetter:this.listenerSetter};(0,S.fc)(this.selectionGotoBtn,(()=>{const e=[...this.selectedMids.keys()][0],t=[...this.selectedMids.get(e)][0];this.cancelSelection(),M.ZP.setInnerPeer({peerId:e,lastMsgId:t})}),i),this.selectionForwardBtn=(0,a.Z)(`forward ${e}-forward`),(0,S.fc)(this.selectionForwardBtn,(()=>{const e={};for(const[t,i]of this.selectedMids)e[t]=Array.from(i).sort(((e,t)=>e-t));new d.Z(e,(()=>{this.cancelSelection()}))}),i),this.isPrivate&&(this.selectionDeleteBtn=(0,a.Z)(`delete danger ${e}-delete`),(0,S.fc)(this.selectionDeleteBtn,(()=>{const e=[...this.selectedMids.keys()][0];new r.Z(e,[...this.selectedMids.get(e)],"chat",(()=>{this.cancelSelection()}))}),i)),this.selectionContainer.append(...[t,this.selectionCountEl,this.selectionGotoBtn,this.selectionForwardBtn,this.selectionDeleteBtn].filter(Boolean));const s=this.selectionContainer;s.style.opacity="0",this.searchSuper.navScrollableContainer.append(s),s.offsetLeft,s.style.opacity=""}},this.isPrivate=!e.showSender,this.attachListeners(e.container,i)}toggleSelection(e=!0,t=!1){const i=super.toggleSelection(e,t);return i&&e&&Array.from(this.searchSuper.tabsContainer.querySelectorAll(".search-super-item")).forEach((e=>{this.toggleElementCheckbox(e,this.isSelecting)})),i}}class x extends T{constructor(e,t,i,s){super({managers:s,getElementFromTarget:e=>(0,f.Z)(e,"grouped-item")||(0,f.Z)(e,"bubble"),verifyTarget:(e,t)=>!(!this.selectedMids.size&&!e.target.classList.contains("bubble")&&!e.target.classList.contains("document-selection")&&t),verifyMouseMoveTarget:(e,t,i)=>!(e.target!==t&&!e.target.classList.contains("document-selection")&&void 0===i&&!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=i,this.toggleByElement=e=>{if(!this.canSelectBubble(e))return;const t=+e.dataset.mid;if(e.classList.contains("is-grouped")){if(!this.isGroupedBubbleSelected(e)){const t=this.selectedMids.get(this.chat.peerId);t&&this.getMidsFromGroupContainer(e).forEach((e=>t.delete(e)))}this.bubbles.getBubbleGroupedItems(e).map(this.toggleByElement)}else if(this.toggleMid(this.chat.peerId,t)){if(e.classList.contains("grouped-item")){const t=(0,f.Z)(e,"bubble"),i=this.isGroupedBubbleSelected(t),s=this.isGroupedMidsSelected(t);(s||i)&&this.updateElementSelection(t,s)}this.updateElementSelection(e,this.isMidSelected(this.chat.peerId,t))}},this.toggleByMid=(e,t)=>P(this,void 0,void 0,(function*(){const e=yield this.bubbles.getMountedBubble(t);e&&this.toggleByElement(e.bubble)})),this.onToggleSelection=(e,t)=>P(this,void 0,void 0,(function*(){const{needTranslateX:i,widthFrom:s,widthTo:o}=yield this.chat.input.center(t);(0,l.Z)({element:this.listenElement,className:"is-selecting",forwards:e,duration:t?200:0,onTransitionEnd:()=>{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 h=sthis.cancelSelection()),{once:!0,listenerSetter:this.listenerSetter}),this.selectionCountEl=document.createElement("div"),this.selectionCountEl.classList.add("selection-container-count"),"scheduled"===this.chat.type?(this.selectionSendNowBtn=(0,n.Z)("btn-primary btn-transparent btn-short text-bold selection-container-send",{icon:"send2"}),this.selectionSendNowBtn.append((0,p.ag)("MessageScheduleSend")),(0,S.fc)(this.selectionSendNowBtn,(()=>{new c.Z(this.chat.peerId,[...this.selectedMids.get(this.chat.peerId)],(()=>{this.cancelSelection()}))}),e)):(this.selectionForwardBtn=(0,n.Z)("btn-primary btn-transparent text-bold selection-container-forward",{icon:"forward"}),this.selectionForwardBtn.append((0,p.ag)("Forward")),(0,S.fc)(this.selectionForwardBtn,(()=>{const e={};for(const[t,i]of this.selectedMids)e[t]=Array.from(i).sort(((e,t)=>e-t));new d.Z(e,(()=>{this.cancelSelection()}))}),e)),this.selectionDeleteBtn=(0,n.Z)("btn-primary btn-transparent danger text-bold selection-container-delete",{icon:"delete"}),this.selectionDeleteBtn.append((0,p.ag)("Delete")),(0,S.fc)(this.selectionDeleteBtn,(()=>{new r.Z(this.chat.peerId,[...this.selectedMids.get(this.chat.peerId)],this.chat.type,(()=>{this.cancelSelection()}))}),e);const i=this.selectionLeft=document.createElement("div");i.classList.add("selection-container-left"),i.append(t,this.selectionCountEl);const s=this.selectionRight=document.createElement("div");s.classList.add("selection-container-right"),s.append(...[this.selectionSendNowBtn,this.selectionForwardBtn,this.selectionDeleteBtn].filter(Boolean)),void 0!==h&&(i.style.transform=`translateX(${-h}px)`,s.style.transform=`translateX(${h}px)`),this.selectionContainer.append(i,s),this.selectionInputWrapper.style.opacity="0",this.selectionInputWrapper.append(this.selectionContainer),this.input.inputContainer.append(this.selectionInputWrapper),this.selectionInputWrapper.offsetLeft,this.selectionInputWrapper.style.opacity="",i.style.transform="",s.style.transform=""}}else this.selectionLeft&&void 0!==h&&(this.selectionLeft.style.transform=`translateX(-${h}px)`,this.selectionRight.style.transform=`translateX(${h}px)`)})),this.onUpdateContainer=(e,t,i)=>{(0,b.Z)(this.selectionCountEl,(0,p.ag)("messages",[this.length()])),this.selectionSendNowBtn&&this.selectionSendNowBtn.toggleAttribute("disabled",i),this.selectionForwardBtn&&this.selectionForwardBtn.toggleAttribute("disabled",e),this.selectionDeleteBtn&&this.selectionDeleteBtn.toggleAttribute("disabled",t)},this.onCancelSelection=()=>P(this,void 0,void 0,(function*(){}))}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 i=super.toggleSelection(e,t);if(i&&e)for(const e in this.bubbles.bubbles){if(this.bubbles.skippedMids.has(+e))continue;const t=this.bubbles.bubbles[e];this.toggleElementCheckbox(t,this.isSelecting)}return i}toggleElementCheckbox(e,t){if(!this.canSelectBubble(e))return;const i=super.toggleElementCheckbox(e,t);return i&&e.classList.contains("is-grouped")&&this.bubbles.getBubbleGroupedItems(e).forEach((e=>this.toggleElementCheckbox(e,t))),i}isElementShouldBeSelected(e){const t=e.classList.contains("is-grouped");return super.isElementShouldBeSelected(e)&&(!t||this.isGroupedMidsSelected(e))}isGroupedBubbleSelected(e){const t=this.getCheckboxInputFromElement(e);return null==t?void 0:t.checked}getMidsFromGroupContainer(e){const t=this.chat.bubbles.getBubbleGroupedItems(e);return t.length||t.push(e),t.map((e=>+e.dataset.mid))}isGroupedMidsSelected(e){const t=this.getMidsFromGroupContainer(e),i=t.filter((e=>this.isMidSelected(this.chat.peerId,e)));return t.length===i.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-outgoing")||e.classList.contains("is-error")||e.classList.contains("bubble-first")||e.classList.contains("avoid-selection"))}}},9807:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(1405),n=i(2325),a=i(9750),o=i(3512),r=i(3855);class d{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),this.listenerSetter=e.listenerSetter;const i=this.input=document.createElement("input");if(i.classList.add("checkbox-field-input"),i.type="checkbox",e.name&&(i.id="input-"+e.name),e.checked&&(i.checked=!0),e.stateKey){let t=!1;const s=()=>{if(!t)return;let s;s=e.stateValues?e.stateValues[i.checked?1:0]:i.checked,o.Z.managers.appStateManager.setByKey(e.stateKey,s)};r.Z.getState().then((i=>{t=!0;const s=(0,a.Z)(i,e.stateKey);let n;n=e.stateValues?1===e.stateValues.indexOf(s):s,this.setValueSilently(n)})),e.listenerSetter?e.listenerSetter.add(i)("change",s):i.addEventListener("change",s)}let d;if(e.text?(d=this.span=document.createElement("span"),d.classList.add("checkbox-caption"),(0,n.$d)(d,e.text,e.textArgs)):t.classList.add("checkbox-without-caption"),t.append(i),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 i=document.createElementNS("http://www.w3.org/2000/svg","svg");i.classList.add("checkbox-box-check"),i.setAttributeNS(null,"viewBox","0 0 24 24");const s=document.createElementNS("http://www.w3.org/2000/svg","use");s.setAttributeNS(null,"href","#check"),s.setAttributeNS(null,"x","-1"),i.append(s);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,i),t.append(e)}d&&t.append(d),e.withRipple?(t.classList.add("checkbox-ripple","hover-effect"),(0,s.Z)(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)}}},4489:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(503);class n extends s.ZP{constructor(e){super(Object.assign(e,{plainText:!0})),this.options=e;const t=this.input;t.type="tel",t.setAttribute("required",""),t.autocomplete="off";let i=0;this.input.addEventListener("input",(t=>{this.input.classList.remove("error"),this.setLabel();const s=this.value.replace(/\D/g,"").slice(0,e.length);this.setValueSilently(s);const n=this.value.length;if(n===e.length)e.onFill(this.value);else if(n===i)return;i=n}))}}},5592:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(1168),n=i(8127);function a(e){return new Promise(((t,i)=>{var a;const{button:o,checkbox:r}=e;o.callback=i=>{t(r||!i?i?!!i.size:void 0:e.checkboxes.map((e=>i.has(e.text))))};const d=(0,s.x)(e.buttons||[o]),l=d.find((e=>e.isCancel));l.callback=()=>{i()},e.buttons=d,null!==(a=e.checkboxes)&&void 0!==a||(e.checkboxes=r&&[r]),new n.Z("popup-confirmation",e).show()}))}},5431:(e,t,i)=>{"use strict";i.d(t,{Z:()=>S});var s=i(9976),n=i(3910),a=i(8497),o=i(4668),r=i(5565),d=i(130),l=i(4789),c=i(144),h=i(2325),u=i(8115),p=i(3512),f=i(671),m=i(503),g=i(8805);let v;const b=()=>{v=h.ZP.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 y=()=>{b(),p.Z.addEventListener("language_change",(()=>{b()}))};const w=new Set(["FT"]);class S extends m.ZP{constructor(e={}){super(Object.assign({label:"Country",name:(0,c.a)()},e)),this.options=e,this.hidePicker=()=>{void 0===this.hideTimeout&&(this.selectWrapper.classList.remove("active"),this.hideTimeout=window.setTimeout((()=>{this.selectWrapper.classList.add("hide"),this.hideTimeout=void 0}),200))},this.selectCountryByTarget=e=>{var t,i;const s=e.querySelector("[data-default-name]").dataset.defaultName,n=e.querySelector(".phone-code"),a=null==n?void 0:n.innerText,o=a&&a.replace(/\D/g,"");(0,r.Z)(this.input,(0,h.ag)(s)),this.simulateInputEvent(),this.lastCountrySelected=v.find((e=>e.default_name===s)),this.lastCountryCodeSelected=o&&this.lastCountrySelected.country_codes.find((e=>e.country_code===o)),null===(i=(t=this.options).onCountryChange)||void 0===i||i.call(t,this.lastCountrySelected,this.lastCountryCodeSelected),this.hidePicker()},y&&(y(),y=void 0),this.liMap=new Map,this.container.classList.add("input-select");const t=this.selectWrapper=document.createElement("div");t.classList.add("select-wrapper","z-depth-3","hide");const i=document.createElement("span");i.classList.add("arrow","arrow-down"),this.container.append(i);const p=document.createElement("ul");t.appendChild(p),new g.ZP(t);let m=()=>{m=null,v.forEach((t=>{if(e.noPhoneCodes&&w.has(t.iso2))return;const i=(0,f.Ml)(t.iso2),n=[];for(let a=0,o=Math.min(t.country_codes.length,e.noPhoneCodes?1:1/0);a{if(0!==e.button)return;const t=(0,o.Z)(e.target,"LI");this.selectCountryByTarget(t)})),this.container.appendChild(t)};m(),this.input.addEventListener("focus",(e=>{m?m():v.forEach((e=>{const t=this.liMap.get(e.iso2);t&&t.forEach((e=>e.style.display=""))})),clearTimeout(this.hideTimeout),this.hideTimeout=void 0,t.classList.remove("hide"),t.offsetWidth,t.classList.add("active"),this.select(),(0,l.Z)({container:(0,a.Z)(this.container,"scrollable-y"),element:this.input,position:"start",margin:4}),setTimeout((()=>{b||(document.addEventListener("mousedown",S,{capture:!0}),b=!0)}),0)}));let b=!1;const S=e=>{(0,a.Z)(e.target,"input-select")||e.target!==this.input&&(this.hidePicker(),document.removeEventListener("mousedown",S,{capture:!0}),b=!1)},C=e=>{const t=e.key;if(e.ctrlKey||"Control"===t)return!1;const i=this.value.toLowerCase(),s=[];v.forEach((e=>{const t=this.liMap.get(e.iso2);if(!t)return;const n=[e.name,e.default_name,e.iso2];n.filter(Boolean).forEach((e=>{const t=e.split(" ").filter((e=>/\w/.test(e))).map((e=>e[0])).join("");t.length>1&&n.push(t)}));const a=!!n.filter(Boolean).find((e=>-1!==e.toLowerCase().indexOf(i)));t.forEach((e=>e.style.display=a?"":"none")),a&&s.push(e)})),0===s.length?v.forEach((e=>{const t=this.liMap.get(e.iso2);t&&t.forEach((e=>e.style.display=""))})):1===s.length&&"Enter"===t&&((0,n.Z)(e),this.selectCountryByTarget(this.liMap.get(s[0].iso2)[0]))};this.input.addEventListener("keyup",C),this.input.addEventListener("keydown",(e=>{"Enter"===e.key&&C(e)})),i.addEventListener("mousedown",(e=>{this.input.matches(":focus")?(this.hidePicker(),this.input.blur()):(e.cancelBubble=!0,e.preventDefault(),this.input.focus())}))}getSelected(){return{country:this.lastCountrySelected,code:this.lastCountryCodeSelected}}selectCountryByIso2(e){this.selectCountryByTarget(this.liMap.get(e)[0])}override(e,t,i){var s,n;(0,r.Z)(this.input,e?(0,h.ag)(e.default_name):i),this.lastCountrySelected=e,this.lastCountryCodeSelected=t,null===(n=(s=this.options).onCountryChange)||void 0===n||n.call(s,this.lastCountrySelected,this.lastCountryCodeSelected)}}},6628:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(4762),n=i(5296),a=i(3228),o=i(5814);class r{constructor(e,t,i){this.width=e,this.height=t,this.multiply=i;const s=this.canvas=document.createElement("canvas"),n=this.dpr=window.devicePixelRatio;s.width=e*n,s.height=t*n,s.classList.add("canvas-thumbnail","canvas-dots"),this.paused=!0,this.autoplay=!0,this.tempId=0,this.context=s.getContext("2d")}prepare(){let e=Math.round(this.width*this.height/(35*(s.IS_MOBILE?2:1)));e*=this.multiply||1,e=Math.min(s.IS_MOBILE?1e3:2200,e),e=Math.round(e);const t=this.dots=new Array(e);for(let i=0;i=.8?1:.5)*this.dpr,a=new Path2D;return a.arc(t,i,n,0,2*Math.PI,!1),{x:t,y:i,opacity:s,radius:n,mOpacity:s,adding:null!=e?e:Math.random()>=.5,counter:0,path:a}}draw(){const{context:e,canvas:t,dots:i}=this;e.clearRect(0,0,t.width,t.height),e.fillStyle="#fff";for(let t=0,s=i.length;t=1&&(i[t]=this.generateDot(s.adding))):s.mOpacity>=1&&(s.adding=!1)}}remove(){this.pause()}pause(){this.paused||(this.paused=!0,++this.tempId)}renderFirstFrame(){this.dots||this.prepare(),this.draw()}play(){if(!this.paused)return;this.paused=!1;const e=++this.tempId;this.dots||this.prepare(),(0,n.jt)((()=>this.tempId===e&&!this.paused&&(this.draw(),!0)))}static create({width:e,height:t,middleware:i,animationGroup:s,multiply:n}){const a=new r(e,t,n);return a.renderFirstFrame(),o.Z.addAnimation(a,s,a.canvas,i),a}}},2621:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(187),n=i(9331),a=i(8119),o=i(5953),r=i(1507);class d{constructor(e){this._disabled=!1,this.avatarSize=120,this.isChanged=()=>{if(this.uploadAvatar)return!0;let e=0,t=0,i=0;return this.inputFields.forEach((s=>{s.isValid()&&(s.isChanged()&&++e,s.required&&++i),s.required&&++t})),t===i&&e>0},this.handleChange=()=>{this.nextBtn.classList.toggle("is-visible",this.isChanged())},(0,o.Z)(this,e),this.peerId||(this.peerId=r.NM),this.nextBtn?this.nextBtn.classList.contains("btn-corner")||(this.handleChange=()=>{this.nextBtn.toggleAttribute("disabled",!this.isChanged()||this.disabled)}):this.nextBtn=(0,a.Z)({icon:"check"}),e.withoutAvatar||(this.avatarElem=new n.Z,this.avatarElem.classList.add("avatar-placeholder","avatar-"+this.avatarSize),this.avatarElem.updateWithOptions({peerId:this.peerId}),e.doNotEditAvatar||(this.avatarEdit=new s.Z((e=>{this.uploadAvatar=e,this.handleChange(),this.avatarElem.remove()}),e.popupOptions),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}))}}},3173:(e,t,i)=>{"use strict";i.d(t,{Yd:()=>Y,Jo:()=>J,ZP:()=>te});var s=i(5432),n=i(9322),a=i(3512),o=i(5814),r=i(6008),d=i(2153),l=i(4332),c=i(5117),h=i(6039),u=i(1080),p=i(8805),f=i(279),m=i(2738);class g{constructor(e){this.managers=e}init(){this.content=document.getElementById("content-gifs");const e=this.content.firstElementChild;(0,m.fc)(e,J.onMediaClick);const t=this.scrollable=new p.ZP(this.content,"GIFS"),i=new u.Z(e,Y,t),s=(0,f.y)(this.content,!0);this.managers.appDocsManager.getGifs().then((e=>{e.forEach((e=>{i.add(e)})),s.remove()})),te.addLazyLoadQueueRepeat(i.lazyLoadQueue,i.processInvisibleDiv),this.init=null}onClose(){}}var v=i(6057),b=i(410),y=i(3552),w=i(3607),S=i(4755),C=i(8497),L=i(1507),E=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const I="GIFS-SEARCH";class M extends y._{constructor(){super(...arguments),this.nextOffset="",this.loadedAll=!1,this.onGifsClick=e=>E(this,void 0,void 0,(function*(){const t=(0,C.Z)(e.target,"gif");if(!t)return;const i=t.dataset.docId;(yield n.ZP.chat.input.sendMessageWithDocument(i))?S.Z.isMobile&&l.ZP.onCloseBtnClick():console.warn("got no doc by id:",i)}))}init(){this.container.id="search-gifs-container",this.inputSearch=new w.Z("SearchGifsTitle",(e=>{this.reset(),this.search(e)})),this.title.replaceWith(this.inputSearch.container),this.gifsDiv=document.createElement("div"),this.gifsDiv.classList.add("gifs-masonry"),(0,m.fc)(this.gifsDiv,this.onGifsClick,{listenerSetter:this.listenerSetter}),this.scrollable.append(this.gifsDiv),this.masonry=new u.Z(this.gifsDiv,I,this.scrollable),l.ZP.toggleSidebar(!0).then((()=>{this.search("",!0),this.scrollable.onScrolledBottom=()=>{this.search(this.inputSearch.value,!1)}}))}onClose(){this.scrollable.onScrolledBottom=()=>{}}onCloseAfterTimeout(){return this.reset(),this.gifsDiv.innerHTML="",o.Z.checkAnimations(void 0,I),this.inputSearch.remove(),super.onCloseAfterTimeout()}reset(){this.searchPromise=null,this.nextOffset="",this.loadedAll=!1,this.masonry.clear()}search(e,t=!0){return E(this,void 0,void 0,(function*(){if(!this.searchPromise&&!this.loadedAll){this.gifBotPeerId||(this.gifBotPeerId=(yield this.managers.appUsersManager.resolveUsername("gif")).id.toPeerId(!1));try{this.searchPromise=this.managers.appInlineBotsManager.getInlineResults(L.NM,this.gifBotPeerId,e,this.nextOffset);const{results:i,next_offset:s}=yield this.searchPromise;if(this.inputSearch.value!==e)return;this.searchPromise=null,this.nextOffset=s,t&&(this.gifsDiv.innerHTML=""),i.length?i.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}}}))}}var P=i(6787),Z=i(2325),T=i(7625),k=i(130),x=i(8115),A=i(9259),_=i(3541);class F extends y._{init(){this.container.id="stickers-container",this.container.classList.add("chatlist-container"),this.lazyLoadQueue=new d.Z,this.inputSearch=new w.Z("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),(0,A.Z)({listenTo:this.setsDiv,listenerSetter:this.listenerSetter}),(0,m.fc)(this.setsDiv,(e=>{const t=(0,C.Z)(e.target,"sticker-set-sticker");if(t){const e=t.dataset.docId;return void n.ZP.chat.input.sendMessageWithDocument(e)}const i=(0,C.Z)(e.target,"sticker-set");if(!i)return;const s=i.dataset.stickerSet,a=i.dataset.access_hash,o=(0,C.Z)(e.target,"sticker-set-button");o?(e.preventDefault(),e.cancelBubble=!0,o.setAttribute("disabled","true"),this.managers.appStickersManager.getStickerSet({id:s,access_hash:a}).then((e=>{this.managers.appStickersManager.toggleStickerSet(e.set).then((t=>{t&&(o.textContent="",o.append((0,Z.ag)(e.set.installed_date?"Stickers.SearchAdded":"Stickers.SearchAdd")),o.classList.toggle("gray",!!e.set.installed_date))})).finally((()=>{o.removeAttribute("disabled")}))}))):this.managers.appStickersManager.getStickerSet({id:s,access_hash:a}).then((e=>{new P.Z(e.set).show()}))}),{listenerSetter:this.listenerSetter}),l.ZP.toggleSidebar(!0).then((()=>{this.renderFeatured()}))}onCloseAfterTimeout(){return this.setsDiv.innerHTML="",o.Z.checkAnimations(void 0,"STICKERS-SEARCH"),super.onCloseAfterTimeout()}renderSet(e){const t=document.createElement("div");t.classList.add("sticker-set");const i=document.createElement("div");i.classList.add("sticker-set-header");const s=document.createElement("div");s.classList.add("sticker-set-details"),s.innerHTML='
',(0,k.Z)(s.firstElementChild,(0,x.Z)(e.title));const n=document.createElement("div");n.classList.add("sticker-set-count"),n.append((0,Z.ag)("Stickers",[e.count])),s.append(n);const a=document.createElement("button");a.classList.add("btn-primary","btn-color-primary","sticker-set-button"),a.append((0,Z.ag)(e.installed_date?"Stickers.SearchAdded":"Stickers.SearchAdd")),e.installed_date&&a.classList.add("gray"),i.append(s,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.inputSearch.value||(e=this.filterRendered("",e)).forEach((e=>{this.renderSet(e.set)}))}))}filterRendered(e,t){t=t.slice();const i=Array.from(this.setsDiv.children);return(0,T.Z)(i,(i=>{const s=i.dataset.stickerSet,n=t.findIndex((e=>e.set.id===s));-1!==n?t.splice(n,1):e&&i.dataset.title.toLowerCase().includes(e.toLowerCase())||i.remove()})),o.Z.checkAnimations(void 0,"STICKERS-SEARCH"),t}search(e){return e?this.managers.appStickersManager.searchStickerSets(e,!1).then((t=>{this.inputSearch.value===e&&(t=this.filterRendered(e,t)).forEach((e=>{this.renderSet(e.set)}))})):this.renderFeatured()}}var D,R=i(4668),B=i(8799),N=i(2648),O=i(3910),U=i(6339),H=i(5418),z=i(4762),j=i(3815),G=i(319),V=i(4789),K=i(6802),W=i.n(K),$=i(669),q=i(3299),Q=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Y="emoticons-dropdown",X={forceDuration:200,transitionFunction:W()(.42,0,.58,1)};class J extends U.Z{constructor(){super({element:document.getElementById("emoji-dropdown"),ignoreOutClickClassName:"input-message-input"}),this.tabId=-1,this.onSelectTabClick=e=>{if(this.tabId!==e)o.Z.checkAnimations(!0,Y),this.tabId=e,this.searchButton.classList.toggle("hide",this.tabId===this.emojiTab.tabId),this.deleteBtn.classList.toggle("hide",this.tabId!==this.emojiTab.tabId);else{const{tab:e}=this;this.scrollTo(e,e.scrollable.container.firstElementChild)}},this.checkRights=()=>Q(this,void 0,void 0,(function*(){const{peerId:e,threadId:t}=n.ZP.chat,i=this.tabsEl.children,s=Array.from(i),[a,o]=yield Promise.all([this.managers.appMessagesManager.canSendToPeer(e,t,"send_stickers"),this.managers.appMessagesManager.canSendToPeer(e,t,"send_gifs")]);s[this.stickersTab.tabId+1].toggleAttribute("disabled",!a),s[this.gifsTab.tabId+1].toggleAttribute("disabled",!o);const r=this.tabsEl.querySelector(".active");!r||(0,N.Z)(r)===this.emojiTab.tabId+1||a&&o||this.selectTab(this.emojiTab.tabId,!1)})),this.addEventListener("open",(()=>Q(this,void 0,void 0,(function*(){var e;s.Z&&(0,B.Z)()&&(yield(0,H.Z)(100)),this.element.parentElement!==n.ZP.chat.input.chatInput&&n.ZP.chat.input.chatInput.append(this.element),this.savedRange=this.getGoodRange(),J.lazyLoadQueue.lock(),o.Z.lockIntersectionGroup(Y);const t=this.tab;null===(e=t.onOpen)||void 0===e||e.call(t)})))),this.addEventListener("opened",(()=>{var e;o.Z.unlockIntersectionGroup(Y),J.lazyLoadQueue.unlockAndRefresh();const t=this.tab;null===(e=t.onOpened)||void 0===e||e.call(t)})),this.addEventListener("close",(()=>{var e;J.lazyLoadQueue.lock(),o.Z.lockIntersectionGroup(Y),o.Z.checkAnimations(!0,Y);const t=this.tab;null===(e=t.onClose)||void 0===e||e.call(t)})),this.addEventListener("closed",(()=>{var e;o.Z.unlockIntersectionGroup(Y),J.lazyLoadQueue.unlock(),J.lazyLoadQueue.refresh(),this.savedRange=void 0;const t=this.tab;null===(e=t.onClosed)||void 0===e||e.call(t)}))}get tab(){return this.tabs[this.tabId]}init(){this.managers=a.Z.managers,this.emojiTab=new h.ZP({managers:this.managers}),this.stickersTab=new v.ZP(this.managers),this.gifsTab=new g(this.managers),this.tabs={},[this.emojiTab,this.stickersTab,this.gifsTab].forEach(((e,t)=>{e.tabId=t,this.tabs[t]=e})),this.container=this.element.querySelector(".emoji-container .tabs-container"),this.container.prepend(this.emojiTab.container,this.stickersTab.container),this.tabsEl=this.element.querySelector(".emoji-tabs"),this.selectTab=(0,r.X)(this.tabsEl,this.container,this.onSelectTabClick,(()=>{var e;const{tab:t}=this;null===(e=t.init)||void 0===e||e.call(t),o.Z.checkAnimations(!1,Y)})),this.searchButton=this.element.querySelector(".emoji-tabs-search"),this.searchButton.addEventListener("click",(()=>{this.tabId===this.stickersTab.tabId?l.ZP.isTabExists(F)||l.ZP.createTab(F).open():l.ZP.isTabExists(M)||l.ZP.createTab(M).open()})),this.deleteBtn=this.element.querySelector(".emoji-tabs-delete"),(0,m.fc)(this.deleteBtn,(e=>{(0,O.Z)(e);const t=n.ZP.chat.input.messageInput;let i=$.Z.getInstance().getSavedRange(t);i||(i=document.createRange(),i.setStartAfter(t.lastChild));const s=i.cloneRange();if(i.collapsed){const{node:e,offset:n}=(0,q.q)(t,i.endContainer,i.endOffset);let a;if(n)a=e;else{if(a=e.previousSibling,!a)return;for(;a.nodeType===a.TEXT_NODE&&!a.nodeValue&&(a=a.previousSibling););if(a.nodeType===a.ELEMENT_NODE&&!a.isContentEditable)return}if(a.nodeType===a.ELEMENT_NODE&&"IMG"===a.tagName)s.selectNode(a);else{const e=[...a.textContent];let t;if(n){let i=0;t=e.find((e=>(i+=e.length,i>=n)))}else t=e.pop()||"";const i=n?n-t.length:a.textContent.length-t.length;s.setStart(a,i)}}s.deleteContents(),n.ZP.chat.input.messageInputField.simulateInputEvent()}));const e=z.IS_APPLE_MOBILE&&!1,t=e?this.stickersTab.tabId:this.emojiTab.tabId;if(e&&this.tabsEl.children[1].classList.add("hide"),(0,m.tH)(this.tabsEl.children[t+1]),this.tabs[t].init&&this.tabs[t].init(),!s.Z){let e,t=!1;const i=t=>{e=t};j.Z.addEventListener("change",(s=>{s?t||(document.body.addEventListener("mousemove",i),t=!0):t&&(document.body.removeEventListener("mousemove",i),e&&this.onMouseOut(e))}))}return n.ZP.addEventListener("peer_changing",(()=>{this.toggle(!1)})),n.ZP.addEventListener("peer_changed",this.checkRights),this.checkRights(),super.init()}getElement(){return this.element}scrollTo(e,t){e.scrollable.scrollIntoViewNew(Object.assign({element:t,axis:"y",position:"start"},X))}static sendDocId(e,t,i){return Q(this,void 0,void 0,(function*(){return(yield n.ZP.chat.input.sendMessageWithDocument(e,void 0,t,i))?(ee.container&&(ee.forceClose=!0,ee.toggle(!1)),!0):(console.warn("got no doc by id:",e),!1)}))}addLazyLoadQueueRepeat(e,t){this.addEventListener("close",(()=>{e.lock()})),this.addEventListener("closed",(()=>{const i=e.intersector.getVisible();for(const e of i)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===n.ZP.chat.input.messageInput)return e.getRangeAt(0)}}D=J,J.lazyLoadQueue=new d.Z(1),J.menuOnClick=(e,t,i,s,n,a)=>{let o=-1;const r=(e,t=!0)=>{if(e===n)return!1;let i=!1;return n&&(n.elements.menuTab.classList.remove("active"),n.menuScroll&&n.menuScroll!==e.menuScroll&&(i=!0,n.menuScroll.container.parentElement.classList.remove("active"),n.menuScroll.scrollIntoViewNew(Object.assign({element:n.menuScroll.container.firstElementChild,forceDirection:t?void 0:V.f.Static,position:"center",axis:"x"},X)))),e.elements.menuTab.classList.add("active"),e.menuScroll&&(e.menuScroll.container.parentElement.classList.add("active"),t&&s.scrollIntoViewNew(Object.assign({element:e.menuScroll.container.parentElement,position:"center",axis:"x"},X))),n&&((e,t)=>{const i=e.menuScroll||s;i&&i.scrollIntoViewNew(Object.assign({element:e.elements.menuTab,position:"center",axis:"x",getElementPosition:t?({elementPosition:e})=>e-106:void 0},X))})(e,i),n=e,!0};let d=!1;const l=new c.Z(i.container,((t,s)=>{if(d)return;if(Math.abs(o-i.container.scrollTop)<=1)return;o=-1;const n=e.getCategoryByContainer(s),a=(0,N.Z)(s);(t||!a&&!n.menuScroll)&&r(n)}));(0,m.fc)(t,(t=>{let s=(0,C.Z)(t.target,"menu-horizontal-div-item");if(!s){if(s=(0,C.Z)(t.target,"menu-horizontal-inner"),!s||s.classList.contains("active"))return;s=s.firstElementChild.firstElementChild}const n=(0,N.Z)(s),a=e.getCategoryByMenuTab(s);r(a);let l=0,c=0;if(n>0||a.menuScroll){const e=a.elements.container;c=1,l=e.offsetTop+c}o=l,d=!0,i.scrollIntoViewNew(Object.assign({element:l?a.elements.container:i.container.firstElementChild,position:"start",axis:"y",getElementPosition:l?({elementPosition:e})=>e+c:void 0},X)).finally((()=>{r(a),d=!1}))}),{listenerSetter:a});const h=i.onAdditionalScroll?i.onAdditionalScroll.bind(i):G.Z;return i.onAdditionalScroll=()=>{e.content.parentElement.classList.toggle("scrolled-top",!i.scrollTop),h()},{stickyIntersector:l,setActive:r,setActiveStatic:t=>{if(null==n?void 0:n.local)return;e.scrollable.scrollTop=t.elements.container.offsetTop+1;const i=e.menuScroll.container,s=t.elements.menuTab;i.scrollLeft=s.offsetLeft-i.clientWidth/2+s.offsetWidth/2,r(t,!1)}}},J.onMediaClick=(e,t=!1,i)=>Q(void 0,void 0,void 0,(function*(){const s=(0,R.Z)(e.target,"DIV");if(!s)return!1;const n=s.dataset.docId;return!!n&&D.sendDocId(n,t,i)}));const ee=new J;b.GO.emoticonsDropdown=ee;const te=ee},6039:(e,t,i)=>{"use strict";i.d(t,{IA:()=>F,ZP:()=>j,xG:()=>D});var s=i(3173),n=i(3910),a=i(8497),o=i(3035),r=i(5418),d=i(9322),l=i(3512),c=i(671),h=i(279),u=i(8805),p=i(9976),f=i(5432),m=i(8799),g=i(3447),v=i(7746),b=i(8115),y=i(7197),w=i(5400),S=i(2738),C=i(6057),L=i(9405),E=i(2940),I=i(4755),M=i(1273),P=i(9259),Z=i(4064),T=i(4484),k=i(6787),x=i(2796),A=i(5953);const _=new Set;function F(e,t,i=!1,s=!1){var n;const a=document.createElement("span");let r;if(a.classList.add("super-emoji"),s&&!p.Z?r=function(e){return(0,w.ZP)(e,{entities:[(0,y.Z)(e)]})}(e):(e=(0,v.Z)(e),r=(0,b.Z)(e)),a.append(r),a.children.length>1){const e=a.firstElementChild;a.innerHTML="",a.append(e)}if("IMG"===(null===(n=a.firstElementChild)||void 0===n?void 0:n.tagName)){const e=a.firstElementChild,t=e.src;if(!_.has(t)){e.setAttribute("loading","lazy");const i=document.createElement("span");i.classList.add("emoji-placeholder"),l.Z.settings.animationsEnabled&&(e.style.opacity="0",i.style.opacity="1"),e.addEventListener("load",(()=>{(0,o.T2)((()=>{l.Z.settings.animationsEnabled&&(e.style.opacity="",i.style.opacity=""),a.classList.remove("empty"),_.add(t)}))}),{once:!0}),a.append(i)}}return t&&(i?t.prepend(a):t.appendChild(a)),a}function D(e){const t=(0,a.Z)(e,"super-emoji");if(!t)return;const i=t.firstElementChild;return i&&i.classList.contains("custom-emoji")?{emoji:i.dataset.stickerEmoji,docId:i.dataset.docId}:e.nodeType===e.TEXT_NODE?{emoji:e.nodeValue}:("SPAN"===e.tagName&&!e.classList.contains("emoji")&&e.firstElementChild&&(e=e.firstElementChild),{emoji:e.getAttribute("alt")||e.innerText})}const R="Emoji.Recent",B=[R,"recent"],N=["",""],O=[["Emoji.SmilesAndPeople","smile"],["Emoji.AnimalsAndNature","animals"],["Emoji.FoodAndDrink","eats"],["Emoji.TravelAndPlaces","car"],["Emoji.ActivityAndSport","sport"],["Emoji.Objects","lamp"],["Emoji.Flags","flag"],["Skin Tones",""]];let U;function H(){if(U)return U;U=new Map([[N,[]],[B,[]]]);for(const e in g.Z){const t=""+g.Z[e],i=O[+t[0]-1];if(!i)continue;let s=U.get(i);s||(s=[],U.set(i,s)),s[+t.slice(1)||0]=e}U.delete(O.pop()),O.unshift(N,B);const e=O.map((([e])=>e)),t=[...U.entries()].sort(((t,i)=>e.indexOf(t[0][0])-e.indexOf(i[0][0])));return U=new Map(t),U}const z=(0,L.C)(42,42);class j extends C.pw{constructor(e){super(e.managers,"super-emojis",(()=>z),16,4,0),this.onCategoryVisibility=({target:e,visible:t})=>{const i=this.categoriesMap.get(e),s=i.elements.renderer,n=[];if(s){n.push(s);const e=new Map;t?(n.push(...i.items.map((({docId:t,element:i})=>{if(!t)return i;const s=i.firstElementChild;return s.clear(!1),e.set(s.docId,new Set([s])),i}))),s.add(e,void 0,void 0,!1)):(s.clearCanvas(),s.middlewareHelper.clean())}else t&&n.push(...i.items.map((({element:e})=>e)));if(i.elements.items.replaceChildren(...n),s&&!t){const e=new Map;i.items.forEach((({docId:t,element:i})=>{if(!t)return;const s=i.firstElementChild;s.clear(),e.set(s.docId,new Set([s]))})),s.add(e,void 0,!0)}},this.onContentClick=e=>{(0,n.Z)(e);const{target:t}=e,i=(0,a.Z)(t,"emoji-category"),s=this.categoriesMap.get(i);if((0,a.Z)(t,"category-title")){if(s.local)return;return void new k.Z({id:s.set.id,access_hash:s.set.access_hash},!0).show()}const o=D(t);if(o){if(o.docId&&!l.Z.premium&&(this.isStandalone?""!==s.id:this.peerId!==l.Z.myId)){const e=document.createElement("a");return e.onclick=()=>{d.ZP.openPremiumBot(),(0,x.PE)()},void(0,x.bC)({langPackKey:"CustomEmoji.PremiumAlert",langPackArguments:[e]})}this.onClick?this.onClick(Object.assign(Object.assign({},o),{element:(0,a.Z)(t,"super-emoji").firstElementChild})):d.ZP.chat.input.onEmojiSelected(o,!1),f.Z&&(0,m.Z)()}},(0,A.Z)(this,e),this.container.classList.add("emoji-padding"),this.content.id="content-emoji",this.activeElements=[]}destroy(){var e;super.destroy(),null===(e=this.menuInnerScroll)||void 0===e||e.destroy()}init(){super.init(),this.init=void 0;const e={root:this.isStandalone?this.content:s.ZP.getElement()};this.categoriesIntersector=new E.Z(this.onCategoryVisibility,e),this.menuOnClickResult=s.Jo.menuOnClick(this,this.menu,this.scrollable,this.menuScroll,void 0,this.listenerSetter);const t=(0,h.y)(this.content,!0);let i,n;if(!this.isStandalone){const e=this.menuInnerScroll=new u.v7(void 0);e.container.classList.add("menu-horizontal-inner-scroll"),i=document.createElement("div"),i.classList.add("menu-horizontal-inner"),i.append(e.container)}H(),n=this.noRegularEmoji?new Map([[[N[0],"recent"],[]]]):H(),n.forEach(((e,[t,i])=>{const s=this.createLocalCategory(t,t,i,!i);s.elements.container.classList.remove("hide"),s.elements.items.classList.add(i&&!this.isStandalone?"is-local":"not-local"),e.forEach((e=>{const t=(0,c.zu)(e);this.addEmojiToCategory({category:s,emoji:{emoji:t},batch:!0})}))}));const a=Promise.all([this.isStandalone?void 0:(0,r.Z)(200),!this.noRegularEmoji&&this.managers.appEmojiManager.getRecentEmojis("native"),!this.isStandalone&&this.managers.appEmojiManager.getRecentEmojis("custom"),this.stickerSetId&&this.managers.appStickersManager.getLocalStickerSet(this.stickerSetId),this.managers.appEmojiManager.getCustomEmojis()]).then((([e,n,a,o,r])=>{t.remove(),o&&(a=o.documents.map((e=>e.id)));const c=this.categories[R],h=this.categories[""];if(this.isStandalone||[c&&[c,n],h&&[h,a]].filter(Boolean).forEach((([e,t])=>{e.limit=32,t.splice(32,t.length-32)})),c&&n)for(const e of n)this.addEmojiToCategory({category:c,emoji:{emoji:e},batch:!0});if(h){if(this.createRendererForCategory(h),a)for(const e of a)this.addEmojiToCategory({category:h,emoji:{emoji:"",docId:e},batch:!0});h.elements.container.style.paddingTop=".5rem"}O.forEach((([e])=>{const t=this.categories[e];t&&(this.toggleLocalCategory(t,!0),e!==R&&""!==e&&(t.menuScroll=this.menuInnerScroll,this.menuInnerScroll.container.append(t.elements.menuTab)))})),this.resizeCategories(),c&&i&&c.elements.menuTab.after(i),r.sets.forEach((e=>{this.renderStickerSet(e)})),this.listenerSetter.add(l.Z)("premium_toggle",(()=>{this.toggleCustomCategory()})),this.listenerSetter.add(l.Z)("stickers_top",this.postponedEvent((e=>{const t=this.categories[e];t&&(this.positionCategory(t,!0),this.listenerSetter.add(s.ZP)("openAfterLayout",(()=>{this.menuOnClickResult.setActiveStatic(t)}),{once:!0}))})));const u=e=>{for(const t in this.categories){const i=this.categories[t].elements.renderer;i&&(i.ignoreSettingDimensions=e,e||i.setDimensionsFromRect(void 0,!0))}};!this.isStandalone&&this.listenerSetter.add(s.ZP)("opened",(()=>{u(!1)})),!this.isStandalone&&this.listenerSetter.add(s.ZP)("close",(()=>{u(!0)})),this.listenerSetter.add(l.Z)("stickers_installed",(e=>{!this.categories[e.id]&&e.pFlags.emojis&&this.renderStickerSet(e,!0)})),this.listenerSetter.add(l.Z)("stickers_deleted",(e=>{const t=this.categories[e.id];if(this.deleteCategory(t)){const{renderer:e}=t.elements;e&&e.middlewareHelper.clean()}})),!this.isStandalone&&this.listenerSetter.add(l.Z)("emoji_recent",this.postponedEvent((e=>{const t=this.categories[e.docId?"":R];if(!t)return;const i=e.docId?t=>t.docId===e.docId:t=>t.emoji===e.emoji,s=(0,Z.Z)(t.items,i);if(s){if(t.items.unshift(s),this.isCategoryVisible(t)){const{renderer:e}=t.elements;(0,T.Z)(s.element,t.elements.items,e?1:0,-1),null==e||e.forceRender()}}else this.addEmojiToCategory({category:t,emoji:e,batch:!1,prepend:!0});0===this.closeScrollTop&&this.menuOnClickResult.setActive(e.docId?this.categories[R]:t)}))),!this.isStandalone&&this.listenerSetter.add(d.ZP)("peer_changed",(()=>{this.toggleCustomCategory()})),this.toggleCustomCategory(),this.menuOnClickResult.setActive(null!=c?c:h)}));return(0,S.fc)(this.content,this.onContentClick,{listenerSetter:this.listenerSetter}),(0,P.Z)({listenTo:this.content,listenerSetter:this.listenerSetter}),a}renderStickerSet(e,t){const i=this.createCategory(e,(0,b.Z)(e.title));this.positionCategory(i,t);const{container:n,menuTabPadding:a}=i.elements;i.elements.items.classList.add("not-local"),i.elements.container.classList.add("is-premium-set"),i.elements.title.classList.add("tgico"),this.createRendererForCategory(i),this.managers.appStickersManager.getStickerSet(e).then((({documents:e})=>{e.forEach((e=>{this.addEmojiToCategory({category:i,emoji:{docId:e.id,emoji:e.stickerEmojiRaw},batch:!0})})),this.onCategoryVisibility({target:i.elements.container,visible:this.isCategoryVisible(i)}),i.setCategoryItemsHeight(),n.classList.remove("hide")})),(0,M.Z)({set:e,container:a,group:s.Yd,lazyLoadQueue:s.Jo.lazyLoadQueue,width:32,height:32,autoplay:!1})}get peerId(){return d.ZP.chat.peerId}getCustomCategory(){return this.categories[""]}toggleCustomCategory(){const e=this.categories[""],t=l.Z.premium||this.peerId===l.Z.myId,i=t||this.isStandalone;super.toggleLocalCategory(e,!!e.items.length&&i),this.content.classList.toggle("has-premium",t)}toggleLocalCategory(e,t){""!==e.id?super.toggleLocalCategory(e,t):this.toggleCustomCategory()}createRendererForCategory(e){const t=w.KZ.create({animationGroup:s.Yd,customEmojiSize:I.Z.active.esgCustomEmoji});e.elements.renderer=t,e.elements.items.append(t)}addEmojiToCategory(e){const{category:t,emoji:i,batch:s,prepend:n}=e;let a=e.element;if(a){const e=document.createElement("span");e.classList.add("super-emoji"),e.append(a),a=e}else if(i.docId){const e=w.LD.create(i.docId),t=document.createElement("span");t.classList.add("super-emoji"),t.append(e),a=t}else a=F(i.emoji,void 0,!1);const o=Object.assign(Object.assign({},i||{emoji:void 0}),{element:a});(e.active||this.activeEmoji&&(o.docId?this.activeEmoji.docId===o.docId:this.activeEmoji.emoji===o.emoji))&&(this.activeEmoji,this.activeElements.push(o),a.classList.add("active")),t.items[n?"unshift":"push"](o),s||this.spliceExceed(t)||this.onLocalCategoryUpdate(t)}setActive(e){var t,i;(e===this.activeEmoji||(null==e?void 0:e.docId)?e.docId!==(null===(t=this.activeEmoji)||void 0===t?void 0:t.docId):(null==e?void 0:e.emoji)!==(null===(i=this.activeEmoji)||void 0===i?void 0:i.emoji))&&(this.activeEmoji=e,this.activeElements.forEach((e=>{e.element.classList.remove("active")})),this.activeElements.length=0,this.categoriesMap.forEach((t=>{t.items.forEach((t=>{(e.docId?t.docId===e.docId:t.emoji===e.emoji)&&(t.element.classList.add("active"),this.activeElements.push(t))}))})))}onClose(){this.closeScrollTop=this.scrollable.scrollTop}}},6057:(e,t,i)=>{"use strict";i.d(t,{pw:()=>D,vT:()=>_,ZP:()=>R});var s=i(3173),n=i(8497),a=i(4755),o=i(2325),r=i(8115),d=i(3512),l=i(5814),c=i(1655),h=i(7009),u=i(2940);class p extends h.Z{constructor(e,t,i){super(e),this.onVisibilityChange=t,this.elementsMap=new Map,this.intersector=new u.Z((e=>{var t;const{target:i,visible:s}=e,n=this.elementsMap.get(i);n.visible=s,s?(n.wasSeen=!0,this.queue.includes(n)||this.queue.push(n)):(0,c.Z)(this.queue,n),null===(t=this.onVisibilityChange)||void 0===t||t.call(this,e),this.setProcessQueueTimeout()}),i)}clear(){super.clear(),this.elementsMap.clear()}observe(e){this.elementsMap.set(e.div,e),super.observe(e)}unobserve(e){this.elementsMap.delete(e.div),super.unobserve(e)}}var f=i(279),m=i(6787),g=i(8805),v=i(4064),b=i(2738),y=i(4484),w=i(319),S=i(2230),C=i(5592),L=i(3163),E=i(5975),I=i(7625),M=i(9259),P=i(3699),Z=i(3541),T=i(1273),k=i(8222),x=i(241),A=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class _{constructor(e,t,i,s){this.regularLazyLoadQueue=e,this.group=t,this.managers=i,this.options=s,this.animated=new Set,this.checkAnimationContainer=(e,t)=>{l.Z.getAnimations(e).forEach((e=>{t?l.Z.checkAnimation(e,!1):l.Z.removeAnimation(e)}))},this.processVisible=e=>A(this,void 0,void 0,(function*(){const t=e.dataset.docId,i=yield this.managers.appDocsManager.getDoc(t),s=a.Z.active.esgSticker.width,n=(0,Z.ZP)({doc:i,div:e,width:s,height:s,lazyLoadQueue:null,group:this.group,onlyThumb:!1,play:!0,loop:!0,withLock:!0}).then((({render:e})=>e));return n.then((()=>{this.checkAnimationContainer(e,this.lazyLoadQueue.intersector.isVisible(e))})),n})),this.processInvisible=e=>A(this,void 0,void 0,(function*(){const t=e.dataset.docId,i=yield this.managers.appDocsManager.getDoc(t);this.checkAnimationContainer(e,!1),e.textContent="",this.renderSticker(i,e)})),this.lazyLoadQueue=new p(void 0,(({target:e,visible:t})=>{t||this.processInvisible(e)}),s)}clear(){this.lazyLoadQueue.clear()}renderSticker(e,t,i){return t||((t=document.createElement("div")).classList.add("grid-item","super-sticker"),t.dataset.docId=""+e.id,e.animated&&this.observeAnimated(t)),(0,Z.ZP)({doc:e,div:t,lazyLoadQueue:this.regularLazyLoadQueue,group:this.group,onlyThumb:e.animated,loadPromises:i}),t}observeAnimated(e){this.animated.add(e),this.lazyLoadQueue.observe({div:e,load:this.processVisible})}unobserveAnimated(e){this.animated.delete(e),this.lazyLoadQueue.delete({div:e})}}class F{constructor(e){var t,i;const s=document.createElement("div");s.classList.add("emoji-category");const n=document.createElement("div");let a,o,r;n.classList.add("category-items"),e.title&&(a=document.createElement("div"),a.classList.add("category-title"),a.append(e.title)),e.noMenuTab||(o=(0,S.Z)(void 0,{noRipple:!0}),o.classList.add("menu-horizontal-div-item"),r=document.createElement("div"),r.classList.add("menu-horizontal-div-item-padding"),o.append(r)),a&&s.append(a),s.append(n),this.elements={container:s,title:a,items:n,menuTab:o,menuTabPadding:r},this.id=e.id,this.items=[],this.getContainerSize=e.getContainerSize,this.getElementMediaSize=e.getElementMediaSize,this.gapX=null!==(t=e.gapX)&&void 0!==t?t:0,this.gapY=null!==(i=e.gapY)&&void 0!==i?i:0}setCategoryItemsHeight(){const{width:e}=this.getContainerSize(),t=this.getElementMediaSize().width;let i=e/t;this.gapX&&(i-=Math.floor(i-1)*this.gapX/t),i=Math.floor(i);const s=Math.ceil(this.items.length/i);let n=s*t;this.gapY&&(n+=(s-1)*this.gapY),this.elements.items.style.minHeight=n+"px"}}class D{constructor(e,t,i,n,a,o){this.managers=e,this.categoryItemsClassName=t,this.getElementMediaSize=i,this.padding=n,this.gapX=a,this.gapY=o,this.mounted=!1,this.resizeCategories=()=>{for(const[e,t]of this.categoriesMap)t.setCategoryItemsHeight()},this.postponedEvent=e=>(...t)=>{s.ZP.isActive()?this.postponedEvents.push({cb:e,args:t}):e(...t)},this.categories={},this.categoriesMap=new Map,this.categoriesByMenuTabMap=new Map,this.localCategories=[],this.postponedEvents=[],this.listenerSetter=new P.Z,this.container=document.createElement("div"),this.container.classList.add("tabs-tab","emoticons-container"),this.menuWrapper=document.createElement("div"),this.menuWrapper.classList.add("menu-wrapper","emoticons-menu-wrapper"),this.menu=document.createElement("nav"),this.menu.className="menu-horizontal-div no-stripe justify-start emoticons-menu",this.menuWrapper.append(this.menu),this.menuScroll=new g.v7(this.menuWrapper),this.content=document.createElement("div"),this.content.classList.add("emoticons-content"),this.container.append(this.menuWrapper,this.content),this.scrollable=new g.ZP(this.content,"STICKERS")}getCategoryByContainer(e){return this.categoriesMap.get(e)}getCategoryByMenuTab(e){return this.categoriesByMenuTabMap.get(e)}createCategory(e,t,i,s){const n=new F({id:""+e.id,title:t,overflowElement:this.content,getContainerSize:()=>{let e,t;if(this.getContainerSize){const i=this.getContainerSize();e=i.width,t=i.height}else{const t=k.Z.getPropertyAsSize("esg-width");e=void 0===t?x.Z.width:t}return{width:e-this.padding,height:t}},getElementMediaSize:this.getElementMediaSize,gapX:this.gapX,gapY:this.gapY,noMenuTab:s});this.categoryItemsClassName&&n.elements.items.classList.add(this.categoryItemsClassName);const a=n.elements.container;return a.classList.add("hide"),n.set=e,this.categories[e.id]=n,this.categoriesMap.set(a,n),!s&&this.categoriesByMenuTabMap.set(n.elements.menuTab,n),this.categoriesIntersector.observe(a),!s&&this.menuOnClickResult.stickyIntersector.observeStickyHeaderChanges(a),i||!s&&n.elements.menuTab.classList.add("not-local"),n}positionCategory(e,t){const{menuTab:i,container:s}=e.elements,n=t?this.localCategories.filter((e=>e.mounted)).length:65535;let a=!1;const o=t?this.localCategories.filter((e=>e.menuScroll&&!a?(a=!0,!0):e.mounted&&!e.menuScroll&&e.elements.menuTab)).length:65535;(0,y.Z)(s,this.scrollable.container,n),(0,y.Z)(i,this.menu,o)}isCategoryVisible(e){return this.categoriesIntersector.getVisible().includes(e.elements.container)}toggleLocalCategory(e,t){var i;if(t){const t=this.localCategories.indexOf(e),i=this.localCategories.slice(0,t);let s=0,n=0;i.forEach((e=>{e.mounted?e.elements.menuTab&&!e.menuScroll||++n:(++s,++n)}));const a=t-s,o=t-n;e.elements.menuTab&&(0,y.Z)(e.elements.menuTab,this.menu,o),(0,y.Z)(e.elements.container,this.scrollable.container,a)}else null===(i=e.elements.menuTab)||void 0===i||i.remove(),e.elements.container.remove();e.mounted=t}createLocalCategory(e,t,i,s){const n=this.createCategory({id:e},t&&(0,o.ag)(t),!0,s);return n.local=!0,this.localCategories.push(n),n.elements.title&&n.elements.title.classList.add("disable-hover"),s||(i&&n.elements.menuTab.classList.add("tgico","tgico-"+i),n.elements.menuTabPadding.remove()),this.toggleLocalCategory(n,!1),n}onLocalCategoryUpdate(e){e.setCategoryItemsHeight(),this.toggleLocalCategory(e,!!e.items.length)}deleteCategory(e){return!!e&&(e.elements.container.remove(),e.elements.menuTab.remove(),this.categoriesIntersector.unobserve(e.elements.container),delete this.categories[e.id],this.categoriesMap.delete(e.elements.container),this.categoriesByMenuTabMap.delete(e.elements.menuTab),!0)}spliceExceed(e){if(void 0===e.limit)return!1;const{items:t,limit:i}=e;return t.splice(i,t.length-i).forEach((({element:e})=>{e.remove()})),this.onLocalCategoryUpdate(e),!0}init(){this.listenerSetter.add(s.ZP)("closed",(()=>{this.postponedEvents.forEach((({cb:e,args:t})=>{e(...t)})),this.postponedEvents.length=0}))}destroy(){var e,t,i,s;this.getContainerSize=void 0,this.postponedEvents.length=0,null===(e=this.categoriesIntersector)||void 0===e||e.disconnect(),this.listenerSetter.removeAll(),this.scrollable.destroy(),null===(t=this.menuScroll)||void 0===t||t.destroy(),null===(s=null===(i=this.menuOnClickResult)||void 0===i?void 0:i.stickyIntersector)||void 0===s||s.disconnect()}}class R extends D{constructor(e){super(e,"super-stickers",(()=>a.Z.active.esgSticker),6,4,4),this.onCategoryVisibility=({target:e,visible:t,entry:i})=>{const s=this.categoriesMap.get(e);s.elements.items.replaceChildren(...t?s.items.map((({element:e})=>e)):[])},this.setTyping=(e=!1)=>{(e||s.ZP.isActive()&&s.ZP.tab===this)&&d.Z.dispatchEvent("choosing_sticker",!e)},this.container.classList.add("stickers-padding"),this.content.id="content-stickers"}setFavedLimit(e){this.categories.faved.limit=e}categoryAppendStickers(e,t){const{container:i}=e.elements;t.then((t=>{const s=this.isCategoryVisible(e);t.forEach((t=>{const i=this.superStickerRenderer.renderSticker(t);e.items.push({document:t,element:i}),s&&e.elements.items.append(i)})),e.setCategoryItemsHeight(),i.classList.remove("hide")}))}renderStickerSet(e,t=!1){return A(this,void 0,void 0,(function*(){const i=this.createCategory(e,(0,r.Z)(e.title)),{menuTabPadding:n}=i.elements,a=this.managers.appStickersManager.getStickerSet(e);this.categoryAppendStickers(i,a.then((e=>e.documents))),this.positionCategory(i,t),(0,T.Z)({set:e,container:n,group:s.Yd,lazyLoadQueue:s.Jo.lazyLoadQueue,width:32,height:32,autoplay:!1})}))}init(){super.init(),this.scrollable.onAdditionalScroll=()=>{this.setTyping()};const e={root:s.ZP.getElement()};this.categoriesIntersector=new u.Z(this.onCategoryVisibility,e);const t=e=>{e.elements.items.replaceChildren(),e.items.forEach((({element:e})=>this.superStickerRenderer.unobserveAnimated(e))),e.items.length=0};this.scrollable.container.addEventListener("click",(e=>{const t=e.target;if((0,n.Z)(t,"category-title")){const e=(0,n.Z)(t,"emoji-category"),i=this.categoriesMap.get(e);if(i.local)return;new m.Z({id:i.set.id,access_hash:i.set.access_hash}).show()}else s.Jo.onMediaClick(e)})),this.menuOnClickResult=s.Jo.menuOnClick(this,this.menu,this.scrollable,this.menuScroll);const i=(0,f.y)(this.content,!0),o=(e,t)=>{e.limit&&(t=t.slice(0,e.limit));const i=new Set(t.map((e=>e.id)));(0,I.Z)(e.items,(t=>{i.has(t.document.id)||this.deleteSticker(e,t.document,!0)})),this.toggleLocalCategory(e,!!t.length),(0,I.Z)(t,((t,i)=>{this.unshiftSticker(e,t,!0,i)})),this.spliceExceed(e),e.elements.container.classList.remove("hide")},r=this.createLocalCategory("faved","FavoriteStickers","savedmessages"),l=this.createLocalCategory("recent","Stickers.Recent","recent");l.limit=20;const c=(0,S.Z)("close",{noRipple:!0});l.elements.title.append(c),(0,b.fc)(c,(()=>{(0,C.Z)({titleLangKey:"ClearRecentStickersAlertTitle",descriptionLangKey:"ClearRecentStickersAlertMessage",button:{langKey:"Clear"}}).then((()=>{this.managers.appStickersManager.clearRecentStickers()}),w.Z)}));const h=this.createLocalCategory("premium","PremiumStickersShort"),p=document.createElement("span");p.classList.add("tgico-star","color-premium"),h.elements.menuTab.append(p);const g=[Promise.all([this.managers.apiManager.getLimit("favedStickers"),this.managers.appStickersManager.getFavedStickersStickers()]).then((([e,t])=>{this.setFavedLimit(e),o(r,t)})),this.managers.appStickersManager.getRecentStickersStickers().then((e=>{o(l,e)})),this.managers.appStickersManager.getAllStickers().then((e=>{for(const t of e.sets)this.renderStickerSet(t)})),this.managers.appStickersManager.getPremiumStickers().then((e=>{const t=e.length;this.toggleLocalCategory(h,d.Z.premium&&!!t),this.categoryAppendStickers(h,Promise.resolve(e)),d.Z.addEventListener("premium_toggle",(e=>{this.toggleLocalCategory(this.categories.premium,e&&!!t)}))}))];Promise.race(g).finally((()=>{i.remove()})),Promise.all(g).finally((()=>{this.mounted=!0,this.setTyping();const e=this.categories.faved,t=this.categories.recent;this.menuOnClickResult.setActive(e.items.length?e:t),d.Z.addEventListener("stickers_installed",(e=>{this.categories[e.id]||this.renderStickerSet(e,!0)}))})),this.superStickerRenderer=new _(s.Jo.lazyLoadQueue,s.Yd,this.managers,e);const v=this.superStickerRenderer.lazyLoadQueue;s.ZP.addLazyLoadQueueRepeat(v,this.superStickerRenderer.processInvisible),d.Z.addEventListener("sticker_updated",(({type:e,document:t,faved:i})=>{const s=this.categories["faved"===e?"faved":"recent"];s&&(i?this.unshiftSticker(s,t):this.deleteSticker(s,t))})),d.Z.addEventListener("stickers_deleted",(({id:e})=>{const i=this.categories[e];this.deleteCategory(i)&&t(i)})),d.Z.addEventListener("stickers_top",this.postponedEvent((e=>{const t=this.categories[e];t&&(this.positionCategory(t,!0),s.ZP.addEventListener("openAfterLayout",(()=>{this.menuOnClickResult.setActiveStatic(t)}),{once:!0}))}))),d.Z.addEventListener("stickers_updated",(({type:e,stickers:t})=>{const i=this.categories["faved"===e?"faved":"recent"];i&&o(i,t)})),d.Z.addEventListener("app_config",(()=>{this.managers.apiManager.getLimit("favedStickers").then((e=>{this.setFavedLimit(e)}))})),a.Z.addEventListener("resize",this.resizeCategories),(0,M.Z)({listenTo:this.content,listenerSetter:new P.Z});const y="menu";(0,L.Z)({listenTo:this.content,verifyRecent:e=>!!(0,E.Z)(e,this.categories.recent.elements.items),onOpen:()=>{s.ZP.setIgnoreMouseOut(y,!0)},onClose:()=>{s.ZP.setIgnoreMouseOut(y,!1)}}),this.init=null}deleteSticker(e,t,i){const s=(0,v.Z)(e.items,(e=>e.document.id===t.id));s&&(s.element.remove(),i||this.onLocalCategoryUpdate(e))}unshiftSticker(e,t,i,s){if(void 0!==s){const i=e.items[s];if(i&&i.document.id===t.id)return}let n=(0,v.Z)(e.items,(e=>e.document.id===t.id));n||(n={element:this.superStickerRenderer.renderSticker(t),document:t}),e.items.unshift(n),e.elements.items.prepend(n.element),i||this.spliceExceed(e)}unshiftRecentSticker(e){this.managers.appStickersManager.saveRecentSticker(e.id)}deleteRecentSticker(e){this.managers.appStickersManager.saveRecentSticker(e.id,!0)}onClosed(){this.setTyping(!0)}onOpened(){this.setTyping(),this.resizeCategories()}}},36:(e,t,i)=>{"use strict";i.d(t,{G:()=>s});const s=()=>{const e=document.createElement("div");return e.classList.add("gradient-delimiter"),e}},5948:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(2325);function n(e){const t=document.createElement("span");return t.classList.add("badge-fake"),(0,s.$d)(t,e?"ScamMessage":"FakeMessage"),t}},1080:(e,t,i)=>{"use strict";i.d(t,{Z:()=>f});var s=i(5814),n=i(3725),a=i(3035),o=i(3512),r=i(8847),d=i(7009),l=i(2940);class c extends d.Z{constructor(e,t){super(e),this.onVisibilityChange=t,this.intersector=new l.Z((e=>{const{target:t,visible:i}=e,s=(0,r.Z)(this.queue,(e=>e.div===t));i&&s.length&&s.forEach((e=>{this.queue.unshift(e)})),this.onVisibilityChange&&this.onVisibilityChange(e),this.setProcessQueueTimeout()}))}observe(e){super.observe(e)}}var h=i(2887),u=i(319),p=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class f{constructor(e,t,i,r=!0){this.element=e,this.group=t,this.scrollable=i,this.scrollPromise=Promise.resolve(),this.timeout=0,this.onScroll=()=>{this.timeout?clearTimeout(this.timeout):this.scrollPromise=(0,n.Z)(),this.timeout=window.setTimeout((()=>{this.timeout=0,this.scrollPromise.resolve()}),150)},this.processInvisibleDiv=e=>this.scrollPromise.then((()=>p(this,void 0,void 0,(function*(){if(this.lazyLoadQueue.intersector.isVisible(e))return;const t=e.querySelector("video"),i=e.querySelector("img, canvas");i&&(i.classList.remove("hide"),yield(0,a.d1)()),!this.lazyLoadQueue.intersector.isVisible(e)&&t&&(t.remove(),t.src="",t.load(),s.Z.getAnimations(t).forEach((e=>{s.Z.removeAnimation(e)})))})))),this.managers=o.Z.managers,this.lazyLoadQueue=new c(void 0,(({target:e,visible:t})=>{t?this.processVisibleDiv(e):this.processInvisibleDiv(e)})),r&&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){e.querySelector("video")||this.lazyLoadQueue.push({div:e,load:()=>{const t=e.dataset.docId;return Promise.all([this.managers.appDocsManager.getDoc(t),this.scrollPromise]).then((([t])=>p(this,void 0,void 0,(function*(){const i=(yield(0,h.Z)({doc:t,container:e,lazyLoadQueue:null,group:this.group,noInfo:!0,noPreview:!0})).loadPromise;return i.finally((()=>{const t=e.querySelector("video"),i=e.querySelector("img, canvas");i&&i.classList.add("hide"),t&&!t.parentElement&&setTimeout((()=>{t.src="",t.load(),s.Z.getAnimations(t).forEach((e=>{s.Z.removeAnimation(e)}))}),0),this.lazyLoadQueue.intersector.isVisible(e)||this.processInvisibleDiv(e)})),i}))))}})}add(e,t=this.element){const i=document.createElement("div");i.classList.add("gif","grid-item"),i.dataset.docId=""+e.id,t.append(i),this.lazyLoadQueue.observe({div:i,load:u.Z}),(0,h.Z)({doc:e,container:i,lazyLoadQueue:null,noInfo:!0,onlyPreview:!0})}}},6008:(e,t,i)=>{"use strict";i.d(t,{X:()=>c});var s=i(426),n=i(3512),a=i(3035),o=i(4789),r=i(5975),d=i(2648),l=i(2738);function c(e,t,i,c,h=200,u,p){const f=(0,s.Z)({content:t,type:e||"tabs"===t.dataset.animation?"tabs":"navigation",transitionTime:h,onTransitionEnd:c,listenerSetter:p});if(!e)return f;const m=new Proxy(f,{apply:(t,i,s)=>{const n=+s[0],a=void 0===s[1]||s[1],o=e.querySelector(`[data-tab="${n}"]`)||e.children[n];g(o,n,a)}}),g=(s,r,d=!0)=>{return l=this,c=void 0,m=function*(){const l=t.children[r];if(i){const e=i(r,l,d),t=e instanceof Promise?yield e:e;if(void 0!==t&&!t)return}u&&u.scrollIntoViewNew({element:s.parentElement.children[r],position:"center",forceDirection:d?void 0:o.f.Static,forceDuration:h,axis:"x"}),n.Z.settings.animationsEnabled||(d=!1);const c=f.prevId();if(s.classList.contains("active")||r===c)return!1;const p=d?a.T2:e=>e(),m=e.querySelector(b.toLowerCase()+".active");m&&p((()=>{m.classList.remove("active")})),v&&-1!==c&&d&&p((()=>{const e=s.querySelector("i"),t=s.parentElement.children[c].querySelector("i");t.classList.remove("animate"),e.classList.remove("animate");const i=t.parentElement.parentElement.offsetLeft-e.parentElement.parentElement.offsetLeft,n=t.clientWidth/e.clientWidth;e.style.transform=`translate3d(${i}px, 0, 0) scale3d(${n}, 1, 1)`,(0,a.T2)((()=>{e.classList.add("animate"),e.style.transform="none"}))})),p((()=>{s.classList.add("active")})),f(r,d)},new((p=void 0)||(p=Promise))((function(e,t){function i(e){try{n(m.next(e))}catch(e){t(e)}}function s(e){try{n(m.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof p?n:new p((function(e){e(n)}))).then(i,s)}n((m=m.apply(l,c||[])).next())}));var l,c,p,m},v=!e.classList.contains("no-stripe"),b=e.firstElementChild.tagName;return(0,l.fc)(e,(t=>{let i,s=t.target;if(s=(0,r.Z)(s,e),!s)return!1;if(s.dataset.tab){if(i=+s.dataset.tab,-1===i)return!1}else i=(0,d.Z)(s);g(s,i)}),{listenerSetter:p}),m}},503:(e,t,i)=>{"use strict";i.d(t,{I1:()=>C,ZP:()=>I,rf:()=>w});var s=i(3910),n=i(6669),a=i(1544),o=i(8763),r=i(4668),d=i(3299),l=i(9336),c=i(1293),h=i(5565),u=i(669),p=i(130),f=i(2325),m=i(1507),g=i(6241),v=i(6535),b=i(3066),y=i(5400);function w(e,t,i,o){return r=this,l=void 0,h=function*(){const r=[],l=(null==i?void 0:i.some((e=>"messageEntityCustomEmoji"===e._)))?L():void 0,c=(0,b.Z)(t,{entities:i,wrappingForPeerId:o,loadPromises:r,customEmojiRenderer:l});c.querySelectorAll('[contenteditable="false"]').forEach((e=>{e.contentEditable="inherit",e.classList.add("pc")})),r.length&&(yield Promise.all(r)),c.querySelectorAll(".input-selectable").forEach((e=>{e.prepend((0,y.SZ)(!0))}));const h=u.Y?u.Z.getInstance():void 0,p=Array.from(c.querySelectorAll(".custom-emoji-placeholder")).map((e=>(e.dataset.ces="1",e.customEmojiElement))),f=(0,a.Z)(c);null==l||l.destroy();const m=(0,d.Z)(e);if(m.node);else{const t=document.createRange();let i=e.lastChild;i||e.append(i=document.createTextNode("")),t.setStartAfter(i),t.collapse(!0),m.selection.removeAllRanges(),m.selection.addRange(t)}e.addEventListener("input",s.Z,{capture:!0,once:!0,passive:!1}),null==h||h.onBeforeInput({inputType:"insertContent"}),window.document.execCommand("insertHTML",!1,f),Array.from(e.querySelectorAll("[data-ces]")).forEach(((e,t)=>{delete e.dataset.ces;const i=p[t];e.customEmojiElement=i,i.placeholder=e})),e.querySelectorAll(".pc").forEach((e=>{e.contentEditable="false"})),null==h||h.removeExtraBOMs(e),(0,n.Z)(e,"input")},new((c=void 0)||(c=Promise))((function(e,t){function i(e){try{n(h.next(e))}catch(e){t(e)}}function s(e){try{n(h.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof c?n:new c((function(e){e(n)}))).then(i,s)}n((h=h.apply(r,l||[])).next())}));var r,l,c,h}let S=()=>{document.addEventListener("paste",(e=>{const t=(0,o.Z)(e.target,'contenteditable="true"');if(!t)return;const i=!!t.dataset.noLinebreaks;let s,n;e.preventDefault();let a=(e.originalEvent||e).clipboardData.getData("text/plain"),r=!0,d=(e.originalEvent||e).clipboardData.getData("text/html");const c=e=>"messageEntityEmoji"===e._||"messageEntityLinebreak"===e._&&!i;if(i){const e=/[\r\n]/g;a=a.replace(e,""),d=d.replace(e,"")}const h=(t.dataset.peerId||m.NM).toPeerId();if(d.trim()){console.log(d.replace(/ (style|class|id)=".+?"/g,"")),d=d.replace(//,""),d=d.replace(//,""),d=d.replace('
',"");const e=d.match(/([\s\S]*)<\/body>/);e&&(d=e[1].trim());const t=(new DOMParser).parseFromString(d,"text/html").body||document.createElement("body");let i=t.firstChild;for(;i;){const e=i.nextSibling;i.nodeType===i.TEXT_NODE&&(i.nodeValue.trim()||i.remove()),i=e}const o=(0,l.Z)(t,!0,!1);h||(o.entities=o.entities.filter((e=>"messageEntityCustomEmoji"!==e._)));{const e=o.value.split("\n");let t=0;for(let i=0;i{e.offset>=n&&(e.offset-=1)})),t+=a.length}t+=1}const i=e.join("\n");o.value=i}if(o.value.replace(/\s/g,"").length===a.replace(/\s/g,"").length||o.entities.find((e=>"messageEntityCustomEmoji"===e._))){s=o.value,n=o.entities,r=!1;let e=(0,v.Z)(s);e=e.filter(c),(0,g.Z)(n,e)}console.log("usePlainText",r)}r&&(s=a,n=(0,v.Z)(s),n=n.filter(c)),w(t,s,n,h)})),S=null};var C;function L(){return y.KZ.create({wrappingDraft:!0,isSelectable:!0})}function E(e){const t=Array.from(e.querySelectorAll(".custom-emoji, .custom-emoji-placeholder"));let i=e.querySelector(".custom-emoji-renderer");if(!i&&t.length)i=L(),e.prepend(i);else if(i&&!t.length)return void i.remove();if(!i)return;const s=new Map;t.forEach((e=>{const t=e instanceof y.LD?e:e.customEmojiElement,{docId:i}=t;let n=s.get(i);n||s.set(i,n=new Set),n.add(t)}));for(const[e,t]of s){let s=i.customEmojis.get(e);if(s)for(const e of s)t.has(e)||e.destroy();else s=new Set;for(const e of t)s.has(e)||e.connectedCallback()}i.add(s,!1),i.forceRender()}!function(e){e[e.Neutral=0]="Neutral",e[e.Valid=1]="Valid",e[e.Error=2]="Error"}(C||(C={}));class I{constructor(e={}){this.options=e,this.container=document.createElement("div"),this.container.classList.add("input-field"),this.required=e.required,this.validate=e.validate,void 0!==e.maxLength&&void 0===e.showLengthOn&&(e.showLengthOn=Math.min(40,Math.round(e.maxLength/3)));const{placeholder:t,maxLength:i,showLengthOn:s,name:n,plainText:a,canBeEdited:o=!0,autocomplete:d}=e,h=e.label||e.labelText,m=[];let g;if(a?(this.container.innerHTML=`\n \n `,g=this.container.firstElementChild):(S&&S(),this.container.innerHTML='
',g=this.container.firstElementChild,g.contentEditable=""+!!o,u.Z.getInstance(),g.addEventListener("mousedown",(e=>{var t;const i=document.getSelection();if(!i.isCollapsed)return;const s=(0,r.Z)(e.target,"IMG");if(!s)return;const n=s.getBoundingClientRect(),a=n.left+n.width/2,o=e.clientX>=a,d=document.createRange();d.setStartAfter(o?s:null!==(t=s.previousSibling)&&void 0!==t?t:s),i.removeAllRanges(),i.addRange(d)})),m.push((()=>{(0,c.Z)(g)&&g.replaceChildren(),u.Y&&Array.from(g.querySelectorAll("br:not(.br-not-br)")).forEach((e=>{e.remove()})),(0,y.Cx)(Array.from(g.querySelectorAll(".input-something"))),E(g)}))),(0,p.m)(g),e.inputMode&&(g.inputMode=e.inputMode),t&&(0,f.$d)(g,t,void 0,"placeholder"),h||t){const e=document.createElement("div");e.classList.add("input-field-border"),this.container.append(e)}if(h&&(this.label=document.createElement("label"),this.setLabel(),this.container.append(this.label)),i){const e=this.container.lastElementChild;let t=!1;const n=()=>{const n=g.classList.contains("error"),o=a?g.value.length:[...(0,l.Z)(g,!1,!1).value].length,r=i-o,d=r<0;g.classList.toggle("error",d),d||r<=s?(this.setLabel(),e.append(` (${i-o})`),t||(t=!0)):(n&&!d||t)&&(this.setLabel(),t=!1)};m.push(n)}!e.withLinebreaks&&!a&&(g.dataset.noLinebreaks="1",g.addEventListener("keypress",(e=>{if("Enter"===e.key)return e.preventDefault(),!1}))),m.length&&g.addEventListener("input",(()=>{m.forEach((e=>e()))})),this.input=g}select(){this.value&&(this.options.plainText?this.input.select():function(e){const t=document.createRange();t.selectNodeContents(e);const i=window.getSelection();i.removeAllRanges(),i.addRange(t)}(this.input))}setLabel(){this.label.textContent="",this.options.labelText?(0,p.Z)(this.label,this.options.labelText):this.label.append((0,f.ag)(this.options.label,this.options.labelOptions))}get value(){return this.options.plainText?this.input.value:(0,l.Z)(this.input,!1,!1).value}set value(e){this.setValueSilently(e,!0),this.simulateInputEvent()}simulateInputEvent(){(0,n.Z)(this.input,"input")}setValueSilently(e,t){this.options.plainText?this.input.value=e:((0,h.Z)(this.input,e),E(this.input))}isChanged(){return this.value!==this.originalValue}isValid(){return!this.input.classList.contains("error")&&(!this.validate||this.validate())&&(!this.required||!(0,c.Z)(this.input))}isValidToChange(){return this.isValid()&&this.isChanged()}setDraftValue(e="",t){this.options.plainText||(e=(0,a.Z)((0,b.Z)(e))),t?this.setValueSilently(e,!1):this.value=e}setOriginalValue(e="",t){this.originalValue=e,this.setDraftValue(e,t)}setState(e,t){t?(this.label.textContent="",this.label.append((0,f.ag)(t,this.options.labelOptions))):this.setLabel(),this.input.classList.toggle("error",!!(e&C.Error)),this.input.classList.toggle("valid",!!(e&C.Valid))}setError(e){this.setState(C.Error,e)}}},3607:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(503);class n{constructor(e,t){this.prevValue="",this.timeout=0,this.onInput=()=>{if(!this.onChange)return;const 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 s.ZP({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 i=document.createElement("i");i.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(i,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)}}},2153:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(2940),n=i(8847),a=i(4064),o=i(7009),r=i(8594);class d extends o.Z{constructor(e,t){super(e),this.onVisibilityChange=({target:e,visible:t})=>{(0,n.Z)(this.queue,(t=>t.div===e)).forEach((e=>{t&&(e.wasSeen=!0),e.visible=t;const i=this.queue.findIndex((e=>!e.visible));this.queue.splice(Math.max(0,i),0,e)})),this.setProcessQueueTimeout()},this.intersector=new s.Z(this.onVisibilityChange),!t&&(0,r.ZP)((()=>{this.lock()}),(()=>{this.unlockAndRefresh()}))}getItem(){return(0,a.Z)(this.queue,(e=>e.wasSeen))}processItem(e){const t=Object.create(null,{processItem:{get:()=>super.processItem}});return i=this,s=void 0,a=function*(){yield t.processItem.call(this,e),this.intersector.unobserve(e.div)},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}addElement(e,t){var i;return!!super.addElement(e,t)&&(this.observe(t),null!==(i=t.wasSeen)&&void 0!==i||(t.wasSeen=!1),!0)}}},7009:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(8847),n=i(4421);class a extends n.Z{constructor(e){super(e),this.queue=[],this.inProcess=new Set}lock(){super.lock(),this.intersector.lock()}unlock(){super.unlock(),this.intersector.unlock()}unlockAndRefresh(){super.unlock(),this.intersector.unlockAndRefresh()}clear(){super.clear(),this.intersector.disconnect()}refresh(){this.intersector.refresh()}loadItem(e){return e.load(e.div)}addElement(e,t){if(this.queue.find((e=>e.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(){var e;null!==(e=this.intersectorTimeout)&&void 0!==e||(this.intersectorTimeout=window.setTimeout((()=>{this.intersectorTimeout=void 0,this.processQueue()}),0))}push(e){super.push(e)}unshift(e){super.unshift(e)}delete(e){(0,s.Z)(this.queue,(t=>t.div===e.div)),this.unobserve(e)}observe(e){this.intersector.observe(e.div)}unobserve(e){this.intersector.unobserve(e.div)}}},7207:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(3013),n=i(65);class a extends n.Z{constructor(e){super({step:1e3/60/1e3,min:0,max:1,withTransition:e.withTransition,useTransform:e.useTransform},0),this.options=e,this.onLoadedData=()=>{this.max=this.media.duration,this.seek.setAttribute("max",""+this.max)},this.onEnded=()=>{this.setProgress()},this.onPlay=()=>{const e=()=>{this.setProgress(),this.progressRAF=this.media.paused?void 0:window.requestAnimationFrame(e)};this.progressRAF&&(window.cancelAnimationFrame(this.progressRAF),this.progressRAF=void 0),this.streamable&&this.setLoadProgress(),e()},this.onTimeUpdate=()=>{this.media.paused&&(this.setProgress(),this.streamable&&this.setLoadProgress())},this.onProgress=e=>{this.setLoadProgress()},e.media&&this.setMedia(e.media,e.streamable)}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 i=!1;this.setSeekMax(),this.setListeners(),this.setHandlers({onMouseDown:()=>{var e,t;i=!this.media.paused,i&&this.media.pause(),null===(t=null===(e=this.options)||void 0===e?void 0:e.onSeekStart)||void 0===t||t.call(e)},onMouseUp:e=>{var t,s;i&&this.media.play(),null===(s=null===(t=this.options)||void 0===t?void 0:t.onSeekEnd)||void 0===s||s.call(t)}})}scrub(e){const t=super.scrub(e);return this.media.currentTime=t,t}setLoadProgress(){if(s.Z.isSafariBuffering(this.media))return;const e=this.media.buffered,t=e.length,i=this.media.currentTime;let n=0,a=0;for(let s=0;s=t&&t>=n&&(n=t,a=e.end(s))}const o=this.media.duration?a/this.media.duration:0;this.filledLoad.style.width=100*o+"%"}setSeekMax(){this.max=this.media.duration||0,this.max>0?this.onLoadedData():this.media.addEventListener("loadeddata",this.onLoadedData)}setProgress(){if(s.Z.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("pause",this.onTimeUpdate),this.media.addEventListener("timeupdate",this.onTimeUpdate),this.streamable&&this.media.addEventListener("progress",this.onProgress)}removeListeners(){super.removeListeners(),this.media&&(this.media.removeEventListener("loadeddata",this.onLoadedData),this.media.removeEventListener("ended",this.onEnded),this.media.removeEventListener("play",this.onPlay),this.media.removeEventListener("pause",this.onTimeUpdate),this.media.removeEventListener("timeupdate",this.onTimeUpdate),this.streamable&&this.media.removeEventListener("progress",this.onProgress)),this.progressRAF&&(window.cancelAnimationFrame(this.progressRAF),this.progressRAF=void 0)}}},3251:(e,t,i)=>{"use strict";i.d(t,{I:()=>f});var s=i(3189),n=i(8097),a=i(4755),o=i(3228),r=i(3035);const d=new Map,l=new Set;let c=!1;function h(){c||(c=!0,(0,r.T2)((()=>{c=!1,l.forEach(p),l.clear()})))}function u(e){const t=e.getSize;if(t)return t();const i=e.dataset.sizeType;return i?a.Z.active[i].width:e.getBoundingClientRect().width}function p(e){let t=d.get(e);const i=!t;let{text:a,textLength:r,from:l,multiplier:c,font:h,textWidth:p,elementWidth:f}=t||{};if(i){a=e.textContent,r=a.length,l=50,c=l>0&&l/100;let i=e.dataset.fontSize;i&&+i&&(i+="px"),h=`${e.dataset.fontWeight||s.U9} ${i||s.Bf} ${s.bt}`,p=(0,n.Z)(a,h),f=u(e),t={text:a,textLength:r,from:l,multiplier:c,font:h,textWidth:p,elementWidth:f},d.set(e,t)}const m=u(e),g=i||f!==m;if(!i&&g&&(t.elementWidth=f=m),g)if(p>f){e.setAttribute("title",a);let i=a,s=f;for(;i.length>3;){const t=i.length,a=c&&(0,o.Z)(c*t<<0,1,t-2)||Math.max(t+l-1,1),r=i.substr(0,a).replace(/\s*$/,""),d=i.substr(a+1).replace(/^\s*/,"");if(i=r+d,s=(0,n.Z)(i+"โ€ฆ",h),s{for(const[e]of d)l.add(e);h()}),{capture:!0,passive:!0});class f extends HTMLElement{connectedCallback(){d.set(this,null),this.dataset.sizeType||this.getSize?p(this):(l.add(this),h())}disconnectedCallback(){d.delete(this),l.delete(this)}}customElements.define("middle-ellipsis-element",f)},4425:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(1447);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=s.Z.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.helpers.onVisibilityClickAdditional=()=>{this.passwordInputField.helpers.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())},s.Z.waitForFirstFrame(e))))}remove(){this.animation&&this.animation.remove()}}},3083:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(1447);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 i=e.input;i.addEventListener("blur",(()=>{this.playAnimation(0)})),i.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[0].style.display="none"),this.animation.canvas[0].style.display=""):t=0;const i=this.needFrame>t?-1:1;this.animation.setDirection(i),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([s.Z.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(),s.Z.waitForFirstFrame(e)))),s.Z.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[0].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[0].style.display="",this.idleAnimation.play(),this.animation.canvas[0].style.display="none")})),s.Z.waitForFirstFrame(e))))])}remove(){this.animation&&this.animation.remove(),this.idleAnimation&&this.idleAnimation.remove()}}},6830:(e,t,i)=>{"use strict";i.d(t,{T:()=>a,Z:()=>o});var s=i(3910),n=i(503);class a{constructor(e,t){this.container=e,this.input=t,this.passwordVisible=!1,this.onVisibilityClick=e=>{(0,s.Z)(e),this.passwordVisible=!this.passwordVisible,this.toggleVisible.classList.toggle("eye-hidden",this.passwordVisible),this.input.type=this.passwordVisible?"text":"password",this.onVisibilityClickAdditional&&this.onVisibilityClickAdditional()},t.type="password",t.setAttribute("required",""),t.name="notsearch_password",t.autocomplete="off";const i=document.createElement("input");i.classList.add("stealthy"),i.tabIndex=-1,i.type="password",t.parentElement.prepend(i),t.parentElement.insertBefore(i.cloneNode(),t.nextSibling);const n=this.toggleVisible=document.createElement("span");n.classList.add("toggle-visible","tgico"),e.classList.add("input-field-password"),e.append(n),n.addEventListener("click",this.onVisibilityClick),n.addEventListener("touchend",this.onVisibilityClick)}}class o extends n.ZP{constructor(e={}){super(Object.assign({plainText:!0},e)),this.helpers=new a(this.container,this.input)}}},8261:(e,t,i)=>{"use strict";i.d(t,{Z:()=>G});var s=i(2365),n=i(3725),a=i(2166),o=i(3532),r=i(2738),d=i(5565),l=i(130),c=i(3699),h=i(5471),u=i(9405),p=i(3624),f=i(8631),m=i(9322),g=i(2790),v=i(5102),b=i(2325),y=i(5400),w=i(3512),S=i(9331),C=i(9807),L=i(36),E=i(5432),I=i(4064),M=i(3910),P=i(1708),Z=i(6074),T=i(3035),k=i(7030),x=i(9931),A=i(3757),_=i(9492),F=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class D{constructor(e,t){this.scrollable=e,this.managers=t,this.processItem=e=>F(this,void 0,void 0,(function*(){const t=document.createElement("div");let i;t.classList.add(D.BASE_CLASS+"-avatar","media-container","hide"),this.avatars.append(t),e&&(i="object"!=typeof e?yield this.managers.appPhotosManager.getPhoto(e):e.action.photo);const s=new Image;s.classList.add("avatar-photo"),s.draggable=!1;const n=()=>F(this,void 0,void 0,(function*(){if(i){const e=yield(0,_.Z)({container:t,photo:i,size:(0,k.Z)(i,420,420,!1),withoutPreloader:!0});[e.images.thumb,e.images.full].filter(Boolean).forEach((e=>{e.classList.add("avatar-photo")}))}else{const e=yield this.managers.appPeersManager.getPeerPhoto(this.peerId);yield(0,x.Y)(t,this.peerId,e,"photo_big",s)}t.classList.remove("hide")}));return this.avatars.childElementCount<=3?yield n():(this.intersectionObserver.observe(t),this.loadCallbacks.set(t,n)),this.addTab(),e})),this.container=document.createElement("div"),this.container.classList.add(D.BASE_CLASS+"-container"),this.avatars=document.createElement("div"),this.avatars.classList.add(D.BASE_CLASS+"-avatars"),this.gradient=document.createElement("div"),this.gradient.classList.add(D.BASE_CLASS+"-gradient"),this.info=document.createElement("div"),this.info.classList.add(D.BASE_CLASS+"-info"),this.tabs=document.createElement("div"),this.tabs.classList.add(D.BASE_CLASS+"-tabs"),this.arrowPrevious=document.createElement("div"),this.arrowPrevious.classList.add(D.BASE_CLASS+"-arrow","tgico-avatarprevious"),this.arrowNext=document.createElement("div"),this.arrowNext.classList.add(D.BASE_CLASS+"-arrow",D.BASE_CLASS+"-arrow-next","tgico-avatarnext"),this.container.append(this.avatars,this.gradient,this.info,this.tabs,this.arrowPrevious,this.arrowNext),this.loadCallbacks=new Map,this.listenerSetter=new c.Z;const i=()=>0===this.scrollable.scrollTop||(this.scrollable.scrollIntoViewNew({element:this.scrollable.container.firstElementChild,position:"start"}),!1),s=1/3;let n=!1,a=!1;(0,r.fc)(this.container,(e=>F(this,void 0,void 0,(function*(){if(a)return void(0,M.Z)(e);if(n)return void(n=!1);if(!i())return;const t=this.container.getBoundingClientRect(),o=e.pageX,r=o-t.left;if(!this.listLoader.previous.length&&!this.listLoader.next.length||r>t.width*s&&r{t.push({element:this.avatars.children[i],item:e})}));const i=t.slice(0,this.listLoader.previous.length),s=t.slice(this.listLoader.previous.length+1),n=this.avatars.children[this.listLoader.previous.length];a=!0,(0,S.C)(n,e,(()=>e===this.peerId),this.listLoader.current,i,s),a=!1}else{const e=o>t.right-t.width/2;let i;this.avatars.classList.add("no-transition"),this.avatars.offsetLeft,i=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(i),(0,T.T2)((()=>{this.avatars.classList.remove("no-transition")}))}}))),{listenerSetter:this.listenerSetter});const o=()=>{n=!0,document.body.addEventListener(E.Z?"touchend":"click",(e=>{n=!1}),{once:!0})};let d=0,l=0,h=0,u=0;this.swipeHandler=new A.Z({element:this.avatars,onSwipe:(e,t)=>{h=e*=-1;let i=l+e*-D.SCALE;return i>0?i=0:ii()?!this.container.classList.contains("is-single")&&!a:(o(),(0,M.Z)(e),!1),onFirstSwipe:()=>{const e=this.avatars.getBoundingClientRect();d=e.width,u=-d*(this.tabs.childElementCount-1),l=e.left-this.container.getBoundingClientRect().left,this.avatars.style.transform=D.TRANSLATE_TEMPLATE.replace("{x}",l+"px"),this.container.classList.add("is-swiping"),this.avatars.classList.add("no-transition"),this.avatars.offsetLeft},onReset:()=>{const e=Math.ceil(Math.abs(h)/(d/D.SCALE))*(h>=0?1:-1);o(),this.avatars.classList.remove("no-transition"),(0,T.T2)((()=>{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){return F(this,void 0,void 0,(function*(){this.peerId=e;const t=yield this.managers.appPeersManager.getPeerPhoto(e);if(!t)return;const i=this.listLoader=new Z.Z({loadCount:50,loadMore:(t,s,n)=>{if(!s)return Promise.resolve({count:void 0,items:[]});if(e.isUser()){const i=t;return this.managers.appPhotosManager.getUserPhotos(e,i,n).then((e=>({count:e.count,items:e.photos})))}{const t=[];return i.current||t.push(this.managers.appProfileManager.getChatFull(e.toChatId())),t.push(this.managers.appMessagesManager.getSearch({peerId:e,maxId:Number.MAX_SAFE_INTEGER,inputFilter:{_:"inputMessagesFilterChatPhotos"},limit:n,backLimit:0})),Promise.all(t).then((e=>F(this,void 0,void 0,(function*(){const t=e.pop();if((0,P.Z)(t),!i.current){const s=e[0],n=(0,I.Z)(t.history,(e=>e.action.photo.id===s.chat_photo.id));i.current=n||(yield this.managers.appMessagesManager.generateFakeAvatarMessage(this.peerId,s.chat_photo))}return{count:t.count,items:t.history}}))))}},processItem:this.processItem,onJump:(e,t)=>{const i=this.listLoader.index,s=100*D.SCALE*i;this.avatars.style.transform=D.TRANSLATE_TEMPLATE.replace("{x}",`-${s}%`);const n=this.tabs.querySelector(".active");n&&n.classList.remove("active"),this.tabs.children[i].classList.add("active"),this.loadNearestToTarget(this.avatars.children[i])}});"userProfilePhoto"===t._&&(i.current=t.photo_id),yield this.processItem(i.current),i.load(!0)}))}addTab(){const e=document.createElement("div");e.classList.add(D.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),i=t.indexOf(e);t.slice(Math.max(0,i-3),Math.min(t.length,i+3)).forEach((e=>{const t=this.loadCallbacks.get(e);t&&(t(),this.loadCallbacks.delete(e),this.intersectionObserver.unobserve(e))}))}cleanup(){var e;this.listenerSetter.removeAll(),this.swipeHandler.removeListeners(),null===(e=this.intersectionObserver)||void 0===e||e.disconnect()}}D.BASE_CLASS="profile-avatars",D.SCALE=s.Z?2:1,D.TRANSLATE_TEMPLATE=s.Z?`translate3d({x}, 0, -1px) scale(${D.SCALE})`:"translate({x}, 0)";var R=i(7479),B=i(5029),N=i(2796),O=i(8210),U=i(7362),H=i(9102),z=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const j=(e,t)=>{(0,l.Z)(t.title,e||""),t.container.style.display=e?"":"none"};class G{constructor(e,t,i,n=!0){this.managers=e,this.scrollable=t,this.listenerSetter=i,this.isDialog=n,s.Z||this.scrollable.container.classList.add("no-parallax"),i||(this.listenerSetter=new c.Z),this.middlewareHelper=(0,p.k)()}init(){this.init=null,this.element=document.createElement("div"),this.element.classList.add("profile-content"),this.section=new B.Z({noDelimiter:!0}),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 R.ZP({title:" ",subtitle:!0,icon:"info",clickable:e=>{"A"!==e.target.tagName&&((0,a.T)(this.bio.title.textContent),(0,N.Am)(b.ZP.format("BioCopied",!0)))},listenerSetter:this.listenerSetter,contextMenu:{buttons:[{icon:"copy",text:"Text.CopyLabel_About",onClick:()=>{(0,r.tH)(this.bio.container)},verify:()=>!this.peerId.isUser()},{icon:"copy",text:"Text.CopyLabel_Bio",onClick:()=>{(0,r.tH)(this.bio.container)},verify:()=>this.peerId.isUser()}]}}),this.bio.title.classList.add("pre-wrap"),this.username=new R.ZP({title:" ",subtitleLangKey:"Username",icon:"username",clickable:()=>{(0,a.T)("@"+this.username.title.textContent),(0,N.Am)(b.ZP.format("UsernameCopied",!0))},listenerSetter:this.listenerSetter,contextMenu:{buttons:[{icon:"copy",text:"Text.CopyLabel_Username",onClick:()=>{(0,r.tH)(this.username.container)}}]}}),this.phone=new R.ZP({title:" ",subtitle:!0,icon:"phone",clickable:()=>{(0,a.T)(this.phone.title.textContent.replace(/\s/g,"")),(0,N.Am)(b.ZP.format("PhoneCopied",!0))},listenerSetter:this.listenerSetter,contextMenu:{buttons:[{icon:"copy",text:"Text.CopyLabel_PhoneNumber",onClick:()=>{(0,r.tH)(this.phone.container)}},{icon:"info",text:"PeerInfo.Phone.AnonymousInfo",textArgs:[document.createElement("a")],onClick:()=>{window.open("https://fragment.com/numbers","_blank")},separator:!0,multiline:!0,verify:()=>z(this,void 0,void 0,(function*(){const{isAnonymous:e}=(yield this.managers.appUsersManager.getUserPhone(this.peerId.toUserId()))||{};return e}))}]}}),this.link=new R.ZP({title:" ",subtitleLangKey:"SetUrlPlaceholder",icon:"link",clickable:()=>{const e=this.link.title.textContent;(0,a.T)(e);const t=e.includes("/c/");(0,N.Am)(b.ZP.format(t?"LinkCopiedPrivateInfo":"LinkCopied",!0))},listenerSetter:this.listenerSetter,contextMenu:{buttons:[{icon:"copy",text:"Text.CopyLabel_ShareLink",onClick:()=>{(0,r.tH)(this.link.container)}}]}}),this.location=new R.ZP({title:" ",subtitleLangKey:"ChatLocation",icon:"location"}),this.section.content.append(this.phone.container,this.username.container,this.location.container,this.bio.container,this.link.container);const{listenerSetter:e}=this;this.isDialog&&(this.notifications=new R.ZP({checkboxField:new C.Z({toggle:!0}),titleLangKey:"Notifications",icon:"unmute",listenerSetter:this.listenerSetter}),e.add(this.notifications.checkboxField.input)("change",(e=>{e.isTrusted&&this.managers.appMessagesManager.togglePeerMute({peerId:this.peerId,threadId:this.threadId})})),e.add(w.Z)("dialog_notify_settings",(e=>z(this,void 0,void 0,(function*(){if(this.peerId===e.peerId){const e=yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.peerId,respectType:!1,threadId:this.threadId});this.notifications.checkboxField.checked=!e}})))),this.section.content.append(this.notifications.container)),this.element.append(this.section.container),s.Z&&this.element.append((0,L.G)()),e.add(w.Z)("peer_typings",(({peerId:e})=>{this.peerId===e&&this.setPeerStatus()})),e.add(w.Z)("peer_bio_edit",(e=>{e===this.peerId&&this.setMoreDetails(!0)}));const t=({peerId:e,threadId:t})=>z(this,void 0,void 0,(function*(){return this.peerId===e&&(!(yield this.managers.appPeersManager.isForum(this.peerId))||!this.threadId||this.threadId===t)}));e.add(w.Z)("peer_title_edit",(e=>z(this,void 0,void 0,(function*(){(yield t(e))&&(this.fillUsername(),this.setMoreDetails(!0))})))),e.add(w.Z)("user_update",(e=>{this.peerId===e.toPeerId()&&this.setPeerStatus()})),e.add(w.Z)("contacts_update",(e=>z(this,void 0,void 0,(function*(){this.peerId===e.toPeerId()&&((yield this.managers.appUsersManager.getUser(e)).pFlags.self&&this.isDialog||this.fillUserPhone())})))),e.add(w.Z)("avatar_update",(e=>z(this,void 0,void 0,(function*(){(yield t(e))&&this.setAvatar()})))),this.setPeerStatusInterval=window.setInterval((()=>this.setPeerStatus()),6e4)}setPeerStatus(e=!1,t){return z(this,void 0,void 0,(function*(){const i=this.peerId,s=[];s.push((()=>{this.element.classList.toggle("is-me",i===w.Z.myId)}));let n=Promise.resolve();if(i&&(w.Z.myId!==i||!this.isDialog)){const t=yield this.managers.appPeersManager.isForum(this.peerId),a=this.middlewareHelper.get();n=t&&this.threadId?(0,H.Z)({peerId:i,wrapOptions:{middleware:a}}).then((({element:e})=>{this.subtitle.replaceChildren(e)})):m.ZP.setPeerStatus({peerId:i,element:this.subtitle,needClear:e,useWhitespace:!0,middleware:a,ignoreSelf:!this.isDialog}),n.then((e=>e&&s.push(e)))}const a=()=>s.forEach((e=>e()));return n.then((()=>{if(t)return a;a()}))}))}cleanupHTML(){[this.bio,this.phone,this.username,this.location,this.link].forEach((e=>{e.container.style.display="none"})),this.notifications&&(this.notifications.container.style.display="",this.notifications.checkboxField.checked=!0),this.clearSetMoreDetailsTimeout()}canBeDetailed(){return this.peerId!==w.Z.myId||!this.isDialog}createAvatar(){const e=new S.Z;return e.classList.add("profile-avatar","avatar-120"),e.isDialog=this.isDialog,e.attachClickEvent(),e}_setAvatar(){return z(this,void 0,void 0,(function*(){const{peerId:e}=this,t=!(!this.threadId||!(yield this.managers.appPeersManager.isForum(e)));if(this.canBeDetailed()&&!t&&(yield this.managers.appPeersManager.getPeerPhoto(e))){const t=this.avatars;return this.avatars=new D(this.scrollable,this.managers),yield this.avatars.setPeer(e),()=>{var e;this.avatars.info.append(this.name,this.subtitle),null===(e=this.avatar)||void 0===e||e.remove(),this.avatar=void 0,t?t.container.replaceWith(this.avatars.container):this.element.prepend(this.avatars.container),s.Z&&this.scrollable.container.classList.add("parallax")}}const i=this.createAvatar();return yield i.updateWithOptions({peerId:e,threadId:t?this.threadId:void 0,wrapOptions:{customEmojiSize:(0,u.C)(120,120),middleware:this.middlewareHelper.get()}}),()=>{var e;s.Z&&this.scrollable.container.classList.remove("parallax"),this.avatars&&(this.avatars.container.remove(),this.avatars.cleanup(),this.avatars=void 0),null===(e=this.avatar)||void 0===e||e.remove(),this.avatar=i,this.section.content.prepend(this.avatar,this.name,this.subtitle)}}))}setAvatar(e){const t=this._setAvatar();return e?t:t.then((e=>e()))}getUsernamesAlso(e){const t=e.slice(1);if(t.length){const e=t.map((e=>(0,o.Z)({username:e})));return(0,b.ag)("UsernameAlso",[(0,b.v_)(e,!1)])}}fillUsername(){return z(this,void 0,void 0,(function*(){const{peerId:e}=this;if(e.isUser()&&this.canBeDetailed()){const t=yield this.managers.appPeersManager.getPeerActiveUsernames(e),i=this.getUsernamesAlso(t);return()=>{this.username.subtitle.replaceChildren(i||(0,b.ag)("Username")),j(t[0],this.username)}}}))}fillUserPhone(){return z(this,void 0,void 0,(function*(){const{peerId:e}=this;if(e.isUser()&&this.canBeDetailed()){const{phone:t,isAnonymous:i}=(yield this.managers.appUsersManager.getUserPhone(e.toUserId()))||{};return()=>{this.phone.subtitle.replaceChildren((0,b.ag)(i?"AnonymousNumber":"Phone")),j(t?(0,O.Z)(t):void 0,this.phone)}}}))}fillNotifications(){return z(this,void 0,void 0,(function*(){const e=this.notifications;if(e){if(this.canBeDetailed()){const t=yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.peerId,respectType:!1,threadId:this.threadId});return()=>{e.checkboxField.checked=!t}}return()=>{e.container.style.display="none"}}}))}fillName(){return z(this,void 0,void 0,(function*(){const{peerId:e}=this,[t]=yield Promise.all([(0,U.Z)({peerId:e,dialog:this.isDialog,withIcons:!this.threadId,threadId:this.threadId})]);return()=>{(0,d.Z)(this.name,t)}}))}fillRows(e){return z(this,void 0,void 0,(function*(){return Promise.all([this.fillName(),this.fillUsername(),this.fillUserPhone(),this.fillNotifications(),this.setMoreDetails(void 0,e),this.setPeerStatus(!0,!0)]).then((e=>()=>{e.forEach((e=>null==e?void 0:e()))}))}))}fillProfileElements(){return z(this,void 0,void 0,(function*(){if(!this.cleaned)return;this.cleaned=!1,this.cleanupHTML();const e=(0,n.Z)();this.middlewareHelper.get().onClean((()=>{e.reject()}));const t=yield Promise.all([this.setAvatar(!0),this.fillRows(e)]);return()=>{e.resolve(),t.forEach((e=>null==e?void 0:e()))}}))}_setMoreDetails(e,t){return z(this,void 0,void 0,(function*(){const i=this.getMiddlewarePromise();if(this.threadId&&(yield i(this.managers.appPeersManager.isForum(e)))){let t="https://t.me/";const s=(0,g.Z)(this.threadId),n=yield i(this.managers.appPeersManager.getPeerUsername(e));return t+=n?`${n}/${s}`:`c/${e.toChatId()}/${s}`,()=>{j(t,this.link)}}const s=[];if(s.push((()=>{this.bio.subtitle.replaceChildren((0,b.ag)(e.isUser()?"UserBio":"Info")),j(t.about?(0,y.ZP)(t.about):void 0,this.bio)})),!e.isUser()){const n=yield i(this.managers.appChatsManager.getChat(e.toChatId())),a=(0,v.Z)(n);let o;if(a.length)o=this.getUsernamesAlso(a),s.push((()=>j("https://t.me/"+a[0],this.link)));else{const e=t.exported_invite;"chatInviteExported"===(null==e?void 0:e._)&&s.push((()=>j(e.link,this.link)))}s.push((()=>this.link.subtitle.replaceChildren(o||(0,b.ag)("SetUrlPlaceholder"))))}const n=t.location;return"channelLocation"==(null==n?void 0:n._)&&s.push((()=>j(n.address,this.location))),this.setMoreDetailsTimeout=window.setTimeout((()=>this.setMoreDetails(!0)),6e4),()=>{s.forEach((e=>e()))}}))}setMoreDetails(e,t){return z(this,void 0,void 0,(function*(){this.clearSetMoreDetailsTimeout();const{peerId:i}=this,s=this.getMiddlewarePromise();if(!i||!this.canBeDetailed()||(yield s(this.managers.appPeersManager.isPeerRestricted(i))))return;const n=yield s(this.managers.acknowledged.appProfileManager.getProfileByPeerId(i,e)),a=s(n.result).then((e=>z(this,void 0,void 0,(function*(){if(!(yield s(this.managers.appPeersManager.isPeerRestricted(i))))return yield s(this._setMoreDetails(i,e))}))));if(n.cached&&t)return a;(t||Promise.resolve()).then((()=>a)).then((e=>{null==e||e()}))}))}getMiddlewarePromise(){return(0,f.Z)(this.middlewareHelper.get(),(0,h.Z)("MIDDLEWARE"))}setPeer(e,t){var i;this.peerId===e&&this.threadId===t||(null===(i=this.init)||void 0===i||i.call(this),this.peerId=e,this.threadId=t,this.middlewareHelper.clean(),this.cleaned=!0)}clearSetMoreDetailsTimeout(){void 0!==this.setMoreDetailsTimeout&&(clearTimeout(this.setMoreDetailsTimeout),this.setMoreDetailsTimeout=void 0)}destroy(){var e;this.peerId=this.threadId=void 0,this.clearSetMoreDetailsTimeout(),clearInterval(this.setPeerStatusInterval),null===(e=this.avatars)||void 0===e||e.cleanup(),this.middlewareHelper.destroy()}}},8842:(e,t,i)=>{"use strict";i.d(t,{Z:()=>g});var s=i(3512),n=i(2325),a=i(5565),o=i(1507),r=i(8456),d=i(130),l=i(5953),c=i(8115),h=i(493),u=(i(4755),i(5948));i(3541);function p(e,t,i,n,a){return o=this,r=void 0,l=function*(){const t=[],o=yield s.Z.managers.appPeersManager.getPeer(e);if(o.pFlags.verified&&!i&&t.push(function(){const e=document.createElement("span");e.classList.add("verified-icon","tgico");const t=document.createElementNS("http://www.w3.org/2000/svg","svg");t.setAttributeNS(null,"viewBox","0 0 26 26"),t.setAttributeNS(null,"width","26"),t.setAttributeNS(null,"height","26"),t.classList.add("verified-icon-svg");const i=document.createElementNS("http://www.w3.org/2000/svg","use");i.setAttributeNS(null,"href","#verified-icon-background"),i.classList.add("verified-icon-background");const s=document.createElementNS("http://www.w3.org/2000/svg","use");return s.setAttributeNS(null,"href","#verified-icon-check"),s.classList.add("verified-icon-check"),t.append(s,i),e.append(t),e}()),!o.pFlags.fake&&!o.pFlags.scam||n||t.push((0,u.Z)(o.pFlags.scam)),o.pFlags.premium&&!a){const e=o.emoji_status;e&&e._,t.push(function(){const e=document.createElement("span");return e.classList.add("premium-icon","tgico-star"),e}())}return t},new((d=void 0)||(d=Promise))((function(e,t){function i(e){try{n(l.next(e))}catch(e){t(e)}}function s(e){try{n(l.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof d?n:new d((function(e){e(n)}))).then(i,s)}n((l=l.apply(o,r||[])).next())}));var o,r,d,l}var f=i(9345);const m=new WeakMap;s.Z.addEventListener("peer_title_edit",(({peerId:e,threadId:t})=>{let i=`.peer-title[data-peer-id="${e}"]`;t&&(i+=`[data-thread-id="${t}"]`),Array.from(document.querySelectorAll(i)).forEach((e=>{const t=m.get(e);null==t||t.update()}))}));class g{constructor(e){this.element=document.createElement("span"),this.element.classList.add("peer-title"),(0,d.m)(this.element),this.options={},e&&this.update(e),m.set(this.element,this)}setOptions(e){if(e){(0,l.Z)(this.options,e);for(const t in e){const i=e[t];"object"!=typeof i&&"function"!=typeof i&&(this.element.dataset[t]=i?""+("boolean"==typeof i?+i:i):"0")}}}setHasInner(e){this.hasInner!==e&&(this.hasInner=e,this.element.classList.toggle("with-icons",e))}update(e){var t,i,l,u,m,g,v,b;return m=this,g=void 0,b=function*(){this.setOptions(e);let m,g=this.options.fromName;if(void 0!==g)return void 0!==this.options.limitSymbols&&(g=(0,r.Z)(g,this.options.limitSymbols,this.options.limitSymbols)),void(0,d.Z)(this.element,(0,c.Z)(g));null!==(t=(u=this.options).peerId)&&void 0!==t||(u.peerId=o.NM);const{peerId:v,threadId:b}=this.options;if(v===s.Z.myId&&this.options.dialog)(0,a.Z)(this.element,(0,n.ag)(this.options.onlyFirstName?"Saved":"SavedMessages"));else{if(b){const[e,t]=yield Promise.all([s.Z.managers.dialogsStorage.getForumTopic(v,b),s.Z.managers.appPeersManager.isForum(v)]);if(!e&&t)return s.Z.managers.dialogsStorage.getForumTopicById(v,b).then((e=>{if(!e&&this.options.threadId===b)return this.options.threadId=void 0,void this.update({threadId:void 0});this.update()}),(()=>{this.options.threadId===b&&(this.options.threadId=void 0,this.update({threadId:void 0}))})),(0,d.Z)(this.element,(0,n.ag)("Loading")),void this.setHasInner(!1)}const e=b&&this.options.withIcons?s.Z.managers.dialogsStorage.getForumTopic(v,b).then((e=>{var t;return(0,f.e)(Object.assign(Object.assign({},null!==(t=this.options.wrapOptions)&&void 0!==t?t:{}),{topic:e}))})):void 0,[t,a,o]=yield Promise.all([(0,h.Z)(this.options),this.options.withIcons&&p(v,null===(i=this.options.wrapOptions)||void 0===i||i.middleware)||this.options.withPremiumIcon&&p(v,null===(l=this.options.wrapOptions)||void 0===l||l.middleware,!0,!0),e]);if((null==a?void 0:a.length)||o){const e=document.createElement("span");e.classList.add("peer-title-inner"),m=!0,(0,d.Z)(e,t);const i=document.createDocumentFragment();i.append(...[o,e,...null!=a?a:[]].filter(Boolean)),(0,d.Z)(this.element,i)}else(0,d.Z)(this.element,t)}this.setHasInner(m)},new((v=void 0)||(v=Promise))((function(e,t){function i(e){try{n(b.next(e))}catch(e){t(e)}}function s(e){try{n(b.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof v?n:new v((function(e){e(n)}))).then(i,s)}n((b=b.apply(m,g||[])).next())}))}}},6765:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(1168),n=i(2325),a=i(2738),o=i(8678),r=i(2312);class d extends s.Z{constructor(e={}){super("popup-avatar",{closable:!0,withConfirm:!0}),this.image=new Image,this.cropper={crop:()=>{},removeHandlers:()=>{}},this.h6=document.createElement("h6"),(0,n.$d)(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),e.isForum&&this.cropContainer.classList.add("is-forum"),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&&(0,o.Z)(t).then((e=>{this.image=new Image,this.cropContainer.append(this.image),this.image.src=e,this.image.onload=()=>{this.show(),this.cropper=function(e,t){let i,s,n,a={},o=0,r=0,d=0,l=0,c=0;function h(){e.classList.add("crop-blur"),e.draggable=!1,n=new Image,n.src=e.src,n.draggable=!1,n.classList.add("crop-overlay-image"),t||(t=document.createElement("canvas")),i=document.createElement("div"),i.classList.add("crop-component"),s=document.createElement("div"),s.classList.add("crop-overlay");const a=document.createElement("div");a.classList.add("crop-overlay-color"),i.appendChild(s),e.parentNode.appendChild(i),i.appendChild(n),i.appendChild(e),i.appendChild(a),s.appendChild(n),n.style.maxWidth=e.width+"px",c=e.naturalWidth/e.offsetWidth;const o=e.offsetWidth/2-100,r=e.offsetHeight/2-100;u(200,200),p(o,r),f(o,r),s.addEventListener("mousedown",b,!1),s.addEventListener("touchstart",b,!1),s.addEventListener("wheel",v,!1),document.addEventListener("keypress",g,!1)}function u(e,t){d=e*c,l=t*c,s.style.width=e+"px",s.style.height=t+"px"}function p(e,t){r=t*c,o=e*c,n.style.top=-t+"px",n.style.left=-e+"px"}function f(e,t){s.style.top=t+"px",s.style.left=e+"px"}function m(e){e=e*Math.PI*2;let t,i,a,o,r=Math.floor(s.clientWidth+e),d=Math.floor(s.clientHeight+e),l=n.clientWidth,c=n.clientHeight;r<50||r>l||(t=s.offsetLeft-e/2,i=s.offsetTop-e/2,a=t+r,o=i+d,t<0&&(t=0),i<0&&(i=0),a>l||o>c||(u(r,r),p(t,i),f(t,i)))}function g(e){switch(e.preventDefault(),String.fromCharCode(e.charCode)){case"+":m(4);break;case"-":m(-4)}}function v(e){e.preventDefault(),m(e.deltaY>0?1:-1)}function b(e){e.preventDefault(),e.stopPropagation(),function(e){a.container_width=s.offsetWidth,a.container_height=s.offsetHeight,a.container_left=s.offsetLeft,a.container_top=s.offsetTop,a.mouse_x=(e.clientX||e.pageX||e.touches&&e.touches[0].clientX)+window.scrollX,a.mouse_y=(e.clientY||e.pageY||e.touches&&e.touches[0].clientY)+window.scrollY}(e),document.addEventListener("mousemove",w),document.addEventListener("touchmove",w),document.addEventListener("mouseup",y),document.addEventListener("touchend",y)}function y(e){e.preventDefault(),document.removeEventListener("mouseup",y),document.removeEventListener("touchend",y),document.removeEventListener("mousemove",w),document.removeEventListener("touchmove",w)}function w(e){let t,i,o,r,d={x:0,y:0};e.preventDefault(),e.stopPropagation(),d.x=e.pageX||e.touches&&e.touches[0].pageX,d.y=e.pageY||e.touches&&e.touches[0].pageY,t=d.x-(a.mouse_x-a.container_left),i=d.y-(a.mouse_y-a.container_top),o=s.offsetWidth,r=s.offsetHeight,t<0?t=0:t>n.offsetWidth-o&&(t=n.offsetWidth-o),i<0?i=0:i>n.offsetHeight-r&&(i=n.offsetHeight-r),p(t,i),f(t,i)}return e.complete?h():e.onload=h,{crop:function(){t.width=d,t.height=l,t.getContext("2d").drawImage(e,o,r,d,l,0,0,d,l)},removeHandlers:function(){s.removeEventListener("mousedown",b),s.removeEventListener("touchstart",b),s.removeEventListener("wheel",v),document.removeEventListener("mouseup",y),document.removeEventListener("touchend",y),document.removeEventListener("mousemove",w),document.removeEventListener("touchmove",w),document.removeEventListener("keypress",g),i.remove(),s.remove(),n.remove()}}}(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",(0,a.fc)(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((()=>r.Z.upload(this.blob)))}open(e,t){this.canvas=e,this.onCrop=t,this.input.click()}darkenCanvas(){const e=this.canvas.getContext("2d");e.fillStyle="rgba(0, 0, 0, 0.3)",e.fillRect(0,0,this.canvas.width,this.canvas.height)}}},6194:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(1168),n=i(7362),a=i(8127);class o{constructor(e,t,i,s){this.peerId=e,this.peerType=t,this.onSelect=i,this.threadId=s,this.construct()}construct(){return e=this,t=void 0,o=function*(){let{peerId:e,peerType:t,onSelect:i,threadId:o}=this;const r=yield(0,n.Z)({peerId:e,threadId:o}),d=s.Z.MANAGERS;void 0===t&&(t=yield d.appPeersManager.getDialogType(e));const l=(t,s=g&&!!t.size)=>{let n=d.appChatsManager.leave(e.toChatId());s&&(n=n.then((()=>d.appMessagesManager.flushHistory(e)))),null==i||i(n)},c=t=>{let s;if(o)s=d.appMessagesManager.flushHistory(e,!1,!0,o);else if(e.isUser())s=d.appMessagesManager.flushHistory(e,!1,g?!!t.size:void 0);else{if(!t.size)return l(t);s=d.appChatsManager.delete(e.toChatId())}null==i||i(s)};let h,u,p,f,m,g;switch(t){case"channel":(yield d.appChatsManager.hasRights(e.toChatId(),"delete_chat"))?(h="ChannelDeleteMenu",p="AreYouSureDeleteAndExitChannel",m=[{langKey:"ChannelDeleteMenu",isDanger:!0,callback:c}],g=[{text:"DeleteChannelForAll"}]):(h="LeaveChannelMenu",p="ChannelLeaveAlertWithName",f=[r],m=[{langKey:"LeaveChannel",isDanger:!0,callback:l}]);break;case"chat":h="DeleteChatUser",p="AreYouSureDeleteThisChatWithUser",f=[r],m=[{langKey:"DeleteChatUser",isDanger:!0,callback:c}],g=[{text:"DeleteMessagesOptionAlso",textArgs:[yield(0,n.Z)({peerId:e})]}];break;case"saved":h="DeleteChatUser",p="AreYouSureDeleteThisChatSavedMessages",m=[{langKey:"DeleteChatUser",isDanger:!0,callback:c}];break;case"megagroup":case"group":o?(h="DeleteTopics",u=[1],p="DeleteSelectedTopic",f=[r],m=[{langKey:"Delete",isDanger:!0,callback:c}]):(yield d.appChatsManager.hasRights(e.toChatId(),"delete_chat"))?(h="DeleteMegaMenu",p="AreYouSureDeleteAndExit",m=[{langKey:"DeleteMegaMenu",isDanger:!0,callback:c}],g=[{text:"DeleteChat.DeleteGroupForAll"}]):(h="LeaveMegaMenu",p="AreYouSureDeleteAndExitName",f=[r],m=[{langKey:"DeleteChatUser",isDanger:!0,callback:e=>l(e,!0)}])}new a.Z("popup-delete-chat",{peerId:e,threadId:o,titleLangKey:h,titleLangArgs:u,descriptionLangKey:p,descriptionLangArgs:f,buttons:m,checkboxes:g}).show()},new((i=void 0)||(i=Promise))((function(s,n){function a(e){try{d(o.next(e))}catch(e){n(e)}}function r(e){try{d(o.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(a,r)}d((o=o.apply(e,t||[])).next())}));var e,t,i,o}}},5128:(e,t,i)=>{"use strict";i.d(t,{Z:()=>h});var s=i(3512),n=i(1168),a=i(8127),o=i(2325),r=i(7120),d=i(2353),l=i(7362),c=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class h{constructor(e,t,i,s,n){this.peerId=e,this.mids=t,this.type=i,this.onConfirm=s,this.threadId=n,this.construct()}construct(){return c(this,void 0,void 0,(function*(){let{peerId:e,mids:t,type:i,onConfirm:h,threadId:u}=this;const p=yield(0,l.Z)({peerId:e,threadId:u}),f=n.Z.MANAGERS;t=t.slice();const m=(s,n)=>{h&&h(),"scheduled"===i?f.appMessagesManager.deleteScheduledMessages(e,t):f.appMessagesManager.deleteMessages(e,t,!!s.size||n)},g=[{langKey:"Delete",isDanger:!0,callback:m}],v=[];let b,y,w,S;if(1===t.length?b="DeleteSingleMessagesTitle":(b="DeleteMessagesTitle",y=[(0,o.ag)("messages",[t.length])]),w=(yield f.appPeersManager.isMegagroup(e))?1===t.length?"AreYouSureDeleteSingleMessageMega":"AreYouSureDeleteFewMessagesMega":1===t.length?"AreYouSureDeleteSingleMessage":"AreYouSureDeleteFewMessages",e===s.Z.myId||"scheduled"===i);else if(e.isUser())v.push({text:"DeleteMessagesOptionAlso",textArgs:[p]});else{const i=yield f.appChatsManager.getChat(e.toChatId()),n=(0,r.Z)(i,"delete_messages");if("chat"===i._){const i=n?t.slice():yield(0,d.Z)(t,(t=>c(this,void 0,void 0,(function*(){return(yield f.appMessagesManager.getMessageByPeer(e,t)).fromId===s.Z.myId}))));i.length&&(i.length===t.length?v.push({text:"DeleteForAll"}):(v.push({text:"DeleteMessagesOption"}),w="DeleteMessagesTextGroup",S=[(0,o.ag)("messages",[i.length])]))}else g[0].callback=e=>m(e,!0)}(0,n.x)(g),new a.Z("popup-delete-chat",{peerId:e,threadId:u,titleLangKey:b,titleLangArgs:y,descriptionLangKey:w,descriptionLangArgs:S,buttons:g,checkboxes:v}).show()}))}}},4524:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(9322),n=i(3512),a=i(2796),o=i(2995);class r extends o.Z{constructor(e,t){super({peerTypes:["dialogs","contacts"],onSelect:!e&&t?t:i=>{return o=this,r=void 0,l=function*(){if(t){const e=t(i);e instanceof Promise&&(yield e)}if(i!==n.Z.myId)s.ZP.setInnerPeer({peerId:i}),s.ZP.chat.input.initMessagesForward(e);else{let t=0;for(const s in e){const n=e[s];t+=n.length,this.managers.appMessagesManager.forwardMessages(i,s.toPeerId(),n)}(0,a.bC)({langPackKey:t>0?"FwdMessagesToSavedMessages":"FwdMessageToSavedMessages"})}},new((d=void 0)||(d=Promise))((function(e,t){function i(e){try{n(l.next(e))}catch(e){t(e)}}function s(e){try{n(l.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof d?n:new d((function(e){e(n)}))).then(i,s)}n((l=l.apply(o,r||[])).next())}));var o,r,d,l},placeholder:"ShareModal.Search.ForwardPlaceholder",chatRightsAction:"send_messages",selfPresence:"ChatYourSelf"})}}},1168:(e,t,i)=>{"use strict";i.d(t,{Z:()=>L,x:()=>E});var s=i(1405),n=i(5814),a=i(6385),o=i(2325),r=i(8497),d=i(8799),l=i(3699),c=i(2738),h=i(6299),u=i(3910),p=i(3241),f=i(6733),m=i(1655),g=i(3815),v=i(8805),b=i(3624),y=i(8115);const w=document.body;let S=w;const C=()=>{S=(0,f.W7)()||w,L.reAppend()};(0,f.Ms)(w,C);class L extends p.Z{constructor(e,t={}){if(super(!1),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.Z.backByItem(this.navigationItem)},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"),(t.title||t.titleRaw)&&(this.title.classList.add("popup-title"),"string"==typeof t.title?(0,o.$d)(this.title,t.title):t.titleRaw&&this.title.append((0,y.Z)(t.titleRaw)),this.header.append(this.title)),this.middlewareHelper=(0,b.k)(),this.listenerSetter=new l.Z,this.managers=L.MANAGERS,this.confirmShortcutIsSendShortcut=t.confirmShortcutIsSendShortcut,t.closable&&(this.btnClose=document.createElement("span"),this.btnClose.classList.add("btn-icon","popup-close","tgico-close"),this.header.prepend(this.btnClose),(0,c.fc)(this.btnClose,this.hide,{listenerSetter:this.listenerSetter,once:!0})),this.withoutOverlay=t.withoutOverlay,this.withoutOverlay&&this.element.classList.add("no-overlay"),t.overlayClosable&&(0,c.fc)(this.element,(e=>{(0,r.Z)(e.target,"popup-container")||this.hide()}),{listenerSetter:this.listenerSetter}),t.withConfirm&&(this.btnConfirm=document.createElement("button"),this.btnConfirm.classList.add("btn-primary","btn-color-primary"),!0!==t.withConfirm&&this.btnConfirm.append((0,o.ag)(t.withConfirm)),this.header.append(this.btnConfirm),(0,s.Z)(this.btnConfirm)),this.container.append(this.header),t.body&&(this.body=document.createElement("div"),this.body.classList.add("popup-body"),this.container.append(this.body)),t.scrollable){const e=this.scrollable=new v.ZP(this.body);this.attachScrollableListeners(),this.body||this.container.insertBefore(e.container,this.header.nextSibling)}let i=this.btnConfirm;const n=this.buttons=t.buttons;if(null==n?void 0:n.length){const e=this.buttonsEl=document.createElement("div");e.classList.add("popup-buttons");const t=n.map((e=>{const t=document.createElement("button");return t.className="btn"+(e.isDanger?" danger":" primary"),e.noRipple||(0,s.Z)(t),e.text?t.textContent=e.text:t.append((0,o.ag)(e.langKey,e.langArgs)),(0,c.fc)(t,(()=>{var t;null===(t=e.callback)||void 0===t||t.call(e),this.destroy()}),{listenerSetter:this.listenerSetter,once:!0}),e.element=t}));if(!i&&2===n.length){const e=n.find((e=>!e.isCancel));e&&(i=e.element)}e.append(...t),this.container.append(e)}this.btnConfirmOnEnter=i,this.element.append(this.container),L.POPUPS.push(this)}attachScrollableListeners(e){return this.scrollable.attachBorderListeners(e)}onContentUpdate(){this.scrollable&&this.scrollable.onAdditionalScroll()}show(){this.navigationItem={type:"popup",onPop:()=>this.destroy(),onEscape:this.onEscape},a.Z.pushItem(this.navigationItem),(0,d.Z)(),S.append(this.element),this.element.offsetWidth,this.element.classList.add("active"),this.onContentUpdate(),this.withoutOverlay||(g.Z.isOverlayActive=!0,n.Z.checkAnimations2(!0)),setTimeout((()=>{this.element.classList.contains("active")&&this.listenerSetter.add(document.body)("keydown",(e=>{L.POPUPS[L.POPUPS.length-1]===this&&(this.confirmShortcutIsSendShortcut?(0,h.Z)(e):"Enter"===e.key)&&((0,c.tH)(this.btnConfirmOnEnter),(0,u.Z)(e))}))}),0)}destroy(){this.dispatchEvent("close"),this.element.classList.add("hiding"),this.element.classList.remove("active"),this.listenerSetter.removeAll(),this.middlewareHelper.destroy(),this.withoutOverlay||(g.Z.isOverlayActive=!1),a.Z.removeItem(this.navigationItem),this.navigationItem=void 0,(0,m.Z)(L.POPUPS,this),C(),setTimeout((()=>{var e;this.element.remove(),this.dispatchEvent("closeAfterTimeout"),this.cleanup(),null===(e=this.scrollable)||void 0===e||e.destroy(),this.withoutOverlay||n.Z.checkAnimations2(!1)}),150)}static reAppend(){this.POPUPS.forEach((e=>{const{element:t,container:i}=e,s=t.parentElement;s&&s!==S&&S!==i&&S.append(t)}))}static getPopups(e){return this.POPUPS.filter((t=>t instanceof e))}static createPopup(e,...t){return new e(...t)}}L.POPUPS=[];const E=e=>(e.find((e=>e.isCancel))||e.push({langKey:"Cancel",isCancel:!0}),e)},3186:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(3035),n=i(9322),a=i(2325),o=i(3512),r=i(8127);const d={pin:{title:"LimitReached",description:"LimitReachedPinDialogs",descriptionPremium:"LimitReachedPinDialogsPremium",descriptionLocked:"LimitReachedPinDialogsLocked",icon:"limit_pin"},folders:{title:"LimitReached",description:"LimitReachedFolders",descriptionPremium:"LimitReachedFoldersPremium",descriptionLocked:"LimitReachedFoldersLocked",icon:"limit_folders"}};class l extends r.Z{constructor(e,t){super("popup-limit",{buttons:void 0===e.isPremium?[{langKey:"LimitReached.Ok",isCancel:!0}]:e.isPremium?[{langKey:"OK",isCancel:!0}]:[{langKey:"IncreaseLimit",callback:()=>{n.ZP.openPremiumBot()},noRipple:!0},{langKey:"Cancel",isCancel:!0}],descriptionLangKey:void 0===e.isPremium?t.descriptionLocked:e.isPremium?t.descriptionPremium:t.description,descriptionLangArgs:e.isPremium?[e.limitPremium]:[e.limit,e.limitPremium],titleLangKey:t.title});const i=void 0===e.isPremium;if(i)this.element.classList.add("is-locked");else if(e.isPremium)this.element.classList.add("is-premium");else{const e=this.buttons.find((e=>!e.isCancel));e.element.classList.add("popup-limit-button");const t=document.createElement("i");t.classList.add("popup-limit-button-icon","tgico-premium_double"),e.element.append(t)}const r=document.createElement("div");r.classList.add("popup-limit-line");const d=document.createElement("div");d.classList.add("popup-limit-hint");const l=document.createElement("span");if(l.classList.add("popup-limit-hint-icon","tgico-"+t.icon),d.append(l,""+(e.isPremium?e.limitPremium:e.limit)),r.append(d),!i){const t=document.createElement("div");t.classList.add("limit-line");const i=document.createElement("div");i.classList.add("limit-line-free");const s=document.createElement("div");s.classList.add("limit-line-premium"),t.append(i,s),(0,a.$d)(i,"LimitFree"),s.append((0,a.ag)("LimitPremium"),""+e.limitPremium),r.append(t)}this.container.insertBefore(r,this.description);const c=()=>{d.classList.add("active")};o.Z.settings.animationsEnabled?(0,s.d1)().then(c):c()}}function c(e){return function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))}(this,void 0,void 0,(function*(){const t=d[e],[i,s,n]=yield Promise.all([o.Z.managers.apiManager.getAppConfig(),...[!1,!0].map((t=>o.Z.managers.apiManager.getLimit(e,t)))]),a=i.premium_purchase_blocked;new l({isPremium:a?void 0:o.Z.premium,limit:s,limitPremium:n},t).show()}))}},3897:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(7298),n=i(1507),a=i(7479),o=i(8127);const r=[{value:3600,langPackKey:"ChatList.Mute.1Hour"},{value:14400,langPackKey:"ChatList.Mute.4Hours"},{value:28800,langPackKey:"ChatList.Mute.8Hours"},{value:86400,langPackKey:"ChatList.Mute.1Day"},{value:259200,langPackKey:"ChatList.Mute.3Days"},{value:-1,langPackKey:"ChatList.Mute.Forever",checked:!0}];class d extends o.Z{constructor(e,t){let i;super("popup-mute",{peerId:e,titleLangKey:"Notifications",buttons:[{langKey:"ChatList.Context.Mute",callback:()=>{this.managers.appMessagesManager.mutePeer({peerId:e,muteUntil:-1===i?n.rU:(0,s.Z)(!0)+i,threadId:t})}}],body:!0});const o=(0,a.ZC)(r,(e=>{i=+e}));this.body.append(o),this.show()}}},8127:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(9331),n=i(1168),a=i(2325),o=i(9807),r=i(130);class d extends n.Z{constructor(e,t={}){if(super("popup-peer"+(e?" "+e:""),Object.assign(Object.assign({overlayClosable:!0},t),{title:!0,buttons:t.buttons&&(0,n.x)(t.buttons)})),this.className=e,t.peerId){const e=new s.Z;e.classList.add("avatar-32"),e.updateWithOptions({isDialog:!0,peerId:t.peerId,threadId:t.threadId,wrapOptions:{middleware:this.middlewareHelper.get()}}),this.header.prepend(e)}t.noTitle||(t.titleLangKey||!t.title?this.title.append((0,a.ag)(t.titleLangKey||"AppName",t.titleLangArgs)):t.title instanceof HTMLElement?this.title.append(t.title):this.title.innerText=t.title||"");const i=document.createDocumentFragment();if(t.descriptionLangKey||t.description){const e=this.description=document.createElement("p");e.classList.add("popup-description"),t.descriptionLangKey?e.append((0,a.ag)(t.descriptionLangKey,t.descriptionLangArgs)):t.description&&(0,r.Z)(e,t.description),i.append(e)}t.checkboxes&&(this.container.classList.add("have-checkbox"),t.checkboxes.forEach((e=>{e.withRipple=!0;const t=new o.Z(e);e.checkboxField=t,i.append(t.label)})),t.buttons.forEach((e=>{if(e.callback){const i=e.callback;e.callback=()=>{const e=new Set;t.checkboxes.forEach((t=>{t.checkboxField.checked&&e.add(t.text)})),i(e)}}}))),this.container.insertBefore(i,this.header.nextElementSibling)}}},2995:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(5432),n=i(5644),a=i(1168);class o extends a.Z{constructor(e){super("popup-forward",{closable:!0,overlayClosable:!0,body:!0,title:!0}),this.selector=new n.Z({appendTo:this.body,onChange:()=>{return t=this,i=void 0,n=function*(){const t=this.selector.getSelected(),i=t[t.length-1].toPeerId();if(e.onSelect){const t=e.onSelect(i);if(t instanceof Promise)try{yield t}catch(e){return}}this.selector=null,this.hide()},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n},peerType:e.peerTypes,onFirstRender:()=>{this.show(),this.selector.checkForTriggers(),s.Z||this.selector.input.focus()},chatRightsAction:e.chatRightsAction,multiSelect:!1,rippleEnabled:!1,avatarSize:"abitbigger",peerId:e.peerId,placeholder:e.placeholder,selfPresence:e.selfPresence,managers:this.managers}),this.scrollable=this.selector.scrollable,this.attachScrollableListeners(),this.title.append(this.selector.input)}}},1962:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(8127);class n extends s.Z{constructor(e,t,i){super("popup-delete-chat",{title:`Send Message${t.length>1?"s":""} Now`,description:t.length>1?"Send "+t.length+" messages now?":"Send message now?",buttons:[{langKey:"Send",callback:()=>{i&&i(),this.managers.appMessagesManager.sendScheduledMessages(e,t)}}]}),this.show()}}},6787:(e,t,i)=>{"use strict";i.d(t,{Z:()=>P});var s=i(1168),n=i(3541),a=i(2153),o=i(279),r=i(5814),d=i(9322),l=i(4755),c=i(2325),h=i(4494),u=i(8497),p=i(1656),f=i(2738),m=i(2796),g=i(130),v=i(8115),b=i(3163),y=i(9259),w=i(7479),S=i(5565),C=i(3512),L=i(9083),E=i(3173),I=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const M="STICKERS-POPUP";class P extends s.Z{constructor(e,t){super("popup-stickers",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:!0}),this.stickerSetInput=e,this.isEmojis=t,this.onStickersClick=e=>I(this,void 0,void 0,(function*(){const t=(0,u.Z)(e.target,"sticker-set-sticker");if(!t)return;const i=t.dataset.docId;(yield d.ZP.chat.input.sendMessageWithDocument(i))&&this.hide()})),this.title.append((0,c.ag)("Loading")),this.updateAdded={},E.ZP.setIgnoreMouseOut("popup",!0),this.addEventListener("close",(()=>{E.ZP.setIgnoreMouseOut("popup",!1),r.Z.setOnlyOnePlayableGroup()})),this.appendTo=this.scrollable.container,this.appendTo.classList.add("is-loading"),(0,o.y)(this.appendTo,!0),this.stickersFooter=document.createElement("div"),this.stickersFooter.classList.add("sticker-set-footer");const i=(0,h.Z)("btn-primary btn-primary-transparent disable-hover",{noRipple:!0,text:"Loading"});this.stickersFooter.append(i),this.body.append(this.stickersFooter),(0,y.Z)({listenTo:this.appendTo,listenerSetter:this.listenerSetter});const s=e=>{const t=this.sets.findIndex((t=>t.id===e.id));if(-1===t)return;this.sets[t]=e;const i=this.updateAdded[e.id];null==i||i(!!e.installed_date),this.updateButton()};this.listenerSetter.add(C.Z)("stickers_installed",s),this.listenerSetter.add(C.Z)("stickers_deleted",s),this.loadStickerSet()}createStickerSetElements(e){const t=document.createElement("div");let i,s;t.classList.add("sticker-set"),e&&(i=new w.ZP({title:(0,v.Z)(e.title),subtitle:(0,c.ag)(e.pFlags.emojis?"EmojiCount":"Stickers",[e.count]),buttonRight:!0}),s=e=>{(0,S.Z)(i.buttonRight,(0,c.ag)(e?"Stickers.SearchAdded":"Stickers.SearchAdd")),i.buttonRight.classList.toggle("active",e)},s(!!e.installed_date),t.append(i.container));const n=document.createElement("div");return n.classList.add("sticker-set-stickers"),t.append(n),{container:t,headerRow:i,updateAdded:s,itemsContainer:n}}loadStickerSet(){var e;return I(this,void 0,void 0,(function*(){const t=this.middlewareHelper.get(),i=(Array.isArray(this.stickerSetInput)?this.stickerSetInput:[this.stickerSetInput]).map((e=>this.managers.appStickersManager.getStickerSet(e)));let s=yield Promise.all(i);if(!t())return;let o=s[0];if(1===s.length&&!o)return(0,m.bC)({langPackKey:this.isEmojis?"AddEmojiNotFound":"StickerSet.DontExist"}),void this.hide();s=s.filter(Boolean),o=s[0],this.sets=s.map((e=>e.set));const d=null!==(e=this.isEmojis)&&void 0!==e?e:this.isEmojis=!!o.set.pFlags.emojis;if(!d){(0,f.fc)(this.appendTo,this.onStickersClick,{listenerSetter:this.listenerSetter});const{destroy:e}=(0,b.Z)({listenTo:this.appendTo,isStickerPack:!0,onSend:()=>this.hide()});this.addEventListener("close",e)}r.Z.setOnlyOnePlayableGroup(M);const u=new a.Z,y=[],w=s.map((e=>I(this,void 0,void 0,(function*(){const{container:i,itemsContainer:a,headerRow:o,updateAdded:r}=this.createStickerSetElements(s.length>1?e.set:void 0);let c;o&&(0,f.fc)(o.buttonRight,(()=>{this.managers.appStickersManager.toggleStickerSet(e.set)}),{listenerSetter:this.listenerSetter}),this.updateAdded[e.set.id]=r;const h=e.documents.filter((e=>"document"===(null==e?void 0:e._)));if(d){const e=(0,L.Z)({docIds:h.map((e=>e.id)),loadPromises:y,animationGroup:M,customEmojiSize:l.Z.active.esgCustomEmoji,middleware:t});Array.from(e.children).slice(1).forEach((e=>{const t=document.createElement("span");t.classList.add("super-emoji"),e.replaceWith(t),t.append(e)})),c=[e],a.classList.replace("sticker-set-stickers","super-emojis"),a.classList.add("is-emojis","not-local")}else c=yield Promise.all(h.map((e=>I(this,void 0,void 0,(function*(){const i=document.createElement("div");i.classList.add("sticker-set-sticker");const s=l.Z.active.popupSticker.width;return yield(0,n.ZP)({doc:e,div:i,lazyLoadQueue:u,group:M,play:!0,loop:!0,width:s,height:s,withLock:!0,loadPromises:y,middleware:t}),i})))));return a.append(...c.filter(Boolean)),i})))),S=yield Promise.all(w);yield Promise.all(y);const C=this.button=(0,h.Z)("",{noRipple:!0});this.updateButton(),(0,f.fc)(C,(()=>{const e=(0,p.Z)([C],!0);this.managers.appStickersManager.toggleStickerSets(s.map((e=>e.set))).then((()=>{this.hide()})).catch((()=>{e()}))}),{listenerSetter:this.listenerSetter}),1===s.length?(0,g.Z)(this.title,(0,v.Z)(o.set.title)):(0,g.Z)(this.title,(0,c.ag)("Emoji")),this.stickersFooter.textContent="",this.stickersFooter.append(C),this.appendTo.classList.remove("is-loading"),this.appendTo.textContent="",this.appendTo.append(...S),this.scrollable.onAdditionalScroll()}))}updateButton(){const{sets:e,isEmojis:t}=this;let i,s;if(1===e.length){const n=e[0];s=(0,c.ag)(t?"EmojiCount":"Stickers",[n.count]),i=!n.installed_date}else{const t=e.filter((e=>e.installed_date));let n;e.length===t.length?(i=!1,n=e.length):(i=!0,n=e.length-t.length),s=(0,c.ag)("EmojiPackCount",[n])}this.button.className=i?"btn-primary btn-color-primary":"btn-primary btn-primary-transparent danger",(0,S.Z)(this.button,(0,c.ag)(i?"AddStickersCount":"RemoveStickersCount",[s]))}}},3442:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l});var s=i(9099),n=i(3035),a=i(3910),o=i(2738),r=i(8487),d=i(5953);class l{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=>{var t,i,s;e&&(0,a.Z)(e),this.preloader.classList.contains("manual")?null===(t=this.loadFunc)||void 0===t||t.call(this,e):null===(s=null===(i=this.promise)||void 0===i?void 0:i.cancel)||void 0===s||s.call(i)},e&&(0,d.Z)(this,e),this.isUpload&&(this.tryAgainOnFail=!1)}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&&(0,o.fc)(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,i=Date.now(),s=s=>{if(e.notify=e.notifyAll=null,t!==this.tempId)return;const a=Date.now()-i;if(!s&&this.cancelable){this.setProgress(100);const e=150;a{t===this.tempId&&this.detach()}),e)}else this.tryAgainOnFail?(this.attach(this.preloader.parentElement),(0,n.T2)((()=>{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 i=e.done/e.total*100;this.setProgress(i)}))}attach(e,t=!1,i){var n;null===(n=this.construct)||void 0===n||n.call(this),this.preloader.parentElement&&this.preloader.classList.remove("manual"),this.detached=!1,i&&this.attachPromise(i);let a=0;(this.detached||this.preloader.parentElement!==e)&&(a=(0,r.Z)(this.preloader)?1:2,this.preloader.parentElement!==e&&e[this.attachMethod](this.preloader)),(0,s.Z)({element:this.preloader,className:"is-visible",forwards:!0,duration:200,useRafs:a}),this.cancelable&&t&&this.setProgress(0)}detach(){var e;this.detached||(this.detached=!0,(null===(e=this.preloader)||void 0===e?void 0:e.parentElement)&&(0,s.Z)({element:this.preloader,className:"is-visible",forwards:!1,duration:200,onTransitionEnd:()=>{this.preloader.remove()},useRafs:1}))}setProgress(e){if(this.totalLength||(0,r.Z)(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=""}}},9931:(e,t,i)=>{"use strict";i.d(t,{Z:()=>b,Y:()=>g});var s=i(4059),n=i(6740),a=i(5565),o=i(130),r=i(9674),d=i(5990),l=i(7256),c=i(1507),h=i(5798),u=i(3512),p=i(9345),f=i(319),m=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function g(e,t,i,o,d=new Image,l=!1){return m(this,void 0,void 0,(function*(){const l=yield u.Z.managers.acknowledged.appAvatarsManager.loadAvatar(t,i,o),c=l.result,h=l.cached;let p,m,v;if(d.classList.add("avatar-photo"),h)m=()=>{(0,a.Z)(e,d),e.dataset.color=""};else{const l=u.Z.settings.animationsEnabled;l&&d.classList.add("fade-in");let c=!1;if("photo_big"===o){const s=yield g(e,t,i,"photo_small");p=s.loadThumbPromise||s.loadPromise,v=s.thumbImage}else if(i.stripped_thumb){v=new Image,e.classList.add("avatar-relative"),v.classList.add("avatar-photo","avatar-photo-thumbnail");const t=(0,s.Z)(i.stripped_thumb);p=(0,n.cj)(v,t).then((()=>{c||(0,a.Z)(e,v)}))}m=()=>{c=!0,v?e.append(d):(0,a.Z)(e,d),setTimeout((()=>{e.childElementCount&&r.Z.mutateElement(d,(()=>{e.dataset.color="",l&&d.classList.remove("fade-in"),null==v||v.remove()}))}),l?200:0)}}const b=c.then((e=>(0,n.cj)(d,e))).then(m);return p&&(yield p.catch(f.Z)),{cached:h,loadPromise:b,loadThumbPromise:h?b:p||Promise.resolve(),thumbImage:v}}))}function v(e,t,i,s,n,a){(0,o.Z)(e,t),e.dataset.color=i,e.classList.remove("tgico-saved","tgico-deletedaccount","tgico-reply_filled","is-forum","is-topic"),s&&e.classList.add(s),n&&e.classList.add("is-forum"),a&&e.classList.add("is-topic")}function b({div:e,peerId:t,isDialog:i=!1,title:s="",onlyThumb:n=!1,isBig:a,threadId:o,wrapOptions:r={}}){var f,b;return m(this,void 0,void 0,(function*(){const m=u.Z.myId;if(t===m&&i)return void v(e,"","","tgico-saved");const y=u.Z.managers;if(o){const i=yield y.dialogsStorage.getForumTopic(t,o);return v(e,"","",void 0,void 0,!0),r.customEmojiSize&&e.style.setProperty("--size",r.customEmojiSize.width+"px"),(0,p.e)(Object.assign(Object.assign({},r),{topic:i,lazyLoadQueue:!1})).then((t=>{e.replaceChildren(t)}))}const w=yield y.appPeersManager.getPeer(t);if(t!==c.NM&&t.isUser()&&(null===(f=null==w?void 0:w.pFlags)||void 0===f?void 0:f.deleted))return void v(e,"",(0,d.Z)(t),"tgico-deletedaccount");const S=!!(null===(b=null==w?void 0:w.pFlags)||void 0===b?void 0:b.forum),C=a?"photo_big":"photo_small",L=(0,l.Z)(w),E=!!L,I=!!e.firstElementChild&&!e.firstElementChild.classList.contains("emoji");if(!E||!I||!(yield y.appAvatarsManager.isAvatarCached(t,C))){let n="";if(!t||t===m&&i||(n=(0,d.Z)(t)),t===c.hj)return void v(e,"",n,"tgico-reply_filled");const a=s?(0,h.Z)(s):function(e){var t;let i="";return e&&(i=null!==(t=e.title)&&void 0!==t?t:[e.first_name,e.last_name].filter(Boolean).join(" ")),(0,h.Z)(i)}(w);v(e,a,n,"",S)}return E?g(e,t,L,C,void 0,n):void 0}))}},279:(e,t,i)=>{"use strict";function s(e,t=!1){const i='\n \n \n ';if(t){const t=document.createElement("div");return t.classList.add("preloader"),t.innerHTML=i,e&&e.appendChild(t),t}return e.insertAdjacentHTML("beforeend",i),e.lastElementChild}function n(e,t="check"){return e.classList.remove("tgico-"+t),e.disabled=!0,s(e),()=>{e.innerHTML="",e.classList.add("tgico-"+t),e.removeAttribute("disabled")}}i.d(t,{p:()=>n,y:()=>s}),i(410).GO.putPreloader=s},1218:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(9750),n=i(2325),a=i(3855),o=i(3512);class r{constructor(e){const t=this.label=document.createElement("label");t.classList.add("radio-field"),e.alignRight&&t.classList.add("radio-field-right");const i=this.input=document.createElement("input");i.type="radio",i.name="input-radio-"+e.name,e.value&&(i.value=e.value,e.stateKey&&(a.Z.getState().then((t=>{i.checked=(0,s.Z)(t,e.stateKey)===e.value})),i.addEventListener("change",(()=>{o.Z.managers.appStateManager.setByKey(e.stateKey,e.value)}))));const r=this.main=document.createElement("div");r.classList.add("radio-field-main"),e.text?r.innerHTML=e.text:e.langKey&&(0,n.$d)(r,e.langKey),t.append(i,r)}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}}},5133:(e,t,i)=>{"use strict";function s(e,t){const i=document.createElement("form");return e.forEach((e=>{const{container:s,input:n}=e;i.append(s),n.addEventListener("change",(e=>{n.checked&&t(n.value,e)}))})),i}i.d(t,{Z:()=>s})},65:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(5077),n=i(3228),a=i(5953);class o{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)},(0,a.Z)(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 i=this.seek=document.createElement("input");i.classList.add("progress-line__seek"),i.type="range",i.step=""+this.step,i.min=""+this.min,i.max=""+this.max,i.value=""+t,t&&this.setProgress(t);const s=""+this.step,n=s.indexOf(".");this.decimals=-1===n?0:s.length-n-1,this.container.append(this.filled,i)}get value(){return+this.seek.value}setHandlers(e){this.events=e}setListeners(){this.seek.addEventListener("input",this.onInput),this._removeListeners=(0,s.Z)(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=(0,n.Z)(t,0,1),this.useTransform?this.filled.style.transform=`scaleX(${t})`:this.filled.style.width=100*t+"%"}scrub(e){var t;const i=this.vertical?this.rect.height:this.rect.width,s=(0,n.Z)(this.vertical?-(e.y-this.rect.bottom):e.x-this.rect.left,0,i);let a=this.min+s/i*(this.max-this.min);return a-this.min<(this.max-this.min)/2&&(a-=this.step/10),a=+a.toFixed(this.decimals),a=(0,n.Z)(a,this.min,this.max),this.setProgress(a),(null===(t=this.events)||void 0===t?void 0:t.onScrub)&&this.events.onScrub(a),a}removeListeners(){this._removeListeners&&(this._removeListeners(),this._removeListeners=null),this.seek.removeEventListener("input",this.onInput),this.events={}}}},1405:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(8497),n=i(9674),a=i(5432),o=i(3512),r=i(5975),d=i(3035);let l=0;function c(e,t=(()=>Promise.resolve()),i=null,c=!1,h=e){if(e.querySelector(".c-ripple"))return;e.classList.add("rp");const u=document.createElement("div");let p;u.classList.add("c-ripple"),e.classList.contains("rp-square")&&u.classList.add("is-square"),e[c?"prepend":"append"](u);const f=(e,s)=>{const o=Date.now(),r=document.createElement("div"),c=l++,h=1e3*+window.getComputedStyle(u).getPropertyValue("--ripple-duration").replace("s",""),f=p=()=>{const e=Date.now()-o,t=()=>{n.Z.mutate((()=>{r.remove()})),null==i||i(c)};if(er.classList.add("hiding")),Math.max(i-h/2,0)),setTimeout(t,i)}else r.classList.add("hiding"),setTimeout(t,h/2);a.Z||(window.removeEventListener("contextmenu",p),window.removeEventListener("mousemove",p)),p=null,g=!1};null==t||t(c),(0,d.T2)((()=>{if(f!==p)return;const t=u.getBoundingClientRect();r.classList.add("c-ripple__circle");const i=e-t.left,n=s-t.top,a=Math.sqrt(Math.pow(Math.abs(n-t.height/2)+t.height/2,2)+Math.pow(Math.abs(i-t.width/2)+t.width/2,2)),o=i-a/2,d=n-a/2;r.style.width=r.style.height=a+"px",r.style.left=o+"px",r.style.top=d+"px",u.append(r)}))},m=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||(0,s.Z)(t.target,"c-ripple")!==u)&&(h===e||!(0,r.Z)(t.target,h));let g=!1;if(a.Z){const e=()=>{null==p||p()};h.addEventListener("touchstart",(t=>{if(!o.Z.settings.animationsEnabled)return;if(t.touches.length>1||g||m(t))return;g=!0;const{clientX:i,clientY:s}=t.touches[0];f(i,s),h.addEventListener("touchend",e,{once:!0}),window.addEventListener("touchmove",(t=>{t.cancelBubble=!0,t.stopPropagation(),e(),h.removeEventListener("touchend",e)}),{once:!0})}),{passive:!0})}else h.addEventListener("mousedown",(e=>{if(![0,2].includes(e.button))return;if(!o.Z.settings.animationsEnabled)return;if("0"===h.dataset.ripple||m(e))return;if(g)return void(g=!1);const{clientX:t,clientY:i}=e;f(t,i),window.addEventListener("mouseup",p,{once:!0,passive:!0}),window.addEventListener("contextmenu",p,{once:!0,passive:!0})}),{passive:!0})}},7479:(e,t,i)=>{"use strict";i.d(t,{De:()=>g,ZC:()=>v,ZP:()=>f,tG:()=>m});var s=i(9807),n=i(1218),a=i(1405),o=i(5133),r=i(2325),d=i(5565),l=i(130),c=i(2738),h=i(4494),u=i(4531);const p=(e,t)=>{!0===t||("string"==typeof t?(0,l.Z)(e,t):e.append(t))};class f{constructor(e={}){this.freezed=!1,e.checkboxFieldOptions&&(e.checkboxField=new s.Z(Object.assign({listenerSetter:e.listenerSetter},e.checkboxFieldOptions)));const t=e.asLink?"a":e.radioField||e.checkboxField?"label":"div";if(this.container=document.createElement(t),this.container.classList.add("row","no-subtitle"),e.noWrap&&this.container.classList.add("no-wrap"),e.subtitle){const t=this.subtitle;if(p(t,e.subtitle),e.noWrap&&t.classList.add("no-wrap"),e.subtitleRight){this.container.append(this.subtitleRow=this.createRow()),this.subtitleRow.classList.add("row-subtitle-row");const i=this.subtitleRight=document.createElement("div");i.classList.add("row-subtitle","row-subtitle-right"),p(i,e.subtitleRight),this.subtitleRow.append(t,i)}}else e.subtitleLangKey&&this.subtitle.append((0,r.ag)(e.subtitleLangKey,e.subtitleLangArgs));let i=!!e.havePadding;if(e.radioField||e.checkboxField){if(e.radioField&&(this.radioField=e.radioField,this.container.append(this.radioField.label),i=!0),e.checkboxField){this.checkboxField=e.checkboxField;const t=e.checkboxField.label.classList.contains("checkbox-field-toggle");if(t?(this.container.classList.add("row-with-toggle"),e.titleRight=this.checkboxField.label):(i=!0,this.container.append(this.checkboxField.label)),e.withCheckboxSubtitle&&!t){const t=()=>{(0,d.Z)(this.subtitle,(0,r.ag)(this.checkboxField.input.checked?"Checkbox.Enabled":"Checkbox.Disabled"))};e.listenerSetter?e.listenerSetter.add(this.checkboxField.input)("change",t):this.checkboxField.input.addEventListener("change",t)}}(e.radioField||e.checkboxField).label.classList.add("disable-hover")}if(e.title||e.titleLangKey){let t;const i=e.titleRight||e.titleRightSecondary;if(i?(this.container.append(t=this.titleRow=this.createRow()),this.titleRow.classList.add("row-title-row")):t=this.container,this.title=this.createTitle(),e.noWrap&&this.title.classList.add("no-wrap"),e.title?p(this.title,e.title):e.titleLangKey&&this.title.append((0,r.ag)(e.titleLangKey)),t.append(this.title),i){const s=this.titleRight=document.createElement("div");s.classList.add("row-title","row-title-right"),e.titleRightSecondary&&s.classList.add("row-title-right-secondary"),p(s,i),t.append(s)}}e.icon&&(i=!0,this.container.classList.add("tgico","tgico-"+e.icon),this.container.classList.add("row-with-icon")),i&&this.container.classList.add("row-with-padding"),e.navigationTab&&(e.clickable=()=>e.navigationTab.open()),(e.clickable||e.radioField||e.checkboxField)&&("function"==typeof e.clickable&&(0,c.fc)(this.container,(t=>{this.freezed||e.clickable(t)}),{listenerSetter:e.listenerSetter}),this.container.classList.add("row-clickable","hover-effect"),e.noRipple||(0,a.Z)(this.container,void 0,void 0,!0)),(e.buttonRight||e.buttonRightLangKey)&&(this.buttonRight=e.buttonRight instanceof HTMLElement?e.buttonRight:(0,h.Z)("btn-primary btn-color-primary",{text:e.buttonRightLangKey}),this.container.append(this.buttonRight)),e.contextMenu&&(0,u.Z)(Object.assign(Object.assign({},e.contextMenu),{listenTo:this.container,listenerSetter:e.listenerSetter}))}get subtitle(){var e;return null!==(e=this._subtitle)&&void 0!==e?e:this._subtitle=this.createSubtitle()}get midtitle(){var e;return null!==(e=this._midtitle)&&void 0!==e?e:this._midtitle=this.createMidtitle()}createRow(){const e=document.createElement("div");return e.classList.add("row-row"),e}createTitle(){const e=document.createElement("div");return e.classList.add("row-title"),(0,l.m)(e),e}createSubtitle(){const e=document.createElement("div");return e.classList.add("row-subtitle"),(0,l.m)(e),this.title?this.title.after(e):this.container.prepend(e),this.container.classList.remove("no-subtitle"),e}createMidtitle(){const e=document.createElement("div");return e.classList.add("row-midtitle"),this.subtitle.parentElement.insertBefore(e,this.subtitle),e}createMedia(e){const t=document.createElement("div");return this.applyMediaElement(t,e)}applyMediaElement(e,t){return this.container.classList.add("row-with-padding"),this.media=e,e.classList.add("row-media"),t&&e.classList.add("row-media-"+t),this.container.append(e),e}disableWithPromise(e){this.container.classList.add("is-disabled"),e.finally((()=>{this.container.classList.remove("is-disabled")}))}makeSortable(){const e=document.createElement("span");this.container.classList.add("row-sortable","tgico"),e.classList.add("row-sortable-icon","tgico-menu"),this.container.append(e)}toggleSorting(e){this.container.classList.toggle("cant-sort",!e)}}const m=e=>new f({checkboxField:e,listenerSetter:e.listenerSetter}),g=(e,t)=>(0,o.Z)(e.map((e=>({container:e.container,input:e.radioField.input}))),t),v=(e,t)=>{const i="name-"+(8388607*Math.random()|0);let s;const a=e.map((({langPackKey:e,value:t,checked:a})=>{const o=new f({radioField:new n.Z({langKey:e,name:i,value:""+t})});return a&&(s=o.radioField),o})),o=g(a,t);return s&&(s.checked=!0),o}},8805:(e,t,i)=>{"use strict";i.d(t,{ZP:()=>l,v7:()=>c});var s=i(5432),n=i(5003),a=i(4789),o=i(8594),r=i(3910);class d{constructor(e,t="",i=document.createElement("div")){this.el=e,this.container=i,this.onScrollMeasure=0,this.lastScrollPosition=0,this.lastScrollDirection=0,this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation=!1,this.onScroll=()=>{if(this.isHeavyAnimationInProgress)return this.cancelMeasure(),void(this.needCheckAfterAnimation=!0);(this.onScrolledTop||this.onScrolledBottom||this.splitUp||this.onAdditionalScroll)&&(this.onScrollMeasure||(this.onScrollMeasure=window.setTimeout((()=>{this.onScrollMeasure=0;const e=this.container[this.scrollProperty];this.lastScrollDirection=this.lastScrollPosition===e?0:this.lastScrollPositionthis.container.append(e))),e.append(this.container))}addScrollListener(){this.addedScrollListener||(this.addedScrollListener=!0,this.container.addEventListener("scroll",this.onScroll,{passive:!0,capture:!0}))}removeScrollListener(){this.addedScrollListener&&(this.addedScrollListener=!1,this.container.removeEventListener("scroll",this.onScroll,{capture:!0}))}setListeners(){this.removeHeavyAnimationListener||(window.addEventListener("resize",this.onScroll,{passive:!0}),this.addScrollListener(),this.removeHeavyAnimationListener=(0,o.ZP)((()=>{this.isHeavyAnimationInProgress=!0,this.onScrollMeasure&&(this.cancelMeasure(),this.needCheckAfterAnimation=!0)}),(()=>{this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation&&(this.onScroll(),this.needCheckAfterAnimation=!1)})))}removeListeners(){this.removeHeavyAnimationListener&&(window.removeEventListener("resize",this.onScroll),this.removeScrollListener(),this.removeHeavyAnimationListener(),this.removeHeavyAnimationListener=void 0)}destroy(){this.removeListeners(),this.onAdditionalScroll=void 0,this.onScrolledTop=void 0,this.onScrolledBottom=void 0}append(...e){this.container.append(...e)}scrollIntoViewNew(e){return(0,a.Z)(Object.assign(Object.assign({},e),{container:this.container}))}cancelMeasure(){this.onScrollMeasure&&(clearTimeout(this.onScrollMeasure),this.onScrollMeasure=0)}}class l extends d{constructor(e,t="",i=300,s){super(e,t),this.onScrollOffset=i,this.loadedAll={top:!0,bottom:!1},this.checkForTriggers=()=>{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,i=this.lastScrollPosition;this.onScrolledTop&&i<=this.onScrollOffset&&this.lastScrollDirection<=0&&this.onScrolledTop(),this.onScrolledBottom&&t-i<=this.onScrollOffset&&this.lastScrollDirection>=0&&this.onScrolledBottom()},this.container.classList.add("scrollable-y"),this.setListeners(),this.scrollProperty="scrollTop"}attachBorderListeners(e=this.container){const t=this.onAdditionalScroll;this.onAdditionalScroll=()=>{null==t||t(),e.classList.toggle("scrolled-top",!this.scrollTop),e.classList.toggle("scrolled-bottom",this.isScrolledDown)},e.classList.add("scrolled-top","scrolled-bottom","scrollable-y-bordered")}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}setScrollTopSilently(e){this.lastScrollPosition=e,this.ignoreNextScrollEvent(),this.scrollTop=e}ignoreNextScrollEvent(){this.removeHeavyAnimationListener&&(this.removeScrollListener(),this.container.addEventListener("scroll",(e=>{(0,r.Z)(e),this.addScrollListener()}),{capture:!0,passive:!1,once:!0}))}get scrollHeight(){return this.container.scrollHeight}}class c extends d{constructor(e,t="",i=300,n=15,a=document.createElement("div")){if(super(e,t,a),this.onScrollOffset=i,this.splitCount=n,this.container=a,this.container.classList.add("scrollable-x"),!s.Z){const e=e=>{!e.deltaX&&this.container.scrollWidth>this.container.clientWidth&&(this.container.scrollLeft+=e.deltaY/4,(0,r.Z)(e))};this.container.addEventListener("wheel",e,{passive:!1})}this.scrollProperty="scrollLeft"}}},5029:(e,t,i)=>{"use strict";i.d(t,{R:()=>r,Z:()=>o});var s=i(2325),n=i(36);const a="sidebar-left-section";class o{constructor(e={}){var t;const i=this.container=document.createElement("div");i.classList.add(a+"-container");const o=this.innerContainer=document.createElement("div");if(o.classList.add(a),e.noShadow&&o.classList.add("no-shadow"),e.fakeGradientDelimiter)o.append((0,n.G)()),o.classList.add("with-fake-delimiter");else if(e.noDelimiter)o.classList.add("no-delimiter");else{const e=document.createElement("hr");o.append(e)}const r=this.content=this.generateContentElement();if(e.name){const t=this.title=document.createElement("div");t.classList.add("sidebar-left-h2",a+"-name"),(0,s.XZ)({element:t,key:e.name,args:e.nameArgs}),r.append(t)}i.append(o);const d=null!==(t=e.caption)&&void 0!==t?t:e.captionOld;if(d){const t=this.caption=this.generateContentElement();t.classList.add(a+"-caption"),e.captionOld||i.append(t),!0!==d&&(0,s.XZ)({element:t,key:d,args:e.captionArgs})}}generateContentElement(){const e=document.createElement("div");return e.classList.add(a+"-content"),this.innerContainer.append(e),e}}const r=(e,t,i)=>{const s=new o({name:t,caption:i});return e.append(s.container),s.content}},744:(e,t,i)=>{"use strict";i.d(t,{ir:()=>Gt,ZP:()=>Wt});var s=i(9322),n=i(3512),a=i(5884),o=i(9331),r=i(8805),d=i(3607),l=i(3552),c=i(426),h=i(4277),u=i(503),p=i(187),f=i(2325),m=i(8119),g=i(3061),v=i(2738),b=i(5029);class y extends l._{constructor(){super(...arguments),this.uploadAvatar=null,this.isGeoChat=!1}init(e,t=!1){this.isGeoChat=t,this.peerIds=e,this.container.classList.add("new-group-container"),this.setTitle("NewGroup"),this.avatarEdit=new p.Z((e=>{this.uploadAvatar=e}));const i=new b.Z({}),n=document.createElement("div");n.classList.add("input-wrapper"),this.groupNameInputField=new u.ZP({label:"CreateGroup.NameHolder",maxLength:128}),this.groupLocationInputField=new u.ZP({label:"ChatLocation",name:"location",canBeEdited:!1}),n.append(this.groupNameInputField.container,this.groupLocationInputField.container),this.listenerSetter.add(this.groupNameInputField.input)("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=(0,m.Z)({icon:"arrow_next"}),(0,v.fc)(this.nextBtn,(()=>{const e=this.groupNameInputField.value;let t;if(this.isGeoChat){if(!this.userLocationAddress||!this.userLocationCoords)return;t=this.managers.appChatsManager.createChannel({title:e,about:"",geo_point:Object.assign({_:"inputGeoPoint"},this.userLocationCoords),address:this.userLocationAddress,megagroup:!0}).then((e=>(this.uploadAvatar&&this.uploadAvatar().then((t=>{this.managers.appChatsManager.editPhoto(e,t)})),this.peerIds.length&&this.managers.appChatsManager.inviteToChannel(e,this.peerIds),e)))}else this.nextBtn.disabled=!0,t=this.managers.appChatsManager.createChat(e,this.peerIds.map((e=>e.toUserId()))).then((e=>(this.uploadAvatar&&this.uploadAvatar().then((t=>{this.managers.appChatsManager.editPhoto(e,t)})),e)));t&&t.then((e=>{this.close(),s.ZP.setInnerPeer({peerId:e.toPeerId(!0)})}))}),{listenerSetter:this.listenerSetter});const a=new b.Z({name:"Members",nameArgs:[this.peerIds.length]}),o=this.list=h.default.createChatList({new:!0});return a.content.append(o),i.content.append(this.avatarEdit.container,n),this.content.append(this.nextBtn),this.scrollable.append(i.container,a.container),t?(this.setTitle("NearbyCreateGroup"),this.groupLocationInputField.container.classList.remove("hide"),this.groupLocationInputField.setValueSilently(f.ZP.format("Loading",!0)),this.startLocating()):this.groupLocationInputField.container.classList.add("hide"),Promise.all(this.peerIds.map((e=>{return t=this,i=void 0,n=function*(){const{dom:t}=h.default.addDialogNew({peerId:e,container:this.list,rippleEnabled:!1,avatarSize:"abitbigger"});t.lastMessageSpan.append((0,g.Z)(yield this.managers.appUsersManager.getUser(e)))},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n})))}onCloseAfterTimeout(){this.avatarEdit.clear(),this.uploadAvatar=null,this.groupNameInputField.value="",this.groupLocationInputField.container.classList.add("hide"),this.nextBtn.disabled=!1}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 w,S=i(6360),C=i(632),L=i(410),E=i(5322),I=i(4494),M=i(6024),P=i(7479),Z=i(5565),T=i(144);function k(e){const t=[],i={users:[],chats:[]},s={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":i.chats.push(...e.chats);break;case"privacyValueAllowUsers":i.users.push(...e.users);break;case"privacyValueDisallowChatParticipants":s.chats.push(...e.chats);break;case"privacyValueDisallowUsers":s.users.push(...e.users)}})),{type:t[0],disallowPeers:s,allowPeers:i}}!function(e){e[e.Everybody=2]="Everybody",e[e.Contacts=1]="Contacts",e[e.Nobody=0]="Nobody"}(w||(w={}));const x=w;var A=i(1218),_=i(5670);class F{constructor(e){this.options=e,this.onRadioChange=e=>{e=+e,this.type=e;const t=this.options.captions[this.type],i=this.radioSection.caption;t?t instanceof HTMLElement?(0,Z.Z)(i,t):(0,f.$d)(i,t):i.innerHTML="",i.classList.toggle("hide",!t),this.exceptions&&(this.exceptions.get("allow").row.container.classList.toggle("hide",this.type===x.Everybody),this.exceptions.get("disallow").row.container.classList.toggle("hide",this.type===x.Nobody)),this.options.onRadioChange&&this.options.onRadioChange(e)},e.captions&&e.captions.reverse();const t=e.managers;this.radioSection=new b.Z({name:e.title,caption:!0}),this.radioRows=new Map;let i=[{type:x.Everybody,langKey:"PrivacySettingsController.Everbody"},{type:x.Contacts,langKey:"PrivacySettingsController.MyContacts"},{type:x.Nobody,langKey:"PrivacySettingsController.Nobody"}];e.skipTypes&&(i=i.filter((t=>!e.skipTypes.includes(t.type))));const s=(0,T.a)();i.forEach((({type:e,langKey:t})=>{const i=new P.ZP({radioField:new A.Z({langKey:t,name:s,value:""+e})});this.radioRows.set(e,i)}));const n=(0,P.De)([...this.radioRows.values()],this.onRadioChange);if(this.radioSection.content.append(n),e.appendTo&&e.appendTo.append(this.radioSection.container),!e.noExceptions){const t=(0,b.R)(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((i=>{i.row=new P.ZP(i),i.row.container.addEventListener("click",(()=>{a.then((()=>{const t=this.peerIds[i.key];e.tab.slider.createTab(_.Z).open({type:"privacy",skippable:!0,title:i.titleLangKey,placeholder:"PrivacyModal.Search.Placeholder",takeOut:e=>{t.length=0,t.push(...e),i.row.subtitle.innerHTML="",i.row.subtitle.append(...this.generateStr(this.splitPeersByType(e)))},selectedPeerIds:t})}))})),t.append(i.row.container)}))}const a=t.appPrivacyManager.getPrivacy(e.inputKey).then((i=>{const s=k(i);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",(()=>{return i=this,s=void 0,a=function*(){const i=[];switch(this.type){case x.Everybody:i.push({_:"inputPrivacyValueAllowAll"});break;case x.Contacts:i.push({_:"inputPrivacyValueAllowContacts"});break;case x.Nobody:i.push({_:"inputPrivacyValueDisallowAll"})}if(this.exceptions){const e=[["allow","inputPrivacyValueAllowChatParticipants","inputPrivacyValueAllowUsers"],["disallow","inputPrivacyValueDisallowChatParticipants","inputPrivacyValueDisallowUsers"]];for(const[s,n,a]of e){if(this.exceptions.get(s).row.container.classList.contains("hide"))continue;const e=this.peerIds[s];if(e){const s=this.splitPeersByType(e);s.chats.length&&i.push({_:n,chats:s.chats}),s.users.length&&i.push({_:a,users:yield Promise.all(s.users.map((e=>t.appUsersManager.getUserInput(e))))})}}}t.appPrivacyManager.setPrivacy(e.inputKey,i)},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}),{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?(0,f.v_)([e.users.length?(0,f.ag)("Users",[e.users.length]):null,e.chats.length?(0,f.ag)("Chats",[e.chats.length]):null].filter(Boolean),!1):[(0,f.ag)("PrivacySettingsController.AddUsers")]}}var D=i(3532);class R extends M.h{init(){return e=this,t=void 0,s=function*(){this.container.classList.add("privacy-tab","privacy-phone-number"),this.setTitle("PrivacyPhone");const e="+"+(yield this.managers.appUsersManager.getSelf()).phone,t=document.createElement("div");t.append((0,f.ag)("PrivacyPhoneInfo"),document.createElement("br"),document.createElement("br"),(0,f.ag)("PrivacyPhoneInfo4"),document.createElement("br"),(0,D.Z)({mePath:e}));const i=new F({tab:this,title:"PrivacyPhoneTitle",inputKey:"inputPrivacyKeyPhoneNumber",captions:[t,t,""],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,onRadioChange:e=>{n.setRadio(x.Everybody),n.radioSection.container.classList.toggle("hide",e!==x.Nobody)},managers:this.managers}),s="PrivacyPhoneInfo3",n=new F({tab:this,title:"PrivacyPhoneTitle2",inputKey:"inputPrivacyKeyAddedByPhone",captions:[s,s,""],noExceptions:!0,skipTypes:[x.Nobody],managers:this.managers});this.scrollable.container.insertBefore(n.radioSection.container,i.radioSection.container.nextSibling)},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var B=i(8127),N=i(5772),O=i(279);class U extends l._{init(){this.container.classList.add("two-step-verification","two-step-verification-set"),this.setTitle("TwoStepVerificationPasswordSet");const e=new b.Z({captionOld:"TwoStepVerificationPasswordSetInfo",noDelimiter:!0}),t=document.createElement("div");(0,N.Z)({emoji:"๐Ÿฅณ",div:t,width:160,height:160}),e.content.append(t);const i=e.generateContentElement(),s=document.createElement("div");s.classList.add("input-wrapper");const n=(0,I.Z)("btn-primary btn-color-primary",{text:"TwoStepVerificationPasswordReturnSettings"});(0,v.fc)(n,(e=>{this.close()})),this.slider.sliceTabsUntilTab(Ct,this),s.append(n),i.append(s),this.scrollable.container.append(e.container)}}var H=i(4489),z=i(4762);function j(e){return!z.IS_MOBILE_SAFARI||!e}var G=i(1656);class V extends l._{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 b.Z({captionOld:!0,noDelimiter:!0});(0,f.$d)(e.caption,"TwoStepAuth.ConfirmEmailCodeDesc",[this.email]);const t=document.createElement("div");(0,N.Z)({div:t,width:160,height:160,emoji:"๐Ÿ“ฌ"}),e.content.append(t);const i=e.generateContentElement(),s=document.createElement("div");s.classList.add("input-wrapper");const n=this.codeInputField=new H.Z({name:"recovery-email-code",label:"TwoStepAuth.RecoveryCode",length:this.length,onFill:e=>{d(!0),this.managers.passwordManager.confirmPasswordEmail(""+e).then((e=>{r()})).catch((e=>{switch(e.type){case"CODE_INVALID":n.input.classList.add("error"),(0,Z.Z)(n.label,(0,f.ag)("TwoStepAuth.RecoveryCodeInvalid"));break;case"EMAIL_HASH_EXPIRED":n.input.classList.add("error"),(0,Z.Z)(n.label,(0,f.ag)("TwoStepAuth.RecoveryCodeExpired"));break;default:console.error("confirm error",e)}d(!1)}))}}),a=(0,I.Z)("btn-primary btn-primary-transparent primary",{text:"TwoStepAuth.EmailCodeChangeEmail"}),o=(0,I.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"ResendCode"}),r=()=>{this.slider.createTab(U).open()},d=e=>{(0,G.Z)([n.input,a,o],e)};(0,v.fc)(a,(e=>{d(!0),this.managers.passwordManager.cancelPasswordEmail().then((e=>{this.slider.sliceTabsUntilTab($,this),this.close()}),(()=>{d(!1)}))})),(0,v.fc)(o,(e=>{d(!0);const t=(0,O.y)(o);this.managers.passwordManager.resendPasswordEmail().then((e=>{t.remove(),d(!1)}))})),s.append(n.container,a,o),i.append(s),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){j(this.isFirst)&&this.codeInputField.input.focus()}}var K=i(3910),W=i(1171);class $ extends l._{constructor(){super(...arguments),this.isFirst=!1}init(){this.container.classList.add("two-step-verification","two-step-verification-email"),this.setTitle("RecoveryEmailTitle");const e=new b.Z({captionOld:!0,noDelimiter:!0}),t=document.createElement("div");(0,N.Z)({div:t,width:160,height:160,emoji:"๐Ÿ’Œ"}),e.content.append(t);const i=e.generateContentElement(),s=document.createElement("div");s.classList.add("input-wrapper");const n=this.inputField=new u.ZP({name:"recovery-email",label:"RecoveryEmail",plainText:!0});n.input.addEventListener("keypress",(e=>{if("Enter"===e.key)return(0,K.Z)(e),d()})),n.input.addEventListener("input",(e=>{n.input.classList.remove("error")}));const a=(0,I.Z)("btn-primary btn-color-primary",{text:"Continue"}),o=(0,I.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"YourEmailSkip"}),r=()=>{this.slider.createTab(U).open()},d=()=>{const e=n.value.trim(),t=(0,W.Z)(e);if(!t||t[0].length!==e.length)return void n.input.classList.add("error");l(!0);const i=(0,O.y)(a);this.managers.passwordManager.updateSettings({hint:this.hint,currentPassword:this.plainPassword,newPassword:this.newPassword,email:e}).then((e=>{r()}),(t=>{if(t.type.includes("EMAIL_UNCONFIRMED")){const i=+t.type.match(/^EMAIL_UNCONFIRMED_(\d+)/)[1],s=this.slider.createTab(V);s.state=this.state,s.email=e,s.length=i,s.open()}else console.log("password set error",t);l(!1),i.remove()}))};(0,v.fc)(a,d);const l=e=>{e?(a.setAttribute("disabled","true"),o.setAttribute("disabled","true")):(a.removeAttribute("disabled"),o.removeAttribute("disabled"))};(0,v.fc)(o,(e=>{new B.Z("popup-skip-email",{buttons:[{langKey:"Cancel",isCancel:!0},{langKey:"YourEmailSkip",callback:()=>{l(!0),(0,O.y)(o),this.managers.passwordManager.updateSettings({hint:this.hint,currentPassword:this.plainPassword,newPassword:this.newPassword,email:""}).then((()=>{r()}),(e=>{l(!1)}))},isDanger:!0}],titleLangKey:"YourEmailSkipWarning",descriptionLangKey:"YourEmailSkipWarningText"}).show()})),s.append(n.container,a,o),i.append(s),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){j(this.isFirst)&&this.inputField.input.focus()}}var q=i(130),Q=i(8115),Y=i(4425),X=i(6830),J=i(3083),ee=i(2796);class te extends l._{init(){this.container.classList.add("two-step-verification","two-step-verification-hint"),this.setTitle("TwoStepAuth.SetupHintTitle");const e=new b.Z({noDelimiter:!0}),t=document.createElement("div");(0,N.Z)({div:t,width:160,height:160,emoji:"๐Ÿ’ก"}),e.content.append(t);const i=document.createElement("div");i.classList.add("input-wrapper");const s=this.inputField=new u.ZP({name:"hint",label:"TwoStepAuth.SetupHintPlaceholder"});s.input.addEventListener("keypress",(e=>{if("Enter"===e.key)return(0,K.Z)(e),s.value?r():d()}));const n=(e,t)=>{e&&(0,K.Z)(e);const i=t?s.value:void 0;if(i&&this.newPassword===i)return void(0,ee.Am)(f.ZP.format("PasswordAsHintError",!0));const n=this.slider.createTab($);n.state=this.state,n.plainPassword=this.plainPassword,n.newPassword=this.newPassword,n.hint=i,n.open()},a=(0,I.Z)("btn-primary btn-color-primary",{text:"Continue"}),o=(0,I.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"YourEmailSkip"}),r=e=>n(e,!0),d=e=>n(e,!1);(0,v.fc)(a,r),(0,v.fc)(o,d),i.append(s.container,a,o),e.content.append(i),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){this.inputField.input.focus()}}class ie extends l._{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 b.Z({noDelimiter:!0}),t=document.createElement("div");t.classList.add("input-wrapper");const i=this.passwordInputField=new X.Z({name:"re-enter-password",label:"PleaseReEnterPassword"}),s=new J.Z(i,157),n=(0,I.Z)("btn-primary btn-color-primary",{text:"Continue"});t.append(i.container,n),e.content.append(s.container,t),this.scrollable.container.append(e.container),i.input.addEventListener("keypress",(e=>{if(i.input.classList.contains("error")&&i.setState(u.I1.Neutral),"Enter"===e.key)return o()}));const a=()=>this.newPassword===i.value||(i.setError(),!1),o=e=>{if(e&&(0,K.Z)(e),!a())return;const t=this.slider.createTab(te);t.state=this.state,t.plainPassword=this.plainPassword,t.newPassword=this.newPassword,t.open()};return(0,v.fc)(n,o),s.load()}onOpenAfterTimeout(){this.passwordInputField.input.focus()}}class se extends l._{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 b.Z({noDelimiter:!0}),i=document.createElement("div");i.classList.add("input-wrapper");const s=this.passwordInputField=new X.Z({name:"enter-password",label:e?"PleaseEnterFirstPassword":this.state.hint?void 0:"LoginPassword",labelText:!e&&this.state.hint?(0,Q.Z)(this.state.hint):void 0}),n=new Y.Z(s,157),a=(0,I.Z)("btn-primary btn-color-primary"),o=new f.ZP.IntlElement({key:"Continue"});a.append(o.element),i.append(s.container,a),t.content.append(n.container,i),this.scrollable.container.append(t.container),s.input.addEventListener("keypress",(e=>{if(s.input.classList.contains("error")&&(s.input.classList.remove("error"),o.key="Continue",o.update()),"Enter"===e.key)return d()}));const r=()=>!!s.value.length||(s.input.classList.add("error"),!1);let d;if(e)d=e=>{if(e&&(0,K.Z)(e),!r())return;const t=this.slider.createTab(ie);t.state=this.state,t.newPassword=s.value,t.plainPassword=this.plainPassword,t.open()};else{let e;const t=()=>(e||(e=window.setInterval(t,1e4)),this.managers.passwordManager.getState().then((e=>{this.state=e,this.state.hint?(0,q.Z)(s.label,(0,Q.Z)(this.state.hint)):(0,Z.Z)(s.label,(0,f.ag)("LoginPassword"))})));d=i=>{if(!r())return void(0,K.Z)(i);a.setAttribute("disabled","true"),o.key="PleaseWait",o.update();const d=(0,O.y)(a),l=s.value;this.managers.passwordManager.check(s.value,this.state).then((t=>{if(console.log(t),"auth.authorization"===t._){clearInterval(e),n&&n.remove();const t=this.slider.createTab(ne);t.state=this.state,t.plainPassword=l,t.open(),this.slider.removeTabFromHistory(this)}}),(e=>{a.removeAttribute("disabled"),s.input.classList.add("error"),e.type,o.key="PASSWORD_HASH_INVALID",o.update(),d.remove(),s.select(),t()}))},t()}return(0,v.fc)(a,d),n.load()}onOpenAfterTimeout(){j(this.isFirst)&&this.passwordInputField.input.focus()}}class ne extends l._{init(){this.container.classList.add("two-step-verification","two-step-verification-main"),this.setTitle("TwoStepVerificationTitle");const e=new b.Z({captionOld:!0,noDelimiter:!0}),t=document.createElement("div");(0,N.Z)({div:t,width:168,height:168,emoji:"๐Ÿ”"}),e.content.append(t);const i=e.generateContentElement();if(this.state.pFlags.has_password){(0,f.$d)(e.caption,"TwoStepAuth.GenericHelp");const t=(0,I.Z)("btn-primary btn-transparent",{icon:"edit",text:"TwoStepAuth.ChangePassword"}),s=(0,I.Z)("btn-primary btn-transparent",{icon:"passwordoff",text:"TwoStepAuth.RemovePassword"}),n=(0,I.Z)("btn-primary btn-transparent",{icon:"email",text:this.state.pFlags.has_recovery?"TwoStepAuth.ChangeEmail":"TwoStepAuth.SetupEmail"});(0,v.fc)(t,(()=>{const e=this.slider.createTab(se);e.state=this.state,e.plainPassword=this.plainPassword,e.open()})),(0,v.fc)(s,(()=>{new B.Z("popup-disable-password",{buttons:[{langKey:"Disable",callback:()=>{this.managers.passwordManager.updateSettings({currentPassword:this.plainPassword}).then((()=>{this.slider.sliceTabsUntilTab(Ct,this),this.close()}))},isDanger:!0}],titleLangKey:"TurnPasswordOffQuestionTitle",descriptionLangKey:"TurnPasswordOffQuestion"}).show()})),(0,v.fc)(n,(()=>{const e=this.slider.createTab($);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{(0,f.$d)(e.caption,"TwoStepAuth.SetPasswordHelp");const t=document.createElement("div");t.classList.add("input-wrapper");const s=(0,I.Z)("btn-primary btn-color-primary",{text:"TwoStepVerificationSetPassword"});t.append(s),i.append(t),(0,v.fc)(s,(e=>{const t=this.slider.createTab(se);t.state=this.state,t.open()}))}this.scrollable.container.append(e.container)}}class ae extends M.h{init(){this.container.classList.add("privacy-tab","privacy-last-seen"),this.setTitle("PrivacyLastSeen");const e="PrivacySettingsController.LastSeenDescription";new F({tab:this,title:"LastSeenTitle",inputKey:"inputPrivacyKeyStatusTimestamp",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,managers:this.managers})}}class oe extends M.h{init(){this.container.classList.add("privacy-tab","privacy-profile-photo"),this.setTitle("PrivacyProfilePhoto");const e="PrivacySettingsController.ProfilePhoto.CustomHelp";new F({tab:this,title:"PrivacyProfilePhotoTitle",inputKey:"inputPrivacyKeyProfilePhoto",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,skipTypes:[x.Nobody],managers:this.managers})}}class re extends M.h{init(){this.container.classList.add("privacy-tab","privacy-forward-messages"),this.setTitle("PrivacySettings.Forwards");const e="PrivacySettingsController.Forwards.CustomHelp";new F({tab:this,title:"PrivacyForwardsTitle",inputKey:"inputPrivacyKeyForwards",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,managers:this.managers})}}class de extends M.h{init(){this.container.classList.add("privacy-tab","privacy-add-to-groups"),this.setTitle("PrivacySettings.Groups");const e="PrivacySettingsController.GroupDescription";new F({tab:this,title:"WhoCanAddMe",inputKey:"inputPrivacyKeyChatInvite",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,skipTypes:[x.Nobody],managers:this.managers})}}class le extends M.h{init(){this.container.classList.add("privacy-tab","privacy-calls"),this.setTitle("PrivacySettings.VoiceCalls");const e="PrivacySettingsController.PhoneCallDescription";new F({tab:this,title:"WhoCanCallMe",inputKey:"inputPrivacyKeyPhoneCall",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,managers:this.managers});{const e="PrivacySettingsController.P2p.Desc";new F({tab:this,title:"PrivacyP2PHeader",inputKey:"inputPrivacyKeyPhoneP2P",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,managers:this.managers})}}}var ce=i(3003),he=i(8497),ue=i(4064),pe=i(6976),fe=i(1483),me=i(3416);class ge extends M.h{init(){this.container.classList.add("active-sessions-container"),this.setTitle("SessionsTitle");const e=e=>{const t=new P.ZP({title:[e.app_name,e.app_version].join(" "),subtitle:[e.ip,e.country].join(" - "),clickable:!0,titleRight:e.pFlags.current?void 0:(0,C.zM)(new Date(1e3*Math.max(e.date_active,e.date_created)))});return t.container.dataset.hash=""+e.hash,t.midtitle.textContent=[e.device_model,e.system_version||e.platform].filter(Boolean).join(", "),t},t=this.authorizations.slice();{const n=new b.Z({name:"CurrentSession",caption:"ClearOtherSessionsHelp"}),a=(0,ue.Z)(t,(e=>e.pFlags.current)),o=e(a);if(n.content.append(o.container),t.length){const e=(0,I.Z)("btn-primary btn-transparent danger",{icon:"stop",text:"TerminateAllSessions"});(0,v.fc)(e,(t=>{new B.Z("revoke-session",{buttons:[{langKey:"Terminate",isDanger:!0,callback:()=>{const t=(0,G.Z)([e],!0);this.managers.apiManager.invokeApi("auth.resetAuthorizations").then((t=>{e.remove(),i.container.remove()}),s).finally((()=>{t()}))}}],titleLangKey:"AreYouSureSessionsTitle",descriptionLangKey:"AreYouSureSessions"}).show()}),{listenerSetter:this.listenerSetter}),n.content.append(e)}this.scrollable.append(n.container)}if(!t.length)return;const i=new b.Z({name:"OtherSessions",caption:"SessionsListInfo"});t.forEach((t=>{i.content.append(e(t).container)})),this.scrollable.append(i.container);const s=e=>{"FRESH_RESET_AUTHORISATION_FORBIDDEN"===e.type&&(0,ee.Am)(f.ZP.format("RecentSessions.Error.FreshReset",!0))};let n;const a=()=>{const e=n.dataset.hash;new B.Z("revoke-session",{buttons:[{langKey:"Terminate",isDanger:!0,callback:()=>{this.managers.apiManager.invokeApi("account.resetAuthorization",{hash:e}).then((e=>{e&&n.remove()}),s)}}],titleLangKey:"AreYouSureSessionTitle",descriptionLangKey:"TerminateSessionText"}).show()},o=this.menuElement=(0,ce.b)({buttons:[{icon:"stop",text:"Terminate",onClick:a}]});o.id="active-sessions-contextmenu",o.classList.add("contextmenu"),document.getElementById("page-chats").append(o),(0,pe.E)({element:this.scrollable.container,callback:e=>{n=(0,he.Z)(e.target,"row"),n&&"0"!==n.dataset.hash&&(e instanceof MouseEvent&&e.preventDefault(),e instanceof MouseEvent&&(e.cancelBubble=!0),(0,fe.Z)(e,o),me.Z.openBtnMenu(o))},listenerSetter:this.listenerSetter}),(0,v.fc)(this.scrollable.container,(e=>{n=(0,he.Z)(e.target,"row"),n&&"0"!==n.dataset.hash&&a()}),{listenerSetter:this.listenerSetter})}onCloseAfterTimeout(){var e;return null===(e=this.menuElement)||void 0===e||e.remove(),super.onCloseAfterTimeout()}}var ve=i(2995),be=i(4668),ye=i(8210),we=i(5102);class Se extends l._{init(){this.container.classList.add("blocked-users-container"),this.setTitle("BlockedUsers");const e=new b.Z({caption:"BlockedUsersInfo"});e.caption.parentElement.prepend(e.caption),this.scrollable.append(e.container);const t=(0,m.Z)({icon:"add",className:"is-visible"});this.content.append(t),(0,v.fc)(t,(e=>{new ve.Z({peerTypes:["contacts"],placeholder:"BlockModal.Search.Placeholder",onSelect:e=>{this.managers.appUsersManager.toggleBlock(e,!0)}})}),{listenerSetter:this.listenerSetter});const i=h.default.createChatList();this.scrollable.container.classList.add("chatlist-container"),e.content.append(i);const s=(e,t)=>{return s=this,n=void 0,o=function*(){const{dom:s}=h.default.addDialogNew({peerId:e,container:i,rippleEnabled:!0,avatarSize:"abitbigger",append:t}),n=yield this.managers.appUsersManager.getUser(e.toUserId());if(!n)return;const a=(0,we.Z)(n)[0];n.pFlags.bot?s.lastMessageSpan.append("@"+a):n.phone?s.lastMessageSpan.innerHTML=(0,ye.Z)(n.phone):s.lastMessageSpan.append(a?"@"+a:(0,g.Z)(n))},new((a=void 0)||(a=Promise))((function(e,t){function i(e){try{d(o.next(e))}catch(e){t(e)}}function r(e){try{d(o.throw(e))}catch(e){t(e)}}function d(t){var s;t.done?e(t.value):(s=t.value,s instanceof a?s:new a((function(e){e(s)}))).then(i,r)}d((o=o.apply(s,n||[])).next())}));var s,n,a,o};for(const e of this.peerIds)s(e,!0);let a;const o=this.menuElement=(0,ce.b)({buttons:[{icon:"lockoff",text:"Unblock",onClick:()=>{const e=a.dataset.peerId.toPeerId();this.managers.appUsersManager.toggleBlock(e,!1)},options:{listenerSetter:this.listenerSetter}}]});o.id="blocked-users-contextmenu",o.classList.add("contextmenu"),document.getElementById("page-chats").append(o),(0,pe.E)({element:this.scrollable.container,callback:e=>{a=(0,be.Z)(e.target,h.DIALOG_LIST_ELEMENT_TAG),a&&(e instanceof MouseEvent&&e.preventDefault(),e instanceof MouseEvent&&(e.cancelBubble=!0),(0,fe.Z)(e,o),me.Z.openBtnMenu(o))},listenerSetter:this.listenerSetter}),this.listenerSetter.add(n.Z)("peer_block",(e=>{const{peerId:t,blocked:n}=e,a=i.querySelector(`[data-peer-id="${t}"]`);n?a||s(t,!1):a&&a.remove()}));let r=!1;this.scrollable.onScrolledBottom=()=>{r||(r=!0,this.managers.appUsersManager.getBlocked(i.childElementCount,50).then((e=>{for(const t of e.peerIds)s(t,!0);(e.peerIds.length<50||i.childElementCount===e.count)&&(this.scrollable.onScrolledBottom=null),this.scrollable.checkForTriggers()})).finally((()=>{r=!1})))}}onOpenAfterTimeout(){this.scrollable.onScroll()}onCloseAfterTimeout(){return this.menuElement&&this.menuElement.remove(),super.onCloseAfterTimeout()}}var Ce=i(9807);function Le(e){return"input"+(e[0].toUpperCase()+e.slice(1))}var Ee=i(5592),Ie=i(319);class Me extends M.h{init(){this.container.classList.add("privacy-tab","privacy-voices"),this.setTitle("PrivacyVoiceMessages");const e="PrivacyVoiceMessagesInfo";new F({tab:this,title:"PrivacyVoiceMessagesTitle",inputKey:"inputPrivacyKeyVoiceMessages",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,managers:this.managers})}}var Pe=i(7362),Ze=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Te extends M.h{init(e){return Ze(this,void 0,void 0,(function*(){this.container.classList.add("active-sessions-container"),this.setTitle("WebSessionsTitle");const t=e=>Ze(this,void 0,void 0,(function*(){const t=e.bot_id.toPeerId(),i=new P.ZP({title:yield(0,Pe.Z)({peerId:t}),subtitle:[e.ip,e.region].join(" - "),clickable:!0,titleRight:(0,C.zM)(new Date(1e3*Math.max(e.date_active,e.date_created)))}),s=i.createMedia("big"),n=new o.Z;return n.classList.add("avatar-48"),yield n.updateWithOptions({peerId:t}),s.append(n),i.container.dataset.hash=""+e.hash,i.container.dataset.peerId=""+t,i.midtitle.textContent=[e.domain,e.browser,e.platform].filter(Boolean).join(", "),i}));{const e=new b.Z({caption:"ClearOtherWebSessionsHelp"}),t=(0,I.Z)("btn-primary btn-transparent danger",{icon:"stop",text:"TerminateAllWebSessions"});(0,v.fc)(t,(()=>Ze(this,void 0,void 0,(function*(){yield(0,Ee.Z)({descriptionLangKey:"AreYouSureWebSessions",button:{langKey:"Disconnect",isDanger:!0}}),(0,G.Z)([t],!0),this.managers.appSeamlessLoginManager.resetWebAuthorizations().then((()=>{this.close()}))}))),{listenerSetter:this.listenerSetter}),e.content.append(t),this.scrollable.append(e.container)}{const i=new b.Z({name:"OtherWebSessions",caption:"TerminateWebSessionInfo"}),s=yield Promise.all(e.map(t));i.content.append(...s.map((e=>e.container)));let n=s.length;(0,v.fc)(i.content,(e=>Ze(this,void 0,void 0,(function*(){const t=(0,he.Z)(e.target,"row");if(!t)return;yield(0,Ee.Z)({descriptionLangKey:"TerminateWebSessionText",descriptionLangArgs:[yield(0,Pe.Z)({peerId:t.dataset.peerId.toPeerId()})],button:{langKey:"Disconnect",isDanger:!0}});const i=t.dataset.hash;t.classList.add("is-disabled"),this.managers.appSeamlessLoginManager.resetWebAuthorization(i).then((()=>{--n?t.remove():this.close()}))}))),{listenerSetter:this.listenerSetter}),this.scrollable.append(i.container)}}))}}class ke extends M.h{static getInitArgs(e){return{appConfig:e.managers.apiManager.getAppConfig(),globalPrivacy:e.managers.appPrivacyManager.getGlobalPrivacySettings(),contentSettings:e.managers.apiManager.invokeApi("account.getContentSettings"),webAuthorizations:e.managers.appSeamlessLoginManager.getWebAuthorizations()}}init(e){this.container.classList.add("dont-u-dare-block-me"),this.setTitle("PrivacySettings");const t="Loading",i=[];{const s=new b.Z({noDelimiter:!0,caption:"SessionsInfo"});let a;const o=new P.ZP({icon:"deleteuser",titleLangKey:"BlockedUsers",subtitleLangKey:t,clickable:()=>{const e=this.slider.createTab(Se);e.peerIds=a,e.open()},listenerSetter:this.listenerSetter});let r;o.freezed=!0;const d={icon:"lock",titleLangKey:"TwoStepVerification",subtitleLangKey:t,clickable:e=>{let t;r.pFlags.has_password?t=this.slider.createTab(se):r.email_unconfirmed_pattern?(t=this.slider.createTab(V),t.email=r.email_unconfirmed_pattern,t.length=6,t.isFirst=!0,this.managers.passwordManager.resendPasswordEmail()):t=this.slider.createTab(ne),t.state=r,t.open()},listenerSetter:this.listenerSetter},l=new P.ZP(d);l.freezed=!0;const c=this.activeSessionsRow=new P.ZP({icon:"activesessions",titleLangKey:"SessionsTitle",subtitleLangKey:t,clickable:()=>{const e=this.slider.createTab(ge);e.authorizations=this.authorizations,e.eventListener.addEventListener("destroy",(()=>{this.updateActiveSessions()}),{once:!0}),e.open()},listenerSetter:this.listenerSetter});c.freezed=!0;const h=this.websitesRow=new P.ZP({icon:"mention",titleLangKey:"OtherWebSessions",subtitleLangKey:t,clickable:()=>{const e=this.slider.createTab(Te);e.eventListener.addEventListener("destroy",(()=>{this.updateActiveWebsites()})),e.open(this.websites)},listenerSetter:this.listenerSetter});h.freezed=!0,s.content.append(o.container,l.container,c.container,h.container),this.scrollable.append(s.container);const u=e=>{e?(0,Z.Z)(o.subtitle,(0,f.ag)("PrivacySettingsController.UserCount",[e])):(0,Z.Z)(o.subtitle,(0,f.ag)("BlockedEmpty",[e]))};this.listenerSetter.add(n.Z)("peer_block",(()=>{p()}));const p=()=>{this.managers.appUsersManager.getBlocked().then((e=>{o.freezed=!1,u(e.count),a=e.peerIds}))};p(),this.managers.passwordManager.getState().then((e=>{r=e,(0,Z.Z)(l.subtitle,(0,f.ag)(e.pFlags.has_password?"PrivacyAndSecurity.Item.On":"PrivacyAndSecurity.Item.Off")),l.freezed=!1})),this.updateActiveSessions(),i.push(this.updateActiveWebsites(e.webAuthorizations))}{const e=new b.Z({name:"PrivacyTitle",caption:"GroupsAndChannelsHelp"});e.content.classList.add("privacy-navigation-container");const i={},s=i.inputPrivacyKeyPhoneNumber=new P.ZP({titleLangKey:"PrivacyPhoneTitle",subtitleLangKey:t,clickable:()=>{this.slider.createTab(R).open()},listenerSetter:this.listenerSetter}),a=i.inputPrivacyKeyStatusTimestamp=new P.ZP({titleLangKey:"LastSeenTitle",subtitleLangKey:t,clickable:()=>{this.slider.createTab(ae).open()},listenerSetter:this.listenerSetter}),o=i.inputPrivacyKeyProfilePhoto=new P.ZP({titleLangKey:"PrivacyProfilePhotoTitle",subtitleLangKey:t,clickable:()=>{this.slider.createTab(oe).open()},listenerSetter:this.listenerSetter}),r=i.inputPrivacyKeyPhoneCall=new P.ZP({titleLangKey:"WhoCanCallMe",subtitleLangKey:t,clickable:()=>{this.slider.createTab(le).open()},listenerSetter:this.listenerSetter}),d=i.inputPrivacyKeyForwards=new P.ZP({titleLangKey:"PrivacyForwardsTitle",subtitleLangKey:t,clickable:()=>{this.slider.createTab(re).open()},listenerSetter:this.listenerSetter}),l=i.inputPrivacyKeyChatInvite=new P.ZP({titleLangKey:"WhoCanAddMe",subtitleLangKey:t,clickable:()=>{this.slider.createTab(de).open()},listenerSetter:this.listenerSetter}),c=i.inputPrivacyKeyVoiceMessages=new P.ZP({titleLangKey:"PrivacyVoiceMessagesTitle",subtitleLangKey:t,clickable:()=>{n.Z.premium?this.slider.createTab(Me).open():(0,ee.bC)({langPackKey:"PrivacyVoiceMessagesPremiumOnly"})},listenerSetter:this.listenerSetter}),h=e=>{const t=i[e];t&&this.managers.appPrivacyManager.getPrivacy(e).then((e=>{const i=k(e),s=i.type===x.Everybody?"PrivacySettingsController.Everbody":i.type===x.Contacts?"PrivacySettingsController.MyContacts":"PrivacySettingsController.Nobody",n=i.disallowPeers.users.length+i.disallowPeers.chats.length,a=i.allowPeers.users.length+i.allowPeers.chats.length;t.subtitle.innerHTML="";const o=(0,f.ag)(s);t.subtitle.append(o),(n||a)&&t.subtitle.append(` (${[-n,a?"+"+a:0].filter(Boolean).join(", ")})`)}))};e.content.append(s.container,a.container,o.container,r.container,d.container,l.container,c.container),this.scrollable.append(e.container);for(const e in i)h(e);n.Z.addEventListener("privacy_update",(e=>{h(Le(e.key._))}))}{const t=new b.Z({name:"NewChatsFromNonContacts",caption:"ArchiveAndMuteInfo"}),s=new Ce.Z({text:"ArchiveAndMute"}),a=new P.ZP({checkboxField:s});let o,r;t.content.append(a.container),this.eventListener.addEventListener("destroy",(()=>{if(r=!0,void 0!==o&&o!==s.checked)return this.managers.appPrivacyManager.setGlobalPrivacySettings({_:"globalPrivacySettings",archive_and_mute_new_noncontact_peers:s.checked})}),{once:!0});const d=Promise.all([e.appConfig,e.globalPrivacy]).then((([e,i])=>{if(r)return;const a=i=>{t.container.classList.toggle("hide",!i&&!e.autoarchive_setting_available)};this.listenerSetter.add(n.Z)("premium_toggle",a),a(n.Z.premium),o=!!i.archive_and_mute_new_noncontact_peers,s.setValueSilently(o)}));i.push(d),this.scrollable.append(t.container)}{const t=new b.Z({name:"Privacy.SensitiveContent",caption:"PrivacyAndSecurity.SensitiveDesc"});t.container.classList.add("hide");const s=new Ce.Z({text:"PrivacyAndSecurity.SensitiveText"}),n=new P.ZP({checkboxField:s});let a;t.content.append(n.container),this.eventListener.addEventListener("destroy",(()=>{if(void 0===a)return;const e=n.checkboxField.checked;return e!==a?this.managers.apiManager.invokeApi("account.setContentSettings",{sensitive_enabled:e}):void 0}),{once:!0});const o=e.contentSettings.then((e=>{e.pFlags.sensitive_can_change&&(a=!!e.pFlags.sensitive_enabled,s.setValueSilently(a),t.container.classList.remove("hide"))}));i.push(o),this.scrollable.append(t.container)}{const e=new b.Z({name:"PrivacyPayments",caption:"PrivacyPaymentsClearInfo"}),t=()=>{const e={titleLangKey:"PrivacyPaymentsClearAlertTitle",descriptionLangKey:"PrivacyPaymentsClearAlertText",button:{langKey:"Clear"},checkboxes:[{text:"PrivacyClearShipping",checked:!0},{text:"PrivacyClearPayment",checked:!0}]};(0,Ee.Z)(e).then((()=>{const[t,s]=e.checkboxes.map((e=>e.checkboxField.checked)),n=(0,G.Z)([i],!0);this.managers.appPaymentsManager.clearSavedInfo(t,s).then((()=>{(t||s)&&(n(),(0,ee.bC)({langPackKey:t&&s?"PrivacyPaymentsPaymentShippingCleared":t?"PrivacyPaymentsShippingInfoCleared":"PrivacyPaymentsPaymentInfoCleared"}))}))}),Ie.Z)},i=(0,I.Z)("btn-primary btn-transparent",{icon:"delete",text:"PrivacyPaymentsClear"});this.listenerSetter.add(i)("click",t),e.content.append(i),this.scrollable.append(e.container)}{const e=new b.Z({name:"FilterChats"}),t=()=>{new B.Z("popup-delete-drafts",{buttons:[{langKey:"Delete",callback:()=>{const e=(0,G.Z)([i],!0);this.managers.appDraftsManager.clearAllDrafts().then((()=>{e()}))},isDanger:!0}],titleLangKey:"AreYouSureClearDraftsTitle",descriptionLangKey:"AreYouSureClearDrafts"}).show()},i=(0,I.Z)("btn-primary btn-transparent",{icon:"delete",text:"PrivacyDeleteCloudDrafts"});this.listenerSetter.add(i)("click",t),e.content.append(i),this.scrollable.append(e.container)}return Promise.all(i)}updateActiveSessions(){return this.managers.apiManager.invokeApi("account.getAuthorizations").then((e=>{this.activeSessionsRow.freezed=!1,this.authorizations=e.authorizations,(0,f.$d)(this.activeSessionsRow.subtitle,"Privacy.Devices",[this.authorizations.length])}))}updateActiveWebsites(e=this.managers.appSeamlessLoginManager.getWebAuthorizations()){return e.then((e=>{this.websitesRow.freezed=!1,this.websites=e,(0,f.$d)(this.websitesRow.subtitle,"Privacy.Websites",[this.websites.length]),this.websitesRow.container.classList.toggle("hide",!this.websites.length)}))}}var xe=i(65),Ae=i(9439),_e=i(8938),Fe=i(2153),De=i(6787),Re=i(6761);var Be=i(3731),Ne=i(62);class Oe extends M.Z{init(){return this.setTitle("DoubleTapSetting"),this.container.classList.add("quick-reaction-container"),Promise.all([this.managers.appReactionsManager.getQuickReaction(),this.managers.appReactionsManager.getAvailableReactions()]).then((([e,t])=>{t=t.filter((e=>!e.pFlags.inactive));const i=new b.Z,s=t.map((t=>{const i=new A.Z({name:"quick-reaction",text:t.title,value:t.reaction,alignRight:!0}),s=new P.ZP({radioField:i,havePadding:!0});return i.main.classList.add("quick-reaction-title"),(0,Ne.Z)({row:s,doc:t.static_icon,size:"small"}),t.reaction===e.reaction&&i.setValueSilently(!0),s})),n=(0,P.De)(s,(e=>{this.managers.appReactionsManager.setDefaultReaction({_:"reactionEmoji",emoticon:e})}));i.content.append(n),this.scrollable.append(i.container)}))}}var Ue=i(236),He=i(1273),ze=i(6714),je=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Ge{constructor(e,t,i,s,n,a=!0){const o="range-setting-selector";this.container=document.createElement("div"),this.container.classList.add(o);const r=document.createElement("div");r.classList.add(o+"-details");const d=document.createElement("div");d.classList.add(o+"-name"),(0,f.$d)(d,e);const l=this.valueContainer=document.createElement("div");l.classList.add(o+"-value"),a&&(l.innerHTML=""+i),r.append(d,l),this.range=new xe.Z({step:t,min:s,max:n},i),this.range.setListeners(),this.range.setHandlers({onScrub:e=>{this.onChange&&this.onChange(e),a&&(l.innerText=""+e)}}),this.container.append(r,this.range.container)}}class Ve extends M.h{static getInitArgs(){return{themes:n.Z.managers.appThemesManager.getThemes(),allStickers:n.Z.managers.appStickersManager.getAllStickers(),quickReaction:n.Z.managers.appReactionsManager.getQuickReaction()}}init(e){this.container.classList.add("general-settings-container"),this.setTitle("General");const t=b.R.bind(null,this.scrollable),i=[];{const e=t("Settings"),i=new Ge("TextSize",1,n.Z.settings.messagesTextSize,12,20);i.onChange=e=>{n.Z.managers.appStateManager.setByKey("settings.messagesTextSize",e)};const s=(0,I.Z)("btn-primary btn-transparent",{icon:"image",text:"ChatBackground"}),a=Ae.Z.getInitArgs();(0,v.fc)(s,(()=>{this.slider.createTab(Ae.Z).open(a)}));const o=new Ce.Z({text:"EnableAnimations",name:"animations",stateKey:"settings.animationsEnabled",listenerSetter:this.listenerSetter});e.append(i.container,s,(0,P.tG)(o).container)}{const s=t("ColorTheme"),a=new r.v7(null),o=a.container;o.classList.add("themes-container");const d=new Map;let l=ze.Z.getTheme(),c=ze.Z.isNight();const h=e=>{ze.Z.applyTheme(e.theme,e.container);const t=e.container.querySelector(".background-item");null==t||t.remove();const i=e.wallPaperContainers[c?"baseThemeNight":"baseThemeClassic"];i&&e.container.prepend(i)};let u;(0,v.fc)(o,(e=>je(this,void 0,void 0,(function*(){const t=(0,he.Z)(e.target,"theme-container");if(!t)return;const i=o.querySelector(".active");i&&i.classList.remove("active");const s=d.get(t);if(t.classList.add("active"),yield ze.Z.applyNewTheme(s.theme),null==u||u(-1),s.player&&n.Z.settings.animationsEnabled)if(z.IS_SAFARI)s.player.paused&&s.player.restart();else{s.player.paused&&s.player.stop(!0),s.player.el[0].style.transform="scale(2)";const e=u=t=>{s.player.maxFrame!==t&&-1!==t||(s.player.el[0].style.transform="",s.player.removeEventListener("enterFrame",e),u===e&&(u=void 0))};setTimeout((()=>{u===e&&(s.player.play(),s.player.addEventListener("enterFrame",e))}),250)}}))),{listenerSetter:this.listenerSetter});const p=new Set(["baseThemeClassic","baseThemeNight"]),f=e.themes.then((e=>je(this,void 0,void 0,(function*(){const t=e.filter((e=>e.pFlags.default));t.unshift(Ue.t);const i=t.map((e=>je(this,void 0,void 0,(function*(){const t=document.createElement("div"),i={container:t,theme:e,wallPaperContainers:{}},s=e.settings.filter((e=>p.has(e.base_theme._))).map((e=>{const t=e.wallpaper,s=Ae.Z.addWallPaper(t);return i.wallPaperContainers[e.base_theme._]=s.container,s}));d.set(t,i),h(i),e.id===l.id&&t.classList.add("active");const n=[];let a;if(e.emoticon){a=document.createElement("div"),a.classList.add("theme-emoticon");const t=49;(0,N.Z)({div:a,width:t,height:t,emoji:e.emoticon,managers:this.managers,loadPromises:n,middleware:this.middlewareHelper.get(),play:!1}).then((({render:e})=>e)).then((e=>{i.player=e}))}const o=document.createElement("div");o.classList.add("theme-bubble");const r=o.cloneNode();return r.classList.add("is-in"),o.classList.add("is-out"),n.push(...s.map((e=>e.loadPromise))),t.classList.add("theme-container"),yield Promise.all(n),a&&t.append(a),t.append(r,o),t})))),s=yield Promise.all(i);a.append(...s)}))));i.push(f);const m=document.createElement("form");m.style.marginTop=".5rem";const g="theme",b="settings.theme",y=new P.ZP({radioField:new A.Z({langKey:"ThemeDay",name:g,value:"day",stateKey:b})}),w=new P.ZP({radioField:new A.Z({langKey:"ThemeNight",name:g,value:"night",stateKey:b})}),S=new P.ZP({radioField:new A.Z({langKey:"AutoNightSystemDefault",name:g,value:"system",stateKey:b})});this.listenerSetter.add(n.Z)("settings_updated",(({key:e,value:t,settings:i})=>{e===b&&n.Z.dispatchEvent("theme_change")})),this.listenerSetter.add(n.Z)("theme_change",(()=>{l=ze.Z.getTheme();const e=ze.Z.isNight();if(c===e)return;c=e;const t=o.querySelector(".active");let i;t&&t.classList.remove("active"),d.forEach((e=>{h(e),e.theme.id===l.id&&(e.container.classList.add("active"),i=e.container)})),i&&a.scrollIntoViewNew({element:i,position:"center",axis:"x"})})),m.append(y.container,w.container,S.container),s.append(o,m)}{const e=t("General.Keyboard"),i=document.createElement("form"),s="send-shortcut",n="settings.sendShortcut",a=new P.ZP({radioField:new A.Z({langKey:"General.SendShortcut.Enter",name:s,value:"enter",stateKey:n}),subtitleLangKey:"General.SendShortcut.NewLine.ShiftEnter"}),o=new P.ZP({radioField:new A.Z({name:s,value:"ctrlEnter",stateKey:n}),subtitleLangKey:"General.SendShortcut.NewLine.Enter"});(0,f.$d)(o.radioField.main,"General.SendShortcut.CtrlEnter",[z.IS_APPLE?"โŒ˜":"Ctrl"]),i.append(a.container,o.container),e.append(i)}if(Be.Z){const e=t("DistanceUnitsTitle"),i=document.createElement("form"),s="distance-unit",n="settings.distanceUnit",a=new P.ZP({radioField:new A.Z({langKey:"DistanceUnitsKilometers",name:s,value:"kilometers",stateKey:n})}),o=new P.ZP({radioField:new A.Z({langKey:"DistanceUnitsMiles",name:s,value:"miles",stateKey:n})});i.append(a.container,o.container),e.append(i)}{const e=t("General.TimeFormat"),i=document.createElement("form"),s="time-format",n="settings.timeFormat",a=[["h12","General.TimeFormat.h12"],["h23","General.TimeFormat.h23"]],o=a.map((([e,t])=>new P.ZP({radioField:new A.Z({langKey:t,name:s,value:e,stateKey:n})}))),r=function(e,t=!0){return function(e,t,i=!0){const s=e;let n;return i||(e=Ie.Z),function i(){e(),n=Re.Z.setTimeout(i,t())}(),e=s,()=>{clearTimeout(n)}}(e,(()=>1e3*(60-(new Date).getSeconds())),t)}((()=>{const e=new Date;a.forEach((([t],i)=>{const s=e.toLocaleTimeString("en-us-u-hc-"+t,{hour:"2-digit",minute:"2-digit"});o[i].subtitle.textContent=s}))}));this.eventListener.addEventListener("destroy",r),i.append(...o.map((e=>e.container))),e.append(i)}{const e=t("Emoji"),i=new Ce.Z({text:"GeneralSettings.EmojiPrediction",name:"suggest-emoji",stateKey:"settings.emoji.suggest",listenerSetter:this.listenerSetter}),s=new Ce.Z({text:"GeneralSettings.BigEmoji",name:"emoji-big",stateKey:"settings.emoji.big",listenerSetter:this.listenerSetter});e.append((0,P.tG)(i).container,(0,P.tG)(s).container)}{const t=new b.Z({name:"Telegram.InstalledStickerPacksController",caption:"StickersBotInfo"}),s=new P.ZP({titleLangKey:"DoubleTapSetting",havePadding:!0,clickable:()=>{this.slider.createTab(Oe).open()},listenerSetter:this.listenerSetter}),a=()=>{e.quickReaction.then((e=>"availableReaction"===e._?e.static_icon:this.managers.appEmojiManager.getCustomEmojiDocument(e.document_id))).then((e=>{(0,Ne.Z)({row:s,doc:e,size:"small"})}))};a(),this.listenerSetter.add(n.Z)("quick_reaction",a);const o=new Ce.Z({text:"Stickers.SuggestStickers",name:"suggest",stateKey:"settings.stickers.suggest",listenerSetter:this.listenerSetter}),r=new Ce.Z({text:"InstalledStickers.LoopAnimated",name:"loop",stateKey:"settings.stickers.loop",listenerSetter:this.listenerSetter}),d={},l=t.generateContentElement(),c=new Fe.Z,h=(e,t="append")=>{const i=new P.ZP({title:(0,Q.Z)(e.title),subtitleLangKey:"Stickers",subtitleLangArgs:[e.count],havePadding:!0,clickable:()=>{new De.Z({id:e.id,access_hash:e.access_hash}).show()},listenerSetter:this.listenerSetter});d[e.id]=i;const s=document.createElement("div");s.classList.add("row-media"),(0,He.Z)({set:e,container:s,group:"GENERAL-SETTINGS",lazyLoadQueue:c,width:36,height:36,autoplay:!0,middleware:this.middlewareHelper.get()}),i.container.append(s),l[t](i.container)},u=e.allStickers.then((e=>{(0,_e.Z)(e);const t=e.sets.map((e=>h(e)));return Promise.all(t)}));i.push(u),this.listenerSetter.add(n.Z)("stickers_installed",(e=>{d[e.id]||h(e,"prepend")})),this.listenerSetter.add(n.Z)("stickers_deleted",(e=>{d[e.id]&&(d[e.id].container.remove(),delete d[e.id])})),t.content.append(s.container,(0,P.tG)(o).container,(0,P.tG)(r).container),this.scrollable.append(t.container)}return Promise.all(i)}}var Ke=i(2010),We=i(1447),$e=i(534),qe=i(4484),Qe=i(1507),Ye=i(2914),Xe=i(2648),Je=i(1655),et=i(3186),tt=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class it extends l._{constructor(){super(...arguments),this.filtersRendered={}}static getInitArgs(){return{animationData:We.Z.loadAnimationFromURLManually("Folders_1"),filters:n.Z.managers.filtersStorage.getDialogFilters()}}renderFolder(e,t,i,s){return tt(this,void 0,void 0,(function*(){let n,a="";const o=[];if("dialogFilterSuggested"===e._)n=e.filter,a=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&&o.push((0,f.ag)(t))}if(!o.length){const e=yield this.managers.dialogsStorage.getFolderDialogs(n.id);let t=0,i=0,s=0;yield Promise.all(e.map((e=>tt(this,void 0,void 0,(function*(){(yield this.managers.appPeersManager.isAnyGroup(e.peerId))?s++:(yield this.managers.appPeersManager.isBroadcast(e.peerId))?i++:t++}))))),t&&o.push((0,f.ag)("Chats",[t])),i&&o.push((0,f.ag)("Channels",[i])),s&&o.push((0,f.ag)("Groups",[s]))}}if(i)n.id!==Qe.J$&&(0,Z.Z)(i.title,(0,Q.Z)(n.title)),i.subtitle.textContent="",i.subtitle.append(...(0,f.v_)(o));else if(i=new P.ZP({title:n.id===Qe.J$?(0,f.ag)("FilterAllChats"):(0,Q.Z)(n.title),subtitle:a,clickable:!0,buttonRightLangKey:"dialogFilterSuggested"===e._?"Add":void 0}),o.length&&i.subtitle.append(...(0,f.v_)(o)),"dialogFilter"===e._){const e=n.id;if(!this.filtersRendered[n.id]&&n.id!==Qe.J$){const t=$e.Z.getInitArgs();(0,v.fc)(i.container,(()=>tt(this,void 0,void 0,(function*(){const i=yield this.managers.filtersStorage.getFilter(e),s=this.slider.createTab($e.Z);s.setInitFilter(i),s.open(t)}))),{listenerSetter:this.listenerSetter})}this.filtersRendered[n.id]=i,i.makeSortable()}const r=i.container;if(s){const e=n.localId;void 0!==e?(0,qe.Z)(r,r.parentElement||t,e):t&&t.append(r)}return i}))}init(e=it.getInitArgs()){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 t=document.createElement("div");t.classList.add("caption"),(0,f.XZ)({element:t,key:"ChatList.Filter.Header"}),this.createFolderBtn=(0,I.Z)("btn-primary btn-color-primary btn-control tgico",{text:"ChatList.Filter.NewTitle",icon:"add"}),this.foldersSection=new b.Z({name:"Filters"}),this.foldersSection.container.classList.add("hide"),this.list=document.createElement("div"),this.foldersSection.content.append(this.list),this.suggestedSection=new b.Z({name:"FilterRecommended"}),this.suggestedSection.container.classList.add("hide"),this.scrollable.append(this.stickerContainer,t,this.createFolderBtn,this.foldersSection.container,this.suggestedSection.container),(0,v.fc)(this.createFolderBtn,(()=>tt(this,void 0,void 0,(function*(){(yield this.canCreateFolder())?this.slider.createTab($e.Z).open():(0,et.Z)("folders")}))),{listenerSetter:this.listenerSetter});const i=()=>{this.foldersSection.container.classList.toggle("hide",!Object.keys(this.filtersRendered).length)},s=[],a=e.filters.then((e=>tt(this,void 0,void 0,(function*(){for(const t of e)t.id!==Qe.Zi&&(yield this.renderFolder(t,this.list,void 0,!0));this.toggleAllChats(),i()}))));return s.push(a),this.listenerSetter.add(n.Z)("filter_update",(e=>tt(this,void 0,void 0,(function*(){const t=this.filtersRendered[e.id];t?yield this.renderFolder(e,null,t):e.id!==Qe.Zi&&(yield this.renderFolder(e,this.list,void 0,!0)),i(),this.getSuggestedFilters()})))),this.listenerSetter.add(n.Z)("filter_delete",(e=>{const t=this.filtersRendered[e.id];t&&(this.getSuggestedFilters(),t.container.remove(),delete this.filtersRendered[e.id]),i()})),this.listenerSetter.add(n.Z)("filter_order",(e=>{e.filter((e=>!!this.filtersRendered[e])).forEach(((e,t)=>{const i=this.filtersRendered[e].container;(0,qe.Z)(i,i.parentElement,t+1)}))})),this.listenerSetter.add(n.Z)("premium_toggle",(()=>{this.toggleAllChats()})),this.loadAnimationPromise=e.animationData.then((e=>tt(this,void 0,void 0,(function*(){const t=yield e({container:this.stickerContainer,loop:!1,autoplay:!1,width:86,height:86});return this.animation=t,We.Z.waitForFirstFrame(t)})))),s.push(this.loadAnimationPromise),new Ye.Z({list:this.list,middleware:this.middlewareHelper.get(),onSort:(e,t)=>{let i=[];for(const e in this.filtersRendered){const t=this.filtersRendered[e];i[(0,Xe.Z)(t.container)]=+e}i=i.filter((e=>void 0!==e)),n.Z.premium||(0,Je.Z)(i,Qe.J$),this.managers.filtersStorage.updateDialogFiltersOrder(i)},scrollable:this.scrollable}),this.getSuggestedFilters(),Promise.all(s)}onOpenAfterTimeout(){return this.loadAnimationPromise.then((()=>{this.animation.autoplay=!0,this.animation.play()})),super.onOpenAfterTimeout()}toggleAllChats(){this.filtersRendered[Qe.J$].container.classList.toggle("hide",!n.Z.premium)}canCreateFolder(){return tt(this,void 0,void 0,(function*(){const[e,t]=yield Promise.all([this.managers.apiManager.getLimit("folders"),this.managers.filtersStorage.getDialogFilters()]);return t.filter((e=>!Qe.DZ.has(e.id))).lengthtt(this,void 0,void 0,(function*(){this.suggestedSection.container.classList.toggle("hide",!e.length),Array.from(this.suggestedSection.content.children).slice(1).forEach((e=>e.remove()));for(const t of e){const e=yield this.renderFolder(t);this.suggestedSection.content.append(e.container);const i=e.buttonRight;(0,v.fc)(i,(s=>tt(this,void 0,void 0,(function*(){if((0,K.Z)(s),!(yield this.canCreateFolder()))return void(0,et.Z)("folders");i.setAttribute("disabled","true");const n=t.filter;n.includePeerIds=[],n.excludePeerIds=[],n.pinnedPeerIds=[],this.managers.filtersStorage.createDialogFilter(n,!0).then((()=>{e.container.remove(),this.suggestedSection.container.classList.toggle("hide",1===this.suggestedSection.content.childElementCount)})).finally((()=>{i.removeAttribute("disabled")}))}))),{listenerSetter:this.listenerSetter})}}))))}}var st=i(8479),nt=i(3855),at=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class ot extends M.h{init(){this.container.classList.add("notifications-container"),this.setTitle("Telegram.NotificationSettingsViewController");const e=e=>{const t=new b.Z({name:e.name}),i=new P.ZP({checkboxField:new Ce.Z({text:e.typeText,checked:!0}),subtitleLangKey:"Loading",listenerSetter:this.listenerSetter,withCheckboxSubtitle:!0}),s=new P.ZP({checkboxField:new Ce.Z({text:"MessagePreview",checked:!0}),subtitleLangKey:"Loading",listenerSetter:this.listenerSetter,withCheckboxSubtitle:!0});t.content.append(i.container,s.container),this.scrollable.append(t.container);const a={_:e.inputKey},o=this.managers.appNotificationsManager.getNotifySettings(a);(o instanceof Promise?o:Promise.resolve(o)).then((t=>{const o=()=>at(this,void 0,void 0,(function*(){const e=yield this.managers.appNotificationsManager.isMuted(t);return i.checkboxField.checked=!e,s.checkboxField.checked=t.show_previews,e}));o(),this.eventListener.addEventListener("destroy",(()=>at(this,void 0,void 0,(function*(){const e=!i.checkboxField.checked,n=s.checkboxField.checked;if(e===(yield this.managers.appNotificationsManager.isMuted(t))&&n===t.show_previews)return;const o=(0,st.Z)(t);o._="inputPeerNotifySettings",o.mute_until=e?Qe.rU:0,o.show_previews=n,delete o.flags,this.managers.appNotificationsManager.updateNotifySettings(a,o)}))),{once:!0}),this.listenerSetter.add(n.Z)("notify_settings",(i=>{const s=Le(i.peer._);e.inputKey===s&&(t=i.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 b.Z({name:"NotificationsOther"}),t=new P.ZP({checkboxField:new Ce.Z({text:"ContactJoined",checked:!0}),subtitleLangKey:"Loading",listenerSetter:this.listenerSetter,withCheckboxSubtitle:!0}),i=new P.ZP({checkboxField:new Ce.Z({text:"Notifications.Sound",checked:!0,stateKey:"settings.notifications.sound",listenerSetter:this.listenerSetter}),subtitleLangKey:"Loading",listenerSetter:this.listenerSetter,withCheckboxSubtitle:!0});nt.Z.getState().then((e=>{i.checkboxField.checked=e.settings.notifications.sound})),e.content.append(t.container,i.container),this.scrollable.append(e.container),this.managers.appNotificationsManager.getContactSignUpNotification().then((e=>{t.checkboxField.checked=e,this.eventListener.addEventListener("destroy",(()=>{const i=t.checkboxField.checked;e!==i&&this.managers.appNotificationsManager.setContactSignUpNotification(!i)}),{once:!0})}))}}}class rt extends l._{static getInitArgs(){return{languages1:n.Z.managers.apiManager.invokeApiCacheable("langpack.getLanguages",{lang_pack:"web"}),languages2:Promise.resolve([])}}init(e){this.header.classList.add("with-border"),this.container.classList.add("language-container"),this.setTitle("Telegram.LanguageViewController");const t=new b.Z({}),i=new Map,s=Promise.all([e.languages1,e.languages2]).then((([e,s])=>{const n=new Set,a=e.map((e=>e.lang_code)),o=(0,T.a)();e.concat(s).forEach((e=>{if(n.has(e.lang_code))return;n.add(e.lang_code);const t=new P.ZP({radioField:new A.Z({text:e.name,name:o,value:e.lang_code}),subtitle:e.native_name});i.set(e.lang_code,t)}));const r=(0,P.De)([...i.values()],(e=>{f.ZP.getLangPack(e,a.includes(e))}));f.ZP.getCacheLangPack().then((e=>{const t=i.get(e.lang_code);t?t.radioField.setValueSilently(!0):console.error("no row",t,e)})),t.content.append(r)}));return this.scrollable.append(t.container),s}}var dt=i(4081),lt=i(6848),ct=i(5701);function ht(e,t,i){const s=new b.Z({name:t}),n="settings.autoDownload."+e+".",a=new Ce.Z({text:"AutodownloadContacts",name:"contacts",stateKey:n+"contacts",listenerSetter:i}),o=new Ce.Z({text:"AutodownloadPrivateChats",name:"private",stateKey:n+"private",listenerSetter:i}),r=new Ce.Z({text:"AutodownloadGroupChats",name:"groups",stateKey:n+"groups",listenerSetter:i}),d=new Ce.Z({text:"AutodownloadChannels",name:"channels",stateKey:n+"channels",listenerSetter:i});return s.content.append((0,P.tG)(a).container,(0,P.tG)(o).container,(0,P.tG)(r).container,(0,P.tG)(d).container),s}class ut extends M.h{init(){this.setTitle("AutoDownloadPhotos");const e=ht("photo","AutoDownloadPhotosTitle",this.listenerSetter);this.scrollable.append(e.container)}}class pt extends M.h{init(){this.setTitle("AutoDownloadFiles");const e=(0,ct.Z)((e=>{this.managers.appStateManager.setByKey("settings.autoDownloadNew.file_size_max",e)}),200,!1,!0),t=ht("file","AutoDownloadFilesTitle",this.listenerSetter),i=524288,s=20447232,a=n.Z.settings.autoDownloadNew.file_size_max,o=Math.sqrt(Math.sqrt((a-i)/s)),r=new f.ZP.IntlElement({key:"AutodownloadSizeLimitUpTo",args:[(0,dt.Z)(a)]}),d=new Ge("AutoDownloadMaxFileSize",.01,o,0,1,!1);d.onChange=t=>{const n=Math.pow(t,4)*s+i|0;r.compareAndUpdate({args:[(0,dt.Z)(n)]}),e(n)},d.valueContainer.append(r.element),t.content.append(d.container),this.scrollable.append(t.container)}}class ft extends M.h{init(){this.setTitle("AutoDownloadVideos");const e=ht("video","AutoDownloadVideosTitle",this.listenerSetter);this.scrollable.append(e.container)}}const mt={contacts:"AutoDownloadContacts",private:"AutoDownloadPm",groups:"AutoDownloadGroups",channels:"AutoDownloadChannels"};class gt extends M.h{init(){return e=this,t=void 0,s=function*(){this.setTitle("DataSettings");{const e=new b.Z({name:"AutomaticMediaDownload",caption:"AutoDownloadAudioInfo"}),t=yield nt.Z.getState(),i=new Ce.Z({text:"AutoDownloadMedia",name:"auto",checked:!t.settings.autoDownloadNew.pFlags.disabled,listenerSetter:this.listenerSetter}),s=new P.ZP({checkboxField:i,listenerSetter:this.listenerSetter}),a=()=>{(0,G.Z)([h],(0,lt.Z)(t.settings.autoDownload,Ue.h.settings.autoDownload)&&(0,lt.Z)(t.settings.autoDownloadNew,Ue.h.settings.autoDownloadNew))},o=()=>{this.setAutoDownloadSubtitle(d,t.settings.autoDownload.photo),this.setAutoDownloadSubtitle(l,t.settings.autoDownload.video),this.setAutoDownloadSubtitle(c,t.settings.autoDownload.file,t.settings.autoDownloadNew.file_size_max)},r=e=>{const t=this.slider.createTab(e);t.open(),this.listenerSetter.add(t.eventListener)("destroy",(()=>{o(),a()}),{once:!0})},d=new P.ZP({titleLangKey:"AutoDownloadPhotos",subtitle:"",clickable:()=>{r(ut)},listenerSetter:this.listenerSetter}),l=new P.ZP({titleLangKey:"AutoDownloadVideos",subtitle:"",clickable:()=>{r(ft)},listenerSetter:this.listenerSetter}),c=new P.ZP({titleLangKey:"AutoDownloadFiles",subtitle:"",clickable:()=>{r(pt)},listenerSetter:this.listenerSetter}),h=(0,I.Z)("btn-primary btn-transparent primary",{icon:"delete",text:"ResetAutomaticMediaDownload"});(0,v.fc)(h,(()=>{(0,Ee.Z)({titleLangKey:"ResetAutomaticMediaDownloadAlertTitle",descriptionLangKey:"ResetAutomaticMediaDownloadAlert",button:{langKey:"Reset"}}).then((()=>{const e=n.Z.settings;e.autoDownloadNew=(0,st.Z)(Ue.h.settings.autoDownloadNew),e.autoDownload=(0,st.Z)(Ue.h.settings.autoDownload),t.settings=e,this.managers.appStateManager.setByKey("settings",e),o(),i.checked=!t.settings.autoDownloadNew.pFlags.disabled}))}));const u=()=>{const e=!i.checked,t=n.Z.settings;e?t.autoDownloadNew.pFlags.disabled=!0:delete t.autoDownloadNew.pFlags.disabled,[d,l,c].forEach((t=>{t.container.classList.toggle("is-disabled",e)})),this.managers.appStateManager.setByKey("settings",t),a()};i.input.addEventListener("change",u),u(),o(),e.content.append(s.container,d.container,l.container,c.container,h),this.scrollable.append(e.container)}{const e=new b.Z({name:"AutoplayMedia"});e.content.append(new P.ZP({checkboxField:new Ce.Z({text:"AutoplayGIF",name:"gifs",stateKey:"settings.autoPlay.gifs",listenerSetter:this.listenerSetter}),listenerSetter:this.listenerSetter}).container,new P.ZP({checkboxField:new Ce.Z({text:"AutoplayVideo",name:"videos",stateKey:"settings.autoPlay.videos",listenerSetter:this.listenerSetter}),listenerSetter:this.listenerSetter}).container),this.scrollable.append(e.container)}},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}setAutoDownloadSubtitle(e,t,i){let s;const n=[],a=Object.keys(t),o=a.map((e=>t[e]?mt[e]:void 0)).filter(Boolean);if(o.length&&0!==i){const e=o.length===a.length;if(void 0!==i?(s=e?"AutoDownloadUpToOnAllChats":"AutoDownloadOnUpToFor",n.push((0,dt.Z)(i))):s=e?"AutoDownloadOnAllChats":"AutoDownloadOnFor",!e){const e=document.createElement("span");e.append(...(0,f.v_)(o.map((e=>(0,f.ag)(e))),!0,!1)),n.push(e)}}else s="AutoDownloadOff";(0,Z.Z)(e.subtitle,(0,f.ag)(s,n))}}var vt=i(2230),bt=i(8261),yt=i(6765),wt=i(1168),St=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Ct extends l._{constructor(){super(...arguments),this.buttons={}}init(){return St(this,void 0,void 0,(function*(){this.container.classList.add("settings-container"),this.setTitle("Settings");const e=(0,E.Z)({listenerSetter:this.listenerSetter,direction:"bottom-left",buttons:[{icon:"logout",text:"EditAccount.Logout",onClick:()=>{new B.Z("logout",{titleLangKey:"LogOut",descriptionLangKey:"LogOut.Description",buttons:[{langKey:"LogOut",callback:()=>{this.managers.apiManager.logOut()},isDanger:!0}]}).show()}}]});this.buttons.edit=(0,vt.Z)("edit"),this.header.append(this.buttons.edit,e),this.profile=new bt.Z(this.managers,this.scrollable,this.listenerSetter,!1),this.profile.init(),this.profile.setPeer(n.Z.myId);const t=this.profile.fillProfileElements(),i=(0,I.Z)("btn-circle btn-corner z-depth-1 profile-change-avatar",{icon:"cameraadd"});(0,v.fc)(i,(()=>{const e=document.createElement("canvas");wt.Z.createPopup(yt.Z).open(e,(e=>{e().then((e=>this.managers.appProfileManager.uploadProfilePhoto(e)))}))}),{listenerSetter:this.listenerSetter}),this.profile.element.lastElementChild.firstElementChild.append(i);const s=()=>St(this,void 0,void 0,(function*(){var e;const t=yield this.managers.appUsersManager.getSelf();i.classList.toggle("hide","userProfilePhoto"!==(null===(e=t.photo)||void 0===e?void 0:e._))}));s(),this.listenerSetter.add(n.Z)("avatar_update",(({peerId:e})=>{n.Z.myId===e&&s()}));const a=document.createElement("div");a.classList.add("profile-buttons");const o=(e,t,i,s)=>{if(!s){const e=i.getInitArgs;e&&(s=()=>[e(this)])}return{icon:e,text:t,tabConstructor:i,getInitArgs:s,args:null==s?void 0:s()}},r=[o("unmute","AccountSettings.Notifications",ot),o("data","DataSettings",gt),o("lock","AccountSettings.PrivacyAndSecurity",ke),o("settings","Telegram.GeneralSettingsViewController",Ve),o("folder","AccountSettings.Filters",it)].map((e=>{const{icon:t,text:i,tabConstructor:s,getInitArgs:n}=e;return new P.ZP({titleLangKey:i,icon:t,clickable:()=>St(this,void 0,void 0,(function*(){const t=e.args?yield e.args:[],i=this.slider.createTab(s);i.open(...t),i instanceof M.h&&n&&i.eventListener.addEventListener("destroyAfter",(t=>{e.args=t.then((()=>n()))}))})),listenerSetter:this.listenerSetter})})),d=rt.getInitArgs();r.push(this.devicesRow=new P.ZP({titleLangKey:"Devices",titleRightSecondary:" ",icon:"activesessions",clickable:()=>St(this,void 0,void 0,(function*(){this.authorizations||(yield this.updateActiveSessions());const e=this.slider.createTab(ge);e.authorizations=this.authorizations,e.eventListener.addEventListener("destroy",(()=>{this.authorizations=void 0,this.updateActiveSessions(!0)}),{once:!0}),e.open()})),listenerSetter:this.listenerSetter}),this.languageRow=new P.ZP({titleLangKey:"AccountSettings.Language",titleRightSecondary:(0,f.ag)("LanguageName"),icon:"language",clickable:()=>{this.slider.createTab(rt).open(d)},listenerSetter:this.listenerSetter})),a.append(...r.map((e=>e.container)));const l=new b.Z;l.content.append(a),this.scrollable.append(this.profile.element,l.container);const c=()=>{h=Ke.Z.getInitArgs()};let h;(0,v.fc)(this.buttons.edit,(()=>{this.slider.createTab(Ke.Z).open(h)}),{listenerSetter:this.listenerSetter}),c(),this.listenerSetter.add(n.Z)("user_update",(e=>{n.Z.myId.toUserId()===e&&c()})),We.Z.loadLottieWorkers(),this.updateActiveSessions(),(yield t)()}))}getAuthorizations(e){if(this.getAuthorizationsPromise&&!e)return this.getAuthorizationsPromise;const t=this.getAuthorizationsPromise=this.managers.apiManager.invokeApi("account.getAuthorizations").finally((()=>{this.getAuthorizationsPromise===t&&(this.getAuthorizationsPromise=void 0)}));return t}updateActiveSessions(e){return this.getAuthorizations(e).then((e=>{this.authorizations=e.authorizations,this.devicesRow.titleRight.textContent=""+this.authorizations.length}))}onCloseAfterTimeout(){return this.profile.destroy(),super.onCloseAfterTimeout()}}class Lt extends l._{constructor(){super(...arguments),this.uploadAvatar=null}init(){this.container.classList.add("new-channel-container"),this.setTitle("NewChannel"),this.avatarEdit=new p.Z((e=>{this.uploadAvatar=e}));const e=new b.Z({caption:"Channel.DescriptionHolderDescrpiton"}),t=document.createElement("div");t.classList.add("input-wrapper"),this.channelNameInputField=new u.ZP({label:"EnterChannelName",maxLength:128}),this.channelDescriptionInputField=new u.ZP({label:"DescriptionOptionalPlaceholder",maxLength:255}),t.append(this.channelNameInputField.container,this.channelDescriptionInputField.container);const i=()=>{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",i),this.channelDescriptionInputField.input.addEventListener("input",i),this.nextBtn=(0,m.Z)({icon:"arrow_next"}),(0,v.fc)(this.nextBtn,(()=>{const e=this.channelNameInputField.value,t=this.channelDescriptionInputField.value;this.nextBtn.disabled=!0,this.managers.appChatsManager.createChannel({title:e,about:t,broadcast:!0}).then((e=>{this.uploadAvatar&&this.uploadAvatar().then((t=>{this.managers.appChatsManager.editPhoto(e,t)})),s.ZP.setInnerPeer({peerId:e.toPeerId(!0)}),Wt.removeTabFromHistory(this),this.slider.createTab(_.Z).open({type:"channel",skippable:!0,title:"GroupAddMembers",placeholder:"SendMessageTo",takeOut:t=>this.managers.appChatsManager.inviteToChannel(e,t)})}))}),{listenerSetter:this.listenerSetter}),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 Et=i(241),It=i(2621),Mt=i(709),Pt=i(6272);class Zt extends wt.Z{constructor(){super("popup-create-contact popup-send-photo popup-new-media",{closable:!0,withConfirm:"Add",title:"AddContactTitle"}),this.construct()}construct(){return e=this,t=void 0,s=function*(){(0,v.fc)(this.btnConfirm,(()=>{const e=this.managers.appUsersManager.importContact(i.value,s.value,n.value);e.then((()=>{this.hide()}),(e=>{"NO_USER"===e.type&&((0,ee.bC)({langPackKey:"Contacts.PhoneNumber.NotRegistred"}),d.disabled=!1)})),d.lockWithPromise(e)}),{listenerSetter:this.listenerSetter});const e=[],t=document.createElement("div");t.classList.add("name-fields");const i=new u.ZP({label:"FirstName",name:"create-contact-name",maxLength:70,required:!0}),s=new u.ZP({label:"LastName",name:"create-contact-lastname",maxLength:70}),n=new Mt.Z({required:!0});e.push(i,s,n);const a=()=>{const e=i.value+" "+s.value;d.avatarElem.peerTitle=e,d.avatarElem.update()};this.listenerSetter.add(i.input)("input",a),this.listenerSetter.add(s.input)("input",a),n.validate=()=>!!n.value.match(/\d/);const o=yield this.managers.appUsersManager.getSelf(),r=(0,Pt.u)(o.phone);r.code&&(n.value="+"+r.code.country_code);const d=new It.Z({inputFields:e,listenerSetter:this.listenerSetter,doNotEditAvatar:!0,nextBtn:this.btnConfirm,avatarSize:100});t.append(i.container,s.container,d.avatarElem),this.container.append(t,n.container),this.show()},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var Tt=i(2894),kt=i(3624);class xt extends l._{init(){this.container.id="contacts-container";const e=(0,m.Z)({icon:"add",className:"is-visible"});this.content.append(e),(0,v.fc)(e,(()=>{wt.Z.createPopup(Zt)}),{listenerSetter:this.listenerSetter}),this.inputSearch=new d.Z("Search",(e=>{this.openContacts(e)})),this.listenerSetter.add(n.Z)("contacts_update",(e=>{return t=this,i=void 0,n=function*(){const t=yield this.managers.appUsersManager.isContact(e),i=e.toPeerId();t?this.sortedUserList.add(i):this.sortedUserList.delete(i)},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n})),this.title.replaceWith(this.inputSearch.container),this.middleware=(0,kt.k)(),this.openContacts()}createList(){const e=new Tt.Z({managers:this.managers}),t=e.list;return t.id="contacts",t.classList.add("contacts-container"),h.default.setListClickListener(t,(()=>{this.close()}),void 0,!0),e}onClose(){this.middleware.clean()}onOpenAfterTimeout(){!z.IS_MOBILE&&j(!0)&&this.inputSearch.input.focus()}openContacts(e){this.middleware.clean();const t=this.middleware.get();this.scrollable.onScrolledBottom=null,this.scrollable.container.textContent="",this.managers.appUsersManager.getContactsPeerIds(e,void 0,"online").then((e=>{if(!t())return;const i=this.sortedUserList=this.createList();let s=()=>{const t=Et.Z.height/56*1.25|0;e.splice(0,t).forEach((e=>{i.add(e)})),e.length||(s=void 0,this.scrollable.onScrolledBottom=null)};s(),this.scrollable.onScrolledBottom=()=>{s?s():this.scrollable.onScrolledBottom=null},(0,Z.Z)(this.scrollable.container,i.list)}))}}class At extends l._{init(){if(this.wasFilterId=h.default.filterId,this.container.id="chats-archived-container",this.setTitle("ArchivedChats"),this.header.classList.add("can-have-forum"),this.content.classList.add("can-have-forum"),!h.default.xds[At.filterId]){const{ul:e,scrollable:t}=h.default.l({title:void 0,id:At.filterId,localId:Qe.Zi});t.container.append(e)}const e=h.default.xds[At.filterId].scrollable;return this.scrollable.container.replaceWith(e.container),e.attachBorderListeners(this.container),h.default.setFilterIdAndChangeTab(At.filterId).then((({cached:e,renderPromise:t})=>{if(e)return t}))}onOpenAfterTimeout(){h.default.xds[this.wasFilterId].clear()}onClose(){this.scrollable.onAdditionalScroll=void 0,h.default.setFilterIdAndChangeTab(this.wasFilterId)}onCloseAfterTimeout(){return h.default.xds[At.filterId].clear(),super.onCloseAfterTimeout()}}At.filterId=Qe.Zi;class _t extends l._{constructor(){super(...arguments),this.isLocationWatched=!1}parseDistance(e){return"miles"===n.Z.settings.distanceUnit?e>1609.34?(0,f.ag)("MilesAway",[Math.round(e/1609)]):(0,f.ag)("FootsAway",[Math.round(3.281*e)]):e>=1e3?(0,f.ag)("KMetersAway2",[e/1e3]):(0,f.ag)("MetersAway2",[e])}startWatching(){this.latestLocationSaved&&!this.isLocationWatched&&(this.isLocationWatched=!0,(0,ee.Am)("Your position is now being shared. Do not close the page or it will be suspended."),this.managers.appUsersManager.getLocated(this.latestLocationSaved.latitude,this.latestLocationSaved.longitude,this.latestLocationSaved.accuracy,!0,2147483647),navigator.geolocation.watchPosition((e=>{const t=e.coords.longitude!==this.latestLocationSaved.longitude,i=e.coords.latitude!==this.latestLocationSaved.latitude,s=this.calculateDistance(e.coords.latitude,e.coords.longitude,this.latestLocationSaved.latitude,this.latestLocationSaved.longitude)>100;(i||t)&&s&&(this.managers.appUsersManager.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,(0,ee.Am)("The sharing of your position has been stopped. You will no longer be visible to other users."),this.managers.appUsersManager.getLocated(0,0,0,!1,0))}calculateDistance(e,t,i,s){const n=.017453292519943295;return 12742*Math.asin(Math.sqrt(.5-Math.cos((i-e)*n)+Math.cos(e*n)*Math.cos(i*n)*(1-Math.cos((s-t)*n)/2)))}}var Ft=i(6385),Dt=i(8842),Rt=i(4159),Bt=i(7487),Nt=i(1405),Ot=i(2559),Ut=i(4755),Ht=i(3035),zt=i(6472),jt=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Gt="is-left-column-shown";class Vt extends l.Z{constructor(){super({sidebarEl:document.getElementById("column-left"),navigationType:"left"}),this.searchGroups={}}construct(e){this.managers=e,this.inputSearch=new d.Z("Search");const t=this.sidebarEl.querySelector(".item-main .sidebar-header");t.append(this.inputSearch.container);const i=()=>{this.createTab(xt).open()};this.backBtn=this.sidebarEl.querySelector(".sidebar-back-button");const a={icon:"archive",text:"ArchivedChats",onClick:()=>{this.createTab(At).open()},verify:()=>jt(this,void 0,void 0,(function*(){return!!(yield this.managers.dialogsStorage.getFolderDialogs(Qe.Zi,!1)).length||!(yield this.managers.dialogsStorage.isDialogsLoaded(Qe.Zi))}))},o=new Ce.Z({toggle:!0,checked:"night"===ze.Z.getTheme().name});o.input.addEventListener("change",(()=>jt(this,void 0,void 0,(function*(){ze.Z.switchTheme(o.input.checked?"night":"day")})))),n.Z.addEventListener("theme_change",(()=>{o.setValueSilently("night"===ze.Z.getTheme().name)}));const r=[{icon:"savedmessages",text:"SavedMessages",onClick:()=>{setTimeout((()=>{s.ZP.setPeer({peerId:s.ZP.myId})}),0)}},a,{icon:"user",text:"Contacts",onClick:i},Be.Z?{icon:"group",text:"PeopleNearby",onClick:()=>{this.createTab(_t).open()}}:void 0,{icon:"settings",text:"Settings",onClick:()=>{this.createTab(Ct).open()}},{icon:"darkmode",text:"DarkMode",onClick:()=>{},checkboxField:o},{icon:"animations",text:"Animations",onClick:()=>{},checkboxField:new Ce.Z({toggle:!0,checked:!0,stateKey:"settings.animationsEnabled"})},{icon:"help",text:"TelegramFeatures",onClick:()=>{const e=f.ZP.format("TelegramFeaturesUrl",!0);s.ZP.openUrl(e)}},{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([Bt.Z.set({kz_version:"Z"}),Bt.Z.delete("tgme_sync")]).then((()=>{location.href="https://web.telegram.org/z/"}))},verify:()=>Rt.Z.isMainDomain},{icon:"char w",text:"ChatList.Menu.SwitchTo.Webogram",onClick:()=>{Bt.Z.delete("tgme_sync").then((()=>{location.href="https://web.telegram.org/?legacy=1"}))},verify:()=>Rt.Z.isMainDomain},{icon:"download",text:"PWA.Install",onClick:()=>{const e=(0,zt.B)();null==e||e()},verify:()=>!!(0,zt.B)()}].filter(Boolean);this.toolsBtn=(0,E.Z)({direction:"bottom-right",buttons:r,onOpen:(e,t)=>{var i;const s=document.createElement("a");s.href="https://github.com/morethanwords/tweb/blob/master/CHANGELOG.md",s.target="_blank",s.rel="noopener noreferrer",s.classList.add("btn-menu-footer"),s.addEventListener(v.pf,(e=>{e.stopPropagation(),me.Z.close()}));const n=document.createElement("span");n.classList.add("btn-menu-footer-text"),n.innerHTML="Telegram Web"+Rt.Z.suffix+" "+Rt.Z.versionFull,s.append(n),t.classList.add("has-footer"),t.append(s),null===(i=a.element)||void 0===i||i.append(this.archivedCount)}}),this.toolsBtn.classList.remove("tgico-more"),this.toolsBtn.classList.add("sidebar-tools-button","is-visible"),this.backBtn.parentElement.insertBefore(this.toolsBtn,this.backBtn),this.newBtnMenu=(0,E.Z)({direction:"top-left",buttons:[{icon:"newchannel",text:"NewChannel",onClick:()=>{this.createTab(Lt).open()}},{icon:"newgroup",text:"NewGroup",onClick:()=>{this.createTab(_.Z).open({type:"chat",skippable:!1,takeOut:e=>this.createTab(y).open(e),title:"GroupAddMembers",placeholder:"SendMessageTo"})}},{icon:"newprivate",text:"NewPrivateChat",onClick:i}]}),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",t.nextElementSibling.append(this.newBtnMenu),this.updateBtn=document.createElement("div"),this.updateBtn.className="btn-circle rp btn-corner z-depth-1 btn-update is-hidden",(0,Nt.Z)(this.updateBtn),this.updateBtn.append((0,f.ag)("Update")),(0,v.fc)(this.updateBtn,(()=>{this.updateBtn.classList.contains("is-hidden")||location.reload()})),t.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",n.Z.addEventListener("folder_unread",(e=>{if(e.id===Qe.Zi){const t=e.unreadPeerIds.size;this.archivedCount.textContent=""+(0,Ot.Z)(t,1),this.archivedCount.classList.toggle("hide",!t)}})),this.managers.appUsersManager.getTopPeers("correspondents");const l={type:"global-search-focus",onPop:()=>(setTimeout((()=>{this.inputSearch.input.focus()}),0),!1),noHistory:!0};Ft.Z.pushItem(l),nt.Z.getState().then((()=>{const e=setInterval((()=>{fetch("version",{cache:"no-cache"}).then((e=>200===e.status&&e.ok&&e.text()||Promise.reject())).then((t=>{t!==Rt.Z.versionFull&&(this.hasUpdate=!0,clearInterval(e),this.newBtnMenu.classList.contains("is-hidden")||this.updateBtn.classList.remove("is-hidden"))})).catch(Ie.Z)}),18e5)}));const c=()=>{const e=this.rect=this.tabsContainer.getBoundingClientRect();document.documentElement.style.setProperty("--left-column-width",e.width+"px")};(0,Ht.T2)(c),Ut.Z.addEventListener("resize",c)}initSearch(){const e=this.sidebarEl.querySelector("#search-container"),t=new r.ZP(e),i=()=>{(0,v.tH)(this.backBtn)};this.searchGroups={contacts:new a.z("SearchAllChatsShort","contacts",void 0,void 0,void 0,void 0,i),globalContacts:new a.z("GlobalSearch","contacts",void 0,void 0,void 0,void 0,i),messages:new a.z("SearchMessages","messages"),people:new a.z(!1,"contacts",!0,"search-group-people",!0,!1,i,!0),recent:new a.z("Recent","contacts",!0,"search-group-recent",!0,!0,i)};const s=this.searchSuper=new S.Z({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,managers:this.managers});e.prepend(s.nav.parentElement.parentElement),t.container.append(s.container),s.setQuery({peerId:"".toPeerId(),folderId:0}),s.selectTab(0),s.load(!0);const n=[];let d="".toPeerId(),l=0,u=0;const p=()=>{this.inputSearch.container.classList.toggle("is-picked-twice",2===n.length),this.inputSearch.container.classList.toggle("is-picked",!!n.length),n.length?this.inputSearch.input.style.setProperty("--paddingLeft",n[n.length-1].getBoundingClientRect().right-this.inputSearch.input.getBoundingClientRect().left+"px"):this.inputSearch.input.style.removeProperty("--paddingLeft")},f=document.createElement("div");f.classList.add("search-helper"),f.addEventListener("click",(e=>{const t=(0,he.Z)(e.target,"selector-user");if(!t)return;const i=t.dataset.key;if(0===i.indexOf("date_")){const[e,t,s]=i.split("_");l=+t,u=+s}else d=i.toPeerId();t.addEventListener("click",(()=>{g(t)})),this.inputSearch.container.append(t),this.inputSearch.onChange(this.inputSearch.value=""),n.push(t),p()})),s.nav.parentElement.append(f);const m=(e,t)=>{const i=document.createElement("div");i.classList.add("selector-user");const s=new o.Z;return s.classList.add("selector-user-avatar","tgico","avatar-32"),s.isDialog=!0,i.dataset.key=""+e,e.isPeerId()?(void 0===t&&(t=new Dt.Z({peerId:e.toPeerId()}).element),s.updateWithOptions({peerId:e})):s.classList.add("tgico-calendarfilter"),t&&("string"==typeof t?i.innerHTML=t:((0,Z.Z)(i,t),i.append(t))),i.insertAdjacentElement("afterbegin",s),i},g=e=>{0===e.dataset.key.indexOf("date_")?l=u=0:d="".toPeerId(),e.remove(),(0,Je.Z)(n,e),setTimeout((()=>{p(),this.inputSearch.onChange(this.inputSearch.value)}),0)};this.inputSearch.onClear=()=>{n.forEach((e=>{g(e)}))},this.inputSearch.onChange=e=>{if(s.cleanupHTML(),s.setQuery({peerId:d,folderId:d?void 0:0,query:e,minDate:l,maxDate:u}),s.load(!0),f.innerHTML="",s.nav.classList.remove("hide"),!d&&e.trim()){const t=s.middleware.get();Promise.all([this.managers.dialogsStorage.getDialogs({query:e}).then((({dialogs:e})=>e.map((e=>e.peerId)))),this.managers.appUsersManager.getContactsPeerIds(e,!0)]).then((e=>{t()&&(new Set(e[0].concat(e[1])).forEach((e=>{f.append(m(e))})),s.nav.classList.toggle("hide",!!f.innerHTML))}))}if(!l&&e.trim()){const t=[];(0,C.fl)(e,t),t.forEach((e=>{f.append(m("date_"+e.minDate+"_"+e.maxDate,e.title))})),s.nav.classList.toggle("hide",!!f.innerHTML)}},s.tabs.inputMessagesFilterEmpty.addEventListener("mousedown",(e=>{const t=(0,be.Z)(e.target,h.DIALOG_LIST_ELEMENT_TAG);if(!t)return;const i=(0,he.Z)(t,"search-group");if(!i||i.classList.contains("search-group-recent")||i.classList.contains("search-group-people"))return;const s=t.getAttribute("data-peer-id").toPeerId();this.managers.appUsersManager.pushRecentSearch(s)}),{capture:!0});const b=document.createElement("div");b.classList.add("search-group-scrollable"),b.append(this.searchGroups.people.list),this.searchGroups.people.container.append(b),new r.v7(b);let y,w=!0;const L=(0,c.Z)({content:e.parentElement,type:"zoom-fade",transitionTime:150,onTransitionEnd:e=>{y&&clearTimeout(y),0!==e||w||(s.selectTab(0,!1),this.inputSearch.onClearClick(),y=window.setTimeout((()=>{y=0,this.newBtnMenu.classList.remove("is-hidden"),this.hasUpdate&&this.updateBtn.classList.remove("is-hidden")}),150)),w=!1}});L(0);const E="is-visible",I=()=>{this.toolsBtn.classList.remove(E),this.backBtn.classList.add(E),this.newBtnMenu.classList.add("is-hidden"),this.updateBtn.classList.add("is-hidden"),this.toolsBtn.parentElement.firstElementChild.classList.toggle("state-back",!0);const e="global-search";z.IS_MOBILE_SAFARI||Ft.Z.findItemByType(e)||Ft.Z.pushItem({onPop:()=>{i()},type:e}),L(1)};this.inputSearch.input.addEventListener("focus",I),I(),(0,v.fc)(this.backBtn,(e=>{this.toolsBtn.classList.add(E),this.backBtn.classList.remove(E),this.toolsBtn.parentElement.firstElementChild.classList.toggle("state-back",!1),Ft.Z.removeByType("global-search"),L(0)}));const M=(0,vt.Z)("close");this.searchGroups.recent.nameEl.append(M),M.addEventListener("click",(()=>{(0,Ee.Z)({descriptionLangKey:"Search.Confirm.ClearHistory",button:{langKey:"ClearButton",isDanger:!0}}).then((()=>this.managers.appUsersManager.clearRecentSearch().then((()=>{this.searchGroups.recent.clear()}))))}))}}const Kt=new Vt;L.GO.appSidebarLeft=Kt;const Wt=Kt},5670:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(3552),n=i(5644),a=i(279),o=i(8119);class r extends s._{init(e){this.container.classList.add("add-members-container"),this.nextBtn=(0,o.Z)({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())),t=this.takeOut(e);this.skippable?this.close():t instanceof Promise?this.attachToPromise(t):void 0===t&&this.close()})),this.setTitle(e.title),this.peerType=e.type,this.takeOut=e.takeOut,this.skippable=e.skippable;const t="privacy"===this.peerType;this.selector=new n.Z({appendTo:this.content,onChange:this.skippable?null:e=>{this.nextBtn.classList.toggle("is-visible",!!e)},peerType:[t?"dialogs":"contacts"],placeholder:e.placeholder,exceptSelf:t,filterPeerTypeBy:t?["isAnyGroup","isUser"]:void 0,managers:this.managers,design:"square"}),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)}attachToPromise(e){const t=(0,a.p)(this.nextBtn,"arrow_next");e.then((()=>{this.close()}),(()=>{t()}))}}},9439:(e,t,i)=>{"use strict";i.d(t,{Z:()=>B});var s=i(6740);function n(e){const t=e.getContext("2d"),i=new Array(4).fill(0),s=t.getImageData(0,0,e.width,e.height).data,n=s.length/4;for(let e=0;e0&&(i=Math.min(100,i+5+.1*(100-i))),s=Math.max(0,.65*s),`hsla(${t}, ${i}%, ${s}%, .4)`}var h=i(8479),u=i(9674),p=i(1571),f=i(2312),m=i(9322),g=i(3512),v=i(4494),b=i(9807),y=i(3442),w=i(3552),S=i(6724),C=i(6714),L=i(5077),E=i(3228),I=i(503);class M{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(M.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 I.ZP({plainText:!0,label:"Appearance.Color.Hex"}),this.rgbInputField=new I.ZP({plainText:!0,label:"Appearance.Color.RGB"});const t=document.createElement("div");t.className=M.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]+)/),i=t&&t[0].length===e.length&&[6].includes(e.length);this.hexInputField.setState(i?I.I1.Neutral:I.I1.Error),e="#"+e,this.hexInputField.setValueSilently(e),i&&this.setColor(e,!1,!0)}));const i=/^(?: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(i);this.rgbInputField.setState(e?I.I1.Neutral:I.I1.Error),e&&this.setColor((0,l.dI)(+e[1],+e[2],+e[3]),!0,!1)})),this.attachBoxListeners(),this.attachHueListeners()}attachBoxListeners(){(0,L.Z)(this.elements.box,(()=>{this.onGrabStart(),this.boxRect=this.elements.box.getBoundingClientRect()}),(e=>{this.saturationHandler(e.x,e.y)}),(()=>{this.onGrabEnd()}))}attachHueListeners(){(0,L.Z)(this.elements.hue,(()=>{this.onGrabStart(),this.hueRect=this.elements.hue.getBoundingClientRect()}),(e=>{this.hueHandler(e.x)}),(()=>{this.onGrabEnd()}))}setColor(e,t=!0,i=!0){if(void 0===e)e={h:0,s:100,l:50,a:1};else if("string"==typeof e)if("#"===e[0])e=(0,l.cw)(e);else{const t=e.match(/[.?\d]+/g);e=(0,l.dI)(+t[0],+t[1],+t[2],void 0===t[3]?1:+t[3])}this.boxRect=this.elements.box.getBoundingClientRect();const s=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+s,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,i)}getCurrentColor(){const e=(0,l.Y6)(this.hue,this.saturation,this.lightness,this.alpha),t=(0,l.t1)(e),i=t.slice(0,-2);return{hsl:`hsl(${this.hue}, ${this.saturation}%, ${this.lightness}%)`,rgb:`rgb(${e[0]}, ${e[1]}, ${e[2]})`,hex:i,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 i=this.getCurrentColor();this.elements.boxDragger.setAttributeNS(null,"fill",i.hex),e&&(this.hexInputField.setValueSilently(i.hex),this.hexInputField.setState(I.I1.Neutral)),t&&(this.rgbInputField.setValueSilently(i.rgbaArray.slice(0,-1).join(", ")),this.rgbInputField.setState(I.I1.Neutral)),this.onChange&&this.onChange(i)}hueHandler(e,t=!0){const i=(0,E.Z)(e-this.hueRect.left,0,this.hueRect.width)/this.hueRect.width;this.hue=Math.round(360*i);const s=`hsla(${this.hue}, 100%, 50%, ${this.alpha})`;this.elements.hueDragger.setAttributeNS(null,"x",100*i+"%"),this.elements.hueDragger.setAttributeNS(null,"fill",s),this.elements.saturation.lastElementChild.setAttributeNS(null,"stop-color",s),t&&this.updatePicker()}saturationHandler(e,t,i=!0){const s=this.boxRect.width,n=this.boxRect.height,a=(0,E.Z)(e-this.boxRect.left,0,s)/s*100,o=(0,E.Z)(t-this.boxRect.top,0,n)/n*100,r=this.elements.boxDragger;r.setAttributeNS(null,"x",a+"%"),r.setAttributeNS(null,"y",o+"%");const d=(0,E.Z)(a,0,100),l=100-d/2,c=100-(0,E.Z)(o,0,100),h=(0,E.Z)(c/100*l,0,100);this.saturation=d,this.lightness=h,i&&this.updatePicker()}}M.BASE_CLASS="color-picker";var P=i(5029);class Z extends w._{constructor(){super(...arguments),this._applyColor=(e,t=!0)=>{if(t)this.colorPicker.setColor(e);else{const t=(0,l.Pi)(e),i=this.theme.settings,s=c(t),n={_:"wallPaperNoFile",id:0,pFlags:{},settings:{_:"wallPaperSettings",background_color:parseInt(e.slice(1),16),pFlags:{}}};i.wallpaper=n,i.highlightningColor=s,this.managers.appStateManager.pushToState("settings",g.Z.settings),m.ZP.applyCurrentTheme(void 0,void 0,!0),this.setActive()}},this.onColorChange=e=>{this.applyColor(e.hex,!1)}}init(){this.container.classList.add("background-container","background-color-container"),this.setTitle("SetColor"),this.theme=C.Z.getTheme();const e=new P.Z({});this.colorPicker=new M,e.content.append(this.colorPicker.container),this.scrollable.append(e.container);const t=new P.Z({}),i=this.grid=document.createElement("div");i.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 s=document.createElement("div");s.classList.add("grid-item-media"),s.style.backgroundColor=e,t.append(s),i.append(t)})),(0,r.fc)(i,(e=>{const t=(0,d.Z)(e.target,"grid-item");if(!t||t.classList.contains("active"))return;const i=t.dataset.color;i&&this.applyColor(i)}),{listenerSetter:this.listenerSetter}),t.content.append(i),this.scrollable.append(t.container),this.applyColor=(0,S.Z)(this._applyColor,16,!0)}setActive(){const e=this.grid.querySelector(".active"),t=this.theme.settings.wallpaper.settings.background_color,i=t?this.grid.querySelector(`.grid-item[data-color="${t}"]`):null;e!==i&&(e&&e.classList.remove("active"),i&&i.classList.add("active"))}onOpen(){setTimeout((()=>{var e,t;const i=this.theme.settings,s=null===(t=null===(e=null==i?void 0:i.wallpaper)||void 0===e?void 0:e.settings)||void 0===t?void 0:t.background_color,n=!!s&&"wallPaperNoFile"===i.wallpaper._;n&&(this.colorPicker.onChange=this.onColorChange),this.colorPicker.setColor(s&&"#"+s.toString(16)||"#cccccc"),n||(this.colorPicker.onChange=this.onColorChange)}),0)}onCloseAfterTimeout(){return this.colorPicker.onChange=void 0,this.colorPicker=void 0,super.onCloseAfterTimeout()}}var T,k=i(7030),x=i(236),A=i(7814),_=i(9405),F=i(9492),D=i(7479),R=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class B extends w._{constructor(){super(...arguments),this.clicked=new Set,this.wallPapersByElement=new Map,this.elementsByKey=new Map,this.onUploadClick=()=>{(function(e){const t=document.createElement("input");t.type="file",t.style.display="none",e&&(t.accept=e),document.body.append(t);const i=new Promise(((e,i)=>{t.addEventListener("change",(t=>{const s=t.target.files[0];s?e(s):i("NO_FILE_SELECTED")}),{once:!0})})).finally((()=>{t.remove()}));return t.click(),i})("image/x-png,image/png,image/jpeg").then((e=>R(this,void 0,void 0,(function*(){if(e.name.endsWith(".png")){const t=document.createElement("img"),i=URL.createObjectURL(e);yield(0,s.cj)(t,i,!1);const n="image/jpeg",{blob:a}=yield(0,A.Z)({media:t,size:new _.c(t.naturalWidth,t.naturalHeight),mimeType:n});e=new File([a],e.name.replace(/\.png$/,".jpg"),{type:n})}const t=yield this.managers.appDocsManager.prepareWallPaperUpload(e),i=this.managers.appDocsManager.uploadWallPaper(t.id),n=f.Z.getNewDeferredForUpload(e.name,i),a=(0,o.Z)();a.addNotifyListener=n.addNotifyListener,a.cancel=n.cancel,n.then((e=>{this.clicked.delete(r),this.elementsByKey.delete(r),this.wallPapersByElement.set(l,e);const t=this.getWallPaperKey(e);this.elementsByKey.set(t,l),B.setBackgroundDocument(e).then(a.resolve,a.reject)}),a.reject);const r=this.getWallPaperKey(t);a.catch((()=>{l.remove()}));const d=new y.Z({isUpload:!0,cancelable:!0,tryAgainOnFail:!1}),{container:l}=yield this.addWallPaper(t,!1);this.clicked.add(r),d.attach(l,!1,a)}))))},this.onResetClick=()=>{var e,t,i,s;const n=x.h.settings.themes.find((e=>e.name===this.theme.name));n&&(++B.tempId,this.theme.settings=(0,h.Z)(n.settings),this.managers.appStateManager.pushToState("settings",g.Z.settings),m.ZP.applyCurrentTheme(void 0,void 0,!0),this.blurCheckboxField.setValueSilently(null===(s=null===(i=null===(t=null===(e=this.theme.settings)||void 0===e?void 0:e.wallpaper)||void 0===t?void 0:t.settings)||void 0===i?void 0:i.pFlags)||void 0===s?void 0:s.blur))},this.onGridClick=e=>{const t=(0,d.Z)(e.target,"grid-item");if(!t)return;const i=this.wallPapersByElement.get(t);if("wallPaperNoFile"===i._)return void B.setBackgroundDocument(i);const s=this.getWallPaperKey(i);if(this.clicked.has(s))return;this.clicked.add(s);const n=i.document,a=new y.Z({cancelable:!0,tryAgainOnFail:!1}),o=()=>R(this,void 0,void 0,(function*(){var e,s,o,r;const d=B.setBackgroundDocument(i);(yield this.managers.thumbsStorage.getCacheContext(n)).url&&!(null===(r=null===(o=null===(s=null===(e=this.theme.settings)||void 0===e?void 0:e.wallpaper)||void 0===s?void 0:s.settings)||void 0===o?void 0:o.pFlags)||void 0===r?void 0:r.blur)||a.attach(t,!0,d)}));a.construct(),(0,r.fc)(t,(e=>{a.preloader.parentElement?(a.onClick(e),a.detach()):o()}),{listenerSetter:this.listenerSetter}),o()},this.setActive=()=>{const e=this.grid.querySelector(".active"),t=this.elementsByKey.get(this.getWallPaperKeyFromTheme(this.theme));e!==t&&(e&&e.classList.remove("active"),t&&t.classList.add("active"))}}static getInitArgs(){return{backgrounds:g.Z.managers.appThemesManager.getWallPapers()}}get theme(){return C.Z.getTheme()}init(e=B.getInitArgs()){var t,i,s;this.container.classList.add("background-container","background-image-container"),this.setTitle("ChatBackground");{const e=(0,P.R)(this.scrollable),n=(0,v.Z)("btn-primary btn-transparent",{icon:"cameraadd",text:"ChatBackground.UploadWallpaper"}),a=(0,v.Z)("btn-primary btn-transparent",{icon:"colorize",text:"SetColor"}),d=(0,v.Z)("btn-primary btn-transparent",{icon:"favourites",text:"Appearance.Reset"});(0,r.fc)(n,this.onUploadClick,{listenerSetter:this.listenerSetter}),(0,r.fc)(a,(()=>{this.slider.createTab(Z).open()}),{listenerSetter:this.listenerSetter}),(0,r.fc)(d,this.onResetClick,{listenerSetter:this.listenerSetter});const l=null===(t=this.theme.settings)||void 0===t?void 0:t.wallpaper,c=this.blurCheckboxField=new b.Z({text:"ChatBackground.Blur",name:"blur",checked:null===(s=null===(i=null==l?void 0:l.settings)||void 0===i?void 0:i.pFlags)||void 0===s?void 0:s.blur});this.listenerSetter.add(c.input)("change",(()=>R(this,void 0,void 0,(function*(){this.theme.settings.wallpaper.settings.pFlags.blur=c.input.checked||void 0,yield this.managers.appStateManager.pushToState("settings",g.Z.settings),setTimeout((()=>{const e=o.querySelector(".active");if(!e)return;const t=this.wallPapersByElement.get(e);t.pFlags.pattern||"wallPaperNoFile"===t._||B.setBackgroundDocument(t)}),100)})))),e.append(n,a,d,(0,D.tG)(c).container)}g.Z.addEventListener("background_change",this.setActive);const n=e.backgrounds.then((e=>{const t=e.map((e=>this.addWallPaper(e)));return Promise.all(t)})),a=(0,P.R)(this.scrollable),o=this.grid=document.createElement("div");return o.classList.add("grid"),(0,r.fc)(o,this.onGridClick,{listenerSetter:this.listenerSetter}),a.append(o),n}getWallPaperKey(e){return""+e.id}getWallPaperKeyFromTheme(e){var t;return""+(this.getWallPaperKey(null===(t=e.settings)||void 0===t?void 0:t.wallpaper)||"")}static addWallPaper(e,t=document.createElement("div")){var i;const s=(0,l.EM)(e),n="wallPaper"===e._;if(n&&e.pFlags.pattern&&!s)return;const a=!!e.pFlags.dark;let o=n?e.document:void 0;n&&!o&&(o={_:"webDocumentNoProxy",attributes:[],size:1e5,url:"assets/img/pattern.svg",w:1440,h:2960,mime_type:"image/svg+xml"}),t.classList.add("background-item"),t.dataset.id=""+e.id;const r=document.createElement("div");r.classList.add("background-item-media");const d=[];let c,h;if(n){h=(0,k.Z)(o,200,200),c=(0,F.Z)({photo:o,message:null,container:r,withoutPreloader:!0,size:h,noFadeIn:e.pFlags.pattern}),e.pFlags.pattern&&r.classList.add("is-pattern");const i=c.then((({loadPromises:e,images:t})=>R(this,void 0,void 0,(function*(){return(yield e.thumb)||e.full,t})))).then((i=>{var s;return e.pFlags.pattern&&(a?(i.full.style.display="none",i.thumb&&(i.thumb.style.display="none")):(null===(s=e.settings)||void 0===s?void 0:s.intensity)&&(i.full.style.opacity=""+Math.abs(e.settings.intensity)/100)),u.Z.mutate((()=>{t.append(r)}))}));d.push(i)}else t.append(r);if(null===(i=e.settings)||void 0===i?void 0:i.background_color){const{canvas:t}=p.Z.create(s);if(t.classList.add("background-colors-canvas"),a&&n){const i=c.then((({loadPromises:i})=>i.full.then((()=>R(this,void 0,void 0,(function*(){const i=yield g.Z.managers.thumbsStorage.getCacheContext(o,h.type);t.style.webkitMaskImage=`url(${i.url})`,t.style.opacity=""+(e.pFlags.dark?100+e.settings.intensity:e.settings.intensity)/100,r.append(t)}))))));d.push(i)}else r.append(t)}return{container:t,media:r,loadPromise:Promise.all(d)}}addWallPaper(e,t=!0){const i=B.addWallPaper(e);if(i){const{container:s,media:n}=i;s.classList.add("grid-item"),n.classList.add("grid-item-media");const a=this.getWallPaperKey(e);this.wallPapersByElement.set(s,e),this.elementsByKey.set(a,s),this.getWallPaperKeyFromTheme(this.theme)===a&&s.classList.add("active"),this.grid[t?"append":"prepend"](s)}return i&&i.loadPromise.then((()=>i))}}T=B,B.tempId=0,B.setBackgroundDocument=(e,t)=>{const i=++T.tempId,r=()=>i===T.tempId,d=e.document,h=(0,o.Z)();let u;d?(u=f.Z.downloadMediaURL({media:d,queueId:m.ZP.chat.bubbles?m.ZP.chat.bubbles.lazyLoadQueue.queueId:0}),h.addNotifyListener=u.addNotifyListener,h.cancel=u.cancel):u=Promise.resolve();const v=(e,t)=>{fetch(t).then((t=>{m.ZP.cacheStorage.save("backgrounds/"+e,t)}))};return u.then((()=>R(void 0,void 0,void 0,(function*(){var i,o,u;if(!r())return void h.resolve();const f=!!t;null!=t||(t=C.Z.getTheme().settings);const b=i=>{var a;let o;const d=(0,l.EM)(e);if(i&&!d)o=function(e){const t=document.createElement("img");return(0,s.cj)(t,e,!1).then((()=>function(e,t,i){const s=document.createElement("canvas"),a=t/i;return 1===a?(s.width=50,s.height=s.width/a):a>1?(s.height=50,s.width=s.height/a):s.width=s.height=50,s.getContext("2d").drawImage(e,0,0,t,i,0,0,s.width,s.height),n(s)}(t,t.naturalWidth,t.naturalHeight)))}(i);else{const{canvas:e}=p.Z.create(d);o=Promise.resolve(n(e))}const u=null!==(a=e.slug)&&void 0!==a?a:"";Promise.all([o,u&&v(u,i)]).then((([s])=>{if(!r())return void h.resolve();const n=c(Array.from(s));t.wallpaper=e,t.highlightningColor=n,f||g.Z.managers.appStateManager.pushToState("settings",g.Z.settings),m.ZP.applyCurrentTheme(u,i,!0).then(h.resolve)}))};if(!d)return void b();const y=yield g.Z.managers.thumbsStorage.getCacheContext(d);(null===(u=null===(o=null===(i=t.wallpaper)||void 0===i?void 0:i.settings)||void 0===o?void 0:o.pFlags)||void 0===u?void 0:u.blur)?setTimeout((()=>{const{canvas:e,promise:t}=(0,a.Z)(y.url,12,4);t.then((()=>{r()?b(e.toDataURL()):h.resolve()}))}),200):r()&&b(y.url)})))),h}},534:(e,t,i)=>{"use strict";i.d(t,{Z:()=>T});var s=i(4277),n=i(1447),a=i(3552),o=i(2796),r=i(503),d=i(2230),l=i(5322),c=i(4494),h=i(5644),u=i(9807),p=i(2325),f=i(8479),m=i(7625),g=i(130),v=i(8115),b=i(1507),y=i(3512),w=i(2738),S=i(5029),C=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class L extends a._{constructor(){super(...arguments),this.renderResults=e=>C(this,void 0,void 0,(function*(){yield this.managers.appUsersManager.getContacts(),e.forEach((e=>{const{dom:t}=s.default.addDialogNew({peerId:e,container:this.selector.scrollable,rippleEnabled:!0,avatarSize:"abitbigger"}),i=this.selector.selected.has(e);t.containerEl.append(this.checkbox(i));const n=[];this.dialogsByFilters.forEach(((t,i)=>{if(t.has(e)){const e=document.createElement("span");(0,g.Z)(e,(0,v.Z)(i.title)),n.push(e)}})),(0,p.v_)(n,!1).forEach((e=>{t.lastMessageSpan.append(e)}))}))})),this.onSelectChange=e=>{"included"===this.type&&(this.confirmBtn.style.display=e?"":"none")}}init(e,t,i){this.originalFilter=e,this.filter=(0,f.Z)(this.originalFilter),this.type=t,this.editFolderTab=i,this.content.remove(),this.container.classList.add("included-chatlist-container"),this.confirmBtn=(0,d.Z)("check btn-confirm blue",{noRipple:!0}),this.confirmBtn.style.display="none",this.header.append(this.confirmBtn),(0,w.fc)(this.confirmBtn,(()=>C(this,void 0,void 0,(function*(){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 i of e)i.isPeerId()?t.push(i.toPeerId()):this.filter.pFlags[i]=!0;let i;i="included"===this.type?e=>t.includes(e):e=>!t.includes(e),(0,m.Z)(this.filter.pinnedPeerIds,((e,t)=>{i(e)||(this.filter.pinnedPeerIds.splice(t,1),this.filter.pinned_peers.splice(t,1))}));const s="included"===this.type?"excludePeerIds":"includePeerIds",n="included"===this.type?"exclude_peers":"include_peers";(0,m.Z)(this.filter[s],((e,i)=>{t.includes(e)&&(this.filter[s].splice(i,1),this.filter[n].splice(i,1))})),this.filter["included"===this.type?"includePeerIds":"excludePeerIds"]=t,this.filter["included"===this.type?"include_peers":"exclude_peers"]=yield Promise.all(t.map((e=>this.managers.appPeersManager.getInputPeerById(e)))),this.editFolderTab.setFilter(this.filter,!1),this.close()}))),{listenerSetter:this.listenerSetter});const s=e=>{this.limit=y.Z.premium?e.dialog_filters_chats_limit_premium:e.dialog_filters_chats_limit_default};return this.listenerSetter.add(y.Z)("app_config",s),this.dialogsByFilters=new Map,Promise.all([this.managers.filtersStorage.getDialogFilters().then((e=>C(this,void 0,void 0,(function*(){yield Promise.all(e.filter((e=>!b.DZ.has(e.id))).map((e=>C(this,void 0,void 0,(function*(){const t=(yield this.managers.dialogsStorage.getFolderDialogs(e.id)).map((e=>e.peerId));this.dialogsByFilters.set(e,new Set(t))})))))})))),this.managers.apiManager.getAppConfig().then((e=>{s(e)}))])}checkbox(e){const t=new u.Z({round:!0});return e&&(t.input.checked=e),t.label}onOpen(){this.confirmBtn.style.display="excluded"===this.type?"":"none",this.setTitle("included"===this.type?"FilterAlwaysShow":"FilterNeverShow");const e=this.filter,t=new S.Z({noDelimiter:!0,name:"FilterChatTypes"});let i;t.container.classList.add("folder-categories"),i="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 s=document.createDocumentFragment();for(const e in i){const t=(0,c.Z)("btn-primary btn-transparent folder-category-button",{icon:i[e].ico,text:i[e].text});t.dataset.peerId=e,t.append(this.checkbox()),s.append(t)}t.content.append(s);const n=("included"===this.type?e.includePeerIds:e.excludePeerIds).slice();this.selector=new h.Z({appendTo:this.container,onChange:this.onSelectChange,peerType:["dialogs"],renderResultsFunc:this.renderResults,placeholder:"Search",sectionNameLangPackKey:"FilterChats",managers:this.managers}),this.selector.selected=new Set(n);let a=!1;const r=this.selector.add.bind(this.selector);this.selector.add=(e,t,s)=>{if(this.selector.selected.size>=this.limit&&a&&!i[e]){const t=this.selector.list.querySelector(`[data-peer-id="${e}"] [type="checkbox"]`);t&&setTimeout((()=>{t.checked=!1}),0);const i=p.ZP.format("excluded"===this.type?"ChatList.Filter.Exclude.LimitReached":"ChatList.Filter.Include.LimitReached",!0);return void(0,o.Am)(i)}const n=r(e,i[e]?(0,p.ag)(i[e].text):void 0,s);return i[e]&&n.querySelector("avatar-element").classList.add("tgico-"+i[e].ico),n},this.selector.scrollable.container.append(t.container,this.selector.scrollable.container.lastElementChild),this.selector.addInitial(n),a=!0;for(const s in e.pFlags)i.hasOwnProperty(s)&&e.pFlags[s]&&(0,w.tH)(t.content.querySelector(`[data-peer-id="${s}"]`))}onCloseAfterTimeout(){return this.selector&&(this.selector.container.remove(),this.selector=null),super.onCloseAfterTimeout()}}var E=i(8127),I=i(6848),M=i(3066),P=i(2353),Z=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class T extends a._{constructor(){super(...arguments),this.flags={}}static getInitArgs(){return{animationData:n.Z.loadAnimationFromURLManually("Folders_2")}}init(e=T.getInitArgs()){this.container.classList.add("edit-folder-container"),this.caption=document.createElement("div"),this.caption.classList.add("caption"),this.caption.append((0,p.ag)("FilterIncludeExcludeInfo")),this.stickerContainer=document.createElement("div"),this.stickerContainer.classList.add("sticker-container"),this.confirmBtn=(0,d.Z)("check btn-confirm hide blue");let t=!1;const i={icon:"delete danger",text:"FilterMenuDelete",onClick:()=>{new E.Z("filter-delete",{titleLangKey:"ChatList.Filter.Confirm.Remove.Header",descriptionLangKey:"ChatList.Filter.Confirm.Remove.Text",buttons:[{langKey:"Delete",callback:()=>{t||(t=!0,this.managers.filtersStorage.updateDialogFilter(this.filter,!0).then((e=>{this.close()})).finally((()=>{t=!1})))},isDanger:!0}]}).show()}};this.menuBtn=(0,l.Z)({listenerSetter:this.listenerSetter,direction:"bottom-left",buttons:[i]}),this.menuBtn.classList.add("hide"),this.header.append(this.confirmBtn,this.menuBtn);const s=new S.Z({}),a=document.createElement("div");a.classList.add("input-wrapper"),this.nameInputField=new r.ZP({label:"FilterNameHint",maxLength:12}),a.append(this.nameInputField.container),s.content.append(a);const h=(e,t,i,s)=>{const n=new S.Z({name:t,noDelimiter:!0});n.container.classList.add("folder-list",e);const a=n.generateContentElement();return a.classList.add("folder-categories"),i.forEach((e=>{const t=(0,c.Z)("folder-category-button btn btn-primary btn-transparent",{icon:e.icon,text:e.text,noRipple:!e.withRipple||void 0});e.name&&(s[e.name]=t),a.append(t)})),n};this.includePeerIds=h("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=h("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,s.container,this.includePeerIds.container,this.excludePeerIds.container);const u=this.includePeerIds.container.querySelector(".folder-categories"),f=this.excludePeerIds.container.querySelector(".folder-categories");(0,w.fc)(u.querySelector(".btn"),(()=>{this.slider.createTab(L).open(this.filter,"included",this)}),{listenerSetter:this.listenerSetter}),(0,w.fc)(f.querySelector(".btn"),(()=>{this.slider.createTab(L).open(this.filter,"excluded",this)}),{listenerSetter:this.listenerSetter}),(0,w.fc)(this.confirmBtn,(()=>{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(u.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?this.managers.filtersStorage.updateDialogFilter(this.filter):this.managers.filtersStorage.createDialogFilter(this.filter),e.then((e=>{this.close()})).catch((e=>{"DIALOG_FILTERS_TOO_MUCH"===e.type?(0,o.Am)("Sorry, you can't create more folders."):console.error("updateDialogFilter error:",e)})).finally((()=>{this.confirmBtn.removeAttribute("disabled")}))):(0,o.Am)("Please choose at least one chat for this folder.")}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(this.nameInputField.input)("input",(()=>{this.filter.title=this.nameInputField.value,this.editCheckForChange()}));const m="edit"===this.type?[this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id,"pinned_peers"),this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id,"include_peers"),this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id,"exclude_peers")]:[];return Promise.all([this.loadAnimationPromise=e.animationData.then((e=>Z(this,void 0,void 0,(function*(){const t=yield e({container:this.stickerContainer,loop:!1,autoplay:!1,width:86,height:86});return this.animation=t,n.Z.waitForFirstFrame(t)})))),...m]).then((()=>{"edit"===this.type?(this.setFilter(this.originalFilter,!0),this.onEditOpen()):(this.setInitFilter(),this.onCreateOpen())}))}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");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=(0,M.Z)(e.title);for(const t in this.flags)this.flags[t].style.display=e.pFlags[t]?"":"none";["includePeerIds","excludePeerIds"].forEach((t=>Z(this,void 0,void 0,(function*(){const i=this[t],n=s.default.createChatList({ignoreClick:!0});let a=e[t];const o=e=>Z(this,void 0,void 0,(function*(){return!!(yield this.managers.appMessagesManager.getDialogOnly(e))||!!e.isUser()&&"user"===(yield this.managers.appUsersManager.getUser(e.toUserId()))._})),r=yield(0,P.Z)(a,(e=>o(e)));a.length=0,a.push(...r),a=a.slice();const d=e=>Z(this,void 0,void 0,(function*(){for(let t=0,i=Math.min(a.length,e);td(20)),{listenerSetter:this.listenerSetter}),l.append((0,p.ag)("FilterShowMoreChats",[a.length])),e.append(l)}d(4)}))))}editCheckForChange(){if("edit"===this.type){const e=!(0,I.Z)(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=(0,f.Z)(e)):(this.filter=e,this.onEditOpen(),this.editCheckForChange())}setInitFilter(e){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")}}},2010:(e,t,i)=>{"use strict";i.d(t,{J:()=>f,Z:()=>m});var s=i(503),n=i(3552),a=i(2621),o=i(6726),r=i(2325),d=i(2738),l=i(3512),c=i(2521),h=i(6082),u=i(5029),p=i(9522);function f(){const e=document.createElement("div"),t=(0,c.Z)(document.createElement("a")),i=(0,r.ag)("Username.Purchase",[t]);return i.classList.add("username-purchase-help"),e.append(i,document.createElement("br"),document.createElement("br")),e.classList.add("hide"),{element:e,setUsername:i=>{i&&(t.href="https://fragment.com/username/"+i),e.classList.toggle("hide",!i)}}}class m extends n._{static getInitArgs(){return{bioMaxLength:l.Z.managers.apiManager.getLimit("bio"),user:l.Z.managers.appUsersManager.getSelf(),userFull:l.Z.managers.appProfileManager.getProfile(l.Z.myId.toUserId())}}init(e){return t=this,i=void 0,c=function*(){this.container.classList.add("edit-profile-container"),this.setTitle("EditAccount.Title");const t=[],[i,n,c]=yield Promise.all([e.bioMaxLength,e.user,e.userFull]);{const e=(0,u.R)(this.scrollable,void 0,"Bio.Description"),n=document.createElement("div");n.classList.add("input-wrapper"),this.firstNameInputField=new s.ZP({label:"EditProfile.FirstNameLabel",name:"first-name",maxLength:70}),this.lastNameInputField=new s.ZP({label:"Login.Register.LastName.Placeholder",name:"last-name",maxLength:64}),this.bioInputField=new s.ZP({label:"EditProfile.BioLabel",name:"bio",maxLength:i}),n.append(this.firstNameInputField.container,this.lastNameInputField.container,this.bioInputField.container);const o=document.createElement("div");o.classList.add("caption"),(0,r.XZ)({element:o,key:"Bio.Description"}),t.push(this.firstNameInputField,this.lastNameInputField,this.bioInputField),this.editPeer=new a.Z({peerId:l.Z.myId,inputFields:t,listenerSetter:this.listenerSetter}),this.content.append(this.editPeer.nextBtn),e.append(this.editPeer.avatarEdit.container,n)}{const e=new u.Z({name:"EditAccount.Username",caption:!0}),i=document.createElement("div");i.classList.add("input-wrapper"),this.usernameInputField=new o.l({label:"EditProfile.Username.Label",name:"username",plainText:!0,listenerSetter:this.listenerSetter,onChange:()=>{this.editPeer.handleChange();const{error:e}=this.usernameInputField,t="USERNAME_PURCHASE_AVAILABLE"===(null==e?void 0:e.type);n(t?this.usernameInputField.value:void 0)},availableText:"EditProfile.Username.Available",takenText:"EditProfile.Username.Taken",invalidText:"EditProfile.Username.Invalid"},this.managers),i.append(this.usernameInputField.container);const s=e.caption,{setUsername:n,element:a}=f();s.append(a,(0,r.ag)("UsernameHelp")),t.push(this.usernameInputField),e.content.append(i),this.scrollable.append(e.container)}{const e=new p.Z({peerId:l.Z.myId,peer:n,listenerSetter:this.listenerSetter,usernameInputField:this.usernameInputField,middleware:this.middlewareHelper.get()});this.scrollable.append(e.container)}(0,d.fc)(this.editPeer.nextBtn,(()=>{this.editPeer.nextBtn.disabled=!0;const e=[],t=this.managers.appProfileManager.updateProfile(this.firstNameInputField.value,this.lastNameInputField.value,this.bioInputField.value);e.push(t.then((()=>{this.close()}),(e=>{console.error("updateProfile error:",e)}))),this.editPeer.uploadAvatar&&e.push(this.editPeer.uploadAvatar().then((e=>this.managers.appProfileManager.uploadProfilePhoto(e)))),this.usernameInputField.isValidToChange()&&e.push(this.managers.appUsersManager.updateUsername(this.usernameInputField.value)),Promise.race(e).finally((()=>{this.editPeer.nextBtn.removeAttribute("disabled")}))}),{listenerSetter:this.listenerSetter}),this.firstNameInputField.setOriginalValue(n.first_name,!0),this.lastNameInputField.setOriginalValue(n.last_name,!0),this.bioInputField.setOriginalValue(c.about,!0),this.usernameInputField.setOriginalValue((0,h.Z)(n),!0),this.editPeer.handleChange()},new((n=void 0)||(n=Promise))((function(e,s){function a(e){try{r(c.next(e))}catch(e){s(e)}}function o(e){try{r(c.throw(e))}catch(e){s(e)}}function r(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(a,o)}r((c=c.apply(t,i||[])).next())}));var t,i,n,c}}},4332:(e,t,i)=>{"use strict";i.d(t,{HQ:()=>d,ZP:()=>h});var s=i(9322),n=i(3552),a=i(4755),o=i(1669),r=i(410);const d="is-right-column-shown";class l extends n.Z{constructor(){super({sidebarEl:document.getElementById("column-right"),canHideFirst:!0,navigationType:"right"}),this.isColumnProportionSet=!1}construct(e){this.managers=e,a.Z.addEventListener("changeScreen",((e,t)=>{t===a._.medium&&e!==a._.mobile&&this.toggleSidebar(!1)})),a.Z.addEventListener("resize",(()=>{this.setColumnProportion()}))}createSharedMediaTab(){const e=this.createTab(o.Z,!1,!0);return e.slider=this,e}replaceSharedMediaTab(e){const t=this.sharedMediaTab;if(t){const i=this.historyTabIds.indexOf(t);this._selectTab.getFrom()===t.container&&this._selectTab.setFrom(null==e?void 0:e.container),e?(-1!==i&&(this.historyTabIds[i]=e),t.container.classList.contains("active")&&e.container.classList.add("active"),t.container.replaceWith(e.container)):(-1!==i&&this.historyTabIds.splice(i,1),t.container.remove())}else this.tabsContainer.prepend(e.container);this.sharedMediaTab=e}onCloseTab(e,t,i){this.historyTabIds.length||this.toggleSidebar(!1,t),super.onCloseTab(e,t,i)}setColumnProportion(){const e=this.sidebarEl.scrollWidth/this.sidebarEl.previousElementSibling.scrollWidth;document.documentElement.style.setProperty("--right-column-proportion",""+e)}toggleSidebar(e,t){const i=document.body.classList.contains(d);let n;if(void 0!==e?e?i||(n=!0):i&&(n=!0):n=!0,!n)return Promise.resolve();i||this.historyTabIds.length||this.sharedMediaTab.open(),this.isColumnProportionSet||(this.setColumnProportion(),this.isColumnProportionSet=!0);const a=s.ZP.selectTab(i?s.oo.CHAT:s.oo.PROFILE,t);return document.body.classList.toggle(d,e),a}}const c=new l;r.GO.appSidebarRight=c;const h=c},4240:(e,t,i)=>{"use strict";i.d(t,{Z:()=>S});var s=i(3552),n=i(503),a=i(2621),o=i(7479),r=i(9807),d=i(4494),l=i(8842),c=i(3512),h=i(8127),u=i(1168),p=i(2325),f=i(2738),m=i(1656),g=i(2946),v=i(8210),b=i(5029),y=i(7362),w=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class S extends s._{init(){return w(this,void 0,void 0,(function*(){const{peerId:e}=this,t=e.toUserId();this.container.classList.add("edit-peer-container","edit-contact-container");const[i,s]=yield Promise.all([this.managers.appUsersManager.isContact(t),this.managers.appPrivacyManager.getPrivacy("inputPrivacyKeyPhoneNumber")]),S=!i;this.setTitle(S?"AddContactTitle":"Edit");{const i=new b.Z({noDelimiter:!0}),s=[],d=document.createElement("div");if(d.classList.add("input-wrapper"),this.nameInputField=new n.ZP({label:"FirstName",name:"contact-name",maxLength:70,required:!0}),this.lastNameInputField=new n.ZP({label:"LastName",name:"contact-lastname",maxLength:70}),t){const e=yield this.managers.appUsersManager.getUser(t);S?(this.nameInputField.setDraftValue(e.first_name),this.lastNameInputField.setDraftValue(e.last_name)):(this.nameInputField.setOriginalValue(e.first_name),this.lastNameInputField.setOriginalValue(e.last_name))}if(d.append(this.nameInputField.container,this.lastNameInputField.container),s.push(this.nameInputField,this.lastNameInputField),this.editPeer=new a.Z({peerId:e,inputFields:s,listenerSetter:this.listenerSetter,doNotEditAvatar:!0}),this.content.append(this.editPeer.nextBtn),e){const s=document.createElement("div");s.classList.add("avatar-edit"),s.append(this.editPeer.avatarElem);const n=new r.Z({text:"Notifications"});n.input.addEventListener("change",(t=>{t.isTrusted&&this.managers.appMessagesManager.togglePeerMute({peerId:e})})),this.listenerSetter.add(c.Z)("notify_settings",(e=>w(this,void 0,void 0,(function*(){if("notifyPeer"!==e.peer._)return;const t=(0,g.Z)(e.peer.peer);if(t==t){const t=!(yield this.managers.appNotificationsManager.isMuted(e.notify_settings));t!==n.checked&&(n.checked=t)}}))));const a=document.createElement("div");a.classList.add("profile-name"),a.append(new l.Z({peerId:e}).element);const h=document.createElement("div");if(h.classList.add("profile-subtitle"),h.append((0,p.ag)("EditContact.OriginalName")),i.content.append(s,a,h,d),S){const s=yield this.managers.appUsersManager.getUser(t),n=new o.ZP({icon:"phone",titleLangKey:s.phone?void 0:"MobileHidden",title:s.phone?(0,v.Z)(s.phone):void 0,subtitleLangKey:s.phone?"Phone":"MobileHiddenExceptionInfo",subtitleLangArgs:s.phone?void 0:[new l.Z({peerId:e}).element]});i.content.append(n.container)}else{const t=new o.ZP({checkboxField:n,withCheckboxSubtitle:!0,listenerSetter:this.listenerSetter}),s=!(yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:e,respectType:!1}));n.checked=s,i.content.append(t.container)}}else i.content.append(d);this.scrollable.append(i.container)}if(S){if(s.some((e=>"privacyValueDisallowAll"===e._))&&!s.some((e=>"privacyValueAllowUsers"===e._&&e.users.includes(t)))){const e=new b.Z({caption:"NewContact.Exception.ShareMyPhoneNumber.Desc",captionArgs:[yield(0,y.Z)({peerId:this.peerId})]}),t=this.sharePhoneCheckboxField=new r.Z({text:"NewContact.Exception.ShareMyPhoneNumber",checked:!0}),i=(0,o.tG)(t);e.content.append(i.container),this.scrollable.append(e.container)}}else{const i=new b.Z,s=(0,d.Z)("btn-primary btn-transparent danger",{icon:"delete",text:"PeerInfo.DeleteContact"});(0,f.fc)(s,(()=>{new h.Z("popup-delete-contact",{peerId:e,titleLangKey:"DeleteContact",descriptionLangKey:"AreYouSureDeleteContact",buttons:(0,u.x)([{langKey:"Delete",callback:()=>{const e=(0,m.Z)([s],!0);this.managers.appUsersManager.deleteContacts([t]).then((()=>{this.close()}),(()=>{e()}))},isDanger:!0}])}).show()}),{listenerSetter:this.listenerSetter}),i.content.append(s),this.scrollable.append(i.container)}(0,f.fc)(this.editPeer.nextBtn,(()=>w(this,void 0,void 0,(function*(){var e;this.editPeer.nextBtn.disabled=!0,this.managers.appUsersManager.addContact(t,this.nameInputField.value,this.lastNameInputField.value,(yield this.managers.appUsersManager.getUser(t)).phone,null===(e=this.sharePhoneCheckboxField)||void 0===e?void 0:e.checked).finally((()=>{this.editPeer.nextBtn.removeAttribute("disabled"),this.close()}))}))),{listenerSetter:this.listenerSetter})}))}}},730:(e,t,i)=>{"use strict";i.d(t,{Z:()=>C});var s=i(2738),n=i(1656),a=i(9405),o=i(8479),r=i(6848),d=i(9322),l=i(1507),c=i(3785),h=i(2230),u=i(9807),p=i(6039),f=i(503),m=i(7479),g=i(5029),v=i(744),b=i(6024),y=i(9345),w=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const S=(0,a.C)(64,64);class C extends b.Z{init(e,t){return w(this,void 0,void 0,(function*(){this.colorIndex=0;const i=!t,a=t===l.Ox;this.container.classList.add("edit-topic-container"),this.setTitle(i?"NewTopic":"ForumTopic.Title.Edit");const r=e.toChatId();t&&(this.topic=this.originalTopic=(0,o.Z)(yield this.managers.dialogsStorage.getForumTopic(e,t)));{const i=new g.Z({name:a?"CreateGeneralTopicTitle":"CreateTopicTitle"}),o=this.iconDiv=document.createElement("div");o.classList.add("edit-topic-icon-container"),!t&&(0,s.fc)(o,(()=>{this.topic.icon_emoji_id||(this.colorIndex=(this.colorIndex+1)%l.OS.length,this.setIcon())}),{listenerSetter:this.listenerSetter}),t&&o.classList.add("disable-hover");const c=document.createElement("div");c.classList.add("input-wrapper");const u=this.nameInputField=new f.ZP({label:"ForumTopic.Name.Placeholder",withLinebreaks:!1,name:"topic-name",maxLength:70,required:!0});this.topic&&u.setOriginalValue(this.topic.title,!0);const p=this.confirmBtn=(0,h.Z)("check btn-confirm blue hide",{noRipple:!0});this.header.append(p),(0,s.fc)(p,(()=>{const i=(0,n.Z)([p],!0);t?this.managers.appChatsManager.editForumTopic({chatId:r,topicId:t,title:u.value,iconEmojiId:this.topic.icon_emoji_id||0}).then((()=>{this.close()})).catch((e=>{console.error("edit topic error",e),i()})):this.managers.appChatsManager.createForumTopic({chatId:r,iconColor:l.OS[this.colorIndex],iconEmojiId:this.topic.icon_emoji_id,title:u.value}).then((t=>{this.close(),d.ZP.setInnerPeer({peerId:e,threadId:t})})).catch((e=>{console.error("create topic error",e),i()}))}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(u.input)("input",(()=>{var e;this.validate(),this.setIcon(null===(e=this.topic)||void 0===e?void 0:e.icon_emoji_id)})),c.append(u.container),i.content.append(o,c),this.scrollable.append(i.container)}const c=[];if(a){const e=new g.Z({caption:"EditTopicHideInfo"}),i=new u.Z({checked:!this.topic.pFlags.hidden,text:"EditTopicHide"});this.listenerSetter.add(i.input)("change",(()=>{const e=this.managers.appChatsManager.editForumTopic({chatId:r,topicId:t,hidden:!i.checked});s.disableWithPromise(e)}));const s=new m.ZP({checkboxField:i});e.content.append(s.container),this.scrollable.append(e.container)}else{const e=new g.Z({});e.container.classList.add("edit-topic-emoticons-container");const t=new p.ZP({managers:this.managers,isStandalone:!0,noRegularEmoji:!0,stickerSetId:"inputStickerSetEmojiDefaultTopicIcons",onClick:e=>{t.setActive(e.docId?e:{emoji:void 0,docId:void 0}),this.setIcon(e.docId)}});t.getContainerSize=()=>({width:v.ZP.rect.width,height:400}),this.middlewareHelper.onDestroy((()=>{t.destroy()})),t.container.classList.remove("tabs-tab"),this.emojiElement=document.createElement("span"),this.emojiElement.classList.add("super-emoji-topic-icon");const i=t.init().then((()=>w(this,void 0,void 0,(function*(){var e;const i=t.getCustomCategory(),s=null===(e=this.topic)||void 0===e?void 0:e.icon_emoji_id;t.addEmojiToCategory({category:i,element:this.emojiElement,batch:!1,prepend:!0,active:!s}),s&&t.setActive({docId:s,emoji:""})}))));c.push(i),e.content.replaceWith(t.container),this.scrollable.append(e.container)}return Promise.all(c).then((()=>this.s()))}))}validate(){let e=this.nameInputField.isValidToChange();!e&&this.originalTopic&&(e=this.topic.icon_emoji_id!==this.originalTopic.icon_emoji_id),this.confirmBtn.classList.toggle("hide",!e)}s(){var e,t;return(null===(e=this.topic)||void 0===e?void 0:e.icon_color)&&(this.colorIndex=l.OS.indexOf(this.topic.icon_color)),this.setIcon(null===(t=this.topic)||void 0===t?void 0:t.icon_emoji_id,void 0,!0)}setIcon(e,t=this.iconDiv,i){var s;return w(this,void 0,void 0,(function*(){const n=this.nameInputField.value,a=t===this.iconDiv;if(a){const t={id:null===(s=this.topic)||void 0===s?void 0:s.id,icon_color:l.OS[this.colorIndex],title:(0,c.Z)(n,!0).text||"A",icon_emoji_id:e},a=this.topic;if(this.topic=t,!i&&a&&a.icon_color===t.icon_color&&a.title===t.title||this.setIcon(void 0,this.emojiElement),(0,r.Z)(a,t)&&!i)return;this.validate()}const o=yield(0,y.e)({topic:a?this.topic:Object.assign(Object.assign({},this.topic),{icon_emoji_id:void 0}),customEmojiSize:S,middleware:this.middlewareHelper.get()}),d=document.createElement("div");d.classList.add("edit-topic-icon"),d.append(o);const h=t.lastElementChild;t.append(d);const u=(e,t)=>{const i=e.animate([{opacity:"0",transform:"scale(0.8)"},{opacity:"1",transform:"scale(1)"}],{duration:200,iterations:1,easing:"ease-in-out",fill:"forwards",direction:t?"normal":"reverse"});return new Promise((e=>{i.addEventListener("finish",(()=>{e()}),{once:!0})}))};h&&u(h,!1).then((()=>h.remove())),u(d,!0)}))}}},1669:(e,t,i)=>{"use strict";i.d(t,{Z:()=>de});var s=i(3512),n=i(6360),a=i(3552),o=i(426),r=i(503),d=i(2621),l=i(7479),c=i(4494),h=i(2166),u=i(144),p=i(279),f=i(1218),m=i(2796),g=i(6726),v=i(6024),b=i(2325),y=i(8127),w=i(8119),S=i(2738),C=i(1656),L=i(9807),E=i(5029),I=i(9522),M=i(6082),P=i(5102),Z=i(2010),T=i(5592),k=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class x extends v.h{init(){return k(this,void 0,void 0,(function*(){this.container.classList.add("edit-peer-container","group-type-container");const e=yield this.managers.appChatsManager.isBroadcast(this.chatId);this.setTitle(e?"ChannelType":"GroupType");const t=new E.Z({name:e?"ChannelType":"GroupType"}),i=(0,u.a)(),n=new l.ZP({radioField:new f.Z({langKey:e?"ChannelPrivate":"MegaPrivate",name:i,value:"private"}),subtitleLangKey:e?"ChannelPrivateInfo":"MegaPrivateInfo"}),a=new l.ZP({radioField:new f.Z({langKey:e?"ChannelPublic":"MegaPublic",name:i,value:"public"}),subtitleLangKey:e?"ChannelPublicInfo":"MegaPublicInfo"}),o=(0,l.De)([n,a],(e=>{const t=[[v.container],[H]];"public"===e&&t.reverse(),t[0].forEach((e=>e.classList.remove("hide"))),t[1].forEach((e=>e.classList.add("hide"))),R()}));let r=yield this.managers.appChatsManager.getChat(this.chatId);const d={basic:[]};this.listenerSetter.add(s.Z)("chat_update",(e=>k(this,void 0,void 0,(function*(){this.chatId===e&&(r=yield this.managers.appChatsManager.getChat(this.chatId),d.basic.forEach((e=>e())))})))),t.content.append(o);const v=new E.Z({}),x=new l.ZP({title:this.chatFull.exported_invite.link,subtitleLangKey:e?"ChannelPrivateLinkHelp":"MegaPrivateLinkHelp",clickable:()=>{(0,h.T)(this.chatFull.exported_invite.link),(0,m.Am)(b.ZP.format("LinkCopied",!0))},listenerSetter:this.listenerSetter}),A=(0,c.Z)("btn-primary btn-transparent danger",{icon:"delete",text:"RevokeLink"});(0,S.fc)(A,(()=>{new y.Z("revoke-link",{buttons:[{langKey:"RevokeButton",callback:()=>{const e=(0,C.Z)([A],!0);this.managers.appProfileManager.getChatInviteLink(this.chatId,!0).then((t=>{e(),x.title.innerHTML=t}))}}],titleLangKey:"RevokeLink",descriptionLangKey:"RevokeAlert"}).show()}),{listenerSetter:this.listenerSetter}),v.content.append(x.container,A);const _=new E.Z({caption:!0,noDelimiter:!0}),F=document.createElement("div");F.classList.add("input-wrapper");const D="t.me/",R=()=>{const e=n.radioField.checked&&z!==D||B.isValidToChange()&&B.input.classList.contains("valid");j.classList.toggle("is-visible",e);const{error:t}=B,i="USERNAME_PURCHASE_AVAILABLE"===(null==t?void 0:t.type);N(i?B.getValue():void 0)},B=new g.l({label:"SetUrlPlaceholder",name:"group-public-link",plainText:!0,listenerSetter:this.listenerSetter,availableText:"Link.Available",invalidText:"Link.Invalid",takenText:"Link.Taken",onChange:R,peerId:this.chatId.toPeerId(!0),head:D},this.managers),{setUsername:N,element:O}=(0,Z.J)();_.caption.append(O,(0,b.ag)(e?"Channel.UsernameAboutChannel":"Channel.UsernameAboutGroup"));const U=new I.Z({peerId:this.chatId.toPeerId(!0),peer:r,listenerSetter:this.listenerSetter,usernameInputField:B,middleware:this.middlewareHelper.get()}),H=document.createElement("div");H.append(_.container,U.container);const z=D+((0,M.Z)(r)||"");F.append(B.container),_.content.append(F);const j=(0,w.Z)({icon:"check",className:"is-visible"});this.content.append(j),(0,S.fc)(j,(()=>k(this,void 0,void 0,(function*(){const t=a.radioField.checked?B.getValue():"";if(!t){const t=yield this.managers.appChatsManager.getChat(this.chatId),i=(0,M.Z)(t);i&&(yield(0,T.Z)({descriptionLangKey:e?"ChannelVisibility.Confirm.MakePrivate.Channel":"ChannelVisibility.Confirm.MakePrivate.Group",descriptionLangArgs:[i],button:{langKey:"OK"}}))}(0,p.p)(j),this.managers.appChatsManager.migrateChat(this.chatId).then((e=>t?this.managers.appChatsManager.updateUsername(e,t):this.managers.appChatsManager.makeChannelPrivate(e))).then((()=>{this.close()}))}))),{listenerSetter:this.listenerSetter}),(z!==D||(0,P.Z)(r).length?a:n).radioField.checked=!0,B.setOriginalValue(z,!0),this.scrollable.append(t.container,v.container,H);{const t=new E.Z({name:"SavingContentTitle",caption:e?"RestrictSavingContentInfoChannel":"RestrictSavingContentInfoGroup"}),i=new L.Z({text:"RestrictSavingContent",withRipple:!0});this.listenerSetter.add(i.input)("change",(()=>{const e=i.toggleDisability(!0);this.managers.appChatsManager.toggleNoForwards(this.chatId,i.checked).then((()=>{e()}))}));const s=()=>{i.setValueSilently(!!r.pFlags.noforwards)};((e,t="basic")=>{d[t].push(e)})(s),s(),t.content.append(i.label),this.scrollable.append(t.container)}}))}}var A=i(4668),_=i(5565),F=i(8936),D=i(4277),R=i(8479),B=i(7120),N=i(2946),O=i(2995),U=i(6848),H=i(3061);class z extends v.h{init(){return e=this,t=void 0,s=function*(){let e;this.container.classList.add("edit-peer-container","user-permissions-container"),this.setTitle("UserRestrictions");{const t=new E.Z({name:"UserRestrictionsCanDo"}),i=document.createElement("div");i.classList.add("chatlist-container"),t.content.insertBefore(i,t.title);const s=D.default.createChatList({new:!0});i.append(s);const{dom:n}=D.default.addDialogNew({peerId:this.userId.toPeerId(!1),container:s,rippleEnabled:!0,avatarSize:"abitbigger"});n.lastMessageSpan.append((0,H.Z)(yield this.managers.appUsersManager.getUser(this.userId)));const a=new G({chatId:this.chatId,listenerSetter:this.listenerSetter,appendTo:t.content,participant:"channelParticipantBanned"===this.participant._?this.participant:void 0},this.managers);e=()=>{const e=a.takeOut();"channelParticipantBanned"===this.participant._&&(0,U.Z)(this.participant.banned_rights.pFlags,e.pFlags)||this.managers.appChatsManager.editBanned(this.chatId,this.participant,e)},this.eventListener.addEventListener("destroy",e,{once:!0}),this.scrollable.append(t.container)}{const t=new E.Z({});if("channelParticipantBanned"===this.participant._){const i=(0,c.Z)("btn-primary btn-transparent danger",{icon:"delete",text:"GroupPermission.Delete"});(0,S.fc)(i,(()=>{const t=(0,C.Z)([i],!0);this.managers.appChatsManager.clearChannelParticipantBannedRights(this.chatId,this.participant).then((()=>{this.eventListener.removeEventListener("destroy",e),this.close()}),(()=>{t()}))}),{listenerSetter:this.listenerSetter}),t.content.append(i)}const i=(0,c.Z)("btn-primary btn-transparent danger",{icon:"deleteuser",text:"UserRestrictionsBlock"});(0,S.fc)(i,(()=>{(0,C.Z)([i],!0),this.managers.appChatsManager.kickFromChannel(this.chatId,this.participant).then((()=>{this.eventListener.removeEventListener("destroy",e),this.close()}))}),{listenerSetter:this.listenerSetter}),t.content.append(i),this.scrollable.append(t.container)}},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var j=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class G{constructor(e,t){this.options=e,this.managers=t,this.construct()}construct(){return j(this,void 0,void 0,(function*(){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 e=this.options,t=yield this.managers.appChatsManager.getChat(e.chatId),i=t.default_banned_rights,s=e.participant?function(e,t){if(e.default_banned_rights){t=(0,R.Z)(t);const i=e.default_banned_rights.pFlags;for(const e in i)t.pFlags[e]=i[e]}return t}(t,e.participant.banned_rights):i,n=e.participant?"UserRestrictionsDisabled":"EditCantEditPermissionsPublic";for(const a of this.v){const o=a.flags[0],r=(0,l.tG)(a.checkboxField=new L.Z({text:a.text,checked:(0,B.Z)(t,o,s),restriction:!0,listenerSetter:e.listenerSetter}));(e.participant&&i.pFlags[o]||(0,P.Z)(t)[0]&&(a.flags.includes("pin_messages")||a.flags.includes("change_info")))&&(a.checkboxField.input.disabled=!0,(0,S.fc)(a.checkboxField.label,(e=>{(0,m.Am)(b.ZP.format(n,!0))}),{listenerSetter:e.listenerSetter})),this.toggleWith[o]&&e.listenerSetter.add(a.checkboxField.input)("change",(()=>{a.checkboxField.checked||this.v.filter((e=>this.toggleWith[o].includes(e.flags[0]))).forEach((e=>{e.checkboxField.checked=!1}))})),e.appendTo.append(r.container)}}))}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 V extends v.h{init(){return j(this,void 0,void 0,(function*(){let e;this.container.classList.add("edit-peer-container","group-permissions-container"),this.setTitle("ChannelPermissions");{const t=new E.Z({name:"ChannelPermissionsHeader"});e=new G({chatId:this.chatId,listenerSetter:this.listenerSetter,appendTo:t.content},this.managers),this.eventListener.addEventListener("destroy",(()=>{this.managers.appChatsManager.editChatDefaultBannedRights(this.chatId,e.takeOut())}),{once:!0}),this.scrollable.append(t.container)}{const t=new E.Z({name:"PrivacyExceptions"}),i=new l.ZP({titleLangKey:"ChannelAddException",subtitleLangKey:"Loading",icon:"adduser",clickable:()=>{new O.Z({peerTypes:["channelParticipants"],onSelect:e=>{setTimeout((()=>{n(e)}),0)},placeholder:"ExceptionModal.Search.Placeholder",peerId:-this.chatId})},listenerSetter:this.listenerSetter}),n=e=>j(this,void 0,void 0,(function*(){let t;try{t=yield this.managers.appProfileManager.getChannelParticipant(this.chatId,e)}catch(e){return void(0,m.Am)("User is no longer participant")}const i=this.slider.createTab(z);i.participant=t,i.chatId=this.chatId,i.userId=e,i.open()}));t.content.append(i.container);const a=t.generateContentElement();a.classList.add("chatlist-container");const o=D.default.createChatList({new:!0});a.append(o),(0,S.fc)(o,(e=>{const t=(0,A.Z)(e.target,D.DIALOG_LIST_ELEMENT_TAG);if(!t)return;const i=t.dataset.peerId.toPeerId();n(i)}),{listenerSetter:this.listenerSetter});const r=(t,i)=>j(this,void 0,void 0,(function*(){const s=i.banned_rights,n=(yield this.managers.appChatsManager.getChat(this.chatId)).default_banned_rights,a=[];e.v.forEach((e=>{const t=e.flags[0];s.pFlags[t]&&!n.pFlags[t]&&a.push(e.exceptionText)}));const o=t.lastMessageSpan;a.length&&o.replaceChildren(...(0,b.v_)(a.map((e=>(0,b.ag)(e))),!1)),o.classList.toggle("hide",!a.length)})),d=(e,t)=>{const{dom:i}=D.default.addDialogNew({peerId:(0,N.Z)(e.peer),container:o,rippleEnabled:!0,avatarSize:"abitbigger",append:t});r(i,e)},c=()=>{(0,_.Z)(i.subtitle,(0,b.ag)(u?"Permissions.ExceptionsCount":"Permissions.NoExceptions",[u]))};let h,u=0;const p=()=>(h=new F.Z({scrollable:this.scrollable,getPromise:()=>this.managers.appProfileManager.getChannelParticipants(this.chatId,{_:"channelParticipantsBanned",q:""},50,o.childElementCount).then((e=>{for(const t of e.participants)d(t,!0);return u=e.count,c(),e.participants.length<50||e.count===o.childElementCount}))}),h.load());this.scrollable.append(t.container),(yield this.managers.appChatsManager.isChannel(this.chatId))?yield p():(c(),this.listenerSetter.add(s.Z)("dialog_migrate",(({migrateFrom:e,migrateTo:t})=>{this.chatId===e&&(this.chatId=t,p())})))}}))}onOpenAfterTimeout(){this.scrollable.onScroll()}}var K=i(6194),W=i(5701),$=i(62),q=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Q extends v.h{init(){var e;return q(this,void 0,void 0,(function*(){this.setTitle("Reactions");const t=yield this.managers.appReactionsManager.getActiveAvailableReactions(),i=yield this.managers.appProfileManager.getChatFull(this.chatId),s=yield this.managers.appChatsManager.isBroadcast(this.chatId);let n=null!==(e=i.available_reactions)&&void 0!==e?e:{_:"chatReactionsNone"},a=n,o=new Set("chatReactionsSome"===n._?n.reactions.map((e=>e.emoticon)):[]);const r=e=>e.map((e=>({_:"reactionEmoji",emoticon:e}))),d=()=>s?"EnableReactionsChannelInfo":"chatReactionsAll"===a._?"EnableAllReactionsInfo":"chatReactionsNone"===a._?"DisableReactionsInfo":"EnableSomeReactionsInfo",c=new E.Z({name:s?void 0:"AvailableReactions",caption:d()}),h=new E.Z({name:"OnlyAllowThisReactions"}),u=()=>{var e;const t=null!==(e=a.reactions)&&void 0!==e?e:[];o=new Set(t.map((({emoticon:e})=>e))),f.forEach(((e,t)=>{e.setValueSilently(o.has(t))}))};let p;if(s){p=new L.Z({toggle:!0,checked:"chatReactionsSome"===n._});const e=new l.ZP({checkboxField:p,titleLangKey:"EnableReactions",listenerSetter:this.listenerSetter});c.content.append(e.container),this.listenerSetter.add(p.input)("change",(()=>{let e=!0;p.checked?m.every((e=>!e.checked))?a={_:"chatReactionsSome",reactions:r(t.map((({reaction:e})=>e)))}:"chatReactionsSome"!==a._?a={_:"chatReactionsSome",reactions:r(Array.from(o))}:e=!1:a={_:"chatReactionsNone"},e&&(u(),v())}))}else{const e=[["chatReactionsAll","AllReactions"],["chatReactionsSome","SomeReactions"],["chatReactionsNone","NoReactions"]],t=()=>{h.container.classList.toggle("hide","chatReactionsSome"!==a._)};let i=n._;const s=(0,l.ZC)(e.map((([e,t])=>({langPackKey:t,value:e,checked:n._===e}))),(e=>{i=e,a="chatReactionsAll"===i?{_:i,pFlags:{allow_custom:!0}}:"chatReactionsNone"===i?{_:i}:{_:i,reactions:r(["๐Ÿ‘","๐Ÿ‘Ž"])},(0,_.Z)(c.caption,(0,b.ag)(d())),u(),v(),t()}));c.content.append(s),t()}const f=new Map,m=t.map((e=>{const t=e.reaction,i=new L.Z({toggle:!0,checked:o.has(t)});f.set(t,i),this.listenerSetter.add(i.input)("change",(()=>{i.checked?(o.add(t),p&&!p.checked&&(p.checked=!0)):(o.delete(t),(null==p?void 0:p.checked)&&!o.size&&(p.checked=!1)),v()}));const s=new l.ZP({checkboxField:i,title:e.title,havePadding:!0,listenerSetter:this.listenerSetter});return(0,$.Z)({row:s,doc:e.static_icon,size:"small"}),h.content.append(s.container),i})),g=()=>q(this,void 0,void 0,(function*(){v.clearTimeout(),"chatReactionsSome"===a._&&(a.reactions=r(Array.from(o))),this.managers.appChatsManager.setChatAvailableReactions(this.chatId,a),n=a})),v=(0,W.Z)(g,3e3,!1,!0);this.eventListener.addEventListener("destroy",(()=>{v.isDebounced()&&g()}),{once:!0}),this.scrollable.append(c.container,h.container)}))}}var Y=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class X extends a._{_init(){return Y(this,void 0,void 0,(function*(){this.listenerSetter.removeAll(),this.scrollable.container.replaceChildren(),this.container.classList.add("edit-peer-container","edit-group-container"),this.setTitle("Edit");let[e,t,i,n,a,o,h,u]=yield Promise.all([this.managers.appProfileManager.getChatFull(this.chatId,!0),this.managers.appChatsManager.getChat(this.chatId),this.managers.appChatsManager.isBroadcast(this.chatId),this.managers.appChatsManager.isChannel(this.chatId),this.managers.appChatsManager.hasRights(this.chatId,"change_type"),this.managers.appChatsManager.hasRights(this.chatId,"change_permissions"),this.managers.appChatsManager.hasRights(this.chatId,"manage_topics"),this.managers.apiManager.getAppConfig()]);const p={full:[],basic:[]},f=(e,t="basic")=>{p[t].push(e)};this.listenerSetter.add(s.Z)("chat_update",(e=>Y(this,void 0,void 0,(function*(){this.chatId===e&&(t=yield this.managers.appChatsManager.getChat(this.chatId),p.basic.forEach((e=>e())))})))),this.listenerSetter.add(s.Z)("chat_full_update",(t=>Y(this,void 0,void 0,(function*(){this.chatId===t&&(e=(yield this.managers.appProfileManager.getCachedFullChat(t))||e,p.full.forEach((e=>e())))}))));const m=this.chatId.toPeerId(!0);{const s=new E.Z({noDelimiter:!0,caption:!0}),n=[],c=document.createElement("div");if(c.classList.add("input-wrapper"),this.chatNameInputField=new r.ZP({label:i?"EnterChannelName":"CreateGroup.NameHolder",name:"chat-name",maxLength:255,required:!0}),this.descriptionInputField=new r.ZP({label:"DescriptionPlaceholder",name:"chat-description",maxLength:255}),this.chatNameInputField.setOriginalValue(t.title),this.descriptionInputField.setOriginalValue(e.about),c.append(this.chatNameInputField.container,this.descriptionInputField.container),n.push(this.chatNameInputField,this.descriptionInputField),this.editPeer=new d.Z({peerId:m,inputFields:n,listenerSetter:this.listenerSetter,popupOptions:{isForum:t.pFlags.forum}}),this.content.append(this.editPeer.nextBtn),s.content.append(this.editPeer.avatarEdit.container,c),a){const n=new l.ZP({titleLangKey:i?"ChannelType":"GroupType",clickable:()=>{const t=this.slider.createTab(x);t.chatId=this.chatId,t.chatFull=e,t.open()},icon:"lock",listenerSetter:this.listenerSetter}),a=()=>{let e;const s=(0,P.Z)(t)[0];e=i?s?"TypePublic":"TypePrivate":s?"TypePublicGroup":"TypePrivateGroup",n.subtitle.replaceChildren((0,b.ag)(e))};a(),f(a),s.content.append(n.container)}if(a||o){const t=new l.ZP({titleLangKey:"Reactions",icon:"reactions",clickable:()=>{const e=this.slider.createTab(Q);e.chatId=this.chatId,e.open()},listenerSetter:this.listenerSetter}),i=(yield this.managers.appReactionsManager.getAvailableReactions()).filter((e=>!e.pFlags.inactive)).length,n=()=>{var s;const n=null!==(s=e.available_reactions)&&void 0!==s?s:{_:"chatReactionsNone"};if("chatReactionsSome"===n._){const e=n.reactions.length;e===i?(0,_.Z)(t.subtitle,(0,b.ag)("ReactionsAll")):t.subtitle.textContent=e+"/"+i}else(0,_.Z)(t.subtitle,(0,b.ag)("chatReactionsAll"===n._?"ReactionsAll":"Checkbox.Disabled"))};n(),f(n,"full"),s.content.append(t.container)}if(o&&!i){const e=["send_messages","send_media","send_stickers","send_polls","embed_links","invite_users","pin_messages","change_info"],i=new l.ZP({titleLangKey:"ChannelPermissions",clickable:()=>{const e=this.slider.createTab(V);e.chatId=this.chatId,e.open()},icon:"permissions",listenerSetter:this.listenerSetter}),n=()=>{i.subtitle.textContent=e.reduce(((e,i)=>e+ +(0,B.Z)(t,i,t.default_banned_rights)),0)+"/"+e.length};n(),f(n),s.content.append(i.container)}if(h&&(t.participants_count>=u.forum_upgrade_participants_min||t.pFlags.forum)&&!i){const e=new l.ZP({checkboxField:new L.Z({toggle:!0}),titleLangKey:"Topics",clickable:()=>{},icon:"topics",listenerSetter:this.listenerSetter}),i=()=>{const i=!!t.pFlags.forum;this.editPeer.avatarElem.parentElement.classList.toggle("is-forum",i),e.checkboxField.setValueSilently(i)};this.listenerSetter.add(e.checkboxField.input)("change",(t=>{if(!t.isTrusted)return;const i=this.managers.appChatsManager.toggleForum(this.chatId,e.checkboxField.checked);e.disableWithPromise(i)})),i(),f(i),s.caption.replaceChildren((0,b.ag)("ForumToggleDescription")),s.content.append(e.container)}if(s.caption.classList.toggle("hide",!s.caption.childElementCount),this.scrollable.append(s.container),(0,S.fc)(this.editPeer.nextBtn,(()=>{this.editPeer.nextBtn.disabled=!0;const e=[],t=this.chatId;this.chatNameInputField.isValidToChange()&&e.push(this.managers.appChatsManager.editTitle(t,this.chatNameInputField.value)),this.descriptionInputField.isValidToChange()&&e.push(this.managers.appChatsManager.editAbout(t,this.descriptionInputField.value)),this.editPeer.uploadAvatar&&e.push(this.editPeer.uploadAvatar().then((e=>this.managers.appChatsManager.editPhoto(t,e)))),Promise.race(e).finally((()=>{this.editPeer.nextBtn.removeAttribute("disabled"),this.close()}))}),{listenerSetter:this.listenerSetter}),i&&(yield this.managers.appChatsManager.hasRights(this.chatId,"change_info"))){const e=new L.Z({text:"ChannelSignMessages",checked:!!t.pFlags.signatures});this.listenerSetter.add(e.input)("change",(()=>{const t=e.toggleDisability(!0);this.managers.appChatsManager.toggleSignatures(this.chatId,e.checked).then((()=>{t()}))})),f((()=>{e.setValueSilently(!!t.pFlags.signatures)})),s.content.append((0,l.tG)(e).container)}}if(!i){const t=new E.Z({});if(!i&&a){const i=new L.Z({text:"ChatHistory"});this.listenerSetter.add(i.input)("change",(()=>{const e=i.toggleDisability(!0);this.managers.appChatsManager.togglePreHistoryHidden(this.chatId,!i.checked).then((()=>{e()}))}));const s=()=>{i.setValueSilently(n&&!e.pFlags.hidden_prehistory)};s(),f(s),t.content.append((0,l.tG)(i).container)}t.content.childElementCount&&this.scrollable.append(t.container)}if(yield this.managers.appChatsManager.hasRights(this.chatId,"delete_chat")){const e=new E.Z({}),t=(0,c.Z)("btn-primary btn-transparent danger",{icon:"delete",text:i?"PeerInfo.DeleteChannel":"DeleteAndExitButton"});(0,S.fc)(t,(()=>{new K.Z(m,void 0,(e=>{const i=(0,C.Z)([t],!0);e.then((()=>{this.close()}),(()=>{i()}))}))}),{listenerSetter:this.listenerSetter}),e.content.append(t),this.scrollable.append(e.container)}n||this.listenerSetter.add(s.Z)("dialog_migrate",(({migrateFrom:e,migrateTo:t})=>{m===e&&(this.chatId=t.toChatId(),this._init())}))}))}init(){return this._init()}}var J=i(8842),ee=i(4240),te=i(2230),ie=i(5670),se=i(8261),ne=i(4993),ae=i(730),oe=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const re={};class de extends a._{init(){this.container.classList.add("shared-media-container","profile-container");const e=(0,c.Z)("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),this.isFirst&&t.classList.add("state-back");const i=document.createElement("div");i.className="transition slide-fade";const a=document.createElement("div");a.classList.add("transition-item"),this.titleI18n=new b.ZP.IntlElement,this.title.append(this.titleI18n.element),this.editBtn=(0,te.Z)("edit"),a.append(this.title,this.editBtn);const r=document.createElement("div");r.classList.add("transition-item");const d=this.title.cloneNode();d.append((0,b.ag)("PeerInfo.SharedMedia")),r.append(d),i.append(a,r),this.header.append(i),this.profile=new se.Z(this.managers,this.scrollable,this.listenerSetter),this.profile.init(),this.scrollable.append(this.profile.element),this.scrollable.onAdditionalScroll=()=>{const e=this.searchSuper.nav.getBoundingClientRect();if(!e.width)return;const t=e.top-1;l(t<=56)};const l=e=>{t.classList.toggle("state-back",this.isFirst||e),this.searchSuper.container.classList.toggle("is-full-viewport",e),h(+e),e||this.searchSuper.cleanScrollPositions()},h=(0,o.Z)({content:i,type:"slide-fade",transitionTime:400,isHeavy:!1});h(0),(0,S.fc)(this.closeBtn,(e=>{h.prevId()?(this.scrollable.scrollIntoViewNew({element:this.scrollable.container.firstElementChild,position:"start"}),h(0),this.isFirst||t.classList.remove("state-back")):this.scrollable.isHeavyAnimationInProgress||this.slider.onCloseBtnClick()}),{listenerSetter:this.listenerSetter}),(0,S.fc)(this.editBtn,(()=>oe(this,void 0,void 0,(function*(){let e;const{peerId:t,threadId:i}=this;e=i&&(yield this.managers.appPeersManager.isForum(t))?this.slider.createTab(ae.Z):t.isAnyChat()?this.slider.createTab(X):this.slider.createTab(ee.Z),e&&(e instanceof ae.Z?e.open(t,this.threadId):(e instanceof X?e.chatId=t.toChatId():e.peerId=t,e.open()))}))),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(s.Z)("contacts_update",(e=>{this.peerId===e&&this.toggleEditBtn()})),this.listenerSetter.add(s.Z)("chat_update",(e=>{this.peerId===e.toPeerId(!0)&&this.toggleEditBtn()})),this.listenerSetter.add(s.Z)("history_multiappend",(e=>{this.renderNewMessage(e)})),this.listenerSetter.add(s.Z)("history_delete",(({peerId:e,msgs:t})=>{this.deleteDeletedMessages(e,Array.from(t))})),this.listenerSetter.add(s.Z)("message_sent",(({message:e})=>{this.renderNewMessage(e)})),this.searchSuper=new n.Z({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=>{const t="members"===e.type&&s.Z.settings.animationsEnabled?250:0;setTimeout((()=>{u.classList.toggle("is-hidden","members"!==e.type)}),t)},managers:this.managers}),this.searchSuper.scrollStartCallback=()=>{l(!0)},this.profile.element.append(this.searchSuper.container);const u=(0,w.Z)({icon:"addmember_filled"});this.content.append(u),(0,S.fc)(u,(()=>oe(this,void 0,void 0,(function*(){const e=this.peerId,t=this.peerId.toChatId(),i=yield this.managers.appChatsManager.isChannel(t),s=(t,s)=>{let n,a,o,r,d;if(t.length>1)n="AddMembersAlertTitle",a=[(0,b.ag)("Members",[t.length])],o="AddMembersAlertCountText",r=t.map((e=>{const t=document.createElement("b");return t.append(new J.Z({peerId:e}).element),t})),i||(d=[{text:"AddMembersForwardMessages",checked:!0}]);else{n="AddOneMemberAlertTitle",o="AddMembersAlertNamesText";const e=document.createElement("b");e.append(new J.Z({peerId:t[0]}).element),r=[e],i||(d=[{text:"AddOneMemberForwardMessages",textArgs:[new J.Z({peerId:t[0]}).element],checked:!0}])}r.push(new J.Z({peerId:e}).element),new y.Z("popup-add-members",{peerId:e,titleLangKey:n,descriptionLangKey:o,descriptionLangArgs:r,buttons:[{langKey:"Add",callback:s}],checkboxes:d}).show()},n=e=>{"USER_PRIVACY_RESTRICTED"===e.type&&(0,m.bC)({langPackKey:"InviteToGroupError"})};if(i){const e=this.slider.createTab(ie.Z);e.open({type:"channel",skippable:!1,takeOut:i=>(s(i,(()=>{const s=this.managers.appChatsManager.inviteToChannel(t,i);s.catch(n),e.attachToPromise(s)})),!1),title:"GroupAddMembers",placeholder:"SendMessageTo"})}else new O.Z({peerTypes:["contacts"],placeholder:"Search",onSelect:e=>{setTimeout((()=>{s([e],(i=>{this.managers.appChatsManager.addChatUser(t,e,i.size?void 0:0).catch(n)}))}),0)}})}))),{listenerSetter:this.listenerSetter})}_renderNewMessage(e,t){var i;const s=null===(i=re[e.peerId])||void 0===i?void 0:i[t];if(s)for(const t of this.searchSuper.mediaTabs){const i=t.inputFilter,n=s[i];if(!n)continue;const a=this.searchSuper.filterMessagesByType([e],i).filter((e=>!n.find((t=>t.mid===e.mid&&t.peerId===e.peerId))));a.length&&(n.unshift(...a.map((e=>({mid:e.mid,peerId:e.peerId})))),this.peerId===e.peerId&&-1!==this.searchSuper.usedFromHistory[i]&&(this.searchSuper.usedFromHistory[i]+=a.length,this.searchSuper.performSearchResult(a,t,!1)))}}renderNewMessage(e){return oe(this,void 0,void 0,(function*(){if(this.init)return;const{peerId:t}=e,i=yield this.managers.appPeersManager.isForum(t),s=(0,ne.Z)(e,i);this._renderNewMessage(e),s&&this._renderNewMessage(e,s)}))}_deleteDeletedMessages(e,t,i){for(const s of i)for(const i of this.searchSuper.mediaTabs){const n=i.inputFilter,a=e[n];if(!a)continue;const o=a.findIndex((e=>e.mid===s));if(-1!==o&&(a.splice(o,1),this.peerId===t)){const e=this.searchSuper.tabs[n].querySelector(`[data-mid="${s}"][data-peer-id="${t}"]`);e&&(this.searchSuper.selection.isSelecting&&this.searchSuper.selection.toggleByElement(e),e.remove()),this.searchSuper.usedFromHistory[n]>=o+1&&--this.searchSuper.usedFromHistory[n]}}}deleteDeletedMessages(e,t){if(this.init)return;const i=re[e];if(i){for(const s in i)this._deleteDeletedMessages(i[s],e,t);this.scrollable.onScroll()}}cleanupHTML(){return oe(this,void 0,void 0,(function*(){const e=this.peerId.isAnyChat(),[t,i]=yield Promise.all([!!e&&this.searchSuper.canViewMembers(),!!e&&this.managers.appChatsManager.hasRights(this.peerId.toChatId(),"invite_users")]);return()=>{this.profile.cleanupHTML(),this.editBtn.classList.add("hide"),this.searchSuper.cleanupHTML(!0),this.container.classList.toggle("can-add-members",t&&i)}}))}setLoadMutex(e){this.searchSuper.loadMutex=e}setPeer(e,t){var i,s,n;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,threadId:t,historyStorage:null!==(s=(n=null!==(i=re[e])&&void 0!==i?i:re[e]={})[t])&&void 0!==s?s:n[t]={}}),this.profile.setPeer(e,t),!0)}changeTitleKey(){return oe(this,void 0,void 0,(function*(){const e=this.managers.appPeersManager.isForum(this.peerId);return()=>{this.titleI18n.compareAndUpdate({key:this.threadId&&e?"AccDescrTopic":"Profile"})}}))}fillProfileElements(){return oe(this,void 0,void 0,(function*(){if(!this.peerChanged)return;this.peerChanged=!1;const e=yield Promise.all([this.cleanupHTML(),this.toggleEditBtn(!0),this.profile.fillProfileElements(),this.changeTitleKey()]);return()=>{e.forEach((e=>{null==e||e()}))}}))}toggleEditBtn(e){return oe(this,void 0,void 0,(function*(){let t;if(this.peerId.isUser())t=this.peerId!==s.Z.myId&&(yield this.managers.appUsersManager.isContact(this.peerId.toUserId()));else{const e=this.peerId.toChatId(),i=this.threadId&&(yield this.managers.appChatsManager.isForum(e));t=yield this.managers.appChatsManager.hasRights(e,i?"manage_topics":"change_info")}const i=()=>{this.editBtn.classList.toggle("hide",!t)};return e?i:i()}))}loadSidebarMedia(e,t){this.searchSuper.load(e,t)}onOpenAfterTimeout(){super.onOpenAfterTimeout(),this.scrollable.onScroll()}onCloseAfterTimeout(){super.onCloseAfterTimeout(),this.destroyable&&(this.profile.destroy(),this.searchSuper.destroy())}destroy(){this.destroyable=!0,this.onCloseAfterTimeout()}}},9099:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(3512);const n=e=>{const{element:t,className:i,forwards:a,duration:o,onTransitionEnd:r,onTransitionStart:d,useRafs:l}=e,{timeout:c,raf:h}=t.dataset;if(void 0!==c&&clearTimeout(+c),void 0!==h&&(window.cancelAnimationFrame(+h),l||delete t.dataset.raf),l&&s.Z.settings.animationsEnabled&&o)return void(t.dataset.raf=""+window.requestAnimationFrame((()=>{delete t.dataset.raf,n(Object.assign(Object.assign({},e),{useRafs:l-1}))})));a&&i&&t.classList.add(i);const u=()=>{delete t.dataset.timeout,!a&&i&&t.classList.remove("backwards",i),t.classList.remove("animating"),null==r||r()};if(null==d||d(),!s.Z.settings.animationsEnabled||!o)return t.classList.remove("animating","backwards"),void u();t.classList.add("animating"),t.classList.toggle("backwards",!a),t.dataset.timeout=""+setTimeout(u,o)},a=n},3552:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l,_:()=>a.Z});var s=i(426),n=i(6385),a=i(6024),o=i(1655),r=i(5953),d=i(3624);class l{constructor(e){var t;this.historyTabIds=[],this.canHideFirst=!1,this.onCloseBtnClick=()=>{n.Z.findItemByType(this.navigationType)?n.Z.back(this.navigationType):this.historyTabIds.length&&this.closeTab(this.historyTabIds[this.historyTabIds.length-1])},this.closeTab=(e,t,i)=>{if(void 0!==e&&this.historyTabIds[this.historyTabIds.length-1]!==e)return this.removeTabFromHistory(e),!1;const s=this.historyTabIds.pop();this.onCloseTab(s,t,i);const n=this.historyTabIds[this.historyTabIds.length-1];return this._selectTab(void 0!==n?n instanceof a.Z?n.container:n:this.canHideFirst?-1:0,t),!0},(0,r.Z)(this,e),null!==(t=this.tabs)&&void 0!==t||(this.tabs=new Map),this.tabsContainer=this.sidebarEl.querySelector(".sidebar-slider"),this._selectTab=(0,s.Z)({content:this.tabsContainer,type:"navigation",transitionTime:250}),this.canHideFirst||this._selectTab(0),this.middlewareHelper=(0,d.k)()}getMiddleware(){return this.middlewareHelper.get()}selectTab(e){var t,i,s,o,r;return i=this,s=void 0,r=function*(){if(this.historyTabIds[this.historyTabIds.length-1]===e)return!1;const i=e instanceof a.Z?e:this.tabs.get(e);return this.onOpenTab&&(yield this.onOpenTab()),i&&(null===(t=i.onOpen)||void 0===t||t.call(i),i.onOpenAfterTimeout&&setTimeout((()=>{i.onOpenAfterTimeout()}),250)),n.Z.pushItem({type:this.navigationType,onPop:e=>(this.closeTab(void 0,e,!0),!0)}),this.historyTabIds.push(e),this._selectTab(e instanceof a.Z?e.container:e),!0},new((o=void 0)||(o=Promise))((function(e,t){function n(e){try{d(r.next(e))}catch(e){t(e)}}function a(e){try{d(r.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof o?i:new o((function(e){e(i)}))).then(n,a)}d((r=r.apply(i,s||[])).next())}))}removeTabFromHistory(e){(0,o.Z)(this.historyTabIds,e),this.onCloseTab(e,void 0)}sliceTabsUntilTab(e,t){for(let i=this.historyTabIds.length-1;i>=0;--i){const s=this.historyTabIds[i];if(s!==t){if(s instanceof e)break;this.removeTabFromHistory(s)}}}getTab(e){return this.historyTabIds.find((t=>t instanceof e))}getHistory(){return this.historyTabIds}isTabExists(e){return!!this.getTab(e)}onCloseTab(e,t,i){var s;i||n.Z.removeByType(this.navigationType,!0);const o=e instanceof a.Z?e:this.tabs.get(e);if(o){try{null===(s=o.onClose)||void 0===s||s.call(o)}catch(e){console.error("tab onClose error",o)}o.onCloseAfterTimeout&&setTimeout((()=>{o.onCloseAfterTimeout()}),280)}}addTab(e){e.container.parentElement||(this.tabsContainer.append(e.container),e.closeBtn&&e.closeBtn.addEventListener("click",this.onCloseBtnClick))}deleteTab(e){this.tabs.delete(e)}createTab(e,t=!0,i){const s=new e(i?void 0:this,t);return s.managers=this.managers,s}}},6024:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c,h:()=>h});var s=i(3241),n=i(3699),a=i(3624),o=i(319),r=i(2325),d=i(2230),l=i(8805);class c{constructor(e,t){this._constructor(e,t)}_constructor(e,t=!0){var i;this.slider=e,this.middlewareHelper=e?e.getMiddleware().create():(0,a.k)(),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=(0,d.Z)("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 l.ZP(this.content,void 0,void 0,!0),this.scrollable.attachBorderListeners(this.container),this.container.append(this.header,this.content),null===(i=this.slider)||void 0===i||i.addTab(this),this.listenerSetter=new n.Z}close(){return this.slider.closeTab(this)}open(...e){return t=this,i=void 0,n=function*(){if(this.init)try{const t=this.init(...e);this.init=null,t instanceof Promise&&(yield t)}catch(e){console.error("open tab error",e)}this.slider.selectTab(this)},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}init(...e){}onOpen(){}onOpenAfterTimeout(){}onClose(){}onCloseAfterTimeout(){var e,t,i;this.destroyable&&(null===(e=this.slider)||void 0===e||e.deleteTab(this),this.container.remove(),this.scrollable.destroy(),null===(t=this.listenerSetter)||void 0===t||t.removeAll(),null===(i=this.middlewareHelper)||void 0===i||i.destroy())}setTitle(e){this.title.replaceChildren((0,r.ag)(e))}}class h extends c{constructor(e){super(e),this.eventListener=new s.Z}onClose(){this.eventListener.dispatchEvent("close")}onCloseAfterTimeout(){const e=this.eventListener.dispatchResultableEvent("destroy");return this.eventListener.dispatchEvent("destroyAfter",Promise.all(e).then(o.Z,o.Z)),this.eventListener.cleanup(),super.onCloseAfterTimeout()}}},2894:(e,t,i)=>{"use strict";i.d(t,{Z:()=>p});var s=i(4277),n=i(8594),a=i(8487),o=i(4484),r=i(5565),d=i(3035),l=i(5345),c=i(5953),h=i(3061),u=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class p extends l.Z{constructor(e){let t;super({getIndex:e.getIndex||(e=>this.managers.appUsersManager.getUserStatusForSort(e.id)),onDelete:e=>{e.dom.listEl.remove(),this.onListLengthChange&&this.onListLengthChange()},onUpdate:e.onUpdate||(e=>u(this,void 0,void 0,(function*(){const t=(0,h.Z)(yield this.managers.appUsersManager.getUser(e.id));(0,r.Z)(e.dom.lastMessageSpan,t)}))),onSort:(e,t)=>{const i=e.dom.listEl.parentElement!==this.list;(0,o.Z)(e.dom.listEl,this.list,t),i&&this.onListLengthChange&&this.onListLengthChange()},onElementCreate:e=>{const{dom:t}=s.default.addDialogNew({peerId:e.id,container:!1,avatarSize:this.avatarSize,autonomous:this.autonomous,meAsSaved:!1,rippleEnabled:this.rippleEnabled,wrapOptions:{lazyLoadQueue:this.lazyLoadQueue}});return e.dom=t,e},updateElementWith:d.T2,updateListWith:e=>u(this,void 0,void 0,(function*(){return(0,a.Z)(this.list)?(yield(0,n.e9)(),(0,a.Z)(this.list)?void e(!0):e(!1)):e(!1)}))}),this.avatarSize="abitbigger",this.rippleEnabled=!0,this.autonomous=!0,(0,c.Z)(this,e),this.list=s.default.createChatList(this.createChatListOptions);const i=()=>{t=window.setTimeout((()=>{this.updateList((e=>{e&&i()}))}),p.SORT_INTERVAL)};i()}}p.SORT_INTERVAL=3e4},9259:(e,t,i)=>{"use strict";i.d(t,{Z:()=>I});var s=i(5432),n=i(3910),a=i(2738),o=i(5975),r=i(8497),d=i(8204),l=i(9405),c=i(3624),h=i(3035),u=i(5418),p=i(241),f=i(13),m=i(8115),g=i(5400),v=i(1447),b=i(3772),y=i(3512),w=i(5814),S=i(9099),C=i(3541),L=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};let E=!1;function I({listenTo:e,listenerSetter:t,selector:i,findTarget:I}){if(s.Z)return;const M=(t,s)=>{let n;if(I)n=I(t);else{const e=i||".media-sticker-wrapper";n=t.target.closest(e)}return!n||s&&!(0,o.Z)(n,e)?void 0:n},P=y.Z.managers;t.add(e)("mousedown",(e=>{if(E||e.buttons>1||0!==e.button)return;let t=M(e);if(!t)return;const i=t.dataset.docId;if(!i)return;const s="sticker-viewer",y="STICKER-VIEWER",I=w.Z.getOnlyOnePlayableGroup(),Z=(0,c.k)();let T,k;const x=({mediaContainer:e,doc:t,middleware:i,lockGroups:n,isSwitching:o})=>L(this,void 0,void 0,(function*(){const c=(0,f.Z)(t),S=e.getBoundingClientRect(),L=(0,l.C)(t.w,t.h),E=c?280:360,I=(0,l.C)(E,E),M=S.width===S.height?I:L.aspectFitted(I),Z=(0,r.Z)(e,"bubble"),k=!Z||Z.classList.contains("is-out"),x=document.createElement("div");x.classList.add(s+"-transformer");const A=document.createElement("div");A.classList.add(s+"-sticker"),A.style.width=M.width+"px",A.style.height=M.height+"px";const _=document.createElement("div");if(_.classList.add(s+"-emoji"),_.append((0,m.Z)(t.stickerEmojiRaw)),c){const e=(E*C.Vp-E)/3*(k?1:-1);x.classList.add("has-effect"),x.style.setProperty("--translateX",`${e}px`),_.style.setProperty("--translateX",-e+"px")}const F=(0,r.Z)(e,"scrollable"),D=(0,d.Z)(e,F,!0,S);(D.overflow.vertical||D.overflow.horizontal)&&A.classList.add("is-overflow");const R=e.getBoundingClientRect(),B=R.width/M.width,N=R.height/M.height,O=R.left-(p.Z.width-R.width)/2,U=R.top-(p.Z.height-R.height)/2;x.style.transform=`translate(${O}px, ${U}px) scale(${B}, ${N})`,o&&x.classList.add("is-switching"),x.append(A,_),T.append(x);const H=yield(0,C.ZP)({doc:t,div:A,group:y,width:M.width,height:M.height,play:!1,loop:!0,middleware:i,managers:P,needFadeIn:!1,isOut:k,withThumb:!1,relativeEffect:!0,loopEffect:!0}).then((({render:e})=>e));if(!i())return;T.parentElement||document.body.append(T);const z=Array.isArray(H)?H[0]:H,j=z instanceof b.Z?new Promise((e=>z.addEventListener("firstFrame",e,{once:!0}))):Promise.resolve();if(yield Promise.all([j,(0,h.d1)()]),yield(0,u.Z)(0),i()){if(n&&(w.Z.setOnlyOnePlayableGroup(y),w.Z.checkAnimations2(!0)),z instanceof b.Z){const t=e instanceof g.LD?e.player:v.Z.getAnimation(e);if(t){if(z.curFrame=t.curFrame,z.play(),yield new Promise((e=>{let t=0;const i=()=>{2==++t&&(e(),z.removeEventListener("enterFrame",i))};z.addEventListener("enterFrame",i)})),!i())return;z.pause()}}else if(z instanceof HTMLVideoElement){const t=e.querySelector("video");t&&(z.currentTime=t.currentTime)}return{ready:()=>{(z instanceof b.Z||z instanceof HTMLVideoElement)&&z.play(),c&&(0,a.tH)(A)},transformer:x}}})),A=window.setTimeout((()=>L(this,void 0,void 0,(function*(){document.removeEventListener("mousemove",F),T=document.createElement("div"),T.classList.add(s),E=!0;const e=Z.get(),n=yield P.appDocsManager.getDoc(i);if(!e())return;let a;try{if(a=yield x({doc:n,mediaContainer:t,middleware:e,lockGroups:!0}),!a)return}catch(e){return}const{ready:o,transformer:r}=a;k=r,(0,S.Z)({element:T,className:"is-visible",forwards:!0,duration:200,onTransitionEnd:()=>{e()&&o()}}),document.addEventListener("mousemove",_)}))),125),_=e=>L(this,void 0,void 0,(function*(){const i=M(e,!0);if(!i||t===i)return;const s=i.dataset.docId;if(!s)return;t=i,Z.clean();const n=Z.get(),a=yield P.appDocsManager.getDoc(s);if(!n())return;let o;try{if(o=yield x({doc:a,mediaContainer:t,middleware:n,isSwitching:!0}),!o)return}catch(e){return void console.error("sticker viewer error",e)}const{ready:r,transformer:d}=o,l=k;(0,S.Z)({element:l,className:"is-switching",forwards:!0,duration:200,onTransitionEnd:()=>{l.remove()}}),k=d,(0,S.Z)({element:d,className:"is-switching",forwards:!1,duration:200,onTransitionEnd:()=>{n()&&r()}})})),F=e=>{(0,o.Z)(e.target,t)||D()},D=()=>{clearTimeout(A),Z.clean(),T&&((0,S.Z)({element:T,className:"is-visible",forwards:!1,duration:200,onTransitionEnd:()=>{T.remove(),w.Z.setOnlyOnePlayableGroup(I),w.Z.checkAnimations2(!1),E=!1}}),(0,a.fc)(document.body,n.Z,{capture:!0,once:!0})),document.removeEventListener("mousemove",F),document.removeEventListener("mousemove",_),document.removeEventListener("mouseup",D,{capture:!0})};document.addEventListener("mousemove",F),document.addEventListener("mouseup",D,{once:!0,capture:!0})}))}},5117:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});class s{constructor(e,t){this.container=e,this.handler=t,this.observeHeaders(),this.observeElements()}observeHeaders(){this.headersObserver=new IntersectionObserver((e=>{for(const t of e){const e=t.boundingClientRect,i=t.target.parentElement,s=t.rootBounds;e.bottom=s.top&&e.bottom{const t=e.filter((e=>e.boundingClientRect.tope.boundingClientRect.top-t.boundingClientRect.top))[0];if(!t)return;const i=t.isIntersecting?t.target:t.target.nextElementSibling;this.handler(!0,i)}),{root:this.container})}addSentinel(e,t){const i=document.createElement("div");return i.classList.add("sticky_sentinel",t),e.appendChild(i)}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)}}},3757:(e,t,i)=>{"use strict";i.d(t,{Z:()=>g});var s=i(3910),n=i(5432),a=i(5953),o=i(3416),r=i(3699),d=i(6976),l=i(5418),c=i(3725);const h=e=>"touches"in e?e.touches[0]:e,u=document;let p=!1;o.Z.addEventListener("toggle",(e=>{p=e}));const f={passive:!1},m=!1;class g{constructor(e){var t,i,o,d,g;this.reset=e=>{var t;n.Z?this.listenerSetter.removeManual(u,"touchmove",this.handleMove,f):(this.listenerSetter.removeManual(u,"mousemove",this.handleMove,m),this.setCursorTo.style.cursor=""),this.hadMove&&(null===(t=this.onReset)||void 0===t||t.call(this)),this.resetValues()},this.handleStart=e=>{return t=this,i=void 0,a=function*(){var t;if(this.isMouseDown)return;const i=h(e);if(0!==Math.max(0,null!==(t=i.button)&&void 0!==t?t:0))return;if(this.verifyTouchTarget&&!(yield this.verifyTouchTarget(e)))return this.reset();const s=++this.tempId;if(this.isMouseDown=!0,this.withDelay&&!n.Z){const e=Object.assign(Object.assign({},m),{once:!0}),t=(0,c.Z)(),i=()=>t.resolve(),n=this.listenerSetter.add(u)("mousemove",i,e);if(yield Promise.race([(0,l.Z)(300),t]),t.resolve(),this.listenerSetter.remove(n),this.tempId!==s)return}this.xDown=i.clientX,this.yDown=i.clientY,this.eventUp=i,n.Z?this.listenerSetter.add(u)("touchmove",this.handleMove,f):this.listenerSetter.add(u)("mousemove",this.handleMove,m),this.onStart&&(this.onStart(),this.hadMove=!0,this.handleMove(i))},new((s=void 0)||(s=Promise))((function(e,n){function o(e){try{d(a.next(e))}catch(e){n(e)}}function r(e){try{d(a.throw(e))}catch(e){n(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((a=a.apply(t,i||[])).next())}));var t,i,s,a},this.handleMove=e=>{var t;if(void 0===this.xDown||void 0===this.yDown||p)return void this.reset();this.cancelEvent&&(0,s.Z)(e);const i=this.eventUp=h(e),a=i.clientX,o=i.clientY,r=a-this.xDown+this.xAdded,d=o-this.yDown+this.yAdded;if(!this.hadMove){if(!r&&!d)return;this.hadMove=!0,n.Z||this.setCursorTo.style.setProperty("cursor",this.cursor,"important"),null===(t=this.onFirstSwipe)||void 0===t||t.call(this,e)}const l=this.onSwipe(r,d,e);void 0!==l&&l&&this.reset()},(0,a.Z)(this,e),null!==(t=this.cursor)&&void 0!==t||(this.cursor="grabbing"),null!==(i=this.cancelEvent)&&void 0!==i||(this.cancelEvent=!0),null!==(o=this.listenerOptions)&&void 0!==o||(this.listenerOptions=f),null!==(d=this.setCursorTo)&&void 0!==d||(this.setCursorTo=this.element),this.listenerSetter=new r.Z,this.setListeners(),this.resetValues(),this.tempId=0,null===(g=e.middleware)||void 0===g||g.onDestroy((()=>{this.reset(),this.removeListeners()}))}setListeners(){n.Z?(this.withDelay?(0,d.E)({element:this.element,callback:e=>{(0,s.Z)(e),this.handleStart(e)},listenerSetter:this.listenerSetter,listenerOptions:this.listenerOptions}):this.listenerSetter.add(this.element)("touchstart",this.handleStart,this.listenerOptions),this.listenerSetter.add(u)("touchend",this.reset)):(this.listenerSetter.add(this.element)("mousedown",this.handleStart,this.listenerOptions),this.listenerSetter.add(u)("mouseup",this.reset))}removeListeners(){this.listenerSetter.removeAll()}setCursor(e=""){this.cursor=e,!n.Z&&this.hadMove&&this.setCursorTo.style.setProperty("cursor",this.cursor,"important")}add(e,t){this.xAdded=e,this.yAdded=t,this.handleMove({clientX:this.eventUp.clientX,clientY:this.eventUp.clientY,target:this.eventUp.target})}resetValues(){++this.tempId,this.hadMove=!1,this.xAdded=this.yAdded=0,this.xDown=this.yDown=this.eventUp=this.isMouseDown=void 0}}},709:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(2398),n=i(6272),a=i(4762),o=i(503);class r extends o.ZP{constructor(e={}){super(Object.assign({label:"Contacts.PhoneNumber.Placeholder",name:"phone"},e)),this.pasted=!1,this.lastValue="",this.container.classList.add("input-field-phone");const 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 i;a.IS_APPLE?i=-.16*e:a.IS_ANDROID&&(i=0),t.style.setProperty("--letter-spacing",i+"px")}const i=this.setValueSilently.bind(this);this.setValueSilently=e=>{i(e),(0,s.Z)(this.input,!0)}}t.addEventListener("input",(()=>{t.classList.remove("error");const i=this.value;let s;Math.abs(i.length-this.lastValue.length)>1&&!this.pasted&&a.IS_APPLE_MOBILE&&this.setValueSilently(this.lastValue+i),this.pasted=!1,this.setLabel();let o,r,d,l="";"+"===this.value.replace(/\++/,"+")?this.setValueSilently("+"):(s=(0,n.u)(this.value),o=s.formatted,r=s.country,l=s.leftPattern,d=s.code,this.setValueSilently(this.lastValue=o?"+"+o:"")),t.dataset.leftPattern=l,e.onInput&&e.onInput(s)})),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}))}}},2796:(e,t,i)=>{"use strict";i.d(t,{Am:()=>c,PE:()=>l,bC:()=>h});var s=i(5565),n=i(2296),a=i(2325);const o=document.createElement("div");let r;o.classList.add("toast");const d=new n.Z("toast");function l(){d.close(),o.classList.remove("is-visible"),r&&clearTimeout(+r),r=window.setTimeout((()=>{o.remove(),r=void 0}),200)}function c(e,t){d.close(),(0,s.Z)(o,e),o.parentElement||(document.body.append(o),o.offsetLeft),o.classList.add("is-visible"),r&&clearTimeout(+r),d.open(o),r=window.setTimeout(l,3e3),t&&d.addEventListener("toggle",t,{once:!0})}function h(e){c((0,a.ag)(e.langPackKey,e.langPackArguments),e.onClose)}d.addEventListener("toggle",(e=>{e||l()}))},426:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l});var s=i(3512),n=i(3725),a=i(8594),o=i(2648),r=i(3910);const d={navigation:{callback:(e,t,i)=>{const s=t.getBoundingClientRect().width,n=[e,t];return i&&n.reverse(),n[0].style.filter="brightness(80%)",n[0].style.transform=`translate3d(${.25*-s}px, 0, 0)`,n[1].style.transform=`translate3d(${s}px, 0, 0)`,e.classList.add("active"),e.offsetWidth,e.style.transform="",e.style.filter="",()=>{t.style.transform=t.style.filter=""}},animateFirst:!1},tabs:{callback:(e,t,i)=>{const s=t.getBoundingClientRect().width,n=[e,t];return i&&n.reverse(),n[0].style.transform=`translate3d(${-s}px, 0, 0)`,n[1].style.transform=`translate3d(${s}px, 0, 0)`,e.classList.add("active"),e.offsetWidth,e.style.transform="",()=>{t.style.transform=""}},animateFirst:!1}},l=e=>{let{content:t,type:i,transitionTime:l,onTransitionEnd:c,isHeavy:h=!0,once:u=!1,withAnimationListener:p=!0,listenerSetter:f,animateFirst:m=!1}=e;const{callback:g,animateFirst:v}=d[i]||{};t.dataset.animation=i,void 0!==v&&(m=v);const b=new Map;let y,w=null;if(p){const e=g?"transitionend":"animationend",i=s=>{if((0,r.Z)(s),s.target.parentElement!==t)return;const n=b.get(s.target);null==n||n(),s.target===w&&(!y&&h||(y&&(y.resolve(),y=void 0),null==c||c(S.prevId()),t.classList.remove("animating","backwards","disable-hover"),u&&(f?f.removeManual(t,e,i):t.removeEventListener(e,i),w=y=void 0,b.clear())))};f?f.add(t)(e,i):t.addEventListener(e,i)}function S(e,i=!0,r){r&&(w=r),e instanceof HTMLElement&&(e=(0,o.Z)(e));const d=S.prevId();if(e===d)return!1;const u=t.children[e];if(s.Z.settings.animationsEnabled&&(-1!==d||m)||(i=!1),!p){const e=t.dataset.timeout;void 0!==e&&clearTimeout(+e),delete t.dataset.timeout}if(!i){if(w)w.classList.remove("active","to","from");else if(u){const e=b.get(u);null==e||e()}return u&&(u.classList.remove("to","from"),u.classList.add("active")),t.classList.remove("animating","backwards","disable-hover"),w=u,void(null==c||c(e))}p||(t.dataset.timeout=""+window.setTimeout((()=>{u.classList.remove("to"),w&&w.classList.remove("from"),t.classList.remove("animating","backwards","disable-hover"),delete t.dataset.timeout}),l)),w&&(w.classList.remove("to"),w.classList.add("from")),t.classList.add("animating");const f=d{u.classList.remove("to"),b.delete(u)}))}if(w){let e;const t=w,i=()=>{clearTimeout(e),t.classList.remove("active","from"),null==v||v(),b.delete(t)};u?(e=window.setTimeout(i,l+100),b.set(t,i)):(e=window.setTimeout(i,l),b.set(t,(()=>{clearTimeout(e),b.delete(t)}))),t.dataset.transitionTimeout=""+e,h&&(y||(y=(0,n.Z)()),(0,a.YW)(y,2*l))}w=u}return S.prevId=()=>w?(0,o.Z)(w):-1,S.getFrom=()=>w,S.setFrom=e=>w=e,S}},6726:(e,t,i)=>{"use strict";i.d(t,{l:()=>o});var s=i(5701),n=i(503);function a(e){return(e.length>=3&&e.length<=32||!e.length)&&/^[a-zA-Z0-9_]*$/.test(e)}class o extends n.ZP{constructor(e,t){super(e),this.managers=t,this.checkUsernameDebounced=(0,s.Z)(this.checkUsername.bind(this),150,!1,!0),e.listenerSetter.add(this.input)("input",(()=>{var e,t,i,s;const o=this.getValue();if(this.error=void 0,o===this.originalValue||!o.length)return this.setState(n.I1.Neutral),void(null===(t=(e=this.options).onChange)||void 0===t||t.call(e));a(o)?this.setState(n.I1.Neutral):this.setError(this.options.invalidText),this.input.classList.contains("error")?null===(s=(i=this.options).onChange)||void 0===s||s.call(i):this.checkUsernameDebounced(o)}))}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){if(this.checkUsernamePromise)return;let t;this.error=void 0,t=this.options.peerId?this.managers.appChatsManager.checkUsername(this.options.peerId.toChatId(),e):this.managers.appUsersManager.checkUsername(e);const i=this.checkUsernamePromise=t.then((t=>{this.getValue()===e&&(t?this.setState(n.I1.Valid,this.options.availableText):this.setError(this.options.takenText))}),(t=>{this.getValue()===e&&(this.error=t,"USERNAME_PURCHASE_AVAILABLE"===t.type?this.setError(this.options.takenText):this.setError(this.options.invalidText))})).then((()=>{var t,s;this.checkUsernamePromise===i&&(this.checkUsernamePromise=void 0),null===(s=(t=this.options).onChange)||void 0===s||s.call(t);const n=this.getValue();n!==e&&this.isValidToChange()&&a(n)&&this.checkUsername(n)}))}}},9522:(e,t,i)=>{"use strict";i.d(t,{Z:()=>g});var s=i(2738),n=i(5975),a=i(2398),o=i(4484),r=i(2914),d=i(319),l=i(5345),c=i(2325),h=i(3512),u=i(5592),p=i(7479),f=i(5029),m=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class g extends f.Z{constructor(e){super({name:"UsernamesProfileHeader",caption:e.peerId.isUser()?"UsernamesProfileHelp":"UsernamesChannelHelp"});const{peerId:t,peer:i,usernameInputField:f,listenerSetter:g,middleware:v}=e,b=h.Z.managers,y=t.isUser()?void 0:t.toChatId(),w=this,S="usernames",C=document.createElement("div");let L;C.classList.add(S);const E=new l.Z({getIndex:e=>L.length-L.findIndex((t=>t.username===e.id)),onDelete:e=>{e.row.container.remove()},onSort:(e,t)=>{(0,o.Z)(e.row.container,C,t)},onElementCreate:e=>{const t=L.find((t=>t.username===e.id)),i=new p.ZP({title:"@"+t.username,subtitle:!0,clickable:!0}),s=!!t.pFlags.editable,n=!!t.pFlags.active;return s&&(i.container.dataset.editable="1"),i.container.dataset.username=t.username,i.container.classList.add(S+"-username"),i.subtitle.classList.add(S+"-username-status"),i.createMedia("medium").classList.add(S+"-username-icon","tgico"),i.makeSortable(),I(i,n),e.row=i,e}}),I=(e,t)=>{e.subtitle.replaceChildren((0,c.ag)(e.container.dataset.editable?"UsernameLinkEditable":t?"UsernameLinkActive":"UsernameLinkInactive")),e.container.classList.toggle("active",t),e.toggleSorting(t)},M=(e=[])=>{L=e,E.getAll().forEach((t=>{e.some((e=>e.username===t.id))||E.delete(t.id)})),e.forEach((e=>{if(E.has(e.username)){const t=E.get(e.username);E.update(e.username,t),I(t.row,!!e.pFlags.active)}else E.add(e.username)})),w.container.classList.toggle("hide",!E.getAll().size)};M(i.usernames),g.add(h.Z)("peer_title_edit",(({peerId:e})=>m(this,void 0,void 0,(function*(){if(e!==t)return;const i=yield b.appPeersManager.getPeer(t);M(i.usernames)}))));let P=!1;(0,s.fc)(C,(e=>m(this,void 0,void 0,(function*(){if(P)return void(P=!1);const t=(0,n.Z)(e.target,C);if(!t)return;if(t.dataset.editable)return void(0,a.Z)(f.input,!0,!0);const i=t.dataset.username,s=t.classList.contains("active");let o,r;s?(o="UsernameDeactivateLink",r=y?"UsernameDeactivateLinkChannelMessage":"UsernameDeactivateLinkProfileMessage"):(o="UsernameActivateLink",r=y?"UsernameActivateLinkChannelMessage":"UsernameActivateLinkProfileMessage");try{yield(0,u.Z)({titleLangKey:o,descriptionLangKey:r,button:{langKey:s?"Hide":"Show"}})}catch(e){return}const l=!s;let c;c=y?b.appChatsManager.toggleUsername(y,i,l):b.appUsersManager.toggleUsername(i,l),c.catch((e=>{"USERNAMES_ACTIVE_TOO_MUCH"===e.type?(0,u.Z)({titleLangKey:"UsernameActivateErrorTitle",descriptionLangKey:"UsernameActivateErrorMessage",button:{langKey:"OK",isCancel:!0}}).catch(d.Z):console.error("turn username error",e)}))})))),new r.Z({list:C,middleware:v,onSort:(e,t)=>{const i=L.splice(e,1)[0];L.splice(t,0,i),E.updateList();const s=L.filter((e=>e.pFlags.active)).map((e=>e.username));y?b.appChatsManager.reorderUsernames(y,s):b.appUsersManager.reorderUsernames(s)}}),w.content.append(C)}}},2940:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});class s{constructor(e,t){this.items=new Map,this.locked=!1,this.observer=new IntersectionObserver((t=>{if(this.locked)return;const i=[];t.forEach(((e,t)=>{const s=e.target;if(this.items.get(s)===e.isIntersecting)return;this.items.set(s,e.isIntersecting);const n={target:s,visible:e.isIntersecting,entry:e,index:t};i.push(n)})),i.forEach((t=>{e(t)}))}),t)}getVisible(){const e=[];return this.items.forEach(((t,i)=>{t&&e.push(i)})),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}}},8427:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(3910),n=i(2738),a=i(3013),o=i(65);class r extends o.Z{constructor(e,t=!1){super({step:.01,min:0,max:1,vertical:t},1),this.listenerSetter=e,this.vertical=t,this.onMuteClick=e=>{e&&(0,s.Z)(e),a.Z.muted=!a.Z.muted},this.setVolume=()=>{const{volume:e,muted:t}=a.Z;let i;i=!e||t?0:e>.5?3:e>0&&e<.25?1:2,r.ICONS.forEach((e=>this.icon.classList.remove("tgico-"+e))),this.icon.classList.add("tgico-"+r.ICONS[i]),this.mousedown||this.setProgress(t?0:e)},this.setListeners(),this.setHandlers({onScrub:e=>{const t=Math.max(Math.min(e,1),0);a.Z.muted=!1,a.Z.volume=t}});const i="player-volume",o=this.btn=document.createElement("div");o.classList.add("btn-icon",i);const d=this.icon=document.createElement("span");d.classList.add(i+"__icon"),o.append(d,this.container),(0,n.fc)(d,this.onMuteClick,{listenerSetter:this.listenerSetter}),this.listenerSetter.add(a.Z)("playbackParams",this.setVolume),this.setVolume()}}r.ICONS=["volume_off","volume_mute","volume_down","volume_up"]},9083:(e,t,i)=>{"use strict";i.d(t,{N:()=>a,Z:()=>n});var s=i(5400);function n({docIds:e,loadPromises:t,middleware:i,lazyLoadQueue:n,customEmojiSize:a,animationGroup:o}){const r=" ".repeat(e.length),d=[];return e.forEach(((e,t)=>{d.push({_:"messageEntityCustomEmoji",offset:t,length:1,document_id:e})})),(0,s.ZP)(r,{entities:d,loadPromises:t,animationGroup:o,customEmojiSize:a,middleware:i,lazyLoadQueue:n})}function a(e){var t;const i=null!==(t=e.loadPromises)&&void 0!==t?t:e.loadPromises=[],s=n(e);return Promise.all(i).then((()=>s))}},296:(e,t,i)=>{"use strict";i.d(t,{Z:()=>I});var s=i(2341),n=i(467),a=i(632),o=i(2738),r=i(8497),d=i(4081),l=i(319),c=i(2312),h=i(9322),u=i(1243),p=i(7030),f=i(2325),m=i(1507),g=i(2491),v=i(3512),b=i(8448),y=i(3251),w=i(3442),S=i(9492),C=i(5671),L=i(1604),E=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function I({message:e,withTime:t,fontWeight:i,voiceAsMusic:I,showSender:M,searchContext:P,loadPromises:Z,autoDownloadSize:T,lazyLoadQueue:k,sizeType:x,managers:A=v.Z.managers,cacheContext:_,fontSize:F,getSize:D}){var R;return E(this,void 0,void 0,(function*(){null!=i||(i=500),null!=x||(x=""),null!=F||(F=16);const B=0===T,N=e.media.document||e.media.webpage.document,O=null==e?void 0:e.uploadingFileName;if("audio"===N.type||"voice"===N.type||"round"===N.type){const s=new b.ZP;return s.withTime=t,s.message=e,s.noAutoDownload=B,s.lazyLoadQueue=k,s.loadPromises=Z,s.getSize=D,I&&(s.voiceAsMusic=I),P&&(s.searchContext=P),M&&(s.showSender=M),s.dataset.fontWeight=""+i,s.dataset.fontSize=""+F,s.dataset.sizeType=x,yield s.render(),s}const U=N.file_name?N.file_name.split("."):"";let H="";H=U.length>1&&Array.isArray(U)?(0,n.ST)(U.pop().split(" ",1)[0].toLowerCase()):"file";const z=document.createElement("div");z.classList.add("document",`ext-${H}`),z.dataset.docId=""+N.id,z.doc=N;const j=document.createElement("div");let G;j.classList.add("document-ico");const V=!!_,K=()=>V?_:A.thumbsStorage.getCacheContext(N);_=yield K();let W=!1;if((null===(R=N.thumbs)||void 0===R?void 0:R.length)||e.pFlags.is_outgoing&&_.url&&"photo"===N.type){z.classList.add("document-with-thumb"),W=!0;const t=[];if(e.pFlags.is_outgoing&&["photo","video"].includes(N.type)&&_.url)j.innerHTML=``,t.push(j.firstElementChild);else{performance.now();const e=yield(0,S.Z)({photo:N,message:null,container:j,boxWidth:54,boxHeight:54,loadPromises:Z,withoutPreloader:!0,lazyLoadQueue:k,size:(0,p.Z)(N,54,54,!0),managers:A});j.style.width=j.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 G=document.createElement("span"),G.classList.add("document-ico-text"),G.innerText=H,j.append(G);const $=N.file_name?(0,g.Z)(N.file_name):"Unknown.file";document.createElement("div").classList.add("document-description");const q=document.createElement("span"),Q=[(0,d.Z)(N.size)];if(t&&Q.push((0,a.OD)(e.date)),M&&Q.push(yield(0,C.Z)(e)),!t&&!M){const e=document.createElement("span"),t=(0,d.Z)(N.size);e.append(" / ",t),e.style.visibility="hidden",Q.push(e)}z.innerHTML=`\n ${_.downloaded&&!O||!e.mid||!W?"":'
'}\n
\n
\n `;const Y=z.querySelector(".document-name"),X=new y.I;X.dataset.fontWeight=""+i,X.dataset.fontSize=""+F,X.dataset.sizeType=x,X.getSize=D,X.textContent=$,e.mid||z.classList.add("downloaded"),Y.append(X),M&&Y.append((0,L.Z)(e));const J=z.querySelector(".document-size");if(q.append(...(0,f.A1)(Q," ยท ")),J.append(q),z.prepend(j),!O&&e.pFlags.is_outgoing&&!e.mid)return z;let ee,te=null;const ie=()=>{if(z.classList.remove("downloading"),N.size>m.Iw&&!O)return te.setManual(),te.attach(ee),te.preloader.classList.add("manual"),void te.setDownloadFunction(ne);if(N.size<=m.Iw&&z.classList.add("downloaded"),ee){if(ee!==j){const e=ee;setTimeout((()=>{e.remove()}),200)}ee=null}te&&(te=null)},se=e=>{z.classList.add("downloading");const t=document.createElement("span"),i=(0,d.Z)(N.size);t.style.position="absolute",t.style.left="0",e.then(ie,l.Z).finally((()=>{q.style.visibility="",t.remove()}));const s=e=>(0,d.Z)(e);let n=s(0);q.style.visibility="hidden",t.append(n," / ",i),q.parentElement.append(t),e.addNotifyListener((e=>{const t=s(e.done);n.replaceWith(t),n=t}))},ne=e=>{var t;const i=!e||e.isTrusted,n=z.doc;let a;const o=h.ZP.chat.bubbles?h.ZP.chat.bubbles.lazyLoadQueue.queueId:void 0;if(i)if("pdf"===n.type){const e=!te||te.detached;a=c.Z.downloadMediaURL({media:n,queueId:o}),e&&a.then((()=>{setTimeout((()=>E(this,void 0,void 0,(function*(){const e=(yield K()).url;window.open(e)}))),v.Z.settings.animationsEnabled?250:0)}))}else a=s.Z.has(n.mime_type)&&(null===(t=n.thumbs)||void 0===t?void 0:t.length)?c.Z.downloadMediaURL({media:n,queueId:o}):c.Z.downloadToDisc({media:n,queueId:o});else a=c.Z.downloadToDisc({media:n,queueId:o},!0);a.catch((()=>{z.classList.remove("downloading")})),ee&&(te.attach(ee,!0,a),se(a))},{fileName:ae}=(0,u.Z)({media:N,downloadId:"1"});if(yield A.apiFileManager.isDownloading(ae)){ee=z.querySelector(".document-download")||j;const e=c.Z.downloadToDisc({media:N},!0);te=new w.Z,te.attach(ee,!1,e),te.setDownloadFunction(ne),se(e)}else if(!_.downloaded||O)if(ee=z.querySelector(".document-download")||j,te=new w.Z({isUpload:!!O}),O){const e=c.Z.getUpload(O);te.attachPromise(e),te.attach(ee),se(e)}else te.construct(),te.setManual(),te.attach(ee),te.setDownloadFunction(ne),void 0!==T&&T>=N.size&&(0,o.tH)(te.preloader);return(0,o.fc)(z,(e=>{(0,r.Z)(e.target,"time")||(te?te.onClick(e):ne(e))})),z}))}v.Z.addEventListener("document_downloading",(e=>{Array.from(document.querySelectorAll(`.document[data-doc-id="${e}"]`)).forEach((e=>{e.querySelector(".preloader-container.manual")&&(0,o.tH)(e)}))}))},8210:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(6272);function n(e){return"+"+(0,s.u)(e).formatted}},177:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(2575),n=i(2325),a=i(3512);function o(e,t=a.Z.managers){var i,o,r,d,l,c;return r=this,d=void 0,c=function*(){const a=yield t.appChatsManager.getChat(e);if("chatForbidden"===a._)return(0,n.ag)("YouWereKicked");const r=yield t.appProfileManager.getCachedFullChat(e);let d;d=r?"channelFull"===r._?r.participants_count:null===(i=r.participants.participants)||void 0===i?void 0:i.length:a.participants_count||(null===(o=a.participants)||void 0===o?void 0:o.participants.length),d=d||1;const l=a.pFlags.broadcast?"Peer.Status.Subscribers":"Peer.Status.Member";return(0,n.ag)(l,[(0,s.Z)(d)])},new((l=void 0)||(l=Promise))((function(e,t){function i(e){try{n(c.next(e))}catch(e){t(e)}}function s(e){try{n(c.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof l?n:new l((function(e){e(n)}))).then(i,s)}n((c=c.apply(r,d||[])).next())}))}},493:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(8456),n=i(5102),a=i(2325),o=i(8115),r=i(3512);function d(e){return t=this,i=void 0,l=function*(){const{peerId:t=r.Z.myId,plainText:i,onlyFirstName:d,limitSymbols:l,managers:c=r.Z.managers,threadId:h}=e;let u="";if(t.isUser()){const e=yield c.appUsersManager.getUser(t.toUserId());e&&(e.first_name&&(u+=e.first_name),!e.last_name||d&&u||(u+=" "+e.last_name)),u=u?u.trim():!e||e.pFlags.deleted?a.ZP.format(d?"Deleted":"HiddenName",!0):(0,n.Z)(e)[0]||""}else{if(h){const e=yield c.dialogsStorage.getForumTopic(t,h);u=(null==e?void 0:e.title)||""}if(!u){const e=yield c.appChatsManager.getChat(t.toChatId());u=(null==e?void 0:e.title)||""}d&&(u=u.split(" ")[0])}return void 0!==l&&(u=(0,s.Z)(u,l,l)),i?u:(0,o.Z)(u)},new((d=void 0)||(d=Promise))((function(e,s){function n(e){try{o(l.next(e))}catch(e){s(e)}}function a(e){try{o(l.throw(e))}catch(e){s(e)}}function o(t){var i;t.done?e(t.value):(i=t.value,i instanceof d?i:new d((function(e){e(i)}))).then(n,a)}o((l=l.apply(t,i||[])).next())}));var t,i,d,l}},3061:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(632),n=i(2325),a=i(1507);function o(e){var t;if(!e)return document.createElement("span");let i,o;switch(e.id){case a.hj.toUserId():i="Peer.RepliesNotifications";break;case a.yF.toUserId():i="Peer.ServiceNotifications";break;default:if(e.pFlags.bot){i="Bot";break}if(e.pFlags.support){i="SupportStatus";break}switch(null===(t=e.status)||void 0===t?void 0:t._){case"userStatusRecently":i="Lately";break;case"userStatusLastWeek":i="WithinAWeek";break;case"userStatusLastMonth":i="WithinAMonth";break;case"userStatusOffline":{const t=e.status.was_online,n=new Date,a=(n.getTime()/1e3|0)-t;if(a<60)i="Peer.Status.justNow";else if(a<3600)i="Peer.Status.minAgo",o=[a/60|0];else if(a<86400&&n.getDate()===new Date(1e3*t).getDate())i="LastSeen.HoursAgo",o=[a/3600|0];else{i="Peer.Status.LastSeenAt";const{dateEl:e,timeEl:n}=(0,s.rz)(t);o=[e,n]}break}case"userStatusOnline":i="Online";break;default:i="ALongTimeAgo"}}return(0,n.ag)(i,o)}},6131:(e,t,i)=>{"use strict";i.d(t,{MR:()=>d,ZP:()=>c,kN:()=>l});var s=i(3910),n=i(1046),a=i(319),o=i(6628),r=i(9099);function d(e){const{mediaSpoiler:t,reveal:i,destroyAfter:s}=e;(0,r.Z)({element:t,forwards:i,className:"is-revealing",duration:250,onTransitionEnd:()=>{i&&s&&(t.remove(),t.middlewareHelper.destroy())}})}function l(e){const{mediaSpoiler:t,event:i}=e;if((0,s.Z)(i),t.classList.contains("is-revealing"))return;const n=t.parentElement.querySelector("video");n&&!t.parentElement.querySelector(".video-play")&&(n.autoplay=!0,n.play().catch(a.Z)),d({mediaSpoiler:t,reveal:!0,destroyAfter:!0})}function c(e){return t=this,i=void 0,a=function*(){const{media:t}=e,i=(t.sizes||t.thumbs).find((e=>"photoStrippedSize"===e._));if(!i)return;const{image:s,loadPromise:a}=(0,n.Z)(t,i,!0);return yield a,function(e){const{middleware:t,image:i}=e;if(!t())return;i.classList.add("media-spoiler-thumbnail");const s=document.createElement("div");s.classList.add("media-spoiler-container"),s.middlewareHelper=t.create();const n=o.Z.create(Object.assign(Object.assign({},e),{middleware:s.middlewareHelper.get()}));return s.append(i,n.canvas),s}(Object.assign(Object.assign({},e),{image:s}))},new((s=void 0)||(s=Promise))((function(e,n){function o(e){try{d(a.next(e))}catch(e){n(e)}}function r(e){try{d(a.throw(e))}catch(e){n(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((a=a.apply(t,i||[])).next())}));var t,i,s,a}},6239:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(9345);function n(e){return t=this,i=void 0,a=function*(){try{return yield(0,s.Z)(e)}catch(t){return console.error("wrapMessageActionTextNewUnsafe error:",t),e.plain?"":document.createElement("span")}},new((n=void 0)||(n=Promise))((function(e,s){function o(e){try{d(a.next(e))}catch(e){s(e)}}function r(e){try{d(a.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(t,i||[])).next())}));var t,i,n,a}},9345:(e,t,i)=>{"use strict";i.d(t,{Z:()=>F,e:()=>x});var s=i(1655),n=i(632),a=i(2614),o=i(130),r=i(8939),d=i(5180),l=i(2946),c=i(2325),h=i(1507),u=i(8115),p=i(2491),f=i(5400),m=i(3512),g=i(2064),v=i(5798);let b,y,w;const S=new Map;var C=i(9083),L=i(493),E=i(3591);function I(e){const t=e.action,{onclick:i,url:s}=(0,E.Z)(`tg://voicechat?chat_id=${e.peerId.toChatId()}&id=${t.call.id}&access_hash=${t.call.access_hash}`);if(!i)return document.createElement("span");const n=document.createElement("a");return n.href=s,n.setAttribute("onclick",i+"(this)"),n}var M=i(496),P=i(7362),Z=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function T(e){return Z(this,void 0,void 0,(function*(){const t=yield(0,M.Z)(e);if(e.plain)return t;const i=document.createElement("i");return i.dataset.savedFrom=e.message.peerId+"_"+e.message.mid,i.dir="auto",i.append(t),i}))}function k(e,t){return t?e:(0,a.Z)((0,u.Z)(e))}function x(e){return Z(this,void 0,void 0,(function*(){const t=e.topic;let i=null==t?void 0:t.icon_emoji_id;return(null==t?void 0:t.id)===h.Ox&&(i="5390854796011906616"),i?e.plain?m.Z.managers.appEmojiManager.getCustomEmojiDocument(i).then((e=>e.stickerEmojiRaw)):(0,C.N)(Object.assign(Object.assign({},e),{docIds:[i]})).then((e=>(e.lastElementChild.classList.add("topic-icon"),e))):e.plain?"":function(e,t){if(!b){w=document.getElementById("svg-defs");const e="http://www.w3.org/2000/svg";b=document.createElementNS(e,"svg"),b.setAttributeNS(null,"width","26"),b.setAttributeNS(null,"height","26"),b.setAttributeNS(null,"viewBox","0 0 26 26"),b.classList.add("topic-icon-svg");const t=document.createElementNS(e,"use");t.setAttributeNS(null,"href","#topic-icon"),b.append(t),y=document.createElement("span"),y.classList.add("topic-icon","avatar-like");const i=document.createElement("span");i.classList.add("topic-icon-content"),y.append(b,i)}e||(console.error("NO TOPIC ICON COLOR!"),e=h.OS[0]),t||(console.error("NO TOPIC NAME!"),t="");const i=e.toString(16),s=`topic-icon-gradient-${e}`;let n=S.get(e);if(!n){const{h:t,s:a,l:o,a:r}=(0,g.cw)("#"+i);w.insertAdjacentHTML("beforeend",`\n \n \n \n \n `),S.set(e,n=`hsla(${t}, ${a}%, ${Math.max(0,o-40)}%, ${r})`)}const a=y.cloneNode(!0);return a.firstElementChild.style.fill=`url(#${s})`,a.firstElementChild.style.stroke=n,a.lastElementChild.append((0,v.Z)(t,!0)),a}(null==t?void 0:t.icon_color,null==t?void 0:t.title)}))}function A(e){const t=e.message.action;return x(Object.assign(Object.assign({},e),{topic:t}))}function _(e){return Z(this,void 0,void 0,(function*(){const t=e.message.action,i=document.createElement("span");return i.classList.add("topic-name"),i.append(yield A(e),k(t.title,e.plain)),i}))}function F(e){var t;return Z(this,void 0,void 0,(function*(){const{plain:i,message:h,middleware:g,lazyLoadQueue:v,customEmojiSize:b,animationGroup:y}=e,w=i?void 0:document.createElement("span"),S="action"in h&&h.action;if(S.message){const e=S.message;return i?(0,p.Z)(e):((0,o.Z)(w,(0,f.ZP)(e,{noLinebreaks:!0})),w)}{let o,p,g=S._;const v=m.Z.managers,b=(e,t)=>t?(0,L.Z)({peerId:e,plainText:t}):(0,P.Z)({peerId:e});switch(S._){case"messageActionPhoneCall":g+="."+S.type,p=[(0,r.Z)(S.duration,i)];break;case"messageActionGroupCall":g+="."+S.type,p=[],g.endsWith("You")||h.pFlags.post||p.push(b(h.fromId,i)),void 0!==S.duration?p.push((0,r.Z)(S.duration,i)):p.push(I(h));break;case"messageActionInviteToGroupCall":{const e=[h.fromId,S.users[0].toPeerId()];let t="Chat.Service.VoiceChatInvitation";const n=m.Z.myId;e[0]===n?t+="ByYou":e[1]===n&&(t+="ForYou"),(0,s.Z)(e,n),o=t,p=e.map((e=>b(e,i))),p.push(I(h));break}case"messageActionGroupCallScheduled":{const e=new Date,t=new Date(1e3*S.schedule_date),s=(t.getTime()-e.getTime())/864e5,a=new Date(e);a.setDate(a.getDate()+1);const r=yield v.appPeersManager.isBroadcast(h.peerId);o=r?"ChatList.Service.VoiceChatScheduled.Channel":"ChatList.Service.VoiceChatScheduled",p=[];const d=m.Z.myId;let l;h.fromId===d?o+="You":r||p.push(b(h.fromId,i));const u=[];s<1&&t.getDate()===e.getDate()?l="TodayAtFormattedWithToday":s<2&&t.getDate()===a.getDate()?l="Time.TomorrowAt":(l="formatDateAtTime",u.push(new c.ZP.IntlDateElement({date:t,options:{day:"2-digit",month:"2-digit",year:"2-digit"}}).element)),u.push((0,n.mr)(t));const f=(0,c.ag)(l,u);p.push(f);break}case"messageActionChatCreate":{const e=m.Z.myId;h.fromId===e?g+="You":p=[b(h.fromId,i)];break}case"messageActionPinMessage":{const t=h.peerId,s=yield v.appMessagesManager.getMessageByPeer(t,h.reply_to_mid);p=[b(h.fromId,i)],s?p.push(T(Object.assign(Object.assign({},e),{message:s}))):(o="ActionPinnedNoText",h.reply_to_mid&&v.appMessagesManager.fetchMessageReplyTo(h));break}case"messageActionChatJoinedByRequest":{const e=yield v.appPeersManager.isBroadcast(h.peerId);h.pFlags.out?o=e?"RequestToJoinChannelApproved":"RequestToJoinGroupApproved":(o=e?"ChatService.UserJoinedChannelByRequest":"ChatService.UserJoinedGroupByRequest",p=[b(h.fromId,i)]);break}case"messageActionContactSignUp":case"messageActionChatReturn":case"messageActionChatLeave":case"messageActionChatJoined":case"messageActionChatEditPhoto":case"messageActionChatDeletePhoto":case"messageActionChatEditVideo":case"messageActionChatJoinedByLink":case"messageActionChannelEditVideo":case"messageActionChannelDeletePhoto":p=[b(h.fromId,i)];break;case"messageActionChannelEditTitle":case"messageActionChatEditTitle":p=[],"messageActionChatEditTitle"===S._&&p.push(b(h.fromId,i)),p.push(k(S.title));break;case"messageActionChatDeleteUser":case"messageActionChatAddUsers":case"messageActionChatAddUser":{const e=S.users||[S.user_id];if(p=[b(h.fromId,i)],e.length>1){const t=(0,c.v_)(yield Promise.all(e.map((e=>b(e.toPeerId(),i)))),!1,i);if(i)p.push(...t);else{const e=document.createElement("span");e.append(...t),p.push(e)}}else p.push(b(e[0].toPeerId(),i));break}case"messageActionBotAllowed":{const e=(0,f.ZP)(S.domain,{entities:[{_:"messageEntityUrl",length:S.domain.length,offset:0}]});p=[(0,a.Z)(e)];break}case"messageActionPaymentSent":{const s=S.pFlags.recurring_init,n=S.pFlags.recurring_used;if(o=n?"Chat.Service.PaymentSentRecurringUsedNoTitle":s?"Chat.Service.PaymentSentRecurringInitNoTitle":"Chat.Service.PaymentSent1NoTitle",p=[(0,d.Z)(S.total_amount,S.currency),b(h.peerId,i)],h.reply_to_mid){const i=yield v.appMessagesManager.getMessageByPeer((null===(t=h.reply_to)||void 0===t?void 0:t.reply_to_peer_id)?(0,l.Z)(h.reply_to.reply_to_peer_id):h.peerId,h.reply_to_mid);i?(o=n?"Chat.Service.PaymentSentRecurringUsed":s?"Chat.Service.PaymentSentRecurringInit":"Chat.Service.PaymentSent1",p.push(T(Object.assign(Object.assign({},e),{message:i})).then((e=>(e instanceof HTMLElement&&e.classList.add("is-receipt-link"),e))))):v.appMessagesManager.fetchMessageReplyTo(h)}break}case"messageActionSetMessagesTTL":{p=[];const e=yield v.appPeersManager.isBroadcast(h.peerId);if(S.period){let t;if(e?o="ActionTTLChannelChanged":h.fromId===m.Z.myId?o="ActionTTLYouChanged":(o="ActionTTLChanged",p.push(b(h.fromId,i))),S.period>1814400){let e;const s=[],a=31536e3;S.period>=a?(e="Years",s.push(S.period/a|0)):(e="Months",s.push(S.period/(30*n.s2)|0)),t=i?c.ZP.format(e,!0,s):(0,c.ag)(e,s)}else t=(0,r.Z)(S.period,i);p.push(t)}else e?o="ActionTTLChannelDisabled":h.fromId===m.Z.myId?o="ActionTTLYouDisabled":(o="ActionTTLDisabled",p.push(b(h.fromId,i)));break}case"messageActionTopicEdit":{let t,s,n;const a=!!h.pFlags.out,r=void 0!==S.icon_emoji_id,d=r&&!+S.icon_emoji_id,l=void 0!==S.title,c=void 0!==S.hidden;a||(n=b(h.fromId,i)),l&&(s=k(S.title)),r&&!d&&(t=A(e)),p=n?[n]:[],S.closed?o=a?"Chat.Service.Group.TopicEdited.You.Paused":"Chat.Service.Group.TopicEdited.Paused":!1===S.closed?o=a?"Chat.Service.Group.TopicEdited.You.Resumed":"Chat.Service.Group.TopicEdited.Resumed":d&&l?(o=a?"Chat.Service.TopicEdited.You.Mixed.IconRemoved":"Chat.Service.TopicEdited.Mixed.IconRemoved",p.push(s)):r&&l?(o=a?"Chat.Service.TopicEdited.You.Mixed":"Chat.Service.TopicEdited.Mixed",p.push(_(e))):d?o=a?"Chat.Service.Group.TopicEdited.You.Icon.Removed":"Chat.Service.Group.TopicEdited.Icon.Removed":l?(o=a?"Chat.Service.Group.TopicEdited.You.Title":"Chat.Service.Group.TopicEdited.Title",p.push(s)):r?(o=a?"Chat.Service.Group.TopicEdited.You.Icon":"Chat.Service.Group.TopicEdited.Icon",p.push(t)):c&&(o=a?S.hidden?"Chat.Service.Group.TopicEdited.You.Hided":"Chat.Service.Group.TopicEdited.You.Unhided":S.hidden?"Chat.Service.Group.TopicEdited.Hided":"Chat.Service.Group.TopicEdited.Unhided");break}case"messageActionTopicCreate":p=[_(e)],o="TopicWasCreatedAction";break;case"messageActionSetChatTheme":{const e=!!h.pFlags.out;let t;e||(t=b(h.fromId,i)),p=t?[t]:[],S.emoticon?(p.push((0,u.Z)(S.emoticon)),o=e?"ChatThemeChangedYou":"ChatThemeChangedTo"):o=e?"ChatThemeDisabledYou":"ChatThemeDisabled";break}default:o=c.Hz[g]||`[${S._}]`}o||(o=c.Hz[g],void 0===o&&(o="["+g+"]"));const y=p&&(yield Promise.all(p));return i?c.ZP.format(o,!0,y):(0,c.$d)(w,o,y)}}))}},496:(e,t,i)=>{"use strict";i.d(t,{Z:()=>v});var s=i(8938),n=i(5705),a=i(677),o=i(3738),r=i(8456),d=i(5381),l=i(2325),c=i(6535),h=i(1346),u=i(8115),p=i(2491),f=i(5400),m=i(3512),g=i(6239);function v(e){var t,i,v,b,y,w;return v=this,b=void 0,w=function*(){let{message:v,text:b,usingMids:y,plain:w,highlightWord:S,withoutMediaType:C}=e;null!=b||(b=v.message);const L=[];let E=!1;const I=(e,t)=>{if(e){if(void 0===t&&E)return;t=w?l.ZP.format(e,!0):(0,l.ag)(e)}if(w)L.push(t);else{const e=document.createElement("span");"string"==typeof t?e.innerHTML=t:e.append(t),L.push(e)}},M=m.Z.managers.appMessagesManager,P=(0,d.Z)(v);let Z=null!==(t=v.totalEntities)&&void 0!==t?t:v.entities;if(v.media&&!P){(0,s.Z)(v);let e=!0;if(v.grouped_id){if(y){const t=yield M.getMidsByMessage(v);if(y.length===t.length){for(const i of t)if(!y.includes(i)){e=!1;break}}else e=!1}if(e){const e=yield M.getAlbumText(v.grouped_id);b=(null==e?void 0:e.message)||"",Z=(null==e?void 0:e.totalEntities)||[],C||(I("AttachAlbum"),E=!0)}}else e=!1;if(!e&&!C||!b){const e=v.media;switch(e._){case"messageMediaPhoto":I("AttachPhoto");break;case"messageMediaDice":I(void 0,w?e.emoticon:(0,u.Z)(e.emoticon));break;case"messageMediaVenue":b=e.title,I("AttachLocation");break;case"messageMediaGeo":I("AttachLocation");break;case"messageMediaGeoLive":I("AttachLiveLocation");break;case"messageMediaPoll":const t="๐Ÿ“Š "+(e.poll.question||"poll");I(void 0,w?t:(0,u.Z)(t));break;case"messageMediaContact":I("AttachContact");break;case"messageMediaGame":{const t="๐ŸŽฎ "+e.game.title;I(void 0,w?t:(0,u.Z)(t));break}case"messageMediaDocument":{const t=e.document;if("video"===t.type)I("AttachVideo");else if("voice"===t.type)I("AttachAudio");else if("gif"===t.type)I("AttachGif");else if("round"===t.type)I("AttachRound");else if("sticker"===t.type){const e=L.length;if(t.stickerEmojiRaw){const e=t.stickerEmojiRaw+" ";I(void 0,w?e:(0,u.Z)(e))}I("AttachSticker");const i=L.splice(e,2);if(w)L.push(i[0]+(i[1]?i[1]:""));else{const e=window.document.createElement("span");e.append(...i),L.push(e)}b=""}else if("audio"===t.type){const e=t.attributes.find((e=>"documentAttributeAudio"===e._&&(e.title||e.performer))),i="๐ŸŽต "+(e?[e.title,e.performer].filter(Boolean).join(" - "):t.file_name);I(void 0,w?i:(0,u.Z)(i))}else I(void 0,w?t.file_name:(0,u.Z)(t.file_name));break}case"messageMediaInvoice":"messageExtendedMediaPreview"===(null===(i=e.extended_media)||void 0===i?void 0:i._)?I(void 0,w?e.description:(0,u.Z)(e.description)):I(void 0,w?e.title:(0,u.Z)(e.title));break;case"messageMediaUnsupported":I(l.nK)}}const t=L.length;for(let e=1;e{"use strict";i.d(t,{Z:()=>n});var s=i(8842);function n(e){return t=this,i=void 0,a=function*(){const t=new s.Z;return yield t.update(e),t.element},new((n=void 0)||(n=Promise))((function(e,s){function o(e){try{d(a.next(e))}catch(e){s(e)}}function r(e){try{d(a.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(t,i||[])).next())}));var t,i,n,a}},9492:(e,t,i)=>{"use strict";i.d(t,{Z:()=>v});var s=i(2830),n=i(4755),a=i(3512),o=i(3442),r=i(6705),d=i(8580),l=i(1713),c=i(7030),h=i(2312),u=i(3114),p=i(7660),f=i(319),m=i(1507),g=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function v({photo:e,message:t,container:i,boxWidth:b,boxHeight:y,withTail:w,isOut:S,lazyLoadQueue:C,middleware:L,size:E,withoutPreloader:I,loadPromises:M,autoDownloadSize:P,noBlur:Z,noThumb:T,noFadeIn:k,blurAfter:x,managers:A=a.Z.managers,processUrl:_}){return g(this,void 0,void 0,(function*(){const F={loadPromises:{thumb:Promise.resolve(),full:Promise.resolve()},images:{thumb:null,full:null},preloader:null,aspecter:null},D="document"===e._,R=D&&e.mime_type.startsWith("image/")&&!E,B=(0,u.Z)(e);if(!(e.sizes||e.thumbs||B||R))return b&&y&&!E&&D&&(0,l.Z)(e,i,b,y,void 0,t),F;let N=0===P;E||(void 0===b&&(b=n.Z.active.regular.width),void 0===y&&(y=n.Z.active.regular.height)),i.classList.add("media-container");let O,U,H,z=i,j=!0,G=Promise.resolve();if(b&&y&&!E){const s=(0,l.Z)(e,i,b,y,void 0,t,void 0,R?{_:"photoSize",w:e.w,h:e.h,size:e.size,type:m.Pt}:void 0);if(E=s.photoSize,j=s.isFit,U=yield A.thumbsStorage.getCacheContext(e,E.type),!j&&!B){z=document.createElement("div"),z.classList.add("media-container-aspecter"),z.style.width=s.size.width+"px",z.style.height=s.size.height+"px";const n=(0,d.Z)(e,U,!Z,!0);if(n){G=n.loadPromise;const e=n.image;e.classList.add("media-photo"),i.append(e)}else(yield v({container:i,message:t,photo:e,boxWidth:0,boxHeight:0,size:E,lazyLoadQueue:C,isOut:S,loadPromises:M,middleware:L,withoutPreloader:I,withTail:w,autoDownloadSize:P,noBlur:Z,noThumb:!0,blurAfter:!0,managers:A})).images.full.classList.add("media-photo","thumbnail");i.classList.add("media-container-fitted"),i.append(z)}}else E||(E=(0,c.Z)(e,b,y,!0)),U=yield A.thumbsStorage.getCacheContext(e,null==E?void 0:E.type);if(!T&&!B){const t=(0,d.Z)(e,U,!Z);t&&(G=Promise.all([G,t.loadPromise]),F.loadPromises.thumb=F.loadPromises.full=G,O=F.images.thumb=t.image,O.classList.add("media-photo"),z.append(O))}if(F.aspecter=z,"photoSizeEmpty"===(null==E?void 0:E._)&&D||(null==E?void 0:E.bytes))return F;"videoSize"===(null==E?void 0:E._)?(H=F.images.full=(0,p.Z)(),H.autoplay=!0,H.loop=!0,H.muted=!0,H.classList.add("media-photo")):(H=F.images.full=new Image,H.classList.add("media-photo"));const V=(O||!U.downloaded)&&a.Z.settings.animationsEnabled&&!k;let K;const W=null==t?void 0:t.uploadingFileName;I||(U.downloaded&&!W||(K=new o.Z({attachMethod:"prepend",isUpload:!!W})),W&&(K.attachPromise(h.Z.getUpload(W)),K.attach(i),N=void 0));const $=e=>(0,s.Z)(i,H,e,V,z,O),q=e=>g(this,void 0,void 0,(function*(){if(!L||L()){if(_&&(e=yield _(e)),x){const t=(0,r.Z)(e,12);return t.promise.then((()=>$(t.canvas.toDataURL())))}return $(e)}}));let Q;const Y=E.w>=150&&E.h>=150||N,X=()=>g(this,void 0,void 0,(function*(){N&&!I&&K&&(K.construct(),K.setManual());const t=(()=>{const t=R&&!E;return h.Z.downloadMediaURL({media:e,thumb:E,queueId:null==C?void 0:C.queueId,onlyCache:t?void 0:N})})(),s=yield A.thumbsStorage.getCacheContext(e,null==E?void 0:E.type);K&&!s.downloaded&&!I&&Y&&K.attach(i,!1,t),N=void 0;const n=t.then(q);return n.catch(f.Z),{download:t,render:n}}));return K&&K.setDownloadFunction(X),U.downloaded?G=Q=(yield X()).render:C?C.push({div:i,load:()=>X().then((({download:e})=>e))}):Q=(yield X()).render,M&&G&&M.push(G),yield G,F.loadPromises.thumb=G,F.loadPromises.full=Q||Promise.resolve(),F.preloader=K,F}))}},5671:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(2291),n=i(2325),a=i(3512),o=i(7362);function r(e){return t=this,i=void 0,d=function*(){const t=document.createElement("span");t.classList.add("sender-title");const i=e.fromId===a.Z.myId&&e.peerId!==a.Z.myId;if(t.append(i?(0,n.ag)("FromYou"):yield(0,o.Z)(Object.assign(Object.assign({},(0,s.Z)(e)),{dialog:e.peerId===a.Z.myId}))),(yield a.Z.managers.appPeersManager.isAnyGroup(e.peerId))||i){const i=yield(0,o.Z)({peerId:e.peerId});t.append(" โž ",i)}return t},new((r=void 0)||(r=Promise))((function(e,s){function n(e){try{o(d.next(e))}catch(e){s(e)}}function a(e){try{o(d.throw(e))}catch(e){s(e)}}function o(t){var i;t.done?e(t.value):(i=t.value,i instanceof r?i:new r((function(e){e(i)}))).then(n,a)}o((d=d.apply(t,i||[])).next())}));var t,i,r,d}},1604:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(632);function n(e){const t=document.createElement("span");return t.classList.add("sent-time"),t.append((0,s.zM)(new Date(1e3*e.date))),t}},3541:(e,t,i)=>{"use strict";i.d(t,{Vp:()=>F,ZP:()=>N,_2:()=>O,_i:()=>R});var s=i(5269),n=i(3725),a=i(3910),o=i(2738),r=i(7660),d=i(8497),l=i(6740),c=i(1046),h=i(1185),u=i(5471),p=i(9405),f=i(4755),m=i(925),g=i(3174),v=i(6724),b=i(9674),y=i(2312),w=i(9322),S=i(2790),C=i(7030),L=i(13),E=i(1447),I=i(3512),M=i(7730),P=i(671),Z=i(5814),T=i(6787),k=i(2796),x=i(6775),A=i(645),_=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const F=1.49,D={},R={},B=(e,t,i)=>{const s=()=>{e.removeEventListener("animationend",s),t(),clearTimeout(n)};e.addEventListener("animationend",s);const n=setTimeout(s,i)};function N({doc:e,div:t,middleware:i,loadStickerMiddleware:d,lazyLoadQueue:m,exportLoad:v,group:w,play:S,onlyThumb:N,emoji:O,width:U,height:H,withThumb:z,loop:j,loadPromises:G,needFadeIn:V,needUpscale:K,skipRatio:W,static:$,managers:q=I.Z.managers,fullThumb:Q,isOut:Y,noPremium:X,withLock:J,relativeEffect:ee,loopEffect:te,isCustomEmoji:ie,syncedVideo:se}){var ne;return _(this,void 0,void 0,(function*(){t=Array.isArray(t)?t:[t],ie&&(O=e.stickerEmojiRaw);const ae=e.sticker;if(1===ae&&($=!0),!U&&!H){const t=f.Z.active,i=O?t.emojiSticker:e.animated?t.animatedSticker:t.staticSticker,s=(0,p.C)(e.w,e.h).aspectFitted(i);U=s.width,H=s.height}let oe;2===ae&&E.Z.loadLottieWorkers(),t.forEach((t=>{t.dataset.docId=""+e.id,O&&(t.dataset.stickerEmoji=O),t.classList.add("media-sticker-wrapper")}));const re=(t=(null==oe?void 0:oe.type))=>_(this,void 0,void 0,(function*(){return oe=yield q.thumbsStorage.getCacheContext(e,t)})),de=!$&&(2===ae||3===ae),le=(0,L.Z)(e);void 0!==Y&&le&&!Y&&t.forEach((e=>e.classList.add("reflect-x")));const ce=le&&J;if(ce){const i=D[e.id];t.forEach((e=>{e.classList.add("is-premium-sticker","tgico-premium_lock"),i&&e.style.setProperty("--lock-url",`url(${i})`)}))}if($&&1!==ae){const t=(0,C.Z)(e,U,H,!1);yield re(t.type)}else yield re(null==Q?void 0:Q.type);const he=O&&!ie?(0,P.tB)(O):-1,ue=oe.downloaded&&!V,pe=de,fe=2===ae||3===ae?yield q.appDocsManager.getLottieCachedThumb(e.id,he):void 0,me={render:void 0,load:void 0};let ge=(0,n.Z)(),ve=!1;if(((null===(ne=e.thumbs)||void 0===ne?void 0:ne.length)||fe)&&!t[0].firstElementChild&&(!ue||pe||N)&&!1!==z){let n=fe||e.thumbs[0];const a=(e,t)=>{e.childElementCount?ge.resolve():b.Z.mutateElement(e,(()=>{e.childElementCount||(t.classList.add("media-sticker","thumbnail"),e.append(t)),ge.resolve()}))};if("url"in n)ve=!0,t.forEach((e=>{const t=new Image;(0,l.ZP)(t,n.url,(()=>a(e,t)))}));else if("bytes"in n){if("photoPathSize"===n._){n.bytes.length||(n=e.thumbs.find((e=>{var t;return null===(t=e.bytes)||void 0===t?void 0:t.length}))||n);const i=function(e){let t="M";for(let i=0,s=e.length;i=192?t+="AACAAAAHAAALMAAAQASTAVAAAZaacaaaahaaalmaaaqastava.az0123456789-,"[s-128-64]:(s>=128?t+=",":s>=64&&(t+="-"),t+=""+(63&s))}return t+="z",t}(n.bytes),s="http://www.w3.org/2000/svg",a=document.createElementNS(s,"svg");a.classList.add("rlottie-vector","media-sticker","thumbnail"),a.setAttributeNS(null,"viewBox",`0 0 ${e.w||512} ${e.h||512}`);const o=document.createElementNS(s,"path");o.setAttributeNS(null,"d",i),I.Z.settings.animationsEnabled&&!ie&&o.setAttributeNS(null,"fill","url(#g)"),a.append(o),t.forEach(((e,t)=>e.append(t>0?a.cloneNode(!0):a))),ve=!0,ge.resolve()}else if(he<=0){const o=()=>{t.forEach((t=>{const i=new Image,s=(0,h.Z)(e,n,!0);(0,l.ZP)(i,s,(()=>a(t,i)))}))};s.Z||e.pFlags.stickerThumbConverted||oe.url?(ve=!0,o()):(ve=!0,M.Z.convert("main-"+e.id,n.bytes).then((s=>{q.appDocsManager.saveWebPConvertedStrippedThumb(e.id,s),n.bytes=s,e.pFlags.stickerThumbConverted=!0,i&&!i()||t[0].childElementCount?ge.resolve():o()})).catch((()=>ge.resolve())))}}else if((2===ae&&he<=0||3===ae)&&(z||N)){const s=()=>_(this,void 0,void 0,(function*(){if(t[0].childElementCount||i&&!i())return void ge.resolve();const s=(e,t,s)=>{e.childElementCount||i&&!i()?ge.resolve():s?(0,l.ZP)(t,s,(()=>a(e,t))):a(e,t)};yield re(),t.forEach((t=>{if(oe.url)s(t,new Image,oe.url);else if("bytes"in n){const i=(0,c.Z)(e,n,!0);i.loadPromise.then((()=>s(t,i.image,"")))}else y.Z.downloadMediaURL({media:e,thumb:n}).then((e=>_(this,void 0,void 0,(function*(){return s(t,new Image,e)}))))}))}));if(m&&N)return m.push({div:t[0],load:s}),ge.resolve(),me;s(),n.url&&(ve=!0)}}if(G&&ve&&G.push(ge),N)return me;const be=(0,u.Z)("MIDDLEWARE"),ye=()=>_(this,void 0,void 0,(function*(){if(i&&!i())throw be;if(2===ae&&!$){const s=yield y.Z.downloadMedia({media:e,queueId:null==m?void 0:m.queueId,thumb:Q});if(i&&!i())throw be;const n=yield E.Z.loadAnimationWorker({container:t[0],loop:!(O&&!ie)&&j,autoplay:S,animationData:s,width:U,height:H,name:"doc"+e.id,needUpscale:K,skipRatio:W,toneIndex:he,sync:ie,middleware:null!=d?d:i,group:w}),a=ce?()=>{var i,s;const a=null!==(i=D[s=e.id])&&void 0!==i?i:D[s]=function(e){var t;const i=e.getContext("2d"),s=20*(null!==(t=e.dpr)&&void 0!==t?t:1),n=s,a=s,o=(e.width-n)/2,r=e.height-a-0,d=i.getImageData(o,r,n,a).data;let l=0,c=0,h=0,u=0;for(let e=0;ee.style.setProperty("--lock-url",`url(${a})`)))}:void 0,o=(e,t)=>{const i=e.firstElementChild!==t&&e.firstElementChild;!1!==V&&(V=(V||!i||"svg"===i.tagName)&&I.Z.settings.animationsEnabled);const s=()=>{i&&i!==t&&"DIV"!==i.tagName&&i.remove()};V?b.Z.mutate((()=>{t&&t.classList.add("fade-in"),i&&i.classList.add("fade-out"),B(t||i,(()=>{b.Z.mutate((()=>{t&&t.classList.remove("fade-in"),s()}))}),400)})):i&&b.Z.mutate(s)};return n.addEventListener("firstFrame",(()=>{const i=n.canvas[0];(!1!==z||ie)&&(0,g.O)(e,i,he),ce&&a(),ie||t.forEach(((e,t)=>{o(e,n.canvas[t])}))}),{once:!0}),O&&q.appStickersManager.preloadAnimatedEmojiStickerAnimation(O),n}if($||3===ae){const s=de&&se,n=s?A.Z.generateName(""+e.id,0,0,void 0,void 0):void 0,a=R[n];if(a)return a;const o=(s?t.slice(0,1):t).map((()=>{let e;if($)e=new Image;else{const t=e=(0,r.Z)();if(t.muted=!0,S&&(t.autoplay=!0),j&&(t.loop=!0),j&&"number"==typeof j){let i=0,s=0;function n(){i>this.currentTime&&++s===j&&(this.autoplay=!1,this.loop=!1,this.pause(),t.removeEventListener("timeupdate",n)),i=this.currentTime}t.addEventListener("timeupdate",n)}}return e.classList.add("media-sticker"),e})),c=t.map(((e,t)=>e.firstElementChild!==o[t]&&e.firstElementChild));!1!==V&&(V=(V||!ue||($?c[0]:!c[0]||"svg"===c[0].tagName))&&I.Z.settings.animationsEnabled),V&&o.forEach((e=>e.classList.add("fade-in")));const h=new Promise(((n,a)=>_(this,void 0,void 0,(function*(){const r=()=>_(this,void 0,void 0,(function*(){if(i&&!i())return void a(be);const r=o.length,d=[];let h;yield re(),t.forEach(((t,u)=>{const p=o[u];p&&(h=(0,l.cj)(p,oe.url)),h.then((()=>((t,o,l)=>{b.Z.mutateElement(t,(()=>{if(!i||i())if(o){if(o){const t=U*window.devicePixelRatio,i=H*window.devicePixelRatio;if(!(0,g.k)(e,he,t,i)){const s=document.createElement("canvas");s.width=t,s.height=i,s.getContext("2d").drawImage(o,0,0,s.width,s.height),(0,g.O)(e,s,he)}}s?n(o):(t.append(o),V?(l&&l.classList.add("fade-out"),B(o,(()=>{o.classList.remove("fade-in"),null==l||l.remove()}),400)):null==l||l.remove(),de&&Z.Z.addAnimation(o,w,void 0,i),d.push(o)===r&&n(d))}else s&&de||null==l||l.remove();else a(be)}))})(t,p,c[u])))}))}));if(yield re(),oe.url)r();else{let t;if(1!==ae&&$){const i=(0,C.Z)(e,U,H,!1);t=y.Z.downloadMediaURL({media:e,thumb:i,queueId:null==m?void 0:m.queueId})}else t=y.Z.downloadMediaURL({media:e,queueId:null==m?void 0:m.queueId});t.then(r,a)}}))));return n&&(R[n]=h,d&&h.finally((()=>{d()||delete R[n]}))),h}}));if(v&&(1===v&&(!ue||de)||2===v))return me.load=ye,me;const we=!m||ue&&!de?ye():(m.push({div:t[0],load:ye}),Promise.resolve());return ue&&$&&(ge=we,G&&G.push(ge)),2===ae&&le&&void 0!==Y&&!X&&function({container:e,doc:t,managers:i,middleware:s,isOut:n,width:r,loadPromise:d,relativeEffect:l,loopEffect:c}){i.appStickersManager.preloadSticker(t.id,!0);let h=!1;(0,o.fc)(e,(i=>_(this,void 0,void 0,(function*(){if((0,a.Z)(i),h){const e=document.createElement("a");return e.onclick=()=>{(0,k.PE)(),new T.Z(t.stickerSetInput).show()},void(0,k.bC)({langPackKey:"Sticker.Premium.Click.Info",langPackArguments:[e]})}h=!0,yield d;const{animationDiv:o,stickerPromise:u}=(0,x.Z)({doc:t,middleware:s,side:n?"right":"left",size:r*F,target:e,play:!0,fullThumb:(0,L.Z)(t),relativeEffect:l,loopEffect:c});void 0===n||n||o.classList.add("reflect-x"),u.then((e=>{e.addEventListener("destroy",(()=>{h=!1}))}))}))))}({container:t[0],doc:e,managers:q,middleware:i,isOut:Y,width:U,loadPromise:we,relativeEffect:ee,loopEffect:te}),me.render=we,me}))}function O({event:e,container:t,managers:i,peerId:s,middleware:n}){var o,r;return _(this,void 0,void 0,(function*(){(0,a.Z)(e);const l=(0,d.Z)(t,"bubble"),c=t.dataset.stickerEmoji,h=t.classList.contains("custom-emoji")?void 0:E.Z.getAnimation(t);if(null==h?void 0:h.paused){const e=yield i.appStickersManager.getAnimatedEmojiSoundDocument(c);if(e){const i=document.createElement("audio");i.style.display="none",t.parentElement.append(i);try{const t=yield y.Z.downloadMediaURL({media:e});i.src=t,i.play(),yield(0,m.Z)(i,void 0,!0),i.addEventListener("ended",(()=>{i.src="",i.remove()}),{once:!0})}catch(e){}}h.autoplay=!0,h.restart()}if(!s.isUser())return;const u=yield i.appStickersManager.getAnimatedEmojiSticker(c,!0);if(!u)return;const p=null!==(o=(r=t).emojiData)&&void 0!==o?o:r.emojiData={a:[],v:1},f=t.sendInteractionThrottled=(0,v.Z)((()=>{if(!p.a.length)return;const e=p.a[0].t;p.a.forEach((t=>{t.t=(t.t-e)/1e3}));const s=(0,d.Z)(t,"bubble");i.appMessagesManager.setTyping(w.ZP.chat.peerId,{_:"sendMessageEmojiInteraction",msg_id:(0,S.Z)(+s.dataset.mid),emoticon:c,interaction:{_:"dataJSON",data:JSON.stringify(p)}},!0,w.ZP.chat.threadId),p.a.length=0}),1e3,!1),g=l?l.classList.contains("is-out"):void 0,{animationDiv:b}=(0,x.Z)({doc:u,middleware:n,side:g?"right":"left",size:360,target:t,play:!0,withRandomOffset:!0});void 0===g||g||b.classList.add("reflect-x"),e.isTrusted&&(p.a.push({i:1,t:Date.now()}),f())}))}},6775:(e,t,i)=>{"use strict";i.d(t,{Z:()=>u});var s=i(2131),n=i(8938),a=i(8487),o=i(5471),r=i(3624),d=i(9966),l=i(241),c=i(9322),h=i(3541);function u({size:e,doc:t,middleware:i,target:u,side:p,skipRatio:f,play:m,managers:g,fullThumb:v,withRandomOffset:b,relativeEffect:y,loopEffect:w}){var S;const C=document.createElement("div");let L;C.classList.add("emoji-animation"),C.style.width=e+"px",C.style.height=e+"px";const E=()=>{I.clean(),null==L||L.remove(),C.remove(),c.ZP.chat.bubbles.scrollable.container.removeEventListener("scroll",x)},I=null!==(S=null==i?void 0:i.create())&&void 0!==S?S:(0,r.k)();i=I.get();const M=(0,h.ZP)({div:C,doc:t,middleware:i,withThumb:!1,needFadeIn:!1,loop:!!w,width:e,height:e,play:m,group:"none",skipRatio:f,managers:g,fullThumb:v}).then((({render:e})=>e)).then((e=>{if((0,n.Z)(e),!i())throw e.remove(),(0,o.Z)("MIDDLEWARE");return L=e,L.addEventListener("enterFrame",(e=>{(w||e!==L.maxFrame)&&(0,a.Z)(u)||E()})),s.Z&&L.addEventListener("firstFrame",(()=>{navigator.vibrate(100)}),{once:!0}),L})),P=e=>{const t=Math.random()*e*2;return t>e?-t%e:t},Z=b?P(16):0,T=b?P(4):0,k=()=>{if(!(0,a.Z)(u))return void E();const t=u.getBoundingClientRect(),i=t.width/200,s="center"===p?0:16*("right"===p?1:-1)*i,n="center"===p?0:0*i,o="right"===p?t.right:t.left,r=t.top,d=("center"===p?(t.width-e)/2:"right"===p?-e:0)+s+Z,c=(t.height-e)/2+n+T,h=o+d,f=r+c;f<=-e||f>=l.Z.height?E():y?("center"!==p?C.style[p]=-1*Math.abs(s)+"px":C.style.left=d+"px",C.style.top=c+"px"):(C.style.top=f+"px",C.style.left=h+"px")},x=(0,d.Z)(k);return c.ZP.chat.bubbles.scrollable.container.addEventListener("scroll",x),k(),y?(C.classList.add("is-relative"),u.parentElement.append(C)):c.ZP.emojiAnimationContainer.append(C),{animationDiv:C,stickerPromise:M}}},5772:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(3512),n=i(3541);function a(e){return t=this,i=void 0,o=function*(){const{emoji:t,div:i,managers:a=s.Z.managers}=e,o=yield a.appStickersManager.getAnimatedEmojiSticker(t);if(!o)throw i.classList.add("media-sticker-wrapper"),new Error("no sticker");return(0,n.ZP)(Object.assign({doc:o,play:!0,loop:!1},e))},new((a=void 0)||(a=Promise))((function(e,s){function n(e){try{d(o.next(e))}catch(e){s(e)}}function r(e){try{d(o.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof a?i:new a((function(e){e(i)}))).then(n,r)}d((o=o.apply(t,i||[])).next())}));var t,i,a,o}},1273:(e,t,i)=>{"use strict";i.d(t,{Z:()=>h});var s=i(7660),n=i(6740),a=i(2312),o=i(1447),r=i(3512),d=i(5814),l=i(3541),c=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function h({set:e,lazyLoadQueue:t,container:i,group:h,autoplay:u,width:p,height:f,managers:m=r.Z.managers,middleware:g}){var v;return c(this,void 0,void 0,(function*(){if(null===(v=e.thumbs)||void 0===v?void 0:v.length)return i.classList.add("media-sticker-wrapper"),void t.push({div:i,load:()=>c(this,void 0,void 0,(function*(){const t=yield m.appStickersManager.getStickerSetThumbDownloadOptions(e),r=a.Z.download(t);if(e.pFlags.animated&&!e.pFlags.videos)return r.then((t=>{o.Z.loadAnimationWorker({container:i,loop:!0,autoplay:u,animationData:t,width:p,height:f,needUpscale:!0,name:"setThumb"+e.id,group:h,middleware:g})}));{let t;return e.pFlags.videos?(t=(0,s.Z)(),t.autoplay=!0,t.muted=!0,t.loop=!0):t=new Image,t.classList.add("media-sticker"),r.then((s=>{(0,n.ZP)(t,URL.createObjectURL(s),(()=>{i.append(t),e.pFlags.videos&&d.Z.addAnimation(t,h)}))}))}}))});let r;r=e.thumb_document_id?m.appEmojiManager.getCustomEmojiDocument(e.thumb_document_id):m.appStickersManager.getStickerSet(e).then((e=>e.documents[0]));const b=yield r;"documentEmpty"!==b._&&(0,l.ZP)({doc:b,div:i,group:h,lazyLoadQueue:t,managers:m,width:p,height:f,middleware:g})}))}},62:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(3541);function n({doc:e,row:t,size:i,managers:n}){const a=t.media,o=t.createMedia("small");a&&o.classList.add("hide");const r=a?[]:void 0,d="small"===i?32:48,l=(0,s.ZP)({div:o,doc:e,width:d,height:d,loadPromises:r,managers:n}).then((({render:e})=>e));return r&&Promise.all(r).then((()=>{o.classList.remove("hide"),a.remove()})),l}},9102:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(2790),n=i(4497),a=i(7362);function o(e){return t=this,i=void 0,r=function*(){const{peerId:t,threadId:i,lastMsgId:o}=e,r=Promise.resolve(),d=(0,n.Z)("t.me/c/"+t.toChatId()+(i?"/"+(0,s.Z)(i):"")+(o?"/"+(0,s.Z)(o):""));return d.classList.add("topic-name","topic-name-button"),d.append(yield(0,a.Z)(e)),{cached:!0,element:d,loadPromise:r}},new((o=void 0)||(o=Promise))((function(e,s){function n(e){try{d(r.next(e))}catch(e){s(e)}}function a(e){try{d(r.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof o?i:new o((function(e){e(i)}))).then(n,a)}d((r=r.apply(t,i||[])).next())}));var t,i,o,r}},2887:(e,t,i)=>{"use strict";i.d(t,{Z:()=>x});var s=i(4762),n=i(5296),a=i(3725),o=i(3910),r=i(2738),d=i(7660),l=i(8487),c=i(6740),h=i(8580),u=i(5471),p=i(4755),f=i(319),m=i(925),g=i(3035),v=i(6724),b=i(9674),y=i(5157),w=i(2312),S=i(9322),C=i(1507),L=i(3512),E=i(5814),I=i(3013),M=i(8448),P=i(3442),Z=i(9492),T=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};let k=0;function x({doc:e,container:t,message:i,boxWidth:x,boxHeight:A,withTail:_,isOut:F,middleware:D,lazyLoadQueue:R,noInfo:B,group:N,onlyPreview:O,noPreview:U,withoutPreloader:H,loadPromises:z,noPlayButton:j,photoSize:G,videoSize:V,searchContext:K,autoDownload:W,managers:$=L.Z.managers,noAutoplayAttribute:q}){var Q;return T(this,void 0,void 0,(function*(){const Y=null==W?void 0:W.video;let X=0===Y;const J=!(x&&A),ee=("video"!==e.type||e.size<=52428800&&!J)&&("gif"===e.type?L.Z.settings.autoPlay.gifs:L.Z.settings.autoPlay.videos);let te,ie;if(!B){te=document.createElement("span"),te.classList.add("video-time"),t.append(te);let i=!1;"gif"!==e.type?(te.innerText=(0,y.Z)(e.duration,!1),j||"round"===e.type||(ee&&!X?te.classList.add("tgico","can-autoplay"):i=!0)):(te.innerText="GIF",ee||j||(i=!0,X=void 0)),i&&(ie=document.createElement("span"),ie.classList.add("video-play","tgico-largeplay","btn-circle","position-center"),t.append(ie))}const se={};if("image/gif"===e.mime_type){const s=yield(0,Z.Z)({photo:e,message:i,container:t,boxWidth:x,boxHeight:A,withTail:_,isOut:F,lazyLoadQueue:R,middleware:D,withoutPreloader:H,loadPromises:z,autoDownloadSize:Y,size:G,managers:$});return se.thumb=s,se.loadPromise=s.loadPromises.full,se}let ne;const ae=(0,d.Z)();if(ae.classList.add("media-video"),ae.muted=!0,"round"===e.type){const s=document.createElement("div");s.classList.add("media-round","z-depth-1"),s.dataset.mid=""+i.mid,s.dataset.peerId=""+i.peerId,s.message=i;const a=p.Z.active.round,d=a.width/2,c=3.5,h=d-2*c;s.innerHTML=`\n \n `;const u=s.firstElementChild.firstElementChild;k||(k=2*Math.PI*h),u.style.strokeDasharray=k+" "+k,u.style.strokeDashoffset=""+k,te.classList.add("tgico"),i.pFlags.media_unread&&s.classList.add("is-unread");const f=document.createElement("canvas");f.width=f.height=e.w,s.prepend(f,te),s.append(ae),t.append(s);const m=f.getContext("2d"),b=()=>{const e=s.message,t=I.Z.addMedia(e,!X),i=()=>{(S.ZP.chat.setPeerPromise||Promise.resolve()).finally((()=>{(0,l.Z)(t)||(t.removeEventListener("play",h),t.removeEventListener("timeupdate",c),t.removeEventListener("pause",p),t.removeEventListener("ended",b))}))},a=()=>{m.drawImage(t,0,0);const e=k-t.currentTime/t.duration*k;return u.style.strokeDashoffset=""+e,!t.paused},d=()=>{t.duration&&((0,l.Z)(t)?(t.paused&&a(),te.innerText=(0,y.Z)(t.duration-t.currentTime,!1)):i())},c=(0,v.Z)((()=>{(0,g.T2)(d)}),1e3,!1),h=()=>{ae.classList.add("hide"),s.classList.remove("is-paused"),(0,n.cK)(a,f),ne&&ne.preloader&&ne.preloader.classList.contains("manual")&&ne.onClick()},p=()=>{(0,l.Z)(t)?s.classList.add("is-paused"):i()},b=()=>{ae.classList.remove("hide"),s.classList.add("is-paused"),ae.currentTime=0,te.innerText=(0,y.Z)(t.duration,!1),t.currentTime&&(t.currentTime=0)};t.addEventListener("play",h),t.addEventListener("timeupdate",c),t.addEventListener("pause",p),t.addEventListener("ended",b),(0,r.fc)(f,(i=>{if((0,o.Z)(i),ne&&!ne.detached&&ne.onClick(),t.paused){const i=!!K;if(I.Z.setSearchContext(K||{peerId:C.NM,inputFilter:{_:"inputMessagesFilterEmpty"},useSearch:!1})){const[t,n]=i?(0,M.ns)(s,e.mid):[];I.Z.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?(a(),d(),ae.classList.add("hide")):p():h()};i.pFlags.is_outgoing?(s.onLoad=b,s.dataset.isOutgoing="1"):b()}else q||(ae.autoplay=!0);let oe,re;if(i){if(oe=yield(0,Z.Z)({photo:e,message:i,container:t,boxWidth:x,boxHeight:A,withTail:_,isOut:F,lazyLoadQueue:R,middleware:D,withoutPreloader:!0,loadPromises:z,autoDownloadSize:null==W?void 0:W.photo,size:G,managers:$}),se.thumb=oe,!ee&&"gif"!==e.type||O)return se.loadPromise=oe.loadPromises.full,se;if(_){const e=(oe.images.thumb||oe.images.full).parentElement;ae.width=+e.getAttributeNS(null,"width"),ae.height=+e.getAttributeNS(null,"height"),e.append(ae)}}else if(!U){const i=(0,h.Z)(e,{},!0);if(i){const e=i.image;e.classList.add("media-poster"),t.append(e),se.thumb={loadPromises:{thumb:i.loadPromise,full:Promise.resolve()},images:{thumb:e,full:null},preloader:null,aspecter:null},null==z||z.push(i.loadPromise),se.loadPromise=i.loadPromise}}if(O)return se;!ae.parentElement&&t&&((null==oe?void 0:oe.aspecter)||t).append(ae);const de=()=>T(this,void 0,void 0,(function*(){return re=yield $.thumbsStorage.getCacheContext(e,null==V?void 0:V.type)}));yield de();const le=null==i?void 0:i.uploadingFileName;le?(ne=new P.Z({attachMethod:"prepend",isUpload:!0}),ne.attachPromise(w.Z.getUpload(le)),ne.attach(t,!1),X=void 0):re.downloaded||e.supportsStreaming||H?e.supportsStreaming&&(ne=new P.Z({cancelable:!1,attachMethod:"prepend"})):ne=new P.Z({attachMethod:"prepend"});const ce=(0,a.Z)();if(ae.addEventListener("error",(e=>{4!==ae.error.code&&console.error("Error "+ae.error.code+"; details: "+ae.error.message),ne&&!le&&ne.detach(),ce.isFulfilled||ce.resolve()}),{once:!0}),"video"===e.type){const e=()=>{ae.duration&&(te.innerText=(0,y.Z)(ae.duration-ae.currentTime,!1))},t=(0,v.Z)((()=>{(0,g.T2)(e)}),1e3,!1);ae.addEventListener("timeupdate",t),ie&&ae.addEventListener("timeupdate",(()=>{b.Z.mutateElement(ie,(()=>{ie.remove()}))}),{once:!0})}ae.muted=!0,ae.loop=!0,q||(ae.autoplay=!0);let he=X&&(null===(Q=null==oe?void 0:oe.preloader)||void 0===Q?void 0:Q.loadFunc);const ue=()=>T(this,void 0,void 0,(function*(){ne&&X&&!H&&(ne.construct(),ne.setManual()),yield de();let n=Promise.resolve();if(ne&&!le||H)if(re.downloaded||e.supportsStreaming)e.supportsStreaming&&(X?n=Promise.reject((0,u.Z)("NO_AUTO_DOWNLOAD")):!re.downloaded&&ne&&(ne.attach(t,!1,null),ae.addEventListener(s.IS_SAFARI?"timeupdate":"canplay",(()=>{ne.detach()}),{once:!0})));else{const i=n=w.Z.downloadMediaURL({media:e,queueId:null==R?void 0:R.queueId,onlyCache:X,thumb:V});ne&&ne.attach(t,!1,i)}return!X&&he&&(he(),he=null),X=void 0,n.then((()=>T(this,void 0,void 0,(function*(){!D||D()?("round"===e.type&&I.Z.resolveWaitingForLoadMedia(i.peerId,i.mid,i.pFlags.is_scheduled),yield de(),(0,m.Z)(ae).then((()=>{N&&E.Z.addAnimation(ae,N),ne&&!le&&ne.detach(),ce.resolve()}),(e=>{console.error("video load error",e),te&&te.classList.add("is-error"),ce.reject(e)})),(0,c.ZP)(ae,re.url)):ce.resolve()}))),f.Z),{download:n,render:Promise.all([n,ce])}}));return ne&&!le&&ne.setDownloadFunction(ue),"gif"!==e.type||ee?se.loadPromise=R?(R.push({div:t,load:()=>ue().then((({render:e})=>e))}),Promise.resolve()):(yield ue()).render:(0,r.fc)(t,(e=>{(0,o.Z)(e),ie.remove(),ue()}),{capture:!0,once:!0}),se.thumb&&(yield se.thumb.loadPromises.thumb),se}))}p.Z.addEventListener("changeScreen",((e,t)=>{if(t===p._.mobile||e===p._.mobile){const e=Array.from(document.querySelectorAll(".media-round .progress-ring")),t=p.Z.active.round.width,i=t/2,s=i-7;k=2*Math.PI*s,e.forEach((e=>{e.setAttributeNS(null,"width",""+t),e.setAttributeNS(null,"height",""+t);const n=e.firstElementChild;n.setAttributeNS(null,"cx",""+i),n.setAttributeNS(null,"cy",""+i),n.setAttributeNS(null,"r",""+s),n.style.strokeDasharray=k+" "+k,n.style.strokeDashoffset=""+k}))}}))},2498:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(8456),n=i(5400);function a(e){const t=(0,s.Z)(e.description||"",150,180);return(0,n.ZP)(t)}},1336:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(8456),n=i(5400);function a(e){let t=e.title||e.author||e.site_name||"";return t=(0,s.Z)(t,80,100),(0,n.ZP)(t,{noLinks:!0,noLinebreaks:!0})}},7445:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});const s={AED:{code:"AED",title:"United Arab Emirates Dirham",symbol:"AED",native:"ุฏ.ุฅ.โ€",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"367",max_amount:"3673030"},AFN:{code:"AFN",title:"Afghan Afghani",symbol:"AFN",native:"ุ‹",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"8729",max_amount:"87299487"},ALL:{code:"ALL",title:"Albanian Lek",symbol:"ALL",native:"Lek",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!1,exp:2,min_amount:"11842",max_amount:"118421187"},AMD:{code:"AMD",title:"Armenian Dram",symbol:"AMD",native:"ีคึ€.",thousands_sep:",",decimal_sep:".",symbol_left:!1,space_between:!0,exp:2,min_amount:"40943",max_amount:"409436718"},ARS:{code:"ARS",title:"Argentine Peso",symbol:"ARS",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"14705",max_amount:"147059002"},AUD:{code:"AUD",title:"Australian Dollar",symbol:"AU$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"153",max_amount:"1536825"},AZN:{code:"AZN",title:"Azerbaijani Manat",symbol:"AZN",native:"ะผะฐะฝ.",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"169",max_amount:"1699858"},BAM:{code:"BAM",title:"Bosnia & Herzegovina Convertible Mark",symbol:"BAM",native:"KM",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"199",max_amount:"1990677"},BDT:{code:"BDT",title:"Bangladeshi Taka",symbol:"BDT",native:"เงณ",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"10009",max_amount:"100094046"},BGN:{code:"BGN",title:"Bulgarian Lev",symbol:"BGN",native:"ะปะฒ.",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"199",max_amount:"1993315"},BND:{code:"BND",title:"Brunei Dollar",symbol:"BND",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!1,exp:2,min_amount:"142",max_amount:"1421883"},BOB:{code:"BOB",title:"Bolivian Boliviano",symbol:"BOB",native:"Bs",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"683",max_amount:"6832607"},BRL:{code:"BRL",title:"Brazilian Real",symbol:"R$",native:"R$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"539",max_amount:"5397799"},BYN:{code:"BYN",title:"Belarusian ruble",symbol:"BYN",native:"BYN",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"249",max_amount:"2495801"},CAD:{code:"CAD",title:"Canadian Dollar",symbol:"CA$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"136",max_amount:"1366860"},CHF:{code:"CHF",title:"Swiss Franc",symbol:"CHF",native:"CHF",thousands_sep:"'",decimal_sep:".",symbol_left:!1,space_between:!0,exp:2,min_amount:"97",max_amount:"976705"},CLP:{code:"CLP",title:"Chilean Peso",symbol:"CLP",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:0,min_amount:"963",max_amount:"9637495"},CNY:{code:"CNY",title:"Chinese Renminbi Yuan",symbol:"CNยฅ",native:"CNยฅ",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"709",max_amount:"7094102"},COP:{code:"COP",title:"Colombian Peso",symbol:"COP",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"452870",max_amount:"4528700000"},CRC:{code:"CRC",title:"Costa Rican Colรณn",symbol:"CRC",native:"โ‚ก",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!1,exp:2,min_amount:"62506",max_amount:"625061070"},CZK:{code:"CZK",title:"Czech Koruna",symbol:"CZK",native:"Kฤ",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"2497",max_amount:"24975029"},DKK:{code:"DKK",title:"Danish Krone",symbol:"DKK",native:"kr",thousands_sep:"",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"755",max_amount:"7555990"},DOP:{code:"DOP",title:"Dominican Peso",symbol:"DOP",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"5275",max_amount:"52757308"},DZD:{code:"DZD",title:"Algerian Dinar",symbol:"DZD",native:"ุฏ.ุฌ.โ€",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"14035",max_amount:"140353307"},EGP:{code:"EGP",title:"Egyptian Pound",symbol:"EGP",native:"ุฌ.ู….โ€",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"1953",max_amount:"19537405"},ETB:{code:"ETB",title:"Ethiopian Birr",symbol:"ETB",native:"แ‰ฅแˆญ",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"5224",max_amount:"52247069"},EUR:{code:"EUR",title:"Euro",symbol:"โ‚ฌ",native:"โ‚ฌ",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"101",max_amount:"1016045"},GBP:{code:"GBP",title:"British Pound",symbol:"ยฃ",native:"ยฃ",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"89",max_amount:"894445"},GEL:{code:"GEL",title:"Georgian Lari",symbol:"GEL",native:"GEL",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"283",max_amount:"2830234"},GTQ:{code:"GTQ",title:"Guatemalan Quetzal",symbol:"GTQ",native:"Q",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"778",max_amount:"7781323"},HKD:{code:"HKD",title:"Hong Kong Dollar",symbol:"HK$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"784",max_amount:"7849750"},HNL:{code:"HNL",title:"Honduran Lempira",symbol:"HNL",native:"L",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"2441",max_amount:"24413729"},HRK:{code:"HRK",title:"Croatian Kuna",symbol:"HRK",native:"kn",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"764",max_amount:"7648805"},HUF:{code:"HUF",title:"Hungarian Forint",symbol:"HUF",native:"Ft",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"42685",max_amount:"426850229"},IDR:{code:"IDR",title:"Indonesian Rupiah",symbol:"IDR",native:"Rp",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!1,exp:2,min_amount:"1523370",max_amount:"15233700000"},ILS:{code:"ILS",title:"Israeli New Sheqel",symbol:"โ‚ช",native:"โ‚ช",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"354",max_amount:"3543350"},INR:{code:"INR",title:"Indian Rupee",symbol:"โ‚น",native:"โ‚น",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"8155",max_amount:"81555550"},ISK:{code:"ISK",title:"Icelandic Krรณna",symbol:"ISK",native:"kr",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:0,min_amount:"142",max_amount:"1425603"},JMD:{code:"JMD",title:"Jamaican Dollar",symbol:"JMD",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"15013",max_amount:"150131044"},JPY:{code:"JPY",title:"Japanese Yen",symbol:"ยฅ",native:"๏ฟฅ",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:0,min_amount:"144",max_amount:"1443065"},KES:{code:"KES",title:"Kenyan Shilling",symbol:"KES",native:"Ksh",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"12075",max_amount:"120750271"},KGS:{code:"KGS",title:"Kyrgyzstani Som",symbol:"KGS",native:"KGS",thousands_sep:" ",decimal_sep:"-",symbol_left:!1,space_between:!0,exp:2,min_amount:"8018",max_amount:"80182898"},KRW:{code:"KRW",title:"South Korean Won",symbol:"โ‚ฉ",native:"โ‚ฉ",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:0,min_amount:"1431",max_amount:"14315201"},KZT:{code:"KZT",title:"Kazakhstani Tenge",symbol:"KZT",native:"โ‚ธ",thousands_sep:" ",decimal_sep:"-",symbol_left:!0,space_between:!1,exp:2,min_amount:"47186",max_amount:"471867112"},LBP:{code:"LBP",title:"Lebanese Pound",symbol:"LBP",native:"ู„.ู„.โ€",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"150999",max_amount:"1509998778"},LKR:{code:"LKR",title:"Sri Lankan Rupee",symbol:"LKR",native:"เถปเท”.",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"35546",max_amount:"355469651"},MAD:{code:"MAD",title:"Moroccan Dirham",symbol:"MAD",native:"ุฏ.ู….โ€",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"1093",max_amount:"10938136"},MDL:{code:"MDL",title:"Moldovan Leu",symbol:"MDL",native:"MDL",thousands_sep:",",decimal_sep:".",symbol_left:!1,space_between:!0,exp:2,min_amount:"1926",max_amount:"19264439"},MNT:{code:"MNT",title:"Mongolian Tรถgrรถg",symbol:"MNT",native:"MNT",thousands_sep:" ",decimal_sep:",",symbol_left:!0,space_between:!1,exp:2,min_amount:"322444",max_amount:"3224442056"},MUR:{code:"MUR",title:"Mauritian Rupee",symbol:"MUR",native:"MUR",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"4453",max_amount:"44535174"},MVR:{code:"MVR",title:"Maldivian Rufiyaa",symbol:"MVR",native:"MVR",thousands_sep:",",decimal_sep:".",symbol_left:!1,space_between:!0,exp:2,min_amount:"1546",max_amount:"15460397"},MXN:{code:"MXN",title:"Mexican Peso",symbol:"MX$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"2012",max_amount:"20122860"},MYR:{code:"MYR",title:"Malaysian Ringgit",symbol:"MYR",native:"RM",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"463",max_amount:"4632502"},MZN:{code:"MZN",title:"Mozambican Metical",symbol:"MZN",native:"MTn",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"6382",max_amount:"63829729"},NGN:{code:"NGN",title:"Nigerian Naira",symbol:"NGN",native:"โ‚ฆ",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"43203",max_amount:"432039828"},NIO:{code:"NIO",title:"Nicaraguan Cรณrdoba",symbol:"NIO",native:"C$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"3556",max_amount:"35566412"},NOK:{code:"NOK",title:"Norwegian Krone",symbol:"NOK",native:"kr",thousands_sep:" ",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"1069",max_amount:"10690975"},NPR:{code:"NPR",title:"Nepalese Rupee",symbol:"NPR",native:"เคจเฅ‡เคฐเฅ‚",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"12954",max_amount:"129546657"},NZD:{code:"NZD",title:"New Zealand Dollar",symbol:"NZ$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"174",max_amount:"1746220"},PAB:{code:"PAB",title:"Panamanian Balboa",symbol:"PAB",native:"B/.",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"98",max_amount:"988722"},PEN:{code:"PEN",title:"Peruvian Nuevo Sol",symbol:"PEN",native:"S/.",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"390",max_amount:"3902208"},PHP:{code:"PHP",title:"Philippine Peso",symbol:"PHP",native:"โ‚ฑ",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"5862",max_amount:"58627496"},PKR:{code:"PKR",title:"Pakistani Rupee",symbol:"PKR",native:"โ‚จ",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"22642",max_amount:"226426805"},PLN:{code:"PLN",title:"Polish Zล‚oty",symbol:"PLN",native:"zล‚",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"493",max_amount:"4932350"},PYG:{code:"PYG",title:"Paraguayan Guaranรญ",symbol:"PYG",native:"โ‚ฒ",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:0,min_amount:"6977",max_amount:"69772317"},QAR:{code:"QAR",title:"Qatari Riyal",symbol:"QAR",native:"ุฑ.ู‚.โ€",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"364",max_amount:"3640989"},RON:{code:"RON",title:"Romanian Leu",symbol:"RON",native:"RON",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"502",max_amount:"5028645"},RSD:{code:"RSD",title:"Serbian Dinar",symbol:"RSD",native:"ะดะธะฝ.",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"11918",max_amount:"119184990"},RUB:{code:"RUB",title:"Russian Ruble",symbol:"RUB",native:"โ‚ฝ",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"7128",max_amount:"71281218"},SAR:{code:"SAR",title:"Saudi Riyal",symbol:"SAR",native:"ุฑ.ุณ.โ€",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"375",max_amount:"3756546"},SEK:{code:"SEK",title:"Swedish Krona",symbol:"SEK",native:"kr",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"1109",max_amount:"11094972"},SGD:{code:"SGD",title:"Singapore Dollar",symbol:"SGD",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"143",max_amount:"1430495"},THB:{code:"THB",title:"Thai Baht",symbol:"เธฟ",native:"เธฟ",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"3780",max_amount:"37800497"},TJS:{code:"TJS",title:"Tajikistani Somoni",symbol:"TJS",native:"TJS",thousands_sep:" ",decimal_sep:";",symbol_left:!1,space_between:!0,exp:2,min_amount:"975",max_amount:"9753854"},TRY:{code:"TRY",title:"Turkish Lira",symbol:"TRY",native:"TL",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"1854",max_amount:"18543598"},TTD:{code:"TTD",title:"Trinidad and Tobago Dollar",symbol:"TTD",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"672",max_amount:"6722681"},TWD:{code:"TWD",title:"New Taiwan Dollar",symbol:"NT$",native:"NT$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"3173",max_amount:"31738502"},TZS:{code:"TZS",title:"Tanzanian Shilling",symbol:"TZS",native:"TSh",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"233199",max_amount:"2331999890"},UAH:{code:"UAH",title:"Ukrainian Hryvnia",symbol:"UAH",native:"โ‚ด",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!1,exp:2,min_amount:"3633",max_amount:"36338830"},UGX:{code:"UGX",title:"Ugandan Shilling",symbol:"UGX",native:"USh",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:0,min_amount:"3816",max_amount:"38166726"},USD:{code:"USD",title:"United States Dollar",symbol:"$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"100",max_amount:1e6},UYU:{code:"UYU",title:"Uruguayan Peso",symbol:"UYU",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"4080",max_amount:"40801205"},UZS:{code:"UZS",title:"Uzbekistani Som",symbol:"UZS",native:"UZS",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"1089058",max_amount:"10890583014"},VND:{code:"VND",title:"Vietnamese ฤแป“ng",symbol:"โ‚ซ",native:"โ‚ซ",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:0,min_amount:"23862",max_amount:"238625000"},YER:{code:"YER",title:"Yemeni Rial",symbol:"YER",native:"ุฑ.ูŠ.โ€",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"25030",max_amount:"250300677"},ZAR:{code:"ZAR",title:"South African Rand",symbol:"ZAR",native:"R",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"1789",max_amount:"17894299"}}},3447:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a,i:()=>s});const s={14:{"1f6dd":4867,"1f6de":4916,"1f6df":4923,"1f7f0":62832,"1f979":183,"1f9cc":1557,"1fa7b":61332,"1fa7c":61330,"1faa9":51093,"1faaa":61364,"1faab":61189,"1faac":51085,"1fab7":2651,"1fab8":2631,"1fab9":2672,"1faba":2673,"1fac3":1520,"1fac4":1521,"1fac5":1505,"1fad7":3793,"1fad8":3707,"1fad9":3804,"1fae0":111,"1fae1":136,"1fae2":132,"1fae3":133,"1fae4":174,"1fae5":142,"1fae6":1385,"1fae7":61353,"1faf0":1341,"1faf1":1332,"1faf2":1333,"1faf3":1334,"1faf4":1335,"1faf5":1351,"1faf6":1360,"1faf1-1f3fb-200d-1faf2-1f3fc":0,"1faf1-1f3fb-200d-1faf2-1f3fd":0,"1faf1-1f3fb-200d-1faf2-1f3fe":0,"1faf1-1f3fb-200d-1faf2-1f3ff":0,"1faf1-1f3fc-200d-1faf2-1f3fb":0,"1faf1-1f3fc-200d-1faf2-1f3fd":0,"1faf1-1f3fc-200d-1faf2-1f3fe":0,"1faf1-1f3fc-200d-1faf2-1f3ff":0,"1faf1-1f3fd-200d-1faf2-1f3fb":0,"1faf1-1f3fd-200d-1faf2-1f3fc":0,"1faf1-1f3fd-200d-1faf2-1f3fe":0,"1faf1-1f3fd-200d-1faf2-1f3ff":0,"1faf1-1f3fe-200d-1faf2-1f3fb":0,"1faf1-1f3fe-200d-1faf2-1f3fc":0,"1faf1-1f3fe-200d-1faf2-1f3fd":0,"1faf1-1f3fe-200d-1faf2-1f3ff":0,"1faf1-1f3ff-200d-1faf2-1f3fb":0,"1faf1-1f3ff-200d-1faf2-1f3fc":0,"1faf1-1f3ff-200d-1faf2-1f3fd":0,"1faf1-1f3ff-200d-1faf2-1f3fe":0,"1fac3-1f3fb":0,"1fac3-1f3fc":0,"1fac3-1f3fd":0,"1fac3-1f3fe":0,"1fac3-1f3ff":0,"1fac4-1f3fb":0,"1fac4-1f3fc":0,"1fac4-1f3fd":0,"1fac4-1f3fe":0,"1fac4-1f3ff":0,"1fac5-1f3fb":0,"1fac5-1f3fc":0,"1fac5-1f3fd":0,"1fac5-1f3fe":0,"1fac5-1f3ff":0,"1faf0-1f3fb":0,"1faf0-1f3fc":0,"1faf0-1f3fd":0,"1faf0-1f3fe":0,"1faf0-1f3ff":0,"1faf1-1f3fb":0,"1faf1-1f3fc":0,"1faf1-1f3fd":0,"1faf1-1f3fe":0,"1faf1-1f3ff":0,"1faf2-1f3fb":0,"1faf2-1f3fc":0,"1faf2-1f3fd":0,"1faf2-1f3fe":0,"1faf2-1f3ff":0,"1faf3-1f3fb":0,"1faf3-1f3fc":0,"1faf3-1f3fd":0,"1faf3-1f3fe":0,"1faf3-1f3ff":0,"1faf4-1f3fb":0,"1faf4-1f3fc":0,"1faf4-1f3fd":0,"1faf4-1f3fe":0,"1faf4-1f3ff":0,"1faf5-1f3fb":0,"1faf5-1f3fc":0,"1faf5-1f3fd":0,"1faf5-1f3fe":0,"1faf5-1f3ff":0,"1faf6-1f3fb":0,"1faf6-1f3fc":0,"1faf6-1f3fd":0,"1faf6-1f3fe":0,"1faf6-1f3ff":0},"":{2049:62835,2122:62863,2139:62888,2194:62764,2195:62763,2196:62762,2197:62756,2198:62758,2199:62760,2328:61194,2600:4990,2601:4998,2602:41013,2603:41018,2604:41020,2611:62851,2614:41014,2615:3781,2618:2667,2620:1106,2622:62753,2623:62754,2626:62783,2638:62780,2639:177,2648:62788,2649:62789,2650:62796,2651:62797,2652:62798,2653:62799,2660:51095,2663:51098,2665:51096,2666:51097,2668:4865,2692:61297,2693:4922,2694:61300,2696:61311,2697:61319,2699:61309,2702:61284,2705:62850,2708:4931,2709:61245,2712:61259,2714:62852,2716:62828,2721:62779,2728:51029,2733:62858,2734:62859,2744:41017,2747:62860,2753:62836,2754:62837,2755:62838,2757:62839,2763:1137,2764:1141,2795:62829,2796:62830,2797:62831,2934:62767,2935:62768,3030:62840,3297:62912,3299:62913,"0023-20e3":62864,"002a-20e3":62865,"0030-20e3":62866,"0031-20e3":62867,"0032-20e3":62868,"0033-20e3":62869,"0034-20e3":62870,"0035-20e3":62871,"0036-20e3":62872,"0037-20e3":62873,"0038-20e3":62874,"0039-20e3":62875,"00a9":62861,"00ae":62862,"1f004":51101,"1f0cf":51100,"1f170":62882,"1f171":62884,"1f17e":62893,"1f17f":62895,"1f18e":62883,"1f191":62885,"1f192":62886,"1f193":62887,"1f194":62889,"1f195":62891,"1f196":62892,"1f197":62894,"1f198":62896,"1f199":62897,"1f19a":62898,"1f1e6-1f1e8":71594,"1f1e6-1f1e9":71595,"1f1e6-1f1ea":71596,"1f1e6-1f1eb":71597,"1f1e6-1f1ec":71598,"1f1e6-1f1ee":71599,"1f1e6-1f1f1":71600,"1f1e6-1f1f2":71601,"1f1e6-1f1f4":71602,"1f1e6-1f1f6":71603,"1f1e6-1f1f7":71604,"1f1e6-1f1f8":71605,"1f1e6-1f1f9":71606,"1f1e6-1f1fa":71607,"1f1e6-1f1fc":71608,"1f1e6-1f1fd":71609,"1f1e6-1f1ff":71610,"1f1e7-1f1e6":71611,"1f1e7-1f1e7":71612,"1f1e7-1f1e9":71613,"1f1e7-1f1ea":71614,"1f1e7-1f1eb":71615,"1f1e7-1f1ec":71616,"1f1e7-1f1ed":71617,"1f1e7-1f1ee":71618,"1f1e7-1f1ef":71619,"1f1e7-1f1f1":71620,"1f1e7-1f1f2":71621,"1f1e7-1f1f3":71622,"1f1e7-1f1f4":71623,"1f1e7-1f1f6":71624,"1f1e7-1f1f7":71625,"1f1e7-1f1f8":71626,"1f1e7-1f1f9":71627,"1f1e7-1f1fb":71628,"1f1e7-1f1fc":71629,"1f1e7-1f1fe":71630,"1f1e7-1f1ff":71631,"1f1e8-1f1e6":71632,"1f1e8-1f1e8":71633,"1f1e8-1f1e9":71634,"1f1e8-1f1eb":71635,"1f1e8-1f1ec":71636,"1f1e8-1f1ed":71637,"1f1e8-1f1ee":71638,"1f1e8-1f1f0":71639,"1f1e8-1f1f1":71640,"1f1e8-1f1f2":71641,"1f1e8-1f1f3":71642,"1f1e8-1f1f4":71643,"1f1e8-1f1f5":71644,"1f1e8-1f1f7":71645,"1f1e8-1f1fa":71646,"1f1e8-1f1fb":71647,"1f1e8-1f1fc":71648,"1f1e8-1f1fd":71649,"1f1e8-1f1fe":71650,"1f1e8-1f1ff":71651,"1f1e9-1f1ea":71652,"1f1e9-1f1ec":71653,"1f1e9-1f1ef":71654,"1f1e9-1f1f0":71655,"1f1e9-1f1f2":71656,"1f1e9-1f1f4":71657,"1f1e9-1f1ff":71658,"1f1ea-1f1e6":71659,"1f1ea-1f1e8":71660,"1f1ea-1f1ea":71661,"1f1ea-1f1ec":71662,"1f1ea-1f1ed":71663,"1f1ea-1f1f7":71664,"1f1ea-1f1f8":71665,"1f1ea-1f1f9":71666,"1f1ea-1f1fa":71667,"1f1eb-1f1ee":71668,"1f1eb-1f1ef":71669,"1f1eb-1f1f0":71670,"1f1eb-1f1f2":71671,"1f1eb-1f1f4":71672,"1f1eb-1f1f7":71673,"1f1ec-1f1e6":71674,"1f1ec-1f1e7":71675,"1f1ec-1f1e9":71676,"1f1ec-1f1ea":71677,"1f1ec-1f1eb":71678,"1f1ec-1f1ec":71679,"1f1ec-1f1ed":71680,"1f1ec-1f1ee":71681,"1f1ec-1f1f1":71682,"1f1ec-1f1f2":71683,"1f1ec-1f1f3":71684,"1f1ec-1f1f5":71685,"1f1ec-1f1f6":71686,"1f1ec-1f1f7":71687,"1f1ec-1f1f8":71688,"1f1ec-1f1f9":71689,"1f1ec-1f1fa":71690,"1f1ec-1f1fc":71691,"1f1ec-1f1fe":71692,"1f1ed-1f1f0":71693,"1f1ed-1f1f2":71694,"1f1ed-1f1f3":71695,"1f1ed-1f1f7":71696,"1f1ed-1f1f9":71697,"1f1ed-1f1fa":71698,"1f1ee-1f1e8":71699,"1f1ee-1f1e9":71700,"1f1ee-1f1ea":71701,"1f1ee-1f1f1":71702,"1f1ee-1f1f2":71703,"1f1ee-1f1f3":71704,"1f1ee-1f1f4":71705,"1f1ee-1f1f6":71706,"1f1ee-1f1f7":71707,"1f1ee-1f1f8":71708,"1f1ee-1f1f9":71709,"1f1ef-1f1ea":71710,"1f1ef-1f1f2":71711,"1f1ef-1f1f4":71712,"1f1ef-1f1f5":71713,"1f1f0-1f1ea":71714,"1f1f0-1f1ec":71715,"1f1f0-1f1ed":71716,"1f1f0-1f1ee":71717,"1f1f0-1f1f2":71718,"1f1f0-1f1f3":71719,"1f1f0-1f1f5":71720,"1f1f0-1f1f7":71721,"1f1f0-1f1fc":71722,"1f1f0-1f1fe":71723,"1f1f0-1f1ff":71724,"1f1f1-1f1e6":71725,"1f1f1-1f1e7":71726,"1f1f1-1f1e8":71727,"1f1f1-1f1ee":71728,"1f1f1-1f1f0":71729,"1f1f1-1f1f7":71730,"1f1f1-1f1f8":71731,"1f1f1-1f1f9":71732,"1f1f1-1f1fa":71733,"1f1f1-1f1fb":71734,"1f1f1-1f1fe":71735,"1f1f2-1f1e6":71736,"1f1f2-1f1e8":71737,"1f1f2-1f1e9":71738,"1f1f2-1f1ea":71739,"1f1f2-1f1eb":71740,"1f1f2-1f1ec":71741,"1f1f2-1f1ed":71742,"1f1f2-1f1f0":71743,"1f1f2-1f1f1":71744,"1f1f2-1f1f2":71745,"1f1f2-1f1f3":71746,"1f1f2-1f1f4":71747,"1f1f2-1f1f5":71748,"1f1f2-1f1f6":71749,"1f1f2-1f1f7":71750,"1f1f2-1f1f8":71751,"1f1f2-1f1f9":71752,"1f1f2-1f1fa":71753,"1f1f2-1f1fb":71754,"1f1f2-1f1fc":71755,"1f1f2-1f1fd":71756,"1f1f2-1f1fe":71757,"1f1f2-1f1ff":71758,"1f1f3-1f1e6":71759,"1f1f3-1f1e8":71760,"1f1f3-1f1ea":71761,"1f1f3-1f1eb":71762,"1f1f3-1f1ec":71763,"1f1f3-1f1ee":71764,"1f1f3-1f1f1":71765,"1f1f3-1f1f4":71766,"1f1f3-1f1f5":71767,"1f1f3-1f1f7":71768,"1f1f3-1f1fa":71769,"1f1f3-1f1ff":71770,"1f1f4-1f1f2":71771,"1f1f5-1f1e6":71772,"1f1f5-1f1ea":71773,"1f1f5-1f1eb":71774,"1f1f5-1f1ec":71775,"1f1f5-1f1ed":71776,"1f1f5-1f1f0":71777,"1f1f5-1f1f1":71778,"1f1f5-1f1f2":71779,"1f1f5-1f1f3":71780,"1f1f5-1f1f7":71781,"1f1f5-1f1f8":71782,"1f1f5-1f1f9":71783,"1f1f5-1f1fc":71784,"1f1f5-1f1fe":71785,"1f1f6-1f1e6":71786,"1f1f7-1f1ea":71787,"1f1f7-1f1f4":71788,"1f1f7-1f1f8":71789,"1f1f7-1f1fa":71790,"1f1f7-1f1fc":71791,"1f1f8-1f1e6":71792,"1f1f8-1f1e7":71793,"1f1f8-1f1e8":71794,"1f1f8-1f1e9":71795,"1f1f8-1f1ea":71796,"1f1f8-1f1ec":71797,"1f1f8-1f1ed":71798,"1f1f8-1f1ee":71799,"1f1f8-1f1ef":71800,"1f1f8-1f1f0":71801,"1f1f8-1f1f1":71802,"1f1f8-1f1f2":71803,"1f1f8-1f1f3":71804,"1f1f8-1f1f4":71805,"1f1f8-1f1f7":71806,"1f1f8-1f1f8":71807,"1f1f8-1f1f9":71808,"1f1f8-1f1fb":71809,"1f1f8-1f1fd":71810,"1f1f8-1f1fe":71811,"1f1f8-1f1ff":71812,"1f1f9-1f1e6":71813,"1f1f9-1f1e8":71814,"1f1f9-1f1e9":71815,"1f1f9-1f1eb":71816,"1f1f9-1f1ec":71817,"1f1f9-1f1ed":71818,"1f1f9-1f1ef":71819,"1f1f9-1f1f0":71820,"1f1f9-1f1f1":71821,"1f1f9-1f1f2":71822,"1f1f9-1f1f3":71823,"1f1f9-1f1f4":71824,"1f1f9-1f1f7":71825,"1f1f9-1f1f9":71826,"1f1f9-1f1fb":71827,"1f1f9-1f1fc":71828,"1f1f9-1f1ff":71829,"1f1fa-1f1e6":71830,"1f1fa-1f1ec":71831,"1f1fa-1f1f2":71832,"1f1fa-1f1f3":71833,"1f1fa-1f1f8":71834,"1f1fa-1f1fe":71835,"1f1fa-1f1ff":71836,"1f1fb-1f1e6":71837,"1f1fb-1f1e8":71838,"1f1fb-1f1ea":71839,"1f1fb-1f1ec":71840,"1f1fb-1f1ee":71841,"1f1fb-1f1f3":71842,"1f1fb-1f1fa":71843,"1f1fc-1f1eb":71844,"1f1fc-1f1f8":71845,"1f1fd-1f1f0":71846,"1f1fe-1f1ea":71847,"1f1fe-1f1f9":71848,"1f1ff-1f1e6":71849,"1f1ff-1f1f2":71850,"1f1ff-1f1fc":71851,"1f201":62899,"1f202":62900,"1f21a":62906,"1f22f":62903,"1f232":62907,"1f233":62911,"1f234":62910,"1f235":62915,"1f236":62902,"1f237":62901,"1f238":62909,"1f239":62905,"1f23a":62914,"1f250":62904,"1f251":62908,"1f300":41010,"1f301":4857,"1f302":41012,"1f303":4858,"1f304":4860,"1f305":4861,"1f306":4862,"1f307":4863,"1f308":41011,"1f309":4864,"1f30a":41023,"1f30b":4815,"1f30c":4997,"1f30d":4806,"1f30e":4807,"1f30f":4808,"1f310":4809,"1f311":4977,"1f312":4978,"1f313":4979,"1f314":4980,"1f315":4981,"1f316":4982,"1f317":4983,"1f318":4984,"1f319":4985,"1f31a":4986,"1f31b":4987,"1f31c":4988,"1f31d":4991,"1f31e":4992,"1f31f":4995,"1f320":4996,"1f321":4989,"1f324":41001,"1f325":41002,"1f326":41003,"1f327":41004,"1f328":41005,"1f329":41006,"1f32a":41007,"1f32b":41008,"1f32c":41009,"1f32d":3725,"1f32e":3727,"1f32f":3728,"1f330":3708,"1f331":2659,"1f332":2661,"1f333":2662,"1f334":2663,"1f335":2664,"1f336":3698,"1f337":2658,"1f338":2649,"1f339":2653,"1f33a":2655,"1f33b":2656,"1f33c":2657,"1f33d":3697,"1f33e":2665,"1f33f":2666,"1f340":2668,"1f341":2669,"1f342":2670,"1f343":2671,"1f344":3705,"1f345":3690,"1f346":3694,"1f347":3674,"1f348":3675,"1f349":3676,"1f34a":3677,"1f34b":3678,"1f34c":3679,"1f34d":3680,"1f34e":3682,"1f34f":3683,"1f350":3684,"1f351":3685,"1f352":3686,"1f353":3687,"1f354":3722,"1f355":3724,"1f356":3718,"1f357":3719,"1f358":3744,"1f359":3745,"1f35a":3746,"1f35b":3747,"1f35c":3748,"1f35d":3749,"1f35e":3709,"1f35f":3723,"1f360":3750,"1f361":3756,"1f362":3751,"1f363":3752,"1f364":3753,"1f365":3754,"1f366":3765,"1f367":3766,"1f368":3767,"1f369":3768,"1f36a":3769,"1f36b":3774,"1f36c":3775,"1f36d":3776,"1f36e":3777,"1f36f":3778,"1f370":3771,"1f371":3743,"1f372":3735,"1f373":3733,"1f374":3801,"1f375":3783,"1f376":3784,"1f377":3786,"1f378":3787,"1f379":3788,"1f37a":3789,"1f37b":3790,"1f37c":3779,"1f37d":3800,"1f37e":3785,"1f37f":3739,"1f380":51040,"1f381":51041,"1f382":3770,"1f383":51024,"1f384":51025,"1f385":1527,"1f386":51026,"1f387":51027,"1f388":51030,"1f389":51031,"1f38a":51032,"1f38b":51033,"1f38c":71588,"1f38d":51034,"1f38e":51035,"1f38f":51036,"1f390":51037,"1f391":51038,"1f392":61134,"1f393":61147,"1f396":51045,"1f397":51042,"1f399":61167,"1f39a":61168,"1f39b":61169,"1f39e":61203,"1f39f":51043,"1f3a0":4866,"1f3a1":4868,"1f3a2":4869,"1f3a3":51072,"1f3a4":61170,"1f3a5":61202,"1f3a6":62819,"1f3a7":61171,"1f3a8":51105,"1f3a9":61146,"1f3aa":4871,"1f3ab":51044,"1f3ac":61205,"1f3ad":51103,"1f3ae":51086,"1f3af":51078,"1f3b0":51088,"1f3b1":51081,"1f3b2":51089,"1f3b3":51060,"1f3b4":51102,"1f3b5":61165,"1f3b6":61166,"1f3b7":61173,"1f3b8":61175,"1f3b9":61176,"1f3ba":61177,"1f3bb":61178,"1f3bc":61164,"1f3bd":51074,"1f3be":51058,"1f3bf":51075,"1f3c0":51054,"1f3c1":71586,"1f3c2":1600,"1f3c3-200d-2640":1584,"1f3c3-200d-2642":1583,"1f3c3":1582,"1f3c4-200d-2640":1606,"1f3c4-200d-2642":1605,"1f3c4":1604,"1f3c5":51047,"1f3c6":51046,"1f3c7":1598,"1f3c8":51056,"1f3c9":51057,"1f3ca-200d-2640":1612,"1f3ca-200d-2642":1611,"1f3ca":1610,"1f3cb-200d-2640":1618,"1f3cb-200d-2642":1617,"1f3cb":1616,"1f3cc-200d-2640":1603,"1f3cc-200d-2642":1602,"1f3cc":1601,"1f3cd":4902,"1f3ce":4901,"1f3cf":51061,"1f3d0":51055,"1f3d1":51062,"1f3d2":51063,"1f3d3":51065,"1f3d4":4813,"1f3d5":4817,"1f3d6":4818,"1f3d7":4824,"1f3d8":4829,"1f3d9":4859,"1f3da":4830,"1f3db":4823,"1f3dc":4819,"1f3dd":4820,"1f3de":4821,"1f3df":4822,"1f3e0":4831,"1f3e1":4832,"1f3e2":4833,"1f3e3":4834,"1f3e4":4835,"1f3e5":4836,"1f3e6":4837,"1f3e7":62729,"1f3e8":4838,"1f3e9":4839,"1f3ea":4840,"1f3eb":4841,"1f3ec":4842,"1f3ed":4843,"1f3ee":61216,"1f3ef":4844,"1f3f0":4845,"1f3f3-200d-1f308":71591,"1f3f3-200d-26a7":71592,"1f3f3":71590,"1f3f4-200d-2620":71593,"1f3f4-e0067-e0062-e0065-e006e-e0067-e007f":71852,"1f3f4-e0067-e0062-e0073-e0063-e0074-e007f":71853,"1f3f4-e0067-e0062-e0077-e006c-e0073-e007f":71854,"1f3f4":71589,"1f3f5":2652,"1f3f7":61234,"1f3f8":51066,"1f3f9":61303,"1f3fa":3805,"1f3fb":9525,"1f3fc":9526,"1f3fd":9527,"1f3fe":9528,"1f3ff":9529,"1f400":2576,"1f401":2575,"1f402":2556,"1f403":2557,"1f404":2558,"1f405":2547,"1f406":2548,"1f407":2579,"1f408-200d-2b1b":2544,"1f408":2543,"1f409":2618,"1f40a":2613,"1f40b":2622,"1f40c":2632,"1f40d":2616,"1f40e":2550,"1f40f":2563,"1f410":2565,"1f411":2564,"1f412":2531,"1f413":2596,"1f414":2595,"1f415-200d-1f9ba":2537,"1f415":2535,"1f416":2560,"1f417":2561,"1f418":2570,"1f419":2629,"1f41a":2630,"1f41b":2634,"1f41c":2635,"1f41d":2636,"1f41e":2638,"1f41f":2625,"1f420":2626,"1f421":2627,"1f422":2614,"1f423":2597,"1f424":2598,"1f425":2599,"1f426":2600,"1f427":2601,"1f428":2586,"1f429":2538,"1f42a":2566,"1f42b":2567,"1f42c":2623,"1f42d":2574,"1f42e":2555,"1f42f":2546,"1f430":2578,"1f431":2542,"1f432":2617,"1f433":2621,"1f434":2549,"1f435":2530,"1f436":2534,"1f437":2559,"1f438":2612,"1f439":2577,"1f43a":2539,"1f43b-200d-2744":2585,"1f43b":2584,"1f43c":2587,"1f43d":2562,"1f43e":2593,"1f43f":2580,"1f440":1381,"1f441-200d-1f5e8":1159,"1f441":1382,"1f442":1373,"1f443":1375,"1f444":1384,"1f445":1383,"1f446":1347,"1f447":1349,"1f448":1345,"1f449":1346,"1f44a":1355,"1f44b":1327,"1f44c":1336,"1f44d":1352,"1f44e":1353,"1f44f":1358,"1f450":1361,"1f451":61144,"1f452":61145,"1f453":61110,"1f454":61115,"1f455":61116,"1f456":61117,"1f457":61122,"1f458":61123,"1f459":61128,"1f45a":61129,"1f45b":61130,"1f45c":61131,"1f45d":61132,"1f45e":61136,"1f45f":61137,"1f460":61140,"1f461":61141,"1f462":61143,"1f463":1687,"1f464":1684,"1f465":1685,"1f466":1388,"1f467":1389,"1f468-200d-1f33e":1457,"1f468-200d-1f373":1460,"1f468-200d-1f37c":1524,"1f468-200d-1f393":1448,"1f468-200d-1f3a4":1478,"1f468-200d-1f3a8":1481,"1f468-200d-1f3eb":1451,"1f468-200d-1f3ed":1466,"1f468-200d-1f466-200d-1f466":1674,"1f468-200d-1f466":1673,"1f468-200d-1f467-200d-1f466":1676,"1f468-200d-1f467-200d-1f467":1677,"1f468-200d-1f467":1675,"1f468-200d-1f468-200d-1f466":1663,"1f468-200d-1f468-200d-1f466-200d-1f466":1666,"1f468-200d-1f468-200d-1f467":1664,"1f468-200d-1f468-200d-1f467-200d-1f466":1665,"1f468-200d-1f468-200d-1f467-200d-1f467":1667,"1f468-200d-1f469-200d-1f466":1658,"1f468-200d-1f469-200d-1f466-200d-1f466":1661,"1f468-200d-1f469-200d-1f467":1659,"1f468-200d-1f469-200d-1f467-200d-1f466":1660,"1f468-200d-1f469-200d-1f467-200d-1f467":1662,"1f468-200d-1f4bb":1475,"1f468-200d-1f4bc":1469,"1f468-200d-1f527":1463,"1f468-200d-1f52c":1472,"1f468-200d-1f680":1487,"1f468-200d-1f692":1490,"1f468-200d-1f9af":1574,"1f468-200d-1f9b0":1396,"1f468-200d-1f9b1":1397,"1f468-200d-1f9b2":1399,"1f468-200d-1f9b3":1398,"1f468-200d-1f9bc":1577,"1f468-200d-1f9bd":1580,"1f468-200d-2695":1445,"1f468-200d-2696":1454,"1f468-200d-2708":1484,"1f468-200d-2764-200d-1f468":1655,"1f468-200d-2764-200d-1f48b-200d-1f468":1651,"1f468":1392,"1f469-200d-1f33e":1458,"1f469-200d-1f373":1461,"1f469-200d-1f37c":1523,"1f469-200d-1f393":1449,"1f469-200d-1f3a4":1479,"1f469-200d-1f3a8":1482,"1f469-200d-1f3eb":1452,"1f469-200d-1f3ed":1467,"1f469-200d-1f466-200d-1f466":1679,"1f469-200d-1f466":1678,"1f469-200d-1f467-200d-1f466":1681,"1f469-200d-1f467-200d-1f467":1682,"1f469-200d-1f467":1680,"1f469-200d-1f469-200d-1f466":1668,"1f469-200d-1f469-200d-1f466-200d-1f466":1671,"1f469-200d-1f469-200d-1f467":1669,"1f469-200d-1f469-200d-1f467-200d-1f466":1670,"1f469-200d-1f469-200d-1f467-200d-1f467":1672,"1f469-200d-1f4bb":1476,"1f469-200d-1f4bc":1470,"1f469-200d-1f527":1464,"1f469-200d-1f52c":1473,"1f469-200d-1f680":1488,"1f469-200d-1f692":1491,"1f469-200d-1f9af":1575,"1f469-200d-1f9b0":1401,"1f469-200d-1f9b1":1403,"1f469-200d-1f9b2":1407,"1f469-200d-1f9b3":1405,"1f469-200d-1f9bc":1578,"1f469-200d-1f9bd":1581,"1f469-200d-2695":1446,"1f469-200d-2696":1455,"1f469-200d-2708":1485,"1f469-200d-2764-200d-1f468":1654,"1f469-200d-2764-200d-1f469":1656,"1f469-200d-2764-200d-1f48b-200d-1f468":1650,"1f469-200d-2764-200d-1f48b-200d-1f469":1652,"1f469":1400,"1f46a":1657,"1f46b":1647,"1f46c":1648,"1f46d":1646,"1f46e-200d-2640":1494,"1f46e-200d-2642":1493,"1f46e":1492,"1f46f-200d-2640":1590,"1f46f-200d-2642":1589,"1f46f":1588,"1f470-200d-2640":1518,"1f470-200d-2642":1517,"1f470":1516,"1f471-200d-2640":1409,"1f471-200d-2642":1410,"1f471":1391,"1f472":1511,"1f473-200d-2640":1510,"1f473-200d-2642":1509,"1f473":1508,"1f474":1412,"1f475":1413,"1f476":1386,"1f477-200d-2640":1504,"1f477-200d-2642":1503,"1f477":1502,"1f478":1507,"1f479":1109,"1f47a":1110,"1f47b":1111,"1f47c":1526,"1f47d":1112,"1f47e":1113,"1f47f":1104,"1f480":1105,"1f481-200d-2640":1428,"1f481-200d-2642":1427,"1f481":1426,"1f482-200d-2640":1500,"1f482-200d-2642":1499,"1f482":1498,"1f483":1585,"1f484":61152,"1f485":1366,"1f486-200d-2640":1560,"1f486-200d-2642":1559,"1f486":1558,"1f487-200d-2640":1563,"1f487-200d-2642":1562,"1f487":1561,"1f488":4870,"1f489":61326,"1f48a":61328,"1f48b":1127,"1f48c":1128,"1f48d":61153,"1f48e":61154,"1f48f":1649,"1f490":2648,"1f491":1653,"1f492":4846,"1f493":1133,"1f494":1138,"1f495":1135,"1f496":1131,"1f497":1132,"1f498":1129,"1f499":1145,"1f49a":1144,"1f49b":1143,"1f49c":1146,"1f49d":1130,"1f49e":1134,"1f49f":1136,"1f4a0":62946,"1f4a1":61214,"1f4a2":1151,"1f4a3":1157,"1f4a4":1163,"1f4a5":1152,"1f4a6":1154,"1f4a7":41022,"1f4a8":1155,"1f4a9":1107,"1f4aa":1368,"1f4ab":1153,"1f4ac":1158,"1f4ad":1162,"1f4ae":2650,"1f4af":1150,"1f4b0":61235,"1f4b1":62841,"1f4b2":62842,"1f4b3":61242,"1f4b4":61237,"1f4b5":61238,"1f4b6":61239,"1f4b7":61240,"1f4b8":61241,"1f4b9":61244,"1f4ba":4936,"1f4bb":61191,"1f4bc":61265,"1f4bd":61197,"1f4be":61198,"1f4bf":61199,"1f4c0":61200,"1f4c1":61266,"1f4c2":61267,"1f4c3":61227,"1f4c4":61229,"1f4c5":61269,"1f4c6":61270,"1f4c7":61273,"1f4c8":61274,"1f4c9":61275,"1f4ca":61276,"1f4cb":61277,"1f4cc":61278,"1f4cd":61279,"1f4ce":61280,"1f4cf":61282,"1f4d0":61283,"1f4d1":61232,"1f4d2":61226,"1f4d3":61225,"1f4d4":61218,"1f4d5":61219,"1f4d6":61220,"1f4d7":61221,"1f4d8":61222,"1f4d9":61223,"1f4da":61224,"1f4db":62847,"1f4dc":61228,"1f4dd":61264,"1f4de":61185,"1f4df":61186,"1f4e0":61187,"1f4e1":61325,"1f4e2":61159,"1f4e3":61160,"1f4e4":61249,"1f4e5":61250,"1f4e6":61251,"1f4e7":61246,"1f4e8":61247,"1f4e9":61248,"1f4ea":61253,"1f4eb":61252,"1f4ec":61254,"1f4ed":61255,"1f4ee":61256,"1f4ef":61161,"1f4f0":61230,"1f4f1":61182,"1f4f2":61183,"1f4f3":62823,"1f4f4":62824,"1f4f5":62751,"1f4f6":62822,"1f4f7":61207,"1f4f8":61208,"1f4f9":61209,"1f4fa":61206,"1f4fb":61172,"1f4fc":61210,"1f4fd":61204,"1f4ff":61151,"1f500":62801,"1f501":62802,"1f502":62803,"1f503":62769,"1f504":62770,"1f505":62820,"1f506":62821,"1f507":61155,"1f508":61156,"1f509":61157,"1f50a":61158,"1f50b":61188,"1f50c":61190,"1f50d":61211,"1f50e":61212,"1f50f":61290,"1f510":61291,"1f511":61292,"1f512":61288,"1f513":61289,"1f514":61162,"1f515":61163,"1f516":61233,"1f517":61313,"1f518":62947,"1f519":62771,"1f51a":62772,"1f51b":62773,"1f51c":62774,"1f51d":62775,"1f51e":62752,"1f51f":62876,"1f520":62877,"1f521":62878,"1f522":62879,"1f523":62880,"1f524":62881,"1f525":41021,"1f526":61215,"1f527":61306,"1f528":61294,"1f529":61308,"1f52a":3803,"1f52b":61301,"1f52c":61323,"1f52d":61324,"1f52e":51082,"1f52f":62787,"1f530":62848,"1f531":62846,"1f532":62949,"1f533":62948,"1f534":62916,"1f535":62920,"1f536":62940,"1f537":62941,"1f538":62942,"1f539":62943,"1f53a":62944,"1f53b":62945,"1f53c":62811,"1f53d":62813,"1f549":62778,"1f54a":2602,"1f54b":4854,"1f54c":4850,"1f54d":4852,"1f54e":62786,"1f550":4955,"1f551":4957,"1f552":4959,"1f553":4961,"1f554":4963,"1f555":4965,"1f556":4967,"1f557":4969,"1f558":4971,"1f559":4973,"1f55a":4975,"1f55b":4953,"1f55c":4956,"1f55d":4958,"1f55e":4960,"1f55f":4962,"1f560":4964,"1f561":4966,"1f562":4968,"1f563":4970,"1f564":4972,"1f565":4974,"1f566":4976,"1f567":4954,"1f56f":61213,"1f570":4952,"1f573":1156,"1f574":1587,"1f575-200d-2640":1497,"1f575-200d-2642":1496,"1f575":1495,"1f576":61111,"1f577":2641,"1f578":2642,"1f579":51087,"1f57a":1586,"1f587":61281,"1f58a":61261,"1f58b":61260,"1f58c":61262,"1f58d":61263,"1f590":1329,"1f595":1348,"1f596":1331,"1f5a4":1148,"1f5a5":61192,"1f5a8":61193,"1f5b1":61195,"1f5b2":61196,"1f5bc":51104,"1f5c2":61268,"1f5c3":61285,"1f5c4":61286,"1f5d1":61287,"1f5d2":61271,"1f5d3":61272,"1f5dc":61310,"1f5dd":61293,"1f5de":61231,"1f5e1":61299,"1f5e3":1683,"1f5e8":1160,"1f5ef":1161,"1f5f3":61257,"1f5fa":4810,"1f5fb":4816,"1f5fc":4847,"1f5fd":4848,"1f5fe":4811,"1f5ff":61362,"1f600":11,"1f601":14,"1f602":18,"1f603":12,"1f604":13,"1f605":16,"1f606":15,"1f607":114,"1f608":1103,"1f609":112,"1f60a":113,"1f60b":124,"1f60c":150,"1f60d":116,"1f60e":170,"1f60f":144,"1f610":139,"1f611":140,"1f612":145,"1f613":195,"1f614":151,"1f615":173,"1f616":192,"1f617":119,"1f618":118,"1f619":122,"1f61a":121,"1f61b":125,"1f61c":126,"1f61d":128,"1f61e":194,"1f61f":175,"1f620":1101,"1f621":1100,"1f622":189,"1f623":193,"1f624":199,"1f625":188,"1f626":184,"1f627":185,"1f628":186,"1f629":196,"1f62a":152,"1f62b":197,"1f62c":147,"1f62d":190,"1f62e-200d-1f4a8":148,"1f62e":178,"1f62f":179,"1f630":187,"1f631":191,"1f632":180,"1f633":181,"1f634":154,"1f635-200d-1f4ab":165,"1f635":164,"1f636-200d-1f32b":143,"1f636":141,"1f637":155,"1f638":1116,"1f639":1117,"1f63a":1115,"1f63b":1118,"1f63c":1119,"1f63d":1120,"1f63e":1123,"1f63f":1122,"1f640":1121,"1f641":176,"1f642":19,"1f643":110,"1f644":146,"1f645-200d-2640":1422,"1f645-200d-2642":1421,"1f645":1420,"1f646-200d-2640":1425,"1f646-200d-2642":1424,"1f646":1423,"1f647-200d-2640":1437,"1f647-200d-2642":1436,"1f647":1435,"1f648":1124,"1f649":1125,"1f64a":1126,"1f64b-200d-2640":1431,"1f64b-200d-2642":1430,"1f64b":1429,"1f64c":1359,"1f64d-200d-2640":1416,"1f64d-200d-2642":1415,"1f64d":1414,"1f64e-200d-2640":1419,"1f64e-200d-2642":1418,"1f64e":1417,"1f64f":1364,"1f680":4942,"1f681":4937,"1f682":4872,"1f683":4873,"1f684":4874,"1f685":4875,"1f686":4876,"1f687":4877,"1f688":4878,"1f689":4879,"1f68a":4880,"1f68b":4883,"1f68c":4884,"1f68d":4885,"1f68e":4886,"1f68f":4911,"1f690":4887,"1f691":4888,"1f692":4889,"1f693":4890,"1f694":4891,"1f695":4892,"1f696":4893,"1f697":4894,"1f698":4895,"1f699":4896,"1f69a":4898,"1f69b":4899,"1f69c":4900,"1f69d":4881,"1f69e":4882,"1f69f":4938,"1f6a0":4939,"1f6a1":4940,"1f6a2":4930,"1f6a3-200d-2640":1609,"1f6a3-200d-2642":1608,"1f6a3":1607,"1f6a4":4926,"1f6a5":4918,"1f6a6":4919,"1f6a7":4921,"1f6a8":4917,"1f6a9":71587,"1f6aa":61333,"1f6ab":62745,"1f6ac":61358,"1f6ad":62747,"1f6ae":62730,"1f6af":62748,"1f6b0":62731,"1f6b1":62749,"1f6b2":4907,"1f6b3":62746,"1f6b4-200d-2640":1621,"1f6b4-200d-2642":1620,"1f6b4":1619,"1f6b5-200d-2640":1624,"1f6b5-200d-2642":1623,"1f6b5":1622,"1f6b6-200d-2640":1566,"1f6b6-200d-2642":1565,"1f6b6":1564,"1f6b7":62750,"1f6b8":62743,"1f6b9":62733,"1f6ba":62734,"1f6bb":62735,"1f6bc":62736,"1f6bd":61340,"1f6be":62737,"1f6bf":61342,"1f6c0":1643,"1f6c1":61343,"1f6c2":62738,"1f6c3":62739,"1f6c4":62740,"1f6c5":62741,"1f6cb":61338,"1f6cc":1644,"1f6cd":61133,"1f6ce":4944,"1f6cf":61337,"1f6d0":62776,"1f6d1":4920,"1f6d2":61357,"1f6d5":4851,"1f6d6":4828,"1f6d7":61334,"1f6e0":61298,"1f6e1":61304,"1f6e2":4914,"1f6e3":4912,"1f6e4":4913,"1f6e5":4929,"1f6e9":4932,"1f6eb":4933,"1f6ec":4934,"1f6f0":4941,"1f6f3":4927,"1f6f4":4908,"1f6f5":4903,"1f6f6":4925,"1f6f7":51076,"1f6f8":4943,"1f6f9":4909,"1f6fa":4906,"1f6fb":4897,"1f6fc":4910,"1f7e0":62917,"1f7e1":62918,"1f7e2":62919,"1f7e3":62921,"1f7e4":62922,"1f7e5":62925,"1f7e6":62929,"1f7e7":62926,"1f7e8":62927,"1f7e9":62928,"1f7ea":62930,"1f7eb":62931,"1f90c":1337,"1f90d":1149,"1f90e":1147,"1f90f":1338,"1f910":137,"1f911":129,"1f912":156,"1f913":171,"1f914":135,"1f915":157,"1f916":1114,"1f917":130,"1f918":1343,"1f919":1344,"1f91a":1328,"1f91b":1356,"1f91c":1357,"1f91d":1363,"1f91e":1340,"1f91f":1342,"1f920":167,"1f921":1108,"1f922":158,"1f923":17,"1f924":153,"1f925":149,"1f926-200d-2640":1440,"1f926-200d-2642":1439,"1f926":1438,"1f927":160,"1f928":138,"1f929":117,"1f92a":127,"1f92b":134,"1f92c":1102,"1f92d":131,"1f92e":159,"1f92f":166,"1f930":1519,"1f931":1522,"1f932":1362,"1f933":1367,"1f934":1506,"1f935-200d-2640":1515,"1f935-200d-2642":1514,"1f935":1513,"1f936":1528,"1f937-200d-2640":1443,"1f937-200d-2642":1442,"1f937":1441,"1f938-200d-2640":1627,"1f938-200d-2642":1626,"1f938":1625,"1f939-200d-2640":1639,"1f939-200d-2642":1638,"1f939":1637,"1f93a":1597,"1f93c-200d-2640":1630,"1f93c-200d-2642":1629,"1f93c":1628,"1f93d-200d-2640":1633,"1f93d-200d-2642":1632,"1f93d":1631,"1f93e-200d-2640":1636,"1f93e-200d-2642":1635,"1f93e":1634,"1f93f":51073,"1f940":2654,"1f941":61180,"1f942":3791,"1f943":3792,"1f944":3802,"1f945":51069,"1f947":51048,"1f948":51049,"1f949":51050,"1f94a":51067,"1f94b":51068,"1f94c":51077,"1f94d":51064,"1f94e":51053,"1f94f":51059,"1f950":3710,"1f951":3693,"1f952":3700,"1f953":3721,"1f954":3695,"1f955":3696,"1f956":3711,"1f957":3738,"1f958":3734,"1f959":3730,"1f95a":3732,"1f95b":3780,"1f95c":3706,"1f95d":3689,"1f95e":3715,"1f95f":3757,"1f960":3758,"1f961":3759,"1f962":3799,"1f963":3737,"1f964":3794,"1f965":3692,"1f966":3702,"1f967":3773,"1f968":3713,"1f969":3720,"1f96a":3726,"1f96b":3742,"1f96c":3701,"1f96d":3681,"1f96e":3755,"1f96f":3714,"1f970":115,"1f971":198,"1f972":123,"1f973":168,"1f974":163,"1f975":161,"1f976":162,"1f977":1501,"1f978":169,"1f97a":182,"1f97b":61124,"1f97c":61113,"1f97d":61112,"1f97e":61138,"1f97f":61139,"1f980":3760,"1f981":2545,"1f982":2643,"1f983":2594,"1f984":2551,"1f985":2603,"1f986":2604,"1f987":2583,"1f988":2628,"1f989":2606,"1f98a":2540,"1f98b":2633,"1f98c":2553,"1f98d":2532,"1f98e":2615,"1f98f":2572,"1f990":3762,"1f991":3763,"1f992":2569,"1f993":2552,"1f994":2582,"1f995":2619,"1f996":2620,"1f997":2639,"1f998":2591,"1f999":2568,"1f99a":2610,"1f99b":2573,"1f99c":2611,"1f99d":2541,"1f99e":3761,"1f99f":2644,"1f9a0":2647,"1f9a1":2592,"1f9a2":2605,"1f9a3":2571,"1f9a4":2607,"1f9a5":2588,"1f9a6":2589,"1f9a7":2533,"1f9a8":2590,"1f9a9":2609,"1f9aa":3764,"1f9ab":2581,"1f9ac":2554,"1f9ad":2624,"1f9ae":2536,"1f9af":61312,"1f9b4":1380,"1f9b5":1371,"1f9b6":1372,"1f9b7":1379,"1f9b8-200d-2640":1532,"1f9b8-200d-2642":1531,"1f9b8":1530,"1f9b9-200d-2640":1535,"1f9b9-200d-2642":1534,"1f9b9":1533,"1f9ba":61114,"1f9bb":1374,"1f9bc":4905,"1f9bd":4904,"1f9be":1369,"1f9bf":1370,"1f9c0":3717,"1f9c1":3772,"1f9c2":3741,"1f9c3":3796,"1f9c4":3703,"1f9c5":3704,"1f9c6":3731,"1f9c7":3716,"1f9c8":3740,"1f9c9":3797,"1f9ca":3798,"1f9cb":3795,"1f9cd-200d-2640":1569,"1f9cd-200d-2642":1568,"1f9cd":1567,"1f9ce-200d-2640":1572,"1f9ce-200d-2642":1571,"1f9ce":1570,"1f9cf-200d-2640":1434,"1f9cf-200d-2642":1433,"1f9cf":1432,"1f9d0":172,"1f9d1-200d-1f33e":1456,"1f9d1-200d-1f373":1459,"1f9d1-200d-1f37c":1525,"1f9d1-200d-1f384":1529,"1f9d1-200d-1f393":1447,"1f9d1-200d-1f3a4":1477,"1f9d1-200d-1f3a8":1480,"1f9d1-200d-1f3eb":1450,"1f9d1-200d-1f3ed":1465,"1f9d1-200d-1f4bb":1474,"1f9d1-200d-1f4bc":1468,"1f9d1-200d-1f527":1462,"1f9d1-200d-1f52c":1471,"1f9d1-200d-1f680":1486,"1f9d1-200d-1f692":1489,"1f9d1-200d-1f91d-200d-1f9d1":1645,"1f9d1-200d-1f9af":1573,"1f9d1-200d-1f9b0":1402,"1f9d1-200d-1f9b1":1404,"1f9d1-200d-1f9b2":1408,"1f9d1-200d-1f9b3":1406,"1f9d1-200d-1f9bc":1576,"1f9d1-200d-1f9bd":1579,"1f9d1-200d-2695":1444,"1f9d1-200d-2696":1453,"1f9d1-200d-2708":1483,"1f9d1":1390,"1f9d2":1387,"1f9d3":1411,"1f9d4-200d-2640":1395,"1f9d4-200d-2642":1394,"1f9d4":1393,"1f9d5":1512,"1f9d6-200d-2640":1593,"1f9d6-200d-2642":1592,"1f9d6":1591,"1f9d7-200d-2640":1596,"1f9d7-200d-2642":1595,"1f9d7":1594,"1f9d8-200d-2640":1642,"1f9d8-200d-2642":1641,"1f9d8":1640,"1f9d9-200d-2640":1538,"1f9d9-200d-2642":1537,"1f9d9":1536,"1f9da-200d-2640":1541,"1f9da-200d-2642":1540,"1f9da":1539,"1f9db-200d-2640":1544,"1f9db-200d-2642":1543,"1f9db":1542,"1f9dc-200d-2640":1547,"1f9dc-200d-2642":1546,"1f9dc":1545,"1f9dd-200d-2640":1550,"1f9dd-200d-2642":1549,"1f9dd":1548,"1f9de-200d-2640":1553,"1f9de-200d-2642":1552,"1f9de":1551,"1f9df-200d-2640":1556,"1f9df-200d-2642":1555,"1f9df":1554,"1f9e0":1376,"1f9e1":1142,"1f9e2":61148,"1f9e3":61118,"1f9e4":61119,"1f9e5":61120,"1f9e6":61121,"1f9e7":51039,"1f9e8":51028,"1f9e9":51090,"1f9ea":61320,"1f9eb":61321,"1f9ec":61322,"1f9ed":4812,"1f9ee":61201,"1f9ef":61356,"1f9f0":61316,"1f9f1":4825,"1f9f2":61317,"1f9f3":4945,"1f9f4":61346,"1f9f5":51106,"1f9f6":51108,"1f9f7":61347,"1f9f8":51091,"1f9f9":61348,"1f9fa":61349,"1f9fb":61350,"1f9fc":61352,"1f9fd":61355,"1f9fe":61243,"1f9ff":51084,"1fa70":61142,"1fa71":61125,"1fa72":61126,"1fa73":61127,"1fa74":61135,"1fa78":61327,"1fa79":61329,"1fa7a":61331,"1fa80":51079,"1fa81":51080,"1fa82":4935,"1fa83":61302,"1fa84":51083,"1fa85":51092,"1fa86":51094,"1fa90":4993,"1fa91":61339,"1fa92":61345,"1fa93":61295,"1fa94":61217,"1fa95":61179,"1fa96":61149,"1fa97":61174,"1fa98":61181,"1fa99":61236,"1fa9a":61305,"1fa9b":61307,"1fa9c":61318,"1fa9d":61315,"1fa9e":61335,"1fa9f":61336,"1faa0":61341,"1faa1":51107,"1faa2":51109,"1faa3":61351,"1faa4":61344,"1faa5":61354,"1faa6":61360,"1faa7":61363,"1faa8":4826,"1fab0":2645,"1fab1":2646,"1fab2":2637,"1fab3":2640,"1fab4":2660,"1fab5":4827,"1fab6":2608,"1fac0":1377,"1fac1":1378,"1fac2":1686,"1fad0":3688,"1fad1":3699,"1fad2":3691,"1fad3":3712,"1fad4":3729,"1fad5":3736,"1fad6":3782,"203c":62834,"21a9":62765,"21aa":62766,"231a":4948,"231b":4946,"23cf":62818,"23e9":62805,"23ea":62809,"23eb":62812,"23ec":62814,"23ed":62806,"23ee":62810,"23ef":62807,"23f0":4949,"23f1":4950,"23f2":4951,"23f3":4947,"23f8":62815,"23f9":62816,"23fa":62817,"24c2":62890,"25aa":62938,"25ab":62939,"25b6":62804,"25c0":62808,"25fb":62935,"25fc":62934,"25fd":62937,"25fe":62936,"260e":61184,"261d":1350,"262a":62784,"262e":62785,"262f":62781,"263a":120,"264a":62790,"264b":62791,"264c":62792,"264d":62793,"264e":62794,"264f":62795,"265f":51099,"267b":62844,"267e":62833,"267f":62732,"269b":62777,"269c":62845,"26a0":62742,"26a1":41016,"26a7":62827,"26aa":62924,"26ab":62923,"26b0":61359,"26b1":61361,"26bd":51051,"26be":51052,"26c4":41019,"26c5":4999,"26c8":41e3,"26ce":62800,"26cf":61296,"26d1":61150,"26d3":61314,"26d4":62744,"26e9":4853,"26ea":4849,"26f0":4814,"26f1":41015,"26f2":4855,"26f3":51070,"26f4":4928,"26f5":4924,"26f7":1599,"26f8":51071,"26f9-200d-2640":1615,"26f9-200d-2642":1614,"26f9":1613,"26fa":4856,"26fd":4915,"270a":1354,"270b":1330,"270c":1339,"270d":1365,"270f":61258,"271d":62782,"274c":62853,"274e":62854,"2764-200d-1f525":1139,"2764-200d-1fa79":1140,"27a1":62757,"27b0":62855,"27bf":62856,"2b05":62761,"2b06":62755,"2b07":62759,"2b1b":62932,"2b1c":62933,"2b50":4994,"2b55":62849,"303d":62857,"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-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff":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-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3ff":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,"1f48f-1f3fb":0,"1f48f-1f3fc":0,"1f48f-1f3fd":0,"1f48f-1f3fe":0,"1f48f-1f3ff":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f491-1f3fb":0,"1f491-1f3fc":0,"1f491-1f3fd":0,"1f491-1f3fe":0,"1f491-1f3ff":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fe":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,"1f91d-1f3fb":0,"1f91d-1f3fc":0,"1f91d-1f3fd":0,"1f91d-1f3fe":0,"1f91d-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-200d-2640":0,"1f9d4-1f3fc-200d-2640":0,"1f9d4-1f3fd-200d-2640":0,"1f9d4-1f3fe-200d-2640":0,"1f9d4-1f3ff-200d-2640":0,"1f9d4-1f3fb-200d-2642":0,"1f9d4-1f3fc-200d-2642":0,"1f9d4-1f3fd-200d-2642":0,"1f9d4-1f3fe-200d-2642":0,"1f9d4-1f3ff-200d-2642":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}},n=s[""];for(const e in s)e&&Object.assign(n,s[e]);const a=n},3189:(e,t,i)=>{"use strict";i.d(t,{Bf:()=>n,U9:()=>a,bt:()=>s});const s='Roboto, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif',n="16px",a="400"},356:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});const s="undefined"!=typeof ImageBitmap},5296:(e,t,i)=>{"use strict";i.d(t,{Kx:()=>r,cK:()=>d,jt:()=>l});var s=i(3035),n=i(3725);const a=new Map;function o(e){return a.get(e)}function r(e){const t=o(e);t&&(t.isCancelled=!0,t.deferred.resolve())}function d(e,t,i){return i||(i=function(e){r(e);const t={isCancelled:!1,deferred:(0,n.Z)()};return a.set(e,t),t.deferred.then((()=>{o(e)===t&&a.delete(e)})),t}(t)),(0,s.T2)((()=>{i.isCancelled||(e()?d(e,t,i):i.deferred.resolve())})),i.deferred}function l(e){(0,s.T2)((()=>{e()&&l(e)}))}},2353:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function n(e,t){return s(this,void 0,void 0,(function*(){const i=e.map(((e,i,n)=>s(this,void 0,void 0,(function*(){if(yield t(e,i,n))return e}))));return(yield Promise.all(i)).filter(Boolean)}))}},8847:(e,t,i)=>{"use strict";function s(e,t){const i=[];let s=-1;for(;-1!==(s=e.findIndex(t));)i.push(e.splice(s,1)[0]);return i}i.d(t,{Z:()=>s})},5916:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});class s{constructor(e){this.assets=e,this.tempId=0}playSound(e,t=!1){++this.tempId,this.assetName=e;try{const i=this.createAudio();i.autoplay=!0,i.src="assets/audio/"+e,i.loop=t,i.play()}catch(t){console.error("playSound",e,t)}}playSoundIfDifferent(e,t){this.assetName!==e&&this.playSound(e,t)}createAudio(){let{audio:e}=this;return e||(e=this.audio=new Audio,e.play(),e)}stopSound(){this.audio&&this.audio.pause()}cancelDelayedPlay(){++this.tempId}playSoundWithTimeout(e,t,i){const s=++this.tempId;setTimeout((()=>{this.tempId===s&&this.playSound(e,t)}),i)}}},8678:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(3019);function n(e){return(0,s.Z)(e,"readAsDataURL")}},6705:(e,t,i)=>{"use strict";i.d(t,{Z:()=>m});var s=i(3725),n=i(8594),a=i(3035);const o=[];let r=!1;function d(e,t="push"){if(!e.items.length)return Promise.resolve([]);const i=e.promise=(0,s.Z)();return o[t](e),l(),i}function l(){r||function(e){if(!e.items.length)return e.promise.resolve([]),Promise.resolve([]);const t=e.items.slice(),i=[];return new Promise(((s,o)=>{const r=()=>{return d=this,l=void 0,h=function*(){const d=performance.now();do{yield(0,n.e9)();const s=e.process.apply(e.context,t.shift());let a;if(s instanceof Promise)try{a=yield s}catch(e){return void o(e)}else a=s;i.push(a)}while(t.length>0&&performance.now()-d<6);t.length>0?(0,a.T2)(r):s(i)},new((c=void 0)||(c=Promise))((function(e,t){function i(e){try{n(h.next(e))}catch(e){t(e)}}function s(e){try{n(h.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof c?n:new c((function(e){e(n)}))).then(i,s)}n((h=h.apply(d,l||[])).next())}));var d,l,c,h};(0,a.T2)(r)})).then(e.promise.resolve,e.promise.reject)}(o.shift()).finally((()=>{r=!1,o.length&&l()}))}var c=i(6663);let h,u;function p(e,t,i,s=document.createElement("canvas")){s.width=e.width,s.height=e.height;const n=s.getContext("2d",{alpha:!1});return c.Z?(n.filter=`blur(${t}px)`,n.drawImage(e,2*-t,2*-t,s.width+4*t,s.height+4*t)):(n.drawImage(e,0,0),u(n,0,0,s.width,s.height,t,i)),s}h=c.Z?Promise.resolve():i.e(77).then(i.bind(i,7077)).then((e=>{u=e.default}));const f=new Map;function m(e,t=2,i=2){if(!e)throw"no dataUri for blur: "+e;f.size>150&&f.clear();const s=document.createElement("canvas");s.className="canvas-thumbnail";let n=f.get(e);if(n)s.width=n.canvas.width,s.height=n.canvas.height,n.promise.then((()=>{s.getContext("2d").drawImage(n.canvas,0,0,s.width,s.height)}));else{const a=new Promise((n=>{h.then((()=>{const a=new Image;a.onload=()=>{d({items:[[a,t,i,s]],context:null,process:p},"unshift").then((()=>{n()}))},a.src=e}))}));f.set(e,n={canvas:s,promise:a})}return Object.assign(Object.assign({},n),{canvas:s})}},4059:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l,o:()=>d});var s=i(4762),n=i(3306),a=i(9818);const o=(0,n.Z)("ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e19282321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aadaad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c353c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc00011080000000003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00"),r=(0,n.Z)("ffd9");function d(e){const t="base64,",i=e.slice(e.indexOf(t)+t.length),s=[...atob(i)].map((e=>e.charCodeAt(0)));return new Uint8Array(s)}function l(e,t=!1){let i,n;t||1!==e[0]?i=(0,a.Z)(e):(i=new Uint8Array(o.concat(Array.from(e.slice(3)),r)),i[164]=e[1],i[166]=e[2]),n=t?s.IS_SAFARI?"image/png":"image/webp":"image/jpeg";const d=function(e,t="image/jpeg"){return`data:${t};base64,${btoa(String.fromCharCode(...e))}`}(i,n);return d}},9897:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(410),n=i(9405);function a(e,t,i,s,a=!0){if(ei/s?r=t*i/e|0:(o=e*s/t|0,o>i&&(r=r*i/o|0,o=i)),a&&o>=e&&r>=t&&(o=e,r=t),(0,n.C)(o,r)}s.GO.calcImageInBox=a},2890:(e,t,i)=>{"use strict";function s(e,t,i,s,n,a){const o=e.canvas.dpr;o&&(t*=o,i*=o,s*=o),e.beginPath(),e.arc(t,i,s,0,2*Math.PI,!1),e.closePath(),n&&e.fill(),a&&e.stroke()}function n(e,t,i,n,a,o){return s(e,t+n,i+n,n,a,o)}i.d(t,{Z:()=>s,o:()=>n})},8097:(e,t,i)=>{"use strict";let s;function n(e,t){if(!s){const e=document.createElement("canvas");s=e.getContext("2d",{alpha:!1})}return s.font!==t&&(s.font=t),s.measureText(e).width}i.d(t,{Z:()=>n})},7814:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(356);function n(e){return new Promise((t=>{return i=this,n=void 0,o=function*(){var i,n,a;const o=document.createElement("canvas"),r=null!==(i=e.size)&&void 0!==i?i:e.mediaSize.aspectFitted(e.boxSize),d=window.devicePixelRatio&&1;o.width=r.width*d,o.height=r.height*d;const l=o.getContext("2d");let c;c=s.Z?yield createImageBitmap(e.media,{resizeWidth:r.width,resizeHeight:r.height}):e.media,l.drawImage(c,0,0,o.width,o.height),s.Z&&(null==c||c.close());const h=null!==(n=e.mimeType)&&void 0!==n?n:"image/jpeg",u=null!==(a=e.quality)&&void 0!==a?a:1;if(e.toDataURL){const e=o.toDataURL(h,u);t({url:e,size:r})}else o.toBlob((e=>{t({blob:e,size:r})}),h,u)},new((a=void 0)||(a=Promise))((function(e,t){function s(e){try{d(o.next(e))}catch(e){t(e)}}function r(e){try{d(o.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof a?i:new a((function(e){e(i)}))).then(s,r)}d((o=o.apply(i,n||[])).next())}));var i,n,a,o}))}},467:(e,t,i)=>{"use strict";i.d(t,{ST:()=>r,ZP:()=>d,gV:()=>l});var s=i(5813);const n=/[`~!@#$%^&*()\-_=+\[\]\\|{}'";:\/?.>,<]+/g,a=/^\s+|\s$/g,o={ะน:"q",ั†:"w",ัƒ:"e",ะบ:"r",ะต:"t",ะฝ:"y",ะณ:"u",ัˆ:"i",ั‰:"o",ะท:"p",ั…:"[",ัŠ:"]",ั„:"a",ั‹:"s",ะฒ:"d",ะฐ:"f",ะฟ:"g",ั€:"h",ะพ:"j",ะป:"k",ะด:"l",ะถ:";",ั:"'",ั:"z",ั‡:"x",ั:"c",ะผ:"v",ะธ:"b",ั‚:"n",ัŒ:"m",ะฑ:",",ัŽ:".",".":"/"};function r(e){return e.replace(n,"").replace(a,"")}function d(e,t=!0){return l(e,{clearBadChars:!0,latinize:t,ignoreCase:!0})}function l(e,t={}){const i=t.includeTag&&"%"===e.charAt(0),n=e;return t.clearBadChars&&(e=r(e)),t.latinize&&(e=function(e){return e.replace(/[^A-Za-z0-9]/g,(e=>{const t=s.Z[e];return null!=t?t:e}))}(e)),t.ignoreCase&&(e=e.toLowerCase()),i&&(e="%"+e),t.latinize&&(e+=""+function(e){return e.toLowerCase().replace(/[\wะฐ-ั]/g,(e=>{const t=o[e];return null!=t?t:e}))}(n)),e}},2166:(e,t,i)=>{"use strict";function s(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)}function n(e){navigator.clipboard?navigator.clipboard.writeText(e).catch((t=>{console.error("clipboard error",t),s(e)})):s(e)}i.d(t,{T:()=>n})},3416:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(5432),n=i(4755),a=i(2296);class o extends a.Z{constructor(){super("menu",!0),this.onMouseMove=e=>{const t=this.element.getBoundingClientRect(),{clientX:i,clientY:s}=e,n=i>=t.right?i-t.right:t.left-i,a=s>=t.bottom?s-t.bottom:t.top-s;(n>=100||a>=100)&&this.close()},n.Z.addEventListener("resize",(()=>{this.element&&this.close()}))}isOpened(){return!!this.element}close(){this.element&&(this.element.classList.remove("active"),this.element.parentElement.classList.remove("menu-open")),super.close(),s.Z||window.removeEventListener("mousemove",this.onMouseMove)}openBtnMenu(e,t){super.open(e),this.element.classList.add("active","was-open"),this.element.parentElement.classList.add("menu-open"),t&&this.addEventListener("toggle",t,{once:!0}),s.Z||window.addEventListener("mousemove",this.onMouseMove)}}const r=new o},632:(e,t,i)=>{"use strict";i.d(t,{OD:()=>h,fl:()=>S,mr:()=>u,rz:()=>c,s2:()=>r,xE:()=>p,zM:()=>l});var s=i(410),n=i(2325);const a=["January","February","March","April","May","June","July","August","September","October","November","December"],o=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],r=86400,d=e=>{const t=new Date(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate())),i=t.getUTCDay()||7;t.setUTCDate(t.getUTCDate()+4-i);const s=new Date(Date.UTC(t.getUTCFullYear(),0,1));return Math.ceil(((t.getTime()-s.getTime())/r+1)/7)};function l(e){const t=new Date,i=t.getTime()/1e3|0,s=e.getTime()/1e3|0,a={};return i-s{const i=t.monthAsNumber?".":" ",s=("0"+e.getHours()).slice(-2)+":"+("0"+e.getMinutes()).slice(-2)+(t.noSeconds?"":":"+("0"+e.getSeconds()).slice(-2));return(t.leadingZero?("0"+e.getDate()).slice(-2):e.getDate())+i+(t.monthAsNumber?("0"+(e.getMonth()+1)).slice(-2):a[e.getMonth()])+i+e.getFullYear()+(t.noTime?"":", "+s)},f=2013,m=new RegExp("20[0-9]{1,2}"),g=new RegExp("(\\w{3,}) ([0-9]{0,4})","i"),v=new RegExp("([0-9]{0,4}) (\\w{2,})","i"),b=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"),w=[31,29,31,30,31,30,31,31,30,31,30,31];function S(e,t){const i=e.trim().toLowerCase();if(i.length<3)return;if(0==="today".indexOf(i)){const e=new Date,i=e.getFullYear(),s=e.getMonth(),n=e.getDate();e.setFullYear(i,s,n),e.setHours(0,0,0);const a=e.getTime();e.setFullYear(i,s,n+1),e.setHours(0,0,0);const o=e.getTime()-1;return void t.push({title:"Today",minDate:a,maxDate:o})}if(0==="yesterday".indexOf(i)){const e=new Date,i=e.getFullYear(),s=e.getMonth(),n=e.getDate();e.setFullYear(i,s,n),e.setHours(0,0,0);const a=e.getTime()-864e5;e.setFullYear(i,s,n+1),e.setHours(0,0,0);const o=e.getTime()-86400001;return void t.push({title:"Yesterday",minDate:a,maxDate:o})}const s=function(e){const t=new Date;if(e.length<=3)return-1;for(let i=0;i<7;i++)if(t.setDate(t.getDate()+1),0===P(t.getTime()).toLowerCase().indexOf(e))return t.getDay();return-1}(i);if(s>=0){const e=new Date,i=e.getTime(),n=s-e.getDay();e.setDate(e.getDate()+n),e.getTime()>i&&e.setTime(e.getTime()-6048e5);const a=e.getFullYear(),o=e.getMonth(),r=e.getDate();e.setFullYear(a,o,r),e.setHours(0,0,0);const d=e.getTime();e.setFullYear(a,o,r+1),e.setHours(0,0,0);const l=e.getTime()-1;return void t.push({title:P(d),minDate:d,maxDate:l})}let n;if(null===(n=b.exec(i)))if(null===(n=y.exec(i)))if(null===(n=m.exec(i))){if(null!==(n=g.exec(i))){const e=n[1],i=n[2],s=T(e);if(s>=0){const e=+i;if(e>0&&e<=31)return void L(t,e-1,s);if(e>=f)return void C(t,s,e)}}if(null!==(n=v.exec(i))){const e=n[1],i=T(n[2]);if(i>=0){const s=+e;if(s>0&&s<=31)return void L(t,s-1,i);s>=f&&C(t,i,s)}}}else{let e=+i;const s=(new Date).getFullYear();if(e=e;i--){const e=new Date;e.setFullYear(i,0,1),e.setHours(0,0,0);const s=e.getTime();e.setFullYear(i+1,0,1),e.setHours(0,0,0);const n=e.getTime()-1;t.push({title:""+i,minDate:s,maxDate:n})}}else if(e<=s){const i=new Date;i.setFullYear(e,0,1),i.setHours(0,0,0);const s=i.getTime();i.setFullYear(e+1,0,1),i.setHours(0,0,0);const n=i.getTime()-1;t.push({title:""+e,minDate:s,maxDate:n})}}else{const e=n[1],i=n[3],s=n[5];if(!n[2]===n[4])return;const a=parseInt(e),o=parseInt(i)-1;let r=parseInt(s);r>=10&&r<=99&&(r+=2e3);const d=(new Date).getFullYear();if(Z(a-1,o)&&r>=f&&r<=d){const e=new Date;e.setFullYear(r,o,a),e.setHours(0,0,0);const i=e.getTime();e.setFullYear(r,o,a+1),e.setHours(0,0,0);const s=e.getTime()-1;return void t.push({title:M(i),minDate:i,maxDate:s})}}else{const e=n[1],i=n[3],s=parseInt(e),a=parseInt(i);if(s>0&&s<=31){if(a>=f&&s<=12)return void C(t,s-1,a);a<=12&&L(t,s-1,a-1)}else s>=f&&a<=12&&C(t,a-1,s)}}function C(e,t,i){const s=(new Date).getFullYear(),n=Date.now();if(i>=f&&i<=s){const s=new Date;s.setFullYear(i,t,1),s.setHours(0,0,0);const a=s.getTime();if(a>n)return;s.setMonth(s.getMonth()+1);const o=s.getTime()-1;e.push({title:E(a),minDate:a,maxDate:o})}}function L(e,t,i){if(Z(t,i)){const n=(new Date).getFullYear(),a=Date.now();for(let o=n;o>=f;o--){if(1===i&&28===t&&((s=o)%4!=0||s%100==0)&&s%400!=0)continue;const r=new Date;r.setFullYear(o,i,t+1),r.setHours(0,0,0);const d=r.getTime();if(d>a)continue;r.setFullYear(o,i,t+2),r.setHours(0,0,0);const l=r.getTime()-1;o===n?e.push({title:I(d),minDate:d,maxDate:l}):e.push({title:M(d),minDate:d,maxDate:l})}}var s}function E(e){const t=new Date(e);return a[t.getMonth()].slice(0,3)+" "+t.getFullYear()}function I(e){const t=new Date(e);return a[t.getMonth()].slice(0,3)+" "+t.getDate()}function M(e){const t=new Date(e);return("0"+t.getDate()).slice(-2)+"."+("0"+(t.getMonth()+1)).slice(-2)+"."+t.getFullYear()}function P(e){const t=new Date(e);return o[t.getDay()]}function Z(e,t){return t>=0&&t<12&&e>=0&&e{"use strict";i.d(t,{Z:()=>d});var s=i(2796),n=i(2166),a=i(3910),o=i(2738);const r="https://t.me/";function d(e={}){const t=document.createElement("a");t.classList.add("anchor-copy");let i,d="LinkCopied";if(e.mePath){const s=r+e.mePath;i=t.href=t.innerText=s}if(e.username){const s=r+e.username;t.href=s,i=t.innerText="@"+e.username,d="UsernameCopied"}return(0,o.fc)(t,(e=>{(0,a.Z)(e),(0,n.T)(null!=i?i:t.href),(0,s.bC)({langPackKey:d})})),t}},6976:(e,t,i)=>{"use strict";i.d(t,{E:()=>c,s:()=>l});var s=i(5432),n=i(4762),a=i(3416),o=i(3910);let r=!1,d=0;function l(){d&&clearTimeout(d),d=window.setTimeout((()=>{d=0,r=!1}),400),r=!0}function c({element:e,callback:t,listenerSetter:i,listenerOptions:d}){const l=i?i.add(e):e.addEventListener.bind(e),c=i?i.removeManual.bind(i,e):e.removeEventListener.bind(e);if(n.IS_APPLE&&s.Z||d){let e;const i=Object.assign(Object.assign({},d||{}),{capture:!0}),s=()=>{clearTimeout(e),c("touchmove",s,i),c("touchend",s,i),c("touchcancel",s,i)};l("touchstart",(n=>{n.touches.length>1?s():(l("touchmove",s,i),l("touchend",s,i),l("touchcancel",s,i),e=window.setTimeout((()=>{r?s():(t(n),s(),a.Z.isOpened()&&l("touchend",o.Z,{once:!0}))}),400))}),d)}else l("contextmenu",s.Z?e=>{t(e),a.Z.isOpened()&&l("touchend",o.Z,{once:!0})}:t,d)}},5077:(e,t,i)=>{"use strict";function s(e,t,i,s){const n=e=>{i({x:e.pageX,y:e.pageY,event:e})},a=t=>{document.removeEventListener("mousemove",n),e.addEventListener("mousedown",o,{once:!0}),null==s||s({x:t.pageX,y:t.pageY,event:t})},o=i=>{0===i.button?(t({x:i.pageX,y:i.pageY,event:i}),n(i),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(),i({x:e.touches[0].clientX,y:e.touches[0].clientY,isTouch:!0,event:e})},d=t=>{document.removeEventListener("touchmove",r),e.addEventListener("touchstart",l,{passive:!1,once:!0});const i=t.touches[0]||t.changedTouches[0];null==s||s({x:i.clientX,y:i.clientY,isTouch:!0,event:t})},l=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",d,{passive:!1,once:!0})};return e.addEventListener("touchstart",l,{passive:!1,once:!0}),()=>{e.removeEventListener("mousedown",o),document.removeEventListener("mousemove",n),document.removeEventListener("mouseup",a),e.removeEventListener("touchstart",l),document.removeEventListener("touchmove",r),document.removeEventListener("touchend",d)}}i.d(t,{Z:()=>s})},6760:(e,t,i)=>{"use strict";function s(){window.getSelection?window.getSelection().empty?window.getSelection().empty():window.getSelection().removeAllRanges&&window.getSelection().removeAllRanges():document.selection&&document.selection.empty()}i.d(t,{Z:()=>s})},2738:(e,t,i)=>{"use strict";i.d(t,{EN:()=>r,fc:()=>o,pf:()=>a,tH:()=>d});var s=i(5432),n=i(6669);const a=s.Z?"mousedown":"click";function o(e,t,i={}){const s=i.listenerSetter?i.listenerSetter.add(e):e.addEventListener.bind(e),n=i.listenerSetter?i.listenerSetter.removeManual.bind(i.listenerSetter,e):e.removeEventListener.bind(e);return i.touchMouseDown=!0,s(a,t,i),()=>n(a,t,i)}function r(e,t,i){e.removeEventListener(a,t,i)}function d(e){(0,n.Z)(e,a)}},7529:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(5432),n=i(3241),a=i(5953),o=i(8497);class r extends n.Z{constructor(){super(!1),this.hideControls=(e=!1)=>{if(e)return void(this.hideControlsTimeout||(this.hideControlsTimeout=window.setTimeout(this.hideControls,3e3)));clearTimeout(this.hideControlsTimeout),this.hideControlsTimeout=0;const t=this.element.classList.contains("show-controls");if(!1!==this.controlsLocked){if(this.canHideControls&&!this.canHideControls()||!t||this.controlsLocked)return}else if(!t)return;this.dispatchEvent("toggleControls",!1),this.element.classList.remove("show-controls")},this.showControls=(e=!0)=>{this.hideControlsTimeout?(clearTimeout(this.hideControlsTimeout),this.hideControlsTimeout=0):this.element.classList.contains("show-controls")||!1===this.controlsLocked||(this.dispatchEvent("toggleControls",!0),this.element.classList.add("show-controls")),e&&!this.controlsLocked&&(this.hideControlsTimeout=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.hideControlsTimeout=0}setup(e){(0,a.Z)(this,e);const{listenerSetter:t,element:i}=this;s.Z?t.add(i)("click",(e=>{this.ignoreClickClassName&&(0,o.Z)(e.target,this.ignoreClickClassName)||this.toggleControls()})):(t.add(i)("mousemove",(()=>{this.showControls()})),t.add(i)("mouseenter",(()=>{this.showControls(!1)})),t.add(i)("mouseleave",(e=>{e.relatedTarget&&this.showOnLeaveToClassName&&(0,o.Z)(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)}}},4531:(e,t,i)=>{"use strict";i.d(t,{Z:()=>h});var s=i(3003),n=i(2353),a=i(3416),o=i(3699),r=i(3624),d=i(1483),l=i(6976),c=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function h({buttons:e,findElement:t,listenTo:i,appendTo:h,filterButtons:u,onOpen:p,onClose:f,onBeforeOpen:m,listenerSetter:g}){null!=h||(h=document.body),null!=g||(g=new o.Z);const v=new o.Z,b=(0,r.k)();let y;(0,l.E)({element:i,callback:e=>{const s=t?t(e):i;if(!s)return;let n=y;if((e instanceof MouseEvent||e.hasOwnProperty("preventDefault"))&&e.preventDefault(),n&&n.classList.contains("active"))return!1;(e instanceof MouseEvent||e.hasOwnProperty("cancelBubble"))&&(e.cancelBubble=!0),(()=>{c(this,void 0,void 0,(function*(){yield null==p?void 0:p(s);const t=yield S();if(!t)return;n=t.element;const{cleanup:i,destroy:o}=t;(0,d.Z)(e,n),a.Z.openBtnMenu(n,(()=>{null==f||f(),i(),setTimeout((()=>{o()}),300)}))}))})()},listenerSetter:g});const w=()=>{v.removeAll(),b.clean()},S=()=>c(this,void 0,void 0,(function*(){w(),e.forEach((e=>e.element=void 0));const t=u||(e=>(0,n.Z)(e,(e=>!(null==e?void 0:e.verify)||e.verify()))),i=yield t(e);if(!i.length)return;const a=y=yield(0,s.Z)({buttons:i,listenerSetter:v});return a.classList.add("contextmenu"),yield null==m?void 0:m(),h.append(a),{element:a,cleanup:w,destroy:()=>{a.remove()}}}));return{element:y,destroy:()=>{w(),g.removeAll()}}}},3163:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(6787),n=i(9322),a=i(3512),o=i(4531),r=i(8497),d=i(3173),l=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function c(e){const{listenTo:t,isStickerPack:i,verifyRecent:c,appendTo:h,onOpen:u,onClose:p,onSend:f}=e;let m,g;const v=e=>l(this,void 0,void 0,(function*(){const t=yield a.Z.managers.acknowledged.appStickersManager.getFavedStickersStickers();if(!t.cached)return!1;const i=(yield t.result).some((e=>e.id===g.id));return e?!i:i}));return(0,o.Z)({listenTo:t,appendTo:h,findElement:e=>m=(0,r.Z)(e.target,"media-sticker-wrapper"),onOpen:()=>l(this,void 0,void 0,(function*(){return g=yield a.Z.managers.appDocsManager.getDoc(m.dataset.docId),null==u?void 0:u()})),onClose:p,buttons:[{icon:"stickers",text:"Context.ViewStickerSet",onClick:()=>new s.Z(g.stickerSetInput).show(),verify:()=>!i},{icon:"favourites",text:"AddToFavorites",onClick:()=>a.Z.managers.appStickersManager.faveSticker(g.id,!1),verify:()=>v(!0)},{icon:"favourites",text:"DeleteFromFavorites",onClick:()=>a.Z.managers.appStickersManager.faveSticker(g.id,!0),verify:()=>v(!1)},{icon:"delete",text:"DeleteFromRecent",onClick:()=>a.Z.managers.appStickersManager.saveRecentSticker(g.id,!0),verify:()=>{var e;return null!==(e=null==c?void 0:c(m))&&void 0!==e&&e}},{icon:"mute",text:"Chat.Send.WithoutSound",onClick:()=>(null==f||f(),d.Jo.sendDocId(g.id,!1,!0)),verify:()=>!(!n.ZP.chat.peerId||n.ZP.chat.peerId===a.Z.myId)},{icon:"schedule",text:"Chat.Send.ScheduledMessage",onClick:()=>n.ZP.chat.input.scheduleSending((()=>n.ZP.chat.input.sendMessageWithDocument(g))),verify:()=>!!n.ZP.chat.peerId}]})}},7660:(e,t,i)=>{"use strict";function s(e={}){const t=document.createElement("video");return e.pip||(t.disablePictureInPicture=!0),t.setAttribute("playsinline","true"),t}i.d(t,{Z:()=>s})},8222:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(410),n=i(3512),a=i(4755);const o=new class{constructor(){this.resetCache=()=>{this.computedStyle=void 0;const e=this.cache;this.cache={};for(const t in e)this.getProperty(t)},this.cache={},n.Z.addEventListener("theme_change",this.resetCache),a.Z.addEventListener("resize",this.resetCache)}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)}getPropertyAsSize(e){const t=this.getProperty(e);let i;return"%"===t[t.length-1]||(i=t.indexOf("rem")?16*+t.replace("rem",""):+t.replace("px","")),i}};s.GO&&(s.GO.customProperties=o);const r=o},6669:(e,t,i)=>{"use strict";function s(e,t){const i=new Event(t,{bubbles:!0,cancelable:!0});e.dispatchEvent(i)}i.d(t,{Z:()=>s})},1544:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4056);function n(e){return Array.from(e.childNodes).map((e=>e.nodeType===e.TEXT_NODE?(0,s.Z)(e.textContent):e.outerHTML)).join("")}},5975:(e,t,i)=>{"use strict";function s(e,t){if(!e)return null;if(e.parentElement===t)return e;for(;e.parentElement;)if((e=e.parentElement).parentElement===t)return e;return null}i.d(t,{Z:()=>s})},8763:(e,t,i)=>{"use strict";function s(e,t){return e.closest(`[${t}]`)}i.d(t,{Z:()=>s})},4668:(e,t,i)=>{"use strict";function s(e,t){return e.closest(t)}i.d(t,{Z:()=>s})},6733:(e,t,i)=>{"use strict";function s(e){e.requestFullscreen?e.requestFullscreen():e.mozRequestFullScreen?e.mozRequestFullScreen():e.webkitRequestFullscreen?e.webkitRequestFullscreen():e.msRequestFullscreen&&e.msRequestFullscreen()}function n(){document.cancelFullScreen?document.cancelFullScreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitCancelFullScreen?document.webkitCancelFullScreen():document.msExitFullscreen&&document.msExitFullscreen()}function a(e,t,i){const s=i?i.add(e):e.addEventListener.bind(e);"webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange".split(" ").forEach((e=>{s(e,t,!1)}))}function o(){return document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement}function r(){return!!o()}i.d(t,{C8:()=>n,Dj:()=>s,Ms:()=>a,W7:()=>o,rB:()=>r})},3299:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n,q:()=>a});var s=i(5975);function n(e,t){const i=document.getSelection(),n=i[t?"anchorNode":"focusNode"],o=i[t?"anchorOffset":"focusOffset"];return(0,s.Z)(n,e)||n===e?Object.assign(Object.assign({},a(e,n,o)),{selection:i}):{selection:i}}function a(e,t,i){if(t===e){const s=e.childNodes,n=s.length;n&&i>=n?i=((t=s[n-1]).textContent||t.alt||"").length:(t=s[i],i=0)}return{node:t,offset:i}}},9041:(e,t,i)=>{"use strict";i.d(t,{CS:()=>r,ZP:()=>c,o8:()=>n});var s=i(6854);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:"messageEntityCode"},strikethrough:{match:'[style*="line-through"], [style*="strikethrough"], strike, del, s',entityName:"messageEntityStrike"},link:{match:"A:not(.follow)",entityName:"messageEntityTextUrl"},mentionName:{match:"A.follow",entityName:"messageEntityMentionName"},spoiler:{match:'[style*="spoiler"]',entityName:"messageEntitySpoiler"}},a=new Set(["DIV","P","BR","LI","SECTION","H6","H5","H4","H3","H2","H1","TR","OL","UL"]),o=new RegExp(s.Z,"g"),r="";function d(e,t,i,s){const a=e.parentElement;for(const e in n){const o=n[e],r=a.closest(o.match+', [contenteditable="true"]');null===(null==r?void 0:r.getAttribute("contenteditable"))&&("messageEntityTextUrl"===o.entityName?i.push({_:o.entityName,url:r.href,offset:s.offset,length:t.length}):"messageEntityMentionName"===o.entityName?i.push({_:o.entityName,offset:s.offset,length:t.length,user_id:r.dataset.follow.toUserId()}):i.push({_:o.entityName,offset:s.offset,length:t.length}))}}function l(e){const{length:t}=e;return!t||e[t-1]===r&&t===r.length}function c(e,t,i,s,n,h,u={offset:0}){if(e.nodeType===e.TEXT_NODE){let t=e.nodeValue;return t=t.replace(o,""),t?s===e?i.push(t.substr(0,n)+r+t.substr(n)):i.push(t):s===e&&i.push(r),h&&t.length&&e.parentNode&&d(e,t,h,u),void(u.offset+=t.length)}if(e.nodeType!==e.ELEMENT_NODE)return;const p=s===e,f=a.has(e.tagName);if(f&&(i.length||"BR"===e.tagName))t.push(i.join("")),i.length=0,++u.offset;else{const t=e.dataset.stickerEmoji||e.alt,s=e.dataset.stickerEmoji;t&&h&&d(e,t,h,u),s&&h&&h.push({_:"messageEntityCustomEmoji",document_id:e.dataset.docId,offset:u.offset,length:t.length}),t&&(i.push(t),u.offset+=t.length)}p&&!n&&i.push(r);const m=e.matches('[style*="table-cell"], th, td'),g=null==h?void 0:h.length,v=t.length;let b=!0,y=e.firstChild;for(;y;)c(y,t,i,s,n,h,u),y=y.nextSibling,l(i)||(b=!1);if(b&&t.length!==v&&(b=!1),p&&n&&i.push(r),m&&e.nextSibling&&!l(i)&&(i.push(" "),++u.offset,void 0!==g))for(let e=g,t=h.length;e{"use strict";i.d(t,{Z:()=>r});var s=i(410),n=i(6875),a=i(1346),o=i(9041);function r(e,t=!0,i=!0){const s=[],r=[],{node:d,offset:l}=!(e instanceof DocumentFragment)&&i&&function(e){const t=window.getSelection();let i,s;if(null==t?void 0:t.rangeCount){const n=t.getRangeAt(0),a=n.startOffset;if(n.startContainer&&n.startContainer==n.endContainer&&a==n.endOffset){const t=a-1,o=e.childNodes;if(n.startContainer===e&&o[t]){i=o[t],s=0;for(let e=0;e{"use strict";i.d(t,{Z:()=>n});var s=i(8204);function n({overflowElement:e,overflowRect:t,selector:i,extraSize:n,elements:a}){null!=t||(t=e.getBoundingClientRect()),null!=a||(a=Array.from(e.querySelectorAll(i))),n&&(t={top:t.top-n,right:t.right+n,bottom:t.bottom+n,left:t.left-n});const o=[],r=[],d=[];let l=!1;for(const i of a){const n=i.getBoundingClientRect(),a=(0,s.Z)(i,e,!1,n,t);let c;a?(l=!0,c=r):c=l?d:o,c.push({element:i,rect:n,visibleRect:a})}return{invisibleTop:o,visible:r,invisibleBottom:d}}},8204:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(241);function n(e,t,i,n=e.getBoundingClientRect(),a=t.getBoundingClientRect()){let{top:o,right:r,bottom:d,left:l}=a;if(i){const e=t.querySelector(".sticky");e&&(o=e.getBoundingClientRect().bottom)}if(n.top>=d||n.bottom<=o||n.right<=l||n.left>=r)return null;const c={top:!1,right:!1,bottom:!1,left:!1,vertical:0,horizontal:0},h=s.Z.width,u=s.Z.height;return{rect:{top:n.topr&&r!==h?(c.right=!0,++c.horizontal,r):n.right,bottom:n.bottom>d&&d!==u?(c.bottom=!0,++c.vertical,d):n.bottom,left:n.left{"use strict";i.d(t,{Z:()=>r});var s=i(3757),n=i(3910),a=i(8497),o=i(3444);function r(e){let t=!1;return new s.Z(Object.assign(Object.assign({},e),{verifyTouchTarget:t=>!(0,a.Z)(t.target,"progress-line")&&!(0,o.Z)(t)&&(!e.verifyTouchTarget||e.verifyTouchTarget(t)),onSwipe:(i,s,a)=>{if(i*=-1,s*=-1,!t&&Math.abs(s)>20)return!0;if(Math.abs(i)>Math.abs(s))(0,n.Z)(a),t=!0;else if(!t&&Math.abs(s)>Math.abs(i))return!0;return e.onSwipe(i,s,a)},onReset:()=>{t=!1,e.onReset&&e.onReset()},cancelEvent:!1}))}},1154:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(6976),n=i(2416);function a(e){return(0,n.Z)(Object.assign(Object.assign({},e),{onSwipe:(t,i,n)=>{if(t*=-1,i*=-1,Math.abs(t)>50)return e.onSwipe(t,i,n),(0,s.s)(),!0}}))}},5705:(e,t,i)=>{"use strict";function s(e){if(e instanceof DocumentFragment)return e;const t=document.createElement("template");return e=e.trim(),t.innerHTML=e,t.content}i.d(t,{Z:()=>s})},2614:(e,t,i)=>{"use strict";function s(e){const t=document.createElement("span");return"string"==typeof e?t.innerHTML=e:t.append(e),t}i.d(t,{Z:()=>s})},8487:(e,t,i)=>{"use strict";function s(e){return null==e?void 0:e.isConnected}i.d(t,{Z:()=>s})},1293:(e,t,i)=>{"use strict";function s(e){return e.isContentEditable||"INPUT"!==e.tagName?!e.textContent.trim()&&!e.querySelector(".emoji, .custom-emoji, .custom-emoji-placeholder"):!e.value.trim()}i.d(t,{Z:()=>s})},6299:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(3512),n=i(4762);function a(e){if("Enter"===e.key&&!n.IS_MOBILE&&!e.isComposing){if("enter"===s.Z.settings.sendShortcut){if(e.shiftKey||e.ctrlKey||e.metaKey)return;return!0}{const t=n.IS_APPLE?e.metaKey:e.ctrlKey;if(e.shiftKey||(n.IS_APPLE?e.ctrlKey:e.metaKey))return;if(t)return!0}}return!1}},3444:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4762);function n(e){return s.IS_MOBILE_SAFARI&&e instanceof TouchEvent&&e.touches[0].clientX<30}},2398:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(5432);function n(e,t=!1,i=!0){if(!s.Z||t&&("INPUT"===document.activeElement.tagName||document.activeElement.isContentEditable))if(i&&e.focus(),e instanceof HTMLInputElement){const t=e.value.length;e.selectionStart=t,e.selectionEnd=t}else{const t=document.createRange();t.selectNodeContents(e),t.collapse(!1);const i=window.getSelection();i.removeAllRanges(),i.addRange(t)}}window.placeCaretAtEnd=n},4484:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(2648);function n(e,t,i,n){return void 0===n&&(n=e.parentElement===t?(0,s.Z)(e):-1),n!==i&&(-1!==n&&ni?t.insertBefore(e,t.children[i]):t.append(e):t.prepend(e),!0)}},6740:(e,t,i)=>{"use strict";i.d(t,{ZP:()=>o,cj:()=>r});var s=i(925);const n={},a=(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 o(e,t,i,o=!0){if(!t)return console.error("renderImageFromUrl: no url?",e,t),void(null==i||i());const r=e instanceof HTMLVideoElement;if(n[t]&&o||r)e&&a(e,t),i&&(r?(0,s.Z)(e).then(i):null==i||i());else{const s=e instanceof HTMLImageElement,o=s?e:new Image;o.src=t;const r=()=>{!s&&e&&a(e,t),n[t]=!0,null==i||i(),o.removeEventListener("error",d)},d=e=>{console.error("Render image from url failed:",e,t,o),o.removeEventListener("load",r),null==i||i()};o.addEventListener("load",r,{once:!0}),o.addEventListener("error",d,{once:!0})}}function r(e,t,i){return new Promise((s=>{o(e,t,s,i)}))}},2830:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(9674),n=i(6740);function a(e,t,i,a,o=e,r){return a&&t.classList.add("fade-in"),(0,n.cj)(t,i).then((()=>s.Z.mutateElement(e,(()=>{o.append(t),a?t.addEventListener("animationend",(()=>{s.Z.mutate((()=>{t.classList.remove("fade-in"),null==r||r.remove()}))}),{once:!0}):null==r||r.remove()}))))}},5565:(e,t,i)=>{"use strict";function s(e,t){if("string"==typeof t)return void(e.innerHTML=t);const i=e.firstChild;i?e.lastChild===i?i.replaceWith(t):(e.textContent="",e.append(t)):e.append(t)}i.d(t,{Z:()=>s})},669:(e,t,i)=>{"use strict";i.d(t,{Y:()=>m,Z:()=>g});var s=i(4762),n=i(5003),a=i(5400),o=i(3699),r=i(6854),d=i(3228),l=i(5975),c=i(2648);function h(e,t,i,s){let n;if(e===i)n=t-s;else if(e.parentElement===i.parentElement)n=(0,c.Z)(e,!0)-(0,c.Z)(i,!0);else{const t=[];let s=e.parentElement;do{t.push(s)}while(s=s.parentElement);s=i.parentElement;do{if(t.includes(s))break}while(s=s.parentElement);const a=s;e=(0,l.Z)(e,a),i=(0,l.Z)(i,a),n=(0,c.Z)(e,!0)-(0,c.Z)(i,!0)}return(0,d.Z)(n,-1,1)}window.compareNodes=h;var u=i(3299),p=i(2398);const f=new RegExp(`[^${r.Z}]`),m=!1;class g{constructor(){this.saveSelectionOnChange=e=>{const t=document.activeElement;this.saveRangeForElement(t)},this.onFocusOut=e=>{this.lastNode=this.lastOffset=void 0},this.onSelectionChange=e=>{var t;const{input:i}=this;if(!i)return void this.setSelectionClassName(document.getSelection());let s=this.getCaretPosN();for(;;){const{node:e,offset:n,selection:a,move:o}=s;if((null==e?void 0:e.nodeValue)!==r.Z||!this.lastNode)break;const d=h(e,n,this.lastNode,this.lastOffset)<0;void 0!==d&&(a.isCollapsed?this.superMove(i,s,d,!0):a.modify(a.isCollapsed?"move":"extend",d?"backward":"forward","character")),this.log("selectionchange",e,n,this.lastNode,this.lastOffset,e===this.lastNode,(0,c.Z)(this.getFiller(e)),(0,c.Z)(this.getFiller(this.lastNode)),d,a,document.getSelection(),document.getSelection().getRangeAt(0),null==e?void 0:e.parentNode,null===(t=this.lastNode)||void 0===t?void 0:t.parentNode),s=this.getCaretPosN(),this.lastNode=e,this.lastOffset=n;break}this.lastNode=this.lastOffset=void 0,this.setSelectionClassName(s.selection,i)},this.onBeforeInput=e=>{var t;const{input:i,log:s}=this;if(!i)return;const n=this.addInputCallback.bind(this,i),a=this.getCaretPosN();let{node:o,offset:d,selection:l,move:c}=a;if(s("beforeinput",e,o,d,l,a),this.lastNode=this.lastOffset=void 0,e.inputType.startsWith("delete")){if(n((()=>{this.processEmptiedFillers(i),this.removeExtraBOMs(i),this.fixInsertedLineBreaks(i)})),(null==o?void 0:o.nodeValue)===r.Z&&l.isCollapsed&&e.inputType.includes("deleteContent")){const t=e.inputType.includes("Backward"),s=d===r.Z.length&&t||!d&&!t;this.superMove(i,a,t,s)}}else{if(e.inputType.startsWith("insert")){if(null===(t=null==o?void 0:o.classList)||void 0===t?void 0:t.contains("input-something")){o=o.previousSibling.firstChild;const e=l.getRangeAt(0);e.setStart(o,0),e.setEnd(o,0),e.collapse(!0);const t=this.getCaretPosN();o=t.node,l=t.selection,d=t.offset}if(o&&o.textContent===r.Z&&d===r.Z.length){l.modify("move","backward","character");const e=this.getCaretPosN();o=e.node,l=e.selection,d=e.offset}e.inputType;{o&&o.nodeType===o.ELEMENT_NODE&&(o=o.firstChild,s.warn("fixing focus on span"));const t=(null==o?void 0:o.nodeValue)===r.Z;if(s("inserting line break",t,o,`"${null==o?void 0:o.nodeValue}"`,(null==o?void 0:o.parentElement)?Array.from(o.parentElement.childNodes).slice():[]),t){const e=o.parentElement;e.classList.replace("input-filler","input-filler-text"),e.childNodes.length,n((()=>{e.childNodes.length>1?(s("inserting line break, remove"),o=Array.from(e.childNodes).find((e=>e.nodeValue===r.Z)),e.t=o):o.nodeValue!==r.Z&&(s("inserting line break, deleteData"),o.deleteData(o.nodeValue.indexOf(r.Z),r.Z.length)),this.fixInsertedLineBreaks(i)}))}else"insertLineBreak"===e.inputType&&n((()=>{this.fixInsertedLineBreaks(i)}))}return}"historyUndo"===e.inputType?n((()=>{this.processFilledFillers(i),this.processEmptiedFillers(i),this.removeExtraBOMs(i),this.removeEmptyTextNodes(i),this.fixBuggedCaret()})):"historyRedo"===e.inputType&&n((()=>{this.processFilledFillers(i),this.processEmptiedFillers(i),i.querySelectorAll(".input-something:not([contenteditable])").forEach((e=>{e.contentEditable="false"})),this.removeExtraBOMs(i),this.fixBuggedCaret()}))}},this.onKeyDown=e=>{var t;const i=e.key;if("ArrowDown"===i||"ArrowUp"===i)this.lastNode=this.lastOffset=void 0;else{const{node:e,offset:t}=this.getCaretPosN();this.lastNode=e,this.lastOffset=t,this.lastNode===this.input&&(this.lastNode=this.lastOffset=void 0)}this.log("keydown",this.lastNode,null===(t=this.lastNode)||void 0===t?void 0:t.parentNode,this.lastOffset,this.getCaretPosN(),e)},this.log=(0,n.kg)("RICH-INPUT"),this.listenerSetter=new o.Z,this.savedRanges=new WeakMap,this.listenerSetter.add(document)("selectionchange",this.saveSelectionOnChange),m&&(this.listenerSetter.add(document)("focusout",this.onFocusOut),this.listenerSetter.add(document)("selectionchange",this.onSelectionChange),this.listenerSetter.add(document)("beforeinput",this.onBeforeInput),this.listenerSetter.add(document)("keydown",this.onKeyDown,{capture:!0}),s.IS_FIREFOX&&(this.inputCaptureCallbacks=[],this.listenerSetter.add(document)("input",(()=>{this.inputCaptureCallbacks.forEach((e=>e())),this.inputCaptureCallbacks.length=0}),{capture:!0})))}get input(){const e=document.getSelection(),{anchorNode:t}=e;if(t)return(t.closest?t:t.parentElement).closest('[contenteditable="true"]')}saveRangeForElement(e){e&&(e.isContentEditable||"INPUT"===e.tagName)&&document.getSelection().rangeCount&&this.savedRanges.set(e,document.getSelection().getRangeAt(0))}findPreviousSmthIndex(e,t,i){const s=Array.from(null!=i?i:e.querySelectorAll(".input-something")),n=s.findIndex((e=>h(e,0,t,0)>=0));return-1===n?s.length-1:Math.max(0,n-1)}superMove(e,t,i,s){var n,a;const{node:o,offset:d,move:l}=t,c=e.querySelectorAll(".input-something"),h=this.findPreviousSmthIndex(e,o,c),u=document.createRange();u[i?"setEnd":"setStart"](o,d),s&&l(i);const p=this.getCaretPosN();if((null===(n=p.node)||void 0===n?void 0:n.nodeValue)===r.Z&&(!s||o===this.lastNode)){const t=this.findPreviousSmthIndex(e,p.node,c);let n=!s;for(;;){const s=this.getCaretPosN(),d=this.findPreviousSmthIndex(e,s.node,c);u[i?"setStart":"setEnd"](s.node,s.offset);const p=u.toString(),m=!f.test(p);if(this.log("test cursor",p,m,t,d),!m||(null===(a=s.node)||void 0===a?void 0:a.nodeValue)!==r.Z||d!==t||!d&&!s.offset||!(d{e.classList.add("br-not-br")}))}fixBuggedCaret(){const e=document.getSelection(),t=e.getRangeAt(0);e.removeAllRanges(),e.addRange(t)}addInputCallback(e,t,i=!0){const n=()=>{this.log("input modify callback"),t()};i&&s.IS_FIREFOX?this.inputCaptureCallbacks.push(n):this.listenerSetter.add(e)("input",n,{once:!0,capture:i})}removeExtraBOMs(e){const t=e=>{var t;return null===(t=null==e?void 0:e.classList)||void 0===t?void 0:t.contains("input-something")};e.querySelectorAll(".input-filler").forEach((e=>{var i;const{previousSibling:s,nextSibling:n}=e;let o=!1;!(null===(i=null==n?void 0:n.classList)||void 0===i?void 0:i.contains("input-filler"))&&(0,a.Hc)(n)&&(o=t(s)||t(n)),o||(this.log.warn("removing empty bom node",e),e.remove())}))}getFiller(e){return e&&e.nodeType===e.TEXT_NODE&&e.parentElement!==this.input?e.parentElement:e}getCaretPosN(){const e=(0,u.Z)(this.input);return Object.assign(Object.assign({},e),{move:this.move.bind(this,e.selection)})}removeEmptyTextNodes(e){const{log:t}=this,i=document.createTreeWalker(e,NodeFilter.SHOW_TEXT,{acceptNode:t=>t.parentElement!==e||t.nodeValue?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT});let s;for(;s=i.nextNode();)t.warn("removing empty text node",s),s.remove()}removePossibleBOMSiblings(e,t){[e,t].forEach((e=>{var t;(null===(t=null==e?void 0:e.classList)||void 0===t?void 0:t.contains("input-filler"))&&e.remove()}))}removePossibleBOMSiblingsByNode(e){const{previousSibling:t,nextSibling:i}=e;this.removePossibleBOMSiblings(t,i)}processEmptiedFillers(e){e.querySelectorAll(".input-filler-text").forEach((e=>{var t;this.removeExtraBOMs(e);let i=!0;if(e.textContent)f.test(e.textContent)||e.querySelector(".input-something")?i=!1:e.classList.replace("input-filler-text","input-filler");else{e.classList.replace("input-filler-text","input-filler");const i=Array.from(e.childNodes).find((e=>e.nodeType===e.TEXT_NODE));i?i.insertData(0,r.Z):(null===(t=e.t)||void 0===t?void 0:t.nodeValue)?e.append(e.t):e.append(document.createTextNode(r.Z))}i&&this.removePossibleBOMSiblingsByNode(e)}))}processFilledFillers(e){e.querySelectorAll(".input-filler").forEach((e=>{if(e.textContent!==r.Z){e.classList.replace("input-filler","input-filler-text");const t=e.t,i=Array.from(e.childNodes).find((e=>e.nodeType===e.TEXT_NODE&&e.nodeValue.includes(r.Z)));if(i&&!(null==t?void 0:t.nodeValue)){const e=i.nodeValue.indexOf(r.Z);-1!==e&&i.deleteData(e,r.Z.length)}}}))}setSelectionClassName(e,t){if(e.rangeCount){const i=e.getRangeAt(0);t?Array.from(t.querySelectorAll(".input-selectable")).forEach((e=>{e.classList.toggle("selection",!i.collapsed&&i.intersectsNode(e))})):Array.from(document.querySelectorAll(".input-selectable.selection")).forEach((e=>e.classList.remove("selection")))}}move(e,t){const{focusNode:i,focusOffset:s}=e;e.modify("extend",t?"backward":"forward","character"),t?e.collapseToStart():e.collapseToEnd();const{focusNode:n,focusOffset:a}=e;this.log("moving cursor",t,i,i.nodeType===i.ELEMENT_NODE?i:i.parentElement,s,n,n.nodeType===n.ELEMENT_NODE?n:n.parentElement,a)}prepareApplyingMarkdown(){const{input:e}=this,t=e.querySelectorAll(".input-filler"),i=e.querySelectorAll(".input-something");return i.forEach((e=>{e.contentEditable="inherit"})),()=>{t.forEach((e=>{e.contentEditable="inherit"})),i.forEach((e=>{e.contentEditable="false"})),this.removeExtraBOMs(e)}}static getInstance(){var e;return null!==(e=this.INSTANCE)&&void 0!==e?e:this.INSTANCE=new g}}},2914:(e,t,i)=>{"use strict";i.d(t,{Z:()=>f});var s=i(3757),n=i(5432),a=i(3512),o=i(3228),r=i(5953),d=i(5418),l=i(3910),c=i(2738),h=i(5975),u=i(4484),p=i(2648);class f{constructor(e){this.onSwipe=(e,t)=>{t=(0,o.Z)(t,this.minY,this.maxY),this.element.style.transform=`translateY(${t}px)`;const i=Math.round(Math.abs(t)/this.elementRect.height),s=this.siblings;this.siblings=[];const n=t<0?"previousElementSibling":"nextElementSibling";let a=this.element[n];for(let e=0;e{this.siblings.includes(e)||(e.style.transform="")})),this.siblings.forEach((e=>{const i=this.elementRect.height*(t<0?1:-1);e.style.transform=`translateY(${i}px)`})),this.scrollableRect){const e=t,i=e>0,s=(i?this.elementRect.bottom:this.elementRect.top)+e-this.addScrollPos;let n=2;s+(i?0:this.elementRect.height)>=this.scrollableRect.bottom||(s-(i?this.elementRect.height:0)<=this.scrollableRect.top?n*=-1:n=void 0),void 0!==n&&(this.scrollable.container[this.scrollable.scrollProperty]+=n)}},this.verifyTouchTarget=e=>!this.list.classList.contains("is-reordering")&&(this.element=this.getSortableTarget(e.target),!!this.element),this.onScroll=()=>{const e=this.scrollable.container[this.scrollable.scrollProperty],t=this.addScrollPos=e-this.startScrollPos,i="scrollTop"===this.scrollable.scrollProperty;this.swipeHandler.add(i?0:t,i?t:0)},this.onStart=()=>{this.list.classList.add("is-reordering"),this.element.classList.add("is-dragging","no-transition"),this.swipeHandler.setCursor("grabbing"),this.elementRect=this.element.getBoundingClientRect(),this.containerRect=this.list.getBoundingClientRect(),this.minY=this.containerRect.top-this.elementRect.top,this.maxY=this.containerRect.bottom-this.elementRect.bottom,this.addScrollPos=0,this.scrollable&&(this.startScrollPos=this.scrollable.container[this.scrollable.scrollProperty],this.scrollableRect=this.scrollable.container.getBoundingClientRect(),this.scrollable.container.addEventListener("scroll",this.onScroll))},this.onReset=()=>{return e=this,t=void 0,s=function*(){const e=this.siblings.length,t=e&&e*(this.siblings[0].previousElementSibling===this.element?1:-1),i=(0,p.Z)(this.element),s=i+t;this.element.classList.remove("no-transition"),this.element.style.transform=t?`translateY(${t*this.elementRect.height}px)`:"",this.swipeHandler.setCursor(""),this.scrollable&&this.scrollable.container.removeEventListener("scroll",this.onScroll),n.Z||(0,c.fc)(document.body,l.Z,{capture:!0,once:!0}),a.Z.settings.animationsEnabled&&(yield(0,d.Z)(250)),this.list.classList.remove("is-reordering"),this.element.classList.remove("is-dragging"),(0,u.Z)(this.element,this.list,s,i),[this.element,...this.siblings].forEach((e=>{e.style.transform=""})),this.element=this.siblings=this.elementRect=this.containerRect=this.minY=this.maxY=this.startScrollPos=this.addScrollPos=void 0,t&&this.onSort(i,s)},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s},(0,r.Z)(this,e),this.swipeHandler=new s.Z({element:this.list,onSwipe:this.onSwipe,verifyTouchTarget:this.verifyTouchTarget,onStart:this.onStart,onReset:this.onReset,setCursorTo:document.body,middleware:this.middleware,withDelay:!0})}getSortableTarget(e){if(!e)return;let t=(0,h.Z)(e,this.list);return t&&t.classList.contains("cant-sort")&&(t=void 0),t}}},1656:(e,t,i)=>{"use strict";function s(e,t){return t?e.forEach((e=>e.setAttribute("disabled","true"))):e.forEach((e=>e.removeAttribute("disabled"))),()=>s(e,!t)}i.d(t,{Z:()=>s})},2648:(e,t,i)=>{"use strict";function s(e,t){if(!e.parentNode)return-1;if(t)return Array.from(e.parentNode.childNodes).indexOf(e);let i=0;for(;null!==(e=e.previousElementSibling);)++i;return i}i.d(t,{Z:()=>s})},6339:(e,t,i)=>{"use strict";i.d(t,{Z:()=>h});var s=i(2738),n=i(5975),a=i(3241),o=i(5432),r=i(5953),d=i(6385),l=i(8497),c=i(3512);class h extends a.Z{constructor(e){super(!1),this.onClickOut=e=>{const t=e.target;(0,n.Z)(t,this.element)||Array.from(this.ignoreButtons).some((e=>(0,n.Z)(t,e)||t===e))||!(this.ignoreMouseOut.size<=1)||this.ignoreOutClickClassName&&(0,l.Z)(t,this.ignoreOutClickClassName)||this.toggle(!1)},this.onMouseOut=e=>{if(!this.isActive())return;if(this.clearTimeout("toggle"),this.ignoreMouseOut.size)return;const t=e.toElement;t&&(0,n.Z)(t,this.element)||this.setTimeout("toggle",(()=>{this.toggle(!1)}),200)},this.toggle=e=>{return t=this,i=void 0,a=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())return;const i=o.Z||!c.Z.settings.animationsEnabled?0:200;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"),this.dispatchEvent("openAfterLayout"),d.Z.pushItem(this.navigationItem={type:"dropdown",onPop:()=>{this.toggle(!1)}}),this.clearTimeout("toggle"),this.setTimeout("done",(()=>{this.forceClose=!1,this.dispatchEvent("opened")}),i)}else this.dispatchEvent("close"),this.ignoreMouseOut.clear(),this.ignoreButtons.clear(),this.element.classList.remove("active"),d.Z.removeItem(this.navigationItem),(0,s.EN)(window,this.onClickOut,{capture:!0}),this.clearTimeout("toggle"),this.setTimeout("done",(()=>{this.element.style.display="none",this.forceClose=!1,this.dispatchEvent("closed")}),i)},new((n=void 0)||(n=Promise))((function(e,s){function o(e){try{d(a.next(e))}catch(e){s(e)}}function r(e){try{d(a.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(t,i||[])).next())}));var t,i,n,a},(0,r.Z)(this,e),this.forceClose=!1,this.inited=!1,this.ignoreMouseOut=new Set,this.ignoreButtons=new Set,this.timeouts={}}attachButtonListener(e,t){let i=!0;o.Z?(0,s.fc)(e,(()=>{i?(i=!1,this.toggle(!0)):this.toggle()}),{listenerSetter:t}):(t.add(e)("mouseover",(s=>{i&&(t.add(e)("mouseout",(e=>{this.clearTimeout("toggle"),this.onMouseOut(e)})),i=!1),this.setTimeout("toggle",(()=>{this.toggle(!0)}),200)})),(0,s.fc)(e,(()=>{const t="click",i=!this.ignoreMouseOut.has(t);i&&!this.ignoreMouseOut.size&&(this.ignoreButtons.add(e),setTimeout((()=>{(0,s.fc)(window,this.onClickOut,{capture:!0})}),0)),this.setIgnoreMouseOut(t,i),this.toggle(i)}),{listenerSetter:t}))}clearTimeout(e){void 0!==this.timeouts[e]&&(clearTimeout(this.timeouts[e]),delete this.timeouts[e])}setTimeout(e,t,i){this.clearTimeout(e),this.timeouts[e]=window.setTimeout((()=>{this.clearTimeout(e),t()}),i)}init(){o.Z||(this.element.onmouseout=this.onMouseOut,this.element.onmouseover=e=>{this.forceClose||this.clearTimeout("toggle")})}isActive(){return this.element.classList.contains("active")}setIgnoreMouseOut(e,t){t?this.ignoreMouseOut.add(e):this.ignoreMouseOut.delete(e)}}},4789:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l,f:()=>s});var s,n=i(8594),a=i(3035),o=i(5296),r=i(3512),d=i(8487);function l(e){var t,i,o;if(null!==(t=e.margin)&&void 0!==t||(e.margin=0),null!==(i=e.maxDistance)&&void 0!==i||(e.maxDistance=1500),null!==(o=e.axis)&&void 0!==o||(e.axis="y"),r.Z.settings.animationsEnabled&&0!==e.forceDuration||(e.forceDirection=s.Static),e.forceDirection===s.Static)return e.forceDuration=0,c(e);const d=(0,a.AD)().then((()=>c(e)));return"y"===e.axis?(0,n.YW)(d):d}function c(e){const{element:t,container:i,getNormalSize:s,getElementPosition:n,transitionFunction:a,axis:r,margin:l,position:p,forceDirection:f,maxDistance:m,forceDuration:g}=e;if(!(0,d.Z)(t))return(0,o.Kx)(i),Promise.resolve();const v="y"===r?"top":"left",b="y"===r?"bottom":"right",y="y"===r?"height":"width",w="y"===r?"scrollHeight":"scrollWidth",S="y"===r?"scrollHeight":"offsetWidth",C="y"===r?"scrollTop":"scrollLeft",L=t.getBoundingClientRect(),E=i.getBoundingClientRect?i.getBoundingClientRect():document.body.getBoundingClientRect(),I=L[v]-E[v],M=n?n({elementRect:L,containerRect:E,elementPosition:I}):I,P=t[S],Z=s?s({rect:E}):E[y];let T=i[C];const k=i[w];let x;switch(p){case"start":x=M-l;break;case"end":x=L[b]-E[b]+l;break;case"nearest":case"center":if(Pm?(T=i.scrollTop+=x-m,x=m):x<-m&&(T=i.scrollTop+=x+m,x=-m)),x<0){const e=-T;x=Math.max(x,e)}else if(x>0){const e=k-(T+Z);x=Math.min(x,e)}const A=i[C]+x,_=Math.abs(x),F=null!=g?g:250+_/1500*350,D=Date.now(),R=null!=a?a:_<500?u:h,B=()=>F?Math.min((Date.now()-D)/F,1):1,N=()=>{const e=B(),t=R(e),s=x*(1-t);return i[C]=Math.round(A-s),e<1};if(!F||!x)return(0,o.Kx)(i),N(),Promise.resolve();if(e.startCallback){const t=k-Math.round(A+i["y"===r?"offsetHeight":"offsetWidth"]);e.startCallback({scrollSize:k,scrollPosition:T,distanceToEnd:t,path:x,duration:F,containerRect:E,elementRect:L,getProgress:B})}return(0,o.cK)(N,i)}function h(e){return 1-Math.pow(1-e,5)}function u(e){return 1-Math.pow(1-e,3.5)}!function(e){e[e.Up=0]="Up",e[e.Down=1]="Down",e[e.Static=2]="Static"}(s||(s={}))},8801:(e,t,i)=>{"use strict";i.d(t,{P:()=>n});const s="_";function n(e,t){const i=""["".length-1]||"";let n;switch(e._){case"inputPhotoFileLocation":n=["photo",""[0],e.id,e.thumb_size].filter(Boolean).join(s);break;case"inputDocumentFileLocation":n=["document",""[0],e.id,e.thumb_size].filter(Boolean).join(s);break;case"inputPeerPhotoFileLocation":n=["peerPhoto",e.photo_id,e.pFlags.big?"big":"small"].join(s);break;case"inputStickerSetThumb":n=["stickerSetThumb",e.stickerset.id||e.stickerset.short_name||e.stickerset.emoticon||e.stickerset._,e.thumb_version].join(s);break;case"inputFileLocation":n=[e.volume_id,e.local_id].join(s);break;case"inputWebFileLocation":n=["webFile",e.url].join(s);break;default:console.error("Unrecognized location:",e),n=""}return n+((null==t?void 0:t.downloadId)?"_download":"")+(i?"."+i:i)}},1708:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(7625);function n(e){(0,s.Z)(e.history,((t,i,s)=>{t.action.photo||(s.splice(i,1),void 0!==e.count&&--e.count)}))}},4081:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(2325);function n(e,t="auto"){if(0===e)return(0,s.ag)("FileSize.B",[0]);const i="auto"===t,n=Math.floor(Math.log(e)/Math.log(1024)),a="auto"===t?Math.max(0,n-1):t,o=Math.max(0,a),r=(e/Math.pow(1024,n)).toFixed(o);return(0,s.ag)(["FileSize.B","FileSize.KB","FileSize.MB","FileSize.GB"][n],[i?r:parseFloat(r)])}},8939:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(2325);const n={s:"Seconds",m:"Minutes",h:"Hours",d:"Days",w:"Weeks",mm:"Months",y:"Years"};function a(e,t){const i=function(e,t=2){e||(e=1);const i=[],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,a)=>{if(n=Math.round(n*t.m),e=0;--e)0===a[e].duration&&a.splice(e,1);return a}(e,2);if(t){const e=i.map((e=>s.ZP.format(n[e.type],!0,[e.duration])));return(0,s.v_)(e,!1,t)}const a=i.map((e=>(0,s.ag)(n[e.type],[e.duration]))),o=document.createElement("span");return o.append(...(0,s.v_)(a,!1)),o}},6272:(e,t,i)=>{"use strict";i.d(t,{u:()=>r});var s=i(2325);const n=new Map;let a=0;const o=(e,t,i="")=>{i=t.country_code+i,a=Math.max(a,i.length),n.set(i,{country:e,code:t})};function r(e){e=e||"",n.size||s.ZP.countriesList.forEach((e=>{e.country_codes.forEach((t=>{t.prefixes?t.prefixes.forEach((i=>{o(e,t,i)})):o(e,t)}))}));let t=e.replace(/\D/g,"");const i=t.slice(0,a);let r;for(let e=i.length-1;e>=0&&(r=n.get(i.slice(0,e+1)),!r);--e);if(!r)return{formatted:t,country:void 0,code:void 0,leftPattern:""};const d=r.country,l=r.code.patterns||[],c=t.slice(r.code.country_code.length);let h="",u=0,p="";for(let e=l.length-1;e>=0;--e){h=l[e];const t=h.replace(/ /g,"");let i=0;for(let e=0,s=Math.min(c.length,t.length);eu&&(u=i,p=h)}h=p||h,h=h.replace(/\d/g,"X"),h=r.code.country_code+" "+h,h.split("").forEach(((e,i)=>{" "===e&&" "!==t[i]&&t.length>i&&(t=t.slice(0,i)+" "+t.slice(i))}));let f=h&&h.length>t.length?h.slice(t.length):"";return f&&(f=f.replace(/X/g,"โ€’")),{formatted:t,country:d,code:r.code,leftPattern:f}}},645:(e,t,i)=>{"use strict";i.d(t,{M:()=>s,Z:()=>n});class s{constructor(){this.cache=new Map}static createCache(){const e={frames:new Map,framesNew:new Map,framesURLs:new Map,clearCache:()=>{e.framesNew.forEach((e=>{var t,i;null===(i=(t=e).close)||void 0===i||i.call(t)})),e.frames.clear(),e.framesNew.clear(),e.framesURLs.clear()},counter:0};return e}getCache(e){let t=this.cache.get(e);return t||this.cache.set(e,t=s.createCache()),++t.counter,t}releaseCache(e){const t=this.cache.get(e);t&&!--t.counter&&this.cache.delete(e)}getCacheCounter(e){const t=this.cache.get(e);return null==t?void 0:t.counter}generateName(e,t,i,s,n){return[e,t,i,s?"colored":"",n||""].filter(Boolean).join("-")}}const n=new s},9171:(e,t,i)=>{"use strict";function s(e,t,i,s,n,a,o){return[e,",",t," ",i," ",s,",",n," ",a,",",o].join("")}function n(e,t,i,n,a,o,r,d){const l=[];return l.push("M"+(e+i/2)+","+t),l.push("H"+(e+i-o)),o>0&&l.push("A"+s(o,o,0,0,1,e+i,t+o)),l.push("V"+(t+n-r)),r>0&&l.push("A"+s(r,r,0,0,1,e+i-r,t+n)),l.push("H"+(e+d)),d>0&&l.push("A"+s(d,d,0,0,1,e+0,t+n-d)),l.push("V"+(t+a)),a>0&&l.push("A"+s(a,a,0,0,1,e+a,t+0)),l.push("Z"),l.join(" ")}i.d(t,{Z:()=>n}),i(410).GO.generatePathData=n},1046:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(6740),n=i(1185),a=i(6705);function o(e,t,i){const o=(0,n.Z)(e,t,!1);let r,d;if(i){const e=(0,a.Z)(o);r=e.canvas,d=e.promise}else r=new Image,d=(0,s.cj)(r,o);return r.classList.add("thumbnail"),{image:r,loadPromise:d}}},1185:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4059);function n(e,t,i=!1){return(0,s.Z)(t.bytes,i)}},8580:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(1507),n=i(1046);function a(e,t,i,a=!1){const o=["video","gif"].includes(e.type);if(!t.downloaded||o||a){if("document"===e._&&t.downloaded&&!a&&(!o||t.type!==s.Pt))return null;const r=e.sizes||e.thumbs,d=(null==r?void 0:r.length)?r.find((e=>"photoStrippedSize"===e._)):null;if(d&&"bytes"in d)return(0,n.Z)(e,d,i)}return null}},6074:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(7625),n=i(5953);class a{constructor(e){this.previous=[],this.next=[],this.reverse=!1,this.loadCount=50,this.loadWhenLeft=20,this.loadedAllUp=!1,this.loadedAllDown=!1,(0,n.Z)(this,e)}setTargets(e,t,i){this.previous=e,this.next=t,this.reverse=i}get index(){return void 0!==this.count?this.previous.length:-1}reset(e=!1){this.current=void 0,this.previous=[],this.next=[],this.setLoaded(!0,e),this.setLoaded(!1,e)}go(e,t=!0){let i,s;if(e>0){if(i=this.next.splice(0,e),s=i.pop(),!s)return;void 0!==this.current&&i.unshift(this.current),this.previous.push(...i)}else{if(i=this.previous.splice(Math.max(0,this.previous.length+e),-e),s=i.shift(),!s)return;void 0!==this.current&&i.push(this.current),this.next.unshift(...i)}return this.next.length0),this.current}unsetCurrent(e){e?this.previous.push(this.current):this.next.unshift(this.current),this.current=void 0}goUnsafe(e,t){const i=e>0?Math.max(0,e-this.next.length):Math.min(0,e+this.previous.length),s=this.go(e,!i&&t);return{item:i?void 0:s,leftLength:i}}setLoaded(e,t){return(e?this.loadedAllDown:this.loadedAllUp)!==t&&(e?this.loadedAllDown=t:this.loadedAllUp=t,t||(e?this.loadPromiseDown=null:this.loadPromiseUp=null),!0)}load(e){if(e?this.loadedAllDown:this.loadedAllUp)return Promise.resolve();let t,i=e?this.loadPromiseDown:this.loadPromiseUp;return i||(t=e?this.reverse?this.previous[0]:this.next[this.next.length-1]:this.reverse?this.next[this.next.length-1]:this.previous[0],null!=t||(t=this.current),i=this.loadMore(t,e,this.loadCount).then((t=>{return n=this,a=void 0,r=function*(){if((e?this.loadPromiseDown:this.loadPromiseUp)!==i)return;t.items.length{const t=this.processItem?this.processItem(e):e;t&&n.push(t)}));const a=yield Promise.all(n);e?this.reverse?this.previous.unshift(...a):this.next.push(...a):this.reverse?this.next.push(...a):this.previous.unshift(...a),this.onLoadedMore&&this.onLoadedMore()},new((o=void 0)||(o=Promise))((function(e,t){function i(e){try{d(r.next(e))}catch(e){t(e)}}function s(e){try{d(r.throw(e))}catch(e){t(e)}}function d(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(i,s)}d((r=r.apply(n,a||[])).next())}));var n,a,o,r}),(()=>{})).then((()=>{e?this.loadPromiseDown=null:this.loadPromiseUp=null})),e?this.loadPromiseDown=i:this.loadPromiseUp=i,i)}}},3699:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});class s{constructor(){this.listeners=new Set}add(e){return(t,i,s)=>{const n={element:e,event:t,callback:i,options:s};return this.addManual(n),n}}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,i,s){let n;for(const a of this.listeners)if(a.element===e&&a.event===t&&a.callback===i&&a.options===s){n=a;break}n&&this.remove(n)}removeAll(){this.listeners.forEach((e=>{this.remove(e)}))}}},9405:(e,t,i)=>{"use strict";i.d(t,{C:()=>a,c:()=>n});var s=i(9897);class n{constructor(e=0,t=e){this.width=e,this.height=t}aspect(e,t){return(0,s.Z)(this.width,this.height,e.width,e.height,t)}aspectFitted(e){return this.aspect(e,!0)}aspectCovered(e){return this.aspect(e,!1)}}function a(e,t){return new n(e,t)}},4755:(e,t,i)=>{"use strict";i.d(t,{Z:()=>u,_:()=>s});var s,n=i(410),a=i(3241),o=i(9405);!function(e){e[e.mobile=0]="mobile",e[e.medium=1]="medium",e[e.large=2]="large"}(s||(s={}));const r=(0,o.C)(20,20),d=(0,o.C)(36,36),l=(0,o.C)(18,18);class c extends a.Z{constructor(){super(),this.screenSizes=[{key:s.mobile,value:600},{key:s.medium,value:1275},{key:s.large,value:1680}],this.sizes={handhelds:{regular:(0,o.C)(270,270),webpage:(0,o.C)(270,200),album:(0,o.C)(270,0),esgSticker:(0,o.C)(68,68),animatedSticker:(0,o.C)(180,180),staticSticker:(0,o.C)(180,180),emojiSticker:(0,o.C)(112,112),poll:(0,o.C)(240,0),round:(0,o.C)(200,200),documentName:(0,o.C)(200,0),invoice:(0,o.C)(270,270),extendedInvoice:(0,o.C)(270,270),customEmoji:r,esgCustomEmoji:d,emojiStatus:l,popupSticker:(0,o.C)(68,68)},desktop:{regular:(0,o.C)(420,340),webpage:(0,o.C)(420,340),album:(0,o.C)(420,0),esgSticker:(0,o.C)(72,72),animatedSticker:(0,o.C)(200,200),staticSticker:(0,o.C)(200,200),emojiSticker:(0,o.C)(112,112),poll:(0,o.C)(330,0),round:(0,o.C)(280,280),documentName:(0,o.C)(240,0),invoice:(0,o.C)(320,320),extendedInvoice:(0,o.C)(420,340),customEmoji:r,esgCustomEmoji:d,emojiStatus:l,popupSticker:(0,o.C)(80,80)}},this.isMobile=!1,this.handleResize=()=>{const e=window.innerWidth;let t=this.screenSizes[0].key;for(let i=this.screenSizes.length-1;i>=0;--i)if(this.screenSizes[i].value{this.rAF&&window.cancelAnimationFrame(this.rAF),this.rAF=window.requestAnimationFrame((()=>{this.handleResize(),this.rAF=0}))})),this.handleResize()}}const h=new c;n.GO.mediaSizes=h;const u=h},8631:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});const s=(0,i(5471).Z)("MIDDLEWARE");function n(e,t=s){return i=>{if(!(i instanceof Promise)){if(i instanceof Error)throw i;return i}return i.then((i=>{if(!e())throw t;return i}))}}},2559:(e,t,i)=>{"use strict";function s(e,t=2){if(0===e)return"0";const i=t<0?0:t,s=Math.floor(Math.log(e)/Math.log(1e3));return parseFloat((e/Math.pow(1e3,s)).toFixed(i))+["","K","M","B","T"][s]}i.d(t,{Z:()=>s})},2575:(e,t,i)=>{"use strict";function s(e,t=" "){const i=e.toString().split(".");return i[0]=i[0].replace(/\B(?=(\d{3})+(?!\d))/g,t),i.join(".")}i.d(t,{Z:()=>s})},925:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4762);function n(e,t=e.HAVE_METADATA,i){return new Promise(((n,a)=>{if(e.readyState>=t)return void n();const o=s.IS_APPLE_MOBILE&&!i?"loadeddata":"canplay",r="error",d=()=>{e.removeEventListener(r,l),n()},l=t=>{e.removeEventListener(o,d),a(e.error)};e.addEventListener(o,d,{once:!0}),e.addEventListener(r,l,{once:!0})}))}},2296:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(6385),n=i(5432),a=i(4762),o=i(3910),r=i(2738),d=i(5975),l=i(3241);class c extends l.Z{constructor(e,t){super(!1),this.navigationType=e,this.withOverlay=t,this.onClick=e=>{var t;this.element&&(0,d.Z)(e.target,this.element)||((null===(t=this.listenerOptions)||void 0===t?void 0:t.capture)&&(0,o.Z)(e),this.close())},this.listenerOptions=t?{}:{capture:!0}}close(){var e;this.element&&(null===(e=this.overlay)||void 0===e||e.remove(),this.element=void 0,this.dispatchEvent("toggle",!1)),n.Z||window.removeEventListener("contextmenu",this.onClick,this.listenerOptions),document.removeEventListener(r.pf,this.onClick,this.listenerOptions),a.IS_MOBILE_SAFARI||s.Z.removeByType(this.navigationType)}open(e){this.close(),a.IS_MOBILE_SAFARI||s.Z.pushItem({type:this.navigationType,onPop:e=>{this.close()}}),this.element=e,!this.overlay&&this.withOverlay&&(this.overlay=document.createElement("div"),this.overlay.classList.add("btn-menu-overlay"),this.overlay.addEventListener(r.pf,(e=>{(0,o.Z)(e),this.onClick(e)}))),this.overlay&&this.element.parentElement.insertBefore(this.overlay,this.element),n.Z||window.addEventListener("contextmenu",this.onClick,Object.assign(Object.assign({},this.listenerOptions),{once:!0})),document.addEventListener(r.pf,this.onClick,this.listenerOptions),this.dispatchEvent("toggle",!0)}}},5180:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(7445);function n(e,t,i){const n=(e=+e)<0,a=s.Z[t];if(!a)throw new Error("CURRENCY_WRAP_INVALID");const o=e/Math.pow(10,a.exp);let r=a.exp;"IRR"==t&&Math.floor(o)==o&&(r=0);let d=function(e,t,i,s){e=(e+"").replace(/[^0-9+\-Ee.]/g,"");var n=isFinite(+e)?+e:0,a=isFinite(+t)?Math.abs(t):0,o=void 0===s?",":s,r=void 0===i?".":i,d="";return(d=(a?function(e,t){var i=Math.pow(10,t);return""+Math.round(e*i)/i}(n,a):""+Math.round(n)).split("."))[0].length>3&&(d[0]=d[0].replace(/\B(?=(?:\d{3})+(?!\d))/g,o)),(d[1]||"").length{"use strict";i.d(t,{Z:()=>n});var s=i(4755);function n(e,t,i,n){e.touches&&(e=e.touches[0]);const{pageX:a,pageY:o}=e,r=Array.from(t.children).find((e=>e.classList.contains("btn-menu-item")&&!e.classList.contains("hide")))||t;let{scrollWidth:d}=r;const{scrollHeight:l}=t,c=document.body.getBoundingClientRect(),h=c.width,u=c.height;d+=2*r.offsetLeft;let p=8,f=8,m=8,g=8;n&&(n.top&&n.top,n.right&&(f+=n.right),n.bottom&&(m+=n.bottom),n.left&&(g+=n.left)),i=s.Z.isMobile?"right":"left";let v="top";const b=u-l-m,y=h-d-f,w=g,S={x:{left:a,right:Math.min(y,a-d)},intermediateX:"right"===i?w:y,y:{top:o,bottom:o-l},intermediateY:b},C={left:S.x.left+d+f<=h,right:S.x.right>=g},L={top:S.y.top+l+m<=u,bottom:S.y.bottom-m>=m};{const e=C[i]?S.x[i]:(i="center",S.intermediateX);t.style.left=e+"px"}{const e=L[v]?S.y[v]:(v="center",S.intermediateY);t.style.top=e+"px"}return t.className=t.className.replace(/(top|center|bottom)-(left|center|right)/g,""),t.classList.add(("center"===v?v:"bottom")+"-"+("center"===i?i:"left"===i?"right":"left")),{width:d,height:l}}},677:(e,t,i)=>{"use strict";i.d(t,{RP:()=>a,X:()=>o});const s=new Set(["all","web","webk"]),n=new Set;function a(e){return e.find((e=>s.has(e.platform)&&!n.has(e.reason)))}function o(e){return!!a(e)}},3174:(e,t,i)=>{"use strict";i.d(t,{O:()=>o,k:()=>a});var s=i(3512);const n={};function a(e,t,i,s){const a=e.id+"-"+t,o=n[a];return o&&o.width>=i&&o.height>=s}function o(e,t,i){return o=this,r=void 0,l=function*(){const o=e.id+"-"+i,{width:r,height:d}=t;if(a(e,i,r,d))return;const l=n[o]={width:r,height:d},c=yield s.Z.managers.appDocsManager.getLottieCachedThumb(e.id,i);if(n[o]!==l)return;if(c&&c.w>=r&&c.h>=d)return;const h=new Promise((e=>{t.toBlob((t=>e(t)))})),u=yield h;n[o]===l&&s.Z.managers.appDocsManager.saveLottiePreview(e.id,u,r,d,i)},new((d=void 0)||(d=Promise))((function(e,t){function i(e){try{n(l.next(e))}catch(e){t(e)}}function s(e){try{n(l.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof d?n:new d((function(e){e(n)}))).then(i,s)}n((l=l.apply(o,r||[])).next())}));var o,r,d,l}},9966:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(3035);function n(e){return function(e,t){let i,s=!1;return(...n)=>{i=n,s||(s=!0,e((()=>{s=!1,t(...i)})))}}(s.T2,e)}},8936:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(5953);class n{constructor(e){this.loading=!1,this.loaded=!1,(0,s.Z)(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}))))}}},3719:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(3781),n=i(2790),a=i(3512),o=i(7625),r=i(1708),d=i(6074),l=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class c extends d.Z{constructor(e={}){var t;super(Object.assign(Object.assign({},e),{loadMore:(e,t,i)=>{const a=t?0:i;let o=null==e?void 0:e.mid;var d;return void 0===o&&(o=this.searchContext.maxId),t||(d=o,1,o=(0,s.Z)((0,n.Z)(d)+1)),this.managers.appMessagesManager.getSearch(Object.assign(Object.assign({},this.searchContext),{peerId:this.searchContext.peerId||(null==e?void 0:e.peerId),maxId:o,limit:a?0:i,backLimit:a})).then((e=>("inputMessagesFilterChatPhotos"===this.searchContext.inputFilter._&&(0,r.Z)(e),e.next_rate&&(this.searchContext.nextRate=e.next_rate),{count:e.count,items:e.history})))},processItem:t=>l(this,void 0,void 0,(function*(){if((yield this.filterMids([t.mid])).length)return e.processItem(t)}))})),this.onHistoryDelete=({peerId:e,msgs:t})=>{const i=i=>i.peerId===e&&t.has(i.mid),s=(e,t,s)=>{i(e)&&s.splice(t,1)};(0,o.Z)(this.previous,s),(0,o.Z)(this.next,s),this.current&&i(this.current)&&(this.current=void 0,this.onEmptied&&this.onEmptied())},this.onHistoryMultiappend=e=>l(this,void 0,void 0,(function*(){if(void 0!==this.searchContext.folderId)return;if(!this.loadedAllUp||this.loadPromiseUp)return;if(e.peerId!==this.searchContext.peerId)return;const t=yield this.filterMids([e.mid]),i=(yield Promise.all(t.map((e=>this.processItem(e))))).filter(Boolean);i.length&&(this.current?this.next.push(...i):this.previous.push(...i))})),this.onMessageSent=({message:e})=>{this.onHistoryMultiappend(e)},null!==(t=this.managers)&&void 0!==t||(this.managers=a.Z.managers),a.Z.addEventListener("history_delete",this.onHistoryDelete),a.Z.addEventListener("history_multiappend",this.onHistoryMultiappend),a.Z.addEventListener("message_sent",this.onMessageSent),e.isInner||(this.otherSideLoader=new c(Object.assign(Object.assign({},e),{isInner:!0})))}filterMids(e){return l(this,void 0,void 0,(function*(){const t=`${this.searchContext.peerId}_${this.searchContext.isScheduled?"scheduled":"history"}`;return yield this.managers.appMessagesManager.filterMessagesByInputFilterFromStorage(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),!1===this.searchContext.useSearch&&(this.loadedAllDown=this.loadedAllUp=!0),this.otherSideLoader&&this.otherSideLoader.setSearchContext(e)}reset(){super.reset(),this.searchContext=void 0,this.otherSideLoader&&this.otherSideLoader.reset()}getPrevious(e){let t=this.previous;return this.otherSideLoader&&e&&(t=t.concat(this.otherSideLoader.previous)),t}getNext(e){let t=this.next;return this.otherSideLoader&&e&&(t=t.concat(this.otherSideLoader.next)),t}getCurrent(){var e;return this.current||(null===(e=this.otherSideLoader)||void 0===e?void 0:e.current)}goToOtherEnd(e){return e>0?this.go(-this.previous.length):this.go(this.next.length)}goRound(e,t){var i;let s;if(null===(i=this.otherSideLoader)||void 0===i?void 0:i.current){if(s=this.otherSideLoader.goUnsafe(e,t),s.item)return s.item;if(!((e=s.leftLength)>0?this.otherSideLoader.next:this.otherSideLoader.previous).length){if(!(e>0?this.otherSideLoader.loadedAllUp:this.otherSideLoader.loadedAllDown))return;if(e>0&&(1===this.otherSideLoader.searchContext.maxId||this.otherSideLoader.loadedAllDown)||e<0&&(0===this.otherSideLoader.searchContext.maxId||this.otherSideLoader.loadedAllUp))return this.otherSideLoader.goToOtherEnd(e);this.otherSideLoader.unsetCurrent(e>0)}}if(s=this.goUnsafe(e,t),!s.item){if(this.loadedAllUp&&this.loadedAllDown)return this.goToOtherEnd(e);this.otherSideLoader&&(e=s.leftLength,s=this.otherSideLoader.goUnsafe(e,t),s.item&&this.unsetCurrent(e>0))}return null==s?void 0:s.item}setLoaded(e,t){var i;const s=super.setLoaded(e,t);if(s&&this.otherSideLoader&&t&&!1!==(null===(i=this.searchContext)||void 0===i?void 0:i.useSearch)){const e=this.loadedAllUp;this.otherSideLoader.setSearchContext(Object.assign(Object.assign({},this.searchContext),{maxId:e?1:0})),this.otherSideLoader.reverse=this.reverse,this.otherSideLoader.setLoaded(e,!0),this.otherSideLoader.load(!e)}return s}cleanup(){this.reset(),a.Z.removeEventListener("history_delete",this.onHistoryDelete),a.Z.removeEventListener("history_multiappend",this.onHistoryMultiappend),a.Z.removeEventListener("message_sent",this.onMessageSent),this.onEmptied=void 0,this.otherSideLoader&&(this.otherSideLoader.cleanup(),this.otherSideLoader=void 0)}}},9674:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(3035),n=i(3725),a=i(410),o=i(8487);const r=new class{constructor(){this.promises={},this.raf=s.T2.bind(null),this.scheduled=!1}do(e,t){let i=this.promises[e];return i||(this.scheduleFlush(),i=this.promises[e]=(0,n.Z)()),void 0!==t&&i.then((()=>t())),i}measure(e){return this.do("read",e)}mutate(e){return this.do("write",e)}mutateElement(e,t){const i=(0,o.Z)(e),s=i?this.mutate():Promise.resolve();return void 0!==t&&(i?s.then((()=>t())):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.GO&&(a.GO.sequentialDom=r);const d=r},1713:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(1507),n=i(7030),a=i(9405),o=i(3114);function r(e,t,i,r,d=!0,l,c,h){const u=(0,o.Z)(e);let p;h||(h=(0,n.Z)(e,i,r,void 0,c));const f="document"===e._;p=f||u?(0,a.C)(e.w||h.w||512,e.h||h.h||512):(0,a.C)(h.w||100,h.h||100);let m=(0,a.C)(i,r);m=p=p.aspect(m,d);let g=!0;return(!f||["video","gif"].includes(e.type)||u)&&(m.width<200&&m.height<200&&(m=p=p.aspectCovered((0,a.C)(200,200))),l&&(l.message||l.reply_to_mid||l.media.webpage||l.replies&&l.replies.pFlags.comments&&l.replies.channel_id.toChatId()!==s.IA)&&m.width<320&&(m=(0,a.C)(320,m.height),g=!1),g&&m.width<120&&l&&(m=(0,a.C)(120,m.height),g=!1)),t.style.width=m.width+"px",t.style.height=m.height+"px",{photoSize:h,size:p,isFit:g}}},5345:(e,t,i)=>{"use strict";i.d(t,{Z:()=>u,s:()=>h});var s=i(5003),n=i(6519),a=i(3624),o=i(8631),r=i(5953),d=i(5418),l=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};let c=0;class h{constructor(e){var t;(0,r.Z)(this,e),this.queue=[],null!==(t=this.middlewareHelper)&&void 0!==t||(this.middlewareHelper=(0,a.k)());const i="BATCH-PROCESSOR-"+ ++c;this.log?this.log=this.log.bindPrefix(i):this.log=(0,s.kg)(i)}get queuePromise(){return this.promise}clear(){this.log("clear"),this.queue.length=0,this.promise=void 0,this.middlewareHelper.clean()}addToQueue(e){return this.queue.push(e),this.setQueue()}setQueue(){if(!this.queue.length)return Promise.resolve();if(this.promise)return this.promise;const e=this.middlewareHelper.get(),t=this.log.bindPrefix("queue"),i=(0,o.Z)(e,this.possibleError),s=()=>l(this,void 0,void 0,(function*(){t("start",this.queue.length);const e=this.queue.splice(0,this.queue.length),n=performance.now(),a=e.map((e=>(e.then((e=>{t("render item time",performance.now()-n,e)})),e))),o=yield i(Promise.all(a));if(yield i(this.process(o,i,t)),t("queue rendered"),this.queue.length)return t("have new items to render"),s();t("end")}));t("setting pause");const n=this.promise=i((0,d.Z)(0)).then((()=>s().catch((e=>{throw e!==this.possibleError&&t.error("process queue error",e),e}))),(e=>{throw t("pause has been cleared"),e})).finally((()=>{this.promise===n&&(this.promise=void 0)}));return n}}class u{constructor(e){this.updateElementWith=e=>e(),this.updateListWith=e=>e(!0),(0,r.Z)(this,e),this.elements=new Map,this.sorted=[],this.middleware=(0,a.k)(),this.batchProcessor=new h({log:this.log,process:(e,t,i)=>l(this,void 0,void 0,(function*(){const i=e.map((e=>this.update(e.id,e)));yield t(Promise.all(i))}))})}clear(){this.batchProcessor.clear(),this.middleware.clean(),this.elements.clear(),this.sorted.length=0}_updateList(){this.elements.forEach((e=>{this.update(e.id)})),this.onSort&&this.sorted.forEach(((e,t)=>{this.onSort(e,t)}))}updateList(e){const t=this.middleware.get();this.updateListWith((i=>{t()&&(void 0===i||i)?(this._updateList(),null==e||e(!0)):null==e||e(!1)}))}has(e){return this.elements.has(e)}get(e){return this.elements.get(e)}getAll(){return this.elements}add(e){return l(this,void 0,void 0,(function*(){if(this.get(e))return;const t={id:e,index:0};this.elements.set(e,t);const i=Promise.resolve(this.onElementCreate(t));return this.batchProcessor.addToQueue(i)}))}delete(e,t){const i=this.elements.get(e);if(!i)return!1;this.elements.delete(e);const s=this.sorted.indexOf(i);if(-1!==s&&this.sorted.splice(s,1),this.onDelete)if(t)this.onDelete(i);else{const e=this.middleware.get();this.updateElementWith((()=>{e()&&this.onDelete(i)}))}return!0}update(e,t=this.get(e)){var i;return l(this,void 0,void 0,(function*(){if(!t)return;if(t.index=yield this.getIndex(t),this.get(e)!==t)return;null===(i=this.onUpdate)||void 0===i||i.call(this,t);const s=(0,n.Z)(this.sorted,t,"index");this.onSort(t,s)}))}}},6854:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});const s="\ufeff"},4056:(e,t,i)=>{"use strict";function s(e){return e.replace(/&/g,"&").replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,(e=>"&#"+(1024*(e.charCodeAt(0)-55296)+(e.charCodeAt(1)-56320)+65536)+";")).replace(/([^\#-~| |!])/g,(e=>"&#"+e.charCodeAt(0)+";")).replace(//g,">")}i.d(t,{Z:()=>s})},3738:(e,t,i)=>{"use strict";function s(e){return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}i.d(t,{Z:()=>s})},8456:(e,t,i)=>{"use strict";function s(e,t,i=t+10){return(e=e.trim()).length>i&&(e=e.slice(0,t)+"..."),e}i.d(t,{Z:()=>s})},5157:(e,t,i)=>{"use strict";function s(e,t=!1){const i=parseInt(e+"",10),s=Math.floor(i/3600);let n=Math.floor((i-3600*s)/60),a=i-3600*s-60*n;return s&&(t=!0),n<10&&(n=t?"0"+n:n),a<10&&(a="0"+a),(s?s+":":"")+n+":"+a}i.d(t,{Z:()=>s})},8812:(e,t,i)=>{"use strict";function s(e){const t=new Blob([e],{type:"image/svg+xml;charset=utf-8"});return new Promise((e=>{const i=new FileReader;i.onload=t=>{e(t.target.result)},i.readAsDataURL(t)}))}i.d(t,{Z:()=>s})},241:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(1352);const n=new class{constructor(){if(s.kC)return;const e="visualViewport"in window?window.visualViewport:window,t=()=>{this.width=e.width||e.innerWidth,this.height=e.height||e.innerHeight};e.addEventListener("resize",t),t()}}},8594:(e,t,i)=>{"use strict";i.d(t,{YW:()=>p,ZP:()=>v,e9:()=>g,gp:()=>m});var s=i(3725),n=i(410),a=i(5418);const o=new(i(3241).Z),r="start",d="end";let l=!1,c=(0,s.Z)(),h=0;c.resolve();const u=console.log.bind(console.log,"[HEAVY-ANIMATION]:");function p(e,t){l||(c=(0,s.Z)(),o.dispatchEvent(r),l=!0,n.ZP&&u("start")),++h,n.ZP&&u("attach promise, length:",h,t);const i=[void 0!==t?(0,a.Z)(t):void 0,e.finally((()=>{}))].filter(Boolean),d=performance.now(),p=c;return Promise.race(i).then((()=>{c!==p||c.isFulfilled||(--h,n.ZP&&u("promise end, length:",h,performance.now()-d),h<=0&&f())})),c}function f(){c.isFulfilled||(l=!1,h=0,o.dispatchEvent(d),c.resolve(),n.ZP&&u("end"))}function m(){f()}function g(){return c}function v(e,t,i){l&&e();const s=i?i.add(o):o.addEventListener.bind(o),n=i?i.removeManual.bind(i,o):o.removeEventListener.bind(o);return s(r,e),s(d,t),()=>{n(d,t),n(r,e)}}window.dispatchHeavyAnimationEvent=p},4277:(e,t,i)=>{"use strict";i.r(t),i.d(t,{AppDialogsManager:()=>lt,DIALOG_LIST_ELEMENT_TAG:()=>et,default:()=>ht});var s=i(9331),n=i(3512),a=i(6194),o=i(2325),r=i(4668),d=i(2796),l=i(3897),c=i(1507),h=i(3186),u=i(4531),p=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class f{constructor(e){this.managers=e,this.onArchiveClick=()=>p(this,void 0,void 0,(function*(){const e=yield this.managers.appMessagesManager.getDialogOnly(this.peerId);e&&this.managers.appMessagesManager.editPeerFolders([e.peerId],+!e.folder_id)})),this.onHideTopicClick=()=>{this.managers.appChatsManager.editForumTopic({chatId:this.peerId.toChatId(),topicId:this.threadId,hidden:!0})},this.onToggleTopicClick=()=>{this.managers.appChatsManager.editForumTopic({chatId:this.peerId.toChatId(),topicId:this.threadId,closed:!this.dialog.pFlags.closed})},this.onPinClick=()=>{const{peerId:e,filterId:t,threadId:i}=this;this.managers.appMessagesManager.toggleDialogPin({peerId:e,filterId:t,topicId:i}).catch((e=>p(this,void 0,void 0,(function*(){"PINNED_DIALOGS_TOO_MUCH"!==e.type&&"PINNED_TOO_MUCH"!==e.type||(i?this.managers.apiManager.getLimit("topicPin").then((e=>{(0,d.bC)({langPackKey:"LimitReachedPinnedTopics",langPackArguments:[e]})})):t>=1?(0,d.bC)({langPackKey:"PinFolderLimitReached"}):(0,h.Z)("pin"))}))))},this.onUnmuteClick=()=>{this.managers.appMessagesManager.togglePeerMute({peerId:this.peerId,mute:!1,threadId:this.threadId})},this.onMuteClick=()=>{new l.Z(this.peerId,this.threadId)},this.onUnreadClick=()=>p(this,void 0,void 0,(function*(){const{peerId:e,dialog:t}=this;t.unread_count?(this.managers.appMessagesManager.readHistory(e,t.top_message,this.threadId),this.threadId||this.managers.appMessagesManager.markDialogUnread(e,!0)):this.threadId||this.managers.appMessagesManager.markDialogUnread(e)})),this.onDeleteClick=()=>{new a.Z(this.peerId,void 0,void 0,this.threadId)}}attach(e){(0,u.Z)({listenTo:e,buttons:this.getButtons(),appendTo:document.getElementById("page-chats"),onOpen:e=>p(this,void 0,void 0,(function*(){this.li=e,e.classList.add("menu-open"),this.peerId=e.dataset.peerId.toPeerId(),this.threadId=+e.dataset.threadId||void 0,this.dialog=yield this.managers.dialogsStorage.getDialogOrTopic(this.peerId,this.threadId),this.filterId=this.threadId?void 0:ht.filterId,this.canManageTopics=this.threadId?yield this.managers.appChatsManager.hasRights(this.peerId.toChatId(),"manage_topics"):void 0})),onBeforeOpen:()=>p(this,void 0,void 0,(function*(){const e=this.threadId?"Delete":yield this.managers.appPeersManager.getDeleteButtonText(this.peerId),t=this.buttons[this.buttons.length-1];(null==t?void 0:t.element)&&t.element.lastChild.replaceWith((0,o.ag)(e))})),onClose:()=>{this.li.classList.remove("menu-open"),this.li=this.peerId=this.dialog=this.filterId=this.threadId=this.canManageTopics=void 0},findElement:e=>(0,r.Z)(e.target,et)})}getButtons(){var e;return null!==(e=this.buttons)&&void 0!==e?e:this.buttons=[{icon:"unread",text:"MarkAsUnread",onClick:this.onUnreadClick,verify:()=>p(this,void 0,void 0,(function*(){return!this.threadId&&!(yield this.managers.appMessagesManager.isDialogUnread(this.dialog))}))},{icon:"readchats",text:"MarkAsRead",onClick:this.onUnreadClick,verify:()=>this.managers.appMessagesManager.isDialogUnread(this.dialog)},{icon:"pin",text:"ChatList.Context.Pin",onClick:this.onPinClick,verify:()=>p(this,void 0,void 0,(function*(){var e;return!(this.threadId&&!this.canManageTopics)&&!(void 0!==this.filterId&&this.filterId>1?(yield this.managers.appMessagesManager.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:()=>p(this,void 0,void 0,(function*(){var e;return!(this.threadId&&!this.canManageTopics)&&(void 0!==this.filterId&&this.filterId>1?(yield this.managers.appMessagesManager.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:()=>p(this,void 0,void 0,(function*(){return this.peerId!==n.Z.myId&&!(yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.dialog.peerId,threadId:this.threadId}))}))},{icon:"unmute",text:"ChatList.Context.Unmute",onClick:this.onUnmuteClick,verify:()=>p(this,void 0,void 0,(function*(){return this.peerId!==n.Z.myId&&(yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.dialog.peerId,threadId:this.threadId}))}))},{icon:"archive",text:"Archive",onClick:this.onArchiveClick,verify:()=>0===this.filterId&&this.peerId!==n.Z.myId},{icon:"unarchive",text:"Unarchive",onClick:this.onArchiveClick,verify:()=>1===this.filterId&&this.peerId!==n.Z.myId},{icon:"hide",text:"Hide",onClick:this.onHideTopicClick,verify:()=>this.canManageTopics&&this.dialog.id===c.Ox},{icon:"lock",text:"CloseTopic",onClick:this.onToggleTopicClick,verify:()=>this.canManageTopics&&!this.dialog.pFlags.closed},{icon:"lockoff",text:"RestartTopic",onClick:this.onToggleTopicClick,verify:()=>this.canManageTopics&&!!this.dialog.pFlags.closed},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>!this.threadId||!!this.canManageTopics&&this.dialog.id!==c.Ox}]}}var m=i(6008),g=i(1405),v=i(8805),b=i(632),y=i(4762),w=i(5003),S=i(9322),C=i(4494),L=i(9099),E=i(410),I=i(8842),M=i(1447),P=i(9492),Z=i(534),T=i(744),k=i(2738),x=i(4484),A=i(5565),_=i(4159),F=i(3442),D=i(7487),R=i(9174),B=i(3910),N=i(490);class O{constructor(e,t){this.managers=e,this.hadConnect=!1,this.connecting=!1,this.timedOut=!1,this.updating=!1,this.setConnectionStatus=e=>{Promise.all([D.Z.get("dc"),n.Z.managers.rootScope.getConnectionStatus()]).then((([t,i])=>{t||(t=_.Z.baseDcId),this.setFirstConnectionTimeout&&(clearTimeout(this.setFirstConnectionTimeout),this.setFirstConnectionTimeout=0);const s=i["NET-"+t],n=s&&(e||s.status)===R.Q.Connected;this.connecting&&n&&this.managers.apiUpdatesManager.forceGetDifference(),n&&!this.hadConnect&&(this.hadConnect=!0),this.timedOut=s&&(e||s.status)===R.Q.TimedOut,this.connecting=!n,this.retryAt=s&&s.retryAt,E.ZP&&this.log("connecting",this.connecting),this.setState()}))},this.setStatusText=(e,t)=>{this.currentLangPackKey!==e&&(this.currentLangPackKey=e,(0,A.Z)(this.statusEl,(0,o.ag)(e,t)),this.statusPreloader.attach(this.statusEl))},this.setState=()=>{if(N.Z.deactivatedReason)return;const e=O.CHANGE_STATE_DELAY;if(this.connecting)if(this.timedOut){const e=this.getA("ConnectionStatus.ForceReconnect",(()=>this.managers.networkerFactory.forceReconnect()));this.setStatusText("ConnectionStatus.TimedOut",[e])}else if(this.hadConnect)if(void 0!==this.retryAt){const e=document.createElement("span"),t=this.retryAt,i=()=>{const i=Date.now();e.innerText=""+Math.max(0,Math.round((t-i)/1e3)),i>t&&clearInterval(s)},s=setInterval(i,1e3);i();const n=this.getA("ConnectionStatus.Reconnect",(()=>this.managers.networkerFactory.forceReconnectTimeout()));this.setStatusText("ConnectionStatus.ReconnectIn",[e,n])}else this.setStatusText("ConnectionStatus.Reconnecting");else this.setStatusText("ConnectionStatus.Waiting");else this.updating&&this.setStatusText("Updating");E.ZP&&this.log("setState",this.connecting||this.updating),window.requestAnimationFrame((()=>{this.setStateTimeout&&clearTimeout(this.setStateTimeout),this.setStateTimeout=window.setTimeout((()=>{(0,L.Z)({element:this.statusContainer,className:"is-shown",forwards:this.connecting||this.updating,duration:200}),this.setStateTimeout=0,E.ZP&&this.log("setState: isShown:",this.connecting||this.updating)}),e)}))},this.log=(0,w.kg)("CS",void 0,void 0),this.statusContainer=document.createElement("div"),this.statusContainer.classList.add("connection-status"),this.statusEl=(0,C.Z)("btn-primary bg-warning connection-status-button",{noRipple:!0}),this.statusPreloader=new F.Z({cancelable:!1}),this.statusPreloader.constructContainer({color:"transparent",bold:!0}),this.statusContainer.append(this.statusEl),t.prepend(this.statusContainer),n.Z.addEventListener("connection_status_change",(e=>{this.setConnectionStatus()})),n.Z.addEventListener("state_synchronizing",(e=>{e||(this.updating=!0,E.ZP&&this.log("updating",this.updating),this.setState())})),n.Z.addEventListener("state_synchronized",(e=>{E.ZP&&this.log("state_synchronized",e),e||(this.updating=!1,E.ZP&&this.log("updating",this.updating),this.setState())})),this.setFirstConnectionTimeout=window.setTimeout(this.setConnectionStatus,O.CHANGE_STATE_DELAY+1e3)}getA(e,t){const i=document.createElement("a");return i.classList.add("force-reconnect"),i.append((0,o.ag)(e)),(0,k.fc)(i,(e=>{(0,B.Z)(e),t()})),i}}O.CHANGE_STATE_DELAY=1e3;var U,H=i(6740),z=i(3035),j=i(2894),G=i(5432),V=i(1154),K=i(241),W=i(8487);!function(e){e[e.Error=-1]="Error",e[e.Pending=0]="Pending",e[e.Sent=1]="Sent",e[e.Read=2]="Read"}(U||(U={}));var $=i(5345),q=i(5701),Q=i(5296),Y=i(8222);function X(e,t,i,s){return e>=s?t+i:function(e,t){return-t/2*(Math.cos(Math.PI*e)-1)}(e/s,i)+t}var J=i(4755);function ee(e,t,i,s,n,a,o,r){const d=e.canvas.dpr;if(d&&(t*=d,i*=d,s*=d,n*=d),"number"==typeof a)d&&(a*=d),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]?d?a[t]*d:a[t]:e[t]}e.beginPath(),e.moveTo(t+a.tl,i),e.lineTo(t+s-a.tr,i),e.quadraticCurveTo(t+s,i,t+s,i+a.tr),e.lineTo(t+s,i+n-a.br),e.quadraticCurveTo(t+s,i+n,t+s-a.br,i+n),e.lineTo(t+a.bl,i+n),e.quadraticCurveTo(t,i+n,t,i+n-a.bl),e.lineTo(t,i+a.tl),e.quadraticCurveTo(t,i,t+a.tl,i),e.closePath(),o&&e.fill(),r&&e.stroke()}const te=window.devicePixelRatio,ie=20*te,se=2.5*te,ne=2*te,ae=1*te;var oe=i(6818),re=i(6385),de=i(3013),le=i(130),ce=i(4332),he=i(1168),ue=i(7030),pe=i(8115),fe=i(496),me=i(5381),ge=i(7530),ve=i(2291),be=i(5772),ye=i(3385),we=i(2554),Se=i(8050),Ce=i(3725),Le=i(7362),Ee=i(8631),Ie=i(2312),Me=i(2059),Pe=i(2493),Ze=i(319),Te=i(2890),ke=i(3228);class xe{constructor(){this.font="30pt Helvetica",this.currTime=Date.now(),this.diffTime=0,this.spread=0,this.paused=!1,this.pausedTime=0,this.pauseInterval=850,this.lightSource=0,this.inc=.032,this.lightSpread=.55,this.animations=["slide","slide","slide","slide"],this.currentAnimationIndex=0}keepTime(){this.diffTime=Date.now()-this.currTime,this.currTime=Date.now()}cycleAnimation(){++this.currentAnimationIndex,this.currentAnimationIndex>=this.animations.length&&(this.currentAnimationIndex=0)}animate(){const e=this.animations[this.currentAnimationIndex];return"glow"===e?this.animateGlow():"slide"===e?this.animateSlide():void console.log("unknown animation type: "+String(e))}animateGlow(){var e=68;return()=>{var t=this.diffTime/(1e3/60)*10;return this.paused?Date.now()-this.pausedTime>800&&(e=68,this.cycleAnimation(),this.paused=!1):(e=parseInt(""+(e+t)))>=255&&(this.paused=!0,this.pausedTime=Date.now()),"rgb("+e+","+e+","+e+")"}}animateSlide(){var e,t,i,s=this.ctx.createLinearGradient(0,0,this.canvas.width,0),n=this.inc*(this.diffTime/(1e3/60));if(this.paused){if(Date.now()-this.pausedTime>this.pauseInterval)return this.lightSource=-.6,this.cycleAnimation(),this.paused=!1,this.animateSlide()}else this.lightSource+=n,this.lightSource>1+this.lightSpread&&(this.paused=!0,this.pausedTime=Date.now());i=(0,ke.Z)(this.lightSource,0,1),e=(0,ke.Z)(this.lightSource-this.lightSpread,0,1),t=(0,ke.Z)(this.lightSource+this.lightSpread,0,1);const a=Y.Z.getProperty("background-color-true"),o=Y.Z.getProperty("surface-color");return s.addColorStop(e,a),s.addColorStop(i,o),s.addColorStop(t,a),s}settings(e={}){var t,i,s,n,a,o;this.canvas=null!==(t=e.canvas)&&void 0!==t?t:document.createElement("canvas"),this.ctx=this.canvas.getContext("2d"),this.font=null!==(i=e.font)&&void 0!==i?i:this.font,this.lightSpread=null!==(s=e.lightSpread)&&void 0!==s?s:this.lightSpread,this.inc=null!==(n=e.inc)&&void 0!==n?n:this.inc,this.animations=null!==(a=e.animations)&&void 0!==a?a:this.animations,this.text=null!==(o=e.text)&&void 0!==o?o:this.text,this.fillStyle=e.fillStyle,this.canvas.classList.add("shimmer-canvas")}on(){const{width:e,height:t}=this.canvas;this.keepTime(),this.ctx.clearRect(0,0,e,t),this.font&&(this.ctx.font=this.font),this.ctx.fillStyle=this.animate(),this.ctx.fillRect(0,0,e,t),this.fillStyle&&(this.ctx.fillStyle=this.fillStyle,this.ctx.fillRect(0,0,e,t)),this.text&&this.ctx.fillText(this.text,50,50)}}class Ae{constructor(e={}){var t,i,s;this.onThemeChange=()=>{this.stopAnimation(),this.startAnimation()},this.onResize=()=>{const{canvas:e}=this,{width:t,height:i,dpr:s}=e;this.updateCanvasSize(),e.width===t&&e.height===i&&e.dpr===s||(this.stopAnimation(),this.startAnimation())},this.shimmer=new xe,this.tempId=0,this.canvas=document.createElement("canvas"),this.canvas.classList.add("dialogs-placeholder-canvas"),this.ctx=this.canvas.getContext("2d"),this.generatedValues=[],this.avatarSize=null!==(t=e.avatarSize)&&void 0!==t?t:54,this.marginVertical=null!==(i=e.marginVertical)&&void 0!==i?i:9,this.totalHeight=null!==(s=e.totalHeight)&&void 0!==s?s:this.avatarSize+2*this.marginVertical,this.lineHeight=10,this.lineBorderRadius=6,this.lineMarginVertical=8,this.statusWidth=24}attach({container:e,rect:t,getRectFrom:i,onRemove:s,blockScrollable:n}){const{canvas:a}=this;this.onRemove=s,this.getRectFrom="function"==typeof i?i:(i||e).getBoundingClientRect.bind(i||e),(this.blockScrollable=n)&&(n.container.style.overflowY="hidden"),this.updateCanvasSize(t),this.startAnimation(),e.append(a)}detach(e){this.detachTime||(this.availableLength=e,this.detachTime=Date.now(),n.Z.settings.animationsEnabled||this.remove())}remove(){var e;this.stopAnimation(),this.canvas.parentElement&&(this.canvas.remove(),this.blockScrollable&&(this.blockScrollable.container.style.overflowY="",this.blockScrollable=void 0)),null===(e=this.onRemove)||void 0===e||e.call(this),this.onRemove=void 0}updateCanvasSize(e=this.getRectFrom()){const{canvas:t}=this,i=t.dpr=window.devicePixelRatio;t.width=e.width*i,t.height=e.height*i,t.style.width=e.width+"px",t.style.height=e.height+"px"}renderDetachAnimationFrame(){const{canvas:e,ctx:t,detachTime:i,length:s,availableLength:a}=this;if(!i)return;if(!n.Z.settings.animationsEnabled)return void this.remove();const{width:o}=e;t.globalCompositeOperation="destination-out";const r=Date.now()-i;let d=!0;for(let e=0;e=a?15*(a-1):15*e);if(i<=0){d=!1;continue}const n=X(i,0,1,150);t.beginPath(),t.rect(0,this.dialogHeight*e,o,this.dialogHeight),t.fillStyle=`rgba(0, 0, 0, ${n})`,t.fill(),n<1&&(d=!1)}t.globalCompositeOperation="source-over",d&&this.remove()}renderFrame(){this.shimmer.on(),this.renderDetachAnimationFrame()}startAnimation(){const{canvas:e,shimmer:t}=this,i=++this.tempId,s=this.createPattern();t.settings({canvas:e,fillStyle:s});const a=()=>this.tempId===i;this.renderFrame(),(0,Q.jt)((()=>!!a()&&(n.Z.settings.animationsEnabled&&this.renderFrame(),a()))),n.Z.addEventListener("theme_change",this.onThemeChange),J.Z.addEventListener("resize",this.onResize)}stopAnimation(){++this.tempId,n.Z.removeEventListener("theme_change",this.onThemeChange),J.Z.removeEventListener("resize",this.onResize)}createPattern(){const{canvas:e,ctx:t}=this,i=document.createElement("canvas"),s=i.getContext("2d"),n=e.dpr;i.dpr=n,i.width=e.width,i.height=e.height,s.fillStyle=Y.Z.getProperty("surface-color"),s.fillRect(0,0,i.width,i.height),s.fillStyle="#000",s.globalCompositeOperation="destination-out";const a=this.dialogHeight=this.totalHeight*n,o=this.length=Math.ceil(e.height/a);for(let e=0;e{})).finally((()=>{e[t]===s&&delete e[t]}));const n=(0,Ee.Z)((()=>e[t]===s));return{deferred:s,middleware:n}}class it extends $.Z{constructor(e){super({getIndex:e=>{var t;return this.managers.dialogsStorage.getDialogIndex(null!==(t=this.forumPeerId)&&void 0!==t?t:e.id,this.indexKey,this.forumPeerId?e.id:void 0)},onDelete:e=>{var t;e.dom.listEl.remove(),null===(t=this.onListLengthChange)||void 0===t||t.call(this)},onSort:(e,t)=>{var i;const s=e.dom.listEl.parentElement!==this.list;(0,x.Z)(e.dom.listEl,this.list,t),s&&(null===(i=this.onListLengthChange)||void 0===i||i.call(this))},onElementCreate:e=>Je(this,void 0,void 0,(function*(){var t;const i=[],s=ct.addListDialog({peerId:null!==(t=this.forumPeerId)&&void 0!==t?t:e.id,loadPromises:i,isBatch:!0,threadId:this.forumPeerId?e.id:void 0,isMainList:"index_0"===this.indexKey});return e.dom=s.dom,e.dialogElement=s,yield Promise.all(i),e})),updateElementWith:z.TR,log:e.log}),(0,je.Z)(this,e)}clear(){this.list.replaceChildren(),super.clear()}}class st extends Ue.ZP{constructor({peerId:e,rippleEnabled:t=!0,onlyFirstName:i=!1,meAsSaved:n=!0,avatarSize:a="bigger",autonomous:o,loadPromises:r,fromName:d,noIcons:l,threadId:c,wrapOptions:h={},isMainList:u}){var p;super({clickable:!0,noRipple:!t,havePadding:!c,title:!0,titleRightSecondary:!0,subtitle:!0,subtitleRight:!0,noWrap:!0,asLink:!0}),this.subtitleRight.remove();const f=c?void 0:new s.Z;if(f){const t={bigger:54,abitbigger:42,small:32}[a];f.classList.add("dialog-avatar","avatar-"+t),f.updateWithOptions({loadPromises:r,lazyLoadQueue:h.lazyLoadQueue,isDialog:!!n,peerId:e,peerTitle:d}),this.applyMediaElement(f,a)}const m=this.container,g=this.title;g.classList.add("user-title"),this.titleRow.classList.add("dialog-title");const v=new I.Z,b=v.update({peerId:e,fromName:d,dialog:n,onlyFirstName:i,withIcons:!l,threadId:c});null==r||r.push(b),g.append(v.element),g.classList.add("tgico");const y=this.subtitle,w=this.container;w.classList.add("chatlist-chat","chatlist-chat-"+a),o||(w.href="#"+e),"bigger"===a?this.container.classList.add("row-big"):"small"===a&&this.container.classList.add("row-small"),w.dataset.peerId=""+e,c&&(w.dataset.threadId=""+c);const C=document.createElement("span");C.classList.add("message-status","sending-status");const L=document.createElement("span");L.classList.add("message-time");const E=this.titleRight;E.classList.add("dialog-title-details"),E.append(C,L),this.subtitleRow.classList.add("dialog-subtitle");const M=this.dom={avatarEl:f,captionDiv:m,titleSpan:v.element,titleSpanContainer:g,statusSpan:C,lastTimeSpan:L,lastMessageSpan:y,containerEl:w,listEl:w,subtitleEl:this.subtitleRow};if(!o){w.dialogDom=M;const t=S.ZP.chat;t&&S.ZP.isSamePeer(t,{peerId:e,threadId:c,type:"chat"})&&ct.setDialogActive(w,!0),u&&(null===(p=ct.forumTab)||void 0===p?void 0:p.peerId)===e&&!c&&w.classList.add("is-forum-open")}}createUnreadBadge(){if(this.dom.unreadBadge)return;const e=this.dom.unreadBadge=document.createElement("div");e.className="dialog-subtitle-badge badge badge-22",this.dom.subtitleEl.append(e)}createUnreadAvatarBadge(){if(this.dom.unreadAvatarBadge)return;const e=this.dom.unreadAvatarBadge=document.createElement("div");e.className="dialog-subtitle-badge badge badge-22 avatar-badge",this.dom.listEl.append(e)}createMentionsBadge(){if(this.dom.mentionsBadge)return;const e=this.dom.mentionsBadge=document.createElement("div");e.className="dialog-subtitle-badge badge badge-22 mention mention-badge",e.innerText="@",this.dom.lastMessageSpan.after(e)}toggleBadgeByKey(e,t,i,s){(0,L.Z)({element:this.dom[e],className:"is-visible",forwards:t,duration:s?0:250,onTransitionEnd:t?void 0:()=>{this.dom[e].remove(),delete this.dom[e]},useRafs:i&&(0,W.Z)(this.dom[e])?0:2})}}class nt extends ze.h{toggle(e){return Je(this,void 0,void 0,(function*(){this.init2&&(yield this.init2()),(0,L.Z)({element:this.container,className:"is-visible",forwards:e,duration:300,onTransitionEnd:e?void 0:()=>{this.onCloseAfterTimeout()},useRafs:this.firstTime?(this.firstTime=void 0,2):void 0})}))}init(e){(0,je.Z)(this,e),this.log=(0,w.kg)("FORUM"),this.firstTime=!0,this.container.classList.add("topics-container");const t=!this.slider;t&&(this.closeBtn.classList.replace("tgico-left","tgico-close"),this.container.classList.add("active","is-floating"),(0,k.fc)(this.closeBtn,(()=>{ct.toggleForumTab(void 0,this)}),{listenerSetter:this.listenerSetter})),this.rows=document.createElement("div"),this.rows.classList.add("sidebar-header__rows"),this.subtitle=document.createElement("div"),this.subtitle.classList.add("sidebar-header__subtitle"),this.title.replaceWith(this.rows),this.rows.append(this.title,this.subtitle);const i=ct.createChatList();ct.setListClickListener(i,null,!0),this.scrollable.append(i),this.xd=new rt(this.peerId,t?80:0),this.xd.scrollable=this.scrollable,this.xd.sortedList=new it({managers:this.managers,log:this.log,list:i,indexKey:"index_0",forumPeerId:this.peerId}),this.xd.bindScrollable();const s=()=>({peerId:this.peerId,type:"chat"}),a=(0,Ve.Z)({listenerSetter:this.listenerSetter,direction:"bottom-left",buttons:[{icon:"info",text:"ForumTopic.Context.Info",onClick:()=>Je(this,void 0,void 0,(function*(){const e=T.ZP.createTab($e.Z,!0);e.isFirst=!0,e.setPeer(this.peerId),(yield e.fillProfileElements())(),e.loadSidebarMedia(!0),e.open()}))},{icon:"message",text:"ForumTopic.Context.ShowAsMessages",onClick:()=>{const e=S.ZP.chat;S.ZP[(null==e?void 0:e.peerId)===this.peerId?"setPeer":"setInnerPeer"](s())},verify:()=>{const e=S.ZP.chat;return!e||!S.ZP.isSamePeer(e,s())}},{icon:"adduser",text:"ForumTopic.Context.AddMember",onClick:()=>{},verify:()=>!1},{icon:"add",text:"ForumTopic.Context.New",onClick:()=>{T.ZP.createTab(Ye.Z).open(this.peerId)},separator:!0,verify:()=>this.managers.appChatsManager.hasRights(this.peerId.toChatId(),"manage_topics")}]});if(this.listenerSetter.add(n.Z)("history_reload",(e=>{this.peerId===e&&this.xd.fullReset()})),this.listenerSetter.add(n.Z)("chat_update",(e=>Je(this,void 0,void 0,(function*(){this.peerId===e.toPeerId(!0)&&((yield this.managers.appChatsManager.getChat(e)).pFlags.forum||ct.toggleForumTab(void 0,this))})))),G.Z&&(0,V.Z)({element:this.container,onSwipe:()=>{ct.toggleForumTab(void 0,this)},middleware:this.middlewareHelper.get()}),this.header.append(a),!t)return this.init2()}init2(){return Je(this,void 0,void 0,(function*(){this.init2=void 0;const e=this.middlewareHelper.get(),t=this.peerId;this.managers.apiUpdatesManager.subscribeToChannelUpdates(this.peerId.toChatId()),e.onDestroy((()=>{this.managers.apiUpdatesManager.unsubscribeFromChannelUpdates(this.peerId.toChatId())}));const i=(0,Le.Z)({peerId:t,dialog:!0,wrapOptions:{middleware:e}}),s=S.ZP.setPeerStatus({peerId:t,element:this.subtitle,needClear:!0,useWhitespace:!1,middleware:e,noTyping:!0});return Promise.all([i,s,this.xd.onChatsScroll().then((e=>e.cached?e.renderPromise:void 0))]).then((([t,i,s])=>{e()&&(this.title.append(t),null==i||i())}))}))}onCloseAfterTimeout(){super.onCloseAfterTimeout(),this.xd.destroy()}}const at=new Error("not implemented");class ot{constructor(){this.onChatsRegularScroll=()=>{this.sliceTimeout&&clearTimeout(this.sliceTimeout),this.sliceTimeout=window.setTimeout((()=>{this.sliceTimeout=void 0,this.sortedList.list.childElementCount&&!ct.processContact&&(0,z.TR)((()=>{const e=performance.now(),t=this.scrollable.scrollTop,i=this.sortedList.list.firstElementChild,s=this.scrollable.container.getBoundingClientRect(),n=i.getBoundingClientRect(),a=Array.from(this.scrollable.splitUp.children);let o=this.scrollable.splitUp.offsetTop;o&&t{this.deleteDialogByKey(this.getDialogKeyFromElement(e))})),this.setOffsets();const b=c.offsetTop-u;this.scrollable.scrollTop=this.scrollable.lastScrollPosition=b,this.log("slice time",performance.now()-e,this.indexKey,b)}))}),200)},this.log=(0,w.kg)("CL"),this.offsets={top:0,bottom:0},this.managers=n.Z.managers,this.listenerSetter=new Ge.Z}getOffsetIndex(e){return{index:this.scrollable.loadedAll[e]?0:this.offsets[e]}}isDialogMustBeInViewport(e){const t=this.getOffsetIndex("top"),i=this.getOffsetIndex("bottom");if(!t.index&&!i.index)return!0;const s=(0,Se.Z)(e,this.indexKey);return(!t.index||s<=t.index)&&(!i.index||s>=i.index)}setIndexKey(e){this.indexKey=e,this.sortedList.indexKey=e}deleteDialogByKey(e){this.sortedList.delete(e)}deleteDialog(e){return this.deleteDialogByKey(this.getDialogKey(e))}updateDialog(e){const t=this.getDialogKey(e);if(!this.isDialogMustBeInViewport(e))return void this.deleteDialog(e);if(!this.sortedList.has(t)&&this.loadedDialogsAtLeastOnce)return void this.sortedList.add(t);const i=this.getDialogElement(t);i&&(ct.setLastMessageN({dialog:e,dialogElement:i,setUnread:!0}),this.sortedList.update(t))}onChatsScrollTop(){return this.onChatsScroll("top")}onChatsScroll(e="bottom"){return this.loadDialogs(e)}createPlaceholder(){const e=this.placeholder=new Ae(this.placeholderOptions),t=this.getRectFromForPlaceholder();return e.attach({container:this.sortedList.list.parentElement,getRectFrom:t,onRemove:()=>{this.placeholder===e&&(this.placeholder=void 0)},blockScrollable:this.scrollable}),e}loadDialogs(e){const t=this.log.bindPrefix("load-"+(i=1e3,s=9999,i=Math.ceil(i),s=Math.floor(s),Math.floor(Math.random()*(s-i+1))+i));var i,s;if(t("try",e),this.loadDialogsPromise||this.loadDialogsRenderPromise)return this.loadDialogsPromise;if(this.scrollable.loadedAll[e])return Promise.resolve({cached:!0,renderPromise:Promise.resolve()});t.warn("start",e);const n=(0,Oe.Z)("MIDDLEWARE"),a=(0,Ce.Z)(),o=new Promise(((i,s)=>Je(this,void 0,void 0,(function*(){const r=this.sortedList.list;let d=this.placeholder;try{const i=this.loadDialogsInner(e),s=yield i;if(!r.childElementCount&&!d&&(!this.loadedDialogsAtLeastOnce&&this.needPlaceholderAtFirstTime||!s.cached)){if(this.loadDialogsRenderPromise!==o)throw n;d=this.createPlaceholder(),a.resolve(!1)}const l=yield s.result;if(this.loadDialogsRenderPromise!==o)throw n;a.resolve(s.cached),"bottom"===e?l.isEnd&&(this.scrollable.loadedAll[e]=!0):l.isTopEnd&&(this.scrollable.loadedAll[e]=!0);const c=l.dialogs.length;if(t(`will render ${c} dialogs`),c){const t=("top"===e?l.dialogs.slice().reverse():l.dialogs).map((e=>this.sortedList.add(this.getDialogKey(e))));if(yield Promise.all(t).catch(),this.loadDialogsRenderPromise!==o)throw n}const h=l.dialogs["top"===e?0:c-1];h&&(this.offsets[e]=(0,Se.Z)(h,this.indexKey)),this.loadedDialogsAtLeastOnce=!0,ct.onListLengthChange(),t("getDialogs",l,r.childElementCount),setTimeout((()=>{this.scrollable.onScroll()}),0),d&&d.detach(r.childElementCount)}catch(e){return"MIDDLEWARE"!==(null==e?void 0:e.type)&&t.error(e),s(e),void a.reject(e)}i()})))).finally((()=>{this.loadDialogsRenderPromise===o?(t("end"),this.loadDialogsRenderPromise=void 0):t("has been cleared")}));this.loadDialogsRenderPromise=o;const r=this.loadDialogsPromise=a.then((e=>({cached:e,renderPromise:o}))).finally((()=>{this.loadDialogsPromise===r&&(this.loadDialogsPromise=void 0)}));return r}setOffsets(){return Je(this,void 0,void 0,(function*(){const e=this.sortedList.list,[t,i]=yield Promise.all([this.getDialogFromElement(e.firstElementChild),this.getDialogFromElement(e.lastElementChild)]),{indexKey:s}=this;this.offsets.top=(0,Se.Z)(t,s),this.offsets.bottom=(0,Se.Z)(i,s)}))}getDialogKey(e){throw at}getDialogKeyFromElement(e){throw at}getRectFromForPlaceholder(){throw at}getDialogFromElement(e){throw at}loadDialogsInner(e){throw at}setTyping(e){return Je(this,void 0,void 0,(function*(){const t=this.getDialogKey(e),i=this.getDialogDom(t);if(!i)return;const s=i.lastMessageSpan.querySelector(".peer-typing-container"),n=yield S.ZP.getPeerTyping(e.peerId,s,"forumTopic"===e._?e.id:void 0);!s&&n&&((0,A.Z)(i.lastMessageSpan,n),i.lastMessageSpan.classList.add("user-typing"))}))}unsetTyping(e){const t=this.getDialogKey(e),i=this.getDialogElement(t);i&&(i.dom.lastMessageSpan.classList.remove("user-typing"),ct.setLastMessageN({dialog:e,lastMessage:null,dialogElement:i,setUnread:null}))}getDialogDom(e){const t=this.sortedList.get(e);return null==t?void 0:t.dom}getDialogElement(e){const t=this.sortedList.get(e);return null==t?void 0:t.dialogElement}bindScrollable(){this.scrollable.container.addEventListener("scroll",this.onChatsRegularScroll),this.scrollable.onScrolledTop=this.onChatsScrollTop.bind(this),this.scrollable.onScrolledBottom=this.onChatsScroll.bind(this),this.scrollable.setVirtualContainer(this.sortedList.list)}clear(){var e;this.sortedList.clear(),null===(e=this.placeholder)||void 0===e||e.remove()}reset(){this.scrollable.loadedAll.top=!0,this.scrollable.loadedAll.bottom=!1,this.offsets.top=this.offsets.bottom=0,this.loadDialogsRenderPromise=void 0,this.loadDialogsPromise=void 0}fullReset(){return this.reset(),this.clear(),this.onChatsScroll()}destroy(){this.clear(),this.scrollable.destroy(),this.listenerSetter.removeAll()}}class rt extends ot{constructor(e,t){super(),this.peerId=e,this.paddingX=t,this.placeholderOptions={avatarSize:0,marginVertical:5,totalHeight:64},this.listenerSetter.add(n.Z)("peer_typings",(({peerId:e,threadId:t,typings:i})=>Je(this,void 0,void 0,(function*(){if(!t||this.peerId!==e)return;const s=yield this.managers.dialogsStorage.getForumTopic(e,t);s&&(i.length?this.setTyping(s):this.unsetTyping(s))})))),this.listenerSetter.add(n.Z)("dialogs_multiupdate",(e=>{for(const[t,{dialog:i,topics:s}]of e)t===this.peerId&&(null==s?void 0:s.size)&&s.forEach((e=>{this.updateDialog(e)}))})),this.listenerSetter.add(n.Z)("dialog_unread",(({dialog:e})=>{"forumTopic"===(null==e?void 0:e._)&&e.peerId===this.peerId&&ct.setUnreadMessagesN({dialog:e,dialogElement:this.getDialogElement(this.getDialogKey(e))})})),this.listenerSetter.add(n.Z)("dialog_notify_settings",(e=>Je(this,void 0,void 0,(function*(){if(e.peerId===this.peerId)if("dialog"!==e._)ct.setUnreadMessagesN({dialog:e,dialogElement:this.getDialogElement(this.getDialogKey(e))});else{const e=[...this.sortedList.getAll().entries()],t=e.map((([e])=>this.managers.dialogsStorage.getForumTopic(this.peerId,e))),i=yield Promise.all(t);e.forEach((([e,t],s)=>{ct.setUnreadMessagesN({dialog:i[s],dialogElement:t.dialogElement})}))}})))),this.listenerSetter.add(n.Z)("dialog_drop",(e=>{"forumTopic"===e._&&e.peerId===this.peerId&&this.deleteDialogByKey(this.getDialogKey(e))})),this.listenerSetter.add(n.Z)("dialog_draft",(({dialog:e,drop:t,peerId:i})=>{"forumTopic"===e._&&e.peerId===this.peerId&&(t?this.deleteDialog(e):this.updateDialog(e))}))}isDialogMustBeInViewport(e){return!e.pFlags.hidden&&super.isDialogMustBeInViewport(e)}getDialogKey(e){return e.id}getDialogKeyFromElement(e){return+e.dataset.threadId}getRectFromForPlaceholder(){return()=>{const e=T.ZP.rect;return{top:56,right:e.right,bottom:0,left:this.paddingX,width:e.width-this.paddingX,height:e.height-56}}}getDialogFromElement(e){return this.managers.dialogsStorage.getForumTopic(+e.dataset.peerId,+e.dataset.threadId)}loadDialogsInner(e){return Je(this,void 0,void 0,(function*(){const{indexKey:t}=this;let i=K.Z.height/64*1.25|0,s=0;const n=this.peerId,{index:a}=this.getOffsetIndex(e);if(s=a,a)if("top"===e){const e=yield this.managers.dialogsStorage.getFolderDialogs(n,!0),o=e.findIndex((e=>(0,Se.Z)(e,t)<=a)),r=Math.max(0,o-i);i=o-r,s=(0,Se.Z)(e[r],t)+1}else s=a;return this.managers.acknowledged.dialogsStorage.getDialogs({offsetIndex:s,limit:i,filterId:n,skipMigrated:!0})}))}}class dt extends ot{constructor(e){super(),this.filterId=e,this.needPlaceholderAtFirstTime=!0,this.listenerSetter.add(n.Z)("peer_typings",(({peerId:e,typings:t})=>Je(this,void 0,void 0,(function*(){const[i,s]=yield Promise.all([this.managers.appMessagesManager.getDialogOnly(e),this.managers.appPeersManager.isForum(e)]);i&&!s&&(t.length?this.setTyping(i):this.unsetTyping(i))})))),this.listenerSetter.add(n.Z)("user_update",(e=>Je(this,void 0,void 0,(function*(){if(!this.isActive)return;const t=e.toPeerId(),i=this.getDialogDom(t);if(!i)return;const s=yield this.managers.appUsersManager.getUserStatus(e),n="userStatusOnline"===(null==s?void 0:s._);this.setOnlineStatus(i.avatarEl,n)})))),this.listenerSetter.add(n.Z)("chat_update",(e=>Je(this,void 0,void 0,(function*(){const t=e.toPeerId(!0);this.processDialogForCallStatus(t)})))),this.listenerSetter.add(n.Z)("dialog_flush",(({dialog:e})=>{this.isActive&&e&&(ct.setLastMessageN({dialog:e,setUnread:!0}),this.validateDialogForFilter(e))})),this.listenerSetter.add(n.Z)("dialogs_multiupdate",(e=>{var t;if(this.isActive)for(const[i,{dialog:s,topics:n}]of e)"dialog"===(null==s?void 0:s._)&&(this.updateDialog(s),null===(t=ct.processContact)||void 0===t||t.call(ct,i.toPeerId()),this.validateDialogForFilter(s))})),this.listenerSetter.add(n.Z)("dialog_drop",(e=>{var t;this.isActive&&"dialog"===e._&&(this.deleteDialogByKey(e.peerId),null===(t=ct.processContact)||void 0===t||t.call(ct,e.peerId))})),this.listenerSetter.add(n.Z)("dialog_unread",(({dialog:e})=>{this.isActive&&"dialog"===(null==e?void 0:e._)&&(ct.setUnreadMessagesN({dialog:e,dialogElement:this.getDialogElement(this.getDialogKey(e))}),this.validateDialogForFilter(e))})),this.listenerSetter.add(n.Z)("dialog_notify_settings",(e=>{this.isActive&&"forumTopic"!==e._&&(this.validateDialogForFilter(e),ct.setUnreadMessagesN({dialog:e,dialogElement:this.getDialogElement(this.getDialogKey(e))}))})),this.listenerSetter.add(n.Z)("dialog_draft",(({dialog:e,drop:t,peerId:i})=>{var s;this.isActive&&"forumTopic"!==e._&&(t?this.deleteDialog(e):this.updateDialog(e),null===(s=ct.processContact)||void 0===s||s.call(ct,i))})),this.listenerSetter.add(n.Z)("filter_update",(e=>Je(this,void 0,void 0,(function*(){if(this.isActive&&e.id===this.filterId&&!c.DZ.has(e.id)){const e=yield this.managers.dialogsStorage.getCachedDialogs(!0);yield this.validateListForFilter();for(let t=0,i=e.length;t(0,Se.Z)(e,i)<=o)),r=Math.max(0,a-s);s=a-r,n=(0,Se.Z)(e[r],i)+1}else n=o;const r=this.managers.acknowledged.dialogsStorage.getDialogs({offsetIndex:n,limit:s,filterId:t,skipMigrated:!0}),d=yield r;return a&&(d.result=Promise.reject((0,Oe.Z)("MIDDLEWARE"))),d}))}setOnlineStatus(e,t){const i="is-online",s=e.classList.contains(i);!s&&t&&e.classList.add(i),(0,L.Z)({element:e,className:"is-visible",forwards:t,duration:250,onTransitionEnd:t?void 0:()=>{e.classList.remove(i)},useRafs:t&&!s?2:0})}generateScrollable(e,t){const i=t.id,s=new v.ZP(null,"CL",500);s.container.dataset.filterId=""+i;const a=(0,ye.Z)(t.localId),o=new it({managers:n.Z.managers,log:this.log,list:e,indexKey:a,onListLengthChange:ct.onListLengthChange});return this.scrollable=s,this.sortedList=o,this.setIndexKey(a),this.bindScrollable(),s}testDialogForFilter(e){return c.DZ.has(this.filterId)?this.filterId===e.folder_id:void 0!==(0,Se.Z)(e,this.indexKey)}isDialogMustBeInViewport(e){return!(void 0!==e.migratedTo||!this.testDialogForFilter(e))&&super.isDialogMustBeInViewport(e)}validateListForFilter(){return Je(this,void 0,void 0,(function*(){this.sortedList.getAll().forEach((e=>Je(this,void 0,void 0,(function*(){const t=yield n.Z.managers.appMessagesManager.getDialogOnly(e.id);this.testDialogForFilter(t)||this.deleteDialog(t)}))))}))}validateDialogForFilter(e){this.getDialogElement(e.peerId)&&(this.testDialogForFilter(e)||this.deleteDialog(e))}setCallStatus(e,t){let{callIcon:i,listEl:s}=e;if(!i&&t){const{canvas:t,startAnimation:n}=e.callIcon=i=function(e=!1){const t=document.createElement("canvas");t.width=t.height=ie;const i=t.getContext("2d"),s=(ie-(3*ne+2*se))/2,n=Date.now();let a=!1;const o=()=>{if(t.isConnected)a||(a=t.isConnected);else if(a)return!1;const o=X((Date.now()-n)%1e3,0,1,1e3);i.clearRect(0,0,ie,ie),i.fillStyle=e&&!J.Z.isMobile?Y.Z.getProperty("primary-color"):"#fff";for(let e=0;e<3;++e){let t;t=o>=.5?e%2?2-2*o:2*(o-.5):e%2?2*o:1-2*o;let n=4+8*t;n*=te,ee(i,s+e*ne+e*se,(ie-n)/2,ne,n,ae,!0)}return!0};return{canvas:t,startAnimation:()=>{(0,Q.jt)(o),o()},setActive:t=>{e=t,o()}}}(s.classList.contains("active"));t.classList.add("dialog-group-call-icon"),s.append(t),n()}i&&(0,L.Z)({element:e.callIcon.canvas,className:"is-visible",forwards:t,duration:250,onTransitionEnd:t?void 0:()=>{e.callIcon.canvas.remove(),e.callIcon=void 0},useRafs:t?2:0})}processDialogForCallStatus(e,t){return Je(this,void 0,void 0,(function*(){if(!oe.Z)return;if(t||(t=this.getDialogDom(e)),!t)return;const i=yield n.Z.managers.appChatsManager.getChat(e.toChatId());this.setCallStatus(t,!(!i.pFlags.call_active||!i.pFlags.call_not_empty))}))}onChatsScroll(e="bottom"){var t;return this.scrollable.loadedAll[e]&&(null===(t=ct.loadContacts)||void 0===t||t.call(ct)),this.log("onChatsScroll",e),super.onChatsScroll(e)}toggleAvatarUnreadBadges(e,t){if(!e)return void this.sortedList.getAll().forEach((e=>{const{dom:t,dialogElement:i}=e;t.unreadAvatarBadge&&i.toggleBadgeByKey("unreadAvatarBadge",!1,!1,!1)}));const i=["unread","mention"];this.sortedList.getAll().forEach((e=>{var t;const{dom:s,dialogElement:n}=e,a=null===(t=s.unreadBadge)||void 0===t?void 0:t.textContent;if(!a||s.unreadBadge.classList.contains("backwards"))return;const o=!!s.unreadAvatarBadge;n.createUnreadAvatarBadge(),n.toggleBadgeByKey("unreadAvatarBadge",!0,o),s.unreadAvatarBadge.textContent=a;const r=s.unreadAvatarBadge.classList,d=s.unreadBadge.classList;i.forEach((e=>{r.toggle(e,d.contains(e))}))}))}getDialogKey(e){return e.peerId}getDialogKeyFromElement(e){return+e.dataset.peerId}getDialogFromElement(e){return n.Z.managers.appMessagesManager.getDialogOnly(e.dataset.peerId.toPeerId())}}class lt{constructor(){this.chatsContainer=document.getElementById("chatlist-container"),this.log=(0,w.kg)("DIALOGS",w.v9.Log|w.v9.Error|w.v9.Warn|w.v9.Debug),this.folders={menu:document.getElementById("folders-tabs"),menuScrollContainer:null,container:document.getElementById("folders-container")},this.filtersRendered={},this.lastActiveElements=new Set,this.initedListeners=!1,this.xds={},this.onTabChange=()=>(this.xd=this.xds[this.filterId],this.xd.reset(),this.xd.onChatsScroll()),this._onListLengthChange=()=>{if(!this.xd.loadedDialogsAtLeastOnce)return;if(this.checkIfPlaceholderNeeded(),this.filterId!==c.J$)return;const e=this.chatList,t=e.childElementCount,i=e.parentElement.parentElement,s=e.parentElement.nextElementSibling,n=!!s.childElementCount;if(t>=10)return void(n&&this.removeContactsPlaceholder());if(n)return;i.classList.add("with-contacts");const a=new He.Z({name:"Contacts",noDelimiter:!0,fakeGradientDelimiter:!0});a.container.classList.add("hide"),this.managers.appUsersManager.getContactsPeerIds(void 0,void 0,"online").then((e=>{let t=!1;const i=()=>{t&&a.container.classList.toggle("hide",!s.list.childElementCount),this.updateContactsLength(!0)},s=new j.Z({avatarSize:"abitbigger",createChatListOptions:{dialogSize:48,new:!0},autonomous:!1,onListLengthChange:i,managers:this.managers});this.loadContacts=()=>{const t=K.Z.height/60|0;(0,De.Z)(e.splice(0,t),this.verifyPeerIdForContacts).then((e=>{e.forEach((e=>{s.add(e)}))})),e.length||(this.loadContacts=void 0)},this.loadContacts(),this.processContact=e=>Je(this,void 0,void 0,(function*(){if(e.isAnyChat())return;const t=yield this.verifyPeerIdForContacts(e),i=s.has(e);!i&&t?s.add(e):i&&!t&&s.delete(e)}));const n=s.list;n.classList.add("chatlist-new"),this.setListClickListener(n),a.content.append(n),t=!0,i()})),s.append(a.container)},this.verifyPeerIdForContacts=e=>Je(this,void 0,void 0,(function*(){const[t,i]=yield Promise.all([this.managers.appPeersManager.isContact(e),this.managers.appMessagesManager.getDialogOnly(e)]);return t&&!i}))}start(){const e=this.managers=(0,we.Z)();this.contextMenu=new f(e),this.stateMiddlewareHelper=(0,Ne.k)(),this.folders.menuScrollContainer=this.folders.menu.parentElement,this.onListLengthChange=(0,q.Z)(this._onListLengthChange,100,!1,!0);const t=document.createElement("div");t.classList.add("connection-status-bottom"),t.append(this.folders.container),this.forumsTabs=new Map,this.forumsSlider=document.createElement("div"),this.forumsSlider.classList.add("topics-slider"),this.chatsContainer.parentElement.parentElement.append(this.forumsSlider),G.Z&&(0,V.Z)({element:this.folders.container,onSwipe:e=>{const t=s.prevId();s(e<0?t+1:t-1)},verifyTouchTarget:()=>!this.forumTab}),this.allChatsIntlElement=new o.ZP.IntlElement({key:"FilterAllChatsShort"}),n.Z.addEventListener("premium_toggle",(e=>Je(this,void 0,void 0,(function*(){e||(yield this.managers.filtersStorage.isFilterIdAvailable(this.filterId))||s((0,Be.Z)(this.filtersRendered[c.J$].menu),!1)})))),n.Z.addEventListener("state_cleared",(()=>{const e=c.DZ.has(this.filterId);Fe.Z.getState().then((t=>Je(this,void 0,void 0,(function*(){this.xd.loadedDialogsAtLeastOnce=!1,this.showFiltersPromise=void 0,e&&(this.xd.clear(),this.onTabChange()),this.onStateLoaded(t)}))))})),this.setFilterId(c.J$,c.J$),this.addFilter({id:c.J$,title:"",localId:c.J$});const i=new v.v7(this.folders.menuScrollContainer);t.prepend(this.folders.menuScrollContainer);const s=this.selectTab=(0,m.X)(this.folders.menu,this.folders.container,((e,t)=>Je(this,void 0,void 0,(function*(){const i=e;if(e=+t.dataset.filterId||c.J$,-1!==this.filterId&&!c.DZ.has(e)&&!(yield this.managers.filtersStorage.isFilterIdAvailable(e)))return!1;const n=this.filterId;if(y.IS_MOBILE_SAFARI||(i?this.filtersNavigationItem||(this.filtersNavigationItem={type:"filters",onPop:()=>{s(0),this.filtersNavigationItem=void 0}},re.Z.spliceItems(1,0,this.filtersNavigationItem)):this.filtersNavigationItem&&(re.Z.removeItem(this.filtersNavigationItem),this.filtersNavigationItem=void 0)),n===e)return;this.xds[e].clear();const a=this.setFilterIdAndChangeTab(e).then((({cached:e,renderPromise:t})=>{if(e)return t}));return-1!==n?a:void 0}))),(()=>{for(const e in this.xds)+e!==this.filterId&&this.xds[e].clear()}),void 0,i);Fe.Z.getState().then((e=>(de.Z.setPlaybackParams(e.playbackParams),de.Z.addEventListener("playbackParams",(e=>{this.managers.appStateManager.pushToState("playbackParams",e)})),this.onStateLoaded(e)))),J.Z.addEventListener("resize",(()=>{this.changeFiltersAllChatsKey()})),new O(this.managers,this.chatsContainer),this.chatsContainer.append(t),setTimeout((()=>{M.Z.loadLottieWorkers()}),200),he.Z.MANAGERS=n.Z.managers=e,Ie.Z.construct(e),T.ZP.construct(e),ce.ZP.construct(e),Me.ZP.construct(e),Pe.Z.construct(e),S.ZP.construct(e),this.xd=this.xds[this.filterId]}get chatList(){return this.xd.sortedList.list}setFilterId(e,t){this.filterId=e}setFilterIdAndChangeTab(e){return Je(this,void 0,void 0,(function*(){return this.filterId=e,this.onTabChange()}))}initListeners(){n.Z.addEventListener("dialog_flush",(({dialog:e})=>{e&&this.setFiltersUnreadCount()})),n.Z.addEventListener("folder_unread",(e=>Je(this,void 0,void 0,(function*(){if(e.id<0){const t=this.xd.getDialogElement(e.id);if(!t)return;this.setUnreadMessagesN({dialog:yield this.managers.dialogsStorage.getDialogOnly(e.id),dialogElement:t})}else this.setFilterUnreadCount(e.id)})))),n.Z.addEventListener("contacts_update",(e=>{var t;null===(t=this.processContact)||void 0===t||t.call(this,e.toPeerId())})),S.ZP.addEventListener("peer_changed",(({peerId:e,threadId:t,isForum:i})=>{const s={peerId:e,threadId:i?t:void 0};for(const e of this.lastActiveElements){const t=+e.dataset.threadId||void 0,i=e.dataset.peerId.toPeerId();S.ZP.isSamePeer({peerId:i,threadId:t},s)||this.setDialogActive(e,!1)}Array.from(document.querySelectorAll(`[data-autonomous="0"] .chatlist-chat[data-peer-id="${e}"]`)).forEach((t=>{const i=+t.dataset.threadId||void 0;S.ZP.isSamePeer({peerId:e,threadId:i},s)&&this.setDialogActive(t,!0)}))})),n.Z.addEventListener("filter_update",(e=>Je(this,void 0,void 0,(function*(){if(c.DZ.has(e.id))return;if(!this.filtersRendered[e.id])return void this.addFilter(e);const t=this.filtersRendered[e.id];(0,le.Z)(t.title,(0,pe.Z)(e.title))})))),n.Z.addEventListener("filter_delete",(e=>{const t=this.filtersRendered[e.id];t&&(t.container.remove(),t.menu.remove(),this.xds[e.id].destroy(),delete this.xds[e.id],delete this.filtersRendered[e.id],this.onFiltersLengthChange(),this.filterId===e.id&&this.selectTab(0,!1))})),n.Z.addEventListener("filter_order",(e=>Je(this,void 0,void 0,(function*(){e=e.slice(),(0,Re.Z)(e,c.Zi);const t=this.folders.menu,i=yield Promise.all(e.map((e=>Je(this,void 0,void 0,(function*(){const[t,i]=yield Promise.all([this.managers.dialogsStorage.getDialogIndexKeyByFilterId(e),this.managers.filtersStorage.getFilter(e)]);return{indexKey:t,filter:i}})))));e.forEach(((e,s)=>{const{indexKey:n,filter:a}=i[s],o=this.filtersRendered[e];this.xds[e].setIndexKey(n),(0,x.Z)(o.menu,t,a.localId),(0,x.Z)(o.container,this.folders.container,a.localId)}))}))))}setDialogActive(e,t){var i;const s=e.dialogDom;e.classList.toggle("active",t),e.classList.toggle("is-forum-open",(null===(i=this.forumTab)||void 0===i?void 0:i.peerId)===e.dataset.peerId.toPeerId()&&!e.dataset.threadId),t?this.lastActiveElements.add(e):this.lastActiveElements.delete(e),(null==s?void 0:s.callIcon)&&s.callIcon.setActive(t)}onStateLoaded(e){return Je(this,void 0,void 0,(function*(){this.stateMiddlewareHelper.clean();const t=this.stateMiddlewareHelper.get(),i=e.filtersArr,s=i.length>c.DZ.size,n=e=>{for(const t of e)this.addFilter(t)};let a;s?n(i):a=this.managers.filtersStorage.getDialogFilters().then(n),this.doNotRenderChatList=!0;const o=this.xd.onChatsScroll(),r=(0,Ee.Z)(t);try{yield r(o)}catch(e){}s||this.selectTab(0,!1),a&&(yield r(a)),this.doNotRenderChatList=void 0,this.filterId=-1,this.selectTab(0,!1),this.initedListeners||(this.initListeners(),this.initedListeners=!0),s&&this.showFiltersPromise&&(yield r(this.showFiltersPromise)),this.managers.appNotificationsManager.getNotifyPeerTypeSettings(),yield(yield r(o)).renderPromise.catch(Ze.Z),this.managers.appMessagesManager.fillConversations()}))}setFilterUnreadCount(e){var t;return Je(this,void 0,void 0,(function*(){const i=null===(t=this.filtersRendered[e])||void 0===t?void 0:t.unread;if(!i)return;const{unreadUnmutedCount:s,unreadCount:n}=yield this.managers.dialogsStorage.getFolderUnreadCount(e);i.classList.toggle("badge-gray",!s);const a=e===c.J$?s:n;i.innerText=a?""+a:""}))}setFiltersUnreadCount(){for(const e in this.filtersRendered)this.setFilterUnreadCount(+e)}l(e){const t=this.createChatList(),i=this.xds[e.id]=new dt(e.id),s=i.generateScrollable(t,e);return this.setListClickListener(t,null,!0),{ul:t,xd:i,scrollable:s}}addFilter(e){if(e.id===c.Zi)return;const t=this.folders.menu,i=this.filtersRendered[e.id];if(i)return(0,x.Z)(i.menu,t,e.localId),void(0,x.Z)(i.container,this.folders.container,e.localId);const s=document.createElement("div");s.classList.add("menu-horizontal-div-item");const n=document.createElement("span"),a=document.createElement("span");a.classList.add("text-super"),e.id===c.J$?a.append(this.allChatsIntlElement.element):(0,le.Z)(a,(0,pe.Z)(e.title));const o=document.createElement("div");o.classList.add("badge","badge-20","badge-primary");const r=document.createElement("i");n.append(a,o,r),(0,g.Z)(s),s.append(n),s.dataset.filterId=""+e.id,(0,x.Z)(s,t,e.localId);const{ul:d,scrollable:l}=this.l(e);l.container.classList.add("tabs-tab","chatlist-parts");const h=document.createElement("div");h.classList.add("chatlist-top");const u=document.createElement("div");u.classList.add("chatlist-bottom"),h.append(d),l.container.append(h,u);const p=l.container;(0,x.Z)(l.container,this.folders.container,e.localId),this.filtersRendered[e.id]={menu:s,container:p,unread:o,title:a},this.onFiltersLengthChange()}changeFiltersAllChatsKey(){const e=this.folders.menuScrollContainer.firstElementChild,t=e.scrollWidth>e.clientWidth?"FilterAllChatsShort":"FilterAllChats";this.allChatsIntlElement.compareAndUpdate({key:t})}onFiltersLengthChange(){let e=this.showFiltersPromise;return null!=e?e:e=this.showFiltersPromise=(0,_e.Z)(0).then((()=>{if(this.showFiltersPromise!==e)return;const t=Object.keys(this.filtersRendered).length>1,i=!this.folders.menuScrollContainer.classList.contains("hide");t!==i&&(this.folders.menuScrollContainer.classList.toggle("hide",!t),t&&!i&&this.setFiltersUnreadCount(),this.chatsContainer.classList.toggle("has-filters",t)),this.changeFiltersAllChatsKey(),this.showFiltersPromise=void 0}))}generateEmptyPlaceholder(e){const t="empty-placeholder",i=document.createElement("div");i.classList.add(t,t+"-"+e.classNameType);const s=document.createElement("div");s.classList.add(t+"-header"),(0,o.$d)(s,e.title);const n=document.createElement("div");return n.classList.add(t+"-subtitle"),e.subtitle&&(0,o.$d)(n,e.subtitle,e.subtitleArgs),i.append(s,n),{container:i,header:s,subtitle:n}}checkIfPlaceholderNeeded(){if(this.filterId===c.Zi)return;const e=this.chatList,t=e.parentElement;let i=Array.from(t.children).find((e=>e.matches(".empty-placeholder")));const s=this.xd.scrollable.loadedAll.bottom&&!e.childElementCount;if(s&&i)return;if(!s)return void(i&&(t.classList.remove("with-placeholder"),i.remove()));let n,a;if(this.filterId){n=this.generateEmptyPlaceholder({title:"FilterNoChatsToDisplay",subtitle:"FilterNoChatsToDisplayInfo",classNameType:a="folder"}),i=n.container;const e=document.createElement("div"),t="๐Ÿ“‚",s=128;(0,be.Z)({div:e,emoji:t,width:s,height:s}),i.prepend(e);const o=(0,C.Z)("btn-primary btn-color-primary btn-control tgico",{text:"FilterHeaderEdit",icon:"settings"});(0,k.fc)(o,(()=>Je(this,void 0,void 0,(function*(){const e=T.ZP.createTab(Z.Z);e.setInitFilter(yield this.managers.filtersStorage.getFilter(this.filterId)),e.open()})))),i.append(o)}else{n=this.generateEmptyPlaceholder({title:"ChatList.Main.EmptyPlaceholder.Title",classNameType:a="dialogs"}),i=n.container;const e=document.createElement("img");e.classList.add("empty-placeholder-dialogs-icon"),this.emptyDialogsPlaceholderSubtitle=new o.ZP.IntlElement({element:n.subtitle}),Promise.all([this.updateContactsLength(!1),(0,H.cj)(e,"assets/img/EmptyChats.svg"),(0,z.AD)()]).then((([e])=>{i.classList.add("visible"),t.classList.toggle("has-contacts",!!e)})),i.prepend(e)}t.append(i),t.classList.add("with-placeholder"),t.dataset.placeholderType=a}updateContactsLength(e){var t;return null!==(t=this.updateContactsLengthPromise)&&void 0!==t?t:this.updateContactsLengthPromise=this.managers.appUsersManager.getContacts().then((t=>{const i=this.emptyDialogsPlaceholderSubtitle;if(i){let e,s;t.length?(e="ChatList.Main.EmptyPlaceholder.Subtitle",s=[(0,o.ag)("Contacts.Count",[t.length])]):(e="ChatList.Main.EmptyPlaceholder.SubtitleNoContacts",s=[]),i.compareAndUpdate({key:e,args:s})}return e&&this.chatList.parentElement.classList.toggle("has-contacts",!!t.length),this.updateContactsLengthPromise=void 0,t.length}))}removeContactsPlaceholder(){const e=this.chatList,t=e.parentElement.parentElement,i=e.parentElement.nextElementSibling;t.classList.remove("with-contacts"),i.replaceChildren(),this.loadContacts=void 0,this.processContact=void 0}toggleForumTab(e,t=this.forumTab){return Je(this,void 0,void 0,(function*(){if(!t&&!e)return;if(t){const e=this.xd.getDialogElement(t.peerId);e&&e.dom.listEl.classList.remove("is-forum-open")}t===e&&(e=void 0),null==t||t.toggle(!1);const i=null==e?void 0:e.toggle(!0);if(t===this.forumTab&&(this.forumTab=e),e){const t=this.xd.getDialogElement(e.peerId);t&&t.dom.listEl.classList.add("is-forum-open"),S.ZP.selectTab(S.oo.CHATLIST)}i&&(yield i),e&&!this.forumNavigationItem?(this.forumNavigationItem={type:"forum",onPop:()=>{this.forumNavigationItem=void 0,this.toggleForumTab()}},re.Z.pushItem(this.forumNavigationItem)):!e&&this.forumNavigationItem&&(re.Z.removeItem(this.forumNavigationItem),this.forumNavigationItem=void 0);const s=!!e,n=i?2:void 0;this.xd.toggleAvatarUnreadBadges(s,n);const a=(0,Ce.Z)();(0,L.Z)({element:this.forumsSlider.parentElement,className:"is-forum-visible",duration:300,forwards:s,useRafs:n,onTransitionEnd:()=>{a.resolve()}}),(0,qe.YW)(a,300).then((()=>a.resolve()))}))}toggleForumTabByPeerId(e,t){const{managers:i}=this,s=T.ZP.getHistory(),n=s[s.length-1];let a;if(n)return n instanceof nt&&n.peerId===e&&t?void Qe(n.container):(a=T.ZP.createTab(nt),void a.open({peerId:e,managers:i}));a=this.forumsTabs.get(e);const o=this.forumTab&&this.forumTab===a;if(null!=t||(t=!o),t!==o)return t&&!a&&(a=new nt(void 0),a.init({peerId:e,managers:i}),this.forumsTabs.set(e,a),this.forumsSlider.append(a.container),a.managers=this.managers,a.eventListener.addEventListener("destroy",(()=>{this.forumsTabs.delete(e)}))),this.toggleForumTab(a);t&&Qe(a.container)}setListClickListener(e,t,i=!1,s=!1,n=!1){let a;const o=(n?S.ZP.setInnerPeer:S.ZP.setPeer).bind(S.ZP);e.dataset.autonomous=""+ +s,e.addEventListener("mousedown",(i=>{if(0!==i.button)return;this.log("dialogs click list");const n=i.target,d=(0,r.Z)(n,et);if(!d)return;const l=d.dataset.peerId.toPeerId(),h=+d.dataset.mid||void 0,u=+d.dataset.threadId||void 0;if(null==t||t(),!d.querySelector(".is-forum")||i.shiftKey||h){if(i.ctrlKey||i.metaKey)return window.open(d.href||"#"+l,"_blank"),void(0,B.Z)(i);s&&(a&&!(a===d)&&a.classList.remove("active"),d&&(d.classList.add("active"),a=d,this.lastActiveElements.add(d))),u&&!h||this.xd.sortedList.list!==e||this.xd===this.xds[c.Zi]||this.toggleForumTab(),o({peerId:l,lastMsgId:h,threadId:u})}else this.toggleForumTabByPeerId(l)}),{capture:!0}),e.addEventListener("click",(e=>{0===e.button&&(0,B.Z)(e)}),{capture:!0}),i&&this.contextMenu.attach(e)}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}setLastMessageN(e){return this.setLastMessage(e).catch((e=>{"MIDDLEWARE"!==(null==e?void 0:e.type)&&this.log.error("set last message error",e)}))}setLastMessage({dialog:e,lastMessage:t,dialogElement:i,highlightWord:s,isBatch:a=!1,setUnread:r=!1}){var d,l;return Je(this,void 0,void 0,(function*(){if(!i&&!(i=this.xd.getDialogElement(e.peerId)))return;const{dom:c}=i,{peerId:h}=e,{deferred:u,middleware:p}=tt(c,"setLastMessagePromise");let f;if(!t&&("draftMessage"!==(null===(d=e.draft)||void 0===d?void 0:d._)||h.isAnyChat()&&"forumTopic"!==e._&&(yield this.managers.appPeersManager.isForum(h))||(f=e.draft),(null==(t=e.topMessage)?void 0:t.mid)!==e.top_message)){const i=this.managers.appMessagesManager.getMessageByPeer(h,e.top_message);t=yield p(i)}const m=null!==r&&!r;if(m||this.setUnreadMessagesN({dialog:e,dialogElement:i,isBatch:a,setLastMessagePromise:u}),!t)return c.lastMessageSpan.replaceChildren(),c.lastTimeSpan.replaceChildren(),delete c.listEl.dataset.mid,void u.resolve();const g=t&&(0,me.Z)(t);{let e;const i=[];if(t&&!f&&!g){const s=(0,ge.Z)(t),n=new Set(["video","gif","round"]);if(s&&("photo"===s._||n.has(s.type))){const a=(0,ue.Z)(s,20,20);if("photoSizeEmpty"!==a._&&(e=document.createElement("div"),e.classList.add("dialog-subtitle-media"),"round"===s.type&&e.classList.add("is-round"),i.push((0,P.Z)({photo:s,message:t,container:e,withoutPreloader:!0,size:a}).then((()=>e))),n.has(s.type))){const t=document.createElement("span");t.classList.add("tgico-play"),e.append(t)}}}if(f){const e=document.createElement("span");e.classList.add("danger"),e.append((0,o.ag)("Draft"),": "),i.unshift(e)}else if(h.isAnyChat()&&h!==t.fromId&&!t.action){const e=document.createElement("span");if(e.classList.add("primary-text"),t.fromId===n.Z.myId)e.append((0,o.ag)("FromYou")),i.unshift(e);else{const s=p((0,Le.Z)({peerId:t.fromId,onlyFirstName:!0})).then((t=>(e.prepend(t),e)),Ze.Z);i.unshift(s)}e.append(": ")}const a=!!e&&!!(null==t?void 0:t.message);let r;if(r=s&&t.message?yield p((0,fe.Z)({message:t,highlightWord:s,withoutMediaType:a})):f?yield p((0,fe.Z)({message:f})):t?yield p((0,fe.Z)({message:t,withoutMediaType:a})):document.createDocumentFragment(),i.length){const e=yield p(Promise.all(i));r.prepend(...e)}(0,A.Z)(c.lastMessageSpan,r)}if(t||f){const e=f?Math.max(f.date,t.date||0):t.date;(0,A.Z)(c.lastTimeSpan,(0,b.zM)(new Date(1e3*e)))}else c.lastTimeSpan.textContent="";if(m){c.listEl.dataset.mid=""+t.mid;const e=t.reply_to;(null===(l=null==e?void 0:e.pFlags)||void 0===l?void 0:l.forum_topic)&&(c.listEl.dataset.threadId=""+(0,Ke.Z)(t))}u.resolve()}))}setUnreadMessagesN(e){return this.setUnreadMessages(e).catch((()=>{}))}setUnreadMessages({dialog:e,dialogElement:t,isBatch:i=!1,setLastMessagePromise:s}){var a;return Je(this,void 0,void 0,(function*(){const{dom:o}=t;if(!o)return;const r="forumTopic"===e._,{deferred:d,middleware:l}=tt(o,"setUnreadMessagePromise"),{peerId:h}=e,u=Promise.all([this.managers.appNotificationsManager.isPeerLocalMuted({peerId:h,respectType:!0,threadId:r?e.id:void 0}),"draftMessage"!==(null===(a=e.draft)||void 0===a?void 0:a._)?this.managers.appMessagesManager.getMessageByPeer(h,e.top_message):void 0,r?!!e.pFlags.pinned:this.managers.dialogsStorage.isDialogPinned(h,this.filterId),this.managers.appMessagesManager.isDialogUnread(e),h.isAnyChat()&&!r?this.managers.acknowledged.dialogsStorage.getForumUnreadCount(h).then((i=>i.cached?i.result:(i.result.then((()=>{this.setUnreadMessagesN({dialog:e,dialogElement:t})})),{count:0,hasUnmuted:!1}))).catch((()=>{})):void 0]);let[p,f,m,g,v]=yield l(u);const b=o.listEl.classList.contains("is-muted"),{count:y,hasUnmuted:w}=v||{};let S;f&&f.pFlags.out&&f.peerId!==n.Z.myId&&(S=f);const C=null!=y?y:e.unread_count;void 0!==y&&(g=!!C),r&&!g&&(g=!(0,Xe.Z)(e.read_inbox_max_id));const E=m||g,I=this.xd!==this.xds[c.Zi]&&!r&&!!this.forumTab&&this.xd.getDialogElement(h)===t&&g;if(s)try{yield l(s)}catch(e){return}const M=i?0:250;o.listEl.classList.toggle("no-unmuted-topic",!p&&void 0!==w&&!w),p!==b&&(0,L.Z)({element:o.listEl,className:"is-muted",forwards:p,duration:M}),function(e,t,i){let s;if("string"==typeof t?s=t:(null==t?void 0:t.pFlags.out)&&(s=t.error?"sendingerror":t.pFlags.is_outgoing?"sending":t.pFlags.unread?"check":"checks"),!s)return void(e.textContent="");const n="tgico-"+s,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()}(o.statusSpan,r&&e.pFlags.closed?"premium_lock":S);const P=!!o.unreadBadge;E&&t.createUnreadBadge();const Z=!!o.unreadAvatarBadge;I&&t.createUnreadAvatarBadge();const T=e.unread_mentions_count&&(e.unread_mentions_count>1||e.unread_count>1),k=!!o.mentionsBadge;if(T&&t.createMentionsBadge(),[["unreadBadge",E,P],["unreadAvatarBadge",I,Z],["mentionsBadge",T,k]].forEach((([e,s,n])=>{o[e]&&t.toggleBadgeByKey(e,s,n,i)})),!E)return void d.resolve();m?o.unreadBadge.classList.add("tgico-chatspinned","tgico"):o.unreadBadge&&o.unreadBadge.classList.remove("tgico-chatspinned","tgico");let x,A=!0,_=!1;if(e.unread_mentions_count&&1===C?(x="@",_=!0):g?x=""+(C?(0,We.Z)(C,1):" "):(x="",A=!1),r){const e=g&&" "===x;o.unreadBadge.classList.toggle("not-visited",e)}[[o.unreadBadge,x],[o.unreadAvatarBadge,x||void 0]].filter(Boolean).forEach((([e,t])=>{void 0!==t&&(e.innerText=x),e.classList.toggle("unread",A),e.classList.toggle("mention",_)})),d.resolve()}))}getDialog(e,t){return Je(this,void 0,void 0,(function*(){if("object"!=typeof e){let i;if(t){if(i=yield this.managers.dialogsStorage.getForumTopic(e,t),!i)return{peerId:e||c.NM,pFlags:{}}}else if(i=yield this.managers.appMessagesManager.getDialogOnly(e),!i){const t=e||c.NM;return{peerId:t,peer:yield this.managers.appPeersManager.getOutputPeer(t),pFlags:{}}}return i}return e}))}addListDialog(e){var t;e.autonomous=!1;const i=this.addDialogNew(e);if(i){const{peerId:s}=e,a=this.getDialog(s,e.threadId).then((t=>{const a=[],o=s.isUser();return o||"dialog"!==t._||a.push(this.xd.processDialogForCallStatus(s,i.dom)),s!==n.Z.myId&&o&&a.push(this.managers.appUsersManager.getUserStatus(s.toUserId()).then((e=>{"userStatusOnline"===(null==e?void 0:e._)&&this.xd.setOnlineStatus(i.dom.avatarEl,!0)}))),a.push(this.setLastMessageN({dialog:t,dialogElement:i,isBatch:e.isBatch,setUnread:!0})),Promise.all(a)}));null===(t=e.loadPromises)||void 0===t||t.push(a)}return i}addDialogAndSetLastMessage(e){const{peerId:t,message:i,query:s}=e,n=this.addDialogNew(Object.assign(Object.assign(Object.assign({},e),(0,ve.Z)(i)),{peerId:t}));return this.setLastMessageN({dialog:{_:"dialog",peerId:t},lastMessage:i,dialogElement:n,highlightWord:s}),i.peerId!==t&&(n.dom.listEl.dataset.peerId=""+i.peerId),n}addDialogNew(e){const t=new st(Object.assign({autonomous:!!e.container,avatarSize:"bigger"},e));if(e.container){const i=e.append?"prepend":"append";e.container[i](t.container)}return t}}const ct=new lt;E.GO.appDialogsManager=ct;const ht=ct},2312:(e,t,i)=>{"use strict";i.d(t,{Z:()=>v});var s=i(3725),n=i(2202),a=i(3512),o=i(410),r=i(319),d=i(1243),l=i(7086),c=i(1655),h=i(5471),u=i(8801),p=i(6658),f=i(7667),m=i(3855);const g=new class{constructor(){this.downloads={},this.progress={}}construct(e){this.managers=e,a.Z.addEventListener("download_progress",(e=>{var t;const i=this.downloads[e.fileName];(null===(t=null==i?void 0:i.main)||void 0===t?void 0:t.notifyAll)&&(this.progress[e.fileName]=e,i.main.notifyAll(e))}))}getNewDeferred(e,t){const i=(0,s.Z)();let n=this.downloads[e];if(n){const e=n.main;["cancel","addNotifyListener","notify","notifyAll"].forEach((t=>{e[t]&&(i[t]=e[t].bind(e))}))}else n=this.downloads[e]={main:i},i.cancel=()=>{const t=(0,h.Z)("DOWNLOAD_CANCELED");this.managers.apiFileManager.cancelDownload(e),i.reject(t),i.cancel=r.Z},i.catch((()=>{this.clearDownload(e,t)})).finally((()=>{delete this.progress[e]}));return"disc"===t&&i.catch(r.Z).finally((()=>{this.clearDownload(e,t)})),n[t]=i}getNewDeferredForUpload(e,t){const i=this.getNewDeferred(e);return t.then(i.resolve,i.reject),i.finally((()=>{this.clearDownload(e)})),i}clearDownload(e,t){const i=this.downloads[e];if(!i)return;delete i[t];const s=Object.keys(i).length;(!s||i.main&&1===s)&&delete this.downloads[e]}getUpload(e){let t=this.getDownload(e);return t||(t=this.getNewDeferred(e),this.managers.appMessagesManager.getUploadPromise(e).then(t.resolve,t.reject),t)}d(e,t,i){let s=this.getDownload(e,i);return s||(s=this.getNewDeferred(e,i),t().then(s.resolve,s.reject),s)}download(e){const t=(0,l.Z)(e);return this.d(t,(()=>this.managers.apiFileManager.download(e)),"blob")}downloadMedia(e,t="blob",i){const{downloadOptions:s,fileName:n}=(0,d.Z)(e);return this.d(n,(()=>{let s;return s="url"===t?this.managers.apiFileManager.downloadMediaURL:"void"===t?this.managers.apiFileManager.downloadMediaVoid:this.managers.apiFileManager.downloadMedia,i?i.then((()=>s(e))):s(e)}),t)}downloadMediaURL(e){return this.downloadMedia(e,"url")}downloadMediaVoid(e){return this.downloadMedia(e,"void")}upload(e,t,i){return t||(t=(0,n.Z)(e)),i||(i=this.managers.apiFileManager.upload({file:e,fileName:t})),this.getNewDeferredForUpload(t,i)}getDownload(e,t){const i=this.downloads[e];return i&&i[t]}downloadToDisc(e,t){const i=e.media,s="document"===i._;s||e.thumb||(e.thumb=i.sizes.slice().pop());const n=""+(2147483647*Math.random()|0),a=`download/${n}`;e.downloadId=n;const o=m.Z.pingServiceWorkerWithIframe(),d=this.downloadMedia(e,"disc",o);if(t)return d;const l=document.createElement("iframe");l.hidden=!0,o.then((()=>{l.src=a,document.body.append(l)}));let h,g=!1;const v=()=>{g||(g=!0,h=l,(0,c.Z)(d.listeners,v))};return d.addNotifyListener(v),d.then((t=>{if(!t)return;const n=URL.createObjectURL(t),a=s?(0,p.Z)(i):(0,f.Z)(i,e.thumb),o=e.media.file_name||(0,u.P)(a.location);!function(e,t,i){const s=document.createElement("a");s.href=e,s.download=t,s.target="_blank",s.style.position="absolute",s.style.top="1px",s.style.left="1px",document.body.append(s);try{const e=document.createEvent("MouseEvents");e.initMouseEvent("click",!0,!1,window,0,0,0,0,0,!1,!1,!1,!1,0,null),s.dispatchEvent(e)}catch(t){console.error("Download click error",t);try{s.click()}catch(t){window.open(e,"_blank")}}setTimeout((()=>{s.remove(),i&&i()}),100)}(n,a.fileName||o,(()=>{URL.revokeObjectURL(n)}))})).catch(r.Z).finally((()=>{g||v(),setTimeout((()=>{null==h||h.remove()}),1e3)})),d}};o.GO&&(o.GO.appDownloadManager=g);const v=g},9322:(e,t,i)=>{"use strict";i.d(t,{oo:()=>Yr,ZP:()=>id});var s=i(5814),n=i(744),a=i(4332),o=i(4755),r=i(5003),d=i(3512),l=i(3241),c=i(5432),h=i(1655),u=i(6519),p=i(4484),f=i(9331),m=i(1507),g=i(7625);function v(e,t){const i=[],s=[];for(let n=0,a=e.length;n{this.mountItem(e,s-1-i,t)})),e&&this.updateClassNames(),this.onItemMount()}mountItem(e,t=this.items.indexOf(e),i=this.offset){e.mounted||((0,p.Z)(e.bubble,this.container,i+t),e.mounted=!0)}unmountItem(e){e.mounted&&(e.bubble.remove(),e.mounted=!1,this.onItemUnmount())}onItemMount(){if(this.mounted)return;const e=this.chat.bubbles.getDateContainerByTimestamp(this.dateTimestamp/1e3),t=this.groups.groups.filter((e=>e.dateTimestamp===this.dateTimestamp)),i=t.length,s=t.indexOf(this),n=t.slice(s+1).reduce(((e,t)=>e+(t.mounted?0:1)),0);(0,p.Z)(this.container,e.container,Cs+i-1-s-n),this.mounted=!0}onItemUnmount(){this.mounted&&(this.items.length?this.updateClassNames():(this.container.remove(),this.chat.bubbles.deleteEmptyDateGroups(),this.mounted=!1))}}class w{constructor(e){this.chat=e,this.itemsArr=[],this.itemsMap=new Map,this.groups=[],this.newGroupDiff=121,this.sortItemsKey="scheduled"===e.type?"timestamp":"mid",this.sortGroupsKey="scheduled"===e.type?"lastTimestamp":"lastMid",this.sortGroupItemsKey="groupMid"}removeItem(e){var t;null===(t=e.group)||void 0===t||t.removeItem(e),this.removeItemFromCache(e)}removeAndUnmountBubble(e){const t=this.getItemByBubble(e);if(!t)return e.parentElement&&e.remove(),!1;const i=this.itemsArr,s=i.indexOf(t),n=this.getSiblingsAtIndex(s,i),a=t.group;this.removeItem(t);const o=new Set;a&&(a.unmountItem(t),o.add(a));const[r,d]=n;if(r&&d&&this.canItemsBeGrouped(r,d)&&r.group!==d.group){const e=d.group;this.f(d.group.items),e.onItemUnmount(),o.add(r.group),this.groupUngrouped()}return this.mountUnmountGroups(Array.from(o)),!0}mountUnmountGroups(e){const[t,i]=v(e,(e=>!!e.items.length));i.forEach((e=>{e.onItemUnmount()})),t.forEach((e=>{e.mount(!0)}))}f(e,t=0,i=e.length){for(;ts.add(e)))}}return s}cleanup(){this.itemsArr=[],this.groups=[],this.itemsMap.clear()}}var S=i(1168),C=i(2738),L=i(2325),E=i(503);class I extends S.Z{constructor(e,t,i={}){if(super("popup-date-picker",Object.assign({body:!0,overlayClosable:!0,buttons:i.noButtons?[]:[{langKey:"JumpToDate",callback:()=>{this.onPick&&this.onPick(this.selectedDate.getTime()/1e3|0)}},{langKey:"Cancel",isCancel:!0}],title:!0},i)),this.onPick=t,this.options=i,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 i=+t.dataset.timestamp;this.selectedDate=new Date(i),this.setTitle(),this.setTimeTitle()},this.minDate=i.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&&s&&s(+o[1]),o="0"+o[0]),t.setValueSilently(o),i(o.length)}))};this.hoursInputField=new E.ZP({plainText:!0}),this.minutesInputField=new E.ZP({plainText:!0}),i(23,this.hoursInputField,(e=>{2===e&&this.minutesInputField.input.focus(),this.setTimeTitle()}),(e=>{this.minutesInputField.value=(e+this.minutesInputField.value).slice(0,2)})),i(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),(0,C.fc)(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 s=document.createElement("div");s.classList.add("popup-centerer"),s.append(this.container),this.element.append(s),e.setHours(0,0,0,0),this.selectedDate=e,this.maxDate=i.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"),i.noTitle&&(this.setTitle=()=>{}),this.setTimeTitle(),this.setTitle(),this.setMonth()}setTimeTitle(){if(this.btnConfirm&&this.selectedDate){let e;const t=[],i=new Date;i.setHours(0,0,0,0);const s={minute:"2-digit",hour:"2-digit"},n=new Date(this.selectedDate.getTime());if(n.setHours(+this.hoursInputField.value,+this.minutesInputField.value),this.selectedDate.getTime()===i.getTime())e="Schedule.SendToday";else{e="Schedule.SendDate";const s={month:"short",day:"numeric"};n.getFullYear()!==i.getFullYear()&&(s.year="numeric"),t.push(new L.ZP.IntlDateElement({date:n,options:s}).element)}t.push(new L.ZP.IntlDateElement({date:n,options:s}).element),this.btnConfirm.firstChild.replaceWith((0,L.ag)(e,t))}}setTitle(){this.title.textContent="",this.title.append(new L.ZP.IntlDateElement({date:this.selectedDate,options:{day:"numeric",month:"long",weekday:"short"}}).element)}renderElement(e,t=""){const i=document.createElement("button");return i.classList.add("btn-icon","date-picker-month-date"),e&&i.setAttribute("disabled","true"),t&&i.append(t),i}setMonth(){const e=new Date(this.selectedMonth),t={year:"numeric",month:this.timeDiv&&o.Z.isMobile?"short":"long"};this.monthTitle.textContent="",this.monthTitle.append(new L.ZP.IntlDateElement({date:e,options:t}).element),this.month&&this.month.remove(),this.month=document.createElement("div"),this.month.classList.add("date-picker-month");const i=new Date,s=i.getDay();1!==s&&i.setHours(-24*(s-1));for(let e=0;e<7;++e){const e=this.renderElement(!0,new L.ZP.IntlDateElement({date:i,options:{weekday:"narrow"}}).element);e.classList.remove("date-picker-month-date"),e.classList.add("date-picker-month-day"),this.month.append(e),i.setDate(i.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{f&&!f()||(p.forEach((e=>e.remove())),o&&o.classList.toggle("is-round",u))})),h}))}class X extends G{constructor(e,t){super(e,((e,i="",s)=>q(this,void 0,void 0,(function*(){this.mediaEl||(this.mediaEl=document.createElement("div"),this.mediaEl.classList.add(this.className+"-media"));const n=yield Y({title:e,titleEl:this.title,subtitle:i,subtitleEl:this.subtitle,mediaEl:this.mediaEl,message:s,animationGroup:t});this.container.classList.toggle("is-media",n),n?this.content.prepend(this.mediaEl):this.mediaEl.remove()})))),this.className=e,this.animationGroup=t}}function J(e,t,i,s,n){const a=new X("reply",i),o=a.fill(e,t,s);if(n){const e=(0,U.Z)(n,!1),[t,i,s]=(0,O.oo)(e);a.container.style.setProperty("--override-color",`${t}, ${i}, ${s}`),a.container.classList.add("is-overriding-color")}return{container:a.container,fillPromise:o}}const ee="stacked-avatars",te=ee+"-avatar",ie=te+"-container";class se{constructor(e){this.lazyLoadQueue=e.lazyLoadQueue,this.avatarSize=e.avatarSize,this.container=document.createElement("div"),this.container.classList.add(ee),this.container.style.setProperty("--avatar-size",e.avatarSize+"px")}render(e,t){const i=this.container.children;(e=e.slice().reverse()).length>3&&(e=e.slice(-3)),e.forEach(((e,s)=>{let n=i[s];n||(n=document.createElement("div"),n.classList.add(ie));let a=n.firstElementChild;a||(a=new f.Z,a.classList.add("avatar-"+this.avatarSize,te),a.updateOptions({isDialog:!1,loadPromises:t})),a.updateWithOptions({lazyLoadQueue:this.lazyLoadQueue,peerId:e}),a.parentNode||n.append(a),n.parentNode||this.container.append(n)})),Array.from(i).slice(e.length).forEach((e=>e.remove()))}}const ne="replies-element";d.Z.addEventListener("replies_updated",(e=>{Array.from(document.querySelectorAll(ne+`[data-post-key="${e.peerId}_${e.mid}"]`)).forEach((t=>{t.message=e,t.render()}))}));class ae extends HTMLElement{constructor(){super(),this.updated=!1,this.managers=d.Z.managers}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;this.firstElementChild&&(t=this.firstElementChild),(null==e?void 0:e.recent_repliers)?(t&&!t.classList.contains("replies-footer-avatars")&&(this.innerHTML="",t=null),this.stackedAvatars||(this.stackedAvatars=new se({lazyLoadQueue:this.lazyLoadQueue,avatarSize:30}),this.stackedAvatars.container.classList.add("replies-footer-avatars")),t=this.stackedAvatars.container,this.stackedAvatars.render(e.recent_repliers.map((e=>(0,R.Z)(e))),this.loadPromises)):(t&&!t.classList.contains("tgico-comments")&&(t.remove(),t=null),t||(t=document.createElement("span"),t.classList.add("tgico-comments"))),t.parentElement||this.prepend(t),this.text||(this.text=new L.ZP.IntlElement);const i=this.text;if(e?e.replies?i.compareAndUpdate({key:"Comments",args:[e.replies]}):i.compareAndUpdate({key:"LeaveAComment"}):i.compareAndUpdate({key:"ViewInChat"}),e){let t=!1;e.replies&&void 0!==e.read_max_id&&void 0!==e.max_id&&(t=e.read_max_id${(null==e?void 0:e.replies)?(0,D.Z)(e.replies,0):""}`;!e||this.updated||this.message.pFlags.is_outgoing||(this.managers.appMessagesManager.subscribeRepliesThread(this.message.peerId,this.message.mid),this.managers.appMessagesManager.updateMessage(this.message.peerId,this.message.mid,"replies_updated"),this.updated=!0),this.loadPromises&&(this.loadPromises=void 0)}}customElements.define(ne,ae);const oe=()=>{const e=document.createElement("i");return e.classList.add("edited"),(0,L.$d)(e,"EditedMessage"),e},re=()=>(0,L.ag)("SponsoredMessage");var de;!function(e){e.setTime=e=>{var t;const{chatType:i,message:s}=e,n=new Date(1e3*s.date),a=[];let o,r;const d=!!s.pFlags.sponsored,l=!("action"in s)&&!d,c=d?void 0:(0,_.mr)(n);if(l){if(s.views){const e=s.post_author||(null===(t=s.fwd_from)||void 0===t?void 0:t.post_author),i=document.createElement("span");i.classList.add("post-views"),i.innerHTML=(0,D.Z)(s.views,1);const n=document.createElement("i");if(n.classList.add("tgico-channelviews","time-icon"),a.push(i,n),e){const t=document.createElement("span");(0,F.Z)(t,(0,B.Z)(e)),t.insertAdjacentHTML("beforeend",", "),a.push(t)}}if(s.edit_date&&"scheduled"!==i&&!s.pFlags.edit_hide&&a.unshift(o=oe()),"pinned"!==i&&s.pFlags.pinned){const e=document.createElement("i");e.classList.add("tgico-pinnedchat","time-icon"),a.unshift(e)}}else d&&a.push(r=re());c&&a.push(c);let h=d?void 0:(0,_.xE)(n);l&&(h+=(s.edit_date&&!s.pFlags.edit_hide?`\nEdited: ${(0,_.xE)(new Date(1e3*s.edit_date))}`:"")+(s.fwd_from?`\nOriginal: ${(0,_.xE)(new Date(1e3*s.fwd_from.date))}`:""));const u=document.createElement("span");u.classList.add("time","tgico"),u.append(...a);const p=document.createElement("div");p.classList.add("inner","tgico"),h&&(p.title=h);let f=a;return o&&(f[f.indexOf(o)]=oe()),r&&(f[f.indexOf(r)]=re()),f=f.map((e=>e instanceof HTMLElement&&!e.classList.contains("i18n")&&!e.classList.contains("reactions")?e.cloneNode(!0):e)),c&&(f[f.length-1]=(0,_.mr)(n)),p.append(...f),u.append(p),u},e.renderReplies=({bubble:e,bubbleContainer:t,message:i,messageDiv:s,loadPromises:n,lazyLoadQueue:a})=>{const o=!e.classList.contains("sticker")&&!e.classList.contains("emoji-big")&&!e.classList.contains("round"),r=new ae;return r.message=i,r.type=o?"footer":"beside",r.loadPromises=n,r.lazyLoadQueue=a,r.init(),t.prepend(r),o},e.setReply=({chat:e,bubble:t,bubbleContainer:i,message:s})=>{return n=this,a=void 0,r=function*(){const n=!i;n&&(i=t.querySelector(".bubble-content"));const a=n?i.querySelector(".reply"):null;if(!s.reply_to_mid)return null==a||a.remove(),void t.classList.remove("is-reply");const o=s.reply_to.reply_to_peer_id?(0,R.Z)(s.reply_to.reply_to_peer_id):e.peerId,r=yield d.Z.managers.appMessagesManager.getMessageByPeer(o,s.reply_to_mid);let l,c;if(r){const e=r.fwdFromId;c=s.fwdFromId&&s.fwdFromId===e?s.fwdFromId:r.fromId||e,l=new N.Z({peerId:c,dialog:!1,onlyFirstName:!1,plainText:!1}).element}else d.Z.managers.appMessagesManager.fetchMessageReplyTo(s),e.bubbles.needUpdate.push({replyToPeerId:o,replyMid:s.reply_to_mid,mid:s.mid}),l=(0,L.ag)("Loading");const{container:h,fillPromise:u}=J(l,void 0,e.animationGroup,r,e.isAnyGroup?c:void 0);return yield u,a?(a.classList.contains("floating-part")&&h.classList.add("floating-part"),a.replaceWith(h)):i.append(h),t.classList.add("is-reply"),h},new((o=void 0)||(o=Promise))((function(e,t){function i(e){try{d(r.next(e))}catch(e){t(e)}}function s(e){try{d(r.throw(e))}catch(e){t(e)}}function d(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(i,s)}d((r=r.apply(n,a||[])).next())}));var n,a,o,r}}(de||(de={}));var le=i(2153),ce=i(3699),he=i(8448),ue=i(4789),pe=i(8594),fe=i(3035),me=i(3725),ge=i(410),ve=i(252),be=i(8497),ye=i(4668),we=i(2796),Se=i(3624),Ce=i(3910),Le=i(5705);function Ee(e){e.style.display="none",e.offsetLeft,e.style.display=""}var Ie=i(2648),Me=i(5296),Pe=i(8938),Ze=i(5701);const Te=2147483646;var ke,xe=i(241),Ae=i(6272),_e=i(1784),Fe=i(9099),De=i(2416),Re=i(8763),Be=i(5975),Ne=i(8939),Oe=i(993),Ue=i(4494),He=i(8204),ze=i(2575),je=i(9931);class Ge extends S.Z{constructor(e,t){super("popup-join-chat-invite",{closable:!0,overlayClosable:!0,body:!0,buttons:(0,S.x)([{langKey:t.pFlags.request_needed?"RequestJoin.Button":t.pFlags.broadcast?"JoinByPeekChannelTitle":"JoinByPeekGroupTitle",callback:()=>{this.managers.appChatsManager.importChatInvite(e).then((e=>{const t=e.toPeerId(!0);id.setInnerPeer({peerId:t})}),(e=>{"INVITE_REQUEST_SENT"===e.type&&(0,we.bC)({langPackKey:"RequestToJoinSent"})}))}}])}),this.hash=e,this.chatInvite=t,this.construct()}construct(){return e=this,t=void 0,s=function*(){this.header.remove();const{chatInvite:e,managers:t,hash:i}=this,s=new f.Z;s.classList.add("avatar-100"),s.isDialog=!1,"photo"===e.photo._?(e.photo=yield t.appPhotosManager.savePhoto(e.photo),(0,K.Z)({container:s,message:null,photo:e.photo,boxHeight:100,boxWidth:100,withoutPreloader:!0}),s.style.width=s.style.height=""):(0,je.Z)({div:s,peerId:m.NM,isDialog:!1,title:e.title});const n=document.createElement("div");n.classList.add("chat-title"),(0,F.Z)(n,(0,B.Z)(e.title));const a=e.pFlags.broadcast,o=(0,L.ag)(a?"Subscribers":"Members",[(0,ze.Z)(e.participants_count)]);if(o.classList.add("chat-participants-count"),this.body.append(s,n,o),e.pFlags.request_needed){const e=document.createElement("div");(0,L.$d)(e,a?"RequestToJoinChannelDescription":"RequestToJoinGroupDescription"),e.classList.add("chat-participants-count","request-caption"),this.body.append(e)}this.show()},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}!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",e[e.USER_PHONE_NUMBER=5]="USER_PHONE_NUMBER",e[e.INVOICE=6]="INVOICE",e[e.EMOJI_SET=7]="EMOJI_SET"}(ke||(ke={}));var Ve=i(5285),Ke=i(6654),We=i(9083),$e=i(6775),qe=i(9405),Qe=i(319);const Ye="reaction",Xe=Ye+"-element";class Je extends HTMLElement{constructor(){super(),this.classList.add(Ye),this.managers=d.Z.managers}get reactionCount(){return this._reactionCount}set reactionCount(e){this._reactionCount=e}get count(){return this.reactionCount.count}init(e,t){this.type=e,this.classList.add(Ye+"-"+e),this.middleware=t}setCanRenderAvatars(e){this.canRenderAvatars=e}render(e){const t=!!this.stickerContainer;t||(this.stickerContainer=document.createElement("div"),this.stickerContainer.classList.add(Ye+"-sticker"),this.append(this.stickerContainer));const i=this.reactionCount;if(!e&&!t){const e=i.reaction;if("reactionEmoji"===e._){const t=this.managers.appReactionsManager.getReaction(e.emoticon);(0,Ke.Z)(t,(e=>{var t;e.center_icon||this.stickerContainer.classList.add("is-static"),e.pFlags.inactive&&this.classList.add("is-inactive"),this.renderDoc(null!==(t=e.center_icon)&&void 0!==t?t:e.static_icon)}))}else if("reactionCustomEmoji"===e._){this.stickerContainer.classList.add("is-custom");const t=(0,We.Z)({docIds:[e.document_id],customEmojiSize:(0,qe.C)(22,22)});this.stickerContainer.append(t)}}}renderDoc(e){const t="inline"===this.type?14:22,i=this.wrapStickerPromise=(0,W.ZP)({div:this.stickerContainer,doc:e,width:t,height:t,static:!0,managers:this.managers,middleware:this.middleware}).then((({render:e})=>e)).finally((()=>{this.wrapStickerPromise===i&&(this.wrapStickerPromise=void 0)}))}renderCounter(){var e;const t=this.reactionCount,i="inline"===this.type?2:4;if(t.count>=i||"block"===this.type&&!this.canRenderAvatars){this.counter||(this.counter=document.createElement("inline"===this.type?"i":"span"),this.counter.classList.add(Ye+"-counter"));const e=(0,D.Z)(t.count);this.counter.textContent!==e&&(this.counter.textContent=e),this.counter.parentElement||this.append(this.counter)}else(null===(e=this.counter)||void 0===e?void 0:e.parentElement)&&(this.counter.remove(),this.counter=void 0)}renderAvatars(e){"inline"!==this.type&&(this.reactionCount.count>=4||!this.canRenderAvatars?this.stackedAvatars&&(this.stackedAvatars.container.remove(),this.stackedAvatars=void 0):(this.stackedAvatars||(this.stackedAvatars=new se({avatarSize:24}),this.append(this.stackedAvatars.container)),this.stackedAvatars.render(e.map((e=>(0,R.Z)(e.peer_id))))))}setIsChosen(e=void 0!==this.reactionCount.chosen_order){"inline"!==this.type&&(this.classList.contains("is-chosen")&&!this.classList.contains("backwards"))!==e&&(0,Fe.Z)({element:this,className:"is-chosen",forwards:e,duration:this.isConnected?300:0})}fireAroundAnimation(){const e=this.reactionCount.reaction;"reactionEmoji"===e._&&(0,Ke.Z)(this.managers.appReactionsManager.getReaction(e.emoticon),(e=>{const t="inline"===this.type?28:40,i=document.createElement("div");i.classList.add(Ye+"-sticker-activate"),Promise.all([(0,W.ZP)({div:i,doc:e.center_icon,width:t,height:t,withThumb:!1,needUpscale:!0,play:!1,skipRatio:1,group:"none",needFadeIn:!1,managers:this.managers,middleware:this.middleware}).then((({render:e})=>e)),(0,$e.Z)({doc:e.around_animation,size:80,target:this.stickerContainer,side:"center",skipRatio:1,play:!1,managers:this.managers,middleware:this.middleware}).stickerPromise.catch(Qe.Z)]).then((([e,t])=>{const s=()=>{e.remove(),i.remove(),this.stickerContainer.classList.remove("has-animation")};if(!t)return void s();const n=()=>{(0,fe.T2)(s)};e.addEventListener("enterFrame",(t=>{t===e.maxFrame&&(this.wrapStickerPromise?this.wrapStickerPromise.then((()=>{setTimeout(n,1e3)})):n())})),e.addEventListener("firstFrame",(()=>{this.stickerContainer.append(i),this.stickerContainer.classList.add("has-animation"),e.play(),t.play()}),{once:!0})}))}))}}customElements.define(Xe,Je);const et="reactions",tt=et+"-element",it=new Map;class st extends HTMLElement{constructor(){super(),this.classList.add(et),this.sorted=[],this.middlewareHelpers=new Map,this.managers=d.Z.managers}connectedCallback(){let e=it.get(this.key);e||it.set(this.key,e=new Set),e.add(this),this.onConnectCallback&&this.isConnected&&(this.onConnectCallback(),this.onConnectCallback=void 0)}disconnectedCallback(){const e=it.get(this.key);e.delete(this),e.size||it.delete(this.key)}getReactionCount(e){return this.sorted[this.sorted.indexOf(e)].reactionCount}getMessage(){return this.message}init(e,t,i,s=this.isPlaceholder){void 0!==this.key&&this.disconnectedCallback(),this.middleware!==i&&i.onDestroy((()=>{this.middlewareHelpers.clear()})),this.message=e,this.key=this.message.peerId+"_"+this.message.mid,this.middleware=i,this.isPlaceholder=s,this.type!==t&&(this.type=t,this.classList.add(et+"-"+t)),this.connectedCallback()}changeMessage(e){return this.init(e,this.type,this.middleware)}update(e,t){this.message=e,this.render(t)}render(e){const t=this.message.reactions,i=!(!t||!t.results.length);if(this.classList.toggle("has-no-reactions",!i),!i&&!this.sorted.length)return;this.managers.appReactionsManager.getAvailableReactions();const s=i?t.results:[];s.sort(((e,t)=>{var i,s;return t.count-e.count||(null!==(i=e.chosen_order)&&void 0!==i?i:0)-(null!==(s=t.chosen_order)&&void 0!==s?s:0)})),(0,g.Z)(this.sorted,((e,t,i)=>{const n=e.reactionCount.reaction;s.some((e=>(0,Ve.Z)(e.reaction,n)))||(this.middlewareHelpers.get(e).destroy(),this.middlewareHelpers.delete(e),i.splice(t,1),e.remove())}));const n=s.reduce(((e,t)=>e+t.count),0),a=t&&(!!t.pFlags.can_see_list||this.message.peerId.isUser())&&n<4;if(this.sorted=s.map(((e,i)=>{let s=this.sorted.find((t=>(0,Ve.Z)(t.reactionCount.reaction,e.reaction)));if(!s){const e=this.middleware.create();s=new Je,s.init(this.type,e.get()),this.middlewareHelpers.set(s,e)}(0,p.Z)(s,this,i);const n=t.recent_reactions?t.recent_reactions.filter((t=>(0,Ve.Z)(t.reaction,e.reaction))):[];return s.reactionCount=Object.assign({},e),s.setCanRenderAvatars(a),s.render(this.isPlaceholder),s.renderCounter(),s.renderAvatars(n),s.setIsChosen(),s})),!this.isPlaceholder&&(null==e?void 0:e.length)&&(this.isConnected?this.handleChangedResults(e):this.onConnectCallback=()=>{this.handleChangedResults(e)}),!this.sorted.length&&"block"===this.type){const e=this.parentElement;if(this.remove(),e.classList.contains("document-message")&&!e.childNodes.length)return void e.remove();const t=this.querySelector(".time");t&&e.append(t)}}handleChangedResults(e){this.message.peerId===id.chat.peerId&&e.forEach((e=>{const t=this.sorted.find((t=>(0,Ve.Z)(t.reactionCount.reaction,e.reaction)));null==t||t.fireAroundAnimation()}))}}customElements.define(tt,st);var nt=i(5418);class at{constructor(e,t,i){this.scrollable=e,this.query=t,this.reverse=i}get container(){return this.scrollable.container}getSaved(){return{scrollHeight:this.scrollHeight,scrollTop:this.scrollTop,clientHeight:this.clientHeight}}findElements(){if(!this.query)return[];const{container:e}=this,t=e.getBoundingClientRect(),i=Array.from(e.querySelectorAll(this.query)),s=[];for(const n of i){const i=n.getBoundingClientRect();if((0,He.Z)(n,e,void 0,i,t))s.push({element:n,rect:i});else if(s.length)break}if(!s.length){const e=i[0];e&&s.push({element:e,rect:e.getBoundingClientRect()})}return s}replaceSaved(e,t){if(!this.elements)return;const i=this.elements.findIndex((({element:t})=>e===t));-1!==i&&(this.elements[i].element=t)}findAndSetElements(){this.elements=this.findElements()}save(){this.findAndSetElements(),this._save()}_save(){const{scrollTop:e,scrollHeight:t,clientHeight:i}=this.container;this.scrollHeight=t,this.scrollTop=e,this.clientHeight=i,this.scrollHeightMinusTop=this.reverse?t-e:e}onRestore(e){x.IS_SAFARI&&e&&Ee(this.container)}setScrollTop(e,t){this.scrollable.setScrollTopSilently(this.scrollTop=e),this.onRestore(t)}restore(e){var t;const{scrollTop:i,scrollHeight:s}=this.scrollable;if(this.scrollHeight=s,!this.elements.length)return void this._restore(e);let n;if(n=this.elements[this.elements.length-1],!(null===(t=null==n?void 0:n.element)||void 0===t?void 0:t.parentElement)&&(this.findAndSetElements(),n=this.elements[this.elements.length-1],!n))return void this._restore(e);const{element:a,rect:o}=n,r=a.getBoundingClientRect().bottom-o.bottom;this.setScrollTop(i+r,e)}_restore(e){const{scrollHeightMinusTop:t,scrollable:i}=this,s=this.scrollHeight,n=this.reverse?s-t:t;this.setScrollTop(n,e)}}ge.GO&&(ge.GO.ScrollSaver=at);var ot=i(7401),rt=i(4881);class dt{constructor(e){this.observing=new Map,this.observingQueue=new Map,this.freezedObservingNew=!1,this.observer=new IntersectionObserver((e=>{const t=this.observing;for(let i=0,s=e.length;ie+t),t)}var xt=i(8097);const At=function(e){const t={},i={};return s=>{var n,a;const o="_"+s;return null!==(n=(a="string"==typeof s?t:i)[o])&&void 0!==n?n:a[o]=e(s)}};function _t(e){return e.replace(/\D/g,"")}const Ft={visa:/^4/,mastercard:/^(51|52|53|54|55|222|23|24|25|26|27)/,amex:/^(34|37)/,discover:/^(60|64|65)/,diners:/^(30|38|39)/,diners14:/^(36)/,jcb:/^(35)/,unionpay:/^(62[0-6,8-9]|627[0-6,8-9]|6277[0-7,9]|62778[1-9]|81)/,elo:/^(5067|509|636368|627780)/,mir:/^(220[0-4])/},Dt={visa:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},mastercard:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},amex:{minLength:15,maxLength:15,cvcMaxLength:4,cvcMinLength:3},unionpay:{minLength:13,maxLength:19,cvcMaxLength:3,cvcMinLength:null},diners:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},diners14:{minLength:14,maxLength:14,cvcMaxLength:3,cvcMinLength:null},discover:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},jcb:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},elo:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},mir:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},unknown:{minLength:16,maxLength:16,cvcMaxLength:4,cvcMinLength:3}},Rt=At(((e="")=>{const t=Object.keys(Ft),i=_t(e);let s,n=0;return t.forEach((e=>{const t=Ft[e],a=i.match(t);if(a){const t=a[0];t&&t.length>n&&(s=e,n=t.length)}})),s||"unknown"}));function Bt(e=""){return"diners14"===(t=Rt(e))?"diners":t;var t}var Nt=i(2398),Ot=i(6740),Ut=i(1656),Ht=i(7298),zt=i(9807),jt=i(279),Gt=i(7479),Vt=i(7362);function Kt(e,t,i){const s=new Array(e);return s.fill(t),i?s.map(i):s}const Wt="๏ผ".charCodeAt(0)-"0".charCodeAt(0),$t=/[๏ผ-๏ผ™]/g;function qt(e){return String.fromCharCode(e.charCodeAt(0)-Wt)}function Qt(e){return e.replace($t,qt)}function Yt(e,t){return{type:"optional",result:e,consumed:t}}function Xt(e,t,i){return{type:"required",result:e,consumed:t,partial:i}}function Jt(e,t){return i=>{const s=new RegExp("^".concat(e.source.replace(/^\^/,""))),n=i.match(s),a=t?Yt:Xt;if(n){const e=n[0];return a(e,n.index+e.length)}return a("",i.length)}}const ei=Jt(/1[0-2]|0?[1-9]|0/),ti={digit:function(e){return Jt(/[0-9]/)(Qt(e))},capitalCharacter:function(e){const t=Jt(/\w/)(e);return t.result?Xt(t.result.toUpperCase(),t.consumed):t},month:e=>{const t=ei(Qt(e)),i=_t(t.result);return["0","1"].includes(t.result)&&1===e.length||"0"===t.result&&e.length>=2?Xt(t.result,e.length,!0):Xt(1===i.length?"0"+i:i,t.consumed)},formattingCharacter:e=>t=>{const i=e===t[0]?1:0;return function(e,t){return{type:"formatting",result:e,consumed:t}}(e,i)},optionalPattern:e=>t=>{const i=Jt(e,!0)(t);return i.result?i:Yt("",0)}},ii=ti.digit,si=ti.capitalCharacter,ni=ti.formattingCharacter(" "),ai=ti.optionalPattern(/\d\d/),oi=[ii,ii,ii,ii,ni,ii,ii,ii,ii,ii,ii,ni,ii,ii,ii,ii,ii],ri=[ii,ii,ii,ii,ni,ii,ii,ii,ii,ii,ii,ni,ii,ii,ii,ii],di=new Set(["DZ","AR","AM","AU","AT","AZ","PT","BD","BY","BE","BA","BR","BN","BG","CA","IC","CN","CO","HR","CY","CZ","DK","EC","GB","EE","FO","FI","FR","GE","DE","GR","GL","GU","GG","NL","HU","IN","ID","IL","IT","JP","JE","KZ","KR","FM","KG","LV","LI","LT","LU","MK","MG","PT","MY","MH","MQ","YT","MX","MN","ME","NL","NZ","GB","NO","PK","PH","PL","FM","PT","PR","RE","RU","SA","SF","RS","SG","SK","SI","ZA","ES","LK","SX","VI","VI","SE","CH","TW","TJ","TH","TU","TN","TR","TM","VI","UA","GB","US","UY","UZ","VA","VN","GB","FM"]),li=At((e=>{const t=[];for(let i=0,s=0;i[ti.month,ti.formattingCharacter("/"),ii,ii,ai],cardCvc:e=>ci.cardCvcFromBrand(Rt(e)),cardCvcFromBrand:At((e=>{const t=Dt[e],{cvcMinLength:i,cvcMaxLength:s}=t,n=Kt(i||s,ii);if(i&&i{switch(e){case"US":return Kt(5,ii);case"CA":return x.IS_ANDROID?null:[si,si,si,ni,si,si,si];default:const t=Kt(10,ti.optionalPattern(/\d/));return di.has(e)&&(t[0]=ii),t}}))},hi=ci;function ui(e){return kt(e.map((e=>e.length)),0)}const pi=new RegExp("โ€Ž","g");function fi(e){return e?{type:"invalid",code:e}:null}function mi(e,t={}){const{sanitized:i,minLength:s}=function(e){const t=_t(e),i=Rt(e);return{sanitized:t,brand:i,minLength:Dt[i].minLength}}(e);return function(e,t,i){return e.length>=t?function(e){const t="0".charCodeAt(0),i=e.length%2;let s=0;for(let n=e.length-1;n>=0;--n){const a=i===n%2;let o=e.charCodeAt(n)-t;a&&(o*=2),o>9&&(o-=9),s+=o}return!(s%10)}(e)||"mir"===Rt(e)?null:fi("invalid"):i?null:fi("incomplete")}(i,s,t.ignoreIncomplete)}function gi(e,t={}){const i=e.replace(pi,"").split(/ ?\/ ?/),[s,n=""]=i,[a,o]=[s,n].map((e=>+e)),r=2===n.length?o%100:o;return n.length<2||3===n.length?t.ignoreIncomplete?null:fi("incomplete"):fi(function(e,t,i){const s=new Date(Date.now()),n=e<100?s.getFullYear()%100:s.getFullYear(),a=s.getMonth()+1;return isNaN(e)||isNaN(t)?(null==i?void 0:i.ignoreIncomplete)?null:"incomplete":e-n<0?"invalid_expiry_year_past":e-n>50?"invalid_expiry_year":!(e-n)&&t{const t=yi.get(e.source);t&&t(JSON.parse(e.data))}));class wi extends l.Z{constructor({url:e,sandbox:t}){super(!1),this.onTelegramWebViewEvent=({eventType:e,eventData:t})=>{""===t&&(t=void 0),console.log("onTelegramWebViewEvent",e,t),this.dispatchEvent(e,t)};const i=this.iframe=document.createElement("iframe");i.src=e,t&&i.setAttribute("sandbox",t)}onMount(){yi.set(this.iframe.contentWindow,this.onTelegramWebViewEvent)}destroy(){this.cleanup(),yi.delete(this.iframe.contentWindow)}}function Si(e){const t=new wi(Object.assign(Object.assign({},e),{sandbox:"allow-forms allow-scripts allow-same-origin allow-modals"})),{iframe:i}=t;return i.allow="payment",i.classList.add("payment-verification"),t}class Ci extends S.Z{constructor(e,t){super("popup-payment popup-payment-verification",{closable:!0,overlayClosable:!0,body:!0,title:"Checkout.WebConfirmation.Title"}),this.url=e,this.openPathAfter=t,this.d()}d(){const e=this.telegramWebView=Si({url:this.url});e.addEventListener("web_app_open_tg_link",(e=>{this.dispatchEvent("finish"),this.hide(),this.openPathAfter&&id.openUrl("https://t.me"+e.path_full)})),this.body.append(e.iframe),this.show(),e.onMount()}destroy(){return this.telegramWebView.destroy(),super.destroy()}}var Li=i(6830),Ei=i(5029);class Ii extends E.ZP{constructor(e){super(e),this.options=e,this.onKeyDown=e=>{var t,i;this.lastKeyDown=e.key,null===(i=(t=this.options).onKeyDown)||void 0===i||i.call(t,e)},this.onInput=()=>{var e,t;const i=this.value,s="Backspace"===this.lastKeyDown&&(this.lastTransformed&&this.lastTransformed.value.length||0)-i.length==1,n=this.lastTransformed=function(e){const{value:t,getPattern:i,deleting:s,input:n}=e,a=!s&&!!t.length,o=function(e,t,i={},s){const n=e(t);if(!n)return{value:t,selection:null,autocorrectComplete:!!t};const a=n.length,o=[],r=[];let d=0,l=0,c=0===i.selectionStart?0:null,h=0===i.selectionEnd?0:null;const u=e=>{e>0&&(null===c&&l+1>=i.selectionStart&&(c=ui(o)+(s?r.length:0)),null===h&&l+1>=i.selectionEnd&&(h=ui(o)+(s?r.length:0)),l+=e)};for(;d=t.length)break;r.push(a),++d,u(c)}}return s&&o.push(...r),{value:o.join(""),selection:{selectionStart:null===c||t.length&&i.selectionStart===t.length?ui(o):c,selectionEnd:null===h||t.length&&i.selectionEnd===t.length?ui(o):h},autocorrectComplete:d===a}}(i,t,{selectionStart:n?n.selectionStart:0,selectionEnd:n?n.selectionEnd:0},a),{value:r,selection:d}=o;return{value:r,meta:{autocorrectComplete:o.autocorrectComplete,empty:!r},selection:d}}({value:i,getPattern:this.options.formatMethod,deleting:s,input:this.input}),a=n.value;a!==i&&(this.setValueSilently(a),n.selection&&(this.input.selectionStart=n.selection.selectionStart,this.input.selectionEnd=n.selection.selectionEnd)),this.validateNew(a,{ignoreIncomplete:!0}),null===(t=(e=this.options).onChange)||void 0===t||t.call(e,n)},this.onBlur=()=>{var e;const t=null===(e=this.lastTransformed)||void 0===e?void 0:e.value;t&&this.validateNew(t)},this.validate=()=>this.validateNew(),this.input.addEventListener("keydown",this.onKeyDown),this.input.addEventListener("input",this.onInput),this.input.addEventListener("blur",this.onBlur)}update(){this.onInput()}validateNew(e,t,i){var s,n,a,o,r;let d;if(void 0===e&&(e=null!==(n=null===(s=this.lastTransformed)||void 0===s?void 0:s.value)&&void 0!==n?n:""),void 0===t&&(t={}),d=this.options.validateMethod?null===(o=(a=this.options).validateMethod)||void 0===o?void 0:o.call(a,e,t):function(e,t,i={}){return e.meta.autocorrectComplete||i.ignoreIncomplete?null:fi("incomplete")}(this.lastTransformed,0,t),null==d?void 0:d.code){const e=null===(r=this.options.errorKeys)||void 0===r?void 0:r[d.code];return!i&&this.setState(E.I1.Error,e),!1}return!i&&this.setState(E.I1.Neutral),!0}}function Mi(e,t){const i=()=>{const i=e.every((e=>"validateNew"in e?e.validateNew(void 0,void 0,!0):e.isValid()));t(i)};return e.forEach((e=>{if(e instanceof Ii){const t=e.options.onChange;e.options.onChange=(...e)=>{null==t||t(...e),i()},"update"in e&&e.update()}else e.input.addEventListener("input",i)})),{validate:i}}function Pi(e,t){let i,s;return(e||t)&&(e&&(i=new bi.Z({noPhoneCodes:!0,onCountryChange:()=>{null==s||s.update()},required:!0,autocomplete:"country"})),t&&(s=new Ii({label:"PaymentShippingZipPlaceholder",plainText:!0,inputMode:"numeric",autocomplete:"postal-code",formatMethod:()=>{const{country:e}=i.getSelected(),t=null==e?void 0:e.iso2;return hi.postalCodeFromCountry(t&&t.toUpperCase())}}))),{countryInputField:i,postcodeInputField:s}}const Zi=new Set(["stripe","smartglocal"]);class Ti extends S.Z{constructor(e,t){if(super("popup-payment popup-payment-card",{closable:!0,overlayClosable:!0,body:!0,scrollable:Zi.has(e.native_provider),title:"PaymentCardInfo"}),this.paymentForm=e,this.savedCard=t,Zi.has(e.native_provider))this.d();else{const t=this.telegramWebView=Si({url:e.url});t.addEventListener("payment_form_submit",(t=>{const i={title:t.title,save:!1};this.dispatchEvent("finish",{token:t.credentials,card:i}),this.hide(),e.pFlags.can_save_credentials&&(0,vi.Z)({titleLangKey:"PaymentCardSavePaymentInformation",descriptionLangKey:"PaymentCardSavePaymentInformationInfoLine1",button:{langKey:"Save"}}).then((()=>{i.save=!0}),Qe.Z)})),this.body.append(t.iframe),this.show(),t.onMount()}}destroy(){var e;return null===(e=this.telegramWebView)||void 0===e||e.destroy(),super.destroy()}d(){const e=this.savedCard,t=new Ei.Z({name:"PaymentInfo.Card.Title",noDelimiter:!0,noShadow:!0}),i=JSON.parse(this.paymentForm.native_params.data);let s,n,a=0;const o=new Ii({label:"PaymentCardNumber",plainText:!0,inputMode:"numeric",autocomplete:"cc-number",formatMethod:hi.cardNumber,validateMethod:mi,errorKeys:{invalid:"PaymentCard.Error.Invalid",incomplete:"PaymentCard.Error.Incomplete"},onChange:e=>{(e=>{if(s===e)return;const t=++a;s=e;const i=Ni(e);if(!i)return void(n&&(n.remove(),n=void 0));const r=new Image;r.classList.add("input-field-icon"),(0,Ot.cj)(r,i,!1).then((()=>{a===t&&(n?n.replaceWith(r):o.container.append(r),n=r)}))})(Bt(e.value)),l.update()}});let r;i.need_cardholder_name&&(r=new E.ZP({label:"Checkout.NewCard.CardholderNamePlaceholder",maxLength:255,required:!0,autocomplete:"cc-name"}));const d=new Ii({label:"SecureId.Identity.Placeholder.ExpiryDate",plainText:!0,inputMode:"numeric",autocomplete:"cc-exp",formatMethod:hi.cardExpiry,validateMethod:gi});d.input.addEventListener("input",(()=>{let e=d.value;if(e.length<5)return;const t=e.split("/");4===t[1].length&&(e=[t[0],t[1].slice(2)].join("/"),d.setValueSilently(e))}),{capture:!0});const l=new Ii({labelText:"CVC",plainText:!0,inputMode:"numeric",autocomplete:"cc-csc",name:"cvc",formatMethod:()=>hi.cardCvc(o.value)}),c=(new Li.T(l.container,l.input),[o,d,l,r].filter(Boolean));c.forEach((e=>{const t=t=>{if(!e.value&&"Backspace"===t.key){const t=c[c.indexOf(e)-1];t&&(0,Nt.Z)(t.input,!0)}};if(e instanceof Ii){e.options.onKeyDown=t;const i=e.options.onChange;e.options.onChange=t=>{if(null==i||i(t),document.activeElement===e.input&&t.meta.autocorrectComplete)for(let t=c.indexOf(e),i=c.length;te.container))));const g=!!this.paymentForm.pFlags.can_save_credentials,v=new zt.Z({text:"PaymentCardSavePaymentInformation",checked:!!g}),b=new Gt.ZP({checkboxField:v,subtitleLangKey:g?"PaymentCardSavePaymentInformationInfoLine1":"Checkout.2FA.Text"});g||b.container.classList.add("is-disabled"),(p||t).content.append(b.container),this.scrollable.append(...[t,p].filter(Boolean).map((e=>e.container)));const y=Oi({key:"PaymentInfo.Done",onClick:()=>{return e=this,t=void 0,n=function*(){const e={cardNumber:o.value,expiryFull:d.value,expiryMonth:d.value.split("/")[0],expiryYear:d.value.split("/")[1],cvc:l.value,cardholderName:null==r?void 0:r.value,country:null==f?void 0:f.value,zip:null==m?void 0:m.value,save:null==v?void 0:v.checked},t=this.paymentForm.native_provider;let s;if("stripe"===t){const t=new URL("https://api.stripe.com/v1/tokens");t.search=new URLSearchParams({"card[number]":e.cardNumber,"card[exp_month]":e.expiryMonth,"card[exp_year]":e.expiryYear,"card[cvc]":e.cvc,"card[address_zip]":e.zip,"card[address_country]":e.country,"card[name]":e.cardholderName}).toString();const n=yield fetch(t.toString(),{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/x-www-form-urlencoded",Authorization:`Bearer ${i.publishable_key}`}});s=yield n.json()}else if("smartglocal"===t){const t={card:{number:e.cardNumber.replace(/[^\d]+/g,""),expiration_month:e.expiryMonth,expiration_year:e.expiryYear,security_code:e.cvc.replace(/[^\d]+/g,"")}},n="https://tgb.smart-glocal.com/cds/v1/tokenize/card",a=yield fetch(n,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json","X-PUBLIC-TOKEN":i.public_token},body:JSON.stringify(t)});s={type:"card",token:(yield a.json()).data.token}}this.dispatchEvent("finish",{token:s,card:e}),this.hide()},new((s=void 0)||(s=Promise))((function(i,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?i(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}d((n=n.apply(e,t||[])).next())}));var e,t,s,n}});Mi([o,r,d,l,f,m].filter(Boolean),(e=>{y.disabled=!e})),e&&(o.value=e.cardNumber,d.value=e.expiryFull,l.value=e.cvc,r&&(r.value=e.cardholderName),f&&(f.value=e.country),m&&(m.value=e.zip)),this.body.append(this.btnConfirmOnEnter=y),this.show(),o.validateNew(void 0,void 0,!0)||(0,Nt.Z)(o.input)}}class ki extends S.Z{constructor(e,t){super("popup-payment popup-payment-card-confirmation",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:"Checkout.PasswordEntry.Title"});const i=new Ei.Z({noDelimiter:!0,noShadow:!0,caption:"Checkout.PasswordEntry.Text",captionArgs:[e]}),s=new Li.Z({labelText:t.hint});i.content.append(s.container),this.scrollable.append(i.container);const n=()=>{a.disabled=!s.value,s.setState(E.I1.Neutral)};s.input.addEventListener("input",n);const a=Oi({key:"Checkout.PasswordEntry.Pay",onClick:()=>{return e=this,i=void 0,a=function*(){try{const e=yield this.managers.passwordManager.getInputCheckPassword(s.value,t),i=yield this.managers.apiManager.invokeApi("account.getTmpPassword",{password:e,period:60});this.dispatchEvent("finish",i),this.hide()}catch(e){throw"PASSWORD_HASH_INVALID"===e.type&&(e.handled=!0,s.setError("PASSWORD_HASH_INVALID")),e}},new((n=void 0)||(n=Promise))((function(t,s){function o(e){try{d(a.next(e))}catch(e){s(e)}}function r(e){try{d(a.throw(e))}catch(e){s(e)}}function d(e){var i;e.done?t(e.value):(i=e.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(e,i||[])).next())}));var e,i,n,a}});this.body.append(this.btnConfirmOnEnter=a),n(),this.show(),(0,Nt.Z)(s.input)}}var xi=i(1171),Ai=i(709);class _i extends S.Z{constructor(e,t,i){super("popup-payment popup-payment-shipping",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:"PaymentShippingInfo"}),this.paymentForm=e,this.inputInvoice=t,this.focus=i,this.d()}d(){const e=this.paymentForm.invoice,t=this.paymentForm.saved_info;let i,s,n,a,o,r,d,l,c,h,u;if(e.pFlags.shipping_address_requested){i=new Ei.Z({name:"PaymentShippingAddress",noDelimiter:!0,noShadow:!0}),s=new E.ZP({label:"PaymentShippingAddress1Placeholder",maxLength:64,required:!0}),n=new E.ZP({label:"PaymentShippingAddress2Placeholder",maxLength:64}),a=new E.ZP({label:"PaymentShippingCityPlaceholder",maxLength:64,required:!0}),o=new E.ZP({label:"PaymentShippingStatePlaceholder",maxLength:64});const e=Pi(!0,!0);r=e.countryInputField,d=e.postcodeInputField,i.content.append(...[s,n,a,o,r,d].filter(Boolean).map((e=>e.container)))}if([e.pFlags.name_requested,e.pFlags.email_requested,e.pFlags.phone_requested].includes(!0)){l=new Ei.Z({name:"PaymentShippingReceiver",noDelimiter:!0,noShadow:!0});const t=()=>{const e=h.value,t=(0,xi.Z)(e);return!(!t||t[0].length!==e.length)},i=()=>!!u.value.match(/\d/);e.pFlags.name_requested&&(c=new E.ZP({label:"PaymentShippingName",maxLength:256,required:!0})),e.pFlags.email_requested&&(h=new E.ZP({label:"PaymentShippingEmailPlaceholder",maxLength:64,required:!0,validate:t})),e.pFlags.phone_requested&&(u=new Ai.Z({required:!0,validate:i})),l.content.append(...[c,h,u].filter(Boolean).map((e=>e.container)))}const p=new zt.Z({text:"PaymentShippingSave",checked:!0}),f=new Gt.ZP({checkboxField:p,subtitleLangKey:"PaymentShippingSaveInfo"});(l||i).content.append(f.container),this.scrollable.append(...[i,l].filter(Boolean).map((e=>e.container)));const m=Oi({key:"PaymentInfo.Done",onClick:()=>{return e=this,t=void 0,l=function*(){const e=r&&r.getSelected().country,t={_:"paymentRequestedInfo",shipping_address:e&&{_:"postAddress",street_line1:s.value,street_line2:n.value,city:a.value,state:o.value,country_iso2:null==e?void 0:e.iso2,post_code:d.value},name:null==c?void 0:c.value,email:null==h?void 0:h.value,phone:null==u?void 0:u.value};try{const e=yield this.managers.appPaymentsManager.validateRequestedInfo(this.inputInvoice,t,null==p?void 0:p.checked);this.dispatchEvent("finish",{shippingAddress:t,requestedInfo:e}),this.hide()}catch(e){const t={ADDRESS_STREET_LINE1_INVALID:s,ADDRESS_STREET_LINE2_INVALID:n,ADDRESS_COUNTRY_INVALID:r,ADDRESS_CITY_INVALID:a,ADDRESS_STATE_INVALID:o,ADDRESS_POSTCODE_INVALID:d,REQ_INFO_NAME_INVALID:c,REQ_INFO_EMAIL_INVALID:h,REQ_INFO_PHONE_INVALID:u}[e.type];throw t&&(t.setError(),e.handled=!0),e}},new((i=void 0)||(i=Promise))((function(s,n){function a(e){try{r(l.next(e))}catch(e){n(e)}}function o(e){try{r(l.throw(e))}catch(e){n(e)}}function r(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(a,o)}r((l=l.apply(e,t||[])).next())}));var e,t,i,l}});if(this.body.append(this.btnConfirmOnEnter=m),t){const e=t.shipping_address;e&&(s.value=e.street_line1,n.value=e.street_line2,a.value=e.city,o.value=e.state,r.selectCountryByIso2(e.country_iso2),d.value=e.post_code),t.name&&c&&(c.value=t.name),t.email&&h&&(h.value=t.email),t.phone&&u&&(u.value=t.phone)}const{validate:g}=Mi([s,n,a,o,r,d,c,h,u].filter(Boolean),(e=>{m.disabled=!e}));let v;g(),this.show(),v=this.focus?{name:c,email:h,phone:u}[this.focus]:s,v&&(0,Nt.Z)(v.input)}}var Fi=i(1218);class Di extends S.Z{constructor(e,t,i){super("popup-payment popup-payment-shipping-methods",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:"PaymentShippingMethod"}),this.paymentForm=e,this.requestedInfo=t,this.shippingOption=i,this.d()}d(){const e=new Ei.Z({name:"PaymentCheckoutShippingMethod",noDelimiter:!0,noShadow:!0}),t=this.requestedInfo.shipping_options.map((e=>new Gt.ZP({radioField:new Fi.Z({text:e.title,name:"shipping-method",value:e.id}),subtitle:(0,Pt.Z)(kt(e.prices.map((({amount:e})=>+e)),0),this.paymentForm.invoice.currency)})));let i;const s=(0,Gt.De)(t,(e=>{i=e}));this.shippingOption?t.find((e=>e.radioField.input.value===this.shippingOption.id)).radioField.checked=!0:t[0].radioField.checked=!0,e.content.append(s),this.scrollable.append(e.container);const n=Oi({key:"PaymentInfo.Done",onClick:()=>{this.dispatchEvent("finish",this.requestedInfo.shipping_options.find((e=>e.id===i))),this.hide()}});this.body.append(this.btnConfirmOnEnter=n),this.show()}}var Ri=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Bi=["amex","card","diners","discover","jcb","mastercard","visa","unionpay","mir","logo"];function Ni(e){if(Bi.includes(e))return`assets/img/${e}.svg`}function Oi(e){var t,i;const s=null!==(t=e.textEl)&&void 0!==t?t:new L.ZP.IntlElement({key:null!==(i=e.key)&&void 0!==i?i:"PaymentInfo.Done"}),n=s.key,a=(0,Ue.Z)("btn-primary btn-color-primary payment-item-pay");return a.append(s.element),(0,C.fc)(a,(()=>Ri(this,void 0,void 0,(function*(){const t=e.onClick();if(!(t instanceof Promise))return;const i=(0,jt.y)(a),o=(0,Ut.Z)([a],!0);s.compareAndUpdate({key:"PleaseWait"});try{yield t}catch(e){e.handled||console.error("payment button error",e),o(),s.compareAndUpdate({key:n}),i.remove()}})))),a}class Ui extends S.Z{constructor(e,t,i,s){super("popup-payment",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:!0}),this.message=e,this.inputInvoice=t,this.paymentForm=i,this.isReceipt=s,this.tipButtonsMap=new Map,this.d().catch((e=>{console.error("payment popup error",e),this.hide()}))}d(){var e,t,i;return Ri(this,void 0,void 0,(function*(){this.element.classList.add("is-loading"),this.show();let s=!1;const n=()=>{s||(s=!0,Te&&Te.hide(),this.hide())};let{paymentForm:a,message:o}=this;o&&this.listenerSetter.add(d.Z)("payment_sent",(({peerId:e,mid:t})=>{o.peerId===e&&o.mid===t&&n()}));const r=null==o?void 0:o.media,l=null!==(e=this.isReceipt)&&void 0!==e?e:r?!!r.receipt_msg_id||"messageExtendedMedia"===(null===(t=r.extended_media)||void 0===t?void 0:t._):"payments.paymentReceipt"===a._,c=r?r.pFlags.test:a.invoice.pFlags.test,h=r?r.photo:a.photo,u=r?r.title:a.title,p=r?r.description:a.description;(0,L.$d)(this.title,l?"PaymentReceipt":"PaymentCheckout"),c&&this.title.append(" (Test)");const m="payment-item",g=document.createElement("div");g.classList.add(m);const v=m+"-details",b=document.createElement("div");let y;b.classList.add(v),h&&(y=document.createElement("div"),y.classList.add(v+"-photo","media-container-contain"),(0,K.Z)({photo:h,container:y,boxWidth:100,boxHeight:100,size:{_:"photoSizeEmpty",type:""}}),b.append(y));const w=v+"-lines",S=document.createElement("div");S.classList.add(w);const E=document.createElement("div");E.classList.add(w+"-title");const I=document.createElement("div");I.classList.add(w+"-description");const M=document.createElement("div");M.classList.add(w+"-bot-name"),S.append(E,I,M),(0,F.Z)(E,(0,B.Z)(u)),(0,F.Z)(I,(0,B.Z)(p));const P=new N.Z;M.append(P.element),b.append(S),g.append(b),this.scrollable.append(g);const Z=document.createElement("div");Z.classList.add(m+"-preloader-container"),(0,jt.y)(Z,!0),this.scrollable.container.append(Z);const T=this.inputInvoice;a||(a=l?yield this.managers.appPaymentsManager.getPaymentReceipt(o.peerId,r.receipt_msg_id||T.msg_id):yield this.managers.appPaymentsManager.getPaymentForm(T),this.paymentForm=a);let k=a.saved_info||a.info;const x=null===(i=a.saved_credentials)||void 0===i?void 0:i[0];let[A,_,D]=yield Promise.all([!l&&k&&this.managers.appPaymentsManager.validateRequestedInfo(T,k),x&&this.managers.passwordManager.getState(),(0,Vt.Z)({peerId:a.provider_id.toPeerId()})]);yield P.update({peerId:a.bot_id.toPeerId()}),Z.remove(),this.element.classList.remove("is-loading");const R=(e,t)=>(0,Pt.Z)(e,U,t),{invoice:O}=a,U=O.currency,z=O.pFlags.recurring&&!l;yield P.update({peerId:a.bot_id.toPeerId()});const j=z?yield(0,Vt.Z)({peerId:a.bot_id.toPeerId()}):void 0;Z.remove(),this.element.classList.remove("is-loading");const G=()=>{const e=document.createElement("div");e.classList.add(V+"-price");const t=document.createElement("span"),i=document.createElement("span");return e.append(t,i),{label:e,left:t,right:i}},V=m+"-prices",W=document.createElement("div");W.classList.add(V);const $=e=>e.map((e=>{const{amount:t,label:i}=e,s=G();s.left.textContent=i;const n=R(t);return s.right.textContent=n,s.label})),q=$(O.prices);let Q=()=>0,Y=0;const X=()=>{const e=R(te+Q()+Y);ee.right.textContent=e,J.compareAndUpdate({key:"PaymentCheckoutPay",args:[e]})},J=new L.ZP.IntlElement,ee=G();ee.label.classList.add("is-total"),(0,L.$d)(ee.left,"PaymentTransactionTotal");const te=kt(O.prices.map((({amount:e})=>+e)),0),ie=void 0!==O.max_tip_amount&&!l||!!a.tip_amount;if(ie){const e=m+"-tips",t=Zt.Z[U];Q=()=>+i().replace(/\D/g,"");const i=()=>r.value,s=()=>{const e=(0,xt.Z)(i(),`500 ${Tt.Bf} ${Tt.bt}`);r.style.width=e+"px"},n=e=>{e=Math.min(+e,+O.max_tip_amount);const t=R(e,!0);r.value=t,document.activeElement===r&&(0,Nt.Z)(r),g&&g();const i=this.tipButtonsMap.get(e);i&&i.classList.add("active"),s(),X()},o=G();(0,L.$d)(o.left,l?"PaymentTip":"PaymentTipOptional");const r=document.createElement("input");r.type="tel",r.classList.add("input-clear",e+"-input"),o.right.append(r),l?o.label.classList.add("disable-hover"):o.label.style.cursor="text",o.label.addEventListener("mousedown",(e=>{(0,Be.Z)(e.target,r)||(0,Nt.Z)(r)}));const d=r instanceof HTMLInputElement?1:2,c=()=>{p?--p:(p=d,(0,Nt.Z)(r))},h=()=>{setTimeout((()=>{p=d,(0,Nt.Z)(r),document.addEventListener("selectionchange",c)}),0)},u=()=>{r.addEventListener("focus",h,{once:!0}),document.removeEventListener("selectionchange",c)};let p;r.addEventListener("focusout",u),u(),r.addEventListener("input",(()=>{n(Q())}));const f=[t.symbol,t.space_between?" ":""];let g;if(t.symbol_left||f.reverse(),o.right[t.symbol_left?"prepend":"append"](f.join("")),q.push(o.label),l)n(a.tip_amount);else{const t=document.createElement("div");t.classList.add(e);const i=e+"-tip",s=O.suggested_tip_amounts.map((e=>{const t=(0,Ue.Z)(i,{noRipple:!0});return t.textContent=R(e),this.tipButtonsMap.set(+e,t),t}));g=()=>{const e=t.querySelector(".active");e&&e.classList.remove("active")},(0,C.fc)(t,(e=>{const t=(0,be.Z)(e.target,i);if(!t)return;let s=0;if(t.classList.contains("active"))t.classList.remove("active");else{g(),t.classList.add("active");for(const[e,i]of this.tipButtonsMap)if(i===t){s=e;break}}n(s)})),n(0),t.append(...s),q.push(t)}}else X();q.push(ee.label),W.append(...q),g.append(W);const se=(e,t)=>Ri(this,void 0,void 0,(function*(){const i=document.createElement("img");i.classList.add("media-photo"),yield(0,Ot.cj)(i,Ni(t));let s=e.media;s?(0,H.Z)(s,i):(s=e.createMedia("small"),s.classList.add("media-container-cover"),s.append(i)),e.container.classList.remove("row-with-icon")})),ne=e=>{e.titleLangKey&&(e.subtitleLangKey=e.titleLangKey),e.noWrap=!0;const t=new Gt.ZP(e);return t.container.classList.add(m+"-row"),e.titleLangKey&&t.subtitle.classList.add("hide"),t},ae=(e,t)=>{if(e.title.textContent=t,!t){const t=L.ZP.weakMap.get(e.subtitle.firstElementChild);e.title.append((0,L.ag)(t.key))}e.subtitle.classList.toggle("hide",!t)},oe=e=>{let t,i,s;"title"in e?(t=e.title.split(" ").shift(),i=e.title,s=e.icon):(t=Bt(e.cardNumber),i=t+" *"+e.cardNumber.split(" ").pop()),ce.title.classList.remove("tgico","tgico-card_outline"),se(ce,s||t.toLowerCase()),ae(ce,i)},re=()=>{new Ti(a,de).addEventListener("finish",(({token:e,card:t})=>{le=e,de=t,oe(t)}))};let de,le;const ce=ne({titleLangKey:"PaymentCheckoutMethod",clickable:l?void 0:re,icon:"card_outline"});ce.container.classList.add(m+"-method-row"),x?oe(x):a.credentials_title&&oe({title:a.credentials_title});const he=ne({title:D,subtitleLangKey:"PaymentCheckoutProvider"}),ue=new f.Z;let pe,fe,me,ge,ve,ye,Se,Ce;ue.classList.add("avatar-32"),he.createMedia("small").append(ue),ue.updateWithOptions({peerId:a.provider_id.toPeerId()});const Le=O.pFlags.shipping_address_requested?e=>{if(!e)return ve.subtitle.classList.add("hide"),void(0,H.Z)(ve.title,(0,L.ag)("PaymentShippingAddress"));const t=e.shipping_address;ae(pe,[t.city,t.street_line1,t.street_line2].filter(Boolean).join(", ")),ve.container.classList.toggle("hide",!A&&!l)}:void 0,Ee=e=>{Le&&Le(e),fe&&ae(fe,e.name),me&&ae(me,e.email),ge&&ae(ge,e.phone&&"+"+(0,Ae.u)(e.phone).formatted)};if(l||(Se=e=>{new _i(a,T,e).addEventListener("finish",(({shippingAddress:e,requestedInfo:t})=>{A=t,k=a.saved_info=e,Ee(e)}))}),O.pFlags.shipping_address_requested){const e=e=>{const i=new at(this.scrollable,void 0,!0);if(i.save(),t&&t.forEach((e=>e.remove())),!e)return Y=0,X(),i.restore(),void this.onContentUpdate();ye=e,ae(ve,e.title),Y=kt(e.prices.map((({amount:e})=>+e)),0),t=$(e.prices);let s=ee.label;ie&&(s=s.previousElementSibling,l||(s=s.previousElementSibling)),t.forEach((e=>s.parentElement.insertBefore(e,s))),X(),i.restore(),this.onContentUpdate()};let t;pe=ne({icon:"location",titleLangKey:"PaymentShippingAddress",clickable:!l&&Se.bind(null,void 0)}),ve=ne({icon:"shipping",titleLangKey:"PaymentCheckoutShippingMethod",clickable:!l&&(Ce=()=>{new Di(a,A,ye).addEventListener("finish",(t=>{e(t)}))})}),ve.container.classList.add("hide");const i=a.shipping;i&&e(i)}O.pFlags.name_requested&&(fe=ne({icon:"newprivate",titleLangKey:"PaymentCheckoutName",clickable:!l&&Se.bind(null,"name")})),O.pFlags.email_requested&&(me=ne({icon:"mention",titleLangKey:"PaymentShippingEmailPlaceholder",clickable:!l&&Se.bind(null,"email")})),O.pFlags.phone_requested&&(ge=ne({icon:"phone",titleLangKey:"PaymentCheckoutPhoneNumber",clickable:!l&&Se.bind(null,"phone")})),k&&Ee(k);const Ie=[ce,he,pe,ve,fe,me,ge].filter(Boolean),Me=z&&new zt.Z({text:"Payments.Recurrent.Accept",textArgs:[(0,ft.ZP)(O.recurring_terms_url),j]}),Pe=z&&ne({checkboxField:Me}),Ze=z?[document.createElement("hr"),Pe.container]:[];let Te,ke;this.scrollable.append(...[document.createElement("hr"),...Ie.map((e=>e.container)),...Ze].filter(Boolean));const xe=()=>{_e.disabled=!(!Me||Me.checked)};let _e;_e=Oi(l?{onClick:()=>this.hide(),key:"Done"}:{onClick:()=>{const e=O.pFlags.name_requested&&!(null==k?void 0:k.name)?"name":O.pFlags.email_requested&&!(null==k?void 0:k.email)?"email":O.pFlags.phone_requested&&!(null==k?void 0:k.phone)?"phone":void 0;if(O.pFlags.shipping_address_requested){if(!A)return void Se();if(!ye)return void Ce()}else if(e)return void Se(e);return de||ke?Promise.resolve().then((()=>Ri(this,void 0,void 0,(function*(){const e=ke?{_:"inputPaymentCredentialsSaved",id:x.id,tmp_password:ke.tmp_password}:{_:"inputPaymentCredentials",data:{_:"dataJSON",data:JSON.stringify(le.token?le:{type:le.type,id:le.id})},pFlags:{save:de.save||void 0}};try{const t=yield this.managers.appPaymentsManager.sendPaymentForm(T,a.form_id,null==A?void 0:A.id,null==ye?void 0:ye.id,e,Q());"payments.paymentResult"===t._?n():(Te=new Ci(t.url,!r.extended_media),Te.addEventListener("finish",(()=>{Te=void 0,n()})),yield new Promise(((e,t)=>{Te.addEventListener("close",(()=>{if(Te=void 0,s)e();else{const e=new Error("payment not finished");e.handled=!0,t(e)}}))})))}catch(e){throw"BOT_PRECHECKOUT_TIMEOUT"===e.type?((0,we.bC)({langPackKey:"Error.AnError"}),e.handled=!0):"TMP_PASSWORD_INVALID"===e.type&&(_=ke=void 0,(0,C.tH)(_e),e.handled=!0),e}})))):x?void Promise.resolve(null!=_?_:this.managers.passwordManager.getState()).then((e=>{new ki(x.title,e).addEventListener("finish",(e=>{_=void 0,ke=e,(0,C.tH)(_e);const t=e.valid_until-(0,Ht.Z)(!0)-5;setTimeout((()=>{ke===e&&(ke=void 0)}),1e3*t)}))})):void re()},textEl:J}),xe(),Me&&Me.input.addEventListener("change",xe),this.body.append(this.btnConfirmOnEnter=_e),this.onContentUpdate()}))}}var Hi=i(8487),zi=i(13),ji=i(9259),Gi=i(3228);class Vi{constructor(e,t,i,s,n=t){this.sizes=e,this.maxWidth=t,this.minWidth=i,this.spacing=s,this.maxHeight=n,this.count=e.length,this.ratios=Vi.countRatios(e),this.proportions=Vi.countProportions(this.ratios),this.averageRatio=kt(this.ratios,1)/this.count,this.maxSizeRatio=t/this.maxHeight}layout(){return this.count?this.count>=5||this.ratios.find((e=>e>2))?new Ki(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:11},{geometry:{x:0,y:t+this.spacing,width:e,height:t},sides:14}]}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:13},{geometry:{x:e+this.spacing,y:0,width:e,height:t},sides:7}]}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),i=this.maxWidth-t-this.spacing,s=Math.min(this.maxHeight,Math.round(Math.min(i/this.ratios[0],t/this.ratios[1])));return[{geometry:{x:0,y:0,width:i,height:s},sides:13},{geometry:{x:i+this.spacing,y:0,width:t,height:s},sides:7}]}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]))),i=e-t-this.spacing,s=Math.max(this.minWidth,Math.round(Math.min((this.maxWidth-this.spacing)/2,Math.min(t*this.ratios[2],i*this.ratios[1])))),n=Math.min(Math.round(e*this.ratios[0]),this.maxWidth-this.spacing-s);return[{geometry:{x:0,y:0,width:n,height:e},sides:13},{geometry:{x:n+this.spacing,y:0,width:s,height:i},sides:3},{geometry:{x:n+this.spacing,y:i+this.spacing,width:s,height:t},sides:6}]}layoutThreeTopAndOther(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],.66*(this.maxHeight-this.spacing))),i=(this.maxWidth-this.spacing)/2,s=Math.min(this.maxHeight-t-this.spacing,Math.round(Math.min(i/this.ratios[1],i/this.ratios[2]))),n=e-i-this.spacing;return[{geometry:{x:0,y:0,width:e,height:t},sides:11},{geometry:{x:0,y:t+this.spacing,width:i,height:s},sides:12},{geometry:{x:i+this.spacing,y:t+this.spacing,width:n,height:s},sides:6}]}layoutFourTopAndOther(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],.66*(this.maxHeight-this.spacing))),i=Math.round((this.maxWidth-2*this.spacing)/(this.ratios[1]+this.ratios[2]+this.ratios[3])),s=Math.max(this.minWidth,Math.round(Math.min(.4*(this.maxWidth-2*this.spacing),i*this.ratios[1]))),n=Math.round(Math.max(Math.max(1*this.minWidth,.33*(this.maxWidth-2*this.spacing)),i*this.ratios[3])),a=e-s-n-2*this.spacing,o=Math.min(this.maxHeight-t-this.spacing,i);return[{geometry:{x:0,y:0,width:e,height:t},sides:11},{geometry:{x:0,y:t+this.spacing,width:s,height:o},sides:12},{geometry:{x:s+this.spacing,y:t+this.spacing,width:a,height:o},sides:4},{geometry:{x:s+this.spacing+a+this.spacing,y:t+this.spacing,width:n,height:o},sides:6}]}layoutFourLeftAndOther(){const e=this.maxHeight,t=Math.round(Math.min(e*this.ratios[0],.6*(this.maxWidth-this.spacing))),i=Math.round((this.maxHeight-2*this.spacing)/(1/this.ratios[1]+1/this.ratios[2]+1/this.ratios[3])),s=Math.round(i/this.ratios[1]),n=Math.round(i/this.ratios[2]),a=e-s-n-2*this.spacing,o=Math.max(this.minWidth,Math.min(this.maxWidth-t-this.spacing,i));return[{geometry:{x:0,y:0,width:t,height:e},sides:13},{geometry:{x:t+this.spacing,y:0,width:o,height:s},sides:3},{geometry:{x:t+this.spacing,y:s+this.spacing,width:o,height:n},sides:2},{geometry:{x:t+this.spacing,y:s+n+2*this.spacing,width:o,height:a},sides:6}]}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 Ki{constructor(e,t,i,s,n,a=4*i/3){this.averageRatio=t,this.maxWidth=i,this.minWidth=s,this.spacing=n,this.maxHeight=a,this.ratios=Ki.cropRatios(e,t),this.count=e.length}static cropRatios(e,t){return e.map((e=>t>1.1?(0,Gi.Z)(e,1,2.75):(0,Gi.Z)(e,.6667,1)))}layout(){const e=new Array(this.count),t=[],i=(e,t)=>{const i=kt(this.ratios.slice(e,e+t),0);return(this.maxWidth-(t-1)*this.spacing)/i},s=e=>{const s=[];let n=0;for(const t of e)s.push(i(n,t)),n+=t;t.push({lineCounts:e,heights:s})};for(let e=1;e!==this.count;++e){const t=this.count-e;e>3||t>3||s([e,t])}for(let e=1;e!==this.count-1;++e)for(let t=1;t!==this.count-e;++t){const i=this.count-e-t;e>3||t>(this.averageRatio<.85?4:3)||i>3||s([e,t,i])}for(let e=1;e!==this.count-1;++e)for(let t=1;t!==this.count-e;++t)for(let i=1;i!==this.count-e-t;++i){const n=this.count-e-t-i;e>3||t>3||i>3||n>3||s([e,t,i,n])}let n=null,a=0;for(const e of t){const{heights:t,lineCounts:i}=e,s=i.length,o=kt(t,0)+this.spacing*(s-1),r=Math.min(...t),d=(Math.max(...t),r{for(let e=1;e!==s;++e)if(i[e-1]>i[e])return 1.5;return 1})(),c=Math.abs(o-this.maxHeight)*d*l;(!n||c2&e.sides)),s=i.geometry.width+i.geometry.x,n=t.find((e=>4&e.sides)),a=n.geometry.height+n.geometry.y,o=e.container;o.style.width=s+"px",o.style.height=a+"px";const r=o.children;t.forEach((({geometry:t,sides:i},n)=>{let d;if(d=r[n],d||(d=document.createElement("div"),o.append(d)),d.classList.add("album-item","grouped-item"),d.style.width=t.width/s*100+"%",d.style.height=t.height/a*100+"%",d.style.top=t.y/a*100+"%",d.style.left=t.x/s*100+"%",8&i&&1&i&&(d.style.borderTopLeftRadius="inherit"),8&i&&4&i&&(d.style.borderBottomLeftRadius="inherit"),2&i&&1&i&&(d.style.borderTopRightRadius="inherit"),2&i&&4&i&&(d.style.borderBottomRightRadius="inherit"),e.forMedia){const e=document.createElement("div");e.classList.add("album-item-media"),d.append(e)}}))}var $i=i(6131);function qi({messages:e,attachmentDiv:t,middleware:i,uploading:s,lazyLoadQueue:n,isOut:a,chat:r,loadPromises:l,autoDownload:c,managers:h=d.Z.managers,animationGroup:u}){const p=[];for(const t of e){const e=(0,vt.Z)(t),i="photo"===e._?(0,j.Z)(e,480,480):{w:e.w,h:e.h};p.push({size:i,media:e,message:t})}Wi({container:t,items:p.map((e=>({w:e.size.w,h:e.size.h}))),maxWidth:o.Z.active.album.width,minWidth:100,spacing:2,forMedia:!0});const{width:f,height:m}=t.style,g=parseInt(f),v=parseInt(m);p.forEach(((e,s)=>{var o;const{size:r,media:d,message:p}=e,f=!!(null===(o=p.media.pFlags)||void 0===o?void 0:o.spoiler),m=t.children[s];m.dataset.mid=""+p.mid,m.dataset.peerId=""+p.peerId;const b=m.firstElementChild;let y;if(y="photo"===d._?(0,K.Z)({photo:d,message:p,container:b,boxWidth:0,boxHeight:0,isOut:a,lazyLoadQueue:n,middleware:i,size:r,loadPromises:l,autoDownloadSize:c.photo,managers:h}):(0,$.Z)({doc:d,container:b,message:p,boxWidth:0,boxHeight:0,withTail:!1,isOut:a,lazyLoadQueue:n,middleware:i,loadPromises:l,autoDownload:c,managers:h,noAutoplayAttribute:f}),y&&(null==l||l.push(y)),f){const e=(y||Promise.resolve()).then((()=>{return e=this,t=void 0,n=function*(){if(!i())return;const{width:e,height:t}=m.style,s=+e.slice(0,-1)/100*g,n=+t.slice(0,-1)/100*v,a=yield(0,$i.ZP)({media:d,animationGroup:u,middleware:i,width:s,height:n});i()&&b.append(a)},new((s=void 0)||(s=Promise))((function(i,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?i(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}d((n=n.apply(e,t||[])).next())}));var e,t,s,n}));null==l||l.push(e)}}))}var Qi=i(296),Yi=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))},Xi=i(3552),Ji=i(4277);class es extends Xi._{init(e){return t=this,i=void 0,n=function*(){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);const t=yield this.managers.appPollsManager.getPoll(e.media.poll.id);this.setTitle(t.poll.pFlags.quiz?"PollResults.Title.Quiz":"PollResults.Title.Poll");const i=document.createElement("h3");(0,F.Z)(i,(0,B.Z)(t.poll.question));const s=t.results.results.map((e=>e.voters/t.results.total_voters*100));ss(s);const n=document.createDocumentFragment();t.results.results.forEach(((i,o)=>{if(!i.voters)return;const r=document.createElement("hr"),d=t.poll.answers[o],l=document.createElement("div");l.classList.add("poll-results-answer");const c=document.createElement("div");(0,F.Z)(c,(0,B.Z)(d.text));const h=document.createElement("div");h.innerText=Math.round(s[o])+"%",l.append(c,h);const u=Ji.default.createChatList();u.classList.add("poll-results-voters"),Ji.default.setListClickListener(u,(()=>{a.ZP.onCloseBtnClick()}),void 0,!0),u.style.minHeight=48*Math.min(i.voters,4)+"px",n.append(r,l,u);let p,f=4,m=!1,g=Math.max(0,i.voters-4);const v=()=>{m||(m=!0,this.managers.appPollsManager.getVotes(e,d.option,p,f).then((e=>{e.votes.forEach((e=>{const{dom:t}=Ji.default.addDialogNew({peerId:e.user_id.toPeerId(!1),container:u,rippleEnabled:!1,meAsSaved:!1,avatarSize:"small"});t.lastMessageSpan.parentElement.remove()})),p&&(g=Math.max(0,g-e.votes.length),g&&b.lastElementChild.replaceWith((0,L.ag)("PollResults.LoadMore",[Math.min(20,g)]))),p=e.next_offset,f=20,g&&e.votes.length||b.remove()})).finally((()=>{m=!1})))},b=(0,Ue.Z)("poll-results-more btn btn-primary btn-transparent",{icon:"down"});b.addEventListener("click",v),b.append((0,L.ag)("PollResults.LoadMore",[Math.min(20,g)])),n.append(b),v()})),this.resultsDiv.append(i,n),a.ZP.toggleSidebar(!0).then((()=>{}))},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}}var ts=i(5157);let is=0;const ss=e=>{const t=e.reduce(((e,t)=>e+Math.round(t)),0);if(t>100){const i=t-100,s=e.length;for(let t=0;t=.5&&si&&(i=s,t=n)}if(-1===t)return;e[t]+=1-i}}};d.Z.addEventListener("poll_update",(({poll:e,results:t})=>{Array.from(document.querySelectorAll(`poll-element[poll-id="${e.id}"]`)).forEach((i=>{i.isClosed=!!e.pFlags.closed,i.performResults(t,e.chosenIndexes)}))})),o.Z.addEventListener("resize",(()=>{ls.setMaxLength(),ls.resizePolls()})),o.Z.addEventListener("changeScreen",(()=>{ls.setMaxLength()}));const ns=(e,t,i)=>{e.classList.remove("active"),clearTimeout(i),setTimeout((()=>{t(),e.remove(),as===e&&os===t&&rs===i&&(as=os=null,rs=0)}),200)};let as,os,rs,ds=!1;class ls extends HTMLElement{constructor(){super(...arguments),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=xe.Z.width<=360?xe.Z.width-120:o.Z.active.poll.width;this.MAX_LENGTH=e+9+this.MAX_OFFSET+-13.7}static resizePolls(){this.MAX_LENGTH&&Array.from(document.querySelectorAll("poll-element.is-voted")).forEach((e=>{e.svgLines.forEach(((t,i)=>{e.setLineProgress(i,1)}))}))}render(){return e=this,t=void 0,s=function*(){is||(is=document.getElementById("poll-line").getTotalLength(),ls.setMaxLength());const{poll:e,results:t}=this.message.media;let i;this.message.pFlags.is_scheduled&&this.classList.add("disable-hover"),e.pFlags&&(this.isPublic=!!e.pFlags.public_voters,this.isQuiz=!!e.pFlags.quiz,this.isClosed=!!e.pFlags.closed,this.isMultiple=!!e.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 s=this.isMultiple?'':"",n=e.answers.map(((e,t)=>`\n
\n
\n
\n \n \n \n ${s}\n
\n
\n
\n \n \n
\n `)).join("");if(this.innerHTML=`\n
\n
\n
\n
\n
\n ${n}`,(0,F.Z)(this.firstElementChild,(0,B.Z)(e.question)),Array.from(this.querySelectorAll(".poll-answer-text")).forEach(((t,i)=>{(0,F.Z)(t,(0,B.Z)(e.answers[i].text))})),this.descDiv=this.firstElementChild.nextElementSibling,this.typeDiv=this.descDiv.firstElementChild,this.avatarsDiv=this.descDiv.lastElementChild,i&&this.typeDiv.append((0,L.ag)(i)),this.isQuiz&&(this.classList.add("is-quiz"),e.close_period&&e.close_date)){const t=document.createElement("div");t.classList.add("poll-time"),this.descDiv.append(t);const i=document.createElementNS("http://www.w3.org/2000/svg","svg");i.classList.add("poll-quiz-timer"),this.quizTimer=i;const s=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",""+s),i.append(o),this.descDiv.append(i);const r=1e3*e.close_period,l=1e3*(e.close_date-(yield d.Z.managers.timeManager.getServerTimeOffset()));this.quizInterval=window.setInterval((()=>{const e=Date.now(),i=(l-e)/r,s=(l-e)/1e3+1|0;t.innerHTML=(0,ts.Z)(s),s<=5&&(t.style.color="#ee545c",o.style.stroke="#ee545c"),o.style.strokeDashoffset=a+i*a,o.style.strokeDasharray=`${a} ${a}`,e>=l&&(clearInterval(this.quizInterval),t.innerHTML="",o.style.strokeDashoffset=a,this.quizInterval=0,setTimeout((()=>{this.managers.appPollsManager.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((0,L.ag)("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=>{(0,Ce.Z)(e),a.ZP.isTabExists(es)||a.ZP.createTab(es).open(this.message)})),(0,A.Z)(this.viewResults),this.isMultiple&&(this.sendVoteBtn=document.createElement("div"),this.sendVoteBtn.classList.add("poll-footer-button","poll-send-vote"),this.sendVoteBtn.append((0,L.ag)("Chat.Poll.SubmitVote")),(0,A.Z)(this.sendVoteBtn),e.chosenIndexes.length||this.votersCountDiv.classList.add("hide"),(0,C.fc)(this.sendVoteBtn,(e=>{(0,Ce.Z)(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=!(e.chosenIndexes.length||this.isClosed);r&&!this.isPublic||this.performResults(t,e.chosenIndexes,!1),r&&(this.setVotersCount(t),(0,C.fc)(this,this.clickHandler))},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}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),(0,C.fc)(t,(i=>{(0,Ce.Z)(i),t.classList.add("active"),((e,t,i)=>{as&&ns(as,os,rs);const s=document.createElement("div");s.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),s.append(n),(0,F.Z)(a,(0,ft.ZP)(e,{entities:t})),id.chat.bubbles.container.append(s),s.offsetLeft,s.classList.add("active"),as=s,os=i,rs=window.setTimeout((()=>{ns(s,i,rs)}),c.Z?5e3:7e3),ds||(ds=!0,id.addEventListener("peer_changed",(()=>{as&&ns(as,os,rs)})))})(e.solution,e.solution_entities,(()=>{t.classList.remove("active")}))})),this.sentVote){const i=e.results.find((e=>e.pFlags.correct));i&&!i.pFlags.chosen&&(0,C.tH)(t)}}}clickHandler(e){const t=(0,be.Z)(e.target,"poll-answer");if(!t)return;(0,Ce.Z)(e);const i=+t.dataset.index;if(this.isMultiple){t.classList.toggle("is-chosing");const e=this.chosingIndexes.indexOf(i);-1!==e?this.chosingIndexes.splice(e,1):this.chosingIndexes.push(i)}else this.sendVotes([i])}sendVotes(e){if(this.sendVotePromise)return this.sendVotePromise;const t=this.answerDivs.filter(((t,i)=>e.includes(i)));return t.forEach((e=>{e.classList.add("is-voting")})),this.classList.add("disable-hover"),this.sentVote=!0,this.sendVotePromise=this.managers.appPollsManager.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,i=!0){var s,n;if(d.Z.settings.animationsEnabled||(i=!1),this.isQuiz&&((null===(s=e.results)||void 0===s?void 0:s.length)||this.isClosed)){this.answerDivs.forEach(((t,i)=>{t.classList.toggle("is-correct",!!e.results[i].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"),(0,H.Z)(this.typeDiv,(0,L.ag)("Chat.Poll.Type.Closed"))),(this.chosenIndexes.length!==t.length||this.isClosed)&&(this.isRetracted=this.chosenIndexes.length&&!t.length,this.chosenIndexes=t.slice(),this.isRetracted?(0,C.fc)(this,this.clickHandler):(0,C.EN)(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",!i),i&&(0,Fe.Z)({element:this,className:"",forwards:!this.isRetracted,duration:340}),(0,fe.T2)((()=>{this.setResults(this.isRetracted?this.percents:t,this.chosenIndexes,i),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));const t=(e.recent_voters||[]).map((e=>e.toPeerId())),i=new se({avatarSize:16});i.render(t),(0,H.Z)(this.avatarsDiv,i.container)}if(this.isMultiple){const t=!!this.chosenIndexes.length,i=this.isClosed||t,s=!this.isPublic||!e.total_voters||!t&&!this.isClosed;this.sendVoteBtn.classList.toggle("hide",i),this.viewResults.classList.toggle("hide",s),this.votersCountDiv.classList.toggle("hide",!i||!s)}}setResults(e,t,i){this.svgLines.forEach((e=>e.style.display="")),this.answerDivs.forEach(((e,i)=>{e.classList.toggle("is-chosen",t.includes(i))}));const s=Math.max(...e);if(this.maxPercents=e.map((e=>e/s)),this.isRetracted)this.svgLines.forEach(((e,t)=>{this.setLineProgress(t,-1)}));else{const e=()=>{this.svgLines.forEach(((e,t)=>{this.setLineProgress(t,1)}))};i?(0,fe.T2)(e):e()}let n;e=e.slice(),ss(e);const a=t=>{e.forEach(((e,i)=>{const s=n(e,t);this.numberDivs[i].innerText=s+"%"}))};if(this.isRetracted)if(n=(e,t)=>Math.round(e/10*t),i)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)),i)for(let e=0;e<10;++e)setTimeout((()=>{a(e)}),34*e);else a(9);if(this.isRetracted){i&&this.classList.add("is-retracting"),this.classList.remove("is-voted");const e=()=>{this.svgLines.forEach((e=>e.style.display="none"))};i?setTimeout((()=>{this.classList.remove("is-retracting"),e()}),340):e()}else this.classList.add("is-voted")}setVotersCount(e){const t=e.total_voters||0;let i;const s=[t];i=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",(0,H.Z)(this.votersCountDiv,(0,L.ag)(i,s))}setLineProgress(e,t){const i=this.svgLines[e];-1===t?(i.style.strokeDasharray="",i.style.strokeDashoffset=""):(i.style.strokeDasharray=t*this.maxPercents[e]*ls.MAX_LENGTH+", 485.9",i.style.strokeDashoffset=""+t*ls.MAX_OFFSET)}}ls.MAX_OFFSET=-46.5,ls.MAX_LENGTH=0,customElements.define("poll-element",ls);const cs="ึ‘-฿ฟ๏ฌ-๏ทฝ๏นฐ-๏ปผ",hs=(new RegExp("^[^A-Za-zร€-ร–ร˜-รถรธ-สธฬ€-ึเ €-แฟฟโฐ€-๏ฌœ๏ทพ-๏นฏ๏ปฝ-๏ฟฟ]*["+cs+"]"),new RegExp("["+cs+"]"));var us=i(6628),ps=i(5345),fs=i(3591),ms=i(9102),gs=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const vs=new Map([["messageActionHistoryClear",!0],["messageActionChatCreate",e=>e.pFlags.out]]),bs=new Set;Oe.Z&&bs.add("messageActionPhoneCall");const ys=void 0;let ws=ys,Ss=0;const Cs=3,Ls=new Error("peer changed"),Es={1:96,2:90,3:84,4:72,5:60,6:48,7:36},Is=Object.keys(Es).length;function Ms(e){return Math.max(...e)}class Ps{constructor(e,t){let i;this.chat=e,this.managers=t,this.unreadOut=new Set,this.needUpdate=[],this.bubbles={},this.skippedMids=new Set,this.bubblesNewByGroupedId={},this.bubblesNew={},this.dateMessages={},this.scrolledDown=!0,this.isScrollingTimeout=0,this.unreaded=new Map,this.unreadedSeen=new Set,this.preloader=null,this.messagesQueueOnRenderAdditional=null,this.firstUnreadBubble=null,this.middlewareHelper=(0,Se.k)(),this.followStack=[],this.isHeavyAnimationInProgress=!1,this.isFirstLoad=!0,this.passEntities={},this.viewsMids=new Set,this.isTopPaddingSet=!1,this.renderingMessages=new Set,this.bubblesToEject=new Set,this.bubblesToReplace=new Map,this.setPeerTempId=0,this.renderNewPromises=new Set,this.extendedMediaMessages=new Set,this.unreadedObserverCallback=e=>{if(e.isIntersecting){const t=e.target,i=this.unreaded.get(t);this.onUnreadedInViewport(t,i)}},this.viewsObserverCallback=e=>{if(e.isIntersecting){const t=+e.target.dataset.mid;if(this.observer.unobserve(e.target,this.viewsObserverCallback),t)this.viewsMids.add(t),this.sendViewCountersDebounced();else{const{sponsoredMessage:e}=this,t=null==e?void 0:e.random_id;t&&(this.managers.appChatsManager.viewSponsoredMessage(this.peerId.toChatId(),t),delete e.random_id)}}},this.stickerEffectObserverCallback=e=>{if(e.isIntersecting){this.observer.unobserve(e.target,this.stickerEffectObserverCallback);const t=e.target.querySelector(".attachment");(0,pe.e9)().then((()=>{(0,Hi.Z)(t)&&(0,C.tH)(t)}))}},this.onBubblesMouseMove=e=>gs(this,void 0,void 0,(function*(){const t=(0,be.Z)(e.target,"bubble-content");if("scheduled"===this.chat.type||!t||this.chat.selection.isSelecting||(0,be.Z)(e.target,"service")||(0,be.Z)(e.target,"bubble-beside-button"))this.unhoverPrevious();else{const e=(0,be.Z)(t,"bubble");if(!this.chat.selection.canSelectBubble(e))return void this.unhoverPrevious();let{hoverBubble:i,hoverReaction:s}=this;if(e===i)return;if(this.unhoverPrevious(),i=this.hoverBubble=e,s=this.hoverReaction,s)s.dataset.loaded&&this.setHoverVisible(s,!0);else{s=this.hoverReaction=document.createElement("div"),s.classList.add("bubble-hover-reaction");const i=document.createElement("div");i.classList.add("bubble-hover-reaction-sticker"),s.append(i),t.append(s);let n=yield this.chat.getMessage(+e.dataset.mid);if("message"!==(null==n?void 0:n._))return void this.unhoverPrevious();n=yield this.managers.appMessagesManager.getGroupsFirstMessage(n);const a=this.getMiddleware((()=>this.hoverReaction===s));Promise.all([this.managers.appReactionsManager.getAvailableReactionsByMessage(n),(0,nt.Z)(400)]).then((([e])=>{const t=e[0];t?(0,W.ZP)({div:i,doc:t.select_animation,width:18,height:18,needUpscale:!0,middleware:a,group:this.chat.animationGroup,withThumb:!1,needFadeIn:!1}).then((({render:e})=>e)).then((e=>{(0,Pe.Z)(e),e.addEventListener("firstFrame",(()=>{a()&&(s.dataset.loaded="1",this.setHoverVisible(s,!0))}),{once:!0}),(0,C.fc)(s,(e=>{(0,Ce.Z)(e),this.managers.appReactionsManager.sendReaction(n,t),this.unhoverPrevious()}),{listenerSetter:this.listenerSetter})}),Qe.Z):s.remove()}))}}})),this.unhoverPrevious=()=>{const{hoverBubble:e,hoverReaction:t}=this;e&&(this.setHoverVisible(t,!1),this.hoverBubble=void 0,this.hoverReaction=void 0)},this.onBubblesClick=e=>gs(this,void 0,void 0,(function*(){var t;let i=e.target,s=null;try{s=(0,be.Z)(i,"bubble")}catch(e){}if(!s&&!this.chat.selection.isSelecting){const e=(0,be.Z)(i,"user-avatar");if(!e)return;const t=e.dataset.peerId.toPeerId();return void(t!==m.NM?this.chat.appImManager.setInnerPeer({peerId:t}):(0,we.Am)(L.ZP.format("HidAccount",!0)))}if(s.classList.contains("is-date")&&(0,be.Z)(i,"bubble-content")){if(s.classList.contains("is-fake")&&(s=s.previousElementSibling),s.classList.contains("is-sticky")&&!this.chatInner.classList.contains("is-scrolling"))return;for(const e in this.dateMessages)if(this.dateMessages[e].div===s){S.Z.createPopup(I,new Date(+e),this.onDatePick).show();break}return}if(!c.Z&&(0,be.Z)(i,"time"))return void this.chat.selection.toggleByElement(s);if(this.chat.selection.isSelecting&&e.isTrusted){if(s.classList.contains("service")&&void 0===s.dataset.mid)return;return(0,Ce.Z)(e),c.Z&&this.chat.selection.selectedText?void(this.chat.selection.selectedText=void 0):void this.chat.selection.toggleByElement((0,be.Z)(i,"grouped-item")||s)}const n=(0,be.Z)(i,"media-spoiler-container");if(n)return void(0,$i.kN)({event:e,mediaSpoiler:n});const a=(0,be.Z)(i,"contact");if(a){const t=a.dataset.peerId.toPeerId();if(t)this.chat.appImManager.setInnerPeer({peerId:t});else{const t=a.querySelector(".contact-number");(0,ct.T)(t.innerText.replace(/\s/g,"")),(0,we.bC)({langPackKey:"PhoneCopied"}),(0,Ce.Z)(e)}return}const o=(0,be.Z)(i,"bubble-call");if(o)return void this.chat.appImManager.callUser(this.peerId.toUserId(),o.dataset.type);if((0,be.Z)(i,"is-buy")){(0,Ce.Z)(e);const t=yield this.chat.getMessage(+s.dataset.mid);if(!t)return;return void new Ui(t,yield this.managers.appPaymentsManager.getInputInvoiceByPeerId(t.peerId,t.mid))}const r=(0,ye.Z)(i,"REACTION-ELEMENT");if(r){if((0,Ce.Z)(e),r.classList.contains("is-inactive"))return;const t=r.parentElement,i=t.getReactionCount(r),s=t.getMessage();return void this.managers.appReactionsManager.sendReaction(s,i.reaction)}const d=(0,Re.Z)(i,"data-sticker-emoji");if(d&&1===d.parentElement.querySelectorAll("[data-sticker-emoji]").length&&s.classList.contains("emoji-big"))return void(0,W._2)({event:e,container:d,managers:this.managers,middleware:this.getMiddleware(),peerId:this.peerId});if((0,be.Z)(i,"replies")){const e=+s.dataset.mid;if(this.peerId===m.hj){const t=yield this.chat.getMessage(e),i=(0,R.Z)(t.reply_to.reply_to_peer_id),s=t.reply_to.reply_to_top_id,n=t.fwd_from.saved_from_msg_id;this.chat.appImManager.openThread({peerId:i,lastMsgId:n,threadId:s})}else{const t=yield this.chat.getMessage(e),i=yield this.managers.appMessagesManager.getMessageWithReplies(t),s=i.replies;s&&this.managers.appMessagesManager.getDiscussionMessage(this.peerId,i.mid).then((e=>{this.chat.appImManager.setInnerPeer({peerId:s.channel_id.toPeerId(!0),type:"discussion",threadId:e.mid})}))}return}const l=(0,be.Z)(i,"is-via");if(l){const t=l.querySelector(".peer-title");if(i===t||(0,Be.Z)(i,t)){const i=t.innerText+" ";return this.managers.appDraftsManager.setDraft(this.peerId,this.chat.threadId,i),void(0,Ce.Z)(e)}}const h=(0,be.Z)(i,"peer-title")||(0,ye.Z)(i,"AVATAR-ELEMENT")||(0,Re.Z)(i,"data-saved-from");if(h&&h!==s){i=h||i;const e=i.dataset.peerId||i.getAttribute("peer")||i.peerId,t=i.dataset.savedFrom;if("string"==typeof e||t)if(t){const[e,n]=t.split("_");if(i.classList.contains("is-receipt-link")){const t=yield this.managers.appMessagesManager.getMessageByPeer(e.toPeerId(),+n);if(t){const e=yield this.managers.appPaymentsManager.getInputInvoiceByPeerId(this.peerId,+s.dataset.mid);new Ui(t,e,void 0,!0)}}else this.chat.appImManager.setInnerPeer({peerId:e.toPeerId(),lastMsgId:+n})}else{const t=e.toPeerId();t!==m.NM?this.chat.appImManager.setInnerPeer({peerId:t}):(0,we.Am)(L.ZP.format("HidAccount",!0))}return}if(s.classList.contains("sticker")&&i.parentElement.classList.contains("attachment")){const e=+s.dataset.mid,i=null===(t=(yield this.chat.getMessage(e)).media)||void 0===t?void 0:t.document;return void((null==i?void 0:i.stickerSetInput)&&new P.Z(i.stickerSetInput).show())}const u=(0,be.Z)(i,"document-with-thumb");if("IMG"===i.tagName&&!i.classList.contains("emoji")&&!i.classList.contains("document-thumb")||i.classList.contains("album-item")||"VIDEO"===i.tagName&&!s.classList.contains("round")||u&&!u.querySelector(".preloader-container")||i.classList.contains("canvas-thumbnail")){const t=(0,be.Z)(i,"album-item")||(0,be.Z)(i,"document-container"),n=(t||s).querySelector(".preloader-container");if(n)return(0,C.tH)(n),void(0,Ce.Z)(e);(0,Ce.Z)(e);const a=+(t||s).dataset.mid,o=yield this.chat.getMessage(a);if(!o)return void this.log.warn("no message by messageId:",a);const r="webpage",d=s.classList.contains(r),l=u?e=>_e.Z.isMediaCompatibleForDocumentViewer(e):e=>"photo"===e._||["video","gif"].includes(e.type),c=[],h=d?[a]:(yield Promise.all(Object.keys(this.bubbles).map((e=>+e)).map((e=>gs(this,void 0,void 0,(function*(){const t=yield this.chat.getMessage(e),i=(0,vt.Z)(t);return i&&l(i)&&e})))))).filter(Boolean).sort(((e,t)=>e-t));h.forEach((e=>{let t;u?t=".document-container":(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 i=Array.from(this.bubbles[e].querySelectorAll(t)),s=new Set;if(u)i.forEach((e=>{c.push({element:e.querySelector(".document-ico"),mid:+e.dataset.mid,peerId:this.peerId})}));else{const t=!!this.bubbles[e].querySelector(".media-container-aspecter");i.forEach((i=>{if(t&&!(0,be.Z)(i,"media-container-aspecter"))return;const n=(0,be.Z)(i,"album-item"),a=n||i.parentElement;s.has(a)||(s.add(a),c.push({element:i,mid:n?+n.dataset.mid:e,peerId:this.peerId}))}))}})),c.sort(((e,t)=>e.mid-t.mid));const p=c.findIndex((e=>e.mid===a));return ge.ZP&&this.log("open mediaViewer single with ids:",h,p,c),c[p]?void(new _e.Z).setSearchContext({threadId:this.chat.threadId,peerId:this.peerId,inputFilter:{_:u?"inputMessagesFilterDocument":"inputMessagesFilterPhotoVideo"},useSearch:"scheduled"!==this.chat.type&&!d,isScheduled:"scheduled"===this.chat.type}).openMedia(o,c[p].element,0,!0,c.slice(0,p),c.slice(p+1)):void this.log("no target for media viewer!",i)}if(-1===["IMG","DIV","SPAN"].indexOf(i.tagName)&&(i=(0,ye.Z)(i,"DIV")),-1!==["DIV","SPAN"].indexOf(i.tagName)){if(i.classList.contains("goto-original")){const e=s.dataset.savedFrom,[t,i]=e.split("_");return void this.chat.appImManager.setInnerPeer({peerId:t.toPeerId(),lastMsgId:+i})}if(i.classList.contains("forward")){const e=+s.dataset.mid,t=yield this.managers.appMessagesManager.getMessageByPeer(this.peerId,e);return void new M.Z({[this.peerId]:yield this.managers.appMessagesManager.getMidsByMessage(t)})}let t=!1;try{t=!!(0,be.Z)(e.target,"reply")}catch(e){}if(t&&s.classList.contains("is-reply")){const e=+s.dataset.mid;this.followStack.push(e);const t=yield this.chat.getMessage(e),i=t.reply_to.reply_to_peer_id?(0,R.Z)(t.reply_to.reply_to_peer_id):this.peerId,n=t.reply_to.reply_to_msg_id;this.chat.appImManager.setInnerPeer({peerId:i,lastMsgId:n,type:this.chat.type,threadId:this.chat.threadId})}}})),this.onScroll=(e,t,i)=>{var s,n,a,o,r;if(this.isHeavyAnimationInProgress){if(null===(s=this.sliceViewportDebounced)||void 0===s||s.clearTimeout(),this.scrolledDown&&!e)return}else null===(n=this.chat.topbar.pinnedMessage)||void 0===n||n.setCorrectIndexThrottled(this.scrollable.lastScrollDirection),null===(a=this.sliceViewportDebounced)||void 0===a||a.call(this),this.setStickyDateManually();if(t&&t.distanceToEnd<300&&this.scrolledDown)return;const d=i?0:null!==(o=null==t?void 0:t.distanceToEnd)&&void 0!==o?o:this.scrollable.getDistanceToEnd();(0!==this.scrollable.lastScrollDirection&&d>0||t||i)&&(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+(null!==(r=null==t?void 0:t.duration)&&void 0!==r?r:0))),d<300&&(i||this.scrollable.loadedAll.bottom||this.chat.setPeerPromise||!this.peerId)?(this.container.classList.add("scrolled-down"),this.scrolledDown=!0):this.container.classList.contains("scrolled-down")&&(this.container.classList.remove("scrolled-down"),this.scrolledDown=!1)},this.processBatch=(...e)=>gs(this,void 0,void 0,(function*(){var t,i,s;let[n,a,o]=e;const r=e=>e.filter((e=>e&&this.bubbles[e.bubble.dataset.mid]===e.bubble));n=r(n),o("messages rendered");const d=null===(t=n[0])||void 0===t?void 0:t.reverse,{groups:l,avatarPromises:c}=this.groupBubbles(n.filter((e=>e.updatePosition))),h=n.reduce(((e,t)=>{const i=performance.now(),s=t.promises.slice(),n=s.map((e=>gs(this,void 0,void 0,(function*(){return yield e,performance.now()-i}))));return Promise.all(n).then((e=>{o.groupCollapsed("media message time",performance.now()-i,t,e),e.forEach(((e,t)=>{o("media message time",e,t,s[t])})),o.groupEnd()})),e.push(...t.promises),e}),[]);h.push(...c),o("media promises to call",h,n,this.isHeavyAnimationInProgress),yield a(Promise.all([...h,this.setUnreadDelimiter()]).catch(Qe.Z)),yield a((0,fe.AD)()),o("media promises end"),n=r(n);const{restoreScroll:u,scrollSaver:p}=this.prepareToSaveScroll(d);null===(i=this.messagesQueueOnRenderAdditional)||void 0===i||i.call(this),this.ejectBubbles();for(const[e,t]of this.bubblesToReplace){if(p&&p.replaceSaved(t,e),!n.find((t=>t.bubble===e)))continue;const i=this.bubbleGroups.getItemByBubble(e);i?(i.mounted=!1,l.includes(i.group)||l.push(i.group)):this.log.error("NO ITEM BY BUBBLE",e),this.bubblesToReplace.delete(e)}this.chat.selection.isSelecting&&n.forEach((({bubble:e})=>{this.chat.selection.toggleElementCheckbox(e,!0)})),n.forEach((({message:e,bubble:t,updatePosition:i})=>{e.pFlags.local&&i&&this.chatInner[e.pFlags.sponsored?"append":"prepend"](t)})),this.bubbleGroups.mountUnmountGroups(l),null===(s=this.updatePlaceholderPosition)||void 0===s||s.call(this),null==u||u()})),this.onDatePick=e=>{const t=this.peerId;this.managers.appMessagesManager.requestHistory(t,0,2,-1,e,this.chat.threadId).then((e=>{var i;(null===(i=null==e?void 0:e.messages)||void 0===i?void 0:i.length)?this.peerId===t&&this.chat.setMessageId(e.messages[0].mid):this.log.error("no history!")}))},this.log=this.chat.log,this.listenerSetter=new ce.Z,this.constructBubbles(),this.batchProcessor=new ps.s({log:this.log,process:this.processBatch,possibleError:Ls}),this.bubbleGroups=new w(this.chat),this.preloader=new Z.Z({cancelable:!1}),this.lazyLoadQueue=new le.Z(void 0,!0),this.lazyLoadQueue.queueId=++Ss,this.listenerSetter.add(d.Z)("history_update",(({storageKey:e,sequential:t,message:i})=>gs(this,void 0,void 0,(function*(){if(this.chat.messagesStorageKey!==e||"scheduled"===this.chat.type)return;const{mid:s}=i,n=this.bubbles[s];if(!n)return;if(this.renderNewPromises.size&&(yield Promise.all(Array.from(this.renderNewPromises))),this.messagesQueuePromise&&(yield this.messagesQueuePromise),this.bubbles[s]!==n)return;const a=this.bubbleGroups.getItemByBubble(n);if(!a)return;if(a.mid===s)return;if(t){const e=a.group,o=this.bubbleGroups.createItem(n,i),r=this.bubbleGroups.itemsArr.slice();(0,h.Z)(r,a);const l=this.bubbleGroups.findGroupSiblingByItem(o,r);if(e===(null==l?void 0:l.group)||e===this.bubbleGroups.getLastGroup()&&1===e.items.length&&o.dateTimestamp===a.dateTimestamp||this.peerId===d.Z.myId&&t&&o.dateTimestamp===a.dateTimestamp)return void this.bubbleGroups.changeBubbleMid(n,s)}this.bubbleGroups.removeAndUnmountBubble(n);const{groups:o}=this.groupBubbles([{bubble:n,message:i}]);this.bubbleGroups.mountUnmountGroups(o),this.scrollingToBubble&&this.scrollToEnd()})))),this.listenerSetter.add(d.Z)("dialog_flush",(({peerId:e})=>{this.peerId===e&&this.deleteMessagesByIds(Object.keys(this.bubbles).map((e=>+e)))})),this.listenerSetter.add(d.Z)("message_sent",(e=>gs(this,void 0,void 0,(function*(){const{storageKey:t,tempId:i,tempMessage:s,mid:n,message:a}=e;if(this.chat.messagesStorageKey!==t)return;const o=this.bubbles,r=o[i];if(r){const e=o[i];o[n]=e,e.dataset.mid=""+n,delete o[i],(0,fe.T2)((()=>{const t=+e.dataset.mid;o[t]===e&&e.classList.contains("is-outgoing")&&(e.classList.remove("is-sending","is-outgoing"),e.classList.add(this.peerId===d.Z.myId&&"scheduled"!==this.chat.type||!this.unreadOut.has(t)?"is-read":"is-sent"))}))}if(this.unreadOut.has(i)&&(this.unreadOut.delete(i),this.unreadOut.add(n)),"scheduled"===this.chat.type&&(Date.now()/1e3|0)>=s.date-10&&this.deleteMessagesByIds([n]),!r)return;let l,c;const h=a.grouped_id;if(h){l=yield this.managers.appMessagesManager.getMessagesByAlbum(h);const e=l.map((({mid:e})=>e));if(!e.length||Ms(e)!==n||o[n]!==r)return;if(o[n]!==r)return;c=Array.from(r.querySelectorAll(".grouped-item")).map((e=>+e.dataset.mid))}else l=[a],c=[i];const u=Array.from(r.querySelectorAll("reactions-element"));u.length&&u.forEach((e=>{e.changeMessage(a)})),l.forEach(((e,t)=>{var i,n,a,o,l;if(!e)return;const u=c[t],p=e.mid,f=r.querySelector(`.document-container[data-mid="${p}"]`)||r;if("message"!==e._)return;if(e.replies){const t=r.querySelector("replies-element");t&&(t.message=e,t.init())}const m=null!==(i=e.media)&&void 0!==i?i:{},g=m.document,v=m.poll,b=m.webpage;if(g){const t=f.querySelector(`.document-container[data-mid="${u}"] .document`);if(t){const i=(0,be.Z)(t,"document-container");!(null===(o=null===(a=null===(n=s.media)||void 0===n?void 0:n.document)||void 0===a?void 0:a.thumbs)||void 0===o?void 0:o.length)&&(null===(l=g.thumbs)||void 0===l?void 0:l.length)&&(0,pe.e9)().then((()=>gs(this,void 0,void 0,(function*(){const i=t.querySelector(".time"),s=yield(0,Qi.Z)({message:e,fontSize:d.Z.settings.messagesTextSize});t.replaceWith(s),i&&(s.querySelector(".document")||s).append(i)})))),i&&(i.dataset.mid=""+p)}const i=f.querySelector(`audio-element[data-mid="${u}"], .document[data-doc-id="${u}"], .media-round[data-mid="${u}"]`);i&&(i instanceof he.ZP||i.classList.contains("media-round")?(i.dataset.mid=""+e.mid,delete i.dataset.isOutgoing,i.message=e,i.onLoad(!0)):(i.dataset.docId=""+g.id,i.doc=g))}else if(v){const t=f.querySelector("poll-element");t&&(t.message=e,t.setAttribute("poll-id",""+v.id),t.setAttribute("message-id",""+p))}else b&&!f.querySelector(".web")&&(0,pe.e9)().then((()=>{this.safeRenderMessage(e,!0,f),this.scrollToBubbleIfLast(f)}));if(h){const e=f.querySelector(`.grouped-item[data-mid="${u}"]`)||f;e&&(e.dataset.mid=""+p)}}))})))),this.listenerSetter.add(d.Z)("message_edit",(({storageKey:e,message:t})=>gs(this,void 0,void 0,(function*(){if(e!==this.chat.messagesStorageKey)return;const i=this.bubbles[t.mid];i&&(yield(0,pe.e9)(),this.bubbles[t.mid]===i&&this.safeRenderMessage(t,!0,i))})))),this.listenerSetter.add(d.Z)("message_error",(({storageKey:e,tempId:t})=>gs(this,void 0,void 0,(function*(){if(e!==this.chat.messagesStorageKey)return;const i=this.bubbles[t];i&&(yield(0,pe.e9)(),this.bubbles[t]===i&&(i.classList.remove("is-outgoing"),i.classList.add("is-error")))})))),this.listenerSetter.add(d.Z)("album_edit",(({peerId:e,messages:t,deletedMids:i})=>{if(e!==this.peerId)return;const s=t.map((({mid:e})=>e)),n=Ms(s.concat(Array.from(i))),a=this.bubbles[n];if(!a)return;const o=Ms(s),r=t.find((e=>e.mid===o));this.safeRenderMessage(r,!0,a)})),this.listenerSetter.add(d.Z)("messages_reactions",(e=>gs(this,void 0,void 0,(function*(){if("scheduled"===this.chat.type)return;let t;const i=e.map((({message:e,changedResults:t})=>gs(this,void 0,void 0,(function*(){if(this.peerId!==e.peerId)return;const i=yield this.getMountedBubble(e.mid,e);return i?{bubble:i.bubble,message:e,changedResults:t}:void 0}))));(yield Promise.all(i)).filter(Boolean).forEach((({bubble:e,message:i,changedResults:s})=>{t||(t=this.createScrollSaver(!1),t.save());const n=i.peerId+"_"+i.mid,a=it.get(n);if(a)for(const e of a)e.update(i,s);else{if(!i.reactions||!i.reactions.results.length)return;this.appendReactionsElementToBubble(e,i,i,s)}})),t&&t.restore()})))),this.listenerSetter.add(d.Z)("messages_downloaded",(({peerId:e,mids:t})=>gs(this,void 0,void 0,(function*(){const i=this.getMiddleware();yield(0,pe.e9)(),i()&&t.forEach((t=>{this.needUpdate;const i=[];(0,g.Z)(this.needUpdate,((s,n)=>{s.replyMid===t&&s.replyToPeerId===e&&(this.needUpdate.splice(n,1)[0],i.push(s))})),i.forEach((({mid:e,replyMid:t,replyToPeerId:i})=>gs(this,void 0,void 0,(function*(){const t=this.bubbles[e];if(!t)return;const i=yield this.chat.getMessage(e);de.setReply({chat:this.chat,bubble:t,message:i})}))))}))})))),(0,ji.Z)({listenTo:this.scrollable.container,listenerSetter:this.listenerSetter,findTarget:e=>{const t=e.target;return t.closest(".attachment.media-sticker-wrapper")||(0,be.Z)(t,"attachment")&&t.closest(".custom-emoji")}}),(0,C.fc)(this.scrollable.container,this.onBubblesClick,{listenerSetter:this.listenerSetter}),this.listenerSetter.add(this.scrollable.container)("mousedown",(e=>{if(0!==e.button)return;const t=(0,ye.Z)(e.target,"CODE");if(t){(0,Ce.Z)(e),i=t,(0,ct.T)(i.textContent);const s=e=>{(0,Ce.Z)(e),(0,we.bC)({langPackKey:"TextCopied",onClose:()=>{n()}})},n=(0,C.fc)(window,s,{listenerSetter:this.listenerSetter,once:!0,capture:!0})}else var i})),this.stickyIntersector=new k.Z(this.scrollable.container,((e,t)=>{for(const i in this.dateMessages){const s=this.dateMessages[i];if(s.container===t){const t=s.div;t.classList.toggle("is-sticky",e),e&&(this.previousStickyDate=t);break}}this.previousStickyDate})),x.IS_SAFARI||(this.sliceViewportDebounced=(0,Ze.Z)(this.sliceViewport.bind(this),3e3,!1,!0)),(0,pe.ZP)((()=>{this.isHeavyAnimationInProgress=!0,this.lazyLoadQueue.lock(),i=this.getMiddleware()}),(()=>{this.isHeavyAnimationInProgress=!1,(null==i?void 0:i())&&this.lazyLoadQueue.unlockAndRefresh(),i=null}),this.listenerSetter)}constructBubbles(){const e=this.container=document.createElement("div");e.classList.add("bubbles","scrolled-down"),(this.chatInner=document.createElement("div")).classList.add("bubbles-inner"),this.setScroll(),e.append(this.scrollable.container)}attachContainerListeners(){const e=this.container;if(this.chat.contextMenu.attachTo(e),this.chat.selection.attachListeners(e,new ce.Z),ge.ZP&&this.listenerSetter.add(e)("dblclick",(e=>gs(this,void 0,void 0,(function*(){const t=(0,be.Z)(e.target,"grouped-item")||(0,be.Z)(e.target,"bubble");if(t){const e=+t.dataset.mid;this.log("debug message:",yield this.chat.getMessage(e)),this.highlightBubble(t)}})))),x.IS_MOBILE){if(c.Z){const t="is-gesturing-reply",i=64,s=.75*i;let n,a,o,r=!1;(0,De.Z)({element:e,verifyTouchTarget:e=>gs(this,void 0,void 0,(function*(){if("pinned"===this.chat.type||this.chat.selection.isSelecting||!(yield this.chat.canSend()))return!1;if(n=(0,be.Z)(e.target,"bubble"),n){try{const e=n.parentElement.querySelector(".bubbles-group-avatar");e&&(0,He.Z)(e,n)&&(o=e)}catch(e){}[n,o].filter(Boolean).forEach((e=>{(0,Fe.Z)({element:e,className:t,forwards:!0,duration:250}),e.offsetLeft})),a?(a.classList.remove("is-visible"),a.style.opacity=""):(a=document.createElement("span"),a.classList.add("tgico-reply_filled","bubble-gesture-reply-icon")),n.append(a)}return!!n})),onSwipe:e=>{r=e>=s,r&&!a.classList.contains("is-visible")&&a.classList.add("is-visible"),a.style.opacity=""+Math.min(1,e/s);const t=`translateX(${-Math.max(0,Math.min(i,e))}px)`;n.style.transform=t,o&&(o.style.transform=t),(0,Ct.s)()},onReset:()=>{const e=n,i=o;n=o=void 0;const s=()=>{a.parentElement===e&&(a.classList.remove("is-visible"),a.remove())};[e,i].filter(Boolean).forEach(((e,i)=>{(0,Fe.Z)({element:e,className:t,forwards:!1,duration:250,onTransitionEnd:0===i?s:void 0})})),(0,fe.T2)((()=>{if(e.style.transform="",i&&(i.style.transform=""),r){const{mid:t}=e.dataset;this.chat.input.initMessageReply(+t),r=!1}}))},listenerOptions:{capture:!0}})}}else this.listenerSetter.add(e)("dblclick",(e=>gs(this,void 0,void 0,(function*(){if("pinned"===this.chat.type||this.chat.selection.isSelecting||!(yield this.chat.canSend()))return;const t=e.target,i=t.classList.contains("bubble")?t:t.classList.contains("document-selection")?t.parentElement:null;if(i&&!i.classList.contains("bubble-first")){const e=+i.dataset.mid;if((yield this.chat.getMessage(e)).pFlags.is_outgoing)return;this.chat.input.initMessageReply(e)}}))))}constructPeerHelpers(){this.listenerSetter.add(d.Z)("history_append",(({storageKey:e,message:t})=>gs(this,void 0,void 0,(function*(){e===this.chat.messagesStorageKey&&"scheduled"!==this.chat.type&&(d.Z.settings.animationsEnabled&&(this.updateGradient=!0),this.scrollable.loadedAll.bottom?this.renderNewMessage(t,!0):this.chat.setMessageId())})))),this.listenerSetter.add(d.Z)("history_multiappend",(e=>{this.peerId===e.peerId&&"scheduled"!==this.chat.type&&this.renderNewMessage(e)})),this.listenerSetter.add(d.Z)("history_delete",(({peerId:e,msgs:t})=>{e===this.peerId&&"scheduled"!==this.chat.type&&this.deleteMessagesByIds(Array.from(t))})),this.listenerSetter.add(d.Z)("dialog_unread",(({peerId:e})=>{e===this.peerId&&(this.chat.input.setUnreadCount(),(0,pe.e9)().then((()=>{this.updateUnreadByDialog()})))})),this.listenerSetter.add(d.Z)("dialogs_multiupdate",(e=>{e.has(this.peerId)&&"scheduled"!==this.chat.type&&this.chat.input.setUnreadCount()})),this.listenerSetter.add(d.Z)("dialog_notify_settings",(e=>{this.peerId===e.peerId&&"scheduled"!==this.chat.type&&this.chat.input.setUnreadCount()})),this.listenerSetter.add(d.Z)("chat_update",(e=>gs(this,void 0,void 0,(function*(){const{peerId:t}=this;if(t!==e.toPeerId(!0))return;const i=yield this.managers.appChatsManager.getChat(e);this.chatInner.classList.contains("has-rights")!==(yield this.chat.canSend())&&(yield Promise.all([this.finishPeerChange(),this.chat.input.finishPeerChange()])).forEach((e=>e())),!!i.pFlags.forum!==this.chat.isForum&&"chat"===this.chat.type&&(this.chat.peerId=0,this.chat.appImManager.setPeer({peerId:t}))})))),this.listenerSetter.add(d.Z)("history_reload",(e=>{if(e!==this.peerId)return;const t=(0,ot.Z)(this.bubbles,"desc").filter((e=>e>0)),i=this.getMiddleware();this.managers.appMessagesManager.reloadMessages(this.peerId,t).then((e=>{if(!i())return;const s=[];e.forEach(((e,i)=>{const n=t[i];if(e){const t=this.bubbles[e.mid];if(!t)return;this.safeRenderMessage(e,!0,t)}else s.push(n)})),this.deleteMessagesByIds(s),this.setLoaded("top",!1),this.setLoaded("bottom",!1),this.scrollable.checkForTriggers()}))})),this.listenerSetter.add(d.Z)("settings_updated",(({key:e})=>gs(this,void 0,void 0,(function*(){if("settings.emoji.big"===e){const e=this.getMiddleware(),t=(0,ot.Z)(this.bubbles,"desc").map((e=>gs(this,void 0,void 0,(function*(){const t=this.bubbles[e];if(t.classList.contains("can-have-big-emoji"))return{bubble:t,message:yield this.chat.getMessage(e)}})))),i=yield Promise.all(t);if(!e())return;i.filter(Boolean).forEach((({bubble:e,message:t})=>{this.bubbles[t.mid]===e&&this.safeRenderMessage(t,!0,e)}))}})))),this.listenerSetter.add(d.Z)("messages_views",(e=>{"scheduled"!==this.chat.type&&(0,fe.T2)((()=>{let t;for(const{peerId:i,views:s,mid:n}of e){if(this.peerId!==i)continue;const e=this.bubbles[n];if(!e)continue;const a=Array.from(e.querySelectorAll(".post-views"));if(!a.length)continue;const o=(0,D.Z)(s,1);let r=!1;a.forEach((e=>{(r||e.textContent!==o)&&(t||(t=this.createScrollSaver(!0),t.save()),r=!0,e.textContent=o)}))}null==t||t.restore()}))})),this.observer=new dt({root:this.scrollable.container}),this.sendViewCountersDebounced=(0,Ze.Z)((()=>{const e=[...this.viewsMids];this.viewsMids.clear(),this.managers.appMessagesManager.incrementMessageViews(this.peerId,e)}),1e3,!1,!0),this.listenerSetter.add(d.Z)("peer_pinned_messages",(({peerId:e,mids:t,pinned:i})=>{"pinned"===this.chat.type&&e===this.peerId&&t&&(i||this.deleteMessagesByIds(t))}));const e=()=>gs(this,void 0,void 0,(function*(){this.chat.topbar.setTitle((yield this.managers.appMessagesManager.getScheduledMessagesStorage(this.peerId)).size)}));this.listenerSetter.add(d.Z)("scheduled_new",(t=>{"scheduled"===this.chat.type&&t.peerId===this.peerId&&(this.renderNewMessage(t),e())})),this.listenerSetter.add(d.Z)("scheduled_delete",(({peerId:t,mids:i})=>{"scheduled"===this.chat.type&&t===this.peerId&&(this.deleteMessagesByIds(i),e())}))}get peerId(){return this.chat.peerId}get messagesQueuePromise(){return this.batchProcessor.queuePromise}createScrollSaver(e=!0){return new at(this.scrollable,".bubble:not(.is-date)",e)}createResizeObserver(){if(!("ResizeObserver"in window)||this.resizeObserver)return;const e=this.scrollable.container;let t=0,i=!1,s=!1,n=0,a=0,o=0;const r=()=>{const r=e.offsetHeight,d=this.scrollable.isScrolledDown;r===t||s&&d||(a+=t-r),a&&this.scrollable.setScrollTopSilently(this.scrollable.scrollTop+Math.round(a)),t=r,n=0,o=0,a=0,i=!1,s=!1},d=e=>{o&&window.cancelAnimationFrame(o),o=window.requestAnimationFrame(e?r:()=>{o=window.requestAnimationFrame(r)})};(this.resizeObserver=new ResizeObserver((e=>{if(s)return void d(!1);const o=e[0].contentRect.height;if(!t)return void(t=o);const r=t-o;let l=r+a;const c=l%1;if(l-=c,!i&&(i=!0,r<0&&this.scrollable.isScrolledDown))return a=-r,s=!0,void d(!1);if(n+=l,l){const e=this.scrollable.scrollTop+l;this.scrollable.setScrollTopSilently(e)}d(!1),a=c,t=o}))).observe(e)}destroyResizeObserver(){const e=this.resizeObserver;e&&(e.disconnect(),this.resizeObserver=void 0)}setReactionsHoverListeners(){this.listenerSetter.add(Lt.Z)("toggle",this.unhoverPrevious),this.listenerSetter.add(St.Z)("change",this.unhoverPrevious),this.listenerSetter.add(this.chat.selection)("toggle",this.unhoverPrevious),this.listenerSetter.add(this.container)("mousemove",this.onBubblesMouseMove)}setHoverVisible(e,t){e.parentElement&&e.parentElement.classList.toggle("hover-reaction-visible",t),(0,Fe.Z)({element:e,className:"is-visible",forwards:t,duration:200,onTransitionEnd:t?void 0:()=>{e.remove()},useRafs:2})}setStickyDateManually(){}getRenderedLength(){return Object.keys(this.bubbles).length-this.skippedMids.size}onUnreadedInViewport(e,t){this.unreadedSeen.add(t),this.observer.unobserve(e,this.unreadedObserverCallback),this.unreaded.delete(e),this.readUnreaded()}readUnreaded(){if(this.readPromise)return;const e=this.getMiddleware();this.readPromise=wt.Z.getFocusPromise().then((()=>gs(this,void 0,void 0,(function*(){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((yield this.chat.getHistoryMaxId())||0,t))}this.unreaded.forEach(((e,i)=>{e<=t&&this.onUnreadedInViewport(i,e)}));const i=[];for(const e of this.unreadedSeen)gt(yield this.chat.getMessage(e))&&i.push(e);return this.managers.appMessagesManager.readMessages(this.peerId,i),this.unreadedSeen.clear(),ge.ZP&&this.log("will readHistory by maxId:",t),this.managers.appMessagesManager.readHistory(this.peerId,t,this.chat.threadId).catch((e=>{this.log.error("readHistory err:",e),this.managers.appMessagesManager.readHistory(this.peerId,t,this.chat.threadId)})).finally((()=>{e()&&(this.readPromise=void 0,this.unreadedSeen.size&&this.readUnreaded())}))}))))}onGoDownClick(){return gs(this,void 0,void 0,(function*(){if(!this.followStack.length)return void this.chat.setMessageId();const e=this.getMiddleware(),t=this.followStack.slice(),i=yield Promise.all(t.map((e=>this.chat.getMessage(e))));if(!e())return;t.forEach(((e,t)=>{const s=i[t],n=this.bubbles[e];let a=!0;if(n){const e=n.getBoundingClientRect();a=xe.Z.height/2>e.top}else s&&(a=!1);a&&this.followStack.splice(this.followStack.indexOf(e),1)})),this.followStack.sort(((e,t)=>t-e));const s=this.followStack.pop();this.chat.setMessageId(s)}))}getBubbleByPoint(e){const t=this.getViewportSlice(),i=t.visible["top"===e?0:t.visible.length-1];return null==i?void 0:i.element}getGroupedBubble(e){return gs(this,void 0,void 0,(function*(){const t=yield this.managers.appMessagesManager.getMidsByAlbum(e);for(const e of t)if(this.bubbles[e]&&!this.skippedMids.has(e))return{bubble:this.bubbles[e],mid:e}}))}getBubbleGroupedItems(e){return Array.from(e.querySelectorAll(".grouped-item"))}getMountedBubble(e,t){return gs(this,void 0,void 0,(function*(){if(void 0===t&&(t=yield this.chat.getMessage(e)),!t)return;const i=t.grouped_id;if(i){const t=yield this.getGroupedBubble(i);if(t)return t.bubble=t.bubble.querySelector(`.document-container[data-mid="${e}"]`)||t.bubble,t}const s=this.bubbles[e];return s?{bubble:s,mid:e}:void 0}))}findNextMountedBubbleByMsgId(e,t){const i=(0,ot.Z)(this.bubbles,t?"desc":"asc");let s;s=t?t=>te{var t;return!!s(e)&&!!(null===(t=this.bubbles[e])||void 0===t?void 0:t.parentElement)}));return this.bubbles[n]}loadMoreHistory(e,t=!1){if(!this.peerId||this.chat.setPeerPromise||this.isHeavyAnimationInProgress||e&&(this.getHistoryTopPromise||this.scrollable.loadedAll.top)||!e&&(this.getHistoryBottomPromise||this.scrollable.loadedAll.bottom))return;const i=Object.keys(this.bubbles).map((e=>+e)).filter((e=>e>0&&!this.skippedMids.has(e))).sort(((e,t)=>e-t));i.length||i.push(0),e?(ge.ZP&&this.log("Will load more (up) history by id:",i[0],"maxId:",i[i.length-1],t),this.getHistory1(i[0],!0,void 0,void 0,t)):(ge.ZP&&this.log("Will load more (down) history by id:",i[i.length-1],t),this.getHistory1(i[i.length-1],!1,!0,void 0,t))}setScroll(){this.scrollable&&this.destroyScrollable(),this.scrollable=new T.ZP(null,"IM",300),this.setLoaded("top",!1,!1),this.setLoaded("bottom",!1,!1),this.scrollable.container.append(this.chatInner),this.scrollable.onAdditionalScroll=this.onScroll,this.scrollable.onScrolledTop=()=>this.loadMoreHistory(!0),this.scrollable.onScrolledBottom=()=>this.loadMoreHistory(!1),c.Z}updateUnreadByDialog(){return gs(this,void 0,void 0,(function*(){const e=yield this.chat.getHistoryStorage(),t=this.peerId===d.Z.myId?e.readMaxId:e.readOutboxMaxId;for(const e of this.unreadOut)if(e>0&&e<=t){const t=this.bubbles[e];if(t){if(this.unreadOut.delete(e),t.classList.contains("is-outgoing")||t.classList.contains("is-error"))continue;t.classList.remove("is-sent","is-sending","is-outgoing"),t.classList.add("is-read")}}}))}destroyBubble(e,t=+e.dataset.mid){e.middlewareHelper.destroy(),this.bubbles[t]===e&&delete this.bubbles[t],this.skippedMids.delete(t),this.firstUnreadBubble===e&&(this.firstUnreadBubble=null),this.bubbleGroups.removeAndUnmountBubble(e),this.observer&&(this.observer.unobserve(e,this.unreadedObserverCallback),this.unreaded.delete(e),this.observer.unobserve(e,this.viewsObserverCallback),this.viewsMids.delete(t),this.observer.unobserve(e,this.stickerEffectObserverCallback))}deleteMessagesByIds(e,t=!0,i){let n=!1;e.forEach((e=>{const t=this.bubbles[e];t&&(this.destroyBubble(t,e),n=!0)})),n&&(this.scrollable.ignoreNextScrollEvent(),t&&this.chat.selection.isSelecting&&this.chat.selection.deleteSelectedMids(this.peerId,e),s.Z.checkAnimations(!1,this.chat.animationGroup),this.deleteEmptyDateGroups(),i||this.scrollable.onScroll())}pollExtendedMediaMessages(){const e=Array.from(this.extendedMediaMessages);return this.managers.appMessagesManager.getExtendedMedia(this.peerId,e)}setExtendedMediaMessagesPollInterval(){!this.pollExtendedMediaMessagesPromise&&this.extendedMediaMessages.size&&(this.pollExtendedMediaMessagesPromise=(0,nt.Z)(3e4).then((()=>this.pollExtendedMediaMessages())).then((()=>this.setExtendedMediaMessagesPollInterval())))}setTopPadding(e=this.getMiddleware()){let t,i=!1;if(!this.isTopPaddingSet&&"scheduled"!==this.chat.type){const{clientHeight:e,scrollHeight:s}=this.scrollable.container;i=e===s,i&&(t=this.chatInner,t.style.paddingTop=e+"px",this.scrollable.setScrollTopSilently(s),this.isTopPaddingSet=!0)}return{isPaddingNeeded:i,unsetPadding:i?()=>{e()&&i&&(t.style.paddingTop="",this.isTopPaddingSet=!1)}:void 0}}renderNewMessage(e,t){const i=this._renderNewMessage(e,t);return this.renderNewPromises.add(i),i.catch(Qe.Z).finally((()=>{this.renderNewPromises.delete(i)})),i}_renderNewMessage(e,t){return gs(this,void 0,void 0,(function*(){if(!this.scrollable.loadedAll.bottom){const t=this.chat.setPeerPromise;if(t){const i=this.getMiddleware();t.then((()=>gs(this,void 0,void 0,(function*(){if(!i())return;const t=yield this.chat.getMessage(e.mid);i()&&this.renderNewMessage(t)}))))}return}if(this.chat.threadId&&(0,b.Z)(e,this.chat.isForum)!==this.chat.threadId)return;if(this.bubbles[e.mid])return;t||(t=this.scrolledDown&&(!this.scrollingToBubble||this.scrollingToBubble===this.getLastBubble()||this.scrollingToBubble===this.chatInner));const i=this.getMiddleware(),{isPaddingNeeded:s,unsetPadding:n}=this.setTopPadding(i),a=this.performHistoryResult({history:[e]},!1);return t&&a.then((()=>{if(!i())return;let t;"scheduled"===this.chat.type&&(t=this.bubbles[e.mid]);const a=t?this.scrollToBubbleEnd(t):this.scrollToEnd();s&&a.then(n)})),a}))}getLastBubble(){var e;const t=this.bubbleGroups.getLastGroup();return null===(e=null==t?void 0:t.lastItem)||void 0===e?void 0:e.bubble}scrollToBubble(e,t,i,s){const n=(0,be.Z)(e,"bubble");let a;if(e.parentElement||this.log.error("element is not connected",n),n&&"end"!==t){const e=this.bubbleGroups.getItemByBubble(n);e&&e.group.firstItem===e&&(0,Ie.Z)(e.group.container)===(this.stickyIntersector?Cs:1)&&(a=e.group.container.parentElement)}const r=this.chat.input.messageInput&&this.chat.input.messageInput.classList.contains("is-changing-height")||this.chat.container.classList.contains("is-toggling-helper"),d=this.scrollable.scrollIntoViewNew({element:e,position:t,margin:4,forceDirection:i,forceDuration:s,axis:"y",getNormalSize:r?({rect:e})=>{let t=xe.Z.height;return t-=this.container.offsetTop,t-=o.Z.isMobile||xe.Z.height<570?58:78,t}:void 0,fallbackToElementStartWhenCentering:a,startCallback:e=>{if(this.onScroll(!0,e),this.updateGradient){const{gradientRenderer:t}=this.chat;null==t||t.toNextPosition(e.getProgress),this.updateGradient=void 0}}});return i===ue.f.Static&&(this.scrollable.lastScrollPosition=this.scrollable.scrollTop),d}scrollToEnd(){return this.scrollToBubbleEnd(this.chatInner)}scrollToBubbleEnd(e){return gs(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}}))}scrollToBubbleIfLast(e){return gs(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)}createDateBubble(e,t=new Date(1e3*e)){let i;const s=new Date;s.setHours(0,0,0,0);const n="scheduled"===this.chat.type;if(s.getTime()===t.getTime())i=(0,L.ag)(n?"Chat.Date.ScheduledForToday":"Date.Today");else if(n&&e===Te)i=(0,L.ag)("MessageScheduledUntilOnline");else{const e={day:"numeric",month:"long"};t.getFullYear()!==s.getFullYear()&&(e.year="numeric"),i=new L.ZP.IntlDateElement({date:t,options:e}).element,n&&(i=(0,L.ag)("Chat.Date.ScheduledFor",[i]))}const a=document.createElement("div");a.className="bubble service is-date";const o=document.createElement("div");o.classList.add("bubble-content");const r=document.createElement("div");return r.classList.add("service-msg"),r.append(i),o.append(r),a.append(o),a}getDateForDateContainer(e){const t=new Date(1e3*e);return t.setHours(0,0,0),{date:t,dateTimestamp:t.getTime()}}getDateContainerByTimestamp(e){var t;const{date:i,dateTimestamp:s}=this.getDateForDateContainer(e);let n=this.dateMessages[s];if(n)return n;const a=this.createDateBubble(e,i),o=this.createDateBubble(e,i);o.classList.add("is-fake");const r=document.createElement("section");r.className="bubbles-date-group",r.append(a,o),n=this.dateMessages[s]={div:a,container:r,firstTimestamp:i.getTime()};const d=(0,ot.Z)(this.dateMessages,"asc"),l=d.length;let c,h=0;for(;hthis.setPeerTempId===d,u=(0,Et.Z)(h,Ls);i||(yield u(this.chat.onChangePeer(e,u)));const p=this.chat.type;("scheduled"===p||this.chat.isRestricted)&&(o=0);const f=yield u(this.chat.getHistoryStorage()),g="pinned"===p?yield u(this.managers.appMessagesManager.getPinnedMessagesMaxId(n,this.chat.threadId)):null!==(t=f.maxId)&&void 0!==t?t:0,v=void 0!==o;let b,y,w,S=0;if(!v)if(i||(y=this.chat.appImManager.getChatSavedPosition(this.chat)),y);else if(g){S=yield u(this.managers.appMessagesManager.getReadMaxIdIfUnread(n,this.chat.threadId));const e=yield u(this.chat.getDialogOrTopic());if(!S||i||e&&1===e.unread_count)o=g;else{const e=f.history.findSliceOffset(S);e&&e.slice.isEnd(ve.D.Bottom)&&(w=e.slice[e.offset-25]||e.slice[0]||S),b=!v,o=S}}const C=o!==g;if(void 0===r&&(yield u(this.chat.isStartButtonNeeded()))&&(r=m.gZ),i){a&&o&&this.followStack.push(a);const e=yield u(this.getMountedBubble(o));if(e)return v?(this.scrollToBubble(e.bubble,"center"),this.highlightBubble(e.bubble),this.chat.dispatchEvent("setPeer",o,!1)):g&&!C&&(this.scrollToEnd(),this.chat.dispatchEvent("setPeer",o,!0)),void 0!==r&&this.chat.input.setStartParam(r),null}else this.peerId&&(this.lazyLoadQueue.queueId=++Ss,this.managers.apiFileManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId)),this.followStack.length=0,this.passEntities={messageEntityBotCommand:(yield u(this.managers.appPeersManager.isAnyGroup(n)))||this.chat.isBot};ge.ZP&&c("setPeer peerId:",n,f,o,g);const L=null!=w?w:C||"scheduled"===p||this.chat.isRestricted?0:g;let E=0;if(i){const e=this.getBubbleByPoint("bottom");e&&(E=+e.dataset.mid),E<=0&&(E=Math.max(...Object.keys(this.bubbles).map((e=>+e))))}else this.isFirstLoad=!0,this.destroyResizeObserver();const I=this.chatInner,M=this.emptyPlaceholderBubble;this.cleanup();const P=this.chatInner=document.createElement("div");i?(P.className=I.className,P.classList.remove("disable-hover","is-scrolling")):P.classList.add("bubbles-inner"),this.lazyLoadQueue.lock();const Z=i||g&&C||v,T=E>0&&(!o||Ethis.performHistoryResult({history:y.mids},!0))),cached:!0,waitPromise:Promise.resolve()}:yield u(this.getHistory1(o,!0,C,L)),this.setPeerCached=A.cached,c.warn("got history");const{promise:_,cached:F}=A;F||i||(yield u(this.chat.finishPeerChange(v,C,o,r)),this.scrollable.container.textContent="",this.preloader.attach(this.container)),s.Z.lockGroup(this.chat.animationGroup);const D=u(_).then((()=>gs(this,void 0,void 0,(function*(){var e;c.warn("promise fulfilled");const t=Z?yield u(o?this.getMountedBubble(o):{bubble:this.getLastBubble()}):void 0;F&&!i&&(c.warn("finishing peer change"),yield u(this.chat.finishPeerChange(v,C,o,r)),c.warn("finished peer change")),this.preloader.detach(),this.resolveLadderAnimation&&(this.resolveLadderAnimation(),this.resolveLadderAnimation=void 0),this.setPeerCached=void 0;const a=this.scrollable;if(a.lastScrollDirection=0,a.lastScrollPosition=0,(0,H.Z)(a.container,P),M&&this.cleanupPlaceholders(M),this.attachPlaceholderOnRender&&this.attachPlaceholderOnRender(),!v&&this.chat.isPinnedMessagesNeeded()&&(null===(e=this.chat.topbar.pinnedMessage)||void 0===e||e.setCorrectIndex(0)),this.container.classList.toggle("has-groups",!!Object.keys(this.dateMessages).length),c.warn("mounted chat",this.chatInner===P,this.chatInner.parentElement,performance.now()-l),s.Z.unlockGroup(this.chat.animationGroup),s.Z.checkAnimations(!1,this.chat.animationGroup),this.lazyLoadQueue.unlock(),y)a.setScrollTopSilently(y.top);else if(Z){let e;if(k)a.setScrollTopSilently(99999);else if(x){const t=this.setTopPadding();t.isPaddingNeeded&&(e=t.unsetPadding),a.setScrollTopSilently(0)}let s,n=b&&this.firstUnreadBubble||(null==t?void 0:t.bubble);if((null==n?void 0:n.parentElement)||(n=this.findNextMountedBubbleByMsgId(o,!1)||this.findNextMountedBubbleByMsgId(o,!0)),n){const e=this.getLastBubble(),t=b?"start":C||v||e!==n?"center":"end";s="end"===t&&e===n&&i?this.scrollToEnd():this.scrollToBubble(n,t,i?void 0:ue.f.Static),!b&&v&&this.highlightBubble(n)}e&&(s||Promise.resolve()).then((()=>{e()}))}else a.setScrollTopSilently(99999);this.onRenderScrollSet(),this.onScroll();const d=Promise.all([D,(0,pe.e9)()]);if(d.then((()=>{a.checkForTriggers()})),this.chat.dispatchEvent("setPeer",o,!C),Promise.all([this.setFetchReactionsInterval(d),this.setFetchHistoryInterval({afterSetPromise:d,lastMsgId:o,samePeer:i,savedPosition:y,topMessage:g})]).then((()=>{c("scrolledAllDown:",a.loadedAll.bottom),a.loadedAll.bottom&&g&&!this.unreaded.size&&this.onScrolledAllDown()})),"chat"===p&&!this.chat.isForumTopic){const e=yield u(this.managers.appMessagesManager.getDialogOnly(n));(null==e?void 0:e.pFlags.unread_mark)&&this.managers.appMessagesManager.markDialogUnread(n,!0)}})))).catch((e=>{throw c.error("setPeer promise error:",e),h()||this.preloader.detach(),e}));return{cached:F,promise:D}}))}setFetchReactionsInterval(e){return gs(this,void 0,void 0,(function*(){const t=this.getMiddleware();if(this.chat.isChannel){const i=()=>gs(this,void 0,void 0,(function*(){if(!t())return;const e=[];for(const t in this.bubbles){let i=yield this.chat.getMessage(+t);"message"===(null==i?void 0:i._)&&(i=yield this.managers.appMessagesManager.getGroupsFirstMessage(i),e.push(i.mid))}(e.length?this.managers.appReactionsManager.getMessagesReactions(this.peerId,e):Promise.resolve()).then((()=>{setTimeout(i,1e4)}))}));Promise.all([e,(0,pe.e9)(),(0,nt.Z)(500)]).then((()=>{i()}))}}))}setFetchHistoryInterval({lastMsgId:e,topMessage:t,afterSetPromise:i,savedPosition:s,samePeer:n}){return gs(this,void 0,void 0,(function*(){const e=this.getMiddleware(),t=this.peerId,n=yield this.managers.appMessagesManager.isFetchIntervalNeeded(t);if(!s&&!n)return;if(yield i,!e())return;const a=t.toChatId();e.onClean((()=>{this.managers.apiUpdatesManager.unsubscribeFromChannelUpdates(a)})),this.managers.apiUpdatesManager.subscribeToChannelUpdates(a)}))}onScrolledAllDown(){return gs(this,void 0,void 0,(function*(){if("chat"===this.chat.type||"discussion"===this.chat.type){const e=yield this.chat.getHistoryMaxId();this.managers.appMessagesManager.readHistory(this.peerId,e,this.chat.threadId,!0)}}))}finishPeerChange(){return gs(this,void 0,void 0,(function*(){const[e,t,i]=yield Promise.all([this.chat.isChannel,this.chat.canSend(),this.chat.isAnyGroup]);return()=>{this.chatInner.classList.toggle("has-rights",t),this.container.classList.toggle("is-chat-input-hidden",!t),this.chatInner.classList.toggle("is-chat",i),this.chatInner.classList.toggle("is-channel",e),this.createResizeObserver()}}))}renderMessagesQueue(e){return this.batchProcessor.addToQueue(e)}ejectBubbles(){for(const e of this.bubblesToEject)e.remove();this.bubblesToEject.clear()}groupBubbles(e){let t;"scheduled"===this.chat.type&&(t=new Set,e.forEach((({bubble:e,message:i})=>{const s=this.bubbleGroups.getItemByBubble(e),n=null==s?void 0:s.group;n&&s.message.date!==i.date&&(this.bubbleGroups.removeItem(s),t.add(n))}))),e.forEach((({bubble:e,message:t})=>{this.bubbleGroups.prepareForGrouping(e,t)}));const i=this.bubbleGroups.groupUngrouped(),s=Array.from(i).map((e=>{if(e.avatar)return;const t=e.firstItem;return t&&this.chat.isAvatarNeeded(t.message)?e.createAvatar(t.message):void 0})).filter(Boolean);if(t)for(const e of t)i.add(e);return{groups:[...i],avatarPromises:s}}getMiddleware(e){return this.middlewareHelper.get(e)}wrapMediaSpoiler({media:e,promise:t,middleware:i,attachmentDiv:s}){return gs(this,void 0,void 0,(function*(){if(yield t,!i())return;const{width:n,height:a}=s.style,o=yield(0,$i.ZP)({media:e,width:parseInt(n),height:parseInt(a),middleware:i,animationGroup:this.chat.animationGroup});i()&&s.append(o)}))}safeRenderMessage(e,t,i,s=!0,n){return gs(this,void 0,void 0,(function*(){if(!e||this.renderingMessages.has(e.mid)||this.bubbles[e.mid]&&!i)return;const a=this.getMiddleware().create(),o=a.get();let r;try{this.renderingMessages.add(e.mid);const d=document.createElement("div");d.middlewareHelper=a,d.dataset.mid=""+e.mid,d.dataset.peerId=""+e.peerId,d.dataset.timestamp=""+e.date,i&&(i.middlewareHelper.destroy(),this.skippedMids.delete(e.mid),this.bubblesToEject.add(i),this.bubblesToReplace.delete(i),this.bubblesToReplace.set(d,i),this.bubbleGroups.changeBubbleByBubble(i,d)),i=this.bubbles[e.mid]=d;let l=this.renderMessage(e,t,i,o);n&&(l=n(l,i));const c=l.then((e=>e&&o()?Object.assign(Object.assign({},e),{updatePosition:s}):void 0));if(this.renderMessagesQueue(c.catch((()=>{}))),r=yield c,!o())return;r||this.skippedMids.add(+e.mid)}catch(e){this.log.error("renderMessage error:",e)}return o()?(this.renderingMessages.delete(e.mid),r):void 0}))}renderMessage(e,t=!1,i,s){var n,a,r;return gs(this,void 0,void 0,(function*(){const l="message"===e._,c=l&&e.grouped_id;let h,u;const p=c?yield this.managers.appMessagesManager.getMessagesByAlbum(c):void 0,g="pinned"!==this.chat.type;if(c&&g){h=p.map((e=>e.mid));const t=Ms(h);if(e.mid!==t)return}l&&(u=c?p[0]:e);const v=this.chat.isOurMessage(e),y=document.createElement("div");y.classList.add("message","spoilers-container");const w=document.createElement("div");w.classList.add("bubble-content-wrapper");const S=document.createElement("div");S.classList.add("bubble-content"),i.classList.add("bubble"),w.append(S),i.append(w);let E=!v&&!e.pFlags.out&&(e.pFlags.unread||gt(e));if(!E&&this.chat.peerId.isAnyChat()){const t=yield this.managers.appMessagesManager.getReadMaxIdIfUnread(this.chat.peerId,this.chat.threadId);void 0!==t&&t"messageEntityEmoji"===e._)),t=T.replace(/\s/g,"").length;if(e.reduce(((e,t)=>e+t.length),0)===t){O=Math.min(Is,e.length),R=o.Z.active.customEmoji;const t=Es[O];t&&(R=(0,qe.C)(t,t),i.style.setProperty("--emoji-size",t+"px"))}}null!=R||(R=this.chat.appImManager.customEmojiSize);const H=(0,ft.ZP)(T,{entities:k,passEntities:this.passEntities,loadPromises:I,lazyLoadQueue:this.lazyLoadQueue,customEmojiSize:R,middleware:s,animationGroup:this.chat.animationGroup});let z,j=!0,G=!1;if(O){if(d.Z.settings.emoji.big){const e=1===O&&!k.find((e=>"messageEntityCustomEmoji"===e._))&&(yield this.managers.appStickersManager.getAnimatedEmojiSticker(T));1===O&&!_&&e?_={_:"messageMediaDocument",document:e,pFlags:{}}:(z=document.createElement("div"),z.classList.add("attachment","spoilers-container"),(0,F.Z)(z,H),S.append(z)),i.classList.add("is-message-empty","emoji-big"),G=!0,j=!1,D=!1}i.classList.add("can-have-big-emoji")}D&&(0,F.Z)(y,H);const V=(q=T,hs.test(q));var q;const Q=de.setTime({chatType:this.chat.type,message:e,reactionsMessage:u});let Y;if(y.append(Q),S.prepend(y),V&&Q.classList.add("is-block"),l&&this.chat.isAllMessagesForum){const t=yield(0,ms.Z)({peerId:this.peerId,threadId:(0,b.Z)(e,this.chat.isForum),lastMsgId:e.mid,wrapOptions:{middleware:s},withIcons:!0}),{element:i}=t;Y=document.createElement("div"),Y.classList.add("topic-name-button-container"),Y.append(i)}if(l&&e.views){if(i.classList.add("channel-post"),!(null===(n=e.fwd_from)||void 0===n?void 0:n.saved_from_msg_id)&&"pinned"!==this.chat.type){const e=document.createElement("div");e.classList.add("bubble-beside-button","forward","tgico-forward_filled"),S.prepend(e),i.classList.add("with-beside-button")}!e.pFlags.is_outgoing&&this.observer&&this.observer.observe(i,this.viewsObserverCallback)}const X=l&&e.reply_markup;let J="replyInlineMarkup"===(null==X?void 0:X._)&&X.rows;if(J&&(J=J.filter((e=>e.buttons.length))),J){const t=document.createElement("div");t.classList.add("reply-markup"),J.forEach((i=>{const s=i.buttons,n=document.createElement("div");n.classList.add("reply-markup-row"),s.forEach((t=>{let i,s=(0,ft.ZP)(t.text,{noLinks:!0,noLinebreaks:!0});switch(t._){case"keyboardButtonUrl":{const e=(0,ft.ZP)(" ",{entities:[{_:"messageEntityTextUrl",length:1,offset:0,url:t.url}]});i=(0,Le.Z)(e).firstElementChild,i.classList.add("is-link");break}case"keyboardButtonSwitchInline":i=document.createElement("button"),i.classList.add("is-switch-inline"),(0,C.fc)(i,(i=>{(0,Ce.Z)(i);const s=e.viaBotId||e.fromId;let n;n=t.pFlags.same_peer?Promise.resolve(this.peerId):this.managers.appInlineBotsManager.checkSwitchReturn(s).then((e=>e||new Promise(((e,t)=>{const i=new M.Z(void 0,(t=>{e(t)}));i.addEventListener("close",(()=>{t()}))})))),n.then((e=>{const i=this.peerId===e?this.chat.threadId:void 0;this.chat.appImManager.setInnerPeer({peerId:e}),this.managers.appInlineBotsManager.switchInlineQuery(e,i,s,t.query)}))}));break;case"keyboardButtonBuy":{const e="messageMediaInvoice"===_._?_:void 0;if(null==e?void 0:e.extended_media)break;i=document.createElement("button"),i.classList.add("is-buy"),(null==e?void 0:e.receipt_msg_id)&&(s=(0,L.ag)("Message.ReplyActionButtonShowReceipt"));break}case"keyboardButtonUrlAuth":{i=document.createElement("button"),i.classList.add("is-url-auth");const{peerId:s}=this,{mid:n}=e,{url:a,button_id:o}=t;(0,C.fc)(i,(()=>{const e=(0,Ut.Z)([i],!0);this.chat.appImManager.handleUrlAuth({peerId:s,mid:n,url:a,buttonId:o}).then((()=>{e()}))}));break}default:i=document.createElement("button")}if(!i)return;i.classList.add("reply-markup-button","rp","tgico");const a=document.createElement("span");a.classList.add("reply-markup-button-text"),"string"==typeof s?a.insertAdjacentHTML("beforeend",s):a.append(s),(0,A.Z)(i),i.append(a),n.append(i)})),n.childElementCount&&t.append(n)}));const s=!!t.childElementCount;s&&(0,C.fc)(t,(t=>{let i=t.target;if(i.classList.contains("reply-markup-button")||(i=(0,be.Z)(i,"reply-markup-button")),!i||i.classList.contains("is-link")||i.classList.contains("is-switch-inline")||i.classList.contains("is-buy")||i.classList.contains("is-url-auth"))return;(0,Ce.Z)(t);const s=(0,Ie.Z)(i),n=J[(0,Ie.Z)(i.parentElement)];if(!n.buttons||!n.buttons[s])return void this.log.warn("no such button",n,s,e);const a=n.buttons[s];this.managers.appInlineBotsManager.callbackButtonClick(this.peerId,e.mid,a).then((e=>{"string"==typeof e.message&&e.message.length&&(0,we.Am)((0,ft.ZP)(e.message,{noLinks:!0,noLinebreaks:!0}))}))})),s&&(i.classList.add("with-reply-markup"),w.append(t))}const ee=e.pFlags.is_outgoing;if(v){(e.pFlags.unread||ee)&&this.unreadOut.add(e.mid);let t="";t=e.error?"is-error":ee?"is-sending":e.pFlags.unread||e.pFlags.is_scheduled?"is-sent":"is-read",i.classList.add(t)}ee&&!e.error&&i.classList.add("is-outgoing");const te=l&&(yield this.managers.appMessagesManager.getMessageWithCommentReplies(e)),ie=!!te&&e.mid>0;ie&&i.classList.add("with-replies");const se=l&&e.fwd_from,ne=l&&e.fwdFromId,ae=this.chat.isOutMessage(e);let oe=S;const re=!(e.viaBotId||e.fromId!==d.Z.myId&&e.pFlags.out),le=!T;let ce;if(_){z=document.createElement("div"),z.classList.add("attachment"),le&&i.classList.add("is-message-empty");let t=!1;switch(_._){case"messageMediaPhoto":{const t=_.photo;if(le&&(j=!1),re&&i.classList.add("hide-name"),i.classList.add("photo"),g&&c&&1!==h.length){i.classList.add("is-album","is-grouped"),qi({messages:p,attachmentDiv:z,middleware:this.getMiddleware(),isOut:v,lazyLoadQueue:this.lazyLoadQueue,chat:this.chat,loadPromises:I,autoDownload:this.chat.autoDownload});break}const n=!x.IS_ANDROID&&j&&!ie&&!1;n&&i.classList.add("with-media-tail");const a=(0,K.Z)({photo:t,message:e,container:z,withTail:n,isOut:ae,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),loadPromises:I,autoDownloadSize:this.chat.autoDownload.photo});_.pFlags.spoiler&&I.push(this.wrapMediaSpoiler({media:t,promise:a,middleware:s,attachmentDiv:z}));break}case"messageMediaWebPage":{t=!0;const s=_.webpage;if("webPage"!==s._)break;const n=(0,fs.Z)(s.url);if("im"===(null==n?void 0:n.onclick)){const e={telegram_channel:"Chat.Message.ViewChannel",telegram_megagroup:"OpenGroup",telegram_bot:"Chat.Message.ViewBot"}[s.type]||"OpenMessage";ce=this.makeViewButton({text:e,asLink:!0}),ce.href=n.url,ce.setAttribute("onclick",`${n.onclick}(this)`)}i.classList.add("webpage");const a=document.createElement("div");a.classList.add("web");const r=document.createElement("div");let l,c;r.classList.add("quote");const h=s.photo;(h||s.document)&&(l=document.createElement("div"),l.classList.add("preview-resizer"),c=document.createElement("div"),c.classList.add("preview"),l.append(c));const u=document.createElement("div");u.classList.add("quote-text");const p=s.document;if(p)if("gif"===p.type||"video"===p.type||"round"===p.type){const t="round"===p.type?o.Z.active.round:o.Z.active.webpage;"round"===p.type?(i.classList.add("round"),c.classList.add("is-round")):i.classList.add("video"),(0,$.Z)({doc:p,container:c,message:e,boxWidth:t.width,boxHeight:t.height,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),isOut:ae,group:this.chat.animationGroup,loadPromises:I,autoDownload:this.chat.autoDownload,noInfo:e.mid<0})}else{const t=yield(0,Qi.Z)({message:e,autoDownloadSize:this.chat.autoDownload.file,lazyLoadQueue:this.lazyLoadQueue,loadPromises:I,sizeType:"documentName",searchContext:{useSearch:!1,peerId:this.peerId,inputFilter:{_:"inputMessagesFilterEmpty"}},fontSize:d.Z.settings.messagesTextSize});c.append(t),c.classList.add("preview-with-document"),u.classList.add("has-document")}let f;if(l&&u.append(l),s.site_name){const e=(0,ft.ZP)(s.url),t=(0,Le.Z)(e).firstElementChild;t.classList.add("webpage-name");const i=document.createElement("strong");(0,F.Z)(i,(0,B.Z)(s.site_name)),t.textContent="",t.append(i),u.append(t),f=t}const m=(0,pt.Z)(s);if(m.textContent){const e=document.createElement("div");e.classList.add("title");const t=document.createElement("strong");(0,F.Z)(t,m),e.append(t),u.append(e),f=e}const g=(0,ut.Z)(s);if(g.textContent){const e=document.createElement("div");e.classList.add("text"),(0,F.Z)(e,g),u.append(e),f=e}if(r.append(u),h&&!p){i.classList.add("photo");const t=h.sizes[h.sizes.length-1];let s=!1;t.w===t.h&&f?(i.classList.add("is-square-photo"),s=!0,(0,ht.Z)(h,c,48,48,!1)):t.h>t.w&&i.classList.add("is-vertical-photo"),(0,K.Z)({photo:h,message:e,container:c,boxWidth:s?0:o.Z.active.webpage.width,boxHeight:s?0:o.Z.active.webpage.height,isOut:ae,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),loadPromises:I,withoutPreloader:s,autoDownloadSize:this.chat.autoDownload.photo})}a.append(r),y.insertBefore(a,Q);break}case"messageMediaDocument":{const n=_.document;if(n.sticker){i.classList.add("sticker"),j=!1,G=!0,n.animated&&i.classList.add("sticker-animated");const e=o.Z.active,t=i.classList.contains("emoji-big"),r=t?e.emojiSticker:n.animated?e.animatedSticker:e.staticSticker;(0,ht.Z)(n,z,r.width,r.height),S.style.minWidth=z.style.width,S.style.minHeight=z.style.height,(0,W.ZP)({doc:n,div:z,middleware:s,lazyLoadQueue:this.lazyLoadQueue,group:this.chat.animationGroup,play:!0,loop:!0,emoji:t?T:void 0,withThumb:!0,loadPromises:I,isOut:ae,noPremium:null===(a=null==_?void 0:_.pFlags)||void 0===a?void 0:a.nopremium}),((0,zi.Z)(n)||t)&&(E||ee)&&this.observer.observe(i,this.stickerEffectObserverCallback)}else if("video"===n.type||"gif"===n.type||"round"===n.type){const t="round"===n.type;if(t&&(G=!0),(t||le)&&(j=!1),re&&i.classList.add("hide-name"),i.classList.add(t?"round":"video"),g&&c&&1!==h.length)i.classList.add("is-album","is-grouped"),qi({messages:p,attachmentDiv:z,middleware:s,isOut:v,lazyLoadQueue:this.lazyLoadQueue,chat:this.chat,loadPromises:I,autoDownload:this.chat.autoDownload});else{const a=!x.IS_ANDROID&&!x.IS_APPLE&&!t&&j&&!ie&&!1;a&&i.classList.add("with-media-tail");const r=(0,$.Z)({doc:n,container:z,message:e,boxWidth:o.Z.active.regular.width,boxHeight:o.Z.active.regular.height,withTail:a,isOut:ae,lazyLoadQueue:this.lazyLoadQueue,middleware:s,group:this.chat.animationGroup,loadPromises:I,autoDownload:this.chat.autoDownload,searchContext:t?{peerId:this.peerId,inputFilter:{_:"inputMessagesFilterRoundVoice"},threadId:this.chat.threadId,useSearch:!e.pFlags.is_scheduled,isScheduled:e.pFlags.is_scheduled}:void 0,noInfo:e.mid<0,noAutoplayAttribute:!!_.pFlags.spoiler});_.pFlags.spoiler&&I.push(this.wrapMediaSpoiler({media:n,promise:r,middleware:s,attachmentDiv:z}))}}else{const s=yield function({albumMustBeRenderedFull:e,message:t,bubble:i,messageDiv:s,chat:n,loadPromises:a,autoDownloadSize:o,lazyLoadQueue:r,searchContext:d,useSearch:l,sizeType:c,managers:h,fontWeight:u,fontSize:p,richTextFragment:f}){return Yi(this,void 0,void 0,(function*(){let l;const m=e?yield n.getMidsByMid(t.mid):[t.mid],g=m.map(((e,t)=>Yi(this,void 0,void 0,(function*(){const i=yield n.getMessage(e),s=yield(0,Qi.Z)({message:i,loadPromises:a,autoDownloadSize:o,lazyLoadQueue:r,searchContext:d,sizeType:c,managers:h,fontWeight:u,fontSize:p}),g=document.createElement("div");g.classList.add("document-container"),g.dataset.mid=""+e,g.dataset.peerId=""+i.peerId;const v=document.createElement("div");if(v.classList.add("document-wrapper"),i.message){const e=document.createElement("div");e.classList.add("document-message"),(0,F.Z)(e,f),v.append(e)}if(m.length>1){const e=document.createElement("div");e.classList.add("document-selection"),g.append(e),g.classList.add("grouped-item"),0===t&&(l=v)}return v.append(s),g.append(v),g})))),v=yield Promise.all(g);return s.append(...v),m.length>1&&i.classList.add("is-multiple-documents","is-grouped"),l}))}({albumMustBeRenderedFull:g,message:e,bubble:i,messageDiv:y,chat:this.chat,loadPromises:I,autoDownloadSize:this.chat.autoDownload.file,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,sizeType:"documentName",fontSize:d.Z.settings.messagesTextSize,richTextFragment:H});s&&(oe=s);const a=y.lastElementChild.querySelector(".document-message, .document, .audio");a&&a.append(Q),i.classList.remove("is-message-empty");const o=(["photo","pdf"].includes(n.type)?"document":n.type||"document")+"-message";y.classList.add(o),"audio"!==n.type&&"voice"!==n.type||i.classList.add("min-content"),t=!0}break}case"messageMediaCall":{const e=_.action,s=document.createElement("div");s.classList.add("bubble-call",e.pFlags.video?"tgico-videocamera":"tgico-phone");const n=e.pFlags.video?"video":"voice";s.dataset.type=n;const a=document.createElement("div");a.classList.add("bubble-call-title"),(0,L.$d)(a,ae?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((0,Ne.Z)(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"),(0,L.$d)(o,t)}o.classList.add("tgico","arrow-"+(void 0!==e.duration?"green":"red")),s.append(a,o),t=!0,i.classList.remove("is-message-empty"),y.classList.add("call-message"),y.append(s);break}case"messageMediaContact":{const e=_,s=document.createElement("div");s.classList.add("contact"),s.dataset.peerId=""+e.user_id,t=!0;const n=document.createElement("div");n.className="contact-details";const a=document.createElement("div");a.className="contact-name";const o=[e.first_name,e.last_name].filter(Boolean).join(" ");a.append(o.trim()?(0,B.Z)(o):(0,L.ag)("AttachContact"));const r=document.createElement("div");r.className="contact-number",r.textContent=e.phone_number?"+"+(0,Ae.u)(e.phone_number).formatted:"Unknown phone number",s.append(n),n.append(a,r);const d=new f.Z;d.updateWithOptions({lazyLoadQueue:this.lazyLoadQueue,peerId:e.user_id.toPeerId(),peerTitle:e.user_id?void 0:o.trim()?o:L.ZP.format("AttachContact",!0)[0]}),d.classList.add("contact-avatar","avatar-54"),s.prepend(d),i.classList.remove("is-message-empty"),y.classList.add("contact-message"),y.append(s);break}case"messageMediaPoll":{i.classList.remove("is-message-empty");const t=function(e,t=d.Z.managers){const i=new ls;return i.message=e,i.managers=t,i.setAttribute("peer-id",""+e.peerId),i.setAttribute("poll-id",e.media.poll.id),i.setAttribute("message-id",""+e.mid),i.render(),i}(e);y.prepend(t),y.classList.add("poll-message");break}case"messageMediaInvoice":{const t=_.pFlags.test,n=_.extended_media,a="messageExtendedMedia"===(null==n?void 0:n._),r="messageExtendedMediaPreview"===(null==n?void 0:n._);let d=a?n.media.photo||n.media.document:_.photo;const l=(0,Pt.Z)(_.total_amount,_.currency);let c,h;if(n){if(r&&(c=document.createElement("span"),c.classList.add("extended-media-buy","tgico-premium_lock"),z.classList.add("is-buy"),(0,L.$d)(c,"Checkout.PayPrice",[l]),void 0!==n.video_duration)){const e=document.createElement("span");e.classList.add("video-time"),e.textContent=(0,ts.Z)(n.video_duration,!1),z.append(e)}}else{c=document.createElement(d?"span":"div");const e=document.createDocumentFragment(),i=(0,L.ag)(_.receipt_msg_id?"PaymentReceipt":t?"PaymentTestInvoice":"PaymentInvoice");i.classList.add("text-uppercase");const s=" โ€Ž",n=document.createElement("span");if(n.classList.add("text-bold"),n.textContent=l+s,e.append(n,i),t&&_.receipt_msg_id){const t=document.createElement("span");t.classList.add("text-uppercase","pre-wrap"),t.append(s+"(Test)"),e.append(t)}(0,F.Z)(c,e)}if(r&&(n.thumb.w=n.w,n.thumb.h=n.h,d={_:"photo",access_hash:"",pFlags:{},date:0,dc_id:0,file_reference:[],id:0,sizes:[n.thumb]}),d){const t=n?o.Z.active.extendedInvoice:o.Z.active.invoice;"document"===d._?((0,$.Z)({doc:d,container:z,withTail:!1,isOut:ae,lazyLoadQueue:this.lazyLoadQueue,middleware:s,loadPromises:I,boxWidth:t.width,boxHeight:t.height,group:this.chat.animationGroup,message:e}),i.classList.add("video")):((0,K.Z)({photo:d,container:z,withTail:!1,isOut:ae,lazyLoadQueue:this.lazyLoadQueue,middleware:s,loadPromises:I,boxWidth:t.width,boxHeight:t.height,message:a?e:void 0}),i.classList.add("photo")),c&&(n||c.classList.add("video-time"),z.append(c))}else z=void 0;if(r){const{mid:t}=e;this.extendedMediaMessages.add(t),s.onClean((()=>{this.extendedMediaMessages.delete(t)})),this.setExtendedMediaMessagesPollInterval();const{width:i,height:n}=z.style,a=us.Z.create({width:parseInt(i),height:parseInt(n),middleware:s,animationGroup:this.chat.animationGroup});z.append(a.canvas)}n||(h=document.createElement("div"),h.classList.add("bubble-primary-color"),(0,F.Z)(h,(0,B.Z)(_.title)));const u=a?void 0:(0,B.Z)(_.description);y.prepend(...[h,!d&&c,u].filter(Boolean)),u?i.classList.remove("is-message-empty"):j=!1,i.classList.add("is-invoice");break}default:z=void 0,i.classList.remove("is-message-empty"),y.append((0,L.ag)(L.nK),Q),this.log.warn("unrecognized media type:",_._,e)}!t&&z&&S.append(z)}G&&i.classList.add("just-media"),ce&&Q.before(ce);let he="";const ue=e.fromId!==d.Z.myId&&this.chat.isAnyGroup||e.viaBotId||e.pFlags.sponsored;if(ue||se||e.reply_to_mid||Y){let t,s;const n="peerChannel"===(null===(r=e.from_id)||void 0===r?void 0:r._)&&e.fromId===ne,a=!!e.viaBotId,o=se&&!se.from_id;e.viaBotId&&(s=document.createElement("span"),s.innerText="@"+(yield this.managers.appPeersManager.getPeerUsername(e.viaBotId)),s.classList.add("peer-title")),a&&i.classList.add("must-have-name");const c=ne||se;let h,u;if(o?(t=document.createElement("span"),(0,F.Z)(t,(0,B.Z)(se.from_name)),t.classList.add("peer-title"),i.classList.add("hidden-profile")):t=new N.Z({peerId:ne||e.fromId,withPremiumIcon:!c,wrapOptions:Z}).element,l&&e.reply_to_mid&&e.reply_to_mid!==this.chat.threadId&&(!this.chat.isAllMessagesForum||e.reply_to.reply_to_top_id)&&(h=yield de.setReply({chat:this.chat,bubble:i,bubbleContainer:S,message:e})),c)if(this.peerId===d.Z.myId||n||i.classList.add("forwarded"),e.savedFrom&&(he=e.savedFrom,t.dataset.savedFrom=he),u=document.createElement("div"),t.dataset.peerId=""+ne,this.peerId!==d.Z.myId&&this.peerId!==m.hj&&!n||G){const e=[t];if(G){const t=document.createElement("br");t.classList.add("hide-ol"),e.unshift(t)}u.append((0,L.ag)("ForwardedFrom",[e]))}else u.style.color=(0,U.Z)(ne,!1),u.classList.add("colored-name"),u.append(t);else if(!e.viaBotId)if(!G&&ue){u=document.createElement("div"),u.append(t);const i=yield this.managers.appPeersManager.getPeer(e.fromId),s=null==i?void 0:i.pFlags;s&&(s.scam||s.fake)&&u.append((0,lt.Z)(s.scam)),v||(u.style.color=(0,U.Z)(e.fromId,!1),u.classList.add("colored-name")),u.dataset.peerId=""+e.fromId}else i.classList.add("hide-name");if(e.viaBotId){u?u.append(" "):u=document.createElement("div");const e=document.createElement("span");e.append((0,L.ag)("ViaBot")," ",s),e.classList.add("is-via"),u.append(e)}Y&&(G?Y.classList.add("floating-part"):(u||(u=document.createElement("div")),u.append(Y),i.classList.remove("hide-name"))),u?(u.classList.add("name"),G?(oe.append(oe=document.createElement("div")),oe.classList.add("name-with-reply","floating-part")):u.classList.add("floating-part"),oe.append(u),G&&h&&oe.append(h)):G&&h&&h.classList.add("floating-part"),Y&&G&&(z?z.after(Y):this.log.error("no attachment div?",i,e))}else i.classList.add("hide-name");if("pinned"===this.chat.type&&(he=`${this.chat.peerId}_${e.mid}`),te&&te.mid===this.chat.threadId&&i.classList.add("is-thread-starter","is-group-last"),he&&("pinned"===this.chat.type||se.saved_from_msg_id)&&this.peerId!==m.hj){const e=document.createElement("div");e.classList.add("bubble-beside-button","goto-original","tgico-arrow_next"),S.append(e),i.dataset.savedFrom=he,i.classList.add("with-beside-button")}return i.classList.add(ae?"is-out":"is-in"),ie&&(de.renderReplies({bubble:i,bubbleContainer:S,message:te,messageDiv:y,loadPromises:I,lazyLoadQueue:this.lazyLoadQueue})?j=!0:i.classList.add("with-beside-replies")),l&&this.appendReactionsElementToBubble(i,e,u),j&&(i.classList.add("can-have-tail"),S.append(Zs())),P}))}appendReactionsElementToBubble(e,t,i,s){if(this.peerId.isUser(),!(null==i?void 0:i.reactions)||!i.reactions.results.length)return;const n=new st;if(n.init(i,"block",e.middlewareHelper.get()),n.render(s),e.classList.contains("is-message-empty"))e.querySelector(".bubble-content-wrapper").append(n);else{const s=e.querySelector(".message");if(e.classList.contains("is-multiple-documents")){const e=s.lastElementChild;let a=e.querySelector(".document-message"),o=a&&a.querySelector(".time");o||(o=de.setTime({chatType:this.chat.type,message:t,reactionsMessage:i})),n.append(o),a||(a=document.createElement("div"),a.classList.add("document-message"),e.querySelector(".document-wrapper").prepend(a)),a.append(n)}else{const t=Array.from(e.querySelectorAll(".time")).pop();n.append(t),s.append(n)}}}prepareToSaveScroll(e){if(!this.chatInner.parentElement)return{};const t=this.log.bindPrefix("prepareToSaveScroll");t("save");const i=this.createScrollSaver(e);if(i.save(),this.getRenderedLength()&&!this.chat.setPeerPromise){const e=this.getViewportSlice();this.deleteViewportSlice(e,!0)}return{restoreScroll:()=>{t("restore"),i.restore(e),this.onRenderScrollSet(i.getSaved())},scrollSaver:i}}performHistoryResult(e,t){var i;return gs(this,void 0,void 0,(function*(){let s=e.history;s=s.slice(),this.needReflowScroll&&(Ee(this.scrollable.container),this.needReflowScroll=!1);const n=yield Promise.all(s.map((e=>"number"==typeof e?this.chat.getMessage(e):e))),a=[];if(!this.scrollable.loadedAll.bottom||!this.scrollable.loadedAll.top){let t=e.isEnd;if(!t){const e=yield this.chat.getHistoryStorage(),i=e.history.first,n=e.history.last;t={top:!1,bottom:!1,both:!1},!i.isEnd(ve.D.Bottom)||i.length&&!s.includes(i[0])||(t.bottom=!0),!n.isEnd(ve.D.Top)||n.length&&!s.includes(n[n.length-1])||(t.top=!0)}if(!t.bottom&&this.setPeerOptions){const{lastMsgId:e,topMessage:i,savedPosition:s}=this.setPeerOptions;this.setPeerOptions=void 0,(!e&&!s||this.bubbles[i]||e===i)&&(t.bottom=!0)}t.top&&a.push(this.setLoaded("top",!0)),t.bottom&&a.push(this.setLoaded("bottom",!0))}yield Promise.all(a);const o=n.map((e=>e?e.pFlags.local?this.processLocalMessageRender(e):this.safeRenderMessage(e,t):void 0));yield Promise.all(o),yield this.messagesQueuePromise,this.scrollable.loadedAll.top&&this.messagesQueueOnRenderAdditional&&(this.messagesQueueOnRenderAdditional(),null===(i=this.messagesQueueOnRenderAdditional)||void 0===i||i.call(this))}))}onRenderScrollSet(e){const t="has-sticky-dates";if(this.container.classList.contains(t)||this.preloader.detached&&(null!=e||(e={scrollHeight:this.scrollable.scrollHeight,clientHeight:this.scrollable.container.clientHeight}),e.scrollHeight===e.clientHeight))this.willScrollOnLoad=void 0;else{const e=this.getMiddleware(),i=()=>{e()&&this.container.classList.add(t)};this.willScrollOnLoad?i():setTimeout(i,600)}}requestHistory(e,t,i){return"chat"===this.chat.type||"discussion"===this.chat.type?this.managers.acknowledged.appMessagesManager.getHistory(this.peerId,e,t,i,this.chat.threadId):"pinned"===this.chat.type?this.managers.acknowledged.appMessagesManager.getSearch({peerId:this.peerId,inputFilter:{_:"inputMessagesFilterPinned"},maxId:e,limit:t,backLimit:i}).then((e=>({cached:e.cached,result:Promise.resolve(e.result).then((e=>({history:e.history.map((e=>e.mid))})))}))):"scheduled"===this.chat.type?this.managers.acknowledged.appMessagesManager.getScheduledMessages(this.peerId).then((e=>({cached:e.cached,result:Promise.resolve(e.result).then((e=>({history:e.slice().reverse()})))}))):void 0}animateAsLadder(e,t,i,s,n){return gs(this,void 0,void 0,(function*(){const a=this.log.bindPrefix("ladder");if(this.chat.setPeerPromise&&!this.resolveLadderAnimation)return a.warn("will be delayed"),void(this.resolveLadderAnimation=this.animateAsLadder.bind(this,e,t,i,s,n));if(!Object.keys(this.bubbles).length)return void a.warn("no bubbles");let o,r=(0,ot.Z)(this.bubbles,"desc");i&&t.length&&(r=r.filter((e=>!t.includes(e)))),o=s?n||Math.max(...r):e||Math.max(...r);const d=r.slice(r.findIndex((e=>o>e))),l=i?[]:[o],c=i?[]:r.slice(0,r.findIndex((e=>o>=e))).reverse();ge.ZP&&a("targeting mid:",o,n,e,d.map((e=>(0,bt.Z)(e))),c.map((e=>(0,bt.Z)(e))));const h=[];this.chatInner.classList.add("zoom-fading");const u=i?10:40,p=i?0:1,f=(e,t=0)=>{const i=(0,me.Z)();let s=0;return e.forEach(((n,o)=>{const r=this.bubbles[n];if(!r||this.skippedMids.has(n))return void a.warn("no bubble by mid:",n);s=(o+t||.1)*u;const d=r.lastElementChild,l=[d],c=this.bubbleGroups.getItemByBubble(r);if(c&&c.group.avatar&&c.group.lastItem===c&&l.push(c.group.avatar),l.forEach((e=>{e.classList.add("zoom-fade","can-zoom-fade"),e.style.transitionDelay=s+"ms"})),o===e.length-1){const e=t=>{t.target===d&&(i.resolve(),d.removeEventListener("transitionend",e))};d.addEventListener("transitionend",e)}h.push(...l)})),e.length||i.resolve(),{lastMsDelay:s,animationPromise:i}},m=f(d,p),g=f(l),v=f(c,p),b=[m.animationPromise,g.animationPromise,v.animationPromise],y=[m.lastMsDelay,g.lastMsDelay,v.lastMsDelay];let w;return this.onAnimateLadder&&(yield this.onAnimateLadder()),(0,fe.T2)((()=>{this.setStickyDateManually(),h.forEach((e=>{e.classList.remove("zoom-fade")}))})),(d.length||l.length||c.length)&&(w=Promise.all(b),(0,pe.YW)(w,Math.max(...y)+200).then((()=>{(0,fe.T2)((()=>{h.forEach((e=>{e.style.transitionDelay="",e.classList.remove("can-zoom-fade")})),this.chatInner.classList.remove("zoom-fading")}))}))),w}))}renderEmptyPlaceholder(e,t,i,s){return gs(this,void 0,void 0,(function*(){const i="empty-bubble-placeholder";let n,a;if(t.classList.add(i,i+"-"+e),"group"===e?n=(0,L.ag)("GroupEmptyTitle1"):"saved"===e?n=(0,L.ag)("ChatYourSelfTitle"):"noMessages"===e||"greeting"===e?n=(0,L.ag)("NoMessages"):"noScheduledMessages"===e?n=(0,L.ag)("NoScheduledMessages"):"restricted"===e&&(n=document.createElement("span"),n.innerText=yield this.managers.appPeersManager.getRestrictionReasonText(this.peerId)),n.classList.add("center",i+"-title"),s.push(n),"group"===e)s.push((0,L.ag)("GroupEmptyTitle2")),a=[(0,L.ag)("GroupDescription1"),(0,L.ag)("GroupDescription2"),(0,L.ag)("GroupDescription3"),(0,L.ag)("GroupDescription4")];else if("saved"===e)a=[(0,L.ag)("ChatYourSelfDescription1"),(0,L.ag)("ChatYourSelfDescription2"),(0,L.ag)("ChatYourSelfDescription3"),(0,L.ag)("ChatYourSelfDescription4")];else if("greeting"===e){const e=(0,L.ag)("NoMessagesGreetingsDescription");e.classList.add("center",i+"-subtitle");const t=document.createElement("div");t.classList.add(i+"-sticker");const n=this.getMiddleware();yield this.managers.appStickersManager.getGreetingSticker().then((e=>gs(this,void 0,void 0,(function*(){if(!n())return;const i=[];return yield(0,W.ZP)({doc:e,div:t,middleware:n,lazyLoadQueue:this.lazyLoadQueue,group:this.chat.animationGroup,play:!0,loop:!0,withThumb:!0,loadPromises:i}),(0,C.fc)(t,(e=>{(0,Ce.Z)(e),It.Jo.onMediaClick({target:e.target})})),Promise.all(i)})))),s.push(e,t)}a&&(s.push(...a.map((e=>{const t=document.createElement("span");return t.classList.add(i+"-list-item"),t.append(e),t}))),"group"===e?a.forEach((e=>{const t=document.createElement("span");t.classList.add("tgico-check"),e.prepend(t)})):"saved"===e&&a.forEach((e=>{const t=document.createElement("span");t.classList.add(i+"-list-bullet"),t.innerText="โ€ข",e.prepend(t)}))),s.length>1&&t.classList.add("has-description"),s.forEach((e=>e.classList.add(i+"-line")))}))}processLocalMessageRender(e,t,i=this.getMiddleware()){return gs(this,void 0,void 0,(function*(){const s=!!e.pFlags.sponsored,n=(0,Et.Z)(i);return this.safeRenderMessage(e,!s,void 0,!1,(i=>gs(this,void 0,void 0,(function*(){const{bubble:a}=yield n(i);if(!a)return i;a.message=e,a.classList.add("is-group-last","is-group-first");const o=()=>{this.updatePlaceholderPosition===o&&(this.updatePlaceholderPosition=void 0),u[p](a)};s||(a.classList.add("bubble-first"),a.classList.remove("can-have-tail","is-in"));const r=[],l=this.chat.isBot;let c,u=this.container,p="append";if(this.chat.isRestricted)c=this.renderEmptyPlaceholder("restricted",a,e,r);else if(s){let i,s,n,o;a.classList.add("avoid-selection"),a.style.order="999999";const r=this.sponsoredMessage=e.sponsoredMessage,d=(0,R.Z)(r.from_id);r.channel_post?(i="OpenChannelPost",s=(0,yt.Z)(r.channel_post)):r.start_param||l?(i="Chat.Message.ViewBot",n=r.start_param):i=(yield this.managers.appPeersManager.isAnyGroup(d))?"Chat.Message.ViewGroup":"Chat.Message.ViewChannel",o=r.chat_invite?()=>{new Ge(r.chat_invite_hash,r.chat_invite)}:r.chat_invite_hash?()=>{const e={_:ke.JOIN_CHAT,invite:r.chat_invite_hash};this.chat.appImManager.processInternalLink(e)}:()=>{this.chat.appImManager.setInnerPeer({peerId:d,lastMsgId:s,startParam:n})};const c=this.makeViewButton({text:i});this.observer.observe(c,this.viewsObserverCallback),o&&(0,C.fc)(c,o),a.querySelector(".bubble-content").prepend(c),u=this.chatInner,p="append",t=!1}else if(l&&"message"===e._){const e=document.createElement("b");e.append((0,L.ag)("BotInfoTitle")),r.push(e,"\n\n"),u=this.chatInner,p="prepend"}else c=this.chat.isAnyGroup&&(yield n(this.managers.appPeersManager.getPeer(this.peerId))).pFlags.creator?this.renderEmptyPlaceholder("group",a,e,r):"scheduled"===this.chat.type?this.renderEmptyPlaceholder("noScheduledMessages",a,e,r):d.Z.myId===this.peerId?this.renderEmptyPlaceholder("saved",a,e,r):this.peerId.isUser()&&!l&&(yield n(this.chat.canSend()))&&"chat"===this.chat.type?this.renderEmptyPlaceholder("greeting",a,e,r):this.renderEmptyPlaceholder("noMessages",a,e,r);c&&(yield c),r.length&&a.querySelector(".message, .service-msg").prepend(...r);const f=!!this.messagesQueueOnRenderAdditional,m=this.setPeerCached&&!f;if(m){const e=a.firstElementChild;e.classList.add("no-transition"),this.chat.setPeerPromise&&this.chat.setPeerPromise.catch(Qe.Z).finally((()=>{e.classList.remove("no-transition")}))}if(void 0!==t||m||(t=!0),f||t?(this.updatePlaceholderPosition=o,this.onAnimateLadder=()=>{if(this.onAnimateLadder=void 0,!this.messagesQueuePromise)return(0,fe.AD)()}):this.chat.setPeerPromise?this.attachPlaceholderOnRender=()=>{this.attachPlaceholderOnRender=void 0,o()}:this.updatePlaceholderPosition=o,!f&&t){yield n((0,pe.e9)());const t=(0,ot.Z)(this.bubbles);(0,h.Z)(t,e.mid),this.animateAsLadder(e.mid,t,!1,0,0)}return a.middlewareHelper.onDestroy((()=>{this.emptyPlaceholderBubble===a&&(this.emptyPlaceholderBubble=void 0)})),this.emptyPlaceholderBubble=a,i}))))}))}makeViewButton(e){return(0,Ue.Z)("btn-primary btn-primary-transparent bubble-view-button",e)}generateLocalMessageId(e=0){const t=("scheduled"===this.chat.type?-1:0)+e,i=-Math.abs(t);return{id:i,mid:-Math.abs((0,yt.Z)(i))}}generateLocalFirstMessage(e,t,i=0){return gs(this,void 0,void 0,(function*(){const{id:s,mid:n}=this.generateLocalMessageId(i);let a={_:e?"messageService":"message",date:0,id:s,mid:n,peer_id:yield this.managers.appPeersManager.getOutputPeer(this.peerId),pFlags:{local:!0}};return e||(a.message=""),(0,Pe.Z)(a),t&&t(a),a=(yield this.managers.appMessagesManager.saveMessages([a],{storage:new Map}))[0],a.mid=n,a}))}getViewportSlice(){return(0,rt.Z)({overflowElement:this.scrollable.container,selector:".bubbles-date-group .bubble:not(.is-date)",extraSize:2*Math.max(700,xe.Z.height)})}deleteViewportSlice(e,t){const{invisibleTop:i,invisibleBottom:s}=e,n=i.concat(s);if(!n.length)return;i.length&&(this.setLoaded("top",!1),this.getHistoryTopPromise=void 0),s.length&&(this.setLoaded("bottom",!1),this.getHistoryBottomPromise=void 0);const a=n.map((({element:e})=>+e.dataset.mid));let o;t||(o=this.createScrollSaver(!!i.length),o.save()),this.deleteMessagesByIds(a,!1,!0),o?o.restore():i.length&&(this.scrollable.lastScrollPosition=this.scrollable.scrollTop)}sliceViewport(e){if(x.IS_SAFARI||this.isHeavyAnimationInProgress&&!e)return;const t=this.getViewportSlice();this.deleteViewportSlice(t)}setLoaded(e,t,i=!0){return gs(this,void 0,void 0,(function*(){if(this.scrollable.loadedAll[e]!==t)return this.log.bindPrefix("setLoaded")("change",e,t),this.scrollable.loadedAll[e]=t,this.scrollable.onScroll(),i?!this.chat.isRestricted&&("bottom"===e&&this.chat.isBroadcast&&this.toggleSponsoredMessage(t),"top"===e&&t&&this.chat.isBot)?this.renderBotPlaceholder():this.checkIfEmptyPlaceholderNeeded():void 0}))}toggleSponsoredMessage(e){return gs(this,void 0,void 0,(function*(){const t=this.log.bindPrefix("sponsored");t("checking");const{mid:i}=this.generateLocalMessageId(1);if(e){const e=this.getMiddleware((()=>this.scrollable.loadedAll.bottom&&this.getSponsoredMessagePromise===i)),i=this.getSponsoredMessagePromise=this.managers.appChatsManager.getSponsoredMessage(this.peerId.toChatId()).then((i=>gs(this,void 0,void 0,(function*(){if(!e()||"messages.sponsoredMessagesEmpty"===i._)return;const s=i.messages[0];if(!s)return void t("no message");const n=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([n,this.getHistoryTopPromise,this.messagesQueuePromise]).then((([i])=>{if(e())return t("rendering",i),this.performHistoryResult({history:[i]},!1)}))})))).finally((()=>{this.getSponsoredMessagePromise===i&&(this.getSponsoredMessagePromise=void 0)}))}else t("clearing rendered",i),this.getSponsoredMessagePromise=void 0,this.deleteMessagesByIds([i])}))}renderBotPlaceholder(){return gs(this,void 0,void 0,(function*(){const e=this.log.bindPrefix("bot placeholder"),t=this.getMiddleware(),i=yield this.managers.acknowledged.appProfileManager.getProfile(this.peerId.toUserId());e("getting profile, cached:",i.cached);const s=i.result.then((s=>gs(this,void 0,void 0,(function*(){var n;if(!t())return;if(!(null===(n=s.bot_info)||void 0===n?void 0:n.description))return e.warn("no description"),this.checkIfEmptyPlaceholderNeeded();const a=yield this.generateLocalFirstMessage(!1,(e=>{const t=s.bot_info;e.message=t.description,t.description_document&&(e.media={_:"messageMediaDocument",document:t.description_document,pFlags:{}}),t.description_photo&&(e.media={_:"messageMediaPhoto",photo:t.description_photo,pFlags:{}})}));return t()?(e("rendering"),{renderPromise:this.processLocalMessageRender(a,!i.cached).then((()=>{e("done")}))}):void 0}))));if(i.cached)return s}))}checkIfEmptyPlaceholderNeeded(){return gs(this,void 0,void 0,(function*(){if(this.scrollable.loadedAll.top&&this.scrollable.loadedAll.bottom&&void 0===this.emptyPlaceholderBubble&&(this.chat.isRestricted||!(yield this.chat.getHistoryStorage()).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=yield this.generateLocalFirstMessage(!0);return{renderPromise:this.processLocalMessageRender(e)}}}))}getHistory1(e,t,i,s,n){const a=this.getMiddleware(n?void 0:()=>(t?this.getHistoryTopPromise:this.getHistoryBottomPromise)===r),o=this.getHistory(e,t,i,s,n,a),r=o.then((e=>e&&(e.waitPromise||e.promise)));return t?this.getHistoryTopPromise=r:this.getHistoryBottomPromise=r,r.then((()=>{a()&&(t?this.getHistoryTopPromise=void 0:this.getHistoryBottomPromise=void 0,n||"chat"===this.chat.type&&setTimeout((()=>{t?this.loadMoreHistory(!0,!0):this.loadMoreHistory(!1,!0)}),0))})),o}getHistory(e=0,t=!1,i=!1,s=0,n=!1,a){return gs(this,void 0,void 0,(function*(){const o=this.peerId,r=this.chat.isBroadcast,l=Math.min(30,xe.Z.height/40|0);let c=r?20:Object.keys(this.bubbles).length>0?Math.max(35,l):l;if(void 0!==ws){if(!ws)return{cached:!1,promise:Promise.resolve(),waitPromise:Promise.resolve()};Object.keys(this.bubbles).length>0&&--ws}let h,u=0;if(i&&(u=c,t||(c=0)),s&&!i)if("pinned"===this.chat.type)h=[s];else{const t=(yield this.chat.getHistoryStorage()).history.slice;if(t.length=0;--e){const t=yield this.chat.getMessage(h[e]);if(!(null==t?void 0:t.grouped_id))break;h.splice(e,1)}e=h[h.length-1]||e}}let p,f=yield this.requestHistory(e,c,u);this.log("i vin brehnya",f,e,c,u);const m=(null==h?void 0:h.length)&&!f.cached,g=this.isFirstLoad&&u&&!f.cached||m;m&&(p=f.result,f={cached:!0,result:Promise.resolve({history:h})}),this.isFirstLoad=!1;const v=e=>gs(this,void 0,void 0,(function*(){var t;if(null===(t=e.isEnd)||void 0===t?void 0:t.top){if("discussion"===this.chat.type){const t=yield this.managers.appMessagesManager.getThreadServiceMessageId(this.peerId,this.chat.threadId);t&&e.history.push(t);const i=yield this.chat.getMidsByMid(this.chat.threadId);e.history.push(...i.reverse())}yield this.managers.appProfileManager.getProfileByPeerId(o)}})),b=e=>(0,pe.e9)().then((()=>v(e))).then((()=>(!m&&s&&e.history.unshift(s),this.performHistoryResult(e,t)))),y=e=>{const t=Promise.resolve(e).then((e=>{if(a&&!a())throw Ls;if(!n)return b(e);this.scrollable.onScroll()}),(e=>{throw this.log.error("getHistory error:",e),e}));return t};let w,S;if(f.cached){if(n)return this.scrollable.onScroll(),null;S=!0,w=b(yield f.result)}else S=!1,w=y(f.result);const C=m?y(p):w;if(g&&d.Z.settings.animationsEnabled){let i=m?2:1;this.messagesQueueOnRenderAdditional=()=>{this.log("messagesQueueOnRenderAdditional"),--i||(this.messagesQueueOnRenderAdditional=void 0,this.animateAsLadder(s,h,m,u,e).then((()=>{setTimeout((()=>{this.loadMoreHistory(t,!0)}),0)})))}}else this.messagesQueueOnRenderAdditional=void 0;return n?null:{cached:S,promise:w,waitPromise:C}}))}setUnreadDelimiter(){return gs(this,void 0,void 0,(function*(){if("chat"!==this.chat.type&&"discussion"!==this.chat.type)return;if(this.attachedUnreadBubble)return;const e=yield this.chat.getHistoryMaxId();let t=yield this.managers.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])){const i=this.bubbles[t];this.firstUnreadBubble&&this.firstUnreadBubble!==i&&(this.firstUnreadBubble.classList.remove("is-first-unread"),this.firstUnreadBubble=null),t!==e&&i.classList.add("is-first-unread"),this.firstUnreadBubble=i,this.attachedUnreadBubble=!0}}))}deleteEmptyDateGroups(){const e=this.stickyIntersector?Cs:1;let t=!1;for(const i in this.dateMessages){const s=this.dateMessages[i];s.container.childElementCount===e&&(s.container.remove(),this.stickyIntersector&&this.stickyIntersector.unobserve(s.container,s.div),delete this.dateMessages[i],t=!0)}t&&(Object.keys(this.dateMessages).length||this.container.classList.remove("has-groups"),this.checkIfEmptyPlaceholderNeeded(),this.setStickyDateManually())}}function Zs(){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}var Ts=i(3003),ks=i(5128),xs=i(8127);class As{constructor(e,t,i,s){this.peerId=e,this.mid=t,this.unpin=i,this.onConfirm=s,this.construct()}construct(){return e=this,t=void 0,s=function*(){const{peerId:e,mid:t,unpin:i,onConfirm:s}=this;let n,a,o;const r=[],l=[],c=S.Z.MANAGERS,h=yield c.appPeersManager.canPinMessage(e),u=(n,a,o)=>{setTimeout((()=>{let n;n=i&&!t?h?c.appMessagesManager.unpinAllMessages(e):c.appMessagesManager.hidePinnedMessages(e):c.appMessagesManager.updatePinnedMessage(e,t,i,o,a),s&&n.then(s)}),300)};if(i){let i="UnpinMessage";t?(n="UnpinMessageAlertTitle",a="Chat.Confirm.Unpin"):h?(n="Popup.Unpin.AllTitle",a="Chat.UnpinAllMessagesConfirmation",o=[""+((yield c.appMessagesManager.getPinnedMessagesCount(e))||1)]):(n="Popup.Unpin.HideTitle",a="Popup.Unpin.HideDescription",i="Popup.Unpin.Hide"),r.push({langKey:i,isDanger:!0,callback:u})}else{n="PinMessageAlertTitle";const t="PinMessage";e.isAnyChat()?(r.push({langKey:t,callback:e=>u(0,!1,!e.size)}),(yield c.appChatsManager.isBroadcast(e.toChatId()))?a="PinMessageAlertChannel":(a="PinMessageAlert",l.push({text:"PinNotify",checked:!0}))):(a="PinMessageAlertChat",e===d.Z.myId?r.push({langKey:t,callback:u}):(r.push({langKey:t,callback:e=>u(0,!e.size)}),l.push({text:"PinAlsoFor",textArgs:[yield(0,Vt.Z)({peerId:e})],checked:!0})))}(0,S.x)(r),new xs.Z("popup-delete-chat",{peerId:e,titleLangKey:n,descriptionLangKey:a,descriptionLangArgs:o,buttons:r,checkboxes:l}).show()},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var _s=i(1962);function Fs(e=window.getSelection()){if(!(null==e?void 0:e.rangeCount))return!0;const t=e.getRangeAt(0);return!(!t.collapsed&&t.START_TO_END)}var Ds=i(2312),Rs=i(1447),Bs=i(671),Ns=i(3174);function Os(e,t,i){return d.Z.managers.appStickersManager.preloadAnimatedEmojiSticker(e).then((({doc:s})=>{if(s)return Ds.Z.downloadMedia({media:s}).then((n=>{return a=this,r=void 0,l=function*(){const a=o.Z.active.emojiSticker,r=(0,Bs.tB)(e),d=yield Rs.Z.loadAnimationWorker({container:void 0,animationData:n,width:null!=t?t:a.width,height:null!=i?i:a.height,name:"doc"+s.id,autoplay:!1,loop:!1,toneIndex:r,group:"none"});d.addEventListener("firstFrame",(()=>{(0,Ns.O)(s,d.canvas[0],r),d.remove()}),{once:!0})},new((d=void 0)||(d=Promise))((function(e,t){function i(e){try{n(l.next(e))}catch(e){t(e)}}function s(e){try{n(l.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof d?n:new d((function(e){e(n)}))).then(i,s)}n((l=l.apply(a,r||[])).next())}));var a,r,d,l}))}))}var Us=i(5772);class Hs extends xs.Z{constructor(e,t,i,s){super("popup-report-messages-confirm",{noTitle:!0,descriptionLangKey:"ReportInfo",buttons:[{langKey:"ReportChat",callback:()=>{a.isValid()&&(s&&s(),this.managers.appMessagesManager.reportMessages(e,t,i,a.value).then((e=>{e&&(0,we.bC)({langPackKey:"ReportSentInfo"})})))}}],body:!0});const n=document.createElement("div");(0,Us.Z)({div:n,emoji:Hs.STICKER_EMOJI,width:100,height:100}).then((({render:e})=>e)).finally((()=>{this.show()})),this.header.replaceWith(n);const a=new E.ZP({label:"ReportHint",maxLength:512,placeholder:"ReportChatDescription"});a.input.addEventListener("input",(()=>{this.buttons[0].element.toggleAttribute("disabled",!a.isValid())})),this.body.append(a.container)}}Hs.STICKER_EMOJI="๐Ÿ‘ฎโ€โ™€๏ธ";class zs extends xs.Z{constructor(e,t,i){super("popup-report-messages",{titleLangKey:"ChatTitle.ReportMessages",buttons:[],body:!0}),t=t.slice();const s=[["ReportChatSpam","inputReportReasonSpam"],["ReportChatViolence","inputReportReasonViolence"],["ReportChatChild","inputReportReasonChildAbuse"],["ReportChatPornography","inputReportReasonPornography"],["ReportChatOther","inputReportReasonOther"],["ReportChatPersonalDetails","inputReportReasonPersonalDetails"],["ReportChatIllegalDrugs","inputReportReasonIllegalDrugs"]];s.forEach((e=>{const t=(0,Ue.Z)("btn-primary btn-transparent",{text:e[0]});this.body.append(t)}));const n=Os(Hs.STICKER_EMOJI);(0,C.fc)(this.body,(a=>{const o=(0,be.Z)(a.target,"btn-primary"),r=s[(0,Ie.Z)(o)][1];n.then((()=>{this.hide(),new Hs(e,t,r,i)}))}),{listenerSetter:this.listenerSetter}),this.buttonsEl.style.marginTop=".5rem",this.show()}}class js extends xs.Z{constructor(){super("popup-sponsored",{titleLangKey:"Chat.Message.Sponsored.What",descriptionLangKey:"Chat.Message.Ad.Text",descriptionLangArgs:[(0,L.ag)("Chat.Message.Sponsored.Link")],buttons:[{langKey:"OK",isCancel:!0},{langKey:"Chat.Message.Ad.ReadMore",callback:()=>{window.open(L.ZP.format("Chat.Message.Sponsored.Link",!0))},isCancel:!0}],scrollable:!0}),this.scrollable.append(this.description),this.show()}}var Gs=i(6008),Vs=i(8936),Ks=i(3061),Ws=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class $s extends S.Z{constructor(e){super("popup-reacted-list",{closable:!0,overlayClosable:!0,body:!0}),this.message=e,this.init()}init(){return Ws(this,void 0,void 0,(function*(){const e=this.middlewareHelper.get(),t=yield this.managers.appMessagesManager.getGroupsFirstMessage(this.message);if(!e())return;const i=yield this.managers.appMessagesManager.canViewMessageReadParticipants(t);if(!e())return;const s=new st,n=Object.assign(Object.assign({},t),{mid:0,id:0,reactions:Object.assign(Object.assign({_:"messageReactions",results:[]},t.reactions),{pFlags:{},recent_reactions:[]})});n.reactions.results=n.reactions.results.map((e=>Object.assign(Object.assign({},e),{chosen_order:void 0,pFlags:{}}))),s.init(n,"block",this.middlewareHelper.get()),s.render(),s.classList.add("no-stripe"),s.classList.remove("has-no-reactions"),s.append(this.btnClose),this.header.append(s);const a=document.createElement("div");a.classList.add("tabs-container"),a.dataset.animation="tabs";const o=new Map;let r=!1;if(n.reactions.results.length){const e=this.createFakeReaction("reactions",n.reactions.results.reduce(((e,t)=>e+t.count),0));s.prepend(e),n.reactions.results.unshift(e.reactionCount),r=!0}let d=!1;if(i)try{const i=yield this.managers.appMessagesManager.getMessageReadParticipants(t.peerId,t.mid);if(!e())return;if(!i.length)throw"";const a=this.createFakeReaction("checks",i.length);s.prepend(a),n.reactions.results.unshift(a.reactionCount),d=!0}catch(e){}n.reactions.results.forEach((i=>{const s=new T.ZP(void 0);s.container.classList.add("tabs-tab");const n=new Ei.Z({noShadow:!0,noDelimiter:!0}),r=Ji.default.createChatList({dialogSize:72});Ji.default.setListClickListener(r,(()=>{this.hide()}),void 0,!1,!0),n.content.append(r),s.container.append(n.container);const d="checks"!==i.reaction,l="checks"===i.reaction;["checks","reactions"].includes(i.reaction)&&(i.reaction=void 0);const c=(0,qe.C)(24,24);let h;const u=new Vs.Z({scrollable:s,getPromise:()=>Ws(this,void 0,void 0,(function*(){const s=yield this.managers.appMessagesManager.getMessageReactionsListAndReadParticipants(t,void 0,i.reaction,h,d,l);return h=s.nextOffset,yield Promise.all(s.combined.map((({peerId:t,reaction:i})=>Ws(this,void 0,void 0,(function*(){const{dom:s}=Ji.default.addDialogNew({peerId:t,autonomous:!0,container:r,avatarSize:"abitbigger",rippleEnabled:!1,meAsSaved:!1});if(i){const t=document.createElement("div");if(t.classList.add("reacted-list-reaction-icon"),"reactionEmoji"===i._){const s=yield this.managers.appReactionsManager.getReactionCached(i.emoticon);(0,W.ZP)({doc:s.static_icon,div:t,width:24,height:24,middleware:e})}else"reactionCustomEmoji"===i._&&t.append((0,We.Z)({docIds:[i.document_id],customEmojiSize:c,middleware:e}));s.listEl.append(t)}(0,H.Z)(s.lastMessageSpan,(0,Ks.Z)(yield this.managers.appUsersManager.getUser(t.toUserId())))}))))),!h}))});o.set(s.container,u),a.append(s.container)})),this.body.append(a);const l=(0,Gs.X)(s,a,((e,t)=>{if(e===s.childElementCount-1)return!1;const i=s.children[e],n=l.prevId();-1!==n&&s.children[n].setIsChosen(!1),i.setIsChosen(!0),o.get(t).load()}),void 0,void 0,void 0,this.listenerSetter);l(0,!1),this.show()}))}createFakeReaction(e,t){const i=new Je;i.init("block",this.middlewareHelper.get()),i.reactionCount={_:"reactionCount",count:t,reaction:e},i.setCanRenderAvatars(!1),i.renderCounter();const s=document.createElement("div");return s.classList.add("reaction-counter","reaction-sticker-icon","tgico-"+e),i.prepend(s),i}}const qs="btn-menu-reactions",Qs=qs+"-reaction",Ys=!x.IS_SAFARI;class Xs{constructor(e,t,i){this.managers=e,this.type=t,this.onScroll=()=>{this.reactionsMap.forEach(((e,t)=>{this.onScrollProcessItem(t,e)}))},this.onMouseMove=e=>{var t;const i=(0,be.Z)(e.target,Qs);if(!i)return;const s=this.reactionsMap.get(i);if(!s)return;if(!(null===(t=s.appear)||void 0===t?void 0:t.paused))return;const n=s.select;n&&n.paused&&(n.autoplay=!0,n.restart())};const n=this.widthContainer=document.createElement("div");n.classList.add(qs+"-container"),n.classList.add(qs+"-container-"+t);const a=this.container=document.createElement("div");a.classList.add(qs);const o=this.scrollable="vertical"===t?new T.ZP(void 0):new T.v7(void 0);a.append(o.container),o.onAdditionalScroll=this.onScroll,o.setListeners(),o.container.classList.add("no-scrollbar"),this.reactionsMap=new Map,this.animationGroup=`CHAT-MENU-REACTIONS-${Date.now()}`,s.Z.setOverrideIdleGroup(this.animationGroup,!0),c.Z||a.addEventListener("mousemove",this.onMouseMove),(0,C.fc)(a,(e=>{const t=(0,be.Z)(e.target,Qs);if(!t)return;const i=this.reactionsMap.get(t);i&&this.managers.appReactionsManager.sendReaction(this.message,i.reaction)})),n.append(a),this.middleware=null!=i?i:(0,Se.k)()}init(e){this.message=e;const t=this.middleware.get(),i=this.managers.appReactionsManager.getAvailableReactionsByMessage(e);(0,Ke.Z)(i,(e=>{if(!t()||!e.length)return;e.forEach((e=>{e.pFlags.premium&&!d.Z.premium||this.renderReaction(e)}));const s=()=>{this.container.classList.add("is-visible")};i instanceof Promise?(0,fe.T2)(s):s()}))}cleanup(){this.middleware.clean(),this.scrollable.removeListeners(),this.reactionsMap.clear(),s.Z.setOverrideIdleGroup(this.animationGroup,!1),s.Z.checkAnimations(!0,this.animationGroup,!0)}canUseAnimations(){return d.Z.settings.animationsEnabled&&!x.IS_MOBILE}renderReaction(e){const t=document.createElement("div");t.classList.add(Qs);const i=document.createElement("div");i.classList.add(Qs+"-scale");const s=document.createElement("div");let n;s.classList.add(Qs+"-appear"),this.canUseAnimations()&&(n=document.createElement("div"),n.classList.add(Qs+"-select","hide"));const a={selectWrapper:n,appearWrapper:s,reaction:{_:"reactionEmoji",emoticon:e.reaction}};this.reactionsMap.set(t,a);const o=this.middleware.get(),r=26*(c.Z?1:1.25),d={width:r,height:r,skipRatio:1,needFadeIn:!1,withThumb:!1,group:this.animationGroup,middleware:o};if(this.canUseAnimations()){let t=!0;(0,W.ZP)(Object.assign({doc:e.appear_animation,div:s,play:!0},d)).then((({render:e})=>e)).then((e=>{(0,Pe.Z)(e),a.appear=e,e.addEventListener("enterFrame",(o=>{e.maxFrame===o&&i.then((e=>{(0,Pe.Z)(e),s.classList.add("hide"),n.classList.remove("hide"),t&&(a.select=e,t=!1)}),Qe.Z)}))}),Qe.Z);const i=(0,W.ZP)(Object.assign({doc:e.select_animation,div:n},d)).then((({render:e})=>e)).then((e=>((0,Pe.Z)(e),Rs.Z.waitForFirstFrame(e)))).catch(Qe.Z)}else delete d.needFadeIn,delete d.withThumb,(0,W.ZP)(Object.assign({doc:e.static_icon,div:s},d));i.append(s),n&&i.append(n),t.append(i),this.scrollable.append(t)}onScrollProcessItem(e,t){const i=e.firstElementChild,s=(0,He.Z)(e,this.scrollable.container);let n;if(s)if(s.overflow.left||s.overflow.right){const e=Math.abs(s.rect.left-s.rect.right);n="scale("+Math.min(Math.pow(e,2)/Math.pow(34,2),1)+")"}else n="";else{if(!t.appearWrapper.classList.contains("hide")||!t.appear)return;t.select&&t.select.stop(),t.appear.stop(),t.appear.autoplay=!0,t.appearWrapper.classList.remove("hide"),t.selectWrapper.classList.add("hide"),n=""}Ys&&(i.style.transform=n)}}var Js=i(1483),en=i(2353),tn=i(6690),sn=i(3709),nn=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class an{constructor(e,t){this.chat=e,this.managers=t,this.onContextMenu=e=>{let t,i;try{i=(0,be.Z)(e.target,"bubble-content-wrapper"),t=i?i.parentElement:(0,be.Z)(e.target,"bubble")}catch(e){}if(!t||t.classList.contains("bubble-first"))return;let s=this.element;if((e instanceof MouseEvent||e.hasOwnProperty("preventDefault"))&&e.preventDefault(),s&&s.classList.contains("active"))return!1;(e instanceof MouseEvent||e.hasOwnProperty("cancelBubble"))&&(e.cancelBubble=!0);let n=+t.dataset.mid;n&&(()=>{nn(this,void 0,void 0,(function*(){const a=this.isSponsored=n<0;this.isSelectable=this.chat.selection.canSelectBubble(t),this.peerId=this.chat.peerId,this.target=e.target,this.isTextSelected=!Fs(),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");const o=yield this.chat.getMidsByMid(n);if(this.chat.selection.isSelecting&&!i){if(a)return;if(o.length>1){const e=this.chat.selection.isMidSelected(this.peerId,n)?n:o.find((e=>this.chat.selection.isMidSelected(this.peerId,e)));e&&(n=e)}}this.isOverBubble=!!i;const r=(0,be.Z)(this.target,"grouped-item");this.isTargetAGroupedItem=!!r,this.mid=r?+r.dataset.mid:n,this.isSelected=this.chat.selection.isMidSelected(this.peerId,this.mid),this.message=t.message||(yield this.chat.getMessage(this.mid)),this.albumMessages=this.message.grouped_id?yield this.managers.appMessagesManager.getMessagesByAlbum(this.message.grouped_id):void 0,this.noForwards=!a&&!(yield this.managers.appMessagesManager.canForward(this.message)),this.viewerPeerId=void 0,this.canOpenReactedList=void 0,this.linkToMessage=yield this.getUrlToMessage(),this.selectedMessagesText=yield this.getSelectedMessagesText();const d=yield this.init();if(!d)return;s=d.element;const{cleanup:l,destroy:c,menuPadding:h,reactionsMenu:u,reactionsMenuPosition:p}=d;let f=!1;if(u){const e="is-visible";if(f=u.container.classList.contains(e),f&&u.container.classList.remove(e),"horizontal"===p){const e=s.offsetWidth,t=(e-8)/34%1,i=.65;if(t{u&&u.container.classList.remove("is-visible"),this.mid=0,this.peerId=void 0,this.target=null,this.viewerPeerId=void 0,this.canOpenReactedList=void 0,l(),setTimeout((()=>{c()}),300)})),f&&u.container.classList.add("is-visible")}))})()},this.onSendScheduledClick=()=>nn(this,void 0,void 0,(function*(){this.chat.selection.isSelecting?(0,C.tH)(this.chat.selection.selectionSendNowBtn):new _s.Z(this.peerId,yield this.chat.getMidsByMid(this.mid))})),this.onReplyClick=()=>{this.chat.input.initMessageReply(this.mid)},this.onFaveStickerClick=e=>{const t=this.message.media.document.id;this.managers.appStickersManager.faveSticker(t,e)},this.onEditClick=()=>{const e=this.getMessageWithText();this.chat.input.initMessageEditing(this.isTargetAGroupedItem?this.mid:e.mid)},this.onCopyClick=()=>nn(this,void 0,void 0,(function*(){Fs()?(0,ct.T)(this.selectedMessagesText):document.execCommand("copy")})),this.onCopyAnchorLinkClick=()=>{(0,ct.T)(this.target.href)},this.onCopyLinkClick=()=>{const{url:e,isPrivate:t}=this.linkToMessage,i=t?"LinkCopiedPrivateInfo":"LinkCopied";(0,we.Am)(L.ZP.format(i,!0)),(0,ct.T)(e)},this.onPinClick=()=>{new As(this.peerId,this.mid)},this.onUnpinClick=()=>{new As(this.peerId,this.mid,!0)},this.onRetractVote=()=>{this.managers.appPollsManager.sendVote(this.message,[])},this.onStopPoll=()=>{this.managers.appPollsManager.stopPoll(this.message)},this.onForwardClick=()=>nn(this,void 0,void 0,(function*(){if(this.chat.selection.isSelecting)(0,C.tH)(this.chat.selection.selectionForwardBtn);else{const e=this.peerId,t=this.isTargetAGroupedItem?[this.mid]:yield this.chat.getMidsByMid(this.mid);new M.Z({[e]:t})}})),this.onSelectClick=()=>{this.chat.selection.toggleByElement((0,be.Z)(this.target,"grouped-item")||(0,be.Z)(this.target,"bubble"))},this.onClearSelectionClick=()=>{this.chat.selection.cancelSelection()},this.onDeleteClick=()=>nn(this,void 0,void 0,(function*(){this.chat.selection.isSelecting?(0,C.tH)(this.chat.selection.selectionDeleteBtn):new ks.Z(this.peerId,this.isTargetAGroupedItem?[this.mid]:yield this.chat.getMidsByMid(this.mid),this.chat.type)})),this.listenerSetter=new ce.Z,this.attachListenerSetter=new ce.Z,this.middleware=(0,Se.k)()}attachTo(e){this.attachListenerSetter.removeAll(),c.Z?(0,C.fc)(e,(e=>{this.chat.selection.isSelecting||(this.chat.log("touchend",e),!e.target.closest([".name",".peer-title",".reply",".document","audio-element","avatar-element","a",".bubble-beside-button","replies-element","[data-saved-from]:not(.bubble)","poll-element",".attachment",".reply-markup-button"].join(", "))&&((0,Ce.Z)(e),this.onContextMenu(e)))}),{listenerSetter:this.attachListenerSetter}):(0,Ct.E)({element:e,callback:this.onContextMenu,listenerSetter:this.attachListenerSetter})}cleanup(){this.listenerSetter.removeAll(),this.reactionsMenu&&this.reactionsMenu.cleanup(),this.middleware.clean()}destroy(){this.cleanup(),this.attachListenerSetter.removeAll()}filterButtons(e){return nn(this,void 0,void 0,(function*(){return this.isSponsored?e.filter((e=>e.isSponsored)):(0,en.Z)(e,(e=>nn(this,void 0,void 0,(function*(){let t;return this.chat.selection.isSelecting&&!e.withSelection?t=!1:(this.isOverBubble||c.Z,t=yield e.verify()),!!t}))))}))}setButtons(){const e=e=>nn(this,void 0,void 0,(function*(){var t;const i=null===(t=this.message.media)||void 0===t?void 0:t.document;if(!(null==i?void 0:i.sticker))return!1;const s=yield this.managers.acknowledged.appStickersManager.getFavedStickersStickers();if(!s.cached)return!1;const n=(yield s.result).some((e=>e.id===i.id));return e?!n:n}));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((()=>{(0,Pe.Z)(this.message),this.managers.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:()=>nn(this,void 0,void 0,(function*(){return(yield this.chat.canSend())&&!this.message.pFlags.is_outgoing&&!!this.chat.input.messageInput&&"scheduled"!==this.chat.type}))},{icon:"favourites",text:"AddToFavorites",onClick:this.onFaveStickerClick.bind(this,!1),verify:()=>e(!0)},{icon:"favourites",text:"DeleteFromFavorites",onClick:this.onFaveStickerClick.bind(this,!0),verify:()=>e(!1)},{icon:"edit",text:"Edit",onClick:this.onEditClick,verify:()=>nn(this,void 0,void 0,(function*(){return(yield this.managers.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:()=>nn(this,void 0,void 0,(function*(){if(!this.isSelected||this.noForwards)return!1;for(const[e,t]of this.chat.selection.selectedMids){const i=`${e}_${"scheduled"===this.chat.type?"scheduled":"history"}`;for(const e of t)if((yield this.managers.appMessagesManager.getMessageFromStorage(i,e)).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:()=>{(0,ct.T)(this.target.innerHTML)},verify:()=>this.isUsernameTarget,withSelection:!0},{icon:"copy",text:"Text.Context.Copy.Hashtag",onClick:()=>{(0,ct.T)(this.target.innerHTML)},verify:()=>this.target.classList.contains("anchor-hashtag"),withSelection:!0},{icon:"link",text:"MessageContext.CopyMessageLink1",onClick:this.onCopyLinkClick,verify:()=>nn(this,void 0,void 0,(function*(){return(yield this.managers.appPeersManager.isChannel(this.peerId))&&!this.message.pFlags.is_outgoing}))},{icon:"pin",text:"Message.Context.Pin",onClick:this.onPinClick,verify:()=>nn(this,void 0,void 0,(function*(){return!this.message.pFlags.is_outgoing&&"messageService"!==this.message._&&!this.message.pFlags.pinned&&(yield this.managers.appPeersManager.canPinMessage(this.peerId))&&"scheduled"!==this.chat.type}))},{icon:"unpin",text:"Message.Context.Unpin",onClick:this.onUnpinClick,verify:()=>nn(this,void 0,void 0,(function*(){return this.message.pFlags.pinned&&(yield this.managers.appPeersManager.canPinMessage(this.peerId))}))},{icon:"download",text:"MediaViewer.Context.Download",onClick:()=>{Ds.Z.downloadToDisc({media:(0,vt.Z)(this.message)})},verify:()=>{var e,t;if(!(0,sn.Z)(this.message)||this.noForwards)return!1;let i=!1;if(null===(e=this.message.media)||void 0===e?void 0:e.photo)i=!0;else{if(!(null===(t=this.message.media)||void 0===t?void 0:t.document))return!1;i=!0}let s=!!c.Z;return i&&(s||(s=!!((0,be.Z)(this.target,"document")||(0,be.Z)(this.target,"audio")||(0,be.Z)(this.target,"media-sticker-wrapper")||(0,be.Z)(this.target,"media-photo")||(0,be.Z)(this.target,"media-video")))),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:()=>nn(this,void 0,void 0,(function*(){var e;const t=null===(e=this.message.media)||void 0===e?void 0:e.poll;return(yield this.managers.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.fromId!==m.yF||"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 zs(this.peerId,[this.mid])},verify:()=>nn(this,void 0,void 0,(function*(){return!this.message.pFlags.out&&"message"===this.message._&&!this.message.pFlags.is_outgoing&&(yield this.managers.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},{onClick:()=>{if(this.viewerPeerId)this.chat.appImManager.setInnerPeer({peerId:this.viewerPeerId});else{if(!this.canOpenReactedList)return!1;new $s(this.message)}},verify:()=>nn(this,void 0,void 0,(function*(){var e,t;return!this.peerId.isUser()&&(!!(null===(t=null===(e=this.message.reactions)||void 0===e?void 0:e.recent_reactions)||void 0===t?void 0:t.length)||(yield this.managers.appMessagesManager.canViewMessageReadParticipants(this.message)))})),notDirect:()=>!0,localName:"views"},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>nn(this,void 0,void 0,(function*(){return this.managers.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 js},verify:()=>!1,isSponsored:!0},{text:"Loading",onClick:()=>{this.emojiInputsPromise.then((e=>{new P.Z(e,!0).show()}))},verify:()=>!!this.getUniqueCustomEmojisFromMessage().length,notDirect:()=>!0,localName:"emojis"}]}getMessageWithText(){return this.albumMessages&&(0,Mt.Z)(this.albumMessages)||this.message}getUniqueCustomEmojisFromMessage(){const e=[],t=this.getMessageWithText(),i=t.entities;if(i){const t=i.filter((e=>"messageEntityCustomEmoji"===e._));e.push(...t.map((e=>e.document_id)))}const s=t.reactions;if(s){const t=s.results.filter((e=>"reactionCustomEmoji"===e.reaction._));e.push(...t.map((e=>e.reaction.document_id)))}return(0,tn.Z)(e)}init(){return nn(this,void 0,void 0,(function*(){this.cleanup(),this.setButtons();const e=yield this.filterButtons(this.buttons);if(!e.length)return;const t=this.element=yield(0,Ts.Z)({buttons:e,listenerSetter:this.listenerSetter});t.id="bubble-contextmenu",t.classList.add("contextmenu");const i=e.find((e=>"views"===e.localName));if(i){const e=this.message.reactions,t=null==e?void 0:e.recent_reactions,s=!!(null==t?void 0:t.length),n=(yield this.managers.appMessagesManager.canViewMessageReadParticipants(this.message))?(yield this.managers.appPeersManager.getPeer(this.peerId)).participants_count:void 0,a=e?e.results.reduce(((e,t)=>e+t.count),0):void 0;i.element.classList.add("tgico-"+(s?"reactions":"checks"));const o=new L.ZP.IntlElement({key:s?void 0===n?"Chat.Context.ReactedFast":"Chat.Context.Reacted":"NobodyViewed",args:s?void 0===n?[a]:[n,n]:void 0,element:i.textElement});let r;r=s?void 0===n?(0,L.ag)("Chat.Context.ReactedFast",[a]):(0,L.ag)(t.length===n?"Chat.Context.ReactedFast":"Chat.Context.Reacted",[t.length,n]):(0,L.ag)("Loading"),r.classList.add("btn-menu-item-text-fake"),i.element.append(r);const d=22,l=3,c=1.125;o.element.style.visibility="hidden",o.element.style.paddingRight=s?c*Math.min(l,t.length)+"rem":"1rem";const h=this.middleware.get();this.managers.appMessagesManager.getMessageReactionsListAndReadParticipants(this.message).then((e=>{if(!h())return;r&&r.remove();const a=e.combined,u=void 0===n?e.reactionsCount:s?a.filter((e=>e.reaction)).length:a.length;let p;if(1===a.length)p=new N.Z({peerId:a[0].peerId,onlyFirstName:!0,dialog:!1}).element,(!s||e.readParticipants.length<=1)&&(this.viewerPeerId=a[0].peerId);else if(s){const e=u===a.length||void 0===n;p=(0,L.ag)(e?"Chat.Context.ReactedFast":"Chat.Context.Reacted",e?[u]:[u,a.length])}else a.length?p=(0,L.ag)("MessageSeen",[a.length]):o.element.style.visibility="";if(p&&(p.style.paddingRight=c*Math.min(l,u)+"rem",p.classList.add("btn-menu-item-text-fake"),i.element.append(p)),a.length){const e=new se({avatarSize:d});e.render(t?t.map((e=>(0,R.Z)(e.peer_id))):a.map((e=>e.peerId))),i.element.append(e.container),this.canOpenReactedList=!0}}))}let s,n,a;if(!("message"!==this.message._||this.chat.selection.isSelecting||this.message.pFlags.is_outgoing||this.message.pFlags.is_scheduled||this.message.pFlags.local)){a=x.IS_APPLE||c.Z?"horizontal":"vertical",n=this.reactionsMenu=new Xs(this.managers,a,this.middleware),n.init(yield this.managers.appMessagesManager.getGroupsFirstMessage(this.message));const e=44,t=0;s="vertical"===a?{top:t,left:e}:{top:e,right:0,left:t}}const o=e.find((e=>"emojis"===e.localName));if(o){o.element.classList.add("is-multiline"),o.element.parentElement.insertBefore(document.createElement("hr"),o.element);const e=()=>{null!=s||(s={}),s.bottom=24},t=this.getUniqueCustomEmojisFromMessage(),i=this.emojiInputsPromise=(0,me.Z)();yield this.managers.appEmojiManager.getCachedCustomEmojiDocuments(t).then((s=>nn(this,void 0,void 0,(function*(){const n=t=>nn(this,void 0,void 0,(function*(){const s=new Map;t.forEach((e=>{e&&!s.has(e.stickerSetInput.id)&&s.set(e.stickerSetInput.id,e.stickerSetInput)}));const n=[...s.values()];if(i.resolve(n),1===s.size){const t=yield this.managers.acknowledged.appStickersManager.getStickerSet(n[0]),i=t.result.then((e=>{const t=(0,L.ag)("MessageContainsEmojiPack",[(0,B.Z)(e.set.title)]);(0,H.Z)(o.textElement,t)}));return t.cached?i:void e()}(0,H.Z)(o.textElement,(0,L.ag)("MessageContainsEmojiPacks",[s.size]))}));if(!s.some((e=>!e)))return n(s);e(),this.managers.appEmojiManager.getCustomEmojiDocuments(t).then(n)}))))}return this.chat.container.append(t),{element:t,cleanup:()=>{this.cleanup(),n&&n.cleanup()},destroy:()=>{t.remove(),n&&n.widthContainer.remove()},menuPadding:s,reactionsMenu:n,reactionsMenuPosition:a}}))}getUrlToMessage(){return nn(this,void 0,void 0,(function*(){if(this.peerId.isUser())return;let e;const{peerId:t,mid:i}=this,s=this.chat.threadId;"discussion"===this.chat.type&&(e=yield this.managers.appMessagesManager.getMessageByPeer(t,s));const n=yield this.managers.appPeersManager.getPeerUsername(e?e.fromId:t),a=(0,bt.Z)(i);let o="https://t.me/";return n?(o+=n,o+=e?`/${(0,bt.Z)(e.fwd_from.channel_post)}?comment=${a}`:s?`/${(0,bt.Z)(s)}/${a}`:"/"+a):(o+="c/"+t.toChatId(),o+=e?`/${a}?thread=${(0,bt.Z)(e.mid)}`:s?`/${(0,bt.Z)(s)}/${a}`:"/"+a),{url:o,isPrivate:!n}}))}getSelectedMessagesText(){return nn(this,void 0,void 0,(function*(){if(!Fs())return"";const e=this.chat.selection.isSelecting?[...this.chat.selection.selectedMids.get(this.peerId)].sort(((e,t)=>e-t)):[this.mid];return(yield Promise.all(e.map((e=>nn(this,void 0,void 0,(function*(){const t=yield this.chat.getMessage(e);return(null==t?void 0:t.message)?t.message+"\n":""})))))).join("")}))}}var on=i(4329),rn=i.n(on),dn=i(9043);class ln{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=(0,Ts.b)({buttons:this.sendMenuButtons,listenerSetter:e.listenerSetter}),this.sendMenu.classList.add("menu-send",e.openSide),(0,Ct.E)({element:e.onContextElement,callback:t=>{e.onOpen&&!e.onOpen()||(this.sendMenuButtons.forEach((e=>{e.element.classList.toggle("hide",!e.verify())})),(0,Ce.Z)(t),Lt.Z.openBtnMenu(this.sendMenu))},listenerSetter:e.listenerSetter})}setPeerId(e){this.type=e===d.Z.myId?"reminder":"schedule"}}var cn=i(1293),hn=i(9336),un=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class pn extends S.Z{constructor(e){super("popup-create-poll popup-new-media",{closable:!0,withConfirm:"Create",body:!0,title:"NewPoll"}),this.chat=e,this.tempId=0,this.onSubmitClick=()=>{this.send()},this.onInput=e=>{const t=e.target,i=(0,ye.Z)(t,"LABEL"),s=(0,cn.Z)(t);s||(t.parentElement.classList.add("is-filled"),i.classList.remove("hidden-widget"),i.firstElementChild.removeAttribute("disabled")),!i.nextElementSibling&&!s&&this.questions.childElementCount<10&&this.appendMoreField(),this.handleChange()},this.onDeleteClick=e=>{const t=e.target,i=(0,ye.Z)(t,"LABEL"),s=(0,Ie.Z)(i);this.correctAnswers&&this.correctAnswers[0][0]===s&&(this.correctAnswers=void 0),i.remove(),this.optionInputFields.splice(s,1),this.optionInputFields.forEach(((e,t)=>{e.options.labelOptions.length=0,e.options.labelOptions.push(t+1),L.ZP.weakMap.get(e.label.firstElementChild).update()})),this.handleChange()},this.construct()}construct(){return un(this,void 0,void 0,(function*(){if(this.questionInputField=new E.ZP({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 ln({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 e=document.createElement("hr"),t=document.createElement("div");t.classList.add("caption"),(0,L.$d)(t,"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 s=document.createElement("div");s.classList.add("caption"),(0,L.$d)(s,"Settings"),(yield this.chat.managers.appPeersManager.isBroadcast(this.chat.peerId))||(this.anonymousCheckboxField=new zt.Z({text:"NewPoll.Anonymous",name:"anonymous"}),this.anonymousCheckboxField.input.checked=!0,i.append(this.anonymousCheckboxField.label)),this.multipleCheckboxField=new zt.Z({text:"NewPoll.MultipleChoice",name:"multiple"}),this.quizCheckboxField=new zt.Z({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("")),n.forEach((t=>t.classList.toggle("hide",!e))),this.multipleCheckboxField.input.toggleAttribute("disabled",e),this.handleChange()})),i.append(this.multipleCheckboxField.label,this.quizCheckboxField.label);const n=[],a=document.createElement("div");a.classList.add("caption"),(0,L.$d)(a,"AccDescrQuizExplanation");const o=document.createElement("hr"),r=document.createElement("div");r.classList.add("poll-create-questions"),this.quizSolutionField=new E.ZP({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"),(0,L.$d)(d,"AddAnExplanationInfo"),r.append(this.quizSolutionField.container,d),n.push(o,a,r),n.forEach((e=>e.classList.add("hide"))),this.body.parentElement.insertBefore(e,this.body),this.body.append(t,this.questions,document.createElement("hr"),s,i,...n),(0,C.fc)(this.btnConfirm,this.onSubmitClick,{listenerSetter:this.listenerSetter}),this.scrollable=new T.ZP(this.body),this.appendMoreField(),this.onEscape=()=>!this.getFilledAnswers().length,this.handleChange()}))}getFilledAnswers(){return Array.from(this.questions.children).map(((e,t)=>{const i=e.querySelector(".input-field-input");return i instanceof HTMLInputElement?i.value:(0,hn.Z)(i,!1,!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 i=this.getFilledAnswers();if(i.length<2)return!1;if(i.find((e=>e.length>100)))return!1;const{value:s}=(0,hn.Z)(this.quizSolutionField.input,!1,!1);return!(s.length>200)}handleChange(){const e=this.validate();this.btnConfirm.toggleAttribute("disabled",!e)}send(e=!1){return un(this,void 0,void 0,(function*(){const t=this.questionInputField.value,i=this.getFilledAnswers(),{value:s,entities:n}=(0,hn.Z)(this.quizSolutionField.input,!0,!1);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:i.map(((e,t)=>({_:"pollAnswer",text:e,option:new Uint8Array([t])}))),id:void 0},r=yield this.chat.managers.appPollsManager.getInputMediaPoll(o,this.correctAnswers,s,n);this.chat.managers.appMessagesManager.sendOther(this.chat.peerId,r,Object.assign({},this.chat.getMessageSendingParams())),"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,i=new E.ZP({placeholder:"NewPoll.OptionsAddOption",label:"NewPoll.OptionLabel",labelOptions:[t],name:"question-"+e,maxLength:100});this.listenerSetter.add(i.input)("input",this.onInput);const s=new Fi.Z({text:"",name:"question"});s.main.append(i.container),(0,C.fc)(i.input,Ce.Z,{listenerSetter:this.listenerSetter}),s.label.classList.add("hidden-widget"),s.input.disabled=!0,this.quizCheckboxField.input.checked||s.label.classList.remove("radio-field"),this.listenerSetter.add(s.input)("change",(()=>{if(s.input.checked){const e=(0,Ie.Z)(s.label);this.correctAnswers=[new Uint8Array([e])],this.handleChange()}}));const n=document.createElement("span");n.classList.add("btn-icon","tgico-close"),i.container.append(n),(0,C.fc)(n,this.onDeleteClick,{listenerSetter:this.listenerSetter,once:!0}),this.questions.append(s.label),this.scrollable.scrollIntoViewNew({element:this.questions.lastElementChild,position:"center"}),this.optionInputFields.push(i)}}var fn=i(7814);function mn(e){let t,i;return e instanceof HTMLVideoElement?(t=e.videoWidth,i=e.videoHeight):(t=e.naturalWidth,i=e.naturalHeight),(0,fn.Z)({media:e,mediaSize:(0,qe.C)(t,i),boxSize:(0,qe.C)(320,240),quality:.9})}var gn=i(9897),vn=i(2341);function bn(e){const t=e.src;return fetch(t).then((e=>e.arrayBuffer())).then((e=>{const t=new Uint8Array(e);let i=0;for(let e=0,s=t.length;e${Pn.Z})|(
)`,"g");class Tn extends E.ZP{constructor(e){super(e),this.input.addEventListener("input",(()=>{this.updateInnerHTML(),this.onFakeInput()})),e.placeholder&&(0,L.$d)(this.inputFake,e.placeholder,void 0,"placeholder"),this.input.classList.add("scrollable","scrollable-y","no-scrollbar"),this.inputFake=document.createElement("div"),this.inputFake.contentEditable="true",this.inputFake.tabIndex=-1,this.inputFake.className=this.input.className+" input-field-input-fake"}onFakeInput(e=!0){var t;const{scrollHeight:i}=this.inputFake,s=+this.input.style.height.replace("px","");if(s===i)return;const n=Math.round(50*Math.log(Math.abs(i-s)));this.input.style.transitionDuration=`${n}ms`,e&&(null===(t=this.onChangeHeight)||void 0===t||t.call(this,i),this.input.style.height=i?i+"px":"");const a="is-changing-height";(0,Fe.Z)({element:this.input,className:a,forwards:!0,duration:n,onTransitionEnd:()=>{this.input.classList.remove(a)}})}updateInnerHTML(e=this.input.innerHTML){e=e.replace(//,"").replace(/().+?\/custom-emoji-element>/g,"$1"),Mn.Y&&(e=e.replace(Zn,"")),this.inputFake.innerHTML=e}setValueSilently(e,t){super.setValueSilently(e,t),this.updateInnerHTML(),t||this.onFakeInput()}}var kn=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};let xn;function An(){return xn}class _n extends S.Z{constructor(e,t,i,s){super("popup-send-photo popup-new-media",{closable:!0,withConfirm:"Modal.Send",confirmShortcutIsSendShortcut:!0,body:!0,title:!0,scrollable:!0}),this.chat=e,this.files=t,this.ignoreInputValue=s,this.onScroll=()=>{const{input:e}=this.messageInputField;this.scrollable.onAdditionalScroll(),e.scrollTop>0&&e.scrollHeight>130&&this.scrollable.container.classList.remove("scrolled-bottom")},this.onKeyDown=e=>{const t=e.target,{input:i}=this.messageInputField;if(t!==i){if("INPUT"===t.tagName||t.isContentEditable)return;i.focus(),(0,Nt.Z)(i)}},this.attachFile=e=>{const t=this.willAttach,i=this.shouldCompress(e.type),s=document.createElement("div");s.classList.add("popup-item");const n={file:e};(0,Ln.Z)(n,["scaledBlob","middlewareHelper","itemDiv","mediaSpoiler"]),n.middlewareHelper=this.middlewareHelper.get().create(),n.itemDiv=s;const a=i?this.attachMedia(n):this.attachDocument(n);return t.sendFileDetails.push(n),a.catch((e=>{s.style.backgroundColor="#000",console.error("error rendering file",e)}))},this.animationGroup="",this.construct(i)}construct(e){return kn(this,void 0,void 0,(function*(){this.willAttach={type:e,sendFileDetails:[],group:!0};const t=yield this.managers.apiManager.getLimit("caption");this.captionLengthMax=t,(0,C.fc)(this.btnConfirm,(()=>this.send()),{listenerSetter:this.listenerSetter});const i=yield(0,In.Z)({listenerSetter:this.listenerSetter,direction:"bottom-left",buttons:[{icon:"image",text:"Popup.Attach.AsMedia",onClick:()=>this.changeType("media"),verify:()=>this.hasAnyMedia()&&"document"===this.willAttach.type},{icon:"document",text:"SendAsFile",onClick:()=>this.changeType("document"),verify:()=>1===this.files.length&&"document"!==this.willAttach.type},{icon:"document",text:"SendAsFiles",onClick:()=>this.changeType("document"),verify:()=>this.files.length>1&&"document"!==this.willAttach.type},{icon:"groupmedia",text:"Popup.Attach.GroupMedia",onClick:()=>this.changeGroup(!0),verify:()=>!this.willAttach.group&&this.canGroupSomething()},{icon:"groupmediaoff",text:"Popup.Attach.UngroupMedia",onClick:()=>this.changeGroup(!1),verify:()=>this.willAttach.group&&this.canGroupSomething()},{icon:"mediaspoiler",text:"EnablePhotoSpoiler",onClick:()=>this.changeSpoilers(!0),verify:()=>this.canToggleSpoilers(!0,!0)},{icon:"mediaspoiler",text:"Popup.Attach.EnableSpoilers",onClick:()=>this.changeSpoilers(!0),verify:()=>this.canToggleSpoilers(!0,!1)},{icon:"mediaspoileroff",text:"DisablePhotoSpoiler",onClick:()=>this.changeSpoilers(!1),verify:()=>this.canToggleSpoilers(!1,!0)},{icon:"mediaspoileroff",text:"Popup.Attach.RemoveSpoilers",onClick:()=>this.changeSpoilers(!1),verify:()=>this.canToggleSpoilers(!1,!1)}]});this.header.append(i),this.btnConfirm.remove(),this.mediaContainer=document.createElement("div"),this.mediaContainer.classList.add("popup-photo"),this.scrollable.container.append(this.mediaContainer);const s=this.inputContainer=document.createElement("div");s.classList.add("popup-input-container");const n=document.createElement("div");let a,o,r;if(n.classList.add("popup-input-inputs","input-message-container"),this.messageInputField=new Tn({placeholder:"PreviewSender.CaptionPlaceholder",name:"message",withLinebreaks:!0,maxLength:this.captionLengthMax}),this.listenerSetter.add(this.scrollable.container)("scroll",this.onScroll),this.listenerSetter.add(this.messageInputField.input)("scroll",this.onScroll),this.messageInputField.input.classList.replace("input-field-input","input-message-input"),this.messageInputField.inputFake.classList.replace("input-field-input","input-message-input"),n.append(this.messageInputField.input,this.messageInputField.inputFake),s.append(n,this.btnConfirm),this.ignoreInputValue||(this.messageInputField.value=this.wasInputValue=this.chat.input.messageInputField.input.innerHTML,this.chat.input.messageInputField.value=""),this.container.append(s),this.attachFiles(),this.addEventListener("close",(()=>{this.files.length=0,this.willAttach.sendFileDetails.length=0,xn===this&&(xn=void 0)})),(0,Cn.Z)({buttons:[{icon:"mediaspoiler",text:"EnablePhotoSpoiler",onClick:()=>{this.applyMediaSpoiler(r)},verify:()=>o&&!r.mediaSpoiler},{icon:"mediaspoileroff",text:"DisablePhotoSpoiler",onClick:()=>{this.removeMediaSpoiler(r)},verify:()=>!(!o||!r.mediaSpoiler)}],listenTo:this.mediaContainer,listenerSetter:this.listenerSetter,findElement:e=>(a=(0,be.Z)(e.target,"popup-item"),o=a.classList.contains("popup-item-media"),r=this.willAttach.sendFileDetails.find((e=>e.itemDiv===a)),a)}),"scheduled"!==this.chat.type){const e=new ln({onSilentClick:()=>{this.chat.input.sendSilent=!0,this.send()},onScheduleClick:()=>{this.chat.input.scheduleSending((()=>{this.send()}))},openSide:"top-left",onContextElement:this.btnConfirm,listenerSetter:this.listenerSetter});e.setPeerId(this.chat.peerId),this.container.append(e.sendMenu)}xn=this}))}applyMediaSpoiler(e,t){return kn(this,void 0,void 0,(function*(){const i=e.middlewareHelper.get(),{width:s,height:n}=e.itemDiv.style;let a,o;if(e.itemDiv.classList.contains("album-item")){const{width:t,height:i}=e.itemDiv.parentElement.style,r=parseInt(t),d=parseInt(i);a=+s.slice(0,-1)/100*r,o=+n.slice(0,-1)/100*d}else a=parseInt(s),o=parseInt(n);const{url:r}=yield(0,fn.Z)({media:e.itemDiv.firstElementChild,boxSize:(0,qe.C)(40,40),mediaSize:(0,qe.C)(a,o),toDataURL:!0,quality:.2}),d=(0,En.o)(r),l={_:"photoStrippedSize",bytes:d,type:"i"};e.strippedBytes=d;const c={_:"photo",sizes:[l],id:0,access_hash:0,date:0,dc_id:0,file_reference:[],pFlags:{}},h=yield(0,$i.ZP)({middleware:i,width:a,height:o,animationGroup:this.animationGroup,media:c});i()&&(t||h.classList.add("is-revealing"),e.mediaSpoiler=h,e.itemDiv.append(h),yield(0,fe.d1)(),i()&&(0,$i.MR)({mediaSpoiler:h,reveal:!1}))}))}removeMediaSpoiler(e){(0,$i.MR)({mediaSpoiler:e.mediaSpoiler,reveal:!0,destroyAfter:!0}),e.mediaSpoiler=void 0}appendDrops(e){this.body.append(e)}get type(){return this.willAttach.type}set type(e){this.willAttach.type=e}partition(){const[e,t]=v(this.willAttach.sendFileDetails,(e=>vn.Z.has(e.file.type)));return{media:e,files:t}}mediaCount(){return this.partition().media.length}hasAnyMedia(){return this.mediaCount()>0}canGroupSomething(){const{media:e,files:t}=this.partition();return e.length>1||t.length>1}canToggleSpoilers(e,t){let i="media"===this.willAttach.type&&this.hasAnyMedia();if(t&&i&&(i=1===this.files.length),i){const s=this.willAttach.sendFileDetails.filter((e=>vn.Z.has(e.file.type))),n=s.filter((e=>e.mediaSpoiler));i=!!t||s.length>1,i&&(i=e?s.length!==n.length:s.length===n.length)}return i}changeType(e){this.willAttach.type=e,this.attachFiles()}changeGroup(e){this.willAttach.group=e,this.attachFiles()}changeSpoilers(e){this.partition().media.forEach((t=>{e&&!t.mediaSpoiler?this.applyMediaSpoiler(t):!e&&t.mediaSpoiler&&this.removeMediaSpoiler(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.messageInputField.value;if(t.length>this.captionLengthMax)return void(0,we.Am)(L.ZP.format("Error.PreviewSender.CaptionTooLong",!0));const i=this.willAttach;i.isMedia="media"===i.type||void 0;const{sendFileDetails:s,isMedia:n}=i,{peerId:a,input:o}=this.chat,{length:r}=s,d=this.chat.getMessageSendingParams();this.iterate((e=>{t&&e.length!==r&&(this.managers.appMessagesManager.sendText(a,t,Object.assign(Object.assign({},d),{clearDraft:!0})),t=void 0);const s=e.map((e=>Object.assign(Object.assign({},e),{file:e.scaledBlob||e.file,spoiler:!!e.mediaSpoiler}))),o=Object.assign(Object.assign({},i),{sendFileDetails:s});this.managers.appMessagesManager.sendAlbum(a,Object.assign(Object.assign(Object.assign({},d),{caption:t,isMedia:n,clearDraft:!0}),o)),t=void 0})),o.replyToMsgId=this.chat.threadId,o.onMessageSent(),this.wasInputValue=void 0,this.hide()}modifyMimeTypeForTelegram(e){return"image/webp"===e?"image/jpeg":e}scaleImageForTelegram(e,t,i){return kn(this,void 0,void 0,(function*(){const s=2560;let n,a=e.src;if("image/gif"!==t&&(Math.max(e.naturalWidth,e.naturalHeight)>s||i&&"image/webp"===t)){const{blob:i}=yield(0,fn.Z)({media:e,boxSize:(0,qe.C)(s,s),mediaSize:(0,qe.C)(e.naturalWidth,e.naturalHeight),mimeType:this.modifyMimeTypeForTelegram(t)});n=i,URL.revokeObjectURL(a),a=yield Sn.Z.invoke("createObjectURL",i),yield(0,Ot.cj)(e,a)}return n&&{url:a,blob:n}}))}attachMedia(e){return kn(this,void 0,void 0,(function*(){const{itemDiv:t}=e;t.classList.add("popup-item-media");const i=e.file;if(i.type.startsWith("video/")){const s=(0,yn.Z)();let n;s.src=e.objectURL=yield Sn.Z.invoke("createObjectURL",i),s.autoplay=!0,s.controls=!1,s.muted=!0,s.addEventListener("timeupdate",(()=>{s.pause()}),{once:!0}),t.append(s);try{yield(0,wn.Z)(s)}catch(e){n=e}if(e.width=s.videoWidth,e.height=s.videoHeight,e.duration=Math.floor(s.duration),n)throw n;const a=s.webkitAudioDecodedByteCount;void 0!==a&&(e.noSound=!a);const o=yield function(e){return new Promise(((t,i)=>{e.onseeked=()=>{e.onseeked=()=>{mn(e).then(t),e.onseeked=void 0},e.currentTime=0},e.onerror=i,e.currentTime=Math.min(e.duration,1)}))}(s);e.thumb=Object.assign({url:yield Sn.Z.invoke("createObjectURL",o.blob)},o)}else{const s=new Image;t.append(s);const n=e.objectURL=yield Sn.Z.invoke("createObjectURL",i);yield(0,Ot.cj)(s,n);const a=e.file.type,o=yield this.scaleImageForTelegram(s,a,!0);if(o&&(e.objectURL=o.url,e.scaledBlob=o.blob),e.width=s.naturalWidth,e.height=s.naturalHeight,"image/gif"===i.type)return e.noSound=!0,Promise.all([bn(s).then((t=>{e.duration=Math.ceil(t)})),mn(s).then((t=>kn(this,void 0,void 0,(function*(){e.thumb=Object.assign({url:yield Sn.Z.invoke("createObjectURL",t.blob)},t)}))))]).then((()=>{}))}}))}attachDocument(e){return kn(this,void 0,void 0,(function*(){const{itemDiv:t}=e;t.classList.add("popup-item-document");const i=e.file,s=i.type.startsWith("image/"),n=i.type.startsWith("audio/");let a;if((s||n||i.size<2e7)&&(e.objectURL||(e.objectURL=yield Sn.Z.invoke("createObjectURL",i))),s){a=new Image,yield(0,Ot.cj)(a,e.objectURL);const t=yield this.scaleImageForTelegram(a,e.file.type);t&&(e.objectURL=t.url)}const o={_:"document",file:i,file_name:i.name||"",size:i.size,type:s?"photo":"doc"};let r;e.objectURL&&(r={url:e.objectURL,downloaded:i.size,type:m.Pt});const d=yield(0,Qi.Z)({message:{_:"message",pFlags:{is_outgoing:!0},mid:0,peerId:0,media:{_:"messageMediaDocument",document:o}},cacheContext:r});s&&(e.width=a.naturalWidth,e.height=a.naturalHeight),t.append(d)}))}shouldCompress(e){return"media"===this.willAttach.type&&vn.Z.has(e)}onRender(){this.element.classList.contains("active")||(this.listenerSetter.add(document.body)("keydown",this.onKeyDown),!this.ignoreInputValue&&this.addEventListener("close",(()=>{this.wasInputValue&&(this.chat.input.messageInputField.value=this.wasInputValue)})),this.show())}setTitle(){const{willAttach:e,title:t,files:i}=this;let s;const n=[];if("document"===e.type)s="PreviewSender.SendFile",n.push(i.length);else{let e=0,t=0,a=0;i.forEach((i=>{i.type.startsWith("image/")?++e:i.type.startsWith("video/")?++t:++a})),[e,t,a].filter((e=>e>0)).length>1?(s="PreviewSender.SendFile",n.push(i.length)):e?(s="PreviewSender.SendPhoto",n.push(e)):t&&(s="PreviewSender.SendVideo",n.push(t))}(0,H.Z)(t,(0,L.ag)(s,n))}appendMediaToContainer(e){if(this.shouldCompress(e.file.type)){const t=(0,gn.Z)(e.width,e.height,384,320);e.itemDiv.style.width=t.width+"px",e.itemDiv.style.height=t.height+"px"}this.mediaContainer.append(e.itemDiv)}iterate(e){const{sendFileDetails:t}=this.willAttach;if(!this.willAttach.group)return void t.forEach((t=>e([t])));const i=t.length;for(let s=0;s{e.middlewareHelper.destroy()}));const n=e.map((e=>this.attachFile(e)));Promise.all(n).then((()=>{i.replaceChildren(),e.length&&(this.setTitle(),this.iterate((e=>{const t=this.shouldCompress(e[0].file.type);if(t&&e.length>1){const t=document.createElement("div");t.classList.add("popup-item-album","popup-item"),t.append(...e.map((e=>e.itemDiv))),Wi({container:t,items:e.map((e=>({w:e.width,h:e.height}))),maxWidth:384,minWidth:100,spacing:4}),i.append(t)}else e.forEach((e=>{this.appendMediaToContainer(e)}));t&&e.forEach((e=>{const t=s.find((t=>t.file===e.file));t&&t.mediaSpoiler&&this.applyMediaSpoiler(e,!0)}))})))})).then((()=>{this.onRender(),this.onScroll()}))}}var Fn=i(6057);const Dn="keydown",Rn="active",Bn=["ArrowUp","ArrowDown"],Nn=["ArrowLeft","ArrowRight"];function On({list:e,type:t,onSelect:i,once:s,waitForKey:n}){let a=(null==n?void 0:n.length)?new Set(n):void 0;const o=new Set("xy"===t?Bn.concat(Nn):"x"===t?Nn:Bn);let r;const d=()=>r||e.querySelector("."+Rn)||e.firstElementChild,l=(e,i)=>{if(r===e)return;let s=!1;r&&(s=!0,r.classList.remove(Rn)),r=e,r&&(r.classList.add(Rn),s&&p&&i&&(0,ue.Z)({container:p,element:r,position:"center",forceDuration:100,axis:"x"===t?"x":"y"}))},c=(t,i)=>{let s;return s=i?t.nextElementSibling||e.firstElementChild:t.previousElementSibling||e.lastElementChild,s};let h;h="xy"===t?(t,i)=>"ArrowUp"===i||"ArrowDown"===i?((t,i)=>{const s=i?"nextElementSibling":"previousElementSibling",n=i?"firstElementChild":"lastElementChild",a=t.getBoundingClientRect();let o=t[s]||e[n];for(;o!==t;){const t=o.getBoundingClientRect();if(t.x===a.x&&t.y!==a.y)break;o=o[s]||e[n]}return o})(t,"ArrowDown"===i):c(t,"ArrowRight"===i):(e,t)=>c(e,"ArrowRight"===t||"ArrowDown"===t);let u=i=>{const s=i.key;if(o.has(s)){if((0,Ce.Z)(i),e.childElementCount>1){let e=d();e=h(e,s),l(e,!0)}}else("Enter"===s||"xy"!==t&&"Tab"===s)&&((0,Ce.Z)(i),g(d()))};const p=(0,be.Z)(e,"scrollable");e.classList.add("navigable-list");const f=t=>{const i=(0,Be.Z)(t.target,e);i&&l(i,!1)},m=t=>{(0,Ce.Z)(t);const i=(0,Be.Z)(t.target,e);i&&(l(i,!1),g(d()))},g=e=>{return t=this,n=void 0,o=function*(){const t=yield i(e);(void 0!==t?!t:s)&&y()},new((a=void 0)||(a=Promise))((function(e,i){function s(e){try{d(o.next(e))}catch(e){i(e)}}function r(e){try{d(o.throw(e))}catch(e){i(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof a?i:new a((function(e){e(i)}))).then(s,r)}d((o=o.apply(t,n||[])).next())}));var t,n,a,o};let v=!1;const b=()=>{v||(v=!0,document.addEventListener(Dn,u,{capture:!0,passive:!1}),e.addEventListener("mousemove",f,{passive:!0}),(0,C.fc)(e,m))},y=()=>{v&&(v=!1,document.removeEventListener(Dn,u,{capture:!0}),e.removeEventListener("mousemove",f),(0,C.EN)(e,m))},w=()=>{a||l(e.firstElementChild,!1)};if(a){const e=u;u=t=>{a.has(t.key)&&((0,Ce.Z)(t),document.removeEventListener(Dn,u,{capture:!0}),u=e,document.addEventListener(Dn,u,{capture:!0,passive:!1}),a=void 0,w())}}else w();return b(),{attach:b,detach:y,resetTarget:w}}var Un=i(6385),Hn=i(5953);class zn extends l.Z{constructor(e){super(!1),this.hidden=!0,this.onVisible=()=>{this.detach&&this.detach();const e=this.list,{attach:t,detach:i,resetTarget:s}=On({list:e,type:this.listType,onSelect:this.onSelect,once:!0,waitForKey:this.waitForKey});this.attach=t,this.detach=i,this.resetTarget=s,x.IS_MOBILE||this.navigationItem||(this.navigationItem={type:"autocomplete-helper",onPop:()=>{this.navigationItem=void 0,this.toggle(!0)},noBlurOnPop:!0},Un.Z.pushItem(this.navigationItem)),this.addEventListener("hidden",(()=>{this.resetTarget=void 0,this.attach=void 0,this.detach=void 0,e.innerHTML="",i(),this.navigationItem&&(Un.Z.removeItem(this.navigationItem),this.navigationItem=void 0)}),{once:!0})},(0,Hn.Z)(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&&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,i){if(this.init)return;if(void 0===e&&(e=this.container.classList.contains("is-visible")&&!this.container.classList.contains("backwards")),this.hidden===e)return void(e||this.dispatchEvent("visible"));this.hidden=e,e?(this.navigationItem&&(Un.Z.removeItem(this.navigationItem),this.navigationItem=void 0),!t&&this.controller&&this.controller.hideOtherHelpers(),this.detach&&this.detach()):(this.controller&&this.controller.hideOtherHelpers(this),this.dispatchEvent("visible"));const s=this.controller||e?0:2;e&&this.dispatchEvent("hiding"),(0,Fe.Z)({element:this.container,className:"is-visible",forwards:!e,duration:d.Z.settings.animationsEnabled&&!i?300:0,onTransitionEnd:()=>{this.hidden&&this.dispatchEvent("hidden")},useRafs:s})}}class jn extends zn{constructor(e,t,i,s){super({appendTo:e,controller:t,listType:"xy",onSelect:e=>{return t=this,i=void 0,n=function*(){return!(yield It.Jo.onMediaClick({target:e},!0))},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n},waitForKey:["ArrowUp","ArrowDown"]}),this.chat=i,this.managers=s,this.container.classList.add("stickers-helper"),this.addEventListener("visible",(()=>{setTimeout((()=>{this.scrollable.container.scrollTop=0}),0),d.Z.dispatchEvent("choosing_sticker",!0)})),this.addEventListener("hidden",(()=>{this.onChangeScreen&&(o.Z.removeEventListener("changeScreen",this.onChangeScreen),this.onChangeScreen=void 0,this.listenerSetter.removeAll(),this.listenerSetter=void 0),d.Z.dispatchEvent("choosing_sticker",!1)}))}checkEmoticon(e){const t=this.controller.getMiddleware();this.lazyLoadQueue&&this.lazyLoadQueue.clear(),Os(e),this.managers.appStickersManager.getStickersByEmoticon(e).then((e=>{if(!t())return;this.init&&(this.init(),this.init=null);const i=this.list.cloneNode();let s;this.lazyLoadQueue.clear(),s=e.length?new Promise((t=>{const s=[];e.forEach((e=>{i.append(this.superStickerRenderer.renderSticker(e,void 0,s))})),Promise.all(s).finally(t)})):Promise.resolve(),s.then((()=>{this.list.replaceWith(i),this.list=i,this.onChangeScreen||(this.onChangeScreen=()=>{const e=this.list.childElementCount*o.Z.active.popupSticker.width+(this.list.childElementCount-1);this.list.style.width=e+"px"},o.Z.addEventListener("changeScreen",this.onChangeScreen),this.listenerSetter=new ce.Z,(0,ji.Z)({listenTo:this.container,listenerSetter:this.listenerSetter})),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.ZP(this.container),this.lazyLoadQueue=new le.Z,this.superStickerRenderer=new Fn.vT(this.lazyLoadQueue,this.chat.animationGroup,this.managers)}}var Gn=i(2230);const Vn=()=>{const e=new Date;return e.setHours(0,0,0,0),e},Kn=()=>{const e=new Date;return e.setFullYear(e.getFullYear()+1),e.setDate(e.getDate()-1),e};class Wn extends I{constructor(e,t,i){var s;if(super((s=e).getTime()>Kn().getTime()?new Date:s,t,{noButtons:!0,noTitle:!0,closable:!0,withConfirm:!0,minDate:Vn(),maxDate:Kn(),withTime:!0,showOverflowMonths:!0,confirmShortcutIsSendShortcut:!0,title:!0}),this.element.classList.add("popup-schedule"),this.header.append(this.controlsDiv),this.title.replaceWith(this.monthTitle),this.body.append(this.btnConfirm),i){const e=(0,Ue.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Schedule.SendWhenOnline"});this.body.append(e),(0,C.fc)(e,(()=>{t(Te),this.hide()}))}}}var $n=i(8119),qn=i(8799),Qn=i(6760),Yn=i(6299),Xn=i(6039);class Jn extends zn{constructor(e,t,i,s){super({appendTo:e,controller:t,listType:"x",onSelect:e=>{i.onEmojiSelected((0,Xn.xG)(e),!0)}}),this.managers=s,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.v7(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=>{(0,Xn.IA)(e,this.list,!1,!0)}))),this.waitForKey=t?["ArrowUp","ArrowDown"]:void 0,this.toggle(!e.length)}checkQuery(e,t){const i=this.controller.getMiddleware();this.managers.appEmojiManager.getBothEmojiKeywords().then((()=>{return s=this,n=void 0,o=function*(){if(!i())return;const s=e.replace(/^:/,""),n=yield this.managers.appEmojiManager.searchEmojis(s);i()&&this.render(n,":"!==t)},new((a=void 0)||(a=Promise))((function(e,t){function i(e){try{d(o.next(e))}catch(e){t(e)}}function r(e){try{d(o.throw(e))}catch(e){t(e)}}function d(t){var s;t.done?e(t.value):(s=t.value,s instanceof a?s:new a((function(e){e(s)}))).then(i,r)}d((o=o.apply(s,n||[])).next())}));var s,n,a,o}))}}class ea extends zn{constructor(e,t,i,s){super({appendTo:e,controller:t,listType:"y",onSelect:s}),this.className=i,this.container.classList.add(ea.BASE_CLASS,i)}init(){this.list=document.createElement("div"),this.list.classList.add(ea.BASE_CLASS+"-list",this.className+"-list"),this.container.append(this.list),this.scrollable=new T.ZP(this.container),this.addEventListener("visible",(()=>{setTimeout((()=>{this.scrollable.container.scrollTop=0}),0)}))}render(e,t){if(this.init){if(!e.length)return;this.init(),this.init=null}e.length&&(this.list.innerHTML="",e.forEach((e=>{const t=ea.listElement({className:this.className,peerId:e.peerId,name:e.name,description:e.description});this.list.append(t)}))),t||this.toggle(!e.length)}static listElement(e){const t=ea.BASE_CLASS_LIST_ELEMENT;e.className+="-list-element";const i=document.createElement("div");i.classList.add(t,e.className),i.dataset.peerId=""+e.peerId;const s=new f.Z;s.classList.add("avatar-30",t+"-avatar",e.className+"-avatar"),s.updateWithOptions({isDialog:!1,peerId:e.peerId});const n=document.createElement("div");if(n.classList.add(t+"-name",e.className+"-name"),e.name?(0,F.Z)(n,(0,B.Z)(e.name)):n.append(new N.Z({peerId:e.peerId,dialog:!1,onlyFirstName:!1,plainText:!1}).element),i.append(s,n),e.description){const s=document.createElement("div");s.classList.add(t+"-description",e.className+"-description"),(0,F.Z)(s,(0,B.Z)(e.description)),i.append(s)}return i}}ea.BASE_CLASS="autocomplete-peer-helper",ea.BASE_CLASS_LIST_ELEMENT=ea.BASE_CLASS+"-list-element";var ta=i(7381);function ia(e,t,i){const s=[].concat(t.bot_info);let n;void 0!==i&&(n=new ta.Z({ignoreCase:!0}));const a=new Map;let o;if(s.forEach((t=>{t.commands&&t.commands.forEach((({command:i,description:s},o)=>{const r="/"+i;a.set(i,{peerId:t.user_id?t.user_id.toPeerId(!1):e,command:i,name:r,description:s,index:o}),n&&n.indexObject(i,r)}))})),n){const e=n.search(i);o=Array.from(e).map((e=>a.get(e)))}else o=[...a.values()];return o=o.sort(((e,t)=>a.get(e.command).index-a.get(t.command).index)),o}class sa extends ea{constructor(e,t,i,s){super(e,t,"commands-helper",(e=>{const t=e.querySelector(`.${ea.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;return i.getReadyToSend((()=>{i.messageInput.innerHTML=t,i.sendMessage(!0)}))})),this.managers=s}checkQuery(e,t){return i=this,s=void 0,a=function*(){if(!(yield this.managers.appUsersManager.isBot(t)))return!1;const i=this.controller.getMiddleware();return this.managers.appProfileManager.getProfileByPeerId(t).then((s=>{if(!i())return;const n=ia(t,s,e);this.render(n)})),!0},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}}class na{constructor(){this.helpers=new Set,this.middleware=(0,Se.k)()}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()}}var aa=i(5102),oa=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class ra extends ea{constructor(e,t,i,s){super(e,t,"mentions-helper",(e=>{const t=e.dataset.peerId.toUserId();Promise.resolve(s.appUsersManager.getUser(t)).then((e=>{let t,s="";const n=(0,aa.Z)(e);n[0]?s="@"+n[0]:(s=e.first_name||e.last_name,t={_:"messageEntityMentionName",length:s.length,offset:0,user_id:e.id}),s+=" ",i.insertAtCaret(s,t)}))})),this.managers=s}checkQuery(e,t,i){const s=e.trim();if(e.length!==s.length)return!1;const n=this.controller.getMiddleware();return this.managers.appProfileManager.getMentions(t&&t.toChatId(),s,i).then((e=>oa(this,void 0,void 0,(function*(){if(!n())return;e=e.filter((e=>e!==d.Z.myId));const t=e.map((e=>oa(this,void 0,void 0,(function*(){const t=yield this.managers.appUsersManager.getUser(e),i=(0,aa.Z)(t);return{peerId:e,description:i[0]?"@"+i[0]:void 0}}))));this.render((yield Promise.all(t)).filter(Boolean))})))),!0}}var da=i(5494),la=i(6339),ca=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class ha extends la.Z{constructor(e){super({element:document.createElement("div")}),this.onBodyTouchStart=e=>{const t=e.touches[0].target;(0,Be.Z)(t,this.element)||t===this.btnHover||((0,Ce.Z)(e),this.toggle(!1))},(0,Hn.Z)(this,e),this.element.classList.add(ha.BASE_CLASS),this.element.style.display="none",this.scrollable=new T.ZP,this.element.append(this.scrollable.container),this.attachButtonListener(this.btnHover,this.listenerSetter),this.listenerSetter.add(d.Z)("history_reply_markup",(({peerId:e})=>ca(this,void 0,void 0,(function*(){this.peerId===e&&(this.checkAvailability()&&this.isActive()&&(yield this.render()),(0,pe.e9)().then((()=>{this.checkForceReply()})))}))))}init(){return this.appendTo.append(this.element),this.listenerSetter.add(this)("open",(()=>ca(this,void 0,void 0,(function*(){yield this.render(),c.Z&&(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}))})))),(0,C.fc)(this.element,(e=>{const t=(0,be.Z)(e.target,"btn");if(!t)return;const i=t.dataset.type,{peerId:s}=this;"keyboardButtonRequestPhone"===i?(0,vi.Z)({titleLangKey:"ShareYouPhoneNumberTitle",button:{langKey:"OK"},descriptionLangKey:"AreYouSureShareMyContactInfoBot"}).then((()=>{this.managers.appMessagesManager.sendContact(s,d.Z.myId)})):this.managers.appMessagesManager.sendText(s,t.dataset.text),this.toggle(!1)}),{listenerSetter:this.listenerSetter}),super.init()}checkForceReply(){return ca(this,void 0,void 0,(function*(){const e=yield this.getReplyMarkup();"replyKeyboardForceReply"!==e._||e.pFlags.hidden||e.pFlags.used||(e.pFlags.used=!0,this.chatInput.initMessageReply(e.mid))}))}getReplyMarkup(){var e;return ca(this,void 0,void 0,(function*(){return null!==(e=(yield this.managers.appMessagesManager.getHistoryStorageTransferable(this.peerId)).replyMarkup)&&void 0!==e?e:{_:"replyKeyboardHide",pFlags:{}}}))}render(e){return ca(this,void 0,void 0,(function*(){void 0===e&&(e=yield this.getReplyMarkup()),this.scrollable.container.replaceChildren();for(const t of e.rows){const e=document.createElement("div");e.classList.add(ha.BASE_CLASS+"-row");for(const i of t.buttons){const t=document.createElement("button");t.classList.add(ha.BASE_CLASS+"-button","btn"),(0,F.Z)(t,(0,B.Z)(i.text)),t.dataset.text=i.text,t.dataset.type=i._,e.append(t)}this.scrollable.container.append(e)}}))}checkAvailability(e){var t;return ca(this,void 0,void 0,(function*(){void 0===e&&(e=yield this.getReplyMarkup());const i="replyKeyboardHide"===e._||!(null===(t=e.rows)||void 0===t?void 0:t.length);return this.btnHover.classList.toggle("hide",i),i&&this.toggle(!1),!i}))}setPeer(e){this.peerId=e,this.checkAvailability(),this.checkForceReply()}}ha.BASE_CLASS="reply-keyboard";var ua=i(1080),pa=i(8678),fa=i(2830),ma=i(515);const ga="INLINE-HELPER";class va extends zn{constructor(e,t,i,s){super({appendTo:e,controller:t,listType:"xy",waitForKey:["ArrowUp","ArrowDown"],onSelect:e=>{if(!e)return!1;const{peerId:t,botId:i,queryId:s}=this.list.dataset;return this.chat.input.getReadyToSend((()=>{const n=(0,ma.Z)(s,e.dataset.resultId);this.managers.appInlineBotsManager.sendInlineResult(t.toPeerId(),i,n,Object.assign(Object.assign({},this.chat.getMessageSendingParams()),{clearDraft:!0})),this.chat.input.onMessageSent(!0,!0)}))}}),this.chat=i,this.managers=s,this._checkQuery=(e,t,i)=>{return s=this,n=void 0,r=function*(){const s=this.controller.getMiddleware(),n=yield this.managers.appUsersManager.resolveUsername(t);if(!s())throw"PEER_CHANGED";if("user"!==n._||!n.pFlags.bot)throw"NOT_A_BOT";const a=this.managers.appInlineBotsManager.getInlineResults(e,n.id,i).then((t=>{if(!s())throw"PEER_CHANGED";this.init&&(this.init(),this.init=null);const i=this.list.cloneNode();i.dataset.peerId=""+e,i.dataset.botId=""+n.id,i.dataset.queryId=""+t.query_id;const a=new ua.Z(null,ga,this.scrollable,!1);this.lazyLoadQueue.clear(),this.superStickerRenderer.clear();const r=[],d=!!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=d?void 0:document.createElement("div");if(n&&(n.classList.add("inline-helper-result-preview"),t.append(n)),i.append(t),d)t.classList.add("grid-item");else{n.classList.add("empty"),(0,F.Z)(n,(0,B.Z)([...e.title.trim()][0]));const s=document.createElement("div");s.classList.add("inline-helper-result-title"),(0,F.Z)(s,(0,B.Z)(e.title));const a=document.createElement("div");a.classList.add("inline-helper-result-description"),(0,F.Z)(a,(0,ft.ZP)(e.description,{noCommands:!0,noLinks:!0})),t.append(s,a);const o=document.createElement("div");o.classList.add("inline-helper-separator"),i.append(o)}if("botInlineResult"===e._){if(e.thumb&&0===e.thumb.mime_type.indexOf("image/")){let i;n?(i=document.createElement("div"),n.append(i)):i=t,i.classList.add("media-container"),d&&i.classList.add("no-border-radius"),this.lazyLoadQueue.push({div:t,load:()=>Ds.Z.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"),(0,pa.Z)(e).then((e=>{(0,fa.Z)(i,t,e,!0)}))}))})}}else{const i=e.document||e.photo;if(["sticker","gif"].includes(null==i?void 0:i.type)&&d)(0,Pe.Z)(i),"gif"===i.type?a.add(i,t):"sticker"===i.type&&(t.classList.add("super-sticker"),this.superStickerRenderer.renderSticker(i,t,r),i.animated&&this.superStickerRenderer.observeAnimated(t));else if(i){const e=d?48:void 0;d&&t.classList.add("no-border-radius"),(0,K.Z)({photo:i,container:d?t:n,boxWidth:e,boxHeight:e,middleware:s,lazyLoadQueue:this.lazyLoadQueue,loadPromises:r})}}}return Promise.all(r).then((()=>{if(!s())return void a.clear();i.classList.toggle("is-gallery",d),i.classList.toggle("super-stickers",d),this.container.classList.toggle("is-gallery",d);const r=this.list.parentElement;if(r.textContent="",t.switch_pm){const i=(0,Ue.Z)("btn-primary btn-secondary btn-primary-transparent primary");(0,F.Z)(i,(0,B.Z)(t.switch_pm.text)),(0,C.fc)(i,(i=>{this.chat.appImManager.setInnerPeer({peerId:e}),this.managers.appInlineBotsManager.switchToPM(e,n.id,t.switch_pm.start_param)})),r.append(i)}r.append(this.list=i),this.gifsMasonry&&this.gifsMasonry.detach(),this.gifsMasonry=a,a.attach(),this.onChangeScreen||(this.onChangeScreen=()=>{if(this.list.classList.contains("is-gallery")){const e=this.list.childElementCount*o.Z.active.popupSticker.width+(this.list.childElementCount-1);this.list.style.width=e+"px"}else this.list.style.width=""},o.Z.addEventListener("changeScreen",this.onChangeScreen)),this.onChangeScreen(),this.toggle(!t.results.length&&!t.switch_pm),this.scrollable.scrollTop=0}))}));return{user:n,renderPromise:a}},new((a=void 0)||(a=Promise))((function(e,t){function i(e){try{d(r.next(e))}catch(e){t(e)}}function o(e){try{d(r.throw(e))}catch(e){t(e)}}function d(t){var s;t.done?e(t.value):(s=t.value,s instanceof a?s:new a((function(e){e(s)}))).then(i,o)}d((r=r.apply(s,n||[])).next())}));var s,n,a,r},this.container.classList.add("inline-helper"),this.addEventListener("visible",(()=>{setTimeout((()=>{this.scrollable.container.scrollTop=0}),0)})),this.checkQuery=(0,Ze.Z)(this._checkQuery,200,!0,!0),this.addEventListener("hidden",(()=>{this.onChangeScreen&&(o.Z.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.ZP(this.container),this.lazyLoadQueue=new le.Z,this.superStickerRenderer=new Fn.vT(this.lazyLoadQueue,ga,this.managers)}}var ba=i(8090),ya=i(3013),wa=i(5133);class Sa extends ea{constructor(e,t,i){super(e,void 0,"bot-commands",(e=>{const i=e.querySelector(`.${ea.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;return t.getReadyToSend((()=>{t.messageInput.innerHTML=i,t.sendMessage(!0),this.toggle(!0)}))})),this.managers=i}setUserId(e,t){var i;if(this.userId!==e||!(null===(i=this.list)||void 0===i?void 0:i.childElementCount))return this.userId=e,(0,Ke.Z)(this.managers.appProfileManager.getProfile(e),(i=>{if(!t())return;const s=ia(e.toPeerId(!1),i),n=50*s.length+8+24;this.container.style.setProperty("--height",n+"px"),this.render(s)}));this.toggle(!1)}}var Ca=i(8479),La=(i(1544),i(7197)),Ea=i(6241),Ia=i(6535),Ma=i(2821),Pa=i(3066);function Za(e){return t=this,i=void 0,n=function*(){return{cached:e.cached,result:e.cached?yield e.result:e.result}},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}function Ta(e){return e.then(Za)}var ka=i(177),xa=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Aa{constructor(e,t,i){this.managers=e,this.onReady=t,this.onChange=i,this.middleware=(0,Se.k)(),this.listenerSetter=new ce.Z,this.construct()}construct(){this.container=document.createElement("div"),this.container.classList.add("new-message-send-as-container"),this.closeBtn=document.createElement("div"),this.closeBtn.classList.add("new-message-send-as-close","new-message-send-as-avatar","tgico-close");const e=[{text:"SendMessageAsTitle",onClick:void 0}];let t;this.buttons=[];const i=e=>{e&&(t=this.avatar);const i=this.avatar!==t,s=!e&&i?2:0;(0,Fe.Z)({element:this.closeBtn,className:"is-visible",forwards:e,duration:300,useRafs:s}),i||(0,Fe.Z)({element:t,className:"is-visible",forwards:!e,duration:300,useRafs:s})};(0,In.Z)({buttonOptions:{noRipple:!0},listenerSetter:this.listenerSetter,container:this.container,direction:"top-right",buttons:e,onOpenBefore:()=>{i(!0)},onOpen:(t,i)=>{e[0].element.classList.add("btn-menu-item-header"),this.btnMenu=i,this.btnMenu.classList.add("scrollable","scrollable-y"),this.btnMenu.append(...this.buttons.map((e=>e.element)))},onClose:()=>{i(!1)},onCloseAfter:()=>{this.btnMenu=void 0}}),this.container.append(this.closeBtn)}updateButtons(e){var t;return xa(this,void 0,void 0,(function*(){const i=e.map(((e,t)=>xa(this,void 0,void 0,(function*(){const i=document.createElement("div"),s=document.createElement("div");return s.classList.add("btn-menu-item-subtitle"),e.isUser()?s.append((0,L.ag)("Chat.SendAs.PersonalAccount")):e===this.peerId?s.append((0,L.ag)("VoiceChat.DiscussionGroup")):s.append(yield(0,ka.Z)(e.toChatId())),i.append(new N.Z({peerId:e}).element,s),{onClick:t?()=>xa(this,void 0,void 0,(function*(){const t=this.peerId;this.changeSendAsPeerId(e);const i=this.middleware.get(),s=()=>{if(this.sendAsPeerId!==e||!i())return;const t=this.sendAsPeerIds.slice();(0,h.Z)(t,e),t.unshift(e),this.updateButtons(t)};d.Z.settings.animationsEnabled?setTimeout(s,250):s(),this.managers.appMessagesManager.saveDefaultSendAs(t,e)})):void 0,textElement:i}})))),s=yield Promise.all(i);(0,Ts.b)({buttons:s}),s.forEach(((t,i)=>{const s=e[i],n=new f.Z;n.classList.add("avatar-26","btn-menu-item-icon"),n.updateWithOptions({peerId:s}),i||n.classList.add("active"),t.element.prepend(n)})),this.buttons=s,null===(t=this.btnMenu)||void 0===t||t.append(...this.buttons.map((e=>e.element)))}))}updateAvatar(e,t){return xa(this,void 0,void 0,(function*(){const i=this.avatar;if(i&&i.peerId===e)return;i||(t=!0);const s=t?0:2,n=t?0:300,a=this.avatar=new f.Z;a.classList.add("new-message-send-as-avatar","avatar-30"),yield a.updateWithOptions({isDialog:!1,peerId:e}),(0,Fe.Z)({element:a,className:"is-visible",forwards:!0,duration:n,useRafs:s}),i&&(0,Fe.Z)({element:i,className:"is-visible",forwards:!1,duration:n,onTransitionEnd:()=>{i.remove()},useRafs:s}),this.container.append(a)}))}changeSendAsPeerId(e,t){return this.sendAsPeerId=e,this.onChange(e),this.updateAvatar(e,t)}getDefaultSendAs(){return this.managers.acknowledged.appProfileManager.getChannelFull(this.peerId.toChatId()).then((e=>({cached:e.cached,result:e.result.then((e=>e.default_send_as?(0,R.Z)(e.default_send_as):void 0))})))}updateManual(e){return xa(this,void 0,void 0,(function*(){const t=this.peerId;if(this.updatingPromise||!(yield this.managers.appPeersManager.isChannel(t)))return;const i=this.middleware.get((()=>!this.updatingPromise||this.updatingPromise===l)),{container:s}=this,n=t.toChatId(),a=(yield Ta(this.getDefaultSendAs())).result,o=e;a instanceof Promise&&(e=void 0);const r=o&&!e,l=this.updatingPromise=(0,Ke.Z)(a,(t=>xa(this,void 0,void 0,(function*(){if(!i()||void 0===t)return;if(yield this.changeSendAsPeerId(t,e),!i())return;this.managers.appChatsManager.getSendAs(n).then((e=>{if(!i())return;const s=e.filter((e=>!e.pFlags.premium_required)).map((e=>e.peer)).map((e=>(0,R.Z)(e)));this.sendAsPeerIds=s.slice(),(0,h.Z)(s,t),s.unshift(t),this.updateButtons(s)}));const a=()=>{this.onReady(s,e),this.addedListener||(this.listenerSetter.add(d.Z)("peer_full_update",(e=>{this.peerId===e&&this.update()})),this.addedListener=!0)};if(!r)return a;a()}))));return l.finally((()=>{this.updatingPromise===l&&(this.updatingPromise=void 0)})),r?void 0:l}))}update(e){return this.updateManual(e).then((e=>null==e?void 0:e()))}setPeerId(e){this.middleware.clean(),this.updatingPromise=void 0,this.peerId=e}destroy(){this.container.remove(),this.setPeerId(),this.listenerSetter.removeAll()}}var _a=i(9041);function Fa(e,t){const i={};e.forEach((e=>i[e]=0));const s=window.getSelection();let n=-1;if(!s.isCollapsed){const t=s.getRangeAt(0),a=t.commonAncestorContainer,o=a.nodeType===a.ELEMENT_NODE?a:a.parentElement,r=document.createTreeWalker(o.closest('[contenteditable="true"]'),NodeFilter.SHOW_ELEMENT|NodeFilter.SHOW_TEXT,{acceptNode:e=>t.intersectsNode(e)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT});let d;for(n=0;d=r.nextNode();){++n;for(const t of e){const e=_a.o8[t];(d.nodeType===d.ELEMENT_NODE?d:d.parentElement).closest(e.match)&&++i[t]}}}const a={};for(const s of e)a[s]=i[s]>=(t?n:1);return a}var Da=i(6034),Ra=i(8794),Ba=i(2423),Na=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Oa="Posting media content isn't allowed in this group.";class Ua{constructor(e,t,i){this.chat=e,this.appImManager=t,this.managers=i,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&&(0,Ce.Z)(e),this.recordCanceled=!0,this.recorder.stop(),dn.Z.setKeepAlive(!1)},this.onEmoticonsOpen=()=>{const e=c.Z?"flip-icon":"active";this.btnToggleEmoticons.classList.toggle(e,!0)},this.onEmoticonsClose=()=>{const e=c.Z?"flip-icon":"active";this.btnToggleEmoticons.classList.toggle(e,!1)},this.scheduleSending=(e=this.sendMessage.bind(this,!0),t=new Date)=>Na(this,void 0,void 0,(function*(){const{peerId:i}=this.chat,s=this.chat.bubbles.getMiddleware(),n=d.Z.myId!==i&&i.isUser()&&(yield this.managers.appUsersManager.isUserOnlineVisible(i));new Wn(t,(t=>{s()&&(t<=10+(Date.now()/1e3|0)&&(t=void 0),this.scheduleDate=t,e(),"scheduled"!==this.chat.type&&t&&setTimeout((()=>{s()&&(S.Z.getPopups(P.Z).forEach((e=>e.hide())),this.appImManager.openScheduled(i))}),0))}),n).show()})),this.prepareDocumentExecute=()=>(this.executedHistory.push(this.messageInput.innerHTML),()=>this.canUndoFromHTML=this.messageInput.innerHTML),this.undoRedo=(e,t,i)=>{(0,Ce.Z)(e);let s=this.messageInput.innerHTML;if(s&&s!==i){this.lockRedo=!0;let e=0;do{document.execCommand(t,!1,null);const i=this.messageInput.innerHTML;if(s===i){if(++e>2)break}else e=0;s=i}while(s!==i);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 i=e.code,s=t[i];if(!Fs(document.getSelection())&&s&&("KeyK"===i?this.appImManager.markupTooltip.showLinkEditor():this.applyMarkdown(s),(0,Ce.Z)(e)),"KeyZ"===i){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:i,entities:s,caretPos:n}=(0,hn.Z)(this.messageInputField.input),a=(0,Ma.Z)(i,s,!0),o=(0,Ea.Z)(s,(0,Ia.Z)(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)||"messageMediaWebPage"===this.editMessage.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=i.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=this.managers.appWebPagesManager.getWebPage(t).then((i=>{this.getWebPagePromise===e&&(this.getWebPagePromise=void 0),this.lastUrl===t&&("webPage"===i._?(this.setTopInfo("webpage",(()=>{}),i.site_name||i.title||"Webpage",i.description||i.url||""),delete this.noWebPage,this.willSendWebPage=i):this.willSendWebPage&&this.onHelperCancel())}))}break}else this.lastUrl&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null,this.helperType?this.helperFunc():this.clearHelper());if(i.trim()){const e=Date.now();e-this.lastTimeType>=6e3&&(this.lastTimeType=e,this.managers.appMessagesManager.setTyping(this.chat.peerId,{_:"sendMessageTypingAction"},void 0,this.chat.threadId)),this.botCommands&&this.botCommands.toggle(!0)}else this.lastTimeType&&this.managers.appMessagesManager.setTyping(this.chat.peerId,{_:"sendMessageCancelAction"},void 0,this.chat.threadId),this.appImManager.markupTooltip&&this.appImManager.markupTooltip.hide(),document.activeElement===this.messageInput&&setTimeout((()=>{document.activeElement===this.messageInput&&this.resetCurrentFontFormatting()}),0);this.botCommands&&this.updateBotCommandsToggle(),this.editMsgId||this.saveDraftDebounced(),this.checkAutocomplete(i,n,o),this.updateSendBtn()},this.onEmojiSelected=(e,t)=>{const i=e.docId?{_:"messageEntityCustomEmoji",document_id:e.docId,length:e.emoji.length,offset:0}:(0,La.Z)(e.emoji);this.insertAtCaret(e.emoji,i,t)},this.onBtnSendClick=e=>Na(this,void 0,void 0,(function*(){if((0,Ce.Z)(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{const e=this.chat.peerId.isAnyChat();if(e&&!(yield this.chat.canSend("send_media")))return void(0,we.Am)(Oa);this.chatInput.classList.add("is-locked"),(0,qn.Z)();let t=!1;if(!e){const e=yield this.managers.appProfileManager.getProfile(this.chat.peerId.toUserId());(null==e?void 0:e.pFlags.voice_messages_forbidden)&&((0,we.bC)({langPackKey:"Chat.SendVoice.PrivacyError",langPackArguments:[yield(0,Vt.Z)({peerId:this.chat.peerId})]}),t=!0)}if(t)return void this.chatInput.classList.remove("is-locked");this.recorder.start().then((()=>{this.releaseMediaPlayback=ya.Z.setSingleMedia(),this.recordCanceled=!1,this.setRecording(!0),dn.Z.setKeepAlive(!0);const e=()=>{new xs.Z("popup-cancel-record",{titleLangKey:"DiscardVoiceMessageTitle",descriptionLangKey:"DiscardVoiceMessageDescription",buttons:[{langKey:"DiscardVoiceMessageAction",callback:()=>{(0,C.tH)(this.btnCancelRecord)}},{langKey:"Continue",isCancel:!0}]}).show()};this.recordingOverlayListener=this.listenerSetter.add(document.body)("mousedown",(t=>{(0,be.Z)(t.target,"chat-input")||(0,be.Z)(t.target,"popup-cancel-record")||((0,Ce.Z)(t),e())}),{capture:!0,passive:!1}),Un.Z.pushItem(this.recordingNavigationItem={type:"voice",onPop:()=>(setTimeout((()=>{e()}),0),!1)}),this.recordStartTime=Date.now();const t=this.recorder.sourceNode,i=t.context.createAnalyser();t.connect(i),i.fftSize=32;const s=new Uint8Array(i.frequencyBinCount),n=255*s.length,a=()=>{if(!this.recording)return;i.getByteFrequencyData(s);let e=0;s.forEach((t=>{e+=t}));const t=Math.min(1,e/n+.36);this.recordRippleEl.style.transform=`scale(${t})`;const o=Date.now()-this.recordStartTime,r=o%1e3,d=(0,ts.Z)(o/1e3)+","+("00"+Math.round(r/10)).slice(-2);this.recordTimeEl.innerText=d,(0,fe.T2)(a)};a()})).catch((e=>{switch(e.name){case"NotAllowedError":(0,we.Am)("Please allow access to your microphone");break;case"NotReadableError":(0,we.Am)(e.message);break;default:console.error("Recorder start error:",e,e.name,e.message),(0,we.Am)(e.message)}this.setRecording(!1),this.chatInput.classList.remove("is-locked")}))}})),this.onHelperCancel=(e,t)=>Na(this,void 0,void 0,(function*(){var i;if(e&&(0,Ce.Z)(e),this.willSendWebPage){const e=this.lastUrl;let t=!1;if(this.helperType&&(yield 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=this.getCurrentInputAsDraft(!0);t&&delete t.pFlags.no_webpage;const s=Object.assign(Object.assign({},e),{_:"draftMessage"});if(null===(i=s.entities)||void 0===i?void 0:i.length){const e=new Set(Object.values(Ba.SC));s.entities=s.entities.slice(),(0,g.Z)(s.entities,((t,i,s)=>{e.has(t._)||s.splice(i,1)})),s.entities.length||delete s.entities}if(!(0,Da.Z)(t,s))return void new xs.Z("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((0,Ce.Z)(e),(0,be.Z)(e.target,"reply"))if("forward"===this.helperType){const{forwardElements:e}=this;e&&c.Z&&!e.container.classList.contains("active")&&Lt.Z.openBtnMenu(e.container)}else"reply"===this.helperType?this.chat.setMessageId(this.replyToMsgId):"edit"===this.helperType&&this.chat.setMessageId(this.editMsgId)},this.listenerSetter=new ce.Z}construct(){this.chatInput=document.createElement("div"),this.chatInput.classList.add("chat-input","hide"),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=Zs();this.rowsWrapper.append(e);const t=this.fakeRowsWrapper=document.createElement("div");t.classList.add("fake-wrapper","fake-rows-wrapper");const i=this.fakeSelectionWrapper=document.createElement("div");i.classList.add("fake-wrapper","fake-selection-wrapper"),this.inputContainer.append(this.rowsWrapperWrapper,t,i),this.chatInput.append(this.inputContainer),this.goDownBtn=(0,$n.Z)({icon:"arrow_down",className:"bubbles-corner-button chat-secondary-button bubbles-go-down hide"}),this.inputContainer.append(this.goDownBtn),(0,C.fc)(this.goDownBtn,(e=>{(0,Ce.Z)(e),this.chat.bubbles.onGoDownClick()}),{listenerSetter:this.listenerSetter});const s=this.controlContainer=document.createElement("div");s.classList.add("chat-input-control","chat-input-wrapper"),this.inputContainer.append(s)}constructPeerHelpers(){this.replyElements.container=document.createElement("div"),this.replyElements.container.classList.add("reply-wrapper"),this.replyElements.iconBtn=(0,Gn.Z)(""),this.replyElements.cancelBtn=(0,Gn.Z)("close reply-cancel",{noRipple:!0}),this.replyElements.container.append(this.replyElements.iconBtn,this.replyElements.cancelBtn);const e=()=>{s=!0},t=()=>{s=!1},i=this.forwardElements={};let s=!1;const n=[i.showSender={text:"Chat.Alert.Forward.Action.Show1",onClick:e,checkForClose:()=>this.canToggleHideAuthor(),checkboxField:new zt.Z({checked:!0})},i.hideSender={text:"Chat.Alert.Forward.Action.Hide1",onClick:e,checkForClose:()=>this.canToggleHideAuthor(),checkboxField:new zt.Z({checked:!1})},i.showCaption={text:"Chat.Alert.Forward.Action.ShowCaption",onClick:t,checkboxField:new zt.Z({checked:!0})},i.hideCaption={text:"Chat.Alert.Forward.Action.HideCaption",onClick:t,checkboxField:new zt.Z({checked:!1})},i.changePeer={text:"Chat.Alert.Forward.Action.Another",onClick:()=>{this.changeForwardRecipient()},icon:"replace"}],a=i.container=(0,Ts.b)({buttons:n,listenerSetter:this.listenerSetter}),o=Array.from(a.children);[{elements:o.slice(0,2),onChange:(e,t)=>{const n=!!+e;s&&(this.forwardWasDroppingAuthor=!n);const a=this.replyElements.container.querySelector(".reply-title");if(a){const e=a.firstElementChild,t=L.ZP.weakMap.get(e),s=i.showSender.checkboxField.checked?"Chat.Accessory.Forward":"Chat.Accessory.Hidden";t.key=s,t.update()}}},{elements:o.slice(2,4),onChange:e=>{const t=!!+e;let s;s=t&&void 0!==this.forwardWasDroppingAuthor?this.forwardWasDroppingAuthor?i.hideSender:i.showSender:t?i.showSender:i.hideSender,s.checkboxField.checked=!0}}].forEach((e=>{const t=(0,wa.Z)(e.elements.map((e=>({container:e,input:e.querySelector("input")}))),e.onChange),i=document.createElement("hr");t.append(i),a.append(t)})),a.append(i.changePeer.element),c.Z||(this.forwardHover=new la.Z({element:a})),i.modifyArgs=n.slice(0,-1),this.replyElements.container.append(a),i.modifyArgs.forEach(((e,t)=>{const{input:i}=e.checkboxField;i.type="radio",i.name=t<2?"author":"caption",i.value=""+ +!(t%2)})),this.newMessageWrapper=document.createElement("div"),this.newMessageWrapper.classList.add("new-message-wrapper"),this.replyInTopicOverlay=document.createElement("div"),this.replyInTopicOverlay.classList.add("reply-in-topic-overlay","hide"),this.replyInTopicOverlay.append((0,L.ag)("Chat.Input.ReplyToAnswer")),this.btnToggleEmoticons=(0,Gn.Z)("none toggle-emoticons",{noRipple:!0}),this.inputMessageContainer=document.createElement("div"),this.inputMessageContainer.classList.add("input-message-container"),this.goDownUnreadBadge=document.createElement("span"),this.goDownUnreadBadge.classList.add("badge","badge-24","badge-primary"),this.goDownBtn.append(this.goDownUnreadBadge),this.goMentionBtn=(0,$n.Z)({icon:"mention",className:"bubbles-corner-button chat-secondary-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),(0,C.fc)(this.goMentionBtn,(e=>{(0,Ce.Z)(e);const t=this.chat.bubbles.getMiddleware();this.managers.appMessagesManager.goToNextMention(this.chat.peerId,this.chat.threadId).then((e=>{t()&&e&&this.chat.setMessageId(e)}))}),{listenerSetter:this.listenerSetter}),this.btnScheduled=(0,Gn.Z)("scheduled btn-scheduled float hide",{noRipple:!0}),(0,C.fc)(this.btnScheduled,(e=>{this.appImManager.openScheduled(this.chat.peerId)}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(d.Z)("scheduled_new",(({peerId:e})=>{this.chat.peerId===e&&this.btnScheduled.classList.remove("hide")})),this.listenerSetter.add(d.Z)("scheduled_delete",(({peerId:e})=>{this.chat.peerId===e&&this.managers.appMessagesManager.getScheduledMessages(this.chat.peerId).then((e=>{this.btnScheduled.classList.toggle("hide",!e.length)}))})),this.btnToggleReplyMarkup=(0,Gn.Z)("botcom toggle-reply-markup float hide",{noRipple:!0}),this.replyKeyboard=new ha({appendTo:this.rowsWrapper,listenerSetter:this.listenerSetter,managers:this.managers,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.botCommands=new Sa(this.rowsWrapper,this,this.managers),this.botCommandsToggle=document.createElement("div"),this.botCommandsToggle.classList.add("new-message-bot-commands");const r=document.createElement("div");r.classList.add("new-message-bot-commands-icon-scale");const l=this.botCommandsIcon=document.createElement("div");l.classList.add("animated-menu-icon","animated-menu-close-icon"),r.append(l),this.botCommandsToggle.append(r),(0,C.fc)(this.botCommandsToggle,(e=>{(0,Ce.Z)(e),l.classList.contains("state-back")?(this.botCommands.toggle(!0),l.classList.remove("state-back")):(this.botCommands.setUserId(this.chat.peerId.toUserId(),this.chat.bubbles.getMiddleware()),l.classList.add("state-back"))}),{listenerSetter:this.listenerSetter}),this.botCommands.addEventListener("visible",(()=>{l.classList.add("state-back")})),this.botCommands.addEventListener("hiding",(()=>{l.classList.remove("state-back")})),this.attachMenuButtons=[{icon:"image",text:"Chat.Input.Attach.PhotoOrVideo",onClick:()=>{this.fileInput.value="";const e=[...vn.Z].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:()=>{S.Z.createPopup(pn,this.chat).show()},verify:()=>(this.chat.peerId.isAnyChat()||this.chat.isBot)&&this.chat.canSend("send_polls")}];const h=this.attachMenuButtons.slice();this.attachMenu=(0,In.Z)({buttonOptions:{noRipple:!0},listenerSetter:this.listenerSetter,direction:"top-left",buttons:this.attachMenuButtons,onOpenBefore:()=>Na(this,void 0,void 0,(function*(){const e=yield this.managers.appAttachMenuBotsManager.getAttachMenuBots(),t=h.slice(),i=e.filter((e=>!e.pFlags.inactive)).map((e=>{const t=(0,Ra.Z)(e);return{regularText:(0,B.Z)(e.short_name),onClick:()=>{this.managers.appAttachMenuBotsManager.requestWebView(Object.assign({botId:e.bot_id,peerId:this.chat.peerId},this.chat.getMessageSendingParams())).then((t=>{const i=["allow-scripts","allow-same-origin","allow-popups","allow-forms","allow-modals","allow-storage-access-by-user-activation"].join(" ");class s extends S.Z{constructor(t){super("popup-payment popup-payment-verification",{closable:!0,overlayClosable:!0,body:!0,titleRaw:e.short_name}),this.url=t,this.d()}destroy(){return this.telegramWebView.destroy(),super.destroy()}d(){const e=this.telegramWebView=new wi({url:this.url,sandbox:i});e.iframe.classList.add("payment-verification"),this.body.append(e.iframe),this.show(),e.onMount()}}new s(t.url)}))},iconDoc:null==t?void 0:t.icon,verify:()=>Na(this,void 0,void 0,(function*(){let t=!1;const i={attachMenuPeerTypeSameBotPM:()=>this.chat.peerId.toUserId()===e.bot_id,attachMenuPeerTypeBotPM:()=>this.chat.isBot,attachMenuPeerTypePM:()=>this.chat.peerId.isUser(),attachMenuPeerTypeChat:()=>this.chat.isAnyGroup,attachMenuPeerTypeBroadcast:()=>this.chat.isBroadcast};for(const s of e.peer_types){const e=i[s._];if(t=yield e(),t)break}return t}))}}));t.splice(t.length,0,...i),this.attachMenuButtons.splice(0,this.attachMenuButtons.length,...t)}))}),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.botCommandsToggle,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 na,this.stickersHelper=new jn(this.rowsWrapper,this.autocompleteHelperController,this.chat,this.managers),this.emojiHelper=new Jn(this.rowsWrapper,this.autocompleteHelperController,this,this.managers),this.commandsHelper=new sa(this.rowsWrapper,this.autocompleteHelperController,this,this.managers),this.mentionsHelper=new ra(this.rowsWrapper,this.autocompleteHelperController,this,this.managers),this.inlineHelper=new va(this.rowsWrapper,this.autocompleteHelperController,this.chat,this.managers),this.rowsWrapper.append(this.newMessageWrapper),this.btnCancelRecord=(0,Gn.Z)("binfilled btn-circle btn-record-cancel chat-secondary-button"),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=(0,Gn.Z)("none btn-circle btn-send animated-button-icon"),this.btnSend.insertAdjacentHTML("afterbegin",'\n \n \n \n \n '),this.btnSendContainer.append(this.recordRippleEl,this.btnSend),this.sendMenu=new ln({onSilentClick:()=>{this.sendSilent=!0,this.sendMessage()},onScheduleClick:()=>{this.scheduleSending(void 0)},listenerSetter:this.listenerSetter,openSide:"top-left",onContextElement:this.btnSend,onOpen:()=>!("scheduled"===this.chat.type||this.isInputEmpty()&&!Object.keys(this.forwarding).length)}),this.btnSendContainer.append(this.sendMenu.sendMenu),this.inputContainer.append(this.btnCancelRecord,this.btnSendContainer),It.ZP.attachButtonListener(this.btnToggleEmoticons,this.listenerSetter),this.listenerSetter.add(It.ZP)("open",this.onEmoticonsOpen),this.listenerSetter.add(It.ZP)("close",this.onEmoticonsClose),this.attachMessageInputField(),this.listenerSetter.add(d.Z)("settings_updated",(()=>{var e;(this.stickersHelper||this.emojiHelper)&&(this.previousQuery="",this.checkAutocomplete()),null===(e=this.messageInputField)||void 0===e||e.onFakeInput()})),this.listenerSetter.add(d.Z)("draft_updated",(({peerId:e,threadId:t,draft:i,force:s})=>{this.chat.threadId===t&&this.chat.peerId===e&&"scheduled"!==this.chat.type&&this.setDraft(i,!0,s)})),this.listenerSetter.add(this.appImManager)("peer_changing",(e=>{this.chat!==e||"chat"!==this.chat.type&&"discussion"!==this.chat.type||this.saveDraft()})),this.listenerSetter.add(this.appImManager)("chat_changing",(({from:e,to:t})=>{this.chat===e?this.autocompleteHelperController.toggleListNavigation(!1):this.chat===t&&this.autocompleteHelperController.toggleListNavigation(!0)})),this.listenerSetter.add(d.Z)("scheduled_delete",(({peerId:e,mids:t})=>{"scheduled"===this.chat.type&&this.chat.peerId===e&&t.includes(this.editMsgId)&&this.onMessageSent()})),this.listenerSetter.add(d.Z)("history_delete",(({peerId:e,msgs:t})=>{this.chat.peerId===e&&"scheduled"!==this.chat.type&&(t.has(this.editMsgId)&&this.onMessageSent(),this.replyToMsgId&&t.has(this.replyToMsgId)&&this.clearHelper("reply"))})),this.listenerSetter.add(d.Z)("dialogs_multiupdate",(e=>{!e.has(this.chat.peerId)||"chat"!==this.chat.type&&"discussion"!==this.chat.type||(this.startParam===m.gZ?this.setStartParam():this.center(!0))}));try{this.recorder=new(rn())({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=>{const t=e.target.files;t.length&&(S.Z.createPopup(_n,this.chat,Array.from(t).slice(),this.willAttachType),this.fileInput.value="")}),!1),(0,C.fc)(this.btnSend,this.onBtnSendClick,{listenerSetter:this.listenerSetter,touchMouseDown:!0}),this.recorder&&((0,C.fc)(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&&(Un.Z.removeItem(this.recordingNavigationItem),this.recordingNavigationItem=void 0),this.recordCanceled)return;const{peerId:t,threadId:i}=this.chat,s=this.replyToMsgId,n=(Date.now()-this.recordStartTime)/1e3|0,a=new Blob([e],{type:"audio/ogg"});dn.Z.decode(e,!0).then((e=>{dn.Z.setKeepAlive(!1),this.managers.appMessagesManager.sendFile(t,{file:a,isVoiceMessage:!0,isMedia:!0,duration:n,waveform:e.waveform,objectURL:e.url,replyToMsgId:s,threadId:i,clearDraft:!0}),this.onMessageSent(!1,!0)}))}),(0,C.fc)(this.replyElements.cancelBtn,this.onHelperCancel,{listenerSetter:this.listenerSetter}),(0,C.fc)(this.replyElements.container,this.onHelperClick,{listenerSetter:this.listenerSetter}),this.saveDraftDebounced=(0,Ze.Z)((()=>this.saveDraft()),2500,!1,!0),this.botStartBtn=(0,Ue.Z)("btn-primary btn-transparent text-bold chat-input-control-button"),this.botStartBtn.append((0,L.ag)("BotStart")),(0,C.fc)(this.botStartBtn,(()=>{const{startParam:e}=this;if(void 0===e)return;const t=this.toggleBotStartBtnDisability=(0,Ut.Z)([this.botStartBtn],!0),i=this.chat.peerId,s=this.chat.bubbles.getMiddleware((()=>this.chat.peerId===i&&this.startParam===e&&this.toggleBotStartBtnDisability===t));this.managers.appMessagesManager.startBot(i.toUserId(),void 0,e).then((()=>{s()&&(t(),this.toggleBotStartBtnDisability=void 0,this.setStartParam())}))}),{listenerSetter:this.listenerSetter}),this.controlContainer.append(this.botStartBtn,this.replyInTopicOverlay),this.pinnedControlBtn=(0,Ue.Z)("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 As(e,0,!0,(()=>{this.chat.appImManager.setPeer();const e=this.chat.appImManager.chat;e.topbar.pinnedMessage&&e.topbar.pinnedMessage.pinnedMessageContainer.toggle(!0)}))}))}_center(e,t){if(!e&&!this.inputContainer.classList.contains("is-centering"))return;if(e===this.fakeWrapperTo)return;const i=e||this.fakeWrapperTo,s=!!e,n=this.fakeWrapperTo;let a,o="",r="";const d=i.getBoundingClientRect(),l=this.fakeRowsWrapper.getBoundingClientRect(),c=l.width,h=d.width;if(c!==h){const e=h/c,t=(c-h)/2;if(a=d.left-l.left-t,s&&(o=`translateX(${a}px) scaleX(${e})`,e<1)){const t=16;r=t+t*(1-e)+"px"}}this.fakeWrapperTo=e;const u=t?200:0;return(0,Fe.Z)({element:this.inputContainer,className:"is-centering",forwards:s,duration:u}),(0,Fe.Z)({element:this.rowsWrapperWrapper,className:"is-centering-to-control",forwards:!!(s&&e&&e.classList.contains("chat-input-control")),duration:u}),this.rowsWrapper.style.transform=o,this.rowsWrapper.style.borderRadius=r,{transform:o,borderRadius:r,needTranslateX:n&&(e&&e.classList.contains("chat-input-control")&&n===this.fakeSelectionWrapper||n.classList.contains("chat-input-control"))?-.5*a:a,widthFrom:c,widthTo:h}}center(e=!1){return Na(this,void 0,void 0,(function*(){return this._center(yield this.getNeededFakeContainer(),e)}))}setStartParam(e){this.startParam!==e&&(this.startParam=e,this.center(!0))}isReplyInTopicOverlayNeeded(){return this.chat.isForum&&!this.chat.isForumTopic&&!this.replyToMsgId&&"chat"===this.chat.type}getNeededFakeContainer(e=this.startParam){return Na(this,void 0,void 0,(function*(){return this.chat.selection.isSelecting?this.fakeSelectionWrapper:void 0!==e||!(yield this.chat.canSend())||"pinned"===this.chat.type||(yield this.chat.isStartButtonNeeded())||this.isReplyInTopicOverlayNeeded()?this.controlContainer:void 0}))}getReadyToSend(e){return"scheduled"===this.chat.type?(this.scheduleSending(e),!0):(e(),!1)}setUnreadCount(){return Na(this,void 0,void 0,(function*(){if(!this.goDownUnreadBadge)return;const e=yield this.managers.dialogsStorage.getDialogOrTopic(this.chat.peerId,"discussion"===this.chat.type?void 0:this.chat.threadId),t=null==e?void 0:e.unread_count;if(this.goDownUnreadBadge.innerText=""+(t||""),this.goDownUnreadBadge.classList.toggle("badge-gray",yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.chat.peerId,respectType:!0,threadId:this.chat.threadId})),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)}}))}getCurrentInputAsDraft(e){const{value:t,entities:i}=(0,hn.Z)(this.messageInputField.input,!0,!1);let s;return(t.length||e||this.replyToMsgId)&&(s={_:"draftMessage",date:(0,Ht.Z)(!0),message:t,entities:i.length?i:void 0,pFlags:{no_webpage:this.noWebPage},reply_to_msg_id:this.replyToMsgId}),s}saveDraft(){if(!this.chat.peerId||this.editMsgId||"scheduled"===this.chat.type)return;const e=this.getCurrentInputAsDraft();this.managers.appDraftsManager.syncDraft(this.chat.peerId,this.chat.threadId,e)}destroy(){this.listenerSetter.removeAll()}cleanup(e=!0){this.chat.peerId||(this.chatInput.classList.add("hide"),this.goDownBtn.classList.add("hide")),(0,Qn.Z)(),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,i=!1){return Na(this,void 0,void 0,(function*(){if(!i&&!(0,cn.Z)(this.messageInput)||"scheduled"===this.chat.type)return!1;if(!e&&!(e=yield this.managers.appDraftsManager.getDraft(this.chat.peerId,this.chat.threadId)))return i&&(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((()=>{(0,fe.T2)((()=>{this.onMessageSent()}))}))),!1;const s=function(e,t,i){const s=(0,Ia.Z)(e.message),n=e.entities||[],a=(0,Ea.Z)(n.slice(),s);return(0,Pa.Z)(e.message,{entities:a,wrappingForPeerId:t,loadPromises:void 0})}(e,this.chat.peerId),n=this.getCurrentInputAsDraft();return!((0,Da.Z)(e,n)&&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(s,t,t),0))}))}createSendAs(){if(this.sendAsPeerId=void 0,"chat"===this.chat.type||"discussion"===this.chat.type){let e=!0;this.sendAs=new Aa(this.managers,((e,t)=>{let i=0;e.parentElement||(this.newMessageWrapper.prepend(e),i=2),this.updateOffset("as",!0,t,i)}),(t=>{this.sendAsPeerId=t,e?e=!1:this.getPlaceholderKey().then((e=>{this.updateMessageInputPlaceholder(e)}))}))}else this.sendAs=void 0;return this.sendAs}finishPeerChange(e){return Na(this,void 0,void 0,(function*(){const t=this.chat.peerId,{forwardElements:i,btnScheduled:s,replyKeyboard:n,sendMenu:a,goDownBtn:o,chatInput:r,botCommandsToggle:d}=this,l=this.sendAs,c=this.createSendAs(),[h,u,p,f,m,g,v,b,y]=yield Promise.all([this.managers.appPeersManager.isBroadcast(t),this.managers.appPeersManager.canPinMessage(t),this.managers.appPeersManager.isBot(t),this.chat.canSend(),this.getNeededFakeContainer(e),Ta(this.managers.acknowledged.appProfileManager.getProfileByPeerId(t)),s?Ta(this.managers.acknowledged.appMessagesManager.getScheduledMessages(t)):void 0,c?(c.setPeerId(this.chat.peerId),c.updateManual(!0)):void 0,this.filterAttachMenuButtons()]),w=this.messageInput?yield this.getPlaceholderKey():void 0;return()=>{var c;if(r.classList.remove("hide"),o.classList.toggle("is-broadcast",h),o.classList.remove("hide"),null===(c=this.messageInputField)||void 0===c||c.onFakeInput(),this.goDownUnreadBadge&&this.setUnreadCount(),"pinned"===this.chat.type&&r.classList.toggle("can-pin",u),i&&(this.forwardWasDroppingAuthor=!1,i.showCaption.checkboxField.setValueSilently(!0),i.showSender.checkboxField.setValueSilently(!0)),s&&v){s.classList.add("hide");const e=this.chat.bubbles.getMiddleware();(0,Ke.Z)(v.result,(t=>{e()&&t&&s.classList.toggle("hide",!t.length)}))}if(this.newMessageWrapper&&this.updateOffset(null,!1,!0),d&&(this.hasBotCommands=void 0,this.botCommands.toggle(!0,void 0,!0),this.updateBotCommandsToggle(!0),d.remove(),p)){const e=this.chat.bubbles.getMiddleware(),t=g.result;(0,Ke.Z)(t,(i=>{e()&&this.updateBotCommands(i,!(t instanceof Promise))}))}l&&l.destroy(),b&&b(),n&&n.setPeer(t),a&&a.setPeerId(t),this.messageInput&&(this.updateMessageInput(f,w,y),this.messageInput.dataset.peerId=""+t);let S=!1;if(this.pinnedControlBtn){const e="pinned"===this.chat.type;S||(S=e),this.pinnedControlBtn.classList.toggle("hide",!e),this.pinnedControlBtn.replaceChildren((0,L.ag)(u?"Chat.Input.UnpinAll":"Chat.Pinned.DontShow"))}{const e=this.chat.isForum&&!this.chat.isForumTopic&&"chat"===this.chat.type;S||(S=e),this.replyInTopicOverlay.classList.toggle("hide",!e)}this.botStartBtn.classList.toggle("hide",S),this.startParam=e,this._center(m,!1)}}))}updateOffset(e,t,i,s){e?this.newMessageWrapper.dataset.offset=e:delete this.newMessageWrapper.dataset.offset,(0,Fe.Z)({element:this.newMessageWrapper,className:"has-offset",forwards:t,duration:i?0:300,useRafs:s})}updateBotCommands(e,t){var i,s;this.hasBotCommands=!!(null===(s=null===(i=e.bot_info)||void 0===i?void 0:i.commands)||void 0===s?void 0:s.length),this.updateBotCommandsToggle(t)}updateBotCommandsToggle(e){const{botCommandsToggle:t,hasBotCommands:i}=this,s=!!i&&this.isInputEmpty();if(!i){if(!t.parentElement)return;t.remove()}const n=s,a=t.parentElement?0:2;t.parentElement||this.newMessageWrapper.prepend(t),this.updateOffset("commands",n,e,a)}getPlaceholderKey(){return Na(this,void 0,void 0,(function*(){const{peerId:e,threadId:t,isForum:i}=this.chat;let s;return s=t&&!i?"Comment":(yield this.managers.appPeersManager.isBroadcast(e))?"ChannelBroadcast":void 0!==this.sendAsPeerId&&this.sendAsPeerId!==d.Z.myId||(yield this.managers.appMessagesManager.isAnonymousSending(e))?"SendAnonymously":"Message",s}))}updateMessageInputPlaceholder(e){const t=L.ZP.weakMap.get(this.messageInput);t&&t.compareAndUpdate({key:e})}filterAttachMenuButtons(){if(this.attachMenuButtons)return(0,en.Z)(this.attachMenuButtons,(e=>e.verify()))}updateMessageInput(e,t,i){const{chatInput:s,attachMenu:n,messageInput:a}=this,{peerId:o,threadId:r}=this.chat;s.classList.contains("is-hidden")!==!e&&(s.classList.add("no-transition"),s.classList.toggle("is-hidden",!e),s.offsetLeft,s.classList.remove("no-transition")),this.updateMessageInputPlaceholder(t),e?(a.contentEditable="true",this.setDraft(void 0,!1),a.innerHTML||this.messageInputField.onFakeInput()):a.contentEditable="inherit",n&&(n.toggleAttribute("disabled",!i.length),n.classList.toggle("btn-disabled",!i.length)),this.updateSendBtn()}attachMessageInputField(){const e=this.messageInputField;this.messageInputField=new Tn({placeholder:"Message",name:"message",withLinebreaks:!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.attachMessageInputListeners(),ba.T&&(0,ba.Z)(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((0,Yn.Z)(e))(0,Ce.Z)(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(0,Nt.Z)(this.messageInput)})),c.Z&&(0,C.fc)(this.messageInput,(e=>{if(It.ZP.isActive())return It.ZP.toggle(!1),(0,qn.Z)(),void(0,Ce.Z)(e);this.appImManager.selectTab(Yr.CHAT)}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(this.messageInput)("input",this.onMessageInput),this.listenerSetter.add(this.messageInput)("keyup",(()=>{this.checkAutocomplete()})),this.listenerSetter.add(this.messageInput)("focusin",(()=>{"chat"!==this.chat.type&&"discussion"!==this.chat.type||!this.chat.bubbles.scrollable.loadedAll.bottom||this.managers.appMessagesManager.readAllHistory(this.chat.peerId,this.chat.threadId)}))}applyMarkdown(e,t){const i={link:t?()=>document.execCommand("createLink",!1,t):()=>document.execCommand("unlink",!1,null)},s=e=>{i[e]=()=>{const t=(n.includes(e)?n:[e]).filter((e=>l[e]));return(0,h.Z)(t,e)||t.push(e),t.length?document.execCommand("fontName",!1,"markup-"+t.join("-")):this.resetCurrentFontFormatting()}},n=["bold","italic","underline","strikethrough","spoiler"];if(n.forEach((e=>{s(e)})),s("monospace"),!i[e])return!1;const a=i[e],o=[],r=Mn.Z.getInstance().prepareApplyingMarkdown(),d=this.listenerSetter.add(this.messageInput)("input",Ce.Z,{capture:!0,passive:!1});o.push(document.execCommand("styleWithCSS",!1,"true"));const l=Fa(Object.keys(i));return l.monospace&&"link"===e&&o.push(this.resetCurrentFormatting()),o.push("function"==typeof a?a():document.execCommand(a,!1,null)),o.push(document.execCommand("styleWithCSS",!1,"false")),r(),this.appImManager.markupTooltip&&this.appImManager.markupTooltip.setActiveMarkupButton(),this.listenerSetter.remove(d),this.messageInputField.simulateInputEvent(),!0}resetCurrentFormatting(){return document.execCommand("removeFormat",!1,null)}resetCurrentFontFormatting(){return document.execCommand("fontName",!1,"Roboto")}insertAtCaret(e,t,i=!0){Mn.Z.getInstance().makeFocused(this.messageInput);const{value:s,caretPos:n,entities:a}=(0,hn.Z)(this.messageInput),o=n>=0?n:s.length,r=s.substr(0,o),d=(s.substr(o),i?r.match(Ua.AUTO_COMPLETE_REG_EXP):null),l=d?d.index+(d[0].length-d[2].length):r.length;if(r.slice(0,l),i&&-1!==n){const e=d[2],t=document.getSelection();let i=0;for(;t.toString()!==e;){if(++i>=1e4)throw new Error("lolwhat");t.modify("extend","backward","character")}}(0,E.rf)(this.messageInput,e,t?[t]:void 0,this.chat.peerId)}checkAutocomplete(e,t,i){return Na(this,void 0,void 0,(function*(){if(void 0===e){const s=(0,hn.Z)(this.messageInputField.input,!0,!0);e=s.value,t=s.caretPos,i=s.entities}if(-1===t&&(t=e.length),void 0===i){const t=(0,Ma.Z)(e,i,!0);i=(0,Ea.Z)(i,(0,Ia.Z)(t))}if(e=e.slice(0,t),this.previousQuery===e)return;this.previousQuery=e;const s=e.match(Ua.AUTO_COMPLETE_REG_EXP);let n;if(s){const t=i[0];let a=s[2];const o=a[0];if(this.stickersHelper&&d.Z.settings.stickers.suggest&&(yield 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("@"===o){const e=this.chat.threadId?(0,bt.Z)(this.chat.threadId):void 0;(yield this.mentionsHelper.checkQuery(a,this.chat.peerId.isUser()?m.NM:this.chat.peerId,e))&&(n=this.mentionsHelper)}else s[1]||"/"!==o?d.Z.settings.emoji.suggest&&(a=a.replace(/^\s*/,""),e.match(/^\s*:(.+):\s*$/)||e.match(/:[;!@#$%^&*()-=|]/)||!a||(n=this.emojiHelper,this.emojiHelper.checkQuery(a,o))):(yield this.commandsHelper.checkQuery(a,this.chat.peerId))&&(n=this.commandsHelper)}n=this.checkInlineAutocomplete(e,n),this.autocompleteHelperController.hideOtherHelpers(n)}))}checkInlineAutocomplete(e,t){let i=!1;const s=e=>{this.btnPreloader&&(0,Fe.Z)({element:this.btnPreloader,className:"show",forwards:e,duration:400})};if(!t){const n=e.match(/^@([a-zA-Z\\d_]{3,32})\s/);if(n){const a=n[1],o=e.slice(n[0].length);i=n[0].length===e.length,t=this.inlineHelper,this.btnPreloader?s(!0):(this.btnPreloader=(0,Gn.Z)("none btn-preloader float show disable-hover",{noRipple:!0}),(0,jt.y)(this.btnPreloader,!0),this.inputMessageContainer.parentElement.insertBefore(this.btnPreloader,this.inputMessageContainer.nextSibling)),this.inlineHelper.checkQuery(this.chat.peerId,a,o).then((({user:e,renderPromise:t})=>{i&&e.bot_inline_placeholder&&(this.messageInput.dataset.inlinePlaceholder=e.bot_inline_placeholder),t.then((()=>{s(!1)}))})).catch((e=>{s(!1)}))}}return i||delete this.messageInput.dataset.inlinePlaceholder,t!==this.inlineHelper&&s(!1),t}setRecording(e){this.recording!==e&&((0,Fe.Z)({element:this.chatInput,className:"is-recording",forwards:e,duration:200}),this.recording=e,this.updateSendBtn())}changeForwardRecipient(){if(this.helperWaitingForward)return;this.helperWaitingForward=!0;const e=(0,Ca.Z)(this.forwarding),t=this.helperFunc;this.clearHelper(),this.updateSendBtn();let i=!1;new M.Z(e,(()=>{i=!0})).addEventListener("close",(()=>{this.helperWaitingForward=!1,i||t()}))}clearInput(e=!0,t=!0,i=""){return Na(this,void 0,void 0,(function*(){if(document.activeElement===this.messageInput&&x.IS_MOBILE_SAFARI){const e=document.createElement("input");document.body.append(e),(0,da.Z)(e),this.messageInputField.setValueSilently(i),(0,da.Z)(this.messageInput),e.remove()}else this.messageInputField.setValueSilently(i);c.Z||(this.canRedoFromHTML="",this.undoHistory.length=0,this.executedHistory.length=0,this.canUndoFromHTML="");let s=!1;e&&(s=yield this.setDraft(void 0,!1)),!s&&t&&this.onMessageInput()}))}isInputEmpty(){return(0,cn.Z)(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&&"scheduled"!==this.chat.type),this.btnToggleReplyMarkup&&this.btnToggleReplyMarkup.classList.toggle("show",t&&"scheduled"!==this.chat.type)}getValueAndEntities(e){const{entities:t,value:i}=(0,hn.Z)(this.messageInput,!0,!1),s=(0,Ia.Z)(i);return{value:i,totalEntities:(0,Ea.Z)(t,s)}}onMessageSent(e=!0,t){"scheduled"!==this.chat.type&&this.managers.appMessagesManager.readAllHistory(this.chat.peerId,this.chat.threadId,!0),this.scheduleDate=void 0,this.sendSilent=void 0;const{totalEntities:i}=this.getValueAndEntities(this.messageInput);let s=0;i.filter((e=>{if("messageEntityEmoji"===e._||"messageEntityCustomEmoji"===e._){const t=e.offset+e.length;return!(t<=s||(s=t,0))}return!1})).forEach((e=>{const t="messageEntityEmoji"===e._?{emoji:(0,Bs.zu)(e.unicode)}:{docId:e.document_id,emoji:""};this.managers.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:i}=this;if("scheduled"===i.type&&!e&&!t)return void this.scheduleSending();const{peerId:s}=i,{noWebPage:n}=this,a=this.chat.getMessageSendingParams(),{value:o,entities:r}=(0,hn.Z)(this.messageInputField.input,!0,!1);if(t){const e=this.editMessage;if(!o.trim()&&!e.media)return void new ks.Z(s,[t],i.type);this.managers.appMessagesManager.editMessage(e,o,{entities:r,noWebPage:n}),this.onMessageSent()}else o.trim()&&(this.managers.appMessagesManager.sendText(s,o,Object.assign(Object.assign({entities:r},a),{noWebPage:n,webPage:this.getWebPagePromise?void 0:this.willSendWebPage,clearDraft:!0})),"scheduled"===this.chat.type?this.onMessageSent(!0):this.onMessageSent(!1,!1));if(this.forwarding){const e=(0,Ca.Z)(this.forwarding);for(const t in e)this.managers.appMessagesManager.forwardMessages(s,t.toPeerId(),e[t],Object.assign(Object.assign({},a),{dropAuthor:this.forwardElements&&this.forwardElements.hideSender.checkboxField.checked,dropCaptions:this.isDroppingCaptions()})).catch((e=>Na(this,void 0,void 0,(function*(){"VOICE_MESSAGES_FORBIDDEN"===e.type&&(0,we.bC)({langPackKey:"Chat.SendVoice.PrivacyError",langPackArguments:[yield(0,Vt.Z)({peerId:s})]})}))));o||this.onMessageSent()}}sendMessageWithDocument(e,t=!1,i=!1,s=!1){return Na(this,void 0,void 0,(function*(){const n="sticker"===(e=yield this.managers.appDocsManager.getDoc(e)).type?"send_stickers":"gif"===e.type?"send_gifs":"send_media";return this.chat.peerId.isAnyChat()&&!(yield this.chat.canSend(n))?((0,we.Am)(Oa),!1):"scheduled"!==this.chat.type||t?!(!e||e.sticker&&(0,zi.Z)(e)&&!d.Z.premium||(this.managers.appMessagesManager.sendFile(this.chat.peerId,Object.assign(Object.assign({},this.chat.getMessageSendingParams()),{file:e,isMedia:!0,clearDraft:i,silent:s})),this.onMessageSent(i,!0),"sticker"===e.type&&this.managers.appStickersManager.saveRecentSticker(e.id),0)):(this.scheduleSending((()=>this.sendMessageWithDocument(e,!0,i,s))),!1)}))}canToggleHideAuthor(){const{forwardElements:e}=this;if(!e)return!1;const t=e.hideCaption.checkboxField;return!t.checked||(0,ye.Z)(t.label,"FORM").classList.contains("hide")}isDroppingCaptions(){return!this.canToggleHideAuthor()}initMessageEditing(e){return Na(this,void 0,void 0,(function*(){const t=yield this.chat.getMessage(e);let i=(0,Pa.Z)(t.message,{entities:t.totalEntities,wrappingForPeerId:this.chat.peerId});const s=()=>Na(this,void 0,void 0,(function*(){const n=yield(0,V.Z)({message:t,usingMids:[t.mid]});this.setTopInfo("edit",s,(0,L.ag)("AccDescrEditing"),n,i,t),this.editMsgId=e,this.editMessage=t,i=void 0}));s()}))}initMessagesForward(e){const t=()=>Na(this,void 0,void 0,(function*(){const i=Object.keys(e).map((e=>e.toPeerId())),s=new Set;let n=0,a=0;const o=i.map((t=>Na(this,void 0,void 0,(function*(){const i=e[t],o=i.map((e=>Na(this,void 0,void 0,(function*(){var i;const n=yield this.managers.appMessagesManager.getMessageByPeer(t,e);!(null===(i=n.fwd_from)||void 0===i?void 0:i.from_name)||n.fromId||n.fwdFromId?s.add("P"+n.fromId):s.add("N"+n.fwd_from.from_name),n.media&&n.message&&++a}))));yield Promise.all(o),n+=i.length}))));yield Promise.all(o);const r=s.size>2,l=[...s].map((e=>{const t=e[0];if(e=e.slice(1),"P"===t){const t=e.toPeerId();return t===d.Z.myId?(0,L.ag)("Chat.Accessory.Forward.You"):new N.Z({peerId:t,dialog:!1,onlyFirstName:r}).element}return r?e.split(" ")[0]:e})),{forwardElements:c}=this;(0,ye.Z)(c.showCaption.checkboxField.label,"FORM").classList.toggle("hide",!a);const h=c.hideCaption.checkboxField.checked;a&&h?c.hideSender.checkboxField.setValueSilently(!0):void 0!==this.forwardWasDroppingAuthor&&(this.forwardWasDroppingAuthor?c.hideSender:c.showSender).checkboxField.setValueSilently(!0);const u=c.showSender.checkboxField.checked?"Chat.Accessory.Forward":"Chat.Accessory.Hidden",p=(0,L.ag)(u,[n]),f=document.createDocumentFragment();let m,g;if(l.length<3?f.append(...(0,L.v_)(l,!1)):f.append(l[0],(0,L.ag)("AndOther",[l.length-1])),1===i.length){const t=i[0],s=e[t];if(m=yield this.managers.appMessagesManager.getMessageByPeer(t,s[0]),g=!!m.grouped_id,g){const e=yield this.managers.appMessagesManager.getMidsByMessage(m);(e.length!==n||e.find((e=>!s.includes(e))))&&(g=!1)}}const v=document.createDocumentFragment();if(g||1===n){const t=e[i[0]],s=yield(0,V.Z)({message:m,usingMids:t});v.append(f,": ",s)}else v.append((0,L.ag)("Chat.Accessory.Forward.From"),": ",f);const b=this.setTopInfo("forward",t,p,v);c.modifyArgs.forEach(((e,t)=>{const s=e.textElement,n=L.ZP.weakMap.get(s);n.args=[t<2?i.length:a],n.update()})),this.forwardHover&&this.forwardHover.attachButtonListener(b,this.listenerSetter),this.forwarding=e}));t()}initMessageReply(e){return Na(this,void 0,void 0,(function*(){if(this.replyToMsgId===e)return;let t=yield this.chat.getMessage(e);const i=()=>{let s;t?s=new N.Z({peerId:t.fromId,dialog:!1}).element:(s=(0,L.ag)("Loading"),this.managers.appMessagesManager.reloadMessages(this.chat.peerId,e).then((s=>{this.replyToMsgId===e&&(t=s,t?i():this.clearHelper("reply"))}))),this.setTopInfo("reply",i,s,t&&t.message,void 0,t),this.setReplyToMsgId(e)};i()}))}setReplyToMsgId(e){this.replyToMsgId=e,this.center(!0)}clearHelper(e){"edit"===this.helperType&&"edit"!==e&&this.clearInput(),e&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null),"reply"!==e&&(this.setReplyToMsgId(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")&&(Un.Z.removeByType("input-helper"),this.chat.container.classList.remove("is-helper-active"),this.t())}t(){const e="is-toggling-helper";(0,Fe.Z)({element:this.chat.container,className:e,forwards:!0,duration:150,onTransitionEnd:()=>{this.chat.container.classList.remove(e)}})}setInputValue(e,t=!0,i=!0){e||(e=""),t?this.clearInput(!1,!1,e):this.messageInputField.setValueSilently(e),(0,fe.T2)((()=>{i&&(0,Nt.Z)(this.messageInput),this.onMessageInput(),this.messageInput.scrollTop=this.messageInput.scrollHeight}))}setTopInfo(e,t,i="",s="",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,d=r.classList.contains("reply");this.replyElements.iconBtn.replaceWith(this.replyElements.iconBtn=(0,Gn.Z)(("webpage"===e?"link":e)+" active reply-icon",{noRipple:!0}));const{container:l}=J(i,s,this.chat.animationGroup,a);return d?r.replaceWith(l):o.insertBefore(l,o.lastElementChild),"webpage"===e&&(l.style.cursor="default"),this.chat.container.classList.contains("is-helper-active")||(this.chat.container.classList.add("is-helper-active"),this.t()),x.IS_MOBILE||Un.Z.pushItem({type:"input-helper",onPop:()=>{this.onHelperCancel()}}),void 0!==n&&this.setInputValue(n),setTimeout((()=>{this.updateSendBtn()}),0),l}}Ua.AUTO_COMPLETE_REG_EXP=/(\s|^)((?:(?:@|^\/)\S*)|(?::|^[^:@\/])(?!.*[:@\/]).*)$/;var Ha=i(6054);const za="pinned-container";class ja{constructor(e){this.floating=!1,(0,Hn.Z)(this,e);const{divAndCaption:t,className:i}=this;t.container.classList.add(za,"hide"),t.title.classList.add(za+"-title"),t.subtitle.classList.add(za+"-subtitle"),t.content.classList.add(za+"-content"),this.btnClose=document.createElement("button"),this.btnClose.classList.add(za+"-close",`pinned-${i}-close`,"btn-icon","tgico-close"),this.wrapper=document.createElement("div"),this.wrapper.classList.add(za+"-wrapper"),(0,A.Z)(this.wrapper),this.wrapperUtils=document.createElement("div"),this.wrapperUtils.classList.add(za+"-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){(0,C.fc)(e,(e=>{(0,Ce.Z)(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 i=(this.floating||o.Z.isMobile)&&!e;this.divAndCaption.container.classList.toggle("is-floating",i),this.divAndCaption.container.classList.toggle("hide",e),this.topbar.container.classList.toggle("is-pinned-floating",i),this.topbar.container.classList.toggle(`is-pinned-${this.className}-shown`,!e),this.topbar.setFloating(),this.topbar.setUtilsWidth()}isVisible(){return!this.divAndCaption.container.classList.contains("hide")}isFloating(){return this.divAndCaption.container.classList.contains("is-floating")}fill(e,t,i){this.divAndCaption.container.dataset.peerId=""+i.peerId,this.divAndCaption.container.dataset.mid=""+i.mid,this.divAndCaption.fill(e,t,i),this.topbar.setUtilsWidth()}}var Ga,Va=i(7207),Ka=i(8427);class Wa extends ja{constructor(e,t,i){super({topbar:e,chat:t,listenerSetter:e.listenerSetter,className:"audio",divAndCaption:new G("pinned-audio",((e,t)=>{(0,H.Z)(this.divAndCaption.title,e),(0,H.Z)(this.divAndCaption.subtitle,t)})),onClose:()=>{ya.Z.stop()},floating:!0}),this.topbar=e,this.chat=t,this.managers=i,this.onPlaybackParams=e=>{this.fasterEl.classList.toggle("active",e.playbackRate>1),this.repeatEl.classList.remove("tgico-audio_repeat","tgico-audio_repeat_single"),this.repeatEl.classList.add(e.loop?"tgico-audio_repeat_single":"tgico-audio_repeat"),this.repeatEl.classList.toggle("active",e.loop||e.round)},this.onPause=()=>{this.toggleEl.classList.remove("flip-icon")},this.onStop=()=>{this.toggle(!0)},this.onMediaPlay=({doc:e,message:t,media:i,playbackParams:s})=>{var n,a;let o,r;const d="voice"!==e.type&&"round"!==e.type;if(d){const t=e.attributes.find((e=>"documentAttributeAudio"===e._));o=(0,B.Z)(null!==(a=null==t?void 0:t.title)&&void 0!==a?a:e.file_name),r=(null==t?void 0:t.performer)?(0,B.Z)(t.performer):(0,L.ag)("AudioUnknownArtist")}else o=new N.Z({peerId:t.fromId,fromName:null===(n=t.fwd_from)||void 0===n?void 0:n.from_name}).element,r=(0,_.OD)(t.date);this.fasterEl.classList.toggle("hide",d),this.repeatEl.classList.toggle("hide",!d),this.onPlaybackParams(s),this.volumeSelector.setVolume(),this.progressLine.setMedia(i),this.fill(o,r,t),this.toggleEl.classList.toggle("flip-icon",!i.paused),this.toggle(!1)},this.divAndCaption.border.remove();const s=(0,Gn.Z)("fast_rewind active",{noRipple:!0}),n=(0,Gn.Z)("fast_forward active",{noRipple:!0}),a=(e,t)=>{(0,C.fc)(e,(e=>{(0,Ce.Z)(e),t()}),{listenerSetter:this.topbar.listenerSetter})};a(s,(()=>{ya.Z.previous()})),a(n,(()=>{ya.Z.next()})),this.toggleEl=(0,Gn.Z)("",{noRipple:!0}),this.toggleEl.classList.add("active","pinned-audio-ico","tgico"),a(this.toggleEl,(()=>{ya.Z.toggle()})),this.wrapper.prepend(this.wrapper.firstElementChild,s,this.toggleEl,n),this.volumeSelector=new Ka.Z(this.listenerSetter,!0);const o=document.createElement("div");o.classList.add("progress-line-container"),o.append(this.volumeSelector.container);const r=document.createElement("div");r.classList.add("pinned-audio-volume-tunnel"),this.volumeSelector.btn.classList.add("pinned-audio-volume","active"),this.volumeSelector.btn.prepend(r),this.volumeSelector.btn.append(o),this.repeatEl=(0,Gn.Z)("audio_repeat",{noRipple:!0}),a(this.repeatEl,(()=>{const e=ya.Z.getPlaybackParams();e.round?e.loop?(ya.Z.round=!1,ya.Z.loop=!1):ya.Z.loop=!ya.Z.loop:ya.Z.round=!0}));const d=this.fasterEl=(0,Gn.Z)("playback_2x",{noRipple:!0});a(d,(()=>{ya.Z.playbackRate=d.classList.contains("active")?1:1.75})),this.wrapperUtils.prepend(this.volumeSelector.btn,d,this.repeatEl);const l=document.createElement("div");l.classList.add("pinned-audio-progress-wrapper"),this.progressLine=new Va.Z({media:void 0,streamable:void 0,withTransition:!0,useTransform:!0}),this.progressLine.container.classList.add("pinned-audio-progress"),l.append(this.progressLine.container),this.wrapper.insertBefore(l,this.wrapperUtils),this.topbar.listenerSetter.add(ya.Z)("play",this.onMediaPlay),this.topbar.listenerSetter.add(ya.Z)("pause",this.onPause),this.topbar.listenerSetter.add(ya.Z)("stop",this.onStop),this.topbar.listenerSetter.add(ya.Z)("playbackParams",this.onPlaybackParams);const c=ya.Z.getPlayingDetails();c&&(this.onMediaPlay(c),this.onPlaybackParams(c.playbackParams))}destroy(){this.progressLine&&this.progressLine.removeListeners()}}!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"}(Ga||(Ga={}));const $a="pinned-message-border";class qa{constructor(){this.drawRect=(e,t,i,s,n)=>`M${e},${t+n}a${n},${n},0,0,1,${i},0v${s-2*n}a${n},${n},0,0,1,${-i},0Z`,this.getClipPath=(e,t,i)=>{let s="";if(2===i)s=this.drawRect(0,0,2,t,1)+this.drawRect(0,t+2,2,t,1);else for(let e=0;e{let i;return e<=1?i=Ga.ONE:2===e?i=Ga.TWO:3===e?i=Ga.THREE:4===e?i=Ga.FOUR:e>3&&(i=Ga.MORE),i},this.getMarkHeight=(e,t)=>{let i;return e<=1?i=Ga.ONE:2===e?i=Ga.TWO:3===e?i=Ga.THREE:4===e?i=Ga.FOUR:e>3&&(i=Ga.MORE),i},this.getMarkTranslateY=(e,t,i)=>1===i?0:2===i?e?t+1:0:3===i?e?1===e?t+1:2*t+2+1:0:(t+1)*e,this.getTrackTranslateY=(e,t,i,s)=>t<=4||e<=1?0:e>=t-2?s-Ga.ONE-i:(e-2)*i+1*e,this.getTrackHeight=(e,t)=>e<=3?Ga.ONE:t*e+1*(e-1)}render(e,t){if(this.border||(this.border=document.createElement("div"),this.border.classList.add($a),this.wrapper=document.createElement("div"),this.border.append(this.wrapper)),1===e)return this.count!==e&&(this.wrapper.className=$a+"-wrapper-1",this.border.classList.remove($a+"-mask"),this.wrapper.innerHTML=this.wrapper.style.cssText=""),this.border;const i=this.getBarHeight(e,t),s=this.getMarkHeight(e,t),n=this.getTrackHeight(e,i),a=`clipPath_${e}`,o=this.getClipPath(a,i,e),r=this.getMarkTranslateY(t,i,e),d=this.getTrackTranslateY(t,e,i,n);return this.border.classList.toggle($a+"-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=$a+"-wrapper",this.wrapper.style.cssText=`clip-path: url(#${a}); width: 2px; height: ${n}px; transform: translateY(-${d}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($a+"-mark")),this.svg.parentElement||this.wrapper.append(this.svg,this.mark),this.mark.style.cssText=`height: ${s}px; transform: translateY(${r}px);`,this.count=e,this.index=t,this.border}}var Qa=i(6724),Ya=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Xa{constructor(){this.rows={},this.container=document.createElement("div"),this.container.className=Xa.BASE_CLASS}getRow(e,t=!1){if(this.rows[e])return this.rows[e].element;const i=document.createElement("div"),s=!Object.keys(this.rows).length&&!t;return i.className=Xa.BASE_CLASS+"-row"+(s?"":" is-hiding hide"),this.rows[e]={element:i,new:!0},this.container.append(i),i}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)}),Xa.DURATION)}setNewRow(e,t=!1){const i=this.rows[e];i.new&&(t?(i.element.classList.remove("hide"),i.element.offsetLeft):i.element.classList.remove("is-hiding","hide"),delete i.new),this.clearRows(e)}animate(e,t,i=e>t,s=!1){if(e===t)return this.setNewRow(e);const n=this.rows[e],a=this.rows[t];if(!a&&!s)return this.setNewRow(e);const o=["from-top","from-bottom"];i||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)}}Xa.DURATION=200,Xa.BASE_CLASS="animated-super";class Ja{constructor(e=!1){this.reverse=e,this.decimals=[],this.previousNumber=0,this.container=document.createElement("div"),this.container.className=Ja.BASE_CLASS}getDecimal(e){if(this.decimals[e])return this.decimals[e];const t=document.createElement("div");t.className=Ja.BASE_CLASS+"-decimal";const i=document.createElement("div");i.className=Ja.BASE_CLASS+"-decimal-placeholder";const s=new Xa;return s.container.className=Ja.BASE_CLASS+"-decimal-wrapper",t.append(i,s.container),this.container.append(t),this.decimals[e]={container:t,placeholder:i,animatedSuper:s}}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()}))}),Xa.DURATION))}hideLeft(e){const t=(""+e).length;this.decimals.slice(t).forEach((t=>{const i=+t.placeholder.innerText||0;t.animatedSuper.getRow(Ja.EMPTY_INDEX,!0),t.animatedSuper.animate(Ja.EMPTY_INDEX,i,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(((i,s)=>{var n;const a=this.getDecimal(s),o=a.animatedSuper.getRow(i,!0),r=null!==(n=t[s])&&void 0!==n?n:Ja.EMPTY_INDEX;o.innerText=a.placeholder.innerText=""+i,a.animatedSuper.animate(i,r,this.reverse?ethis.previousNumber,!0)})),this.hideLeft(e),this.previousNumber=e}}Ja.EMPTY_INDEX=-1,Ja.BASE_CLASS="animated-counter";class eo{constructor(e,t,i){this.topbar=e,this.chat=t,this.managers=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.listenerSetter=new ce.Z,this.log=(0,r.kg)("PM"),this.debug=!0,this.isStatic=!1;const s=new X("pinned-message",t.animationGroup);this.pinnedMessageContainer=new ja({topbar:e,chat:t,listenerSetter:this.listenerSetter,className:"message",divAndCaption:s,onClose:()=>Ya(this,void 0,void 0,(function*(){return(yield i.appPeersManager.canPinMessage(this.chat.peerId))?new As(this.chat.peerId,this.pinnedMid,!0):new As(this.chat.peerId,0,!0),!1}))}),this.pinnedMessageBorder=new qa,s.border.replaceWith(this.pinnedMessageBorder.render(1,0)),this.animatedSubtitle=new Xa,s.subtitle.append(this.animatedSubtitle.container),this.animatedMedia=new Xa,this.animatedMedia.container.classList.add("pinned-message-media-container"),s.content.prepend(this.animatedMedia.container),this.animatedCounter=new Ja(!0),s.title.append((0,L.ag)("PinnedMessage")," ",this.animatedCounter.container);const n=this.pinnedMessageContainer.btnClose.cloneNode(!0);this.pinnedMessageContainer.attachOnCloseEvent(n),s.container.prepend(n),this.btnOpen=(0,Gn.Z)("pinlist pinned-container-close pinned-message-pinlist",{noRipple:!0}),this.pinnedMessageContainer.wrapperUtils.prepend(this.btnOpen),(0,C.fc)(this.btnOpen,(e=>{(0,Ce.Z)(e),this.topbar.openPinned(!0)}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(d.Z)("peer_pinned_messages",(({peerId:e})=>{e===this.chat.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(d.Z)("peer_pinned_hidden",(({peerId:e})=>{e===this.chat.peerId&&this.pinnedMessageContainer.toggle(this.hidden=!0)})),this.setPinnedMessage=(0,Ze.Z)((()=>this._setPinnedMessage()),100,!0,!0),this.setCorrectIndexThrottled=(0,Qa.Z)(this.setCorrectIndex.bind(this),100,!1),this.isStatic=!this.chat.isPinnedMessagesNeeded()}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;const t=this.chat.bubbles.getBubbleByPoint("bottom");if(!t)return;const i=t.dataset.mid;t&&void 0!==i&&this.testMid(+i,e)}testMid(e,t){if(this.isStatic)return;if(this.hidden)return;let i=this.mids.findIndex((t=>t<=e));if(-1===i||this.isNeededMore(i)){if(!(this.loadedTop&&ei))return;this.pinnedIndex=i,this.pinnedMid=this.mids.find((t=>t<=e))||this.mids[this.mids.length-1],this.setPinnedMessage()}}isNeededMore(e){return this.count>eo.LOAD_COUNT&&(!this.loadedBottom&&e<=eo.LOAD_OFFSET||!this.loadedTop&&this.count-1-e<=eo.LOAD_OFFSET)}getCurrentIndex(e,t=!0){return Ya(this,void 0,void 0,(function*(){if(!this.loading){this.loading=!0;try{const i=this.debug?this.log.bindPrefix("getCurrentIndex"):void 0;i&&i("start",e,t);let s=!1;const n=[this.managers.appMessagesManager.getSearch({peerId:this.chat.peerId,inputFilter:{_:"inputMessagesFilterPinned"},maxId:e,limit:eo.LOAD_COUNT,backLimit:eo.LOAD_COUNT,threadId:this.chat.threadId}).then((e=>(s=!0,e)))];if(!this.pinnedMaxMid){const e=this.managers.appMessagesManager.getPinnedMessage(this.chat.peerId,this.chat.threadId).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()))}));n.push(e)}const a=(yield Promise.all(n))[0];let o=a.history.findIndex((t=>t.mid<=e));-1===o&&(o=a.history.length),this.offsetIndex=a.offset_id_offset?a.offset_id_offset-o:0,this.mids=a.history.map((e=>e.mid)).slice(),this.count=a.count,this.count||this.pinnedMessageContainer.toggle(!0),this.loadedTop=this.offsetIndex+this.mids.length===this.count,this.loadedBottom=!this.offsetIndex,i&&i("result",e,a,o,this.offsetIndex,this.loadedTop,this.loadedBottom)}catch(e){this.log.error("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 ce.Z,function(e,t,i,s){if(c.Z){let t;const n={passive:!0};s.add(e)("touchstart",(i=>{i.touches.length>1?o():(t=i.touches[0].clientY,s.add(e)("touchmove",a,n),s.add(e)("touchend",o,n))}),n);const a=e=>{const s=e.touches[0].clientY,n=s{s.removeManual(e,"touchmove",a,n),s.removeManual(e,"touchend",o,n)}}else s.add(e)("wheel",(e=>{const t=e.deltaY>0;!t||i()}),{passive:!0})}(this.chat.bubbles.scrollable.container,0,(()=>{this.unsetScrollDownListener()}),this.scrollDownListenerSetter))}unsetScrollDownListener(e=!0){this.waitForScrollBottom=!1,this.scrollDownListenerSetter&&(this.scrollDownListenerSetter.removeAll(),this.scrollDownListenerSetter=null),e&&this.setCorrectIndex(0)}handleFollowingPinnedMessage(){return Ya(this,void 0,void 0,(function*(){this.locked=!0,this.debug&&this.log("handleFollowingPinnedMessage");try{this.setScrollDownListener();const e=this.chat.setPeerPromise;e instanceof Promise&&(yield e),yield(0,pe.e9)(),this.getCurrentIndexPromise&&(yield this.getCurrentIndexPromise),this.debug&&this.log("handleFollowingPinnedMessage: unlock"),this.locked=!1}catch(e){this.log.error("handleFollowingPinnedMessage error:",e),this.locked=!1,this.waitForScrollBottom=!1,this.setCorrectIndex(0)}}))}followPinnedMessage(e){return Ya(this,void 0,void 0,(function*(){(yield this.chat.getMessage(e))&&(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 Ya(this,void 0,void 0,(function*(){const e=this.count;if(e){const t=this.pinnedIndex,i=yield this.chat.getMessage(this.pinnedMid),s=0===t;this.animatedCounter.container.classList.toggle("is-last",s),s||this.animatedCounter.setCount(e-t),this.pinnedMessageContainer.toggle(!1);const n=t>this.wasPinnedIndex;this.debug&&this.log("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=[],d=yield Y({title:void 0,titleEl:null,subtitle:i.message,subtitleEl:a,message:i,mediaEl:o,loadPromises:r,animationGroup:this.chat.animationGroup});yield Promise.all(r),this.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-media",d),this.animatedSubtitle.animate(t,this.wasPinnedIndex),d?(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=""+i.mid}else this.pinnedMessageContainer.toggle(!0),this.wasPinnedIndex=0;this.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-many",this.count>1)}))}}eo.LOAD_COUNT=50,eo.LOAD_OFFSET=5;var to=i(6194),io=i(2995),so=i(4240),no=i(6818),ao=i(3897),oo=i(7120),ro=i(2059),lo=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class co{constructor(e,t,i){this.chat=e,this.appSidebarRight=t,this.managers=i,this.verifyButtons=e=>{const t=!!e||!(!this.btnMore||!this.btnMore.classList.contains("menu-open"));e&&(0,Ce.Z)(e),(()=>{lo(this,void 0,void 0,(function*(){const e=this.buttonsToVerify.concat(t?this.menuButtons:[]);(yield Promise.all(e.map((e=>lo(this,void 0,void 0,(function*(){return{result:yield e.verify(),button:e}})))))).forEach((({button:e,result:t})=>{e.element.classList.toggle("hide",!t)}))}))})()},this.verifyVideoChatButton=e=>lo(this,void 0,void 0,(function*(){var t;if(!no.Z||this.peerId.isUser()||"chat"!==this.chat.type||this.chat.threadId)return!1;const i=ro.ZP.groupCall,s=this.peerId.toChatId();if((null==i?void 0:i.chatId)===s)return!1;if(e&&((yield this.managers.appPeersManager.isBroadcast(this.peerId))&&"group"===e||(yield this.managers.appPeersManager.isAnyGroup(this.peerId))&&"broadcast"===e))return!1;const n=yield this.managers.appChatsManager.getChat(s);return(null===(t=n.pFlags)||void 0===t?void 0:t.call_active)||(0,oo.Z)(n,"manage_call")})),this.verifyCallButton=e=>lo(this,void 0,void 0,(function*(){if(!Oe.Z||!this.peerId.isUser())return!1;const t=this.peerId.toUserId(),i=yield this.managers.appProfileManager.getCachedFullUser(t);return!!i&&!!("voice"===e?i.pFlags.phone_calls_available:i.pFlags.video_calls_available)})),this.onJoinGroupCallClick=()=>{this.chat.appImManager.joinGroupCall(this.peerId)},this.onMuteClick=()=>{new ao.Z(this.peerId)},this.onResize=()=>{this.setUtilsWidth(!0),this.setFloating()},this.onChangeScreen=(e,t)=>{this.container.classList.toggle("is-pinned-floating",o.Z.isMobile),this.pinnedMessage&&this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-floating",t===o._.mobile),this.onResize()},this.setUtilsWidth=(e=!1)=>{this.setUtilsRAF&&window.cancelAnimationFrame(this.setUtilsRAF),x.IS_SAFARI&&e&&this.chatUtils.classList.add("hide"),this.setUtilsRAF=window.requestAnimationFrame((()=>{x.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=()=>{var e;const t=[this.chatAudio,null===(e=this.pinnedMessage)||void 0===e?void 0:e.pinnedMessageContainer].filter(Boolean).reduce(((e,t)=>{const i=t.isFloating();return this.container.classList.toggle(`is-pinned-${t.className}-floating`,i),t.isVisible()?e+ +i:e}),0);this.container.dataset.floating=""+t},this.setPeerStatusManual=(e=!1)=>lo(this,void 0,void 0,(function*(){if(!this.subtitle||"chat"!==this.chat.type)return;if(this.chat.threadId){const e=yield(0,Vt.Z)({peerId:this.peerId,dialog:!0}),t=(0,L.ag)("TopicProfileStatus",[e]);return()=>(0,H.Z)(this.subtitle,t)}const t=this.peerId;return this.chat.appImManager.setPeerStatus({peerId:t,element:this.subtitle,needClear:e,useWhitespace:!1,middleware:()=>t===this.peerId})})),this.setPeerStatus=e=>this.setPeerStatusManual(e).then((e=>{null==e||e()})),this.listenerSetter=new ce.Z,this.menuButtons=[],this.buttonsToVerify=[]}construct(){this.container=document.createElement("div"),this.container.classList.add("sidebar-header","topbar","hide"),this.container.dataset.floating="0",this.btnBack=(0,Gn.Z)("left sidebar-close-button",{noRipple:!0}),this.btnBackBadge=document.createElement("span"),this.btnBackBadge.classList.add("badge","badge-20","badge-primary","back-unread-badge"),this.btnBack.append(this.btnBackBadge),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=this.person=document.createElement("div");e.classList.add("person");const t=document.createElement("div");t.classList.add("content");const i=document.createElement("div");i.classList.add("top"),this.title=document.createElement("div"),this.title.classList.add("user-title"),i.append(this.title);const s=document.createElement("div");s.classList.add("bottom"),this.subtitle&&s.append(this.subtitle),t.append(i,s),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 Wa(this,this.chat,this.managers),this.menuButtons.length&&(this.btnMore=(0,In.Z)({listenerSetter:this.listenerSetter,direction:"bottom-left",buttons:this.menuButtons,onOpen:(e,t)=>lo(this,void 0,void 0,(function*(){const e=this.menuButtons[this.menuButtons.length-1];if(null==e?void 0:e.element){const t=yield this.managers.appPeersManager.getDeleteButtonText(this.peerId);e.element.lastChild.replaceWith((0,L.ag)(t))}}))})),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(o.Z)("changeScreen",this.onChangeScreen),(0,C.fc)(this.container,(e=>{const t=(0,be.Z)(e.target,"pinned-container");if((0,qn.Z)(),t){if((0,Ce.Z)(e),(0,be.Z)(e.target,"progress-line")||(0,be.Z)(e.target,"pinned-container-wrapper-utils"))return;const i=+t.dataset.mid;if(t.classList.contains("pinned-message"))this.pinnedMessage.followPinnedMessage(i);else{const e=t.dataset.peerId.toPeerId(),s=ya.Z.getSearchContext();this.chat.appImManager.setInnerPeer({peerId:e,lastMsgId:i,type:s.isScheduled?"scheduled":s.threadId?"discussion":void 0,threadId:s.threadId})}}else o.Z.activeScreen===o._.medium&&document.body.classList.contains(n.ir)?r():(0,ye.Z)(e.target,"AVATAR-ELEMENT")?this.appSidebarRight.toggleSidebar(!document.body.classList.contains(a.HQ)):this.appSidebarRight.toggleSidebar(!0)}),{listenerSetter:this.listenerSetter});const r=e=>{if(e&&(0,Ce.Z)(e),o.Z.activeScreen===o._.medium&&document.body.classList.contains(n.ir))this.chat.appImManager.setPeer({peerId:this.peerId});else{const e=0===this.chat.appImManager.chats.indexOf(this.chat);Un.Z.back(e?"im":"chat")}};(0,C.fc)(this.btnBack,r,{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:()=>o.Z.isMobile},{icon:"mute",text:"ChatList.Context.Mute",onClick:this.onMuteClick,verify:()=>lo(this,void 0,void 0,(function*(){return"chat"===this.chat.type&&d.Z.myId!==this.peerId&&!(yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.peerId,respectType:!1,threadId:this.chat.threadId}))}))},{icon:"unmute",text:"ChatList.Context.Unmute",onClick:()=>{this.managers.appMessagesManager.togglePeerMute({peerId:this.peerId,threadId:this.chat.threadId})},verify:()=>lo(this,void 0,void 0,(function*(){return"chat"===this.chat.type&&d.Z.myId!==this.peerId&&(yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.peerId,respectType:!1,threadId:this.chat.threadId}))}))},{icon:"comments",text:"ViewDiscussion",onClick:()=>{const e=this.chat.bubbles.getMiddleware();Promise.resolve(this.managers.appProfileManager.getChannelFull(this.peerId.toChatId())).then((t=>{e()&&t.linked_chat_id&&this.chat.appImManager.setInnerPeer({peerId:t.linked_chat_id.toPeerId(!0)})}))},verify:()=>lo(this,void 0,void 0,(function*(){const e=yield this.managers.appProfileManager.getCachedFullChat(this.peerId.toChatId());return"chat"===this.chat.type&&!!(null==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),Sn.Z.getState().then((t=>{if(t.chatContextMenuHintWasShown)return;const i=e.toggleByElement.bind(e);e.toggleByElement=t=>lo(this,void 0,void 0,(function*(){this.managers.appStateManager.pushToState("chatContextMenuHintWasShown",!0),(0,we.Am)((0,L.ag)("Chat.Menu.Hint")),e.toggleByElement=i,e.toggleByElement(t)}))}))},verify:()=>!this.chat.selection.isSelecting&&!!this.chat.bubbles.getRenderedLength()},{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(so.Z)){const e=this.appSidebarRight.createTab(so.Z);e.peerId=this.peerId,e.open(),this.appSidebarRight.toggleSidebar(!0)}},verify:()=>lo(this,void 0,void 0,(function*(){return this.peerId.isUser()&&!(yield this.managers.appPeersManager.isContact(this.peerId))}))},{icon:"forward",text:"ShareContact",onClick:()=>{const e=this.peerId;new io.Z({peerTypes:["dialogs","contacts"],onSelect:t=>new Promise(((i,s)=>{new xs.Z("",{titleLangKey:"SendMessageTitle",descriptionLangKey:"SendContactToGroupText",descriptionLangArgs:[new N.Z({peerId:t,dialog:!0}).element],buttons:[{langKey:"Send",callback:()=>{i(),this.managers.appMessagesManager.sendContact(t,e),this.chat.appImManager.setInnerPeer({peerId:t})}},{langKey:"Cancel",callback:()=>{s()},isCancel:!0}],peerId:t,overlayClosable:!0}).show()})),placeholder:"ShareModal.Search.Placeholder",chatRightsAction:"send_messages",selfPresence:"ChatYourSelf"})},verify:()=>lo(this,void 0,void 0,(function*(){return d.Z.myId!==this.peerId&&this.peerId.isUser()&&(yield this.managers.appPeersManager.isContact(this.peerId))&&!!(yield this.managers.appUsersManager.getUser(this.peerId.toUserId())).phone}))},{icon:"bots",text:"Settings",onClick:()=>{this.managers.appMessagesManager.sendText(this.peerId,"/settings")},verify:()=>lo(this,void 0,void 0,(function*(){var e;try{const t=yield this.managers.appAttachMenuBotsManager.getAttachMenuBot(this.peerId.toUserId());return!!(null===(e=null==t?void 0:t.pFlags)||void 0===e?void 0:e.has_settings)}catch(e){return!1}}))},{icon:"lock",text:"BlockUser",onClick:()=>{new xs.Z("",{peerId:this.peerId,titleLangKey:"BlockUser",descriptionLangKey:"AreYouSureBlockContact2",descriptionLangArgs:[new N.Z({peerId:this.peerId}).element],buttons:[{langKey:"BlockUser",isDanger:!0,callback:()=>{this.managers.appUsersManager.toggleBlock(this.peerId,!0).then((e=>{e&&(0,we.bC)({langPackKey:"UserBlocked"})}))}}]}).show()},verify:()=>lo(this,void 0,void 0,(function*(){var e;if(!this.peerId.isUser())return!1;const t=yield this.managers.appProfileManager.getCachedFullUser(this.peerId.toUserId());return this.peerId!==d.Z.myId&&t&&!(null===(e=t.pFlags)||void 0===e?void 0:e.blocked)}))},{icon:"lockoff",text:"Unblock",onClick:()=>{this.managers.appUsersManager.toggleBlock(this.peerId,!1).then((e=>{e&&(0,we.bC)({langPackKey:"UserUnblocked"})}))},verify:()=>lo(this,void 0,void 0,(function*(){var e;const t=yield this.managers.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 to.Z(this.peerId)},verify:()=>lo(this,void 0,void 0,(function*(){return"chat"===this.chat.type&&!!(yield this.managers.appMessagesManager.getDialogOnly(this.peerId))}))}],this.btnSearch=(0,Gn.Z)("search"),this.attachClickEvent(this.btnSearch,(e=>{this.chat.initSearch()}),!0)}attachClickEvent(e,t,i){(0,C.fc)(e,(e=>{(0,Ce.Z)(e),!i&&(0,qn.Z)(),t(e)}),{listenerSetter:this.listenerSetter})}onCallClick(e){this.chat.appImManager.callUser(this.peerId.toUserId(),e)}constructAvatar(){const e=new f.Z;return e.isDialog=!0,e.classList.add("avatar-42","person-avatar"),e}get peerId(){return this.chat.peerId}constructPeerHelpers(){return this.avatarElement=this.constructAvatar(),this.subtitle=document.createElement("div"),this.subtitle.classList.add("info"),this.pinnedMessage=new eo(this,this.chat,this.managers),this.btnJoin=(0,Ue.Z)("btn-primary btn-color-primary chat-join hide"),this.btnCall=(0,Gn.Z)("phone"),this.btnGroupCall=(0,Gn.Z)("videochat"),this.btnPinned=(0,Gn.Z)("pinlist"),this.btnMute=(0,Gn.Z)("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.onMuteClick),this.attachClickEvent(this.btnJoin,(()=>lo(this,void 0,void 0,(function*(){const e=this.chat.bubbles.getMiddleware();this.btnJoin.setAttribute("disabled","true");const t=this.peerId.toChatId();let i;i=(yield this.managers.appChatsManager.isChannel(t))?this.managers.appChatsManager.joinChannel(t):this.managers.appChatsManager.addChatUser(t,d.Z.myId),i.finally((()=>{e()&&this.btnJoin.removeAttribute("disabled")}))})))),this.listenerSetter.add(d.Z)("folder_unread",(e=>{if(e.id!==m.J$)return;const t=e.unreadUnmutedPeerIds.size;this.btnBackBadge.textContent=t?""+(0,D.Z)(t,1):""})),this.listenerSetter.add(d.Z)("chat_update",(e=>lo(this,void 0,void 0,(function*(){var t;if(this.peerId===e.toPeerId(!0)){const i=yield this.managers.appChatsManager.getChat(e);this.btnJoin.classList.toggle("hide",!(null===(t=null==i?void 0:i.pFlags)||void 0===t?void 0:t.left)),this.setUtilsWidth(),this.verifyButtons()}})))),this.listenerSetter.add(d.Z)("dialog_notify_settings",(e=>{e.peerId===this.peerId&&this.setMutedState()})),this.listenerSetter.add(d.Z)("peer_typings",(({peerId:e})=>{this.peerId===e&&this.setPeerStatus()})),this.listenerSetter.add(d.Z)("user_update",(e=>{this.peerId===e.toPeerId()&&this.setPeerStatus()})),this.listenerSetter.add(d.Z)("peer_full_update",(e=>{this.peerId===e&&this.verifyButtons()})),this.chat.addEventListener("setPeer",((e,t)=>{const i=this.chat.bubbles.getMiddleware();Sn.Z.getState().then((s=>{i()&&this.pinnedMessage&&(this.pinnedMessage.hidden=!!s.hiddenPinnedMessages[this.chat.peerId],t?(this.pinnedMessage.unsetScrollDownListener(),this.pinnedMessage.testMid(e,0)):this.pinnedMessage.locked||(this.pinnedMessage.handleFollowingPinnedMessage(),this.pinnedMessage.testMid(e)))}))})),this.listenerSetter.add(d.Z)("peer_pinned_messages",(({peerId:e,mids:t})=>{"pinned"===this.chat.type&&e===this.peerId&&t&&this.setTitle()})),this.setPeerStatusInterval=window.setInterval(this.setPeerStatus,6e4),this}openPinned(e){this.chat.appImManager.setInnerPeer({peerId:this.peerId,lastMsgId:e?+this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.dataset.mid:0,type:"pinned"})}destroy(){var e,t;this.listenerSetter.removeAll(),window.clearInterval(this.setPeerStatusInterval),null===(e=this.pinnedMessage)||void 0===e||e.destroy(),null===(t=this.chatAudio)||void 0===t||t.destroy(),delete this.chatAudio,delete this.pinnedMessage}cleanup(){this.chat.peerId||this.container.classList.add("hide")}finishPeerChange(e){var t;return lo(this,void 0,void 0,(function*(){const{peerId:e,threadId:i}=this.chat;let s;"chat"===this.chat.type&&(s=(null===(t=this.avatarElement)||void 0===t?void 0:t.peerId)!==this.peerId||this.avatarElement.threadId!==this.chat.threadId?this.constructAvatar():this.avatarElement);const[n,a,o,r,d,l,c]=yield Promise.all([this.managers.appPeersManager.isBroadcast(e),this.managers.appPeersManager.isAnyChat(e),e.isAnyChat()?this.managers.appChatsManager.getChat(e.toChatId()):void 0,s?s.updateWithOptions({peerId:e,threadId:i,wrapOptions:{customEmojiSize:(0,qe.C)(32,32)}}):void 0,this.setTitleManual(),this.setPeerStatusManual(!0),Sn.Z.getState()]);return()=>{var t,i;const r=!("pinned"===this.chat.type||"scheduled"===this.chat.type);this.btnMute&&this.btnMute.classList.toggle("hide",!n||!r),this.btnJoin&&(a&&!this.chat.isRestricted&&r?((0,H.Z)(this.btnJoin,(0,L.ag)(n?"Chat.Subscribe":"ChannelJoin")),this.btnJoin.classList.toggle("hide",!(null===(t=null==o?void 0:o.pFlags)||void 0===t?void 0:t.left))):this.btnJoin.classList.add("hide")),this.btnSearch&&this.btnSearch.classList.toggle("hide",!r),this.btnPinned&&this.btnPinned.classList.toggle("hide",!r),this.avatarElement!==s&&(s&&(this.avatarElement?this.avatarElement.replaceWith(s):this.person.prepend(s)),null===(i=this.avatarElement)||void 0===i||i.remove(),this.avatarElement=s),this.setUtilsWidth(),this.verifyButtons(),this.btnMore&&this.btnMore.classList.toggle("hide",!r);const h=this.chat.isPinnedMessagesNeeded();if(h||"discussion"===this.chat.type){if(this.chat.wasAlreadyUsed||!this.pinnedMessage){const e=new eo(this,this.chat,this.managers);this.pinnedMessage?(this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.replaceWith(e.pinnedMessageContainer.divAndCaption.container),this.pinnedMessage.destroy()):this.chatUtils.prepend(this.pinnedMessage.pinnedMessageContainer.divAndCaption.container),this.pinnedMessage=e}h?this.pinnedMessage.hidden=!!c.hiddenPinnedMessages[e]:"discussion"===this.chat.type&&(this.pinnedMessage.pinnedMid=this.chat.threadId,this.pinnedMessage.count=1,this.pinnedMessage.pinnedIndex=0,this.pinnedMessage._setPinnedMessage())}else this.pinnedMessage&&(this.pinnedMessage.destroy(),this.pinnedMessage=void 0);d(),null==l||l(),this.subtitle.classList.toggle("hide",!l),this.setMutedState(),this.container.classList.remove("hide")}}))}setTitleManual(e){return lo(this,void 0,void 0,(function*(){const{peerId:t,threadId:i}=this.chat,s=()=>this.chat.bubbles.getMiddleware();let n;if("pinned"===this.chat.type)n=void 0===e?(0,L.ag)("Loading"):(0,L.ag)("PinnedMessagesCount",[e]),void 0===e&&this.managers.appMessagesManager.getSearchCounters(t,[{_:"inputMessagesFilterPinned"}],!1).then((e=>{if(!s())return;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)}}));else if("scheduled"===this.chat.type)n=(0,L.ag)(t===d.Z.myId?"Reminders":"ScheduledMessages");else if("discussion"===this.chat.type){if(void 0===e){const n=yield this.managers.acknowledged.appMessagesManager.getHistory(t,0,1,0,i);if(!s())return;if(n.cached){const t=yield n.result;if(!s())return;e=t.count}else n.result.then((e=>{s()&&this.setTitle(e.count)}))}n=void 0===e?(0,L.ag)("Loading"):(0,L.ag)("Chat.Title.Comments",[e])}else if("chat"===this.chat.type&&([n]=yield Promise.all([(0,Vt.Z)({peerId:t,dialog:!0,withIcons:!i,threadId:i})]),!s()))return;return()=>{(0,H.Z)(this.title,n)}}))}setTitle(e){this.setTitleManual(e).then((e=>e()))}setMutedState(){return lo(this,void 0,void 0,(function*(){if(!this.btnMute)return;const e=this.peerId,t=yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:e,respectType:!1,threadId:this.chat.threadId});(yield this.managers.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"}))}}var ho=i(5884),uo=i(3607);class po extends Xi._{constructor(){super(...arguments),this.threadId=0,this.query=""}onOpenAfterTimeout(){this.appSearch.beginSearch(this.peerId,this.threadId,this.query)}init(e,t,i,s){this.container.id="search-private-container",this.container.classList.add("chatlist-container"),this.inputSearch=new uo.Z("Search"),this.title.replaceWith(this.inputSearch.container),this.btnPickDate=(0,Gn.Z)("calendar sidebar-header-right"),this.header.append(this.btnPickDate);const n=document.createElement("div");n.classList.add("chatlist-container"),this.scrollable.container.replaceWith(n),this.appSearch=new ho.Z(n,this.inputSearch,{messages:new ho.z("Chat.Search.PrivateSearch","messages")}),this.peerId?this.appSearch.beginSearch(this.peerId,this.threadId,s):(this.query=s,this.peerId=e,this.threadId=t,this.onDatePick=i,this.btnPickDate.classList.toggle("hide",!this.onDatePick),this.onDatePick&&(0,C.fc)(this.btnPickDate,(()=>{S.Z.createPopup(I,new Date,this.onDatePick).show()})),s&&this.appSearch.searchInput.inputField.setValueSilently(s),a.ZP.toggleSidebar(!0))}}class fo{constructor(e,t,i){this.topbar=e,this.chat=t,this.foundCount=0,this.selectedIndex=0,this.onDateClick=e=>{(0,Ce.Z)(e),S.Z.createPopup(I,new Date,this.chat.bubbles.onDatePick).show()},this.onResultsClick=e=>{const t=(0,ye.Z)(e.target,Ji.DIALOG_LIST_ELEMENT_TAG);t&&this.selectResult(t)},this.onFooterClick=e=>{this.foundCount&&(this.chat.bubbles.container.classList.toggle("search-results-active"),this.results.classList.toggle("active"))},this.onUpClick=e=>{(0,Ce.Z)(e),this.selectResult(this.searchGroup.list.children[this.selectedIndex+1])},this.onDownClick=e=>{(0,Ce.Z)(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"),(0,A.Z)(this.backBtn);const s=this.listenerSetter=new ce.Z,n=(e,t)=>{(0,C.fc)(e,t,{listenerSetter:s})};n(this.backBtn,(()=>{this.destroy()})),this.inputSearch=new uo.Z("Search"),this.results=document.createElement("div"),this.results.classList.add("chat-search-results","chatlist-container"),this.searchGroup=new ho.z(!1,"messages",void 0,"",!1),n(this.searchGroup.list,this.onResultsClick),this.appSearch=new ho.Z(this.results,this.inputSearch,{messages:this.searchGroup},(e=>{this.foundCount=e,this.foundCount?this.selectResult(this.searchGroup.list.children[0]):((0,H.Z)(this.foundCountEl,this.inputSearch.value?(0,L.ag)("NoResult"):""),this.results.classList.remove("active"),this.chat.bubbles.container.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.container.append(this.results),this.footer=document.createElement("div"),this.footer.classList.add("chat-search-footer"),n(this.footer,this.onFooterClick),(0,A.Z)(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(),i&&this.setQuery(i),x.IS_MOBILE_SAFARI||(this.navigationItem={type:"mobile-search",onPop:()=>{this.destroy()}},Un.Z.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.container.classList.remove("search-results-active"),this.chat.search=void 0,Un.Z.removeItem(this.navigationItem)}setQuery(e){this.inputSearch.inputField.value=e}selectResult(e){if(this.setPeerPromise)return this.setPeerPromise;const t=e.dataset.peerId.toPeerId(),i=+e.dataset.mid||void 0,s=(0,Ie.Z)(e);s===this.foundCount-1?this.upBtn.setAttribute("disabled","true"):this.upBtn.removeAttribute("disabled"),s?this.downBtn.removeAttribute("disabled"):this.downBtn.setAttribute("disabled","true"),this.results.classList.remove("active"),this.chat.bubbles.container.classList.remove("search-results-active");const n=this.chat.setPeer({peerId:t,lastMsgId:i});this.setPeerPromise=(n instanceof Promise?n:Promise.resolve(n)).then((()=>{this.selectedIndex=s,(0,H.Z)(this.foundCountEl,(0,L.ag)("Of",[s+1,this.foundCount]));const e=this.searchGroup.list.childElementCount;this.selectedIndex>=e-6&&this.appSearch.searchMore()})).finally((()=>{this.setPeerPromise=null}))}}var mo=i(1571),go=i(6848),vo=i(356);class bo{constructor(){this.canvases=new Set}static getInstance(e){let t=this.INSTANCES.find((t=>(0,go.Z)(t.options,e)));return t||(t=new bo,t.init(e),this.INSTANCES.push(t)),t}init(e){this.options=e}renderToCanvas(e){return this.renderImageFromUrl(this.options.url).then((()=>this.fillCanvas(e)))}renderImageFromUrl(e){if(this.renderImageFromUrlPromise)return this.renderImageFromUrlPromise;const t=this.image=document.createElement("img");return t.crossOrigin="anonymous",this.renderImageFromUrlPromise=(0,Ot.cj)(t,e,!1).then((()=>vo.Z?createImageBitmap(t,{resizeWidth:1440,resizeHeight:2960}).then((e=>(this.imageBitmap=e,t))):t))}cleanup(e){var t;this.canvases.delete(e),this.canvases.size||((0,h.Z)(bo.INSTANCES,this),this.objectUrl&&(null===(t=this.imageBitmap)||void 0===t||t.close(),URL.revokeObjectURL(this.objectUrl)))}fillCanvas(e){const t=e.getContext("2d"),{width:i,height:s}=e,n=this.imageBitmap||this.image;let a=n.width,o=n.height;const r=(500+xe.Z.height/2.5)*e.dpr;a*=r/o,o=r,this.options.mask?(t.fillStyle="#000",t.fillRect(0,0,i,s),t.globalCompositeOperation="destination-out"):t.globalCompositeOperation="source-over";const d=e=>{for(let s=0;s0){let e=l;do{d(e-=o)}while(e>=0)}const c=s-1;for(let e=l+o;ei.resize(e,t))))}}bo.INSTANCES=[];var yo=i(6714),wo=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class So extends l.Z{constructor(e,t){super(),this.appImManager=e,this.managers=t,this.type="chat",this.animationGroup=`chat-${Math.round(65535*Math.random())}`,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=(0,r.kg)("CHAT",r.v9.Log|r.v9.Warn|r.v9.Debug|r.v9.Error),this.log.warn("constructor"),this.peerId=m.NM,this.container.append(this.backgroundEl),this.appImManager.chatsContainer.append(this.container),this.backgroundTempId=0,this.sharedMediaTabs=[]}setBackground(e,t){var i;const s=yo.Z.getTheme().settings.wallpaper,n=(0,O.EM)(s);let a;if(n&&!s.slug&&!s.settings.intensity&&"grabbing"===document.documentElement.style.cursor&&this.gradientRenderer&&!this.patternRenderer)return this.gradientCanvas.dataset.colors=n,this.gradientRenderer.init(this.gradientCanvas),Promise.resolve();const o=++this.backgroundTempId,r=this.gradientRenderer,l=this.patternRenderer,c=(this.gradientCanvas,this.patternCanvas);this.gradientRenderer=this.patternRenderer=this.gradientCanvas=this.patternCanvas=void 0;const h=(null===(i=s.settings)||void 0===i?void 0:i.intensity)&&s.settings.intensity/100,u=!!h&&h<0;let p,f,m,g=null==a?void 0:a.firstElementChild;if(!a)if(a=document.createElement("div"),a.classList.add("chat-background-item"),e)if(h){a.classList.add("is-pattern");const t=this.appImManager.chatsContainer.getBoundingClientRect();p=this.patternRenderer=bo.getInstance({url:e,width:t.width,height:t.height,mask:u}),g=this.patternCanvas=p.createCanvas(),g.classList.add("chat-background-item-canvas","chat-background-item-pattern-canvas"),u&&a.classList.add("is-dark")}else a.classList.add("is-image");else a.classList.add("is-color");if(n){const{canvas:e,gradientRenderer:t}=mo.Z.create(n);m=this.gradientRenderer=t,f=this.gradientCanvas=e,f.classList.add("chat-background-item-canvas","chat-background-item-color-canvas"),d.Z.settings.animationsEnabled&&m.scrollAnimate(!0)}if(p){const e=u?f:g;let t=Math.abs(h)*(u?.5:1);u&&(t=Math.max(.3,t)),e.style.setProperty("--opacity-max",""+t)}const v=new Promise((i=>{const s=()=>{if(this.backgroundTempId!==o)return p&&p.cleanup(g),void(m&&m.cleanup());const e=this.backgroundEl.lastElementChild;if(e===a)return void i();const s=[f,g].filter(Boolean);s.length&&a.append(...s),this.backgroundEl.append(a),(0,Fe.Z)({element:a,className:"is-visible",forwards:!0,duration:t?0:200,onTransitionEnd:e?()=>{null==l||l.cleanup(c),null==r||r.cleanup(),e.remove()}:null,useRafs:2}),i()};p?p.renderToCanvas(g).then((()=>{this.backgroundTempId===o&&s()})):e?(0,Ot.ZP)(a,e,s):s()}));return this.setBackgroundPromise=Promise.race([(0,nt.Z)(500),v])}setType(e){this.type=e}init(){this.topbar=new co(this,a.ZP,this.managers),this.bubbles=new Ps(this,this.managers),this.input=new Ua(this,this.appImManager,this.managers),this.contextMenu=new an(this,this.managers),this.selection=new Ha.Z(this,this.bubbles,this.input,this.managers),this.topbar.constructUtils(),this.topbar.constructPeerHelpers(),this.topbar.construct(),this.input.construct(),this.bubbles.constructPeerHelpers(),this.input.constructPeerHelpers(),c.Z||this.bubbles.setReactionsHoverListeners(),this.bubbles.attachContainerListeners(),this.container.append(this.topbar.container,this.bubbles.container,this.input.chatInput),this.bubbles.listenerSetter.add(d.Z)("dialog_migrate",(({migrateFrom:e,migrateTo:t})=>{this.peerId===e&&this.setPeer({peerId:t})})),this.bubbles.listenerSetter.add(d.Z)("dialog_drop",(e=>{e.peerId!==this.peerId||"dialog"!==e._&&this.threadId!==e.id||this.appImManager.setPeer()})),this.bubbles.listenerSetter.add(d.Z)("chat_update",(e=>wo(this,void 0,void 0,(function*(){const{peerId:t}=this;if(t.isAnyChat()&&t.toChatId()===e){const e=yield this.managers.appMessagesManager.isAnonymousSending(t);t===this.peerId&&(this.isAnonymousSending=e)}}))));const e=e=>{const t=()=>{var t;null===(t=this.bubbles.observer)||void 0===t||t.toggleObservingNew(e),s.Z.toggleIntersectionGroup(this.animationGroup,e),e&&s.Z.checkAnimations(e,this.animationGroup)};e?t():setTimeout((()=>{t()}),400)};this.bubbles.listenerSetter.add(this.appImManager)("chat_changing",(({to:t})=>{e(t!==this)})),this.bubbles.listenerSetter.add(this.appImManager)("tab_changing",(t=>{e(this.appImManager.chat!==this||t!==Yr.CHAT&&o.Z.activeScreen===o._.mobile)}))}beforeDestroy(){this.bubbles.cleanup()}cleanupBackground(){++this.backgroundTempId,this.patternRenderer&&(this.patternRenderer.cleanup(this.patternCanvas),this.patternRenderer=void 0),this.gradientRenderer&&(this.gradientRenderer.cleanup(),this.gradientRenderer=void 0)}destroy(){this.destroySharedMediaTab(),this.topbar.destroy(),this.bubbles.destroy(),this.input.destroy(),this.contextMenu&&this.contextMenu.destroy(),this.selection&&this.selection.attachListeners(void 0,void 0),this.cleanupBackground(),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.topbar.cleanup(),this.selection.cleanup()}get isForumTopic(){return!(!this.isForum||!this.threadId)}onChangePeer(e,t){var i;return wo(this,void 0,void 0,(function*(){const{peerId:s,threadId:n}=this,o=a.ZP.getTab(po);null==o||o.close();const[r,d,l,c,h,u,p,f,m,g]=yield t(Promise.all([this.managers.appPeersManager.noForwards(s),this.managers.appPeersManager.isPeerRestricted(s),this._isAnyGroup(s),this.setAutoDownloadMedia(),this.managers.appPeersManager.isMegagroup(s),this.managers.appPeersManager.isBroadcast(s),this.managers.appPeersManager.isChannel(s),this.managers.appPeersManager.isBot(s),this.managers.appPeersManager.isForum(s),this.managers.appMessagesManager.isAnonymousSending(s)]));m&&n&&(yield t(this.managers.dialogsStorage.getForumTopicOrReload(s,n))),this.noForwards=r,this.isRestricted=d,this.isAnyGroup=l,this.isMegagroup=h,this.isBroadcast=u,this.isChannel=p,this.isBot=f,this.isForum=m,this.isAllMessagesForum=m&&!n,this.isAnonymousSending=g,n&&!this.isForum&&(e.type="discussion");const v=null!==(i=e.type)&&void 0!==i?i:"chat";this.setType(v),this.messagesStorageKey=`${this.peerId}_${"scheduled"===this.type?"scheduled":"history"}`,this.container.classList.toggle("no-forwards",this.noForwards),this.sharedMediaTab=a.ZP.createSharedMediaTab(),this.sharedMediaTabs.push(this.sharedMediaTab),this.sharedMediaTab.setPeer(s,n),this.input.clearHelper(),this.selection.cleanup()}))}setPeer(e){const{peerId:t,threadId:i}=e;t?this.inited||(this.init&&(this.init(),this.init=null),this.inited=!0):this.inited=void 0;const s=this.appImManager.isSamePeer(this,e);if(s){if(this.setPeerPromise)return}else this.appImManager.dispatchEvent("peer_changing",this),this.peerId=t||m.NM,this.threadId=i;if(!t)return a.ZP.toggleSidebar(!1),this.cleanup(!0),this.bubbles.setPeer({samePeer:!1,peerId:t}),this.peerId=0,this.appImManager.dispatchEvent("peer_changed",this),a.ZP.replaceSharedMediaTab(),this.destroySharedMediaTab(),void(this.sharedMediaTab=void 0);this.peerChanged=s;const n=this.bubbles.setPeer(Object.assign(Object.assign({},e),{samePeer:s})),o=this.setPeerPromise=n.then((e=>e.promise)).catch(Qe.Z).finally((()=>{this.setPeerPromise===o&&(this.setPeerPromise=null)}));return n}destroySharedMediaTab(e=this.sharedMediaTab){e&&((0,h.Z)(this.sharedMediaTabs,e),e.destroy())}setAutoDownloadMedia(){return wo(this,void 0,void 0,(function*(){this.autoDownload=yield function(e){return t=this,i=void 0,n=function*(){let t,i=0,s=0,n=0;const a=d.Z.settings,o=d.Z.managers.appPeersManager;return!a.autoDownloadNew.pFlags.disabled&&e&&(t=e.isUser()?(yield o.isContact(e))?"contacts":"private":(yield o.isBroadcast(e))?"channels":"groups",a.autoDownload.photo[t]&&(i=a.autoDownloadNew.photo_size_max),a.autoDownload.video[t]&&(s=a.autoDownloadNew.video_size_max),a.autoDownload.file[t]&&(n=a.autoDownloadNew.file_size_max)),{photo:i,video:s,file:n}},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}(this.peerId)}))}setMessageId(e){return this.setPeer({peerId:this.peerId,threadId:this.threadId,lastMsgId:e})}finishPeerChange(e,t,i,s){return wo(this,void 0,void 0,(function*(){if(this.peerChanged)return;const t=this.peerId;this.peerChanged=!0,this.wasAlreadyUsed=!0;const i=this.bubbles.getMiddleware();this.cleanup(!1);const n=this.sharedMediaTab,o=Promise.all([this.topbar.finishPeerChange(e),this.bubbles.finishPeerChange(),this.input.finishPeerChange(s),n.fillProfileElements()]),r=yield o;n.loadSidebarMedia(!0),i()&&(r.forEach((e=>{null==e||e()})),a.ZP.replaceSharedMediaTab(n),this.sharedMediaTabs.filter((e=>e!==n)).forEach((e=>this.destroySharedMediaTab(e))),this.container.dataset.type=this.type,this.log.setPrefix("CHAT-"+t+"-"+this.type),this.appImManager.dispatchEvent("peer_changed",this))}))}getMessage(e){return this.managers.appMessagesManager.getMessageFromStorage(this.messagesStorageKey,e)}getMidsByMid(e){return wo(this,void 0,void 0,(function*(){return this.managers.appMessagesManager.getMidsByMessage(yield this.getMessage(e))}))}getHistoryStorage(e){return this.managers.appMessagesManager.getHistoryStorageTransferable(this.peerId,e?void 0:this.threadId).then((e=>Object.assign(Object.assign({},e),{history:ve.Z.fromJSON(e.historySerialized)})))}getDialogOrTopic(){return this.isForum&&this.threadId?this.managers.dialogsStorage.getForumTopic(this.peerId,this.threadId):this.managers.dialogsStorage.getDialogOnly(this.peerId)}getHistoryMaxId(){return this.getHistoryStorage().then((e=>e.maxId))}_isAnyGroup(e){return wo(this,void 0,void 0,(function*(){return e===d.Z.myId||e===m.hj||(yield this.managers.appPeersManager.isAnyGroup(e))}))}initSearch(e){if(this.peerId)if(o.Z.isMobile)this.search?this.search.setQuery(e):this.search=new fo(this.topbar,this,e);else{let t=a.ZP.getTab(po);t||(t=a.ZP.createTab(po)),t.open(this.peerId,this.threadId,this.bubbles.onDatePick,e)}}canSend(e){return this.managers.appMessagesManager.canSendToPeer(this.peerId,this.threadId,e)}isStartButtonNeeded(){return Promise.all([this.managers.appPeersManager.isBot(this.peerId),this.managers.appMessagesManager.getDialogOnly(this.peerId),this.getHistoryStorage(!0)]).then((([e,t,i])=>e&&!t&&!i.history.length))}getMessageSendingParams(){return{threadId:this.threadId,replyToMsgId:this.input.replyToMsgId,scheduleDate:this.input.scheduleDate,silent:this.input.sendSilent,sendAsPeerId:this.input.sendAsPeerId}}isOurMessage(e){return e.fromId===d.Z.myId||!!e.pFlags.out&&this.isMegagroup}isOutMessage(e){const t=e.fwd_from;return!(!this.isOurMessage(e)||t&&this.peerId===d.Z.myId)}isAvatarNeeded(e){return this.isAnyGroup&&!this.isOutMessage(e)}isPinnedMessagesNeeded(){return"chat"===this.type||this.isForum}}var Co=i(2342),Lo=i(6637);class Eo{constructor(e){this.appImManager=e,this.buttons={},this.addedListener=!1,this.waitingForMouseUp=!1,this.mouseUpCounter=0,this.onMouseUpSingle=e=>{if(this.waitingForMouseUp=!1,c.Z){if(e&&(0,Ce.Z)(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","spoiler","link"].forEach((t=>{const i=(0,Gn.Z)(t,{noRipple:!0});e.append(this.buttons[t]=i),"link"!==t?i.addEventListener("mousedown",(e=>{(0,Ce.Z)(e),this.appImManager.chat.input.applyMarkdown(t),this.cancelClosening()})):(0,C.fc)(i,(e=>{(0,Ce.Z)(e),this.showLinkEditor(),this.cancelClosening()}))})),this.linkBackButton=(0,Gn.Z)("left",{noRipple:!0}),this.linkInput=document.createElement("input"),(0,L.$d)(this.linkInput,"MarkupTooltip.LinkPlaceholder",void 0,"placeholder"),this.linkInput.classList.add("input-clear"),this.linkInput.addEventListener("keydown",(e=>{const t=!this.linkInput.value.length||!!(0,Co.Z)(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=>{(0,Ce.Z)(e),this.container.classList.remove("is-link"),this.resetSelection(),this.setTooltipPosition(),this.cancelClosening()})),this.linkApplyButton=(0,Gn.Z)("check markup-tooltip-link-apply",{noRipple:!0}),this.linkApplyButton.addEventListener("mousedown",(e=>{this.applyLink(e)}));const i=document.createElement("div");i.classList.add("markup-tooltip-link-apply-container");const s=document.createElement("span"),n=document.createElement("span"),a=document.createElement("span");s.classList.add("markup-tooltip-delimiter"),n.classList.add("markup-tooltip-delimiter"),a.classList.add("markup-tooltip-delimiter"),e.insertBefore(s,this.buttons.link),i.append(a,this.linkApplyButton),t.append(this.linkBackButton,n,this.linkInput,i),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){(0,Ce.Z)(e),this.resetSelection();let t=this.linkInput.value;t&&!(0,Lo.Z)(t)&&(t="https://"+t),this.appImManager.chat.input.applyMarkdown("link",t),setTimeout((()=>{this.hide()}),0)}isLinkValid(){return!this.linkInput.value.length||!!(0,Co.Z)(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,Un.Z.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=new Set,t=Object.keys(this.buttons),i=Fa(t);return t.forEach((t=>{i[t]&&e.add(this.buttons[t])})),[...e]}setActiveMarkupButton(){const e=this.getActiveMarkupButton();for(const t in this.buttons){const i=this.buttons[t];i.classList.toggle("active",e.includes(i))}}setTooltipPosition(e=!1){const t=document.getSelection().getRangeAt(0),i=document.body.getBoundingClientRect(),s=t.getBoundingClientRect(),n=this.appImManager.chat.input.rowsWrapper.getBoundingClientRect();this.container.style.maxWidth=n.width+"px";const a=(0,He.Z)(void 0,this.appImManager.chat.input.messageInput,!1,s).rect.top+-1*i.top,o=(this.container.classList.contains("is-link")?this.wrapper.lastElementChild:this.wrapper.firstElementChild).getBoundingClientRect(),r=a-o.height-8,d=n.left,l=n.left+n.width-Math.min(n.width,o.width);let c;if(e){const e=this.container.getBoundingClientRect();c=(0,Gi.Z)(e.left,d,l)}else{const e=s.left+(s.width-o.width)/2;c=(0,Gi.Z)(e,d,l)}this.container.style.transform=`translate3d(${c}px, ${r}px, 0)`}show(){if(this.init&&(this.init(),this.init=null),Fs())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"),x.IS_MOBILE||Un.Z.pushItem({type:"markup",onPop:()=>{this.hide()}})}setMouseUpEvent(){this.waitingForMouseUp||(this.waitingForMouseUp=!0,document.addEventListener("mouseup",this.onMouseUpSingle,{once:!0}))}cancelClosening(){c.Z&&!x.IS_APPLE&&(document.removeEventListener("mouseup",this.onMouseUpSingle),document.addEventListener("mouseup",(e=>{(0,Ce.Z)(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;const t=this.appImManager.chat.input.messageInput;if(document.activeElement!==t)return void this.hide();const i=document.getSelection();if(Fs(i))this.hide();else if(c.Z)if(x.IS_APPLE)this.show(),this.setTooltipPosition();else{if(2===this.mouseUpCounter)return void(this.mouseUpCounter=0);this.savedRange=i.getRangeAt(0),this.setMouseUpEvent()}else this.container&&this.container.classList.contains("is-visible")?(this.setActiveMarkupButton(),this.setTooltipPosition()):t.matches(":active")?this.setMouseUpEvent():this.show()})),document.addEventListener("beforeinput",(e=>{"historyRedo"!==e.inputType&&"historyUndo"!==e.inputType||e.target.addEventListener("input",(()=>this.setActiveMarkupButton()),{once:!0})})))}}var Io=i(9171);class Mo{constructor(e,t){let i;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&&(i=document.createElement("div"),i.classList.add("drop-icon","tgico-"+t.icon));const s=document.createElement("div");let n;s.classList.add("drop-header"),s.append((0,L.ag)(t.header,t.headerArgs)),t.subtitle&&(n=document.createElement("div"),n.classList.add("drop-subtitle"),n.append((0,L.ag)(t.subtitle))),this.svg.append(this.path),this.outlineWrapper.append(this.svg),this.container.append(...[this.outlineWrapper,i,s,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=10,i=e.width-t,s=e.height-t,n=(0,Io.Z)(5,5,i,s,t,t,t,t);this.path.setAttributeNS(null,"d",n)}}var Po=i(7922);function Zo(e){e.forEach((e=>e.classList.add("no-transition"))),(0,fe.d1)().then((()=>{e.forEach((e=>e.classList.remove("no-transition")))}))}var To=i(490),ko=i(2831),xo=i(2207);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:i,minRadius:s,speed:n}=this,a=i-s;e[t]=s+Math.random()*a,n[t]=.017+.003*Math.random()}generateNextBlob(){const{radius:e,radiusNext:t,progress:i,N:s}=this;for(let n=0;n=1&&(s[r]=0,a[r]=o[r],this.generateBlob(o,r))}draw(e,t,i,s,n,a,o,r){if(n.getContext){const d=n.getContext("2d");d.beginPath(),d.moveTo(i,s),d.lineTo(e,s);const{radius:l,radiusNext:c,N:h}=this;for(let n=0;n<=h;n++)if(0===n){const i=this.progress[n],s=(t-(l[n]*(1-i)+c[n]*i))*r+o*(1-r);d.lineTo(e,s)}else{const a=this.progress[n-1],u=l[n-1]*(1-a)+c[n-1]*a,p=this.progress[n],f=(i-e)/h*(n-1),m=(i-e)/h*n,g=f+(m-f)/2,v=(t-u)*r+o*(1-r),b=(t-(l[n]*(1-p)+c[n]*p))*r+o*(1-r);d.bezierCurveTo(g,v,g,b,m,b),n===h&&d.lineTo(i,s)}a(d),d.fill(),d.closePath()}}}class _o{constructor(e){this.stateId=e,this.createGradient(e)}createGradient(e){this.shader=(t,i,s,n,a)=>{t.fillStyle=_o.getGradientFromType(t,e,i,s,n,a)}}static getGradientFromType(e,t,i,s,n,a){const o=e.createLinearGradient(i,s,n,a);return t===xo.Z.MUTED_BY_ADMIN?(o.addColorStop(0,"#F05459"),o.addColorStop(.4,"#766EE9"),o.addColorStop(1,"#57A4FE")):t===xo.Z.UNMUTED?(o.addColorStop(0,"#52CE5D"),o.addColorStop(1,"#00B1C0")):t===xo.Z.MUTED?(o.addColorStop(0,"#0976E3"),o.addColorStop(1,"#2BCEFF")):t===xo.Z.CONNECTING&&(o.addColorStop(0,"#8599aa"),o.addColorStop(1,"#8599aa")),o}update(e,t,i,s){}}class Fo{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:i,lbd2:s,scale:n,left:a,top:o,right:r,bottom:d,currentState:l,previousState:c,focused:h,resizing:u,canvas:p}=this;if(!h&&!u&&this.progressToState>=1)return;let f=Date.now()-this.lastUpdateTime;f>20&&(f=17),this.animateToAmplitude!==this.amplitude&&(this.amplitude+=this.animateAmplitudeDiff*f,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:m,amplitude2:g,progressToState:v}=this,b=6*g*n,y=6*g*n;p.getContext("2d").clearRect(0,0,p.width,p.height),t.minRadius=0,t.maxRadius=(2+2*m)*n,i.minRadius=0,i.maxRadius=(3+9*m)*n,s.minRadius=0,s.maxRadius=(3+9*m)*n,t.update(m,.3),i.update(m,.7),s.update(m,.7);for(let e=0;e<2;e++){if(0===e&&!c)continue;let n=1,h=null;0===e?(n=1-v,h=c):(n=c?v:1,l.update(d-o,r-a,f,m),h=l);const u=e=>{e.globalAlpha=.3*n,h.shader(e,a,o,r,d)},g=t=>{t.globalAlpha=0===e?1:n,h.shader(t,a,o,r,d)};i.draw(a,o-b,r,d,p,u,o,1),s.draw(a,o-y,r,d,p,u,o,1),t.draw(a,o,r,d,p,g,o,1)}e||(this.raf=requestAnimationFrame((()=>this.draw())))},this.setCurrentState=(e,t)=>{const{currentState:i,states:s}=this;(null==i?void 0:i.stateId)!==e&&(this.previousState=t?i:null,this.currentState=s.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([[xo.Z.UNMUTED,new _o(xo.Z.UNMUTED)],[xo.Z.MUTED,new _o(xo.Z.MUTED)],[xo.Z.MUTED_BY_ADMIN,new _o(xo.Z.MUTED_BY_ADMIN)],[xo.Z.CONNECTING,new _o(xo.Z.CONNECTING)]]),this.previousState=null,this.currentState=this.states.get(xo.Z.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 i=this.canvas=document.createElement("canvas");return i.classList.add(e+"-canvas"),t.append(i),t}}var Do=i(8222);class Ro{constructor(e,t){this.item=e,(0,Hn.Z)(this,t)}play(e){return this.item.playPart(this,e)}}class Bo{constructor(e,t){this.icon=e,this.autoplay=!1,(0,Hn.Z)(this,t),this.parts=this.parts.map((e=>this.createPart(e)))}load(){var e;let t=this.loadPromise;if(t)return t;const{container:i,canvas:s,width:n,height:a}=this.icon;return t=Rs.Z.loadAnimationAsAsset({container:i,canvas:s,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=>Rs.Z.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 Ro(this,e)}getPart(e){return e instanceof Ro?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 No{constructor(e){(0,Hn.Z)(this,e),this.container||(this.container=document.createElement("div")),this.container.classList.add("rlottie-icon");const{width:t,height:i}=this;this.container.style.width=t+"px",this.container.style.height=i+"px";const s=this.canvas=document.createElement("canvas");s.classList.add("rlottie"),s.width=t,s.height=i,this.items=new Map,this.loadPromises=new Map}get loadPromise(){return Promise.all([...this.loadPromises.values()]).then(Qe.Z)}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,i){if(!e.player)return void(e.onLoadForPart=()=>{this.playPart(e,t,i)});const s=e.getPart(t);e.player.playPart({from:d.Z.settings.animationsEnabled&&!this.skipAnimation?s.startFrame:s.endFrame,to:s.endFrame,callback:i})}static generateEqualParts(e,t){return new Array(e).fill(0).map(((e,i)=>{const s=i*t;return{startFrame:s,endFrame:s+t-1}}))}}class Oo extends No{constructor(e){super({width:e.width,height:e.height}),(0,Hn.Z)(this,e)}load(e,t){if(this.loaded)return this.loadPromise;this.loaded=!0,this.partState=e,this.colorState=t;const i=this.getPart(e),s=void 0!==t&&this.getColor&&this.getColor(t),n=i.item;n.initFrame=i.endFrame,n.color=s;const a=[...this.items.values()].map((e=>e.load()));return Promise.all(a).then(Qe.Z)}setState(e,t,i){this.loaded||this.load(e,t);let s=!1,n=!1;return void 0!==e?s=this.setPartState(e,t,i):void 0!==t&&(n=this.setColorState(t)),s||n}setPartState(e,t,i){const{partState:s}=this;return s===e?void 0!==t&&this.setColorState(t):(void 0!==t&&this.setColorState(t,!1),this.partState=e,this.getPart(e,s).play(i),!0)}setColorState(e,t=!0){const{colorState:i}=this;if(i===e||!this.getColor)return!1;this.colorState=e;const s=this.getItem(),n=this.getColor(e,i),a=()=>{s.player.setColor(n,t)};return s.player?a():s.onLoadForColor=a,!0}destroy(){this.items.forEach((e=>{e.loadPromise.then((()=>{e.player.remove()}))}))}}class Uo extends Oo{constructor(){super({width:36,height:36,getPart:(e,t)=>{const i=fr;let s;switch(e){case i.HAND:s=t===i.MUTED?"muted-to-hand":"unmuted-to-hand";break;case i.MUTED:s=t===i.HAND?"hand-to-muted":"mute";break;case i.UNMUTED:s="unmute"}return this.getItem().getPart(s)}}),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"}]})}}var Ho=i(6733);class zo extends Oo{constructor(e){super({width:32,height:32,getPart:(e,t)=>{const i=pr;let s;switch(e){case i.HAND:s=3;break;case i.MUTED:s=t===i.HAND?0:2;break;case i.UNMUTED:s=1}return this.getItem().getPart(s)},getColor:e?(e,t)=>function(e){const t=pr;let 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 s=Do.Z.getProperty("gc-"+i+"-text-color");return(0,O.oo)(s)}(e):void 0}),this.colored=e,this.container.classList.add("group-call-participant-muted-icon-container");const t=No.generateEqualParts(4,21);this.add({name:"voice_outlined2",parts:t})}setState(e){return super.setState(function(e){const t=pr;switch(e){case t.MUTED_BY_ADMIN:case t.MUTED_FOR_ME:return t.MUTED;default:return e}}(e),e)}}const jo="group-call-participant-status";class Go{constructor(e){this.withIcons=e,this.container=document.createElement("div"),this.container.classList.add(jo+"-container")}setState(e,t){const i=pr,s=this.withIcons.filter((e=>!!t[e])).map((e=>{const t="tgico-"+("presentation"===e?"listscreenshare":"videocamera_filled"),i=document.createElement("i");return i.classList.add(jo+"-icon",jo+"-icon-"+e,t),i}));let n,a;if(e===i.MUTED_FOR_ME)n=(0,L.ag)("VoiceChat.Status.MutedForYou"),a="is-muted";else if(e===i.UNMUTED)n=(0,L.ag)("VoiceChat.Status.Speaking"),a="is-speaking";else if(e===i.HAND)n=(0,L.ag)("VoiceChat.Status.WantsSpeak"),a="is-waiting";else{if(t.about&&!s.length)return void(0,F.Z)(this.container,(0,B.Z)(t.about));n=(0,L.ag)("VoiceChat.Status.Listening"),a="is-listening"}const o=document.createElement("span");o.classList.add(jo,a),o.append(...s,n),(0,H.Z)(this.container,o)}}var Vo=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Ko extends ps.Z{constructor(e){super({getIndex:e=>Vo(this,void 0,void 0,(function*(){return(yield this.instance.getParticipantByPeerId(e.id)).date})),onDelete:e=>{e.dom.listEl.remove(),this.onElementDestroy(e)},onUpdate:e=>Vo(this,void 0,void 0,(function*(){const t=yield this.instance.getParticipantByPeerId(e.id),i=mr(t);e.mutedIcon.setState(i),e.status.setState(i,t)})),onSort:(e,t)=>{(0,p.Z)(e.dom.listEl,this.list,t)},onElementCreate:e=>{const{dom:t}=Ji.default.addDialogNew({peerId:e.id,container:!1,avatarSize:this.avatarSize,autonomous:this.autonomous,meAsSaved:!1,rippleEnabled:this.rippleEnabled,wrapOptions:{lazyLoadQueue:this.lazyLoadQueue}});t.listEl.classList.add("group-call-participant");const i=new zo(!0),s=new Go(["presentation","video"]);return(0,H.Z)(t.lastMessageSpan,s.container),t.listEl.append(i.container),e.mutedIcon=i,e.status=s,e.dom=t,e},updateElementWith:fe.T2}),this.instance=e,this.avatarSize="abitbigger",this.rippleEnabled=!0,this.autonomous=!0,this.createChatListOptions={dialogSize:72},this.list=Ji.default.createChatList(this.createChatListOptions)}destroy(){this.elements.forEach((e=>{this.onElementDestroy(e)}))}onElementDestroy(e){e.mutedIcon.destroy()}}var Wo=i(7529);function $o(e){const t=document.createElement("canvas");t.classList.add("call-video-blur"),t.width=16,t.height=16;const i=t.getContext("2d",{alpha:!1});i.filter="blur(2px)";const s=()=>{i.drawImage(e,0,0,e.videoWidth,e.videoHeight,0,0,t.width,t.height)};return(0,Me.jt)((()=>(s(),t.isConnected))),s(),t}const qo="group-call-participant-video";class Qo{constructor(e,t,i){this.managers=e,this.instance=t,this.source=i,this.container=document.createElement("div"),this.container.classList.add(qo+"-container"),this.info=document.createElement("div"),this.info.classList.add(qo+"-info"),this.left=document.createElement("div"),this.left.classList.add(qo+"-info-left"),this.right=document.createElement("div"),this.right.classList.add(qo+"-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(qo+"-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,i){let s;e.pFlags.self?(s=(0,L.ag)("VoiceChat.Status.You"),s.classList.add("peer-title")):(this.peerTitle=new N.Z({peerId:(0,R.Z)(e.peer)}),s=this.peerTitle.element),this.groupCallParticipantMutedIcon=new zo(!1),this.groupCallParticipantStatus=new Go([t]),this.left.append(s,this.groupCallParticipantStatus.container),this.right.append(this.groupCallParticipantMutedIcon.container),i.classList.add(qo,"call-video"),i.paused&&i.play();const n=$o(i);n.classList.add(qo+"-blur"),this.container.prepend(n,i),this.updateParticipant(e)}updateParticipant(e){const t=mr(e);this.groupCallParticipantMutedIcon.setState(t),this.groupCallParticipantStatus.setState(t,e)}destroy(){this.groupCallParticipantMutedIcon.destroy()}}class Yo extends Wo.Z{constructor(e){super(),(0,Hn.Z)(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:i}=this;i.add(d.Z)("group_call_participant",(({groupCallId:e,participant:t})=>{this.instance.id===e&&this.updateParticipant(t)})),i.add(this.instance)("pinned",(e=>{this.participantsElements.forEach((t=>{t.forEach((t=>{this.setElementDisplay(t,e)}))}))})),(0,C.fc)(this.container,(e=>{const t=(0,be.Z)(e.target,"group-call-participant-video-container");if(!t)return;const i=this.containers.get(t);this.instance.pinnedSource!==i.source?this.instance.pinSource(i.source):this.instance.unpinAll()}),{listenerSetter:i}),this.setInstance(this.instance),this.setup({element:t,listenerSetter:i,showOnLeaveToClassName:"group-call-buttons"})}shouldDisplayElement(e,t){return this.displayPinned?!t||e.source===t:t&&e.source!==t}setElementDisplay(e,t){const i=this.shouldDisplayElement(e,t);e.container.classList.toggle("video-hidden",!i);const s=e.source===t;e.setPinned(s)}updateParticipant(e){const t=(0,R.Z)(e.peer),i=["video","presentation"],s=i.some((t=>!!e[t]));let n=this.participantsElements.get(t);(s||n)&&(n||this.participantsElements.set(t,n=new Map),i.forEach((i=>{let s=n.get(i);const a=e[i];if(!!a!=!!s){if(a){const t=this.instance.getVideoElementFromParticipantByType(e,i);if(!t)return;const{video:a,source:o}=t;s=new Qo(this.managers,this.instance,o),this.containers.set(s.container,s),this.setElementDisplay(s,this.instance.pinnedSource),n.set(i,s),s.setParticipant(e,i,a),this.container.prepend(s.container)}else n.delete(i),s.container.remove(),n.size||(this.participantsElements.delete(t),this.containers.delete(s.container),s.destroy());this._onLengthChange()}else s&&s.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){return t=this,i=void 0,n=function*(){(yield e.participants).forEach((e=>{this.updateParticipant(e)}))},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}destroy(){this.containers.forEach((e=>{e.destroy()}))}}var Xo=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Jo{constructor(e){this.onOpenProfileClick=()=>{const e=S.Z.getPopups(br)[0];e&&e.hide(),id.setInnerPeer({peerId:this.targetPeerId})},this.toggleParticipantMuted=e=>{this.instance.editParticipant(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.managers.appChatsManager.hasRights(this.chatId,"ban_users"),onClick:()=>Xo(this,void 0,void 0,(function*(){(0,vi.Z)({peerId:this.targetPeerId,title:new N.Z({peerId:this.targetPeerId}).element,descriptionLangKey:(yield this.managers.appChatsManager.isBroadcast(this.chatId))?"VoiceChat.RemovePeer.Confirm.Channel":"VoiceChat.RemovePeer.Confirm",descriptionLangArgs:[new N.Z({peerId:this.targetPeerId}).element],button:{langKey:"VoiceChat.RemovePeer.Confirm.OK",isDanger:!0}}).then((()=>{this.managers.appChatsManager.kickFromChat(this.chatId,this.targetPeerId)}),Qe.Z)}))}];const{listenerSetter:t}=e;this.managers=e.managers,this.instance=e.instance,this.chatId=this.instance.chatId,this.element=(0,Ts.b)({buttons:this.buttons,listenerSetter:t}),this.element.classList.add("group-call-participant-menu","night"),(0,Ct.E)({element:e.onContextElement,callback:e=>Xo(this,void 0,void 0,(function*(){const t=(0,be.Z)(e.target,"group-call-participant");if(!t)return;this.element.parentElement!==i&&i.append(this.element),(0,Ce.Z)(e);const s=this.targetPeerId=t.dataset.peerId.toPeerId();this.participant=yield this.instance.getParticipantByPeerId(s),this.participant.pFlags.self||(this.canManageCall=yield this.managers.appChatsManager.hasRights(this.chatId,"manage_call"),yield(0,en.Z)(this.buttons,(e=>Xo(this,void 0,void 0,(function*(){const t=yield e.verify(s);return e.element.classList.toggle("hide",!t),t})))),(0,Js.Z)(e.touches?e.touches[0]:e,this.element,"right"),Lt.Z.openBtnMenu(this.element))})),listenerSetter:t}),t.add(d.Z)("group_call_participant",(({groupCallId:e,participant:t})=>{if(this.instance.id===e){const e=(0,R.Z)(t.peer);this.targetPeerId===e&&Lt.Z.close()}}));let i=document.body;(0,Ho.Ms)(document.body,(()=>{const e=(0,Ho.rB)();i=e?S.Z.getPopups(br)[0].getContainer():document.body,e||Lt.Z.close()}),t)}}class er{constructor(e){(0,Hn.Z)(this,e);const t="group-call-participants",i=new T.ZP(void 0);i.container.classList.add(t+"-scrollable");const s=this.container=document.createElement("div");s.classList.add(t);const n=this.sortedList=new Ko(this.instance),{instance:a,listenerSetter:o}=this;this.contextMenu=new Jo(Object.assign(Object.assign({},e),{onContextElement:n.list,listenerSetter:o,instance:a})),this.groupCallParticipantsVideo=new Yo(Object.assign(Object.assign({},e),{appendTo:i.container,displayPinned:!1})),i.append(n.list),s.append(i.container),e.appendTo.append(s),o.add(d.Z)("group_call_participant",(({groupCallId:e,participant:t})=>{this.instance.id===e&&this.updateParticipant(t)})),new Vs.Z({scrollable:i,getPromise:()=>this.managers.appGroupCallsManager.getGroupCallParticipants(this.instance.id).then((({participants:e,isEnd:t})=>(e.forEach((e=>{this.updateParticipant(e)})),t)))}),this.setInstance(a)}updateParticipant(e){const t=(0,R.Z)(e.peer),i=this.sortedList.has(t);e.pFlags.left?i&&this.sortedList.delete(t):i?this.sortedList.update(t):this.sortedList.add(t)}setInstance(e){return Xo(this,void 0,void 0,(function*(){(yield e.participants).forEach((e=>{this.updateParticipant(e)}))}))}destroy(){this.sortedList.destroy(),this.groupCallParticipantsVideo.destroy()}}class tr{constructor(e){this.appendTo=e,this.descriptionIntl=new L.ZP.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 i,s;t===xo.Z.CONNECTING?i="VoiceChat.Status.Connecting":(i="VoiceChat.Status.Members",s=[e.groupCall.participants_count]);const{descriptionIntl:n}=this;n.compareAndUpdate({key:i,args:s}),this.descriptionIntl.element.parentElement||this.appendTo.append(this.descriptionIntl.element)}}class ir{constructor(e){this.appendTo=e,this.peerTitle=new N.Z({peerId:0})}update(e){const{peerTitle:t,appendTo:i}=this,s=e.groupCall,n=e.chatId.toPeerId(!0);s.title?(0,F.Z)(i,(0,B.Z)(s.title)):(t.options.peerId!==n&&(t.options.peerId=n,t.update()),t.element.parentElement!==i&&i.append(t.element))}}var sr=i(2820);function nr(e,t,i){const s=e+"-button",n=document.createElement("div");n.classList.add(s,"call-button","rp-overflow"),i.icon&&n.classList.add("tgico-"+i.icon),i.noRipple||(0,A.Z)(n),i.isDanger&&n.classList.add(s+"-red"),i.isConfirm&&n.classList.add(s+"-green"),i.callback&&(0,C.fc)(n,i.callback,{listenerSetter:t});let a=n;if(i.text){const e=document.createElement("div");e.classList.add(s+"-container","call-button-container");const t="string"==typeof i.text?(0,L.ag)(i.text):i.text;t.classList.add(s+"-text","call-button-text"),e.append(n,t),a=e}return a}var ar=i(3757);const or="movable-element",rr=or+"-resize-handler";class dr extends l.Z{constructor(e){super(!0),this.onResize=()=>{this.fixDimensions(),this.fixPosition(),this.setPosition()},(0,Hn.Z)(this,e),this.top=this.left=this.width=this.height=0,this.element.classList.add(or),this.addResizeHandlers(),this.setSwipeHandler(),o.Z.addEventListener("resize",this.onResize)}destroyElements(){this.element.classList.remove(or),this.handlers&&this.handlers.forEach((e=>{e.remove()}))}destroy(){o.Z.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(rr,rr+"-side-"+e),this.element.append(t),t}))}setSwipeHandler(){let e,t,i,s,n;const a=this.swipeHandler=new ar.Z({element:this.element,onSwipe:(a,o,r)=>{if(n){if(n.includes("e")||n.includes("w")){const e=n.includes("e")&&a>0||n.includes("w")&&a<0,s=Math.abs(a)*(e?1:-1),o=n.includes("e")?xe.Z.width-t:i+t;this.width=Math.min(o,i+s)}if(n.includes("n")||n.includes("s")){const t=n.includes("s")&&o>0||n.includes("n")&&o<0,i=Math.abs(o)*(t?1:-1),a=n.includes("s")?xe.Z.height-e:s+e;this.height=Math.min(a,s+i)}this.fixDimensions(),n.includes("w")&&(this.left=Math.min(t+i-this.minWidth,t+a)),n.includes("n")&&(this.top=Math.min(e+s-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 i=(0,be.Z)(t,rr);return i?(n=i.dataset.side,a.setCursor("")):(n=void 0,a.setCursor("grabbing")),!0},onFirstSwipe:()=>{e=this.top,t=this.left,i=this.width,s=this.height}})}setPositionToCenter(){this.top=xe.Z.height/2-this.height/2,this.left=xe.Z.width/2-this.width/2,this.setPosition()}fixDimensions(){this.width=(0,Gi.Z)(this.width,this.minWidth,xe.Z.width),this.height=(0,Gi.Z)(this.height,this.minHeight,xe.Z.height)}fixPosition(){this.top=(0,Gi.Z)(this.top,0,xe.Z.height-this.height),this.left=(0,Gi.Z)(this.left,0,xe.Z.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:i,height:s}=this;return{top:e,left:t,width:i,height:s}}set state(e){const{top:t,left:i,width:s,height:n}=e;this.top=t,this.left=i,this.width=s,this.height=n,this.onResize()}}var lr,cr=function(e,t,i,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,i):n?n.value=i:t.set(e,i),i};class hr{constructor(e){lr.set(this,void 0),(0,Hn.Z)(this,e),this.toggleMovable(!c.Z),this.listenerSetter.add(o.Z)("changeScreen",((e,t)=>{t!==o._.mobile&&e!==o._.mobile||this.toggleMovable(!c.Z)}))}destroy(){const e=this.movable;e&&e.destroy()}get movable(){return function(e,t,i,s){if("a"===i&&!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"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)}(this,lr,"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=cr(this,lr,new dr(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(),cr(this,lr,void 0,"f")}}}function ur(e,t,i){return t.forEach((t=>{t.classList.toggle(e,i)})),()=>ur(e,t,!i)}lr=new WeakMap;var pr,fr;function mr(e){const t=pr;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}!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"}(pr||(pr={})),function(e){e[e.HAND=0]="HAND",e[e.MUTED=1]="MUTED",e[e.UNMUTED=2]="UNMUTED"}(fr||(fr={}));let gr={width:420,height:640};const vr="group-call";class br extends S.Z{constructor(){super("popup-group-call",{body:!0,withoutOverlay:!0,closable:!0,title:!0}),this.onFullScreenClick=()=>{(0,Ho.Dj)(this.container)},this.onToggleControls=e=>{this.container.classList.toggle("show-controls",e),this.buttonsContainer.classList.toggle("show-controls",e)},this.toggleDisability=ur.bind(null,"btn-disabled"),this.onVideoClick=()=>{const e=this.toggleDisability([this.btnVideo],!0);this.instance.toggleVideoSharing().finally((()=>{e()}))},this.onScreenClick=()=>{const e=this.toggleDisability([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=()=>{return e=this,t=void 0,s=function*(){const e=e=>{this.instance.hangUp(e)};(yield this.managers.appChatsManager.hasRights(this.instance.chatId,"manage_call"))?new xs.Z("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)},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s},this.onFullScreenChange=()=>{this.toggleBigLayout();const e=(0,Ho.rB)(),{btnFullScreen:t,btnExitFullScreen:i}=this,n=this.container.classList.contains("is-full-screen");this.container.classList.toggle("is-full-screen",e),t&&t.classList.toggle("hide",e),i&&i.classList.toggle("hide",!e),this.btnClose.classList.toggle("hide",e),e!==n&&(s.Z.checkAnimations2(e),yo.Z.setThemeColor(e?"#000000":void 0))},this.toggleBigLayout=()=>{var e;const t=(0,Ho.rB)(),i=null===(e=this.movablePanel)||void 0===e?void 0:e.movable,s=(t||!!(i&&i.width>=680))&&!!this.videosCount,n=this.container.classList.contains("is-big-layout");let a;s&&!n&&(a=Array.from(this.buttonsContainer.children),a.forEach((e=>{e.style.opacity="0"})),this.buttonsContainer.offsetLeft),this.container.classList.toggle("is-big-layout",s),this.btnInvite.classList.toggle("hide",s),this.btnShowColumn.classList.toggle("hide",!s),a&&a.forEach((e=>{e.style.opacity=""}))},this.toggleRightColumn=()=>{this.container.classList.toggle("is-right-column-shown")},this.videosCount=0,this.container.classList.add(vr,"night");const e=this.instance=ro.ZP.groupCall,{listenerSetter:t}=this;if(!x.IS_APPLE_MOBILE){const e=this.btnFullScreen=(0,Gn.Z)("fullscreen"),i=this.btnFullScreen2=(0,Gn.Z)("fullscreen "+vr+"-cfs"),s=this.btnExitFullScreen=(0,Gn.Z)("smallscreen");(0,C.fc)(e,this.onFullScreenClick,{listenerSetter:t}),(0,C.fc)(i,this.onFullScreenClick,{listenerSetter:t}),(0,C.fc)(s,(()=>{(0,Ho.C8)()}),{listenerSetter:t}),(0,Ho.Ms)(this.container,this.onFullScreenChange,t)}this.btnInvite=(0,Gn.Z)("adduser");const i=this.btnShowColumn=(0,Gn.Z)("rightpanel "+vr+"-only-big");(0,C.fc)(i,this.toggleRightColumn,{listenerSetter:t});const n=document.createElement("div");n.classList.add(vr+"-header-info"),this.title.classList.add(vr+"-header-title");const a=document.createElement("div");a.classList.add(vr+"-header-subtitle"),n.append(this.title,a),this.header.classList.add(vr+"-header"),this.header.append(...[this.btnExitFullScreen,n,this.btnFullScreen,i].filter(Boolean));const o=this.header.cloneNode(!1),r=n.cloneNode(!1),l=this.title.cloneNode(!1);r.append(l);const c=(0,Gn.Z)("rightpanel");o.append(...[c,r,this.btnFullScreen2].filter(Boolean)),(0,C.fc)(c,this.toggleRightColumn,{listenerSetter:t}),this.body.prepend(o);const h=new T.ZP(void 0);h.container.classList.add("group-call-big-video-container"),this.container.append(h.container),this.groupCallTitle=new ir(this.title),this.groupCallDescription=new tr(a),this.groupCallBodyHeaderDescription=new tr(l),this.constructButtons(),this.groupCallParticipantsVideo=new Yo({appendTo:h.container,instance:e,listenerSetter:t,displayPinned:!0,onLengthChange:e=>{this.videosCount=e,this.toggleBigLayout()},managers:this.managers}),this.groupCallParticipants=new er({appendTo:this.body,instance:e,listenerSetter:t,managers:this.managers}),this.movablePanel=new hr({listenerSetter:t,movableOptions:{minWidth:400,minHeight:480,element:this.element,verifyTouchTarget:e=>{const t=e.target;return!((0,be.Z)(t,"chatlist")||(0,be.Z)(t,"group-call-button")||(0,be.Z)(t,"btn-icon")||(0,be.Z)(t,"group-call-participants-video-container")||(0,Ho.rB)())}},onResize:()=>this.toggleBigLayout(),previousState:gr}),t.add(e)("state",(()=>{this.updateInstance()})),t.add(d.Z)("group_call_update",(e=>{var t;(null===(t=this.instance)||void 0===t?void 0:t.id)===e.id&&this.updateInstance()})),t.add(e)("pinned",(()=>{this.setHasPinned()})),t.add(this.groupCallParticipantsVideo)("toggleControls",this.onToggleControls),this.addEventListener("close",(()=>{const{movablePanel:e}=this;gr=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(vr+"-buttons");const t=nr.bind(null,vr,this.listenerSetter),i=this.btnVideo=t({callback:this.onVideoClick,icon:"videocamera_filled"}),s=this.btnScreen=t({callback:this.onScreenClick,icon:"sharescreen_filled"});s.classList.toggle("hide",!sr.Z);const n=t({noRipple:!0,callback:(0,Qa.Z)(this.onMuteClick,600,!0)});n.classList.add(vr+"-microphone-button");const a=this.groupCallMicrophoneIcon=new Uo;n.append(a.container);const o=t({icon:"settings_filled"});o.classList.add("btn-disabled"),o.classList.toggle("hide",!sr.Z);const r=t({isDanger:!0,callback:this.onLeaveClick,icon:"close"});e.append(i,s,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===xo.Z.CLOSED)return this.container.classList.contains("is-full-screen")&&(0,Ho.C8)(),void this.hide();const{participant:e,groupCall:t}=this.instance;if(!e)return;this.setTitle(),this.setDescription(),this.setHasPinned();const i=function(e,t){const i=fr;return t.pFlags.can_self_unmute?t.pFlags.muted?i.MUTED:i.UNMUTED:i.HAND}(0,e);this.container.dataset.micState=i===fr.HAND?"hand":i===fr.MUTED?"muted":"unmuted",this.groupCallMicrophoneIcon.setState(i)}setTitle(){this.groupCallTitle.update(this.instance)}setDescription(){this.groupCallDescription.update(this.instance),this.groupCallBodyHeaderDescription.update(this.instance)}}var yr=i(9078),wr=i(3335);class Sr{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 i;if(this.state=t,t===wr.Z.CONNECTED){i=document.createElement("span"),i.classList.add("call-description-duration");const t=()=>{i.innerText=(0,ts.Z)(e.duration,!0)};this.interval=window.setInterval(t,1e3),t()}else{let s;switch(t){case wr.Z.PENDING:s=e.isOutgoing?"Call.StatusRinging":"Call.StatusCalling";break;case wr.Z.REQUESTING:s="Call.StatusRequesting";break;case wr.Z.EXCHANGING_KEYS:s="VoipExchangingKeys";break;case wr.Z.CLOSED:s=void 0!==e.connectedAt?"Call.StatusEnded":"Call.StatusFailed";break;default:s="Call.StatusConnecting"}i=(0,L.ag)(s),void 0!==this.interval&&(clearInterval(this.interval),this.interval=void 0)}this.container.classList.toggle("has-duration",t===wr.Z.CONNECTED),(0,H.Z)(this.container,i),this.container.parentElement||this.appendTo.append(this.container)}}class Cr extends Oo{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"}]})}}const Lr="call",Er={width:400,height:580};let Ir=Object.assign({},Er);class Mr extends S.Z{constructor(e){super("popup-call",{withoutOverlay:!0,closable:!0}),this.instance=e,this.onFullScreenClick=()=>{(0,Ho.Dj)(this.container)},this.onFullScreenChange=()=>{const e=(0,Ho.rB)(),{btnFullScreen:t,btnExitFullScreen:i}=this,n=this.container.classList.contains("is-full-screen");this.container.classList.toggle("is-full-screen",e),t&&t.classList.toggle("hide",e),i&&i.classList.toggle("hide",!e),this.btnClose.classList.toggle("hide",e),e!==n&&(s.Z.checkAnimations(e),yo.Z.setThemeColor(e?"#000000":void 0),this.resizeVideoContainers())},this.videoContainers={};const{container:t,listenerSetter:i}=this;t.classList.add(Lr,"night");const n=document.createElement("div");n.classList.add(Lr+"-avatar");const a=this.peerId=this.instance.interlocutorUserId.toPeerId(),o=new f.Z;o.classList.add("avatar-full"),o.updateWithOptions({isBig:!0,peerId:a}),n.append(o);const r=new N.Z({peerId:a}).element;r.classList.add(Lr+"-title");const d=document.createElement("div");d.classList.add(Lr+"-subtitle"),this.description=new Sr(d);const l=this.emojisSubtitle=document.createElement("div");l.classList.add(Lr+"-emojis"),t.append(n,r,d),x.IS_MOBILE?this.header.append(l):(this.btnFullScreen=(0,Gn.Z)("fullscreen"),this.btnExitFullScreen=(0,Gn.Z)("smallscreen hide"),(0,C.fc)(this.btnFullScreen,this.onFullScreenClick,{listenerSetter:i}),(0,C.fc)(this.btnExitFullScreen,(()=>(0,Ho.C8)()),{listenerSetter:i}),(0,Ho.Ms)(this.container,this.onFullScreenChange,i),this.header.prepend(this.btnExitFullScreen),this.header.append(this.btnFullScreen),t.append(l)),this.partyStates=document.createElement("div"),this.partyStates.classList.add(Lr+"-party-states"),this.partyMutedState=document.createElement("div"),this.partyMutedState.classList.add(Lr+"-party-state");const c=(0,L.ag)("VoipUserMicrophoneIsOff",[new N.Z({peerId:a,onlyFirstName:!0,limitSymbols:18}).element]);c.classList.add(Lr+"-party-state-text");const h=new Cr(!1,!0);h.setState(!1,!1),this.partyMutedState.append(h.container,c),this.partyStates.append(this.partyMutedState),this.container.append(this.partyStates),this.makeButton=nr.bind(null,Lr,this.listenerSetter),this.constructFirstButtons(),this.constructSecondButtons(),i.add(e)("state",(()=>{this.updateInstance()})),i.add(e)("mediaState",(()=>{this.updateInstance()})),this.movablePanel=new hr({listenerSetter:i,movableOptions:{minWidth:400,minHeight:580,element:this.element,verifyTouchTarget:e=>{const t=e.target;return!((0,be.Z)(t,"call-button")||(0,be.Z)(t,"btn-icon")||(0,Ho.rB)())}},previousState:this.instance.wasTryingToJoin||this.instance.isOutgoing?Ir:Object.assign({},Er)});const u=this.movablePanel.movable;u&&this.listenerSetter.add(u)("resize",(()=>{this.resizeVideoContainers()}));const p=this.controlsHover=new Wo.Z;p.setup({element:this.container,listenerSetter:this.listenerSetter,showOnLeaveToClassName:"call-buttons"}),p.showControls(!1),this.addEventListener("close",(()=>{const{movablePanel:e}=this;Ir=e.state,this.microphoneIcon.destroy(),e.destroy()})),this.updateInstance()}getCallInstance(){return this.instance}constructFirstButtons(){const e=this.firstButtonsRow=document.createElement("div");e.classList.add(Lr+"-buttons","is-first");const t=ur.bind(null,"btn-disabled"),i=this.btnVideo=this.makeButton({text:"Call.Camera",icon:"videocamera_filled",callback:()=>{const e=t([i,s],!0);this.instance.toggleVideoSharing().finally(e)}}),s=this.btnScreen=this.makeButton({text:"Call.Screen",icon:"sharescreen_filled",callback:()=>{const e=t([i,s],!0);this.instance.toggleScreenSharing().finally(e)}});sr.Z||(s.classList.add("hide"),this.container.classList.add("no-screen")),this.muteI18nElement=new L.ZP.IntlElement({key:"Call.Mute"});const n=this.btnMute=this.makeButton({text:this.muteI18nElement.element,callback:()=>{this.instance.toggleMuted()}}),a=this.microphoneIcon=new Cr(!0,!0);n.firstElementChild.append(a.container),e.append(i,s,n),this.container.append(e)}constructSecondButtons(){const e=this.secondButtonsRow=document.createElement("div");e.classList.add(Lr+"-buttons","is-second"),this.declineI18nElement=new L.ZP.IntlElement({key:"Call.Decline"});const t=this.btnDecline=this.makeButton({text:this.declineI18nElement.element,icon:"endcall_filled",callback:()=>{this.instance.hangUp("phoneCallDiscardReasonHangup")},isDanger:!0}),i=this.btnAccept=this.makeButton({text:"Call.Accept",icon:"phone_filled",callback:()=>{this.instance.acceptCall()},isConfirm:!0});e.append(t,i),this.container.append(e)}createVideoContainer(e){const t=Lr+"-video",i=document.createElement("div");i.classList.add(t+"-container"),e.classList.add(t),e.paused&&e.play(),(0,C.fc)(i,(()=>{if(!i.classList.contains("small"))return;const e=Object.values(this.videoContainers).find((e=>!e.classList.contains("small")));e.classList.add("small"),e.style.cssText=i.style.cssText,i.classList.remove("small"),i.style.cssText="",this.resizeVideoContainers()}));const s=$o(e);return s.classList.add(t+"-blur"),i.append(s,e),i}updateInstance(){const{instance:e}=this,{connectionState:t}=e;if(t===wr.Z.CLOSED)return this.container.classList.contains("is-full-screen")&&(0,Ho.C8)(),this.btnVideo.classList.add("disabled"),void this.hide();const i=!e.isOutgoing&&t===wr.Z.PENDING;this.declineI18nElement.compareAndUpdate({key:t===wr.Z.PENDING?"Call.Decline":"Call.End"}),this.btnAccept.classList.toggle("disable",!i),this.btnAccept.classList.toggle("hide-me",!i),this.container.classList.toggle("two-button-rows",i);const s=e.isMuted,n=()=>{this.btnMute.firstElementChild.classList.toggle("active",s)},a=this.microphoneIcon.getItem().player;this.microphoneIcon.setState(!s,!s,n),a||n(),this.muteI18nElement.compareAndUpdate({key:s?"VoipUnmute":"Call.Mute"});const o=e.isSharingVideo;this.btnVideo.firstElementChild.classList.toggle("active",o);const r=e.isSharingScreen;this.btnScreen.firstElementChild.classList.toggle("active",r);const d=e.getMediaState("output");(0,Fe.Z)({element:this.partyMutedState,className:"is-visible",forwards:!!(null==d?void 0:d.muted),duration:300});const l=this.videoContainers,c=Object.assign({},l);["input","output"].forEach((t=>{const i=e.getMediaState(t),s=e.getVideoElement(t),n=!!(s&&s.videoWidth&&s.videoHeight);!s||n||s.dataset.hasPromise||(s.dataset.hasPromise="1",(0,wn.Z)(s).then((()=>{delete s.dataset.hasPromise,this.updateInstance()})));const a=!!s&&n&&!(!i||"active"!==i.videoState&&"active"!==i.screencastState);let o=l[t];a&&s&&!o&&(o=l[t]=this.createVideoContainer(s),this.container.append(o)),!a&&o&&(o.remove(),delete l[t])}));{const e=l.input,t=l.output;Object.keys(c).length!==Object.keys(l).length&&e&&e.classList.toggle("small",!!t),t&&!e&&t.classList.remove("small")}this.resizeVideoContainers(),this.container.classList.toggle("no-video",!Object.keys(l).length),!this.emojisSubtitle.textContent&&t{(0,H.Z)(this.emojisSubtitle,(0,B.Z)(e.join("")))})),this.setDescription()}resizeVideoContainers(){Object.values(this.videoContainers).forEach((e=>{if(e.classList.contains("small")){const t=e.querySelector("video"),i=this.movablePanel.state,s=240,n=240,a=t.videoHeight>t.videoWidth,o=a?n:s,r=1/3*((0,Ho.rB)()?65535:a?i.height:i.width),d=a?t.videoWidth/t.videoHeight:1,l=a?1:t.videoHeight/t.videoWidth;e.style.width=r*d+"px",e.style.height=r*l+"px",e.style.maxWidth=o*d+"px",e.style.maxHeight=o*l+"px"}else e.style.cssText=""}))}setDescription(){this.description.update(this.instance)}}var Pr=i(2069),Zr=i(9585),Tr=i(2493);const kr="topbar-call";class xr{constructor(e){this.managers=e,this.onState=()=>{this.updateInstance(this.instance)};const t=this.listenerSetter=new ce.Z;t.add(Tr.Z)("instance",(({instance:e})=>{this.instance||this.updateInstance(e)})),t.add(Tr.Z)("accepting",(e=>{this.instance!==e&&this.updateInstance(e)})),t.add(ro.ZP)("instance",(e=>{this.updateInstance(e)})),t.add(d.Z)("group_call_update",(e=>{const t=ro.ZP.groupCall;(null==t?void 0:t.id)===e.id&&this.updateInstance(t)})),t.add(Zr.Z.ANALYSER_LISTENER)("amplitude",(({amplitudes:e,type:t})=>{const{weave:i}=this;if(!e.length||!i)return;let s=0;for(let t=0;ts?n:s}i.setAmplitude(s)}))}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);const t=this.instance!==e;t&&(this.clearCurrentInstance(),this.instance=e,this.instanceListenerSetter=new ce.Z,this.instanceListenerSetter.add(e)("state",this.onState),e instanceof yr.Z?this.currentDescription=this.groupCallDescription:(this.currentDescription=this.callDescription,this.instanceListenerSetter.add(e)("muted",this.onState)),this.container.classList.toggle("is-call",!(e instanceof yr.Z)));const i=this.instance.isMuted,s=e instanceof yr.Z?e.state:function(e,t){switch(e){case wr.Z.CLOSING:case wr.Z.CLOSED:return xo.Z.CLOSED;case wr.Z.CONNECTED:return t?xo.Z.MUTED:xo.Z.UNMUTED;default:return xo.Z.CONNECTING}}(e.connectionState,i),{weave:n}=this;n.componentDidMount();const a=s===xo.Z.CLOSED;(!document.body.classList.contains("is-calling")||t||a)&&(a&&n.setAmplitude(0),(0,Fe.Z)({element:document.body,className:"is-calling",forwards:!a,duration:250,onTransitionEnd:a?()=>{n.componentWillUnmount(),this.clearCurrentInstance()}:void 0})),a||(n.setCurrentState(s,!0),this.setTitle(e),this.setDescription(e),this.groupCallMicrophoneIconMini.setState(!i))}setDescription(e){return this.currentDescription.update(e)}setTitle(e){if(e instanceof yr.Z)return this.groupCallTitle.update(e);(0,H.Z)(this.center,new N.Z({peerId:e.interlocutorUserId.toPeerId()}).element)}construct(){const{listenerSetter:e}=this,t=this.container=document.createElement("div");t.classList.add("sidebar-header",kr+"-container");const i=document.createElement("div");i.classList.add(kr+"-left");const s=this.groupCallMicrophoneIconMini=new Cr,n=(0,Gn.Z)();n.append(s.container),i.append(n);const a=(0,Qa.Z)((()=>{this.instance.toggleMuted()}),600,!0);(0,C.fc)(n,(e=>{(0,Ce.Z)(e),a()}),{listenerSetter:e});const o=this.center=document.createElement("div");o.classList.add(kr+"-center"),this.groupCallTitle=new ir(o),this.groupCallDescription=new tr(i),this.callDescription=new Sr(i);const r=document.createElement("div");r.classList.add(kr+"-right");const d=(0,Gn.Z)("endcall_filled");r.append(d),(0,C.fc)(d,(e=>{(0,Ce.Z)(e);const{instance:t}=this;t&&(t instanceof yr.Z?t.hangUp():t.hangUp("phoneCallDiscardReasonHangup"))}),{listenerSetter:e}),(0,C.fc)(t,(()=>{if(this.instance instanceof yr.Z){if(S.Z.getPopups(br).length)return;(new br).show()}else if(this.instance instanceof Pr.Z){if(S.Z.getPopups(Mr).find((e=>e.getCallInstance()===this.instance)))return;new Mr(this.instance).show()}}),{listenerSetter:e}),t.append(i,o,r);const l=this.weave=new Fo,c=l.render(kr+"-weave");t.prepend(c),document.getElementById("column-center").prepend(t),l.componentDidMount()}}var Ar=i(2614),_r=i(6009),Fr=i(493),Dr=i(2131),Rr=i(2890),Br=i(6702),Nr=i(7746),Or=i(3785),Ur=i(2491),Hr=i(1722),zr=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const jr=new class{constructor(){this.notificationsShown={},this.notificationIndex=0,this.notificationsCount=0,this.soundsPlayed={},this.vibrateSupport=Dr.Z,this.faviconElements=Array.from(document.head.querySelectorAll('link[rel="icon"], link[rel="alternate icon"]')),this.titleBackup=document.title,this.titleChanged=!1,this.stopped=!1,this.settings={},this.pushInited=!1,this.updateLocalSettings=()=>{const e=["notify_nodesktop","notify_volume","notify_novibrate","notify_nopreview","notify_nopush"].map((()=>{}));Promise.all(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&&Br.default.isAvailable||!1;e!==(!1!==this.registeredDevice)&&(e?Br.default.subscribe():Br.default.unsubscribe())}Br.default.setSettings(this.settings)})),Sn.Z.getState().then((e=>{this.settings.nosound=!e.settings.notifications.sound}))},this.requestPermission=()=>{Notification.requestPermission(),window.removeEventListener("click",this.requestPermission)}}construct(e){this.managers=e,this.log=(0,r.kg)("NOTIFICATIONS"),navigator.vibrate=navigator.vibrate||navigator.mozVibrate||navigator.webkitVibrate,this.setAppBadge=navigator.setAppBadge&&navigator.setAppBadge.bind(navigator),this.setAppBadge&&this.setAppBadge(0),this.notificationsUiSupport="Notification"in window||"mozNotification"in navigator,this.notifySoundEl=document.createElement("div"),this.notifySoundEl.id="notify-sound",document.body.append(this.notifySoundEl),this.topMessagesDeferred=(0,me.Z)(),To.Z.addEventListener("deactivated",(()=>{this.stop()})),To.Z.addEventListener("activated",(()=>{this.stopped&&this.start()})),wt.Z.addEventListener("change",(e=>{this.stopped||(e||this.clear(),this.toggleToggler())})),d.Z.addEventListener("notification_reset",(e=>{this.soundReset(e)})),d.Z.addEventListener("notification_cancel",(e=>{this.cancel(e)})),this.setAppBadge&&d.Z.addEventListener("folder_unread",(e=>{0===e.id&&this.setAppBadge(e.unreadUnmutedPeerIds.size)})),Br.default.addEventListener("push_init",(e=>{this.pushInited=!0,this.settings.nodesktop||this.settings.nopush?this.unregisterDevice(e):e?this.registerDevice(e):Br.default.subscribe()})),Br.default.addEventListener("push_subscribe",(e=>{this.registerDevice(e)})),Br.default.addEventListener("push_unsubscribe",(e=>{this.unregisterDevice(e)})),d.Z.addEventListener("dialogs_multiupdate",(()=>{this.topMessagesDeferred.resolve()}),{once:!0}),Br.default.addEventListener("push_notification_click",(e=>{if("push_settings"===e.action)return;if("mute1d"===e.action)return void this.managers.apiManager.invokeApi("account.updateDeviceLocked",{period:86400}).then((()=>{}));const t=e.custom&&e.custom.peerId.toPeerId();console.log("click",e,t),t&&this.topMessagesDeferred.then((()=>zr(this,void 0,void 0,(function*(){const i=t.isAnyChat()?t.toChatId():void 0;i&&!(yield this.managers.appChatsManager.hasChat(i))||t.isUser()&&!(yield this.managers.appUsersManager.hasUser(t.toUserId()))||id.setInnerPeer({peerId:t,lastMsgId:(0,yt.Z)(+e.custom.msg_id)})}))))}))}buildNotification({message:e,fwdCount:t,peerReaction:i,peerTypeNotifySettings:s}){return zr(this,void 0,void 0,(function*(){const n=e.peerId,a=n.isAnyChat(),o={},[r,d=!1]=yield Promise.all([this.managers.appPeersManager.getPeerString(n),a&&this.managers.appPeersManager.isForum(n)]);let l,c=!1;if(s.show_previews)if("message"===e._&&e.fwd_from&&t>1)l=L.ZP.format("Notifications.Forwarded",!0,[t]);else{l=yield(0,V.Z)({message:e,plain:!0});const t=null==i?void 0:i.reaction;if("reactionEmoji"===(null==t?void 0:t._)){const e="Notification.Contact.Reacted",i=[(0,Nr.Z)(t.emoticon),l];l=L.ZP.format(e,!0,i)}else c=!0}else l=L.ZP.format("Notifications.New",!0);i&&(o.noIncrement=!0,o.silent=!0);const h={plainText:!0,managers:this.managers},u=d?(0,b.Z)(e,d):void 0,p=i?(0,R.Z)(i.peer_id):e.fromId,f=o.title=yield(0,Fr.Z)(Object.assign(Object.assign({},h),{peerId:n,threadId:u}));if(d){const t=yield(0,Fr.Z)(Object.assign(Object.assign({},h),{peerId:n}));o.title+=` (${t})`,c&&p!==e.peerId&&(l=(yield(0,Fr.Z)(Object.assign(Object.assign({},h),{peerId:p})))+": "+l)}else a&&p!==e.peerId&&(o.title=(yield(0,Fr.Z)(Object.assign(Object.assign({},h),{peerId:p})))+" @ "+o.title);o.title=(0,Ur.Z)(o.title),o.onclick=()=>{id.setInnerPeer({peerId:n,lastMsgId:e.mid,threadId:u})},o.message=l,o.key="msg"+e.mid,o.tag=r,o.silent=!0;const m=yield this.managers.appPeersManager.getPeerPhoto(n);if(m){const t=yield this.managers.appAvatarsManager.loadAvatar(n,m,"photo_small");if(!(i||(e=yield this.managers.appMessagesManager.getMessageByPeer(e.peerId,e.mid))&&e.pFlags.unread))return;o.image=t}else{let{avatarCanvas:e,avatarContext:t}=this;if(this.avatarCanvas)t.clearRect(0,0,e.width,e.height);else{e=this.avatarCanvas=document.createElement("canvas"),t=this.avatarContext=e.getContext("2d");const i=54,s=1;e.dpr=s,e.width=e.height=i*s,this.avatarGradients={}}const i=(0,U.Z)(n,!0);let s=this.avatarGradients[i];if(!s){s=this.avatarGradients[i]=t.createLinearGradient(e.width/2,0,e.width/2,e.height);const n=Do.Z.getProperty(`peer-avatar-${i}-top`),a=Do.Z.getProperty(`peer-avatar-${i}-bottom`);s.addColorStop(0,n),s.addColorStop(1,a)}t.fillStyle=s,(0,Rr.Z)(t,e.width/2,e.height/2,e.width/2),t.fill();const a=20*e.dpr,r=(0,Or.Z)(f);t.font=`700 ${a}px ${Tt.bt}`,t.textBaseline="middle",t.textAlign="center",t.fillStyle="white",t.fillText(r.text,e.width/2,e.height*(window.devicePixelRatio>1?.5625:5)),o.image=e.toDataURL()}const g={custom:{msg_id:""+e.mid,peerId:""+n},description:"",loc_key:"",loc_args:[],mute:"",random_id:0,title:""};(yield this.notify(o,g))&&this.registeredDevice&&Br.default.ignorePushByMid(n,e.mid)}))}toggleToggler(e=wt.Z.isIdle){if(x.IS_MOBILE)return;const t=e=>{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=L.ZP.format("Notifications.Count",!0,[e]);const t=document.createElement("canvas");t.width=32*window.devicePixelRatio,t.height=t.width;const i=t.getContext("2d");i.beginPath(),i.arc(t.width/2,t.height/2,t.width/2,0,2*Math.PI,!1),i.fillStyle="#3390ec",i.fill();let s=24,n=""+e;e<10?s=22:e<100?s=20:(n="99+",s=16),s*=window.devicePixelRatio,i.font=`700 ${s}px ${Tt.bt}`,i.textBaseline="middle",i.textAlign="center",i.fillStyle="white",i.fillText(n,t.width/2,.5625*t.height),this.setFavicon(t.toDataURL())}else this.toggleToggler(!1)}),1e3):t()}setFavicon(e){this.prevFavicon!==e&&(this.prevFavicon=e,this.faviconElements.forEach(((t,i,s)=>{var n;const a=t.cloneNode();(n=a.dataset).href||(n.href=a.href),null!=e||(e=a.dataset.href),a.href=e,t.replaceWith(s[i]=a)})))}notify(e,t){var i;return zr(this,void 0,void 0,(function*(){if(this.log("notify",e,wt.Z.isIdle,this.notificationsUiSupport,this.stopped),this.stopped)return;e.image||(e.image="assets/img/logo_filled_rounded.png"),e.noIncrement||++this.notificationsCount,this.titleInterval||this.toggleToggler();const s=++this.notificationIndex,n=e.key||"k"+s;this.notificationsShown[n]=!0;const a=(0,Ht.Z)();if(this.settings.volume>0&&!this.settings.nosound&&(this.testSound(this.settings.volume),this.soundsPlayed[e.tag]=a),!this.notificationsUiSupport||"Notification"in window&&"granted"!==Notification.permission)return;if(this.settings.nodesktop)return this.vibrateSupport&&!this.settings.novibrate?void navigator.vibrate([200,100,200]):void 0;if(!("Notification"in window))return;let o;const r={badge:"assets/img/logo_plain.svg",icon:e.image||"",body:e.message||"",tag:e.tag||"",silent:e.silent||!1,data:t};try{if(e.tag)for(const t in this.notificationsShown){const i=this.notificationsShown[t];"boolean"!=typeof i&&i.tag===e.tag&&(i.hidden=!0)}o=new Notification(e.title,r)}catch(t){try{const t=yield navigator.serviceWorker.ready;yield t.showNotification(e.title,r);const i=yield t.getNotifications({tag:r.tag});o=i[i.length-1]}catch(t){this.log.error("creating push error",t,e,r)}if(!o)return this.notificationsUiSupport=!1,void Br.default.setLocalNotificationsDisabled()}return o.onclick=()=>{var t;this.log("notification onclick"),o.close(),Hr.Z.focus(),this.clear(),null===(t=e.onclick)||void 0===t||t.call(e)},o.onclose=()=>{this.log("notification onclose"),o.hidden||(delete this.notificationsShown[n],this.clear())},null===(i=o.show)||void 0===i||i.call(o),this.notificationsShown[n]=o,x.IS_MOBILE||setTimeout((()=>{this.hide(n)}),8e3),!0}))}getLocalSettings(){return this.settings}hide(e){const t=this.notificationsShown[e];t&&this.closeNotification(t)}soundReset(e){delete this.soundsPlayed[e]}testSound(e){const t=(0,Ht.Z)();if(this.nextSoundAt&&t\n \n `,this.notifySoundEl.append(s),s.addEventListener("ended",(()=>{s.remove()}),{once:!0})}cancel(e){const t=this.notificationsShown[e];this.log("cancel",e,t),t&&(this.notificationsCount>0&&--this.notificationsCount,this.closeNotification(t),delete this.notificationsShown[e])}closeNotification(e){try{"boolean"!=typeof e&&e.close&&(this.log("close notification",e),e.hidden=!0,e.close())}catch(e){}}clear(){this.log.warn("clear");for(const e in this.notificationsShown){const t=this.notificationsShown[e];this.closeNotification(t)}this.notificationsShown={},this.notificationsCount=0,Br.default.hidePushNotifications()}start(){if(this.log("start"),this.updateLocalSettings(),d.Z.addEventListener("settings_updated",this.updateLocalSettings),Br.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.log("stop"),this.clear(),window.clearInterval(this.titleInterval),this.titleInterval=0,this.setFavicon(),this.stopped=!0}registerDevice(e){if(this.registeredDevice&&(0,go.Z)(this.registeredDevice,e))return!1;this.managers.apiManager.invokeApi("account.registerDevice",{token_type:e.tokenType,token:e.tokenValue,other_uids:[],app_sandbox:!1,secret:new Uint8Array}).then((()=>{this.log("registered device"),this.registeredDevice=e}),(e=>{e.handled=!0}))}unregisterDevice(e){if(!this.registeredDevice)return!1;this.managers.apiManager.invokeApi("account.unregisterDevice",{token_type:e.tokenType,token:e.tokenValue,other_uids:[]}).then((()=>{this.registeredDevice=!1}),(e=>{e.handled=!0}))}};ge.GO&&(ge.GO.uiNotificationsManager=jr);const Gr=jr;var Vr=i(236),Kr=i(5936),Wr=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function $r(e,t=!1){return Wr(this,void 0,void 0,(function*(){const i=[],s=(e,n)=>Wr(this,void 0,void 0,(function*(){if(e.isDirectory){const t=e.createReader();yield new Promise(((e,i)=>{t.readEntries((t=>Wr(this,void 0,void 0,(function*(){for(const e of t)yield s(e,n);e()}))))}))}else if(e)if(t)i.push(e.type);else{const t=n.getAsFile(),s=e instanceof File?e:e instanceof DataTransferItem?e.getAsFile():yield new Promise(((i,s)=>e.file(i,(e=>i(t)))));if(!s)return;i.push(s)}}));if(e instanceof DragEvent&&e.dataTransfer.files&&!e.dataTransfer.items)for(let s=0;s{!e.noCancelEvent&&(0,Ce.Z)(null);let i,s,n=t.href;const a=new URL(n),o=a.host.match(/(.+?)\.t(?:elegram)?\.me/);o&&!m.BX.has(o[1])&&(a.pathname=o[1]+("/"===a.pathname?"":a.pathname),n=a.toString()),e.noPathnameParams||(i=new URL(n).pathname.split("/").slice(1)),e.noUriParams||(s=(0,qr.Z)(n));const r=e.callback({pathnameParams:i,uriParams:s},t);return void 0===r&&r}}var Yr,Xr=i(9439),Jr=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};!function(e){e[e.CHATLIST=0]="CHATLIST",e[e.CHAT=1]="CHAT",e[e.PROFILE=2]="PROFILE"}(Yr||(Yr={}));class ed extends l.Z{constructor(){super(...arguments),this.columnEl=document.getElementById("column-center"),this.offline=!1,this.updateStatusInterval=0,this.setPeerPromise=null,this.chats=[],this.cacheStorage=new Kr.Z("cachedFiles"),this.onHashChange=e=>{try{this.onHashChangeUnsafe(e)}catch(e){this.log.error("hash change error",e)}},this.onHashChangeUnsafe=e=>{const t=location.hash;e||Un.Z.replaceState();const i=t.split("?"),s=(0,qr.Z)(t,i);if(this.log("hashchange",t,i[0],s),t)if(s.tgaddr)this.openUrl(s.tgaddr);else switch(i[0]){default:s.p=i[0].slice(1);case"#/im":{if(!Object.keys(s).length)break;const e=s.p,t=void 0!==s.post?(0,yt.Z)(+s.post):void 0;"@"===e[0]?this.openUsername({userName:e,lastMsgId:t}):this.setInnerPeer({peerId:t?e.toPeerId(!0):e.toPeerId(),lastMsgId:t})}}},this.setSettings=()=>{const{messagesTextSize:e}=d.Z.settings;this.customEmojiSize=(0,qe.C)(e+4,e+4),document.documentElement.style.setProperty("--messages-text-size",e+"px"),this.customEmojiSize&&(document.querySelectorAll("middle-ellipsis-element").forEach((t=>{t.disconnectedCallback(),t.dataset.fontSize=""+e,t.title&&(t.textContent=t.title),t.connectedCallback()})),document.querySelectorAll(".chat custom-emoji-renderer-element").forEach((e=>{e.forceRenderAfterSize=!0}))),document.body.classList.toggle("animation-level-0",!d.Z.settings.animationsEnabled),document.body.classList.toggle("animation-level-1",!1),document.body.classList.toggle("animation-level-2",d.Z.settings.animationsEnabled),this.chatsSelectTabDebounced=(0,Ze.Z)((()=>{var e;null===(e=this.chat.topbar.pinnedMessage)||void 0===e||e.setCorrectIndex(0),this.managers.apiFileManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId)}),d.Z.settings.animationsEnabled?250:0,!1,!0),Rs.Z.setLoop(d.Z.settings.stickers.loop)&&s.Z.checkAnimations2(!1);for(const e of this.chats)e.setAutoDownloadMedia();L.ZP.setTimeFormat(d.Z.settings.timeFormat),this.toggleChatGradientAnimation(this.chat)},this.onDocumentPaste=(e,t)=>Jr(this,void 0,void 0,(function*(){const i=An();if(e instanceof DragEvent){const t=e.dataTransfer.types;(t.contains?t.contains("Files"):t.indexOf("Files")>=0)&&(0,Ce.Z)(e)}const s=yield $r(e);if(((yield this.canDrag())||i)&&s.length){if(i)return void i.addFiles(s);const e=this.chat.input;e.willAttachType=t||(vn.Z.has(s[0].type)?"media":"document"),S.Z.createPopup(_n,this.chat,s,e.willAttachType)}}))}get myId(){return d.Z.myId}get chat(){return this.chats[this.chats.length-1]}construct(e){this.managers=e;const{apiUpdatesManager:t}=e;t.attach(L.ZP.lastRequestedLangCode),ya.Z.construct(e),Gr.construct(e),Gr.start(),this.log=(0,r.kg)("IM",r.v9.Log|r.v9.Warn|r.v9.Debug|r.v9.Error),this.backgroundPromises={},Vr.h.settings.themes.forEach((e=>{const t=e.settings;if(!t)return;const{wallpaper:i}=t,s=i.slug;if(!s)return;const n="assets/img/"+s+".svg"+(x.IS_FIREFOX?"?1":"");this.backgroundPromises[s]=Promise.resolve(n)})),this.selectTab(Yr.CHATLIST),wt.Z.addEventListener("change",(e=>{this.offline=e,this.updateStatus(),e?clearInterval(this.updateStatusInterval):this.updateStatusInterval=window.setInterval((()=>this.updateStatus()),5e4)})),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(o.Z.activeScreen),this.columnEl.append(this.chatsContainer),this.createNewChat(),this.chatsSelectTab(this.chat.container),Un.Z.onHashChange=this.onHashChange,this.setSettings(),d.Z.addEventListener("settings_updated",this.setSettings);const i=e=>{document.body.classList.toggle("is-premium",e)};d.Z.addEventListener("premium_toggle",i),i(d.Z.premium),this.managers.rootScope.getPremium().then(i),(0,pe.ZP)((()=>{s.Z.setOnlyOnePlayableGroup("lock"),s.Z.checkAnimations2(!0)}),(()=>{s.Z.setOnlyOnePlayableGroup(),s.Z.checkAnimations2(!1)})),yo.Z.AppBackgroundTab=Xr.Z,x.IS_FIREFOX&&Sn.Z.oldVersion&&-1===(0,_r.Z)(Sn.Z.oldVersion,"1.4.3")?this.deleteFilesIterative((e=>"image/svg+xml"===e.headers.get("Content-Type"))).then((()=>{this.applyCurrentTheme()})):this.applyCurrentTheme(),o.Z.addEventListener("changeScreen",((e,t)=>{document.body.classList.contains(n.ir)&&document.body.classList.contains(a.HQ)&&a.ZP.toggleSidebar(!1),this.appendEmojiAnimationContainer(t)})),o.Z.addEventListener("resize",(()=>{const e=this.chatsContainer.getBoundingClientRect();bo.resizeInstances(e.width,e.height).then((()=>{}))})),this.addEventListener("peer_changing",(e=>{this.saveChatPosition(e)})),d.Z.addEventListener("theme_change",(()=>{this.applyCurrentTheme()})),d.Z.addEventListener("choosing_sticker",(e=>{this.setChoosingStickerTyping(!e)})),d.Z.addEventListener("peer_title_edit",(({peerId:e,threadId:t})=>{var i;(null===(i=this.chat)||void 0===i?void 0:i.peerId)!==e||t||void 0===this.tabId||this.overrideHash(e)})),d.Z.addEventListener("peer_typings",(({peerId:e,typings:t})=>{var i;const s=this.chat;if(!s||s.peerId!==e||St.Z.isOverlayActive||o.Z.activeScreen===o._.mobile&&this.tabId!==Yr.CHAT)return;const n=t.find((e=>"sendMessageEmojiInteraction"===e.action._));if("sendMessageEmojiInteraction"===(null===(i=null==n?void 0:n.action)||void 0===i?void 0:i._)){const t=n.action,i=s.bubbles.bubbles[(0,yt.Z)(n.action.msg_id)];if(i&&i.classList.contains("emoji-big")&&(0,He.Z)(i,s.bubbles.scrollable.container)){const s=i.querySelector(".media-sticker-wrapper:not(.bubble-hover-reaction-sticker):not(.reaction-sticker)");JSON.parse(t.interaction.data).a.forEach((e=>{setTimeout((()=>{(0,C.tH)(s)}),1e3*e.t)})),this.managers.appMessagesManager.setTyping(e,{_:"sendMessageEmojiInteractionSeen",emoticon:t.emoticon})}}}));const l=e=>{const t="version"===e,i=new S.Z("popup-instance-deactivated",{overlayClosable:!0}),s=document.createElement("div");s.classList.add("instance-deactivated-container"),i.container.replaceWith(s);const n=document.createElement("div");n.classList.add("header"),n.append((0,L.ag)(t?"Deactivated.Version.Title":"Deactivated.Title"));const a=document.createElement("div");a.classList.add("subtitle"),a.append((0,L.ag)(t?"Deactivated.Version.Subtitle":"Deactivated.Subtitle")),s.append(n,a),document.body.classList.add("deactivated");const o=t?()=>{Hr.Z.reload()}:()=>{document.body.classList.add("deactivated-backwards"),To.Z.activateInstance(),setTimeout((()=>{document.body.classList.remove("deactivated","deactivated-backwards")}),333)};i.addEventListener("close",o),i.show()};To.Z.addEventListener("deactivated",l),To.Z.deactivatedReason&&l(To.Z.deactivatedReason),this.addEventListener("chat_changing",(({to:e})=>{this.toggleChatGradientAnimation(e)})),d.Z.addEventListener("service_notification",(e=>{(0,vi.Z)({button:{langKey:"OK",isCancel:!0},description:(0,ft.ZP)(e.message)})})),d.Z.addEventListener("payment_sent",(({peerId:e,mid:t,receiptMessage:i})=>Jr(this,void 0,void 0,(function*(){const s=yield this.managers.appMessagesManager.getMessageByPeer(e,t);if(!s)return;const n=i.action;(0,we.bC)({langPackKey:"PaymentInfoHint",langPackArguments:[(0,Pt.Z)(n.total_amount,n.currency),(0,B.Z)(s.media.title)]})})))),window.onSpoilerClick=e=>{const t=(0,be.Z)(e.target,"spoiler"),i=(0,be.Z)(t,"spoilers-container")||t.parentElement,s="is-spoiler-visible",n=i.classList.contains(s);n||((0,Ce.Z)(e),"click"!==C.pf&&window.addEventListener("click",Ce.Z,{capture:!0,once:!0}));const a=n?0:2;a&&i.classList.add("will-change");const o=i.dataset.spoilerTimeout;null!==o&&(clearTimeout(+o),delete i.dataset.spoilerTimeout),(0,Fe.Z)({element:i,className:s,forwards:!0,duration:200,onTransitionEnd:()=>{i.dataset.spoilerTimeout=""+window.setTimeout((()=>{(0,Fe.Z)({element:i,className:s,forwards:!1,duration:200,onTransitionEnd:()=>{i.classList.remove("will-change"),delete i.dataset.spoilerTimeout}})}),5e3)},useRafs:a})},d.Z.addEventListener("sticker_updated",(({type:e,faved:t})=>{"faved"===e?(0,we.bC)({langPackKey:t?"AddedToFavorites":"RemovedFromFavorites"}):t||(0,we.bC)({langPackKey:"RemovedFromRecent"})})),Sn.Z.addEventListener("notificationBuild",(e=>Jr(this,void 0,void 0,(function*(){const t=yield this.managers.appPeersManager.isForum(e.message.peerId),i=(0,b.Z)(e.message,t);(this.chat.peerId!==e.message.peerId||this.chat.threadId!==i||wt.Z.isIdle)&&Gr.buildNotification(e)})))),this.addEventListener("peer_changed",(({peerId:e})=>Jr(this,void 0,void 0,(function*(){document.body.classList.toggle("has-chat",!!e),this.emojiAnimationContainer.textContent="",this.overrideHash(e),Sn.Z.updateTabState("chatPeerIds",this.chats.map((e=>e.peerId)).filter(Boolean))})))),Po.Z.setToCache("chatPositions",{}),(Oe.Z||no.Z)&&(this.topbarCall=new xr(e)),Oe.Z&&(Tr.Z.addEventListener("instance",(({instance:e})=>{const t=new Mr(e);e.addEventListener("acceptCallOverride",(()=>this.discardCurrentCall(e.interlocutorUserId.toPeerId(),void 0,e).then((()=>(Tr.Z.dispatchEvent("accepting",e),!0))).catch((()=>!1)))),t.addEventListener("close",(()=>{const t=Tr.Z.currentCall;t&&t!==e&&!e.wasTryingToJoin&&e.hangUp("phoneCallDiscardReasonBusy")}),{once:!0}),t.show()})),Tr.Z.addEventListener("incompatible",(e=>Jr(this,void 0,void 0,(function*(){(0,we.bC)({langPackKey:"VoipPeerIncompatible",langPackArguments:[yield(0,Vt.Z)({peerId:e.toPeerId()})]})}))))),To.Z.activateInstance();const c=()=>{ko.default.setAuthorized(!0)};setInterval(c,_.s2),c(),Qr({name:"showMaskedAlert",callback:(e,t)=>{const i=t.href,s=t.cloneNode(!0);s.className="anchor-url",s.innerText=i,s.removeAttribute("onclick"),new xs.Z("popup-masked-url",{titleLangKey:"OpenUrlTitle",descriptionLangKey:"OpenUrlAlert2",descriptionLangArgs:[s],buttons:[{langKey:"Open",callback:()=>{s.click()}}]}).show()}}),Qr({name:"execBotCommand",callback:({uriParams:e})=>{const{command:t,bot:i}=e;this.managers.appMessagesManager.sendText(this.chat.peerId,"/"+t+(i?"@"+i:""))}}),Qr({name:"searchByHashtag",callback:({uriParams:e})=>{const{hashtag:t}=e;t&&this.chat.initSearch("#"+t+" ")}}),[["addstickers",ke.STICKER_SET],["addemoji",ke.EMOJI_SET]].forEach((([e,t])=>{Qr({name:e,callback:({pathnameParams:e})=>{if(!e[1])return;const i={_:t,set:e[1]};this.processInternalLink(i)}}),Qr({name:e,protocol:"tg",callback:({uriParams:e})=>{const i=this.makeLink(t,e);this.processInternalLink(i)}})})),Qr({name:"invoice",callback:({pathnameParams:e})=>{const t={_:ke.INVOICE,slug:e.length>1?e[1]:e[0].slice(1)};this.processInternalLink(t)}}),Qr({name:"joinchat",callback:({pathnameParams:e})=>{const t={_:ke.JOIN_CHAT,invite:e[1]||decodeURIComponent(e[0]).slice(1)};this.processInternalLink(t)}}),no.Z&&Qr({name:"voicechat",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(ke.VOICE_CHAT,e);this.processInternalLink(t)}}),Qr({name:"im",callback:({pathnameParams:e,uriParams:t},i)=>Jr(this,void 0,void 0,(function*(){let s;if(Ba.kO.test(e[0]))s={_:ke.USER_PHONE_NUMBER,phone:e[0].slice(1)};else if("c"===e[0]){e.shift();const n="thread"in t?t.thread:e[2]&&e[1];s={_:ke.PRIVATE_POST,channel:e[0],post:e[2]||e[1],thread:n,comment:t.comment,stack:this.getStackFromElement(i)}}else{const n="thread"in t?t.thread:e[2]&&e[1];s={_:ke.MESSAGE,domain:e[0],post:e[2]||e[1],thread:n,comment:t.comment,start:"start"in t?t.start:void 0,stack:this.getStackFromElement(i)}}this.processInternalLink(s)}))}),Qr({name:"resolve",protocol:"tg",callback:({uriParams:e},t)=>{let i;e.phone?i=this.makeLink(ke.USER_PHONE_NUMBER,e):"telegrampassport"===e.domain||(i=this.makeLink(ke.MESSAGE,Object.assign(Object.assign({},e),{stack:this.getStackFromElement(t)}))),this.processInternalLink(i)}}),Qr({name:"privatepost",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(ke.PRIVATE_POST,e);this.processInternalLink(t)}}),Qr({name:"invoice",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(ke.INVOICE,e);this.processInternalLink(t)}}),["joinchat","join"].forEach((e=>{Qr({name:e,protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(ke.JOIN_CHAT,e);this.processInternalLink(t)}})})),this.onHashChange(!0),this.attachKeydownListener(),this.handleAutologinDomains(),this.checkForShare()}checkForShare(){const e=Sn.Z.share;e&&(Sn.Z.share=void 0,new M.Z(void 0,(t=>Jr(this,void 0,void 0,(function*(){var i;if(yield this.setPeer({peerId:t}),null===(i=e.files)||void 0===i?void 0:i.length){const t=e.files.some((e=>vn.Z.has(e.type)));new _n(this.chat,e.files,t?"media":"document")}else this.managers.appMessagesManager.sendText(t,e.text)})))))}handleUrlAuth(e){const{peerId:t,mid:i,buttonId:s,url:n}=e,a=e=>{window.open(e,"_blank")},o=e=>Jr(this,void 0,void 0,(function*(){if("urlAuthResultRequest"===e._){const r=document.createElement("b");r.append(e.domain);const l=yield(0,Vt.Z)({peerId:d.Z.myId}),c=yield(0,Vt.Z)({peerId:e.bot.id.toPeerId()}),h={text:"OpenUrlOption1",textArgs:[r.cloneNode(!0),l],checked:!0},u=e.pFlags.request_write_access?{text:"OpenUrlOption2",textArgs:[c],checked:!0}:void 0,p=[h,u],f=(0,vi.Z)({titleLangKey:"OpenUrlTitle",button:{langKey:"Open"},descriptionLangKey:"OpenUrlAlert2",descriptionLangArgs:[r],checkboxes:p.filter(Boolean)});u&&h.checkboxField.input.addEventListener("change",(()=>{const e=!h.checkboxField.checked;u.checkboxField.toggleDisability(e),e&&(u.checkboxField.checked=!1)}));const[m,g]=yield f;if(!m)return void a(n);const v=yield this.managers.appSeamlessLoginManager.acceptUrlAuth(n,t,i,s,g);return o(v)}"urlAuthResultAccepted"===e._?(e=>{a(e.url)})(e):a(n)}));return this.managers.appSeamlessLoginManager.requestUrlAuth(n,t,i,s).then((e=>{o(e)}))}handleAutologinDomains(){let e;d.Z.addEventListener("app_config",(t=>{e=t}));const t=t=>{var i,s;const n=new URL(t.href);if(e.url_auth_domains.includes(n.hostname))return this.handleUrlAuth({url:t.href}),void(0,Ce.Z)();if(!e.autologin_token||!e.autologin_domains)return;const a=null!==(i=(s=t.dataset).originalUrl)&&void 0!==i?i:s.originalUrl=t.href;e.autologin_domains.includes(n.hostname)&&(n.searchParams.set("autologin_token",e.autologin_token),t.href=n.toString(),setTimeout((()=>{t.href=a,delete t.dataset.originalUrl}),0))};document.addEventListener("click",(e=>{const i=(0,ye.Z)(e.target,"A");(null==i?void 0:i.href)&&t(i)}))}getStackFromElement(e){const t=(0,be.Z)(e,"bubble");return t?+t.dataset.mid:void 0}deleteFilesIterative(e){return this.cacheStorage.timeoutOperation((t=>{const i=performance.now();return t.keys().then((i=>{const s=i.map((i=>t.match(i).then((t=>e(t)))));return Promise.all(s).then((e=>(e.map(((e,s)=>{if(!e)return;const n=i[s];return t.delete(n)})),Promise.all(e.filter(Boolean)))))})).then((()=>{this.log("deleted files",performance.now()-i)}))}))}toggleChatGradientAnimation(e){this.chats.forEach((t=>{t.gradientRenderer&&t.gradientRenderer.scrollAnimate(d.Z.settings.animationsEnabled&&t===e)}))}appendEmojiAnimationContainer(e){const t=e===o._.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 i;const s=t.key,n=document.getSelection().isCollapsed;if(St.Z.isOverlayActive||e.has(s))return;const a=t.target,r=this.chat;if((!(s.startsWith("Arrow")||t.shiftKey&&"Shift"===s)||n)&&("KeyC"!==t.code||!t.ctrlKey&&!t.metaKey||"INPUT"===a.tagName)){if(!t.altKey||"ArrowUp"!==s&&"ArrowDown"!==s){if("ArrowUp"===s&&"scheduled"!==this.chat.type){if(r.input.editMsgId||!r.input.isInputEmpty())return;this.managers.appMessagesManager.getFirstMessageToEdit(r.peerId,r.threadId).then((e=>{e&&(r.input.initMessageEditing(e.mid),(0,Ce.Z)(t))}))}else if("ArrowDown"===s)return}else(0,Ce.Z)(t),this.managers.dialogsStorage.getNextDialog(this.chat.peerId,"ArrowDown"===s,Ji.default.filterId).then((e=>{e&&this.setPeer({peerId:e.peerId})}));if((null===(i=null==r?void 0:r.input)||void 0===i?void 0:i.messageInput)&&t.target!==r.input.messageInput&&"INPUT"!==a.tagName&&!a.isContentEditable&&!c.Z&&(!o.Z.isMobile||this.tabId===Yr.CHAT)&&!r.selection.isSelecting&&!r.input.recording){r.input.messageInput.focus(),(0,Nt.Z)(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 Jr(this,void 0,void 0,(function*(){switch(null==e?void 0:e._){case ke.MESSAGE:{const t=e.post?(0,yt.Z)(+e.post):void 0,i=e.comment?(0,yt.Z)(+e.comment):void 0,s=e.thread?(0,yt.Z)(+e.thread):void 0;this.openUsername({userName:e.domain,lastMsgId:t,commentId:i,startParam:e.start,stack:e.stack,threadId:s});break}case ke.PRIVATE_POST:{const t=e.channel.toChatId(),i=(t.toPeerId(!0),yield this.managers.appChatsManager.getChat(t));if(!i)try{yield this.managers.appChatsManager.resolveChannel(t)}catch(e){throw(0,we.bC)({langPackKey:"LinkNotFound"}),e}const s=(0,yt.Z)(+e.post),n=e.thread?(0,yt.Z)(+e.thread):void 0;this.op({peer:i,lastMsgId:s,threadId:n,stack:e.stack});break}case ke.EMOJI_SET:case ke.STICKER_SET:new P.Z({id:e.set},e._===ke.EMOJI_SET).show();break;case ke.JOIN_CHAT:this.managers.appChatsManager.checkChatInvite(e.invite).then((t=>{t.chat&&this.managers.appChatsManager.saveApiChat(t.chat,!0),"chatInviteAlready"!==t._&&"chatInvitePeek"!==t._?new Ge(e.invite,t):this.setInnerPeer({peerId:t.chat.id.toPeerId(!0)})}),(e=>{"INVITE_HASH_EXPIRED"===e.type&&(0,we.Am)((0,L.ag)("InviteExpired"))}));break;case ke.VOICE_CHAT:no.Z&&this.joinGroupCall(e.chat_id.toPeerId(!0),e.id);break;case ke.USER_PHONE_NUMBER:this.managers.appUsersManager.resolvePhone(e.phone).then((e=>{this.setInnerPeer({peerId:e.id.toPeerId(!1)})})).catch((e=>{"PHONE_NOT_OCCUPIED"===e.type&&(0,we.bC)({langPackKey:"Alert.UserDoesntExists"})}));break;case ke.INVOICE:this.managers.appPaymentsManager.getInputInvoiceBySlug(e.slug).then((e=>{this.managers.appPaymentsManager.getPaymentForm(e).then((t=>{new Ui(void 0,e,t)}))}));break;default:this.log.warn("Not supported internal link:",e)}}))}openUrl(e){const{url:t,onclick:i}=(0,fs.Z)(e);if(!i)return;const s=document.createElement("a");s.href=t,window[i](s)}op(e){return Jr(this,void 0,void 0,(function*(){let{peer:t,commentId:i,threadId:s,lastMsgId:n}=e;const a="user"===t._,o=t.id.toPeerId(!a),r="channel"===t._&&t.pFlags.forum;if(i||s||n||!r){if(r&&n&&!s){const t=yield this.managers.appMessagesManager.reloadMessages(o,n);t?s=e.threadId=(0,b.Z)(t,r):(s=e.threadId=n,n=e.lastMsgId=void 0)}return s?this.openThread(Object.assign(Object.assign({},e),{peerId:o})):i?this.openComment({peerId:o,msgId:n,commentId:i}):this.setInnerPeer(Object.assign(Object.assign({},e),{peerId:o}))}Ji.default.toggleForumTabByPeerId(o,!0)}))}openPremiumBot(){return this.managers.apiManager.getAppConfig().then((e=>this.openUsername({userName:e.premium_bot_username})))}openUsername(e){const{userName:t}=e;return this.managers.appUsersManager.resolveUsername(t).then((t=>this.op(Object.assign({peer:t},e))),(e=>{"USERNAME_NOT_OCCUPIED"===e.type?(0,we.bC)({langPackKey:"NoUsernameFound"}):"USERNAME_INVALID"===e.type&&(0,we.bC)({langPackKey:"Alert.UserDoesntExists"})}))}openThread(e){return Jr(this,void 0,void 0,(function*(){return(yield this.managers.appChatsManager.isForum(e.peerId.toChatId()))?(yield this.managers.dialogsStorage.getForumTopicOrReload(e.peerId,e.threadId),this.setInnerPeer(e)):this.managers.appMessagesManager.reloadMessages(e.peerId,e.threadId).then((t=>(t?this.managers.appMessagesManager.generateThreadServiceStartMessage(t):e.lastMsgId=void 0,this.setInnerPeer(Object.assign(Object.assign({},e),{type:"discussion"})))))}))}openComment(e){return this.managers.appMessagesManager.getDiscussionMessage(e.peerId,e.msgId).then((t=>this.openThread({peerId:t.peerId,lastMsgId:e.commentId,threadId:t.mid})))}callUser(e,t){return Jr(this,void 0,void 0,(function*(){Tr.Z.getCallByUserId(e)||((yield this.managers.appProfileManager.getProfile(e)).pFlags.phone_calls_private?(0,Vt.Z)({peerId:e.toPeerId()}).then((e=>(0,vi.Z)({descriptionLangKey:"Call.PrivacyErrorMessage",descriptionLangArgs:[e],button:{langKey:"OK",isCancel:!0}}))):(yield this.discardCurrentCall(e.toPeerId()),Tr.Z.startCallInternal(e,"video"===t)))}))}discardCurrentCall(e,t,i){return ro.ZP.groupCall&&ro.ZP.groupCall!==t?this.discardGroupCallConfirmation(e):Tr.Z.currentCall&&Tr.Z.currentCall!==i?this.discardCallConfirmation(e):Promise.resolve()}discardCallConfirmation(e){return Jr(this,void 0,void 0,(function*(){const t=Tr.Z.currentCall;t&&(yield Promise.all([(0,Vt.Z)({peerId:t.interlocutorUserId.toPeerId(!1)}),(0,Vt.Z)({peerId:e})]).then((([t,i])=>(0,vi.Z)({titleLangKey:"Call.Confirm.Discard.Call.Header",descriptionLangKey:e.isUser()?"Call.Confirm.Discard.Call.ToCall.Text":"Call.Confirm.Discard.Call.ToVoice.Text",descriptionLangArgs:[t,i],button:{langKey:"OK"}}))),t.isClosing||(yield t.hangUp("phoneCallDiscardReasonDisconnect")))}))}discardGroupCallConfirmation(e){return Jr(this,void 0,void 0,(function*(){const t=ro.ZP.groupCall;t&&(yield Promise.all([(0,Vt.Z)({peerId:t.chatId.toPeerId(!0)}),(0,Vt.Z)({peerId:e})]).then((([t,i])=>(0,vi.Z)({titleLangKey:"Call.Confirm.Discard.Voice.Header",descriptionLangKey:e.isUser()?"Call.Confirm.Discard.Voice.ToCall.Text":"Call.Confirm.Discard.Voice.ToVoice.Text",descriptionLangArgs:[t,i],button:{langKey:"OK"}}))),ro.ZP.groupCall===t&&(yield t.hangUp()))}))}joinGroupCall(e,t){return Jr(this,void 0,void 0,(function*(){const i=e.toChatId(),s=this.managers.appChatsManager.hasRights(i,"manage_call");if(t&&"groupCallDiscarded"===(yield this.managers.appGroupCallsManager.getGroupCallFull(t))._){if(!s)return void(0,we.bC)({langPackKey:"VoiceChat.Chat.Ended"});yield(0,vi.Z)({descriptionLangKey:"VoiceChat.Chat.StartNew",button:{langKey:"VoiceChat.Chat.StartNew.OK"}})}(()=>{Jr(this,void 0,void 0,(function*(){const e=yield this.managers.appProfileManager.getChatFull(i);let t;if(e.call)t=e.call;else{if(!s)return;t=yield this.managers.appGroupCallsManager.createGroupCall(i)}ro.ZP.joinGroupCall(i,t.id,!0,!1)}))})()}))}setCurrentBackground(e=!1){var t,i;const s=yo.Z.getTheme(),n=null===(i=null===(t=s.settings)||void 0===t?void 0:t.wallpaper)||void 0===i?void 0:i.slug;if(n){const t=Vr.h.settings.themes.find((e=>e.name===s.name));return this.getBackground(n).then((t=>this.setBackground(t,e)),(()=>(s.settings=(0,Ca.Z)(t.settings),this.setCurrentBackground(!0))))}return this.setBackground("",e)}getBackground(e){return this.backgroundPromises[e]?this.backgroundPromises[e]:this.backgroundPromises[e]=this.cacheStorage.getFile("backgrounds/"+e).then((e=>URL.createObjectURL(e)))}setBackground(e,t=!0){this.lastBackgroundUrl=e;const i=this.chats.map((t=>t.setBackground(e)));return i[i.length-1].then((()=>{t&&d.Z.dispatchEvent("background_change")}))}saveChatPosition(e){if(!["chat","discussion"].includes(e.type)||!e.peerId)return;const t=e.bubbles,i=e.peerId+(e.threadId?"_"+e.threadId:""),s=Po.Z.getFromCache("chatPositions");if(t.scrollable.getDistanceToEnd()<=16&&t.scrollable.loadedAll.bottom||!t.getRenderedLength())delete s[i],this.log("deleted chat position");else{t.sliceViewport(!0);const e=t.scrollable.scrollTop,n={mids:(0,ot.Z)(t.bubbles,"desc").filter((e=>e>0&&!t.skippedMids.has(e))),top:e};s[i]=n,this.log("saved chat position:",n)}Po.Z.set({chatPositions:s},!0)}getChatSavedPosition(e){if(!["chat","discussion"].includes(e.type)||!e.peerId)return;const t=e.peerId+(e.threadId?"_"+e.threadId:""),i=Po.Z.getFromCache("chatPositions");return i&&i[t]}applyCurrentTheme(e,t,i){return t&&(this.backgroundPromises[e]=Promise.resolve(t)),yo.Z.setTheme(),this.setCurrentBackground(void 0===i?!!e:i)}chatsSelectTab(e,t){if(this.prevTab!==e){if(!1===t&&this.prevTab&&Zo([e,this.prevTab].filter(Boolean)),this.prevTab){this.prevTab.classList.remove("active"),this.chatsSelectTabDebounced(),d.Z.settings.animationsEnabled&&!1!==t&&(0,pe.YW)((0,nt.Z)(400),400);const i=(0,Ie.Z)(this.prevTab);(0,Ie.Z)(e)>i&&Un.Z.pushItem({type:"chat",onPop:e=>{this.setPeer({},e),(0,qn.Z)()}})}e.classList.add("active"),this.prevTab=e}}init(){document.addEventListener("paste",this.onDocumentPaste,!0),c.Z||this.attachDragAndDropListeners(),this.markupTooltip=new Eo(this),this.markupTooltip.handleSelection()}attachDragAndDropListeners(){const e=[],t=[];let i=!1;const s=(r,d)=>Jr(this,void 0,void 0,(function*(){if(d===i)return;const l=r.dataTransfer.types,c=l.contains?l.contains("Files"):l.indexOf("Files")>=0,h=An(),u=yield $r(r,!0);if(!c||!(yield this.canDrag())&&!h)return void(n=0);const p=h?o:a,f=h?t:e;if(d&&!f.length){const e=c&&!u.length,t=u.filter((e=>vn.Z.has(e))).length;this.log("drag files",u),h?(h.appendDrops(p),(u.length||e)&&f.push(new Mo(p,{header:"Preview.Dragging.AddItems",headerArgs:[u.length],onDrop:e=>{s(e,!1),this.log("drop",e),this.onDocumentPaste(e,"document")}}))):((u.length||e)&&f.push(new Mo(p,{icon:"dragfiles",header:"Chat.DropTitle",subtitle:"Chat.DropAsFilesDesc",onDrop:e=>{s(e,!1),this.log("drop",e),this.onDocumentPaste(e,"document")}})),(t||e)&&f.push(new Mo(p,{icon:"dragmedia",header:"Chat.DropTitle",subtitle:"Chat.DropQuickDesc",onDrop:e=>{s(e,!1),this.log("drop",e),this.onDocumentPaste(e,"media")}})),this.chat.container.append(p))}(0,Fe.Z)({element:p,className:"is-visible",forwards:d,duration:200,onTransitionEnd:()=>{d||(f.forEach((e=>{e.destroy()})),f.length=0)}}),d?f.forEach((e=>{e.setPath()})):n=0,document.body.classList.toggle("is-dragging",d),i=d}));let n=0;document.body.addEventListener("dragenter",(e=>{n++})),document.body.addEventListener("dragover",(e=>{s(e,!0),(0,Ce.Z)(e)})),document.body.addEventListener("dragleave",(e=>{n--,0===n&&s(e,!1)}));const a=document.createElement("div");a.classList.add("drops-container");const o=a.cloneNode(!0)}canDrag(){return Jr(this,void 0,void 0,(function*(){const e=this.chat;return!(!(null==e?void 0:e.peerId)||St.Z.isOverlayActive||!(yield e.canSend("send_media")))}))}overrideHash(e){return Jr(this,void 0,void 0,(function*(){let t;if(e){const i=yield this.managers.appPeersManager.getPeerUsername(e);t=i?"@"+i:""+e}Un.Z.overrideHash(t)}))}selectTab(e,t){var i;!1===t&&Zo([n.ZP.sidebarEl,this.columnEl,a.ZP.sidebarEl]),document.body.classList.toggle(n.ir,e===Yr.CHATLIST);const s=this.tabId;void 0!==s&&(this.overrideHash(e>Yr.CHATLIST?null===(i=this.chat)||void 0===i?void 0:i.peerId:void 0),this.dispatchEvent("tab_changing",e)),this.log("selectTab",e,s);let r=d.Z.settings.animationsEnabled?(0,fe.d1)():Promise.resolve();if(void 0!==s&&s!==e&&d.Z.settings.animationsEnabled&&!1!==t){const e=100+(o.Z.isMobile?250:200);r=(0,nt.Z)(e),(0,pe.YW)(r,e)}this.tabId=e,(0,qn.Z)(),o.Z.isMobile&&s===Yr.PROFILE&&es&&(e{this.setPeer({},e)}});const l=window.onImTabChange;return l&&l(e),r}updateStatus(){return this.managers.appUsersManager.updateMyOnlineStatus(this.offline)}createNewChat(){const e=new So(this,this.managers);return this.chats.length&&e.setBackground(this.lastBackgroundUrl,!0),this.chats.push(e),e}spliceChats(e,t=!0,i,s){if(e>=this.chats.length)return;const n=this.chat;this.chats.length>1&&t&&this.dispatchEvent("peer_changing",this.chat),s||(s=this.chats.splice(e,this.chats.length-e));const o=this.chat;this.dispatchEvent("chat_changing",{from:n,to:o});for(let e=0;e1&&s.slice(0,-1).forEach((e=>{e.container.remove()})),this.chatsSelectTab(o.container,i),t){this.dispatchEvent("peer_changed",o);const e=a.ZP.getTab(po);null==e||e.close(),a.ZP.replaceSharedMediaTab(o.sharedMediaTab)}s.forEach((e=>{e.beforeDestroy()})),setTimeout((()=>{s.forEach((e=>{e.destroy()}))}),350)}setPeer(e={},t){var i;return Jr(this,void 0,void 0,(function*(){this.init&&(this.init(),this.init=null),null!==(i=e.peerId)&&void 0!==i||(e.peerId=m.NM);const{peerId:s,lastMsgId:a,threadId:r}=e,d=this.chat,l=this.chats.indexOf(d),c=this.isSamePeer(d,e);if(s){if(l>0&&d.peerId&&!c){const t=this.chats.splice(1,this.chats.length-1);if(this.chat.peerId===s)return void this.spliceChats(0,!0,!0,t);{const i=this.setPeer(e);return this.spliceChats(0,!1,!1,t),i}}}else{if(l>0)return void this.spliceChats(l,void 0,t);if(o.Z.activeScreen===o._.medium)return void this.selectTab(+!this.tabId,t)}if(c&&o.Z.activeScreen<=o._.medium&&document.body.classList.contains(n.ir))return this.selectTab(Yr.CHAT,t),!1;if(s||o.Z.activeScreen!==o._.mobile){const i=yield d.setPeer(e),n=(null==i?void 0:i.cached)?i.promise:Promise.resolve();s&&Promise.all([n,d.setBackgroundPromise]).then((()=>{setTimeout((()=>{setTimeout((()=>{this.chatsSelectTab(this.chat.container)}),0),this.selectTab(Yr.CHAT,t)}),0)}))}return s?void 0:(this.selectTab(Yr.CHATLIST,t),!1)}))}setInnerPeer(e){var t;return Jr(this,void 0,void 0,(function*(){const{peerId:i}=e;if(i===m.NM||!i)return;e.type||(e.threadId&&!(yield this.managers.appPeersManager.isForum(e.peerId))&&(e.type="discussion"),null!==(t=e.type)&&void 0!==t||(e.type="chat"));const s=this.chats.findIndex((t=>this.isSamePeer(t,e)||o.Z.activeScreen===o._.mobile&&0===this.tabId));if(-1!==s)return this.spliceChats(s+1),this.setPeer(e);const n=this.chat;let a=n;return n.inited&&(a=this.createNewChat()),this.dispatchEvent("chat_changing",{from:n,to:a}),this.setPeer(e)}))}openScheduled(e){this.setInnerPeer({peerId:e,type:"scheduled"})}getTypingElement(e){const t=document.createElement("span");let i="peer-typing";switch(t.classList.add(i),t.dataset.action=e._,e._){case"sendMessageTypingAction":i+="-text";for(let e=0;e<3;++e){const e=document.createElement("span");e.className=i+"-dot",t.append(e)}break;case"sendMessageUploadAudioAction":case"sendMessageUploadDocumentAction":case"sendMessageUploadRoundAction":case"sendMessageUploadVideoAction":case"sendMessageUploadPhotoAction":i+="-upload";break;case"sendMessageRecordAudioAction":case"sendMessageRecordRoundAction":case"sendMessageRecordVideoAction":i+="-record";break;case"sendMessageEmojiInteractionSeen":case"sendMessageChooseStickerAction":i+="-choosing-sticker";for(let e=0;e<2;++e){const e=document.createElement("div");e.className=i+"-eye",t.append(e)}}return t.classList.add(i),t}getPeerTyping(e,t,i){return Jr(this,void 0,void 0,(function*(){const s=e.isUser();if(s&&(yield this.managers.appUsersManager.isBot(e)))return;const n=yield this.managers.appProfileManager.getPeerTypings(e,i);if(!(null==n?void 0:n.length))return;const a=n[0],o={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"}},r=s?o.private:n.length>1?o.multi:o.chat;let d=a.action;if(n.length>1){const e={};n.forEach((t=>{const i=t.action._;void 0===e[i]&&(e[i]=0),++e[i]})),Object.keys(e).length>1&&(d={_:"sendMessageTypingAction"})}const l=r[d._];if(!l)return;let c,h;if(e.isAnyChat()){const e=new N.Z;c=e.update({peerId:a.userId.toPeerId(!1),onlyFirstName:!0}),h=[e.element,n.length-1],yield c}t||(t=document.createElement("span")).classList.add("online","peer-typing-container"),t.classList.toggle("peer-typing-flex","sendMessageChooseStickerAction"===d._||"sendMessageEmojiInteractionSeen"===d._);let u=t.firstElementChild;if(u?u.dataset.action!==d._&&u.replaceWith(this.getTypingElement(d)):(u=this.getTypingElement(d),t.prepend(u)),"sendMessageEmojiInteractionSeen"===d._){h?h.pop():h=[];const e=(0,Ar.Z)((0,B.Z)(d.emoticon));h.push(e)}const p=(0,L.ag)(l,h);return p.classList.add("peer-typing-description"),t.childElementCount>1?t.lastElementChild.replaceWith(p):t.append(p),t}))}getChatStatus(e,t){return Jr(this,void 0,void 0,(function*(){const i=t?void 0:yield this.getPeerTyping(e.toPeerId(!0));if(i)return{cached:!0,result:Promise.resolve(i)};const s=yield this.managers.acknowledged.appProfileManager.getChatFull(e),n=Promise.resolve(s.result).then((t=>Jr(this,void 0,void 0,(function*(){var i,s;const n=t.participants_count||(null===(s=null===(i=t.participants)||void 0===i?void 0:i.participants)||void 0===s?void 0:s.length)||1;let a=yield(0,ka.Z)(e);if(n<2)return a;const o=yield this.managers.appProfileManager.getOnlines(e);if(o>1){const e=document.createElement("span");e.append(...(0,L.v_)([a,(0,L.ag)("OnlineCount",[(0,ze.Z)(o)])],!1)),a=e}return a}))));return{cached:s.cached,result:n}}))}getUserStatus(e,t){var i;return Jr(this,void 0,void 0,(function*(){const s={cached:!0,result:Promise.resolve(void 0)},n=yield this.managers.appUsersManager.getUser(e);if(!n||n.pFlags.self&&!t)return s;const a=(0,Ks.Z)(n);if(!n.pFlags.bot&&!n.pFlags.support){let t=yield this.getPeerTyping(e.toPeerId());if(t||"userStatusOnline"!==(null===(i=n.status)||void 0===i?void 0:i._)||(t=document.createElement("span"),t.classList.add("online"),t.append(a)),t)return s.result=Promise.resolve(t),s}return s.result=Promise.resolve(a),s}))}getPeerStatus(e,t,i){return Jr(this,void 0,void 0,(function*(){if(!e)return;let s;return s=e.isAnyChat()?this.getChatStatus(e.toChatId(),i):this.getUserStatus(e.toUserId(),t),s}))}setPeerStatus(e){return Jr(this,void 0,void 0,(function*(){const{peerId:t,element:i,needClear:s,useWhitespace:n,middleware:a,ignoreSelf:o,noTyping:r}=e;if(!s){const e=i.querySelector(".peer-typing-container");if(e&&(yield this.getPeerTyping(t,e)))return}const d=yield this.getPeerStatus(t,o,r);if(!a())return;const l=()=>Jr(this,void 0,void 0,(function*(){const e=d&&(yield d.result);if(a())return()=>(0,H.Z)(i,e||c)})),c=n?"โ€Ž":"";return!d||d.cached||void 0===s?yield l():s?()=>(i.textContent=c,l().then((e=>null==e?void 0:e()))):void 0}))}setChoosingStickerTyping(e){this.managers.appMessagesManager.setTyping(this.chat.peerId,{_:e?"sendMessageCancelAction":"sendMessageChooseStickerAction"},void 0,this.chat.threadId)}isSamePeer(e,t){return e.peerId===t.peerId&&e.threadId===t.threadId&&(typeof e.type!=typeof t.type||e.type===t.type)}}const td=new ed;ge.GO&&(ge.GO.appImManager=td);const id=td},3709:(e,t,i)=>{"use strict";function s(e){var t;return e&&!e.pFlags.is_outgoing&&!e.pFlags.noforwards&&!(null===(t=e.media)||void 0===t?void 0:t.extended_media)}i.d(t,{Z:()=>s})},7530:(e,t,i)=>{"use strict";function s(e){var t;if(!e)return;let i;if(e.action)i=e.action.photo;else if(e.media){let s=e.media;s.webpage?s=s.webpage:"messageExtendedMedia"===(null===(t=s.extended_media)||void 0===t?void 0:t._)&&(s=s.extended_media.media),i=s.document||s.photo}return i}i.d(t,{Z:()=>s})},2291:(e,t,i)=>{"use strict";function s(e){var t;return e.fromId?{peerId:e.fromId}:{fromName:null===(t=e.fwd_from)||void 0===t?void 0:t.from_name}}i.d(t,{Z:()=>s})},5381:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(677);function n(e){return!(!e.restriction_reason||!(0,s.X)(e.restriction_reason))}},5990:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});const s=["#fc5c51","#0fb297","#d09306","#3d72ed","#895dd5","#cd4073","#00c1a6","#fa790f"],n=["red","green","yellow","blue","violet","pink","cyan","orange"],a=[0,7,4,1,6,3,5];function o(e,t=!0){if(!e)return"";const i=a[Math.abs(+e)%7];return(t?n:s)[i]}},6082:(e,t,i)=>{"use strict";function s(e){if(e.username)return e.username;const t=e.usernames,i=null==t?void 0:t.find((e=>e.pFlags.editable));return null==i?void 0:i.username}i.d(t,{Z:()=>s})},2946:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(5880),n=i(1507);function a(e){if(void 0!==e&&e.isPeerId&&e.isPeerId())return e;if((0,s.Z)(e)){const t=e.user_id;if(void 0!==t)return t.toPeerId(!1);const i=e.channel_id||e.chat_id;return void 0!==i?i.toPeerId(!0):n.NM}if(!e)return n.NM;const t="u"===e.charAt(0),i=e.substr(1).split("_");return t?i[0].toPeerId():(i[0]||"").toPeerId(!0)}},7030:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(9897),n=i(1507);function a(e,t=0,i=0,a=!1,o=!1){window.devicePixelRatio>1&&(t*=2,i*=2);let r=e.sizes||e.thumbs,d={_:"photoSizeEmpty",type:n.Pt};if(o&&r&&"photo"!==e._&&(r=r.concat({_:"photoSize",w:e.w,h:e.h,size:e.size,type:n.Pt})),null==r?void 0:r.length){for(let e=0,n=r.length;e=t||a.height>=i)break}a&&"photoSizeEmpty"===d._&&"photoStrippedSize"===r[0]._&&(d=r[0])}return d}},3075:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(5953),n=i(5003),a=i(6752);class o{constructor(e){var t;(0,s.Z)(this,e),this.log||(this.log=(null===(t=this.connection)||void 0===t?void 0:t.log)||(0,n.kg)("CALL-CONNECTION-BASE")),this.sources={}}createPeerConnection(e){return this.connection||(this.connection=function(e,t){t||(t=(0,n.kg)("RTCPeerConnection")),t("constructor");const i=new RTCPeerConnection(e);return i.addEventListener("track",(e=>{t("ontrack",e)})),i.addEventListener("signalingstatechange",(()=>{t("onsignalingstatechange",i.signalingState)})),i.addEventListener("connectionstatechange",(()=>{t("onconnectionstatechange",i.connectionState)})),i.addEventListener("negotiationneeded",(()=>{t("onnegotiationneeded",i.signalingState)})),i.addEventListener("icecandidate",(e=>{t("onicecandidate",e)})),i.addEventListener("iceconnectionstatechange",(()=>{t("oniceconnectionstatechange",i.iceConnectionState)})),i.addEventListener("datachannel",(()=>{t("ondatachannel")})),i.log=t,{connection:i}}(e,this.log.bindPrefix("connection")).connection)}createDataChannel(e){return this.dataChannel||(this.dataChannel=function(e,t,i){i||(i=(0,n.kg)("RTCDataChannel"));const s=e.createDataChannel("data",t);return s.addEventListener("message",(e=>{i("onmessage",e)})),s.addEventListener("open",(()=>{i("onopen")})),s.addEventListener("close",(()=>{i("onclose")})),s.log=i,s}(this.connection,e,this.log.bindPrefix("data")))}createDescription(){return this.description||(this.description=new a.ZP(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(){return this.negotiating||(this.negotiating=this.negotiateInternal().finally((()=>{this.negotiating=void 0})))}sendDataChannelData(e){"open"===this.dataChannel.readyState&&this.dataChannel.send(JSON.stringify(e))}}},2069:(e,t,i)=>{"use strict";i.d(t,{Z:()=>N});var s=i(6761),n=i(4762),a=i(5953),o=i(5701),r=i(671),d=i(5003),l=i(3855),c=i(3075),h=i(3773);function u(e){const t=(0,h.Z)(e,e.media[0]),i={"@type":"InitialSetup",fingerprints:[t.fingerprint],ufrag:t.ufrag,pwd:t.pwd,audio:void 0,video:void 0,screencast:void 0},s=e=>""+e;for(const t of e.media){const n=t.mediaType;if("application"===n||!t.isSending)continue;const a=i["video"===n&&i.video?"screencast":n]={},o=(0,h.Z)(e,t);a.ssrc=s(o.source),o.sourceGroups&&(a.ssrcGroups=o.sourceGroups.map((e=>({semantics:e.semantics,ssrcs:e.sources.map(s)}))));const r=a.rtpExtensions=[];t.attributes.get("extmap").forEach((e=>{r.push({id:+e.key,uri:e.value})}));const d=new Map,l=e=>{let t=d.get(e);return t||d.set(e,t={id:e}),t};t.attributes.get("rtpmap").forEach((e=>{const t=+e.key,i=l(t),s=e.value.split("/"),[n,a,o]=s;i.name=n,i.clockrate=+a,i.channels=o?+o:0})),t.attributes.get("rtcp-fb").forEach((e=>{const t=+e.key;l(t).feedbackTypes=e.lines.map((e=>{const t=e.split(" "),[i,s]=t;return{type:i,subtype:s||""}}))})),t.attributes.get("fmtp").forEach((e=>{const t=+e.key,i=l(t).parameters={},s=e.value.split(";");for(const e of s){const[t,s]=e.split("=");i[t]=s}})),a.payloadTypes=Array.from(d.values())}return i}var p=i(9124);class f extends c.Z{constructor(e){super(e)}negotiateInternal(){return e=this,t=void 0,s=function*(){const{connection:e,call:t}=this;if(!e.localDescription&&!e.remoteDescription&&!t.isOutgoing)return;let i;if(t.offerReceived){t.offerReceived=!1;const s=i=yield e.createAnswer();this.log("[sdp] local",s.type,s.sdp),yield e.setLocalDescription(s),this.log("[InitialSetup] send 2")}else{const s=i=yield e.createOffer();this.log("[sdp] local",s.sdp),yield e.setLocalDescription(s),t.offerSent=!0,this.log("[InitialSetup] send 0")}const s=u((0,p.DV)(i.sdp));t.sendCallSignalingData(s)},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var m=i(8500),g=i(2493),v=i(3335),b=i(1677),y=i(49),w=i(6752),S=i(4903);const C="undefined"!=typeof window&&"crypto"in window?window.crypto.subtle:self.crypto.subtle;var L=i(9818),E=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class I{constructor(e,t){this.isOutgoing=e,this.p2pKey=t,this.type="Signaling",this.counter=0,this.seqMap=new Map}concatSHA256(e){return t=(0,S.Z)(...e),C.digest("SHA-256",(0,L.Z)(t)).then((e=>new Uint8Array(e)));var t}encryptPrepared(e){return E(this,void 0,void 0,(function*(){const t={counter:0,bytes:new Uint8Array(16+e.length)},i=(this.isOutgoing?0:8)+("Signaling"===this.type?128:0),s=this.p2pKey,n=yield this.concatSHA256([s.subarray(i+88,i+88+32),e]),a=t.bytes;for(let e=0;e<16;++e)a[e]=n[e+8];const o=yield this.prepareAesKeyIv(s,a,i),r=yield this.aesProcessCtr(e,e.length,o,!0);return t.bytes=new Uint8Array([...t.bytes.subarray(0,16),...r]),t}))}encryptRawPacket(e){const t=++this.counter,i=new ArrayBuffer(4);new DataView(i).setUint32(0,t>>>0,!1);const s=new Uint8Array([...new Uint8Array(i),...e]);return this.encryptPrepared(s)}prepareAesKeyIv(e,t,i){return E(this,void 0,void 0,(function*(){const[s,n]=yield Promise.all([this.concatSHA256([t.subarray(0,16),e.subarray(i,i+36)]),this.concatSHA256([e.subarray(40+i,40+i+36),t.subarray(0,16)])]);return{key:new Uint8Array([...s.subarray(0,8),...n.subarray(8,24),...s.subarray(24,32)]),iv:new Uint8Array([...n.subarray(0,4),...s.subarray(8,16),...n.subarray(24,28)])}}))}aesProcessCtr(e,t,i,s=!0){return E(this,void 0,void 0,(function*(){const t=yield C.importKey("raw",i.key,{name:"AES-CTR"},!1,[s?"encrypt":"decrypt"]),n=yield C[s?"encrypt":"decrypt"]({name:"AES-CTR",counter:i.iv,length:8*i.iv.length},t,e);return new Uint8Array(n)}))}constTimeIsDifferent(e,t,i){let s=!0;for(let n=0;n134217728)return;const{isOutgoing:t,type:i}=this,s=(t?8:0)+("Signaling"===i?128:0),n=this.p2pKey,a=e.subarray(0,16),o=e.subarray(16),r=e.length-16,d=yield this.prepareAesKeyIv(n,a,s),l=yield this.aesProcessCtr(o,r,d,!1),c=yield this.concatSHA256([n.subarray(88+s,88+s+32),l]);if(this.constTimeIsDifferent(c.subarray(8),a,16))return;const h=new DataView(l.buffer).getUint32(0);return this.seqMap.has(h)?void 0:(this.seqMap.set(h,h),l.slice(4))}))}}var M=i(630);class P{static generateOffer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a],r=new M.Z;r.add("v=0","o=- 1 2 IN IP4 127.0.0.1","s=-","t=0 0"),t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r.add(`a=fingerprint:${t} ${i}`,`a=setup:${s}`)})),i&&s&&r.add(`a=ice-ufrag:${i}`,`a=ice-pwd:${s}`),r.add("a=group:BUNDLE 0 1 2","a=extmap-allow-mixed","a=msid-semantic: WMS *");const d="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}`,"c=IN IP4 0.0.0.0","a=rtcp:9 IN IP4 0.0.0.0","a=ice-options:trickle",`a=mid:${e}`,"a=sendrecv",A(l)),s&&r.add(`a=msid:${d} audio${s}`),r.add("a=rtcp-mux",_(a),F(i,s,n,d));break;case"video":r.add(`m=video 61986 UDP/TLS/RTP/SAVPF ${a.map((e=>e.id)).join(" ")}`,"c=IN IP4 0.0.0.0","a=rtcp:9 IN IP4 0.0.0.0","a=ice-options:trickle",`a=mid:${e}`,"a=sendrecv",A(l)),s&&r.add(`a=msid:${d} video${s}`),r.add("a=rtcp-mux","a=rtcp-rsize",_(a),F(i,s,n,d))}}return r.add("m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144"),r.finalize()}static generateAnswer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a],r=new M.Z;r.add("v=0","o=- 1 2 IN IP4 127.0.0.1","s=-","t=0 0"),t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r.add(`a=fingerprint:${t} ${i}`,`a=setup:${s}`)})),i&&s&&r.add(`a=ice-ufrag:${i}`,`a=ice-pwd:${s}`),r.add("a=group:BUNDLE 0 1 2","a=extmap-allow-mixed","a=msid-semantic: WMS *");const d="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}`,"c=IN IP4 0.0.0.0","a=rtcp:9 IN IP4 0.0.0.0","a=ice-options:trickle",`a=mid:${e}`,"a=sendrecv",A(l)),s&&r.add(`a=msid:${d} audio${s}`),r.add("a=rtcp-mux",_(a),F(i,s,n,d));break;case"video":r.add(`m=video 61986 UDP/TLS/RTP/SAVPF ${a.map((e=>e.id)).join(" ")}`,"c=IN IP4 0.0.0.0","a=rtcp:9 IN IP4 0.0.0.0","a=ice-options:trickle",`a=mid:${e}`,"a=sendrecv",A(l)),s&&r.add(`a=msid:${d} video${s}`),r.add("a=rtcp-mux","a=rtcp-rsize",_(a),F(i,s,n,d))}}return r.add("m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144"),r.finalize()}}class Z{static generateOffer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];let r="v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0";t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r+=`\na=fingerprint:${t} ${i}\na=setup:${s}`})),i&&s&&(r+=`\na=ice-ufrag:${i}\na=ice-pwd:${s}`),r+="\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *";const d="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=A(l),r+="\na=rtcp-mux",r+=_(a),r+=F(i,s,n,d);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${a.map((e=>e.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=A(l),r+="\na=rtcp-mux\na=rtcp-rsize",r+=_(a),r+=F(i,s,n,d)}}return r+="m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144",r+="\n",r}static generateAnswer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];let r="v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0";t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r+=`\na=fingerprint:${t} ${i}\na=setup:${s}`})),i&&s&&(r+=`\na=ice-ufrag:${i}\na=ice-pwd:${s}`),r+="\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *";const d="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=A(h),r+="\na=rtcp-mux",r+=_(l),r+=F(i,n,a,d);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${l.map((e=>e.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=A(h),r+="\na=rtcp-mux\na=rtcp-rsize",r+=_(l),r+=F(i,n,a,d)}}return r+="m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144",r+="\n",r}}class T{static generateOffer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];if(!o.length)return"v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n";let r="v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0";t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r+=`\na=fingerprint:${t} ${i}\na=setup:${s}`})),i&&s&&(r+=`\na=ice-ufrag:${i}\na=ice-pwd:${s}`),r+="\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *";const d="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${e}\na=sendrecv`,r+=A(l),s&&(r+=`\na=msid:${d} audio${s}`),r+="\na=rtcp-mux",r+=_(a),r+=F(i,s,n,d);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${a.map((e=>e.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${e}\na=sendrecv`,r+=A(l),s&&(r+=`\na=msid:${d} video${s}`),r+="\na=rtcp-mux\na=rtcp-rsize",r+=_(a),r+=F(i,s,n,d)}}return r+="m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144",r+="\n",r}static generateAnswer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];if(!o.length)return"v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n";let r="v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0";t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r+=`\na=fingerprint:${t} ${i}\na=setup:${s}`})),i&&s&&(r+=`\na=ice-ufrag:${i}\na=ice-pwd:${s}`),r+="\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *";const d="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${e}\na=sendrecv`,r+=A(l),s&&(r+=`\na=msid:${d} audio${s}`),r+="\na=rtcp-mux",r+=_(a),r+=F(i,s,n,d);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${a.map((e=>e.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${e}\na=sendrecv`,r+=A(l),s&&(r+=`\na=msid:${d} video${s}`),r+="\na=rtcp-mux\na=rtcp-rsize",r+=_(a),r+=F(i,s,n,d)}}return r+="m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144",r+="\n",r}}function k(){return navigator.userAgent.toLowerCase().indexOf("firefox")>-1}function x(){return navigator.userAgent.toLowerCase().indexOf("safari")>-1&&-1===navigator.userAgent.toLowerCase().indexOf("chrome")}function A(e){let t=[];for(let i=0;i{const{type:i,subtype:s}=e;t.push(`a=rtcp-fb:${n} ${[i,s].join(" ")}`)})),l){const e=[];Object.getOwnPropertyNames(l).forEach((t=>{e.push(`${t}=${l[t]}`)})),t.push(`a=fmtp:${n} ${e.join(";")}`)}}return t.join("\n")}function F(e,t,i,s){let n=[];return i&&i.length>0?i.forEach((t=>{t&&t.ssrcs.length>0&&(n.push(`a=ssrc-group:${t.semantics} ${t.ssrcs.join(" ")}`),t.ssrcs.forEach((t=>{n.push(`a=ssrc:${t} cname:stream${t}`,`a=ssrc:${t} msid:${s} ${e}${t}`,`a=ssrc:${t} mslabel:${e}${t}`,`a=ssrc:${t} label:${e}${t}`)})))})):t&&n.push(`a=ssrc:${t} cname:stream${t}`,`a=ssrc:${t} msid:${s} ${e}${t}`,`a=ssrc:${t} mslabel:${e}${t}`,`a=ssrc:${t} label:${e}${t}`),n.join("\n")}class D{static generateCandidate(e){if(!e)return null;const{sdpString:t,sdpMLineIndex:i,sdpMid:s,foundation:n,component:a,protocol:o,priority:r,address:d,type:l,relAddress:c,generation:h,tcpType:u,networkId:p,networkCost:f,username:m}=e;if(t)return{candidate:t,sdpMLineIndex:i,sdpMid:s};throw"no sdpString"}static generateOffer(e){return k()?Z.generateOffer(e):x()?T.generateOffer(e):P.generateOffer(e)}static generateAnswer(e){return k()?Z.generateAnswer(e):x()?T.generateAnswer(e):P.generateAnswer(e)}}var R=i(9585),B=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class N extends m.Z{constructor(e){super(),this.log=(0,d.kg)("CALL"),this.protocol||(this.protocol={_:"phoneCallProtocol",pFlags:{udp_p2p:!0,udp_reflector:!0},min_layer:92,max_layer:92,library_versions:["4.0.0"]}),(0,a.Z)(this,e),this.createdAt=Date.now(),this.offerReceived=!1,this.offerSent=!1,this.decryptQueue=[],this.candidates=[],this.addEventListener("state",(e=>{this.log("state",v.Z[e]),e===v.Z.CLOSED&&this.cleanup()}));const t=this.streamManager=new R.Z(b.iK);t.direction="sendrecv",t.types.push("screencast"),this.isOutgoing||(t.locked=!0,t.canCreateConferenceEntry=!1);let i={"@type":"MediaState",type:"input",lowBattery:!1,muted:!0,screencastState:"inactive",videoRotation:0,videoState:"inactive"};const s=this;i=new Proxy(i,{set:function(e,t,n){return e[t]=n,s.setMediaState(i),s.sendMediaState(),!0}}),this.mediaStates={input:i},this.sendMediaState=(0,o.Z)(this._sendMediaState.bind(this),0,!1,!0)}get connectionState(){const{_connectionState:e,connectionInstance:t}=this;if(void 0!==e)return e;if(t){const{iceConnectionState:e}=t.connection;return"closed"===e?v.Z.CLOSED:"connected"===e||n.IS_SAFARI&&"completed"===e?v.Z.CONNECTED:v.Z.CONNECTING}return v.Z.CONNECTING}get sortIndex(){const e=this.connectionState;let t=1e13*(v.Z.CLOSED-e+1);return t+=2147483647e3-(e===v.Z.PENDING&&this.isOutgoing?0:this.createdAt),t}getVideoElement(e){if("input"===e)return this.elements.get("main");{const e=this.getMediaState("output");if(!e)return;const t="active"===e.videoState?"video":"active"===e.screencastState?"screencast":void 0;if(!t)return;const i=this.description.findEntry((e=>e.type===t));if(!i)return;return this.elements.get(""+i.recvEntry.source)}}startScreenSharingInternal(){return B(this,void 0,void 0,(function*(){try{this.wasStartingScreen=!0,this.wasStartingVideo=!1,this.streamManager.types=["audio","screencast"],yield this.requestScreen()}catch(e){this.log.error("startScreenSharing error",e)}}))}toggleScreenSharing(){return B(this,void 0,void 0,(function*(){return this.isSharingVideo&&(yield this.stopVideoSharing()),this.isSharingScreen?this.stopVideoSharing():this.startScreenSharingInternal()}))}startVideoSharingInternal(){return B(this,void 0,void 0,(function*(){try{this.wasStartingScreen=!1,this.wasStartingVideo=!0,this.streamManager.types=["audio","video"],yield this.requestInputSource(!1,!0,!1)}catch(e){this.log.error("startVideoSharing error",e)}}))}stopVideoSharing(){return B(this,void 0,void 0,(function*(){const e=this.getMediaState("input");e.videoState=e.screencastState="inactive";const{streamManager:t,description:i}=this,s=t.inputStream.getVideoTracks()[0];s&&((0,y.Z)(s),t.appendToConference(i))}))}toggleVideoSharing(){return B(this,void 0,void 0,(function*(){return this.isSharingScreen&&(yield this.stopVideoSharing()),this.isSharingVideo?this.stopVideoSharing():this.startVideoSharingInternal()}))}getMediaState(e){return this.mediaStates[e]}setMediaState(e){this.mediaStates[e.type]=e,this.dispatchEvent("mediaState",e)}isSharingVideoType(e){try{return super.isSharingVideo&&!!(this.wasStartingScreen&&"screencast"===e||this.wasStartingVideo&&"video"===e)}catch(e){return!1}}get isSharingVideo(){return this.isSharingVideoType("video")}get isSharingScreen(){return this.isSharingVideoType("screencast")}get isMuted(){const e=this.streamManager.inputStream.getAudioTracks()[0];return!(null==e?void 0:e.enabled)}get isClosing(){const{connectionState:e}=this;return e===v.Z.CLOSING||e===v.Z.CLOSED}get description(){var e;return null===(e=this.connectionInstance)||void 0===e?void 0:e.description}setHangUpTimeout(e,t){this.clearHangUpTimeout(),this.hangUpTimeout=s.Z.setTimeout((()=>{this.hangUpTimeout=void 0,this.hangUp(t)}),e)}clearHangUpTimeout(){void 0!==this.hangUpTimeout&&(clearTimeout(this.hangUpTimeout),this.hangUpTimeout=void 0)}setPhoneCall(e){this.call=e;const{id:t}=e;if(this.id!==t){const e=this.id;this.id=t,this.dispatchEvent("id",t,e)}}acceptCall(){var e;return B(this,void 0,void 0,(function*(){const t=null===(e=(yield Promise.all(this.dispatchResultableEvent("acceptCallOverride")))[0])||void 0===e||e;if(this.isClosing||!t)return;this.overrideConnectionState(v.Z.EXCHANGING_KEYS);const i=this.call;this.requestInputSource(!0,!!i.pFlags.video,!1);const s=i.g_a_hash;this.managers.appCallsManager.generateDh().then((e=>B(this,void 0,void 0,(function*(){return this.dh={g_a_hash:s,b:e.a,g_b:e.g_a,g_b_hash:e.g_a_hash,p:e.p},this.managers.apiManager.invokeApi("phone.acceptCall",{peer:yield this.managers.appCallsManager.getCallInput(this.id),protocol:this.protocol,g_b:this.dh.g_b})})))).then((e=>B(this,void 0,void 0,(function*(){yield this.managers.appCallsManager.savePhonePhoneCall(e)})))).catch((e=>{this.log.error("accept call error",e),this.hangUp("phoneCallDiscardReasonHangup")}))}))}joinCall(){this.log("joinCall"),this.getEmojisFingerprint(),this.overrideConnectionState();const{isOutgoing:e,encryptionKey:t,streamManager:i}=this,s=function(e){const t=[];return e.connections.forEach((e=>{switch(e._){case"phoneConnectionWebrtc":{const{ip:i,ipv6:s,port:n,username:a,password:o}=e,r=[];e.pFlags.turn?(i&&r.push(`turn:${i}:${n}`),s&&r.push(`turn:[${s}]:${n}`)):e.pFlags.stun&&(i&&r.push(`stun:${i}:${n}`),s&&r.push(`stun:[${s}]:${n}`)),r.length>0&&t.push({urls:r,username:a,credential:o});break}}})),{iceServers:t,iceTransportPolicy:e.pFlags.p2p_allowed?"all":"relay"}}(this.call);if(this.log("joinCall configuration",s),!s)return;const n=this.connectionInstance=new f({call:this,streamManager:i,log:this.log.bindPrefix("connection")}),a=n.createPeerConnection(s);a.addEventListener("iceconnectionstatechange",(()=>{const e=this.connectionState;void 0===this.connectedAt&&e===v.Z.CONNECTED&&(this.connectedAt=Date.now()),this.dispatchEvent("state",e)})),a.addEventListener("negotiationneeded",(()=>{n.negotiate()})),a.addEventListener("icecandidate",(e=>{const{candidate:t}=e;a.log("onicecandidate",t),(null==t?void 0:t.candidate)&&this.sendIceCandidate(t)})),a.addEventListener("track",(e=>{const{track:t}=e;a.log("ontrack",t),this.onTrack(e)})),n.createDescription(),this.encryptor=new I(e,t),this.decryptor=new I(!e,t),this.log("currentCall",this),e&&n.appendStreamToConference(),this.createDataChannel(),this.processDecryptQueue()}createDataChannelEntry(){const e=this.description.createEntry("application");e.setDirection("sendrecv"),e.sendEntry=e.recvEntry=e}createDataChannel(){if(this.connectionInstance.dataChannel)return;const e=this.connectionInstance.createDataChannel({id:0,negotiated:!0});e.addEventListener("message",(e=>{this.applyDataChannelData(JSON.parse(e.data))})),e.addEventListener("open",(()=>{this.sendMediaState()}))}applyDataChannelData(e){"MediaState"===e["@type"]?(e.type="output",this.log("got output media state",e),this.setMediaState(e)):this.log.error("unknown data channel data:",e)}_sendMediaState(){const{connectionInstance:e}=this;if(!e)return;const t=Object.assign({},this.getMediaState("input"));delete t.type,this.log("sendMediaState",t),e.sendDataChannelData(t)}sendCallSignalingData(e){return B(this,void 0,void 0,(function*(){const t=JSON.stringify(e),i=(new TextEncoder).encode(t),{bytes:s}=yield this.encryptor.encryptRawPacket(i);this.log("sendCallSignalingData",this.id,t),yield this.managers.apiManager.invokeApi("phone.sendSignalingData",{peer:yield this.managers.appCallsManager.getCallInput(this.id),data:s})}))}sendIceCandidate(e){this.log("sendIceCandidate",e);const{candidate:t,sdpMLineIndex:i}=e;if(0!==i)return;const s=function(e){if(!e||!e.startsWith("candidate:"))return;const t=e;e=e.substr("candidate:".length);const[i,s,n,a,o,r,...d]=e.split(" "),l={sdpString:t,foundation:i,component:s,protocol:n,priority:a,address:{ip:o,port:r}};for(let e=0;e(this.getEmojisFingerprintPromise=void 0,this.emojisFingerprint=e.map((e=>(0,r.zu)(e))))))}unlockStreamManager(){this.connectionInstance.streamManager.locked=!1,this.connectionInstance.appendStreamToConference()}doTheMagic(){return B(this,void 0,void 0,(function*(){this.connectionInstance.appendStreamToConference();const e=this.connectionInstance.connection;let t=yield e.createAnswer();this.log("[sdp] local",t.type,t.sdp),yield e.setLocalDescription(t),e.getTransceivers().filter((e=>"recvonly"===e.direction)).forEach((e=>{const t=this.connectionInstance.description.getEntryByMid(e.mid);t.transceiver=t.recvEntry.transceiver=e,e.direction="sendrecv"}));const i=this.description,s=i.entries.map((e=>e.mid)),n={type:"offer",sdp:i.generateSdp({bundle:s,entries:i.entries.filter((e=>s.includes(e.mid))),isAnswer:!0})};yield e.setRemoteDescription(n),t=yield e.createAnswer(),yield e.setLocalDescription(t);const a=u((0,p.DV)(t.sdp));this.log("[InitialSetup] send 1"),this.sendCallSignalingData(a),this.unlockStreamManager()}))}overrideConnectionState(e){this._connectionState=e,this.dispatchEvent("state",this.connectionState)}get duration(){return void 0!==this.connectedAt?(Date.now()-this.connectedAt)/1e3|0:0}onInputStream(e){super.onInputStream(e);const t=e.getVideoTracks()[0];if(t){const e=this.getMediaState("input");this.wasStartingScreen||this.wasStartingVideo||(this.wasStartingVideo=!0),this.isSharingVideo?e.videoState="active":this.isSharingScreen&&(e.screencastState="active"),t.addEventListener("ended",(()=>{this.stopVideoSharing()}),{once:!0})}e.getAudioTracks().length&&this.onMutedChange()}onMutedChange(){const e=this.isMuted;this.dispatchEvent("muted",e),this.getMediaState("input").muted=e}toggleMuted(){return this.requestAudioSource(!0).then((()=>{this.setMuted(),this.onMutedChange()}))}hangUp(e,t){return B(this,void 0,void 0,(function*(){if(!this.isClosing&&(this.discardReason=e,this.log("hangUp",e),this.overrideConnectionState(v.Z.CLOSED),this.connectionInstance&&this.connectionInstance.closeConnectionAndStream(!0),e&&!t)){let t=!1;for(const e in this.mediaStates){const i=this.mediaStates[e];t="active"===i.videoState||"active"===i.screencastState||t}yield this.managers.appCallsManager.discardCall(this.id,this.duration,e,t)}}))}performCodec(e){const t=e.payloadTypes.map((e=>Object.assign(Object.assign({},e),{"rtcp-fbs":e.feedbackTypes})));return{"rtp-hdrexts":e.rtpExtensions,"payload-types":t}}setDataToDescription(e){this.description.setData({transport:{pwd:e.pwd,ufrag:e.ufrag,fingerprints:e.fingerprints,"rtcp-mux":!0},audio:this.performCodec(e.audio),video:e.video?this.performCodec(e.video):void 0,screencast:e.screencast?this.performCodec(e.screencast):void 0})}filterNotVP8(e){this.isOutgoing||[e.video,e.screencast].filter(Boolean).forEach((e=>{const t=e.payloadTypes,i=t.findIndex((e=>"VP8"===e.name)),s=t[i],n=t.findIndex((e=>{var t;return+(null===(t=e.parameters)||void 0===t?void 0:t.apt)===s.id}));e.payloadTypes=[t[i],t[n]]}))}applyCallSignalingData(e){return B(this,void 0,void 0,(function*(){this.log("applyCallSignalingData",this,e);const{connection:t,description:i}=this.connectionInstance;switch(e["@type"]){case"InitialSetup":{this.log("[sdp] InitialSetup",e),this.filterNotVP8(e),this.setDataToDescription(e);const s=e=>e.map((e=>({_:"groupCallParticipantVideoSourceGroup",semantics:e.semantics,sources:e.ssrcs.map((e=>+e))})));[(0,w.z_)("audio",+e.audio.ssrc),e.video?(0,w.z_)("video",s(e.video.ssrcGroups)):void 0,e.screencast?(0,w.z_)("screencast",s(e.screencast.ssrcGroups)):void 0].filter(Boolean).forEach((e=>{let t=i.getEntryBySource(e.source);if(t)return;const s=i.findFreeSendRecvEntry(e.type,!1);t=new w.Lp(s.mid,e.type),t.setDirection("sendrecv"),s.recvEntry=t,i.setEntrySource(t,e.sourceGroups||e.source)})),this.createDataChannelEntry();const n=this.offerSent;this.offerSent=!1;const a=i.entries.map((e=>e.mid)),o={type:n?"answer":"offer",sdp:i.generateSdp({bundle:a,entries:i.entries.filter((e=>a.includes(e.mid))),isAnswer:!n})};this.log("[sdp] remote",o.sdp),yield t.setRemoteDescription(o),yield this.tryToReleaseCandidates(),n||(yield this.doTheMagic());break}case"Candidates":for(const t of e.candidates){const e=D.generateCandidate(t);e.sdpMLineIndex=0;const i=new RTCIceCandidate(e);this.candidates.push(i)}yield this.tryToReleaseCandidates();break;default:this.log.error("unrecognized signaling data",e)}}))}tryToReleaseCandidates(){return B(this,void 0,void 0,(function*(){const{connectionInstance:e}=this;if(!e)return;const{connection:t}=e;if(t.remoteDescription){const e=this.candidates.map((e=>this.addIceCandidate(t,e)));this.candidates.length=0,yield Promise.all(e)}else this.log("[candidates] postpone")}))}addIceCandidate(e,t){return B(this,void 0,void 0,(function*(){this.log("[candidate] start",t);try{yield e.addIceCandidate(t),this.log("[candidate] add",t)}catch(e){this.log.error("[candidate] error",t,e)}}))}processDecryptQueue(){return B(this,void 0,void 0,(function*(){const{encryptor:e}=this;if(!e)return void this.log.warn("got encrypted signaling data before the encryption key");if(!this.decryptQueue.length)return;const t=this.decryptQueue.slice();this.decryptQueue.length=0;for(const i of t){const t=yield e.decryptRawPacket(i);if(!t)continue;const s=(new TextDecoder).decode(t);try{const e=JSON.parse(s);this.log("[update] updateNewCallSignalingData",e),this.applyCallSignalingData(e)}catch(e){this.log.error("wrong signaling data",s),this.hangUp("phoneCallDiscardReasonDisconnect"),g.Z.dispatchEvent("incompatible",this.interlocutorUserId)}}}))}onUpdatePhoneCallSignalingData(e){this.decryptQueue.push(e),this.processDecryptQueue()}}},8500:(e,t,i)=>{"use strict";i.d(t,{Z:()=>p});var s=i(3241),n=i(319),a=i(9125),o=i(9337),r=i(382),d=i(5424);function l(){const e={main:{},screen:{}};return t=>{return i=this,s=void 0,a=function*(){const{isScreen:i,constraints:s}=t,n=e[i?"screen":"main"];let a=n[s.audio?"audio":"video"];a||(a=(i?r.Z:d.Z)(s,t.muted),s.audio&&!n.audio&&(n.audio=a.finally((()=>n.audio=void 0))),s.video&&!n.video&&(n.video=a.finally((()=>n.video=void 0))));try{return yield a}catch(e){throw e}},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}}window.getStreamCached=l;var c=i(312),h=i(49),u=i(9585);class p extends s.Z{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=l()}get isSharingAudio(){return!!this.streamManager.hasInputTrackKind("audio")}get isSharingVideo(){return!!this.streamManager.hasInputTrackKind("video")}fixSafariAudio(){this.audio.play().catch(n.Z)}requestAudioSource(e){return this.requestInputSource(!0,!1,e)}requestInputSource(e,t,i){const{streamManager:s}=this;if(s){const i=!e||this.isSharingAudio,s=!t||this.isSharingVideo;if(i&&s)return Promise.resolve()}const n={audio:e&&(0,a.Z)(),video:t&&(0,c.Z)()};return this.getStream({constraints:n,muted:i}).then((e=>{this.onInputStream(e)}))}requestScreen(){return this.getStream({isScreen:!0,constraints:(0,o.Z)(!0)}).then((e=>{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 i=e.getVideoTracks()[0];this.tryAddTrack({stream:e,track:i,type:"input",source:t||"main"})}tryAddTrack({stream:e,track:t,type:i,source:s}){s||(s=u.Z.getSource(e,i)),this.log("tryAddTrack",e,t,i,s);const a="output"===i,{player:o,elements:r,streamManager:d}=this,l=t.kind,c="video"===l,h=c?s:l;let p=r.get(h);c&&t.addEventListener("ended",(()=>{this.log("[track] onended"),r.delete(h)}),{once:!0}),a&&d.addTrack(e,t,i);const f=c?e:d.outputStream;if(p)p.paused&&p.play().catch(n.Z),p.srcObject=f;else{if(p=document.createElement(l),p.autoplay=!0,p.srcObject=f,p.volume=1,"undefined"!==p.sinkId){const{outputDeviceId:e}=this;e&&p.setSinkId(e)}c?(p.setAttribute("playsinline","true"),p.muted=!0):o.appendChild(p),r.set(h,p)}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)e.getTracks().forEach((e=>{(0,h.Z)(e)}));else{e.getVideoTracks().length&&this.saveInputVideoStream(e,"main");const{streamManager:t,description:i}=this;t.addStream(e,"input"),i&&t.appendToConference(i)}}}},3335:(e,t,i)=>{"use strict";var s;i.d(t,{Z:()=>n}),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"}(s||(s={}));const n=s},2493:(e,t,i)=>{"use strict";i.d(t,{Z:()=>C});var s=i(5916);let n;var a=i(410),o=i(993),r=i(1655),d=i(6519),l=i(9895),c=i(3241),h=i(7298),u=i(5003),p=i(3855),f=i(1507),m=i(3512),g=i(2069),v=i(3335),b=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const y=45e3;class w extends c.Z{construct(e){this.managers=e,this.log=(0,u.kg)("CC"),o.Z&&(this.audioAsset=null!=n?n:n=new s.Z(["call_busy.mp3","call_connect.mp3","call_end.mp3","call_incoming.mp3","call_outgoing.mp3","voip_failed.mp3"]),this.tempId=0,this.instances=new Map,this.sortedInstances=[],m.Z.addEventListener("call_update",(e=>b(this,void 0,void 0,(function*(){var t;let i=this.instances.get(e.id);switch(i&&i.setPhoneCall(e),e._){case"phoneCallDiscarded":i&&i.hangUp(null===(t=e.reason)||void 0===t?void 0:t._,!0);break;case"phoneCallAccepted":i&&i.confirmCall();break;case"phoneCallRequested":i||(i=this.createCallInstance({isOutgoing:!1,interlocutorUserId:e.admin_id}),i.overrideConnectionState(v.Z.PENDING),i.setPhoneCall(e),i.setHangUpTimeout(y,"phoneCallDiscardReasonMissed"));break;case"phoneCall":{if(!i||i.encryptionKey)break;const t=i.dh.g_a=e.g_a_or_b,s=i.dh,n=yield p.Z.invokeCrypto("sha256",t);if(!(0,l.Z)(s.g_a_hash,n)){this.log.error("Incorrect g_a_hash",s.g_a_hash,n);break}const{key:a,key_fingerprint:o}=yield this.managers.appCallsManager.computeKey(t,s.b,s.p);if(e.key_fingerprint!==o){this.log.error("Incorrect key fingerprint",e.key_fingerprint,o,t,s),i.hangUp("phoneCallDiscardReasonDisconnect");break}i.encryptionKey=a,i.joinCall();break}}})))),m.Z.addEventListener("call_signaling",(({callId:e,data:t})=>{const i=this.instances.get(e);(null==i?void 0:i.id)===e&&i.onUpdatePhoneCallSignalingData(t)})))}get currentCall(){return this.sortedInstances[0]}getCallByUserId(e){for(const[t,i]of this.instances)if(i.interlocutorUserId===e)return i}createCallInstance(e){const t=new g.Z(Object.assign({managers:this.managers},e));return t.addEventListener("state",(e=>{const i=this.currentCall;e===v.Z.CLOSED?(this.instances.delete(t.id),(0,r.Z)(this.sortedInstances,t)):(0,d.Z)(this.sortedInstances,t,"sortIndex"),e===v.Z.EXCHANGING_KEYS&&(t.wasTryingToJoin=!0);const s=void 0!==t.connectedAt;e===v.Z.EXCHANGING_KEYS||e===v.Z.CONNECTING&&s?t.setHangUpTimeout(y,"phoneCallDiscardReasonDisconnect"):t.clearHangUpTimeout(),i!==t&&i||(e===v.Z.CLOSED?t.isOutgoing||t.wasTryingToJoin?t.wasTryingToJoin&&!s?this.audioAsset.playSound("voip_failed.mp3"):this.audioAsset.playSound("phoneCallDiscardReasonBusy"===t.discardReason?"call_busy.mp3":"call_end.mp3"):this.audioAsset.stopSound():e===v.Z.PENDING?this.audioAsset.playSound(t.isOutgoing?"call_outgoing.mp3":"call_incoming.mp3",!0):e===v.Z.EXCHANGING_KEYS?this.audioAsset.playSoundIfDifferent("call_connect.mp3"):e===v.Z.CONNECTING?t.duration&&this.audioAsset.playSound("voip_connecting.mp3",!0):this.audioAsset.stopSound())})),t.addEventListener("id",((e,i)=>{void 0!==i&&this.instances.delete(i);const s=!!this.currentCall;this.instances.set(e,t),void 0===i&&this.dispatchEvent("instance",{instance:t,hasCurrent:s})})),t}startCallInternal(e,t){return b(this,void 0,void 0,(function*(){this.log("p2pStartCallInternal",e,t);const i=yield this.managers.appProfileManager.getProfile(e);if(!i)return;const{video_calls_available:s}=i.pFlags,n=this.createCallInstance({isOutgoing:!0,interlocutorUserId:e});n.requestInputSource(!0,!(!t||!s),!1),n.overrideConnectionState(v.Z.REQUESTING),n.setPhoneCall({_:"phoneCallWaiting",access_hash:"",admin_id:f.NM,date:(0,h.Z)(!0),id:--this.tempId,participant_id:e,protocol:n.protocol,pFlags:{video:t||void 0}}),this.managers.appCallsManager.generateDh().then((i=>b(this,void 0,void 0,(function*(){return n.dh=i,this.managers.appCallsManager.requestCall(e,n.protocol,n.dh.g_a_hash,t&&s)})))).then((e=>{n.overrideConnectionState(v.Z.PENDING),n.setPhoneCall(e),n.setHangUpTimeout(y,"phoneCallDiscardReasonHangup")}))}))}}const S=new w;a.GO&&(a.GO.callsController=S);const C=S},1677:(e,t,i)=>{"use strict";i.d(t,{KM:()=>s,iK:()=>n});const s=50,n=100},9078:(e,t,i)=>{"use strict";i.d(t,{Z:()=>k});var s=i(4762),n=i(1655),a=i(5953),o=i(6724),r=i(5003),d=i(1507),l=i(3512),c=i(8500),h=i(7625),u=i(3075),p=i(8479),f=i(6752),m=i(9124),g=i(4373),v=i(3773),b=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class y extends u.Z{constructor(e){super(e),this.negotiateThrottled=(0,o.Z)(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(){return this.description?this.description:super.createDescription()}appendStreamToConference(){super.appendStreamToConference()}invokeJoinGroupCall(e,t,i){return b(this,void 0,void 0,(function*(){const{groupCall:s,description:n}=this,a=s.id,o=t.map((t=>{const i=function(e,t){const i=(0,v.Z)(e,t),s=t.mediaType,n={source:i.source,sourceGroups:i.sourceGroups,type:s};i.fingerprint.setup="active";const a={fingerprints:[i.fingerprint],pwd:i.pwd,ssrc:i.source,"ssrc-groups":i.sourceGroups||[],ufrag:i.ufrag};return{params:{_:"dataJSON",data:JSON.stringify(a)},source:i.source,media:t,sourceGroups:i.sourceGroups,entry:n}}(e,t);return this.sources[i.entry.type]=i.entry,i})),r=o.find((e=>"audio"===e.media.mediaType)),d=o.find((e=>"video"===e.media.mediaType));let{source:c,params:u}=r||{};const p=d||r,f={audio:r,video:d};if(n.entries.forEach((e=>{if("sendonly"===e.direction){const t=f[e.type];if(!t)return;n.setEntrySource(e,t.sourceGroups||t.source),n.setEntryPeerId(e,l.Z.myId)}})),u!==p.params){const e=JSON.parse(p.params.data);c?e.ssrc=c:delete e.ssrc,u={_:"dataJSON",data:JSON.stringify(e)}}const m=yield this.managers.appGroupCallsManager.joinGroupCall(a,u,i),g=JSON.parse(m.params.data);return g.audio=g.audio||s.connections.main.description.audio,n.setData(g),function(e,t){["audio","video"].filter((e=>t[e])).map((e=>[t[e],e])).forEach((([t,i])=>{const s=e.find((e=>e.mediaType===i));if(!s)return;const n=(e=>{const t={};return e.attributes.get("extmap").forEach((e=>{const i=e.key.split("/",1)[0];t[i]=e.value})),t})(s);(0,h.Z)(t["rtp-hdrexts"],((e,t,s)=>{n[e.id]!==e.uri&&(s.splice(t,1),console.log("[sdp] filtered extmap:",e,t,i))}))}))}(t,g),g}))}negotiateInternal(){return b(this,void 0,void 0,(function*(){const{connection:e,description:t}=this,i="new"===e.iceConnectionState&&!t.getEntryByMid("0").source,s=this.log.bindPrefix("startNegotiation");s("start");const n=yield e.createOffer({iceRestart:!1});i&&this.dataChannel&&t.createEntry("application").setDirection("sendrecv");const{sdp:a,offer:o}=function(e){const{offer:t,data:i}=e,s=(0,m.DV)(t.sdp);let n=!1;if(e.skipAddingMulticast||(n=(0,m.e6)(s)||n),(0,h.Z)(s.media,((e,t,a)=>{if(e.isSending)return;if("application"===e.mediaType)return;const o=e.mediaLine,r=o.mediaLineParts,d=(r.ids,o.toString()),l=i[e.mediaType]["payload-types"].map((e=>""+e.id));if(d!==(0,g.Px)(e.mediaType,void 0,l)){const o=(0,v.Z)(s,e),d=Object.assign({},i);d.transport=(0,p.Z)(d.transport),d.transport.ufrag=o.ufrag,d.transport.pwd=o.pwd,d.transport.fingerprints=[o.fingerprint],d.transport.candidates=[];const l=new f.Lp(o.mid,r.type);l.setPort(r.port),o.source&&l.setSource(o.sourceGroups||o.source),l.setDirection(e.direction);const c=(new g.DY).addSsrcEntry(l,d).finalize(),h=(0,m.DV)(c).media[0];a[t]=h,n=!0}})),n){const e=s.toString();t.sdp=e}return{offer:t,sdp:s}}({offer:n,data:t});s("[sdp] setLocalDescription",o.sdp),yield e.setLocalDescription(o);const r=a.media.filter((e=>"application"!==e.mediaType&&e.isSending));if(i)try{yield this.invokeJoinGroupCall(a,r,this.options)}catch(e){this.log.error("[tdweb] joinGroupCall error",e)}const d=[],l=a.bundle;(0,h.Z)(l,((e,i,s)=>{const n=t.getEntryByMid(e);n.shouldBeSkipped(!0)&&(s.splice(i,1),d.push(n))}));const c=a.media.map((e=>{const i=e.mid;let s=t.getEntryByMid(i);return s||(s=new f.Lp(i,e.mediaType),s.setDirection("inactive")),s})),u={type:"answer",sdp:t.generateSdp({bundle:l,entries:c,isAnswer:!0})};d.forEach((e=>{t.deleteEntry(e)})),s(`[sdp] setRemoteDescription signaling=${e.signalingState} ice=${e.iceConnectionState} gathering=${e.iceGatheringState} connection=${e.connectionState}`,u.sdp),yield e.setRemoteDescription(u),s("end")}))}negotiate(){let e=this.negotiating;return e||(e=super.negotiate(),this.updateConstraints&&e.then((()=>{this.maybeUpdateRemoteVideoConstraints(),this.updateConstraints=!1})),"presentation"===this.options.type&&e.then((()=>{this.connection.getTransceivers().find((e=>{var t,i;"video"===(null===(i=null===(t=e.sender)||void 0===t?void 0:t.track)||void 0===i?void 0:i.kind)&&e.sender.setParameters(Object.assign(Object.assign({},e.sender.getParameters()),{degradationPreference:"maintain-resolution"}))}))})),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:i}=t;e.onStageEndpoints.push(i),e.constraints[i]={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 w=i(2207),S=i(9337),C=i(382),L=i(5424),E=i(312),I=i(49),M=i(9585),P=i(2946),Z=i(2059),T=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class k extends c.Z{constructor(e){super(),(0,a.Z)(this,e),this.log||(this.log=(0,r.kg)("GROUP-CALL")),this.connections||(this.connections={}),this.isSpeakingMap||(this.isSpeakingMap=new Map),this.pinnedSources=[],this.participantsSsrcs=new Map,this.hadAutoPinnedSources=new Set,this.dispatchPinnedThrottled=(0,o.Z)((()=>{this.dispatchEvent("pinned",this.pinnedSource)}),0,!1),this.addEventListener("state",(e=>{e===w.Z.CLOSED&&this.cleanup()}))}get connectionState(){return this.connections.main.connection.iceConnectionState}get state(){const{connectionState:e}=this;if("closed"===e)return w.Z.CLOSED;if("connected"===e||s.IS_SAFARI&&"completed"===e){const{participant:e}=this;return e.pFlags.can_self_unmute?e.pFlags.muted?w.Z.MUTED:w.Z.UNMUTED:w.Z.MUTED_BY_ADMIN}return w.Z.CONNECTING}get participants(){return this.managers.appGroupCallsManager.getCachedParticipants(this.id)}get isSharingScreen(){return!!this.connections.presentation}get pinnedSource(){return this.pinnedSources[this.pinnedSources.length-1]}get isMuted(){return this.state!==w.Z.UNMUTED}get isClosing(){const{state:e}=this;return e===w.Z.CLOSED}get streamManager(){return this.connections.main.streamManager}get description(){return this.connections.main.description}pinSource(e){(0,n.Z)(this.pinnedSources,e),this.pinnedSources.push(e),this.dispatchPinnedThrottled()}unpinSource(e){this.hadAutoPinnedSources.delete(e),(0,n.Z)(this.pinnedSources,e),this.dispatchPinnedThrottled()}unpinAll(){this.pinnedSources.length=0,this.dispatchPinnedThrottled()}getParticipantByPeerId(e){return T(this,void 0,void 0,(function*(){return d.NM===e?this.participant:(yield this.participants).get(e)}))}toggleMuted(){return this.requestAudioSource(!0).then((()=>this.changeUserMuted(d.NM)))}changeUserMuted(e,t){return T(this,void 0,void 0,(function*(){const i=yield this.getParticipantByPeerId(e);return d.NM===e&&i.pFlags.can_self_unmute&&(t=void 0===t?!i.pFlags.muted:t),this.editParticipant(i,{muted:t})}))}getElement(e){return super.getElement(e)}getVideoElementFromParticipantByType(e,t){let i;i=e.pFlags.self?"video"===t?"main":"presentation":e[t].source_groups[0].sources[0];const s=this.getElement(i);if(!s)return;const n=s.cloneNode();return n.srcObject=s.srcObject,{video:n,source:i}}createConnectionInstance(e){return this.connections[e.type]=new y(Object.assign({groupCall:this,log:this.log.bindPrefix(e.type),managers:this.managers},e))}changeRaiseHand(e){return this.editParticipant(this.participant,{raiseHand:e})}startScreenSharingInternal(){return T(this,void 0,void 0,(function*(){try{const e="presentation",t=yield(0,C.Z)((0,S.Z)()),i=new M.Z,s=this.createConnectionInstance({streamManager:i,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(){var e;return null!==(e=this.startScreenSharingPromise)&&void 0!==e?e: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,this.managers.appGroupCallsManager.saveApiParticipant(this.id,this.participant),this.managers.appGroupCallsManager.leaveGroupCallPresentation(this.id)):Promise.resolve()}toggleScreenSharing(){return this.isSharingScreen?this.stopScreenSharing():this.startScreenSharing()}startVideoSharingInternal(){return T(this,void 0,void 0,(function*(){const e={video:(0,E.Z)()};try{const t=yield(0,L.Z)(e,!1);this.connections.main.addInputVideoStream(t),yield this.editParticipant(this.participant,{videoPaused:!1,videoStopped:!1})}catch(t){this.log.error("startVideoSharing error",t,e)}}))}startVideoSharing(){var e;return null!==(e=this.startVideoSharingPromise)&&void 0!==e?e:this.startVideoSharingPromise=this.startVideoSharingInternal().finally((()=>{this.startVideoSharingPromise=void 0}))}stopVideoSharing(){return T(this,void 0,void 0,(function*(){const e=this.connections.main,t=e.streamManager.inputStream.getVideoTracks()[0];t&&((0,I.Z)(t),e.streamManager.appendToConference(e.description),yield this.editParticipant(this.participant,{videoStopped:!0}))}))}toggleVideoSharing(){return this.isSharingVideo?this.stopVideoSharing():this.startVideoSharing()}hangUp(e=!1,t=!1,i=!1){return T(this,void 0,void 0,(function*(){for(const e in this.connections)this.connections[e].closeConnectionAndStream(!t);if(this.dispatchEvent("state",this.state),!i&&!t){const t=e||(this.joined?this.connections.main.sources.audio.source:void 0);this.managers.appGroupCallsManager.hangUp(this.id,t)}}))}tryAddTrack(e){const{description:t}=this,i=super.tryAddTrack(e);if("output"===e.type){const e=t.getEntryBySource(+i);this.getParticipantByPeerId(e.peerId).then((e=>{e&&l.Z.dispatchEvent("group_call_participant",{groupCallId:this.id,participant:e})}))}return i}editParticipant(e,t){return T(this,void 0,void 0,(function*(){if(Object.keys(t).length){if(e){const i=e.pFlags.self;if(i&&void 0!==t.muted&&!this.isSharingAudio&&(delete t.muted,!Object.keys(t).length))return;const s=t.muted;void 0!==s&&e.pFlags.self&&(s?e.pFlags.muted=!0:e.pFlags.can_self_unmute&&delete e.pFlags.muted),void 0!==t.raiseHand&&(t.raiseHand?e.raise_hand_rating="1":delete e.raise_hand_rating),i&&(void 0!==t.videoStopped&&(t.videoStopped?delete e.video:e.video=(0,Z.KR)(this.connections.main.sources.video)),!e.pFlags.muted&&e.pFlags.can_self_unmute&&this.setMuted(!1),this.dispatchEvent("state",this.state))}return this.managers.appGroupCallsManager.editParticipant(this.id,e,t)}}))}onParticipantUpdate(e,t){const i=this.connections.main,{connection:s,description:n}=i,a=(0,P.Z)(e.peer),o=!!e.pFlags.left,r=this.participantsSsrcs.get(a)||[];if(e.presentation&&!o){const{source:t}=(0,Z._f)(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,i.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!==a&&this.dispatchEvent("state",this.state))}const d=o?[]:(0,Z.s$)(e);o?this.participantsSsrcs.delete(a):this.participantsSsrcs.set(a,d);const l=new Set;r.forEach((e=>{const t=e.source;if(!d.find((e=>e.source===t))){this.unpinSource(t);const e=n.getEntryBySource(t);e&&"inactive"!==e.direction&&(e.setDirection("inactive"),l.add(e.type))}})),d.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,a),"video"===e.type&&t.setEndpoint(e.endpoint),t.createTransceiver(s,{direction:"recvonly"}),l.add(t.type))})),l.size&&(l.has("video")&&(i.updateConstraints=!0),i.negotiateThrottled())}}},2207:(e,t,i)=>{"use strict";var s;i.d(t,{Z:()=>n}),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={}));const n=s},2059:(e,t,i)=>{"use strict";i.d(t,{ZP:()=>L,KR:()=>w,_f:()=>y,s$:()=>b});var s=i(5916);let n;var a=i(410),o=i(3241),r=i(5003),d=i(3512),l=i(9078),c=i(2207),h=i(1677),u=i(9585),p=i(9125),f=i(5424),m=i(312),g=i(6752),v=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function b(e){var t,i;return[y(0,"audio",e.source),(null===(t=e.video)||void 0===t?void 0:t.audio_source)&&y(0,"audio",e.video.audio_source),e.video&&y(0,"video",e.video.source_groups,e.video.endpoint),(null===(i=e.presentation)||void 0===i?void 0:i.audio_source)&&y(0,"audio",e.presentation.audio_source),e.presentation&&y(0,"video",e.presentation.source_groups,e.presentation.endpoint)].filter(Boolean)}function y(e,t,i,s){return(0,g.z_)(t,i,s)}function w(e,t){return e&&{_:"groupCallParticipantVideo",pFlags:{},endpoint:"",source_groups:e.sourceGroups,audio_source:t}}class S extends o.Z{construct(e){this.managers=e,this.audioAsset=null!=n?n:n=new s.Z(["group_call_connect.mp3","group_call_end.mp3","group_call_start.mp3","voip_onallowtalk.mp3"]),this.log=(0,r.kg)("GCC"),d.Z.addEventListener("group_call_update",(e=>{const{currentGroupCall:t}=this;(null==t?void 0:t.id)===e.id&&(t.groupCall=e,"groupCallDiscarded"===e._&&t.hangUp(!1,!1,!0))})),d.Z.addEventListener("group_call_participant",(({groupCallId:e,participant:t})=>{const{currentGroupCall:i}=this;(null==i?void 0:i.id)===e&&i.onParticipantUpdate(t)}))}get groupCall(){return this.currentGroupCall}setCurrentGroupCall(e){this.currentGroupCall=e,e&&this.dispatchEvent("instance",e)}startConnectingSound(){this.stopConnectingSound(),this.audioAsset.playSoundWithTimeout("group_call_connect.mp3",!0,2500)}stopConnectingSound(){this.audioAsset.stopSound(),this.audioAsset.cancelDelayedPlay()}joinGroupCall(e,t,i=!0,s,n){return v(this,void 0,void 0,(function*(){let a;return this.audioAsset.createAudio(),this.log(`joinGroupCall chatId=${e} id=${t} muted=${i} rejoin=${s}`),a=s?this.currentGroupCall.connections.main.streamManager:yield function(e,t){return i=this,s=void 0,a=function*(){const i={audio:(0,p.Z)(),video:t&&(0,m.Z)()},s=new u.Z(h.iK);try{const t=yield(0,f.Z)(i,e);s.addStream(t,"input")}catch(e){console.error("joinGroupCall getStream error",e,i),s.inputStream=new MediaStream}return s},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}(i,n),this.joinGroupCallInternal(e,t,a,i,s,n).then((()=>{const{currentGroupCall:e}=this;e.participants.then((t=>{this.currentGroupCall===e&&e.state!==c.Z.CLOSED&&t.forEach((t=>{t.pFlags.self||e.onParticipantUpdate(t)}))}))}))}))}joinGroupCallInternal(e,t,i,s,n=!1,a){return v(this,void 0,void 0,(function*(){const o=this.log.bindPrefix("joinGroupCallInternal");o("start",t);const r="main";let{currentGroupCall:h}=this;if(!h||!n){h=new l.Z({chatId:e,id:t,managers:this.managers}),h.fixSafariAudio(),h.addEventListener("state",(e=>{this.currentGroupCall===h&&e===c.Z.CLOSED&&(this.setCurrentGroupCall(null),this.stopConnectingSound(),this.audioAsset.playSound("group_call_end.mp3"),d.Z.dispatchEvent("chat_update",h.chatId))})),h.groupCall=yield this.managers.appGroupCallsManager.getGroupCallFull(t);const u=h.createConnectionInstance({streamManager:i,type:r,options:{type:r,isMuted:s,joinVideo:a,rejoin:n}}),p=u.createPeerConnection();return p.addEventListener("negotiationneeded",(()=>{u.negotiate()})),p.addEventListener("track",(e=>{o("ontrack",e),h.onTrack(e)})),p.addEventListener("iceconnectionstatechange",(()=>{h.dispatchEvent("state",h.state);const{iceConnectionState:e}=p;switch("disconnected"===e||"checking"===e||"new"===e?this.startConnectingSound():this.stopConnectingSound(),e){case"checking":case"completed":case"disconnected":case"new":break;case"closed":case"failed":h.hangUp();break;case"connected":h.joined||(h.joined=!0,this.audioAsset.playSound("group_call_start.mp3"),this.managers.appGroupCallsManager.getGroupCallParticipants(t))}})),u.createDescription(),u.createDataChannel(),u.appendStreamToConference(),this.setCurrentGroupCall(h),o("set currentGroupCall",t,h),this.startConnectingSound(),u.negotiate()}h.handleUpdateGroupCallParticipants=!1,h.updatingSdp=!1,o("update currentGroupCall",t,h)}))}}const C=new S;a.GO&&(a.GO.groupCallController=C);const L=C},9125:(e,t,i)=>{"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}i.d(t,{Z:()=>s})},9337:(e,t,i)=>{"use strict";function s(e){const t={video:{width:{max:1920},height:{max:1080},frameRate:{max:30}}};return e||(t.audio=!0),t}i.d(t,{Z:()=>s})},382:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});function s(e){return t=this,i=void 0,n=function*(){const t=yield navigator.mediaDevices.getDisplayMedia(e);return t.getVideoTracks()[0].contentHint="text",t},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}},5424:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});function s(e,t){return i=this,s=void 0,a=function*(){const i=yield navigator.mediaDevices.getUserMedia(e);return i.getTracks().forEach((e=>{e.enabled=!t})),i},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}window.getStream=s},312:(e,t,i)=>{"use strict";function s(){return{width:{min:1280,max:1920},height:{min:720,max:1080},frameRate:{min:24,max:30}}}i.d(t,{Z:()=>s})},3773:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(8957);function n(e,t){const i=t.lookupAttributeKeys({"ice-ufrag":!0,"ice-pwd":!0,fingerprint:!0,setup:!0,ssrc:!0,mid:!0,"ssrc-group":!1});if(!i.fingerprint){const t=e.session.lines.find((e=>{var t;return"fingerprint"===(null===(t=e.parsed)||void 0===t?void 0:t.key)}));i.fingerprint=t.parsed.value}const n=function(e){const t=e.map((e=>{const[t,...i]=e.split(" ");return{_:"groupCallParticipantVideoSourceGroup",semantics:t,sources:i.map((e=>(0,s.Fk)(+e)))}}));return t.length?t:void 0}(i["ssrc-group"]),[a,o]=i.fingerprint.split(" ",2),r=i.ssrc&&(0,s.Fk)(+i.ssrc.split(" ",1)[0]);return{raw:i,ufrag:i["ice-ufrag"],pwd:i["ice-pwd"],fingerprint:{fingerprint:o,setup:i.setup,hash:a},source:r,sourceGroups:n,mid:i.mid}}},49:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(6669);function n(e){e.stop(),(0,s.Z)(e,"ended")}},6752:(e,t,i)=>{"use strict";i.d(t,{Lp:()=>o,ZP:()=>d,z_:()=>r});var s=i(1655),n=i(5953),a=i(4373);class o{constructor(e,t){this.mid=e,this.type=t,this.port=a._D}setDirection(e){return this.originalDirection||(this.originalDirection=e),this.direction=e}setPort(e){return this.port=e}setEndpoint(e){return this.endpoint=e}setPeerId(e){return this.peerId=e}createTransceiver(e,t){return(null==t?void 0:t.direction)&&this.setDirection(t.direction),this.transceiver=e.addTransceiver((0,a.pl)(this.type),t)}setSource(e){let t;if(Array.isArray(e)){if(!e[0])return;t=e,e=t[0].sources[0]}return this.sourceGroups=t,this.source=e}shouldBeSkipped(e){return e&&"inactive"===this.direction}}function r(e,t,i){let s;if(Array.isArray(t)){if(!t[0])return;s=t,t=s[0].sources[0]}return{endpoint:i,type:e,source:t,sourceGroups:s}}class d{constructor(e){this.connection=e,this.sessionId=""+Date.now(),this.maxSeenId=-1,this.entries=[],this.entriesByMid=new Map,this.entriesBySource=new Map,this.entriesByPeerId=new Map}setData(e){return(0,n.Z)(this,e)}createEntry(e){const t=""+ ++this.maxSeenId,i=new o(t,e);return this.entries.push(i),this.entriesByMid.set(t,i),i}deleteEntry(e){(0,s.Z)(this.entries,e),this.entriesByMid.delete(e.mid),this.entriesBySource.delete(e.source);const t=this.entriesByPeerId.get(e.peerId);t&&(t.delete(e),t.size||this.entriesByPeerId.delete(e.peerId))}setEntrySource(e,t){e.setSource(t),this.entriesBySource.set(e.source,e)}setEntryPeerId(e,t){e.setPeerId(t);let i=this.entriesByPeerId.get(t);i||this.entriesByPeerId.set(t,i=new Set),i.add(e)}findEntry(e){return this.entries.find(e)}findFreeSendRecvEntry(e,t){let i=this.entries.find((i=>"sendrecv"===i.direction&&i.type===e&&!(t?i.sendEntry:i.recvEntry)));return i||(i=this.createEntry(e),i.setDirection("sendrecv")),i}getEntryByMid(e){return this.entriesByMid.get(e)}getEntryBySource(e){return this.entriesBySource.get(e)}getEntriesByPeerId(e){return this.entriesByPeerId.get(e)}generateSdp(e){return a.DY.fromConference(Object.assign({conference:this},e))}}},9124:(e,t,i)=>{"use strict";i.d(t,{e6:()=>de,DV:()=>oe});var s,n,a=function(e,t,i,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,i):n?n.value=i:t.set(e,i),i},o=function(e,t,i,s){if("a"===i&&!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"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class r{constructor(e,t){s.set(this,void 0),n.set(this,void 0),a(this,s,e,"f"),a(this,n,t,"f")}get session(){return o(this,s,"f")}get media(){return o(this,n,"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 d(e,t,i){const s=e.split(t),n=[];for(;i>0&&s.length;)n.push(s.shift()),--i;return s.length&&n.push(s.join(t)),n}s=new WeakMap,n=new WeakMap;var l,c,h,u=function(e,t,i,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,i):n?n.value=i:t.set(e,i),i},p=function(e,t,i,s){if("a"===i&&!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"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class f{constructor(e,t){l.set(this,void 0),c.set(this,void 0),h.set(this,void 0),u(this,l,new Set,"f"),u(this,c,e,"f"),u(this,h,t,"f")}generate(){const e=p(this,c,"f"),t=p(this,h,"f"),i=p(this,l,"f"),s=t-e+1;let n=Math.floor(e+s*Math.random()),a=0;for(;i.has(n);)if(n=s)return null;return i.add(n),n}add(e){p(this,l,"f").add(e)}}l=new WeakMap,c=new WeakMap,h=new WeakMap;var m,g,v=function(e,t,i,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,i):n?n.value=i:t.set(e,i),i},b=function(e,t,i,s){if("a"===i&&!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"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class y{constructor(e,t){m.set(this,void 0),g.set(this,void 0),v(this,m,e,"f"),v(this,g,t,"f")}get key(){return b(this,m,"f")}get value(){return b(this,g,"f")}}m=new WeakMap,g=new WeakMap;var w,S,C,L,E=function(e,t,i,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,i):n?n.value=i:t.set(e,i),i},I=function(e,t,i,s){if("a"===i&&!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"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class M{constructor(e,t,i,s){w.set(this,void 0),S.set(this,void 0),C.set(this,void 0),L.set(this,void 0),E(this,w,e,"f"),E(this,S,t,"f"),E(this,C,i,"f"),E(this,L,s,"f")}get type(){return I(this,w,"f")}get port(){return I(this,S,"f")}get protocol(){return I(this,C,"f")}get ids(){return I(this,L,"f")}toString(){return this.type+" "+this.port+" "+this.protocol+" "+this.ids.join(" ")}}w=new WeakMap,S=new WeakMap,C=new WeakMap,L=new WeakMap;var P,Z,T,k,x=function(e,t,i,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,i):n?n.value=i:t.set(e,i),i},A=function(e,t,i,s){if("a"===i&&!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"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class _{constructor(e,t){if(P.set(this,void 0),Z.set(this,void 0),T.set(this,void 0),k.set(this,void 0),x(this,P,e,"f"),"string"==typeof t){if(x(this,Z,t,"f"),"m"===e){const e=t.split(" ");x(this,T,new M(e[0],e[1],e[2],e.slice(3)),"f")}else if("a"===e){const e=d(t,":",1);t=e[0],x(this,k,1===e.length?new y(t,null):new y(t,e[1]),"f")}}else t instanceof M?(x(this,T,t,"f"),x(this,Z,t.toString(),"f")):t instanceof y&&(x(this,k,t,"f"),x(this,Z,t.value?`${t.key}:${t.value}`:t.key,"f"))}get key(){return A(this,P,"f")}get value(){return A(this,Z,"f")}get parsed(){return A(this,k,"f")}get mediaLineParts(){return A(this,T,"f")}toString(){return`${this.key}=${this.value}`}}P=new WeakMap,Z=new WeakMap,T=new WeakMap,k=new WeakMap;var F,D,R,B,N,O,U=function(e,t,i,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,i):n?n.value=i:t.set(e,i),i},H=function(e,t,i,s){if("a"===i&&!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"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class z{constructor(e,t,i=":",s=!1){F.set(this,void 0),D.set(this,void 0),R.set(this,void 0),B.set(this,void 0),N.set(this,void 0),O.set(this,void 0),U(this,F,e,"f"),U(this,D,t,"f"),U(this,R,i,"f"),U(this,N,s,"f"),U(this,B,s?new Map:null,"f"),U(this,O,s?[]:null,"f")}get lines(){return H(this,D,"f")}get value(){return H(this,N,"f")||!this.lines.length?null:this.lines[0]}get exists(){return!H(this,N,"f")}get key(){return H(this,F,"f")}get keys(){return z.fill(this),H(this,O,"f")}forEach(e){z.fill(this),H(this,B,"f").forEach(e)}get(e){return z.fill(this),H(this,B,"f").get(e)||new z(e,[],":",!0)}static fill(e){if(null!==H(e,B,"f"))return;const t=new Map;e.lines.forEach((i=>{const[s,n]=d(i,H(e,R,"f"),1),a=t.get(s)||[];t.set(s,[...a,n||""])}));const i=U(e,B,z.makeAttributes(t),"f");U(e,O,Array.from(i.keys()),"f")}static makeAttributes(e){const t=new Map;return e.forEach(((e,i)=>{t.set(i,new z(i,e))})),t}}F=new WeakMap,D=new WeakMap,R=new WeakMap,B=new WeakMap,N=new WeakMap,O=new WeakMap;var j,G,V=function(e,t,i,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,i):n?n.value=i:t.set(e,i),i},K=function(e,t,i,s){if("a"===i&&!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"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class W{constructor(e){j.set(this,void 0),G.set(this,void 0),V(this,j,e,"f"),V(this,G,new Map,"f"),W.fillAttributes(this)}get(e){return K(this,G,"f").get(e)||new z(e,[]," ",!0)}static fillAttributes(e){const t=new Map;K(e,j,"f").forEach((e=>{if("a"===e.key){const{key:i,value:s}=e.parsed;let n=t.get(i);n||(n=[],t.set(i,n)),n.push(s||"")}})),t.forEach(((t,i)=>{K(e,G,"f").set(i,new z(i,t," ",!1))}))}}j=new WeakMap,G=new WeakMap;var $,q,Q,Y,X=function(e,t,i,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,i):n?n.value=i:t.set(e,i),i},J=function(e,t,i,s){if("a"===i&&!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"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class ee{constructor(e){$.set(this,void 0),q.set(this,void 0),Q.set(this,void 0),Y.set(this,void 0),X(this,$,e,"f"),X(this,q,e[0],"f"),X(this,Q,X(this,Y,null,"f"),"f")}get lines(){return J(this,$,"f")}get mediaLine(){return J(this,q,"f")}get mediaLineParts(){return J(this,q,"f").mediaLineParts}get mediaType(){return this.mediaLineParts.type}get direction(){if(!J(this,Y,"f")){const e=this.attributes;let t;t=e.get("sendonly").exists?"sendonly":e.get("recvonly").exists?"recvonly":e.get("inactive").exists?"inactive":"sendrecv",X(this,Y,t,"f")}return J(this,Y,"f")}get isSending(){return"sendrecv"===this.direction||"sendonly"===this.direction}get isReceiving(){return"sendrecv"===this.direction||"recvonly"===this.direction}get attributes(){return J(this,Q,"f")||X(this,Q,new W(this.lines),"f"),J(this,Q,"f")}get mid(){return this.attributes.get("mid").value}lookupAttributeKeys(e){const t={};for(const i in e){const s=this.attributes.get(i),n=!e[i];t[i]=s?n?s.lines:s.value:n?[]:void 0}return t}}$=new WeakMap,q=new WeakMap,Q=new WeakMap,Y=new WeakMap;var te,ie,se=function(e,t,i,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,i):n?n.value=i:t.set(e,i),i},ne=function(e,t,i,s){if("a"===i&&!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"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class ae{constructor(e){te.set(this,void 0),ie.set(this,void 0),se(this,te,e,"f"),se(this,ie,e.filter((e=>"o"===e.key)).map((e=>e.value.split(" ")[1]))[0],"f")}get lines(){return ne(this,te,"f")}get sessionId(){return ne(this,ie,"f")}}function oe(e){function t(){i?n.push(new ee(s)):i=new ae(s)}let i=null,s=[];const n=[];return e.split(/\r?\n/).forEach((e=>{if(!function(e){return/^[\s\xa0]*$/.test(e)}(e)){const i=re(e);"m"===i.key&&(t(),s=[]),s.push(i)}})),t(),new r(i,n)}function re(e){const t=d(e,"=",1);return new _(t[0],t[1])}function de(e){let t;return e.media.forEach(((i,s)=>{if("video"===i.mediaType&&i.isSending&&!i.attributes.get("ssrc-group").get("SIM").exists){t||(t=new f(2,4294967295));const n=i.attributes.get("ssrc-group").get("FID").value.split(" "),a=i.lines;n.forEach((e=>t.add(+e)));const o=[n[0],t.generate(),t.generate()],r=[n[1],t.generate(),t.generate()];a.push(re("a=ssrc-group:SIM "+o.join(" ")));const d=i.attributes.get("ssrc").get(n[0]).lines;o.forEach(((e,t)=>{const i=r[t];t>0&&(a.push(re("a=ssrc-group:FID "+e+" "+i)),d.forEach((t=>{a.push(re("a=ssrc:"+e+" "+t))})),d.forEach((e=>{a.push(re("a=ssrc:"+i+" "+e))})))})),e.media[s]=new ee(a)}})),!!t}te=new WeakMap,ie=new WeakMap},4373:(e,t,i)=>{"use strict";i.d(t,{DY:()=>c,Px:()=>l,_D:()=>o,pl:()=>r});var s=i(4762),n=i(630),a=i(8957);const o="9";function r(e){return"screencast"===e?"video":e}function d(e){return"application"===e?"DTLS/SCTP":"UDP/TLS/RTP/SAVPF"}function l(e,t=o,i){const s=d(e);return`m=${r(e)} ${t} ${s} ${i.join(" ")}`}class c extends n.Z{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 i=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 ${i}`,"a=ice-options:trickle","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:i,sourceGroups:s}=e;const n=(0,a.h)(e.source);t+=n,i+=n;const o=e=>{this.add(`a=ssrc:${e} cname:${t}`,`a=ssrc:${e} msid:${t} ${i}`,`a=ssrc:${e} mslabel:${t}`,`a=ssrc:${e} label:${i}`)};return(()=>{this.add(`a=msid:${t} ${i}`)})(),(null==s?void 0:s.length)?s.forEach((e=>{if(e.sources.length){const t=e.sources.map(a.h);this.add(`a=ssrc-group:${e.semantics} ${t.join(" ")}`),t.forEach(o)}})):o(n),this}addSsrcEntry(e,t,i){const s=(...e)=>this.add(...e),{type:n,mid:a,direction:o,port:c}=e,h=t.transport,u="application"===n,p=u?void 0:t[n],f="inactive"===o;if(e.shouldBeSkipped(i))return s(`m=${r(n)} 0 ${d(n)} 0`,"c=IN IP4 0.0.0.0","a=inactive",`a=mid:${a}`);const m=u?[{id:5e3}]:p["payload-types"],g=m.map((e=>e.id));s(l(n,c,g),"c=IN IP4 0.0.0.0",`a=rtcp:${c} IN IP4 0.0.0.0`),h["rtcp-mux"]&&s("a=rtcp-mux"),s(`a=mid:${a}`);let v=o;if("sendrecv"===o||!i||f||u||(v="sendonly"===o?"recvonly":"sendonly"),s(`a=${v}`),this.addTransport(h),u)s(`a=sctpmap:${m[0].id} webrtc-datachannel 256`);else{const e=p["rtp-hdrexts"];(null==e?void 0:e.length)&&e.forEach((e=>{s(`a=extmap:${e.id} ${e.uri}`)})),m.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 i=[];for(const e in t)i.push(`${e}=${t[e]}`);s(`a=fmtp:${e.id} ${i.join(";")}`)}const i=e["rtcp-fbs"];(null==i?void 0:i.length)&&i.forEach((t=>{s(`a=rtcp-fb:${e.id} ${t.type}${t.subtype?" "+t.subtype:""}`)}))}))}return!e.source||"sendonly"!==v&&"sendrecv"!==v||this.addSsrc(e),this}addConference(e){const{conference:t,entries:i,bundle:n,isAnswer:a}=e;this.addHeader(t.sessionId,n),s.IS_FIREFOX&&this.addTransport(t.transport);for(const e of i)this.addSsrcEntry((a?e.recvEntry||e.sendEntry:e.sendEntry||e.recvEntry)||e,t,a);return this}static fromConference(e){return(new c).addConference(e).finalize()}}},9585:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(3241),n=i(5003),a=i(1677),o=i(49),r=i(4373),d=i(8957);class l{constructor(e,t){const i=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,i.connect(s)}}class c{constructor(e){this.interval=e,this.getAmplitude=e=>{const{streamAnalyser:t,stream:i,track:s,source:n,type:a}=e,o=t.analyser;if(!o)return;const r=new Uint8Array(o.frequencyBinCount);return o.getByteFrequencyData(r),{type:a,source:n,stream:i,track:s,value:(0,d.UN)(r)}},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,a.KM).map(this.getAmplitude);++this.counter>=1e3&&(this.counter=0),c.ANALYSER_LISTENER.dispatchEvent("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=(0,n.kg)("SM"),this.direction="sendonly",this.canCreateConferenceEntry=!0,this.types=["audio","video"]}addStream(e,t){e.getTracks().forEach((i=>{this.addTrack(e,i,t)}))}addTrack(e,t,i){this.log("addTrack",i,t,e);const{context:s,items:n,inputStream:a,outputStream:o}=this,r=t.kind,d=c.getSource(e,i);switch(i){case"input":a?a.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:""+(0,d.Fk)(+e.id.substring(6))}removeTrack(e){this.log("removeTrack",e);const{items:t}=this;let i=!1;for(let s=0,n=t.length;!i&&s[e,n])),o=t.getTracks();for(const[t,n]of a){let a=e.findEntry((e=>e.direction===i&&e.type===t));if(!a){if(!s)continue;a=e.createEntry(t)}let{transceiver:d}=a;d||(d=a.createTransceiver(e.connection,n)),a.direction!==d.direction&&(d.direction=a.direction);const l=(0,r.pl)(t),c=o.findIndex((e=>e.kind===l)),h=-1!==c?o.splice(c,1)[0]:void 0,u=d.sender;u.track!==h&&u.replaceTrack(h).catch((e=>{this.log.error(e)}))}}stop(){try{this.inputStream.getTracks().concat(this.outputStream.getTracks()).forEach((e=>{(0,o.Z)(e)}))}catch(e){this.log.error(e)}}}c.ANALYSER_LISTENER=new s.Z},630:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});class s{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}}},8957:(e,t,i)=>{"use strict";function s(e){return e<<0}function n(e){return e>>>0}function a(e,t=3){if(!e)return 0;const{length:i}=e;let s=0;for(let t=0;ts,UN:()=>a,h:()=>n})},3785:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(7197),n=i(1229);const a=new RegExp(`(^${n.Z})`);function o(e,t=!1){const i=(e||"").trim().split(" ");if(!i[0])return{text:"",entities:[]};const n=[],o=i[0].match(a),r=(null==o?void 0:o[0])||i[0][0];o&&n.push((0,s.Z)(r));const d=i.length;if(t||1===d)return{text:r,entities:n};const l=i[d-1].match(a),c=(null==l?void 0:l[0])||i[d-1][0];return l&&n.push(Object.assign(Object.assign({},(0,s.Z)(c)),{offset:r.length})),{text:r+c,entities:n}}},7197:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(671);function n(e){return{_:"messageEntityEmoji",offset:0,length:e.length,unicode:(0,s.w1)(e).join("-").replace(/-?fe0f/g,"")}}},1171:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(2423);function n(e){return e?e.match(s.E):null}},2521:(e,t,i)=>{"use strict";function s(e){return e.target="_blank",e.rel="noopener noreferrer",e}i.d(t,{Z:()=>s})},5798:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(8115),n=i(3785);function a(e,t){const{text:i,entities:a}=(0,n.Z)(e,t);return(0,s.Z)(i,void 0,a)}},3066:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(3512),n=i(5400);function a(e,t={}){if(!e)return(0,n.ZP)("");let i=t.entities;return i&&!s.Z.premium&&t.wrappingForPeerId!==s.Z.myId&&(i=i.filter((e=>"messageEntityCustomEmoji"!==e._))),(0,n.ZP)(e,Object.assign(Object.assign({},t),{entities:i,noLinks:!0,wrappingDraft:!0,passEntities:{messageEntityTextUrl:!0,messageEntityMentionName:!0}}))}},8115:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(6535),n=i(5400);function a(e,t=!1,i){return e?(null!=i||(i=(0,s.Z)(e).filter((e=>"messageEntityEmoji"===e._))),(0,n.ZP)(e,{entities:i,wrappingDraft:t})):(0,n.ZP)("")}},5400:(e,t,i)=>{"use strict";i.d(t,{LD:()=>_,KZ:()=>F,SZ:()=>G,ZP:()=>j,Cx:()=>K,Hc:()=>V});var s=i(2423),n=i(3447),a=i(9976),o=i(8479),r=i(4056),d=i(1379),l=i(6535),c=i(2521),h=i(3591);const u={};a.Z&&(u[""]=!0,[["14","๐Ÿซฑ๐Ÿป"]].forEach((([e,t])=>{u[e]=function(e){const t=document.createElement("span");t.classList.add("emoji"),document.body.appendChild(t),t.innerText=e;const i=t.offsetWidth;t.innerText="โค๏ธ";const s=t.offsetWidth;return document.body.removeChild(t),Math.abs(i-s)<5}(t)})));const p=u;var f=i(2738),m=i(3512),g=i(4755),v=i(3541),b=i(3772),y=i(5814),w=i(2153),S=i(393),C=i(8938),L=i(319),E=i(8497),I=i(4881),M=i(3624),P=i(5565),Z=i(6854),T=i(645),k=i(4497);const x=new ResizeObserver((e=>{for(const t of e)t.target.parentElement.setDimensionsFromRect(t.contentRect)})),A=new w.Z;class _ extends HTMLElement{constructor(){super(),this.paused=!0,this.classList.add("custom-emoji")}get docId(){return this.dataset.docId}static create(e){const t=new _;return t.dataset.docId=""+e,t}get isConnected(){var e,t;return null!==(t=null===(e=this.placeholder)||void 0===e?void 0:e.isConnected)&&void 0!==t?t:super.isConnected}connectedCallback(){this.player&&y.Z.addAnimation(this,this.renderer.animationGroup,void 0,!0)}disconnectedCallback(){var e;!this.isConnected&&(null===(e=this.renderer)||void 0===e?void 0:e.isSelectable)&&this.clear()}destroy(){this.clear()}clear(e=!0){var t;if(this.clean)return;this.clean=!0,this.pause();const{syncedPlayer:i}=this;if(i&&i.pausedElements.delete(this),null===(t=this.middlewareHelper)||void 0===t||t.clean(),this.renderer){const t=this.renderer.customEmojis.get(this.docId);(null==t?void 0:t.delete(this))&&!t.size&&(this.renderer.customEmojis.delete(this.docId),this.renderer.playersSynced.delete(t)),e&&(this.renderer.isSelectable?this.replaceChildren(G(!0)):this.replaceChildren())}this.player&&y.Z.removeAnimationByPlayer(this),A&&A.delete({div:this}),this.elements=this.renderer=this.player=this.syncedPlayer=void 0}pause(){this.paused||(this.paused=!0,this.player instanceof HTMLVideoElement&&!this.syncedPlayer&&(this.renderer.lastPausedVideo=this.player,this.player.pause()),this.syncedPlayer&&!this.syncedPlayer.pausedElements.has(this)&&(this.syncedPlayer.pausedElements.add(this),this.syncedPlayer.player&&this.syncedPlayer.pausedElements.size===this.syncedPlayer.middlewares.size&&this.syncedPlayer.player.pause()))}play(){var e;this.paused&&(this.paused=!1,this.player instanceof HTMLVideoElement&&(this.player.currentTime=(null===(e=this.renderer.lastPausedVideo)||void 0===e?void 0:e.currentTime)||this.player.currentTime,this.player.play().catch(L.Z)),this.syncedPlayer&&this.syncedPlayer.pausedElements.has(this)&&(this.syncedPlayer.pausedElements.delete(this),this.syncedPlayer.pausedElements.size!==this.syncedPlayer.middlewares.size&&this.player.play()))}remove(){this.clear()}get autoplay(){return!0}}class F extends HTMLElement{constructor(){super(),this.classList.add("custom-emoji-renderer"),this.canvas=document.createElement("canvas"),this.canvas.classList.add("custom-emoji-canvas"),this.context=this.canvas.getContext("2d"),this.append(this.canvas),this.playersSynced=new Map,this.clearedElements=new WeakSet,this.customEmojis=new Map,this.animationGroup="EMOJI",this.isCanvasClean=!1}connectedCallback(){B.has(this)||(x.observe(this.canvas),B.add(this),this.connectedCallback=void 0)}disconnectedCallback(){var e;!this.isConnected&&this.auto&&(null===(e=this.destroy)||void 0===e||e.call(this),this.disconnectedCallback=void 0)}destroy(){var e;x.unobserve(this.canvas),this.customEmojis.forEach((e=>{e.forEach((e=>{e.clear()}))})),B.delete(this),this.playersSynced.clear(),null===(e=this.middlewareHelper)||void 0===e||e.clean(),this.customEmojis.clear(),this.destroy=this.lastPausedVideo=void 0}getOffsets(e=new Map){if(!this.playersSynced.size)return e;const t=(0,E.Z)(this,"scrollable")||this.offsetParent;if(!t)return e;const i=t.getBoundingClientRect(),s=this.getBoundingClientRect();for(const n of this.playersSynced.keys()){const a=Array.from(n),o=this.isSelectable?a.map((e=>e.placeholder)):a,{visible:r}=(0,I.Z)({overflowElement:t,overflowRect:i,elements:o,extraSize:2.5*this.size.height}),d=r.map((({rect:e})=>({top:e.top-s.top,left:e.left-s.left,width:e.width})));d.length&&e.set(n,d)}return e}clearCanvas(){if(this.isCanvasClean)return;const{context:e,canvas:t}=this;e.clearRect(0,0,t.width,t.height),this.isCanvasClean=!0}render(e){const{context:t,canvas:i,isDimensionsSet:s}=this;s||this.setDimensionsFromRect(void 0,!1),this.isCanvasClean=!1;const{width:n,height:a,dpr:o}=i;for(const[i,s]of e){const e=this.playersSynced.get(i),a=O.get(e)||(e instanceof HTMLVideoElement?e:void 0);if(!a)continue;const r=a instanceof ImageData;let d,l;e instanceof HTMLVideoElement?(d=this.size.width*o,l=this.size.height*o):(d=a.width,l=a.height);const c=Math.round(s[0].width*o);c!==d&&(d=c,l=c);const h=n-d;this.clearedElements.has(i)||this.isSelectable||(this.isSelectable?i.forEach((e=>{var t;null!==(t=e.lastChildWas)&&void 0!==t||(e.lastChildWas=e.lastChild),(0,P.Z)(e,e.firstChild)})):i.forEach((e=>{e.replaceChildren()})),this.clearedElements.add(i)),s.forEach((({top:e,left:i})=>{e=Math.round(e*o),(i=Math.round(i*o))<0||i>h||(r?t.putImageData(a,i,e):t.drawImage(a,i,e,d,l))}))}}checkForAnyFrame(){for(const e of this.playersSynced.values())if(O.has(e)||e instanceof HTMLVideoElement)return!0;return!1}remove(){super.remove()}setDimensionsFromRect(e=this.lastRect,t=!0){const{canvas:i}=this,{dpr:s}=i;if(this.lastRect!==e&&(this.lastRect=e),!e||!s||this.ignoreSettingDimensions)return;const{width:n,height:a}=e,o=Math.floor(Math.round(n*s)),r=Math.floor(Math.round(a*s));i.width===o&&i.height===r||(i.width=o,i.height=r,this.isDimensionsSet=!0,this.isCanvasClean=!0,(this.forceRenderAfterSize||this.isSelectable&&t)&&(this.forceRenderAfterSize=void 0,this.forceRender()))}forceRender(){this.isDimensionsSet&&(U(new Set([this]))||this.clearCanvas())}add(e,t,i,s){const n=this;if(e.forEach(((t,i)=>{let s=this.customEmojis.get(i);s?this.clearedElements.delete(s):this.customEmojis.set(i,s=new Set);for(const e of t)s.has(e)?t.delete(e):(e.clean=!1,e.renderer=n,e.elements=s,e.middlewareHelper=this.middlewareHelper.get().create(),s.add(e),e.lastChildWas&&!e.lastChildWas.parentNode&&e.append(e.lastChildWas));t.size||e.delete(i)})),!e.size)return;const a=!(t||!1===t||!A),o=Array.from(e.keys()),r=m.Z.managers,d=this.middlewareHelper.get(),l=this.size;return r.appEmojiManager.getCachedCustomEmojiDocuments(o).then((c=>{if(d&&!d())return;const h=[],u=(o,c)=>{const h=o.id,u=e.get(h),p=n.customEmojis.get(h),f=2===o.sticker,m="video/webm"===o.mime_type&&!S.Z,g=(f||3===o.sticker&&this.isSelectable)&&!i&&!m,w=[],E=Array.from(u),I=(0,v.ZP)({div:E,doc:o,width:l.width,height:l.height,loop:!0,play:D,managers:r,isCustomEmoji:!0,group:"none",loadPromises:w,middleware:d,exportLoad:a||!1===t?2:1,needFadeIn:!1,loadStickerMiddleware:g&&d?d.create().get((()=>!!P.middlewares.size)):void 0,static:m,onlyThumb:i,withThumb:null!=s?s:!n.clearedElements.has(p)&&void 0,syncedVideo:this.isSelectable});c&&I.then((()=>c.push(...w)));const M={elements:u};if(1===o.sticker||i||m)return this.isSelectable&&(M.onRender=()=>Promise.all(w).then((()=>{d&&!d()||E.forEach((e=>{const{placeholder:t}=e;t.src=e.firstElementChild.src}))}))),I.then((e=>Object.assign(Object.assign({},e),M)));let P;M.onRender=e=>Promise.all(w).then((()=>{var t;if(d&&!d()||!o.animated)return;const i=Array.isArray(e)?e:[e],s=Array.isArray(i)?i[0]:i;if((0,C.Z)(s),E.forEach(((e,t)=>{const s=i[t]||i[0];e.player=s,P&&(e.syncedPlayer=P,e.paused?e.syncedPlayer.pausedElements.add(e):s.paused&&s.play()),e.isConnected&&y.Z.addAnimation(e,e.renderer.animationGroup,void 0,!0)})),(s instanceof b.Z||s instanceof HTMLVideoElement&&this.isSelectable)&&(P.player=s,n.playersSynced.set(p,s)),s instanceof b.Z?(s.group=n.animationGroup,null!==(t=s.overrideRender)&&void 0!==t||(s.overrideRender=e=>{O.set(s,e)})):HTMLVideoElement,g){const e=(0,b.a)(this.size.width,this.size.height);n.canvas.dpr=e,H()}}));const Z=[h,l.width,l.height].join("-");if(g){P=N.get(Z),P||(P={player:void 0,middlewares:new Set,pausedElements:new Set,key:Z},N.set(Z,P));for(const e of u){const t=e.middlewareHelper.get();P.middlewares.add(t),t.onClean((()=>{var i,s;if(P.middlewares.delete(t),!P.middlewares.size){if(P.player){const t=O.get(P.player);if(t&&(null===(s=(i=t).close)||void 0===s||s.call(i),O.delete(P.player)),O.delete(P.player),P.player instanceof b.Z)P.player.overrideRender=L.Z,P.player.remove();else if(P.player instanceof HTMLVideoElement){const t=T.Z.generateName(""+e.docId,0,0,void 0,void 0);delete v._i[t]}P.player=void 0}N.get(P.key)===P&&N.delete(P.key)&&!N.size&&z()}}))}}return I.then((e=>Object.assign(Object.assign({},e),M)))},p=[],f=c.map(((e,t)=>{if(e)return u(e,h);p.push(o[t])})).filter(Boolean),m=p.length?r.appEmojiManager.getCustomEmojiDocuments(p).then((e=>d&&!d()?[]:e.filter(Boolean).map((e=>u(e))))):Promise.resolve([]),g=e=>Promise.all(e).then((e=>{const t=e.map((({load:e,onRender:t,elements:i})=>{if(!e)return;const s=()=>e().then(t);if(!a)return s();i.forEach((e=>{A.push({div:e,load:()=>(i.forEach((e=>{A.delete({div:e})})),s())})}))}));return Promise.all(t)})),w=()=>{if(d&&!d())return;const e=g(f),t=m.then((e=>g(e)));return Promise.all([e,t])};return t?t.push({div:n.canvas,load:w}):w(),Promise.all(f).then((()=>Promise.all(h))).then((()=>{}))}))}static create(e){const t=new F;t.animationGroup=e.animationGroup,t.size=e.customEmojiSize||g.Z.active.customEmoji,t.isSelectable=e.isSelectable,e.wrappingDraft&&(t.contentEditable="false",t.style.height="inherit");let i=e.middleware;return i?(t.middlewareHelper=i.create(),i=t.middlewareHelper.get(),i.onDestroy((()=>{var e;null===(e=t.destroy)||void 0===e||e.call(t)}))):(t.auto=!0,t.middlewareHelper=(0,M.k)()),t}}const D=!0;let R;const B=new Set,N=new Map,O=new Map,U=(e=B)=>{const t=Array.from(e).filter((e=>e.isConnected&&e.checkForAnyFrame()&&!e.ignoreSettingDimensions));if(!t.length)return!1;const i=t.map((e=>{const t=[...e.playersSynced.values()].reduce(((e,t)=>e+ +!!t.paused),0);if(e.playersSynced.size===t)return;const i=e.getOffsets();return i.size?[e,i]:void 0})).filter(Boolean);for(const[e]of i)e.clearCanvas();for(const[e,t]of i)e.render(t);return!0},H=()=>{R||(R=window.setInterval(U,16.666666666666668),U())},z=()=>{R&&(clearInterval(R),R=void 0)};function j(e,t={}){var i,u,m,g,v,b,y,w;const S=document.createDocumentFragment();if(!e)return S;const C=null!==(i=t.nasty)&&void 0!==i?i:t.nasty={i:0,usedLength:0,text:e},L=(e,i)=>{const s=document.createElement("span");return t.wrappingDraft&&(s.contentEditable="false"),s.classList.add("input-something"),s.append(e),(D||S).append(s),e.classList.add("input-selectable"),!i&&e.append(G(!0)),I.add(s),s};t.isSelectable||(t.isSelectable=t.wrappingDraft);const E=null!==(u=t.customEmojis)&&void 0!==u?u:t.customEmojis=new Map,I=null!==(m=t.customWraps)&&void 0!==m?m:t.customWraps=new Set,M=null!==(g=t.entities)&&void 0!==g?g:t.entities=(0,l.Z)(C.text),P=null!==(v=t.passEntities)&&void 0!==v?v:t.passEntities={},Z=null!==(b=t.contextSite)&&void 0!==b?b:t.contextSite="Telegram",T="Telegram"!==Z,x=C.text.length,A=M.length;let D;for(;C.i=x){if("messageEntityCaret"!==e._)continue}else e.offset+e.length>x&&(e=(0,o.Z)(e),e.length=x-e.offset);e.length&&(C.lastEntity=e);let i=M[C.i+1];const l=e.offset,u=l+e.length,m=Math.min(u,null!==(y=null==i?void 0:i.offset)&&void 0!==y?y:65535),g=C.text.slice(l,u);let v=C.text.slice(l,m);C.usedLengthv.length&&b?b:S,t.voodoo)return S}var R;if(C.lastEntity&&(C.usedLength=C.lastEntity.offset+C.lastEntity.length),C.usedLength{const t=document.createElement("span");return t.classList.add(e?"input-filler2":"input-filler"),t.textContent=Z.Z,t};function V(e){var t;if((null==e?void 0:e.textContent)!==Z.Z||"false"===(null===(t=null==e?void 0:e.getAttribute)||void 0===t?void 0:t.call(e,"contenteditable"))){if(!e||e.textContent!==Z.Z||e.firstElementChild)return 2;if(e.nodeType===e.ELEMENT_NODE)return 1}return 0}function K(e){const t=(e,t,i)=>{const s=V(t);2===s?e[i](G()):1===s&&t.appendChild(document.createTextNode(Z.Z))};for(const i of e){const{previousSibling:e,nextSibling:s}=i;t(i,e,"before"),t(i,s,"after")}}window.wrapRichText=j},4497:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(3591);function n(e){const{url:t,onclick:i}=(0,s.Z)(e),n=document.createElement("a");return n.href=t,i&&n.setAttribute("onclick",`${i}(this)`),n}},1447:(e,t,i)=>{"use strict";i.d(t,{Z:()=>v});var s=i(5814),n=i(410),a=i(5418),o=i(5003),r=i(3772),d=i(7328),l=i(3241);class c extends l.Z{constructor(e){super(),this.worker=e,this.worker.onerror=e=>{try{this.dispatchEvent("workerError",e),this.cleanup(),this.terminate()}catch(e){}},this.worker.onmessage=e=>{this.dispatchEvent(e.data.queryMethodListener,...e.data.queryMethodArguments)}}postMessage(e){this.worker.postMessage(e)}terminate(){this.worker.terminate()}sendQuery(e,t){this.worker.postMessage({queryMethod:e.shift(),queryMethodArguments:e},d.Z?t:void 0)}}var h=i(8975),u=i(3855);const p="undefined"!=typeof WebAssembly;var f=i(5471),m=i(4159);const g=new class{constructor(){this.loadPromise=p?void 0:Promise.reject(),this.loaded=!1,this.workersLimit=m.Z.threads,this.players={},this.playersByCacheName={},this.workers=[],this.curWorkerNum=0,this.log=(0,o.kg)("LOTTIE",o.v9.Error),this.onPlayerLoaded=(e,t,i)=>{const s=this.players[e];s?(this.log.debug("onPlayerLoaded"),s.onLoad(t,i)):this.log.warn("onPlayerLoaded on destroyed player:",e,t)},this.onFrame=(e,t,i)=>{const s=this.players[e];s?(void 0!==s.clamped&&i instanceof Uint8ClampedArray&&(s.clamped=i),s.renderFrame(i,t)):this.log.warn("onFrame on destroyed player:",e,t)},this.onPlayerError=(e,t)=>{const i=this.players[e];i&&s.Z.getAnimations(i.el[0]).forEach((e=>{s.Z.removeAnimation(e)}))}}getAnimation(e){for(const t in this.players)if(this.players[t].el.includes(e))return this.players[t];return null}setLoop(e){let t=!1;for(const i in this.players){const s=this.players[i];s._loop&&s.loop!==e&&(t=!0,s.loop=e,s.autoplay=s._autoplay)}return t}loadLottieWorkers(){return this.loadPromise?this.loadPromise:this.loadPromise=new Promise(((e,t)=>{let s=this.workersLimit;for(let n=0;n{this.log("worker #"+n+" ready"),o.addEventListener("frame",this.onFrame),o.addEventListener("loaded",this.onPlayerLoaded),o.addEventListener("error",this.onPlayerError),--s,s||(this.log("workers ready"),e(),this.loaded=!0)}),{once:!0}),o.addEventListener("workerError",(e=>{t("rlottie load error: "+e.message),this.loaded=!1}),{once:!0})}}))}makeAssetUrl(e){return"assets/tgs/"+e+".json"}loadAnimationAsAsset(e,t){return this.loadAnimationFromURL(e,this.makeAssetUrl(t))}loadAnimationDataFromURL(e){return p?(this.loadLottieWorkers(),fetch(e).then((e=>e.headers&&"application/octet-stream"!==e.headers.get("content-type")?e.blob():e.arrayBuffer().then((e=>u.Z.invokeCrypto("gzipUncompress",e))).then((e=>(0,h.Z)(e,"")))))):this.loadPromise}loadAnimationFromURLManually(e){const t=this.makeAssetUrl(e);return this.loadAnimationDataFromURL(t).then((e=>i=>this.loadAnimationFromURLNext(e,i,t)))}loadAnimationFromURL(e,t){return this.loadAnimationDataFromURL(t).then((i=>this.loadAnimationFromURLNext(i,e,t)))}loadAnimationFromURLNext(e,t,i){const s=Object.assign(t,{animationData:e,needUpscale:!0});return s.name||(s.name=i),this.loadAnimationWorker(s)}waitForFirstFrame(e){return Promise.race([new Promise((t=>{e.addEventListener("firstFrame",t,{once:!0})})),(0,a.Z)(2500)]).then((()=>e))}loadAnimationWorker(e){return t=this,i=void 0,a=function*(){if(!p)return this.loadPromise;this.loaded||(yield this.loadLottieWorkers());const{middleware:t,group:i=""}=e;if(t&&!t())throw(0,f.Z)("MIDDLEWARE");if(e.sync){const t=r.Z.CACHE.generateName(e.name,e.width,e.height,e.color,e.toneIndex),i=this.playersByCacheName[t];if(null==i?void 0:i.size)return Promise.resolve(i.entries().next().value[0])}const n=Array.isArray(e.container)?e.container:[e.container];if(e.width&&e.height||(e.width=parseInt(n[0].style.width),e.height=parseInt(n[0].style.height)),!e.width||!e.height)throw new Error("No size for sticker!");e.group=i;const a=this.initPlayer(n,e);return s.Z.addAnimation(a,i,void 0,t),a},new((n=void 0)||(n=Promise))((function(e,s){function o(e){try{d(a.next(e))}catch(e){s(e)}}function r(e){try{d(a.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(t,i||[])).next())}));var t,i,n,a}onDestroy(e){delete this.players[e]}destroyWorkers(){p&&(this.workers.forEach(((e,t)=>{e.terminate(),this.log("worker #"+t+" terminated")})),this.log("workers destroyed"),this.workers.length=0,this.curWorkerNum=0,this.loaded=!1,this.loadPromise=void 0)}initPlayer(e,t){var i,s;const n=new r.Z({el:e,worker:this.workers[this.curWorkerNum++],options:t}),{reqId:a,cacheName:o}=n;this.players[a]=n;const d=o?null!==(i=(s=this.playersByCacheName)[o])&&void 0!==i?i:s[o]=new Set:void 0;return o&&d.add(n),this.curWorkerNum>=this.workers.length&&(this.curWorkerNum=0),n.addEventListener("destroy",(()=>{this.onDestroy(a),d.delete(n)&&!d.size&&delete this.playersByCacheName[o]})),n.loadFromData(t.animationData),n}};n.GO.lottieLoader=g;const v=g},3772:(e,t,i)=>{"use strict";i.d(t,{Z:()=>u,a:()=>h});var s=i(7328),n=i(8189),a=i(4762),o=i(3241),r=i(4755),d=i(3228),l=i(356),c=i(645);function h(e,t,i){let s=(0,d.Z)(window.devicePixelRatio,1,2);return s>1&&!i&&(e>90&&t>90?!a.IS_APPLE&&r.Z.isMobile&&(s=1):(e>60&&t>60||a.IS_ANDROID)&&(s=Math.max(1.5,s-1.5))),s}class u extends o.Z{constructor({el:e,worker:t,options:i}){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.playedTimes=0,this.reqId=++u.reqId,this.el=e,this.worker=t;for(const e in i)this.hasOwnProperty(e)&&(this[e]=i[e]);let o;this._loop=this.loop,this._autoplay=this.autoplay,this.initFrame=i.initFrame,this.color=i.color,this.inverseColor=i.inverseColor,this.name=i.name,this.skipFirstFrameRendering=i.skipFirstFrameRendering,this.toneIndex=i.toneIndex,this.raw=void 0!==this.color,this.name&&(this.cacheName=u.CACHE.generateName(this.name,this.width,this.height,this.color,this.toneIndex)),void 0!==i.skipRatio?o=i.skipRatio:(a.IS_ANDROID||a.IS_APPLE_MOBILE||a.IS_APPLE&&!a.IS_SAFARI&&!n.Z)&&this.width<100&&this.height<100&&!i.needUpscale&&(o=.5),this.skipDelta=void 0!==o?1/o|0:1;const r=h(this.width,this.height,i.needUpscale);this.width=Math.round(this.width*r),this.height=Math.round(this.height*r),i.noCache||(a.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=this.el.map((()=>{const e=document.createElement("canvas");return e.classList.add("rlottie"),e.width=this.width,e.height=this.height,e.dpr=r,e}))),this.contexts=this.canvas.map((e=>e.getContext("2d"))),l.Z&&!this.raw||(this.imageData=new ImageData(this.width,this.height),s.Z&&(this.clamped=new Uint8ClampedArray(this.width*this.height*4))),this.name?this.cache=u.CACHE.getCache(this.cacheName):this.cache=c.M.createCache()}clearCache(){this.cachingDelta!==1/0&&(this.cacheName&&this.cache.counter>1||this.cache.clearCache())}sendQuery(e,t){this.worker.sendQuery([e.shift(),this.reqId,...e],t)}loadFromData(e){this.sendQuery(["loadFromData",e,this.width,this.height,this.toneIndex,void 0!==this.color])}play(){this.paused&&(this.paused=!1,this.setMainLoop())}pause(e=!0){this.paused||(this.paused=!0,e&&(clearTimeout(this.rafId),this.rafId=void 0))}resetCurrentFrame(){var e;return this.curFrame=null!==(e=this.initFrame)&&void 0!==e?e:1===this.direction?this.minFrame:this.maxFrame}stop(e=!0){this.pause();const t=this.resetCurrentFrame();e&&this.requestFrame(t)}restart(){this.stop(!1),this.play()}setSpeed(e){this.speed!==e&&(this.speed=e,this.paused||this.setMainLoop())}setDirection(e){this.direction!==e&&(this.direction=e,this.paused||this.setMainLoop())}remove(){this.pause(),this.sendQuery(["destroy"]),this.cacheName&&u.CACHE.releaseCache(this.cacheName),this.dispatchEvent("destroy"),this.cleanup()}applyColor(e){const[t,i,s]=this.color;for(let n=0,a=e.length;n{let n=this.cache.framesNew.get(t);if(e instanceof Uint8ClampedArray?s>0&&(n=this.canvas[0]):n=e,!n){const e=document.createElement("canvas");e.width=i.canvas.width,e.height=i.canvas.height,e.getContext("2d").putImageData(this.imageData,0,0),this.cache.framesNew.set(t,e),n=e}this.overrideRender&&this.renderedFirstFrame?this.overrideRender(n||this.imageData):n?(i.clearRect(0,0,n.width,n.height),i.drawImage(n,0,0)):i.putImageData(this.imageData,0,0),this.renderedFirstFrame||(this.renderedFirstFrame=!0)})),this.dispatchEvent("enterFrame",t)}catch(e){console.error("RLottiePlayer renderFrame error:",e,this.width,this.height),this.autoplay=!1,this.pause()}}renderFrame(e,t){if(this.cachingDelta&&(t%this.cachingDelta||!t)&&(e instanceof Uint8ClampedArray&&!this.cache.frames.has(t)?this.cache.frames.set(t,new Uint8ClampedArray(e)):l.Z&&e instanceof ImageBitmap&&!this.cache.framesNew.has(t)&&this.cache.framesNew.set(t,e)),this.frInterval){const i=Date.now()-this.frThen;if(i<0){const s=this.frInterval>-i?-i%this.frInterval:this.frInterval;return this.rafId&&clearTimeout(this.rafId),void(this.rafId=window.setTimeout((()=>{this.renderFrame2(e,t)}),s))}}this.renderFrame2(e,t)}requestFrame(e){const t=this.cache.frames.get(e),i=this.cache.framesNew.get(e);i?this.renderFrame(i,e):t?this.renderFrame(t,e):(this.clamped&&!this.clamped.length&&(this.clamped=new Uint8ClampedArray(this.width*this.height*4)),this.sendQuery(["renderFrame",e],this.clamped?[this.clamped.buffer]:void 0))}onLap(){return++this.playedTimes===this.loop&&(this.loop=!1),!!this.loop||(this.pause(!1),!1)}mainLoopForwards(){const{skipDelta:e,maxFrame:t}=this,i=this.curFrame+e>t?this.curFrame=this.loop?this.minFrame:this.maxFrame:this.curFrame+=e;return this.requestFrame(i),!(i+e>t)||this.onLap()}mainLoopBackwards(){const{skipDelta:e,minFrame:t}=this,i=this.curFrame-et?1:-1,callback:s})}playToFrame(e){this.pause();const{frame:t,speed:i,callback:s,direction:n}=e;this.setDirection(void 0===n?this.curFrame>t?-1:1:n),void 0!==i&&this.setSpeed(i);const a=[this.curFrame,t];-1===this.direction&&a.reverse(),this.loop=!1,this.setMinMax(a[0],a[1]),this.playToFrameOnFrameCallback&&this.removeEventListener("enterFrame",this.playToFrameOnFrameCallback),s&&(this.playToFrameOnFrameCallback=e=>{e===t&&(this.removeEventListener("enterFrame",this.playToFrameOnFrameCallback),s())},this.addEventListener("enterFrame",this.playToFrameOnFrameCallback)),this.play()}setColor(e,t){this.color=e,t&&this.paused&&this.renderFrame2(this.imageData.data,this.curFrame)}setInverseColor(e){this.inverseColor=e}setMinMax(e=0,t=this.frameCount-1){this.minFrame=e,this.maxFrame=t}onLoad(e,t){return i=this,s=void 0,a=function*(){this.frameCount=e,this.fps=t,this.setMinMax(),void 0!==this.initFrame&&(this.initFrame=(0,d.Z)(this.initFrame,this.minFrame,this.maxFrame));const i=this.resetCurrentFrame();if(this.fps<60&&1!==this.skipDelta){const e=60/t;this.skipDelta=this.skipDelta/e|0}this.frInterval=1e3/this.fps/this.speed*this.skipDelta,this.frThen=Date.now()-this.frInterval,!this.skipFirstFrameRendering&&this.requestFrame(i),this.dispatchEvent("ready"),this.addEventListener("enterFrame",(()=>{this.dispatchEvent("firstFrame"),this.canvas[0].parentNode||!this.el||this.overrideRender||this.el.forEach(((e,t)=>e.append(this.canvas[t]))),this.frameListener=()=>{if(this.paused||!this.currentMethod)return;const e=Date.now();this.frThen=e+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})},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}}u.CACHE=c.Z,u.reqId=0},4874:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(1447),n=i(6008),a=i(410),o=i(4789),r=i(2648);const d=new class{constructor(){this.pageId=-1,this.pagesDiv=document.getElementById("auth-pages"),this.scrollableDiv=this.pagesDiv.querySelector(".scrollable"),this.selectTab=(0,n.X)(null,this.scrollableDiv.querySelector(".tabs-container"),null,(()=>{var e;(null===(e=this.page)||void 0===e?void 0:e.onShown)&&this.page.onShown()}))}setPage(e){if(e.isAuthPage){this.pagesDiv.style.display="";const t=(0,r.Z)(e.pageEl);if(this.pageId===t)return;this.selectTab(t),-1!==this.pageId&&t>1&&s.Z.loadLottieWorkers(),this.pageId=t,this.scrollableDiv&&(0,o.Z)({container:this.scrollableDiv,element:this.scrollableDiv.firstElementChild,position:"start"})}else this.pagesDiv.style.display="none",e.pageEl.style.display="",this.pageId=-1;this.page=e}};a.GO.pagesManager=d;const l=d;class c{constructor(e,t,i,s,n){this.isAuthPage=t,this.onFirstMount=i,this.onMount=s,this.onShown=n,this.installed=!1,this.pageEl=document.body.querySelector("."+e)}mount(...e){return t=this,i=void 0,n=function*(){if(this.onMount){const t=this.onMount(...e);t instanceof Promise&&(yield t)}if(!this.installed){if(this.onFirstMount)try{const t=this.onFirstMount(...e);t instanceof Promise&&(yield t)}catch(e){console.error("PAGE MOUNT ERROR:",e)}this.installed=!0}l.setPage(this)},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}}},671:(e,t,i)=>{"use strict";function s(e){return r(o(e)).join("-")}i.d(t,{Ml:()=>c,N0:()=>s,tB:()=>d,w1:()=>r,zu:()=>h});const n=/\uFE0F/g,a=String.fromCharCode(8205),o=e=>e.indexOf(a)<0?e.replace(n,""):e;function r(e){const t=[];let i=0,s=0,n=0;for(;n55296&&i<=56319?s=i:t.push(i.toString(16));return t.length&&2===t[0].length&&(t[0]="00"+t[0]),t}function d(e){const t=e.match(/[\uDFFB-\uDFFF]/);return t?5-(57343-t[0].charCodeAt(0)):0}const l=new Map([["FT","๐Ÿดโ€โ˜ "]]);function c(e){var t;return null!==(t=l.get(e))&&void 0!==t?t:String.fromCharCode(55356,56741+e.charCodeAt(0),55356,56741+e.charCodeAt(1))}function h(e){return e.split("-").reduce(((e,t)=>e+String.fromCodePoint(parseInt(t,16))),"")}},4329:function(e){"undefined"!=typeof self&&self,e.exports=function(e){var t={};function i(s){if(t[s])return t[s].exports;var n=t[s]={i:s,l:!1,exports:{}};return e[s].call(n.exports,n,n.exports,i),n.l=!0,n.exports}return i.m=e,i.c=t,i.d=function(e,t,s){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:s})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var s=Object.create(null);if(i.r(s),Object.defineProperty(s,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)i.d(s,n,function(t){return e[t]}.bind(null,n));return s},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i(i.s=0)}([function(e,t,i){"use strict";(function(t){var i=t.AudioContext||t.webkitAudioContext,s=function(e){if(!s.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};s.isRecordingSupported=function(){return i&&t.navigator&&t.navigator.mediaDevices&&t.navigator.mediaDevices.getUserMedia&&t.WebAssembly},s.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)},s.prototype.encodeBuffers=function(e){if("recording"===this.state){for(var t=[],i=0;i{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)},s.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))))},s.prototype.loadWorker=function(){this.encoder||(this.encoder=new t.Worker(this.config.encoderPath))},s.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,i)=>{var s=i=>{switch(i.data.message){case"ready":t();break;case"page":this.encodedSamplePosition=i.data.samplePosition,e(i.data.page);break;case"done":this.encoder.removeEventListener("message",s),this.finish()}};this.encoder.addEventListener("message",s),this.encoder.postMessage(Object.assign({command:"init",originalSampleRate:this.audioContext.sampleRate,wavSampleRate:this.audioContext.sampleRate},this.config))}))},s.prototype.pause=function(e){if("recording"===this.state){if(this.state="paused",e&&this.config.streamPages){var t=this.encoder;return new Promise(((e,i)=>{var s=i=>{"flushed"===i.data.message&&(t.removeEventListener("message",s),this.onpause(),e())};t.addEventListener("message",s),t.postMessage({command:"flush"})}))}return this.onpause(),Promise.resolve()}},s.prototype.resume=function(){"paused"===this.state&&(this.state="recording",this.onresume())},s.prototype.setRecordingGain=function(e){this.config.recordingGain=e,this.recordingGainNode&&this.audioContext&&this.recordingGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},s.prototype.setMonitorGain=function(e){this.config.monitorGain=e,this.monitorGainNode&&this.audioContext&&this.monitorGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},s.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)}))},s.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 i=s=>{"done"===s.data.message&&(e.removeEventListener("message",i),t())};e.addEventListener("message",i),e.postMessage({command:"done"}),this.config.reuseWorker||e.postMessage({command:"close"})}))}return Promise.resolve()},s.prototype.destroyWorker=function(){"inactive"===this.state&&this.encoder&&(this.encoder.postMessage({command:"close"}),delete this.encoder)},s.prototype.storePage=function(e){this.recordedPages.push(e),this.totalLength+=e.length},s.prototype.streamPage=function(e){this.ondataavailable(e)},s.prototype.finish=function(){if(!this.config.streamPages){var e=new Uint8Array(this.totalLength);this.recordedPages.reduce((function(t,i){return e.set(i,t),t+i.length}),0),this.ondataavailable(e)}this.onstop(),this.config.reuseWorker||delete this.encoder},s.prototype.ondataavailable=function(){},s.prototype.onpause=function(){},s.prototype.onresume=function(){},s.prototype.onstart=function(){},s.prototype.onstop=function(){},e.exports=s}).call(this,i(1))},function(e,t){var i;i=function(){return this}();try{i=i||new Function("return this")()}catch(e){"object"==typeof window&&(i=window)}e.exports=i}])},6802:e=>{var t=.1,i="function"==typeof Float32Array;function s(e,t){return 1-3*t+3*e}function n(e,t){return 3*t-6*e}function a(e){return 3*e}function o(e,t,i){return((s(t,i)*e+n(t,i))*e+a(t))*e}function r(e,t,i){return 3*s(t,i)*e*e+2*n(t,i)*e+a(t)}function d(e){return e}e.exports=function(e,s,n,a){if(!(0<=e&&e<=1&&0<=n&&n<=1))throw new Error("bezier x values must be in [0, 1] range");if(e===s&&n===a)return d;for(var l=i?new Float32Array(11):new Array(11),c=0;c<11;++c)l[c]=o(c*t,e,n);return function(i){return 0===i||1===i?i:o(function(i){for(var s=0,a=1;10!==a&&l[a]<=i;++a)s+=t;--a;var d=s+(i-l[a])/(l[a+1]-l[a])*t,c=r(d,e,n);return c>=.001?function(e,t,i,s){for(var n=0;n<4;++n){var a=r(t,i,s);if(0===a)return t;t-=(o(t,i,s)-e)/a}return t}(i,d,e,n):0===c?d:function(e,t,i,s,n){var a,r,d=0;do{(a=o(r=t+(i-t)/2,s,n)-e)>0?i=r:t=r}while(Math.abs(a)>1e-7&&++d<10);return r}(i,s,s+t,e,n)}(i),s,a)}}}}]); -//# sourceMappingURL=684.a0a965e6cfe303d2345a.chunk.js.map \ No newline at end of file diff --git a/public/684.a0a965e6cfe303d2345a.chunk.js.map b/public/684.a0a965e6cfe303d2345a.chunk.js.map deleted file mode 100644 index 09fc94b1..00000000 --- a/public/684.a0a965e6cfe303d2345a.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"684.a0a965e6cfe303d2345a.chunk.js","mappings":"6NA+UA,MAAMA,EAAuB,IAxStB,MAaLC,cACEC,KAAKC,SAAW,IAAIC,sBAAsBC,IAGxC,IAAI,MAAMC,KAASD,EAAS,CAC1B,MAAME,EAASD,EAAMC,OAErB,IAAI,MAAMC,KAASN,KAAKO,SAAU,CAChC,GAAGP,KAAKQ,yBAAyBF,GAC/B,SAGF,MAAMG,EAAYT,KAAKO,SAASD,GAA6BI,MAAMC,GAAMA,EAAEC,KAAOP,IAClF,GAAII,EAAJ,CAIA,GAAGL,EAAMS,eACPb,KAAKc,QAAQC,IAAIN,GACjBT,KAAKgB,eAAeP,GAAW,OAM1B,CACLT,KAAKc,QAAQG,OAAOR,GACpBT,KAAKgB,eAAeP,GAAW,GAE/B,MAAMS,EAAaT,EAAUA,UAC1BS,aAAsB,KAEvBA,EAAWC,Y,CAQf,K,OAKNnB,KAAKc,QAAU,IAAIM,IAEnBpB,KAAKqB,mBAAqB,IAAID,IAC9BpB,KAAKO,SAAW,CAAC,EACjBP,KAAKsB,SAAW,IAAIC,IACpBvB,KAAKwB,aAAe,CAAC,EACrBxB,KAAKyB,qBAAuB,GAE5BzB,KAAKQ,yBAA2B,CAAC,EACjCR,KAAK0B,cAAe,EAEpB,qBAA4C,QAAQ,EAAEC,UACpC,UAAbA,EAAIC,OACL5B,KAAK0B,cAAe,EACpB1B,KAAK6B,mB,IAIT,qBAA4C,SAAS,KAChD7B,KAAK0B,eACN1B,KAAK0B,cAAe,EACpB1B,KAAK6B,mB,IAIT,qBAAgC,UAAWC,IACzC9B,KAAK6B,iBAAiBC,EAAK,GAE/B,CAEOC,qBAAqBzB,EAAe0B,GACtCA,EAAUhC,KAAKqB,mBAAmBN,IAAIT,GACpCN,KAAKqB,mBAAmBJ,OAAOX,EACtC,CAEO2B,cAAcC,GACnB,MAAMC,EAAyB,GAC/B,IAAI,MAAM7B,KAASN,KAAKO,SACtB,IAAI,MAAM6B,KAAUpC,KAAKO,SAASD,GAC7B8B,EAAOxB,KAAOsB,GACfC,EAAME,KAAKD,GAKjB,OAAOD,CACT,CAEOG,gBAAgBF,GACrB,MAAM,GAACxB,EAAE,UAAEH,GAAa2B,EACnB3B,aAAqB8B,kBACxB9B,EAAU+B,SAGT/B,aAAqB8B,kBAAoB,EAAAE,WAC1CC,YAAW,KACTjC,EAAUkC,IAAM,GAChBlC,EAAUmC,MAAM,GACf,KAGL,MAAMtC,EAAQN,KAAKO,SAAS6B,EAAO9B,OAChCA,KACD,OAAiBA,EAAO8B,GACpB9B,EAAMuC,eACD7C,KAAKO,SAAS6B,EAAO9B,QAIhCN,KAAKC,SAAS6C,UAAUlC,GACxBZ,KAAKc,QAAQG,OAAOmB,GACpBpC,KAAKsB,SAASL,OAAOR,EACvB,CAEOsC,wBAAwBX,GAC7B,MAAMY,EAAOhD,KAAKsB,SAAS2B,IAAIb,GAC5BY,GACDhD,KAAKsC,gBAAgBU,EAEzB,CAEOE,aACLzC,EACAH,EAA4B,GAC5B6C,EACAC,G,YAEA,GAAa,SAAV9C,GAAoBN,KAAKsB,SAAS+B,IAAI5C,GACvC,OAGE0C,IACC1C,aAAqB,IACtB0C,EAAiB1C,EAAUG,GAAG,GACtBH,aAAqB,KAC7B0C,EAAiB1C,EAAU6C,OACnB7C,aAAqB,KAC7B0C,EAAsC,QAArB,EAAA1C,EAAU8C,mBAAW,QAAI9C,EAClCA,aAAqB+C,cAC7BL,EAAiB1C,IAIrB,MAAMuC,EAAsB,CAC1BpC,GAAIuC,EACJ1C,UAAWA,EACXH,QACA8C,cAGCA,GAAqC,kBAAjB,GACrBA,EAAWK,SAAQ,KACjBzD,KAAK+C,wBAAwBtC,EAAU,IAIxCA,aAAqB,MAClB,4BAAoCA,EAAUiD,OAChDjD,EAAUiD,KAAO,6BAIqB,QAA1C,KAAC1D,KAAKO,UAAQ,EAACD,UAA2B,aAAM,IAAI+B,KAAKW,GACzDhD,KAAKC,SAAS0D,QAAQX,EAAKpC,IAC3BZ,KAAKsB,SAASsC,IAAInD,EAAWuC,EAC/B,CAEOa,gBACLC,EACAxD,EACAyD,EACAC,GAIA,QAAaC,IAAV3D,IAAwBN,KAAKO,SAASD,GAEvC,OAGF,MAAM4D,OAAmBD,IAAV3D,EAAqC,CAACA,GAAS6D,OAAOC,KAAKpE,KAAKO,UAE/E,IAAI,MAAMD,KAAS4D,EAAQ,CACzB,GAAGF,GAAuBhE,KAAKQ,yBAAyBF,GACtD,SAGF,MAAM+D,EAAarE,KAAKO,SAASD,IAEjC,OAAe+D,GAAa5D,IAC1BT,KAAKgB,eAAeP,EAAWqD,EAASC,EAAQ,G,CAGtD,CAEOlC,iBAAiBiC,GACtB9D,KAAK6D,gBAAgBC,OAASG,OAAWA,GAAW,EACtD,CAEOjD,eAAeoB,EAAuB0B,EAAmBC,GAC9D,MAAM,GAACnD,EAAE,UAAEH,EAAS,MAAEH,GAAS8B,EAE5B2B,IAAa/D,KAAKwB,aAAalB,MAAW,OAAQM,GAC/CwB,EAAOgB,aAAcW,GACvB/D,KAAKsC,gBAAgBF,GAMtB0B,GACA9D,KAAKyB,sBAAwBzB,KAAKyB,uBAAyBnB,GAC3DG,aAAqB8B,kBAAoBvC,KAAK0B,aAE3CjB,EAAU6D,QAEZ7D,EAAU8D,UAEJ9D,EAAU6D,QAClBtE,KAAKc,QAAQuC,IAAIjB,IACjB3B,EAAU+D,WACRxE,KAAKyB,sBAAwBzB,KAAKyB,uBAAyBnB,GAC3D,aAAyBN,KAAKqB,mBAAmBgC,IAAIjB,EAAO9B,QAG9DG,EAAUgE,MAEd,CAEOC,0BACL,OAAO1E,KAAKyB,oBACd,CAEOkD,wBAAwBrE,EAA4B,IACzDN,KAAKyB,qBAAuBnB,CAC9B,CAEOsE,UAAUtE,GACfN,KAAKwB,aAAalB,IAAS,CAC7B,CAEOuE,YAAYvE,UACVN,KAAKwB,aAAalB,GACzBN,KAAK6D,qBAAgBI,EAAW3D,EAClC,CAEOwE,aAAaxE,GAClB,MAAM+D,EAAarE,KAAKO,SAASD,IAC7B+D,aAAU,EAAVA,EAAYxB,UAIhBwB,EAAWU,SAAStE,IAClBT,KAAKC,SAAS6C,UAAUrC,EAAUG,GAAG,KAGvC,SAAQ,KACNyD,EAAWU,SAAStE,IAClBT,KAAKC,SAAS0D,QAAQlD,EAAUG,GAAG,GACnC,IAEN,CAEOoE,sBAAsB1E,GAC3BN,KAAKQ,yBAAyBF,IAAS,CACzC,CAEO2E,wBAAwB3E,UACtBN,KAAKQ,yBAAyBF,GACrCN,KAAK8E,aAAaxE,EACpB,CAEO4E,wBAAwB5E,EAA2B6E,GACrDA,EAAMnF,KAAKgF,sBAAsB1E,GAC/BN,KAAKiF,wBAAwB3E,EACpC,GAIF,OAAmB,0BAAsCR,GACzD,S,sfC9SA,MAAMsF,EAAwB,MAC5B,IACE,OAAO,EAAA3C,YAAc4C,UAAUC,UAAUC,MAAM,mBAAmB,GAAK,E,CACvE,MAAMC,GACN,OAAO,C,CAEV,EAN6B,GA4BvB,MAAMC,UAAmC,IAAhD,c,oBAOU,KAAAC,MAAoD,IAAInE,IACxD,KAAAoE,UAAiD,IAAIpE,IACrD,KAAAqE,aAAoD,IAAIrE,IAIxD,KAAAsE,oBAA0E,IAAItE,IAC9E,KAAAuE,6BAAkF,IAAIvE,IACtF,KAAAwE,wBAAoE,CAAC,EAkBrE,KAAAC,cAAmD,CACzDC,MAAO,EACPC,MAAO,EACPC,MAAO,GAmHF,KAAAC,aAAe,CAACC,EAAoCX,EAAQ1F,KAAKsG,gBACnEZ,IACDA,EAAMa,YAAcC,KAAKC,IAAI,EAAGf,EAAMa,aAAeF,EAAQK,YA7K/C,K,EAiLX,KAAAC,YAAc,CAACN,EAAoCX,EAAQ1F,KAAKsG,gBAClEZ,IACDA,EAAMa,YAAcC,KAAKI,IAAIlB,EAAMmB,SAAUnB,EAAMa,aAAeF,EAAQK,YAnL5D,K,EAuLX,KAAAI,OAAS,CAACT,EAAoCX,EAAQ1F,KAAKsG,gBAC7DZ,IACDA,EAAMa,YAAcF,EAAQU,S,EA6GxB,KAAAC,oBAA4BtB,GAA4B,EAAD,gCAC7D,MAAMW,EAAUrG,KAAK4F,aAAa3C,IAAIyC,GAChC/D,QAAY3B,KAAKiH,SAASC,eAAeC,OAAOd,EAAQe,OAC9C,UAAbzF,EAAIC,MAAoBD,EAAI0F,mBAAqBjC,GAClDpF,KAAKsH,uBAAuB5B,GAI9B,MAAM6B,QAAqBvH,KAAKiH,SAASO,cAAcC,gBAAgB9F,GACvE+D,EAAM/C,IAAM4E,EAAaG,IAEtB1H,KAAKsG,eAAiBZ,IACvBA,EAAMiC,aAAe3H,KAAK2H,aAEV,UAAbhG,EAAIC,OACL8D,EAAMhC,KAAO1D,KAAK0D,OAKtB,MAAME,EAAM5D,KAAK+F,wBAAwBpE,EAAIiG,IAC1ChE,IACDA,EAAI3C,OAAOyE,GAEP9B,EAAIiE,aACC7H,KAAK+F,wBAAwBpE,EAAIiG,IAG9C,IAsMQ,KAAAE,OAAUC,IAChB,MAAMrC,EAAQqC,EAAE1H,OACVgG,EAAUrG,KAAK4F,aAAa3C,IAAIyC,IAChC,OAACsC,EAAM,IAAEC,GAAO5B,EAIhB6B,EAAMlI,KAAKkI,IACdA,GACDA,EAAI3D,QAGN,MAAM4D,EAAUnI,KAAKoI,kBAAkB1C,GAGvC,GADsB1F,KAAKsG,eACNZ,EAAO,CAC1B1F,KAAKqI,OACLrI,KAAKsI,SAAS5C,EAAOyC,GAErB,MAAMI,EAAUrG,GAAuBA,EAAQ+F,MAAQA,GAAO/F,EAAQ8F,SAAWA,EAC3EQ,EAAaxI,KAAKwI,WAClBC,EAAUD,EAAWE,aAC3B,IAAID,IAAYF,EAAOE,GAAU,CAC/B,IAAIE,EAEJ,IAAI,MAAMC,IAAiB,EAAC,GAAO,GAAO,CACxC,MAAMC,EAAWL,EAAWM,YAAYF,GAExC,IAAIG,EAAMF,EAASG,UAAUT,GAW7B,IAVY,IAATQ,EACDJ,IAAeE,EAAShG,OAASkG,IAGjCA,EADaP,EAAWS,QAAQL,GACrBI,UAAUT,IACT,IAATQ,IACDJ,EAAaI,EAAM,SAIL9E,IAAf0E,EACD,K,CAIDA,EACD3I,KAAKkJ,GAAGP,GAAY,GAEpB3I,KAAKmJ,WAAW,CAACnB,SAAQC,O,EAM/BvF,YAAW,KACN1C,KAAKsG,eAAiBZ,IAIzB1F,KAAKoJ,cAAc,OAAQpJ,KAAKqJ,qBAChCrJ,KAAKsJ,wBAAuB,GAC3B,EAAE,EAGC,KAAAC,QAAWxB,IAYjB/H,KAAKoJ,cAAc,QAAQ,EAGrB,KAAAI,QAAWzB,IACjB,IAAIA,EAAE0B,UACJ,OAGFzJ,KAAKuJ,QAAQxB,GAIb,MAAMS,EAAaxI,KAAKwI,YACrBxI,KAAK0J,kBACJ1J,KAAK2J,QAASnB,EAAWC,SAAYD,EAAWoB,KAAK/G,SACtD2F,EAAWS,SAAQ,GAAMpG,QACzB7C,KAAK4J,SACN5J,KAAKqI,OACLrI,KAAKoJ,cAAc,Q,EAmChB,KAAA3E,KAAO,IACLzE,KAAK6J,QAAO,GAGd,KAAAtF,MAAQ,IACNvE,KAAK6J,QAAO,GAGd,KAAAxB,KAAO,CAAC3C,EAAQ1F,KAAKsG,gBAC1B,IAAIZ,EACF,OAAO,EAUT,GAPIA,EAAMpB,QACRoB,EAAMnB,QAGRmB,EAAMa,YAAc,GACpB,OAAcb,EAAO,SAElBA,IAAU1F,KAAKsG,aAAc,CAC9B,MAAMD,EAAUrG,KAAK4F,aAAa3C,IAAIyC,GACtC,GAAGW,aAAO,EAAPA,EAASyD,MAAO,CACjBpE,EAAM/C,IAAM,GACZ,MAAMqF,EAAS3B,EAAQ2B,OACjB+B,EAAI1D,EAAQ2D,YAAchK,KAAK2F,UAAY3F,KAAK0F,MAChDuE,EAAUF,EAAE9G,IAAI+E,GACnBiC,IACDA,EAAQhJ,OAAOoF,EAAQ4B,KAEnBgC,EAAQpC,MACVkC,EAAE9I,OAAO+G,IAIbtC,EAAMlD,SAENxC,KAAK4F,aAAa3E,OAAOyE,E,CAG3B1F,KAAKsG,kBAAerC,EACpBjE,KAAKkK,sBAAmBjG,C,CAG1B,OAAO,CAAI,EAGN,KAAAkG,SAAYnH,IACjB,MAAM,OAACgF,EAAM,IAAEC,GAAOjF,EAChBgH,EAAchK,KAAKoK,cAAcJ,YACzBhK,KAAKqK,SAASrC,EAAQC,EAAK+B,GAMnCvF,OAEN/B,YAAW,KACT1C,KAAKsK,2BAA2BtC,EAAQC,EAAK+B,EAAY,GACxD,EAAE,EAGA,KAAAd,GAAK,CAACrG,EAAgB0H,KAC3B,MAAM/B,EAAaxI,KAAKwI,WACxB,IAAGxI,KAAK0J,iBAAoBlB,EAI5B,MAA6B,UAA1BxI,KAAKkK,iBACC1B,EAAWgC,QAAQ3H,EAAQ0H,GAE3B/B,EAAWU,GAAGrG,EAAQ0H,E,EAY1B,KAAAE,YAAczK,KAAK0K,qBAAqBxE,GAAUlG,KAAK6J,QAAO,EAAM3D,KACpE,KAAAyE,aAAe3K,KAAK0K,qBAAqBxE,GAAUlG,KAAK6J,QAAO,EAAO3D,KACtE,KAAA0E,YAAc5K,KAAK0K,qBAAqBxE,GAAUlG,KAAKqI,KAAKnC,KAC5D,KAAA2E,oBAAsB7K,KAAK0K,qBAAoB,CAACxE,EAAOG,IAAYrG,KAAKoG,aAAaC,EAASH,KAC9F,KAAA4E,mBAAqB9K,KAAK0K,qBAAoB,CAACxE,EAAOG,IAAYrG,KAAK2G,YAAYN,EAASH,KAC5F,KAAA6E,cAAgB/K,KAAK0K,qBAAoB,CAACxE,EAAOG,IAAYrG,KAAK8G,OAAOT,EAASH,KAClF,KAAA8E,YAAchL,KAAK0K,qBAAqBxE,GAAUA,GAASlG,KAAK4J,SAChE,KAAAqB,gBAAkBjL,KAAK0K,qBAAqBxE,GAAUA,EAAQlG,KAAKkL,YAAYhF,GAASlG,KAAK6I,aAE7F,KAAAe,KAAO,IACL5J,KAAKkJ,GAAG,GAGV,KAAAL,SAAW,KAChB,IAAG7I,KAAKkL,YAAYlL,KAAKsG,cAIzB,OAAOtG,KAAKkJ,IAAI,EAAE,CAsMtB,CAr3BEiC,UAAUlE,GAOR,GANAjH,KAAKiH,SAAWA,EAChBjH,KAAKoL,UAAYC,SAASC,cAAc,OAExCtL,KAAKoL,UAAUG,MAAMC,QAAU,iBAC/BH,SAASI,KAAKC,OAAO1L,KAAKoL,WAEvB/F,UAAUsG,aAAc,CACzB,MAAMC,EAAwE,CAC5EnH,KAAMzE,KAAKyK,YACXlG,MAAOvE,KAAK2K,aACZtC,KAAMrI,KAAK4K,YACXiB,aAAc7L,KAAK6K,oBACnBiB,YAAa9L,KAAK8K,mBAClBiB,OAAQ/L,KAAK+K,cACbiB,cAAehM,KAAKiL,gBACpBgB,UAAWjM,KAAKgL,aAGlB,IAAI,MAAMkB,KAAUN,EAClB,IACEvG,UAAUsG,aAAaQ,iBAAiBD,EAA8BN,EAAQM,G,CAC9E,MAAM1G,GACN4G,QAAQC,KAAK,wCAAyCH,E,EAK5D,qBAA2B,uBAAwB9E,IACjD,MAAMxD,EAAM5D,KAAK+F,wBAAwBqB,GACzC,GAAGxD,EACD,IAAI,MAAM8B,KAAS9B,EACjB5D,KAAKgH,oBAAoBtB,E,IAK/B,qBAA2B,cAAc,KACpC1F,KAAKsM,mBACNtM,KAAKsM,oBAAqB,GAIxBtM,KAAKuE,SAAWvE,KAAKkI,KACvBlI,KAAKkI,IAAI3D,O,IAIb,MAAMgI,EAAuD,CAAC,EACjD,CACX,SACA,QACA,eACA,OACA,SAEGxH,SAASyH,IACZ,MAAMC,EAAQ,IAAMD,EACpBD,EAAWC,GAAO,CAChBvJ,IAAK,IAAMjD,KAAKyM,GAChB7I,IAAM8I,IACD1M,KAAKyM,KAAUC,IAKlB1M,KAAKyM,GAAQC,GACV1M,KAAKsG,cAAyB,SAARkG,GAA4C,UAA1BxM,KAAKkK,kBAAyC,UAARsC,IAE/ExM,KAAKsG,aAAakG,GAAOE,GAGhB,iBAARF,QAAoDvI,IAA1BjE,KAAKkK,mBAChClK,KAAKgG,cAAchG,KAAKkK,kBAAoBwC,GAG9C1M,KAAK2M,yBAAwB,EAEhC,IAEHxI,OAAOyI,iBAAiB5M,KAAMuM,EAChC,CAEQI,yBACN3M,KAAKoJ,cAAc,iBAAkBpJ,KAAK6M,oBAC5C,CAEOA,oBACL,MAAM,OAACC,EAAM,MAAEC,EAAK,aAAEpF,EAAY,cAAE3B,EAAa,KAAEtC,EAAI,MAAEiG,GAAS3J,KAClE,MAAO,CACL8M,SACAC,QACApF,eACA3B,gBACAtC,OACAiG,QAEJ,CAEOqD,kBAAkBC,GACvBjN,KAAKgG,cAAgBiH,EAAOjH,cAC5BhG,KAAKkN,QAAUD,EAAOH,OACtB9M,KAAKmN,OAASF,EAAOF,MACrB/M,KAAKoN,cAAgBH,EAAOtF,aAC5B3H,KAAKqN,MAAQJ,EAAOvJ,KACpB1D,KAAKsN,OAASL,EAAOtD,KACvB,CAoBO4D,SAASpF,EAA0BqF,EAAmB1D,GAC3D,MAAM,OAAC9B,EAAM,IAAEC,GAAOE,EAGhB4B,EADgB5B,EAAQsF,OAAOC,aACb1N,KAAK2F,UAAY3F,KAAK0F,MAC9C,IAAIuE,EAAUF,EAAE9G,IAAIkF,EAAQH,QACxBiC,GACFF,EAAEnG,IAAIuE,EAAQH,OAAQiC,EAAU,IAAI1I,KAGtC,IAAImE,EAAQuE,EAAQhH,IAAIgF,GACxB,GAAGvC,EACD,OAAOA,EAGT,MAAM/D,GAAM,OAAoBwG,GAChC8B,EAAQrG,IAAIqE,EAAKvC,EAAQ2F,SAASC,cAA2B,UAAb3J,EAAIC,MAAiC,UAAbD,EAAIC,KAAmB,QAAU,UAIzF,UAAbD,EAAIC,MACL8D,EAAMiI,aAAa,cAAe,QAIpC,MAAMtH,EAAwB,CAC5B2B,SACAC,MACAb,MAAOzF,EAAIiG,GACXjG,MACAwG,UACA2B,QACAE,YAAa7B,EAAQsF,OAAOC,cAG9B1N,KAAK4F,aAAahC,IAAI8B,EAAOW,GAG7BX,EAAMoH,OAAS,EAGf9M,KAAKoL,UAAUM,OAAOhG,GAEtBA,EAAMkI,iBAAiB,OAAQ5N,KAAK8H,QACpCpC,EAAMkI,iBAAiB,QAAS5N,KAAKuJ,SACrC7D,EAAMkI,iBAAiB,QAAS5N,KAAKwJ,SAErB,UAAb7H,EAAIC,OAAoBuG,aAAO,EAAPA,EAASsF,OAAOI,eAAgB1F,EAAQ2F,SAAW,UAC5EpI,EAAMkI,iBAAiB,cAAc,KACnC5N,KAAKiH,SAAS8G,mBAAmBC,aAAahG,EAAQ,CAACC,GAAK,GAC3D,CAACgG,MAAM,IAiBZ,MAAMC,GAAW,SACjB,GAAGV,EACDU,EAASC,cACJ,CACL,MAAMC,EAAIjG,EAAQsF,OAAOC,aAAe1N,KAAK8F,6BAA+B9F,KAAK6F,oBACjF,IAAIwI,EAAiBD,EAAEnL,IAAI+E,GACvBqG,GACFD,EAAExK,IAAIoE,EAAQqG,EAAiB,IAAI9M,KAGrC8M,EAAezK,IAAIqE,EAAKiG,E,CAoB1B,OAjBAA,EAASI,MAAK,IAAW,EAAD,gCAItB,GAAG3M,EAAI0F,0BAA4BrH,KAAKiH,SAASO,cAAcC,gBAAgB9F,IAAM+F,IACnF1H,KAAKgH,oBAAoBtB,OACpB,CACL,IAAI9B,EAAM5D,KAAK+F,wBAAwBpE,EAAIiG,IACvChE,IACFA,EAAM5D,KAAK+F,wBAAwBpE,EAAIiG,IAAM,IAAIxG,KAGnDwC,EAAI7C,IAAI2E,GACR,qBAAoC,CAACA,MAAO/D,G,CAEhD,MAEO+D,CACT,CAEO2E,SAASrC,EAAgBC,EAAa+B,GAC3C,MAAMD,GAAKC,EAAchK,KAAK2F,UAAY3F,KAAK0F,OAAOzC,IAAI+E,GAC1D,OAAO+B,aAAC,EAADA,EAAG9G,IAAIgF,EAChB,CAkCQX,uBAAuB5B,GAC7BA,EAAMkI,iBAAiB,QAAQ,KAM7B,MAAMrH,EAAcb,EAAMa,YAG1Bb,EAAMkI,iBAAiB,YAAY,KACjClI,EAAMa,YAAcb,EAAMmB,SAAW,EAErCnB,EAAMkI,iBAAiB,YAAY,KACjClI,EAAMa,YAAcA,EAIhBb,EAAMpB,QACRoB,EAAMjB,M,GAEP,CAACwJ,MAAM,GAAM,GACf,CAACA,MAAM,GAAM,GAEpB,CAEO3D,2BAA2BtC,EAAgBC,EAAa+B,GAC7D,MAAMoE,EAAIpE,EAAchK,KAAK8F,6BAA+B9F,KAAK6F,oBAC3DoE,EAAUmE,EAAEnL,IAAI+E,GACtB,IAAIiC,EACF,OAGF,MAAMsE,EAAUtE,EAAQhH,IAAIgF,GACzBsG,IACDA,EAAQJ,UACRlE,EAAQhJ,OAAOgH,GAEXgC,EAAQpC,MACVuG,EAAEnN,OAAO+G,GAGf,CAKOwG,kBAAkB9I,GAEvB,QAASA,EAAM+I,eACjB,CAEQC,mBAAmBhJ,EAAyBgH,GAElDhH,EAAM+I,gBAAkB/B,CAC1B,CAEciC,gBAAgBxG,EAA0B7B,EAAetG,KAAKsG,c,iDAC1E,GAAG+E,SAASuD,wBACV,aAGI,OAAYtI,OAAcrC,GAAW,GAE3C,MAAMtC,GAAM,OAAoBwG,GAE1B0G,EAAwB,GAExBC,EAAuB,UAAbnN,EAAIC,MAAiC,UAAbD,EAAIC,KAC5C,IAAImN,EAAQ,GAAIC,EAAS,GAEzB,GAAa,QAAV,EAAArN,EAAIsN,cAAM,eAAEpM,OAAQ,CACrB,MAAMgF,EAAOlG,EAAIsN,OAAOtN,EAAIsN,OAAOpM,OAAS,GAC5C,IAAKgF,EAAqCqH,MAAO,CAC/C,MAAM3H,QAAqBvH,KAAKiH,SAASO,cAAcC,gBAAgB9F,EAAKkG,EAAKjG,MAE9E2F,EAAaG,IACdmH,EAAQxM,KAAK,CACXM,IAAK4E,EAAaG,IAClByH,MAAO,GAAItH,EAA6BuG,KAAMvG,EAA6BuH,IAC3ExN,KAAM,eAGS,qBAAoC,CAAC8D,MAAO/D,EAAK0N,MAAOxH,IAChEyG,MAAK,KACTtO,KAAKsG,eAAiBA,GAAiBiB,EAAaG,KAIvD1H,KAAK2O,gBAAgBxG,EAAQ,G,OAI9B,GAAG2G,EAAS,CACjB,MAAM9G,EAASG,EAAQ2F,QAAU3F,EAAQH,aACjBhI,KAAKiH,SAASqI,gBAAgBC,aAAavH,GAqBnE+G,QAAc,OAAa,CAAC/G,SAAQwH,WAAW,EAAMC,eAAe,IACpET,EAAS,YAAyB,UAAbrN,EAAIC,KAAmB,cAAgB,eAAe,E,CAG7E,IAAIkN,EAAS,CACX,MAAMY,EAAY/N,EAAIgO,WAAWjP,MAAMgP,GAA8B,2BAAhBA,EAAUE,IAC/Db,EAAwB,QAAhB,EAAAW,aAAS,EAATA,EAAWX,aAAK,QAAIpN,EAAIkO,UAChCb,EAASU,aAAS,EAATA,EAAWI,S,CAGlBjB,EAAQhM,SACP,EAAAkN,SACE,IACDlB,EAAQxM,KAAK,CACXM,IAAK,8CACLwM,MAAO,UACPvN,KAAM,cAGRiN,EAAQxM,KAAK,CACXM,IAAK,kCACLwM,MAAO,UACPvN,KAAM,cAIV,CAAC,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,KAAKmD,SAAS8C,IACzC,MAAMsH,EAAQ,GAAGtH,KAAQA,IACzBgH,EAAQxM,KAAK,CACXM,IAAK,6BAA6BwM,QAClCA,QACAvN,KAAM,aACN,KAKR,MAAMoO,EAAW,IAAIC,cAAc,CACjClB,QACAC,SACAH,YAGFxJ,UAAUsG,aAAaqE,SAAWA,C,IAG7BE,sBACL,MAAM,aAAC5J,GAAgBtG,KACvB,IAAIsG,EAAc,OAClB,MAAM6B,EAAUnI,KAAKoI,kBAAkB9B,GACvCtG,KAAK2O,gBAAgBxG,EAAS7B,EAChC,CAEQ8B,kBAAkB1C,GAExB,OADgB1F,KAAK4F,aAAa3C,IAAIyC,GACvByC,OAMjB,CAEOkB,oBACL,MAAM,aAAC/C,GAAgBtG,KACvB,IAAIsG,EACF,OAGF,MAAM6B,EAAUnI,KAAKoI,kBAAkB9B,GACvC,MAAO,CACL3E,KAAK,OAAoBwG,GACzBA,UACAzC,MAAOY,EACP6J,eAAgBnQ,KAAK6M,oBAEzB,CAmGOvD,wBACLtJ,KAAKsM,oBAAqB,EAC1B,kBAAwB,aAC1B,CAMOzC,OAAOpF,EAAgBiB,EAAQ1F,KAAKsG,cACzC,QAAIZ,SAIQzB,IAATQ,IACDA,EAAOiB,EAAMpB,QAGZoB,EAAMpB,SAAWG,IAIjBA,EACDiB,EAAMjB,OAENiB,EAAMnB,SAGD,GACT,CA8EQmG,oBAAoB0F,GAK1B,OAJ4C/J,IAC1C+J,EAAGpQ,KAAKkI,IAAK7B,EAAQ,CAIzB,CAuBO6E,YAAYxF,GACjB,OAAGA,aAAK,EAALA,EAAOa,aAAc,IACtBb,EAAMa,YAAc,EACpBvG,KAAK6J,QAAO,EAAMnE,IACX,EAIX,CAEO2K,aAAa3K,GAClB1F,KAAKsQ,kBAAoB5K,CAC3B,CAEO6K,iBAAiBC,GACtB,QAAG,OAAUxQ,KAAKoK,cAAeoG,KAIjCxQ,KAAKoK,eAAgB,OAAKoG,IACnB,EACT,CAEOC,mBACL,OAAOzQ,KAAKoK,aACd,CAEOjB,WAAWV,EAAoBiI,EAAoB9G,GACxD,IAAIpB,EAAaxI,KAAKwI,WAClBA,EAiBFA,EAAWmI,QAhBXnI,EAAaxI,KAAKwI,WAAa,IAAI,IAAiB,CAClDoI,UAAW,GACXC,aAAc,EACdC,YAAc3I,IACZnI,KAAKuN,SAASpF,GAAS,GAChB,CAACH,OAAQG,EAAQH,OAAQC,IAAKE,EAAQF,MAE/C8I,OAAQ,CAAC/N,EAAMgO,KACbhR,KAAKmK,SAASnH,EAAK,EAErBiO,UAAW,KACTjR,KAAKoJ,cAAc,QACnBpJ,KAAKqI,MAAM,IAOjB,MAAM6I,OAA0CjN,IAAhCjE,KAAKoK,cAAc+G,SAChCT,EACDlI,EAAWW,WAAWuH,EAAM9G,EAAMsH,GAElC1I,EAAW0I,QAAUA,EAGvB1I,EAAW+H,iBAAiBvQ,KAAKoK,eACjC5B,EAAWC,QAAUA,EAErBD,EAAW5F,MAAK,GAChB4F,EAAW5F,MAAK,EAClB,CAEQwO,gCAAgCjJ,GACtC,MAAMxG,GAAM,OAAoBwG,GAChC,IAAIkJ,EAA+B,QASnC,OARG1P,aAAG,EAAHA,EAAKC,QACU,UAAbD,EAAIC,MAAiC,UAAbD,EAAIC,KAC7ByP,EAAY,QACS,UAAb1P,EAAIC,OACZyP,EAAY,UAITA,CACT,CAEO/I,SAAS5C,EAAyByC,GACvC,MAAMkJ,EAAYrR,KAAKoR,gCAAgCjJ,GAEvDnI,KAAKoN,cAAgBpN,KAAKgG,cAAcqL,GAExCrR,KAAKsG,aAAeZ,EACpB1F,KAAKkK,iBAAmBmH,EACxBrR,KAAKsG,aAAawG,OAAS9M,KAAK8M,OAChC9M,KAAKsG,aAAayG,MAAQ/M,KAAK+M,MAC/B/M,KAAKsG,aAAaqB,aAAe3H,KAAK2H,aAErB,UAAd0J,IACDrR,KAAKsG,aAAa5C,KAAO1D,KAAK0D,MAG7B,iBAAkB2B,WACnBrF,KAAK2O,gBAAgBxG,EAEzB,CAEOmJ,eAAe5L,EAA0ByC,GAC9C,MAAM7B,EAAetG,KAAKsG,aAEpBiL,EAAavR,KAAKuE,QAExB,IAAIuD,EAyBJ,OAxBGpC,GACDoC,EAAS,KACP,MAAMI,EAAMlI,KAAKkI,IACdA,GACDA,EAAI3D,QAGNvE,KAAKsJ,uBAAuB,EAG1B5D,EAAMpB,QACRwD,IAGFpC,EAAMkI,iBAAiB,OAAQ9F,IAE/B9H,KAAKsJ,wBAGPtJ,KAAKqQ,kBAAapM,GACfyB,EAAO1F,KAAKsI,SAAS5C,EAAOyC,GAC1BnI,KAAKsG,kBAAerC,EACzBjE,KAAKwR,iBAAgB,GAEd,CAACC,EAAaF,KACnBvR,KAAKwR,iBAAgB,GAElBlL,IACEtG,KAAK4F,aAAa3C,IAAIqD,GACvBtG,KAAKsI,SAAShC,EAActG,KAAKoI,kBAAkB9B,IAEnDtG,KAAK4J,QAAU5J,KAAK6I,YAKrB7I,KAAKsG,eAAiBZ,IACvB1F,KAAKsG,kBAAerC,EACpBjE,KAAKkK,sBAAmBjG,GAGvByB,GACDA,EAAMgM,oBAAoB,OAAQ5J,GAQjC2J,GACDzR,KAAKyE,M,CAGX,CAEO+M,gBAAgBG,GACrB3R,KAAK0J,iBAAmBiI,CAC1B,CAEOC,oBAAoB1L,GACzBlG,KAAKkI,IAAMhC,EAIX,MAAM2L,EAAiB,IAAI,IAC3BA,EAAe9Q,IAAImF,EAAnB2L,CAA0B,yBAAyB,KAC9C7R,KAAKkI,MAAQhC,IAIhBlG,KAAKkI,SAAMjE,EAKX4N,EAAeC,YAAW,GACzB,CAAC7D,MAAM,IAEV4D,EAAe9Q,IAAImF,EAAnB2L,CAA0B,QAAS9J,IAC9B/H,KAAKsG,eAAiBJ,GACvBlG,KAAKuE,QAGPvE,KAAKsJ,uBAAuB,GAOhC,EAGF,MAAMyI,EAA6B,IAAItM,EACvC,gCAA4CsM,EAC5C,S,shBC77Be,MAAMC,UAAuB,IAMtC5H,oBACF,OAAOpK,KAAKwI,WAAW4B,aACzB,CAEArK,cA4BE,IAAIkS,EA3BJC,MAAM,IAAI,IAAiB,CACzBpB,YAAc9N,IACZ,MAAMmP,EAAqD,gCAArCnS,KAAKoK,cAAcgI,YAAYxC,GAC/C,IAAC3H,EAAG,OAAED,GAAUhF,EAChB0C,GAA8B,OAAoB1C,GAExD,GAAI0C,KAEDyM,GAAkBH,EAAeK,mCAAmC3M,IAIvE,MAAO,CAACxD,QAAS,KAAqB+F,MAAKD,SAAO,IAElD,CAAC,SAAU,YA8GjB,KAAAsK,YAAoBjS,GAAqC,EAAD,gCACtDL,KAAKuS,gBAAgBvS,KAAKwS,iBAAiBnS,EAAO2H,OAAQ3H,EAAO4H,KAAM5H,EAAO6B,SAAU,EAC1F,IAEA,KAAAuQ,YAAoBpS,GAAqC,EAAD,gCACtDL,KAAKuS,gBAAgBvS,KAAKwS,iBAAiBnS,EAAO2H,OAAQ3H,EAAO4H,KAAM5H,EAAO6B,QAAS,EACzF,IAEA,KAAAwQ,cAAgB,KACd,MAAMrS,EAASL,KAAKK,OACpB,IAAI,IAAoBA,EAAO2H,OAAQ,CAAC3H,EAAO4H,KAAM,QAAQ,KAC3DjI,KAAKK,OAAS,CAAC6B,QAASlC,KAAK2S,QAAQjN,OACrC1F,KAAK4S,OAAO,GACZ,EAGJ,KAAAC,eAAiB,KACf,MAAMxS,EAASL,KAAKK,OACjBA,EAAO4H,KAER,IAAI,IAAa,CACf,CAAC5H,EAAO2H,QAAS,CAAC3H,EAAO4H,OACxB,IACMjI,KAAK4S,S,EAKlB,KAAAE,cAAsB/K,GAAkB,EAAD,gCACrC,MAAM,IAACE,EAAG,OAAED,GAAUhI,KAAKK,OAC3B,GAAG4H,GAAOA,IAAQ8K,OAAOC,iBAAkB,CACzC,MAAMC,EAAWjT,KAAKoK,cAAc6I,SAC9B9K,QAAgBnI,KAAKwS,iBAAiBxK,EAAQC,GACpDjI,KAAK4S,MAAM7K,GAEVuG,MAAK,IAAW,EAAD,gCACd,GAAG,aAAqB,CACtB,MAAM4E,EAAM,YAAuB,KAChCA,GACDA,EAAIN,O,CAIR,kBAA0B,CACxB5K,OAAQG,EAAQH,OAChBmL,UAAWlL,EACXrG,KAAMqR,EAAW,kBAAehP,EAChCgP,YAEJ,K,CAEJ,IAEA,KAAAG,gBAAkB,KAChB,MAAM,QAACjL,GAAWnI,KAAKK,OACjBqF,GAAQ,OAAoByC,GAC9BzC,GACJ,mBAAkC,CAACA,QAAO2N,QAAS,yCAAiD,EArKpGrT,KAAKwI,WAAWyI,UAAY,KAC1BjR,KAAK4S,OAAO,EAOd5S,KAAK2S,QAAQW,QAAUjI,SAASC,cAAc,OAC9CtL,KAAK2S,QAAQW,QAAQC,UAAUxS,IAAI,IAAyB,WAAY,sBAGxE,MAAMyS,EAAoB,KACrBvB,GACDwB,aAAaxB,GAGfA,EAAiByB,OAAOhR,YAAW,KACjCuP,OAAiBhO,EACjBjE,KAAK2S,QAAQW,QAAQC,UAAU/Q,OAAO,aAAa,GAClD,IAAI,EAETxC,KAAK2S,QAAQW,QAAQ1F,iBAAiB,cAAc,KAC9C,eAEJ5N,KAAK2S,QAAQW,QAAQC,UAAUxS,IAAI,cAEhCkR,IACDwB,aAAaxB,GACbA,OAAiBhO,GAGnBoH,SAASuC,iBAAiB,WAAY4F,EAAmB,CAACvF,MAAM,IAAM,IAG9C,IAAI,KAAWjO,KAAK2S,QAAQW,SACpCK,mBAAqBH,EAGvCxT,KAAK4T,SAASlI,OAAO1L,KAAK2S,QAAQW,UAElC,QAAiBtT,KAAK6T,QAAQ5S,OAAQjB,KAAK0S,eAE3C,MAAMmB,EAA6C,CAAC7T,KAAK8T,eAAiB,CACxEC,KAAM,UACNC,KAAM,UACNC,QAASjU,KAAK6S,gBACb7S,KAAKkU,gBAAkB,CACxBH,KAAM,WACNC,KAAM,+BACNC,QAASjU,KAAKoT,iBACbpT,KAAKmU,cAAgB,CACtBJ,KAAM,gBACNC,KAAM,SACNC,QAASjU,KAAK0S,gBAGhB1S,KAAKoU,iBAAiBP,GAItB7T,KAAKqU,cACP,CAEUA,eACRnC,MAAMmC,gBACN,QAAiBrU,KAAK6T,QAAQS,QAAStU,KAAK6S,iBAC5C,QAAiB7S,KAAKuU,OAAOnJ,UAAWpL,KAAK8S,eAE7C,MAAM0B,EAAkBzM,IACtB,MAAM0M,GAAI,OAAU1M,EAAE1H,OAAQ,KACxBqU,GAAU,OAAgB3M,EAAE1H,OAAQ,WAC1C,GAAGoU,aAAaE,qBAAuBD,GAAW1U,KAAK2S,QAAQW,QAAQC,UAAUqB,SAAS,uBAAwB,CAChH,MAAMC,EAAUJ,EAAEK,aAAa,WAC/B,IAAID,GAAWA,EAAQE,SAAS,mBAC9B,OAUF,OAPA,OAAYhN,GAEZ/H,KAAK4S,QAAQtE,MAAK,KAChBtO,KAAK2S,QAAQW,QAAQ5B,oBAAoB,QAAS8C,EAAgB,CAACQ,SAAS,IAC5EP,EAAEQ,OAAO,KAGJ,C,GAIXjV,KAAK2S,QAAQW,QAAQ1F,iBAAiB,QAAS4G,EAAgB,CAACQ,SAAS,GAC3E,CAcUxC,iBAAiBxK,EAAgBC,GACzC,OAAOjI,KAAKoK,cAAcJ,YAAchK,KAAKiH,SAAS8G,mBAAmBmH,0BAA0BlN,EAAQC,GAAOjI,KAAKiH,SAAS8G,mBAAmByE,iBAAiBxK,EAAQC,EAC9K,CA8DQkN,WAAWhN,GACjB,MAAMmL,EAAWnL,EAA4BA,QAC7C,IAAIiN,EAA2C,GAC5C9B,IACD8B,GAAO,QAAa9B,EAAS,CAC3B+B,SAAWlN,EAA4BmN,kBAK3C,OAAatV,KAAK2S,QAAQW,QAAQiC,kBAAmBH,GACrDpV,KAAK2S,QAAQW,QAAQC,UAAU1J,OAAO,QAASyJ,EAEjD,CAEO/C,iBAAiBC,GAGtB,OAFAxQ,KAAKwI,WAAW+H,iBAAiBC,GAE1BxQ,IACT,CAEauS,UAAUpK,EAAoB9H,EAAsBmV,EAAY,EAAGtE,GAAU,EACxFuE,EAA0C,GAAIC,EAA0C,I,6GACxF,GAAG1V,KAAK2V,gBAAiB,OAAO3V,KAAK2V,gBAErC,MAAM1N,EAAME,EAAQF,IACd6F,EAAU3F,EAA4ByN,WAAazN,EAAQ2F,OAAU3F,EAA4ByN,SAASC,UAAY1N,EAAQ2F,OAC9HpI,GAAQ,OAAoByC,GAE5B2N,QAAmB9V,KAAKiH,SAASqI,gBAAgBwG,WAAW3N,EAAQH,QACpE+N,EAAiC,mBAAd5N,EAAQyH,EAC3BoG,EAAqBD,WAA4B/V,KAAKiH,SAAS8G,mBAAmBkI,WAAW9N,IAC7F+N,GAAuBH,EAAmBD,EAAaE,MAAwB,OAAoB7N,GAC/B,CACxE,CAAC,CAACnI,KAAK6T,QAAQS,QAAStU,KAAK8T,gBAAiBkC,GAC9C,CAAC,CAAChW,KAAK6T,QAAQsC,SAAUnW,KAAKkU,iBAAkBgC,GAChD,CAAC,CAAClW,KAAK6T,QAAQ5S,OAAQjB,KAAKmU,uBAAwBnU,KAAKiH,SAAS8G,mBAAmBqI,iBAAiBjO,MAGtGpD,SAAQ,EAAE8O,EAASwC,MACnBxC,EAAQ9O,SAASuR,IACZA,aAAkB9S,YACnB8S,EAAO/C,UAAU1J,OAAO,OAAQwM,GAEhCC,EAAO/N,OAAS,KAAO8N,C,GAEzB,IAGJrW,KAAK4T,SAASL,UAAU1J,OAAO,cAAeqM,GAE9ClW,KAAKmV,WAAWhN,GAChB,MAAMoG,EAAU,EAAMgI,WAAU,UAAC7Q,EAAOyC,EAAQqO,KAAM1I,EAAQ0H,EAAWnV,EAAQ6Q,EAASuE,EAAaC,EAAavN,GAKpH,OAJAnI,KAAKK,OAAO4H,IAAMA,EAClBjI,KAAKK,OAAO2H,OAASG,EAAQH,OAC7BhI,KAAKK,OAAO8H,QAAUA,EAEfoG,CACT,G,CAEOkI,0CAA0C/Q,GAC/C,MAAmB,UAAZA,EAAMkK,GAAiB,QAA+BlK,EAAMgR,UACrE,E,wPChRa,MAAMC,UAAoB,IAoBvC5W,aAAY,MAACmG,EAAK,KAAEzB,GAAO,EAAK,WAAEmS,GAAa,EAAK,SAAE/P,EAAQ,yBAAEgQ,EAAwB,MAAEC,EAAK,WAAEC,IAuC/F,GA9BA7E,QAEAlS,KAAKkG,MAAQA,EACblG,KAAKgX,QAAU3L,SAASC,cAAc,OACtCtL,KAAKgX,QAAQzD,UAAUxS,IAAI,gBAE3Bf,KAAK6W,yBAA2BA,EAChC7W,KAAK8W,MAAQA,EACb9W,KAAK+W,WAAaA,EAElB/W,KAAK6R,eAAiB,IAAI,IAE1B7R,KAAKiX,MAAM,CACT/U,QAASlC,KAAKgX,QACdnF,eAAgB7R,KAAK6R,eACrBqF,gBAAiB,MACPlX,KAAKkG,MAAM5B,QAAYtE,KAAKmX,oBAAuBnX,KAAKmX,mBAAmB5D,UAAUqB,SAAS,cAExGwC,uBAAwB,uBACxBC,qBAAsB,mBAGxBnR,EAAMoR,WAAWC,aAAavX,KAAKgX,QAAS9Q,GAC5ClG,KAAKgX,QAAQQ,YAAYtR,GAEzBlG,KAAKyX,KAAO,UAEZzX,KAAK0X,YAAY7Q,GACjB7G,KAAKoU,mBAEY,YAAdpU,KAAKyX,KAAoB,CAC1B,MAAME,EAAW3X,KAAKgX,QAAQY,cAAc,qCAC5C5X,KAAK6X,SAAW,IAAI,IAAkB,CACpCnS,MAAOQ,EACP0Q,aACAkB,YAAa,KACX9X,KAAKgX,QAAQzD,UAAUxS,IAAI,aAAa,EAE1CgX,UAAW,KACT/X,KAAKgX,QAAQzD,UAAU/Q,OAAO,aAAa,IAG/CmV,EAASK,QAAQhY,KAAK6X,SAASzM,U,CAG9B3G,GACeyB,EAAMzB,OACdwT,OAAOzS,IACG,oBAAbA,EAAI0S,OACLhS,EAAM6G,OAAQ,EACd7G,EAAM1B,UAAW,EACjB0B,EAAMzB,O,IAEP0T,SAAQ,KACTnY,KAAKgX,QAAQzD,UAAU1J,OAAO,cAAe7J,KAAKkG,MAAM5B,OAAO,GAGrE,CAEQoT,YAAYU,GAClB,MAAM,QAACpB,EAAO,MAAE9Q,EAAK,KAAEuR,EAAI,eAAE5F,GAAkB7R,KAE/CgX,EAAQzD,UAAUxS,IAAI0W,GAEtB,MAAMrC,EAAOpV,KAAKqY,gBAElB,IAAIC,EAEJ,GAHAtB,EAAQuB,mBAAmB,YAAanD,GAG5B,YAATqC,EAAoB,CACrBzX,KAAKmX,mBAAqBnX,KAAKgX,QAAQY,cAAc,kBACrD5X,KAAKwY,UAAYxY,KAAKgX,QAAQY,cAAc,QAE5C,MAAM/N,EAASmN,EAAQyB,iBAAiB,WAClCC,EAAmB1B,EAAQY,cAAc,eACzCe,EAAc3B,EAAQY,cAAc,iBAC1CU,EAAetB,EAAQY,cAAc,kBACrCU,EAAaM,aAAc,EAAAC,EAAA,GAA0B,EAAjB3S,EAAMW,UAE1C,MAAMiS,EAAiB,IAAI,IAAejH,GAEpCkH,EAAe/B,EAAQY,cAAc,kBAU3C,GATAkB,EAAeE,IAAIzF,UAAU/Q,OAAO,YACpCuW,EAAaxB,aAAauB,EAAeE,IAAKL,EAAYM,eAE1DC,MAAMC,KAAKtP,GAAQ9E,SAASuR,KAC1B,QAAiBA,GAAQ,KACvBtW,KAAKoZ,YAAY,GAChB,CAACvH,eAAgB7R,KAAK6R,gBAAgB,IAGxC7R,KAAKwY,UAAW,EACjB,QAAiBxY,KAAKwY,WAAW,KAC/BxY,KAAKkG,MAAMmT,yBAAyB,GACnC,CAACxH,eAAgB7R,KAAK6R,iBAEzB,MAAMiF,EAAS5O,IACblI,KAAKgX,QAAQzL,MAAM+N,WAAapR,EAAM,SAAU,GAC7ClI,KAAK8W,OACN9W,KAAK8W,MAAM5O,E,EAITqR,EAAe,GACfC,GAAe,EAAAC,EAAA,GAAS3C,EAAOyC,GAAc,GAAO,GAE1D1H,EAAe9Q,IAAImF,EAAnB2L,CAA0B,yBAAyB,KACjD2H,GAAa,GAEb3H,EAAe9Q,IAAImF,EAAnB2L,CAA0B,yBAAyB,KACjD,MAMM6H,EAAW7H,EAAe9Q,IAAImF,EAAnB2L,CAA0B,SAN3B,KACd4B,aAAakG,GACV3Z,KAAK+W,YACN/W,KAAK+W,Y,GAGoD,CAAC9I,MAAM,IAC9D0L,EAAUjX,YAAW,KACzBmP,EAAerP,OAAOkX,EAAS,GAC9BH,EAAa,GACf,CAACtL,MAAM,GAAM,IAGlB4D,EAAe9Q,IAAImF,EAAnB2L,CAA0B,yBAAyB,KACjD2H,GAAa,EAAM,G,CAInB,OACF,QAAiBtT,GAAO,KACtBlG,KAAKoZ,YAAY,GAChB,CAACvH,eAAgB7R,KAAK6R,iBAEzBA,EAAe9Q,IAAIsK,SAAnBwG,CAA6B,WAAY9J,IACvC,GAAG6R,EAAA,iBAAgC,GAAKvO,SAASuD,0BAA4B1I,EAC3E,OAGF,MAAM,IAACsG,EAAG,KAAEqN,GAAQ9R,EAEpB,IAAI+R,GAAO,EACX,GAAY,SAATD,EACD7Z,KAAK+Z,wBACA,GAAY,SAATF,EACR9H,EAAA,SAAoCA,EAAA,aAC/B,GAAY,UAAT8H,EACR7Z,KAAKoZ,kBACA,IAAGrR,EAAEiS,QAAoB,UAATH,GAA6B,UAATA,GAQjC7C,EAAQzD,UAAUqB,SAAS,qBAAgC,cAARpI,GAA+B,eAARA,EAIlFsN,GAAO,EAHI,cAARtN,EAAqBuF,EAAA,eAAwC,CAAC7F,OAAQ,iBACpE6F,EAAA,cAAuC,CAAC7F,OAAQ,oBAVO,CAC5D,MAAMnL,EAAe,UAAT8Y,EAAmB,GAAK,EAC9BlS,EAAeoK,EAAA,eAEfkI,EADMtD,EAAYuD,eAAeC,QAAQxS,GACzB5G,EACnBkZ,GAAW,GAAKA,EAAUtD,EAAYuD,eAAerX,SACtDkP,EAAA,eAA0C4E,EAAYuD,eAAeD,G,CASzE,OAAGH,IACD,EAAAM,EAAA,GAAYrS,IACL,QAFT,C,KAOJ8J,EAAe9Q,IAAImF,EAAnB2L,CAA0B,YAAY,KAChC,KACF7R,KAAK+Z,kB,KAIT,QAAiBrB,GAAkB,KACjC1Y,KAAK+Z,kBAAkB,GACtB,CAAClI,eAAgB7R,KAAK6R,kBAEzB,QAAsBmF,EAAShX,KAAKqa,aAAaC,KAAKta,KAAM0Y,GAAmB7G,GAE/EA,EAAe9Q,IAAImF,EAAnB2L,CAA0B,cAAc,KACtC8G,EAAYC,aAAc,EAAAC,EAAA,GAA6B,EAApB3S,EAAMK,YAAgB,IAG3DsL,EAAe9Q,IAAImF,EAAnB2L,CAA0B,QAAQ,KAChCmF,EAAQzD,UAAUxS,IAAI,UAElB,KACF8Q,EAAe9Q,IAAImF,EAAnB2L,CAA0B,QAAQ,KAChC7R,KAAKua,cAAa,EAAK,G,GAG1B,CAACtM,MAAM,IAEV4D,EAAe9Q,IAAImF,EAAnB2L,CAA0B,SAAS,KACjC7R,KAAKwa,cAAa,EAAM,IAG1B3I,EAAe9Q,IAAIgR,EAAA,EAAnBF,CAA+C,kBAAkB,KAC/D7R,KAAKya,qBAAqB,G,CAI9B5I,EAAe9Q,IAAImF,EAAnB2L,CAA0B,QAAQ,KAChCmF,EAAQzD,UAAUxS,IAAI,aAAa,IAGrC8Q,EAAe9Q,IAAImF,EAAnB2L,CAA0B,SAAS,KACjCmF,EAAQzD,UAAU/Q,OAAO,aAAa,IAGrC0D,EAAMW,UAAYuR,EACnBE,EAAaM,aAAc,EAAAC,EAAA,GAASrS,KAAKmD,MAAMzD,EAAMW,UAAYuR,KAEjE,EAAAsC,EAAA,GAAYxU,GAAOoI,MAAK,KACtBgK,EAAaM,aAAc,EAAAC,EAAA,GAASrS,KAAKmD,MAAMzD,EAAMW,UAAU,GAGrE,CAEUuS,aACR,MAAMuB,EAAW3a,KAAKkG,MAAM5B,OAC5BtE,KAAKkG,MAAMyU,EAAW,OAAS,UACjC,CAEQtC,gBACN,MAAMZ,EAAOzX,KAAKyX,KAClB,GAAY,YAATA,EACD,MAAO,0BACUA,iFACHA,gEACAA,mJAGkBA,oVAQAA,gGACvB,EAAAmD,WAAavP,SAASwP,wBAA0B,2BAA2BpD,gEAAqE,2CACzHA,sHAKpC,CAEUrD,mBACR,MAAMP,EAA2D8C,EAAYuD,eAAeY,KAAI,CAACC,EAAMhS,KAC9F,CAELiS,YAAaD,EAAO,IACpB9G,QAAS,KACPlC,EAAA,eAA0CgJ,CAAI,MAI9CE,GAAU,OAAe,CAACpH,YAChCoH,EAAQ1H,UAAUxS,IAAI,aACtB,OAAwB,CACtBH,GAAIZ,KAAKmX,mBACT+D,OAAQlb,KAAK6W,yBAA2B,KACtC7W,KAAK6W,0BAAyB,EAAK,OACjC5S,EACJkX,QAASnb,KAAK6W,yBAA2B,KACvC7W,KAAK6W,0BAAyB,EAAM,OAClC5S,IAENjE,KAAKmX,mBAAmBzL,OAAOuP,GAE/Bjb,KAAKya,qBACP,CAEUA,sBACR,MAAMtD,EAAqBnX,KAAKmX,mBAChCR,EAAYyE,qBAAqBrW,SAASsW,IACxCA,EAAY,SAAWA,EACvBlE,EAAmB5D,UAAU/Q,OAAO6Y,EAAU,IAGhD,IAAItS,EAAM4N,EAAYuD,eAAeC,QAAQpI,EAAA,iBACjC,IAAThJ,IAAYA,EAAM4N,EAAYuD,eAAeC,QAAQ,IAExDhD,EAAmB5D,UAAUxS,IAAI,SAAW4V,EAAYyE,qBAAqBrS,GAC/E,CAEUgR,mBACR,MAAM3X,EAASpC,KAAKgX,QAGpB,GAAG,EAAAsE,gBAAiB,CAClB,MAAMpV,EAAQlG,KAAKkG,MAGnB,OAFAA,EAAMqV,6BACNrV,EAAMsV,iB,EAIJ,WAyBF,WAdA,QAAkBpZ,EAgBtB,CAEUiY,aAAa3B,GACrB,MAAM+C,GAAS,UACfzb,KAAKgX,QAAQzD,UAAU1J,OAAO,mBAAoB4R,GAC9CA,GAKF/C,EAAiBnF,UAAU/Q,OAAO,oBAClCkW,EAAiBnF,UAAUxS,IAAI,qBAC/B2X,EAAiB/K,aAAa,QAAS,sBANvC+K,EAAiBnF,UAAU/Q,OAAO,qBAClCkW,EAAiBnF,UAAUxS,IAAI,oBAC/B2X,EAAiB/K,aAAa,QAAS,eAM3C,CAEO+N,UACLxJ,MAAMwJ,UACN1b,KAAK6R,eAAeC,YACpB9R,KAAK6X,SAAS8D,kBACd3b,KAAK6W,yBAA2B7W,KAAK8W,WAAQ7S,CAC/C,EAzXe,EAAAiW,eAAiB,CAAC,GAAK,EAAG,IAAK,GAC/B,EAAAkB,qBAAuB,CAAC,cAAe,cAAe,cAAe,e,0iBC6BtF,MASaQ,EAAyB,eAEvB,MAAMC,UAIV,IA2DLxb,aACF,OAAOL,KAAKwI,WAAWC,OACzB,CAEIpI,WAAOqM,GACT1M,KAAKwI,WAAWC,QAAUiE,CAC5B,CAEA3M,YACYyI,EACVsT,GAEA5J,OAAM,GAHI,KAAA1J,WAAAA,EA9DF,KAAA+L,OAA6E,CAAC,EAC9E,KAAA5B,QAAgG,CAAC,EACjG,KAAAkB,QAAwH,CAAC,EAIzH,KAAAkI,OAAS,EACT,KAAAC,UAAkC,KAClC,KAAAC,oBAA4C,KAO5C,KAAAC,aAAc,EAId,KAAAC,OAAS9Q,SAAS+Q,eAAe,cAejC,KAAAC,aAKN,CAAC,EAGK,KAAAC,gBAAkB,EAClB,KAAAC,gBAAkB,EAClB,KAAAC,WAAa,EACb,KAAAC,WAAa,EA8Rb,KAAAC,aAAe,CAAChQ,EAAQ1M,KAAKqc,aAAaM,cAAcjQ,SA/VzC,IAiWpBA,IACD1M,KAAKwc,WAAa,EAClBxc,KAAKyc,WAAa,GAGpBzc,KAAK4c,gBAAgBrR,MAAMsR,UAAY,UAAUnQ,YAAgBA,MAAU1M,KAAKwc,eAAexc,KAAKyc,cAEpGzc,KAAKqc,aAAaS,OAAOvJ,UAAU1J,OAAO,WAvWvB,KAuWmC6C,GACtD1M,KAAKqc,aAAaU,MAAMxJ,UAAU1J,OAAO,WAvWtB,IAuWkC6C,GAErD1M,KAAKgd,WA3WkB,IA2WPtQ,EAA6B,EAmF/C,KAAAuH,QAAWlM,IACT,GAAG/H,KAAKid,yBAA0B,OAElC,MAAM5c,EAAS0H,EAAE1H,OACjB,GAAsB,MAAnBA,EAAO6c,QAAiB,OAG3B,IAFA,EAAA9C,EAAA,GAAYrS,GAET,IAYD,OAXG/H,KAAKmd,0BACN1J,aAAazT,KAAKmd,2BAElBnd,KAAK4T,SAASL,UAAUxS,IAAI,4BAG9Bf,KAAKmd,0BAA4BzJ,OAAOhR,YAAW,KACjD1C,KAAK4T,SAASL,UAAU/Q,OAAO,uBAC/BxC,KAAKmd,0BAA4B,CAAC,GACjC,MAKL,MAAMC,EAAYpd,KAAKod,YACvB,IAAIC,EAAqB,KACzB,MAAMC,EAAa,CAAC,eAAgB,uBAAwB,sBAAuB,uBAAwB,kBACxGF,GACDE,EAAWjb,KAAK,uBAGlBib,EAAW5c,MAAMqJ,IACf,IAEE,GADAsT,GAAQ,EAAAE,EAAA,GAAgBld,EAAQ0J,GAC7BsT,EAAO,OAAO,C,CACjB,MAAM7X,GAAM,OAAO,C,KAGiB6X,IAAWD,GAAiC,QAAnB/c,EAAO6c,SAAwC,UAAnB7c,EAAO6c,UAClGld,KAAK4S,O,EAID,KAAA4K,UAAazV,IAEnB,GAAG6R,EAAA,iBAAgC,EACjC,OAGF,MAAMpN,EAAMzE,EAAEyE,IAEd,IAAIsN,GAAO,EACA,eAARtN,EACDxM,KAAK6T,QAAQjK,KAAKqL,QACF,cAARzI,EACRxM,KAAK6T,QAAQnD,KAAKuE,QACF,MAARzI,GAAuB,MAARA,EACpBxM,KAAKyd,aACNzd,KAAK0d,WAAmB,MAARlR,GAGlBsN,GAAO,GAGN/R,EAAE4V,SAAW5V,EAAE6V,WAChB5d,KAAKyd,aAAc,GAGlB3D,IACD,EAAAM,EAAA,GAAYrS,E,EAIR,KAAA8V,QAAW9V,IACd6R,EAAA,iBAAgC,GAI9B7R,EAAE4V,SAAW5V,EAAE6V,UAClB5d,KAAKyd,aAAc,EAEhBzd,KAAKod,aACNpd,KAAK0c,e,EAKH,KAAAoB,QAAW/V,IACjB,KAAG6R,EAAA,iBAAgC,IAAM,EAAA2D,EAAA,GAAgBxV,EAAE1H,OAAQ,0BAA4BL,KAAKyd,gBAIpG,EAAArD,EAAA,GAAYrS,GAET/H,KAAKyd,aAAa,CACnB,MAAMM,EAAchW,EAAEiW,OAAS,EAE/Bhe,KAAK0d,aAAaK,E,GAtcpB/d,KAAKiH,SAAWgX,EAAA,WAEhBje,KAAKke,KAAM,EAAAC,EAAA,IAAO,OAClBne,KAAKgc,UAAY,IAAI,IACrBhc,KAAKic,oBAAsB,IAAI,IAAqB,CAClDmC,YAAY,EACZxH,YAAY,IAEd5W,KAAKgc,UAAU7Q,YACfnL,KAAKic,oBAAoB9Q,YACzBnL,KAAKqe,cAAgB,IAAI,IAEzBre,KAAK4T,SAAWvI,SAASC,cAAc,OACvCtL,KAAK4T,SAASL,UAAUxS,IAAI6a,EAAyB,UAErD5b,KAAKse,YAAcjT,SAASC,cAAc,OAC1CtL,KAAKse,YAAY/K,UAAUxS,IAAI,YAE/B,MAAMwd,EAAUlT,SAASC,cAAc,OACvCiT,EAAQhL,UAAUxS,IAAI6a,GAEtB,MAAM4C,EAASxe,KAAKwe,OAASnT,SAASC,cAAc,OACpDkT,EAAOjL,UAAUxS,IAAI6a,EAAyB,UAAWA,EAAyB,WAElF,MAAM6C,EAAapT,SAASC,cAAc,OAC1CmT,EAAWlL,UAAUxS,IAAI6a,EAAyB,gBAElD5b,KAAK6T,QAAQ,iBAAkB,OAAW,QAAS,CAAC6K,YAAY,IAGhE1e,KAAKuU,OAAOnJ,UAAYC,SAASC,cAAc,OAC/CtL,KAAKuU,OAAOnJ,UAAUmI,UAAUxS,IAAI6a,EAAyB,UAAW,aACxE,MAAM+C,EAActT,SAASC,cAAc,OAE3CtL,KAAKuU,OAAOqK,SAAW,IAAI,IAC3B5e,KAAKuU,OAAOqK,SAASrL,UAAUxS,IAAI6a,EAAyB,WAAY,aAExE5b,KAAKuU,OAAOsK,OAASxT,SAASC,cAAc,OAC5CtL,KAAKuU,OAAOsK,OAAOtL,UAAUxS,IAAI6a,EAAyB,SAE1D5b,KAAKuU,OAAOiC,KAAOnL,SAASC,cAAc,OAC1CtL,KAAKuU,OAAOiC,KAAKjD,UAAUxS,IAAI6a,EAAyB,SAExD+C,EAAYjT,OAAO1L,KAAKuU,OAAOsK,OAAQ7e,KAAKuU,OAAOiC,MAEnDxW,KAAKuU,OAAOnJ,UAAUM,OAAO1L,KAAKuU,OAAOqK,SAAUD,GAGnD,MAAMG,EAAazT,SAASC,cAAc,OAC1CwT,EAAWvL,UAAUxS,IAAI6a,EAAyB,YAElDE,EAAWiD,OAAO,CAAC,WAAY,OAAQ,UAAUha,SAASmT,IACxD,MAAM5B,GAAS,OAAW4B,EAAM,CAAC8G,UAAU,IAC3Chf,KAAK6T,QAAQqE,GAAQ5B,EACrBwI,EAAWpT,OAAO4K,EAAO,IAG3BtW,KAAK6T,QAAQoL,KAAK1L,UAAUxS,IAAI,WAGhCf,KAAKqc,aAAajR,UAAYC,SAASC,cAAc,OACrDtL,KAAKqc,aAAajR,UAAUmI,UAAUxS,IAAI,kBAE1Cf,KAAKqc,aAAaS,QAAS,OAAW,UAAW,CAACkC,UAAU,KAC5D,QAAiBhf,KAAKqc,aAAaS,QAAQ,IAAM9c,KAAK0d,YAAW,KACjE1d,KAAKqc,aAAaU,OAAQ,OAAW,SAAU,CAACiC,UAAU,KAC1D,QAAiBhf,KAAKqc,aAAaU,OAAO,IAAM/c,KAAK0d,YAAW,KAEhE1d,KAAKqc,aAAaM,cAAgB,IAAI,IAAc,CAClDuC,KA7JY,GA8JZtY,IA5JiB,GA6JjBH,IA5JiB,EA6JjB0Y,gBAAgB,GA/JK,GAiKvBnf,KAAKqc,aAAaM,cAActI,eAChCrU,KAAKqc,aAAaM,cAAcyC,YAAY,CAC1CC,QAASrf,KAAK0c,aACd4C,UAAW,IAAMtf,KAAK0c,iBAGxB1c,KAAKqc,aAAajR,UAAUM,OAAO1L,KAAKqc,aAAaS,OAAQ9c,KAAKqc,aAAaM,cAAcvR,UAAWpL,KAAKqc,aAAaU,OAE1H/c,KAAK4T,SAASlI,OAAO1L,KAAKqc,aAAajR,WAGvCpL,KAAK2S,QAAQ4M,KAAOlU,SAASC,cAAc,OAC3CtL,KAAK2S,QAAQ4M,KAAKhM,UAAUxS,IAAI6a,EAAyB,YAEzD5b,KAAK2S,QAAQvH,UAAYC,SAASC,cAAc,OAChDtL,KAAK2S,QAAQvH,UAAUmI,UAAUxS,IAAI6a,EAAyB,cAE9D5b,KAAK2S,QAAQjN,MAAQ2F,SAASC,cAAc,OAC5CtL,KAAK2S,QAAQjN,MAAM6N,UAAUxS,IAAI6a,EAAyB,UAE1D5b,KAAK2S,QAAQvH,UAAUM,OAAO1L,KAAK2S,QAAQjN,OAE3C1F,KAAK2S,QAAQ4M,KAAK7T,OAAO1L,KAAK2S,QAAQvH,WACtCmT,EAAQ7S,OAAO1L,KAAK2S,QAAQ4M,MAC5Bvf,KAAKse,YAAY5S,OAAO6S,GAGxBE,EAAW/S,OAAO1L,KAAK6T,QAAQ,gBAAiB7T,KAAKuU,OAAOnJ,WAC5DoT,EAAO9S,OAAO+S,EAAYK,GAE1B9e,KAAK6T,QAAQnD,KAAOrF,SAASC,cAAc,OAC3CtL,KAAK6T,QAAQnD,KAAK2K,UAAY,GAAGO,cAAmCA,kBACpE5b,KAAK6T,QAAQnD,KAAK8O,UAAY,2BAA2B5D,yBAEzD5b,KAAK6T,QAAQjK,KAAOyB,SAASC,cAAc,OAC3CtL,KAAK6T,QAAQjK,KAAKyR,UAAY,GAAGO,cAAmCA,mBACpE5b,KAAK6T,QAAQjK,KAAK4V,UAAY,2BAA2B5D,yBAEzD5b,KAAK4c,gBAAkBvR,SAASC,cAAc,OAC9CtL,KAAK4c,gBAAgBrJ,UAAUxS,IAAI6a,EAAyB,WAE5D5b,KAAK4c,gBAAgBlR,OAAO1L,KAAK6T,QAAQnD,KAAM1Q,KAAK6T,QAAQjK,MAE5D5J,KAAK4T,SAASlI,OAAO1L,KAAKse,YAAyDte,KAAKwe,OAAQxe,KAAK4c,iBAIrG5c,KAAKwI,WAAWiX,aAAe,KAC7Bzf,KAAK6T,QAAQnD,KAAK6C,UAAU1J,OAAO,QAAS7J,KAAKwI,WAAWK,SAAShG,QACrE7C,KAAK6T,QAAQjK,KAAK2J,UAAU1J,OAAO,QAAS7J,KAAKwI,WAAWoB,KAAK/G,OAAO,EAG1E7C,KAAK0f,aACP,CAEUrL,gBACR,QAAiBrU,KAAK6T,QAAQsC,SAAUnW,KAAKoT,iBAC7C,CAACpT,KAAK6T,QAAQjB,MAAO5S,KAAK6T,QAAQ,gBAAiB7T,KAAKic,oBAAoBD,WAAWjX,SAASnE,KAC9F,QAAiBA,EAAIZ,KAAK4S,MAAM0H,KAAKta,MAAM,IAG5C,CAAC,EAAE,EAAGA,KAAK6T,QAAQnD,MAAO,CAAC,EAAG1Q,KAAK6T,QAAQjK,OAAmC7E,SAAQ,EAAE4a,EAAYrJ,MAEnGA,EAAO1I,iBAAiB,SAAU7F,KAChC,EAAAqS,EAAA,GAAYrS,GACT/H,KAAK2V,iBAER3V,KAAKwI,WAAWU,GAAGyW,EAAW,GAC9B,KAGJ,QAAiB3f,KAAK6T,QAAQoL,MAAM,KAC/Bjf,KAAKod,YAAapd,KAAKgd,YAAW,GAEnChd,KAAK0d,YAAW,E,IAMpB1d,KAAK4T,SAAShG,iBAAiB,QAAS5N,KAAKiU,SAE7CjU,KAAKwI,WAAWuI,OAAS,CAAC/N,EAAMgO,KAC3BA,EAAOhR,KAAKyS,YAAYzP,GACtBhD,KAAKsS,YAAYtP,EAAK,EAG1B,KACoB,IAAI,IAAa,CACpCd,QAASlC,KAAK4T,SACdgM,QAAS,CAACC,EAAOC,KACf,KAAG,UAKH,OADiBtZ,KAAKuZ,IAAIF,GAASG,EAAA,QACrB,IAAMH,EAAQ,KAGvBA,EAAQ,EACT7f,KAAK6T,QAAQnD,KAAKuE,QAElBjV,KAAK6T,QAAQjK,KAAKqL,SAGb,IAGSzO,KAAKuZ,IAAID,GAASE,EAAA,SACrB,IAAMF,EAAQ,OAC3B9f,KAAK4S,SACE,EAGG,EAEdqN,kBAAoBlY,MAEf,EAAAwV,EAAA,GAAgBxV,EAAE1H,OAAQ,oBAC3B,EAAAkd,EAAA,GAAgBxV,EAAE1H,OAAQ,0BAC1B,EAAAkd,EAAA,GAAgBxV,EAAE1H,OAAQ,yBAQpC,CAEU2c,WAAWkD,GACnB,MAAMC,EAAYngB,KAAKod,YAKvB,IAJGpd,KAAKqc,aAAaM,cAAcyD,WAAapgB,KAAKyd,eACnDyC,GAAS,GAGRC,IAAcD,EAAQ,YAEXjc,IAAXic,IACDA,GAAUC,GAGZngB,KAAK6T,QAAQoL,KAAK1L,UAAU1J,OAAO,WAAYqW,GAC/ClgB,KAAKqc,aAAajR,UAAUmI,UAAU1J,OAAO,aAAcqW,GAC3D,MAAMG,EAAYH,EAASlgB,KAAKqc,aAAaM,cAAcjQ,MAAQ,EAQnE,GAPA1M,KAAK0c,aAAa2D,GAClBrgB,KAAKqc,aAAaM,cAAc2D,YAAYD,GAEzCrgB,KAAKugB,aACNvgB,KAAKugB,YAAYC,cAAaN,QAAiBjc,GAG9Cic,EAAQ,CACT,GAAIlgB,KAAKygB,iBAuBPzgB,KAAKygB,iBAAiBpM,mBAvBG,CACzB,IAAIqM,EAAmBC,EACvB,MAAMC,EAAa,EACnB5gB,KAAKygB,iBAAmB,IAAI,IAAa,CACvCve,QAASlC,KAAK4c,gBACdiE,aAAc,KACZH,EAAYC,EAAY,EACxB3gB,KAAK4c,gBAAgBrJ,UAAUxS,IAAI,gBAAgB,EAErD6e,QAAS,CAACC,EAAOC,MACdD,EAAOC,GAAS,CAACD,EAAQe,EAAYd,EAAQc,GAC9C5gB,KAAKwc,YAAcqD,EAAQa,EAC3B1gB,KAAKyc,YAAcqD,EAAQa,GAC1BD,EAAWC,GAAa,CAACd,EAAOC,GAEjC9f,KAAK0c,cAAc,EAErBoE,QAAS,KACP9gB,KAAK4c,gBAAgBrJ,UAAU/Q,OAAO,gBAAgB,EAExDue,OAAQ,Q,CAMZ/gB,KAAKqc,aAAaM,cAAc2D,YAAYD,E,MACnCH,GACTlgB,KAAKygB,iBAAiB9E,iBAE1B,CAEU+B,WAAW3c,GACnBf,KAAKqc,aAAaM,cAAcqE,YA5VlB,IA4V2CjgB,EAAM,GAAK,IACpEf,KAAK0c,cACP,CAiBUU,YACR,OAAOpd,KAAKqc,aAAajR,UAAUmI,UAAUqB,SAAS,aACxD,CAEUR,iBAAiBP,GACzB,MAAMoN,GAAgB,OAAiB,CAACC,cAAe,CAACxC,YAAY,GAAOyC,UAAW,cAAetN,YACrG7T,KAAKwe,OAAO9S,OAAOuV,EACrB,CAEOrO,MAAM7K,G,MAKX,GAJGA,IACD,EAAAqS,EAAA,GAAYrS,GAGX/H,KAAKid,yBAA0B,OAAOmE,QAAQC,SAE9CrhB,KAAKshB,gBACNC,EAAA,aAAmCvhB,KAAKshB,gBAG1CthB,KAAKqe,cAAcmD,QAEnB,MAAMjT,EAAUvO,KAAKyhB,iBAA4B,QAAX,EAAAzhB,KAAKK,cAAM,eAAE6B,SAAS,GAAMoM,MAAK,EAAEoT,oBAAoBA,IAyB7F,OAvBA1hB,KAAKwI,WAAWmI,QACf3Q,KAAKwI,WAAqCkT,SAAY1b,KAAKwI,WAAqCkT,UACjG1b,KAAK2V,gBAAkB,KACvB3V,KAAK+b,QAAU,EACXrI,OAAeiO,iBAAmB3hB,OACnC0T,OAAeiO,oBAAiB1d,GASnCjE,KAAK4hB,wBAEL5hB,KAAKygB,sBAAmBxc,EAExBsK,EAAQ4J,SAAQ,KACdnY,KAAK4T,SAASpR,SACdxC,KAAK6hB,eAAc,EAAM,IAGpBtT,CACT,CAEUsT,cAAcC,GACtBlI,EAAA,kBAAiCkI,EACjChiB,EAAA,mBAAsCgiB,EACxC,CAEUC,sBAAsBD,GAC3BA,EAAQ9hB,KAAKgiB,qBACXhiB,KAAK4hB,uBACZ,CAEUA,wBACL5hB,KAAKygB,kBACNzgB,KAAKygB,iBAAiB9E,kBAGxBjI,OAAOhC,oBAAoB,UAAW1R,KAAKwd,WAC3C9J,OAAOhC,oBAAoB,QAAS1R,KAAK6d,SACzCnK,OAAOhC,oBAAoB,QAAS1R,KAAK8d,QAAS,CAAC9I,SAAS,GAC9D,CAEUgN,qBACLhiB,KAAKod,aACNpd,KAAKygB,iBAAiBpM,eAGxBX,OAAO9F,iBAAiB,UAAW5N,KAAKwd,WACxC9J,OAAO9F,iBAAiB,QAAS5N,KAAK6d,SAClC,KAAoBnK,OAAO9F,iBAAiB,QAAS5N,KAAK8d,QAAS,CAACmE,SAAS,EAAOjN,SAAS,GACnG,CAqGgByM,iBAAiBphB,EAAqB6hB,GAAU,EAAO1M,EAAY,G,yCACjFxV,KAAKoJ,cAAc,kBAEnB,MAAMiU,EAAQrd,KAAK2S,QAAQ0K,MAEvB6E,IACF7E,EAAMmC,UAAY,IAIpB,MAAMa,EAAYrgB,KAAKod,aAAe8E,EAAyBliB,KAAKqc,aAAaM,cAAcjQ,MA3iBxE,EA4iBe1M,KAAKmiB,sBAAsB9E,GAEjE,MAAM+E,EAA0B,IAAd5M,EAEZ6M,EAAQpE,EAAA,6BAAwCmE,EAAY,IAAM,IAAO,EAY/E,IAAIE,EAEAC,EACDliB,IACEA,aAAkB,KAAiBA,EAAOkT,UAAUqB,SAAS,cAC9D0N,EAAajiB,EACbkiB,EAAOliB,EAAOmiB,yBACNniB,aAAkBoiB,iBAAmBpiB,EAAO4Y,yBAAyByJ,yBAC7EJ,GAAa,EAAA/E,EAAA,GAAgBld,EAAQ,cACrCkiB,EAAOD,EAAWE,yBACVniB,EAAOkT,UAAUqB,SAAS,4BAClC0N,GAAa,EAAA/E,EAAA,GAAgBld,EAAQ,6BACrCkiB,EAAOD,EAAWE,wBAGfN,GAAW7hB,EAAOmiB,wBAAwBG,OAASJ,EAAKI,OACzDtiB,EAASiiB,EAAaC,OAAOte,KAK/B5D,IACFA,EAASL,KAAK2S,QAAQjN,OAGpB6c,IACFD,EAAajiB,EAAO4Y,cACpBsJ,EAAOliB,EAAOmiB,yBAGhB,IAAII,GAAc,EAClB,GAAGviB,IAAWL,KAAK2S,QAAQjN,QAAUrF,EAAOkT,UAAUqB,SAAS,0BAA2B,CACxF,MAAMiO,GAAkB,EAAAtF,EAAA,GAAgB+E,EAAY,cAC9CQ,GAAc,EAAAC,EAAA,GAAeT,EAAYO,GAAiB,IAE7DX,GAAaY,GAAiD,IAAlCA,EAAYE,SAASC,UAAsD,IAApCH,EAAYE,SAASE,YAIjFJ,GAAkD,IAAlCA,EAAYE,SAASC,UAAsD,IAApCH,EAAYE,SAASE,aACpFN,GAAc,IAHdN,GADAjiB,EAASL,KAAK2S,QAAQjN,OACFuT,cACpBsJ,EAAOliB,EAAOmiB,wB,CAMlB,MAAMW,EAAgBnjB,KAAK2S,QAAQjN,MAAM8c,wBAEzC,IACIG,EACAS,EA6BAC,EA/BAxG,EAAY,GAgChB,GA5BGuF,GACDO,EAAqB,IAAdnN,EAAkBwK,EAAA,SAAoBmD,EAAcG,MAC3DF,EAAMD,EAAcC,MAEpBT,EAAOJ,EAAKI,KACZS,EAAMb,EAAKa,KAWbvG,GAAa,eAAe8F,OAAUS,UAYnC/iB,aAAkBkjB,kBAAoBljB,aAAkBkC,kBAAuC,QAAnBlC,EAAO6c,QAAmB,CACvG,GAAGG,EAAM9H,mBAAqB8H,EAAM9H,kBAAkBhC,UAAUqB,SAAS,yBAA0B,CACjGyO,EAAWhG,EAAM9H,kBAEjB,MAAMnT,EAASihB,EAASzL,cAAc,iBACtC,GAAGxV,EAAQ,CACT,MAAM8D,EAAQ9D,EAAOmT,kBACrB8N,EAAS3X,OAAOxF,GAChB9D,EAAOI,Q,CAGL6gB,EAAS9X,MAAMC,UACjB6R,EAAM9J,UAAU/Q,OAAO,UACvBxC,KAAKwjB,cAAcH,EAAUF,EAAeZ,GACvClF,EAAMoG,WACXpG,EAAM9J,UAAUxS,IAAI,U,MAGtBsiB,EAAWhY,SAASC,cAAc,OAClC+X,EAAS9P,UAAUxS,IAAI,yBACvBsc,EAAMrF,QAAQqL,GAGhBA,EAAS9X,MAAMC,QAAU,UAAU+W,EAAKe,oBAAoBf,EAAKmB,gCAAgCP,EAAcG,MAAQf,EAAKe,UAAUH,EAAcO,OAASnB,EAAKmB,a,CAGpKrG,EAAM9R,MAAM+X,MAAQH,EAAcG,MAAQ,KAC1CjG,EAAM9R,MAAMmY,OAASP,EAAcO,OAAS,KAI5C,MAAMC,EAASpB,EAAKe,MAAQH,EAAcG,MACpCM,EAASrB,EAAKmB,OAASP,EAAcO,OACvCtB,IACFvF,GAAa,WAAW8G,KAAUC,SAGpC,IAAIC,EAAenQ,OAAOoQ,iBAAiBxB,GAAYyB,iBAAiB,iBACxE,MAAMC,ECjuBK,SAA2BC,GACxC,MAAMC,EAAWD,EAAIE,MAAM,KAC3B,GAAuB,IAApBD,EAASrhB,OAAc,CACpBqhB,EAAS,KAAIA,EAAS,GAAK,OAC/B,IAAI,IAAIE,EAAIF,EAASrhB,OAAQuhB,EAAI,IAAKA,EACpCF,EAASE,GAAKF,EAASE,EAAI,IAAMF,EAAS,IAAM,K,CAIpD,OAAOA,CACT,CDutBuBG,CAAkBR,GAOrC,GANAA,EAAeG,EAAWlJ,KAAKwJ,GAAOC,SAASD,GAAKX,EAAU,OAAMa,KAAK,KACrEpC,IACF/E,EAAM9R,MAAMsY,aAAeA,GAI1B3B,GAAyB,IAAd7B,EAAiB,CAG7B,MAAMoE,EAAazE,EAAA,QAAmB,EAAIuC,EAAKe,MAAQ,EACjDoB,EAAY1E,EAAA,SAAoB,EAAIuC,EAAKmB,OAAS,EAClDf,EAAOJ,EAAKI,KAAO8B,EACnBrB,EAAMb,EAAKa,IAAMsB,EACvB1kB,KAAK4c,gBAAgBrR,MAAMsR,UAAY,UAAU8G,YAAiBC,MAAWjB,MAASS,I,MAEtF/F,EAAM9R,MAAMsR,UAAYA,EAS1B,IAAI8H,EANJ/B,IAAgBvF,EAAM9R,MAAMqZ,QAAU,KAOtC,MAAMC,EAAQxkB,EAAOkT,UAAUqB,SAAS,UAElC1G,EAAWlO,KAAKid,0BAA2B,SAC3C6H,EAAM,CAACpD,eAAgBxT,GAEvByL,EAAUjX,YAAW,KACrBwL,EAAS6W,aAAgB7W,EAAS8W,YACpC9W,EAASC,S,GAEV,KAYH,GAVAD,EAASiK,SAAQ,KACfnY,KAAKoJ,cAAc,iBAEhBpJ,KAAKid,2BAA6B/O,IACnClO,KAAKid,yBAA2B,MAGlCxJ,aAAakG,EAAQ,IAGnBuI,EA+KF,OAlCG7hB,aAAkB4kB,gBACnBN,EAAOtH,EAAMzF,cAAc,QAExB+M,GACD3kB,KAAKklB,aAAaP,EAAMxB,EAAeQ,EAAQtB,GAAO,EAAOwC,EAAOhB,IAIrExjB,EAAOkT,UAAUqB,SAAS,uBAC3ByI,EAAM9J,UAAUxS,IAAI,UAGtBf,KAAKmlB,mBAAkB,GAIvBziB,YAAW,KACT2a,EAAM9R,MAAMsY,aAAeA,EAExBxG,EAAM9H,oBACN8H,EAAM9H,kBAAkChK,MAAMsY,aAAeA,E,GAE/DxB,EAAQ,GAEX3f,YAAW,KACT2a,EAAMmC,UAAY,GAClBnC,EAAM9J,UAAU/Q,OAAO,SAAU,SAAU,UAC3C6a,EAAM9R,MAAMC,QAAU,iBAEtB0C,EAASC,SAAS,GACjBkU,GAEHhF,EAAM9J,UAAU/Q,OAAO,WAEhBsiB,EA/KI,CACX,IAAIM,EACAziB,EAGJ,MAAM0iB,EAAW,gCACXC,EAAYjlB,EAAOklB,QAAQF,GAAYhlB,EAAO4Y,cAAgB5Y,EAC9DmlB,EAAWtM,MAAMC,KAAKmM,EAAU7M,iBAAiB4M,IACvD,GAAGG,EAAS3iB,OAAQ,CAClBxC,EAASmlB,EAASC,MAClB,MAAMniB,EAAS+H,SAASC,cAAc,UAChCkF,EAAUlN,EAAOoiB,WAAW,MAC/BrlB,aAAkBkjB,kBACnBjgB,EAAOggB,MAAQjjB,EAAOslB,aACtBriB,EAAOogB,OAASrjB,EAAOulB,eACfvlB,aAAkBkC,kBAC1Be,EAAOggB,MAAQjjB,EAAOwlB,WACtBviB,EAAOogB,OAASrjB,EAAOylB,aACfzlB,aAAkB0lB,oBAC1BziB,EAAOggB,MAAQjjB,EAAOijB,MACtBhgB,EAAOogB,OAASrjB,EAAOqjB,QAGzBpgB,EAAO+X,UAAY,yCACnB7K,EAAQwV,UAAU3lB,EAAgD,EAAG,GACrEA,EAASiD,C,CAIX,GAAsB,QAAnBjD,EAAO6c,SAAwC,mBAAnB7c,EAAO6c,QAA8B,CAClE,MACM+I,EADS/M,MAAMC,KAAK9Y,EAAOoY,iBAAiB,QAC7BgN,MAClBQ,IACDb,EAAe,IAAIc,MACnBvjB,EAAMsjB,EAAMtjB,IACZ0a,EAAM3R,OAAO0Z,G,MAIV,GAAG/kB,aAAkBkjB,iBAC1B6B,EAAe,IAAIc,MACnBvjB,EAAMtC,EAAOsC,SACR,GAAGtC,aAAkBkC,iBAC1B6iB,GAAe,EAAAe,EAAA,KACff,EAAaziB,IAAMtC,EAAOsC,SACrB,GAAGtC,aAAkB4kB,cAAe,CACzC,MAAMmB,EAAS/lB,EAAOgmB,QAAQD,OACxBE,EAAYF,EAAS,OAErB,MAAC9C,EAAK,OAAEI,GAAUP,EAElBoD,EAASlb,SAASmb,gBAAgB,6BAA8B,OACtED,EAAOE,eAAe,KAAM,QAAS,GAAKnD,GAC1CiD,EAAOE,eAAe,KAAM,SAAU,GAAK/C,GAG3C6C,EAAOE,eAAe,KAAM,UAAW,OAAOnD,KAASI,KACvD6C,EAAOE,eAAe,KAAM,sBAAuB,iBAEnDF,EAAOhO,mBAAmB,YAAalY,EAAOkV,kBAAkBmR,UAAUC,QAAQP,EAAQE,IAC1FC,EAAOhO,mBAAmB,YAAalY,EAAOumB,iBAAiBF,UAAUC,QAAQP,EAAQE,IAGzF,MAAMO,EAAON,EAAOhR,kBACduR,EAAMD,EAAKtR,kBAAkBA,kBACnC,GAAGuR,aAAeC,cAAe,CAC/B,IAmBIC,EAnBAnK,EAAYiK,EAAIG,eAAe,KAAM,aACzCpK,EAAYA,EAAU8J,QAAQ,mDAAmD,CAACphB,EAAO2hB,EAAGC,EAAGC,EAAIC,IAU1F,aAPLH,EADO,IADTA,GAAKA,GAEC5D,EAAS,EAAIK,EAEb,EAAIA,MAGND,aAEmC0D,EAAKzD,OAAY0D,EAAKzD,OAE/DkD,EAAIL,eAAe,KAAM,YAAa5J,GAGtC8H,EAAOkC,EAAKtR,kBAAkBqR,iBAI9B,MAAMU,EAAuCzD,EAAaM,MAAM,KAAKrJ,KAAKyM,GAAMhD,SAASgD,KAC/EP,EAAPnC,GAAW,EAAA2C,EAAA,GAAiB,EAAG,EAAGlE,EAAQ,EAAIK,EAAQD,KAAW4D,IAC3D,EAAAE,EAAA,GAAiB,EAAI7D,EAAQ,EAAGL,EAAQ,EAAIK,EAAQD,KAAW4D,GACxE3C,EAAK8B,eAAe,KAAM,IAAKO,E,CAGjC,MAAMS,EAAgBlB,EAAOK,iBAC7Ba,EAAchB,eAAe,KAAM,QAAS,GAAKtD,EAAcG,OAC/DmE,EAAchB,eAAe,KAAM,SAAU,GAAKtD,EAAcO,QAEhErG,EAAMrF,QAAQuO,E,MACNlmB,aAAkB0lB,oBAC1BX,EAAe/kB,GAGdgjB,IACDA,EAAS9X,MAAMsY,aAAeA,EAE3BuB,GACD/B,EAAS3X,OAAO0Z,IAIpBA,EAAe/H,EAAMzF,cAAc,cAChCwN,aAAwB7B,mBACzB6B,EAAa7R,UAAUxS,IAAI,aACvBsiB,IACF+B,EAAa7Z,MAAM+X,MAAQH,EAAcG,MAAQ,KACjD8B,EAAa7Z,MAAMmY,OAASP,EAAcO,OAAS,MAGlD/gB,UACK,EAAA+kB,EAAA,IAA0BtC,EAAcziB,KAYlD0a,EAAM9R,MAAMoc,QAAU,IAEtB,SAAQ,KACNtK,EAAM9J,UAAUxS,IAAIqhB,EAAY,SAAW,SAAS,G,CAyGxD,OA5DA/E,EAAM9J,UAAUxS,IAAI,iBAKd,UAONsc,EAAM9R,MAAMsR,UAAY,eAAesG,EAAcR,UAAUQ,EAAcC,0BAE7ER,IAAgBvF,EAAM9R,MAAMqZ,QAAU,IAEnCvB,GACDrjB,KAAKwjB,cAAcH,EAAUF,EAAeZ,GAK9C7f,YAAW,KACT2a,EAAM9R,MAAMsY,aAAe,GAExBxG,EAAM9H,oBACN8H,EAAM9H,kBAAkChK,MAAMsY,aAAe,G,GAE/D,GAEHxG,EAAMgJ,QAAQ1M,QAAU,GAAKjX,YAAW,KACtC2a,EAAM9J,UAAU/Q,OAAO,SAAU,WAE9B6gB,IACEhG,EAAMzF,cAAc,SACrByF,EAAM9J,UAAU/Q,OAAO,UACvB6gB,EAAS9X,MAAMC,QAAU,GACpB6R,EAAMoG,YAOfpG,EAAM9J,UAAUxS,IAAI,SAAU,iBAM9Bsc,EAAM9J,UAAUxS,IAAI,iBACbsc,EAAMgJ,QAAQ1M,QAErBzL,EAASC,SAAS,GACjBkU,GAEAsC,GACD3kB,KAAKklB,aAAaP,EAAMxB,EAAeQ,EAAQtB,GAAO,EAAMwC,EAAOhB,GAG9DiB,CACT,G,CAEUK,kBAAkBrD,GACvBA,EACD9hB,KAAK4T,SAASL,UAAUxS,IAAI,WAE5Bf,KAAK4T,SAASL,UAAUxS,IAAI,aAC5B2B,YAAW,KACT1C,KAAK4T,SAASL,UAAU/Q,OAAO,SAAS,GACvC,GAEP,CAEUghB,cAAcH,EAA0BF,EAAwBZ,GAQxE,MAAMqF,EAAazE,EAAcG,MAAQH,EAAcO,OAEvD,IAAI,MAACJ,EAAK,OAAEI,GAAUnB,EAInBqF,EAAa,EACdtE,EAAQI,EAASkE,EAEjBlE,EAASJ,EAAQsE,EAKnBvE,EAAS9X,MAAMC,QAAU,UAAU8X,gBAAoBI,2BAAgCP,EAAcG,MAAQA,MAAUH,EAAcO,OAASA,QAEhJ,CAEUwB,aAAaP,EAAsBpC,EAAeoB,EAAgBtB,EAAewF,EAAkBhD,EAAgBhB,GAC3H,MAAMiE,EAAQC,KAAKC,OACb,MAAC1E,EAAK,OAAEI,GAAUnB,EACxBF,GAAgB,EAEhB,MAAMiF,EAAKzD,EAAaM,MAAM,KAAKrJ,KAAKyM,GAAMhD,SAASgD,KAEjDrI,EAAO,KACX,MAAM+I,EAAOF,KAAKC,MAAQF,EAE1B,IAAIjQ,EAAWwK,EAAQ4F,EAAO5F,EAAQ,EACnCxK,EAAW,IAAGA,EAAW,GACzBgQ,IAAShQ,EAAW,EAAIA,GAE3B,MAAMqQ,EAAwCZ,EAAGxM,KAAKyM,GAAMA,EAAI1P,IAEhE,IAAImP,EACMA,EAAPnC,GAAW,EAAA2C,EAAA,GAAiB,EAAG,EAAGlE,EAAS,EAAIK,EAAS9L,EAAW6L,KAAWwE,IACxE,EAAAV,EAAA,GAAiB,EAAI7D,EAAS9L,EAAU,EAAGyL,EAA4CI,KAAWwE,GAC3GvD,EAAK8B,eAAe,KAAM,IAAKO,GAE5BiB,EAAO5F,IAAO,QAAQnD,EAAK,EAIhCA,GACF,CAEUiD,sBAAsB9E,GAC9B,GAAGA,EAAM9J,UAAUqB,SAAS,UAAW,CAErC,MAAM2N,EAAOviB,KAAK2S,QAAQjN,MAAM8c,wBAChCnF,EAAM9R,MAAMsR,UAAY,eAAe0F,EAAKI,UAAUJ,EAAKa,WAC3D/F,EAAM9J,UAAU/Q,OAAO,UAClB6a,EAAMoG,WACXpG,EAAM9J,UAAU/Q,OAAO,gB,CAE3B,CAEU2lB,aAAa9K,EAAoB+K,GAAS,GAClD,MAAMC,EAAUrI,EAAA,QAEhBhgB,KAAKmiB,sBAAsB9E,GAG3BA,EAAM9J,UAAUxS,IAAI,UAEjBsc,EAAMgJ,QAAQ1M,SACflG,cAAc4J,EAAMgJ,QAAQ1M,SAG9B,MAAM4I,EAAOlF,EAAMmF,wBAEb8F,EAAejL,EAAM9R,MAAMsR,UAAU8J,QAAQ,uBAAuB,CAACphB,EAAOgjB,KAChF,MAAMrB,EAAIkB,GAAU7F,EAAKe,MAAQ+E,EAGjC,OAAO9iB,EAAMohB,QAAQ4B,EAAIrB,EAAI,KAAK,IAIpC7J,EAAM9R,MAAMsR,UAAYyL,EAExB5lB,YAAW,KACT2a,EAAM7a,QAAQ,GACb,IACL,CAEUkd,cACR,MAAM8I,EAAWnd,SAASC,cAAc,OAWxC,OAVAkd,EAASjV,UAAUxS,IAAI,sBACvBynB,EAASjd,MAAMoc,QAAU,OAEtB3nB,KAAK2S,QAAQ0K,MACGrd,KAAK2S,QAAQ0K,MACrBpE,cAAcvN,OAAO8c,GAE9BxoB,KAAK4c,gBAAgBlR,OAAO8c,GAGvBxoB,KAAK2S,QAAQ0K,MAAQmL,CAC9B,CAEUC,kBAAkBpoB,EAAqBqH,EAAawV,GAE5D,MAAMtc,EAAKP,EAAO6c,QAAQwL,gBAAkBxL,EAAU7c,EAASA,EAAOuX,cAAcsF,GACpF,GAAGtc,KAAO,EAAA2c,EAAA,GAAgBld,EAAQ,YAAa,CAC7C,IAAG,EAAAkd,EAAA,GAAgBld,EAAQ,cAAe,CAExC,MAAM2b,EAAY3b,EAAO4Y,cAAcA,cAAcrB,cAAc,wBACnE,GAAGoE,EAAW,CACZ,GAAe,UAAZkB,EAMD,YALGlB,EAAUzI,UAAUqB,SAAS,WAC9BoH,EAAU/G,SAOd+G,EAAUxZ,Q,EAIV5B,EAAwB+B,MAAQ+E,IAClC,EAAAggB,EAAA,IAAmB9mB,EAAI8G,GAItB9G,EAAG2S,UAAUqB,SAAS,cAAgBhU,EAAGqY,cAAc1F,UAAUqB,SAAS,6BAC3EhU,EAAG2S,UAAU/Q,OAAO,Y,CAM1B,CAEUmmB,cAAc7a,EAAyB8a,GAC/C,MAAMC,EAAW/a,EAAO+a,WACxB,IAAIC,EACJ,GAAGD,EACDC,GAAmB,OAAc,CAC/B9gB,OAAQ8F,EACRib,QAAQ,EACRtZ,eAAe,EACfD,WAAW,QAER,CACL,MAAMT,EAAQ+Z,EAAmBzd,SAASC,cAAc,QACxDyD,EAAMrD,QAAO,EAAAsd,EAAA,GAAclb,IAC3BiB,EAAMwE,UAAUxS,IAAI,a,CAGtB,MAAMkoB,EAAYjpB,KAAKuU,OAAOqK,SACxBsK,EAAYlpB,KAAKuU,OAAOqK,SAAYqK,EAAUE,YAEpD,OAAO/H,QAAQgI,IAAI,CAChBppB,KAAKuU,OAAOqK,SAA2ByK,kBAAkB,CACxDrhB,OAAQ8F,GAAoB,KAC5Bwb,UAAWT,OAAW5kB,EAAY,GAAK6J,IAGzCgb,IACCxa,MAAK,EAAEsB,EAAGb,MACR/O,KAAKuU,OAAOqK,WAAasK,KAI5B,EAAAK,EAAA,GAAevpB,KAAKuU,OAAOiC,MAAM,QAAmBoS,KACpD,EAAAW,EAAA,GAAevpB,KAAKuU,OAAOsK,OAAQ9P,GACnCka,EAAUO,YAAYxpB,KAAKuU,OAAOqK,UAAS,GAE/C,CAEgBrI,WACd7Q,EACAkjB,EACA9a,EACA0H,EACAnV,EACA6Q,GAAU,EACVuE,EAA4B,GAC5BC,EAA4B,GAC5BvN,G,yCAGA,GAAGnI,KAAK2V,gBAAiB,OAAO3V,KAAK2V,gBAMrC,MAAM8T,EAAmBzpB,KAAK2oB,cAAc7a,EAAQ8a,GAE9Cc,EAAyB,aAAZhkB,EAAMkK,EACnB+Z,EAAUD,GAAchkB,EAAMgR,YAAe,CAAC,QAAS,OAAgC3B,SAASrP,EAAM9D,OAA+C,IAAtC8D,EAAMgR,UAAUyD,QAAQ,WAE1Ina,KAAKkc,cAGNlc,KAAKkc,aAAc,EACnBlc,KAAKwI,WAAWW,WAAWsM,EAAaC,EAAaxE,GACpDwC,OAAeiO,eAAiB3hB,MAShCA,KAAKwI,WAAWoB,KAAK/G,OAAS,IAC/BH,YAAW,KACT1C,KAAKwI,WAAW5F,MAAK,EAAK,GACzB,GAML5C,KAAK6T,QAAQnD,KAAK6C,UAAU1J,OAAO,QAAS7J,KAAKwI,WAAWK,SAAShG,QACrE7C,KAAK6T,QAAQjK,KAAK2J,UAAU1J,OAAO,QAAS7J,KAAKwI,WAAWoB,KAAK/G,QAEjE,MAAMuI,EAAYpL,KAAK2S,QAAQjN,MACzBkkB,GAAwBvpB,GAAUA,IAAW+K,EAChDwe,IAAsBvpB,EAAS+K,GAElCpL,KAAKK,OAAS,CAAC6B,QAAS7B,GACxB,MAAM0b,IAAW/b,KAAK+b,OAEnB3Q,EAAUmK,oBACXnK,EAAUoU,UAAY,IAKQ,IAAdhK,GAEhBxV,KAAKmoB,aAAanoB,KAAK2S,QAAQ0K,MAAqB,IAAd7H,GACtCxV,KAAK0f,gBAEL1f,KAAK6hB,eAAc,GACnB7hB,KAAKgiB,2BACCyH,EAEFzpB,KAAK4T,SAASqF,gBAChBjZ,KAAKmc,OAAO5E,aAAavX,KAAK4T,SAAUvI,SAAS+Q,eAAe,iBAC3Dpc,KAAK4T,SAAS6P,YAGrBzjB,KAAKmlB,mBAAkB,GAEnB,EAAA0E,mBACF7pB,KAAKshB,eAAiB,CACpB1f,KAAM,QACNkoB,MAAQC,IACN,GAAG/pB,KAAKid,yBACN,OAAO,EAGTjd,KAAK4S,OAAO,GAIhB2O,EAAA,WAAiCvhB,KAAKshB,kBAM1C,MAAMjE,EAAQrd,KAAK2S,QAAQ0K,MAErB2M,EAAWhK,EAAA,QAGjB,IAAIiK,EAAU,EACd,MAAMC,EAAUlK,EAAA,SACbkK,EAAU,MAAYC,EAAA,aACvBF,EAAU,KAEZ,MAAMG,EAAYF,EAAU,IAAMD,EAClC,IAAII,EAA6BjJ,QAAQjT,UACzC,MAAMtG,GAAO,EAAAyiB,EAAA,GAAkB5kB,EAAO0F,EAAW4e,EAAUI,GAAWD,EAAA,gBAAoClmB,KAAcylB,GAAchkB,EAAM0I,GAAK1I,EAAM0J,IAAImb,UAC3J,GAAGX,EAAsB,CACvB,MAAMriB,QAAqBvH,KAAKiH,SAASO,cAAcC,gBAAgB/B,EAAOmC,EAAKjG,MACnF,IAAI4oB,EACJ,GAAGjjB,EAAakjB,WACdD,EAAM,IAAItE,MACVsE,EAAI7nB,IAAM4E,EAAaG,QAClB,CACL,MAAMgjB,GAAW,EAAAC,EAAA,GAAyBjlB,EAAO6B,GAAc,GAC5DmjB,IACDL,EAAeK,EAASE,YACxBJ,EAAME,EAASzE,M,CAIhBuE,IACDA,EAAIjX,UAAUxS,IAAI,aAClBqK,EAAUM,OAAO8e,G,CASrB,MAAMnjB,KAAgCqiB,IAAchkB,EAAM2B,mBACpD2U,EAAY3U,EAAoBrH,KAAKic,oBAAsBjc,KAAKgc,UAEhEvU,EAAkB,IACfzH,KAAKiH,SAASO,cAAcC,gBAAgB/B,EAAOmC,aAAI,EAAJA,EAAMjG,MAGlE,IAAI+T,EACJ,GAAGgU,EAAS,CAKV,MAAMkB,EAAgB1iB,GAA0B,QAAfzC,EAAM9D,KACjCsE,GAED,EAAAigB,EAAA,GAAY,CAACje,IAAK2iB,IAEpB7qB,KAAK4T,SAASL,UAAUqB,SAAS,gBAClC1O,EAAM0H,iBAAiB,cAAewM,EAAA,GAGxC,MAAMxW,EAAM,IAAM5D,KAAKyhB,iBAAiBphB,GAAQ,EAAOmV,GAAWlH,MAAK,EAAEoT,qBAKvE,MAAMoJ,EAAMzN,EAAM9H,mBAAqB8H,EAAM9H,kBAAkBhC,UAAUqB,SAAS,yBAA2ByI,EAAM9H,kBAAoB8H,EAGjI0N,EAAa1N,EAAMzF,cAAc,SACpCmT,GACDA,EAAWvoB,SAKb0D,EAAMyH,aAAa,cAAe,QAGlCzH,EAAM0H,iBAAiB,cAAc,KAChC5N,KAAK+b,SAAWA,GACjB7V,EAAM3B,O,IAIVvE,KAAK4N,iBAAiB,iBAAiB,KACrC1H,EAAMvD,IAAM,GACZuD,EAAMtD,MAAM,GACX,CAACqL,MAAM,IAEP,EAAAxL,YAGDyD,EAAM1B,UAAW,GAGD,QAAfkB,EAAM9D,MACPsE,EAAM6G,OAAQ,EACd7G,EAAM1B,UAAW,EACjB0B,EAAMxC,MAAO,GACLgC,EAAMmB,SAAW,KACzBX,EAAMxC,MAAO,GAIfonB,EAAIpf,OAAOxF,GAGX,MAAM8kB,EAAiB,IAAI5J,SAASjT,IAClCjI,EAAM0H,iBAAiB,UAAWO,EAAS,CAACF,MAAM,GAAM,IAGpDgd,EAAe,KACD,QAAfvlB,EAAM9D,OACPsE,EAAMmgB,QAAQ6E,KAAO,UACrBhlB,EAAMmgB,QAAQ8E,QAAU,IAExB/J,QAAQgI,IAAI,CAAC4B,EAAgBtJ,IAAiBpT,MAAK,KAC9CtO,KAAK+b,SAAWA,KAMJ/b,KAAKugB,YAAc,IAAI5J,EAAY,CAChDzQ,QACAzB,MAHW,EAIXmS,WAAYvP,EACZwP,yBAA2BuU,IACzBprB,KAAK4T,SAASL,UAAU1J,OAAO,iBAAkBuhB,EAAK,EAExDtU,MAAQ5O,IACN,MAAMmjB,EAAoB3X,OAAeiO,eACzC,IAAIzZ,GAAOmjB,GAAoBA,IAAqBrrB,KAGlD,OAFAA,KAAKsrB,wBAAqBrnB,OAC1BjE,KAAK4S,QAIO5S,KAAK4c,gBAAgBgK,iBAC7BrT,UAAU1J,OAAO,SAAU3B,GACjClI,KAAKmlB,mBAAmBjd,GACxBlI,KAAK6hB,eAAe3Z,GACpBlI,KAAK+hB,uBAAuB7Z,GAEzBlI,KAAKshB,iBACHpZ,EAAKqZ,EAAA,aAAmCvhB,KAAKshB,gBAC3CC,EAAA,WAAiCvhB,KAAKshB,iBAG1CuJ,IACE3iB,GAGDlI,KAAKsrB,oBAAmB,GACxBtrB,KAAKsrB,wBAAqBrnB,EAE1B8N,EAAA,sBAA+C7L,IAE/ClG,KAAKsrB,mBAAqBvZ,EAAA,iBAA0C7L,EAAOiC,G,EAIjF4O,WAAY,KAIV/W,KAAK4S,OAAO,KAGThF,iBAAiB,kBAAmB2d,IACzCvrB,KAAK4T,SAASL,UAAU1J,OAAO,qBAAsB0hB,EAAK,IAG5DvrB,KAAK4N,iBAAiB,kBAAkB,KACtC5N,KAAK4T,SAASL,UAAU/Q,OAAO,sBAC/BxC,KAAKugB,YAAY7E,UACjB1b,KAAKugB,iBAActc,CAAS,GAC3B,CAACgK,MAAM,IAEPjO,KAAKod,aACNpd,KAAKugB,YAAYC,cAAa,G,MAQtC,GAAGnZ,EAAmB,CACpBqa,EAAepT,MAAK,KACfpI,EAAMslB,WAAatlB,EAAMulB,kBAE1BzP,EAAU0P,OAAOrO,GAAO,E,IAQ5B,MAAMsO,EAAgB,KACpBzlB,EAAM0H,iBAAiB,WAAW,KAEhCoO,EAAU4P,SACV1lB,EAAM+S,cAAc1F,UAAU/Q,OAAO,eAAe,GACnD,CAACyL,MAAM,GAAM,EAGlB/H,EAAM0H,iBAAiB,WAAW,KAChC,MAAMie,EAAU3lB,EAAM4lB,eAAiB5lB,EAAM6lB,gBACvCC,EAAiB9lB,EAAMslB,WAAatlB,EAAMulB,iBAG7CI,GAAWG,IACZL,IAGA3P,EAAU0P,OAAOrO,GAAO,GAGxBnX,EAAM+S,cAAc1F,UAAUxS,IAAI,gB,IAInCf,KAAK4T,SAASL,UAAUqB,SAAS,gBAClC1O,EAAM0H,iBAAiB,eAAgB7F,KACrC,EAAAqS,EAAA,GAAYrS,EAAE,IAIlB4jB,G,CAqEF3rB,KAAKqe,cAAc4N,QAAQ,CAACrpB,KAjEf,IAAW,EAAD,gCAKrB,MAAM2L,EAAwBlH,EAAoB+Z,QAAQjT,UAAY+d,EAAA,mBAAoC,CAACxmB,UAyD3G,OAvDI2B,GACFqa,EAAepT,MAAK,IAAW,EAAD,uCACjB7G,KAAmBC,KAE5BsU,EAAU0P,OAAOrO,GAAO,EAAM9O,EAElC,MAGF6S,QAAQgI,IAAI,CAAC7a,EAASmT,IAAiBpT,MAAK,IAAW,EAAD,gCACpD,GAAGtO,KAAK+b,SAAWA,EAEjB,YADA/b,KAAKke,IAAI7R,KAAK,8BAIhB,MAAM3E,SAAaD,KAAmBC,IAEtCxB,EAAM0H,iBAAiB,SAAS,MAC9B,EAAAue,EAAA,IAAS,CACPC,YAAa,EAAAxR,UAAY,2BAA6B,8BAGhC,IAArB1U,EAAMmmB,MAAMxS,MACb7Z,KAAKke,IAAImO,MAAM,SAAWnmB,EAAMmmB,MAAMxS,KAAO,cAAgB3T,EAAMmmB,MAAMlkB,SAG3E6T,SAAAA,EAAW4P,QAAQ,GAClB,CAAC3d,MAAM,IAEP5N,aAAkB4kB,cAEnB6F,EAAIvV,kBAAkBqR,iBAAiBlb,OAAOxF,IAG9C,EAAAwhB,EAAA,IAAmBxhB,EAAOwB,GAKzBmjB,IACD7qB,KAAKsrB,mBAAqBvZ,EAAA,iBAA0C7L,EAAOiC,GAE3EnI,KAAK4N,iBAAiB,kBAAkB,KACnC5N,KAAKsrB,qBACNtrB,KAAKsrB,qBACLtrB,KAAKsrB,wBAAqBrnB,E,GAE3B,CAACgK,MAAM,KAGZjO,KAAKyoB,kBAAkBpoB,EAAQqH,EAAK,SAEpCujB,GACF,MAEO1c,CACT,KAEkC,IAIpCoH,EAAkB0U,EAAa/b,KAAK1K,E,KAC/B,CACL,MAAMA,EAAM,IAAM5D,KAAKyhB,iBAAiBphB,GAAQ,EAAOmV,GAAWlH,MAAK,EAAEoT,qBAqEvE1hB,KAAKqe,cAAc4N,QAAQ,CAACrpB,KAhEf,IAAW,EAAD,gCACrB,MAAM0pB,EAAqB5C,EAAawC,EAAA,mBAAoC,CAACxmB,UAAUwmB,EAAA,mBAAoC,CAACxmB,QAAO2J,MAAOxH,IA4D1I,OA1DA6Z,EAAepT,MAAK,IAAW,EAAD,uCACjB7G,KAAmBC,KAC5B1H,KAAKgc,UAAUuQ,cAAcD,EAGjC,MAEAlL,QAAQgI,IAAI,CAAC1H,EAAgB4K,IAAqBhe,MAAK,IAAW,EAAD,gC,MAC/D,GAAGtO,KAAK+b,SAAWA,EAEjB,YADA/b,KAAKke,IAAI7R,KAAK,8BAMhB,MAAM3E,SAAaD,KAAmBC,IACtC,GAAGrH,aAAkB4kB,eAInB,GAHAjlB,KAAKyoB,kBAAkBpoB,EAAQqH,EAAK,OACpC1H,KAAKyoB,kBAAkBpL,EAAO3V,EAAK,OAEhCyiB,EAAA,WAAqB,CACtB,MAAMqC,EAAOnP,EAAM5E,iBAAiB,OACjC+T,GAAQA,EAAK3pB,QACd2pB,EAAKznB,SAASylB,IACZA,EAAIjX,UAAU/Q,OAAO,YAAY,G,MAIlC,CACL,MAAMsoB,EAAMzN,EAAM9H,mBAAqB8H,EAAM9H,kBAAkBhC,UAAUqB,SAAS,yBAA2ByI,EAAM9H,kBAAoB8H,EACjIoP,EAA+C,SAAd,QAArB,EAAA3B,EAAIvV,yBAAiB,eAAE2H,SAAoB4N,EAAIvV,kBAAwC,KACzG,IAAIkX,GAAaA,EAAU9pB,MAAQ+E,EAAM,CACvC,MAAMue,EAAQ,IAAIC,MAClBD,EAAM1S,UAAUxS,IAAI,cAIpB,EAAA2mB,EAAA,IAAmBzB,EAAOve,GAAK,KAC7B1H,KAAKyoB,kBAAkBpoB,EAAQqH,EAAK,OAEjC+kB,IACD,SAAQ,KACNA,EAAUjqB,QAAQ,IAItBsoB,EAAIpf,OAAOua,EAAM,G,EAMzB,MAAGhO,OAAOzS,IACRxF,KAAKke,IAAImO,MAAM7mB,GACfxF,KAAKgc,UAAU0P,OAAOrO,GACtBrd,KAAKgc,UAAU0Q,WAAW,IAGrBJ,CACT,KAEkC,IAGpC3W,EAAkB0U,EAAa/b,KAAK1K,E,CAGtC,OAAO5D,KAAK2V,gBAAkBA,EAAgBsC,OAAM,KAClDjY,KAAKid,yBAA2B,IAAI,IACnC9E,SAAQ,KACTnY,KAAK2V,gBAAkB,IAAI,GAE/B,G,0HE15CF,MAAM4L,EAA0B,IArPzB,MAWLxhB,cAaE,GAUM,KAAA4sB,WAAc5kB,IACpB,MAAM6kB,EAAOlZ,OAAOmZ,SAASD,KACvBhlB,EAAaG,EAAE+kB,MAErB,GADA9sB,KAAK+sB,OAAS/sB,KAAKke,IAAI,WAAYnW,EAAG/H,KAAKgtB,gBAAiBJ,GACzDA,IAAS5sB,KAAKitB,YAGf,GAFAjtB,KAAK+sB,OAAS/sB,KAAKke,IAAI7R,KAAK,qBAAqBugB,cAAiB5sB,KAAKitB,2BAA2BjtB,KAAKktB,kBAEpGtlB,IAAO5H,KAAK4H,IAAM5H,KAAKktB,gBAAkBltB,KAAKktB,iBAAmBN,EAClE5sB,KAAKmtB,aAAantB,KAAKktB,oBAClB,KAAGtlB,GAAyB5H,KAAKktB,iBAAkBN,EAMxD,OAHA5sB,KAAKitB,YAAcL,OACnB5sB,KAAKotB,cAAgBptB,KAAKotB,gBAH1BptB,KAAKmtB,c,CAST,GAAGvlB,IAAO5H,KAAK4H,KACb5H,KAAKqtB,aAEDrtB,KAAKstB,YAAYzqB,QACnB,OAIJ,MAAMG,EAAOhD,KAAKstB,YAAY7H,MAC1BziB,GAKJhD,KAAKutB,QAAUvtB,KAAKgtB,gBACpBhtB,KAAKwtB,WAAWxqB,IALdhD,KAAKqtB,WAKc,EAIf,KAAA7P,UAAazV,IACnB,MAAM/E,EAAOhD,KAAKstB,YAAYttB,KAAKstB,YAAYzqB,OAAS,GACpDG,IACS,WAAV+E,EAAEyE,KAAqBxJ,EAAKyqB,WAAWzqB,EAAKyqB,cAC7C,OAAY1lB,GACZ/H,KAAK0tB,KAAK1qB,EAAKpB,O,EAIX,KAAA+rB,aAAgB5lB,IACnBA,EAAE6lB,QAAQ/qB,OAAS,IACtB7C,KAAK+sB,OAAS/sB,KAAKke,IAAI,eAEpB,OAAoBnW,KACrB/H,KAAKgtB,iBAAkB,EAEvBtZ,OAAO9F,iBAAiB,YAAY,KAClClL,YAAW,KACT1C,KAAKgtB,iBAAkB,CAAK,GAC3B,IAAI,GACN,CAAC/K,SAAS,EAAMhU,MAAM,K,EAhF3BjO,KAAKstB,YAAc,GACnBttB,KAAK4H,GAAKmgB,KAAKC,MACfhoB,KAAKutB,QAAS,EACdvtB,KAAKke,KAAM,QAAO,MAClBle,KAAK+sB,OAAQ,EACb/sB,KAAKitB,YAAcvZ,OAAOmZ,SAASD,KACnC5sB,KAAKktB,eAAiB,GACtBltB,KAAKgtB,iBAAkB,EAEvBtZ,OAAO9F,iBAAiB,WAAY5N,KAAK2sB,YACzCjZ,OAAO9F,iBAAiB,UAAW5N,KAAKwd,UAAW,CAACxI,SAAS,EAAMiN,SAAS,IAEzE,EAAA4H,iBAAkB,CACnB,MAAMgE,EAAU,CAAC5L,SAAS,GAC1BvO,OAAO9F,iBAAiB,aAAc5N,KAAK2tB,aAAcE,E,CAG3DC,QAAQC,kBAAoB,SAE5B/tB,KAAKqtB,WACP,CAkGOF,aAAaP,EAAe,IAC9BA,GAAoB,MAAZA,EAAK,GAAYA,EAAO,IAAMA,EACxB,MAATA,IAAcA,EAAO,IAE1B5sB,KAAKitB,cAAgBL,IAIxB5sB,KAAKktB,eAAiBltB,KAAKitB,YAAcL,EACzC5sB,KAAKguB,eACLhuB,KAAKqtB,YACP,CAEQG,WAAWxqB,GACjB,MAAM8W,EAAO9W,EAAK8mB,QAAO9pB,KAAKutB,aAAiBtpB,GAC/CjE,KAAK+sB,OAAS/sB,KAAKke,IAAI,wBAAyBlb,EAAMhD,KAAKstB,cAC/C,IAATxT,EACD9Z,KAAKiuB,SAASjrB,GACLA,EAAKkrB,cACd,SAGFluB,KAAKutB,QAAS,CAChB,CAEOY,eAAevsB,GACpB,IAAI,IAAIwiB,EAAIpkB,KAAKstB,YAAYzqB,OAAS,EAAGuhB,GAAK,IAAKA,EAAG,CACpD,MAAMphB,EAAOhD,KAAKstB,YAAYlJ,GAC9B,GAAGphB,EAAKpB,OAASA,EACf,MAAO,CAACoB,OAAMorB,MAAOhK,E,CAG3B,CAEOsJ,KAAK9rB,GACV,GAAGA,EAAM,CACP,MAAMkjB,EAAM9kB,KAAKmuB,eAAevsB,GAChC,GAAGkjB,EAED,YADA9kB,KAAKquB,WAAWvJ,EAAI9hB,KAAM8hB,EAAIsJ,M,CAKlCN,QAAQJ,MACV,CAEOW,WAAWrrB,EAAsBorB,EAAQpuB,KAAKstB,YAAYnT,QAAQnX,IACvEhD,KAAKutB,QAAS,EAGdvtB,KAAKstB,YAAYgB,OAAOF,EAAO,GAC/BpuB,KAAKwtB,WAAWxqB,EAElB,CAEQurB,YAAYvrB,GAClBhD,KAAK+sB,OAAS/sB,KAAKke,IAAI,cAAelb,EAAMhD,KAAKstB,aAE7CtqB,EAAKwrB,WACPxuB,KAAKqtB,WAET,CAEOY,SAASjrB,GACdhD,KAAKstB,YAAYjrB,KAAKW,GACtBhD,KAAKuuB,YAAYvrB,EACnB,CAEOyrB,YAAYzrB,GACjBhD,KAAKstB,YAAYrB,QAAQjpB,GACzBhD,KAAKuuB,YAAYvrB,EACnB,CAEO0rB,YAAYN,EAAevrB,KAAmB8rB,GACnD3uB,KAAKstB,YAAYgB,OAAOF,EAAOvrB,KAAW8rB,GAC1CA,EAAM5pB,SAAS/B,IACbhD,KAAKuuB,YAAYvrB,EAAK,GAE1B,CAEQqqB,YACNrtB,KAAK+sB,OAAS/sB,KAAKke,IAAI,QACvBle,KAAKutB,QAAS,EACdO,QAAQT,UAAUrtB,KAAK4H,GAAI,GAC7B,CAEOomB,eACLhuB,KAAK+sB,OAAS/sB,KAAKke,IAAI7R,KAAK,WAE5B,MAAM3E,EAAMmlB,SAAS+B,OAAS/B,SAASgC,SAAWhC,SAASiC,OAAS9uB,KAAKktB,eACzEY,QAAQE,aAAahuB,KAAK4H,GAAI,GAAIF,EACpC,CAEOqnB,WAAW/rB,GACZA,IAIJ,OAAiBhD,KAAKstB,YAAatqB,EACrC,CAEOgsB,aAAaptB,EAA8BqtB,GAAS,GACzD,IAAI,IAAI7K,EAAIpkB,KAAKstB,YAAYzqB,OAAS,EAAGuhB,GAAK,IAC/BpkB,KAAKstB,YAAYlJ,GACtBxiB,OAASA,IACf5B,KAAKstB,YAAYgB,OAAOlK,EAAG,IAExB6K,MAL4C7K,GAUrD,GAIF,6BAAyC7C,EACzC,S,6GCnQO,MAAM2N,EAKXnvB,YACSmY,EACAtW,EACCutB,GAAY,EACpB9T,EACA+T,GAAY,EACLC,GAAa,EACbC,EACAC,GAPA,KAAArX,KAAAA,EACA,KAAAtW,KAAAA,EACC,KAAAutB,UAAAA,EAGD,KAAAE,WAAAA,EACA,KAAAC,QAAAA,EACA,KAAAC,QAAAA,EAEPvvB,KAAKwvB,KAAO,2BACZxvB,KAAKoL,UAAYC,SAASC,cAAc,OACrC+P,IAAWrb,KAAKoL,UAAUiQ,UAAYA,GAEtCnD,IACDlY,KAAK6e,OAASxT,SAASC,cAAc,OACrCtL,KAAK6e,OAAOtL,UAAUxS,IAAI,sBACN,iBAAX,GACPf,KAAK6e,OAAOnT,QAAO,QAAKwM,IAE1BlY,KAAKoL,UAAUM,OAAO1L,KAAK6e,SAG7B7e,KAAKoL,UAAUmI,UAAUxS,IAAI,eAAgB,gBAAkBa,GAC/D5B,KAAKoL,UAAUM,OAAO1L,KAAKwvB,MAC3BxvB,KAAKoL,UAAUG,MAAMoc,QAAU,OAE5ByH,GACD,+BAAuCpvB,KAAKwvB,KAAMF,OAASrrB,EAAWorB,EAE1E,CAEA7N,QACExhB,KAAKoL,UAAUG,MAAMoc,QAAU,OAE5B3nB,KAAKmvB,YACNnvB,KAAKwvB,KAAKhQ,UAAY,GAE1B,CAEAiQ,YACEzvB,KAAKoL,UAAUG,MAAMoc,QAAU,EACjC,CAEA9d,SACK7J,KAAKwvB,KAAKE,kBACX1vB,KAAKyvB,YAELzvB,KAAKwhB,OAET,EAKa,MAAMmO,EAiBnB5vB,YACSqL,EACAwkB,EACAC,EACAC,EACAP,GAJA,KAAAnkB,UAAAA,EACA,KAAAwkB,YAAAA,EACA,KAAAC,aAAAA,EACA,KAAAC,SAAAA,EACA,KAAAP,QAAAA,EArBD,KAAAQ,SAAW,EACX,KAAAC,aAAe,EACf,KAAAC,YAAc,EAEd,KAAAC,cAA+B,KAC/B,KAAAC,cAAwB,EAExB,KAAAC,MAAQ,GAER,KAAAC,eAAiC,KAGjC,KAAApd,SAAW,EAWjBjT,KAAKswB,WAAa,IAAI,KAAWtwB,KAAKoL,WACtCpL,KAAKqwB,eAAiBrwB,KAAKswB,WAAWllB,UACtC,IAAI,MAAMgZ,KAAKpkB,KAAK6vB,aAClB7vB,KAAKqwB,eAAe3kB,OAAO1L,KAAK6vB,aAAazL,GAAsBhZ,WAGlEpL,KAAK6vB,aAAaU,UACnBvwB,KAAKswB,WAAWE,oBAAoBxwB,KAAK6vB,aAAaU,SAASf,MAGjExvB,KAAK4vB,YAAYa,SAAY/jB,IAM3B1M,KAAKowB,MAAQ1jB,EACb1M,KAAK2Q,OAAM,GACX3Q,KAAK0wB,YAAY,EAGnB1wB,KAAKswB,WAAWK,iBAAmB,KAC7B3wB,KAAKowB,MAAMQ,SAEX5wB,KAAKmwB,gBACPnwB,KAAKmwB,cAAgBzc,OAAOhR,YAAW,KACrC1C,KAAK0wB,aACL1wB,KAAKmwB,cAAgB,CAAC,GACrB,I,CAGT,CAEOxf,MAAMyY,GAAM,GACdA,IACDppB,KAAK4vB,YAAYljB,MAAQ,GACzB1M,KAAKowB,MAAQ,GACbpwB,KAAKgI,YAAS/D,EACdjE,KAAKiT,SAAW,GAGlBjT,KAAK+vB,SAAW,EAChB/vB,KAAKgwB,aAAe,EACpBhwB,KAAKiwB,YAAc,EAEnB,IAAI,MAAM7L,KAAKpkB,KAAK6vB,aAClB7vB,KAAK6vB,aAAazL,GAAsB5C,QAG1CxhB,KAAKkwB,cAAgB,IACvB,CAEOW,YAAY7oB,EAAiBiL,EAAW,EAAGmd,EAAQ,IACxDpwB,KAAKgI,OAASA,EACdhI,KAAKiT,SAAWA,EAEbjT,KAAKowB,QAAUA,IAChBpwB,KAAK4vB,YAAYkB,WAAWpkB,MAAQ0jB,GAGtCpwB,KAAK4vB,YAAYmB,MAAMC,OACzB,CAEON,aACL,GAAG1wB,KAAKkwB,cAAe,OAAOlwB,KAAKkwB,cAEnC,MAAME,EAAQpwB,KAAKowB,MAEnB,IAAIA,EAAMQ,OAER,YADA5wB,KAAK8vB,UAAY9vB,KAAK8vB,SAAS,IAIjC,IAAwB,IAArB9vB,KAAKiwB,YAAqBjwB,KAAKgwB,aAAehwB,KAAKiwB,WACpD,OAAO7O,QAAQjT,UAGjB,MAAM8iB,EAAQjxB,KAAK+vB,UAAY,EAE/B,OAAO/vB,KAAKkwB,cAAgB,0CAAgD,CAC1EloB,OAAQhI,KAAKgI,OACbooB,QACAhe,YAAa,CAACxC,EAAG,4BACjBqhB,QACAC,MAAO,GACPje,SAAUjT,KAAKiT,WACd3E,MAAM6iB,IAGP,GAFAnxB,KAAKkwB,cAAgB,KAElBlwB,KAAK4vB,YAAYljB,QAAU0jB,EAC5B,OAKF,MAAM,MAACgB,EAAK,QAAEtD,GAAWqD,EAEtBrD,EAAQjrB,QAAUirB,EAAQ,GAAG7lB,MAAQjI,KAAK+vB,UAC3CjC,EAAQuD,QAGV,MAAMC,EAActxB,KAAK6vB,aAAaU,SAEtCzC,EAAQ/oB,SAASoD,IACf,IACE,MAAMH,EAAShI,KAAKgI,OAASG,EAAQ2F,OAAS3F,EAAQH,OACtD,qCAA6C,CAC3CA,SACAoD,UAAWpL,KAAKswB,WAChBiB,WAAY,SACZC,WAAW,EACXrpB,UACAioB,QACAb,QAASvvB,KAAKuvB,S,CAEhB,MAAM/pB,GACN4G,QAAQigB,MAAM,mCAAoC7mB,E,KAItD8rB,EAAYznB,SAEZ7J,KAAK+vB,SAAWjC,EAAQjrB,QAAUirB,EAAQA,EAAQjrB,OAAS,GAAGoF,KAErC,IAAtBjI,KAAKgwB,cACNhwB,KAAKgwB,YAAc,GAErBhwB,KAAKgwB,aAAelC,EAAQjrB,QAEJ,IAArB7C,KAAKiwB,aACNjwB,KAAKiwB,WAAamB,EAEfE,EAAYzS,SACb,OAAeyS,EAAYzS,QAAQ,QAAKuS,EAAQ,4BAA8B,8BAA+B,CAACA,KAGhHpxB,KAAK8vB,UAAY9vB,KAAK8vB,SAAS9vB,KAAKiwB,Y,IAErChY,OAAOzS,IACR4G,QAAQigB,MAAM,eAAgB7mB,GAC9BxF,KAAKkwB,cAAgB,IAAI,GAE7B,E,s9BCvIF,MAAMuB,GASJ1xB,YACU2xB,EACAC,EACA9f,GAFA,KAAA6f,SAAAA,EACA,KAAAC,YAAAA,EACA,KAAA9f,eAAAA,EA6GF,KAAA+f,YAAc,KACpBC,EAAA,gBAA0B,CACxB7pB,OAAQhI,KAAKgI,OACbmL,UAAWnT,KAAKiI,IAChBgL,SAAUjT,KAAK2xB,YAAYvnB,cAAc6I,UACzC,EAGI,KAAAJ,eAAiB,KACpB7S,KAAK2xB,YAAYG,UAAUC,aAC5B,QAAmB/xB,KAAK2xB,YAAYG,UAAUE,qBAE9C,IAAI,IAAa,CACf,CAAChyB,KAAKgI,QAAS,CAAChI,KAAKiI,M,EAKnB,KAAAgqB,cAAgB,KACtBjyB,KAAK2xB,YAAYG,UAAUI,gBAAgBlyB,KAAKK,OAAO,EAGjD,KAAA8xB,sBAAwB,KAC9BnyB,KAAK2xB,YAAYG,UAAUM,iBAAiB,EAGtC,KAAA1f,cAAgB,KACnB1S,KAAK2xB,YAAYG,UAAUC,aAC5B,QAAmB/xB,KAAK2xB,YAAYG,UAAUO,oBAE9C,IAAI,IAAoBryB,KAAKgI,OAAQ,CAAChI,KAAKiI,KAAM,O,EAzInDjI,KAAKiH,SAAW0qB,EAAY1qB,SAkDzB,MAGD,EAAAqrB,GAAA,GAA0B,CACxBpwB,QAASwvB,EACTa,SArDgFxqB,IAMlF,IAAI/E,EALDhD,KAAKwyB,OACNxyB,KAAKwyB,OACLxyB,KAAKwyB,KAAO,MAId,IACExvB,GAAO,EAAAua,EAAA,GAAgBxV,EAAE1H,OAAQ,oBACxB,CAAT,MAAM0H,GAAG,CAEX,GAAI/E,EAAJ,CAGA,GADG+E,aAAa0qB,YAAY1qB,EAAE2qB,iBAC3B1yB,KAAKkC,QAAQqR,UAAUqB,SAAS,UACjC,OAAO,EAEN7M,aAAa0qB,aAAY1qB,EAAE4qB,cAAe,GAEnC,MAAW,GAAD,gCAClB3yB,KAAKK,OAAS2C,EACdhD,KAAKgI,OAAShF,EAAKqjB,QAAQre,OAAO4qB,WAClC5yB,KAAKiI,KAAOjF,EAAKqjB,QAAQpe,IACzBjI,KAAK6yB,WAAalB,EAAYG,UAAUgB,cAAc9yB,KAAKgI,OAAQhI,KAAKiI,WAElEmZ,QAAQgI,IAAIppB,KAAK6T,QAAQiH,KAAUxE,GAAW,GAAD,gCACjD,IAAIwD,EAGFA,IADC9Z,KAAK6yB,aAAevc,EAAOyc,kBAGrBzc,EAAO/N,eAAe+N,EAAO/N,WAGtC+N,EAAOpU,QAAQqR,UAAU1J,OAAO,QAASiQ,EAC3C,OAEA9W,EAAKuQ,UAAUxS,IAAI,cAEnB,EAAAiyB,GAAA,GAAajrB,EAAG/H,KAAKkC,SACrB+wB,GAAA,cAAkCjzB,KAAKkC,SAAS,KAC9Cc,EAAKuQ,UAAU/Q,OAAO,YAAY,GAEtC,GAAC,EAED8hB,EAlCgB,CAkCb,EASDzS,kBAGN,CAEQ2gB,OACNxyB,KAAK6T,QAAU,CAAC,CACdE,KAAM,UACNC,KAAM,UACNC,QAASjU,KAAK6S,eACdtK,OAAQ,IAAW,GAAD,gCAAC,OAAAvI,KAAKiH,SAAS8G,mBAAmBkI,iBAAiBjW,KAAKiH,SAAS8G,mBAAmByE,iBAAiBxS,KAAKgI,OAAQhI,KAAKiI,KAAK,KAC7I,CACD8L,KAAM,UACNC,KAAM,oCACNC,QAASjU,KAAK6S,eACdtK,OAAQ,IAAMvI,KAAK6yB,aAChB7yB,KAAK2xB,YAAYG,UAAUE,oBAAoBze,UAAUqB,SAAS,QACrEme,eAAe,GACd,CACDhf,KAAM,UACNC,KAAM,uBACNC,QAASjU,KAAK4xB,YACdmB,eAAe,GACd,CACDhf,KAAM,SACNC,KAAM,yBACNC,QAASjU,KAAKiyB,eACb,CACDle,KAAM,SACNC,KAAM,kCACNC,QAASjU,KAAKmyB,sBACd5pB,OAAQ,IAAMvI,KAAK6yB,WACnBE,eAAe,GACd,CACDhf,KAAM,gBACNC,KAAM,SACNC,QAASjU,KAAK0S,cACdnK,OAAQ,IAAW,GAAD,gCAAC,OAAAvI,KAAKiH,SAAS8G,mBAAmBqI,uBAAuBpW,KAAKiH,SAAS8G,mBAAmByE,iBAAiBxS,KAAKgI,OAAQhI,KAAKiI,KAAK,KACnJ,CACD8L,KAAM,gBACNC,KAAM,mCACNC,QAASjU,KAAK0S,cACdnK,OAAQ,IAAMvI,KAAK6yB,aAAe7yB,KAAK2xB,YAAYG,UAAUO,mBAAmB9e,UAAUqB,SAAS,QACnGme,eAAe,IAGjB/yB,KAAKkC,SAAU,OAAe,CAAC2R,QAAS7T,KAAK6T,QAAShC,eAAgB7R,KAAK6R,iBAC3E7R,KAAKkC,QAAQqR,UAAUxS,IAAI,qBAAsB,eACjDsK,SAAS+Q,eAAe,cAAc1Q,OAAO1L,KAAKkC,QACpD,EA8Ca,MAAMgxB,GAqEnBnzB,YAAY8tB,GApEL,KAAAsF,KAAiD,CAAC,EAUjD,KAAAC,WAAa,EAEb,KAAA/U,cAAgB,IAAI,IACrB,KAAAgV,YAAa,SAEb,KAAAC,eAAwF,CAAC,EACzF,KAAAC,gBAAgE,CAAC,EAGjE,KAAAC,UAA0BpS,QAAQjT,UAEjC,KAAAslB,UAA0D,CAAC,EAC3D,KAAAC,aAAoE,CAAC,EACrE,KAAAC,OAAwD,CAAC,EACzD,KAAAC,aAAc,EACd,KAAAC,WAAY,EAEZ,KAAA3V,KAAM,EAAAC,EAAA,IAAO,gBAGb,KAAA2V,gBAOH,CAAC,EAIC,KAAAC,aAA+D,IAAIxyB,IAUnE,KAAAyyB,YAAc,EACd,KAAAC,cAAgB,EAChB,KAAAC,eAAiB,EAEjB,KAAAC,YAAc,EAiSb,KAAAC,kBAAoB,KAC1Bp0B,KAAKoL,UAAUmI,UAAUxS,IAAI,UAAU,EAGjC,KAAAszB,gBAAkB,KACxBr0B,KAAKoL,UAAUmI,UAAU/Q,OAAO,UAAU,GAxR1C,EAAA8xB,EAAA,GAAWt0B,KAAM6tB,GAEjB7tB,KAAKoL,UAAYC,SAASC,cAAc,OACxCtL,KAAKoL,UAAUmI,UAAUxS,IAAI,gBAE7Bf,KAAK6R,eAAiB,IAAI,KAC1B7R,KAAKu0B,kBAAoB,IAAI9C,GAAkBzxB,KAAKoL,UAAWpL,KAAMA,KAAK6R,gBAC1E7R,KAAK8xB,UAAY,IAAI,IAAgB9xB,KAAMA,KAAKiH,SAAUjH,KAAK6R,gBAE/D,MAAM2iB,EAAyBx0B,KAAKw0B,uBAAyBnpB,SAASC,cAAc,OACpFkpB,EAAuBjhB,UAAUxS,IAAI,+BAAgC,6BAA8B,UAEnG,MAAM0zB,EAAgBz0B,KAAKy0B,cAAgB,IAAI,KAAYD,GAC3DC,EAAcrpB,UAAUmI,UAAUxS,IAAI,+BAEtC,MAAM2zB,EAAM10B,KAAK00B,IAAMrpB,SAASC,cAAc,OAC9CopB,EAAInhB,UAAUxS,IAAI,oBAAqB,uBACvCf,KAAK20B,SAAWD,EAEhBD,EAAcrpB,UAAUM,OAAOgpB,GAE/B,IAAI,MAAME,KAAY50B,KAAK60B,UAAW,CACpC,MAAMC,EAAUzpB,SAASC,cAAc,OACvCwpB,EAAQvhB,UAAUxS,IAAI,4BACtB,MAAMg0B,EAAO1pB,SAASC,cAAc,QAC9B8Y,EAAI/Y,SAASC,cAAc,KAEjCypB,EAAKrpB,QAAO,QAAKkpB,EAAS1c,OAC1B6c,EAAKrpB,OAAO0Y,GAEZ0Q,EAAQppB,OAAOqpB,IAEf,EAAAC,EAAA,GAAOF,GAEP90B,KAAK20B,SAASjpB,OAAOopB,GAErB90B,KAAK+zB,aAAanwB,IAAIgxB,EAAShzB,KAAMgzB,GAErCA,EAASE,QAAUA,C,CAMrB,IAAIG,EAHJj1B,KAAKk1B,cAAgB7pB,SAASC,cAAc,OAC5CtL,KAAKk1B,cAAc3hB,UAAUxS,IAAI,8BAA+B,kBAG7D,MACDf,KAAKm1B,cAAe,EAAAC,EAAA,GAAe,CACjClzB,QAASlC,KAAKk1B,cACdtV,QAAS,CAACC,EAAOC,EAAO/X,KACtB8X,IAAU,EAEV,MAAMwV,EAASr1B,KAAKs1B,UAAUD,SACxBE,EAAWrc,MAAMC,KAAKnZ,KAAK20B,SAASY,UAC1C,IAAIxsB,EACJ,GAAG8W,EAAQ,GACT,IAAI,IAAIuE,EAAIiR,EAAS,EAAGjR,EAAImR,EAAS1yB,SAAUuhB,EAC7C,IAAImR,EAASnR,GAAG7Q,UAAUqB,SAAS,QAAS,CAC1C7L,EAAMqb,EACN,K,OAIJ,IAAI,IAAIA,EAAIiR,EAAS,EAAGjR,GAAK,IAAKA,EAChC,IAAImR,EAASnR,GAAG7Q,UAAUqB,SAAS,QAAS,CAC1C7L,EAAMqb,EACN,K,MAKKngB,IAAR8E,IACDksB,EClZG,SAAyB7pB,GACtC,MAAMoqB,EAAeztB,KACnB,EAAAqS,EAAA,GAAYrS,EAAE,EAGhB,IAAI0tB,EAAU,EACd,MAAMrlB,EAAK,OACHqlB,GACJrqB,EAAUsG,oBAAoB,YAAa8jB,EAAa,CAACxgB,SAAS,G,EAOtE,OAHA5J,EAAUwC,iBAAiB,YAAa4nB,EAAa,CAACxgB,SAAS,EAAMiN,SAAS,IAC9E7W,EAAUwC,iBAAiB,WAAYwC,EAAI,CAACnC,MAAM,IAE3CmC,CACT,CDkY2BslB,CAAgB11B,KAAKk1B,eACpCl1B,KAAKs1B,UAAUvsB,G,EAGnBkX,kBAAoBlY,KACV,EAAAwV,EAAA,GAAgBxV,EAAE1H,OAAQ,mBAKxC,IAAI,MAAMu0B,KAAY50B,KAAK60B,UAAW,CACpC,MAAMzpB,EAAYC,SAASC,cAAc,OACzCF,EAAUmI,UAAUxS,IAAI,0BAA4B6zB,EAAShzB,KAAM,YAEnE,MAAM+Q,EAAUtH,SAASC,cAAc,OACvCqH,EAAQY,UAAUxS,IAAI,wBAA0B6zB,EAAShzB,MAEzDwJ,EAAUM,OAAOiH,GAEjB3S,KAAKk1B,cAAcxpB,OAAON,GAE1BpL,KAAKmzB,KAAKyB,EAASxiB,aAAeO,EAElCiiB,EAASe,WAAahjB,C,CAGxB3S,KAAKoL,UAAUM,OAAO8oB,EAAwBx0B,KAAKk1B,eAInDl1B,KAAK41B,iBAAmB,IAAI,KAAY,EAAO,YAAY,GAE3D51B,KAAKswB,WAAWK,iBAAmB,KAC9B3wB,KAAK40B,SAASe,YAAc31B,KAAK61B,gBAAgB71B,KAAK40B,WAEvD50B,KAAK4C,MAAK,E,EAKd5C,KAAKs1B,WAAY,EAAAQ,EAAA,GAAe91B,KAAK20B,SAAU30B,KAAKk1B,eAAe,CAACttB,EAAImuB,EAAYC,KAClF,GAAGh2B,KAAKozB,YAAcxrB,IAAO5H,KAAKi2B,WAMhC,YALAj2B,KAAKswB,WAAW4F,kBAAkB,CAChCh0B,QAASlC,KAAKoL,UACd+qB,SAAU,QACVC,cAAep2B,KAAKq2B,sBAKxB,MAAMC,EAAct2B,KAAK60B,UAAUjtB,GAChC5H,KAAKu2B,aACNv2B,KAAKu2B,YAAYD,GAGnB,MAAME,EAAex2B,KAAK40B,SAO1B,GANA50B,KAAK40B,SAAW0B,GAEO,IAApBt2B,KAAKozB,WAAoB4C,GAC1Bh2B,KAAKo0B,oBAGJp0B,KAAKi2B,WACNj2B,KAAKi2B,YAAa,MACb,CACL,MAAMQ,EAAYz2B,KAAKoL,UAAUqrB,UACjC,IAAIC,EAAY12B,KAAKswB,WAAWoG,UAYhC,GAXGA,EAAYD,IACbz2B,KAAKswB,WAAW4F,kBAAkB,CAChCh0B,QAASlC,KAAKoL,UACd+qB,SAAU,QACVC,cAAep2B,KAAKq2B,sBAEtBK,EAAYD,GAGdD,EAAaG,OAAS,CAACD,UAAWA,EAAWE,aAAc52B,KAAKswB,WAAWsG,mBAEjD3yB,IAAvBqyB,EAAYK,OAAsB,CACnC,MAAMpU,EAAOviB,KAAKoL,UAAUoX,wBACtBqU,EAAQ72B,KAAKoL,UAAU6N,cAAcuJ,wBACrCyF,EAAO1F,EAAK4E,EAAI0P,EAAM1P,EAEzBuP,EAAYzO,IACbqO,EAAYK,OAAS,CAACD,UAAWzO,EAAM2O,aAAc,G,CAIzD,GAAGN,EAAYK,OAAQ,CACrB,MAAM1O,EAAOuO,EAAaG,OAAOD,UAAYJ,EAAYK,OAAOD,UAI7DzO,IAKDqO,EAAYX,WAAWpqB,MAAMsR,UAAY,cAAcoL,O,GAatC,IAApBjoB,KAAKozB,WAAqBkD,EAAYX,WAAWjG,mBAElD1vB,KAAK4C,MAAK,GAGZ5C,KAAKozB,UAAYxrB,CAAE,IAClB,KACD5H,KAAKswB,WAAWwG,gBAGY7yB,IAAzBjE,KAAK40B,SAAS+B,SACf32B,KAAK40B,SAASe,WAAWpqB,MAAMsR,UAAY,GAC3C7c,KAAKswB,WAAWoG,UAAY12B,KAAK40B,SAAS+B,OAAOD,WAGhDzB,IACDA,IACAA,OAAehxB,GAGjBjE,KAAKq0B,iBAAiB,QACrBpwB,EAAWwwB,EAAez0B,KAAK6R,iBAElC,QAAiB7R,KAAKk1B,eAAgBntB,IACjC/H,KAAK8xB,UAAUC,eAChB,EAAA3X,EAAA,GAAYrS,GACZ/H,KAAK8xB,UAAUI,iBAAgB,EAAA3U,EAAA,GAAgBxV,EAAE1H,OAAQ,sB,GAE1D,CAAC2U,SAAS,EAAMiN,SAAS,EAAOpQ,eAAgB7R,KAAK6R,iBAExD,MAAMklB,EAAe,CAAM1b,EAAmB2b,EAAyB5kB,EAAoCrK,IAAkB,GAAD,gCAC1H,MAAM1H,GAAS,EAAAkd,EAAA,GAAgBxV,EAAE1H,OAA0Bgb,GAC3D,IAAIhb,EAAQ,OAEZ,MAAM4H,GAAO5H,EAAOgmB,QAAQpe,IAC5B,IAAIA,EAEF,YADAjI,KAAKke,IAAI7R,KAAK,mCAAoChM,GAIpD,MAAM42B,EAA4B52B,EAAOuX,cAAc,4BACvD,GAAGqf,EAKD,YAJA,SAAoB,CAClBC,MAAOnvB,EACPkvB,iBAKJ,MAAMjvB,EAAS3H,EAAOgmB,QAAQre,OAAO4qB,WAE/BuE,EAAWje,MAAMC,KAAKnZ,KAAKmzB,KAAK/gB,GAAaqG,iBAAiB,IAAMue,IAAoClc,KAAKla,IACjH,MAAMw2B,GAAc,EAAA7Z,EAAA,GAAgB3c,EAAIya,GACxC,MAAO,CACLnZ,QAAStB,EACTqH,KAAMmvB,EAAY/Q,QAAQpe,IAC1BD,OAAQovB,EAAY/Q,QAAQre,OAAO4qB,WACpC,IAIG7pB,EAAMouB,EAAQnuB,WAAWhG,GAASA,EAAKiF,MAAQA,GAAOjF,EAAKgF,SAAWA,IAEtEG,QAAgBnI,KAAKiH,SAAS8G,mBAAmByE,iBAAiBxK,EAAQC,IAChF,IAAI,KACHsI,iBAAiBvQ,KAAKq3B,kBAAkBjlB,IACxCG,UAAUpK,EAASgvB,EAAQpuB,GAAK7G,QAAS,GAAG,EAAOi1B,EAAQG,MAAM,EAAGvuB,GAAMouB,EAAQG,MAAMvuB,EAAM,GACjG,KAEA,QAAiB/I,KAAKmzB,KAAKoE,8BAA+BR,EAAazc,KAAK,KAAM,YAAa,YAAa,iCAAkC,CAACzI,eAAgB7R,KAAK6R,kBACpK,QAAiB7R,KAAKmzB,KAAKqE,4BAA6BT,EAAazc,KAAK,KAAM,sBAAuB,kBAAmB,+BAAgC,CAACzI,eAAgB7R,KAAK6R,iBAchL7R,KAAK40B,SAAW50B,KAAK60B,UAAU,IAE/B,EAAA4C,EAAA,KAAuB,KACrBz3B,KAAKqe,cAAclZ,MAAM,IACxB,KACDnF,KAAKqe,cAAcqZ,kBAAkB,GACpC13B,KAAK6R,eACV,CAUO8lB,qBAAqBpH,EAAiB3uB,GAC3C,OAAO,EAAAg2B,EAAA,GAA4Bh2B,EAAM2uB,EAAUA,EAAS1tB,OAC9D,CAEQg1B,oBAAmB,QAAC1vB,EAAO,YAAEmpB,IACnC,MAAMoC,EAA+B,GAC/BoE,EAAgBC,EAAA,qBAA+B,CACnD/vB,OAAQG,EAAQH,OAChBoD,UAAWkmB,EAAY9B,KACvB+B,WAAY,SACZmC,iBAGIsE,EAAwBD,EAAA,wBAAkC,CAC9DhP,OAAQ,CACNnZ,EAAG,SACH5H,OAAQG,EAAQH,QAElBiwB,YAAa9vB,EACb2vB,gBACAI,cAAel4B,KAAKoK,cAAcgmB,QAIpC,OADAsD,EAAarxB,KAAK21B,GACX5W,QAAQgI,IAAIsK,GAAcplB,KAAK6pB,GAAA,EACxC,CAEcC,yBAAwB,QAACjwB,EAAO,SAAEkwB,EAAQ,WAAEhF,I,0CACxD,MAAM3tB,GAAQ,EAAA4yB,EAAA,GAAoBnwB,GAE5B2iB,EAAMzf,SAASC,cAAc,OAInC,IAAIitB,EAHJzN,EAAIvX,UAAUxS,IAAI,aAIlB,MAAM8G,GAAO,EAAA2wB,EAAA,GAAgB9yB,EAAO,IAAK,KA8BzC,GA5BE6yB,EADa,UAAZ7yB,EAAMkK,cACgB,QAAU,CAC/BjO,IAAK+D,EACLyC,UACAiD,UAAW0f,EACX2N,SAAU,EACVC,UAAW,EACXra,cAAere,KAAKqe,cACpBgV,aACAsF,aAAa,EACbC,kBAAkB,EAClBC,cAAc,EACdtO,UAAW1iB,KACTwH,YAEY,QAAU,CACxBypB,MAAOpzB,EACPyC,UACAiD,UAAW0f,EACX2N,SAAU,EACVC,UAAW,EACXra,cAAere,KAAKqe,cACpBgV,aACAuF,kBAAkB,EAClBG,QAAQ,EACRlxB,SAIAM,EAAQzC,MAAyC+H,OAAOiH,QAAS,CACnE,MAAMuiB,QAAqB,SAAiB,CAC1C+B,eAAgB,OAChBtzB,QACA2tB,aACA/P,MAAO,IACPI,OAAQ,IACRuV,SAAU,KAGZnO,EAAIpf,OAAOurB,E,CAYb,MATA,CACEsB,EAAQW,OAAO7pB,MACfkpB,EAAQW,OAAOC,MACfC,OAAOC,SAASt0B,SAASkhB,IACzBA,EAAM1S,UAAUxS,IAAI,kBAAkB,IAGxCs3B,EAASh2B,KAAKk2B,EAAQ7E,aAAarkB,OAE5B,CAACnN,QAAS4oB,EAAK3iB,UACxB,G,CAEcmxB,uBAAsB,QAACnxB,EAAO,YAAEiK,I,0CAC5C,MAAM/G,GAAW,EAAAitB,EAAA,GAAoBnwB,GAC/BgsB,EAAan0B,KAAKm0B,YAAe,CAAC,QAAS,SAAkCpf,SAAS1J,EAASzJ,MAE/FkpB,QAAY,QAAa,CAC7B3iB,UACAoxB,UAAWpF,EACXqF,WAAY,IACZC,cAAc,EACdtF,aACA/pB,cAAepK,KAAKq3B,kBAAkBjlB,GACtCiM,cAAere,KAAKqe,cACpBqb,iBAAkB,EAClBC,QAAS,IAAM,MAOjB,MAJI,CAAC,QAAS,QAAS,SAAkC5kB,SAAS1J,EAASzJ,OACzEkpB,EAAIvX,UAAUxS,IAAI,YAGb,CAACoH,UAASjG,QAAS4oB,EAC5B,G,CAEc8O,kBAAiB,QAACzxB,EAAO,SAAEkwB,EAAQ,WAAEhF,I,gDACjD,IAAIwG,EAA6D,QAAlD,EAAA1xB,EAAQzC,aAA0C,eAAEo0B,QAEnE,IAAID,EAAS,CACX,MAAME,EAAS5xB,EAAQmN,cAAgBnN,EAAQmN,cAAc5U,MAAMqH,GAAmB,qBAARA,EAAE6H,GAAoC,yBAAR7H,EAAE6H,IAAgC,KAC9I,IAAIlI,EAAasyB,EAAqBC,EAEtC,GAAIF,EAQFE,EAAS9xB,EAAQA,QAAQmvB,MAAMyC,EAAOG,OAAQH,EAAOG,OAASH,EAAOl3B,YAR3D,CACV,MAAM0C,GAAQ,EAAA40B,EAAA,GAAShyB,EAAQA,SAC/B,IAAI5C,EACF,OAGFmC,EAAMnC,EAAM,E,CAMZmC,EADe,0BAAdqyB,aAAM,EAANA,EAAQnqB,GACHmqB,EAAOryB,IAGPA,GAAOuyB,EAGfD,EAActyB,EAEd,MAAM0yB,EAAOjyB,EAAQA,UAAYT,EAC7BA,EAAInC,MAAM,4BACZy0B,EAAc,WAAatyB,EAC3BA,EAAMA,EAAIqN,SAAS,KAAOrN,EAAM,WAAaA,GAG/CsyB,EAAc,IAAIK,IAAIL,GAAaM,SAEnCT,EAAU,CACRjqB,EAAG,UACHlI,MACAsyB,cACApyB,GAAI,GACJglB,KAAM,GAGJwN,IACFP,EAAQU,YAAcpyB,EAAQA,Q,CAIlC,GAAiB,iBAAd0xB,EAAQjqB,EACT,OAGF,MAAM4qB,EAAanvB,SAASC,cAAc,OAC1CkvB,EAAWjnB,UAAUxS,IAAI,WAItB84B,EAAQf,OACG,QAAU,CACpB1tB,UAAWovB,EACXryB,QAAS,KACT2wB,MAAOe,EAAQf,MACfL,SAAU,EACVC,UAAW,EACXE,kBAAkB,EAClBva,cAAere,KAAKqe,cACpBgV,aACAxrB,MAAM,EAAA2wB,EAAA,GAAgBqB,EAAQf,MAAsB,GAAI,IAAI,GAC5DpF,aAAc2E,EACdU,QAAQ,KAGVyB,EAAWjnB,UAAUxS,IAAI,UACzB,EAAA05B,EAAA,GAAaD,GAAY,EAAAE,EAAA,GAAiBb,EAAQ9qB,OAAS8qB,EAAQG,aAAeH,EAAQU,aAAeV,EAAQnyB,KAAK,KAGxH,MAAMqH,GAAQ,OAAiB8qB,GAEzBc,GAAmB,OAAuBd,GAE1CplB,GADY,EAAAmmB,EAAA,IAAuB,EAAAC,EAAA,IAAahB,EAAQnyB,KAAO,KACjD6N,kBACpB,GAAGd,aAAaE,kBACd,IACEF,EAAEqmB,UAAYC,mBAAmBtmB,EAAEumB,K,CACnC,MAAMx1B,G,CAKPm1B,EAAiBM,YAClBN,EAAiBjvB,OAAO,MAG1BivB,EAAiBjvB,OAAO+I,GAErBzU,KAAKm0B,YACNwG,EAAiBjvB,OAAO,WAAY,OAAiBvD,IAGnD4G,EAAM6J,aAER7J,EAAMrD,QAAO,EAAAwvB,EAAA,GAAcrB,EAAQG,YAAY7V,MAAM,IAAK,GAAG,KAG/D,MAAMgX,EAAM,IAAI,KAAI,CAClBpsB,QACAqsB,YAAY,OAAajzB,GACzBkzB,SAAUV,EACVW,aAAa,EACblM,WAAW,EACXpQ,UAAU,IAKZ,OAFAmc,EAAII,kBAAkBf,EAAY,OAE/BW,EAAI/vB,UAAU0vB,UAAUlK,OAAO/tB,OACzB,CAACsF,UAASjG,QAASi5B,EAAI/vB,gBADhC,C,IAKWowB,oBAAoBjL,EAAiBqE,EAA+BlpB,GAAS,G,0CACxF,MAAM+vB,EAAwD,GACxDC,EAA8B9G,EAASe,WACvC0C,EAA2B,GAC3BhF,EAAarzB,KAAKqzB,WAAWpwB,MACnC,IAIIquB,EAJAlf,EAAcwiB,EAASxiB,kBAErB,UAGa,kCAAhBA,GAAqDpS,KAAKoK,cAAcgmB,MAAMQ,QAC/Exe,EAAc,2BACdkf,EAActxB,KAAK41B,iBACnB8F,EAAehwB,OAAO4lB,EAAYlmB,YACV,6BAAhBgH,IACRkf,EAActxB,KAAK6vB,aAAaU,UAGlC,MAAM1C,EAAoC,CACxC4N,gBACArpB,cACAjK,aAASlE,EACTovB,aACAgF,WACA/G,eAGF,IAAIqK,EAGJ,OAAOvpB,GACL,IAAK,2BACHupB,EAAkB37B,KAAK63B,mBACvB,MAGF,IAAK,gCACH8D,EAAkB37B,KAAKo4B,wBACvB,MAGF,IAAK,2BACL,IAAK,gCACL,IAAK,2BACL,IAAK,8BACHuD,EAAkB37B,KAAKs5B,sBACvB,MAGF,IAAK,yBACHqC,EAAkB37B,KAAK45B,iBAS3B,GAAG+B,EAAiB,CAClBA,EAAkBA,EAAgBrhB,KAAKta,MAGvC,MAAM47B,EAA8BrL,EAASzV,KAAU3S,GAAY,GAAD,gCAChE,IAEE,OADA0lB,EAAQ1lB,QAAUA,QACLwzB,EAAgB9N,E,CAC7B,MAAMroB,GACNxF,KAAKke,IAAImO,MAAM,yBAA0Bja,EAAayb,EAAS1lB,EAAS3C,E,CAE5E,MAEMq2B,SAAiBza,QAAQgI,IAAIwS,IAAUxC,OAAOC,SACpDoC,EAAcp5B,QAAQw5B,E,CAWxB,GARGvK,GAAeA,EAAY9B,KAAKE,mBACjC4B,EAAY7B,YAGXzvB,KAAKwzB,WACN6E,EAASh2B,KAAKrC,KAAKwzB,YAGlB6E,EAASx1B,eACJue,QAAQgI,IAAIiP,GACdhF,KAFN,CAQA,GAAGoI,EAAc54B,OAAQ,CACvB,MAAMi5B,EAASpwB,EAAS,SAAW,UACnC+vB,EAAc12B,SAASsB,I,MACrB,MAAM,QAACnE,EAAO,QAAEiG,GAAW9B,EAKrB01B,EAAiB/7B,KAAKg8B,6BAA6Bh8B,KAAKi0B,aAAe9rB,EAAQqO,KAAO,EAAGpE,GAC/FlQ,EAAQqR,UAAUxS,IAAI,qBACtBmB,EAAQmkB,QAAQpe,IAAM,GAAKE,EAAQF,IACnC/F,EAAQmkB,QAAQre,OAAS,GAAKG,EAAQH,OACtC+zB,EAAepN,MAAMmN,GAAQ55B,IAEZ,QAAd,EAAAlC,KAAK8xB,iBAAS,eAAEC,cACjB/xB,KAAK8xB,UAAUmK,sBAAsB/5B,GAAS,E,IAMpDlC,KAAKk8B,gBAAgC,6BAAhB9pB,EAA6C,EAAIqpB,EAAc54B,OAAQ64B,E,CAE9F,G,CAEQQ,gBAAgBr5B,EAAgB8yB,GACtC,GAAGA,EAAY,CACb,MAAMwG,EAASxG,EAAW1c,cAO1B,GANAC,MAAMC,KAAKgjB,EAAO5G,UAAU+B,MAAM,GAAGvyB,SAASq3B,IAC5CA,EAAM55B,QAAQ,KAKZK,IAAW8yB,EAAWjG,kBAAmB,CAC3C,MAAM5E,EAAMzf,SAASC,cAAc,OACnCwf,EAAIgQ,UAAY,kCAChBhQ,EAAIvX,UAAUxS,IAAI,kBAAmB,cAAe,gBAAiB,aAErEo7B,EAAOzwB,OAAOof,E,EAGpB,CAEQuR,YACN,MAAMC,EAA+B,IAAIl7B,IACnCiyB,EAAarzB,KAAKqzB,WAAWpwB,MAEnC,IAAI,MAAMmhB,KAAKpkB,KAAK6vB,aAAc,CAChC,MAAMvvB,EAAQN,KAAK6vB,aAAazL,GAChCpkB,KAAKmzB,KAAKoJ,yBAAyB7wB,OAAOpL,EAAM8K,WAChD9K,EAAMkhB,O,CAGR,MAAM4O,EAAQpwB,KAAKoK,cAAcgmB,MACjC,GAAGA,EAAO,CACR,MAAMoM,EAAa,CAACZ,EAAmBt7B,EAAoBm8B,GAAmB,KAC5Eb,EAAQ9gB,KAAK9S,IACX,GAAGs0B,EAAgBj5B,IAAI2E,GACrB,OAGFs0B,EAAgBv7B,IAAIiH,GAEpB,MAAM,IAAC00B,GAAO3E,EAAA,qBAA+B,CAC3C/vB,OAAQA,EACRoD,UAAW9K,EAAMkvB,KACjB+B,WAAY,aACZlC,WAAY/uB,EAAM+uB,aAGpB,MAAO,CAACqN,MAAK10B,SAAO,IACnBoxB,OAAOC,SAASt0B,SAAQ,EAAO23B,MAAK10B,YAAY,GAAD,gCAChD,MAAM20B,QAAa38B,KAAKiH,SAASqI,gBAAgBstB,QAAQ50B,GACzD,GAAGy0B,IAAsBE,EAAsBE,oBAAuBF,EAAaG,cAAe,CAChG,MAAMC,EAAS,IAAIC,OAAO,KAAI,EAAAC,EAAA,GAAa7M,OAAU,EAAA6M,EAAA,IAAa,EAAAC,EAAA,IAAgB9M,OAAY,MAC9FsM,EAAIS,UAAU3d,UAAYkd,EAAIS,UAAU3d,UAAUmH,QAAQoW,EAAQ,aAClEL,EAAIU,gBAAgB1xB,aAAa,EAAA2xB,EAAA,GAAqBr1B,EAAOs1B,Y,MACxD,GAAGt1B,IAAWiW,EAAA,OACnBye,EAAIU,gBAAgB1xB,QAAO,QAAK,0BAC3B,CACL,IAAI6xB,QAAiBv9B,KAAKiH,SAASqI,gBAAgBkuB,gBAAgBx1B,GACnE,GAAIu1B,EAMFA,EAAW,IAAMA,MANL,CACZ,MAAME,QAAaz9B,KAAKiH,SAASy2B,gBAAgBC,QAAQ31B,GACtDy1B,GAAQA,EAAKG,QACdL,EAAW,KAAM,EAAAM,EAAA,GAAkBJ,EAAKG,OAAOE,U,CAMnDpB,EAAIU,gBAAgBxkB,YAAc2kB,C,CAEtC,MAEAj9B,EAAMuJ,QAAQ,EAGVk0B,EAAaC,IACjB,GAAI3K,IAMJ,OAAO2K,CAAG,EAGZ,OAAO5c,QAAQgI,IAAI,CACjBppB,KAAKiH,SAASy2B,gBAAgBO,mBAAmB7N,GAAO,OAAMnsB,EAAW,IACxEqK,KAAKyvB,GACLzvB,MAAM4vB,IACFA,GACD1B,EAAW0B,EAAUl+B,KAAK6vB,aAAaqO,UAAU,E,IAIrDl+B,KAAKiH,SAASy2B,gBAAgBS,eAAe/N,EAAO,IACnD9hB,KAAKyvB,GACLzvB,MAAM4vB,IACL,GAAGA,IACD1B,EAAW0B,EAASE,WAAYp+B,KAAK6vB,aAAaqO,UAAU,GAC5D1B,EAAW0B,EAAStC,QAA4E57B,KAAK6vB,aAAawO,gBAElHr+B,KAAK6vB,aAAawO,eAAejzB,UAAUmI,UAAUxS,IAAI,YAEtDf,KAAK6vB,aAAawO,eAAexf,OAAO+H,mBAAqB5mB,KAAK6vB,aAAawO,eAAexf,OAAOtJ,mBACtGvV,KAAK6vB,aAAawO,eAAexf,OAAO+H,iBAAiBpkB,SAGxDxC,KAAK6vB,aAAawO,eAAe7O,KAAKE,kBAAoB,GAAG,CAC9D,MAAM4O,EAAWjzB,SAASC,cAAc,OACxCgzB,EAAS/qB,UAAUxS,IAAI,2BACvB,MAAMw9B,EAAc,IAAI,iBAAiB,CACvC/xB,IAAK,uBAEP8xB,EAAS5yB,OAAO6yB,EAAYr8B,SAC5BlC,KAAK6vB,aAAawO,eAAexf,OAAOnT,OAAO4yB,IAC/C,QAAiBA,GAAU,KACzB,MAAME,EAAUx+B,KAAK6vB,aAAawO,eAAejzB,UAAUmI,UAAU1J,OAAO,YAC5E00B,EAAY/xB,IAAMgyB,EAAU,qBAAuB,qBACnDD,EAAYE,QAAQ,G,KAM5Bz+B,KAAKiH,SAASy3B,eAAeC,WAAW,CAACvO,QAAOwO,YAAa,EAAG1N,MAAO,GAAI2N,SAAU,IACpFvwB,KAAKyvB,GACLzvB,MAAM5B,IACFA,GACD8vB,EAAW9vB,EAAMoyB,QAAQhkB,KAAKkM,GAAMA,EAAEhf,SAAShI,KAAK6vB,aAAaqO,UAAU,E,MAI5E,GAAIl+B,KAAKoK,cAAcpC,QAAWhI,KAAKoK,cAAc20B,QA2DrD,OAAO3d,QAAQjT,UA3D+C,CACnE,MAAM6wB,EAAqB,CAACvP,GAAY,IAC/B,gBAA2BnhB,MAAMwe,IAClCuG,MAIJrzB,KAAK6vB,aAAaoP,OAAOzP,KAAK0P,kBAE9BpS,EAAMqS,aAAa7H,MAAM,EAAG,IAAIvyB,SAAciD,GAAW,GAAD,gCACtD,MAAM,IAAC00B,GAAO3E,EAAA,qBAA+B,CAC3C/vB,OAAQA,EACRoD,UAAWpL,KAAK6vB,aAAaoP,OAAOzP,KACpCgC,WAAW,EACXD,WAAY,aACZlC,YAAY,IAGdqN,EAAIU,gBAAgB1xB,aAAc1D,EAAOo3B,UACvC,EAAAC,GAAA,SAA0Br/B,KAAKiH,SAASy2B,gBAAgBC,QAAQ31B,EAAOs3B,cACvE,EAAAjC,EAAA,GAAqBr1B,EAAOs1B,YAChC,MAEIxQ,EAAMqS,aAAat8B,OAEb4sB,GACRzvB,KAAK6vB,aAAaoP,OAAOxP,YAFzBzvB,KAAK6vB,aAAaoP,OAAOzd,Q,IAO/B,OAAOJ,QAAQgI,IAAI,CACjBppB,KAAKiH,SAASy2B,gBAAgB6B,YAAY,kBAAkBjxB,MAAMkxB,IAChE,IAAInM,IAAc,OAElB,MAAMtqB,EAAMy2B,EAAMx2B,WAAW2zB,GAASA,EAAK/0B,KAAOqW,EAAA,UACtC,IAATlV,IACDy2B,EAAQA,EAAMlI,SACRhJ,OAAOvlB,EAAK,GAGpBy2B,EAAMz6B,SAAS43B,IACb,MAAM,IAACD,GAAO3E,EAAA,qBAA+B,CAC3C/vB,OAAQ20B,EAAK/0B,GACbwD,UAAWpL,KAAK6vB,aAAa4P,OAAOjQ,KACpC/f,eAAe,EACf8hB,WAAY,SACZlC,YAAY,EACZE,QAASvvB,KAAK6vB,aAAa4P,OAAOlQ,UAGpCmN,EAAIgD,WAAWl9B,QAAQ,IAGzBxC,KAAK6vB,aAAa4P,OAAO51B,QAAQ,IAGnCm1B,K,CAGN,CAEcW,YAAY/K,G,0CACxB,MAAMhtB,EAAK5H,KAAKoK,cAAcpC,OAAOs1B,WAC/BjK,EAAarzB,KAAKqzB,WAAWpwB,MACnC,IAAIsL,EAEJ,MAAMqxB,EAA2B9C,GAA2D,GAAD,gCACzF,GAAG98B,KAAKwzB,kBACAxzB,KAAKwzB,WAEPH,KACF,OAIJ,IAAIwM,EAAc7/B,KAAK6/B,YACnBA,IACFA,EAAc,IAAI,IAAe,CAC/BxhB,cAAere,KAAKqe,cACpByhB,eAAe,EACf74B,SAAUjH,KAAKiH,YAEjB,QAAiB44B,EAAYrQ,MAAOznB,IAClC,MAAMg4B,GAAK,EAAAC,EAAA,GAAUj4B,EAAE1H,OAAQ,EAAA4/B,yBAC/B,IAAIF,EACF,OAGF,MAAM/3B,EAAS+3B,EAAG1Z,QAAQre,OAAO4qB,WACjC,IAAIrkB,EAAwB6S,QAAQjT,UACjCgc,EAAA,aACD5b,EAAU,oBAA8B,IAG1CA,EAAQD,MAAK,KACXujB,EAAA,gBAA0B,CAAC7pB,UAAQ,GACnC,IAEJ4sB,EAASe,WAAWjqB,OAAOm0B,EAAYrQ,MACvCxvB,KAAKk8B,gBAAgB,EAAGtH,EAASe,aAGnC,IAAI,MAAMuK,KAAepD,EAAc,CACrC,MAAM90B,GAAS,EAAAm4B,GAAA,GAAqBD,GACpC,GAAGl4B,EAAOo4B,YACR,SAGF,MAAM3C,QAAaz9B,KAAKiH,SAASy2B,gBAAgBC,QAAQ31B,GACzD,IAAIqrB,IACF,OAGCoK,EAAKhwB,OAAO4yB,SAIfR,EAAY9+B,IAAIiH,E,CAEpB,IAEA,SAAShI,KAAKiH,SAASq5B,gBAAgBC,UAAU34B,GAAK,CACpD,MAAM44B,EAAcxgC,KAAK6/B,YAAmB,IAAL,GACvCtxB,EAAUvO,KAAKiH,SAASw5B,kBAAkBC,uBAAuB94B,OAAI3D,EAAWu8B,EAAYxgC,KAAKyzB,UAAUmB,EAASxiB,cAAc9D,MAAMwuB,IACtI,IAAIzJ,IACF,OAGF,MAAM7D,EAAOoF,EAASe,WAAWpgB,kBAOjC,OANAvV,KAAKyzB,UAAUmB,EAASxiB,cAAgBod,EAAOA,EAAKE,kBAAoB,GAAKoN,EAAaA,aAAaj6B,OAEpGi6B,EAAaA,aAAaj6B,OAAS29B,IACpCxgC,KAAK2zB,OAAOiB,EAASxiB,cAAe,GAG/BwtB,EAAmB9C,EAAaA,aAAa,G,MAGtDvuB,EAAUvO,KAAKiH,SAASw5B,kBAAkBE,YAAY/4B,GAAI0G,MAAMsyB,IAC9D,IAAIvN,IACF,OAIFrzB,KAAK2zB,OAAOiB,EAASxiB,cAAe,EACpC,MAAM0qB,EAAgB8D,EAA+B9D,aACrD,MAAsB,8BAAnBA,EAAaltB,EAITgwB,EAAmB9C,EAAaA,mBAJvC,CAIoD,IAIxD,OAAO98B,KAAK0zB,aAAakB,EAASxiB,aAAe7D,EAAQ4J,SAAQ,KAC3Dkb,MAIJrzB,KAAK0zB,aAAakB,EAASxiB,aAAe,KAAI,GAElD,G,CAEQyuB,SAASjM,EAA+BkM,EAAmBlwB,EAAmByiB,G,QACpF,MAAMzxB,EAAOgzB,EAASxiB,YAEtB,GAAGpS,KAAK0zB,aAAa9xB,GACnB,OAAO5B,KAAK0zB,aAAa9xB,GAG3B,GAAqB,YAAlBgzB,EAAShzB,KACV,OAAO5B,KAAK2/B,YAAY/K,GAG1B,MAAM9G,EAAkC,QAA3B,KAAG9tB,KAAKszB,gBAAe1xB,UAAI,UAAJA,GAAU,GAE9C,KAAY,6BAATA,GAAwCksB,EAAQjrB,SAC7C7C,KAAK4zB,cACP5zB,KAAKq8B,YACLr8B,KAAK4zB,aAAc,GAGjB5zB,KAAKoK,cAAcgmB,MAAMQ,QAAW5wB,KAAKoK,cAAcpC,QAAWhI,KAAKoK,cAAc20B,UAEvF,OADA/+B,KAAK2zB,OAAO/xB,IAAQ,EACbwf,QAAQjT,UAInB,MAAMI,EAAUvO,KAAK0zB,aAAa9xB,GAAQwf,QAAQjT,UAAUG,MAAK,IAAW,GAAD,gC,QAEzE,GAAGwf,EAAQjrB,QAAU7C,KAAKuzB,gBAAgB3xB,GAAQksB,EAAQjrB,SAAWi+B,EAAU,CAC7E,MAAMvQ,EAAkB,GACxB,IAAIwQ,EAAOv6B,KAAKC,IAAI,EAAGzG,KAAKuzB,gBAAgB3xB,IACxCo/B,EAAe,EAEnB,EAAG,CACD,MAAMC,EAAMnT,EAAQwJ,MAAMyJ,EAAMA,EAAOnwB,GACvCmwB,GAAQE,EAAIp+B,OACZm+B,GAAgBC,EAAIp+B,OAEpB,MAAMq+B,QAA4B9f,QAAQgI,IAAI6X,EAAInmB,KAAKqmB,GAAMnhC,KAAKiH,SAAS8G,mBAAmByE,iBAAiB2uB,EAAEn5B,OAAQm5B,EAAEl5B,QAE3HsoB,EAASluB,QAAQrC,KAAK23B,qBAAqBuJ,EAAqBt/B,G,OAC1Do/B,EAAepwB,GAAamwB,EAAOjT,EAAQjrB,QAWnD,OAFA7C,KAAKuzB,gBAAgB3xB,GAAQm/B,EAEtB/gC,KAAKw7B,oBAAoBjL,EAAUqE,GAAUzc,SAAQ,KAC1DzV,YAAW,KACT1C,KAAKswB,WAAW8Q,kBAAkB,GACjC,EAAE,G,CAKT,MAAMnQ,EAAQnD,EAAQjrB,OAASirB,EAAQA,EAAQjrB,OAAS,GAAGoF,IAAM,EAE3DyE,QAAc1M,KAAKiH,SAAS8G,mBAAmBszB,UAAU,OAAD,wBACzDrhC,KAAKoK,eAAa,CACrBgI,YAAa,CAACxC,EAAGhO,GACjBqvB,QACAC,MAAOtgB,EACP0wB,SAA6B,QAArB,KAAEthC,KAAKyzB,WAAU7xB,UAAI,UAAJA,GAAU,KAKrC,GAFAksB,EAAQzrB,QAAQqK,EAAMohB,QAAQhT,KAAKqmB,IAAM,CAAEl5B,IAAKk5B,EAAEl5B,IAAKD,OAAQm5B,EAAEn5B,YAE7DqrB,OAMD3mB,EAAMohB,QAAQjrB,OAAS+N,QAA8C3M,IAAhCjE,KAAKoK,cAAc+G,WAA2BzE,EAAM60B,WAAc70B,EAAMohB,QAAQjrB,SAAW6J,EAAM0kB,SAGvIpxB,KAAK2zB,OAAO/xB,IAAQ,GAGtB5B,KAAKyzB,UAAU7xB,GAAQ8K,EAAM60B,WAE1BT,GA4BH,OAxBA9gC,KAAKuzB,gBAAgB3xB,GAAQksB,EAAQjrB,OAEjC7C,KAAK2zB,OAAO/xB,IACd2M,EAAQD,MAAK,KACX5L,YAAW,KACT,GAAI2wB,KAEDrzB,KAAK40B,WAAaA,EAAU,CAC7B,MAAMrmB,EAAUvO,KAAK4C,MAAK,GAAM,GAC7B2L,GACDA,EAAQD,MAAK,KACP+kB,KAEJ3wB,YAAW,KACT1C,KAAKswB,WAAW8Q,kBAAkB,GACjC,EAAE,G,IAIV,EAAE,IAKFphC,KAAKw7B,oBAAoBx7B,KAAK23B,qBAAqBjrB,EAAMohB,QAASlsB,GAAOgzB,EAElF,MAAG3c,OAAOzS,IACRxF,KAAKke,IAAImO,MAAM,cAAe7mB,EAAI,IACjC2S,SAAQ,KACTnY,KAAK0zB,aAAa9xB,GAAQ,IAAI,IAGhC,OAAO2M,CACT,CAEQsnB,gBAAgBjB,GACtB,MAAMxiB,EAAcwiB,EAASxiB,YAC7B,OAAQpS,KAAK2zB,OAAOvhB,IAAiBpS,KAAKszB,eAAelhB,IAAgBpS,KAAKuzB,gBAAgBnhB,GAAepS,KAAKszB,eAAelhB,GAAavP,MAChJ,CAEc2+B,gB,0CACZ,MAAMnO,EAAarzB,KAAKqzB,WAAWpwB,OAC7B,OAAC+E,EAAM,SAAEiL,GAAYjT,KAAKoK,cAChC,IAAIpK,KAAKk0B,cACP,OAGF,MAAMW,EAAY70B,KAAK60B,UAAUuE,QAAQxE,GAAsC,6BAAzBA,EAASxiB,cACzDqvB,EAAU5M,EAAU/Z,KAAK8Z,IAAa,CAAEhlB,EAAGglB,EAASxiB,iBAEnDsvB,EAAUC,SAAwBvgB,QAAQgI,IAAI,CACnDppB,KAAKiH,SAAS8G,mBAAmB6zB,kBAAkB55B,EAAQy5B,OAASx9B,EAAWgP,GAC/EjT,KAAK2hC,mBAGP,IAAItO,IACF,OAGF,GAAGrzB,KAAKwzB,kBACAxzB,KAAKwzB,WAEPH,KACF,OAIJ,IAAIwO,EACAzQ,EAAQ,EACZyD,EAAU9vB,SAAS6vB,IACjB,MAAMkN,EAAUJ,EAAShhC,MAAMqhC,GAAMA,EAAE3I,OAAOxpB,IAAMglB,EAASxiB,cAE7DwiB,EAASE,QAAQvhB,UAAU1J,OAAO,QAASi4B,EAAQ1Q,OACnDwD,EAASE,QAAQvhB,UAAU/Q,OAAO,UAG/Bs/B,EAAQ1Q,aACYntB,IAAlB49B,IACDA,EAAgBjN,KAGhBxD,E,IAIN,MAAM4Q,EAAahiC,KAAK+zB,aAAa9wB,IAAI,WACzC++B,EAAWlN,QAAQvhB,UAAU1J,OAAO,QAAS83B,GAE1CA,IACDE,EAAgBG,IACd5Q,GAGJpxB,KAAKoL,UAAUmI,UAAU1J,OAAO,QAASg4B,GACzC7hC,KAAKoL,UAAU6N,cAAc1F,UAAU1J,OAAO,gBAAiBg4B,GAC5DA,IACD7hC,KAAKi2B,YAAa,EAClBj2B,KAAKs1B,UAAUt1B,KAAK60B,UAAU1a,QAAQ0nB,IAAgB,GAGtD7hC,KAAKw0B,uBAAuBjhB,UAAU1J,OAAO,OAAQunB,GAAS,GAElE,G,CAEaxuB,KAAKqsB,GAAS,EAAO6R,GAAW,G,gDAC3C,MAAM94B,EAAShI,KAAKoK,cAAcpC,OAClChI,KAAKke,IAAI,OAAQ+Q,EAAQjnB,EAAQhI,KAAK0zB,cACtC,MAAML,EAAarzB,KAAKqzB,WAAWpwB,MAEnC,GAAGjD,KAAK6zB,UAAW,CAEjB,SADgC,QAA1B,EAAC7zB,KAAKiiC,4BAAoB,QAAzBjiC,KAAKiiC,qBAAyBjiC,KAAKwhC,iBACtCnO,IACF,OAGFrzB,KAAKiiC,0BAAuBh+B,EAC5BjE,KAAK6zB,WAAY,C,CAGnB,IAAIqO,EAASjT,EAAS,CAACjvB,KAAK40B,UAAY50B,KAAK60B,UAAUuE,QAAQ+I,GAAMA,IAAMniC,KAAK40B,WAShF,GARAsN,EAASA,EAAO9I,QAAQxE,GACf50B,KAAK61B,gBAAgBjB,KAG3B5sB,EAAOo3B,WACR,EAAAgD,EAAA,GAAcF,GAAStN,GAA+B,YAAlBA,EAAShzB,QAG3CsgC,EAAOr/B,OACT,OAGF,MAAM+N,EAAYkwB,EAAW,GAAKt6B,KAAKmD,MAAsC,GAA/BqW,EAAA,SAAoB,IAAM,GAAS,MAE3EqY,EAA2B6J,EAAOpnB,KAAK8Z,GACpC50B,KAAK6gC,SAASjM,EAAUkM,EAAUlwB,EAAWyiB,KAGtD,OAAOjS,QAAQgI,IAAIiP,GAAUpgB,OAAOzS,IAClCxF,KAAKke,IAAImO,MAAM,2BAA4B7mB,EAAI,G,IAI3Cw2B,6BAA6BpT,EAAmBhnB,G,MACtD,MAAM4U,EAAO,IAAIuR,KAAiB,IAAZa,GACtBpS,EAAK6rB,SAAS,EAAG,EAAG,GACpB7rB,EAAK8rB,QAAQ,GACb,MAAMC,EAAgB/rB,EAAKgsB,UACrBC,EAAuC,QAA1B,EAAAziC,KAAK8zB,gBAAgBlyB,UAAK,QAAK5B,KAAK8zB,gBAAgBlyB,GAAQ,CAAC,EAChF,KAAK2gC,KAAiBE,GAAa,CACjC,MAAMr3B,EAAYC,SAASC,cAAc,OACzCF,EAAUiQ,UAAY,qBAEtB,MAAMnD,EAAO7M,SAASC,cAAc,OACpC4M,EAAK3E,UAAUxS,IAAI,2BAEnB,MAAM8sB,EAAsC,CAC1C6U,MAAO,QAGNlsB,EAAKmsB,iBAAkB,IAAI5a,MAAO4a,gBACnC9U,EAAQ+U,KAAO,WAGjB,MAAMC,EAAc,IAAI,qBAAqB,CAC3CrsB,OACAqX,YACC3rB,QACHgW,EAAKxM,OAAOm3B,GAEZz3B,EAAUM,OAAOwM,GAEjB,MAAMyW,EAAQtjB,SAASC,cAAc,OACrCqjB,EAAMpb,UAAUxS,IAAI,4BAEpBqK,EAAUM,OAAOwM,EAAMyW,GAEvB,MAAMmU,GAAiB,EAAAC,EAAA,GAAqBN,EAAY,QACxD,IAAIre,EAAI,EACR,KAAMA,EAAI0e,EAAejgC,UAEpB0/B,EADOO,EAAe1e,MADQA,GAOnCqe,EAAWF,GAAiB,CAACn3B,YAAWujB,UACxC,EAAAqU,EAAA,GAAuB53B,EAAWpL,KAAKmzB,KAAKvxB,GAAOwiB,E,CAGrD,OAAOqe,EAAWF,EACpB,CAEOZ,iBACL,MAAM,OAAC35B,GAAUhI,KAAKoK,cAEtB,IADkBpC,EAAOo4B,YACV,OAAOhf,QAAQjT,SAAQ,GACtC,MAAM80B,EAASj7B,EAAOs1B,WACtB,OAAOlc,QAAQgI,IAAI,CACjBppB,KAAKiH,SAASq5B,gBAAgB4C,YAAYD,GAC1CjjC,KAAKiH,SAASq5B,gBAAgB6C,UAAUF,EAAQ,qBAChDjjC,KAAKiH,SAASq5B,gBAAgB8C,QAAQH,KACrC30B,MAAK,EAAE40B,EAAaC,EAAWC,MACxBF,GAAeC,KAAenjC,KAAKoK,cAAc6I,WAAamwB,IAE1E,CAEO1nB,U,MACL1b,KAAK0zB,aAAe,CAAC,EACrB1zB,KAAK2zB,OAAS,CAAC,EACf3zB,KAAK4zB,aAAc,EACnB5zB,KAAKyzB,UAAY,CAAC,EAClBzzB,KAAK6zB,WAAY,EACjB7zB,KAAKozB,WAAa,EAElBpzB,KAAKqe,cAAcmD,QAEnBxhB,KAAK60B,UAAU9vB,SAAS6vB,IACtB50B,KAAKuzB,gBAAgBqB,EAASxiB,cAAgB,CAAC,KAGhC,QAAd,EAAApS,KAAK8xB,iBAAS,eAAEC,cACjB/xB,KAAK8xB,UAAUM,kBAUjBpyB,KAAKqzB,WAAWvpB,QAChB9J,KAAKiiC,0BAAuBh+B,EAC5BjE,KAAKqjC,uBACLrjC,KAAK6/B,iBAAc57B,CACrB,CAEOo/B,uBACLrjC,KAAK60B,UAAU9vB,SAAS6vB,IACtBA,EAAS+B,YAAS1yB,CAAS,GAE/B,CAEOq/B,YAAYC,GAAU,GAC3BvjC,KAAK60B,UAAU9vB,SAASmO,IAStB,GARAA,EAAIyiB,WAAWuJ,kBAEZl/B,KAAKk0B,gBAENl0B,KAAKoL,UAAUmI,UAAUxS,IAAI,QAC7Bf,KAAKoL,UAAU6N,cAAc1F,UAAUxS,IAAI,iBAG7B,UAAbmS,EAAItR,OAIH5B,KAAKszB,eAAepgB,EAAId,aAAc,CACxC,MAAM+pB,EAASjpB,EAAIyiB,WAAW1c,cAE1BkjB,EAAOvkB,cAAc,gBACvB,EAAA4rB,EAAA,GAAarH,GAAQ,GAIvB,MAAMsH,EAAQtH,EAAOvkB,cAAc,kBAChC6rB,GACDA,EAAMjhC,Q,KAiBZxC,KAAK8zB,gBAAkB,CAAC,EACxB9zB,KAAK41B,iBAAiBpU,QACtBxhB,KAAKswB,WAAWoG,UAAY,CAY9B,CAEQW,kBAAkBqM,GACxB,MAAMlzB,GAAU,EAAAmzB,EAAA,GAAK3jC,KAAKoK,eAG1B,OAFAoG,EAAQ4B,YAAc,CAACxC,EAAG8zB,GAC1BlzB,EAAQ8wB,SAAWthC,KAAKyzB,UAAUiQ,GAC3BlzB,CACT,CAEOozB,UAAS,OAAC57B,EAAM,MAAEooB,EAAK,SAAEnd,EAAQ,eAAEqgB,EAAc,SAAEniB,EAAQ,QAAE4tB,EAAO,QAAE8E,IAS3E7jC,KAAKoK,cAAgB,CACnBpC,SACAooB,MAAOA,GAAS,GAChBhe,YAAa,CAACxC,EAAG5P,KAAK40B,SAASxiB,aAC/Ba,WACA9B,WACA4tB,UACA8E,WAGF7jC,KAAKszB,eAAiBA,QAAAA,EAAkB,CAAC,EAEzCtzB,KAAK0b,SACP,CAEO3X,U,QACL/D,KAAK0b,UACL1b,KAAK6R,eAAeC,YACpB9R,KAAKswB,WAAWvsB,UACC,QAAjB,EAAA/D,KAAKm1B,oBAAY,SAAExZ,kBACL,QAAd,EAAA3b,KAAK8xB,iBAAS,SAAEpW,UAEhB1b,KAAKq2B,yBAAsBpyB,EAC3BjE,KAAKu2B,iBAActyB,EACnBjE,KAAKs1B,eAAYrxB,EACjBjE,KAAKu0B,uBAAoBtwB,EACzBjE,KAAKm1B,kBAAelxB,EACpBjE,KAAK8xB,eAAY7tB,CACnB,E,6mBExnDa,MAAM6/B,EAuDnB/jC,YAAY8tB,GAtDL,KAAAziB,UAAYC,SAASC,cAAc,OACnC,KAAAkkB,KAAO,2BAIN,KAAAuU,eAAiB14B,SAASC,cAAc,OAQzC,KAAA04B,SAAW,IAAI5iC,IAEf,KAAA6iC,SAAU,EAET,KAAA9yB,SAAW,EACX,KAAAytB,YAAc,EAGd,KAAAxO,MAAQ,GAGR,KAAA8T,WAAkG,CAAC,EAEnG,KAAA5H,gBAA+B,IAAIl7B,IAInC,KAAA+iC,SAAmC,CAAC,WAGpC,KAAAC,aAAc,EACd,KAAAtE,eAAgB,EAChB,KAAAvO,WAAgC,aAChC,KAAA8S,YAAa,EAGb,KAAAC,QAA+D,CAAC,EAKhE,KAAAC,aAA4B,oBAE5B,KAAAC,gBAAiB,EAMjB,KAAAC,OAA6B,QAoK7B,KAAAC,QAAU,KAChB,MAAMh4B,EAAQ1M,KAAK+wB,MAAMrkB,MACzB,GAAG1M,KAAKowB,QAAU1jB,EAAO,EACpB1M,KAAKmkC,SAASpvB,SAAS,aAAe/U,KAAKmkC,SAASpvB,SAAS,cAC9D/U,KAAK2kC,oBAAiB1gC,GAGrBjE,KAAKmkC,SAASpvB,SAAS,aACxB/U,KAAKmR,SAAW,EAChBnR,KAAK4+B,YAAc,GAGrB,IAAI,MAAMxa,KAAKpkB,KAAKskC,UAEhBtkC,KAAKskC,QAAQlgB,GAGjBpkB,KAAKwvB,KAAO,2BAEZxvB,KAAKuO,aAAUtK,EACfjE,KAAKkkC,WAAa,CAAC,EACnBlkC,KAAKowB,MAAQ1jB,EACb1M,KAAKs8B,gBAAgB9a,QACrBxhB,KAAKwkC,gBAAiB,EAGtBxkC,KAAK4kC,gB,GA+NT,KAAAxD,iBAAmB,KACjBphC,KAAKswB,WAAW8Q,kBAAkB,GAzYlC,OAAWphC,KAAM6tB,GAEjB7tB,KAAKoL,UAAUmI,UAAUxS,IAAI,WAAY,YAAcf,KAAKykC,QAE5D,MAAMI,GAAK7kC,KAAK8kC,mBAAqB9kC,KAAK+kC,eAAezqB,KAAKta,MA4C9D,GA3CAA,KAAK8kC,kBAA0BE,GAAY,EAAD,gCA8BxC,OA7BGhlC,KAAKwkC,iBACNxkC,KAAKswB,WAAW2U,QAAQzb,YAAYxpB,KAAKwvB,MACzCxvB,KAAKswB,WAAWE,oBAAoBxwB,KAAKwvB,MACzCxvB,KAAKwkC,gBAAiB,GAGxBQ,EAAUA,EAAQ5L,QAAQpxB,IACxB,MAAMk9B,GAAellC,KAAKs8B,gBAAgBj5B,IAAI2E,GAE9C,OADGk9B,GAAallC,KAAKs8B,gBAAgBv7B,IAAIiH,GAClCk9B,CAAW,IAGjBllC,KAAKmlC,mBACNH,QAAgB,OAAYA,GAAeh9B,GAAW,EAAD,gCACnD,GAAGA,EAAO6gB,mBACW7oB,KAAKiH,SAASqI,gBAAgBstB,QAAQ50B,IAEvD,IAAI,MAAM8zB,KAAU97B,KAAKmlC,iBACvB,SAASnlC,KAAKiH,SAASqI,gBAAgBwsB,GAAQ9zB,GAC7C,OAAO,EAMf,OAAO,CACT,OAGK68B,EAAEG,EACX,IAEAhlC,KAAK+wB,MAAQ1lB,SAASC,cAAc,SACpCtL,KAAK+wB,MAAMxd,UAAUxS,IAAI,yBACtBf,KAAKuD,aACN,QAAMvD,KAAK+wB,MAAO/wB,KAAKuD,iBAAaU,EAAW,gBAE/C,QAAMjE,KAAK+wB,MAAO,qBAAiB9sB,EAAW,eAGhDjE,KAAK+wB,MAAMnvB,KAAO,OAEf5B,KAAKokC,YAAa,CACnB,MAAMgB,EAAU,IAAI,IAAe,CAAC,GACpCA,EAAQC,eAAe9xB,UAAUxS,IAAI,2BACrC,MAAMukC,EAAej6B,SAASC,cAAc,OAC5Cg6B,EAAa/xB,UAAUxS,IAAI,6BAE3Bf,KAAKulC,kBAAoBl6B,SAASC,cAAc,OAChDtL,KAAKulC,kBAAkBhyB,UAAUxS,IAAI,mBAErCf,KAAKulC,kBAAkB75B,OAAO1L,KAAK+wB,OACnCuU,EAAa55B,OAAO1L,KAAKulC,mBACzBvlC,KAAKwlC,mBAAqB,IAAI,KAAWF,IAIzC,QAAiBtlC,KAAKulC,mBAAoBx9B,IACxC,GAAG/H,KAAKikC,QAAS,OACjB,IAAI5jC,EAAS0H,EAAE1H,OAGf,GAFAA,GAAS,OAAgBA,EAAQ,kBAE7BA,EAAQ,OAEZ,MAAM2H,EAAS3H,EAAOgmB,QAAQ7Z,IACxBuzB,EAAK//B,KAAK+jC,eAAensB,cAAc,kBAAoB5P,EAAS,MACtE+3B,GAGF,QAAmBA,GAFnB//B,KAAKwC,OAAOwF,EAAO4qB,W,IAMvBwS,EAAQzyB,QAAQjH,OAAO45B,GACvBtlC,KAAKoL,UAAUM,OAAO05B,EAAQh6B,U,CAGhCpL,KAAK+jC,eAAexwB,UAAUxS,IAAI,sBAElC,MAAMqkC,EAAU,IAAI,IAAe,CACjCltB,KAAMlY,KAAKylC,uBACXC,UAAU,IAEZN,EAAQzyB,QAAQjH,OAAO1L,KAAKwvB,MAC5BxvB,KAAK+jC,eAAer4B,OAAO05B,EAAQh6B,WACnCpL,KAAKswB,WAAa,IAAI,KAAWtwB,KAAK+jC,gBACtC/jC,KAAKswB,WAAWE,oBAAoBxwB,KAAKwvB,OAEzC,QAAiBxvB,KAAK+jC,gBAAiBh8B,IACrC,MAAM1H,GAAS,OAAgB0H,EAAE1H,OAAQ,gBAGzC,IAFA,OAAY0H,IAER1H,EAAQ,OACZ,GAAGL,KAAKikC,QAAS,OAEjB,IAAIz3B,EAAuBnM,EAAOgmB,QAAQre,OAG1C,GAFAwE,EAAMA,EAAIqc,WAAarc,EAAIomB,WAAapmB,GAEpCxM,KAAKokC,YAEP,YADApkC,KAAKe,IAAIyL,GAKRxM,KAAKgkC,SAAS3gC,IAAImJ,GACnBxM,KAAKwC,OAAOgK,GAEZxM,KAAKe,IAAIyL,GAGX,MAAMm5B,EAAWtlC,EAAOuX,cAAc,SACtC+tB,EAASC,SAAWD,EAASC,OAAO,IAGtC,MAAMC,GAAiB,OAAS7lC,KAAK0kC,QAAS,KAAK,GAAO,GAC1D1kC,KAAK+wB,MAAMnjB,iBAAiB,QAASi4B,GAErC7lC,KAAKswB,WAAWK,iBAAmB,KACjC3wB,KAAK4kC,gBAAgB,EAGvB5kC,KAAKswB,WAAWllB,UAAU4M,SAAQ,UAElChY,KAAKoL,UAAUM,OAAO1L,KAAK+jC,gBAC3B/jC,KAAK8lC,SAASp6B,OAAO1L,KAAKoL,WAG1B1I,YAAW,KACT,MAAMqjC,EAAoB/lC,KAAK4kC,iBAC5B/W,EAAQmY,eACTD,EAAkBz3B,MAAK,KACrBuf,EAAQmY,eAAe,G,GAG1B,EACL,CAgCcC,c,yCAETjmC,KAAKqkC,YACLrkC,KAAK4+B,aACY,IAAlB5+B,KAAKmR,WACLnR,KAAKmkC,SAASpvB,SAAS,YACrB/U,KAAKowB,eAAepwB,KAAKiH,SAASy2B,gBAAgBwI,eAAelmC,KAAKowB,gBAElEpwB,KAAK8kC,kBAAkB,CAAC,WAElC,G,CAEQqB,UAAUvkC,G,QACC,QAAjB,KAAA5B,KAAKskC,SAAQ1iC,UAAI,UAAJA,GAAU,GACvB,MAAMma,IAAW/b,KAAKskC,QAAQ1iC,GAC9B,MAAO,CACLma,SACAsX,WAAY,IAAMrzB,KAAKskC,QAAQ1iC,KAAUma,EAE7C,CAEcqqB,iB,yCACZ,GAAGpmC,KAAKkkC,WAAWpF,SAAW9+B,KAAKkkC,WAAWmC,SAC5C,OAIF,MAAMC,EAAY,WAAoB,GAAK,KAAO,GAE5C,WAACjT,GAAcrzB,KAAKmmC,UAAU,WAC9B53B,EAAUvO,KAAKiH,SAASy3B,eAAeC,WAAW,CACtDvO,MAAOpwB,KAAKowB,MACZwO,YAAa5+B,KAAK4+B,YAClB1N,MAAOoV,EACPzH,SAAU7+B,KAAKmR,SACfo1B,cAAc,IAGhBh4B,EAAQ0J,OAAM,KACRob,MAIJrzB,KAAKkkC,WAAWlkC,KAAKkkC,WAAWpF,QAAU,WAAa,YAAa,EAAI,IAG1E,MAAMpyB,QAAc6B,EACpB,IAAI8kB,IACF,OAGF,IAAIyL,EAAUpyB,EAAMoyB,QACpB,GAAGA,EAAQj8B,OAAQ,CACjB,MAAM2jC,GAAiB,OAAe1H,EAAQA,EAAQj8B,OAAS,KAAO,EAKtE,GAHAi8B,EAAUA,EAAQxH,SAClB,OAAcwH,GAAS9X,GAAKA,EAAEhf,SAAW,WAEtChI,KAAKymC,mBACN3H,QAAgB,OAAYA,GAAU9X,GAAMhnB,KAAK0mC,eAAe1f,EAAEhf,WAC9DqrB,KACF,OAKJ,SADMrzB,KAAKimC,eACP5S,IACF,OAGFrzB,KAAK4+B,YAAc4H,C,CAKrB,GAFAxmC,KAAK8kC,kBAAkBhG,EAAQhkB,KAAKiO,GAAWA,EAAO/gB,UAEnD0E,EAAMi6B,MAAO,CACd,IAAI3mC,KAAKkkC,WAAWpF,QAAS,CAE3B,SADM9+B,KAAKimC,eACP5S,IACF,OAOF,OAJArzB,KAAKkkC,WAAWpF,SAAU,EAC1B9+B,KAAK4+B,YAAc,EACnB5+B,KAAKmR,SAAW,EAETnR,KAAKomC,gB,CAIZ,GAFApmC,KAAKkkC,WAAWmC,UAAW,GAEvBrmC,KAAKkkC,WAAWhG,SAClB,OAAOl+B,KAAK4mC,iB,CAIpB,G,CAEcF,eAAe1+B,G,yCAC3B,MAAM20B,QAA0B38B,KAAKiH,SAASqI,gBAAgBstB,QAAQ50B,GACtE,OAAGA,EAAOo3B,SACyB,kBAA1Bp/B,KAAKymC,mBAAwC,OAAc9J,MAC1D,OAAUA,EAAmB38B,KAAKymC,wBAArC,CAGT,G,CAEcG,kB,yCACZ,GAAG5mC,KAAKkkC,WAAWhG,SACjB,OAGF,MAAM2I,EAAiB7mC,KAAKmkC,SAASpvB,SAAS,YAE9C,IAAI/U,KAAK2kC,eAAgB,CAQvB,MAAM,WAACtR,GAAcrzB,KAAKmmC,UAAU,YAC9B53B,EAAU6S,QAAQgI,IAAI,CAC1Byd,EAAiB7mC,KAAKiH,SAASy2B,gBAAgBO,mBAAmBj+B,KAAKowB,OAAS,GAChFpwB,KAAKowB,MAAQpwB,KAAKiH,SAASy2B,gBAAgBS,eAAen+B,KAAKowB,YAASnsB,IAG1EsK,EAAQ0J,OAAM,KACRob,MAIJrzB,KAAKkkC,WAAWhG,UAAW,EAAI,IAGjC,MAAOyG,EAAgBmC,SAAsBv4B,EAC7C,IAAI8kB,IACF,OAGF,GAAGyT,EAAc,CAEf,IAAIC,EAAgBF,EAAiBC,EAAa1I,WAAWrf,OAAO+nB,EAAalL,SAAWkL,EAAa1I,WAEzG,GAAGp+B,KAAKymC,mBACNM,QAAsB,OAAYA,GAAgB/+B,GAAWhI,KAAK0mC,eAAe1+B,MAC7EqrB,KACF,OAIArzB,KAAKmkC,SAASpvB,SAAS,aACzBgyB,EAAgBA,EAAc3N,QAAQpxB,GAAWA,EAAOo3B,YAG1Dp/B,KAAK2kC,gBAAiB,OAAaA,EAAe5lB,OAAOgoB,G,MACpD/mC,KAAK2kC,eAAiBA,EAAerN,SAE5C,OAAiBt3B,KAAK2kC,eAAgB,S,CAIxC,MAAM2B,EAAY,WAAoB,GAAK,KAAO,EAC5CU,EAAMhnC,KAAK2kC,eAAerW,OAAO,EAAGgY,GAC1CtmC,KAAK8kC,kBAAkBkC,GAGnBhnC,KAAK2kC,eAAe9hC,SACtB7C,KAAKkkC,WAAWhG,UAAW,EAO/B,G,CAEc+I,6B,yCACZ,GAAGjnC,KAAKkkC,WAAWgD,oBACjB,OAGF,MAEM,WAAC7T,GAAcrzB,KAAKmmC,UAAU,uBAC9B53B,EAAUvO,KAAKiH,SAASw5B,kBAAkBC,uBAC9C1gC,KAAKgI,OAAOs1B,WACZ,CACE1tB,EAAG,4BACHu3B,EAAGnnC,KAAKowB,OAPM,GAUhBpwB,KAAKwvB,KAAKE,mBAGZnhB,EAAQ0J,OAAM,KACRob,MAIJrzB,KAAKkkC,WAAWgD,qBAAsB,EAAI,IAG5C,MAAMpK,QAAqBvuB,EAC3B,IAAI8kB,IACF,OAGF,MAAM2R,EAAUlI,EAAaA,aAAahiB,KAAKolB,IACtC,OAAqBA,MAE9B,OAAiB8E,EAAS,UAC1BhlC,KAAK8kC,kBAAkBE,IAEpBhlC,KAAKwvB,KAAKE,mBAAqBoN,EAAa1L,OAAS0L,EAAaA,aAAaj6B,OAhChE,MAiChB7C,KAAKkkC,WAAWgD,qBAAsB,EAE1C,G,CAMQtC,iBACN,GAAG5kC,KAAKuO,QACN,OAAOvO,KAAKuO,QAGd,MAcMqc,EAdM,KACN5qB,KAAKmkC,SAASpvB,SAAS,aAAkD/U,KAAKkkC,WAAWmC,SACpFrmC,KAAKonC,iBAAiB,YAG3BpnC,KAAKmkC,SAASpvB,SAAS,cAAe/U,KAAKmkC,SAASpvB,SAAS,YAAgB/U,KAAKkkC,WAAWhG,SAI9Fl+B,KAAKmkC,SAASpvB,SAAS,yBAA2B/U,KAAKkkC,WAAWgD,oBAC5DlnC,KAAKonC,iBAAiB,4BAD/B,EAHSpnC,KAAKonC,iBAAiB,YAQbnkC,GACpB,IAAI2nB,EACF,OAAOxJ,QAAQjT,UAGjB,MAAMI,EAAUvO,KAAKuO,QAAUqc,EAAY3S,OAAOzS,IAChD4G,QAAQigB,MAAM,wBAAyB7mB,EAAI,IAC1C2S,SAAQ,KACNnY,KAAKuO,UAAYA,IAClBvO,KAAKuO,aAAUtK,GAGjBjE,KAAKohC,kBAAkB,IAGzB,OAAO7yB,CACT,CAEQ64B,iBAAiBjD,GAQvB,MAPkE,CAChErF,QAAS9+B,KAAKomC,eACdlI,SAAUl+B,KAAK4mC,gBACfM,oBAAqBlnC,KAAKinC,4BAGR9C,GAAUkD,KAAKrnC,KAErC,CAEc+kC,cAAcC,G,0CAItBhlC,KAAKmkC,SAASpvB,SAAS,YAAc/U,KAAKkkC,WAAWhG,WACvD8G,QAAgB,OAAYA,GAAUh9B,GAC7BhI,KAAKiH,SAASy2B,gBAAgB4J,iBAAiBt/B,MAI1Dg9B,EAAQjgC,SAAciD,GAAW,EAAD,gCAC9B,MAAM,IAAC00B,GAAO,uBAA+B,CAC3C10B,OAAQA,EACRoD,UAAWpL,KAAKswB,WAChBwP,cAAe9/B,KAAK8/B,cACpBvO,WAAYvxB,KAAKuxB,aAGnB,GAAGvxB,KAAKokC,YAAa,CACnB,MAAMJ,EAAWhkC,KAAKgkC,SAAS3gC,IAAI2E,GAC7Bu/B,EAAgB,IAAI,IAEvBvD,IAEDuD,EAAcxW,MAAM6U,SAAU,GAGhClJ,EAAItF,YAAYpf,QAAQuvB,EAAcC,M,CAGxC,IAAI9H,EAEFA,EADC13B,EAAOo4B,kBACW,OAAqBp4B,EAAOs1B,YACvCt1B,IAAW,UACN,QAAKhI,KAAKukC,eAEV,aAA0BvkC,KAAKiH,SAASy2B,gBAAgBC,QAAQ31B,EAAOs3B,aAGtF5C,EAAIU,gBAAgB1xB,OAAOg0B,EAC7B,KACF,G,CAEO3+B,IAAIyL,EAAsBuC,EAA8B4nB,GAAS,G,MAItE,GAFA32B,KAAKgkC,SAASjjC,IAAIyL,IAEdxM,KAAKokC,YAEP,YADApkC,KAAKywB,SAASzwB,KAAKgkC,SAASn8B,MAI3B7H,KAAKowB,MAAMQ,SACZ5wB,KAAK+wB,MAAMrkB,MAAQ,GACnB1M,KAAK0kC,WAGP,MAAM5Z,EAAMzf,SAASC,cAAc,OACnCwf,EAAIvX,UAAUxS,IAAI,gBAAiB,YAEnC,MAAM6d,EAAW,IAAI,IAKrB,GAJAA,EAASrL,UAAUxS,IAAI,uBAAwB,QAAS,aACxD6d,EAAS6oB,UAAW,EAEpB3c,EAAIzE,QAAQ7Z,IAAM,GAAKA,EACpBA,EAAIqc,WAAY,CACjB,QAAa5kB,IAAV8K,EAAqB,CACtB,MAAMua,EAAY,IAAI,IACtBA,EAAUmV,OAAO,CAACz2B,OAAQwE,EAAIomB,WAAY7J,QAAQ,IAClDha,EAAQua,EAAUpnB,O,CAGpB0c,EAASyK,kBAAkB,CACzBrhB,OAAQwE,G,CA0BZ,OAtBGuC,IACoB,iBAAZ,EACP+b,EAAItL,UAAYzQ,IAEhB,OAAe+b,EAAK/b,GACpB+b,EAAIpf,OAAOqD,KAIf+b,EAAI4c,sBAAsB,aAAc9oB,GAExC5e,KAAKulC,kBAAkBhuB,aAAauT,EAAK9qB,KAAK+wB,OAEjC,QAAb,EAAA/wB,KAAKywB,gBAAQ,mBAAGzwB,KAAKgkC,SAASn8B,MAE3B8uB,GACD32B,KAAKwlC,mBAAmBtP,kBAAkB,CACxCh0B,QAASlC,KAAK+wB,MACdoF,SAAU,WAIPrL,CACT,CAEOtoB,OAAOgK,GACZ,IAAIxM,KAAKokC,YAAa,OAEtB,MAAMtZ,EAAM9qB,KAAKulC,kBAAkB3tB,cAAc,cAAcpL,OAC/Dse,EAAIvX,UAAU/Q,OAAO,YAChBsoB,EAAI6c,YACT7c,EAAIvX,UAAUxS,IAAI,aAElB,MAAM2gB,EAAiB,KACrB1hB,KAAKgkC,SAAS/iC,OAAOuL,GACrBse,EAAItoB,SACJxC,KAAKywB,UAAYzwB,KAAKywB,SAASzwB,KAAKgkC,SAASn8B,KAAK,EAGjD,+BACDijB,EAAIld,iBAAiB,eAAgB8T,EAAgB,CAACzT,MAAM,IAE5DyT,GAEJ,CAEOkmB,cACL,MAAO,IAAI5nC,KAAKgkC,SAClB,CAEO6D,WAAWC,GAChBA,EAAO/iC,SAAS2H,IACd1M,KAAKe,IAAI2L,OAAOzI,GAAW,EAAM,IAGnCyP,OAAOq0B,uBAAsB,KAC3B/nC,KAAKwlC,mBAAmBtP,kBAAkB,CACxCh0B,QAASlC,KAAK+wB,MACdoF,SAAU,SACV6R,eAAgB,YAChB,GAEN,E,wnBClVF,SAASC,EAA2BC,GAAiB,GACnD,MAAMlsB,EAAY,IAAI,IAAqB,CAACoC,YAAY,EAAM8pB,mBAQ9D,OAPAlsB,EAAU7Q,YAEN+8B,IACFlsB,EAAUmsB,OAAO1hB,eAAe,KAAM,IAAK,MAC3CzK,EAAUosB,YAAc,cAGnBpsB,CACT,CA9UA,qBAA2B,uBAAuB,EAAEqsB,OAAMrgC,aACxDqgC,EAAKtjC,SAASkD,IACZ,MAAMqgC,EAAO,cAAcrgC,qBAAuBD,MACjDkR,MAAMC,KAAK9N,SAASoN,iBAAiB,0BAA0B6vB,4BAA+BA,MAA4BvjC,SAASwjC,IAClIA,EAAKh1B,UAAU/Q,OAAO,YAAY,GAClC,GACF,IA0UG,MAAMgmC,EAAmB,CAACC,EAAqBC,KACpD,IAAIh4B,EAAmB9G,EAEvB,MAAM++B,GAAaF,EAAOl1B,UAAUqB,SAAS,qBACvCxJ,GAAY,OAAgBq9B,EAASE,EAAyB,gBAAb,YACvD,GAAGv9B,EAAW,CACZ,MAAMk9B,EAAO,+BACPM,EAAoB,wBAAwBN,IAClD,IAAIO,EAOJ,GAHEA,EAHEJ,EAAOljB,QAAQqjB,GAGL,CAACA,GAFD,CAAC,kBAAkBN,IAAQ,eAAeA,KAKrDK,EAAW,CACZ,MAAMG,EAAS,yBACfD,EAAYA,EAAU/tB,KAAK/Q,GAAM++B,EAAS/+B,G,CAG5C,MAAMsb,EAAWwjB,EAAUrkB,KAAK,MAE1BgB,EAAWtM,MAAMC,KAAK/N,EAAUqN,iBAAiB4M,IACjDtc,EAAMyc,EAASrL,QAAQsuB,GAEvBM,EAA0BvjB,EAAS1K,KAAK5Y,IAAY,CAAE8F,OAAQ9F,EAAQmkB,QAAQre,OAAO4qB,WAAY3qB,KAAM/F,EAAQmkB,QAAQpe,QAE7HyI,EAAOq4B,EAAWzR,MAAM,EAAGvuB,GAC3Ba,EAAOm/B,EAAWzR,MAAMvuB,EAAM,E,CAUhC,OANIa,EAAK/G,QAAU+G,EAAK,GAAG3B,IAAMygC,GAAeh4B,EAAK7N,QAAU6N,EAAKA,EAAK7N,OAAS,GAAGoF,IAAMygC,MACxFh4B,EAAM9G,GAAQ,CAACA,EAAKsH,UAAWR,EAAKQ,YAKhC,CAACR,EAAM9G,EAAK,EAGN,MAAMo/B,UAAqBxlC,YAA1C,c,oBAIS,KAAA+1B,UAAW,EACX,KAAAE,cAAe,EAEf,KAAAtF,YAAa,EAMZ,KAAAtiB,eAAiB,IAAI,GAsS/B,CAjSeo3B,S,mDACXjpC,KAAKuT,UAAUxS,IAAI,SACnBf,KAAKiH,SAAW,aAEhBjH,KAAKqmB,QAAQpe,IAAM,GAAKjI,KAAKmI,QAAQF,IACrCjI,KAAKqmB,QAAQre,OAAS,GAAKhI,KAAKmI,QAAQH,OAExC,MAAMrG,GAAM,OAAoB3B,KAAKmI,SAC/B+gC,EAA2B,UAAbvnC,EAAIC,KAClBkN,GAAW9O,KAAKy5B,cAAgByP,EAChCC,EAAanpC,KAAKmI,QAAQsF,OAAO27B,YACjCC,EAAgC,QAAZ,EAAArpC,KAAKmI,eAAO,eAAEkhC,kBAElCC,GAAc,OAAwB,EAAf3nC,EAAIkF,UAEjC7G,KAAKwf,UAAY,wOAQjB,MAAM3V,EAAS7J,KAAKuV,kBAEdg0B,EAAcl+B,SAASC,cAAc,OAC3Ci+B,EAAYh2B,UAAUxS,IAAI,kBAEI,UAAbY,EAAIC,MAAoB5B,KAAKmI,SAAWnI,KAAKmI,QAAQsF,OAAOI,cAE3E7N,KAAKuT,UAAUxS,IAAI,aAGlBsoC,IACDrpC,KAAKuT,UAAUxS,IAAI,eACnBf,KAAK0L,OAAO69B,IAGd,MAAMC,QAAoB16B,EAlU9B,SAAgC26B,G,yCAC9BA,EAAQl2B,UAAUxS,IAAI,YAEtB,MAAMoH,EAAUshC,EAAQthC,QAClBxG,GAAM,OAAoBwG,GAE7BA,EAAQsF,OAAOi8B,KAChBD,EAAQl2B,UAAUxS,IAAI,UAGxB,IAAI4oC,EAAYhoC,EAAIgO,WAAWjP,MAAMgP,GAA8B,2BAAhBA,EAAUE,IAA6E+5B,UAAY,IAAIC,WAAW,IACrKD,EAhHK,SAAwBA,GACxBA,aAAoBC,aACvBD,EAAW,IAAIC,WAAWD,IAG5B,MACME,EAD6B,EAAlBF,EAAS9mC,OACI,EAAI,EAClC,IAAIgnC,EACF,OAAO,IAAID,WAAW,IAGxB,IAAIE,EACJ,IACE,MAAMC,EAAW,IAAIC,SAASL,EAASM,QACvCH,EAAS,IAAIF,WAAWC,GACxB,IAAI,IAAIzlB,EAAI,EAAGA,EAAIylB,EAAYzlB,IAAK,CAClC,MAAM8lB,EAAgB,EAAJ9lB,EAAQ,EAAI,EACxB+lB,EAAe,EAAJ/lB,EAAQ,EACnB1X,EAAQq9B,EAASK,UAAUF,GAAW,GAC5CJ,EAAO1lB,GAAM1X,GAASy9B,EAAY,E,EAEpC,MAAM3kC,GACNskC,EAAS,IAAIF,WAAW,G,CAY1B,OAAOE,CACT,CA6EaO,CAAeV,EAASrS,MAAM,EAAG,KAE5C,MAAM,IAACgT,EAAKl/B,UAAWm/B,EAAY,OAAEC,GA7EvC,SAA4Bb,EAAsB9iC,GAChD,MAGM4jC,EAAe,aAAsB,GAAK,GAG1CC,EAAO,aAAsB,IAAM,IACnCC,EAAO,aAAsB,IAAM,IACnCH,GAAS,OAAM3jC,EAAW,GAAK8jC,EAAMD,EAAMC,GAE3CL,EAAMj/B,SAASmb,gBAAgB,6BAA8B,OACnE8jB,EAAI/2B,UAAUxS,IAAI,uBAClBupC,EAAI7jB,eAAe,KAAM,QAAS,GAAK+jB,GACvCF,EAAI7jB,eAAe,KAAM,SAAU,GAAKgkB,GACxCH,EAAI7jB,eAAe,KAAM,UAAW,OAAO+jB,KAAUC,KAIrD,MAAMG,EAAYpkC,KAAKC,OAAOkjC,GACxBkB,EAASlB,EAAS9mC,OAAS8mC,EAAS9mC,OAAS,IAC7CioC,EAAWtkC,KAAKI,IAAK4jC,EAAS,EAA0B,EAAGK,GAEjE,IAAIE,EAAW,EACf,MAAMC,EAAWP,EArBI,EAuBrB,IAAIr1B,EAAO,GACX,IAAI,IAAIgP,EAAI,EAAG6mB,EAAO,EAAGC,EAAO,EAAG9mB,EAAIymB,IAAUzmB,EAAG,CAClD,MAAM1X,EAAQi9B,EAASvlB,IAAM,EAC7B,GAAI8mB,EAAOJ,GAAaD,EAAQ,CAC9BK,EAAOA,EAAOJ,EAAWD,EACtBK,GAAQJ,EAAW,GAAK,GACtBC,EAAWr+B,IAAOq+B,EAAWr+B,GAGlC,MAAMy+B,EAAY3kC,KAAKC,KAAMskC,EAAWC,GAAcJ,EAAY,GAAK,IAAOA,EAAY,GAhCzE,GAqCjBx1B,GAHU,oBACC61B,SAAYR,EAAeU,wBAA0CA,mCAIhFF,GAAQG,EAGNL,EADCG,GAAQJ,EAAW,GAAK,EACd,EAEAp+B,C,MAGVq+B,EAAWr+B,IAAOq+B,EAAWr+B,GAEhCw+B,GAAQJ,C,CAIZ,MAAM1/B,EAAYC,SAASC,cAAc,OAKzC,OAJAF,EAAUmI,UAAUxS,IAAI,kBACxBqK,EAAUM,OAAO4+B,GAEjBA,EAAI/xB,mBAAmB,YAAanD,GAC7B,CAACk1B,MAAKl/B,YAAWo/B,SAC1B,CAeiDa,CAAmB1B,EAAUhoC,EAAIkF,UAE1EykC,EAAmBf,EAAaphB,WAAU,GAChDmiB,EAAiB/3B,UAAUxS,IAAI,uBAC/BwpC,EAAah3B,UAAUxS,IAAI,6BAE3B,MAAMwqC,EAAoBlgC,SAASC,cAAc,OACjDigC,EAAkBh4B,UAAUxS,IAAI,4BAChCwqC,EAAkB7/B,OAAO6+B,EAAce,GAEvC,MAAME,EAAUngC,SAASC,cAAc,OACvCkgC,EAAQj4B,UAAUxS,IAAI,cACtB0oC,EAAQ/9B,OAAO6/B,EAAmBC,GAElC,IAAI3zB,EAAWyyB,EAiFf,MA/Ee,KACb,IAAInkC,EAAQsjC,EAAQtjC,MAEpB,MAQMslC,EAAe,KACnBH,EAAiB//B,MAAM+X,MAASnd,EAAMI,YAAcJ,EAAMU,SAAW,IAAO,GAAG,IAG7EV,EAAM7B,QAAW6B,EAAMI,YAAc,GAAKJ,EAAMI,cAAgBJ,EAAMU,WACxE4kC,IAGF,MAAMC,GAAsB,OAAgBD,GAqD5C,OApDAhC,EAAQkC,iBAAiB,aAAcD,GACvCjC,EAAQkC,iBAAiB,QAASD,GAClCjC,EAAQkC,iBAAiB,QAnBJ,MACnB,SAAc,MACRxlC,IACJslC,KACQtlC,EAAM7B,SACbmlC,EAAQ,IAgBbA,EAAQmC,aAAat9B,MAAK,KACxB,IAAI8R,GAAY,EAAOyrB,GAAY,EAiCnC,SAASC,EAAM/jC,GACb,IAAIgkC,EACJ,GAAGhkC,aAAa0qB,WACdsZ,EAAUhkC,EAAEgkC,YACP,CACL,MAAMxpB,EAAQxa,EAAE1H,OAAuBmiB,wBACvCupB,EAAUhkC,EAAEikC,cAAc,GAAGC,MAAQ1pB,EAAKI,I,CAG5C,MAAMupB,EAAYH,EAAUvB,EAAqBrkC,EAAMU,SACvDV,EAAMI,YAAc2lC,CACtB,CA3CAr0B,EAASjK,iBAAiB,cAAe7F,IACpCqY,IACDja,EAAM1B,OACN2b,GAAY,GAEdyrB,GAAY,CAAK,IAEnBh0B,EAASjK,iBAAiB,aAAc7F,IACtC8jC,GAAY,EACTzrB,GAAW0rB,EAAM/jC,EAAE,IAExB8P,EAASjK,iBAAiB,aAAc7F,IACtCA,EAAE2qB,iBACc,IAAb3qB,EAAEuO,SACDnQ,EAAM7B,QACR6B,EAAM5B,QAGRunC,EAAM/jC,GACNqY,GAAY,EAAI,IAElBvI,EAASjK,iBAAiB,WAAY7F,IACjC8jC,GAAazrB,IACdja,EAAM1B,OACN2b,GAAY,E,KAGhB,QAAiBvI,GAAW9P,KAC1B,OAAYA,GACR5B,EAAM7B,QAAQwnC,EAAM/jC,EAAE,GAc5B,GACC,KAEI,KACL8P,EAASrV,SACTqV,EAAW,KACX1R,EAAQ,IAAI,CACb,CAIL,G,CAqNwCgmC,CAAiBnsC,MAnNzD,SAAyBypC,G,+CACvB,MAAMlQ,EAAWkQ,EAAQlQ,SAEnBpxB,EAAUshC,EAAQthC,QAClBxG,GAAM,OAAoBwG,GAE1B2G,EAAuB,UAAbnN,EAAIC,MAAiC,UAAbD,EAAIC,KACtCwqC,EAAgB/gC,SAASC,cAAc,OAC7C8gC,EAAc74B,UAAUxS,IAAI,qBAE5B,MAAMsrC,EAAiB1qC,EAAIgO,WAAWjP,MAAM4nC,GAAoB,2BAAXA,EAAK14B,IAE1D,IAAId,EAAS,CACX,MAAMw9B,EAA2B,IAC9BD,aAAc,EAAdA,EAAgBv8B,YACjBw8B,EAAMjqC,MAAK,OAAcgqC,EAAev8B,YAGvCypB,EACD+S,EAAMjqC,MAAK,QAAmB8F,EAAQqO,OAC7B81B,EAAMzpC,QACfypC,EAAMjqC,MAAK,OAAYV,EAAIkG,OAG1B4hC,EAAQtV,YACTmY,EAAMjqC,WAAW,OAAiB8F,IAGpCikC,EAAc1gC,WAAU,QAAiB4gC,EAAO,O,CAQlD7C,EAAQlxB,mBAAmB,YALd,wJAOb,MAAMg0B,EAAU9C,EAAQ7xB,cAAc,gBAEhC40B,EAAmB,IAAI,IAC7BA,EAAiBnmB,QAAQmT,WAAaiQ,EAAQpjB,QAAQmT,WACtDgT,EAAiBnmB,QAAQomB,SAAWhD,EAAQpjB,QAAQomB,SACpDD,EAAiBnmB,QAAQqmB,SAAWjD,EAAQpjB,QAAQqmB,SACnDF,EAAyB7S,QAAW8P,EAAgB9P,QAClD7qB,EACD09B,EAAiB9gC,aAAa,OAAiBvD,KAE/C,OAAaqkC,GAAkB,OAAmC,QAArB,EAAAH,aAAc,EAAdA,EAAgBt9B,aAAK,QAAIpN,EAAIkO,YAG5E08B,EAAQ7gC,OAAO8gC,GAEZ/C,EAAQtV,YACToY,EAAQ7gC,QAAO,OAAavD,IAG9B,MAAMwkC,EAAclD,EAAQ7xB,cAAc,mBA0C1C,OAzCA+0B,EAAYjhC,OAAO0gC,GAEJ,KACb,IAAIQ,GAAW,EAEXC,EAAe,IAAI,IAAkB,CACvCnnC,MAAO+jC,EAAQtjC,MACfyQ,WAAYjV,EAAI0F,oBAGlBoiC,EAAQkC,iBAAiB,SAAS,KAChClC,EAAQl2B,UAAU/Q,OAAO,uBAEzBmqC,EAAYG,UAAUtjB,YAAY4iB,GAClCQ,GAAW,CAAK,IAGlB,MAAM9kC,EAAS,KACT8kC,IACFnD,EAAQl2B,UAAUxS,IAAI,uBACtB6rC,GAAW,EAERC,GACDF,EAAYG,UAAUtjB,YAAYqjB,EAAazhC,W,EAWrD,OANAq+B,EAAQkC,iBAAiB,OAAQ7jC,KAE7B2hC,EAAQtjC,MAAM7B,QAAUmlC,EAAQtjC,MAAMI,YAAc,IACtDuB,IAGK,KACL+kC,EAAalxB,kBACbkxB,EAAazhC,UAAU5I,SACvBqqC,EAAe,IAAI,CACpB,C,IAmH4DE,CAAU/sC,MAEjEgtC,EAAehtC,KAAK4X,cAAc,eACxCo1B,EAAaxtB,UAAY8pB,EAEzB,MAAMvL,EAAS/9B,KAAK+9B,OAAUvwB,IAC5BxN,KAAK+9B,YAAS95B,EAEd,MAAMkC,EAAQnG,KAAKmG,MAAQ,aAAoCnG,KAAKmI,QAASqF,GAEvEo+B,EAAe5rC,KAAK4rC,cAAe,SACtC5rC,KAAKmG,MAAMqlB,YAAcxrB,KAAKmG,MAAM8mC,kBAAmBrB,EAAaz9B,UAErEnO,KAAK2rC,iBAAiB,WAAW,IAAMC,EAAaz9B,WAAW,CAACF,MAAM,IAGxEjO,KAAKktC,iBAAmB1D,IAExB,MAAM2D,EAAa,KAAM,OAA6B,EAApBhnC,EAAMI,cAAoBuI,EAAW,MAAQw6B,EAAe,IAExFxhC,EAAS,KACbklC,EAAalS,UAAYqS,IACzBtjC,EAAO0J,UAAU1J,OAAO,WAAY1D,EAAM7B,OAAO,IAG/C6B,EAAM7B,QAAW6B,EAAMI,YAAc,GAAKJ,EAAMI,cAAgBJ,EAAMU,WACxEiB,IAGF,MAAMsR,EAAa,CAACrR,EAAWzD,EAAS6B,EAAM7B,UAG5C,GAFAyD,IAAK,OAAYA,GAEdzD,EAAQ,CACT,MAAM8oC,IAAqBptC,KAAKoK,cAChC,GAAG,qBAA4CpK,KAAKoK,eAAiB,CACnEpC,OAAQ,KACRoK,YAAa,CAACxC,EAAG,4BACjBy9B,WAAW,IACT,CACF,MAAO38B,EAAM9G,GAASwjC,EAAwB5E,EAAiBxoC,KAAMA,KAAKmI,QAAQF,KAAzC,GACzC,eAAsC,CAACD,OAAQhI,KAAKmI,QAAQH,OAAQC,IAAKjI,KAAKmI,QAAQF,KAAMyI,EAAM9G,E,CAGpGzD,EAAM1B,OAAOwT,OAAM,Q,MAEnB9R,EAAM5B,O,EAsBV,OAlBA,QAAiBsF,GAAS9B,GAAMqR,EAAWrR,IAAI,CAAC8J,eAAgB7R,KAAK6R,iBAErE7R,KAAK2rC,iBAAiB,SAAS,KAC7B9hC,EAAO0J,UAAU/Q,OAAO,WACxBwqC,EAAalS,UAAYwO,CAAW,IAGtCtpC,KAAK2rC,iBAAiB,cAAc,MAC7BxlC,EAAMI,aAAeJ,EAAM7B,QAAW,sBAA6C6B,KACxF6mC,EAAalS,UAAYqS,IAAY,IAGvCntC,KAAK2rC,iBAAiB,SAAS,KAC7B9hC,EAAO0J,UAAU/Q,OAAO,UAAU,IAGpCxC,KAAK2rC,iBAAiB,OAAQ7jC,GAEvBsR,CAAU,EAGnB,GAAa,QAAV,EAAAzX,EAAIsN,cAAM,eAAEpM,OAAQ,CACrB,MAAM2pB,EAAsB,GACtB+L,QAAgB,OAAU,CAC9BO,MAAOn3B,EACPwG,QAAS,KACTiD,UAAWvB,EACX4uB,SAAU,GACVC,UAAW,GACXhF,aAAc1zB,KAAK0zB,aACnBkF,kBAAkB,EAClBva,cAAere,KAAKqe,gBAEtBxU,EAAO0B,MAAM+X,MAAQzZ,EAAO0B,MAAMmY,OAAS,GACxC6U,EAAQW,OAAO7pB,OAAOmd,EAAKnqB,KAAKk2B,EAAQW,OAAO7pB,OAC/CkpB,EAAQW,OAAOC,MAAM3M,EAAKnqB,KAAKk2B,EAAQW,OAAOC,MAEjDn5B,KAAKuT,UAAUxS,IAAI,oBACnByrB,EAAKznB,SAASylB,GAAQA,EAAIjX,UAAUxS,IAAI,gB,CAG1C,GAAIooC,EA2HME,IACRrpC,KAAKgc,UAAYisB,GAA2B,GAC5CjoC,KAAKgc,UAAUuQ,cAAc,cAA6B8c,IAC1DrpC,KAAKqmB,QAAQ8iB,WAAa,IAC1BnpC,KAAKgc,UAAU0P,OAAO6d,GAAa,QA/HrB,CACd,IAAIvtB,EAAkChc,KAAKgc,UAE3C,MAAMsxB,EAA4B,UAAb3rC,EAAIC,KACzBm8B,EAAOuP,GAEP,MAAMhpB,EAAKipB,IACT,GAAGvtC,KAAKmG,MAAMxD,IACZ,OAGF,+BAAsD3C,KAAKmI,QAAQH,OAAQhI,KAAKmI,QAAQF,IAAKjI,KAAKmI,QAAQsF,OAAOC,cAEjH,MAAM8/B,EAAiB,KAClBD,IACD,iBAAwCvtC,KAAKmG,OAE1C,EAAA1D,YAAczC,KAAKmG,MAAM3B,WAC1BxE,KAAKmG,MAAM3B,UAAW,G,EAO5B,GAFAgpC,KAEIxxB,EACF,GAAGra,EAAI0F,kBAAmB,CAGxB,IAAIomC,EAFJztC,KAAKuT,UAAUxS,IAAI,mBAGnB,MAAM+G,EAAS,KACb,MAAMkU,EAAYisB,GAA2B,GACvC/5B,GAAW,SACjBA,EAASw/B,UAAU,CAACC,KAAM,GAAIC,MAAO,MACrC1/B,EAAS+J,OAAM,KACbjY,KAAKmG,MAAM5B,QACX,sBAAwCN,EAAU,IAEpDiK,EAAS2/B,OAAS,KAChB3/B,EAAS2/B,OAAS,IAClB,MAAMroC,EAAM,IAAIsoC,MACftoC,EAAY5D,KAAO,WACpBsM,EAASmT,OAAO7b,EAAI,EAEtBwW,EAAU0P,OAAO6d,GAAa,EAAOr7B,GAErCu/B,EAAgBztC,KAAK2rC,iBAAiB,SAAS,KAC7Cz9B,EAAS2/B,QAAQ,GAChB,CAAC5/B,MAAM,IAEVu/B,GAAgB,EAOZO,EAAoB/tC,KAAK2rC,iBAAiB,OAAQ7jC,GACxD9H,KAAK4rC,aAAat9B,MAAK,KACrBtO,KAAK6R,eAAerP,OAAOurC,GAC3B/tC,KAAK6R,eAAerP,OAAOirC,EAAc,G,KAEtC,CACLzxB,EAAYisB,IAERsF,IACFvtC,KAAK4rC,cAAe,UAGtB,MAAMhpC,EAAO,KACX4qC,IAEA,MAAMr3B,EAAW,qBAAoC,CAACzQ,MAAO/D,IAS7D,OAPI4rC,GACFp3B,EAAS7H,MAAK,KACZtO,KAAK4rC,aAAaz9B,SAAS,IAI/B6N,EAAU0P,OAAO6d,GAAa,EAAOpzB,GAC9B,CAACA,WAAS,EAGnB6F,EAAUgyB,oBAAoBprC,GAC9BA,G,CAID5C,KAAKuT,UAAUqB,SAAS,mBACzB/K,EAAO6B,OAAO69B,GAEdvpC,KAAK0L,OAAO69B,GAGdvpC,KAAKuT,UAAUxS,IAAI,eAEnBf,KAAK4rC,aAAat9B,MAAK,KACrBtO,KAAKuT,UAAU/Q,OAAO,eACtB+mC,EAAYh2B,UAAUxS,IAAI,cAC1B2B,YAAW,KACT6mC,EAAY/mC,QAAQ,GACnB,KAIA,wBAAiDxC,KAAKmG,QACvDnG,KAAKmG,MAAM1B,OACX,sBAAwCR,G,GAG1C,GAGU,QAAV,EAAAjE,KAAKmG,aAAK,eAAExD,OACX2qC,EACDhpB,GAAE,IAEF,QAAiBza,GAAQ,KACvBya,GAAE,EAAK,GACN,CAACrW,MAAM,EAAM+G,SAAS,EAAMiN,SAAS,EAAOpQ,eAAgB7R,KAAK6R,iB,KAYxE85B,uBACF,OAAO3rC,KAAK6R,eAAe9Q,IAAIf,KAAKmG,MACtC,CAEA8nC,uBACEvrC,YAAW,KACN1C,KAAKkuC,cAILluC,KAAKktC,mBACNltC,KAAKktC,mBACLltC,KAAKktC,iBAAmB,MAGvBltC,KAAK4rC,cACN5rC,KAAK4rC,aAAavqB,SAGjBrhB,KAAK6R,iBACN7R,KAAK6R,eAAeC,YACpB9R,KAAK6R,eAAiB,MAGrB7R,KAAKgc,YACNhc,KAAKgc,UAAY,M,GAElB,IACL,EAGFmyB,eAAeC,OAAO,gBAAiBpF,E,6GC3sBxB,MAAMqF,UAAoE,IAIvFtuC,YAAY8tB,GACV3b,MAAM,OAAD,wBACA2b,GAAO,CACVygB,SAAU,CAAC7F,EAAQz3B,EAAOJ,KACxB,GAAG5Q,KAAKgI,OAAOo4B,cAAgBpvB,EAAO,OAAOoQ,QAAQjT,QAAQ,CAACijB,MAAO,EAAGzC,MAAO,KAE/E,MAAMsC,EAAQwX,aAAM,EAANA,EAAQ8F,QACtB,OAAOvuC,KAAKiH,SAASunC,iBAAiBC,cAAczuC,KAAKgI,OAAQipB,EAAOrgB,GAAWtC,MAAM5B,IACvF,MAAMiiB,EAAQjiB,EAAMgiC,OAAO5zB,KAAKyzB,IACvB,CAACrsC,QAAS,KAAqBqsC,cAGxC,MAAO,CAACnd,MAAO1kB,EAAM0kB,MAAOzC,QAAM,GAClC,KAIN3uB,KAAK2uC,aAAc,EACnB3uC,KAAKgI,OAAS6lB,EAAQ7lB,MACxB,E,kCCnBa,MAAM4mC,UAA6B,IAGhD7uC,YAAYiI,GACVkK,MAAM,IAAIm8B,EAAiB,CAACrmC,SAAQf,SAAUgX,EAAA,aAAsB,IAmBtE,KAAA3L,YAAejS,IACbL,KAAKuS,UAAUlS,EAAOkuC,QAASluC,EAAO6B,SAAU,EAAE,EAGpD,KAAAuQ,YAAepS,IACbL,KAAKuS,UAAUlS,EAAOkuC,QAASluC,EAAO6B,QAAS,EAAE,EAGnD,KAAAkR,gBAAkB,KAChB8Y,EAAA,iBAAkC,CAChCxmB,MAAO1F,KAAKK,OAAOy4B,MACnBzlB,QAASwe,EAAA,uCACT,EA7BF7xB,KAAKgI,OAASA,EAEdhI,KAAKoU,iBAAiB,CAAC,CACrBL,KAAM,WACNC,KAAM,+BACNC,QAASjU,KAAKoT,mBAShBpT,KAAKqU,cACP,CAiBa9B,UAAUg8B,EAA4BluC,EAAsBmV,EAAY,EAAGC,EAAgDC,G,yGACtI,GAAG1V,KAAK2V,gBAAiB,OAAO3V,KAAK2V,gBAErC,MAAMmjB,QAAc94B,KAAKiH,SAASunC,iBAAiBK,SAASN,GACtDzpB,EAAM,EAAMvO,WAAU,UAACuiB,EAAOA,EAAMtiB,KAAMxW,KAAKgI,OAAQwN,EAAWnV,GAAQ,EAAOoV,EAAaC,GAIpG,OAHA1V,KAAKK,OAAOkuC,QAAUzV,EAAMlxB,GAC5B5H,KAAKK,OAAOy4B,MAAQA,EAEbhU,CACT,E,wmBC1CF,MAAMgqB,EAAiB,EAAE9mC,SAAQiL,eAC/B,IAAImd,EAAQ,gCAAkCpoB,EAAS,KACpDiL,IACDmd,GAAS,oBAAsBnd,EAAW,MAG3CiG,MAAMC,KAAK9N,SAASoN,iBAAiB2X,IAA4BrrB,SAASwjC,IAEzEA,EAAK9J,QAAQ,GACb,EAUG,SAAesQ,EACpB1uC,EACA2H,EACAqrB,EACAlrB,EACAsN,EACAC,G,yCAEA,IAAIojB,QAAc7a,EAAA,0CAAkDjW,GACpE,IAAIqrB,MAAiByF,EACnB,OAGF,MAAMkW,EAAY,IACH91B,MAAMC,KAAK9Y,EAAOoY,iBAAiB,QAAQ/X,MAAM8pB,IAASA,EAAIjX,UAAUqB,SAAS,WAChFvU,EAAS,KAGzB,GAAG2H,EAAOo4B,YAAa,CACrB,MAAM6O,IAAe9mC,EACfiK,EAAc,gCACpB,IAAIjK,IACFA,QAAgB8V,EAAA,wCAAgD,CAC9DjW,SACAoK,YAAa,CAACxC,EAAGwC,GACjB6e,MAAO,EACPC,MAAO,IACN5iB,MAAM5B,GAGAA,EAAMohB,QAAQ,MAGnBuF,KACF,OAIJ,GAAGlrB,EAAS,CAEWA,EAAQ+D,OAAO4sB,MACpBlxB,KAAOkxB,EAAMlxB,KACvBqnC,IACF9mC,EAAU8V,EAAA,wDAAgEjW,EAAQ8wB,KAMtF,MAAM+L,EAAKmC,GAA4BA,EAAIlsB,KAAKla,IAAO,CACrDsB,QAAStB,EAAGsB,QACZ+F,IAAMrH,EAAGoC,KAAgCiF,IACzCD,OAASpH,EAAGoC,KAAgCgF,WAU9C,YAPA,IAAI,KACHuI,iBAAiB,CAChBvI,SACAoK,YAAa,CAACxC,EAAGwC,KAElBG,UAAUpK,EAAS6mC,SAAa/qC,OAAWA,EAAWwR,EAAcovB,EAAEpvB,QAAexR,EAAWyR,EAAcmvB,EAAEnvB,QAAezR,E,EAMpI,GAAG60B,EAAO,GACJ,EAAAoW,EAAA,GAAS/mC,IAAYA,IACvB2wB,QAAc7a,EAAA,qCAA6C9V,IAG7D,MAAM08B,EAAKmC,GAA4BA,EAAIlsB,KAAKla,IAAO,CACrDsB,QAAStB,EAAGsB,QACZqsC,QAAS3tC,EAAGoC,SAGd,IAAI4rC,EAAqB5mC,GAAQuK,UAC/BumB,EAAMlxB,GACNonC,SACA/qC,EACAwR,EAAcovB,EAAEpvB,QAAexR,EAC/ByR,EAAcmvB,EAAEnvB,QAAezR,E,CAGrC,G,CA3FAga,EAAA,mBAA2B,gBAAiB6wB,GAC5C7wB,EAAA,mBAA2B,mBAAyBkxB,GAAS,2CAChDlxB,EAAA,4CAAoDkxB,EAAKnnC,UAClE8mC,EAAeK,EAEnB,MAwFA,MAAMC,EAA6C,IAAI7tC,IACjD8tC,EAAoB,IAAIjuC,IAE9B,SAASkuC,EAAkBtnC,EAAgBiL,GACzC,OAAOjL,GAAUiL,EAAW,IAAMA,EAAW,GAC/C,CAEe,MAAMs8B,UAAsB/rC,YAazCzD,cACEmS,QANM,KAAAs9B,cAAe,EAOrBxvC,KAAKuT,UAAUxS,IAAI,eACnBf,KAAKyvC,kBAAmB,QAC1B,CAEAxB,uB,MAGE,MAAMzhC,EAAM8iC,EAAkBtvC,KAAKgI,OAAQhI,KAAKiT,UAC1CrP,EAAMwrC,EAAUnsC,IAAIuJ,IACvB5I,aAAG,EAAHA,EAAKP,IAAIrD,SACV4D,EAAI3C,OAAOjB,MACP4D,EAAIiE,MACNunC,EAAUnuC,OAAOuL,IAIH,QAAlB,EAAAxM,KAAKqe,qBAAa,SAAEpd,OAAO,CAAC6pB,IAAK9qB,MACnC,CAEO0vC,mBACL,IAAI7jB,GAAU,GACd,QAAiB7rB,MAAY+H,GAAM,kCAEjC,IADA,EAAAqS,EAAA,GAAYrS,GACT8jB,EAAS,OACZ,MAAM7jB,EAAShI,KAAKgI,OACpB6jB,GAAU,QACJkjB,EAAiB/uC,KAAMA,KAAKgI,QAAQ,IAAMhI,KAAKgI,SAAWA,IAChE6jB,GAAU,CACZ,KACF,CAEO8jB,cAAc9hB,GACnB,IAAI,MAAMzJ,KAAKyJ,EAEb7tB,KAAKokB,GAAKyJ,EAAQzJ,EAEtB,CAEOiF,kBAAkBwE,G,MAUvB,MAAM+hB,EAAY5vC,KAAKgI,OACjB6nC,EAAc7vC,KAAKiT,SACzBjT,KAAK2vC,cAAc9hB,GACnB,MAAMiiB,EAAY9vC,KAAKgI,OACjBiL,EAAWjT,KAAKiT,SAEtB,GAAG28B,IAAcE,GAAaD,IAAgB58B,EAC5C,OAWF,GARAjT,KAAKqmB,QAAQre,OAAS,GAAK8nC,EAExB78B,EACDjT,KAAKqmB,QAAQpT,SAAW,GAAKA,EACrB48B,UACD7vC,KAAKqmB,QAAQpT,SAGnB28B,EAAW,CACZ,MAAMpjC,EAAM8iC,EAAkBM,EAAWC,GACnCjsC,EAAMwrC,EAAUnsC,IAAIuJ,GACvB5I,IACDA,EAAI3C,OAAOjB,MACP4D,EAAIiE,MACNunC,EAAUnuC,OAAOuL,G,CAKvB,MAAM6mB,EAAgC,QAAnB,EAAAxF,EAAQkiB,mBAAW,eAAE1c,WAQxC,OAPArzB,KAAKyvC,iBAAiB1rC,UACnBsvB,EACDrzB,KAAKyvC,iBAAmBpc,EAAW2c,SAEnChwC,KAAKyvC,iBAAiB1rC,UAGjB/D,KAAKy+B,QACd,CAEOj8B,SACLxC,KAAKyvC,iBAAiB1rC,UACtBmO,MAAM1P,QACR,CAEQ8hB,EAAE2rB,GAAY,GACpB,MAAM1hC,GAAU,EAAA2hC,EAAA,GAAS,CACvBplB,IAAK9qB,KACLgI,OAAQhI,KAAKgI,OACby/B,SAAUznC,KAAKynC,SACf14B,MAAO/O,KAAKspB,UACZ2mB,YACAE,MAAOnwC,KAAKmwC,MACZl9B,SAAUjT,KAAKiT,SACf88B,YAAa,OAAF,QACT1c,WAAYrzB,KAAKyvC,iBAAiBxsC,OAC9BjD,KAAK+vC,aAAe,CAAC,KAa7B,OARG/vC,KAAK0zB,eACN1zB,KAAK0zB,aAAarxB,KAAKkM,GAEvBA,EAAQ4J,SAAQ,KACdnY,KAAK0zB,kBAAezvB,CAAS,KAI1BsK,CACT,CAEOkwB,SACL,GAAGz+B,KAAKqe,cAAe,CACrB,IAAIgxB,EAAKhsC,IAAIrD,KAAKgI,QAAS,CACzB,GAAGhI,KAAKwvC,aAAc,OACtBxvC,KAAKwvC,cAAe,EAEpB,MAAMhjC,EAAM8iC,EAAkBtvC,KAAKgI,OAAQhI,KAAKiT,UAChD,IAAIrP,EAAMwrC,EAAUnsC,IAAIuJ,GAexB,OAdI5I,GACFwrC,EAAUxrC,IAAI4I,EAAK5I,EAAM,IAAIxC,KAG/BwC,EAAI7C,IAAIf,MAERA,KAAKqe,cAAchc,KAAK,CACtByoB,IAAK9qB,KACL4C,KAAM,KACJysC,EAAKtuC,IAAIf,KAAKgI,QACPhI,KAAKy+B,YAITz+B,KAAKskB,GAAE,E,CACNtkB,KAAKwvC,cACbxvC,KAAKqe,cAAcpd,OAAO,CAAC6pB,IAAK9qB,M,CAIpCqvC,EAAKtuC,IAAIf,KAAKgI,QAEd,MAAMuG,EAAUvO,KAAKskB,IAElBtkB,KAAKwvC,cACNjhC,EAAQ4J,SAAQ,KACdnY,KAAKwvC,cAAe,CAAK,IAI7B,MAAMhjC,EAAM8iC,EAAkBtvC,KAAKgI,OAAQhI,KAAKiT,UAC1CrP,EAAMwrC,EAAUnsC,IAAIuJ,GAC1B,GAAG5I,EAAK,CACNA,EAAI3C,OAAOjB,MACX,MAAMgnC,EAAM9tB,MAAMC,KAAKvV,GACvBwrC,EAAUnuC,OAAOuL,GAEjB,IAAI,IAAI4X,EAAI,EAAGvhB,EAASmkC,EAAInkC,OAAQuhB,EAAIvhB,IAAUuhB,EAChD4iB,EAAI5iB,GAAGqa,Q,CAIX,OAAOlwB,CACT,EAGF4/B,eAAeC,OAAO,iBAAkBmB,E,gFCpTzB,MAAMa,EAKnBrwC,YAAY0wB,EAAuE5C,GACjF7tB,KAAKoL,UAAYC,SAASC,cAAc,OACxCtL,KAAKoL,UAAUmI,UAAUxS,IAAI,eAE7Bf,KAAKsD,OAAS+H,SAASC,cAAc,UACrCtL,KAAKsD,OAAOiQ,UAAUxS,IAAI,sBAE1Bf,KAAK+T,KAAO1I,SAASC,cAAc,QACnCtL,KAAK+T,KAAKR,UAAUxS,IAAI,QAAS,mBAEjCf,KAAKoL,UAAUM,OAAO1L,KAAKsD,OAAQtD,KAAK+T,OAExC,QAAiB/T,KAAKoL,WAAW,KAC/B,gBAAyB,IAAayiB,GAASzC,KAAKprB,KAAKsD,OAAQmtB,EAAS,GAE9E,CAEOjP,QACOxhB,KAAKsD,OAAOoiB,WAAW,MAC/B2qB,UAAU,EAAG,EAAGrwC,KAAKsD,OAAOggB,MAAOtjB,KAAKsD,OAAOogB,OACrD,E,uECjBa,SAAS4sB,EAAgCj1B,EAAmBwS,EAAa,CAAC,GACvF,MAAMvX,EAASjL,SAASC,cAAcuiB,EAAQ0iB,OAAS,IAAO1iB,EAAQ2iB,MAAQ,MAAQ,UAuBtF,OAtBAl6B,EAAO+E,UAAYA,GAAawS,EAAQ9Z,KAAO,UAAY8Z,EAAQ9Z,KAAO,IAEtE8Z,EAAQ7O,WACP6O,EAAQ4iB,cACTn6B,EAAO/C,UAAUxS,IAAI,cAGvB,OAAOuV,IAGNuX,EAAQnP,YACTpI,EAAO/C,UAAUxS,IAAI,kBAGpB8sB,EAAQ6iB,UACTp6B,EAAO3I,aAAa,WAAY,QAG/BkgB,EAAQ7Z,MACTsC,EAAO5K,QAAO,QAAKmiB,EAAQ7Z,OAGtBsC,CACT,C,6DCrCA,MAKA,EALqB,CAACuX,EAAwG,CAAC,KAC9G,OAAO,mCAAqCA,EAAQxS,UAAY,IAAMwS,EAAQxS,UAAY,IAAKwS,E,6DCDhH,MASA,EATmB,CAACxS,EAAoBwS,EAAuE,CAAC,KAC/F,OAAO,WAAY,OAAF,QAC9B9Z,KAAMsH,QAAapX,GAChB4pB,G,kLCoCP,SAAS8iB,EAAe9iB,GACtB,GAAGA,EAAQ3rB,QAAS,MAAO,CAAC2rB,EAAQ+iB,UAA0B/iB,EAAQ3rB,SAASk3B,OAAOC,SAEtF,MAAM,KAACtlB,EAAI,QAAE88B,EAAO,KAAE78B,EAAI,QAAEC,EAAO,cAAEszB,EAAa,wBAAEuJ,GAA2BjjB,EACzEjtB,EAAKyK,SAASC,cAAc,OAClC1K,EAAGya,UAAY,6BAA+BtH,EAAO,UAAYA,EAAO,IAErE,EAAA6G,YACD,OAAOha,GAGT,IAAImwC,EAAcljB,EAAQkjB,YAQ1B,GAPIA,IACFA,EAAcljB,EAAQkjB,YAAc/8B,GAAO,QAAKA,EAAM6Z,EAAQmjB,UAAY3lC,SAASC,cAAc,QAC9FuiB,EAAQ7S,cACT,OAAa+1B,EAAaljB,EAAQ7S,cAInC61B,EAAS,CACV,MAAMI,EAAc5lC,SAASC,cAAc,QAC3C2lC,EAAY19B,UAAUxS,IAAI,sBAC1BH,EAAG8K,OAAOulC,GAEVpjB,EAAQjD,aAAc,OAAU,CAC9Bxf,UAAW6lC,EACXnY,MAAO+X,EACPpY,SAAU,GACVC,UAAW,GACXE,kBAAkB,EAClBsY,UAAU,EACVnY,QAAQ,EACRoY,WAAazpC,GACJ0pC,MAAM1pC,GACZ4G,MAAM+iC,GAAaA,EAASr9B,SAC5B1F,MAAM0F,IACL,MAAMs9B,EAAQ,gBAA6B,sBAErChH,GADM,IAAIiH,WAAYC,gBAAgBx9B,EAAM,iBAClCuB,kBAMhB,OALA+0B,EAAI7xB,iBAAiB,QAAQ1T,SAAS4f,IACpCA,EAAK8B,eAAe,KAAM,OAAQ6qB,GAClC3sB,EAAKpZ,MAAMkmC,OAASH,EACpB3sB,EAAKpZ,MAAMmmC,YAAc,OAAO,KAE3B,OAAapH,EAAI5jB,UAAU,MAGrCpY,MAAMwW,GAAQA,EAAI4O,aAAarkB,O,CAGpC0hC,EAAYx9B,UAAUxS,IAAI,sBAC1BH,EAAG8K,OAAOqlC,GAEV,MAAMY,IAAapK,KAAmB1Z,EAAQ8jB,SAgD9C,OA7CA19B,IAAW,QAAiBrT,GAAiEmH,I,OAC3F,OAAYA,GAEZ,MAAM6pC,GAAO,OAAgB7pC,EAAE1H,OAAQ,YACpCuxC,IAASA,EAAKr+B,UAAUqB,SAAS,YAepCX,EAAQlM,IACyB,KAAT,QAArB,EAAA8lB,EAAQgkB,qBAAa,0BAIpBF,GACF,YAGCpK,IAAkBuJ,IACnBvJ,EAAc3B,QAAuC,UAA7B2B,EAAcxW,MAAMnvB,OAA2B2lC,EAAc3B,U,GAEtE/X,EAAQA,SAExB0Z,GACD3mC,EAAG8K,OAAO67B,EAAcC,QAGD,IAAtB3Z,EAAQ+iB,YACT/iB,EAAQ+iB,UAAYvlC,SAASC,cAAc,OAG1CuiB,EAAQikB,WACTlxC,EAAG2S,UAAUxS,IAAI,gBAGZ,CAAC8sB,EAAQ+iB,UAA0B/iB,EAAQ3rB,QAAUtB,GAAIw4B,OAAOC,QACzE,CAEO,SAAS0Y,GAAe,eAAClgC,EAAc,QAAEgC,IAI9C,MAAMjT,EAAkByK,SAASC,cAAc,OAC/C1K,EAAG2S,UAAUxS,IAAI,YAEd8Q,GACDgC,EAAQ9O,SAASitC,IACZA,EAAEnkB,QACHmkB,EAAEnkB,QAAQhc,eAAiBA,EAE3BmgC,EAAEnkB,QAAU,CAAChc,iB,IAKnB,MAAM8c,EAAQ9a,EAAQiH,IAAI61B,GAG1B,OAFA/vC,EAAG8K,WAAU,OAAQijB,IAEd/tB,CACT,CAEe,SAAeqxC,EAAWpkB,G,qCACvC,MAAMjtB,EAAKmxC,EAAelkB,GAE1B,aADMzM,QAAQgI,IAAIyE,EAAQha,QAAQiH,KAAI,EAAE8P,iBAAiBA,KAClDhqB,CACT,E,0aClKO,SAASsxC,GAAwB,GACtCtxC,EAAE,OACFsa,EAAM,QACN2S,EAAO,QACP1S,MAOY0S,aAAO,EAAPA,EAAShc,gBAAiBgc,EAAQhc,eAAe9Q,IAAIH,GAAMA,EAAGgN,iBAAiB0M,KAAK1Z,IAE5F,MAAmBmH,IACrB,IAAInH,EAAG2S,UAAUqB,SAAS,mBAAoB,OAAO,EAIrD,IAFA,OAAY7M,GAETnH,EAAG2S,UAAUqB,SAAS,aACvB,gBACK,CACL,MAAMk1B,EAAS5uB,aAAM,EAANA,EAASnT,GAClBqjB,EAAO,KACX,MAAM+mB,EAAavxC,EAAGgX,cAAc,aACpC,gBAAkCu6B,EAAYh3B,EAAQ,EAGrD2uB,aAAkB1oB,QACnB0oB,EAAOx7B,KAAK8c,GAEZA,G,IAIR,CAEe,SAASgnB,GAAiB,cACvClxB,EACArP,eAAgBwgC,EAAoB,UACpCjnC,EAAS,UACT+V,EAAS,QACTtN,EAAO,aACPy+B,EAAY,OACZp3B,EAAM,QACNC,EAAO,aACPo3B,IAYGrxB,IACDA,EAAcsvB,OAAQ,GAGxB,MAAMl6B,EAASlL,QAAAA,GAAa,OAAW,OAAQ8V,GAC/C5K,EAAO/C,UAAUxS,IAAI,mBAErB,MAAM8Q,EAAiB,IAAI,IAE3B,IAAI3P,EAAsBswC,EA6C1B,OA5CAN,EAAwB,CACtBtxC,GAAI0V,EACJ4E,OAAcnT,IAAM,O,EAAD,K,OAAA,E,EAAA,YAEjB,SADMuqC,aAAY,EAAZA,EAAevqC,GAClByqC,EAGD,OAFA/+B,aAAa++B,QACbA,OAAevuC,GAIjB,MAEMwuC,QAFKT,EAEqBn+B,GAFQ,OAAYm+B,GAAI17B,IAAU,QAAC,OAAkB,QAAlB,EAAc,QAAd,EAAAA,aAAM,EAANA,EAAQ/N,cAAM,8BAAI,QAAQ,KAAnF,IAACypC,EAGX,IAAIS,EAAgB5vC,OAClB,OAGF,MAAM6vC,EAAWxwC,QAAgB,OAAW,CAC1C2R,QAAS4+B,EACT5gC,mBAEF6gC,EAASn/B,UAAUxS,IAAIogB,SAEjBjG,aAAM,EAANA,EAASnT,EAAG2qC,GAElBp8B,EAAO5K,OAAOgnC,SACR,SACR,E,YAzBmB,K,6QAyBlB,EACD7kB,QAAS,CACPhc,eAAgBwgC,GAElBl3B,QAAS,KACPA,SAAAA,IAEAq3B,EAAe9+B,OAAOhR,YAAW,KAC/B6vC,SAAAA,IACAC,OAAevuC,EACf4N,EAAeC,YACf+B,EAAQ9O,SAASuR,GAAWA,EAAOpU,aAAU+B,IAC7C/B,EAAQM,QAAQ,GACf,IAAI,IAIJ8T,CACT,C,uECnHe,MAAMq8B,EA8CnB5yC,cA7CiB,KAAA6yC,OAJL,GAKK,KAAAC,QALL,GAQK,KAAAC,OAAS,GACT,KAAAC,aAAe,GAGf,KAAAC,OAAS,CACxB,EAAG,IAAM,GAAM,IAAM,EAAG,IAAK,EAAG,IAAK,EAAG,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,GAAI,GACvE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,GAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,GAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,IAGzD,KAAAC,WAAa,CAC5B,CAAC/rB,EAAG,GAAMC,EAAG,IACb,CAACD,EAAG,GAAMC,EAAG,IACb,CAACD,EAAG,IAAMC,EAAG,KACb,CAACD,EAAG,IAAMC,EAAG,IACb,CAACD,EAAG,GAAMC,EAAG,IACb,CAACD,EAAG,GAAMC,EAAG,IACb,CAACD,EAAG,IAAMC,EAAG,KACb,CAACD,EAAG,IAAMC,EAAG,KAEE,KAAA+rB,QAAUlzC,KAAKizC,WAAWpwC,OAiGnC,KAAAib,QAAW/V,IACd/H,KAAKmzC,2BAIRnzC,KAAKozC,cAAgBrrC,EAAEiW,YACC/Z,IAArBjE,KAAKqzC,cACNrzC,KAAKqzC,YAActL,sBAAsB/nC,KAAKszC,c,EAU1C,KAAAA,YAAc,KACpB,MAAM5mC,EAAQ1M,KAAKozC,aAAepzC,KAAK+yC,aACvC/yC,KAAKozC,cAAgBpzC,KAAK+yC,aAC1B,MAAM9qB,EAAOvb,EAAQ,EAAIlG,KAAK+sC,MAAM7mC,GAASlG,KAAKgtC,KAAK9mC,GACpDub,GACDjoB,KAAKyzC,kBAAkBxrB,GAEzBjoB,KAAKqzC,iBAAcpvC,CAAS,EAGtB,KAAAyvC,yBAA4BC,I,MAClC,IAAIhG,EAAe/lC,EACnB,GAAG+rC,EAAa,CACd,MAAMjnC,EAAQinC,IACdhG,EAAOjhC,GAAS,EAChB,MAAMknC,GAA0C,GCpKrBrsB,EDoKc7a,ICnK5B6a,EAAI,GDoKXssB,EAAyC,QAAtB,EAAA7zC,KAAK8zC,yBAAiB,QAAI,EAE7C7rB,GADOjoB,KAAK8zC,kBAAoB9zC,KAAK+zC,mBAAqBH,GAC5CC,EACjB5rB,IACDjoB,KAAKg0C,mBAAqB/rB,EAC1BjoB,KAAKyzC,kBAAkBxrB,G,KAEpB,CACL,MAAMgsB,EAASj0C,KAAKk0C,QACpBtsC,EAAKqsC,EAAO5iB,QACZsc,GAAQsG,EAAOpxC,M,CC/Kd,IAA0B0kB,ED6L7B,OAXG3f,GACD5H,KAAKm0C,cAAcvsC,GAGlB+lC,IACD3tC,KAAKg0C,uBAAoB/vC,EACzBjE,KAAK+zC,wBAAqB9vC,EAC1BjE,KAAK8zC,uBAAoB7vC,EACzBjE,KAAKmzC,8BAA2BlvC,IAG1B0pC,CAAI,EArIZ,MAAM1lB,EAAOjoB,KAAK8yC,OAAS9yC,KAAKgzC,OAAOhzC,KAAKgzC,OAAOnwC,OAAS,GAE5D,IAAI,IAAIuhB,EAAI,EAAGvhB,EAAS7C,KAAKgzC,OAAOnwC,OAAQuhB,EAAIvhB,IAAUuhB,EACxDpkB,KAAKgzC,OAAO5uB,GAAKpkB,KAAKgzC,OAAO5uB,GAAK6D,EAGpCjoB,KAAKo0C,kBAAoBp0C,KAAKgzC,OAAOl4B,KAAI,CAACyM,EAAGnD,EAAG4iB,K,MAC9C,OAAOzf,GAAe,QAAV,EAAAyf,EAAI5iB,EAAI,UAAE,QAAI,EAAE,GAEhC,CAEQiwB,SAASC,GACf,MAAMxK,GAAS,QAASwK,GACxB,MAAO,CAAChwB,EAAGwlB,EAAO,GAAIyK,EAAGzK,EAAO,GAAIkI,EAAGlI,EAAO,GAChD,CAEQ0K,aAAanjB,GACnB,MAAMojB,EAAYz0C,KAAKizC,WAAW3b,QAClCmd,EAAUpyC,QAAQoyC,EAAUnmB,OAAO,EAAG+C,IAEtC,MAAMyY,EAA2B,GACjC,IAAI,IAAI1lB,EAAI,EAAGA,EAAIqwB,EAAU5xC,OAAQuhB,GAAK,EACxC0lB,EAAOznC,KAAKoyC,EAAUrwB,IAExB,OAAO0lB,CACT,CAEQ4K,iBAAiBC,EAAeC,EAAkBC,GACxD,MAAMC,EAAM90C,KAAKw0C,aAAaG,GAC9B,IAAIE,EAAM,IAAuB,IAAjBA,EAAMhyC,OACpB,MAAO,CAACiyC,GAGV,MACMC,EADU/0C,KAAKw0C,eAAeG,EAAQ30C,KAAKkzC,SACvBp4B,KAAI,CAACk6B,EAASjsC,KAC/B,CACLme,GAAI8tB,EAAQ9tB,EAAI4tB,EAAI/rC,GAAKme,GAAK0tB,EAC9BztB,GAAI6tB,EAAQ7tB,EAAI2tB,EAAI/rC,GAAKoe,GAAKytB,MAalC,OATkBC,EAAM/5B,KAAKpO,GACpBqoC,EAAUj6B,KAAI,CAACm6B,EAAUlsC,KACvB,CACLme,EAAG4tB,EAAI/rC,GAAKme,EAAI+tB,EAAS/tB,EAAIxa,EAC7Bya,EAAG2tB,EAAI/rC,GAAKoe,EAAI8tB,EAAS9tB,EAAIza,OAMrC,CAEQwoC,YAAYP,EAAeQ,GAEjC,OADkBn1C,KAAK00C,iBAAiBC,EAAO30C,KAAK8yC,OAAQ,CAACqC,IAC5C,EACnB,CAEQC,WAAWntB,GAGjB,IAFAjoB,KAAKq1C,OAASptB,EAERjoB,KAAKq1C,OAASr1C,KAAK8yC,QACvB9yC,KAAKq1C,OAASr1C,KAAK8yC,SACd9yC,KAAKs1C,QAAUt1C,KAAKkzC,UACvBlzC,KAAKs1C,QAAUt1C,KAAKkzC,SAIxB,KAAMlzC,KAAKq1C,MAAQ,GACjBr1C,KAAKq1C,OAASr1C,KAAK8yC,SACd9yC,KAAKs1C,OAAS,IACjBt1C,KAAKs1C,QAAUt1C,KAAKkzC,QAG1B,CAaQO,kBAAkBxrB,GACxBjoB,KAAKo1C,WAAWntB,GAChB,MAAMstB,EAASv1C,KAAKk1C,YAAYl1C,KAAKs1C,OAAQt1C,KAAKq1C,OAClDr1C,KAAKw1C,aAAaD,EACpB,CA6CQE,qBAAqBhB,GAC3B,MAAM7sC,EAAK5H,KAAK01C,MAAMC,gBAAgB31C,KAAK4yC,OAAQ5yC,KAAK6yC,SAClD+C,EAAShuC,EAAGunC,KAElB,IAAIjV,EAAS,EACb,IAAI,IAAI/S,EAAI,EAAGA,EAAInnB,KAAK6yC,UAAW1rB,EAAG,CACpC,MACM0uB,EADe1uB,EAAInnB,KAAK6yC,QACS,GACjCiD,EAAmBD,EAAkBA,EAE3C,IAAI,IAAI3uB,EAAI,EAAGA,EAAIlnB,KAAK4yC,SAAU1rB,EAAG,CACnC,MAEM6uB,EAFe7uB,EAAIlnB,KAAK4yC,OAES,GAGjCoD,EAAc,IAFGxvC,KAAKyvC,KAAKF,EAAkBA,EAAkBD,GAG/DI,EAAQF,EAAcA,EAAc,GAAM,EAC1CG,EAAW3vC,KAAK4vC,IAAIF,GACpBG,EAAW7vC,KAAK8vC,IAAIJ,GAEpBK,EAAS/vC,KAAKC,IAAI,EAAKD,KAAKI,IAAI,EAAK,GAAMmvC,EAAkBM,EAAWR,EAAkBM,IAC1FK,EAAShwC,KAAKC,IAAI,EAAKD,KAAKI,IAAI,EAAK,GAAMmvC,EAAkBI,EAAWN,EAAkBQ,IAEhG,IAAII,EAAc,EAEdnyB,EAAI,EACJiwB,EAAI,EACJvC,EAAI,EAER,IAAI,IAAI5tB,EAAI,EAAGA,EAAIpkB,KAAK02C,QAAQ7zC,OAAQuhB,IAAK,CAC3C,MAGMuyB,EAAYJ,EAHH9B,EAAUrwB,GAAG8C,EAItB0vB,EAAYJ,EAHH/B,EAAUrwB,GAAG+C,EAK5B,IAAI8tB,EAAWzuC,KAAKC,IAAI,EAAK,GAAMD,KAAKyvC,KAAKU,EAAYA,EAAYC,EAAYA,IACjF3B,GAAWA,EAAWA,EAAWA,EACjCwB,GAAexB,EAEf3wB,GAAK2wB,EAAWj1C,KAAK02C,QAAQtyB,GAAGE,EAAI,IACpCiwB,GAAKU,EAAWj1C,KAAK02C,QAAQtyB,GAAGmwB,EAAI,IACpCvC,GAAKiD,EAAWj1C,KAAK02C,QAAQtyB,GAAG4tB,EAAI,G,CAGtC4D,EAAO1b,KAAY5V,EAAImyB,EAAc,IACrCb,EAAO1b,KAAYqa,EAAIkC,EAAc,IACrCb,EAAO1b,KAAY8X,EAAIyE,EAAc,IACrCb,EAAO1b,KAAY,G,EAGvB,OAAOtyB,CACT,CAEQusC,cAAcvsC,GACpB5H,KAAK01C,MAAMmB,aAAajvC,EAAI,EAAG,GAC/B5H,KAAK82C,KAAK9wB,UAAUhmB,KAAK+2C,IAAK,EAAG,EAAG/2C,KAAK4yC,OAAQ5yC,KAAK6yC,QACxD,CAEQ2C,aAAaf,GACnBz0C,KAAKm0C,cAAcn0C,KAAKy1C,qBAAqBhB,GAC/C,CAwBOjiB,KAAK5xB,GACVZ,KAAKk0C,QAAU,GACfl0C,KAAKs1C,OAAS,EACdt1C,KAAKq1C,MAAQ,EACbr1C,KAAKozC,aAAe,OACInvC,IAArBjE,KAAKqzC,cACN2D,qBAAqBh3C,KAAKqzC,aAC1BrzC,KAAKqzC,iBAAcpvC,GAGrB,MAAMgzC,EAASr2C,EAAGkU,aAAa,eAAeqP,MAAM,KAAKjT,UACzDlR,KAAK02C,QAAUO,EAAOn8B,KAAKw2B,GAClBtxC,KAAKq0C,SAAS/C,KAGnBtxC,KAAK+2C,MACP/2C,KAAK+2C,IAAM1rC,SAASC,cAAc,UAClCtL,KAAK+2C,IAAIzzB,MAAQtjB,KAAK4yC,OACtB5yC,KAAK+2C,IAAIrzB,OAAS1jB,KAAK6yC,QACvB7yC,KAAK01C,MAAQ11C,KAAK+2C,IAAIrxB,WAAW,KAAM,CAACwxB,OAAO,KAGjDl3C,KAAKm3C,QAAUv2C,EACfZ,KAAK82C,KAAO92C,KAAKm3C,QAAQzxB,WAAW,KAAM,CAACwxB,OAAO,IAClDl3C,KAAKy+B,QACP,CAEOA,SACL,GAAGz+B,KAAK02C,QAAQ7zC,OAAS,EAAG,CAC1B,MAAMyuC,EAAQtxC,KAAK02C,QAAQ,GAG3B,OAFA12C,KAAK82C,KAAKM,UAAY,OAAO9F,EAAMhtB,MAAMgtB,EAAMiD,MAAMjD,EAAMU,UAC3DhyC,KAAK82C,KAAKO,SAAS,EAAG,EAAGr3C,KAAK4yC,OAAQ5yC,KAAK6yC,Q,CAI7C,MAAMiC,EAAM90C,KAAKk1C,YAAYl1C,KAAKs1C,OAAQt1C,KAAKq1C,OAC/Cr1C,KAAKw1C,aAAaV,EACpB,CAEOwC,eAAe3D,G,QACpB,GAAG3zC,KAAK02C,QAAQ7zC,OAAS,EACvB,OAGF,GAAG8wC,EAMD,OALA3zC,KAAKg0C,kBAAoBh0C,KAAK8yC,QAAgC,QAAtB,EAAA9yC,KAAKg0C,yBAAiB,QAAI,GAClEh0C,KAAK+zC,mBAAqB/zC,KAAKg0C,kBAC/Bh0C,KAAK8zC,uBAAoB7vC,EACzBjE,KAAKmzC,0BAA2B,OAChC,QAAcnzC,KAAK0zC,yBAAyBp5B,KAAKta,KAAM2zC,GAAc3zC,MAIvE,MAAMm1C,EAAOn1C,KAAKq1C,MACZkC,EAAQv3C,KAAK8yC,OAEnB,IAAI0E,EAEJ,MAAM3C,EAAkB,GACxB,IAAI,IAAIzwB,EAAI,EAAGvhB,EAAS7C,KAAKo0C,kBAAkBvxC,OAAQuhB,EAAIvhB,IAAUuhB,EAAG,CACtE,MAAMqzB,EAAMz3C,KAAKo0C,kBAAkBhwB,GACnC,IAAI1X,GAAqB,QAAZ,EAAAmoC,EAAMzwB,EAAI,UAAE,QAAI+wB,GAAQsC,GAEjC/qC,EAAMgrC,QAAQ,GAAKH,QAA4BtzC,IAAnBuzC,IAC9BA,EAAiBpzB,EACjB1X,GAAS6qC,GAGX1C,EAAMxyC,KAAKqK,E,CAMb,CAH0BmoC,EAAMvd,MAAM,EAAGkgB,QACCvzC,IAAnBuzC,EAA+B3C,EAAMvd,MAAMkgB,GAAkB,IAEhDzyC,SAAQ,CAAC8vC,EAAO9rC,EAAK4uC,KACvD,MAAMC,EAAO/C,EAAMA,EAAMhyC,OAAS,GAOlC,QANYoB,IAAT2zC,GAAsBA,EAAOL,IAC9B1C,EAAMA,EAAMhyC,OAAS,IAAM+0C,EAAKF,QAAQ,IAG1C13C,KAAKq1C,MAAQuC,QAAAA,EAAQ,GAEjB/C,EAAMhyC,OACR,OAGF,MAAM4xC,EAAYz0C,KAAK00C,iBAAiB10C,KAAKs1C,OAAQiC,EAAO1C,GACzD9rC,IAAS4uC,EAAO90C,OAAS,KACrB7C,KAAKs1C,QAAUt1C,KAAKkzC,UACvBlzC,KAAKs1C,QAAUt1C,KAAKkzC,SAIxB,MAAMjS,EAAMwT,EAAU35B,KAAKg6B,GAClB90C,KAAKy1C,qBAAqBX,KAGnC90C,KAAKk0C,QAAQ7xC,QAAQ4+B,EAAI,IAG3BjhC,KAAKmzC,0BAA2B,GAChC,QAAcnzC,KAAK0zC,yBAA0B1zC,KAC/C,CAIO63C,cAAc/vB,GAcrB,CAEOpM,UACL1b,KAAK63C,eAAc,EAErB,CAEOphC,oBAAoBwgC,GACzB,MAAM3zC,EAAS+H,SAASC,cAAc,UAOtC,OANAhI,EAAOggB,MAjZG,GAkZVhgB,EAAOogB,OAlZG,QAmZIzf,IAAXgzC,IACD3zC,EAAO+iB,QAAQ4wB,OAASA,GAGnB3zC,CACT,CAEOmT,cAAcwgC,GACnB,MAAM3zC,EAAStD,KAAK83C,aAAab,GAC3Bc,EAAmB,IAAIpF,EAG7B,OAFAoF,EAAiBvlB,KAAKlvB,GAEf,CAACy0C,mBAAkBz0C,SAC5B,E,0lBElYF,MAAM00C,EAAoBl9B,GACjB,IAAIA,EAAIgtB,UAAUmQ,QAAO,CAACC,EAAK3wB,IAAM2wB,EAAM3wB,EAAE1f,MAAM,GAK5D,MAAMswC,UAAqB,IA+BzBp4C,YAAY8tB,GAWV3b,OAAM,GAvCD,KAAAkmC,aAAyC,IAAI72C,IAC7C,KAAAwwB,aAAc,EA6Fb,KAAAsmB,YAAetwC,IAErB,MAAM7F,GAAU,EAAAqb,EAAA,GAAgBxV,EAAE1H,OAAQL,KAAKs4C,uBAC/C,GAAgB,IAAbvwC,EAAEuO,OACH,OAGF,GAAGtW,KAAKu4C,eAAiBv4C,KAAKu4C,aAAaxwC,EAAG7F,GAC5C,OAGF,MAAMmtC,EAAqC,IAAI9tC,IAC/C,IAAIi3C,EAaAC,EAAcv2C,EAElB,MAAMw2C,EAAiB,CAACx2C,EAAsBy2C,GAAe,KAC3D,MAAM1wC,GAAO/F,EAAQmkB,QAAQpe,IAC7B,IAAIA,IAAQ/F,EAAQmkB,QAAQre,OAAQ,OACpC,MAAMA,EAAS9F,EAAQmkB,QAAQre,OAAO4qB,YAElC,EAAAgmB,EAAA,GAAQH,KACVA,EAAcv2C,GAGhB,IAAI22C,EAAUxJ,EAAKpsC,IAAI+E,GAKvB,GAJI6wC,GACFxJ,EAAKzrC,IAAIoE,EAAQ6wC,EAAU,IAAIz3C,KAG9By3C,EAAQx1C,IAAI4E,GACb,OAGF,MAAM4qB,EAAa7yB,KAAK8yB,cAAc9qB,EAAQC,GAQ9C,QAPiBhE,IAAdu0C,IAEDA,GAAa3lB,GAGfgmB,EAAQ93C,IAAIkH,GAERuwC,IAAc3lB,IAAiB2lB,GAAa3lB,EAAa,CAC3D,MAAMimB,EAAad,EAAiB3I,GACpC,GAAGrvC,KAAKkyB,iBAAmBymB,EAAc,CACpCG,EAAa,IACX,EAAAC,EAAA,GAAc72C,EAASu2C,KACxBA,EAAcv2C,GAIlB,MAAM82C,EAAkBh5C,KAAKi5C,mBAAmBR,EAAav2C,GAE1D82C,EAAgBn2C,QACjBm2C,EAAgBj0C,SAAS7C,IACvBw2C,EAAex2C,GAAS,EAAM,G,CAKpC,GAAIlC,KAAKo4C,aAAavwC,KAQZ7H,KAAKkyB,iBACblyB,KAAKkyB,gBAAgBhwB,QARrB,GAAkB,IAAf42C,GAAoB94C,KAAKk5C,YAC1B,IAAI,MAAOlxC,EAAQqgC,KAASgH,EAC1B,IAAI,MAAMpnC,KAAOogC,EACfroC,KAAKk5C,YAAYlxC,EAAQC,E,GAWrC,IAAIkxC,GAAoB,EACxB,MAAMC,EAAerxC,IACfoxC,KACF,EAAA/mB,EAAA,KACA+mB,GAAoB,GAYtB,MAAMj3C,EAAUlC,KAAKq5C,qBAAqBtxC,EAAE1H,QAC5C,GAAI6B,EAKJ,OAAGlC,KAAKs5C,wBAA0Bt5C,KAAKs5C,sBAAsBvxC,EAAG7F,EAASs2C,IACvEx4C,KAAK6R,eAAe0nC,aAAav5C,KAAKw5C,cAAe,YAAaJ,QAClEp5C,KAAK6R,eAAe0nC,aAAaluC,SAAU,UAAWiU,EAAWm6B,SAInEf,EAAex2C,EAAQ,EAGnBod,EAAavX,IACdsnC,EAAKxnC,OACN,QAAiB6L,OAAQ0G,EAAA,EAAa,CAACpF,SAAS,EAAM/G,MAAM,EAAMgU,SAAS,IAG7EjiB,KAAK6R,eAAe0nC,aAAav5C,KAAKw5C,cAAe,YAAaJ,IAIlE,EAAAhnB,EAAA,IAAiB,EAGbqnB,EAA0B,CAACxrC,MAAM,GACvCjO,KAAK6R,eAAe9Q,IAAIf,KAAKw5C,cAA7Bx5C,CAA4C,YAAao5C,GACzDp5C,KAAK6R,eAAe9Q,IAAIsK,SAAxBrL,CAAkC,UAAWsf,EAAWm6B,EAAwB,EAG1E,KAAAR,mBAAqB,CAACS,EAAoB9B,KAChD,GAAG8B,IAAU9B,EACX,MAAO,GAGT,MAAM+B,EAAYD,EAAMl3B,wBAClBo3B,EAAWhC,EAAKp1B,wBAEhBq3B,GADcF,EAAUv2B,IAAMw2B,EAASx2B,KAASu2B,EAAUh3B,KAAOi3B,EAASj3B,MAClD,EAExBwZ,GAAS,EAAA5e,EAAA,GAAgBm8B,EAAO15C,KAAK85C,8BAC3C,IAAI3d,EACF,MAAO,GAGT,MAAM3W,EAAWtM,MAAMC,KAAKgjB,EAAO1jB,iBAAiBzY,KAAK+5C,6BACzD,IAAIC,EAAax0B,EAASrL,QAAQu/B,GAC9BO,EAAYz0B,EAASrL,QAAQy9B,GAUjC,OARIiC,KACDI,EAAWD,GAAc,CAACA,EAAYC,IAG3Bz0B,EAAS8R,MAAM0iB,EAAa,EAAGC,EAIjC,EAmIP,KAAA7nB,gBAAwB8nB,GAA2B,EAAD,gCACpDA,IAAcl6C,KAAKk6C,cAAe,GACrCl6C,KAAKm6C,0BAA2Bn6C,KAAKm6C,qBACrCn6C,KAAKo4C,aAAa52B,QAClBxhB,KAAKo6C,mBACL,EAAAhoB,EAAA,KACG8nB,IAAcl6C,KAAKk6C,kBAAej2C,EACvC,KAhWE,EAAAqwB,EAAA,GAAWt0B,KAAM6tB,GAEjB7tB,KAAKq6C,eAAiB,gBAAiB,EAAAC,EAAA,IACzC,CAEOC,gBAAgBf,EAA4B3nC,GAQjD,GAPG7R,KAAKw5C,eACNx5C,KAAK6R,eAAeC,YAGtB9R,KAAKw5C,cAAgBA,EACrBx5C,KAAK6R,eAAiBA,EAElB2nC,EAIJ,OAAG,KACD3nC,EAAe9Q,IAAIy4C,EAAnB3nC,CAAkC,YAAY,KACxC7R,KAAK+xB,cACT/xB,KAAKw6C,aCvGR9mC,OAAO+mC,aACD/mC,OAAO+mC,eAAeC,WAErBrvC,SAASymB,UAEVzmB,SAASymB,UAAU6oB,cAAc3mC,KAGnC,GD+FoC,SAGvC,EAAAse,EAAA,GAA0B,CACxBpwB,QAASs3C,EACTjnB,SAAWxqB,IACT,GAAG/H,KAAK+xB,aAAgB/xB,KAAK46C,uBAAyB56C,KAAK46C,uBAAyB,OAGpFvvC,SAASI,KAAK8H,UAAUxS,IAAI,aAC5By4C,EAAc5rC,iBAAiB,YAAa7F,KAC1C,EAAAqS,EAAA,GAAYrS,GACZsD,SAASI,KAAK8H,UAAU/Q,OAAO,YAAY,GAG1C,CAACyL,MAAM,EAAM+G,SAAS,KAEzB,EAAAod,EAAA,KAEA,MAAMlwB,EAAUlC,KAAKq5C,qBAAqBtxC,EAAE1H,QACzC6B,GACDlC,KAAKkyB,gBAAgBhwB,E,EAGzB2P,yBAMJA,EAAe9Q,IAAIy4C,EAAnB3nC,CAAkC,YAAa7R,KAAKq4C,YACtD,CAsKUwC,0BAA0B34C,GAClC,OAAOlC,KAAK8yB,cAAc5wB,EAAQmkB,QAAQre,OAAO4qB,YAAa1wB,EAAQmkB,QAAQpe,IAChF,CAEU6yC,eAAe54C,EAAsBqlC,GAC7CrlC,EAAQ8V,QAAQuvB,EAAcC,MAChC,CAEOvL,sBAAsB/5B,EAAsBqpB,GACjD,MAAMwvB,IAAgB/6C,KAAKg7C,4BAA4B94C,GACvD,GAAGqpB,EAAM,CACP,GAAGwvB,EACD,OAAO,EAGT,MAAMxT,EAAgB,IAAI,IAAc,CACtCrvB,KAAMhW,EAAQmkB,QAAQpe,IACtB0B,OAAO,IAIN3J,KAAK+xB,aACH/xB,KAAK66C,0BAA0B34C,KAChCqlC,EAAcxW,MAAM6U,SAAU,EAC9B1jC,EAAQqR,UAAUxS,IAAI,gBAI1Bf,KAAK86C,eAAe54C,EAASqlC,E,MACrBwT,IACR/6C,KAAKg7C,4BAA4B94C,GAAS+W,cAAczW,UACxD,OAAc,CACZN,UACAmZ,UAAW,cACX4/B,UAAU,EACVp0C,SAAU,OAId,OAAO,CACT,CAEUm0C,4BAA4B94C,G,MACpC,MAA8C,WAAd,QAAzB,EAAAA,EAAQqT,yBAAiB,eAAE2H,UAChChb,EAAQqT,kBAAkBA,iBAC9B,CAEgB2lC,gBAAgBC,GAAiB,G,+CAC/C,MAAMtzC,EAAO7H,KAAKo4C,aAAavwC,KAC/B,IAAIA,IAASszC,EAAgB,OAE7B,IAAIC,GAAevzC,EACjBwzC,GAAcxzC,EAChB,MAAMyzC,GAAYzzC,EAClB,IAAI,MAAOG,EAAQqgC,KAASroC,KAAKo4C,aAAc,CAC7C,MAAMmD,EAAiC,GAAGvzC,KAAUhI,KAAKgK,YAAc,YAAc,YAC/Esa,QAAUtkB,KAAKiH,SAAS8G,mBAAmBytC,sBAAsBD,EAAYriC,MAAMC,KAAKkvB,IAI9F,GAHA+S,EAAc92B,EAAE82B,YAChBC,EAAa/2B,EAAE+2B,WAEZD,GAAeC,EAAY,K,CAGV,QAAtB,EAAAr7C,KAAKy7C,yBAAiB,mBAAGL,EAAaC,EAAYC,E,IAG7ClB,gBAAgBsB,GAAmB,EAAMP,GAAiB,G,MAC/D,MAAMQ,EAAe37C,KAAK+xB,YACpBlqB,EAAO7H,KAAKo4C,aAAavwC,KAG/B,GAFA7H,KAAK+xB,cAAgBlqB,GAAQszC,EAE1BQ,IAAiB37C,KAAK+xB,YAAa,OAAO,EAE7C/xB,KAAKoJ,cAAc,SAAUpJ,KAAK+xB,aAY9B,MACF/xB,KAAKw5C,cAAcjmC,UAAU1J,OAAO,YAAa7J,KAAK+xB,aAEnD4pB,IAED,EAAAvpB,EAAA,OAaJ,EAAAwpB,EAAA,KAEA,MAAMX,IAAapzC,GAAQszC,EACrBU,EAAqC,QAAtB,EAAA77C,KAAK87C,yBAAiB,yBAAGb,GAAWj7C,KAAKk6C,cAmB9D,OAjBI,EAAArwB,mBACCoxB,EACD15B,EAAA,WAAiC,CAC/B3f,KAAM5B,KAAKq6C,eACXvwB,MAAO,KACL9pB,KAAKoyB,iBAAiB,IAI1B7Q,EAAA,eAAqCvhB,KAAKq6C,iBAI3Cc,IACAU,GAAgBz6B,QAAQjT,WAAWG,MAAK,IAAMtO,KAAKk7C,gBAAgBC,MAG/D,CACT,CAWOz/B,UACL1b,KAAKk6C,cAAe,EACpBl6C,KAAKo4C,aAAa52B,QAClBxhB,KAAKo6C,iBAAgB,GACrBp6C,KAAKk6C,kBAAej2C,CACtB,CAEU83C,uBAAuB75C,EAAsB2wB,GACrD7yB,KAAKi8B,sBAAsB/5B,GAAS,GACtBlC,KAAKg7C,4BAA4B94C,GACzC0jC,QAAU/S,EAEhB7yB,KAAKo6C,kBACLp6C,KAAKk7C,mBACL,OAAc,CACZh5C,UACAmZ,UAAW,cACX4/B,SAAUpoB,EACVhsB,SAAU,KAEd,CAEOisB,cAAc9qB,EAAgBC,GACnC,MAAMrE,EAAM5D,KAAKo4C,aAAan1C,IAAI+E,GAClC,OAAOpE,aAAG,EAAHA,EAAKP,IAAI4E,EAClB,CAEOpF,SACL,OAAOm1C,EAAiBh4C,KAAKo4C,aAC/B,CAEU4D,UAAUh0C,EAAgBC,EAAag0C,GAC/C,IAAIr4C,EAAM5D,KAAKo4C,aAAan1C,IAAI+E,GAqChC,OApCGi0C,QAA0Bh4C,IAAbg4C,IAA0Br4C,aAAG,EAAHA,EAAKP,IAAI4E,IAC9CrE,IACDA,EAAI3C,OAAOgH,GAEPrE,EAAIiE,MACN7H,KAAKo4C,aAAan3C,OAAO+G,KAuBzBpE,IACFA,EAAM,IAAIxC,IACVpB,KAAKo4C,aAAax0C,IAAIoE,EAAQpE,IAGhCA,EAAI7C,IAAIkH,KAGH,CACT,CAKOi0C,mBAAmBl0C,EAAgBqgC,GACxC,MAAMzkC,EAAM5D,KAAKo4C,aAAan1C,IAAI+E,GAC9BpE,IAIJykC,EAAKtjC,SAASkD,IACZrE,EAAI3C,OAAOgH,EAAI,IAGbrE,EAAIiE,MACN7H,KAAKo4C,aAAan3C,OAAO+G,GAG3BhI,KAAKk7C,kBACLl7C,KAAKo6C,kBACP,EAGK,MAAM+B,UAAwBhE,EASnCp4C,YAAoB4xB,EAA6B1qB,EAAuB4K,GACtEK,MAAM,CACJjL,WACAsxC,aAAc,CAACxwC,EAAG1H,MAAaA,GAAUL,KAAK+xB,YAC9CsnB,qBAAuBh5C,IAAW,EAAAkd,EAAA,GAAgBld,EAAQ,qBAC1Di4C,sBAAuB,oBACvBwB,6BAA8B,WAC9BC,2BAA4B,uBAPZ,KAAApoB,YAAAA,EAqCb,KAAAO,gBAAmBhwB,IACxB,MAAM+F,GAAO/F,EAAQmkB,QAAQpe,IACvBD,EAAS9F,EAAQmkB,QAAQre,OAAO4qB,WAElC5yB,KAAKg8C,UAAUh0C,EAAQC,IAI3BjI,KAAK+7C,uBAAuB75C,EAASlC,KAAK8yB,cAAc9qB,EAAQC,GAAK,EAGhE,KAAAixC,YAAc,CAAClxC,EAAgBC,KACpC,MAAM/F,EAAUlC,KAAK2xB,YAAYiD,SAASe,WAAW/d,cAAc,oCAAoC5P,iBAAsBC,OAC7HjI,KAAKkyB,gBAAgBhwB,EAAQ,EAGrB,KAAAu5C,kBAAoB,CAACL,EAAsBC,EAAqBC,KACxE,MAAMz4C,EAAS7C,KAAK6C,UACpB,EAAA0mB,EAAA,GAAevpB,KAAKo8C,kBAAkB,QAAK,WAAY,CAACv5C,KACxD7C,KAAKq8C,iBAAiB9oC,UAAU1J,OAAO,OAAmB,IAAXhH,GAC/C7C,KAAKgyB,oBAAoBze,UAAU1J,OAAO,OAAQuxC,GAClDp7C,KAAKqyB,oBAAsBryB,KAAKqyB,mBAAmB9e,UAAU1J,OAAO,OAAQwxC,EAAW,EAG/E,KAAAS,kBAAoB,CAACb,EAAmBjlB,KAyBhD,IAxBA,OAAc,CACZ9zB,QAASlC,KAAK2xB,YAAY6C,uBAC1BnZ,UAAW,eACX4/B,WACAp0C,SAAUmvB,EAAU,IAAM,EAC1B3B,gBAAiB,KACXr0B,KAAK+xB,cACP/xB,KAAKs8C,mBAAmB95C,SACxBxC,KAAKs8C,mBACHt8C,KAAKgyB,oBACLhyB,KAAKqyB,mBACL,KACFryB,KAAKw6C,kBAAev2C,E,KAK1B,OAAc,CACZ/B,QAASlC,KAAK2xB,YAAYvmB,UAC1BiQ,UAAW,eACX4/B,WACAp0C,SAAU,MAGT7G,KAAK+xB,cACF/xB,KAAKs8C,mBAAoB,CAC3B,MAAMC,EAAa,yBACnBv8C,KAAKs8C,mBAAqBjxC,SAASC,cAAc,OACjDtL,KAAKs8C,mBAAmB/oC,UAAUxS,IAAIw7C,EAAa,cAEnD,MAAMC,GAAY,OAAW,SAASD,WAAqB,CAACv9B,UAAU,KACtE,QAAiBw9B,GAAW,IAAMx8C,KAAKoyB,mBAAmB,CAACvgB,eAAgB7R,KAAK6R,eAAgB5D,MAAM,IAEtGjO,KAAKo8C,iBAAmB/wC,SAASC,cAAc,OAC/CtL,KAAKo8C,iBAAiB7oC,UAAUxS,IAAIw7C,EAAa,UAEjDv8C,KAAKq8C,kBAAmB,OAAW,WAAWE,UAE9C,MAAME,EAAyC,CAAC5qC,eAAgB7R,KAAK6R,iBACrE,QAAiB7R,KAAKq8C,kBAAkB,KACtC,MAAMr0C,EAAS,IAAIhI,KAAKo4C,aAAah0C,QAAQ,GACvC6D,EAAM,IAAIjI,KAAKo4C,aAAan1C,IAAI+E,IAAS,GAC/ChI,KAAKoyB,kBAELP,EAAA,gBAA0B,CAAC7pB,SAAQmL,UAAWlL,GAAK,GAClDw0C,GAEHz8C,KAAKgyB,qBAAsB,OAAW,WAAWuqB,cACjD,QAAiBv8C,KAAKgyB,qBAAqB,KACzC,MAAM0qB,EAAwC,CAAC,EAC/C,IAAI,MAAOC,EAAYtU,KAASroC,KAAKo4C,aACnCsE,EAAIC,GAAczjC,MAAMC,KAAKkvB,GAAMuU,MAAK,CAACnoC,EAAGu9B,IAAMv9B,EAAIu9B,IAGxD,IAAI,IAAa0K,GAAK,KACpB18C,KAAKoyB,iBAAiB,GACtB,GACDqqB,GAEAz8C,KAAK68C,YACN78C,KAAKqyB,oBAAqB,OAAW,iBAAiBkqB,aACtD,QAAiBv8C,KAAKqyB,oBAAoB,KACxC,MAAMrqB,EAAS,IAAIhI,KAAKo4C,aAAah0C,QAAQ,GAC7C,IAAI,IAAoB4D,EAAQ,IAAIhI,KAAKo4C,aAAan1C,IAAI+E,IAAU,QAAQ,KAC1EhI,KAAKoyB,iBAAiB,GACtB,GACDqqB,IAGLz8C,KAAKs8C,mBAAmB5wC,UAAU,CAChC8wC,EACAx8C,KAAKo8C,iBACLp8C,KAAKq8C,iBACLr8C,KAAKgyB,oBACLhyB,KAAKqyB,oBACL+G,OAAOC,UAET,MAAMyjB,EAAoB98C,KAAKs8C,mBAC/BQ,EAAkBvxC,MAAMqZ,QAAU,IAClC5kB,KAAK2xB,YAAY6C,uBAAuB9oB,OAAOoxC,GAE1CA,EAAkBr5B,WACvBq5B,EAAkBvxC,MAAMqZ,QAAU,E,GAtItC5kB,KAAK68C,WAAalrB,EAAYwC,WAC9Bn0B,KAAKu6C,gBAAgB5oB,EAAYvmB,UAAWyG,EAC9C,CAYOuoC,gBAAgBsB,GAAmB,EAAMP,GAAiB,GAC/D,MAAMr2B,EAAM5S,MAAMkoC,gBAAgBsB,EAAkBP,GASpD,OAPGr2B,GAAO42B,GACSxiC,MAAMC,KAAKnZ,KAAK2xB,YAAYuD,cAAczc,iBAAiB,uBACnE1T,SAAS7C,IAChBlC,KAAKi8B,sBAAsB/5B,EAASlC,KAAK+xB,YAAY,IAIlDjN,CACT,EAmHa,MAAMi4B,UAAsB5E,EAUzCp4C,YACUi9C,EACAC,EACAlsB,EACR9pB,GAEAiL,MAAM,CACJjL,WACAoyC,qBAAuBh5C,IAAW,EAAAkd,EAAA,GAAgBld,EAAQ,kBAAmB,EAAAkd,EAAA,GAAgBld,EAAQ,UACrGk4C,aAAc,CAACxwC,EAAG1H,OAGHL,KAAKo4C,aAAavwC,OAC3BE,EAAE1H,OAAuBkT,UAAUqB,SAAS,YAC5C7M,EAAE1H,OAAuBkT,UAAUqB,SAAS,uBAC9CvU,GAIJi5C,sBAAuB,CAACvxC,EAAG7F,EAASs2C,MACtBzwC,EAAE1H,SAAW6B,IACrB6F,EAAE1H,OAAuBkT,UAAUqB,SAAS,4BAChC3Q,IAAdu0C,IACCx4C,KAAKo4C,aAAavwC,MAGvB+yC,qBAAsB,KAAO56C,KAAKg9C,KAAKjsB,MAAMmsB,UAC7C5E,sBAAuB,SACvBwB,6BAA8B,gBAC9BC,2BAA4B,qDAC5B/vC,YAA2B,cAAdgzC,EAAKp7C,OA7BZ,KAAAo7C,KAAAA,EACA,KAAAC,QAAAA,EACA,KAAAlsB,MAAAA,EAwEH,KAAAmB,gBAAmBirB,IACxB,IAAIn9C,KAAKo9C,gBAAgBD,GAAS,OAElC,MAAMl1C,GAAOk1C,EAAO92B,QAAQpe,IAG5B,GADkBk1C,EAAO5pC,UAAUqB,SAAS,cAC5C,CACE,IAAI5U,KAAKq9C,wBAAwBF,GAAS,CACxC,MAAMv5C,EAAM5D,KAAKo4C,aAAan1C,IAAIjD,KAAKg9C,KAAKh1C,QACzCpE,GAEY5D,KAAKs9C,0BAA0BH,GACvCp4C,SAASkD,GAAQrE,EAAI3C,OAAOgH,I,CAIdjI,KAAKi9C,QAAQM,sBAAsBJ,GAAQriC,IAAI9a,KAAKkyB,gB,MAK7E,GAAIlyB,KAAKg8C,UAAUh8C,KAAKg9C,KAAKh1C,OAAQC,GAArC,CAKA,GADsBk1C,EAAO5pC,UAAUqB,SAAS,gBAC9B,CAChB,MAAM4oC,GAAiB,EAAAjgC,EAAA,GAAgB4/B,EAAQ,UACzCM,EAAoBz9C,KAAKq9C,wBAAwBG,GACjDE,EAAwB19C,KAAK09C,sBAAsBF,IAEtCE,GAAyBD,IAE1Cz9C,KAAK+7C,uBAAuByB,EAAgBE,E,CAIhD19C,KAAK+7C,uBAAuBoB,EAAQn9C,KAAK8yB,cAAc9yB,KAAKg9C,KAAKh1C,OAAQC,G,CAAK,EAGtE,KAAAixC,YAAc,CAAMlxC,EAAgBC,IAAgB,EAAD,gCAC3D,MAAM01C,QAAgB39C,KAAKi9C,QAAQW,iBAAiB31C,GACjD01C,GACD39C,KAAKkyB,gBAAgByrB,EAAQR,OAEjC,IAwDU,KAAArB,kBAAoB,CAAMb,EAAmBjlB,IAAqB,EAAD,gCACzE,MAAM,eAAC6nB,EAAc,UAAEC,EAAS,QAAEC,SAAiB/9C,KAAKg9C,KAAKjsB,MAAMitB,OAAOhoB,IAE1E,OAAc,CACZ9zB,QAASlC,KAAKw5C,cACdn+B,UAAW,eACX4/B,WACAp0C,SAAUmvB,EAAU,IAAM,EAC1B3B,gBAAiB,KACXr0B,KAAK+xB,cACP/xB,KAAKi+C,sBAAsBz7C,SAC3BxC,KAAKi+C,sBACHj+C,KAAKs8C,mBACLt8C,KAAKk+C,oBACLl+C,KAAKgyB,oBACLhyB,KAAKqyB,mBACLryB,KAAKm+C,cACLn+C,KAAKo+C,eACL,KACFp+C,KAAKw6C,kBAAev2C,E,IAW1B,MAAMo6C,EAAoBP,EAAYC,OAAU95C,EAA6B,EAAjB45C,EAC5D,GAAG79C,KAAK+xB,aACN,IAAI/xB,KAAKs8C,mBAAoB,CAC3Bt8C,KAAKi+C,sBAAwB5yC,SAASC,cAAc,OACpDtL,KAAKi+C,sBAAsB1qC,UAAUxS,IAAI,qBAAsB,qBAK/Df,KAAKs8C,mBAAqBjxC,SAASC,cAAc,OACjDtL,KAAKs8C,mBAAmB/oC,UAAUxS,IAAI,uBAEtC,MAAM07C,EAAyC,CAAC5qC,eAAgB7R,KAAK6R,gBAC/D2qC,GAAY,OAAW,QAAS,CAACx9B,UAAU,KACjD,QAAiBw9B,GAAW,IAAMx8C,KAAKoyB,mBAAmB,CAACnkB,MAAM,EAAM4D,eAAgB7R,KAAK6R,iBAE5F7R,KAAKo8C,iBAAmB/wC,SAASC,cAAc,OAC/CtL,KAAKo8C,iBAAiB7oC,UAAUxS,IAAI,6BAEd,cAAnBf,KAAKg9C,KAAKp7C,MACX5B,KAAKk+C,qBAAsB,OAAO,2EAA4E,CAACnqC,KAAM,UACrH/T,KAAKk+C,oBAAoBxyC,QAAO,QAAK,yBACrC,QAAiB1L,KAAKk+C,qBAAqB,KACzC,IAAI,IAAal+C,KAAKg9C,KAAKh1C,OAAQ,IAAIhI,KAAKo4C,aAAan1C,IAAIjD,KAAKg9C,KAAKh1C,UAAU,KAC/EhI,KAAKoyB,iBAAiB,GACtB,GACDqqB,KAEHz8C,KAAKgyB,qBAAsB,OAAO,oEAAqE,CAACje,KAAM,YAC9G/T,KAAKgyB,oBAAoBtmB,QAAO,QAAK,aACrC,QAAiB1L,KAAKgyB,qBAAqB,KACzC,MAAM0qB,EAAwC,CAAC,EAC/C,IAAI,MAAOC,EAAYtU,KAASroC,KAAKo4C,aACnCsE,EAAIC,GAAczjC,MAAMC,KAAKkvB,GAAMuU,MAAK,CAACnoC,EAAGu9B,IAAMv9B,EAAIu9B,IAGxD,IAAI,IAAa0K,GAAK,KACpB18C,KAAKoyB,iBAAiB,GACtB,GACDqqB,IAGLz8C,KAAKqyB,oBAAqB,OAAO,0EAA2E,CAACte,KAAM,WACnH/T,KAAKqyB,mBAAmB3mB,QAAO,QAAK,YACpC,QAAiB1L,KAAKqyB,oBAAoB,KACxC,IAAI,IAAoBryB,KAAKg9C,KAAKh1C,OAAQ,IAAIhI,KAAKo4C,aAAan1C,IAAIjD,KAAKg9C,KAAKh1C,SAAUhI,KAAKg9C,KAAKp7C,MAAM,KACtG5B,KAAKoyB,iBAAiB,GACtB,GACDqqB,GAEH,MAAM95B,EAAO3iB,KAAKm+C,cAAgB9yC,SAASC,cAAc,OACzDqX,EAAKpP,UAAUxS,IAAI,4BACnB4hB,EAAKjX,OAAO8wC,EAAWx8C,KAAKo8C,kBAE5B,MAAMkC,EAAQt+C,KAAKo+C,eAAiB/yC,SAASC,cAAc,OAC3DgzC,EAAM/qC,UAAUxS,IAAI,6BACpBu9C,EAAM5yC,UAAU,CACd1L,KAAKk+C,oBACLl+C,KAAKgyB,oBACLhyB,KAAKqyB,oBACL+G,OAAOC,eAEgBp1B,IAAtBo6C,IACD17B,EAAKpX,MAAMsR,UAAY,eAAewhC,OACtCC,EAAM/yC,MAAMsR,UAAY,cAAcwhC,QAGxCr+C,KAAKs8C,mBAAmB5wC,OAAOiX,EAAM27B,GAGrCt+C,KAAKi+C,sBAAsB1yC,MAAMqZ,QAAU,IAC3C5kB,KAAKi+C,sBAAsBvyC,OAAyB1L,KAAKs8C,oBACzDt8C,KAAK+wB,MAAMwtB,eAAe7yC,OAAO1L,KAAKi+C,uBAEjCj+C,KAAKi+C,sBAAsBx6B,WAEhCzjB,KAAKi+C,sBAAsB1yC,MAAMqZ,QAAU,GAC3CjC,EAAKpX,MAAMsR,UAAY,GACvByhC,EAAM/yC,MAAMsR,UAAY,E,OAElB7c,KAAKm+C,oBAAuCl6C,IAAtBo6C,IAC9Br+C,KAAKm+C,cAAc5yC,MAAMsR,UAAY,eAAewhC,OACpDr+C,KAAKo+C,eAAe7yC,MAAMsR,UAAY,cAAcwhC,OAExD,IAEU,KAAA5C,kBAAoB,CAACL,EAAsBC,EAAqBC,MACxE,EAAA/xB,EAAA,GAAevpB,KAAKo8C,kBAAkB,QAAK,WAAY,CAACp8C,KAAK6C,YAC7D7C,KAAKk+C,qBAAuBl+C,KAAKk+C,oBAAoBM,gBAAgB,WAAYlD,GACjFt7C,KAAKgyB,qBAAuBhyB,KAAKgyB,oBAAoBwsB,gBAAgB,WAAYpD,GACjFp7C,KAAKqyB,oBAAsBryB,KAAKqyB,mBAAmBmsB,gBAAgB,WAAYnD,EAAW,EAGlF,KAAAlB,kBAAoB,IAAW,EAAD,gCAaxC,GAxRA,CAEOW,eAAeqC,EAAqB5V,GACzCA,EAAcC,MAAMj0B,UAAUxS,IAAI,0BAE/Bo8C,EAAO5pC,UAAUqB,SAAS,sBAC3BuoC,EAAOvlC,cAAc,4BAA4BlM,OAAO67B,EAAcC,OAEtEt1B,MAAM4oC,eAAeqC,EAAQ5V,EAEjC,CAEO6S,gBAAgBsB,GAAmB,EAAMP,GAAiB,GAC/D,MAAMr2B,EAAM5S,MAAMkoC,gBAAgBsB,EAAkBP,GAEpD,GAAGr2B,GAAO42B,EACR,IAAI,MAAMzzC,KAAOjI,KAAKi9C,QAAQA,QAAS,CACrC,GAAGj9C,KAAKi9C,QAAQwB,YAAYp7C,KAAK4E,GAC/B,SAGF,MAAMk1C,EAASn9C,KAAKi9C,QAAQA,QAAQh1C,GACpCjI,KAAKi8B,sBAAsBkhB,EAAQn9C,KAAK+xB,Y,CAI5C,OAAOjN,CACT,CAEOmX,sBAAsBkhB,EAAqB5xB,GAChD,IAAIvrB,KAAKo9C,gBAAgBD,GAAS,OAElC,MAAMr4B,EAAM5S,MAAM+pB,sBAAsBkhB,EAAQ5xB,GAQhD,OAPGzG,GACiBq4B,EAAO5pC,UAAUqB,SAAS,eAE1C5U,KAAKi9C,QAAQM,sBAAsBJ,GAAQp4C,SAAS/B,GAAShD,KAAKi8B,sBAAsBj5B,EAAMuoB,KAI3FzG,CACT,CAiDO+1B,0BAA0B34C,GAC/B,MAAMw8C,EAAYx8C,EAAQqR,UAAUqB,SAAS,cAC7C,OAAO1C,MAAM2oC,0BAA0B34C,MAAcw8C,GAAa1+C,KAAK09C,sBAAsBx7C,GAC/F,CAEUm7C,wBAAwBF,GAChC,MAAMwB,EAAuB3+C,KAAKg7C,4BAA4BmC,GAC9D,OAAOwB,aAAoB,EAApBA,EAAsB/Y,OAC/B,CAEU0X,0BAA0BE,GAClC,MAAMh4B,EAAWxlB,KAAKg9C,KAAKC,QAAQM,sBAAsBC,GAKzD,OAJIh4B,EAAS3iB,QACX2iB,EAASnjB,KAAKm7C,GAGTh4B,EAAS1K,KAAK5Y,IAAaA,EAAQmkB,QAAQpe,KACpD,CAEUy1C,sBAAsBF,GAC9B,MAAMnV,EAAOroC,KAAKs9C,0BAA0BE,GACtCpF,EAAe/P,EAAKjP,QAAQnxB,GAAQjI,KAAK8yB,cAAc9yB,KAAKg9C,KAAKh1C,OAAQC,KAC/E,OAAOogC,EAAKxlC,SAAWu1C,EAAav1C,MACtC,CAEUm4C,4BAA4BmC,GAgBpC,OAAOA,EAAO5pC,UAAUqB,SAAS,sBAC/BuoC,EAAOvlC,cAAc,eACrB1F,MAAM8oC,4BAA4BmC,EACtC,CAEOC,gBAAgBD,GACrB,QAAQA,EAAO5pC,UAAUqB,SAAS,YAC/BuoC,EAAO5pC,UAAUqB,SAAS,gBAC1BuoC,EAAO5pC,UAAUqB,SAAS,aAC1BuoC,EAAO5pC,UAAUqB,SAAS,iBAC1BuoC,EAAO5pC,UAAUqB,SAAS,mBAC/B,E,qGEr1Ba,MAAMgqC,EAMnB7+C,YAAY8tB,EAAgC,CAAC,GAC3C,MAAM2Z,EAAQxnC,KAAKwnC,MAAQn8B,SAASC,cAAc,SAClDk8B,EAAMj0B,UAAUxS,IAAI,kBAEjB8sB,EAAQgxB,aACTrX,EAAMj0B,UAAUxS,IAAI,8BAGnB8sB,EAAQlkB,OACT69B,EAAMj0B,UAAUxS,IAAI,wBAGnB8sB,EAAQ6iB,UACT1wC,KAAK8+C,kBAAiB,GAGxB9+C,KAAK6R,eAAiBgc,EAAQhc,eAE9B,MAAMkf,EAAQ/wB,KAAK+wB,MAAQ1lB,SAASC,cAAc,SAWlD,GAVAylB,EAAMxd,UAAUxS,IAAI,wBACpBgwB,EAAMnvB,KAAO,WACVisB,EAAQ3V,OACT6Y,EAAMnpB,GAAK,SAAWimB,EAAQ3V,MAG7B2V,EAAQ+X,UACT7U,EAAM6U,SAAU,GAGf/X,EAAQkxB,SAAU,CACnB,IAAIprB,GAAS,EACb,MAAMlD,EAAW,KACf,IAAIkD,EACF,OAGF,IAAIjnB,EAEFA,EADCmhB,EAAQmxB,YACDnxB,EAAQmxB,YAAYjuB,EAAM6U,QAAU,EAAI,GAExC7U,EAAM6U,QAGhB,sCAA4C/X,EAAQkxB,SAAUryC,EAAM,EAGtE,eAA2B4B,MAAMwe,IAC/B6G,GAAS,EACT,MAAMsrB,GAAa,OAAgBnyB,EAAOe,EAAQkxB,UAClD,IAAInZ,EAEFA,EADC/X,EAAQmxB,YAC6C,IAA5CnxB,EAAQmxB,YAAY7kC,QAAQ8kC,GAE5BA,EAGZj/C,KAAKk/C,iBAAiBtZ,EAAQ,IAG7B/X,EAAQhc,eAAgBgc,EAAQhc,eAAe9Q,IAAIgwB,EAA3BlD,CAAkC,SAAU4C,GAClEM,EAAMnjB,iBAAiB,SAAU6iB,E,CAGxC,IAAIsE,EAWJ,GAVGlH,EAAQ7Z,MACT+gB,EAAO/0B,KAAK+0B,KAAO1pB,SAASC,cAAc,QAC1CypB,EAAKxhB,UAAUxS,IAAI,qBACnB,QAAMg0B,EAAMlH,EAAQ7Z,KAAM6Z,EAAQmjB,WAElCxJ,EAAMj0B,UAAUxS,IAAI,4BAGtBymC,EAAM97B,OAAOqlB,GAEVlD,EAAQhkB,OAAQ,CACjB29B,EAAMj0B,UAAUxS,IAAI,yBAEpB,MAAM8I,EAASwB,SAASC,cAAc,OACtCzB,EAAO0J,UAAUxS,IAAI,mBACrBymC,EAAM97B,OAAO7B,E,KACR,CACL,MAAMs1C,EAAM9zC,SAASC,cAAc,OACnC6zC,EAAI5rC,UAAUxS,IAAI,gBAElB,MAAMq+C,EAAW/zC,SAASmb,gBAAgB,6BAA8B,OACxE44B,EAAS7rC,UAAUxS,IAAI,sBACvBq+C,EAAS34B,eAAe,KAAM,UAAW,aACzC,MAAMK,EAAMzb,SAASmb,gBAAgB,6BAA8B,OACnEM,EAAIL,eAAe,KAAM,OAAQ,UACjCK,EAAIL,eAAe,KAAM,IAAK,MAC9B24B,EAAS1zC,OAAOob,GAEhB,MAAMu4B,EAAKh0C,SAASC,cAAc,OAClC+zC,EAAG9rC,UAAUxS,IAAI,2BAEjB,MAAMu+C,EAASj0C,SAASC,cAAc,OACtCg0C,EAAO/rC,UAAUxS,IAAI,uBAErBo+C,EAAIzzC,OAAO4zC,EAAQD,EAAID,GAEvB5X,EAAM97B,OAAOyzC,E,CAGZpqB,GACDyS,EAAM97B,OAAOqpB,GAGZlH,EAAQ0xB,YACT/X,EAAMj0B,UAAUxS,IAAI,kBAAmB,iBACvC,OAAOymC,OAAOvjC,OAAWA,GAAW,IAE5B4pB,EAAQ2xB,WAChBhY,EAAMj0B,UAAUxS,IAAI,eAExB,CAEI6kC,cACF,OAAO5lC,KAAK+wB,MAAM6U,OACpB,CAEIA,YAAQA,GAKV5lC,KAAKk/C,iBAAiBtZ,GAEtB,MAAM1O,EAAQ,IAAIuoB,MAAM,SAAU,CAACxC,SAAS,EAAM7+B,YAAY,IAC9Dpe,KAAK+wB,MAAM3nB,cAAc8tB,EAC3B,CAEOgoB,iBAAiBtZ,GACtB5lC,KAAK+wB,MAAM6U,QAAUA,CACvB,CAEOkZ,iBAAiBY,GAEtB,OADA1/C,KAAKwnC,MAAMj0B,UAAU1J,OAAO,oBAAqB61C,GAC1C,IAAM1/C,KAAK8+C,kBAAkBY,EACtC,E,4DCpKa,MAAMC,UAAuB,KAC1C5/C,YAAmB8tB,GAIjB3b,MAAM/N,OAAOy7C,OAAO/xB,EAAS,CAC3Bre,WAAW,KALI,KAAAqe,QAAAA,EAQjB,MAAMkD,EAAQ/wB,KAAK+wB,MACnBA,EAAMnvB,KAAO,MACbmvB,EAAMpjB,aAAa,WAAY,IAC/BojB,EAAM8uB,aAAe,MAErB,IAAIC,EAAa,EACjB9/C,KAAK+wB,MAAMnjB,iBAAiB,SAAU7F,IACpC/H,KAAK+wB,MAAMxd,UAAU/Q,OAAO,SAC5BxC,KAAK+/C,WAEL,MAAMrzC,EAAQ1M,KAAK0M,MAAMia,QAAQ,MAAO,IAAI2Q,MAAM,EAAGzJ,EAAQhrB,QAC7D7C,KAAKk/C,iBAAiBxyC,GAEtB,MAAM7J,EAAS7C,KAAK0M,MAAM7J,OAC1B,GAAGA,IAAWgrB,EAAQhrB,OACpBgrB,EAAQmyB,OAAOhgD,KAAK0M,YACf,GAAG7J,IAAWi9C,EACnB,OAGFA,EAAaj9C,CAAM,GAEvB,E,uECxBa,SAASo9C,EACtBpyB,GAEA,OAAO,IAAIzM,SAAa,CAACjT,EAASkT,K,MAChC,MAAM,OAAC/K,EAAM,SAAEqvB,GAAY9X,EAC3BvX,EAAOic,SAAY3uB,IAEfuK,EADCw3B,IAAa/hC,EACNA,IAAQA,EAAIiE,UAAO5D,EAEnB4pB,EAAQqyB,WAAWplC,KAAK6qB,GAAa/hC,EAAIP,IAAIsiC,EAAS3xB,Q,EAIlE,MAAMH,GAAU,OAAgBga,EAAQha,SAAW,CAACyC,IAC9C6pC,EAAetsC,EAAQnT,MAAM4V,GAAWA,EAAO8pC,WACrDD,EAAa5tB,SAAW,KACtBlR,GAAQ,EAGVwM,EAAQha,QAAUA,EACA,QAAlB,EAAAga,EAAQqyB,kBAAU,QAAlBryB,EAAQqyB,WAAeva,GAAY,CAACA,IAEpC,IAAI,IAAU,qBAAsB9X,GAAStC,MAAM,GAEvD,C,2LCjBA,IAAI80B,EACJ,MAAMC,EAAe,KACnBD,EAAY,2BACHE,IAAW,MAAC,QAAe,QAAd,EAAAA,EAAQ9yC,cAAM,eAAE+yC,OAAO,IAC5C5D,MAAK,CAACnoC,EAAGu9B,KAAOv9B,EAAEyD,MAAQzD,EAAEgsC,cAAcC,cAAc1O,EAAE95B,MAAQ85B,EAAEyO,eAAc,EAGrF,IAAIjuB,EAAO,KACT8tB,IACA,qBAA2B,mBAAmB,KAC5CA,GAAc,GACd,EAGJ,MAAMK,EAAoB,IAAIv/C,IAAI,CAAC,OAEpB,MAAMw/C,UAA0B,KAS7C7gD,YAAmB8tB,EAGf,CAAC,GACH3b,MAAM,OAAD,QACHs1B,MAAO,UACPtvB,MAAM,UACH2V,IAPY,KAAAA,QAAAA,EA+NZ,KAAAgzB,WAAa,UACM58C,IAArBjE,KAAK8gD,cACR9gD,KAAK+gD,cAAcxtC,UAAU/Q,OAAO,UACpCxC,KAAK8gD,YAAcptC,OAAOhR,YAAW,KACnC1C,KAAK+gD,cAAcxtC,UAAUxS,IAAI,QACjCf,KAAK8gD,iBAAc78C,CAAS,GAC3B,KAAI,EAGF,KAAA+8C,sBAAyB3gD,I,QAC9B,MAAM4gD,EAAc5gD,EAAOuX,cAA2B,uBAAuByO,QAAQ46B,YAC/EC,EAAc7gD,EAAOuX,cAA2B,eAChDupC,EAAYD,aAAW,EAAXA,EAAapmB,UACzBsmB,EAAcD,GAAaA,EAAUx6B,QAAQ,MAAO,KAE1D,OAAe3mB,KAAK+wB,OAAO,QAAKkwB,IAChCjhD,KAAKqhD,qBACLrhD,KAAKshD,oBAAsBjB,EAAU3/C,MAAMqhC,GAAMA,EAAE0e,eAAiBQ,IACpEjhD,KAAKuhD,wBAA0BH,GAAephD,KAAKshD,oBAAoBE,cAAc9gD,MAAM+gD,GAAiBA,EAAaC,eAAiBN,IAE9G,QAA5B,KAAAphD,KAAK6tB,SAAQ8zB,uBAAe,gBAAG3hD,KAAKshD,oBAAqBthD,KAAKuhD,yBAC9DvhD,KAAK6gD,YAAY,EA1OdruB,IACDA,IACAA,OAAOvuB,GAGTjE,KAAK4hD,MAAQ,IAAIrgD,IAEjBvB,KAAKoL,UAAUmI,UAAUxS,IAAI,gBAE7B,MAAMggD,EAAgB/gD,KAAK+gD,cAAgB11C,SAASC,cAAc,OAClEy1C,EAAcxtC,UAAUxS,IAAI,iBAAkB,YAAa,QAE3D,MAAM8gD,EAAYx2C,SAASC,cAAc,QACzCu2C,EAAUtuC,UAAUxS,IAAI,QAAS,cACjCf,KAAKoL,UAAUM,OAAOm2C,GAEtB,MAAMC,EAAaz2C,SAASC,cAAc,MAC1Cy1C,EAAcvpC,YAAYsqC,GAEX,IAAI,KAAWf,GAE9B,IAAIgB,EAAa,KACfA,EAAa,KAEb1B,EAAUt7C,SAASg9B,IACjB,GAAGlU,EAAQm0B,cAAgBrB,EAAkBt9C,IAAI0+B,EAAEkgB,MACjD,OAGF,MAAMC,GAAQ,QAAgBngB,EAAEkgB,MAE1BE,EAA8B,GACpC,IAAI,IAAI/9B,EAAI,EAAGvhB,EAAS2D,KAAKI,IAAIm7B,EAAEyf,cAAc3+C,OAAQgrB,EAAQm0B,aAAe,EAAII,KAAWh+B,EAAIvhB,IAAUuhB,EAAG,CAC9G,MAAMg9B,EAAcrf,EAAEyf,cAAcp9B,GAC9B2b,EAAK10B,SAASC,cAAc,MAE5BitB,GAAU,OAAc2pB,GAC9B,GAAG,IAAoB,CACrB,MAAMG,EAAYh3C,SAASC,cAAc,SACzC,OAAa+2C,EAAW9pB,GACxBwH,EAAGr0B,OAAO22C,E,MAEV,OAAatiB,EAAIxH,GAGnB,MAAM33B,GAAK,QAAKmhC,EAAE0e,cAIlB,GAHA7/C,EAAGylB,QAAQ46B,YAAclf,EAAE0e,aAC3B1gB,EAAGr0B,OAAO9K,IAENitB,EAAQm0B,aAAc,CACxB,MAAMjtB,EAAO1pB,SAASC,cAAc,QACpCypB,EAAKxhB,UAAUxS,IAAI,cACnBg0B,EAAK+F,UAAY,IAAMsmB,EAAYM,aACnC3hB,EAAGvoB,YAAYud,E,CAGjBotB,EAAM9/C,KAAK09B,GACX+hB,EAAWp2C,OAAOq0B,E,CAGpB//B,KAAK4hD,MAAMh+C,IAAIm+B,EAAEkgB,KAAME,EAAM,IAG/BL,EAAWl0C,iBAAiB,aAAc7F,IACxC,GAAgB,IAAbA,EAAEuO,OACH,OAGF,MAAMjW,GAAS,OAAU0H,EAAE1H,OAAQ,MACnCL,KAAKghD,sBAAsB3gD,EAAO,IAIpCL,KAAKoL,UAAUoM,YAAYupC,EAAc,EAG3CgB,IAEA/hD,KAAK+wB,MAAMnjB,iBAAiB,SAAU7F,IACjCg6C,EACDA,IAEA1B,EAAUt7C,SAASg9B,IACjB,MAAMiF,EAAMhnC,KAAK4hD,MAAM3+C,IAAI8+B,EAAEkgB,MACzBjb,GACJA,EAAIjiC,SAASg7B,GAAOA,EAAGx0B,MAAMoc,QAAU,IAAG,IAI9ClU,aAAazT,KAAK8gD,aAClB9gD,KAAK8gD,iBAAc78C,EAEnB88C,EAAcxtC,UAAU/Q,OAAO,QAC1Bu+C,EAAcpZ,YACnBoZ,EAAcxtC,UAAUxS,IAAI,UAE5Bf,KAAKsiD,UAEL,OAAiB,CAEfl3C,WAAW,OAAgBpL,KAAKoL,UAAW,gBAC3ClJ,QAASlC,KAAK+wB,MACdoF,SAAU,QACVosB,OAAQ,IAGV7/C,YAAW,KACL8/C,IACFn3C,SAASuC,iBAAiB,YAAayqC,EAAa,CAACrjC,SAAS,IAC9DwtC,GAA2B,E,GAE5B,EAAE,IAGP,IAAIA,GAA2B,EAC/B,MAAMnK,EAAetwC,KAChB,OAAgBA,EAAE1H,OAAQ,iBAG1B0H,EAAE1H,SAAWL,KAAK+wB,QAIrB/wB,KAAK6gD,aACLx1C,SAASqG,oBAAoB,YAAa2mC,EAAa,CAACrjC,SAAS,IACjEwtC,GAA2B,EAAK,EAS5BC,EAAc16C,IAClB,MAAMyE,EAAMzE,EAAEyE,IACd,GAAGzE,EAAE4V,SAAmB,YAARnR,EAAmB,OAAO,EAG1C,MAAMk2C,EAAS1iD,KAAK0M,MAAMgc,cACpBnD,EAAyB,GAC/B86B,EAAUt7C,SAASg9B,IACjB,MAAMiF,EAAMhnC,KAAK4hD,MAAM3+C,IAAI8+B,EAAEkgB,MAC7B,IAAIjb,EACF,OAGF,MAAM2b,EAAQ,CACZ5gB,EAAE7pB,KACF6pB,EAAE0e,aACF1e,EAAEkgB,MAGJU,EAAMvpB,OAAOC,SAASt0B,SAASmT,IAC7B,MAAM0qC,EAAO1qC,EAAKiM,MAAM,KAAKiV,QAAQypB,GAAS,KAAKC,KAAKD,KAAO/nC,KAAK+nC,GAASA,EAAK,KAAIr+B,KAAK,IACxFo+B,EAAK//C,OAAS,GACf8/C,EAAMtgD,KAAKugD,E,IAIf,MAAM9oC,IAAS6oC,EAAMvpB,OAAOC,SAAS34B,MAAMujB,IAA+C,IAAvCA,EAAIyE,cAAcvO,QAAQuoC,KAE7E1b,EAAIjiC,SAASg7B,GAAOA,EAAGx0B,MAAMoc,QAAU7N,EAAO,GAAK,SAChDA,GAAMyL,EAAQljB,KAAK0/B,EAAE,IAYM,IAAnBxc,EAAQ1iB,OACnBw9C,EAAUt7C,SAASg9B,IACjB,MAAMiF,EAAMhnC,KAAK4hD,MAAM3+C,IAAI8+B,EAAEkgB,MACzBjb,GAIJA,EAAIjiC,SAASg7B,GAAOA,EAAGx0B,MAAMoc,QAAU,IAAG,IAEjB,IAAnBpC,EAAQ1iB,QAAwB,UAAR2J,KAChC,OAAYzE,GACZ/H,KAAKghD,sBAAsBhhD,KAAK4hD,MAAM3+C,IAAIsiB,EAAQ,GAAG08B,MAAM,I,EAI/DjiD,KAAK+wB,MAAMnjB,iBAAiB,QAAS60C,GACrCziD,KAAK+wB,MAAMnjB,iBAAiB,WAAY7F,IACzB,UAAVA,EAAEyE,KACHi2C,EAAW16C,E,IAIf85C,EAAUj0C,iBAAiB,aAAc7F,IACpC/H,KAAK+wB,MAAMxL,QAAQ,WACpBvlB,KAAK6gD,aACL7gD,KAAK+wB,MAAMgyB,SAEXh7C,EAAE4qB,cAAe,EACjB5qB,EAAE2qB,iBACF1yB,KAAK+wB,MAAMC,Q,GAGjB,CAEO4W,cACL,MAAO,CAAC2Y,QAASvgD,KAAKshD,oBAAqBznC,KAAM7Z,KAAKuhD,wBACxD,CA0BOyB,oBAAoBf,GACzBjiD,KAAKghD,sBAAsBhhD,KAAK4hD,MAAM3+C,IAAIg/C,GAAM,GAClD,CAEOjgD,SAASu+C,EAAsB1mC,EAAuBopC,G,SAC3D,OAAejjD,KAAK+wB,MAAOwvB,GAAU,QAAKA,EAAQE,cAAuBwC,GACzEjjD,KAAKshD,oBAAsBf,EAC3BvgD,KAAKuhD,wBAA0B1nC,EACH,QAA5B,KAAA7Z,KAAK6tB,SAAQ8zB,uBAAe,gBAAG3hD,KAAKshD,oBAAqBthD,KAAKuhD,wBAChE,E,2FCzRa,MAAM2B,EAWnBnjD,YACUujB,EACAI,EACAuV,GAFA,KAAA3V,MAAAA,EACA,KAAAI,OAAAA,EACA,KAAAuV,SAAAA,EAER,MAAM31B,EAAStD,KAAKsD,OAAS+H,SAASC,cAAc,UAC9C63C,EAAMnjD,KAAKmjD,IAAMzvC,OAAO0vC,iBAC9B9/C,EAAOggB,MAAQA,EAAQ6/B,EACvB7/C,EAAOogB,OAASA,EAASy/B,EACzB7/C,EAAOiQ,UAAUxS,IAAI,mBAAoB,eAEzCf,KAAKsE,QAAS,EACdtE,KAAKwE,UAAW,EAChBxE,KAAK+b,OAAS,EACd/b,KAAKwQ,QAAUlN,EAAOoiB,WAAW,KACnC,CAEQ29B,UACN,IAAIjyB,EAAQ5qB,KAAKmD,MAAM3J,KAAKsjB,MAAQtjB,KAAK0jB,QAAU,IAAM,EAAA9I,UAAY,EAAI,KACzEwW,GAASpxB,KAAKi5B,UAAY,EAC1B7H,EAAQ5qB,KAAKI,IAAI,EAAAgU,UAAY,IAAO,KAAMwW,GAC1CA,EAAQ5qB,KAAKmD,MAAMynB,GACnB,MAAMkyB,EAAyBtjD,KAAKsjD,KAAO,IAAIpqC,MAAMkY,GAErD,IAAI,IAAIhN,EAAI,EAAGA,EAAIgN,IAAShN,EAC1Bk/B,EAAKl/B,GAAKpkB,KAAKujD,aAEnB,CAEQA,YAAYC,GAClB,MAAMt8B,EAAI1gB,KAAK+sC,MAAM/sC,KAAK8zC,SAAWt6C,KAAKsD,OAAOggB,OAC3C6D,EAAI3gB,KAAK+sC,MAAM/sC,KAAK8zC,SAAWt6C,KAAKsD,OAAOogB,QAC3CkB,EAAU4+B,EAAS,EAAIh9C,KAAK8zC,SAC5BmJ,GAAUj9C,KAAK8zC,UAAY,GAAK,EAAI,IAAOt6C,KAAKmjD,IAChDx+B,EAAO,IAAI++B,OAEjB,OADA/+B,EAAKg/B,IAAIz8B,EAAGC,EAAGs8B,EAAQ,EAAG,EAAIj9C,KAAKo9C,IAAI,GAChC,CACL18B,IACAC,IACAvC,UACA6+B,SACAI,SAAUj/B,EACV4+B,OAAQA,QAAAA,EAAUh9C,KAAK8zC,UAAY,GACnCxY,QAAS,EACTnd,OAEJ,CAEQm/B,OACN,MAAM,QAACtzC,EAAO,OAAElN,EAAM,KAAEggD,GAAQtjD,KAChCwQ,EAAQ6/B,UAAU,EAAG,EAAG/sC,EAAOggB,MAAOhgB,EAAOogB,QAC7ClT,EAAQ4mC,UAAY,OAGpB,IAAI,IAAIhzB,EAAI,EAAGvhB,EAASygD,EAAKzgD,OAAQuhB,EAAIvhB,IAAUuhB,EAAG,CACpD,MAAM2/B,EAAMT,EAAKl/B,GACX4/B,EAAaD,EAAIP,OAHb,SAKVO,EAAIF,UAAYG,EAIhB,MAAMC,GAAe,OAAMF,EAAIF,SAAU,EAAG,GAC5CrzC,EAAQ0zC,YAAcD,EACtBzzC,EAAQ2zC,KAAKJ,EAAIp/B,MAEdo/B,EAAIF,UAAY,GACjBE,EAAIP,QAAS,IAERO,EAAIjiB,SAAW,IAClBwhB,EAAKl/B,GAAKpkB,KAAKujD,YAAYQ,EAAIP,UAEzBO,EAAIF,UAAY,IACxBE,EAAIP,QAAS,E,CAGnB,CAEOhhD,SACLxC,KAAKuE,OACP,CAEOA,QACFvE,KAAKsE,SAIRtE,KAAKsE,QAAS,IACZtE,KAAK+b,OACT,CAEOqoC,mBACDpkD,KAAKsjD,MACPtjD,KAAKqjD,UAGPrjD,KAAK8jD,MACP,CAEOr/C,OACL,IAAIzE,KAAKsE,OACP,OAGFtE,KAAKsE,QAAS,EACd,MAAMyX,IAAW/b,KAAK+b,OAElB/b,KAAKsjD,MACPtjD,KAAKqjD,WAGP,SAAQ,IACHrjD,KAAK+b,SAAWA,IAAU/b,KAAKsE,SAIlCtE,KAAK8jD,QACE,IAEX,CAEOrtC,eAAc,MACnB6M,EAAK,OACLI,EAAM,WACN2P,EAAU,eACV2F,EAAc,SACdC,IAQA,MAAMorB,EAAc,IAAInB,EAAY5/B,EAAOI,EAAQuV,GAKnD,OAJAorB,EAAYD,mBAEZ,iBAAkCC,EAAarrB,EAAgBqrB,EAAY/gD,OAAQ+vB,GAE5EgxB,CACT,E,oGC9Ja,MAAMC,EAenBvkD,YAAY8tB,GAHJ,KAAA02B,WAAY,EACZ,KAAAhzB,WAAa,IAoEd,KAAAizB,UAAY,KACjB,GAAGxkD,KAAKykD,aACN,OAAO,EAGT,IAAIC,EAAgB,EAAGC,EAAiB,EAAGC,EAAsB,EAiBjE,OAhBA5kD,KAAK6kD,YAAY9/C,SAAS+rB,IACrBA,EAAWg0B,YACTh0B,EAAW0zB,eACVE,EAGD5zB,EAAWi0B,YACVH,GAIH9zB,EAAWi0B,YACVJ,C,IAICA,IAAmBC,GAAuBF,EAAgB,CAAC,EAG7D,KAAAM,aAAe,KACpBhlD,KAAKilD,QAAQ1xC,UAAU1J,OAAO,aAAc7J,KAAKwkD,YAAY,GAlF7D,OAAWxkD,KAAM6tB,GAEjB7tB,KAAKgI,SAALhI,KAAKgI,OAAW,MAEZhI,KAAKilD,QAEEjlD,KAAKilD,QAAQ1xC,UAAUqB,SAAS,gBACzC5U,KAAKglD,aAAe,KAClBhlD,KAAKilD,QAAQzG,gBAAgB,YAAax+C,KAAKwkD,aAAexkD,KAAK0wC,SAAS,GAH9E1wC,KAAKilD,SAAU,OAAa,CAAClxC,KAAM,UAOjC8Z,EAAQq3B,gBACVllD,KAAKmlD,WAAa,IAAI,IACtBnlD,KAAKmlD,WAAW5xC,UAAUxS,IAAI,qBAAsB,UAAYf,KAAKuxB,YACrEvxB,KAAKmlD,WAAW97B,kBAAkB,CAACrhB,OAAQhI,KAAKgI,SAE5C6lB,EAAQu3B,kBACVplD,KAAKqlD,WAAa,IAAI,KAAYC,IAChCtlD,KAAKykD,aAAea,EACpBtlD,KAAKglD,eACLhlD,KAAKmlD,WAAW3iD,QAAQ,GACvBqrB,EAAQ03B,cAEXvlD,KAAKqlD,WAAWj6C,UAAUM,OAAO1L,KAAKmlD,cAI1CnlD,KAAK6kD,YAAY9/C,SAAS+rB,IACxB9wB,KAAK6R,eAAe9Q,IAAI+vB,EAAWC,MAAnC/wB,CAA0C,QAASA,KAAKglD,aAAa,IAGvEhlD,KAAKglD,cACP,CAEWtU,eACT,OAAO1wC,KAAKukD,SACd,CAEW7T,aAAShkC,GAClB1M,KAAKukD,UAAY73C,EACjB1M,KAAK6kD,YAAY9/C,SAAS+rB,GAAeA,EAAWC,MAAMytB,gBAAgB,WAAY9xC,KACtF1M,KAAKglD,cACP,CAEOQ,gBAAgBj3C,EAAuBk3C,GAAkB,GAC9DzlD,KAAK0wC,UAAW,EAChBniC,EAAQD,MAAK,KACRm3C,IACDzlD,KAAK0wC,UAAW,E,IAEjB,KACD1wC,KAAK0wC,UAAW,CAAK,GAEzB,E,wMCjFa,MAAMgV,EAKnB3lD,YAAoBkH,GAAA,KAAAA,SAAAA,CAEpB,CAEAurB,OACExyB,KAAK2S,QAAUtH,SAAS+Q,eAAe,gBACvC,MAAMupC,EAAgB3lD,KAAK2S,QAAQ4C,mBACnC,QAAiBowC,EAAeC,EAAkB7uB,cAElD,MAAMJ,EAAS32B,KAAKswB,WAAa,IAAI,KAAWtwB,KAAK2S,QAAS,QACxDkzC,EAAU,IAAI,IAAYF,EAAeG,EAAuBnvB,GAChE3a,GAAY,EAAAwnB,EAAA,GAAaxjC,KAAK2S,SAAS,GAE7C3S,KAAKiH,SAASC,eAAe6+C,UAAUz3C,MAAM03C,IAC3CA,EAAKjhD,SAASpD,IACZkkD,EAAQ9kD,IAAIY,EAAI,IAGlBqa,EAAUxZ,QAAQ,IAGpB,0BAAyCqjD,EAAQxnC,cAAewnC,EAAQI,qBAExEjmD,KAAKwyB,KAAO,IACd,CAEArX,UAEA,E,+WC3BF,MAAM+qC,EAAqC,cAE5B,MAAMC,UAAmB,IAAxC,c,oBAIU,KAAAC,WAAa,GACb,KAAAC,WAAY,EAmCZ,KAAAC,YAAoBv+C,GAA+B,EAAD,gCACxD,MAAM1H,GAAS,EAAAkd,EAAA,GAAgBxV,EAAE1H,OAAQ,OACzC,IAAIA,EAAQ,OAEZ,MAAMkmD,EAASlmD,EAAOgmB,QAAQjf,aACrByqB,EAAA,sCAAgD00B,IACpDp8B,EAAA,YACD,uBAGF/d,QAAQC,KAAK,oBAAqBk6C,EAEtC,GA2DF,CAnGS/zB,OACLxyB,KAAKoL,UAAUxD,GAAK,wBAEpB5H,KAAKwmD,YAAc,IAAI,IAAY,mBAAoB95C,IACrD1M,KAAK2Q,QACL3Q,KAAK8uB,OAAOpiB,EAAM,IAGpB1M,KAAK+O,MAAMya,YAAYxpB,KAAKwmD,YAAYp7C,WAExCpL,KAAKymD,QAAUp7C,SAASC,cAAc,OACtCtL,KAAKymD,QAAQlzC,UAAUxS,IAAI,iBAC3B,QAAiBf,KAAKymD,QAASzmD,KAAKsmD,YAAa,CAACz0C,eAAgB7R,KAAK6R,iBAEvE7R,KAAKswB,WAAW5kB,OAAO1L,KAAKymD,SAE5BzmD,KAAK6lD,QAAU,IAAI,IAAY7lD,KAAKymD,QAASP,EAAgBlmD,KAAKswB,YAGlE,oBAA8B,GAAMhiB,MAAK,KACvCtO,KAAK8uB,OAAO,IAAI,GAEhB9uB,KAAKswB,WAAWK,iBAAmB,KACjC3wB,KAAK8uB,OAAO9uB,KAAKwmD,YAAY95C,OAAO,EAAM,CAC3C,GAEL,CAgBOyO,UACLnb,KAAKswB,WAAWK,iBAAmB,MACrC,CAEO+1B,sBAKL,OAJA1mD,KAAK2Q,QACL3Q,KAAKymD,QAAQjnC,UAAY,GACzB1f,EAAA,uBAAqCmE,EAAWiiD,GAChDlmD,KAAKwmD,YAAYhkD,SACV0P,MAAMw0C,qBACf,CAEQ/1C,QACN3Q,KAAKkwB,cAAgB,KACrBlwB,KAAKomD,WAAa,GAClBpmD,KAAKqmD,WAAY,EACjBrmD,KAAK6lD,QAAQrkC,OACf,CAEasN,OAAOsB,EAAeu2B,GAAY,G,yCAC7C,IAAG3mD,KAAKkwB,gBAAiBlwB,KAAKqmD,UAA9B,CAEIrmD,KAAK4mD,eACP5mD,KAAK4mD,oBAAsB5mD,KAAKiH,SAASy2B,gBAAgBmpB,gBAAgB,QAAQj/C,GAAGgrB,UAAS,IAG/F,IACE5yB,KAAKkwB,cAAgBlwB,KAAKiH,SAAS6/C,qBAAqBC,iBAAiB,KAAc/mD,KAAK4mD,aAAcx2B,EAAOpwB,KAAKomD,YACtH,MAAM,QAACxqB,EAAO,YAAEorB,SAAqBhnD,KAAKkwB,cAE1C,GAAGlwB,KAAKwmD,YAAY95C,QAAU0jB,EAC5B,OAGFpwB,KAAKkwB,cAAgB,KACrBlwB,KAAKomD,WAAaY,EACfL,IACD3mD,KAAKymD,QAAQjnC,UAAY,IAGxBoc,EAAQ/4B,OACT+4B,EAAQ72B,SAAS+kC,IACC,yBAAbA,EAAOl6B,GAAgCk6B,EAAOz+B,UAC/CrL,KAAK6lD,QAAQ9kD,IAAI+oC,EAAOz+B,S,IAI5BrL,KAAKqmD,WAAY,EAGnBrmD,KAAKswB,WAAWwG,U,CAChB,MAAMtxB,GAGN,MAFAxF,KAAKkwB,cAAgB,KACrB9jB,QAAQigB,MAAM,sBAAuB7mB,GAC/BA,C,CAlCuC,CAoCjD,G,2EC5Ga,MAAMyhD,UAAuB,IAKnCz0B,OACLxyB,KAAKoL,UAAUxD,GAAK,qBACpB5H,KAAKoL,UAAUmI,UAAUxS,IAAI,sBAE7Bf,KAAKqe,cAAgB,IAAI,IAEzBre,KAAKwmD,YAAc,IAAI,IAAY,iCAAkC95C,IACnE1M,KAAK8uB,OAAOpiB,EAAM,IAGpB1M,KAAK+O,MAAMya,YAAYxpB,KAAKwmD,YAAYp7C,WAExCpL,KAAKknD,QAAU77C,SAASC,cAAc,OACtCtL,KAAKknD,QAAQ3zC,UAAUxS,IAAI,gBAC3Bf,KAAKswB,WAAW5kB,OAAO1L,KAAKknD,UAE5B,OAA6B,CAACC,SAAUnnD,KAAKknD,QAASr1C,eAAgB7R,KAAK6R,kBAE3E,QAAiB7R,KAAKknD,SAAUn/C,IAC9B,MAAMq/C,GAAU,EAAA7pC,EAAA,GAAgBxV,EAAE1H,OAAQ,uBAC1C,GAAG+mD,EAAS,CACV,MAAMhgD,EAAQggD,EAAQ/gC,QAAQjf,MAE9B,YADAyqB,EAAA,sCAAgDzqB,E,CAIlD,MAAM/G,GAAS,EAAAkd,EAAA,GAAgBxV,EAAE1H,OAAQ,eACzC,IAAIA,EAAQ,OAEZ,MAAMuH,EAAKvH,EAAOgmB,QAAQghC,WACpBC,EAAcjnD,EAAOgmB,QAAQihC,YAE7BhxC,GAAS,EAAAiH,EAAA,GAAgBxV,EAAE1H,OAAQ,sBACtCiW,GACDvO,EAAE2qB,iBACF3qB,EAAE4qB,cAAe,EAEjBrc,EAAO3I,aAAa,WAAY,QAEhC3N,KAAKiH,SAASsgD,mBAAmBC,cAAc,CAAC5/C,KAAI0/C,gBAAch5C,MAAM6qB,IACtEn5B,KAAKiH,SAASsgD,mBAAmBE,iBAAiBtuB,EAAKv1B,KAAK0K,MAAMo5C,IAC7DA,IACDpxC,EAAOsC,YAAc,GACrBtC,EAAO5K,QAAO,QAAKytB,EAAKv1B,IAAI+jD,eAAiB,uBAAyB,uBACtErxC,EAAO/C,UAAU1J,OAAO,SAAUsvB,EAAKv1B,IAAI+jD,gB,IAE5CxvC,SAAQ,KAET7B,EAAOsxC,gBAAgB,WAAW,GAClC,KAGJ5nD,KAAKiH,SAASsgD,mBAAmBC,cAAc,CAAC5/C,KAAI0/C,gBAAch5C,MAAM6qB,IACtE,IAAI,IAAcA,EAAKv1B,KAAK2nB,MAAM,G,GAGrC,CAAC1Z,eAAgB7R,KAAK6R,iBAEzB,oBAA8B,GAAMvD,MAAK,KACvCtO,KAAK6nD,gBAAgB,GAEzB,CAEOnB,sBAGL,OAFA1mD,KAAKknD,QAAQ1nC,UAAY,GACzB1f,EAAA,uBAAqCmE,EAAW,mBACzCiO,MAAMw0C,qBACf,CAEOoB,UAAUlkD,GAEf,MAAMknB,EAAMzf,SAASC,cAAc,OACnCwf,EAAIvX,UAAUxS,IAAI,eAElB,MAAMgnD,EAAS18C,SAASC,cAAc,OACtCy8C,EAAOx0C,UAAUxS,IAAI,sBAErB,MAAMsF,EAAUgF,SAASC,cAAc,OACvCjF,EAAQkN,UAAUxS,IAAI,uBACtBsF,EAAQmZ,UAAY,wCAEpB,EAAAib,EAAA,GAAap0B,EAAQkP,mBAAmB,EAAAyT,EAAA,GAAcplB,EAAImL,QAE1D,MAAMi5C,EAAW38C,SAASC,cAAc,OACxC08C,EAASz0C,UAAUxS,IAAI,qBACvBinD,EAASt8C,QAAO,QAAK,WAAY,CAAC9H,EAAIwtB,SACtC/qB,EAAQqF,OAAOs8C,GAEf,MAAM1xC,EAASjL,SAASC,cAAc,UACtCgL,EAAO/C,UAAUxS,IAAI,cAAe,oBAAqB,sBACzDuV,EAAO5K,QAAO,QAAK9H,EAAI+jD,eAAiB,uBAAyB,uBAG9D/jD,EAAI+jD,gBACLrxC,EAAO/C,UAAUxS,IAAI,QAKvBgnD,EAAOr8C,OAAOrF,EAASiQ,GAEvB,MAAM2xC,EAAc58C,SAASC,cAAc,OAC3C28C,EAAY10C,UAAUxS,IAAI,wBAE1B,MAAMqwB,EAAQ5qB,KAAKI,IAAI,EAAGhD,EAAIwtB,OAC9B,IAAI,IAAIhN,EAAI,EAAGA,EAAIgN,IAAShN,EAAG,CAC7B,MAAM8jC,EAAa78C,SAASC,cAAc,OAC1C48C,EAAW30C,UAAUxS,IAAI,uBAEzBknD,EAAYv8C,OAAOw8C,E,CAGrBloD,KAAKiH,SAASsgD,mBAAmBC,cAAc5jD,GAAK0K,MAAM1K,IAGxD,IAAI,IAAIwgB,EAAI,EAAGA,EAAIgN,IAAShN,EAAG,CAC7B,MAAM0G,EAAMm9B,EAAY1yB,SAASnR,GAC3BziB,EAAMiC,EAAIukD,UAAU/jC,GACb,kBAAVziB,EAAIiO,IAIP,QAAY,CACVjO,MACAmpB,MACAzM,cAAere,KAAKqe,cACpB/d,MAAO,kBAGPmE,MAAM,EACNf,MAAM,EACN4f,MAAO,GACPI,OAAQ,GACR0kC,UAAU,G,KA8BhBt9B,EAAIzE,QAAQghC,WAAa,GAAKzjD,EAAIgE,GAClCkjB,EAAIzE,QAAQihC,YAAc,GAAK1jD,EAAI0jD,YACnCx8B,EAAIzE,QAAQtX,MAAQnL,EAAImL,MAExB+b,EAAIpf,OAAOq8C,EAAQE,GAEnBjoD,KAAKknD,QAAQx7C,OAAOof,EACtB,CAEO+8B,iBACL,OAAO7nD,KAAKiH,SAASsgD,mBAAmBc,sBAAsB/5C,MAAMg6C,IAC/DtoD,KAAKwmD,YAAY95C,QAIpB47C,EAActoD,KAAKuoD,eAAe,GAAID,IAC1BvjD,SAASnB,IACnB5D,KAAK8nD,UAAUlkD,EAAIA,IAAI,GACvB,GAEN,CAEQ2kD,eAAen4B,EAAek4B,GACpCA,EAAcA,EAAYhxB,QAE1B,MAAM/B,EAAWrc,MAAMC,KAAKnZ,KAAKknD,QAAQ3xB,UAczC,OAbA,EAAAizB,EAAA,GAAejzB,GAAU30B,IACvB,MAAMgH,EAAKhH,EAAGylB,QAAQghC,WAChBj5B,EAAQk6B,EAAYt/C,WAAWy/C,GAAYA,EAAQ7kD,IAAIgE,KAAOA,KAEtD,IAAXwmB,EACDk6B,EAAYh6B,OAAOF,EAAO,GACjBgC,GAAUxvB,EAAGylB,QAAQtX,MAAM2Z,cAAc3T,SAASqb,EAAM1H,gBACjE9nB,EAAG4B,Q,IAIP1C,EAAA,uBAAqCmE,EAAW,mBAEzCqkD,CACT,CAEOx5B,OAAOsB,GACZ,OAAIA,EAIGpwB,KAAKiH,SAASsgD,mBAAmBmB,kBAAkBt4B,GAAO,GAAO9hB,MAAMg6C,IACzEtoD,KAAKwmD,YAAY95C,QAAU0jB,IAM9Bk4B,EAActoD,KAAKuoD,eAAen4B,EAAOk4B,IAC7BvjD,SAASnB,IACnB5D,KAAK8nD,UAAUlkD,EAAIA,IAAI,GACvB,IAbK5D,KAAK6nD,gBAehB,E,qbClNK,MAAM/B,EAA4C,qBAenD6C,EAAwC,CAC5CC,cAAe,IACfC,mBAHa,IAAa,IAAM,EAAK,IAAM,IAMtC,MAAMjD,UAA0B,IAqBrC7lD,cACEmS,MAAM,CACJhQ,QAASmJ,SAAS+Q,eAAe,kBACjC0sC,wBAAyB,wBAfrB,KAAAC,OAAS,EAwPT,KAAAC,iBAAoBphD,IAC1B,GAAG5H,KAAK+oD,QAAUnhD,EAMlB9H,EAAA,mBAAqC,EAAMgmD,GAE3C9lD,KAAK+oD,MAAQnhD,EACb5H,KAAKipD,aAAa11C,UAAU1J,OAAO,OAAQ7J,KAAK+oD,QAAU/oD,KAAKkpD,SAASH,OACxE/oD,KAAKmpD,UAAU51C,UAAU1J,OAAO,OAAQ7J,KAAK+oD,QAAU/oD,KAAKkpD,SAASH,WAVrE,CACE,MAAM,IAAC71C,GAAOlT,KACdA,KAAKopD,SAASl2C,EAAKA,EAAIod,WAAWllB,UAAUmK,kB,CAQ6B,EAGrE,KAAA8zC,YAAc,IAAW,kCAC/B,MAAM,OAACrhD,EAAM,SAAEiL,GAAY4e,EAAA,QACrB0D,EAAWv1B,KAAKspD,OAAO/zB,SACvBg0B,EAAerwC,MAAMC,KAAKoc,IAEzBi0B,EAAiBC,SAAqBroC,QAAQgI,IAAI,CACvDppB,KAAKiH,SAAS8G,mBAAmB27C,cAAc1hD,EAAQiL,EAAU,iBACjEjT,KAAKiH,SAAS8G,mBAAmB27C,cAAc1hD,EAAQiL,EAAU,eAGnEs2C,EAAavpD,KAAK2pD,YAAYZ,MAAQ,GAAGvK,gBAAgB,YAAagL,GACtED,EAAavpD,KAAK4pD,QAAQb,MAAQ,GAAGvK,gBAAgB,YAAaiL,GAElE,MAAM3nC,EAAS9hB,KAAKspD,OAAO1xC,cAAc,YACtCkK,IAAU,EAAA+nC,EAAA,GAAW/nC,KAAa9hB,KAAKkpD,SAASH,MAAQ,GAAQS,GAAoBC,GACrFzpD,KAAKs1B,UAAUt1B,KAAKkpD,SAASH,OAAO,EAExC,IArQE/oD,KAAK4N,iBAAiB,QAAQ,IAAW,kC,MACpC,MAEE,EAAAguC,EAAA,aACK,EAAAr3C,EAAA,GAAM,MAIbvE,KAAKkC,QAAQ+W,gBAAkB4Y,EAAA,yBAChCA,EAAA,+BAAyC7xB,KAAKkC,SAGhDlC,KAAK8pD,WAAa9pD,KAAK+pD,eAEvBnE,EAAkBvnC,cAAclZ,OAEhCrF,EAAA,wBAA2CgmD,GAE3C,MAAM5yC,EAAMlT,KAAKkT,IACP,QAAV,EAAAA,EAAIgI,cAAM,gBACZ,MAEAlb,KAAK4N,iBAAiB,UAAU,K,MAC9B9N,EAAA,0BAA6CgmD,GAC7CF,EAAkBvnC,cAAcqZ,mBAIhC,MAAMxkB,EAAMlT,KAAKkT,IACL,QAAZ,EAAAA,EAAI82C,gBAAQ,gBAAI,IAGlBhqD,KAAK4N,iBAAiB,SAAS,K,MAC7Bg4C,EAAkBvnC,cAAclZ,OAIhCrF,EAAA,wBAA2CgmD,GAC3ChmD,EAAA,mBAAqC,EAAMgmD,GAE3C,MAAM5yC,EAAMlT,KAAKkT,IACN,QAAX,EAAAA,EAAIiI,eAAO,gBAAI,IAGjBnb,KAAK4N,iBAAiB,UAAU,K,MAE9B9N,EAAA,0BAA6CgmD,GAC7CF,EAAkBvnC,cAAc4rC,SAChCrE,EAAkBvnC,cAAc6rC,UAIhClqD,KAAK8pD,gBAAa7lD,EAElB,MAAMiP,EAAMlT,KAAKkT,IACL,QAAZ,EAAAA,EAAIi3C,gBAAQ,gBAAI,GAEpB,CAEWj3C,UACT,OAAOlT,KAAKmzB,KAAKnzB,KAAK+oD,MACxB,CAEOv2B,OACLxyB,KAAKiH,SAAWgX,EAAA,WAChBje,KAAKkpD,SAAW,IAAI,KAAS,CAACjiD,SAAUjH,KAAKiH,WAC7CjH,KAAK2pD,YAAc,IAAI,KAAY3pD,KAAKiH,UACxCjH,KAAK4pD,QAAU,IAAIlE,EAAQ1lD,KAAKiH,UAEhCjH,KAAKmzB,KAAO,CAAC,EACb,CAACnzB,KAAKkpD,SAAUlpD,KAAK2pD,YAAa3pD,KAAK4pD,SAAS7kD,SAAQ,CAACmO,EAAKnK,KAC5DmK,EAAI61C,MAAQhgD,EACZ/I,KAAKmzB,KAAKpqB,GAAOmK,CAAG,IAGtBlT,KAAKoL,UAAYpL,KAAKkC,QAAQ0V,cAAc,oCAC5C5X,KAAKoL,UAAU4M,QAAQhY,KAAKkpD,SAAS99C,UAAWpL,KAAK2pD,YAAYv+C,WACjEpL,KAAKspD,OAAStpD,KAAKkC,QAAQ0V,cAAc,eACzC5X,KAAKs1B,WAAY,EAAAQ,EAAA,GAAe91B,KAAKspD,OAAQtpD,KAAKoL,UAAWpL,KAAKgpD,kBAAkB,K,MAClF,MAAM,IAAC91C,GAAOlT,KACN,QAAR,EAAAkT,EAAIsf,YAAI,iBACR1yB,EAAA,mBAAqC,EAAOgmD,EAAsB,IAGpE9lD,KAAKipD,aAAejpD,KAAKkC,QAAQ0V,cAAc,sBAC/C5X,KAAKipD,aAAar7C,iBAAiB,SAAS,KACvC5N,KAAK+oD,QAAU/oD,KAAK2pD,YAAYZ,MAC7B,iBAA4B9B,IAC9B,eAA0BA,GAAgB77B,OAGxC,iBAA4B+6B,IAC9B,eAA0BA,GAAY/6B,M,IAK5CprB,KAAKmpD,UAAYnpD,KAAKkC,QAAQ0V,cAAc,uBAC5C,QAAiB5X,KAAKmpD,WAAYphD,KAChC,EAAAqS,EAAA,GAAYrS,GACZ,MAAMgpB,EAAQc,EAAA,2BAEd,IAAIu4B,EAAQ,kBAA+BC,cAAct5B,GACrDq5B,IACFA,EAAQ/+C,SAASsvC,cACjByP,EAAME,cAAcv5B,EAAM+b,YAG5B,MAAMyd,EAAWH,EAAMI,aAEvB,GAAGJ,EAAMK,UAAW,CAClB,MAAM,KAACC,EAAI,OAAExwB,IAAU,OAAanJ,EAAOq5B,EAAMO,aAAcP,EAAMQ,WACrE,IAAIC,EACJ,GAAG3wB,EACD2wB,EAAeH,MACV,CAEL,GADAG,EAAeH,EAAKI,iBAChBD,EACF,OAGF,KAAMA,EAAaE,WAAaF,EAAaG,YAAcH,EAAaI,YAAcJ,EAAeA,EAAaC,mBAIlH,GAAGD,EAAaE,WAAaF,EAAaK,eAAkBL,EAA6BM,kBACvF,M,CAIJ,GAAGN,EAAaE,WAAaF,EAAaK,cAAkD,QAAjCL,EAAqB3tC,QAC9EqtC,EAASa,WAAWP,OACf,CACL,MAAM72C,EAAO,IAAI62C,EAAajyC,aAC9B,IAAIupB,EACJ,GAAGjI,EAAQ,CACT,IAAIr3B,EAAS,EACbs/B,EAAInuB,EAAKtT,MAAMsT,IAAUnR,GAAUmR,EAAKnR,OAAQA,GAAUq3B,I,MAE1DiI,EAAInuB,EAAKyR,OAAS,GAGpB,MAAM4lC,EAAYnxB,EAASA,EAASiI,EAAEt/B,OAASgoD,EAAajyC,YAAY/V,OAASs/B,EAAEt/B,OACnF0nD,EAASe,SAAST,EAAcQ,E,EAIpCd,EAASgB,iBAET15B,EAAA,oDAA8D,IA0BhE,MAAM25B,EAAiB,EAAAlwC,kBAAmB,EAEpCmwC,EAAcD,EAAiBxrD,KAAK2pD,YAAYZ,MAAQ/oD,KAAKkpD,SAASH,MAW5E,GATGyC,GACAxrD,KAAKspD,OAAO/zB,SAAS,GAAmBhiB,UAAUxS,IAAI,SAGzD,QAAmBf,KAAKspD,OAAO/zB,SAASk2B,EAAc,IACnDzrD,KAAKmzB,KAAKs4B,GAAaj5B,MACxBxyB,KAAKmzB,KAAKs4B,GAAaj5B,QAGrB,IAAoB,CACtB,IAAIk5B,EAAgCC,GAAyB,EAC7D,MAAMvS,EAAerxC,IACnB2jD,EAAqB3jD,CAAC,EAExB6R,EAAA,mBAAgC,UAAWgyC,IACtCA,EACGD,IACFtgD,SAASI,KAAKmC,iBAAiB,YAAawrC,GAC5CuS,GAAyB,GAEnBA,IACRtgD,SAASI,KAAKiG,oBAAoB,YAAa0nC,GAC5CsS,GACD1rD,KAAK6rD,WAAWH,G,IAYxB,OANA75B,EAAA,oBAA8B,iBAAiB,KAC7C7xB,KAAK6J,QAAO,EAAM,IAEpBgoB,EAAA,oBAA8B,eAAgB7xB,KAAKqpD,aACnDrpD,KAAKqpD,cAEEn3C,MAAMsgB,MACf,CAEOs5B,aACL,OAAO9rD,KAAKkC,OACd,CAEOknD,SAASl2C,EAAmBhR,GACjCgR,EAAIod,WAAW4F,kBAAkB,OAAD,QAC9Bh0B,QAASA,EACT6pD,KAAM,IACN51B,SAAU,SACPwyB,GAEP,CA2MOlyC,iBAAuBrP,EAAc4kD,EAAsBC,G,yCAChE,aAASp6B,EAAA,sCAAgDzqB,OAAOnD,EAAW+nD,EAAYC,KAGlFC,GAAkB9gD,YACnB8gD,GAAkBC,YAAa,EAE/BD,GAAkBriD,QAAO,KAGpB,IAEPuC,QAAQC,KAAK,oBAAqBjF,IAC3B,EAEX,G,CAEOglD,uBAAuB/tC,EAAyC4nC,GACrEjmD,KAAK4N,iBAAiB,SAAS,KAC7ByQ,EAAclZ,MAAM,IAGtBnF,KAAK4N,iBAAiB,UAAU,KAC9B,MAAMy+C,EAAOhuC,EAAciuC,YAAYC,aAEvC,IAAI,MAAMzhC,KAAOuhC,EACfpG,EAAoBn7B,GAGtBzM,EAAciuC,YAAYE,cAAc,IAG1CxsD,KAAK4N,iBAAiB,UAAU,KAC9ByQ,EAAcqZ,kBAAkB,GAEpC,CAEO2yB,gBACL,OAAOrqD,KAAK+pD,gBAAkB/pD,KAAK8pD,UACrC,CAEQC,eACN,MAAM0C,EAAMphD,SAASovC,eACrB,GAAGgS,EAAIC,YAAcrhD,SAASshD,gBAAkB96B,EAAA,2BAC9C,OAAO46B,EAAIG,WAAW,EAE1B,E,IAvfc,EAAAvuC,cAAgB,IAAI,IAAc,GAiSlC,EAAAwuC,YAAc,CAC1BC,EACAlb,EACAthB,EACAy8B,EACAC,EACAn7C,KAEA,IAAIo7C,GAAY,EAEhB,MAeMx9B,EAAY,CAACvc,EAAqByjB,GAAS,KAC/C,GAAGzjB,IAAQ85C,EACT,OAAO,EAGT,IAAInoB,GAAI,EAmCR,OAlCGmoB,IACDA,EAAQxnC,SAASsP,QAAQvhB,UAAU/Q,OAAO,UACvCwqD,EAAQD,YAAcC,EAAQD,aAAe75C,EAAI65C,aAClDloB,GAAI,EAEJmoB,EAAQD,WAAW3hD,UAAU6N,cAAc1F,UAAU/Q,OAAO,UAC5DwqD,EAAQD,WAAW72B,kBAAkB,OAAD,QAClCh0B,QAAS8qD,EAAQD,WAAW3hD,UAAUmK,kBACtCyyB,eAAgBrR,OAAS1yB,EAAY,WACrCkyB,SAAU,SACV41B,KAAM,KACHpD,MAKTz1C,EAAIsS,SAASsP,QAAQvhB,UAAUxS,IAAI,UAEhCmS,EAAI65C,aACL75C,EAAI65C,WAAW3hD,UAAU6N,cAAc1F,UAAUxS,IAAI,UACrD41B,GAAUo2B,EAAW72B,kBAAkB,OAAD,QACpCh0B,QAASgR,EAAI65C,WAAW3hD,UAAU6N,cAClCkd,SAAU,SACV41B,KAAM,KACHpD,KAIJqE,GAjDe,EAAC95C,EAAqB2xB,KACxC,MAAM1D,EAAIjuB,EAAI65C,YAAcA,EACzB5rB,GACDA,EAAEjL,kBAAkB,OAAD,QACjBh0B,QAASgR,EAAIsS,SAASsP,QACtBqB,SAAU,SACV41B,KAAM,IACNmB,mBAAoBroB,EAAI,EAAEsoB,qBACjBA,EAAkB,SACvBlpD,GACD0kD,G,EAwCLyE,CAAYl6C,EAAK2xB,GAGnBmoB,EAAU95C,GAEH,CAAI,EAeb,IAAIm6C,GAAqB,EACzB,MAAMC,EAAoB,IAAI,IAAkBh9B,EAAWllB,WAAW,CAACmiD,EAAOltD,KAC5E,GAAGgtD,EACD,OAKF,GAAG7mD,KAAKuZ,IAAIktC,EAAW38B,EAAWllB,UAAUsrB,YAAc,EACxD,OAEAu2B,GAAY,EAGd,MAAM/5C,EAAM45C,EAAUU,uBAAuBntD,GACvCotD,GAAQ,EAAA5D,EAAA,GAAWxpD,IACrBktD,IAAUE,IAASv6C,EAAI65C,aAI3Bt9B,EAAUvc,EAAI,KAGhB,QAAiB0+B,GAAO7pC,IACtB,IAAI1H,GAAS,EAAAkd,EAAA,GAAgBxV,EAAE1H,OAAuB,4BACtD,IAAIA,EAAQ,CAEV,GADAA,GAAS,EAAAkd,EAAA,GAAgBxV,EAAE1H,OAAuB,0BAC9CA,GAAUA,EAAOkT,UAAUqB,SAAS,UACtC,OAGFvU,EAASA,EAAOkV,kBAAkBA,iB,CAGpC,MAAMk4C,GAAQ,EAAA5D,EAAA,GAAWxpD,GAEnB6S,EAAM45C,EAAUY,qBAAqBrtD,GAMxCovB,EAAUvc,GAKb,IAAIujB,EAAY,EAAGk3B,EAAmB,EACtC,GAAGF,EAAQ,GAAKv6C,EAAI65C,WAAY,CAC9B,MAAM7qD,EAAUgR,EAAIsS,SAASpa,UAC7BuiD,EAAmB,EACnBl3B,EAAYv0B,EAAQu0B,UAAYk3B,C,CAGlCV,EAAWx2B,EAEX42B,GAAqB,EACrB/8B,EAAW4F,kBAAkB,OAAD,QAC1Bh0B,QAASu0B,EAAYvjB,EAAIsS,SAASpa,UAAYklB,EAAWllB,UAAUmK,kBACnE4gB,SAAU,QACV41B,KAAM,IACNmB,mBAAoBz2B,EAAY,EAAE02B,qBAAqBA,EAAkBQ,OAAmB1pD,GACzF0kD,IACFxwC,SAAQ,KACTsX,EAAUvc,GACVm6C,GAAqB,CAAK,GAC1B,GACD,CAACx7C,mBAEJ,MAAM4C,EAAI6b,EAAW3c,mBAAqB2c,EAAW3c,mBAAmB2G,KAAKgW,GAAc6H,EAAA,EAM3F,OALA7H,EAAW3c,mBAAqB,KAC9Bm5C,EAAUn6C,QAAQsG,cAAc1F,UAAU1J,OAAO,gBAAiBymB,EAAWoG,WAC7EjiB,GAAG,EAGE,CAAC64C,oBAAmB79B,YAAWm+B,gBAvFb16C,IACvB,GAAG85C,aAAO,EAAPA,EAASa,MACV,OAGFf,EAAUx8B,WAAWoG,UAAYxjB,EAAIsS,SAASpa,UAAUqrB,UAAY,EACpE,MAAM1sB,EAAI+iD,EAAUC,WAAW3hD,UACzBrD,EAAImL,EAAIsS,SAASsP,QACvB/qB,EAAE+jD,WAAa/lD,EAAE0b,WAAa1Z,EAAEgkD,YAAc,EAAIhmD,EAAE4/B,YAAc,EAClElY,EAAUvc,GAAK,EAAM,EA8E+B,EAG1C,EAAA6jB,aAAe,CAAMhvB,EAAoCikD,GAAa,EAAOC,IAAqB,oCAC9G,MAAM5rD,GAAS,EAAA2/B,EAAA,GAAUj4B,EAAE1H,OAAuB,OAClD,IAAIA,EAAQ,OAAO,EAEnB,MAAM+G,EAAQ/G,EAAOgmB,QAAQjf,MAC7B,QAAIA,GAEG,EAAK4mD,UAAU5mD,EAAO4kD,EAAYC,EAC3C,IAmDF,MAAMC,GAAoB,IAAItG,EAC9B,uBAAmCsG,GACnC,W,gXC/gBA,MAAM+B,EAA0B,IAAI7sD,IAC7B,SAAS8sD,EAAYhM,EAAe92C,EAAyB4M,GAAU,EAAOm2C,GAAQ,G,MAK3F,MAAM9L,EAAYh3C,SAASC,cAAc,QAGzC,IAAI8iD,EAiBJ,GAnBA/L,EAAU9uC,UAAUxS,IAAI,eAGrBotD,IAAU,IACXC,EC5CW,SAAyBlM,GACtC,OAAO,EAAArnB,EAAA,IAAaqnB,EAAO,CACzB7sC,SAAU,EAAC,EAAAg5C,EAAA,GAAwBnM,KAEvC,CDwCUoM,CAAgBpM,IAEtBA,GAAQ,EAAAqM,EAAA,GAASrM,GACjBkM,GAAM,EAAAplC,EAAA,GAAck5B,IAUtBG,EAAU32C,OAAO0iD,GAEd/L,EAAU9sB,SAAS1yB,OAAS,EAAG,CAChC,MAAM62C,EAAQ2I,EAAU9sC,kBACxB8sC,EAAU7iC,UAAY,GACtB6iC,EAAU32C,OAAOguC,E,CAGnB,GAA4C,SAAd,QAA3B,EAAA2I,EAAU9sC,yBAAiB,eAAE2H,SAAmB,CACjD,MAAM+I,EAAQo8B,EAAU9sC,kBAElB7N,EAAMue,EAAMtjB,IAClB,IAAIsrD,EAAW5qD,IAAIqE,GAAM,CACvBue,EAAMtY,aAAa,UAAW,QAC9B,MAAMpK,EAAc8H,SAASC,cAAc,QAC3C/H,EAAYgQ,UAAUxS,IAAI,qBAEvBkd,EAAA,+BACDgI,EAAM1a,MAAMqZ,QAAU,IACtBrhB,EAAYgI,MAAMqZ,QAAU,KAG9BqB,EAAMrY,iBAAiB,QAAQ,MAC7B,SAAQ,KACHqQ,EAAA,+BACDgI,EAAM1a,MAAMqZ,QAAU,GACtBrhB,EAAYgI,MAAMqZ,QAAU,IAG9By9B,EAAU9uC,UAAU/Q,OAAO,SAE3ByrD,EAAWltD,IAAI2G,EAAI,GACnB,GACD,CAACuG,MAAM,IAEVo0C,EAAU32C,OAAOnI,E,EAWrB,OALG6H,IACE4M,EAAS5M,EAAU4M,QAAQqqC,GACzBj3C,EAAUoM,YAAY6qC,IAGtBA,CACT,CAEO,SAASmM,EAAoBtsD,GAClC,MAAMusD,GAAa,EAAAlxC,EAAA,GAAgBrb,EAAS,eAC5C,IAAIusD,EAAY,OAEhB,MAAMl5C,EAAoBk5C,EAAWl5C,kBACrC,OAAGA,GAAqBA,EAAkBhC,UAAUqB,SAAS,gBACpD,CAACstC,MAAO3sC,EAAkB8Q,QAAQqoC,aAActnD,MAAOmO,EAAkB8Q,QAAQjf,OAErFlF,EAAQ6oD,WAAa7oD,EAAQ8oD,UAAkB,CAAC9I,MAAOhgD,EAAQ+oD,YAC3C,SAApB/oD,EAAQgb,UAAuBhb,EAAQqR,UAAUqB,SAAS,UAAY1S,EAAQqT,oBAC/ErT,EAAUA,EAAQqT,mBAGb,CAAC2sC,MAAOhgD,EAAQ4S,aAAa,QAAU5S,EAAQ44B,WAE1D,CAEA,MAAM6zB,EAAmD,eACnDC,EAAsD,CAACD,EAAiB,UAExEE,EAA6D,CADH,GAC4B,IACtFC,EAAiD,CACrD,CAAC,wBAAyB,SAC1B,CAAC,yBAA0B,WAC3B,CAAC,qBAAsB,QACvB,CAAC,wBAAyB,OAC1B,CAAC,yBAA0B,SAC3B,CAAC,gBAAiB,QAElB,CAAC,cAAe,QAChB,CAAC,aAAqB,KAGxB,IAAIC,EACJ,SAAS1L,IACP,GAAG0L,EACD,OAAOA,EAQTA,EAAS,IAAIxtD,IAL8C,CACzD,CAACstD,EAA8B,IAC/B,CAACD,EAAuB,MAI1B,IAAI,MAAM1M,KAAS,IAAO,CACxB,MACM99B,EAAI,GADM,IAAM89B,GAEhB8M,EAAWF,GAAkB1qC,EAAE,GAAK,GAC1C,IAAI4qC,EAAU,SAEd,IAAIjlD,EAAIglD,EAAO9rD,IAAI+rD,GACfjlD,IACFA,EAAI,GACJglD,EAAOnrD,IAAIorD,EAAUjlD,IAGvBA,GAAGqa,EAAEkT,MAAM,IAAM,GAAK4qB,C,CAGxB6M,EAAO9tD,OAAO6tD,EAAiBrpC,OAC/BqpC,EAAiB7iC,QAAQ4iC,EAA8BD,GACvD,MAAMK,EAAQH,EAAiBh0C,KAAI,EAAElT,KAAQA,IACvCzH,EAAU,IAAI4uD,EAAO5uD,WAAWy8C,MAAK,CAACnoC,EAAGu9B,IAAMid,EAAM90C,QAAQ1F,EAAE,GAAG,IAAMw6C,EAAM90C,QAAQ63B,EAAE,GAAG,MAGjG,OAFA+c,EAAS,IAAIxtD,IAAIpB,GAEV4uD,CACT,CAEA,MAAMG,GAAqB,OAAc,GAAI,IAK9B,MAAMC,UAAiB,KAUpCpvD,YAAY8tB,GAOV3b,MACE2b,EAAQ5mB,SACR,gBACA,IAAMioD,GACN,GACA,EACA,GASI,KAAAE,qBAAuB,EAAE/uD,SAAQS,cACvC,MAAMkuD,EAAWhvD,KAAKqvD,cAAcpsD,IAAI5C,GAIlCivD,EAAWN,EAASxpC,SAAS8pC,SAC7BC,EAA6B,GACnC,GAAGD,EAAU,CACXC,EAAYltD,KAAKitD,GACjB,MAAME,EAAiE,IAAIjuD,IACxET,GACDyuD,EAAYltD,QAAQ2sD,EAASrgC,MAAM7T,KAAI,EAAE1T,QAAOlF,cAC9C,IAAIkF,EACF,OAAOlF,EAST,MAAMutD,EAAqBvtD,EAAQqT,kBAKnC,OAJAk6C,EAAmBjuC,OAAM,GAEzBguC,EAAa5rD,IAAI6rD,EAAmBroD,MAAO,IAAIhG,IAAI,CAACquD,KAE7CvtD,CAAO,KAGhBotD,EAASvuD,IAAIyuD,OAAqDvrD,OAAWA,GAAW,KAExFqrD,EAASI,cACTJ,EAAS7f,iBAAiB3lC,Q,MAEpBhJ,GACRyuD,EAAYltD,QAAQ2sD,EAASrgC,MAAM7T,KAAI,EAAE5Y,aAAaA,KAMxD,GAFA8sD,EAASxpC,SAASmJ,MAAMuQ,mBAAmBqwB,GAExCD,IAAaxuD,EAAS,CACvB,MAAM0uD,EAAiE,IAAIjuD,IAC3EytD,EAASrgC,MAAM5pB,SAAQ,EAAEqC,QAAOlF,cAC9B,IAAIkF,EACF,OAGF,MAAMqoD,EAAqBvtD,EAAQqT,kBACnCk6C,EAAmBjuC,QACnBguC,EAAa5rD,IAAI6rD,EAAmBroD,MAAO,IAAIhG,IAAI,CAACquD,IAAqB,IAGrDH,EAASvuD,IAAIyuD,OAAqDvrD,GAAW,E,GAia/F,KAAA0rD,eAAkB5nD,KACxB,EAAAqS,EAAA,GAAYrS,GAEZ,MAAM,OAAC1H,GAAU0H,EAEXqD,GAAY,EAAAmS,EAAA,GAAgBld,EAAQ,kBACpC2uD,EAAWhvD,KAAKqvD,cAAcpsD,IAAImI,GACxC,IAAG,EAAAmS,EAAA,GAAgBld,EAAQ,kBAAmB,CAC5C,GAAG2uD,EAASnB,MACV,OAIF,YADA,IAAI,IAAc,CAACjmD,GAAIonD,EAASprD,IAAIgE,GAAI0/C,YAAa0H,EAASprD,IAAI0jD,cAAc,GAAM/7B,M,CAIxF,MAAM22B,EAAQsM,EAAoBnuD,GAClC,GAAI6hD,EAAJ,CAIA,GACEA,EAAM96C,QACL6W,EAAA,YACCje,KAAK4vD,aAtkBmD,KAskBpCZ,EAASpnD,GAAgC5H,KAAKgI,SAAWiW,EAAA,QAE/E,CACA,MAAMxJ,EAAIpJ,SAASC,cAAc,KASjC,OARAmJ,EAAEI,QAAU,KACVgd,EAAA,qBACA,SAAW,OAEb,EAAA1F,EAAA,IAAS,CACPC,YAAa,2BACbyjC,kBAAmB,CAACp7C,I,CAKrBzU,KAAKiU,QACNjU,KAAKiU,QAAQ,OAAD,wBACPiuC,GAAK,CACRhgD,SAAS,EAAAqb,EAAA,GAAgBld,EAAQ,eAAekV,qBAGlDsc,EAAA,8BAAwCqwB,GAAO,GAG9C,MACD,EAAAtG,EAAA,I,IA9gBF,EAAAtnB,EAAA,GAAWt0B,KAAM6tB,GACjB7tB,KAAKoL,UAAUmI,UAAUxS,IAAI,iBAC7Bf,KAAK2S,QAAQ/K,GAAK,gBAClB5H,KAAK8vD,eAAiB,EACxB,CAyFO/rD,U,MACLmO,MAAMnO,UACc,QAApB,EAAA/D,KAAK+vD,uBAAe,SAAEhsD,SACxB,CAEOyuB,OACLtgB,MAAMsgB,OACNxyB,KAAKwyB,UAAOvuB,EAEZ,MAAM+rD,EAAgD,CACpDC,KAAMjwD,KAAK4vD,aAAe5vD,KAAK2S,QAAUu5C,EAAA,iBAG3ClsD,KAAKkwD,sBAAwB,IAAI,IAAsBlwD,KAAKovD,qBAAsBY,GAElFhwD,KAAKmwD,kBAAoB,iBAA8BnwD,KAAMA,KAAK4xC,KAAM5xC,KAAKswB,WAAYtwB,KAAK+sD,gBAAY9oD,EAAWjE,KAAK6R,gBAE1H,MAAMmK,GAAY,EAAAwnB,EAAA,GAAaxjC,KAAK2S,SAAS,GAE7C,IAAIy9C,EAWAC,EATJ,IAAIrwD,KAAK4vD,aAAc,CACrB,MAAM1oC,EAAIlnB,KAAK+vD,gBAAkB,IAAI,UAAY9rD,GACjDijB,EAAE9b,UAAUmI,UAAUxS,IAAI,gCAE1BqvD,EAAqB/kD,SAASC,cAAc,OAC5C8kD,EAAmB78C,UAAUxS,IAAI,yBACjCqvD,EAAmB1kD,OAAOwb,EAAE9b,U,CAI9Bi4C,IAIEgN,EAHErwD,KAAKswD,eAGO,IAAI/uD,IAAI,CACpB,CAAC,CAACstD,EAA6B,GAAI,UAAW,MAHlCxL,IAQhBgN,EAAYtrD,SAAQ,CAACwrD,GAASC,EAAkBz8C,MAC9C,MAAMi7C,EAAWhvD,KAAKywD,oBAAoBD,EAAkBA,EAAkBz8C,GAAOA,GACrFi7C,EAASxpC,SAASpa,UAAUmI,UAAU/Q,OAAO,QAC7CwsD,EAASxpC,SAASmJ,MAAMpb,UAAUxS,IAAIgT,IAAS/T,KAAK4vD,aAAe,WAAa,aAEhFW,EAAOxrD,SAAS2rD,IAKd,MAAMxO,GAAQ,QAAoBwO,GAiBlC1wD,KAAK2wD,mBAAmB,CACtB3B,WACA9M,MAAO,CAACA,SACR0O,OAAO,GACP,GAKF,IAGJ,MAAMriD,EAAU6S,QAAQgI,IAAI,CAC1BppB,KAAK4vD,kBAAe3rD,GAAY,EAAAM,EAAA,GAAM,MACrCvE,KAAKswD,gBAAkBtwD,KAAKiH,SAAS4pD,gBAAgBC,gBAAgB,WACrE9wD,KAAK4vD,cAAgB5vD,KAAKiH,SAAS4pD,gBAAgBC,gBAAgB,UACpE9wD,KAAK+wD,cAAgB/wD,KAAKiH,SAASsgD,mBAAmByJ,mBAAmBhxD,KAAK+wD,cAC9E/wD,KAAKiH,SAAS4pD,gBAAgBI,oBAC7B3iD,MAAK,EAAEsB,EAAGqvB,EAAQiyB,EAAcC,EAASC,MAC1Cp1C,EAAUxZ,SAEP2uD,IACDD,EAAeC,EAAQhJ,UAAUrtC,KAAKnZ,GAAQA,EAAIiG,MAGpD,MAAMypD,EAAiBrxD,KAAKsxD,WAAW3C,GACjC4C,EAAuBvxD,KAAKsxD,WAAWE,IAc7C,GAZIxxD,KAAK4vD,cACG,CACRyB,GAAkB,CAACA,EAAgBpyB,GACnCsyB,GAAwB,CAACA,EAAsBL,IAG/C93B,OAAOC,SAASt0B,SAAQ,EAAEiqD,EAAU/vB,MACpC+vB,EAAS99B,MAlOO,GAmOhB+N,EAAO3Q,OAnOS,GAmOiB2Q,EAAOp8B,OAnOxB,GAmOmD,IAIpEwuD,GAAkBpyB,EAAQ,IAAI,MAAMijB,KAASjjB,EAC9Cj/B,KAAK2wD,mBAAmB,CACtB3B,SAAUqC,EACVnP,MAAO,CAACA,SACR0O,OAAO,IAIX,GAAGW,EAAsB,CAEvB,GADAvxD,KAAKyxD,0BAA0BF,GAC5BL,EAAc,IAAI,MAAM9pD,KAAS8pD,EAClClxD,KAAK2wD,mBAAmB,CACtB3B,SAAUuC,EACVrP,MAAO,CAACA,MAAO,GAAI96C,SACnBwpD,OAAO,IAGXW,EAAqB/rC,SAASpa,UAAUG,MAAMmmD,WAAa,O,CAG7D5C,EAAiB/pD,SAAQ,EAAE6C,MACzB,MAAMonD,EAAWhvD,KAAKsxD,WAAW1pD,GAC7BonD,IAIJhvD,KAAK2xD,oBAAoB3C,GAAU,GAEhCpnD,IAAO+mD,GAtT8C,KAsT3B/mD,IAC3BonD,EAASjC,WAAa/sD,KAAK+vD,gBAC3B/vD,KAAK+vD,gBAAgB3kD,UAAUM,OAAOsjD,EAASxpC,SAASsP,U,IAI5D90B,KAAK4xD,mBAELP,GAAkBjB,GAAsBiB,EAAe7rC,SAASsP,QAAQ+8B,MAAMzB,GAE9EgB,EAAKA,KAAKrsD,SAASnB,IACjB5D,KAAK8xD,iBAAiBluD,EAAI,IAG5B5D,KAAK6R,eAAe9Q,IAAIkd,EAAA,EAAxBje,CAAmC,kBAAkB,KACnDA,KAAK+xD,sBAAsB,IAG7B/xD,KAAK6R,eAAe9Q,IAAIkd,EAAA,EAAxBje,CAAmC,eAAgBA,KAAKgyD,gBAAgBpqD,IACtE,MAAMonD,EAAWhvD,KAAKsxD,WAAW1pD,GAC7BonD,IAIJhvD,KAAKiyD,iBAAiBjD,GAAU,GAEhChvD,KAAK6R,eAAe9Q,IAAImrD,EAAA,GAAxBlsD,CAA2C,mBAAmB,KAC5DA,KAAKmwD,kBAAkBvC,gBAAgBoB,EAAS,GAC/C,CAAC/gD,MAAM,IAAM,KAGlB,MAAMikD,EAAmBC,IACvB,IAAI,MAAMvqD,KAAM5H,KAAKsxD,WAAY,CAC/B,MACMhC,EADWtvD,KAAKsxD,WAAW1pD,GACP4d,SAAS8pC,SAChCA,IACDA,EAAS8C,wBAA0BD,EAC/BA,GACF7C,EAAS+C,2BAAsBpuD,GAAW,G,IAMjDjE,KAAK4vD,cAAgB5vD,KAAK6R,eAAe9Q,IAAImrD,EAAA,GAAxBlsD,CAA2C,UAAU,KACzEkyD,GAAgB,EAAM,KAGvBlyD,KAAK4vD,cAAgB5vD,KAAK6R,eAAe9Q,IAAImrD,EAAA,GAAxBlsD,CAA2C,SAAS,KACxEkyD,GAAgB,EAAK,IAGvBlyD,KAAK6R,eAAe9Q,IAAIkd,EAAA,EAAxBje,CAAmC,sBAAuB4D,KACpD5D,KAAKsxD,WAAW1tD,EAAIgE,KAAOhE,EAAI6J,OAAO8iD,QACxCvwD,KAAK8xD,iBAAiBluD,GAAK,E,IAI/B5D,KAAK6R,eAAe9Q,IAAIkd,EAAA,EAAxBje,CAAmC,oBAAqB4D,IACtD,MAAMorD,EAAWhvD,KAAKsxD,WAAW1tD,EAAIgE,IACrC,GAAG5H,KAAKsyD,eAAetD,GAAW,CAChC,MAAM,SAACM,GAAYN,EAASxpC,SACzB8pC,GACDA,EAAS7f,iBAAiB3lC,O,MAK/B9J,KAAK4vD,cAAgB5vD,KAAK6R,eAAe9Q,IAAIkd,EAAA,EAAxBje,CAAmC,eAAgBA,KAAKgyD,gBAAgB9P,IAC5F,MAAM8M,EAAWhvD,KAAKsxD,WAAWpP,EAAM96C,MA3XiB,GA2XgBunD,GACxE,IAAIK,EACF,OAGF,MAAMzmD,EAA0C25C,EAAM96C,MACnDpE,GAASA,EAAKoE,QAAU86C,EAAM96C,MAC9BpE,GAASA,EAAKk/C,QAAUA,EAAMA,MAC3B//C,GAAQ,EAAAigC,EAAA,GAAc4sB,EAASrgC,MAAOpmB,GAC5C,GAAGpG,GAED,GADA6sD,EAASrgC,MAAM1C,QAAQ9pB,GACpBnC,KAAKuyD,kBAAkBvD,GAAW,CACnC,MAAM,SAACM,GAAYN,EAASxpC,UAC5B,EAAAwd,EAAA,GAAuB7gC,EAAMD,QAAS8sD,EAASxpC,SAASmJ,MAAO2gC,EAAW,EAAI,GAAI,GAClFA,SAAAA,EAAUkD,a,OAGZxyD,KAAK2wD,mBAAmB,CACtB3B,WACA9M,QACA0O,OAAO,EACP54C,SAAS,IAIc,IAAxBhY,KAAKyyD,gBACNzyD,KAAKmwD,kBAAkB1gC,UAAUyyB,EAAM96C,MAAQpH,KAAKsxD,WAAW3C,GAAmBK,E,MAIrFhvD,KAAK4vD,cAAgB5vD,KAAK6R,eAAe9Q,IAAI8wB,EAAA,GAAxB7xB,CAAsC,gBAAgB,KAC1EA,KAAK+xD,sBAAsB,IAG7B/xD,KAAK+xD,uBAEL/xD,KAAKmwD,kBAAkB1gC,UAAU4hC,QAAAA,EAAkBE,EAAqB,IAM1E,OAHA,QAAiBvxD,KAAK2S,QAAS3S,KAAK2vD,eAAgB,CAAC99C,eAAgB7R,KAAK6R,kBAC1E,OAA6B,CAACs1C,SAAUnnD,KAAK2S,QAASd,eAAgB7R,KAAK6R,iBAEpEtD,CACT,CAEQujD,iBAAiBluD,EAA4BoU,GACnD,MAAMg3C,EAAWhvD,KAAK0yD,eAAe9uD,GAAK,EAAAolB,EAAA,GAAcplB,EAAImL,QAC5D/O,KAAKiyD,iBAAiBjD,EAAUh3C,GAChC,MAAM,UAAC5M,EAAS,eAAEunD,GAAkB3D,EAASxpC,SAC7CwpC,EAASxpC,SAASmJ,MAAMpb,UAAUxS,IAAI,aACtCiuD,EAASxpC,SAASpa,UAAUmI,UAAUxS,IAAI,kBAC1CiuD,EAASxpC,SAASzW,MAAMwE,UAAUxS,IAAI,SAEtCf,KAAKyxD,0BAA0BzC,GAEfhvD,KAAKiH,SAASsgD,mBAAmBC,cAAc5jD,GACvD0K,MAAK,EAAE65C,gBACbA,EAAUpjD,SAASsG,IACjBrL,KAAK2wD,mBAAmB,CACtB3B,WACA9M,MAAO,CAAC96C,MAAOiE,EAASzD,GAAIs6C,MAAQ72C,EAA+BunD,iBACnEhC,OAAO,GACP,IAOJ5wD,KAAKovD,qBAAqB,CAAC/uD,OAAQ2uD,EAASxpC,SAASpa,UAAWtK,QAASd,KAAKuyD,kBAAkBvD,KAEhGA,EAAS6D,yBACTznD,EAAUmI,UAAU/Q,OAAO,OAAO,KAGpC,OAAoB,CAClBoB,MACAwH,UAAWunD,EACXryD,MAAO,KACP+d,cAAe,mBACfiF,MAAO,GACPI,OAAQ,GACRlf,UAAU,GAEd,CAEYwD,aACV,OAAO6pB,EAAA,cACT,CAEOihC,oBACL,OAAO9yD,KAAKsxD,WAAWE,GACzB,CAEQO,uBACN,MAAM/C,EAAWhvD,KAAKsxD,WAAWE,IAC3BuB,EAAa90C,EAAA,WAAqBje,KAAKgI,SAAWiW,EAAA,OAClD+0C,EAAuBD,GAAc/yD,KAAK4vD,aAChD19C,MAAMy/C,oBAAoB3C,IAAYA,EAASrgC,MAAM9rB,QAAUmwD,GAC/DhzD,KAAK2S,QAAQY,UAAU1J,OAAO,cAAekpD,EAC/C,CAEUpB,oBAAoB3C,EAA4BluD,GAjeI,KAkezDkuD,EAASpnD,GAKZsK,MAAMy/C,oBAAoB3C,EAAUluD,GAJlCd,KAAK+xD,sBAKT,CAEQN,0BAA0BzC,GAChC,MAAMM,EAAW,YAAkC,CACjDt2B,eAAgB,KAChBi6B,gBAAiB9oC,EAAA,0BAGnB6kC,EAASxpC,SAAS8pC,SAAWA,EAC7BN,EAASxpC,SAASmJ,MAAMjjB,OAAO4jD,EACjC,CAEOqB,mBAAmB9iC,GAQxB,MAAM,SAACmhC,EAAQ,MAAE9M,EAAK,MAAE0O,EAAK,QAAE54C,GAAW6V,EAC1C,IAAI3rB,EAAU2rB,EAAQ3rB,QACtB,GAAGA,EAAS,CACV,MAAMmgD,EAAYh3C,SAASC,cAAc,QACzC+2C,EAAU9uC,UAAUxS,IAAI,eACxBshD,EAAU32C,OAAOxJ,GACjBA,EAAUmgD,C,MACL,GAAGH,EAAM96C,MAAO,CACrB,MAAMqoD,EAAqB,YAA0BvN,EAAM96C,OACrD2tB,EAAO1pB,SAASC,cAAc,QACpCypB,EAAKxhB,UAAUxS,IAAmB,eAClCg0B,EAAKrpB,OAAO+jD,GACZvtD,EAAU6yB,C,MAEV7yB,EAAUgsD,EAAYhM,EAAMA,WAAwDj+C,GAAW,GAGjG,MAAMjB,EAAI,+BACJk/C,GAAS,CAACA,WAAOj+C,IAAW,CAChC/B,aAIA2rB,EAAQ/L,QACN9hB,KAAKkzD,cACHlwD,EAAKoE,MACHpH,KAAKkzD,YAAY9rD,QAAUpE,EAAKoE,MAChCpH,KAAKkzD,YAAYhR,QAAUl/C,EAAKk/C,UAItCliD,KAAKkzD,YACLlzD,KAAK8vD,eAAeztD,KAAKW,GACzBd,EAAQqR,UAAUxS,IAAI,WAGxBiuD,EAASrgC,MAAM3W,EAAU,UAAY,QAAQhV,GACzC4tD,GAAU5wD,KAAKmzD,aAAanE,IAC9BhvD,KAAKozD,sBAAsBpE,EAE/B,CA+DOv/B,UAAUyyB,G,SAEbA,IAAUliD,KAAKkzD,cACfhR,aAAK,EAALA,EAAO96C,OAAQ86C,EAAM96C,SAA0B,QAAhB,EAAApH,KAAKkzD,mBAAW,eAAE9rD,QAAQ86C,aAAK,EAALA,EAAOA,UAA0B,QAAhB,EAAAliD,KAAKkzD,mBAAW,eAAEhR,UAK9FliD,KAAKkzD,YAAchR,EAEnBliD,KAAK8vD,eAAe/qD,SAAS/B,IAC3BA,EAAKd,QAAQqR,UAAU/Q,OAAO,SAAS,IAGzCxC,KAAK8vD,eAAejtD,OAAS,EAE7B7C,KAAKqvD,cAActqD,SAASiqD,IAC1BA,EAASrgC,MAAM5pB,SAAS/B,KACnBk/C,EAAM96C,MAAQpE,EAAKoE,QAAU86C,EAAM96C,MAAQpE,EAAKk/C,QAAUA,EAAMA,SACjEl/C,EAAKd,QAAQqR,UAAUxS,IAAI,UAC3Bf,KAAK8vD,eAAeztD,KAAKW,G,GAE3B,IAEN,CAEOmY,UACLnb,KAAKyyD,eAAiBzyD,KAAKswB,WAAWoG,SACxC,E,0KE3vBa,MAAM28B,UAA4B,IAG/CtzD,YACEuzD,EACUC,EACV1lC,GAEA3b,MAAMohD,GAHI,KAAAC,mBAAAA,EAJJ,KAAAC,YAAiD,IAAIjyD,IAS3DvB,KAAKssD,YAAc,IAAI,KAAuBtpD,I,MAC5C,MAAM,OAAC3C,EAAM,QAAES,GAAWkC,EAEpBywD,EAAYzzD,KAAKwzD,YAAYvwD,IAAI5C,GACvCozD,EAAU3yD,QAAUA,EAEjBA,GACD2yD,EAAUC,SAAU,EAChB1zD,KAAK2zD,MAAM5+C,SAAS0+C,IACtBzzD,KAAK2zD,MAAMtxD,KAAKoxD,KAGlB,EAAAG,EAAA,GAAiB5zD,KAAK2zD,MAAOF,GAGR,QAAvB,EAAAzzD,KAAKuzD,0BAAkB,mBAAGvwD,GAC1BhD,KAAK6zD,wBAAwB,GAC5BhmC,EACL,CAEOrM,QACLtP,MAAMsP,QACNxhB,KAAKwzD,YAAYhyC,OACnB,CAWO7d,QAAQ/C,GACbZ,KAAKwzD,YAAY5vD,IAAIhD,EAAGkqB,IAAKlqB,GAC7BsR,MAAMvO,QAAQ/C,EAChB,CAEOkC,UAAUlC,GACfZ,KAAKwzD,YAAYvyD,OAAOL,EAAGkqB,KAC3B5Y,MAAMpP,UAAUlC,EAClB,E,2dCrBK,MAAMkzD,EAIX/zD,YACUg0D,EACAzzD,EACA2G,EACA4mB,GAHA,KAAAkmC,qBAAAA,EACA,KAAAzzD,MAAAA,EACA,KAAA2G,SAAAA,EACA,KAAA4mB,QAAAA,EANF,KAAAmmC,SAA6B,IAAI5yD,IAwDjC,KAAA6yD,wBAA0B,CAAC/xD,EAAsBpB,KAEvChB,EAAA,gBAAmCoC,GAC3C6C,SAAS3C,IACXtB,EAGFhB,EAAA,iBAAoCsC,GAAQ,GAF5CtC,EAAA,kBAAqCsC,E,GAIvC,EAGI,KAAA8xD,eAAuBhyD,GAAyB,EAAD,gCACrD,MAAMkF,EAAQlF,EAAQmkB,QAAQjf,MACxBzF,QAAY3B,KAAKiH,SAASC,eAAeC,OAAOC,GAEhDS,EAAOsiB,EAAA,0BAIP5b,GAAU,QAAY,CAC1B5M,MACAmpB,IAAK5oB,EACLohB,MAAOzb,EACP6b,OAAQ7b,EACRwW,cAAe,KACf/d,MAAON,KAAKM,MACZ2vC,WAAW,EACXxrC,MAAM,EACNf,MAAM,EACN0kD,UAAU,IACT95C,MAAK,EAAE26B,YAAYA,IAWtB,OATA16B,EAAQD,MAAK,KAEXtO,KAAKi0D,wBAAwB/xD,EAASlC,KAAKqe,cAAciuC,YAAYnsC,UAAUje,GAAS,IAOnFqM,CACT,IAEO,KAAA4lD,iBAAyBjyD,GAAyB,EAAD,gCACtD,MAAMkF,EAAQlF,EAAQmkB,QAAQjf,MACxBzF,QAAY3B,KAAKiH,SAASC,eAAeC,OAAOC,GAItDpH,KAAKi0D,wBAAwB/xD,GAAS,GAEtCA,EAAQ0W,YAAc,GACtB5Y,KAAKo0D,cAAczyD,EAAKO,EAC1B,IAvGElC,KAAKqe,cAAgB,IAAIg1C,OAAoBpvD,GAAW,EAAE5D,SAAQS,cAC5DA,GACFd,KAAKm0D,iBAAiB9zD,E,GAEvBwtB,EACL,CAEOrM,QACLxhB,KAAKqe,cAAcmD,OACrB,CAEO4yC,cAAczyD,EAAiBO,EAAuBwxB,GAqB3D,OApBIxxB,KACFA,EAAUmJ,SAASC,cAAc,QACzBiI,UAAUxS,IAAI,YAAa,iBACnCmB,EAAQmkB,QAAQjf,MAAQ,GAAKzF,EAAIiG,GAE9BjG,EAAIqyD,UACLh0D,KAAKq0D,gBAAgBnyD,KAKF,QAAY,CACjCP,MACAmpB,IAAK5oB,EACLmc,cAAere,KAAK+zD,qBACpBzzD,MAAON,KAAKM,MACZ2vC,UAAWtuC,EAAIqyD,SACftgC,iBAGKxxB,CACT,CAEOmyD,gBAAgBnyD,GACrBlC,KAAKg0D,SAASjzD,IAAImB,GAClBlC,KAAKqe,cAAc1a,QAAQ,CACzBmnB,IAAK5oB,EACLU,KAAM5C,KAAKk0D,gBAEf,CAEOI,kBAAkBpyD,GACvBlC,KAAKg0D,SAAS/yD,OAAOiB,GACrBlC,KAAKqe,cAAcpd,OAAO,CAAC6pB,IAAK5oB,GAClC,EA8DK,MAAMqyD,EAuBXx0D,YAAY8tB,G,QAUV,MAAMziB,EAAYC,SAASC,cAAc,OACzCF,EAAUmI,UAAUxS,IAAI,kBAExB,MAAM4tB,EAAQtjB,SAASC,cAAc,OAGrC,IAAIyD,EAOA+lB,EAAsB69B,EAT1BhkC,EAAMpb,UAAUxS,IAAI,kBAGjB8sB,EAAQ9e,QACTA,EAAQ1D,SAASC,cAAc,OAC/ByD,EAAMwE,UAAUxS,IAAI,kBACpBgO,EAAMrD,OAAOmiB,EAAQ9e,QAInB8e,EAAQ2mC,YACV1/B,GAAU,YAAW7wB,EAAW,CAAC+a,UAAU,IAC3C8V,EAAQvhB,UAAUxS,IAAI,4BAEtB4xD,EAAiBtnD,SAASC,cAAc,OACxCqnD,EAAep/C,UAAUxS,IAAI,oCAE7B+zB,EAAQppB,OAAOinD,IAGd5jD,GAAO3D,EAAUM,OAAOqD,GAC3B3D,EAAUM,OAAOijB,GAEjB3uB,KAAKwlB,SAAW,CACdpa,YACA2D,QACA4f,QACAmG,UACA69B,kBAEF3yD,KAAK4H,GAAKimB,EAAQjmB,GAClB5H,KAAK2uB,MAAQ,GAEb3uB,KAAKy0D,iBAAmB5mC,EAAQ4mC,iBAChCz0D,KAAK00D,oBAAsB7mC,EAAQ6mC,oBACnC10D,KAAK20D,KAAmB,QAAZ,EAAA9mC,EAAQ8mC,YAAI,QAAI,EAC5B30D,KAAK40D,KAAmB,QAAZ,EAAA/mC,EAAQ+mC,YAAI,QAAI,CAC9B,CAEO/B,yBACL,MAAOvvC,MAAOuxC,GAAkB70D,KAAKy0D,mBAC/BK,EAAc90D,KAAK00D,sBAAsBpxC,MAE/C,IAAIyxC,EAAcF,EAAiBC,EAChC90D,KAAK20D,OAAMI,GAAevuD,KAAK+sC,MAAMwhB,EAAc,GAAK/0D,KAAK20D,KAAOG,GACvEC,EAAcvuD,KAAK+sC,MAAMwhB,GAEzB,MAAMC,EAAOxuD,KAAKgtC,KAAKxzC,KAAK2uB,MAAM9rB,OAASkyD,GAC3C,IAAIrxC,EAASsxC,EAAOF,EACjB90D,KAAK40D,OAAMlxC,IAAWsxC,EAAO,GAAKh1D,KAAK40D,MAE1C50D,KAAKwlB,SAASmJ,MAAMpjB,MAAM0pD,UAAYvxC,EAAS,IACjD,EAGK,MAAMwxC,EAyBXn1D,YACYkH,EACAkuD,EACAT,EACAzqC,EACA0qC,EACAC,GALA,KAAA3tD,SAAAA,EACA,KAAAkuD,uBAAAA,EACA,KAAAT,oBAAAA,EACA,KAAAzqC,QAAAA,EACA,KAAA0qC,KAAAA,EACA,KAAAC,KAAAA,EAfF,KAAAjX,SAAU,EAyKV,KAAAiU,iBAAmB,KAC3B,IAAI,MAAOxmD,EAAW4jD,KAAahvD,KAAKqvD,cACtCL,EAAS6D,wB,EAsDH,KAAAb,eAAqB5hD,GACtB,IAAIglD,KACNlJ,EAAA,cACDlsD,KAAKq1D,gBAAgBhzD,KAAK,CAAC+N,KAAIglD,SAE/BhlD,KAAMglD,E,EArNVp1D,KAAKsxD,WAAa,CAAC,EACnBtxD,KAAKqvD,cAAgB,IAAI9tD,IACzBvB,KAAKs1D,uBAAyB,IAAI/zD,IAClCvB,KAAKu1D,gBAAkB,GACvBv1D,KAAKq1D,gBAAkB,GAEvBr1D,KAAK6R,eAAiB,IAAI,IAE1B7R,KAAKoL,UAAYC,SAASC,cAAc,OACxCtL,KAAKoL,UAAUmI,UAAUxS,IAAI,WAAY,uBAEzCf,KAAKw1D,YAAcnqD,SAASC,cAAc,OAC1CtL,KAAKw1D,YAAYjiD,UAAUxS,IAAI,eAAgB,0BAE/Cf,KAAK4xC,KAAOvmC,SAASC,cAAc,OACnCtL,KAAK4xC,KAAKv2B,UAAY,6DAEtBrb,KAAKw1D,YAAY9pD,OAAO1L,KAAK4xC,MAC7B5xC,KAAK+sD,WAAa,IAAI,KAAY/sD,KAAKw1D,aAEvCx1D,KAAK2S,QAAUtH,SAASC,cAAc,OACtCtL,KAAK2S,QAAQY,UAAUxS,IAAI,qBAE3Bf,KAAKoL,UAAUM,OAAO1L,KAAKw1D,YAAax1D,KAAK2S,SAE7C3S,KAAKswB,WAAa,IAAI,KAAWtwB,KAAK2S,QAAS,WACjD,CAEO66C,uBAAuBpiD,GAC5B,OAAOpL,KAAKqvD,cAAcpsD,IAAImI,EAChC,CAEOsiD,qBAAqB54B,GAC1B,OAAO90B,KAAKs1D,uBAAuBryD,IAAI6xB,EACzC,CAEU49B,eAAerL,EAAwBt4C,EAAuC0mD,EAAmBjB,GACzG,MAAMxF,EAAqB,IAAIuF,EAAoB,CACjD3sD,GAAI,GAAKy/C,EAAWz/C,GACpBmH,QACA8T,gBAAiB7iB,KAAK2S,QACtB8hD,iBAAkB,KAChB,IAAInxC,EAAeI,EACnB,GAAG1jB,KAAKy0D,iBAAkB,CACxB,MAAM5sD,EAAO7H,KAAKy0D,mBAClBnxC,EAAQzb,EAAKyb,MACbI,EAAS7b,EAAK6b,M,KACT,CACL,MAAMgyC,EAAWC,EAAA,oBAAmC,aACpDryC,OAAqBrf,IAAbyxD,EAAyB11C,EAAA,QAAmB01C,C,CAGtD,MAAO,CAACpyC,MAAOA,EAAQtjB,KAAKiqB,QAASvG,SAAO,EAE9CgxC,oBAAqB10D,KAAK00D,oBAC1BC,KAAM30D,KAAK20D,KACXC,KAAM50D,KAAK40D,KACXJ,cAGCx0D,KAAKm1D,wBACNnG,EAASxpC,SAASmJ,MAAMpb,UAAUxS,IAAIf,KAAKm1D,wBAG7C,MAAM/pD,EAAY4jD,EAASxpC,SAASpa,UAepC,OAdAA,EAAUmI,UAAUxS,IAAI,QAExBiuD,EAASprD,IAAMyjD,EACfrnD,KAAKsxD,WAAWjK,EAAWz/C,IAAMonD,EACjChvD,KAAKqvD,cAAczrD,IAAIwH,EAAW4jD,IACjCwF,GAAax0D,KAAKs1D,uBAAuB1xD,IAAIorD,EAASxpC,SAASsP,QAASk6B,GAEzEhvD,KAAKkwD,sBAAsBvsD,QAAQyH,IAClCopD,GAAax0D,KAAKmwD,kBAAkB7C,kBAAkBsI,2BAA2BxqD,GAE9EqqD,IACDjB,GAAaxF,EAASxpC,SAASsP,QAAQvhB,UAAUxS,IAAI,aAGjDiuD,CACT,CAEUiD,iBAAiBjD,EAAoBh3C,GAC7C,MAAM,QAAC8c,EAAO,UAAE1pB,GAAa4jD,EAASxpC,SAChCqwC,EAAW79C,EAAUhY,KAAKu1D,gBAAgBn8B,QAAQ41B,GAAaA,EAASrR,UAAS96C,OAAS,MAChG,IAAIizD,GAAkB,EACtB,MAAMC,EAAU/9C,EAAUhY,KAAKu1D,gBAAgBn8B,QAAQ41B,GAClDA,EAASjC,aAAe+I,GACzBA,GAAkB,GACX,GAGF9G,EAASrR,UAAYqR,EAASjC,YAAciC,EAASxpC,SAASsP,UACpEjyB,OAAS,OACZ,EAAAmgC,EAAA,GAAuB53B,EAAWpL,KAAKswB,WAAWllB,UAAWyqD,IAC7D,EAAA7yB,EAAA,GAAuBlO,EAAS90B,KAAK4xC,KAAMmkB,EAC7C,CAEUxD,kBAAkBvD,GAC1B,OAAOhvD,KAAKkwD,sBAAsB3D,aAAax3C,SAASi6C,EAASxpC,SAASpa,UAC5E,CAEUumD,oBAAoB3C,EAAoBluD,G,MAChD,GAAIA,EAGG,CACL,MAAMiI,EAAM/I,KAAKu1D,gBAAgBp7C,QAAQ60C,GACnC/0B,EAASj6B,KAAKu1D,gBAAgBj+B,MAAM,EAAGvuB,GAC7C,IAAIitD,EAAkB,EAAGC,EAAkB,EAC3Ch8B,EAAOl1B,SAASiqD,IACVA,EAASrR,QAGFqR,EAASxpC,SAASsP,UAAWk6B,EAASjC,cAC7CkJ,KAHAD,IACAC,E,IAKN,MAAMC,EAAWntD,EAAMitD,EAAiBG,EAAUptD,EAAMktD,EACxDjH,EAASxpC,SAASsP,UAAW,EAAAkO,EAAA,GAAuBgsB,EAASxpC,SAASsP,QAAS90B,KAAK4xC,KAAMukB,IAC1F,EAAAnzB,EAAA,GAAuBgsB,EAASxpC,SAASpa,UAAWpL,KAAKswB,WAAWllB,UAAW8qD,E,MAhBtD,QAAzB,EAAAlH,EAASxpC,SAASsP,eAAO,SAAEtyB,SAC3BwsD,EAASxpC,SAASpa,UAAU5I,SAkB9BwsD,EAASrR,QAAU78C,CAErB,CAEU2vD,oBAAoB7oD,EAAYmH,EAAyBgF,EAAeygD,GAChF,MAAMxF,EAAWhvD,KAAK0yD,eAAe,CAAC9qD,MAAYmH,IAAS,QAAKA,IAAQ,EAAMylD,GAgB9E,OAfAxF,EAASnB,OAAQ,EACjB7tD,KAAKu1D,gBAAgBlzD,KAAK2sD,GACvBA,EAASxpC,SAASzW,OACnBigD,EAASxpC,SAASzW,MAAMwE,UAAUxS,IAAI,iBAGpCyzD,IACCzgD,GACDi7C,EAASxpC,SAASsP,QAAQvhB,UAAUxS,IAAI,QAAS,SAAWgT,GAG9Di7C,EAASxpC,SAASmtC,eAAenwD,UAGnCxC,KAAK2xD,oBAAoB3C,GAAU,GAC5BA,CACT,CAEUoE,sBAAsBpE,GAC9BA,EAAS6D,yBACT7yD,KAAK2xD,oBAAoB3C,IAAYA,EAASrgC,MAAM9rB,OACtD,CAQUyvD,eAAetD,GACvB,QAAGA,IACDA,EAASxpC,SAASpa,UAAU5I,SAC5BwsD,EAASxpC,SAASsP,QAAQtyB,SAC1BxC,KAAKkwD,sBAAsBptD,UAAUksD,EAASxpC,SAASpa,kBAChDpL,KAAKsxD,WAAWtC,EAASpnD,IAChC5H,KAAKqvD,cAAcpuD,OAAO+tD,EAASxpC,SAASpa,WAC5CpL,KAAKs1D,uBAAuBr0D,OAAO+tD,EAASxpC,SAASsP,UAE9C,EAIX,CAEUq+B,aAAanE,GACrB,QAAsB/qD,IAAnB+qD,EAAS99B,MACV,OAAO,EAGT,MAAM,MAACvC,EAAK,MAAEuC,GAAS89B,EAOvB,OANArgC,EAAML,OAAO4C,EAAOvC,EAAM9rB,OAASquB,GAAOnsB,SAAQ,EAAE7C,cAClDA,EAAQM,QAAQ,IAGlBxC,KAAKozD,sBAAsBpE,IAEpB,CACT,CAEOx8B,OACLxyB,KAAK6R,eAAe9Q,IAAImrD,EAAA,GAAxBlsD,CAA2C,UAAU,KACnDA,KAAKq1D,gBAAgBtwD,SAAQ,EAAEqL,KAAIglD,WACjChlD,KAAMglD,EAAK,IAGbp1D,KAAKq1D,gBAAgBxyD,OAAS,CAAC,GAEnC,CAEOkB,U,YACL/D,KAAKy0D,sBAAmBxwD,EACxBjE,KAAKq1D,gBAAgBxyD,OAAS,EACJ,QAA1B,EAAA7C,KAAKkwD,6BAAqB,SAAEkG,aAC5Bp2D,KAAK6R,eAAeC,YACpB9R,KAAKswB,WAAWvsB,UACD,QAAf,EAAA/D,KAAK+sD,kBAAU,SAAEhpD,UACwB,QAAzC,EAAsB,QAAtB,EAAA/D,KAAKmwD,yBAAiB,eAAE7C,yBAAiB,SAAE8I,YAC7C,EAca,MAAMC,UAAoBnB,EAGvCn1D,YAAYkH,GACViL,MACEjL,EACA,kBACA,IAAMkjB,EAAA,qBACN,EACA,EACA,GA0DI,KAAAilC,qBAAuB,EAAE/uD,SAAQS,UAASV,YAChD,MAAM4uD,EAAWhvD,KAAKqvD,cAAcpsD,IAAI5C,GACxC2uD,EAASxpC,SAASmJ,MAAMuQ,mBAAqBp+B,EAAekuD,EAASrgC,MAAM7T,KAAI,EAAE5Y,aAAaA,IAAvC,GAAiD,EAoSnG,KAAAo0D,UAAY,CAACzoB,GAAS,MACvBA,GAAYqe,EAAA,eAAgCA,EAAA,SAA0BlsD,OAI1Eie,EAAA,gBAAwB,oBAAqB4vB,EAAO,EAlWpD7tC,KAAKoL,UAAUmI,UAAUxS,IAAI,oBAC7Bf,KAAK2S,QAAQ/K,GAAK,kBACpB,CAEQ2uD,cAAcrlC,GACHlxB,KAAKsxD,WAAkB,MAC/BpgC,MAAQA,CACnB,CAEQslC,uBACNxH,EACAzgD,GAEA,MAAM,UAACnD,GAAa4jD,EAASxpC,SAE7BjX,EAAQD,MAAM65C,IACZ,MAAMhoC,EAAYngB,KAAKuyD,kBAAkBvD,GAEzC7G,EAAUpjD,SAASsG,IACjB,MAAMnJ,EAAUlC,KAAKy2D,qBAAqBrC,cAAc/oD,GACxD2jD,EAASrgC,MAAMtsB,KAAK,CAACgJ,WAAUnJ,YAE5Bie,GACD6uC,EAASxpC,SAASmJ,MAAMjjB,OAAOxJ,E,IAInC8sD,EAAS6D,yBACTznD,EAAUmI,UAAU/Q,OAAO,OAAO,GAEtC,CAEcsvD,iBAAiBluD,EAA4BoU,GAAU,G,yCACnE,MAAMg3C,EAAWhvD,KAAK0yD,eAAe9uD,GAAK,EAAAolB,EAAA,GAAcplB,EAAImL,SACtD,eAAC4jD,GAAkB3D,EAASxpC,SAE5BjX,EAAUvO,KAAKiH,SAASsgD,mBAAmBC,cAAc5jD,GAC/D5D,KAAKw2D,uBACHxH,EACAzgD,EAAQD,MAAM+4C,GAAeA,EAAWc,aAG1CnoD,KAAKiyD,iBAAiBjD,EAAUh3C,IAEhC,OAAoB,CAClBpU,MACAwH,UAAWunD,EACXryD,MAAO,KACP+d,cAAe,mBACfiF,MAAO,GACPI,OAAQ,GACRlf,UAAU,GAEd,G,CAOOguB,OACLtgB,MAAMsgB,OAENxyB,KAAKswB,WAAW3c,mBAAqB,KACnC3T,KAAKs2D,WAAW,EAoBlB,MAAMtG,EAAgD,CAACC,KAAM/D,EAAA,iBAC7DlsD,KAAKkwD,sBAAwB,IAAI,IAAsBlwD,KAAKovD,qBAAsBY,GAElF,MAAM0G,EAAsB1H,IAC1BA,EAASxpC,SAASmJ,MAAMuQ,kBACxB8vB,EAASrgC,MAAM5pB,SAAQ,EAAE7C,aAAalC,KAAKy2D,qBAAqBnC,kBAAkBpyD,KAClF8sD,EAASrgC,MAAM9rB,OAAS,CAAC,EAG3B7C,KAAKswB,WAAWllB,UAAUwC,iBAAiB,SAAU7F,IACnD,MAAM1H,EAAS0H,EAAE1H,OACjB,IAAG,EAAAkd,EAAA,GAAgBld,EAAQ,kBAA3B,CACE,MAAM+K,GAAY,EAAAmS,EAAA,GAAgBld,EAAQ,kBACpC2uD,EAAWhvD,KAAKqvD,cAAcpsD,IAAImI,GACxC,GAAG4jD,EAASnB,MACV,OAGF,IAAI,IAAc,CAACjmD,GAAIonD,EAASprD,IAAIgE,GAAI0/C,YAAa0H,EAASprD,IAAI0jD,cAAc/7B,M,MAIlF,kBAA+BxjB,EAAE,IAGnC/H,KAAKmwD,kBAAoB,iBAA8BnwD,KAAMA,KAAK4xC,KAAM5xC,KAAKswB,WAAYtwB,KAAK+sD,YAE9F,MAAM/wC,GAAY,EAAAwnB,EAAA,GAAaxjC,KAAK2S,SAAS,GAEvCgkD,EAAqB,CAAC3H,EAAgD4H,KAKvE5H,EAAS99B,QACV0lC,EAAWA,EAASt/B,MAAM,EAAG03B,EAAS99B,QAGxC,MAAM+P,EAAM,IAAI7/B,IAAIw1D,EAAS97C,KAAKnZ,GAAQA,EAAIiG,OAC9C,EAAA4gD,EAAA,GAAewG,EAASrgC,OAAQ3rB,IAC1Bi+B,EAAI59B,IAAIL,EAAKqI,SAASzD,KACxB5H,KAAK62D,cAAc7H,EAAUhsD,EAAKqI,UAAU,E,IAIhDrL,KAAK2xD,oBAAoB3C,IAAY4H,EAAS/zD,SAC9C,EAAA2lD,EAAA,GAAeoO,GAAU,CAACj1D,EAAKoH,KAC7B/I,KAAK82D,eAAe9H,EAAUrtD,GAAK,EAAMoH,EAAI,IAE/C/I,KAAKmzD,aAAanE,GAClBA,EAASxpC,SAASpa,UAAUmI,UAAU/Q,OAAO,OAAO,EAGhDu0D,EAAgB/2D,KAAKywD,oBAAoB,QAAS,mBAAoB,iBAGtEY,EAAiBrxD,KAAKywD,oBAAoB,SAAU,kBAAmB,UAC7EY,EAAengC,MAAQ,GAEvB,MAAM8lC,GAAc,OAAW,QAAS,CAACh4C,UAAU,IACnDqyC,EAAe7rC,SAASzW,MAAMrD,OAAOsrD,IACrC,QAAiBA,GAAa,MAC5B,EAAA/W,EAAA,GAAkB,CAChBgX,aAAc,gCACdC,mBAAoB,kCACpB5gD,OAAQ,CACN6gD,QAAS,WAEV7oD,MAAK,KACNtO,KAAKiH,SAASsgD,mBAAmB6P,qBAAqB,GACrDj/B,EAAA,EAAK,IAGV,MAAMk/B,EAAkBr3D,KAAKywD,oBAAoB,UAAW,wBACtD1mD,EAAIsB,SAASC,cAAc,QACjCvB,EAAEwJ,UAAUxS,IAAI,aAAc,iBAC9Bs2D,EAAgB7xC,SAASsP,QAAQppB,OAAO3B,GAExC,MAAMsuB,EAAW,CACfjX,QAAQgI,IAAI,CACVppB,KAAKiH,SAASqwD,WAAWC,SAAS,iBAClCv3D,KAAKiH,SAASsgD,mBAAmBiQ,6BAChClpD,MAAK,EAAE4iB,EAAO0lC,MACf52D,KAAKu2D,cAAcrlC,GACnBylC,EAAmBI,EAAeH,EAAS,IAG7C52D,KAAKiH,SAASsgD,mBAAmBkQ,4BAA4BnpD,MAAMsoD,IACjED,EAAmBtF,EAAgBuF,EAAS,IAG9C52D,KAAKiH,SAASsgD,mBAAmBmQ,iBAAiBppD,MAAM6iB,IACtD,IAAI,MAAMvtB,KAAQutB,EAAgDigC,KAChEpxD,KAAK8xD,iBAAiBluD,E,IAI1B5D,KAAKiH,SAASsgD,mBAAmBoQ,qBAAqBrpD,MAAMsoD,IAC1D,MAAM/zD,EAAS+zD,EAAS/zD,OACxB7C,KAAK2xD,oBAAoB0F,EAAiBp5C,EAAA,aAAuBpb,GACjE7C,KAAKw2D,uBAAuBa,EAAiBj2C,QAAQjT,QAAQyoD,IAE7D34C,EAAA,mBAA2B,kBAAmB25C,IAC5C53D,KAAK2xD,oBAAoB3xD,KAAKsxD,WAAoB,QAAGsG,KAAe/0D,EAAO,GAC3E,KAINue,QAAQy2C,KAAKx/B,GAAUlgB,SAAQ,KAC7B6D,EAAUxZ,QAAQ,IAGpB4e,QAAQgI,IAAIiP,GAAUlgB,SAAQ,KAC5BnY,KAAK29C,SAAU,EACf39C,KAAKs2D,YAEL,MAAMS,EAAgB/2D,KAAKsxD,WAAkB,MACvCD,EAAiBrxD,KAAKsxD,WAAmB,OAC/CtxD,KAAKmwD,kBAAkB1gC,UAAUsnC,EAAcpoC,MAAM9rB,OAASk0D,EAAgB1F,GAE9EpzC,EAAA,mBAA2B,sBAAuBra,IAC5C5D,KAAKsxD,WAAW1tD,EAAIgE,KACtB5H,KAAK8xD,iBAAiBluD,GAAK,E,GAE7B,IAGJ5D,KAAKy2D,qBAAuB,IAAI3C,EAAqB,mBAAiC,KAAuB9zD,KAAKiH,SAAU+oD,GAE5H,MAAM8H,EAAwB93D,KAAKy2D,qBAAqBp4C,cACxD6tC,EAAA,0BAAyC4L,EAAuB93D,KAAKy2D,qBAAqBtC,kBA4B1Fl2C,EAAA,mBAA2B,mBAAmB,EAAErc,OAAMyJ,WAAU0sD,YAK9D,MAAM/I,EAAWhvD,KAAKsxD,WAAoB,UAAT1vD,EAAmB,QAAU,UAC3DotD,IACE+I,EACD/3D,KAAK82D,eAAe9H,EAAU3jD,GAE9BrL,KAAK62D,cAAc7H,EAAU3jD,G,IAKnC4S,EAAA,mBAA2B,oBAAoB,EAAErW,SAC/C,MAAMonD,EAAWhvD,KAAKsxD,WAAW1pD,GAC9B5H,KAAKsyD,eAAetD,IACrB0H,EAAmB1H,E,IAIvB/wC,EAAA,mBAA2B,eAAgBje,KAAKgyD,gBAAgBpqD,IAC9D,MAAMonD,EAAWhvD,KAAKsxD,WAAW1pD,GAC9BonD,IACDhvD,KAAKiyD,iBAAiBjD,GAAU,GAChC9C,EAAA,oBAAmC,mBAAmB,KACpDlsD,KAAKmwD,kBAAkBvC,gBAAgBoB,EAAS,GAC/C,CAAC/gD,MAAM,I,KAIdgQ,EAAA,mBAA2B,oBAAoB,EAAErc,OAAMg1D,eACrD,MAAM5H,EAAWhvD,KAAKsxD,WAAoB,UAAT1vD,EAAmB,QAAU,UAC3DotD,GACD2H,EAAmB3H,EAAU4H,E,IAIjC34C,EAAA,mBAA2B,cAAc,KACvCje,KAAKiH,SAASqwD,WAAWC,SAAS,iBAAiBjpD,MAAM4iB,IACvDlxB,KAAKu2D,cAAcrlC,EAAM,GACzB,IAGJ/G,EAAA,mBAA4B,SAAUnqB,KAAK4xD,mBAE3C,OAA6B,CAACzK,SAAUnnD,KAAK2S,QAASd,eAAgB,IAAI,MAE1E,MAAMjQ,EAA2B,QACjC,EAAAo2D,EAAA,GAA0B,CACxB7Q,SAAUnnD,KAAK2S,QACfslD,aAAe53D,MAAa,EAAA04C,EAAA,GAAc14C,EAAQL,KAAKsxD,WAAmB,OAAE9rC,SAASmJ,OACrFzT,OAAQ,KACNgxC,EAAA,qBAAoCtqD,GAAM,EAAK,EAEjDuZ,QAAS,KACP+wC,EAAA,qBAAoCtqD,GAAM,EAAM,IAIpD5B,KAAKwyB,KAAO,IACd,CAEOqkC,cAAc7H,EAAgDrtD,EAAiBivD,GACpF,MAAM5tD,GAAO,EAAAo/B,EAAA,GAAc4sB,EAASrgC,OAAQ3rB,GAASA,EAAKqI,SAASzD,KAAOjG,EAAIiG,KAC3E5E,IACDA,EAAKd,QAAQM,SAETouD,GACF5wD,KAAKozD,sBAAsBpE,GAGjC,CAEO8H,eAAe9H,EAAgDrtD,EAAiBivD,EAAiB7nD,GACtG,QAAW9E,IAAR8E,EAAmB,CACpB,MAAMqb,EAAI4qC,EAASrgC,MAAM5lB,GACzB,GAAGqb,GAAKA,EAAE/Y,SAASzD,KAAOjG,EAAIiG,GAC5B,M,CAIJ,IAAI5E,GAAO,EAAAo/B,EAAA,GAAc4sB,EAASrgC,OAAQ3rB,GAASA,EAAKqI,SAASzD,KAAOjG,EAAIiG,KACxE5E,IACFA,EAAO,CACLd,QAASlC,KAAKy2D,qBAAqBrC,cAAczyD,GACjD0J,SAAU1J,IAIdqtD,EAASrgC,MAAM1C,QAAQjpB,GACvBgsD,EAASxpC,SAASmJ,MAAM3W,QAAQhV,EAAKd,SAEjC0uD,GACF5wD,KAAKmzD,aAAanE,EAEtB,CAEOkJ,qBAAqBv2D,GAC1B3B,KAAKiH,SAASsgD,mBAAmB4Q,kBAAkBx2D,EAAIiG,GACzD,CAEOwwD,oBAAoBz2D,GACzB3B,KAAKiH,SAASsgD,mBAAmB4Q,kBAAkBx2D,EAAIiG,IAAI,EAC7D,CAUOuiD,WACLnqD,KAAKs2D,WAAU,EACjB,CAEOtM,WACLhqD,KAAKs2D,YACLt2D,KAAK4xD,kBACP,E,6CCj3BK,MAAMyG,EAAoB,KAC/B,MAAMC,EAAYjtD,SAASC,cAAc,OAEzC,OADAgtD,EAAU/kD,UAAUxS,IAAI,sBACjBu3D,CAAS,C,6DCDH,SAASC,EAAiBC,GACvC,MAAMzjC,EAAO1pB,SAASC,cAAc,QAGpC,OAFAypB,EAAKxhB,UAAUxS,IAAI,eACnB,QAAMg0B,EAAMyjC,EAAS,cAAgB,eAC9BzjC,CACT,C,yHCGe,MAAM0jC,UAA6B,IAChD14D,YAAYuzD,EAAkCC,GAC5CrhD,MAAMohD,GADsC,KAAAC,mBAAAA,EAG5CvzD,KAAKssD,YAAc,IAAI,KAAuBtpD,IAC5C,MAAM,OAAC3C,EAAM,QAAES,GAAWkC,EACpB01D,GAAU,EAAAC,EAAA,GAAiB34D,KAAK2zD,OAAQvvC,GAAMA,EAAE0G,MAAQzqB,IAC3DS,GAAW43D,EAAQ71D,QACpB61D,EAAQ3zD,SAAS/B,IACfhD,KAAK2zD,MAAM1nC,QAAQjpB,EAAK,IAI5BhD,KAAKuzD,oBAAsBvzD,KAAKuzD,mBAAmBvwD,GACnDhD,KAAK6zD,wBAAwB,GAEjC,CAEOlwD,QAAQ/C,GACbsR,MAAMvO,QAAQ/C,EAChB,E,6TCRa,MAAMg4D,EAMnB74D,YACUmC,EACA5B,EACAgwB,EACR5E,GAAS,GAHD,KAAAxpB,QAAAA,EACA,KAAA5B,MAAAA,EACA,KAAAgwB,WAAAA,EAPF,KAAAuoC,cAA0Cz3C,QAAQjT,UAClD,KAAAwL,QAAkB,EAiClB,KAAAmd,SAAW,KACd92B,KAAK2Z,QACNlG,aAAazT,KAAK2Z,SAElB3Z,KAAK64D,eAAgB,SAIvB74D,KAAK2Z,QAAUjG,OAAOhR,YAAW,KAC/B1C,KAAK2Z,QAAU,EACf3Z,KAAK64D,cAAc1qD,SAAS,GAE3B,IAAI,EA2EF,KAAA83C,oBAAuBn7B,GACrB9qB,KAAK64D,cAAcvqD,MAAK,IAAW,EAAD,gCAGvC,GAAGtO,KAAKqe,cAAciuC,YAAYnsC,UAAU2K,GAC1C,OAGF,MAAM5kB,EAAQ4kB,EAAIlT,cAAc,SAC1BvI,EAAQyb,EAAIlT,cAAc,eAE7BvI,IACDA,EAAMkE,UAAU/Q,OAAO,cAEjB,YAGLxC,KAAKqe,cAAciuC,YAAYnsC,UAAU2K,IAIzC5kB,IACDA,EAAM1D,SACN0D,EAAMvD,IAAM,GACZuD,EAAMtD,OACa9C,EAAA,gBAAmCoG,GAC3CnB,SAAS/B,IAClBlD,EAAA,kBAAqCkD,EAAK,IAGhD,MA7IAhD,KAAKiH,SAAWgX,EAAA,WAEhBje,KAAKqe,cAAgB,IAAIo6C,OAAqBx0D,GAAW,EAAE5D,SAAQS,cAC9DA,EACDd,KAAK84D,kBAAkBz4D,GAEvBL,KAAKimD,oBAAoB5lD,E,IAa1BqrB,GACD1rB,KAAK0rB,QAET,CAiBOA,SACL1rB,KAAKswB,WAAWllB,UAAUwC,iBAAiB,SAAU5N,KAAK82B,SAC5D,CAEOlL,SACL5rB,KAAKwhB,QACLxhB,KAAKswB,WAAWllB,UAAUsG,oBAAoB,SAAU1R,KAAK82B,SAC/D,CAEOtV,QACLxhB,KAAKqe,cAAcmD,OACrB,CAEQs3C,kBAAkBhuC,GACVA,EAAIlT,cAAc,UAuDhC5X,KAAKqe,cAAchc,KAAK,CAACyoB,MAAKloB,KAlDjB,KACX,MAAMwE,EAAQ0jB,EAAIzE,QAAQjf,MA4C1B,OA3CgBga,QAAQgI,IAAI,CAACppB,KAAKiH,SAASC,eAAeC,OAAOC,GAAQpH,KAAK64D,gBAAgBvqD,MAAK,EAAO3M,KAAS,EAAD,gCAChH,MAUM4M,SAVY,OAAU,CAC1B5M,MACAyJ,UAAW0f,EACXzM,cAAe,KAEf/d,MAAON,KAAKM,MACZy4D,QAAQ,EACRC,WAAW,KAGOpuC,YAyBpB,OAxBArc,EAAQ4J,SAAQ,KACd,MAAMjS,EAAQ4kB,EAAIlT,cAAc,SAC1BvI,EAAQyb,EAAIlT,cAAc,eAGhCvI,GAASA,EAAMkE,UAAUxS,IAAI,QAE1BmF,IAAUA,EAAM+S,eACjBvW,YAAW,KACTwD,EAAMvD,IAAM,GACZuD,EAAMtD,OACa9C,EAAA,gBAAmCoG,GAC3CnB,SAAS/B,IAClBlD,EAAA,kBAAqCkD,EAAK,GAC1C,GACD,GAIDhD,KAAKqe,cAAciuC,YAAYnsC,UAAU2K,IAC3C9qB,KAAKimD,oBAAoBn7B,E,IAItBvc,CACT,KAMc,GAMlB,CAmCOxN,IAAIY,EAAiBmkC,EAAW9lC,KAAKkC,SAW1C,MAAM4oB,EAAMzf,SAASC,cAAc,OACnCwf,EAAIvX,UAAUxS,IAAI,MAAO,aAIzB+pB,EAAIzE,QAAQjf,MAAQ,GAAKzF,EAAIiG,GAE7Bk+B,EAASp6B,OAAOof,GAEhB9qB,KAAKqe,cAAc1a,QAAQ,CAACmnB,MAAKloB,KAAMu1B,EAAA,KAIvC,OAAU,CACRx2B,MACAyJ,UAAW0f,EACXzM,cAAe,KACf06C,QAAQ,EACRpgC,aAAa,GAEjB,E,wHCjMK,SAAS7C,EACd3C,EACAxgB,EACAsB,EACAogB,EACA4kC,EAAiB,IACjBC,EACArnD,GAEA,MAAMyjB,GAAY,OAAiB,CACjC3iB,UACA/Q,KAAMuxB,GAAsC,SAA9BxgB,EAAQ0T,QAAQ5lB,UAAuB,OAAS,aAC9Dw4D,iBACA5kC,kBACAxiB,mBAGF,IAAIshB,EACF,OAAOmC,EAGT,MAAM6jC,EAAQ,IAAIC,MAAM9jC,EAAW,CACjC+jC,MAAO,CAACh5D,EAAQi5D,EAAMlE,KACpB,MAAMxtD,GAAMwtD,EAAK,GACXp/B,OAAsB/xB,IAAZmxD,EAAK,IAAmBA,EAAK,GAEvCx0D,EAAMuyB,EAAKvb,cAAc,cAAchQ,QAAWurB,EAAKoC,SAAS3tB,GACtE2xD,EAAa34D,EAAIgH,EAAIouB,EAAQ,IAI3BujC,EAAe,CAAMl5D,EAAqBuH,EAAYouB,GAAU,KAAS,O,EAAD,K,OAAA,E,EAAA,YAC5E,MAAMD,EAAapjB,EAAQ4iB,SAAS3tB,GAEpC,GAAGqM,EAAS,CACV,MAAMulD,EAAUvlD,EAAQrM,EAAImuB,EAAYC,GAClCyjC,EAAYD,aAAmBp4C,cAAgBo4C,EAAUA,EAC/D,QAAiBv1D,IAAdw1D,IAA4BA,EAC7B,M,CAIDP,GACDA,EAAYhjC,kBAAkB,CAC5Bh0B,QAAS7B,EAAO4Y,cAAcsc,SAAS3tB,GACvCuuB,SAAU,SACV6R,eAAgBhS,OAAU/xB,EAAY,WACtC2kD,cAAeqQ,EACflN,KAAM,MAIN,iCACF/1B,GAAU,GAGZ,MAAMX,EAASC,EAAUD,SACzB,GAAGh1B,EAAOkT,UAAUqB,SAAS,WAAahN,IAAOytB,EAC/C,OAAO,EAGT,MAAMqkC,EAAiB1jC,EAAU,KAAW5lB,GAAmBA,IAEzDM,EAAOyiB,EAAKvb,cAAcsF,EAAQwL,cAAgB,WACrDhY,GACDgpD,GAAe,KACbhpD,EAAK6C,UAAU/Q,OAAO,SAAS,IAKhCm3D,IAAyB,IAAZtkC,GAAiBW,GAC/B0jC,GAAe,KACb,MAAME,EAAYv5D,EAAOuX,cAAc,KACjCiiD,EAAmBx5D,EAAO4Y,cAAcsc,SAASF,GAAQzd,cAAc,KAE7EiiD,EAAiBtmD,UAAU/Q,OAAO,WAClCo3D,EAAUrmD,UAAU/Q,OAAO,WAG3B,MAAMs3D,EAAYD,EAAiB5gD,cAAcA,cAAcwK,WAAam2C,EAAU3gD,cAAcA,cAAcwK,WAC5Gs2C,EAAcF,EAAiB9L,YAAc6L,EAAU7L,YAC7D6L,EAAUruD,MAAMsR,UAAY,eAAei9C,sBAA8BC,YAIzE,SAAQ,KAENH,EAAUrmD,UAAUxS,IAAI,WACxB64D,EAAUruD,MAAMsR,UAAY,MAAM,GAClC,IAIN68C,GAAe,KACbr5D,EAAOkT,UAAUxS,IAAI,SAAS,IAGhCu0B,EAAU1tB,EAAIouB,EAChB,E,YApE8E,K,6QAoE7E,EAEK2jC,GAAaxmC,EAAK5f,UAAUqB,SAAS,aAGrCsI,EAAUiW,EAAK5d,kBAAkB2H,QAuBvC,OAtBA,QAAiBiW,GAAOprB,IACtB,IAQIH,EARAvH,EAAS0H,EAAE1H,OAMf,GAJAA,GAAS,OAAcA,EAAQ8yB,IAI3B9yB,EAAQ,OAAO,EAGnB,GAAGA,EAAOgmB,QAAQnT,KAEhB,GADAtL,GAAMvH,EAAOgmB,QAAQnT,KACV,IAARtL,EACD,OAAO,OAGTA,GAAK,OAAWvH,GAGlBk5D,EAAal5D,EAAQuH,EAAG,GACvB,CAACiK,mBAEGsnD,CACT,C,6OCtHO,SAAea,EAAqBjpC,EAAoB/c,EAAcqB,EAA2B4kD,G,qCACtG,MAAMvmC,EAA+B,GAE/B47B,GADsBj6C,aAAQ,EAARA,EAAU6kD,MAAMngC,GAAwB,6BAAbA,EAAOnqB,KACvBuqD,SAAsCl2D,EACvEm2D,GAAW,EAAAC,EAAA,GAAcrmD,EAAM,CAACqB,WAAU4kD,oBAAmBvmC,eAAc4mC,oBAAqBhL,IACpF8K,EAAS3hD,iBAA8B,6BAC/C1T,SAASnE,IACjBA,EAAG25D,gBAAkB,UACrB35D,EAAG2S,UAAUxS,IAAI,KAAK,IAGxB2yB,EAAa7wB,eAAgBue,QAAQgI,IAAIsK,IAEzC0mC,EAAS3hD,iBAA8B,qBAAqB1T,SAASnE,IACnEA,EAAGoX,SAAQ,SAAmB,GAAM,IAGtC,MAAMwiD,EAAmB,IAAa,uBAAiCv2D,EAUjEw2D,EAAsBvhD,MAAMC,KAAKihD,EAAS3hD,iBAAmC,8BAA8BqC,KAAKla,IACpHA,EAAGylB,QAAQq0C,IAAM,IACT95D,EAAW6uD,sBAGfr6C,GAAO,EAAAulD,EAAA,GAAuBP,GACpC9K,SAAAA,EAAUvrD,UAIV,MAAM62D,GAAM,EAAAC,EAAA,GAAe9pC,GAG3B,GAAG6pC,EAAIlQ,UAOA,CACL,MAAMN,EAAQ/+C,SAASsvC,cACvB,IAAI+P,EAAO35B,EAAM+b,UACb4d,GACF35B,EAAMrlB,OAAOg/C,EAAwBr/C,SAASyvD,eAAe,KAG/D1Q,EAAME,cAAcI,GACpBN,EAAM2Q,UAAS,GACfH,EAAI9oC,UAAUkpC,kBACdJ,EAAI9oC,UAAUmpC,SAAS7Q,E,CAQzBr5B,EAAMnjB,iBAAiB,QAASwM,EAAA,EAAa,CAACpF,SAAS,EAAM/G,MAAM,EAAMgU,SAAS,IAClFu4C,SAAAA,EAAkBU,cAAc,CAACC,UAAW,kBAC5CznD,OAAOrI,SAAS+vD,YAAY,cAAc,EAAOhmD,GACjD8D,MAAMC,KAAK4X,EAAMtY,iBAAmC,eAAe1T,SAAQ,CAACnE,EAAImI,YACvEnI,EAAGylB,QAAQq0C,IAClB,MAAMjL,EAAqBgL,EAAoB1xD,GAC9CnI,EAAW6uD,mBAAqBA,EACjCA,EAAmBlsD,YAAc3C,CAAE,IAKrCmwB,EAAMtY,iBAA8B,OAAO1T,SAASnE,IAClDA,EAAG25D,gBAAkB,OAAO,IAW9BC,SAAAA,EAAkBa,gBAAgBtqC,IAClC,OAAcA,EAAO,QAkCvB,E,+RAEA,IAAIyB,EAAO,KACTnnB,SAASuC,iBAAiB,SAAU7F,IAClC,MAAMgpB,GAAQ,EAAAuqC,EAAA,GAAgBvzD,EAAE1H,OAAQ,0BACxC,IAAI0wB,EACF,OAGF,MAAMwqC,IAAiBxqC,EAAM1K,QAAQk1C,aAErC,IAAIvnD,EAAcqB,EADlBtN,EAAE2qB,iBAIF,IAAIljB,GAAqBzH,EAAEyzD,eAAiBzzD,GAAG0zD,cAAcC,QAAQ,cACjEC,GAAe,EAGfvmD,GAAgBrN,EAAEyzD,eAAiBzzD,GAAG0zD,cAAcC,QAAQ,aAEhE,MAAME,EAAgB7zD,GAA6B,uBAARA,EAAE6H,GAAuC,2BAAR7H,EAAE6H,IAAmC2rD,EACjH,GAAGA,EAAc,CACf,MAAMx+B,EAAS,UACfvtB,EAAYA,EAAUmX,QAAQoW,EAAQ,IACtC3nB,EAAOA,EAAKuR,QAAQoW,EAAQ,G,CAG9B,MAAM/0B,GAAU+oB,EAAM1K,QAAQre,QAAU,MAAc4qB,WACtD,GAAGxd,EAAKwb,OAAQ,CACdxkB,QAAQ8R,IAAI9I,EAAKuR,QAAQ,2BAA4B,KAErDvR,EAAOA,EAAKuR,QAAQ,2BAA4B,IAChDvR,EAAOA,EAAKuR,QAAQ,mBAAoB,IACxCvR,EAAOA,EAAKuR,QAAQ,yCAA0C,IAE9D,MAAMphB,EAAQ6P,EAAK7P,MAAM,2BACtBA,IACD6P,EAAO7P,EAAM,GAAGqrB,QAMlB,MAEMmE,GAFS,IAAIwc,WACAC,gBAAgBp8B,EAAM,aACxB3J,MAAQJ,SAASC,cAAc,QAMhD,IAAIuwD,EAAW9mC,EAAKkG,WACpB,KAAM4gC,GAAU,CACd,MAAMC,EAAcD,EAASC,YAC1BD,EAAS9Q,WAAa8Q,EAAS7Q,YAC5B6Q,EAAS5Q,UAAUr6B,QACrBirC,EAASr5D,UAIbq5D,EAAWC,C,CAGb,MAAMC,GAAY,EAAAC,EAAA,GAAsBjnC,GAAM,GAAM,GAEtB/sB,IAE5B+zD,EAAU1mD,SAAW0mD,EAAU1mD,SAAS+jB,QAAQW,GAAwB,6BAAbA,EAAOnqB,KAGpD,CACd,MAAMqsD,EAAQF,EAAUrvD,MAAMyX,MAAM,MACpC,IAAI+3C,EAAa,EACjB,IAAI,IAAIC,EAAY,EAAGA,EAAYF,EAAMp5D,SAAUs5D,EAAW,CAC5D,MAAMC,EAAOH,EAAME,GACnBD,GAAcE,EAAKv5D,OAEnB,MAAMurB,EAAQ8tC,EACd,GAAwB,OAArB1sD,EAAU4e,IAAmB+tC,IAAeF,EAAMp5D,OAAS,EAAI,CAChE,MAAMw5D,EAAWJ,EAAM3tC,OAAO6tC,EAAY,EAAG,GAAG,GAChDF,EAAME,GAAaC,EAAOC,EAG1BN,EAAU1mD,SAAStQ,SAASg1B,IACvBA,EAAOG,QAAU9L,IAClB2L,EAAOG,QAAU,E,IAIrBgiC,GAAcG,EAASx5D,M,CAGzBq5D,GAAc,C,CAGhB,MAAMI,EAAgBL,EAAMz3C,KAAK,MACjCu3C,EAAUrvD,MAAQ4vD,C,CAKpB,GAFuBP,EAAUrvD,MAAMia,QAAQ,MAAO,IAAI9jB,SAClC2M,EAAUmX,QAAQ,MAAO,IAAI9jB,QAEnDk5D,EAAU1mD,SAAS3U,MAAMq5B,GAAwB,6BAAbA,EAAOnqB,IAAmC,CAC9EoE,EAAO+nD,EAAUrvD,MACjB2I,EAAW0mD,EAAU1mD,SACrBsmD,GAAe,EAEf,IAAIY,GAAY,EAAAC,EAAA,GAAcxoD,GAC9BuoD,EAAYA,EAAUnjC,OAAOwiC,IAC7B,EAAAa,EAAA,GAAcpnD,EAAUknD,E,CAG1BnwD,QAAQ8R,IAAI,eAAgBy9C,E,CAG3BA,IACD3nD,EAAOxE,EACP6F,GAAW,EAAAmnD,EAAA,GAAcxoD,GACzBqB,EAAWA,EAAS+jB,OAAOwiC,IAG7B5B,EAAqBjpC,EAAO/c,EAAMqB,EAAUrN,EAAO,IAGrDwqB,EAAO,IAAI,EAoBb,IAAYkqC,EAuBZ,SAASvC,IAKP,OAJiB,YAAkC,CACjDwC,eAAe,EACfC,cAAc,GAGlB,CAEA,SAASC,EAA2B9rC,GAClC,MAAM0pC,EAAsBvhD,MAAMC,KAAK4X,EAAMtY,iBAAmD,6CAChG,IAAI62C,EAAWv+B,EAAMnZ,cAA0C,0BAC/D,IAAI03C,GAAYmL,EAAoB53D,OAClCysD,EAAW6K,IACXppC,EAAM/Y,QAAQs3C,QACT,GAAGA,IAAamL,EAAoB53D,OAEzC,YADAysD,EAAS9sD,SAIX,IAAI8sD,EACF,OAGF,MAAME,EAAiE,IAAIjuD,IAC3Ek5D,EAAoB11D,SAAS7C,IAC3B,MAAMutD,EAAqBvtD,aAAmB,KAAqBA,EAAWA,EAAgButD,oBACxF,MAACroD,GAASqoD,EAChB,IAAI7rD,EAAM4rD,EAAavsD,IAAImE,GACvBxD,GACF4rD,EAAa5rD,IAAIwD,EAAOxD,EAAM,IAAIxC,KAGpCwC,EAAI7C,IAAI0uD,EAAmB,IAG7B,IAAI,MAAOroD,EAAOqzD,KAAwBjL,EAAc,CACtD,IAAIsN,EAASxN,EAASE,aAAavsD,IAAImE,GACvC,GAAG01D,EACD,IAAI,MAAMrN,KAAsBqN,EAC1BrC,EAAoBp3D,IAAIosD,IAC1BA,EAAmB1rD,eAIvB+4D,EAAS,IAAI17D,IAGf,IAAI,MAAMquD,KAAsBgL,EAC1BqC,EAAOz5D,IAAIosD,IACbA,EAAmBsN,mB,CAKzBzN,EAASvuD,IAAIyuD,GAAc,GAC3BF,EAASkD,aACX,EA/EA,SAAYkK,GACV,yBACA,qBACA,oBACD,CAJD,CAAYA,IAAAA,EAAU,KAiFP,MAAMM,EAUnBj9D,YAAmB8tB,EAA6B,CAAC,GAA9B,KAAAA,QAAAA,EACjB7tB,KAAKoL,UAAYC,SAASC,cAAc,OACxCtL,KAAKoL,UAAUmI,UAAUxS,IAAI,eAE7Bf,KAAK+kD,SAAWl3B,EAAQk3B,SACxB/kD,KAAKi9D,SAAWpvC,EAAQovC,cAECh5D,IAAtB4pB,EAAQqvC,gBAAoDj5D,IAAzB4pB,EAAQsvC,eAC5CtvC,EAAQsvC,aAAe32D,KAAKI,IAAI,GAAIJ,KAAKmD,MAAMkkB,EAAQqvC,UAAY,KAGrE,MAAM,YAAC35D,EAAW,UAAE25D,EAAS,aAAEC,EAAY,KAAEjlD,EAAI,UAAE1I,EAAS,YAAE4tD,GAAc,EAAI,aAAEvd,GAAgBhyB,EAC5F2Z,EAAQ3Z,EAAQ2Z,OAAS3Z,EAAQwvC,UAEjCC,EAAsC,GAC5C,IAAIvsC,EA8GJ,GA7GIvhB,GA2FFxP,KAAKoL,UAAUoU,UAAY,8BACNtH,EAAO,SAASA,KAAU,oBAAoB2nC,QAAAA,EAAgB,UAAUrY,EAAQ,cAAgB,wCAGrHzW,EAAQ/wB,KAAKoL,UAAUmK,oBA9FpBid,GACDA,IAGFxyB,KAAKoL,UAAUoU,UAAY,wCAE3BuR,EAAQ/wB,KAAKoL,UAAUmK,kBACvBwb,EAAMwpC,gBAAkB,KAAO6C,EAS/B,kBAEArsC,EAAMnjB,iBAAiB,aAAc7F,I,MACnC,MAAM+pB,EAAYzmB,SAASovC,eAC3B,IAAI3oB,EAAUyrC,YACZ,OAGF,MAAMh6D,GAAc,EAAAy8B,EAAA,GAAUj4B,EAAE1H,OAAQ,OACxC,IAAIkD,EACF,OAGF,MAAMgf,EAAOhf,EAAYif,wBACnBg7C,EAAUj7C,EAAKI,KAAOJ,EAAKe,MAAQ,EACnCm6C,EAAc11D,EAAE21D,SAAWF,EAE3BpT,EAAQ/+C,SAASsvC,cACvByP,EAAME,cAAcmT,EAAcl6D,EAAyC,QAA3B,EAAAA,EAAYunD,uBAAe,QAAIvnD,GAC/EuuB,EAAUkpC,kBACVlpC,EAAUmpC,SAAS7Q,EAAM,IAG3BkT,EAAiBj7D,MAAK,MAIjB,EAAAs7D,EAAA,GAAa5sC,IAEdA,EAAMmO,kBA2BR,KAAchmB,MAAMC,KAAK4X,EAAMtY,iBAAiB,uBAAuB1T,SAASnE,IAE9EA,EAAG4B,QAAQ,KAMb,QAAoB0W,MAAMC,KAAK4X,EAAMtY,iBAAiB,sBAEtDokD,EAA2B9rC,EAAM,MAgBrC,OAAaA,GAEVlD,EAAQ+vC,YACT7sC,EAAM6sC,UAAY/vC,EAAQ+vC,WAGzBr6D,IACD,QAAMwtB,EAAOxtB,OAAaU,EAAW,eAGpCujC,GAASjkC,EAAa,CACvB,MAAM+7C,EAASj0C,SAASC,cAAc,OACtCg0C,EAAO/rC,UAAUxS,IAAI,sBACrBf,KAAKoL,UAAUM,OAAO4zC,E,CASxB,GANG9X,IACDxnC,KAAKwnC,MAAQn8B,SAASC,cAAc,SACpCtL,KAAK+/C,WACL//C,KAAKoL,UAAUM,OAAO1L,KAAKwnC,QAG1B01B,EAAW,CACZ,MAAMW,EAAU79D,KAAKoL,UAAUwb,iBAC/B,IAAIk3C,GAAgB,EAEpB,MAAMp5B,EAAU,KACd,MAAMq5B,EAAWhtC,EAAMxd,UAAUqB,SAAS,SAEpCopD,EAAcxuD,EAAauhB,EAA2BrkB,MAAM7J,OAAS,KAAI,EAAAm5D,EAAA,GAAsBjrC,GAAO,GAAO,GAAOrkB,OAAO7J,OAC3HolB,EAAOi1C,EAAYc,EACnBC,EAAUh2C,EAAO,EACvB8I,EAAMxd,UAAU1J,OAAO,QAASo0D,GAI7BA,GAAWh2C,GAAQk1C,GACpBn9D,KAAK+/C,WACL8d,EAAQnyD,OAAO,KAAKwxD,EAAYc,MAC5BF,IAAeA,GAAgB,KAC1BC,IAAaE,GAAYH,KAClC99D,KAAK+/C,WACL+d,GAAgB,E,EAIpBR,EAAiBj7D,KAAKqiC,E,EAGF7W,EAAQqwC,iBACV1uD,IAClBuhB,EAAM1K,QAAQk1C,aAAe,IAC7BxqC,EAAMnjB,iBAAiB,YAAa7F,IAClC,GAAa,UAAVA,EAAEyE,IAEH,OADAzE,EAAE2qB,kBACK,C,KAKV4qC,EAAiBz6D,QAClBkuB,EAAMnjB,iBAAiB,SAAS,KAC9B0vD,EAAiBv4D,SAASwtB,GAAaA,KAAW,IAItDvyB,KAAK+wB,MAAQA,CACf,CAEOuxB,SACDtiD,KAAK0M,QAIN1M,KAAK6tB,QAAQre,UACbxP,KAAK+wB,MAA2BuxB,SC9jBxB,SAA+B1hD,GAC5C,MAAMwpD,EAAQ/+C,SAASsvC,cACvByP,EAAM+T,mBAAmBv9D,GACzB,MAAM6rD,EAAM/4C,OAAO+mC,eACnBgS,EAAIuO,kBACJvO,EAAIwO,SAAS7Q,EACf,CD0jBMgU,CAAsBp+D,KAAK+wB,OAE/B,CAEOgvB,WACL//C,KAAKwnC,MAAM5uB,YAAc,GACtB5Y,KAAK6tB,QAAQwvC,WACd,EAAA5iC,EAAA,GAAaz6B,KAAKwnC,MAAOxnC,KAAK6tB,QAAQwvC,WAEtCr9D,KAAKwnC,MAAM97B,QAAO,QAAK1L,KAAK6tB,QAAQ2Z,MAAOxnC,KAAK6tB,QAAQwwC,cAE5D,CAEI3xD,YACF,OAAO1M,KAAK6tB,QAAQre,UAAaxP,KAAK+wB,MAA2BrkB,OAAQ,EAAAsvD,EAAA,GAAsBh8D,KAAK+wB,OAAO,GAAO,GAAOrkB,KAE3H,CAEIA,UAAMA,GACR1M,KAAKk/C,iBAAiBxyC,GAAO,GAC7B1M,KAAKqhD,oBACP,CAEOA,sBACL,OAAcrhD,KAAK+wB,MAAO,QAC5B,CAEOmuB,iBAAiBxyC,EAA6C4xD,GAChEt+D,KAAK6tB,QAAQre,UACbxP,KAAK+wB,MAA2BrkB,MAAQA,IAEzC,EAAA6c,EAAA,GAAevpB,KAAK+wB,MAAOrkB,GAC3BmwD,EAA2B78D,KAAK+wB,OAEpC,CAEOyzB,YACL,OAAOxkD,KAAK0M,QAAU1M,KAAKu+D,aAC7B,CAEOzZ,UACL,OAAQ9kD,KAAK+wB,MAAMxd,UAAUqB,SAAS,YAClC5U,KAAKi9D,UAAYj9D,KAAKi9D,eACtBj9D,KAAK+kD,YAAa,EAAA4Y,EAAA,GAAa39D,KAAK+wB,OAC1C,CAEOytC,kBACL,OAAOx+D,KAAK8kD,WAAa9kD,KAAKwkD,WAChC,CAEOia,cAAc/xD,EAAQ,GAAIu/C,GAC3BjsD,KAAK6tB,QAAQre,YACf9C,GAAQ,EAAAiuD,EAAA,IAAuB,EAAAN,EAAA,GAAc3tD,KAG5Cu/C,EACDjsD,KAAKk/C,iBAAiBxyC,GAAO,GAE7B1M,KAAK0M,MAAQA,CAEjB,CAEOgyD,iBAAiBhyD,EAAqC,GAAIu/C,GAC/DjsD,KAAKu+D,cAAgB7xD,EACrB1M,KAAKy+D,cAAc/xD,EAAOu/C,EAC5B,CAEO0S,SAAS7xC,EAAmB0a,GAC9BA,GACDxnC,KAAKwnC,MAAM5uB,YAAc,GACzB5Y,KAAKwnC,MAAM97B,QAAO,QAAK87B,EAAOxnC,KAAK6tB,QAAQwwC,gBAE3Cr+D,KAAK+/C,WAGP//C,KAAK+wB,MAAMxd,UAAU1J,OAAO,WAAYijB,EAAQ4vC,EAAW5uB,QAC3D9tC,KAAK+wB,MAAMxd,UAAU1J,OAAO,WAAYijB,EAAQ4vC,EAAWkC,OAC7D,CAEOC,SAASr3B,GACdxnC,KAAK2+D,SAASjC,EAAW5uB,MAAOtG,EAClC,E,4DExoBa,MAAMs3B,EAWnB/+D,YAAYwD,EAA0BktB,GAL/B,KAAAsuC,UAAY,GACZ,KAAAplD,QAAU,EA+BjB,KAAA+qB,QAAU,KACR,IAAI1kC,KAAKywB,SAAU,OAEnB,MAAM/jB,EAAQ1M,KAAK0M,MAIhBA,IAAU1M,KAAK++D,YAChB/+D,KAAK++D,UAAYryD,EACjB+G,aAAazT,KAAK2Z,SAClB3Z,KAAK2Z,QAAUjG,OAAOhR,YAAW,KAC/B1C,KAAKywB,SAAS/jB,EAAM,GACnB,K,EAIP,KAAAsyD,aAAe,KACbh/D,KAAK0M,MAAQ,GACb1M,KAAKywB,UAAYzwB,KAAKywB,SAAS,IAC/BzwB,KAAKi/D,SAAWj/D,KAAKi/D,SAAS,EA7C9Bj/D,KAAK8wB,WAAa,IAAI,KAAW,CAC/BvtB,cACAiM,WAAW,IAGbxP,KAAKoL,UAAYpL,KAAK8wB,WAAW1lB,UACjCpL,KAAKoL,UAAUmI,UAAU/Q,OAAO,eAChCxC,KAAKoL,UAAUmI,UAAUxS,IAAI,gBAE7Bf,KAAKywB,SAAWA,EAEhBzwB,KAAK+wB,MAAQ/wB,KAAK8wB,WAAWC,MAC7B/wB,KAAK+wB,MAAMxd,UAAUxS,IAAI,sBAEzB,MAAMm+D,EAAa7zD,SAASC,cAAc,KAC1C4zD,EAAW3rD,UAAUxS,IAAI,QAAS,gBAElCf,KAAKm/D,SAAW9zD,SAASC,cAAc,KACvCtL,KAAKm/D,SAAS5rD,UAAUxS,IAAI,QAAS,WAAY,eAEjDf,KAAK+wB,MAAMnjB,iBAAiB,QAAS5N,KAAK0kC,SAC1C1kC,KAAKm/D,SAASvxD,iBAAiB,QAAS5N,KAAKg/D,cAE7Ch/D,KAAKoL,UAAUM,OAAOwzD,EAAYl/D,KAAKm/D,SACzC,CAwBIzyD,YACF,OAAO1M,KAAK8wB,WAAWpkB,KACzB,CAEIA,UAAMA,GACR1M,KAAK++D,UAAYryD,EACjB+G,aAAazT,KAAK2Z,SAClB3Z,KAAK8wB,WAAWpkB,MAAQA,CAC1B,CAEOlK,SACLiR,aAAazT,KAAK2Z,SAClB3Z,KAAK+wB,MAAMrf,oBAAoB,QAAS1R,KAAK0kC,SAC7C1kC,KAAKm/D,SAASztD,oBAAoB,QAAS1R,KAAKg/D,aAClD,E,qGCxEa,MAAMI,UAAsB,IACzCr/D,YAAYuzD,EAAwB+L,GAClCntD,MAAMohD,GAWA,KAAAC,mBAAqB,EAAElzD,SAAQS,eAMrC,OAAiBd,KAAK2zD,OAAQvvC,GAAMA,EAAE0G,MAAQzqB,IAAQ0E,SAAS/B,IAC1DlC,IACDkC,EAAK0wD,SAAU,GAGjB1wD,EAAKlC,QAAUA,EACf,MAAMstB,EAAQpuB,KAAK2zD,MAAM3qD,WAAWhG,IAAUA,EAAKlC,UACnDd,KAAK2zD,MAAMrlC,OAAO9nB,KAAKC,IAAI,EAAG2nB,GAAQ,EAAGprB,EAAK,IAGhDhD,KAAK6zD,wBAAwB,EAzB7B7zD,KAAKssD,YAAc,IAAI,IAAsBtsD,KAAKuzD,qBAEjD8L,IAAwB,SAAuB,KAC9Cr/D,KAAKmF,MAAM,IACV,KACDnF,KAAK03B,kBAAkB,GAE3B,CAqBU4nC,UACR,OAAO,OAAct/D,KAAK2zD,OAAQ3wD,GAASA,EAAK0wD,SAClD,CAEa5iD,YAAY9N,G,iHACjB,EAAM8N,YAAW,UAAC9N,GACxBhD,KAAKssD,YAAYxpD,UAAUE,EAAK8nB,IAClC,E,+RAEUy0C,WAAWzjC,EAA4Bl7B,G,MAG/C,QAFiBsR,MAAMqtD,WAAWzjC,EAAQl7B,KAI1CZ,KAAK2D,QAAQ/C,GAIH,QAAV,EAAAA,EAAG8yD,eAAO,QAAV9yD,EAAG8yD,SAAY,IAER,EACT,E,uEChDa,MAAM8L,UAAiC,IAOpDz/D,YAAYuzD,GACVphD,MAAMohD,GAPE,KAAAK,MAAgC,GAChC,KAAA8L,UAAkC,IAAIr+D,GAOhD,CAEO+D,OACL+M,MAAM/M,OACNnF,KAAKssD,YAAYnnD,MACnB,CAEO8kD,SACL/3C,MAAM+3C,SACNjqD,KAAKssD,YAAYrC,QACnB,CAEOvyB,mBACLxlB,MAAM+3C,SACNjqD,KAAKssD,YAAY50B,kBACnB,CAEOlW,QACLtP,MAAMsP,QACNxhB,KAAKssD,YAAY8J,YACnB,CAEOlM,UACLlqD,KAAKssD,YAAYpC,SACnB,CAEUwV,SAAS18D,GACjB,OAAOA,EAAKJ,KAAKI,EAAK8nB,IACxB,CAEUy0C,WAAWzjC,EAA4Bl7B,GAE/C,GADaZ,KAAK2zD,MAAMjzD,MAAM0jB,GAAMA,EAAE0G,MAAQlqB,EAAGkqB,KAAO1G,EAAExhB,OAAShC,EAAGgC,OAEpE,OAAO,EAEP,IAAI,MAAMI,KAAQhD,KAAKy/D,UACrB,GAAGz8D,EAAK8nB,MAAQlqB,EAAGkqB,KAAO9nB,EAAKJ,OAAShC,EAAGgC,KACzC,OAAO,EAMb,OADA5C,KAAK2zD,MAAM73B,GAAQl7B,IACZ,CACT,CAEUizD,yB,MACe,QAAvB,EAAA7zD,KAAK2/D,0BAAkB,QAAvB3/D,KAAK2/D,mBAAuBjsD,OAAOhR,YAAW,KAC5C1C,KAAK2/D,wBAAqB17D,EAC1BjE,KAAK4/D,cAAc,GAClB,GACL,CAEOv9D,KAAKzB,GACVsR,MAAM7P,KAAKzB,EACb,CAEOqrB,QAAQrrB,GACbsR,MAAM+Z,QAAQrrB,EAChB,CAEOK,OAAOL,IACZ,OAAiBZ,KAAK2zD,OAAQvvC,GAAMA,EAAE0G,MAAQlqB,EAAGkqB,MACjD9qB,KAAK8C,UAAUlC,EACjB,CAEO+C,QAAQ/C,GACbZ,KAAKssD,YAAY3oD,QAAQ/C,EAAGkqB,IAC9B,CAEOhoB,UAAUlC,GACfZ,KAAKssD,YAAYxpD,UAAUlC,EAAGkqB,IAChC,E,qECxFa,MAAM+0C,UAA0B,IAW7C9/D,YAAsB8tB,GAQpB3b,MAAM,CACJgN,KAAM,IAAO,GAAK,IAClBtY,IAAK,EACLH,IAAK,EACL0Y,eAAgB0O,EAAQ1O,eACxB2gD,aAAcjyC,EAAQiyC,cACrB,GAdiB,KAAAjyC,QAAAA,EA2DZ,KAAAkyC,aAAe,KACvB//D,KAAKyG,IAAMzG,KAAK0F,MAAMmB,SACtB7G,KAAKggE,KAAKryD,aAAa,MAAO,GAAK3N,KAAKyG,IAAI,EAGpC,KAAA+C,QAAU,KAClBxJ,KAAKsgB,aAAa,EAGV,KAAAxY,OAAS,KACjB,MAAMwc,EAAI,KACRtkB,KAAKsgB,cAELtgB,KAAKigE,YAAcjgE,KAAK0F,MAAMpB,YAASL,EAAYyP,OAAOq0B,sBAAsBzjB,EAAE,EAGjFtkB,KAAKigE,cACNvsD,OAAOsjC,qBAAqBh3C,KAAKigE,aACjCjgE,KAAKigE,iBAAch8D,GAGlBjE,KAAK4W,YACN5W,KAAKkgE,kBAKP57C,GAAG,EAIK,KAAAmnB,aAAe,KACpBzrC,KAAK0F,MAAMpB,SACZtE,KAAKsgB,cAEFtgB,KAAK4W,YACN5W,KAAKkgE,kB,EAKD,KAAAC,WAAcp4D,IACtB/H,KAAKkgE,iBAAiB,EArFnBryC,EAAQnoB,OACT1F,KAAKsI,SAASulB,EAAQnoB,MAAOmoB,EAAQjX,WAEzC,CAEOtO,SAAS5C,EAAyBkR,GAAa,GACjD5W,KAAK0F,OACN1F,KAAK2b,kBAGJ/E,IAAe5W,KAAKogE,YACrBpgE,KAAKogE,WAAa/0D,SAASC,cAAc,OACzCtL,KAAKogE,WAAW7sD,UAAUxS,IAAI,wBAAyB,yBACvDf,KAAKoL,UAAU4M,QAAQhY,KAAKogE,aAEpBpgE,KAAKogE,YACbpgE,KAAKogE,WAAW7sD,UAAU1J,OAAO,QAAS+M,GAG5C5W,KAAK0F,MAAQA,EACb1F,KAAK4W,WAAaA,IACdlR,EAAMpB,QAAUoB,EAAMa,YAAc,IACtCvG,KAAK8H,SAGP,IAAIyJ,GAAa,EACjBvR,KAAKqgE,aACLrgE,KAAKqU,eACLrU,KAAKof,YAAY,CACfi5B,YAAa,K,QACX9mC,GAAcvR,KAAK0F,MAAMpB,OACzBiN,GAAcvR,KAAK0F,MAAMnB,QACA,QAAzB,EAAY,QAAZ,EAAAvE,KAAK6tB,eAAO,eAAE/V,mBAAW,gBAAI,EAG/BwH,UAAYvX,I,QAEVwJ,GAAcvR,KAAK0F,MAAMjB,OACF,QAAvB,EAAY,QAAZ,EAAAzE,KAAK6tB,eAAO,eAAE9V,iBAAS,gBAAI,GAGjC,CA+CU+zB,MAAM/jC,GACd,MAAMmkC,EAAYh6B,MAAM45B,MAAM/jC,GAE9B,OADA/H,KAAK0F,MAAMa,YAAc2lC,EAClBA,CACT,CAEUg0B,kBACR,GAAG,sBAA6ClgE,KAAK0F,OAAQ,OAC7D,MAAM46D,EAAMtgE,KAAK0F,MAAM66D,SACjBC,EAAYF,EAAIz9D,OAEhB0D,EAAcvG,KAAK0F,MAAMa,YAC/B,IAAIk6D,EAAe,EAAGC,EAAM,EAC5B,IAAI,IAAIt8C,EAAI,EAAGA,EAAIo8C,IAAap8C,EAAG,CACjC,MAAM0D,EAAQw4C,EAAIx4C,MAAM1D,GACrB7d,GAAeuhB,GAASA,GAAS24C,IAClCA,EAAe34C,EACf44C,EAAMJ,EAAII,IAAIt8C,G,CAQlB,MAAMu8C,EAAW3gE,KAAK0F,MAAMmB,SAAW65D,EAAM1gE,KAAK0F,MAAMmB,SAAW,EACnE7G,KAAKogE,WAAW70D,MAAM+X,MAAoB,IAAXq9C,EAAkB,GAEnD,CAEUN,aACRrgE,KAAKyG,IAAMzG,KAAK0F,MAAMmB,UAAY,EAC/B7G,KAAKyG,IAAM,EACZzG,KAAK+/D,eAEL//D,KAAK0F,MAAMkI,iBAAiB,aAAc5N,KAAK+/D,aAEnD,CAEOz/C,cACL,GAAG,sBAA6CtgB,KAAK0F,OAAQ,OAW7D,MAAMa,EAAcvG,KAAK0F,MAAMa,YAC/B2L,MAAMoO,YAAY/Z,EACpB,CAEO8N,eACLnC,MAAMmC,eACNrU,KAAK0F,MAAMkI,iBAAiB,QAAS5N,KAAKwJ,SAC1CxJ,KAAK0F,MAAMkI,iBAAiB,OAAQ5N,KAAK8H,QACzC9H,KAAK0F,MAAMkI,iBAAiB,QAAS5N,KAAKyrC,cAC1CzrC,KAAK0F,MAAMkI,iBAAiB,aAAc5N,KAAKyrC,cAC/CzrC,KAAK4W,YAAc5W,KAAK0F,MAAMkI,iBAAiB,WAAY5N,KAAKmgE,WAClE,CAEOxkD,kBACLzJ,MAAMyJ,kBAEH3b,KAAK0F,QACN1F,KAAK0F,MAAMgM,oBAAoB,aAAc1R,KAAK+/D,cAClD//D,KAAK0F,MAAMgM,oBAAoB,QAAS1R,KAAKwJ,SAC7CxJ,KAAK0F,MAAMgM,oBAAoB,OAAQ1R,KAAK8H,QAC5C9H,KAAK0F,MAAMgM,oBAAoB,QAAS1R,KAAKyrC,cAC7CzrC,KAAK0F,MAAMgM,oBAAoB,aAAc1R,KAAKyrC,cAClDzrC,KAAK4W,YAAc5W,KAAK0F,MAAMgM,oBAAoB,WAAY1R,KAAKmgE,aAGlEngE,KAAKigE,cACNvsD,OAAOsjC,qBAAqBh3C,KAAKigE,aACjCjgE,KAAKigE,iBAAch8D,EAEvB,E,qGCrLF,MACM6W,EAQD,IAAIvZ,IAEHq/D,EAA8B,IAAIx/D,IAExC,IAAIy/D,GAAc,EAElB,SAASC,IACJD,IAIHA,GAAc,GACd,SAAQ,KACNA,GAAc,EAMhBD,EAAU77D,QAAQg8D,GAClBH,EAAUp/C,OANW,IAEvB,CAeA,SAASw/C,EAAgB9+D,GACvB,MAAMy3B,EAAWz3B,EAAgBy3B,QACjC,GAAGA,EACD,OAAOA,IAGT,MAAM/3B,EAAOM,EAAQmkB,QAAQqmB,SAC7B,OAAG9qC,EACiB,WAEgBA,GACtB0hB,MAGPphB,EAAQsgB,wBAAwBc,KACzC,CAEA,SAASy9C,EAAY7+D,GAGnB,IAAI++D,EAASnmD,EAAI7X,IAAIf,GACrB,MAAMg/D,GAAaD,EAEnB,IAAI,KAACjtD,EAAI,WAAEkoD,EAAU,KAAE/iD,EAAI,WAAEyH,EAAU,KAAEugD,EAAI,UAAEC,EAAS,aAAEC,GAAgBJ,GAAU,CAAC,EAGrF,GAAGC,EAAW,CACZltD,EAAO9R,EAAQ0W,YACfsjD,EAAaloD,EAAKnR,OAClBsW,EAAgE,GAChEyH,EAAazH,EAAO,GAAKA,EAAO,IAEhC,IAAIszB,EAAWvqC,EAAQmkB,QAAQomB,SAC5BA,IAAaA,IAAUA,GAAY,MAEtC00B,EAAO,GAAGj/D,EAAQmkB,QAAQmT,YAAc,QAAciT,GAAY,QAAY,OAK9E20B,GAAY,OAAaptD,EAAMmtD,GAE/BE,EAAeL,EAAgB9+D,GAE/B++D,EAAS,CAACjtD,OAAMkoD,aAAY/iD,OAAMyH,aAAYugD,OAAMC,YAAWC,gBAC/DvmD,EAAIlX,IAAI1B,EAAS++D,E,CAKnB,MAAMK,EAAkBN,EAAgB9+D,GAClCq/D,EAAeL,GAAaG,IAAiBC,EAGnD,IAFCJ,GAAaK,IAAiBN,EAAOI,aAAeA,EAAeC,GAEjEC,EACD,GAAGH,EAAYC,EAAc,CAC3Bn/D,EAAQyL,aAAa,QAASqG,GAC9B,IAAIwtD,EAAcxtD,EACdytD,EAAeJ,EACnB,KAAMG,EAAY3+D,OAAS,GAAG,CAC5B,MAAM6+D,EAAoBF,EAAY3+D,OAChC8+D,EAAO/gD,IACX,OAAMA,EAAa8gD,GAAqB,EAAG,EAAGA,EAAoB,IAClEl7D,KAAKC,IAAIi7D,EAAoBvoD,EAAO,EAAG,GACnCyoD,EAAQJ,EAAYK,OAAO,EAAGF,GAAMh7C,QAAQ,OAAQ,IACpDm7C,EAAQN,EAAYK,OAAOF,EAAO,GAAGh7C,QAAQ,OAAQ,IAG3D,GAFA66C,EAAcI,EAAQE,EACtBL,GAAe,OAAaD,EA3GnB,IA2G2CL,GACjDM,EAAeJ,EAAc,CAC9Bn/D,EAAQ0W,YAAcgpD,EA7Gf,IA6GkCE,EACzC,K,EAKJb,EAAOI,aAAeL,EAAgB9+D,E,MAGtCA,EAAQ0lD,gBAAgB,QAK9B,CA3FAl0C,OAAO9F,iBAAiB,UAAU,KAChC,IAAI,MAAOpB,KAAQsO,EACjB8lD,EAAU7/D,IAAIyL,GAGhBs0D,GAAc,GACb,CAAC9rD,SAAS,EAAMiN,SAAS,IAuFrB,MAAM8/C,UAA8Bv+D,YACzCu5D,oBAGEjiD,EAAIlX,IAAI5D,KAAM,MACXA,KAAKqmB,QAAQqmB,UAAa1sC,KAAa25B,QACxConC,EAAY/gE,OAEZ4gE,EAAU7/D,IAAIf,MACd8gE,IAKJ,CAEA7yB,uBACkBnzB,EAAI7Z,OAAOjB,MAC3B4gE,EAAU3/D,OAAOjB,KAEnB,EAGFmuC,eAAeC,OAAO,0BAA2B2zB,E,6DClKlC,MAAMC,EAMnBjiE,YAAsBkiE,EAAkDp6D,GAAlD,KAAAo6D,mBAAAA,EAAkD,KAAAp6D,KAAAA,EAHjE,KAAAq6D,UAAY,EAIjBliE,KAAKoL,UAAYC,SAASC,cAAc,OACxCtL,KAAKoL,UAAUmI,UAAUxS,IAAI,wBAC/B,CAEO6B,OACL,OAAG5C,KAAK4qB,YAAoB5qB,KAAK4qB,YAC1B5qB,KAAK4qB,YAAc,yBAAkC,CAC1Dxf,UAAWpL,KAAKoL,UAChB1H,MAAM,EACNc,UAAU,EACV8e,MAAOtjB,KAAK6H,KACZ6b,OAAQ1jB,KAAK6H,KACbs6D,SAAS,GAER,4BAA4B7zD,MAAMpN,IAEnClB,KAAKS,UAAYS,EACjBlB,KAAKS,UAAUmN,iBAAiB,cAAcw0D,KAGX,IAA7BpiE,KAAKS,UAAU0gB,WAAmBihD,GAAgBpiE,KAAKkiE,YAC1B,IAA9BliE,KAAKS,UAAU0gB,WAAoBihD,GAAgBpiE,KAAKkiE,aACzDliE,KAAKS,UAAU4hE,SAAS,GACxBriE,KAAKS,UAAU8D,Q,IAInBvE,KAAKiiE,mBAAmBK,QAAQC,4BAA8B,KACzDviE,KAAKiiE,mBAAmBK,QAAQE,iBACjCxiE,KAAKS,UAAUgiE,aAAa,GAC5BziE,KAAKS,UAAUiiE,SAAW,EAC1B1iE,KAAKkiE,UAAY,GACjBliE,KAAKS,UAAUgE,SAEfzE,KAAKS,UAAUgiE,cAAc,GAC7BziE,KAAKS,UAAUiiE,SAAW,GAC1B1iE,KAAKkiE,UAAY,EACjBliE,KAAKS,UAAUgE,O,EAIZ,sBAA+BvD,KAE1C,CAEOsB,SACFxC,KAAKS,WACNT,KAAKS,UAAU+B,QAEnB,E,6DCxDa,MAAMmgE,EAWnB5iE,YAAsB+wB,EAAkCjpB,GAAlC,KAAAipB,WAAAA,EAAkC,KAAAjpB,KAAAA,EAR9C,KAAApB,IAAM,GACN,KAAAy7D,UAAY,EAQpBliE,KAAKoL,UAAYC,SAASC,cAAc,OACxCtL,KAAKoL,UAAUmI,UAAUxS,IAAI,yBAE7B,MAAMgwB,EAAQD,EAAWC,MAEzBA,EAAMnjB,iBAAiB,QAAQ,KAC7B5N,KAAK4iE,cAAc,EAAE,IAGvB7xC,EAAMnjB,iBAAiB,SAAU7F,IAC/B/H,KAAK4iE,cAAc9xC,EAAWpkB,MAAM7J,OAAO,GAM/C,CAIO+/D,cAAc//D,GACnB,IAAI7C,KAAKS,UAAW,OAGpB,IAAIoiE,GADJhgE,EAAS2D,KAAKI,IAAI/D,EAAQ,MAGxBggE,EAAQr8D,KAAKmD,MAAMnD,KAAKI,IAAI5G,KAAKyG,IAAK5D,IAAW,IAAM7C,KAAKyG,KAAO,OAEhEzG,KAAK8iE,gBACN9iE,KAAK8iE,cAAcz6D,MAAK,GACxBrI,KAAK8iE,cAAcx/D,OAAO,GAAGiI,MAAMoc,QAAU,QAG/C3nB,KAAKS,UAAU6C,OAAO,GAAGiI,MAAMoc,QAAU,IAYzCk7C,EAAQ,EAIV,MAAM1hD,EAAYnhB,KAAKkiE,UAAYW,GAAS,EAAI,EAGhD7iE,KAAKS,UAAUgiE,aAAathD,GACN,IAAnBnhB,KAAKkiE,WAA6B,IAAVW,GACzB7iE,KAAKS,UAAU4hE,SAAS,GAI1BriE,KAAKkiE,UAAYW,EAEjB7iE,KAAKS,UAAUgE,MAIjB,CAEO7B,OACL,OAAG5C,KAAK4qB,YAAoB5qB,KAAK4qB,YAC1B5qB,KAAK4qB,YAAcxJ,QAAQgI,IAAI,CACpC,yBAAkC,CAChChe,UAAWpL,KAAKoL,UAChB1H,MAAM,EACNc,UAAU,EACV8e,MAAOtjB,KAAK6H,KACZ6b,OAAQ1jB,KAAK6H,MACZ,4BAA4ByG,MAAM7N,IACnCT,KAAK8iE,cAAgBriE,EAGjBT,KAAK8wB,WAAWpkB,MAAM7J,QACxBpC,EAAUgE,OAGL,sBAA+BhE,MAGxC,yBAAkC,CAChC2K,UAAWpL,KAAKoL,UAChB1H,MAAM,EACNc,UAAU,EACV8e,MAAOtjB,KAAK6H,KACZ6b,OAAQ1jB,KAAK6H,MACZ,gCAAgCyG,MAAMpN,IACvClB,KAAKS,UAAYS,EAEblB,KAAK8wB,WAAWpkB,MAAM7J,SACxB7C,KAAKS,UAAU6C,OAAO,GAAGiI,MAAMoc,QAAU,QAG3C3nB,KAAKS,UAAUmN,iBAAiB,cAAcw0D,KAIX,IAA7BpiE,KAAKS,UAAU0gB,WAAmBihD,GAAgBpiE,KAAKkiE,YAC1B,IAA9BliE,KAAKS,UAAU0gB,WAAoBihD,GAAgBpiE,KAAKkiE,aACzDliE,KAAKS,UAAU4hE,SAAS,GACxBriE,KAAKS,UAAU8D,SAGG,IAAjB69D,GAAyC,IAAnBpiE,KAAKkiE,WAGzBliE,KAAK8iE,gBACN9iE,KAAK8iE,cAAcx/D,OAAO,GAAGiI,MAAMoc,QAAU,GAC7C3nB,KAAK8iE,cAAcr+D,OACnBzE,KAAKS,UAAU6C,OAAO,GAAGiI,MAAMoc,QAAU,O,IAMxC,sBAA+BzmB,OAG5C,CAEOsB,SACFxC,KAAKS,WAAWT,KAAKS,UAAU+B,SAC/BxC,KAAK8iE,eAAe9iE,KAAK8iE,cAActgE,QAC5C,E,8EC9IK,MAAMugE,EAKXhjE,YAAmBqL,EAA+B2lB,GAA/B,KAAA3lB,UAAAA,EAA+B,KAAA2lB,MAAAA,EAJ3C,KAAAyxC,iBAAkB,EAmClB,KAAAQ,kBAAqBj7D,KAC1B,OAAYA,GACZ/H,KAAKwiE,iBAAmBxiE,KAAKwiE,gBAE7BxiE,KAAKijE,cAAc1vD,UAAU1J,OAAO,aAAc7J,KAAKwiE,iBACtDxiE,KAAK+wB,MAA2BnvB,KAAO5B,KAAKwiE,gBAAkB,OAAS,WACxExiE,KAAKuiE,6BAA+BviE,KAAKuiE,6BAA6B,EApCtExxC,EAAMnvB,KAAO,WACbmvB,EAAMpjB,aAAa,WAAY,IAC/BojB,EAAM7Y,KAAO,qBACb6Y,EAAM8uB,aAAe,MAGrB,MAAMqjB,EAAW73D,SAASC,cAAc,SACxC43D,EAAS3vD,UAAUxS,IAAI,YACvBmiE,EAASC,UAAY,EACrBD,EAASthE,KAAO,WAChBmvB,EAAM9X,cAAcjB,QAAQkrD,GAC5BnyC,EAAM9X,cAAc1B,aAAa2rD,EAAS/5C,YAAa4H,EAAM+qC,aAS7D,MAAMmH,EAAgBjjE,KAAKijE,cAAgB53D,SAASC,cAAc,QAClE23D,EAAc1vD,UAAUxS,IAAI,iBAAkB,SAE9CqK,EAAUmI,UAAUxS,IAAI,wBACxBqK,EAAUM,OAAOu3D,GAEjBA,EAAcr1D,iBAAiB,QAAS5N,KAAKgjE,mBAC7CC,EAAcr1D,iBAAiB,WAAY5N,KAAKgjE,kBAClD,EAYa,MAAMI,UAA2B,KAG9CrjE,YAAY8tB,EAA6B,CAAC,GACxC3b,MAAM,OAAD,QACH1C,WAAW,GACRqe,IAGL7tB,KAAKsiE,QAAU,IAAIS,EAAqB/iE,KAAKoL,UAAWpL,KAAK+wB,MAC/D,E,4oBCtCa,MAAMsyC,EAkBnBtjE,YACSuwB,EACCrpB,GADD,KAAAqpB,WAAAA,EACC,KAAArpB,SAAAA,EA4SH,KAAA6J,YAAoBy9B,GAAwD,EAAD,gCAChF,MAAM+0B,EAASj4D,SAASC,cAAc,OAKtC,IAAIwtB,EAJJwqC,EAAO/vD,UAAUxS,IAAIsiE,EAAmB9mB,WAAa,UAAW,kBAAmB,QAEnFv8C,KAAKujE,QAAQ73D,OAAO43D,GAGjB/0B,IACDzV,EAA4B,iBAAd,QACN94B,KAAKiH,SAASunC,iBAAiBK,SAASN,GAC7CA,EAAQriC,OAAuD4sB,OAGpE,MAAMtO,EAAM,IAAItE,MAChBsE,EAAIjX,UAAUxS,IAAI,gBAClBypB,EAAIg5C,WAAY,EAEhB,MAAMC,EAAe,IAAW,EAAD,gCAC7B,GAAG3qC,EAAO,CACR,MAAM3H,QAAY,OAAU,CAC1B/lB,UAAWk4D,EACXxqC,QACAjxB,MAAM,EAAA2wB,EAAA,GAAgBM,EAAO,IAAK,KAAK,GACvCF,kBAAkB,IAGpB,CAACzH,EAAI+H,OAAO7pB,MAAO8hB,EAAI+H,OAAOC,MAAMC,OAAOC,SAASt0B,SAASylB,IAC3DA,EAAIjX,UAAUxS,IAAI,eAAe,G,KAE9B,CACL,MAAM+3B,QAAc94B,KAAKiH,SAASqI,gBAAgBC,aAAavP,KAAKgI,cAC9D,OAAUs7D,EAAQtjE,KAAKgI,OAAQ8wB,EAAO,YAAatO,E,CAG3D84C,EAAO/vD,UAAU/Q,OAAO,OAC1B,IAWA,OATGxC,KAAKujE,QAAQ7zC,mBAvWC,QAwWT+zC,KAENzjE,KAAK0jE,qBAAqB//D,QAAQ2/D,GAClCtjE,KAAK2jE,cAAc//D,IAAI0/D,EAAQG,IAGjCzjE,KAAK4jE,SAEEr1B,CACT,IAzVEvuC,KAAKoL,UAAYC,SAASC,cAAc,OACxCtL,KAAKoL,UAAUmI,UAAUxS,IAAIsiE,EAAmB9mB,WAAa,cAE7Dv8C,KAAKujE,QAAUl4D,SAASC,cAAc,OACtCtL,KAAKujE,QAAQhwD,UAAUxS,IAAIsiE,EAAmB9mB,WAAa,YAE3Dv8C,KAAK6jE,SAAWx4D,SAASC,cAAc,OACvCtL,KAAK6jE,SAAStwD,UAAUxS,IAAIsiE,EAAmB9mB,WAAa,aAE5Dv8C,KAAK8jE,KAAOz4D,SAASC,cAAc,OACnCtL,KAAK8jE,KAAKvwD,UAAUxS,IAAIsiE,EAAmB9mB,WAAa,SAExDv8C,KAAKmzB,KAAO9nB,SAASC,cAAc,OACnCtL,KAAKmzB,KAAK5f,UAAUxS,IAAIsiE,EAAmB9mB,WAAa,SAExDv8C,KAAK+jE,cAAgB14D,SAASC,cAAc,OAC5CtL,KAAK+jE,cAAcxwD,UAAUxS,IAAIsiE,EAAmB9mB,WAAa,SAAU,wBAM3Ev8C,KAAKgkE,UAAY34D,SAASC,cAAc,OACxCtL,KAAKgkE,UAAUzwD,UAAUxS,IAAIsiE,EAAmB9mB,WAAa,SAAU8mB,EAAmB9mB,WAAa,cAAe,oBAMtHv8C,KAAKoL,UAAUM,OAAO1L,KAAKujE,QAASvjE,KAAK6jE,SAAU7jE,KAAK8jE,KAAM9jE,KAAKmzB,KAAMnzB,KAAK+jE,cAAe/jE,KAAKgkE,WAElGhkE,KAAK2jE,cAAgB,IAAIpiE,IACzBvB,KAAK6R,eAAiB,IAAI,IAE1B,MAAMoyD,EAAiB,IACY,IAA9BjkE,KAAKswB,WAAWoG,YACjB12B,KAAKswB,WAAW4F,kBAAkB,CAChCh0B,QAASlC,KAAKswB,WAAWllB,UAAUmK,kBACnC4gB,SAAU,WAEL,GAML+tC,EAAc,EAAI,EACxB,IAAIr2B,GAAS,EACTs2B,GAAS,GACb,QAAiBnkE,KAAKoL,WAAiBg5D,GAAO,EAAD,gCAC3C,GAAGD,EAED,YADA,EAAA/pD,EAAA,GAAYgqD,GAId,GAAGv2B,EAED,YADAA,GAAS,GAIX,IAAIo2B,IACF,OAGF,MAAM1hD,EAAOviB,KAAKoL,UAAUoX,wBAItB0E,EADIk9C,EACEn4B,MAENo4B,EAASn9C,EAAI3E,EAAKI,KACxB,IAAK3iB,KAAKwI,WAAWK,SAAShG,SAAW7C,KAAKwI,WAAWoB,KAAK/G,QAC3DwhE,EAAU9hD,EAAKe,MAAQ4gD,GAAgBG,EAAU9hD,EAAKe,MAAQf,EAAKe,MAAQ4gD,EAAe,CAC3F,MAAMl8D,EAAShI,KAAKgI,OAEdmvB,EAAsF,GAC5Fn3B,KAAKwI,WAAWK,SAASkW,OAAO/e,KAAKwI,WAAWC,QAASzI,KAAKwI,WAAWoB,MAAM7E,SAAQ,CAAC/B,EAAM+F,KAC5FouB,EAAQ90B,KAAK,CACXH,QAAmBlC,KAAKujE,QAAQhuC,SAASxsB,GACzC/F,QACA,IAGJ,MAAMyS,EAAc0hB,EAAQG,MAAM,EAAGt3B,KAAKwI,WAAWK,SAAShG,QACxD6S,EAAcyhB,EAAQG,MAAMt3B,KAAKwI,WAAWK,SAAShG,OAAS,GAE9DxC,EAASL,KAAKujE,QAAQhuC,SAASv1B,KAAKwI,WAAWK,SAAShG,QAC9DshE,GAAS,GACT,OAAiB9jE,EAAQ2H,GAAQ,IAAMA,IAAWhI,KAAKgI,QAAQhI,KAAKwI,WAAWC,QAASgN,EAAaC,GACrGyuD,GAAS,C,KACJ,CACL,MACMG,EAAUp9C,EADA3E,EAAK+7B,MAAS/7B,EAAKe,MAAQ,EAQ3C,IAAI2xB,EAHJj1C,KAAKujE,QAAQhwD,UAAUxS,IAAI,iBACtBf,KAAKujE,QAAQ9/C,WAIwDwxB,EAD7C,IAA1Bj1C,KAAKwI,WAAW4lB,OAAgBk2C,EAC3BtkE,KAAKwI,WAAW4lB,QAAWpuB,KAAKwI,WAAW4oB,MAAQ,GAAMkzC,IAAsBtkE,KAAKwI,WAAW4oB,MAAQ,GAC/FkzC,EAAU,GAAK,EAFwBtkE,KAAKwI,WAAW4oB,MAAQ,EAG/EpxB,KAAKwI,WAAWU,GAAG+rC,IAEnB,SAAQ,KACNj1C,KAAKujE,QAAQhwD,UAAU/Q,OAAO,gBAAgB,G,CAIpD,KAAG,CAACqP,eAAgB7R,KAAK6R,iBAEzB,MAAM0yD,EAAkB,KACtB12B,GAAS,EACTxiC,SAASI,KAAKmC,iBAAiB,IAAqB,WAAa,SAAU7F,IACzE8lC,GAAS,CAAK,GACb,CAAC5/B,MAAM,GAAM,EAGlB,IAAIqV,EAAQ,EAAG4D,EAAI,EAAGxG,EAAY,EAAwB8jD,EAAO,EAC5CxkE,KAAKm1B,aAAe,IAAI,IAAa,CACxDjzB,QAASlC,KAAKujE,QACd3jD,QAAS,CAACC,EAAOC,KAIfY,EAHAb,IAAU,EAIV,IAAI4kD,EAAQv9C,EAAIrH,GAASwjD,EAAmBqB,MAM5C,OALGD,EAAQ,EAAGA,EAAQ,EACdA,EAAQD,IAAMC,EAAQD,GAE9BxkE,KAAKujE,QAAQh4D,MAAMsR,UAAYwmD,EAAmBsB,mBAAmBh+C,QAAQ,MAAO89C,EAAQ,OAErF,CAAK,EAEdxkD,kBAAoBlY,GACdk8D,KAIMjkE,KAAKoL,UAAUmI,UAAUqB,SAAS,eAAgBuvD,GAH1DI,KACA,EAAAnqD,EAAA,GAAYrS,IACL,GAOX8Y,aAAc,KACZ,MAAM0B,EAAOviB,KAAKujE,QAAQ/gD,wBAC1Bc,EAAQf,EAAKe,MACbkhD,GAAQlhD,GAAStjB,KAAKmzB,KAAKzD,kBAAoB,GAI/CxI,EAAI3E,EAAKI,KAAO3iB,KAAKoL,UAAUoX,wBAAwBG,KAEvD3iB,KAAKujE,QAAQh4D,MAAMsR,UAAYwmD,EAAmBsB,mBAAmBh+C,QAAQ,MAAOO,EAAI,MAExFlnB,KAAKoL,UAAUmI,UAAUxS,IAAI,cAC7Bf,KAAKujE,QAAQhwD,UAAUxS,IAAI,iBACtBf,KAAKujE,QAAQ9/C,UAAU,EAE9B3C,QAAS,KACP,MAAM8jD,EAAWp+D,KAAKgtC,KAAKhtC,KAAKuZ,IAAIW,IAAc4C,EAAQ+/C,EAAmBqB,SAAWhkD,GAAa,EAAI,GAAK,GAC9G6jD,IAIAvkE,KAAKujE,QAAQhwD,UAAU/Q,OAAO,kBAC9B,SAAQ,KACNxC,KAAKwI,WAAWU,GAAG07D,GACnB5kE,KAAKoL,UAAUmI,UAAU/Q,OAAO,aAAa,GAC7C,IAINxC,KAAK0jE,qBAAuB,IAAIxjE,sBAAsBC,IACpDA,EAAQ4E,SAAS3E,IACXA,EAAMS,gBAIVb,KAAK6kE,oBAAoBzkE,EAAMC,OAAO,GACtC,GAgBN,CAEaykE,QAAQ98D,G,yCACnBhI,KAAKgI,OAASA,EAEd,MAAM8wB,QAAc94B,KAAKiH,SAASqI,gBAAgBC,aAAavH,GAC/D,IAAI8wB,EACF,OAGF,MAAMtwB,EAA+CxI,KAAKwI,WAAa,IAAI,IAAW,CACpFoI,UAAW,GACX09B,SAAU,CAAC7F,EAAQz3B,EAAOJ,KACxB,IAAII,EAAO,OAAOoQ,QAAQjT,QAAQ,CAACijB,WAAOntB,EAAW0qB,MAAO,KAE5D,GAAG3mB,EAAOo3B,SAAU,CAClB,MAAMnO,EAA2BwX,EACjC,OAAOzoC,KAAKiH,SAASunC,iBAAiBC,cAAczmC,EAAQipB,EAAOrgB,GAAWtC,MAAM5B,IAC3E,CACL0kB,MAAO1kB,EAAM0kB,MACbzC,MAAOjiB,EAAMgiC,U,CAGZ,CACL,MAAMrW,EAAwF,GAe9F,OAdI7vB,EAAWC,SACb4vB,EAASh2B,KAAKrC,KAAKiH,SAASw5B,kBAAkBE,YAAY34B,EAAOs1B,aAGnEjF,EAASh2B,KAAKrC,KAAKiH,SAAS8G,mBAAmBszB,UAAU,CACvDr5B,SACAipB,MAAOle,OAAOC,iBACdZ,YAAa,CACXxC,EAAG,iCAELshB,MAAOtgB,EACPm0D,UAAW,KAGN3jD,QAAQgI,IAAIiP,GAAU/pB,MAAWw7B,GAAW,EAAD,gCAChD,MAAMp9B,EAAQo9B,EAAOrkB,MAIrB,IAFA,EAAAu/C,EAAA,GAAyBt4D,IAErBlE,EAAWC,QAAS,CACtB,MAAMm4B,EAAWkJ,EAAO,GAClB3hC,GAAU,EAAAi6B,EAAA,GAAc11B,EAAMohB,SAAU3lB,GACnCA,EAAmC+D,OAAuD4sB,MAAMlxB,KAAOg5B,EAASqkC,WAAWr9D,KAGtIY,EAAWC,QAAUN,UAAiBnI,KAAKiH,SAAS8G,mBAAmBm3D,0BAA0BllE,KAAKgI,OAAQ44B,EAASqkC,Y,CAIzH,MAAO,CACL7zC,MAAO1kB,EAAM0kB,MACbzC,MAAOjiB,EAAMohB,QAEjB,K,GAGJhd,YAAa9Q,KAAK8Q,YAClBC,OAAQ,CAAC/N,EAAMgO,KACb,MAAMpJ,EAAK5H,KAAKwI,WAAW4lB,MAErBlH,EAAI,IAAMm8C,EAAmBqB,MAAQ98D,EAC3C5H,KAAKujE,QAAQh4D,MAAMsR,UAAYwmD,EAAmBsB,mBAAmBh+C,QAAQ,MAAO,IAAIO,MAExF,MAAMi+C,EAAYnlE,KAAKmzB,KAAKvb,cAAc,WACvCutD,GAAWA,EAAU5xD,UAAU/Q,OAAO,UAE7BxC,KAAKmzB,KAAKoC,SAAS3tB,GAC3B2L,UAAUxS,IAAI,UAElBf,KAAK6kE,oBAAoB7kE,KAAKujE,QAAQhuC,SAAS3tB,GAAI,IAIxC,qBAAZkxB,EAAMlpB,IACPpH,EAAWC,QAAUqwB,EAAMssC,gBAGvBplE,KAAK8Q,YAAYtI,EAAWC,SAGlCD,EAAW5F,MAAK,EAClB,G,CAEOghE,SACL,MAAM1wD,EAAM7H,SAASC,cAAc,OACnC4H,EAAIK,UAAUxS,IAAIsiE,EAAmB9mB,WAAa,QAClDv8C,KAAKmzB,KAAKznB,OAAOwH,GAEkB,IAAhClT,KAAKmzB,KAAKzD,mBACXxc,EAAIK,UAAUxS,IAAI,UAGpBf,KAAKoL,UAAUmI,UAAU1J,OAAO,YAAa7J,KAAKmzB,KAAKzD,mBAAqB,EAC9E,CAmDQm1C,oBAAoBxkE,GAC1B,MAAMk1B,EAAWrc,MAAMC,KAAK9Y,EAAO4Y,cAAcsc,UAC3CxsB,EAAMwsB,EAASpb,QAAQ9Z,GACfk1B,EAAS+B,MAAM9wB,KAAKC,IAAI,EAAGsC,EAtXxB,GAsX6CvC,KAAKI,IAAI2uB,EAAS1yB,OAAQkG,EAtXvE,IAwXXhE,SAAS1E,IACb,MAAMkyB,EAAWvyB,KAAK2jE,cAAc1gE,IAAI5C,GACrCkyB,IACDA,IACAvyB,KAAK2jE,cAAc1iE,OAAOZ,GAC1BL,KAAK0jE,qBAAqB5gE,UAAUzC,G,GAG1C,CAEOqb,U,MACL1b,KAAK6R,eAAeC,YACpB9R,KAAKm1B,aAAaxZ,kBACO,QAAzB,EAAA3b,KAAK0jE,4BAAoB,SAAEtN,YAC7B,EAnYe,EAAA7Z,WAAa,kBACb,EAAAmoB,MAAQ,IAAwB,EAAI,EACpC,EAAAC,mBAAqB,IAAwB,mCAAmCtB,EAAmBqB,SAAW,oB,sWCQ/H,MAAMW,EAAU,CAACrxD,EAA0CmnB,MAEzD,EAAAV,EAAA,GAAaU,EAAIpsB,MAAOiF,GAAQ,IAChCmnB,EAAI/vB,UAAUG,MAAMoc,QAAU3T,EAAO,GAAK,MAAM,EAInC,MAAMsxD,EAuBnBvlE,YACUkH,EACDqpB,EACCze,EACA41B,GAAW,GAHX,KAAAxgC,SAAAA,EACD,KAAAqpB,WAAAA,EACC,KAAAze,eAAAA,EACA,KAAA41B,SAAAA,EAEJ,KACFznC,KAAKswB,WAAWllB,UAAUmI,UAAUxS,IAAI,eAGtC8Q,IACF7R,KAAK6R,eAAiB,IAAI,KAG5B7R,KAAKyvC,kBAAmB,QAC1B,CAEOjd,OACLxyB,KAAKwyB,KAAO,KAGZxyB,KAAKkC,QAAUmJ,SAASC,cAAc,OACtCtL,KAAKkC,QAAQqR,UAAUxS,IAAI,mBAE3Bf,KAAKolC,QAAU,IAAI,IAAe,CAChCmgC,aAAa,IAGfvlE,KAAKkY,KAAO7M,SAASC,cAAc,OACnCtL,KAAKkY,KAAK3E,UAAUxS,IAAI,gBAExBf,KAAKq7B,SAAWhwB,SAASC,cAAc,OACvCtL,KAAKq7B,SAAS9nB,UAAUxS,IAAI,oBAE5Bf,KAAKwlE,IAAM,IAAI,KAAI,CACjBz2D,MAAO,IACPssB,UAAU,EACVtnB,KAAM,OACNqb,UAAYrnB,IAC+B,MAArCA,EAAE1H,OAAuB6c,WAI7B,OAAoBld,KAAKwlE,IAAIz2D,MAAM6J,cACnC,EAAAuT,EAAA,IAAM,YAAY,aAAa,IAAM,EAEvCta,eAAgB7R,KAAK6R,eACrB4zD,YAAa,CACX5xD,QAAS,CAAC,CACRE,KAAM,OACNC,KAAM,uBACNC,QAAS,MACP,QAAmBjU,KAAKwlE,IAAIp6D,UAAU,EAExC7C,OAAQ,KAAOvI,KAAKgI,OAAOo3B,UAC1B,CACDrrB,KAAM,OACNC,KAAM,qBACNC,QAAS,MACP,QAAmBjU,KAAKwlE,IAAIp6D,UAAU,EAExC7C,OAAQ,IAAMvI,KAAKgI,OAAOo3B,cAKhCp/B,KAAKwlE,IAAIz2D,MAAMwE,UAAUxS,IAAI,YAE7Bf,KAAKu9B,SAAW,IAAI,KAAI,CACtBxuB,MAAO,IACP22D,gBAAiB,WACjB3xD,KAAM,WACNqb,UAAW,MAET,OAAoB,IAAMpvB,KAAKu9B,SAASxuB,MAAM6J,cAC9C,EAAAuT,EAAA,IAAM,YAAY,kBAAkB,GAAM,EAE5Cta,eAAgB7R,KAAK6R,eACrB4zD,YAAa,CACX5xD,QAAS,CAAC,CACRE,KAAM,OACNC,KAAM,0BACNC,QAAS,MACP,QAAmBjU,KAAKu9B,SAASnyB,UAAU,OAMnDpL,KAAK49B,MAAQ,IAAI,KAAI,CACnB7uB,MAAO,IACPssB,UAAU,EACVtnB,KAAM,QACNqb,UAAW,MACT,OAAoBpvB,KAAK49B,MAAM7uB,MAAM6J,YAAY+N,QAAQ,MAAO,MAChE,EAAAwF,EAAA,IAAM,YAAY,eAAe,GAAM,EAEzCta,eAAgB7R,KAAK6R,eACrB4zD,YAAa,CACX5xD,QAAS,CAAC,CACRE,KAAM,OACNC,KAAM,6BACNC,QAAS,MACP,QAAmBjU,KAAK49B,MAAMxyB,UAAU,GAEzC,CACD2I,KAAM,OACNC,KAAM,+BACNg9B,SAAU,CACE3lC,SAASC,cAAc,MAGnC2I,QAAS,KACPP,OAAO0X,KAAK,+BAAgC,SAAS,EAEvDwlB,WAAW,EACXkB,WAAW,EACXvpC,OAAQ,IAAW,kCACjB,MAAM,YAACo9D,UAAqB3lE,KAAKiH,SAASy2B,gBAAgBkoC,aAAa5lE,KAAKgI,OAAOs3B,cAAe,CAAC,EACnG,OAAOqmC,CACT,SAKN3lE,KAAK6lE,KAAO,IAAI,KAAI,CAClB92D,MAAO,IACP22D,gBAAiB,oBACjB3xD,KAAM,OACNqb,UAAW,KACT,MAAM1nB,EAAM1H,KAAK6lE,KAAK92D,MAAM6J,aAC5B,OAAoBlR,GAGpB,MAAMm1C,EAAYn1C,EAAIqN,SAAS,QAC/B,EAAAoX,EAAA,IAAM,YAAY0wB,EAAY,wBAA0B,cAAc,GAAM,EAG9EhrC,eAAgB7R,KAAK6R,eACrB4zD,YAAa,CACX5xD,QAAS,CAAC,CACRE,KAAM,OACNC,KAAM,2BACNC,QAAS,MACP,QAAmBjU,KAAK6lE,KAAKz6D,UAAU,OAM/CpL,KAAK6sB,SAAW,IAAI,KAAI,CACtB9d,MAAO,IACP22D,gBAAiB,eACjB3xD,KAAM,aAGR/T,KAAKolC,QAAQzyB,QAAQjH,OACnB1L,KAAK49B,MAAMxyB,UACXpL,KAAKu9B,SAASnyB,UACdpL,KAAK6sB,SAASzhB,UACdpL,KAAKwlE,IAAIp6D,UACTpL,KAAK6lE,KAAKz6D,WAGZ,MAAM,eAACyG,GAAkB7R,KACtBA,KAAKynC,WACNznC,KAAK8lE,cAAgB,IAAI,KAAI,CAC3Bv+B,cAAe,IAAI,IAAc,CAAC19B,QAAQ,IAC1CotD,aAAc,gBACdljD,KAAM,SACNlC,eAAgB7R,KAAK6R,iBAGvBA,EAAe9Q,IAAIf,KAAK8lE,cAAcv+B,cAAcxW,MAApDlf,CAA2D,UAAW9J,IAChEA,EAAE0B,WAKNzJ,KAAKiH,SAAS8G,mBAAmBg4D,eAAe,CAAC/9D,OAAQhI,KAAKgI,OAAQiL,SAAUjT,KAAKiT,UAAU,IAGjGpB,EAAe9Q,IAAIkd,EAAA,EAAnBpM,CAA8B,0BAAgCkX,GAAW,kCACvE,GAAG/oB,KAAKgI,SAAW+gB,EAAO/gB,OAAQ,CAChC,MAAM+E,QAAc/M,KAAKiH,SAAS++D,wBAAwBC,iBAAiB,CAACj+D,OAAQhI,KAAKgI,OAAQk+D,aAAa,EAAOjzD,SAAUjT,KAAKiT,WACpIjT,KAAK8lE,cAAcv+B,cAAc3B,SAAW74B,C,CAEhD,MAEA/M,KAAKolC,QAAQzyB,QAAQjH,OAAO1L,KAAK8lE,cAAc16D,YAGjDpL,KAAKkC,QAAQwJ,OAAO1L,KAAKolC,QAAQh6B,WAE9B,KACDpL,KAAKkC,QAAQwJ,QAAO,EAAA2sD,EAAA,MAGtBxmD,EAAe9Q,IAAIkd,EAAA,EAAnBpM,CAA8B,gBAAgB,EAAE7J,aAC3ChI,KAAKgI,SAAWA,GACjBhI,KAAKmmE,e,IAITt0D,EAAe9Q,IAAIkd,EAAA,EAAnBpM,CAA8B,iBAAkB7J,IAC3CA,IAAWhI,KAAKgI,QACjBhI,KAAKomE,gBAAe,E,IAIxB,MAAMC,EAAI,EAAOr+D,SAAQiL,cAAmD,kCAC1E,OAAGjT,KAAKgI,SAAWA,YAIGhI,KAAKiH,SAASqI,gBAAgB8zB,QAAQpjC,KAAKgI,WACnDhI,KAAKiT,UAAWjT,KAAKiT,WAAaA,EAKlD,IAEApB,EAAe9Q,IAAIkd,EAAA,EAAnBpM,CAA8B,mBAAyBs9B,GAAS,yCACrDk3B,EAAEl3B,MACTnvC,KAAKsmE,eACLtmE,KAAKomE,gBAAe,GAExB,MAEAv0D,EAAe9Q,IAAIkd,EAAA,EAAnBpM,CAA8B,eAAgB00D,IACzCvmE,KAAKgI,SAAWu+D,EAAO3zC,YACxB5yB,KAAKmmE,e,IAITt0D,EAAe9Q,IAAIkd,EAAA,EAAnBpM,CAA8B,mBAAyB00D,GAAW,kCAC7DvmE,KAAKgI,SAAWu+D,EAAO3zC,oBACL5yB,KAAKiH,SAASy2B,gBAAgBC,QAAQ4oC,IAChD94D,OAAO+4D,MAASxmE,KAAKynC,UAC5BznC,KAAKymE,gBAGX,MAEA50D,EAAe9Q,IAAIkd,EAAA,EAAnBpM,CAA8B,iBAAuBs9B,GAAS,yCACnDk3B,EAAEl3B,KACTnvC,KAAK0mE,WAET,MAEA1mE,KAAK2mE,sBAAwBjzD,OAAOkzD,aAAY,IAAM5mE,KAAKmmE,iBAAiB,IAC9E,CAEcA,cACZU,GAAY,EACZt5C,G,yCAEA,MAAMvlB,EAAShI,KAAKgI,OAEd8+D,EAA+B,GACrCA,EAAUzkE,MAAK,KACbrC,KAAKkC,QAAQqR,UAAU1J,OAAO,QAAS7B,IAAWiW,EAAA,OAAe,IAGnE,IAAI1P,EAAwC6S,QAAQjT,UACpD,GAAMnG,IAAWiW,EAAA,SAAmBjW,IAAUhI,KAAKynC,UAAY,CAC7D,MAAMrE,QAAgBpjC,KAAKiH,SAASqI,gBAAgB8zB,QAAQpjC,KAAKgI,QAC3DqrB,EAAarzB,KAAKyvC,iBAAiBxsC,MAEvCsL,EADC60B,GAAWpjC,KAAKiT,UACP,OAAoB,CAC5BjL,SACA+nC,YAAa,CACX1c,gBAED/kB,MAAK,EAAEpM,cACRlC,KAAKq7B,SAAS6D,gBAAgBh9B,EAAQ,IAG9B2vB,EAAA,iBAA2B,CACnC7pB,SACA9F,QAASlC,KAAKq7B,SACdwrC,YACAE,eAAe,EACf1zC,aACA2zC,YAAahnE,KAAKynC,WAItBl5B,EAAQD,MAAMikB,GAAaA,GAAYu0C,EAAUzkE,KAAKkwB,I,CAGxD,MAAMA,EAAW,IAAMu0C,EAAU/hE,SAASwtB,GAAaA,MAEvD,OAAOhkB,EAAQD,MAAK,KAClB,GAAGif,EACD,OAAOgF,EAGTA,GAAU,GAEd,G,CAEO+Q,cACL,CACEtjC,KAAKwlE,IACLxlE,KAAK49B,MACL59B,KAAKu9B,SACLv9B,KAAK6sB,SACL7sB,KAAK6lE,MACL9gE,SAASo2B,IACTA,EAAI/vB,UAAUG,MAAMoc,QAAU,MAAM,IAGnC3nB,KAAK8lE,gBACN9lE,KAAK8lE,cAAc16D,UAAUG,MAAMoc,QAAU,GAC7C3nB,KAAK8lE,cAAcv+B,cAAc3B,SAAU,GAG7C5lC,KAAKinE,4BACP,CAEQC,gBACN,OAAOlnE,KAAKgI,SAAWiW,EAAA,SAAmBje,KAAKynC,QACjD,CAEQ0/B,eACN,MAAM7D,EAAS,IAAI,IAInB,OAHAA,EAAO/vD,UAAUxS,IAAI,iBAAkB,cACvCuiE,EAAO77B,SAAWznC,KAAKynC,SACvB67B,EAAO5zB,mBACA4zB,CACT,CAEc8D,a,yCACZ,MAAM,OAACp/D,GAAUhI,KACXqnE,KAAarnE,KAAKiT,kBAAkBjT,KAAKiH,SAASqI,gBAAgB8zB,QAAQp7B,KAChF,GAAGhI,KAAKknE,kBAAoBG,UACNrnE,KAAKiH,SAASqI,gBAAgBC,aAAavH,IAErD,CACR,MAAMs/D,EAAatnE,KAAKujE,QAIxB,OAHAvjE,KAAKujE,QAAU,IAAIF,EAAmBrjE,KAAKswB,WAAYtwB,KAAKiH,gBACtDjH,KAAKujE,QAAQuB,QAAQ98D,GAEpB,K,MACLhI,KAAKujE,QAAQO,KAAKp4D,OAAO1L,KAAKkY,KAAMlY,KAAKq7B,UAE9B,QAAX,EAAAr7B,KAAKsjE,cAAM,SAAE9gE,SACbxC,KAAKsjE,YAASr/D,EAEXqjE,EAAYA,EAAWl8D,UAAUoe,YAAYxpB,KAAKujE,QAAQn4D,WACxDpL,KAAKkC,QAAQ8V,QAAQhY,KAAKujE,QAAQn4D,WAEpC,KACDpL,KAAKswB,WAAWllB,UAAUmI,UAAUxS,IAAI,W,EAMhD,MAAMuiE,EAAStjE,KAAKmnE,eAUpB,aATM7D,EAAOj6C,kBAAkB,CAC7BrhB,SACAiL,SAAUo0D,EAAUrnE,KAAKiT,cAAWhP,EACpC8rC,YAAa,CACXkjB,iBAAiB,OAAc,IAAK,KACpC5/B,WAAYrzB,KAAKyvC,iBAAiBxsC,SAI/B,K,MACF,KACDjD,KAAKswB,WAAWllB,UAAUmI,UAAU/Q,OAAO,YAG1CxC,KAAKujE,UACNvjE,KAAKujE,QAAQn4D,UAAU5I,SACvBxC,KAAKujE,QAAQ7nD,UACb1b,KAAKujE,aAAUt/D,GAGN,QAAX,EAAAjE,KAAKsjE,cAAM,SAAE9gE,SACbxC,KAAKsjE,OAASA,EAEdtjE,KAAKolC,QAAQzyB,QAAQqF,QAAQhY,KAAKsjE,OAAQtjE,KAAKkY,KAAMlY,KAAKq7B,SAAS,CAEvE,G,CAEQqrC,UAA6Bn5C,GACnC,MAAMhf,EAAUvO,KAAKonE,aACrB,OAAO75C,EAAShf,EAAUA,EAAQD,MAAMikB,GAAaA,KACvD,CAEQg1C,iBAAiBC,GACvB,MAAMC,EAAOD,EAAUlwC,MAAM,GAC7B,GAAGmwC,EAAK5kE,OAAQ,CACd,MAAM4R,EAAIgzD,EAAK3sD,KAAKyiB,IAAa,EAAAmqC,EAAA,GAAW,CAACnqC,eAE7C,OADU,QAAK,eAAgB,EAAC,QAAK9oB,GAAG,I,CAG5C,CAEc6xD,e,yCACZ,MAAM,OAACt+D,GAAUhI,KACjB,GAAGgI,EAAOo3B,UAAYp/B,KAAKknE,gBAAiB,CAC1C,MAAMM,QAAkBxnE,KAAKiH,SAASqI,gBAAgBq4D,uBAAuB3/D,GACvEy/D,EAAOznE,KAAKunE,iBAAiBC,GAEnC,MAAO,KACLxnE,KAAKu9B,SAASlC,SAAS6D,gBAAgBuoC,IAAQ,QAAK,aACpDpC,EAAQmC,EAAU,GAAIxnE,KAAKu9B,SAAS,C,CAG1C,G,CAEckpC,gB,yCACZ,MAAM,OAACz+D,GAAUhI,KACjB,GAAGgI,EAAOo3B,UAAYp/B,KAAKknE,gBAAiB,CAC1C,MAAM,MAACtpC,EAAK,YAAE+nC,UAAqB3lE,KAAKiH,SAASy2B,gBAAgBkoC,aAAa59D,EAAOs3B,cAAe,CAAC,EAErG,MAAO,KACLt/B,KAAK49B,MAAMvC,SAAS6D,iBAAgB,QAAKymC,EAAc,kBAAoB,UAC3EN,EAAQznC,GAAQ,EAAAgqC,EAAA,GAAgBhqC,QAAS35B,EAAWjE,KAAK49B,MAAM,C,CAGrE,G,CAEciqC,oB,yCACZ,MAAMC,EAAmB9nE,KAAK8lE,cAC9B,GAAIgC,EAAJ,CAIA,GAAG9nE,KAAKknE,gBAAiB,CACvB,MAAMn6D,QAAc/M,KAAKiH,SAAS++D,wBAAwBC,iBAAiB,CAACj+D,OAAQhI,KAAKgI,OAAQk+D,aAAa,EAAOjzD,SAAUjT,KAAKiT,WACpI,MAAO,KACL60D,EAAiBvgC,cAAc3B,SAAW74B,CAAK,C,CAGjD,MAAO,KAEL+6D,EAAiB18D,UAAUG,MAAMoc,QAAU,MAAM,C,CAIvD,G,CAEcogD,W,yCACZ,MAAM,OAAC//D,GAAUhI,MACVkC,SAA8Bkf,QAAQgI,IAAI,EAC/C,OAAc,CACZphB,SACA+gB,OAAQ/oB,KAAKynC,SACbugC,WAAYhoE,KAAKiT,SACjBA,SAAUjT,KAAKiT,aAMnB,MAAO,MACL,EAAAsW,EAAA,GAAevpB,KAAKkY,KAAMhW,EAAQ,CAGtC,G,CAEc+lE,SAAS16C,G,yCACrB,OAAOnM,QAAQgI,IAAI,CACjBppB,KAAK+nE,WACL/nE,KAAKsmE,eACLtmE,KAAKymE,gBACLzmE,KAAK6nE,oBACL7nE,KAAKomE,oBAAeniE,EAAWspB,GAC/BvtB,KAAKmmE,eAAc,GAAM,KACxB73D,MAAMw4D,GACA,KACLA,EAAU/hE,SAASwtB,GAAaA,aAAQ,EAARA,KAAa,GAGnD,G,CAEa21C,sB,yCACX,IAAIloE,KAAKmoE,QAAS,OAClBnoE,KAAKmoE,SAAU,EAEfnoE,KAAKsjC,cACL,MAAMp1B,GAAW,SACElO,KAAKyvC,iBAAiBxsC,MAC9BQ,SAAQ,KACjByK,EAASmT,QAAQ,IAGnB,MAAMylD,QAAkB1lD,QAAQgI,IAAI,CAClCppB,KAAK0mE,WAAU,GACf1mE,KAAKioE,SAAS/5D,KAGhB,MAAO,KACLA,EAASC,UACT24D,EAAU/hE,SAASwtB,GAAaA,aAAQ,EAARA,KAAa,CAEjD,G,CAEc61C,gBAAgBpgE,EAAgBqgE,G,yCAC5C,MAAMlnC,EAAInhC,KAAKsoE,uBAEf,GADmBtoE,KAAKiT,iBAAkBkuB,EAAEnhC,KAAKiH,SAASqI,gBAAgB8zB,QAAQp7B,KACtE,CACV,IAAIN,EAAM,gBACV,MAAMuL,GAAW,EAAAs1D,EAAA,GAAmBvoE,KAAKiT,UACnCsqB,QAAiB4D,EAAEnhC,KAAKiH,SAASqI,gBAAgBkuB,gBAAgBx1B,IAOvE,OALEN,GADC61B,EACM,GAAGA,KAAYtqB,IAEf,KAAKjL,EAAOs1B,cAAcrqB,IAG5B,KACLoyD,EAAQ39D,EAAK1H,KAAK6lE,KAAK,C,CAI3B,MAAMiB,EAA4B,GAQlC,GANAA,EAAUzkE,MAAK,KACbrC,KAAKwlE,IAAInqC,SAAS6D,iBAAgB,QAAKl3B,EAAOo3B,SAAW,UAAY,SACrEimC,EAAQgD,EAASG,OAAQ,EAAA3tC,EAAA,IAAawtC,EAASG,YAASvkE,EAAWjE,KAAKwlE,IAAI,KAI1Ex9D,EAAOo3B,SAAU,CACnB,MAAM4d,QAAa7b,EAAEnhC,KAAKiH,SAASq5B,gBAAgBmoC,QAAQzgE,EAAOs1B,aAC5DkqC,GAAY,EAAAG,EAAA,GAAuB3qB,GACzC,IAAIyqB,EACJ,GAAGD,EAAU3kE,OACX4kE,EAAOznE,KAAKunE,iBAAiBC,GAC7BV,EAAUzkE,MAAK,IAAMgjE,EAAQ,gBAAkBmC,EAAU,GAAIxnE,KAAK6lE,YAC7D,CACL,MAAM6C,EAAkBL,EAAkCM,gBACjC,wBAAtBD,aAAc,EAAdA,EAAgB94D,IACjBk3D,EAAUzkE,MAAK,IAAMgjE,EAAQqD,EAAe7C,KAAM7lE,KAAK6lE,O,CAI3DiB,EAAUzkE,MAAK,IAAMrC,KAAK6lE,KAAKxqC,SAAS6D,gBAAgBuoC,IAAQ,QAAK,uB,CAGvE,MAAM56C,EAAYw7C,EAAkCx7C,SAOpD,MANkB,oBAAfA,aAAQ,EAARA,EAAUjd,IACXk3D,EAAUzkE,MAAK,IAAMgjE,EAAQx4C,EAAS+7C,QAAS5oE,KAAK6sB,YAGtD7sB,KAAK6oE,sBAAwBn1D,OAAOhR,YAAW,IAAM1C,KAAKomE,gBAAe,IAAO,KAEzE,KACLU,EAAU/hE,SAASwtB,GAAaA,KAAW,CAE/C,G,CAEc6zC,eAAepkE,EAAiBurB,G,yCAC5CvtB,KAAKinE,6BAEL,MAAM,OAACj/D,GAAUhI,KACXmhC,EAAInhC,KAAKsoE,uBAEf,IAAItgE,IAAWhI,KAAKknE,wBAAyB/lC,EAAEnhC,KAAKiH,SAASqI,gBAAgBw5D,iBAAiB9gE,KAC5F,OAGF,MAAM8hC,QAAe3I,EAAEnhC,KAAKiH,SAAS8hE,aAAatoC,kBAAkBuoC,mBAAmBhhE,EAAQhG,IACzFinE,EAAa9nC,EAAE2I,EAAOA,QAAQx7B,MAAW+5D,GAAa,kCAC1D,WAASlnC,EAAEnhC,KAAKiH,SAASqI,gBAAgBw5D,iBAAiB9gE,KAK1D,aAAam5B,EAAEnhC,KAAKooE,gBAAgBpgE,EAAQqgE,GAC9C,MAEA,GAAGv+B,EAAOo/B,QAAU37C,EAClB,OAAO07C,GAEN17C,GAAUnM,QAAQjT,WAClBG,MAAK,IAAM26D,IACX36D,MAAMikB,IACLA,SAAAA,GAAY,GAGlB,G,CAEQ+1C,uBACN,OAAO,EAAAa,EAAA,GAAkBnpE,KAAKyvC,iBAAiBxsC,OAAO,EAAAmmE,EAAA,GAAU,cAClE,CAEOtE,QAAQ98D,EAAgBiL,G,MAC1BjT,KAAKgI,SAAWA,GAAUhI,KAAKiT,WAAaA,IAEtC,QAAT,EAAAjT,KAAKwyB,YAAI,oBAETxyB,KAAKgI,OAASA,EACdhI,KAAKiT,SAAWA,EAEhBjT,KAAKyvC,iBAAiB3lC,QACtB9J,KAAKmoE,SAAU,EACjB,CAEOlB,kCAC6BhjE,IAA/BjE,KAAK6oE,wBACNp1D,aAAazT,KAAK6oE,uBAClB7oE,KAAK6oE,2BAAwB5kE,EAEjC,CAEOF,U,MACL/D,KAAKgI,OAAShI,KAAKiT,cAAWhP,EAC9BjE,KAAKinE,6BACLoC,cAAcrpE,KAAK2mE,uBACP,QAAZ,EAAA3mE,KAAKujE,eAAO,SAAE7nD,UACd1b,KAAKyvC,iBAAiB1rC,SACxB,E,uKChqBa,SAAeulE,EAC5BthE,EACAqrB,EACAk2C,EACAC,EACAC,G,qCAEA,MAAMjkD,EAA0B,GAC1BmX,QAA0B1e,EAAA,mCAA2CjW,GAS3E,GARI20B,EAAsBlvB,OAAOi8D,WAAaH,GAC5C/jD,EAASnjB,KCzBE,WACb,MAAM0yB,EAAO1pB,SAASC,cAAc,QACpCypB,EAAKxhB,UAAUxS,IAAI,gBAAiB,SAEpC,MACMupC,EAAMj/B,SAASmb,gBAAgB,6BAA8B,OACnE8jB,EAAI7jB,eAAe,KAAM,UAAW,aACpC6jB,EAAI7jB,eAAe,KAAM,QAAS,MAClC6jB,EAAI7jB,eAAe,KAAM,SAAU,MACnC6jB,EAAI/2B,UAAUxS,IAAI,qBAElB,MAAM+lB,EAAMzb,SAASmb,gBAAgB,6BAA8B,OACnEM,EAAIL,eAAe,KAAM,OAAQ,6BACjCK,EAAIvT,UAAUxS,IAAI,4BAElB,MAAM4oE,EAAOt+D,SAASmb,gBAAgB,6BAA8B,OASpE,OARAmjD,EAAKljD,eAAe,KAAM,OAAQ,wBAClCkjD,EAAKp2D,UAAUxS,IAAI,uBAGnBupC,EAAI5+B,OAAOi+D,EAAM7iD,GAEjBiO,EAAKrpB,OAAO4+B,GAELvV,CAIT,CDHkB60C,KAGXjtC,EAAsBlvB,OAAOo8D,OAASltC,EAAmBlvB,OAAOq8D,MAAUN,GAC7EhkD,EAASnjB,MAAK,EAAAk2D,EAAA,GAAkB57B,EAAmBlvB,OAAOq8D,OAGxDntC,EAAmBlvB,OAAOs8D,UAAYN,EAAe,CACvD,MAAMO,EAAertC,EAAmBstC,aACrCD,GAAeA,EAAYp6D,EA8B5B4V,EAASnjB,KEhEA,WACb,MAAM0yB,EAAO1pB,SAASC,cAAc,QAEpC,OADAypB,EAAKxhB,UAAUxS,IAAI,eAAgB,cAC5Bg0B,CACT,CF4DoBm1C,G,CAIlB,OAAO1kD,CACT,E,6SGtCA,MAAM2kD,EAA2C,IAAIC,QAErDnsD,EAAA,mBAA2B,mBAAmB,EAAEjW,SAAQiL,eACtD,IAAImd,EAAQ,6BAA6BpoB,MACtCiL,IACDmd,GAAS,oBAAoBnd,OAGdiG,MAAMC,KAAK9N,SAASoN,iBAAiB2X,IAC7CrrB,SAAS7C,IAChB,MAAMonB,EAAY6gD,EAAQlnE,IAAIf,GAC9BonB,SAAAA,EAAWmV,QAAQ,GACnB,IAGW,MAAM4rC,EAKnBtqE,YAAY8tB,GACV7tB,KAAKkC,QAAUmJ,SAASC,cAAc,QACtCtL,KAAKkC,QAAQqR,UAAUxS,IAAI,eAC3B,OAAaf,KAAKkC,SAElBlC,KAAK6tB,QAAU,CAAC,EAEbA,GACD7tB,KAAKy+B,OAAO5Q,GAGds8C,EAAQvmE,IAAI5D,KAAKkC,QAASlC,KAC5B,CAEOsqE,WAAWz8C,GAChB,GAAIA,EAAJ,EAIA,EAAAyG,EAAA,GAAWt0B,KAAK6tB,QAASA,GACzB,IAAI,MAAMzJ,KAAKyJ,EAAS,CAEtB,MAAMnhB,EAAQmhB,EAAQzJ,GAED,iBAAZ,GAA0C,mBAAZ,IAErCpkB,KAAKkC,QAAQmkB,QAAQjC,GAAK1X,EAAQ,IAAwB,kBAAZ,GAAyBA,EAAQA,GAAS,I,EAG9F,CAEQ69D,YAAYC,GACfxqE,KAAKwqE,WAAaA,IACnBxqE,KAAKwqE,SAAWA,EAChBxqE,KAAKkC,QAAQqR,UAAU1J,OAAO,aAAc2gE,GAEhD,CAEa/rC,OAAO5Q,G,yDAClB7tB,KAAKsqE,WAAWz8C,GAEhB,IAYI28C,EAZAC,EAAWzqE,KAAK6tB,QAAQ48C,SAC5B,QAAgBxmE,IAAbwmE,EAMD,YALiCxmE,IAA9BjE,KAAK6tB,QAAQ68C,eACdD,GAAW,EAAAC,EAAA,GAAaD,EAAUzqE,KAAK6tB,QAAQ68C,aAAc1qE,KAAK6tB,QAAQ68C,oBAG5E,EAAAjwC,EAAA,GAAaz6B,KAAKkC,SAAS,EAAA8mB,EAAA,GAAcyhD,IAIxB,QAAnB,KAAAzqE,KAAK6tB,SAAQ7lB,cAAM,UAANA,OAAW,MAGxB,MAAM,OAACA,EAAM,SAAEiL,GAAYjT,KAAK6tB,QAChC,GAAG7lB,IAAWiW,EAAA,QAAmBje,KAAK6tB,QAAQ9E,QAoD5C,EAAAQ,EAAA,GAAevpB,KAAKkC,SAAS,QAAKlC,KAAK6tB,QAAQpe,cAAgB,QAAU,sBApDrB,CACpD,GAAGwD,EAAU,CACX,MAAO03D,EAAOvnC,SAAiBhiB,QAAQgI,IAAI,CACzCnL,EAAA,wCAAgDjW,EAAQiL,GACxDgL,EAAA,mCAA2CjW,KAG7C,IAAI2iE,GAASvnC,EAkBX,OAjBAnlB,EAAA,4CAAoDjW,EAAQiL,GAAU3E,MAAMs8D,IAC1E,IAAIA,GAAc5qE,KAAK6tB,QAAQ5a,WAAaA,EAG1C,OAFAjT,KAAK6tB,QAAQ5a,cAAWhP,OACxBjE,KAAKy+B,OAAO,CAACxrB,cAAUhP,IAIzBjE,KAAKy+B,QAAQ,IACZ,KACEz+B,KAAK6tB,QAAQ5a,WAAaA,IAC3BjT,KAAK6tB,QAAQ5a,cAAWhP,EACxBjE,KAAKy+B,OAAO,CAACxrB,cAAUhP,I,KAI3B,EAAAw2B,EAAA,GAAaz6B,KAAKkC,SAAS,QAAK,iBAChClC,KAAKuqE,aAAY,E,CAKrB,MAAMM,EAAsB53D,GAAYjT,KAAK6tB,QAAQm6C,UACnD/pD,EAAA,wCAAgDjW,EAAQiL,GAAU3E,MAAMq8D,IAAS,MAAC,cAAc,OAAD,wBAA8B,QAAxB,EAAA3qE,KAAK6tB,QAAQkiB,mBAAW,QAAI,CAAC,GAAE,CAAE46B,UAAO,SAC7I1mE,GAEK8K,EAAO+7D,EAAOC,SAAmB3pD,QAAQgI,IAAI,EAClD,EAAA4hD,EAAA,GAAahrE,KAAK6tB,SACjB7tB,KAAK6tB,QAAQm6C,WAAasB,EAAmBthE,EAAgC,QAAxB,EAAAhI,KAAK6tB,QAAQkiB,mBAAW,SAAE1c,aAAiBrzB,KAAK6tB,QAAQo9C,iBAAmB3B,EAAmBthE,EAAgC,QAAxB,EAAAhI,KAAK6tB,QAAQkiB,mBAAW,SAAE1c,YAAY,GAAM,GACxMw3C,IAGF,IAAGC,aAAK,EAALA,EAAOjoE,SAAUkoE,EAAW,CAC7B,MAAMG,EAAQ7/D,SAASC,cAAc,QACrC4/D,EAAM33D,UAAUxS,IAAI,oBACpBypE,GAAW,GACX,EAAA/vC,EAAA,GAAaywC,EAAOn8D,GAEpB,MAAMqrD,EAAW/uD,SAAS8/D,yBAC1B/Q,EAAS1uD,UAAU,CAACq/D,EAAWG,KAAWJ,QAAAA,EAAS,IAAK1xC,OAAOC,WAC/D,EAAAoB,EAAA,GAAaz6B,KAAKkC,QAASk4D,E,MAE3B,EAAA3/B,EAAA,GAAaz6B,KAAKkC,QAAS6M,E,CAM/B/O,KAAKuqE,YAAYC,E,2XClJN,MAAMY,UAAoB,IAgBvCrrE,YAAY8tB,EAEP,CAAC,GACJ3b,MAAM,eAAgB,CAACm5D,UAAU,EAAMC,aAAa,IAd9C,KAAArlD,MAAQ,IAAIC,MAIZ,KAAAqlD,QAAU,CAChBC,KAAM,OACNC,eAAgB,QAUhBzrE,KAAK0rE,GAAKrgE,SAASC,cAAc,OACjC,QAAMtL,KAAK0rE,GAAI,sBAEf1rE,KAAK2rE,SAASp4D,UAAU/Q,OAAO,YAE/BxC,KAAK+nD,OAAOr8C,OAAO1L,KAAK0rE,IAExB1rE,KAAK4rE,cAAgBvgE,SAASC,cAAc,OAC5CtL,KAAK4rE,cAAcr4D,UAAUxS,IAAI,QACjCf,KAAK4rE,cAAclgE,OAAO1L,KAAKimB,OAE5B4H,EAAQuV,SACTpjC,KAAK4rE,cAAcr4D,UAAUxS,IAAI,YAGnCf,KAAK+wB,MAAQ1lB,SAASC,cAAc,SACpCtL,KAAK+wB,MAAMnvB,KAAO,OAClB5B,KAAK+wB,MAAMxlB,MAAMoc,QAAU,OAC3B3nB,KAAK6R,eAAe9Q,IAAIf,KAAK+wB,MAA7B/wB,CAAoC,UAAW+H,IAC7C,MAAM8jE,EAAO9jE,EAAE1H,OAAOyrE,MAAM,GACxBD,IAIJ,EAAAE,EAAA,GAAkBF,GAAMv9D,MAAM09D,IAC5BhsE,KAAKimB,MAAQ,IAAIC,MACjBlmB,KAAK4rE,cAAclgE,OAAO1L,KAAKimB,OAC/BjmB,KAAKimB,MAAMtjB,IAAMqpE,EAEjBhsE,KAAKimB,MAAMgmD,OAAS,KAIlBjsE,KAAKurB,OAELvrB,KAAKurE,QCjEf,SAAyBW,EAAiC5oE,GACxD,IAAI6oE,EACF/gE,EACAghE,EACAC,EAOK,CAAC,EAMNC,EAAW,EACXC,EAAU,EACVC,EAAY,EACZC,EAAa,EACbC,EAAc,EA8BhB,SAASl6C,IACP05C,EAAc34D,UAAUxS,IAAI,aAC5BmrE,EAAc1I,WAAY,EAE1B4I,EAAY,IAAIlmD,MAChBkmD,EAAUzpE,IAAMupE,EAAcvpE,IAC9BypE,EAAU5I,WAAY,EACtB4I,EAAU74D,UAAUxS,IAAI,sBAEpBuC,IACFA,EAAS+H,SAASC,cAAc,WAGlC6gE,EAAgB9gE,SAASC,cAAc,OACvC6gE,EAAc54D,UAAUxS,IAAI,kBAE5BqK,EAAYC,SAASC,cAAc,OACnCF,EAAUmI,UAAUxS,IAAI,gBAExB,MAAM4rE,EAAethE,SAASC,cAAc,OAC5CqhE,EAAap5D,UAAUxS,IAAI,sBAE3BorE,EAAc30D,YAAYpM,GACV8gE,EAAc50D,WACtBE,YAAY20D,GACpBA,EAAc30D,YAAY40D,GAC1BD,EAAc30D,YAAY00D,GAC1BC,EAAc30D,YAAYm1D,GAC1BvhE,EAAUoM,YAAY40D,GAEtBA,EAAU7gE,MAAMye,SAAWkiD,EAAc5oD,MAAQ,KAEjDopD,EAAcR,EAAcvmD,aAAeumD,EAAcvkC,YAEzD,MAAMhlB,EAAOupD,EAAcvkC,YAAc,EAAIilC,IACvCxpD,EAAM8oD,EAAcW,aAAe,EAAIC,IAE7CC,EAzEY,IACC,KAyEbC,EAAgBrqD,EAAMS,GACtB83B,EAAgBv4B,EAAMS,GA/CtBhY,EAAUwC,iBAAiB,YAAaq/D,GAAa,GACrD7hE,EAAUwC,iBAAiB,aAAcq/D,GAAa,GACtD7hE,EAAUwC,iBAAiB,QAASs/D,GAAU,GAE9C7hE,SAASuC,iBAAiB,WAAYu/D,GAAY,EA8CpD,CAEA,SAASJ,EAAezpD,EAAeI,GACrC8oD,EAAYlpD,EAAQopD,EACpBD,EAAa/oD,EAASgpD,EAEtBthE,EAAUG,MAAM+X,MAAQA,EAAQ,KAChClY,EAAUG,MAAMmY,OAASA,EAAS,IACpC,CAEA,SAASspD,EAAgBrqD,EAAcS,GACrCmpD,EAAUnpD,EAAMspD,EAChBJ,EAAW3pD,EAAO+pD,EAElBN,EAAU7gE,MAAM6X,KAAOA,EAAM,KAC7BgpD,EAAU7gE,MAAMoX,MAAQA,EAAO,IACjC,CAEA,SAASu4B,EAAgBv4B,EAAcS,GACrChY,EAAUG,MAAM6X,IAAMA,EAAM,KAC5BhY,EAAUG,MAAMoX,KAAOA,EAAO,IAChC,CAcA,SAASyqD,EAAQnuD,GACfA,EAAOA,EAAOzY,KAAKo9C,GAAK,EACxB,IAIEjhC,EACAS,EACAk7B,EACA+uB,EAPEC,EAAW9mE,KAAK+sC,MAAMnoC,EAAU2iD,YAAc9uC,GAChDsuD,EAAY/mE,KAAK+sC,MAAMnoC,EAAUoiE,aAAevuD,GAChD7Q,EAAIg+D,EAAUre,YACd3+C,EAAIg9D,EAAUoB,aAMbF,EA9HQ,IAgIDA,EAAWl/D,IAIrBuU,EAAOvX,EAAUqY,WAAcxE,EAAO,EACtCmE,EAAMhY,EAAUqrB,UAAaxX,EAAO,EACpCq/B,EAAQ37B,EAAO2qD,EACfD,EAASjqD,EAAMmqD,EAEZ5qD,EAAO,IAAGA,EAAO,GACjBS,EAAM,IAAGA,EAAM,GAEfk7B,EAAQlwC,GACRi/D,EAASj+D,IAEZ29D,EAAeO,EAAUA,GACzBN,EAAgBrqD,EAAMS,GACtB83B,EAAgBv4B,EAAMS,IAExB,CAEA,SAAS+pD,EAAWplE,GAGlB,OAFAA,EAAE2qB,iBAEK+6C,OAAOC,aAAa3lE,EAAE4lE,WAC3B,IAAK,IACHP,EA3JW,GA4JX,MACF,IAAK,IACHA,GA9JW,GAiKjB,CAEA,SAASF,EAASnlE,GAChBA,EAAE2qB,iBACF06C,EAAQrlE,EAAEiW,OAAS,EAAI,GAAK,EAC9B,CAEA,SAASivD,EAAYllE,GACnBA,EAAE2qB,iBACF3qB,EAAE6lE,kBAjEJ,SAAwB7lE,GACtBskE,EAAYwB,gBAAkBziE,EAAUu8B,YACxC0kC,EAAYyB,iBAAmB1iE,EAAUyhE,aAEzCR,EAAY0B,eAAiB3iE,EAAUqY,WACvC4oD,EAAY2B,cAAgB5iE,EAAUqrB,UAEtC41C,EAAY4B,SAAWlmE,EAAE21D,SAAW31D,EAAEkkC,OAASlkC,EAAE6lB,SAAW7lB,EAAE6lB,QAAQ,GAAG8vC,SAAWhqD,OAAOw6D,QAC3F7B,EAAY8B,SAAWpmE,EAAEqmE,SAAWrmE,EAAEsmE,OAAStmE,EAAE6lB,SAAW7lB,EAAE6lB,QAAQ,GAAGwgD,SAAW16D,OAAO46D,OAC7F,CA0DEC,CAAexmE,GAEfsD,SAASuC,iBAAiB,YAAa4gE,GACvCnjE,SAASuC,iBAAiB,YAAa4gE,GACvCnjE,SAASuC,iBAAiB,UAAW6gE,GACrCpjE,SAASuC,iBAAiB,WAAY6gE,EACxC,CAEA,SAASA,EAAU1mE,GACjBA,EAAE2qB,iBAEFrnB,SAASqG,oBAAoB,UAAW+8D,GACxCpjE,SAASqG,oBAAoB,WAAY+8D,GACzCpjE,SAASqG,oBAAoB,YAAa88D,GAC1CnjE,SAASqG,oBAAoB,YAAa88D,EAC5C,CAEA,SAASA,EAAOzmE,GACd,IACE4a,EACAS,EACAhV,EACAgB,EAJEs/D,EAAe,CAACxnD,EAAG,EAAGC,EAAG,GAM7Bpf,EAAE2qB,iBACF3qB,EAAE6lE,kBAEFc,EAAaxnD,EAAInf,EAAEkkC,OAASlkC,EAAE6lB,SAAW7lB,EAAE6lB,QAAQ,GAAGqe,MACtDyiC,EAAavnD,EAAIpf,EAAEsmE,OAAStmE,EAAE6lB,SAAW7lB,EAAE6lB,QAAQ,GAAGygD,MAEtD1rD,EAAO+rD,EAAaxnD,GAAKmlD,EAAY4B,QAAU5B,EAAY0B,gBAC3D3qD,EAAMsrD,EAAavnD,GAAKklD,EAAY8B,QAAU9B,EAAY2B,eAC1D5/D,EAAIhD,EAAUu8B,YACdv4B,EAAIhE,EAAUyhE,aAEXlqD,EAAO,EAAGA,EAAO,EACZA,EAAOypD,EAAUzkC,YAAcv5B,IAAGuU,EAAOypD,EAAUzkC,YAAcv5B,GAEtEgV,EAAM,EAAGA,EAAM,EACVA,EAAMgpD,EAAUS,aAAez9D,IAAGgU,EAAMgpD,EAAUS,aAAez9D,GAEzE49D,EAAgBrqD,EAAMS,GACtB83B,EAAgBv4B,EAAMS,EAExB,CAeA,OA5NG8oD,EAAcyC,SAAUn8C,IACtB05C,EAAcD,OAASz5C,EA2NrB,CAACg5C,KAbR,WACEloE,EAAOggB,MAAQkpD,EACflpE,EAAOogB,OAAS+oD,EAEJnpE,EAAOoiB,WAAW,MAC1BM,UAAUkmD,EACZI,EAAUC,EACVC,EAAWC,EACX,EAAG,EACHD,EAAWC,EAEf,EAEchB,eAzNd,WACErgE,EAAUsG,oBAAoB,YAAau7D,GAC3C7hE,EAAUsG,oBAAoB,aAAcu7D,GAC5C7hE,EAAUsG,oBAAoB,QAASw7D,GAEvC7hE,SAASqG,oBAAoB,UAAW+8D,GACxCpjE,SAASqG,oBAAoB,WAAY+8D,GACzCpjE,SAASqG,oBAAoB,YAAa88D,GAC1CnjE,SAASqG,oBAAoB,YAAa88D,GAC1CnjE,SAASqG,oBAAoB,WAAYy7D,GAEzChB,EAAc3pE,SACd4I,EAAU5I,SACV4pE,EAAU5pE,QACZ,EA4MF,CDnLyB,CAAgBxC,KAAKimB,MAAOjmB,KAAKsD,QAChDtD,KAAK+wB,MAAMrkB,MAAQ,EAAE,CACtB,GACD,IACD,GAEH1M,KAAK4uE,WAAWvzD,UAAY,oFAC5B,QAAiBrb,KAAK4uE,YAAY,KAChC5uE,KAAKurE,QAAQC,OACbxrE,KAAKqW,OAELrW,KAAKsD,OAAOurE,QAAQC,IAClB9uE,KAAK8uE,KAAOA,EACZ9uE,KAAK+uE,eACL/uE,KAAKmO,SAAS,GACb,aAAc,EAAE,GAClB,CAAC0D,eAAgB7R,KAAK6R,iBAEzB7R,KAAKoL,UAAUM,OAAO1L,KAAK4rE,cAAe5rE,KAAK4uE,WAAY5uE,KAAK+wB,OAEhE/wB,KAAK4N,iBAAiB,qBAAqB,KACzC5N,KAAKurE,QAAQE,iBACVzrE,KAAKimB,OACNjmB,KAAKimB,MAAMzjB,Q,GAGjB,CAEQ2L,UACNnO,KAAKgvE,QAAO,IACH9iD,EAAA,SAA0BlsB,KAAK8uE,OAE1C,CAEO1jD,KAAK6jD,EAA+BD,GACzChvE,KAAKsD,OAAS2rE,EACdjvE,KAAKgvE,OAASA,EAEdhvE,KAAK+wB,MAAM9b,OACb,CAEO85D,eACL,MAAMG,EAAMlvE,KAAKsD,OAAOoiB,WAAW,MACnCwpD,EAAI93B,UAAY,qBAChB83B,EAAI73B,SAAS,EAAG,EAAGr3C,KAAKsD,OAAOggB,MAAOtjB,KAAKsD,OAAOogB,OACpD,E,iFExGa,MAAMyrD,EACnBpvE,YACUiI,EAEAm8B,EACAirC,EACAn8D,GAJA,KAAAjL,OAAAA,EAEA,KAAAm8B,SAAAA,EACA,KAAAirC,SAAAA,EACA,KAAAn8D,SAAAA,EAERjT,KAAKmL,WACP,CAEcA,Y,qCACZ,IAAI,OAACnD,EAAM,SAAEm8B,EAAQ,SAAEirC,EAAQ,SAAEn8D,GAAYjT,KAC7C,MAAMqvE,QAAyB,OAAc,CAACrnE,SAAQiL,SAAUA,IAE1DhM,EAAW,kBACDhD,IAAbkgC,IACDA,QAAiBl9B,EAASqI,gBAAgBggE,cAActnE,IAQ1D,MAAMunE,EAAgB,CAAC3pC,EAA4C4pC,EAAQtvB,KAAgBta,EAAQ/9B,QACjG,IAAI0G,EAAUtH,EAASq5B,gBAAgBmvC,MAAMznE,EAAOs1B,YAEjDkyC,IACDjhE,EAAUA,EAAQD,MAAK,IACdrH,EAAS8G,mBAAmB2hE,aAAa1nE,MAIpDonE,SAAAA,EAAW7gE,EAAQ,EAGfohE,EAAkB/pC,IACtB,IAAIr3B,EAEJ,GAAG0E,EACD1E,EAAUtH,EAAS8G,mBAAmB2hE,aAAa1nE,GAAQ,GAAO,EAAMiL,QACnE,GAAGjL,EAAOo3B,SACf7wB,EAAUtH,EAAS8G,mBAAmB2hE,aAAa1nE,GAAQ,EAAOk4C,IAAeta,EAAQ/9B,UAAO5D,OAC3F,CACL,IAAG2hC,EAAQ/9B,KAGT,OAAO0nE,EAAc3pC,GAFrBr3B,EAAUtH,EAASq5B,gBAAgBr/B,OAAO+G,EAAOs1B,W,CAMrD8xC,SAAAA,EAAW7gE,EAAQ,EAGrB,IAAIQ,EACF6gE,EACAr1C,EACAs1C,EACAh8D,EACAqsC,EACF,OAAO/b,GACL,IAAK,iBACuCl9B,EAASq5B,gBAAgB6C,UAAUn7B,EAAOs1B,WAAY,iBAC9FvuB,EAAQ,oBACRwrB,EAAc,iCACd1mB,EAAU,CAAC,CACTsjD,QAAS,oBACT2Y,UAAU,EACVv9C,SAAUo9C,IAGZzvB,EAAa,CAAC,CACZlsC,KAAM,0BAGRjF,EAAQ,mBACRwrB,EAAc,4BACds1C,EAAkB,CAACR,GACnBx7D,EAAU,CAAC,CACTsjD,QAAS,eACT2Y,UAAU,EACVv9C,SAAUg9C,KAId,MAeF,IAAK,OACHxgE,EAAQ,iBACRwrB,EAAc,mCACds1C,EAAkB,CAACR,GAEnBx7D,EAAU,CAAC,CACTsjD,QAAS,iBACT2Y,UAAU,EACVv9C,SAAUo9C,IAGZzvB,EAAa,CAAC,CACZlsC,KAAM,2BACNg9B,SAAU,OACF,OAAc,CAAChpC,cAIzB,MAGF,IAAK,QACH+G,EAAQ,iBACRwrB,EAAc,wCACd1mB,EAAU,CAAC,CACTsjD,QAAS,iBACT2Y,UAAU,EACVv9C,SAAUo9C,IAGZ,MAGF,IAAK,YACL,IAAK,QACA18D,GACDlE,EAAQ,eACR6gE,EAAY,CAAC,GACbr1C,EAAc,sBACds1C,EAAkB,CAACR,GACnBx7D,EAAU,CAAC,CACTsjD,QAAS,SACT2Y,UAAU,EACVv9C,SAAUo9C,YAEmC1oE,EAASq5B,gBAAgB6C,UAAUn7B,EAAOs1B,WAAY,iBACrGvuB,EAAQ,iBACRwrB,EAAc,0BACd1mB,EAAU,CAAC,CACTsjD,QAAS,iBACT2Y,UAAU,EACVv9C,SAAUo9C,IAGZzvB,EAAa,CAAC,CACZlsC,KAAM,mCAGRjF,EAAQ,gBACRwrB,EAAc,8BACds1C,EAAkB,CAACR,GACnBx7D,EAAU,CAAC,CACTsjD,QAAS,iBACT2Y,UAAU,EACVv9C,SAAW2tB,GAAeqvB,EAAcrvB,GAAY,MAQ5D,IAAI,IAAU,oBAAqB,CACjCl4C,SACAiL,WACAgkD,aAAcloD,EACdghE,cAAeH,EACf1Y,mBAAoB38B,EACpBy1C,oBAAqBH,EACrBh8D,UACAqsC,eACC30B,MACL,E,+rBCpLa,MAAM0kD,EACnBlwE,YACUiI,EACAqgC,EACAzmC,EACAsuE,EACAj9D,GAJA,KAAAjL,OAAAA,EACA,KAAAqgC,KAAAA,EACA,KAAAzmC,KAAAA,EACA,KAAAsuE,UAAAA,EACA,KAAAj9D,SAAAA,EAERjT,KAAKmL,WACP,CAEcA,Y,yCACZ,IAAI,OAACnD,EAAM,KAAEqgC,EAAI,KAAEzmC,EAAI,UAAEsuE,EAAS,SAAEj9D,GAAYjT,KAEhD,MAAMqvE,QAAyB,OAAc,CAACrnE,SAAQiL,aAEhDhM,EAAW,aAEjBohC,EAAOA,EAAK/Q,QACZ,MAAM/E,EAAW,CAACqT,EAA4CuqC,KAC5DD,GAAaA,IACD,cAATtuE,EACDqF,EAAS8G,mBAAmBqiE,wBAAwBpoE,EAAQqgC,GAE5DphC,EAAS8G,mBAAmBsiE,eAAeroE,EAAQqgC,IAAQzC,EAAQ/9B,MAAQsoE,E,EAIzEt8D,EAAuC,CAAC,CAC5CsjD,QAAS,SACT2Y,UAAU,EACVv9C,aAEI2tB,EAA6C,GACnD,IAAInxC,EAAoB6gE,EAAkBr1C,EAA0Bs1C,EAcpE,GAbmB,IAAhBxnC,EAAKxlC,OACNkM,EAAQ,6BAERA,EAAQ,sBACR6gE,EAAY,EAAC,QAAK,WAAY,CAACvnC,EAAKxlC,WAIpC03B,SADOtzB,EAASqI,gBAAgBghE,YAAYtoE,IACd,IAAhBqgC,EAAKxlC,OAAe,oCAAsC,kCAE1C,IAAhBwlC,EAAKxlC,OAAe,gCAAkC,8BAGnEmF,IAAW,UAA2B,cAATpG,QAG9B,GAAGoG,EAAOo3B,SACR8gB,EAAW79C,KAAK,CACd2R,KAAM,2BACNg9B,SAAU,CAACq+B,SAER,CACL,MAAMryB,QAAa/1C,EAASq5B,gBAAgBmoC,QAAQzgE,EAAOs1B,YAErDizC,GAAa,OAAUvzB,EAAM,mBACnC,GAAc,SAAXA,EAAKptC,EAAc,CACpB,MAAM4gE,EAAYD,EAAaloC,EAAK/Q,cAAgB,OAAY+Q,GAAYpgC,GAAQ,EAAD,gCAEjF,aADsBhB,EAAS8G,mBAAmByE,iBAAiBxK,EAAQC,IAC5D6F,SAAW,QAC5B,MAEG0iE,EAAU3tE,SACR2tE,EAAU3tE,SAAWwlC,EAAKxlC,OAC3Bq9C,EAAW79C,KAAK,CACd2R,KAAM,kBAGRksC,EAAW79C,KAAK,CACd2R,KAAM,yBAGRumB,EAAc,0BACds1C,EAAkB,EAAC,QAAK,WAAY,CAACW,EAAU3tE,W,MAKnDgR,EAAQ,GAAG0e,SAAYqT,GAAYrT,EAASqT,GAAS,E,EAK3D,OAAgB/xB,GAEF,IAAI,IAAU,oBAAqB,CAC/C7L,SACAiL,WACAgkD,aAAcloD,EACdghE,cAAeH,EACf1Y,mBAAoB38B,EACpBy1C,oBAAqBH,EACrBh8D,UACAqsC,eAGI30B,MACR,G,6FCzGa,MAAMklD,UAAqB,IACxC1wE,YACE2wE,EACAtB,GAEAl9D,MAAM,CACJy+D,UAAW,CAAC,UAAW,YACvBvB,UAAWsB,GAActB,EAAWA,EAAiBpnE,IAAW,O,EAAD,K,OAAA,E,EAAA,YAC7D,GAAGonE,EAAU,CACX,MAAMj+C,EAAMi+C,EAASpnE,GAClBmpB,aAAe/P,gBACV+P,E,CAIV,GAAGnpB,IAAW,SAed,kBAA0B,CAACA,WAC3B,oCAA4C0oE,OAhB5C,CACE,IAAIt/C,EAAQ,EACZ,IAAI,MAAMurB,KAAc+zB,EAAY,CAClC,MAAMroC,EAAOqoC,EAAW/zB,GACxBvrB,GAASiX,EAAKxlC,OACd7C,KAAKiH,SAAS8G,mBAAmB6iE,gBAAgB5oE,EAAQ20C,EAAW/pB,WAAYyV,E,EAGlF,QAAS,CACPjc,YAAagF,EAAQ,EAAI,6BAA+B,6B,CAQ9D,E,YAzB+D,K,6QAyB9D,EACD7tB,YAAa,uCACbkjC,iBAAkB,gBAClBlC,aAAc,gBAElB,E,qOCKF,MAAMssC,EAAoBxlE,SAASI,KACnC,IAAIqlE,EAAgBD,EAEpB,MAAME,EAAqB,KACzBD,GAAgB,WAA0BD,EAC1CG,EAAaC,UAAU,GAGzB,QAAsBJ,EAAmBE,GAO1B,MAAMC,UAA4D,IAgC/EjxE,YAAYsb,EAAmBwS,EAAwB,CAAC,GAgEtD,GA/DA3b,OAAM,GA7BE,KAAAhQ,QAAUmJ,SAASC,cAAc,OACjC,KAAAF,UAAYC,SAASC,cAAc,OACnC,KAAAy8C,OAAS18C,SAASC,cAAc,OAChC,KAAAyD,MAAQ1D,SAASC,cAAc,OAM/B,KAAAmiB,SAA0B,KAAM,EA8LnC,KAAApX,KAAO,KACZ,eAAmCrW,KAAKshB,eAAe,EA1KvDthB,KAAKkC,QAAQqR,UAAUxS,IAAI,SAC3Bf,KAAKkC,QAAQmZ,UAAY,SAAWA,EAAY,IAAMA,EAAY,IAClErb,KAAKoL,UAAUmI,UAAUxS,IAAI,kBAAmB,aAEhDf,KAAK+nD,OAAOx0C,UAAUxS,IAAI,iBAEvB8sB,EAAQ9e,OAAS8e,EAAQqjD,YAC1BlxE,KAAK+O,MAAMwE,UAAUxS,IAAI,eACI,iBAAnB8sB,EAAa,OACrB,QAAM7tB,KAAK+O,MAAO8e,EAAQ9e,OAClB8e,EAAQqjD,UAChBlxE,KAAK+O,MAAMrD,QAAO,OAAcmiB,EAAQqjD,WAG1ClxE,KAAK+nD,OAAOr8C,OAAO1L,KAAK+O,QAG1B/O,KAAKyvC,kBAAmB,SACxBzvC,KAAK6R,eAAiB,IAAI,IAC1B7R,KAAKiH,SAAW+pE,EAAaG,SAE7BnxE,KAAKoxE,8BAAgCvjD,EAAQujD,8BAE1CvjD,EAAQw9C,WACTrrE,KAAK2rE,SAAWtgE,SAASC,cAAc,QACvCtL,KAAK2rE,SAASp4D,UAAUxS,IAAI,WAAY,cAAe,eAEvDf,KAAK+nD,OAAO/vC,QAAQhY,KAAK2rE,WAEzB,QAAiB3rE,KAAK2rE,SAAU3rE,KAAKqW,KAAM,CAACxE,eAAgB7R,KAAK6R,eAAgB5D,MAAM,KAGzFjO,KAAKqxE,eAAiBxjD,EAAQwjD,eAC3BrxE,KAAKqxE,gBACNrxE,KAAKkC,QAAQqR,UAAUxS,IAAI,cAG1B8sB,EAAQyjD,kBACT,QAAiBtxE,KAAKkC,SAAU6F,KAC1B,OAAgBA,EAAE1H,OAAQ,oBAC5BL,KAAKqW,M,GAEN,CAACxE,eAAgB7R,KAAK6R,iBAGxBgc,EAAQy9C,cACTtrE,KAAK4uE,WAAavjE,SAASC,cAAc,UACzCtL,KAAK4uE,WAAWr7D,UAAUxS,IAAI,cAAe,sBAClB,IAAxB8sB,EAAQy9C,aACTtrE,KAAK4uE,WAAWljE,QAAO,QAAKmiB,EAAQy9C,cAEtCtrE,KAAK+nD,OAAOr8C,OAAO1L,KAAK4uE,aACxB,OAAO5uE,KAAK4uE,aAGd5uE,KAAKoL,UAAUM,OAAO1L,KAAK+nD,QACxBl6B,EAAQpiB,OACTzL,KAAKyL,KAAOJ,SAASC,cAAc,OACnCtL,KAAKyL,KAAK8H,UAAUxS,IAAI,cACxBf,KAAKoL,UAAUM,OAAO1L,KAAKyL,OAG1BoiB,EAAQyC,WAAY,CACrB,MAAMA,EAAatwB,KAAKswB,WAAa,IAAI,KAAWtwB,KAAKyL,MACzDzL,KAAKuxE,4BAEDvxE,KAAKyL,MACPzL,KAAKoL,UAAUmM,aAAa+Y,EAAWllB,UAAWpL,KAAK+nD,OAAO+T,Y,CAIlE,IAAI0V,EAAoBxxE,KAAK4uE,WAC7B,MAAM/6D,EAAU7T,KAAK6T,QAAUga,EAAQha,QACvC,GAAGA,aAAO,EAAPA,EAAShR,OAAQ,CAClB,MAAMic,EAAa9e,KAAKyxE,UAAYpmE,SAASC,cAAc,OAC3DwT,EAAWvL,UAAUxS,IAAI,iBAEzB,MAAM2wE,EAAkB79D,EAAQiH,KAAKk3B,IACnC,MAAM17B,EAASjL,SAASC,cAAc,UAkBtC,OAjBAgL,EAAO+E,UAAY,OAAS22B,EAAE89B,SAAW,UAAY,YAEjD99B,EAAEhzB,WACJ,OAAO1I,GAGN07B,EAAEh+B,KACHsC,EAAOsC,YAAeo5B,EAAEh+B,KAExBsC,EAAO5K,QAAO,QAAKsmC,EAAEmlB,QAASnlB,EAAE2/B,YAGlC,QAAiBr7D,GAAQ,K,MACb,QAAV,EAAA07B,EAAEzf,gBAAQ,iBACVvyB,KAAK+D,SAAS,GACb,CAAC8N,eAAgB7R,KAAK6R,eAAgB5D,MAAM,IAExC+jC,EAAE9vC,QAAUoU,CAAM,IAG3B,IAAIk7D,GAAwC,IAAnB39D,EAAQhR,OAAc,CAC7C,MAAMyT,EAASzC,EAAQnT,MAAM4V,IAAYA,EAAO8pC,WAC7C9pC,IACDk7D,EAAoBl7D,EAAOpU,Q,CAI/B4c,EAAWpT,UAAUgmE,GACrB1xE,KAAKoL,UAAUM,OAAOoT,E,CAGxB9e,KAAKwxE,kBAAoBA,EAEzBxxE,KAAKkC,QAAQwJ,OAAO1L,KAAKoL,WAEzB4lE,EAAaY,OAAOvvE,KAAKrC,KAC3B,CAEUuxE,0BAA0BM,GAClC,OAAO7xE,KAAKswB,WAAWwhD,sBAAsBD,EAC/C,CAEUE,kBACL/xE,KAAKswB,YACNtwB,KAAKswB,WAAW3c,oBAEpB,CAEO4X,OACLvrB,KAAKshB,eAAiB,CACpB1f,KAAM,QACNkoB,MAAO,IAAM9pB,KAAK+D,UAClB0pB,SAAUztB,KAAKytB,UAGjB,aAAiCztB,KAAKshB,iBAEtC,SACAwvD,EAAcplE,OAAO1L,KAAKkC,SACrBlC,KAAKkC,QAAQylC,YAClB3nC,KAAKkC,QAAQqR,UAAUxS,IAAI,UAE3Bf,KAAK+xE,kBAED/xE,KAAKqxE,iBACP,qBAAiC,EACjC,sBAAsC,IAKxC3uE,YAAW,KACL1C,KAAKkC,QAAQqR,UAAUqB,SAAS,WAIpC5U,KAAK6R,eAAe9Q,IAAIsK,SAASI,KAAjCzL,CAAuC,WAAY+H,IAC9CipE,EAAaY,OAAOZ,EAAaY,OAAO/uE,OAAS,KAAO7C,OAIxDA,KAAKoxE,+BAAgC,OAAsBrpE,GAAe,UAAVA,EAAEyE,QACnE,QAAmBxM,KAAKwxE,oBACxB,OAAYzpE,G,GAEd,GACD,EAEL,CAMUhE,UACR/D,KAAKoJ,cAA8B,SACnCpJ,KAAKkC,QAAQqR,UAAUxS,IAAI,UAC3Bf,KAAKkC,QAAQqR,UAAU/Q,OAAO,UAC9BxC,KAAK6R,eAAeC,YACpB9R,KAAKyvC,iBAAiB1rC,UAElB/D,KAAKqxE,iBACP,qBAAiC,GAGnC,eAAmCrxE,KAAKshB,gBACxCthB,KAAKshB,oBAAiBrd,GAEtB,OAAiB+sE,EAAaY,OAAQ5xE,MAGtC+wE,IAEAruE,YAAW,K,MACT1C,KAAKkC,QAAQM,SACbxC,KAAKoJ,cAA8B,qBACnCpJ,KAAK0b,UACU,QAAf,EAAA1b,KAAKswB,kBAAU,SAAEvsB,UAEb/D,KAAKqxE,gBACP,sBAAsC,E,GAEvC,IACL,CAEO56D,kBACLzW,KAAK4xE,OAAO7sE,SAASitE,IACnB,MAAM,QAAC9vE,EAAO,UAAEkJ,GAAa4mE,EACvB/4D,EAAgB/W,EAAQ+W,cAC3BA,GAAiBA,IAAkB63D,GAAiBA,IAAkB1lE,GACvE0lE,EAAcplE,OAAOxJ,E,GAG3B,CAEOuU,iBAAyCw7D,GAC9C,OAAOjyE,KAAK4xE,OAAOx4C,QAAQl3B,GAAYA,aAAmB+vE,GAC5D,CAEOx7D,mBAAiEy7D,KAA+B9c,GAErG,OADc,IAAI8c,KAAQ9c,EAE5B,EA9Pe,EAAAwc,OAA8B,GAiQxC,MAAMO,EAAmBt+D,IACfA,EAAQnT,MAAMsxC,GAAMA,EAAEoO,YAEnCvsC,EAAQxR,KAAK,CACX80D,QAAS,SACT/W,UAAU,IAIPvsC,E,qGClUT,MAAMY,EAMD,CACH29D,IAAK,CACHrjE,MAAO,eACPwrB,YAAa,yBACb83C,mBAAoB,gCACpBC,kBAAmB,+BACnBv+D,KAAM,aAERw+D,QAAS,CACPxjE,MAAO,eACPwrB,YAAa,sBACb83C,mBAAoB,6BACpBC,kBAAmB,4BACnBv+D,KAAM,kBAIV,MAAMy+D,UAAU,IACdzyE,YAAY8tB,EAIT4kD,GACDvgE,MAAM,cAAe,CACnB2B,aAA+B5P,IAAtB4pB,EAAQ+pC,UAA0B,CAAC,CAC1CT,QAAS,kBACT/W,UAAU,IACNvyB,EAAQ+pC,UAAY,CAAC,CACzBT,QAAS,KACT/W,UAAU,IACP,CAAC,CACJ+W,QAAS,gBACT5kC,SAAU,KACR,qBAA6B,EAE/BvT,UAAU,GACT,CACDm4C,QAAS,SACT/W,UAAU,IAEZ8W,wBAA0CjzD,IAAtB4pB,EAAQ+pC,UAA0B6a,EAAGH,kBAAqBzkD,EAAQ+pC,UAAY6a,EAAGJ,mBAAqBI,EAAGl4C,YAC7Hy1C,oBAAqBniD,EAAQ+pC,UAAY,CAAC/pC,EAAQ6kD,cAAgB,CAAC7kD,EAAQqD,MAAOrD,EAAQ6kD,cAC1Fzb,aAAcwb,EAAG1jE,QAGnB,MAAM4jE,OAAiC1uE,IAAtB4pB,EAAQ+pC,UACzB,GAAG+a,EACD3yE,KAAKkC,QAAQqR,UAAUxS,IAAI,kBACtB,GAAG8sB,EAAQ+pC,UAChB53D,KAAKkC,QAAQqR,UAAUxS,IAAI,kBACtB,CACL,MAAMuV,EAAStW,KAAK6T,QAAQnT,MAAMsxC,IAAOA,EAAEoO,WAC3C9pC,EAAOpU,QAAQqR,UAAUxS,IAAI,sBAC7B,MAAMqjB,EAAI/Y,SAASC,cAAc,KACjC8Y,EAAE7Q,UAAUxS,IAAI,0BAA2B,wBAC3CuV,EAAOpU,QAAQwJ,OAAO0Y,E,CAGxB,MAAMwuD,EAAiBvnE,SAASC,cAAc,OAC9CsnE,EAAer/D,UAAUxS,IAAI,oBAE7B,MAAM8xE,EAAOxnE,SAASC,cAAc,OACpCunE,EAAKt/D,UAAUxS,IAAI,oBACnB,MAAMqjB,EAAI/Y,SAASC,cAAc,QAMjC,GALA8Y,EAAE7Q,UAAUxS,IAAI,wBAAyB,SAAW0xE,EAAG1+D,MACvD8+D,EAAKnnE,OAAO0Y,EAAG,IAAMyJ,EAAQ+pC,UAAY/pC,EAAQ6kD,aAAe7kD,EAAQqD,QAExE0hD,EAAelnE,OAAOmnE,IAElBF,EAAU,CACZ,MAAMzhD,EAAQ7lB,SAASC,cAAc,OACrC4lB,EAAM3d,UAAUxS,IAAI,cAEpB,MAAM+xE,EAAOznE,SAASC,cAAc,OACpCwnE,EAAKv/D,UAAUxS,IAAI,mBAEnB,MAAMgpE,EAAU1+D,SAASC,cAAc,OACvCy+D,EAAQx2D,UAAUxS,IAAI,sBAEtBmwB,EAAMxlB,OAAOonE,EAAM/I,IAEnB,QAAM+I,EAAM,aACZ/I,EAAQr+D,QAAO,QAAK,gBAAiB,GAAKmiB,EAAQ6kD,cAElDE,EAAelnE,OAAOwlB,E,CAGxBlxB,KAAKoL,UAAUmM,aAAaq7D,EAAgB5yE,KAAKu6B,aAMjD,MAAMw4C,EAAgB,KACpBF,EAAKt/D,UAAUxS,IAAI,SAAS,EAG3B,gCACD,UAAYuN,KAAKykE,GAEjBA,GAEJ,EAGa,SAAeC,EAAepxE,G,2UAC3C,MAAM6wE,EAAKh+D,EAAE7S,IACNqxE,EAAW/hD,EAAOwhD,SAAsBtxD,QAAQgI,IAAI,CACzD,0CACG,EAAC,GAAO,GAAMtO,KAAKyM,GAAM,iCAAuC3lB,EAAM2lB,OAErEorD,EAAWM,EAAUC,yBAC3B,IAAIV,EAAE,CACJ5a,UAAW+a,OAAW1uE,EAAY,YAClCitB,QACAwhD,gBACCD,GAAIlnD,MACT,G,4FC5HA,MACM4nD,EAAiF,CAAC,CACtFzmE,MAFe,KAGf0f,YAAa,uBACZ,CACD1f,MAAO0mE,MACPhnD,YAAa,wBACZ,CACD1f,MAAO0mE,MACPhnD,YAAa,wBACZ,CACD1f,MAAO0mE,MACPhnD,YAAa,sBACZ,CACD1f,MAAO0mE,OACPhnD,YAAa,uBACZ,CACD1f,OAAQ,EACR0f,YAAa,wBACbwZ,SAAS,IAGI,MAAMytC,UAAkB,IACrCtzE,YAAYiI,EAAgBiL,GAa1B,IAAIqgE,EAZJphE,MAAM,aAAc,CAClBlK,SACAivD,aAAc,gBACdpjD,QAAS,CAAC,CACRsjD,QAAS,wBACT5kC,SAAU,KACRvyB,KAAKiH,SAAS8G,mBAAmBwlE,SAAS,CAACvrE,SAAQwrE,WAAqB,IAAVF,EAAc,MAAa,QAAM,GAAQA,EAAMrgE,YAAU,IAG3HxH,MAAM,IAIR,MAAMgoE,GAAY,QAAoBN,GAAQzmE,IAC5C4mE,GAAQ5mE,CAAK,IAGf1M,KAAKyL,KAAKC,OAAO+nE,GAEjBzzE,KAAKurB,MACP,E,oGC1Ba,MAAMmoD,UAAkB,IAGrC3zE,YAAoBsb,EAAmBwS,EAA4B,CAAC,GAQlE,GAPA3b,MAAM,cAAgBmJ,EAAY,IAAMA,EAAY,IAAK,OAAF,sBACrDi2D,iBAAiB,GACdzjD,GAAO,CACV9e,OAAO,EACP8E,QAASga,EAAQha,UAAW,OAAgBga,EAAQha,YALpC,KAAAwH,UAAAA,EAQfwS,EAAQ7lB,OAAQ,CACjB,MAAM4W,EAAW,IAAI,IACrBA,EAASrL,UAAUxS,IAAI,aACvB6d,EAASyK,kBAAkB,CACzBoe,UAAU,EACVz/B,OAAQ6lB,EAAQ7lB,OAChBiL,SAAU4a,EAAQ5a,SAClB88B,YAAa,CACX1c,WAAYrzB,KAAKyvC,iBAAiBxsC,SAGtCjD,KAAK+nD,OAAO/vC,QAAQ4G,E,CAGlBiP,EAAQ8lD,UACP9lD,EAAQopC,eAAiBppC,EAAQ9e,MAAO/O,KAAK+O,MAAMrD,QAAO,QAAKmiB,EAAQopC,cAAgB,UAAWppC,EAAQkiD,gBACrGliD,EAAQ9e,iBAAiBvL,YAC/BxD,KAAK+O,MAAMrD,OAAOmiB,EAAQ9e,OACrB/O,KAAK+O,MAAM+rB,UAAYjN,EAAQ9e,OAAS,IAGjD,MAAMqrD,EAAW/uD,SAAS8/D,yBAE1B,GAAGt9C,EAAQqpC,oBAAsBrpC,EAAQ0M,YAAa,CACpD,MAAM55B,EAAIX,KAAKu6B,YAAclvB,SAASC,cAAc,KACpD3K,EAAE4S,UAAUxS,IAAI,qBACb8sB,EAAQqpC,mBAAoBv2D,EAAE+K,QAAO,QAAKmiB,EAAQqpC,mBAAoBrpC,EAAQmiD,sBACzEniD,EAAQ0M,cAAa,OAAa55B,EAAGktB,EAAQ0M,aAErD6/B,EAAS1uD,OAAO/K,E,CAGfktB,EAAQqyB,aACTlgD,KAAKoL,UAAUmI,UAAUxS,IAAI,iBAE7B8sB,EAAQqyB,WAAWn7C,SAAS6uE,IAC1BA,EAAEr0B,YAAa,EACf,MAAMhY,EAAgB,IAAI,IAAcqsC,GACxCA,EAAErsC,cAAgBA,EAClB6yB,EAAS1uD,OAAO67B,EAAcC,MAAM,IAGtC3Z,EAAQha,QAAQ9O,SAASuR,IACvB,GAAGA,EAAOic,SAAU,CAClB,MAAMshD,EAAWv9D,EAAOic,SACxBjc,EAAOic,SAAW,KAChB,MAAMwP,EAAsB,IAAI3gC,IAChCysB,EAAQqyB,WAAWn7C,SAAS6uE,IACvBA,EAAErsC,cAAc3B,SACjB7D,EAAEhhC,IAAI6yE,EAAE5/D,K,IAGZ6/D,EAAS9xC,EAAE,C,MAMnB/hC,KAAKoL,UAAUmM,aAAa6iD,EAAUp6D,KAAK+nD,OAAO+rB,mBACpD,E,iFCzFa,MAAMC,UAAsB,IAGzCh0E,YAAY8tB,GAQV3b,MAAM,gBAAiB,CAACm5D,UAAU,EAAMiG,iBAAiB,EAAM7lE,MAAM,EAAMsD,OAAO,IAElF/O,KAAKqlB,SAAW,IAAI,IAAe,CACjCygB,SAAU9lC,KAAKyL,KACfglB,SAAU,KAAW,O,EAAD,K,OAAA,E,EAAA,YAClB,MAAMuT,EAAWhkC,KAAKqlB,SAASuiB,cACzB5/B,EAASg8B,EAASA,EAASnhC,OAAS,GAAG+vB,WAE7C,GAAG/E,EAAQuhD,SAAU,CACnB,MAAMj+C,EAAMtD,EAAQuhD,SAASpnE,GAC7B,GAAGmpB,aAAe/P,QAChB,UACQ+P,C,CACN,MAAM3rB,GACN,M,EAKNxF,KAAKqlB,SAAW,KAChBrlB,KAAKqW,MACP,E,YAjBoB,K,6QAiBnB,EACD8tB,SAAUtW,EAAQ8iD,UAClB3qC,cAAe,KACbhmC,KAAKurB,OACLvrB,KAAKqlB,SAAS+b,mBAEV,KACFphC,KAAKqlB,SAAS0L,MAAMC,O,EAGxByV,iBAAkB5Y,EAAQ4Y,iBAC1BrC,aAAa,EACbtE,eAAe,EACfvO,WAAY,aACZvpB,OAAQ6lB,EAAQ7lB,OAChBzE,YAAasqB,EAAQtqB,YACrBghC,aAAc1W,EAAQ0W,aACtBt9B,SAAUjH,KAAKiH,WAGjBjH,KAAKswB,WAAatwB,KAAKqlB,SAASiL,WAChCtwB,KAAKuxE,4BAILvxE,KAAK+O,MAAMrD,OAAO1L,KAAKqlB,SAAS0L,MAClC,E,6DC7Da,MAAMijD,UAAqB,IACxCj0E,YAAYiI,EAAgBqgC,EAAgB6nC,GAC1Ch+D,MAAM,oBAAqB,CACzBnD,MAAO,eAAes5B,EAAKxlC,OAAS,EAAI,IAAM,SAC9C03B,YAAa8N,EAAKxlC,OAAS,EAAI,QAAUwlC,EAAKxlC,OAAS,iBAAmB,oBAC1EgR,QAAS,CAAC,CACRsjD,QAAS,OACT5kC,SAAU,KACR29C,GAAaA,IACblwE,KAAKiH,SAAS8G,mBAAmBkmE,sBAAsBjsE,EAAQqgC,EAAK,MAK1EroC,KAAKurB,MACP,E,mjBCQF,MAAM2oD,EAAsC,iBAE7B,MAAMC,UAAsB,IAOzCp0E,YACUq0E,EACAC,GAERniE,MAAM,iBAAkB,CAACm5D,UAAU,EAAMiG,iBAAiB,EAAM7lE,MAAM,EAAM6kB,YAAY,EAAMvhB,OAAO,IAH7F,KAAAqlE,gBAAAA,EACA,KAAAC,SAAAA,EA4EF,KAAAC,gBAAwBvsE,GAAkB,EAAD,gCAC/C,MAAM1H,GAAS,OAAgB0H,EAAE1H,OAAQ,uBACzC,IAAIA,EAAQ,OAEZ,MAAM+G,EAAQ/G,EAAOgmB,QAAQjf,aACpB,wCAAgDA,KACvDpH,KAAKqW,MAET,IAhFErW,KAAK+O,MAAMrD,QAAO,QAAK,YACvB1L,KAAKu0E,YAAc,CAAC,EAEpB,uBAAoC,SAAS,GAC7Cv0E,KAAK4N,iBAAiB,SAAS,KAC7B,uBAAoC,SAAS,GAC7C,6BAA8C,IAGhD5N,KAAK8lC,SAAW9lC,KAAKswB,WAAWllB,UAEhCpL,KAAK8lC,SAASvyB,UAAUxS,IAAI,eAC5B,OAAaf,KAAK8lC,UAAU,GAE5B9lC,KAAKw0E,eAAiBnpE,SAASC,cAAc,OAC7CtL,KAAKw0E,eAAejhE,UAAUxS,IAAI,sBAElC,MAAMiY,GAAM,OAAO,oDAAqD,CAACgG,UAAU,EAAMhL,KAAM,YAC/FhU,KAAKw0E,eAAe9oE,OAAOsN,GAE3BhZ,KAAKyL,KAAKC,OAAO1L,KAAKw0E,iBAEtB,OAA6B,CAACrtB,SAAUnnD,KAAK8lC,SAAUj0B,eAAgB7R,KAAK6R,iBAE5E,MAAM4iE,EAAsB7wE,IAC1B,MAAMmF,EAAM/I,KAAKoxD,KAAKpoD,WAAW0rE,GAASA,EAAK9sE,KAAOhE,EAAIgE,KAC1D,IAAY,IAATmB,EACD,OAGF/I,KAAKoxD,KAAKroD,GAAOnF,EACjB,MAAM2wE,EAAcv0E,KAAKu0E,YAAY3wE,EAAIgE,IACzC2sE,SAAAA,IAAgB3wE,EAAI+jD,gBACpB3nD,KAAK20E,cAAc,EAGrB30E,KAAK6R,eAAe9Q,IAAI,IAAxBf,CAAmC,qBAAsBy0E,GACzDz0E,KAAK6R,eAAe9Q,IAAI,IAAxBf,CAAmC,mBAAoBy0E,GAEvDz0E,KAAK40E,gBACP,CAEQC,yBAAyBjxE,GAC/B,MAAMwH,EAAYC,SAASC,cAAc,OAGzC,IAAIwpE,EAAgBP,EAFpBnpE,EAAUmI,UAAUxS,IAAI,eAGrB6C,IACDkxE,EAAY,IAAI,KAAI,CAClB/lE,OAAO,OAAcnL,EAAImL,OACzBssB,UAAU,QAAKz3B,EAAI6J,OAAO8iD,OAAS,aAAe,WAAY,CAAC3sD,EAAIwtB,QACnE2jD,aAAa,IAGfR,EAAeS,KACb,OAAeF,EAAUC,aAAa,QAAKC,EAAQ,uBAAyB,uBAC5EF,EAAUC,YAAYxhE,UAAU1J,OAAO,SAAUmrE,EAAM,EAGzDT,IAAc3wE,EAAI+jD,gBAElBv8C,EAAUM,OAAOopE,EAAU1pE,YAG7B,MAAM6pE,EAAiB5pE,SAASC,cAAc,OAK9C,OAJA2pE,EAAe1hE,UAAUxS,IAAI,wBAE7BqK,EAAUM,OAAOupE,GAEV,CAAC7pE,YAAW0pE,YAAWP,cAAaU,iBAC7C,CAYcL,iB,+CACZ,MAAMvhD,EAAarzB,KAAKyvC,iBAAiBxsC,MAEnCiyE,GADSh8D,MAAMi8D,QAAQn1E,KAAKo0E,iBAAmBp0E,KAAKo0E,gBAAkB,CAACp0E,KAAKo0E,kBACtDt5D,KAAKiW,GAAU/wB,KAAKiH,SAASsgD,mBAAmBC,cAAcz2B,KAC1F,IAAIqgC,QAAahwC,QAAQgI,IAAI8rD,GAC7B,IAAI7hD,IAAc,OAClB,IAAI+hD,EAAWhkB,EAAK,GACpB,GAAmB,IAAhBA,EAAKvuD,SAAiBuyE,EAGvB,OAFA,QAAS,CAAChpD,YAAapsB,KAAKq0E,SAAW,mBAAqB,8BAC5Dr0E,KAAKqW,OAIP+6C,EAAOA,EAAKh4B,OAAOC,SACnB+7C,EAAWhkB,EAAK,GAEhBpxD,KAAKoxD,KAAOA,EAAKt2C,KAAKlX,GAAQA,EAAIA,MAElC,MAAMywE,EAAwB,QAAhB,EAAGr0E,KAAKq0E,gBAAQ,QAAbr0E,KAAKq0E,WAAee,EAASxxE,IAAI6J,OAAO8iD,OAEzD,IAAI8jB,EAAU,EACZ,QAAiBr0E,KAAK8lC,SAAU9lC,KAAKs0E,gBAAiB,CAACziE,eAAgB7R,KAAK6R,iBAE5E,MAAM,QAAC9N,IAAW,OAA0B,CAC1CojD,SAAUnnD,KAAK8lC,SACfuvC,eAAe,EACfC,OAAQ,IAAMt1E,KAAKqW,SAGrBrW,KAAK4N,iBAAiB,QAAS7J,E,CAGjC,4BAA6CmwE,GAE7C,MAAM71D,EAAgB,IAAI,IACpBqV,EAA+B,GAE/B6hD,EAAqBnkB,EAAKt2C,KAAUlX,GAAQ,EAAD,gCAC/C,MAAM,UAACwH,EAAS,eAAE6pE,EAAc,UAAEH,EAAS,YAAEP,GAAev0E,KAAK60E,yBAAyBzjB,EAAKvuD,OAAS,EAAIe,EAAIA,SAAMK,GAUtH,IAAIooD,EARDyoB,IACD,QAAiBA,EAAUC,aAAa,KACtC/0E,KAAKiH,SAASsgD,mBAAmBE,iBAAiB7jD,EAAIA,IAAI,GACzD,CAACiO,eAAgB7R,KAAK6R,iBAG3B7R,KAAKu0E,YAAY3wE,EAAIA,IAAIgE,IAAM2sE,EAI/B,MAAMvuB,EAAOpiD,EAAIukD,UAAU/uB,QAAQz3B,GAAmB,cAAXA,aAAG,EAAHA,EAAKiO,KAChD,GAAGykE,EAAU,CACX,MAAMja,GAAW,OAAgB,CAC/Bob,OAAQxvB,EAAKlrC,KAAKnZ,GAAQA,EAAIiG,KAC9B8rB,eACAsF,eAAgBk7C,EAChBjhB,gBAAiB,0BACjB5/B,eAIDna,MAAMC,KAAKihD,EAAS7kC,UAA4B+B,MAAM,GAAGvyB,SAAS7C,IACjE,MAAM6yB,EAAO1pB,SAASC,cAAc,QACpCypB,EAAKxhB,UAAUxS,IAAI,eACnBmB,EAAQsnB,YAAYuL,GACpBA,EAAKrpB,OAAOxJ,EAAQ,IAGtBmqD,EAAO,CAAC+N,GAER6a,EAAe1hE,UAAUoT,QAAQ,uBAAwB,gBACzDsuD,EAAe1hE,UAAUxS,IAAI,YAAa,Y,MAE1CsrD,QAAajrC,QAAQgI,IAAI48B,EAAKlrC,KAAUnZ,GAAQ,EAAD,gCAC7C,MAAMmpB,EAAMzf,SAASC,cAAc,OACnCwf,EAAIvX,UAAUxS,IAAI,uBAElB,MAAM8G,EAAO,8BAgBb,aAdM,QAAY,CAChBlG,MACAmpB,MACAzM,gBACA/d,MAAO4zE,EACPzvE,MAAM,EACNf,MAAM,EACN4f,MAAOzb,EACP6b,OAAQ7b,EACRugD,UAAU,EACV10B,eACAL,eAGKvI,CACT,OAKF,OAFAmqD,EAAevpE,UAAU2gD,EAAKjzB,OAAOC,UAE9BjuB,CACT,MAEMq3B,QAAmBrhB,QAAQgI,IAAImsD,SAC/Bn0D,QAAQgI,IAAIsK,GAElB,MAAMpd,EAAStW,KAAKsW,QAAS,OAAO,GAAI,CAAC0I,UAAU,IAEnDhf,KAAK20E,gBAEL,QAAiBr+D,GAAQ,KACvB,MAAMzM,GAAS,OAAiB,CAACyM,IAAS,GAE1CtW,KAAKiH,SAASsgD,mBAAmBkuB,kBAAkBrkB,EAAKt2C,KAAKlX,GAAQA,EAAIA,OAAM0K,MAAK,KAClFtO,KAAKqW,MAAM,IACV4B,OAAM,KACPpO,GAAQ,GACR,GACD,CAACgI,eAAgB7R,KAAK6R,iBAEN,IAAhBu/C,EAAKvuD,QACN,OAAa7C,KAAK+O,OAAO,OAAcqmE,EAASxxE,IAAImL,SAEpD,OAAa/O,KAAK+O,OAAO,QAAK,UAGhC/O,KAAKw0E,eAAe57D,YAAc,GAClC5Y,KAAKw0E,eAAe9oE,OAAO4K,GAE3BtW,KAAK8lC,SAASvyB,UAAU/Q,OAAO,cAC/BxC,KAAK8lC,SAASltB,YAAc,GAC5B5Y,KAAK8lC,SAASp6B,UAAU+2B,GAExBziC,KAAKswB,WAAW3c,oB,IAGVghE,eACN,MAAM,KAACvjB,EAAI,SAAEijB,GAAYr0E,KACzB,IAAI01E,EAAgBC,EACpB,GAAmB,IAAhBvkB,EAAKvuD,OAAc,CACpB,MAAMuyE,EAAWhkB,EAAK,GACtBukB,GAAe,QAAKtB,EAAW,aAAe,WAAY,CAACe,EAAShkD,QACpEskD,GAASN,EAASztB,c,KACb,CACL,MAAMiuB,EAAYxkB,EAAKh4B,QAAQx1B,GAAQA,EAAI+jD,iBAC3C,IAAIv2B,EACDggC,EAAKvuD,SAAW+yE,EAAU/yE,QAC3B6yE,GAAQ,EACRtkD,EAAQggC,EAAKvuD,SAEb6yE,GAAQ,EACRtkD,EAAQggC,EAAKvuD,OAAS+yE,EAAU/yE,QAGlC8yE,GAAe,QAAK,iBAAkB,CAACvkD,G,CAGzCpxB,KAAKsW,OAAO+E,UAAYq6D,EAAQ,gCAAkC,8CAClE,OAAe11E,KAAKsW,QAAQ,QAAKo/D,EAAQ,mBAAqB,sBAAuB,CAACC,IACxF,E,+GC9Qa,MAAME,EAqBnB91E,YAAY8tB,GAfJ,KAAA9R,OAAS,EACV,KAAA+5D,UAAW,EAEX,KAAAvnE,QAAmC,KAEnC,KAAAwnE,UAAW,EACV,KAAA33D,YAAa,EACb,KAAAxH,YAAa,EACb,KAAAsxB,gBAAiB,EACjB,KAAA8tC,aAAqC,SA8FtC,KAAA/hE,QAAWlM,I,UACbA,IACD,OAAYA,GAGX/H,KAAKgc,UAAUzI,UAAUqB,SAAS,UACtB,QAAb,EAAA5U,KAAKi2E,gBAAQ,mBAAGluE,GAEI,QAApB,EAAY,QAAZ,EAAA/H,KAAKuO,eAAO,eAAEs/B,cAAM,gB,EAzFnBhgB,IACD,OAAW7tB,KAAM6tB,GAGhB7tB,KAAK+1E,WACN/1E,KAAKkoC,gBAAiB,EAE1B,CAEOguC,mBAAmBroD,EAGrB,CAAC,GACA7tB,KAAKgc,YACPhc,KAAKgc,UAAY3Q,SAASC,cAAc,OACxCtL,KAAKgc,UAAUzI,UAAUxS,IAAI,uBAE1B8sB,EAAQyjB,OACTtxC,KAAKgc,UAAUzI,UAAUxS,IAAI,aAAe8sB,EAAQyjB,OAGnDzjB,EAAQsoD,MACTn2E,KAAKgc,UAAUzI,UAAUxS,IAAI,kBAG5Bf,KAAK4W,YACN5W,KAAKgc,UAAUzI,UAAUxS,IAAI,wBAGnC,CAEOq1E,wBACLp2E,KAAKk2E,oBACP,CAEO/qE,YACLnL,KAAKmL,UAAY,KAEjBnL,KAAKk2E,qBAELl2E,KAAKgc,UAAUwD,UAAY,0HAEmDxf,KAAK4W,WAAa,cAAgB,+DACvE5W,KAAK4W,WAAa,KAAO,aAAa5W,KAAK4W,WAAa,KAAO,YAAY5W,KAAK4W,WAAa,GAAK,mEAIxI5W,KAAK4W,WACN5W,KAAKooC,YAAc,mBAEnBpoC,KAAKooC,YAAc,mBAGlBpoC,KAAKoe,YACNpe,KAAKgc,UAAUwD,WAAa,kxEAc5Bxf,KAAKq2E,YAAcr2E,KAAKgc,UAAU4K,iBAClC5mB,KAAKs2E,UAAYt2E,KAAKq2E,YAAYE,wBAElCv2E,KAAKgc,UAAUzI,UAAUxS,IAAI,mBAG/Bf,KAAKmoC,OAASnoC,KAAKgc,UAAUzG,kBAAkBA,kBAAkBA,kBAE9DvV,KAAKoe,aACN,QAAiBpe,KAAKgc,UAAWhc,KAAKiU,QAE1C,CAcO+5B,oBAAoBwoC,GACzBx2E,KAAKi2E,SAAWO,CAClB,CAEO9pD,YACL1sB,KAAKgc,UAAUzI,UAAUxS,IAAI,UAC7Bf,KAAKsgB,YAAY,EACnB,CAEOiM,cAAche,GACnB,GAAGvO,KAAK+1E,UAAY/1E,KAAKuO,QAAS,OAElCvO,KAAKuO,QAAUA,EAEf,MAAMwN,IAAW/b,KAAK+b,OAChB06D,EAAY1uD,KAAKC,MAEjB0uD,EAASlxE,IAGb,GAFA+I,EAAQooE,OAASpoE,EAAQm/B,UAAY,KAElC3xB,IAAW/b,KAAK+b,OACjB,OAGF,MAAM66D,EAAc7uD,KAAKC,MAAQyuD,EAIjC,IAAIjxE,GAAOxF,KAAKoe,WAAY,CAC1Bpe,KAAKsgB,YAAY,KAEjB,MAAM+B,EAAQw0D,IAEXD,EAAcv0D,EACfriB,KAAK4rB,SAELlpB,YAAW,KACNqZ,IAAW/b,KAAK+b,QACjB/b,KAAK4rB,Q,GAENvJ,E,MAGFriB,KAAKkoC,gBACNloC,KAAK0rB,OAAO1rB,KAAKgc,UAAU/C,gBAC3B,SAAQ,KACNjZ,KAAK0sB,WAAW,KAGlB1sB,KAAK4rB,SAIT5rB,KAAKuO,QAAUA,EAAU,IAAI,EAG/BA,EACCD,MAAK,IAAMooE,EAAM,QACjBz+D,OAAOzS,GAAQkxE,EAAMlxE,KAEnB+I,EAAQuoE,mBACTvoE,EAAQuoE,mBAAmBzwE,IAKzB,GAAG0V,IAAW/b,KAAK+b,OAAQ,OAG3B,MAAM4kD,EAAWt6D,EAAQsnC,KAAOtnC,EAAQunC,MAAQ,IAChD5tC,KAAKsgB,YAAYqgD,EAAS,GAGhC,CAEOj1C,OAAO6c,EAAe53B,GAAQ,EAAOpC,G,MAC5B,QAAd,EAAAvO,KAAKmL,iBAAS,oBAEXnL,KAAKgc,UAAU/C,eAChBjZ,KAAKgc,UAAUzI,UAAU/Q,OAAO,UAGlCxC,KAAK81E,UAAW,EAEbvnE,GACDvO,KAAKusB,cAAche,GAGrB,IAAIwoE,EAAU,GACX/2E,KAAK81E,UAAY91E,KAAKgc,UAAU/C,gBAAkBsvB,KACnDwuC,GAAU,OAAQ/2E,KAAKgc,WAAa,EAAI,EACrChc,KAAKgc,UAAU/C,gBAAkBsvB,GAClCA,EAAKvoC,KAAKg2E,cAAch2E,KAAKgc,aAIjC,OAAc,CACZ9Z,QAASlC,KAAKgc,UACdX,UAAW,aACX4/B,UAAU,EACVp0C,SA/NkB,IAgOlBkwE,YAGC/2E,KAAKoe,YAAczN,GACpB3Q,KAAKsgB,YAAY,EAErB,CAEOsL,S,MACF5rB,KAAK81E,WAKR91E,KAAK81E,UAAW,GAIC,QAAd,EAAA91E,KAAKgc,iBAAS,eAAE/C,iBAYjB,OAAc,CACZ/W,QAASlC,KAAKgc,UACdX,UAAW,aACX4/B,UAAU,EACVp0C,SAlQgB,IAmQhBwtB,gBAAiB,KACfr0B,KAAKgc,UAAUxZ,QAAQ,EAEzBu0E,QAAS,IAKf,CAEOz2D,YAAYqgD,GACjB,GAAI3gE,KAAKooC,cAAgB,OAAQpoC,KAAKmoC,QAItC,GAAgB,IAAbw4B,EAKH,IACE3gE,KAAKooC,cAALpoC,KAAKooC,YAAgBpoC,KAAKmoC,OAAO6uC,kBAGjCh3E,KAAKmoC,OAAO58B,MAAM0rE,gBAAuBzwE,KAAKC,IAAI,EAAGk6D,EAAW,IAAM3gE,KAAKooC,aAAe,KAAOpoC,KAAKooC,WAC3F,CAAX,MAAM5iC,GAAK,MATXxF,KAAKmoC,OAAO58B,MAAM0rE,gBAAkB,EAUxC,E,udCnRK,SAAeC,EACpBpsD,EACA9iB,EACA8wB,EACAjxB,EACA2iB,EAAM,IAAItE,MACV+pB,GAAY,G,yCAEZ,MAAM3rB,QAAUrG,EAAA,qDAA6DjW,EAAQ8wB,EAAOjxB,GACtF+iB,EAActG,EAAEwlB,OAChBo/B,EAAS5kD,EAAE4kD,OAIjB,IAAIiO,EACA5kD,EACA6kD,EACJ,GALA5sD,EAAIjX,UAAUxS,IAAI,gBAKfmoE,EAED32C,EAAW,MACT,EAAAhJ,EAAA,GAAeuB,EAAKN,GACpBM,EAAIzE,QAAQirB,MAAQ,EAAE,MAEnB,CACL,MAAMtb,EAAU/X,EAAA,6BACb+X,GACDxL,EAAIjX,UAAUxS,IAAI,WAGpB,IAAIs2E,GAAe,EACnB,GAAY,cAATxvE,EAAsB,CACvB,MAAMspB,QAAY+lD,EAAUpsD,EAAK9iB,EAAQ8wB,EAAO,eAChDq+C,EAAqBhmD,EAAImmD,kBAAoBnmD,EAAIvG,YACjDwsD,EAAajmD,EAAIimD,U,MACZ,GAAGt+C,EAAMy+C,eAAgB,CAC9BH,EAAa,IAAIlxD,MACjB4E,EAAIvX,UAAUxS,IAAI,mBAClBq2E,EAAW7jE,UAAUxS,IAAI,eAAgB,0BACzC,MAAM2G,GAAM,EAAA8vE,EAAA,GAAuB1+C,EAAMy+C,gBACzCJ,GAAqB,EAAAzvD,EAAA,IAA0B0vD,EAAY1vE,GAAK4G,MAAK,KAChE+oE,IAIH,EAAA9tD,EAAA,GAAeuB,EAAKssD,EAAW,G,CAInC7kD,EAAW,KACT8kD,GAAe,EAEZD,EACDtsD,EAAIpf,OAAO8e,IAEX,EAAAjB,EAAA,GAAeuB,EAAKN,GAGtB9nB,YAAW,KACNooB,EAAI4E,mBACL+nD,EAAA,gBAA4BjtD,GAAK,KAC/BM,EAAIzE,QAAQirB,MAAQ,GAEjBtb,GACDxL,EAAIjX,UAAU/Q,OAAO,WAGvB40E,SAAAA,EAAY50E,QAAQ,G,GAGvBwzB,EAAU,IAAM,EAAE,C,CAIzB,MAAM0hD,EAAgB9sD,EACrBtc,MAAM5G,IAAQ,EAAAggB,EAAA,IAA0B8C,EAAK9iB,KAC7C4G,KAAKikB,GAIN,OAFA4kD,UAA4BA,EAAmBl/D,MAAMkgB,EAAA,IAE9C,CACL+wC,SACAt+C,YAAa8sD,EACbJ,iBAAkBpO,EAASwO,EAAgBP,GAAsB/1D,QAAQjT,UACzEipE,aAEJ,G,CAEA,SAASxzE,EACPknB,EACAtL,EACA8xB,EACAv9B,EACAqvB,EACAikC,IAEA,EAAA5sC,EAAA,GAAa3P,EAAKtL,GAClBsL,EAAIzE,QAAQirB,MAAQA,EACpBxmB,EAAIvX,UAAU/Q,OAAO,cAAe,uBAAwB,qBAAsB,WAAY,YAC9FuR,GAAQ+W,EAAIvX,UAAUxS,IAAIgT,GAC1BqvB,GAAWtY,EAAIvX,UAAUxS,IAAI,YAC7BsmE,GAAWv8C,EAAIvX,UAAUxS,IAAI,WAC/B,CAGe,SAAemvC,GAAS,IACrCplB,EAAG,OACH9iB,EAAM,SACNy/B,GAAW,EAAK,MAChB14B,EAAQ,GAAE,UACVkhC,GAAY,EAAK,MACjBE,EAAK,SACLl9B,EAAQ,YACR88B,EAAc,CAAC,I,iDAWf,MAAM4nC,EAAO15D,EAAA,OAEb,GAAGjW,IAAW2vE,GAAQlwC,EAEpB,YADA7jC,EAAIknB,EAAK,GAAI,GAAI,eAInB,MAAM7jB,EAAWgX,EAAA,WAEjB,GAAGhL,EAAU,CACX,MAAM03D,QAAc1jE,EAASy3B,eAAek5C,cAAc5vE,EAAQiL,GAOlE,OANArP,EAAIknB,EAAK,GAAI,QAAI7mB,OAAWA,GAAW,GAEpC8rC,EAAYkjB,iBACbnoC,EAAIvf,MAAMssE,YAAY,SAAU9nC,EAAYkjB,gBAAgB3vC,MAAQ,OAG/D,OAAc,OAAD,wBACfysB,GAAW,CACd46B,QACAtsD,eAAe,KACd/P,MAAMyF,IACP+W,EAAIoU,gBAAgBnrB,EAAK,G,CAI7B,MAAM4oB,QAAa11B,EAASqI,gBAAgBstB,QAAQ50B,GACpD,GAAGA,IAAW,MAAgBA,EAAOo3B,WAAuC,QAA1B,EAAAzC,aAAI,EAAJA,EAAoBlvB,cAAM,eAAE4yB,SAE5E,YADAz8B,EAAIknB,EAAK,IAAI,EAAAgtD,EAAA,GAAiB9vE,GAAS,wBAIzC,MAAMo7B,KAA0C,QAA9B,EAACzG,aAAI,EAAJA,EAAuBlvB,cAAM,eAAEsqE,OAC5ClwE,EAAsBsoC,EAAQ,YAAc,cAC5CrX,GAAQ,EAAAvpB,EAAA,GAAaotB,GACrBq7C,IAAoBl/C,EACpBm/C,IAAmBntD,EAAIvV,oBAAuBuV,EAAIvV,kBAAkChC,UAAUqB,SAAS,SAC7G,IAAIojE,IAAoBC,WAA0BhxE,EAASixE,kBAAkBC,eAAenwE,EAAQH,IAAQ,CAC1G,IAAIypC,EAAQ,GAKZ,IAJGtpC,GAAWA,IAAW2vE,GAASlwC,IAChC6J,GAAQ,EAAAwmC,EAAA,GAAiB9vE,IAGxBA,IAAW,KAEZ,YADApE,EAAIknB,EAAK,GAAIwmB,EAAO,sBAItB,MAAMsR,EAAO7zC,GAAQ,EAAA2rB,EAAA,GAAiB3rB,GC1L3B,SAAyB4tB,G,MACtC,IAAI1Y,EAAM,GAQV,OAPG0Y,IACD1Y,EAA+B,QAAxB,EAAA0Y,EAAmB5tB,aAAK,QAAI,CAChC4tB,EAAmBy7C,WACnBz7C,EAAmB07C,WACpBj/C,OAAOC,SAAS7U,KAAK,OAGlB,EAAAkW,EAAA,GAAiBzW,EAC1B,CDgLmDq0D,CAAgB37C,GAC/D/4B,EAAIknB,EAAK83B,EAAMtR,EAAO,GAAIlO,E,CAI5B,OAAG40C,EACed,EAAUpsD,EAAK9iB,EAAQ8wB,EAAOjxB,OAAM5D,EAAWgsC,QADjE,C,iCEhMK,SAASzM,EAAa+E,EAAegwC,GAAY,GACtD,MAAMnjE,EAAO,wMAKb,GAAGmjE,EAAW,CACZ,MAAMztD,EAAMzf,SAASC,cAAc,OAQnC,OAPAwf,EAAIvX,UAAUxS,IAAI,aAClB+pB,EAAItL,UAAYpK,EAEbmzB,GACDA,EAAK/wB,YAAYsT,GAGZA,C,CAIT,OADAyd,EAAKhwB,mBAAmB,YAAanD,GAC9BmzB,EAAK3hB,gBACd,CAIO,SAAS4xD,EAAgBjwC,EAAyBx0B,EAAO,SAK9D,OAJAw0B,EAAKh1B,UAAU/Q,OAAO,SAAWuR,GACjCw0B,EAAKmI,UAAW,EAChBlN,EAAa+E,GAEN,KACLA,EAAK/oB,UAAY,GACjB+oB,EAAKh1B,UAAUxS,IAAI,SAAWgT,GAC9Bw0B,EAAKqf,gBAAgB,WAAW,CAEpC,C,gCAZA,gBAA8BpkB,C,2FCnBf,MAAMi1C,EAKnB14E,YAAY8tB,GAQV,MAAM2Z,EAAQxnC,KAAKwnC,MAAQn8B,SAASC,cAAc,SAClDk8B,EAAMj0B,UAAUxS,IAAI,eAEjB8sB,EAAQ6qD,YACTlxC,EAAMj0B,UAAUxS,IAAI,qBAGtB,MAAMgwB,EAAQ/wB,KAAK+wB,MAAQ1lB,SAASC,cAAc,SAClDylB,EAAMnvB,KAAO,QACImvB,EAAM7Y,KAAO,eAAiB2V,EAAQ3V,KAEpD2V,EAAQnhB,QACTqkB,EAAMrkB,MAAQmhB,EAAQnhB,MAEnBmhB,EAAQkxB,WACT,eAA2BzwC,MAAMwe,IAC/BiE,EAAM6U,SAAU,OAAgB9Y,EAAOe,EAAQkxB,YAAclxB,EAAQnhB,KAAK,IAG5EqkB,EAAMnjB,iBAAiB,UAAU,KAC/B,sCAA4CigB,EAAQkxB,SAAUlxB,EAAQnhB,MAAM,MAKlF,MAAM6S,EAAOvf,KAAKuf,KAAOlU,SAASC,cAAc,OAChDiU,EAAKhM,UAAUxS,IAAI,oBAEhB8sB,EAAQ7Z,KACTuL,EAAKC,UAAYqO,EAAQ7Z,KAWjB6Z,EAAQspC,UAChB,QAAM53C,EAAMsO,EAAQspC,SAGtB3vB,EAAM97B,OAAOqlB,EAAOxR,EACtB,CAEIqmB,cACF,OAAO5lC,KAAK+wB,MAAM6U,OACpB,CAEIA,YAAQA,GACV5lC,KAAKk/C,iBAAiBtZ,GAEtB,MAAM1O,EAAQ,IAAIuoB,MAAM,SAAU,CAACxC,SAAS,EAAM7+B,YAAY,IAC9Dpe,KAAK+wB,MAAM3nB,cAAc8tB,EAC3B,CAEOgoB,iBAAiBtZ,GACtB5lC,KAAK+wB,MAAM6U,QAAUA,CACvB,E,8BC9Ea,SAAS+yC,EAAUC,EAA6DnoD,GAC7F,MAAMooD,EAAOxtE,SAASC,cAAc,QAYpC,OAVAstE,EAAO7zE,SAASuf,IACd,MAAM,UAAClZ,EAAS,MAAE2lB,GAASzM,EAC3Bu0D,EAAKntE,OAAON,GACZ2lB,EAAMnjB,iBAAiB,UAAW7F,IAC7BgpB,EAAM6U,SACPnV,EAASM,EAAMrkB,MAAO3E,E,GAExB,IAGG8wE,CACT,C,+FCVe,MAAMC,EAyBnB/4E,YACE8tB,EAQAnhB,EAAQ,GA7BH,KAAA0T,WAAY,EAIX,KAAA24D,OAKH,CAAC,EAOI,KAAA55D,gBAAiB,EACjB,KAAA2gD,cAAe,EACf,KAAA78C,UAAW,EA0DX,KAAAm2B,YAAeliB,IACvBl3B,KAAK8rC,MAAM5U,EAAM,EAGT,KAAAmhB,YAAenhB,I,MACvBl3B,KAAKuiB,KAAOviB,KAAKoL,UAAUoX,wBAC3BxiB,KAAKogB,WAAY,EACjBpgB,KAAK8rC,MAAM5U,GACXl3B,KAAKoL,UAAUmI,UAAUxS,IAAI,eAClB,QAAX,EAAAf,KAAK+4E,cAAM,eAAE1gC,cAAer4C,KAAK+4E,OAAO1gC,YAAYnhB,EAAM,EAGlD,KAAA5X,UAAa4X,I,MACrBl3B,KAAKogB,WAAY,EACjBpgB,KAAKoL,UAAUmI,UAAU/Q,OAAO,eACrB,QAAX,EAAAxC,KAAK+4E,cAAM,eAAEz5D,YAAatf,KAAK+4E,OAAOz5D,UAAU4X,EAAM,EAQjD,KAAAwN,QAAU,K,MACf,MAAMh4B,GAAS1M,KAAKggE,KAAKtzD,MACzB1M,KAAKg5E,UAAUtsE,IACJ,QAAX,EAAA1M,KAAK+4E,cAAM,eAAE15D,UAAWrf,KAAK+4E,OAAO15D,QAAQ3S,EAAM,GAvElD,OAAW1M,KAAM6tB,GAEjB7tB,KAAKoL,UAAYC,SAASC,cAAc,OACxCtL,KAAKoL,UAAUmI,UAAUxS,IAAI,iBAG1Bf,KAAK8/D,aACN9/D,KAAKoL,UAAUmI,UAAUxS,IAAI,iBACrBf,KAAKmf,gBACbnf,KAAKoL,UAAUmI,UAAUxS,IAAI,mBAG/Bf,KAAKi5E,OAAS5tE,SAASC,cAAc,OACrCtL,KAAKi5E,OAAO1lE,UAAUxS,IAAI,yBAE1B,MAAMi/D,EAAOhgE,KAAKggE,KAAO30D,SAASC,cAAc,SAChD00D,EAAKzsD,UAAUxS,IAAI,uBAEnBi/D,EAAKp+D,KAAO,QACZo+D,EAAK9gD,KAAO,GAAKlf,KAAKkf,KACtB8gD,EAAKp5D,IAAM,GAAK5G,KAAK4G,IACrBo5D,EAAKv5D,IAAM,GAAKzG,KAAKyG,IACrBu5D,EAAKtzD,MAAQ,GAAKA,EAEfA,GACD1M,KAAKsgB,YAAY5T,GAGnB,MAAMwsE,EAAU,GAAKl5E,KAAKkf,KACpBkP,EAAQ8qD,EAAQ/+D,QAAQ,KAC9Bna,KAAKm5E,UAAsB,IAAX/qD,EAAe,EAAI8qD,EAAQr2E,OAASurB,EAAQ,EAI5DpuB,KAAKoL,UAAUM,OAAO1L,KAAKi5E,OAAQjZ,EACrC,CAEItzD,YACF,OAAQ1M,KAAKggE,KAAKtzD,KACpB,CAEO0S,YAAY25D,GACjB/4E,KAAK+4E,OAASA,CAChB,CAoBO1kE,eACLrU,KAAKggE,KAAKpyD,iBAAiB,QAAS5N,KAAK0kC,SACzC1kC,KAAKo5E,kBAAmB,OAAoBp5E,KAAKoL,UAAWpL,KAAKq4C,YAAar4C,KAAKo5C,YAAap5C,KAAKsf,UACvG,CAQOgB,YAAY5T,GACjB1M,KAAKggE,KAAKtzD,MAAQ,GAAKA,EACvB1M,KAAKg5E,WAAWh5E,KAAKggE,KAAKtzD,MAC5B,CAEOsU,YAAYtU,GACjB1M,KAAKggE,KAAKtzD,MAAQ,KAAO1M,KAAKggE,KAAKtzD,MAAQA,GAC3C1M,KAAKg5E,WAAWh5E,KAAKggE,KAAKtzD,MAC5B,CAEOssE,UAAUtsE,GACf,IAAIi0D,GAAYj0D,EAAQ1M,KAAK4G,MAAQ5G,KAAKyG,IAAMzG,KAAK4G,KACrD+5D,GAAW,OAAMA,EAAU,EAAG,GAG3B3gE,KAAK8/D,aACN9/D,KAAKi5E,OAAO1tE,MAAMsR,UAAY,UAAU8jD,KAExC3gE,KAAKi5E,OAAO1tE,MAAM+X,MAAoB,IAAXq9C,EAAkB,GAEjD,CAEU70B,MAAM5U,G,MACd,MAAMmiD,EAAUr5E,KAAKijB,SAAWjjB,KAAKuiB,KAAKmB,OAAS1jB,KAAKuiB,KAAKe,MACvDg2D,GAAkB,OAAMt5E,KAAKijB,WAAaiU,EAAM/P,EAAInnB,KAAKuiB,KAAK8qD,QAAUn2C,EAAMhQ,EAAIlnB,KAAKuiB,KAAKI,KAAM,EAAG02D,GAE3G,IAAI3sE,EAAQ1M,KAAK4G,IAAO0yE,EAAkBD,GAAWr5E,KAAKyG,IAAMzG,KAAK4G,KAerE,OAbI8F,EAAQ1M,KAAK4G,KAAS5G,KAAKyG,IAAMzG,KAAK4G,KAAO,IAC/C8F,GAAS1M,KAAKkf,KAAO,IAGvBxS,GAASA,EAAMgrC,QAAQ13C,KAAKm5E,UAC5BzsE,GAAQ,OAAMA,EAAO1M,KAAK4G,IAAK5G,KAAKyG,KAKpCzG,KAAKsgB,YAAY5T,IACN,QAAX,EAAA1M,KAAK+4E,cAAM,eAAE15D,UAAWrf,KAAK+4E,OAAO15D,QAAQ3S,GAErCA,CACT,CAEOiP,kBACF3b,KAAKo5E,mBACNp5E,KAAKo5E,mBACLp5E,KAAKo5E,iBAAmB,MAG1Bp5E,KAAKggE,KAAKtuD,oBAAoB,QAAS1R,KAAK0kC,SAE5C1kC,KAAK+4E,OAAS,CAAC,CACjB,E,+GChKF,IAAIQ,EAAgB,EACL,SAASvkD,EACtBuT,EACAhW,EAAoD,KAAMnR,QAAQjT,WAClEuoE,EAA8B,KAC9B1+D,GAAU,EACVwhE,EAAmBjxC,GAGnB,GAAGA,EAAK3wB,cAAc,aAAc,OACpC2wB,EAAKh1B,UAAUxS,IAAI,MAEnB,MAAMujB,EAAIjZ,SAASC,cAAc,OAUjC,IAAImuE,EATJn1D,EAAE/Q,UAAUxS,IAAI,YAECwnC,EAAKh1B,UAAUqB,SAAS,cAEvC0P,EAAE/Q,UAAUxS,IAAI,aAGlBwnC,EAAKvwB,EAAU,UAAY,UAAUsM,GAIrC,MAAMo1D,EAAa,CAAChc,EAAiB0Q,KACnC,MAAMqI,EAAY1uD,KAAKC,MACjBmgB,EAAS98B,SAASC,cAAc,OAEhCquE,EAAUJ,IAMV1yE,EAA8G,KAArF6M,OAAOoQ,iBAAiBQ,GAAGP,iBAAiB,qBAAqB4C,QAAQ,IAAK,IAGvGizD,EAAWH,EAAU,KAMzB,MAAM7C,EAAc7uD,KAAKC,MAAQyuD,EAC3BrmE,EAAK,KAET,YAAqB,KACnB+3B,EAAO3lC,QAAQ,IAGjBk0E,SAAAA,EAAQiD,EAAQ,EAElB,GAAG/C,EAAc/vE,EAAU,CACzB,MAAMwb,EAAQ7b,KAAKC,IAAII,EAAW+vE,EAAa/vE,EAAW,GAC1DnE,YAAW,IAAMylC,EAAO50B,UAAUxS,IAAI,WAAWyF,KAAKC,IAAI4b,EAAQxb,EAAW,EAAG,IAEhFnE,WAAW0N,EAAIiS,E,MAEf8lB,EAAO50B,UAAUxS,IAAI,UACrB2B,WAAW0N,EAAIvJ,EAAW,GAGxB,MACF6M,OAAOhC,oBAAoB,cAAe+nE,GAC1C/lE,OAAOhC,oBAAoB,YAAa+nE,IAG1CA,EAAU,KACVI,GAAkB,CAAK,EAIzBtnD,SAAAA,EAAWonD,IAeX,SAAQ,KACN,GAAGC,IAAaH,EACd,OAGF,MAAMl3D,EAAO+B,EAAE9B,wBACf2lB,EAAO50B,UAAUxS,IAAI,oBAErB,MAAMsjE,EAAS3G,EAAUn7C,EAAKI,KACxBm3D,EAAS1L,EAAU7rD,EAAKa,IAGxBvb,EADSrB,KAAKyvC,KAAK,SAACzvC,KAAKuZ,IAAI+5D,EAASv3D,EAAKmB,OAAS,GAAKnB,EAAKmB,OAAS,EAAM,GAAI,SAACld,KAAKuZ,IAAIskD,EAAS9hD,EAAKe,MAAQ,GAAKf,EAAKe,MAAQ,EAAM,IAIzI4D,EAAIm9C,EAASx8D,EAAO,EACpBsf,EAAI2yD,EAASjyE,EAAO,EAI1BsgC,EAAO58B,MAAM+X,MAAQ6kB,EAAO58B,MAAMmY,OAAS7b,EAAO,KAClDsgC,EAAO58B,MAAMoX,KAAOuE,EAAI,KACxBihB,EAAO58B,MAAM6X,IAAM+D,EAAI,KAgBvB7C,EAAE5Y,OAAOy8B,E,GAST,EAIE4xC,EAAoBhyE,GAAaA,EAAE1H,SAAWkoC,IAClD,CAAC,SAAU,KAAKxzB,SAAUhN,EAAE1H,OAAuB6c,WACjD,OAAgBnV,EAAE1H,OAAuB,cAAgBikB,KAE3Dk1D,IAAqBjxC,KAClB,OAAcxgC,EAAE1H,OAAuBm5E,IAI5C,IAAIK,GAAkB,EACtB,GAAG,IAAoB,CACrB,MAAMG,EAAW,KACfP,SAAAA,GAAW,EAGbD,EAAiB5rE,iBAAiB,cAAe7F,IAC/C,IAAI,+BACF,OAIF,GAAGA,EAAE6lB,QAAQ/qB,OAAS,GAAKg3E,GAAmBE,EAAiBhyE,GAC7D,OAIF8xE,GAAkB,EAElB,MAAM,QAACnc,EAAO,QAAE0Q,GAAWrmE,EAAE6lB,QAAQ,GACrC8rD,EAAWhc,EAAS0Q,GACpBoL,EAAiB5rE,iBAAiB,WAAYosE,EAAU,CAAC/rE,MAAM,IAE/DyF,OAAO9F,iBAAiB,aAAc7F,IACpCA,EAAE4qB,cAAe,EACjB5qB,EAAE6lE,kBACFoM,IACAR,EAAiB9nE,oBAAoB,WAAYsoE,EAAS,GACzD,CAAC/rE,MAAM,GAAM,GACf,CAACgU,SAAS,G,MAEbu3D,EAAiB5rE,iBAAiB,aAAc7F,IAC9C,IAAI,CAAC,EAAG,GAAGgN,SAAShN,EAAEuO,QACpB,OAGF,IAAI,+BACF,OAIF,GAAuC,MAApCkjE,EAAiBnzD,QAAQ2O,QAAkB+kD,EAAiBhyE,GAC7D,OACK,GAAG8xE,EAER,YADAA,GAAkB,GAIpB,MAAM,QAACnc,EAAO,QAAE0Q,GAAWrmE,EAC3B2xE,EAAWhc,EAAS0Q,GACpB16D,OAAO9F,iBAAiB,UAAW6rE,EAAS,CAACxrE,MAAM,EAAMgU,SAAS,IAClEvO,OAAO9F,iBAAiB,cAAe6rE,EAAS,CAACxrE,MAAM,EAAMgU,SAAS,GAAM,GAC3E,CAACA,SAAS,GAEjB,C,kLCjMA,MAAMg4D,EAAa,CAAC/3E,EAAsByQ,MACzB,IAAZA,IAE2B,iBAAd,GACd,OAAazQ,EAASyQ,GAEtBzQ,EAAQwJ,OAAOiH,G,EAMJ,MAAMunE,EAoBnBn6E,YAAY8tB,EAwBP,CAAC,GA/BC,KAAAoW,SAAU,EAgCZpW,EAAQssD,uBACTtsD,EAAQ0Z,cAAgB,IAAI,IAAc,OAAD,QACvC11B,eAAgBgc,EAAQhc,gBACrBgc,EAAQssD,wBAIf,MAAMj9D,EAAU2Q,EAAQ0iB,OAAS,IAAO1iB,EAAQusD,YAAcvsD,EAAQ0Z,cAAgB,QAAU,MAQhG,GAPAvnC,KAAKoL,UAAYC,SAASC,cAAc4R,GACxCld,KAAKoL,UAAUmI,UAAUxS,IAAI,MAAO,eAEjC8sB,EAAQwsD,QACTr6E,KAAKoL,UAAUmI,UAAUxS,IAAI,WAG5B8sB,EAAQwN,SAAU,CACnB,MAAMA,EAAWr7B,KAAKq7B,SAKtB,GAJA4+C,EAAW5+C,EAAUxN,EAAQwN,UAE1BxN,EAAQwsD,QAAQh/C,EAAS9nB,UAAUxS,IAAI,WAEvC8sB,EAAQysD,cAAe,CACxBt6E,KAAKoL,UAAUM,OAAO1L,KAAKu6E,YAAcv6E,KAAKw6E,aAC9Cx6E,KAAKu6E,YAAYhnE,UAAUxS,IAAI,oBAC/B,MAAMu5E,EAAgBt6E,KAAKs6E,cAAgBjvE,SAASC,cAAc,OAClEgvE,EAAc/mE,UAAUxS,IAAI,eAAgB,sBAE5Ck5E,EAAWK,EAAezsD,EAAQysD,eAClCt6E,KAAKu6E,YAAY7uE,OAAO2vB,EAAUi/C,E,OAE5BzsD,EAAQ63C,iBAChB1lE,KAAKq7B,SAAS3vB,QAAO,QAAKmiB,EAAQ63C,gBAAiB73C,EAAQ4sD,mBAG7D,IAAIn/C,IAAgBzN,EAAQyN,YAC5B,GAAGzN,EAAQusD,YAAcvsD,EAAQ0Z,cAAe,CAO9C,GANG1Z,EAAQusD,aACTp6E,KAAKo6E,WAAavsD,EAAQusD,WAC1Bp6E,KAAKoL,UAAUM,OAAO1L,KAAKo6E,WAAW5yC,OACtClM,GAAc,GAGbzN,EAAQ0Z,cAAe,CACxBvnC,KAAKunC,cAAgB1Z,EAAQ0Z,cAE7B,MAAMmzC,EAAW7sD,EAAQ0Z,cAAcC,MAAMj0B,UAAUqB,SAAS,yBAShE,GARG8lE,GACD16E,KAAKoL,UAAUmI,UAAUxS,IAAI,mBAC7B8sB,EAAQuN,WAAap7B,KAAKunC,cAAcC,QAExClM,GAAc,EACdt7B,KAAKoL,UAAUM,OAAO1L,KAAKunC,cAAcC,QAGxC3Z,EAAQ8sD,uBAAyBD,EAAU,CAC5C,MAAMjqD,EAAW,MACf,OAAezwB,KAAKq7B,UAAU,QAAKr7B,KAAKunC,cAAcxW,MAAM6U,QAAU,mBAAqB,qBAAqB,EAG/G/X,EAAQhc,eAAgBgc,EAAQhc,eAAe9Q,IAAIf,KAAKunC,cAAcxW,MAA9ClD,CAAqD,SAAU4C,GACrFzwB,KAAKunC,cAAcxW,MAAMnjB,iBAAiB,SAAU6iB,E,GAInD5C,EAAQusD,YAAcvsD,EAAQ0Z,eACtCC,MAAMj0B,UAAUxS,IAAI,gB,CAGxB,GAAG8sB,EAAQ9e,OAAS8e,EAAQopC,aAAc,CACxC,IAAIl1B,EACJ,MAAM64C,EAAoB/sD,EAAQuN,YAAcvN,EAAQgtD,oBAkBxD,GAjBGD,GACD56E,KAAKoL,UAAUM,OAAOq2B,EAAI/hC,KAAK86E,SAAW96E,KAAKw6E,aAC/Cx6E,KAAK86E,SAASvnE,UAAUxS,IAAI,kBAE5BghC,EAAI/hC,KAAKoL,UAGXpL,KAAK+O,MAAQ/O,KAAK+6E,cACfltD,EAAQwsD,QAAQr6E,KAAK+O,MAAMwE,UAAUxS,IAAI,WACzC8sB,EAAQ9e,MACTkrE,EAAWj6E,KAAK+O,MAAO8e,EAAQ9e,OACvB8e,EAAQopC,cAChBj3D,KAAK+O,MAAMrD,QAAO,QAAKmiB,EAAQopC,eAGjCl1B,EAAEr2B,OAAO1L,KAAK+O,OAEX6rE,EAAmB,CACpB,MAAMx/C,EAAap7B,KAAKo7B,WAAa/vB,SAASC,cAAc,OAC5D8vB,EAAW7nB,UAAUxS,IAAI,YAAa,mBAEnC8sB,EAAQgtD,qBACTz/C,EAAW7nB,UAAUxS,IAAI,6BAG3Bk5E,EAAW7+C,EAAYw/C,GACvB74C,EAAEr2B,OAAO0vB,E,EAIVvN,EAAQ9Z,OACTunB,GAAc,EAEdt7B,KAAKoL,UAAUmI,UAAUxS,IAAI,QAAS,SAAW8sB,EAAQ9Z,MACzD/T,KAAKoL,UAAUmI,UAAUxS,IAAI,kBAG5Bu6B,GACDt7B,KAAKoL,UAAUmI,UAAUxS,IAAI,oBAG5B8sB,EAAQmtD,gBACTntD,EAAQuB,UAAY,IAAMvB,EAAQmtD,cAAc5vD,SAG/CyC,EAAQuB,WAAavB,EAAQusD,YAAcvsD,EAAQ0Z,iBACnB,mBAAvB1Z,EAAiB,YACzB,QAAiB7tB,KAAKoL,WAAYrD,IAC7B/H,KAAKikC,SACPpW,EAAQuB,UAAkBrnB,EAAE,GAC5B,CAAC8J,eAAgBgc,EAAQhc,iBAG9B7R,KAAKoL,UAAUmI,UAAUxS,IAAI,gBAAiB,gBAE1C8sB,EAAQ7O,WACV,OAAOhf,KAAKoL,eAAWnH,OAAWA,GAAW,KAQ9C4pB,EAAQknD,aAAelnD,EAAQotD,sBAChCj7E,KAAK+0E,YAAclnD,EAAQknD,uBAAuBvxE,YAChDqqB,EAAQknD,aACR,OAAO,gCAAiC,CAAC/gE,KAAM6Z,EAAQotD,qBACzDj7E,KAAKoL,UAAUM,OAAO1L,KAAK+0E,cAG1BlnD,EAAQ43C,cACT,OAAkB,OAAD,wBACZ53C,EAAQ43C,aAAW,CACtBte,SAAUnnD,KAAKoL,UACfyG,eAAgBgc,EAAQhc,iBAG9B,CAEWwpB,e,MACT,OAAqB,QAArB,EAAOr7B,KAAKk7E,iBAAS,QAAdl7E,KAAKk7E,UAAcl7E,KAAKm7E,gBACjC,CAEWC,e,MACT,OAAqB,QAArB,EAAOp7E,KAAKq7E,iBAAS,QAAdr7E,KAAKq7E,UAAcr7E,KAAKs7E,gBACjC,CAEQd,YACN,MAAMz4C,EAAI12B,SAASC,cAAc,OAEjC,OADAy2B,EAAExuB,UAAUxS,IAAI,WACTghC,CACT,CAEQg5C,cACN,MAAMhsE,EAAQ1D,SAASC,cAAc,OAGrC,OAFAyD,EAAMwE,UAAUxS,IAAI,cACpB,OAAagO,GACNA,CACT,CAEQosE,iBACN,MAAM9/C,EAAWhwB,SAASC,cAAc,OAMxC,OALA+vB,EAAS9nB,UAAUxS,IAAI,iBACvB,OAAas6B,GACVr7B,KAAK+O,MAAO/O,KAAK+O,MAAM8iD,MAAMx2B,GAC3Br7B,KAAKoL,UAAU4M,QAAQqjB,GAC5Br7B,KAAKoL,UAAUmI,UAAU/Q,OAAO,eACzB64B,CACT,CAEQigD,iBACN,MAAMF,EAAW/vE,SAASC,cAAc,OAGxC,OAFA8vE,EAAS7nE,UAAUxS,IAAI,gBACvBf,KAAKq7B,SAASpiB,cAAc1B,aAAa6jE,EAAUp7E,KAAKq7B,UACjD+/C,CACT,CAEOG,YAAY1zE,GACjB,MAAMnC,EAAQ2F,SAASC,cAAc,OACrC,OAAOtL,KAAKu7B,kBAAkB71B,EAAOmC,EACvC,CAEO0zB,kBAAkB71B,EAAoBmC,GAY3C,OAXA7H,KAAKoL,UAAUmI,UAAUxS,IAAI,oBAE7Bf,KAAK0F,MAAQA,EACbA,EAAM6N,UAAUxS,IAAI,aAEjB8G,GACDnC,EAAM6N,UAAUxS,IAAI,aAAe8G,GAGrC7H,KAAKoL,UAAUM,OAAOhG,GAEfA,CACT,CAEO81E,mBAAmBjtE,GACxBvO,KAAKoL,UAAUmI,UAAUxS,IAAI,eAC7BwN,EAAQ4J,SAAQ,KACdnY,KAAKoL,UAAUmI,UAAU/Q,OAAO,cAAc,GAElD,CAEOi5E,eACL,MAAMC,EAAWrwE,SAASC,cAAc,QACxCtL,KAAKoL,UAAUmI,UAAUxS,IAAI,eAAgB,SAC7C26E,EAASnoE,UAAUxS,IAAI,oBAAqB,cAC5Cf,KAAKoL,UAAUM,OAAOgwE,EACxB,CAEOC,cAAchqE,GACnB3R,KAAKoL,UAAUmI,UAAU1J,OAAO,aAAc8H,EAChD,EAGK,MAAMiqE,EAA8Br0C,GAClC,IAAI2yC,EAAI,CAAC3yC,gBAAe11B,eAAgB01B,EAAc11B,iBAGlDgqE,EAAoB,CAAC7mB,EAAavkC,KACtC,OAAUukC,EAAKl6C,KAAKwJ,IAAM,CAAElZ,UAAWkZ,EAAElZ,UAAW2lB,MAAOzM,EAAE81D,WAAWrpD,UAAUN,GAG9EqrD,EAAsB,CAACh0C,EAAiFrX,KACnH,MAAMvY,EAAO,SAA2B,QAAhB1R,KAAK8zC,SAAsB,GACnD,IAAIyhC,EACJ,MAAM/mB,EAAOltB,EAAOhtB,KAAI,EAAEsR,cAAa1f,QAAOk5B,cAC5C,MAAMzK,EAAM,IAAI++C,EAAI,CAClBE,WAAY,IAAI,IAAW,CACzBjjB,QAAS/qC,EACTlU,OACAxL,MAAO,GAAKA,MAQhB,OAJGk5B,IACDm2C,EAAoB5gD,EAAIi/C,YAGnBj/C,CAAG,IAGN09C,EAAOgD,EAAkB7mB,EAAMvkC,GAIrC,OAHGsrD,IACDA,EAAkBn2C,SAAU,GAEvBizC,CAAI,C,+GCxRN,MAAMmD,EAuBXj8E,YAAmBa,EAAkBq7E,EAAY,GAAW7wE,EAAyBC,SAASC,cAAc,QAAzF,KAAA1K,GAAAA,EAAyC,KAAAwK,UAAAA,EAnBrD,KAAA8wE,gBAA0B,EAE1B,KAAAC,mBAA6B,EAC7B,KAAAC,oBAA8B,EAM9B,KAAAC,4BAA6B,EAC1B,KAAAC,yBAA0B,EAmG7B,KAAAxlD,SAAW,KAOhB,GAAG92B,KAAKq8E,2BAGN,OAFAr8E,KAAKu8E,qBACLv8E,KAAKs8E,yBAA0B,IAK5Bt8E,KAAKw8E,eAAkBx8E,KAAK2wB,kBAAsB3wB,KAAKilC,SAAYjlC,KAAK2T,sBAC1E3T,KAAKk8E,kBAGRl8E,KAAKk8E,gBAAkBxoE,OAAOhR,YAAW,KACvC1C,KAAKk8E,gBAAkB,EAEvB,MAAMO,EAAiBz8E,KAAKoL,UAAUpL,KAAK08E,gBAC3C18E,KAAKo8E,oBAAsBp8E,KAAKm8E,qBAAuBM,EAAiB,EAAKz8E,KAAKm8E,mBAAqBM,EAAiB,GAAK,EAC7Hz8E,KAAKm8E,mBAAqBM,EAGvBz8E,KAAK2T,oBACN3T,KAAK2T,qBAGJ3T,KAAKohC,kBACNphC,KAAKohC,kB,GAlJoC,KAqJ1B,EA3HnBphC,KAAKoL,UAAUmI,UAAUxS,IAAI,cAE7Bf,KAAKke,KAAM,QAAO,UAAY+9D,EAAY,IAAMA,EAAY,IAAK,YAE9Dr7E,IACDsY,MAAMC,KAAKvY,EAAG20B,UAAUxwB,SAASg9B,GAAM/hC,KAAKoL,UAAUM,OAAOq2B,KAE7DnhC,EAAG8K,OAAO1L,KAAKoL,WAGnB,CAEOuxE,oBACF38E,KAAK48E,sBAIR58E,KAAK48E,qBAAsB,EAC3B58E,KAAKoL,UAAUwC,iBAAiB,SAAU5N,KAAK82B,SAAU,CAAC7U,SAAS,EAAMjN,SAAS,IACpF,CAEO6nE,uBACD78E,KAAK48E,sBAIT58E,KAAK48E,qBAAsB,EAC3B58E,KAAKoL,UAAUsG,oBAAoB,SAAU1R,KAAK82B,SAAU,CAAC9hB,SAAS,IACxE,CAEOX,eACFrU,KAAK88E,+BAIRppE,OAAO9F,iBAAiB,SAAU5N,KAAK82B,SAAU,CAAC7U,SAAS,IAC3DjiB,KAAK28E,oBAEL38E,KAAK88E,8BAA+B,SAAuB,KACzD98E,KAAKq8E,4BAA6B,EAE/Br8E,KAAKk8E,kBACNl8E,KAAKu8E,gBACLv8E,KAAKs8E,yBAA0B,E,IAEhC,KACDt8E,KAAKq8E,4BAA6B,EAE/Br8E,KAAKs8E,0BACNt8E,KAAK82B,WACL92B,KAAKs8E,yBAA0B,E,IAGrC,CAEO3gE,kBACD3b,KAAK88E,+BAITppE,OAAOhC,oBAAoB,SAAU1R,KAAK82B,UAC1C92B,KAAK68E,uBAEL78E,KAAK88E,+BACL98E,KAAK88E,kCAA+B74E,EACtC,CAEOF,UACL/D,KAAK2b,kBACL3b,KAAK2T,wBAAqB1P,EAC1BjE,KAAKw8E,mBAAgBv4E,EACrBjE,KAAK2wB,sBAAmB1sB,CAC1B,CAEOyH,UAAU0pD,GACfp1D,KAAKoL,UAAUM,UAAU0pD,EAC3B,CAEOl/B,kBAAkBrI,GAGvB,OAAO,OAAiB,OAAD,wBAClBA,GAAO,CACVziB,UAAWpL,KAAKoL,YAIpB,CAuCOmxE,gBACFv8E,KAAKk8E,kBAENzoE,aAAazT,KAAKk8E,iBAClBl8E,KAAKk8E,gBAAkB,EAE3B,EAMa,MAAMa,UAAmBf,EAKtCj8E,YAAYa,EAAkBq7E,EAAY,GAAWe,EAAiB,IAAKC,GACzE/qE,MAAMtR,EAAIq7E,GADyC,KAAAe,eAAAA,EAF9C,KAAA32B,UAAiC,CAACjjC,KAAK,EAAMiqD,QAAQ,GAiCrD,KAAAjsC,iBAAmB,KACxB,IAAKphC,KAAKw8E,gBAAkBx8E,KAAK2wB,iBAAmB,OAEpD,GAAG3wB,KAAKq8E,2BAEN,YADAr8E,KAAK82B,WAIP,MAAMF,EAAe52B,KAAKoL,UAAUwrB,aACpC,IAAIA,EACF,OAGF,MACMsmD,EAAetmD,EADA52B,KAAKoL,UAAUoiE,aAE9B92C,EAAY12B,KAAKm8E,mBAIpBn8E,KAAKw8E,eAAiB9lD,GAAa12B,KAAKg9E,gBAAkBh9E,KAAKo8E,qBAAuB,GACvFp8E,KAAKw8E,gBAGJx8E,KAAK2wB,kBAAqBusD,EAAexmD,GAAc12B,KAAKg9E,gBAAkBh9E,KAAKo8E,qBAAuB,GAC3Gp8E,KAAK2wB,kB,EA7CP3wB,KAAKoL,UAAUmI,UAAUxS,IAAI,gBAC7Bf,KAAKqU,eACLrU,KAAK08E,eAAiB,WACxB,CAEO5K,sBAAsBD,EAAa7xE,KAAKoL,WAC7C,MAAMgF,EAAKpQ,KAAK2T,mBAChB3T,KAAK2T,mBAAqB,KACxBvD,SAAAA,IACAyhE,EAAWt+D,UAAU1J,OAAO,gBAAiB7J,KAAK02B,WAClDm7C,EAAWt+D,UAAU1J,OAAO,kBAAmB7J,KAAKm9E,eAAe,EAGrEtL,EAAWt+D,UAAUxS,IAAI,eAAgB,kBAAmB,wBAC9D,CAEOyvB,oBAAoB5vB,GACzBZ,KAAKilC,QAAUrkC,EACfZ,KAAKke,IAAI,uBAAwBtd,EAAIZ,KACvC,CA8BOgY,WAAWwN,IACfxlB,KAAKilC,SAAWjlC,KAAKiqB,SAAWjqB,KAAKoL,WAAW4M,WAAWwN,EAC9D,CAEO9Z,UAAU8Z,IACdxlB,KAAKilC,SAAWjlC,KAAKiqB,SAAWjqB,KAAKoL,WAAWM,UAAU8Z,EAC7D,CAEO43D,mBACL,OAAOp9E,KAAK42B,aAAepwB,KAAKmD,MAAM3J,KAAK02B,UAAY12B,KAAKoL,UAAUyhE,aACxE,CAEIsQ,qBACF,OAAOn9E,KAAKo9E,oBAAsB,CACpC,CAEI1mD,cAAUvP,GACZnnB,KAAKoL,UAAUsrB,UAAYvP,CAC7B,CAEIuP,gBAEF,OAAO12B,KAAKoL,UAAUsrB,SACxB,CAEO2mD,qBAAqB3wE,GAC1B1M,KAAKm8E,mBAAqBzvE,EAC1B1M,KAAKs9E,wBAELt9E,KAAK02B,UAAYhqB,CACnB,CAEO4wE,wBACFt9E,KAAK88E,+BACN98E,KAAK68E,uBACL78E,KAAKoL,UAAUwC,iBAAiB,UAAW7F,KACzC,OAAYA,GACZ/H,KAAK28E,mBAAmB,GACvB,CAAC3nE,SAAS,EAAMiN,SAAS,EAAOhU,MAAM,IAE7C,CAEI2oB,mBACF,OAAO52B,KAAKoL,UAAUwrB,YACxB,EAGK,MAAM2mD,UAAoBvB,EAC/Bj8E,YAAYa,EAAiBq7E,EAAY,GAAWe,EAAiB,IAAYQ,EAAa,GAAWpyE,EAAyBC,SAASC,cAAc,QAKvJ,GAJA4G,MAAMtR,EAAIq7E,EAAW7wE,GAD6B,KAAA4xE,eAAAA,EAA6B,KAAAQ,WAAAA,EAAwB,KAAApyE,UAAAA,EAGvGpL,KAAKoL,UAAUmI,UAAUxS,IAAI,iBAEzB,IAAoB,CACtB,MAAM08E,EAAsB11E,KACtBA,EAAE21E,QAAU19E,KAAKoL,UAAUuyE,YAAc39E,KAAKoL,UAAU2iD,cAC1D/tD,KAAKoL,UAAU0iD,YAAc/lD,EAAEiW,OAAS,GACxC,OAAYjW,G,EAIhB/H,KAAKoL,UAAUwC,iBAAiB,QAAS6vE,EAAoB,CAACx7D,SAAS,G,CAGzEjiB,KAAK08E,eAAiB,YACxB,E,6ECrUF,MAAMrhE,EAAY,uBACH,MAAMuiE,EASnB79E,YAAY8tB,EAAiC,CAAC,G,MAC5C,MAAMziB,EAAYpL,KAAKoL,UAAYC,SAASC,cAAc,OAC1DF,EAAUmI,UAAUxS,IAAIsa,EAAY,cAEpC,MAAMgqB,EAAiBrlC,KAAKqlC,eAAiBh6B,SAASC,cAAc,OAOpE,GANA+5B,EAAe9xB,UAAUxS,IAAIsa,GAE1BwS,EAAQ6X,UACTL,EAAe9xB,UAAUxS,IAAI,aAG5B8sB,EAAQgwD,sBACTx4C,EAAe35B,QAAO,UACtB25B,EAAe9xB,UAAUxS,IAAI,4BACxB,GAAI8sB,EAAQ03C,YAIjBlgC,EAAe9xB,UAAUxS,IAAI,oBAJC,CAC9B,MAAM+8E,EAAKzyE,SAASC,cAAc,MAClC+5B,EAAe35B,OAAOoyE,E,CAaxB,MAAMnrE,EAAU3S,KAAK2S,QAAU3S,KAAK+9E,yBAEpC,GAAGlwD,EAAQ3V,KAAM,CACf,MAAMnJ,EAAQ/O,KAAK+O,MAAQ1D,SAASC,cAAc,OAClDyD,EAAMwE,UAAUxS,IAAI,kBAAmBsa,EAAY,UACnD,QAAM,CAACnZ,QAAS6M,EAAOvC,IAAKqhB,EAAQ3V,KAAMk9C,KAAMvnC,EAAQmwD,WACxDrrE,EAAQjH,OAAOqD,E,CAGjB3D,EAAUM,OAAO25B,GAEjB,MAAM/xB,EAAyB,QAAf,EAAAua,EAAQva,eAAO,QAAIua,EAAQowD,WAC3C,GAAG3qE,EAAS,CACV,MAAM1S,EAAKZ,KAAKsT,QAAUtT,KAAK+9E,yBAC/Bn9E,EAAG2S,UAAUxS,IAAIsa,EAAY,YAEzBwS,EAAQowD,YACV7yE,EAAUM,OAAO9K,IAGJ,IAAZ0S,IACD,QAAM,CAACpR,QAAStB,EAAI4L,IAAK8G,EAAS8hD,KAAMvnC,EAAQqwD,a,CAGtD,CAEOH,yBACL,MAAMprE,EAAUtH,SAASC,cAAc,OAQvC,OAPAqH,EAAQY,UAAUxS,IAAIsa,EAAY,YAMlCrb,KAAKqlC,eAAe35B,OAAOiH,GACpBA,CACT,EAGK,MAAMwrE,EAAkB,CAACr4C,EAAsB5tB,EAAoB5E,KACxE,MAAM8xB,EAAU,IAAIw4C,EAAe,CAAC1lE,OAAM5E,YAE1C,OADAwyB,EAASp6B,OAAO05B,EAAQh6B,WACjBg6B,EAAQzyB,OAAO,C,2NC1ET,MAAMyrE,UAAuB,IAA5C,c,oBAEU,KAAA35B,aAAyC,KAEzC,KAAA45B,WAAqB,CAgL/B,CAxKS7rD,KACLwS,EACAq5C,GAAqB,GAErBr+E,KAAKq+E,UAAYA,EACjBr+E,KAAKglC,QAAUA,EAEfhlC,KAAKoL,UAAUmI,UAAUxS,IAAI,uBAC7Bf,KAAKs+E,SAAS,YAEdt+E,KAAKqlD,WAAa,IAAI,KAAYC,IAChCtlD,KAAKykD,aAAea,CAAO,IAG7B,MAAMlgB,EAAU,IAAI,IAAe,CAAC,GAE9Bm5C,EAAelzE,SAASC,cAAc,OAC5CizE,EAAahrE,UAAUxS,IAAI,iBAE3Bf,KAAKw+E,oBAAsB,IAAI,KAAW,CACxCh3C,MAAO,yBACP01B,UAAW,MAGbl9D,KAAKy+E,wBAA0B,IAAI,KAAW,CAC5Cj3C,MAAO,eACPtvB,KAAM,WACNklD,aAAa,IAGfmhB,EAAa7yE,OACX1L,KAAKw+E,oBAAoBpzE,UACzBpL,KAAKy+E,wBAAwBrzE,WAG/BpL,KAAK6R,eAAe9Q,IAAIf,KAAKw+E,oBAAoBztD,MAAjD/wB,CAAwD,SAAS,KAE/D,IAAI0+E,IADU1+E,KAAKw+E,oBAAoB9xE,MACd7J,SAAW7C,KAAKw+E,oBAAoBztD,MAAMxd,UAAUqB,SAAS,SACnF5U,KAAKq+E,YAAWK,EAAaA,KAAgB1+E,KAAK2+E,sBAAwB3+E,KAAK4+E,qBAClF5+E,KAAKilD,QAAQ1xC,UAAU1J,OAAO,eAAgB60E,EAAW,IAG3D1+E,KAAKilD,SAAU,OAAa,CAAClxC,KAAM,gBAEnC,QAAiB/T,KAAKilD,SAAS,KAC7B,MAAMl2C,EAAQ/O,KAAKw+E,oBAAoB9xE,MAEvC,IAAI6B,EACJ,GAAGvO,KAAKq+E,UAAW,CACjB,IAAIr+E,KAAK4+E,sBAAwB5+E,KAAK2+E,mBAAoB,OAC1DpwE,EAAUvO,KAAKiH,SAASq5B,gBAAgBu+C,cAAc,CACpD9vE,QACAy5D,MAAO,GACPsW,UAAW,OAAF,QACPlvE,EAAG,iBACA5P,KAAK2+E,oBAEV/V,QAAS5oE,KAAK4+E,oBACdG,WAAW,IACVzwE,MAAM20B,IACJjjC,KAAKykD,cACNzkD,KAAKykD,eAAen2C,MAAM0wE,IACxBh/E,KAAKiH,SAASq5B,gBAAgB2+C,UAAUh8C,EAAQ+7C,EAAU,IAI3Dh/E,KAAKglC,QAAQniC,QACd7C,KAAKiH,SAASq5B,gBAAgB4+C,gBAAgBj8C,EAAQjjC,KAAKglC,SAGtD/B,I,MAGTjjC,KAAKilD,QAAQvU,UAAW,EACxBniC,EAAUvO,KAAKiH,SAASq5B,gBAAgB6+C,WAAWpwE,EAAO/O,KAAKglC,QAAQlqB,KAAK9S,GAAWA,EAAOs3B,cAAahxB,MAAM20B,IAC5GjjC,KAAKykD,cACNzkD,KAAKykD,eAAen2C,MAAM0wE,IACxBh/E,KAAKiH,SAASq5B,gBAAgB2+C,UAAUh8C,EAAQ+7C,EAAU,IAIvD/7C,KAIP10B,GAIJA,EAAQD,MAAM20B,IACZjjC,KAAK4S,QAELif,EAAA,gBAA0B,CAAC7pB,OAAQi7B,EAAOrQ,UAAS,IAAO,GAC1D,GACD,CAAC/gB,eAAgB7R,KAAK6R,iBAEzB,MAAMutE,EAAe,IAAI,IAAe,CACtClnE,KAAM,UACN8lE,SAAU,CAACh+E,KAAKglC,QAAQniC,UAGpB2sB,EAAOxvB,KAAKwvB,KAAOuI,EAAA,uBAAiC,CACxDsnD,KAAK,IAmBP,OAhBAD,EAAazsE,QAAQjH,OAAO8jB,GAE5B4V,EAAQzyB,QAAQjH,OAAO1L,KAAKqlD,WAAWj6C,UAAWmzE,GAElDv+E,KAAK2S,QAAQjH,OAAO1L,KAAKilD,SACzBjlD,KAAKswB,WAAW5kB,OAAO05B,EAAQh6B,UAAWg0E,EAAah0E,WAEpDizE,GACDr+E,KAAKs+E,SAAS,qBACdt+E,KAAKy+E,wBAAwBrzE,UAAUmI,UAAU/Q,OAAO,QACxDxC,KAAKy+E,wBAAwBv/B,iBAAiB,YAAY,WAAW,IACrEl/C,KAAKs/E,iBAELt/E,KAAKy+E,wBAAwBrzE,UAAUmI,UAAUxS,IAAI,QAGhDqgB,QAAQgI,IAAIppB,KAAKglC,QAAQlqB,KAAUyrD,IAAW,O,EAAD,K,OAAA,E,EAAA,YAClD,MAAM,IAAC7pC,GAAO3E,EAAA,qBAA+B,CAC3C/vB,OAAQu+D,EACRn7D,UAAWpL,KAAKwvB,KAChBsQ,eAAe,EACfvO,WAAY,eAGdmL,EAAIU,gBAAgB1xB,QAAO,EAAA2zB,EAAA,SAA0Br/B,KAAKiH,SAASy2B,gBAAgBC,QAAQ4oC,IAC7F,E,YAToD,K,6QASlD,IACJ,CAEO7f,sBACL1mD,KAAKqlD,WAAW7jC,QAChBxhB,KAAKykD,aAAe,KACpBzkD,KAAKw+E,oBAAoB9xE,MAAQ,GACjC1M,KAAKy+E,wBAAwBrzE,UAAUmI,UAAUxS,IAAI,QACrDf,KAAKilD,QAAQvU,UAAW,CAC1B,CAEQ4uC,gBACNj6E,UAAUk6E,YAAYC,oBAAoB3yD,IACxC7sB,KAAK2+E,mBAAqB,CACxBc,IAAK5yD,EAAS6yD,OAAOC,SACrBC,KAAM/yD,EAAS6yD,OAAOG,WAGxB,IAAIC,EAAM,8CACVA,GAAO,QAAQjzD,EAAS6yD,OAAOC,SAC/BG,GAAO,QAAQjzD,EAAS6yD,OAAOG,UAC/BC,GAAO,eACPA,GAAO,oBACPA,GAAO,sBACP1uC,MAAM0uC,GACLxxE,MAAM+iC,GAAaA,EAAS0uC,SAC5BzxE,MAAM+iC,IACLrxC,KAAK4+E,oBAAsBvtC,EAAS2uC,aACpChgF,KAAKy+E,wBAAwBv/B,iBAAiB7N,EAAS2uC,aAAa,GACpE,IACA3zD,IACCA,aAAiB4zD,yBAClBjgF,KAAKy+E,wBAAwBv/B,iBAAiB,mDAE9Cl/C,KAAKy+E,wBAAwBv/B,iBAAiB,6C,GAGpD,E,ICjNGghC,E,uFCSU,SAASC,EAAuBC,GAC7C,MAAMC,EAAuB,GAGvBC,EAAoB,CAACC,MAAO,GAAIC,MAAO,IAAKC,EAAuB,CAACF,MAAO,GAAIC,MAAO,IA8B5F,OA7BAJ,EAAMr7E,SAAS27E,IACb,OAAOA,EAAK9wE,GACV,IAAK,uBACHywE,EAAMh+E,KAAK,GACX,MACF,IAAK,0BACHg+E,EAAMh+E,KAAK,GACX,MACF,IAAK,4BACHg+E,EAAMh+E,KAAK,GACX,MAIF,IAAK,oCACHi+E,EAAWE,MAAMn+E,QAAQq+E,EAAKF,OAC9B,MACF,IAAK,yBACHF,EAAWC,MAAMl+E,QAAQq+E,EAAKH,OAC9B,MACF,IAAK,uCACHE,EAAcD,MAAMn+E,QAAQq+E,EAAKF,OACjC,MACF,IAAK,4BACHC,EAAcF,MAAMl+E,QAAQq+E,EAAKH,O,IAKhC,CAAC3+E,KAAMy+E,EAAM,GAAII,gBAAeH,aACzC,ED5CA,SAAKJ,GACH,6BACA,2BACA,sBACD,CAJD,CAAKA,IAAAA,EAAW,KAMhB,U,wBEee,MAAMS,EAiBnB5gF,YAAmB8tB,GAAA,KAAAA,QAAAA,EAqLX,KAAA+yD,cAAiBl0E,IACvBA,GAASA,EACT1M,KAAK4B,KAAO8K,EAEZ,MAAM4G,EAAUtT,KAAK6tB,QAAQgzD,SAAS7gF,KAAK4B,MACrCk/E,EAAiB9gF,KAAK+gF,aAAaztE,QACrCA,EAEMA,aAAmB9P,aAC3B,EAAA+lB,EAAA,GAAeu3D,EAAgBxtE,IAE/B,QAAMwtE,EAAgBxtE,GAJtBwtE,EAAethE,UAAY,GAM7BshE,EAAevtE,UAAU1J,OAAO,QAASyJ,GAEtCtT,KAAKghF,aACNhhF,KAAKghF,WAAW/9E,IAAI,SAASk4B,IAAI/vB,UAAUmI,UAAU1J,OAAO,OAAQ7J,KAAK4B,OAAS,aAClF5B,KAAKghF,WAAW/9E,IAAI,YAAYk4B,IAAI/vB,UAAUmI,UAAU1J,OAAO,OAAQ7J,KAAK4B,OAAS,WAGvF5B,KAAK6tB,QAAQ+yD,eAAiB5gF,KAAK6tB,QAAQ+yD,cAAcl0E,EAAM,EA7L5DmhB,EAAQgzD,UACThzD,EAAQgzD,SAAS3vE,UAGnB,MAAMjK,EAAW4mB,EAAQ5mB,SAEzBjH,KAAK+gF,aAAe,IAAI,IAAe,CAAC7oE,KAAM2V,EAAQ9e,MAAOuE,SAAS,IAEtEtT,KAAKihF,UAAY,IAAI1/E,IAErB,IAAI+iB,EAAsD,CAAC,CACzD1iB,KAAM,YACNu1D,QAAS,sCACR,CACDv1D,KAAM,WACNu1D,QAAS,wCACR,CACDv1D,KAAM,SACNu1D,QAAS,qCAGRtpC,EAAQqzD,YACT58D,EAAIA,EAAE8U,QAAQ9U,IAAOuJ,EAAQqzD,UAAUnsE,SAASuP,EAAE1iB,SAGpD,MAAM04C,GAAS,SACfh2B,EAAEvf,SAAQ,EAAEnD,OAAMu1D,cAChB,MAAMh8B,EAAM,IAAI,KAAI,CAClBi/C,WAAY,IAAI,IAAW,CACzBjjB,UACAj/C,KAAMoiC,EACN5tC,MAAO,GAAK9K,MAIhB5B,KAAKihF,UAAUr9E,IAAIhC,EAAMu5B,EAAI,IAG/B,MAAM09C,GAAO,QAAkB,IAAI74E,KAAKihF,UAAUn5C,UAAW9nC,KAAK4gF,eAOlE,GALA5gF,KAAK+gF,aAAapuE,QAAQjH,OAAOmtE,GAC9BhrD,EAAQiY,UACTjY,EAAQiY,SAASp6B,OAAO1L,KAAK+gF,aAAa31E,YAGxCyiB,EAAQszD,aAAc,CACxB,MAAM/1E,GAAY,OAAgByiB,EAAQiY,SAAU,oBAAqB,sCAEzE9lC,KAAKghF,WAAa,IAAIz/E,IAAI,CAAC,CACzB,WACA,CACE01D,aAAcppC,EAAQuzD,eAAe,GACrC50E,IAAK,WACL2uB,IAAK,KACLpnB,KAAM,aACN2xD,gBAAiB,qCACjBt2C,WAAW,IAEZ,CACD,QACA,CACE6nC,aAAcppC,EAAQuzD,eAAe,GACrC50E,IAAK,QACL2uB,IAAK,KACLpnB,KAAM,UACN2xD,gBAAiB,qCACjBt2C,WAAW,MAIfpvB,KAAKghF,WAAWj8E,SAASs8E,IACvBA,EAAUlmD,IAAM,IAAI,KAAIkmD,GAExBA,EAAUlmD,IAAI/vB,UAAUwC,iBAAiB,SAAS,KAChDW,EAAQD,MAAK,KACX,MAAMgzE,EAAWthF,KAAKglC,QAAQq8C,EAAU70E,KACxCqhB,EAAQ3a,IAAIquE,OAAOC,UAAU,KAAkBp2D,KAAK,CAClDxpB,KAAM,UACN6/E,WAAW,EACX1yE,MAAOsyE,EAAUpqB,aACjB1zD,YAAa,kCACbm+E,QAAUC,IACRL,EAASz+E,OAAS,EAClBy+E,EAASj/E,QAAQs/E,GACjBN,EAAUlmD,IAAIE,SAAS7b,UAAY,GACnC6hE,EAAUlmD,IAAIE,SAAS3vB,UAAU1L,KAAK4hF,YAAY5hF,KAAK6hF,iBAAiBF,IAAa,EAEvFG,gBAAiBR,GACjB,GACF,IAGJl2E,EAAUM,OAAO21E,EAAUlmD,IAAI/vB,UAAU,G,CAQ7C,MAAMmD,EAAUtH,EAAS86E,kBAAkBC,WAAWn0D,EAAQo0D,UAAU3zE,MAAM8xE,IAC5E,MAAM/5E,EAAU85E,EAAuBC,GACvCpgF,KAAKkiF,SAAS77E,EAAQzE,MAEnB5B,KAAKghF,aACNhhF,KAAKglC,QAAU,CAAC,EAChB,CAAC,QAAkB,YAAqBjgC,SAASo9E,IAC/C,MAAMn7C,EAAM,GACN7tB,EAAa,UAANgpE,EAAgB97E,EAAQi6E,WAAaj6E,EAAQo6E,cAC1Dz5C,EAAI3kC,QAAQ8W,EAAKonE,MAAMzlE,KAAKlT,GAAOA,EAAGgrB,cACtCoU,EAAI3kC,QAAQ8W,EAAKqnE,MAAM1lE,KAAKlT,GAAOA,EAAGgrB,UAAS,MAC/C5yB,KAAKglC,QAAQm9C,GAAKn7C,EAClB,MAAMj9B,EAAI/J,KAAKghF,WAAW/9E,IAAIk/E,GAAGhnD,IAAIE,SACrCtxB,EAAEyV,UAAY,GACdzV,EAAE2B,UAAU1L,KAAK4hF,YAAYzoE,GAAM,KAIvC0U,EAAQ3a,IAAIkvE,cAAcx0E,iBAAiB,WAAW,KAAW,O,EAAA,K,OAAA,E,EAAA,YAC/D,MAAMwyE,EAA4B,GAElC,OAAOpgF,KAAK4B,MACV,KAAK,YACHw+E,EAAM/9E,KAAK,CAACuN,EAAG,8BACf,MACF,KAAK,WACHwwE,EAAM/9E,KAAK,CAACuN,EAAG,mCACf,MACF,KAAK,SACHwwE,EAAM/9E,KAAK,CAACuN,EAAG,iCAInB,GAAG5P,KAAKghF,WAAY,CAClB,MAAMvsE,EAAK,CACT,CAAC,QAAa,yCAA8C,+BAC5D,CAAC,WAAa,4CAA8C,mCAM9D,IAAI,MAAO0tE,EAAGE,EAASC,KAAa7tE,EAAG,CACrC,GAAGzU,KAAKghF,WAAW/9E,IAAIk/E,GAAGhnD,IAAI/vB,UAAUmI,UAAUqB,SAAS,QACzD,SAGF,MAAM0sE,EAAWthF,KAAKglC,QAAQm9C,GAC9B,GAAGb,EAAU,CACX,MAAMp9D,EAAWlkB,KAAK6hF,iBAAiBP,GACpCp9D,EAASs8D,MAAM39E,QAChBu9E,EAAM/9E,KAAK,CAACuN,EAAGyyE,EAAS7B,MAAOt8D,EAASs8D,QAGvCt8D,EAASq8D,MAAM19E,QAChBu9E,EAAM/9E,KAAK,CACTuN,EAAG0yE,EACH/B,YAAan/D,QAAQgI,IAAIlF,EAASq8D,MAAMzlE,KAAKlT,GAAOX,EAASy2B,gBAAgB6kD,aAAa36E,O,GAOpGX,EAAS86E,kBAAkBS,WAAW30D,EAAQo0D,SAAU7B,EAC1D,E,YA/CiE,K,6QA+ChE,GAAE,CAACnyE,MAAM,GAAM,GAEpB,CAyBOi0E,SAAStgF,GACd,MAAMu5B,EAAMn7B,KAAKihF,UAAUh+E,IAAIrB,GAC/B5B,KAAK4gF,cAAch/E,GACnBu5B,EAAIi/C,WAAWrpD,MAAM6U,SAAU,CACjC,CAEQi8C,iBAAiB78C,GACvB,MAAMxF,EAAQ,CAAC+gD,MAAO,GAAgBC,MAAO,IAK7C,OAJAx7C,EAAQjgC,SAASiD,IACfw3B,EAAMx3B,EAAOo4B,YAAc,QAAU,SAAS/9B,KAAK2F,EAAOo4B,YAAcp4B,EAAOs1B,WAAat1B,EAAO,IAG9Fw3B,CACT,CAEQoiD,YAAYpiD,GAClB,OAAIA,EAAM+gD,MAAM19E,QAAW28B,EAAMghD,MAAM39E,QAIhC,QAAK,CACV28B,EAAM+gD,MAAM19E,QAAS,QAAK,QAAS,CAAC28B,EAAM+gD,MAAM19E,SAAW,KAC3D28B,EAAMghD,MAAM39E,QAAS,QAAK,QAAS,CAAC28B,EAAMghD,MAAM39E,SAAW,MAC3Du2B,OAAOC,UAAU,GANV,EAAC,QAAK,sCAOjB,E,cC9Pa,MAAMopD,UAAiC,IACvCjwD,O,qCACXxyB,KAAKoL,UAAUmI,UAAUxS,IAAI,cAAe,wBAC5Cf,KAAKs+E,SAAS,gBAEd,MAAMxgD,EAAY,WAAa99B,KAAKiH,SAASy2B,gBAAgBglD,WAAW9kD,MAClE+kD,EAAYt3E,SAASC,cAAc,OACzCq3E,EAAUj3E,QACR,QAAK,oBACLL,SAASC,cAAc,MACvBD,SAASC,cAAc,OACvB,QAAK,qBACLD,SAASC,cAAc,OACvB,EAAAo8D,EAAA,GAAW,CACTkb,OAAQ9kD,KAIZ,MAAM+kD,EAAe,IAAIlC,EAAe,CACtCztE,IAAKlT,KACL+O,MAAO,oBACPkzE,SAAU,6BACVpB,SAAU,CAAC8B,EAAWA,EAAW,IACjCvB,eAAgB,CAAC,uCAAwC,yCACzDt7C,SAAU9lC,KAAKswB,WACfswD,cAAgBh/E,IACdmI,EAAEm4E,SAAS,aACXn4E,EAAEg3E,aAAa31E,UAAUmI,UAAU1J,OAAO,OAAQjI,IAAS,SAAmB,EAEhFqF,SAAUjH,KAAKiH,WAGX67E,EAAwB,oBACxB/4E,EAAI,IAAI42E,EAAe,CAC3BztE,IAAKlT,KACL+O,MAAO,qBACPkzE,SAAU,8BACVpB,SAAU,CAACiC,EAAUA,EAAU,IAC/B3B,cAAc,EACdD,UAAW,CAAC,UACZj6E,SAAUjH,KAAKiH,WAGjBjH,KAAKswB,WAAWllB,UAAUmM,aAAaxN,EAAEg3E,aAAa31E,UAAWy3E,EAAa9B,aAAa31E,UAAU0wD,YACvG,E,iUC3Ca,MAAMinB,UAAqC,IACjDvwD,OACLxyB,KAAKoL,UAAUmI,UAAUxS,IAAI,wBAAyB,6BACtDf,KAAKs+E,SAAS,kCAEd,MAAMl5C,EAAU,IAAI,IAAe,CACjC64C,WAAY,qCACZ1Y,aAAa,IAITyd,EAAmB33E,SAASC,cAAc,QAEhD,OAAiB,CACf42C,MAJY,KAKZp3B,IAAKk4D,EACL1/D,MAAO,IACPI,OAAQ,MAGV0hB,EAAQzyB,QAAQjH,OAAOs3E,GAEvB,MAAMC,EAAe79C,EAAQ24C,yBAEvBQ,EAAelzE,SAASC,cAAc,OAC5CizE,EAAahrE,UAAUxS,IAAI,iBAE3B,MAAMmiF,GAAY,OAAO,gCAAiC,CAAClvE,KAAM,+CAEjE,QAAiBkvE,GAAYn7E,IAC3B/H,KAAK4S,OAAO,IAGd5S,KAAKuhF,OAAO4B,kBAAkBC,GAAgBpjF,MAE9Cu+E,EAAa7yE,OAAOw3E,GAEpBD,EAAav3E,OAAO6yE,GAEpBv+E,KAAKswB,WAAWllB,UAAUM,OAAO05B,EAAQh6B,UAC3C,E,wBC7CK,SAASi4E,EAASC,GACvB,OAAQ,EAAAz5D,mBAAqBy5D,CAC/B,C,cCWe,MAAMC,UAAmD,IAAxE,c,oBAKS,KAAAC,SAAU,CA4GnB,CA1GShxD,OACLxyB,KAAKoL,UAAUmI,UAAUxS,IAAI,wBAAyB,4CACtDf,KAAKs+E,SAAS,6BAEd,MAAMl5C,EAAU,IAAI,IAAe,CACjC64C,YAAY,EACZ1Y,aAAa,KAGf,QAAMngC,EAAQ9xB,QAAS,mCAAoC,CAACtT,KAAKyjF,QAEjE,MACMT,EAAmB33E,SAASC,cAAc,QAEhD,OAAiB,CACfwf,IAAKk4D,EACL1/D,MAAO,IACPI,OAAQ,IACRw+B,MAPY,OAUd9c,EAAQzyB,QAAQjH,OAAOs3E,GAEvB,MAAMC,EAAe79C,EAAQ24C,yBAEvBQ,EAAelzE,SAASC,cAAc,OAC5CizE,EAAahrE,UAAUxS,IAAI,iBAE3B,MAAM+vB,EAAa9wB,KAAK0jF,eAAiB,IAAI,IAAe,CAC1DxrE,KAAM,sBACNsvB,MAAO,2BACP3kC,OAAQ7C,KAAK6C,OACbm9C,OAASnmC,IACPsqD,GAAO,GAEPnkE,KAAKiH,SAAS08E,gBAAgBC,qBAAqB,GAAK/pE,GACvDvL,MAAM5B,IAKLm3E,GAAQ,IAET5rE,OAAOzS,IACN,OAAOA,EAAI5D,MACT,IAAK,eACHkvB,EAAWC,MAAMxd,UAAUxS,IAAI,UAC/B,EAAAwoB,EAAA,GAAeuH,EAAW0W,OAAO,QAAK,oCACtC,MAEF,IAAK,qBACH1W,EAAWC,MAAMxd,UAAUxS,IAAI,UAC/B,EAAAwoB,EAAA,GAAeuH,EAAW0W,OAAO,QAAK,oCACtC,MAEF,QACEp7B,QAAQigB,MAAM,gBAAiB7mB,GAInC2+D,GAAO,EAAM,GACb,IAIA2f,GAAY,OAAO,8CAA+C,CAAC9vE,KAAM,qCACzE+vE,GAAY,OAAO,4DAA6D,CAAC/vE,KAAM,eAEvF6vE,EAAS,KACb7jF,KAAKuhF,OAAOC,UAAUuB,GAA8B33D,MAAM,EAGtD+4C,EAAUzkB,KACd,EAAAZ,EAAA,GAAiB,CAAChuB,EAAWC,MAAO+yD,EAAWC,GAAYrkC,EAAQ,GAGrE,QAAiBokC,GAAY/7E,IAC3Bo8D,GAAO,GACPnkE,KAAKiH,SAAS08E,gBAAgBK,sBAAsB11E,MAAM5B,IACxD1M,KAAKuhF,OAAO4B,kBAAkBc,EAAgCjkF,MAC9DA,KAAK4S,OAAO,IACX,KACDuxD,GAAO,EAAM,GACb,KAGJ,QAAiB4f,GAAYh8E,IAC3Bo8D,GAAO,GACP,MAAMn9C,GAAI,EAAAwc,EAAA,GAAaugD,GACvB/jF,KAAKiH,SAAS08E,gBAAgBO,sBAAsB51E,MAAM5B,IACxDsa,EAAExkB,SACF2hE,GAAO,EAAM,GACb,IAGJoa,EAAa7yE,OAAOolB,EAAW1lB,UAAW04E,EAAWC,GAErDd,EAAav3E,OAAO6yE,GAEpBv+E,KAAKswB,WAAWllB,UAAUM,OAAO05B,EAAQh6B,UAC3C,CAEA+4E,qBACMd,EAASrjF,KAAKwjF,UAClBxjF,KAAK0jF,eAAe3yD,MAAMC,OAC5B,E,wBChHa,MAAMizD,UAAuC,IAA5D,c,oBAMS,KAAAT,SAAU,CA6InB,CA3IShxD,OACLxyB,KAAKoL,UAAUmI,UAAUxS,IAAI,wBAAyB,+BACtDf,KAAKs+E,SAAS,sBAEd,MAAMl5C,EAAU,IAAI,IAAe,CACjC64C,YAAY,EACZ1Y,aAAa,IAITyd,EAAmB33E,SAASC,cAAc,QAEhD,OAAiB,CACfwf,IAAKk4D,EACL1/D,MAAO,IACPI,OAAQ,IACRw+B,MAPY,OAUd9c,EAAQzyB,QAAQjH,OAAOs3E,GAEvB,MAAMC,EAAe79C,EAAQ24C,yBAEvBQ,EAAelzE,SAASC,cAAc,OAC5CizE,EAAahrE,UAAUxS,IAAI,iBAE3B,MAAM+vB,EAAa9wB,KAAK8wB,WAAa,IAAI,KAAW,CAClD5Y,KAAM,iBACNsvB,MAAO,gBACPh4B,WAAW,IAGbshB,EAAWC,MAAMnjB,iBAAiB,YAAa7F,IAC7C,GAAa,UAAVA,EAAEyE,IAEH,OADA,EAAA4N,EAAA,GAAYrS,GACLq8E,G,IAIXtzD,EAAWC,MAAMnjB,iBAAiB,SAAU7F,IAC1C+oB,EAAWC,MAAMxd,UAAU/Q,OAAO,QAAQ,IAG5C,MAAM6hF,GAAc,OAAO,gCAAiC,CAACrwE,KAAM,aAC7DswE,GAAU,OAAO,4DAA6D,CAACtwE,KAAM,kBAErF6vE,EAAS,KACb7jF,KAAKuhF,OAAOC,UAAUuB,GAA8B33D,MAAM,EAGtDg5D,EAAkB,KACtB,MAAMX,EAAQ3yD,EAAWpkB,MAAMkkB,OACzBrrB,GAAQ,EAAAg/E,EAAA,GAAWd,GACzB,IAAIl+E,GAASA,EAAM,GAAG1C,SAAW4gF,EAAM5gF,OAErC,YADAiuB,EAAWC,MAAMxd,UAAUxS,IAAI,SAIjCyjF,GAAc,GACd,MAAMx9D,GAAI,EAAAwc,EAAA,GAAa6gD,GAEvBrkF,KAAKiH,SAAS08E,gBAAgBc,eAAe,CAC3C5R,KAAM7yE,KAAK6yE,KACX6R,gBAAiB1kF,KAAK2kF,cACtBC,YAAa5kF,KAAK4kF,YAClBnB,UACCn1E,MAAM5B,IACPm3E,GAAQ,IACNr+E,IACF,GAAGA,EAAI5D,KAAKmT,SAAS,qBAAsB,CACzC,MAAM8vE,GAAWr/E,EAAI5D,KAAK2D,MAAM,4BAA4B,GAEtD2N,EAAMlT,KAAKuhF,OAAOC,UAAU+B,GAClCrwE,EAAI4Z,MAAQ9sB,KAAK8sB,MACjB5Z,EAAIuwE,MAAQA,EACZvwE,EAAIrQ,OAASgiF,EACb3xE,EAAIkY,M,MAEJhf,QAAQ8R,IAAI,qBAAsB1Y,GAGpCg/E,GAAc,GACdx9D,EAAExkB,QAAQ,GACV,GAEJ,QAAiB6hF,EAAaD,GAE9B,MAAMI,EAAiBrgB,IAClBA,GACDkgB,EAAY12E,aAAa,WAAY,QACrC22E,EAAQ32E,aAAa,WAAY,UAEjC02E,EAAYz8B,gBAAgB,YAC5B08B,EAAQ18B,gBAAgB,Y,GAI5B,QAAiB08B,GAAUv8E,IACX,IAAI,IAAU,mBAAoB,CAC9C8L,QAAS,CAAC,CACRsjD,QAAS,SACT/W,UAAU,GACT,CACD+W,QAAS,gBACT5kC,SAAU,KAERiyD,GAAc,IACd,EAAAhhD,EAAA,GAAa8gD,GACbtkF,KAAKiH,SAAS08E,gBAAgBc,eAAe,CAC3C5R,KAAM7yE,KAAK6yE,KACX6R,gBAAiB1kF,KAAK2kF,cACtBC,YAAa5kF,KAAK4kF,YAClBnB,MAAO,KACNn1E,MAAK,KACNu1E,GAAQ,IACNr+E,IACFg/E,GAAc,EAAM,GACpB,EAEJ1U,UAAU,IAEZ7Y,aAAc,uBACdC,mBAAoB,6BAGhB3rC,MAAM,IAGdgzD,EAAa7yE,OAAOolB,EAAW1lB,UAAWi5E,EAAaC,GAEvDrB,EAAav3E,OAAO6yE,GAEpBv+E,KAAKswB,WAAWllB,UAAUM,OAAO05B,EAAQh6B,UAC3C,CAEA+4E,qBACMd,EAASrjF,KAAKwjF,UAClBxjF,KAAK8wB,WAAWC,MAAMC,OACxB,E,gECrJa,MAAM8zD,WAAsC,IAMlDtyD,OACLxyB,KAAKoL,UAAUmI,UAAUxS,IAAI,wBAAyB,8BACtDf,KAAKs+E,SAAS,8BAEd,MAAMl5C,EAAU,IAAI,IAAe,CACjCmgC,aAAa,IAITyd,EAAmB33E,SAASC,cAAc,QAChD,OAAiB,CACfwf,IAAKk4D,EACL1/D,MAAO,IACPI,OAAQ,IACRw+B,MANY,OASd9c,EAAQzyB,QAAQjH,OAAOs3E,GAEvB,MAAMzE,EAAelzE,SAASC,cAAc,OAC5CizE,EAAahrE,UAAUxS,IAAI,iBAE3B,MAAM+vB,EAAa9wB,KAAK8wB,WAAa,IAAI,KAAW,CAClD5Y,KAAM,OACNsvB,MAAO,qCAGT1W,EAAWC,MAAMnjB,iBAAiB,YAAa7F,IAC7C,GAAa,UAAVA,EAAEyE,IAEH,OADA,EAAA4N,EAAA,GAAYrS,GACL+oB,EAAWpkB,MAAQ03E,IAAoBW,G,IAIlD,MAAMlB,EAAS,CAAC97E,EAAWi9E,KACtBj9E,IACD,EAAAqS,EAAA,GAAYrS,GAGd,MAAM8qE,EAAOmS,EAAWl0D,EAAWpkB,WAAQzI,EAC3C,GAAG4uE,GAAQ7yE,KAAK4kF,cAAgB/R,EAE9B,YADA,EAAA1mD,GAAA,IAAM,YAAY,uBAAuB,IAI3C,MAAMjZ,EAAMlT,KAAKuhF,OAAOC,UAAUyC,GAClC/wE,EAAI4Z,MAAQ9sB,KAAK8sB,MACjB5Z,EAAIyxE,cAAgB3kF,KAAK2kF,cACzBzxE,EAAI0xE,YAAc5kF,KAAK4kF,YACvB1xE,EAAI2/D,KAAOA,EAEX3/D,EAAIkY,MAAM,EAGNi5D,GAAc,OAAO,gCAAiC,CAACrwE,KAAM,aAC7DswE,GAAU,OAAO,4DAA6D,CAACtwE,KAAM,kBAErFowE,EAAmBr8E,GAAc87E,EAAO97E,GAAG,GAC3Cg9E,EAAeh9E,GAAc87E,EAAO97E,GAAG,IAC7C,QAAiBs8E,EAAaD,IAC9B,QAAiBE,EAASS,GAE1BxG,EAAa7yE,OAAOolB,EAAW1lB,UAAWi5E,EAAaC,GAEvDl/C,EAAQzyB,QAAQjH,OAAO6yE,GAEvBv+E,KAAKswB,WAAWllB,UAAUM,OAAO05B,EAAQh6B,UAC3C,CAEA+4E,qBACEnkF,KAAK8wB,WAAWC,MAAMC,OACxB,EC9Ea,MAAMi0D,WAAiD,IAM7DzyD,OACLxyB,KAAKoL,UAAUmI,UAAUxS,IAAI,wBAAyB,uCAAwC,2CAC9Ff,KAAKs+E,SAAS,yBAEd,MAAMl5C,EAAU,IAAI,IAAe,CACjCmgC,aAAa,IAGTgZ,EAAelzE,SAASC,cAAc,OAC5CizE,EAAahrE,UAAUxS,IAAI,iBAE3B,MAAMkhE,EAAqBjiE,KAAKiiE,mBAAqB,IAAI,IAAmB,CAC1E/pD,KAAM,oBACNsvB,MAAO,0BAGH09C,EAAS,IAAI,IAAejjB,EAAoB,KAEhDoiB,GAAc,OAAO,gCAAiC,CAACrwE,KAAM,aAEnEuqE,EAAa7yE,OAAOu2D,EAAmB72D,UAAWi5E,GAClDj/C,EAAQzyB,QAAQjH,OAAOw5E,EAAO95E,UAAWmzE,GAEzCv+E,KAAKswB,WAAWllB,UAAUM,OAAO05B,EAAQh6B,WAEzC62D,EAAmBlxC,MAAMnjB,iBAAiB,YAAa7F,IAKrD,GAJGk6D,EAAmBlxC,MAAMxd,UAAUqB,SAAS,UAC7CqtD,EAAmBtD,SAAS,cAGjB,UAAV52D,EAAEyE,IACH,OAAO43E,G,IAIX,MAAMe,EAAc,IACfnlF,KAAK4kF,cAAgB3iB,EAAmBv1D,QACzCu1D,EAAmBpD,YACZ,GAMLulB,EAAmBr8E,IAKvB,GAJGA,IACD,EAAAqS,EAAA,GAAYrS,IAGVo9E,IAAe,OAEnB,MAAMjyE,EAAMlT,KAAKuhF,OAAOC,UAAUsD,IAClC5xE,EAAI4Z,MAAQ9sB,KAAK8sB,MACjB5Z,EAAIyxE,cAAgB3kF,KAAK2kF,cACzBzxE,EAAI0xE,YAAc5kF,KAAK4kF,YACvB1xE,EAAIkY,MAAM,EAIZ,OAFA,QAAiBi5D,EAAaD,GAEvBc,EAAOtiF,MAChB,CAEAuhF,qBACEnkF,KAAKiiE,mBAAmBlxC,MAAMC,OAChC,EChEa,MAAMo0D,WAA+C,IAApE,c,oBAIS,KAAA5B,SAAU,CAgJnB,CA9IShxD,OACL,MAAM6yD,GAASrlF,KAAK8sB,MAAMrf,OAAO63E,cAAgBtlF,KAAK2kF,cACtD3kF,KAAKoL,UAAUmI,UAAUxS,IAAI,wBAAyB,wCACtDf,KAAKs+E,SAAS+G,EAAQ,2BAA6B,8BAEnD,MAAMjgD,EAAU,IAAI,IAAe,CACjCmgC,aAAa,IAGTgZ,EAAelzE,SAASC,cAAc,OAC5CizE,EAAahrE,UAAUxS,IAAI,iBAE3B,MAAMkhE,EAAqBjiE,KAAKiiE,mBAAqB,IAAI,IAAmB,CAC1E/pD,KAAM,iBACNsvB,MAAO69C,EAAQ,2BAA8BrlF,KAAK8sB,MAAM+lD,UAAO5uE,EAAY,gBAC3Eo5D,WAAYgoB,GAASrlF,KAAK8sB,MAAM+lD,MAAO,EAAA7pD,EAAA,GAAchpB,KAAK8sB,MAAM+lD,WAAQ5uE,IAGpEihF,EAAS,IAAI,IAAejjB,EAAoB,KAEhDoiB,GAAc,OAAO,iCACrBkB,EAAS,IAAI,iBAAiB,CAAC/4E,IAAK,aAE1C63E,EAAY34E,OAAO65E,EAAOrjF,SAE1Bq8E,EAAa7yE,OAAOu2D,EAAmB72D,UAAWi5E,GAClDj/C,EAAQzyB,QAAQjH,OAAOw5E,EAAO95E,UAAWmzE,GAEzCv+E,KAAKswB,WAAWllB,UAAUM,OAAO05B,EAAQh6B,WAEzC62D,EAAmBlxC,MAAMnjB,iBAAiB,YAAa7F,IAOrD,GANGk6D,EAAmBlxC,MAAMxd,UAAUqB,SAAS,WAC7CqtD,EAAmBlxC,MAAMxd,UAAU/Q,OAAO,SAC1C+iF,EAAO/4E,IAAM,WACb+4E,EAAO9mD,UAGI,UAAV12B,EAAEyE,IACH,OAAO43E,G,IAIX,MAAMe,EAAc,MACdljB,EAAmBv1D,MAAM7J,SAC3Bo/D,EAAmBlxC,MAAMxd,UAAUxS,IAAI,UAChC,GAMX,IAAIqjF,EACJ,GAAIiB,EAkEFjB,EAAmBr8E,IAKjB,GAJGA,IACD,EAAAqS,EAAA,GAAYrS,IAGVo9E,IAAe,OAEnB,MAAMjyE,EAAMlT,KAAKuhF,OAAOC,UAAUyD,IAClC/xE,EAAI4Z,MAAQ9sB,KAAK8sB,MACjB5Z,EAAI0xE,YAAc3iB,EAAmBv1D,MACrCwG,EAAIyxE,cAAgB3kF,KAAK2kF,cACzBzxE,EAAIkY,MAAM,MA7EH,CACT,IAAIo6D,EAEJ,MAAMC,EAAW,KAEXD,IACFA,EAAmB9xE,OAAOkzD,YAAY6e,EAAU,MAG3CzlF,KAAKiH,SAAS08E,gBAAgB8B,WAAWn3E,MAAMo3E,IACpD1lF,KAAK8sB,MAAQ44D,EAEV1lF,KAAK8sB,MAAM+lD,MACZ,EAAAp4C,EAAA,GAAawnC,EAAmBz6B,OAAO,EAAAxe,EAAA,GAAchpB,KAAK8sB,MAAM+lD,QAEhE,EAAAtpD,EAAA,GAAe04C,EAAmBz6B,OAAO,QAAK,iB,KA+CpD48C,EA1CgBr8E,IACd,IAAIo9E,IAEF,YADA,EAAA/qE,EAAA,GAAYrS,GAIds8E,EAAY12E,aAAa,WAAY,QACrC43E,EAAO/4E,IAAM,aACb+4E,EAAO9mD,SACP,MAAMziB,GAAY,EAAAwnB,EAAA,GAAa6gD,GAEzBM,EAAgB1iB,EAAmBv1D,MACzC1M,KAAKiH,SAAS08E,gBAAgBgC,MAAM1jB,EAAmBv1D,MAAO1M,KAAK8sB,OAAOxe,MAAMs3E,IAG9E,GAFAx5E,QAAQ8R,IAAI0nE,GAEE,uBAAXA,EAAKh2E,EAA4B,CAClCy5D,cAAcmc,GACXN,GAAQA,EAAO1iF,SAClB,MAAM0Q,EAAMlT,KAAKuhF,OAAOC,UAAUqE,IAClC3yE,EAAI4Z,MAAQ9sB,KAAK8sB,MACjB5Z,EAAIyxE,cAAgBA,EACpBzxE,EAAIkY,OACJprB,KAAKuhF,OAAOuE,qBAAqB9lF,K,KAEjCwF,IACF6+E,EAAYz8B,gBAAgB,YAC5Bqa,EAAmBlxC,MAAMxd,UAAUxS,IAAI,SAEhCyE,EAAI5D,KAGP2jF,EAAO/4E,IAAM,wBACb+4E,EAAO9mD,SACPziB,EAAUxZ,SACVy/D,EAAmB3f,SAIvBmjC,GAAU,GACV,EAKJA,G,CAmBF,OAFA,QAAiBpB,EAAaD,GAEvBc,EAAOtiF,MAChB,CAEAuhF,qBACMd,EAASrjF,KAAKwjF,UAClBxjF,KAAKiiE,mBAAmBlxC,MAAMC,OAChC,ECxJa,MAAM60D,WAAkC,IAI9CrzD,OACLxyB,KAAKoL,UAAUmI,UAAUxS,IAAI,wBAAyB,8BACtDf,KAAKs+E,SAAS,4BAEd,MAAMl5C,EAAU,IAAI,IAAe,CACjC64C,YAAY,EACZ1Y,aAAa,IAITyd,EAAmB33E,SAASC,cAAc,QAEhD,OAAiB,CACfwf,IAAKk4D,EACL1/D,MAAO,IACPI,OAAQ,IACRw+B,MAPY,OAUd9c,EAAQzyB,QAAQjH,OAAOs3E,GAEvB,MAAMjhD,EAAIqD,EAAQ24C,yBAClB,GAAG/9E,KAAK8sB,MAAMrf,OAAO63E,aAAc,EACjC,QAAMlgD,EAAQ9xB,QAAS,2BAEvB,MAAMyyE,GAAoB,OAAO,8BAA+B,CAAChyE,KAAM,OAAQC,KAAM,+BAC/EgyE,GAAqB,OAAO,8BAA+B,CAACjyE,KAAM,cAAeC,KAAM,+BACvFiyE,GAAsB,OAAO,8BAA+B,CAAClyE,KAAM,QAASC,KAAMhU,KAAK8sB,MAAMrf,OAAOy4E,aAAe,0BAA4B,4BAErJ,QAAiBH,GAAmB,KAClC,MAAM7yE,EAAMlT,KAAKuhF,OAAOC,UAAU4D,IAClClyE,EAAI4Z,MAAQ9sB,KAAK8sB,MACjB5Z,EAAIyxE,cAAgB3kF,KAAK2kF,cACzBzxE,EAAIkY,MAAM,KAGZ,QAAiB46D,GAAoB,KACrB,IAAI,IAAU,yBAA0B,CACpDnyE,QAAS,CAAC,CACRsjD,QAAS,UACT5kC,SAAU,KACRvyB,KAAKiH,SAAS08E,gBAAgBc,eAAe,CAACC,gBAAiB1kF,KAAK2kF,gBAAgBr2E,MAAK,KACvFtO,KAAKuhF,OAAO4B,kBAAkBC,GAAgBpjF,MAC9CA,KAAK4S,OAAO,GACZ,EAEJk9D,UAAU,IAEZ7Y,aAAc,+BACdC,mBAAoB,4BAGhB3rC,MAAM,KAGd,QAAiB06D,GAAqB,KACpC,MAAM/yE,EAAMlT,KAAKuhF,OAAOC,UAAUyC,GAClC/wE,EAAI4Z,MAAQ9sB,KAAK8sB,MACjB5Z,EAAI2/D,KAAO7yE,KAAK8sB,MAAM+lD,KACtB3/D,EAAIyxE,cAAgB3kF,KAAK2kF,cACzBzxE,EAAI0xE,YAAc5kF,KAAK2kF,cACvBzxE,EAAIswE,SAAU,EACdtwE,EAAIkY,MAAM,IAGZ2W,EAAEr2B,OAAOq6E,EAAmBC,EAAoBC,E,KAC3C,EACL,QAAM7gD,EAAQ9xB,QAAS,+BAEvB,MAAMirE,EAAelzE,SAASC,cAAc,OAC5CizE,EAAahrE,UAAUxS,IAAI,iBAE3B,MAAMolF,GAAiB,OAAO,gCAAiC,CAACnyE,KAAM,mCAEtEuqE,EAAa7yE,OAAOy6E,GACpBpkD,EAAEr2B,OAAO6yE,IAET,QAAiB4H,GAAiBp+E,IAChC,MAAMmL,EAAMlT,KAAKuhF,OAAOC,UAAU4D,IAClClyE,EAAI4Z,MAAQ9sB,KAAK8sB,MACjB5Z,EAAIkY,MAAM,G,CAIdprB,KAAKswB,WAAWllB,UAAUM,OAAO05B,EAAQh6B,UAC3C,ECjGa,MAAMg7E,WAA8B,IAC1C5zD,OACLxyB,KAAKoL,UAAUmI,UAAUxS,IAAI,cAAe,qBAC5Cf,KAAKs+E,SAAS,mBAEd,MAAMhrE,EAAuB,gDAC7B,IAAIqtE,EAAe,CACjBztE,IAAKlT,KACL+O,MAAO,gBACPkzE,SAAU,iCACVpB,SAAU,CAACvtE,EAASA,EAASA,GAC7B8tE,eAAgB,CAAC,uCAAwC,yCACzDt7C,SAAU9lC,KAAKswB,WACfrpB,SAAUjH,KAAKiH,UAEnB,ECda,MAAMo/E,WAAkC,IAC9C7zD,OACLxyB,KAAKoL,UAAUmI,UAAUxS,IAAI,cAAe,yBAC5Cf,KAAKs+E,SAAS,uBAEd,MAAMhrE,EAAuB,oDAC7B,IAAIqtE,EAAe,CACjBztE,IAAKlT,KACL+O,MAAO,2BACPkzE,SAAU,8BACVpB,SAAU,CAACvtE,EAASA,EAASA,GAC7B8tE,eAAgB,CAAC,uCAAwC,yCACzDt7C,SAAU9lC,KAAKswB,WACf4wD,UAAW,CAAC,UACZj6E,SAAUjH,KAAKiH,UAEnB,ECjBa,MAAMq/E,WAAqC,IACjD9zD,OACLxyB,KAAKoL,UAAUmI,UAAUxS,IAAI,cAAe,4BAC5Cf,KAAKs+E,SAAS,4BAEd,MAAMhrE,EAAuB,gDAC7B,IAAIqtE,EAAe,CACjBztE,IAAKlT,KACL+O,MAAO,uBACPkzE,SAAU,0BACVpB,SAAU,CAACvtE,EAASA,EAASA,GAC7B8tE,eAAgB,CAAC,uCAAwC,yCACzDt7C,SAAU9lC,KAAKswB,WACfrpB,SAAUjH,KAAKiH,UAEnB,ECda,MAAMs/E,WAAiC,IAC7C/zD,OACLxyB,KAAKoL,UAAUmI,UAAUxS,IAAI,cAAe,yBAC5Cf,KAAKs+E,SAAS,0BAEd,MAAMhrE,EAAuB,6CAC7B,IAAIqtE,EAAe,CACjBztE,IAAKlT,KACL+O,MAAO,cACPkzE,SAAU,4BACVpB,SAAU,CAACvtE,EAASA,EAASA,GAC7B8tE,eAAgB,CAAC,uCAAwC,yCACzDt7C,SAAU9lC,KAAKswB,WACf4wD,UAAW,CAAC,UACZj6E,SAAUjH,KAAKiH,UAEnB,ECjBa,MAAMu/E,WAA2B,IACvCh0D,OACLxyB,KAAKoL,UAAUmI,UAAUxS,IAAI,cAAe,iBAC5Cf,KAAKs+E,SAAS,8BAEd,MAAMhrE,EAAuB,iDAC7B,IAAIqtE,EAAe,CACjBztE,IAAKlT,KACL+O,MAAO,eACPkzE,SAAU,2BACVpB,SAAU,CAACvtE,EAASA,EAASA,GAC7B8tE,eAAgB,CAAC,uCAAwC,yCACzDt7C,SAAU9lC,KAAKswB,WACfrpB,SAAUjH,KAAKiH,WAGjB,CACE,MAAMqM,EAAuB,qCAC7B,IAAIqtE,EAAe,CACjBztE,IAAKlT,KACL+O,MAAO,mBACPkzE,SAAU,0BACVpB,SAAU,CAACvtE,EAASA,EAASA,GAC7B8tE,eAAgB,CAAC,uCAAwC,yCACzDt7C,SAAU9lC,KAAKswB,WACfrpB,SAAUjH,KAAKiH,U,CAGrB,E,sECda,MAAMw/E,WAA6B,IAIzCj0D,OACLxyB,KAAKoL,UAAUmI,UAAUxS,IAAI,6BAC7Bf,KAAKs+E,SAAS,iBAEd,MAAMoI,EAAWd,IACf,MAAMzqD,EAAM,IAAI,KAAI,CAClBpsB,MAAO,CAAC62E,EAAKe,SAAUf,EAAKgB,aAAapiE,KAAK,KAC9C6W,SAAU,CAACuqD,EAAKiB,GAAIjB,EAAKrlC,SAAS/7B,KAAK,OACvC4K,WAAW,EACXgM,WAAYwqD,EAAKn4E,OAAOhF,aAAUxE,GAAY,QAA8B,IAAI8jB,KAAqD,IAAhDvhB,KAAKC,IAAIm/E,EAAKkB,YAAalB,EAAKmB,kBAOvH,OAJA5rD,EAAI/vB,UAAUib,QAAQuG,KAAO,GAAKg5D,EAAKh5D,KAEvCuO,EAAIigD,SAASxiE,YAAc,CAACgtE,EAAKoB,aAAcpB,EAAKqB,gBAAkBrB,EAAKsB,UAAU9tD,OAAOC,SAAS7U,KAAK,MAEnG2W,CAAG,EAGNgsD,EAAiBnnF,KAAKmnF,eAAe7vD,QAE3C,CACE,MAAM8N,EAAU,IAAI,IAAe,CACjCltB,KAAM,iBACN5E,QAAS,2BAGLsyE,GAAO,EAAAxjD,GAAA,GAAc+kD,GAAgBvB,GAAQA,EAAKn4E,OAAOhF,UACzD2+E,EAAUV,EAAQd,GAIxB,GAFAxgD,EAAQzyB,QAAQjH,OAAO07E,EAAQh8E,WAE5B+7E,EAAetkF,OAAQ,CACxB,MAAMwkF,GAAe,OAAO,qCAAsC,CAACtzE,KAAM,OAAQC,KAAM,0BACvF,QAAiBqzE,GAAet/E,IAC9B,IAAI,IAAU,iBAAkB,CAC9B8L,QAAS,CAAC,CACRsjD,QAAS,YACT2Y,UAAU,EACVv9C,SAAU,KACR,MAAM1oB,GAAS,EAAAi1C,EAAA,GAAiB,CAACuoC,IAAe,GAChDrnF,KAAKiH,SAASqwD,WAAWgwB,UAAU,4BAA4Bh5E,MAAM5B,IAEnE26E,EAAa7kF,SACb+kF,EAAan8E,UAAU5I,QAAQ,GAC9BglF,GAASrvE,SAAQ,KAClBtO,GAAQ,GACR,IAGNotD,aAAc,0BACdC,mBAAoB,uBACnB3rC,MAAM,GACR,CAAC1Z,eAAgB7R,KAAK6R,iBAEzBuzB,EAAQzyB,QAAQjH,OAAO27E,E,CAGzBrnF,KAAKswB,WAAW5kB,OAAO05B,EAAQh6B,U,CAGjC,IAAI+7E,EAAetkF,OACjB,OAGF,MAAM0kF,EAAe,IAAI,IAAe,CACtCrvE,KAAM,gBACN5E,QAAS,qBAGX6zE,EAAepiF,SAAS6gF,IACtB2B,EAAa50E,QAAQjH,OAAOg7E,EAAQd,GAAMx6E,UAAU,IAGtDpL,KAAKswB,WAAW5kB,OAAO67E,EAAan8E,WAEpC,MAAMo8E,EAAWhiF,IACC,wCAAbA,EAAI5D,OACL,EAAAuqB,GAAA,IAAM,YAAY,mCAAmC,G,EAIzD,IAAI9rB,EACJ,MAAMonF,EAAmB,KACvB,MAAM76D,EAAOvsB,EAAOgmB,QAAQuG,KAE5B,IAAI,IAAU,iBAAkB,CAC9B/Y,QAAS,CAAC,CACRsjD,QAAS,YACT2Y,UAAU,EACVv9C,SAAU,KACRvyB,KAAKiH,SAASqwD,WAAWgwB,UAAU,6BAA8B,CAAC16D,SACjEte,MAAM5B,IACFA,GACDrM,EAAOmC,Q,GAERglF,EAAQ,IAGfvwB,aAAc,yBACdC,mBAAoB,yBACnB3rC,MAAM,EAGLrpB,EAAUlC,KAAK0nF,aAAc,QAAe,CAChD7zE,QAAS,CAAC,CACRE,KAAM,OACNC,KAAM,YACNC,QAASwzE,MAGbvlF,EAAQ0F,GAAK,8BACb1F,EAAQqR,UAAUxS,IAAI,eAEtBsK,SAAS+Q,eAAe,cAAc1Q,OAAOxJ,IAE7C,EAAAowB,GAAA,GAA0B,CACxBpwB,QAASlC,KAAKswB,WAAWllB,UACzBmnB,SAAWxqB,IACT1H,GAAS,EAAAkd,GAAA,GAAgBxV,EAAE1H,OAAQ,OAC/BA,GAAkC,MAAxBA,EAAOgmB,QAAQuG,OAI1B7kB,aAAa0qB,YAAY1qB,EAAE2qB,iBAE3B3qB,aAAa0qB,aAAY1qB,EAAE4qB,cAAe,IAE7C,EAAAK,GAAA,GAAajrB,EAAG7F,GAChB+wB,GAAA,cAAkC/wB,GAAQ,EAE5C2P,eAAgB7R,KAAK6R,kBAGvB,QAAiB7R,KAAKswB,WAAWllB,WAAYrD,IAC3C1H,GAAS,EAAAkd,GAAA,GAAgBxV,EAAE1H,OAAQ,OAC/BA,GAAkC,MAAxBA,EAAOgmB,QAAQuG,MAI7B66D,GAAkB,GACjB,CAAC51E,eAAgB7R,KAAK6R,gBAC3B,CAEA60C,sB,MAEE,OADgB,QAAhB,EAAA1mD,KAAK0nF,mBAAW,SAAEllF,SACX0P,MAAMw0C,qBACf,E,gDCzJa,MAAMihC,WAA2B,IAIvCn1D,OACLxyB,KAAKoL,UAAUmI,UAAUxS,IAAI,2BAC7Bf,KAAKs+E,SAAS,gBAEd,MAAMl5C,EAAU,IAAI,IAAe,CACjC9xB,QAAS,qBAGX8xB,EAAQ9xB,QAAQ2F,cAAcjB,QAAQotB,EAAQ9xB,SAE9CtT,KAAKswB,WAAW5kB,OAAO05B,EAAQh6B,WAE/B,MAAMw8E,GAAS,OAAa,CAAC7zE,KAAM,MAAOsH,UAAW,eACrDrb,KAAK2S,QAAQjH,OAAOk8E,IAEpB,QAAiBA,GAAS7/E,IACxB,IAAI,KAAc,CAChB4oE,UAAW,CAAC,YACZptE,YAAa,gCACb6rE,SAAWpnE,IAEThI,KAAKiH,SAASy2B,gBAAgBmqD,YAAY7/E,GAAQ,EAAK,GAEzD,GACD,CAAC6J,eAAgB7R,KAAK6R,iBAEzB,MAAM2d,EAAOuI,EAAA,yBACb/3B,KAAKswB,WAAWllB,UAAUmI,UAAUxS,IAAI,sBACxCqkC,EAAQzyB,QAAQjH,OAAO8jB,GAEvB,MAAMzuB,EAAM,CAAMiH,EAAgB0D,KAAoB,O,EAAA,K,OAAA,E,EAAA,YACpD,MAAM,IAACgxB,GAAO3E,EAAA,qBAA+B,CAC3C/vB,OAAQA,EACRoD,UAAWokB,EACXsQ,eAAe,EACfvO,WAAY,aACZ7lB,WAGI+xB,QAAaz9B,KAAKiH,SAASy2B,gBAAgBC,QAAQ31B,EAAOs3B,YAChE,IAAI7B,EACF,OAGF,MACMF,GADY,EAAAoqC,GAAA,GAAuBlqC,GACd,GACxBA,EAAKhwB,OAAOq6E,IACbprD,EAAIU,gBAAgB1xB,OAAO,IAAM6xB,GAE9BE,EAAKG,MAAOlB,EAAIU,gBAAgB5d,WAAY,EAAAooD,GAAA,GAAgBnqC,EAAKG,OAC/DlB,EAAIU,gBAAgB1xB,OAAO6xB,EAAW,IAAMA,GAAW,EAAA8B,EAAA,GAAoB5B,GAKpF,E,YAzBsD,K,6QAyBrD,EAED,IAAI,MAAMz1B,KAAUhI,KAAKglC,QACvBjkC,EAAIiH,GAAQ,GAGd,IAAI3H,EACJ,MAKM6B,EAAUlC,KAAK0nF,aAAc,QAAe,CAChD7zE,QAAS,CAAC,CACRE,KAAM,UACNC,KAAM,UACNC,QATc,KAChB,MAAMjM,EAAS3H,EAAOgmB,QAAQre,OAAO4qB,WACrC5yB,KAAKiH,SAASy2B,gBAAgBmqD,YAAY7/E,GAAQ,EAAM,EAQtD6lB,QAAS,CAAChc,eAAgB7R,KAAK6R,oBAGnC3P,EAAQ0F,GAAK,4BACb1F,EAAQqR,UAAUxS,IAAI,eAEtBsK,SAAS+Q,eAAe,cAAc1Q,OAAOxJ,IAE7C,EAAAowB,GAAA,GAA0B,CACxBpwB,QAASlC,KAAKswB,WAAWllB,UACzBmnB,SAAWxqB,IACT1H,GAAS,EAAA2/B,GAAA,GAAUj4B,EAAE1H,OAAQ,EAAA4/B,yBACzB5/B,IAID0H,aAAa0qB,YAAY1qB,EAAE2qB,iBAE3B3qB,aAAa0qB,aAAY1qB,EAAE4qB,cAAe,IAE7C,EAAAK,GAAA,GAAajrB,EAAG7F,GAChB+wB,GAAA,cAAkC/wB,GAAQ,EAE5C2P,eAAgB7R,KAAK6R,iBAGvB7R,KAAK6R,eAAe9Q,IAAIkd,EAAA,EAAxBje,CAAmC,cAAey+B,IAChD,MAAM,OAACz2B,EAAM,QAAE+/E,GAAWtpD,EACpBsB,EAAKvQ,EAAK5X,cAAc,kBAAkB5P,OAC7C+/E,EACGhoD,GACFh/B,EAAIiH,GAAQ,GAGX+3B,GACDA,EAAGv9B,Q,IAMT,IAAIqpB,GAAU,EACd7rB,KAAKswB,WAAWK,iBAAmB,KAC9B9E,IAIHA,GAAU,EACV7rB,KAAKiH,SAASy2B,gBAAgBsqD,WAAWx4D,EAAKE,kBAR7B,IAQ4DphB,MAAM6iB,IACjF,IAAI,MAAMnpB,KAAUmpB,EAAI6T,QACtBjkC,EAAIiH,GAAQ,IAGXmpB,EAAI6T,QAAQniC,OAbA,IAauB2sB,EAAKE,oBAAsByB,EAAIC,SACnEpxB,KAAKswB,WAAWK,iBAAmB,MAGrC3wB,KAAKswB,WAAW8Q,kBAAkB,IACjCjpB,SAAQ,KACT0T,GAAU,CAAK,IACf,CAEN,CAEAs4D,qBACEnkF,KAAKswB,WAAWwG,UAClB,CAEA4vB,sBAKE,OAJG1mD,KAAK0nF,aACN1nF,KAAK0nF,YAAYllF,SAGZ0P,MAAMw0C,qBACf,E,eC5Ka,SAASuhC,GAAqBz7E,GAG3C,MADM,SADAA,EAAI,GAAG07E,cAAgB17E,EAAI8qB,MAAM,GAGzC,C,yBCMe,MAAM6wD,WAA4B,IACxC31D,OACLxyB,KAAKoL,UAAUmI,UAAUxS,IAAI,cAAe,kBAC5Cf,KAAKs+E,SAAS,wBAEd,MAAMhrE,EAAuB,2BAC7B,IAAIqtE,EAAe,CACjBztE,IAAKlT,KACL+O,MAAO,4BACPkzE,SAAU,+BACVpB,SAAU,CAACvtE,EAASA,EAASA,GAC7B8tE,eAAgB,CAAC,uCAAwC,yCACzDt7C,SAAU9lC,KAAKswB,WACfrpB,SAAUjH,KAAKiH,UAEnB,E,sTCNa,MAAMmhF,WAAgC,IACtC51D,KAAK61D,G,0CAChBroF,KAAKoL,UAAUmI,UAAUxS,IAAI,6BAC7Bf,KAAKs+E,SAAS,oBAEd,MAAMoI,EAAgBd,GAA2B,mCAC/C,MAAM59E,EAAS49E,EAAK0C,OAAO11D,WACrBuI,EAAM,IAAI,KAAI,CAClBpsB,YAAa,QAAc,CAAC/G,WAC5BqzB,SAAU,CAACuqD,EAAKiB,GAAIjB,EAAK2C,QAAQ/jE,KAAK,OACtC4K,WAAW,EACXgM,YAAY,QAA8B,IAAIrT,KAAqD,IAAhDvhB,KAAKC,IAAIm/E,EAAKkB,YAAalB,EAAKmB,kBAG/ErhF,EAAQy1B,EAAIogD,YAAY,OACxBjY,EAAS,IAAI,IAUnB,OATAA,EAAO/vD,UAAUxS,IAAI,mBACfuiE,EAAOj6C,kBAAkB,CAACrhB,WAChCtC,EAAMgG,OAAO43D,GAEbnoC,EAAI/vB,UAAUib,QAAQuG,KAAO,GAAKg5D,EAAKh5D,KACvCuO,EAAI/vB,UAAUib,QAAQre,OAAS,GAAKA,EAEpCmzB,EAAIigD,SAASxiE,YAAc,CAACgtE,EAAK4C,OAAQ5C,EAAK6C,QAAS7C,EAAKsB,UAAU9tD,OAAOC,SAAS7U,KAAK,MAEpF2W,CACT,IAEA,CACE,MAAMiK,EAAU,IAAI,IAAe,CACjC9xB,QAAS,8BAGL+zE,GAAe,OAAO,qCAAsC,CAACtzE,KAAM,OAAQC,KAAM,6BAEvF,QAAiBqzE,GAAc,IAAW,yCAClC,EAAApnC,GAAA,GAAkB,CACtBiX,mBAAoB,wBACpB5gD,OAAQ,CACN6gD,QAAS,aACT2Y,UAAU,MAIC,EAAAhxB,EAAA,GAAiB,CAACuoC,IAAe,GAChDrnF,KAAKiH,SAASyhF,wBAAwBC,yBAAyBr6E,MAAK,KAClEtO,KAAK4S,OAAO,GAEhB,KAAG,CAACf,eAAgB7R,KAAK6R,iBAEzBuzB,EAAQzyB,QAAQjH,OAAO27E,GAEvBrnF,KAAKswB,WAAW5kB,OAAO05B,EAAQh6B,U,CAGjC,CACE,MAAMg6B,EAAU,IAAI,IAAe,CACjCltB,KAAM,mBACN5E,QAAS,4BAGL0hD,QAAa5zC,QAAQgI,IAAIi/D,EAASvtE,IAAI4rE,IAC5CthD,EAAQzyB,QAAQjH,UAAUspD,EAAKl6C,KAAKqgB,GAAQA,EAAI/vB,aAEhD,IAAIw9E,EAAa5zB,EAAKnyD,QACtB,QAAiBuiC,EAAQzyB,SAAe5K,GAAM,mCAC5C,MAAMozB,GAAM,EAAA5d,GAAA,GAAgBxV,EAAE1H,OAAQ,OACtC,IAAI86B,EACF,aAGI,EAAA8kB,GAAA,GAAkB,CACtBiX,mBAAoB,0BACpB8Y,oBAAqB,OAAO,QAAc,CAAChoE,OAAQmzB,EAAI9U,QAAQre,OAAO4qB,cACtEtc,OAAQ,CACN6gD,QAAS,aACT2Y,UAAU,KAId,MAAMljD,EAAOuO,EAAI9U,QAAQuG,KACzBuO,EAAI5nB,UAAUxS,IAAI,eAClBf,KAAKiH,SAASyhF,wBAAwBG,sBAAsBj8D,GAAMte,MAAK,OAC/Ds6E,EAGJztD,EAAI34B,SAFJxC,KAAK4S,O,GAKX,KAAG,CAACf,eAAgB7R,KAAK6R,iBAEzB7R,KAAKswB,WAAW5kB,OAAO05B,EAAQh6B,U,CAEnC,G,EC3Ea,MAAM09E,WAAiC,IAO7CryE,mBAAmBsyE,GACxB,MAAO,CACL9V,UAAW8V,EAAQ9hF,SAASqwD,WAAW0xB,eACvCC,cAAeF,EAAQ9hF,SAAS86E,kBAAkBmH,2BAClDC,gBAAiBJ,EAAQ9hF,SAASqwD,WAAWgwB,UAAU,8BACvD8B,kBAAmBL,EAAQ9hF,SAASyhF,wBAAwBW,uBAEhE,CAEO72D,KAAK7xB,GACVX,KAAKoL,UAAUmI,UAAUxS,IAAI,wBAC7Bf,KAAKs+E,SAAS,mBAEd,MAAMgL,EAAwB,UACxBjxD,EAA2B,GAEjC,CACE,MAAM+M,EAAU,IAAI,IAAe,CAACmgC,aAAa,EAAMjyD,QAAS,iBAEhE,IAAIi2E,EACJ,MAAMC,EAAkB,IAAI,KAAI,CAC9Bz1E,KAAM,aACNkjD,aAAc,eACdyO,gBAAiB4jB,EACjBl6D,UAAW,KACT,MAAMlc,EAAMlT,KAAKuhF,OAAOC,UAAUmG,IAClCz0E,EAAI8xB,QAAUukD,EACdr2E,EAAIkY,MAAM,EAEZvZ,eAAgB7R,KAAK6R,iBAIvB,IAAI43E,EAFJD,EAAgBvlD,SAAU,EAG1B,MAAMylD,EAAsB,CAC1B31E,KAAM,OACNkjD,aAAc,sBACdyO,gBAAiB4jB,EACjBl6D,UAAYrnB,IACV,IAAImL,EACDu2E,EAAch8E,OAAO63E,aACtBpyE,EAAMlT,KAAKuhF,OAAOC,UAAU4D,IACpBqE,EAAcE,2BACtBz2E,EAAMlT,KAAKuhF,OAAOC,UAAU+B,GAC5BrwE,EAAIuwE,MAAQgG,EAAcE,0BAC1Bz2E,EAAIrQ,OAAS,EACbqQ,EAAIswE,SAAU,EACdxjF,KAAKiH,SAAS08E,gBAAgBO,uBAE9BhxE,EAAMlT,KAAKuhF,OAAOC,UAAUqE,IAG9B3yE,EAAI4Z,MAAQ28D,EACZv2E,EAAIkY,MAAM,EAEZvZ,eAAgB7R,KAAK6R,gBAGjB+3E,EAAe,IAAI,KAAIF,GAC7BE,EAAa3lD,SAAU,EAEvB,MAAM4lD,EAAoB7pF,KAAK6pF,kBAAoB,IAAI,KAAI,CACzD91E,KAAM,iBACNkjD,aAAc,gBACdyO,gBAAiB4jB,EACjBl6D,UAAW,KACT,MAAMlc,EAAMlT,KAAKuhF,OAAOC,UAAUiF,IAClCvzE,EAAIi0E,eAAiBnnF,KAAKmnF,eAC1Bj0E,EAAIkvE,cAAcx0E,iBAAiB,WAAW,KAC5C5N,KAAK8pF,sBAAsB,GAC1B,CAAC77E,MAAM,IACViF,EAAIkY,MAAM,EAEZvZ,eAAgB7R,KAAK6R,iBAEvBg4E,EAAkB5lD,SAAU,EAE5B,MAAM8lD,EAAc/pF,KAAK+pF,YAAc,IAAI,KAAI,CAC7Ch2E,KAAM,UACNkjD,aAAc,mBACdyO,gBAAiB4jB,EACjBl6D,UAAW,KACT,MAAMlc,EAAMlT,KAAKuhF,OAAOC,UAAU4G,IAClCl1E,EAAIkvE,cAAcx0E,iBAAiB,WAAW,KAC5C5N,KAAKgqF,sBAAsB,IAE7B92E,EAAIkY,KAAKprB,KAAKiqF,SAAS,EAEzBp4E,eAAgB7R,KAAK6R,iBAEvBk4E,EAAY9lD,SAAU,EAEtBmB,EAAQzyB,QAAQjH,OAAO89E,EAAgBp+E,UAAWw+E,EAAax+E,UAAWy+E,EAAkBz+E,UAAW2+E,EAAY3+E,WACnHpL,KAAKswB,WAAW5kB,OAAO05B,EAAQh6B,WAE/B,MAAM8+E,EAAmB94D,IACpBA,GACD,EAAA7H,EAAA,GAAeigE,EAAgBnuD,UAAU,QAAK,sCAAuC,CAACjK,MAEtF,EAAA7H,EAAA,GAAeigE,EAAgBnuD,UAAU,QAAK,eAAgB,CAACjK,I,EAInEpxB,KAAK6R,eAAe9Q,IAAIkd,EAAA,EAAxBje,CAAmC,cAAc,KAM/CmqF,GAAe,IAGjB,MAAMA,EAAgB,KACpBnqF,KAAKiH,SAASy2B,gBAAgBsqD,aAAa15E,MAAM6iB,IAC/Cq4D,EAAgBvlD,SAAU,EAC1BimD,EAAgB/4D,EAAIC,OACpBm4D,EAAiBp4D,EAAI6T,OAAO,GAC5B,EAGJmlD,IAEAnqF,KAAKiH,SAAS08E,gBAAgB8B,WAAWn3E,MAAMwe,IAC7C28D,EAAgB38D,GAChB,EAAAvD,EAAA,GAAeqgE,EAAavuD,UAAU,QAAKvO,EAAMrf,OAAO63E,aAAe,6BAA+B,gCACtGsE,EAAa3lD,SAAU,CAAK,IAK9BjkC,KAAK8pF,uBACLzxD,EAASh2B,KAAKrC,KAAKgqF,qBAAqBrpF,EAAEyoF,mB,CAG5C,CACE,MAAMhkD,EAAU,IAAI,IAAe,CAACltB,KAAM,eAAgB5E,QAAS,0BAEnE8xB,EAAQzyB,QAAQY,UAAUxS,IAAI,gCAE9B,MAAMqpF,EAED,CAAC,EAEAC,EAAsBD,EAAuC,2BAAI,IAAI,KAAI,CAC7EnzB,aAAc,oBACdyO,gBAAiB4jB,EACjBl6D,UAAW,KACTpvB,KAAKuhF,OAAOC,UAAUiB,GAA0Br3D,MAAM,EAExDvZ,eAAgB7R,KAAK6R,iBAGjBy4E,EAAkBF,EAA2C,+BAAI,IAAI,KAAI,CAC7EnzB,aAAc,gBACdyO,gBAAiB4jB,EACjBl6D,UAAW,KACTpvB,KAAKuhF,OAAOC,UAAU4E,IAAuBh7D,MAAM,EAErDvZ,eAAgB7R,KAAK6R,iBAGjB04E,EAAqBH,EAAwC,4BAAI,IAAI,KAAI,CAC7EnzB,aAAc,2BACdyO,gBAAiB4jB,EACjBl6D,UAAW,KACTpvB,KAAKuhF,OAAOC,UAAU6E,IAA2Bj7D,MAAM,EAEzDvZ,eAAgB7R,KAAK6R,iBAGjB24E,EAAUJ,EAAqC,yBAAI,IAAI,KAAI,CAC/DnzB,aAAc,eACdyO,gBAAiB4jB,EACjBl6D,UAAW,KACTpvB,KAAKuhF,OAAOC,UAAUgF,IAAoBp7D,MAAM,EAElDvZ,eAAgB7R,KAAK6R,iBAGjB44E,EAAiBL,EAAoC,wBAAI,IAAI,KAAI,CACrEnzB,aAAc,uBACdyO,gBAAiB4jB,EACjBl6D,UAAW,KACTpvB,KAAKuhF,OAAOC,UAAU8E,IAA8Bl7D,MAAM,EAE5DvZ,eAAgB7R,KAAK6R,iBAGjB64E,EAAmBN,EAAsC,0BAAI,IAAI,KAAI,CACzEnzB,aAAc,cACdyO,gBAAiB4jB,EACjBl6D,UAAW,KACTpvB,KAAKuhF,OAAOC,UAAU+E,IAA0Bn7D,MAAM,EAExDvZ,eAAgB7R,KAAK6R,iBAGjB84E,EAAYP,EAAyC,6BAAI,IAAI,KAAI,CACrEnzB,aAAc,4BACdyO,gBAAiB4jB,EACjBl6D,UAAW,KACLnR,EAAA,UAGFje,KAAKuhF,OAAOC,UAAU2G,IAAqB/8D,QAF3C,EAAAe,GAAA,IAAS,CAACC,YAAa,mC,EAK3Bva,eAAgB7R,KAAK6R,iBAGjB+4E,EAAoBp+E,IACxB,MAAM2uB,EAAMivD,EAAW59E,GACnB2uB,GAIJn7B,KAAKiH,SAAS86E,kBAAkBC,WAAWx1E,GAAK8B,MAAM8xE,IACpD,MAAM/5E,EAAU85E,EAAuBC,GACjCjpB,EAAU9wD,EAAQzE,OAAS,YAAwB,qCAAwCyE,EAAQzE,OAAS,WAAuB,uCAAyC,mCAC5KipF,EAAiBxkF,EAAQo6E,cAAcF,MAAM19E,OAASwD,EAAQo6E,cAAcD,MAAM39E,OAClFioF,EAAczkF,EAAQi6E,WAAWC,MAAM19E,OAASwD,EAAQi6E,WAAWE,MAAM39E,OAE/Es4B,EAAIE,SAAS7b,UAAY,GACzB,MAAMzV,GAAI,QAAKotD,GACfh8B,EAAIE,SAAS3vB,OAAO3B,IACjB8gF,GAAkBC,IACnB3vD,EAAIE,SAAS3vB,OAAO,KAAK,EAAEm/E,EAAgBC,EAAc,IAAMA,EAAc,GAAG1xD,OAAOC,SAAS7U,KAAK,S,GAEvG,EAGJ4gB,EAAQzyB,QAAQjH,OACd2+E,EAAoBj/E,UACpBk/E,EAAgBl/E,UAChBm/E,EAAmBn/E,UACnBo/E,EAAQp/E,UACRq/E,EAAer/E,UACfs/E,EAAiBt/E,UACjBu/E,EAAUv/E,WAEZpL,KAAKswB,WAAW5kB,OAAO05B,EAAQh6B,WAE/B,IAAI,MAAMoB,KAAO49E,EACfQ,EAAiBp+E,GAGnByR,EAAA,mBAA2B,kBAAmBwgB,IAC5CmsD,EAAiB3C,GAAqBxpD,EAAOjyB,IAAIoD,GAAU,G,CAI/D,CACE,MAAMw1B,EAAU,IAAI,IAAe,CAACltB,KAAM,0BAA2B5E,QAAS,uBAExEi0B,EAAgB,IAAI,KAAc,CAACvzB,KAAM,mBACzCmnB,EAAM,IAAI,KAAI,CAClBoM,kBAKF,IAAI51B,EAAkBo5E,EAFtB3lD,EAAQzyB,QAAQjH,OAAOyvB,EAAI/vB,WAG3BpL,KAAKoiF,cAAcx0E,iBAAiB,WAAW,KAE7C,GADAm9E,GAAY,OACG9mF,IAAZ0N,GAAyBA,IAAY41B,EAAc3B,QACtD,OAAO5lC,KAAKiH,SAAS86E,kBAAkBiJ,yBAAyB,CAC9Dp7E,EAAG,wBACHq7E,sCAAuC1jD,EAAc3B,SACrD,GACD,CAAC33B,MAAM,IAEV,MAAMM,EAAU6S,QAAQgI,IAAI,CAC1BzoB,EAAEsyE,UACFtyE,EAAEsoF,gBACD36E,MAAK,EAAE2kE,EAAWiY,MACnB,GAAGH,EACD,OAGF,MAAMI,EAAmBvzB,IACvBxyB,EAAQh6B,UAAUmI,UAAU1J,OAAO,QAAS+tD,IAAcqb,EAAUmY,8BAA8B,EAGpGprF,KAAK6R,eAAe9Q,IAAIkd,EAAA,EAAxBje,CAAmC,iBAAkBmrF,GACrDA,EAAgBltE,EAAA,WAEhBtM,IAAYu5E,EAASD,sCAErB1jD,EAAc2X,iBAAiBvtC,EAAQ,IAGzC0mB,EAASh2B,KAAKkM,GAEdvO,KAAKswB,WAAW5kB,OAAO05B,EAAQh6B,U,CAGjC,CACE,MAAMg6B,EAAU,IAAI,IAAe,CAACltB,KAAM,2BAA4B5E,QAAS,qCAC/E8xB,EAAQh6B,UAAUmI,UAAUxS,IAAI,QAEhC,MAAMwmC,EAAgB,IAAI,KAAc,CAACvzB,KAAM,qCACzCmnB,EAAM,IAAI,KAAI,CAClBoM,kBAKF,IAAI51B,EAFJyzB,EAAQzyB,QAAQjH,OAAOyvB,EAAI/vB,WAG3BpL,KAAKoiF,cAAcx0E,iBAAiB,WAAW,KAC7C,QAAe3J,IAAZ0N,EAAuB,OAC1B,MAAM05E,EAAWlwD,EAAIoM,cAAc3B,QAEnC,OADkBylD,IAAa15E,EAKxB3R,KAAKiH,SAASqwD,WAAWgwB,UAAU,6BAA8B,CACtEgE,kBAAmBD,SALrB,CAME,GACD,CAACp9E,MAAM,IAEV,MAAMM,EAAU5N,EAAEwoF,gBAAgB76E,MAAM48E,IAClCA,EAASz9E,OAAO89E,uBAIpB55E,IAAYu5E,EAASz9E,OAAO69E,kBAC5B/jD,EAAc2X,iBAAiBvtC,GAC/ByzB,EAAQh6B,UAAUmI,UAAU/Q,OAAO,QAAO,IAG5C61B,EAASh2B,KAAKkM,GAEdvO,KAAKswB,WAAW5kB,OAAO05B,EAAQh6B,U,CAGjC,CACE,MAAMg6B,EAAU,IAAI,IAAe,CAACltB,KAAM,kBAAmB5E,QAAS,6BAEhE0rD,EAAe,KACnB,MAAMnxC,EAAoC,CACxCopC,aAAc,iCACdC,mBAAoB,gCACpB5gD,OAAQ,CACN6gD,QAAS,SAEXjX,WAAY,CAAC,CACXlsC,KAAM,uBACN4xB,SAAS,GACR,CACD5xB,KAAM,sBACN4xB,SAAS,MAIb,EAAAqa,GAAA,GAAkBpyB,GAASvf,MAAK,KAC9B,MAAOw1D,EAAM0nB,GAAW39D,EAAQqyB,WAAWplC,KAAKinB,GAAMA,EAAEwF,cAAc3B,UAChE/7B,GAAS,EAAAi1C,EAAA,GAAiB,CAACkY,IAAc,GAC/Ch3D,KAAKiH,SAASwkF,mBAAmBC,eAAe5nB,EAAM0nB,GAASl9E,MAAK,MAC9Dw1D,GAAS0nB,KAIb3hF,KACA,EAAAsiB,GAAA,IAAS,CACPC,YAAa03C,GAAQ0nB,EAAU,wCAA2C1nB,EAAO,qCAAuC,sCACxH,GACF,GACD3rC,GAAA,EAAK,EAGJ6+B,GAAc,OAAO,8BAA+B,CAACjjD,KAAM,SAAUC,KAAM,yBACjFhU,KAAK6R,eAAe9Q,IAAIi2D,EAAxBh3D,CAAqC,QAASg/D,GAC9C55B,EAAQzyB,QAAQjH,OAAOsrD,GAEvBh3D,KAAKswB,WAAW5kB,OAAO05B,EAAQh6B,U,CAGjC,CACE,MAAMg6B,EAAU,IAAI,IAAe,CAACltB,KAAM,gBAEpCxF,EAAgB,KACN,IAAI,IAAU,sBAAuB,CACjDmB,QAAS,CAAC,CACRsjD,QAAS,SACT5kC,SAAU,KACR,MAAM1oB,GAAS,EAAAi1C,EAAA,GAAiB,CAAC6sC,IAAe,GAChD3rF,KAAKiH,SAAS2kF,iBAAiBC,iBAAiBv9E,MAAK,KACnDzE,GAAQ,GACR,EAEJimE,UAAU,IAEZ7Y,aAAc,6BACdC,mBAAoB,0BAGhB3rC,MAAM,EAGRogE,GAAe,OAAO,8BAA+B,CAAC53E,KAAM,SAAUC,KAAM,6BAClFhU,KAAK6R,eAAe9Q,IAAI4qF,EAAxB3rF,CAAsC,QAAS0S,GAC/C0yB,EAAQzyB,QAAQjH,OAAOigF,GAcvB3rF,KAAKswB,WAAW5kB,OAAO05B,EAAQh6B,U,CAejC,OAAOgW,QAAQgI,IAAIiP,EACrB,CAEOyxD,uBACL,OAAO9pF,KAAKiH,SAASqwD,WAAWgwB,UAAU,6BAA6Bh5E,MAAMw9E,IAC3E9rF,KAAK6pF,kBAAkB5lD,SAAU,EACjCjkC,KAAKmnF,eAAiB2E,EAAM3E,gBAC5B,QAAMnnF,KAAK6pF,kBAAkBxuD,SAAU,kBAAmB,CAACr7B,KAAKmnF,eAAetkF,QAAQ,GAE3F,CAEOmnF,qBAAqBz7E,EAAUvO,KAAKiH,SAASyhF,wBAAwBW,wBAC1E,OAAO96E,EAAQD,MAAM64E,IACnBnnF,KAAK+pF,YAAY9lD,SAAU,EAC3BjkC,KAAKiqF,SAAW9C,GAChB,QAAMnnF,KAAK+pF,YAAY1uD,SAAU,mBAAoB,CAACr7B,KAAKiqF,SAASpnF,SACpE7C,KAAK+pF,YAAY3+E,UAAUmI,UAAU1J,OAAO,QAAS7J,KAAKiqF,SAASpnF,OAAO,GAE9E,E,4FChea,MAAMkpF,WAA4B,IACxCv5D,OAIL,OAHAxyB,KAAKs+E,SAAS,oBACdt+E,KAAKoL,UAAUmI,UAAUxS,IAAI,4BAEtBqgB,QAAQgI,IAAI,CACjBppB,KAAKiH,SAAS+kF,oBAAoBC,mBAClCjsF,KAAKiH,SAAS+kF,oBAAoBE,0BACjC59E,MAAK,EAAE69E,EAAeC,MACvBA,EAAqBA,EAAmBhzD,QAAQizD,IAAcA,EAAS5+E,OAAO6+E,WAE9E,MAAMlnD,EAAU,IAAI,IAGd4vB,EAAOo3B,EAAmBtxE,KAAKyxE,IACnC,MAAMnS,EAAa,IAAI,IAAW,CAChCliE,KAHS,iBAITlE,KAAMu4E,EAAkBx9E,MACxBrC,MAAO6/E,EAAkBF,SACzB3T,YAAY,IAGRv9C,EAAM,IAAI,KAAI,CAClBi/C,aACA9+C,aAAa,IAef,OAZA8+C,EAAW76D,KAAKhM,UAAUxS,IAAI,yBAE9B,QAAiB,CACfo6B,MACAx5B,IAAK4qF,EAAkBC,YACvB3kF,KAAM,UAGL0kF,EAAkBF,WAAcF,EAAoCE,UACrEjS,EAAWl7B,kBAAiB,GAGvB/jB,CAAG,IAGN09C,GAAO,QAAkB7jB,GAAOtoD,IACpC1M,KAAKiH,SAAS+kF,oBAAoBS,mBAAmB,CAAC78E,EAAG,gBAAiB88E,SAAUhgF,GAAO,IAG7F04B,EAAQzyB,QAAQjH,OAAOmtE,GACvB74E,KAAKswB,WAAW5kB,OAAO05B,EAAQh6B,UAAU,GAE7C,E,2UC1BK,MAAMuhF,GAOX5sF,YACEmY,EACAgH,EACA0tE,EACAC,EACA9hD,EACA+hD,GAAa,GAEb,MAAMvwC,EAAa,yBACnBv8C,KAAKoL,UAAYC,SAASC,cAAc,OACxCtL,KAAKoL,UAAUmI,UAAUxS,IAAIw7C,GAE7B,MAAMl2C,EAAUgF,SAASC,cAAc,OACvCjF,EAAQkN,UAAUxS,IAAIw7C,EAAa,YAEnC,MAAMwwC,EAAU1hF,SAASC,cAAc,OACvCyhF,EAAQx5E,UAAUxS,IAAIw7C,EAAa,UACnC,QAAMwwC,EAAS70E,GAEf,MAAM80E,EAAWhtF,KAAKitF,eAAiB5hF,SAASC,cAAc,OAC9D0hF,EAASz5E,UAAUxS,IAAIw7C,EAAa,UAEjCuwC,IACDE,EAASxtE,UAAY,GAAKotE,GAG5BvmF,EAAQqF,OAAOqhF,EAASC,GAExBhtF,KAAKoqD,MAAQ,IAAI,KAAc,CAC7BlrC,OACAtY,IAAKimF,EACLpmF,IAAKskC,GACJ6hD,GACH5sF,KAAKoqD,MAAM/1C,eACXrU,KAAKoqD,MAAMhrC,YAAY,CACrBC,QAAS3S,IACJ1M,KAAKywB,UACNzwB,KAAKywB,SAAS/jB,GAGbogF,IAEDE,EAASlyD,UAAY,GAAKpuB,E,IAKhC1M,KAAKoL,UAAUM,OAAOrF,EAASrG,KAAKoqD,MAAMh/C,UAC5C,EAGa,MAAM8hF,WAA8B,IAC1Cz2E,qBACL,MAAO,CACL02E,OAAQlvE,EAAA,wCACRmvE,YAAanvE,EAAA,+CACbkuE,cAAeluE,EAAA,kDAEnB,CAEOuU,KAAK7xB,GACVX,KAAKoL,UAAUmI,UAAUxS,IAAI,8BAC7Bf,KAAKs+E,SAAS,WAEd,MAAMl5C,EAAU,SAAqB,KAAMplC,KAAKswB,YAC1C+H,EAA2B,GAEjC,CACE,MAAMjtB,EAAYg6B,EAAQ,YAEpBglB,EAAQ,IAAIuiC,GAAqB,WAAY,EAAG1uE,EAAA,4BAAqC,GAAI,IAC/FmsC,EAAM35B,SAAY/jB,IAChBuR,EAAA,oCAA4C,4BAA6BvR,EAAM,EAGjF,MAAM2gF,GAAuB,OAAO,8BAA+B,CAACt5E,KAAM,QAASC,KAAM,mBAEnFs5E,EAAW,oBACjB,QAAiBD,GAAsB,KACrCrtF,KAAKuhF,OAAOC,UAAU,MAAkBp2D,KAAKkiE,EAAS,IAGxD,MAAMC,EAA0B,IAAI,KAAc,CAChDv5E,KAAM,mBACNkE,KAAM,aACN6mC,SAAU,6BACVltC,eAAgB7R,KAAK6R,iBAGvBzG,EAAUM,OACR0+C,EAAMh/C,UACNiiF,GACA,QAA2BE,GAAyBniF,U,CAIxD,CACE,MAAMA,EAAYg6B,EAAQ,cAEpB9U,EAAa,IAAI,KAAY,MAC7Bk9D,EAAkBl9D,EAAWllB,UACnCoiF,EAAgBj6E,UAAUxS,IAAI,oBAQ9B,MAAM0sF,EAAY,IAAIlsF,IACtB,IAAImsF,EAAeC,GAAA,aACfC,EAAUD,GAAA,YAEd,MAAME,EAAoB7qF,IACxB2qF,GAAA,aAA2B3qF,EAAK8qF,MAAO9qF,EAAKoI,WAE5C,MAAMvC,EAAW7F,EAAKoI,UAAUwM,cAAc,oBAC9C/O,SAAAA,EAAUrG,SAEV,MAAMurF,EAAqB/qF,EAAKgrF,oBAAoBJ,EAAU,iBAAmB,oBAC9EG,GACD/qF,EAAKoI,UAAU4M,QAAQ+1E,E,EAI3B,IAAIE,GAEJ,QAAiBT,GAAuBzlF,GAAM,mCAC5C,MAAMqD,GAAY,EAAAmS,GAAA,GAAgBxV,EAAE1H,OAAQ,mBAC5C,IAAI+K,EACF,OAGF,MAAM8iF,EAAaV,EAAgB51E,cAAc,WAC9Cs2E,GACDA,EAAW36E,UAAU/Q,OAAO,UAG9B,MAAMQ,EAAOyqF,EAAUxqF,IAAImI,GAO3B,GANAA,EAAUmI,UAAUxS,IAAI,gBAElB4sF,GAAA,gBAA8B3qF,EAAK8qF,OAEzCG,SAAAA,GAAiB,GAEdjrF,EAAKZ,QAAU6b,EAAA,6BAChB,GAAG,EAAAxb,UACEO,EAAKZ,OAAOkC,QACbtB,EAAKZ,OAAO+rF,cAET,CACFnrF,EAAKZ,OAAOkC,QACbtB,EAAKZ,OAAOiG,MAAK,GAGnBrF,EAAKZ,OAAOxB,GAAG,GAAG2K,MAAMsR,UAAY,WAEpC,MAAMuxE,EAAYH,EAAiBI,IAC9BrrF,EAAKZ,OAAOksF,WAAaD,IAAwB,IAAbA,IACrCrrF,EAAKZ,OAAOxB,GAAG,GAAG2K,MAAMsR,UAAY,GACpC7Z,EAAKZ,OAAOsP,oBAAoB,aAAc08E,GAE3CH,IAAkBG,IACnBH,OAAgBhqF,G,EAKtBvB,YAAW,KACNurF,IAAkBG,IAIrBprF,EAAKZ,OAAOqC,OACZzB,EAAKZ,OAAOwL,iBAAiB,aAAcwgF,GAAU,GACpD,I,CAGT,KAAG,CAACv8E,eAAgB7R,KAAK6R,iBAEzB,MAAM08E,EAA2C,IAAIntF,IAAI,CAAC,mBAAoB,mBAExEmN,EAAU5N,EAAEwsF,OAAO7+E,MAAW6+E,GAAW,mCAC7C,MAAMqB,EAAgBrB,EAAO/zD,QAAQ00D,GAAUA,EAAMrgF,OAAOghF,UAC5DD,EAAcviE,QAAQ,MAEtB,MAAMoM,EAAWm2D,EAAc1zE,KAAUgzE,GAAU,mCACjD,MAAM1iF,EAAYC,SAASC,cAAc,OACnC62E,EAAO,CACX/2E,YACA0iF,QACAE,oBAAqB,CAAC,GAGlBpyD,EAAUkyD,EAAM5C,SACrB9xD,QAAQs1D,GAAkBH,EAAoBlrF,IAAIqrF,EAAcC,WAAW/+E,KAC3EkL,KAAK4zE,IACJ,MAAME,EAAYF,EAAcG,UAC1B/kD,EAAS,kBAA8B8kD,GAE7C,OADAzM,EAAE6L,oBAAoBU,EAAcC,WAAW/+E,GAAKk6B,EAAO1+B,UACpD0+B,CAAM,IAGf2jD,EAAU7pF,IAAIwH,EAAW+2E,GAEzB0L,EAAiB1L,GAEd2L,EAAMlmF,KAAO8lF,EAAa9lF,IAC3BwD,EAAUmI,UAAUxS,IAAI,UAG1B,MACM2yB,EAA+B,GACrC,IAAIo7D,EACJ,GAHiBhB,EAAMpB,SAGV,CACXoC,EAAoBzjF,SAASC,cAAc,OAC3CwjF,EAAkBv7E,UAAUxS,IAAI,kBAChC,MAAM8G,EAAO,IACb,OAAiB,CACfijB,IAAKgkE,EACLxrE,MAAOzb,EACP6b,OAAQ7b,EACRq6C,MAAO4rC,EAAMpB,SACbzlF,SAAUjH,KAAKiH,SACfysB,eACAL,WAAYrzB,KAAKyvC,iBAAiBxsC,MAClCwB,MAAM,IACL6J,MAAK,EAAE26B,YAAYA,IAAQ36B,MAAMlM,IAClC+/E,EAAE//E,OAASA,CAAuB,G,CAItC,MAAM+6C,EAAS9xC,SAASC,cAAc,OACtC6xC,EAAO5pC,UAAUxS,IAAI,gBAErB,MAAMguF,EAAW5xC,EAAOh0B,YAiBxB,OAfA4lE,EAASx7E,UAAUxS,IAAI,SACvBo8C,EAAO5pC,UAAUxS,IAAI,UAErB2yB,EAAarxB,QAAQu5B,EAAQ9gB,KAAKgvB,GAAWA,EAAOlf,eAEpDxf,EAAUmI,UAAUxS,IAAI,yBAElBqgB,QAAQgI,IAAIsK,GAEfo7D,GACD1jF,EAAUM,OAAOojF,GAGnB1jF,EAAUM,OAAOqjF,EAAU5xC,GAEpB/xC,CACT,MAEMq3B,QAAmBrhB,QAAQgI,IAAIiP,GAErC/H,EAAW5kB,UAAU+2B,EACvB,MAEApK,EAASh2B,KAAKkM,GAEd,MAAMsqE,EAAOxtE,SAASC,cAAc,QACpCutE,EAAKttE,MAAMyjF,UAAY,QAEvB,MAAM92E,EAAO,QACP6mC,EAAW,iBAEXkwC,EAAS,IAAI,KAAI,CACrB7U,WAAY,IAAI,IAAW,CACzBjjB,QAAS,WACTj/C,OACAxL,MAAO,MACPqyC,eAIEmwC,EAAW,IAAI,KAAI,CACvB9U,WAAY,IAAI,IAAW,CACzBjjB,QAAS,aACTj/C,OACAxL,MAAO,QACPqyC,eAIEowC,EAAY,IAAI,KAAI,CACxB/U,WAAY,IAAI,IAAW,CACzBjjB,QAAS,yBACTj/C,OACAxL,MAAO,SACPqyC,eAIJ/+C,KAAK6R,eAAe9Q,IAAIkd,EAAA,EAAxBje,CAAmC,oBAAoB,EAAEwM,MAAKE,QAAOw+E,eAChE1+E,IAAQuyC,GACT9gC,EAAA,gBAAwB,e,IAI5Bje,KAAK6R,eAAe9Q,IAAIkd,EAAA,EAAxBje,CAAmC,gBAAgB,KACjD0tF,EAAeC,GAAA,aACf,MAAMyB,EAAazB,GAAA,YACnB,GAAGC,IAAYwB,EACb,OAGFxB,EAAUwB,EAEV,MAAMlB,EAAaV,EAAgB51E,cAAc,WAKjD,IAAIkK,EAJDosE,GACDA,EAAW36E,UAAU/Q,OAAO,UAI9BirF,EAAU1oF,SAAS/B,IACjB6qF,EAAiB7qF,GAEdA,EAAK8qF,MAAMlmF,KAAO8lF,EAAa9lF,KAChC5E,EAAKoI,UAAUmI,UAAUxS,IAAI,UAC7B+gB,EAAS9e,EAAKoI,U,IAIf0W,GACDwO,EAAW4F,kBAAkB,CAC3Bh0B,QAAS4f,EACTqU,SAAU,SACV41B,KAAM,K,IAKZ8sB,EAAKntE,OAAOujF,EAAO7jF,UAAW8jF,EAAS9jF,UAAW+jF,EAAU/jF,WAE5DA,EAAUM,OACR8hF,EACA3U,E,CAIJ,CACE,MAAMztE,EAAYg6B,EAAQ,oBAEpByzC,EAAOxtE,SAASC,cAAc,QAE9B4M,EAAO,gBACP6mC,EAAW,wBAEXswC,EAAW,IAAI,KAAI,CACvBjV,WAAY,IAAI,IAAW,CACzBjjB,QAAS,6BACTj/C,OACAxL,MAAO,QACPqyC,aAEF2mB,gBAAiB,4CAGb4pB,EAAe,IAAI,KAAI,CAC3BlV,WAAY,IAAI,IAAW,CACzBliE,OACAxL,MAAO,YACPqyC,aAEF2mB,gBAAiB,wCAEnB,QAAM4pB,EAAalV,WAAW76D,KAAM,iCAAkC,CAAC,EAAAxP,SAAW,IAAM,SAExF8oE,EAAKntE,OAAO2jF,EAASjkF,UAAWkkF,EAAalkF,WAC7CA,EAAUM,OAAOmtE,E,CAGnB,GAAG,KAA0B,CAC3B,MAAMztE,EAAYg6B,EAAQ,sBAEpByzC,EAAOxtE,SAASC,cAAc,QAE9B4M,EAAO,gBACP6mC,EAAW,wBAEXwwC,EAAgB,IAAI,KAAI,CAC5BnV,WAAY,IAAI,IAAW,CACzBjjB,QAAS,0BACTj/C,OACAxL,MAAO,aACPqyC,eAIEywC,EAAW,IAAI,KAAI,CACvBpV,WAAY,IAAI,IAAW,CACzBjjB,QAAS,qBACTj/C,OACAxL,MAAO,QACPqyC,eAIJ85B,EAAKntE,OAAO6jF,EAAcnkF,UAAWokF,EAASpkF,WAC9CA,EAAUM,OAAOmtE,E,CAGnB,CACE,MAAMztE,EAAYg6B,EAAQ,sBAEpByzC,EAAOxtE,SAASC,cAAc,QAE9B4M,EAAO,cACP6mC,EAAW,sBAEX0wC,EAA4D,CAChE,CAAC,MAAO,0BACR,CAAC,MAAO,2BAGJz6B,EAAOy6B,EAAQ30E,KAAI,EAAE40E,EAAQtjE,KACrB,IAAI,KAAI,CAClBguD,WAAY,IAAI,IAAW,CACzBjjB,QAAS/qC,EACTlU,OACAxL,MAAOgjF,EACP3wC,iBAOAlR,EChdG,SAAoBtb,EAAqBo9D,GAAW,GACjE,OCAa,SAAqBp9D,EAAqBq9D,EAA8BD,GAAW,GAChG,MAKME,EAAYt9D,EAKlB,IAAI5Y,EAQJ,OAZIg2E,IACFp9D,EAAW4F,GAAA,GAIb,SAAU23D,IACRv9D,IACA5Y,EAAUu1D,GAAA,aAAe4gB,EAAKF,IAC/B,CAHD,GAKAr9D,EAAWs9D,EAhBI,KACbp8E,aAAakG,EAAQ,CAkBzB,CDpBSo2E,CAAYx9D,GAAU,IAAuC,KAAhC,IAAK,IAAIxK,MAAOioE,eAAsBL,EAC5E,CD8cqBM,EAAW,KACxB,MAAMz5E,EAAO,IAAIuR,KAEjB0nE,EAAQ1qF,SAAQ,EAAE2qF,GAAS3mF,KACzB,MAAMkb,EAAMzN,EAAK05E,mBAAmB,cAAgBR,EAAQ,CAC1DS,KAAM,UACNC,OAAQ,YAGVp7B,EAAKjsD,GAAKsyB,SAASziB,YAAcqL,CAAG,GACpC,IAGJjkB,KAAKoiF,cAAcx0E,iBAAiB,UAAWigC,GAE/CgrC,EAAKntE,UAAUspD,EAAKl6C,KAAKqgB,GAAQA,EAAI/vB,aACrCA,EAAUM,OAAOmtE,E,CAGnB,CACE,MAAMztE,EAAYg6B,EAAQ,SAEpBirD,EAAuB,IAAI,KAAc,CAC7Cr8E,KAAM,kCACNkE,KAAM,gBACN6mC,SAAU,yBACVltC,eAAgB7R,KAAK6R,iBAEjBy+E,EAAmB,IAAI,KAAc,CACzCt8E,KAAM,2BACNkE,KAAM,YACN6mC,SAAU,qBACVltC,eAAgB7R,KAAK6R,iBAGvBzG,EAAUM,QACR,QAA2B2kF,GAAsBjlF,WACjD,QAA2BklF,GAAkBllF,U,CAIjD,CACE,MAAMg6B,EAAU,IAAI,IAAe,CAACltB,KAAM,2CAA4C5E,QAAS,oBAEzFi9E,EAAe,IAAI,KAAI,CAC3Bt5B,aAAc,mBACd37B,aAAa,EACblM,UAAW,KACTpvB,KAAKuhF,OAAOC,UAAUuK,IAAqB3gE,MAAM,EAEnDvZ,eAAgB7R,KAAK6R,iBAGjB2+E,EAAsB,KAC1B7vF,EAAEwrF,cAAc79E,MAAM+9E,GACF,sBAAfA,EAASz8E,EACHy8E,EAASG,YAETxsF,KAAKiH,SAAS4pD,gBAAgB4/B,uBAAuBpE,EAASqE,eAEtEpiF,MAAM3M,KACP,QAAiB,CACfw5B,IAAKo1D,EACL5uF,MACAkG,KAAM,SACN,GACF,EAGJ2oF,IAEAxwF,KAAK6R,eAAe9Q,IAAIkd,EAAA,EAAxBje,CAAmC,iBAAkBwwF,GAErD,MAAMH,EAAuB,IAAI,KAAc,CAC7Cr8E,KAAM,2BACNkE,KAAM,UACN6mC,SAAU,4BACVltC,eAAgB7R,KAAK6R,iBAEjB8+E,EAAoB,IAAI,KAAc,CAC1C38E,KAAM,iCACNkE,KAAM,OACN6mC,SAAU,yBACVltC,eAAgB7R,KAAK6R,iBAGjB++E,EAAmC,CAAC,EAEpCC,EAAkBzrD,EAAQ24C,yBAE1B1/D,EAAgB,IAAI,KACpByzC,EAAmB,CAACzK,EAAmCvrB,EAA+B,YAC1F,MAAMX,EAAM,IAAI,KAAI,CAClBpsB,OAAO,EAAAia,EAAA,GAAcq+B,EAAWt4C,OAChC22D,gBAAiB,WACjB+U,iBAAkB,CAACpzB,EAAWj2B,OAC9BkK,aAAa,EACblM,UAAW,KACT,IAAI,KAAc,CAACxnB,GAAIy/C,EAAWz/C,GAAI0/C,YAAaD,EAAWC,cAAc/7B,MAAM,EAEpF1Z,eAAgB7R,KAAK6R,iBAGvB++E,EAAYvpC,EAAWz/C,IAAMuzB,EAE7B,MAAMrQ,EAAMzf,SAASC,cAAc,OACnCwf,EAAIvX,UAAUxS,IAAI,cAElB,QAAoB,CAClB6C,IAAKyjD,EACLj8C,UAAW0f,EACXxqB,MAAO,mBACP+d,gBACAiF,MAAO,GACPI,OAAQ,GACRlf,UAAU,EACV6uB,WAAYrzB,KAAKyvC,iBAAiBxsC,QAGpCk4B,EAAI/vB,UAAUM,OAAOof,GAErB+lE,EAAgB/0D,GAAQX,EAAI/vB,UAAU,EAGlCmD,EAAU5N,EAAEysF,YAAY9+E,MAAM8+E,KAClC,EAAA0D,GAAA,GAAoD1D,GACpD,MAAM/0D,EAAW+0D,EAAYh8B,KAAKt2C,KAAKusC,GAAeyK,EAAiBzK,KACvE,OAAOjmC,QAAQgI,IAAIiP,EAAS,IAG9BA,EAASh2B,KAAKkM,GAEdvO,KAAK6R,eAAe9Q,IAAIkd,EAAA,EAAxBje,CAAmC,sBAAuB4D,IACpDgtF,EAAYhtF,EAAIgE,KAClBkqD,EAAiBluD,EAAK,U,IAI1B5D,KAAK6R,eAAe9Q,IAAIkd,EAAA,EAAxBje,CAAmC,oBAAqB4D,IACnDgtF,EAAYhtF,EAAIgE,MACjBgpF,EAAYhtF,EAAIgE,IAAIwD,UAAU5I,gBACvBouF,EAAYhtF,EAAIgE,I,IAI3Bw9B,EAAQzyB,QAAQjH,OACd6kF,EAAanlF,WACb,QAA2BilF,GAAsBjlF,WACjD,QAA2BulF,GAAmBvlF,WAEhDpL,KAAKswB,WAAW5kB,OAAO05B,EAAQh6B,U,CAGjC,OAAOgW,QAAQgI,IAAIiP,EACrB,E,6YGtlBa,MAAM04D,WAA0B,IAA/C,c,oBAQU,KAAAC,gBAA6C,CAAC,CAsUxD,CAnUSv6E,qBACL,MAAO,CACLw6E,cAAeC,GAAA,+BAA0C,aACzDzvD,QAASxjB,EAAA,6CAEb,CAEckzE,aACZC,EACAhmF,EACA+vB,EACAzvB,G,0CAEA,IAAI0tB,EACAmB,EAAc,GAClB,MAAMvT,EAAmB,GACzB,GAAsB,0BAAnBoqE,EAAaxhF,EACdwpB,EAASg4D,EAAah4D,OACtBmB,EAAc62D,EAAa72D,gBACtB,CAQL,GAPAnB,EAASg4D,EAOa,IALCjtF,OAAOC,KAAKg1B,EAAO3rB,QAAQ5K,OAKzB,CACvB,MAAM4K,EAAS2rB,EAAO3rB,OACtB,IAAI00E,EACD10E,EAAOywB,SAAUikD,EAAI,oBAChB10E,EAAO4jF,aAAclP,EAAI,uBACzB10E,EAAOvJ,OAAQi+E,EAAI,kBACnB10E,EAAO6jF,WAAYnP,EAAI,oBACvB10E,EAAO8jF,OAAMpP,EAAI,iBAEtBA,GACDn7D,EAAE3kB,MAAK,QAAK8/E,G,CAIhB,IAAIn7D,EAAEnkB,OAAQ,CACZ,MAAM2uF,QAAexxF,KAAKiH,SAASy3B,eAAe+yD,iBAAiBr4D,EAAOxxB,IAC1E,IAAI44E,EAAQ,EAAGkR,EAAW,EAAGxtF,EAAS,QAChCkd,QAAQgI,IAAIooE,EAAO12E,KAAUiO,GAAW,0CACnC/oB,KAAKiH,SAASqI,gBAAgBqiF,WAAW5oE,EAAO/gB,SAAS9D,WACpDlE,KAAKiH,SAASqI,gBAAgB4zB,YAAYna,EAAO/gB,SAAS0pF,IACnElR,GACP,OAEGA,GAAOx5D,EAAE3kB,MAAK,QAAK,QAAS,CAACm+E,KAC7BkR,GAAU1qE,EAAE3kB,MAAK,QAAK,WAAY,CAACqvF,KACnCxtF,GAAQ8iB,EAAE3kB,MAAK,QAAK,SAAU,CAAC6B,I,EAItC,GAAIi3B,EA6BC/B,EAAOxxB,KAAO,QACf,EAAA2hB,EAAA,GAAe4R,EAAIpsB,OAAO,EAAAia,EAAA,GAAcoQ,EAAOrqB,QAGjDosB,EAAIE,SAASziB,YAAc,GAC3BuiB,EAAIE,SAAS3vB,WAAU,QAAKsb,SAtB5B,GAXAmU,EAAM,IAAI,KAAI,CACZpsB,MAAOqqB,EAAOxxB,KAAO,OAAgB,QAAK,mBAAoB,EAAAohB,EAAA,GAAcoQ,EAAOrqB,OACnFssB,SAAUd,EACVnL,WAAW,EACX6rD,mBAAuC,0BAAnBmW,EAAaxhF,EAAgC,WAAQ3L,IAGxE+iB,EAAEnkB,QACHs4B,EAAIE,SAAS3vB,WAAU,QAAKsb,IAGR,iBAAnBoqE,EAAaxhF,EAAsB,CACpC,MAAMivB,EAAWzF,EAAOxxB,GACxB,IAAI5H,KAAKgxF,gBAAgB53D,EAAOxxB,KAAOwxB,EAAOxxB,KAAO,MAAe,CAClE,MAAM0lF,EAAW,oBACjB,QAAiBnyD,EAAI/vB,WAAW,IAAW,mCACzC,MAAMguB,QAAep5B,KAAKiH,SAAS2qF,eAAeC,UAAUhzD,GACtD3rB,EAAMlT,KAAKuhF,OAAOC,UAAU,MAClCtuE,EAAI4+E,cAAc14D,GAClBlmB,EAAIkY,KAAKkiE,EACX,KAAG,CAACz7E,eAAgB7R,KAAK6R,gB,CAG3B7R,KAAKgxF,gBAAgB53D,EAAOxxB,IAAMuzB,EAElCA,EAAIsgD,c,CAWR,MAAM3wD,EAAMqQ,EAAI/vB,UAEhB,GAAGM,EAAQ,CACT,MAAMqmF,EAAW34D,EAA0B24D,aAC5B9tF,IAAZ8tF,GAED,EAAA/uD,GAAA,GAAuBlY,EAAKA,EAAI7R,eAAiB7N,EAAW2mF,GACpD3mF,GACRA,EAAUM,OAAOof,E,CAIrB,OAAOqQ,CACT,G,CAEO3I,KAAK7xB,EAAyDowF,GAAkBiB,eACrFhyF,KAAKoL,UAAUmI,UAAUxS,IAAI,0BAC7Bf,KAAKs+E,SAAS,8BAEdt+E,KAAKswB,WAAWllB,UAAUmI,UAAUxS,IAAI,gBAExCf,KAAKgjF,iBAAmB33E,SAASC,cAAc,OAC/CtL,KAAKgjF,iBAAiBzvE,UAAUxS,IAAI,qBAEpC,MAAMuS,EAAUjI,SAASC,cAAc,OACvCgI,EAAQC,UAAUxS,IAAI,YACtB,QAAM,CAACmB,QAASoR,EAAS9G,IAAK,2BAE9BxM,KAAKiyF,iBAAkB,OAAO,kDAAmD,CAC/Ej+E,KAAM,2BACND,KAAM,QAGR/T,KAAKkyF,eAAiB,IAAI,IAAe,CACvCh6E,KAAM,YAERlY,KAAKkyF,eAAe9mF,UAAUmI,UAAUxS,IAAI,QAE5Cf,KAAKwvB,KAAOnkB,SAASC,cAAc,OACnCtL,KAAKkyF,eAAev/E,QAAQjH,OAAO1L,KAAKwvB,MAExCxvB,KAAKmyF,iBAAmB,IAAI,IAAe,CACzCj6E,KAAM,sBAERlY,KAAKmyF,iBAAiB/mF,UAAUmI,UAAUxS,IAAI,QAE9Cf,KAAKswB,WAAW5kB,OACd1L,KAAKgjF,iBACL1vE,EACAtT,KAAKiyF,gBACLjyF,KAAKkyF,eAAe9mF,UACpBpL,KAAKmyF,iBAAiB/mF,YAGxB,QAAiBpL,KAAKiyF,iBAAiB,IAAW,0CACrCjyF,KAAKoyF,mBAGdpyF,KAAKuhF,OAAOC,UAAU,MAAkBp2D,QAFxC,QAAe,UAInB,KAAG,CAACvZ,eAAgB7R,KAAK6R,iBAEzB,MAAMwgF,EAA2B,KAC/BryF,KAAKkyF,eAAe9mF,UAAUmI,UAAU1J,OAAO,QAAS1F,OAAOC,KAAKpE,KAAKgxF,iBAAiBnuF,OAAO,EAG7F6wB,EAA+B,GAC/B4+D,EAAuB3xF,EAAE8gC,QAAQnzB,MAAWmzB,GAAY,mCAC5D,IAAI,MAAMrI,KAAUqI,EACfrI,EAAOxxB,KAAO,cAIX5H,KAAKmxF,aAAa/3D,EAAQp5B,KAAKwvB,UAAMvrB,GAAW,IAGxDjE,KAAKuyF,iBAELF,GACF,MAyFA,OAvFA3+D,EAAarxB,KAAKiwF,GAElBtyF,KAAK6R,eAAe9Q,IAAIkd,EAAA,EAAxBje,CAAmC,iBAAuBo5B,GAAW,mCACnE,MAAMmvB,EAAiBvoD,KAAKgxF,gBAAgB53D,EAAOxxB,IAChD2gD,QACKvoD,KAAKmxF,aAAa/3D,EAAQ,KAAMmvB,GAC9BnvB,EAAOxxB,KAAO,cAChB5H,KAAKmxF,aAAa/3D,EAAQp5B,KAAKwvB,UAAMvrB,GAAW,IAGxDouF,IAEAryF,KAAKwyF,qBACP,MAEAxyF,KAAK6R,eAAe9Q,IAAIkd,EAAA,EAAxBje,CAAmC,iBAAkBo5B,IACnD,MAAMmvB,EAAiBvoD,KAAKgxF,gBAAgB53D,EAAOxxB,IAChD2gD,IAMDvoD,KAAKwyF,sBAELjqC,EAAen9C,UAAU5I,gBAClBxC,KAAKgxF,gBAAgB53D,EAAOxxB,KAGrCyqF,GAA0B,IAG5BryF,KAAK6R,eAAe9Q,IAAIkd,EAAA,EAAxBje,CAAmC,gBAAiBivD,IAClDA,EAAM71B,QAAQyF,KAAe7+B,KAAKgxF,gBAAgBnyD,KAAW95B,SAAQ,CAAC85B,EAAU91B,KAC9E,MACMqC,EADiBpL,KAAKgxF,gBAAgBnyD,GACXzzB,WACjC,EAAA43B,GAAA,GAAuB53B,EAAWA,EAAU6N,cAAelQ,EAAM,EAAE,GACnE,IAGJ/I,KAAK6R,eAAe9Q,IAAIkd,EAAA,EAAxBje,CAAmC,kBAAkB,KACnDA,KAAKuyF,gBAAgB,IAGvBvyF,KAAKyyF,qBAAuB9xF,EAAEswF,cAAc3iF,MAAW8B,GAAO,mCAC5D,MAAMhO,QAAegO,EAAG,CACtBhF,UAAWpL,KAAKgjF,iBAChBt/E,MAAM,EACNc,UAAU,EACV8e,MAAO,GACPI,OAAQ,KAKV,OAFA1jB,KAAKS,UAAY2B,EAEV8uF,GAAA,oBAA+B9uF,EACxC,MAEAsxB,EAAarxB,KAAKrC,KAAKyyF,sBAEvB,IAAI,KAAS,CACXjjE,KAAMxvB,KAAKwvB,KACX6D,WAAYrzB,KAAKyvC,iBAAiBxsC,MAClCyvF,OAAQ,CAACC,EAASC,KAChB,IAAI3jC,EAAkB,GACtB,IAAI,MAAMpwB,KAAY7+B,KAAKgxF,gBAAiB,CAC1C,MAAM71D,EAAMn7B,KAAKgxF,gBAAgBnyD,GAEjCowB,GADY,EAAApF,GAAA,GAAW1uB,EAAI/vB,aACbyzB,C,CAGhBowB,EAAQA,EAAM71B,QAAQyF,QAA0B56B,IAAb46B,IAC/B5gB,EAAA,YACF,EAAA21C,GAAA,GAAiB3E,EAAO,OAI1BjvD,KAAKiH,SAAS2qF,eAAeiB,yBAAyB5jC,EAAM,EAE9D3+B,WAAYtwB,KAAKswB,aAGnBtwB,KAAKwyF,sBAKEpxE,QAAQgI,IAAIsK,EACrB,CAEAywD,qBAME,OALAnkF,KAAKyyF,qBAAqBnkF,MAAK,KAC7BtO,KAAKS,UAAU+D,UAAW,EAC1BxE,KAAKS,UAAUgE,MAAM,IAGhByN,MAAMiyE,oBACf,CAEQoO,iBACiBvyF,KAAKgxF,gBAAgB,OAC7B5lF,UAAUmI,UAAU1J,OAAO,QAASoU,EAAA,UACrD,CAEcm0E,kB,0CACZ,MAAOlhE,EAAOuQ,SAAiBrgB,QAAQgI,IAAI,CACzCppB,KAAKiH,SAASqwD,WAAWC,SAAS,WAClCv3D,KAAKiH,SAAS2qF,eAAekB,qBAI/B,OADsBrxD,EAAQrI,QAAQA,IAAY,UAAiBA,EAAOxxB,MAAK/E,OACxDquB,CACzB,G,CAEQshE,sBACN,OAAOxyF,KAAKiH,SAAS2qF,eAAemB,6BAA6BzkF,MAAW0kF,GAAqB,mCAC/FhzF,KAAKmyF,iBAAiB/mF,UAAUmI,UAAU1J,OAAO,QAASmpF,EAAiBnwF,QAC3EqW,MAAMC,KAAKnZ,KAAKmyF,iBAAiBx/E,QAAQ4iB,UAAU+B,MAAM,GAAGvyB,SAASnE,GAAOA,EAAG4B,WAE/E,IAAI,MAAM42B,KAAU45D,EAAkB,CACpC,MAAM73D,QAAYn7B,KAAKmxF,aAAa/3D,GACpCp5B,KAAKmyF,iBAAiBx/E,QAAQjH,OAAOyvB,EAAI/vB,WAEzC,MAAMkL,EAAS6kB,EAAI45C,aACnB,QAAiBz+D,GAAcvO,GAAM,mCAGnC,IAFA,EAAAqS,EAAA,GAAYrS,WAED/H,KAAKoyF,mBAEd,YADA,QAAe,WAIjB97E,EAAO3I,aAAa,WAAY,QAEhC,MAAMk3B,EAAIzL,EAAOA,OACjByL,EAAEouD,eAAiB,GACnBpuD,EAAEquD,eAAiB,GACnBruD,EAAEsuD,cAAgB,GAElBnzF,KAAKiH,SAAS2qF,eAAewB,mBAAmBvuD,GAAG,GAAMv2B,MAAK,KAC5D6sB,EAAI/vB,UAAU5I,SACdxC,KAAKmyF,iBAAiB/mF,UAAUmI,UAAU1J,OAAO,OAA4D,IAApD7J,KAAKmyF,iBAAiBx/E,QAAQ+c,kBAAwB,IAC9GvX,SAAQ,KACT7B,EAAOsxC,gBAAgB,WAAW,GAEtC,KAAG,CAAC/1C,eAAgB7R,KAAK6R,gB,CAE7B,KACF,E,iUCtVa,MAAMwhF,WAA4B,IACxC7gE,OACLxyB,KAAKoL,UAAUmI,UAAUxS,IAAI,2BAC7Bf,KAAKs+E,SAAS,+CAEd,MAAMgV,EAAiBzlE,IAKrB,MAAMuX,EAAU,IAAI,IAAe,CACjCltB,KAAM2V,EAAQ3V,OAGVq7E,EAAa,IAAI,KAAI,CACzBhsD,cAAe,IAAI,KAAc,CAACvzB,KAAM6Z,EAAQ2lE,SAAU5tD,SAAS,IACnE8/B,gBAAiB,UACjB7zD,eAAgB7R,KAAK6R,eACrB8oE,sBAAsB,IAGlB8Y,EAAoB,IAAI,KAAI,CAChClsD,cAAe,IAAI,KAAc,CAACvzB,KAAM,iBAAkB4xB,SAAS,IACnE8/B,gBAAiB,UACjB7zD,eAAgB7R,KAAK6R,eACrB8oE,sBAAsB,IAGxBv1C,EAAQzyB,QAAQjH,OAAO6nF,EAAWnoF,UAAWqoF,EAAkBroF,WAE/DpL,KAAKswB,WAAW5kB,OAAO05B,EAAQh6B,WAE/B,MAAMsoF,EAAkB,CAAC9jF,EAAGie,EAAQo0D,UAC9Bn9D,EAAM9kB,KAAKiH,SAAS++D,wBAAwB2tB,kBAAkBD,IACnE5uE,aAAe1D,QAAU0D,EAAM1D,QAAQjT,QAAQ2W,IAAMxW,MAAMslF,IAC1D,MAAMC,EAAgB,IAAW,mCAC/B,MAAM9mF,QAAc/M,KAAKiH,SAAS++D,wBAAwB8tB,QAAQF,GAIlE,OAHAL,EAAWhsD,cAAc3B,SAAW74B,EACpC0mF,EAAkBlsD,cAAc3B,QAAUguD,EAAeG,cAElDhnF,CACT,IAEA8mF,IAEA7zF,KAAKoiF,cAAcx0E,iBAAiB,WAAW,IAAW,mCACxD,MAAMomF,GAAQT,EAAWhsD,cAAc3B,QACjCquD,EAAeR,EAAkBlsD,cAAc3B,QAErD,GAAGouD,WAAgBh0F,KAAKiH,SAAS++D,wBAAwB8tB,QAAQF,KAAoBK,IAAiBL,EAAeG,cACnH,OAGF,MAAMG,GAAyC,EAAAvwD,GAAA,GAAKiwD,GACpDM,EAActkF,EAAI,0BAClBskF,EAAcC,WAAaH,EAAO,MAAa,EAC/CE,EAAcH,cAAgBE,SACvBC,EAAcE,MAErBp0F,KAAKiH,SAAS++D,wBAAwBquB,qBAAqBX,EAAiBQ,EAC9E,KAAG,CAACjmF,MAAM,IAEVjO,KAAK6R,eAAe9Q,IAAIkd,EAAA,EAAxBje,CAAmC,mBAAoBy+B,IACrD,MAAMwjD,EAAWgG,GAAqBxpD,EAAO9B,KAAK/sB,GAC/Cie,EAAQo0D,WAAaA,IACtB2R,EAAiBn1D,EAAO61D,gBACxBT,I,GAEF,GACF,EAGJP,EAAc,CACZp7E,KAAM,4BACNs7E,SAAU,+BACVvR,SAAU,qBAGZqR,EAAc,CACZp7E,KAAM,sBACNs7E,SAAU,yBACVvR,SAAU,qBAGZqR,EAAc,CACZp7E,KAAM,wBACNs7E,SAAU,2BACVvR,SAAU,0BAGZ,CACE,MAAM78C,EAAU,IAAI,IAAe,CACjCltB,KAAM,uBAGFq8E,EAAoB,IAAI,KAAI,CAChChtD,cAAe,IAAI,KAAc,CAACvzB,KAAM,gBAAiB4xB,SAAS,IAClE8/B,gBAAiB,UACjB7zD,eAAgB7R,KAAK6R,eACrB8oE,sBAAsB,IAGlB6Z,EAAW,IAAI,KAAI,CACvBjtD,cAAe,IAAI,KAAc,CAACvzB,KAAM,sBAAuB4xB,SAAS,EAAMmZ,SAAU,+BAAgCltC,eAAgB7R,KAAK6R,iBAC7I6zD,gBAAiB,UACjB7zD,eAAgB7R,KAAK6R,eACrB8oE,sBAAsB,IAGxB,gBAA2BrsE,MAAMwe,IAC/B0nE,EAASjtD,cAAc3B,QAAU9Y,EAAMo+D,SAASplB,cAAc2uB,KAAK,IAGrErvD,EAAQzyB,QAAQjH,OAAO6oF,EAAkBnpF,UAAWopF,EAASppF,WAE7DpL,KAAKswB,WAAW5kB,OAAO05B,EAAQh6B,WAE/BpL,KAAKiH,SAAS++D,wBAAwB0uB,+BAA+BpmF,MAAMqD,IACzE4iF,EAAkBhtD,cAAc3B,QAAUj0B,EAE1C3R,KAAKoiF,cAAcx0E,iBAAiB,WAAW,KAC7C,MAAMy9E,EAAWkJ,EAAkBhtD,cAAc3B,QAC9Cj0B,IAAY05E,GACbrrF,KAAKiH,SAAS++D,wBAAwB2uB,8BAA8BtJ,E,GAErE,CAACp9E,MAAM,GAAM,G,CAGtB,ECrIa,MAAM2mF,WAAuB,IACnCn+E,qBACL,MAAO,CACLo+E,WAAY52E,EAAA,yCAAiD,wBAAyB,CACpF62E,UAAW,QAKbC,WAAY3zE,QAAQjT,QAAQ,IAEhC,CAEOqkB,KAAK7xB,GACVX,KAAK+nD,OAAOx0C,UAAUxS,IAAI,eAC1Bf,KAAKoL,UAAUmI,UAAUxS,IAAI,sBAC7Bf,KAAKs+E,SAAS,mCAEd,MAAMl5C,EAAU,IAAI,IAAe,CAAC,GAE9B67C,EAA8B,IAAI1/E,IAElCgN,EAAU6S,QAAQgI,IAAI,CAC1BzoB,EAAEk0F,WACFl0F,EAAEo0F,aACDzmF,MAAK,EAAEumF,EAAYE,MACpB,MAAMC,EAAwB,IAAI5zF,IAC5B6zF,EAAeJ,EAAW/5E,KAAKo6E,GAAaA,EAASC,YAErD76C,GAAS,SACfu6C,EAAW91E,OAAOg2E,GAAYhwF,SAASmwF,IACrC,GAAGF,EAAS3xF,IAAI6xF,EAASC,WAAY,OACrCH,EAASj0F,IAAIm0F,EAASC,WAEtB,MAAMh6D,EAAM,IAAI,KAAI,CAClBi/C,WAAY,IAAI,IAAW,CACzBpmE,KAAMkhF,EAASh9E,KACfA,KAAMoiC,EACN5tC,MAAOwoF,EAASC,YAElB95D,SAAU65D,EAASE,cAGrBnU,EAAUr9E,IAAIsxF,EAASC,UAAWh6D,EAAI,IAGxC,MAAM09C,GAAO,QAAkB,IAAIoI,EAAUn5C,WAAYp7B,IACvD,iBAAiBA,EAAOuoF,EAAalgF,SAASrI,GAAO,IAGvD,wBAAwB4B,MAAM+mF,IAC5B,MAAMl6D,EAAM8lD,EAAUh+E,IAAIoyF,EAASF,WAC/Bh6D,EAKJA,EAAIi/C,WAAWl7B,kBAAiB,GAJ9B9yC,QAAQigB,MAAM,SAAU8O,EAAKk6D,EAIM,IAGvCjwD,EAAQzyB,QAAQjH,OAAOmtE,EAAK,IAK9B,OAFA74E,KAAKswB,WAAW5kB,OAAO05B,EAAQh6B,WAExBmD,CACT,E,qCCpEK,SAAS+mF,GAA4B1zF,EAAkCmN,EAAoB8C,GAChG,MAAMuzB,EAAU,IAAI,IAAe,CAACltB,KAAMnJ,IAEpCvC,EAAM,yBAA2B5K,EAAO,IACxC2zF,EAAwB,IAAI,KAAc,CAC9CvhF,KAAM,uBACNkE,KAAM,WACN6mC,SAAUvyC,EAAM,WAChBqF,mBAEI2jF,EAAuB,IAAI,KAAc,CAC7CxhF,KAAM,2BACNkE,KAAM,UACN6mC,SAAUvyC,EAAM,UAChBqF,mBAEI4jF,EAAsB,IAAI,KAAc,CAC5CzhF,KAAM,yBACNkE,KAAM,SACN6mC,SAAUvyC,EAAM,SAChBqF,mBAEI6jF,EAAwB,IAAI,KAAc,CAC9C1hF,KAAM,uBACNkE,KAAM,WACN6mC,SAAUvyC,EAAM,WAChBqF,mBAUF,OAPAuzB,EAAQzyB,QAAQjH,QACd,QAA2B6pF,GAAuBnqF,WAClD,QAA2BoqF,GAAsBpqF,WACjD,QAA2BqqF,GAAqBrqF,WAChD,QAA2BsqF,GAAuBtqF,WAG7Cg6B,CACT,CAEe,MAAMuwD,WAAgC,IAC5CnjE,OACLxyB,KAAKs+E,SAAS,sBAEd,MAAMl5C,EAAUkwD,GAA4B,QAAS,0BAA2Bt1F,KAAK6R,gBACrF7R,KAAKswB,WAAW5kB,OAAO05B,EAAQh6B,UACjC,EC5Ca,MAAMwqF,WAA+B,IAC3CpjE,OACLxyB,KAAKs+E,SAAS,qBAEd,MAAMuX,GAAgB,EAAAp8E,GAAA,IAAUq8E,IAC9B91F,KAAKiH,SAAS8uF,gBAAgBC,SAAS,yCAA0CF,EAAQ,GACxF,KAAK,GAAO,GAET1wD,EAAUkwD,GAA4B,OAAQ,yBAA0Bt1F,KAAK6R,gBAE7EokF,EAAM,OAGNC,EAAYC,SAEZL,EAAU73E,EAAA,yCACVvR,EAAQlG,KAAKyvC,KAAKzvC,KAAKyvC,MAAM6/C,EAAUG,GAAOC,IAC9CE,EAAO,IAAI,iBAAiB,CAChC5pF,IAAK,4BACL4oD,KAAM,EAAC,EAAAihC,GAAA,GAAYP,MAEf1rC,EAAQ,IAAIuiC,GAAqB,0BAA2B,IAAMjgF,EAAO,EAAG,GAAG,GACrF09C,EAAM35B,SAAY/jB,IAChB,MAAMopF,EAAW,SAAAppF,EAAS,GAAIwpF,EAAYD,EAAO,EAEjDG,EAAKE,iBAAiB,CAAClhC,KAAM,EAAC,EAAAihC,GAAA,GAAYP,MAE1CD,EAAcC,EAAQ,EAGxB1rC,EAAM6iC,eAAevhF,OAAO0qF,EAAKl0F,SAEjCkjC,EAAQzyB,QAAQjH,OAAO0+C,EAAMh/C,WAE7BpL,KAAKswB,WAAW5kB,OAAO05B,EAAQh6B,UACjC,ECxCa,MAAMmrF,WAAgC,IAC5C/jE,OACLxyB,KAAKs+E,SAAS,sBAEd,MAAMl5C,EAAUkwD,GAA4B,QAAS,0BAA2Bt1F,KAAK6R,gBACrF7R,KAAKswB,WAAW5kB,OAAO05B,EAAQh6B,UACjC,ECWF,MAAMorF,GAAmF,CACvFt4D,SAAU,uBACVu4D,QAAS,iBACTvyF,OAAQ,qBACRwtF,SAAU,wBAGG,MAAMgF,WAA6B,IACnClkE,O,qCACXxyB,KAAKs+E,SAAS,gBAEd,CACE,MAAMl5C,EAAU,IAAI,IAAe,CAACltB,KAAM,yBAA0B5E,QAAS,0BAEvEwZ,QAAc,gBAEd6pE,EAAoB,IAAI,KAAc,CAC1C3iF,KAAM,oBACNkE,KAAM,OACN0tB,SAAU9Y,EAAMo+D,SAAS0L,gBAAgBnpF,OAAOijC,SAChD7+B,eAAgB7R,KAAK6R,iBAGjBglF,EAAU,IAAI,KAAI,CACtBtvD,cAAeovD,EACf9kF,eAAgB7R,KAAK6R,iBAGjB4e,EAAW,MACf,EAAAquB,EAAA,GAAiB,CAACg4C,IAChB,EAAAC,GAAA,GAAUjqE,EAAMo+D,SAAS59C,aAAc,8BACvC,EAAAypD,GAAA,GAAUjqE,EAAMo+D,SAAS0L,gBAAiB,+BAAqC,EAG7EI,EAAe,KACnBh3F,KAAKi3F,wBAAwBC,EAAUpqE,EAAMo+D,SAAS59C,aAAaxU,OACnE94B,KAAKi3F,wBAAwBE,EAAUrqE,EAAMo+D,SAAS59C,aAAapnC,OACnElG,KAAKi3F,wBAAwBG,EAAStqE,EAAMo+D,SAAS59C,aAAau+B,KAAM/+C,EAAMo+D,SAAS0L,gBAAgBS,cAAc,EAGjHC,EAAWC,IACf,MAAMrkF,EAAMlT,KAAKuhF,OAAOC,UAAU+V,GAClCrkF,EAAIkY,OAEJprB,KAAK6R,eAAe9Q,IAAImS,EAAIkvE,cAA5BpiF,CAA2C,WAAW,KACpDg3F,IACAvmE,GAAU,GACT,CAACxiB,MAAM,GAAM,EAGZipF,EAAW,IAAI,KAAI,CACvBjgC,aAAc,qBACd57B,SAAU,GACVjM,UAAW,KACTkoE,EAAQ3B,GAAwB,EAElC9jF,eAAgB7R,KAAK6R,iBAGjBslF,EAAW,IAAI,KAAI,CACvBlgC,aAAc,qBACd57B,SAAU,GACVjM,UAAW,KACTkoE,EAAQf,GAAwB,EAElC1kF,eAAgB7R,KAAK6R,iBAGjBulF,EAAU,IAAI,KAAI,CACtBngC,aAAc,oBACd57B,SAAU,GACVjM,UAAW,KACTkoE,EAAQ1B,GAAuB,EAEjC/jF,eAAgB7R,KAAK6R,iBAGjBilF,GAAc,OAAO,sCAAuC,CAAC/iF,KAAM,SAAUC,KAAM,iCACzF,QAAiB8iF,GAAa,MAC5B,EAAA72C,GAAA,GAAkB,CAChBgX,aAAc,wCACdC,mBAAoB,mCACpB5gD,OAAQ,CACN6gD,QAAS,WAEV7oD,MAAK,KACN,MAAM48E,EAAWjtE,EAAA,WACjBitE,EAAS0L,iBAAkB,EAAAjzD,GAAA,GAAK,+BAChCunD,EAAS59C,cAAe,EAAA3J,GAAA,GAAK,4BAC7B7W,EAAMo+D,SAAWA,EACjBlrF,KAAKiH,SAAS8uF,gBAAgBC,SAAS,WAAY9K,GAEnD8L,IACAL,EAAkB/wD,SAAW9Y,EAAMo+D,SAAS0L,gBAAgBnpF,OAAOijC,QAAQ,GAC3E,IAGJ,MAAM8mD,EAAmB,KACvB,MAAM9mD,GAAYimD,EAAkB/wD,QAE9BslD,EAAWjtE,EAAA,WACdyyB,EACDw6C,EAAS0L,gBAAgBnpF,OAAOijC,UAAW,SAEpCw6C,EAAS0L,gBAAgBnpF,OAAOijC,SAGzC,CAACwmD,EAAUC,EAAUC,GAASryF,SAASo2B,IACrCA,EAAI/vB,UAAUmI,UAAU1J,OAAO,cAAe6mC,EAAS,IAGzD1wC,KAAKiH,SAAS8uF,gBAAgBC,SAAS,WAAY9K,GAEnDz6D,GAAU,EAGZkmE,EAAkB5lE,MAAMnjB,iBAAiB,SAAU4pF,GACnDA,IACAR,IAEA5xD,EAAQzyB,QAAQjH,OACdmrF,EAAQzrF,UACR8rF,EAAS9rF,UACT+rF,EAAS/rF,UACTgsF,EAAQhsF,UACR0rF,GAGF92F,KAAKswB,WAAW5kB,OAAO05B,EAAQh6B,U,CAGjC,CACE,MAAMg6B,EAAU,IAAI,IAAe,CAACltB,KAAM,kBAE1CktB,EAAQzyB,QAAQjH,OAAO,IAAI,KAAI,CAC7B67B,cAAe,IAAI,KAAc,CAC/BvzB,KAAM,cACNkE,KAAM,OACN6mC,SAAU,yBACVltC,eAAgB7R,KAAK6R,iBAEvBA,eAAgB7R,KAAK6R,iBACpBzG,UAAW,IAAI,KAAI,CACpBm8B,cAAe,IAAI,KAAc,CAC/BvzB,KAAM,gBACNkE,KAAM,SACN6mC,SAAU,2BACVltC,eAAgB7R,KAAK6R,iBAEvBA,eAAgB7R,KAAK6R,iBACpBzG,WAEHpL,KAAKswB,WAAW5kB,OAAO05B,EAAQh6B,U,CAEnC,E,+RAEQ6rF,wBAAwB97D,EAAU+vD,EAAwC4K,GAChF,IAAItpF,EACJ,MAAM4oD,EAA2B,GAE3BqiC,EAAWtzF,OAAOC,KAAK8mF,GACvBwM,EAAcD,EAAS38E,KAAKtO,GAAQ0+E,EAAS1+E,GAAOgqF,GAAuBhqF,QAAOvI,IAAWm1B,OAAOC,SAC1G,GAAIq+D,EAAY70F,QAAsB,IAAZizF,EAEnB,CACL,MAAM6B,EAAQD,EAAY70F,SAAW40F,EAAS50F,OAQ9C,QAPeoB,IAAZ6xF,GACDtpF,EAAMmrF,EAAQ,6BAA+B,wBAC7CviC,EAAK/yD,MAAK,EAAAg0F,GAAA,GAAYP,KAEtBtpF,EAAMmrF,EAAQ,yBAA2B,qBAGvCA,EAAO,CACT,MAAMv9B,EAAW/uD,SAASC,cAAc,QACxC8uD,EAAS1uD,WAAU,QAAKgsF,EAAY58E,KAAKtO,IAAQ,QAAKA,MAAO,GAAM,IACnE4oD,EAAK/yD,KAAK+3D,E,OAbZ5tD,EAAM,mBAiBR,EAAA+c,EAAA,GAAe4R,EAAIE,UAAU,QAAK7uB,EAAK4oD,GACzC,E,uVC/Ka,MAAMguB,WAAuB,IAA5C,c,oBACU,KAAAvvE,QAOJ,CAAC,CAgRP,CAvQe2e,O,0CACXxyB,KAAKoL,UAAUmI,UAAUxS,IAAI,sBAC7Bf,KAAKs+E,SAAS,YAEd,MAAMrjE,GAAU,OAAiB,CAC/BpJ,eAAgB7R,KAAK6R,eACrBsP,UAAW,cACXtN,QAAS,CAAC,CACRE,KAAM,SACNC,KAAM,qBACNC,QAAS,KACP,IAAI,IAAU,SAAU,CACtBgjD,aAAc,SACdC,mBAAoB,qBACpBrjD,QAAS,CAAC,CACRsjD,QAAS,SACT5kC,SAAU,KACRvyB,KAAKiH,SAASqwD,WAAWsgC,QAAQ,EAEnC9nB,UAAU,MAEXvkD,MAAM,MAKfvrB,KAAK6T,QAAQgkF,MAAO,QAAW,QAE/B73F,KAAK+nD,OAAOr8C,OAAO1L,KAAK6T,QAAQgkF,KAAM58E,GAEtCjb,KAAK83F,QAAU,IAAI,KAAY93F,KAAKiH,SAAUjH,KAAKswB,WAAYtwB,KAAK6R,gBAAgB,GACpF7R,KAAK83F,QAAQtlE,OACbxyB,KAAK83F,QAAQhzB,QAAQ7mD,EAAA,QACrB,MAAM85E,EAAc/3F,KAAK83F,QAAQ5vB,sBAE3B8vB,GAAkB,OAAO,wDAAyD,CAACjkF,KAAM,eAC/F,QAAiBikF,GAAiB,KAChC,MAAM10F,EAAS+H,SAASC,cAAc,UACtC,iBAAyB,MAAa8f,KAAK9nB,GAAS20F,IAClDA,IAAS3pF,MAAM0wE,GACNh/E,KAAKiH,SAASw5B,kBAAkBy3D,mBAAmBlZ,IAC1D,GACF,GACD,CAACntE,eAAgB7R,KAAK6R,iBACzB7R,KAAK83F,QAAQ51F,QAAQ0kB,iBAAiBrR,kBAAkB7J,OAAOssF,GAE/D,MAAMG,EAAwB,IAAW,mC,MACvC,MAAM16D,QAAaz9B,KAAKiH,SAASy2B,gBAAgBglD,UACjDsV,EAAgBzkF,UAAU1J,OAAO,OAA0B,sBAAR,QAAV,EAAA4zB,EAAK3E,aAAK,eAAElpB,GACvD,IAEAuoF,IACAn4F,KAAK6R,eAAe9Q,IAAIkd,EAAA,EAAxBje,CAAmC,iBAAiB,EAAEgI,aACjDiW,EAAA,SAAmBjW,GACpBmwF,G,IA8CJ,MAAMr5E,EAAazT,SAASC,cAAc,OAC1CwT,EAAWvL,UAAUxS,IAAI,mBAMzB,MAAMogC,EAAI,CACRptB,EACAC,EACA+tB,EACAiwD,KASA,IAAIA,EAAa,CACf,MAAMz9C,EAAKxS,EAAmCiwD,YAC3Cz9C,IAEDy9C,EAAc,IAAM,CAACz9C,EAAEv0C,O,CAI3B,MAAO,CACL+T,OACAC,OACAujF,eAAgBx1D,EAChBiwD,cACA58B,KAAM48B,aAAW,EAAXA,IACP,EAeGh9B,EARI,CACR7zB,EAAE,SAAU,gCAAiCkyD,IAC7ClyD,EAAE,OAAQ,eAAgBu1D,IAC1Bv1D,EAAE,OAAQ,qCAAsC2nD,IAChD3nD,EAAE,WAAY,yCAA0C+rD,IACxD/rD,EAAE,SAAU,0BAA2B4vD,KAG1Bj2E,KAAK9X,IAClB,MAAM,KAAC+Q,EAAMC,KAAMoY,EAAW,eAAEmrE,EAAc,YAAEvF,GAAehvF,EAC/D,OAAO,IAAI,KAAI,CACbi0D,aAAc7qC,EACdrY,OACAqb,UAAW,IAAW,mCACpB,MAAMgmC,EAAOpyD,EAAKoyD,WAAapyD,EAAKoyD,KAAO,GACrCliD,EAAMlT,KAAKuhF,OAAOC,UAAU+V,GAClCrkF,EAAIkY,QAAQgqC,GAETliD,aAAe,KAA2B8+E,GAC3C9+E,EAAIkvE,cAAcx0E,iBAAiB,gBAAiBW,IAClDvL,EAAKoyD,KAAO7mD,EAAQD,MAAK,IAAM0jF,KAAqB,GAG1D,IACAngF,eAAgB7R,KAAK6R,gBACrB,IAGEumF,EAAexD,GAAe5C,cACpCh9B,EAAK3yD,KACHrC,KAAKq4F,WAAa,IAAI,KAAI,CACxBphC,aAAc,UACd4jB,oBAAqB,IACrB9mE,KAAM,iBACNqb,UAAW,IAAW,mCAChBpvB,KAAKmnF,uBACDnnF,KAAK8pF,wBAGb,MAAM52E,EAAMlT,KAAKuhF,OAAOC,UAAUiF,IAClCvzE,EAAIi0E,eAAiBnnF,KAAKmnF,eAC1Bj0E,EAAIkvE,cAAcx0E,iBAAiB,WAAW,KAC5C5N,KAAKmnF,oBAAiBljF,EACtBjE,KAAK8pF,sBAAqB,EAAK,GAC9B,CAAC77E,MAAM,IACViF,EAAIkY,MACN,IACAvZ,eAAgB7R,KAAK6R,iBAGvB7R,KAAKs4F,YAAc,IAAI,KAAI,CACzBrhC,aAAc,2BACd4jB,qBAAqB,QAAK,gBAC1B9mE,KAAM,WACNqb,UAAW,KACTpvB,KAAKuhF,OAAOC,UAAUoT,IAAgBxpE,KAAKgtE,EAAa,EAE1DvmF,eAAgB7R,KAAK6R,kBAIzBiN,EAAWpT,UAAUspD,EAAKl6C,KAAKqgB,GAAQA,EAAI/vB,aAK3C,MAAMmtF,EAAiB,IAAI,IAC3BA,EAAe5lF,QAAQjH,OAAOoT,GAE9B9e,KAAKswB,WAAW5kB,OAAO1L,KAAK83F,QAAQ51F,QAAuCq2F,EAAentF,WAE1F,MAAMotF,EAAqB,KACzBC,EAAkB,kBAA+B,EAEnD,IAAIA,GACJ,QAAiBz4F,KAAK6T,QAAQgkF,MAAM,KACtB73F,KAAKuhF,OAAOC,UAAU,MAC9Bp2D,KAAKqtE,EAAgB,GACxB,CAAC5mF,eAAgB7R,KAAK6R,iBACzB2mF,IAMAx4F,KAAK6R,eAAe9Q,IAAIkd,EAAA,EAAxBje,CAAmC,eAAgBumE,IAC9CtoD,EAAA,oBAA8BsoD,GAC/BiyB,G,IAIJtH,GAAA,sBAEAlxF,KAAK8pF,8BAEEiO,IACT,G,CAEQW,kBAAkBC,GACxB,GAAG34F,KAAK44F,2BAA6BD,EAAW,OAAO34F,KAAK44F,yBAE5D,MAAMrqF,EAAUvO,KAAK44F,yBAA2B54F,KAAKiH,SAASqwD,WAAWgwB,UAAU,6BAClFnvE,SAAQ,KACJnY,KAAK44F,2BAA6BrqF,IACnCvO,KAAK44F,8BAA2B30F,E,IAIpC,OAAOsK,CACT,CAEOu7E,qBAAqB6O,GAC1B,OAAO34F,KAAK04F,kBAAkBC,GAAWrqF,MAAMw9E,IAC7C9rF,KAAKmnF,eAAiB2E,EAAM3E,eAC5BnnF,KAAKq4F,WAAWj9D,WAAWxiB,YAAc,GAAK5Y,KAAKmnF,eAAetkF,MAAM,GAE5E,CAEO6jD,sBAEL,OADA1mD,KAAK83F,QAAQ/zF,UACNmO,MAAMw0C,qBACf,ECrSa,MAAMmyC,WAAyB,IAA9C,c,oBACU,KAAAp0C,aAAyC,IAyFnD,CAlFSjyB,OACLxyB,KAAKoL,UAAUmI,UAAUxS,IAAI,yBAC7Bf,KAAKs+E,SAAS,cAEdt+E,KAAKqlD,WAAa,IAAI,KAAYC,IAChCtlD,KAAKykD,aAAea,CAAO,IAG7B,MAAMlgB,EAAU,IAAI,IAAe,CACjC9xB,QAAS,wCAGLirE,EAAelzE,SAASC,cAAc,OAC5CizE,EAAahrE,UAAUxS,IAAI,iBAE3Bf,KAAK84F,sBAAwB,IAAI,KAAW,CAC1CtxD,MAAO,mBACP01B,UAAW,MAGbl9D,KAAK+4F,6BAA+B,IAAI,KAAW,CACjDvxD,MAAO,iCACP01B,UAAW,MAGbqhB,EAAa7yE,OAAO1L,KAAK84F,sBAAsB1tF,UAAWpL,KAAK+4F,6BAA6B3tF,WAE5F,MAAM4tF,EAAiB,KACrBh5F,KAAKilD,QAAQ1xC,UAAU1J,OAAO,eAAgB7J,KAAK84F,sBAAsBpsF,MAAM7J,SAC5E7C,KAAK84F,sBAAsB/nE,MAAMxd,UAAUqB,SAAS,WACpD5U,KAAK+4F,6BAA6BhoE,MAAMxd,UAAUqB,SAAS,SAAS,EAGzE5U,KAAK84F,sBAAsB/nE,MAAMnjB,iBAAiB,QAASorF,GAC3Dh5F,KAAK+4F,6BAA6BhoE,MAAMnjB,iBAAiB,QAASorF,GAElEh5F,KAAKilD,SAAU,OAAa,CAAClxC,KAAM,gBAEnC,QAAiB/T,KAAKilD,SAAS,KAC7B,MAAMl2C,EAAQ/O,KAAK84F,sBAAsBpsF,MACnC87D,EAAQxoE,KAAK+4F,6BAA6BrsF,MAEhD1M,KAAKilD,QAAQvU,UAAW,EACxB1wC,KAAKiH,SAASq5B,gBAAgBu+C,cAAc,CAC1C9vE,QACAy5D,QACAywB,WAAW,IACV3qF,MAAM4qF,IACJl5F,KAAKykD,cACNzkD,KAAKykD,eAAen2C,MAAM0wE,IACxBh/E,KAAKiH,SAASq5B,gBAAgB2+C,UAAUia,EAAWla,EAAU,IAIjEntD,EAAA,gBAA0B,CAAC7pB,OAAQkxF,EAAUtmE,UAAS,KAEtD,wBAAoC5yB,MACpCA,KAAKuhF,OAAOC,UAAU,KAAkBp2D,KAAK,CAC3CxpB,KAAM,UACN6/E,WAAW,EACX1yE,MAAO,kBACPxL,YAAa,gBACbm+E,QAAU18C,GACDhlC,KAAKiH,SAASq5B,gBAAgB4+C,gBAAgBga,EAAWl0D,IAElE,GACF,GACD,CAACnzB,eAAgB7R,KAAK6R,iBAEzB7R,KAAK2S,QAAQjH,OAAO1L,KAAKilD,SACzB7f,EAAQzyB,QAAQjH,OAAO1L,KAAKqlD,WAAWj6C,UAAWmzE,GAClDv+E,KAAKswB,WAAW5kB,OAAO05B,EAAQh6B,UACjC,CAEOs7C,sBAML,OALA1mD,KAAKqlD,WAAW7jC,QAChBxhB,KAAKykD,aAAe,KACpBzkD,KAAK84F,sBAAsBpsF,MAAQ,GACnC1M,KAAK+4F,6BAA6BrsF,MAAQ,GAC1C1M,KAAKilD,QAAQvU,UAAW,EACjBx+B,MAAMw0C,qBACf,E,8CC5Fa,MAAMyyC,WAA2B,KAC9Cp5F,cACEmS,MAAM,wDAAyD,CAACm5D,UAAU,EAAMC,YAAa,MAAOv8D,MAAO,oBAC3G/O,KAAKmL,WACP,CAEcA,Y,sCACZ,QAAiBnL,KAAK4uE,YAAY,KAChC,MAAMrgE,EAAUvO,KAAKiH,SAASy2B,gBAAgB07D,cAAcC,EAAe3sF,MAAO4sF,EAAmB5sF,MAAO6sF,EAAc7sF,OAE1H6B,EAAQD,MAAK,KACXtO,KAAKqW,MAAM,IACT7Q,IACc,YAAbA,EAAI5D,QACL,EAAAuqB,GAAA,IAAS,CAACC,YAAa,sCACvBotE,EAAS9oD,UAAW,E,IAIxB8oD,EAASh0C,gBAAgBj3C,EAAQ,GAChC,CAACsD,eAAgB7R,KAAK6R,iBAEzB,MAAMgzC,EAA4B,GAC5B/5B,EAAMzf,SAASC,cAAc,OACnCwf,EAAIvX,UAAUxS,IAAI,eAClB,MAAMs4F,EAAiB,IAAI,KAAW,CACpC7xD,MAAO,YACPtvB,KAAM,sBACNglD,UAAW,GACXnY,UAAU,IAENu0C,EAAqB,IAAI,KAAW,CACxC9xD,MAAO,WACPtvB,KAAM,0BACNglD,UAAW,KAEPq8B,EAAgB,IAAI,KAAc,CAACx0C,UAAU,IACnDF,EAAYxiD,KAAKg3F,EAAgBC,EAAoBC,GAErD,MAAM70D,EAAU,KACd,MAAMxsB,EAAOmhF,EAAe3sF,MAAQ,IAAM4sF,EAAmB5sF,MAE7D8sF,EAASr0C,WAAW77B,UAAYpR,EAChCshF,EAASr0C,WAAW1mB,QAAQ,EAG9Bz+B,KAAK6R,eAAe9Q,IAAIs4F,EAAetoE,MAAvC/wB,CAA8C,QAAS0kC,GACvD1kC,KAAK6R,eAAe9Q,IAAIu4F,EAAmBvoE,MAA3C/wB,CAAkD,QAAS0kC,GAE3D60D,EAAct8B,SAAW,MACds8B,EAAc7sF,MAAMnH,MAAM,MAGrC,MAAMk4B,QAAaz9B,KAAKiH,SAASy2B,gBAAgBglD,UAC3C5kD,GAAY,EAAAD,GAAA,GAAkBJ,EAAKG,OACtCE,EAAUjkB,OACX0/E,EAAc7sF,MAAQ,IAAMoxB,EAAUjkB,KAAK6nC,cAG7C,MAAM83C,EAAW,IAAI,KAAS,CAC5B30C,cACAhzC,eAAgB7R,KAAK6R,eACrBuzC,iBAAiB,EACjBH,QAASjlD,KAAK4uE,WACdr9C,WAAY,MAGdzG,EAAIpf,OAAO2tF,EAAejuF,UAAWkuF,EAAmBluF,UAAWouF,EAASr0C,YAC5EnlD,KAAKoL,UAAUM,OAAOof,EAAKyuE,EAAcnuF,WAEzCpL,KAAKurB,MACP,E,0TC/Da,MAAMkuE,WAAuB,IAKnCjnE,OACLxyB,KAAKoL,UAAUxD,GAAK,qBAIpB,MAAMggF,GAAS,OAAa,CAAC7zE,KAAM,MAAOsH,UAAW,eACrDrb,KAAK2S,QAAQjH,OAAOk8E,IAEpB,QAAiBA,GAAQ,KACvB,iBAAyBuR,GAAmB,GAC3C,CAACtnF,eAAgB7R,KAAK6R,iBAEzB7R,KAAKwmD,YAAc,IAAI,IAAY,UAAW95C,IAC5C1M,KAAK05F,aAAahtF,EAAM,IAG1B1M,KAAK6R,eAAe9Q,IAAIkd,EAAA,EAAxBje,CAAmC,mBAAyBumE,IAAW,O,EAAA,K,OAAA,E,EAAA,YACrE,MAAMozB,QAAkB35F,KAAKiH,SAASy2B,gBAAgBi8D,UAAUpzB,GAC1Dv+D,EAASu+D,EAAO3zC,WACnB+mE,EAAW35F,KAAK45F,eAAe74F,IAAIiH,GACjChI,KAAK45F,eAAe34F,OAAO+G,EAClC,E,YALuE,K,6QAKrE,IAEFhI,KAAK+O,MAAMya,YAAYxpB,KAAKwmD,YAAYp7C,WAExCpL,KAAKqzB,YAAa,UAElBrzB,KAAK05F,cAIP,CAEUG,aACR,MAAMD,EAAiB,IAAI,KAAe,CACxC3yF,SAAUjH,KAAKiH,WAEXuoB,EAAOoqE,EAAepqE,KAM5B,OALAA,EAAK5nB,GAAK,WACV4nB,EAAKjc,UAAUxS,IAAI,sBACnBg3B,EAAA,6BAAuCvI,GAAM,KAC3CxvB,KAAK4S,OAAO,QACX3O,GAAW,GACP21F,CACT,CAEUz+E,UACRnb,KAAKqzB,WAAWvpB,OAIlB,CAEUq6E,sBACL,EAAAvpE,WAAcyoE,GAAS,IAC1BrjF,KAAKwmD,YAAYz1B,MAAMC,OACzB,CAEO0oE,aAAatpE,GAClBpwB,KAAKqzB,WAAWvpB,QAChB,MAAMupB,EAAarzB,KAAKqzB,WAAWpwB,MACnCjD,KAAKswB,WAAWK,iBAAmB,KACnC3wB,KAAKswB,WAAWllB,UAAUwN,YAAc,GAExC5Y,KAAKiH,SAASy2B,gBAAgBO,mBAAmB7N,OAAOnsB,EAAW,UAAUqK,MAAM4vB,IACjF,IAAI7K,IACF,OAGF,MAAMumE,EAAiB55F,KAAK45F,eAAiB55F,KAAK65F,aAElD,IAAIC,EAAa,KACf,MAAMxzD,EAAYtmB,GAAA,SAAoB,GAAK,KAAO,EACtCke,EAAS5P,OAAO,EAAGgY,GAE3BvhC,SAASiD,IACX4xF,EAAe74F,IAAIiH,EAAO,IAGxBk2B,EAASr7B,SACXi3F,OAAa71F,EACbjE,KAAKswB,WAAWK,iBAAmB,K,EAIvCmpE,IACA95F,KAAKswB,WAAWK,iBAAmB,KAC9BmpE,EACDA,IAEA95F,KAAKswB,WAAWK,iBAAmB,I,GAIvC,EAAApH,EAAA,GAAevpB,KAAKswB,WAAWllB,UAAWwuF,EAAepqE,KAAK,GAElE,EClHa,MAAMuqE,WAAuB,IAInCvnE,OASL,GARAxyB,KAAKg6F,YAAcjiE,EAAA,iBAEnB/3B,KAAKoL,UAAUxD,GAAK,2BACpB5H,KAAKs+E,SAAS,iBAEdt+E,KAAK+nD,OAAOx0C,UAAUxS,IAAI,kBAC1Bf,KAAK2S,QAAQY,UAAUxS,IAAI,mBAEvBg3B,EAAA,YAAsBgiE,GAAel7D,UAAW,CAClD,MAAM,GAACo7D,EAAE,WAAE3pE,GAAcyH,EAAA,UAAoB,CAC3ChpB,WAAO9K,EACP2D,GAAImyF,GAAel7D,SACnBkzD,QAAS,QAEXzhE,EAAWllB,UAAUM,OAAOuuF,E,CAG9B,MAAM3pE,EAAayH,EAAA,YAAsBgiE,GAAel7D,UAAUvO,WAKlE,OAJAtwB,KAAKswB,WAAWllB,UAAUoe,YAAY8G,EAAWllB,WACjDklB,EAAWwhD,sBAAsB9xE,KAAKoL,WAG/B2sB,EAAA,gCAA0CgiE,GAAel7D,UAAUvwB,MAAK,EAAE46D,SAAQwO,oBACvF,GAAGxO,EACD,OAAOwO,C,GAGb,CAGAyM,qBACEpsD,EAAA,YAAsB/3B,KAAKg6F,aAAax4E,OAC1C,CAEArG,UACEnb,KAAKswB,WAAW3c,wBAAqB1P,EACrC8zB,EAAA,gCAA0C/3B,KAAKg6F,YACjD,CAEAtzC,sBAEE,OADA3uB,EAAA,YAAsBgiE,GAAel7D,UAAUrd,QACxCtP,MAAMw0C,qBACf,EA9Ce,GAAA7nB,SAA2B,MCY7B,MAAMq7D,WAA2B,IAAhD,c,oBAEU,KAAAC,mBAA6B,CA+QvC,CAlIUC,cAAcnlD,GACpB,MAAuC,UAApCh3B,EAAA,wBACEg3B,EAAW,SACL,QAAK,YAAa,CAACzuC,KAAKmD,MAAMsrC,EAAW,SAEzC,QAAK,YAAa,CAACzuC,KAAKmD,MAAiB,MAAXsrC,KAGpCA,GAAY,KACN,QAAK,eAAgB,CAACA,EAAW,OAEjC,QAAK,cAAe,CAACA,GAGlC,CAkDQolD,gBACFr6F,KAAKs6F,sBAAuBt6F,KAAKm6F,oBACrCn6F,KAAKm6F,mBAAoB,GAEzB,EAAAhuE,GAAA,IAAM,qFAENnsB,KAAKiH,SAASy2B,gBAAgB68D,WAC5Bv6F,KAAKs6F,oBAAoB3a,SACzB3/E,KAAKs6F,oBAAoBza,UACzB7/E,KAAKs6F,oBAAoBE,UACzB,EACA,YAGFn1F,UAAUk6E,YAAYkb,eAAe3wD,IACnC,MAAM4wD,EAAuB5wD,EAAO41C,OAAOG,YAAc7/E,KAAKs6F,oBAAoBza,UAC5E8a,EAAsB7wD,EAAO41C,OAAOC,WAAa3/E,KAAKs6F,oBAAoB3a,SAC1Eib,EAAgB56F,KAAK66F,kBACzB/wD,EAAO41C,OAAOC,SAAU71C,EAAO41C,OAAOG,UACtC7/E,KAAKs6F,oBAAoB3a,SAAU3/E,KAAKs6F,oBAAoBza,WAC1D,KAEA8a,GAAuBD,IAAyBE,IAClD56F,KAAKiH,SAASy2B,gBAAgB68D,WAC5BzwD,EAAO41C,OAAOC,SACd71C,EAAO41C,OAAOG,UACd/1C,EAAO41C,OAAO8a,UACd,EACA,YAEFx6F,KAAKs6F,oBAAsB,CACzB3a,SAAU71C,EAAO41C,OAAOC,SACxBE,UAAW/1C,EAAO41C,OAAOG,UACzB2a,SAAU1wD,EAAO41C,OAAO8a,U,IAIhC,CAEQM,eACF96F,KAAKm6F,oBACTn6F,KAAKm6F,mBAAoB,GACzB,EAAAhuE,GAAA,IAAM,gGACNnsB,KAAKiH,SAASy2B,gBAAgB68D,WAC5B,EACA,EACA,GACA,EACA,GAEJ,CAEQM,kBAAkBE,EAAcC,EAAeC,EAAcC,GACnE,MAAMv6F,EAAI,oBACV,OACE,MAAQ6F,KAAK20F,KACX30F,KAAKyvC,KACF,GAAMzvC,KAAK8vC,KAAK2kD,EAAOF,GAAQp6F,GAE9B6F,KAAK8vC,IAAIykD,EAAOp6F,GAAK6F,KAAK8vC,IAAI2kD,EAAOt6F,IACpC,EAAI6F,KAAK8vC,KAAK4kD,EAAQF,GAASr6F,GAAG,IAK7C,E,8YC7OK,MAAMy6F,GAA+B,uBAErC,MAAMC,WAAuB,IAmBlCt7F,cACEmS,MAAM,CACJopF,UAAWjwF,SAAS+Q,eAAe,eACnCi+B,eAAgB,SATZ,KAAAxqB,aAAuG,CAAC,CAWhH,CAEA1kB,UAAUlE,GACRjH,KAAKiH,SAAWA,EAGhBjH,KAAKwmD,YAAc,IAAI,IAAY,UACnC,MAAM+0C,EAAgBv7F,KAAKs7F,UAAU1jF,cAAc,8BACnD2jF,EAAc7vF,OAAO1L,KAAKwmD,YAAYp7C,WAEtC,MAUMowF,EAAkB,KACtBx7F,KAAKwhF,UAAUiY,IAAgBruE,MAAM,EAIvCprB,KAAKy7F,QAAUz7F,KAAKs7F,UAAU1jF,cAAc,wBAE5C,MAAM8jF,EAAoC,CACxC3nF,KAAM,UACNC,KAAM,gBACNC,QAAS,KACPjU,KAAKwhF,UAAUuY,IAAgB3uE,MAAM,EAEvC7iB,OAAQ,IAAW,mCAEjB,eADqBvI,KAAKiH,SAASy3B,eAAe+yD,iBAAiB,OAAmB,IACtE5uF,gBAAkB7C,KAAKiH,SAASy3B,eAAei9D,gBAAgB,OACjF,KAGIC,EAAqB,IAAI,KAAc,CAC3C/xF,QAAQ,EACR+7B,QAA6C,UAApC+nD,GAAA,aAA2Bz1E,OAEtC0jF,EAAmB7qE,MAAMnjB,iBAAiB,UAAU,IAAW,mCAC7D+/E,GAAA,cAA4BiO,EAAmB7qE,MAAM6U,QAAU,QAAU,MAC3E,MAEA3nB,EAAA,mBAA2B,gBAAgB,KACzC29E,EAAmB18C,iBAAqD,UAApCyuC,GAAA,aAA2Bz1E,KAAiB,IAGlF,MA+FMu6B,EA/FuF,CAAC,CAC5F1+B,KAAM,gBACNC,KAAM,gBACNC,QAAS,KACPvR,YAAW,KACTmvB,EAAA,WAAqB,CACnB7pB,OAAQ6pB,EAAA,SACR,GACD,EAAE,GAEN6pE,EAAY,CACb3nF,KAAM,OACNC,KAAM,WACNC,QAASunF,GACR,KAA2B,CAC5BznF,KAAM,QACNC,KAAM,eACNC,QAAS,KACPjU,KAAKwhF,UAAU0Y,IAAoB9uE,MAAM,QAEzCnnB,EAAW,CACb8P,KAAM,WACNC,KAAM,WACNC,QAAS,KACPjU,KAAKwhF,UAAU4B,IAAgBh4D,MAAM,GAEtC,CACDrX,KAAM,WACNC,KAAM,WACNC,QAAS,OAGTszB,cAAeq0D,GACd,CACD7nF,KAAM,aACNC,KAAM,aACNC,QAAS,OAGTszB,cAAe,IAAI,KAAc,CAC/B19B,QAAQ,EACR+7B,SAAS,EACTmZ,SAAU,gCAEX,CACDhrC,KAAM,OACNC,KAAM,mBACNC,QAAS,KACP,MAAMvM,EAAM,YAAY,uBAAuB,GAC/CmqB,EAAA,WAAqBnqB,EAAI,GAE1B,CACDqM,KAAM,MACNC,KAAM,YACNC,QAAS,KACP,MAAMQ,EAAIpJ,SAASC,cAAc,KACjCmJ,EAAEpU,OAAS,SACXoU,EAAEumB,KAAO,kDACT3vB,SAASI,KAAKC,OAAO+I,GACrBA,EAAEQ,QACFvS,YAAW,KACT+R,EAAEjS,QAAQ,GACT,EAAE,GAEN,CACDuR,KAAM,SACNC,KAAM,2BACNC,QAAS,KACPmN,QAAQgI,IAAI,CACVyyE,GAAA,MAAmB,CAACC,WAAY,MAChCD,GAAA,SAAsB,eACrBvtF,MAAK,KACNue,SAASmO,KAAO,6BAA6B,GAC7C,EAEJzyB,OAAQ,IAAM,mBACb,CACDwL,KAAM,SACNC,KAAM,kCACNC,QAAS,KACP4nF,GAAA,SAAsB,aAAavtF,MAAK,KACtCue,SAASmO,KAAO,oCAAoC,GACpD,EAEJzyB,OAAQ,IAAM,mBACb,CACDwL,KAAM,WACNC,KAAM,cACNC,QAAS,KACP,MAAM8nF,GAAgB,UACtBA,SAAAA,GAAiB,EAEnBxzF,OAAQ,OAAQ,YAGkB6wB,OAAOC,SAE3Cr5B,KAAKg8F,UAAW,OAAiB,CAC/B76E,UAAW,eACXtN,QAAS4+B,EACTv3B,OAAQ,CAACnT,EAAGkT,K,MACV,MAAMghF,EAAgB5wF,SAASC,cAAc,KAC7C2wF,EAAcjhE,KAAO,iEACrBihE,EAAc57F,OAAS,SACvB47F,EAAcC,IAAM,sBACpBD,EAAc1oF,UAAUxS,IAAI,mBAC5Bk7F,EAAcruF,iBAAiB,MAAmB7F,IAChDA,EAAE6lE,kBACF36C,GAAA,SAA6B,IAE/B,MAAMkP,EAAI92B,SAASC,cAAc,QACjC62B,EAAE5uB,UAAUxS,IAAI,wBAChBohC,EAAE3iB,UAAY,eAAiB,YAAa,IAAqB,iBACjEy8E,EAAcvwF,OAAOy2B,GACrBlnB,EAAQ1H,UAAUxS,IAAI,cACtBka,EAAQvP,OAAOuwF,GAEG,QAAlB,EAAAP,EAAWx5F,eAAO,SAAEwJ,OAAO1L,KAAKm8F,cAAc,IAGlDn8F,KAAKg8F,SAASzoF,UAAU/Q,OAAO,cAC/BxC,KAAKg8F,SAASzoF,UAAUxS,IAAI,uBAAwB,cAEpDf,KAAKy7F,QAAQxiF,cAAc1B,aAAavX,KAAKg8F,SAAUh8F,KAAKy7F,SAE5Dz7F,KAAKo8F,YAAa,OAAiB,CACjCj7E,UAAW,WACXtN,QAAS,CAAC,CACRE,KAAM,aACNC,KAAM,aACNC,QAAS,KACPjU,KAAKwhF,UAAUqX,IAAkBztE,MAAM,GAExC,CACDrX,KAAM,WACNC,KAAM,WACNC,QAjLoB,KACtBjU,KAAKwhF,UAAU,KAAkBp2D,KAAK,CACpCxpB,KAAM,OACN6/E,WAAW,EACXC,QAAU18C,GAAYhlC,KAAKwhF,UAAUpD,GAAgBhzD,KAAK4Z,GAC1Dj2B,MAAO,kBACPxL,YAAa,iBACb,GA2KC,CACDwQ,KAAM,aACNC,KAAM,iBACNC,QAASunF,MAGbx7F,KAAKo8F,WAAW/gF,UAAY,0EAC5Brb,KAAKo8F,WAAW7jF,mBAAmB,aAAc,6GAIjDvY,KAAKo8F,WAAWx0F,GAAK,WACrB2zF,EAAcznB,mBAAmBpoE,OAAO1L,KAAKo8F,YAE7Cp8F,KAAKq8F,UAAYhxF,SAASC,cAAc,OACxCtL,KAAKq8F,UAAUhhF,UAAY,2DAC3B,EAAA2Z,GAAA,GAAOh1B,KAAKq8F,WACZr8F,KAAKq8F,UAAU3wF,QAAO,QAAK,YAE3B,QAAiB1L,KAAKq8F,WAAW,KAC5Br8F,KAAKq8F,UAAU9oF,UAAUqB,SAAS,cAIrCiY,SAASyvE,QAAQ,IAGnBf,EAAcznB,mBAAmBpoE,OAAO1L,KAAKq8F,WAE7Cr8F,KAAKwmD,YAAYz1B,MAAMnjB,iBAAiB,SAAS,IAAM5N,KAAKu8F,cAAc,CAACtuF,MAAM,IAEjFjO,KAAKm8F,cAAgB9wF,SAASC,cAAc,QAC5CtL,KAAKm8F,cAAc9gF,UAAY,2CAE/B4C,EAAA,mBAA2B,iBAAkBuzE,IAC3C,GAAGA,EAAO5pF,KAAO,MAAmB,CAElC,MAAMwpB,EAAQogE,EAAOgL,cAAc30F,KACnC7H,KAAKm8F,cAAcvjF,YAAc,IAAK,EAAA6jF,GAAA,GAAarrE,EAAO,GAC1DpxB,KAAKm8F,cAAc5oF,UAAU1J,OAAO,QAASunB,E,KAIjDpxB,KAAKiH,SAASy2B,gBAAgB6B,YAAY,kBAG1C,MAAMje,EAAiC,CACrC1f,KAAM,sBACNkoB,MAAO,KACLpnB,YAAW,KACT1C,KAAKwmD,YAAYz1B,MAAMC,OAAO,GAC7B,IAEI,GAETxC,WAAW,GAEbjN,GAAA,WAAiCD,GAEjC,gBAA2BhT,MAAK,KAC9B,MACMouF,EAAsB91B,aAAY,KACtCx1B,MAAM,UAAW,CAACurD,MAAO,aACxBruF,MAAM6iB,GAAwB,MAAfA,EAAIyrE,QAAkBzrE,EAAI0rE,IAAM1rE,EAAInd,QAAWoN,QAAQC,WACtE/S,MAAM0F,IACFA,IAAS,mBACVhU,KAAK88F,WAAY,EACjBzzB,cAAcqzB,GAEV18F,KAAKo8F,WAAW7oF,UAAUqB,SAAS,cACrC5U,KAAKq8F,UAAU9oF,UAAU/Q,OAAO,a,IAIrCyV,MAAMkgB,GAAA,EAAK,GAdgB,KAeL,IAG3B,MAAM4kE,EAAW,KACf,MAAMx6E,EAAOviB,KAAKuiB,KAAOviB,KAAKk1B,cAAc1S,wBAC5CnX,SAAS2xF,gBAAgBzxF,MAAMssE,YAAY,sBAAuBt1D,EAAKe,MAAQ,KAAK,GAGtF,SAAQy5E,GACR5yE,GAAA,mBAA4B,SAAU4yE,EACxC,CAEQR,aACN,MAAMU,EAAkBj9F,KAAKs7F,UAAU1jF,cAAc,qBAE/C0Y,EAAa,IAAI,KAAW2sE,GAE5BrqF,EAAQ,MAEZ,QAAmB5S,KAAKy7F,QAAQ,EAIlCz7F,KAAK6vB,aAAe,CAClBqO,SAAU,IAAI,IAAY,sBAAuB,gBAAYj6B,OAAWA,OAAWA,OAAWA,EAAW2O,GACzGyrB,eAAgB,IAAI,IAAY,eAAgB,gBAAYp6B,OAAWA,OAAWA,OAAWA,EAAW2O,GACxG2d,SAAU,IAAI,IAAY,iBAAkB,YAC5CkP,OAAQ,IAAI,KAAY,EAAO,YAAY,EAAM,uBAAuB,GAAM,EAAO7sB,GAAO,GAC5FqsB,OAAQ,IAAI,IAAY,SAAU,YAAY,EAAM,uBAAuB,GAAM,EAAMrsB,IAGzF,MAAM+e,EAAc3xB,KAAK2xB,YAAc,IAAI,IAAe,CACxDkD,UAAW,CAAC,CACVziB,YAAa,2BACb8F,KAAM,cACNtW,KAAM,SACL,CACDwQ,YAAa,gCACb8F,KAAM,kBACNtW,KAAM,SACL,CACDwQ,YAAa,yBACb8F,KAAM,kBACNtW,KAAM,SACL,CACDwQ,YAAa,8BACb8F,KAAM,kBACNtW,KAAM,SACL,CACDwQ,YAAa,2BACb8F,KAAM,kBACNtW,KAAM,SACL,CACDwQ,YAAa,gCACb8F,KAAM,kBACNtW,KAAM,UAER0uB,aACAT,aAAc7vB,KAAK6vB,aACnBmE,YAAY,EACZE,eAAe,EACfC,YAAY,EACZltB,SAAUjH,KAAKiH,WAGjBg2F,EAAgBjlF,QAAQ2Z,EAAY+C,IAAIzb,cAAcA,eACtDqX,EAAWllB,UAAUM,OAAOimB,EAAYvmB,WAGtCumB,EAAYiS,SAAS,CACnB57B,OAAQ,GAAG4qB,WACXzhB,SAAU,IAEZwgB,EAAY2D,UAAU,GACtB3D,EAAY/uB,MAAK,GAKnB,MAAMs6F,EAAgC,GACtC,IAAIC,EAAyB,GAAGvqE,WAC5BwqE,EAAkB,EAClBC,EAAkB,EACtB,MAAMC,EAAe,KAEnBt9F,KAAKwmD,YAAYp7C,UAAUmI,UAAU1J,OAAO,kBAA6C,IAA1BqzF,EAAer6F,QAC9E7C,KAAKwmD,YAAYp7C,UAAUmI,UAAU1J,OAAO,cAAeqzF,EAAer6F,QAEvEq6F,EAAer6F,OAChB7C,KAAKwmD,YAAYz1B,MAAMxlB,MAAMssE,YAAY,gBAAkBqlB,EAAeA,EAAer6F,OAAS,GAAG2f,wBAAwB87B,MAAQt+C,KAAKwmD,YAAYz1B,MAAMvO,wBAAwBG,KAAQ,MAE5L3iB,KAAKwmD,YAAYz1B,MAAMxlB,MAAMgyF,eAAe,gB,EAI1CC,EAASnyF,SAASC,cAAc,OACtCkyF,EAAOjqF,UAAUxS,IAAI,iBACrBy8F,EAAO5vF,iBAAiB,SAAU7F,IAChC,MAAM1H,GAAS,EAAAkd,GAAA,GAAgBxV,EAAE1H,OAAQ,iBACzC,IAAIA,EACF,OAGF,MAAMmM,EAAMnM,EAAOgmB,QAAQ7Z,IAC3B,GAA4B,IAAzBA,EAAI2N,QAAQ,SAAgB,CAC7B,MAAOvK,EAAGmvB,EAAS8E,GAAWr3B,EAAI2X,MAAM,KACxCi5E,GAAmBr+D,EACnBs+D,GAAmBx5D,C,MAEnBs5D,EAAiB3wF,EAAIomB,WAGvBvyB,EAAOuN,iBAAiB,SAAS,KAC/B6vF,EAAep9F,EAAO,IAGxBL,KAAKwmD,YAAYp7C,UAAUM,OAAOrL,GAClCL,KAAKwmD,YAAY/1B,SAASzwB,KAAKwmD,YAAY95C,MAAQ,IACnDwwF,EAAe76F,KAAKhC,GACpBi9F,GAAc,IAGhB3rE,EAAY+C,IAAIzb,cAAcvN,OAAO8xF,GAErC,MAAME,EAAe,CAAClxF,EAAsBuC,KAC1C,MAAM+b,EAAMzf,SAASC,cAAc,OACnCwf,EAAIvX,UAAUxS,IAAI,iBAElB,MAAM6d,EAAW,IAAI,IA0BrB,OAzBAA,EAASrL,UAAUxS,IAAI,uBAAwB,QAAS,aACxD6d,EAAS6oB,UAAW,EAEpB3c,EAAIzE,QAAQ7Z,IAAM,GAAKA,EACpBA,EAAIqc,iBACQ5kB,IAAV8K,IACDA,EAAQ,IAAI,KAAU,CAAC/G,OAAQwE,EAAIomB,aAAa1wB,SAGlD0c,EAASyK,kBAAkB,CAACrhB,OAAQwE,KAEpCoS,EAASrL,UAAUxS,IAAI,wBAGtBgO,IACoB,iBAAZ,EACP+b,EAAItL,UAAYzQ,IAEhB,EAAAwa,EAAA,GAAeuB,EAAK/b,GACpB+b,EAAIpf,OAAOqD,KAIf+b,EAAI4c,sBAAsB,aAAc9oB,GAEjCkM,CAAG,EAGN2yE,EAAkBp9F,IAEM,IADhBA,EAAOgmB,QAAQ7Z,IACpB2N,QAAQ,SACbijF,EAAkBC,EAAkB,EAEpCF,EAAiB,GAAGvqE,WAGtBvyB,EAAOmC,UACP,EAAAoxD,GAAA,GAAiBspC,EAAgB78F,GAEjCqC,YAAW,KACT46F,IACAt9F,KAAKwmD,YAAY/1B,SAASzwB,KAAKwmD,YAAY95C,MAAM,GAChD,EAAE,EAGP1M,KAAKwmD,YAAYyY,QAAU,KACzBi+B,EAAen4F,SAASnE,IACtB68F,EAAe78F,EAAG,GAClB,EAGJZ,KAAKwmD,YAAY/1B,SAAY/jB,IAgB3B,GAfAilB,EAAY2R,cACZ3R,EAAYiS,SAAS,CACnB57B,OAAQm1F,EACRhsF,SAAUgsF,OAAiBl5F,EAAY,EACvCmsB,MAAO1jB,EACPqyB,QAASq+D,EACTv5D,QAASw5D,IAEX1rE,EAAY/uB,MAAK,GAEjB46F,EAAOh+E,UAAY,GACnBmS,EAAY+C,IAAInhB,UAAU/Q,OAAO,SAI7B26F,GAAkBzwF,EAAMkkB,OAAQ,CAClC,MAAMyC,EAAa1B,EAAY0B,WAAWpwB,MAC1Cme,QAAQgI,IAAI,CAEVppB,KAAKiH,SAASy3B,eAAeC,WAAW,CAACvO,MAAO1jB,IAAQ4B,MAAK,EAAEwwB,aAAaA,EAAQhkB,KAAKkM,GAAMA,EAAEhf,WACjGhI,KAAKiH,SAASy2B,gBAAgBO,mBAAmBvxB,GAAO,KACvD4B,MAAMstB,IACHvI,MACY,IAAIjyB,IAAIw6B,EAAQ,GAAG7c,OAAO6c,EAAQ,KAE1C72B,SAASiD,IACfw1F,EAAO9xF,OAAOgyF,EAAa11F,GAAQ,IAGrC2pB,EAAY+C,IAAInhB,UAAU1J,OAAO,SAAU2zF,EAAOh+E,WAAU,G,CAKhE,IAAI49E,GAAmB1wF,EAAMkkB,OAAQ,CACnC,MAAM+sE,EAAoB,IAC1B,QAAajxF,EAAOixF,GACpBA,EAAM54F,SAAS64F,IACbJ,EAAO9xF,OAAOgyF,EAAa,QAAUE,EAAS7+D,QAAU,IAAM6+D,EAAS/5D,QAAS+5D,EAAS7uF,OAAO,IAGlG4iB,EAAY+C,IAAInhB,UAAU1J,OAAO,SAAU2zF,EAAOh+E,U,GAItDmS,EAAYwB,KAAKoJ,yBAAyB3uB,iBAAiB,aAAc7F,IACvE,MAAM1H,GAAS,EAAA2/B,GAAA,GAAUj4B,EAAE1H,OAAQ,EAAA4/B,yBACnC,IAAI5/B,EACF,OAGF,MAAMixB,GAAc,EAAA/T,GAAA,GAAgBld,EAAQ,gBAC5C,IAAIixB,GAAeA,EAAY/d,UAAUqB,SAAS,wBAA0B0c,EAAY/d,UAAUqB,SAAS,uBACzG,OAGF,MAAM5M,EAAS3H,EAAOyU,aAAa,gBAAgB8d,WACnD5yB,KAAKiH,SAASy2B,gBAAgBmgE,iBAAiB71F,EAAO,GACrD,CAACgN,SAAS,IAEb,MAAM8oF,EAAkBzyF,SAASC,cAAc,OAC/CwyF,EAAgBvqF,UAAUxS,IAAI,2BAC9B+8F,EAAgBpyF,OAAO1L,KAAK6vB,aAAa4P,OAAOjQ,MAChDxvB,KAAK6vB,aAAa4P,OAAOr0B,UAAUM,OAAOoyF,GACjB,IAAI,KAAYA,GAEzC,IACIC,EADArkD,GAAQ,EAGZ,MAAMskD,GAAa,OAAiB,CAClCrrF,QAASsqF,EAAgBhkF,cACzBrX,KAAM,YACNq3D,eAAgB,IAChB5kC,gBAAkBzsB,IACbm2F,GAAuBtqF,aAAasqF,GAE7B,IAAPn2F,GAAa8xC,IACd/nB,EAAY2D,UAAU,GAAG,GACzBt1B,KAAKwmD,YAAYwY,eACjB++B,EAAwBrqF,OAAOhR,YAAW,KACxCq7F,EAAwB,EACxB/9F,KAAKo8F,WAAW7oF,UAAU/Q,OAAO,aACjCxC,KAAK88F,WAAa98F,KAAKq8F,UAAU9oF,UAAU/Q,OAAO,YAAY,GAC7D,MAGLk3C,GAAQ,CAAK,IAIjBskD,EAAW,GAEX,MAAMC,EAAkB,aAClBC,EAAU,KACdl+F,KAAKg8F,SAASzoF,UAAU/Q,OAAOy7F,GAC/Bj+F,KAAKy7F,QAAQloF,UAAUxS,IAAIk9F,GAC3Bj+F,KAAKo8F,WAAW7oF,UAAUxS,IAAI,aAC9Bf,KAAKq8F,UAAU9oF,UAAUxS,IAAI,aAC7Bf,KAAKg8F,SAAS/iF,cAAc1D,kBAAkBhC,UAAU1J,OAAO,cAAc,GAE7E,MAAMwwC,EAAyC,gBAC3C,EAAAxwB,kBAAqBtI,GAAA,iBAAuC84B,IAC9D94B,GAAA,WAAiC,CAC/BuI,MAAO,KACLlX,GAAO,EAEThR,KAAMy4C,IAIV2jD,EAAW,EAAE,EAGfh+F,KAAKwmD,YAAYz1B,MAAMnjB,iBAAiB,QAASswF,GACjDA,KAEA,QAAiBl+F,KAAKy7F,SAAU1zF,IAC9B/H,KAAKg8F,SAASzoF,UAAUxS,IAAIk9F,GAC5Bj+F,KAAKy7F,QAAQloF,UAAU/Q,OAAOy7F,GAC9Bj+F,KAAKg8F,SAAS/iF,cAAc1D,kBAAkBhC,UAAU1J,OAAO,cAAc,GAE7E0X,GAAA,eAAqC,iBAErCy8E,EAAW,EAAE,IAGf,MAAMG,GAAuB,QAAW,SACxCn+F,KAAK6vB,aAAaoP,OAAOpgB,OAAOnT,OAAOyyF,GACvCA,EAAqBvwF,iBAAiB,SAAS,MAC7C,EAAAqyC,GAAA,GAAkB,CAChBiX,mBAAoB,8BACpB5gD,OAAQ,CACN6gD,QAAS,cACT2Y,UAAU,KAEXxhE,MAAK,IACCtO,KAAKiH,SAASy2B,gBAAgB0gE,oBAAoB9vF,MAAK,KAC5DtO,KAAK6vB,aAAaoP,OAAOzd,OAAO,KAElC,GAEN,EAsBF,MAAM68E,GAAiB,IAAIhD,GAC3B,oBAAgCgD,GAChC,W,0FCzqBe,MAAMC,UAAyB,IAOrC9rE,KAAK3E,GAQV7tB,KAAKoL,UAAUmI,UAAUxS,IAAI,yBAC7Bf,KAAKilD,SAAU,OAAa,CAAClxC,KAAM,eACnC/T,KAAK2S,QAAQjH,OAAO1L,KAAKilD,SACzBjlD,KAAKswB,WAAWllB,UAAU5I,SAE1BxC,KAAKilD,QAAQr3C,iBAAiB,SAAS,KACrC,MAAMo3B,EAAUhlC,KAAKqlB,SAASuiB,cAAc9sB,KAAK2xC,GAAQA,EAAI75B,aACvDkX,EAAS9pC,KAAK0hF,QAAQ18C,GAEzBhlC,KAAKyhF,UACNzhF,KAAK4S,QACGk3B,aAAkB1oB,QAC1BphB,KAAKu+F,gBAAgBz0D,QACF7lC,IAAX6lC,GACR9pC,KAAK4S,O,IAKT5S,KAAKs+E,SAASzwD,EAAQ9e,OACtB/O,KAAKmkC,SAAWtW,EAAQjsB,KACxB5B,KAAK0hF,QAAU7zD,EAAQ6zD,QACvB1hF,KAAKyhF,UAAY5zD,EAAQ4zD,UAEzB,MAAM+c,EAA8B,YAAlBx+F,KAAKmkC,SACvBnkC,KAAKqlB,SAAW,IAAI,IAAe,CACjCygB,SAAU9lC,KAAK2S,QACf8d,SAAUzwB,KAAKyhF,UAAY,KAAQ5+E,IACjC7C,KAAKilD,QAAQ1xC,UAAU1J,OAAO,eAAgBhH,EAAO,EAEvDshC,SAAU,CAACq6D,EAAY,UAAY,YACnCj7F,YAAasqB,EAAQtqB,YACrB8gC,WAAYm6D,EACZr5D,iBAAkBq5D,EAAY,CAAC,aAAc,eAAYv6F,EACzDgD,SAAUjH,KAAKiH,SACfw9B,OAAQ,WAGP5W,EAAQi0D,iBACT9hF,KAAKqlB,SAASwiB,WAAWha,EAAQi0D,iBAGnC9hF,KAAKilD,QAAQ1xC,UAAUxS,IAAI,oBAC3Bf,KAAKilD,QAAQzlC,UAAY,GACzBxf,KAAKilD,QAAQvU,UAAW,EACxB1wC,KAAKilD,QAAQ1xC,UAAU1J,OAAO,aAAc7J,KAAKyhF,UACnD,CAEO8c,gBAAgBhwF,GACrB,MAAMkwF,GAAe,OAAgBz+F,KAAKilD,QAAS,cAEnD12C,EAAQD,MAAK,KACXtO,KAAK4S,OAAO,IACX,KACD6rF,GAAc,GAElB,E,6DC3EK,SAASC,EAAuBp7F,GACrC,MAAMkN,EAAUlN,EAAOoiB,WAAW,MAE5Bi5E,EAAQ,IAAIzlF,MAAM,GAAGirC,KAAK,GAC1BvO,EAASplC,EAAQouF,aAAa,EAAG,EAAGt7F,EAAOggB,MAAOhgB,EAAOogB,QAAQyrB,KACjE0vD,EAAejpD,EAAO/yC,OAAS,EACrC,IAAI,IAAIuhB,EAAI,EAAGA,EAAIwxB,EAAO/yC,OAAQuhB,GAAK,EAErCu6E,EAAM,IAAM/oD,EAAOxxB,GACnBu6E,EAAM,IAAM/oD,EAAOxxB,EAAI,GACvBu6E,EAAM,IAAM/oD,EAAOxxB,EAAI,GACvBu6E,EAAM,IAAM/oD,EAAOxxB,EAAI,GAGzB,MAAM06E,EAAW,IAAIC,kBAAkB,GAMvC,OALAD,EAAS,GAAKH,EAAM,GAAKE,EACzBC,EAAS,GAAKH,EAAM,GAAKE,EACzBC,EAAS,GAAKH,EAAM,GAAKE,EACzBC,EAAS,GAAKH,EAAM,GAAKE,EAElBC,CACT,C,sDC1Be,SAASE,EAAmBC,GACzC,IAAI,EAAC7vF,EAAC,EAAErF,EAAC,EAAEm1F,IAAK,QAAWD,EAAK,GAAIA,EAAK,GAAIA,EAAK,IAOlD,OANGl1F,EAAI,IACLA,EAAIvD,KAAKI,IAAI,IAAKmD,EAAI,EAAI,IAAO,IAAMA,KAEzCm1F,EAAI14F,KAAKC,IAAI,EAAO,IAAJy4F,GAEH,QAAQ9vF,MAAMrF,OAAOm1F,SAEpC,C,yJCGe,MAAMC,EAyBnBp/F,cAhBQ,KAAAq/F,IAAM,EACN,KAAAC,WAAa,IACb,KAAAC,UAAY,GACZ,KAAApoD,MAAQ,EACR,KAAA1xB,SAOJ,CAAC,EAoGG,KAAA+5E,YAAc,KACpBl0F,SAAS2xF,gBAAgBzxF,MAAMwV,OAAS/gB,KAAKwlB,SAASg6E,WAAWj0F,MAAMwV,OAAS,UAAU,EAGpF,KAAA0+E,UAAY,KAClBp0F,SAAS2xF,gBAAgBzxF,MAAMwV,OAAS/gB,KAAKwlB,SAASg6E,WAAWj0F,MAAMwV,OAAS,EAAE,EAnGlF/gB,KAAKoL,UAAYC,SAASC,cAAc,OACxCtL,KAAKoL,UAAUmI,UAAUxS,IAAIo+F,EAAY5iD,YAEzC,MAAMnnC,EAAO,uBACG+pF,EAAY5iD,WAAa,g+BAgBvB4iD,EAAY5iD,WAAa,cAAc4iD,EAAY5iD,WAAa,mKAIlE4iD,EAAY5iD,WAAa,qCACvB4iD,EAAY5iD,WAAa,6tBAavB4iD,EAAY5iD,WAAa,cAAc4iD,EAAY5iD,WAAa,mLAOpFv8C,KAAKoL,UAAUoU,UAAYpK,EAE3BpV,KAAKwlB,SAAS25B,IAAMn/C,KAAKoL,UAAUmK,kBACnCvV,KAAKwlB,SAASg6E,WAAax/F,KAAKwlB,SAAS25B,IAAIv4B,iBAC7C5mB,KAAKwlB,SAAS65E,WAAar/F,KAAKwlB,SAAS25B,IAAI5pC,kBAAkBA,kBAE/DvV,KAAKwlB,SAASk6E,QAAU1/F,KAAKwlB,SAAS25B,IAAI20B,mBAE1C9zE,KAAKwlB,SAAS45E,IAAMp/F,KAAKwlB,SAASk6E,QAAQnqF,kBAC1CvV,KAAKwlB,SAASm6E,WAAa3/F,KAAKwlB,SAAS45E,IAAIx4E,iBAE7C5mB,KAAK4/F,cAAgB,IAAI,KAAW,CAACpwF,WAAW,EAAMg4B,MAAO,yBAC7DxnC,KAAK6/F,cAAgB,IAAI,KAAW,CAACrwF,WAAW,EAAMg4B,MAAO,yBAE7D,MAAMs4D,EAASz0F,SAASC,cAAc,OACtCw0F,EAAOzkF,UAAY8jF,EAAY5iD,WAAa,UAC5CujD,EAAOp0F,OAAO1L,KAAK4/F,cAAcx0F,UAAWpL,KAAK6/F,cAAcz0F,WAC/DpL,KAAKoL,UAAUM,OAAOo0F,GAEtB9/F,KAAK4/F,cAAc7uE,MAAMnjB,iBAAiB,SAAS,KACjD,IAAIlB,EAAQ1M,KAAK4/F,cAAclzF,MAAMia,QAAQ,KAAM,IAAI2Q,MAAM,EAAG,GAEhE,MAAM/xB,EAAQmH,EAAMnH,MAAM,iBACpBw6F,EAAQx6F,GAASA,EAAM,GAAG1C,SAAW6J,EAAM7J,QAAU,CAAa,GAAGkS,SAASrI,EAAM7J,QAC1F7C,KAAK4/F,cAAcjhC,SAASohC,EAAQ,aAAqB,YAEzDrzF,EAAQ,IAAMA,EACd1M,KAAK4/F,cAAc1gD,iBAAiBxyC,GAEjCqzF,GACD//F,KAAKggG,SAAStzF,GAAO,GAAO,E,IAKhC,MAAMuzF,EAAY,wHAClBjgG,KAAK6/F,cAAc9uE,MAAMnjB,iBAAiB,SAAS,KACjD,MAAMrI,EAAQvF,KAAK6/F,cAAcnzF,MAAMnH,MAAM06F,GAC7CjgG,KAAK6/F,cAAclhC,SAASp5D,EAAQ,aAAqB,YAEtDA,GACDvF,KAAKggG,UAAS,SAAYz6F,EAAM,IAAKA,EAAM,IAAKA,EAAM,KAAK,GAAM,E,IAIrEvF,KAAKkgG,qBACLlgG,KAAKmgG,oBACP,CAUQD,sBACN,EAAAE,EAAA,GAAoBpgG,KAAKwlB,SAAS25B,KAAY,KAC5Cn/C,KAAKu/F,cACLv/F,KAAKqgG,QAAUrgG,KAAKwlB,SAAS25B,IAAI38B,uBAAuB,IAEtDsyB,IACF90C,KAAKsgG,kBAAkBxrD,EAAI5tB,EAAG4tB,EAAI3tB,EAAE,IACnC,KACDnnB,KAAKy/F,WAAW,GAEpB,CAEQU,sBACN,EAAAC,EAAA,GAAoBpgG,KAAKwlB,SAAS45E,KAAY,KAC5Cp/F,KAAKu/F,cACLv/F,KAAKugG,QAAUvgG,KAAKwlB,SAAS45E,IAAI58E,uBAAuB,IAEtDsyB,IACF90C,KAAKwgG,WAAW1rD,EAAI5tB,EAAE,IACrB,KACDlnB,KAAKy/F,WAAW,GAEpB,CAEOO,SAAS1uD,EAA2BmvD,GAAiB,EAAMC,GAAiB,GACjF,QAAaz8F,IAAVqtC,EACDA,EAAQ,CACNliC,EAAG,EACHrF,EAAG,IACHm1F,EAAG,GACHzqF,EAAG,QAEA,GAAqB,iBAAZ,EACd,GAAgB,MAAb68B,EAAM,GACPA,GAAQ,QAAWA,OACd,CACL,MAAMqvD,EAAMrvD,EAAM/rC,MAAM,YACxB+rC,GAAQ,SAAYqvD,EAAI,IAAKA,EAAI,IAAKA,EAAI,QAAe18F,IAAX08F,EAAI,GAAmB,GAAKA,EAAI,G,CAKlF3gG,KAAKqgG,QAAUrgG,KAAKwlB,SAAS25B,IAAI38B,wBAEjC,MAAMo+E,EAAO5gG,KAAKqgG,QAAQ/8E,MAAQ,IAAMguB,EAAMvnC,EACxC82F,EAAW,IAAOvvD,EAAM4tD,GAAK,IAAM5tD,EAAMvnC,EAAI,GAAM,IACnD+2F,EAAO9gG,KAAKqgG,QAAQ38E,OAAS,IAAMm9E,EAEzC7gG,KAAKsgG,kBAAkBtgG,KAAKqgG,QAAQ19E,KAAOi+E,EAAM5gG,KAAKqgG,QAAQj9E,IAAM09E,GAAM,GAG1E9gG,KAAKugG,QAAUvgG,KAAKwlB,SAAS45E,IAAI58E,wBAEjC,MAAMu+E,EAAazvD,EAAMliC,EAAI,IACvB4xF,EAAOhhG,KAAKugG,QAAQ59E,KAAO3iB,KAAKugG,QAAQj9E,MAAQy9E,EAEtD/gG,KAAKwgG,WAAWQ,GAAM,GAGtBhhG,KAAKo/F,IAAM9tD,EAAMliC,EACjBpP,KAAKq/F,WAAa/tD,EAAMvnC,EACxB/J,KAAKs/F,UAAYhuD,EAAM4tD,EACvBl/F,KAAKk3C,MAAQ5F,EAAM78B,EAEnBzU,KAAKihG,aAAaR,EAAgBC,EACpC,CAEOQ,kBACL,MAAMC,GAAY,QAAWnhG,KAAKo/F,IAAKp/F,KAAKq/F,WAAYr/F,KAAKs/F,UAAWt/F,KAAKk3C,OACvEkqD,GAAO,QAAWD,GAClB7sD,EAAM8sD,EAAK9pE,MAAM,GAAI,GAE3B,MAAO,CACL+pE,IAAK,OAAOrhG,KAAKo/F,QAAQp/F,KAAKq/F,gBAAgBr/F,KAAKs/F,cACnDqB,IAAK,OAAOQ,EAAU,OAAOA,EAAU,OAAOA,EAAU,MACxD7sD,IAAKA,EACLgtD,KAAM,QAAQthG,KAAKo/F,QAAQp/F,KAAKq/F,gBAAgBr/F,KAAKs/F,eAAet/F,KAAKk3C,SACzE+nD,KAAM,QAAQkC,EAAU,OAAOA,EAAU,OAAOA,EAAU,OAAOA,EAAU,MAC3EC,KAAMA,EACND,UAAWA,EAEf,CAEOF,aAAaR,GAAiB,EAAMC,GAAiB,GAC1D,MAAMpvD,EAAQtxC,KAAKkhG,kBACnBlhG,KAAKwlB,SAASg6E,WAAW/4E,eAAe,KAAM,OAAQ6qB,EAAMgD,KAEzDmsD,IACDzgG,KAAK4/F,cAAc1gD,iBAAiB5N,EAAMgD,KAC1Ct0C,KAAK4/F,cAAcjhC,SAAS,eAG3B+hC,IACD1gG,KAAK6/F,cAAc3gD,iBAAiB5N,EAAM6vD,UAAU7pE,MAAM,GAAI,GAAG9S,KAAK,OACtExkB,KAAK6/F,cAAclhC,SAAS,eAG3B3+D,KAAKywB,UACNzwB,KAAKywB,SAAS6gB,EAElB,CAEQkvD,WAAWv0D,EAAexN,GAAS,GACzC,MAEMkiC,GAFS,EAAA4gC,EAAA,GAAMt1D,EAAQjsC,KAAKugG,QAAQ59E,KAAM,EAAG3iB,KAAKugG,QAAQj9E,OAEtCtjB,KAAKugG,QAAQj9E,MACvCtjB,KAAKo/F,IAAM54F,KAAKmD,MAAM,IAAMg3D,GAE5B,MAAM2gC,EAAO,QAAQthG,KAAKo/F,mBAAmBp/F,KAAKk3C,SAElDl3C,KAAKwlB,SAASm6E,WAAWl5E,eAAe,KAAM,IAAiB,IAAXk6C,EAAkB,KACtE3gE,KAAKwlB,SAASm6E,WAAWl5E,eAAe,KAAM,OAAQ66E,GAEtDthG,KAAKwlB,SAAS65E,WAAWz4E,iBAAiBH,eAAe,KAAM,aAAc66E,GAE1E7iE,GACDz+B,KAAKihG,cAET,CAEQX,kBAAkBr0D,EAAeoiC,EAAe5vC,GAAS,GAC/D,MAAM+iE,EAAOxhG,KAAKqgG,QAAQ/8E,MACpBm+E,EAAOzhG,KAAKqgG,QAAQ38E,OAKpBg+E,GAHS,EAAAH,EAAA,GAAMt1D,EAAQjsC,KAAKqgG,QAAQ19E,KAAM,EAAG6+E,GAG7BA,EAAO,IACvBG,GAHS,EAAAJ,EAAA,GAAMlzB,EAAQruE,KAAKqgG,QAAQj9E,IAAK,EAAGq+E,GAG5BA,EAAO,IAEvBjC,EAAax/F,KAAKwlB,SAASg6E,WACjCA,EAAW/4E,eAAe,KAAM,IAAKi7E,EAAO,KAC5ClC,EAAW/4E,eAAe,KAAM,IAAKk7E,EAAO,KAE5C,MAAMtC,GAAa,EAAAkC,EAAA,GAAMG,EAAM,EAAG,KAE5BE,EAAa,IAAMvC,EAAa,EAChCwC,EAAa,KAAM,EAAAN,EAAA,GAAMI,EAAM,EAAG,KAElCrC,GAAY,EAAAiC,EAAA,GAAMM,EAAa,IAAMD,EAAY,EAAG,KAE1D5hG,KAAKq/F,WAAaA,EAClBr/F,KAAKs/F,UAAYA,EAEd7gE,GACDz+B,KAAKihG,cAET,EAlRe,EAAA1kD,WAAa,e,cCIf,MAAMulD,UAA8B,IAAnD,c,oBA4FU,KAAAC,YAAc,CAACztD,EAAa0tD,GAAoB,KACtD,GAAGA,EACDhiG,KAAKiiG,YAAYjC,SAAS1rD,OACrB,CACL,MAAM2qD,GAAO,QAAW3qD,GAClB42C,EAAWlrF,KAAK8tF,MAAM5C,SACtBoW,EAAOtC,EAAmBC,GAE1BrQ,EAAuC,CAC3Ch/E,EAAG,kBACHhI,GAAI,EACJ6F,OAAQ,CAAC,EACTy9E,SAAU,CACRt7E,EAAG,oBACHsyF,iBAAkB39E,SAAS+vB,EAAIhd,MAAM,GAAI,IACzC7pB,OAAQ,CAAC,IAIby9E,EAAS2D,UAAYD,EACrB1D,EAAS8T,mBAAqBsC,EAE9BthG,KAAKiH,SAAS8uF,gBAAgBoM,YAAY,WAAYlkF,EAAA,YAEtD4T,EAAA,0BAA+B5tB,OAAWA,GAAW,GACrDjE,KAAKyvB,W,GAID,KAAA2yE,cAAiB9wD,IACvBtxC,KAAKqiG,WAAW/wD,EAAMgD,KAAK,EAAM,CA6BrC,CAjJE9hB,OACExyB,KAAKoL,UAAUmI,UAAUxS,IAAI,uBAAwB,8BACrDf,KAAKs+E,SAAS,YAEdt+E,KAAK8tF,MAAQH,EAAA,aAEb,MAAMvoD,EAAU,IAAI,IAAe,CAAC,GACpCplC,KAAKiiG,YAAc,IAAI9C,EAEvB/5D,EAAQzyB,QAAQjH,OAAO1L,KAAKiiG,YAAY72F,WAExCpL,KAAKswB,WAAW5kB,OAAO05B,EAAQh6B,WAE/B,MAAMk3F,EAAc,IAAI,IAAe,CAAC,GAElCC,EAAOviG,KAAKuiG,KAAOl3F,SAASC,cAAc,OAChDi3F,EAAKhvF,UAAUxS,IAAI,QAEJ,CACb,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAGKgE,SAASusC,IACd,MAAMtuC,EAAOqI,SAASC,cAAc,OACpCtI,EAAKuQ,UAAUxS,IAAI,aACnBiC,EAAKqjB,QAAQirB,MAAQA,EAAM5oB,cAG3B,MAAMhjB,EAAQ2F,SAASC,cAAc,OACrC5F,EAAM6N,UAAUxS,IAAI,mBACpB2E,EAAM6F,MAAMi3F,gBAAkBlxD,EAE9BtuC,EAAK0I,OAAOhG,GACZ68F,EAAK72F,OAAO1I,EAAK,KAGnB,QAAiBu/F,GAAOx6F,IACtB,MAAM1H,GAAS,EAAAkd,EAAA,GAAgBxV,EAAE1H,OAAQ,aACzC,IAAIA,GAAUA,EAAOkT,UAAUqB,SAAS,UACtC,OAGF,MAAM08B,EAAQjxC,EAAOgmB,QAAQirB,MACzBA,GAIJtxC,KAAKqiG,WAAW/wD,EAAM,GACrB,CAACz/B,eAAgB7R,KAAK6R,iBAEzBywF,EAAY3vF,QAAQjH,OAAO62F,GAC3BviG,KAAKswB,WAAW5kB,OAAO42F,EAAYl3F,WAEnCpL,KAAKqiG,YAAa,EAAAI,EAAA,GAASziG,KAAK+hG,YAAa,IAAI,EACnD,CAEQtyE,YACN,MAAM3N,EAAS9hB,KAAKuiG,KAAK3qF,cAAc,WAGjC05B,EAFatxC,KAAK8tF,MAAM5C,SACD2D,UACL3D,SAASgX,iBAC3B7hG,EAASixC,EAAQtxC,KAAKuiG,KAAK3qF,cAAc,0BAA0B05B,OAAa,KACnFxvB,IAAWzhB,IAIXyhB,GACDA,EAAOvO,UAAU/Q,OAAO,UAGvBnC,GACDA,EAAOkT,UAAUxS,IAAI,UAEzB,CAmCAma,SACExY,YAAW,K,QACT,MAAMwoF,EAAWlrF,KAAK8tF,MAAM5C,SACtB55C,EAAqC,QAA7B,EAAmB,QAAnB,EAAA45C,aAAQ,EAARA,EAAU2D,iBAAS,eAAE3D,gBAAQ,eAAEgX,iBAEvCQ,IAAcpxD,GAAkC,oBAAzB45C,EAAS2D,UAAUj/E,EAG7C8yF,IACD1iG,KAAKiiG,YAAYxxE,SAAWzwB,KAAKoiG,eAGnCpiG,KAAKiiG,YAAYjC,SAAU1uD,GAAS,IAAMA,EAAMoJ,SAAS,KAAQ,WAE7DgoD,IACF1iG,KAAKiiG,YAAYxxE,SAAWzwB,KAAKoiG,c,GAElC,EACL,CAEA17C,sBAIE,OAHA1mD,KAAKiiG,YAAYxxE,cAAWxsB,EAC5BjE,KAAKiiG,iBAAch+F,EAEZiO,MAAMw0C,qBACf,E,uWCrIa,MAAMi8C,UAAyB,IAA9C,c,oBAGU,KAAAC,QAAsB,IAAIxhG,IAG1B,KAAAyhG,oBAAmD,IAAIthG,IACvD,KAAAuhG,cAA0C,IAAIvhG,IAmF9C,KAAAwhG,cAAgB,MC/HX,SAAqBC,GAClC,MAAMjyE,EAAQ1lB,SAASC,cAAc,SACrCylB,EAAMnvB,KAAO,OACbmvB,EAAMxlB,MAAMoc,QAAU,OAEnBq7E,IACDjyE,EAAMiyE,OAASA,GAGjB33F,SAASI,KAAKC,OAAOqlB,GAErB,MAAMxiB,EAAU,IAAI6S,SAAc,CAACjT,EAASkT,KAC1C0P,EAAMnjB,iBAAiB,UAAW7F,IAChC,MAAM8jE,EAAa9jE,EAAE1H,OAAOyrE,MAAM,GAC9BD,EAKJ19D,EAAQ09D,GAJNxqD,EAAO,mBAII,GACZ,CAACpT,MAAM,GAAM,IACfkK,SAAQ,KACT4Y,EAAMvuB,QAAQ,IAKhB,OAFAuuB,EAAM9b,QAEC1G,CACT,EDoGI00F,CAAY,oCAAoC30F,MAAWu9D,GAAS,EAAD,gCACjE,GAAGA,EAAK3zD,KAAKgrF,SAAS,QAAS,CAC7B,MAAM14E,EAAMnf,SAASC,cAAc,OAC7B5D,EAAM2yB,IAAI8oE,gBAAgBt3B,SAC1B,EAAAnkD,EAAA,IAA0B8C,EAAK9iB,GAAK,GAC1C,MAAM07F,EAAW,cACX,KAACt0B,SAAc,EAAAu0B,EAAA,GAAkB,CAAC39F,MAAO8kB,EAAK3iB,KAAM,IAAI,IAAU2iB,EAAI7E,aAAc6E,EAAI5E,eAAgBw9E,aAC9Gv3B,EAAO,IAAIy3B,KAAK,CAACx0B,GAAOjD,EAAK3zD,KAAKyO,QAAQ,SAAU,QAAS,CAAC/kB,KAAMwhG,G,CAGtE,MAAMxU,QAAkB5uF,KAAKiH,SAASC,eAAeq8F,uBAAuB13B,GACtE23B,EAAgBxjG,KAAKiH,SAASC,eAAeu8F,gBAAgB7U,EAAUhnF,IACvE87F,EAA0Cx3E,EAAA,0BAA2C2/C,EAAK3zD,KAAMsrF,GAEhGt1F,GAAW,SACjBA,EAAS4oE,kBAAoB4sB,EAAe5sB,kBAC5C5oE,EAAS2/B,OAAS61D,EAAe71D,OAEjC61D,EAAep1F,MAAMsgF,IACnB5uF,KAAK4iG,QAAQ3hG,OAAOuL,GACpBxM,KAAK8iG,cAAc7hG,OAAOuL,GAC1BxM,KAAK6iG,oBAAoBj/F,IAAIwH,EAAWwjF,GACxC,MAAM+U,EAAS3jG,KAAK4jG,gBAAgBhV,GACpC5uF,KAAK8iG,cAAcl/F,IAAI+/F,EAAQv4F,GAE/Bu3F,EAAiBkB,sBAAsBjV,GAAWtgF,KAAKJ,EAASC,QAASD,EAASmT,OAAO,GACxFnT,EAASmT,QAEZ,MAAM7U,EAAMxM,KAAK4jG,gBAAgBhV,GACjC1gF,EAAS+J,OAAM,KACb7M,EAAU5I,QAAQ,IAGpB,MAAMwZ,EAAY,IAAI,IAAqB,CACzC+5D,UAAU,EACV33D,YAAY,EACZ8pB,gBAAgB,KAGZ,UAAC98B,SAAmBpL,KAAK8jG,aAAalV,GAAW,GACvD5uF,KAAK4iG,QAAQ7hG,IAAIyL,GAEjBwP,EAAU0P,OAAOtgB,GAAW,EAAO8C,EACrC,KAAE,EAGI,KAAA61F,aAAe,K,YACrB,MAAMC,EAAe,0BAAiC7hE,GAAMA,EAAEjqB,OAASlY,KAAK8tF,MAAM51E,OAC/E8rF,MACCrB,EAAiB5mF,OACnB/b,KAAK8tF,MAAM5C,UAAW,EAAAvnD,EAAA,GAAKqgE,EAAa9Y,UACxClrF,KAAKiH,SAAS8uF,gBAAgBoM,YAAY,WAAYlkF,EAAA,YACtD4T,EAAA,0BAA+B5tB,OAAWA,GAAW,GACrDjE,KAAKikG,kBAAkB/kD,iBAAiE,QAAhD,EAAwC,QAAxC,EAA8B,QAA9B,EAAmB,QAAnB,EAAAl/C,KAAK8tF,MAAM5C,gBAAQ,eAAE2D,iBAAS,eAAE3D,gBAAQ,eAAEz9E,cAAM,eAAEs1C,M,EAsItF,KAAAmhD,YAAen8F,IACrB,MAAM1H,GAAS,EAAAkd,EAAA,GAAgBxV,EAAE1H,OAAQ,aACzC,IAAIA,EAAQ,OAEZ,MAAMwuF,EAAY7uF,KAAK6iG,oBAAoB5/F,IAAI5C,GAC/C,GAAmB,oBAAhBwuF,EAAUj/E,EAEX,YADA+yF,EAAiBkB,sBAAsBhV,GAIzC,MAAMriF,EAAMxM,KAAK4jG,gBAAgB/U,GACjC,GAAG7uF,KAAK4iG,QAAQv/F,IAAImJ,GAAM,OAC1BxM,KAAK4iG,QAAQ7hG,IAAIyL,GAEjB,MAAM7K,EAAMktF,EAAUxjF,SAChB2Q,EAAY,IAAI,IAAqB,CACzCoC,YAAY,EACZ8pB,gBAAgB,IAGZtlC,EAAO,IAAW,EAAD,gC,YACrB,MAAM2L,EAAUo0F,EAAiBkB,sBAAsBhV,UAC5B7uF,KAAKiH,SAASO,cAAcC,gBAAgB9F,IACtD+F,OAAuD,QAAhD,EAAwC,QAAxC,EAA8B,QAA9B,EAAmB,QAAnB,EAAA1H,KAAK8tF,MAAM5C,gBAAQ,eAAE2D,iBAAS,eAAE3D,gBAAQ,eAAEz9E,cAAM,eAAEs1C,OACxE/mC,EAAU0P,OAAOrrB,GAAQ,EAAMkO,EAEnC,IAEAyN,EAAU7Q,aAEV,QAAiB9K,GAAS0H,IACrBiU,EAAUA,UAAU/C,eACrB+C,EAAU/H,QAAQlM,GAClBiU,EAAU4P,UAEVhpB,G,GAED,CAACiP,eAAgB7R,KAAK6R,iBAEzBjP,GAAM,EAgGA,KAAA6sB,UAAY,KAClB,MAAM3N,EAAS9hB,KAAKuiG,KAAK3qF,cAAc,WACjCvX,EAASL,KAAK8iG,cAAc7/F,IAAIjD,KAAKmkG,yBAAyBnkG,KAAK8tF,QACtEhsE,IAAWzhB,IAIXyhB,GACDA,EAAOvO,UAAU/Q,OAAO,UAGvBnC,GACDA,EAAOkT,UAAUxS,IAAI,U,CAG3B,CAnaS0V,qBACL,MAAO,CACL2tF,YAAanmF,EAAA,4CAEjB,CAEY6vE,YACV,OAAOH,EAAA,YACT,CAEOn7D,KAAK7xB,EAAwDgiG,EAAiB3Q,e,UACnFhyF,KAAKoL,UAAUmI,UAAUxS,IAAI,uBAAwB,8BACrDf,KAAKs+E,SAAS,kBAEd,CACE,MAAMlzE,GAAY,OAAgBpL,KAAKswB,YAEjC+zE,GAAe,OAAO,8BAA+B,CAACtwF,KAAM,YAAaC,KAAM,mCAC/EswF,GAAc,OAAO,8BAA+B,CAACvwF,KAAM,WAAYC,KAAM,aAC7E8iF,GAAc,OAAO,8BAA+B,CAAC/iF,KAAM,aAAcC,KAAM,sBAErF,QAAiBqwF,EAAcrkG,KAAK+iG,cAAe,CAAClxF,eAAgB7R,KAAK6R,kBAEzE,QAAiByyF,GAAa,KAC5BtkG,KAAKuhF,OAAOC,UAAUsgB,GAAuB12E,MAAM,GAClD,CAACvZ,eAAgB7R,KAAK6R,kBAEzB,QAAiBilF,EAAa92F,KAAK+jG,aAAc,CAAClyF,eAAgB7R,KAAK6R,iBAEvE,MAAM+8E,EAA+B,QAAnB,EAAA5uF,KAAK8tF,MAAM5C,gBAAQ,eAAE2D,UACjCoV,EAAoBjkG,KAAKikG,kBAAoB,IAAI,IAAc,CACnEjwF,KAAM,sBACNkE,KAAM,OACN0tB,QAA6D,QAAnD,EAA2C,QAA5C,EAACgpD,aAAS,EAATA,EAAmC1D,gBAAQ,eAAEz9E,cAAM,eAAEs1C,OAGjE/iD,KAAK6R,eAAe9Q,IAAIkjG,EAAkBlzE,MAA1C/wB,CAAiD,UAAU,IAAW,EAAD,gCACnEA,KAAK8tF,MAAM5C,SAAS2D,UAAU3D,SAASz9E,OAAOs1C,KAAOkhD,EAAkBlzE,MAAM6U,cAAW3hC,QAClFjE,KAAKiH,SAAS8uF,gBAAgBoM,YAAY,WAAYlkF,EAAA,YAG5Dvb,YAAW,KACT,MAAMof,EAASygF,EAAK3qF,cAAc,WAClC,IAAIkK,EAAQ,OAEZ,MAAM+sE,EAAY7uF,KAAK6iG,oBAAoB5/F,IAAI6e,GAC3C+sE,EAAkCphF,OAAO82F,SAA2B,oBAAhB1V,EAAUj/E,GAIlE+yF,EAAiBkB,sBAAsBhV,EAAU,GAChD,IACL,MAEAzjF,EAAUM,OACR24F,EACAC,EACAxN,GACA,QAA2BmN,GAAmB74F,U,CAIlD6S,EAAA,mBAA2B,oBAAqBje,KAAKyvB,WAErD,MAAMlhB,EAAU5N,EAAEyjG,YAAY91F,MAAMk2F,IAClC,MAAMnsE,EAAWmsE,EAAW1pF,KAAK8zE,GACxB5uF,KAAK8jG,aAAalV,KAG3B,OAAOxtE,QAAQgI,IAAIiP,EAAS,IAGxBosE,GAAgB,OAAgBzkG,KAAKswB,YACrCiyE,EAAOviG,KAAKuiG,KAAOl3F,SAASC,cAAc,OAKhD,OAJAi3F,EAAKhvF,UAAUxS,IAAI,SACnB,QAAiBwhG,EAAMviG,KAAKkkG,YAAa,CAACryF,eAAgB7R,KAAK6R,iBAC/D4yF,EAAc/4F,OAAO62F,GAEdh0F,CACT,CA4DQq1F,gBAAgBhV,GACtB,MAAO,GAAKA,EAAUhnF,EACxB,CAEQu8F,yBAAyBrW,G,MAC/B,MAAO,IAAM9tF,KAAK4jG,gBAA8B,QAAd,EAAA9V,EAAM5C,gBAAQ,eAAE2D,YAAc,GAClE,CAEOp4E,oBACLm4E,EACAxjF,EAAYC,SAASC,cAAc,Q,MAEnC,MAAM2rC,GAAS,QAAuB23C,GAChC8V,EAA0B,cAAhB9V,EAAUh/E,EAC1B,GAAI80F,GAAW9V,EAAUnhF,OAAO82F,UAAYttD,EAE1C,OAGF,MAAM0tD,IAAW/V,EAAUnhF,OAAOm3F,KAElC,IAAIjjG,EAA0D+iG,EAAU9V,EAAUvjF,cAAgCpH,EAC/GygG,IAAY/iG,IACbA,EAAM,CACJiO,EAAG,qBACHD,WAAY,GACZ9H,KAAM,IACNH,IAAK,yBACL0G,EAAG,KACHgB,EAAG,KACHsH,UAAW,kBAIftL,EAAUmI,UAAUxS,IAAI,mBACxBqK,EAAUib,QAAQze,GAAK,GAAKgnF,EAAUhnF,GAEtC,MAAMlC,EAAQ2F,SAASC,cAAc,OACrC5F,EAAM6N,UAAUxS,IAAI,yBAEpB,MAAM2yB,EAA+B,GACrC,IAAI6E,EAAuC1wB,EAC3C,GAAG68F,EAAS,CACV78F,GAAO,EAAA2wB,EAAA,GAAgB72B,EAAK,IAAK,KACjC42B,GAAU,OAAU,CAClBO,MAAOn3B,EACPwG,QAAS,KACTiD,UAAW1F,EACXkzB,kBAAkB,EAClB/wB,OACAqpC,SAAU09C,EAAUnhF,OAAO82F,UAG1B3V,EAAUnhF,OAAO82F,SAClB7+F,EAAM6N,UAAUxS,IAAI,cAGtB,MAAMwN,EAAUgqB,EAAQjqB,MAAK,EAAOolB,eAAcwF,YAAY,EAAD,gCAE3D,aADMxF,EAAarkB,QAASqkB,EAAayF,KAClCD,CACT,MAAG5qB,MAAM4qB,I,MAYP,OAXG01D,EAAUnhF,OAAO82F,UACfI,GACDzrE,EAAOC,KAAK5tB,MAAMoc,QAAU,OACzBuR,EAAO7pB,QACR6pB,EAAO7pB,MAAM9D,MAAMoc,QAAU,UAEL,QAAlB,EAAAinE,EAAU1D,gBAAQ,eAAE2Z,aAC5B3rE,EAAOC,KAAK5tB,MAAMqZ,QAAU,GAAKpe,KAAKuZ,IAAI6uE,EAAU1D,SAAS2Z,WAAa,MAIvEptB,EAAA,UAAqB,KAC1BrsE,EAAUM,OAAOhG,EAAM,GACvB,IAGJguB,EAAarxB,KAAKkM,E,MAElBnD,EAAUM,OAAOhG,GAGnB,GAAqB,QAAlB,EAAAkpF,EAAU1D,gBAAQ,eAAEgX,iBAAkB,CACvC,MAAM,OAAC5+F,GAAU,WAAsC2zC,GAGvD,GAFA3zC,EAAOiQ,UAAUxS,IAAI,4BAElB4jG,GAAUD,EAAS,CACpB,MAAMn2F,EAAUgqB,EAAQjqB,MAAK,EAAEolB,kBACtBA,EAAayF,KAAK7qB,MAAK,IAAW,EAAD,gCACtC,MAAM/G,QAAqB0W,EAAA,yCAAiDtc,EAAKkG,EAAKjG,MACtF0B,EAAOiI,MAAMu5F,gBAAkB,OAAOv9F,EAAaG,OACnDpE,EAAOiI,MAAMqZ,QAAU,IAAMgqE,EAAUnhF,OAAOm3F,KAAO,IAAMhW,EAAU1D,SAAS2Z,UAAYjW,EAAU1D,SAAS2Z,WAAa,IAC1Hn/F,EAAMgG,OAAOpI,EACf,QAGFowB,EAAarxB,KAAKkM,E,MAElB7I,EAAMgG,OAAOpI,E,CAIjB,MAAO,CACL8H,YACA1F,QACAklB,YAAaxJ,QAAQgI,IAAIsK,GAE7B,CAEQowE,aAAalV,EAAsBljF,GAAS,GAClD,MAAMo+B,EAAS64D,EAAiBmB,aAAalV,GAC7C,GAAG9kD,EAAQ,CACT,MAAM,UAAC1+B,EAAS,MAAE1F,GAASokC,EAC3B1+B,EAAUmI,UAAUxS,IAAI,aACxB2E,EAAM6N,UAAUxS,IAAI,mBAEpB,MAAMyL,EAAMxM,KAAK4jG,gBAAgBhV,GACjC5uF,KAAK6iG,oBAAoBj/F,IAAIwH,EAAWwjF,GACxC5uF,KAAK8iG,cAAcl/F,IAAI4I,EAAKpB,GAEzBpL,KAAKmkG,yBAAyBnkG,KAAK8tF,SAAWthF,GAC/CpB,EAAUmI,UAAUxS,IAAI,UAG1Bf,KAAKuiG,KAAK72F,EAAS,SAAW,WAAWN,E,CAG3C,OAAO0+B,GAAUA,EAAOlf,YAAYtc,MAAK,IAAMw7B,GACjD,E,IAnRc,EAAA/tB,OAAS,EAiUT,EAAA8nF,sBAAwB,CAACjV,EAAsBF,KAC3D,MAAMqW,IAAY,EAAKhpF,OACjBsX,EAAa,IAAM0xE,IAAY,EAAKhpF,OAEpCpa,EAAOitF,EAAkCvjF,SACzC6C,GAAW,SACjB,IAAIiI,EACDxU,GACDwU,EAAW+V,EAAA,mBAAoC,CAC7CxmB,MAAO/D,EACP0R,QAASwe,EAAA,gBAA4BA,EAAA,sCAAkD,IAEzF3jB,EAAS4oE,kBAAoB3gE,EAAS2gE,kBACtC5oE,EAAS2/B,OAAS13B,EAAS03B,QAE3B13B,EAAWiL,QAAQjT,UAGrB,MAAM62F,EAAc,CAACC,EAAcv9F,KACjC0pC,MAAM1pC,GAAK4G,MAAM+iC,IACfxf,EAAA,qBAA+B,eAAiBozE,EAAM5zD,EAAS,GAC/D,EAmEJ,OAhEAl7B,EAAS7H,MAAK,IAAW,OAAD,6B,UACtB,IAAI+kB,IAEF,YADAnlB,EAASC,UAIX,MAAM+2F,IAAgBxW,EACtBA,UAAAA,EAAkBf,EAAA,aAA2BzC,UAC7C,MAAMia,EAAWz9F,I,MACf,IAAI09F,EACJ,MAAM5C,GAAkB,QAAuB5T,GAC/C,GAAGlnF,IAAQ86F,EACT4C,EJzVH,SAAsBC,GAC3B,MAAM76E,EAAMnf,SAASC,cAAc,OACnC,OAAO,EAAAoc,EAAA,IAA0B8C,EAAK66E,GAAU,GAAO/2F,MAAK,IArBvD,SAAqCg3F,EAAgChiF,EAAeI,GACzF,MAAMpgB,EAAS+H,SAASC,cAAc,UAChCi6F,EAAQjiF,EAAQI,EActB,OAZa,IAAV6hF,GACDjiG,EAAOggB,MAFU,GAGjBhgB,EAAOogB,OAASpgB,EAAOggB,MAAQiiF,GACvBA,EAAQ,GAChBjiG,EAAOogB,OALU,GAMjBpgB,EAAOggB,MAAQhgB,EAAOogB,OAAS6hF,GAE/BjiG,EAAOggB,MAAQhgB,EAAOogB,OARL,GAWHpgB,EAAOoiB,WAAW,MAC1BM,UAAUs/E,EAAa,EAAG,EAAGhiF,EAAOI,EAAQ,EAAG,EAAGpgB,EAAOggB,MAAOhgB,EAAOogB,QACxEg7E,EAAuBp7F,EAChC,CAKWkiG,CAA4Bh7E,EAAKA,EAAI7E,aAAc6E,EAAI5E,gBAElE,CIoV4B6/E,CAAa/9F,OAC1B,CACL,MAAM,OAACpE,GAAU,WAAsCk/F,GACvD4C,EAAkBhkF,QAAQjT,QAAQuwF,EAAuBp7F,G,CAG3D,MAAM2hG,EAA8C,QAAtC,EAAArW,EAAkCqW,YAAI,QAAI,GACxD7jF,QAAQgI,IAAI,CACVg8E,EACAH,GAAQD,EAAYC,EAAMv9F,KACzB4G,MAAK,EAAEqwF,MACR,IAAItrE,IAEF,YADAnlB,EAASC,UAIX,MAAMmzF,EAAOtC,EAAmB9lF,MAAMC,KAAKwlF,IAE3CjQ,EAAcG,UAAYD,EAC1BF,EAAcsQ,mBAAqBsC,EAE/B4D,GACFjnF,EAAA,uCAA+C,WAAYA,EAAA,YAG7D4T,EAAA,qBAA+BozE,EAAMv9F,GAAK,GAAM4G,KAAKJ,EAASC,QAAQ,GACtE,EAGJ,IAAIxM,EAEF,YADAwjG,IAIF,MAAM59F,QAAqB0W,EAAA,yCAAiDtc,IAChC,QAAzC,EAAiC,QAAjC,EAAuB,QAAvB,EAAA+sF,EAAcG,iBAAS,eAAE3D,gBAAQ,eAAEz9E,cAAM,eAAEs1C,MAC5CrgD,YAAW,KACT,MAAM,OAACY,EAAM,QAAEiL,IAAW,OAAKhH,EAAaG,IAAK,GAAI,GACrD6G,EAAQD,MAAK,KACP+kB,IAKJ8xE,EAAQ7hG,EAAOoiG,aAJbx3F,EAASC,SAIgB,GAC3B,GACD,KACKklB,KACR8xE,EAAQ59F,EAAaG,IAEzB,MAEOwG,CAAQ,C,ohBEraJ,MAAMy3F,UAA4B,IAAjD,c,oBAgIE,KAAA5gE,cAAsBC,GAAsB,EAAD,sCAGnChlC,KAAKiH,SAASy2B,gBAAgBkoE,cACpC5gE,EAAQjgC,SAASiD,IAGf,MAAM,IAAC00B,GAAO3E,EAAA,qBAA+B,CAC3C/vB,OAAQA,EACRoD,UAAWpL,KAAKqlB,SAASiL,WACzBwP,eAAe,EACfvO,WAAY,eAGRyS,EAAWhkC,KAAKqlB,SAAS2e,SAAS3gC,IAAI2E,GAC5C00B,EAAItF,YAAY1rB,OAAO1L,KAAK2lC,SAAS3B,IAGrC,MAAM6hE,EAAgC,GACtC7lG,KAAK8lG,iBAAiB/gG,SAAQ,CAAC+5B,EAAS1F,KACtC,GAAG0F,EAAQz7B,IAAI2E,GAAS,CACtB,MAAM+sB,EAAO1pB,SAASC,cAAc,SACpC,EAAAmvB,EAAA,GAAa1F,GAAM,EAAA/L,EAAA,GAAcoQ,EAAOrqB,QACxC82F,EAAexjG,KAAK0yB,E,MAIT,QAAK8wE,GAAgB,GAC7B9gG,SAASnE,IACd87B,EAAIU,gBAAgB1xB,OAAO9K,EAAG,GAC9B,GAEN,IA4FA,KAAAmlG,eAAkBljG,IAEC,aAAd7C,KAAK4B,OACN5B,KAAKgmG,WAAWz6F,MAAMoc,QAAU9kB,EAAS,GAAK,O,CAYpD,CA/PS2vB,KACL4G,EACAx3B,EACAqkG,GAEAjmG,KAAKkmG,eAAiB9sE,EACtBp5B,KAAKo5B,QAAS,EAAAuK,EAAA,GAAK3jC,KAAKkmG,gBACxBlmG,KAAK4B,KAAOA,EACZ5B,KAAKimG,cAAgBA,EAErBjmG,KAAK2S,QAAQnQ,SACbxC,KAAKoL,UAAUmI,UAAUxS,IAAI,+BAC7Bf,KAAKgmG,YAAa,OAAW,yBAA0B,CAAChnF,UAAU,IAClEhf,KAAKgmG,WAAWz6F,MAAMoc,QAAU,OAEhC3nB,KAAK+nD,OAAOr8C,OAAO1L,KAAKgmG,aAExB,QAAiBhmG,KAAKgmG,YAAY,IAAW,EAAD,gCAC1C,MAAMhiE,EAAWhkC,KAAKqlB,SAASuiB,cAI/B,GAAiB,aAAd5nC,KAAK4B,KACN,IAAI,MAAM4K,KAAOxM,KAAKo5B,OAAO3rB,OACI,IAA5BjB,EAAI2N,QAAQ,oBAKRna,KAAKo5B,OAAO3rB,OAAOjB,QAG5B,IAAI,MAAMA,KAAOxM,KAAKo5B,OAAO3rB,OACI,IAA5BjB,EAAI2N,QAAQ,oBAKRna,KAAKo5B,OAAO3rB,OAAOjB,GAI9B,MAAMw4B,EAAoB,GAC1B,IAAI,MAAMx4B,KAAOw3B,EACZx3B,EAAIqc,WACLmc,EAAQ3iC,KAAKmK,EAAIomB,YAGjB5yB,KAAKo5B,OAAO3rB,OAAOjB,IAAO,EAI9B,IAAI25F,EAEFA,EADe,aAAdnmG,KAAK4B,KACCoG,GAAWg9B,EAAQjwB,SAAS/M,GAE5BA,IAAYg9B,EAAQjwB,SAAS/M,IAGtC,EAAAwgD,EAAA,GAAexoD,KAAKo5B,OAAO+5D,eAAe,CAACnrF,EAAQe,KAC7Co9F,EAAIn+F,KACNhI,KAAKo5B,OAAO+5D,cAAc7kE,OAAOvlB,EAAK,GACtC/I,KAAKo5B,OAAOgtE,aAAa93E,OAAOvlB,EAAK,G,IAIzC,MAAMs9F,EAAsB,aAAdrmG,KAAK4B,KAAsB,iBAAmB,iBACtD0kG,EAA4B,aAAdtmG,KAAK4B,KAAsB,gBAAkB,iBACjE,EAAA4mD,EAAA,GAAexoD,KAAKo5B,OAAOitE,IAAQ,CAACr+F,EAAQe,KACvCi8B,EAAQjwB,SAAS/M,KAClBhI,KAAKo5B,OAAOitE,GAAO/3E,OAAOvlB,EAAK,GAC/B/I,KAAKo5B,OAAOktE,GAAah4E,OAAOvlB,EAAK,G,IAIzC/I,KAAKo5B,OAAqB,aAAdp5B,KAAK4B,KAAsB,iBAAmB,kBAAoBojC,EAC9EhlC,KAAKo5B,OAAqB,aAAdp5B,KAAK4B,KAAsB,gBAAkB,uBAAyBwf,QAAQgI,IAAI4b,EAAQlqB,KAAK9S,GAAWhI,KAAKiH,SAASqI,gBAAgBi3F,iBAAiBv+F,MAGrKhI,KAAKimG,cAAcO,UAAUxmG,KAAKo5B,QAAQ,GAC1Cp5B,KAAK4S,OACP,KAAG,CAACf,eAAgB7R,KAAK6R,iBAEzB,MAAM40F,EAAexzB,IACnBjzE,KAAKkxB,MAAQjT,EAAA,UAAoBg1D,EAAUyzB,mCAAqCzzB,EAAU0zB,kCAAkC,EAM9H,OAHA3mG,KAAK6R,eAAe9Q,IAAIkd,EAAA,EAAxBje,CAAmC,aAAcymG,GAEjDzmG,KAAK8lG,iBAAmB,IAAIvkG,IACrB6f,QAAQgI,IAAI,CACjBppB,KAAKiH,SAAS2qF,eAAekB,mBAAmBxkF,MAAWmzB,GAAY,EAAD,sCAC9DrgB,QAAQgI,IAAIqY,EAAQrI,QAAQA,IAAY,SAAiBA,EAAOxxB,MAAKkT,KAAUse,GAAW,EAAD,gCAC7F,MACM4L,SADgBhlC,KAAKiH,SAASy3B,eAAe+yD,iBAAiBr4D,EAAOxxB,KACnDkT,KAAKkM,GAAMA,EAAEhf,SACrChI,KAAK8lG,iBAAiBliG,IAAIw1B,EAAQ,IAAIh4B,IAAI4jC,GAC5C,MACF,MAEAhlC,KAAKiH,SAASqwD,WAAW0xB,eAAe16E,MAAM2kE,IAC5CwzB,EAAYxzB,EAAU,KAG5B,CAEAttC,SAAS3B,GACP,MAAMuD,EAAgB,IAAI,IAAc,CACtC59B,OAAO,IAMT,OAJGq6B,IACDuD,EAAcxW,MAAM6U,QAAU5B,GAGzBuD,EAAcC,KACvB,CAoCAtsB,SACElb,KAAKgmG,WAAWz6F,MAAMoc,QAAwB,aAAd3nB,KAAK4B,KAAsB,GAAK,OAChE5B,KAAKs+E,SAAuB,aAAdt+E,KAAK4B,KAAsB,mBAAqB,mBAE9D,MAAMw3B,EAASp5B,KAAKo5B,OAEdwtE,EAAoB,IAAI,IAAe,CAC3CrhC,aAAa,EACbrtD,KAAM,oBAKR,IAAI7R,EAFJugG,EAAkBx7F,UAAUmI,UAAUxS,IAAI,qBAIxCsF,EADe,aAAdrG,KAAK4B,KACI,CACRilG,cAAe,CAACC,IAAK,OAAQ9yF,KAAM,8BACnC+yF,iBAAkB,CAACD,IAAK,UAAW9yF,KAAM,2BACzCgzF,aAAc,CAACF,IAAK,YAAa9yF,KAAM,8BAG/B,CACRkqB,SAAU,CAAC4oE,IAAK,aAAc9yF,KAAM,4BACpCq9E,aAAc,CAACyV,IAAK,cAAe9yF,KAAM,+BACzC9P,OAAQ,CAAC4iG,IAAK,QAAS9yF,KAAM,0BAC7Bs9E,WAAY,CAACwV,IAAK,aAAc9yF,KAAM,4BACtCu9E,KAAM,CAACuV,IAAK,OAAQ9yF,KAAM,yBAI9B,MAAM6wB,EAAIx5B,SAAS8/D,yBACnB,IAAI,MAAM3+D,KAAOnG,EAAS,CACxB,MAAMiQ,GAAS,OAAO,qDAAsD,CAACvC,KAAM1N,EAAQmG,GAAKs6F,IAAK9yF,KAAM3N,EAAQmG,GAAKwH,OACxHsC,EAAO+P,QAAQre,OAASwE,EACxB8J,EAAO5K,OAAO1L,KAAK2lC,YACnBd,EAAEn5B,OAAO4K,E,CAEXswF,EAAkBj0F,QAAQjH,OAAOm5B,GAIjC,MAAMoiE,GAA+B,aAAdjnG,KAAK4B,KAAsBw3B,EAAO65D,eAAiB75D,EAAO85D,gBAAgB57D,QAEjGt3B,KAAKqlB,SAAW,IAAI,IAAe,CACjCygB,SAAU9lC,KAAKoL,UACfqlB,SAAUzwB,KAAK+lG,eACf5hE,SAAU,CAAC,WACXW,kBAAmB9kC,KAAK+kC,cACxBxhC,YAAa,SACbkiC,uBAAwB,cACxBx+B,SAAUjH,KAAKiH,WAEjBjH,KAAKqlB,SAAS2e,SAAW,IAAI5iC,IAAI6lG,GAEjC,IAAIC,GAAe,EACnB,MAAMC,EAAOnnG,KAAKqlB,SAAStkB,IAAIuZ,KAAKta,KAAKqlB,UACzCrlB,KAAKqlB,SAAStkB,IAAM,CAACiH,EAAQ+G,EAAO4nB,KAClC,GAAG32B,KAAKqlB,SAAS2e,SAASn8B,MAAQ7H,KAAKkxB,OAASg2E,IAAiB7gG,EAAQ2B,GAAS,CAChF,MAAMpH,EAAuBZ,KAAKqlB,SAASmK,KAAK5X,cAAc,kBAAkB5P,yBAC7EpH,GACD8B,YAAW,KACT9B,EAAGglC,SAAU,CAAK,GACjB,GAGL,MAAM3hB,EAAM,YAA0B,aAAdjkB,KAAK4B,KAAsB,uCAAwC,wCAAwC,GAEnI,YADA,EAAAuqB,EAAA,IAAMlI,E,CAIR,MAAM6G,EAAMq8E,EAAKn/F,EAAQ3B,EAAQ2B,IAAU,QAAK3B,EAAQ2B,GAAQgM,WAAQ/P,EAAW0yB,GAInF,OAHGtwB,EAAQ2B,IACT8iB,EAAIlT,cAAc,kBAAkBrE,UAAUxS,IAAI,SAAWsF,EAAQ2B,GAAQ8+F,KAExEh8E,CAAG,EAGZ9qB,KAAKqlB,SAASiL,WAAWllB,UAAUM,OAAOk7F,EAAkBx7F,UAAWpL,KAAKqlB,SAASiL,WAAWllB,UAAUwb,kBAE1G5mB,KAAKqlB,SAASwiB,WAAWo/D,GACzBC,GAAe,EAEf,IAAI,MAAME,KAAQhuE,EAAO3rB,OAEpBpH,EAAQghG,eAAeD,IAAWhuE,EAAO3rB,OAAO25F,KACjD,QAAmBR,EAAkBj0F,QAAQiF,cAAc,kBAAkBwvF,OAGnF,CASA1gD,sBAME,OALG1mD,KAAKqlB,WACNrlB,KAAKqlB,SAASja,UAAU5I,SACxBxC,KAAKqlB,SAAW,MAGXnT,MAAMw0C,qBACf,E,kVCvQa,MAAM4gD,UAAyB,IAA9C,c,oBAUU,KAAAlT,MAAsJ,CAAC,CAsXjK,CA7WS39E,qBACL,MAAO,CACLw6E,cAAeC,EAAA,+BAA0C,aAE7D,CAEO1+D,KAAK7xB,EAAwD2mG,EAAiBtV,eACnFhyF,KAAKoL,UAAUmI,UAAUxS,IAAI,yBAC7Bf,KAAKsT,QAAUjI,SAASC,cAAc,OACtCtL,KAAKsT,QAAQC,UAAUxS,IAAI,WAC3Bf,KAAKsT,QAAQ5H,QAAO,QAAK,6BACzB1L,KAAKgjF,iBAAmB33E,SAASC,cAAc,OAC/CtL,KAAKgjF,iBAAiBzvE,UAAUxS,IAAI,qBAEpCf,KAAKgmG,YAAa,OAAW,+BAC7B,IAAIuB,GAAW,EACf,MAAMC,EAA4C,CAChDzzF,KAAM,gBACNC,KAAM,mBACNC,QAAS,KACP,IAAI,IAAU,gBAAiB,CAC7BgjD,aAAc,wCACdC,mBAAoB,sCACpBrjD,QAAS,CAAC,CACRsjD,QAAS,SACT5kC,SAAU,KACLg1E,IAIHA,GAAW,EAEXvnG,KAAKiH,SAAS2qF,eAAe6V,mBAAmBznG,KAAKo5B,QAAQ,GAAM9qB,MAAMo5F,IACvE1nG,KAAK4S,OAAO,IACXuF,SAAQ,KACTovF,GAAW,CAAK,IAChB,EAEJz3B,UAAU,MAEXvkD,MAAM,GAGbvrB,KAAK2nG,SAAU,OAAiB,CAC9B91F,eAAgB7R,KAAK6R,eACrBsP,UAAW,cACXtN,QAAS,CAAC2zF,KAEZxnG,KAAK2nG,QAAQp0F,UAAUxS,IAAI,QAE3Bf,KAAK+nD,OAAOr8C,OAAO1L,KAAKgmG,WAAYhmG,KAAK2nG,SAEzC,MAAMC,EAAe,IAAI,IAAe,CAAC,GAEnCrpB,EAAelzE,SAASC,cAAc,OAC5CizE,EAAahrE,UAAUxS,IAAI,iBAE3Bf,KAAKq5F,eAAiB,IAAI,KAAW,CACnC7xD,MAAO,iBACP01B,UAhFyB,KAmF3BqhB,EAAa7yE,OAAO1L,KAAKq5F,eAAejuF,WACxCw8F,EAAaj1F,QAAQjH,OAAO6yE,GAE5B,MAAMspB,EAAe,CAACxsF,EAAmBysF,EAAqBj0F,EAAgFk0F,KAC5I,MAAM3iE,EAAU,IAAI,IAAe,CACjCltB,KAAM4vF,EACNviC,aAAa,IAGfngC,EAAQh6B,UAAUmI,UAAUxS,IAAI,cAAesa,GAE/C,MAAMi2C,EAAalsB,EAAQ24C,yBAiB3B,OAhBAzsB,EAAW/9C,UAAUxS,IAAI,qBAEzB8S,EAAQ9O,SAAS6uE,IACf,MAAMt9D,GAAS,OAAO,yDAA0D,CAC9EvC,KAAM6/D,EAAE7/D,KACRC,KAAM4/D,EAAE5/D,KACRgL,UAAU40D,EAAEr0B,iBAAat7C,IAGxB2vE,EAAE17D,OACH6vF,EAAGn0B,EAAE17D,MAAQ5B,GAGfg7C,EAAW5lD,OAAO4K,EAAO,IAGpB8uB,CAAO,EAGhBplC,KAAKizF,eAAiB4U,EAAa,uBAAwB,gBAAiB,CAAC,CAC3E9zF,KAAM,cACNC,KAAM,kCACNurC,YAAY,GACX,CACDvrC,KAAM,2BACND,KAAM,aACNmE,KAAM,YACL,CACDlE,KAAM,8BACND,KAAM,cACNmE,KAAM,gBACL,CACDlE,KAAM,yBACND,KAAM,QACNmE,KAAM,UACL,CACDlE,KAAM,2BACND,KAAM,UACNmE,KAAM,cACL,CACDlE,KAAM,uBACND,KAAM,OACNmE,KAAM,SACJlY,KAAKo0F,OAETp0F,KAAKkzF,eAAiB2U,EAAa,uBAAwB,gBAAiB,CAAC,CAC3E9zF,KAAM,gBACNC,KAAM,kCACNurC,YAAY,GACX,CACDvrC,KAAM,6BACND,KAAM,OACNmE,KAAM,iBACL,CACDlE,KAAM,0BACND,KAAM,UACNmE,KAAM,oBACL,CACDlE,KAAM,4BACND,KAAM,YACNmE,KAAM,iBACJlY,KAAKo0F,OAETp0F,KAAKswB,WAAW5kB,OAAO1L,KAAKgjF,iBAAkBhjF,KAAKsT,QAASs0F,EAAax8F,UAAWpL,KAAKizF,eAAe7nF,UAAWpL,KAAKkzF,eAAe9nF,WAEvI,MAAM48F,EAAyBhoG,KAAKizF,eAAe7nF,UAAUwM,cAAc,sBACrEqwF,EAAyBjoG,KAAKkzF,eAAe9nF,UAAUwM,cAAc,uBAE3E,QAAiBowF,EAAuBpwF,cAAc,SAAwB,KAC5E5X,KAAKuhF,OAAOC,UAAUmkB,GAAqBv6E,KAAKprB,KAAKo5B,OAAQ,WAAYp5B,KAAK,GAC7E,CAAC6R,eAAgB7R,KAAK6R,kBAEzB,QAAiBo2F,EAAuBrwF,cAAc,SAAwB,KAC5E5X,KAAKuhF,OAAOC,UAAUmkB,GAAqBv6E,KAAKprB,KAAKo5B,OAAQ,WAAYp5B,KAAK,GAC7E,CAAC6R,eAAgB7R,KAAK6R,kBAEzB,QAAiB7R,KAAKgmG,YAAY,KAChC,GAAGhmG,KAAKq5F,eAAetoE,MAAMxd,UAAUqB,SAAS,SAC9C,OAGF,IAAI5U,KAAKq5F,eAAe3sF,MAAMkkB,OAE5B,YADA5wB,KAAKq5F,eAAetoE,MAAMxd,UAAUxS,IAAI,SAI1C,IAUIwN,EAVA25F,EAAWhvF,MAAMC,KAAK6uF,EAAuBzyE,UAA4B+B,MAAM,GAAG2gB,QAAO,CAACC,EAAKt3C,IAAOs3C,KAAQt3C,EAAG2K,MAAMoc,SAAS,GACpIugF,GAAWloG,KAAKo5B,OAAO+uE,cAActlG,OAEjCqlG,GAKJloG,KAAKgmG,WAAWr4F,aAAa,WAAY,QAMvCY,EAHEvO,KAAKo5B,OAAOxxB,GAGJ5H,KAAKiH,SAAS2qF,eAAe6V,mBAAmBznG,KAAKo5B,QAFrDp5B,KAAKiH,SAAS2qF,eAAewB,mBAAmBpzF,KAAKo5B,QAKjE7qB,EAAQD,MAAMo5F,IACZ1nG,KAAK4S,OAAO,IACXqF,OAAOzS,IACQ,4BAAbA,EAAI5D,MACL,EAAAuqB,EAAA,IAAM,yCAEN/f,QAAQigB,MAAM,4BAA6B7mB,E,IAE5C2S,SAAQ,KACTnY,KAAKgmG,WAAWp+C,gBAAgB,WAAW,MAtB3C,EAAAz7B,EAAA,IAAM,mDAuBN,GACD,CAACta,eAAgB7R,KAAK6R,iBAEzB7R,KAAK6R,eAAe9Q,IAAIf,KAAKq5F,eAAetoE,MAA5C/wB,CAAmD,SAAS,KAC1DA,KAAKo5B,OAAOrqB,MAAQ/O,KAAKq5F,eAAe3sF,MACxC1M,KAAKooG,oBAAoB,IAG3B,MAAMC,EAAsD,SAAdroG,KAAK4B,KAAkB,CACnE5B,KAAKiH,SAAS2qF,eAAe0W,qBAAqBtoG,KAAKo5B,OAAOxxB,GAAI,gBAClE5H,KAAKiH,SAAS2qF,eAAe0W,qBAAqBtoG,KAAKo5B,OAAOxxB,GAAI,iBAClE5H,KAAKiH,SAAS2qF,eAAe0W,qBAAqBtoG,KAAKo5B,OAAOxxB,GAAI,kBAChE,GAEJ,OAAOwZ,QAAQgI,IAAI,CACjBppB,KAAKyyF,qBAAuB9xF,EAAEswF,cAAc3iF,MAAW8B,GAAO,kCAC5D,MAAMhO,QAAegO,EAAG,CACtBhF,UAAWpL,KAAKgjF,iBAChBt/E,MAAM,EACNc,UAAU,EACV8e,MAAO,GACPI,OAAQ,KAKV,OAFA1jB,KAAKS,UAAY2B,EAEV8uF,EAAA,oBAA+B9uF,EACxC,SAEGimG,IACF/5F,MAAK,KACW,SAAdtO,KAAK4B,MACN5B,KAAKwmG,UAAUxmG,KAAKkmG,gBAAgB,GACpClmG,KAAKuoG,eAELvoG,KAAK8xF,gBACL9xF,KAAKwoG,e,GAGX,CAEArkB,qBACEnkF,KAAKyyF,qBAAqBnkF,MAAK,KAC7BtO,KAAKS,UAAU+D,UAAW,EAC1BxE,KAAKS,UAAUgE,MAAM,GAEzB,CAEQ+jG,eAENxoG,KAAKs+E,SAAS,aACdt+E,KAAK2nG,QAAQp0F,UAAUxS,IAAI,QAC3Bf,KAAKgmG,WAAWzyF,UAAU/Q,OAAO,QAEjC,IAAI,MAAM4kG,KAAQpnG,KAAKo0F,MAErBp0F,KAAKo0F,MAAMgT,GAAM77F,MAAMoc,QAAU,MAErC,CAEQ4gF,aAENvoG,KAAKs+E,SAAuB,WAAdt+E,KAAK4B,KAAoB,YAAc,oBAEpC,SAAd5B,KAAK4B,OACN5B,KAAK2nG,QAAQp0F,UAAU/Q,OAAO,QAC9BxC,KAAKgmG,WAAWzyF,UAAUxS,IAAI,SAGhC,MAAMq4B,EAASp5B,KAAKo5B,OACpBp5B,KAAKq5F,eAAe3sF,OAAQ,EAAA2tD,EAAA,GAAcjhC,EAAOrqB,OAEjD,IAAI,MAAMq4F,KAAQpnG,KAAKo0F,MACrBp0F,KAAKo0F,MAAMgT,GAAyC77F,MAAMoc,QAAYyR,EAAO3rB,OAAO25F,GAA2C,GAAK,OAGtI,CAAE,iBAA2B,kBAA4BriG,SAAcyH,GAAQ,kCAC7E,MAAM44B,EAAUplC,KAAKwM,GACfytF,EAAKliE,EAAA,uBAAiC,CAAC0wE,aAAa,IAE1D,IAAIjpE,EAAQpG,EAAO5sB,GAGnB,MAAMk8F,EAAgB1gG,GAAmB,kCACvC,eAAgBhI,KAAKiH,SAAS8G,mBAAmB46F,cAAc3gG,OAAaA,EAAOo3B,UAAkF,gBAAhEp/B,KAAKiH,SAASy2B,gBAAgBC,QAAQ31B,EAAOs3B,aAAa1vB,CACjK,IAEMg5F,QAAiB,EAAAC,EAAA,GAAYrpE,GAAQx3B,GAAW0gG,EAAQ1gG,KAC9Dw3B,EAAM38B,OAAS,EACf28B,EAAMn9B,QAAQumG,GAEdppE,EAAQA,EAAMlI,QAEd,MAAMwxE,EAAmBC,GAAoB,kCAC3C,IAAI,IAAI3kF,EAAI,EAAGvhB,EAAS2D,KAAKI,IAAI44B,EAAM38B,OAAQkmG,GAAU3kF,EAAIvhB,IAAUuhB,EAAG,CACxE,MAAMpc,EAASw3B,EAAMnO,QACrB,IAAGrpB,EAAOo3B,kBAA2Bp/B,KAAKiH,SAAS8G,mBAAmB46F,cAAc3gG,IAClF,SAGF,MAAM,IAAC00B,GAAO3E,EAAA,qBAA+B,CAC3C/vB,OAAQA,EACRoD,UAAW6uF,EACXn6D,eAAe,EACftO,WAAW,EACXD,WAAY,UAEdmL,EAAIU,gBAAgBnkB,cAAczW,Q,CAGjCg9B,EAAM38B,OACPy7B,EAAS1X,iBAAiB4C,aAAY,QAAK,sBAAuB,CAACgW,EAAM38B,UACjEy7B,GACRA,EAAS97B,QAEb,IAIA,IAAI87B,EACJ,GAHA8G,EAAQ24C,yBAAyBryE,OAAOuuF,GAGrCz6D,EAAM38B,OAAQ,CACf,MAAM8P,EAAUyyB,EAAQ24C,yBACxBz/C,GAAW,OAAO,yDAA0D,CAACvqB,KAAM,SACnFuqB,EAAS/qB,UAAUxS,IAAI,YAAa,gBACpC,QAAiBu9B,GAAU,IAAMwqE,EAAW,KAAK,CAACj3F,eAAgB7R,KAAK6R,iBACvEysB,EAAS5yB,QAAO,QAAK,sBAAuB,CAAC8zB,EAAM38B,UAEnD8P,EAAQjH,OAAO4yB,E,CAGjBwqE,EAAW,EACb,KACF,CAEAV,qBACE,GAAiB,SAAdpoG,KAAK4B,KAAiB,CACvB,MAAM8lD,IAAW,EAAAqvC,EAAA,GAAU/2F,KAAKkmG,eAAgBlmG,KAAKo5B,QACrDp5B,KAAKgmG,WAAWzyF,UAAU1J,OAAO,QAAS69C,GAC1C1nD,KAAK2nG,QAAQp0F,UAAU1J,OAAO,OAAQ69C,E,CAE1C,CAEA8+C,UAAUptE,EAAsB8nC,GAC3BlhE,KAAKoL,WAEN8N,MAAMC,KAAKnZ,KAAKoL,UAAUqN,iBAAiB,mBAAmB1T,SAASnE,GAAOA,EAAG4B,WAGhF0+D,GACDlhE,KAAKkmG,eAAiB9sE,EACtBp5B,KAAKo5B,QAAS,EAAAuK,EAAA,GAAKvK,KAEnBp5B,KAAKo5B,OAASA,EACdp5B,KAAKuoG,aACLvoG,KAAKooG,qBAET,CAEOtW,cAAc14D,QACLn1B,IAAXm1B,GACDp5B,KAAKwmG,UAAU,CACb52F,EAAG,eACHhI,GAAI,EACJmH,MAAO,GACPtB,OAAQ,CAAC,EACT24F,aAAc,GACd+B,cAAe,GACfa,cAAe,GACf7V,cAAe,GACfF,eAAgB,GAChBC,eAAgB,KACf,GACHlzF,KAAK4B,KAAO,WAEZ5B,KAAKwmG,UAAUptE,GAAQ,GACvBp5B,KAAK4B,KAAO,OAEhB,E,wKCxYK,SAASqnG,IACd,MAAMtoG,EAAI0K,SAASC,cAAc,OAE3BmJ,GAAI,OAAiBpJ,SAASC,cAAc,MAC5C49F,GAAe,QAAK,oBAAqB,CAACz0F,IAShD,OARAy0F,EAAa31F,UAAUxS,IAAI,0BAC3BJ,EAAE+K,OACAw9F,EACA79F,SAASC,cAAc,MACvBD,SAASC,cAAc,OAEzB3K,EAAE4S,UAAUxS,IAAI,QAET,CACLmB,QAASvB,EACTwoG,YAAc5rE,IACTA,IACD9oB,EAAEumB,KAfsB,iCAeSuC,GAGnC58B,EAAE4S,UAAU1J,OAAO,QAAS0zB,EAAS,EAG3C,CAEe,MAAM6rE,UAA0B,IAWtC3yF,qBACL,MAAO,CACL4yF,aAAc,iCAAuC,OACrD5rE,KAAM,uCACN6rE,SAAU,0CAAgD,qBAE9D,CAEa92E,KAAK7xB,G,qCAChBX,KAAKoL,UAAUmI,UAAUxS,IAAI,0BAC7Bf,KAAKs+E,SAAS,qBAEd,MAAMz5B,EAA4B,IAE3BwkD,EAAc5rE,EAAM6rE,SAAkBloF,QAAQgI,IAAI,CAACzoB,EAAE0oG,aAAc1oG,EAAE88B,KAAM98B,EAAE2oG,WAEpF,CACE,MAAMlkE,GAAU,OAAgBplC,KAAKswB,gBAAYrsB,EAAW,mBACtDs6E,EAAelzE,SAASC,cAAc,OAC5CizE,EAAahrE,UAAUxS,IAAI,iBAE3Bf,KAAKupG,oBAAsB,IAAI,KAAW,CACxC/hE,MAAO,6BACPtvB,KAAM,aACNglD,UAAW,KAEbl9D,KAAKs5F,mBAAqB,IAAI,KAAW,CACvC9xD,MAAO,sCACPtvB,KAAM,YACNglD,UAAW,KAEbl9D,KAAKwpG,cAAgB,IAAI,KAAW,CAClChiE,MAAO,uBACPtvB,KAAM,MACNglD,UAAWmsC,IAGb9qB,EAAa7yE,OAAO1L,KAAKupG,oBAAoBn+F,UAAWpL,KAAKs5F,mBAAmBluF,UAAWpL,KAAKwpG,cAAcp+F,WAE9G,MAAMkI,EAAUjI,SAASC,cAAc,OACvCgI,EAAQC,UAAUxS,IAAI,YACtB,QAAM,CAACmB,QAASoR,EAAS9G,IAAK,oBAE9Bq4C,EAAYxiD,KAAKrC,KAAKupG,oBAAqBvpG,KAAKs5F,mBAAoBt5F,KAAKwpG,eAEzExpG,KAAKw5F,SAAW,IAAI,IAAS,CAC3BxxF,OAAQ,SACR68C,cACAhzC,eAAgB7R,KAAK6R,iBAGvB7R,KAAK2S,QAAQjH,OAAO1L,KAAKw5F,SAASv0C,SAElC7f,EAAQ15B,OAAO1L,KAAKw5F,SAASn0C,WAAWj6C,UAAWmzE,E,CAGrD,CACE,MAAMn5C,EAAU,IAAI,IAAe,CACjCltB,KAAM,uBACN5E,SAAS,IAGLirE,EAAelzE,SAASC,cAAc,OAC5CizE,EAAahrE,UAAUxS,IAAI,iBAE3Bf,KAAKypG,mBAAqB,IAAI,IAAmB,CAC/CjiE,MAAO,6BACPtvB,KAAM,WACN1I,WAAW,EACXqC,eAAgB7R,KAAK6R,eACrB4e,SAAU,KACRzwB,KAAKw5F,SAASx0C,eAGd,MAAM,MAAC34B,GAASrsB,KAAKypG,mBACfC,EAA6B,iCAAhBr9E,aAAK,EAALA,EAAOzqB,MAC1BunG,EAAYO,EAAa1pG,KAAKypG,mBAAmB/8F,WAAQzI,EAAU,EAErE0lG,cAAe,iCACfC,UAAW,6BACXC,YAAa,gCACZ7pG,KAAKiH,UAERs3E,EAAa7yE,OAAO1L,KAAKypG,mBAAmBr+F,WAE5C,MAAMkI,EAAU8xB,EAAQ9xB,SAElB,YAAC61F,EAAajnG,QAASvB,GAAKsoG,IAElC31F,EAAQ5H,OACN/K,GACA,QAAK,iBAWPkkD,EAAYxiD,KAAKrC,KAAKypG,oBACtBrkE,EAAQzyB,QAAQjH,OAAO6yE,GACvBv+E,KAAKswB,WAAW5kB,OAAO05B,EAAQh6B,U,CAGjC,CACE,MAAMg6B,EAAU,IAAI,IAAiB,CACnCp9B,OAAQ,SACR20B,KAAMc,EACN5rB,eAAgB7R,KAAK6R,eACrB43F,mBAAoBzpG,KAAKypG,mBACzBp2E,WAAYrzB,KAAKyvC,iBAAiBxsC,QAGpCjD,KAAKswB,WAAW5kB,OAAO05B,EAAQh6B,U,EAGjC,QAAiBpL,KAAKw5F,SAASv0C,SAAS,KACtCjlD,KAAKw5F,SAASv0C,QAAQvU,UAAW,EAEjC,MAAMrY,EAA2B,GAE3ByxE,EAAiB9pG,KAAKiH,SAASw5B,kBAAkBspE,cACrD/pG,KAAKupG,oBAAoB78F,MACzB1M,KAAKs5F,mBAAmB5sF,MACxB1M,KAAKwpG,cAAc98F,OAErB2rB,EAASh2B,KAAKynG,EAAex7F,MAAK,KAChCtO,KAAK4S,OAAO,IACVpN,IACF4G,QAAQigB,MAAM,uBAAwB7mB,EAAI,KAGzCxF,KAAKw5F,SAAS/0C,cACfpsB,EAASh2B,KAAKrC,KAAKw5F,SAAS/0C,eAAen2C,MAAM0wE,GACxCh/E,KAAKiH,SAASw5B,kBAAkBy3D,mBAAmBlZ,MAI3Dh/E,KAAKypG,mBAAmBjrC,mBACzBnmC,EAASh2B,KAAKrC,KAAKiH,SAASy2B,gBAAgBssE,eAAehqG,KAAKypG,mBAAmB/8F,QAGrF0U,QAAQy2C,KAAKx/B,GAAUlgB,SAAQ,KAC7BnY,KAAKw5F,SAASv0C,QAAQ2C,gBAAgB,WAAW,GACjD,GACD,CAAC/1C,eAAgB7R,KAAK6R,iBAEzB7R,KAAKupG,oBAAoB7qC,iBAAiBjhC,EAAK26C,YAAY,GAC3Dp4E,KAAKs5F,mBAAmB56B,iBAAiBjhC,EAAK46C,WAAW,GACzDr4E,KAAKwpG,cAAc9qC,iBAAiB4qC,EAAS9gC,OAAO,GACpDxoE,KAAKypG,mBAAmB/qC,kBAAiB,OAAwBjhC,IAAO,GAGxEz9B,KAAKw5F,SAASx0C,cAChB,E,8YCxMK,MAAMilD,EAAgC,wBAEtC,MAAMC,UAAwB,IAKnCnqG,cACEmS,MAAM,CACJopF,UAAWjwF,SAAS+Q,eAAe,gBACnC+tF,cAAc,EACd9vD,eAAgB,UARZ,KAAA+vD,uBAAwB,CAUhC,CAEAj/F,UAAUlE,GACRjH,KAAKiH,SAAWA,EAEhB,qBAA4B,gBAAgB,CAACkS,EAAM4uF,KAC9CA,IAAO,YAAqB5uF,IAAS,YACtCnZ,KAAKqqG,eAAc,E,IAIvB,qBAA4B,UAAU,KACpCrqG,KAAKsqG,qBAAqB,GAE9B,CAEOC,uBACL,MAAMr3F,EAAMlT,KAAKwhF,UAAU,KAAmB,GAAO,GAGrD,OAFAtuE,EAAIquE,OAASvhF,KAENkT,CACT,CAEOs3F,sBAAsBt3F,GAC3B,MAAMu3F,EAAczqG,KAAK0qG,eACzB,GAAGD,EAAa,CACd,MAAM1hG,EAAM/I,KAAK2qG,cAAcxwF,QAAQswF,GAEpCzqG,KAAK4qG,WAAWC,YAAcJ,EAAYr/F,WAC3CpL,KAAK4qG,WAAWE,QAAQ53F,aAAG,EAAHA,EAAK9H,WAG5B8H,IACW,IAATnK,IACD/I,KAAK2qG,cAAc5hG,GAAOmK,GAGVu3F,EAAYr/F,UAAUmI,UAAUqB,SAAS,WAEzD1B,EAAI9H,UAAUmI,UAAUxS,IAAI,UAG9B0pG,EAAYr/F,UAAUoe,YAAYtW,EAAI9H,cAE1B,IAATrC,GACD/I,KAAK2qG,cAAcr8E,OAAOvlB,EAAK,GAGjC0hG,EAAYr/F,UAAU5I,S,MAGxBxC,KAAKk1B,cAAcld,QAAQ9E,EAAI9H,WAGjCpL,KAAK0qG,eAAiBx3F,CACxB,CAEO63F,WAAWnjG,EAAYouB,EAAkBg1E,GAC1ChrG,KAAK2qG,cAAc9nG,QACrB7C,KAAKqqG,eAAc,EAAOr0E,GAG5B9jB,MAAM64F,WAAWnjG,EAAIouB,EAASg1E,EAChC,CAEQV,sBACN,MAAM1iF,EAAa5nB,KAAKs7F,UAAU3d,YAAc39E,KAAKs7F,UAAU/kB,uBAAuBoH,YACtFtyE,SAAS2xF,gBAAgBzxF,MAAMssE,YAAY,4BAA6B,GAAKjwD,EAE/E,CAEOyiF,cAAcnqF,EAAkB8V,GACrC,MAAMlU,EAASzW,SAASI,KAAK8H,UAAUqB,SAASq1F,GAChD,IAAIgB,EAaJ,QAZchnG,IAAXic,EACEA,EACG4B,IACFmpF,GAAa,GAEPnpF,IACRmpF,GAAa,GAGfA,GAAa,GAGXA,EAAY,OAAO7pF,QAAQjT,UAE3B2T,GAAW9hB,KAAK2qG,cAAc9nG,QAChC7C,KAAK0qG,eAAet/E,OAGlBprB,KAAKoqG,wBACPpqG,KAAKsqG,sBACLtqG,KAAKoqG,uBAAwB,GAG/B,MAAMc,EAAmB,eAAuBppF,EAAS,UAAgB,aAAkBkU,GAE3F,OADA3qB,SAASI,KAAK8H,UAAU1J,OAAOogG,EAA+B/pF,GACvDgrF,CA4CT,EAGF,MAAMC,EAAkB,IAAIjB,EAC5B,qBAAiCiB,EACjC,S,kgBCtJe,MAAMC,UAA0B,IAOhC54E,O,yCACX,MAAM,OAACxqB,GAAUhI,KACXumE,EAASv+D,EAAOs3B,WACtBt/B,KAAKoL,UAAUmI,UAAUxS,IAAI,sBAAuB,0BACpD,MAAO44F,EAAW0R,SAAiBjqF,QAAQgI,IAAI,CAC7CppB,KAAKiH,SAASy2B,gBAAgBi8D,UAAUpzB,GACxCvmE,KAAKiH,SAAS86E,kBAAkBC,WAAW,gCAEvCqD,GAASsU,EACf35F,KAAKs+E,SAAS+G,EAAQ,kBAAoB,QAE1C,CACE,MAAMjgD,EAAU,IAAI,IAAe,CAACmgC,aAAa,IAC3C1gB,EAA4B,GAE5B05B,EAAelzE,SAASC,cAAc,OAe5C,GAdAizE,EAAahrE,UAAUxS,IAAI,iBAE3Bf,KAAKq5F,eAAiB,IAAI,KAAW,CACnC7xD,MAAO,YACPtvB,KAAM,eACNglD,UAAW,GACXnY,UAAU,IAEZ/kD,KAAKs5F,mBAAqB,IAAI,KAAW,CACvC9xD,MAAO,WACPtvB,KAAM,mBACNglD,UAAW,KAGVqJ,EAAQ,CACT,MAAM9oC,QAAaz9B,KAAKiH,SAASy2B,gBAAgBC,QAAQ4oC,GAEtD8e,GACDrlF,KAAKq5F,eAAe56B,cAAchhC,EAAK26C,YACvCp4E,KAAKs5F,mBAAmB76B,cAAchhC,EAAK46C,aAE3Cr4E,KAAKq5F,eAAe36B,iBAAiBjhC,EAAK26C,YAC1Cp4E,KAAKs5F,mBAAmB56B,iBAAiBjhC,EAAK46C,W,CAelD,GAXAkG,EAAa7yE,OAAO1L,KAAKq5F,eAAejuF,UAAWpL,KAAKs5F,mBAAmBluF,WAC3Ey5C,EAAYxiD,KAAKrC,KAAKq5F,eAAgBr5F,KAAKs5F,oBAE3Ct5F,KAAKw5F,SAAW,IAAI,IAAS,CAC3BxxF,OAAQA,EACR68C,cACAhzC,eAAgB7R,KAAK6R,eACrBuzC,iBAAiB,IAEnBplD,KAAK2S,QAAQjH,OAAO1L,KAAKw5F,SAASv0C,SAE/Bj9C,EAAQ,CACT,MAAM8iB,EAAMzf,SAASC,cAAc,OACnCwf,EAAIvX,UAAUxS,IAAI,eAClB+pB,EAAIpf,OAAO1L,KAAKw5F,SAASr0C,YAEzB,MAAMmmD,EAA6B,IAAI,IAAc,CACnDt3F,KAAM,kBAGRs3F,EAA2Bv6E,MAAMnjB,iBAAiB,UAAW7F,IACvDA,EAAE0B,WAINzJ,KAAKiH,SAAS8G,mBAAmBg4D,eAAe,CAAC/9D,UAAQ,IAG3DhI,KAAK6R,eAAe9Q,IAAI,IAAxBf,CAAmC,mBAAyBy+B,GAAW,EAAD,gCACpE,GAAqB,eAAlBA,EAAO9B,KAAK/sB,EAAoB,OACnC,MAAM5H,GAAS,OAAUy2B,EAAO9B,KAAKA,MACrC,GAAG30B,GAAWA,EAAQ,CACpB,MAAM2J,UAAkB3R,KAAKiH,SAAS++D,wBAAwB8tB,QAAQr1D,EAAO61D,kBAC1E3iF,IAAY25F,EAA2B1lE,UACxC0lE,EAA2B1lE,QAAUj0B,E,CAG3C,MAEA,MAAM45F,EAAiBlgG,SAASC,cAAc,OAC9CigG,EAAeh4F,UAAUxS,IAAI,gBAC7BwqG,EAAe7/F,OAAO,IAAI,IAAU,CAClC1D,OAAQA,IACP9F,SAGH,MAAMspG,EAAqBngG,SAASC,cAAc,OAMlD,GALAkgG,EAAmBj4F,UAAUxS,IAAI,oBACjCyqG,EAAmB9/F,QAAO,QAAK,6BAE/B05B,EAAQzyB,QAAQjH,OAAOof,EAAKygF,EAAgBC,EAAoBjtB,GAE5D8G,EAWG,CACL,MAAM5nD,QAAaz9B,KAAKiH,SAASy2B,gBAAgBC,QAAQ4oC,GAEnDklC,EAAW,IAAI,KAAI,CACvB13F,KAAM,QACNkjD,aAAcx5B,EAAKG,WAAQ35B,EAAY,eACvC8K,MAAO0uB,EAAKG,OAAQ,OAAgBH,EAAKG,YAAU35B,EACnDyhE,gBAAiBjoC,EAAKG,MAAQ,QAAU,4BACxC68C,iBAAkBh9C,EAAKG,WAAQ35B,EAAY,CAAC,IAAI,IAAU,CAAC+D,OAAQA,IAAS9F,WAG9EkjC,EAAQzyB,QAAQjH,OAAO+/F,EAASrgG,U,KAtBvB,CACT,MAAM08D,EAAmB,IAAI,KAAI,CAC/BvgC,cAAe+jE,EACf3wB,sBAAsB,EACtB9oE,eAAgB7R,KAAK6R,iBAGjBF,UAAkB3R,KAAKiH,SAAS++D,wBAAwBC,iBAAiB,CAACj+D,SAAQk+D,aAAa,KACrGolC,EAA2B1lE,QAAUj0B,EAErCyzB,EAAQzyB,QAAQjH,OAAOo8D,EAAiB18D,U,OAe1Cg6B,EAAQzyB,QAAQjH,OAAO6yE,GAGzBv+E,KAAKswB,WAAW5kB,OAAO05B,EAAQh6B,U,CAGjC,GAAIi6E,GA6BG,GACLgmB,EAAQnxC,MAAMwxC,GAAkC,4BAAlBA,EAAY97F,MACzCy7F,EAAQnxC,MAAMwxC,GAAkC,2BAAlBA,EAAY97F,GAAkC87F,EAAYnrB,MAAMxrE,SAASwxD,KACxG,CACA,MAAMnhC,EAAU,IAAI,IAAe,CACjC9xB,QAAS,+CACT4qE,YAAa,OAAO,OAAc,CAACl2E,OAAQhI,KAAKgI,YAE5Cu/B,EAAgBvnC,KAAK2rG,wBAA0B,IAAI,IAAc,CACrE33F,KAAM,0CACN4xB,SAAS,IAELzK,GAAM,QAA2BoM,GAEvCnC,EAAQzyB,QAAQjH,OAAOyvB,EAAI/vB,WAE3BpL,KAAKswB,WAAW5kB,OAAO05B,EAAQh6B,U,MA7CtB,CACT,MAAMg6B,EAAU,IAAI,IAEdwmE,GAAY,OAAO,qCAAsC,CAAC73F,KAAM,SAAUC,KAAM,4BAEtF,QAAiB43F,GAAW,KAC1B,IAAI,IAAU,uBAAwB,CACpC5jG,OAAQA,EACRivD,aAAc,gBACdC,mBAAoB,0BACpBrjD,SAAS,OAAgB,CAAC,CACxBsjD,QAAS,SACT5kC,SAAU,KACR,MAAM1oB,GAAS,OAAiB,CAAC+hG,IAAY,GAE7C5rG,KAAKiH,SAASy2B,gBAAgBmuE,eAAe,CAACtlC,IAASj4D,MAAK,KAC1DtO,KAAK4S,OAAO,IACX,KACD/I,GAAQ,GACR,EAEJimE,UAAU,OAEXvkD,MAAM,GACR,CAAC1Z,eAAgB7R,KAAK6R,iBAEzBuzB,EAAQzyB,QAAQjH,OAAOkgG,GAEvB5rG,KAAKswB,WAAW5kB,OAAO05B,EAAQh6B,U,EAoBjC,QAAiBpL,KAAKw5F,SAASv0C,SAAS,IAAW,EAAD,gC,MAChDjlD,KAAKw5F,SAASv0C,QAAQvU,UAAW,EAEjC1wC,KAAKiH,SAASy2B,gBAAgBouE,WAC5BvlC,EACAvmE,KAAKq5F,eAAe3sF,MACpB1M,KAAKs5F,mBAAmB5sF,aACjB1M,KAAKiH,SAASy2B,gBAAgBC,QAAQ4oC,IAAS3oC,MAC1B,QAA5B,EAAA59B,KAAK2rG,+BAAuB,eAAE/lE,SAC9BztB,SAAQ,KACRnY,KAAKw5F,SAASv0C,QAAQ2C,gBAAgB,YACtC5nD,KAAK4S,OAAO,GAEhB,KAAG,CAACf,eAAgB7R,KAAK6R,gBAC3B,G,kgBCjMF,MACMk6F,GAAY,OADL,OAGE,MAAMC,UAAwB,IAS9Bx5E,KAAKxqB,EAAgBiL,G,yCAChCjT,KAAKisG,WAAa,EAClB,MAAM5mB,GAASpyE,EACTi5F,EAAYj5F,IAAa,KAC/BjT,KAAKoL,UAAUmI,UAAUxS,IAAI,wBAC7Bf,KAAKs+E,SAAS+G,EAAQ,WAAa,yBACnC,MAAMpiD,EAASj7B,EAAOs1B,WAEnBrqB,IACDjT,KAAK2qE,MAAQ3qE,KAAKmsG,eAAgB,aAAWnsG,KAAKiH,SAASy3B,eAAek5C,cAAc5vE,EAAQiL,KAGlG,CACE,MAAMmyB,EAAU,IAAI,IAAe,CACjCltB,KAAMg0F,EAAY,0BAA4B,qBAG1CE,EAAUpsG,KAAKosG,QAAU/gG,SAASC,cAAc,OACtD8gG,EAAQ74F,UAAUxS,IAAI,8BAErBkS,IAAY,QAAiBm5F,GAAS,KAClCpsG,KAAK2qE,MAAM0hC,gBAIdrsG,KAAKisG,YAAcjsG,KAAKisG,WAAa,GAAK,YAC1CjsG,KAAKssG,UAAS,GACb,CAACz6F,eAAgB7R,KAAK6R,iBAEtBoB,GACDm5F,EAAQ74F,UAAUxS,IAAI,iBAGxB,MAAMw9E,EAAelzE,SAASC,cAAc,OAC5CizE,EAAahrE,UAAUxS,IAAI,iBAE3B,MAAMs4F,EAAiBr5F,KAAKq5F,eAAiB,IAAI,KAAW,CAC1D7xD,MAAO,8BACP02B,gBAAgB,EAChBhmD,KAAM,aACNglD,UAAW,GACXnY,UAAU,IAGT/kD,KAAK2qE,OACN0uB,EAAe36B,iBAAiB1+D,KAAK2qE,MAAM57D,OAAO,GAGpD,MAAMi3F,EAAahmG,KAAKgmG,YAAa,OAAW,8BAA+B,CAAChnF,UAAU,IAC1Fhf,KAAK+nD,OAAOr8C,OAAOs6F,IAEnB,QAAiBA,GAAY,KAC3B,MAAMn8F,GAAS,OAAiB,CAACm8F,IAAa,GAC3C/yF,EACDjT,KAAKiH,SAASq5B,gBAAgBisE,eAAe,CAC3CtpE,SACAupE,QAASv5F,EACTlE,MAAOsqF,EAAe3sF,MACtB+/F,YAAazsG,KAAK2qE,MAAM0hC,eAAiB,IACxC/9F,MAAK,KACNtO,KAAK4S,OAAO,IACXqF,OAAOzS,IACR4G,QAAQigB,MAAM,mBAAoB7mB,GAClCqE,GAAQ,IAGV7J,KAAKiH,SAASq5B,gBAAgBosE,iBAAiB,CAC7CzpE,SACA0pE,UAAW,KAAa3sG,KAAKisG,YAC7BQ,YAAazsG,KAAK2qE,MAAM0hC,cACxBt9F,MAAOsqF,EAAe3sF,QACrB4B,MAAM2E,IACPjT,KAAK4S,QACL,kBAA0B,CACxB5K,SACAiL,YACA,IACDgF,OAAOzS,IACR4G,QAAQigB,MAAM,qBAAsB7mB,GACpCqE,GAAQ,G,GAGX,CAACgI,eAAgB7R,KAAK6R,iBAEzB7R,KAAK6R,eAAe9Q,IAAIs4F,EAAetoE,MAAvC/wB,CAA8C,SAAS,K,MACrDA,KAAKi9D,WACLj9D,KAAKssG,QAAkB,QAAV,EAAAtsG,KAAK2qE,aAAK,eAAE0hC,cAAc,IAGzC9tB,EAAa7yE,OAAO2tF,EAAejuF,WAEnCg6B,EAAQzyB,QAAQjH,OAAO0gG,EAAS7tB,GAEhCv+E,KAAKswB,WAAW5kB,OAAO05B,EAAQh6B,U,CAGjC,MAAMitB,EAA2B,GAEjC,GAAI6zE,EAgDG,CACL,MAAM9mE,EAAU,IAAI,IAAe,CAAC9xB,QAAS,sBAEvCi0B,EAAgB,IAAI,IAAc,CAEtC3B,SAAW5lC,KAAK2qE,MAAgCl9D,OAAO+yC,OACvDxsC,KAAM,kBAGRhU,KAAK6R,eAAe9Q,IAAIwmC,EAAcxW,MAAtC/wB,CAA6C,UAAU,KACrD,MAAMuO,EAAUvO,KAAKiH,SAASq5B,gBAAgBisE,eAAe,CAC3DtpE,SACAupE,QAASv5F,EACTutC,QAASjZ,EAAc3B,UAGzBzK,EAAIqgD,mBAAmBjtE,EAAQ,IAGjC,MAAM4sB,EAAM,IAAI,KAAI,CAClBoM,kBAGFnC,EAAQzyB,QAAQjH,OAAOyvB,EAAI/vB,WAE3BpL,KAAKswB,WAAW5kB,OAAO05B,EAAQh6B,U,KAzElB,CACb,MAAMg6B,EAAU,IAAI,IAAe,CAAC,GACpCA,EAAQh6B,UAAUmI,UAAUxS,IAAI,kCAChC,MAAMmoD,EAAW,IAAI,KAAS,CAC5BjiD,SAAUjH,KAAKiH,SACf2oD,cAAc,EACdU,gBAAgB,EAChBS,aAAc,wCACd98C,QAAUiuC,IACRgH,EAASz5B,UAAWyyB,EAAM96C,MAA+C86C,EAAvC,CAACA,WAAOj+C,EAAWmD,WAAOnD,IAC5DjE,KAAKssG,QAAQpqD,EAAM96C,MAAM,IAG7B8hD,EAASuL,iBAAmB,KAAM,CAChCnxC,MAAO,gBACPI,OAAQ,MAGV1jB,KAAKyvC,iBAAiBm9D,WAAU,KAC9B1jD,EAASnlD,SAAS,IAGpBmlD,EAAS99C,UAAUmI,UAAU/Q,OAAO,YAEpCxC,KAAK6sG,aAAexhG,SAASC,cAAc,QAC3CtL,KAAK6sG,aAAat5F,UAAUxS,IAAI,0BAEhC,MAAMwN,EAAU26C,EAAS12B,OAAOlkB,MAAK,IAAW,EAAD,gC,MAC7C,MAAM0gD,EAAW9F,EAAS4J,oBAEpB25C,EAAwB,QAAV,EAAAzsG,KAAK2qE,aAAK,eAAE0hC,cAChCnjD,EAASyH,mBAAmB,CAC1B3B,WACA9sD,QAASlC,KAAK6sG,aACdj8C,OAAO,EACP54C,SAAS,EACT8J,QAAS2qF,IAGRA,GACDvjD,EAASz5B,UAAU,CAACroB,MAAOqlG,EAAavqD,MAAO,IAEnD,MAEA7pB,EAASh2B,KAAKkM,GAEd62B,EAAQzyB,QAAQ6W,YAAY0/B,EAAS99C,WACrCpL,KAAKswB,WAAW5kB,OAAO05B,EAAQh6B,U,CA6BjC,OAAOgW,QAAQgI,IAAIiP,GAAU/pB,MAAK,IACzBtO,KAAK+J,KAEhB,G,CAEQkzD,WACN,IAAIzY,EAAYxkD,KAAKq5F,eAAe76B,mBAChCha,GAAaxkD,KAAKmsG,gBACpB3nD,EAAYxkD,KAAK2qE,MAAM0hC,gBAAkBrsG,KAAKmsG,cAAcE,eAG9DrsG,KAAKgmG,WAAWzyF,UAAU1J,OAAO,QAAS26C,EAC5C,CAEQz6C,I,QAKN,OAJa,QAAV,EAAA/J,KAAK2qE,aAAK,eAAEmiC,cACb9sG,KAAKisG,WAAa,aAAqBjsG,KAAK2qE,MAAMmiC,aAG7C9sG,KAAKssG,QAAkB,QAAV,EAAAtsG,KAAK2qE,aAAK,eAAE0hC,mBAAepoG,GAAW,EAC5D,CAEcqoG,QAAQG,EAAoB3mE,EAAW9lC,KAAKosG,QAASW,G,+CACjE,MAAMh+F,EAAQ/O,KAAKq5F,eAAe3sF,MAE5BsgG,EAAalnE,IAAa9lC,KAAKosG,QAErC,GAAGY,EAAY,CACb,MAAMC,EAAqC,CACzCrlG,GAAc,QAAV,EAAA5H,KAAK2qE,aAAK,eAAE/iE,GAChBklG,WAAY,KAAa9sG,KAAKisG,YAC9Bl9F,OAAO,OAAgBA,GAAO,GAAMiF,MAAQ,IAC5Cq4F,cAAeI,GAGXS,EAAWltG,KAAK2qE,MAYtB,GAXA3qE,KAAK2qE,MAAQsiC,GAGXF,GACCG,GACDA,EAASJ,aAAeG,EAASH,YACjCI,EAASn+F,QAAUk+F,EAASl+F,OAE5B/O,KAAKssG,aAAQroG,EAAWjE,KAAK6sG,eAG5B,OAAUK,EAAUD,KAAcF,EACnC,OAGF/sG,KAAKi9D,U,CAGP,MAAMr8D,QAAW,OAAc,CAC7B+pE,MAAOqiC,EAAahtG,KAAK2qE,MAAQ,OAAD,wBAAK3qE,KAAK2qE,OAAK,CAAE0hC,mBAAepoG,IAChEgvD,gBAAiB84C,EACjB14E,WAAYrzB,KAAKyvC,iBAAiBxsC,QAG9B8xB,EAAO1pB,SAASC,cAAc,OACpCypB,EAAKxhB,UAAUxS,IAAI,mBACnBg0B,EAAKrpB,OAAO9K,GAEZ,MAAMusG,EAAQrnE,EAASlf,iBACvBkf,EAASp6B,OAAOqpB,GAEhB,MAAMq4E,EAAqB,CAACxsG,EAAiBysG,KAC3C,MAKM5sG,EAAYG,EAAGo1B,QALM,CACzB,CAACpR,QAAS,IAAK/H,UAAW,cAC1B,CAAC+H,QAAS,IAAK/H,UAAW,aAGS,CACnChW,SAAU,IACVymG,WAAY,EACZC,OAAQ,cACRppD,KAAM,WACNhjC,UAAWksF,EAAS,SAAW,YAGjC,OAAO,IAAIjsF,SAAejT,IACxB1N,EAAUmN,iBAAiB,UAAU,KACnCO,GAAS,GACR,CAACF,MAAM,GAAM,GAChB,EAGDk/F,GACDC,EAAmBD,GAAO,GAAO7+F,MAAK,IAAM6+F,EAAM3qG,WAGpD4qG,EAAmBr4E,GAAM,E,ymBCjRd,MAAMy4E,UAAuB,IAI7Bh7E,O,yCACXxyB,KAAKoL,UAAUmI,UAAUxS,IAAI,sBAAuB,wBAEpD,MAAMmiC,QAAoBljC,KAAKiH,SAASq5B,gBAAgB4C,YAAYljC,KAAKijC,QAEzEjjC,KAAKs+E,SAASp7C,EAAc,cAAgB,aAE5C,MAAMkC,EAAU,IAAI,IAAe,CACjCltB,KAAMgrB,EAAc,cAAgB,cAGhCoX,GAAS,SACTmzD,EAAa,IAAI,KAAI,CACzBrzB,WAAY,IAAI,IAAW,CACzBjjB,QAASj0B,EAAc,iBAAmB,cAC1ChrB,KAAMoiC,EACN5tC,MAAO,YAETg5D,gBAAiBxiC,EAAc,qBAAuB,oBAElDwqE,EAAY,IAAI,KAAI,CACxBtzB,WAAY,IAAI,IAAW,CACzBjjB,QAASj0B,EAAc,gBAAkB,aACzChrB,KAAMoiC,EACN5tC,MAAO,WAETg5D,gBAAiBxiC,EAAc,oBAAsB,mBAEjD21C,GAAO,QAAkB,CAAC40B,EAAYC,IAAahhG,IACvD,MAAM+H,EAAqB,CAAC,CAACk5F,EAAeviG,WAAY,CAACwiG,IAC5C,WAAVlhG,GAAoB+H,EAAEvD,UAEzBuD,EAAE,GAAG1P,SAASqG,GAAcA,EAAUmI,UAAU/Q,OAAO,UACvDiS,EAAE,GAAG1P,SAASqG,GAAcA,EAAUmI,UAAUxS,IAAI,UAEpD0vB,GAAU,IAGZ,IAAIusB,QAAmBh9C,KAAKiH,SAASq5B,gBAAgBmoC,QAAQzoE,KAAKijC,QAElE,MAAM4qE,EAA2D,CAACC,MAAO,IAKzE9tG,KAAK6R,eAAe9Q,IAAIkd,EAAA,EAAxBje,CAAmC,eAAqBijC,GAAW,EAAD,gCAC7DjjC,KAAKijC,SAAWA,IACjB+Z,QAAah9C,KAAKiH,SAASq5B,gBAAgBmoC,QAAQzoE,KAAKijC,QACxD4qE,EAA2B,MAAE9oG,SAASwtB,GAAaA,MAEvD,MAEA6S,EAAQzyB,QAAQjH,OAAOmtE,GAEvB,MAAM80B,EAAiB,IAAI,IAAe,CAAC,GAGrCI,EAAU,IAAI,KAAI,CACtBh/F,MAAQ/O,KAAK4gC,SAAS+nC,gBAA0D9C,KAChFH,gBAAiBxiC,EAAc,yBAA2B,sBAC1D9T,UAAW,MACT,OAAqBpvB,KAAK4gC,SAAS+nC,gBAA0D9C,OAC7F,EAAA15C,EAAA,IAAM,YAAY,cAAc,GAAM,EAExCta,eAAgB7R,KAAK6R,iBAGjBm8F,GAAY,OAAO,qCAAsC,CAACj6F,KAAM,SAAUC,KAAM,gBAEtF,QAAiBg6F,GAAW,KAC1B,IAAI,IAAU,cAAe,CAC3Bn6F,QAAS,CAAC,CACRsjD,QAAS,eACT5kC,SAAU,KACR,MAAM1oB,GAAS,EAAAi1C,EAAA,GAAiB,CAACkvD,IAAY,GAE7ChuG,KAAKiH,SAASw5B,kBAAkBwtE,kBAAkBjuG,KAAKijC,QAAQ,GAAM30B,MAAMu3D,IACzEh8D,IACAkkG,EAAQh/F,MAAMyQ,UAAYqmD,CAAI,GAG9B,IAGN5O,aAAc,aACdC,mBAAoB,gBACnB3rC,MAAM,GACR,CAAC1Z,eAAgB7R,KAAK6R,iBAEzB87F,EAAeh7F,QAAQjH,OAAOqiG,EAAQ3iG,UAAW4iG,GAEjD,MAAME,EAAgB,IAAI,IAAe,CACvC56F,SAAS,EACTiyD,aAAa,IAGTgZ,EAAelzE,SAASC,cAAc,OAC5CizE,EAAahrE,UAAUxS,IAAI,iBAE3B,MAAMwC,EAAc,QAEdktB,EAAW,KACf,MAAMi3B,EAAW+lD,EAAWrzB,WAAWx0C,SAAY24B,IAAkBh7D,GAClE4qG,EAAe3vC,mBAAqB2vC,EAAep9E,MAAMxd,UAAUqB,SAAS,SAC/Ew5F,EAAS76F,UAAU1J,OAAO,aAAc69C,GAExC,MAAM,MAACr7B,GAAS8hF,EACVzE,EAA6B,iCAAhBr9E,aAAK,EAALA,EAAOzqB,MAC1BunG,EAAYO,EAAayE,EAAeE,gBAAapqG,EAAU,EAG3DkqG,EAAiB,IAAI,IAAmB,CAC5C3mE,MAAO,oBACPtvB,KAAM,oBACN1I,WAAW,EACXqC,eAAgB7R,KAAK6R,eACrB83F,cAAe,iBACfE,YAAa,eACbD,UAAW,aACXn5E,SAAUA,EACVzoB,OAAQhI,KAAKijC,OAAOrQ,UAAS,GAC7B07E,KAAM/qG,GACLvD,KAAKiH,WAEF,YAACkiG,EAAajnG,QAASvB,IAAK,SAElCutG,EAAc56F,QAAQ5H,OACpB/K,GACA,QAAKuiC,EAAc,+BAAiC,+BAGtD,MAAMqrE,EAAmB,IAAI,IAAiB,CAC5CvmG,OAAQhI,KAAKijC,OAAOrQ,UAAS,GAC7B+J,KAAMqgB,EACNnrC,eAAgB7R,KAAK6R,eACrB43F,mBAAoB0E,EACpB96E,WAAYrzB,KAAKyvC,iBAAiBxsC,QAG9B2qG,EAAkBviG,SAASC,cAAc,OAC/CsiG,EAAgBliG,OAAOwiG,EAAc9iG,UAAWmjG,EAAiBnjG,WAEjE,MAAMmzD,EAAgBh7D,IAAe,EAAAirG,EAAA,GAAwBxxD,IAAyB,IAEtFuhC,EAAa7yE,OAAOyiG,EAAe/iG,WACnC8iG,EAAcv7F,QAAQjH,OAAO6yE,GAE7B,MAAM6vB,GAAW,OAAa,CAACr6F,KAAM,QAASsH,UAAW,eACzDrb,KAAK2S,QAAQjH,OAAO0iG,IAEpB,QAAiBA,GAAU,IAAW,EAAD,gCACnC,MAAM7wE,EAAWmwE,EAAUtzB,WAAWx0C,QAAUuoE,EAAeE,WAAa,GAC5E,IAAI9wE,EAAU,CACZ,MAAMyf,QAAah9C,KAAKiH,SAASq5B,gBAAgBmoC,QAAQzoE,KAAKijC,QACxDwrE,GAAc,EAAAD,EAAA,GAAwBxxD,GACzCyxD,UACK,EAAAxuD,EAAA,GAAkB,CACtBiX,mBAAoBh0B,EAAc,gDAAkD,8CACpF8sC,oBAAqB,CAACy+B,GACtBn4F,OAAQ,CACN6gD,QAAS,Q,EAMS,OAAgBi3C,GAC1CpuG,KAAKiH,SAASq5B,gBAAgBouE,YAAY1uG,KAAKijC,QAAQ30B,MAAM4qF,GACvD37D,EAGKv9B,KAAKiH,SAASq5B,gBAAgB0pE,eAAe9Q,EAAW37D,GAFxDv9B,KAAKiH,SAASq5B,gBAAgBquE,mBAAmBzV,KAIzD5qF,MAAK,KAENtO,KAAK4S,OAAO,GAEhB,KAAG,CAACf,eAAgB7R,KAAK6R,kBAExB0sD,IAAkBh7D,IAAe,EAAAokE,EAAA,GAAuB3qB,GAAsBn6C,OAAS6qG,EAAYD,GAAYrzB,WAAWx0C,SAAU,EACrIuoE,EAAezvC,iBAAiBH,GAAe,GAE/Cv+D,KAAKswB,WAAW5kB,OAAO05B,EAAQh6B,UAAWuiG,EAAeviG,UAAWwiG,GAEpE,CACE,MAAMxoE,EAAU,IAAI,IAAe,CACjCltB,KAAM,qBACN5E,QAAS4vB,EAAc,mCAAqC,mCAGxDqE,EAAgB,IAAI,IAAc,CACtCvzB,KAAM,wBACNurC,YAAY,IAGdv/C,KAAK6R,eAAe9Q,IAAIwmC,EAAcxW,MAAtC/wB,CAA6C,UAAU,KACrD,MAAM6J,EAAS09B,EAAcuX,kBAAiB,GAC9C9+C,KAAKiH,SAASq5B,gBAAgBsuE,iBAAiB5uG,KAAKijC,OAAQsE,EAAc3B,SAASt3B,MAAK,KACtFzE,GAAQ,GACR,IAGJ,MAAMglG,EAAe,KACnBtnE,EAAc2X,mBAAoBlC,EAAsBvvC,OAAOqhG,WAAW,EAlKhD,EAACv8E,EAAsB3wB,EAAgB,WACnEisG,EAAoBjsG,GAAMS,KAAKkwB,EAAS,EAoKxCw8E,CAAsBF,GAEtBA,IAEAzpE,EAAQzyB,QAAQjH,OAAO67B,EAAcC,OAErCxnC,KAAKswB,WAAW5kB,OAAO05B,EAAQh6B,U,CAEnC,G,0GCvOa,MAAM4jG,UAA8B,IAKpCx8E,O,qCAIX,IAAIy8E,EAHJjvG,KAAKoL,UAAUmI,UAAUxS,IAAI,sBAAuB,8BACpDf,KAAKs+E,SAAS,oBAId,CACE,MAAMl5C,EAAU,IAAI,IAAe,CACjCltB,KAAM,0BAGF4S,EAAMzf,SAASC,cAAc,OACnCwf,EAAIvX,UAAUxS,IAAI,sBAClBqkC,EAAQzyB,QAAQ4E,aAAauT,EAAKsa,EAAQr2B,OAE1C,MAAMygB,EAAOuI,EAAA,uBAAiC,CAACsnD,KAAK,IACpDv0D,EAAIpf,OAAO8jB,GAEX,MAAM,IAACkN,GAAO3E,EAAA,qBAA+B,CAC3C/vB,OAAQhI,KAAKumE,OAAO3zC,UAAS,GAC7BxnB,UAAWokB,EACXsQ,eAAe,EACfvO,WAAY,eAGdmL,EAAIU,gBAAgB1xB,QAAO,EAAA2zB,EAAA,SAA0Br/B,KAAKiH,SAASy2B,gBAAgBC,QAAQ39B,KAAKumE,UAEhG,MAAM5lE,EAAI,IAAIuuG,EAAgB,CAC5BjsE,OAAQjjC,KAAKijC,OACbpxB,eAAgB7R,KAAK6R,eACrBi0B,SAAUV,EAAQzyB,QAClButB,YAAoC,6BAAvBlgC,KAAKkgC,YAAYtwB,EAAmC5P,KAAKkgC,iBAAcj8B,GACnFjE,KAAKiH,UAERgoG,EAAkB,KAEhB,MAAME,EAASxuG,EAAE+gF,UACS,6BAAvB1hF,KAAKkgC,YAAYtwB,IAAoC,EAAAmnF,EAAA,GAAU/2F,KAAKkgC,YAAYkvE,cAAc3hG,OAAQ0hG,EAAO1hG,SAIhHzN,KAAKiH,SAASq5B,gBAAgB+uE,WAAWrvG,KAAKijC,OAAQjjC,KAAKkgC,YAAaivE,EAAO,EAGjFnvG,KAAKoiF,cAAcx0E,iBAAiB,UAAWqhG,EAAiB,CAAChhG,MAAM,IAEvEjO,KAAKswB,WAAW5kB,OAAO05B,EAAQh6B,U,CAGjC,CACE,MAAMg6B,EAAU,IAAI,IAAe,CAAC,GAEpC,GAA0B,6BAAvBplC,KAAKkgC,YAAYtwB,EAAkC,CACpD,MAAM0/F,GAAqB,OAAO,qCAAsC,CAACv7F,KAAM,SAAUC,KAAM,4BAE/F,QAAiBs7F,GAAoB,KACnC,MAAMzlG,GAAS,EAAAi1C,EAAA,GAAiB,CAACwwD,IAAqB,GACtDtvG,KAAKiH,SAASq5B,gBAAgBivE,oCAAoCvvG,KAAKijC,OAAQjjC,KAAKkgC,aAAa5xB,MAAK,KACpGtO,KAAKoiF,cAAc1wE,oBAAoB,UAAWu9F,GAClDjvG,KAAK4S,OAAO,IACX,KACD/I,GAAQ,GACR,GACD,CAACgI,eAAgB7R,KAAK6R,iBAEzBuzB,EAAQzyB,QAAQjH,OAAO4jG,E,CAGzB,MAAM1D,GAAY,OAAO,qCAAsC,CAAC73F,KAAM,aAAcC,KAAM,2BAE1F,QAAiB43F,GAAW,MACX,EAAA9sD,EAAA,GAAiB,CAAC8sD,IAAY,GAC7C5rG,KAAKiH,SAASq5B,gBAAgBkvE,gBAAgBxvG,KAAKijC,OAAQjjC,KAAKkgC,aAAa5xB,MAAK,KAChFtO,KAAKoiF,cAAc1wE,oBAAoB,UAAWu9F,GAClDjvG,KAAK4S,OAAO,GACZ,GAoBD,CAACf,eAAgB7R,KAAK6R,iBAEzBuzB,EAAQzyB,QAAQjH,OAAOkgG,GAEvB5rG,KAAKswB,WAAW5kB,OAAO05B,EAAQh6B,U,CAEnC,E,0kBC9FK,MAAM8jG,EASXnvG,YAAoB8tB,EAKT5mB,GALS,KAAA4mB,QAAAA,EAKT,KAAA5mB,SAAAA,EACTjH,KAAKmL,WACP,CAEaA,Y,yCACXnL,KAAKunB,EAAI,CACP,CAAC6sE,MAAO,CAAC,iBAAkBpgF,KAAM,uBAAwBy7F,cAAe,0BACxE,CAACrb,MAAO,CAAC,cAAepgF,KAAM,4BAA6By7F,cAAe,+BAC1E,CAACrb,MAAO,CAAC,gBAAiB,aAAcpgF,KAAM,+BAAgCy7F,cAAe,kCAC7F,CAACrb,MAAO,CAAC,cAAepgF,KAAM,4BAA6By7F,cAAe,+BAC1E,CAACrb,MAAO,CAAC,eAAgBpgF,KAAM,6BAA8By7F,cAAe,gCAC5E,CAACrb,MAAO,CAAC,gBAAiBpgF,KAAM,8BAA+By7F,cAAe,iCAC9E,CAACrb,MAAO,CAAC,gBAAiBpgF,KAAM,8BAA+By7F,cAAe,iCAC9E,CAACrb,MAAO,CAAC,eAAgBpgF,KAAM,6BAA8By7F,cAAe,iCAG9EzvG,KAAK0vG,WAAa,CAChB,cAAiB,CAAC,aAAc,gBAAiB,aAAc,gBAGjE,MAAM7hF,EAAU7tB,KAAK6tB,QACfmvB,QAAah9C,KAAKiH,SAASq5B,gBAAgBmoC,QAAQ56C,EAAQoV,QAC3D0sE,EAAsB3yD,EAAK4yD,sBAC3BT,EAASthF,EAAQqS,YCzDZ,SAAwC8c,EAAoBmyD,GACzE,GAAGnyD,EAAK4yD,sBAAuB,CAC7BT,GAAS,EAAAxrE,EAAA,GAAKwrE,GACd,MAAMU,EAAgB7yD,EAAK4yD,sBAAsBniG,OACjD,IAAI,MAAM2W,KAAKyrF,EAEbV,EAAO1hG,OAAO2W,GAAKyrF,EAAczrF,E,CAIrC,OAAO+qF,CACT,CD8CyCW,CAA+B9yD,EAAsBnvB,EAAQqS,YAAYkvE,eAAiBO,EAEzHI,EAA+BliF,EAAQqS,YAAc,2BAA6B,gCACxF,IAAI,MAAM4jC,KAAQ9jE,KAAKunB,EAAG,CACxB,MAAMyoF,EAAWlsC,EAAKswB,MAAM,GACtBj5D,GAAM,QACV2oC,EAAKv8B,cAAgB,IAAI,IAAc,CACrCvzB,KAAM8vD,EAAK9vD,KACX4xB,SAAS,EAAAzC,EAAA,GAAU6Z,EAAMgzD,EAAUb,GACnCtwD,aAAa,EACbhtC,eAAgBgc,EAAQhc,mBAK1Bgc,EAAQqS,aACNyvE,EAAoBliG,OAAOuiG,KAE7B,EAAAroC,EAAA,GAAuB3qB,GAAsB,KAEzC8mB,EAAKswB,MAAMr/E,SAAS,iBACpB+uD,EAAKswB,MAAMr/E,SAAS,mBAIxB+uD,EAAKv8B,cAAcxW,MAAM2f,UAAW,GAYpC,QAAiBozB,EAAKv8B,cAAcC,OAAQz/B,KAC1C,EAAAokB,EAAA,IAAM,YAAY4jF,GAAiB,GAAM,GACxC,CAACl+F,eAAgBgc,EAAQhc,kBAG3B7R,KAAK0vG,WAAWM,IACjBniF,EAAQhc,eAAe9Q,IAAI+iE,EAAKv8B,cAAcxW,MAA9ClD,CAAqD,UAAU,KACzDi2C,EAAKv8B,cAAc3B,SACP5lC,KAAKunB,EAAE6R,QAAQhV,GAAMpkB,KAAK0vG,WAAWM,GAAUj7F,SAASqP,EAAEgwE,MAAM,MACxErvF,SAAS++D,IACbA,EAAKv8B,cAAc3B,SAAU,CAAK,G,IAM1C/X,EAAQiY,SAASp6B,OAAOyvB,EAAI/vB,U,CAEhC,G,CAEOs2E,UACL,MAAMytB,EAA2B,CAC/Bv/F,EAAG,mBACHqgG,WAAY,WACZxiG,OAAQ,CAAC,GAGX,IAAI,MAAMq2D,KAAQ9jE,KAAKunB,GACLu8C,EAAKv8B,cAAc3B,SAEjCk+B,EAAKswB,MAAMrvF,SAASqiG,IAElB+H,EAAO1hG,OAAO25F,IAAQ,CAAI,IAKhC,OAAO+H,CACT,EAGa,MAAMe,UAA+B,IAGrC19E,O,yCAIX,IAAI29E,EAHJnwG,KAAKoL,UAAUmI,UAAUxS,IAAI,sBAAuB,+BACpDf,KAAKs+E,SAAS,sBAGd,CACE,MAAMl5C,EAAU,IAAI,IAAe,CACjCltB,KAAM,6BAGRi4F,EAAkB,IAAIjB,EAAgB,CACpCjsE,OAAQjjC,KAAKijC,OACbpxB,eAAgB7R,KAAK6R,eACrBi0B,SAAUV,EAAQzyB,SACjB3S,KAAKiH,UAERjH,KAAKoiF,cAAcx0E,iBAAiB,WAAW,KAC7C5N,KAAKiH,SAASq5B,gBAAgB8vE,4BAA4BpwG,KAAKijC,OAAQktE,EAAgBzuB,UAAU,GAChG,CAACzzE,MAAM,IAEVjO,KAAKswB,WAAW5kB,OAAO05B,EAAQh6B,U,CAGjC,CACE,MAAMg6B,EAAU,IAAI,IAAe,CACjCltB,KAAM,sBAGFm4F,EAAkB,IAAI,KAAI,CAC9Bp5C,aAAc,sBACdyO,gBAAiB,UACjB3xD,KAAM,UACNqb,UAAW,KACT,IAAI,IAAc,CAChBuhD,UAAW,CAAC,uBACZvB,SAAWpnE,IACTtF,YAAW,KACT4tG,EAAgBtoG,EAAO,GACtB,EAAE,EAEPzE,YAAa,oCACbyE,QAAShI,KAAKijC,QACd,EAEJpxB,eAAgB7R,KAAK6R,iBAGjBy+F,EAAwBtoG,GAAmB,kCAC/C,IAAIk4B,EACJ,IACEA,QAAoBlgC,KAAKiH,SAASw5B,kBAAkB8vE,sBAAsBvwG,KAAKijC,OAAQj7B,E,CACvF,MAAMxC,GAEN,YADA,EAAA2mB,EAAA,IAAM,gC,CAIR,MAAMjZ,EAAMlT,KAAKuhF,OAAOC,UAAUwtB,GAClC97F,EAAIgtB,YAAcA,EAClBhtB,EAAI+vB,OAASjjC,KAAKijC,OAClB/vB,EAAIqzD,OAASv+D,EACbkL,EAAIkY,MACN,IAEAga,EAAQzyB,QAAQjH,OAAO2kG,EAAgBjlG,WAWvC,MAAM22B,EAAIqD,EAAQ24C,yBAClBh8C,EAAExuB,UAAUxS,IAAI,sBAEhB,MAAMyuB,EAAOuI,EAAA,uBAAiC,CAACsnD,KAAK,IACpDt9C,EAAEr2B,OAAO8jB,IAET,QAAiBA,GAAOznB,IACtB,MAAM1H,GAAS,EAAA2/B,EAAA,GAAUj4B,EAAE1H,OAAQ,EAAA4/B,yBACnC,IAAI5/B,EAAQ,OAEZ,MAAM2H,EAAS3H,EAAOgmB,QAAQre,OAAO4qB,WACrC09E,EAAgBtoG,EAAO,GACtB,CAAC6J,eAAgB7R,KAAK6R,iBAEzB,MAAM2+F,EAAc,CAAM9zE,EAAgBwD,IAA6D,kCACrG,MAAMuwE,EAAevwE,EAAYkvE,cAC3BO,SAA8B3vG,KAAKiH,SAASq5B,gBAAgBmoC,QAAQzoE,KAAKijC,SAA0B2sE,sBAGnGc,EAA0B,GAChCP,EAAgB5oF,EAAExiB,SAAS++D,IACzB,MAAMksC,EAAWlsC,EAAKswB,MAAM,GAEzBqc,EAAahjG,OAAOuiG,KAAcL,EAAoBliG,OAAOuiG,IAC9DU,EAASruG,KAAKyhE,EAAK2rC,c,IAOvB,MAAM7uG,EAAK87B,EAAIU,gBAEZszE,EAAS7tG,QACVjC,EAAGs+B,oBAAmB,QAAKwxE,EAAS51F,KAAKqnB,IAAM,QAAKA,MAAK,IAK3DvhC,EAAG2S,UAAU1J,OAAO,QAAS6mG,EAAS7tG,OACxC,IAEM9B,EAAM,CAACm/B,EAA0Dx0B,KACrE,MAAM,IAACgxB,GAAO3E,EAAA,qBAA+B,CAC3C/vB,QAAQ,EAAA2oG,EAAA,GAAUzwE,EAAYvD,MAC9BvxB,UAAWokB,EACXsQ,eAAe,EACfvO,WAAY,aACZ7lB,WAGF8kG,EAAY9zE,EAAKwD,EAAY,EAgCzB0wE,EAAY,MAChB,EAAArnF,EAAA,GAAe8mF,EAAgBh1E,UAAU,QAAKw1E,EAAkB,8BAAgC,2BAA4B,CAACA,IAAkB,EAGjJ,IACIC,EADAD,EAAkB,EAEtB,MAAME,EAAY,KAEhBD,EAAS,IAAI,IAAiB,CAC5BxgF,WAAYtwB,KAAKswB,WACjB0gF,WAAY,IACHhxG,KAAKiH,SAASw5B,kBAAkBC,uBAAuB1gC,KAAKijC,OAAQ,CAACrzB,EAAG,4BAA6Bu3B,EAAG,IAJhG,GAIiH3X,EAAKE,mBAAmBphB,MAAM6iB,IAC5J,IAAI,MAAM+O,KAAe/O,EAAI2L,aAC3B/7B,EAAIm/B,GAA4D,GAMlE,OAHA2wE,EAAkB1/E,EAAIC,MACtBw/E,IAEOz/E,EAAI2L,aAAaj6B,OAZX,IAYkCsuB,EAAIC,QAAU5B,EAAKE,iBAAiB,MAKlFohF,EAAOluG,QAGhB5C,KAAKswB,WAAW5kB,OAAO05B,EAAQh6B,kBAEtBpL,KAAKiH,SAASq5B,gBAAgBC,UAAUvgC,KAAKijC,eAC9C8tE,KAENH,IAEA5wG,KAAK6R,eAAe9Q,IAAIkd,EAAA,EAAxBje,CAAmC,kBAAkB,EAAEixG,cAAaC,gBAC/DlxG,KAAKijC,SAAWguE,IACjBjxG,KAAKijC,OAASiuE,EACdH,I,KAKV,G,CAEA5sB,qBACEnkF,KAAKswB,WAAWwG,UAClB,E,sUE9Ua,MAAMq6E,UAA4B,IAGlC3+E,O,+CACXxyB,KAAKs+E,SAAS,aAEd,MAAM8N,QAA2BpsF,KAAKiH,SAAS+kF,oBAAoBolB,8BAC7DxwE,QAAiB5gC,KAAKiH,SAASw5B,kBAAkBE,YAAY3gC,KAAKijC,QAClEC,QAAoBljC,KAAKiH,SAASq5B,gBAAgB4C,YAAYljC,KAAKijC,QAEzE,IAAIouE,EAA6C,QAA5B,EAAAzwE,EAAS0wE,2BAAmB,QAAI,CAAC1hG,EAAG,qBACrD2hG,EAAgBF,EAChBvkD,EAAY,IAAI1rD,IAAyB,sBAArBiwG,EAAezhG,EAA4ByhG,EAAeG,UAAU12F,KAAKuxE,GAAcA,EAAoCK,WAAY,IAE/J,MAAM+kB,EAA6B3kD,GAAyCA,EAAUhyC,KAAK4xE,IAAa,CAAE98E,EAAG,gBAAiB88E,eAExHglB,EAAwB,IACzBxuE,EACM,6BAGkB,qBAApBquE,EAAc3hG,EAA2B,yBAAgD,sBAApB2hG,EAAc3hG,EAA4B,uBAAyB,0BAG3I+hG,EAAgB,IAAI,IAAe,CACvCz5F,KAAMgrB,OAAcj/B,EAAY,qBAChCqP,QAASo+F,MAGLE,EAAmB,IAAI,IAAe,CAC1C15F,KAAM,2BAGF25F,EAAkC,K,MACtC,MAAMvtF,EAAiG,QAAlE,EAAAitF,EAAkDC,iBAAgB,QAAI,GAC3G1kD,EAAY,IAAI1rD,IAAIkjB,EAAExJ,KAAI,EAAE4xE,cAAcA,KAC1ColB,EAAyB/sG,SAAQ,CAACwiC,EAAemlD,KAC/CnlD,EAAc2X,iBAAiB4N,EAAUzpD,IAAIqpF,GAAU,GACvD,EAGJ,IAAIqlB,EACJ,GAAG7uE,EAAa,CACd6uE,EAAsB,IAAI,IAAc,CAACloG,QAAQ,EAAM+7B,QAA8B,sBAArByrE,EAAezhG,IAC/E,MAAMoiG,EAAY,IAAI,KAAI,CACxBzqE,cAAewqE,EACf96C,aAAc,kBACdplD,eAAgB7R,KAAK6R,iBAGvB8/F,EAAch/F,QAAQjH,OAAOsmG,EAAU5mG,WAEvCpL,KAAK6R,eAAe9Q,IAAIgxG,EAAoBhhF,MAA5C/wB,CAAmD,UAAU,KAC3D,IAAIiyG,GAAO,EACPF,EAAoBnsE,QAEdssE,EAAeC,OAAO5qE,IAAmBA,EAAc3B,UAC/D2rE,EAAgB,CAAC3hG,EAAG,oBAAqB4hG,UAAWC,EAA0BrlB,EAAmBtxE,KAAI,EAAEuxE,cAAcA,MACzF,sBAApBklB,EAAc3hG,EACtB2hG,EAAgB,CAAC3hG,EAAG,oBAAqB4hG,UAAWC,EAA0Bv4F,MAAMC,KAAK2zC,KAEzFmlD,GAAO,EANPV,EAAgB,CAAC3hG,EAAG,qBASnBqiG,IACDJ,IACAO,I,QAGC,CACL,MAAM39F,EAAyC,CAC7C,CAAC,mBAAoB,gBACrB,CAAC,oBAAqB,iBACtB,CAAC,oBAAqB,gBAGlBgc,EAAW,KACfmhF,EAAiBxmG,UAAUmI,UAAU1J,OAAO,OAA4B,sBAApB0nG,EAAc3hG,EAA0B,EAG9F,IAAIlD,EAAQ2kG,EAAezhG,EAC3B,MAAMipE,GAAO,QAAoBpkE,EAAEqG,KAAI,EAAEpO,EAAO0f,MACvC,CACLA,cACA1f,QACAk5B,QAASyrE,EAAezhG,IAAMlD,OAE7Bg2C,IACHh2C,EAAQg2C,EAGN6uD,EADW,qBAAV7kG,EACe,CACdkD,EAAGlD,EACHe,OAAQ,CACN4kG,cAAc,IAGA,sBAAV3lG,EACQ,CACdkD,EAAGlD,GAGW,CACdkD,EAAGlD,EACH8kG,UAAWC,EAA0B,CAAC,KAAM,SAIhD,EAAAloF,EAAA,GAAeooF,EAAcr+F,SAAS,QAAKo+F,MAC3CG,IACAO,IACA3hF,GAAU,IAGZkhF,EAAch/F,QAAQjH,OAAOmtE,GAC7BpoD,G,CAGF,MAAMqhF,EAAuD,IAAIvwG,IAC3D2wG,EAAiB9lB,EAAmBtxE,KAAKyxE,IAC7C,MAAMG,EAAWH,EAAkBF,SAC7B9kD,EAAgB,IAAI,IAAc,CACtC19B,QAAQ,EACR+7B,QAASknB,EAAUzpD,IAAIqpF,KAGzBolB,EAAyBluG,IAAI8oF,EAAUnlD,GAEvCvnC,KAAK6R,eAAe9Q,IAAIwmC,EAAcxW,MAAtC/wB,CAA6C,UAAU,KAClDunC,EAAc3B,SACfknB,EAAU/rD,IAAI2rF,GAEXqlB,IAAwBA,EAAoBnsE,UAC7CmsE,EAAoBnsE,SAAU,KAGhCknB,EAAU7rD,OAAOyrF,IAEdqlB,aAAmB,EAAnBA,EAAqBnsE,WAAYknB,EAAUjlD,OAC5CkqG,EAAoBnsE,SAAU,IAIlCwsE,GAAwB,IAG1B,MAAMj3E,EAAM,IAAI,KAAI,CAClBoM,gBACAx4B,MAAOw9E,EAAkBx9E,MACzBusB,aAAa,EACbzpB,eAAgB7R,KAAK6R,iBAWvB,OARA,OAAiB,CACfspB,MACAx5B,IAAK4qF,EAAkBC,YACvB3kF,KAAM,UAGR+pG,EAAiBj/F,QAAQjH,OAAOyvB,EAAI/vB,WAE7Bm8B,CAAa,IAGhB+qE,EAAgB,IAAW,kCAC/BF,EAAuB3+F,eAMA,sBAApB89F,EAAc3hG,IACf2hG,EAAcC,UAAYC,EAA0Bv4F,MAAMC,KAAK2zC,KAQjE9sD,KAAKiH,SAASq5B,gBAAgBiyE,0BAA0BvyG,KAAKijC,OAAQsuE,GACrEF,EAAiBE,CACnB,IAEMa,GAAyB,EAAA34F,EAAA,GAAS64F,EAAe,KAAM,GAAO,GAEpEtyG,KAAKoiF,cAAcx0E,iBAAiB,WAAW,KAC1CwkG,EAAuBI,eACxBF,G,GAED,CAACrkG,MAAM,IAEVjO,KAAKswB,WAAW5kB,OAAOimG,EAAcvmG,UAAWwmG,EAAiBxmG,U,+SCrLtD,MAAMqnG,UAAuB,IAM1BC,Q,yCAEd1yG,KAAK6R,eAAeC,YACpB9R,KAAKswB,WAAWllB,UAAU8zB,kBAE1Bl/B,KAAKoL,UAAUmI,UAAUxS,IAAI,sBAAuB,wBACpDf,KAAKs+E,SAAS,QAEd,IACE19C,EACAoc,EACA9Z,EACA3C,EACAoyE,EACAC,EACAC,EACA5/B,SACQ7xD,QAAQgI,IAAI,CACpBppB,KAAKiH,SAASw5B,kBAAkBE,YAAY3gC,KAAKijC,QAAQ,GACzDjjC,KAAKiH,SAASq5B,gBAAgBmoC,QAAQzoE,KAAKijC,QAC3CjjC,KAAKiH,SAASq5B,gBAAgB4C,YAAYljC,KAAKijC,QAC/CjjC,KAAKiH,SAASq5B,gBAAgBC,UAAUvgC,KAAKijC,QAC7CjjC,KAAKiH,SAASq5B,gBAAgB6C,UAAUnjC,KAAKijC,OAAQ,eACrDjjC,KAAKiH,SAASq5B,gBAAgB6C,UAAUnjC,KAAKijC,OAAQ,sBACrDjjC,KAAKiH,SAASq5B,gBAAgB6C,UAAUnjC,KAAKijC,OAAQ,iBACrDjjC,KAAKiH,SAASqwD,WAAW0xB,iBAG3B,MAAM6kB,EAAoE,CAAC10E,KAAM,GAAI20E,MAAO,IACtFiB,EAAwB,CAACx8E,EAAsB3wB,EAAyB,WAC5EisG,EAAoBjsG,GAAMS,KAAKkwB,EAAS,EAG1CvyB,KAAK6R,eAAe9Q,IAAIkd,EAAA,EAAxBje,CAAmC,eAAqBijC,GAAW,kCAC9DjjC,KAAKijC,SAAWA,IACjB+Z,QAAah9C,KAAKiH,SAASq5B,gBAAgBmoC,QAAQzoE,KAAKijC,QACxD4qE,EAA2B,MAAE9oG,SAASwtB,GAAaA,MAEvD,MAEAvyB,KAAK6R,eAAe9Q,IAAIkd,EAAA,EAAxBje,CAAmC,oBAA0BijC,GAAW,kCACnEjjC,KAAKijC,SAAWA,IACjBrC,SAAiB5gC,KAAKiH,SAASw5B,kBAAkBqyE,kBAAkB7vE,KAAWrC,EAC9EitE,EAA0B,KAAE9oG,SAASwtB,GAAaA,MAEtD,MAEA,MAAMvqB,EAAShI,KAAKijC,OAAOrQ,UAAS,GAEpC,CACE,MAAMwS,EAAU,IAAI,IAAe,CAACmgC,aAAa,EAAMjyD,SAAS,IAC1DuxC,EAA4B,GAE5B05B,EAAelzE,SAASC,cAAc,OAgC5C,GA/BAizE,EAAahrE,UAAUxS,IAAI,iBAE3Bf,KAAK+yG,mBAAqB,IAAI,KAAW,CACvCvrE,MAAOtE,EAAc,mBAAqB,yBAC1ChrB,KAAM,YACNglD,UAAW,IACXnY,UAAU,IAEZ/kD,KAAKgzG,sBAAwB,IAAI,KAAW,CAC1CxrE,MAAO,yBACPtvB,KAAM,mBACNglD,UAAW,MAGbl9D,KAAK+yG,mBAAmBr0C,iBAAiB1hB,EAAKjuC,OAC9C/O,KAAKgzG,sBAAsBt0C,iBAAiB99B,EAAS4nC,OAErD+V,EAAa7yE,OAAO1L,KAAK+yG,mBAAmB3nG,UAAWpL,KAAKgzG,sBAAsB5nG,WAElFy5C,EAAYxiD,KAAKrC,KAAK+yG,mBAAoB/yG,KAAKgzG,uBAE/ChzG,KAAKw5F,SAAW,IAAI,IAAS,CAC3BxxF,SACA68C,cACAhzC,eAAgB7R,KAAK6R,eACrB0zC,aAAc,CAACniB,QAAU4Z,EAAsBvvC,OAAOsqE,SAExD/3E,KAAK2S,QAAQjH,OAAO1L,KAAKw5F,SAASv0C,SAElC7f,EAAQzyB,QAAQjH,OAAO1L,KAAKw5F,SAASn0C,WAAWj6C,UAAWmzE,GAExDo0B,EAAe,CAChB,MAAMM,EAAc,IAAI,KAAI,CAC1Bh8C,aAAc/zB,EAAc,cAAgB,YAC5C9T,UAAW,KACT,MAAMlc,EAAMlT,KAAKuhF,OAAOC,UAAUgsB,GAClCt6F,EAAI+vB,OAASjjC,KAAKijC,OAClB/vB,EAAI0tB,SAAWA,EACf1tB,EAAIkY,MAAM,EAEZrX,KAAM,OACNlC,eAAgB7R,KAAK6R,iBAGjBqhG,EAAsB,KAC1B,IAAI1mG,EACJ,MAAM+wB,GAAW,EAAAoqC,EAAA,GAAuB3qB,GAAsB,GAE5DxwC,EADC02B,EACK3F,EAAW,aAAe,cAE1BA,EAAW,kBAAoB,mBAGvC01E,EAAY53E,SAAS6D,iBAAgB,QAAK1yB,GAAK,EAGjD0mG,IACAnE,EAAsBmE,GACtB9tE,EAAQzyB,QAAQjH,OAAOunG,EAAY7nG,U,CAGrC,GAAGunG,GAAiBC,EAAsB,CACxC,MAAMriB,EAAe,IAAI,KAAI,CAC3Bt5B,aAAc,YACdljD,KAAM,YACNqb,UAAW,KACT,MAAMlc,EAAMlT,KAAKuhF,OAAOC,UAAU2vB,GAClCj+F,EAAI+vB,OAASjjC,KAAKijC,OAClB/vB,EAAIkY,MAAM,EAEZvZ,eAAgB7R,KAAK6R,iBAIjBshG,SAD2BnzG,KAAKiH,SAAS+kF,oBAAoBE,yBACf9yD,QAAQmzD,IAAuBA,EAAkB9+E,OAAO6+E,WAAUzpF,OAChHuwG,EAAqB,K,MACzB,MAAMC,EAAqD,QAA5B,EAAAzyE,EAAS0wE,2BAAmB,QAAI,CAAC1hG,EAAG,qBACnE,GAAgC,sBAA7ByjG,EAAuBzjG,EAA2B,CACnD,MAAM/M,EAASwwG,EAAuB7B,UAAU3uG,OAC7CA,IAAWswG,GACZ,EAAA5pF,EAAA,GAAegnE,EAAal1D,UAAU,QAAK,iBAE3Ck1D,EAAal1D,SAASziB,YAAc/V,EAAS,IAAMswG,C,MAGrD,EAAA5pF,EAAA,GAAegnE,EAAal1D,UAAU,QAAkC,qBAA7Bg4E,EAAuBzjG,EAA2B,eAAiB,qB,EAIlHwjG,IACArE,EAAsBqE,EAAoB,QAC1ChuE,EAAQzyB,QAAQjH,OAAO6kF,EAAanlF,U,CAGtC,GAAGwnG,IAAyB1vE,EAAa,CACvC,MAAMkxD,EAAQ,CACZ,gBACA,aACA,gBACA,aACA,cACA,eACA,eACA,eAGIkf,EAAiB,IAAI,KAAI,CAC7Br8C,aAAc,qBACd7nC,UAAW,KACT,MAAMlc,EAAMlT,KAAKuhF,OAAOC,UAAU0uB,GAClCh9F,EAAI+vB,OAASjjC,KAAKijC,OAClB/vB,EAAIkY,MAAM,EAEZrX,KAAM,cACNlC,eAAgB7R,KAAK6R,iBAGjB0hG,EAAuB,KAC3BD,EAAej4E,SAASziB,YAAcw7E,EAAMn8C,QAAO,CAACC,EAAKrT,IAAMqT,KAAO,EAAA/U,EAAA,GAAU6Z,EAAMnY,EAAImY,EAAmB4yD,wBAAwB,GAAK,IAAMxb,EAAMvxF,MAAM,EAG9J0wG,IACAxE,EAAsBwE,GACtBnuE,EAAQzyB,QAAQjH,OAAO4nG,EAAeloG,U,CAGxC,GAAGynG,IAAoB71D,EAAKngB,oBAAsBo2C,EAAUugC,gCAAmCx2D,EAAsBvvC,OAAOsqE,SAAW70C,EAAa,CAClJ,MAAMuwE,EAAY,IAAI,KAAI,CACxBlsE,cAAe,IAAI,IAAc,CAAC19B,QAAQ,IAC1CotD,aAAc,SACd7nC,UAAW,OACXrb,KAAM,SACNlC,eAAgB7R,KAAK6R,iBAGjB6hG,EAAY,KAChB,MAAMtwE,IAAa4Z,EAAsBvvC,OAAOsqE,MAChD/3E,KAAKw5F,SAASr0C,WAAWlsC,cAAc1F,UAAU1J,OAAO,WAAYu5B,GACpEqwE,EAAUlsE,cAAc2X,iBAAiB9b,EAAQ,EAGnDpjC,KAAK6R,eAAe9Q,IAAI0yG,EAAUlsE,cAAcxW,MAAhD/wB,CAAuD,UAAW+H,IAChE,IAAIA,EAAE0B,UACJ,OAGF,MAAM8E,EAAUvO,KAAKiH,SAASq5B,gBAAgBqzE,YAAY3zG,KAAKijC,OAAQwwE,EAAUlsE,cAAc3B,SAC/F6tE,EAAUj4B,mBAAmBjtE,EAAQ,IAGvCmlG,IACA3E,EAAsB2E,GAEtBtuE,EAAQ9xB,QAAQ4rB,iBAAgB,QAAK,2BACrCkG,EAAQzyB,QAAQjH,OAAO+nG,EAAUroG,U,CA+DnC,GA5DAg6B,EAAQ9xB,QAAQC,UAAU1J,OAAO,QAASu7B,EAAQ9xB,QAAQoc,mBAW1D1vB,KAAKswB,WAAW5kB,OAAO05B,EAAQh6B,YAE/B,QAAiBpL,KAAKw5F,SAASv0C,SAAS,KACtCjlD,KAAKw5F,SAASv0C,QAAQvU,UAAW,EAEjC,MAAMrY,EAA2B,GAE3BzwB,EAAK5H,KAAKijC,OACbjjC,KAAK+yG,mBAAmBv0C,mBACzBnmC,EAASh2B,KAAKrC,KAAKiH,SAASq5B,gBAAgBszE,UAAUhsG,EAAI5H,KAAK+yG,mBAAmBrmG,QAGjF1M,KAAKgzG,sBAAsBx0C,mBAC5BnmC,EAASh2B,KAAKrC,KAAKiH,SAASq5B,gBAAgBuzE,UAAUjsG,EAAI5H,KAAKgzG,sBAAsBtmG,QAGpF1M,KAAKw5F,SAAS/0C,cACfpsB,EAASh2B,KAAKrC,KAAKw5F,SAAS/0C,eAAen2C,MAAM0wE,GACxCh/E,KAAKiH,SAASq5B,gBAAgB2+C,UAAUr3E,EAAIo3E,MAIvD59D,QAAQy2C,KAAKx/B,GAAUlgB,SAAQ,KAC7BnY,KAAKw5F,SAASv0C,QAAQ2C,gBAAgB,YACtC5nD,KAAK4S,OAAO,GACZ,GACD,CAACf,eAAgB7R,KAAK6R,iBAuBtBqxB,UAAqBljC,KAAKiH,SAASq5B,gBAAgB6C,UAAUnjC,KAAKijC,OAAQ,gBAAgB,CAC3F,MAAM6wE,EAA4B,IAAI,IAAc,CAClD9/F,KAAM,sBACN4xB,UAAYoX,EAAsBvvC,OAAOsmG,aAG3C/zG,KAAK6R,eAAe9Q,IAAI+yG,EAA0B/iF,MAAlD/wB,CAAyD,UAAU,KACjE,MAAM6J,EAASiqG,EAA0Bh1D,kBAAiB,GAC1D9+C,KAAKiH,SAASq5B,gBAAgB0zE,iBAAiBh0G,KAAKijC,OAAQ6wE,EAA0BluE,SAASt3B,MAAK,KAClGzE,GAAQ,GACR,IAGJklG,GAAsB,KACpB+E,EAA0B50D,mBAAoBlC,EAAsBvvC,OAAOsmG,WAAW,IAGxF3uE,EAAQzyB,QAAQjH,QAAO,QAA2BooG,GAA2B1oG,U,EAIjF,IAAI83B,EAAa,CACf,MAAMkC,EAAU,IAAI,IAAe,CAAC,GAcpC,IAAIlC,GAAeyvE,EAAe,CAChC,MAAMsB,EAA+B,IAAI,IAAc,CACrDjgG,KAAM,gBAGRhU,KAAK6R,eAAe9Q,IAAIkzG,EAA6BljF,MAArD/wB,CAA4D,UAAU,KACpE,MAAM6J,EAASoqG,EAA6Bn1D,kBAAiB,GAC7D9+C,KAAKiH,SAASq5B,gBAAgB4zE,uBAAuBl0G,KAAKijC,QAASgxE,EAA6BruE,SAASt3B,MAAK,KAC5GzE,GAAQ,GACR,IAIJ,MAAMglG,EAAe,KACnBoF,EAA6B/0D,iBAAiB3e,IAAeK,EAAkCnzB,OAAO0mG,kBAAkB,EAG1HtF,IACAE,EAAsBF,GAEtBzpE,EAAQzyB,QAAQjH,QAAO,QAA2BuoG,GAA8B7oG,U,CAG/Eg6B,EAAQzyB,QAAQ+c,mBACjB1vB,KAAKswB,WAAW5kB,OAAO05B,EAAQh6B,U,CAInC,SAASpL,KAAKiH,SAASq5B,gBAAgB6C,UAAUnjC,KAAKijC,OAAQ,eAAgB,CAC5E,MAAMmC,EAAU,IAAI,IAAe,CAAC,GAE9BwmE,GAAY,OAAO,qCAAsC,CAAC73F,KAAM,SAAUC,KAAMkvB,EAAc,yBAA2B,yBAE/H,QAAiB0oE,GAAW,KAC1B,IAAI,IAAkB5jG,OAAwB/D,GAAYsK,IACxD,MAAM1E,GAAS,EAAAi1C,EAAA,GAAiB,CAAC8sD,IAAY,GAC7Cr9F,EAAQD,MAAK,KACXtO,KAAK4S,OAAO,IACX,KACD/I,GAAQ,GACR,GACF,GACD,CAACgI,eAAgB7R,KAAK6R,iBAEzBuzB,EAAQzyB,QAAQjH,OAAOkgG,GAEvB5rG,KAAKswB,WAAW5kB,OAAO05B,EAAQh6B,U,CAG7Bm1B,GAEFvgC,KAAK6R,eAAe9Q,IAAIkd,EAAA,EAAxBje,CAAmC,kBAAkB,EAAEixG,cAAaC,gBAC/DlpG,IAAWipG,IACZjxG,KAAKijC,OAASiuE,EAAU5zE,WACxBt9B,KAAK0yG,Q,GAIb,G,CAEOlgF,OACL,OAAOxyB,KAAK0yG,OACd,E,sXCnXF,MAAM0B,GAIF,CAAC,EAGU,MAAMC,WAA0B,IAetC7hF,OAGLxyB,KAAKoL,UAAUmI,UAAUxS,IAAI,yBAA0B,qBAGvD,MAAMuzG,GAAc,OAAO,gCAAiC,CAACt1F,UAAU,IACvEhf,KAAKu0G,SAAS/qF,YAAY8qF,GAC1Bt0G,KAAKu0G,SAAWD,EAEhB,MAAME,EAAoBnpG,SAASC,cAAc,OACjDkpG,EAAkBjhG,UAAUxS,IAAI,uBAChCuzG,EAAY5oG,OAAO8oG,GAEhBx0G,KAAKwjF,SACNgxB,EAAkBjhG,UAAUxS,IAAI,cAGlC,MAAM0zG,EAAsBppG,SAASC,cAAc,OACnDmpG,EAAoBp5F,UAAY,wBAEhC,MAAMq5F,EAAsBrpG,SAASC,cAAc,OACnDopG,EAAoBnhG,UAAUxS,IAAI,mBAElCf,KAAK20G,UAAY,IAAI,iBACrB30G,KAAK+O,MAAMrD,OAAO1L,KAAK20G,UAAUzyG,SACjClC,KAAK40G,SAAU,QAAW,QAG1BF,EAAoBhpG,OAAO1L,KAAK+O,MAAO/O,KAAK40G,SAE5C,MAAMC,EAAqBxpG,SAASC,cAAc,OAClDupG,EAAmBthG,UAAUxS,IAAI,mBAEjC,MAAM+zG,EAA2B90G,KAAK+O,MAAMoa,YAC5C2rF,EAAYppG,QAAO,QAAK,yBAExBmpG,EAAmBnpG,OAAOopG,GAE1BL,EAAoB/oG,OAAOgpG,EAAqBG,GAEhD70G,KAAK+nD,OAAOr8C,OAAO+oG,GAInBz0G,KAAK83F,QAAU,IAAI,KAAY93F,KAAKiH,SAAUjH,KAAKswB,WAAYtwB,KAAK6R,gBACpE7R,KAAK83F,QAAQtlE,OAEbxyB,KAAKswB,WAAW5kB,OAAO1L,KAAK83F,QAAQ51F,SAGpClC,KAAKswB,WAAW3c,mBAAqB,KACnC,MAAM4O,EAAOviB,KAAK2xB,YAAY+C,IAAIlS,wBAClC,IAAID,EAAKe,MAAO,OAEhB,MAAMF,EAAMb,EAAKa,IAAM,EACvB2xF,EAAiB3xF,GANG,GAMkB,EAGxC,MAAM2xF,EAAoBC,IACxBR,EAAkBjhG,UAAU1J,OAAO,aAAc7J,KAAKwjF,SAAWwxB,GACjEh1G,KAAK2xB,YAAYvmB,UAAUmI,UAAU1J,OAAO,mBAAoBmrG,GAChEhX,GAAYgX,GAERA,GACFh1G,KAAK2xB,YAAY0R,sB,EAIf26D,GAAa,OAAiB,CAClCrrF,QAAS8hG,EACT7yG,KAAM,aACNq3D,eAAgB,IAChBg8C,SAAS,IAGXjX,EAAW,IAEX,QAAiBh+F,KAAKu0G,UAAWxsG,IAC5Bi2F,EAAW3oE,UACZr1B,KAAKswB,WAAW4F,kBAAkB,CAChCh0B,QAASlC,KAAKswB,WAAWllB,UAAUmK,kBACnC4gB,SAAU,UAEZ6nE,EAAW,GAEPh+F,KAAKwjF,SACPgxB,EAAkBjhG,UAAU/Q,OAAO,eAE5BxC,KAAKswB,WAAW+rD,4BACzBr8E,KAAKuhF,OAAO2zB,iB,GAEb,CAACrjG,eAAgB7R,KAAK6R,kBAEzB,QAAiB7R,KAAK40G,SAAS,IAAW,mCACxC,IAAI1hG,EACJ,MAAM,OAAClL,EAAM,SAAEiL,GAAYjT,KAEzBkT,EADCD,UAAkBjT,KAAKiH,SAASqI,gBAAgB8zB,QAAQp7B,IACnDhI,KAAKuhF,OAAOC,UAAU,MACpBx5E,EAAOo4B,YACTpgC,KAAKuhF,OAAOC,UAAUixB,GAEtBzyG,KAAKuhF,OAAOC,UAAU,MAG3BtuE,IACEA,aAAe,KAChBA,EAAIkY,KAAKpjB,EAAQhI,KAAKiT,WAEnBC,aAAeu/F,EAChBv/F,EAAI+vB,OAASj7B,EAAOs1B,WAEpBpqB,EAAIlL,OAASA,EAGfkL,EAAIkY,QAGV,KAAG,CAACvZ,eAAgB7R,KAAK6R,iBAEzB7R,KAAK6R,eAAe9Q,IAAIkd,EAAA,EAAxBje,CAAmC,mBAAoBumE,IAClDvmE,KAAKgI,SAAWu+D,GACjBvmE,KAAKm1G,e,IAITn1G,KAAK6R,eAAe9Q,IAAIkd,EAAA,EAAxBje,CAAmC,eAAgBijC,IAC9CjjC,KAAKgI,SAAWi7B,EAAOrQ,UAAS,IACjC5yB,KAAKm1G,e,IAITn1G,KAAK6R,eAAe9Q,IAAIkd,EAAA,EAAxBje,CAAmC,uBAAwBmI,IACzDnI,KAAKo1G,iBAAiBjtG,EAAQ,IAGhCnI,KAAK6R,eAAe9Q,IAAIkd,EAAA,EAAxBje,CAAmC,kBAAkB,EAAEgI,SAAQqtG,WAC7Dr1G,KAAKs1G,sBAAsBttG,EAAQkR,MAAMC,KAAKk8F,GAAM,IAItDr1G,KAAK6R,eAAe9Q,IAAIkd,EAAA,EAAxBje,CAAmC,gBAAgB,EAAEmI,cACnDnI,KAAKo1G,iBAAiBjtG,EAAQ,IAKhCnI,KAAK2xB,YAAc,IAAI,IAAe,CACpCkD,UAAW,CAAC,CACVziB,YAAa,2BACb8F,KAAM,oBACNtW,KAAM,WACL,CACDwQ,YAAa,gCACb8F,KAAM,kBACNtW,KAAM,SACL,CACDwQ,YAAa,8BACb8F,KAAM,kBACNtW,KAAM,SACL,CACDwQ,YAAa,yBACb8F,KAAM,kBACNtW,KAAM,SACL,CACDwQ,YAAa,2BACb8F,KAAM,kBACNtW,KAAM,SACL,CACDwQ,YAAa,gCACb8F,KAAM,kBACNtW,KAAM,UAER0uB,WAAYtwB,KAAKswB,WACjBiG,YAAc3B,IACZ,MAAMjb,EAA4B,YAAlBib,EAAShzB,MAAsBqc,EAAA,6BAAuC,IAAM,EAC5Fvb,YAAW,KACT6yG,EAAchiG,UAAU1J,OAAO,YAA+B,YAAlB+qB,EAAShzB,KAAmB,GACvE+X,EAAQ,EAEb1S,SAAUjH,KAAKiH,WAGjBjH,KAAK2xB,YAAY0E,oBAAsB,KACrC0+E,GAAiB,EAAK,EAGxB/0G,KAAK83F,QAAQ51F,QAAQwJ,OAAO1L,KAAK2xB,YAAYvmB,WAE7C,MAAMmqG,GAAgB,OAAa,CAACxhG,KAAM,qBAC1C/T,KAAK2S,QAAQjH,OAAO6pG,IAEpB,QAAiBA,GAAe,IAAW,mCACzC,MAAMvtG,EAAShI,KAAKgI,OACdJ,EAAK5H,KAAKgI,OAAOs1B,WACjBiD,QAAkBvgC,KAAKiH,SAASq5B,gBAAgBC,UAAU34B,GAE1D4tG,EAAmB,CAACxwE,EAAmBzS,KAC3C,IAAI0kC,EAA2B8Y,EAC7B7Y,EAAiC8Y,EACjC9vB,EAEF,GAAGlb,EAAQniC,OAAS,EAClBo0D,EAAe,uBACf8Y,EAAgB,EAAC,QAAK,UAAW,CAAC/qC,EAAQniC,UAC1Cq0D,EAAqB,2BACrB8Y,EAAsBhrC,EAAQlqB,KAAK9S,IACjC,MAAMgqC,EAAI3mC,SAASC,cAAc,KAEjC,OADA0mC,EAAEtmC,OAAO,IAAI,IAAU,CAAC1D,WAAS9F,SAC1B8vC,CAAC,IAGNzR,IACF2f,EAAa,CAAC,CACZlsC,KAAM,4BACN4xB,SAAS,SAGR,CACLqxB,EAAe,yBACfC,EAAqB,2BACrB,MAAMllB,EAAI3mC,SAASC,cAAc,KACjC0mC,EAAEtmC,OAAO,IAAI,IAAU,CACrB1D,OAAQg9B,EAAQ,KACf9iC,SACH8tE,EAAsB,CAACh+B,GAEnBzR,IACF2f,EAAa,CAAC,CACZlsC,KAAM,8BACNg9B,SAAU,CAAC,IAAI,IAAU,CAAChpC,OAAQg9B,EAAQ,KAAK9iC,SAC/C0jC,SAAS,I,CAKfoqC,EAAoB3tE,KAAK,IAAI,IAAU,CACrC2F,WACC9F,SAEH,IAAI,IAAU,oBAAqB,CACjC8F,SACAivD,eACAC,qBACA8Y,sBACAn8D,QAAS,CAAC,CACRsjD,QAAS,MACT5kC,aAEF2tB,eACC30B,MAAM,EAGLi8D,EAAWhiF,IACC,4BAAbA,EAAI5D,OACL,EAAAuqB,EAAA,IAAS,CAACC,YAAa,sB,EAI3B,GAAGmU,EAAW,CACZ,MAAMrtB,EAAMlT,KAAKuhF,OAAOC,UAAU,MAClCtuE,EAAIkY,KAAK,CACPxpB,KAAM,UACN6/E,WAAW,EACXC,QAAU18C,IACRwwE,EAAiBxwE,GAAS,KACxB,MAAMz2B,EAAUvO,KAAKiH,SAASq5B,gBAAgB4+C,gBAAgBt3E,EAAIo9B,GAClEz2B,EAAQ0J,MAAMuvE,GACdt0E,EAAIqrF,gBAAgBhwF,EAAQ,KAGvB,GAETQ,MAAO,kBACPxL,YAAa,iB,MAGf,IAAI,IAAc,CAChBotE,UAAW,CAAC,YACZptE,YAAa,SACb6rE,SAAWpnE,IACTtF,YAAW,KACT8yG,EAAiB,CAACxtG,IAAU49B,IAC1B5lC,KAAKiH,SAASq5B,gBAAgBm1E,YAAY7tG,EAAII,EAAQ49B,EAAQ/9B,UAAO5D,EAAY,GAChFgU,MAAMuvE,EAAQ,GACf,GACD,EAAE,GAIb,KAAG,CAAC31E,eAAgB7R,KAAK6R,gBAG3B,CAEQ6jG,kBAAkBvtG,EAAmD8K,G,MAC3E,MAAMqgB,EAAiD,QAAhC,EAAA8gF,GAAiBjsG,EAAQH,eAAO,eAAGiL,GAC1D,GAAIqgB,EAEJ,IAAI,MAAMsB,KAAY50B,KAAK2xB,YAAYkD,UAAW,CAChD,MAAMziB,EAAcwiB,EAASxiB,YACvB0b,EAAUwF,EAAelhB,GAC/B,IAAI0b,EACF,SAGF,MAAM86E,EAAW5oG,KAAK2xB,YAAYgG,qBAAqB,CAACxvB,GAAUiK,GACjEgnB,QAAQjxB,IAAa2lB,EAAQptB,MAAMygC,GAAMA,EAAEl5B,MAAQE,EAAQF,KAAOk5B,EAAEn5B,SAAWG,EAAQH,WACrF4gG,EAAS/lG,SACVirB,EAAQ7B,WAAW28E,EAAS9tF,KAAK3S,IAAY,CAAEF,IAAKE,EAAQF,IAAKD,OAAQG,EAAQH,YAE9EhI,KAAKgI,SAAWG,EAAQH,SAA6D,IAAnDhI,KAAK2xB,YAAY4B,gBAAgBnhB,KACpEpS,KAAK2xB,YAAY4B,gBAAgBnhB,IAAgBw2F,EAAS/lG,OAC1D7C,KAAK2xB,YAAY6J,oBAAoBotE,EAAUh0E,GAAU,I,CAIjE,CAEcwgF,iBAAiBjtG,G,0CAC7B,GAAGnI,KAAKwyB,KAAM,OAEd,MAAM,OAACxqB,GAAUG,EACXi7B,QAAgBpjC,KAAKiH,SAASqI,gBAAgB8zB,QAAQp7B,GACtDiL,GAAW,EAAA0iG,GAAA,GAAmBxtG,EAASi7B,GAE7CpjC,KAAK01G,kBAAkBvtG,GACpB8K,GACDjT,KAAK01G,kBAAkBvtG,EAAS8K,EAEpC,G,CAEO2iG,uBAAuBtiF,EAA2CtrB,EAAgBqgC,GACvF,IAAI,MAAMpgC,KAAOogC,EACf,IAAI,MAAMzmC,KAAQ5B,KAAK2xB,YAAYkD,UAAW,CAC5C,MAAMziB,EAAcxQ,EAAKwQ,YAEnB0b,EAAUwF,EAAelhB,GAC/B,IAAI0b,EAAS,SAEb,MAAM/kB,EAAM+kB,EAAQ9kB,WAAWm4B,GAAMA,EAAEl5B,MAAQA,IAC/C,IAAY,IAATc,IAIH+kB,EAAQQ,OAAOvlB,EAAK,GAEjB/I,KAAKgI,SAAWA,GAAQ,CACzB,MACM8iB,EADY9qB,KAAK2xB,YAAYwB,KAAK/gB,GAClBwF,cAAc,cAAc3P,qBAAuBD,OACtE8iB,IACE9qB,KAAK2xB,YAAYG,UAAUC,aAC5B/xB,KAAK2xB,YAAYG,UAAUI,gBAAgBpH,GAG7CA,EAAItoB,UAGHxC,KAAK2xB,YAAY4B,gBAAgBnhB,IAAiBrJ,EAAM,KACvD/I,KAAK2xB,YAAY4B,gBAAgBnhB,E,EAQ7C,CAEOkjG,sBAAsBttG,EAAgBqgC,GAC3C,GAAGroC,KAAKwyB,KAAM,OAEd,MAAMpjB,EAAIglG,GAAiBpsG,GAC3B,GAAIoH,EAAJ,CAEA,IAAI,MAAM6D,KAAY7D,EACpBpP,KAAK41G,uBAAuBxmG,EAAE6D,GAAWjL,EAAQqgC,GAGnDroC,KAAKswB,WAAWwG,UANH,CAOf,CAEcwM,c,0CAEZ,MAAMlD,EAAYpgC,KAAKgI,OAAOo4B,aACvBuB,EAAgBwB,SAAmB/hB,QAAQgI,IAAI,GACpDgX,GAAYpgC,KAAK2xB,YAAYgQ,mBAC7BvB,GAAYpgC,KAAKiH,SAASq5B,gBAAgB6C,UAAUnjC,KAAKgI,OAAOs1B,WAAY,kBAG9E,MAAO,KACLt9B,KAAK83F,QAAQx0D,cACbtjC,KAAK40G,QAAQrhG,UAAUxS,IAAI,QAC3Bf,KAAK2xB,YAAY2R,aAAY,GAC7BtjC,KAAKoL,UAAUmI,UAAU1J,OAAO,kBAAmB83B,GAAkBwB,EAAU,CAGnF,G,CAEO0yE,aAAatnG,GAClBvO,KAAK2xB,YAAY6B,UAAYjlB,CAC/B,CAEOu2D,QAAQ98D,EAAgBiL,G,UAC7B,OAAGjT,KAAKgI,SAAWA,GAAUhI,KAAKiT,WAAaA,KAE/CjT,KAAKgI,OAASA,EACdhI,KAAKiT,SAAWA,EAChBjT,KAAK81G,aAAc,EAEhB91G,KAAKwyB,OACNxyB,KAAKwyB,OACLxyB,KAAKwyB,KAAO,MAGdxyB,KAAK2xB,YAAYiS,SAAS,CACxB57B,SACAiL,WACAqgB,eAA0D,QAAzC,GAAH,EAA0B,QAAxB,EAAC8gF,GAAiBpsG,UAAM,QAAvBosG,GAAiBpsG,GAAY,CAAC,GAAGiL,UAAQ,UAARA,GAAc,CAAC,IAGnEjT,KAAK83F,QAAQhzB,QAAQ98D,EAAQiL,IAEtB,EACT,CAEc8iG,iB,0CACZ,MAAM3yE,EAAUpjC,KAAKiH,SAASqI,gBAAgB8zB,QAAQpjC,KAAKgI,QAE3D,MAAO,KACLhI,KAAK20G,UAAUre,iBAAiB,CAAC9pF,IAAKxM,KAAKiT,UAAYmwB,EAAU,gBAAkB,WAAW,CAElG,G,CAEa8kC,sB,0CACX,IAAIloE,KAAK81G,YACP,OAGF91G,KAAK81G,aAAc,EACnB,MAAMhvC,QAAkB1lD,QAAQgI,IAAI,CAClCppB,KAAKsjC,cACLtjC,KAAKm1G,eAAc,GACnBn1G,KAAK83F,QAAQ5vB,sBACbloE,KAAK+1G,mBAGP,MAAO,KACLjvC,EAAU/hE,SAASwtB,IACjBA,SAAAA,GAAY,GACZ,CAEN,G,CAEc4iF,cAAiC5nF,G,0CAC7C,IAAIhC,EACJ,GAAGvrB,KAAKgI,OAAOo3B,SACb7T,EAAOvrB,KAAKgI,SAAWiW,EAAA,eAAwBje,KAAKiH,SAASy2B,gBAAgBi8D,UAAU35F,KAAKgI,OAAOs3B,iBAC9F,CACL,MAAM2D,EAASjjC,KAAKgI,OAAOs1B,WACrB+pC,EAAUrnE,KAAKiT,iBAAkBjT,KAAKiH,SAASq5B,gBAAgB8C,QAAQH,IAC7E1X,QAAavrB,KAAKiH,SAASq5B,gBAAgB6C,UAAUF,EAAQokC,EAAU,gBAAkB,c,CAG3F,MAAM90C,EAAW,KACfvyB,KAAK40G,QAAQrhG,UAAU1J,OAAO,QAAS0hB,EAAK,EAG9C,OAAOgC,EAASgF,EAAWA,GAC7B,G,CAEOyjF,iBAAiB/mF,EAAiB6R,GACvC9gC,KAAK2xB,YAAY/uB,KAAKqsB,EAAQ6R,EAChC,CAEAqjD,qBACEjyE,MAAMiyE,qBAENnkF,KAAKswB,WAAWwG,UAClB,CAEA4vB,sBACEx0C,MAAMw0C,sBAEH1mD,KAAKi2G,cACNj2G,KAAK83F,QAAQ/zF,UACb/D,KAAK2xB,YAAY5tB,UAErB,CAEOA,UACL/D,KAAKi2G,aAAc,EACnBj2G,KAAK0mD,qBACP,E,6DCjhBF,MAAMwvD,EAAiBroF,IACrB,MAAM,QAAC3rB,EAAO,UAAEmZ,EAAS,SAAE4/B,EAAQ,SAAEp0C,EAAQ,gBAAEwtB,EAAe,kBAAED,EAAiB,QAAE2iD,GAAWlpD,GACxF,QAAClU,EAAO,IAAEw8F,GAAOj0G,EAAQmkB,QAmB/B,QAlBepiB,IAAZ0V,GACDlG,cAAckG,QAML1V,IAARkyG,IACDziG,OAAOsjC,sBAAsBm/D,GACzBp/B,UACK70E,EAAQmkB,QAAQ8vF,KAQxBp/B,GAAW,gCAAwClwE,EASpD,YARA3E,EAAQmkB,QAAQ8vF,IAAM,GAAKziG,OAAOq0B,uBAAsB,YAC/C7lC,EAAQmkB,QAAQ8vF,IACvBD,EAAc,OAAD,wBACRroF,GAAO,CACVkpD,QAASA,EAAU,IACnB,KAMH97B,GAAY5/B,GACbnZ,EAAQqR,UAAUxS,IAAIsa,GAGxB,MAAM+6F,EAAe,YACZl0G,EAAQmkB,QAAQ1M,SACnBshC,GAAY5/B,GACdnZ,EAAQqR,UAAU/Q,OAAO,YAAa6Y,GAGxCnZ,EAAQqR,UAAU/Q,OAAO,aAEzB6xB,SAAAA,GAAmB,EAIrB,GADAD,SAAAA,KACI,iCAAyCvtB,EAG3C,OAFA3E,EAAQqR,UAAU/Q,OAAO,YAAa,kBACtC4zG,IAIFl0G,EAAQqR,UAAUxS,IAAI,aAEtBmB,EAAQqR,UAAU1J,OAAO,aAAcoxC,GACvC/4C,EAAQmkB,QAAQ1M,QAAU,GAAKjX,WAAW0zG,EAAcvvG,EAAS,EAGnE,G,wHC1De,MAAMwvG,EAYnBt2G,YAAY8tB,G,MAVF,KAAA88E,cAA6C,GAI/C,KAAAR,cAAe,EAqChB,KAAA+K,gBAAkB,KACV,mBAAuCl1G,KAAKq6C,gBAEvD,SAA6Br6C,KAAKq6C,gBAC1Br6C,KAAK2qG,cAAc9nG,QAC3B7C,KAAKs2G,SAASt2G,KAAK2qG,cAAc3qG,KAAK2qG,cAAc9nG,OAAS,G,EAK1D,KAAAyzG,SAAW,CAAC1uG,EAA8BouB,EAAmBg1E,KAClE,QAAU/mG,IAAP2D,GAAoB5H,KAAK2qG,cAAc3qG,KAAK2qG,cAAc9nG,OAAS,KAAO+E,EAE3E,OADA5H,KAAK8lF,qBAAqBl+E,IACnB,EAIT,MAAM2uG,EAAYv2G,KAAK2qG,cAAcllF,MACrCzlB,KAAK+qG,WAAWwL,EAAWvgF,EAASg1E,GAEpC,MAAM93F,EAAMlT,KAAK2qG,cAAc3qG,KAAK2qG,cAAc9nG,OAAS,GAE3D,OADA7C,KAAK4qG,gBAAmB3mG,IAARiP,EAAqBA,aAAe,IAAiBA,EAAI9H,UAAY8H,EAAQlT,KAAKmqG,cAAgB,EAAI,EAAIn0E,IACnH,CAAI,GA/CX,OAAWh2B,KAAM6tB,GAER,QAAT,EAAA7tB,KAAKmzB,YAAI,QAATnzB,KAAKmzB,KAAS,IAAI5xB,KAElBvB,KAAKk1B,cAAgBl1B,KAAKs7F,UAAU1jF,cAAc,mBAClD5X,KAAK4qG,YAAa,OAAiB,CACjCj4F,QAAS3S,KAAKk1B,cACdtzB,KAAM,aACNq3D,eA9BkB,MAgChBj5D,KAAKmqG,cACPnqG,KAAK4qG,WAAW,GAGlB5qG,KAAKyvC,kBAAmB,QAK1B,CAEO+mE,gBACL,OAAOx2G,KAAKyvC,iBAAiBxsC,KAC/B,CA2BaqyB,UAAU1tB,G,mDAKrB,GAAG5H,KAAK2qG,cAAc3qG,KAAK2qG,cAAc9nG,OAAS,KAAO+E,EACvD,OAAO,EAGT,MAAMsL,EAAsBtL,aAAc,IAAiBA,EAAK5H,KAAKmzB,KAAKlwB,IAAI2E,GA4B9E,OA3BA5H,KAAKy2G,kBAAmBz2G,KAAKy2G,aAE1BvjG,IAES,QAAV,EAAAA,EAAIgI,cAAM,iBAGPhI,EAAIixE,oBACLzhF,YAAW,KAETwQ,EAAIixE,oBAAoB,GA5FV,MAkGpB,aAAiC,CAC/BviF,KAAM5B,KAAKq6C,eACXvwB,MAAQC,IACN/pB,KAAKs2G,cAASryG,EAAW8lB,GAAY,IAC9B,KAKX/pB,KAAK2qG,cAActoG,KAAKuF,GACxB5H,KAAK4qG,WAAWhjG,aAAc,IAAiBA,EAAGwD,UAAYxD,IACvD,C,qRAGFk+E,qBAAqBl+E,IAC1B,OAAiB5H,KAAK2qG,cAAe/iG,GACrC5H,KAAK+qG,WAAWnjG,OAAI3D,EACtB,CAEOk/E,kBAAkBoU,EAA6Cmf,GACpE,IAAI,IAAItyF,EAAIpkB,KAAK2qG,cAAc9nG,OAAS,EAAGuhB,GAAK,IAAKA,EAAG,CACtD,MAAMlR,EAAMlT,KAAK2qG,cAAcvmF,GAC/B,GAAGlR,IAAQwjG,EAAX,CACK,GAAGxjG,aAAeqkF,EACrB,MAGFv3F,KAAK8lF,qBAAqB5yE,E,EAG9B,CAEOyjG,OAAiCpf,GACtC,OAAOv3F,KAAK2qG,cAAcjqG,MAAMyhC,GAAMA,aAAao1D,GACrD,CAEOqf,aACL,OAAO52G,KAAK2qG,aACd,CAEOkM,YAAYtf,GACjB,QAASv3F,KAAK22G,OAAOpf,EACvB,CAEUwT,WAAWnjG,EAA6BouB,EAAkBg1E,G,MAC9DA,GACF,iBAAqChrG,KAAKq6C,gBAAgB,GAG5D,MAAMnnC,EAAsBtL,aAAc,IAAiBA,EAAK5H,KAAKmzB,KAAKlwB,IAAI2E,GAC9E,GAAGsL,EAAK,CACN,IAEa,QAAX,EAAAA,EAAIiI,eAAO,gB,CACX,MAAM3V,GACN4G,QAAQigB,MAAM,oBAAqBnZ,E,CAIlCA,EAAIwzC,qBACLhkD,YAAW,KAETwQ,EAAIwzC,qBAAqB,GACxBmwB,I,CAGT,CAEOjT,OAAO1wD,GACRA,EAAI9H,UAAU6N,gBAChBjZ,KAAKk1B,cAAcxpB,OAAOwH,EAAI9H,WAE3B8H,EAAIqhG,UACLrhG,EAAIqhG,SAAS3mG,iBAAiB,QAAS5N,KAAKk1G,iBAGlD,CAEO4B,UAAU5jG,GACflT,KAAKmzB,KAAKlyB,OAAOiS,EACnB,CAEOsuE,UACLtP,EACA+jC,GAAc,EACdc,GAEA,MAAM7jG,EAAM,IAAIg/D,EAAK6kC,OAAc9yG,EAAYjE,KAAMi2G,GAErD,OADA/iG,EAAIjM,SAAWjH,KAAKiH,SACbiM,CACT,E,gICpLa,MAAM8jG,EAmBnBj3G,YAAYwhF,EAAuB00B,GACjCj2G,KAAKi3G,aAAa11B,EAAQ00B,EAC5B,CAEOgB,aAAa11B,EAAuB00B,GAAc,G,MACvDj2G,KAAKuhF,OAASA,EACdvhF,KAAKyvC,iBAAmB8xC,EAASA,EAAOi1B,gBAAgBxmE,UAAW,SACnEhwC,KAAKi2G,YAAcA,EAEnBj2G,KAAKoL,UAAYC,SAASC,cAAc,OACxCtL,KAAKoL,UAAUmI,UAAUxS,IAAI,WAAY,uBAGzCf,KAAK+nD,OAAS18C,SAASC,cAAc,OACrCtL,KAAK+nD,OAAOx0C,UAAUxS,IAAI,kBAE1Bf,KAAKu0G,UAAW,OAAW,4BAA6B,CAACv1F,UAAU,IACnEhf,KAAK+O,MAAQ1D,SAASC,cAAc,OACpCtL,KAAK+O,MAAMwE,UAAUxS,IAAI,yBACzBf,KAAK+nD,OAAOr8C,OAAO1L,KAAKu0G,SAAUv0G,KAAK+O,OAGvC/O,KAAK2S,QAAUtH,SAASC,cAAc,OACtCtL,KAAK2S,QAAQY,UAAUxS,IAAI,mBAE3Bf,KAAKswB,WAAa,IAAI,KAAWtwB,KAAK2S,aAAS1O,OAAWA,GAAW,GACrEjE,KAAKswB,WAAWwhD,sBAAsB9xE,KAAKoL,WAE3CpL,KAAKoL,UAAUM,OAAO1L,KAAK+nD,OAAQ/nD,KAAK2S,SAE7B,QAAX,EAAA3S,KAAKuhF,cAAM,SAAE3d,OAAO5jE,MAEpBA,KAAK6R,eAAiB,IAAI,GAC5B,CAEOe,QACL,OAAO5S,KAAKuhF,OAAO+0B,SAASt2G,KAC9B,CAEaorB,QAAQgqC,G,qCACnB,GAAGp1D,KAAKwyB,KACN,IACE,MAAMsX,EAAS9pC,KAAKwyB,QAAQ4iC,GAC5Bp1D,KAAKwyB,KAAO,KAETsX,aAAkB1oB,gBACb0oB,E,CAER,MAAMtkC,GACN4G,QAAQigB,MAAM,iBAAkB7mB,E,CAIpCxF,KAAKuhF,OAAOjsD,UAAUt1B,KACxB,E,+RAEOwyB,QAAQ4iC,GAEf,CAEUl6C,SAAU,CACVipE,qBAAsB,CACtBhpE,UAAW,CAEXurC,sB,UACL1mD,KAAKi2G,cACK,QAAX,EAAAj2G,KAAKuhF,cAAM,SAAEu1B,UAAU92G,MACvBA,KAAKoL,UAAU5I,SACfxC,KAAKswB,WAAWvsB,UACG,QAAnB,EAAA/D,KAAK6R,sBAAc,SAAEC,YACA,QAArB,EAAA9R,KAAKyvC,wBAAgB,SAAE1rC,UAE3B,CAEUu6E,SAAS9xE,GACjBxM,KAAK+O,MAAMmwB,iBAAgB,QAAK1yB,GAClC,EAGK,MAAM0qG,UAAgCF,EAO3Cj3G,YAAYwhF,GACVrvE,MAAMqvE,GACNvhF,KAAKoiF,cAAgB,IAAI,GAC3B,CAEAjnE,UACEnb,KAAKoiF,cAAch5E,cAAc,QACnC,CAEAs9C,sBACE,MAAM9qB,EAAU57B,KAAKoiF,cAAc+0B,wBAAwB,WAG3D,OAFAn3G,KAAKoiF,cAAch5E,cAAc,eAAgBgY,QAAQgI,IAAIwS,GAASttB,KAAK,IAAM,MACjFtO,KAAKoiF,cAAc1mE,UACZxJ,MAAMw0C,qBACf,E,mbCzHa,MAAM0wD,UAAuB,IAc1Cr3G,YAAY8tB,GAkEV,IAAIlU,EAtDJzH,MAAM,CACJmlG,SAAUxpF,EAAQwpF,UAAY,CAAEn1G,GAAYlC,KAAKiH,SAASy2B,gBAAgB45E,qBAAqBp1G,EAAQ0F,KACvG2vG,SAAWr1G,IACTA,EAAQw6B,IAAI86E,OAAOh1G,SACnBxC,KAAKy3G,oBAAsBz3G,KAAKy3G,oBAAoB,EAEtDC,SAAU7pF,EAAQ6pF,UAAY,CAAOx1G,GAAY,EAAD,gCAC9C,MAAM06F,GAAS,aAA0B58F,KAAKiH,SAASy2B,gBAAgBC,QAAQz7B,EAAQ0F,MACvF,OAAe1F,EAAQw6B,IAAIU,gBAAiBw/D,EAC9C,KACAlK,OAAQ,CAACxwF,EAAS6G,KAChB,MAAM4uG,EAAmBz1G,EAAQw6B,IAAI86E,OAAOv+F,gBAAkBjZ,KAAKwvB,MACnE,OAAuBttB,EAAQw6B,IAAI86E,OAAQx3G,KAAKwvB,KAAMzmB,GAEnD4uG,GAAoB33G,KAAKy3G,oBAC1Bz3G,KAAKy3G,oB,EAGTG,gBAAkBC,IAChB,MAAM,IAACn7E,GAAO,uBAA+B,CAC3C10B,OAAQ6vG,EAAKjwG,GACbwD,WAAW,EACXmmB,WAAYvxB,KAAKuxB,WACjBlC,WAAYrvB,KAAKqvB,WACjBmC,WAAW,EACXsO,cAAe9/B,KAAK8/B,cACpBiQ,YAAa,CACX1xB,cAAere,KAAKqe,iBAKxB,OADCw5F,EAAoBn7E,IAAMA,EACpBm7E,CAAkB,EAE3BC,kBAAmB,KACnBC,eAAsBxlF,GAAa,EAAD,gCAChC,OAAI,OAAQvyB,KAAKwvB,aAIX,WAEF,OAAQxvB,KAAKwvB,WAIjB+C,GAAS,GAHAA,GAAS,IANTA,GAAS,EAUpB,MApEM,KAAAhB,WAAgC,aAChC,KAAAuO,eAAgB,EAChB,KAAAzQ,YAAa,GAqErB,OAAWrvB,KAAM6tB,GAEjB7tB,KAAKwvB,KAAO,yBAAiCxvB,KAAKg4G,uBAGlD,MAAMC,EAAY,KAChBt+F,EAAUjG,OAAOhR,YAAW,KAC1B1C,KAAKk4G,YAAYp+F,IACZA,GACDm+F,G,GAEF,GACDb,EAAee,cAAc,EAGlCF,GACF,EA3FiB,EAAAE,cAAgB,G,8hBCOnC,IAAIC,GAAY,EACD,SAASC,GAA6B,SAAClxD,EAAQ,eAAEt1C,EAAc,SAAEwT,EAAUizF,WAAYC,IAMpG,GAAG,IACD,OAGF,MAAMD,EAAa,CAACvwG,EAAeywG,KACjC,IAAI53G,EACJ,GAAG23G,EAAoB33G,EAAK23G,EAAmBxwG,OAC1C,CACH,MAAMgC,EAAIsb,GAAY,yBACtBzkB,EAAMmH,EAAE1H,OAAuBo4G,QAAQ1uG,E,CAGzC,OAAOnJ,GAAQ43G,KAAkB,OAAc53G,EAAIumD,QAAkBljD,EAALrD,CAAc,EAG1EqG,EAAW,aAEjB4K,EAAe9Q,IAAIomD,EAAnBt1C,CAA6B,aAAc9J,IACzC,GAAGqwG,GAAarwG,EAAE8L,QAAU,GAAkB,IAAb9L,EAAEuO,OAAc,OACjD,IAAIoiG,EAAiBJ,EAAWvwG,GAChC,IAAI2wG,EACF,OAKF,MAAMtxG,EAAQsxG,EAAeryF,QAAQjf,MACrC,IAAIA,EACF,OAGF,MAAMiU,EAAY,iBACZ/a,EAA4B,iBAG5Bq4G,EAAgB,8BAChBC,GAAc,SACpB,IAAIxtG,EAAwBytG,EAE5B,MAAMC,EAAgB,EAAOJ,iBAAgB/2G,MAAK0xB,aAAY0lF,aAAYC,iBAMpE,EAAD,gCACH,MAAMC,GAAc,OAAsBt3G,GACpCu3G,EAAqBR,EAAel2F,wBACpCzY,GAAI,OAAcpI,EAAIyM,EAAGzM,EAAIyN,GAC7BvH,EAAOoxG,EAAc,IAAM,IAC3BE,GAAU,OAActxG,EAAMA,GAC9BuxG,EAASF,EAAU51F,QAAU41F,EAAUx1F,OAASy1F,EAAUpvG,EAAEsvG,aAAaF,GAEzEh8D,GAAS,OAAgBu7D,EAAgB,UACzC7zF,GAAQs4B,GAASA,EAAO5pC,UAAUqB,SAAS,UAE3C0kG,EAAcjuG,SAASC,cAAc,OAC3CguG,EAAY/lG,UAAUxS,IAAIsa,EAAY,gBAEtC,MAAM2nE,EAAmB33E,SAASC,cAAc,OAChD03E,EAAiBzvE,UAAUxS,IAAIsa,EAAY,YACX2nE,EAAiBz3E,MAAM+X,MAAQ81F,EAAO91F,MAAQ,KAC7C0/D,EAAiBz3E,MAAMmY,OAAS01F,EAAO11F,OAAS,KAEjF,MAAMgrC,EAAerjD,SAASC,cAAc,OAI5C,GAHAojD,EAAan7C,UAAUxS,IAAIsa,EAAY,UACvCqzC,EAAahjD,QAAO,OAAc/J,EAAIixD,kBAEnCqmD,EAAa,CACd,MAAM12D,GAAU16C,EAAO,KAA4BA,GAAQ,GAAKgd,EAAQ,GAAK,GAC7Ey0F,EAAY/lG,UAAUxS,IAAI,cAG1Bu4G,EAAY/tG,MAAMssE,YAAY,eAAgB,GAAGt1B,OACjDmM,EAAanjD,MAAMssE,YAAY,gBAAoBt1B,EAAJ,K,CAGjD,MAAM1/B,GAAkB,OAAgB61F,EAAgB,cAClD51F,GAAc,OAAe41F,EAAgB71F,GAAiB,EAAMq2F,IACvEp2F,EAAYE,SAASC,UAAYH,EAAYE,SAASE,aACvD8/D,EAAiBzvE,UAAUxS,IAAI,eAWjC,MAAMwhB,EAAOm2F,EAAel2F,wBACtBmB,EAASpB,EAAKe,MAAQ81F,EAAO91F,MAC7BM,EAASrB,EAAKmB,OAAS01F,EAAO11F,OAC9B61F,EAAah3F,EAAKI,MAAQ,UAAmBJ,EAAKe,OAAS,EAC3Dk2F,EAAaj3F,EAAKa,KAAO,WAAoBb,EAAKmB,QAAU,EAClE41F,EAAY/tG,MAAMsR,UAAY,aAAa08F,QAAiBC,cAAuB71F,MAAWC,KAC3Fo1F,GAAaM,EAAY/lG,UAAUxS,IAAI,gBAC1Cu4G,EAAY5tG,OAAOs3E,EAAkBt0B,GACrCtjD,EAAUM,OAAO4tG,GAEjB,MAAM1lC,QAAU,QAAY,CAC1BjyE,MACAmpB,IAAKk4D,EACL1iF,QACAgjB,MAAO81F,EAAO91F,MACdI,OAAQ01F,EAAO11F,OACfjf,MAAM,EACNf,MAAM,EACN2vB,aACApsB,WACAwyG,YAAY,EACZ50F,QACA60F,WAAW,EACXC,gBAAgB,EAChBC,YAAY,IACXtrG,MAAK,EAAE26B,YAAYA,IACtB,IAAI5V,IAAc,OAEdjoB,EAAU6N,eACZ5N,SAASI,KAAKC,OAAON,GAGvB,MAAMhJ,EAAS8W,MAAMi8D,QAAQvB,GAAKA,EAAE,GAAKA,EAEnCimC,EAAoBz3G,aAAkB,IAC1C,IAAIgf,SAAejT,GAAY/L,EAAOwL,iBAAiB,aAAcO,EAAS,CAACF,MAAM,MACrFmT,QAAQjT,UAGV,SAFMiT,QAAQgI,IAAI,CAACywF,GAAmB,kBAChC,OAAM,GACRxmF,IAAJ,CAOA,GALG0lF,IACD,4BAA6Cz4G,GAC7C,sBAAsC,IAGrC8B,aAAkB,IAAe,CAClC,MAAM03G,EAAapB,aAA0B,KAC3CA,EAAet2G,OACf,iBAA0Bs2G,GAC5B,GAAGoB,EAAY,CAcb,GAbA13G,EAAOsgE,SAAWo3C,EAAWp3C,SAC7BtgE,EAAOqC,aACD,IAAI2c,SAAejT,IACvB,IAAIiW,EAAI,EACR,MAAM2d,EAAI,KACG,KAAN3d,IACHjW,IACA/L,EAAOsP,oBAAoB,aAAcqwB,G,EAI7C3/B,EAAOwL,iBAAiB,aAAcm0B,EAAE,KAEtC1O,IAAc,OAClBjxB,EAAOmC,O,OAEJ,GAAGnC,aAAkBG,iBAAkB,CAC5C,MAAMu3G,EAAapB,EAAe9gG,cAAgC,SAC/DkiG,IACD13G,EAAOmE,YAAcuzG,EAAWvzG,Y,CAIpC,MAAO,CACLwzG,MAAO,MACF33G,aAAkB,KAAiBA,aAAkBG,mBACtDH,EAAOqC,OAGNw0G,IACD,QAAmBj2B,E,EAGvBs2B,cA7CsB,CA+C1B,IAEM3/F,EAAUjG,OAAOhR,YAAW,IAAW,EAAD,gCAC1C2I,SAASqG,oBAAoB,YAAasoG,GAE1C5uG,EAAYC,SAASC,cAAc,OACnCF,EAAUmI,UAAUxS,IAAIsa,GACxB+8F,GAAY,EAEZ,MAAM/kF,EAAaulF,EAAY31G,MACzBtB,QAAYsF,EAASC,eAAeC,OAAOC,GACjD,IAAIisB,IAAc,OAElB,IAAIyW,EACJ,IAOE,GANAA,QAAegvE,EAAc,CAC3Bn3G,MACA+2G,iBACArlF,aACA0lF,YAAY,KAEVjvE,EAAQ,M,CACZ,MAAMtkC,GACN,M,CAGF,MAAM,MAACu0G,EAAK,YAAET,GAAexvE,EAE7B+uE,EAAsBS,GAEtB,OAAc,CACZp3G,QAASkJ,EACTiQ,UAAW,aACX4/B,UAAU,EACVp0C,SAlLiB,IAmLjBwtB,gBAAiB,KACXhB,KACJ0mF,GAAO,IAIX1uG,SAASuC,iBAAiB,YAAawrC,EACzC,KAAG,KAEGA,EAAoBrxC,GAAkB,EAAD,gCACzC,MAAMkyG,EAAoB3B,EAAWvwG,GAAG,GACxC,IAAIkyG,GAAqBvB,IAAmBuB,EAC1C,OAGF,MAAM7yG,EAAQ6yG,EAAkB5zF,QAAQjf,MACxC,IAAIA,EACF,OAGFsxG,EAAiBuB,EACjBrB,EAAY9uG,QACZ,MAAMupB,EAAaulF,EAAY31G,MAEzBtB,QAAYsF,EAASC,eAAeC,OAAOC,GACjD,IAAIisB,IAAc,OAElB,IAAI/O,EACJ,IAOE,GANAA,QAAUw0F,EAAc,CACtBn3G,MACA+2G,iBACArlF,aACA2lF,aAAa,KAEX10F,EAAG,M,CACP,MAAM9e,GAEN,YADA4G,QAAQigB,MAAM,uBAAwB7mB,E,CAIxC,MAAM,MAACu0G,EAAK,YAAET,GAAeh1F,EAEvB41F,EAAuBrB,GAC7B,OAAc,CACZ32G,QAASg4G,EACT7+F,UAAW,eACX4/B,UAAU,EACVp0C,SAlOmB,IAmOnBwtB,gBAAiB,KACf6lF,EAAqB13G,QAAQ,IAIjCq2G,EAAsBS,GAEtB,OAAc,CACZp3G,QAASo3G,EACTj+F,UAAW,eACX4/B,UAAU,EACVp0C,SA9OmB,IA+OnBwtB,gBAAiB,KACXhB,KACJ0mF,GAAO,GAGb,IAEMC,EAAkBjyG,KAClB,OAAcA,EAAE1H,OAAuBq4G,IACzCp5F,G,EAIEA,EAAY,KAChB7L,aAAakG,GACbi/F,EAAY9uG,QAETsB,KACD,OAAc,CACZlJ,QAASkJ,EACTiQ,UAAW,aACX4/B,UAAU,EACVp0C,SAtQe,IAuQfwtB,gBAAiB,KACfjpB,EAAU5I,SACV,4BAA6Cm2G,GAC7C,sBAAsC,GACtCP,GAAY,CAAK,KAIrB,QAAiB/sG,SAASI,KAAM,IAAa,CAACuJ,SAAS,EAAM/G,MAAM,KAGrE5C,SAASqG,oBAAoB,YAAasoG,GAC1C3uG,SAASqG,oBAAoB,YAAa0nC,GAC1C/tC,SAASqG,oBAAoB,UAAW4N,EAAW,CAACtK,SAAS,GAAM,EAGrE3J,SAASuC,iBAAiB,YAAaosG,GACvC3uG,SAASuC,iBAAiB,UAAW0R,EAAW,CAACrR,MAAM,EAAM+G,SAAS,GAAM,GAEhF,C,+CC1Ve,MAAMmlG,EAInBp6G,YAAoBqL,EAAgCquE,GAAhC,KAAAruE,UAAAA,EAAgC,KAAAquE,QAAAA,EAClDz5E,KAAKo6G,iBACLp6G,KAAKq6G,iBACP,CAOQD,iBACNp6G,KAAKs6G,gBAAkB,IAAIp6G,sBAAsBC,IAC/C,IAAI,MAAMC,KAASD,EAAS,CAC1B,MAAMo6G,EAAan6G,EAAMo6G,mBACnBC,EAAer6G,EAAMC,OAAO4Y,cAC5ByhG,EAAiBt6G,EAAMu6G,WAG1BJ,EAAWltC,OAASqtC,EAAet3F,KACpCpjB,KAAKy5E,SAAQ,EAAMghC,GAIlBF,EAAWltC,QAAUqtC,EAAet3F,KACnCm3F,EAAWltC,OAASqtC,EAAertC,QACrCrtE,KAAKy5E,SAAQ,EAAOghC,E,IAGvB,CAACG,UAAW,EAAG3qD,KAAMjwD,KAAKoL,WAC/B,CAEQivG,kBACNr6G,KAAK66G,iBAAmB,IAAI36G,sBAAsBC,IAChD,MAAMC,EAAQD,EACbi5B,QAAQh5B,GAAUA,EAAMo6G,mBAAmBp3F,IAAMhjB,EAAMu6G,WAAWv3F,MAClEw5B,MAAK,CAACnoC,EAAGu9B,IAAMv9B,EAAE+lG,mBAAmBp3F,IAAM4uB,EAAEwoE,mBAAmBp3F,MAAK,GACrE,IAAIhjB,EAAO,OAEX,MAAMgL,EAAYhL,EAAMS,eAAiBT,EAAMC,OAASD,EAAMC,OAAOyzE,mBACrE9zE,KAAKy5E,SAAQ,EAAMruE,EAAyB,GAC3C,CAAC6kD,KAAMjwD,KAAKoL,WACjB,CAMQ0vG,YAAY1vG,EAAwBiQ,GAC1C,MAAM0/F,EAAW1vG,SAASC,cAAc,OAExC,OADAyvG,EAASxnG,UAAUxS,IAAI,kBAAmBsa,GACnCjQ,EAAUoM,YAAYujG,EAC/B,CAOOnlD,2BAA2B1zD,GAChC,MAAM84G,EAAiBh7G,KAAK86G,YAAY54G,EAAS,wBACjDlC,KAAKs6G,gBAAgB32G,QAAQq3G,GAE7Bh7G,KAAK66G,iBAAiBl3G,QAAQzB,EAChC,CAEOk0D,aACLp2D,KAAKs6G,gBAAgBlkD,aACrBp2D,KAAK66G,iBAAiBzkD,YACxB,CAEOtzD,UAAUZ,EAAsB84G,GACrCh7G,KAAK66G,iBAAiB/3G,UAAUZ,GAChClC,KAAKs6G,gBAAgBx3G,UAAUk4G,EACjC,E,mICxDF,MAAMC,EAAYlzG,GACT,YAAaA,EAAIA,EAAE6lB,QAAQ,GAAK7lB,EAGnCmzG,EAAyB7vG,SAE/B,IAAI8vG,GAAe,EACnB,qBAAuC,UAAWr6G,IAChDq6G,EAAer6G,CAAO,IAkBxB,MAAMs6G,EAAsC,CAACn5F,SAAS,GAChDo5F,GAAsC,EAE7B,MAAMC,EAyBnBv7G,YAAY8tB,G,cAgFF,KAAAld,MAAS5I,I,MAKd,IACD/H,KAAK6R,eAAe0nC,aAAa2hE,EAAwB,YAAal7G,KAAKu7G,WAAYH,IAEvFp7G,KAAK6R,eAAe0nC,aAAa2hE,EAAwB,YAAal7G,KAAKu7G,WAAYF,GACvFr7G,KAAKw7G,YAAYjwG,MAAMwV,OAAS,IAG/B/gB,KAAKy7G,UACM,QAAZ,EAAAz7G,KAAK8gB,eAAO,qBAGd9gB,KAAK07G,aAAa,EAGV,KAAAC,YAAoBv3C,IAAW,O,EAAD,K,OAAA,E,EAAA,Y,MACtC,GAAGpkE,KAAK47G,YACN,OAGF,MAAM7zG,EAAIkzG,EAAS72C,GACnB,GAAkC,IAA/B59D,KAAKC,IAAI,EAAW,QAAR,EAAAsB,EAAEuO,cAAM,QAAI,GACzB,OAGF,GAAGtW,KAAKigB,2BAA6BjgB,KAAKigB,kBAAkBmkD,IAC1D,OAAOpkE,KAAK2Q,QAGd,MAAMoL,IAAW/b,KAAK+b,OAGtB,GAFA/b,KAAK47G,aAAc,EAEhB57G,KAAK67G,YAAc,IAAoB,CACxC,MAAMhuF,EAAU,OAAH,wBAAOwtF,GAAkB,CAAEptG,MAAM,IACxCC,GAAW,SACXkC,EAAK,IAAMlC,EAASC,UACpBuL,EAAW1Z,KAAK6R,eAAe9Q,IAAIm6G,EAAxBl7G,CAAgD,YAAaoQ,EAAIyd,GAUlF,SARMzM,QAAQy2C,KAAK,EACjB,OAAM,KACN3pD,IAGFA,EAASC,UACTnO,KAAK6R,eAAerP,OAAOkX,GAExB1Z,KAAK+b,SAAWA,EACjB,M,CAIJ/b,KAAK87G,MAAQ/zG,EAAE21D,QACf19D,KAAK+7G,MAAQh0G,EAAEqmE,QACfpuE,KAAKg8G,QAAUj0G,EAEZ,IAED/H,KAAK6R,eAAe9Q,IAAIm6G,EAAxBl7G,CAAgD,YAAaA,KAAKu7G,WAAYH,GAG9Ep7G,KAAK6R,eAAe9Q,IAAIm6G,EAAxBl7G,CAAgD,YAAaA,KAAKu7G,WAAYF,GAG7Er7G,KAAKi8G,UACNj8G,KAAKi8G,UAGLj8G,KAAKy7G,SAAU,EACfz7G,KAAKu7G,WAAWxzG,GAEpB,E,YAvDwC,K,6QAuDvC,EAES,KAAAwzG,WAAcn3C,I,MACtB,QAAkBngE,IAAfjE,KAAK87G,YAAsC73G,IAAfjE,KAAK+7G,OAAuBZ,EAEzD,YADAn7G,KAAK2Q,QAIJ3Q,KAAKoa,cACN,OAAYgqD,GAGd,MAAMr8D,EAAI/H,KAAKg8G,QAAUf,EAAS72C,GAC5B83C,EAAMn0G,EAAE21D,QACRy+C,EAAMp0G,EAAEqmE,QAERvuD,EAAQq8F,EAAMl8G,KAAK87G,MAAQ97G,KAAKo8G,OAChCt8F,EAAQq8F,EAAMn8G,KAAK+7G,MAAQ/7G,KAAKq8G,OAEtC,IAAIr8G,KAAKy7G,QAAS,CAChB,IAAI57F,IAAUC,EACZ,OAGF9f,KAAKy7G,SAAU,EAEX,KACFz7G,KAAKw7G,YAAYjwG,MAAMssE,YAAY,SAAU73E,KAAK+gB,OAAQ,aAG3C,QAAjB,EAAA/gB,KAAK6gB,oBAAY,mBAAGujD,E,CAGtB,MAAMk4C,EAAgBt8G,KAAK4f,QAAQC,EAAOC,EAAOskD,QAC5BngE,IAAlBq4G,GAA+BA,GAChCt8G,KAAK2Q,O,GA5LP,OAAW3Q,KAAM6tB,GAEN,QAAX,EAAA7tB,KAAK+gB,cAAM,QAAX/gB,KAAK+gB,OAAW,YACA,QAAhB,EAAA/gB,KAAKoa,mBAAW,QAAhBpa,KAAKoa,aAAgB,GAED,QAApB,EAAApa,KAAKu8G,uBAAe,QAApBv8G,KAAKu8G,gBAAoBnB,GAET,QAAhB,EAAAp7G,KAAKw7G,mBAAW,QAAhBx7G,KAAKw7G,YAAgBx7G,KAAKkC,SAC1BlC,KAAK6R,eAAiB,IAAI,IAC1B7R,KAAKqU,eAELrU,KAAK07G,cACL17G,KAAK+b,OAAS,EAEI,QAAlB,EAAA8R,EAAQwF,kBAAU,SAAEu5E,WAAU,KAC5B5sG,KAAK2Q,QACL3Q,KAAK2b,iBAAiB,GAE1B,CAEOtH,eACD,KAKCrU,KAAK67G,WACN,OAA0B,CACxB35G,QAASlC,KAAKkC,QACdqwB,SAAWxqB,KACT,OAAYA,GAEZ/H,KAAK27G,YAAY5zG,EAAE,EAErB8J,eAAgB7R,KAAK6R,eACrB0qG,gBAAiBv8G,KAAKu8G,kBAIxBv8G,KAAK6R,eAAe9Q,IAAIf,KAAKkC,QAA7BlC,CAAsC,aAAcA,KAAK27G,YAAa37G,KAAKu8G,iBAG7Ev8G,KAAK6R,eAAe9Q,IAAIm6G,EAAxBl7G,CAAgD,WAAYA,KAAK2Q,SAnBjE3Q,KAAK6R,eAAe9Q,IAAIf,KAAKkC,QAA7BlC,CAAsC,YAAaA,KAAK27G,YAAa37G,KAAKu8G,iBAC1Ev8G,KAAK6R,eAAe9Q,IAAIm6G,EAAxBl7G,CAAgD,UAAWA,KAAK2Q,OAoBpE,CAEOgL,kBACL3b,KAAK6R,eAAeC,WACtB,CAEO0qG,UAAUz7F,EAAiC,IAChD/gB,KAAK+gB,OAASA,GAEV,KAAsB/gB,KAAKy7G,SAC7Bz7G,KAAKw7G,YAAYjwG,MAAMssE,YAAY,SAAU73E,KAAK+gB,OAAQ,YAE9D,CAEOhgB,IAAImmB,EAAWC,GACpBnnB,KAAKo8G,OAASl1F,EACdlnB,KAAKq8G,OAASl1F,EACdnnB,KAAKu7G,WAAW,CACd79C,QAAS19D,KAAKg8G,QAAQt+C,QACtB0Q,QAASpuE,KAAKg8G,QAAQ5tC,QACtB/tE,OAAQL,KAAKg8G,QAAQ37G,QAEzB,CAEUq7G,gBACN17G,KAAK+b,OACP/b,KAAKy7G,SAAU,EACfz7G,KAAKo8G,OAASp8G,KAAKq8G,OAAS,EAC5Br8G,KAAK87G,MACH97G,KAAK+7G,MACL/7G,KAAKg8G,QACLh8G,KAAK47G,iBACL33G,CACJ,E,yFCnJa,MAAMw4G,UAAsB,KAIzC18G,YAAY8tB,EAER,CAAC,GACH3b,MAAM,OAAD,QACHs1B,MAAO,mCAEPtvB,KAAM,SACH2V,IAVC,KAAA6uF,QAAS,EACV,KAAAC,UAAY,GAYjB38G,KAAKoL,UAAUmI,UAAUxS,IAAI,qBAE7B,MAAM67G,EAAQ58G,KAAK+wB,MACnB,GAAG6rF,aAAiBC,iBAClBD,EAAMh7G,KAAO,MACbg7G,EAAM/8D,aAAe,qBAChB,CACL+8D,EAAMh/C,UAAY,UAElB,MAAMk/C,EAAappG,OAAO0vC,iBAC1B,GAAG05D,EAAa,EAAG,CACjB,IAAIC,EACD,EAAAhtG,SACDgtG,GAA8B,IAAdD,EACR,EAAAE,aACRD,EAAgB,GAGlBH,EAAMrxG,MAAMssE,YAAY,mBAAoBklC,EAAgB,K,CAG9D,MAAME,EAAej9G,KAAKk/C,iBAAiB5kC,KAAKta,MAChDA,KAAKk/C,iBAAoBxyC,IACvBuwG,EAAavwG,IACb,OAAgB1M,KAAK+wB,OAAO,EAAK,C,CAIrC6rF,EAAMhvG,iBAAiB,SAAS,KAE9BgvG,EAAMrpG,UAAU/Q,OAAO,SAEvB,MAAMkK,EAAQ1M,KAAK0M,MAUnB,IAAIwwG,EATS12G,KAAKuZ,IAAIrT,EAAM7J,OAAS7C,KAAK28G,UAAU95G,QAC1C,IAAM7C,KAAK08G,QAAU,EAAAphG,iBAC7Btb,KAAKk/C,iBAAiBl/C,KAAK28G,UAAYjwG,GAGzC1M,KAAK08G,QAAS,EAEd18G,KAAK+/C,WAGL,IAAIjiB,EAAmByiB,EAAsBa,EAA8B+7D,EAAc,GACnD,MAAnCn9G,KAAK0M,MAAMia,QAAQ,MAAO,KAC3B3mB,KAAKk/C,iBAAiB,MAEtBg+D,GAAuB,OAAkBl9G,KAAK0M,OAC9CoxB,EAAYo/E,EAAqBp/E,UACjCyiB,EAAU28D,EAAqB38D,QAC/B48D,EAAcD,EAAqBC,YACnC/7D,EAAc87D,EAAqBrjG,KACnC7Z,KAAKk/C,iBAAiBl/C,KAAK28G,UAAY7+E,EAAY,IAAMA,EAAY,KAGvE8+E,EAAMv2F,QAAQ82F,YAAcA,EAI5BtvF,EAAQ6W,SAAW7W,EAAQ6W,QAAQw4E,EAAqB,IAG1DN,EAAMhvG,iBAAiB,SAAS,KAC9B5N,KAAK08G,QAAS,CAAI,IAQpBE,EAAMhvG,iBAAiB,YAAa7F,IAElC,MAAMyE,EAAMzE,EAAEyE,IACd,GAAG,KAAKs2C,KAAKt2C,KAAUzE,EAAE6V,UAAW7V,EAAE4V,SAAoB,cAARnR,IAAiC,MAARA,IAAezE,EAAEq1G,UAE1F,OADAr1G,EAAE2qB,kBACK,C,GAOb,E,oGCnGF,MAAM2qF,EAAUhyG,SAASC,cAAc,OAEvC,IAAIqO,EADJ0jG,EAAQ9pG,UAAUxS,IAAI,SAGtB,MAAMmmB,EAAI,IAAI,IAAoB,SAO3B,SAASo2F,IACdp2F,EAAEtU,QAEFyqG,EAAQ9pG,UAAU/Q,OAAO,cACzBmX,GAAWlG,cAAckG,GAEzBA,EAAUjG,OAAOhR,YAAW,KAC1B26G,EAAQ76G,SACRmX,OAAU1V,CAAS,GAClB,IACL,CAEO,SAASkoB,EAAMxZ,EAAwBwI,GAC5C+L,EAAEtU,SAEF,OAAeyqG,EAAS1qG,GAEpB0qG,EAAQpkG,gBACV5N,SAASI,KAAKC,OAAO2xG,GAChBA,EAAQ55F,YAGf45F,EAAQ9pG,UAAUxS,IAAI,cAEtB4Y,GAAWlG,cAAckG,GACzBuN,EAAEkE,KAAKiyF,GAEP1jG,EAAUjG,OAAOhR,WAAW46G,EAAW,KAEpCniG,GACD+L,EAAEtZ,iBAAiB,SAAUuN,EAAS,CAAClN,MAAM,GAEjD,CAEO,SAASsvG,EAAS1vF,GAKvB1B,GAAM,QAAK0B,EAAQzB,YAAayB,EAAQgiC,mBAAoBhiC,EAAQ1S,QACtE,CA9CA+L,EAAEtZ,iBAAiB,UAAWwd,IACxBA,GACFkyF,G,uGCAJ,MA4FME,EAAqE,CACzEC,WA7F6C,CAC7ClrF,SAAU,CAACwD,EAAY2nF,EAAgBp5C,KACrC,MAAMhhD,EAAQo6F,EAAel7F,wBAAwBc,MAC/CkC,EAAW,CAACuQ,EAAY2nF,GAY9B,OAXGp5C,GAAS9+C,EAAStU,UACrBsU,EAAS,GAAGja,MAAM6tB,OAAS,kBAC3B5T,EAAS,GAAGja,MAAMsR,UAAY,eAAwB,KAARyG,aAC9CkC,EAAS,GAAGja,MAAMsR,UAAY,eAAeyG,aAE7CyS,EAAWxiB,UAAUxS,IAAI,UACpBg1B,EAAW4R,YAEhB5R,EAAWxqB,MAAMsR,UAAY,GAC7BkZ,EAAWxqB,MAAM6tB,OAAS,GAEnB,KACLskF,EAAenyG,MAAMsR,UAAY6gG,EAAenyG,MAAM6tB,OAAS,EAAE,CAClE,EAEHukF,cAAc,GA2EdxqF,KAxEuC,CACvCZ,SAAU,CAACwD,EAAY2nF,EAAgBp5C,KAWrC,MAAMhhD,EAAQo6F,EAAel7F,wBAAwBc,MAM/CkC,EAAW,CAACuQ,EAAY2nF,GAW9B,OAVGp5C,GAAS9+C,EAAStU,UACrBsU,EAAS,GAAGja,MAAMsR,UAAY,gBAAgByG,aAC9CkC,EAAS,GAAGja,MAAMsR,UAAY,eAAeyG,aAE7CyS,EAAWxiB,UAAUxS,IAAI,UACpBg1B,EAAW4R,YAEhB5R,EAAWxqB,MAAMsR,UAAY,GAGtB,KACL6gG,EAAenyG,MAAMsR,UAAY,EAAE,CAkBpC,EAEH8gG,cAAc,IA4PhB,EA/M0B9vF,IACxB,IAAI,QACFlb,EAAO,KACP/Q,EAAI,eACJq3D,EAAc,gBACd5kC,EAAe,QACf4gF,GAAU,EAAI,KACdhnG,GAAO,EAAK,sBACZ2vG,GAAwB,EAAI,eAC5B/rG,EAAc,aACd8rG,GAAe,GACb9vF,EAEJ,MAAO0E,SAAUsrF,EAAmBF,aAAcG,GAAiBN,EAAY57G,IAAS,CAAC,EACzF+Q,EAAQ0T,QAAQ5lB,UAAYmB,OAEPqC,IAAlB65G,IACDH,EAAeG,GAGjB,MAAMC,EAAuD,IAAIx8G,IACjE,IAAIy8G,EAEA7kG,EAAoB,KAExB,GAAGykG,EAAuB,CACxB,MAAMK,EAAeJ,EAAoB,gBAAkB,eAErDK,EAAcn2G,IAGlB,IAFA,OAAYA,GAERA,EAAE1H,OAAuB4Y,gBAAkBtG,EAC7C,OAKF,MAAM4f,EAAWwrF,EAAyB96G,IAAI8E,EAAE1H,QAChDkyB,SAAAA,IAEGxqB,EAAE1H,SAAW8Y,KAIZ6kG,GAAqB/I,IAEtB+I,IACDA,EAAkB7vG,UAClB6vG,OAAoB/5G,GAGtBowB,SAAAA,EAAkBiB,EAAUD,UAE5B1iB,EAAQY,UAAU/Q,OAAO,YAAa,YAAa,iBAEhDyL,IACE4D,EAAgBA,EAAe0nC,aAAa5mC,EAASsrG,EAAcC,GACjEvrG,EAAQjB,oBAAoBusG,EAAcC,GAC/C/kG,EAAO6kG,OAAoB/5G,EAC3B85G,EAAyBv8F,U,EAK1B3P,EAAgBA,EAAe9Q,IAAI4R,EAAnBd,CAA4BosG,EAAcC,GACxDvrG,EAAQ/E,iBAAiBqwG,EAAcC,E,CAG9C,SAAS5oF,EAAU1tB,EAA0BouB,GAAU,EAAMmoF,GACxDA,IACDhlG,EAAOglG,GAGNv2G,aAAcpE,cACfoE,GAAK,OAAWA,IAGlB,MAAMytB,EAASC,EAAUD,SACzB,GAAGztB,IAAOytB,EAAQ,OAAO,EAIzB,MAAM0yE,EAAKp1F,EAAQ4iB,SAAS3tB,GAM5B,GAJI,kCAAqD,IAAZytB,GAAkBsoF,KAC7D3nF,GAAU,IAGR4nF,EAAuB,CACzB,MAAMjkG,EAAUhH,EAAQ0T,QAAQ1M,aACjB1V,IAAZ0V,GACDlG,cAAckG,UAGThH,EAAQ0T,QAAQ1M,O,CAGzB,IAAIqc,EAAS,CACX,GAAG7c,EAAMA,EAAK5F,UAAU/Q,OAAO,SAAU,KAAM,aAC1C,GAAGulG,EAAI,CACV,MAAMx1E,EAAWwrF,EAAyB96G,IAAI8kG,GAC9Cx1E,SAAAA,G,CAaF,OAVGw1E,IACDA,EAAGx0F,UAAU/Q,OAAO,KAAM,QAC1BulG,EAAGx0F,UAAUxS,IAAI,WAGnB4R,EAAQY,UAAU/Q,OAAO,YAAa,YAAa,iBAEnD2W,EAAO4uF,OAEP1zE,SAAAA,EAAkBzsB,G,CAIhBg2G,IACFjrG,EAAQ0T,QAAQ1M,QAAU,GAAKjG,OAAOhR,YAAW,KAC/CqlG,EAAGx0F,UAAU/Q,OAAO,MACpB2W,GAAQA,EAAK5F,UAAU/Q,OAAO,QAC9BmQ,EAAQY,UAAU/Q,OAAO,YAAa,YAAa,wBAC5CmQ,EAAQ0T,QAAQ1M,OAAO,GAC7Bs/C,IAGF9/C,IACDA,EAAK5F,UAAU/Q,OAAO,MACtB2W,EAAK5F,UAAUxS,IAAI,SAGrB4R,EAAQY,UAAUxS,IAAI,aACtB,MAAMujE,EAAUjvC,EAASztB,EAGzB,IAAIw2G,EAcJ,GAhBAzrG,EAAQY,UAAU1J,OAAO,aAAcy6D,GAGnCyjC,IAGC8V,EACDO,EAA0BP,EAAkB9V,EAAI5uF,EAAMmrD,GAEtDyjC,EAAGx0F,UAAUxS,IAAI,UAGnBgnG,EAAGx0F,UAAU/Q,OAAO,QACpBulG,EAAGx0F,UAAUxS,IAAI,OAGhBgnG,EAAI,CACL,MAAMsW,EAAoBtW,EAAG1hF,QAAQg4F,kBAClCA,GACD5qG,cAAc4qG,GAGhBN,EAAyBn6G,IAAImkG,GAAI,KAC/BA,EAAGx0F,UAAU/Q,OAAO,MACpBu7G,EAAyB98G,OAAO8mG,EAAG,G,CAIvC,GAAG5uF,EAAqB,CACtB,IAAIQ,EACJ,MAAM2kG,EAAQnlG,EACRoZ,EAAW,KACf9e,aAAakG,GACb2kG,EAAM/qG,UAAU/Q,OAAO,SAAU,QAEjC47G,SAAAA,IAEAL,EAAyB98G,OAAOq9G,EAAM,EAGrCvW,GACDpuF,EAAUjG,OAAOhR,WAAW6vB,EAAU0mC,EAAiB,KACvD8kD,EAAyBn6G,IAAI06G,EAAO/rF,KAEpC5Y,EAAUjG,OAAOhR,WAAW6vB,EAAU0mC,GACtC8kD,EAAyBn6G,IAAI06G,GAAO,KAClC7qG,aAAakG,GACbokG,EAAyB98G,OAAOq9G,EAAM,KAI1CA,EAAMj4F,QAAQg4F,kBAAoB,GAAK1kG,EAEpCs7F,IACG+I,IACFA,GAAoB,WAItB,QAA4BA,EAAoC,EAAjB/kD,G,CAInD9/C,EAAO4uF,CACT,CAOA,OAJAzyE,EAAUD,OAAS,IAAMlc,GAAO,OAAWA,IAAS,EACpDmc,EAAUu1E,QAAU,IAAM1xF,EAC1Bmc,EAAUw1E,QAAWwT,GAAuBnlG,EAAOmlG,EAE5ChpF,CAAS,C,sEClVH,SAASipF,EAAgBhhF,GACtC,OAASA,EAAS16B,QAAU,GAAK06B,EAAS16B,QAAU,KAAQ06B,EAAS16B,SAAW,kBAAkBigD,KAAKvlB,EACzG,CCWO,MAAMihF,UAA2B,KActCz+G,YACE8tB,EACQ5mB,GAERiL,MAAM2b,GAFE,KAAA5mB,SAAAA,EAIRjH,KAAKy+G,wBAAyB,EAAAhlG,EAAA,GAASzZ,KAAK0+G,cAAcpkG,KAAKta,MAAO,KAAK,GAAO,GAElF6tB,EAAQhc,eAAe9Q,IAAIf,KAAK+wB,MAAhClD,CAAuC,SAAS,K,YAC9C,MAAMnhB,EAAQ1M,KAAKquG,WAGnB,GADAruG,KAAKqsB,WAAQpoB,EACVyI,IAAU1M,KAAKu+D,gBAAkB7xD,EAAM7J,OAGxC,OAFA7C,KAAK2+D,SAAS,mBACO,QAArB,KAAA3+D,KAAK6tB,SAAQ4C,gBAAQ,kBAEZ8tF,EAAgB7xG,GAGzB1M,KAAK2+D,SAAS,cAFd3+D,KAAK6+D,SAAS7+D,KAAK6tB,QAAQg8E,aAK1B7pG,KAAK+wB,MAAMxd,UAAUqB,SAAS,SACV,QAArB,KAAA5U,KAAK6tB,SAAQ4C,gBAAQ,iBAIvBzwB,KAAKy+G,uBAAuB/xG,EAAM,GAEtC,CAEO2hG,WACL,IAAI3hG,EAAQ1M,KAAK0M,MAMjB,OALG1M,KAAK6tB,QAAQygF,OACd5hG,EAAQA,EAAM4qB,MAAMt3B,KAAK6tB,QAAQygF,KAAKzrG,QACtC7C,KAAKk/C,iBAAiBl/C,KAAK6tB,QAAQygF,KAAO5hG,IAGrCA,CACT,CAEQgyG,cAAcnhF,GACpB,GAAGv9B,KAAK2+G,qBAAsB,OAG9B,IAAIC,EADJ5+G,KAAKqsB,WAAQpoB,EAGX26G,EADC5+G,KAAK6tB,QAAQ7lB,OACChI,KAAKiH,SAASq5B,gBAAgBo+E,cAAc1+G,KAAK6tB,QAAQ7lB,OAAOs1B,WAAYC,GAE5Ev9B,KAAKiH,SAASy2B,gBAAgBghF,cAAcnhF,GAG7D,MAAMhvB,EAAUvO,KAAK2+G,qBAAuBC,EAAatwG,MAAMuwG,IAC1D7+G,KAAKquG,aAAe9wE,IAEpBshF,EACD7+G,KAAK2+D,SAAS,WAAkB3+D,KAAK6tB,QAAQ87E,eAE7C3pG,KAAK6+D,SAAS7+D,KAAK6tB,QAAQ+7E,W,IAE3BpkG,IACCxF,KAAKquG,aAAe9wE,IAEvBv9B,KAAKqsB,MAAQ7mB,EAEN,gCADCA,EAAiB5D,KAErB5B,KAAK6+D,SAAS7+D,KAAK6tB,QAAQ+7E,WAM3B5pG,KAAK6+D,SAAS7+D,KAAK6tB,QAAQg8E,a,IAI9Bv7F,MAAK,K,QACHtO,KAAK2+G,uBAAyBpwG,IAC/BvO,KAAK2+G,0BAAuB16G,GAGT,QAArB,KAAAjE,KAAK6tB,SAAQ4C,gBAAQ,iBAErB,MAAM/jB,EAAQ1M,KAAKquG,WAChB3hG,IAAU6wB,GAAYv9B,KAAKw+D,mBAAqB+/C,EAAgB7xG,IACjE1M,KAAK0+G,cAAchyG,E,GAGzB,E,gdC5Fa,MAAMoyG,UAAyB,IAG5C/+G,YAAY8tB,GAO6C3b,MAAM,CAC3DgG,KAAM,yBACN5E,QAAUua,EAAQ7lB,OAAOo3B,SAAoC,uBAAzB,yBAGtC,MAAM,OAACp3B,EAAM,KAAE20B,EAAI,mBAAE8sE,EAAkB,eAAE53F,EAAc,WAAEwhB,GAAcxF,EACjE5mB,EAAW,aACXiyF,EAAYlxF,EAAOo3B,cAAWn7B,EAAY+D,EAAOs1B,WAEjD8H,EAAUplC,KAEV++G,EAAa,YACbvvF,EAAOnkB,SAASC,cAAc,OAGpC,IAAI0zG,EAFJxvF,EAAKjc,UAAUxS,IAAIg+G,GAQnB,MAAME,EAAa,IAAI,IAA2B,CAChD5H,SAAWn1G,GAAY88G,EAAWn8G,OAASm8G,EAAWh2G,WAAWu0B,GAAaA,EAASA,WAAar7B,EAAQ0F,KAC5G2vG,SAAWr1G,IACTA,EAAQi5B,IAAI/vB,UAAU5I,QAAQ,EAEhCkwF,OAAQ,CAACxwF,EAAS6G,MAChB,OAAuB7G,EAAQi5B,IAAI/vB,UAAWokB,EAAMzmB,EAAI,EAE1D6uG,gBAAkBC,IAChB,MAAMt6E,EAAWyhF,EAAWt+G,MAAM68B,GAAaA,EAASA,WAAas6E,EAAKjwG,KACpEuzB,EAAM,IAAI,KAAI,CAClBpsB,MAAO,IAAMwuB,EAASA,SACtBlC,UAAU,EACVjM,WAAW,IAGP8vF,IAAa3hF,EAAS9vB,OAAOyxG,SAC7Bp9F,IAAWyb,EAAS9vB,OAAOqU,OAejC,OAbGo9F,IAAU/jF,EAAI/vB,UAAUib,QAAQ64F,SAAW,KAC9C/jF,EAAI/vB,UAAUib,QAAQkX,SAAWA,EAASA,SAC1CpC,EAAI/vB,UAAUmI,UAAUxS,IAAIg+G,EAAa,aACzC5jF,EAAIE,SAAS9nB,UAAUxS,IAAIg+G,EAAa,oBAC1B5jF,EAAIogD,YAAY,UACxBhoE,UAAUxS,IAAIg+G,EAAa,iBAAkB,SAEnD5jF,EAAIsgD,eAEJ0jC,EAAahkF,EAAKrZ,GAEjB+1F,EAAwB18E,IAAMA,EAExB08E,CAAsB,IAI3BsH,EAAe,CAAChkF,EAAUrZ,KAC9BqZ,EAAIE,SAAS6D,iBAAgB,QAAK/D,EAAI/vB,UAAUib,QAAQ64F,SAAW,uBAA0Bp9F,EAAS,qBAAuB,yBAC7HqZ,EAAI/vB,UAAUmI,UAAU1J,OAAO,SAAUiY,GACzCqZ,EAAIwgD,cAAc75D,EAAO,EAGrBs9F,EAAiB,CAAC53C,EAAwB,MAC9Cw3C,EAAax3C,EAEby3C,EAAWI,SAASt6G,SAAS7C,IACvBslE,EAAUtN,MAAM38B,GAAaA,EAASA,WAAar7B,EAAQ0F,MAC7Dq3G,EAAWh+G,OAAOiB,EAAQ0F,G,IAI9B4/D,EAAUziE,SAASw4B,IACjB,GAAI0hF,EAAW57G,IAAIk6B,EAASA,UAErB,CACL,MAAMr7B,EAAU+8G,EAAWh8G,IAAIs6B,EAASA,UACxC0hF,EAAWxgF,OAAOlB,EAASA,SAAUr7B,GACrCi9G,EAAaj9G,EAAQi5B,MAAOoC,EAAS9vB,OAAOqU,O,MAJ5Cm9F,EAAWl+G,IAAIw8B,EAASA,S,IAQ5B6H,EAAQh6B,UAAUmI,UAAU1J,OAAO,QAASo1G,EAAWI,SAASx3G,KAAK,EAGvEu3G,EAAeziF,EAAK6qC,WAEpB31D,EAAe9Q,IAAI,IAAnB8Q,CAA8B,mBAAmB,EAAO7J,OAAQs3G,KAAa,EAAD,gCAC1E,GAAGA,IAAYt3G,EACb,OAGF,MAAM20B,QAAa11B,EAASqI,gBAAgBstB,QAAQ50B,GACpDo3G,EAAgBziF,EAAmB6qC,UACrC,MAEA,IAAI+3C,GAAc,GAClB,QAAiB/vF,GAAYznB,GAAM,EAAD,gCAChC,GAAGw3G,EAED,YADAA,GAAc,GAIhB,MAAMn0G,GAAY,OAAcrD,EAAE1H,OAAuBmvB,GACzD,IAAIpkB,EACF,OAGF,GAAGA,EAAUib,QAAQ64F,SAEnB,YADA,OAAgBzV,EAAmB14E,OAAO,GAAM,GAIlD,MAAMwM,EAAWnyB,EAAUib,QAAQkX,SAE7Bzb,EAAS1W,EAAUmI,UAAUqB,SAAS,UAC5C,IAAIqiD,EAA2BC,EAC5Bp1C,GACDm1C,EAAe,yBACfC,EAAqBgiC,EAAY,uCAAyC,yCAE1EjiC,EAAe,uBACfC,EAAqBgiC,EAAY,qCAAuC,sCAG1E,UACQ,OAAkB,CACtBjiC,eACAC,qBACA5gD,OAAQ,CACN6gD,QAASr1C,EAAS,OAAS,S,CAG/B,MAAMtc,GACN,M,CAGF,MAAMg6G,GAAa19F,EACnB,IAAIvT,EAEFA,EADC2qF,EACSjyF,EAASq5B,gBAAgBm/E,eAAevmB,EAAW37D,EAAUiiF,GAE7Dv4G,EAASy2B,gBAAgB+hF,eAAeliF,EAAUiiF,GAG9DjxG,EAAQ0J,OAAOzS,IACG,8BAAbA,EAAI5D,MACL,OAAkB,CAChBq1D,aAAc,6BACdC,mBAAoB,+BACpB5gD,OAAQ,CAAC6gD,QAAS,KAAM/W,UAAU,KACjCnoC,MAAM,KAET7L,QAAQigB,MAAM,sBAAuB7mB,E,GAG3C,MAEA,IAAI,IAAS,CACXgqB,OACA6D,aACAq/D,OAAQ,CAAC3pF,EAAK6pF,KACZ,MAAMr1D,EAAWyhF,EAAW1wF,OAAOvlB,EAAK,GAAG,GAC3Ci2G,EAAW1wF,OAAOskE,EAAQ,EAAGr1D,GAC7B0hF,EAAW/G,aAIX,MAAM1wC,EAAYw3C,EAAW5lF,QAAQmE,GAAaA,EAAS9vB,OAAOqU,SAAQhH,KAAKyiB,GAAaA,EAASA,WAClG27D,EACDjyF,EAASq5B,gBAAgBo/E,iBAAiBxmB,EAAW1xB,GAErDvgE,EAASy2B,gBAAgBgiF,iBAAiBl4C,E,IAKhDpiC,EAAQzyB,QAAQjH,OAAO8jB,EACzB,E,+CCzMa,MAAMmwF,EAKnB5/G,YAAYwzD,EAAwC1lC,GAH5C,KAAAc,MAAkC,IAAIptB,IACtC,KAAAq+G,QAAS,EAGf5/G,KAAKC,SAAW,IAAIC,sBAAsBC,IACxC,GAAGH,KAAK4/G,OACN,OAGF,MAAMl4D,EAAoC,GAE1CvnD,EAAQ4E,SAAQ,CAAC3E,EAAOguB,KACtB,MAAM/tB,EAASD,EAAMC,OAErB,GAAGL,KAAK2uB,MAAM1rB,IAAI5C,KAAYD,EAAMS,eAClC,OAEAb,KAAK2uB,MAAM/qB,IAAIvD,EAAQD,EAAMS,gBAW/B,MAAMg/G,EAA4B,CAACx/G,SAAQS,QAASV,EAAMS,eAAgBT,QAAOguB,SAIjFs5B,EAAQrlD,KAAKw9G,EAAO,IAKtBn4D,EAAQ3iD,SAAS/B,IACfuwD,EAAmBvwD,EAAK,GACxB,GACD6qB,EACL,CAEO0+B,aACL,MAAM59B,EAAsB,GAO5B,OANA3uB,KAAK2uB,MAAM5pB,SAAQ,CAAC2H,EAAOF,KACtBE,GACDiiB,EAAMtsB,KAAKmK,E,IAIRmiB,CACT,CAEO69B,eACL,MAAM1rD,EAAUd,KAAKusD,aACrB,IAAI,MAAMlsD,KAAUS,EAClBd,KAAK2uB,MAAM/qB,IAAIvD,GAAQ,EAE3B,CAEO8f,UAAU9f,GACf,OAAOL,KAAK2uB,MAAM1rB,IAAI5C,EACxB,CAEO+1D,aACLp2D,KAAKC,SAASm2D,aACdp2D,KAAK2uB,MAAMnN,OACb,CAEO0oC,UACLlqD,KAAKC,SAASm2D,aAGd,MAAMj/B,EAAU,IAAIn3B,KAAK2uB,MAAMvqB,QAC/B,IAAI,MAAM/D,KAAU82B,EAElBn3B,KAAKC,SAAS0D,QAAQtD,EAG1B,CAEOy/G,iBACL,MAAMh/G,EAAUd,KAAKusD,aACrB,IAAI,MAAMlsD,KAAUS,EAClBd,KAAKC,SAAS6C,UAAUzC,GAG1B,IAAI,MAAMA,KAAUS,EAClBd,KAAKC,SAAS0D,QAAQtD,EAE1B,CAEOsD,QAAQtD,GACbL,KAAK2uB,MAAM/qB,IAAIvD,GAAQ,GACvBL,KAAKC,SAAS0D,QAAQtD,EACxB,CAEOyC,UAAUzC,GACfL,KAAKC,SAAS6C,UAAUzC,GACxBL,KAAK2uB,MAAM1tB,OAAOZ,EACpB,CAEO4pD,SACLjqD,KAAK4/G,QAAS,CAChB,CAEOloF,mBACL13B,KAAKiqD,SACLjqD,KAAKkqD,SACP,CAEO/kD,OACLnF,KAAK4/G,QAAS,CAChB,E,yFCjHa,MAAMG,UAAuB,IAK1ChgH,YAAsB8R,EAA0CoR,GAAW,GACzE/Q,MAAM,CACJgN,KAAM,IACNtY,IAAK,EACLH,IAAK,EACLwc,YACC,GANiB,KAAApR,eAAAA,EAA0C,KAAAoR,SAAAA,EAsCxD,KAAA+8F,YAAej4G,IACrBA,IAAK,OAAYA,GACjB,WAAoC,SAAgC,EAG/D,KAAAk4G,UAAY,KAEjB,MAAM,OAACnzG,EAAM,MAAEC,GAAS,IACxB,IACImzG,EAEFA,GADEpzG,GAAUC,EACA,EACJD,EAAS,GACL,EACJA,EAAS,GAAKA,EAAS,IACnB,EAEA,EAGdizG,EAAeI,MAAMp7G,SAASgP,GAAS/T,KAAK+T,KAAKR,UAAU/Q,OAAO,SAAWuR,KAC7E/T,KAAK+T,KAAKR,UAAUxS,IAAI,SAAWg/G,EAAeI,MAAMD,IAEpDlgH,KAAKogB,WACPpgB,KAAKsgB,YAAYvT,EAAQ,EAAID,E,EAtD/B9M,KAAKqU,eACLrU,KAAKof,YAAY,CACfC,QAAS9Y,IACP,MAAMmG,EAAQlG,KAAKC,IAAID,KAAKI,IAAIL,EAAa,GAAI,GAIjD,WAAmC,EACnC,WAAoCmG,CAAK,IAQ7C,MAAM2O,EAAY,gBACZrC,EAAMhZ,KAAKgZ,IAAM3N,SAASC,cAAc,OAC9C0N,EAAIzF,UAAUxS,IAAI,WAAYsa,GAC9B,MAAMtH,EAAO/T,KAAK+T,KAAO1I,SAASC,cAAc,QAChDyI,EAAKR,UAAUxS,IAAIsa,EAAY,UAE/BrC,EAAItN,OAAOqI,EAAM/T,KAAKoL,YAEtB,QAAiB2I,EAAM/T,KAAKggH,YAAa,CAACnuG,eAAgB7R,KAAK6R,iBAC/D7R,KAAK6R,eAAe9Q,IAAI,IAAxBf,CAAoD,iBAAkBA,KAAKigH,WAE3EjgH,KAAKigH,WACP,EAxCe,EAAAE,MAAQ,CAAC,aAAc,cAAe,cAAe,Y,qECLvD,SAASC,GAAgB,OACtC5qC,EAAM,aACN9hD,EAAY,WACZL,EAAU,cACVhV,EAAa,gBACb40C,EAAe,eACfj6B,IAKA,MAAMhlB,EAAO,IAAIqsG,OAAO7qC,EAAO3yE,QACzBwS,EAA4B,GAmBlC,OAlBAmgE,EAAOzwE,SAAQ,CAACqC,EAAO2B,KACrBsM,EAAShT,KAAK,CACZuN,EAAG,2BACHsqB,OAAQnxB,EACRlG,OAAQ,EACR6tF,YAAatpF,GACb,KAGY,QAAa4M,EAAM,CACjCqB,WACAqe,eACAsF,iBACAi6B,kBACA5/B,aACAhV,iBAIJ,CAEO,SAASiiG,EAAuBzyF,G,MACrC,MAAM6F,EAAmD,QAAvC,EAAmB7F,EAAQ6F,oBAAY,QAApB7F,EAAQ6F,aAAiB,GACxD6E,EAAU6nF,EAAgBvyF,GAChC,OAAOzM,QAAQgI,IAAIsK,GAAcplB,MAAK,IAAMiqB,GAC9C,C,uiBCFe,SAAegoF,GAAa,QAACp4G,EAAO,SAAEoxB,EAAQ,WAAEC,EAAU,aAAEC,EAAY,WAAEtF,EAAU,cAAE/pB,EAAa,aAAEspB,EAAY,iBAAEgG,EAAgB,cAAErb,EAAa,SAAEquB,EAAQ,SAAEzlC,EAAW,aAAkB,aAAEM,EAAY,SAAEklC,EAAQ,QAAE9S,I,+CAgBlOH,UAAAA,EAAe,KACfkT,UAAAA,EAAa,IACbD,UAAAA,EAAa,IACb,MAAM+zE,EAAsC,IAArB9mF,EAEjB/3B,EAAQwG,EAAQzC,MAA4C2F,UAAclD,EAAQzC,MAA2Co0B,QAA4BzuB,SACzJo1G,EAAiBt4G,aAAO,EAAPA,EAASkhC,kBAChC,GAAgB,UAAb1nC,EAAIC,MAAiC,UAAbD,EAAIC,MAAiC,UAAbD,EAAIC,KAAkB,CACvE,MAAM8+G,EAAe,IAAI,KAgBzB,OAfAA,EAAannF,SAAWA,EACxBmnF,EAAav4G,QAAUA,EACvBu4G,EAAaF,eAAiBA,EAC9BE,EAAariG,cAAgBA,EAC7BqiG,EAAahtF,aAAeA,EAC3BgtF,EAAqB/mF,QAAUA,EAE7BF,IAAcinF,EAAajnF,aAAeA,GAC1CrvB,IAAes2G,EAAat2G,cAAgBA,GAC5C+pB,IAAYusF,EAAavsF,WAAaA,GAEzCusF,EAAar6F,QAAQmT,WAAa,GAAKA,EACvCknF,EAAar6F,QAAQomB,SAAW,GAAKA,EACrCi0E,EAAar6F,QAAQqmB,SAAWA,QAC1Bg0E,EAAaz3E,SACZy3E,C,CAGT,MAAMC,EAAch/G,EAAIkO,UAAYlO,EAAIkO,UAAUsU,MAAM,KAAO,GAC/D,IAAIy8F,EAAM,GACVA,EAAMD,EAAY99G,OAAS,GAAKqW,MAAMi8D,QAAQwrC,IAC5C,QAAqBA,EAAYl7F,MAAMtB,MAAM,IAAK,GAAG,GAAGuE,eACxD,OAEF,MAAMm4F,EAASx1G,SAASC,cAAc,OACtCu1G,EAAOttG,UAAUxS,IAAI,WAAY,OAAO6/G,KACxCC,EAAOx6F,QAAQjf,MAAQ,GAAKzF,EAAIiG,GAC/Bi5G,EAAel/G,IAAMA,EAItB,MAAMm/G,EAASz1G,SAASC,cAAc,OAEtC,IAAIy1G,EADJD,EAAOvtG,UAAUxS,IAAI,gBAGrB,MAAMigH,IAAez5G,EACfE,EAAkB,IACfu5G,EAAaz5G,EAAeN,EAASO,cAAcC,gBAAgB9F,GAG5E4F,QAAqBE,IACrB,IAAIw5G,GAAW,EACf,IAAc,QAAV,EAAAt/G,EAAIsN,cAAM,eAAEpM,SAAWsF,EAAQsF,OAAO27B,aAAe7hC,EAAaG,KAAoB,UAAb/F,EAAIC,KAA2D,CAC1Ii/G,EAAOttG,UAAUxS,IAAI,uBACrBkgH,GAAW,EAEX,MAAMz0F,EAAoE,GAE1E,GAAGrkB,EAAQsF,OAAO27B,aAAe,CAAC,QAAS,SAASr0B,SAASpT,EAAIC,OAAS2F,EAAaG,IACrFo5G,EAAOthG,UAAY,aAAajY,EAAaG,QAC7C8kB,EAAKnqB,KAAKy+G,EAAOvrG,uBACZ,CACQ2rG,YAAYl5F,MAAzB,MACMuQ,QAAgB,OAAU,CAC9BO,MAAOn3B,EACPwG,QAAS,KACTiD,UAAW01G,EACXroF,SAAU,GACVC,UAAW,GACXhF,eACAkF,kBAAkB,EAClBva,gBACAxW,MAAM,OAAgBlG,EAAK,GAAI,IAAI,GACnCsF,aAGF65G,EAAOv1G,MAAM+X,MAAQw9F,EAAOv1G,MAAMmY,OAAS,GACxC6U,EAAQW,OAAO7pB,OAAOmd,EAAKnqB,KAAKk2B,EAAQW,OAAO7pB,OAC/CkpB,EAAQW,OAAOC,MAAM3M,EAAKnqB,KAAKk2B,EAAQW,OAAOC,K,CAGnD3M,EAAKznB,SAASylB,GAAQA,EAAIjX,UAAUxS,IAAI,mB,MAExCggH,EAAY11G,SAASC,cAAc,QACnCy1G,EAAUxtG,UAAUxS,IAAI,qBACxBggH,EAAUjmF,UAAY8lF,EACtBE,EAAOp1G,OAAOq1G,GAIhB,MAAMI,EAAWx/G,EAAIkO,WAAY,OAAclO,EAAIkO,WAAa,eAC1CxE,SAASC,cAAc,OAC/BiI,UAAUxS,IAAI,wBAC5B,MAAMqgH,EAAiB/1G,SAASC,cAAc,QAIxC+1G,EAAgE,EAHtD,OAAY1/G,EAAIkG,OAahC,GARG0xB,GACD8nF,EAAiBh/G,MAAK,QAAmB8F,EAAQqO,OAGhD2d,GACDktF,EAAiBh/G,WAAW,OAAiB8F,KAG3CoxB,IAAapF,EAAY,CAC3B,MAAM6d,EAAI3mC,SAASC,cAAc,QAC3Bg2G,GAAa,OAAY3/G,EAAIkG,MACnCmqC,EAAEtmC,OAfgB,MAeI41G,GACtBtvE,EAAEzmC,MAAM+N,WAAa,SACrB+nG,EAAiBh/G,KAAK2vC,E,CAGxB6uE,EAAOrhG,UAAY,OAChBjY,EAAakjB,aAAeg2F,IAAoBt4G,EAAQF,MAAQg5G,EAAW,GAAK,wHAKnF,MAAMl0B,EAAU8zB,EAAOjpG,cAAc,kBAC/B40B,EAAmB,IAAI,IAC7BA,EAAiBnmB,QAAQmT,WAAa,GAAKA,EAC3CgT,EAAiBnmB,QAAQomB,SAAW,GAAKA,EACzCD,EAAiBnmB,QAAQqmB,SAAWA,EACnCF,EAAyB7S,QAAUA,EACpC6S,EAAiB5zB,YAAcuoG,EAI3Bh5G,EAAQF,KACV44G,EAAOttG,UAAUxS,IAAI,cAGvBgsF,EAAQrhF,OAAO8gC,GAEZrY,GACD44D,EAAQrhF,QAAO,OAAavD,IAG9B,MAAMo5G,EAAUV,EAAOjpG,cAAc,kBAMrC,GALAwpG,EAAe11G,WAAU,QAAiB21G,EAAkB,QAC5DE,EAAQ71G,OAAO01G,GAEfP,EAAO7oG,QAAQ8oG,IAEXL,GAAkBt4G,EAAQsF,OAAO27B,cAAgBjhC,EAAQF,IAC3D,OAAO44G,EAGT,IAAIt3E,GAA0BvtB,GAAkC,KAChE,MAAM+hB,GAAS,KAGb,GAFA8iF,EAAOttG,UAAU/Q,OAAO,eAEDb,EAAIkG,KAAO,OAAuB44G,EAKvD,OAJAzkG,GAAU0Q,YACV1Q,GAAU0P,OAAO6d,IACjBvtB,GAAUA,UAAUzI,UAAUxS,IAAI,eAClCib,GAAUgyB,oBAAoBprC,IAQhC,GAJGjB,EAAIkG,MAAQ,MACbg5G,EAAOttG,UAAUxS,IAAI,cAGpBwoC,GAAa,CACd,GAAGA,KAAgBu3E,EAAQ,CACzB,MAAMU,EAAej4E,GACrB7mC,YAAW,KACT8+G,EAAah/G,QAAQ,GACpB,I,CAGL+mC,GAAc,I,CAGbvtB,KACDA,GAAY,K,EAIVylG,GAAmBlzG,IACvBsyG,EAAOttG,UAAUxS,IAAI,eAErB,MAAM2gH,EAAgBr2G,SAASC,cAAc,QACvCq2G,GAAkB,OAAYhgH,EAAIkG,MACxC65G,EAAcn2G,MAAM4qB,SAAW,WAC/BurF,EAAcn2G,MAAMoX,KAAO,IAC3BpU,EAAQD,KAAKyvB,GAAQ,KAAM5lB,SAAQ,KAEjCipG,EAAe71G,MAAM+N,WAAa,GAClCooG,EAAcl/G,QAAQ,IAMxB,MAAMktF,EAAUxgF,IAAkB,OAAYA,GAC9C,IAAI8X,EAAI0oE,EAAO,GACf0xB,EAAe71G,MAAM+N,WAAa,SAElCooG,EAAch2G,OAAOsb,EA5GH,MA4GmB26F,GACrCP,EAAenoG,cAAcvN,OAAOg2G,GACpCnzG,EAAQuoE,mBAAmBj/D,IACzB,MAAM+pG,EAAKlyB,EAAO73E,EAAS81B,MAC3B3mB,EAAEwC,YAAYo4F,GACd56F,EAAI46F,CAAE,GACN,EAIEh/G,GAAQmF,I,MACZ,MAAMkqG,GAAQlqG,GAAKA,EAAE0B,UACf9H,EAAOk/G,EAAel/G,IAE5B,IAAIwU,EACJ,MAAM9C,EAAU,kBAA4B,6CAAkDpP,EAC9F,GAAIguG,EAEG,GAAgB,QAAbtwG,EAAIC,KAAgB,CAC5B,MAAMigH,GAAyE7lG,IAAaA,GAAU85D,SACtG3/D,EAAW,qBAAoC,CAACzQ,MAAO/D,EAAK0R,YACzDwuG,GACD1rG,EAAS7H,MAAK,KACZ5L,YAAW,IAAW,EAAD,gCACnB,MAAMgF,SAAaD,KAAmBC,IACtCgM,OAAO0X,KAAK1jB,EACd,KAAG,+BAAuC,IAAM,EAAE,G,MAItDyO,EADQ,QAA+BxU,EAAI+U,aAAwB,QAAV,EAAA/U,EAAIsN,cAAM,eAAEpM,QAC1D,qBAAoC,CAAC6C,MAAO/D,EAAK0R,YAEjD,mBAAkC,CAAC3N,MAAO/D,EAAK0R,iBAf1D8C,EAAW,mBAAkC,CAACzQ,MAAO/D,EAAK0R,YAAU,GAkBtE8C,EAAS8B,OAAM,KACb4oG,EAAOttG,UAAU/Q,OAAO,cAAc,IAGrC+mC,KACDvtB,GAAU0P,OAAO6d,IAAa,EAAMpzB,GACpCsrG,GAAgBtrG,G,GAIbgrG,SAAUW,KAAoB,OAAwB,CAACp8G,MAAO/D,EAAKogH,WAAY,MACtF,SAAS96G,EAAS+6G,eAAeC,cAAcH,IAAmB,CAChEv4E,GAAcs3E,EAAOjpG,cAAc,uBAAyBkpG,EAC5D,MAAMvyG,EAAU,mBAAkC,CAAC7I,MAAO/D,IAAM,GAEhEqa,GAAY,IAAI,IAChBA,GAAU0P,OAAO6d,IAAa,EAAOh7B,GACrCyN,GAAUgyB,oBAAoBprC,IAC9B6+G,GAAgBlzG,E,MACX,IAAIhH,EAAakjB,YAAcg2F,EAMpC,GALAl3E,GAAcs3E,EAAOjpG,cAAc,uBAAyBkpG,EAC5D9kG,GAAY,IAAI,IAAqB,CACnC+5D,WAAY0qC,IAGVA,EASG,CACL,MAAMjd,EAAgB,cAA6Bid,GACnDzkG,GAAUuQ,cAAci3E,GACxBxnF,GAAU0P,OAAO6d,IACjBk4E,GAAgBje,E,MAZhBxnF,GAAU7Q,YACV6Q,GAAU0Q,YACV1Q,GAAU0P,OAAO6d,IACjBvtB,GAAUgyB,oBAAoBprC,SAENqB,IAArBy1B,GAAkCA,GAAoB/3B,EAAIkG,OAC3D,QAAmBmU,GAAUA,WAsBnC,OAZA,QAAiB6kG,GAAS94G,KACrB,OAAgBA,EAAE1H,OAAQ,UAI1B2b,GACDA,GAAU/H,QAAQlM,GAElBnF,GAAKmF,G,IAIF84G,C,IA5TT,qBAA2B,wBAAyBz5G,IACjC8R,MAAMC,KAAK9N,SAASoN,iBAAiB,0BAA0BrR,QACvErC,SAAS7C,IACbA,EAAQ0V,cAAc,iCACvB,QAAmB1V,E,GAErB,G,6DClCW,SAAS0lE,EAAgBhqC,GACtC,MAAO,KAAM,OAAkBA,GAAOE,SACxC,C,gFCCe,SAAeT,EAAqB4F,EAAgBh8B,EAAW,c,qDAC5E,MAAM+1C,QAAmB/1C,EAASq5B,gBAAgBmoC,QAAQxlC,GAC1D,GAAc,kBAAX+Z,EAAKptC,EACN,OAAO,QAAK,iBAGd,MAAMgxB,QAAiB35B,EAASw5B,kBAAkBqyE,kBAAkB7vE,GACpE,IAAI7R,EAGAA,EAFDwP,EACiB,gBAAfA,EAAShxB,EACFgxB,EAAS/D,mBAEgE,QAAxE,EAAA+D,EAAS9D,aAAmDA,oBAAY,eAAEj6B,OAG5Em6C,EAAmBngB,qBAAgD,QAAzB,EAAAmgB,EAAalgB,oBAAY,eAAEA,aAAaj6B,QAI7FuuB,EAAQA,GAAS,EAEjB,MAAM5kB,EAHewwC,EAAsBvvC,OAAOwrF,UAGX,0BAA4B,qBACnE,OAAO,QAAKzsF,EAAK,EAAC,OAAuB4kB,I,yXCZ5B,SAAe45C,EAC5Bn9C,G,qCAEA,MAAM,OACJ7lB,EAAS,SAAc,UACvBwH,EAAS,cACTC,EAAa,aACbi7D,EAAY,SACZzjE,EAAW,aAAkB,SAC7BgM,GACE4a,EAEJ,IAAI9e,EAAQ,GACZ,GAAG/G,EAAOo3B,SAAU,CAClB,MAAM3B,QAAax2B,EAASy2B,gBAAgBC,QAAQ31B,EAAOs3B,YACxD7B,IACEA,EAAK26C,aAAYrpE,GAAS0uB,EAAK26C,aAC/B36C,EAAK46C,WAAe5oE,GAAkBV,IAAQA,GAAS,IAAM0uB,EAAK46C,YAIlEtpE,EADDA,EACSA,EAAM6hB,QADC6M,GAAQA,EAAKhwB,OAAO4yB,QAAU,YAAY5wB,EAAgB,UAAY,cAAc,IAAQ,OAAuBguB,GAAM,IAAM,E,KAE9I,CACL,GAAGxqB,EAAU,CACX,MAAM03D,QAAc1jE,EAASy3B,eAAek5C,cAAc5vE,EAAQiL,GAClElE,GAAQ47D,aAAK,EAALA,EAAO57D,QAAS,E,CAG1B,IAAIA,EAAO,CACT,MAAMiuC,QAAa/1C,EAASq5B,gBAAgBmoC,QAAQzgE,EAAOs1B,YAC3DvuB,GAAQiuC,aAAI,EAAJA,EAAMjuC,QAAS,E,CAGtBU,IACDV,EAAQA,EAAMoV,MAAM,KAAK,G,CAQ7B,YAJoBlgB,IAAjBymE,IACD37D,GAAQ,OAAcA,EAAO27D,EAAcA,IAGtCl7D,EAAYT,GAAQ,OAAcA,EAC3C,E,+WCrDe,SAASswB,EAAoB5B,G,MAC1C,IAAIA,EACF,OAAOpyB,SAASC,cAAc,QAGhC,IAAIkB,EACA4oD,EAEJ,OAAO33B,EAAK71B,IACV,KAAK,gBACH4E,EAAM,4BACN,MACF,KAAK,gBACHA,EAAM,4BACN,MACF,QACE,GAAGixB,EAAKhwB,OAAOq6E,IAAK,CAClBt7E,EAAM,MACN,K,CAGF,GAAGixB,EAAKhwB,OAAOy0G,QAAS,CACtB11G,EAAM,gBACN,K,CAGF,OAAkB,QAAX,EAAAixB,EAAKm/D,cAAM,eAAEhtF,GAClB,IAAK,qBACHpD,EAAM,SACN,MAGF,IAAK,qBACHA,EAAM,cACN,MAGF,IAAK,sBACHA,EAAM,eACN,MAGF,IAAK,oBAAqB,CACxB,MAAMgK,EAAOinB,EAAKm/D,OAAOulB,WACnBC,EAAQ,IAAIr6F,KAGZE,GAFMm6F,EAAM5/E,UAAY,IAAO,GAElBhsB,EACnB,GAAGyR,EAAO,GACRzb,EAAM,2BACD,GAAGyb,EAAO,KACfzb,EAAM,qBAEN4oD,EAAO,CADGntC,EAAO,GAAK,QAEjB,GAAGA,EAAO,OAASm6F,EAAMC,YAAc,IAAIt6F,KAAY,IAAPvR,GAAa6rG,UAClE71G,EAAM,oBAEN4oD,EAAO,CADGntC,EAAO,KAAO,OAEnB,CACLzb,EAAM,yBACN,MAAM,OAAC81G,EAAM,OAAEC,IAAU,QAAsB/rG,GAC/C4+C,EAAO,CAACktD,EAAQC,E,CAGlB,K,CAGF,IAAK,mBACH/1G,EAAM,SACN,MAGF,QACEA,EAAM,gBASd,OAAO,QAAKA,EAAK4oD,EACnB,C,uHCjFO,SAASotD,EAAmB30F,GAKjC,MAAM,aAACoJ,EAAY,OAAEwrF,EAAM,aAAEC,GAAgB70F,GAC7C,OAAc,CACZ3rB,QAAS+0B,EACTgkB,SAAUwnE,EACVpnG,UAAW,eACXxU,SAAU,IACVwtB,gBAAiB,KACZouF,GAAUC,IACXzrF,EAAaz0B,SACby0B,EAAawY,iBAAiB1rC,U,GAItC,CAEO,SAAS4+G,EAAoB90F,GAIlC,MAAM,aAACoJ,EAAY,MAAEC,GAASrJ,EAG9B,IAFA,OAAYqJ,GAETD,EAAa1jB,UAAUqB,SAAS,gBACjC,OAGF,MAAM1O,EAAQ+wB,EAAahe,cAAcrB,cAAc,SACpD1R,IAAU+wB,EAAahe,cAAcrB,cAAc,iBACpD1R,EAAM1B,UAAW,EACjB0B,EAAMzB,OAAOwT,MAAM,MAGrBuqG,EAAmB,CACjBvrF,eACAwrF,QAAQ,EACRC,cAAc,GAElB,CA0Be,SAAeE,EAC5B/0F,G,qCAIA,MAAM,MAACnoB,GAASmoB,EAEVxe,GADS3J,EAAsByJ,OAAUzJ,EAA4BuJ,QACvDvO,MAAMmH,GAAoB,sBAAXA,EAAK+H,IACxC,IAAIP,EACF,OAGF,MAAM,MAAC4W,EAAK,YAAE2E,IAAe,OAA0BllB,EAAO2J,GAAO,GAGrE,aAFMub,EArCD,SAAmCiD,GAGxC,MAAM,WAACwF,EAAU,MAAEpN,GAAS4H,EAC5B,IAAIwF,IACF,OAGFpN,EAAM1S,UAAUxS,IAAI,2BAEpB,MAAMqK,EAAYC,SAASC,cAAc,OACzCF,EAAUmI,UAAUxS,IAAI,2BACxBqK,EAAUqkC,iBAAmBpc,EAAW2c,SAExC,MAAMqU,EAAc,WAAmB,OAAD,wBACjCx2B,GAAO,CACVwF,WAAYjoB,EAAUqkC,iBAAiBxsC,SAKzC,OAFAmI,EAAUM,OAAOua,EAAOo+B,EAAY/gD,QAE7B8H,CACT,CAiBSy3G,CAA0B,OAAD,wBAC3Bh1F,GAAO,CACV5H,UAEJ,E,4VCtFe,SAAe68F,EAC5Bj1F,G,qCAEA,IACE,aAAa,OAA+BA,E,CAC5C,MAAMroB,GAEN,OADA4G,QAAQigB,MAAM,wCAAyC7mB,GAChDqoB,EAAQk1F,MAAQ,GAAK13G,SAASC,cAAc,O,CAEvD,E,8eCbA,IAAIg/B,EAAoBvV,EAAmBlO,EAC3C,MAAMm8F,EAAiC,IAAIzhH,I,iCCF5B,SAAS0hH,EAAwB96G,GAC9C,MAAM+D,EAAS/D,EAAQ+D,QACjB,QAAC2I,EAAO,IAAEnN,IAAO,EAAAw7G,EAAA,GAAQ,0BAA0B/6G,EAAQH,OAAOs1B,iBAAiBpxB,EAAOm7B,KAAKz/B,kBAAkBsE,EAAOm7B,KAAKigB,eACnI,IAAIzyC,EACF,OAAOxJ,SAASC,cAAc,QAGhC,MAAMmJ,EAAIpJ,SAASC,cAAc,KAIjC,OAHAmJ,EAAEumB,KAAOtzB,EACT+M,EAAE9G,aAAa,UAAWkH,EAAU,UAE7BJ,CACT,C,6TCOA,SAAe0uG,EAAkBt1F,G,yCAC/B,MAAM0K,QAAgB,OAAoB1K,GAE1C,GAAGA,EAAQk1F,MACT,OAAOxqF,EAGT,MAAM9jB,EAAIpJ,SAASC,cAAc,KAIjC,OAHAmJ,EAAE4R,QAAQ+8F,UAAav1F,EAAQ1lB,QAA4BH,OAAS,IAAO6lB,EAAQ1lB,QAA4BF,IAC/GwM,EAAE4uG,IAAM,OACR5uG,EAAE/I,OAAO6sB,GACF9jB,CACT,G,CAEA,SAAS6uG,EAAatvG,EAAc+uG,GAClC,OAAOA,EAAQ/uG,GAAO,EAAAuvG,EAAA,IAAW,EAAAv6F,EAAA,GAAchV,GACjD,CAMO,SAAewvG,EAA8C31F,G,yCAClE,MAAM88C,EAAQ98C,EAAQ88C,MAEtB,IAAI8hC,EAAc9hC,aAAK,EAALA,EAAO0hC,cAKzB,OAJG1hC,aAAK,EAALA,EAAO/iE,MAAO,OACf6kG,EAAc,uBAGZA,EAmBG5+E,EAAQk1F,MACb9kG,EAAA,kDAA0DwuF,GAAan+F,MAAM3M,GAAQA,EAAIixD,mBACzF,OAAuB,OAAD,wBACjB/kC,GAAO,CACV2nD,OAAQ,CAACi3B,MACRn+F,MAAM8rD,IACPA,EAASxzC,iBAAiBrT,UAAUxS,IAAI,cACjCq5D,KAzBNvsC,EAAQk1F,MAAc,GF/Cd,SAAqBzxE,EAAe3+B,GACjD,IAAI23B,EAAK,CACPzjB,EAAOxb,SAAS+Q,eAAe,YAE/B,MAAMqnG,EAAK,6BAEXn5E,EAAMj/B,SAASmb,gBAAgBi9F,EAAI,OACnCn5E,EAAI7jB,eAAe,KAAM,QAAS,MAClC6jB,EAAI7jB,eAAe,KAAM,SAAU,MACnC6jB,EAAI7jB,eAAe,KAAM,UAAW,aACpC6jB,EAAI/2B,UAAUxS,IAAI,kBAElB,MAAM+lB,EAAMzb,SAASmb,gBAAgBi9F,EAAI,OACzC38F,EAAIL,eAAe,KAAM,OAAQ,eACjC6jB,EAAI5+B,OAAOob,GAEXiO,EAAO1pB,SAASC,cAAc,QAC9BypB,EAAKxhB,UAAUxS,IAAI,aAAc,eAEjC,MAAM2iH,EAAcr4G,SAASC,cAAc,QAC3Co4G,EAAYnwG,UAAUxS,IAAI,sBAC1Bg0B,EAAKrpB,OAAO4+B,EAAKo5E,E,CAGfpyE,IACFllC,QAAQigB,MAAM,wBACdilB,EAAQ,SAGN3+B,IACFvG,QAAQigB,MAAM,kBACd1Z,EAAU,IAGZ,MAAM2hC,EAAMhD,EAAMoJ,SAAS,IAErBipE,EAAa,uBAAuBryE,IAC1C,IAAIsyE,EAAcZ,EAAU//G,IAAIquC,GAChC,IAAIsyE,EAAa,CACf,MAAM,EAACx0G,EAAC,EAAErF,EAAC,EAAEm1F,EAAC,EAAEzqF,IAAK,QAAW,IAAM6/B,GACtCztB,EAAKtO,mBAAmB,YAAa,+BACborG,sEACQrvE,6DACIllC,MAAMrF,OAAOvD,KAAKC,IAAI,EAAGy4F,EAAI,SAASzqF,wDAI1EuuG,EAAUp/G,IAAI0tC,EAAOsyE,EAAc,QAAQx0G,MAAMrF,OAAOvD,KAAKC,IAAI,EAAGy4F,EAAI,SAASzqF,K,CAGnF,MAAMovG,EAAQ9uF,EAAK5L,WAAU,GAK7B,OAJC06F,EAAMtuG,kBAAkChK,MAAM44C,KAAO,QAAQw/D,KAE7DE,EAAMtuG,kBAAkChK,MAAMkmC,OAASmyE,EACxDC,EAAMj9F,iBAAiBlb,QAAO,EAAAgvB,EAAA,GAAiB/nB,GAAS,IACjDkxG,CACT,CEMWC,CAAYn5C,aAAK,EAALA,EAAOmiC,WAAYniC,aAAK,EAALA,EAAO57D,MAYjD,G,CAEA,SAASg1G,EAA2Bl2F,GAClC,MAAM3hB,EAAW2hB,EAAQ1lB,QAAmC+D,OAC5D,OAAOs3G,EAAc,OAAD,wBACf31F,GAAO,CACV88C,MAAOz+D,IAEX,CAEA,SAAe83G,EAAkCn2F,G,yCAC/C,MAAM3hB,EAAW2hB,EAAQ1lB,QAAmC+D,OACtD6oB,EAAO1pB,SAASC,cAAc,QAGpC,OAFAypB,EAAKxhB,UAAUxS,IAAI,cACnBg0B,EAAKrpB,aAAaq4G,EAA2Bl2F,GAAUy1F,EAAap3G,EAAO6C,MAAO8e,EAAQk1F,QACnFhuF,CACT,G,CAEe,SAAekvF,EAA+Bp2F,G,+CAC3D,MAAM,MAACk1F,EAAK,QAAE56G,EAAO,WAAEkrB,EAAU,cAAEhV,EAAa,gBAAE40C,EAAe,eAAEj6B,GAAkBnL,EAC/E3rB,EAAuB6gH,OAAQ9+G,EAAYoH,SAASC,cAAc,QAClEY,EAAS,WAAY/D,GAAWA,EAAQ+D,OAI9C,GAAIA,EAAmD/D,QAAS,CAC9D,MAAM+7G,EAAiBh4G,EAAmD/D,QAC1E,OAAG46G,GACM,EAAA7nF,EAAA,GAAcgpF,KAErB,EAAAzpF,EAAA,GAAav4B,GAAS,EAAA24B,EAAA,IAAaqpF,EAAe,CAAC3oD,cAAc,KAC1Dr5D,E,CAEJ,CACL,IAEIkqB,EACAgpC,EAHAxlD,EAAI1D,EAAO0D,EAKf,MAAM3I,EAAWgX,EAAA,WAEXkmG,EAAiB,CAACn8G,EAAgB+6G,IAC/BA,GAAQ,EAAA/3C,EAAA,GAAa,CAAChjE,SAAQwH,UAAWuzG,KAAU,OAAc,CAAC/6G,WAG3E,OAAOkE,EAAO0D,GACZ,IAAK,yBACHA,GAAK,IAAO1D,EAAetK,KAE3BwzD,EAAO,EAAC,EAAAgvD,EAAA,GAAmBl4G,EAAOrF,SAAUk8G,IAC5C,MAGF,IAAK,yBACHnzG,GAAK,IAAO1D,EAAetK,KAE3BwzD,EAAO,GACHxlD,EAAEszF,SAAS,QAAW/6F,EAAQsF,OAAO42G,MACvCjvD,EAAK/yD,KAAK8hH,EAAeh8G,EAAQ2F,OAAQi1G,SAGpB9+G,IAApBiI,EAAOrF,SACRuuD,EAAK/yD,MAAK,EAAA+hH,EAAA,GAAmBl4G,EAAOrF,SAAUk8G,IAE9C3tD,EAAK/yD,KAAK4gH,EAAwB96G,IAGpC,MAGF,IAAK,iCAAkC,CACrC,MAAM68B,EAAU,CAAC78B,EAAQ2F,OAAQ5B,EAAOq0E,MAAM,GAAG3tD,YACjD,IAAIne,EAAI,mCACR,MAAMkjE,EAAO15D,EAAA,OACV+mB,EAAQ,KAAO2yC,EAAMljE,GAAK,QACrBuwB,EAAQ,KAAO2yC,IAAMljE,GAAK,WAClC,EAAAm/C,EAAA,GAAiB5uB,EAAS2yC,GAE1BvrD,EAAc3X,EACd2gD,EAAOpwB,EAAQlqB,KAAK9S,GAAWm8G,EAAen8G,EAAQ+6G,KACtD3tD,EAAK/yD,KAAK4gH,EAAwB96G,IAClC,K,CAGF,IAAK,kCAAmC,CACtC,MAAMi6G,EAAQ,IAAIr6F,KACZvR,EAAO,IAAIuR,KAA4B,IAAvB7b,EAAOo4G,eACvBC,GAAe/tG,EAAKgsB,UAAY4/E,EAAM5/E,WAAa,MACnDgiF,EAAe,IAAIz8F,KAAKq6F,GAC9BoC,EAAaliF,QAAQkiF,EAAanC,UAAY,GAE9C,MAAMn/E,QAAoBj8B,EAASqI,gBAAgB4zB,YAAY/6B,EAAQH,QACvEokB,EAAc8W,EAAc,8CAAgD,sCAC5EkyB,EAAO,GACP,MAAMuiB,EAAO15D,EAAA,OAOb,IAAIkkE,EANDh6E,EAAQ2F,SAAW6pE,EACpBvrD,GAAe,MACN8W,GACTkyB,EAAK/yD,KAAK8hH,EAAeh8G,EAAQ2F,OAAQi1G,IAI3C,MAAM0B,EAA4B,GAC/BF,EAAc,GAAK/tG,EAAK6rG,YAAcD,EAAMC,UAC7ClgC,EAAI,4BACIoiC,EAAc,GAAK/tG,EAAK6rG,YAAcmC,EAAanC,UAC3DlgC,EAAI,mBAEJA,EAAI,mBACJsiC,EAAMpiH,KAAK,IAAI,qBAAqB,CAClCmU,OACAqX,QAAS,CACP62F,IAAK,UACLhiF,MAAO,UACPE,KAAM,aAEP1gC,UAGLuiH,EAAMpiH,MAAK,QAAWmU,IACtB,MAAM2rB,GAAI,QAAKggD,EAAGsiC,GAClBrvD,EAAK/yD,KAAK8/B,GAEV,K,CAGF,IAAK,0BAA2B,CAC9B,MAAMw1C,EAAO15D,EAAA,OACV9V,EAAQ2F,SAAW6pE,EACpB/nE,GAAK,MAELwlD,EAAO,CAAC+uD,EAAeh8G,EAAQ2F,OAAQi1G,IAGzC,K,CAGF,IAAK,0BAA2B,CAC9B,MAAM/6G,EAASG,EAAQH,OACjB28G,QAAsB19G,EAAS8G,mBAAmByE,iBAAiBxK,EAAQG,EAAQy8G,cAEzFxvD,EAAO,CACL+uD,EAAeh8G,EAAQ2F,OAAQi1G,IAG7B4B,EAOFvvD,EAAK/yD,KAAK8gH,EAAkB,OAAD,wBACtBt1F,GAAO,CACV1lB,QAASw8G,OARXv4F,EAAc,qBAEXjkB,EAAQy8G,cACT39G,EAAS8G,mBAAmB82G,oBAAoB18G,IASpD,K,CAGF,IAAK,mCAAoC,CACvC,MAAM+6B,QAAoBj8B,EAASqI,gBAAgB4zB,YAAY/6B,EAAQH,QACpEG,EAAQsF,OAAOi8B,IAChBtd,EAAc8W,EAAc,+BAAiC,8BAE7D9W,EAAc8W,EAAc,yCAA2C,uCACvEkyB,EAAO,CAAC+uD,EAAeh8G,EAAQ2F,OAAQi1G,KAEzC,K,CAGF,IAAK,6BACL,IAAK,0BACL,IAAK,yBACL,IAAK,0BACL,IAAK,6BACL,IAAK,+BACL,IAAK,6BACL,IAAK,gCACL,IAAK,gCACL,IAAK,kCACH3tD,EAAO,CAAC+uD,EAAeh8G,EAAQ2F,OAAQi1G,IACvC,MAGF,IAAK,gCACL,IAAK,6BACH3tD,EAAO,GACS,+BAAblpD,EAAO0D,GACRwlD,EAAK/yD,KAAK8hH,EAAeh8G,EAAQ2F,OAAQi1G,IAG3C3tD,EAAK/yD,KAAKihH,EAAap3G,EAAO6C,QAC9B,MAGF,IAAK,8BACL,IAAK,4BACL,IAAK,2BAA4B,CAC/B,MAAMwxE,EAASr0E,EAAkDq0E,OAC/D,CAAEr0E,EAAqD44G,SAIzD,GAFA1vD,EAAO,CAAC+uD,EAAeh8G,EAAQ2F,OAAQi1G,IAEpCxiC,EAAM19E,OAAS,EAAG,CACnB,MAAMkiH,GAAS,cACP3jG,QAAQgI,IAAIm3D,EAAMzlE,KAAKyrD,GAAmB49C,EAAe59C,EAAO3zC,WAAYmwF,OAClF,EACAA,GAGF,GAAGA,EACD3tD,EAAK/yD,QAAQ0iH,OACR,CACL,MAAM3qD,EAAW/uD,SAASC,cAAc,QACxC8uD,EAAS1uD,UAAUq5G,GACnB3vD,EAAK/yD,KAAK+3D,E,OAGZhF,EAAK/yD,KAAK8hH,EAAe5jC,EAAM,GAAG3tD,WAAYmwF,IAGhD,K,CAGF,IAAK,0BAA2B,CAC9B,MAAMiC,GAAa,EAAAnqF,EAAA,IAAa3uB,EAAOs8E,OAAQ,CAC7CnzE,SAAU,CAAC,CACTzF,EAAG,mBACH/M,OAAQqJ,EAAOs8E,OAAO3lF,OACtBq3B,OAAQ,MAMZk7B,EAAO,EAFM,EAAAmuD,EAAA,GAAWyB,IAGxB,K,CAGF,IAAK,2BAA4B,CAC/B,MAAMC,EAAkB/4G,EAAOuB,OAAOy3G,eAChCC,EAAkBj5G,EAAOuB,OAAO23G,eAKtC,GAJAh5F,EAAc+4F,EAAkB,+CAAkDF,EAAkB,+CAAiD,mCAErJ7vD,EAAO,EADO,EAAAiwD,EAAA,GAA2Bn5G,EAAOo5G,aAAcp5G,EAAOq5G,UACtDpB,EAAeh8G,EAAQH,OAAQ+6G,IAE3C56G,EAAQy8G,aAAc,CACvB,MAAMY,QAAuBv+G,EAAS8G,mBAAmByE,kBACvC,QAAhB,EAAArK,EAAQs9G,gBAAQ,eAAEC,mBAAmB,EAAA/U,EAAA,GAAUxoG,EAAQs9G,SAASC,kBAAoBv9G,EAAQH,OAC5FG,EAAQy8G,cAGNY,GAGFp5F,EAAc+4F,EAAkB,wCAA2CF,EAAkB,wCAA0C,4BACvI7vD,EAAK/yD,KAAK8gH,EAAkB,OAAD,wBACtBt1F,GAAO,CACV1lB,QAASq9G,KACRl3G,MAAM1N,IACJA,aAAc4C,aACf5C,EAAG2S,UAAUxS,IAAI,mBAGZH,OAXTqG,EAAS8G,mBAAmB82G,oBAAoB18G,E,CAgBpD,K,CAGF,IAAK,8BAA+B,CAClCitD,EAAO,GAEP,MAAMlyB,QAAoBj8B,EAASqI,gBAAgB4zB,YAAY/6B,EAAQH,QACvE,GAAGkE,EAAOy5G,OAAQ,CAUhB,IAAI9+G,EACJ,GAVGq8B,EACD9W,EAAc,0BACNjkB,EAAQ2F,SAAWmQ,EAAA,OAC3BmO,EAAc,uBAEdA,EAAc,mBACdgpC,EAAK/yD,KAAK8hH,EAAeh8G,EAAQ2F,OAAQi1G,KAIxC72G,EAAOy5G,OAAS,QAAS,CAC1B,IAAIn5G,EACJ,MAAM4oD,EAA2B,GAC3BxyB,EAAO,QACV12B,EAAOy5G,QAAU/iF,GAClBp2B,EAAM,QACN4oD,EAAK/yD,KAAK6J,EAAOy5G,OAAS/iF,EAAO,KAEjCp2B,EAAM,SACN4oD,EAAK/yD,KAAK6J,EAAOy5G,QAAoB,GAAV,MAAgB,IAG7C9+G,EAAWk8G,EAAQ,YAAYv2G,GAAK,EAAM4oD,IAAQ,QAAK5oD,EAAK4oD,E,MAE5DvuD,GAAW,EAAAu9G,EAAA,GAAmBl4G,EAAOy5G,OAAQ5C,GAG/C3tD,EAAK/yD,KAAKwE,E,MAEPq8B,EACD9W,EAAc,2BACNjkB,EAAQ2F,SAAWmQ,EAAA,OAC3BmO,EAAc,wBAEdA,EAAc,oBACdgpC,EAAK/yD,KAAK8hH,EAAeh8G,EAAQ2F,OAAQi1G,KAG7C,K,CAGF,IAAK,yBAA0B,CAC7B,IAAI9xE,EACA20E,EACAC,EACJ,MAAMC,IAAS39G,EAAQsF,OAAOi8B,IACxBq8E,OAAyC9hH,IAAzBiI,EAAOmgG,cACvB2Z,EAAgBD,KAAmB75G,EAAOmgG,cAC1C4Z,OAAkChiH,IAAjBiI,EAAO6C,MACxBm3G,OAAoCjiH,IAAlBiI,EAAOs0C,OAE3BslE,IACFD,EAAgB1B,EAAeh8G,EAAQ2F,OAAQi1G,IAG9CkD,IACDL,EAAetC,EAAap3G,EAAO6C,QAGlCg3G,IAAkBC,IACnB/0E,EAAc8yE,EAA2Bl2F,IAG3CunC,EAAOywD,EAAgB,CAACA,GAAiB,GAEtC35G,EAAOi6G,OACR/5F,EAAc05F,EAAO,4CAA8C,yCACzC,IAAlB55G,EAAOi6G,OACf/5F,EAAc05F,EAAO,6CAA+C,yCAC5DE,GAAiBC,GACzB75F,EAAc05F,EAAO,iDAAmD,6CACxE1wD,EAAK/yD,KAAKujH,IACFG,GAAiBE,GACzB75F,EAAc05F,EAAO,qCAAuC,iCAC5D1wD,EAAK/yD,KAAK2hH,EAAkCn2F,KACpCm4F,EACR55F,EAAc05F,EAAO,kDAAoD,8CACjEG,GACR75F,EAAc05F,EAAO,2CAA6C,uCAClE1wD,EAAK/yD,KAAKujH,IACFG,GACR35F,EAAc05F,EAAO,0CAA4C,sCACjE1wD,EAAK/yD,KAAK4uC,IACFi1E,IACR95F,EAAc05F,EACX55G,EAAOs0C,OAAS,2CAA6C,6CAC7Dt0C,EAAOs0C,OAAS,uCAAyC,0CAG9D,K,CAGF,IAAK,2BACH4U,EAAO,CAAC4uD,EAAkCn2F,IAC1CzB,EAAc,wBACd,MAGF,IAAK,4BAA6B,CAChC,MAAM05F,IAAS39G,EAAQsF,OAAOi8B,IAC9B,IAAIm8E,EACAC,IACFD,EAAgB1B,EAAeh8G,EAAQ2F,OAAQi1G,IAGjD3tD,EAAOywD,EAAgB,CAACA,GAAiB,GAEtC35G,EAAOwgF,UACRt3B,EAAK/yD,MAAK,EAAA2mB,EAAA,GAAc9c,EAAOwgF,WAC/BtgE,EAAc05F,EAAO,sBAAwB,sBAE7C15F,EAAc05F,EAAO,uBAAyB,oBAEhD,K,CAGF,QACE15F,EAAeipE,EAAA,GAASzlF,IAAM,IAAI1D,EAAO0D,KAIzCwc,IACFA,EAAcipE,EAAA,GAASzlF,QACJ3L,IAAhBmoB,IACDA,EAAc,IAAMxc,EAAI,MAI5B,MAAMw2G,EAAShxD,UAAch0C,QAAQgI,IAAIgsC,IAEzC,OAAG2tD,EACM,YAAY32F,GAAa,EAAMg6F,IAE/B,QAAMlkH,EAASkqB,EAAag6F,E,kMC5c1B,SAAeC,EAC5Bx4F,G,qDAEA,IAAI,QAAC1lB,EAAO,KAAE6L,EAAI,UAAEsyG,EAAS,MAAEvD,EAAK,cAAE7qF,EAAa,iBAAEquF,GAAoB14F,EACzE7Z,UAAAA,EAAU7L,EAA4BA,SAEtC,MAAMmkC,EAA2B,GAEjC,IAAIk6E,GAAc,EAClB,MAAMC,EAAU,CAACtvD,EAAsBuvD,KACrC,GAAGvvD,EAAS,CACV,QAAYlzD,IAATyiH,GAAsBF,EACvB,OAGFE,EAAO3D,EAAQ,YAAY5rD,GAAS,IAAQ,QAAKA,E,CAGnD,GAAG4rD,EACDz2E,EAAMjqC,KAAKqkH,OACN,CACL,MAAM9lH,EAAKyK,SAASC,cAAc,QACd,iBAAX,EAAqB1K,EAAG4e,UAAYknG,EACxC9lH,EAAG8K,OAAOg7G,GACfp6E,EAAMjqC,KAAKzB,E,GAKTmN,EADW,aACmBA,mBAE9B44G,GAAe,OAAoBx+G,GAEzC,IAAIkN,EAAqD,QAAzC,EAAAlN,EAA4BmN,qBAAa,QAAKnN,EAAsCkN,SACpG,GAAIlN,EAA4BzC,QAAUihH,EAAc,EACtD,OAA4Bx+G,GAC5B,IAAIy+G,GAAiB,EACrB,GAAGz+G,EAAQ0+G,WAAY,CACrB,GAAGP,EAAW,CACZ,MAAMj+E,QAAat6B,EAAmB+4G,iBAAiB3+G,GACvD,GAAGm+G,EAAUzjH,SAAWwlC,EAAKxlC,QAC3B,IAAI,MAAMoF,KAAOogC,EACf,IAAIi+E,EAAUvxG,SAAS9M,GAAM,CAC3B2+G,GAAiB,EACjB,K,OAIJA,GAAiB,C,CAIrB,GAAGA,EAAgB,CACjB,MAAMG,QAAkBh5G,EAAmBi5G,aAAa7+G,EAAQ0+G,YAChE7yG,GAAO+yG,aAAS,EAATA,EAAW5+G,UAAW,GAC7BkN,GAAW0xG,aAAS,EAATA,EAAWzxG,gBAAiB,GAEnCixG,IACFE,EAAQ,eACRD,GAAc,E,OAIlBI,GAAiB,EAGnB,IAAKA,IAAmBL,IAAsBvyG,EAAM,CAClD,MAAMtO,EAAQyC,EAAQzC,MACtB,OAAOA,EAAMkK,GACX,IAAK,oBACH62G,EAAQ,eACR,MACF,IAAK,mBACHA,OAAQxiH,EAAW8+G,EAAQr9G,EAAMgnF,UAAW,OAAchnF,EAAMgnF,WAChE,MACF,IAAK,oBACH14E,EAAOtO,EAAMqJ,MACb03G,EAAQ,kBACR,MAEF,IAAK,kBACHA,EAAQ,kBACR,MACF,IAAK,sBACHA,EAAQ,sBACR,MACF,IAAK,mBACH,MAAM5hF,EAAI,OAAcn/B,EAAMuhH,KAAKC,UAAY,QAC/CT,OAAQxiH,EAAW8+G,EAAQl+E,GAAI,OAAcA,IAC7C,MACF,IAAK,sBACH4hF,EAAQ,iBACR,MACF,IAAK,mBAAoB,CACvB,MAAM5hF,EAAI,MAAan/B,EAAMyhH,KAAKp4G,MAClC03G,OAAQxiH,EAAW8+G,EAAQl+E,GAAI,OAAcA,IAC7C,K,CAEF,IAAK,uBAAwB,CAC3B,MAAMx5B,EAAW3F,EAAM2F,SAEvB,GAAqB,UAAlBA,EAASzJ,KACV6kH,EAAQ,oBACH,GAAqB,UAAlBp7G,EAASzJ,KACjB6kH,EAAQ,oBACH,GAAqB,QAAlBp7G,EAASzJ,KACjB6kH,EAAQ,kBACH,GAAqB,UAAlBp7G,EAASzJ,KACjB6kH,EAAQ,oBACH,GAAqB,YAAlBp7G,EAASzJ,KAAoB,CACrC,MAAMwiB,EAAIkoB,EAAMzpC,OAChB,GAAGwI,EAASunD,gBAAiB,CAC3B,MAAM/tB,EAAIx5B,EAASunD,gBAAkB,IACrC6zD,OAAQxiH,EAAW8+G,EAAQl+E,GAAI,OAAcA,G,CAG/C4hF,EAAQ,iBAGR,MAAM9lH,EAAI2rC,EAAMhe,OAAOlK,EAAG,GAC1B,GAAG2+F,EAAOz2E,EAAMjqC,KAAM1B,EAAE,IAAiBA,EAAE,GAAKA,EAAE,GAAe,SAC5D,CACH,MAAMo0B,EAAOrhB,OAAOrI,SAASC,cAAc,QAC3CypB,EAAKrpB,UAAU/K,GACf2rC,EAAMjqC,KAAK0yB,E,CAGb/gB,EAAO,E,MACF,GAAqB,UAAlB3I,EAASzJ,KAAkB,CACnC,MAAM8N,EAAYrE,EAASsE,WAAWjP,MAAMgP,GAA8B,2BAAhBA,EAAUE,IAAmCF,EAAUX,OAASW,EAAUI,aAC9H+0B,EAAI,OAAcn1B,EAAY,CAACA,EAAUX,MAAOW,EAAUI,WAAWspB,OAAOC,SAAS7U,KAAK,OAASnZ,EAASwE,WAClH42G,OAAQxiH,EAAW8+G,EAAQl+E,GAAI,OAAcA,G,MAE7C4hF,OAAQxiH,EAAW8+G,EAAQ13G,EAASwE,WAAY,OAAcxE,EAASwE,YAGzE,K,CAGF,IAAK,sBAC4B,iCAAR,QAApB,EAAAnK,EAAM0hH,sBAAc,eAAEx3G,GACvB62G,OAAQxiH,EAAW8+G,EAAQr9G,EAAM60B,aAAc,OAAc70B,EAAM60B,cAEnEksF,OAAQxiH,EAAW8+G,EAAQr9G,EAAMqJ,OAAQ,OAAcrJ,EAAMqJ,QAG/D,MAGF,IAAK,0BACH03G,EAAQ,M,CAWd,MAAM5jH,EAASypC,EAAMzpC,OACrB,IAAI,IAAIuhB,EAAI,EAAGA,EAAIvhB,EAAQuhB,GAAK,EAC9BkoB,EAAMhe,OAAOlK,EAAG,EAAG,MAGlBpQ,GAAQnR,GACTypC,EAAMjqC,KAAK,K,CAIf,GAAI8F,EAAmC+D,OAAQ,CAC7C,MAAMm7G,QAAsB,OAAyB,CAACl/G,QAAUA,EAAoC46G,UACjGsE,GACDZ,OAAQxiH,EAAWojH,E,CASvB,GALGV,IACD3yG,GAAO,QAAsB7L,EAA4Bm/G,oBAAoBtzG,KAC7EqB,EAAW,IAGVrB,EAKD,GAJAA,GAAO,OAAaA,EAAM,KAE1BqB,UAAAA,GAAa,OAAcrB,IAExB+uG,EACDz2E,EAAMjqC,MAAK,OAAc2R,EAAMqB,QAC1B,CAGL,GAAG6iB,EAAe,CAChBA,EAAgBA,EAActH,OAC9B,IACIrrB,EADApD,GAAQ,EAEZ,MAAM46B,EAAS,IAAIC,QAAO,OAAa9E,GAAgB,MAEvD,IADA7iB,EAAWA,EAASiiB,QACkB,QAA/B/xB,EAAQw3B,EAAOwqF,KAAKvzG,KACzBqB,EAAShT,KAAK,CAACuN,EAAG,yBAA0B/M,OAAQq1B,EAAcr1B,OAAQq3B,OAAQ30B,EAAM6oB,QACxFjsB,GAAQ,EAGPA,IACD,OAAakT,E,CAIjB,MAAMmyG,GAAiB,QAAaxzG,EAAM,CACxCunD,cAAc,EACdlmD,WACAoyG,SAAS,EACTC,cAAc,IAGhBp7E,EAAMjqC,MAAK,OAAuBmlH,G,CAItC,GAAGzE,EACD,OAAOz2E,EAAM9nB,KAAK,IACb,CACL,MAAM41C,EAAW/uD,SAAS8/D,yBAE1B,OADA/Q,EAAS1uD,UAAU4gC,GACZ8tB,C,mVC/PI,SAAeutD,EAAc95F,G,qCAC1C,MAAMvE,EAAY,IAAI,IAEtB,aADMA,EAAUmV,OAAO5Q,GAChBvE,EAAUpnB,OACnB,E,yvBCee,SAAe0lH,GAAU,MAAC9uF,EAAK,QAAE3wB,EAAO,UAAEiD,EAAS,SAAEqtB,EAAQ,UAAEC,EAAS,SAAEmvF,EAAQ,MAAEhjG,EAAK,cAAExG,EAAa,WAAEgV,EAAU,KAAExrB,EAAI,iBAAE+wB,EAAgB,aAAElF,EAAY,iBAAEgG,EAAgB,OAAEX,EAAM,QAAE+uF,EAAO,SAAE52E,EAAQ,UAAE62E,EAAS,SAAE9gH,EAAW,aAAkB,WAAEkqC,I,yCAqBhQ,MAAMrsB,EAAM,CACV4O,aAAc,CACZrkB,MAAO+R,QAAQjT,UACfgrB,KAAM/X,QAAQjT,WAEhB+qB,OAAQ,CACN7pB,MAAO,KACP8pB,KAAM,MAERnd,UAAW,KACXqH,SAAU,MAGNqG,EAAyB,aAAZoP,EAAMlpB,EACnBo4G,EAAsBt+F,GAAcoP,EAAMpiB,UAAUuxG,WAAW,YAAcpgH,EAC7EqgH,GAAW,OAAcpvF,GAC/B,KAAMA,EAAkB3pB,OAAU2pB,EAAqB7pB,QAAYi5G,GAAaF,GAK9E,OAJGvvF,GAAYC,IAAc7wB,GAAQ6hB,IACnC,OAAkBoP,EAAO1tB,EAAWqtB,EAAUC,OAAWz0B,EAAWkE,GAG/D2c,EAGT,IAAI07F,EAAsC,IAArB9mF,EAEjB7xB,SACc5D,IAAbw0B,IAAwBA,EAAW,+BACrBx0B,IAAdy0B,IAAyBA,EAAY,4BAG1CttB,EAAUmI,UAAUxS,IAAI,mBACxB,IAIIq2E,EAEA7vE,EA6FA7B,EAnGA2d,EAAWjY,EAEX+8G,GAAQ,EACR7wC,EAAiCl2D,QAAQjT,UAQ7C,GAAGsqB,GAAYC,IAAc7wB,EAAM,CACjC,MAAMjE,GAAM,OACVk1B,EACA1tB,EACAqtB,EACAC,OACAz0B,EACAkE,OACAlE,EACA+jH,EAAsB,CACpBp4G,EAAG,YACHxB,EAAG0qB,EAAM1qB,EACTgB,EAAG0pB,EAAM1pB,EACTvH,KAAMixB,EAAMjxB,KACZjG,KAAM,WACJqC,GAMN,GAJA4D,EAAOjE,EAAI2mB,UACX49F,EAAQvkH,EAAIukH,MACZ5gH,QAAqBN,EAASO,cAAcC,gBAAgBqxB,EAAOjxB,EAAKjG,OAEpEumH,IAAUD,EAAU,CACtB7kG,EAAWhY,SAASC,cAAc,OAClC+X,EAAS9P,UAAUxS,IAAI,4BACvBsiB,EAAS9X,MAAM+X,MAAQ1f,EAAIiE,KAAKyb,MAAQ,KACxCD,EAAS9X,MAAMmY,OAAS9f,EAAIiE,KAAK6b,OAAS,KAE1C,MAAMgH,GAAW,OAAyBoO,EAAOvxB,GAAewxB,GAAQ,GACxE,GAAGrO,EAAU,CACX4sD,EAAmB5sD,EAASE,YAC5B,MAAMwsD,EAAa1sD,EAASzE,MAC5BmxD,EAAW7jE,UAAUxS,IAAI,eACzBqK,EAAUM,OAAO0rE,E,YAECwwC,EAAU,CAC1Bx8G,YACAjD,UACA2wB,QACAL,SAAU,EACVC,UAAW,EACX7wB,OACAwW,gBACAwG,QACA6O,eACAL,aACAuF,mBACAivF,WACAnuF,mBACAX,SACA+uF,SAAS,EACTC,WAAW,EACX9gH,cAGqBiyB,OAAOC,KACnB5lB,UAAUxS,IAAI,cAAe,aAI1CqK,EAAUmI,UAAUxS,IAAI,0BACxBqK,EAAUM,OAAO2X,E,OAGfxb,IACFA,GAAO,OAAgBixB,EAAOL,EAAUC,GAAW,IAGrDnxB,QAAqBN,EAASO,cAAcC,gBAAgBqxB,EAAOjxB,aAAI,EAAJA,EAAMjG,MAG3E,IAAIkmH,IAAYI,EAAU,CACxB,MAAMx9F,GAAW,OAAyBoO,EAAOvxB,GAAewxB,GAC7DrO,IACD4sD,EAAmBl2D,QAAQgI,IAAI,CAACkuD,EAAkB5sD,EAASE,cAC3D9F,EAAI4O,aAAarkB,MAAQyV,EAAI4O,aAAayF,KAAOm+C,EACjDF,EAAatyD,EAAIoU,OAAO7pB,MAAQqb,EAASzE,MACzCmxD,EAAW7jE,UAAUxS,IAAI,eACzBsiB,EAAS3X,OAAO0rE,G,CAOpB,GAFAtyD,EAAIzB,SAAWA,EAEC,oBAAZxb,aAAI,EAAJA,EAAM+H,IAA0B8Z,IAAgB7hB,aAAI,EAAJA,EAAsCqH,OACxF,OAAO4V,EAIM,eAAZjd,aAAI,EAAJA,EAAM+H,IACPlK,EAAQof,EAAIoU,OAAOC,MAAO,SAC1BzzB,EAAMlB,UAAW,EACjBkB,EAAMhC,MAAO,EACbgC,EAAMqH,OAAQ,EACdrH,EAAM6N,UAAUxS,IAAI,iBAEpB2E,EAAQof,EAAIoU,OAAOC,KAAO,IAAIjT,MAC9BxgB,EAAM6N,UAAUxS,IAAI,gBAKtB,MAAM04G,GAAcriC,IAAe7vE,EAAakjB,aAAe,iCAAyCymB,EAExG,IAAIl1B,EACJ,MAAMqtB,EAAqBlhC,aAAO,EAAPA,EAA6BkhC,kBACpDzQ,IACErxB,EAAakjB,aAAc4e,IAC7BrtB,EAAY,IAAI,IAAqB,CACnCg6D,aAAc,UACdD,WAAY1sC,KAIbA,IACDrtB,EAAUuQ,cAAc,cAA6B8c,IACrDrtB,EAAU0P,OAAOtgB,GACjBo1G,OAAiBv8G,IAKrB,MAeMmkH,EAAgB1gH,IACb,OAAsB0D,EAAW1F,EAAOgC,EAAK+xG,EAAYp2F,EAAU+zD,GAGtEr5C,EAAer2B,GAAgB,EAAD,gCAClC,IAAG2rB,GAAeA,IAAlB,CAMA,GAJG8d,IACDzpC,QAAYypC,EAAWzpC,IAGtBqgH,EAAW,CACZ,MAAMj+E,GAAS,OAAKpiC,EAAK,IACzB,OAAOoiC,EAAOv7B,QAAQD,MAAK,IAElB85G,EAAat+E,EAAOxmC,OAAOoiG,c,CAItC,OAAO0iB,EAAa1gH,EAdkB,CAexC,IAEA,IAAIkjB,EACJ,MAAMy9F,EACHxgH,EAA6BuG,GAAK,KAClCvG,EAA6BuH,GAAK,KAChCoxG,EACC59G,EAAO,IAAW,EAAD,gCAClB49G,IAAmB5nF,GAAoB5c,IACxCA,EAAU7Q,YACV6Q,EAAU0Q,aAGZ,MAAMne,EAhDmB,MAIzB,MAAM+5G,EAAiBN,IAAwBngH,EAQ/C,OAPgB,qBAAoC,CAClDnC,MAAOozB,EACPzpB,MAAOxH,EACPwL,QAASgL,aAAa,EAAbA,EAAehL,QACxBk1G,UAAWD,OAAiBrkH,EAAYu8G,GAG5B,EAoCEgI,GACVjhH,QAAqBN,EAASO,cAAcC,gBAAgBqxB,EAAOjxB,aAAI,EAAJA,EAAMjG,MAE7Eoa,IACCzU,EAAakjB,aACbmO,GACDyvF,GAEArsG,EAAU0P,OAAOtgB,GAAW,EAAOmD,GAGrCiyG,OAAiBv8G,EAEjB,MAAMyzE,EAAgBnpE,EAAQD,KAAKyvB,GAEnC,OADA25C,EAAcz/D,MAAM,KACb,CAAC9B,SAAU5H,EAAS06B,OAAQyuC,EACrC,IAgCA,OA9BG17D,GACDA,EAAUgyB,oBAAoBprC,GAG7B2E,EAAakjB,WACd6sD,EAAmB1sD,SAAqBhoB,KAAQqmC,OAE5C5qB,EAKMA,EAAchc,KAAK,CAACyoB,IAAK1f,EAAWxI,KAAM,IAAMA,IAAO0L,MAAK,EAAE6H,cAAcA,MALnEyU,SAAqBhoB,KAAQqmC,OAQ/CvV,GAAgB4jD,GACjB5jD,EAAarxB,KAAKi1E,SAIdA,EACNxyD,EAAI4O,aAAarkB,MAAQioE,EACzBxyD,EAAI4O,aAAayF,KAAOvO,GAAexJ,QAAQjT,UAC/C2W,EAAI9I,UAAYA,EAOT8I,CACT,G,4FC1Se,SAAe2jG,EAAiBtgH,G,qCAC7C,MAAMugH,EAA2Br9G,SAASC,cAAc,QACxDo9G,EAAYn1G,UAAUxS,IAAI,gBAE1B,MAAM4nH,EAASxgH,EAAQ2F,SAAW,UAAkB3F,EAAQH,SAAW,SAUvE,GATA0gH,EAAYh9G,OACVi9G,GACE,QAAK,iBACC,OAAc,OAAD,yBACd,OAA6BxgH,IAAQ,CACxC4gB,OAAQ5gB,EAAQH,SAAW,oBAIxB,wCAA8CG,EAAQH,UAAW2gH,EAAQ,CAChF,MAAMr/F,QAAkB,OAAc,CAACthB,OAAQG,EAAQH,SACvD0gH,EAAYh9G,OAAO,MAAO4d,E,CAG5B,OAAOo/F,CACT,E,2VCvBe,SAASE,EAAazgH,GACnC,MAAMvH,EAAkByK,SAASC,cAAc,QAI/C,OAHA1K,EAAG2S,UAAUxS,IAAI,aACjBH,EAAG8K,QAAO,QAA8B,IAAIqc,KAAoB,IAAf5f,EAAQqO,QAElD5V,CACT,C,4pBCkCO,MAAMioH,EAA4B,KAGnCC,EAAuC,CAAC,EAEjCC,EAA6C,CAAC,EAErDrnG,EAAiB,CAACxf,EAAsBwf,EAA4B/H,KACxE,MAAM+8D,EAAQ,KACZx0E,EAAQwP,oBAAoB,eAAgBglE,GAC5Ch1D,IACAjO,aAAau1G,EAAS,EAExB9mH,EAAQ0L,iBAAiB,eAAgB8oE,GACzC,MAAMsyC,EAAWtmH,WAAWg0E,EAAO/8D,EAAQ,EAG9B,SAAesvG,GAAY,IAACtnH,EAAG,IAAEmpB,EAAG,WAAEuI,EAAU,sBAAE61F,EAAqB,cAAE7qG,EAAa,WAAE8qG,EAAU,MAAE7oH,EAAK,KAAEmE,EAAI,UAAEwrC,EAAS,MAAEiS,EAAK,MAAE5+B,EAAK,OAAEI,EAAM,UAAEg2F,EAAS,KAAEh2G,EAAI,aAAEgwB,EAAY,WAAE+lF,EAAU,YAAE2P,EAAW,UAAEC,EAAW5yG,OAAQ6yG,EAAQ,SAAEriH,EAAWgX,EAAA,WAAkB,UAAEsrG,EAAS,MAAE1kG,EAAK,UAAE2kG,EAAS,SAAEphE,EAAQ,eAAEuxD,GAAc,WAAEC,GAAU,cAAE6P,GAAa,YAAEC,K,gDA8BrW5+F,EAAM5R,MAAMi8D,QAAQrqD,GAAOA,EAAM,CAACA,GAE/B2+F,KACDvnE,EAAQvgD,EAAIixD,iBAGd,MAAM+2D,GAAchoH,EAAIylD,QAKxB,GAJmB,IAAhBuiE,KACDL,GAAW,IAGThmG,IAAUI,EAAQ,CACpB,MAAMvU,EAAQgb,EAAA,SACRgvF,EAAUj3D,EAAQ/yC,EAAMy6G,aAAgBjoH,EAAIqyD,SAAW7kD,EAAM06G,gBAAkB16G,EAAM26G,cACrFjiH,GAAO,OAAclG,EAAIyM,EAAGzM,EAAIyN,GAAGiqG,aAAaF,GACtD71F,EAAQzb,EAAKyb,MACbI,EAAS7b,EAAK6b,M,CA+ChB,IAAInc,GA5Ce,IAAhBoiH,IAEDz4B,EAAA,sBAGFpmE,EAAI/lB,SAAS+lB,IACXA,EAAIzE,QAAQjf,MAAQ,GAAKzF,EAAIiG,GAC1Bs6C,IACDp3B,EAAIzE,QAAQqoC,aAAexM,GAG7Bp3B,EAAIvX,UAAUxS,IAAI,wBAAwB,IAkC5C,MAAM0G,GAAkB,CAAM7F,GAAe2F,cAAY,EAAZA,GAAc3F,QAAS,EAAD,gCACjE,OAAO2F,SAAqBN,EAASO,cAAcC,gBAAgB9F,EAAKC,EAC1E,IAEMmoH,IAAcT,IAA6B,IAAhBK,IAAqC,IAAhBA,IAEhD1Q,IAAc,EAAA+Q,EAAA,GAAsBroH,QAC7BsC,IAAV4gB,GAAuBo0F,KAAgBp0F,GACxCiG,EAAI/lB,SAAS+lB,GAAQA,EAAIvX,UAAUxS,IAAI,eAGzC,MAAMkpH,GAAehR,IAAe7wD,EACpC,GAAG6hE,GAAc,CACf,MAAMC,EAAUpB,EAAUnnH,EAAIiG,IAC9BkjB,EAAI/lB,SAAS+lB,IACXA,EAAIvX,UAAUxS,IAAI,qBAAsB,sBACxCmpH,GAAWp/F,EAAIvf,MAAMssE,YAAY,aAAc,OAAOqyC,KAAW,G,CAIrE,GAAGZ,GAA4B,IAAhBK,GAAmB,CAChC,MAAMt6G,GAAQ,EAAAmpB,EAAA,GAAgB72B,EAAK2hB,EAAOI,GAAQ,SAC5Cjc,GAAgB4H,EAAMzN,K,YAEtB6F,GAAgB8hH,aAAS,EAATA,EAAW3nH,MAGnC,MAAMuoH,GAAYjoE,IAAUunE,IAAgB,QAAkBvnE,IAAU,EAClEz3B,GAAaljB,GAAakjB,aAAegvF,EAEzC2Q,GAAuBL,GACvBM,GAAoC,IAAhBV,IAAqC,IAAhBA,SAA0B1iH,EAASC,eAAeojH,qBAAqB3oH,EAAIiG,GAAIuiH,SAAalmH,EAErI6gB,GAAM,CAACmkB,YAAQhlC,EAAiCrB,UAAMqB,GAC5D,IAAIqzE,IAAmB,SACnBizC,IAAkB,EACtB,KACY,QAAV,GAAA5oH,EAAIsN,cAAM,iBAAEpM,SACVwnH,MAEDv/F,EAAI,GAAGvV,qBACPkV,IACC2/F,IACAn6E,KACe,IAAdypE,EACH,CACA,IAAIrqG,EAAQg7G,IAAqB1oH,EAAIsN,OAAO,GAI5C,MAAMu7G,EAAc,CAAC1/F,EAAkBssD,KACjCtsD,EAAI4E,kBAUN4nD,GAAiBnpE,UATjBspE,EAAA,gBAA4B3sD,GAAK,KAC3BA,EAAI4E,oBACN0nD,EAAW7jE,UAAUxS,IAAI,gBAAiB,aAC1C+pB,EAAIpf,OAAO0rE,IAGbE,GAAiBnpE,SAAS,G,EAOhC,GAAG,QAASkB,EACVk7G,IAAkB,EAClBz/F,EAAI/lB,SAAS+lB,IACX,MAAMssD,EAAa,IAAIlxD,OACvB,EAAAwB,EAAA,IAAmB0vD,EAAa/nE,EAAc3H,KAAK,IAAM8iH,EAAY1/F,EAAKssD,IAAY,SAEnF,GAAG,UAAW/nE,GACnB,GAAe,kBAAZA,EAAMO,EAAuB,CAC1BP,EAAMH,MAAMrM,SACdwM,EAAQ1N,EAAIsN,OAAOvO,MAAMyhC,IAAK,MAAC,OAAwC,QAAxC,EAACA,EAAkCjzB,aAAK,eAAErM,MAAM,KAAKwM,GAGtF,MAAM2X,ECpOC,SAA0B9X,GAGvC,IAAIyV,EAAO,IACX,IAAI,IAAIP,EAAI,EAAGvhB,EAASqM,EAAMrM,OAAQuhB,EAAIvhB,IAAUuhB,EAAG,CACrD,MAAMqmG,EAAMv7G,EAAMkV,GAEfqmG,GAAO,IACR9lG,GAPW,mEAOI8lG,EAAM,IAAM,KAExBA,GAAO,IACR9lG,GAAQ,IACA8lG,GAAO,KACf9lG,GAAQ,KAEVA,GAAQ,IAAY,GAAN8lG,G,CAKlB,OAFA9lG,GAAQ,IAEDA,CACT,CD+MkB+lG,CAAkBr7G,EAAsCH,OAC5Du0G,EAAK,6BACLn5E,EAAMj/B,SAASmb,gBAAgBi9F,EAAI,OACzCn5E,EAAI/2B,UAAUxS,IAAI,iBAAkB,gBAAiB,aACrDupC,EAAI7jB,eAAe,KAAM,UAAW,OAAO9kB,EAAIyM,GAAK,OAAOzM,EAAIyN,GAAK,OAoCpE,MAAMuV,EAAOtZ,SAASmb,gBAAgBi9F,EAAI,QAC1C9+F,EAAK8B,eAAe,KAAM,IAAKO,GAC5B/I,EAAA,+BAAyCwrG,IAAe9kG,EAAK8B,eAAe,KAAM,OAAQ,WAC7F6jB,EAAI5+B,OAAOiZ,GACXmG,EAAI/lB,SAAQ,CAAC+lB,EAAK/hB,IAAQ+hB,EAAIpf,OAAO3C,EAAM,EAAIuhC,EAAInhB,WAAU,GAAQmhB,KACrEigF,IAAkB,EAClBjzC,GAAiBnpE,S,MACZ,GAAGg8G,IAAa,EAAG,CACxB,MAAM7lG,EAAI,KACPwG,EAAsB/lB,SAAS+lB,IAC9B,MAAMssD,EAAa,IAAIlxD,MACjBxe,GAAM,EAAAijH,EAAA,GAAuBhpH,EAAK0N,GAAsC,IAC9E,EAAAqY,EAAA,IAAmB0vD,EAAY1vE,GAAK,IAAM8iH,EAAY1/F,EAAKssD,IAAY,GACvE,EAGA,KAAqBz1E,EAAI8L,OAAOm9G,uBAAyBrjH,GAAaG,KACxE6iH,IAAkB,EAClBjmG,MAEAimG,IAAkB,EAClBM,EAAA,UAA6B,QAAUlpH,EAAIiG,GAAIyH,EAAMH,OAAOZ,MAAMY,IAChEjI,EAASC,eAAe4jH,+BAA+BnpH,EAAIiG,GAAIsH,GAC9DG,EAAsCH,MAAQA,EAC/CvN,EAAI8L,OAAOm9G,uBAAwB,EAE/Bv3F,IAAeA,KAAkBvI,EAAsB,GAAG4E,kBAC5D4nD,GAAiBnpE,UAInBmW,GAAG,IACFrM,OAAM,IAAMq/D,GAAiBnpE,Y,OAG/B,IAAqB,IAAhBw7G,IAAqBQ,IAAa,GAAsB,IAAhBR,MAAuBjQ,GAAazpE,GAAY,CAClG,MAAMrtC,EAAO,IAAW,EAAD,gCACrB,GAAIkoB,EAAsB,GAAG4E,mBAAsB2D,IAAeA,IAEhE,YADAikD,GAAiBnpE,UAInB,MAAMmW,EAAI,CAACwG,EAAkBssD,EAAyB1vE,KACjDojB,EAAI4E,mBAAsB2D,IAAeA,IAC1CikD,GAAiBnpE,UAIfzG,GACC,EAAAggB,EAAA,IAAmB0vD,EAAY1vE,GAAK,IAAM8iH,EAAY1/F,EAAKssD,KADvDozC,EAAY1/F,EAAKssD,EACkD,QAGxE3vE,KACLqjB,EAAsB/lB,SAAS+lB,IAC9B,GAAGvjB,GAAaG,IACd4c,EAAEwG,EAAK,IAAI5E,MAAS3e,GAAaG,UAC5B,GAAG,UAAW2H,EAAO,CAC1B,MAAM8hB,GAAM,EAAA45F,EAAA,GAA0BppH,EAAK0N,GAAsC,GACjF8hB,EAAIvG,YAAYtc,MAAK,IAAMgW,EAAEwG,EAAKqG,EAAIlL,MAAO,K,MAI7CiG,EAAA,mBAAoC,CAClCxmB,MAAO/D,EACP0N,MAAOA,IACNf,MAAW5G,GAAQ,EAAD,gCACnB,OAAO4c,EAAEwG,EAAK,IAAI5E,MAASxe,EAC7B,K,GAGN,IAEA,GAAG2W,GAAiB4xB,EAGlB,OAFA5xB,EAAchc,KAAK,CAACyoB,IAAKA,EAAI,GAAIloB,SACjC00E,GAAiBnpE,UACV2W,GAEPliB,IAEIyM,EAAc3H,MAChB6iH,IAAkB,E,EAU1B,GAJG72F,GAAgB62F,IACjB72F,EAAarxB,KAAKi1E,IAGjBrnC,EACD,OAAOnrB,GAGT,MAAMkmG,IAAkB,EAAA5hD,EAAA,GAAU,cAC5BxmE,GAAO,IAAW,EAAD,gCACrB,GAAGywB,IAAeA,IAChB,MAAM23F,GAGR,GAAmB,IAAhBrB,KAAsBL,EAAU,CACjC,MAAMx6C,QAAa5iD,EAAA,gBAAiC,CAACxmB,MAAO/D,EAAK0R,QAASgL,aAAa,EAAbA,EAAehL,QAAShE,MAAOk6G,IACzG,GAAGl2F,IAAeA,IAChB,MAAM23F,GAGR,MAAMvqH,QAAkBywF,EAAA,sBAAiC,CACvD9lF,UAAY0f,EAAsB,GAClCpnB,OAAUw+C,IAASunE,KAAkB/lH,EACrCc,SAAUC,EACVwsF,cAAeniB,EACfxrD,QACAI,SACAxL,KAAM,MAAQvW,EAAIiG,GAClBwhH,cACAC,YACAc,aACAc,KAAMxB,GACNp2F,WAAY61F,QAAAA,EAAyB71F,EACrC/yB,UAKI4qH,EAAejB,GAAe,K,QAClC,MAAMC,EAA0B,QAAnB,EAAGpB,EAAU,EAAAnnH,EAAIiG,WAAE,QAAhBkhH,EAAU,GEjZnB,SAA0BxlH,G,MACvC,MAAMkN,EAAUlN,EAAOoiB,WAAW,MAC5B7d,EAAO,IAAgB,QAAV,EAAAvE,EAAO6/C,WAAG,QAAI,GAC3B7/B,EAAQzb,EACR6b,EAAS7b,EACTsjH,GAAS7nH,EAAOggB,MAAQA,GAAS,EAEjC8nG,EAAQ9nH,EAAOogB,OAASA,EADf,EAET2nG,EAAY76G,EAAQouF,aAAausB,EAAOC,EAAO9nG,EAAOI,GAAQyrB,KACpE,IAAIm8E,EAAK,EAAGC,EAAK,EAAGC,EAAK,EAAGC,EAAK,EACjC,IAAI,IAAIrnG,EAAI,EAAGA,EAAIinG,EAAUxoH,OAAQuhB,GAAK,EACxCknG,GAAMD,EAAUjnG,GAChBmnG,GAAMF,EAAUjnG,EAAI,GACpBonG,GAAMH,EAAUjnG,EAAI,GACpBqnG,GAAMJ,EAAUjnG,EAAI,GAGtB,MAAMsnG,EAAYrgH,SAASC,cAAc,UACzCogH,EAAUpoG,MAAQzb,EAClB6jH,EAAUhoG,OAAS7b,EACnB,MAAM8jH,EAAaD,EAAUhmG,WAAW,MAClC4rB,EAAQ,IAAIytD,kBAAkB,CAAM,IAALusB,EAAWG,EAAS,IAALF,EAAWE,EAAS,IAALD,EAAWC,EAAI,MAC5ExsB,EAAO,QAAQ3tD,EAAM,OAAOA,EAAM,OAAOA,EAAM,OAAOA,EAAM,MAMlE,OALAq6E,EAAWv0E,UAAY6nD,EACvB0sB,EAAWt0E,SAAS,EAAG,EAAGq0E,EAAUpoG,MAAOooG,EAAUhoG,QACrDioG,EAAWv0E,UAAY,2BACvBu0E,EAAWt0E,SAAS,EAAG,EAAGq0E,EAAUpoG,MAAOooG,EAAUhoG,QAE9CgoG,EAAUhmB,UAAU,aAC7B,CFoX8CkmB,CAAiBnrH,EAAU6C,OAAO,IACvEwnB,EAAsB/lB,SAAS+lB,GAAQA,EAAIvf,MAAMssE,YAAY,aAAc,OAAOqyC,OAAY,OAC7FjmH,EAEE4nH,EAAe,CAACzgH,EAAwB9H,KAC5C,MAAMpB,EAAUkJ,EAAUmK,oBAAsBjS,GAAU8H,EAAUmK,mBAClD,IAAfkkG,IACDA,GAAcA,IAAev3G,GAA+B,QAApBA,EAAQgb,UAAsBe,EAAA,8BAGxE,MAAM7N,EAAK,KACNlO,GAAWA,IAAYoB,GAA8B,QAApBpB,EAAQgb,SAC1Chb,EAAQM,Q,EAIRi3G,EAKFhiC,EAAA,UAAqB,KACnBn0E,GAAUA,EAAOiQ,UAAUxS,IAAI,WAC5BmB,GACDA,EAAQqR,UAAUxS,IAAI,YAGxB2gB,EAAepe,GAAUpB,GAAS,KAChCu1E,EAAA,UAAqB,KACnBn0E,GAAUA,EAAOiQ,UAAU/Q,OAAO,WAClC4N,GAAI,GACJ,GACD,IAAI,IAfNlO,GACDu1E,EAAA,SAAqBrnE,E,EAwC3B,OArBA3P,EAAUmN,iBAAiB,cAAc,KACvC,MAAMtK,EAAS7C,EAAU6C,OAAO,KACf,IAAdo2G,GAAuB+P,MACxB,EAAAqC,EAAA,GAAkBnqH,EAAK2B,EAAQ6mH,IAG9BF,IACDiB,IAGEzB,IACD3+F,EAAsB/lB,SAAQ,CAACqG,EAAWrC,KACzC8iH,EAAazgH,EAAW3K,EAAU6C,OAAOyF,GAAK,G,GAGjD,CAACkF,MAAM,IAEPi0C,GACDj7C,EAASsgD,mBAAmBwkE,qCAAqC7pE,GAG5DzhD,C,CAIF,GAAG6oH,GAA4B,IAAhBK,GAAmB,CACvC,MAAMqC,EAAgBjC,IAAcL,GAC9BuC,EAAYD,EAAgBE,EAAA,eAAyB,GAAKvqH,EAAIiG,GAAI,EAAG,OAAG3D,OAAWA,QAAaA,EAEhGkoH,EAAepD,EAAYkD,GACjC,GAAGE,EACD,OAAOA,EAGT,MACMzmH,GADIsmH,EAAiBlhG,EAAsBwM,MAAM,EAAG,GAAKxM,GAChChQ,KAAI,KACjC,IAAIpV,EACJ,GAAG4jH,EACD5jH,EAAQ,IAAIwgB,UACP,CACL,MAAMhgB,EAAQR,GAAQ,EAAAygB,EAAA,KAKtB,GAJAjgB,EAAM6G,OAAQ,EACXtI,IAAMyB,EAAM1B,UAAW,GACvBd,IAAMwC,EAAMxC,MAAO,GAEnBA,GAAyB,iBAAX,EAAqB,CACpC,IAAI0oH,EAAe,EAAGC,EAAc,EACpC,SAASC,IACJF,EAAepsH,KAAKuG,eAAiB8lH,IAAgB3oH,IACtD1D,KAAKwE,UAAW,EAChBxE,KAAK0D,MAAO,EACZ1D,KAAKuE,QACL2B,EAAMwL,oBAAoB,aAAc46G,IAG1CF,EAAepsH,KAAKuG,WACtB,CAEAL,EAAM0H,iBAAiB,aAAc0+G,E,EAKzC,OADA5mH,EAAM6N,UAAUxS,IAAI,iBACb2E,CAAK,IAGR0xE,EAActsD,EAAsBhQ,KAAI,CAACgQ,EAAK/hB,IAAS+hB,EAAIvV,oBAAsC7P,EAAMqD,IAAQ+hB,EAAIvV,qBACvG,IAAfkkG,IACDA,GAAcA,IAAehvF,KAAe6+F,EAAWlyC,EAAW,IAAOA,EAAW,IAAgC,QAA1BA,EAAW,GAAGl6D,WAAwBe,EAAA,8BAG/Hw7F,GACD/zG,EAAMX,SAASW,GAAUA,EAAM6N,UAAUxS,IAAI,aAG/C,MAAMwN,EAAU,IAAI6S,SAAiD,CAAMjT,EAASkT,IAAW,EAAD,gCAC5F,MAAMiD,EAAI,IAAW,EAAD,gCAClB,GAAG+O,IAAeA,IAEhB,YADAhS,EAAO2pG,IAIT,MAAMuB,EAAc7mH,EAAM7C,OACpB8wB,EAAwB,GA2D9B,IAAI64F,QADE/kH,KAELqjB,EAAsB/lB,SAAQ,CAAC+lB,EAAK/hB,KACnC,MAAM0jH,EAAS/mH,EAAMqD,GAElB0jH,IAAQD,GAAc,EAAA9kG,EAAA,IAA0B+kG,EAAQllH,GAAaG,MACxE8kH,EAAYl+G,MAFD,IA7DE,EAACwc,EAAkBplB,EAAoB0xE,KACpDK,EAAA,gBAA4B3sD,GAAK,KAC/B,IAAGuI,GAAeA,IAKlB,GAAI3tB,EAAJ,CAQA,GAAGA,EAA2B,CAC5B,MAAM0I,EAAIkV,EAAQ5P,OAAO0vC,iBACnBh0C,EAAIsU,EAAShQ,OAAO0vC,iBAC1B,KAAI,OAAsBzhD,EAAKwoH,GAAW/7G,EAAGgB,GAAI,CAE/C,MAAM9L,EAAS+H,SAASC,cAAc,UACtChI,EAAOggB,MAAQlV,EACf9K,EAAOogB,OAAStU,EACJ9L,EAAOoiB,WAAW,MAC1BM,UAAUtgB,EAA2B,EAAG,EAAGpC,EAAOggB,MAAOhgB,EAAOogB,SACpE,EAAAooG,EAAA,GAAkBnqH,EAAK2B,EAAQ6mH,G,EAKhC6B,EACD79G,EAAQzI,IAIVolB,EAAIpf,OAAOhG,GAER+zG,GACDriC,GAAcA,EAAW7jE,UAAUxS,IAAI,YACvC2gB,EAAehc,GAAO,KACpBA,EAAM6N,UAAU/Q,OAAO,WACvB40E,SAAAA,EAAY50E,QAAQ,GACnB,MAEH40E,SAAAA,EAAY50E,SAGXunH,IACDjqH,EAAA,eAAkC4F,EAA2BpF,OAAO2D,EAAWovB,GAG9EM,EAAOtxB,KAAKqD,KAAW6mH,GACxBp+G,EAAQwlB,G,MA5CJq4F,GAAkBjC,IACpB3yC,SAAAA,EAAY50E,cANd6e,EAAO2pG,G,GAmDT,EAOejtF,CAAOjT,EAAK2hG,EAAQr1C,EAAWruE,KAE5B,GAExB,IAGA,SADMtB,KACHF,GAAaG,IAAK4c,QAChB,CACH,IAAI/V,EACJ,GAAmB,IAAhBo7G,IAAqBL,EAAU,CAChC,MAAMj6G,GAAQ,EAAAmpB,EAAA,GAAgB72B,EAAK2hB,EAAOI,GAAQ,GAElDnV,EAAU2d,EAAA,mBAAoC,CAACxmB,MAAO/D,EAAK0N,QAAOgE,QAASgL,aAAa,EAAbA,EAAehL,S,MAE1F9E,EAAU2d,EAAA,mBAAoC,CAACxmB,MAAO/D,EAAK0R,QAASgL,aAAa,EAAbA,EAAehL,UAGrF9E,EAAQD,KAAKgW,EAAGjD,E,CAEpB,MAWA,OATG4qG,IACDlD,EAAYkD,GAAa19G,EACzB26G,GAAyB36G,EAAQ4J,SAAQ,KACnC+wG,YACKH,EAAYkD,E,KAKlB19G,C,CAEX,IAEA,GAAG46G,IAA+B,IAAfA,KAAsB1+F,IAAcs/F,KAA+B,IAAfZ,GAErE,OADArkG,GAAIliB,KAAOA,GACJkiB,GAGT,MAAM8F,IAAgEvM,GAAmBoM,KAAcs/F,GAErGnnH,MADCyb,EAAchc,KAAK,CAACyoB,IAAKA,EAAI,GAAIloB,UAAQwe,QAAQjT,WAyBpD,OAtBGsc,IAAc,IACf6sD,GAAmB1sD,GAChB8I,GACDA,EAAarxB,KAAKi1E,KAIH,IAAhBqyC,IAAqB1Q,SAAyBh1G,IAAV4gB,IAAwB2kG,GAkBjE,UAAoC,UAACp+G,EAAS,IAAEzJ,EAAG,SAAEsF,EAAQ,WAAEosB,EAAU,MAAExO,EAAK,MAAEvB,EAAK,YAAEsH,EAAW,eAAE+uF,EAAc,WAAEC,IAWpH3yG,EAASsgD,mBAAmBmlE,eAAe/qH,EAAIiG,IAAI,GAEnD,IAAI+kH,GAAU,GACd,QAAiBvhH,GAAiBrD,GAAM,EAAD,gCAErC,IADA,EAAAqS,EAAA,GAAYrS,GACT4kH,EAAS,CACV,MAAMl4G,EAAIpJ,SAASC,cAAc,KAWjC,OAVAmJ,EAAEI,QAAU,MACV,UACA,IAAI,IAAclT,EAAIyyE,iBAAiB7oD,MAAM,OAG/C,EAAAY,EAAA,IAAS,CACPC,YAAa,6BACbyjC,kBAAmB,CAACp7C,I,CAMxBk4G,GAAU,QAEJ/hG,EACN,MAAM,aAACgiG,EAAY,eAAEC,IAAkB,OAAqB,CAC1DlrH,MACA0xB,aACAy5F,KAAMjoG,EAAQ,QAAU,OACxBhd,KAAMyb,EAAQulG,EACdxoH,OAAQ+K,EACR3G,MAAM,EACN8kH,WAAW,EAAAS,EAAA,GAAsBroH,GACjCg4G,iBACAC,oBAGW31G,IAAV4gB,GAAwBA,GACzB+nG,EAAar5G,UAAUxS,IAAI,aAG7B8rH,EAAev+G,MAAMlM,IACnBA,EAAOwL,iBAAiB,WAAW,KACjC++G,GAAU,CAAK,GACf,GAEN,KACF,CAzEII,CAA2B,CACzB3hH,UAAW0f,EAAI,GACfnpB,MACAsF,WACAosB,aACAxO,QACAvB,QACAsH,eACA+uF,kBACAC,gBAIJ90F,GAAImkB,OAASre,GACN9F,E,IA6DF,SAAekoG,GAAoB,MAAC91F,EAAK,UAAE9rB,EAAS,SAAEnE,EAAQ,OAAEe,EAAM,WAAEqrB,I,kDAO7E,EAAAjZ,EAAA,GAAY8c,GAEZ,MAAMimB,GAAS,EAAA5/B,EAAA,GAAgBnS,EAAW,UACpC82C,EAAQ92C,EAAUib,QAAQqoC,aAE1BjuD,EAAa2K,EAAUmI,UAAUqB,SAAS,qBAAyD3Q,EAAvCitF,EAAA,eAA0B9lF,GAC5F,GAAG3K,aAAS,EAATA,EAAW6D,OAAQ,CACpB,MAAM3C,QAAYsF,EAASsgD,mBAAmB0lE,8BAA8B/qE,GAC5E,GAAGvgD,EAAK,CACN,MAAMwE,EAAQkF,SAASC,cAAc,SACrCnF,EAAMoF,MAAMoc,QAAU,OACtBvc,EAAU6N,cAAcvN,OAAOvF,GAE/B,IACE,MAAMuB,QAAYwkB,EAAA,mBAAoC,CAACxmB,MAAO/D,IAE9DwE,EAAMxD,IAAM+E,EACZvB,EAAM1B,aACA,EAAAiW,EAAA,GAAYvU,OAAOlC,GAAW,GAEpCkC,EAAMyH,iBAAiB,SAAS,KAC9BzH,EAAMxD,IAAM,GACZwD,EAAM3D,QAAQ,GACb,CAACyL,MAAM,G,CACV,MAAMzI,G,EAKV/E,EAAU+D,UAAW,EACrB/D,EAAU0tF,S,CAGZ,IAAInmF,EAAOo3B,SACT,OAGF,MAAMz9B,QAAYsF,EAASsgD,mBAAmB2lE,wBAAwBhrE,GAAO,GAC7E,IAAIvgD,EACF,OAGF,MAAMwtC,EAAoE,QAAhE,KAAqC/jC,GAAkB+hH,iBAAS,UAATA,UAAc,CAC7E14G,EAAG,GACH8S,EAAG,GAGC6lG,EAAwChiH,EAAkBgiH,0BAA2B,EAAA3qB,EAAA,IAAS,KAElG,IADetzD,EAAK16B,EAAE5R,OAEpB,OAGF,MAAMq+D,EAAY/xB,EAAK16B,EAAE,GAAG0tB,EAE5BgN,EAAK16B,EAAE1P,SAAS0P,IACdA,EAAE0tB,GAAK1tB,EAAE0tB,EAAI++B,GAAa,GAAI,IAGhC,MAAM/jB,GAAS,EAAA5/B,EAAA,GAAgBnS,EAAW,UAC1CnE,EAAS8G,mBAAmBuoD,UAAUzkC,EAAA,eAA0B,CAC9DjiB,EAAG,8BACHy9G,QAAQ,EAAA9kD,EAAA,IAAoBprB,EAAO92B,QAAQpe,KAC3CykF,SAAUxqC,EACVorE,YAAa,CACX19G,EAAG,WACHu/B,KAAMo+E,KAAKC,UAAUr+E,MAEtB,EAAMtd,EAAA,kBAETsd,EAAK16B,EAAE5R,OAAS,CAAC,GAChB,KAAM,GAEHgiB,EAAQs4B,EAASA,EAAO5pC,UAAUqB,SAAS,eAAY3Q,GACvD,aAAC2oH,IAAgB,OAAqB,CAC1CjrH,MACA0xB,aACAy5F,KAAMjoG,EAAQ,QAAU,OACxBhd,KAAM,IACNxH,OAAQ+K,EACR3G,MAAM,EACNgpH,kBAAkB,SAGPxpH,IAAV4gB,GAAwBA,GACzB+nG,EAAar5G,UAAUxS,IAAI,aAI1Bm2B,EAAMztB,YACP0lC,EAAK16B,EAAEpS,KAAK,CACV+hB,EAAG,EACH+d,EAAGpa,KAAKC,QAGVolG,I,gJGzxBW,SAASM,GAAqB,KAC3C7lH,EAAI,IACJlG,EAAG,WACH0xB,EAAU,OACVhzB,EAAM,KACNysH,EAAI,UACJzD,EAAS,KACT5kH,EAAI,SACJwC,EAAQ,UACRsiH,EAAS,iBACTkE,EAAgB,eAChB9T,EAAc,WACdC,I,MAeA,MAAMgT,EAAevhH,SAASC,cAAc,OAO5C,IAAI7K,EANJmsH,EAAar5G,UAAUxS,IAAI,mBAG3B6rH,EAAarhH,MAAM+X,MAAQzb,EAAO,KAClC+kH,EAAarhH,MAAMmY,OAAS7b,EAAO,KAGnC,MAAM8lH,EAAmB,KACvBl+E,EAAiB3lC,QACjBrJ,SAAAA,EAAW+B,SACXoqH,EAAapqH,SACb,2DAAmE,SAAUs0B,EAAS,EAGlF2Y,EAAuC,QAApB,EAAApc,aAAU,EAAVA,EAAY2c,gBAAQ,SAAI,SACjD3c,EAAaoc,EAAiBxsC,MAE9B,MAAM4pH,GAAiB,QAAY,CACjC/hG,IAAK8hG,EACLjrH,MACA0xB,aACAqmF,WAAW,EACXD,YAAY,EACZ/1G,OAAQk2G,EACRt2F,MAAOzb,EACP6b,OAAQ7b,EACRpD,OACAnE,MAAO,OACP+oH,YACApiH,WACAsiH,cACCj7G,MAAK,EAAE26B,YAAYA,IAAQ36B,MAAMpN,IAElC,IADA,OAA0BA,IACtBmyB,IAEF,MADAnyB,EAAWsB,UACL,OAAU,cAgBlB,OAbA/B,EAAYS,EACZT,EAAUmN,iBAAiB,cAAeygF,KACnCurB,GAAcvrB,IAAY5tF,EAAU6tF,YAAc,OAAQjuF,IAC7DstH,G,IAID,KACDltH,EAAUmN,iBAAiB,cAAc,KACvCvI,UAAUuoH,QAAQ,IAAI,GACrB,CAAC3/G,MAAM,IAGLxN,CAAS,IAGZotH,EAAwBpnH,IAC5B,MAAM6d,EAAI9d,KAAK8zC,SAAW7zC,EAAM,EAChC,OAAO6d,EAAI7d,GAAO6d,EAAI7d,EAAM6d,CAAC,EAGzBwpG,EAAgBL,EAAmBI,EAAqB,IAAM,EAC9DE,EAAgBN,EAAmBI,EAAqB,GAAK,EAC7DG,EAAc,KAClB,KAAI,OAAQ3tH,GAEV,YADAstH,IAIF,MAAMprG,EAAOliB,EAAOmiB,wBAEdyrG,EAAS1rG,EAAKe,MAAQ,IACtB4qG,EAAyB,WAATpB,EAAoB,EAAI,IAAe,UAATA,EAAmB,GAAK,GAAKmB,EAE3EE,EAAyB,WAATrB,EAAoB,EAAI,EAAImB,EAE5CG,EAAiB,UAATtB,EAAmBvqG,EAAK+7B,MAAQ/7B,EAAKI,KAC7C0rG,EAAQ9rG,EAAKa,IAEbkrG,GAAuB,WAATxB,GAAqBvqG,EAAKe,MAAQzb,GAAQ,EAAc,UAATilH,GAAoBjlH,EAAO,GAAMqmH,EAAgBJ,EAC9GS,GAA2ChsG,EAAKmB,OAAS7b,GAAQ,EAASsmH,EAAgBJ,EAC1F7mG,EAAIknG,EAAQE,EACZnnG,EAAIknG,EAAQE,EAEfpnG,IAAMtf,GAAQsf,GAAK,WACpBwmG,IAIChU,GACW,WAATmT,EAAmBF,EAAarhH,MAAMuhH,IAAmC,EAA3BtmH,KAAKuZ,IAAImuG,GAAsB,KAC3EtB,EAAarhH,MAAMoX,KAAO2rG,EAAa,KAC5C1B,EAAarhH,MAAM6X,IAAMmrG,EAAa,OAEtC3B,EAAarhH,MAAM6X,IAAM+D,EAAI,KAC7BylG,EAAarhH,MAAMoX,KAAOuE,EAAI,K,EAI5B4P,GAAW,OAAgBk3F,GAYjC,OAXA,wDAAgE,SAAUl3F,GAE1Ek3F,IAEGrU,GACDiT,EAAar5G,UAAUxS,IAAI,eAC3BV,EAAO4Y,cAAcvN,OAAOkhH,IAE5B,oCAA4CA,GAGvC,CAACA,eAAcC,iBACxB,C,uECpJe,SAAe2B,EAAiB3gG,G,qCAK7C,MAAM,MACJq0B,EAAK,IACLp3B,EAAG,SACH7jB,EAAW,cACT4mB,EACElsB,QAAYsF,EAASsgD,mBAAmB2lE,wBAAwBhrE,GACtE,IAAIvgD,EAEF,MADAmpB,EAAIvX,UAAUxS,IAAI,yBACZ,IAAI+sC,MAAM,cAGlB,OAAO,QAAY,OAAD,QAChBnsC,MACA8C,MAAM,EACNf,MAAM,GACHmqB,GAEP,E,8rBCde,SAAe4gG,GAAoB,IAAC7qH,EAAG,cAAEya,EAAa,UAAEjT,EAAS,MAAE9K,EAAK,SAAEkE,EAAQ,MAAE8e,EAAK,OAAEI,EAAM,SAAEzc,EAAW,aAAkB,WAAEosB,I,+CAW/I,GAAa,QAAV,EAAAzvB,EAAIqL,cAAM,eAAEpM,OAkDb,OAjDAuI,EAAUmI,UAAUxS,IAAI,8BACxBsd,EAAchc,KAAK,CACjByoB,IAAK1f,EACLxI,KAAM,IAAW,EAAD,gCACd,MAAM8rH,QAAwBznH,EAASsgD,mBAAmBonE,kCAAkC/qH,GACtF2K,EAAU,aAA4BmgH,GAE5C,GAAG9qH,EAAI6J,OAAOumD,WAAapwD,EAAI6J,OAAOmhH,OACpC,OAAOrgH,EACND,MAAMwgE,IACL,wBAAiC,CAC/B1jE,YACA1H,MAAM,EACNc,WACAysF,cAAeniB,EACfxrD,QACAI,SACA0lG,aAAa,EACblxG,KAAM,WAAatU,EAAIgE,GACvBtH,QACA+yB,cACA,IAEC,CACL,IAAI3tB,EAYJ,OAXG9B,EAAI6J,OAAOmhH,QACZlpH,GAAQ,SACPA,EAA2BlB,UAAW,EACtCkB,EAA2BqH,OAAQ,EACnCrH,EAA2BhC,MAAO,GAEnCgC,EAAQ,IAAIwgB,MAGdxgB,EAAM6N,UAAUxS,IAAI,iBAEbwN,EAAQD,MAAMwgE,KACnB,QAAmBppE,EAAO20B,IAAI8oE,gBAAgBr0B,IAAO,KACnD1jE,EAAUM,OAAOhG,GAEd9B,EAAI6J,OAAOmhH,QACZ,iBAAkClpH,EAA2BpF,E,GAE/D,G,CAGR,MAMJ,IAAIuuH,EAGFA,EADCjrH,EAAIkrH,kBACW7nH,EAAS4pD,gBAAgB4/B,uBAAuB7sF,EAAIkrH,mBAEpD7nH,EAASsgD,mBAAmBC,cAAc5jD,GAAK0K,MAAM+4C,GAAeA,EAAWc,UAAU,KAG3G,MAAMxmD,QAAYktH,EACL,kBAAVltH,EAAIiO,IACL,QAAY,CACVjO,MACAmpB,IAAK1f,EACL9K,MAAOA,EACP+d,gBACApX,WACAqc,QACAI,SACA2P,c,+DCzFS,SAAS07F,GAAiB,IAACptH,EAAG,IAAEw5B,EAAG,KAAEtzB,EAAI,SAAEZ,IAMxD,MAAM+nH,EAAgB7zF,EAAIz1B,MACpBA,EAAQy1B,EAAIogD,YAAY,SAE3ByzC,GACDtpH,EAAM6N,UAAUxS,IAAI,QAGtB,MAAM2yB,EAA+Bs7F,EAAgB,QAAK/qH,EAEpDgrH,EAAiB,UAATpnH,EAAmB,GAAK,GAChCiiC,GAAS,QAAY,CACzBhf,IAAKplB,EACL/D,IAAKA,EACL2hB,MAAO2rG,EACPvrG,OAAQurG,EACRv7F,eACAzsB,aACCqH,MAAK,EAAE26B,YAAYA,IAOtB,OALAvV,GAAgBtS,QAAQgI,IAAIsK,GAAcplB,MAAK,KAC7C5I,EAAM6N,UAAU/Q,OAAO,QACvBwsH,EAAcxsH,QAAQ,IAGjBsnC,CACT,C,iFC9Be,SAAeolF,EAC5BrhG,G,qCAIA,MAAM,OAAC7lB,EAAM,SAAEiL,EAAQ,UAAEE,GAAa0a,EAEhCjD,EAA4BxJ,QAAQjT,UACpCsG,GAAI,OAAwB,UAAYzM,EAAOs1B,YAAcrqB,EAAW,KAAM,OAAmBA,GAAY,KAAOE,EAAY,KAAM,OAAmBA,GAAa,KAY5K,OAXAsB,EAAElB,UAAUxS,IAAI,aAAc,qBAQ9B0T,EAAE/I,aAAa,OAAcmiB,IAGtB,CACLq7C,QAAQ,EACRhnE,QAASuS,EACTmW,cAEJ,E,03BCKA,IAAIukG,EAA0B,EAuBf,SAAeC,GAAU,IAACztH,EAAG,UAAEyJ,EAAS,QAAEjD,EAAO,SAAEswB,EAAQ,UAAEC,EAAS,SAAEmvF,EAAQ,MAAEhjG,EAAK,WAAEwO,EAAU,cAAEhV,EAAa,OAAE06C,EAAM,MAAEz4D,EAAK,YAAEq4B,EAAW,UAAEqgC,EAAS,iBAAEpgC,EAAgB,aAAElF,EAAY,aAAEmF,EAAY,UAAEtO,EAAS,UAAE8kG,EAAS,cAAEjlH,EAAa,aAAEkjC,EAAY,SAAErmC,EAAW,aAAkB,oBAAEqoH,I,+CAwBxS,MAAM51F,EAAmB4T,aAAY,EAAZA,EAAcpnC,MACvC,IAAIs6G,EAAsC,IAArB9mF,EACrB,MAAM61F,IAAgB92F,GAAYC,GAC5B82F,IAEW,UAAb7tH,EAAIC,MACFD,EAAIkG,MAvDoB,WAwDvB0nH,KAEc,QAAb5tH,EAAIC,KAAiB,2BAAmC,8BAEhE,IAAI6tH,GAAuBC,GAE3B,IAAI32D,EAAQ,CACV02D,GAAWpkH,SAASC,cAAc,QAClCmkH,GAASl8G,UAAUxS,IAAI,cACvBqK,EAAUM,OAAO+jH,IAEjB,IAAIE,GAAiB,EACL,QAAbhuH,EAAIC,MACL6tH,GAAS30F,WAAY,OAASn5B,EAAIkF,UAAU,GAExCgyB,GAA6B,UAAbl3B,EAAIC,OACnB4tH,KAAgBhP,EACjBiP,GAASl8G,UAAUxS,IAAI,QAAS,gBAEhC4uH,GAAiB,KAIrBF,GAAS30F,UAAY,MAEjB00F,IAAgB32F,IAClB82F,GAAiB,EACjBnP,OAAiBv8G,IAIlB0rH,IACDD,GAAWrkH,SAASC,cAAc,QAClCokH,GAASn8G,UAAUxS,IAAI,aAAc,kBAAmB,aAAc,mBACtEqK,EAAUM,OAAOgkH,I,CAIrB,MAAMv+F,GAGF,CAAC,EAEL,GAAqB,cAAlBxvB,EAAI+U,UAA2B,CAChC,MAAMk5G,QAAiB,OAAU,CAC/B92F,MAAOn3B,EACPwG,UACAiD,YACAqtB,WACAC,YACAmvF,WACAhjG,QACAxG,gBACAgV,aACAuF,mBACAlF,eACAgG,mBACA7xB,KAAM0iB,EACNtjB,aAKF,OAFAkqB,GAAI9hB,MAAQugH,EACZz+F,GAAIvG,YAAcglG,EAASl8F,aAAayF,KACjChI,E,CAQT,IAAInV,GAEJ,MAAM9V,IAAQ,SAGd,GAFAA,GAAMqN,UAAUxS,IAAI,eACpBmF,GAAM6G,OAAQ,EACE,UAAbpL,EAAIC,KAAkB,CACvB,MAAMiuH,EAAWxkH,SAASC,cAAc,OACxCukH,EAASt8G,UAAUxS,IAAI,cAAe,aACtC8uH,EAASxpG,QAAQpe,IAAM,GAAKE,EAAQF,IACpC4nH,EAASxpG,QAAQre,OAAS,GAAKG,EAAQH,OACtC6nH,EAAiB1nH,QAAUA,EAE5B,MAAMN,EAAO,iBACPioH,EAAWjoH,EAAKyb,MAAQ,EACxBouB,EAAc,IACd+R,EAASqsE,EAA0B,EAAdp+E,EAC3Bm+E,EAASrwG,UAAY,qCAAqC3X,EAAKyb,kBAAkBzb,EAAKyb,6IACMouB,UAAoBo+E,UAAiBA,SAAgBrsE,sCAGjJ,MAAMtb,EAAS0nF,EAASt6G,kBAAkBA,kBACtC45G,IACFA,EAA0B,EAAI3oH,KAAKo9C,GAAKH,GAE1Ctb,EAAO58B,MAAM0rE,gBAAkBk4C,EAA0B,IAAMA,EAC/DhnF,EAAO58B,MAAMwkH,iBAAmB,GAAKZ,EAErCM,GAASl8G,UAAUxS,IAAI,SAENoH,EAAQsF,OAAOI,cAE9BgiH,EAASt8G,UAAUxS,IAAI,aAGzB,MAAMuC,EAAS+H,SAASC,cAAc,UACtChI,EAAOggB,MAAQhgB,EAAOogB,OAAS/hB,EAAIyM,EAEnCyhH,EAAS73G,QAAQ1U,EAAQmsH,IACzBI,EAASnkH,OAAOxF,IAChBkF,EAAUM,OAAOmkH,GAEjB,MAAM3gD,EAAM5rE,EAAOoiB,WAAW,MAKxBqY,EAAS,KACb,MAAM51B,EAA4B0nH,EAAiB1nH,QAC7C6nH,EAAc,aAAoC7nH,GAAUq4G,GAC5Dh/F,EAAQ,MACX,0BAAoCJ,QAAQjT,WAAWgK,SAAQ,MAC3D,OAAQ63G,KAIXA,EAAYt+G,oBAAoB,OAAQ5J,GACxCkoH,EAAYt+G,oBAAoB,aAAcg6B,GAC9CskF,EAAYt+G,oBAAoB,QAASu+G,GACzCD,EAAYt+G,oBAAoB,QAASlI,GAAQ,GACjD,EAGE0mH,EAAU,KACdhhD,EAAIlpD,UAAUgqG,EAAa,EAAG,GAE9B,MAAM91F,EAASi1F,EAA0Ba,EAAYzpH,YAAcypH,EAAYnpH,SAAWsoH,EAG1F,OAFAhnF,EAAO58B,MAAMwkH,iBAAmB,GAAK71F,GAE7B81F,EAAY1rH,MAAM,EAGtBmnC,EAAe,KACfukF,EAAYnpH,YAIZ,OAAQmpH,IAKTA,EAAY1rH,QACb4rH,IAGFT,GAAS30F,WAAY,OAASk1F,EAAYnpH,SAAWmpH,EAAYzpH,aAAa,IAR5Eib,IAQkF,EAGhFkqB,GAAsB,QAAS,MACnC,QAAQD,EAAa,GACpB,KAAM,GAEH3jC,EAAS,KACb5B,GAAMqN,UAAUxS,IAAI,QACpB8uH,EAASt8G,UAAU/Q,OAAO,cAC1B,QAAc0tH,EAAS5sH,GAEpB0Y,IAAaA,GAAUA,WAAaA,GAAUA,UAAUzI,UAAUqB,SAAS,WAC5EoH,GAAU/H,S,EAIRg8G,EAAW,MACX,OAAQD,GAKZH,EAASt8G,UAAUxS,IAAI,aAJrBygB,GAIiC,EAG/BhY,EAAU,KACdtD,GAAMqN,UAAU/Q,OAAO,QACvBqtH,EAASt8G,UAAUxS,IAAI,aAEvBmF,GAAMK,YAAc,EACpBkpH,GAAS30F,WAAY,OAASk1F,EAAYnpH,UAAU,GAEjDmpH,EAAYzpH,cACbypH,EAAYzpH,YAAc,E,EAI9BypH,EAAYpiH,iBAAiB,OAAQ9F,GACrCkoH,EAAYpiH,iBAAiB,aAAc89B,GAC3CskF,EAAYpiH,iBAAiB,QAASqiH,GACtCD,EAAYpiH,iBAAiB,QAASpE,IAEtC,QAAiBlG,GAASyE,IAaxB,IAZA,OAAYA,GAGTiU,KAAcA,GAAU85D,UACzB95D,GAAU/H,UAQT+7G,EAAY1rH,OAAQ,CACrB,MAAM8oC,IAAqBhjC,EAC3B,GAAG,qBAA4CA,GAAiB,CAC9DpC,OAAQ,KACRoK,YAAa,CAACxC,EAAG,4BACjBy9B,WAAW,IACT,CACF,MAAO38B,EAAM9G,GAASwjC,GAAwB,QAAiByiF,EAAU1nH,EAAQF,KAAxC,GACzC,eAAsC,CAACD,OAAQG,EAAQH,OAAQC,IAAKE,EAAQF,KAAMyI,EAAM9G,E,CAG1FomH,EAAYvrH,M,MAEZurH,EAAYzrH,O,IAIbyrH,EAAY1rH,OACV0rH,EAAYnpH,UAAYmpH,EAAYzpH,cAAgBypH,EAAYnpH,UAAYmpH,EAAYzpH,YAAc,GACvG2pH,IACAzkF,IACAvlC,GAAMqN,UAAUxS,IAAI,SAEpBkvH,IAGFnoH,G,EAIDK,EAAQsF,OAAO27B,aACfymF,EAAiB9xF,OAASA,EAC3B8xF,EAASxpG,QAAQ8iB,WAAa,KAE9BpL,G,MAEOuxF,IACTppH,GAAM1B,UAAW,GAGnB,IAAIorH,GAgEAroH,GA/DJ,GAAGY,EAAS,CAoBV,GAnBAynH,SAAiB,OAAU,CACzB92F,MAAOn3B,EACPwG,UACAiD,YACAqtB,WACAC,YACAmvF,WACAhjG,QACAxG,gBACAgV,aACAuF,kBAAkB,EAClBlF,eACAgG,iBAAkB4T,aAAY,EAAZA,EAAcxU,MAChCjxB,KAAM0iB,EACNtjB,aAGFkqB,GAAI9hB,MAAQugH,IAEPJ,IAA4B,QAAb7tH,EAAIC,MAAmB+2B,EAEzC,OADAxH,GAAIvG,YAAcglG,GAASl8F,aAAayF,KACjChI,GAGT,GAAG02F,EAAU,CACX,MAAMpgG,GAAiBmoG,GAAS12F,OAAO7pB,OAASugH,GAAS12F,OAAOC,MAAMlgB,cACtE/S,GAAMod,OAASmE,EAAcR,eAAe,KAAM,SAClD/gB,GAAMwd,QAAU+D,EAAcR,eAAe,KAAM,UACnDQ,EAAc/b,OAAOxF,G,OAElB,IAAI8yD,EAAW,CACpB,MAAMtuC,GAAW,OAAyB/oB,EAAK,CAAC,GAAiB,GACjE,GAAG+oB,EAAU,CACX,MAAM0sD,EAAa1sD,EAASzE,MAC5BmxD,EAAW7jE,UAAUxS,IAAI,gBACzBqK,EAAUM,OAAO0rE,GACjBjmD,GAAI9hB,MAAQ,CACVqkB,aAAc,CACZrkB,MAAOqb,EAASE,YAChBuO,KAAM/X,QAAQjT,WAEhB+qB,OAAQ,CACN7pB,MAAO+nE,EACPj+C,KAAM,MAERnd,UAAW,KACXqH,SAAU,MAGZqQ,SAAAA,EAAcrxB,KAAKqoB,EAASE,aAC5BuG,GAAIvG,YAAcF,EAASE,W,EAI/B,GAAG+N,EACD,OAAOxH,IAGLjrB,GAAM+S,eAAiB7N,KACxBwkH,cAAQ,EAARA,GAAUvsG,WAAYjY,GAAWM,OAAOxF,IAI3C,MAAMuB,GAAkB,IAAW,EAAD,gCAChC,OAAOF,SAAqBN,EAASO,cAAcC,gBAAgB9F,EAAK0tH,aAAS,EAATA,EAAWztH,KACrF,UAEM6F,KAEN,MAAMg5G,GAAiBt4G,aAAO,EAAPA,EAASkhC,kBAC7Bo3E,IACDzkG,GAAY,IAAI,IAAqB,CACnCg6D,aAAc,UACdD,UAAU,IAEZ/5D,GAAUuQ,cAAc,cAA6Bk0F,KACrDzkG,GAAU0P,OAAOtgB,GAAW,GAC5Bo1G,OAAiBv8G,GACRsD,GAAakjB,YAAe9oB,EAAI0F,mBAAsBuxB,EAIvDj3B,EAAI0F,oBACZ2U,GAAY,IAAI,IAAqB,CACnCoC,YAAY,EACZ43D,aAAc,aANhBh6D,GAAY,IAAI,IAAqB,CACnCg6D,aAAc,YASlB,MAAMm6C,IAAiB,SAevB,GAdAjqH,GAAM0H,iBAAiB,SAAU7F,IACP,IAArB7B,GAAMmmB,MAAMxS,MACbzN,QAAQigB,MAAM,SAAWnmB,GAAMmmB,MAAMxS,KAAO,cAAgB3T,GAAMmmB,MAAMlkB,SAGvE6T,KAAcykG,IACfzkG,GAAU4P,SAGRukG,GAAeprG,aACjBorG,GAAehiH,S,GAEhB,CAACF,MAAM,IAEM,UAAbtM,EAAIC,KAAkB,CACvB,MAAM6pC,EAAe,KACfvlC,GAAMW,WAIV4oH,GAAS30F,WAAY,OAAS50B,GAAMW,SAAWX,GAAMK,aAAa,GAAM,EAGpEmlC,GAAsB,QAAS,MACnC,QAAQD,EAAa,GACpB,KAAK,GAERvlC,GAAM0H,iBAAiB,aAAc89B,GAElCgkF,IACDxpH,GAAM0H,iBAAiB,cAAc,KACnC,kBAA4B8hH,IAAU,KACpCA,GAASltH,QAAQ,GACjB,GACD,CAACyL,MAAM,G,CAId/H,GAAM6G,OAAQ,EACd7G,GAAMxC,MAAO,EAET4rH,IACFppH,GAAM1B,UAAW,GAGnB,IAAI4rH,GAAqB5P,IAAqC,QAAnB,EAAAoP,cAAQ,EAARA,GAAU5zG,iBAAS,eAAEi6D,UAChE,MAAMrzE,GAAO,IAAW,EAAD,gCAClBoZ,IAAawkG,IAAmB5nF,IACjC5c,GAAU7Q,YACV6Q,GAAU0Q,mBAGNjlB,KACN,IAAImjB,EAA4BxJ,QAAQjT,UACxC,GAAI6N,KAAcykG,IAAmB7nF,EACnC,GAAIrxB,GAAakjB,YAAe9oB,EAAI0F,kBAW1B1F,EAAI0F,oBACTm5G,EACD51F,EAAcxJ,QAAQC,QAAO,OAAU,sBAC9B9Z,GAAakjB,YAAczO,KACpCA,GAAU0P,OAAOtgB,GAAW,EAAO,MACnClF,GAAM0H,iBAAiB,EAAAnL,UAAY,aAAe,WAAW,KAC3DuZ,GAAU4P,QAAQ,GACjB,CAAC3d,MAAM,UAlByC,CACrD,MAAMM,EAAUqc,EAAc,qBAAoC,CAChEllB,MAAO/D,EACP0R,QAASgL,aAAa,EAAbA,EAAehL,QACxBk1G,UAAW/H,EACXnxG,MAAOggH,IAGNrzG,IACDA,GAAU0P,OAAOtgB,GAAW,EAAOmD,E,CAsDzC,OAxCIiyG,GAAkB4P,KACpBA,KACAA,GAAqB,MAGvB5P,OAAiBv8G,EAEjB2mB,EAAYtc,MAAK,IAAW,EAAD,iCACtB+kB,GAAeA,KAKF,UAAb1xB,EAAIC,MACL,+BAAsDuG,EAAQH,OAAQG,EAAQF,IAAKE,EAAQsF,OAAOC,oBAG9FjG,MAEN,OAAYvB,IAAOoI,MAAK,KACnBhO,GACD,iBAAkC4F,GAAO5F,GAGxC0b,KAAcykG,IACfzkG,GAAU4P,SAGZukG,GAAehiH,SAAS,IACtB3I,IACF4G,QAAQigB,MAAM,mBAAoB7mB,GAC/BiqH,IACDA,GAASl8G,UAAUxS,IAAI,YAEzBovH,GAAe9uG,OAAO7b,EAAI,KAG5B,QAAmBU,GAAOqB,GAAaG,MA5BrCyoH,GAAehiH,SA6BnB,KAAG,KAEI,CAACgI,SAAUyU,EAAaqe,OAAQ7nB,QAAQgI,IAAI,CAACwB,EAAaulG,KACnE,IAwCA,OAtCGn0G,KAAcykG,IACfzkG,GAAUgyB,oBAAoBprC,IAqBhB,QAAbjB,EAAIC,MAAmB4tH,GAOxBr+F,GAAIvG,YAAevM,GAEhBA,EAAchc,KAAK,CAACyoB,IAAK1f,EAAWxI,KAAM,IAAMA,KAAO0L,MAAK,EAAE26B,YAAYA,MAAW7nB,QAAQjT,kBADvFvL,MAAQqmC,QAPjB,QAAiB79B,GAAYrD,KAC3B,OAAYA,GACZ2nH,GAASltH,SACTI,IAAM,GACL,CAACoS,SAAS,EAAM/G,MAAM,IAOxBkjB,GAAI9hB,cACC8hB,GAAI9hB,MAAMqkB,aAAarkB,OAGxB8hB,E,IA5iBT,qBAA4B,gBAAgB,CAAChY,EAAM4uF,KACjD,GAAGA,IAAO,YAAqB5uF,IAAS,WAAmB,CACzD,MAAMqM,EAAWtM,MAAMC,KAAK9N,SAASoN,iBAAiB,gCAChD6K,EAAQ,uBACRwsG,EAAWxsG,EAAQ,EACnBmgC,EAASqsE,EAAW,EAC1BX,EAA0B,EAAI3oH,KAAKo9C,GAAKH,EACxCj+B,EAASzgB,SAAS7C,IAChBA,EAAQukB,eAAe,KAAM,QAAS,GAAKnD,GAC3CphB,EAAQukB,eAAe,KAAM,SAAU,GAAKnD,GAE5C,MAAM6kB,EAASjmC,EAAQqT,kBACvB4yB,EAAO1hB,eAAe,KAAM,KAAM,GAAKqpG,GACvC3nF,EAAO1hB,eAAe,KAAM,KAAM,GAAKqpG,GACvC3nF,EAAO1hB,eAAe,KAAM,IAAK,GAAKg9B,GAEtCtb,EAAO58B,MAAM0rE,gBAAkBk4C,EAA0B,IAAMA,EAC/DhnF,EAAO58B,MAAMwkH,iBAAmB,GAAKZ,CAAuB,G,2EClDnD,SAASkB,EAAuBx2F,GAC7C,MAAMy2F,GAAuB,OAAaz2F,EAAQU,aAAe,GAAI,IAAK,KAS1E,OAAO,QAAa+1F,EAItB,C,uECde,SAASC,EAAiB12F,GACvC,IAAI22F,EAAa32F,EAAQ9qB,OAAS8qB,EAAQtlB,QAAUslB,EAAQ42F,WAAa,GAEzE,OADAD,GAAa,OAAaA,EAAY,GAAI,MACnC,QAAaA,EAAY,CAAC/I,SAAS,EAAMlsD,cAAc,GAChE,C,+CCEA,MAEA,EAFmD,CAAC,IAAM,CAAC,KAAO,MAAM,MAAQ,8BAA8B,OAAS,MAAM,OAAS,QAAQ,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,iBAAiB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,eAAe,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAM,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,gBAAgB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,iBAAiB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,oBAAoB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,oBAAoB,OAAS,MAAM,OAAS,OAAO,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,wCAAwC,OAAS,MAAM,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,mBAAmB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,gBAAgB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,gBAAgB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,qBAAqB,OAAS,MAAM,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,iBAAiB,OAAS,KAAK,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,mBAAmB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,kBAAkB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,cAAc,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,KAAK,WAAa,UAAU,IAAM,CAAC,KAAO,MAAM,MAAQ,eAAe,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,wBAAwB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,iBAAiB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,SAAS,WAAa,cAAc,IAAM,CAAC,KAAO,MAAM,MAAQ,oBAAoB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,eAAe,OAAS,MAAM,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,eAAe,OAAS,MAAM,OAAS,KAAK,cAAgB,GAAG,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,iBAAiB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,iBAAiB,OAAS,MAAM,OAAS,QAAQ,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,iBAAiB,OAAS,MAAM,OAAS,QAAQ,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,iBAAiB,OAAS,MAAM,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,OAAO,OAAS,IAAI,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,gBAAgB,OAAS,IAAI,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,KAAK,WAAa,UAAU,IAAM,CAAC,KAAO,MAAM,MAAQ,gBAAgB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,qBAAqB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,mBAAmB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,mBAAmB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,gBAAgB,OAAS,MAAM,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,mBAAmB,OAAS,MAAM,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,oBAAoB,OAAS,MAAM,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,UAAU,WAAa,eAAe,IAAM,CAAC,KAAO,MAAM,MAAQ,qBAAqB,OAAS,IAAI,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,eAAe,OAAS,IAAI,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,kBAAkB,OAAS,MAAM,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,kBAAkB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,eAAe,OAAS,IAAI,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,kBAAkB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,kBAAkB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,mBAAmB,OAAS,IAAI,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,oBAAoB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,iBAAiB,OAAS,MAAM,OAAS,QAAQ,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,SAAS,WAAa,cAAc,IAAM,CAAC,KAAO,MAAM,MAAQ,mBAAmB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,kBAAkB,OAAS,MAAM,OAAS,QAAQ,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,eAAe,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,mBAAmB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,SAAS,WAAa,cAAc,IAAM,CAAC,KAAO,MAAM,MAAQ,kBAAkB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,oBAAoB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,eAAe,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,oBAAoB,OAAS,MAAM,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,qBAAqB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,iBAAiB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,qBAAqB,OAAS,MAAM,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,kBAAkB,OAAS,MAAM,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,iBAAiB,OAAS,MAAM,OAAS,OAAO,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,qBAAqB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,oBAAoB,OAAS,MAAM,OAAS,MAAO,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,KAAK,WAAa,UAAU,IAAM,CAAC,KAAO,MAAM,MAAQ,qBAAqB,OAAS,MAAM,OAAS,MAAO,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,kBAAkB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,kBAAkB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,eAAe,OAAS,MAAM,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,qBAAqB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,eAAe,OAAS,MAAM,OAAS,QAAQ,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,eAAe,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,gBAAgB,OAAS,MAAM,OAAS,OAAO,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,gBAAgB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,cAAc,OAAS,MAAM,OAAS,QAAQ,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,gBAAgB,OAAS,MAAM,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,mBAAmB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,YAAY,OAAS,IAAI,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,qBAAqB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,eAAe,OAAS,MAAM,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,6BAA6B,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,oBAAoB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,qBAAqB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,SAAS,WAAa,cAAc,IAAM,CAAC,KAAO,MAAM,MAAQ,oBAAoB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAM,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,mBAAmB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,uBAAuB,OAAS,IAAI,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,MAAM,WAAa,KAAS,IAAM,CAAC,KAAO,MAAM,MAAQ,iBAAiB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,kBAAkB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,UAAU,WAAa,eAAe,IAAM,CAAC,KAAO,MAAM,MAAQ,kBAAkB,OAAS,IAAI,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,cAAc,OAAS,MAAM,OAAS,QAAQ,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,qBAAqB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,Y,uDCR55iB,MAAMm1D,EAAyE,CAAC,GAAK,CAAC,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,IAAK,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,GAAI,GAAG,CAAC,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,KAAM,KAAO,KAAM,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,KAAM,KAAO,KAAM,KAAO,KAAM,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,IAAK,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,KAAM,KAAO,MAAO,KAAO,KAAM,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,KAAM,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,KAAM,KAAO,KAAM,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,OAAO,MAAO,OAAO,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,MAAO,kBAAkB,MAAO,QAAQ,MAAO,kBAAkB,MAAO,4CAA4C,MAAO,4CAA4C,MAAO,4CAA4C,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,6BAA6B,KAAM,wCAAwC,KAAM,QAAQ,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,6BAA6B,KAAM,6BAA6B,KAAM,wCAAwC,KAAM,wCAAwC,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,GAAI,QAAQ,IAAK,QAAQ,IAAK,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,GAAI,QAAQ,IAAK,QAAQ,IAAK,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,IAAK,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,IAAK,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,iBAAiB,KAAM,iBAAiB,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EA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","sources":["webpack://tweb/./src/components/animationIntersector.ts","webpack://tweb/./src/components/appMediaPlaybackController.ts","webpack://tweb/./src/components/appMediaViewer.ts","webpack://tweb/./src/lib/mediaPlayer.ts","webpack://tweb/./src/components/appMediaViewerBase.ts","webpack://tweb/./src/helpers/fillPropertyValue.ts","webpack://tweb/./src/components/appNavigationController.ts","webpack://tweb/./src/components/appSearch.ts","webpack://tweb/./src/components/appSearchSuper..ts","webpack://tweb/./src/helpers/dom/lockTouchScroll.ts","webpack://tweb/./src/components/appSelectPeers.ts","webpack://tweb/./src/components/audio.ts","webpack://tweb/./src/helpers/avatarListLoader.ts","webpack://tweb/./src/components/appMediaViewerAvatar.ts","webpack://tweb/./src/components/avatar.ts","webpack://tweb/./src/components/avatarEdit.ts","webpack://tweb/./src/components/button.ts","webpack://tweb/./src/components/buttonCorner.ts","webpack://tweb/./src/components/buttonIcon.ts","webpack://tweb/./src/components/buttonMenu.ts","webpack://tweb/./src/components/buttonMenuToggle.ts","webpack://tweb/./src/components/chat/gradientRenderer.ts","webpack://tweb/./src/helpers/easing/easeOutQuad.ts","webpack://tweb/./src/components/chat/selection.ts","webpack://tweb/./src/helpers/dom/getSelectedText.ts","webpack://tweb/./src/components/checkboxField.ts","webpack://tweb/./src/components/codeInputField.ts","webpack://tweb/./src/components/confirmationPopup.ts","webpack://tweb/./src/components/countryInputField.ts","webpack://tweb/./src/components/dotRenderer.ts","webpack://tweb/./src/components/editPeer.ts","webpack://tweb/./src/components/emoticonsDropdown/tabs/gifs.ts","webpack://tweb/./src/components/sidebarRight/tabs/gifs.ts","webpack://tweb/./src/components/sidebarRight/tabs/stickers.ts","webpack://tweb/./src/components/emoticonsDropdown/index.ts","webpack://tweb/./src/components/emoticonsDropdown/tabs/emoji.ts","webpack://tweb/./src/lib/richTextProcessor/wrapSingleEmoji.ts","webpack://tweb/./src/components/lazyLoadQueueRepeat.ts","webpack://tweb/./src/components/emoticonsDropdown/tabs/stickers.ts","webpack://tweb/./src/components/generateDelimiter.ts","webpack://tweb/./src/components/generateFakeIcon.ts","webpack://tweb/./src/components/lazyLoadQueueRepeat2.ts","webpack://tweb/./src/components/gifsMasonry.ts","webpack://tweb/./src/components/horizontalMenu.ts","webpack://tweb/./src/components/inputField.ts","webpack://tweb/./src/helpers/dom/selectElementContents.ts","webpack://tweb/./src/components/inputSearch.ts","webpack://tweb/./src/components/lazyLoadQueue.ts","webpack://tweb/./src/components/lazyLoadQueueIntersector.ts","webpack://tweb/./src/components/mediaProgressLine.ts","webpack://tweb/./src/components/middleEllipsis.ts","webpack://tweb/./src/components/monkeys/password.ts","webpack://tweb/./src/components/monkeys/tracking.ts","webpack://tweb/./src/components/passwordInputField.ts","webpack://tweb/./src/components/peerProfileAvatars.ts","webpack://tweb/./src/components/peerProfile.ts","webpack://tweb/./src/components/generateTitleIcons.ts","webpack://tweb/./src/components/generateVerifiedIcon.ts","webpack://tweb/./src/components/generatePremiumIcon.ts","webpack://tweb/./src/components/peerTitle.ts","webpack://tweb/./src/components/popups/avatar.ts","webpack://tweb/./src/lib/cropper.ts","webpack://tweb/./src/components/popups/deleteDialog.ts","webpack://tweb/./src/components/popups/deleteMessages.ts","webpack://tweb/./src/components/popups/forward.ts","webpack://tweb/./src/components/popups/index.ts","webpack://tweb/./src/components/popups/limit.ts","webpack://tweb/./src/components/popups/mute.ts","webpack://tweb/./src/components/popups/peer.ts","webpack://tweb/./src/components/popups/pickUser.ts","webpack://tweb/./src/components/popups/sendNow.ts","webpack://tweb/./src/components/popups/stickers.ts","webpack://tweb/./src/components/preloader.ts","webpack://tweb/./src/components/putPhoto.ts","webpack://tweb/./src/components/wrappers/getPeerInitials.ts","webpack://tweb/./src/components/putPreloader.ts","webpack://tweb/./src/components/radioField.ts","webpack://tweb/./src/components/radioForm.ts","webpack://tweb/./src/components/rangeSelector.ts","webpack://tweb/./src/components/ripple.ts","webpack://tweb/./src/components/row.ts","webpack://tweb/./src/components/scrollable.ts","webpack://tweb/./src/components/settingSection.ts","webpack://tweb/./src/components/sidebarLeft/tabs/newGroup.ts","webpack://tweb/./src/lib/appManagers/utils/privacy/privacyType.ts","webpack://tweb/./src/lib/appManagers/utils/privacy/getPrivacyRulesDetails.ts","webpack://tweb/./src/components/privacySection.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/phoneNumber.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/passwordSet.ts","webpack://tweb/./src/helpers/dom/canFocus.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/emailConfirmation.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/email.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/hint.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/reEnterPassword.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/enterPassword.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/index.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/lastSeen.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/profilePhoto.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/forwardMessages.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/addToGroups.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/calls.ts","webpack://tweb/./src/components/sidebarLeft/tabs/activeSessions.ts","webpack://tweb/./src/components/sidebarLeft/tabs/blockedUsers.ts","webpack://tweb/./src/helpers/string/convertKeyToInputKey.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/voices.ts","webpack://tweb/./src/components/sidebarLeft/tabs/activeWebSessions.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacyAndSecurity.ts","webpack://tweb/./src/components/sidebarLeft/tabs/quickReaction.ts","webpack://tweb/./src/components/sidebarLeft/tabs/generalSettings.ts","webpack://tweb/./src/helpers/eachMinute.ts","webpack://tweb/./src/helpers/eachTimeout.ts","webpack://tweb/./src/components/sidebarLeft/tabs/chatFolders.ts","webpack://tweb/./src/components/sidebarLeft/tabs/notifications.ts","webpack://tweb/./src/components/sidebarLeft/tabs/language.ts","webpack://tweb/./src/components/sidebarLeft/tabs/autoDownload/photo.ts","webpack://tweb/./src/components/sidebarLeft/tabs/autoDownload/file.ts","webpack://tweb/./src/components/sidebarLeft/tabs/autoDownload/video.ts","webpack://tweb/./src/components/sidebarLeft/tabs/dataAndStorage.ts","webpack://tweb/./src/components/sidebarLeft/tabs/settings.ts","webpack://tweb/./src/components/sidebarLeft/tabs/newChannel.ts","webpack://tweb/./src/components/popups/createContact.ts","webpack://tweb/./src/components/sidebarLeft/tabs/contacts.ts","webpack://tweb/./src/components/sidebarLeft/tabs/archivedTab.ts","webpack://tweb/./src/components/sidebarLeft/tabs/peopleNearby.ts","webpack://tweb/./src/components/sidebarLeft/index.ts","webpack://tweb/./src/components/sidebarLeft/tabs/addMembers.ts","webpack://tweb/./src/helpers/averageColor.ts","webpack://tweb/./src/helpers/highlightningColor.ts","webpack://tweb/./src/components/colorPicker.ts","webpack://tweb/./src/components/sidebarLeft/tabs/backgroundColor.ts","webpack://tweb/./src/components/sidebarLeft/tabs/background.ts","webpack://tweb/./src/helpers/files/requestFile.ts","webpack://tweb/./src/components/sidebarLeft/tabs/includedChats.ts","webpack://tweb/./src/components/sidebarLeft/tabs/editFolder.ts","webpack://tweb/./src/components/sidebarLeft/tabs/editProfile.ts","webpack://tweb/./src/components/sidebarRight/index.ts","webpack://tweb/./src/components/sidebarRight/tabs/editContact.ts","webpack://tweb/./src/components/sidebarRight/tabs/editTopic.ts","webpack://tweb/./src/components/sidebarRight/tabs/chatType.ts","webpack://tweb/./src/components/sidebarRight/tabs/userPermissions.ts","webpack://tweb/./src/components/sidebarRight/tabs/groupPermissions.ts","webpack://tweb/./src/lib/appManagers/utils/chats/combineParticipantBannedRights.ts","webpack://tweb/./src/components/sidebarRight/tabs/chatReactions.ts","webpack://tweb/./src/components/sidebarRight/tabs/editChat.ts","webpack://tweb/./src/components/sidebarRight/tabs/sharedMedia.ts","webpack://tweb/./src/components/singleTransition.ts","webpack://tweb/./src/components/slider.ts","webpack://tweb/./src/components/sliderTab.ts","webpack://tweb/./src/components/sortedUserList.ts","webpack://tweb/./src/components/stickerViewer.ts","webpack://tweb/./src/components/stickyIntersector.ts","webpack://tweb/./src/components/swipeHandler.ts","webpack://tweb/./src/components/telInputField.ts","webpack://tweb/./src/components/toast.ts","webpack://tweb/./src/components/transition.ts","webpack://tweb/./src/lib/richTextProcessor/isUsernameValid.ts","webpack://tweb/./src/components/usernameInputField.ts","webpack://tweb/./src/components/usernamesSection.ts","webpack://tweb/./src/components/visibilityIntersector.ts","webpack://tweb/./src/components/volumeSelector.ts","webpack://tweb/./src/components/wrappers/customEmoji.ts","webpack://tweb/./src/components/wrappers/document.ts","webpack://tweb/./src/components/wrappers/formatUserPhone.ts","webpack://tweb/./src/components/wrappers/getChatMembersString.ts","webpack://tweb/./src/components/wrappers/getPeerTitle.ts","webpack://tweb/./src/components/wrappers/getUserStatusString.ts","webpack://tweb/./src/components/wrappers/mediaSpoiler.ts","webpack://tweb/./src/components/wrappers/messageActionTextNew.ts","webpack://tweb/./src/components/topicAvatar.ts","webpack://tweb/./src/components/wrappers/joinVoiceChatAnchor.ts","webpack://tweb/./src/components/wrappers/messageActionTextNewUnsafe.ts","webpack://tweb/./src/components/wrappers/messageForReply.ts","webpack://tweb/./src/components/wrappers/peerTitle.ts","webpack://tweb/./src/components/wrappers/photo.ts","webpack://tweb/./src/components/wrappers/senderToPeer.ts","webpack://tweb/./src/components/wrappers/sentTime.ts","webpack://tweb/./src/components/wrappers/sticker.ts","webpack://tweb/./src/helpers/bytes/getPathFromBytes.ts","webpack://tweb/./src/helpers/computeLockColor.ts","webpack://tweb/./src/components/wrappers/stickerAnimation.ts","webpack://tweb/./src/components/wrappers/stickerEmoji.ts","webpack://tweb/./src/components/wrappers/stickerSetThumb.ts","webpack://tweb/./src/components/wrappers/stickerToRow.ts","webpack://tweb/./src/components/wrappers/topicNameButton.ts","webpack://tweb/./src/components/wrappers/video.ts","webpack://tweb/./src/components/wrappers/webPageDescription.ts","webpack://tweb/./src/components/wrappers/webPageTitle.ts","webpack://tweb/./src/config/currencies.ts","webpack://tweb/./src/config/emoji.ts","webpack://tweb/./src/config/font.ts","webpack://tweb/./src/environment/imageBitmapSupport.ts","webpack://tweb/./src/helpers/animation.ts","webpack://tweb/./src/helpers/array/filterAsync.ts","webpack://tweb/./src/helpers/array/findAndSpliceAll.ts","webpack://tweb/./src/helpers/audioAssetPlayer.ts","webpack://tweb/./src/helpers/blob/readBlobAsDataURL.ts","webpack://tweb/./src/helpers/heavyQueue.ts","webpack://tweb/./src/helpers/blur.ts","webpack://tweb/./src/helpers/bytes/getPreviewURLFromBytes.ts","webpack://tweb/./src/helpers/bytes/bytesToDataURL.ts","webpack://tweb/./src/helpers/calcImageInBox.ts","webpack://tweb/./src/helpers/canvas/drawCircle.ts","webpack://tweb/./src/helpers/canvas/getTextWidth.ts","webpack://tweb/./src/helpers/canvas/scaleMediaElement.ts","webpack://tweb/./src/helpers/cleanSearchText.ts","webpack://tweb/./src/helpers/clipboard.ts","webpack://tweb/./src/helpers/contextMenuController.ts","webpack://tweb/./src/helpers/date.ts","webpack://tweb/./src/helpers/dom/anchorCopy.ts","webpack://tweb/./src/helpers/dom/attachContextMenuListener.ts","webpack://tweb/./src/helpers/dom/attachGrabListeners.ts","webpack://tweb/./src/helpers/dom/cancelSelection.ts","webpack://tweb/./src/helpers/dom/clickEvent.ts","webpack://tweb/./src/helpers/dom/controlsHover.ts","webpack://tweb/./src/helpers/dom/createContextMenu.ts","webpack://tweb/./src/helpers/dom/createStickersContextMenu.ts","webpack://tweb/./src/helpers/dom/createVideo.ts","webpack://tweb/./src/helpers/dom/customProperties.ts","webpack://tweb/./src/helpers/dom/dispatchEvent.ts","webpack://tweb/./src/helpers/dom/documentFragmentToHTML.ts","webpack://tweb/./src/helpers/dom/findUpAsChild.ts","webpack://tweb/./src/helpers/dom/findUpAttribute.ts","webpack://tweb/./src/helpers/dom/findUpTag.ts","webpack://tweb/./src/helpers/dom/fullScreen.ts","webpack://tweb/./src/helpers/dom/getCaretPosNew.ts","webpack://tweb/./src/helpers/dom/getRichElementValue.ts","webpack://tweb/./src/helpers/dom/getRichValueWithCaret.ts","webpack://tweb/./src/helpers/dom/getViewportSlice.ts","webpack://tweb/./src/helpers/dom/getVisibleRect.ts","webpack://tweb/./src/helpers/dom/handleHorizontalSwipe.ts","webpack://tweb/./src/helpers/dom/handleTabSwipe.ts","webpack://tweb/./src/helpers/dom/htmlToDocumentFragment.ts","webpack://tweb/./src/helpers/dom/htmlToSpan.ts","webpack://tweb/./src/helpers/dom/isInDOM.ts","webpack://tweb/./src/helpers/dom/isInputEmpty.ts","webpack://tweb/./src/helpers/dom/isSendShortcutPressed.ts","webpack://tweb/./src/helpers/dom/isSwipingBackSafari.ts","webpack://tweb/./src/helpers/dom/placeCaretAtEnd.ts","webpack://tweb/./src/helpers/dom/positionElementByIndex.ts","webpack://tweb/./src/helpers/dom/renderImageFromUrl.ts","webpack://tweb/./src/helpers/dom/renderMediaWithFadeIn.ts","webpack://tweb/./src/helpers/dom/replaceContent.ts","webpack://tweb/./src/helpers/dom/compareNodes.ts","webpack://tweb/./src/helpers/dom/richInputHandler.ts","webpack://tweb/./src/helpers/dom/sortable.ts","webpack://tweb/./src/helpers/dom/toggleDisability.ts","webpack://tweb/./src/helpers/dom/whichChild.ts","webpack://tweb/./src/helpers/dropdownHover.ts","webpack://tweb/./src/helpers/fastSmoothScroll.ts","webpack://tweb/./src/helpers/fileName.ts","webpack://tweb/./src/helpers/filterChatPhotosMessages.ts","webpack://tweb/./src/helpers/formatBytes.ts","webpack://tweb/./src/helpers/formatCallDuration.ts","webpack://tweb/./src/helpers/formatDuration.ts","webpack://tweb/./src/helpers/formatPhoneNumber.ts","webpack://tweb/./src/helpers/framesCache.ts","webpack://tweb/./src/helpers/generatePathData.ts","webpack://tweb/./src/helpers/getImageFromStrippedThumb.ts","webpack://tweb/./src/helpers/getPreviewURLFromThumb.ts","webpack://tweb/./src/helpers/getStrippedThumbIfNeeded.ts","webpack://tweb/./src/helpers/listLoader.ts","webpack://tweb/./src/helpers/listenerSetter.ts","webpack://tweb/./src/helpers/mediaSize.ts","webpack://tweb/./src/helpers/mediaSizes.ts","webpack://tweb/./src/helpers/middlewarePromise.ts","webpack://tweb/./src/helpers/number/formatNumber.ts","webpack://tweb/./src/helpers/number/numberThousandSplitter.ts","webpack://tweb/./src/helpers/onMediaLoad.ts","webpack://tweb/./src/helpers/overlayClickHandler.ts","webpack://tweb/./src/helpers/paymentsWrapCurrencyAmount.ts","webpack://tweb/./src/helpers/positionMenu.ts","webpack://tweb/./src/helpers/restrictions.ts","webpack://tweb/./src/helpers/saveLottiePreview.ts","webpack://tweb/./src/helpers/schedulers/throttleWithRaf.ts","webpack://tweb/./src/helpers/schedulers/throttleWith.ts","webpack://tweb/./src/helpers/scrollableLoader.ts","webpack://tweb/./src/helpers/searchListLoader.ts","webpack://tweb/./src/lib/appManagers/utils/messageId/incrementMessageId.ts","webpack://tweb/./src/helpers/sequentialDom.ts","webpack://tweb/./src/helpers/setAttachmentSize.ts","webpack://tweb/./src/helpers/sortedList.ts","webpack://tweb/./src/helpers/string/bom.ts","webpack://tweb/./src/helpers/string/encodeEntities.ts","webpack://tweb/./src/helpers/string/escapeRegExp.ts","webpack://tweb/./src/helpers/string/limitSymbols.ts","webpack://tweb/./src/helpers/string/toHHMMSS.ts","webpack://tweb/./src/helpers/textToSvgURL.ts","webpack://tweb/./src/helpers/windowSize.ts","webpack://tweb/./src/hooks/useHeavyAnimationCheck.ts","webpack://tweb/./src/components/dialogsContextMenu.ts","webpack://tweb/./src/components/connectionStatus.ts","webpack://tweb/./src/components/sendingStatus.ts","webpack://tweb/./src/helpers/easing/easeInOutSine.ts","webpack://tweb/./src/helpers/canvas/roundRect.ts","webpack://tweb/./src/components/groupCallActiveIcon.ts","webpack://tweb/./src/helpers/canvas/shimmer.ts","webpack://tweb/./src/helpers/dialogsPlaceholder.ts","webpack://tweb/./src/helpers/dom/shake.ts","webpack://tweb/./src/lib/appManagers/appDialogsManager.ts","webpack://tweb/./src/helpers/number/getUnsafeRandomInt.ts","webpack://tweb/./src/lib/appManagers/appDownloadManager.ts","webpack://tweb/./src/helpers/dom/createDownloadAnchor.ts","webpack://tweb/./src/helpers/array/partition.ts","webpack://tweb/./src/components/chat/bubbleGroups.ts","webpack://tweb/./src/components/popups/datePicker.ts","webpack://tweb/./src/components/divAndCaption.ts","webpack://tweb/./src/components/chat/replyContainer.ts","webpack://tweb/./src/components/wrappers/reply.ts","webpack://tweb/./src/components/stackedAvatars.ts","webpack://tweb/./src/components/chat/replies.ts","webpack://tweb/./src/components/chat/messageRender.ts","webpack://tweb/./src/helpers/dom/reflowScrollableElement.ts","webpack://tweb/./src/lib/mtproto/constants.ts","webpack://tweb/./src/lib/appManagers/internalLink.ts","webpack://tweb/./src/components/popups/joinChatInvite.ts","webpack://tweb/./src/components/chat/reaction.ts","webpack://tweb/./src/components/chat/reactions.ts","webpack://tweb/./src/helpers/scrollSaver.ts","webpack://tweb/./src/helpers/dom/superIntersectionObserver.ts","webpack://tweb/./src/lib/appManagers/utils/messages/isMentionUnread.ts","webpack://tweb/./src/helpers/array/accumulate.ts","webpack://tweb/./src/helpers/cacheCallback.ts","webpack://tweb/./src/helpers/string/replaceNonNumber.ts","webpack://tweb/./src/helpers/cards/cardBrands.ts","webpack://tweb/./src/helpers/array/createArray.ts","webpack://tweb/./src/helpers/string/buggedNumbers.ts","webpack://tweb/./src/helpers/cards/patternCharacters.ts","webpack://tweb/./src/helpers/cards/cardFormattingPatterns.ts","webpack://tweb/./src/helpers/cards/formatValueByPattern.ts","webpack://tweb/./src/helpers/cards/validateCard.ts","webpack://tweb/./src/helpers/string/nbsp.ts","webpack://tweb/./src/components/telegramWebView.ts","webpack://tweb/./src/components/popups/paymentVerification.ts","webpack://tweb/./src/components/popups/paymentCard.ts","webpack://tweb/./src/helpers/cards/formatInputValueByPattern.ts","webpack://tweb/./src/components/popups/paymentCardConfirmation.ts","webpack://tweb/./src/components/popups/paymentShipping.ts","webpack://tweb/./src/components/popups/paymentShippingMethods.ts","webpack://tweb/./src/components/popups/payment.ts","webpack://tweb/./src/components/groupedLayout.ts","webpack://tweb/./src/components/prepareAlbum.ts","webpack://tweb/./src/components/wrappers/album.ts","webpack://tweb/./src/components/sidebarRight/tabs/pollResults.ts","webpack://tweb/./src/components/poll.ts","webpack://tweb/./src/helpers/string/isRTL.ts","webpack://tweb/./src/components/chat/bubbles.ts","webpack://tweb/./src/helpers/dom/copyFromElement.ts","webpack://tweb/./src/components/wrappers/groupedDocuments.ts","webpack://tweb/./src/components/wrappers/poll.ts","webpack://tweb/./src/components/popups/unpinMessage.ts","webpack://tweb/./src/helpers/dom/isSelectionEmpty.ts","webpack://tweb/./src/helpers/preloadAnimatedEmojiSticker.ts","webpack://tweb/./src/components/popups/reportMessagesConfirm.ts","webpack://tweb/./src/components/popups/reportMessages.ts","webpack://tweb/./src/components/popups/sponsored.ts","webpack://tweb/./src/components/popups/reactedList.ts","webpack://tweb/./src/components/chat/reactionsMenu.ts","webpack://tweb/./src/components/chat/contextMenu.ts","webpack://tweb/./src/components/chat/sendContextMenu.ts","webpack://tweb/./src/components/popups/createPoll.ts","webpack://tweb/./src/helpers/createPoster.ts","webpack://tweb/./src/helpers/getGifDuration.ts","webpack://tweb/./src/components/inputFieldAnimated.ts","webpack://tweb/./src/components/popups/newMedia.ts","webpack://tweb/./src/helpers/dom/attachListNavigation.ts","webpack://tweb/./src/components/chat/autocompleteHelper.ts","webpack://tweb/./src/components/chat/stickersHelper.ts","webpack://tweb/./src/components/popups/schedule.ts","webpack://tweb/./src/components/chat/emojiHelper.ts","webpack://tweb/./src/components/chat/autocompletePeerHelper.ts","webpack://tweb/./src/components/chat/commandsHelper.ts","webpack://tweb/./src/components/chat/autocompleteHelperController.ts","webpack://tweb/./src/components/chat/mentionsHelper.ts","webpack://tweb/./src/components/chat/replyKeyboard.ts","webpack://tweb/./src/components/chat/inlineHelper.ts","webpack://tweb/./src/components/chat/botCommands.ts","webpack://tweb/./src/helpers/modifyAckedResult.ts","webpack://tweb/./src/components/chat/sendAs.ts","webpack://tweb/./src/helpers/dom/hasMarkupInSelection.ts","webpack://tweb/./src/components/chat/input.ts","webpack://tweb/./src/components/wrappers/draft.ts","webpack://tweb/./src/components/chat/pinnedContainer.ts","webpack://tweb/./src/components/chat/pinnedMessageBorder.ts","webpack://tweb/./src/components/chat/audio.ts","webpack://tweb/./src/components/chat/pinnedMessage.ts","webpack://tweb/./src/helpers/dom/handleScrollSideEvent.ts","webpack://tweb/./src/components/chat/topbar.ts","webpack://tweb/./src/components/sidebarRight/tabs/search.ts","webpack://tweb/./src/components/chat/search.ts","webpack://tweb/./src/components/chat/patternRenderer.ts","webpack://tweb/./src/components/chat/chat.ts","webpack://tweb/./src/helpers/autoDownload.ts","webpack://tweb/./src/components/chat/markupTooltip.ts","webpack://tweb/./src/components/chat/dragAndDrop.ts","webpack://tweb/./src/helpers/dom/disableTransition.ts","webpack://tweb/./src/components/lineBlobDrawable.ts","webpack://tweb/./src/components/topbarWeave.ts","webpack://tweb/./src/lib/rlottie/rlottieIcon.ts","webpack://tweb/./src/components/superIcon.ts","webpack://tweb/./src/components/groupCall/microphoneIcon.ts","webpack://tweb/./src/components/groupCall/participantMutedIcon.ts","webpack://tweb/./src/components/groupCall/index.ts","webpack://tweb/./src/components/groupCall/participantStatus.ts","webpack://tweb/./src/components/groupCall/participantsList.ts","webpack://tweb/./src/components/call/videoCanvasBlur.ts","webpack://tweb/./src/components/groupCall/participantVideo.ts","webpack://tweb/./src/components/groupCall/participantVideos.ts","webpack://tweb/./src/components/groupCall/participants.ts","webpack://tweb/./src/components/groupCall/description.ts","webpack://tweb/./src/components/groupCall/title.ts","webpack://tweb/./src/components/call/button.ts","webpack://tweb/./src/components/movableElement.ts","webpack://tweb/./src/helpers/movablePanel.ts","webpack://tweb/./src/helpers/toggleClassName.ts","webpack://tweb/./src/components/call/description.ts","webpack://tweb/./src/components/groupCall/microphoneIconMini.ts","webpack://tweb/./src/components/call/index.ts","webpack://tweb/./src/components/topbarCall.ts","webpack://tweb/./src/lib/appManagers/uiNotificationsManager.ts","webpack://tweb/./src/config/notifications.ts","webpack://tweb/./src/helpers/files/getFilesFromEvent.ts","webpack://tweb/./src/helpers/addAnchorListener.ts","webpack://tweb/./src/lib/appManagers/appImManager.ts","webpack://tweb/./src/lib/appManagers/utils/messages/canSaveMessageMedia.ts","webpack://tweb/./src/lib/appManagers/utils/messages/getMediaFromMessage.ts","webpack://tweb/./src/lib/appManagers/utils/messages/getMessageSenderPeerIdOrName.ts","webpack://tweb/./src/lib/appManagers/utils/messages/isMessageRestricted.ts","webpack://tweb/./src/lib/appManagers/utils/peers/getPeerColorById.ts","webpack://tweb/./src/lib/appManagers/utils/peers/getPeerEditableUsername.ts","webpack://tweb/./src/lib/appManagers/utils/peers/getPeerId.ts","webpack://tweb/./src/lib/appManagers/utils/photos/choosePhotoSize.ts","webpack://tweb/./src/lib/calls/callConnectionInstanceBase.ts","webpack://tweb/./src/lib/calls/helpers/createPeerConnection.ts","webpack://tweb/./src/lib/calls/helpers/createDataChannel.ts","webpack://tweb/./src/lib/calls/helpers/parseSignalingData.ts","webpack://tweb/./src/lib/calls/callConnectionInstance.ts","webpack://tweb/./src/lib/crypto/subtle.ts","webpack://tweb/./src/lib/calls/p2P/p2PEncryptor.ts","webpack://tweb/./src/lib/crypto/utils/sha256.ts","webpack://tweb/./src/lib/calls/p2P/chromeP2PSdpBuilder.ts","webpack://tweb/./src/lib/calls/p2P/p2PSdpBuilder.js","webpack://tweb/./src/lib/calls/p2P/firefoxP2PSdpBuilder.js","webpack://tweb/./src/lib/calls/p2P/safariP2PSdpBuilder.js","webpack://tweb/./src/lib/calls/callInstance.ts","webpack://tweb/./src/lib/calls/p2P/getCallProtocol.ts","webpack://tweb/./src/lib/calls/p2P/getRtcConfiguration.ts","webpack://tweb/./src/lib/calls/helpers/getStreamCached.ts","webpack://tweb/./src/lib/calls/callInstanceBase.ts","webpack://tweb/./src/lib/calls/callState.ts","webpack://tweb/./src/components/call/getAudioAsset.ts","webpack://tweb/./src/lib/calls/callsController.ts","webpack://tweb/./src/lib/calls/constants.ts","webpack://tweb/./src/lib/calls/groupCallConnectionInstance.ts","webpack://tweb/./src/lib/calls/helpers/processMediaSection.ts","webpack://tweb/./src/lib/calls/helpers/filterServerCodecs.ts","webpack://tweb/./src/lib/calls/helpers/fixLocalOffer.ts","webpack://tweb/./src/lib/calls/groupCallInstance.ts","webpack://tweb/./src/lib/calls/groupCallState.ts","webpack://tweb/./src/components/groupCall/getAudioAsset.ts","webpack://tweb/./src/lib/calls/groupCallsController.ts","webpack://tweb/./src/lib/calls/helpers/createMainStreamManager.ts","webpack://tweb/./src/lib/calls/helpers/getAudioConstraints.ts","webpack://tweb/./src/environment/constraintSupport.ts","webpack://tweb/./src/lib/calls/helpers/getScreenConstraints.ts","webpack://tweb/./src/lib/calls/helpers/getScreenStream.ts","webpack://tweb/./src/lib/calls/helpers/getStream.ts","webpack://tweb/./src/lib/calls/helpers/getVideoConstraints.ts","webpack://tweb/./src/lib/calls/helpers/parseMediaSectionInfo.ts","webpack://tweb/./src/lib/calls/helpers/parseSourceGroups.ts","webpack://tweb/./src/lib/calls/helpers/stopTrack.ts","webpack://tweb/./src/lib/calls/localConferenceDescription.ts","webpack://tweb/./src/lib/calls/sdp/index.ts","webpack://tweb/./src/helpers/string/splitStringByLimitWithRest.ts","webpack://tweb/./src/helpers/uniqueNumberGenerator.ts","webpack://tweb/./src/lib/calls/sdp/attributeSplitted.ts","webpack://tweb/./src/lib/calls/sdp/mediaLineParts.ts","webpack://tweb/./src/lib/calls/sdp/line.ts","webpack://tweb/./src/lib/calls/sdp/attributeInner.ts","webpack://tweb/./src/lib/calls/sdp/attributes.ts","webpack://tweb/./src/lib/calls/sdp/mediaSection.ts","webpack://tweb/./src/lib/calls/sdp/sessionSection.ts","webpack://tweb/./src/lib/calls/sdp/utils.ts","webpack://tweb/./src/lib/calls/sdpBuilder.ts","webpack://tweb/./src/lib/calls/streamManager.ts","webpack://tweb/./src/lib/calls/stringFromLineBuilder.ts","webpack://tweb/./src/lib/calls/utils.ts","webpack://tweb/./src/lib/richTextProcessor/getAbbreviation.ts","webpack://tweb/./src/lib/richTextProcessor/getEmojiEntityFromEmoji.ts","webpack://tweb/./src/lib/richTextProcessor/matchEmail.ts","webpack://tweb/./src/lib/richTextProcessor/setBlankToAnchor.ts","webpack://tweb/./src/lib/richTextProcessor/wrapAbbreviation.ts","webpack://tweb/./src/lib/richTextProcessor/wrapDraftText.ts","webpack://tweb/./src/lib/richTextProcessor/wrapEmojiText.ts","webpack://tweb/./src/environment/emojiVersionsSupport.ts","webpack://tweb/./src/lib/richTextProcessor/wrapRichText.ts","webpack://tweb/./src/helpers/buildURLHash.ts","webpack://tweb/./src/lib/richTextProcessor/wrapTelegramUrlToAnchor.ts","webpack://tweb/./src/lib/rlottie/queryableWorker.ts","webpack://tweb/./src/environment/webAssemblySupport.ts","webpack://tweb/./src/lib/rlottie/lottieLoader.ts","webpack://tweb/./src/lib/rlottie/rlottiePlayer.ts","webpack://tweb/./src/pages/pagesManager.ts","webpack://tweb/./src/pages/page.ts","webpack://tweb/./src/vendor/emoji/index.ts","webpack://tweb/./public/recorder.min.js","webpack://tweb/./src/vendor/bezier-easing/index.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 {CustomEmojiElement, CustomEmojiRendererElement} from '../lib/richTextProcessor/wrapRichText';\nimport rootScope from '../lib/rootScope';\nimport {IS_SAFARI} from '../environment/userAgent';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport isInDOM from '../helpers/dom/isInDOM';\nimport RLottiePlayer from '../lib/rlottie/rlottiePlayer';\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\nimport forEachReverse from '../helpers/array/forEachReverse';\nimport idleController from '../helpers/idleController';\nimport appMediaPlaybackController from './appMediaPlaybackController';\nimport {fastRaf} from '../helpers/schedulers';\nimport {Middleware} from '../helpers/middleware';\n\nexport type AnimationItemGroup = '' | 'none' | 'chat' | 'lock' |\n 'STICKERS-POPUP' | 'emoticons-dropdown' | 'STICKERS-SEARCH' | 'GIFS-SEARCH' |\n `CHAT-MENU-REACTIONS-${number}` | 'INLINE-HELPER' | 'GENERAL-SETTINGS' | 'STICKER-VIEWER' | 'EMOJI' |\n 'EMOJI-STATUS' | `chat-${number}`;\nexport interface AnimationItem {\n el: HTMLElement,\n group: AnimationItemGroup,\n animation: AnimationItemWrapper,\n controlled?: boolean | Middleware\n};\n\nexport interface AnimationItemWrapper {\n remove: () => void;\n paused: boolean;\n pause: () => any;\n play: () => any;\n autoplay: boolean;\n // onVisibilityChange?: (visible: boolean) => boolean;\n};\n\nexport class AnimationIntersector {\n private observer: IntersectionObserver;\n private visible: Set;\n\n private overrideIdleGroups: Set;\n private byGroups: {[group in AnimationItemGroup]?: AnimationItem[]};\n private byPlayer: Map;\n private lockedGroups: {[group in AnimationItemGroup]?: true};\n private onlyOnePlayableGroup: AnimationItemGroup;\n\n private intersectionLockedGroups: {[group in AnimationItemGroup]?: true};\n private videosLocked: boolean;\n\n constructor() {\n this.observer = new IntersectionObserver((entries) => {\n // if(rootScope.idle.isIDLE) return;\n\n for(const entry of entries) {\n const target = entry.target;\n\n for(const group in this.byGroups) {\n if(this.intersectionLockedGroups[group as AnimationItemGroup]) {\n continue;\n }\n\n const animation = this.byGroups[group as AnimationItemGroup].find((p) => p.el === target);\n if(!animation) {\n continue;\n }\n\n if(entry.isIntersecting) {\n this.visible.add(animation);\n this.checkAnimation(animation, false);\n\n /* if(animation instanceof HTMLVideoElement && animation.dataset.src) {\n animation.src = animation.dataset.src;\n animation.load();\n } */\n } else {\n this.visible.delete(animation);\n this.checkAnimation(animation, true);\n\n const _animation = animation.animation;\n if(_animation instanceof RLottiePlayer/* && animation.cachingDelta === 2 */) {\n // console.warn('will clear cache', player);\n _animation.clearCache();\n }/* else if(animation instanceof HTMLVideoElement && animation.src) {\n animation.dataset.src = animation.src;\n animation.src = '';\n animation.load();\n } */\n }\n\n break;\n }\n }\n });\n\n this.visible = new Set();\n\n this.overrideIdleGroups = new Set();\n this.byGroups = {};\n this.byPlayer = new Map();\n this.lockedGroups = {};\n this.onlyOnePlayableGroup = '';\n\n this.intersectionLockedGroups = {};\n this.videosLocked = false;\n\n appMediaPlaybackController.addEventListener('play', ({doc}) => {\n if(doc.type === 'round') {\n this.videosLocked = true;\n this.checkAnimations2();\n }\n });\n\n appMediaPlaybackController.addEventListener('pause', () => {\n if(this.videosLocked) {\n this.videosLocked = false;\n this.checkAnimations2();\n }\n });\n\n idleController.addEventListener('change', (idle) => {\n this.checkAnimations2(idle);\n });\n }\n\n public setOverrideIdleGroup(group: string, override: boolean) {\n if(override) this.overrideIdleGroups.add(group);\n else this.overrideIdleGroups.delete(group);\n }\n\n public getAnimations(element: HTMLElement) {\n const found: AnimationItem[] = [];\n for(const group in this.byGroups) {\n for(const player of this.byGroups[group as AnimationItemGroup]) {\n if(player.el === element) {\n found.push(player);\n }\n }\n }\n\n return found;\n }\n\n public removeAnimation(player: AnimationItem) {\n const {el, animation} = player;\n if(!(animation instanceof HTMLVideoElement)) {\n animation.remove();\n }\n\n if(animation instanceof HTMLVideoElement && IS_SAFARI) {\n setTimeout(() => { // TODO: ะพั‡ะธัั‚ะบะฐ ะฟะพ ะพั‡ะตั€ะตะดะธ, ะฐ ะฝะต ะฒัะต ะฒะผะตัั‚ะต ั ัั‚ะธะผ ั‚ะฐะนะผะฐัƒั‚ะพะผ\n animation.src = '';\n animation.load();\n }, 1e3);\n }\n\n const group = this.byGroups[player.group];\n if(group) {\n indexOfAndSplice(group, player);\n if(!group.length) {\n delete this.byGroups[player.group];\n }\n }\n\n this.observer.unobserve(el);\n this.visible.delete(player);\n this.byPlayer.delete(animation);\n }\n\n public removeAnimationByPlayer(player: AnimationItemWrapper) {\n const item = this.byPlayer.get(player);\n if(item) {\n this.removeAnimation(item);\n }\n }\n\n public addAnimation(\n animation: AnimationItem['animation'],\n group: AnimationItemGroup = '',\n observeElement?: HTMLElement,\n controlled?: AnimationItem['controlled']\n ) {\n if(group === 'none' || this.byPlayer.has(animation)) {\n return;\n }\n\n if(!observeElement) {\n if(animation instanceof RLottiePlayer) {\n observeElement = animation.el[0];\n } else if(animation instanceof CustomEmojiRendererElement) {\n observeElement = animation.canvas;\n } else if(animation instanceof CustomEmojiElement) {\n observeElement = animation.placeholder ?? animation;\n } else if(animation instanceof HTMLElement) {\n observeElement = animation;\n }\n }\n\n const item: AnimationItem = {\n el: observeElement,\n animation: animation,\n group,\n controlled\n };\n\n if(controlled && typeof(controlled) !== 'boolean') {\n controlled.onClean(() => {\n this.removeAnimationByPlayer(animation);\n });\n }\n\n if(animation instanceof RLottiePlayer) {\n if(!rootScope.settings.stickers.loop && animation.loop) {\n animation.loop = rootScope.settings.stickers.loop;\n }\n }\n\n (this.byGroups[group as AnimationItemGroup] ??= []).push(item);\n this.observer.observe(item.el);\n this.byPlayer.set(animation, item);\n }\n\n public checkAnimations(\n blurred?: boolean,\n group?: AnimationItemGroup,\n destroy?: boolean,\n imitateIntersection?: boolean\n ) {\n // if(rootScope.idle.isIDLE) return;\n\n if(group !== undefined && !this.byGroups[group]) {\n // console.warn('no animation group:', group);\n return;\n }\n\n const groups = group !== undefined /* && false */ ? [group] : Object.keys(this.byGroups) as AnimationItemGroup[];\n\n for(const group of groups) {\n if(imitateIntersection && this.intersectionLockedGroups[group]) {\n continue;\n }\n\n const animations = this.byGroups[group];\n\n forEachReverse(animations, (animation) => {\n this.checkAnimation(animation, blurred, destroy);\n });\n }\n }\n\n public checkAnimations2(blurred?: boolean) {\n this.checkAnimations(blurred, undefined, undefined, true);\n }\n\n public checkAnimation(player: AnimationItem, blurred?: boolean, destroy?: boolean) {\n const {el, animation, group} = player;\n // return;\n if(destroy || (!this.lockedGroups[group] && !isInDOM(el))) {\n if(!player.controlled || destroy) {\n this.removeAnimation(player);\n }\n\n return;\n }\n\n if(blurred ||\n (this.onlyOnePlayableGroup && this.onlyOnePlayableGroup !== group) ||\n (animation instanceof HTMLVideoElement && this.videosLocked)\n ) {\n if(!animation.paused) {\n // console.warn('pause animation:', animation);\n animation.pause();\n }\n } else if(animation.paused &&\n this.visible.has(player) &&\n animation.autoplay &&\n (!this.onlyOnePlayableGroup || this.onlyOnePlayableGroup === group) &&\n (!idleController.isIdle || this.overrideIdleGroups.has(player.group))\n ) {\n // console.warn('play animation:', animation);\n animation.play();\n }\n }\n\n public getOnlyOnePlayableGroup() {\n return this.onlyOnePlayableGroup;\n }\n\n public setOnlyOnePlayableGroup(group: AnimationItemGroup = '') {\n this.onlyOnePlayableGroup = group;\n }\n\n public lockGroup(group: AnimationItemGroup) {\n this.lockedGroups[group] = true;\n }\n\n public unlockGroup(group: AnimationItemGroup) {\n delete this.lockedGroups[group];\n this.checkAnimations(undefined, group);\n }\n\n public refreshGroup(group: AnimationItemGroup) {\n const animations = this.byGroups[group];\n if(!animations?.length) {\n return;\n }\n\n animations.forEach((animation) => {\n this.observer.unobserve(animation.el);\n });\n\n fastRaf(() => {\n animations.forEach((animation) => {\n this.observer.observe(animation.el);\n });\n });\n }\n\n public lockIntersectionGroup(group: AnimationItemGroup) {\n this.intersectionLockedGroups[group] = true;\n }\n\n public unlockIntersectionGroup(group: AnimationItemGroup) {\n delete this.intersectionLockedGroups[group];\n this.refreshGroup(group);\n }\n\n public toggleIntersectionGroup(group: AnimationItemGroup, lock: boolean) {\n if(lock) this.lockIntersectionGroup(group);\n else this.unlockIntersectionGroup(group);\n }\n}\n\nconst animationIntersector = new AnimationIntersector();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.animationIntersector = animationIntersector);\nexport default animationIntersector;\n","/*\n * 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';\nimport {MyDocument} from '../lib/appManagers/appDocsManager';\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport {IS_APPLE, IS_SAFARI} from '../environment/userAgent';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport simulateEvent from '../helpers/dom/dispatchEvent';\nimport type {SearchSuperContext} from './appSearchSuper.';\nimport {Document, DocumentAttribute, Message, PhotoSize} from '../layer';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport I18n from '../lib/langPack';\nimport SearchListLoader from '../helpers/searchListLoader';\nimport copy from '../helpers/object/copy';\nimport deepEqual from '../helpers/object/deepEqual';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport getMediaFromMessage from '../lib/appManagers/utils/messages/getMediaFromMessage';\nimport getPeerTitle from './wrappers/getPeerTitle';\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport onMediaLoad from '../helpers/onMediaLoad';\nimport EventListenerBase from '../helpers/eventListenerBase';\n\n// TODO: Safari: ะฟั€ะพะฒะตั€ะธั‚ัŒ ัั‚ั€ะธะผ, ะฒะบะปัŽั‡ะธั‚ัŒ ะตะณะพ ะธ ัั€ะฐะทัƒ ะฟะพะฟั€ะพะฑะพะฒะฐั‚ัŒ ะฒะบะปัŽั‡ะธั‚ัŒ ะฒะธะดะตะพ ะธะปะธ ะดั€ัƒะณัƒัŽ ะฟะตัะฝัŽ\n// TODO: Safari: ะฟะพะฟั€ะพะฑะพะฒะฐั‚ัŒ ะทะฐะผะฐัะบะธั€ะพะฒะฐั‚ัŒ ะฟะพะดะณั€ัƒะทะบัƒ ะฟะพัะปะตะดะฝะตะณะพ ั‡ะฐะฝะบะฐ\n// TODO: Safari: ะฟะพั„ะธะบัะธั‚ัŒ ะผะพะผะตะฝั‚, ะบะพะณะดะฐ ะทะฐะบะฐะฝั‡ะธะฒะฐะตั‚ัั ะฟะตัะฝั ะธ ะฟั‹ั‚ะฐะตัˆัŒัั ะฒะบะปัŽั‡ะธั‚ัŒ ะตั‘ ะทะฐะฝะพะฒะพ - ะฟั€ะพะณั€ะตัั ัั€ะฐะทัƒ ะฒ ะบะพะฝั†ะต\n\nexport type MediaItem = {mid: number, peerId: PeerId};\n\ntype HTMLMediaElement = HTMLAudioElement | HTMLVideoElement;\n\nconst SHOULD_USE_SAFARI_FIX = (() => {\n try {\n return IS_SAFARI && +navigator.userAgent.match(/ Version\\/(\\d+)/)[1] < 14;\n } catch(err) {\n return false;\n }\n})();\n\nconst SEEK_OFFSET = 10;\n\nexport type MediaSearchContext = SearchSuperContext & Partial<{\n isScheduled: boolean,\n useSearch: boolean\n}>;\n\ntype MediaDetails = {\n peerId: PeerId,\n mid: number,\n docId: DocId,\n doc: MyDocument,\n message: Message.message,\n clean?: boolean,\n isScheduled?: boolean,\n isSingle?: boolean\n};\n\nexport type PlaybackMediaType = 'voice' | 'video' | 'audio';\n\nexport class AppMediaPlaybackController extends EventListenerBase<{\n play: (details: ReturnType) => void,\n pause: () => void,\n playbackParams: (params: ReturnType) => void,\n stop: () => void,\n}> {\n private container: HTMLElement;\n private media: Map> = new Map();\n private scheduled: AppMediaPlaybackController['media'] = new Map();\n private mediaDetails: Map = new Map();\n private playingMedia: HTMLMediaElement;\n private playingMediaType: PlaybackMediaType;\n\n private waitingMediaForLoad: Map>> = new Map();\n private waitingScheduledMediaForLoad: AppMediaPlaybackController['waitingMediaForLoad'] = new Map();\n private waitingDocumentsForLoad: {[docId: string]: Set} = {};\n\n public willBePlayedMedia: HTMLMediaElement;\n private searchContext: MediaSearchContext;\n\n private listLoader: SearchListLoader;\n\n public volume: number;\n public muted: boolean;\n public playbackRate: number;\n public loop: boolean;\n public round: boolean;\n private _volume: number;\n private _muted: boolean;\n private _playbackRate: number;\n private _loop: boolean;\n private _round: boolean;\n private lockedSwitchers: boolean;\n private playbackRates: Record = {\n voice: 1,\n video: 1,\n audio: 1\n };\n\n private pip: HTMLVideoElement;\n private managers: AppManagers;\n private skipMediaPlayEvent: boolean;\n\n construct(managers: AppManagers) {\n this.managers = managers;\n this.container = document.createElement('div');\n // this.container.style.cssText = 'position: absolute; top: -10000px; left: -10000px;';\n this.container.style.cssText = 'display: none;';\n document.body.append(this.container);\n\n if(navigator.mediaSession) {\n const actions: {[action in MediaSessionAction]?: MediaSessionActionHandler} = {\n play: this.browserPlay,\n pause: this.browserPause,\n stop: this.browserStop,\n seekbackward: this.browserSeekBackward,\n seekforward: this.browserSeekForward,\n seekto: this.browserSeekTo,\n previoustrack: this.browserPrevious,\n nexttrack: this.browserNext\n };\n\n for(const action in actions) {\n try {\n navigator.mediaSession.setActionHandler(action as MediaSessionAction, actions[action as MediaSessionAction]);\n } catch(err) {\n console.warn('MediaSession action is not supported:', action);\n }\n }\n }\n\n rootScope.addEventListener('document_downloaded', (docId) => {\n const set = this.waitingDocumentsForLoad[docId];\n if(set) {\n for(const media of set) {\n this.onMediaDocumentLoad(media);\n }\n }\n });\n\n rootScope.addEventListener('media_play', () => {\n if(this.skipMediaPlayEvent) {\n this.skipMediaPlayEvent = false;\n return;\n }\n\n if(!this.pause() && this.pip) {\n this.pip.pause();\n }\n });\n\n const properties: {[key: PropertyKey]: PropertyDescriptor} = {};\n const keys = [\n 'volume' as const,\n 'muted' as const,\n 'playbackRate' as const,\n 'loop' as const,\n 'round' as const\n ];\n keys.forEach((key) => {\n const _key = ('_' + key) as `_${typeof key}`;\n properties[key] = {\n get: () => this[_key],\n set: (value: number | boolean) => {\n if(this[_key] === value) {\n return;\n }\n\n // @ts-ignore\n this[_key] = value;\n if(this.playingMedia && (key !== 'loop' || this.playingMediaType === 'audio') && key !== 'round') {\n // @ts-ignore\n this.playingMedia[key] = value;\n }\n\n if(key === 'playbackRate' && this.playingMediaType !== undefined) {\n this.playbackRates[this.playingMediaType] = value as number;\n }\n\n this.dispatchPlaybackParams();\n }\n };\n });\n Object.defineProperties(this, properties);\n }\n\n private dispatchPlaybackParams() {\n this.dispatchEvent('playbackParams', this.getPlaybackParams());\n }\n\n public getPlaybackParams() {\n const {volume, muted, playbackRate, playbackRates, loop, round} = this;\n return {\n volume,\n muted,\n playbackRate,\n playbackRates,\n loop,\n round\n };\n }\n\n public setPlaybackParams(params: ReturnType) {\n this.playbackRates = params.playbackRates;\n this._volume = params.volume;\n this._muted = params.muted;\n this._playbackRate = params.playbackRate;\n this._loop = params.loop;\n this._round = params.round;\n }\n\n public seekBackward = (details: MediaSessionActionDetails, media = this.playingMedia) => {\n if(media) {\n media.currentTime = Math.max(0, media.currentTime - (details.seekOffset || SEEK_OFFSET));\n }\n };\n\n public seekForward = (details: MediaSessionActionDetails, media = this.playingMedia) => {\n if(media) {\n media.currentTime = Math.min(media.duration, media.currentTime + (details.seekOffset || SEEK_OFFSET));\n }\n };\n\n public seekTo = (details: MediaSessionActionDetails, media = this.playingMedia) => {\n if(media) {\n media.currentTime = details.seekTime;\n }\n };\n\n public addMedia(message: Message.message, autoload: boolean, clean?: boolean): HTMLMediaElement {\n const {peerId, mid} = message;\n\n const isScheduled = !!message.pFlags.is_scheduled;\n const s = isScheduled ? this.scheduled : this.media;\n let storage = s.get(message.peerId);\n if(!storage) {\n s.set(message.peerId, storage = new Map());\n }\n\n let media = storage.get(mid);\n if(media) {\n return media;\n }\n\n const doc = getMediaFromMessage(message) as Document.document;\n storage.set(mid, media = document.createElement(doc.type === 'round' || doc.type === 'video' ? 'video' : 'audio'));\n // const source = document.createElement('source');\n // source.type = doc.type === 'voice' && !opusDecodeController.isPlaySupported() ? 'audio/wav' : doc.mime_type;\n\n if(doc.type === 'round') {\n media.setAttribute('playsinline', 'true');\n // media.muted = true;\n }\n\n const details: MediaDetails = {\n peerId,\n mid,\n docId: doc.id,\n doc,\n message,\n clean,\n isScheduled: message.pFlags.is_scheduled\n };\n\n this.mediaDetails.set(media, details);\n\n // media.autoplay = true;\n media.volume = 1;\n // media.append(source);\n\n this.container.append(media);\n\n media.addEventListener('play', this.onPlay);\n media.addEventListener('pause', this.onPause);\n media.addEventListener('ended', this.onEnded);\n\n if(doc.type !== 'audio' && message?.pFlags.media_unread && message.fromId !== rootScope.myId) {\n media.addEventListener('timeupdate', () => {\n this.managers.appMessagesManager.readMessages(peerId, [mid]);\n }, {once: true});\n }\n\n /* const onError = (e: Event) => {\n //console.log('appMediaPlaybackController: video onError', e);\n\n if(this.nextMid === mid) {\n this.loadSiblingsMedia(peerId, doc.type as MediaType, mid).then(() => {\n if(this.nextMid && storage[this.nextMid]) {\n storage[this.nextMid].play();\n }\n });\n }\n };\n\n media.addEventListener('error', onError); */\n\n const deferred = deferredPromise();\n if(autoload) {\n deferred.resolve();\n } else {\n const w = message.pFlags.is_scheduled ? this.waitingScheduledMediaForLoad : this.waitingMediaForLoad;\n let waitingStorage = w.get(peerId);\n if(!waitingStorage) {\n w.set(peerId, waitingStorage = new Map());\n }\n\n waitingStorage.set(mid, deferred);\n }\n\n deferred.then(async() => {\n // media.autoplay = true;\n // console.log('will set media url:', media, doc, doc.type, doc.url);\n\n if(doc.supportsStreaming || (await this.managers.thumbsStorage.getCacheContext(doc)).url) {\n this.onMediaDocumentLoad(media);\n } else {\n let set = this.waitingDocumentsForLoad[doc.id];\n if(!set) {\n set = this.waitingDocumentsForLoad[doc.id] = new Set();\n }\n\n set.add(media);\n appDownloadManager.downloadMediaURL({media: doc});\n }\n }/* , onError */);\n\n return media;\n }\n\n public getMedia(peerId: PeerId, mid: number, isScheduled?: boolean) {\n const s = (isScheduled ? this.scheduled : this.media).get(peerId);\n return s?.get(mid);\n }\n\n private onMediaDocumentLoad = async(media: HTMLMediaElement) => {\n const details = this.mediaDetails.get(media);\n const doc = await this.managers.appDocsManager.getDoc(details.docId);\n if(doc.type === 'audio' && doc.supportsStreaming && SHOULD_USE_SAFARI_FIX) {\n this.handleSafariStreamable(media);\n }\n\n // setTimeout(() => {\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc);\n media.src = cacheContext.url;\n\n if(this.playingMedia === media) {\n media.playbackRate = this.playbackRate;\n\n if(doc.type === 'audio') {\n media.loop = this.loop;\n }\n }\n // }, doc.supportsStreaming ? 500e3 : 0);\n\n const set = this.waitingDocumentsForLoad[doc.id];\n if(set) {\n set.delete(media);\n\n if(!set.size) {\n delete this.waitingDocumentsForLoad[doc.id];\n }\n }\n };\n\n // safari ะฟะพะดะณั€ัƒะทะธั‚ ะฟะพัะปะตะดะฝะธะน ั‡ะฐะฝะบ ะธ ะฟะตัะฝั ะฒะบะปัŽั‡ะธั‚ัั,\n // ะฟั€ะธ ัั‚ะพะผ ัั‚ะพั‚ ั‡ะฐะฝะบ ะฝะตะปัŒะทั ั€ัƒะบะฐะผะธ ะพั‚ะดะฐั‚ัŒ ะธะท SW, ะฟะพั‚ะพะผัƒ ั‡ั‚ะพ ะฑั€ะฐัƒะทะตั€ ั‚ะพะณะดะฐ ั‚ะตั€ัะตั‚ัั\n private handleSafariStreamable(media: HTMLMediaElement) {\n media.addEventListener('play', () => {\n /* if(media.readyState === 4) { // https://developer.mozilla.org/ru/docs/Web/API/XMLHttpRequest/readyState\n return;\n } */\n\n // media.volume = 0;\n const currentTime = media.currentTime;\n // this.setSafariBuffering(media, true);\n\n media.addEventListener('progress', () => {\n media.currentTime = media.duration - 1;\n\n media.addEventListener('progress', () => {\n media.currentTime = currentTime;\n // media.volume = 1;\n // this.setSafariBuffering(media, false);\n\n if(!media.paused) {\n media.play()/* .catch(() => {}) */;\n }\n }, {once: true});\n }, {once: true});\n }/* , {once: true} */);\n }\n\n public resolveWaitingForLoadMedia(peerId: PeerId, mid: number, isScheduled?: boolean) {\n const w = isScheduled ? this.waitingScheduledMediaForLoad : this.waitingMediaForLoad;\n const storage = w.get(peerId);\n if(!storage) {\n return;\n }\n\n const promise = storage.get(mid);\n if(promise) {\n promise.resolve();\n storage.delete(mid);\n\n if(!storage.size) {\n w.delete(peerId);\n }\n }\n }\n\n /**\n * Only for audio\n */\n public isSafariBuffering(media: HTMLMediaElement) {\n // @ts-ignore\n return !!media.safariBuffering;\n }\n\n private setSafariBuffering(media: HTMLMediaElement, value: boolean) {\n // @ts-ignore\n media.safariBuffering = value;\n }\n\n private async setNewMediadata(message: Message.message, playingMedia = this.playingMedia) {\n if(document.pictureInPictureElement) {\n return;\n }\n\n await onMediaLoad(playingMedia, undefined, false); // have to wait for load, otherwise on macOS won't set\n\n const doc = getMediaFromMessage(message) as MyDocument;\n\n const artwork: MediaImage[] = [];\n\n const isVoice = doc.type === 'voice' || doc.type === 'round';\n let title = '', artist = '';\n\n if(doc.thumbs?.length) {\n const size = doc.thumbs[doc.thumbs.length - 1];\n if(!(size as PhotoSize.photoStrippedSize).bytes) {\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc, size.type);\n\n if(cacheContext.url) {\n artwork.push({\n src: cacheContext.url,\n sizes: `${(size as PhotoSize.photoSize).w}x${(size as PhotoSize.photoSize).h}`,\n type: 'image/jpeg'\n });\n } else {\n const download = appDownloadManager.downloadMediaURL({media: doc, thumb: size});\n download.then(() => {\n if(this.playingMedia !== playingMedia || !cacheContext.url) {\n return;\n }\n\n this.setNewMediadata(message);\n });\n }\n }\n } else if(isVoice) {\n const peerId = message.fromId || message.peerId;\n const peerPhoto = await this.managers.appPeersManager.getPeerPhoto(peerId);\n if(peerPhoto) {\n // const result = this.managers.appAvatarsManager.loadAvatar(peerId, peerPhoto, 'photo_small');\n // if(result.cached) {\n // const url = await result.loadPromise;\n // artwork.push({\n // src: url,\n // sizes: '160x160',\n // type: 'image/jpeg'\n // });\n // } else {\n // result.loadPromise.then((url) => {\n // if(this.playingMedia !== playingMedia || !url) {\n // return;\n // }\n\n // this.setNewMediadata(message);\n // });\n // }\n }\n\n title = await getPeerTitle({peerId, plainText: true, onlyFirstName: false});\n artist = I18n.format(doc.type === 'voice' ? 'AttachAudio' : 'AttachRound', true);\n }\n\n if(!isVoice) {\n const attribute = doc.attributes.find((attribute) => attribute._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio;\n title = attribute?.title ?? doc.file_name;\n artist = attribute?.performer;\n }\n\n if(!artwork.length) {\n if(IS_APPLE) {\n if(IS_TOUCH_SUPPORTED) {\n artwork.push({\n src: `assets/img/apple-touch-icon-precomposed.png`,\n sizes: '180x180',\n type: 'image/png'\n });\n } else {\n artwork.push({\n src: `assets/img/apple-touch-icon.png`,\n sizes: '180x180',\n type: 'image/png'\n });\n }\n } else {\n [72, 96, 144, 192, 256, 384, 512].forEach((size) => {\n const sizes = `${size}x${size}`;\n artwork.push({\n src: `assets/img/android-chrome-${sizes}.png`,\n sizes,\n type: 'image/png'\n });\n });\n }\n }\n\n const metadata = new MediaMetadata({\n title,\n artist,\n artwork\n });\n\n navigator.mediaSession.metadata = metadata;\n }\n\n public setCurrentMediadata() {\n const {playingMedia} = this;\n if(!playingMedia) return;\n const message = this.getMessageByMedia(playingMedia);\n this.setNewMediadata(message, playingMedia);\n }\n\n private getMessageByMedia(media: HTMLMediaElement): Message.message {\n const details = this.mediaDetails.get(media);\n return details.message;\n // const {peerId, mid} = details;\n // const message = details.isScheduled ?\n // this.managers.appMessagesManager.getScheduledMessageByPeer(peerId, mid) :\n // this.managers.appMessagesManager.getMessageByPeer(peerId, mid);\n // return message;\n }\n\n public getPlayingDetails() {\n const {playingMedia} = this;\n if(!playingMedia) {\n return;\n }\n\n const message = this.getMessageByMedia(playingMedia);\n return {\n doc: getMediaFromMessage(message) as MyDocument,\n message,\n media: playingMedia,\n playbackParams: this.getPlaybackParams()\n };\n }\n\n private onPlay = (e?: Event) => {\n const media = e.target as HTMLMediaElement;\n const details = this.mediaDetails.get(media);\n const {peerId, mid} = details;\n\n // console.log('appMediaPlaybackController: video playing', this.currentPeerId, this.playingMedia, media);\n\n const pip = this.pip;\n if(pip) {\n pip.pause();\n }\n\n const message = this.getMessageByMedia(media);\n\n const previousMedia = this.playingMedia;\n if(previousMedia !== media) {\n this.stop();\n this.setMedia(media, message);\n\n const verify = (element: MediaItem) => element.mid === mid && element.peerId === peerId;\n const listLoader = this.listLoader;\n const current = listLoader.getCurrent();\n if(!current || !verify(current)) {\n let jumpLength: number;\n\n for(const withOtherSide of [false, true]) {\n const previous = listLoader.getPrevious(withOtherSide);\n\n let idx = previous.findIndex(verify);\n if(idx !== -1) {\n jumpLength = -(previous.length - idx);\n } else {\n const next = listLoader.getNext(withOtherSide);\n idx = next.findIndex(verify);\n if(idx !== -1) {\n jumpLength = idx + 1;\n }\n }\n\n if(jumpLength !== undefined) {\n break;\n }\n }\n\n if(jumpLength) {\n this.go(jumpLength, false);\n } else {\n this.setTargets({peerId, mid});\n }\n }\n }\n\n // audio_pause ะฝะต ัƒัะฟะตะตั‚ ัั€ะฐะฑะพั‚ะฐั‚ัŒ ะฑะตะท ั‚ะฐะนะผะฐัƒั‚ะฐ\n setTimeout(() => {\n if(this.playingMedia !== media) {\n return;\n }\n\n this.dispatchEvent('play', this.getPlayingDetails());\n this.pauseMediaInOtherTabs();\n }, 0);\n };\n\n private onPause = (e?: Event) => {\n /* const target = e.target as HTMLMediaElement;\n if(!isInDOM(target)) {\n this.container.append(target);\n target.play();\n return;\n } */\n\n // if(this.pip) {\n // this.pip.play();\n // }\n\n this.dispatchEvent('pause');\n };\n\n private onEnded = (e?: Event) => {\n if(!e.isTrusted) {\n return;\n }\n\n this.onPause(e);\n\n // console.log('on media end');\n\n const listLoader = this.listLoader;\n if(this.lockedSwitchers ||\n (!this.round && listLoader.current && !listLoader.next.length) ||\n !listLoader.getNext(true).length ||\n !this.next()) {\n this.stop();\n this.dispatchEvent('stop');\n }\n };\n\n public pauseMediaInOtherTabs() {\n this.skipMediaPlayEvent = true;\n rootScope.dispatchEvent('media_play');\n }\n\n // public get pip() {\n // return document.pictureInPictureElement as HTMLVideoElement;\n // }\n\n public toggle(play?: boolean, media = this.playingMedia) {\n if(!media) {\n return false;\n }\n\n if(play === undefined) {\n play = media.paused;\n }\n\n if(media.paused !== play) {\n return false;\n }\n\n if(play) {\n media.play();\n } else {\n media.pause();\n }\n\n return true;\n }\n\n public play = () => {\n return this.toggle(true);\n };\n\n public pause = () => {\n return this.toggle(false);\n };\n\n public stop = (media = this.playingMedia) => {\n if(!media) {\n return false;\n }\n\n if(!media.paused) {\n media.pause();\n }\n\n media.currentTime = 0;\n simulateEvent(media, 'ended');\n\n if(media === this.playingMedia) {\n const details = this.mediaDetails.get(media);\n if(details?.clean) {\n media.src = '';\n const peerId = details.peerId;\n const s = details.isScheduled ? this.scheduled : this.media;\n const storage = s.get(peerId);\n if(storage) {\n storage.delete(details.mid);\n\n if(!storage.size) {\n s.delete(peerId);\n }\n }\n\n media.remove();\n\n this.mediaDetails.delete(media);\n }\n\n this.playingMedia = undefined;\n this.playingMediaType = undefined;\n }\n\n return true;\n };\n\n public playItem = (item: MediaItem) => {\n const {peerId, mid} = item;\n const isScheduled = this.searchContext.isScheduled;\n const media = this.getMedia(peerId, mid, isScheduled);\n\n /* if(isSafari) {\n media.autoplay = true;\n } */\n\n media.play();\n\n setTimeout(() => {\n this.resolveWaitingForLoadMedia(peerId, mid, isScheduled);\n }, 0);\n };\n\n public go = (length: number, dispatchJump?: boolean) => {\n const listLoader = this.listLoader;\n if(this.lockedSwitchers || !listLoader) {\n return;\n }\n\n if(this.playingMediaType === 'audio') {\n return listLoader.goRound(length, dispatchJump);\n } else {\n return listLoader.go(length, dispatchJump);\n }\n };\n\n private bindBrowserCallback(cb: (video: HTMLVideoElement, details: MediaSessionActionDetails) => void) {\n const handler: MediaSessionActionHandler = (details) => {\n cb(this.pip, details);\n };\n\n return handler;\n }\n\n public browserPlay = this.bindBrowserCallback((video) => this.toggle(true, video));\n public browserPause = this.bindBrowserCallback((video) => this.toggle(false, video));\n public browserStop = this.bindBrowserCallback((video) => this.stop(video));\n public browserSeekBackward = this.bindBrowserCallback((video, details) => this.seekBackward(details, video));\n public browserSeekForward = this.bindBrowserCallback((video, details) => this.seekForward(details, video));\n public browserSeekTo = this.bindBrowserCallback((video, details) => this.seekTo(details, video));\n public browserNext = this.bindBrowserCallback((video) => video || this.next());\n public browserPrevious = this.bindBrowserCallback((video) => video ? this.seekToStart(video) : this.previous());\n\n public next = () => {\n return this.go(1);\n };\n\n public previous = () => {\n if(this.seekToStart(this.playingMedia)) {\n return;\n }\n\n return this.go(-1);\n };\n\n public seekToStart(media: HTMLMediaElement) {\n if(media?.currentTime > 5) {\n media.currentTime = 0;\n this.toggle(true, media);\n return true;\n }\n\n return false;\n }\n\n public willBePlayed(media: HTMLMediaElement) {\n this.willBePlayedMedia = media;\n }\n\n public setSearchContext(context: MediaSearchContext) {\n if(deepEqual(this.searchContext, context)) {\n return false;\n }\n\n this.searchContext = copy(context); // {_: type === 'audio' ? 'inputMessagesFilterMusic' : 'inputMessagesFilterRoundVoice'}\n return true;\n }\n\n public getSearchContext() {\n return this.searchContext;\n }\n\n public setTargets(current: MediaItem, prev?: MediaItem[], next?: MediaItem[]) {\n let listLoader = this.listLoader;\n if(!listLoader) {\n listLoader = this.listLoader = new SearchListLoader({\n loadCount: 10,\n loadWhenLeft: 5,\n processItem: (message: Message.message) => {\n this.addMedia(message, false);\n return {peerId: message.peerId, mid: message.mid};\n },\n onJump: (item, older) => {\n this.playItem(item);\n },\n onEmptied: () => {\n this.dispatchEvent('stop');\n this.stop();\n }\n });\n } else {\n listLoader.reset();\n }\n\n const reverse = this.searchContext.folderId !== undefined ? false : true;\n if(prev) {\n listLoader.setTargets(prev, next, reverse);\n } else {\n listLoader.reverse = reverse;\n }\n\n listLoader.setSearchContext(this.searchContext);\n listLoader.current = current;\n\n listLoader.load(true);\n listLoader.load(false);\n }\n\n private getPlaybackMediaTypeFromMessage(message: Message.message) {\n const doc = getMediaFromMessage(message) as MyDocument;\n let mediaType: PlaybackMediaType = 'audio';\n if(doc?.type) {\n if(doc.type === 'voice' || doc.type === 'round') {\n mediaType = 'voice';\n } else if(doc.type === 'video') {\n mediaType = 'video';\n }\n }\n\n return mediaType;\n }\n\n public setMedia(media: HTMLMediaElement, message: Message.message) {\n const mediaType = this.getPlaybackMediaTypeFromMessage(message);\n\n this._playbackRate = this.playbackRates[mediaType];\n\n this.playingMedia = media;\n this.playingMediaType = mediaType;\n this.playingMedia.volume = this.volume;\n this.playingMedia.muted = this.muted;\n this.playingMedia.playbackRate = this.playbackRate;\n\n if(mediaType === 'audio') {\n this.playingMedia.loop = this.loop;\n }\n\n if('mediaSession' in navigator) {\n this.setNewMediadata(message);\n }\n }\n\n public setSingleMedia(media?: HTMLMediaElement, message?: Message.message) {\n const playingMedia = this.playingMedia;\n\n const wasPlaying = this.pause();\n\n let onPlay: () => void;\n if(media) {\n onPlay = () => {\n const pip = this.pip;\n if(pip) {\n pip.pause();\n }\n\n this.pauseMediaInOtherTabs();\n };\n\n if(!media.paused) {\n onPlay();\n }\n\n media.addEventListener('play', onPlay);\n } else { // maybe it's voice recording\n this.pauseMediaInOtherTabs();\n }\n\n this.willBePlayed(undefined);\n if(media) this.setMedia(media, message);\n else this.playingMedia = undefined;\n this.toggleSwitchers(false);\n\n return (playPaused = wasPlaying) => {\n this.toggleSwitchers(true);\n\n if(playingMedia) {\n if(this.mediaDetails.get(playingMedia)) {\n this.setMedia(playingMedia, this.getMessageByMedia(playingMedia));\n } else {\n this.next() || this.previous();\n }\n }\n\n // If it's still not cleaned\n if(this.playingMedia === media) {\n this.playingMedia = undefined;\n this.playingMediaType = undefined;\n }\n\n if(media) {\n media.removeEventListener('play', onPlay);\n }\n\n // I don't remember what it was for\n // if(media && this.playingMedia === media) {\n // this.stop();\n // }\n\n if(playPaused) {\n this.play();\n }\n };\n }\n\n public toggleSwitchers(enabled: boolean) {\n this.lockedSwitchers = !enabled;\n }\n\n public setPictureInPicture(video: HTMLVideoElement) {\n this.pip = video;\n\n // let wasPlaying = this.pause();\n\n const listenerSetter = new ListenerSetter();\n listenerSetter.add(video)('leavepictureinpicture', () => {\n if(this.pip !== video) {\n return;\n }\n\n this.pip = undefined;\n // if(wasPlaying) {\n // this.play();\n // }\n\n listenerSetter.removeAll();\n }, {once: true});\n\n listenerSetter.add(video)('play', (e) => {\n if(this.playingMedia !== video) {\n this.pause();\n }\n\n this.pauseMediaInOtherTabs();\n // if(this.pause()) {\n // listenerSetter.add(video)('pause', () => {\n // this.play();\n // }, {once: true});\n // }\n });\n }\n}\n\nconst appMediaPlaybackController = new AppMediaPlaybackController();\nMOUNT_CLASS_TO.appMediaPlaybackController = appMediaPlaybackController;\nexport default appMediaPlaybackController;\n","/*\n * 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 {MyDocument} from '../lib/appManagers/appDocsManager';\nimport MEDIA_MIME_TYPES_SUPPORTED from '../environment/mediaMimeTypesSupport';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport findUpTag from '../helpers/dom/findUpTag';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport mediaSizes from '../helpers/mediaSizes';\nimport SearchListLoader from '../helpers/searchListLoader';\nimport {Message} from '../layer';\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport appImManager from '../lib/appManagers/appImManager';\nimport {MyMessage} from '../lib/appManagers/appMessagesManager';\nimport {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport canSaveMessageMedia from '../lib/appManagers/utils/messages/canSaveMessageMedia';\nimport getMediaFromMessage from '../lib/appManagers/utils/messages/getMediaFromMessage';\nimport wrapRichText from '../lib/richTextProcessor/wrapRichText';\nimport {MediaSearchContext} from './appMediaPlaybackController';\nimport AppMediaViewerBase, {MEDIA_VIEWER_CLASSNAME} from './appMediaViewerBase';\nimport {ButtonMenuItemOptionsVerifiable} 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 message?: MyMessage\n};\nexport default class AppMediaViewer extends AppMediaViewerBase<'caption', 'delete' | 'forward', AppMediaViewerTargetType> {\n protected listLoader: SearchListLoader;\n protected btnMenuForward: ButtonMenuItemOptionsVerifiable;\n protected btnMenuDownload: ButtonMenuItemOptionsVerifiable;\n protected btnMenuDelete: ButtonMenuItemOptionsVerifiable;\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 = 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', 'spoilers-container'/* , '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: ButtonMenuItemOptionsVerifiable[] = [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 attachClickEvent(this.buttons.forward, this.onForwardClick);\n attachClickEvent(this.author.container, this.onAuthorClick);\n\n const onCaptionClick = (e: MouseEvent) => {\n const a = findUpTag(e.target, 'A');\n const spoiler = findUpClassName(e.target, 'spoiler');\n if(a instanceof HTMLAnchorElement && (!spoiler || this.content.caption.classList.contains('is-spoiler-visible'))) { // close viewer if it's t.me/ redirect\n const onclick = a.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 a.click();\n });\n\n return false;\n }\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 ? this.managers.appMessagesManager.getScheduledMessageByPeer(peerId, mid) : this.managers.appMessagesManager.getMessageByPeer(peerId, mid);\n }\n\n onPrevClick = async(target: AppMediaViewerTargetType) => {\n this.openMedia(await this.getMessageByPeer(target.peerId, target.mid), target.element, -1);\n };\n\n onNextClick = async(target: AppMediaViewerTargetType) => {\n this.openMedia(await 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 = async(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 = await this.getMessageByPeer(peerId, mid);\n this.close(e)\n // .then(() => mediaSizes.isMobile ? appSidebarRight.sharedMediaTab.closeBtn.click() : Promise.resolve())\n .then(async() => {\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 {message} = this.target;\n const media = getMediaFromMessage(message);\n if(!media) return;\n appDownloadManager.downloadToDisc({media, queueId: appImManager.chat.bubbles.lazyLoadQueue.queueId});\n };\n\n private setCaption(message: MyMessage) {\n const caption = (message as Message.message).message;\n let html: Parameters[1] = '';\n if(caption) {\n html = 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 = getMediaFromMessage(message);\n\n const noForwards = await this.managers.appPeersManager.noForwards(message.peerId);\n const isServiceMessage = message._ === 'messageService';\n const cantForwardMessage = isServiceMessage || !(await this.managers.appMessagesManager.canForward(message));\n const cantDownloadMessage = (isServiceMessage ? noForwards : cantForwardMessage) || !canSaveMessageMedia(message);\n const a: [(HTMLElement | ButtonMenuItemOptionsVerifiable)[], boolean][] = [\n [[this.buttons.forward, this.btnMenuForward], cantForwardMessage],\n [[this.buttons.download, this.btnMenuDownload], cantDownloadMessage],\n [[this.buttons.delete, this.btnMenuDelete], !(await this.managers.appMessagesManager.canDeleteMessage(message))]\n ];\n\n a.forEach(([buttons, hide]) => {\n buttons.forEach((button) => {\n if(button instanceof HTMLElement) {\n button.classList.toggle('hide', hide);\n } else {\n button.verify = () => !hide;\n }\n });\n });\n\n this.wholeDiv.classList.toggle('no-forwards', cantDownloadMessage);\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 this.target.message = message;\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 appMediaPlaybackController from '../components/appMediaPlaybackController';\nimport {IS_APPLE_MOBILE, IS_MOBILE} from '../environment/userAgent';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport ListenerSetter, {Listener} from '../helpers/listenerSetter';\nimport {ButtonMenuSync} from '../components/buttonMenu';\nimport {ButtonMenuToggleHandler} from '../components/buttonMenuToggle';\nimport ControlsHover from '../helpers/dom/controlsHover';\nimport {addFullScreenListener, cancelFullScreen, isFullScreen, requestFullScreen} from '../helpers/dom/fullScreen';\nimport toHHMMSS from '../helpers/string/toHHMMSS';\nimport MediaProgressLine from '../components/mediaProgressLine';\nimport VolumeSelector from '../components/volumeSelector';\nimport debounce from '../helpers/schedulers/debounce';\nimport overlayCounter from '../helpers/overlayCounter';\nimport onMediaLoad from '../helpers/onMediaLoad';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\n\nexport default class VideoPlayer extends ControlsHover {\n private static PLAYBACK_RATES = [0.5, 1, 1.5, 2];\n private static PLAYBACK_RATES_ICONS = ['playback_05', 'playback_1x', 'playback_15', 'playback_2x'];\n\n protected video: HTMLVideoElement;\n protected wrapper: HTMLDivElement;\n protected progress: MediaProgressLine;\n protected skin: 'default';\n\n protected listenerSetter: ListenerSetter;\n protected playbackRateButton: HTMLElement;\n protected pipButton: HTMLElement;\n\n /* protected videoParent: HTMLElement;\n protected videoWhichChild: number; */\n\n protected onPlaybackRackMenuToggle?: (open: boolean) => void;\n protected onPip?: (pip: boolean) => void;\n protected onPipClose?: () => void;\n\n constructor({video, play = false, streamable = false, duration, onPlaybackRackMenuToggle, onPip, onPipClose}: {\n video: HTMLVideoElement,\n play?: boolean,\n streamable?: boolean,\n duration?: number,\n onPlaybackRackMenuToggle?: VideoPlayer['onPlaybackRackMenuToggle'],\n onPip?: VideoPlayer['onPip'],\n onPipClose?: VideoPlayer['onPipClose']\n }) {\n super();\n\n this.video = video;\n this.wrapper = document.createElement('div');\n this.wrapper.classList.add('ckin__player');\n\n this.onPlaybackRackMenuToggle = onPlaybackRackMenuToggle;\n this.onPip = onPip;\n this.onPipClose = onPipClose;\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 && (!this.playbackRateButton || !this.playbackRateButton.classList.contains('menu-open'));\n },\n showOnLeaveToClassName: 'media-viewer-caption',\n ignoreClickClassName: 'ckin__controls'\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({\n media: video,\n streamable,\n onSeekStart: () => {\n this.wrapper.classList.add('is-seeking');\n },\n onSeekEnd: () => {\n this.wrapper.classList.remove('is-seeking');\n }\n });\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 }\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 this.playbackRateButton = this.wrapper.querySelector('.playback-rate') as HTMLElement;\n this.pipButton = this.wrapper.querySelector('.pip') as HTMLElement;\n\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.textContent = toHHMMSS(video.duration | 0);\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 attachClickEvent(button, () => {\n this.togglePlay();\n }, {listenerSetter: this.listenerSetter});\n });\n\n if(this.pipButton) {\n attachClickEvent(this.pipButton, () => {\n this.video.requestPictureInPicture();\n }, {listenerSetter: this.listenerSetter});\n\n const onPip = (pip: boolean) => {\n this.wrapper.style.visibility = pip ? 'hidden': '';\n if(this.onPip) {\n this.onPip(pip);\n }\n };\n\n const debounceTime = 20;\n const debouncedPip = debounce(onPip, debounceTime, false, true);\n\n listenerSetter.add(video)('enterpictureinpicture', () => {\n debouncedPip(true);\n\n listenerSetter.add(video)('leavepictureinpicture', () => {\n const onPause = () => {\n clearTimeout(timeout);\n if(this.onPipClose) {\n this.onPipClose();\n }\n };\n const listener = listenerSetter.add(video)('pause', onPause, {once: true}) as any as Listener;\n const timeout = setTimeout(() => {\n listenerSetter.remove(listener);\n }, debounceTime);\n }, {once: true});\n });\n\n listenerSetter.add(video)('leavepictureinpicture', () => {\n debouncedPip(false);\n });\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n attachClickEvent(video, () => {\n this.togglePlay();\n }, {listenerSetter: this.listenerSetter});\n\n listenerSetter.add(document)('keydown', (e: KeyboardEvent) => {\n if(overlayCounter.overlaysActive > 1 || document.pictureInPictureElement === video) { // 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' || code === 'Minus')) {\n const add = code === 'Equal' ? 1 : -1;\n const playbackRate = appMediaPlaybackController.playbackRate;\n const idx = VideoPlayer.PLAYBACK_RATES.indexOf(playbackRate);\n const nextIdx = idx + add;\n if(nextIdx >= 0 && nextIdx < VideoPlayer.PLAYBACK_RATES.length) {\n appMediaPlaybackController.playbackRate = VideoPlayer.PLAYBACK_RATES[nextIdx];\n }\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 listenerSetter.add(video)('dblclick', () => {\n if(!IS_TOUCH_SUPPORTED) {\n this.toggleFullScreen();\n }\n });\n\n attachClickEvent(fullScreenButton, () => {\n this.toggleFullScreen();\n }, {listenerSetter: this.listenerSetter});\n\n addFullScreenListener(wrapper, this.onFullScreen.bind(this, fullScreenButton), listenerSetter);\n\n listenerSetter.add(video)('timeupdate', () => {\n timeElapsed.textContent = toHHMMSS(video.currentTime | 0);\n });\n\n listenerSetter.add(video)('play', () => {\n wrapper.classList.add('played');\n\n if(!IS_TOUCH_SUPPORTED) {\n listenerSetter.add(video)('play', () => {\n this.hideControls(true);\n });\n }\n }, {once: true});\n\n listenerSetter.add(video)('pause', () => {\n this.showControls(false);\n });\n\n listenerSetter.add(appMediaPlaybackController)('playbackParams', () => {\n this.setPlaybackRateIcon();\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.textContent = toHHMMSS(Math.round(video.duration || initDuration));\n } else {\n onMediaLoad(video).then(() => {\n timeDuration.textContent = toHHMMSS(Math.round(video.duration));\n });\n }\n }\n\n protected togglePlay() {\n const isPaused = this.video.paused;\n this.video[isPaused ? '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 ${!IS_MOBILE && document.pictureInPictureEnabled ? `` : ''}\n \n
\n
\n
`;\n }\n }\n\n protected setBtnMenuToggle() {\n const buttons: Parameters[0]['buttons'] = VideoPlayer.PLAYBACK_RATES.map((rate, idx) => {\n return {\n // icon: VideoPlayer.PLAYBACK_RATES_ICONS[idx],\n regularText: rate + 'x',\n onClick: () => {\n appMediaPlaybackController.playbackRate = rate;\n }\n };\n });\n const btnMenu = ButtonMenuSync({buttons});\n btnMenu.classList.add('top-left');\n ButtonMenuToggleHandler({\n el: this.playbackRateButton,\n onOpen: this.onPlaybackRackMenuToggle ? () => {\n this.onPlaybackRackMenuToggle(true);\n } : undefined,\n onClose: this.onPlaybackRackMenuToggle ? () => {\n this.onPlaybackRackMenuToggle(false);\n } : undefined\n });\n this.playbackRateButton.append(btnMenu);\n\n this.setPlaybackRateIcon();\n }\n\n protected setPlaybackRateIcon() {\n const playbackRateButton = this.playbackRateButton;\n VideoPlayer.PLAYBACK_RATES_ICONS.forEach((className) => {\n className = 'tgico-' + className;\n playbackRateButton.classList.remove(className);\n });\n\n let idx = VideoPlayer.PLAYBACK_RATES.indexOf(appMediaPlaybackController.playbackRate);\n if(idx === -1) idx = VideoPlayer.PLAYBACK_RATES.indexOf(1);\n\n playbackRateButton.classList.add('tgico-' + VideoPlayer.PLAYBACK_RATES_ICONS[idx]);\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 cleanup() {\n super.cleanup();\n this.listenerSetter.removeAll();\n this.progress.removeListeners();\n this.onPlaybackRackMenuToggle = this.onPip = undefined;\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 {MyDocument} from '../lib/appManagers/appDocsManager';\nimport type {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport deferredPromise from '../helpers/cancellablePromise';\nimport mediaSizes from '../helpers/mediaSizes';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport {IS_MOBILE, IS_MOBILE_SAFARI, IS_SAFARI} from '../environment/userAgent';\nimport {logger} from '../lib/logger';\nimport VideoPlayer from '../lib/mediaPlayer';\nimport rootScope from '../lib/rootScope';\nimport animationIntersector from './animationIntersector';\nimport appMediaPlaybackController, {AppMediaPlaybackController} from './appMediaPlaybackController';\nimport AvatarElement from './avatar';\nimport ButtonIcon from './buttonIcon';\nimport {ButtonMenuItemOptions} from './buttonMenu';\nimport ButtonMenuToggle from './buttonMenuToggle';\nimport ProgressivePreloader from './preloader';\nimport SwipeHandler from './swipeHandler';\nimport {formatFullSentTime} from '../helpers/date';\nimport appNavigationController, {NavigationItem} 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 cancelEvent from '../helpers/dom/cancelEvent';\nimport fillPropertyValue from '../helpers/fillPropertyValue';\nimport generatePathData from '../helpers/generatePathData';\nimport replaceContent from '../helpers/dom/replaceContent';\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 {NULL_PEER_ID} from '../lib/mtproto/mtproto_config';\nimport {isFullScreen} from '../helpers/dom/fullScreen';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport SearchListLoader from '../helpers/searchListLoader';\nimport createVideo from '../helpers/dom/createVideo';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport getStrippedThumbIfNeeded from '../helpers/getStrippedThumbIfNeeded';\nimport setAttachmentSize from '../helpers/setAttachmentSize';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport LazyLoadQueueBase from './lazyLoadQueueBase';\nimport overlayCounter from '../helpers/overlayCounter';\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport wrapPeerTitle from './wrappers/peerTitle';\nimport {toastNew} from './toast';\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 protected releaseSingleMedia: ReturnType;\n protected navigationItem: NavigationItem;\n\n protected managers: AppManagers;\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.managers = rootScope.managers;\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 attachClickEvent(this.zoomElements.btnOut, () => this.changeZoom(false));\n this.zoomElements.btnIn = ButtonIcon('zoomin', {noRipple: true});\n attachClickEvent(this.zoomElements.btnIn, () => 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.moversContainer.append(this.buttons.prev, this.buttons.next);\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 attachClickEvent(this.buttons.download, this.onDownloadClick);\n [this.buttons.close, this.buttons['mobile-close'], this.preloaderStreamable.preloader].forEach((el) => {\n attachClickEvent(el, this.close.bind(this));\n });\n\n ([[-1, this.buttons.prev], [1, this.buttons.next]] as [number, HTMLElement][]).forEach(([moveLength, button]) => {\n // attachClickEvent(button, (e) => {\n button.addEventListener('click', (e) => {\n cancelEvent(e);\n if(this.setMoverPromise) return;\n\n this.listLoader.go(moveLength);\n });\n });\n\n attachClickEvent(this.buttons.zoom, () => {\n if(this.isZooming()) this.toggleZoom(false);\n else {\n this.changeZoom(true);\n }\n });\n\n // ! cannot use the function because it'll cancel slide event on touch devices\n // attachClickEvent(this.wholeDiv, this.onClick);\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\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.close();\n return true;\n }\n\n return false;\n },\n verifyTouchTarget: (e) => {\n // * Fix for seek input\n if(findUpClassName(e.target, 'ckin__controls') ||\n findUpClassName(e.target, 'media-viewer-caption') ||\n findUpClassName(e.target, 'media-viewer-topbar')) {\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({buttonOptions: {onlyMobile: true}, direction: '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 if(this.navigationItem) {\n appNavigationController.removeItem(this.navigationItem);\n }\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 SearchListLoader).cleanup && (this.listLoader as SearchListLoader).cleanup();\n this.setMoverPromise = null;\n this.tempId = -1;\n if((window as any).appMediaViewer === this) {\n (window as any).appMediaViewer = 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 this.removeGlobalListeners();\n\n this.zoomSwipeHandler = undefined;\n\n promise.finally(() => {\n this.wholeDiv.remove();\n this.toggleOverlay(false);\n });\n\n return promise;\n }\n\n protected toggleOverlay(active: boolean) {\n overlayCounter.isOverlayActive = active;\n animationIntersector.checkAnimations2(active);\n }\n\n protected toggleGlobalListeners(active: boolean) {\n if(active) this.setGlobalListeners();\n else this.removeGlobalListeners();\n }\n\n protected removeGlobalListeners() {\n if(this.zoomSwipeHandler) {\n this.zoomSwipeHandler.removeListeners();\n }\n\n window.removeEventListener('keydown', this.onKeyDown);\n window.removeEventListener('keyup', this.onKeyUp);\n window.removeEventListener('wheel', this.onWheel, {capture: true});\n }\n\n protected setGlobalListeners() {\n if(this.isZooming()) {\n this.zoomSwipeHandler.setListeners();\n }\n\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 }\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.close();\n }\n };\n\n private onKeyDown = (e: KeyboardEvent) => {\n // this.log('onKeyDown', e);\n if(overlayCounter.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(overlayCounter.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(overlayCounter.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 | HTMLCanvasElement;\n let src: string;\n\n // if(target instanceof HTMLVideoElement) {\n const selector = 'video, img, .canvas-thumbnail';\n const queryFrom = target.matches(selector) ? target.parentElement : target;\n const elements = Array.from(queryFrom.querySelectorAll(selector)) as HTMLImageElement[];\n if(elements.length) {\n target = elements.pop();\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n if(target instanceof HTMLImageElement) {\n canvas.width = target.naturalWidth;\n canvas.height = target.naturalHeight;\n } else if(target instanceof HTMLVideoElement) {\n canvas.width = target.videoWidth;\n canvas.height = target.videoHeight;\n } else if(target instanceof HTMLCanvasElement) {\n canvas.width = target.width;\n canvas.height = target.height;\n }\n\n canvas.className = 'canvas-thumbnail thumbnail media-photo';\n context.drawImage(target as HTMLImageElement | HTMLCanvasElement, 0, 0);\n target = canvas;\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 } else if(target instanceof HTMLImageElement) {\n mediaElement = new Image();\n src = target.src;\n } else if(target instanceof HTMLVideoElement) {\n mediaElement = createVideo();\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 } else if(target instanceof HTMLCanvasElement) {\n mediaElement = target;\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.toggleWholeActive(false);\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 toggleWholeActive(active: boolean) {\n if(active) {\n this.wholeDiv.classList.add('active');\n } else {\n this.wholeDiv.classList.add('backwards');\n setTimeout(() => {\n this.wholeDiv.classList.remove('active');\n }, 0);\n }\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 if((el as HTMLImageElement).src !== url) {\n renderImageFromUrl(el, url);\n }\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 const isPeerId = fromId.isPeerId();\n let wrapTitlePromise: Promise | HTMLElement;\n if(isPeerId) {\n wrapTitlePromise = wrapPeerTitle({\n peerId: fromId as PeerId,\n dialog: false,\n onlyFirstName: false,\n plainText: false\n })\n } else {\n const title = wrapTitlePromise = document.createElement('span');\n title.append(wrapEmojiText(fromId));\n title.classList.add('peer-title');\n }\n\n const oldAvatar = this.author.avatarEl;\n const newAvatar = this.author.avatarEl = (oldAvatar.cloneNode() as AvatarElement);\n\n return Promise.all([\n (this.author.avatarEl as AvatarElement).updateWithOptions({\n peerId: fromId as PeerId || NULL_PEER_ID,\n peerTitle: isPeerId ? undefined : '' + fromId\n }),\n\n wrapTitlePromise\n ]).then(([_, title]) => {\n if(this.author.avatarEl !== newAvatar) {\n return;\n }\n\n replaceContent(this.author.date, formatFullSentTime(timestamp));\n replaceContent(this.author.nameEl, title);\n oldAvatar.replaceWith(this.author.avatarEl);\n });\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 const setAuthorPromise = 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 this.toggleOverlay(true);\n this.setGlobalListeners();\n await setAuthorPromise;\n\n if(!this.wholeDiv.parentElement) {\n this.pageEl.insertBefore(this.wholeDiv, document.getElementById('main-columns'));\n void this.wholeDiv.offsetLeft; // reflow\n }\n\n this.toggleWholeActive(true);\n\n if(!IS_MOBILE_SAFARI) {\n this.navigationItem = {\n type: 'media',\n onPop: (canAnimate) => {\n if(this.setMoverAnimationPromise) {\n return false;\n }\n\n this.close();\n }\n };\n\n appNavigationController.pushItem(this.navigationItem);\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 = setAttachmentSize(media, container, maxWidth, maxHeight, mediaSizes.isMobile ? false : true, undefined, !!(isDocument && media.w && media.h)).photoSize;\n if(useContainerAsTarget) {\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(media, size.type);\n let img: HTMLImageElement | HTMLCanvasElement;\n if(cacheContext.downloaded) {\n img = new Image();\n img.src = cacheContext.url;\n } else {\n const gotThumb = 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 const getCacheContext = () => {\n return this.managers.thumbsStorage.getCacheContext(media, size?.type);\n };\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 */createVideo({pip: useController});\n\n if(this.wholeDiv.classList.contains('no-forwards')) {\n video.addEventListener('contextmenu', cancelEvent);\n }\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 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 } else if(media.duration < 60) {\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({\n video,\n play,\n streamable: supportsStreaming,\n onPlaybackRackMenuToggle: (open) => {\n this.wholeDiv.classList.toggle('hide-caption', !!open);\n },\n onPip: (pip) => {\n const otherMediaViewer = (window as any).appMediaViewer;\n if(!pip && otherMediaViewer && otherMediaViewer !== this) {\n this.releaseSingleMedia = undefined;\n this.close();\n return;\n }\n\n const mover = this.moversContainer.lastElementChild as HTMLElement;\n mover.classList.toggle('hiding', pip);\n this.toggleWholeActive(!pip);\n this.toggleOverlay(!pip);\n this.toggleGlobalListeners(!pip);\n\n if(this.navigationItem) {\n if(pip) appNavigationController.removeItem(this.navigationItem);\n else appNavigationController.pushItem(this.navigationItem);\n }\n\n if(useController) {\n if(pip) {\n // appMediaPlaybackController.toggleSwitchers(true);\n\n this.releaseSingleMedia(false);\n this.releaseSingleMedia = undefined;\n\n appMediaPlaybackController.setPictureInPicture(video);\n } else {\n this.releaseSingleMedia = appMediaPlaybackController.setSingleMedia(video, message as Message.message);\n }\n }\n },\n onPipClose: () => {\n // this.target = undefined;\n // this.toggleWholeActive(false);\n // this.toggleOverlay(false);\n this.close();\n }\n });\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.cleanup();\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 // console.log('ppp 1');\n preloader.attach(mover, true);\n }\n\n /* canPlayThrough.then(() => {\n preloader.detach();\n }); */\n });\n\n const attachCanPlay = () => {\n video.addEventListener('canplay', () => {\n // console.log('ppp 2');\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 // console.log('ppp 3');\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 = async() => {\n /* if(useController) {\n appMediaPlaybackController.resolveWaitingForLoadMedia(message.peerId, message.mid, message.pFlags.is_scheduled);\n } */\n\n const promise: Promise = supportsStreaming ? Promise.resolve() : appDownloadManager.downloadMediaURL({media});\n\n if(!supportsStreaming) {\n onAnimationEnd.then(async() => {\n if(!(await getCacheContext()).url) {\n // console.log('ppp 4');\n preloader.attach(mover, true, promise);\n }\n });\n }\n\n Promise.all([promise, onAnimationEnd]).then(async() => {\n if(this.tempId !== tempId) {\n this.log.warn('media viewer changed video');\n return;\n }\n\n const url = (await getCacheContext()).url;\n\n video.addEventListener('error', () => {\n toastNew({\n langPackKey: IS_MOBILE ? 'Video.Unsupported.Mobile' : 'Video.Unsupported.Desktop'\n });\n\n if(video.error.code !== 4) {\n this.log.error('Error ' + video.error.code + '; details: ' + video.error.message);\n }\n\n preloader?.detach();\n }, {once: true});\n\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 // * have to set options (especially playbackRate) after src\n // * https://github.com/videojs/video.js/issues/2516\n if(useController) {\n this.releaseSingleMedia = appMediaPlaybackController.setSingleMedia(video, message as Message.message);\n\n this.addEventListener('setMoverBefore', () => {\n if(this.releaseSingleMedia) {\n this.releaseSingleMedia();\n this.releaseSingleMedia = undefined;\n }\n }, {once: true});\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 = async() => {\n const cancellablePromise = isDocument ? appDownloadManager.downloadMediaURL({media}) : appDownloadManager.downloadMediaURL({media, thumb: size});\n\n onAnimationEnd.then(async() => {\n if(!(await getCacheContext()).url) {\n this.preloader.attachPromise(cancellablePromise);\n // this.preloader.attach(mover, true, cancellablePromise);\n }\n });\n\n Promise.all([onAnimationEnd, cancellablePromise]).then(async() => {\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 = (await getCacheContext()).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 const 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","/*\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 fillPropertyValue(str: string) {\n const splitted = str.split(' ');\n if(splitted.length !== 4) {\n if(!splitted[0]) splitted[0] = '0px';\n for(let i = splitted.length; i < 4; ++i) {\n splitted[i] = splitted[i % 2] || splitted[0] || '0px';\n }\n }\n\n return splitted;\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 {MOUNT_CLASS_TO} from '../config/debug';\nimport {IS_MOBILE_SAFARI} from '../environment/userAgent';\nimport {logger} from '../lib/logger';\nimport blurActiveElement from '../helpers/dom/blurActiveElement';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport isSwipingBackSafari from '../helpers/dom/isSwipingBackSafari';\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\n\nexport type NavigationItem = {\n type: 'left' | 'right' | 'im' | 'chat' | 'popup' | 'media' | 'menu' |\n 'esg' | 'multiselect' | 'input-helper' | 'autocomplete-helper' | 'markup' |\n 'global-search' | 'voice' | 'mobile-search' | 'filters' | 'global-search-focus' |\n 'toast' | 'dropdown' | 'forum',\n onPop: (canAnimate: boolean) => boolean | void,\n onEscape?: () => boolean,\n noHistory?: boolean,\n noBlurOnPop?: boolean,\n};\n\nexport class AppNavigationController {\n private navigations: Array;\n private id: number;\n private manual: boolean;\n private log: ReturnType;\n private debug: boolean;\n private currentHash: string; // have to start with # if not empty\n private overriddenHash: string; // have to start with # if not empty\n private isPossibleSwipe: boolean;\n public onHashChange: () => void;\n\n constructor() {\n this.navigations = [];\n this.id = Date.now();\n this.manual = false;\n this.log = logger('NC');\n this.debug = true;\n this.currentHash = window.location.hash;\n this.overriddenHash = '';\n this.isPossibleSwipe = false;\n\n window.addEventListener('popstate', this.onPopState);\n window.addEventListener('keydown', this.onKeyDown, {capture: true, passive: false});\n\n if(IS_MOBILE_SAFARI) {\n const options = {passive: true};\n window.addEventListener('touchstart', this.onTouchStart, options);\n }\n\n history.scrollRestoration = 'manual';\n\n this.pushState(); // * push init state\n }\n\n private onPopState = (e: PopStateEvent) => {\n const hash = window.location.hash;\n const id: number = e.state;\n this.debug && this.log('popstate', e, this.isPossibleSwipe, hash);\n if(hash !== this.currentHash) {\n this.debug && this.log.warn(`hash changed, new=${hash}, current=${this.currentHash}, overridden=${this.overriddenHash}`);\n // fix for returning to wrong hash (e.g. chat -> archive -> chat -> 3x back)\n if(id === this.id && this.overriddenHash && this.overriddenHash !== hash) {\n this.overrideHash(this.overriddenHash);\n } else if(id/* === this.id */ && !this.overriddenHash && hash) {\n this.overrideHash();\n } else {\n this.currentHash = hash;\n this.onHashChange && this.onHashChange();\n // this.replaceState();\n return;\n }\n }\n\n if(id !== this.id/* && !this.navigations.length */) {\n this.pushState();\n\n if(!this.navigations.length) {\n return;\n }\n }\n\n const item = this.navigations.pop();\n if(!item) {\n this.pushState();\n return;\n }\n\n this.manual = !this.isPossibleSwipe;\n this.handleItem(item);\n // this.pushState(); // * prevent adding forward arrow\n };\n\n private onKeyDown = (e: KeyboardEvent) => {\n const item = this.navigations[this.navigations.length - 1];\n if(!item) return;\n if(e.key === 'Escape' && (item.onEscape ? item.onEscape() : true)) {\n cancelEvent(e);\n this.back(item.type);\n }\n };\n\n private onTouchStart = (e: TouchEvent) => {\n if(e.touches.length > 1) return;\n this.debug && this.log('touchstart');\n\n if(isSwipingBackSafari(e)) {\n this.isPossibleSwipe = true;\n\n window.addEventListener('touchend', () => {\n setTimeout(() => {\n this.isPossibleSwipe = false;\n }, 100);\n }, {passive: true, once: true});\n }\n\n /* const detach = () => {\n window.removeEventListener('touchend', onTouchEnd);\n window.removeEventListener('touchmove', onTouchMove);\n };\n\n let moved = false;\n const onTouchMove = (e: TouchEvent) => {\n this.debug && this.log('touchmove');\n if(e.touches.length > 1) {\n detach();\n return;\n }\n\n moved = true;\n };\n\n const onTouchEnd = (e: TouchEvent) => {\n this.debug && this.log('touchend');\n if(e.touches.length > 1 || !moved) {\n detach();\n return;\n }\n\n isPossibleSwipe = true;\n doubleRaf().then(() => {\n isPossibleSwipe = false;\n });\n\n detach();\n };\n\n window.addEventListener('touchend', onTouchEnd, options);\n window.addEventListener('touchmove', onTouchMove, options); */\n };\n\n public overrideHash(hash: string = '') {\n if(hash && hash[0] !== '#') hash = '#' + hash;\n else if(hash === '#') hash = '';\n\n if(this.currentHash === hash) {\n return;\n }\n\n this.overriddenHash = this.currentHash = hash;\n this.replaceState();\n this.pushState();\n }\n\n private handleItem(item: NavigationItem) {\n const good = item.onPop(!this.manual ? false : undefined);\n this.debug && this.log('popstate, navigation:', item, this.navigations);\n if(good === false) {\n this.pushItem(item);\n } else if(!item.noBlurOnPop) {\n blurActiveElement(); // no better place for it\n }\n\n this.manual = false;\n }\n\n public findItemByType(type: NavigationItem['type']) {\n for(let i = this.navigations.length - 1; i >= 0; --i) {\n const item = this.navigations[i];\n if(item.type === type) {\n return {item, index: i};\n }\n }\n }\n\n public back(type?: NavigationItem['type']) {\n if(type) {\n const ret = this.findItemByType(type);\n if(ret) {\n this.backByItem(ret.item, ret.index);\n return;\n }\n }\n\n history.back();\n }\n\n public backByItem(item: NavigationItem, index = this.navigations.indexOf(item)) {\n this.manual = true;\n // ! commented because 'popstate' event will be fired with delay\n // if(index !== (this.navigations.length - 1)) {\n this.navigations.splice(index, 1);\n this.handleItem(item);\n // }\n }\n\n private onItemAdded(item: NavigationItem) {\n this.debug && this.log('onItemAdded', item, this.navigations);\n\n if(!item.noHistory) {\n this.pushState();\n }\n }\n\n public pushItem(item: NavigationItem) {\n this.navigations.push(item);\n this.onItemAdded(item);\n }\n\n public unshiftItem(item: NavigationItem) {\n this.navigations.unshift(item);\n this.onItemAdded(item);\n }\n\n public spliceItems(index: number, length: number, ...items: NavigationItem[]) {\n this.navigations.splice(index, length, ...items);\n items.forEach((item) => {\n this.onItemAdded(item);\n });\n }\n\n private pushState() {\n this.debug && this.log('push');\n this.manual = false;\n history.pushState(this.id, '');\n }\n\n public replaceState() {\n this.debug && this.log.warn('replace');\n\n const url = location.origin + location.pathname + location.search + this.overriddenHash;\n history.replaceState(this.id, '', url);\n }\n\n public removeItem(item: NavigationItem) {\n if(!item) {\n return;\n }\n\n indexOfAndSplice(this.navigations, item);\n }\n\n public removeByType(type: NavigationItem['type'], single = false) {\n for(let i = this.navigations.length - 1; i >= 0; --i) {\n const item = this.navigations[i];\n if(item.type === type) {\n this.navigations.splice(i, 1);\n\n if(single) {\n break;\n }\n }\n }\n }\n}\n\nconst appNavigationController = new AppNavigationController();\nMOUNT_CLASS_TO.appNavigationController = appNavigationController;\nexport default appNavigationController;\n","/*\n * 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 Scrollable from './scrollable';\nimport InputSearch from './inputSearch';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport {i18n, LangPackKey} from '../lib/langPack';\nimport rootScope from '../lib/rootScope';\n\nexport class SearchGroup {\n container: HTMLDivElement;\n nameEl: HTMLDivElement;\n list: HTMLUListElement;\n\n constructor(\n public name: LangPackKey | boolean,\n public type: string,\n private clearable = true,\n className?: string,\n clickable = true,\n public autonomous = true,\n public onFound?: () => void,\n public noIcons?: boolean\n ) {\n this.list = appDialogsManager.createChatList();\n this.container = document.createElement('div');\n if(className) this.container.className = className;\n\n if(name) {\n this.nameEl = document.createElement('div');\n this.nameEl.classList.add('search-group__name');\n if(typeof(name) === 'string') {\n this.nameEl.append(i18n(name));\n }\n this.container.append(this.nameEl);\n }\n\n this.container.classList.add('search-group', 'search-group-' + type);\n this.container.append(this.list);\n this.container.style.display = 'none';\n\n if(clickable) {\n appDialogsManager.setListClickListener(this.list, onFound, undefined, autonomous);\n }\n }\n\n clear() {\n this.container.style.display = 'none';\n\n if(this.clearable) {\n this.list.innerHTML = '';\n }\n }\n\n setActive() {\n this.container.style.display = '';\n }\n\n toggle() {\n if(this.list.childElementCount) {\n this.setActive();\n } else {\n this.clear();\n }\n }\n}\n\nexport type SearchGroupType = 'contacts' | 'globalContacts' | 'messages' | string;\n\nexport default class AppSearch {\n private minMsgId = 0;\n private loadedCount = -1;\n private foundCount = -1;\n\n private searchPromise: Promise = null;\n private searchTimeout: number = 0;\n\n private query = '';\n\n private listsContainer: HTMLDivElement = null;\n\n private peerId: PeerId; // 0 - means global\n private threadId = 0;\n\n private scrollable: Scrollable;\n\n constructor(\n public container: HTMLElement,\n public searchInput: InputSearch,\n public searchGroups: {[group in SearchGroupType]: SearchGroup},\n public onSearch?: (count: number) => void,\n public noIcons?: boolean\n ) {\n this.scrollable = new Scrollable(this.container);\n this.listsContainer = this.scrollable.container as HTMLDivElement;\n for(const i in this.searchGroups) {\n this.listsContainer.append(this.searchGroups[i as SearchGroupType].container);\n }\n\n if(this.searchGroups.messages) {\n this.scrollable.setVirtualContainer(this.searchGroups.messages.list);\n }\n\n this.searchInput.onChange = (value) => {\n /* if(!value.trim()) {\n //this.peerId = 0;\n return;\n } */\n\n this.query = value;\n this.reset(false);\n this.searchMore();\n };\n\n this.scrollable.onScrolledBottom = () => {\n if(!this.query.trim()) return;\n\n if(!this.searchTimeout) {\n this.searchTimeout = window.setTimeout(() => {\n this.searchMore();\n this.searchTimeout = 0;\n }, 0);\n }\n };\n }\n\n public reset(all = true) {\n if(all) {\n this.searchInput.value = '';\n this.query = '';\n this.peerId = undefined;\n this.threadId = 0;\n }\n\n this.minMsgId = 0;\n this.loadedCount = -1;\n this.foundCount = -1;\n\n for(const i in this.searchGroups) {\n this.searchGroups[i as SearchGroupType].clear();\n }\n\n this.searchPromise = null;\n }\n\n public beginSearch(peerId?: PeerId, threadId = 0, query = '') {\n this.peerId = peerId;\n this.threadId = threadId;\n\n if(this.query !== query) {\n this.searchInput.inputField.value = query;\n }\n\n this.searchInput.input.focus();\n }\n\n public searchMore() {\n if(this.searchPromise) return this.searchPromise;\n\n const query = this.query;\n\n if(!query.trim()) {\n this.onSearch && this.onSearch(0);\n return;\n }\n\n if(this.foundCount !== -1 && this.loadedCount >= this.foundCount) {\n return Promise.resolve();\n }\n\n const maxId = this.minMsgId || 0;\n\n return this.searchPromise = rootScope.managers.appMessagesManager.getSearch({\n peerId: this.peerId,\n query,\n inputFilter: {_: 'inputMessagesFilterEmpty'},\n maxId,\n limit: 20,\n threadId: this.threadId\n }).then((res) => {\n this.searchPromise = null;\n\n if(this.searchInput.value !== query) {\n return;\n }\n\n // console.log('input search result:', this.peerId, query, null, maxId, 20, res);\n\n const {count, history} = res;\n\n if(history.length && history[0].mid === this.minMsgId) {\n history.shift();\n }\n\n const searchGroup = this.searchGroups.messages;\n\n history.forEach((message) => {\n try {\n const peerId = this.peerId ? message.fromId : message.peerId;\n appDialogsManager.addDialogAndSetLastMessage({\n peerId,\n container: this.scrollable/* searchGroup.list */,\n avatarSize: 'bigger',\n meAsSaved: false,\n message,\n query,\n noIcons: this.noIcons\n });\n } catch(err) {\n console.error('[appSearch] render search result', err);\n }\n });\n\n searchGroup.toggle();\n\n this.minMsgId = history.length && history[history.length - 1].mid;\n\n if(this.loadedCount === -1) {\n this.loadedCount = 0;\n }\n this.loadedCount += history.length;\n\n if(this.foundCount === -1) {\n this.foundCount = count;\n\n if(searchGroup.nameEl) {\n replaceContent(searchGroup.nameEl, i18n(count ? 'Chat.Search.MessagesFound' : 'Chat.Search.NoMessagesFound', [count]));\n }\n\n this.onSearch && this.onSearch(this.foundCount);\n }\n }).catch((err) => {\n console.error('search error', err);\n this.searchPromise = null;\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 {MyInputMessagesFilter, MyMessage} from '../lib/appManagers/appMessagesManager';\nimport appDialogsManager, {DIALOG_LIST_ELEMENT_TAG} from '../lib/appManagers/appDialogsManager';\nimport {logger} from '../lib/logger';\nimport rootScope from '../lib/rootScope';\nimport {SearchGroup, SearchGroupType} from './appSearch';\nimport {horizontalMenu} from './horizontalMenu';\nimport LazyLoadQueue from './lazyLoadQueue';\nimport {putPreloader} from './putPreloader';\nimport ripple from './ripple';\nimport Scrollable, {ScrollableX} from './scrollable';\nimport useHeavyAnimationCheck, {getHeavyAnimationPromise} from '../hooks/useHeavyAnimationCheck';\nimport I18n, {LangPackKey, i18n} from '../lib/langPack';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport {getMiddleware, Middleware} from '../helpers/middleware';\nimport {ChannelParticipant, Chat, ChatFull, ChatParticipant, ChatParticipants, Document, 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 {ButtonMenuItemOptions, ButtonMenuSync} 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';\nimport copy from '../helpers/object/copy';\nimport getObjectKeysAndSort from '../helpers/object/getObjectKeysAndSort';\nimport safeAssign from '../helpers/object/safeAssign';\nimport escapeRegExp from '../helpers/string/escapeRegExp';\nimport findAndSplice from '../helpers/array/findAndSplice';\nimport {ScrollStartCallbackDimensions} from '../helpers/fastSmoothScroll';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport choosePhotoSize from '../lib/appManagers/utils/photos/choosePhotoSize';\nimport wrapWebPageDescription from './wrappers/webPageDescription';\nimport wrapWebPageTitle from './wrappers/webPageTitle';\nimport wrapAbbreviation from '../lib/richTextProcessor/wrapAbbreviation';\nimport matchUrl from '../lib/richTextProcessor/matchUrl';\nimport wrapPlainText from '../lib/richTextProcessor/wrapPlainText';\nimport wrapRichText from '../lib/richTextProcessor/wrapRichText';\nimport wrapSenderToPeer from './wrappers/senderToPeer';\nimport wrapSentTime from './wrappers/sentTime';\nimport getMediaFromMessage from '../lib/appManagers/utils/messages/getMediaFromMessage';\nimport filterMessagesByInputFilter from '../lib/appManagers/utils/messages/filterMessagesByInputFilter';\nimport getChatMembersString from './wrappers/getChatMembersString';\nimport getUserStatusString from './wrappers/getUserStatusString';\nimport getParticipantPeerId from '../lib/appManagers/utils/chats/getParticipantPeerId';\nimport {Awaited} from '../types';\nimport {attachContextMenuListener} from '../helpers/dom/attachContextMenuListener';\nimport contextMenuController from '../helpers/contextMenuController';\nimport positionMenu from '../helpers/positionMenu';\nimport apiManagerProxy from '../lib/mtproto/mtprotoworker';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport SwipeHandler from './swipeHandler';\nimport wrapDocument from './wrappers/document';\nimport wrapPhoto from './wrappers/photo';\nimport wrapVideo from './wrappers/video';\nimport noop from '../helpers/noop';\nimport wrapMediaSpoiler, {onMediaSpoilerClick} from './wrappers/mediaSpoiler';\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 | Promise, withSelection?: true})[];\n private element: HTMLElement;\n private target: HTMLElement;\n private peerId: PeerId;\n private mid: number;\n private isSelected: boolean;\n private managers: AppManagers;\n\n constructor(\n private attachTo: HTMLElement,\n private searchSuper: AppSearchSuper,\n private listenerSetter: ListenerSetter\n ) {\n this.managers = searchSuper.managers;\n\n const onContextMenu: Parameters[0]['callback'] = (e) => {\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 const r = async() => {\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 await Promise.all(this.buttons.map(async(button) => {\n let good: boolean;\n\n if(this.isSelected && !button.withSelection) {\n good = false;\n } else {\n good = button.verify ? await 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 contextMenuController.openBtnMenu(this.element, () => {\n item.classList.remove('menu-open');\n });\n };\n\n r();\n };\n\n if(IS_TOUCH_SUPPORTED) {\n\n } else {\n attachContextMenuListener({\n element: attachTo,\n callback: onContextMenu as any,\n listenerSetter\n });\n }\n }\n\n private init() {\n this.buttons = [{\n icon: 'forward',\n text: 'Forward',\n onClick: this.onForwardClick,\n verify: async() => this.managers.appMessagesManager.canForward(await this.managers.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: async() => this.managers.appMessagesManager.canDeleteMessage(await this.managers.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 = ButtonMenuSync({buttons: this.buttons, listenerSetter: this.listenerSetter});\n this.element.classList.add('search-contextmenu', 'contextmenu');\n document.getElementById('page-chats').append(this.element);\n }\n\n private onGotoClick = () => {\n appImManager.setInnerPeer({\n peerId: this.peerId,\n lastMsgId: 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: Middleware,\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\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 public scrollStartCallback: (dimensions: ScrollStartCallbackDimensions) => void;\n\n public managers: AppManagers;\n private loadFirstTimePromise: Promise;\n\n private listenerSetter: ListenerSetter;\n private swipeHandler: SwipeHandler;\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.listenerSetter = new ListenerSetter();\n this.searchContextMenu = new SearchContextMenu(this.container, this, this.listenerSetter);\n this.selection = new SearchSelection(this, this.managers, this.listenerSetter);\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 this.swipeHandler = handleTabSwipe({\n element: this.tabsContainer,\n onSwipe: (xDiff, yDiff, e) => {\n xDiff *= -1;\n yDiff *= -1;\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 verifyTouchTarget: (e) => {\n return !findUpClassName(e.target, 'scrollable-x');\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.canLoadMediaTab(this.mediaTab)/* && 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 startCallback: this.scrollStartCallback\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 startCallback: this.scrollStartCallback\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, this.listenerSetter);\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, listenerSetter: this.listenerSetter});\n\n const onMediaClick = async(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 mediaSpoiler: HTMLElement = target.querySelector('.media-spoiler-container');\n if(mediaSpoiler) {\n onMediaSpoilerClick({\n event: e,\n mediaSpoiler\n })\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 = await this.managers.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'), {listenerSetter: this.listenerSetter});\n attachClickEvent(this.tabs.inputMessagesFilterDocument, onMediaClick.bind(null, 'document-with-thumb', 'media-container', 'inputMessagesFilterDocument'), {listenerSetter: this.listenerSetter});\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 }, this.listenerSetter);\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 return filterMessagesByInputFilter(type, messages, messages.length);\n }\n\n private processEmptyFilter({message, searchGroup}: ProcessSearchSuperResult) {\n const loadPromises: Promise[] = [];\n const dialogElement = appDialogsManager.addDialogNew({\n peerId: message.peerId,\n container: searchGroup.list,\n avatarSize: 'bigger',\n loadPromises\n });\n\n const setLastMessagePromise = appDialogsManager.setLastMessageN({\n dialog: {\n _: 'dialog',\n peerId: message.peerId\n } as any,\n lastMessage: message,\n dialogElement,\n highlightWord: this.searchContext.query\n });\n\n loadPromises.push(setLastMessagePromise);\n return Promise.all(loadPromises).then(noop);\n }\n\n private async processPhotoVideoFilter({message, promises, middleware}: ProcessSearchSuperResult) {\n const media = getMediaFromMessage(message);\n\n const div = document.createElement('div');\n div.classList.add('grid-item');\n // this.log(message, photo);\n\n let wrapped: Awaited>;\n const size = choosePhotoSize(media, 200, 200);\n if(media._ !== 'photo') {\n wrapped = await (await 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 photoSize: size\n })).thumb;\n } else {\n wrapped = await 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 if((message.media as MessageMedia.messageMediaPhoto).pFlags.spoiler) {\n const mediaSpoiler = await wrapMediaSpoiler({\n animationGroup: 'chat',\n media,\n middleware,\n width: 140,\n height: 140,\n multiply: 0.3\n });\n\n div.append(mediaSpoiler);\n }\n\n [\n wrapped.images.thumb,\n wrapped.images.full\n ].filter(Boolean).forEach((image) => {\n image.classList.add('grid-item-media');\n });\n\n promises.push(wrapped.loadPromises.thumb);\n\n return {element: div, message};\n }\n\n private async processDocumentFilter({message, inputFilter}: ProcessSearchSuperResult) {\n const document = getMediaFromMessage(message) as Document.document;\n const showSender = this.showSender || (['voice', 'round'] as MyDocument['type'][]).includes(document.type);\n\n const div = await wrapDocument({\n message,\n withTime: !showSender,\n fontWeight: 400,\n voiceAsMusic: true,\n showSender,\n searchContext: this.copySearchContext(inputFilter),\n lazyLoadQueue: this.lazyLoadQueue,\n autoDownloadSize: 0,\n getSize: () => 320\n });\n\n if((['audio', 'voice', 'round'] as MyDocument['type'][]).includes(document.type)) {\n div.classList.add('audio-48');\n }\n\n return {message, element: div};\n }\n\n private async processUrlFilter({message, promises, middleware}: ProcessSearchSuperResult) {\n let webPage = (message.media as MessageMedia.messageMediaWebPage)?.webpage as WebPage.webPage | WebPage.webPageEmpty;\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 const match = matchUrl(message.message);\n if(!match) {\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 }\n }\n\n if(webPage._ === 'webPageEmpty') {\n return;\n }\n\n const previewDiv = document.createElement('div');\n previewDiv.classList.add('preview');\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: choosePhotoSize(webPage.photo as Photo.photo, 60, 60, false),\n loadPromises: promises,\n noBlur: true\n });\n } else {\n previewDiv.classList.add('empty');\n setInnerHTML(previewDiv, wrapAbbreviation(webPage.title || webPage.display_url || webPage.description || webPage.url, true));\n }\n\n const title = wrapWebPageTitle(webPage);\n\n const subtitleFragment = wrapWebPageDescription(webPage);\n const aFragment = htmlToDocumentFragment(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', await wrapSenderToPeer(message));\n }\n\n if(!title.textContent) {\n // title = new URL(webpage.url).hostname;\n title.append(wrapPlainText(webPage.display_url.split('/', 1)[0]));\n }\n\n const row = new Row({\n title,\n titleRight: wrapSentTime(message),\n subtitle: subtitleFragment,\n havePadding: true,\n clickable: true,\n noRipple: true\n });\n\n row.applyMediaElement(previewDiv, 'big');\n\n if(row.container.innerText.trim().length) {\n return {message, element: row.container};\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 type K = {element: HTMLElement, message: Message.message | Message.messageService};\n const results: (Promise | K)[] = messages.map(async(message) => {\n try {\n options.message = message;\n return await processCallback(options);\n } catch(err) {\n this.log.error('error rendering filter', inputFilter, options, message, err);\n }\n });\n\n const awaited = (await Promise.all(results)).filter(Boolean);\n elemsToAppend.push(...awaited);\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 if(!message) {\n debugger;\n }\n\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 : elemsToAppend.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(const 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.map((peerId) => {\n if(renderedPeerIds.has(peerId)) {\n return;\n }\n\n renderedPeerIds.add(peerId);\n\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: group.list,\n avatarSize: 'abitbigger',\n autonomous: group.autonomous\n });\n\n return {dom, peerId};\n }).filter(Boolean).forEach(async({dom, peerId}) => {\n const peer = await this.managers.appPeersManager.getPeer(peerId);\n if(showMembersCount && ((peer as Chat.channel).participants_count || (peer as any).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(await getChatMembersString(peerId.toChatId()));\n } else if(peerId === rootScope.myId) {\n dom.lastMessageSpan.append(i18n('Presence.YourChat'));\n } else {\n let username = await this.managers.appPeersManager.getPeerUsername(peerId);\n if(!username) {\n const user = await this.managers.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.textContent = 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 this.managers.appUsersManager.getContactsPeerIds(query, true, undefined, 10)\n .then(onLoad)\n .then((contacts) => {\n if(contacts) {\n setResults(contacts, this.searchGroups.contacts, true);\n }\n }),\n\n this.managers.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 attachClickEvent(showMore, () => {\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 this.managers.dialogsStorage.getDialogs({query, offsetIndex: 0, limit: 20, filterId: 0})\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 apiManagerProxy.getState().then((state) => {\n if(!middleware()) {\n return;\n }\n\n this.searchGroups.recent.list.replaceChildren();\n\n state.recentSearch.slice(0, 20).forEach(async(peerId) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: this.searchGroups.recent.list,\n meAsSaved: true,\n avatarSize: 'abitbigger',\n autonomous: true\n });\n\n dom.lastMessageSpan.append(await (peerId.isUser() ?\n getUserStatusString(await this.managers.appUsersManager.getUser(peerId.toUserId())) :\n 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 this.managers.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\n peers.forEach((peer) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peer.id,\n container: this.searchGroups.people.list,\n onlyFirstName: true,\n avatarSize: 'bigger',\n autonomous: false,\n noIcons: this.searchGroups.people.noIcons\n });\n\n dom.subtitleEl.remove();\n });\n\n this.searchGroups.people.toggle();\n }),\n\n renderRecentSearch()\n ]);\n } else return Promise.resolve();\n }\n\n private async 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 let membersList = this.membersList;\n if(!membersList) {\n membersList = new SortedUserList({\n lazyLoadQueue: this.lazyLoadQueue,\n rippleEnabled: false,\n managers: this.managers\n });\n attachClickEvent(membersList.list, (e) => {\n const li = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\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(membersList.list);\n this.afterPerforming(1, mediaTab.contentTab);\n }\n\n for(const participant of participants) {\n const peerId = getParticipantPeerId(participant);\n if(peerId.isAnyChat()) {\n continue;\n }\n\n const user = await this.managers.appUsersManager.getUser(peerId);\n if(!middleware()) {\n return;\n }\n\n if(user.pFlags.deleted) {\n continue;\n }\n\n membersList.add(peerId);\n }\n };\n\n if(await this.managers.appChatsManager.isChannel(id)) {\n const LOAD_COUNT = !this.membersList ? 50 : 200;\n promise = this.managers.appProfileManager.getChannelParticipants(id, undefined, LOAD_COUNT, this.nextRates[mediaTab.inputFilter]).then((participants) => {\n if(!middleware()) {\n return;\n }\n\n const 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 = this.managers.appProfileManager.getChatFull(id).then((chatFull) => {\n if(!middleware()) {\n return;\n }\n\n // console.log('anymore', chatFull);\n this.loaded[mediaTab.inputFilter] = true;\n const participants = (chatFull as ChatFull.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] ??= [];\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 promise = this.loadPromises[type] = Promise.resolve().then(async() => {\n // render from cache\n if(history.length && this.usedFromHistory[type] < history.length && !justLoad) {\n const messages: any[] = [];\n let used = Math.max(0, this.usedFromHistory[type]);\n let slicedLength = 0;\n\n do {\n const ids = history.slice(used, used + loadCount);\n used += ids.length;\n slicedLength += ids.length;\n\n const notFilteredMessages = await Promise.all(ids.map((m) => this.managers.appMessagesManager.getMessageByPeer(m.peerId, m.mid)));\n\n messages.push(...this.filterMessagesByType(notFilteredMessages, 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\n const maxId = history.length ? history[history.length - 1].mid : 0;\n\n const value = await this.managers.appMessagesManager.getSearch({\n ...this.searchContext,\n inputFilter: {_: type},\n maxId,\n limit: loadCount,\n nextRate: this.nextRates[type] ??= 0\n });\n\n history.push(...value.history.map((m) => ({mid: m.mid, peerId: m.peerId})));\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;\n }\n\n this.usedFromHistory[type] = history.length;\n\n if(!this.loaded[type]) {\n promise.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 return promise;\n }\n\n private canLoadMediaTab(mediaTab: SearchSuperMediaTab) {\n const inputFilter = mediaTab.inputFilter;\n return !this.loaded[inputFilter] || (this.historyStorage[inputFilter] && this.usedFromHistory[inputFilter] < this.historyStorage[inputFilter].length);\n }\n\n private async loadFirstTime() {\n const middleware = this.middleware.get();\n const {peerId, threadId} = this.searchContext;\n if(!this.hideEmptyTabs) {\n return;\n }\n\n const mediaTabs = this.mediaTabs.filter((mediaTab) => mediaTab.inputFilter !== 'inputMessagesFilterEmpty');\n const filters = mediaTabs.map((mediaTab) => ({_: mediaTab.inputFilter}));\n\n const [counters, canViewMembers] = await Promise.all([\n this.managers.appMessagesManager.getSearchCounters(peerId, filters, undefined, threadId),\n this.canViewMembers()\n ]);\n\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) {\n if(firstMediaTab === undefined) {\n firstMediaTab = mediaTab;\n }\n\n ++count;\n }\n });\n\n const membersTab = this.mediaTabsMap.get('members');\n membersTab.menuTab.classList.toggle('hide', !canViewMembers);\n\n if(canViewMembers) {\n firstMediaTab = membersTab;\n ++count;\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 public async load(single = false, justLoad = false) {\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 await (this.loadFirstTimePromise ??= this.loadFirstTime());\n if(!middleware()) {\n return;\n }\n\n this.loadFirstTimePromise = undefined;\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 return this.canLoadMediaTab(mediaTab);\n });\n\n if(peerId.isUser()) {\n findAndSplice(toLoad, (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 private 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 const {peerId} = this.searchContext;\n const isAnyChat = peerId.isAnyChat();\n if(!isAnyChat) return Promise.resolve(false);\n const chatId = peerId.toChatId();\n return Promise.all([\n this.managers.appChatsManager.isBroadcast(chatId),\n this.managers.appChatsManager.hasRights(chatId, 'view_participants'),\n this.managers.appChatsManager.isForum(chatId)\n ]).then(([isBroadcast, hasRights, isForum]) => {\n return !isBroadcast && hasRights && (!this.searchContext.threadId || !isForum);\n });\n }\n\n public cleanup() {\n this.loadPromises = {};\n this.loaded = {};\n this.loadedChats = false;\n this.nextRates = {};\n this.firstLoad = true;\n this.prevTabId = -1;\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.loadFirstTimePromise = undefined;\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 this.mediaTabs.forEach((tab) => {\n tab.contentTab.replaceChildren();\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 public destroy() {\n this.cleanup();\n this.listenerSetter.removeAll();\n this.scrollable.destroy();\n this.swipeHandler?.removeListeners();\n this.selection?.cleanup();\n\n this.scrollStartCallback = undefined;\n this.onChangeTab = undefined;\n this.selectTab = undefined;\n this.searchContextMenu = undefined;\n this.swipeHandler = undefined;\n this.selection = undefined;\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","/*\n * 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 {ChatRights} from '../lib/appManagers/appChatsManager';\nimport type {Dialog} from '../lib/appManagers/appMessagesManager';\nimport appDialogsManager, {DialogElementSize as DialogElementSize} from '../lib/appManagers/appDialogsManager';\nimport rootScope from '../lib/rootScope';\nimport Scrollable from './scrollable';\nimport {FocusDirection} from '../helpers/fastSmoothScroll';\nimport CheckboxField from './checkboxField';\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 debounce from '../helpers/schedulers/debounce';\nimport windowSize from '../helpers/windowSize';\nimport type {IsPeerType} from '../lib/appManagers/appPeersManager';\nimport {attachClickEvent, simulateClickEvent} from '../helpers/dom/clickEvent';\nimport filterUnique from '../helpers/array/filterUnique';\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\nimport safeAssign from '../helpers/object/safeAssign';\nimport findAndSplice from '../helpers/array/findAndSplice';\nimport AvatarElement from './avatar';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport filterAsync from '../helpers/array/filterAsync';\nimport getParticipantPeerId from '../lib/appManagers/utils/chats/getParticipantPeerId';\nimport getChatMembersString from './wrappers/getChatMembersString';\nimport getUserStatusString from './wrappers/getUserStatusString';\nimport {Chat, User} from '../layer';\nimport canSendToUser from '../lib/appManagers/utils/users/canSendToUser';\nimport hasRights from '../lib/appManagers/utils/chats/hasRights';\nimport getDialogIndex from '../lib/appManagers/utils/dialogs/getDialogIndex';\nimport {generateDelimiter} from './generateDelimiter';\nimport SettingSection from './settingSection';\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 | Promise;\n private chatRightsAction: ChatRights;\n private multiSelect = true;\n private rippleEnabled = true;\n private avatarSize: DialogElementSize = 'abitbigger';\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 private managers: AppManagers;\n\n private design: 'round' | 'square' = 'round';\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 managers: AppSelectPeers['managers'],\n design?: AppSelectPeers['design']\n }) {\n safeAssign(this, options);\n\n this.container.classList.add('selector', 'selector-' + this.design);\n\n const f = (this.renderResultsFunc || this.renderResults).bind(this);\n this.renderResultsFunc = async(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 = await filterAsync(peerIds, async(peerId) => {\n if(peerId.isPeerId()) {\n const peer = await this.managers.appPeersManager.getPeer(peerId);\n if(peer) {\n for(const method of this.filterPeerTypeBy) {\n if(await this.managers.appPeersManager[method](peerId)) {\n return true;\n }\n }\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 const 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 attachClickEvent(this.selectedContainer, (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 simulateClickEvent(li);\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 attachClickEvent(this.chatsContainer, (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 const 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 = undefined;\n }\n\n if(this.peerType.includes('dialogs')) {\n this.folderId = 0;\n this.offsetIndex = 0;\n }\n\n for(const i in this.tempIds) {\n // @ts-ignore\n ++this.tempIds[i];\n }\n\n this.list = appDialogsManager.createChatList();\n\n this.promise = undefined;\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 async renderSaved() {\n if(\n !this.exceptSelf &&\n !this.offsetIndex &&\n this.folderId === 0 &&\n this.peerType.includes('dialogs') &&\n (!this.query || await this.managers.appUsersManager.testSelfSearch(this.query))\n ) {\n await this.renderResultsFunc([rootScope.myId]);\n }\n }\n\n private getTempId(type: keyof AppSelectPeers['tempIds']) {\n this.tempIds[type] ??= 0;\n const tempId = ++this.tempIds[type];\n return {\n tempId,\n middleware: () => this.tempIds[type] === tempId\n };\n }\n\n private async getMoreDialogs(): Promise {\n if(this.loadedWhat.dialogs && this.loadedWhat.archived) {\n return;\n }\n\n // ะฒ ะดะตัะบั‚ะพะฟะต - ัะฝะฐั‡ะฐะปะฐ ะฑะตะท ะณั€ัƒะฟะฟั‹, ะฟะพั‚ะพะผ ะฐั€ั…ะธะฒะฝั‹ะต, ะฟะพั‚ะพะผ ะบะพะฝั‚ะฐะบั‚ั‹ ะฑะตะท ัะพะพะฑั‰ะตะฝะธะน\n const pageCount = windowSize.height / 56 * 1.25 | 0;\n\n const {middleware} = this.getTempId('dialogs');\n const promise = this.managers.dialogsStorage.getDialogs({\n query: this.query,\n offsetIndex: this.offsetIndex,\n limit: pageCount,\n filterId: this.folderId,\n skipMigrated: true\n });\n\n promise.catch(() => {\n if(!middleware()) {\n return;\n }\n\n this.loadedWhat[this.loadedWhat.dialogs ? 'archived' : 'dialogs'] = true;\n });\n\n const value = await promise;\n if(!middleware()) {\n return;\n }\n\n let dialogs = value.dialogs as Dialog[];\n if(dialogs.length) {\n const newOffsetIndex = getDialogIndex(dialogs[dialogs.length - 1]) || 0;\n\n dialogs = dialogs.slice();\n findAndSplice(dialogs, d => d.peerId === rootScope.myId); // no my account\n\n if(this.chatRightsAction) {\n dialogs = await filterAsync(dialogs, (d) => this.filterByRights(d.peerId));\n if(!middleware()) {\n return;\n }\n }\n\n await this.renderSaved();\n if(!middleware()) {\n return;\n }\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 await this.renderSaved();\n if(!middleware()) {\n return;\n }\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 async filterByRights(peerId: PeerId) {\n const peer: User | Chat = await this.managers.appPeersManager.getPeer(peerId);\n if(peerId.isUser()) {\n return this.chatRightsAction !== 'send_messages' || canSendToUser(peer as User.user);\n } else if(hasRights(peer as Chat.chat, this.chatRightsAction)) {\n return true;\n }\n }\n\n private async getMoreContacts() {\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 {middleware} = this.getTempId('contacts');\n const promise = Promise.all([\n isGlobalSearch ? this.managers.appUsersManager.getContactsPeerIds(this.query) : [],\n this.query ? this.managers.appUsersManager.searchContacts(this.query) : undefined\n ]);\n\n promise.catch(() => {\n if(!middleware()) {\n return;\n }\n\n this.loadedWhat.contacts = true;\n });\n\n const [cachedContacts, searchResult] = await promise;\n if(!middleware()) {\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 = await filterAsync(resultPeerIds, (peerId) => this.filterByRights(peerId));\n if(!middleware()) {\n return;\n }\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 }\n\n // if(this.cachedContacts.length) {\n const pageCount = windowSize.height / 56 * 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.loadedWhat.channelParticipants) {\n return;\n }\n\n const pageCount = 50; // same as in group permissions to use cache\n\n const {middleware} = this.getTempId('channelParticipants');\n const promise = this.managers.appProfileManager.getChannelParticipants(\n this.peerId.toChatId(),\n {\n _: 'channelParticipantsSearch',\n q: this.query\n },\n pageCount,\n this.list.childElementCount\n );\n\n promise.catch(() => {\n if(!middleware()) {\n return;\n }\n\n this.loadedWhat.channelParticipants = true;\n });\n\n const participants = await promise;\n if(!middleware()) {\n return;\n }\n\n const peerIds = participants.participants.map((participant) => {\n return 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 if(this.promise) {\n return this.promise;\n }\n\n const get = () => {\n if((this.peerType.includes('dialogs')/* || this.loadedWhat.contacts */) && !this.loadedWhat.archived) { // to load non-contacts\n return this.getMoreSomething('dialogs');\n }\n\n if((this.peerType.includes('contacts') || this.peerType.includes('dialogs')) && !this.loadedWhat.contacts) {\n return this.getMoreSomething('contacts');\n }\n\n if(this.peerType.includes('channelParticipants') && !this.loadedWhat.channelParticipants) {\n return this.getMoreSomething('channelParticipants');\n }\n };\n\n const loadPromise = get();\n if(!loadPromise) {\n return Promise.resolve();\n }\n\n const promise = this.promise = loadPromise.catch((err) => {\n console.error('get more result error', err);\n }).finally(() => {\n if(this.promise === promise) {\n this.promise = undefined;\n }\n\n this.checkForTriggers();\n });\n\n return promise;\n }\n\n private getMoreSomething(peerType: SelectSearchPeerType) {\n const map: {[type in SelectSearchPeerType]: () => Promise} = {\n dialogs: this.getMoreDialogs,\n contacts: this.getMoreContacts,\n channelParticipants: this.getMoreChannelParticipants\n };\n\n const promise = map[peerType].call(this);\n return promise;\n }\n\n private async renderResults(peerIds: PeerId[]) {\n // console.log('will renderResults:', peerIds);\n\n // ะพัั‚ะฐะฒะธะผ ั‚ะพะปัŒะบะพ ะฝะตะบะพะฝั‚ะฐะบั‚ั‹ ั ะดะธะฐะปะพะณะพะฒ\n if(!this.peerType.includes('dialogs') && this.loadedWhat.contacts) {\n peerIds = await filterAsync(peerIds, (peerId) => {\n return this.managers.appUsersManager.isNonContactUser(peerId);\n });\n }\n\n peerIds.forEach(async(peerId) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: this.scrollable,\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 = await getChatMembersString(peerId.toChatId());\n } else if(peerId === rootScope.myId) {\n subtitleEl = i18n(this.selfPresence);\n } else {\n subtitleEl = getUserStatusString(await this.managers.appUsersManager.getUser(peerId.toUserId()));\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 = new AvatarElement();\n avatarEl.classList.add('selector-user-avatar', 'tgico', 'avatar-32');\n avatarEl.isDialog = true;\n\n div.dataset.key = '' + key;\n if(key.isPeerId()) {\n if(title === undefined) {\n const peerTitle = new PeerTitle();\n peerTitle.update({peerId: key.toPeerId(), dialog: true});\n title = peerTitle.element;\n }\n\n avatarEl.updateWithOptions({\n peerId: key as PeerId\n });\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.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","/*\n * 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 {MyDocument} from '../lib/appManagers/appDocsManager';\nimport ProgressivePreloader from './preloader';\nimport appMediaPlaybackController, {MediaItem, MediaSearchContext} from './appMediaPlaybackController';\nimport {DocumentAttribute, Message} from '../layer';\nimport mediaSizes from '../helpers/mediaSizes';\nimport {IS_SAFARI} from '../environment/userAgent';\nimport rootScope from '../lib/rootScope';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport LazyLoadQueue from './lazyLoadQueue';\nimport deferredPromise, {CancellablePromise} 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 {formatFullSentTime} from '../helpers/date';\nimport throttleWithRaf from '../helpers/schedulers/throttleWithRaf';\nimport {NULL_PEER_ID} from '../lib/mtproto/mtproto_config';\nimport formatBytes from '../helpers/formatBytes';\nimport {animateSingle} from '../helpers/animation';\nimport clamp from '../helpers/number/clamp';\nimport toHHMMSS from '../helpers/string/toHHMMSS';\nimport MediaProgressLine from './mediaProgressLine';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport wrapSenderToPeer from './wrappers/senderToPeer';\nimport wrapSentTime from './wrappers/sentTime';\nimport getMediaFromMessage from '../lib/appManagers/utils/messages/getMediaFromMessage';\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport wrapPhoto from './wrappers/photo';\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 createWaveformBars(waveform: Uint8Array, duration: number) {\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 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-bars');\n svg.setAttributeNS(null, 'width', '' + availW);\n svg.setAttributeNS(null, 'height', '' + barHeightMax);\n svg.setAttributeNS(null, 'viewBox', `0 0 ${availW} ${barHeightMax}`);\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 if(sumI < (barCount + 1) / 2) {\n if(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 const container = document.createElement('div');\n container.classList.add('audio-waveform');\n container.append(svg);\n\n svg.insertAdjacentHTML('beforeend', html);\n return {svg, container, availW};\n}\n\nasync function wrapVoiceMessage(audioEl: AudioElement) {\n audioEl.classList.add('is-voice');\n\n const message = audioEl.message;\n const doc = getMediaFromMessage(message) as MyDocument;\n\n if(message.pFlags.out) {\n audioEl.classList.add('is-out');\n }\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 const {svg, container: svgContainer, availW} = createWaveformBars(waveform, doc.duration);\n\n const fakeSvgContainer = svgContainer.cloneNode(true) as HTMLElement;\n fakeSvgContainer.classList.add('audio-waveform-fake');\n svgContainer.classList.add('audio-waveform-background');\n\n const waveformContainer = document.createElement('div');\n waveformContainer.classList.add('audio-waveform-container');\n waveformContainer.append(svgContainer, fakeSvgContainer);\n\n const timeDiv = document.createElement('div');\n timeDiv.classList.add('audio-time');\n audioEl.append(waveformContainer, timeDiv);\n\n let progress = svg as any as HTMLElement;\n\n const onLoad = () => {\n let audio = audioEl.audio;\n\n const setAnimation = () => {\n animateSingle(() => {\n if(!audio) return false;\n onTimeUpdate();\n return !audio.paused;\n }, audioEl);\n };\n\n const onTimeUpdate = () => {\n fakeSvgContainer.style.width = (audio.currentTime / audio.duration * 100) + '%';\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 audioEl.addAudioListener('play', setAnimation);\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\nasync function wrapAudio(audioEl: AudioElement) {\n const withTime = audioEl.withTime;\n\n const message = audioEl.message;\n const doc = getMediaFromMessage(message) as MyDocument;\n\n const isVoice = doc.type === 'voice' || doc.type === 'round';\n const descriptionEl = document.createElement('div');\n descriptionEl.classList.add('audio-description');\n\n const audioAttribute = doc.attributes.find((attr) => attr._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio;\n\n if(!isVoice) {\n const parts: (Node | string)[] = [];\n if(audioAttribute?.performer) {\n parts.push(wrapEmojiText(audioAttribute.performer));\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(await 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 middleEllipsisEl.dataset.fontSize = audioEl.dataset.fontSize;\n middleEllipsisEl.dataset.sizeType = audioEl.dataset.sizeType;\n (middleEllipsisEl as any).getSize = (audioEl as any).getSize;\n if(isVoice) {\n middleEllipsisEl.append(await wrapSenderToPeer(message));\n } else {\n setInnerHTML(middleEllipsisEl, wrapEmojiText(audioAttribute?.title ?? doc.file_name));\n }\n\n titleEl.append(middleEllipsisEl);\n\n if(audioEl.showSender) {\n titleEl.append(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({\n media: audioEl.audio,\n streamable: doc.supportsStreaming\n });\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, anchorMid: number/* , 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 if((next.length && next[0].mid < anchorMid) || (prev.length && prev[prev.length - 1].mid > anchorMid)) {\n [prev, next] = [next.reverse(), prev.reverse()];\n }\n\n // prev = next = undefined;\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 public managers: AppManagers;\n\n private listenerSetter = new ListenerSetter();\n private onTypeDisconnect: () => void;\n public onLoad: (autoload?: boolean) => void;\n public readyPromise: CancellablePromise;\n\n public async render() {\n this.classList.add('audio');\n this.managers = rootScope.managers;\n\n this.dataset.mid = '' + this.message.mid;\n this.dataset.peerId = '' + this.message.peerId;\n\n const doc = getMediaFromMessage(this.message) as MyDocument;\n const isRealVoice = doc.type === 'voice';\n const isVoice = !this.voiceAsMusic && isRealVoice;\n const isOutgoing = this.message.pFlags.is_outgoing;\n const uploadingFileName = this.message?.uploadingFileName;\n\n const durationStr = toHHMMSS(doc.duration | 0);\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(uploadingFileName) {\n this.classList.add('is-outgoing');\n this.append(downloadDiv);\n }\n\n const onTypeLoad = await (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 = () => toHHMMSS(audio.currentTime | 0) + (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.message.mid/* , 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: HTMLElement[] = [];\n const wrapped = await 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 const autoDownload = doc.type !== 'audio'/* || !this.noAutoDownload */;\n onLoad(autoDownload);\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 = appDownloadManager.downloadMediaURL({media: 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 if(this.classList.contains('corner-download')) {\n toggle.append(downloadDiv);\n } else {\n this.append(downloadDiv);\n }\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(autoDownload) {\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(uploadingFileName) {\n this.preloader = constructDownloadPreloader(false);\n this.preloader.attachPromise(appDownloadManager.getUpload(uploadingFileName));\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 setTimeout(() => {\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 if(this.listenerSetter) {\n this.listenerSetter.removeAll();\n this.listenerSetter = null;\n }\n\n if(this.preloader) {\n this.preloader = null;\n }\n }, 100);\n }\n}\n\ncustomElements.define('audio-element', AudioElement);\n","/*\n * 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 {AppManagers} from '../lib/appManagers/managers';\nimport ListLoader, {ListLoaderOptions} from './listLoader';\n\nexport default class AvatarListLoader extends ListLoader {\n private peerId: PeerId;\n private managers: AppManagers;\n\n constructor(options: Omit, 'loadMore'> & {peerId: PeerId, managers: AppManagers}) {\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;\n return this.managers.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 appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport appImManager from '../lib/appManagers/appImManager';\nimport rootScope from '../lib/rootScope';\nimport AppMediaViewerBase from './appMediaViewerBase';\n\ntype AppMediaViewerAvatarTargetType = {element: HTMLElement, photoId: Photo.photo['id'], photo?: Photo.photo};\nexport default class AppMediaViewerAvatar extends AppMediaViewerBase<'', 'delete', AppMediaViewerAvatarTargetType> {\n public peerId: PeerId;\n\n constructor(peerId: PeerId) {\n super(new AvatarListLoader({peerId, managers: rootScope.managers}), [/* '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 appDownloadManager.downloadToDisc({\n media: this.target.photo,\n queueId: appImManager.chat.bubbles.lazyLoadQueue.queueId\n });\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 = await this.managers.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 this.target.photo = photo;\n\n return ret;\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';\nimport {Message, Photo} from '../layer';\nimport type LazyLoadQueue from './lazyLoadQueue';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport AppMediaViewer from './appMediaViewer';\nimport AppMediaViewerAvatar from './appMediaViewerAvatar';\nimport isObject from '../helpers/object/isObject';\nimport {ArgumentTypes} from '../types';\nimport putPhoto from './putPhoto';\nimport {recordPromise} from '../helpers/recordPromise';\nimport {getMiddleware, MiddlewareHelper} from '../helpers/middleware';\n\nconst onAvatarUpdate = ({peerId, threadId}: {peerId: PeerId, threadId?: number}) => {\n let query = 'avatar-element[data-peer-id=\"' + peerId + '\"]';\n if(threadId) {\n query += '[data-thread-id=\"' + threadId + '\"]';\n }\n\n (Array.from(document.querySelectorAll(query)) as AvatarElement[]).forEach((elem) => {\n // console.log('updating avatar:', elem);\n elem.update();\n });\n};\n\nrootScope.addEventListener('avatar_update', onAvatarUpdate);\nrootScope.addEventListener('peer_title_edit', async(data) => {\n if(!(await rootScope.managers.appAvatarsManager.isAvatarCached(data.peerId))) {\n onAvatarUpdate(data);\n }\n});\n\nexport async function openAvatarViewer(\n target: HTMLElement,\n peerId: PeerId,\n middleware: () => boolean,\n message?: any,\n prevTargets?: {element: HTMLElement, item: Photo.photo['id'] | Message.messageService}[],\n nextTargets?: typeof prevTargets\n) {\n let photo = await rootScope.managers.appProfileManager.getFullPhoto(peerId);\n if(!middleware() || !photo) {\n return;\n }\n\n const getTarget = () => {\n const good = Array.from(target.querySelectorAll('img')).find((img) => !img.classList.contains('emoji'));\n return good ? target : null;\n };\n\n if(peerId.isAnyChat()) {\n const hadMessage = !!message;\n const inputFilter = 'inputMessagesFilterChatPhotos';\n if(!message) {\n message = await rootScope.managers.appMessagesManager.getSearch({\n peerId,\n inputFilter: {_: inputFilter},\n maxId: 0,\n limit: 1\n }).then((value) => {\n // console.log(lol);\n // ! by descend\n return value.history[0];\n });\n\n if(!middleware()) {\n return;\n }\n }\n\n if(message) {\n // ! ะณะตะฝะธะน ะฒ ะดะตะปะต, ะบะพัั‚ั‹ะปะธั€ัƒะตะผ (ะฝะพ ัั‚ะพ ะณะตะฝะธะฐะปัŒะฝะพ)\n const messagePhoto = message.action.photo;\n if(messagePhoto.id !== photo.id) {\n if(!hadMessage) {\n message = rootScope.managers.appMessagesManager.generateFakeAvatarMessage(peerId, photo);\n } else {\n\n }\n }\n\n const f = (arr: typeof prevTargets) => arr.map((el) => ({\n element: el.element,\n mid: (el.item as Message.messageService).mid,\n peerId: (el.item as Message.messageService).peerId\n }));\n\n new AppMediaViewer()\n .setSearchContext({\n peerId,\n inputFilter: {_: inputFilter}\n })\n .openMedia(message, getTarget(), undefined, undefined, prevTargets ? f(prevTargets) : undefined, nextTargets ? f(nextTargets) : undefined);\n\n return;\n }\n }\n\n if(photo) {\n if(!isObject(message) && message) {\n photo = await rootScope.managers.appPhotosManager.getPhoto(message);\n }\n\n const f = (arr: typeof prevTargets) => arr.map((el) => ({\n element: el.element,\n photoId: el.item as string\n }));\n\n new AppMediaViewerAvatar(peerId).openMedia(\n photo.id,\n getTarget(),\n undefined,\n prevTargets ? f(prevTargets) : undefined,\n nextTargets ? f(nextTargets) : undefined\n );\n }\n}\n\nconst believeMe: Map> = new Map();\nconst seen: Set = new Set();\n\nfunction getAvatarQueueKey(peerId: PeerId, threadId?: number) {\n return peerId + (threadId ? '_' + threadId : '');\n}\n\nexport default class AvatarElement extends HTMLElement {\n public peerId: PeerId;\n public isDialog: boolean;\n public peerTitle: string;\n public loadPromises: Promise[];\n public lazyLoadQueue: LazyLoadQueue;\n public isBig: boolean;\n public threadId: number;\n private addedToQueue = false;\n public wrapOptions: WrapSomethingOptions;\n\n public middlewareHelper: MiddlewareHelper;\n\n constructor() {\n super();\n this.classList.add('avatar-like');\n this.middlewareHelper = getMiddleware();\n }\n\n disconnectedCallback() {\n // ะฑั€ะฐัƒะทะตั€ ะฒั‹ะทั‹ะฒะฐะตั‚ ัั‚ะพั‚ ะผะตั‚ะพะด ะฟั€ะธ ัƒะดะฐะปะตะฝะธะธ ัะปะตะผะตะฝั‚ะฐ ะธะท ะดะพะบัƒะผะตะฝั‚ะฐ\n // (ะผะพะถะตั‚ ะฒั‹ะทั‹ะฒะฐั‚ัŒัั ะผะฝะพะณะพ ั€ะฐะท, ะตัะปะธ ัะปะตะผะตะฝั‚ ะผะฝะพะณะพะบั€ะฐั‚ะฝะพ ะดะพะฑะฐะฒะปัะตั‚ัั/ัƒะดะฐะปัะตั‚ัั)\n const key = getAvatarQueueKey(this.peerId, this.threadId);\n const set = believeMe.get(key);\n if(set?.has(this)) {\n set.delete(this);\n if(!set.size) {\n believeMe.delete(key);\n }\n }\n\n this.lazyLoadQueue?.delete({div: this});\n }\n\n public attachClickEvent() {\n let loading = false;\n attachClickEvent(this, async(e) => {\n cancelEvent(e);\n if(loading) return;\n const peerId = this.peerId;\n loading = true;\n await openAvatarViewer(this, this.peerId, () => this.peerId === peerId);\n loading = false;\n });\n }\n\n public updateOptions(options: Partial[0]>) {\n for(const i in options) {\n // @ts-ignore\n this[i] = options[i];\n }\n }\n\n public updateWithOptions(options: {\n peerId: PeerId,\n threadId?: number,\n isDialog?: boolean,\n isBig?: boolean,\n peerTitle?: string,\n lazyLoadQueue?: LazyLoadQueue | false,\n loadPromises?: Promise[],\n wrapOptions?: WrapSomethingOptions\n }) {\n const wasPeerId = this.peerId;\n const wasThreadId = this.threadId;\n this.updateOptions(options);\n const newPeerId = this.peerId;\n const threadId = this.threadId;\n\n if(wasPeerId === newPeerId && wasThreadId === threadId) {\n return;\n }\n\n this.dataset.peerId = '' + newPeerId;\n\n if(threadId) {\n this.dataset.threadId = '' + threadId;\n } else if(wasThreadId) {\n delete this.dataset.threadId;\n }\n\n if(wasPeerId) {\n const key = getAvatarQueueKey(wasPeerId, wasThreadId);\n const set = believeMe.get(key);\n if(set) {\n set.delete(this);\n if(!set.size) {\n believeMe.delete(key);\n }\n }\n }\n\n const middleware = options.wrapOptions?.middleware;\n this.middlewareHelper.destroy();\n if(middleware) {\n this.middlewareHelper = middleware.create();\n } else {\n this.middlewareHelper.destroy();\n }\n\n return this.update();\n }\n\n public remove() {\n this.middlewareHelper.destroy();\n super.remove();\n }\n\n private r(onlyThumb = false) {\n const promise = putPhoto({\n div: this,\n peerId: this.peerId,\n isDialog: this.isDialog,\n title: this.peerTitle,\n onlyThumb,\n isBig: this.isBig,\n threadId: this.threadId,\n wrapOptions: {\n middleware: this.middlewareHelper.get(),\n ...(this.wrapOptions || {})\n }\n });\n // recordPromise(promise, 'avatar putPhoto-' + this.peerId);\n\n if(this.loadPromises) {\n this.loadPromises.push(promise);\n\n promise.finally(() => {\n this.loadPromises = undefined;\n });\n }\n\n return promise;\n }\n\n public update() {\n if(this.lazyLoadQueue) {\n if(!seen.has(this.peerId)) {\n if(this.addedToQueue) return;\n this.addedToQueue = true;\n\n const key = getAvatarQueueKey(this.peerId, this.threadId);\n let set = believeMe.get(key);\n if(!set) {\n believeMe.set(key, set = new Set());\n }\n\n set.add(this);\n\n this.lazyLoadQueue.push({\n div: this,\n load: () => {\n seen.add(this.peerId);\n return this.update();\n }\n });\n\n return this.r(true);\n } else if(this.addedToQueue) {\n this.lazyLoadQueue.delete({div: this});\n }\n }\n\n seen.add(this.peerId);\n\n const promise = this.r();\n\n if(this.addedToQueue) {\n promise.finally(() => {\n this.addedToQueue = false;\n });\n }\n\n const key = getAvatarQueueKey(this.peerId, this.threadId);\n const set = believeMe.get(key);\n if(set) {\n set.delete(this);\n const arr = Array.from(set);\n believeMe.delete(key);\n\n for(let i = 0, length = arr.length; i < length; ++i) {\n arr[i].update();\n }\n }\n\n return promise;\n }\n}\n\ncustomElements.define('avatar-element', AvatarElement);\n","/*\n * 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 {CancellablePromise} from '../helpers/cancellablePromise';\nimport type {InputFile} from '../layer';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport PopupElement from './popups';\nimport PopupAvatar from './popups/avatar';\n\nexport default class AvatarEdit {\n public container: HTMLElement;\n private canvas: HTMLCanvasElement;\n private icon: HTMLSpanElement;\n\n constructor(onChange: (uploadAvatar: () => CancellablePromise) => void, options?: ConstructorParameters[0]) {\n this.container = document.createElement('div');\n this.container.classList.add('avatar-edit');\n\n this.canvas = document.createElement('canvas');\n this.canvas.classList.add('avatar-edit-canvas');\n\n this.icon = document.createElement('span');\n this.icon.classList.add('tgico', 'tgico-cameraadd');\n\n this.container.append(this.canvas, this.icon);\n\n attachClickEvent(this.container, () => {\n PopupElement.createPopup(PopupAvatar, options).open(this.canvas, onChange);\n });\n }\n\n public clear() {\n const ctx = this.canvas.getContext('2d');\n ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\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, LangPackKey} from '../lib/langPack';\nimport ripple from './ripple';\n\nexport type ButtonOptions = Partial<{\n noRipple: true,\n onlyMobile: true,\n icon: string,\n rippleSquare: true,\n text: LangPackKey,\n disabled: boolean,\n asDiv: boolean,\n asLink: boolean\n}>;\n\nexport default function Button(className: string, options: T = {} as T): T['asLink'] extends true ? HTMLAnchorElement : HTMLButtonElement {\n const button = document.createElement(options.asLink ? 'a' : (options.asDiv ? 'div' : 'button'));\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\n\n if(!options.noRipple) {\n if(options.rippleSquare) {\n button.classList.add('rp-square');\n }\n\n ripple(button);\n }\n\n if(options.onlyMobile) {\n button.classList.add('only-handhelds');\n }\n\n if(options.disabled) {\n button.setAttribute('disabled', 'true');\n }\n\n if(options.text) {\n button.append(i18n(options.text));\n }\n\n return button as any;\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 Button from './button';\n\nconst ButtonCorner = (options: Partial<{className: string, icon: string, noRipple: true, onlyMobile: true, asDiv: boolean}> = {}) => {\n const button = Button('btn-circle btn-corner z-depth-1' + (options.className ? ' ' + options.className : ''), options);\n return button;\n};\n\nexport default ButtonCorner;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Button from './button';\n\nconst ButtonIcon = (className?: string, options: Partial<{noRipple: true, onlyMobile: true, asDiv: boolean}> = {}) => {\n const button = Button('btn-icon', {\n icon: className || undefined,\n ...options\n });\n\n return button;\n};\n\nexport default ButtonIcon;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport flatten from '../helpers/array/flatten';\nimport contextMenuController from '../helpers/contextMenuController';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {AttachClickOptions, attachClickEvent} from '../helpers/dom/clickEvent';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {FormatterArguments, i18n, LangPackKey} from '../lib/langPack';\nimport CheckboxField from './checkboxField';\nimport {Document} from '../layer';\nimport wrapPhoto from './wrappers/photo';\nimport textToSvgURL from '../helpers/textToSvgURL';\nimport customProperties from '../helpers/dom/customProperties';\nimport {IS_MOBILE} from '../environment/userAgent';\nimport ripple from './ripple';\n\nexport type ButtonMenuItemOptions = {\n icon?: string,\n iconDoc?: Document.document,\n text?: LangPackKey,\n textArgs?: FormatterArguments,\n regularText?: Parameters[1],\n onClick: (e: MouseEvent | TouchEvent) => any,\n checkForClose?: () => boolean,\n element?: HTMLElement,\n textElement?: HTMLElement,\n options?: AttachClickOptions,\n checkboxField?: CheckboxField,\n noCheckboxClickListener?: boolean,\n keepOpen?: boolean,\n separator?: boolean | HTMLElement,\n multiline?: boolean,\n loadPromise?: Promise,\n waitForAnimation?: boolean\n /* , cancelEvent?: true */\n};\n\nexport type ButtonMenuItemOptionsVerifiable = ButtonMenuItemOptions & {\n verify?: () => boolean | Promise\n};\n\nfunction ButtonMenuItem(options: ButtonMenuItemOptions) {\n if(options.element) return [options.separator as HTMLElement, options.element].filter(Boolean);\n\n const {icon, iconDoc, text, onClick, checkboxField, noCheckboxClickListener} = options;\n const el = document.createElement('div');\n el.className = 'btn-menu-item rp-overflow' + (icon ? ' tgico-' + icon : '');\n\n if(IS_MOBILE) {\n ripple(el);\n }\n\n let textElement = options.textElement;\n if(!textElement) {\n textElement = options.textElement = text ? i18n(text, options.textArgs) : document.createElement('span');\n if(options.regularText) {\n setInnerHTML(textElement, options.regularText);\n }\n }\n\n if(iconDoc) {\n const iconElement = document.createElement('span');\n iconElement.classList.add('btn-menu-item-icon');\n el.append(iconElement);\n\n options.loadPromise = wrapPhoto({\n container: iconElement,\n photo: iconDoc,\n boxWidth: 24,\n boxHeight: 24,\n withoutPreloader: true,\n noFadeIn: true,\n noBlur: true,\n processUrl: (url) => {\n return fetch(url)\n .then((response) => response.text())\n .then((text) => {\n const color = customProperties.getProperty('primary-text-color');\n const doc = new DOMParser().parseFromString(text, 'image/svg+xml');\n const svg = doc.firstElementChild as HTMLElement;\n svg.querySelectorAll('path').forEach((path) => {\n path.setAttributeNS(null, 'fill', color);\n path.style.stroke = color;\n path.style.strokeWidth = '.25px';\n });\n return textToSvgURL(svg.outerHTML);\n });\n }\n }).then((ret) => ret.loadPromises.thumb);\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 onClick && attachClickEvent(el, /* CLICK_EVENT_NAME !== 'click' || keepOpen ? */ /* async */(e) => {\n cancelEvent(e);\n\n const menu = findUpClassName(e.target, 'btn-menu');\n if(menu && !menu.classList.contains('active')) {\n return;\n }\n\n // let closed = false;\n // if(!keepOpen && !options.checkForClose) {\n // closed = true;\n // contextMenuController.close();\n // }\n\n // wait for closing animation\n // if(options.waitForAnimation && rootScope.settings.animationsEnabled && !options.checkForClose) {\n // await pause(125);\n // }\n\n onClick(e);\n if(options.checkForClose?.() === false) {\n return;\n }\n\n if(!keepOpen/* && !closed */) {\n contextMenuController.close();\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 if(options.separator === true) {\n options.separator = document.createElement('hr');\n }\n\n if(options.multiline) {\n el.classList.add('is-multiline');\n }\n\n return [options.separator as HTMLElement, options.element = el].filter(Boolean);\n}\n\nexport function ButtonMenuSync({listenerSetter, buttons}: {\n buttons: ButtonMenuItemOptions[],\n listenerSetter?: ListenerSetter\n}) {\n const el: HTMLElement = 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 el.append(...flatten(items));\n\n return el;\n}\n\nexport default async function ButtonMenu(options: Parameters[0]) {\n const el = ButtonMenuSync(options);\n await Promise.all(options.buttons.map(({loadPromise}) => loadPromise));\n return el;\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 contextMenuController from '../helpers/contextMenuController';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {AttachClickOptions, CLICK_EVENT_NAME} from '../helpers/dom/clickEvent';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport ButtonIcon from './buttonIcon';\nimport ButtonMenu, {ButtonMenuItemOptionsVerifiable} from './buttonMenu';\nimport filterAsync from '../helpers/array/filterAsync';\nimport {doubleRaf} from '../helpers/schedulers';\n\n// TODO: refactor for attachClickEvent, because if move finger after touchstart, it will start anyway\nexport function ButtonMenuToggleHandler({\n el,\n onOpen,\n options,\n onClose\n}: {\n el: HTMLElement,\n onOpen?: (e: Event) => any,\n options?: AttachClickOptions,\n onClose?: () => void\n}) {\n const add = options?.listenerSetter ? options.listenerSetter.add(el) : el.addEventListener.bind(el);\n\n add(CLICK_EVENT_NAME, (e: Event) => {\n if(!el.classList.contains('btn-menu-toggle')) return false;\n\n cancelEvent(e);\n\n if(el.classList.contains('menu-open')) {\n contextMenuController.close();\n } else {\n const result = onOpen?.(e);\n const open = () => {\n const openedMenu = el.querySelector('.btn-menu') as HTMLDivElement;\n contextMenuController.openBtnMenu(openedMenu, onClose);\n };\n\n if(result instanceof Promise) {\n result.then(open);\n } else {\n open();\n }\n }\n });\n}\n\nexport default function ButtonMenuToggle({\n buttonOptions,\n listenerSetter: attachListenerSetter,\n container,\n direction,\n buttons,\n onOpenBefore,\n onOpen,\n onClose,\n onCloseAfter\n}: {\n buttonOptions?: Parameters[1],\n listenerSetter?: ListenerSetter,\n container?: HTMLElement\n direction: 'bottom-left' | 'bottom-right' | 'top-left' | 'top-right',\n buttons: ButtonMenuItemOptionsVerifiable[],\n onOpenBefore?: (e: Event) => any,\n onOpen?: (e: Event, element: HTMLElement) => any,\n onClose?: () => void,\n onCloseAfter?: () => void\n}) {\n if(buttonOptions) {\n buttonOptions.asDiv = true;\n }\n\n const button = container ?? ButtonIcon('more', buttonOptions);\n button.classList.add('btn-menu-toggle');\n\n const listenerSetter = new ListenerSetter();\n\n let element: HTMLElement, closeTimeout: number;\n ButtonMenuToggleHandler({\n el: button,\n onOpen: async(e) => {\n await onOpenBefore?.(e);\n if(closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n return;\n }\n\n const f = (b: (typeof buttons[0])[]) => filterAsync(b, (button) => button?.verify?.() ?? true);\n\n const filteredButtons = await f(buttons);\n if(!filteredButtons.length) {\n return;\n }\n\n const _element = element = await ButtonMenu({\n buttons: filteredButtons,\n listenerSetter\n });\n _element.classList.add(direction);\n\n await onOpen?.(e, _element);\n\n button.append(_element);\n await doubleRaf();\n },\n options: {\n listenerSetter: attachListenerSetter\n },\n onClose: () => {\n onClose?.();\n\n closeTimeout = window.setTimeout(() => {\n onCloseAfter?.();\n closeTimeout = undefined;\n listenerSetter.removeAll();\n buttons.forEach((button) => button.element = undefined);\n element.remove();\n }, 300);\n }\n });\n\n return button;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko, Artem Kolnogorov and unknown creator of the script taken from http://useless.altervista.org/gradient.html\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {animateSingle} from '../../helpers/animation';\nimport {hexToRgb} from '../../helpers/color';\nimport {easeOutQuadApply} from '../../helpers/easing/easeOutQuad';\n\nconst WIDTH = 50;\nconst HEIGHT = WIDTH;\n\nexport default class ChatBackgroundGradientRenderer {\n private readonly _width = WIDTH;\n private readonly _height = HEIGHT;\n private _phase: number;\n private _tail: number;\n private readonly _tails = 90;\n private readonly _scrollTails = 50;\n private _frames: ImageData[];\n private _colors: {r: number, g: number, b: number}[];\n private readonly _curve = [\n 0, 0.25, 0.50, 0.75, 1, 1.5, 2, 2.5, 3, 3.5, 4, 5, 6, 7, 8, 9, 10, 11, 12,\n 13, 14, 15, 16, 17, 18, 18.3, 18.6, 18.9, 19.2, 19.5, 19.8, 20.1, 20.4, 20.7,\n 21.0, 21.3, 21.6, 21.9, 22.2, 22.5, 22.8, 23.1, 23.4, 23.7, 24.0, 24.3, 24.6,\n 24.9, 25.2, 25.5, 25.8, 26.1, 26.3, 26.4, 26.5, 26.6, 26.7, 26.8, 26.9, 27\n ];\n private readonly _incrementalCurve: number[];\n private readonly _positions = [\n {x: 0.80, y: 0.10},\n {x: 0.60, y: 0.20},\n {x: 0.35, y: 0.25},\n {x: 0.25, y: 0.60},\n {x: 0.20, y: 0.90},\n {x: 0.40, y: 0.80},\n {x: 0.65, y: 0.75},\n {x: 0.75, y: 0.40}\n ];\n private readonly _phases = this._positions.length;\n private _onWheelRAF: number;\n private _scrollDelta: number;\n\n // private _ts = 0;\n // private _fps = 15;\n // private _frametime = 1000 / this._fps;\n // private _raf: number;\n\n private _canvas: HTMLCanvasElement;\n private _ctx: CanvasRenderingContext2D;\n private _hc: HTMLCanvasElement;\n private _hctx: CanvasRenderingContext2D;\n\n private _addedScrollListener: boolean;\n private _animatingToNextPosition: boolean;\n private _nextPositionTail: number;\n private _nextPositionTails: number;\n private _nextPositionLeft: number;\n\n constructor() {\n const diff = this._tails / this._curve[this._curve.length - 1];\n\n for(let i = 0, length = this._curve.length; i < length; ++i) {\n this._curve[i] = this._curve[i] * diff;\n }\n\n this._incrementalCurve = this._curve.map((v, i, arr) => {\n return v - (arr[i - 1] ?? 0);\n });\n }\n\n private hexToRgb(hex: string) {\n const result = hexToRgb(hex);\n return {r: result[0], g: result[1], b: result[2]};\n }\n\n private getPositions(shift: number) {\n const positions = this._positions.slice();\n positions.push(...positions.splice(0, shift));\n\n const result: typeof positions = [];\n for(let i = 0; i < positions.length; i += 2) {\n result.push(positions[i]);\n }\n return result;\n }\n\n private getNextPositions(phase: number, curveMax: number, curve: number[]) {\n const pos = this.getPositions(phase);\n if(!curve[0] && curve.length === 1) {\n return [pos];\n }\n\n const nextPos = this.getPositions(++phase % this._phases);\n const distances = nextPos.map((nextPos, idx) => {\n return {\n x: (nextPos.x - pos[idx].x) / curveMax,\n y: (nextPos.y - pos[idx].y) / curveMax\n };\n });\n\n const positions = curve.map((value) => {\n return distances.map((distance, idx) => {\n return {\n x: pos[idx].x + distance.x * value,\n y: pos[idx].y + distance.y * value\n };\n });\n });\n\n return positions;\n }\n\n private curPosition(phase: number, tail: number) {\n const positions = this.getNextPositions(phase, this._tails, [tail]);\n return positions[0];\n }\n\n private changeTail(diff: number) {\n this._tail += diff;\n\n while(this._tail >= this._tails) {\n this._tail -= this._tails;\n if(++this._phase >= this._phases) {\n this._phase -= this._phases;\n }\n }\n\n while(this._tail < 0) {\n this._tail += this._tails;\n if(--this._phase < 0) {\n this._phase += this._phases;\n }\n }\n }\n\n private onWheel = (e: {deltaY: number}) => {\n if(this._animatingToNextPosition) {\n return;\n }\n\n this._scrollDelta += e.deltaY;\n if(this._onWheelRAF === undefined) {\n this._onWheelRAF = requestAnimationFrame(this.drawOnWheel);\n }\n };\n\n private changeTailAndDraw(diff: number) {\n this.changeTail(diff);\n const curPos = this.curPosition(this._phase, this._tail);\n this.drawGradient(curPos);\n }\n\n private drawOnWheel = () => {\n const value = this._scrollDelta / this._scrollTails;\n this._scrollDelta %= this._scrollTails;\n const diff = value > 0 ? Math.floor(value) : Math.ceil(value);\n if(diff) {\n this.changeTailAndDraw(diff);\n }\n this._onWheelRAF = undefined;\n };\n\n private drawNextPositionAnimated = (getProgress?: () => number) => {\n let done: boolean, id: ImageData;\n if(getProgress) {\n const value = getProgress();\n done = value >= 1;\n const transitionValue = easeOutQuadApply(value, 1);\n const nextPositionTail = this._nextPositionTail ?? 0;\n const tail = this._nextPositionTail = this._nextPositionTails * transitionValue;\n const diff = tail - nextPositionTail;\n if(diff) {\n this._nextPositionLeft -= diff;\n this.changeTailAndDraw(diff);\n }\n } else {\n const frames = this._frames;\n id = frames.shift();\n done = !frames.length;\n }\n\n if(id) {\n this.drawImageData(id);\n }\n\n if(done) {\n this._nextPositionLeft = undefined;\n this._nextPositionTails = undefined;\n this._nextPositionTail = undefined;\n this._animatingToNextPosition = undefined;\n }\n\n return !done;\n };\n\n private getGradientImageData(positions: {x: number, y: number}[]) {\n const id = this._hctx.createImageData(this._width, this._height);\n const pixels = id.data;\n\n let offset = 0;\n for(let y = 0; y < this._height; ++y) {\n const directPixelY = y / this._height;\n const centerDistanceY = directPixelY - 0.5;\n const centerDistanceY2 = centerDistanceY * centerDistanceY;\n\n for(let x = 0; x < this._width; ++x) {\n const directPixelX = x / this._width;\n\n const centerDistanceX = directPixelX - 0.5;\n const centerDistance = Math.sqrt(centerDistanceX * centerDistanceX + centerDistanceY2);\n\n const swirlFactor = 0.35 * centerDistance;\n const theta = swirlFactor * swirlFactor * 0.8 * 8.0;\n const sinTheta = Math.sin(theta);\n const cosTheta = Math.cos(theta);\n\n const pixelX = Math.max(0.0, Math.min(1.0, 0.5 + centerDistanceX * cosTheta - centerDistanceY * sinTheta));\n const pixelY = Math.max(0.0, Math.min(1.0, 0.5 + centerDistanceX * sinTheta + centerDistanceY * cosTheta));\n\n let distanceSum = 0.0;\n\n let r = 0.0;\n let g = 0.0;\n let b = 0.0;\n\n for(let i = 0; i < this._colors.length; i++) {\n const colorX = positions[i].x;\n const colorY = positions[i].y;\n\n const distanceX = pixelX - colorX;\n const distanceY = pixelY - colorY;\n\n let distance = Math.max(0.0, 0.9 - Math.sqrt(distanceX * distanceX + distanceY * distanceY));\n distance = distance * distance * distance * distance;\n distanceSum += distance;\n\n r += distance * this._colors[i].r / 255;\n g += distance * this._colors[i].g / 255;\n b += distance * this._colors[i].b / 255;\n }\n\n pixels[offset++] = r / distanceSum * 255.0;\n pixels[offset++] = g / distanceSum * 255.0;\n pixels[offset++] = b / distanceSum * 255.0;\n pixels[offset++] = 0xFF;\n }\n }\n return id;\n }\n\n private drawImageData(id: ImageData) {\n this._hctx.putImageData(id, 0, 0);\n this._ctx.drawImage(this._hc, 0, 0, this._width, this._height);\n }\n\n private drawGradient(positions: {x: number, y: number}[]) {\n this.drawImageData(this.getGradientImageData(positions));\n }\n\n // private doAnimate = () => {\n // const now = +Date.now();\n // if(!document.hasFocus() || (now - this._ts) < this._frametime) {\n // this._raf = requestAnimationFrame(this.doAnimate);\n // return;\n // }\n\n // this._ts = now;\n // this.changeTail(1);\n // const cur_pos = this.curPosition(this._phase, this._tail);\n // this.drawGradient(cur_pos);\n // this._raf = requestAnimationFrame(this.doAnimate);\n // };\n\n // public animate(start?: boolean) {\n // if(!start) {\n // cancelAnimationFrame(this._raf);\n // return;\n // }\n // this.doAnimate();\n // }\n\n public init(el: HTMLCanvasElement) {\n this._frames = [];\n this._phase = 0;\n this._tail = 0;\n this._scrollDelta = 0;\n if(this._onWheelRAF !== undefined) {\n cancelAnimationFrame(this._onWheelRAF);\n this._onWheelRAF = undefined;\n }\n\n const colors = el.getAttribute('data-colors').split(',').reverse();\n this._colors = colors.map((color) => {\n return this.hexToRgb(color);\n });\n\n if(!this._hc) {\n this._hc = document.createElement('canvas');\n this._hc.width = this._width;\n this._hc.height = this._height;\n this._hctx = this._hc.getContext('2d', {alpha: false});\n }\n\n this._canvas = el;\n this._ctx = this._canvas.getContext('2d', {alpha: false});\n this.update();\n }\n\n public update() {\n if(this._colors.length < 2) {\n const color = this._colors[0];\n this._ctx.fillStyle = `rgb(${color.r}, ${color.g}, ${color.b})`;\n this._ctx.fillRect(0, 0, this._width, this._height);\n return;\n }\n\n const pos = this.curPosition(this._phase, this._tail);\n this.drawGradient(pos);\n }\n\n public toNextPosition(getProgress?: () => number) {\n if(this._colors.length < 2) {\n return;\n }\n\n if(getProgress) {\n this._nextPositionLeft = this._tails + (this._nextPositionLeft ?? 0);\n this._nextPositionTails = this._nextPositionLeft;\n this._nextPositionTail = undefined;\n this._animatingToNextPosition = true;\n animateSingle(this.drawNextPositionAnimated.bind(this, getProgress), this);\n return;\n }\n\n const tail = this._tail;\n const tails = this._tails;\n\n let nextPhaseOnIdx: number;\n\n const curve: number[] = [];\n for(let i = 0, length = this._incrementalCurve.length; i < length; ++i) {\n const inc = this._incrementalCurve[i];\n let value = (curve[i - 1] ?? tail) + inc;\n\n if(+value.toFixed(2) > tails && nextPhaseOnIdx === undefined) {\n nextPhaseOnIdx = i;\n value %= tails;\n }\n\n curve.push(value);\n }\n\n const currentPhaseCurve = curve.slice(0, nextPhaseOnIdx);\n const nextPhaseCurve = nextPhaseOnIdx !== undefined ? curve.slice(nextPhaseOnIdx) : [];\n\n [currentPhaseCurve, nextPhaseCurve].forEach((curve, idx, curves) => {\n const last = curve[curve.length - 1];\n if(last !== undefined && last > tails) {\n curve[curve.length - 1] = +last.toFixed(2);\n }\n\n this._tail = last ?? 0;\n\n if(!curve.length) {\n return;\n }\n\n const positions = this.getNextPositions(this._phase, tails, curve);\n if(idx !== (curves.length - 1)) {\n if(++this._phase >= this._phases) {\n this._phase -= this._phases;\n }\n }\n\n const ids = positions.map((pos) => {\n return this.getGradientImageData(pos);\n });\n\n this._frames.push(...ids);\n });\n\n this._animatingToNextPosition = true;\n animateSingle(this.drawNextPositionAnimated, this);\n }\n\n // public toNextPositionThrottled = throttle(this.toNextPosition.bind(this), 100, true);\n\n public scrollAnimate(start?: boolean) {\n return;\n\n if(this._colors.length < 2 && start) {\n return;\n }\n\n if(start && !this._addedScrollListener) {\n document.addEventListener('wheel', this.onWheel);\n this._addedScrollListener = true;\n } else if(!start && this._addedScrollListener) {\n document.removeEventListener('wheel', this.onWheel);\n this._addedScrollListener = false;\n }\n }\n\n public cleanup() {\n this.scrollAnimate(false);\n // this.animate(false);\n }\n\n public static createCanvas(colors?: string) {\n const canvas = document.createElement('canvas');\n canvas.width = WIDTH;\n canvas.height = HEIGHT;\n if(colors !== undefined) {\n canvas.dataset.colors = colors;\n }\n\n return canvas;\n }\n\n public static create(colors?: string) {\n const canvas = this.createCanvas(colors);\n const gradientRenderer = new ChatBackgroundGradientRenderer();\n gradientRenderer.init(canvas);\n\n return {gradientRenderer, canvas};\n }\n}\n","export default function easeOutQuad(t: number, b: number, c: number, d: number) {\n return t >= d ? b + c : easeOutQuadApply(t / d, c) + b;\n}\n\nexport function easeOutQuadApply(v: number, c: number) {\n return -c * v * (v - 2);\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 {AppMessagesManager, MessagesStorageKey} 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 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 replaceContent from '../../helpers/dom/replaceContent';\nimport AppSearchSuper from '../appSearchSuper.';\nimport isInDOM from '../../helpers/dom/isInDOM';\nimport {randomLong} from '../../helpers/random';\nimport {attachClickEvent, AttachClickOptions} from '../../helpers/dom/clickEvent';\nimport findUpAsChild from '../../helpers/dom/findUpAsChild';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {attachContextMenuListener} from '../../helpers/dom/attachContextMenuListener';\nimport filterUnique from '../../helpers/array/filterUnique';\nimport appImManager from '../../lib/appManagers/appImManager';\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 extends EventListenerBase<{\n toggle: (isSelecting: boolean) => void\n}> {\n public selectedMids: Map> = new Map();\n public isSelecting = false;\n\n public selectedText: string;\n\n protected listenerSetter: ListenerSetter;\n protected isScheduled: boolean;\n protected listenElement: HTMLElement;\n\n protected onToggleSelection: (forwards: boolean, animate: boolean) => void | Promise;\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 protected managers: AppManagers;\n\n constructor(options: {\n managers: AppManagers,\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 super(false);\n\n safeAssign(this, options);\n\n this.navigationType = 'multiselect-' + randomLong() as any;\n }\n\n public attachListeners(listenElement: HTMLElement, listenerSetter: ListenerSetter) {\n if(this.listenElement) {\n this.listenerSetter.removeAll();\n }\n\n this.listenElement = listenElement;\n this.listenerSetter = listenerSetter;\n\n if(!listenElement) {\n return;\n }\n\n if(IS_TOUCH_SUPPORTED) {\n listenerSetter.add(listenElement)('touchend', () => {\n if(!this.isSelecting) return;\n this.selectedText = getSelectedText();\n });\n\n attachContextMenuListener({\n element: listenElement,\n callback: (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 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 },\n listenerSetter\n });\n\n return;\n }\n\n listenerSetter.add(listenElement)('mousedown', this.onMouseDown);\n }\n\n private onMouseDown = (e: MouseEvent) => {\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 return;\n }\n\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 = this.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 // 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 private 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 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 SetTransition({\n element,\n className: 'is-selected',\n forwards: false,\n duration: 200\n });\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 async updateContainer(forceSelection = false) {\n const size = this.selectedMids.size;\n if(!size && !forceSelection) return;\n\n let cantForward = !size,\n cantDelete = !size;\n const cantSend = !size;\n for(const [peerId, mids] of this.selectedMids) {\n const storageKey: MessagesStorageKey = `${peerId}_${this.isScheduled ? 'scheduled' : 'history'}`;\n const r = await this.managers.appMessagesManager.cantForwardDeleteMids(storageKey, Array.from(mids));\n cantForward = r.cantForward;\n cantDelete = r.cantDelete;\n\n if(cantForward && cantDelete) break;\n }\n\n 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 this.dispatchEvent('toggle', this.isSelecting);\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 const toggleResult = 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 (toggleResult || Promise.resolve()).then(() => this.updateContainer(forceSelection));\n }\n\n return true;\n }\n\n public cancelSelection = async(doNotAnimate?: boolean) => {\n if(doNotAnimate) this.doNotAnimate = true;\n this.onCancelSelection && await 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({\n element,\n className: 'is-selected',\n forwards: isSelected,\n duration: 200\n });\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, managers: AppManagers, listenerSetter: ListenerSetter) {\n super({\n managers,\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 this.attachListeners(searchSuper.container, listenerSetter);\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({\n element: this.searchSuper.navScrollableContainer,\n className: 'is-selecting',\n forwards,\n duration: animate ? 200 : 0,\n onTransitionEnd: () => {\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\n SetTransition({\n element: this.searchSuper.container,\n className: 'is-selecting',\n forwards,\n duration: 200\n });\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 attachClickEvent(btnCancel, () => this.cancelSelection(), {listenerSetter: this.listenerSetter, 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 appImManager.setInnerPeer({peerId, lastMsgId: mid});\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 private selectionLeft: HTMLDivElement;\n private selectionRight: HTMLDivElement;\n\n constructor(\n private chat: Chat,\n private bubbles: ChatBubbles,\n private input: ChatInput,\n managers: AppManagers\n ) {\n super({\n managers,\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 if(this.bubbles.skippedMids.has(+mid)) {\n continue;\n }\n\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): Promise => {\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.chat.peerId);\n if(set) {\n // const mids = await this.chat.getMidsByMid(mid);\n const mids = this.getMidsFromGroupContainer(bubble);\n mids.forEach((mid) => set.delete(mid));\n }\n }\n\n /* const promises = */this.bubbles.getBubbleGroupedItems(bubble).map(this.toggleByElement);\n // await Promise.all(promises);\n return;\n }\n\n if(!this.toggleMid(this.chat.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(groupContainer);\n\n const willChange = isGroupedMidsSelected || isGroupedSelected;\n if(willChange) {\n this.updateElementSelection(groupContainer, isGroupedMidsSelected);\n }\n }\n\n this.updateElementSelection(bubble, this.isMidSelected(this.chat.peerId, mid));\n };\n\n protected toggleByMid = async(peerId: PeerId, mid: number) => {\n const mounted = await 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));\n }\n\n protected isGroupedBubbleSelected(bubble: HTMLElement) {\n const groupedCheckboxInput = this.getCheckboxInputFromElement(bubble);\n return groupedCheckboxInput?.checked;\n }\n\n protected getMidsFromGroupContainer(groupContainer: HTMLElement) {\n const elements = this.chat.bubbles.getBubbleGroupedItems(groupContainer);\n if(!elements.length) {\n elements.push(groupContainer);\n }\n\n return elements.map((element) => +element.dataset.mid);\n }\n\n protected isGroupedMidsSelected(groupContainer: HTMLElement) {\n const mids = this.getMidsFromGroupContainer(groupContainer);\n const selectedMids = mids.filter((mid) => this.isMidSelected(this.chat.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-outgoing') &&\n !bubble.classList.contains('is-error') &&\n !bubble.classList.contains('bubble-first') &&\n !bubble.classList.contains('avoid-selection');\n }\n\n protected onToggleSelection = async(forwards: boolean, animate: boolean) => {\n const {needTranslateX, widthFrom, widthTo} = await this.chat.input.center(animate);\n\n SetTransition({\n element: this.listenElement,\n className: 'is-selecting',\n forwards,\n duration: animate ? 200 : 0,\n onTransitionEnd: () => {\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\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.chat.peerId, [...this.selectedMids.get(this.chat.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.chat.peerId, [...this.selectedMids.get(this.chat.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 && this.selectionDeleteBtn.toggleAttribute('disabled', cantDelete);\n };\n\n protected onCancelSelection = async() => {\n return;\n const promises: Promise[] = [];\n for(const [peerId, mids] of this.selectedMids) {\n for(const mid of mids) {\n promises.push(this.bubbles.getMountedBubble(mid).then((m) => m?.bubble));\n }\n }\n\n const bubbles = filterUnique((await Promise.all(promises)).filter(Boolean));\n bubbles.forEach((bubble) => {\n this.toggleByElement(bubble);\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 getSelectedText(): string {\n if(window.getSelection) {\n return window.getSelection().toString();\n // @ts-ignore\n } else if(document.selection) {\n // @ts-ignore\n return document.selection.createRange().text;\n }\n\n return '';\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 ListenerSetter from '../helpers/listenerSetter';\nimport ripple from './ripple';\nimport {LangPackKey, _i18n} from '../lib/langPack';\nimport getDeepProperty from '../helpers/object/getDeepProperty';\nimport rootScope from '../lib/rootScope';\nimport apiManagerProxy from '../lib/mtproto/mtprotoworker';\n\nexport type CheckboxFieldOptions = {\n text?: LangPackKey,\n textArgs?: any[],\n name?: string,\n round?: boolean,\n toggle?: boolean,\n stateKey?: string,\n stateValues?: any[],\n disabled?: boolean,\n checked?: boolean,\n restriction?: boolean,\n withRipple?: boolean,\n withHover?: boolean,\n listenerSetter?: ListenerSetter\n};\nexport default class CheckboxField {\n public input: HTMLInputElement;\n public label: HTMLLabelElement;\n public span: HTMLSpanElement;\n public listenerSetter: ListenerSetter;\n\n constructor(options: CheckboxFieldOptions = {}) {\n const label = this.label = document.createElement('label');\n label.classList.add('checkbox-field');\n\n if(options.restriction) {\n label.classList.add('checkbox-field-restriction');\n }\n\n if(options.round) {\n label.classList.add('checkbox-field-round');\n }\n\n if(options.disabled) {\n this.toggleDisability(true);\n }\n\n this.listenerSetter = options.listenerSetter;\n\n const input = this.input = document.createElement('input');\n input.classList.add('checkbox-field-input');\n input.type = 'checkbox';\n if(options.name) {\n input.id = 'input-' + options.name;\n }\n\n if(options.checked) {\n input.checked = true;\n }\n\n if(options.stateKey) {\n let loaded = false;\n const onChange = () => {\n if(!loaded) {\n return;\n }\n\n let value: any;\n if(options.stateValues) {\n value = options.stateValues[input.checked ? 1 : 0];\n } else {\n value = input.checked;\n }\n\n rootScope.managers.appStateManager.setByKey(options.stateKey, value);\n };\n\n apiManagerProxy.getState().then((state) => {\n loaded = true;\n const stateValue = getDeepProperty(state, options.stateKey);\n let checked: boolean;\n if(options.stateValues) {\n checked = options.stateValues.indexOf(stateValue) === 1;\n } else {\n checked = stateValue;\n }\n\n this.setValueSilently(checked);\n });\n\n if(options.listenerSetter) options.listenerSetter.add(input)('change', onChange);\n else input.addEventListener('change', onChange);\n }\n\n let span: HTMLSpanElement;\n if(options.text) {\n span = this.span = document.createElement('span');\n span.classList.add('checkbox-caption');\n _i18n(span, options.text, options.textArgs);\n } else {\n label.classList.add('checkbox-without-caption');\n }\n\n label.append(input);\n\n if(options.toggle) {\n label.classList.add('checkbox-field-toggle');\n\n const toggle = document.createElement('div');\n toggle.classList.add('checkbox-toggle');\n label.append(toggle);\n } else {\n const box = document.createElement('div');\n box.classList.add('checkbox-box');\n\n const checkSvg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n checkSvg.classList.add('checkbox-box-check');\n checkSvg.setAttributeNS(null, 'viewBox', '0 0 24 24');\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use.setAttributeNS(null, 'href', '#check');\n use.setAttributeNS(null, 'x', '-1');\n checkSvg.append(use);\n\n const bg = document.createElement('div');\n bg.classList.add('checkbox-box-background');\n\n const border = document.createElement('div');\n border.classList.add('checkbox-box-border');\n\n box.append(border, bg, checkSvg);\n\n label.append(box);\n }\n\n if(span) {\n label.append(span);\n }\n\n if(options.withRipple) {\n label.classList.add('checkbox-ripple', 'hover-effect');\n ripple(label, undefined, undefined, true);\n // label.prepend(input);\n } else if(options.withHover) {\n label.classList.add('hover-effect');\n }\n }\n\n get checked() {\n return this.input.checked;\n }\n\n set checked(checked: boolean) {\n /* if(this.checked === checked) {\n return;\n } */\n\n this.setValueSilently(checked);\n\n const event = new Event('change', {bubbles: true, cancelable: true});\n this.input.dispatchEvent(event);\n }\n\n public setValueSilently(checked: boolean) {\n this.input.checked = checked;\n }\n\n public toggleDisability(disable: boolean) {\n this.label.classList.toggle('checkbox-disabled', disable);\n return () => this.toggleDisability(!disable);\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 InputField, {InputFieldOptions} from './inputField';\n\nexport default class CodeInputField extends InputField {\n constructor(public options: InputFieldOptions & {\n length: number,\n onFill: (code: string) => void\n }) {\n super(Object.assign(options, {\n plainText: true\n }));\n\n const input = this.input as HTMLInputElement;\n input.type = 'tel';\n input.setAttribute('required', '');\n input.autocomplete = 'off';\n\n let lastLength = 0;\n this.input.addEventListener('input', (e) => {\n this.input.classList.remove('error');\n this.setLabel();\n\n const value = this.value.replace(/\\D/g, '').slice(0, options.length);\n this.setValueSilently(value);\n\n const length = this.value.length;\n if(length === options.length) { // submit code\n options.onFill(this.value);\n } else if(length === lastLength) {\n return;\n }\n\n lastLength = length;\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 {addCancelButton} from './popups';\nimport PopupPeer, {PopupPeerCheckboxOptions, PopupPeerOptions} from './popups/peer';\n\n// type PopupConfirmationOptions = Pick;\nexport type PopupConfirmationOptions = PopupPeerOptions & {\n button: PopupPeerOptions['buttons'][0],\n checkbox?: PopupPeerOptions['checkboxes'][0]\n};\n\nexport default function confirmationPopup(\n options: T\n): Promise : (T['checkbox'] extends PopupPeerCheckboxOptions ? boolean : void)> {\n return new Promise((resolve, reject) => {\n const {button, checkbox} = options;\n button.callback = (set) => {\n if(checkbox || !set) {\n resolve(set ? !!set.size : undefined);\n } else {\n resolve(options.checkboxes.map((checkbox) => set.has(checkbox.text)));\n }\n };\n\n const buttons = addCancelButton(options.buttons || [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","/*\n * 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_EMOJI_SUPPORTED from '../environment/emojiSupport';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport findUpTag from '../helpers/dom/findUpTag';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport fastSmoothScroll from '../helpers/fastSmoothScroll';\nimport {randomLong} from '../helpers/random';\nimport {HelpCountry, HelpCountryCode} from '../layer';\nimport I18n, {i18n} from '../lib/langPack';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport rootScope from '../lib/rootScope';\nimport {getCountryEmoji} from '../vendor/emoji';\nimport InputField, {InputFieldOptions} from './inputField';\nimport Scrollable from './scrollable';\n\nlet countries: HelpCountry.helpCountry[];\nconst setCountries = () => {\n countries = I18n.countriesList\n .filter((country) => !country.pFlags?.hidden)\n .sort((a, b) => (a.name || a.default_name).localeCompare(b.name || b.default_name));\n};\n\nlet init = () => {\n setCountries();\n rootScope.addEventListener('language_change', () => {\n setCountries();\n });\n};\n\nconst VIRTUAL_COUNTRIES = new Set(['FT']);\n\nexport default class CountryInputField extends InputField {\n private lastCountrySelected: HelpCountry;\n private lastCountryCodeSelected: HelpCountryCode;\n\n private hideTimeout: number;\n private selectWrapper: HTMLElement;\n\n private liMap: Map;\n\n constructor(public options: InputFieldOptions & {\n onCountryChange?: (country: HelpCountry.helpCountry, code: HelpCountryCode.helpCountryCode) => void,\n noPhoneCodes?: boolean\n } = {}) {\n super({\n label: 'Country',\n name: randomLong(),\n ...options\n });\n\n if(init) {\n init();\n init = undefined;\n }\n\n this.liMap = new Map();\n\n this.container.classList.add('input-select');\n\n const selectWrapper = this.selectWrapper = document.createElement('div');\n selectWrapper.classList.add('select-wrapper', 'z-depth-3', 'hide');\n\n const arrowDown = document.createElement('span');\n arrowDown.classList.add('arrow', 'arrow-down');\n this.container.append(arrowDown);\n\n const selectList = document.createElement('ul');\n selectWrapper.appendChild(selectList);\n\n const scroll = new Scrollable(selectWrapper);\n\n let initSelect = () => {\n initSelect = null;\n\n countries.forEach((c) => {\n if(options.noPhoneCodes && VIRTUAL_COUNTRIES.has(c.iso2)) {\n return;\n }\n\n const emoji = getCountryEmoji(c.iso2);\n\n const liArr: Array = [];\n for(let i = 0, length = Math.min(c.country_codes.length, options.noPhoneCodes ? 1 : Infinity); i < length; ++i) {\n const countryCode = c.country_codes[i];\n const li = document.createElement('li');\n\n const wrapped = wrapEmojiText(emoji);\n if(IS_EMOJI_SUPPORTED) {\n const spanEmoji = document.createElement('span');\n setInnerHTML(spanEmoji, wrapped);\n li.append(spanEmoji);\n } else {\n setInnerHTML(li, wrapped);\n }\n\n const el = i18n(c.default_name as any);\n el.dataset.defaultName = c.default_name;\n li.append(el);\n\n if(!options.noPhoneCodes) {\n const span = document.createElement('span');\n span.classList.add('phone-code');\n span.innerText = '+' + countryCode.country_code;\n li.appendChild(span);\n }\n\n liArr.push(li);\n selectList.append(li);\n }\n\n this.liMap.set(c.iso2, liArr);\n });\n\n selectList.addEventListener('mousedown', (e) => {\n if(e.button !== 0) { // other buttons but left shall not pass\n return;\n }\n\n const target = findUpTag(e.target, 'LI')\n this.selectCountryByTarget(target);\n // console.log('clicked', e, countryName, phoneCode);\n });\n\n this.container.appendChild(selectWrapper);\n };\n\n initSelect();\n\n this.input.addEventListener('focus', (e) => {\n if(initSelect) {\n initSelect();\n } else {\n countries.forEach((c) => {\n const arr = this.liMap.get(c.iso2);\n if(!arr) return;\n arr.forEach((li) => li.style.display = '');\n });\n }\n\n clearTimeout(this.hideTimeout);\n this.hideTimeout = undefined;\n\n selectWrapper.classList.remove('hide');\n void selectWrapper.offsetWidth; // reflow\n selectWrapper.classList.add('active');\n\n this.select();\n\n fastSmoothScroll({\n // container: page.pageEl.parentElement.parentElement,\n container: findUpClassName(this.container, 'scrollable-y'),\n element: this.input,\n position: 'start',\n margin: 4\n });\n\n setTimeout(() => {\n if(!mouseDownHandlerAttached) {\n document.addEventListener('mousedown', onMouseDown, {capture: true});\n mouseDownHandlerAttached = true;\n }\n }, 0);\n });\n\n let mouseDownHandlerAttached = false;\n const onMouseDown = (e: MouseEvent) => {\n if(findUpClassName(e.target, 'input-select')) {\n return;\n }\n if(e.target === this.input) {\n return;\n }\n\n this.hidePicker();\n document.removeEventListener('mousedown', onMouseDown, {capture: true});\n mouseDownHandlerAttached = false;\n };\n\n /* false && this.input.addEventListener('blur', function(this: typeof this.input, e) {\n hidePicker();\n\n e.cancelBubble = true;\n }, {capture: true}); */\n\n const onKeyPress = (e: KeyboardEvent) => {\n const key = e.key;\n if(e.ctrlKey || key === 'Control') return false;\n\n // let i = new RegExp('^' + this.value, 'i');\n const _value = this.value.toLowerCase();\n const matches: HelpCountry[] = [];\n countries.forEach((c) => {\n const arr = this.liMap.get(c.iso2);\n if(!arr) {\n return;\n }\n\n const names = [\n c.name,\n c.default_name,\n c.iso2\n ];\n\n names.filter(Boolean).forEach((name) => {\n const abbr = name.split(' ').filter((word) => /\\w/.test(word)).map((word) => word[0]).join('');\n if(abbr.length > 1) {\n names.push(abbr);\n }\n });\n\n const good = !!names.filter(Boolean).find((str) => str.toLowerCase().indexOf(_value) !== -1)/* === 0 */;// i.test(c.name);\n\n arr.forEach((li) => li.style.display = good ? '' : 'none');\n if(good) matches.push(c);\n });\n\n // ะšะพะด ะฝะธะถะต ะฐะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธ ะฒั‹ะฑะตั€ะตั‚ ัั‚ั€ะฐะฝัƒ ะตัะปะธ ะพะฝะฐ ะพัั‚ะฐะปะฐััŒ ะพะดะฝะฐ ะฟั€ะธ ะฟะพะธัะบะต\n /* if(matches.length === 1 && matches[0].li.length === 1) {\n if(matches[0].name === lastCountrySelected) return false;\n //console.log('clicking', matches[0]);\n\n var clickEvent = document.createEvent('MouseEvents');\n clickEvent.initEvent('mousedown', true, true);\n matches[0].li[0].dispatchEvent(clickEvent);\n return false;\n } else */if(matches.length === 0) {\n countries.forEach((c) => {\n const arr = this.liMap.get(c.iso2);\n if(!arr) {\n return;\n }\n\n arr.forEach((li) => li.style.display = '');\n });\n } else if(matches.length === 1 && key === 'Enter') {\n cancelEvent(e);\n this.selectCountryByTarget(this.liMap.get(matches[0].iso2)[0]);\n }\n };\n\n this.input.addEventListener('keyup', onKeyPress);\n this.input.addEventListener('keydown', (e) => {\n if(e.key === 'Enter') {\n onKeyPress(e);\n }\n });\n\n arrowDown.addEventListener('mousedown', (e) => {\n if(this.input.matches(':focus')) {\n this.hidePicker();\n this.input.blur();\n } else {\n e.cancelBubble = true;\n e.preventDefault();\n this.input.focus();\n }\n });\n }\n\n public getSelected() {\n return {country: this.lastCountrySelected, code: this.lastCountryCodeSelected};\n }\n\n public hidePicker = () => {\n if(this.hideTimeout !== undefined) return;\n this.selectWrapper.classList.remove('active');\n this.hideTimeout = window.setTimeout(() => {\n this.selectWrapper.classList.add('hide');\n this.hideTimeout = undefined;\n }, 200);\n }\n\n public selectCountryByTarget = (target: HTMLElement) => {\n const defaultName = target.querySelector('[data-default-name]').dataset.defaultName;\n const phoneCodeEl = target.querySelector('.phone-code');\n const phoneCode = phoneCodeEl?.innerText;\n const countryCode = phoneCode && phoneCode.replace(/\\D/g, '');\n\n replaceContent(this.input, i18n(defaultName as any));\n this.simulateInputEvent();\n this.lastCountrySelected = countries.find((c) => c.default_name === defaultName);\n this.lastCountryCodeSelected = countryCode && this.lastCountrySelected.country_codes.find((_countryCode) => _countryCode.country_code === countryCode);\n\n this.options.onCountryChange?.(this.lastCountrySelected, this.lastCountryCodeSelected);\n this.hidePicker();\n }\n\n public selectCountryByIso2(iso2: string) {\n this.selectCountryByTarget(this.liMap.get(iso2)[0]);\n }\n\n public override(country: HelpCountry, code: HelpCountryCode, countryName?: string) {\n replaceContent(this.input, country ? i18n(country.default_name as any) : countryName);\n this.lastCountrySelected = country;\n this.lastCountryCodeSelected = code;\n this.options.onCountryChange?.(this.lastCountrySelected, this.lastCountryCodeSelected);\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_MOBILE} from '../environment/userAgent';\nimport {animate} from '../helpers/animation';\nimport {Middleware} from '../helpers/middleware';\nimport clamp from '../helpers/number/clamp';\nimport animationIntersector, {AnimationItemGroup, AnimationItemWrapper} from './animationIntersector';\n\ntype DotRendererDot = {\n x: number,\n y: number,\n opacity: number,\n radius: number\n mOpacity: number,\n adding: boolean,\n counter: number,\n path: Path2D\n};\nexport default class DotRenderer implements AnimationItemWrapper {\n public canvas: HTMLCanvasElement;\n private context: CanvasRenderingContext2D;\n private dots: DotRendererDot[];\n\n public paused: boolean;\n public autoplay: boolean;\n public tempId: number;\n\n private dpr: number;\n\n constructor(\n private width: number,\n private height: number,\n private multiply?: number\n ) {\n const canvas = this.canvas = document.createElement('canvas');\n const dpr = this.dpr = window.devicePixelRatio;\n canvas.width = width * dpr;\n canvas.height = height * dpr;\n canvas.classList.add('canvas-thumbnail', 'canvas-dots');\n\n this.paused = true;\n this.autoplay = true;\n this.tempId = 0;\n this.context = canvas.getContext('2d');\n }\n\n private prepare() {\n let count = Math.round(this.width * this.height / (35 * (IS_MOBILE ? 2 : 1)));\n count *= this.multiply || 1;\n count = Math.min(IS_MOBILE ? 1000 : 2200, count);\n count = Math.round(count);\n const dots: DotRendererDot[] = this.dots = new Array(count);\n\n for(let i = 0; i < count; ++i) {\n dots[i] = this.generateDot();\n }\n }\n\n private generateDot(adding?: boolean): DotRendererDot {\n const x = Math.floor(Math.random() * this.canvas.width);\n const y = Math.floor(Math.random() * this.canvas.height);\n const opacity = adding ? 0 : Math.random();\n const radius = (Math.random() >= .8 ? 1 : 0.5) * this.dpr;\n const path = new Path2D();\n path.arc(x, y, radius, 0, 2 * Math.PI, false);\n return {\n x,\n y,\n opacity,\n radius,\n mOpacity: opacity,\n adding: adding ?? Math.random() >= .5,\n counter: 0,\n path\n };\n }\n\n private draw() {\n const {context, canvas, dots} = this;\n context.clearRect(0, 0, canvas.width, canvas.height);\n context.fillStyle = '#fff';\n\n const add = 0.02;\n for(let i = 0, length = dots.length; i < length; ++i) {\n const dot = dots[i];\n const addOpacity = dot.adding ? add : -add;\n\n dot.mOpacity += addOpacity;\n // if(dot.mOpacity <= 0) dot.mOpacity = dot.opacity;\n\n // const easedOpacity = easing(dot.mOpacity);\n const easedOpacity = clamp(dot.mOpacity, 0, 1);\n context.globalAlpha = easedOpacity;\n context.fill(dot.path);\n\n if(dot.mOpacity <= 0) {\n dot.adding = true;\n\n if(++dot.counter >= 1) {\n dots[i] = this.generateDot(dot.adding);\n }\n } else if(dot.mOpacity >= 1) {\n dot.adding = false;\n }\n }\n }\n\n public remove() {\n this.pause();\n }\n\n public pause() {\n if(this.paused) {\n return;\n }\n\n this.paused = true;\n ++this.tempId;\n }\n\n public renderFirstFrame() {\n if(!this.dots) {\n this.prepare();\n }\n\n this.draw();\n }\n\n public play() {\n if(!this.paused) {\n return;\n }\n\n this.paused = false;\n const tempId = ++this.tempId;\n\n if(!this.dots) {\n this.prepare();\n }\n\n animate(() => {\n if(this.tempId !== tempId || this.paused) {\n return false;\n }\n\n this.draw();\n return true;\n });\n }\n\n public static create({\n width,\n height,\n middleware,\n animationGroup,\n multiply\n }: {\n width: number,\n height: number,\n middleware: Middleware,\n animationGroup: AnimationItemGroup,\n multiply?: number\n }) {\n const dotRenderer = new DotRenderer(width, height, multiply);\n dotRenderer.renderFirstFrame();\n\n animationIntersector.addAnimation(dotRenderer, animationGroup, dotRenderer.canvas, middleware);\n\n return dotRenderer;\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 {InputFile} from '../layer';\nimport AvatarEdit from './avatarEdit';\nimport AvatarElement from './avatar';\nimport InputField from './inputField';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport ButtonCorner from './buttonCorner';\nimport safeAssign from '../helpers/object/safeAssign';\nimport {NULL_PEER_ID} from '../lib/mtproto/mtproto_config';\n\nexport default class EditPeer {\n public nextBtn: HTMLButtonElement;\n\n public uploadAvatar: () => Promise;\n public avatarEdit: AvatarEdit;\n public avatarElem: AvatarElement;\n\n private inputFields: InputField[];\n private listenerSetter: ListenerSetter;\n\n private peerId: PeerId;\n\n private _disabled = false;\n private avatarSize = 120;\n\n constructor(options: {\n peerId?: EditPeer['peerId'],\n inputFields: EditPeer['inputFields'],\n listenerSetter: ListenerSetter,\n doNotEditAvatar?: boolean,\n withoutAvatar?: boolean,\n nextBtn?: HTMLButtonElement,\n avatarSize?: number,\n popupOptions?: ConstructorParameters[1]\n }) {\n safeAssign(this, options);\n\n this.peerId ||= NULL_PEER_ID;\n\n if(!this.nextBtn) {\n this.nextBtn = ButtonCorner({icon: 'check'});\n } else if(!this.nextBtn.classList.contains('btn-corner')) {\n this.handleChange = () => {\n this.nextBtn.toggleAttribute('disabled', !this.isChanged() || this.disabled);\n };\n }\n\n if(!options.withoutAvatar) {\n this.avatarElem = new AvatarElement();\n this.avatarElem.classList.add('avatar-placeholder', 'avatar-' + this.avatarSize);\n this.avatarElem.updateWithOptions({peerId: this.peerId});\n\n if(!options.doNotEditAvatar) {\n this.avatarEdit = new AvatarEdit((_upload) => {\n this.uploadAvatar = _upload;\n this.handleChange();\n this.avatarElem.remove();\n }, options.popupOptions);\n\n this.avatarEdit.container.append(this.avatarElem);\n }\n }\n\n this.inputFields.forEach((inputField) => {\n this.listenerSetter.add(inputField.input)('input', this.handleChange);\n });\n\n this.handleChange();\n }\n\n public get disabled() {\n return this._disabled;\n }\n\n public set disabled(value) {\n this._disabled = value;\n this.inputFields.forEach((inputField) => inputField.input.toggleAttribute('disabled', value));\n this.handleChange();\n }\n\n public lockWithPromise(promise: Promise, unlockOnSuccess = false) {\n this.disabled = true;\n promise.then(() => {\n if(unlockOnSuccess) {\n this.disabled = false;\n }\n }, () => {\n this.disabled = false;\n });\n }\n\n public isChanged = () => {\n if(this.uploadAvatar) {\n return true;\n }\n\n let changedLength = 0, requiredLength = 0, requiredValidLength = 0;\n this.inputFields.forEach((inputField) => {\n if(inputField.isValid()) {\n if(inputField.isChanged()) {\n ++changedLength;\n }\n\n if(inputField.required) {\n ++requiredValidLength;\n }\n }\n\n if(inputField.required) {\n ++requiredLength;\n }\n });\n\n return requiredLength === requiredValidLength && changedLength > 0;\n };\n\n public handleChange = () => {\n this.nextBtn.classList.toggle('is-visible', this.isChanged());\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 emoticonsDropdown, {EmoticonsDropdown, EmoticonsTab, EMOTICONSSTICKERGROUP} from '..';\nimport GifsMasonry from '../../gifsMasonry';\nimport Scrollable from '../../scrollable';\nimport {putPreloader} from '../../putPreloader';\nimport {AppManagers} from '../../../lib/appManagers/managers';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\n\nexport default class GifsTab implements EmoticonsTab {\n public content: HTMLElement;\n public scrollable: Scrollable;\n public tabId: number;\n\n constructor(private managers: AppManagers) {\n\n }\n\n init() {\n this.content = document.getElementById('content-gifs');\n const gifsContainer = this.content.firstElementChild as HTMLDivElement;\n attachClickEvent(gifsContainer, EmoticonsDropdown.onMediaClick);\n\n const scroll = this.scrollable = new Scrollable(this.content, 'GIFS');\n const masonry = new GifsMasonry(gifsContainer, EMOTICONSSTICKERGROUP, scroll);\n const preloader = putPreloader(this.content, true);\n\n this.managers.appDocsManager.getGifs().then((docs) => {\n docs.forEach((doc) => {\n masonry.add(doc);\n });\n\n preloader.remove();\n });\n\n emoticonsDropdown.addLazyLoadQueueRepeat(masonry.lazyLoadQueue, masonry.processInvisibleDiv);\n\n this.init = null;\n }\n\n onClose() {\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 {MyDocument} from '../../../lib/appManagers/appDocsManager';\nimport {SliderSuperTab} from '../../slider';\nimport InputSearch from '../../inputSearch';\nimport animationIntersector, {AnimationItemGroup} from '../../animationIntersector';\nimport appSidebarRight from '..';\nimport {AppInlineBotsManager} from '../../../lib/appManagers/appInlineBotsManager';\nimport GifsMasonry from '../../gifsMasonry';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport mediaSizes from '../../../helpers/mediaSizes';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport {NULL_PEER_ID} from '../../../lib/mtproto/mtproto_config';\n\nconst ANIMATIONGROUP: AnimationItemGroup = 'GIFS-SEARCH';\n\nexport default class AppGifsTab extends SliderSuperTab {\n private inputSearch: InputSearch;\n private gifsDiv: HTMLDivElement;\n\n private nextOffset = '';\n private loadedAll = false;\n\n private gifBotPeerId: PeerId;\n private masonry: GifsMasonry;\n\n private searchPromise: ReturnType;\n\n public init() {\n this.container.id = 'search-gifs-container';\n\n this.inputSearch = new InputSearch('SearchGifsTitle', (value) => {\n this.reset();\n this.search(value);\n });\n\n this.title.replaceWith(this.inputSearch.container);\n\n this.gifsDiv = document.createElement('div');\n this.gifsDiv.classList.add('gifs-masonry');\n attachClickEvent(this.gifsDiv, this.onGifsClick, {listenerSetter: this.listenerSetter});\n\n this.scrollable.append(this.gifsDiv);\n\n this.masonry = new GifsMasonry(this.gifsDiv, ANIMATIONGROUP, this.scrollable);\n // this.backBtn.parentElement.append(this.inputSearch.container);\n\n appSidebarRight.toggleSidebar(true).then(() => {\n this.search('', true);\n\n this.scrollable.onScrolledBottom = () => {\n this.search(this.inputSearch.value, false);\n };\n });\n }\n\n private onGifsClick = async(e: MouseEvent | TouchEvent) => {\n const target = findUpClassName(e.target, 'gif');\n if(!target) return;\n\n const fileId = target.dataset.docId;\n if(await appImManager.chat.input.sendMessageWithDocument(fileId)) {\n if(mediaSizes.isMobile) {\n appSidebarRight.onCloseBtnClick();\n }\n } else {\n console.warn('got no doc by id:', fileId);\n }\n };\n\n public onClose() {\n this.scrollable.onScrolledBottom = () => {};\n }\n\n public onCloseAfterTimeout() {\n this.reset();\n this.gifsDiv.innerHTML = '';\n animationIntersector.checkAnimations(undefined, ANIMATIONGROUP);\n this.inputSearch.remove();\n return super.onCloseAfterTimeout();\n }\n\n private reset() {\n this.searchPromise = null;\n this.nextOffset = '';\n this.loadedAll = false;\n this.masonry.clear();\n }\n\n public async search(query: string, newSearch = true) {\n if(this.searchPromise || this.loadedAll) return;\n\n if(!this.gifBotPeerId) {\n this.gifBotPeerId = (await this.managers.appUsersManager.resolveUsername('gif')).id.toPeerId(false);\n }\n\n try {\n this.searchPromise = this.managers.appInlineBotsManager.getInlineResults(NULL_PEER_ID, this.gifBotPeerId, query, this.nextOffset);\n const {results, next_offset} = await this.searchPromise;\n\n if(this.inputSearch.value !== query) {\n return;\n }\n\n this.searchPromise = null;\n this.nextOffset = next_offset;\n if(newSearch) {\n this.gifsDiv.innerHTML = '';\n }\n\n if(results.length) {\n results.forEach((result) => {\n if(result._ === 'botInlineMediaResult' && result.document) {\n this.masonry.add(result.document as MyDocument);\n }\n });\n } else {\n this.loadedAll = true;\n }\n\n this.scrollable.onScroll();\n } catch(err) {\n this.searchPromise = null;\n console.error('gifs loading error:', err);\n throw err;\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 {SliderSuperTab} from '../../slider';\nimport InputSearch from '../../inputSearch';\nimport LazyLoadQueue from '../../lazyLoadQueue';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport PopupStickers from '../../popups/stickers';\nimport animationIntersector from '../../animationIntersector';\nimport appSidebarRight from '..';\nimport {StickerSet, StickerSetCovered} from '../../../layer';\nimport {i18n} from '../../../lib/langPack';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport forEachReverse from '../../../helpers/array/forEachReverse';\nimport setInnerHTML from '../../../helpers/dom/setInnerHTML';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport attachStickerViewerListeners from '../../stickerViewer';\nimport wrapSticker from '../../wrappers/sticker';\n\nexport default class AppStickersTab extends SliderSuperTab {\n private inputSearch: InputSearch;\n private setsDiv: HTMLDivElement;\n private lazyLoadQueue: LazyLoadQueue;\n\n public init() {\n this.container.id = 'stickers-container';\n this.container.classList.add('chatlist-container');\n\n this.lazyLoadQueue = new LazyLoadQueue();\n\n this.inputSearch = new InputSearch('StickersTab.SearchPlaceholder', (value) => {\n this.search(value);\n });\n\n this.title.replaceWith(this.inputSearch.container);\n\n this.setsDiv = document.createElement('div');\n this.setsDiv.classList.add('sticker-sets');\n this.scrollable.append(this.setsDiv);\n\n attachStickerViewerListeners({listenTo: this.setsDiv, listenerSetter: this.listenerSetter});\n\n attachClickEvent(this.setsDiv, (e) => {\n const sticker = findUpClassName(e.target, 'sticker-set-sticker');\n if(sticker) {\n const docId = sticker.dataset.docId;\n appImManager.chat.input.sendMessageWithDocument(docId);\n return;\n }\n\n const target = findUpClassName(e.target, 'sticker-set');\n if(!target) return;\n\n const id = target.dataset.stickerSet as string;\n const access_hash = target.dataset.access_hash as string;\n\n const button = findUpClassName(e.target, 'sticker-set-button') as HTMLElement;\n if(button) {\n e.preventDefault();\n e.cancelBubble = true;\n\n button.setAttribute('disabled', 'true');\n\n this.managers.appStickersManager.getStickerSet({id, access_hash}).then((full) => {\n this.managers.appStickersManager.toggleStickerSet(full.set).then((changed) => {\n if(changed) {\n button.textContent = '';\n button.append(i18n(full.set.installed_date ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\n button.classList.toggle('gray', !!full.set.installed_date);\n }\n }).finally(() => {\n // button.style.width = set.installed_date ? '68px' : '52px';\n button.removeAttribute('disabled');\n });\n });\n } else {\n this.managers.appStickersManager.getStickerSet({id, access_hash}).then((full) => {\n new PopupStickers(full.set).show();\n });\n }\n }, {listenerSetter: this.listenerSetter});\n\n appSidebarRight.toggleSidebar(true).then(() => {\n this.renderFeatured();\n });\n }\n\n public onCloseAfterTimeout() {\n this.setsDiv.innerHTML = '';\n animationIntersector.checkAnimations(undefined, 'STICKERS-SEARCH');\n return super.onCloseAfterTimeout();\n }\n\n public renderSet(set: StickerSet.stickerSet) {\n // console.log('renderSet:', set);\n const div = document.createElement('div');\n div.classList.add('sticker-set');\n\n const header = document.createElement('div');\n header.classList.add('sticker-set-header');\n\n const details = document.createElement('div');\n details.classList.add('sticker-set-details');\n details.innerHTML = `
`;\n\n setInnerHTML(details.firstElementChild, wrapEmojiText(set.title));\n\n const countDiv = document.createElement('div');\n countDiv.classList.add('sticker-set-count');\n countDiv.append(i18n('Stickers', [set.count]));\n details.append(countDiv);\n\n const button = document.createElement('button');\n button.classList.add('btn-primary', 'btn-color-primary', 'sticker-set-button');\n button.append(i18n(set.installed_date ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\n // button.style.width = set.installed_date ? '68px' : '52px';\n\n if(set.installed_date) {\n button.classList.add('gray');\n }\n\n // ripple(button);\n\n header.append(details, button);\n\n const stickersDiv = document.createElement('div');\n stickersDiv.classList.add('sticker-set-stickers');\n\n const count = Math.min(5, set.count);\n for(let i = 0; i < count; ++i) {\n const stickerDiv = document.createElement('div');\n stickerDiv.classList.add('sticker-set-sticker');\n\n stickersDiv.append(stickerDiv);\n }\n\n this.managers.appStickersManager.getStickerSet(set).then((set) => {\n // console.log('renderSet got set:', set);\n\n for(let i = 0; i < count; ++i) {\n const div = stickersDiv.children[i] as HTMLDivElement;\n const doc = set.documents[i];\n if(doc._ === 'documentEmpty') {\n continue;\n }\n\n wrapSticker({\n doc,\n div,\n lazyLoadQueue: this.lazyLoadQueue,\n group: 'STICKERS-SEARCH',\n /* play: false,\n loop: false, */\n play: true,\n loop: true,\n width: 68,\n height: 68,\n withLock: true\n });\n }\n });\n\n /* const onMouseOver = () => {\n const animations: AnimationItem['animation'][] = [];\n for(let i = 0; i < count; ++i) {\n const stickerDiv = stickersDiv.children[i] as HTMLElement;\n const animationItem = animationIntersector.getAnimation(stickerDiv);\n if(!animationItem) continue;\n\n const animation = animationItem.animation;\n\n animations.push(animation);\n animation.loop = true;\n animation.play();\n }\n\n div.addEventListener('mouseout', () => {\n animations.forEach((animation) => {\n animation.loop = false;\n });\n\n div.addEventListener('mouseover', onMouseOver, {once: true});\n }, {once: true});\n };\n\n div.addEventListener('mouseover', onMouseOver, {once: true}); */\n\n div.dataset.stickerSet = '' + set.id;\n div.dataset.access_hash = '' + set.access_hash;\n div.dataset.title = set.title;\n\n div.append(header, stickersDiv);\n\n this.setsDiv.append(div);\n }\n\n public renderFeatured() {\n return this.managers.appStickersManager.getFeaturedStickers().then((coveredSets) => {\n if(this.inputSearch.value) {\n return;\n }\n\n coveredSets = this.filterRendered('', coveredSets);\n coveredSets.forEach((set) => {\n this.renderSet(set.set);\n });\n });\n }\n\n private filterRendered(query: string, coveredSets: StickerSetCovered[]) {\n coveredSets = coveredSets.slice();\n\n const children = Array.from(this.setsDiv.children) as HTMLElement[];\n forEachReverse(children, el => {\n const id = el.dataset.stickerSet;\n const index = coveredSets.findIndex((covered) => covered.set.id === id);\n\n if(index !== -1) {\n coveredSets.splice(index, 1);\n } else if(!query || !el.dataset.title.toLowerCase().includes(query.toLowerCase())) {\n el.remove();\n }\n });\n\n animationIntersector.checkAnimations(undefined, 'STICKERS-SEARCH');\n\n return coveredSets;\n }\n\n public search(query: string) {\n if(!query) {\n return this.renderFeatured();\n }\n\n return this.managers.appStickersManager.searchStickerSets(query, false).then((coveredSets) => {\n if(this.inputSearch.value !== query) {\n return;\n }\n\n // console.log('search result:', coveredSets);\n\n coveredSets = this.filterRendered(query, coveredSets);\n coveredSets.forEach((set) => {\n this.renderSet(set.set);\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_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport rootScope from '../../lib/rootScope';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport {horizontalMenu} from '../horizontalMenu';\nimport LazyLoadQueue 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, {EmoticonsTabC, StickersTabCategory} 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 {IS_APPLE_MOBILE} from '../../environment/userAgent';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport type LazyLoadQueueIntersector from '../lazyLoadQueueIntersector';\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport overlayCounter from '../../helpers/overlayCounter';\nimport noop from '../../helpers/noop';\nimport {FocusDirection, ScrollOptions} from '../../helpers/fastSmoothScroll';\nimport BezierEasing from '../../vendor/bezier-easing';\nimport RichInputHandler from '../../helpers/dom/richInputHandler';\nimport {getCaretPosF} from '../../helpers/dom/getCaretPosNew';\nimport ListenerSetter from '../../helpers/listenerSetter';\n\nexport const EMOTICONSSTICKERGROUP: AnimationItemGroup = 'emoticons-dropdown';\n\nexport interface EmoticonsTab {\n content: HTMLElement;\n scrollable: Scrollable;\n menuScroll?: ScrollableX;\n tabId: number;\n init: () => void;\n onOpen?: () => void;\n onOpened?: () => void;\n onClose?: () => void;\n onClosed?: () => void;\n}\n\nconst easing = BezierEasing(0.42, 0.0, 0.58, 1.0);\nconst scrollOptions: Partial = {\n forceDuration: 200,\n transitionFunction: easing\n};\n\nexport class EmoticonsDropdown extends DropdownHover {\n public static lazyLoadQueue = new LazyLoadQueue(1);\n\n private emojiTab: EmojiTab;\n private 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 private managers: AppManagers;\n\n constructor() {\n super({\n element: document.getElementById('emoji-dropdown') as HTMLDivElement,\n ignoreOutClickClassName: 'input-message-input'\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 const tab = this.tab;\n tab.onOpen?.();\n });\n\n this.addEventListener('opened', () => {\n animationIntersector.unlockIntersectionGroup(EMOTICONSSTICKERGROUP);\n EmoticonsDropdown.lazyLoadQueue.unlockAndRefresh();\n\n // this.container.classList.remove('disable-hover');\n\n const tab = this.tab;\n tab.onOpened?.();\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 const tab = this.tab;\n tab.onClose?.();\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 const tab = this.tab;\n tab.onClosed?.();\n });\n }\n\n public get tab() {\n return this.tabs[this.tabId];\n }\n\n public init() {\n this.managers = rootScope.managers;\n this.emojiTab = new EmojiTab({managers: this.managers});\n this.stickersTab = new StickersTab(this.managers);\n this.gifsTab = new GifsTab(this.managers);\n\n this.tabs = {};\n [this.emojiTab, this.stickersTab, this.gifsTab].forEach((tab, idx) => {\n tab.tabId = idx;\n this.tabs[idx] = tab;\n });\n\n this.container = this.element.querySelector('.emoji-container .tabs-container') as HTMLDivElement;\n this.container.prepend(this.emojiTab.container, this.stickersTab.container);\n this.tabsEl = this.element.querySelector('.emoji-tabs') as HTMLUListElement;\n this.selectTab = horizontalMenu(this.tabsEl, this.container, this.onSelectTabClick, () => {\n const {tab} = this;\n tab.init?.();\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 === this.stickersTab.tabId) {\n if(!appSidebarRight.isTabExists(AppStickersTab)) {\n appSidebarRight.createTab(AppStickersTab).open();\n }\n } else {\n if(!appSidebarRight.isTabExists(AppGifsTab)) {\n appSidebarRight.createTab(AppGifsTab).open();\n }\n }\n });\n\n this.deleteBtn = this.element.querySelector('.emoji-tabs-delete');\n attachClickEvent(this.deleteBtn, (e) => {\n cancelEvent(e);\n const input = appImManager.chat.input.messageInput;\n // RichInputHandler.getInstance().makeFocused(appImManager.chat.input.messageInput);\n let range = RichInputHandler.getInstance().getSavedRange(input);\n if(!range) {\n range = document.createRange();\n range.setStartAfter(input.lastChild);\n }\n\n const newRange = range.cloneRange();\n // if(range.endOffset === range.startOffset && range.endContainer === range.startContainer) {\n if(range.collapsed) {\n const {node, offset} = getCaretPosF(input, range.endContainer, range.endOffset);\n let newStartNode: Node;\n if(offset) {\n newStartNode = node;\n } else {\n newStartNode = node.previousSibling;\n if(!newStartNode) {\n return;\n }\n\n while(newStartNode.nodeType === newStartNode.TEXT_NODE && !newStartNode.nodeValue && (newStartNode = newStartNode.previousSibling)) {\n\n }\n\n if(newStartNode.nodeType === newStartNode.ELEMENT_NODE && !(newStartNode as HTMLElement).isContentEditable) {\n return;\n }\n }\n\n if(newStartNode.nodeType === newStartNode.ELEMENT_NODE && (newStartNode as any).tagName === 'IMG') {\n newRange.selectNode(newStartNode);\n } else {\n const text = [...newStartNode.textContent];\n let t: string;\n if(offset) {\n let length = 0;\n t = text.find((text) => (length += text.length, length >= offset));\n } else {\n t = text.pop() || '';\n }\n\n const newOffset = offset ? offset - t.length : newStartNode.textContent.length - t.length;\n newRange.setStart(newStartNode, newOffset);\n }\n }\n\n newRange.deleteContents();\n\n appImManager.chat.input.messageInputField.simulateInputEvent();\n // const selection = document.getSelection();\n // if(selection.isCollapsed) {\n // selection.modify('extend', 'backward', 'character');\n // }\n\n // selection.deleteFromDocument();\n // (document.activeElement as HTMLElement).blur();\n\n // document.execCommand('undo', false, null);\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\n const HIDE_EMOJI_TAB = IS_APPLE_MOBILE && false;\n\n const INIT_TAB_ID = HIDE_EMOJI_TAB ? this.stickersTab.tabId : this.emojiTab.tabId;\n\n if(HIDE_EMOJI_TAB) {\n (this.tabsEl.children[1] as HTMLElement).classList.add('hide');\n }\n\n simulateClickEvent(this.tabsEl.children[INIT_TAB_ID + 1] as HTMLElement);\n if(this.tabs[INIT_TAB_ID].init) {\n this.tabs[INIT_TAB_ID].init(); // onTransitionEnd ะฝะต ะฒั‹ะทะพะฒะตั‚ัั, ั‚.ะบ. ัั‚ะพ ะฟะตั€ะฒะฐั ะพั‚ะบั€ั‹ั‚ะฐั ะฒะบะปะฐะดะบะฐ\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n let lastMouseMoveEvent: MouseEvent, mouseMoveEventAttached = false;\n const onMouseMove = (e: MouseEvent) => {\n lastMouseMoveEvent = e;\n };\n overlayCounter.addEventListener('change', (isActive) => {\n if(isActive) {\n if(!mouseMoveEventAttached) {\n document.body.addEventListener('mousemove', onMouseMove);\n mouseMoveEventAttached = true;\n }\n } else if(mouseMoveEventAttached) {\n document.body.removeEventListener('mousemove', onMouseMove);\n if(lastMouseMoveEvent) {\n this.onMouseOut(lastMouseMoveEvent);\n }\n }\n });\n }\n\n appImManager.addEventListener('peer_changing', () => {\n this.toggle(false);\n });\n appImManager.addEventListener('peer_changed', this.checkRights);\n this.checkRights();\n\n return super.init();\n }\n\n public getElement() {\n return this.element;\n }\n\n public scrollTo(tab: EmoticonsTab, element: HTMLElement) {\n tab.scrollable.scrollIntoViewNew({\n element: element as HTMLElement,\n axis: 'y',\n position: 'start',\n ...scrollOptions\n });\n }\n\n private onSelectTabClick = (id: number) => {\n if(this.tabId === id) {\n const {tab} = this;\n this.scrollTo(tab, tab.scrollable.container.firstElementChild as HTMLElement);\n return;\n }\n\n animationIntersector.checkAnimations(true, EMOTICONSSTICKERGROUP);\n\n this.tabId = id;\n this.searchButton.classList.toggle('hide', this.tabId === this.emojiTab.tabId);\n this.deleteBtn.classList.toggle('hide', this.tabId !== this.emojiTab.tabId);\n };\n\n private checkRights = async() => {\n const {peerId, threadId} = appImManager.chat;\n const children = this.tabsEl.children;\n const tabsElements = Array.from(children) as HTMLElement[];\n\n const [canSendStickers, canSendGifs] = await Promise.all([\n this.managers.appMessagesManager.canSendToPeer(peerId, threadId, 'send_stickers'),\n this.managers.appMessagesManager.canSendToPeer(peerId, threadId, 'send_gifs')\n ]);\n\n tabsElements[this.stickersTab.tabId + 1].toggleAttribute('disabled', !canSendStickers);\n tabsElements[this.gifsTab.tabId + 1].toggleAttribute('disabled', !canSendGifs);\n\n const active = this.tabsEl.querySelector('.active');\n if(active && whichChild(active) !== (this.emojiTab.tabId + 1) && (!canSendStickers || !canSendGifs)) {\n this.selectTab(this.emojiTab.tabId, false);\n }\n };\n\n public static menuOnClick = (\n emoticons: EmoticonsTabC,\n menu: HTMLElement,\n scrollable: Scrollable,\n menuScroll?: ScrollableX,\n prevTab?: StickersTabCategory,\n listenerSetter?: ListenerSetter\n ) => {\n let jumpedTo = -1;\n\n const scrollToTab = (tab: typeof prevTab, f?: boolean) => {\n const m = tab.menuScroll || menuScroll;\n if(m) {\n m.scrollIntoViewNew({\n element: tab.elements.menuTab,\n position: 'center',\n axis: 'x',\n getElementPosition: f ? ({elementPosition}) => {\n return elementPosition - 106;\n } : undefined,\n ...scrollOptions\n });\n }\n };\n\n const setActive = (tab: typeof prevTab, scroll = true) => {\n if(tab === prevTab) {\n return false;\n }\n\n let f = false;\n if(prevTab) {\n prevTab.elements.menuTab.classList.remove('active');\n if(prevTab.menuScroll && prevTab.menuScroll !== tab.menuScroll) {\n f = true;\n // scroll to first\n prevTab.menuScroll.container.parentElement.classList.remove('active');\n prevTab.menuScroll.scrollIntoViewNew({\n element: prevTab.menuScroll.container.firstElementChild as HTMLElement,\n forceDirection: scroll ? undefined : FocusDirection.Static,\n position: 'center',\n axis: 'x',\n ...scrollOptions\n });\n }\n }\n\n tab.elements.menuTab.classList.add('active');\n\n if(tab.menuScroll) {\n tab.menuScroll.container.parentElement.classList.add('active');\n scroll && menuScroll.scrollIntoViewNew({\n element: tab.menuScroll.container.parentElement,\n position: 'center',\n axis: 'x',\n ...scrollOptions\n });\n }\n\n if(prevTab) {\n scrollToTab(tab, f);\n }\n\n prevTab = tab;\n\n return true;\n };\n\n const setActiveStatic = (tab: typeof prevTab) => {\n if(prevTab?.local) {\n return;\n }\n\n emoticons.scrollable.scrollTop = tab.elements.container.offsetTop + 1;\n const s = emoticons.menuScroll.container;\n const e = tab.elements.menuTab;\n s.scrollLeft = e.offsetLeft - s.clientWidth / 2 + e.offsetWidth / 2;\n setActive(tab, false);\n };\n\n let scrollingToContent = false;\n const stickyIntersector = new StickyIntersector(scrollable.container, (stuck, target) => {\n if(scrollingToContent) {\n return;\n }\n\n // console.log('sticky scrollTop', stuck, target, scrollable.container.scrollTop, jumpedTo);\n\n if(Math.abs(jumpedTo - scrollable.container.scrollTop) <= 1) {\n return;\n } else {\n jumpedTo = -1;\n }\n\n const tab = emoticons.getCategoryByContainer(target);\n const which = whichChild(target);\n if(!stuck && (which || tab.menuScroll)) {\n return;\n }\n\n setActive(tab);\n });\n\n attachClickEvent(menu, (e) => {\n let target = findUpClassName(e.target as HTMLElement, 'menu-horizontal-div-item');\n if(!target) {\n target = findUpClassName(e.target as HTMLElement, 'menu-horizontal-inner');\n if(!target || target.classList.contains('active')) {\n return;\n }\n\n target = target.firstElementChild.firstElementChild as HTMLElement;\n }\n\n const which = whichChild(target);\n\n const tab = emoticons.getCategoryByMenuTab(target);\n\n /* if(menuScroll) {\n menuScroll.scrollIntoView(target, false, 0);\n } */\n\n if(setActive(tab)) {\n // scrollToTab(tab);\n // return;\n }\n\n let offsetTop = 0, additionalOffset = 0;\n if(which > 0 || tab.menuScroll) {\n const element = tab.elements.container;\n additionalOffset = 1;\n offsetTop = element.offsetTop + additionalOffset; // * due to stickyIntersector\n }\n\n jumpedTo = offsetTop;\n\n scrollingToContent = true;\n scrollable.scrollIntoViewNew({\n element: offsetTop ? tab.elements.container : scrollable.container.firstElementChild,\n position: 'start',\n axis: 'y',\n getElementPosition: offsetTop ? ({elementPosition}) => elementPosition + additionalOffset : undefined,\n ...scrollOptions\n }).finally(() => {\n setActive(tab);\n scrollingToContent = false;\n });\n }, {listenerSetter});\n\n const a = scrollable.onAdditionalScroll ? scrollable.onAdditionalScroll.bind(scrollable) : noop;\n scrollable.onAdditionalScroll = () => {\n emoticons.content.parentElement.classList.toggle('scrolled-top', !scrollable.scrollTop);\n a();\n };\n\n return {stickyIntersector, setActive, setActiveStatic};\n };\n\n public static onMediaClick = async(e: {target: EventTarget | Element}, clearDraft = false, silent?: boolean) => {\n const target = findUpTag(e.target as HTMLElement, 'DIV');\n if(!target) return false;\n\n const docId = target.dataset.docId;\n if(!docId) return false;\n\n return this.sendDocId(docId, clearDraft, silent);\n };\n\n public static async sendDocId(docId: DocId, clearDraft?: boolean, silent?: boolean) {\n if(await appImManager.chat.input.sendMessageWithDocument(docId, undefined, clearDraft, silent)) {\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:', docId);\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","/*\n * 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, EMOTICONSSTICKERGROUP} 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 appImManager from '../../../lib/appManagers/appImManager';\nimport {LangPackKey} from '../../../lib/langPack';\nimport rootScope from '../../../lib/rootScope';\nimport {emojiFromCodePoints} from '../../../vendor/emoji';\nimport {putPreloader} from '../../putPreloader';\nimport Scrollable, {ScrollableX} from '../../scrollable';\nimport IS_EMOJI_SUPPORTED from '../../../environment/emojiSupport';\nimport IS_TOUCH_SUPPORTED from '../../../environment/touchSupport';\nimport blurActiveElement from '../../../helpers/dom/blurActiveElement';\nimport Emoji from '../../../config/emoji';\nimport fixEmoji from '../../../lib/richTextProcessor/fixEmoji';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport wrapSingleEmoji from '../../../lib/richTextProcessor/wrapSingleEmoji';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport {EmoticonsTabC, StickersTabCategory} from './stickers';\nimport {makeMediaSize} from '../../../helpers/mediaSize';\nimport {AppManagers} from '../../../lib/appManagers/managers';\nimport VisibilityIntersector, {OnVisibilityChangeItem} from '../../visibilityIntersector';\nimport mediaSizes from '../../../helpers/mediaSizes';\nimport wrapStickerSetThumb from '../../wrappers/stickerSetThumb';\nimport attachStickerViewerListeners from '../../stickerViewer';\nimport ListenerSetter from '../../../helpers/listenerSetter';\nimport {Document, StickerSet} from '../../../layer';\nimport {CustomEmojiElement, CustomEmojiRendererElement} from '../../../lib/richTextProcessor/wrapRichText';\nimport findAndSplice from '../../../helpers/array/findAndSplice';\nimport positionElementByIndex from '../../../helpers/dom/positionElementByIndex';\nimport PopupStickers from '../../popups/stickers';\nimport {hideToast, toastNew} from '../../toast';\nimport safeAssign from '../../../helpers/object/safeAssign';\nimport type {AppStickersManager} from '../../../lib/appManagers/appStickersManager';\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: DocumentFragment;\n if(unify && !IS_EMOJI_SUPPORTED) {\n kek = wrapSingleEmoji(emoji);\n } else {\n emoji = fixEmoji(emoji);\n kek = 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.append(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?.tagName === 'IMG') {\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(container) {\n if(prepend) container.prepend(spanEmoji);\n else container.appendChild(spanEmoji);\n }\n\n return spanEmoji;\n}\n\nexport function getEmojiFromElement(element: HTMLElement): {docId?: DocId, emoji: string} {\n const superEmoji = findUpClassName(element, 'super-emoji');\n if(!superEmoji) return;\n\n const firstElementChild = superEmoji.firstElementChild as HTMLElement;\n if(firstElementChild && firstElementChild.classList.contains('custom-emoji')) {\n return {emoji: firstElementChild.dataset.stickerEmoji, docId: firstElementChild.dataset.docId} as const;\n } else {\n if(element.nodeType === element.TEXT_NODE) return {emoji: element.nodeValue};\n if(element.tagName === 'SPAN' && !element.classList.contains('emoji') && element.firstElementChild) {\n element = element.firstElementChild as HTMLElement;\n }\n\n return {emoji: element.getAttribute('alt') || element.innerText} as const;\n }\n}\n\nconst EMOJI_RECENT_ID: (typeof EMOJI_CATEGORIES)[0][0] = 'Emoji.Recent';\nconst EMOJI_RECENT_CATEGORY: (typeof EMOJI_CATEGORIES)[0] = [EMOJI_RECENT_ID, 'recent'];\nconst CUSTOM_EMOJI_RECENT_ID: (typeof EMOJI_CATEGORIES)[0][0] = '';\nconst CUSTOM_EMOJI_RECENT_CATEGORY: (typeof EMOJI_CATEGORIES)[0] = [CUSTOM_EMOJI_RECENT_ID, ''];\nconst EMOJI_CATEGORIES: [LangPackKey | '', string][] = [\n ['Emoji.SmilesAndPeople', 'smile'],\n ['Emoji.AnimalsAndNature', 'animals'],\n ['Emoji.FoodAndDrink', 'eats'],\n ['Emoji.TravelAndPlaces', 'car'],\n ['Emoji.ActivityAndSport', 'sport'],\n ['Emoji.Objects', 'lamp'],\n // ['Emoji.Symbols', 'info'],\n ['Emoji.Flags', 'flag'],\n ['Skin Tones' as any, '']\n];\n\nlet sorted: Map<(typeof EMOJI_CATEGORIES)[0], string[]>;\nfunction prepare() {\n if(sorted) {\n return sorted;\n }\n\n const a: Array<[(typeof EMOJI_CATEGORIES)[0], string[]]> = [\n [CUSTOM_EMOJI_RECENT_CATEGORY, []],\n [EMOJI_RECENT_CATEGORY, []]\n ];\n\n sorted = new Map(a);\n for(const emoji in Emoji) {\n const details = Emoji[emoji];\n const i = '' + details;\n const category = EMOJI_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 sorted.delete(EMOJI_CATEGORIES.pop());\n EMOJI_CATEGORIES.unshift(CUSTOM_EMOJI_RECENT_CATEGORY, EMOJI_RECENT_CATEGORY);\n const order = EMOJI_CATEGORIES.map(([id]) => id);\n const entries = [...sorted.entries()].sort((a, b) => order.indexOf(a[0][0]) - order.indexOf(b[0][0]));\n sorted = new Map(entries);\n\n return sorted;\n}\n\nconst EMOJI_ELEMENT_SIZE = makeMediaSize(42, 42);\nconst RECENT_MAX_LENGTH = 32;\n\ntype EmojiTabItem = {element: HTMLElement} & ReturnType;\ntype EmojiTabCategory = StickersTabCategory;\nexport default class EmojiTab extends EmoticonsTabC {\n private closeScrollTop: number;\n private menuInnerScroll: ScrollableX;\n private isStandalone?: boolean;\n private noRegularEmoji?: boolean;\n private stickerSetId?: Parameters[0];\n private onClick: (emoji: EmojiTabItem) => void;\n private activeEmoji: ReturnType;\n private activeElements: EmojiTabItem[];\n\n constructor(options: {\n managers: AppManagers,\n isStandalone?: boolean,\n noRegularEmoji?: boolean,\n stickerSetId?: EmojiTab['stickerSetId'],\n onClick?: EmojiTab['onClick']\n }) {\n super(\n options.managers,\n 'super-emojis',\n () => EMOJI_ELEMENT_SIZE,\n 16,\n 4,\n 0\n );\n\n safeAssign(this, options);\n this.container.classList.add('emoji-padding');\n this.content.id = 'content-emoji';\n this.activeElements = [];\n }\n\n private onCategoryVisibility = ({target, visible}: Pick) => {\n const category = this.categoriesMap.get(target);\n // console.log(target, visible, category);\n // if(category.local) return;\n\n const renderer = category.elements.renderer;\n const newChildren: HTMLElement[] = [];\n if(renderer) {\n newChildren.push(renderer);\n const customEmojis: Parameters[0] = new Map();\n if(visible) {\n newChildren.push(...category.items.map(({docId, element}) => {\n if(!docId) {\n return element;\n }\n\n // return element;\n\n // if(element.firstElementChild) {\n // return element;\n // }\n\n const customEmojiElement = element.firstElementChild as CustomEmojiElement;\n customEmojiElement.clear(false);\n // const customEmojiElement = CustomEmojiElement.create(document.id);\n customEmojis.set(customEmojiElement.docId, new Set([customEmojiElement]));\n // element.append(customEmojiElement);\n return element;\n }));\n\n renderer.add(customEmojis/* , EmoticonsDropdown.lazyLoadQueue */, undefined, undefined, false);\n } else {\n renderer.clearCanvas();\n renderer.middlewareHelper.clean();\n }\n } else if(visible) {\n newChildren.push(...category.items.map(({element}) => element));\n }\n\n // if(visible)\n category.elements.items.replaceChildren(...newChildren);\n\n if(renderer && !visible) {\n const customEmojis: Parameters[0] = new Map();\n category.items.forEach(({docId, element}) => {\n if(!docId) {\n return;\n }\n\n const customEmojiElement = element.firstElementChild as CustomEmojiElement;\n customEmojiElement.clear();\n customEmojis.set(customEmojiElement.docId, new Set([customEmojiElement]));\n });\n\n /* const promise = */renderer.add(customEmojis/* , EmoticonsDropdown.lazyLoadQueue */, undefined, true);\n // promise.then(() => {\n // customEmojis.forEach((elements) => {\n // elements.forEach((element) => {\n // if(!element.innerHTML) {\n // console.log('no thumb', element);\n // // debugger;\n // }\n // });\n // });\n\n // const set = customEmojis.get('5766933926429854499');\n // console.log(`wrapped ${customEmojis.size} thumbs`, set && set.values().next().value.innerHTML);\n // });\n }\n\n // if(!visible) {\n // const customEmojis: Parameters[0] = {};\n // category.items.forEach((item) => {\n // const {element, document} = item;\n // if(!element.firstElementChild) {\n // return;\n // }\n\n // const customEmojiElement = CustomEmojiElement.create(document.id);\n // customEmojis[customEmojiElement.docId] = new Set([customEmojiElement]);\n // element.firstElementChild.replaceWith(customEmojiElement);\n // });\n\n // renderer.add(customEmojis, EmoticonsDropdown.lazyLoadQueue);\n // }\n };\n\n public destroy() {\n super.destroy();\n this.menuInnerScroll?.destroy();\n }\n\n public init() {\n super.init();\n this.init = undefined;\n\n const intersectionOptions: IntersectionObserverInit = {\n root: this.isStandalone ? this.content : emoticonsDropdown.getElement()\n };\n\n this.categoriesIntersector = new VisibilityIntersector(this.onCategoryVisibility, intersectionOptions);\n\n this.menuOnClickResult = EmoticonsDropdown.menuOnClick(this, this.menu, this.scrollable, this.menuScroll, undefined, this.listenerSetter);\n\n const preloader = putPreloader(this.content, true);\n\n let innerScrollWrapper: HTMLElement;\n\n if(!this.isStandalone) {\n const x = this.menuInnerScroll = new ScrollableX(undefined);\n x.container.classList.add('menu-horizontal-inner-scroll');\n\n innerScrollWrapper = document.createElement('div');\n innerScrollWrapper.classList.add('menu-horizontal-inner');\n innerScrollWrapper.append(x.container);\n }\n\n let preparedMap: ReturnType;\n prepare();\n if(!this.noRegularEmoji) {\n preparedMap = prepare();\n } else {\n preparedMap = new Map([\n [[CUSTOM_EMOJI_RECENT_CATEGORY[0], 'recent'], []]\n // [EMOJI_RECENT_CATEGORY, []]\n ]);\n }\n\n preparedMap.forEach((emojis, [titleLangPackKey, icon]) => {\n const category = this.createLocalCategory(titleLangPackKey, titleLangPackKey, icon, !icon);\n category.elements.container.classList.remove('hide');\n category.elements.items.classList.add(icon && !this.isStandalone ? 'is-local' : 'not-local');\n\n emojis.forEach((unified) => {\n /* if(emojiUnicode(emoji) === '1f481-200d-2642') {\n console.log('append emoji', emoji, emojiUnicode(emoji));\n } */\n\n const 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 this.addEmojiToCategory({\n category,\n emoji: {emoji},\n batch: true\n });\n\n /* if(category === 'Smileys & Emotion') {\n console.log('appended emoji', emoji, itemsDiv.children[itemsDiv.childElementCount - 1].innerHTML, emojiUnicode(emoji));\n } */\n });\n });\n\n const promise = Promise.all([\n this.isStandalone ? undefined : pause(200),\n !this.noRegularEmoji && this.managers.appEmojiManager.getRecentEmojis('native'),\n !this.isStandalone && this.managers.appEmojiManager.getRecentEmojis('custom'),\n this.stickerSetId && this.managers.appStickersManager.getLocalStickerSet(this.stickerSetId),\n this.managers.appEmojiManager.getCustomEmojis()\n ]).then(([_, recent, recentCustom, mainSet, sets]) => {\n preloader.remove();\n\n if(mainSet) {\n recentCustom = mainSet.documents.map((doc) => doc.id);\n }\n\n const recentCategory = this.categories[EMOJI_RECENT_ID];\n const recentCustomCategory = this.categories[CUSTOM_EMOJI_RECENT_ID];\n\n if(!this.isStandalone) {\n const a = [\n recentCategory && [recentCategory, recent] as const,\n recentCustomCategory && [recentCustomCategory, recentCustom] as const\n ];\n\n a.filter(Boolean).forEach(([category, recent]) => {\n category.limit = RECENT_MAX_LENGTH;\n recent.splice(RECENT_MAX_LENGTH, recent.length - RECENT_MAX_LENGTH);\n });\n }\n\n if(recentCategory && recent) for(const emoji of recent) {\n this.addEmojiToCategory({\n category: recentCategory,\n emoji: {emoji},\n batch: true\n });\n }\n\n if(recentCustomCategory) {\n this.createRendererForCategory(recentCustomCategory);\n if(recentCustom) for(const docId of recentCustom) {\n this.addEmojiToCategory({\n category: recentCustomCategory,\n emoji: {emoji: '', docId},\n batch: true\n });\n }\n recentCustomCategory.elements.container.style.paddingTop = '.5rem';\n }\n\n EMOJI_CATEGORIES.forEach(([id]) => {\n const category = this.categories[id];\n if(!category) {\n return;\n }\n\n this.toggleLocalCategory(category, true);\n\n if(id !== EMOJI_RECENT_ID && id !== CUSTOM_EMOJI_RECENT_ID) {\n category.menuScroll = this.menuInnerScroll;\n this.menuInnerScroll.container.append(category.elements.menuTab);\n }\n });\n\n this.resizeCategories();\n\n recentCategory && innerScrollWrapper && recentCategory.elements.menuTab.after(innerScrollWrapper);\n\n sets.sets.forEach((set) => {\n this.renderStickerSet(set);\n });\n\n this.listenerSetter.add(rootScope)('premium_toggle', () => {\n this.toggleCustomCategory();\n });\n\n this.listenerSetter.add(rootScope)('stickers_top', this.postponedEvent((id) => {\n const category = this.categories[id];\n if(!category) {\n return;\n }\n\n this.positionCategory(category, true);\n\n this.listenerSetter.add(emoticonsDropdown)('openAfterLayout', () => {\n this.menuOnClickResult.setActiveStatic(category);\n }, {once: true});\n }));\n\n const toggleRenderers = (ignore: boolean) => {\n for(const id in this.categories) {\n const category = this.categories[id];\n const renderer = category.elements.renderer;\n if(renderer) {\n renderer.ignoreSettingDimensions = ignore;\n if(!ignore) {\n renderer.setDimensionsFromRect(undefined, true);\n }\n }\n }\n };\n\n !this.isStandalone && this.listenerSetter.add(emoticonsDropdown)('opened', () => {\n toggleRenderers(false);\n });\n\n !this.isStandalone && this.listenerSetter.add(emoticonsDropdown)('close', () => {\n toggleRenderers(true);\n });\n\n this.listenerSetter.add(rootScope)('stickers_installed', (set) => {\n if(!this.categories[set.id] && set.pFlags.emojis) {\n this.renderStickerSet(set, true);\n }\n });\n\n this.listenerSetter.add(rootScope)('stickers_deleted', (set) => {\n const category = this.categories[set.id];\n if(this.deleteCategory(category)) {\n const {renderer} = category.elements;\n if(renderer) {\n renderer.middlewareHelper.clean();\n }\n }\n });\n\n !this.isStandalone && this.listenerSetter.add(rootScope)('emoji_recent', this.postponedEvent((emoji) => {\n const category = this.categories[emoji.docId ? CUSTOM_EMOJI_RECENT_ID : EMOJI_RECENT_ID];\n if(!category) {\n return;\n }\n\n const verify: (item: EmojiTabItem) => boolean = emoji.docId ?\n (item) => item.docId === emoji.docId :\n (item) => item.emoji === emoji.emoji;\n const found = findAndSplice(category.items, verify);\n if(found) {\n category.items.unshift(found);\n if(this.isCategoryVisible(category)) {\n const {renderer} = category.elements;\n positionElementByIndex(found.element, category.elements.items, renderer ? 1 : 0, -1);\n renderer?.forceRender();\n }\n } else {\n this.addEmojiToCategory({\n category,\n emoji,\n batch: false,\n prepend: true\n });\n }\n\n if(this.closeScrollTop === 0) {\n this.menuOnClickResult.setActive(emoji.docId ? this.categories[EMOJI_RECENT_ID] : category);\n }\n }));\n\n !this.isStandalone && this.listenerSetter.add(appImManager)('peer_changed', () => {\n this.toggleCustomCategory();\n });\n\n this.toggleCustomCategory();\n\n this.menuOnClickResult.setActive(recentCategory ?? recentCustomCategory);\n });\n\n attachClickEvent(this.content, this.onContentClick, {listenerSetter: this.listenerSetter});\n attachStickerViewerListeners({listenTo: this.content, listenerSetter: this.listenerSetter});\n\n return promise;\n }\n\n private renderStickerSet(set: StickerSet.stickerSet, prepend?: boolean) {\n const category = this.createCategory(set, wrapEmojiText(set.title));\n this.positionCategory(category, prepend);\n const {container, menuTabPadding} = category.elements;\n category.elements.items.classList.add('not-local');\n category.elements.container.classList.add('is-premium-set');\n category.elements.title.classList.add('tgico');\n\n this.createRendererForCategory(category);\n\n const promise = this.managers.appStickersManager.getStickerSet(set);\n promise.then(({documents}) => {\n documents.forEach((document) => {\n this.addEmojiToCategory({\n category,\n emoji: {docId: document.id, emoji: (document as Document.document).stickerEmojiRaw},\n batch: true\n });\n });\n\n // if(this.isCategoryVisible(category)) {\n // category.elements.items.append(...category.items.map(({element}) => element));\n // }\n\n this.onCategoryVisibility({target: category.elements.container, visible: this.isCategoryVisible(category)});\n\n category.setCategoryItemsHeight();\n container.classList.remove('hide');\n });\n\n wrapStickerSetThumb({\n set,\n container: menuTabPadding,\n group: EMOTICONSSTICKERGROUP,\n lazyLoadQueue: EmoticonsDropdown.lazyLoadQueue,\n width: 32,\n height: 32,\n autoplay: false\n });\n }\n\n private get peerId() {\n return appImManager.chat.peerId;\n }\n\n public getCustomCategory() {\n return this.categories[CUSTOM_EMOJI_RECENT_ID];\n }\n\n private toggleCustomCategory() {\n const category = this.categories[CUSTOM_EMOJI_RECENT_ID];\n const hasPremium = rootScope.premium || this.peerId === rootScope.myId;\n const canSeeCustomCategory = hasPremium || this.isStandalone;\n super.toggleLocalCategory(category, !!category.items.length && canSeeCustomCategory);\n this.content.classList.toggle('has-premium', hasPremium);\n }\n\n protected toggleLocalCategory(category: EmojiTabCategory, visible: boolean) {\n if(category.id === CUSTOM_EMOJI_RECENT_ID) {\n this.toggleCustomCategory();\n return;\n }\n\n super.toggleLocalCategory(category, visible);\n }\n\n private createRendererForCategory(category: EmojiTabCategory) {\n const renderer = CustomEmojiRendererElement.create({\n animationGroup: EMOTICONSSTICKERGROUP,\n customEmojiSize: mediaSizes.active.esgCustomEmoji\n });\n\n category.elements.renderer = renderer;\n category.elements.items.append(renderer);\n }\n\n public addEmojiToCategory(options: {\n category: EmojiTabCategory,\n emoji?: ReturnType,\n element?: HTMLElement,\n batch?: boolean,\n prepend?: boolean,\n active?: boolean\n }) {\n const {category, emoji, batch, prepend} = options;\n let element = options.element;\n if(element) {\n const spanEmoji = document.createElement('span');\n spanEmoji.classList.add('super-emoji');\n spanEmoji.append(element);\n element = spanEmoji;\n } else if(emoji.docId) {\n const customEmojiElement = CustomEmojiElement.create(emoji.docId);\n const span = document.createElement('span');\n span.classList.add(/* 'emoji', */'super-emoji');\n span.append(customEmojiElement);\n element = span;\n } else {\n element = appendEmoji(emoji.emoji/* .replace(/[\\ufe0f\\u2640\\u2642\\u2695]/g, '') */, undefined, false/* , false */);\n }\n\n const item: typeof category['items'][0] = {\n ...(emoji || {emoji: undefined}),\n element\n };\n\n if(\n options.active || (\n this.activeEmoji && (\n item.docId ?\n this.activeEmoji.docId === item.docId :\n this.activeEmoji.emoji === item.emoji\n )\n )\n ) {\n this.activeEmoji === emoji;\n this.activeElements.push(item);\n element.classList.add('active');\n }\n\n category.items[prepend ? 'unshift' : 'push'](item);\n if(!batch && !this.spliceExceed(category)) {\n this.onLocalCategoryUpdate(category);\n }\n }\n\n // private addEmojisToCategory(category: EmojiTabCategory, emojis: string[], prepend?: boolean) {\n // emojis.forEach((emoji) => {\n // this.addEmojiToCategory(category, emoji, true, prepend);\n // });\n\n // this.onLocalCategoryUpdate(category);\n // }\n\n private onContentClick = (e: MouseEvent) => {\n cancelEvent(e);\n\n const {target} = e;\n\n const container = findUpClassName(target, 'emoji-category');\n const category = this.categoriesMap.get(container);\n if(findUpClassName(target, 'category-title')) {\n if(category.local) {\n return;\n }\n\n new PopupStickers({id: category.set.id, access_hash: category.set.access_hash}, true).show();\n return;\n }\n\n const emoji = getEmojiFromElement(target as HTMLElement);\n if(!emoji) {\n return;\n }\n\n if(\n emoji.docId &&\n !rootScope.premium && (\n this.isStandalone ? category.id !== CUSTOM_EMOJI_RECENT_ID : this.peerId !== rootScope.myId\n )\n ) {\n const a = document.createElement('a');\n a.onclick = () => {\n appImManager.openPremiumBot();\n hideToast();\n };\n toastNew({\n langPackKey: 'CustomEmoji.PremiumAlert',\n langPackArguments: [a]\n });\n return;\n }\n\n if(this.onClick) {\n this.onClick({\n ...emoji,\n element: findUpClassName(target, 'super-emoji').firstElementChild as HTMLElement\n });\n } else {\n appImManager.chat.input.onEmojiSelected(emoji, false);\n }\n\n if(IS_TOUCH_SUPPORTED) {\n blurActiveElement();\n }\n };\n\n public setActive(emoji: ReturnType) {\n if(\n emoji === this.activeEmoji ||\n emoji?.docId ? emoji.docId === this.activeEmoji?.docId : emoji?.emoji === this.activeEmoji?.emoji\n ) {\n return;\n }\n\n this.activeEmoji = emoji;\n\n this.activeElements.forEach((item) => {\n item.element.classList.remove('active');\n });\n\n this.activeElements.length = 0;\n\n this.categoriesMap.forEach((category) => {\n category.items.forEach((item) => {\n if(emoji.docId ? item.docId === emoji.docId : item.emoji === emoji.emoji) {\n item.element.classList.add('active');\n this.activeElements.push(item);\n }\n });\n });\n }\n\n public onClose() {\n this.closeScrollTop = this.scrollable.scrollTop;\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 getEmojiEntityFromEmoji from './getEmojiEntityFromEmoji';\nimport wrapRichText from './wrapRichText';\n\nexport default function wrapSingleEmoji(emoji: string) {\n return wrapRichText(emoji, {\n entities: [getEmojiEntityFromEmoji(emoji)]\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 indexOfAndSplice from '../helpers/array/indexOfAndSplice';\nimport LazyLoadQueueIntersector, {LazyLoadElement} from './lazyLoadQueueIntersector';\nimport VisibilityIntersector, {OnVisibilityChange} from './visibilityIntersector';\n\nexport default class LazyLoadQueueRepeat extends LazyLoadQueueIntersector {\n private elementsMap: Map = new Map();\n\n constructor(\n parallelLimit?: number,\n protected onVisibilityChange?: OnVisibilityChange,\n options?: IntersectionObserverInit\n ) {\n super(parallelLimit);\n\n this.intersector = new VisibilityIntersector((item) => {\n const {target, visible} = item;\n\n const queueItem = this.elementsMap.get(target);\n queueItem.visible = visible;\n\n if(visible) {\n queueItem.wasSeen = true;\n if(!this.queue.includes(queueItem)) {\n this.queue.push(queueItem);\n }\n } else {\n indexOfAndSplice(this.queue, queueItem);\n }\n\n this.onVisibilityChange?.(item);\n this.setProcessQueueTimeout();\n }, options);\n }\n\n public clear() {\n super.clear();\n this.elementsMap.clear();\n }\n\n /* public async processItem(item: LazyLoadElement) {\n //await super.processItem(item);\n await LazyLoadQueueBase.prototype.processItem.call(this, item);\n\n if(this.lazyLoadMedia.length) {\n this.processQueue();\n }\n } */\n\n public observe(el: LazyLoadElement) {\n this.elementsMap.set(el.div, el);\n super.observe(el);\n }\n\n public unobserve(el: LazyLoadElement) {\n this.elementsMap.delete(el.div);\n super.unobserve(el);\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 emoticonsDropdown, {EmoticonsDropdown, EMOTICONSSTICKERGROUP, EmoticonsTab} from '..';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport mediaSizes from '../../../helpers/mediaSizes';\nimport {Document, MessagesAllStickers, StickerSet} from '../../../layer';\nimport {MyDocument} from '../../../lib/appManagers/appDocsManager';\nimport {AppManagers} from '../../../lib/appManagers/managers';\nimport {i18n, LangPackKey} from '../../../lib/langPack';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport rootScope from '../../../lib/rootScope';\nimport animationIntersector, {AnimationItemGroup} from '../../animationIntersector';\nimport LazyLoadQueue from '../../lazyLoadQueue';\nimport LazyLoadQueueRepeat from '../../lazyLoadQueueRepeat';\nimport {putPreloader} from '../../putPreloader';\nimport PopupStickers from '../../popups/stickers';\nimport Scrollable, {ScrollableX} from '../../scrollable';\nimport findAndSplice from '../../../helpers/array/findAndSplice';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport positionElementByIndex from '../../../helpers/dom/positionElementByIndex';\nimport noop from '../../../helpers/noop';\nimport ButtonIcon from '../../buttonIcon';\nimport confirmationPopup from '../../confirmationPopup';\nimport VisibilityIntersector, {OnVisibilityChangeItem} from '../../visibilityIntersector';\nimport createStickersContextMenu from '../../../helpers/dom/createStickersContextMenu';\nimport findUpAsChild from '../../../helpers/dom/findUpAsChild';\nimport forEachReverse from '../../../helpers/array/forEachReverse';\nimport attachStickerViewerListeners from '../../stickerViewer';\nimport ListenerSetter from '../../../helpers/listenerSetter';\nimport wrapSticker from '../../wrappers/sticker';\nimport wrapStickerSetThumb from '../../wrappers/stickerSetThumb';\nimport {MediaSize} from '../../../helpers/mediaSize';\nimport {AnyFunction} from '../../../types';\nimport {IgnoreMouseOutType} from '../../../helpers/dropdownHover';\nimport customProperties from '../../../helpers/dom/customProperties';\nimport windowSize from '../../../helpers/windowSize';\n\nexport class SuperStickerRenderer {\n public lazyLoadQueue: LazyLoadQueueRepeat;\n private animated: Set = new Set();\n\n constructor(\n private regularLazyLoadQueue: LazyLoadQueue,\n private group: AnimationItemGroup,\n private managers: AppManagers,\n private options?: IntersectionObserverInit\n ) {\n this.lazyLoadQueue = new LazyLoadQueueRepeat(undefined, ({target, visible}) => {\n if(!visible) {\n this.processInvisible(target);\n }\n }, options);\n }\n\n public clear() {\n this.lazyLoadQueue.clear();\n }\n\n public renderSticker(doc: MyDocument, element?: HTMLElement, loadPromises?: Promise[]) {\n if(!element) {\n element = document.createElement('div');\n element.classList.add('grid-item', 'super-sticker');\n element.dataset.docId = '' + doc.id;\n\n if(doc.animated) {\n this.observeAnimated(element);\n }\n }\n\n // * This will wrap only a thumb\n /* !doc.animated && */wrapSticker({\n doc,\n div: element,\n lazyLoadQueue: this.regularLazyLoadQueue,\n group: this.group,\n onlyThumb: doc.animated,\n loadPromises\n });\n\n return element;\n }\n\n public observeAnimated(element: HTMLElement) {\n this.animated.add(element);\n this.lazyLoadQueue.observe({\n div: element,\n load: this.processVisible\n });\n }\n\n public unobserveAnimated(element: HTMLElement) {\n this.animated.delete(element);\n this.lazyLoadQueue.delete({div: element});\n }\n\n private checkAnimationContainer = (element: HTMLElement, visible: boolean) => {\n // console.error('checkAnimationContainer', div, visible);\n const players = animationIntersector.getAnimations(element);\n players.forEach((player) => {\n if(!visible) {\n animationIntersector.removeAnimation(player);\n } else {\n animationIntersector.checkAnimation(player, false);\n }\n });\n };\n\n private processVisible = async(element: HTMLElement) => {\n const docId = element.dataset.docId;\n const doc = await this.managers.appDocsManager.getDoc(docId);\n\n const size = mediaSizes.active.esgSticker.width;\n\n // console.log('processVisibleDiv:', element);\n\n const promise = wrapSticker({\n doc,\n div: element,\n width: size,\n height: size,\n lazyLoadQueue: null,\n group: this.group,\n onlyThumb: false,\n play: true,\n loop: true,\n withLock: true\n }).then(({render}) => render);\n\n promise.then(() => {\n // clearTimeout(timeout);\n this.checkAnimationContainer(element, this.lazyLoadQueue.intersector.isVisible(element));\n });\n\n /* let timeout = window.setTimeout(() => {\n console.error('processVisibleDiv timeout', div, doc);\n }, 1e3); */\n\n return promise;\n };\n\n public processInvisible = async(element: HTMLElement) => {\n const docId = element.dataset.docId;\n const doc = await this.managers.appDocsManager.getDoc(docId);\n\n // console.log('STICKER INvisible:', /* div, */docId);\n\n this.checkAnimationContainer(element, false);\n\n element.textContent = '';\n this.renderSticker(doc, element as HTMLDivElement);\n };\n}\n\nexport type StickersTabCategoryItem = {element: HTMLElement};\n\nexport class StickersTabCategory = {}> {\n public elements: {\n container: HTMLElement,\n title: HTMLElement,\n items: HTMLElement,\n menuTab: HTMLElement,\n menuTabPadding: HTMLElement\n } & AdditionalElements;\n public items: Item[];\n public mounted: boolean;\n public id: string;\n public limit: number;\n\n public getContainerSize: () => {width: number, height: number};\n private getElementMediaSize: () => MediaSize;\n\n private gapX: number;\n private gapY: number;\n\n public set?: StickerSet;\n public local?: boolean;\n public menuScroll?: ScrollableX;\n\n constructor(options: {\n id: string,\n title: HTMLElement | DocumentFragment,\n overflowElement: HTMLElement,\n getContainerSize: StickersTabCategory['getContainerSize'],\n getElementMediaSize: StickersTabCategory['getElementMediaSize'],\n gapX: number,\n gapY: number,\n noMenuTab?: boolean\n }) {\n const container = document.createElement('div');\n container.classList.add('emoji-category');\n\n const items = document.createElement('div');\n items.classList.add('category-items');\n\n let title: HTMLElement;\n if(options.title) {\n title = document.createElement('div');\n title.classList.add('category-title');\n title.append(options.title);\n }\n\n let menuTab: HTMLElement, menuTabPadding: HTMLElement;\n if(!options.noMenuTab) {\n menuTab = ButtonIcon(undefined, {noRipple: true});\n menuTab.classList.add('menu-horizontal-div-item');\n\n menuTabPadding = document.createElement('div');\n menuTabPadding.classList.add('menu-horizontal-div-item-padding');\n\n menuTab.append(menuTabPadding);\n }\n\n if(title) container.append(title);\n container.append(items);\n\n this.elements = {\n container,\n title,\n items,\n menuTab,\n menuTabPadding\n } as any;\n this.id = options.id;\n this.items = [];\n\n this.getContainerSize = options.getContainerSize;\n this.getElementMediaSize = options.getElementMediaSize;\n this.gapX = options.gapX ?? 0;\n this.gapY = options.gapY ?? 0;\n }\n\n public setCategoryItemsHeight() {\n const {width: containerWidth} = this.getContainerSize();\n const elementSize = this.getElementMediaSize().width;\n\n let itemsPerRow = containerWidth / elementSize;\n if(this.gapX) itemsPerRow -= Math.floor(itemsPerRow - 1) * this.gapX / elementSize;\n itemsPerRow = Math.floor(itemsPerRow);\n\n const rows = Math.ceil(this.items.length / itemsPerRow);\n let height = rows * elementSize;\n if(this.gapY) height += (rows - 1) * this.gapY;\n\n this.elements.items.style.minHeight = height + 'px';\n }\n}\n\nexport class EmoticonsTabC> implements EmoticonsTab {\n public content: HTMLElement;\n public menuScroll: ScrollableX;\n public container: HTMLElement;\n public menuWrapper: HTMLElement;\n public menu: HTMLElement;\n\n protected categories: {[id: string]: Category};\n protected categoriesMap: Map;\n protected categoriesByMenuTabMap: Map;\n protected categoriesIntersector: VisibilityIntersector;\n protected localCategories: Category[];\n\n protected listenerSetter: ListenerSetter;\n\n public scrollable: Scrollable;\n protected mounted = false;\n protected menuOnClickResult: ReturnType;\n\n public tabId: number;\n\n protected postponedEvents: {cb: AnyFunction, args: any[]}[];\n\n public getContainerSize: Category['getContainerSize'];\n\n constructor(\n protected managers: AppManagers,\n protected categoryItemsClassName: string,\n protected getElementMediaSize: () => MediaSize,\n protected padding: number,\n protected gapX: number,\n protected gapY: number\n ) {\n this.categories = {};\n this.categoriesMap = new Map();\n this.categoriesByMenuTabMap = new Map();\n this.localCategories = [];\n this.postponedEvents = [];\n\n this.listenerSetter = new ListenerSetter();\n\n this.container = document.createElement('div');\n this.container.classList.add('tabs-tab', 'emoticons-container');\n\n this.menuWrapper = document.createElement('div');\n this.menuWrapper.classList.add('menu-wrapper', 'emoticons-menu-wrapper');\n\n this.menu = document.createElement('nav');\n this.menu.className = 'menu-horizontal-div no-stripe justify-start emoticons-menu';\n\n this.menuWrapper.append(this.menu);\n this.menuScroll = new ScrollableX(this.menuWrapper);\n\n this.content = document.createElement('div');\n this.content.classList.add('emoticons-content');\n\n this.container.append(this.menuWrapper, this.content);\n\n this.scrollable = new Scrollable(this.content, 'STICKERS');\n }\n\n public getCategoryByContainer(container: HTMLElement) {\n return this.categoriesMap.get(container);\n }\n\n public getCategoryByMenuTab(menuTab: HTMLElement) {\n return this.categoriesByMenuTabMap.get(menuTab);\n }\n\n protected createCategory(stickerSet: StickerSet, title: HTMLElement | DocumentFragment, isLocal?: boolean, noMenuTab?: boolean) {\n const category: Category = new StickersTabCategory({\n id: '' + stickerSet.id,\n title,\n overflowElement: this.content,\n getContainerSize: () => {\n let width: number, height: number;\n if(this.getContainerSize) {\n const size = this.getContainerSize();\n width = size.width;\n height = size.height;\n } else {\n const esgWidth = customProperties.getPropertyAsSize('esg-width');\n width = esgWidth === undefined ? windowSize.width : esgWidth;\n }\n\n return {width: width - this.padding, height};\n },\n getElementMediaSize: this.getElementMediaSize,\n gapX: this.gapX,\n gapY: this.gapY,\n noMenuTab\n }) as any;\n\n if(this.categoryItemsClassName) {\n category.elements.items.classList.add(this.categoryItemsClassName);\n }\n\n const container = category.elements.container;\n container.classList.add('hide');\n\n category.set = stickerSet;\n this.categories[stickerSet.id] = category;\n this.categoriesMap.set(container, category);\n !noMenuTab && this.categoriesByMenuTabMap.set(category.elements.menuTab, category);\n\n this.categoriesIntersector.observe(container);\n !noMenuTab && this.menuOnClickResult.stickyIntersector.observeStickyHeaderChanges(container);\n\n if(!isLocal) {\n !noMenuTab && category.elements.menuTab.classList.add('not-local');\n }\n\n return category;\n }\n\n protected positionCategory(category: Category, prepend?: boolean) {\n const {menuTab, container} = category.elements;\n const posItems = prepend ? this.localCategories.filter((category) => category.mounted).length : 0xFFFF;\n let foundMenuScroll = false;\n const posMenu = prepend ? this.localCategories.filter((category) => {\n if(category.menuScroll && !foundMenuScroll) {\n foundMenuScroll = true;\n return true;\n }\n\n return category.mounted && !category.menuScroll && category.elements.menuTab;\n }).length : 0xFFFF;\n positionElementByIndex(container, this.scrollable.container, posItems);\n positionElementByIndex(menuTab, this.menu, posMenu);\n }\n\n protected isCategoryVisible(category: Category) {\n return this.categoriesIntersector.getVisible().includes(category.elements.container);\n }\n\n protected toggleLocalCategory(category: Category, visible: boolean) {\n if(!visible) {\n category.elements.menuTab?.remove();\n category.elements.container.remove();\n } else {\n const idx = this.localCategories.indexOf(category);\n const sliced = this.localCategories.slice(0, idx);\n let notMountedItems = 0, notMountedMenus = 0;\n sliced.forEach((category) => {\n if(!category.mounted) {\n ++notMountedItems;\n ++notMountedMenus;\n } else if(!category.elements.menuTab || category.menuScroll) {\n ++notMountedMenus;\n }\n });\n const itemsIdx = idx - notMountedItems, menuIdx = idx - notMountedMenus;\n category.elements.menuTab && positionElementByIndex(category.elements.menuTab, this.menu, menuIdx);\n positionElementByIndex(category.elements.container, this.scrollable.container, itemsIdx);\n }\n\n category.mounted = visible;\n // category.elements.container.classList.toggle('hide', !visible);\n }\n\n protected createLocalCategory(id: string, title: LangPackKey | '', icon?: string, noMenuTab?: boolean) {\n const category = this.createCategory({id} as any, title && i18n(title), true, noMenuTab);\n category.local = true;\n this.localCategories.push(category);\n if(category.elements.title) {\n category.elements.title.classList.add('disable-hover');\n }\n\n if(!noMenuTab) {\n if(icon) {\n category.elements.menuTab.classList.add('tgico', 'tgico-' + icon);\n }\n\n category.elements.menuTabPadding.remove();\n }\n\n this.toggleLocalCategory(category, false);\n return category;\n }\n\n protected onLocalCategoryUpdate(category: Category) {\n category.setCategoryItemsHeight();\n this.toggleLocalCategory(category, !!category.items.length);\n }\n\n protected resizeCategories = () => {\n for(const [container, category] of this.categoriesMap) {\n category.setCategoryItemsHeight();\n }\n };\n\n protected deleteCategory(category: Category) {\n if(category) {\n category.elements.container.remove();\n category.elements.menuTab.remove();\n this.categoriesIntersector.unobserve(category.elements.container);\n delete this.categories[category.id];\n this.categoriesMap.delete(category.elements.container);\n this.categoriesByMenuTabMap.delete(category.elements.menuTab);\n\n return true;\n }\n\n return false;\n }\n\n protected spliceExceed(category: Category) {\n if(category.limit === undefined) {\n return false;\n }\n\n const {items, limit} = category;\n items.splice(limit, items.length - limit).forEach(({element}) => {\n element.remove();\n });\n\n this.onLocalCategoryUpdate(category);\n\n return true;\n }\n\n public init() {\n this.listenerSetter.add(emoticonsDropdown)('closed', () => {\n this.postponedEvents.forEach(({cb, args}) => {\n cb(...args);\n });\n\n this.postponedEvents.length = 0;\n });\n }\n\n public destroy() {\n this.getContainerSize = undefined;\n this.postponedEvents.length = 0;\n this.categoriesIntersector?.disconnect();\n this.listenerSetter.removeAll();\n this.scrollable.destroy();\n this.menuScroll?.destroy();\n this.menuOnClickResult?.stickyIntersector?.disconnect();\n }\n\n protected postponedEvent = (cb: (...args: K[]) => void) => {\n return (...args: K[]) => {\n if(emoticonsDropdown.isActive()) {\n this.postponedEvents.push({cb, args});\n } else {\n cb(...args);\n }\n };\n };\n}\n\ntype StickersTabItem = {element: HTMLElement, document: Document.document};\nexport default class StickersTab extends EmoticonsTabC> {\n private superStickerRenderer: SuperStickerRenderer;\n\n constructor(managers: AppManagers) {\n super(\n managers,\n 'super-stickers',\n () => mediaSizes.active.esgSticker,\n 3 * 2,\n 4,\n 4\n );\n\n this.container.classList.add('stickers-padding');\n this.content.id = 'content-stickers';\n }\n\n private setFavedLimit(limit: number) {\n const category = this.categories['faved'];\n category.limit = limit;\n }\n\n private categoryAppendStickers(\n category: StickersTabCategory,\n promise: Promise\n ) {\n const {container} = category.elements;\n\n promise.then((documents) => {\n const isVisible = this.isCategoryVisible(category);\n\n documents.forEach((document) => {\n const element = this.superStickerRenderer.renderSticker(document);\n category.items.push({document, element});\n\n if(isVisible) {\n category.elements.items.append(element);\n }\n });\n\n category.setCategoryItemsHeight();\n container.classList.remove('hide');\n });\n }\n\n private async renderStickerSet(set: StickerSet.stickerSet, prepend = false) {\n const category = this.createCategory(set, wrapEmojiText(set.title));\n const {menuTabPadding} = category.elements;\n\n const promise = this.managers.appStickersManager.getStickerSet(set);\n this.categoryAppendStickers(\n category,\n promise.then((stickerSet) => stickerSet.documents as MyDocument[])\n );\n\n this.positionCategory(category, prepend);\n\n wrapStickerSetThumb({\n set,\n container: menuTabPadding,\n group: EMOTICONSSTICKERGROUP,\n lazyLoadQueue: EmoticonsDropdown.lazyLoadQueue,\n width: 32,\n height: 32,\n autoplay: false\n });\n }\n\n private onCategoryVisibility = ({target, visible, entry}: OnVisibilityChangeItem) => {\n const category = this.categoriesMap.get(target);\n category.elements.items.replaceChildren(...(!visible ? [] : category.items.map(({element}) => element)));\n };\n\n public init() {\n super.init();\n\n this.scrollable.onAdditionalScroll = () => {\n this.setTyping();\n };\n\n /* stickersDiv.addEventListener('mouseover', (e) => {\n let target = e.target as HTMLElement;\n\n if(target.tagName === 'CANVAS') { // turn on sticker\n let animation = lottieLoader.getAnimation(target.parentElement, EMOTICONSSTICKERGROUP);\n\n if(animation) {\n // @ts-ignore\n if(animation.currentFrame === animation.totalFrames - 1) {\n animation.goToAndPlay(0, true);\n } else {\n animation.play();\n }\n }\n }\n }); */\n\n const intersectionOptions: IntersectionObserverInit = {root: emoticonsDropdown.getElement()};\n this.categoriesIntersector = new VisibilityIntersector(this.onCategoryVisibility, intersectionOptions);\n\n const clearCategoryItems = (category: StickersTabCategory) => {\n category.elements.items.replaceChildren();\n category.items.forEach(({element}) => this.superStickerRenderer.unobserveAnimated(element));\n category.items.length = 0;\n };\n\n this.scrollable.container.addEventListener('click', (e) => {\n const target = e.target as HTMLElement;\n if(findUpClassName(target, 'category-title')) {\n const container = findUpClassName(target, 'emoji-category');\n const category = this.categoriesMap.get(container);\n if(category.local) {\n return;\n }\n\n new PopupStickers({id: category.set.id, access_hash: category.set.access_hash}).show();\n return;\n }\n\n EmoticonsDropdown.onMediaClick(e);\n });\n\n this.menuOnClickResult = EmoticonsDropdown.menuOnClick(this, this.menu, this.scrollable, this.menuScroll);\n\n const preloader = putPreloader(this.content, true);\n\n const onCategoryStickers = (category: StickersTabCategory, stickers: MyDocument[]) => {\n // if(category.id === 'faved' && category.limit && category.limit < stickers.length) {\n // category.limit = stickers.length;\n // }\n\n if(category.limit) {\n stickers = stickers.slice(0, category.limit);\n }\n\n const ids = new Set(stickers.map((doc) => doc.id));\n forEachReverse(category.items, (item) => {\n if(!ids.has(item.document.id)) {\n this.deleteSticker(category, item.document, true);\n }\n });\n\n this.toggleLocalCategory(category, !!stickers.length);\n forEachReverse(stickers, (doc, idx) => {\n this.unshiftSticker(category, doc, true, idx);\n });\n this.spliceExceed(category);\n category.elements.container.classList.remove('hide');\n };\n\n const favedCategory = this.createLocalCategory('faved', 'FavoriteStickers', 'savedmessages');\n // favedCategory.elements.menuTab.classList.add('active');\n\n const recentCategory = this.createLocalCategory('recent', 'Stickers.Recent', 'recent');\n recentCategory.limit = 20;\n\n const clearButton = ButtonIcon('close', {noRipple: true});\n recentCategory.elements.title.append(clearButton);\n attachClickEvent(clearButton, () => {\n confirmationPopup({\n titleLangKey: 'ClearRecentStickersAlertTitle',\n descriptionLangKey: 'ClearRecentStickersAlertMessage',\n button: {\n langKey: 'Clear'\n }\n }).then(() => {\n this.managers.appStickersManager.clearRecentStickers();\n }, noop);\n });\n\n const premiumCategory = this.createLocalCategory('premium', 'PremiumStickersShort');\n const s = document.createElement('span');\n s.classList.add('tgico-star', 'color-premium');\n premiumCategory.elements.menuTab.append(s);\n\n const promises = [\n Promise.all([\n this.managers.apiManager.getLimit('favedStickers'),\n this.managers.appStickersManager.getFavedStickersStickers()\n ]).then(([limit, stickers]) => {\n this.setFavedLimit(limit);\n onCategoryStickers(favedCategory, stickers);\n }),\n\n this.managers.appStickersManager.getRecentStickersStickers().then((stickers) => {\n onCategoryStickers(recentCategory, stickers);\n }),\n\n this.managers.appStickersManager.getAllStickers().then((res) => {\n for(const set of (res as MessagesAllStickers.messagesAllStickers).sets) {\n this.renderStickerSet(set);\n }\n }),\n\n this.managers.appStickersManager.getPremiumStickers().then((stickers) => {\n const length = stickers.length;\n this.toggleLocalCategory(premiumCategory, rootScope.premium && !!length);\n this.categoryAppendStickers(premiumCategory, Promise.resolve(stickers));\n\n rootScope.addEventListener('premium_toggle', (isPremium) => {\n this.toggleLocalCategory(this.categories['premium'], isPremium && !!length);\n });\n })\n ];\n\n Promise.race(promises).finally(() => {\n preloader.remove();\n });\n\n Promise.all(promises).finally(() => {\n this.mounted = true;\n this.setTyping();\n\n const favedCategory = this.categories['faved'];\n const recentCategory = this.categories['recent'];\n this.menuOnClickResult.setActive(favedCategory.items.length ? favedCategory : recentCategory);\n\n rootScope.addEventListener('stickers_installed', (set) => {\n if(!this.categories[set.id]) {\n this.renderStickerSet(set, true);\n }\n });\n });\n\n this.superStickerRenderer = new SuperStickerRenderer(EmoticonsDropdown.lazyLoadQueue, EMOTICONSSTICKERGROUP, this.managers, intersectionOptions);\n\n const rendererLazyLoadQueue = this.superStickerRenderer.lazyLoadQueue;\n emoticonsDropdown.addLazyLoadQueueRepeat(rendererLazyLoadQueue, this.superStickerRenderer.processInvisible);\n\n // emoticonsDropdown.addEventListener('close', () => {\n // this.categoriesIntersector.lock();\n // });\n\n // emoticonsDropdown.addEventListener('closed', () => {\n // for(const [container] of this.categoriesMap) {\n // onCategoryVisibility(container, false);\n // }\n // });\n\n // emoticonsDropdown.addEventListener('opened', () => {\n // this.categoriesIntersector.unlockAndRefresh();\n // });\n\n // setInterval(() => {\n // // @ts-ignore\n // const players = Object.values(lottieLoader.players).filter((p) => p.width >= 80);\n\n // console.log(\n // 'STICKERS RENDERED IN PANEL:',\n // players.length,\n // players.filter((p) => !p.paused).length,\n // rendererLazyLoadQueue.intersector.getVisible().length\n // );\n // }, .25e3);\n\n rootScope.addEventListener('sticker_updated', ({type, document, faved}) => {\n // if(type === 'faved') {\n // return;\n // }\n\n const category = this.categories[type === 'faved' ? 'faved' : 'recent'];\n if(category) {\n if(faved) {\n this.unshiftSticker(category, document);\n } else {\n this.deleteSticker(category, document);\n }\n }\n });\n\n rootScope.addEventListener('stickers_deleted', ({id}) => {\n const category = this.categories[id];\n if(this.deleteCategory(category)) {\n clearCategoryItems(category);\n }\n });\n\n rootScope.addEventListener('stickers_top', this.postponedEvent((id) => {\n const category = this.categories[id];\n if(category) {\n this.positionCategory(category, true);\n emoticonsDropdown.addEventListener('openAfterLayout', () => {\n this.menuOnClickResult.setActiveStatic(category);\n }, {once: true});\n }\n }));\n\n rootScope.addEventListener('stickers_updated', ({type, stickers}) => {\n const category = this.categories[type === 'faved' ? 'faved' : 'recent'];\n if(category) {\n onCategoryStickers(category, stickers);\n }\n });\n\n rootScope.addEventListener('app_config', () => {\n this.managers.apiManager.getLimit('favedStickers').then((limit) => {\n this.setFavedLimit(limit);\n });\n });\n\n mediaSizes.addEventListener('resize', this.resizeCategories);\n\n attachStickerViewerListeners({listenTo: this.content, listenerSetter: new ListenerSetter()});\n\n const type: IgnoreMouseOutType = 'menu';\n createStickersContextMenu({\n listenTo: this.content,\n verifyRecent: (target) => !!findUpAsChild(target, this.categories['recent'].elements.items),\n onOpen: () => {\n emoticonsDropdown.setIgnoreMouseOut(type, true);\n },\n onClose: () => {\n emoticonsDropdown.setIgnoreMouseOut(type, false);\n }\n });\n\n this.init = null;\n }\n\n public deleteSticker(category: StickersTabCategory, doc: MyDocument, batch?: boolean) {\n const item = findAndSplice(category.items, (item) => item.document.id === doc.id);\n if(item) {\n item.element.remove();\n\n if(!batch) {\n this.onLocalCategoryUpdate(category);\n }\n }\n }\n\n public unshiftSticker(category: StickersTabCategory, doc: MyDocument, batch?: boolean, idx?: number) {\n if(idx !== undefined) {\n const i = category.items[idx];\n if(i && i.document.id === doc.id) {\n return;\n }\n }\n\n let item = findAndSplice(category.items, (item) => item.document.id === doc.id);\n if(!item) {\n item = {\n element: this.superStickerRenderer.renderSticker(doc),\n document: doc\n };\n }\n\n category.items.unshift(item);\n category.elements.items.prepend(item.element);\n\n if(!batch) {\n this.spliceExceed(category);\n }\n }\n\n public unshiftRecentSticker(doc: MyDocument) {\n this.managers.appStickersManager.saveRecentSticker(doc.id);\n }\n\n public deleteRecentSticker(doc: MyDocument) {\n this.managers.appStickersManager.saveRecentSticker(doc.id, true);\n }\n\n public setTyping = (cancel = false) => {\n if(!cancel && (!emoticonsDropdown.isActive() || emoticonsDropdown.tab !== this)) {\n return;\n }\n\n rootScope.dispatchEvent('choosing_sticker', !cancel);\n };\n\n public onClosed() {\n this.setTyping(true);\n }\n\n public onOpened() {\n this.setTyping();\n this.resizeCategories();\n }\n}\n","export const generateDelimiter = () => {\n const delimiter = document.createElement('div');\n delimiter.classList.add('gradient-delimiter');\n return delimiter;\n};\n","import {_i18n} from '../lib/langPack';\n\nexport default function generateFakeIcon(isScam?: boolean) {\n const span = document.createElement('span');\n span.classList.add('badge-fake');\n _i18n(span, isScam ? 'ScamMessage' : 'FakeMessage');\n return span;\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 findAndSpliceAll from '../helpers/array/findAndSpliceAll';\nimport LazyLoadQueueIntersector, {LazyLoadElement} from './lazyLoadQueueIntersector';\nimport VisibilityIntersector, {OnVisibilityChange} from './visibilityIntersector';\n\nexport default class LazyLoadQueueRepeat2 extends LazyLoadQueueIntersector {\n constructor(parallelLimit?: number, protected onVisibilityChange?: OnVisibilityChange) {\n super(parallelLimit);\n\n this.intersector = new VisibilityIntersector((item) => {\n const {target, visible} = item;\n const spliced = findAndSpliceAll(this.queue, (i) => i.div === target);\n if(visible && spliced.length) {\n spliced.forEach((item) => {\n this.queue.unshift(item);\n });\n }\n\n this.onVisibilityChange && this.onVisibilityChange(item);\n this.setProcessQueueTimeout();\n });\n }\n\n public observe(el: LazyLoadElement) {\n super.observe(el);\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 {MyDocument} from '../lib/appManagers/appDocsManager';\nimport animationIntersector, {AnimationItemGroup} from './animationIntersector';\nimport Scrollable from './scrollable';\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport calcImageInBox from '../helpers/calcImageInBox';\nimport {doubleRaf} from '../helpers/schedulers';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport rootScope from '../lib/rootScope';\nimport LazyLoadQueueRepeat2 from './lazyLoadQueueRepeat2';\nimport wrapVideo from './wrappers/video';\nimport noop from '../helpers/noop';\n\nconst width = 400;\nconst maxSingleWidth = width - 100;\nconst height = 100;\n\nexport default class GifsMasonry {\n public lazyLoadQueue: LazyLoadQueueRepeat2;\n private scrollPromise: CancellablePromise = Promise.resolve();\n private timeout: number = 0;\n private managers: AppManagers;\n\n constructor(\n private element: HTMLElement,\n private group: AnimationItemGroup,\n private scrollable: Scrollable,\n attach = true\n ) {\n this.managers = rootScope.managers;\n\n this.lazyLoadQueue = new LazyLoadQueueRepeat2(undefined, ({target, visible}) => {\n if(visible) {\n this.processVisibleDiv(target);\n } else {\n this.processInvisibleDiv(target);\n }\n });\n\n /* setInterval(() => {\n // @ts-ignore\n const players = animationIntersector.byGroups[group];\n\n if(players) {\n console.log(`GIFS RENDERED IN ${group}:`, players.length, players.filter((p) => !p.animation.paused).length, this.lazyLoadQueue.intersector.getVisible().length);\n }\n }, .25e3); */\n\n if(attach) {\n this.attach();\n }\n }\n\n private onScroll = () => {\n if(this.timeout) {\n clearTimeout(this.timeout);\n } else {\n this.scrollPromise = deferredPromise();\n // animationIntersector.checkAnimations(true, group);\n }\n\n this.timeout = window.setTimeout(() => {\n this.timeout = 0;\n this.scrollPromise.resolve();\n // animationIntersector.checkAnimations(false, group);\n }, 150);\n };\n\n public attach() {\n this.scrollable.container.addEventListener('scroll', this.onScroll);\n }\n\n public detach() {\n this.clear();\n this.scrollable.container.removeEventListener('scroll', this.onScroll);\n }\n\n public clear() {\n this.lazyLoadQueue.clear();\n }\n\n private processVisibleDiv(div: HTMLElement) {\n const video = div.querySelector('video');\n if(video) {\n return;\n }\n\n const load = () => {\n const docId = div.dataset.docId;\n const promise = Promise.all([this.managers.appDocsManager.getDoc(docId), this.scrollPromise]).then(async([doc]) => {\n const res = await wrapVideo({\n doc,\n container: div as HTMLDivElement,\n lazyLoadQueue: null,\n // lazyLoadQueue: EmoticonsDropdown.lazyLoadQueue,\n group: this.group,\n noInfo: true,\n noPreview: true\n });\n\n const promise = res.loadPromise;\n promise.finally(() => {\n const video = div.querySelector('video');\n const thumb = div.querySelector('img, canvas');\n\n // div.style.opacity = '';\n thumb && thumb.classList.add('hide');\n\n if(video && !video.parentElement) {\n setTimeout(() => {\n video.src = '';\n video.load();\n const animations = animationIntersector.getAnimations(video);\n animations.forEach((item) => {\n animationIntersector.removeAnimation(item);\n });\n }, 0);\n }\n\n // clearTimeout(timeout);\n if(!this.lazyLoadQueue.intersector.isVisible(div)) {\n this.processInvisibleDiv(div);\n }\n });\n\n return promise;\n });\n\n /* let timeout = window.setTimeout(() => {\n console.error('processVisibleDiv timeout', div, doc);\n }, 1e3); */\n\n return promise;\n };\n\n // return load();\n\n this.lazyLoadQueue.push({div, load});\n }\n\n public processInvisibleDiv = (div: HTMLElement) => {\n return this.scrollPromise.then(async() => {\n // return;\n\n if(this.lazyLoadQueue.intersector.isVisible(div)) {\n return;\n }\n\n const video = div.querySelector('video');\n const thumb = div.querySelector('img, canvas');\n\n if(thumb) {\n thumb.classList.remove('hide');\n\n await doubleRaf();\n }\n\n if(this.lazyLoadQueue.intersector.isVisible(div)) {\n return;\n }\n\n if(video) {\n video.remove();\n video.src = '';\n video.load();\n const animations = animationIntersector.getAnimations(video);\n animations.forEach((item) => {\n animationIntersector.removeAnimation(item);\n });\n }\n });\n };\n\n public add(doc: MyDocument, appendTo = this.element) {\n // let gifWidth = doc.w;\n // let gifHeight = doc.h;\n // if(gifHeight < height) {\n // gifWidth = height / gifHeight * gifWidth;\n // gifHeight = height;\n // }\n\n // const willUseWidth = Math.min(maxSingleWidth, width, gifWidth);\n // const size = calcImageInBox(gifWidth, gifHeight, willUseWidth, height);\n\n const div = document.createElement('div');\n div.classList.add('gif', 'grid-item'/* , 'fade-in-transition' */);\n // div.style.width = size.width + 'px';\n // div.style.opacity = '0';\n // div.style.height = h + 'px';\n div.dataset.docId = '' + doc.id;\n\n appendTo.append(div);\n\n this.lazyLoadQueue.observe({div, load: noop as any});\n\n // let preloader = new ProgressivePreloader(div);\n\n wrapVideo({\n doc,\n container: div as HTMLDivElement,\n lazyLoadQueue: null,\n noInfo: true,\n onlyPreview: true\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 TransitionSlider from './transition';\nimport {ScrollableX} from './scrollable';\nimport rootScope from '../lib/rootScope';\nimport {fastRaf} from '../helpers/schedulers';\nimport {FocusDirection} from '../helpers/fastSmoothScroll';\nimport findUpAsChild from '../helpers/dom/findUpAsChild';\nimport whichChild from '../helpers/dom/whichChild';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\n\nexport function horizontalMenu(\n tabs: HTMLElement,\n content: HTMLElement,\n onClick?: (id: number, tabContent: HTMLDivElement, animate: boolean) => void | boolean | Promise,\n onTransitionEnd?: () => void,\n transitionTime = 200,\n scrollableX?: ScrollableX,\n listenerSetter?: ListenerSetter\n) {\n const selectTab = TransitionSlider({\n content,\n type: tabs || content.dataset.animation === 'tabs' ? 'tabs' : 'navigation',\n transitionTime,\n onTransitionEnd,\n listenerSetter\n });\n\n if(!tabs) {\n return selectTab;\n }\n\n const proxy = new Proxy(selectTab, {\n apply: (target, that, args) => {\n const id = +args[0];\n const animate = args[1] !== undefined ? args[1] : true;\n\n const el = (tabs.querySelector(`[data-tab=\"${id}\"]`) || tabs.children[id]) as HTMLElement;\n selectTarget(el, id, animate);\n }\n });\n\n const selectTarget = async(target: HTMLElement, id: number, animate = true) => {\n const tabContent = content.children[id] as HTMLDivElement;\n\n if(onClick) {\n const result1 = onClick(id, tabContent, animate);\n const canChange = result1 instanceof Promise ? await result1 : result1;\n if(canChange !== undefined && !canChange) {\n return;\n }\n }\n\n if(scrollableX) {\n scrollableX.scrollIntoViewNew({\n element: target.parentElement.children[id] as HTMLElement,\n position: 'center',\n forceDirection: animate ? undefined : FocusDirection.Static,\n forceDuration: transitionTime,\n axis: 'x'\n });\n }\n\n if(!rootScope.settings.animationsEnabled) {\n animate = false;\n }\n\n const prevId = selectTab.prevId();\n if(target.classList.contains('active') || id === prevId) {\n return false;\n }\n\n const mutateCallback = animate ? fastRaf : (cb: () => void) => cb();\n\n const prev = tabs.querySelector(tagName.toLowerCase() + '.active') as HTMLElement;\n if(prev) {\n mutateCallback(() => {\n prev.classList.remove('active');\n });\n }\n\n // a great stripe from Jolly Cobra\n if(useStripe && prevId !== -1 && animate) {\n mutateCallback(() => {\n const indicator = target.querySelector('i')!;\n const currentIndicator = target.parentElement.children[prevId].querySelector('i')!;\n\n currentIndicator.classList.remove('animate');\n indicator.classList.remove('animate');\n\n // We move and resize our indicator so it repeats the position and size of the previous one.\n const shiftLeft = currentIndicator.parentElement.parentElement.offsetLeft - indicator.parentElement.parentElement.offsetLeft;\n const scaleFactor = currentIndicator.clientWidth / indicator.clientWidth;\n indicator.style.transform = `translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`;\n\n // console.log(`translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`);\n\n fastRaf(() => {\n // Now we remove the transform to let it animate to its own position and size.\n indicator.classList.add('animate');\n indicator.style.transform = 'none';\n });\n });\n }\n\n mutateCallback(() => {\n target.classList.add('active');\n });\n\n selectTab(id, animate);\n };\n\n const useStripe = !tabs.classList.contains('no-stripe');\n\n // const tagName = tabs.classList.contains('menu-horizontal-div') ? 'BUTTON' : 'LI';\n const tagName = tabs.firstElementChild.tagName;\n attachClickEvent(tabs, (e) => {\n let target = e.target as HTMLElement;\n\n target = findUpAsChild(target, tabs);\n\n // console.log('tabs click:', target);\n\n if(!target) return false;\n\n let id: number;\n if(target.dataset.tab) {\n id = +target.dataset.tab;\n if(id === -1) {\n return false;\n }\n } else {\n id = whichChild(target);\n }\n\n selectTarget(target, id);\n }, {listenerSetter});\n\n return proxy;\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 simulateEvent from '../helpers/dom/dispatchEvent';\nimport documentFragmentToHTML from '../helpers/dom/documentFragmentToHTML';\nimport findUpAttribute from '../helpers/dom/findUpAttribute';\nimport findUpTag from '../helpers/dom/findUpTag';\nimport getCaretPosNew from '../helpers/dom/getCaretPosNew';\nimport getRichValueWithCaret from '../helpers/dom/getRichValueWithCaret';\nimport isInputEmpty from '../helpers/dom/isInputEmpty';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport RichInputHandler, {USING_BOMS} from '../helpers/dom/richInputHandler';\nimport selectElementContents from '../helpers/dom/selectElementContents';\nimport setInnerHTML, {setDirection} from '../helpers/dom/setInnerHTML';\nimport {MessageEntity} from '../layer';\nimport {i18n, LangPackKey, _i18n} from '../lib/langPack';\nimport {NULL_PEER_ID} from '../lib/mtproto/mtproto_config';\nimport mergeEntities from '../lib/richTextProcessor/mergeEntities';\nimport parseEntities from '../lib/richTextProcessor/parseEntities';\nimport wrapDraftText from '../lib/richTextProcessor/wrapDraftText';\nimport {createCustomFiller, CustomEmojiElement, CustomEmojiRendererElement, insertCustomFillers, renderEmojis} from '../lib/richTextProcessor/wrapRichText';\n\nexport async function insertRichTextAsHTML(input: HTMLElement, text: string, entities: MessageEntity[], wrappingForPeerId: PeerId) {\n const loadPromises: Promise[] = [];\n const wrappingCustomEmoji = entities?.some((entity) => entity._ === 'messageEntityCustomEmoji');\n const renderer = wrappingCustomEmoji ? createCustomEmojiRendererForInput() : undefined;\n const fragment = wrapDraftText(text, {entities, wrappingForPeerId, loadPromises, customEmojiRenderer: renderer});\n const something = fragment.querySelectorAll('[contenteditable=\"false\"]');\n something.forEach((el) => {\n el.contentEditable = 'inherit';\n el.classList.add('pc');\n });\n\n loadPromises.length && await Promise.all(loadPromises);\n\n fragment.querySelectorAll('.input-selectable').forEach((el) => {\n el.prepend(createCustomFiller(true));\n });\n\n const richInputHandler = USING_BOMS ? RichInputHandler.getInstance() : undefined;\n // const restore = richInputHandler.prepareApplyingMarkdown();\n\n // fragment.querySelectorAll('.input-filler').forEach((el) => el.remove());\n\n // const fillers = Array.from(input.querySelectorAll('.input-filler')).map((el) => {\n // el.contentEditable = 'false';\n // return el;\n // });\n\n const customEmojiElements = Array.from(fragment.querySelectorAll('.custom-emoji-placeholder')).map((el) => {\n el.dataset.ces = '1';\n return (el as any).customEmojiElement as CustomEmojiElement;\n });\n\n const html = documentFragmentToHTML(fragment);\n renderer?.destroy();\n\n // console.log(html);\n\n const pre = getCaretPosNew(input);\n // console.log('pre', pre);\n let textNode: ChildNode, textNodeValue: string;\n if(pre.node) {\n // if(pre.node?.nodeValue === BOM && false) {\n // textNode = document.createTextNode(textNodeValue = BOM);\n // (pre.node.parentNode as any as ChildNode).after(textNode);\n // pre.selection.modify('extend', 'forward', 'character');\n // pre.selection.collapseToEnd();\n // }\n } else {\n const range = document.createRange();\n let node = input.lastChild;\n if(!node) {\n input.append(node /* = textNode */ = document.createTextNode(''));\n }\n\n range.setStartAfter(node);\n range.collapse(true);\n pre.selection.removeAllRanges();\n pre.selection.addRange(range);\n }\n\n // const fragmentLastChild = fragment.lastChild;\n\n // const s = document.createElement('span');\n // (node as ChildNode).replaceWith(s);\n // s.append(node);\n input.addEventListener('input', cancelEvent, {capture: true, once: true, passive: false});\n richInputHandler?.onBeforeInput({inputType: 'insertContent'});\n window.document.execCommand('insertHTML', false, html);\n Array.from(input.querySelectorAll('[data-ces]')).forEach((el, idx) => {\n delete el.dataset.ces;\n const customEmojiElement = customEmojiElements[idx];\n (el as any).customEmojiElement = customEmojiElement;\n customEmojiElement.placeholder = el;\n });\n // fillers.forEach((el) => {\n // el.contentEditable = 'inherit';\n // });\n input.querySelectorAll('.pc').forEach((el) => {\n el.contentEditable = 'false';\n });\n if(textNode) {\n const {nodeValue} = textNode;\n if(nodeValue === textNodeValue) {\n textNode.remove();\n } else {\n (textNode as CharacterData).replaceData(nodeValue.indexOf(textNodeValue), textNodeValue.length, '');\n }\n }\n // restore();\n richInputHandler?.removeExtraBOMs(input);\n simulateEvent(input, 'input');\n\n // if(textNode) {\n // const selection = document.getSelection();\n // const node = fragmentLastChild.nextSibling || fragmentLastChild;\n // const range = document.createRange();\n // range.setStartAfter(node);\n // range.collapse(true);\n // selection.removeAllRanges();\n // selection.addRange(range);\n // }\n\n // const after = getCaretPosNew(input);\n // console.log('after', after);\n // if(after.node?.nodeValue === BOM) {\n // const smth = findUpClassName(after.node.parentElement, 'input-something');\n // if(smth) {\n // const selection = document.getSelection();\n // const node = smth.nextSibling;\n // const range = document.createRange();\n // range.setStartAfter(node);\n // range.collapse(true);\n // selection.removeAllRanges();\n // selection.addRange(range);\n\n // // if(after.offset === 0) after.selection.modify('extend', 'forward', 'character');\n // // after.selection.modify('extend', 'forward', 'character');\n // // after.selection.collapseToEnd();\n // }\n // }\n\n // setCaretAt(fragmentLastChild.nextSibling);\n\n // console.log('ASD');\n}\n\nlet init = () => {\n document.addEventListener('paste', (e) => {\n const input = findUpAttribute(e.target, 'contenteditable=\"true\"');\n if(!input) {\n return;\n }\n\n const noLinebreaks = !!input.dataset.noLinebreaks;\n e.preventDefault();\n let text: string, entities: MessageEntity[];\n\n // @ts-ignore\n let plainText: string = (e.originalEvent || e).clipboardData.getData('text/plain');\n let usePlainText = true;\n\n // @ts-ignore\n let html: string = (e.originalEvent || e).clipboardData.getData('text/html');\n\n const filterEntity = (e: MessageEntity) => e._ === 'messageEntityEmoji' || (e._ === 'messageEntityLinebreak' && !noLinebreaks);\n if(noLinebreaks) {\n const regExp = /[\\r\\n]/g;\n plainText = plainText.replace(regExp, '');\n html = html.replace(regExp, '');\n }\n\n const peerId = (input.dataset.peerId || NULL_PEER_ID).toPeerId();\n if(html.trim()) {\n console.log(html.replace(/ (style|class|id)=\".+?\"/g, ''));\n\n html = html.replace(//, '');\n html = html.replace(//, '');\n html = html.replace('
', '');\n\n const match = html.match(/([\\s\\S]*)<\\/body>/);\n if(match) {\n html = match[1].trim();\n }\n\n // const s = cleanHTML(html, true) as NodeList;\n // console.log(s);\n\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n const span = doc.body || document.createElement('body');\n\n // const span: HTMLElement = document.createElement('span');\n // span.innerHTML = html;\n // span.append(...Array.from(s));\n\n let curChild = span.firstChild;\n while(curChild) { // * fix whitespace between elements like

asd

\\n

zxc

\n const nextSibling = curChild.nextSibling;\n if(curChild.nodeType === curChild.TEXT_NODE) {\n if(!curChild.nodeValue.trim()) {\n curChild.remove();\n }\n }\n\n curChild = nextSibling;\n }\n\n const richValue = getRichValueWithCaret(span, true, false);\n\n const canWrapCustomEmojis = !!peerId;\n if(!canWrapCustomEmojis) {\n richValue.entities = richValue.entities.filter((entity) => entity._ !== 'messageEntityCustomEmoji');\n }\n\n /* if(false) */ { // * fix extra new lines appearing from

(can have them from some sources, like macOS Terminal)\n const lines = richValue.value.split('\\n');\n let textLength = 0;\n for(let lineIndex = 0; lineIndex < lines.length; ++lineIndex) {\n const line = lines[lineIndex];\n textLength += line.length;\n\n const index = textLength;\n if(plainText[index] !== '\\n' && lineIndex !== (lines.length - 1)) {\n const nextLine = lines.splice(lineIndex + 1, 1)[0];\n lines[lineIndex] = line + nextLine;\n\n // fix entities\n richValue.entities.forEach((entity) => {\n if(entity.offset >= index) {\n entity.offset -= 1;\n }\n });\n\n textLength += nextLine.length;\n }\n\n textLength += 1;\n }\n\n const correctedText = lines.join('\\n');\n richValue.value = correctedText;\n }\n\n const richTextLength = richValue.value.replace(/\\s/g, '').length;\n const plainTextLength = plainText.replace(/\\s/g, '').length;\n if(richTextLength === plainTextLength ||\n richValue.entities.find((entity) => entity._ === 'messageEntityCustomEmoji')) {\n text = richValue.value;\n entities = richValue.entities;\n usePlainText = false;\n\n let entities2 = parseEntities(text);\n entities2 = entities2.filter(filterEntity);\n mergeEntities(entities, entities2);\n }\n\n console.log('usePlainText', usePlainText);\n }\n\n if(usePlainText) {\n text = plainText;\n entities = parseEntities(text);\n entities = entities.filter(filterEntity);\n }\n\n insertRichTextAsHTML(input, text, entities, peerId);\n });\n\n init = null;\n};\n\n// ! it doesn't respect symbols other than strongs\n/* const checkAndSetRTL = (input: HTMLElement) => {\n //const isEmpty = isInputEmpty(input);\n //console.log('input', isEmpty);\n\n //const char = [...getRichValue(input)][0];\n const char = (input instanceof HTMLInputElement ? input.value : input.innerText)[0];\n let direction = 'ltr';\n if(char && checkRTL(char)) {\n direction = 'rtl';\n }\n\n //console.log('RTL', direction, char);\n\n input.style.direction = direction;\n}; */\n\nexport enum InputState {\n Neutral = 0,\n Valid = 1,\n Error = 2\n};\n\nexport type InputFieldOptions = {\n placeholder?: LangPackKey,\n label?: LangPackKey,\n labelOptions?: any[],\n labelText?: string | DocumentFragment,\n name?: string,\n maxLength?: number,\n showLengthOn?: number,\n plainText?: true,\n required?: boolean,\n canBeEdited?: boolean,\n validate?: () => boolean,\n inputMode?: 'tel' | 'numeric',\n withLinebreaks?: boolean,\n autocomplete?: string\n};\n\nfunction createCustomEmojiRendererForInput() {\n const renderer = CustomEmojiRendererElement.create({\n wrappingDraft: true,\n isSelectable: true\n });\n return renderer;\n}\n\nfunction processCustomEmojisInInput(input: HTMLElement) {\n const customEmojiElements = Array.from(input.querySelectorAll('.custom-emoji, .custom-emoji-placeholder'));\n let renderer = input.querySelector('.custom-emoji-renderer');\n if(!renderer && customEmojiElements.length) {\n renderer = createCustomEmojiRendererForInput();\n input.prepend(renderer);\n } else if(renderer && !customEmojiElements.length) {\n renderer.remove();\n return;\n }\n\n if(!renderer) {\n return;\n }\n\n const customEmojis: Parameters[0] = new Map();\n customEmojiElements.forEach((element) => {\n const customEmojiElement = element instanceof CustomEmojiElement ? element : (element as any).customEmojiElement as CustomEmojiElement;\n const {docId} = customEmojiElement;\n let set = customEmojis.get(docId);\n if(!set) {\n customEmojis.set(docId, set = new Set());\n }\n\n set.add(customEmojiElement);\n });\n\n for(const [docId, customEmojiElements] of customEmojis) {\n let hasSet = renderer.customEmojis.get(docId);\n if(hasSet) {\n for(const customEmojiElement of hasSet) {\n if(!customEmojiElements.has(customEmojiElement)) {\n customEmojiElement.destroy();\n }\n }\n } else {\n hasSet = new Set();\n }\n\n for(const customEmojiElement of customEmojiElements) {\n if(!hasSet.has(customEmojiElement)) {\n customEmojiElement.connectedCallback();\n }\n }\n }\n\n renderer.add(customEmojis, false);\n renderer.forceRender();\n}\n\nexport default class InputField {\n public container: HTMLElement;\n public input: HTMLElement;\n public label: HTMLLabelElement;\n\n public originalValue: string;\n\n public required: boolean;\n public validate: () => boolean;\n\n constructor(public options: InputFieldOptions = {}) {\n this.container = document.createElement('div');\n this.container.classList.add('input-field');\n\n this.required = options.required;\n this.validate = options.validate;\n\n if(options.maxLength !== undefined && options.showLengthOn === undefined) {\n options.showLengthOn = Math.min(40, Math.round(options.maxLength / 3));\n }\n\n const {placeholder, maxLength, showLengthOn, name, plainText, canBeEdited = true, autocomplete} = options;\n const label = options.label || options.labelText;\n\n const onInputCallbacks: Array<() => void> = [];\n let input: HTMLElement;\n if(!plainText) {\n if(init) {\n init();\n }\n\n this.container.innerHTML = `

`;\n\n input = this.container.firstElementChild as HTMLElement;\n input.contentEditable = '' + !!canBeEdited;\n // const observer = new MutationObserver(() => {\n // //checkAndSetRTL(input);\n\n // if(processInput) {\n // processInput();\n // }\n // });\n\n RichInputHandler.getInstance();\n\n input.addEventListener('mousedown', (e) => {\n const selection = document.getSelection();\n if(!selection.isCollapsed) {\n return;\n }\n\n const placeholder = findUpTag(e.target, 'IMG');\n if(!placeholder) {\n return;\n }\n\n const rect = placeholder.getBoundingClientRect();\n const centerX = rect.left + rect.width / 2;\n const focusOnNext = e.clientX >= centerX;\n\n const range = document.createRange();\n range.setStartAfter(focusOnNext ? placeholder : placeholder.previousSibling ?? placeholder);\n selection.removeAllRanges();\n selection.addRange(range);\n });\n\n onInputCallbacks.push(() => {\n // console.log('input');\n // return;\n // * because if delete all characters there will br left\n if(isInputEmpty(input)) {\n // const textNode = Array.from(input.childNodes).find((node) => node.nodeType === node.TEXT_NODE) || document.createTextNode('');\n input.replaceChildren();\n // input.append(document.createTextNode('')); // need first text node to support history stack\n }\n\n // const fillers = Array.from(input.querySelectorAll('.emoji-filler')) as HTMLElement[];\n // fillers.forEach((filler) => {\n // const textContent = filler.textContent;\n // if(textContent === BOM) {\n // return;\n // }\n\n // if(textContent) {\n\n // } else {\n // let curChild = filler.firstChild;\n // while(curChild) {\n // curChild = curChild.nextSibling;\n // }\n // }\n\n // filler.classList.remove('emoji-filler');\n // });\n\n // Array.from(input.querySelectorAll('br, span:empty')).forEach((el) => {\n // const parentElement = el.parentElement;\n // (parentElement === input ? el : parentElement).remove();\n // });\n USING_BOMS && Array.from(input.querySelectorAll('br:not(.br-not-br)')).forEach((el) => {\n // const parentElement = el.parentElement;\n el.remove();\n // if(!parentElement.children.length && !parentElement.textContent) {\n // parentElement.textContent = '';\n // }\n });\n\n insertCustomFillers(Array.from(input.querySelectorAll('.input-something')));\n\n processCustomEmojisInInput(input);\n\n // .forEach((el) => el.remove());\n });\n\n // ! childList for paste first symbol\n // observer.observe(input, {characterData: true, childList: true, subtree: true});\n } else {\n this.container.innerHTML = `\n \n `;\n\n input = this.container.firstElementChild as HTMLElement;\n // input.addEventListener('input', () => checkAndSetRTL(input));\n }\n\n setDirection(input);\n\n if(options.inputMode) {\n input.inputMode = options.inputMode;\n }\n\n if(placeholder) {\n _i18n(input, placeholder, undefined, 'placeholder');\n }\n\n if(label || placeholder) {\n const border = document.createElement('div');\n border.classList.add('input-field-border');\n this.container.append(border);\n }\n\n if(label) {\n this.label = document.createElement('label');\n this.setLabel();\n this.container.append(this.label);\n }\n\n if(maxLength) {\n const labelEl = this.container.lastElementChild as HTMLLabelElement;\n let showingLength = false;\n\n const onInput = () => {\n const wasError = input.classList.contains('error');\n // * https://stackoverflow.com/a/54369605 #2 to count emoji as 1 symbol\n const inputLength = plainText ? (input as HTMLInputElement).value.length : [...getRichValueWithCaret(input, false, false).value].length;\n const diff = maxLength - inputLength;\n const isError = diff < 0;\n input.classList.toggle('error', isError);\n\n // this.onLengthChange && this.onLengthChange(inputLength, isError);\n\n if(isError || diff <= showLengthOn) {\n this.setLabel();\n labelEl.append(` (${maxLength - inputLength})`);\n if(!showingLength) showingLength = true;\n } else if((wasError && !isError) || showingLength) {\n this.setLabel();\n showingLength = false;\n }\n };\n\n onInputCallbacks.push(onInput);\n }\n\n const noLinebreaks = !options.withLinebreaks;\n if(noLinebreaks && !plainText) {\n input.dataset.noLinebreaks = '1';\n input.addEventListener('keypress', (e) => {\n if(e.key === 'Enter') {\n e.preventDefault();\n return false;\n }\n });\n }\n\n if(onInputCallbacks.length) {\n input.addEventListener('input', () => {\n onInputCallbacks.forEach((callback) => callback());\n });\n }\n\n this.input = input;\n }\n\n public select() {\n if(!this.value) { // * avoid selecting whole empty field on iOS devices\n return;\n }\n\n if(this.options.plainText) {\n (this.input as HTMLInputElement).select(); // * select text\n } else {\n selectElementContents(this.input);\n }\n }\n\n public setLabel() {\n this.label.textContent = '';\n if(this.options.labelText) {\n setInnerHTML(this.label, this.options.labelText);\n } else {\n this.label.append(i18n(this.options.label, this.options.labelOptions));\n }\n }\n\n get value(): string {\n return this.options.plainText ? (this.input as HTMLInputElement).value : getRichValueWithCaret(this.input, false, false).value;\n // return getRichValue(this.input);\n }\n\n set value(value: Parameters[1]) {\n this.setValueSilently(value, true);\n this.simulateInputEvent();\n }\n\n public simulateInputEvent() {\n simulateEvent(this.input, 'input');\n }\n\n public setValueSilently(value: Parameters[1], fromSet?: boolean) {\n if(this.options.plainText) {\n (this.input as HTMLInputElement).value = value as string;\n } else {\n replaceContent(this.input, value);\n processCustomEmojisInInput(this.input);\n }\n }\n\n public isChanged() {\n return this.value !== this.originalValue;\n }\n\n public isValid() {\n return !this.input.classList.contains('error') &&\n (!this.validate || this.validate()) &&\n (!this.required || !isInputEmpty(this.input));\n }\n\n public isValidToChange() {\n return this.isValid() && this.isChanged();\n }\n\n public setDraftValue(value = '', silent?: boolean) {\n if(!this.options.plainText) {\n value = documentFragmentToHTML(wrapDraftText(value));\n }\n\n if(silent) {\n this.setValueSilently(value, false);\n } else {\n this.value = value;\n }\n }\n\n public setOriginalValue(value: InputField['originalValue'] = '', silent?: boolean) {\n this.originalValue = value;\n this.setDraftValue(value, silent);\n }\n\n public setState(state: InputState, label?: LangPackKey) {\n if(label) {\n this.label.textContent = '';\n this.label.append(i18n(label, this.options.labelOptions));\n } else {\n this.setLabel();\n }\n\n this.input.classList.toggle('error', !!(state & InputState.Error));\n this.input.classList.toggle('valid', !!(state & InputState.Valid));\n }\n\n public setError(label?: LangPackKey) {\n this.setState(InputState.Error, label);\n }\n}\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","/*\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 { getRichValue } from \"../helpers/dom\";\nimport {LangPackKey} from '../lib/langPack';\nimport InputField from './inputField';\n\nexport default class InputSearch {\n public container: HTMLElement;\n public input: HTMLElement;\n public inputField: InputField;\n public clearBtn: HTMLElement;\n\n public prevValue = '';\n public timeout = 0;\n public onChange: (value: string) => void;\n public onClear: () => void;\n\n constructor(placeholder: LangPackKey, onChange?: (value: string) => void) {\n this.inputField = new InputField({\n placeholder,\n plainText: true\n });\n\n this.container = this.inputField.container;\n this.container.classList.remove('input-field');\n this.container.classList.add('input-search');\n\n this.onChange = onChange;\n\n this.input = this.inputField.input;\n this.input.classList.add('input-search-input');\n\n const searchIcon = document.createElement('i');\n searchIcon.classList.add('tgico', 'tgico-search');\n\n this.clearBtn = document.createElement('i');\n this.clearBtn.classList.add('tgico', 'btn-icon', 'tgico-close');\n\n this.input.addEventListener('input', this.onInput);\n this.clearBtn.addEventListener('click', this.onClearClick);\n\n this.container.append(searchIcon, this.clearBtn);\n }\n\n onInput = () => {\n if(!this.onChange) return;\n\n const value = this.value;\n\n // this.input.classList.toggle('is-empty', !value.trim());\n\n if(value !== this.prevValue) {\n this.prevValue = value;\n clearTimeout(this.timeout);\n this.timeout = window.setTimeout(() => {\n this.onChange(value);\n }, 200);\n }\n };\n\n onClearClick = () => {\n this.value = '';\n this.onChange && this.onChange('');\n this.onClear && this.onClear();\n };\n\n get value() {\n return this.inputField.value;\n }\n\n set value(value: string) {\n this.prevValue = value;\n clearTimeout(this.timeout);\n this.inputField.value = value;\n }\n\n public remove() {\n clearTimeout(this.timeout);\n this.input.removeEventListener('input', this.onInput);\n this.clearBtn.removeEventListener('click', this.onClearClick);\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 VisibilityIntersector, {OnVisibilityChangeItem} from './visibilityIntersector';\nimport findAndSpliceAll from '../helpers/array/findAndSpliceAll';\nimport findAndSplice from '../helpers/array/findAndSplice';\nimport LazyLoadQueueIntersector, {LazyLoadElement} from './lazyLoadQueueIntersector';\nimport useHeavyAnimationCheck from '../hooks/useHeavyAnimationCheck';\n\nexport default class LazyLoadQueue extends LazyLoadQueueIntersector {\n constructor(parallelLimit?: number, ignoreHeavyAnimation?: boolean) {\n super(parallelLimit);\n\n this.intersector = new VisibilityIntersector(this.onVisibilityChange);\n\n !ignoreHeavyAnimation && useHeavyAnimationCheck(() => {\n this.lock();\n }, () => {\n this.unlockAndRefresh();\n });\n }\n\n private onVisibilityChange = ({target, visible}: OnVisibilityChangeItem) => {\n // if(DEBUG) {\n // this.log('isIntersecting', target, visible);\n // }\n\n // if visible - will move to the end of visible arary\n findAndSpliceAll(this.queue, (i) => i.div === target).forEach((item) => {\n if(visible) {\n item.wasSeen = true;\n }\n\n item.visible = visible;\n const index = this.queue.findIndex((item) => !item.visible);\n this.queue.splice(Math.max(0, index), 0, item);\n });\n\n this.setProcessQueueTimeout();\n };\n\n protected getItem() {\n return findAndSplice(this.queue, (item) => item.wasSeen);\n }\n\n public async processItem(item: LazyLoadElement) {\n await super.processItem(item);\n this.intersector.unobserve(item.div);\n }\n\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElement) {\n const inserted = super.addElement(method, el);\n\n if(!inserted) return false;\n\n this.observe(el);\n /* if(el.wasSeen) {\n this.processQueue(el);\n } else */\n el.wasSeen ??= false;\n\n return 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 findAndSpliceAll from '../helpers/array/findAndSpliceAll';\nimport LazyLoadQueueBase, {LazyLoadElementBase} from './lazyLoadQueueBase';\nimport VisibilityIntersector from './visibilityIntersector';\n\nexport type LazyLoadElement = Omit & {\n load: (target?: HTMLElement) => Promise,\n div: HTMLElement\n wasSeen?: boolean,\n visible?: boolean\n};\n\nexport default class LazyLoadQueueIntersector extends LazyLoadQueueBase {\n protected queue: Array = [];\n protected inProcess: Set = new Set();\n\n public intersector: VisibilityIntersector;\n protected intersectorTimeout: number;\n\n constructor(parallelLimit?: number) {\n super(parallelLimit);\n }\n\n public lock() {\n super.lock();\n this.intersector.lock();\n }\n\n public unlock() {\n super.unlock();\n this.intersector.unlock();\n }\n\n public unlockAndRefresh() {\n super.unlock();\n this.intersector.unlockAndRefresh();\n }\n\n public clear() {\n super.clear();\n this.intersector.disconnect();\n }\n\n public refresh() {\n this.intersector.refresh();\n }\n\n protected loadItem(item: LazyLoadElement) {\n return item.load(item.div);\n }\n\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElement) {\n const item = this.queue.find((i) => i.div === el.div && i.load === el.load);\n if(item) {\n return false;\n } else {\n for(const item of this.inProcess) {\n if(item.div === el.div && item.load === el.load) {\n return false;\n }\n }\n }\n\n this.queue[method](el);\n return true;\n }\n\n protected setProcessQueueTimeout() {\n this.intersectorTimeout ??= window.setTimeout(() => {\n this.intersectorTimeout = undefined;\n this.processQueue();\n }, 0);\n }\n\n public push(el: LazyLoadElement) {\n super.push(el);\n }\n\n public unshift(el: LazyLoadElement) {\n super.unshift(el);\n }\n\n public delete(el: Omit) {\n findAndSpliceAll(this.queue, (i) => i.div === el.div);\n this.unobserve(el);\n }\n\n public observe(el: LazyLoadElement) {\n this.intersector.observe(el.div);\n }\n\n public unobserve(el: Omit) {\n this.intersector.unobserve(el.div);\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 {GrabEvent} from '../helpers/dom/attachGrabListeners';\nimport appMediaPlaybackController from './appMediaPlaybackController';\nimport RangeSelector from './rangeSelector';\n\nexport default class MediaProgressLine extends RangeSelector {\n protected filledLoad: HTMLDivElement;\n\n protected progressRAF: number;\n\n protected media: HTMLMediaElement;\n protected streamable: boolean;\n\n // protected lastOnPlayTime: number;\n // protected lastOnPlayCurrentTime: number;\n\n constructor(protected options: {\n media?: HTMLAudioElement | HTMLVideoElement,\n streamable?: boolean,\n withTransition?: boolean,\n useTransform?: boolean,\n onSeekStart?: () => void,\n onSeekEnd?: () => void\n }) {\n super({\n step: 1000 / 60 / 1000,\n min: 0,\n max: 1,\n withTransition: options.withTransition,\n useTransform: options.useTransform\n }, 0);\n\n if(options.media) {\n this.setMedia(options.media, options.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 this.options?.onSeekStart?.();\n },\n\n onMouseUp: (e) => {\n // cancelEvent(e.event);\n wasPlaying && this.media.play();\n this.options?.onSeekEnd?.();\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 const r = () => {\n this.setProgress();\n\n this.progressRAF = this.media.paused ? undefined : window.requestAnimationFrame(r);\n };\n\n if(this.progressRAF) {\n window.cancelAnimationFrame(this.progressRAF);\n this.progressRAF = undefined;\n }\n\n if(this.streamable) {\n this.setLoadProgress();\n }\n\n // this.lastOnPlayTime = Date.now();\n // this.lastOnPlayCurrentTime = this.media.currentTime;\n r();\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\n // fix jumping progress on play\n // let currentTime: number;\n // const diff = (Date.now() - this.lastOnPlayTime) / 1000;\n // if(!this.media.paused && this.lastOnPlayTime && diff <= 1) {\n // currentTime = this.lastOnPlayCurrentTime + diff;\n // } else {\n // currentTime = this.media.currentTime;\n // }\n\n const currentTime = this.media.currentTime;\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('pause', this.onTimeUpdate);\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 if(this.media) {\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('pause', this.onTimeUpdate);\n this.media.removeEventListener('timeupdate', this.onTimeUpdate);\n this.streamable && this.media.removeEventListener('progress', this.onProgress);\n }\n\n if(this.progressRAF) {\n window.cancelAnimationFrame(this.progressRAF);\n this.progressRAF = 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 {FontFamily, FontSize, FontWeight} from '../config/font';\nimport getTextWidth from '../helpers/canvas/getTextWidth';\nimport mediaSizes from '../helpers/mediaSizes';\nimport clamp from '../helpers/number/clamp';\nimport {fastRaf} from '../helpers/schedulers';\n\n// Thanks to https://stackoverflow.com/a/49349813\n\n/**\n * Attibute modifier to create middle ellipsis\n * When the attribute value is left blank the ellipsis will be in the middle\n * When positive the attribute value will be used as a percentage\n * When negative the attribute value will be used as character index counted from the end\n * @example\n *
A Javascript solution to middle ellipsis
\n *
A Javascript solution to middle ellipsis
\n *
A Javascript solution to middle ellipsis
\n */\nconst ellipsis = 'โ€ฆ';\nconst map: Map = new Map();\n\nconst testQueue: Set = new Set();\nconst fontSize = '16px';\nlet pendingTest = false;\n\nfunction setTestQueue() {\n if(pendingTest) {\n return;\n }\n\n pendingTest = true;\n fastRaf(() => {\n pendingTest = false;\n testQueueElements();\n });\n}\n\nfunction testQueueElements() {\n testQueue.forEach(testElement);\n testQueue.clear();\n}\n\nwindow.addEventListener('resize', () => {\n for(const [key] of map) {\n testQueue.add(key);\n }\n\n setTestQueue();\n}, {capture: true, passive: true});\n\nfunction getElementWidth(element: HTMLElement) {\n const getSize = (element as any).getSize;\n if(getSize) {\n return getSize();\n }\n\n const type = element.dataset.sizeType;\n if(type) {\n const mediaSize = mediaSizes.active;\n // @ts-ignore\n const size: MediaSize = mediaSize[type];\n return size.width;\n }\n\n return element.getBoundingClientRect().width;\n}\n\nfunction testElement(element: HTMLElement) {\n // const perf = performance.now();\n // do not recalculate variables a second time\n let mapped = map.get(element);\n const firstTime = !mapped;\n\n let {text, textLength, from, multiplier, font, textWidth, elementWidth} = mapped || {};\n // console.log('[MEE] testElement got mapped', mapped);\n\n if(firstTime) {\n text = element.textContent;\n textLength = text.length;\n from = /* parseFloat(element.getAttribute(attributeName)) || */50;\n multiplier = from > 0 && from / 100;\n\n let fontSize = element.dataset.fontSize;\n if(fontSize && +fontSize) fontSize += 'px';\n // const perf = performance.now();\n font = `${element.dataset.fontWeight || FontWeight} ${fontSize || FontSize} ${FontFamily}`;\n /* const computedStyle = window.getComputedStyle(elm, null);\n font = `${computedStyle.getPropertyValue('font-weight')} ${computedStyle.getPropertyValue('font-size')} ${computedStyle.getPropertyValue('font-family')}`; */\n // console.log('testMiddleEllipsis get computed style:', performance.now() - perf, font);\n\n textWidth = getTextWidth(text, font);\n // const perf = performance.now();\n elementWidth = getElementWidth(element);\n // console.log('testMiddleEllipsis get offsetWidth:', performance.now() - perf, font);\n mapped = {text, textLength, from, multiplier, font, textWidth, elementWidth};\n map.set(element, mapped);\n\n // console.log('[MEE] testElement map set', element);\n }\n\n const newElementWidth = getElementWidth(element);\n const widthChanged = firstTime || elementWidth !== newElementWidth;\n !firstTime && widthChanged && (mapped.elementWidth = elementWidth = newElementWidth);\n\n if(widthChanged) {\n if(textWidth > elementWidth) {\n element.setAttribute('title', text);\n let smallerText = text;\n let smallerWidth = elementWidth;\n while(smallerText.length > 3) {\n const smallerTextLength = smallerText.length;\n const half = multiplier &&\n clamp(multiplier * smallerTextLength << 0, 1, smallerTextLength - 2) ||\n Math.max(smallerTextLength + from - 1, 1);\n const half1 = smallerText.substr(0, half).replace(/\\s*$/, '');\n const half2 = smallerText.substr(half + 1).replace(/^\\s*/, '');\n smallerText = half1 + half2;\n smallerWidth = getTextWidth(smallerText + ellipsis, font);\n if(smallerWidth < elementWidth) {\n element.textContent = half1 + ellipsis + half2;\n break;\n }\n }\n\n // * set new width after cutting text\n mapped.elementWidth = getElementWidth(element);\n // mapped.textWidth = smallerWidth;\n } else {\n element.removeAttribute('title');\n }\n }\n\n // console.log('testMiddleEllipsis for element:', elm, performance.now() - perf);\n}\n\nexport class MiddleEllipsisElement extends HTMLElement {\n connectedCallback() {\n // console.log('[MEE]: connectedCallback before', map.has(this), testQueue.has(this), map.size, this.textContent, map);\n\n map.set(this, null);\n if(this.dataset.sizeType || (this as any).getSize) {\n testElement(this);\n } else {\n testQueue.add(this);\n setTestQueue();\n }\n // testElement(this);\n\n // console.log('[MEE]: connectedCallback after', map.has(this), map.size, testQueue.has(this), testQueue.size);\n }\n\n disconnectedCallback() {\n const deleted = map.delete(this);\n testQueue.delete(this);\n // console.log('[MEE]: disconnectedCallback', deleted, map.has(this), map.size, this.textContent, map);\n }\n}\n\ncustomElements.define('middle-ellipsis-element', MiddleEllipsisElement);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport lottieLoader, {LottieLoader} from '../../lib/rlottie/lottieLoader';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport PasswordInputField from '../passwordInputField';\n\nexport default class PasswordMonkey {\n public container: HTMLElement;\n public animation: RLottiePlayer;\n public needFrame = 0;\n protected loadPromise: ReturnType;\n\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\n this.container = document.createElement('div');\n this.container.classList.add('media-sticker-wrapper');\n }\n\n public load() {\n if(this.loadPromise) return this.loadPromise;\n return this.loadPromise = lottieLoader.loadAnimationAsAsset({\n container: this.container,\n loop: false,\n autoplay: false,\n width: this.size,\n height: this.size,\n noCache: true\n // }, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then((_animation) => {\n }, 'TwoFactorSetupMonkeyPeek').then((_animation) => {\n // return;\n this.animation = _animation;\n this.animation.addEventListener('enterFrame', currentFrame => {\n // console.log('enterFrame', currentFrame, this.needFrame);\n\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\n this.animation.setSpeed(1);\n this.animation.pause();\n }\n });\n\n this.passwordInputField.helpers.onVisibilityClickAdditional = () => {\n if(this.passwordInputField.helpers.passwordVisible) {\n this.animation.setDirection(1);\n this.animation.curFrame = 0;\n this.needFrame = 16;\n this.animation.play();\n } else {\n this.animation.setDirection(-1);\n this.animation.curFrame = 16;\n this.needFrame = 0;\n this.animation.play();\n }\n };\n\n return lottieLoader.waitForFirstFrame(_animation);\n });\n }\n\n public remove() {\n if(this.animation) {\n this.animation.remove();\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 InputField from '../inputField';\nimport lottieLoader from '../../lib/rlottie/lottieLoader';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\n\nexport default class TrackingMonkey {\n public container: HTMLElement;\n\n protected max = 45;\n protected needFrame = 0;\n\n protected animation: RLottiePlayer;\n protected idleAnimation: RLottiePlayer;\n\n protected loadPromise: Promise;\n\n constructor(protected inputField: InputField, protected size: number) {\n this.container = document.createElement('div');\n this.container.classList.add('media-sticker-wrapper');\n\n const input = inputField.input;\n\n input.addEventListener('blur', () => {\n this.playAnimation(0);\n });\n\n input.addEventListener('input', (e) => {\n this.playAnimation(inputField.value.length);\n });\n\n /* codeInput.addEventListener('focus', () => {\n playAnimation(Math.max(codeInput.value.length, 1));\n }); */\n }\n\n // 1st symbol = frame 15\n // end symbol = frame 165\n public playAnimation(length: number) {\n if(!this.animation) return;\n\n length = Math.min(length, 30);\n let frame: number;\n if(length) {\n frame = Math.round(Math.min(this.max, length) * (165 / this.max) + 11.33);\n\n if(this.idleAnimation) {\n this.idleAnimation.stop(true);\n this.idleAnimation.canvas[0].style.display = 'none';\n }\n\n this.animation.canvas[0].style.display = '';\n } else {\n /* const cb = (frameNo: number) => {\n if(frameNo <= 1) { */\n /* idleAnimation.play();\n idleAnimation.canvas.style.display = '';\n animation.canvas.style.display = 'none'; */\n /* animation.removeListener('enterFrame', cb);\n }\n };\n animation.addListener('enterFrame', cb); */\n\n frame = 0;\n }\n // animation.playSegments([1, 2]);\n\n const direction = this.needFrame > frame ? -1 : 1;\n // console.log('keydown', length, frame, direction);\n\n this.animation.setDirection(direction);\n if(this.needFrame !== 0 && frame === 0) {\n this.animation.setSpeed(7);\n }\n /* let diff = Math.abs(needFrame - frame * direction);\n if((diff / 20) > 1) animation.setSpeed(diff / 20 | 0); */\n this.needFrame = frame;\n\n this.animation.play();\n\n /* animation.goToAndStop(15, true); */\n // animation.goToAndStop(length / max * );\n }\n\n public load() {\n if(this.loadPromise) return this.loadPromise;\n return this.loadPromise = Promise.all([\n lottieLoader.loadAnimationAsAsset({\n container: this.container,\n loop: true,\n autoplay: true,\n width: this.size,\n height: this.size\n }, 'TwoFactorSetupMonkeyIdle').then((animation) => {\n this.idleAnimation = animation;\n\n // ! animationIntersector will stop animation instantly\n if(!this.inputField.value.length) {\n animation.play();\n }\n\n return lottieLoader.waitForFirstFrame(animation);\n }),\n\n lottieLoader.loadAnimationAsAsset({\n container: this.container,\n loop: false,\n autoplay: false,\n width: this.size,\n height: this.size\n }, 'TwoFactorSetupMonkeyTracking').then((_animation) => {\n this.animation = _animation;\n\n if(!this.inputField.value.length) {\n this.animation.canvas[0].style.display = 'none';\n }\n\n this.animation.addEventListener('enterFrame', currentFrame => {\n // console.log('enterFrame', currentFrame, needFrame);\n // let currentFrame = Math.round(e.currentTime);\n\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\n this.animation.setSpeed(1);\n this.animation.pause();\n }\n\n if(currentFrame === 0 && this.needFrame === 0) {\n // animation.curFrame = 0;\n\n if(this.idleAnimation) {\n this.idleAnimation.canvas[0].style.display = '';\n this.idleAnimation.play();\n this.animation.canvas[0].style.display = 'none';\n }\n }\n });\n // console.log(animation.getDuration(), animation.getDuration(true));\n\n return lottieLoader.waitForFirstFrame(_animation);\n })\n ]);\n }\n\n public remove() {\n if(this.animation) this.animation.remove();\n if(this.idleAnimation) this.idleAnimation.remove();\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 InputField, {InputFieldOptions} from './inputField';\n\nexport class PasswordInputHelpers {\n public passwordVisible = false;\n public toggleVisible: HTMLElement;\n public onVisibilityClickAdditional: () => void;\n\n constructor(public container: HTMLElement, public input: HTMLInputElement) {\n input.type = 'password';\n input.setAttribute('required', '');\n input.name = 'notsearch_password';\n input.autocomplete = 'off';\n\n // * https://stackoverflow.com/a/35949954/6758968\n const stealthy = document.createElement('input');\n stealthy.classList.add('stealthy');\n stealthy.tabIndex = -1;\n stealthy.type = 'password';\n input.parentElement.prepend(stealthy);\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\n\n /* if(IS_SAFARI && !IS_MOBILE_SAFARI) {\n input.setAttribute('readonly', '');\n input.addEventListener('focus', () => {\n input.removeAttribute('readonly');\n }, {once: true});\n } */\n\n const toggleVisible = this.toggleVisible = document.createElement('span');\n toggleVisible.classList.add('toggle-visible', 'tgico');\n\n container.classList.add('input-field-password');\n container.append(toggleVisible);\n\n toggleVisible.addEventListener('click', this.onVisibilityClick);\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\n }\n\n public onVisibilityClick = (e: Event) => {\n cancelEvent(e);\n this.passwordVisible = !this.passwordVisible;\n\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\n };\n}\n\nexport default class PasswordInputField extends InputField {\n public helpers: PasswordInputHelpers;\n\n constructor(options: InputFieldOptions = {}) {\n super({\n plainText: true,\n ...options\n });\n\n this.helpers = new PasswordInputHelpers(this.container, this.input as HTMLInputElement);\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 IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport findAndSplice from '../helpers/array/findAndSplice';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport filterChatPhotosMessages from '../helpers/filterChatPhotosMessages';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport ListLoader from '../helpers/listLoader';\nimport {fastRaf} from '../helpers/schedulers';\nimport {Message, ChatFull, MessageAction, Photo} from '../layer';\nimport type {AppMessagesManager} from '../lib/appManagers/appMessagesManager';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport choosePhotoSize from '../lib/appManagers/utils/photos/choosePhotoSize';\nimport {openAvatarViewer} from './avatar';\nimport {putAvatar} from './putPhoto';\nimport Scrollable from './scrollable';\nimport SwipeHandler from './swipeHandler';\nimport wrapPhoto from './wrappers/photo';\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>;\n private listenerSetter: ListenerSetter;\n private swipeHandler: SwipeHandler;\n\n constructor(\n public scrollable: Scrollable,\n private managers: AppManagers\n ) {\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 this.loadCallbacks = new Map();\n this.listenerSetter = new ListenerSetter();\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 }, {listenerSetter: this.listenerSetter});\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 = this.swipeHandler = new SwipeHandler({\n element: this.avatars,\n onSwipe: (xDiff, yDiff) => {\n xDiff *= -1;\n yDiff *= -1;\n\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 as any as Event);\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 /* this.listenerSetter.add(rootScope)('avatar_update', (peerId) => {\n if(this.peerId === peerId) {\n const photo = appPeersManager.getPeerPhoto(peerId);\n if(photo) {\n const id = photo.photo_id;\n const previous = this.listLoader.previous;\n for(let i = 0; i < previous.length; ++i) {\n if(previous[i] === id)\n }\n this.listLoader.previous.forEach((_id, idx, arr) => {});\n }\n }\n }); */\n }\n\n public async setPeer(peerId: PeerId) {\n this.peerId = peerId;\n\n const photo = await this.managers.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 as any;\n return this.managers.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 | ChatFull, ReturnType] = [] as any;\n if(!listLoader.current) {\n promises.push(this.managers.appProfileManager.getChatFull(peerId.toChatId()));\n }\n\n promises.push(this.managers.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(async(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 = findAndSplice(value.history, (message) => {\n return ((message as Message.messageService).action as MessageAction.messageActionChannelEditPhoto).photo.id === chatFull.chat_photo.id;\n }) as Message.messageService;\n\n listLoader.current = message || await this.managers.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 await 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 = async(photoId: Photo.photo['id'] | Message.messageService) => {\n const avatar = document.createElement('div');\n avatar.classList.add(PeerProfileAvatars.BASE_CLASS + '-avatar', 'media-container', 'hide');\n\n this.avatars.append(avatar);\n\n let photo: Photo.photo;\n if(photoId) {\n photo = typeof(photoId) !== 'object' ?\n await this.managers.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 = async() => {\n if(photo) {\n const res = await wrapPhoto({\n container: avatar,\n photo,\n size: 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 = await this.managers.appPeersManager.getPeerPhoto(this.peerId);\n await putAvatar(avatar, this.peerId, photo, 'photo_big', img);\n }\n\n avatar.classList.remove('hide');\n };\n\n if(this.avatars.childElementCount <= LOAD_NEAREST) {\n await loadCallback();\n } else {\n this.intersectionObserver.observe(avatar);\n this.loadCallbacks.set(avatar, loadCallback);\n }\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 public cleanup() {\n this.listenerSetter.removeAll();\n this.swipeHandler.removeListeners();\n this.intersectionObserver?.disconnect();\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 deferredPromise from '../helpers/cancellablePromise';\nimport {copyTextToClipboard} from '../helpers/clipboard';\nimport anchorCopy from '../helpers/dom/anchorCopy';\nimport {simulateClickEvent} from '../helpers/dom/clickEvent';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport makeError from '../helpers/makeError';\nimport {makeMediaSize} from '../helpers/mediaSize';\nimport {getMiddleware, MiddlewareHelper} from '../helpers/middleware';\nimport middlewarePromise from '../helpers/middlewarePromise';\nimport {Chat, ChatFull, User, UserFull} from '../layer';\nimport appImManager from '../lib/appManagers/appImManager';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport getServerMessageId from '../lib/appManagers/utils/messageId/getServerMessageId';\nimport getPeerActiveUsernames from '../lib/appManagers/utils/peers/getPeerActiveUsernames';\nimport I18n, {i18n, join} from '../lib/langPack';\nimport wrapRichText from '../lib/richTextProcessor/wrapRichText';\nimport rootScope from '../lib/rootScope';\nimport AvatarElement from './avatar';\nimport CheckboxField from './checkboxField';\nimport {generateDelimiter} from './generateDelimiter';\nimport PeerProfileAvatars from './peerProfileAvatars';\nimport Row from './row';\nimport Scrollable from './scrollable';\nimport SettingSection from './settingSection';\nimport {toast} from './toast';\nimport formatUserPhone from './wrappers/formatUserPhone';\nimport wrapPeerTitle from './wrappers/peerTitle';\nimport wrapTopicNameButton from './wrappers/topicNameButton';\n\nconst setText = (text: Parameters[1], row: Row) => {\n // fastRaf(() => {\n setInnerHTML(row.title, text || '');\n row.container.style.display = text ? '' : 'none';\n // });\n};\n\nexport default class PeerProfile {\n public element: HTMLElement;\n private 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 private link: 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 private middlewareHelper: MiddlewareHelper;\n\n constructor(\n private managers: AppManagers,\n public scrollable: Scrollable,\n private listenerSetter?: ListenerSetter,\n private isDialog = true\n ) {\n if(!IS_PARALLAX_SUPPORTED) {\n this.scrollable.container.classList.add('no-parallax');\n }\n\n if(!listenerSetter) {\n this.listenerSetter = new ListenerSetter();\n }\n\n this.middlewareHelper = getMiddleware();\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.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 subtitle: true,\n icon: 'info',\n clickable: (e) => {\n if((e.target as HTMLElement).tagName === 'A') {\n return;\n }\n\n copyTextToClipboard(this.bio.title.textContent);\n toast(I18n.format('BioCopied', true));\n },\n listenerSetter: this.listenerSetter,\n contextMenu: {\n buttons: [{\n icon: 'copy',\n text: 'Text.CopyLabel_About',\n onClick: () => {\n simulateClickEvent(this.bio.container);\n },\n verify: () => !this.peerId.isUser()\n }, {\n icon: 'copy',\n text: 'Text.CopyLabel_Bio',\n onClick: () => {\n simulateClickEvent(this.bio.container);\n },\n verify: () => this.peerId.isUser()\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 username = await this.managers.appPeersManager.getPeerUsername(this.peerId);\n copyTextToClipboard('@' + this.username.title.textContent);\n toast(I18n.format('UsernameCopied', true));\n },\n listenerSetter: this.listenerSetter,\n contextMenu: {\n buttons: [{\n icon: 'copy',\n text: 'Text.CopyLabel_Username',\n onClick: () => {\n simulateClickEvent(this.username.container);\n }\n }]\n }\n });\n\n this.phone = new Row({\n title: ' ',\n subtitle: true,\n icon: 'phone',\n clickable: () => {\n copyTextToClipboard(this.phone.title.textContent.replace(/\\s/g, ''));\n toast(I18n.format('PhoneCopied', true));\n },\n listenerSetter: this.listenerSetter,\n contextMenu: {\n buttons: [{\n icon: 'copy',\n text: 'Text.CopyLabel_PhoneNumber',\n onClick: () => {\n simulateClickEvent(this.phone.container);\n }\n }, {\n icon: 'info',\n text: 'PeerInfo.Phone.AnonymousInfo',\n textArgs: [(() => {\n const a = document.createElement('a');\n return a;\n })()],\n onClick: () => {\n window.open('https://fragment.com/numbers', '_blank');\n },\n separator: true,\n multiline: true,\n verify: async() => {\n const {isAnonymous} = await this.managers.appUsersManager.getUserPhone(this.peerId.toUserId()) || {};\n return isAnonymous;\n }\n }]\n }\n });\n\n this.link = new Row({\n title: ' ',\n subtitleLangKey: 'SetUrlPlaceholder',\n icon: 'link',\n clickable: () => {\n const url = this.link.title.textContent;\n copyTextToClipboard(url);\n // Promise.resolve(appProfileManager.getChatFull(this.peerId.toChatId())).then((chatFull) => {\n // copyTextToClipboard(chatFull.exported_invite.link);\n const isPrivate = url.includes('/c/');\n toast(I18n.format(isPrivate ? 'LinkCopiedPrivateInfo' : 'LinkCopied', true));\n // });\n },\n listenerSetter: this.listenerSetter,\n contextMenu: {\n buttons: [{\n icon: 'copy',\n text: 'Text.CopyLabel_ShareLink',\n onClick: () => {\n simulateClickEvent(this.link.container);\n }\n }]\n }\n });\n\n this.location = new Row({\n title: ' ',\n subtitleLangKey: 'ChatLocation',\n icon: 'location'\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.link.container\n );\n\n const {listenerSetter} = this;\n if(this.isDialog) {\n this.notifications = new Row({\n checkboxField: new CheckboxField({toggle: true}),\n titleLangKey: 'Notifications',\n icon: 'unmute',\n listenerSetter: this.listenerSetter\n });\n\n listenerSetter.add(this.notifications.checkboxField.input)('change', (e) => {\n if(!e.isTrusted) {\n return;\n }\n\n // let checked = this.notificationsCheckbox.checked;\n this.managers.appMessagesManager.togglePeerMute({peerId: this.peerId, threadId: this.threadId});\n });\n\n listenerSetter.add(rootScope)('dialog_notify_settings', async(dialog) => {\n if(this.peerId === dialog.peerId) {\n const muted = await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.peerId, respectType: false, threadId: this.threadId});\n this.notifications.checkboxField.checked = !muted;\n }\n });\n\n this.section.content.append(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 listenerSetter.add(rootScope)('peer_typings', ({peerId}) => {\n if(this.peerId === peerId) {\n this.setPeerStatus();\n }\n });\n\n listenerSetter.add(rootScope)('peer_bio_edit', (peerId) => {\n if(peerId === this.peerId) {\n this.setMoreDetails(true);\n }\n });\n\n const n = async({peerId, threadId}: {peerId: PeerId, threadId?: number}) => {\n if(this.peerId !== peerId) {\n return false;\n }\n\n const isForum = await this.managers.appPeersManager.isForum(this.peerId);\n if(isForum && this.threadId ? this.threadId === threadId : true) {\n return true;\n }\n\n return false;\n };\n\n listenerSetter.add(rootScope)('peer_title_edit', async(data) => {\n if(await n(data)) {\n this.fillUsername();\n this.setMoreDetails(true);\n }\n });\n\n listenerSetter.add(rootScope)('user_update', (userId) => {\n if(this.peerId === userId.toPeerId()) {\n this.setPeerStatus();\n }\n });\n\n listenerSetter.add(rootScope)('contacts_update', async(userId) => {\n if(this.peerId === userId.toPeerId()) {\n const user = await this.managers.appUsersManager.getUser(userId);\n if(!user.pFlags.self || !this.isDialog) {\n this.fillUserPhone();\n }\n }\n });\n\n listenerSetter.add(rootScope)('avatar_update', async(data) => {\n if(await n(data)) {\n this.setAvatar();\n }\n });\n\n this.setPeerStatusInterval = window.setInterval(() => this.setPeerStatus(), 60e3);\n }\n\n private async setPeerStatus(\n needClear = false,\n manual?: T\n ): Promise void : void> {\n const peerId = this.peerId;\n\n const callbacks: Array<() => void> = [];\n callbacks.push(() => {\n this.element.classList.toggle('is-me', peerId === rootScope.myId);\n });\n\n let promise: Promise<(() => void) | void> = Promise.resolve();\n if(!(!peerId || (rootScope.myId === peerId && this.isDialog))) {\n const isForum = await this.managers.appPeersManager.isForum(this.peerId);\n const middleware = this.middlewareHelper.get();\n if(isForum && this.threadId) {\n promise = wrapTopicNameButton({\n peerId,\n wrapOptions: {\n middleware\n }\n }).then(({element}) => {\n this.subtitle.replaceChildren(element);\n });\n } else {\n promise = appImManager.setPeerStatus({\n peerId,\n element: this.subtitle,\n needClear,\n useWhitespace: true,\n middleware,\n ignoreSelf: !this.isDialog\n });\n }\n\n promise.then((callback) => callback && callbacks.push(callback));\n }\n\n const callback = () => callbacks.forEach((callback) => callback());\n\n return promise.then(() => {\n if(manual) {\n return callback;\n }\n\n callback();\n }) as any;\n }\n\n public cleanupHTML() {\n [\n this.bio,\n this.phone,\n this.username,\n this.location,\n this.link\n ].forEach((row) => {\n row.container.style.display = 'none';\n });\n\n if(this.notifications) {\n this.notifications.container.style.display = '';\n this.notifications.checkboxField.checked = true;\n }\n\n this.clearSetMoreDetailsTimeout();\n }\n\n private canBeDetailed() {\n return this.peerId !== rootScope.myId || !this.isDialog;\n }\n\n private createAvatar() {\n const avatar = new AvatarElement();\n avatar.classList.add('profile-avatar', 'avatar-120');\n avatar.isDialog = this.isDialog;\n avatar.attachClickEvent();\n return avatar;\n }\n\n private async _setAvatar() {\n const {peerId} = this;\n const isTopic = !!(this.threadId && await this.managers.appPeersManager.isForum(peerId));\n if(this.canBeDetailed() && !isTopic) {\n const photo = await this.managers.appPeersManager.getPeerPhoto(peerId);\n\n if(photo) {\n const oldAvatars = this.avatars;\n this.avatars = new PeerProfileAvatars(this.scrollable, this.managers);\n await this.avatars.setPeer(peerId);\n\n return () => {\n this.avatars.info.append(this.name, this.subtitle);\n\n this.avatar?.remove();\n this.avatar = undefined;\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 }\n }\n\n const avatar = this.createAvatar();\n await avatar.updateWithOptions({\n peerId,\n threadId: isTopic ? this.threadId : undefined,\n wrapOptions: {\n customEmojiSize: makeMediaSize(120, 120),\n middleware: this.middlewareHelper.get()\n }\n });\n\n return () => {\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.cleanup();\n this.avatars = undefined;\n }\n\n this.avatar?.remove();\n this.avatar = avatar;\n\n this.section.content.prepend(this.avatar, this.name, this.subtitle);\n };\n }\n\n private setAvatar(manual?: T): T extends true ? Promise<() => void> : Promise {\n const promise = this._setAvatar();\n return manual ? promise : promise.then((callback) => callback()) as any;\n }\n\n private getUsernamesAlso(usernames: string[]) {\n const also = usernames.slice(1);\n if(also.length) {\n const a = also.map((username) => anchorCopy({username}));\n const i = i18n('UsernameAlso', [join(a, false)]);\n return i;\n }\n }\n\n private async fillUsername() {\n const {peerId} = this;\n if(peerId.isUser() && this.canBeDetailed()) {\n const usernames = await this.managers.appPeersManager.getPeerActiveUsernames(peerId);\n const also = this.getUsernamesAlso(usernames);\n\n return () => {\n this.username.subtitle.replaceChildren(also || i18n('Username'));\n setText(usernames[0], this.username);\n };\n }\n }\n\n private async fillUserPhone() {\n const {peerId} = this;\n if(peerId.isUser() && this.canBeDetailed()) {\n const {phone, isAnonymous} = await this.managers.appUsersManager.getUserPhone(peerId.toUserId()) || {};\n\n return () => {\n this.phone.subtitle.replaceChildren(i18n(isAnonymous ? 'AnonymousNumber' : 'Phone'));\n setText(phone ? formatUserPhone(phone) : undefined, this.phone);\n };\n }\n }\n\n private async fillNotifications() {\n const notificationsRow = this.notifications;\n if(!notificationsRow) {\n return;\n }\n\n if(this.canBeDetailed()) {\n const muted = await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.peerId, respectType: false, threadId: this.threadId});\n return () => {\n notificationsRow.checkboxField.checked = !muted;\n };\n } else {\n return () => {\n // fastRaf(() => {\n notificationsRow.container.style.display = 'none';\n // });\n };\n }\n }\n\n private async fillName() {\n const {peerId} = this;\n const [element/* , icons */] = await Promise.all([\n wrapPeerTitle({\n peerId,\n dialog: this.isDialog,\n withIcons: !this.threadId,\n threadId: this.threadId\n })\n\n // generateTitleIcons(peerId)\n ]);\n\n return () => {\n replaceContent(this.name, element);\n // this.name.append(...icons);\n };\n }\n\n private async fillRows(manual: Promise) {\n return Promise.all([\n this.fillName(),\n this.fillUsername(),\n this.fillUserPhone(),\n this.fillNotifications(),\n this.setMoreDetails(undefined, manual),\n this.setPeerStatus(true, true)\n ]).then((callbacks) => {\n return () => {\n callbacks.forEach((callback) => callback?.());\n };\n });\n }\n\n public async fillProfileElements() {\n if(!this.cleaned) return;\n this.cleaned = false;\n\n this.cleanupHTML();\n const deferred = deferredPromise();\n const middleware = this.middlewareHelper.get();\n middleware.onClean(() => {\n deferred.reject();\n });\n\n const callbacks = await Promise.all([\n this.setAvatar(true),\n this.fillRows(deferred)\n ]);\n\n return () => {\n deferred.resolve();\n callbacks.forEach((callback) => callback?.());\n };\n }\n\n private async _setMoreDetails(peerId: PeerId, peerFull?: ChatFull | UserFull) {\n const m = this.getMiddlewarePromise();\n const isTopic = !!(this.threadId && await m(this.managers.appPeersManager.isForum(peerId)));\n if(isTopic) {\n let url = 'https://t.me/';\n const threadId = getServerMessageId(this.threadId);\n const username = await m(this.managers.appPeersManager.getPeerUsername(peerId));\n if(username) {\n url += `${username}/${threadId}`;\n } else {\n url += `c/${peerId.toChatId()}/${threadId}`;\n }\n\n return () => {\n setText(url, this.link);\n };\n }\n\n const callbacks: (() => void)[] = [];\n // if(peerFull.about) {\n callbacks.push(() => {\n this.bio.subtitle.replaceChildren(i18n(peerId.isUser() ? 'UserBio' : 'Info'));\n setText(peerFull.about ? wrapRichText(peerFull.about) : undefined, this.bio);\n });\n // }\n\n if(!peerId.isUser()) {\n const chat = await m(this.managers.appChatsManager.getChat(peerId.toChatId())) as Chat.channel;\n const usernames = getPeerActiveUsernames(chat);\n let also: HTMLElement;\n if(usernames.length) {\n also = this.getUsernamesAlso(usernames);\n callbacks.push(() => setText('https://t.me/' + usernames[0], this.link));\n } else {\n const exportedInvite = (peerFull as ChatFull.channelFull).exported_invite;\n if(exportedInvite?._ === 'chatInviteExported') {\n callbacks.push(() => setText(exportedInvite.link, this.link));\n }\n }\n\n callbacks.push(() => this.link.subtitle.replaceChildren(also || i18n('SetUrlPlaceholder')));\n }\n\n const location = (peerFull as ChatFull.channelFull).location;\n if(location?._ == 'channelLocation') {\n callbacks.push(() => setText(location.address, this.location));\n }\n\n this.setMoreDetailsTimeout = window.setTimeout(() => this.setMoreDetails(true), 60e3);\n\n return () => {\n callbacks.forEach((callback) => callback());\n };\n }\n\n private async setMoreDetails(override?: true, manual?: Promise) {\n this.clearSetMoreDetailsTimeout();\n\n const {peerId} = this;\n const m = this.getMiddlewarePromise();\n\n if(!peerId || !this.canBeDetailed() || await m(this.managers.appPeersManager.isPeerRestricted(peerId))) {\n return;\n }\n\n const result = await m(this.managers.acknowledged.appProfileManager.getProfileByPeerId(peerId, override));\n const setPromise = m(result.result).then(async(peerFull) => {\n if(await m(this.managers.appPeersManager.isPeerRestricted(peerId))) {\n // this.log.warn('peer changed');\n return;\n }\n\n return await m(this._setMoreDetails(peerId, peerFull));\n });\n\n if(result.cached && manual) {\n return setPromise;\n } else {\n (manual || Promise.resolve())\n .then(() => setPromise)\n .then((callback) => {\n callback?.();\n });\n }\n }\n\n private getMiddlewarePromise() {\n return middlewarePromise(this.middlewareHelper.get(), makeError('MIDDLEWARE'));\n }\n\n public setPeer(peerId: PeerId, threadId?: number) {\n if(this.peerId === peerId && this.threadId === threadId) return;\n\n this.init?.();\n\n this.peerId = peerId;\n this.threadId = threadId;\n\n this.middlewareHelper.clean();\n this.cleaned = true;\n }\n\n public clearSetMoreDetailsTimeout() {\n if(this.setMoreDetailsTimeout !== undefined) {\n clearTimeout(this.setMoreDetailsTimeout);\n this.setMoreDetailsTimeout = undefined;\n }\n }\n\n public destroy() {\n this.peerId = this.threadId = undefined;\n this.clearSetMoreDetailsTimeout();\n clearInterval(this.setPeerStatusInterval);\n this.avatars?.cleanup();\n this.middlewareHelper.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 mediaSizes from '../helpers/mediaSizes';\nimport {Middleware} from '../helpers/middleware';\nimport {Chat, Document, EmojiStatus, User} from '../layer';\nimport rootScope from '../lib/rootScope';\nimport generateFakeIcon from './generateFakeIcon';\nimport generatePremiumIcon from './generatePremiumIcon';\nimport generateVerifiedIcon from './generateVerifiedIcon';\nimport wrapSticker from './wrappers/sticker';\n\nexport default async function generateTitleIcons(\n peerId: PeerId,\n middleware?: Middleware,\n noVerifiedIcon?: boolean,\n noFakeIcon?: boolean,\n noPremiumIcon?: boolean\n) {\n const elements: HTMLElement[] = [];\n const peer: Chat | User = await rootScope.managers.appPeersManager.getPeer(peerId);\n if((peer as Chat.channel).pFlags.verified && !noVerifiedIcon) {\n elements.push(generateVerifiedIcon());\n }\n\n if(((peer as Chat.channel).pFlags.fake || (peer as User.user).pFlags.scam) && !noFakeIcon) {\n elements.push(generateFakeIcon((peer as User.user).pFlags.scam));\n }\n\n if((peer as User.user).pFlags.premium && !noPremiumIcon) {\n const emojiStatus = (peer as User.user).emoji_status;\n if(emojiStatus && emojiStatus._ !== 'emojiStatusEmpty' && false) {\n const container = document.createElement('span');\n container.classList.add('emoji-status');\n const result = await rootScope.managers.acknowledged.appEmojiManager.getCustomEmojiDocument((emojiStatus as EmojiStatus.emojiStatus).document_id);\n const wrap = async(doc: Document.document) => {\n const size = mediaSizes.active.emojiStatus\n const loadPromises: Promise[] = [];\n await wrapSticker({\n doc,\n div: container,\n width: size.width,\n height: size.height,\n loop: 2,\n play: true,\n group: 'EMOJI-STATUS',\n loadPromises,\n middleware\n // group: 'none'\n });\n\n await Promise.all(loadPromises);\n };\n\n const p = result.result.then(wrap);\n if(result.cached) {\n await p;\n }\n\n elements.push(container);\n } else {\n elements.push(generatePremiumIcon());\n }\n }\n\n return elements;\n}\n","export default function generateVerifiedIcon() {\n const span = document.createElement('span');\n span.classList.add('verified-icon', 'tgico');\n\n const size = 26; // 24\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttributeNS(null, 'viewBox', `0 0 ${size} ${size}`);\n svg.setAttributeNS(null, 'width', `${size}`);\n svg.setAttributeNS(null, 'height', `${size}`);\n svg.classList.add('verified-icon-svg');\n\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use.setAttributeNS(null, 'href', '#verified-icon-background');\n use.classList.add('verified-icon-background');\n\n const use2 = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use2.setAttributeNS(null, 'href', '#verified-icon-check');\n use2.classList.add('verified-icon-check');\n\n // svg.append(use, use2);\n svg.append(use2, use);\n\n span.append(svg);\n\n return span;\n // const span = document.createElement('span');\n // span.classList.add('verified-icon', 'tgico-verified_filled');\n // return span;\n}\n","export default function generatePremiumIcon() {\n const span = document.createElement('span');\n span.classList.add('premium-icon', 'tgico-star');\n return span;\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';\nimport {i18n} from '../lib/langPack';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport {NULL_PEER_ID} from '../lib/mtproto/mtproto_config';\nimport limitSymbols from '../helpers/string/limitSymbols';\nimport setInnerHTML, {setDirection} from '../helpers/dom/setInnerHTML';\nimport safeAssign from '../helpers/object/safeAssign';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport getPeerTitle from './wrappers/getPeerTitle';\nimport generateTitleIcons from './generateTitleIcons';\nimport {wrapTopicIcon} from './wrappers/messageActionTextNewUnsafe';\n\nexport type PeerTitleOptions = {\n peerId?: PeerId,\n fromName?: string,\n plainText?: boolean,\n onlyFirstName?: boolean,\n dialog?: boolean,\n limitSymbols?: number,\n withIcons?: boolean,\n withPremiumIcon?: boolean,\n threadId?: number,\n wrapOptions?: WrapSomethingOptions\n};\n\nconst weakMap: WeakMap = new WeakMap();\n\nrootScope.addEventListener('peer_title_edit', ({peerId, threadId}) => {\n let query = `.peer-title[data-peer-id=\"${peerId}\"]`;\n if(threadId) {\n query += `[data-thread-id=\"${threadId}\"]`;\n }\n\n const elements = Array.from(document.querySelectorAll(query)) as HTMLElement[];\n elements.forEach((element) => {\n const peerTitle = weakMap.get(element);\n peerTitle?.update();\n });\n});\n\nexport default class PeerTitle {\n public element: HTMLElement;\n public options: PeerTitleOptions;\n private hasInner: boolean;\n\n constructor(options?: PeerTitleOptions) {\n this.element = document.createElement('span');\n this.element.classList.add('peer-title');\n setDirection(this.element);\n\n this.options = {};\n\n if(options) {\n this.update(options);\n }\n\n weakMap.set(this.element, this);\n }\n\n public setOptions(options?: PeerTitleOptions) {\n if(!options) {\n return;\n }\n\n safeAssign(this.options, options);\n for(const i in options) {\n // @ts-ignore\n const value = options[i];\n\n if(typeof(value) !== 'object' && typeof(value) !== 'function') {\n // @ts-ignore\n this.element.dataset[i] = value ? '' + (typeof(value) === 'boolean' ? +value : value) : '0';\n }\n }\n }\n\n private setHasInner(hasInner: boolean) {\n if(this.hasInner !== hasInner) {\n this.hasInner = hasInner;\n this.element.classList.toggle('with-icons', hasInner);\n }\n }\n\n public async update(options?: PeerTitleOptions) {\n this.setOptions(options);\n\n let fromName = this.options.fromName;\n if(fromName !== undefined) {\n if(this.options.limitSymbols !== undefined) {\n fromName = limitSymbols(fromName, this.options.limitSymbols, this.options.limitSymbols);\n }\n\n setInnerHTML(this.element, wrapEmojiText(fromName));\n return;\n }\n\n this.options.peerId ??= NULL_PEER_ID;\n\n let hasInner: boolean;\n const {peerId, threadId} = this.options;\n if(peerId !== rootScope.myId || !this.options.dialog) {\n if(threadId) {\n const [topic, isForum] = await Promise.all([\n rootScope.managers.dialogsStorage.getForumTopic(peerId, threadId),\n rootScope.managers.appPeersManager.isForum(peerId)\n ]);\n\n if(!topic && isForum) {\n rootScope.managers.dialogsStorage.getForumTopicById(peerId, threadId).then((forumTopic) => {\n if(!forumTopic && this.options.threadId === threadId) {\n this.options.threadId = undefined;\n this.update({threadId: undefined});\n return;\n }\n\n this.update();\n }, () => {\n if(this.options.threadId === threadId) {\n this.options.threadId = undefined;\n this.update({threadId: undefined});\n }\n });\n\n setInnerHTML(this.element, i18n('Loading'));\n this.setHasInner(false);\n return;\n }\n }\n\n const getTopicIconPromise = threadId && this.options.withIcons ?\n rootScope.managers.dialogsStorage.getForumTopic(peerId, threadId).then((topic) => wrapTopicIcon({...(this.options.wrapOptions ?? {}), topic})) :\n undefined;\n\n const [title, icons, topicIcon] = await Promise.all([\n getPeerTitle(this.options as Required),\n (this.options.withIcons && generateTitleIcons(peerId, this.options.wrapOptions?.middleware)) || (this.options.withPremiumIcon && generateTitleIcons(peerId, this.options.wrapOptions?.middleware, true, true)),\n getTopicIconPromise\n ]);\n\n if(icons?.length || topicIcon) {\n const inner = document.createElement('span');\n inner.classList.add('peer-title-inner');\n hasInner = true;\n setInnerHTML(inner, title);\n\n const fragment = document.createDocumentFragment();\n fragment.append(...[topicIcon, inner, ...(icons ?? [])].filter(Boolean));\n setInnerHTML(this.element, fragment);\n } else {\n setInnerHTML(this.element, title);\n }\n } else {\n replaceContent(this.element, i18n(this.options.onlyFirstName ? 'Saved' : 'SavedMessages'));\n }\n\n this.setHasInner(hasInner);\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 {AppDownloadManager} from '../../lib/appManagers/appDownloadManager';\nimport resizeableImage from '../../lib/cropper';\nimport PopupElement from '.';\nimport {_i18n} from '../../lib/langPack';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport readBlobAsDataURL from '../../helpers/blob/readBlobAsDataURL';\nimport rootScope from '../../lib/rootScope';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\n\nexport default class PopupAvatar extends PopupElement {\n private cropContainer: HTMLElement;\n private input: HTMLInputElement;\n private h6: HTMLElement;\n\n private image = new Image();\n\n private canvas: HTMLCanvasElement;\n private blob: Blob;\n private cropper = {\n crop: () => {},\n removeHandlers: () => {}\n };\n\n private onCrop: (upload: () => ReturnType) => void;\n\n constructor(options: Partial<{\n isForum: boolean\n }> = {}) {\n super('popup-avatar', {closable: true, withConfirm: true});\n\n this.h6 = document.createElement('h6');\n _i18n(this.h6, 'Popup.Avatar.Title');\n\n this.btnClose.classList.remove('btn-icon');\n\n this.header.append(this.h6);\n\n this.cropContainer = document.createElement('div');\n this.cropContainer.classList.add('crop');\n this.cropContainer.append(this.image);\n\n if(options.isForum) {\n this.cropContainer.classList.add('is-forum');\n }\n\n this.input = document.createElement('input');\n this.input.type = 'file';\n this.input.style.display = 'none';\n this.listenerSetter.add(this.input)('change', (e: any) => {\n const file = e.target.files[0];\n if(!file) {\n return;\n }\n\n readBlobAsDataURL(file).then((contents) => {\n this.image = new Image();\n this.cropContainer.append(this.image);\n this.image.src = contents;\n\n this.image.onload = () => {\n /* let {w, h} = calcImageInBox(this.image.naturalWidth, this.image.naturalHeight, 460, 554);\n cropContainer.style.width = w + 'px';\n cropContainer.style.height = h + 'px'; */\n this.show();\n\n this.cropper = resizeableImage(this.image, this.canvas);\n this.input.value = '';\n };\n });\n }, false);\n\n this.btnConfirm.className = 'btn-primary btn-color-primary btn-circle btn-crop btn-icon tgico-check z-depth-1';\n attachClickEvent(this.btnConfirm, () => {\n this.cropper.crop();\n this.hide();\n\n this.canvas.toBlob((blob) => {\n this.blob = blob; // save blob to send after reg\n this.darkenCanvas();\n this.resolve();\n }, 'image/jpeg', 1);\n }, {listenerSetter: this.listenerSetter});\n\n this.container.append(this.cropContainer, this.btnConfirm, this.input);\n\n this.addEventListener('closeAfterTimeout', () => {\n this.cropper.removeHandlers();\n if(this.image) {\n this.image.remove();\n }\n });\n }\n\n private resolve() {\n this.onCrop(() => {\n return appDownloadManager.upload(this.blob);\n });\n }\n\n public open(postCanvas: HTMLCanvasElement, onCrop: PopupAvatar['onCrop']) {\n this.canvas = postCanvas;\n this.onCrop = onCrop;\n\n this.input.click();\n }\n\n public darkenCanvas() {\n const ctx = this.canvas.getContext('2d');\n ctx.fillStyle = 'rgba(0, 0, 0, 0.3)';\n ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);\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\nfunction resizeableImage(originalImage: HTMLImageElement, canvas?: HTMLCanvasElement) {\n let cropComponent: HTMLDivElement,\n container: HTMLDivElement,\n cropImage: HTMLImageElement,\n event_state: Partial<{\n mouse_x: number,\n mouse_y: number,\n container_width: number,\n container_height: number,\n container_left: number,\n container_top: number\n }> = {},\n keyZoomValue = 4.0,\n MINWIDTH = 50,\n MINHEIGHT = 50,\n CROPWIDTH = 200,\n CROPHEIGHT = 200,\n cropLeft = 0,\n cropTop = 0,\n cropWidth = 0,\n cropHeight = 0,\n scaledRatio = 0;\n\n if(originalImage.complete) init();\n else originalImage.onload = init;\n\n function removeHandlers() {\n container.removeEventListener('mousedown', startMoving);\n container.removeEventListener('touchstart', startMoving);\n container.removeEventListener('wheel', resizing);\n\n document.removeEventListener('mouseup', endMoving);\n document.removeEventListener('touchend', endMoving);\n document.removeEventListener('mousemove', moving);\n document.removeEventListener('touchmove', moving);\n document.removeEventListener('keypress', keyHandler);\n\n cropComponent.remove();\n container.remove();\n cropImage.remove();\n }\n\n function addHandlers() {\n container.addEventListener('mousedown', startMoving, false);\n container.addEventListener('touchstart', startMoving, false);\n container.addEventListener('wheel', resizing, false);\n\n document.addEventListener('keypress', keyHandler, false);\n // document.querySelector('.btn-crop').addEventListener('click', openCropCanvasImg);\n }\n\n function init() {\n originalImage.classList.add('crop-blur');\n originalImage.draggable = false;\n\n cropImage = new Image();\n cropImage.src = originalImage.src;\n cropImage.draggable = false;\n cropImage.classList.add('crop-overlay-image');\n\n if(!canvas) {\n canvas = document.createElement('canvas');\n }\n\n cropComponent = document.createElement('div');\n cropComponent.classList.add('crop-component');\n\n container = document.createElement('div');\n container.classList.add('crop-overlay');\n\n const overlayColor = document.createElement('div');\n overlayColor.classList.add('crop-overlay-color');\n\n cropComponent.appendChild(container);\n const wrapper = originalImage.parentNode as HTMLElement;\n wrapper.appendChild(cropComponent);\n cropComponent.appendChild(cropImage);\n cropComponent.appendChild(originalImage);\n cropComponent.appendChild(overlayColor);\n container.appendChild(cropImage);\n\n cropImage.style.maxWidth = originalImage.width + 'px';\n\n scaledRatio = originalImage.naturalWidth / originalImage.offsetWidth;\n\n const left = originalImage.offsetWidth / 2 - CROPWIDTH / 2;\n const top = originalImage.offsetHeight / 2 - CROPHEIGHT / 2;\n\n updateCropSize(CROPWIDTH, CROPHEIGHT);\n updateCropImage(left, top);\n updateContainer(left, top);\n addHandlers();\n // crop();\n }\n\n function updateCropSize(width: number, height: number) {\n cropWidth = width * scaledRatio;\n cropHeight = height * scaledRatio;\n\n container.style.width = width + 'px';\n container.style.height = height + 'px';\n }\n\n function updateCropImage(left: number, top: number) {\n cropTop = top * scaledRatio;\n cropLeft = left * scaledRatio;\n\n cropImage.style.top = -top + 'px';\n cropImage.style.left = -left + 'px';\n }\n\n function updateContainer(left: number, top: number) {\n container.style.top = top + 'px';\n container.style.left = left + 'px';\n }\n\n // Save the initial event details and container state\n function saveEventState(e: any) {\n event_state.container_width = container.offsetWidth;\n event_state.container_height = container.offsetHeight;\n\n event_state.container_left = container.offsetLeft;\n event_state.container_top = container.offsetTop;\n\n event_state.mouse_x = (e.clientX || e.pageX || e.touches && e.touches[0].clientX) + window.scrollX;\n event_state.mouse_y = (e.clientY || e.pageY || e.touches && e.touches[0].clientY) + window.scrollY;\n }\n\n function imgZoom(zoom: number) {\n zoom = zoom * Math.PI * 2\n let newWidth = Math.floor(container.clientWidth + zoom),\n newHeight = Math.floor(container.clientHeight + zoom),\n w = cropImage.clientWidth,\n h = cropImage.clientHeight,\n left: number,\n top: number,\n right: number,\n bottom: number;\n\n if(newWidth < MINWIDTH) {\n return;\n } else if(newWidth > w) {\n return;\n }\n\n left = container.offsetLeft - (zoom / 2);\n top = container.offsetTop - (zoom / 2);\n right = left + newWidth;\n bottom = top + newHeight;\n\n if(left < 0) left = 0;\n if(top < 0) top = 0;\n\n if(right > w) return;\n if(bottom > h) return;\n\n updateCropSize(newWidth, newWidth);\n updateCropImage(left, top);\n updateContainer(left, top);\n // crop();\n }\n\n function keyHandler(e: KeyboardEvent) {\n e.preventDefault();\n\n switch(String.fromCharCode(e.charCode)) {\n case '+':\n imgZoom(keyZoomValue);\n break;\n case '-':\n imgZoom(-keyZoomValue);\n break;\n }\n }\n\n function resizing(e: any) {\n e.preventDefault();\n imgZoom(e.deltaY > 0 ? 1 : -1);\n }\n\n function startMoving(e: MouseEvent | TouchEvent) {\n e.preventDefault();\n e.stopPropagation();\n\n saveEventState(e);\n\n document.addEventListener('mousemove', moving);\n document.addEventListener('touchmove', moving);\n document.addEventListener('mouseup', endMoving);\n document.addEventListener('touchend', endMoving);\n }\n\n function endMoving(e: MouseEvent | TouchEvent) {\n e.preventDefault();\n\n document.removeEventListener('mouseup', endMoving);\n document.removeEventListener('touchend', endMoving);\n document.removeEventListener('mousemove', moving);\n document.removeEventListener('touchmove', moving);\n }\n\n function moving(e: any) {\n let currentTouch = {x: 0, y: 0},\n left: number,\n top: number,\n w: number,\n h: number;\n\n e.preventDefault();\n e.stopPropagation();\n\n currentTouch.x = e.pageX || e.touches && e.touches[0].pageX;\n currentTouch.y = e.pageY || e.touches && e.touches[0].pageY;\n\n left = currentTouch.x - (event_state.mouse_x - event_state.container_left);\n top = currentTouch.y - (event_state.mouse_y - event_state.container_top);\n w = container.offsetWidth;\n h = container.offsetHeight;\n\n if(left < 0) left = 0;\n else if(left > cropImage.offsetWidth - w) left = cropImage.offsetWidth - w;\n\n if(top < 0) top = 0;\n else if(top > cropImage.offsetHeight - h) top = cropImage.offsetHeight - h;\n\n updateCropImage(left, top);\n updateContainer(left, top);\n // crop();\n }\n\n function crop() {\n canvas.width = cropWidth;\n canvas.height = cropHeight;\n\n const ctx = canvas.getContext('2d');\n ctx.drawImage(originalImage,\n cropLeft, cropTop,\n cropWidth, cropHeight,\n 0, 0,\n cropWidth, cropHeight\n );\n }\n\n return {crop, removeHandlers};\n}\n\nexport default resizeableImage;\n","/*\n * 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 '.';\nimport type {PeerType} from '../../lib/appManagers/appPeersManager';\nimport {FormatterArguments, LangPackKey} from '../../lib/langPack';\nimport wrapPeerTitle from '../wrappers/peerTitle';\nimport PopupPeer, {PopupPeerButtonCallbackCheckboxes, PopupPeerOptions} from './peer';\n\nexport default class PopupDeleteDialog {\n constructor(\n private peerId: PeerId,\n // actionType: 'leave' | 'delete',\n private peerType?: PeerType,\n private onSelect?: (promise: Promise) => void,\n private threadId?: number\n ) {\n this.construct();\n }\n\n private async construct() {\n let {peerId, peerType, onSelect, threadId} = this;\n const peerTitleElement = await wrapPeerTitle({peerId, threadId: threadId});\n\n const managers = PopupElement.MANAGERS;\n if(peerType === undefined) {\n peerType = await managers.appPeersManager.getDialogType(peerId);\n }\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 = managers.appChatsManager.leave(peerId.toChatId());\n\n if(flush) {\n promise = promise.then(() => {\n return managers.appMessagesManager.flushHistory(peerId);\n }) as any;\n }\n\n onSelect?.(promise);\n };\n\n const callbackDelete = (checked: PopupPeerButtonCallbackCheckboxes) => {\n let promise: Promise;\n\n if(threadId) {\n promise = managers.appMessagesManager.flushHistory(peerId, false, true, threadId);\n } else if(peerId.isUser()) {\n promise = managers.appMessagesManager.flushHistory(peerId, false, checkboxes ? !!checked.size : undefined);\n } else {\n if(checked.size) {\n promise = managers.appChatsManager.delete(peerId.toChatId());\n } else {\n return callbackLeave(checked);\n }\n }\n\n onSelect?.(promise);\n };\n\n let title: LangPackKey,\n titleArgs: FormatterArguments,\n description: LangPackKey,\n descriptionArgs: FormatterArguments,\n buttons: PopupPeerOptions['buttons'],\n checkboxes: PopupPeerOptions['checkboxes'];\n switch(peerType) {\n case 'channel': {\n if(/* actionType === 'delete' && */await managers.appChatsManager.hasRights(peerId.toChatId(), 'delete_chat')) {\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 await wrapPeerTitle({peerId})\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(threadId) {\n title = 'DeleteTopics';\n titleArgs = [1];\n description = 'DeleteSelectedTopic';\n descriptionArgs = [peerTitleElement];\n buttons = [{\n langKey: 'Delete',\n isDanger: true,\n callback: callbackDelete\n }];\n } else if(/* actionType === 'delete' && */await managers.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 threadId,\n titleLangKey: title,\n titleLangArgs: titleArgs,\n descriptionLangKey: description,\n descriptionLangArgs: descriptionArgs,\n buttons,\n checkboxes\n }).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 rootScope from '../../lib/rootScope';\nimport PopupElement, {addCancelButton} from '.';\nimport PopupPeer, {PopupPeerButtonCallbackCheckboxes, PopupPeerOptions} from './peer';\nimport {ChatType} from '../chat/chat';\nimport {i18n, LangPackKey} from '../../lib/langPack';\nimport hasRights from '../../lib/appManagers/utils/chats/hasRights';\nimport filterAsync from '../../helpers/array/filterAsync';\nimport wrapPeerTitle from '../wrappers/peerTitle';\n\nexport default class PopupDeleteMessages {\n constructor(\n private peerId: PeerId,\n private mids: number[],\n private type: ChatType,\n private onConfirm?: () => void,\n private threadId?: number\n ) {\n this.construct();\n }\n\n private async construct() {\n let {peerId, mids, type, onConfirm, threadId} = this;\n\n const peerTitleElement = await wrapPeerTitle({peerId, threadId});\n\n const managers = PopupElement.MANAGERS;\n\n mids = mids.slice();\n const callback = (checked: PopupPeerButtonCallbackCheckboxes, revoke?: boolean) => {\n onConfirm && onConfirm();\n if(type === 'scheduled') {\n managers.appMessagesManager.deleteScheduledMessages(peerId, mids);\n } else {\n managers.appMessagesManager.deleteMessages(peerId, mids, !!checked.size || revoke);\n }\n };\n\n const buttons: PopupPeerOptions['buttons'] = [{\n langKey: 'Delete',\n isDanger: true,\n callback\n }];\n const checkboxes: PopupPeerOptions['checkboxes'] = [];\n let title: LangPackKey, titleArgs: any[], description: LangPackKey, descriptionArgs: any[];\n if(mids.length === 1) {\n title = 'DeleteSingleMessagesTitle';\n } else {\n title = 'DeleteMessagesTitle';\n titleArgs = [i18n('messages', [mids.length])];\n }\n\n if(await managers.appPeersManager.isMegagroup(peerId)) {\n description = mids.length === 1 ? 'AreYouSureDeleteSingleMessageMega' : 'AreYouSureDeleteFewMessagesMega';\n } else {\n description = mids.length === 1 ? 'AreYouSureDeleteSingleMessage' : 'AreYouSureDeleteFewMessages';\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 = await managers.appChatsManager.getChat(peerId.toChatId());\n\n const _hasRights = hasRights(chat, 'delete_messages');\n if(chat._ === 'chat') {\n const canRevoke = _hasRights ? mids.slice() : await filterAsync(mids, async(mid) => {\n const message = await managers.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 threadId,\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 appImManager from '../../lib/appManagers/appImManager';\nimport rootScope from '../../lib/rootScope';\nimport {toastNew} from '../toast';\nimport PopupPickUser from './pickUser';\n\nexport default class PopupForward extends PopupPickUser {\n constructor(\n peerIdMids?: {[fromPeerId: PeerId]: number[]},\n onSelect?: (peerId: PeerId) => Promise | void\n ) {\n super({\n peerTypes: ['dialogs', 'contacts'],\n onSelect: !peerIdMids && onSelect ? onSelect : async(peerId) => {\n if(onSelect) {\n const res = onSelect(peerId);\n if(res instanceof Promise) {\n await res;\n }\n }\n\n if(peerId === rootScope.myId) {\n let count = 0;\n for(const fromPeerId in peerIdMids) {\n const mids = peerIdMids[fromPeerId];\n count += mids.length;\n this.managers.appMessagesManager.forwardMessages(peerId, fromPeerId.toPeerId(), mids);\n }\n\n toastNew({\n langPackKey: count > 0 ? 'FwdMessagesToSavedMessages' : 'FwdMessageToSavedMessages'\n });\n\n return;\n }\n\n appImManager.setInnerPeer({peerId});\n appImManager.chat.input.initMessagesForward(peerIdMids);\n },\n placeholder: 'ShareModal.Search.ForwardPlaceholder',\n chatRightsAction: 'send_messages',\n selfPresence: 'ChatYourSelf'\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 ripple from '../ripple';\nimport animationIntersector from '../animationIntersector';\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\nimport {i18n, LangPackKey, _i18n} from '../../lib/langPack';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport isSendShortcutPressed from '../../helpers/dom/isSendShortcutPressed';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport EventListenerBase, {EventListenerListeners} from '../../helpers/eventListenerBase';\nimport {addFullScreenListener, getFullScreenElement} from '../../helpers/dom/fullScreen';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport overlayCounter from '../../helpers/overlayCounter';\nimport Scrollable from '../scrollable';\nimport {getMiddleware, MiddlewareHelper} from '../../helpers/middleware';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\n\nexport type PopupButton = {\n text?: string,\n callback?: () => void,\n langKey?: LangPackKey,\n langArgs?: any[],\n isDanger?: boolean,\n isCancel?: boolean,\n element?: HTMLButtonElement,\n noRipple?: boolean\n};\n\nexport type PopupOptions = Partial<{\n closable: boolean,\n overlayClosable: boolean,\n withConfirm: LangPackKey | boolean,\n body: boolean,\n confirmShortcutIsSendShortcut: boolean,\n withoutOverlay: boolean,\n scrollable: boolean,\n buttons: Array,\n title: boolean | LangPackKey,\n titleRaw: string\n}>;\n\nexport interface PopupElementConstructable {\n new(...args: any[]): T;\n}\n\nconst DEFAULT_APPEND_TO = document.body;\nlet appendPopupTo = DEFAULT_APPEND_TO;\n\nconst onFullScreenChange = () => {\n appendPopupTo = getFullScreenElement() || DEFAULT_APPEND_TO;\n PopupElement.reAppend();\n};\n\naddFullScreenListener(DEFAULT_APPEND_TO, onFullScreenChange);\n\ntype PopupListeners = {\n close: () => void,\n closeAfterTimeout: () => void\n};\n\nexport default class PopupElement extends EventListenerBase {\n private static POPUPS: PopupElement[] = [];\n public static MANAGERS: AppManagers;\n\n protected element = document.createElement('div');\n protected container = document.createElement('div');\n protected header = document.createElement('div');\n protected title = document.createElement('div');\n protected btnClose: HTMLElement;\n protected btnConfirm: HTMLButtonElement;\n protected body: HTMLElement;\n protected buttonsEl: HTMLElement;\n\n protected onEscape: () => boolean = () => true;\n\n protected navigationItem: NavigationItem;\n\n protected listenerSetter: ListenerSetter;\n\n protected confirmShortcutIsSendShortcut: boolean;\n protected btnConfirmOnEnter: HTMLElement;\n\n protected withoutOverlay: boolean;\n\n protected managers: AppManagers;\n\n protected scrollable: Scrollable;\n\n protected buttons: Array;\n\n protected middlewareHelper: MiddlewareHelper;\n\n constructor(className: string, options: PopupOptions = {}) {\n super(false);\n this.element.classList.add('popup');\n this.element.className = 'popup' + (className ? ' ' + className : '');\n this.container.classList.add('popup-container', 'z-depth-1');\n\n this.header.classList.add('popup-header');\n\n if(options.title || options.titleRaw) {\n this.title.classList.add('popup-title');\n if(typeof(options.title) === 'string') {\n _i18n(this.title, options.title);\n } else if(options.titleRaw) {\n this.title.append(wrapEmojiText(options.titleRaw));\n }\n\n this.header.append(this.title);\n }\n\n this.middlewareHelper = getMiddleware();\n this.listenerSetter = new ListenerSetter();\n this.managers = PopupElement.MANAGERS;\n\n this.confirmShortcutIsSendShortcut = options.confirmShortcutIsSendShortcut;\n\n if(options.closable) {\n this.btnClose = document.createElement('span');\n this.btnClose.classList.add('btn-icon', 'popup-close', 'tgico-close');\n // ripple(this.closeBtn);\n this.header.prepend(this.btnClose);\n\n attachClickEvent(this.btnClose, this.hide, {listenerSetter: this.listenerSetter, once: true});\n }\n\n this.withoutOverlay = options.withoutOverlay;\n if(this.withoutOverlay) {\n this.element.classList.add('no-overlay');\n }\n\n if(options.overlayClosable) {\n attachClickEvent(this.element, (e: MouseEvent) => {\n if(!findUpClassName(e.target, 'popup-container')) {\n this.hide();\n }\n }, {listenerSetter: this.listenerSetter});\n }\n\n if(options.withConfirm) {\n this.btnConfirm = document.createElement('button');\n this.btnConfirm.classList.add('btn-primary', 'btn-color-primary');\n if(options.withConfirm !== true) {\n this.btnConfirm.append(i18n(options.withConfirm));\n }\n this.header.append(this.btnConfirm);\n ripple(this.btnConfirm);\n }\n\n this.container.append(this.header);\n if(options.body) {\n this.body = document.createElement('div');\n this.body.classList.add('popup-body');\n this.container.append(this.body);\n }\n\n if(options.scrollable) {\n const scrollable = this.scrollable = new Scrollable(this.body);\n this.attachScrollableListeners();\n\n if(!this.body) {\n this.container.insertBefore(scrollable.container, this.header.nextSibling);\n }\n }\n\n let btnConfirmOnEnter = this.btnConfirm;\n const buttons = this.buttons = options.buttons;\n if(buttons?.length) {\n const buttonsDiv = this.buttonsEl = document.createElement('div');\n buttonsDiv.classList.add('popup-buttons');\n\n const buttonsElements = buttons.map((b) => {\n const button = document.createElement('button');\n button.className = 'btn' + (b.isDanger ? ' danger' : ' primary');\n\n if(!b.noRipple) {\n ripple(button);\n }\n\n if(b.text) {\n button.textContent = b.text;\n } else {\n button.append(i18n(b.langKey, b.langArgs));\n }\n\n attachClickEvent(button, () => {\n b.callback?.();\n this.destroy();\n }, {listenerSetter: this.listenerSetter, once: true});\n\n return b.element = button;\n });\n\n if(!btnConfirmOnEnter && buttons.length === 2) {\n const button = buttons.find((button) => !button.isCancel);\n if(button) {\n btnConfirmOnEnter = button.element;\n }\n }\n\n buttonsDiv.append(...buttonsElements);\n this.container.append(buttonsDiv);\n }\n\n this.btnConfirmOnEnter = btnConfirmOnEnter;\n\n this.element.append(this.container);\n\n PopupElement.POPUPS.push(this);\n }\n\n protected attachScrollableListeners(setClassOn?: HTMLElement) {\n return this.scrollable.attachBorderListeners(setClassOn);\n }\n\n protected onContentUpdate() {\n if(this.scrollable) {\n this.scrollable.onAdditionalScroll();\n }\n }\n\n public show() {\n this.navigationItem = {\n type: 'popup',\n onPop: () => this.destroy(),\n onEscape: this.onEscape\n };\n\n appNavigationController.pushItem(this.navigationItem);\n\n blurActiveElement(); // * hide mobile keyboard\n appendPopupTo.append(this.element);\n void this.element.offsetWidth; // reflow\n this.element.classList.add('active');\n\n this.onContentUpdate();\n\n if(!this.withoutOverlay) {\n overlayCounter.isOverlayActive = true;\n animationIntersector.checkAnimations2(true);\n }\n\n // cannot add event instantly because keydown propagation will fire it\n // if(this.btnConfirmOnEnter) {\n setTimeout(() => {\n if(!this.element.classList.contains('active')) {\n return;\n }\n\n this.listenerSetter.add(document.body)('keydown', (e) => {\n if(PopupElement.POPUPS[PopupElement.POPUPS.length - 1] !== this) {\n return;\n }\n\n if(this.confirmShortcutIsSendShortcut ? isSendShortcutPressed(e) : e.key === 'Enter') {\n simulateClickEvent(this.btnConfirmOnEnter);\n cancelEvent(e);\n }\n });\n }, 0);\n // }\n }\n\n public hide = () => {\n appNavigationController.backByItem(this.navigationItem);\n };\n\n protected destroy() {\n this.dispatchEvent('close');\n this.element.classList.add('hiding');\n this.element.classList.remove('active');\n this.listenerSetter.removeAll();\n this.middlewareHelper.destroy();\n\n if(!this.withoutOverlay) {\n overlayCounter.isOverlayActive = false;\n }\n\n appNavigationController.removeItem(this.navigationItem);\n this.navigationItem = undefined;\n\n indexOfAndSplice(PopupElement.POPUPS, this);\n\n // ! calm\n onFullScreenChange();\n\n setTimeout(() => {\n this.element.remove();\n this.dispatchEvent('closeAfterTimeout');\n this.cleanup();\n this.scrollable?.destroy();\n\n if(!this.withoutOverlay) {\n animationIntersector.checkAnimations2(false);\n }\n }, 150);\n }\n\n public static reAppend() {\n this.POPUPS.forEach((popup) => {\n const {element, container} = popup;\n const parentElement = element.parentElement;\n if(parentElement && parentElement !== appendPopupTo && appendPopupTo !== container) {\n appendPopupTo.append(element);\n }\n });\n }\n\n public static getPopups(popupConstructor: PopupElementConstructable) {\n return this.POPUPS.filter((element) => element instanceof popupConstructor) as T[];\n }\n\n public static createPopup>(ctor: {new(...args: A): T}, ...args: A) {\n const popup = new ctor(...args);\n return popup;\n }\n}\n\nexport const addCancelButton = (buttons: PopupButton[]) => {\n const button = buttons.find((b) => b.isCancel);\n if(!button) {\n buttons.push({\n langKey: 'Cancel',\n isCancel: true\n });\n }\n\n return buttons;\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 {doubleRaf} from '../../helpers/schedulers';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {LangPackKey, _i18n, i18n} from '../../lib/langPack';\nimport {ApiLimitType} from '../../lib/mtproto/api_methods';\nimport rootScope from '../../lib/rootScope';\nimport PopupPeer from './peer';\n\nconst a: {[type in ApiLimitType]?: {\n title: LangPackKey,\n description: LangPackKey,\n descriptionPremium: LangPackKey,\n descriptionLocked: LangPackKey,\n icon: string\n}} = {\n pin: {\n title: 'LimitReached',\n description: 'LimitReachedPinDialogs',\n descriptionPremium: 'LimitReachedPinDialogsPremium',\n descriptionLocked: 'LimitReachedPinDialogsLocked',\n icon: 'limit_pin'\n },\n folders: {\n title: 'LimitReached',\n description: 'LimitReachedFolders',\n descriptionPremium: 'LimitReachedFoldersPremium',\n descriptionLocked: 'LimitReachedFoldersLocked',\n icon: 'limit_folders'\n }\n};\n\nclass P extends PopupPeer {\n constructor(options: {\n isPremium: boolean,\n limit: number,\n limitPremium: number\n }, _a: typeof a[keyof typeof a]) {\n super('popup-limit', {\n buttons: options.isPremium === undefined ? [{\n langKey: 'LimitReached.Ok',\n isCancel: true\n }] : (options.isPremium ? [{\n langKey: 'OK',\n isCancel: true\n }] : [{\n langKey: 'IncreaseLimit',\n callback: () => {\n appImManager.openPremiumBot();\n },\n noRipple: true\n }, {\n langKey: 'Cancel',\n isCancel: true\n }]),\n descriptionLangKey: options.isPremium === undefined ? _a.descriptionLocked : (options.isPremium ? _a.descriptionPremium : _a.description),\n descriptionLangArgs: options.isPremium ? [options.limitPremium] : [options.limit, options.limitPremium],\n titleLangKey: _a.title\n });\n\n const isLocked = options.isPremium === undefined;\n if(isLocked) {\n this.element.classList.add('is-locked');\n } else if(options.isPremium) {\n this.element.classList.add('is-premium');\n } else {\n const button = this.buttons.find((b) => !b.isCancel);\n button.element.classList.add('popup-limit-button');\n const i = document.createElement('i');\n i.classList.add('popup-limit-button-icon', 'tgico-premium_double');\n button.element.append(i);\n }\n\n const limitContainer = document.createElement('div');\n limitContainer.classList.add('popup-limit-line');\n\n const hint = document.createElement('div');\n hint.classList.add('popup-limit-hint');\n const i = document.createElement('span');\n i.classList.add('popup-limit-hint-icon', 'tgico-' + _a.icon);\n hint.append(i, '' + (options.isPremium ? options.limitPremium : options.limit));\n\n limitContainer.append(hint);\n\n if(!isLocked) {\n const limit = document.createElement('div');\n limit.classList.add('limit-line');\n\n const free = document.createElement('div');\n free.classList.add('limit-line-free');\n\n const premium = document.createElement('div');\n premium.classList.add('limit-line-premium');\n\n limit.append(free, premium);\n\n _i18n(free, 'LimitFree');\n premium.append(i18n('LimitPremium'), '' + options.limitPremium);\n\n limitContainer.append(limit);\n }\n\n this.container.insertBefore(limitContainer, this.description);\n\n // if(options.isPremium === false) {\n // this.buttons.pop().element.remove();\n // }\n\n const setHintActive = () => {\n hint.classList.add('active');\n };\n\n if(rootScope.settings.animationsEnabled) {\n doubleRaf().then(setHintActive);\n } else {\n setHintActive();\n }\n }\n}\n\nexport default async function showLimitPopup(type: keyof typeof a) {\n const _a = a[type];\n const [appConfig, limit, limitPremium] = await Promise.all([\n rootScope.managers.apiManager.getAppConfig(),\n ...[false, true].map((v) => rootScope.managers.apiManager.getLimit(type, v))\n ]);\n const isLocked = appConfig.premium_purchase_blocked;\n new P({\n isPremium: isLocked ? undefined : rootScope.premium,\n limit,\n limitPremium\n }, _a).show();\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 tsNow from '../../helpers/tsNow';\nimport {LangPackKey} from '../../lib/langPack';\nimport {MUTE_UNTIL} from '../../lib/mtproto/mtproto_config';\nimport {RadioFormFromValues} from '../row';\nimport PopupPeer from './peer';\n\nconst ONE_HOUR = 3600;\nconst times: {value: number | string, langPackKey: LangPackKey, checked?: boolean}[] = [{\n value: ONE_HOUR,\n langPackKey: 'ChatList.Mute.1Hour'\n}, {\n value: ONE_HOUR * 4,\n langPackKey: 'ChatList.Mute.4Hours'\n}, {\n value: ONE_HOUR * 8,\n langPackKey: 'ChatList.Mute.8Hours'\n}, {\n value: ONE_HOUR * 24,\n langPackKey: 'ChatList.Mute.1Day'\n}, {\n value: ONE_HOUR * 24 * 3,\n langPackKey: 'ChatList.Mute.3Days'\n}, {\n value: -1,\n langPackKey: 'ChatList.Mute.Forever',\n checked: true\n}];\n\nexport default class PopupMute extends PopupPeer {\n constructor(peerId: PeerId, threadId?: number) {\n super('popup-mute', {\n peerId,\n titleLangKey: 'Notifications',\n buttons: [{\n langKey: 'ChatList.Context.Mute',\n callback: () => {\n this.managers.appMessagesManager.mutePeer({peerId, muteUntil: time === -1 ? MUTE_UNTIL : tsNow(true) + time, threadId});\n }\n }],\n body: true\n });\n\n let time: number;\n const radioForm = RadioFormFromValues(times, (value) => {\n time = +value;\n });\n\n this.body.append(radioForm);\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 AvatarElement from '../avatar';\nimport PopupElement, {addCancelButton, PopupButton, PopupOptions} from '.';\nimport {i18n, LangPackKey} from '../../lib/langPack';\nimport CheckboxField, {CheckboxFieldOptions} from '../checkboxField';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\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 = Omit & Partial<{\n peerId: PeerId,\n threadId: number,\n title: string | HTMLElement,\n titleLangKey: LangPackKey,\n titleLangArgs: any[],\n noTitle: boolean,\n description: string | DocumentFragment,\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 : ''), {\n overlayClosable: true,\n ...options,\n title: true,\n buttons: options.buttons && addCancelButton(options.buttons)\n });\n\n if(options.peerId) {\n const avatarEl = new AvatarElement();\n avatarEl.classList.add('avatar-32');\n avatarEl.updateWithOptions({\n isDialog: true,\n peerId: options.peerId,\n threadId: options.threadId,\n wrapOptions: {\n middleware: this.middlewareHelper.get()\n }\n });\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) setInnerHTML(p, 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 = true;\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","/*\n * 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 AppSelectPeers from '../appSelectPeers';\nimport PopupElement from '.';\nimport {LangPackKey, _i18n} from '../../lib/langPack';\n\nexport default class PopupPickUser extends PopupElement {\n protected selector: AppSelectPeers;\n\n constructor(options: {\n peerTypes: AppSelectPeers['peerType'],\n onSelect?: (peerId: PeerId) => Promise | void,\n placeholder: LangPackKey,\n chatRightsAction?: AppSelectPeers['chatRightsAction'],\n peerId?: number,\n selfPresence?: LangPackKey\n }) {\n super('popup-forward', {closable: true, overlayClosable: true, body: true, title: true});\n\n this.selector = new AppSelectPeers({\n appendTo: this.body,\n onChange: async() => {\n const selected = this.selector.getSelected();\n const peerId = selected[selected.length - 1].toPeerId();\n\n if(options.onSelect) {\n const res = options.onSelect(peerId);\n if(res instanceof Promise) {\n try {\n await res;\n } catch(err) {\n return;\n }\n }\n }\n\n this.selector = null;\n this.hide();\n },\n peerType: options.peerTypes,\n onFirstRender: () => {\n this.show();\n this.selector.checkForTriggers(); // ! due to zero height before mounting\n\n if(!IS_TOUCH_SUPPORTED) {\n this.selector.input.focus();\n }\n },\n chatRightsAction: options.chatRightsAction,\n multiSelect: false,\n rippleEnabled: false,\n avatarSize: 'abitbigger',\n peerId: options.peerId,\n placeholder: options.placeholder,\n selfPresence: options.selfPresence,\n managers: this.managers\n });\n\n this.scrollable = this.selector.scrollable;\n this.attachScrollableListeners();\n\n // this.scrollable = new Scrollable(this.body);\n\n this.title.append(this.selector.input);\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 PopupPeer from './peer';\n\nexport default class PopupSendNow extends PopupPeer {\n constructor(peerId: PeerId, mids: number[], onConfirm?: () => void) {\n super('popup-delete-chat', {\n title: `Send Message${mids.length > 1 ? 's' : ''} Now`,\n description: mids.length > 1 ? 'Send ' + mids.length + ' messages now?' : 'Send message now?',\n buttons: [{\n langKey: 'Send',\n callback: () => {\n onConfirm && onConfirm();\n this.managers.appMessagesManager.sendScheduledMessages(peerId, mids);\n }\n }]\n });\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 type {AppStickersManager} from '../../lib/appManagers/appStickersManager';\nimport PopupElement from '.';\nimport wrapSticker from '../wrappers/sticker';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport {putPreloader} from '../putPreloader';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {i18n} from '../../lib/langPack';\nimport Button from '../button';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport toggleDisability from '../../helpers/dom/toggleDisability';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport {toastNew} from '../toast';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport createStickersContextMenu from '../../helpers/dom/createStickersContextMenu';\nimport attachStickerViewerListeners from '../stickerViewer';\nimport {Document, StickerSet} from '../../layer';\nimport Row from '../row';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport rootScope from '../../lib/rootScope';\nimport wrapCustomEmoji from '../wrappers/customEmoji';\nimport emoticonsDropdown from '../emoticonsDropdown';\n\nconst ANIMATION_GROUP: AnimationItemGroup = 'STICKERS-POPUP';\n\nexport default class PopupStickers extends PopupElement {\n private stickersFooter: HTMLElement;\n private appendTo: HTMLElement;\n private updateAdded: {[setId: Long]: (added: boolean) => void};\n private sets: StickerSet.stickerSet[];\n private button: HTMLElement;\n\n constructor(\n private stickerSetInput: Parameters[0] | Parameters[0][],\n private isEmojis?: boolean\n ) {\n super('popup-stickers', {closable: true, overlayClosable: true, body: true, scrollable: true, title: true});\n\n this.title.append(i18n('Loading'));\n this.updateAdded = {};\n\n emoticonsDropdown.setIgnoreMouseOut('popup', true);\n this.addEventListener('close', () => {\n emoticonsDropdown.setIgnoreMouseOut('popup', false);\n animationIntersector.setOnlyOnePlayableGroup();\n });\n\n this.appendTo = this.scrollable.container;\n\n this.appendTo.classList.add('is-loading');\n putPreloader(this.appendTo, true);\n\n this.stickersFooter = document.createElement('div');\n this.stickersFooter.classList.add('sticker-set-footer');\n\n const btn = Button('btn-primary btn-primary-transparent disable-hover', {noRipple: true, text: 'Loading'});\n this.stickersFooter.append(btn);\n\n this.body.append(this.stickersFooter);\n\n attachStickerViewerListeners({listenTo: this.appendTo, listenerSetter: this.listenerSetter});\n\n const onStickerSetUpdate = (set: StickerSet.stickerSet) => {\n const idx = this.sets.findIndex((_set) => _set.id === set.id);\n if(idx === -1) {\n return;\n }\n\n this.sets[idx] = set;\n const updateAdded = this.updateAdded[set.id];\n updateAdded?.(!!set.installed_date);\n this.updateButton();\n };\n\n this.listenerSetter.add(rootScope)('stickers_installed', onStickerSetUpdate);\n this.listenerSetter.add(rootScope)('stickers_deleted', onStickerSetUpdate);\n\n this.loadStickerSet();\n }\n\n private createStickerSetElements(set?: StickerSet.stickerSet) {\n const container = document.createElement('div');\n container.classList.add('sticker-set');\n\n let headerRow: Row, updateAdded: (added: boolean) => void;\n if(set) {\n headerRow = new Row({\n title: wrapEmojiText(set.title),\n subtitle: i18n(set.pFlags.emojis ? 'EmojiCount' : 'Stickers', [set.count]),\n buttonRight: true\n });\n\n updateAdded = (added) => {\n replaceContent(headerRow.buttonRight, i18n(added ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\n headerRow.buttonRight.classList.toggle('active', added);\n };\n\n updateAdded(!!set.installed_date);\n\n container.append(headerRow.container);\n }\n\n const itemsContainer = document.createElement('div');\n itemsContainer.classList.add('sticker-set-stickers');\n\n container.append(itemsContainer);\n\n return {container, headerRow, updateAdded, itemsContainer};\n }\n\n private onStickersClick = async(e: MouseEvent) => {\n const target = findUpClassName(e.target, 'sticker-set-sticker');\n if(!target) return;\n\n const docId = target.dataset.docId;\n if(await appImManager.chat.input.sendMessageWithDocument(docId)) {\n this.hide();\n }\n };\n\n private async loadStickerSet() {\n const middleware = this.middlewareHelper.get();\n const inputs = Array.isArray(this.stickerSetInput) ? this.stickerSetInput : [this.stickerSetInput];\n const setsPromises = inputs.map((input) => this.managers.appStickersManager.getStickerSet(input));\n let sets = await Promise.all(setsPromises);\n if(!middleware()) return;\n let firstSet = sets[0];\n if(sets.length === 1 && !firstSet) {\n toastNew({langPackKey: this.isEmojis ? 'AddEmojiNotFound' : 'StickerSet.DontExist'});\n this.hide();\n return;\n }\n\n sets = sets.filter(Boolean);\n firstSet = sets[0];\n\n this.sets = sets.map((set) => set.set);\n\n const isEmojis = this.isEmojis ??= !!firstSet.set.pFlags.emojis;\n\n if(!isEmojis) {\n attachClickEvent(this.appendTo, this.onStickersClick, {listenerSetter: this.listenerSetter});\n\n const {destroy} = createStickersContextMenu({\n listenTo: this.appendTo,\n isStickerPack: true,\n onSend: () => this.hide()\n });\n\n this.addEventListener('close', destroy);\n }\n\n animationIntersector.setOnlyOnePlayableGroup(ANIMATION_GROUP);\n\n const lazyLoadQueue = new LazyLoadQueue();\n const loadPromises: Promise[] = [];\n\n const containersPromises = sets.map(async(set) => {\n const {container, itemsContainer, headerRow, updateAdded} = this.createStickerSetElements(sets.length > 1 ? set.set : undefined);\n\n if(headerRow) {\n attachClickEvent(headerRow.buttonRight, () => {\n this.managers.appStickersManager.toggleStickerSet(set.set);\n }, {listenerSetter: this.listenerSetter});\n }\n\n this.updateAdded[set.set.id] = updateAdded;\n\n let divs: (HTMLElement | DocumentFragment)[];\n\n const docs = set.documents.filter((doc) => doc?._ === 'document') as Document.document[];\n if(isEmojis) {\n const fragment = wrapCustomEmoji({\n docIds: docs.map((doc) => doc.id),\n loadPromises,\n animationGroup: ANIMATION_GROUP,\n customEmojiSize: mediaSizes.active.esgCustomEmoji,\n middleware\n // lazyLoadQueue\n });\n\n (Array.from(fragment.children) as HTMLElement[]).slice(1).forEach((element) => {\n const span = document.createElement('span');\n span.classList.add('super-emoji');\n element.replaceWith(span);\n span.append(element);\n });\n\n divs = [fragment];\n\n itemsContainer.classList.replace('sticker-set-stickers', 'super-emojis');\n itemsContainer.classList.add('is-emojis', 'not-local');\n } else {\n divs = await Promise.all(docs.map(async(doc) => {\n const div = document.createElement('div');\n div.classList.add('sticker-set-sticker');\n\n const size = mediaSizes.active.popupSticker.width;\n\n await wrapSticker({\n doc,\n div,\n lazyLoadQueue,\n group: ANIMATION_GROUP,\n play: true,\n loop: true,\n width: size,\n height: size,\n withLock: true,\n loadPromises,\n middleware\n });\n\n return div;\n }));\n }\n\n itemsContainer.append(...divs.filter(Boolean));\n\n return container;\n });\n\n const containers = await Promise.all(containersPromises);\n await Promise.all(loadPromises);\n\n const button = this.button = Button('', {noRipple: true});\n\n this.updateButton();\n\n attachClickEvent(button, () => {\n const toggle = toggleDisability([button], true);\n\n this.managers.appStickersManager.toggleStickerSets(sets.map((set) => set.set)).then(() => {\n this.hide();\n }).catch(() => {\n toggle();\n });\n }, {listenerSetter: this.listenerSetter});\n\n if(sets.length === 1) {\n setInnerHTML(this.title, wrapEmojiText(firstSet.set.title));\n } else {\n setInnerHTML(this.title, i18n('Emoji'));\n }\n\n this.stickersFooter.textContent = '';\n this.stickersFooter.append(button);\n\n this.appendTo.classList.remove('is-loading');\n this.appendTo.textContent = '';\n this.appendTo.append(...containers);\n\n this.scrollable.onAdditionalScroll();\n }\n\n private updateButton() {\n const {sets, isEmojis} = this;\n let isAdd: boolean, buttonAppend: HTMLElement;\n if(sets.length === 1) {\n const firstSet = sets[0];\n buttonAppend = i18n(isEmojis ? 'EmojiCount' : 'Stickers', [firstSet.count]);\n isAdd = !firstSet.installed_date;\n } else {\n const installed = sets.filter((set) => set.installed_date);\n let count: number;\n if(sets.length === installed.length) {\n isAdd = false;\n count = sets.length;\n } else {\n isAdd = true;\n count = sets.length - installed.length;\n }\n\n buttonAppend = i18n('EmojiPackCount', [count]);\n }\n\n this.button.className = isAdd ? 'btn-primary btn-color-primary' : 'btn-primary btn-primary-transparent danger';\n replaceContent(this.button, i18n(isAdd ? 'AddStickersCount' : 'RemoveStickersCount', [buttonAppend]));\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 {CancellablePromise} from '../helpers/cancellablePromise';\nimport SetTransition from './singleTransition';\nimport {fastRaf} from '../helpers/schedulers';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport isInDOM from '../helpers/dom/isInDOM';\nimport safeAssign from '../helpers/object/safeAssign';\n\nconst TRANSITION_TIME = 200;\n\nexport default class ProgressivePreloader {\n public preloader: HTMLDivElement;\n public circle: SVGCircleElement;\n private cancelSvg: SVGSVGElement;\n private downloadSvg: HTMLElement;\n\n private tempId = 0;\n public detached = true;\n\n public promise: CancellablePromise = null;\n\n public isUpload = false;\n private cancelable = true;\n private streamable = false;\n private tryAgainOnFail = true;\n private attachMethod: 'append' | 'prepend' = 'append';\n\n public loadFunc: (e?: Event) => any;\n\n public totalLength: number;\n\n constructor(options?: Partial<{\n isUpload: ProgressivePreloader['isUpload'],\n cancelable: ProgressivePreloader['cancelable'],\n streamable: ProgressivePreloader['streamable'],\n tryAgainOnFail: ProgressivePreloader['tryAgainOnFail'],\n attachMethod: ProgressivePreloader['attachMethod']\n }>) {\n if(options) {\n safeAssign(this, options);\n }\n\n if(this.isUpload) {\n this.tryAgainOnFail = false;\n }\n }\n\n public constructContainer(options: Partial<{\n color: 'transparent',\n bold: boolean\n }> = {}) {\n if(!this.preloader) {\n this.preloader = document.createElement('div');\n this.preloader.classList.add('preloader-container');\n\n if(options.color) {\n this.preloader.classList.add('preloader-' + options.color);\n }\n\n if(options.bold) {\n this.preloader.classList.add('preloader-bold');\n }\n\n if(this.streamable) {\n this.preloader.classList.add('preloader-streamable');\n }\n }\n }\n\n public constructDownloadIcon() {\n this.constructContainer();\n }\n\n public construct() {\n this.construct = null;\n\n this.constructContainer();\n\n this.preloader.innerHTML = `\n
\n \n \n \n
`;\n\n if(this.streamable) {\n this.totalLength = 118.61124420166016;\n } else {\n this.totalLength = 149.82473754882812;\n }\n\n if(this.cancelable) {\n this.preloader.innerHTML += `\n \n \n \n \n \n \n \n \n \n \n \n `;\n\n this.downloadSvg = this.preloader.lastElementChild as HTMLElement;\n this.cancelSvg = this.downloadSvg.previousElementSibling as any;\n } else {\n this.preloader.classList.add('preloader-swing');\n }\n\n this.circle = this.preloader.firstElementChild.firstElementChild.firstElementChild as SVGCircleElement;\n\n if(this.cancelable) {\n attachClickEvent(this.preloader, this.onClick);\n }\n }\n\n public onClick = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n if(this.preloader.classList.contains('manual')) {\n this.loadFunc?.(e);\n } else {\n this.promise?.cancel?.();\n }\n };\n\n public setDownloadFunction(func: ProgressivePreloader['loadFunc']) {\n this.loadFunc = func;\n }\n\n public setManual() {\n this.preloader.classList.add('manual');\n this.setProgress(0);\n }\n\n public attachPromise(promise: CancellablePromise) {\n if(this.isUpload && this.promise) return;\n\n this.promise = promise;\n\n const tempId = --this.tempId;\n const startTime = Date.now();\n\n const onEnd = (err: Error) => {\n promise.notify = promise.notifyAll = null;\n\n if(tempId !== this.tempId) {\n return;\n }\n\n const elapsedTime = Date.now() - startTime;\n\n // console.log('[PP]: end', this.detached, performance.now());\n\n if(!err && this.cancelable) {\n this.setProgress(100);\n\n const delay = TRANSITION_TIME * 0.75;\n\n if(elapsedTime < delay) {\n this.detach();\n } else {\n setTimeout(() => { // * wait for transition complete\n if(tempId === this.tempId) {\n this.detach();\n }\n }, delay);\n }\n } else {\n if(this.tryAgainOnFail) {\n this.attach(this.preloader.parentElement);\n fastRaf(() => {\n this.setManual();\n });\n } else {\n this.detach();\n }\n }\n\n this.promise = promise = null;\n };\n\n promise\n .then(() => onEnd(null))\n .catch((err) => onEnd(err));\n\n if(promise.addNotifyListener) {\n promise.addNotifyListener((details: {done: number, total: number}) => {\n /* if(details.done >= details.total) {\n onEnd();\n } */\n\n if(tempId !== this.tempId) return;\n\n // console.log('preloader download', promise, details);\n const percents = details.done / details.total * 100;\n this.setProgress(percents);\n });\n }\n }\n\n public attach(elem: Element, reset = false, promise?: CancellablePromise) {\n this.construct?.();\n\n if(this.preloader.parentElement) {\n this.preloader.classList.remove('manual');\n }\n\n this.detached = false;\n\n if(promise/* && false */) {\n this.attachPromise(promise);\n }\n\n let useRafs = 0;\n if(this.detached || this.preloader.parentElement !== elem) {\n useRafs = isInDOM(this.preloader) ? 1 : 2;\n if(this.preloader.parentElement !== elem) {\n elem[this.attachMethod](this.preloader);\n }\n }\n\n SetTransition({\n element: this.preloader,\n className: 'is-visible',\n forwards: true,\n duration: TRANSITION_TIME,\n useRafs\n });\n\n if(this.cancelable && reset) {\n this.setProgress(0);\n }\n }\n\n public detach() {\n if(this.detached) {\n return;\n }\n // return;\n\n this.detached = true;\n\n // return;\n\n if(this.preloader?.parentElement) {\n /* setTimeout(() => */// fastRaf(() => {\n /* if(!this.detached) return;\n this.detached = true; */\n\n // fastRaf(() => {\n // console.log('[PP]: detach after rAF', this.detached, performance.now());\n\n // if(!this.detached || !this.preloader.parentElement) {\n // return;\n // }\n\n SetTransition({\n element: this.preloader,\n className: 'is-visible',\n forwards: false,\n duration: TRANSITION_TIME,\n onTransitionEnd: () => {\n this.preloader.remove();\n },\n useRafs: 1\n });\n // });\n // })/* , 5e3) */;\n }\n }\n\n public setProgress(percents: number) {\n if(!this.totalLength && !isInDOM(this.circle)) {\n return;\n }\n\n if(percents === 0) {\n this.circle.style.strokeDasharray = '';\n return;\n }\n\n try {\n this.totalLength ||= this.circle.getTotalLength();\n\n // console.log('setProgress', (percents / 100 * totalLength));\n this.circle.style.strokeDasharray = '' + Math.max(5, percents / 100 * this.totalLength) + ', ' + this.totalLength;\n } catch(err) {}\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 {PeerPhotoSize} from '../lib/appManagers/appAvatarsManager';\nimport getPreviewURLFromBytes from '../helpers/bytes/getPreviewURLFromBytes';\nimport {renderImageFromUrlPromise} from '../helpers/dom/renderImageFromUrl';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport {recordPromise} from '../helpers/recordPromise';\nimport sequentialDom from '../helpers/sequentialDom';\nimport {UserProfilePhoto, ChatPhoto, User, Chat} from '../layer';\nimport getPeerColorById from '../lib/appManagers/utils/peers/getPeerColorById';\nimport getPeerPhoto from '../lib/appManagers/utils/peers/getPeerPhoto';\nimport {NULL_PEER_ID, REPLIES_PEER_ID} from '../lib/mtproto/mtproto_config';\nimport wrapAbbreviation from '../lib/richTextProcessor/wrapAbbreviation';\nimport rootScope from '../lib/rootScope';\nimport getPeerInitials from './wrappers/getPeerInitials';\nimport {wrapTopicIcon} from './wrappers/messageActionTextNewUnsafe';\nimport makeError from '../helpers/makeError';\nimport noop from '../helpers/noop';\n\nexport async function 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 const r = await rootScope.managers.acknowledged.appAvatarsManager.loadAvatar(peerId, photo, size);\n const loadPromise = r.result;\n const cached = r.cached;\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 let isFullLoaded = false;\n if(size === 'photo_big') { // let's load small photo first\n const res = await putAvatar(div, peerId, photo, 'photo_small');\n renderThumbPromise = res.loadThumbPromise || 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 = getPreviewURLFromBytes(photo.stripped_thumb);\n renderThumbPromise = renderImageFromUrlPromise(thumbImage, url).then(() => {\n if(isFullLoaded) {\n return;\n }\n\n replaceContent(div, thumbImage);\n });\n }\n\n callback = () => {\n isFullLoaded = true;\n\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 thumbImage?.remove();\n });\n }\n }, animate ? 200 : 0);\n };\n }\n\n const renderPromise = loadPromise\n .then((url) => renderImageFromUrlPromise(img, url/* , !cached */))\n .then(callback);\n\n renderThumbPromise && await renderThumbPromise.catch(noop);\n\n return {\n cached,\n loadPromise: renderPromise,\n loadThumbPromise: cached ? renderPromise : renderThumbPromise || Promise.resolve(),\n thumbImage\n };\n}\n\nfunction set(\n div: HTMLElement,\n innerHTML: Parameters[1],\n color: string,\n icon?: string,\n isForum?: boolean,\n isTopic?: boolean\n) {\n setInnerHTML(div, innerHTML);\n div.dataset.color = color;\n div.classList.remove('tgico-saved', 'tgico-deletedaccount', 'tgico-reply_filled', 'is-forum', 'is-topic');\n icon && div.classList.add(icon);\n isForum && div.classList.add('is-forum');\n isTopic && div.classList.add('is-topic');\n}\n\n// peerId === peerId || title\nexport default async function putPhoto({\n div,\n peerId,\n isDialog = false,\n title = '',\n onlyThumb = false,\n isBig,\n threadId,\n wrapOptions = {}\n}: {\n div: HTMLElement,\n peerId: PeerId,\n isDialog?: boolean,\n title?: string,\n onlyThumb?: boolean,\n isBig?: boolean,\n threadId?: number,\n wrapOptions?: WrapSomethingOptions\n}) {\n const myId = rootScope.myId;\n\n if(peerId === myId && isDialog) {\n set(div, '', '', 'tgico-saved');\n return;\n }\n\n const managers = rootScope.managers;\n\n if(threadId) {\n const topic = await managers.dialogsStorage.getForumTopic(peerId, threadId);\n set(div, '', '', undefined, undefined, true);\n\n if(wrapOptions.customEmojiSize) {\n div.style.setProperty('--size', wrapOptions.customEmojiSize.width + 'px');\n }\n\n return wrapTopicIcon({\n ...wrapOptions,\n topic,\n lazyLoadQueue: false\n }).then((icon) => {\n div.replaceChildren(icon);\n });\n }\n\n const peer = await managers.appPeersManager.getPeer(peerId);\n if(peerId !== NULL_PEER_ID && peerId.isUser() && (peer as User.user)?.pFlags?.deleted) {\n set(div, '', getPeerColorById(peerId), 'tgico-deletedaccount');\n return;\n }\n\n const isForum = !!(peer as Chat.channel)?.pFlags?.forum;\n const size: PeerPhotoSize = isBig ? 'photo_big' : 'photo_small';\n const photo = getPeerPhoto(peer);\n const avatarAvailable = !!photo;\n const avatarRendered = !!div.firstElementChild && !(div.firstElementChild as HTMLElement).classList.contains('emoji');\n if(!avatarAvailable || !avatarRendered || !(await managers.appAvatarsManager.isAvatarCached(peerId, size))) {\n let color = '';\n if(peerId && (peerId !== myId || !isDialog)) {\n color = getPeerColorById(peerId);\n }\n\n if(peerId === REPLIES_PEER_ID) {\n set(div, '', color, 'tgico-reply_filled');\n return;\n }\n\n const abbr = title ? wrapAbbreviation(title) : getPeerInitials(peer);\n set(div, abbr, color, '', isForum);\n // return Promise.resolve(true);\n }\n\n if(avatarAvailable/* && false */) {\n const promise = putAvatar(div, peerId, photo, size, undefined, onlyThumb);\n // recordPromise(promise, 'putAvatar-' + peerId);\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 {Chat, User} from '../../layer';\nimport wrapAbbreviation from '../../lib/richTextProcessor/wrapAbbreviation';\n\nexport default function getPeerInitials(peer: Chat | User) {\n let str = '';\n if(peer) {\n str = (peer as Chat.chat).title ?? [\n (peer as User.user).first_name,\n (peer as User.user).last_name\n ].filter(Boolean).join(' ');\n }\n\n return wrapAbbreviation(str);\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 {MOUNT_CLASS_TO} from '../config/debug';\n\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\n const html = `\n \n \n `;\n\n if(returnDiv) {\n const div = document.createElement('div');\n div.classList.add('preloader');\n div.innerHTML = html;\n\n if(elem) {\n elem.appendChild(div);\n }\n\n return div;\n }\n\n elem.insertAdjacentHTML('beforeend', html);\n return elem.lastElementChild as HTMLElement;\n}\n\nMOUNT_CLASS_TO.putPreloader = putPreloader;\n\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\n elem.classList.remove('tgico-' + icon);\n elem.disabled = true;\n putPreloader(elem);\n\n return () => {\n elem.innerHTML = '';\n elem.classList.add('tgico-' + icon);\n elem.removeAttribute('disabled');\n };\n}\n\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\n Array.from(elements).forEach((el) => {\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\n if(!match) return;\n to[match[1]] = el as HTMLElement;\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 getDeepProperty from '../helpers/object/getDeepProperty';\nimport {LangPackKey, _i18n} from '../lib/langPack';\nimport apiManagerProxy from '../lib/mtproto/mtprotoworker';\nimport rootScope from '../lib/rootScope';\n\nexport default class RadioField {\n public input: HTMLInputElement;\n public label: HTMLLabelElement;\n public main: HTMLElement;\n\n constructor(options: {\n text?: string,\n langKey?: LangPackKey,\n name: string,\n value?: string,\n stateKey?: string,\n alignRight?: boolean\n }) {\n const label = this.label = document.createElement('label');\n label.classList.add('radio-field');\n\n if(options.alignRight) {\n label.classList.add('radio-field-right');\n }\n\n const input = this.input = document.createElement('input');\n input.type = 'radio';\n /* input.id = */input.name = 'input-radio-' + options.name;\n\n if(options.value) {\n input.value = options.value;\n\n if(options.stateKey) {\n apiManagerProxy.getState().then((state) => {\n input.checked = getDeepProperty(state, options.stateKey) === options.value;\n });\n\n input.addEventListener('change', () => {\n rootScope.managers.appStateManager.setByKey(options.stateKey, options.value);\n });\n }\n }\n\n const main = this.main = document.createElement('div');\n main.classList.add('radio-field-main');\n\n if(options.text) {\n main.innerHTML = options.text;\n /* const caption = document.createElement('div');\n caption.classList.add('radio-field-main-caption');\n caption.innerHTML = text;\n\n if(subtitle) {\n label.classList.add('radio-field-with-subtitle');\n caption.insertAdjacentHTML('beforeend', `
${subtitle}
`);\n }\n\n main.append(caption); */\n } else if(options.langKey) {\n _i18n(main, options.langKey);\n }\n\n label.append(input, main);\n }\n\n get checked() {\n return this.input.checked;\n }\n\n set checked(checked: boolean) {\n this.setValueSilently(checked);\n\n const event = new Event('change', {bubbles: true, cancelable: true});\n this.input.dispatchEvent(event);\n }\n\n public setValueSilently(checked: boolean) {\n this.input.checked = checked;\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 RadioForm(radios: {container: HTMLElement, input: HTMLInputElement}[], onChange: (value: string, event: Event) => void) {\n const form = document.createElement('form');\n\n radios.forEach((r) => {\n const {container, input} = r;\n form.append(container);\n input.addEventListener('change', (e) => {\n if(input.checked) {\n onChange(input.value, e);\n }\n });\n });\n\n return form;\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 attachGrabListeners, {GrabEvent} from '../helpers/dom/attachGrabListeners';\nimport clamp from '../helpers/number/clamp';\nimport safeAssign from '../helpers/object/safeAssign';\n\nexport default class RangeSelector {\n public container: HTMLDivElement;\n protected filled: HTMLDivElement;\n protected seek: HTMLInputElement;\n\n public mousedown = false;\n protected rect: DOMRect;\n protected _removeListeners: () => void;\n\n private events: Partial<{\n // onMouseMove: ProgressLine['onMouseMove'],\n onMouseDown: RangeSelector['onMouseDown'],\n onMouseUp: RangeSelector['onMouseUp'],\n onScrub: (value: number) => void\n }> = {};\n\n protected decimals: number;\n\n protected step: number;\n protected min: number;\n protected max: number;\n protected withTransition = false;\n protected useTransform = false;\n protected vertical = false;\n\n constructor(\n options: {\n step: RangeSelector['step'],\n min: RangeSelector['min'],\n max: RangeSelector['max'],\n withTransition?: RangeSelector['withTransition'],\n useTransform?: RangeSelector['useTransform'],\n vertical?: RangeSelector['vertical']\n },\n value = 0\n ) {\n safeAssign(this, options);\n\n this.container = document.createElement('div');\n this.container.classList.add('progress-line');\n\n // there is no sense in using transition with transform, because it is updating every frame\n if(this.useTransform) {\n this.container.classList.add('use-transform');\n } else if(this.withTransition) {\n this.container.classList.add('with-transition');\n }\n\n this.filled = document.createElement('div');\n this.filled.classList.add('progress-line__filled');\n\n const seek = this.seek = document.createElement('input');\n seek.classList.add('progress-line__seek');\n // seek.setAttribute('max', '0');\n seek.type = 'range';\n seek.step = '' + this.step;\n seek.min = '' + this.min;\n seek.max = '' + this.max;\n seek.value = '' + value;\n\n if(value) {\n this.setProgress(value);\n }\n\n const stepStr = '' + this.step;\n const index = stepStr.indexOf('.');\n this.decimals = index === -1 ? 0 : stepStr.length - index - 1;\n\n // this.setListeners();\n\n this.container.append(this.filled, seek);\n }\n\n get value() {\n return +this.seek.value;\n }\n\n public setHandlers(events: RangeSelector['events']) {\n this.events = events;\n }\n\n protected onMouseMove = (event: GrabEvent) => {\n this.scrub(event);\n };\n\n protected onMouseDown = (event: GrabEvent) => {\n this.rect = this.container.getBoundingClientRect();\n this.mousedown = true;\n this.scrub(event);\n this.container.classList.add('is-focused');\n this.events?.onMouseDown && this.events.onMouseDown(event);\n };\n\n protected onMouseUp = (event: GrabEvent) => {\n this.mousedown = false;\n this.container.classList.remove('is-focused');\n this.events?.onMouseUp && this.events.onMouseUp(event);\n };\n\n public setListeners() {\n this.seek.addEventListener('input', this.onInput);\n this._removeListeners = attachGrabListeners(this.container, this.onMouseDown, this.onMouseMove, this.onMouseUp);\n }\n\n public onInput = () => {\n const value = +this.seek.value;\n this.setFilled(value);\n this.events?.onScrub && this.events.onScrub(value);\n };\n\n public setProgress(value: number) {\n this.seek.value = '' + value;\n this.setFilled(+this.seek.value); // clamp\n }\n\n public addProgress(value: number) {\n this.seek.value = '' + (+this.seek.value + value);\n this.setFilled(+this.seek.value); // clamp\n }\n\n public setFilled(value: number) {\n let percents = (value - this.min) / (this.max - this.min);\n percents = clamp(percents, 0, 1);\n\n // using scaleX and width even with vertical because it will be rotated\n if(this.useTransform) {\n this.filled.style.transform = `scaleX(${percents})`;\n } else {\n this.filled.style.width = (percents * 100) + '%';\n }\n }\n\n protected scrub(event: GrabEvent) {\n const rectMax = this.vertical ? this.rect.height : this.rect.width;\n const offsetAxisValue = clamp(this.vertical ? -(event.y - this.rect.bottom) : event.x - this.rect.left, 0, rectMax);\n\n let value = this.min + (offsetAxisValue / rectMax * (this.max - this.min));\n\n if((value - this.min) < ((this.max - this.min) / 2)) {\n value -= this.step / 10;\n }\n\n value = +value.toFixed(this.decimals);\n value = clamp(value, this.min, this.max);\n\n // this.seek.value = '' + value;\n // this.onInput();\n\n this.setProgress(value);\n this.events?.onScrub && this.events.onScrub(value);\n\n return value;\n }\n\n public removeListeners() {\n if(this._removeListeners) {\n this._removeListeners();\n this._removeListeners = null;\n }\n\n this.seek.removeEventListener('input', this.onInput);\n\n this.events = {};\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 findUpClassName from '../helpers/dom/findUpClassName';\nimport sequentialDom from '../helpers/sequentialDom';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport rootScope from '../lib/rootScope';\nimport findUpAsChild from '../helpers/dom/findUpAsChild';\nimport {fastRaf} from '../helpers/schedulers';\n\nlet rippleClickId = 0;\nexport default function ripple(\n elem: HTMLElement,\n callback: (id: number) => Promise = () => Promise.resolve(),\n onEnd: (id: number) => void = null,\n prepend = false,\n attachListenerTo = elem\n) {\n // return;\n if(elem.querySelector('.c-ripple')) return;\n elem.classList.add('rp');\n\n const r = document.createElement('div');\n r.classList.add('c-ripple');\n\n const isSquare = elem.classList.contains('rp-square');\n if(isSquare) {\n r.classList.add('is-square');\n }\n\n elem[prepend ? 'prepend' : 'append'](r);\n\n let handler: () => void;\n // let animationEndPromise: Promise;\n const drawRipple = (clientX: number, clientY: number) => {\n const startTime = Date.now();\n const circle = document.createElement('div');\n\n const clickId = rippleClickId++;\n\n // console.log('ripple drawRipple');\n\n // const auto = elem.classList.contains('row-sortable') && !elem.classList.contains('cant-sort');\n const auto = false;\n const duration = (auto ? .3 : +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '')) * 1000;\n // console.log('ripple duration', duration);\n\n const _handler = handler = () => {\n // handler = () => animationEndPromise.then((duration) => {\n // console.log('ripple animation was:', duration);\n\n // const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\n // return;\n const elapsedTime = Date.now() - startTime;\n const cb = () => {\n // console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\n sequentialDom.mutate(() => {\n circle.remove();\n });\n\n onEnd?.(clickId);\n };\n if(elapsedTime < duration) {\n const delay = Math.max(duration - elapsedTime, duration / 2);\n setTimeout(() => circle.classList.add('hiding'), Math.max(delay - duration / 2, 0));\n\n setTimeout(cb, delay);\n } else {\n circle.classList.add('hiding');\n setTimeout(cb, duration / 2);\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n window.removeEventListener('contextmenu', handler);\n window.removeEventListener('mousemove', handler);\n }\n\n handler = null;\n touchStartFired = false;\n };\n // });\n\n callback?.(clickId);\n\n /* callback().then((bad) => {\n if(bad) {\n span.remove();\n return;\n } */\n\n // console.log('ripple after promise', Date.now() - startTime);\n // console.log('ripple tooSlow:', tooSlow);\n /* if(tooSlow) {\n span.remove();\n return;\n } */\n\n fastRaf(() => {\n if(_handler !== handler) {\n return;\n }\n\n const rect = r.getBoundingClientRect();\n circle.classList.add('c-ripple__circle');\n\n const clickX = clientX - rect.left;\n const clickY = clientY - rect.top;\n\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);\n const size = radius;\n\n // center of circle\n const x = clickX - size / 2;\n const y = clickY - size / 2;\n\n // console.log('ripple click', offsetFromCenter, size, clickX, clickY);\n\n circle.style.width = circle.style.height = size + 'px';\n circle.style.left = x + 'px';\n circle.style.top = y + 'px';\n\n // ะฝะธะถะฝะธะน ะบะพะด ะฒั‹ะฟะพะปะฝัะตั‚ัั ั ะทะฐะดะตั€ะถะบะพะน\n /* animationEndPromise = new Promise((resolve) => {\n span.addEventListener('animationend', () => {\n // 713 -> 700\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\n }, {once: true});\n }); */\n\n // ะฝะธะถะฝะธะน ะบะพะด ะฝะต ะฒัะตะณะดะฐ ะฒะบะปัŽั‡ะฐะตั‚ ะฐะฝะธะผะฐั†ะธัŽ ะŸะ ะ˜ ะšะ›ะ˜ะšะ• ะะ ะขะะงะŸะะ” ะ‘ะ•ะ— ะขะะŸะขะ˜ะš ะญะะ–ะ˜ะะ\n /* span.style.display = 'none';\n r.append(span);\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\n span.style.display = ''; */\n\n r.append(circle);\n\n if(auto) {\n // window.addEventListener('mousemove', handler, {once: true, passive: true});\n handler();\n }\n\n // r.classList.add('active');\n // handler();\n });\n // });\n };\n\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) ||\n findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\n ) && (\n attachListenerTo === elem ||\n !findUpAsChild(e.target as HTMLElement, attachListenerTo)\n );\n\n // TODO: rename this variable\n let touchStartFired = false;\n if(IS_TOUCH_SUPPORTED) {\n const touchEnd = () => {\n handler?.();\n };\n\n attachListenerTo.addEventListener('touchstart', (e) => {\n if(!rootScope.settings.animationsEnabled) {\n return;\n }\n\n // console.log('ripple touchstart', e);\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\n return;\n }\n\n // console.log('touchstart', e);\n touchStartFired = true;\n\n const {clientX, clientY} = e.touches[0];\n drawRipple(clientX, clientY);\n attachListenerTo.addEventListener('touchend', touchEnd, {once: true});\n\n window.addEventListener('touchmove', (e) => {\n e.cancelBubble = true;\n e.stopPropagation();\n touchEnd();\n attachListenerTo.removeEventListener('touchend', touchEnd);\n }, {once: true});\n }, {passive: true});\n } else {\n attachListenerTo.addEventListener('mousedown', (e) => {\n if(![0, 2].includes(e.button)) { // only left and right buttons\n return;\n }\n\n if(!rootScope.settings.animationsEnabled) {\n return;\n }\n // console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\n\n if(attachListenerTo.dataset.ripple === '0' || isRippleUnneeded(e)) {\n return;\n } else if(touchStartFired) {\n touchStartFired = false;\n return;\n }\n\n const {clientX, clientY} = e;\n drawRipple(clientX, clientY);\n window.addEventListener('mouseup', handler, {once: true, passive: true});\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\n }, {passive: 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 CheckboxField, {CheckboxFieldOptions} from './checkboxField';\nimport RadioField from './radioField';\nimport ripple from './ripple';\nimport {SliderSuperTab} from './slider';\nimport RadioForm from './radioForm';\nimport {i18n, LangPackKey} from '../lib/langPack';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport setInnerHTML, {setDirection} from '../helpers/dom/setInnerHTML';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport Button from './button';\nimport createContextMenu from '../helpers/dom/createContextMenu';\n\ntype K = string | HTMLElement | DocumentFragment | true;\n\nconst setContent = (element: HTMLElement, content: K) => {\n if(content === true) {\n\n } else if(typeof(content) === 'string') {\n setInnerHTML(element, content);\n } else {\n element.append(content);\n }\n};\n\nexport type RowMediaSizeType = 'small' | 'medium' | 'big' | 'abitbigger' | 'bigger';\n\nexport default class Row {\n public container: HTMLElement;\n public title: HTMLElement;\n public titleRow: HTMLElement;\n public titleRight: HTMLElement;\n public media: HTMLElement;\n\n public subtitleRow: HTMLElement;\n public subtitleRight: HTMLElement;\n\n public checkboxField: CheckboxField;\n public radioField: RadioField;\n\n public freezed = false;\n\n public buttonRight: HTMLElement;\n\n private _subtitle: HTMLElement;\n private _midtitle: HTMLElement;\n\n constructor(options: Partial<{\n icon: string,\n subtitle: K,\n subtitleLangKey: LangPackKey,\n subtitleLangArgs: any[],\n subtitleRight: K,\n radioField: Row['radioField'],\n checkboxField: Row['checkboxField'],\n checkboxFieldOptions: CheckboxFieldOptions,\n withCheckboxSubtitle: boolean,\n title: K,\n titleLangKey: LangPackKey,\n titleRight: K,\n titleRightSecondary: K,\n clickable: boolean | ((e: Event) => void),\n navigationTab: SliderSuperTab,\n havePadding: boolean,\n noRipple: boolean,\n noWrap: boolean,\n listenerSetter: ListenerSetter,\n buttonRight?: HTMLElement | boolean,\n buttonRightLangKey: LangPackKey,\n asLink: boolean,\n contextMenu: Omit[0], 'findElement' | 'listenTo' | 'listenerSetter'>\n }> = {}) {\n if(options.checkboxFieldOptions) {\n options.checkboxField = new CheckboxField({\n listenerSetter: options.listenerSetter,\n ...options.checkboxFieldOptions\n });\n }\n\n const tagName = options.asLink ? 'a' : (options.radioField || options.checkboxField ? 'label' : 'div');\n this.container = document.createElement(tagName);\n this.container.classList.add('row', 'no-subtitle');\n\n if(options.noWrap) {\n this.container.classList.add('no-wrap');\n }\n\n if(options.subtitle) {\n const subtitle = this.subtitle;\n setContent(subtitle, options.subtitle);\n\n if(options.noWrap) subtitle.classList.add('no-wrap');\n\n if(options.subtitleRight) {\n this.container.append(this.subtitleRow = this.createRow());\n this.subtitleRow.classList.add('row-subtitle-row');\n const subtitleRight = this.subtitleRight = document.createElement('div');\n subtitleRight.classList.add('row-subtitle', 'row-subtitle-right');\n\n setContent(subtitleRight, options.subtitleRight);\n this.subtitleRow.append(subtitle, subtitleRight);\n }\n } else if(options.subtitleLangKey) {\n this.subtitle.append(i18n(options.subtitleLangKey, options.subtitleLangArgs));\n }\n\n let havePadding = !!options.havePadding;\n if(options.radioField || options.checkboxField) {\n if(options.radioField) {\n this.radioField = options.radioField;\n this.container.append(this.radioField.label);\n havePadding = true;\n }\n\n if(options.checkboxField) {\n this.checkboxField = options.checkboxField;\n\n const isToggle = options.checkboxField.label.classList.contains('checkbox-field-toggle');\n if(isToggle) {\n this.container.classList.add('row-with-toggle');\n options.titleRight = this.checkboxField.label;\n } else {\n havePadding = true;\n this.container.append(this.checkboxField.label);\n }\n\n if(options.withCheckboxSubtitle && !isToggle) {\n const onChange = () => {\n replaceContent(this.subtitle, i18n(this.checkboxField.input.checked ? 'Checkbox.Enabled' : 'Checkbox.Disabled'));\n };\n\n if(options.listenerSetter) options.listenerSetter.add(this.checkboxField.input)('change', onChange);\n else this.checkboxField.input.addEventListener('change', onChange);\n }\n }\n\n const i = options.radioField || options.checkboxField;\n i.label.classList.add('disable-hover');\n }\n\n if(options.title || options.titleLangKey) {\n let c: HTMLElement;\n const titleRightContent = options.titleRight || options.titleRightSecondary;\n if(titleRightContent) {\n this.container.append(c = this.titleRow = this.createRow());\n this.titleRow.classList.add('row-title-row');\n } else {\n c = this.container;\n }\n\n this.title = this.createTitle();\n if(options.noWrap) this.title.classList.add('no-wrap');\n if(options.title) {\n setContent(this.title, options.title);\n } else if(options.titleLangKey) {\n this.title.append(i18n(options.titleLangKey));\n }\n\n c.append(this.title);\n\n if(titleRightContent) {\n const titleRight = this.titleRight = document.createElement('div');\n titleRight.classList.add('row-title', 'row-title-right');\n\n if(options.titleRightSecondary) {\n titleRight.classList.add('row-title-right-secondary');\n }\n\n setContent(titleRight, titleRightContent);\n c.append(titleRight);\n }\n }\n\n if(options.icon) {\n havePadding = true;\n // this.title.classList.add('tgico', 'tgico-' + options.icon);\n this.container.classList.add('tgico', 'tgico-' + options.icon);\n this.container.classList.add('row-with-icon');\n }\n\n if(havePadding) {\n this.container.classList.add('row-with-padding');\n }\n\n if(options.navigationTab) {\n options.clickable = () => options.navigationTab.open();\n }\n\n if(options.clickable || options.radioField || options.checkboxField) {\n if(typeof(options.clickable) === 'function') {\n attachClickEvent(this.container, (e) => {\n if(this.freezed) return;\n (options.clickable as any)(e);\n }, {listenerSetter: options.listenerSetter});\n }\n\n this.container.classList.add('row-clickable', 'hover-effect');\n\n if(!options.noRipple) {\n ripple(this.container, undefined, undefined, true);\n }\n\n /* if(options.radioField || options.checkboxField) {\n this.container.prepend(this.container.lastElementChild);\n } */\n }\n\n if(options.buttonRight || options.buttonRightLangKey) {\n this.buttonRight = options.buttonRight instanceof HTMLElement ?\n options.buttonRight :\n Button('btn-primary btn-color-primary', {text: options.buttonRightLangKey});\n this.container.append(this.buttonRight);\n }\n\n if(options.contextMenu) {\n createContextMenu({\n ...options.contextMenu,\n listenTo: this.container,\n listenerSetter: options.listenerSetter\n });\n }\n }\n\n public get subtitle() {\n return this._subtitle ??= this.createSubtitle();\n }\n\n public get midtitle() {\n return this._midtitle ??= this.createMidtitle();\n }\n\n private createRow() {\n const c = document.createElement('div');\n c.classList.add('row-row');\n return c;\n }\n\n private createTitle() {\n const title = document.createElement('div');\n title.classList.add('row-title');\n setDirection(title);\n return title;\n }\n\n private createSubtitle() {\n const subtitle = document.createElement('div');\n subtitle.classList.add('row-subtitle');\n setDirection(subtitle);\n if(this.title) this.title.after(subtitle);\n else this.container.prepend(subtitle);\n this.container.classList.remove('no-subtitle');\n return subtitle;\n }\n\n private createMidtitle() {\n const midtitle = document.createElement('div');\n midtitle.classList.add('row-midtitle');\n this.subtitle.parentElement.insertBefore(midtitle, this.subtitle);\n return midtitle;\n }\n\n public createMedia(size?: RowMediaSizeType) {\n const media = document.createElement('div');\n return this.applyMediaElement(media, size);\n }\n\n public applyMediaElement(media: HTMLElement, size?: RowMediaSizeType) {\n this.container.classList.add('row-with-padding');\n\n this.media = media;\n media.classList.add('row-media');\n\n if(size) {\n media.classList.add('row-media-' + size);\n }\n\n this.container.append(media);\n\n return media;\n }\n\n public disableWithPromise(promise: Promise) {\n this.container.classList.add('is-disabled');\n promise.finally(() => {\n this.container.classList.remove('is-disabled');\n });\n }\n\n public makeSortable() {\n const sortIcon = document.createElement('span');\n this.container.classList.add('row-sortable', 'tgico');\n sortIcon.classList.add('row-sortable-icon', 'tgico-menu');\n this.container.append(sortIcon);\n }\n\n public toggleSorting(enabled?: boolean) {\n this.container.classList.toggle('cant-sort', !enabled);\n }\n}\n\nexport const CreateRowFromCheckboxField = (checkboxField: CheckboxField) => {\n return new Row({checkboxField, listenerSetter: checkboxField.listenerSetter});\n};\n\nexport const RadioFormFromRows = (rows: Row[], onChange: (value: string) => void) => {\n return RadioForm(rows.map((r) => ({container: r.container, input: r.radioField.input})), onChange);\n};\n\nexport const RadioFormFromValues = (values: {langPackKey: LangPackKey, value: number | string, checked?: boolean}[], onChange: Parameters[1]) => {\n const name = 'name-' + (Math.random() * 0x7FFFFF | 0);\n let checkedRadioField: RadioField;\n const rows = values.map(({langPackKey, value, checked}) => {\n const row = new Row({\n radioField: new RadioField({\n langKey: langPackKey,\n name,\n value: '' + value\n })\n });\n\n if(checked) {\n checkedRadioField = row.radioField;\n }\n\n return row;\n });\n\n const form = RadioFormFromRows(rows, onChange);\n if(checkedRadioField) {\n checkedRadioField.checked = true;\n }\n return form;\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_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport {logger, LogTypes} from '../lib/logger';\nimport fastSmoothScroll, {ScrollOptions} from '../helpers/fastSmoothScroll';\nimport useHeavyAnimationCheck from '../hooks/useHeavyAnimationCheck';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {IS_ANDROID} from '../environment/userAgent';\n/*\nvar el = $0;\nvar height = 0;\nvar checkUp = false;\n\ndo {\n height += el.scrollHeight;\n} while(el = (checkUp ? el.previousElementSibling : el.nextElementSibling));\nconsole.log(height);\n*/\n\n/*\nArray.from($0.querySelectorAll('.bubble-content')).forEach((_el) => {\n //_el.style.display = '';\n //return;\n\n let el = _el.parentElement;\n let height = el.scrollHeight;\n let width = el.scrollWidth;\n el.style.width = width + 'px';\n el.style.height = height + 'px';\n _el.style.display = 'none';\n});\n*/\n\n/* const scrollables: Map = new Map();\nconst scrollsIntersector = new IntersectionObserver((entries) => {\n for(let entry of entries) {\n const scrollable = scrollables.get(entry.target as HTMLElement);\n\n if(entry.isIntersecting) {\n scrollable.isVisible = true;\n } else {\n scrollable.isVisible = false;\n\n if(!isInDOM(entry.target)) {\n scrollsIntersector.unobserve(scrollable.container);\n scrollables.delete(scrollable.container);\n }\n }\n }\n}); */\n\nconst SCROLL_THROTTLE = /* IS_ANDROID ? 200 : */24;\n\nexport class ScrollableBase {\n protected log: ReturnType;\n\n public splitUp: HTMLElement;\n public onScrollMeasure: number = 0;\n\n public lastScrollPosition: number = 0;\n public lastScrollDirection: number = 0;\n\n public onAdditionalScroll: () => void;\n public onScrolledTop: () => void;\n public onScrolledBottom: () => void;\n\n public isHeavyAnimationInProgress = false;\n protected needCheckAfterAnimation = false;\n\n public checkForTriggers?: () => void;\n\n public scrollProperty: 'scrollTop' | 'scrollLeft';\n\n protected removeHeavyAnimationListener: () => void;\n protected addedScrollListener: boolean;\n\n constructor(public el?: HTMLElement, logPrefix = '', public container: HTMLElement = document.createElement('div')) {\n this.container.classList.add('scrollable');\n\n this.log = logger('SCROLL' + (logPrefix ? '-' + logPrefix : ''), LogTypes.Error);\n\n if(el) {\n Array.from(el.children).forEach((c) => this.container.append(c));\n\n el.append(this.container);\n }\n // this.onScroll();\n }\n\n public addScrollListener() {\n if(this.addedScrollListener) {\n return;\n }\n\n this.addedScrollListener = true;\n this.container.addEventListener('scroll', this.onScroll, {passive: true, capture: true});\n }\n\n public removeScrollListener() {\n if(!this.addedScrollListener) {\n return;\n }\n\n this.addedScrollListener = false;\n this.container.removeEventListener('scroll', this.onScroll, {capture: true});\n }\n\n public setListeners() {\n if(this.removeHeavyAnimationListener) {\n return;\n }\n\n window.addEventListener('resize', this.onScroll, {passive: true});\n this.addScrollListener();\n\n this.removeHeavyAnimationListener = useHeavyAnimationCheck(() => {\n this.isHeavyAnimationInProgress = true;\n\n if(this.onScrollMeasure) {\n this.cancelMeasure();\n this.needCheckAfterAnimation = true;\n }\n }, () => {\n this.isHeavyAnimationInProgress = false;\n\n if(this.needCheckAfterAnimation) {\n this.onScroll();\n this.needCheckAfterAnimation = false;\n }\n });\n }\n\n public removeListeners() {\n if(!this.removeHeavyAnimationListener) {\n return;\n }\n\n window.removeEventListener('resize', this.onScroll);\n this.removeScrollListener();\n\n this.removeHeavyAnimationListener();\n this.removeHeavyAnimationListener = undefined;\n }\n\n public destroy() {\n this.removeListeners();\n this.onAdditionalScroll = undefined;\n this.onScrolledTop = undefined;\n this.onScrolledBottom = undefined;\n }\n\n public append(...args: Parameters) {\n this.container.append(...args);\n }\n\n public scrollIntoViewNew(options: Omit) {\n // return Promise.resolve();\n // this.removeListeners();\n return fastSmoothScroll({\n ...options,\n container: this.container\n });/* .finally(() => {\n this.setListeners();\n }); */\n }\n\n public onScroll = () => {\n // if(this.debug) {\n // this.log('onScroll call', this.onScrollMeasure);\n // }\n\n // return;\n\n if(this.isHeavyAnimationInProgress) {\n this.cancelMeasure();\n this.needCheckAfterAnimation = true;\n return;\n }\n\n // if(this.onScrollMeasure || ((this.scrollLocked || (!this.onScrolledTop && !this.onScrolledBottom)) && !this.splitUp && !this.onAdditionalScroll)) return;\n if((!this.onScrolledTop && !this.onScrolledBottom) && !this.splitUp && !this.onAdditionalScroll) return;\n if(this.onScrollMeasure) return;\n // if(this.onScrollMeasure) window.cancelAnimationFrame(this.onScrollMeasure);\n // this.onScrollMeasure = window.requestAnimationFrame(() => {\n this.onScrollMeasure = window.setTimeout(() => {\n this.onScrollMeasure = 0;\n\n const scrollPosition = this.container[this.scrollProperty];\n this.lastScrollDirection = this.lastScrollPosition === scrollPosition ? 0 : (this.lastScrollPosition < scrollPosition ? 1 : -1); // * 1 - bottom, -1 - top\n this.lastScrollPosition = scrollPosition;\n\n // lastScrollDirection check is useless here, every callback should decide on its own\n if(this.onAdditionalScroll/* && this.lastScrollDirection !== 0 */) {\n this.onAdditionalScroll();\n }\n\n if(this.checkForTriggers) {\n this.checkForTriggers();\n }\n // });\n }, SCROLL_THROTTLE);\n };\n\n public cancelMeasure() {\n if(this.onScrollMeasure) {\n // window.cancelAnimationFrame(this.onScrollMeasure);\n clearTimeout(this.onScrollMeasure);\n this.onScrollMeasure = 0;\n }\n }\n}\n\nexport type SliceSides = 'top' | 'bottom';\nexport type SliceSidesContainer = {[k in SliceSides]: boolean};\n\nexport default class Scrollable extends ScrollableBase {\n public padding: HTMLElement;\n\n public loadedAll: SliceSidesContainer = {top: true, bottom: false};\n\n constructor(el?: HTMLElement, logPrefix = '', public onScrollOffset = 300, withPaddingContainer?: boolean) {\n super(el, logPrefix);\n\n /* if(withPaddingContainer) {\n this.padding = document.createElement('div');\n this.padding.classList.add('scrollable-padding');\n Array.from(this.container.children).forEach((c) => this.padding.append(c));\n this.container.append(this.padding);\n } */\n\n this.container.classList.add('scrollable-y');\n this.setListeners();\n this.scrollProperty = 'scrollTop';\n }\n\n public attachBorderListeners(setClassOn = this.container) {\n const cb = this.onAdditionalScroll;\n this.onAdditionalScroll = () => {\n cb?.();\n setClassOn.classList.toggle('scrolled-top', !this.scrollTop);\n setClassOn.classList.toggle('scrolled-bottom', this.isScrolledDown);\n };\n\n setClassOn.classList.add('scrolled-top', 'scrolled-bottom', 'scrollable-y-bordered');\n }\n\n public setVirtualContainer(el?: HTMLElement) {\n this.splitUp = el;\n this.log('setVirtualContainer:', el, this);\n }\n\n public checkForTriggers = () => {\n if((!this.onScrolledTop && !this.onScrolledBottom)) return;\n\n if(this.isHeavyAnimationInProgress) {\n this.onScroll();\n return;\n }\n\n const scrollHeight = this.container.scrollHeight;\n if(!scrollHeight) { // ะฝะตะทะฐั‡ะตะผ ะฒั‹ะทั‹ะฒะฐั‚ัŒ ั‚ั€ะธะณะณะตั€ั‹ ะตัะปะธ ะฑะปะพะบ ะฟัƒัั‚ะพะน ะธะปะธ ะฝะต ะฒะธะดะตะฝ\n return;\n }\n\n const clientHeight = this.container.clientHeight;\n const maxScrollTop = scrollHeight - clientHeight;\n const scrollTop = this.lastScrollPosition;\n\n // this.log('checkForTriggers:', scrollTop, maxScrollTop);\n\n if(this.onScrolledTop && scrollTop <= this.onScrollOffset && this.lastScrollDirection <= 0/* && direction === -1 */) {\n this.onScrolledTop();\n }\n\n if(this.onScrolledBottom && (maxScrollTop - scrollTop) <= this.onScrollOffset && this.lastScrollDirection >= 0/* && direction === 1 */) {\n this.onScrolledBottom();\n }\n };\n\n public prepend(...elements: (HTMLElement | DocumentFragment)[]) {\n (this.splitUp || this.padding || this.container).prepend(...elements);\n }\n\n public append(...elements: (HTMLElement | DocumentFragment)[]) {\n (this.splitUp || this.padding || this.container).append(...elements);\n }\n\n public getDistanceToEnd() {\n return this.scrollHeight - Math.round(this.scrollTop + this.container.offsetHeight);\n }\n\n get isScrolledDown() {\n return this.getDistanceToEnd() <= 1;\n }\n\n set scrollTop(y: number) {\n this.container.scrollTop = y;\n }\n\n get scrollTop() {\n // this.log.trace('get scrollTop');\n return this.container.scrollTop;\n }\n\n public setScrollTopSilently(value: number) {\n this.lastScrollPosition = value;\n this.ignoreNextScrollEvent();\n\n this.scrollTop = value;\n }\n\n public ignoreNextScrollEvent() {\n if(this.removeHeavyAnimationListener) {\n this.removeScrollListener();\n this.container.addEventListener('scroll', (e) => {\n cancelEvent(e);\n this.addScrollListener();\n }, {capture: true, passive: false, once: true});\n }\n }\n\n get scrollHeight() {\n return this.container.scrollHeight;\n }\n}\n\nexport class ScrollableX extends ScrollableBase {\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, public splitCount = 15, public container: HTMLElement = document.createElement('div')) {\n super(el, logPrefix, container);\n\n this.container.classList.add('scrollable-x');\n\n if(!IS_TOUCH_SUPPORTED) {\n const scrollHorizontally = (e: any) => {\n if(!e.deltaX && this.container.scrollWidth > this.container.clientWidth) {\n this.container.scrollLeft += e.deltaY / 4;\n cancelEvent(e);\n }\n };\n\n this.container.addEventListener('wheel', scrollHorizontally, {passive: false});\n }\n\n this.scrollProperty = 'scrollLeft';\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 {LangPackKey, FormatterArguments, i18n_} from '../lib/langPack';\nimport {generateDelimiter} from './generateDelimiter';\nimport Scrollable from './scrollable';\n\nexport type SettingSectionOptions = {\n name?: LangPackKey,\n nameArgs?: FormatterArguments,\n caption?: LangPackKey | true,\n captionArgs?: FormatterArguments,\n captionOld?: SettingSectionOptions['caption'],\n noDelimiter?: boolean,\n fakeGradientDelimiter?: boolean,\n noShadow?: boolean,\n // fullWidth?: boolean,\n // noPaddingTop?: boolean\n};\n\nconst className = 'sidebar-left-section';\nexport default class SettingSection {\n public container: HTMLElement;\n public innerContainer: HTMLElement;\n public content: HTMLElement;\n public title: HTMLElement;\n public caption: HTMLElement;\n\n private fullWidth: boolean;\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 // if(options.fullWidth) {\n // this.fullWidth = true;\n // }\n\n // if(options.noPaddingTop) {\n // innerContainer.classList.add('no-padding-top');\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 const caption = options.caption ?? options.captionOld;\n if(caption) {\n const el = this.caption = this.generateContentElement();\n el.classList.add(className + '-caption');\n\n if(!options.captionOld) {\n container.append(el);\n }\n\n if(caption !== true) {\n i18n_({element: el, key: caption, args: options.captionArgs});\n }\n }\n }\n\n public generateContentElement() {\n const content = document.createElement('div');\n content.classList.add(className + '-content');\n\n // if(this.fullWidth) {\n // content.classList.add('full-width');\n // }\n\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","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {InputFile} from '../../../layer';\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport InputField from '../../inputField';\nimport {SliderSuperTab} from '../../slider';\nimport AvatarEdit from '../../avatarEdit';\nimport I18n from '../../../lib/langPack';\nimport ButtonCorner from '../../buttonCorner';\nimport getUserStatusString from '../../wrappers/getUserStatusString';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport SettingSection from '../../settingSection';\n\ninterface OpenStreetMapInterface {\n place_id?: number;\n license?: string;\n osm_type?: string;\n osm_id?: number;\n lat?: string;\n lon?: string;\n display_name: string;\n address?: object;\n boundingbox?: object;\n}\n\nexport default class AppNewGroupTab extends SliderSuperTab {\n private avatarEdit: AvatarEdit;\n private uploadAvatar: () => Promise = null;\n private peerIds: PeerId[];\n private isGeoChat: boolean = false;\n private nextBtn: HTMLButtonElement;\n private groupNameInputField: InputField;\n private list: HTMLUListElement;\n private groupLocationInputField: InputField;\n private userLocationCoords: {lat: number, long: number};\n private userLocationAddress: string;\n\n public init(\n peerIds: PeerId[],\n isGeoChat: boolean = false\n ) {\n this.isGeoChat = isGeoChat;\n this.peerIds = peerIds;\n\n this.container.classList.add('new-group-container');\n this.setTitle('NewGroup');\n\n this.avatarEdit = new AvatarEdit((_upload) => {\n this.uploadAvatar = _upload;\n });\n\n const section = new SettingSection({});\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.groupNameInputField = new InputField({\n label: 'CreateGroup.NameHolder',\n maxLength: 128\n });\n\n this.groupLocationInputField = new InputField({\n label: 'ChatLocation',\n name: 'location',\n canBeEdited: false\n });\n\n inputWrapper.append(\n this.groupNameInputField.container,\n this.groupLocationInputField.container\n );\n\n this.listenerSetter.add(this.groupNameInputField.input)('input', () => {\n const value = this.groupNameInputField.value;\n let valueCheck = !!value.length && !this.groupNameInputField.input.classList.contains('error');\n if(this.isGeoChat) valueCheck = valueCheck && !!this.userLocationCoords && !!this.userLocationAddress;\n this.nextBtn.classList.toggle('is-visible', !!valueCheck);\n });\n\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\n\n attachClickEvent(this.nextBtn, () => {\n const title = this.groupNameInputField.value;\n\n let promise: Promise;\n if(this.isGeoChat) {\n if(!this.userLocationAddress || !this.userLocationCoords) return;\n promise = this.managers.appChatsManager.createChannel({\n title,\n about: '',\n geo_point: {\n _: 'inputGeoPoint',\n ...this.userLocationCoords\n },\n address: this.userLocationAddress,\n megagroup: true\n }).then((chatId) => {\n if(this.uploadAvatar) {\n this.uploadAvatar().then((inputFile) => {\n this.managers.appChatsManager.editPhoto(chatId, inputFile);\n });\n }\n\n if(this.peerIds.length) {\n this.managers.appChatsManager.inviteToChannel(chatId, this.peerIds);\n }\n\n return chatId;\n });\n } else {\n this.nextBtn.disabled = true;\n promise = this.managers.appChatsManager.createChat(title, this.peerIds.map((peerId) => peerId.toUserId())).then((chatId) => {\n if(this.uploadAvatar) {\n this.uploadAvatar().then((inputFile) => {\n this.managers.appChatsManager.editPhoto(chatId, inputFile);\n });\n }\n\n return chatId;\n });\n }\n\n if(!promise) {\n return;\n }\n\n promise.then((chatId) => {\n this.close();\n\n appImManager.setInnerPeer({peerId: chatId.toPeerId(true)});\n });\n }, {listenerSetter: this.listenerSetter});\n\n const chatsSection = new SettingSection({\n name: 'Members',\n nameArgs: [this.peerIds.length]\n });\n\n const list = this.list = appDialogsManager.createChatList({\n new: true\n });\n\n chatsSection.content.append(list);\n\n section.content.append(this.avatarEdit.container, inputWrapper);\n\n this.content.append(this.nextBtn);\n this.scrollable.append(section.container, chatsSection.container);\n\n if(isGeoChat) {\n this.setTitle('NearbyCreateGroup');\n this.groupLocationInputField.container.classList.remove('hide');\n this.groupLocationInputField.setValueSilently(I18n.format('Loading', true));\n this.startLocating();\n } else {\n this.groupLocationInputField.container.classList.add('hide');\n }\n\n return Promise.all(this.peerIds.map(async(userId) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: userId,\n container: this.list,\n rippleEnabled: false,\n avatarSize: 'abitbigger'\n });\n\n dom.lastMessageSpan.append(getUserStatusString(await this.managers.appUsersManager.getUser(userId)));\n }));\n }\n\n public onCloseAfterTimeout() {\n this.avatarEdit.clear();\n this.uploadAvatar = null;\n this.groupNameInputField.value = '';\n this.groupLocationInputField.container.classList.add('hide');\n this.nextBtn.disabled = false;\n }\n\n private startLocating() {\n navigator.geolocation.getCurrentPosition((location) => {\n this.userLocationCoords = {\n lat: location.coords.latitude,\n long: location.coords.longitude\n };\n\n let uri = 'https://nominatim.openstreetmap.org/reverse';\n uri += '?lat='+location.coords.latitude;\n uri += '&lon='+location.coords.longitude;\n uri += '&format=json';\n uri += '&addressdetails=1';\n uri += '&accept-language=en';\n fetch(uri)\n .then((response) => response.json())\n .then((response: OpenStreetMapInterface) => {\n this.userLocationAddress = response.display_name;\n this.groupLocationInputField.setValueSilently(response.display_name);\n });\n }, (error) => {\n if(error instanceof GeolocationPositionError) {\n this.groupLocationInputField.setValueSilently('Location permission denied. Please retry later.');\n } else {\n this.groupLocationInputField.setValueSilently('An error has occurred. Please retry later.');\n }\n });\n }\n}\n","enum PrivacyType {\n Everybody = 2,\n Contacts = 1,\n Nobody = 0\n}\n\nexport default PrivacyType;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {PrivacyRule} from '../../../../layer';\nimport PrivacyType from './privacyType';\n\nexport default function getPrivacyRulesDetails(rules: PrivacyRule[]) {\n const types: PrivacyType[] = [];\n\n type peers = {users: UserId[], chats: ChatId[]};\n const allowPeers: peers = {users: [], chats: []}, disallowPeers: peers = {users: [], chats: []};\n rules.forEach((rule) => {\n switch(rule._) {\n case 'privacyValueAllowAll':\n types.push(2);\n break;\n case 'privacyValueDisallowAll':\n types.push(0);\n break;\n case 'privacyValueAllowContacts':\n types.push(1);\n break;\n /* case 'privacyValueDisallowContacts':\n types.push('Except My Contacts');\n break; */\n case 'privacyValueAllowChatParticipants':\n allowPeers.chats.push(...rule.chats);\n break;\n case 'privacyValueAllowUsers':\n allowPeers.users.push(...rule.users);\n break;\n case 'privacyValueDisallowChatParticipants':\n disallowPeers.chats.push(...rule.chats);\n break;\n case 'privacyValueDisallowUsers':\n disallowPeers.users.push(...rule.users);\n break;\n }\n });\n\n return {type: types[0], disallowPeers, allowPeers};\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 {randomLong} from '../helpers/random';\nimport {InputPrivacyKey, InputPrivacyRule} from '../layer';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport getPrivacyRulesDetails from '../lib/appManagers/utils/privacy/getPrivacyRulesDetails';\nimport PrivacyType from '../lib/appManagers/utils/privacy/privacyType';\nimport {i18n, join, LangPackKey, _i18n} from '../lib/langPack';\nimport RadioField from './radioField';\nimport Row, {RadioFormFromRows} from './row';\nimport Scrollable from './scrollable';\nimport SettingSection, {generateSection} from './settingSection';\nimport AppAddMembersTab from './sidebarLeft/tabs/addMembers';\nimport {SliderSuperTabEventable} from './sliderTab';\n\nexport type PrivacySectionStr = LangPackKey | '' | HTMLElement;\nexport default class PrivacySection {\n public radioRows: Map;\n public radioSection: SettingSection;\n public exceptions: Map;\n public peerIds: {\n disallow?: PeerId[],\n allow?: PeerId[]\n };\n public type: PrivacyType;\n\n constructor(public options: {\n tab: SliderSuperTabEventable,\n title: LangPackKey,\n inputKey: InputPrivacyKey['_'],\n captions?: [PrivacySectionStr, PrivacySectionStr, PrivacySectionStr],\n appendTo?: Scrollable,\n noExceptions?: boolean,\n onRadioChange?: (value: number) => any,\n skipTypes?: PrivacyType[],\n exceptionTexts?: [LangPackKey, LangPackKey],\n managers: AppManagers\n }) {\n if(options.captions) {\n options.captions.reverse();\n }\n\n const managers = options.managers;\n\n this.radioSection = new SettingSection({name: options.title, caption: true});\n\n this.radioRows = new Map();\n\n let r: Array<{type: PrivacyType, langKey: LangPackKey}> = [{\n type: PrivacyType.Everybody,\n langKey: 'PrivacySettingsController.Everbody'\n }, {\n type: PrivacyType.Contacts,\n langKey: 'PrivacySettingsController.MyContacts'\n }, {\n type: PrivacyType.Nobody,\n langKey: 'PrivacySettingsController.Nobody'\n }];\n\n if(options.skipTypes) {\n r = r.filter((r) => !options.skipTypes.includes(r.type));\n }\n\n const random = randomLong();\n r.forEach(({type, langKey}) => {\n const row = new Row({\n radioField: new RadioField({\n langKey,\n name: random,\n value: '' + type\n })\n });\n\n this.radioRows.set(type, row);\n });\n\n const form = RadioFormFromRows([...this.radioRows.values()], this.onRadioChange);\n\n this.radioSection.content.append(form);\n if(options.appendTo) {\n options.appendTo.append(this.radioSection.container);\n }\n\n if(!options.noExceptions) {\n const container = generateSection(options.appendTo, 'PrivacyExceptions', 'PrivacySettingsController.PeerInfo');\n\n this.exceptions = new Map([[\n 'disallow',\n {\n titleLangKey: options.exceptionTexts[0],\n key: 'disallow',\n row: null,\n icon: 'deleteuser',\n subtitleLangKey: 'PrivacySettingsController.AddUsers',\n clickable: true\n }\n ], [\n 'allow',\n {\n titleLangKey: options.exceptionTexts[1],\n key: 'allow',\n row: null,\n icon: 'adduser',\n subtitleLangKey: 'PrivacySettingsController.AddUsers',\n clickable: true\n }\n ]]);\n\n this.exceptions.forEach((exception) => {\n exception.row = new Row(exception);\n\n exception.row.container.addEventListener('click', () => {\n promise.then(() => {\n const _peerIds = this.peerIds[exception.key];\n options.tab.slider.createTab(AppAddMembersTab).open({\n type: 'privacy',\n skippable: true,\n title: exception.titleLangKey,\n placeholder: 'PrivacyModal.Search.Placeholder',\n takeOut: (newPeerIds) => {\n _peerIds.length = 0;\n _peerIds.push(...newPeerIds);\n exception.row.subtitle.innerHTML = '';\n exception.row.subtitle.append(...this.generateStr(this.splitPeersByType(newPeerIds)));\n },\n selectedPeerIds: _peerIds\n });\n });\n });\n\n container.append(exception.row.container);\n });\n }\n\n /* setTimeout(() => {\n this.setRadio(PrivacyType.Contacts);\n }, 0); */\n\n const promise = managers.appPrivacyManager.getPrivacy(options.inputKey).then((rules) => {\n const details = getPrivacyRulesDetails(rules);\n this.setRadio(details.type);\n\n if(this.exceptions) {\n this.peerIds = {};\n ['allow' as const, 'disallow' as const].forEach((k) => {\n const arr = [];\n const from = k === 'allow' ? details.allowPeers : details.disallowPeers;\n arr.push(...from.users.map((id) => id.toPeerId()));\n arr.push(...from.chats.map((id) => id.toPeerId(true)));\n this.peerIds[k] = arr;\n const s = this.exceptions.get(k).row.subtitle;\n s.innerHTML = '';\n s.append(...this.generateStr(from));\n });\n }\n\n options.tab.eventListener.addEventListener('destroy', async() => {\n const rules: InputPrivacyRule[] = [];\n\n switch(this.type) {\n case PrivacyType.Everybody:\n rules.push({_: 'inputPrivacyValueAllowAll'});\n break;\n case PrivacyType.Contacts:\n rules.push({_: 'inputPrivacyValueAllowContacts'});\n break;\n case PrivacyType.Nobody:\n rules.push({_: 'inputPrivacyValueDisallowAll'});\n break;\n }\n\n if(this.exceptions) {\n const a = ([\n ['allow', 'inputPrivacyValueAllowChatParticipants', 'inputPrivacyValueAllowUsers'],\n ['disallow', 'inputPrivacyValueDisallowChatParticipants', 'inputPrivacyValueDisallowUsers']\n ] as Array<[\n 'allow' | 'disallow',\n 'inputPrivacyValueAllowChatParticipants' | 'inputPrivacyValueDisallowChatParticipants',\n 'inputPrivacyValueAllowUsers' | 'inputPrivacyValueDisallowUsers'\n ]>);\n for(const [k, chatKey, usersKey] of a) {\n if(this.exceptions.get(k).row.container.classList.contains('hide')) {\n continue;\n }\n\n const _peerIds = this.peerIds[k];\n if(_peerIds) {\n const splitted = this.splitPeersByType(_peerIds);\n if(splitted.chats.length) {\n rules.push({_: chatKey, chats: splitted.chats});\n }\n\n if(splitted.users.length) {\n rules.push({\n _: usersKey,\n users: await Promise.all(splitted.users.map((id) => managers.appUsersManager.getUserInput(id)))\n });\n }\n }\n }\n }\n\n managers.appPrivacyManager.setPrivacy(options.inputKey, rules);\n }, {once: true});\n });\n }\n\n private onRadioChange = (value: string | PrivacySection['type']) => {\n value = +value as PrivacySection['type'];\n this.type = value;\n\n const caption = this.options.captions[this.type];\n const captionElement = this.radioSection.caption;\n if(!caption) {\n captionElement.innerHTML = '';\n } else if(caption instanceof HTMLElement) {\n replaceContent(captionElement, caption);\n } else {\n _i18n(captionElement, caption);\n }\n captionElement.classList.toggle('hide', !caption);\n\n if(this.exceptions) {\n this.exceptions.get('allow').row.container.classList.toggle('hide', this.type === PrivacyType.Everybody);\n this.exceptions.get('disallow').row.container.classList.toggle('hide', this.type === PrivacyType.Nobody);\n }\n\n this.options.onRadioChange && this.options.onRadioChange(value);\n };\n\n public setRadio(type: PrivacySection['type']) {\n const row = this.radioRows.get(type);\n this.onRadioChange(type);\n row.radioField.input.checked = true;\n }\n\n private splitPeersByType(peerIds: PeerId[]) {\n const peers = {users: [] as UserId[], chats: [] as ChatId[]};\n peerIds.forEach((peerId) => {\n peers[peerId.isAnyChat() ? 'chats' : 'users'].push(peerId.isAnyChat() ? peerId.toChatId() : peerId);\n });\n\n return peers;\n }\n\n private generateStr(peers: {users: UserId[], chats: ChatId[]}) {\n if(!peers.users.length && !peers.chats.length) {\n return [i18n('PrivacySettingsController.AddUsers')];\n }\n\n return join([\n peers.users.length ? i18n('Users', [peers.users.length]) : null,\n peers.chats.length ? i18n('Chats', [peers.chats.length]) : null\n ].filter(Boolean), false);\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 {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {i18n, LangPackKey} from '../../../../lib/langPack';\nimport anchorCopy from '../../../../helpers/dom/anchorCopy';\nimport PrivacyType from '../../../../lib/appManagers/utils/privacy/privacyType';\n\nexport default class AppPrivacyPhoneNumberTab extends SliderSuperTabEventable {\n public async init() {\n this.container.classList.add('privacy-tab', 'privacy-phone-number');\n this.setTitle('PrivacyPhone');\n\n const formatted = '+' + (await this.managers.appUsersManager.getSelf()).phone;\n const captionEl = document.createElement('div');\n captionEl.append(\n i18n('PrivacyPhoneInfo'),\n document.createElement('br'),\n document.createElement('br'),\n i18n('PrivacyPhoneInfo4'),\n document.createElement('br'),\n anchorCopy({\n mePath: formatted\n })\n );\n\n const phoneSection = new PrivacySection({\n tab: this,\n title: 'PrivacyPhoneTitle',\n inputKey: 'inputPrivacyKeyPhoneNumber',\n captions: [captionEl, captionEl, ''],\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\n appendTo: this.scrollable,\n onRadioChange: (type) => {\n s.setRadio(PrivacyType.Everybody);\n s.radioSection.container.classList.toggle('hide', type !== PrivacyType.Nobody);\n },\n managers: this.managers\n });\n\n const sCaption: LangPackKey = 'PrivacyPhoneInfo3';\n const s = new PrivacySection({\n tab: this,\n title: 'PrivacyPhoneTitle2',\n inputKey: 'inputPrivacyKeyAddedByPhone',\n captions: [sCaption, sCaption, ''],\n noExceptions: true,\n skipTypes: [PrivacyType.Nobody],\n managers: this.managers\n });\n\n this.scrollable.container.insertBefore(s.radioSection.container, phoneSection.radioSection.container.nextSibling);\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 Button from '../../../button';\nimport SettingSection from '../../../settingSection';\nimport {SliderSuperTab} from '../../../slider';\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\nimport AppSettingsTab from '../settings';\n\nexport default class AppTwoStepVerificationSetTab extends SliderSuperTab {\n public init() {\n this.container.classList.add('two-step-verification', 'two-step-verification-set');\n this.setTitle('TwoStepVerificationPasswordSet');\n\n const section = new SettingSection({\n captionOld: 'TwoStepVerificationPasswordSetInfo',\n noDelimiter: true\n });\n\n const emoji = '๐Ÿฅณ';\n const stickerContainer = document.createElement('div');\n\n wrapStickerEmoji({\n emoji,\n div: stickerContainer,\n width: 160,\n height: 160\n });\n\n section.content.append(stickerContainer);\n\n const inputContent = section.generateContentElement();\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const btnReturn = Button('btn-primary btn-color-primary', {text: 'TwoStepVerificationPasswordReturnSettings'});\n\n attachClickEvent(btnReturn, (e) => {\n this.close();\n });\n\n this.slider.sliceTabsUntilTab(AppSettingsTab, this);\n\n inputWrapper.append(btnReturn);\n\n inputContent.append(inputWrapper);\n\n this.scrollable.container.append(section.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 {IS_MOBILE_SAFARI} from '../../environment/userAgent';\n\nexport function canFocus(isFirstInput: boolean) {\n return !IS_MOBILE_SAFARI || !isFirstInput;\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 {AccountPassword} from '../../../../layer';\nimport Button from '../../../button';\nimport {SliderSuperTab} from '../../../slider';\nimport AppTwoStepVerificationSetTab from './passwordSet';\nimport CodeInputField from '../../../codeInputField';\nimport AppTwoStepVerificationEmailTab from './email';\nimport {putPreloader} from '../../../putPreloader';\nimport {i18n, _i18n} from '../../../../lib/langPack';\nimport {canFocus} from '../../../../helpers/dom/canFocus';\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\nimport replaceContent from '../../../../helpers/dom/replaceContent';\nimport toggleDisability from '../../../../helpers/dom/toggleDisability';\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\nimport SettingSection from '../../../settingSection';\n\nexport default class AppTwoStepVerificationEmailConfirmationTab extends SliderSuperTab {\n public codeInputField: CodeInputField;\n public state: AccountPassword;\n public email: string;\n public length: number;\n public isFirst = false;\n\n public init() {\n this.container.classList.add('two-step-verification', 'two-step-verification-email-confirmation');\n this.setTitle('TwoStepAuth.RecoveryTitle');\n\n const section = new SettingSection({\n captionOld: true,\n noDelimiter: true\n });\n\n _i18n(section.caption, 'TwoStepAuth.ConfirmEmailCodeDesc', [this.email]);\n\n const emoji = '๐Ÿ“ฌ';\n const stickerContainer = document.createElement('div');\n\n wrapStickerEmoji({\n div: stickerContainer,\n width: 160,\n height: 160,\n emoji\n });\n\n section.content.append(stickerContainer);\n\n const inputContent = section.generateContentElement();\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const inputField = this.codeInputField = new CodeInputField({\n name: 'recovery-email-code',\n label: 'TwoStepAuth.RecoveryCode',\n length: this.length,\n onFill: (code) => {\n freeze(true);\n\n this.managers.passwordManager.confirmPasswordEmail('' + code)\n .then((value) => {\n if(!value) {\n\n }\n\n goNext();\n })\n .catch((err) => {\n switch(err.type) {\n case 'CODE_INVALID':\n inputField.input.classList.add('error');\n replaceContent(inputField.label, i18n('TwoStepAuth.RecoveryCodeInvalid'));\n break;\n\n case 'EMAIL_HASH_EXPIRED':\n inputField.input.classList.add('error');\n replaceContent(inputField.label, i18n('TwoStepAuth.RecoveryCodeExpired'));\n break;\n\n default:\n console.error('confirm error', err);\n break;\n }\n\n freeze(false);\n });\n }\n });\n\n const btnChange = Button('btn-primary btn-primary-transparent primary', {text: 'TwoStepAuth.EmailCodeChangeEmail'});\n const btnResend = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'ResendCode'});\n\n const goNext = () => {\n this.slider.createTab(AppTwoStepVerificationSetTab).open();\n };\n\n const freeze = (disable: boolean) => {\n toggleDisability([inputField.input, btnChange, btnResend], disable);\n };\n\n attachClickEvent(btnChange, (e) => {\n freeze(true);\n this.managers.passwordManager.cancelPasswordEmail().then((value) => {\n this.slider.sliceTabsUntilTab(AppTwoStepVerificationEmailTab, this);\n this.close();\n }, () => {\n freeze(false);\n });\n });\n\n attachClickEvent(btnResend, (e) => {\n freeze(true);\n const d = putPreloader(btnResend);\n this.managers.passwordManager.resendPasswordEmail().then((value) => {\n d.remove();\n freeze(false);\n });\n });\n\n inputWrapper.append(inputField.container, btnChange, btnResend);\n\n inputContent.append(inputWrapper);\n\n this.scrollable.container.append(section.container);\n }\n\n onOpenAfterTimeout() {\n if(!canFocus(this.isFirst)) return;\n this.codeInputField.input.focus();\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 {AccountPassword} from '../../../../layer';\nimport Button from '../../../button';\nimport {SliderSuperTab} from '../../../slider';\nimport InputField from '../../../inputField';\nimport {putPreloader} from '../../../putPreloader';\nimport AppTwoStepVerificationSetTab from './passwordSet';\nimport AppTwoStepVerificationEmailConfirmationTab from './emailConfirmation';\nimport PopupPeer from '../../../popups/peer';\nimport cancelEvent from '../../../../helpers/dom/cancelEvent';\nimport {canFocus} from '../../../../helpers/dom/canFocus';\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\nimport matchEmail from '../../../../lib/richTextProcessor/matchEmail';\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\nimport SettingSection from '../../../settingSection';\n\nexport default class AppTwoStepVerificationEmailTab extends SliderSuperTab {\n public inputField: InputField;\n public state: AccountPassword;\n public plainPassword: string;\n public newPassword: string;\n public hint: string;\n public isFirst = false;\n\n public init() {\n this.container.classList.add('two-step-verification', 'two-step-verification-email');\n this.setTitle('RecoveryEmailTitle');\n\n const section = new SettingSection({\n captionOld: true,\n noDelimiter: true\n });\n\n const emoji = '๐Ÿ’Œ';\n const stickerContainer = document.createElement('div');\n\n wrapStickerEmoji({\n div: stickerContainer,\n width: 160,\n height: 160,\n emoji\n });\n\n section.content.append(stickerContainer);\n\n const inputContent = section.generateContentElement();\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const inputField = this.inputField = new InputField({\n name: 'recovery-email',\n label: 'RecoveryEmail',\n plainText: true\n });\n\n inputField.input.addEventListener('keypress', (e) => {\n if(e.key === 'Enter') {\n cancelEvent(e);\n return onContinueClick();\n }\n });\n\n inputField.input.addEventListener('input', (e) => {\n inputField.input.classList.remove('error');\n });\n\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\n const btnSkip = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'YourEmailSkip'});\n\n const goNext = () => {\n this.slider.createTab(AppTwoStepVerificationSetTab).open();\n };\n\n const onContinueClick = () => {\n const email = inputField.value.trim();\n const match = matchEmail(email);\n if(!match || match[0].length !== email.length) {\n inputField.input.classList.add('error');\n return;\n }\n\n toggleButtons(true);\n const d = putPreloader(btnContinue);\n\n this.managers.passwordManager.updateSettings({\n hint: this.hint,\n currentPassword: this.plainPassword,\n newPassword: this.newPassword,\n email\n }).then((value) => {\n goNext();\n }, (err) => {\n if(err.type.includes('EMAIL_UNCONFIRMED')) {\n const symbols = +err.type.match(/^EMAIL_UNCONFIRMED_(\\d+)/)[1];\n\n const tab = this.slider.createTab(AppTwoStepVerificationEmailConfirmationTab);\n tab.state = this.state;\n tab.email = email;\n tab.length = symbols;\n tab.open();\n } else {\n console.log('password set error', err);\n }\n\n toggleButtons(false);\n d.remove();\n });\n };\n attachClickEvent(btnContinue, onContinueClick);\n\n const toggleButtons = (freeze: boolean) => {\n if(freeze) {\n btnContinue.setAttribute('disabled', 'true');\n btnSkip.setAttribute('disabled', 'true');\n } else {\n btnContinue.removeAttribute('disabled');\n btnSkip.removeAttribute('disabled');\n }\n };\n\n attachClickEvent(btnSkip, (e) => {\n const popup = new PopupPeer('popup-skip-email', {\n buttons: [{\n langKey: 'Cancel',\n isCancel: true\n }, {\n langKey: 'YourEmailSkip',\n callback: () => {\n // inputContent.classList.add('sidebar-left-section-disabled');\n toggleButtons(true);\n putPreloader(btnSkip);\n this.managers.passwordManager.updateSettings({\n hint: this.hint,\n currentPassword: this.plainPassword,\n newPassword: this.newPassword,\n email: ''\n }).then(() => {\n goNext();\n }, (err) => {\n toggleButtons(false);\n });\n },\n isDanger: true\n }],\n titleLangKey: 'YourEmailSkipWarning',\n descriptionLangKey: 'YourEmailSkipWarningText'\n });\n\n popup.show();\n });\n\n inputWrapper.append(inputField.container, btnContinue, btnSkip);\n\n inputContent.append(inputWrapper);\n\n this.scrollable.container.append(section.container);\n }\n\n onOpenAfterTimeout() {\n if(!canFocus(this.isFirst)) return;\n this.inputField.input.focus();\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 {AccountPassword} from '../../../../layer';\nimport Button from '../../../button';\nimport {SliderSuperTab} from '../../../slider';\nimport InputField from '../../../inputField';\nimport AppTwoStepVerificationEmailTab from './email';\nimport {toast} from '../../../toast';\nimport I18n from '../../../../lib/langPack';\nimport cancelEvent from '../../../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\nimport SettingSection from '../../../settingSection';\n\nexport default class AppTwoStepVerificationHintTab extends SliderSuperTab {\n public inputField: InputField;\n public state: AccountPassword;\n public plainPassword: string;\n public newPassword: string;\n\n public init() {\n this.container.classList.add('two-step-verification', 'two-step-verification-hint');\n this.setTitle('TwoStepAuth.SetupHintTitle');\n\n const section = new SettingSection({\n noDelimiter: true\n });\n\n const emoji = '๐Ÿ’ก';\n const stickerContainer = document.createElement('div');\n wrapStickerEmoji({\n div: stickerContainer,\n width: 160,\n height: 160,\n emoji\n });\n\n section.content.append(stickerContainer);\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const inputField = this.inputField = new InputField({\n name: 'hint',\n label: 'TwoStepAuth.SetupHintPlaceholder'\n });\n\n inputField.input.addEventListener('keypress', (e) => {\n if(e.key === 'Enter') {\n cancelEvent(e);\n return inputField.value ? onContinueClick() : onSkipClick();\n }\n });\n\n const goNext = (e?: Event, saveHint?: boolean) => {\n if(e) {\n cancelEvent(e);\n }\n\n const hint = saveHint ? inputField.value : undefined;\n if(hint && this.newPassword === hint) {\n toast(I18n.format('PasswordAsHintError', true));\n return;\n }\n\n const tab = this.slider.createTab(AppTwoStepVerificationEmailTab);\n tab.state = this.state;\n tab.plainPassword = this.plainPassword;\n tab.newPassword = this.newPassword;\n tab.hint = hint;\n\n tab.open();\n };\n\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\n const btnSkip = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'YourEmailSkip'});\n\n const onContinueClick = (e?: Event) => goNext(e, true);\n const onSkipClick = (e?: Event) => goNext(e, false);\n attachClickEvent(btnContinue, onContinueClick);\n attachClickEvent(btnSkip, onSkipClick);\n\n inputWrapper.append(inputField.container, btnContinue, btnSkip);\n\n section.content.append(inputWrapper);\n\n this.scrollable.container.append(section.container);\n }\n\n onOpenAfterTimeout() {\n this.inputField.input.focus();\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 {AccountPassword} from '../../../../layer';\nimport Button from '../../../button';\nimport PasswordInputField from '../../../passwordInputField';\nimport {SliderSuperTab} from '../../../slider';\nimport TrackingMonkey from '../../../monkeys/tracking';\nimport AppTwoStepVerificationHintTab from './hint';\nimport {InputState} from '../../../inputField';\nimport cancelEvent from '../../../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\nimport SettingSection from '../../../settingSection';\n\nexport default class AppTwoStepVerificationReEnterPasswordTab extends SliderSuperTab {\n public state: AccountPassword;\n public passwordInputField: PasswordInputField;\n public plainPassword: string;\n public newPassword: string;\n\n public init() {\n this.container.classList.add('two-step-verification', 'two-step-verification-enter-password', 'two-step-verification-re-enter-password');\n this.setTitle('PleaseReEnterPassword');\n\n const section = new SettingSection({\n noDelimiter: true\n });\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const passwordInputField = this.passwordInputField = new PasswordInputField({\n name: 're-enter-password',\n label: 'PleaseReEnterPassword'\n });\n\n const monkey = new TrackingMonkey(passwordInputField, 157);\n\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\n\n inputWrapper.append(passwordInputField.container, btnContinue);\n section.content.append(monkey.container, inputWrapper);\n\n this.scrollable.container.append(section.container);\n\n passwordInputField.input.addEventListener('keypress', (e) => {\n if(passwordInputField.input.classList.contains('error')) {\n passwordInputField.setState(InputState.Neutral);\n }\n\n if(e.key === 'Enter') {\n return onContinueClick();\n }\n });\n\n const verifyInput = () => {\n if(this.newPassword !== passwordInputField.value) {\n passwordInputField.setError();\n return false;\n }\n\n return true;\n };\n\n const onContinueClick = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n if(!verifyInput()) return;\n\n const tab = this.slider.createTab(AppTwoStepVerificationHintTab);\n tab.state = this.state;\n tab.plainPassword = this.plainPassword;\n tab.newPassword = this.newPassword;\n tab.open();\n };\n attachClickEvent(btnContinue, onContinueClick);\n\n return monkey.load();\n }\n\n onOpenAfterTimeout() {\n this.passwordInputField.input.focus();\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 AppTwoStepVerificationTab from '.';\nimport cancelEvent from '../../../../helpers/dom/cancelEvent';\nimport {canFocus} from '../../../../helpers/dom/canFocus';\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\nimport replaceContent from '../../../../helpers/dom/replaceContent';\nimport setInnerHTML from '../../../../helpers/dom/setInnerHTML';\nimport {AccountPassword} from '../../../../layer';\nimport I18n, {i18n} from '../../../../lib/langPack';\nimport wrapEmojiText from '../../../../lib/richTextProcessor/wrapEmojiText';\nimport Button from '../../../button';\nimport {putPreloader} from '../../../putPreloader';\nimport PasswordMonkey from '../../../monkeys/password';\nimport PasswordInputField from '../../../passwordInputField';\nimport {SliderSuperTab} from '../../../slider';\nimport AppTwoStepVerificationReEnterPasswordTab from './reEnterPassword';\nimport SettingSection from '../../../settingSection';\n\nexport default class AppTwoStepVerificationEnterPasswordTab extends SliderSuperTab {\n public state: AccountPassword;\n public passwordInputField: PasswordInputField;\n public plainPassword: string;\n public isFirst = true;\n\n public init() {\n const isNew = !this.state.pFlags.has_password || this.plainPassword;\n this.container.classList.add('two-step-verification', 'two-step-verification-enter-password');\n this.setTitle(isNew ? 'PleaseEnterFirstPassword' : 'PleaseEnterCurrentPassword');\n\n const section = new SettingSection({\n noDelimiter: true\n });\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const passwordInputField = this.passwordInputField = new PasswordInputField({\n name: 'enter-password',\n label: isNew ? 'PleaseEnterFirstPassword' : (this.state.hint ? undefined : 'LoginPassword'),\n labelText: !isNew && this.state.hint ? wrapEmojiText(this.state.hint) : undefined\n });\n\n const monkey = new PasswordMonkey(passwordInputField, 157);\n\n const btnContinue = Button('btn-primary btn-color-primary');\n const textEl = new I18n.IntlElement({key: 'Continue'});\n\n btnContinue.append(textEl.element);\n\n inputWrapper.append(passwordInputField.container, btnContinue);\n section.content.append(monkey.container, inputWrapper);\n\n this.scrollable.container.append(section.container);\n\n passwordInputField.input.addEventListener('keypress', (e) => {\n if(passwordInputField.input.classList.contains('error')) {\n passwordInputField.input.classList.remove('error');\n textEl.key = 'Continue';\n textEl.update();\n }\n\n if(e.key === 'Enter') {\n return onContinueClick();\n }\n });\n\n const verifyInput = () => {\n if(!passwordInputField.value.length) {\n passwordInputField.input.classList.add('error');\n return false;\n }\n\n return true;\n };\n\n let onContinueClick: (e?: Event) => void;\n if(!isNew) {\n let getStateInterval: number;\n\n const getState = () => {\n // * just to check session relevance\n if(!getStateInterval) {\n getStateInterval = window.setInterval(getState, 10e3);\n }\n\n return this.managers.passwordManager.getState().then((_state) => {\n this.state = _state;\n\n if(this.state.hint) {\n setInnerHTML(passwordInputField.label, wrapEmojiText(this.state.hint));\n } else {\n replaceContent(passwordInputField.label, i18n('LoginPassword'));\n }\n });\n };\n\n const submit = (e?: Event) => {\n if(!verifyInput()) {\n cancelEvent(e);\n return;\n }\n\n btnContinue.setAttribute('disabled', 'true');\n textEl.key = 'PleaseWait';\n textEl.update();\n const preloader = putPreloader(btnContinue);\n\n const plainPassword = passwordInputField.value;\n this.managers.passwordManager.check(passwordInputField.value, this.state).then((auth) => {\n console.log(auth);\n\n if(auth._ === 'auth.authorization') {\n clearInterval(getStateInterval);\n if(monkey) monkey.remove();\n const tab = this.slider.createTab(AppTwoStepVerificationTab);\n tab.state = this.state;\n tab.plainPassword = plainPassword;\n tab.open();\n this.slider.removeTabFromHistory(this);\n }\n }, (err) => {\n btnContinue.removeAttribute('disabled');\n passwordInputField.input.classList.add('error');\n\n switch(err.type) {\n default:\n // btnContinue.innerText = err.type;\n textEl.key = 'PASSWORD_HASH_INVALID';\n textEl.update();\n preloader.remove();\n passwordInputField.select();\n break;\n }\n\n getState();\n });\n };\n\n onContinueClick = submit;\n\n getState();\n } else {\n onContinueClick = (e) => {\n if(e) {\n cancelEvent(e);\n }\n\n if(!verifyInput()) return;\n\n const tab = this.slider.createTab(AppTwoStepVerificationReEnterPasswordTab);\n tab.state = this.state;\n tab.newPassword = passwordInputField.value;\n tab.plainPassword = this.plainPassword;\n tab.open();\n };\n }\n\n attachClickEvent(btnContinue, onContinueClick);\n\n return monkey.load();\n }\n\n onOpenAfterTimeout() {\n if(!canFocus(this.isFirst)) return;\n this.passwordInputField.input.focus();\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 {AccountPassword} from '../../../../layer';\nimport {_i18n} from '../../../../lib/langPack';\nimport Button from '../../../button';\nimport PopupPeer from '../../../popups/peer';\nimport SettingSection from '../../../settingSection';\nimport {SliderSuperTab} from '../../../slider';\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\nimport AppSettingsTab from '../settings';\nimport AppTwoStepVerificationEmailTab from './email';\nimport AppTwoStepVerificationEnterPasswordTab from './enterPassword';\n\nexport default class AppTwoStepVerificationTab extends SliderSuperTab {\n public state: AccountPassword;\n public plainPassword: string;\n\n public init() {\n this.container.classList.add('two-step-verification', 'two-step-verification-main');\n this.setTitle('TwoStepVerificationTitle');\n\n const section = new SettingSection({\n captionOld: true,\n noDelimiter: true\n });\n\n const emoji = '๐Ÿ”';\n const stickerContainer = document.createElement('div');\n\n wrapStickerEmoji({\n div: stickerContainer,\n width: 168,\n height: 168,\n emoji\n });\n\n section.content.append(stickerContainer);\n\n const c = section.generateContentElement();\n if(this.state.pFlags.has_password) {\n _i18n(section.caption, 'TwoStepAuth.GenericHelp');\n\n const btnChangePassword = Button('btn-primary btn-transparent', {icon: 'edit', text: 'TwoStepAuth.ChangePassword'});\n const btnDisablePassword = Button('btn-primary btn-transparent', {icon: 'passwordoff', text: 'TwoStepAuth.RemovePassword'});\n const btnSetRecoveryEmail = Button('btn-primary btn-transparent', {icon: 'email', text: this.state.pFlags.has_recovery ? 'TwoStepAuth.ChangeEmail' : 'TwoStepAuth.SetupEmail'});\n\n attachClickEvent(btnChangePassword, () => {\n const tab = this.slider.createTab(AppTwoStepVerificationEnterPasswordTab);\n tab.state = this.state;\n tab.plainPassword = this.plainPassword;\n tab.open();\n });\n\n attachClickEvent(btnDisablePassword, () => {\n const popup = new PopupPeer('popup-disable-password', {\n buttons: [{\n langKey: 'Disable',\n callback: () => {\n this.managers.passwordManager.updateSettings({currentPassword: this.plainPassword}).then(() => {\n this.slider.sliceTabsUntilTab(AppSettingsTab, this);\n this.close();\n });\n },\n isDanger: true\n }],\n titleLangKey: 'TurnPasswordOffQuestionTitle',\n descriptionLangKey: 'TurnPasswordOffQuestion'\n });\n\n popup.show();\n });\n\n attachClickEvent(btnSetRecoveryEmail, () => {\n const tab = this.slider.createTab(AppTwoStepVerificationEmailTab);\n tab.state = this.state;\n tab.hint = this.state.hint;\n tab.plainPassword = this.plainPassword;\n tab.newPassword = this.plainPassword;\n tab.isFirst = true;\n tab.open();\n });\n\n c.append(btnChangePassword, btnDisablePassword, btnSetRecoveryEmail);\n } else {\n _i18n(section.caption, 'TwoStepAuth.SetPasswordHelp');\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const btnSetPassword = Button('btn-primary btn-color-primary', {text: 'TwoStepVerificationSetPassword'});\n\n inputWrapper.append(btnSetPassword);\n c.append(inputWrapper);\n\n attachClickEvent(btnSetPassword, (e) => {\n const tab = this.slider.createTab(AppTwoStepVerificationEnterPasswordTab);\n tab.state = this.state;\n tab.open();\n });\n }\n\n this.scrollable.container.append(section.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 {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {LangPackKey} from '../../../../lib/langPack';\n\nexport default class AppPrivacyLastSeenTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('privacy-tab', 'privacy-last-seen');\n this.setTitle('PrivacyLastSeen');\n\n const caption: LangPackKey = 'PrivacySettingsController.LastSeenDescription';\n new PrivacySection({\n tab: this,\n title: 'LastSeenTitle',\n inputKey: 'inputPrivacyKeyStatusTimestamp',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\n appendTo: this.scrollable,\n managers: this.managers\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 {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {LangPackKey} from '../../../../lib/langPack';\nimport PrivacyType from '../../../../lib/appManagers/utils/privacy/privacyType';\n\nexport default class AppPrivacyProfilePhotoTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('privacy-tab', 'privacy-profile-photo');\n this.setTitle('PrivacyProfilePhoto');\n\n const caption: LangPackKey = 'PrivacySettingsController.ProfilePhoto.CustomHelp';\n new PrivacySection({\n tab: this,\n title: 'PrivacyProfilePhotoTitle',\n inputKey: 'inputPrivacyKeyProfilePhoto',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\n appendTo: this.scrollable,\n skipTypes: [PrivacyType.Nobody],\n managers: this.managers\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 {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {LangPackKey} from '../../../../lib/langPack';\n\nexport default class AppPrivacyForwardMessagesTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('privacy-tab', 'privacy-forward-messages');\n this.setTitle('PrivacySettings.Forwards');\n\n const caption: LangPackKey = 'PrivacySettingsController.Forwards.CustomHelp';\n new PrivacySection({\n tab: this,\n title: 'PrivacyForwardsTitle',\n inputKey: 'inputPrivacyKeyForwards',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\n appendTo: this.scrollable,\n managers: this.managers\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 {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {LangPackKey} from '../../../../lib/langPack';\nimport PrivacyType from '../../../../lib/appManagers/utils/privacy/privacyType';\n\nexport default class AppPrivacyAddToGroupsTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('privacy-tab', 'privacy-add-to-groups');\n this.setTitle('PrivacySettings.Groups');\n\n const caption: LangPackKey = 'PrivacySettingsController.GroupDescription';\n new PrivacySection({\n tab: this,\n title: 'WhoCanAddMe',\n inputKey: 'inputPrivacyKeyChatInvite',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\n appendTo: this.scrollable,\n skipTypes: [PrivacyType.Nobody],\n managers: this.managers\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 {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {LangPackKey} from '../../../../lib/langPack';\n\nexport default class AppPrivacyCallsTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('privacy-tab', 'privacy-calls');\n this.setTitle('PrivacySettings.VoiceCalls');\n\n const caption: LangPackKey = 'PrivacySettingsController.PhoneCallDescription';\n new PrivacySection({\n tab: this,\n title: 'WhoCanCallMe',\n inputKey: 'inputPrivacyKeyPhoneCall',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\n appendTo: this.scrollable,\n managers: this.managers\n });\n\n {\n const caption: LangPackKey = 'PrivacySettingsController.P2p.Desc';\n new PrivacySection({\n tab: this,\n title: 'PrivacyP2PHeader',\n inputKey: 'inputPrivacyKeyPhoneP2P',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\n appendTo: this.scrollable,\n managers: this.managers\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 Button from '../../button';\nimport Row from '../../row';\nimport {Authorization} from '../../../layer';\nimport {formatDateAccordingToTodayNew} from '../../../helpers/date';\nimport {ButtonMenuSync} from '../../buttonMenu';\nimport {toast} from '../../toast';\nimport I18n from '../../../lib/langPack';\nimport PopupPeer from '../../popups/peer';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport findAndSplice from '../../../helpers/array/findAndSplice';\nimport {attachContextMenuListener} from '../../../helpers/dom/attachContextMenuListener';\nimport positionMenu from '../../../helpers/positionMenu';\nimport contextMenuController from '../../../helpers/contextMenuController';\nimport SettingSection from '../../settingSection';\n\nexport default class AppActiveSessionsTab extends SliderSuperTabEventable {\n public authorizations: Authorization.authorization[];\n private menuElement: HTMLElement;\n\n public init() {\n this.container.classList.add('active-sessions-container');\n this.setTitle('SessionsTitle');\n\n const Session = (auth: Authorization.authorization) => {\n const row = new Row({\n title: [auth.app_name, auth.app_version].join(' '),\n subtitle: [auth.ip, auth.country].join(' - '),\n clickable: true,\n titleRight: auth.pFlags.current ? undefined : formatDateAccordingToTodayNew(new Date(Math.max(auth.date_active, auth.date_created) * 1000))\n });\n\n row.container.dataset.hash = '' + auth.hash;\n\n row.midtitle.textContent = [auth.device_model, auth.system_version || auth.platform].filter(Boolean).join(', ');\n\n return row;\n };\n\n const authorizations = this.authorizations.slice();\n\n {\n const section = new SettingSection({\n name: 'CurrentSession',\n caption: 'ClearOtherSessionsHelp'\n });\n\n const auth = findAndSplice(authorizations, auth => auth.pFlags.current);\n const session = Session(auth);\n\n section.content.append(session.container);\n\n if(authorizations.length) {\n const btnTerminate = Button('btn-primary btn-transparent danger', {icon: 'stop', text: 'TerminateAllSessions'});\n attachClickEvent(btnTerminate, (e) => {\n new PopupPeer('revoke-session', {\n buttons: [{\n langKey: 'Terminate',\n isDanger: true,\n callback: () => {\n const toggle = toggleDisability([btnTerminate], true);\n this.managers.apiManager.invokeApi('auth.resetAuthorizations').then((value) => {\n // toggleDisability([btnTerminate], false);\n btnTerminate.remove();\n otherSection.container.remove();\n }, onError).finally(() => {\n toggle();\n });\n }\n }],\n titleLangKey: 'AreYouSureSessionsTitle',\n descriptionLangKey: 'AreYouSureSessions'\n }).show();\n }, {listenerSetter: this.listenerSetter});\n\n section.content.append(btnTerminate);\n }\n\n this.scrollable.append(section.container);\n }\n\n if(!authorizations.length) {\n return;\n }\n\n const otherSection = new SettingSection({\n name: 'OtherSessions',\n caption: 'SessionsListInfo'\n });\n\n authorizations.forEach((auth) => {\n otherSection.content.append(Session(auth).container);\n });\n\n this.scrollable.append(otherSection.container);\n\n const onError = (err: any) => {\n if(err.type === 'FRESH_RESET_AUTHORISATION_FORBIDDEN') {\n toast(I18n.format('RecentSessions.Error.FreshReset', true));\n }\n };\n\n let target: HTMLElement;\n const onTerminateClick = () => {\n const hash = target.dataset.hash;\n\n new PopupPeer('revoke-session', {\n buttons: [{\n langKey: 'Terminate',\n isDanger: true,\n callback: () => {\n this.managers.apiManager.invokeApi('account.resetAuthorization', {hash})\n .then((value) => {\n if(value) {\n target.remove();\n }\n }, onError);\n }\n }],\n titleLangKey: 'AreYouSureSessionTitle',\n descriptionLangKey: 'TerminateSessionText'\n }).show();\n };\n\n const element = this.menuElement = ButtonMenuSync({\n buttons: [{\n icon: 'stop',\n text: 'Terminate',\n onClick: onTerminateClick\n }]\n });\n element.id = 'active-sessions-contextmenu';\n element.classList.add('contextmenu');\n\n document.getElementById('page-chats').append(element);\n\n attachContextMenuListener({\n element: this.scrollable.container,\n callback: (e) => {\n target = findUpClassName(e.target, 'row');\n if(!target || target.dataset.hash === '0') {\n return;\n }\n\n if(e instanceof MouseEvent) e.preventDefault();\n // smth\n if(e instanceof MouseEvent) e.cancelBubble = true;\n\n positionMenu(e, element);\n contextMenuController.openBtnMenu(element);\n },\n listenerSetter: this.listenerSetter\n });\n\n attachClickEvent(this.scrollable.container, (e) => {\n target = findUpClassName(e.target, 'row');\n if(!target || target.dataset.hash === '0') {\n return;\n }\n\n onTerminateClick();\n }, {listenerSetter: this.listenerSetter});\n }\n\n onCloseAfterTimeout() {\n this.menuElement?.remove();\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 {SliderSuperTab} from '../../slider';\nimport {ButtonMenuSync} from '../../buttonMenu';\nimport appDialogsManager, {DIALOG_LIST_ELEMENT_TAG} from '../../../lib/appManagers/appDialogsManager';\nimport PopupPickUser from '../../popups/pickUser';\nimport rootScope from '../../../lib/rootScope';\nimport findUpTag from '../../../helpers/dom/findUpTag';\nimport ButtonCorner from '../../buttonCorner';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport formatUserPhone from '../../wrappers/formatUserPhone';\nimport getUserStatusString from '../../wrappers/getUserStatusString';\nimport {attachContextMenuListener} from '../../../helpers/dom/attachContextMenuListener';\nimport positionMenu from '../../../helpers/positionMenu';\nimport contextMenuController from '../../../helpers/contextMenuController';\nimport getPeerActiveUsernames from '../../../lib/appManagers/utils/peers/getPeerActiveUsernames';\nimport SettingSection from '../../settingSection';\n\nexport default class AppBlockedUsersTab extends SliderSuperTab {\n public peerIds: PeerId[];\n private menuElement: HTMLElement;\n\n public init() {\n this.container.classList.add('blocked-users-container');\n this.setTitle('BlockedUsers');\n\n const section = new SettingSection({\n caption: 'BlockedUsersInfo'\n });\n\n section.caption.parentElement.prepend(section.caption);\n\n this.scrollable.append(section.container);\n\n const btnAdd = ButtonCorner({icon: 'add', className: 'is-visible'});\n this.content.append(btnAdd);\n\n attachClickEvent(btnAdd, (e) => {\n new PopupPickUser({\n peerTypes: ['contacts'],\n placeholder: 'BlockModal.Search.Placeholder',\n onSelect: (peerId) => {\n // console.log('block', peerId);\n this.managers.appUsersManager.toggleBlock(peerId, true);\n }\n });\n }, {listenerSetter: this.listenerSetter});\n\n const list = appDialogsManager.createChatList();\n this.scrollable.container.classList.add('chatlist-container');\n section.content.append(list);\n\n const add = async(peerId: PeerId, append: boolean) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: list,\n rippleEnabled: true,\n avatarSize: 'abitbigger',\n append\n });\n\n const user = await this.managers.appUsersManager.getUser(peerId.toUserId());\n if(!user) {\n return;\n }\n\n const usernames = getPeerActiveUsernames(user);\n const username = usernames[0];\n if(user.pFlags.bot) {\n dom.lastMessageSpan.append('@' + username);\n } else {\n if(user.phone) dom.lastMessageSpan.innerHTML = formatUserPhone(user.phone);\n else dom.lastMessageSpan.append(username ? '@' + username : getUserStatusString(user));\n }\n\n // dom.titleSpan.innerHTML = 'Raaid El Syed';\n // dom.lastMessageSpan.innerHTML = '+1 234 567891';\n };\n\n for(const peerId of this.peerIds) {\n add(peerId, true);\n }\n\n let target: HTMLElement;\n const onUnblock = () => {\n const peerId = target.dataset.peerId.toPeerId();\n this.managers.appUsersManager.toggleBlock(peerId, false);\n };\n\n const element = this.menuElement = ButtonMenuSync({\n buttons: [{\n icon: 'lockoff',\n text: 'Unblock',\n onClick: onUnblock,\n options: {listenerSetter: this.listenerSetter}\n }]\n });\n element.id = 'blocked-users-contextmenu';\n element.classList.add('contextmenu');\n\n document.getElementById('page-chats').append(element);\n\n attachContextMenuListener({\n element: this.scrollable.container,\n callback: (e) => {\n target = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\n if(!target) {\n return;\n }\n\n if(e instanceof MouseEvent) e.preventDefault();\n // smth\n if(e instanceof MouseEvent) e.cancelBubble = true;\n\n positionMenu(e, element);\n contextMenuController.openBtnMenu(element);\n },\n listenerSetter: this.listenerSetter\n });\n\n this.listenerSetter.add(rootScope)('peer_block', (update) => {\n const {peerId, blocked} = update;\n const li = list.querySelector(`[data-peer-id=\"${peerId}\"]`);\n if(blocked) {\n if(!li) {\n add(peerId, false);\n }\n } else {\n if(li) {\n li.remove();\n }\n }\n });\n\n const LOAD_COUNT = 50;\n let loading = false;\n this.scrollable.onScrolledBottom = () => {\n if(loading) {\n return;\n }\n\n loading = true;\n this.managers.appUsersManager.getBlocked(list.childElementCount, LOAD_COUNT).then((res) => {\n for(const peerId of res.peerIds) {\n add(peerId, true);\n }\n\n if(res.peerIds.length < LOAD_COUNT || list.childElementCount === res.count) {\n this.scrollable.onScrolledBottom = null;\n }\n\n this.scrollable.checkForTriggers();\n }).finally(() => {\n loading = false;\n });\n };\n }\n\n onOpenAfterTimeout() {\n this.scrollable.onScroll();\n }\n\n onCloseAfterTimeout() {\n if(this.menuElement) {\n this.menuElement.remove();\n }\n\n return super.onCloseAfterTimeout();\n }\n}\n","export default function convertKeyToInputKey(key: string) {\n key = key[0].toUpperCase() + key.slice(1);\n key = 'input' + key;\n return key;\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 {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {LangPackKey} from '../../../../lib/langPack';\n\nexport default class AppPrivacyVoicesTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('privacy-tab', 'privacy-voices');\n this.setTitle('PrivacyVoiceMessages');\n\n const caption: LangPackKey = 'PrivacyVoiceMessagesInfo';\n new PrivacySection({\n tab: this,\n title: 'PrivacyVoiceMessagesTitle',\n inputKey: 'inputPrivacyKeyVoiceMessages',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\n appendTo: this.scrollable,\n managers: this.managers\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 {formatDateAccordingToTodayNew} from '../../../helpers/date';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport {WebAuthorization} from '../../../layer';\nimport AvatarElement from '../../avatar';\nimport Button from '../../button';\nimport confirmationPopup from '../../confirmationPopup';\nimport Row from '../../row';\nimport SettingSection from '../../settingSection';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport wrapPeerTitle from '../../wrappers/peerTitle';\n\nexport default class AppActiveWebSessionsTab extends SliderSuperTabEventable {\n public async init(sessions: WebAuthorization[]) {\n this.container.classList.add('active-sessions-container');\n this.setTitle('WebSessionsTitle');\n\n const Session = async(auth: WebAuthorization) => {\n const peerId = auth.bot_id.toPeerId();\n const row = new Row({\n title: await wrapPeerTitle({peerId}),\n subtitle: [auth.ip, auth.region].join(' - '),\n clickable: true,\n titleRight: formatDateAccordingToTodayNew(new Date(Math.max(auth.date_active, auth.date_created) * 1000))\n });\n\n const media = row.createMedia('big');\n const avatar = new AvatarElement();\n avatar.classList.add('avatar-48');\n await avatar.updateWithOptions({peerId});\n media.append(avatar);\n\n row.container.dataset.hash = '' + auth.hash;\n row.container.dataset.peerId = '' + peerId;\n\n row.midtitle.textContent = [auth.domain, auth.browser, auth.platform].filter(Boolean).join(', ');\n\n return row;\n };\n\n {\n const section = new SettingSection({\n caption: 'ClearOtherWebSessionsHelp'\n });\n\n const btnTerminate = Button('btn-primary btn-transparent danger', {icon: 'stop', text: 'TerminateAllWebSessions'});\n\n attachClickEvent(btnTerminate, async() => {\n await confirmationPopup({\n descriptionLangKey: 'AreYouSureWebSessions',\n button: {\n langKey: 'Disconnect',\n isDanger: true\n }\n });\n\n const toggle = toggleDisability([btnTerminate], true);\n this.managers.appSeamlessLoginManager.resetWebAuthorizations().then(() => {\n this.close();\n });\n }, {listenerSetter: this.listenerSetter});\n\n section.content.append(btnTerminate);\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({\n name: 'OtherWebSessions',\n caption: 'TerminateWebSessionInfo'\n });\n\n const rows = await Promise.all(sessions.map(Session));\n section.content.append(...rows.map((row) => row.container));\n\n let leftLength = rows.length;\n attachClickEvent(section.content, async(e) => {\n const row = findUpClassName(e.target, 'row');\n if(!row) {\n return;\n }\n\n await confirmationPopup({\n descriptionLangKey: 'TerminateWebSessionText',\n descriptionLangArgs: [await wrapPeerTitle({peerId: row.dataset.peerId.toPeerId()})],\n button: {\n langKey: 'Disconnect',\n isDanger: true\n }\n });\n\n const hash = row.dataset.hash;\n row.classList.add('is-disabled');\n this.managers.appSeamlessLoginManager.resetWebAuthorization(hash).then(() => {\n if(!--leftLength) {\n this.close();\n } else {\n row.remove();\n }\n });\n }, {listenerSetter: this.listenerSetter});\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 SliderSuperTab, {SliderSuperTabEventable} from '../../sliderTab';\nimport Row from '../../row';\nimport {AccountPassword, Authorization, InputPrivacyKey, Updates, WebAuthorization} from '../../../layer';\nimport AppPrivacyPhoneNumberTab from './privacy/phoneNumber';\nimport AppTwoStepVerificationTab from './2fa';\nimport AppTwoStepVerificationEnterPasswordTab from './2fa/enterPassword';\nimport AppTwoStepVerificationEmailConfirmationTab from './2fa/emailConfirmation';\nimport AppPrivacyLastSeenTab from './privacy/lastSeen';\nimport AppPrivacyProfilePhotoTab from './privacy/profilePhoto';\nimport AppPrivacyForwardMessagesTab from './privacy/forwardMessages';\nimport AppPrivacyAddToGroupsTab from './privacy/addToGroups';\nimport AppPrivacyCallsTab from './privacy/calls';\nimport AppActiveSessionsTab from './activeSessions';\nimport AppBlockedUsersTab from './blockedUsers';\nimport rootScope from '../../../lib/rootScope';\nimport {i18n, LangPackKey, _i18n} from '../../../lib/langPack';\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport CheckboxField from '../../checkboxField';\nimport PopupPeer from '../../popups/peer';\nimport Button from '../../button';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport convertKeyToInputKey from '../../../helpers/string/convertKeyToInputKey';\nimport getPrivacyRulesDetails from '../../../lib/appManagers/utils/privacy/getPrivacyRulesDetails';\nimport PrivacyType from '../../../lib/appManagers/utils/privacy/privacyType';\nimport confirmationPopup, {PopupConfirmationOptions} from '../../confirmationPopup';\nimport noop from '../../../helpers/noop';\nimport {toastNew} from '../../toast';\nimport AppPrivacyVoicesTab from './privacy/voices';\nimport SettingSection from '../../settingSection';\nimport AppActiveWebSessionsTab from './activeWebSessions';\n\nexport default class AppPrivacyAndSecurityTab extends SliderSuperTabEventable {\n private activeSessionsRow: Row;\n private authorizations: Authorization.authorization[];\n\n private websitesRow: Row;\n private websites: WebAuthorization[];\n\n public static getInitArgs(fromTab: SliderSuperTab) {\n return {\n appConfig: fromTab.managers.apiManager.getAppConfig(),\n globalPrivacy: fromTab.managers.appPrivacyManager.getGlobalPrivacySettings(),\n contentSettings: fromTab.managers.apiManager.invokeApi('account.getContentSettings'),\n webAuthorizations: fromTab.managers.appSeamlessLoginManager.getWebAuthorizations()\n };\n }\n\n public init(p: ReturnType) {\n this.container.classList.add('dont-u-dare-block-me');\n this.setTitle('PrivacySettings');\n\n const SUBTITLE: LangPackKey = 'Loading';\n const promises: Promise[] = [];\n\n {\n const section = new SettingSection({noDelimiter: true, caption: 'SessionsInfo'});\n\n let blockedPeerIds: PeerId[];\n const blockedUsersRow = new Row({\n icon: 'deleteuser',\n titleLangKey: 'BlockedUsers',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n const tab = this.slider.createTab(AppBlockedUsersTab);\n tab.peerIds = blockedPeerIds;\n tab.open();\n },\n listenerSetter: this.listenerSetter\n });\n blockedUsersRow.freezed = true;\n\n let passwordState: AccountPassword;\n const twoFactorRowOptions = {\n icon: 'lock',\n titleLangKey: 'TwoStepVerification' as LangPackKey,\n subtitleLangKey: SUBTITLE,\n clickable: (e: Event) => {\n let tab: AppTwoStepVerificationTab | AppTwoStepVerificationEnterPasswordTab | AppTwoStepVerificationEmailConfirmationTab;\n if(passwordState.pFlags.has_password) {\n tab = this.slider.createTab(AppTwoStepVerificationEnterPasswordTab);\n } else if(passwordState.email_unconfirmed_pattern) {\n tab = this.slider.createTab(AppTwoStepVerificationEmailConfirmationTab);\n tab.email = passwordState.email_unconfirmed_pattern;\n tab.length = 6;\n tab.isFirst = true;\n this.managers.passwordManager.resendPasswordEmail();\n } else {\n tab = this.slider.createTab(AppTwoStepVerificationTab);\n }\n\n tab.state = passwordState;\n tab.open();\n },\n listenerSetter: this.listenerSetter\n };\n\n const twoFactorRow = new Row(twoFactorRowOptions);\n twoFactorRow.freezed = true;\n\n const activeSessionsRow = this.activeSessionsRow = new Row({\n icon: 'activesessions',\n titleLangKey: 'SessionsTitle',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n const tab = this.slider.createTab(AppActiveSessionsTab);\n tab.authorizations = this.authorizations;\n tab.eventListener.addEventListener('destroy', () => {\n this.updateActiveSessions();\n }, {once: true});\n tab.open();\n },\n listenerSetter: this.listenerSetter\n });\n activeSessionsRow.freezed = true;\n\n const websitesRow = this.websitesRow = new Row({\n icon: 'mention',\n titleLangKey: 'OtherWebSessions',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n const tab = this.slider.createTab(AppActiveWebSessionsTab);\n tab.eventListener.addEventListener('destroy', () => {\n this.updateActiveWebsites();\n });\n tab.open(this.websites);\n },\n listenerSetter: this.listenerSetter\n });\n websitesRow.freezed = true;\n\n section.content.append(blockedUsersRow.container, twoFactorRow.container, activeSessionsRow.container, websitesRow.container);\n this.scrollable.append(section.container);\n\n const setBlockedCount = (count: number) => {\n if(count) {\n replaceContent(blockedUsersRow.subtitle, i18n('PrivacySettingsController.UserCount', [count]));\n } else {\n replaceContent(blockedUsersRow.subtitle, i18n('BlockedEmpty', [count]));\n }\n };\n\n this.listenerSetter.add(rootScope)('peer_block', () => {\n /* const {blocked, peerId} = update;\n if(!blocked) blockedPeerIds.findAndSplice((p) => p === peerId);\n else blockedPeerIds.unshift(peerId);\n blockedCount += blocked ? 1 : -1;\n setBlockedCount(blockedCount); */\n updateBlocked();\n });\n\n const updateBlocked = () => {\n this.managers.appUsersManager.getBlocked().then((res) => {\n blockedUsersRow.freezed = false;\n setBlockedCount(res.count);\n blockedPeerIds = res.peerIds;\n });\n };\n\n updateBlocked();\n\n this.managers.passwordManager.getState().then((state) => {\n passwordState = state;\n replaceContent(twoFactorRow.subtitle, i18n(state.pFlags.has_password ? 'PrivacyAndSecurity.Item.On' : 'PrivacyAndSecurity.Item.Off'));\n twoFactorRow.freezed = false;\n\n // console.log('password state', state);\n });\n\n this.updateActiveSessions();\n promises.push(this.updateActiveWebsites(p.webAuthorizations));\n }\n\n {\n const section = new SettingSection({name: 'PrivacyTitle', caption: 'GroupsAndChannelsHelp'});\n\n section.content.classList.add('privacy-navigation-container');\n\n const rowsByKeys: Partial<{\n [key in InputPrivacyKey['_']]: Row\n }> = {};\n\n const numberVisibilityRow = rowsByKeys['inputPrivacyKeyPhoneNumber'] = new Row({\n titleLangKey: 'PrivacyPhoneTitle',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n this.slider.createTab(AppPrivacyPhoneNumberTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const lastSeenTimeRow = rowsByKeys['inputPrivacyKeyStatusTimestamp'] = new Row({\n titleLangKey: 'LastSeenTitle',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n this.slider.createTab(AppPrivacyLastSeenTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const photoVisibilityRow = rowsByKeys['inputPrivacyKeyProfilePhoto'] = new Row({\n titleLangKey: 'PrivacyProfilePhotoTitle',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n this.slider.createTab(AppPrivacyProfilePhotoTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const callRow = rowsByKeys['inputPrivacyKeyPhoneCall'] = new Row({\n titleLangKey: 'WhoCanCallMe',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n this.slider.createTab(AppPrivacyCallsTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const linkAccountRow = rowsByKeys['inputPrivacyKeyForwards'] = new Row({\n titleLangKey: 'PrivacyForwardsTitle',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n this.slider.createTab(AppPrivacyForwardMessagesTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const groupChatsAddRow = rowsByKeys['inputPrivacyKeyChatInvite'] = new Row({\n titleLangKey: 'WhoCanAddMe',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n this.slider.createTab(AppPrivacyAddToGroupsTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const voicesRow = rowsByKeys['inputPrivacyKeyVoiceMessages'] = new Row({\n titleLangKey: 'PrivacyVoiceMessagesTitle',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n if(!rootScope.premium) {\n toastNew({langPackKey: 'PrivacyVoiceMessagesPremiumOnly'});\n } else {\n this.slider.createTab(AppPrivacyVoicesTab).open();\n }\n },\n listenerSetter: this.listenerSetter\n });\n\n const updatePrivacyRow = (key: InputPrivacyKey['_']) => {\n const row = rowsByKeys[key];\n if(!row) {\n return;\n }\n\n this.managers.appPrivacyManager.getPrivacy(key).then((rules) => {\n const details = getPrivacyRulesDetails(rules);\n const langKey = details.type === PrivacyType.Everybody ? 'PrivacySettingsController.Everbody' : (details.type === PrivacyType.Contacts ? 'PrivacySettingsController.MyContacts' : 'PrivacySettingsController.Nobody');\n const disallowLength = details.disallowPeers.users.length + details.disallowPeers.chats.length;\n const allowLength = details.allowPeers.users.length + details.allowPeers.chats.length;\n\n row.subtitle.innerHTML = '';\n const s = i18n(langKey);\n row.subtitle.append(s);\n if(disallowLength || allowLength) {\n row.subtitle.append(` (${[-disallowLength, allowLength ? '+' + allowLength : 0].filter(Boolean).join(', ')})`);\n }\n });\n };\n\n section.content.append(\n numberVisibilityRow.container,\n lastSeenTimeRow.container,\n photoVisibilityRow.container,\n callRow.container,\n linkAccountRow.container,\n groupChatsAddRow.container,\n voicesRow.container\n );\n this.scrollable.append(section.container);\n\n for(const key in rowsByKeys) {\n updatePrivacyRow(key as keyof typeof rowsByKeys);\n }\n\n rootScope.addEventListener('privacy_update', (update) => {\n updatePrivacyRow(convertKeyToInputKey(update.key._) as any);\n });\n }\n\n {\n const section = new SettingSection({name: 'NewChatsFromNonContacts', caption: 'ArchiveAndMuteInfo'});\n\n const checkboxField = new CheckboxField({text: 'ArchiveAndMute'});\n const row = new Row({\n checkboxField\n });\n\n section.content.append(row.container);\n\n let enabled: boolean, destroyed: boolean;\n this.eventListener.addEventListener('destroy', () => {\n destroyed = true;\n if(enabled === undefined || enabled === checkboxField.checked) return;\n return this.managers.appPrivacyManager.setGlobalPrivacySettings({\n _: 'globalPrivacySettings',\n archive_and_mute_new_noncontact_peers: checkboxField.checked\n });\n }, {once: true});\n\n const promise = Promise.all([\n p.appConfig,\n p.globalPrivacy\n ]).then(([appConfig, settings]) => {\n if(destroyed) {\n return;\n }\n\n const onPremiumToggle = (isPremium: boolean) => {\n section.container.classList.toggle('hide', !isPremium && !appConfig.autoarchive_setting_available);\n };\n\n this.listenerSetter.add(rootScope)('premium_toggle', onPremiumToggle);\n onPremiumToggle(rootScope.premium);\n\n enabled = !!settings.archive_and_mute_new_noncontact_peers;\n\n checkboxField.setValueSilently(enabled);\n });\n\n promises.push(promise);\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({name: 'Privacy.SensitiveContent', caption: 'PrivacyAndSecurity.SensitiveDesc'});\n section.container.classList.add('hide');\n\n const checkboxField = new CheckboxField({text: 'PrivacyAndSecurity.SensitiveText'});\n const row = new Row({\n checkboxField\n });\n\n section.content.append(row.container);\n\n let enabled: boolean;\n this.eventListener.addEventListener('destroy', () => {\n if(enabled === undefined) return;\n const _enabled = row.checkboxField.checked;\n const isChanged = _enabled !== enabled;\n if(!isChanged) {\n return;\n }\n\n return this.managers.apiManager.invokeApi('account.setContentSettings', {\n sensitive_enabled: _enabled\n });\n }, {once: true});\n\n const promise = p.contentSettings.then((settings) => {\n if(!settings.pFlags.sensitive_can_change) {\n return;\n }\n\n enabled = !!settings.pFlags.sensitive_enabled;\n checkboxField.setValueSilently(enabled);\n section.container.classList.remove('hide');\n });\n\n promises.push(promise);\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({name: 'PrivacyPayments', caption: 'PrivacyPaymentsClearInfo'});\n\n const onClearClick = () => {\n const options: PopupConfirmationOptions = {\n titleLangKey: 'PrivacyPaymentsClearAlertTitle',\n descriptionLangKey: 'PrivacyPaymentsClearAlertText',\n button: {\n langKey: 'Clear'\n },\n checkboxes: [{\n text: 'PrivacyClearShipping',\n checked: true\n }, {\n text: 'PrivacyClearPayment',\n checked: true\n }]\n };\n\n confirmationPopup(options).then(() => {\n const [info, payment] = options.checkboxes.map((c) => c.checkboxField.checked);\n const toggle = toggleDisability([clearButton], true);\n this.managers.appPaymentsManager.clearSavedInfo(info, payment).then(() => {\n if(!info && !payment) {\n return;\n }\n\n toggle();\n toastNew({\n langPackKey: info && payment ? 'PrivacyPaymentsPaymentShippingCleared' : (info ? 'PrivacyPaymentsShippingInfoCleared' : 'PrivacyPaymentsPaymentInfoCleared')\n });\n });\n }, noop);\n };\n\n const clearButton = Button('btn-primary btn-transparent', {icon: 'delete', text: 'PrivacyPaymentsClear'});\n this.listenerSetter.add(clearButton)('click', onClearClick);\n section.content.append(clearButton);\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({name: 'FilterChats'});\n\n const onDeleteClick = () => {\n const popup = new PopupPeer('popup-delete-drafts', {\n buttons: [{\n langKey: 'Delete',\n callback: () => {\n const toggle = toggleDisability([deleteButton], true);\n this.managers.appDraftsManager.clearAllDrafts().then(() => {\n toggle();\n });\n },\n isDanger: true\n }],\n titleLangKey: 'AreYouSureClearDraftsTitle',\n descriptionLangKey: 'AreYouSureClearDrafts'\n });\n\n popup.show();\n };\n\n const deleteButton = Button('btn-primary btn-transparent', {icon: 'delete', text: 'PrivacyDeleteCloudDrafts'});\n this.listenerSetter.add(deleteButton)('click', onDeleteClick);\n section.content.append(deleteButton);\n\n /* promises.push(apiManager.invokeApi('messages.getAllDrafts').then((drafts) => {\n const draftsRow = new Row({\n titleLangKey: 'PrivacyDeleteCloudDrafts',\n subtitleLangKey: 'Drafts',\n subtitleLangArgs: [(drafts as Updates.updates).updates.length],\n icon: 'delete',\n clickable: onDeleteClick\n });\n\n section.content.append(draftsRow.container);\n })); */\n\n this.scrollable.append(section.container);\n }\n\n // {\n // const section = new SettingSection({\n // name: 'OtherWebSessions'\n // });\n\n // const row = new Row({\n\n // });\n\n // this.scrollable.append(section.container);\n // }\n\n return Promise.all(promises);\n }\n\n public updateActiveSessions() {\n return this.managers.apiManager.invokeApi('account.getAuthorizations').then((auths) => {\n this.activeSessionsRow.freezed = false;\n this.authorizations = auths.authorizations;\n _i18n(this.activeSessionsRow.subtitle, 'Privacy.Devices', [this.authorizations.length]);\n });\n }\n\n public updateActiveWebsites(promise = this.managers.appSeamlessLoginManager.getWebAuthorizations()) {\n return promise.then((authorizations) => {\n this.websitesRow.freezed = false;\n this.websites = authorizations;\n _i18n(this.websitesRow.subtitle, 'Privacy.Websites', [this.websites.length]);\n this.websitesRow.container.classList.toggle('hide', !this.websites.length);\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 {AvailableReaction} from '../../../layer';\nimport RadioField from '../../radioField';\nimport Row, {RadioFormFromRows} from '../../row';\nimport SettingSection from '../../settingSection';\nimport SliderSuperTab from '../../sliderTab';\nimport wrapStickerToRow from '../../wrappers/stickerToRow';\n\nexport default class AppQuickReactionTab extends SliderSuperTab {\n public init() {\n this.setTitle('DoubleTapSetting');\n this.container.classList.add('quick-reaction-container');\n\n return Promise.all([\n this.managers.appReactionsManager.getQuickReaction(),\n this.managers.appReactionsManager.getAvailableReactions()\n ]).then(([quickReaction, availableReactions]) => {\n availableReactions = availableReactions.filter((reaction) => !reaction.pFlags.inactive);\n\n const section = new SettingSection();\n\n const name = 'quick-reaction';\n const rows = availableReactions.map((availableReaction) => {\n const radioField = new RadioField({\n name,\n text: availableReaction.title,\n value: availableReaction.reaction,\n alignRight: true\n });\n\n const row = new Row({\n radioField,\n havePadding: true\n });\n\n radioField.main.classList.add('quick-reaction-title');\n\n wrapStickerToRow({\n row,\n doc: availableReaction.static_icon,\n size: 'small'\n });\n\n if(availableReaction.reaction === (quickReaction as AvailableReaction).reaction) {\n radioField.setValueSilently(true);\n }\n\n return row;\n });\n\n const form = RadioFormFromRows(rows, (value) => {\n this.managers.appReactionsManager.setDefaultReaction({_: 'reactionEmoji', emoticon: value});\n });\n\n section.content.append(form);\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 RangeSelector from '../../rangeSelector';\nimport Button from '../../button';\nimport CheckboxField from '../../checkboxField';\nimport RadioField from '../../radioField';\nimport rootScope from '../../../lib/rootScope';\nimport {IS_APPLE, IS_SAFARI} from '../../../environment/userAgent';\nimport Row, {CreateRowFromCheckboxField} from '../../row';\nimport AppBackgroundTab from './background';\nimport {LangPackKey, _i18n} from '../../../lib/langPack';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport assumeType from '../../../helpers/assumeType';\nimport {BaseTheme, MessagesAllStickers, StickerSet} from '../../../layer';\nimport LazyLoadQueue from '../../lazyLoadQueue';\nimport PopupStickers from '../../popups/stickers';\nimport eachMinute from '../../../helpers/eachMinute';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport IS_GEOLOCATION_SUPPORTED from '../../../environment/geolocationSupport';\nimport AppQuickReactionTab from './quickReaction';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport {DEFAULT_THEME, State} from '../../../config/state';\nimport wrapStickerSetThumb from '../../wrappers/stickerSetThumb';\nimport wrapStickerToRow from '../../wrappers/stickerToRow';\nimport SettingSection, {generateSection} from '../../settingSection';\nimport {ScrollableX} from '../../scrollable';\nimport wrapStickerEmoji from '../../wrappers/stickerEmoji';\nimport {Theme} from '../../../layer';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport RLottiePlayer from '../../../lib/rlottie/rlottiePlayer';\nimport themeController from '../../../helpers/themeController';\n\nexport class RangeSettingSelector {\n public container: HTMLDivElement;\n public valueContainer: HTMLElement;\n private range: RangeSelector;\n\n public onChange: (value: number) => void;\n\n constructor(\n name: LangPackKey,\n step: number,\n initialValue: number,\n minValue: number,\n maxValue: number,\n writeValue = true\n ) {\n const BASE_CLASS = 'range-setting-selector';\n this.container = document.createElement('div');\n this.container.classList.add(BASE_CLASS);\n\n const details = document.createElement('div');\n details.classList.add(BASE_CLASS + '-details');\n\n const nameDiv = document.createElement('div');\n nameDiv.classList.add(BASE_CLASS + '-name');\n _i18n(nameDiv, name);\n\n const valueDiv = this.valueContainer = document.createElement('div');\n valueDiv.classList.add(BASE_CLASS + '-value');\n\n if(writeValue) {\n valueDiv.innerHTML = '' + initialValue;\n }\n\n details.append(nameDiv, valueDiv);\n\n this.range = new RangeSelector({\n step,\n min: minValue,\n max: maxValue\n }, initialValue);\n this.range.setListeners();\n this.range.setHandlers({\n onScrub: value => {\n if(this.onChange) {\n this.onChange(value);\n }\n\n if(writeValue) {\n // console.log('font size scrub:', value);\n valueDiv.innerText = '' + value;\n }\n }\n });\n\n this.container.append(details, this.range.container);\n }\n}\n\nexport default class AppGeneralSettingsTab extends SliderSuperTabEventable {\n public static getInitArgs() {\n return {\n themes: rootScope.managers.appThemesManager.getThemes(),\n allStickers: rootScope.managers.appStickersManager.getAllStickers(),\n quickReaction: rootScope.managers.appReactionsManager.getQuickReaction()\n };\n }\n\n public init(p: ReturnType) {\n this.container.classList.add('general-settings-container');\n this.setTitle('General');\n\n const section = generateSection.bind(null, this.scrollable);\n const promises: Promise[] = [];\n\n {\n const container = section('Settings');\n\n const range = new RangeSettingSelector('TextSize', 1, rootScope.settings.messagesTextSize, 12, 20);\n range.onChange = (value) => {\n rootScope.managers.appStateManager.setByKey('settings.messagesTextSize', value);\n };\n\n const chatBackgroundButton = Button('btn-primary btn-transparent', {icon: 'image', text: 'ChatBackground'});\n\n const initArgs = AppBackgroundTab.getInitArgs();\n attachClickEvent(chatBackgroundButton, () => {\n this.slider.createTab(AppBackgroundTab).open(initArgs);\n });\n\n const animationsCheckboxField = new CheckboxField({\n text: 'EnableAnimations',\n name: 'animations',\n stateKey: 'settings.animationsEnabled',\n listenerSetter: this.listenerSetter\n });\n\n container.append(\n range.container,\n chatBackgroundButton,\n CreateRowFromCheckboxField(animationsCheckboxField).container\n );\n }\n\n {\n const container = section('ColorTheme');\n\n const scrollable = new ScrollableX(null);\n const themesContainer = scrollable.container;\n themesContainer.classList.add('themes-container');\n\n type K = {\n container: HTMLElement,\n theme: Theme,\n player?: RLottiePlayer,\n wallPaperContainers?: {[key in BaseTheme['_']]?: HTMLElement}\n };\n const themesMap = new Map();\n let currentTheme = themeController.getTheme();\n let isNight = themeController.isNight();\n\n const applyThemeOnItem = (item: K) => {\n themeController.applyTheme(item.theme, item.container);\n\n const previous = item.container.querySelector('.background-item');\n previous?.remove();\n\n const wallPaperContainer = item.wallPaperContainers[isNight ? 'baseThemeNight' : 'baseThemeClassic']\n if(wallPaperContainer) {\n item.container.prepend(wallPaperContainer);\n }\n };\n\n let lastOnFrameNo: (frameNo: number) => void;\n\n attachClickEvent(themesContainer, async(e) => {\n const container = findUpClassName(e.target, 'theme-container');\n if(!container) {\n return;\n }\n\n const lastActive = themesContainer.querySelector('.active');\n if(lastActive) {\n lastActive.classList.remove('active');\n }\n\n const item = themesMap.get(container);\n container.classList.add('active');\n\n await themeController.applyNewTheme(item.theme);\n\n lastOnFrameNo?.(-1);\n\n if(item.player && rootScope.settings.animationsEnabled) {\n if(IS_SAFARI) {\n if(item.player.paused) {\n item.player.restart();\n }\n } else {\n if(item.player.paused) {\n item.player.stop(true);\n }\n\n item.player.el[0].style.transform = 'scale(2)';\n\n const onFrameNo = lastOnFrameNo = (frameNo) => {\n if(item.player.maxFrame === frameNo || frameNo === -1) {\n item.player.el[0].style.transform = '';\n item.player.removeEventListener('enterFrame', onFrameNo);\n\n if(lastOnFrameNo === onFrameNo) {\n lastOnFrameNo = undefined;\n }\n }\n };\n\n setTimeout(() => {\n if(lastOnFrameNo !== onFrameNo) {\n return;\n }\n\n item.player.play();\n item.player.addEventListener('enterFrame', onFrameNo);\n }, 250);\n }\n }\n }, {listenerSetter: this.listenerSetter});\n\n const availableBaseThemes: Set = new Set(['baseThemeClassic', 'baseThemeNight']);\n\n const promise = p.themes.then(async(themes) => {\n const defaultThemes = themes.filter((theme) => theme.pFlags.default/* && theme.settings[0].message_colors.length === 1 */);\n defaultThemes.unshift(DEFAULT_THEME);\n\n const promises = defaultThemes.map(async(theme) => {\n const container = document.createElement('div');\n const k: K = {\n container,\n theme,\n wallPaperContainers: {}\n };\n\n const results = theme.settings\n .filter((themeSettings) => availableBaseThemes.has(themeSettings.base_theme._))\n .map((themeSettings) => {\n const wallPaper = themeSettings.wallpaper;\n const result = AppBackgroundTab.addWallPaper(wallPaper);\n k.wallPaperContainers[themeSettings.base_theme._] = result.container;\n return result;\n });\n\n themesMap.set(container, k);\n\n applyThemeOnItem(k);\n\n if(theme.id === currentTheme.id) {\n container.classList.add('active');\n }\n\n const emoticon = theme.emoticon;\n const loadPromises: Promise[] = [];\n let emoticonContainer: HTMLElement;\n if(emoticon) {\n emoticonContainer = document.createElement('div');\n emoticonContainer.classList.add('theme-emoticon');\n const size = 28 * 1.75;\n wrapStickerEmoji({\n div: emoticonContainer,\n width: size,\n height: size,\n emoji: theme.emoticon,\n managers: this.managers,\n loadPromises,\n middleware: this.middlewareHelper.get(),\n play: false\n }).then(({render}) => render).then((player) => {\n k.player = player as RLottiePlayer;\n });\n }\n\n const bubble = document.createElement('div');\n bubble.classList.add('theme-bubble');\n\n const bubbleIn = bubble.cloneNode() as HTMLElement;\n\n bubbleIn.classList.add('is-in');\n bubble.classList.add('is-out');\n\n loadPromises.push(...results.map((result) => result.loadPromise));\n\n container.classList.add('theme-container');\n\n await Promise.all(loadPromises);\n\n if(emoticonContainer) {\n container.append(emoticonContainer);\n }\n\n container.append(bubbleIn, bubble);\n\n return container;\n });\n\n const containers = await Promise.all(promises);\n\n scrollable.append(...containers);\n });\n\n promises.push(promise);\n\n const form = document.createElement('form');\n form.style.marginTop = '.5rem';\n\n const name = 'theme';\n const stateKey = 'settings.theme';\n\n const dayRow = new Row({\n radioField: new RadioField({\n langKey: 'ThemeDay',\n name,\n value: 'day',\n stateKey\n })\n });\n\n const nightRow = new Row({\n radioField: new RadioField({\n langKey: 'ThemeNight',\n name,\n value: 'night',\n stateKey\n })\n });\n\n const systemRow = new Row({\n radioField: new RadioField({\n langKey: 'AutoNightSystemDefault',\n name,\n value: 'system',\n stateKey\n })\n });\n\n this.listenerSetter.add(rootScope)('settings_updated', ({key, value, settings}) => {\n if(key === stateKey) {\n rootScope.dispatchEvent('theme_change');\n }\n });\n\n this.listenerSetter.add(rootScope)('theme_change', () => {\n currentTheme = themeController.getTheme();\n const newIsNight = themeController.isNight();\n if(isNight === newIsNight) {\n return;\n }\n\n isNight = newIsNight;\n\n const lastActive = themesContainer.querySelector('.active');\n if(lastActive) {\n lastActive.classList.remove('active');\n }\n\n let active: HTMLElement;\n themesMap.forEach((item) => {\n applyThemeOnItem(item);\n\n if(item.theme.id === currentTheme.id) {\n item.container.classList.add('active');\n active = item.container;\n }\n });\n\n if(active) {\n scrollable.scrollIntoViewNew({\n element: active,\n position: 'center',\n axis: 'x'\n });\n }\n });\n\n form.append(dayRow.container, nightRow.container, systemRow.container);\n\n container.append(\n themesContainer,\n form\n );\n }\n\n {\n const container = section('General.Keyboard');\n\n const form = document.createElement('form');\n\n const name = 'send-shortcut';\n const stateKey = 'settings.sendShortcut';\n\n const enterRow = new Row({\n radioField: new RadioField({\n langKey: 'General.SendShortcut.Enter',\n name,\n value: 'enter',\n stateKey\n }),\n subtitleLangKey: 'General.SendShortcut.NewLine.ShiftEnter'\n });\n\n const ctrlEnterRow = new Row({\n radioField: new RadioField({\n name,\n value: 'ctrlEnter',\n stateKey\n }),\n subtitleLangKey: 'General.SendShortcut.NewLine.Enter'\n });\n _i18n(ctrlEnterRow.radioField.main, 'General.SendShortcut.CtrlEnter', [IS_APPLE ? 'โŒ˜' : 'Ctrl']);\n\n form.append(enterRow.container, ctrlEnterRow.container);\n container.append(form);\n }\n\n if(IS_GEOLOCATION_SUPPORTED) {\n const container = section('DistanceUnitsTitle');\n\n const form = document.createElement('form');\n\n const name = 'distance-unit';\n const stateKey = 'settings.distanceUnit';\n\n const kilometersRow = new Row({\n radioField: new RadioField({\n langKey: 'DistanceUnitsKilometers',\n name,\n value: 'kilometers',\n stateKey\n })\n });\n\n const milesRow = new Row({\n radioField: new RadioField({\n langKey: 'DistanceUnitsMiles',\n name,\n value: 'miles',\n stateKey\n })\n });\n\n form.append(kilometersRow.container, milesRow.container);\n container.append(form);\n }\n\n {\n const container = section('General.TimeFormat');\n\n const form = document.createElement('form');\n\n const name = 'time-format';\n const stateKey = 'settings.timeFormat';\n\n const formats: [State['settings']['timeFormat'], LangPackKey][] = [\n ['h12', 'General.TimeFormat.h12'],\n ['h23', 'General.TimeFormat.h23']\n ];\n\n const rows = formats.map(([format, langPackKey]) => {\n const row = new Row({\n radioField: new RadioField({\n langKey: langPackKey,\n name,\n value: format,\n stateKey\n })\n });\n\n return row;\n });\n\n const cancel = eachMinute(() => {\n const date = new Date();\n\n formats.forEach(([format], idx) => {\n const str = date.toLocaleTimeString('en-us-u-hc-' + format, {\n hour: '2-digit',\n minute: '2-digit'\n });\n\n rows[idx].subtitle.textContent = str;\n });\n });\n\n this.eventListener.addEventListener('destroy', cancel);\n\n form.append(...rows.map((row) => row.container));\n container.append(form);\n }\n\n {\n const container = section('Emoji');\n\n const suggestCheckboxField = new CheckboxField({\n text: 'GeneralSettings.EmojiPrediction',\n name: 'suggest-emoji',\n stateKey: 'settings.emoji.suggest',\n listenerSetter: this.listenerSetter\n });\n const bigCheckboxField = new CheckboxField({\n text: 'GeneralSettings.BigEmoji',\n name: 'emoji-big',\n stateKey: 'settings.emoji.big',\n listenerSetter: this.listenerSetter\n });\n\n container.append(\n CreateRowFromCheckboxField(suggestCheckboxField).container,\n CreateRowFromCheckboxField(bigCheckboxField).container\n );\n }\n\n {\n const section = new SettingSection({name: 'Telegram.InstalledStickerPacksController', caption: 'StickersBotInfo'});\n\n const reactionsRow = new Row({\n titleLangKey: 'DoubleTapSetting',\n havePadding: true,\n clickable: () => {\n this.slider.createTab(AppQuickReactionTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const renderQuickReaction = () => {\n p.quickReaction.then((reaction) => {\n if(reaction._ === 'availableReaction') {\n return reaction.static_icon;\n } else {\n return this.managers.appEmojiManager.getCustomEmojiDocument(reaction.document_id);\n }\n }).then((doc) => {\n wrapStickerToRow({\n row: reactionsRow,\n doc,\n size: 'small'\n });\n });\n };\n\n renderQuickReaction();\n\n this.listenerSetter.add(rootScope)('quick_reaction', renderQuickReaction);\n\n const suggestCheckboxField = new CheckboxField({\n text: 'Stickers.SuggestStickers',\n name: 'suggest',\n stateKey: 'settings.stickers.suggest',\n listenerSetter: this.listenerSetter\n });\n const loopCheckboxField = new CheckboxField({\n text: 'InstalledStickers.LoopAnimated',\n name: 'loop',\n stateKey: 'settings.stickers.loop',\n listenerSetter: this.listenerSetter\n });\n\n const stickerSets: {[id: string]: Row} = {};\n\n const stickersContent = section.generateContentElement();\n\n const lazyLoadQueue = new LazyLoadQueue();\n const renderStickerSet = (stickerSet: StickerSet.stickerSet, method: 'append' | 'prepend' = 'append') => {\n const row = new Row({\n title: wrapEmojiText(stickerSet.title),\n subtitleLangKey: 'Stickers',\n subtitleLangArgs: [stickerSet.count],\n havePadding: true,\n clickable: () => {\n new PopupStickers({id: stickerSet.id, access_hash: stickerSet.access_hash}).show();\n },\n listenerSetter: this.listenerSetter\n });\n\n stickerSets[stickerSet.id] = row;\n\n const div = document.createElement('div');\n div.classList.add('row-media');\n\n wrapStickerSetThumb({\n set: stickerSet,\n container: div,\n group: 'GENERAL-SETTINGS',\n lazyLoadQueue,\n width: 36,\n height: 36,\n autoplay: true,\n middleware: this.middlewareHelper.get()\n });\n\n row.container.append(div);\n\n stickersContent[method](row.container);\n };\n\n const promise = p.allStickers.then((allStickers) => {\n assumeType(allStickers);\n const promises = allStickers.sets.map((stickerSet) => renderStickerSet(stickerSet));\n return Promise.all(promises);\n });\n\n promises.push(promise);\n\n this.listenerSetter.add(rootScope)('stickers_installed', (set) => {\n if(!stickerSets[set.id]) {\n renderStickerSet(set, 'prepend');\n }\n });\n\n this.listenerSetter.add(rootScope)('stickers_deleted', (set) => {\n if(stickerSets[set.id]) {\n stickerSets[set.id].container.remove();\n delete stickerSets[set.id];\n }\n });\n\n section.content.append(\n reactionsRow.container,\n CreateRowFromCheckboxField(suggestCheckboxField).container,\n CreateRowFromCheckboxField(loopCheckboxField).container\n );\n this.scrollable.append(section.container);\n }\n\n return Promise.all(promises);\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 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","/*\n * 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 {MyDialogFilter} from '../../../lib/storages/filters';\nimport type {DialogFilterSuggested} from '../../../layer';\nimport type _rootScope from '../../../lib/rootScope';\nimport {SliderSuperTab} from '../../slider';\nimport lottieLoader, {LottieLoader} from '../../../lib/rlottie/lottieLoader';\nimport Button from '../../button';\nimport rootScope from '../../../lib/rootScope';\nimport AppEditFolderTab from './editFolder';\nimport Row from '../../row';\nimport {i18n, i18n_, LangPackKey, join} from '../../../lib/langPack';\nimport cancelEvent from '../../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport positionElementByIndex from '../../../helpers/dom/positionElementByIndex';\nimport RLottiePlayer from '../../../lib/rlottie/rlottiePlayer';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport {FOLDER_ID_ALL, FOLDER_ID_ARCHIVE, REAL_FOLDERS} from '../../../lib/mtproto/mtproto_config';\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport SettingSection from '../../settingSection';\nimport Sortable from '../../../helpers/dom/sortable';\nimport whichChild from '../../../helpers/dom/whichChild';\nimport indexOfAndSplice from '../../../helpers/array/indexOfAndSplice';\nimport showLimitPopup from '../../popups/limit';\n\nexport default class AppChatFoldersTab extends SliderSuperTab {\n private createFolderBtn: HTMLElement;\n private foldersSection: SettingSection;\n private suggestedSection: SettingSection;\n private stickerContainer: HTMLElement;\n private animation: RLottiePlayer;\n private list: HTMLElement;\n\n private filtersRendered: {[filterId: number]: Row} = {};\n private loadAnimationPromise: ReturnType;\n\n public static getInitArgs() {\n return {\n animationData: lottieLoader.loadAnimationFromURLManually('Folders_1'),\n filters: rootScope.managers.filtersStorage.getDialogFilters()\n };\n }\n\n private async renderFolder(\n dialogFilter: DialogFilterSuggested | MyDialogFilter,\n container?: HTMLElement,\n row?: Row,\n append?: boolean\n ) {\n let filter: MyDialogFilter;\n let description = '';\n const d: HTMLElement[] = [];\n if(dialogFilter._ === 'dialogFilterSuggested') {\n filter = dialogFilter.filter as MyDialogFilter;\n description = dialogFilter.description;\n } else {\n filter = dialogFilter;\n\n const enabledFilters = Object.keys(filter.pFlags).length;\n /* (['include_peers', 'exclude_peers'] as ['include_peers', 'exclude_peers']).forEach((key) => {\n enabledFilters += +!!filter[key].length;\n }); */\n\n if(enabledFilters === 1) {\n const pFlags = filter.pFlags;\n let k: LangPackKey;\n if(pFlags.contacts) k = 'FilterAllContacts';\n else if(pFlags.non_contacts) k = 'FilterAllNonContacts';\n else if(pFlags.groups) k = 'FilterAllGroups';\n else if(pFlags.broadcasts) k = 'FilterAllChannels';\n else if(pFlags.bots) k = 'FilterAllBots';\n\n if(k) {\n d.push(i18n(k));\n }\n }\n\n if(!d.length) {\n const folder = await this.managers.dialogsStorage.getFolderDialogs(filter.id);\n let chats = 0, channels = 0, groups = 0;\n await Promise.all(folder.map(async(dialog) => {\n if(await this.managers.appPeersManager.isAnyGroup(dialog.peerId)) groups++;\n else if(await this.managers.appPeersManager.isBroadcast(dialog.peerId)) channels++;\n else chats++;\n }));\n\n if(chats) d.push(i18n('Chats', [chats]));\n if(channels) d.push(i18n('Channels', [channels]));\n if(groups) d.push(i18n('Groups', [groups]));\n }\n }\n\n if(!row) {\n row = new Row({\n title: filter.id === FOLDER_ID_ALL ? i18n('FilterAllChats') : wrapEmojiText(filter.title),\n subtitle: description,\n clickable: true,\n buttonRightLangKey: dialogFilter._ === 'dialogFilterSuggested' ? 'Add' : undefined\n });\n\n if(d.length) {\n row.subtitle.append(...join(d));\n }\n\n if(dialogFilter._ === 'dialogFilter') {\n const filterId = filter.id;\n if(!this.filtersRendered[filter.id] && filter.id !== FOLDER_ID_ALL) {\n const initArgs = AppEditFolderTab.getInitArgs();\n attachClickEvent(row.container, async() => {\n const filter = await this.managers.filtersStorage.getFilter(filterId);\n const tab = this.slider.createTab(AppEditFolderTab);\n tab.setInitFilter(filter);\n tab.open(initArgs);\n }, {listenerSetter: this.listenerSetter});\n }\n\n this.filtersRendered[filter.id] = row;\n\n row.makeSortable();\n }\n } else {\n if(filter.id !== FOLDER_ID_ALL) {\n replaceContent(row.title, wrapEmojiText(filter.title));\n }\n\n row.subtitle.textContent = '';\n row.subtitle.append(...join(d));\n }\n\n const div = row.container;\n\n if(append) {\n const localId = (filter as MyDialogFilter).localId;\n if(localId !== undefined) {\n // ! header will be at 0 index\n positionElementByIndex(div, div.parentElement || container, localId);\n } else if(container) {\n container.append(div);\n }\n }\n\n return row;\n }\n\n public init(p: ReturnType = AppChatFoldersTab.getInitArgs()) {\n this.container.classList.add('chat-folders-container');\n this.setTitle('ChatList.Filter.List.Title');\n\n this.scrollable.container.classList.add('chat-folders');\n\n this.stickerContainer = document.createElement('div');\n this.stickerContainer.classList.add('sticker-container');\n\n const caption = document.createElement('div');\n caption.classList.add('caption');\n i18n_({element: caption, key: 'ChatList.Filter.Header'});\n\n this.createFolderBtn = Button('btn-primary btn-color-primary btn-control tgico', {\n text: 'ChatList.Filter.NewTitle',\n icon: 'add'\n });\n\n this.foldersSection = new SettingSection({\n name: 'Filters'\n });\n this.foldersSection.container.classList.add('hide');\n\n this.list = document.createElement('div');\n this.foldersSection.content.append(this.list);\n\n this.suggestedSection = new SettingSection({\n name: 'FilterRecommended'\n });\n this.suggestedSection.container.classList.add('hide');\n\n this.scrollable.append(\n this.stickerContainer,\n caption,\n this.createFolderBtn,\n this.foldersSection.container,\n this.suggestedSection.container\n );\n\n attachClickEvent(this.createFolderBtn, async() => {\n if(!(await this.canCreateFolder())) {\n showLimitPopup('folders');\n } else {\n this.slider.createTab(AppEditFolderTab).open();\n }\n }, {listenerSetter: this.listenerSetter});\n\n const onFiltersContainerUpdate = () => {\n this.foldersSection.container.classList.toggle('hide', !Object.keys(this.filtersRendered).length);\n };\n\n const loadPromises: Promise[] = [];\n const renderFiltersPromise = p.filters.then(async(filters) => {\n for(const filter of filters) {\n if(filter.id === FOLDER_ID_ARCHIVE) {\n continue;\n }\n\n await this.renderFolder(filter, this.list, undefined, true);\n }\n\n this.toggleAllChats();\n\n onFiltersContainerUpdate();\n });\n\n loadPromises.push(renderFiltersPromise);\n\n this.listenerSetter.add(rootScope)('filter_update', async(filter) => {\n const filterRendered = this.filtersRendered[filter.id];\n if(filterRendered) {\n await this.renderFolder(filter, null, filterRendered);\n } else if(filter.id !== FOLDER_ID_ARCHIVE) {\n await this.renderFolder(filter, this.list, undefined, true);\n }\n\n onFiltersContainerUpdate();\n\n this.getSuggestedFilters();\n });\n\n this.listenerSetter.add(rootScope)('filter_delete', (filter) => {\n const filterRendered = this.filtersRendered[filter.id];\n if(filterRendered) {\n /* for(const suggested of this.suggestedFilters) {\n if(deepEqual(suggested.filter, filter)) {\n\n }\n } */\n this.getSuggestedFilters();\n\n filterRendered.container.remove();\n delete this.filtersRendered[filter.id];\n }\n\n onFiltersContainerUpdate();\n });\n\n this.listenerSetter.add(rootScope)('filter_order', (order) => {\n order.filter((filterId) => !!this.filtersRendered[filterId]).forEach((filterId, idx) => {\n const filterRendered = this.filtersRendered[filterId];\n const container = filterRendered.container;\n positionElementByIndex(container, container.parentElement, idx + 1); // ! + 1 due to header\n });\n });\n\n this.listenerSetter.add(rootScope)('premium_toggle', () => {\n this.toggleAllChats();\n });\n\n this.loadAnimationPromise = p.animationData.then(async(cb) => {\n const player = await cb({\n container: this.stickerContainer,\n loop: false,\n autoplay: false,\n width: 86,\n height: 86\n });\n\n this.animation = player;\n\n return lottieLoader.waitForFirstFrame(player);\n });\n\n loadPromises.push(this.loadAnimationPromise);\n\n new Sortable({\n list: this.list,\n middleware: this.middlewareHelper.get(),\n onSort: (prevIdx, newIdx) => {\n let order: number[] = [];\n for(const filterId in this.filtersRendered) {\n const row = this.filtersRendered[filterId];\n const idx = whichChild(row.container);\n order[idx] = +filterId;\n }\n\n order = order.filter((filterId) => filterId !== undefined);\n if(!rootScope.premium) {\n indexOfAndSplice(order, FOLDER_ID_ALL);\n // order.unshift(FOLDER_ID_ALL);\n }\n\n this.managers.filtersStorage.updateDialogFiltersOrder(order);\n },\n scrollable: this.scrollable\n });\n\n this.getSuggestedFilters();\n\n /* return Promise.all([\n this.loadAnimationPromise\n ]); */\n return Promise.all(loadPromises);\n }\n\n onOpenAfterTimeout() {\n this.loadAnimationPromise.then(() => {\n this.animation.autoplay = true;\n this.animation.play();\n });\n\n return super.onOpenAfterTimeout();\n }\n\n private toggleAllChats() {\n const filterRendered = this.filtersRendered[FOLDER_ID_ALL];\n filterRendered.container.classList.toggle('hide', !rootScope.premium);\n }\n\n private async canCreateFolder() {\n const [limit, filters] = await Promise.all([\n this.managers.apiManager.getLimit('folders'),\n this.managers.filtersStorage.getDialogFilters()\n ]);\n\n const filtersLength = filters.filter((filter) => !REAL_FOLDERS.has(filter.id)).length;\n return filtersLength < limit;\n }\n\n private getSuggestedFilters() {\n return this.managers.filtersStorage.getSuggestedDialogsFilters().then(async(suggestedFilters) => {\n this.suggestedSection.container.classList.toggle('hide', !suggestedFilters.length);\n Array.from(this.suggestedSection.content.children).slice(1).forEach((el) => el.remove());\n\n for(const filter of suggestedFilters) {\n const row = await this.renderFolder(filter);\n this.suggestedSection.content.append(row.container);\n\n const button = row.buttonRight;\n attachClickEvent(button, async(e) => {\n cancelEvent(e);\n\n if(!(await this.canCreateFolder())) {\n showLimitPopup('folders');\n return;\n }\n\n button.setAttribute('disabled', 'true');\n\n const f = filter.filter as MyDialogFilter;\n f.includePeerIds = [];\n f.excludePeerIds = [];\n f.pinnedPeerIds = [];\n\n this.managers.filtersStorage.createDialogFilter(f, true).then(() => {\n row.container.remove();\n this.suggestedSection.container.classList.toggle('hide', this.suggestedSection.content.childElementCount === 1);\n }).finally(() => {\n button.removeAttribute('disabled');\n });\n }, {listenerSetter: this.listenerSetter});\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 Row from '../../row';\nimport CheckboxField from '../../checkboxField';\nimport {InputNotifyPeer, InputPeerNotifySettings, Update} from '../../../layer';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport rootScope from '../../../lib/rootScope';\nimport {LangPackKey} from '../../../lib/langPack';\nimport copy from '../../../helpers/object/copy';\nimport convertKeyToInputKey from '../../../helpers/string/convertKeyToInputKey';\nimport {MUTE_UNTIL} from '../../../lib/mtproto/mtproto_config';\nimport apiManagerProxy from '../../../lib/mtproto/mtprotoworker';\nimport SettingSection from '../../settingSection';\n\ntype InputNotifyKey = Exclude;\n\nexport default class AppNotificationsTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('notifications-container');\n this.setTitle('Telegram.NotificationSettingsViewController');\n\n const NotifySection = (options: {\n name: LangPackKey,\n typeText: LangPackKey,\n inputKey: InputNotifyKey,\n }) => {\n const section = new SettingSection({\n name: options.name\n });\n\n const enabledRow = new Row({\n checkboxField: new CheckboxField({text: options.typeText, checked: true}),\n subtitleLangKey: 'Loading',\n listenerSetter: this.listenerSetter,\n withCheckboxSubtitle: true\n });\n\n const previewEnabledRow = new Row({\n checkboxField: new CheckboxField({text: 'MessagePreview', checked: true}),\n subtitleLangKey: 'Loading',\n listenerSetter: this.listenerSetter,\n withCheckboxSubtitle: true\n });\n\n section.content.append(enabledRow.container, previewEnabledRow.container);\n\n this.scrollable.append(section.container);\n\n const inputNotifyPeer = {_: options.inputKey};\n const ret = this.managers.appNotificationsManager.getNotifySettings(inputNotifyPeer);\n (ret instanceof Promise ? ret : Promise.resolve(ret)).then((notifySettings) => {\n const applySettings = async() => {\n const muted = await this.managers.appNotificationsManager.isMuted(notifySettings);\n enabledRow.checkboxField.checked = !muted;\n previewEnabledRow.checkboxField.checked = notifySettings.show_previews;\n\n return muted;\n };\n\n applySettings();\n\n this.eventListener.addEventListener('destroy', async() => {\n const mute = !enabledRow.checkboxField.checked;\n const showPreviews = previewEnabledRow.checkboxField.checked;\n\n if(mute === (await this.managers.appNotificationsManager.isMuted(notifySettings)) && showPreviews === notifySettings.show_previews) {\n return;\n }\n\n const inputSettings: InputPeerNotifySettings = copy(notifySettings) as any;\n inputSettings._ = 'inputPeerNotifySettings';\n inputSettings.mute_until = mute ? MUTE_UNTIL : 0;\n inputSettings.show_previews = showPreviews;\n delete inputSettings.flags;\n\n this.managers.appNotificationsManager.updateNotifySettings(inputNotifyPeer, inputSettings);\n }, {once: true});\n\n this.listenerSetter.add(rootScope)('notify_settings', (update: Update.updateNotifySettings) => {\n const inputKey = convertKeyToInputKey(update.peer._) as any;\n if(options.inputKey === inputKey) {\n notifySettings = update.notify_settings;\n applySettings();\n }\n });\n });\n };\n\n NotifySection({\n name: 'NotificationsPrivateChats',\n typeText: 'NotificationsForPrivateChats',\n inputKey: 'inputNotifyUsers'\n });\n\n NotifySection({\n name: 'NotificationsGroups',\n typeText: 'NotificationsForGroups',\n inputKey: 'inputNotifyChats'\n });\n\n NotifySection({\n name: 'NotificationsChannels',\n typeText: 'NotificationsForChannels',\n inputKey: 'inputNotifyBroadcasts'\n });\n\n {\n const section = new SettingSection({\n name: 'NotificationsOther'\n });\n\n const contactsSignUpRow = new Row({\n checkboxField: new CheckboxField({text: 'ContactJoined', checked: true}),\n subtitleLangKey: 'Loading',\n listenerSetter: this.listenerSetter,\n withCheckboxSubtitle: true\n });\n\n const soundRow = new Row({\n checkboxField: new CheckboxField({text: 'Notifications.Sound', checked: true, stateKey: 'settings.notifications.sound', listenerSetter: this.listenerSetter}),\n subtitleLangKey: 'Loading',\n listenerSetter: this.listenerSetter,\n withCheckboxSubtitle: true\n });\n\n apiManagerProxy.getState().then((state) => {\n soundRow.checkboxField.checked = state.settings.notifications.sound;\n });\n\n section.content.append(contactsSignUpRow.container, soundRow.container);\n\n this.scrollable.append(section.container);\n\n this.managers.appNotificationsManager.getContactSignUpNotification().then((enabled) => {\n contactsSignUpRow.checkboxField.checked = enabled;\n\n this.eventListener.addEventListener('destroy', () => {\n const _enabled = contactsSignUpRow.checkboxField.checked;\n if(enabled !== _enabled) {\n this.managers.appNotificationsManager.setContactSignUpNotification(!_enabled);\n }\n }, {once: true});\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 {randomLong} from '../../../helpers/random';\nimport {LangPackLanguage} from '../../../layer';\nimport I18n from '../../../lib/langPack';\nimport rootScope from '../../../lib/rootScope';\nimport RadioField from '../../radioField';\nimport Row, {RadioFormFromRows} from '../../row';\nimport SettingSection from '../../settingSection';\nimport {SliderSuperTab} from '../../slider'\n\nexport default class AppLanguageTab extends SliderSuperTab {\n public static getInitArgs() {\n return {\n languages1: rootScope.managers.apiManager.invokeApiCacheable('langpack.getLanguages', {\n lang_pack: 'web'\n }),\n // languages2: rootScope.managers.apiManager.invokeApiCacheable('langpack.getLanguages', {\n // lang_pack: 'macos'\n // })\n languages2: Promise.resolve([] as LangPackLanguage[])\n };\n }\n\n public init(p: ReturnType) {\n this.header.classList.add('with-border');\n this.container.classList.add('language-container');\n this.setTitle('Telegram.LanguageViewController');\n\n const section = new SettingSection({});\n\n const radioRows: Map = new Map();\n\n const promise = Promise.all([\n p.languages1,\n p.languages2\n ]).then(([languages1, languages2]) => {\n const rendered: Set = new Set();\n const webLangCodes = languages1.map((language) => language.lang_code);\n\n const random = randomLong();\n languages1.concat(languages2).forEach((language) => {\n if(rendered.has(language.lang_code)) return;\n rendered.add(language.lang_code);\n\n const row = new Row({\n radioField: new RadioField({\n text: language.name,\n name: random,\n value: language.lang_code\n }),\n subtitle: language.native_name\n });\n\n radioRows.set(language.lang_code, row);\n });\n\n const form = RadioFormFromRows([...radioRows.values()], (value) => {\n I18n.getLangPack(value, webLangCodes.includes(value));\n });\n\n I18n.getCacheLangPack().then((langPack) => {\n const row = radioRows.get(langPack.lang_code);\n if(!row) {\n console.error('no row', row, langPack);\n return;\n }\n\n row.radioField.setValueSilently(true);\n });\n\n section.content.append(form);\n });\n\n this.scrollable.append(section.container);\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 ListenerSetter from '../../../../helpers/listenerSetter';\nimport {LangPackKey} from '../../../../lib/langPack';\nimport CheckboxField from '../../../checkboxField';\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport Row, {CreateRowFromCheckboxField} from '../../../row';\nimport SettingSection from '../../../settingSection';\n\nexport function autoDownloadPeerTypeSection(type: 'photo' | 'video' | 'file', title: LangPackKey, listenerSetter: ListenerSetter) {\n const section = new SettingSection({name: title});\n\n const key = 'settings.autoDownload.' + type + '.';\n const contactsCheckboxField = new CheckboxField({\n text: 'AutodownloadContacts',\n name: 'contacts',\n stateKey: key + 'contacts',\n listenerSetter\n });\n const privateCheckboxField = new CheckboxField({\n text: 'AutodownloadPrivateChats',\n name: 'private',\n stateKey: key + 'private',\n listenerSetter\n });\n const groupsCheckboxField = new CheckboxField({\n text: 'AutodownloadGroupChats',\n name: 'groups',\n stateKey: key + 'groups',\n listenerSetter\n });\n const channelsCheckboxField = new CheckboxField({\n text: 'AutodownloadChannels',\n name: 'channels',\n stateKey: key + 'channels',\n listenerSetter\n });\n\n section.content.append(\n CreateRowFromCheckboxField(contactsCheckboxField).container,\n CreateRowFromCheckboxField(privateCheckboxField).container,\n CreateRowFromCheckboxField(groupsCheckboxField).container,\n CreateRowFromCheckboxField(channelsCheckboxField).container\n );\n\n return section;\n}\n\nexport default class AppAutoDownloadPhotoTab extends SliderSuperTabEventable {\n public init() {\n this.setTitle('AutoDownloadPhotos');\n\n const section = autoDownloadPeerTypeSection('photo', 'AutoDownloadPhotosTitle', this.listenerSetter);\n this.scrollable.append(section.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 formatBytes from '../../../../helpers/formatBytes';\nimport debounce from '../../../../helpers/schedulers/debounce';\nimport I18n from '../../../../lib/langPack';\nimport rootScope from '../../../../lib/rootScope';\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport {RangeSettingSelector} from '../generalSettings';\nimport {autoDownloadPeerTypeSection} from './photo';\n\nexport default class AppAutoDownloadFileTab extends SliderSuperTabEventable {\n public init() {\n this.setTitle('AutoDownloadFiles');\n\n const debouncedSave = debounce((sizeMax: number) => {\n this.managers.appStateManager.setByKey('settings.autoDownloadNew.file_size_max', sizeMax);\n }, 200, false, true);\n\n const section = autoDownloadPeerTypeSection('file', 'AutoDownloadFilesTitle', this.listenerSetter);\n\n const MIN = 512 * 1024;\n // const MAX = 2 * 1024 * 1024 * 1024;\n const MAX = 20 * 1024 * 1024;\n const MAX_RANGE = MAX - MIN;\n\n const sizeMax = rootScope.settings.autoDownloadNew.file_size_max;\n const value = Math.sqrt(Math.sqrt((sizeMax - MIN) / MAX_RANGE));\n const upTo = new I18n.IntlElement({\n key: 'AutodownloadSizeLimitUpTo',\n args: [formatBytes(sizeMax)]\n });\n const range = new RangeSettingSelector('AutoDownloadMaxFileSize', 0.01, value, 0, 1, false);\n range.onChange = (value) => {\n const sizeMax = (value ** 4 * MAX_RANGE + MIN) | 0;\n\n upTo.compareAndUpdate({args: [formatBytes(sizeMax)]});\n\n debouncedSave(sizeMax);\n };\n\n range.valueContainer.append(upTo.element);\n\n section.content.append(range.container);\n\n this.scrollable.append(section.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 {SliderSuperTabEventable} from '../../../sliderTab';\nimport {autoDownloadPeerTypeSection} from './photo';\n\nexport default class AppAutoDownloadVideoTab extends SliderSuperTabEventable {\n public init() {\n this.setTitle('AutoDownloadVideos');\n\n const section = autoDownloadPeerTypeSection('video', 'AutoDownloadVideosTitle', this.listenerSetter);\n this.scrollable.append(section.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 {AutoDownloadPeerTypeSettings, STATE_INIT} from '../../../config/state';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport formatBytes from '../../../helpers/formatBytes';\nimport copy from '../../../helpers/object/copy';\nimport deepEqual from '../../../helpers/object/deepEqual';\nimport {FormatterArguments, i18n, join, LangPackKey} from '../../../lib/langPack';\nimport rootScope from '../../../lib/rootScope';\nimport Button from '../../button';\nimport CheckboxField from '../../checkboxField';\nimport confirmationPopup from '../../confirmationPopup';\nimport Row from '../../row';\nimport {SliderSuperTabEventable, SliderSuperTabEventableConstructable} from '../../sliderTab';\nimport AppAutoDownloadFileTab from './autoDownload/file';\nimport AppAutoDownloadPhotoTab from './autoDownload/photo';\nimport AppAutoDownloadVideoTab from './autoDownload/video';\nimport apiManagerProxy from '../../../lib/mtproto/mtprotoworker';\nimport SettingSection from '../../settingSection';\n\nconst AUTO_DOWNLOAD_FOR_KEYS: {[k in keyof AutoDownloadPeerTypeSettings]: LangPackKey} = {\n contacts: 'AutoDownloadContacts',\n private: 'AutoDownloadPm',\n groups: 'AutoDownloadGroups',\n channels: 'AutoDownloadChannels'\n};\n\nexport default class AppDataAndStorageTab extends SliderSuperTabEventable {\n public async init() {\n this.setTitle('DataSettings');\n\n {\n const section = new SettingSection({name: 'AutomaticMediaDownload', caption: 'AutoDownloadAudioInfo'});\n\n const state = await apiManagerProxy.getState();\n\n const autoCheckboxField = new CheckboxField({\n text: 'AutoDownloadMedia',\n name: 'auto',\n checked: !state.settings.autoDownloadNew.pFlags.disabled,\n listenerSetter: this.listenerSetter\n });\n\n const autoRow = new Row({\n checkboxField: autoCheckboxField,\n listenerSetter: this.listenerSetter\n });\n\n const onChange = () => {\n toggleDisability([resetButton],\n deepEqual(state.settings.autoDownload, STATE_INIT.settings.autoDownload) &&\n deepEqual(state.settings.autoDownloadNew, STATE_INIT.settings.autoDownloadNew));\n };\n\n const setSubtitles = () => {\n this.setAutoDownloadSubtitle(photoRow, state.settings.autoDownload.photo /* state.settings.autoDownloadNew.photo_size_max */);\n this.setAutoDownloadSubtitle(videoRow, state.settings.autoDownload.video/* , state.settings.autoDownloadNew.video_size_max */);\n this.setAutoDownloadSubtitle(fileRow, state.settings.autoDownload.file, state.settings.autoDownloadNew.file_size_max);\n };\n\n const openTab = (tabConstructor: SliderSuperTabEventableConstructable) => {\n const tab = this.slider.createTab(tabConstructor);\n tab.open();\n\n this.listenerSetter.add(tab.eventListener)('destroy', () => {\n setSubtitles();\n onChange();\n }, {once: true});\n };\n\n const photoRow = new Row({\n titleLangKey: 'AutoDownloadPhotos',\n subtitle: '',\n clickable: () => {\n openTab(AppAutoDownloadPhotoTab);\n },\n listenerSetter: this.listenerSetter\n });\n\n const videoRow = new Row({\n titleLangKey: 'AutoDownloadVideos',\n subtitle: '',\n clickable: () => {\n openTab(AppAutoDownloadVideoTab);\n },\n listenerSetter: this.listenerSetter\n });\n\n const fileRow = new Row({\n titleLangKey: 'AutoDownloadFiles',\n subtitle: '',\n clickable: () => {\n openTab(AppAutoDownloadFileTab);\n },\n listenerSetter: this.listenerSetter\n });\n\n const resetButton = Button('btn-primary btn-transparent primary', {icon: 'delete', text: 'ResetAutomaticMediaDownload'});\n attachClickEvent(resetButton, () => {\n confirmationPopup({\n titleLangKey: 'ResetAutomaticMediaDownloadAlertTitle',\n descriptionLangKey: 'ResetAutomaticMediaDownloadAlert',\n button: {\n langKey: 'Reset'\n }\n }).then(() => {\n const settings = rootScope.settings;\n settings.autoDownloadNew = copy(STATE_INIT.settings.autoDownloadNew);\n settings.autoDownload = copy(STATE_INIT.settings.autoDownload);\n state.settings = settings;\n this.managers.appStateManager.setByKey('settings', settings);\n\n setSubtitles();\n autoCheckboxField.checked = !state.settings.autoDownloadNew.pFlags.disabled;\n });\n });\n\n const onDisabledChange = () => {\n const disabled = !autoCheckboxField.checked;\n\n const settings = rootScope.settings;\n if(disabled) {\n settings.autoDownloadNew.pFlags.disabled = true;\n } else {\n delete settings.autoDownloadNew.pFlags.disabled;\n }\n\n [photoRow, videoRow, fileRow].forEach((row) => {\n row.container.classList.toggle('is-disabled', disabled);\n });\n\n this.managers.appStateManager.setByKey('settings', settings);\n\n onChange();\n };\n\n autoCheckboxField.input.addEventListener('change', onDisabledChange);\n onDisabledChange();\n setSubtitles();\n\n section.content.append(\n autoRow.container,\n photoRow.container,\n videoRow.container,\n fileRow.container,\n resetButton\n );\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({name: 'AutoplayMedia'});\n\n section.content.append(new Row({\n checkboxField: new CheckboxField({\n text: 'AutoplayGIF',\n name: 'gifs',\n stateKey: 'settings.autoPlay.gifs',\n listenerSetter: this.listenerSetter\n }),\n listenerSetter: this.listenerSetter\n }).container, new Row({\n checkboxField: new CheckboxField({\n text: 'AutoplayVideo',\n name: 'videos',\n stateKey: 'settings.autoPlay.videos',\n listenerSetter: this.listenerSetter\n }),\n listenerSetter: this.listenerSetter\n }).container);\n\n this.scrollable.append(section.container);\n }\n }\n\n private setAutoDownloadSubtitle(row: Row, settings: AutoDownloadPeerTypeSettings, sizeMax?: number) {\n let key: LangPackKey;\n const args: FormatterArguments = [];\n\n const peerKeys = Object.keys(settings) as (keyof typeof AUTO_DOWNLOAD_FOR_KEYS)[];\n const enabledKeys = peerKeys.map((key) => settings[key] ? AUTO_DOWNLOAD_FOR_KEYS[key] : undefined).filter(Boolean);\n if(!enabledKeys.length || sizeMax === 0) {\n key = 'AutoDownloadOff';\n } else {\n const isAll = enabledKeys.length === peerKeys.length;\n if(sizeMax !== undefined) {\n key = isAll ? 'AutoDownloadUpToOnAllChats' : 'AutoDownloadOnUpToFor';\n args.push(formatBytes(sizeMax));\n } else {\n key = isAll ? 'AutoDownloadOnAllChats' : 'AutoDownloadOnFor';\n }\n\n if(!isAll) {\n const fragment = document.createElement('span');\n fragment.append(...join(enabledKeys.map((key) => i18n(key)), true, false));\n args.push(fragment);\n }\n }\n\n replaceContent(row.subtitle, i18n(key, args));\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 ButtonMenuToggle from '../../buttonMenuToggle';\nimport Button from '../../button';\nimport AppPrivacyAndSecurityTab from './privacyAndSecurity';\nimport AppGeneralSettingsTab from './generalSettings';\nimport AppEditProfileTab from './editProfile';\nimport AppChatFoldersTab from './chatFolders';\nimport AppNotificationsTab from './notifications';\nimport AppLanguageTab from './language';\nimport lottieLoader from '../../../lib/rlottie/lottieLoader';\nimport PopupPeer from '../../popups/peer';\nimport AppDataAndStorageTab from './dataAndStorage';\nimport ButtonIcon from '../../buttonIcon';\nimport PeerProfile from '../../peerProfile';\nimport rootScope from '../../../lib/rootScope';\nimport Row from '../../row';\nimport AppActiveSessionsTab from './activeSessions';\nimport {i18n, LangPackKey} from '../../../lib/langPack';\nimport {SliderSuperTabConstructable, SliderSuperTabEventable} from '../../sliderTab';\nimport PopupAvatar from '../../popups/avatar';\nimport {AccountAuthorizations, Authorization} from '../../../layer';\nimport PopupElement from '../../popups';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport SettingSection from '../../settingSection';\n// import AppMediaViewer from \"../../appMediaViewerNew\";\n\nexport default class AppSettingsTab extends SliderSuperTab {\n private buttons: {\n edit: HTMLButtonElement,\n folders: HTMLButtonElement,\n general: HTMLButtonElement,\n notifications: HTMLButtonElement,\n storage: HTMLButtonElement,\n privacy: HTMLButtonElement,\n } = {} as any;\n private profile: PeerProfile;\n\n private languageRow: Row;\n private devicesRow: Row;\n\n private authorizations: Authorization.authorization[];\n private getAuthorizationsPromise: Promise;\n\n public async init() {\n this.container.classList.add('settings-container');\n this.setTitle('Settings');\n\n const btnMenu = ButtonMenuToggle({\n listenerSetter: this.listenerSetter,\n direction: 'bottom-left',\n buttons: [{\n icon: 'logout',\n text: 'EditAccount.Logout',\n onClick: () => {\n new PopupPeer('logout', {\n titleLangKey: 'LogOut',\n descriptionLangKey: 'LogOut.Description',\n buttons: [{\n langKey: 'LogOut',\n callback: () => {\n this.managers.apiManager.logOut();\n },\n isDanger: true\n }]\n }).show();\n }\n }]\n });\n\n this.buttons.edit = ButtonIcon('edit');\n\n this.header.append(this.buttons.edit, btnMenu);\n\n this.profile = new PeerProfile(this.managers, this.scrollable, this.listenerSetter, false);\n this.profile.init();\n this.profile.setPeer(rootScope.myId);\n const fillPromise = this.profile.fillProfileElements();\n\n const changeAvatarBtn = Button('btn-circle btn-corner z-depth-1 profile-change-avatar', {icon: 'cameraadd'});\n attachClickEvent(changeAvatarBtn, () => {\n const canvas = document.createElement('canvas');\n PopupElement.createPopup(PopupAvatar).open(canvas, (upload) => {\n upload().then((inputFile) => {\n return this.managers.appProfileManager.uploadProfilePhoto(inputFile);\n });\n });\n }, {listenerSetter: this.listenerSetter});\n this.profile.element.lastElementChild.firstElementChild.append(changeAvatarBtn);\n\n const updateChangeAvatarBtn = async() => {\n const user = await this.managers.appUsersManager.getSelf();\n changeAvatarBtn.classList.toggle('hide', user.photo?._ !== 'userProfilePhoto');\n };\n\n updateChangeAvatarBtn();\n this.listenerSetter.add(rootScope)('avatar_update', ({peerId}) => {\n if(rootScope.myId === peerId) {\n updateChangeAvatarBtn();\n }\n });\n\n /* const div = document.createElement('div');\n //div.style.cssText = 'border-radius: 8px; overflow: hidden; width: 396px; height: 264px; flex: 0 0 auto; position: relative; margin: 10rem 0 10rem auto;';\n //div.style.width = '135px';\n //div.style.height = '100px';\n div.style.cssText = 'border-radius: 8px; overflow: hidden; width: 396px; height: 264px; flex: 0 0 auto; position: relative; margin: 10rem auto 10rem 0;';\n div.style.width = '135px';\n div.style.height = '100px';\n\n const img = document.createElement('img');\n img.src = 'assets/img/pepe.jpg';\n img.classList.add('media-photo');\n img.style.cssText = 'max-width: 100%;max-height: 100%;';\n\n div.append(img);\n\n div.addEventListener('click', () => {\n new AppMediaViewer().setSearchContext({peerId: 61004386, inputFilter: 'inputMessagesFilterPhotos'}).openMedia({\n _: 'message',\n mid: 1,\n peerId: 61004386,\n fromId: 61004386,\n message: '',\n media: {\n _: 'messageMediaPhoto',\n photo: {\n _: 'photo',\n url: img.src,\n downloaded: 111,\n sizes: [{\n _: 'photoSize',\n type: 'x',\n w: 618,\n h: 412\n }]\n }\n },\n date: Date.now() / 1000 | 0\n }, img);\n });\n\n this.scrollable.append(div); */\n\n const buttonsDiv = document.createElement('div');\n buttonsDiv.classList.add('profile-buttons');\n\n type ConstructorP = T extends {\n new (...args: any[]): infer U;\n } ? U : never;\n\n const m = (\n icon: string,\n text: LangPackKey,\n c: T,\n getInitArgs?: () => Promise['init']>>\n ): {\n icon: string,\n text: LangPackKey,\n tabConstructor: T,\n getInitArgs?: typeof getInitArgs,\n // args?: ReturnType\n args?: any\n } => {\n if(!getInitArgs) {\n const g = (c as any as typeof SliderSuperTab).getInitArgs;\n if(g) {\n // @ts-ignore\n getInitArgs = () => [g(this)];\n }\n }\n\n return {\n icon,\n text,\n tabConstructor: c,\n getInitArgs,\n args: getInitArgs?.()\n };\n };\n\n // const k = (c: T): () => [ReturnType['getInitArgs']>] => {\n // return () => (c as any).getInitArgs(this);\n // };\n\n const b = [\n m('unmute', 'AccountSettings.Notifications', AppNotificationsTab),\n m('data', 'DataSettings', AppDataAndStorageTab),\n m('lock', 'AccountSettings.PrivacyAndSecurity', AppPrivacyAndSecurityTab),\n m('settings', 'Telegram.GeneralSettingsViewController', AppGeneralSettingsTab),\n m('folder', 'AccountSettings.Filters', AppChatFoldersTab)\n ];\n\n const rows = b.map((item) => {\n const {icon, text: langPackKey, tabConstructor, getInitArgs} = item;\n return new Row({\n titleLangKey: langPackKey,\n icon,\n clickable: async() => {\n const args = item.args ? await item.args : [];\n const tab = this.slider.createTab(tabConstructor as any);\n tab.open(...args);\n\n if(tab instanceof SliderSuperTabEventable && getInitArgs) {\n tab.eventListener.addEventListener('destroyAfter', (promise) => {\n item.args = promise.then(() => getInitArgs() as any);\n });\n }\n },\n listenerSetter: this.listenerSetter\n });\n });\n\n const languageArgs = AppLanguageTab.getInitArgs();\n rows.push(\n this.devicesRow = new Row({\n titleLangKey: 'Devices',\n titleRightSecondary: ' ',\n icon: 'activesessions',\n clickable: async() => {\n if(!this.authorizations) {\n await this.updateActiveSessions();\n }\n\n const tab = this.slider.createTab(AppActiveSessionsTab);\n tab.authorizations = this.authorizations;\n tab.eventListener.addEventListener('destroy', () => {\n this.authorizations = undefined;\n this.updateActiveSessions(true);\n }, {once: true});\n tab.open();\n },\n listenerSetter: this.listenerSetter\n }),\n\n this.languageRow = new Row({\n titleLangKey: 'AccountSettings.Language',\n titleRightSecondary: i18n('LanguageName'),\n icon: 'language',\n clickable: () => {\n this.slider.createTab(AppLanguageTab).open(languageArgs);\n },\n listenerSetter: this.listenerSetter\n })\n );\n\n buttonsDiv.append(...rows.map((row) => row.container));\n\n // const profileSection = new SettingSection({fullWidth: true, noPaddingTop: true});\n // profileSection.content.append(this.profile.element);\n\n const buttonsSection = new SettingSection();\n buttonsSection.content.append(buttonsDiv);\n\n this.scrollable.append(this.profile.element/* profileSection.container */, buttonsSection.container);\n\n const getEditProfileArgs = () => {\n editProfileArgs = AppEditProfileTab.getInitArgs();\n };\n let editProfileArgs: ReturnType;\n attachClickEvent(this.buttons.edit, () => {\n const tab = this.slider.createTab(AppEditProfileTab);\n tab.open(editProfileArgs);\n }, {listenerSetter: this.listenerSetter});\n getEditProfileArgs();\n // this.listenerSetter.add(rootScope)('user_full_update', (userId) => {\n // if(rootScope.myId.toUserId() === userId) {\n // getEditProfileArgs();\n // }\n // });\n this.listenerSetter.add(rootScope)('user_update', (userId) => {\n if(rootScope.myId.toUserId() === userId) {\n getEditProfileArgs();\n }\n });\n\n lottieLoader.loadLottieWorkers();\n\n this.updateActiveSessions();\n\n (await fillPromise)();\n }\n\n private getAuthorizations(overwrite?: boolean) {\n if(this.getAuthorizationsPromise && !overwrite) return this.getAuthorizationsPromise;\n\n const promise = this.getAuthorizationsPromise = this.managers.apiManager.invokeApi('account.getAuthorizations')\n .finally(() => {\n if(this.getAuthorizationsPromise === promise) {\n this.getAuthorizationsPromise = undefined;\n }\n });\n\n return promise;\n }\n\n public updateActiveSessions(overwrite?: boolean) {\n return this.getAuthorizations(overwrite).then((auths) => {\n this.authorizations = auths.authorizations;\n this.devicesRow.titleRight.textContent = '' + this.authorizations.length;\n });\n }\n\n public onCloseAfterTimeout() {\n this.profile.destroy();\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 appSidebarLeft from '..';\nimport {InputFile} from '../../../layer';\nimport InputField from '../../inputField';\nimport {SliderSuperTab} from '../../slider';\nimport AvatarEdit from '../../avatarEdit';\nimport AppAddMembersTab from './addMembers';\nimport {_i18n} from '../../../lib/langPack';\nimport ButtonCorner from '../../buttonCorner';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport SettingSection from '../../settingSection';\n\nexport default class AppNewChannelTab extends SliderSuperTab {\n private uploadAvatar: () => Promise = null;\n\n private channelNameInputField: InputField;\n private channelDescriptionInputField: InputField;\n private nextBtn: HTMLButtonElement;\n private avatarEdit: AvatarEdit;\n\n public init() {\n this.container.classList.add('new-channel-container');\n this.setTitle('NewChannel');\n\n this.avatarEdit = new AvatarEdit((_upload) => {\n this.uploadAvatar = _upload;\n });\n\n const section = new SettingSection({\n caption: 'Channel.DescriptionHolderDescrpiton'\n });\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.channelNameInputField = new InputField({\n label: 'EnterChannelName',\n maxLength: 128\n });\n\n this.channelDescriptionInputField = new InputField({\n label: 'DescriptionOptionalPlaceholder',\n maxLength: 255\n });\n\n inputWrapper.append(this.channelNameInputField.container, this.channelDescriptionInputField.container);\n\n const onLengthChange = () => {\n this.nextBtn.classList.toggle('is-visible', !!this.channelNameInputField.value.length &&\n !this.channelNameInputField.input.classList.contains('error') &&\n !this.channelDescriptionInputField.input.classList.contains('error'));\n };\n\n this.channelNameInputField.input.addEventListener('input', onLengthChange);\n this.channelDescriptionInputField.input.addEventListener('input', onLengthChange);\n\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\n\n attachClickEvent(this.nextBtn, () => {\n const title = this.channelNameInputField.value;\n const about = this.channelDescriptionInputField.value;\n\n this.nextBtn.disabled = true;\n this.managers.appChatsManager.createChannel({\n title,\n about,\n broadcast: true\n }).then((channelId) => {\n if(this.uploadAvatar) {\n this.uploadAvatar().then((inputFile) => {\n this.managers.appChatsManager.editPhoto(channelId, inputFile);\n });\n }\n\n appImManager.setInnerPeer({peerId: channelId.toPeerId(true)});\n\n appSidebarLeft.removeTabFromHistory(this);\n this.slider.createTab(AppAddMembersTab).open({\n type: 'channel',\n skippable: true,\n title: 'GroupAddMembers',\n placeholder: 'SendMessageTo',\n takeOut: (peerIds) => {\n return this.managers.appChatsManager.inviteToChannel(channelId, peerIds);\n }\n });\n });\n }, {listenerSetter: this.listenerSetter});\n\n this.content.append(this.nextBtn);\n section.content.append(this.avatarEdit.container, inputWrapper);\n this.scrollable.append(section.container);\n }\n\n public onCloseAfterTimeout() {\n this.avatarEdit.clear();\n this.uploadAvatar = null;\n this.channelNameInputField.value = '';\n this.channelDescriptionInputField.value = '';\n this.nextBtn.disabled = false;\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 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 {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', {closable: true, withConfirm: 'Add', title: 'AddContactTitle'});\n this.construct();\n }\n\n private async construct() {\n attachClickEvent(this.btnConfirm, () => {\n const promise = this.managers.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 = getAbbreviation(name);\n editPeer.avatarElem.peerTitle = 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 = await this.managers.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 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';\nimport PopupElement from '../../popups';\n\n// TODO: ะฟะพะธัะบ ะฟะพ ะปัŽะดัะผ ะณะปะพะฑะฐะปัŒะฝั‹ะน, ะตัะปะธ ะฝะต ะฝะฐัˆะปะพ ะฒ ะบะพะฝั‚ะฐะบั‚ะฐั… ะฝะธะบะพะณะพ\n\nexport default class AppContactsTab extends SliderSuperTab {\n private inputSearch: InputSearch;\n private middleware: ReturnType;\n private sortedUserList: SortedUserList;\n\n public 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 PopupElement.createPopup(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', async(userId) => {\n const isContact = await this.managers.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 this.openContacts();\n\n // preload contacts\n // appUsersManager.getContacts();\n }\n\n protected createList() {\n const sortedUserList = new SortedUserList({\n managers: this.managers\n });\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 / 56 * 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 this.middleware.clean();\n const middleware = this.middleware.get();\n this.scrollable.onScrolledBottom = null;\n this.scrollable.container.textContent = '';\n\n this.managers.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 / 56 * 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","/*\n * 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';\nimport {FOLDER_ID_ARCHIVE, REAL_FOLDER_ID} from '../../../lib/mtproto/mtproto_config';\n\nexport default class AppArchivedTab extends SliderSuperTab {\n private static filterId: REAL_FOLDER_ID = FOLDER_ID_ARCHIVE;\n private wasFilterId: number;\n\n public init() {\n this.wasFilterId = appDialogsManager.filterId;\n\n this.container.id = 'chats-archived-container';\n this.setTitle('ArchivedChats');\n\n this.header.classList.add('can-have-forum');\n this.content.classList.add('can-have-forum');\n\n if(!appDialogsManager.xds[AppArchivedTab.filterId]) {\n const {ul, scrollable} = appDialogsManager.l({\n title: undefined,\n id: AppArchivedTab.filterId,\n localId: FOLDER_ID_ARCHIVE\n });\n scrollable.container.append(ul);\n }\n\n const scrollable = appDialogsManager.xds[AppArchivedTab.filterId].scrollable;\n this.scrollable.container.replaceWith(scrollable.container);\n scrollable.attachBorderListeners(this.container);\n // ! DO NOT UNCOMMENT NEXT LINE - chats will stop loading on scroll after closing the tab\n // this.scrollable = scrollable;\n return appDialogsManager.setFilterIdAndChangeTab(AppArchivedTab.filterId).then(({cached, renderPromise}) => {\n if(cached) {\n return renderPromise;\n }\n });\n }\n\n // ะฒะพะพะฑั‰ะต, ั‚ะฐะบ ะดะตะปะฐั‚ัŒ ะฝะตะปัŒะทั, ะฝะพ ะฝะตั‚ ะฒั€ะตะผะตะฝะธ ั‡ั‚ะพะฑั‹ ะฟะตั€ะตะดะตะปะฐั‚ัŒ ะณะปะฐะฒะฝั‹ะน ั‡ะฐั‚ะปะธัั‚ ะฝะฐ ัะปะฐะนะด...\n onOpenAfterTimeout() {\n appDialogsManager.xds[this.wasFilterId].clear();\n }\n\n onClose() {\n this.scrollable.onAdditionalScroll = undefined;\n appDialogsManager.setFilterIdAndChangeTab(this.wasFilterId);\n }\n\n onCloseAfterTimeout() {\n appDialogsManager.xds[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 {SliderSuperTab} from '../../slider';\nimport ButtonCorner from '../../buttonCorner';\nimport AppNewGroupTab from './newGroup';\nimport {toast} from '../../toast';\nimport {ButtonMenuItemOptions} from '../../buttonMenu';\nimport {i18n, join, _i18n} from '../../../lib/langPack';\nimport rootScope from '../../../lib/rootScope';\nimport wrapSticker from '../../wrappers/sticker';\nimport SortedUserList from '../../sortedUserList';\nimport {PeerLocated, Update, Updates} from '../../../layer';\nimport {SettingChatListSection} from '..';\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport confirmationPopup from '../../confirmationPopup';\nimport getPeerId from '../../../lib/appManagers/utils/peers/getPeerId';\nimport type LazyLoadQueue from '../../lazyLoadQueue';\n\nexport default class AppPeopleNearbyTab extends SliderSuperTab {\n private latestLocationSaved: {latitude: number, longitude: number, accuracy: number};\n private isLocationWatched: boolean = false;\n private errorCategory: HTMLElement;\n private retryBtn: HTMLButtonElement;\n private btnOptions: HTMLButtonElement;\n private menuButtons: (ButtonMenuItemOptions & {verify?: () => boolean})[];\n\n protected lazyLoadQueue: LazyLoadQueue;\n protected peopleSection: SettingChatListSection;\n protected chatsSection: SettingChatListSection;\n\n protected locatedPeers: Map;\n\n // public async init() {\n // this.container.classList.add('people-nearby-container');\n // this.setTitle('PeopleNearby');\n\n // this.errorCategory = document.createElement('div');\n // this.errorCategory.classList.add('text', 'hide', 'nearby-error');\n\n // this.retryBtn = ButtonCorner({icon: 'check'});\n\n // const emoji = '๐Ÿงญ';\n // const doc = await this.managers.appStickersManager.getAnimatedEmojiSticker(emoji);\n // const stickerContainer = document.createElement('div');\n // stickerContainer.classList.add('sticker-container');\n\n // if(doc) {\n // wrapSticker({\n // doc,\n // div: stickerContainer,\n // loop: false,\n // play: true,\n // width: 86,\n // height: 86,\n // emoji,\n // needUpscale: true\n // }).then(() => {\n // // this.animation = player;\n // });\n // } else {\n // stickerContainer.classList.add('media-sticker-wrapper');\n // }\n\n // const caption = document.createElement('div');\n // caption.classList.add('caption');\n // _i18n(caption, 'PeopleNearbyInfo2');\n\n // this.locatedPeers = new Map();\n\n // const m = () => {\n // const sortedUserList = new SortedUserList({\n // avatarSize: 42,\n // createChatListOptions: {\n // dialogSize: 48,\n // new: true\n // },\n // autonomous: false,\n // onUpdate: (element) => {\n // const peer = this.locatedPeers.get(element.id);\n // const elements: HTMLElement[] = [\n // this.parseDistance(peer.distance)\n // ];\n\n // if(!element.id.isUser()) {\n // elements.push(this.managers.appProfileManager.getChatMembersString(element.id.toChatId()));\n // }\n\n // element.dom.lastMessageSpan.textContent = '';\n // element.dom.lastMessageSpan.append(...join(elements, false));\n // },\n // getIndex: (element) => {\n // const peer = this.locatedPeers.get(element.id);\n // return 0x7FFFFFFF - peer.distance;\n // },\n // appUsersManager: this.managers.appUsersManager\n // });\n\n // appDialogsManager.setListClickListener(sortedUserList.list, undefined, undefined, false);\n\n // return sortedUserList;\n // };\n\n // const peopleSection = this.peopleSection = new SettingChatListSection({\n // name: 'PeopleNearbyHeader',\n // sortedList: m()\n // });\n\n // const chatsSection = this.chatsSection = new SettingChatListSection({\n // name: 'ChatsNearbyHeader',\n // sortedList: m()\n // });\n\n // const btnMakeVisible = peopleSection.makeButton({\n // text: 'MakeMyselfVisible',\n // icon: 'location'\n // });\n\n // const btnMakeInvisible = peopleSection.makeButton({\n // text: 'StopShowingMe',\n // icon: 'location'\n // });\n\n // const btnCreateGroup = chatsSection.makeButton({\n // text: 'NearbyCreateGroup',\n // icon: 'newgroup'\n // });\n\n // attachClickEvent(btnMakeVisible, () => {\n // confirmationPopup({\n // titleLangKey: 'MakeMyselfVisibleTitle',\n // descriptionLangKey: 'MakeMyselfVisibleInfo',\n // button: {\n // langKey: 'OK'\n // }\n // }).then(() => {\n // this.startWatching();\n // });\n // }, {listenerSetter: this.listenerSetter});\n\n // attachClickEvent(btnMakeInvisible, () => {\n // this.stopWatching();\n // }, {listenerSetter: this.listenerSetter});\n\n // attachClickEvent(btnCreateGroup, () => {\n // this.slider.createTab(AppNewGroupTab).open([], true);\n // }, {listenerSetter: this.listenerSetter});\n\n // btnMakeVisible.classList.add('primary');\n // btnMakeInvisible.classList.add('danger');\n // btnCreateGroup.classList.add('primary');\n\n // this.content.append(this.retryBtn);\n // this.scrollable.append(\n // stickerContainer,\n // caption,\n // peopleSection.container,\n // chatsSection.container,\n // this.errorCategory\n // );\n // }\n\n private parseDistance(distance: number) {\n if(rootScope.settings.distanceUnit === 'miles') {\n if(distance > 1609.34) {\n return i18n('MilesAway', [Math.round(distance / 1609)]);\n } else {\n return i18n('FootsAway', [Math.round(distance * 3.281)]);\n }\n } else {\n if(distance >= 1000) {\n return i18n('KMetersAway2', [distance / 1000]);\n } else {\n return i18n('MetersAway2', [distance]);\n }\n }\n }\n\n // public open() {\n // const result = super.open();\n // result.then(() => {\n // this.retryBtn.classList.remove('is-visible');\n // navigator.geolocation.getCurrentPosition((location) => {\n // this.latestLocationSaved = {\n // latitude: location.coords.latitude,\n // longitude: location.coords.longitude,\n // accuracy: location.coords.accuracy\n // };\n\n // console.log(this.latestLocationSaved);\n\n // this.managers.appUsersManager.getLocated(\n // location.coords.latitude,\n // location.coords.longitude,\n // location.coords.accuracy\n // ).then((response) => {\n // const update = (response as Updates.updates).updates[0] as Update.updatePeerLocated;\n // const peers = update.peers as PeerLocated.peerLocated[];\n // const orderedPeers = peers.sort((a, b) => a.distance - b.distance);\n // const groupsCounter = peers.filter((e) => e.peer._ == 'peerChannel').length;\n // const usersCounter = peers.filter((e) => e.peer._ != 'peerChannel').length;\n // orderedPeers?.forEach((peer) => {\n // const peerId = getPeerId(peer.peer);\n // const section = peerId.isUser() ? this.peopleSection : this.chatsSection;\n // this.locatedPeers.set(peerId, peer);\n // section.sortedList.add(peerId);\n // });\n\n // this.errorCategory.classList.toggle('hide', !!(usersCounter || groupsCounter));\n // this.errorCategory.innerHTML = 'No groups or channels found around you.';\n // });\n // }, (error) => {\n // this.errorCategory.classList.remove('hide');\n // this.retryBtn.classList.add('is-visible');\n // this.retryBtn.addEventListener('click', this.open);\n // if(error instanceof GeolocationPositionError) {\n // this.errorCategory.innerHTML = 'Location permission denied. Click below to retry.';\n // } else {\n // this.errorCategory.innerHTML = 'An error has occurred. Please retry later clicking the button below.';\n // }\n // });\n // });\n\n // return result;\n // }\n\n private startWatching() {\n if(!this.latestLocationSaved || this.isLocationWatched) return;\n this.isLocationWatched = true;\n\n toast('Your position is now being shared. Do not close the page or it will be suspended.');\n\n this.managers.appUsersManager.getLocated(\n this.latestLocationSaved.latitude,\n this.latestLocationSaved.longitude,\n this.latestLocationSaved.accuracy,\n true, // background parameter\n 0x7fffffff // self_expires parameter\n );\n\n navigator.geolocation.watchPosition((result) => {\n const isLongitudeDifferent = result.coords.longitude !== this.latestLocationSaved.longitude;\n const isLatitudeDifferent = result.coords.latitude !== this.latestLocationSaved.latitude;\n const distanceCheck = this.calculateDistance(\n result.coords.latitude, result.coords.longitude,\n this.latestLocationSaved.latitude, this.latestLocationSaved.longitude\n ) > 100;\n\n if((isLatitudeDifferent || isLongitudeDifferent) && distanceCheck) {\n this.managers.appUsersManager.getLocated(\n result.coords.latitude,\n result.coords.longitude,\n result.coords.accuracy,\n true, // background parameter\n 0x7fffffff // self_expires parameter\n );\n this.latestLocationSaved = {\n latitude: result.coords.latitude,\n longitude: result.coords.longitude,\n accuracy: result.coords.accuracy\n }\n }\n });\n }\n\n private stopWatching() {\n if(!this.isLocationWatched) return;\n this.isLocationWatched = false;\n toast('The sharing of your position has been stopped. You will no longer be visible to other users.');\n this.managers.appUsersManager.getLocated(\n 0, // latitude parameter\n 0, // longitude parameter\n 0, // accuracy parameter\n false, // background parameter\n 0 // self_expires parameter\n );\n }\n\n private calculateDistance(lat1: number, long1: number, lat2: number, long2: number) {\n const p = 0.017453292519943295; // Math.PI/180\n return (\n 12742 * Math.asin(\n Math.sqrt(\n (0.5 - Math.cos((lat2 - lat1) * p)) +\n (\n Math.cos(lat1 * p) * Math.cos(lat2 * p) *\n (1 - Math.cos((long2 - long1) * p)/2)\n )\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 appImManager from '../../lib/appManagers/appImManager';\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 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 I18n, {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, {NavigationItem} 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, simulateClickEvent} from '../../helpers/dom/clickEvent';\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';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport AvatarElement from '../avatar';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport themeController from '../../helpers/themeController';\nimport contextMenuController from '../../helpers/contextMenuController';\nimport {DIALOG_LIST_ELEMENT_TAG} from '../../lib/appManagers/appDialogsManager';\nimport apiManagerProxy from '../../lib/mtproto/mtprotoworker';\nimport SettingSection, {SettingSectionOptions} from '../settingSection';\nimport {FOLDER_ID_ARCHIVE} from '../../lib/mtproto/mtproto_config';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {fastRaf} from '../../helpers/schedulers';\nimport {getInstallPrompt} from '../../helpers/dom/installPrompt';\n\nexport const LEFT_COLUMN_ACTIVE_CLASSNAME = 'is-left-column-shown';\n\nexport class AppSidebarLeft extends SidebarSlider {\n private toolsBtn: HTMLElement;\n private backBtn: HTMLButtonElement;\n // private searchInput = document.getElementById('global-search') as HTMLInputElement;\n private inputSearch: InputSearch;\n\n public archivedCount: HTMLSpanElement;\n public rect: DOMRect;\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\n construct(managers: AppManagers) {\n this.managers = managers;\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 this.createTab(AppAddMembersTab).open({\n type: 'chat',\n skippable: false,\n takeOut: (peerIds) => this.createTab(AppNewGroupTab).open(peerIds),\n title: 'GroupAddMembers',\n placeholder: 'SendMessageTo'\n });\n };\n\n const onContactsClick = () => {\n this.createTab(AppContactsTab).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: typeof menuButtons[0] = {\n icon: 'archive',\n text: 'ArchivedChats',\n onClick: () => {\n this.createTab(AppArchivedTab).open();\n },\n verify: async() => {\n const folder = await this.managers.dialogsStorage.getFolderDialogs(FOLDER_ID_ARCHIVE, false);\n return !!folder.length || !(await this.managers.dialogsStorage.isDialogsLoaded(FOLDER_ID_ARCHIVE));\n }\n };\n\n const themeCheckboxField = new CheckboxField({\n toggle: true,\n checked: themeController.getTheme().name === 'night'\n });\n themeCheckboxField.input.addEventListener('change', async() => {\n themeController.switchTheme(themeCheckboxField.input.checked ? 'night' : 'day');\n });\n\n rootScope.addEventListener('theme_change', () => {\n themeCheckboxField.setValueSilently(themeController.getTheme().name === 'night');\n });\n\n const menuButtons: (ButtonMenuItemOptions & {verify?: () => boolean | Promise})[] = [{\n icon: 'savedmessages',\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 this.createTab(AppPeopleNearbyTab).open();\n }\n } : undefined, {\n icon: 'settings',\n text: 'Settings',\n onClick: () => {\n this.createTab(AppSettingsTab).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 const url = I18n.format('TelegramFeaturesUrl', true);\n appImManager.openUrl(url);\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 icon: 'download',\n text: 'PWA.Install',\n onClick: () => {\n const installPrompt = getInstallPrompt();\n installPrompt?.();\n },\n verify: () => !!getInstallPrompt()\n }];\n\n const filteredButtons = menuButtons.filter(Boolean);\n\n this.toolsBtn = ButtonMenuToggle({\n direction: 'bottom-right',\n buttons: filteredButtons,\n onOpen: (e, btnMenu) => {\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 contextMenuController.close();\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 btnArchive.element?.append(this.archivedCount);\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 this.newBtnMenu = ButtonMenuToggle({\n direction: 'top-left',\n buttons: [{\n icon: 'newchannel',\n text: 'NewChannel',\n onClick: () => {\n this.createTab(AppNewChannelTab).open();\n }\n }, {\n icon: 'newgroup',\n text: 'NewGroup',\n onClick: onNewGroupClick\n }, {\n icon: 'newprivate',\n text: 'NewPrivateChat',\n onClick: onContactsClick\n }]\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.className = 'btn-circle rp btn-corner z-depth-1 btn-update is-hidden';\n ripple(this.updateBtn);\n this.updateBtn.append(i18n('Update'));\n\n attachClickEvent(this.updateBtn, () => {\n if(this.updateBtn.classList.contains('is-hidden')) {\n return;\n }\n\n location.reload();\n });\n\n sidebarHeader.nextElementSibling.append(this.updateBtn);\n\n this.inputSearch.input.addEventListener('focus', () => this.initSearch(), {once: true});\n\n this.archivedCount = document.createElement('span');\n this.archivedCount.className = 'archived-count badge badge-24 badge-gray';\n\n rootScope.addEventListener('folder_unread', (folder) => {\n if(folder.id === FOLDER_ID_ARCHIVE) {\n // const count = folder.unreadMessagesCount;\n const count = folder.unreadPeerIds.size;\n this.archivedCount.textContent = '' + formatNumber(count, 1);\n this.archivedCount.classList.toggle('hide', !count);\n }\n });\n\n this.managers.appUsersManager.getTopPeers('correspondents');\n\n // Focus search input by pressing Escape\n const navigationItem: NavigationItem = {\n type: 'global-search-focus',\n onPop: () => {\n setTimeout(() => {\n this.inputSearch.input.focus();\n }, 0);\n\n return false;\n },\n noHistory: true\n };\n appNavigationController.pushItem(navigationItem);\n\n apiManagerProxy.getState().then(() => {\n const CHECK_UPDATE_INTERVAL = 1800e3;\n const checkUpdateInterval = setInterval(() => {\n fetch('version', {cache: 'no-cache'})\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 const onResize = () => {\n const rect = this.rect = this.tabsContainer.getBoundingClientRect();\n document.documentElement.style.setProperty('--left-column-width', rect.width + 'px');\n };\n\n fastRaf(onResize);\n mediaSizes.addEventListener('resize', onResize);\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 simulateClickEvent(this.backBtn);\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, true),\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 managers: this.managers\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 const 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 = new AvatarElement();\n avatarEl.classList.add('selector-user-avatar', 'tgico', 'avatar-32');\n avatarEl.isDialog = true;\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.updateWithOptions({peerId: key as PeerId});\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 this.managers.dialogsStorage.getDialogs({query: value}).then(({dialogs}) => dialogs.map((d) => d.peerId)),\n this.managers.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, DIALOG_LIST_ELEMENT_TAG) 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 this.managers.appUsersManager.pushRecentSearch(peerId);\n }, {capture: true});\n\n const 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 const 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({\n content: searchContainer.parentElement,\n type: 'zoom-fade',\n transitionTime: 150,\n onTransitionEnd: (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\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 const navigationType: NavigationItem['type'] = 'global-search';\n if(!IS_MOBILE_SAFARI && !appNavigationController.findItemByType(navigationType)) {\n appNavigationController.pushItem({\n onPop: () => {\n close();\n },\n type: navigationType\n });\n }\n\n transition(1);\n };\n\n this.inputSearch.input.addEventListener('focus', onFocus);\n onFocus();\n\n attachClickEvent(this.backBtn, (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 return this.managers.appUsersManager.clearRecentSearch().then(() => {\n this.searchGroups.recent.clear();\n });\n });\n });\n }\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","/*\n * 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 AppSelectPeers from '../../appSelectPeers';\nimport {setButtonLoader} from '../../putPreloader';\nimport {LangPackKey, _i18n} from '../../../lib/langPack';\nimport ButtonCorner from '../../buttonCorner';\n\nexport default class AppAddMembersTab extends SliderSuperTab {\n private nextBtn: HTMLButtonElement;\n private selector: AppSelectPeers;\n private peerType: 'channel' | 'chat' | 'privacy';\n private takeOut: (peerIds: PeerId[]) => Promise | false | void;\n private skippable: boolean;\n\n public init(options: {\n title: LangPackKey,\n placeholder: LangPackKey,\n type: AppAddMembersTab['peerType'],\n takeOut?: AppAddMembersTab['takeOut'],\n skippable: boolean,\n selectedPeerIds?: PeerId[]\n }) {\n this.container.classList.add('add-members-container');\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\n this.content.append(this.nextBtn);\n this.scrollable.container.remove();\n\n this.nextBtn.addEventListener('click', () => {\n const peerIds = this.selector.getSelected().map((sel) => sel.toPeerId());\n const result = this.takeOut(peerIds);\n\n if(this.skippable) {\n this.close();\n } else if(result instanceof Promise) {\n this.attachToPromise(result);\n } else if(result === undefined) {\n this.close();\n }\n });\n\n //\n this.setTitle(options.title);\n this.peerType = options.type;\n this.takeOut = options.takeOut;\n this.skippable = options.skippable;\n\n const isPrivacy = this.peerType === 'privacy';\n this.selector = new AppSelectPeers({\n appendTo: this.content,\n onChange: this.skippable ? null : (length) => {\n this.nextBtn.classList.toggle('is-visible', !!length);\n },\n peerType: [isPrivacy ? 'dialogs' : 'contacts'],\n placeholder: options.placeholder,\n exceptSelf: isPrivacy,\n filterPeerTypeBy: isPrivacy ? ['isAnyGroup', 'isUser'] : undefined,\n managers: this.managers,\n design: 'square'\n });\n\n if(options.selectedPeerIds) {\n this.selector.addInitial(options.selectedPeerIds);\n }\n\n this.nextBtn.classList.add('tgico-arrow_next');\n this.nextBtn.innerHTML = '';\n this.nextBtn.disabled = false;\n this.nextBtn.classList.toggle('is-visible', this.skippable);\n }\n\n public attachToPromise(promise: Promise) {\n const removeLoader = setButtonLoader(this.nextBtn, 'arrow_next');\n\n promise.then(() => {\n this.close();\n }, () => {\n removeLoader();\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 {renderImageFromUrlPromise} from './dom/renderImageFromUrl';\n\nexport function averageColorFromCanvas(canvas: HTMLCanvasElement) {\n const context = canvas.getContext('2d');\n\n const pixel = new Array(4).fill(0);\n const pixels = context.getImageData(0, 0, canvas.width, canvas.height).data;\n const pixelsLength = pixels.length / 4;\n for(let i = 0; i < pixels.length; i += 4) {\n // const alphaPixel = pixels[i + 3];\n pixel[0] += pixels[i]/* * (alphaPixel / 255) */;\n pixel[1] += pixels[i + 1]/* * (alphaPixel / 255) */;\n pixel[2] += pixels[i + 2]/* * (alphaPixel / 255) */;\n pixel[3] += pixels[i + 3];\n }\n\n const outPixel = new Uint8ClampedArray(4);\n outPixel[0] = pixel[0] / pixelsLength;\n outPixel[1] = pixel[1] / pixelsLength;\n outPixel[2] = pixel[2] / pixelsLength;\n outPixel[3] = pixel[3] / pixelsLength;\n // outPixel[3] = 255;\n return outPixel;\n}\n\nexport function averageColorFromImageSource(imageSource: CanvasImageSource, width: number, height: number) {\n const canvas = document.createElement('canvas');\n const ratio = width / height;\n const DIMENSIONS = 50;\n if(ratio === 1) {\n canvas.width = DIMENSIONS;\n canvas.height = canvas.width / ratio;\n } else if(ratio > 1) {\n canvas.height = DIMENSIONS;\n canvas.width = canvas.height / ratio;\n } else {\n canvas.width = canvas.height = DIMENSIONS;\n }\n\n const context = canvas.getContext('2d');\n context.drawImage(imageSource, 0, 0, width, height, 0, 0, canvas.width, canvas.height);\n return averageColorFromCanvas(canvas);\n}\n\nexport function averageColor(imageUrl: string) {\n const img = document.createElement('img');\n return renderImageFromUrlPromise(img, imageUrl, false).then(() => {\n return averageColorFromImageSource(img, img.naturalWidth, img.naturalHeight);\n });\n};\n","import {rgbaToHsla} from './color';\n\n// * https://github.com/TelegramMessenger/Telegram-iOS/blob/3d062fff78cc6b287c74e6171f855a3500c0156d/submodules/TelegramPresentationData/Sources/PresentationData.swift#L453\nexport default function highlightningColor(rgba: [number, number, number, number?]) {\n let {h, s, l} = rgbaToHsla(rgba[0], rgba[1], rgba[2]);\n if(s > 0) {\n s = Math.min(100, s + 5 + 0.1 * (100 - s));\n }\n l = Math.max(0, l * .65);\n\n const hsla = `hsla(${h}, ${s}%, ${l}%, .4)`;\n return hsla;\n}\n","import {ColorHsla, ColorRgba, hexaToHsla, hslaToRgba, rgbaToHexa as rgbaToHexa, rgbaToHsla} from '../helpers/color';\nimport attachGrabListeners from '../helpers/dom/attachGrabListeners';\nimport clamp from '../helpers/number/clamp';\nimport InputField, {InputState} from './inputField';\n\nexport type ColorPickerColor = {\n hsl: string;\n rgb: string;\n hex: string;\n hsla: string;\n rgba: string;\n hexa: string;\n rgbaArray: ColorRgba;\n};\n\nexport default class ColorPicker {\n private static BASE_CLASS = 'color-picker';\n public container: HTMLElement;\n\n private boxRect: DOMRect;\n // private boxDraggerRect: DOMRect;\n private hueRect: DOMRect;\n // private hueDraggerRect: DOMRect;\n\n private hue = 0;\n private saturation = 100;\n private lightness = 50;\n private alpha = 1;\n private elements: {\n box: SVGSVGElement,\n boxDragger: SVGSVGElement,\n sliders: HTMLElement,\n hue: SVGSVGElement,\n hueDragger: SVGSVGElement,\n saturation: SVGLinearGradientElement,\n } = {} as any;\n private hexInputField: InputField;\n private rgbInputField: InputField;\n public onChange: (color: ReturnType) => void;\n\n constructor() {\n this.container = document.createElement('div');\n this.container.classList.add(ColorPicker.BASE_CLASS);\n\n const html = `\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 `;\n\n this.container.innerHTML = html;\n\n this.elements.box = this.container.firstElementChild as any;\n this.elements.boxDragger = this.elements.box.lastElementChild as any;\n this.elements.saturation = this.elements.box.firstElementChild.firstElementChild as any;\n\n this.elements.sliders = this.elements.box.nextElementSibling as any;\n\n this.elements.hue = this.elements.sliders.firstElementChild as any;\n this.elements.hueDragger = this.elements.hue.lastElementChild as any;\n\n this.hexInputField = new InputField({plainText: true, label: 'Appearance.Color.Hex'});\n this.rgbInputField = new InputField({plainText: true, label: 'Appearance.Color.RGB'});\n\n const inputs = document.createElement('div');\n inputs.className = ColorPicker.BASE_CLASS + '-inputs';\n inputs.append(this.hexInputField.container, this.rgbInputField.container);\n this.container.append(inputs);\n\n this.hexInputField.input.addEventListener('input', () => {\n let value = this.hexInputField.value.replace(/#/g, '').slice(0, 6);\n\n const match = value.match(/([a-fA-F\\d]+)/);\n const valid = match && match[0].length === value.length && [/* 3, 4, */6].includes(value.length);\n this.hexInputField.setState(valid ? InputState.Neutral : InputState.Error);\n\n value = '#' + value;\n this.hexInputField.setValueSilently(value);\n\n if(valid) {\n this.setColor(value, false, true);\n }\n });\n\n // patched https://stackoverflow.com/a/34029238/6758968\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])\\)?)$/;\n this.rgbInputField.input.addEventListener('input', () => {\n const match = this.rgbInputField.value.match(rgbRegExp);\n this.rgbInputField.setState(match ? InputState.Neutral : InputState.Error);\n\n if(match) {\n this.setColor(rgbaToHsla(+match[1], +match[2], +match[3]), true, false);\n }\n });\n\n this.attachBoxListeners();\n this.attachHueListeners();\n }\n\n private onGrabStart = () => {\n document.documentElement.style.cursor = this.elements.boxDragger.style.cursor = 'grabbing';\n };\n\n private onGrabEnd = () => {\n document.documentElement.style.cursor = this.elements.boxDragger.style.cursor = '';\n };\n\n private attachBoxListeners() {\n attachGrabListeners(this.elements.box as any, () => {\n this.onGrabStart();\n this.boxRect = this.elements.box.getBoundingClientRect();\n // this.boxDraggerRect = this.elements.boxDragger.getBoundingClientRect();\n }, (pos) => {\n this.saturationHandler(pos.x, pos.y);\n }, () => {\n this.onGrabEnd();\n });\n }\n\n private attachHueListeners() {\n attachGrabListeners(this.elements.hue as any, () => {\n this.onGrabStart();\n this.hueRect = this.elements.hue.getBoundingClientRect();\n // this.hueDraggerRect = this.elements.hueDragger.getBoundingClientRect();\n }, (pos) => {\n this.hueHandler(pos.x);\n }, () => {\n this.onGrabEnd();\n });\n }\n\n public setColor(color: ColorHsla | string, updateHexInput = true, updateRgbInput = true) {\n if(color === undefined) { // * set to red\n color = {\n h: 0,\n s: 100,\n l: 50,\n a: 1\n };\n } else if(typeof(color) === 'string') {\n if(color[0] === '#') {\n color = hexaToHsla(color);\n } else {\n const rgb = color.match(/[.?\\d]+/g);\n color = rgbaToHsla(+rgb[0], +rgb[1], +rgb[2], rgb[3] === undefined ? 1 : +rgb[3]);\n }\n }\n\n // Set box\n this.boxRect = this.elements.box.getBoundingClientRect();\n\n const boxX = this.boxRect.width / 100 * color.s;\n const percentY = 100 - (color.l / (100 - color.s / 2)) * 100;\n const boxY = this.boxRect.height / 100 * percentY;\n\n this.saturationHandler(this.boxRect.left + boxX, this.boxRect.top + boxY, false);\n\n // Set hue\n this.hueRect = this.elements.hue.getBoundingClientRect();\n\n const percentHue = color.h / 360;\n const hueX = this.hueRect.left + this.hueRect.width * percentHue;\n\n this.hueHandler(hueX, false);\n\n // Set values\n this.hue = color.h;\n this.saturation = color.s;\n this.lightness = color.l;\n this.alpha = color.a;\n\n this.updatePicker(updateHexInput, updateRgbInput);\n };\n\n public getCurrentColor(): ColorPickerColor {\n const rgbaArray = hslaToRgba(this.hue, this.saturation, this.lightness, this.alpha);\n const hexa = rgbaToHexa(rgbaArray);\n const hex = hexa.slice(0, -2);\n\n return {\n hsl: `hsl(${this.hue}, ${this.saturation}%, ${this.lightness}%)`,\n rgb: `rgb(${rgbaArray[0]}, ${rgbaArray[1]}, ${rgbaArray[2]})`,\n hex: hex,\n hsla: `hsla(${this.hue}, ${this.saturation}%, ${this.lightness}%, ${this.alpha})`,\n rgba: `rgba(${rgbaArray[0]}, ${rgbaArray[1]}, ${rgbaArray[2]}, ${rgbaArray[3]})`,\n hexa: hexa,\n rgbaArray: rgbaArray\n };\n }\n\n public updatePicker(updateHexInput = true, updateRgbInput = true) {\n const color = this.getCurrentColor();\n this.elements.boxDragger.setAttributeNS(null, 'fill', color.hex);\n\n if(updateHexInput) {\n this.hexInputField.setValueSilently(color.hex);\n this.hexInputField.setState(InputState.Neutral);\n }\n\n if(updateRgbInput) {\n this.rgbInputField.setValueSilently(color.rgbaArray.slice(0, -1).join(', '));\n this.rgbInputField.setState(InputState.Neutral);\n }\n\n if(this.onChange) {\n this.onChange(color);\n }\n }\n\n private hueHandler(pageX: number, update = true) {\n const eventX = clamp(pageX - this.hueRect.left, 0, this.hueRect.width);\n\n const percents = eventX / this.hueRect.width;\n this.hue = Math.round(360 * percents);\n\n const hsla = `hsla(${this.hue}, 100%, 50%, ${this.alpha})`;\n\n this.elements.hueDragger.setAttributeNS(null, 'x', (percents * 100) + '%');\n this.elements.hueDragger.setAttributeNS(null, 'fill', hsla);\n\n this.elements.saturation.lastElementChild.setAttributeNS(null, 'stop-color', hsla);\n\n if(update) {\n this.updatePicker();\n }\n }\n\n private saturationHandler(pageX: number, pageY: number, update = true) {\n const maxX = this.boxRect.width;\n const maxY = this.boxRect.height;\n\n const eventX = clamp(pageX - this.boxRect.left, 0, maxX);\n const eventY = clamp(pageY - this.boxRect.top, 0, maxY);\n\n const posX = eventX / maxX * 100;\n const posY = eventY / maxY * 100;\n\n const boxDragger = this.elements.boxDragger;\n boxDragger.setAttributeNS(null, 'x', posX + '%');\n boxDragger.setAttributeNS(null, 'y', posY + '%');\n\n const saturation = clamp(posX, 0, 100);\n\n const lightnessX = 100 - saturation / 2;\n const lightnessY = 100 - clamp(posY, 0, 100);\n\n const lightness = clamp(lightnessY / 100 * lightnessX, 0, 100);\n\n this.saturation = saturation;\n this.lightness = lightness;\n\n if(update) {\n this.updatePicker();\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 {AppTheme} from '../../../config/state';\nimport {hexaToRgba} from '../../../helpers/color';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport highlightningColor from '../../../helpers/highlightningColor';\nimport throttle from '../../../helpers/schedulers/throttle';\nimport themeController from '../../../helpers/themeController';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport rootScope from '../../../lib/rootScope';\nimport ColorPicker, {ColorPickerColor} from '../../colorPicker';\nimport SettingSection from '../../settingSection';\nimport {SliderSuperTab} from '../../slider';\nimport {WallPaper} from '../../../layer';\n\nexport default class AppBackgroundColorTab extends SliderSuperTab {\n private colorPicker: ColorPicker;\n private grid: HTMLElement;\n private applyColor: (hex: string, updateColorPicker?: boolean) => void;\n private theme: AppTheme;\n\n init() {\n this.container.classList.add('background-container', 'background-color-container');\n this.setTitle('SetColor');\n\n this.theme = themeController.getTheme();\n\n const section = new SettingSection({});\n this.colorPicker = new ColorPicker();\n\n section.content.append(this.colorPicker.container);\n\n this.scrollable.append(section.container);\n\n const gridSection = new SettingSection({});\n\n const grid = this.grid = document.createElement('div');\n grid.classList.add('grid');\n\n const colors = [\n '#E6EBEE',\n '#B2CEE1',\n '#008DD0',\n '#C6E7CB',\n '#C4E1A6',\n '#60B16E',\n '#CCD0AF',\n '#A6A997',\n '#7A7072',\n '#FDD7AF',\n '#FDB76E',\n '#DD8851'\n ];\n\n colors.forEach((color) => {\n const item = document.createElement('div');\n item.classList.add('grid-item');\n item.dataset.color = color.toLowerCase();\n\n // * need for transform scale\n const media = document.createElement('div');\n media.classList.add('grid-item-media');\n media.style.backgroundColor = color;\n\n item.append(media);\n grid.append(item);\n });\n\n attachClickEvent(grid, (e) => {\n const target = findUpClassName(e.target, 'grid-item');\n if(!target || target.classList.contains('active')) {\n return;\n }\n\n const color = target.dataset.color;\n if(!color) {\n return;\n }\n\n this.applyColor(color);\n }, {listenerSetter: this.listenerSetter});\n\n gridSection.content.append(grid);\n this.scrollable.append(gridSection.container);\n\n this.applyColor = throttle(this._applyColor, 16, true);\n }\n\n private setActive() {\n const active = this.grid.querySelector('.active');\n const background = this.theme.settings;\n const wallPaper = background.wallpaper;\n const color = wallPaper.settings.background_color;\n const target = color ? this.grid.querySelector(`.grid-item[data-color=\"${color}\"]`) : null;\n if(active === target) {\n return;\n }\n\n if(active) {\n active.classList.remove('active');\n }\n\n if(target) {\n target.classList.add('active');\n }\n }\n\n private _applyColor = (hex: string, updateColorPicker = true) => {\n if(updateColorPicker) {\n this.colorPicker.setColor(hex);\n } else {\n const rgba = hexaToRgba(hex);\n const settings = this.theme.settings;\n const hsla = highlightningColor(rgba);\n\n const wallPaper: WallPaper.wallPaperNoFile = {\n _: 'wallPaperNoFile',\n id: 0,\n pFlags: {},\n settings: {\n _: 'wallPaperSettings',\n background_color: parseInt(hex.slice(1), 16),\n pFlags: {}\n }\n };\n\n settings.wallpaper = wallPaper;\n settings.highlightningColor = hsla;\n\n this.managers.appStateManager.pushToState('settings', rootScope.settings);\n\n appImManager.applyCurrentTheme(undefined, undefined, true);\n this.setActive();\n }\n };\n\n private onColorChange = (color: ColorPickerColor) => {\n this.applyColor(color.hex, false);\n };\n\n onOpen() {\n setTimeout(() => {\n const settings = this.theme.settings;\n const color = settings?.wallpaper?.settings?.background_color;\n\n const isColored = !!color && settings.wallpaper._ === 'wallPaperNoFile';\n\n // * set active if type is color\n if(isColored) {\n this.colorPicker.onChange = this.onColorChange;\n }\n\n this.colorPicker.setColor((color && '#' + color.toString(16)) || '#cccccc');\n\n if(!isColored) {\n this.colorPicker.onChange = this.onColorChange;\n }\n }, 0);\n }\n\n onCloseAfterTimeout() {\n this.colorPicker.onChange = undefined;\n this.colorPicker = undefined;\n\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 {averageColor, averageColorFromCanvas} from '../../../helpers/averageColor';\nimport blur from '../../../helpers/blur';\nimport deferredPromise, {CancellablePromise} from '../../../helpers/cancellablePromise';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport highlightningColor from '../../../helpers/highlightningColor';\nimport copy from '../../../helpers/object/copy';\nimport sequentialDom from '../../../helpers/sequentialDom';\nimport ChatBackgroundGradientRenderer from '../../chat/gradientRenderer';\nimport {Document, PhotoSize, WallPaper, WebDocument} from '../../../layer';\nimport {MyDocument} from '../../../lib/appManagers/appDocsManager';\nimport appDownloadManager, {AppDownloadManager, DownloadBlob} from '../../../lib/appManagers/appDownloadManager';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport rootScope from '../../../lib/rootScope';\nimport Button from '../../button';\nimport CheckboxField from '../../checkboxField';\nimport ProgressivePreloader from '../../preloader';\nimport {SliderSuperTab} from '../../slider';\nimport AppBackgroundColorTab from './backgroundColor';\nimport choosePhotoSize from '../../../lib/appManagers/utils/photos/choosePhotoSize';\nimport {STATE_INIT, AppTheme} from '../../../config/state';\nimport themeController from '../../../helpers/themeController';\nimport requestFile from '../../../helpers/files/requestFile';\nimport {renderImageFromUrlPromise} from '../../../helpers/dom/renderImageFromUrl';\nimport scaleMediaElement from '../../../helpers/canvas/scaleMediaElement';\nimport {MediaSize} from '../../../helpers/mediaSize';\nimport wrapPhoto from '../../wrappers/photo';\nimport {CreateRowFromCheckboxField} from '../../row';\nimport {generateSection} from '../../settingSection';\nimport {getColorsFromWallPaper} from '../../../helpers/color';\n\nexport default class AppBackgroundTab extends SliderSuperTab {\n public static tempId = 0;\n private grid: HTMLElement;\n private clicked: Set = new Set();\n private blurCheckboxField: CheckboxField;\n\n private wallPapersByElement: Map = new Map();\n private elementsByKey: Map = new Map();\n\n public static getInitArgs() {\n return {\n backgrounds: rootScope.managers.appThemesManager.getWallPapers()\n };\n }\n\n private get theme() {\n return themeController.getTheme();\n }\n\n public init(p: ReturnType = AppBackgroundTab.getInitArgs()) {\n this.container.classList.add('background-container', 'background-image-container');\n this.setTitle('ChatBackground');\n\n {\n const container = generateSection(this.scrollable);\n\n const uploadButton = Button('btn-primary btn-transparent', {icon: 'cameraadd', text: 'ChatBackground.UploadWallpaper'});\n const colorButton = Button('btn-primary btn-transparent', {icon: 'colorize', text: 'SetColor'});\n const resetButton = Button('btn-primary btn-transparent', {icon: 'favourites', text: 'Appearance.Reset'});\n\n attachClickEvent(uploadButton, this.onUploadClick, {listenerSetter: this.listenerSetter});\n\n attachClickEvent(colorButton, () => {\n this.slider.createTab(AppBackgroundColorTab).open();\n }, {listenerSetter: this.listenerSetter});\n\n attachClickEvent(resetButton, this.onResetClick, {listenerSetter: this.listenerSetter});\n\n const wallPaper = this.theme.settings?.wallpaper;\n const blurCheckboxField = this.blurCheckboxField = new CheckboxField({\n text: 'ChatBackground.Blur',\n name: 'blur',\n checked: (wallPaper as WallPaper.wallPaper)?.settings?.pFlags?.blur\n });\n\n this.listenerSetter.add(blurCheckboxField.input)('change', async() => {\n this.theme.settings.wallpaper.settings.pFlags.blur = blurCheckboxField.input.checked || undefined;\n await this.managers.appStateManager.pushToState('settings', rootScope.settings);\n\n // * wait for animation end\n setTimeout(() => {\n const active = grid.querySelector('.active') as HTMLElement;\n if(!active) return;\n\n const wallpaper = this.wallPapersByElement.get(active);\n if((wallpaper as WallPaper.wallPaper).pFlags.pattern || wallpaper._ === 'wallPaperNoFile') {\n return;\n }\n\n AppBackgroundTab.setBackgroundDocument(wallpaper);\n }, 100);\n });\n\n container.append(\n uploadButton,\n colorButton,\n resetButton,\n CreateRowFromCheckboxField(blurCheckboxField).container\n );\n }\n\n rootScope.addEventListener('background_change', this.setActive);\n\n const promise = p.backgrounds.then((wallPapers) => {\n const promises = wallPapers.map((wallPaper) => {\n return this.addWallPaper(wallPaper);\n });\n\n return Promise.all(promises);\n });\n\n const gridContainer = generateSection(this.scrollable);\n const grid = this.grid = document.createElement('div');\n grid.classList.add('grid');\n attachClickEvent(grid, this.onGridClick, {listenerSetter: this.listenerSetter});\n gridContainer.append(grid);\n\n return promise;\n }\n\n private onUploadClick = () => {\n requestFile('image/x-png,image/png,image/jpeg').then(async(file) => {\n if(file.name.endsWith('.png')) {\n const img = document.createElement('img');\n const url = URL.createObjectURL(file);\n await renderImageFromUrlPromise(img, url, false);\n const mimeType = 'image/jpeg';\n const {blob} = await scaleMediaElement({media: img, size: new MediaSize(img.naturalWidth, img.naturalHeight), mimeType});\n file = new File([blob], file.name.replace(/\\.png$/, '.jpg'), {type: mimeType});\n }\n\n const wallPaper = await this.managers.appDocsManager.prepareWallPaperUpload(file);\n const uploadPromise = this.managers.appDocsManager.uploadWallPaper(wallPaper.id);\n const uploadDeferred: CancellablePromise = appDownloadManager.getNewDeferredForUpload(file.name, uploadPromise);\n\n const deferred = deferredPromise();\n deferred.addNotifyListener = uploadDeferred.addNotifyListener;\n deferred.cancel = uploadDeferred.cancel;\n\n uploadDeferred.then((wallPaper) => {\n this.clicked.delete(key);\n this.elementsByKey.delete(key);\n this.wallPapersByElement.set(container, wallPaper);\n const newKey = this.getWallPaperKey(wallPaper);\n this.elementsByKey.set(newKey, container);\n\n AppBackgroundTab.setBackgroundDocument(wallPaper).then(deferred.resolve, deferred.reject);\n }, deferred.reject);\n\n const key = this.getWallPaperKey(wallPaper);\n deferred.catch(() => {\n container.remove();\n });\n\n const preloader = new ProgressivePreloader({\n isUpload: true,\n cancelable: true,\n tryAgainOnFail: false\n });\n\n const {container} = await this.addWallPaper(wallPaper, false);\n this.clicked.add(key);\n\n preloader.attach(container, false, deferred);\n });\n };\n\n private onResetClick = () => {\n const defaultTheme = STATE_INIT.settings.themes.find((t) => t.name === this.theme.name);\n if(defaultTheme) {\n ++AppBackgroundTab.tempId;\n this.theme.settings = copy(defaultTheme.settings);\n this.managers.appStateManager.pushToState('settings', rootScope.settings);\n appImManager.applyCurrentTheme(undefined, undefined, true);\n this.blurCheckboxField.setValueSilently(this.theme.settings?.wallpaper?.settings?.pFlags?.blur);\n }\n };\n\n private getWallPaperKey(wallPaper: WallPaper) {\n return '' + wallPaper.id;\n }\n\n private getWallPaperKeyFromTheme(theme: AppTheme) {\n return '' + (this.getWallPaperKey(theme.settings?.wallpaper) || '');\n }\n\n public static addWallPaper(\n wallPaper: WallPaper,\n container = document.createElement('div')\n ) {\n const colors = getColorsFromWallPaper(wallPaper);\n const hasFile = wallPaper._ === 'wallPaper';\n if((hasFile && wallPaper.pFlags.pattern && !colors)/* ||\n (wallpaper.document as MyDocument).mime_type.indexOf('application/') === 0 */) {\n return;\n }\n\n const isDark = !!wallPaper.pFlags.dark;\n\n let doc: WebDocument.webDocumentNoProxy | Document.document = hasFile ? wallPaper.document as Document.document : undefined;\n if(hasFile && !doc) {\n doc = {\n _: 'webDocumentNoProxy',\n attributes: [],\n size: 100000,\n url: 'assets/img/pattern.svg',\n w: 1440,\n h: 2960,\n mime_type: 'image/svg+xml'\n };\n }\n\n container.classList.add('background-item');\n container.dataset.id = '' + wallPaper.id;\n\n const media = document.createElement('div');\n media.classList.add('background-item-media');\n\n const loadPromises: Promise[] = [];\n let wrapped: ReturnType, size: ReturnType;\n if(hasFile) {\n size = choosePhotoSize(doc, 200, 200);\n wrapped = wrapPhoto({\n photo: doc,\n message: null,\n container: media,\n withoutPreloader: true,\n size,\n noFadeIn: wallPaper.pFlags.pattern\n });\n\n if(wallPaper.pFlags.pattern) {\n media.classList.add('is-pattern');\n }\n\n const promise = wrapped.then(async({loadPromises, images}) => {\n await loadPromises.thumb || loadPromises.full;\n return images;\n }).then((images) => {\n if(wallPaper.pFlags.pattern) {\n if(isDark) {\n images.full.style.display = 'none';\n if(images.thumb) {\n images.thumb.style.display = 'none';\n }\n } else if(wallPaper.settings?.intensity) {\n images.full.style.opacity = '' + Math.abs(wallPaper.settings.intensity) / 100;\n }\n }\n\n return sequentialDom.mutate(() => {\n container.append(media);\n });\n });\n\n loadPromises.push(promise);\n } else {\n container.append(media);\n }\n\n if(wallPaper.settings?.background_color) {\n const {canvas} = ChatBackgroundGradientRenderer.create(colors);\n canvas.classList.add('background-colors-canvas');\n\n if(isDark && hasFile) {\n const promise = wrapped.then(({loadPromises}) => {\n return loadPromises.full.then(async() => {\n const cacheContext = await rootScope.managers.thumbsStorage.getCacheContext(doc, size.type);\n canvas.style.webkitMaskImage = `url(${cacheContext.url})`;\n canvas.style.opacity = '' + (wallPaper.pFlags.dark ? 100 + wallPaper.settings.intensity : wallPaper.settings.intensity) / 100;\n media.append(canvas);\n });\n });\n\n loadPromises.push(promise);\n } else {\n media.append(canvas);\n }\n }\n\n return {\n container,\n media,\n loadPromise: Promise.all(loadPromises)\n };\n }\n\n private addWallPaper(wallPaper: WallPaper, append = true) {\n const result = AppBackgroundTab.addWallPaper(wallPaper);\n if(result) {\n const {container, media} = result;\n container.classList.add('grid-item');\n media.classList.add('grid-item-media');\n\n const key = this.getWallPaperKey(wallPaper);\n this.wallPapersByElement.set(container, wallPaper);\n this.elementsByKey.set(key, container);\n\n if(this.getWallPaperKeyFromTheme(this.theme) === key) {\n container.classList.add('active');\n }\n\n this.grid[append ? 'append' : 'prepend'](container);\n }\n\n return result && result.loadPromise.then(() => result);\n }\n\n private onGridClick = (e: MouseEvent | TouchEvent) => {\n const target = findUpClassName(e.target, 'grid-item') as HTMLElement;\n if(!target) return;\n\n const wallpaper = this.wallPapersByElement.get(target);\n if(wallpaper._ === 'wallPaperNoFile') {\n AppBackgroundTab.setBackgroundDocument(wallpaper);\n return;\n }\n\n const key = this.getWallPaperKey(wallpaper);\n if(this.clicked.has(key)) return;\n this.clicked.add(key);\n\n const doc = wallpaper.document as MyDocument;\n const preloader = new ProgressivePreloader({\n cancelable: true,\n tryAgainOnFail: false\n });\n\n const load = async() => {\n const promise = AppBackgroundTab.setBackgroundDocument(wallpaper);\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc);\n if(!cacheContext.url || this.theme.settings?.wallpaper?.settings?.pFlags?.blur) {\n preloader.attach(target, true, promise);\n }\n };\n\n preloader.construct();\n\n attachClickEvent(target, (e) => {\n if(preloader.preloader.parentElement) {\n preloader.onClick(e);\n preloader.detach();\n } else {\n load();\n }\n }, {listenerSetter: this.listenerSetter});\n\n load();\n\n // console.log(doc);\n };\n\n public static setBackgroundDocument = (wallPaper: WallPaper, themeSettings?: AppTheme['settings']) => {\n const _tempId = ++this.tempId;\n const middleware = () => _tempId === this.tempId;\n\n const doc = (wallPaper as WallPaper.wallPaper).document as MyDocument;\n const deferred = deferredPromise();\n let download: Promise | ReturnType;\n if(doc) {\n download = appDownloadManager.downloadMediaURL({\n media: doc,\n queueId: appImManager.chat.bubbles ? appImManager.chat.bubbles.lazyLoadQueue.queueId : 0\n });\n deferred.addNotifyListener = download.addNotifyListener;\n deferred.cancel = download.cancel;\n } else {\n download = Promise.resolve();\n }\n\n const saveToCache = (slug: string, url: string) => {\n fetch(url).then((response) => {\n appImManager.cacheStorage.save('backgrounds/' + slug, response);\n });\n };\n\n download.then(async() => {\n if(!middleware()) {\n deferred.resolve();\n return;\n }\n\n const hadSettings = !!themeSettings;\n themeSettings ??= themeController.getTheme().settings;\n const onReady = (url?: string) => {\n let getPixelPromise: Promise;\n const backgroundColor = getColorsFromWallPaper(wallPaper);\n if(url && !backgroundColor) {\n getPixelPromise = averageColor(url);\n } else {\n const {canvas} = ChatBackgroundGradientRenderer.create(backgroundColor);\n getPixelPromise = Promise.resolve(averageColorFromCanvas(canvas));\n }\n\n const slug = (wallPaper as WallPaper.wallPaper).slug ?? '';\n Promise.all([\n getPixelPromise,\n slug && saveToCache(slug, url)\n ]).then(([pixel]) => {\n if(!middleware()) {\n deferred.resolve();\n return;\n }\n\n const hsla = highlightningColor(Array.from(pixel) as any);\n\n themeSettings.wallpaper = wallPaper;\n themeSettings.highlightningColor = hsla;\n\n if(!hadSettings) {\n rootScope.managers.appStateManager.pushToState('settings', rootScope.settings);\n }\n\n appImManager.applyCurrentTheme(slug, url, true).then(deferred.resolve);\n });\n };\n\n if(!doc) {\n onReady();\n return;\n }\n\n const cacheContext = await rootScope.managers.thumbsStorage.getCacheContext(doc);\n if(themeSettings.wallpaper?.settings?.pFlags?.blur) {\n setTimeout(() => {\n const {canvas, promise} = blur(cacheContext.url, 12, 4);\n promise.then(() => {\n if(!middleware()) {\n deferred.resolve();\n return;\n }\n\n onReady(canvas.toDataURL());\n });\n }, 200);\n } else if(middleware()) {\n onReady(cacheContext.url);\n }\n });\n\n return deferred;\n };\n\n private setActive = () => {\n const active = this.grid.querySelector('.active');\n const target = this.elementsByKey.get(this.getWallPaperKeyFromTheme(this.theme));\n if(active === target) {\n return;\n }\n\n if(active) {\n active.classList.remove('active');\n }\n\n if(target) {\n target.classList.add('active');\n }\n };\n}\n","export default function requestFile(accept?: string) {\n const input = document.createElement('input');\n input.type = 'file';\n input.style.display = 'none';\n\n if(accept) {\n input.accept = accept;\n }\n\n document.body.append(input);\n\n const promise = new Promise((resolve, reject) => {\n input.addEventListener('change', (e: any) => {\n const file: File = e.target.files[0];\n if(!file) {\n reject('NO_FILE_SELECTED');\n return;\n }\n\n resolve(file);\n }, {once: true});\n }).finally(() => {\n input.remove();\n });\n\n input.click();\n\n return promise;\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 AppSelectPeers from '../../appSelectPeers';\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport {MyDialogFilter as DialogFilter} from '../../../lib/storages/filters';\nimport ButtonIcon from '../../buttonIcon';\nimport CheckboxField from '../../checkboxField';\nimport Button from '../../button';\nimport AppEditFolderTab from './editFolder';\nimport I18n, {i18n, LangPackKey, _i18n, join} from '../../../lib/langPack';\nimport {toast} from '../../toast';\nimport copy from '../../../helpers/object/copy';\nimport forEachReverse from '../../../helpers/array/forEachReverse';\nimport setInnerHTML from '../../../helpers/dom/setInnerHTML';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport {REAL_FOLDERS} from '../../../lib/mtproto/mtproto_config';\nimport rootScope from '../../../lib/rootScope';\nimport {MTAppConfig} from '../../../lib/mtproto/appConfig';\nimport {attachClickEvent, simulateClickEvent} from '../../../helpers/dom/clickEvent';\nimport SettingSection from '../../settingSection';\n\nexport default class AppIncludedChatsTab extends SliderSuperTab {\n private editFolderTab: AppEditFolderTab;\n private confirmBtn: HTMLElement;\n\n private selector: AppSelectPeers;\n private type: 'included' | 'excluded';\n private filter: DialogFilter;\n private originalFilter: DialogFilter;\n\n private dialogsByFilters: Map>;\n private limit: number;\n\n public init(\n filter: DialogFilter,\n type: 'included' | 'excluded',\n editFolderTab: AppIncludedChatsTab['editFolderTab']\n ) {\n this.originalFilter = filter;\n this.filter = copy(this.originalFilter);\n this.type = type;\n this.editFolderTab = editFolderTab;\n\n this.content.remove();\n this.container.classList.add('included-chatlist-container');\n this.confirmBtn = ButtonIcon('check btn-confirm blue', {noRipple: true});\n this.confirmBtn.style.display = 'none';\n\n this.header.append(this.confirmBtn);\n\n attachClickEvent(this.confirmBtn, async() => {\n const selected = this.selector.getSelected();\n\n // this.filter.pFlags = {};\n\n if(this.type === 'included') {\n for(const key in this.filter.pFlags) {\n if(key.indexOf('exclude_') === 0) {\n continue;\n }\n\n // @ts-ignore\n delete this.filter.pFlags[key];\n }\n } else {\n for(const key in this.filter.pFlags) {\n if(key.indexOf('exclude_') !== 0) {\n continue;\n }\n\n // @ts-ignore\n delete this.filter.pFlags[key];\n }\n }\n\n const peerIds: PeerId[] = [];\n for(const key of selected) {\n if(key.isPeerId()) {\n peerIds.push(key.toPeerId());\n } else {\n // @ts-ignore\n this.filter.pFlags[key] = true;\n }\n }\n\n let cmp: (peerId: PeerId) => boolean;\n if(this.type === 'included') {\n cmp = (peerId) => peerIds.includes(peerId);\n } else {\n cmp = (peerId) => !peerIds.includes(peerId);\n }\n\n forEachReverse(this.filter.pinnedPeerIds, (peerId, idx) => {\n if(!cmp(peerId)) {\n this.filter.pinnedPeerIds.splice(idx, 1);\n this.filter.pinned_peers.splice(idx, 1);\n }\n });\n\n const other = this.type === 'included' ? 'excludePeerIds' : 'includePeerIds';\n const otherLegacy = this.type === 'included' ? 'exclude_peers' : 'include_peers';\n forEachReverse(this.filter[other], (peerId, idx) => {\n if(peerIds.includes(peerId)) {\n this.filter[other].splice(idx, 1);\n this.filter[otherLegacy].splice(idx, 1);\n }\n });\n\n this.filter[this.type === 'included' ? 'includePeerIds' : 'excludePeerIds'] = peerIds;\n this.filter[this.type === 'included' ? 'include_peers' : 'exclude_peers'] = await Promise.all(peerIds.map((peerId) => this.managers.appPeersManager.getInputPeerById(peerId)));\n // this.filter.pinned_peers = this.filter.pinned_peers.filter((peerId) => this.filter.include_peers.includes(peerId));\n\n this.editFolderTab.setFilter(this.filter, false);\n this.close();\n }, {listenerSetter: this.listenerSetter});\n\n const onAppConfig = (appConfig: MTAppConfig) => {\n this.limit = rootScope.premium ? appConfig.dialog_filters_chats_limit_premium : appConfig.dialog_filters_chats_limit_default;\n };\n\n this.listenerSetter.add(rootScope)('app_config', onAppConfig);\n\n this.dialogsByFilters = new Map();\n return Promise.all([\n this.managers.filtersStorage.getDialogFilters().then(async(filters) => {\n await Promise.all(filters.filter((filter) => !REAL_FOLDERS.has(filter.id)).map(async(filter) => {\n const dialogs = await this.managers.dialogsStorage.getFolderDialogs(filter.id);\n const peerIds = dialogs.map((d) => d.peerId);\n this.dialogsByFilters.set(filter, new Set(peerIds));\n }));\n }),\n\n this.managers.apiManager.getAppConfig().then((appConfig) => {\n onAppConfig(appConfig);\n })\n ]);\n }\n\n checkbox(selected?: boolean) {\n const checkboxField = new CheckboxField({\n round: true\n });\n if(selected) {\n checkboxField.input.checked = selected;\n }\n\n return checkboxField.label;\n }\n\n renderResults = async(peerIds: PeerId[]) => {\n // const other = this.type === 'included' ? this.filter.exclude_peers : this.filter.include_peers;\n\n await this.managers.appUsersManager.getContacts();\n peerIds.forEach((peerId) => {\n // if(other.includes(peerId)) return;\n\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: this.selector.scrollable,\n rippleEnabled: true,\n avatarSize: 'abitbigger'\n });\n\n const selected = this.selector.selected.has(peerId);\n dom.containerEl.append(this.checkbox(selected));\n // if(selected) dom.listEl.classList.add('active');\n\n const foundInFilters: HTMLElement[] = [];\n this.dialogsByFilters.forEach((dialogs, filter) => {\n if(dialogs.has(peerId)) {\n const span = document.createElement('span');\n setInnerHTML(span, wrapEmojiText(filter.title));\n foundInFilters.push(span);\n }\n });\n\n const joined = join(foundInFilters, false);\n joined.forEach((el) => {\n dom.lastMessageSpan.append(el);\n });\n });\n };\n\n onOpen() {\n this.confirmBtn.style.display = this.type === 'excluded' ? '' : 'none';\n this.setTitle(this.type === 'included' ? 'FilterAlwaysShow' : 'FilterNeverShow');\n\n const filter = this.filter;\n\n const categoriesSection = new SettingSection({\n noDelimiter: true,\n name: 'FilterChatTypes'\n });\n\n categoriesSection.container.classList.add('folder-categories');\n\n let details: {[flag: string]: {ico: string, text: LangPackKey}};\n if(this.type === 'excluded') {\n details = {\n exclude_muted: {ico: 'mute', text: 'ChatList.Filter.MutedChats'},\n exclude_archived: {ico: 'archive', text: 'ChatList.Filter.Archive'},\n exclude_read: {ico: 'readchats', text: 'ChatList.Filter.ReadChats'}\n };\n } else {\n details = {\n contacts: {ico: 'newprivate', text: 'ChatList.Filter.Contacts'},\n non_contacts: {ico: 'noncontacts', text: 'ChatList.Filter.NonContacts'},\n groups: {ico: 'group', text: 'ChatList.Filter.Groups'},\n broadcasts: {ico: 'newchannel', text: 'ChatList.Filter.Channels'},\n bots: {ico: 'bots', text: 'ChatList.Filter.Bots'}\n };\n }\n\n const f = document.createDocumentFragment();\n for(const key in details) {\n const button = Button('btn-primary btn-transparent folder-category-button', {icon: details[key].ico, text: details[key].text});\n button.dataset.peerId = key;\n button.append(this.checkbox());\n f.append(button);\n }\n categoriesSection.content.append(f);\n\n // ///////////////\n\n const selectedPeers = (this.type === 'included' ? filter.includePeerIds : filter.excludePeerIds).slice();\n\n this.selector = new AppSelectPeers({\n appendTo: this.container,\n onChange: this.onSelectChange,\n peerType: ['dialogs'],\n renderResultsFunc: this.renderResults,\n placeholder: 'Search',\n sectionNameLangPackKey: 'FilterChats',\n managers: this.managers\n });\n this.selector.selected = new Set(selectedPeers);\n\n let addedInitial = false;\n const _add = this.selector.add.bind(this.selector);\n this.selector.add = (peerId, title, scroll) => {\n if(this.selector.selected.size >= this.limit && addedInitial && !details[peerId]) {\n const el: HTMLInputElement = this.selector.list.querySelector(`[data-peer-id=\"${peerId}\"] [type=\"checkbox\"]`);\n if(el) {\n setTimeout(() => {\n el.checked = false;\n }, 0);\n }\n\n const str = I18n.format(this.type === 'excluded' ? 'ChatList.Filter.Exclude.LimitReached': 'ChatList.Filter.Include.LimitReached', true);\n toast(str);\n return;\n }\n\n const div = _add(peerId, details[peerId] ? i18n(details[peerId].text) : undefined, scroll);\n if(details[peerId]) {\n div.querySelector('avatar-element').classList.add('tgico-' + details[peerId].ico);\n }\n return div;\n };\n\n this.selector.scrollable.container.append(categoriesSection.container, this.selector.scrollable.container.lastElementChild);\n\n this.selector.addInitial(selectedPeers);\n addedInitial = true;\n\n for(const flag in filter.pFlags) {\n // @ts-ignore\n if(details.hasOwnProperty(flag) && !!filter.pFlags[flag]) {\n simulateClickEvent(categoriesSection.content.querySelector(`[data-peer-id=\"${flag}\"]`) as HTMLElement);\n }\n }\n }\n\n onSelectChange = (length: number) => {\n // const changed = !deepEqual(this.filter, this.originalFilter);\n if(this.type === 'included') {\n this.confirmBtn.style.display = length ? '' : 'none';\n }\n };\n\n onCloseAfterTimeout() {\n if(this.selector) {\n this.selector.container.remove();\n this.selector = null;\n }\n\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 appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport {MyDialogFilter as DialogFilter} from '../../../lib/storages/filters';\nimport lottieLoader, {LottieLoader} from '../../../lib/rlottie/lottieLoader';\nimport {SliderSuperTab} from '../../slider';\nimport {toast} from '../../toast';\nimport InputField from '../../inputField';\nimport ButtonIcon from '../../buttonIcon';\nimport ButtonMenuToggle from '../../buttonMenuToggle';\nimport {ButtonMenuItemOptions} from '../../buttonMenu';\nimport Button from '../../button';\nimport AppIncludedChatsTab from './includedChats';\nimport {i18n, LangPackKey} from '../../../lib/langPack';\nimport PopupPeer from '../../popups/peer';\nimport RLottiePlayer from '../../../lib/rlottie/rlottiePlayer';\nimport copy from '../../../helpers/object/copy';\nimport deepEqual from '../../../helpers/object/deepEqual';\nimport wrapDraftText from '../../../lib/richTextProcessor/wrapDraftText';\nimport filterAsync from '../../../helpers/array/filterAsync';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport SettingSection from '../../settingSection';\n\nconst MAX_FOLDER_NAME_LENGTH = 12;\n\nexport default class AppEditFolderTab extends SliderSuperTab {\n private caption: HTMLElement;\n private stickerContainer: HTMLElement;\n\n private confirmBtn: HTMLElement;\n private menuBtn: HTMLElement;\n private nameInputField: InputField;\n\n private includePeerIds: SettingSection;\n private excludePeerIds: SettingSection;\n private flags: {[k in 'contacts' | 'non_contacts' | 'groups' | 'broadcasts' | 'bots' | 'exclude_muted' | 'exclude_archived' | 'exclude_read']: HTMLElement} = {} as any;\n\n private animation: RLottiePlayer;\n private filter: DialogFilter;\n private originalFilter: DialogFilter;\n\n private type: 'edit' | 'create';\n private loadAnimationPromise: ReturnType;\n\n public static getInitArgs() {\n return {\n animationData: lottieLoader.loadAnimationFromURLManually('Folders_2')\n };\n }\n\n public init(p: ReturnType = AppEditFolderTab.getInitArgs()) {\n this.container.classList.add('edit-folder-container');\n this.caption = document.createElement('div');\n this.caption.classList.add('caption');\n this.caption.append(i18n('FilterIncludeExcludeInfo'));\n this.stickerContainer = document.createElement('div');\n this.stickerContainer.classList.add('sticker-container');\n\n this.confirmBtn = ButtonIcon('check btn-confirm hide blue');\n let deleting = false;\n const deleteFolderButton: ButtonMenuItemOptions = {\n icon: 'delete danger',\n text: 'FilterMenuDelete',\n onClick: () => {\n new PopupPeer('filter-delete', {\n titleLangKey: 'ChatList.Filter.Confirm.Remove.Header',\n descriptionLangKey: 'ChatList.Filter.Confirm.Remove.Text',\n buttons: [{\n langKey: 'Delete',\n callback: () => {\n if(deleting) {\n return;\n }\n\n deleting = true;\n\n this.managers.filtersStorage.updateDialogFilter(this.filter, true).then((bool) => {\n this.close();\n }).finally(() => {\n deleting = false;\n });\n },\n isDanger: true\n }]\n }).show();\n }\n };\n this.menuBtn = ButtonMenuToggle({\n listenerSetter: this.listenerSetter,\n direction: 'bottom-left',\n buttons: [deleteFolderButton]\n });\n this.menuBtn.classList.add('hide');\n\n this.header.append(this.confirmBtn, this.menuBtn);\n\n const inputSection = new SettingSection({});\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.nameInputField = new InputField({\n label: 'FilterNameHint',\n maxLength: MAX_FOLDER_NAME_LENGTH\n });\n\n inputWrapper.append(this.nameInputField.container);\n inputSection.content.append(inputWrapper);\n\n const generateList = (className: string, h2Text: LangPackKey, buttons: {icon: string, name?: string, withRipple?: true, text: LangPackKey}[], to: any) => {\n const section = new SettingSection({\n name: h2Text,\n noDelimiter: true\n });\n\n section.container.classList.add('folder-list', className);\n\n const categories = section.generateContentElement();\n categories.classList.add('folder-categories');\n\n buttons.forEach((o) => {\n const button = Button('folder-category-button btn btn-primary btn-transparent', {\n icon: o.icon,\n text: o.text,\n noRipple: o.withRipple ? undefined : true\n });\n\n if(o.name) {\n to[o.name] = button;\n }\n\n categories.append(button);\n });\n\n return section;\n };\n\n this.includePeerIds = generateList('folder-list-included', 'FilterInclude', [{\n icon: 'add primary',\n text: 'ChatList.Filter.Include.AddChat',\n withRipple: true\n }, {\n text: 'ChatList.Filter.Contacts',\n icon: 'newprivate',\n name: 'contacts'\n }, {\n text: 'ChatList.Filter.NonContacts',\n icon: 'noncontacts',\n name: 'non_contacts'\n }, {\n text: 'ChatList.Filter.Groups',\n icon: 'group',\n name: 'groups'\n }, {\n text: 'ChatList.Filter.Channels',\n icon: 'channel',\n name: 'broadcasts'\n }, {\n text: 'ChatList.Filter.Bots',\n icon: 'bots',\n name: 'bots'\n }], this.flags);\n\n this.excludePeerIds = generateList('folder-list-excluded', 'FilterExclude', [{\n icon: 'minus primary',\n text: 'ChatList.Filter.Exclude.AddChat',\n withRipple: true\n }, {\n text: 'ChatList.Filter.MutedChats',\n icon: 'mute',\n name: 'exclude_muted'\n }, {\n text: 'ChatList.Filter.Archive',\n icon: 'archive',\n name: 'exclude_archived'\n }, {\n text: 'ChatList.Filter.ReadChats',\n icon: 'readchats',\n name: 'exclude_read'\n }], this.flags);\n\n this.scrollable.append(this.stickerContainer, this.caption, inputSection.container, this.includePeerIds.container, this.excludePeerIds.container);\n\n const includedFlagsContainer = this.includePeerIds.container.querySelector('.folder-categories');\n const excludedFlagsContainer = this.excludePeerIds.container.querySelector('.folder-categories');\n\n attachClickEvent(includedFlagsContainer.querySelector('.btn') as HTMLElement, () => {\n this.slider.createTab(AppIncludedChatsTab).open(this.filter, 'included', this);\n }, {listenerSetter: this.listenerSetter});\n\n attachClickEvent(excludedFlagsContainer.querySelector('.btn') as HTMLElement, () => {\n this.slider.createTab(AppIncludedChatsTab).open(this.filter, 'excluded', this);\n }, {listenerSetter: this.listenerSetter});\n\n attachClickEvent(this.confirmBtn, () => {\n if(this.nameInputField.input.classList.contains('error')) {\n return;\n }\n\n if(!this.nameInputField.value.trim()) {\n this.nameInputField.input.classList.add('error');\n return;\n }\n\n let include = (Array.from(includedFlagsContainer.children) as HTMLElement[]).slice(1).reduce((acc, el) => acc + +!el.style.display, 0);\n include += this.filter.include_peers.length;\n\n if(!include) {\n toast('Please choose at least one chat for this folder.');\n return;\n }\n\n this.confirmBtn.setAttribute('disabled', 'true');\n\n let promise: Promise;\n if(!this.filter.id) {\n promise = this.managers.filtersStorage.createDialogFilter(this.filter);\n } else {\n promise = this.managers.filtersStorage.updateDialogFilter(this.filter);\n }\n\n promise.then((bool) => {\n this.close();\n }).catch((err) => {\n if(err.type === 'DIALOG_FILTERS_TOO_MUCH') {\n toast('Sorry, you can\\'t create more folders.');\n } else {\n console.error('updateDialogFilter error:', err);\n }\n }).finally(() => {\n this.confirmBtn.removeAttribute('disabled');\n });\n }, {listenerSetter: this.listenerSetter});\n\n this.listenerSetter.add(this.nameInputField.input)('input', () => {\n this.filter.title = this.nameInputField.value;\n this.editCheckForChange();\n });\n\n const reloadMissingPromises: Promise[] = this.type === 'edit' ? [\n this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id, 'pinned_peers'),\n this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id, 'include_peers'),\n this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id, 'exclude_peers')\n ] : [];\n\n return Promise.all([\n this.loadAnimationPromise = p.animationData.then(async(cb) => {\n const player = await cb({\n container: this.stickerContainer,\n loop: false,\n autoplay: false,\n width: 86,\n height: 86\n });\n\n this.animation = player;\n\n return lottieLoader.waitForFirstFrame(player);\n }),\n\n ...reloadMissingPromises\n ]).then(() => {\n if(this.type === 'edit') {\n this.setFilter(this.originalFilter, true);\n this.onEditOpen();\n } else {\n this.setInitFilter();\n this.onCreateOpen();\n }\n });\n }\n\n onOpenAfterTimeout() {\n this.loadAnimationPromise.then(() => {\n this.animation.autoplay = true;\n this.animation.play();\n });\n }\n\n private onCreateOpen() {\n // this.caption.style.display = '';\n this.setTitle('FilterNew');\n this.menuBtn.classList.add('hide');\n this.confirmBtn.classList.remove('hide');\n\n for(const flag in this.flags) {\n // @ts-ignore\n this.flags[flag].style.display = 'none';\n }\n }\n\n private onEditOpen() {\n // this.caption.style.display = 'none';\n this.setTitle(this.type === 'create' ? 'FilterNew' : 'FilterHeaderEdit');\n\n if(this.type === 'edit') {\n this.menuBtn.classList.remove('hide');\n this.confirmBtn.classList.add('hide');\n }\n\n const filter = this.filter;\n this.nameInputField.value = wrapDraftText(filter.title);\n\n for(const flag in this.flags) {\n this.flags[flag as keyof AppEditFolderTab['flags']].style.display = !!filter.pFlags[flag as keyof AppEditFolderTab['flags']] ? '' : 'none';\n }\n\n (['includePeerIds' as const, 'excludePeerIds' as const]).forEach(async(key) => {\n const section = this[key];\n const ul = appDialogsManager.createChatList({ignoreClick: true});\n\n let peers = filter[key];\n\n // filter peers where we're kicked\n const hasPeer = async(peerId: PeerId) => {\n return !!(await this.managers.appMessagesManager.getDialogOnly(peerId)) || (peerId.isUser() ? (await this.managers.appUsersManager.getUser(peerId.toUserId()))._ === 'user' : false);\n };\n\n const filtered = await filterAsync(peers, (peerId) => hasPeer(peerId));\n peers.length = 0;\n peers.push(...filtered);\n\n peers = peers.slice();\n\n const renderMore = async(_length: number) => {\n for(let i = 0, length = Math.min(peers.length, _length); i < length; ++i) {\n const peerId = peers.shift();\n if(peerId.isUser() ? false : !(await this.managers.appMessagesManager.getDialogOnly(peerId))) {\n continue;\n }\n\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: ul,\n rippleEnabled: false,\n meAsSaved: true,\n avatarSize: 'small'\n });\n dom.lastMessageSpan.parentElement.remove();\n }\n\n if(peers.length) {\n showMore.lastElementChild.replaceWith(i18n('FilterShowMoreChats', [peers.length]));\n } else if(showMore) {\n showMore.remove();\n }\n };\n\n section.generateContentElement().append(ul);\n\n let showMore: HTMLElement;\n if(peers.length) {\n const content = section.generateContentElement();\n showMore = Button('folder-category-button btn btn-primary btn-transparent', {icon: 'down'});\n showMore.classList.add('load-more', 'rp-overflow');\n attachClickEvent(showMore, () => renderMore(20), {listenerSetter: this.listenerSetter});\n showMore.append(i18n('FilterShowMoreChats', [peers.length]));\n\n content.append(showMore);\n }\n\n renderMore(4);\n });\n }\n\n editCheckForChange() {\n if(this.type === 'edit') {\n const changed = !deepEqual(this.originalFilter, this.filter);\n this.confirmBtn.classList.toggle('hide', !changed);\n this.menuBtn.classList.toggle('hide', changed);\n }\n };\n\n setFilter(filter: DialogFilter, firstTime: boolean) {\n if(this.container) {\n // cleanup\n Array.from(this.container.querySelectorAll('ul, .load-more')).forEach((el) => el.remove());\n }\n\n if(firstTime) {\n this.originalFilter = filter;\n this.filter = copy(filter);\n } else {\n this.filter = filter;\n this.onEditOpen();\n this.editCheckForChange();\n }\n }\n\n public setInitFilter(filter?: DialogFilter) {\n if(filter === undefined) {\n this.setFilter({\n _: 'dialogFilter',\n id: 0,\n title: '',\n pFlags: {},\n pinned_peers: [],\n include_peers: [],\n exclude_peers: [],\n pinnedPeerIds: [],\n includePeerIds: [],\n excludePeerIds: []\n }, true);\n this.type = 'create';\n } else {\n this.setFilter(filter, true);\n this.type = 'edit';\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 InputField from '../../inputField';\nimport {SliderSuperTab} from '../../slider';\nimport EditPeer from '../../editPeer';\nimport {UsernameInputField} from '../../usernameInputField';\nimport {i18n, i18n_, LangPackKey} from '../../../lib/langPack';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport rootScope from '../../../lib/rootScope';\nimport setBlankToAnchor from '../../../lib/richTextProcessor/setBlankToAnchor';\nimport getPeerEditableUsername from '../../../lib/appManagers/utils/peers/getPeerEditableUsername';\nimport SettingSection, {generateSection} from '../../settingSection';\nimport UsernamesSection from '../../usernamesSection';\n\n// TODO: ะฐะฒะฐั‚ะฐั€ะบะฐ ะฝะต ะฟะพะผะตะฝัะตั‚ัั ะฒ ัั‚ะพะน ะฒะบะปะฐะดะบะต ะฟะพัะปะต ะธะทะผะตะฝะตะฝะธั ะฟะพั‡ะตะผัƒ-ั‚ะพ (ะตัะปะธ ะฟะพัั‚ะฐะฒะธั‚ัŒ ะฒ ะดั€ัƒะณะพะผ ะบะปะธะตะฝั‚ะต, ะธ ะฟะพั‚ะพะผ ั‚ัƒั‚ ะฟั€ะพะฒะตั€ะธั‚ัŒ, ะดะปั ัั‚ะพะณะพ ะตั‰ั‘ ะฒั‹ัˆะตะป ะฒ ั‡ะฐั‚ะปะธัั‚)\n\nexport function purchaseUsernameCaption() {\n const p = document.createElement('div');\n const FRAGMENT_USERNAME_URL = 'https://fragment.com/username/';\n const a = setBlankToAnchor(document.createElement('a'));\n const purchaseText = i18n('Username.Purchase', [a]);\n purchaseText.classList.add('username-purchase-help');\n p.append(\n purchaseText,\n document.createElement('br'),\n document.createElement('br')\n );\n p.classList.add('hide');\n\n return {\n element: p,\n setUsername: (username: string) => {\n if(username) {\n a.href = FRAGMENT_USERNAME_URL + username;\n }\n\n p.classList.toggle('hide', !username);\n }\n };\n}\n\nexport default class AppEditProfileTab extends SliderSuperTab {\n private firstNameInputField: InputField;\n private lastNameInputField: InputField;\n private bioInputField: InputField;\n private usernameInputField: UsernameInputField;\n\n private profileUrlContainer: HTMLDivElement;\n private profileUrlAnchor: HTMLAnchorElement;\n\n private editPeer: EditPeer;\n\n public static getInitArgs() {\n return {\n bioMaxLength: rootScope.managers.apiManager.getLimit('bio'),\n user: rootScope.managers.appUsersManager.getSelf(),\n userFull: rootScope.managers.appProfileManager.getProfile(rootScope.myId.toUserId())\n };\n }\n\n public async init(p: ReturnType) {\n this.container.classList.add('edit-profile-container');\n this.setTitle('EditAccount.Title');\n\n const inputFields: InputField[] = [];\n\n const [bioMaxLength, user, userFull] = await Promise.all([p.bioMaxLength, p.user, p.userFull]);\n\n {\n const section = generateSection(this.scrollable, undefined, 'Bio.Description');\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.firstNameInputField = new InputField({\n label: 'EditProfile.FirstNameLabel',\n name: 'first-name',\n maxLength: 70\n });\n this.lastNameInputField = new InputField({\n label: 'Login.Register.LastName.Placeholder',\n name: 'last-name',\n maxLength: 64\n });\n this.bioInputField = new InputField({\n label: 'EditProfile.BioLabel',\n name: 'bio',\n maxLength: bioMaxLength\n });\n\n inputWrapper.append(this.firstNameInputField.container, this.lastNameInputField.container, this.bioInputField.container);\n\n const caption = document.createElement('div');\n caption.classList.add('caption');\n i18n_({element: caption, key: 'Bio.Description'});\n\n inputFields.push(this.firstNameInputField, this.lastNameInputField, this.bioInputField);\n\n this.editPeer = new EditPeer({\n peerId: rootScope.myId,\n inputFields,\n listenerSetter: this.listenerSetter\n });\n\n this.content.append(this.editPeer.nextBtn);\n\n section.append(this.editPeer.avatarEdit.container, inputWrapper);\n }\n\n {\n const section = new SettingSection({\n name: 'EditAccount.Username',\n caption: true\n });\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.usernameInputField = new UsernameInputField({\n label: 'EditProfile.Username.Label',\n name: 'username',\n plainText: true,\n listenerSetter: this.listenerSetter,\n onChange: () => {\n this.editPeer.handleChange();\n // this.setProfileUrl();\n\n const {error} = this.usernameInputField;\n const isPurchase = error?.type === 'USERNAME_PURCHASE_AVAILABLE';\n setUsername(isPurchase ? this.usernameInputField.value : undefined);\n },\n availableText: 'EditProfile.Username.Available',\n takenText: 'EditProfile.Username.Taken',\n invalidText: 'EditProfile.Username.Invalid'\n }, this.managers);\n\n inputWrapper.append(this.usernameInputField.container);\n\n const caption = section.caption;\n\n const {setUsername, element: p} = purchaseUsernameCaption();\n\n caption.append(\n p,\n i18n('UsernameHelp')\n // document.createElement('br'),\n // document.createElement('br')\n );\n\n // const profileUrlContainer = this.profileUrlContainer = document.createElement('div');\n // profileUrlContainer.classList.add('profile-url-container');\n // const profileUrlAnchor = this.profileUrlAnchor = anchorCopy();\n // profileUrlContainer.append(i18n('UsernameHelpLink', [profileUrlAnchor]));\n // caption.append(profileUrlContainer);\n\n inputFields.push(this.usernameInputField);\n section.content.append(inputWrapper);\n this.scrollable.append(section.container);\n }\n\n {\n const section = new UsernamesSection({\n peerId: rootScope.myId,\n peer: user,\n listenerSetter: this.listenerSetter,\n usernameInputField: this.usernameInputField,\n middleware: this.middlewareHelper.get()\n });\n\n this.scrollable.append(section.container);\n }\n\n attachClickEvent(this.editPeer.nextBtn, () => {\n this.editPeer.nextBtn.disabled = true;\n\n const promises: Promise[] = [];\n\n const profilePromise = this.managers.appProfileManager.updateProfile(\n this.firstNameInputField.value,\n this.lastNameInputField.value,\n this.bioInputField.value\n );\n promises.push(profilePromise.then(() => {\n this.close();\n }, (err) => {\n console.error('updateProfile error:', err);\n }));\n\n if(this.editPeer.uploadAvatar) {\n promises.push(this.editPeer.uploadAvatar().then((inputFile) => {\n return this.managers.appProfileManager.uploadProfilePhoto(inputFile);\n }));\n }\n\n if(this.usernameInputField.isValidToChange()) {\n promises.push(this.managers.appUsersManager.updateUsername(this.usernameInputField.value));\n }\n\n Promise.race(promises).finally(() => {\n this.editPeer.nextBtn.removeAttribute('disabled');\n });\n }, {listenerSetter: this.listenerSetter});\n\n this.firstNameInputField.setOriginalValue(user.first_name, true);\n this.lastNameInputField.setOriginalValue(user.last_name, true);\n this.bioInputField.setOriginalValue(userFull.about, true);\n this.usernameInputField.setOriginalValue(getPeerEditableUsername(user), true);\n\n // this.setProfileUrl();\n this.editPeer.handleChange();\n }\n\n // private setProfileUrl() {\n // if(this.usernameInputField.input.classList.contains('error') || !this.usernameInputField.value.length) {\n // this.profileUrlContainer.style.display = 'none';\n // } else {\n // this.profileUrlContainer.style.display = '';\n // this.profileUrlAnchor.replaceWith(this.profileUrlAnchor = anchorCopy({mePath: this.usernameInputField.value}));\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 appImManager, {APP_TABS} from '../../lib/appManagers/appImManager';\nimport SidebarSlider from '../slider';\nimport mediaSizes, {ScreenSize} from '../../helpers/mediaSizes';\nimport AppSharedMediaTab from './tabs/sharedMedia';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nexport const RIGHT_COLUMN_ACTIVE_CLASSNAME = 'is-right-column-shown';\n\nexport class AppSidebarRight extends SidebarSlider {\n private isColumnProportionSet = false;\n private sharedMediaTab: AppSharedMediaTab;\n // public rect: DOMRect;\n\n constructor() {\n super({\n sidebarEl: document.getElementById('column-right') as HTMLElement,\n canHideFirst: true,\n navigationType: 'right'\n });\n }\n\n construct(managers: AppManagers) {\n this.managers = managers;\n\n mediaSizes.addEventListener('changeScreen', (from, to) => {\n if(to === ScreenSize.medium && from !== ScreenSize.mobile) {\n this.toggleSidebar(false);\n }\n });\n\n mediaSizes.addEventListener('resize', () => {\n this.setColumnProportion();\n });\n }\n\n public createSharedMediaTab() {\n const tab = this.createTab(AppSharedMediaTab, false, true);\n tab.slider = this;\n // this.tabsContainer.prepend(tab.container);\n return tab;\n }\n\n public replaceSharedMediaTab(tab?: AppSharedMediaTab) {\n const previousTab = this.sharedMediaTab;\n if(previousTab) {\n const idx = this.historyTabIds.indexOf(previousTab);\n\n if(this._selectTab.getFrom() === previousTab.container) {\n this._selectTab.setFrom(tab?.container);\n }\n\n if(tab) {\n if(idx !== -1) {\n this.historyTabIds[idx] = tab;\n }\n\n const wasActive = previousTab.container.classList.contains('active');\n if(wasActive) {\n tab.container.classList.add('active');\n }\n\n previousTab.container.replaceWith(tab.container);\n } else {\n if(idx !== -1) {\n this.historyTabIds.splice(idx, 1);\n }\n\n previousTab.container.remove();\n }\n } else {\n this.tabsContainer.prepend(tab.container);\n }\n\n this.sharedMediaTab = tab;\n }\n\n public onCloseTab(id: number, animate: boolean, isNavigation?: boolean) {\n if(!this.historyTabIds.length) {\n this.toggleSidebar(false, animate);\n }\n\n super.onCloseTab(id, animate, isNavigation);\n }\n\n private setColumnProportion() {\n const proportion = this.sidebarEl.scrollWidth / this.sidebarEl.previousElementSibling.scrollWidth;\n document.documentElement.style.setProperty('--right-column-proportion', '' + proportion);\n // this.rect = this.sidebarEl.getBoundingClientRect();\n }\n\n public toggleSidebar(enable?: boolean, animate?: boolean) {\n const active = document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME);\n let willChange: boolean;\n if(enable !== undefined) {\n if(enable) {\n if(!active) {\n willChange = true;\n }\n } else if(active) {\n willChange = true;\n }\n } else {\n willChange = true;\n }\n\n if(!willChange) return Promise.resolve();\n\n if(!active && !this.historyTabIds.length) {\n this.sharedMediaTab.open();\n }\n\n if(!this.isColumnProportionSet) {\n this.setColumnProportion();\n this.isColumnProportionSet = true;\n }\n\n const animationPromise = appImManager.selectTab(active ? APP_TABS.CHAT : APP_TABS.PROFILE, animate);\n document.body.classList.toggle(RIGHT_COLUMN_ACTIVE_CLASSNAME, enable);\n return animationPromise;\n\n /* return new Promise((resolve, reject) => {\n const hidden: {element: HTMLDivElement, height: number}[] = [];\n const observer = new IntersectionObserver((entries) => {\n for(const entry of entries) {\n const bubble = entry.target as HTMLDivElement;\n if(!entry.isIntersecting) {\n hidden.push({element: bubble, height: bubble.scrollHeight});\n }\n }\n\n for(const item of hidden) {\n item.element.style.minHeight = item.height + 'px';\n (item.element.firstElementChild as HTMLElement).style.display = 'none';\n item.element.style.width = '1px';\n }\n\n //console.log('hidden', hidden);\n observer.disconnect();\n\n set();\n\n setTimeout(() => {\n for(const item of hidden) {\n item.element.style.minHeight = '';\n item.element.style.width = '';\n (item.element.firstElementChild as HTMLElement).style.display = '';\n }\n\n resolve();\n }, 200);\n });\n\n const length = Object.keys(appImManager.bubbles).length;\n if(length) {\n for(const i in appImManager.bubbles) {\n observer.observe(appImManager.bubbles[i]);\n }\n } else {\n set();\n setTimeout(resolve, 200);\n }\n }); */\n }\n}\n\nconst appSidebarRight = new AppSidebarRight();\nMOUNT_CLASS_TO.appSidebarRight = appSidebarRight;\nexport default appSidebarRight;\n","/*\n * 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 InputField from '../../inputField';\nimport EditPeer from '../../editPeer';\nimport Row, {CreateRowFromCheckboxField} from '../../row';\nimport CheckboxField from '../../checkboxField';\nimport Button from '../../button';\nimport PeerTitle from '../../peerTitle';\nimport rootScope from '../../../lib/rootScope';\nimport PopupPeer from '../../popups/peer';\nimport {addCancelButton} from '../../popups';\nimport {i18n} from '../../../lib/langPack';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport getPeerId from '../../../lib/appManagers/utils/peers/getPeerId';\nimport formatUserPhone from '../../wrappers/formatUserPhone';\nimport SettingSection from '../../settingSection';\nimport wrapPeerTitle from '../../wrappers/peerTitle';\n\nexport default class AppEditContactTab extends SliderSuperTab {\n private nameInputField: InputField;\n private lastNameInputField: InputField;\n private editPeer: EditPeer;\n private sharePhoneCheckboxField: CheckboxField;\n public peerId: PeerId;\n\n public async init() {\n const {peerId} = this;\n const userId = peerId.toUserId();\n this.container.classList.add('edit-peer-container', 'edit-contact-container');\n const [isContact, privacy] = await Promise.all([\n this.managers.appUsersManager.isContact(userId),\n this.managers.appPrivacyManager.getPrivacy('inputPrivacyKeyPhoneNumber')\n ]);\n const isNew = !isContact;\n this.setTitle(isNew ? 'AddContactTitle' : 'Edit');\n\n {\n const section = new SettingSection({noDelimiter: true});\n const inputFields: InputField[] = [];\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.nameInputField = new InputField({\n label: 'FirstName',\n name: 'contact-name',\n maxLength: 70,\n required: true\n });\n this.lastNameInputField = new InputField({\n label: 'LastName',\n name: 'contact-lastname',\n maxLength: 70\n });\n\n if(userId) {\n const user = await this.managers.appUsersManager.getUser(userId);\n\n if(isNew) {\n this.nameInputField.setDraftValue(user.first_name);\n this.lastNameInputField.setDraftValue(user.last_name);\n } else {\n this.nameInputField.setOriginalValue(user.first_name);\n this.lastNameInputField.setOriginalValue(user.last_name);\n }\n }\n\n inputWrapper.append(this.nameInputField.container, this.lastNameInputField.container);\n inputFields.push(this.nameInputField, this.lastNameInputField);\n\n this.editPeer = new EditPeer({\n peerId: peerId,\n inputFields,\n listenerSetter: this.listenerSetter,\n doNotEditAvatar: true\n });\n this.content.append(this.editPeer.nextBtn);\n\n if(peerId) {\n const div = document.createElement('div');\n div.classList.add('avatar-edit');\n div.append(this.editPeer.avatarElem);\n\n const notificationsCheckboxField = new CheckboxField({\n text: 'Notifications'\n });\n\n notificationsCheckboxField.input.addEventListener('change', (e) => {\n if(!e.isTrusted) {\n return;\n }\n\n this.managers.appMessagesManager.togglePeerMute({peerId});\n });\n\n this.listenerSetter.add(rootScope)('notify_settings', async(update) => {\n if(update.peer._ !== 'notifyPeer') return;\n const peerId = getPeerId(update.peer.peer);\n if(peerId === peerId) {\n const enabled = !(await this.managers.appNotificationsManager.isMuted(update.notify_settings));\n if(enabled !== notificationsCheckboxField.checked) {\n notificationsCheckboxField.checked = enabled;\n }\n }\n });\n\n const profileNameDiv = document.createElement('div');\n profileNameDiv.classList.add('profile-name');\n profileNameDiv.append(new PeerTitle({\n peerId: peerId\n }).element);\n // profileNameDiv.innerHTML = 'Karen Stanford';\n\n const profileSubtitleDiv = document.createElement('div');\n profileSubtitleDiv.classList.add('profile-subtitle');\n profileSubtitleDiv.append(i18n('EditContact.OriginalName'));\n\n section.content.append(div, profileNameDiv, profileSubtitleDiv, inputWrapper);\n\n if(!isNew) {\n const notificationsRow = new Row({\n checkboxField: notificationsCheckboxField,\n withCheckboxSubtitle: true,\n listenerSetter: this.listenerSetter\n });\n\n const enabled = !(await this.managers.appNotificationsManager.isPeerLocalMuted({peerId, respectType: false}));\n notificationsCheckboxField.checked = enabled;\n\n section.content.append(notificationsRow.container);\n } else {\n const user = await this.managers.appUsersManager.getUser(userId);\n\n const phoneRow = new Row({\n icon: 'phone',\n titleLangKey: user.phone ? undefined : 'MobileHidden',\n title: user.phone ? formatUserPhone(user.phone) : undefined,\n subtitleLangKey: user.phone ? 'Phone' : 'MobileHiddenExceptionInfo',\n subtitleLangArgs: user.phone ? undefined : [new PeerTitle({peerId: peerId}).element]\n });\n\n section.content.append(phoneRow.container);\n }\n } else {\n section.content.append(inputWrapper);\n }\n\n this.scrollable.append(section.container);\n }\n\n if(!isNew) {\n const section = new SettingSection();\n\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'PeerInfo.DeleteContact'});\n\n attachClickEvent(btnDelete, () => {\n new PopupPeer('popup-delete-contact', {\n peerId: peerId,\n titleLangKey: 'DeleteContact',\n descriptionLangKey: 'AreYouSureDeleteContact',\n buttons: addCancelButton([{\n langKey: 'Delete',\n callback: () => {\n const toggle = toggleDisability([btnDelete], true);\n\n this.managers.appUsersManager.deleteContacts([userId]).then(() => {\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 } else if(\n privacy.some((privacyRule) => privacyRule._ === 'privacyValueDisallowAll') &&\n !privacy.some((privacyRule) => privacyRule._ === 'privacyValueAllowUsers' && privacyRule.users.includes(userId))\n ) {\n const section = new SettingSection({\n caption: 'NewContact.Exception.ShareMyPhoneNumber.Desc',\n captionArgs: [await wrapPeerTitle({peerId: this.peerId})]\n });\n const checkboxField = this.sharePhoneCheckboxField = new CheckboxField({\n text: 'NewContact.Exception.ShareMyPhoneNumber',\n checked: true\n });\n const row = CreateRowFromCheckboxField(checkboxField);\n\n section.content.append(row.container);\n\n this.scrollable.append(section.container);\n }\n\n attachClickEvent(this.editPeer.nextBtn, async() => {\n this.editPeer.nextBtn.disabled = true;\n\n this.managers.appUsersManager.addContact(\n userId,\n this.nameInputField.value,\n this.lastNameInputField.value,\n (await this.managers.appUsersManager.getUser(userId)).phone,\n this.sharePhoneCheckboxField?.checked\n ).finally(() => {\n this.editPeer.nextBtn.removeAttribute('disabled');\n this.close();\n });\n }, {listenerSetter: this.listenerSetter});\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 toggleDisability from '../../../helpers/dom/toggleDisability';\nimport {makeMediaSize} from '../../../helpers/mediaSize';\nimport copy from '../../../helpers/object/copy';\nimport deepEqual from '../../../helpers/object/deepEqual';\nimport {ForumTopic} from '../../../layer';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport {GENERAL_TOPIC_ID, TOPIC_COLORS} from '../../../lib/mtproto/mtproto_config';\nimport getAbbreviation from '../../../lib/richTextProcessor/getAbbreviation';\nimport ButtonIcon from '../../buttonIcon';\nimport CheckboxField from '../../checkboxField';\nimport EmojiTab from '../../emoticonsDropdown/tabs/emoji';\nimport InputField from '../../inputField';\nimport Row from '../../row';\nimport SettingSection from '../../settingSection';\nimport appSidebarLeft from '../../sidebarLeft';\nimport SliderSuperTab from '../../sliderTab';\nimport {wrapTopicIcon} from '../../wrappers/messageActionTextNewUnsafe';\n\nconst size = 64;\nconst mediaSize = makeMediaSize(size, size);\n\nexport default class AppEditTopicTab extends SliderSuperTab {\n private iconDiv: HTMLElement;\n private colorIndex: number;\n private nameInputField: InputField;\n private topic: Parameters[0]['topic'];\n private emojiElement: HTMLElement;\n private confirmBtn: HTMLButtonElement;\n private originalTopic: ForumTopic.forumTopic;\n\n public async init(peerId: PeerId, threadId?: number) {\n this.colorIndex = 0;\n const isNew = !threadId;\n const isGeneral = threadId === GENERAL_TOPIC_ID;\n this.container.classList.add('edit-topic-container');\n this.setTitle(isNew ? 'NewTopic' : 'ForumTopic.Title.Edit');\n const chatId = peerId.toChatId();\n\n if(threadId) {\n this.topic = this.originalTopic = copy(await this.managers.dialogsStorage.getForumTopic(peerId, threadId));\n }\n\n {\n const section = new SettingSection({\n name: isGeneral ? 'CreateGeneralTopicTitle' : 'CreateTopicTitle'\n });\n\n const iconDiv = this.iconDiv = document.createElement('div');\n iconDiv.classList.add('edit-topic-icon-container');\n\n !threadId && attachClickEvent(iconDiv, () => {\n if(this.topic.icon_emoji_id) {\n return;\n }\n\n this.colorIndex = (this.colorIndex + 1) % TOPIC_COLORS.length;\n this.setIcon();\n }, {listenerSetter: this.listenerSetter});\n\n if(threadId) {\n iconDiv.classList.add('disable-hover');\n }\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const nameInputField = this.nameInputField = new InputField({\n label: 'ForumTopic.Name.Placeholder',\n withLinebreaks: false,\n name: 'topic-name',\n maxLength: 70,\n required: true\n });\n\n if(this.topic) {\n nameInputField.setOriginalValue(this.topic.title, true);\n }\n\n const confirmBtn = this.confirmBtn = ButtonIcon('check btn-confirm blue hide', {noRipple: true});\n this.header.append(confirmBtn);\n\n attachClickEvent(confirmBtn, () => {\n const toggle = toggleDisability([confirmBtn], true);\n if(threadId) {\n this.managers.appChatsManager.editForumTopic({\n chatId,\n topicId: threadId,\n title: nameInputField.value,\n iconEmojiId: this.topic.icon_emoji_id || 0\n }).then(() => {\n this.close();\n }).catch((err) => {\n console.error('edit topic error', err);\n toggle();\n });\n } else {\n this.managers.appChatsManager.createForumTopic({\n chatId,\n iconColor: TOPIC_COLORS[this.colorIndex],\n iconEmojiId: this.topic.icon_emoji_id,\n title: nameInputField.value\n }).then((threadId) => {\n this.close();\n appImManager.setInnerPeer({\n peerId,\n threadId\n });\n }).catch((err) => {\n console.error('create topic error', err);\n toggle();\n });\n }\n }, {listenerSetter: this.listenerSetter});\n\n this.listenerSetter.add(nameInputField.input)('input', () => {\n this.validate();\n this.setIcon(this.topic?.icon_emoji_id);\n });\n\n inputWrapper.append(nameInputField.container);\n\n section.content.append(iconDiv, inputWrapper);\n\n this.scrollable.append(section.container);\n }\n\n const promises: Promise[] = [];\n\n if(!isGeneral) {\n const section = new SettingSection({});\n section.container.classList.add('edit-topic-emoticons-container');\n const emojiTab = new EmojiTab({\n managers: this.managers,\n isStandalone: true,\n noRegularEmoji: true,\n stickerSetId: 'inputStickerSetEmojiDefaultTopicIcons',\n onClick: (emoji) => {\n emojiTab.setActive(!emoji.docId ? {emoji: undefined, docId: undefined} : emoji);\n this.setIcon(emoji.docId);\n }\n });\n emojiTab.getContainerSize = () => ({\n width: appSidebarLeft.rect.width,\n height: 400\n });\n\n this.middlewareHelper.onDestroy(() => {\n emojiTab.destroy();\n });\n\n emojiTab.container.classList.remove('tabs-tab');\n\n this.emojiElement = document.createElement('span');\n this.emojiElement.classList.add('super-emoji-topic-icon');\n\n const promise = emojiTab.init().then(async() => {\n const category = emojiTab.getCustomCategory();\n\n const iconEmojiId = this.topic?.icon_emoji_id;\n emojiTab.addEmojiToCategory({\n category,\n element: this.emojiElement,\n batch: false,\n prepend: true,\n active: !iconEmojiId\n });\n\n if(iconEmojiId) {\n emojiTab.setActive({docId: iconEmojiId, emoji: ''});\n }\n });\n\n promises.push(promise);\n\n section.content.replaceWith(emojiTab.container);\n this.scrollable.append(section.container);\n } else {\n const section = new SettingSection({caption: 'EditTopicHideInfo'});\n\n const checkboxField = new CheckboxField({\n // toggle: true,\n checked: !(this.topic as ForumTopic.forumTopic).pFlags.hidden,\n text: 'EditTopicHide'\n });\n\n this.listenerSetter.add(checkboxField.input)('change', () => {\n const promise = this.managers.appChatsManager.editForumTopic({\n chatId,\n topicId: threadId,\n hidden: !checkboxField.checked\n });\n\n row.disableWithPromise(promise);\n });\n\n const row = new Row({\n checkboxField\n });\n\n section.content.append(row.container);\n\n this.scrollable.append(section.container);\n }\n\n return Promise.all(promises).then(() => {\n return this.s();\n });\n }\n\n private validate() {\n let isChanged = this.nameInputField.isValidToChange();\n if(!isChanged && this.originalTopic) {\n isChanged = this.topic.icon_emoji_id !== this.originalTopic.icon_emoji_id;\n }\n\n this.confirmBtn.classList.toggle('hide', !isChanged);\n }\n\n private s() {\n if(this.topic?.icon_color) {\n this.colorIndex = TOPIC_COLORS.indexOf(this.topic.icon_color);\n }\n\n return this.setIcon(this.topic?.icon_emoji_id, undefined, true);\n }\n\n private async setIcon(iconEmojiId?: Long, appendTo = this.iconDiv, force?: boolean) {\n const title = this.nameInputField.value;\n\n const isMainIcon = appendTo === this.iconDiv;\n\n if(isMainIcon) {\n const newTopic: AppEditTopicTab['topic'] = {\n id: this.topic?.id,\n icon_color: TOPIC_COLORS[this.colorIndex],\n title: getAbbreviation(title, true).text || 'A',\n icon_emoji_id: iconEmojiId\n };\n\n const oldTopic = this.topic;\n this.topic = newTopic;\n\n if(\n force ||\n !oldTopic ||\n oldTopic.icon_color !== newTopic.icon_color ||\n oldTopic.title !== newTopic.title\n ) {\n this.setIcon(undefined, this.emojiElement);\n }\n\n if(deepEqual(oldTopic, newTopic) && !force) {\n return;\n }\n\n this.validate();\n }\n\n const el = await wrapTopicIcon({\n topic: isMainIcon ? this.topic : {...this.topic, icon_emoji_id: undefined},\n customEmojiSize: mediaSize,\n middleware: this.middlewareHelper.get()\n });\n\n const span = document.createElement('div');\n span.classList.add('edit-topic-icon');\n span.append(el);\n\n const oldEl = appendTo.lastElementChild as HTMLElement;\n appendTo.append(span);\n\n const applyFadeAnimation = (el: HTMLElement, fadeIn: boolean) => {\n const frames: Keyframe[] = [\n {opacity: '0', transform: 'scale(0.8)'},\n {opacity: '1', transform: 'scale(1)'}\n ];\n\n const animation = el.animate(frames, {\n duration: 200,\n iterations: 1,\n easing: 'ease-in-out',\n fill: 'forwards',\n direction: fadeIn ? 'normal' : 'reverse'\n });\n\n return new Promise((resolve) => {\n animation.addEventListener('finish', () => {\n resolve();\n }, {once: true});\n });\n };\n\n if(oldEl) {\n applyFadeAnimation(oldEl, false).then(() => oldEl.remove());\n }\n\n applyFadeAnimation(span, 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 {copyTextToClipboard} from '../../../helpers/clipboard';\nimport {randomLong} from '../../../helpers/random';\nimport {Chat, ChatFull, ExportedChatInvite} from '../../../layer';\nimport Button from '../../button';\nimport {setButtonLoader} from '../../putPreloader';\nimport RadioField from '../../radioField';\nimport Row, {RadioFormFromRows} from '../../row';\nimport {toast} from '../../toast';\nimport {UsernameInputField} from '../../usernameInputField';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport I18n, {i18n} from '../../../lib/langPack';\nimport PopupPeer from '../../popups/peer';\nimport ButtonCorner from '../../buttonCorner';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport CheckboxField from '../../checkboxField';\nimport rootScope from '../../../lib/rootScope';\nimport SettingSection from '../../settingSection';\nimport UsernamesSection from '../../usernamesSection';\nimport getPeerEditableUsername from '../../../lib/appManagers/utils/peers/getPeerEditableUsername';\nimport getPeerActiveUsernames from '../../../lib/appManagers/utils/peers/getPeerActiveUsernames';\nimport {purchaseUsernameCaption} from '../../sidebarLeft/tabs/editProfile';\nimport confirmationPopup from '../../confirmationPopup';\n\nexport default class AppChatTypeTab extends SliderSuperTabEventable {\n public chatId: ChatId;\n public chatFull: ChatFull;\n\n public async init() {\n this.container.classList.add('edit-peer-container', 'group-type-container');\n\n const isBroadcast = await this.managers.appChatsManager.isBroadcast(this.chatId);\n\n this.setTitle(isBroadcast ? 'ChannelType' : 'GroupType');\n\n const section = new SettingSection({\n name: isBroadcast ? 'ChannelType' : 'GroupType'\n });\n\n const random = randomLong();\n const privateRow = new Row({\n radioField: new RadioField({\n langKey: isBroadcast ? 'ChannelPrivate' : 'MegaPrivate',\n name: random,\n value: 'private'\n }),\n subtitleLangKey: isBroadcast ? 'ChannelPrivateInfo' : 'MegaPrivateInfo'\n });\n const publicRow = new Row({\n radioField: new RadioField({\n langKey: isBroadcast ? 'ChannelPublic' : 'MegaPublic',\n name: random,\n value: 'public'\n }),\n subtitleLangKey: isBroadcast ? 'ChannelPublicInfo' : 'MegaPublicInfo'\n });\n const form = RadioFormFromRows([privateRow, publicRow], (value) => {\n const a: HTMLElement[][] = [[privateSection.container], [publicContainer]];\n if(value === 'public') a.reverse();\n\n a[0].forEach((container) => container.classList.remove('hide'));\n a[1].forEach((container) => container.classList.add('hide'));\n\n onChange();\n });\n\n let chat: Chat = await this.managers.appChatsManager.getChat(this.chatId);\n\n const chatUpdateListeners: {[type in 'basic']: (() => void)[]} = {basic: []};\n const addChatUpdateListener = (callback: () => void, type: 'basic' = 'basic') => {\n chatUpdateListeners[type].push(callback);\n };\n\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n if(this.chatId === chatId) {\n chat = await this.managers.appChatsManager.getChat(this.chatId) as typeof chat;\n chatUpdateListeners['basic'].forEach((callback) => callback());\n }\n });\n\n section.content.append(form);\n\n const privateSection = new SettingSection({});\n\n // let revoked = false;\n const linkRow = new Row({\n title: (this.chatFull.exported_invite as ExportedChatInvite.chatInviteExported).link,\n subtitleLangKey: isBroadcast ? 'ChannelPrivateLinkHelp' : 'MegaPrivateLinkHelp',\n clickable: () => {\n copyTextToClipboard((this.chatFull.exported_invite as ExportedChatInvite.chatInviteExported).link);\n toast(I18n.format('LinkCopied', true));\n },\n listenerSetter: this.listenerSetter\n });\n\n const btnRevoke = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'RevokeLink'});\n\n attachClickEvent(btnRevoke, () => {\n new PopupPeer('revoke-link', {\n buttons: [{\n langKey: 'RevokeButton',\n callback: () => {\n const toggle = toggleDisability([btnRevoke], true);\n\n this.managers.appProfileManager.getChatInviteLink(this.chatId, true).then((link) => {\n toggle();\n linkRow.title.innerHTML = link;\n // revoked = true;\n // onChange();\n });\n }\n }],\n titleLangKey: 'RevokeLink',\n descriptionLangKey: 'RevokeAlert'\n }).show();\n }, {listenerSetter: this.listenerSetter});\n\n privateSection.content.append(linkRow.container, btnRevoke);\n\n const publicSection = new SettingSection({\n caption: true,\n noDelimiter: true\n });\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const placeholder = 't.me/';\n\n const onChange = () => {\n const changed = (privateRow.radioField.checked && (originalValue !== placeholder/* || revoked */)) ||\n (linkInputField.isValidToChange() && linkInputField.input.classList.contains('valid'));\n applyBtn.classList.toggle('is-visible', changed);\n\n const {error} = linkInputField;\n const isPurchase = error?.type === 'USERNAME_PURCHASE_AVAILABLE';\n setUsername(isPurchase ? linkInputField.getValue() : undefined);\n };\n\n const linkInputField = new UsernameInputField({\n label: 'SetUrlPlaceholder',\n name: 'group-public-link',\n plainText: true,\n listenerSetter: this.listenerSetter,\n availableText: 'Link.Available',\n invalidText: 'Link.Invalid',\n takenText: 'Link.Taken',\n onChange: onChange,\n peerId: this.chatId.toPeerId(true),\n head: placeholder\n }, this.managers);\n\n const {setUsername, element: p} = purchaseUsernameCaption();\n\n publicSection.caption.append(\n p,\n i18n(isBroadcast ? 'Channel.UsernameAboutChannel' : 'Channel.UsernameAboutGroup')\n );\n\n const usernamesSection = new UsernamesSection({\n peerId: this.chatId.toPeerId(true),\n peer: chat as Chat.channel,\n listenerSetter: this.listenerSetter,\n usernameInputField: linkInputField,\n middleware: this.middlewareHelper.get()\n });\n\n const publicContainer = document.createElement('div');\n publicContainer.append(publicSection.container, usernamesSection.container);\n\n const originalValue = placeholder + (getPeerEditableUsername(chat as Chat.channel) || '');\n\n inputWrapper.append(linkInputField.container)\n publicSection.content.append(inputWrapper);\n\n const applyBtn = ButtonCorner({icon: 'check', className: 'is-visible'});\n this.content.append(applyBtn);\n\n attachClickEvent(applyBtn, async() => {\n const username = publicRow.radioField.checked ? linkInputField.getValue() : '';\n if(!username) {\n const chat = await this.managers.appChatsManager.getChat(this.chatId);\n const wasUsername = getPeerEditableUsername(chat as Chat.channel);\n if(wasUsername) {\n await confirmationPopup({\n descriptionLangKey: isBroadcast ? 'ChannelVisibility.Confirm.MakePrivate.Channel' : 'ChannelVisibility.Confirm.MakePrivate.Group',\n descriptionLangArgs: [wasUsername],\n button: {\n langKey: 'OK'\n }\n });\n }\n }\n\n /* const unsetLoader = */setButtonLoader(applyBtn);\n this.managers.appChatsManager.migrateChat(this.chatId).then((channelId) => {\n if(!username) {\n return this.managers.appChatsManager.makeChannelPrivate(channelId);\n } else {\n return this.managers.appChatsManager.updateUsername(channelId, username);\n }\n }).then(() => {\n // unsetLoader();\n this.close();\n });\n }, {listenerSetter: this.listenerSetter});\n\n (originalValue !== placeholder || getPeerActiveUsernames(chat as Chat.channel).length ? publicRow : privateRow).radioField.checked = true;\n linkInputField.setOriginalValue(originalValue, true);\n\n this.scrollable.append(section.container, privateSection.container, publicContainer);\n\n {\n const section = new SettingSection({\n name: 'SavingContentTitle',\n caption: isBroadcast ? 'RestrictSavingContentInfoChannel' : 'RestrictSavingContentInfoGroup'\n });\n\n const checkboxField = new CheckboxField({\n text: 'RestrictSavingContent',\n withRipple: true\n });\n\n this.listenerSetter.add(checkboxField.input)('change', () => {\n const toggle = checkboxField.toggleDisability(true);\n this.managers.appChatsManager.toggleNoForwards(this.chatId, checkboxField.checked).then(() => {\n toggle();\n });\n });\n\n const onChatUpdate = () => {\n checkboxField.setValueSilently(!!(chat as Chat.channel).pFlags.noforwards);\n };\n\n addChatUpdateListener(onChatUpdate);\n\n onChatUpdate();\n\n section.content.append(checkboxField.label);\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 toggleDisability from '../../../helpers/dom/toggleDisability';\nimport deepEqual from '../../../helpers/object/deepEqual';\nimport {ChannelParticipant} from '../../../layer';\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport Button from '../../button';\nimport SettingSection from '../../settingSection';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport getUserStatusString from '../../wrappers/getUserStatusString';\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 public async 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 peerId: this.userId.toPeerId(false),\n container: list,\n rippleEnabled: true,\n avatarSize: 'abitbigger'\n });\n\n dom.lastMessageSpan.append(getUserStatusString(await this.managers.appUsersManager.getUser(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 }, this.managers);\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 this.managers.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 this.managers.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 this.managers.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 {ChatRights} from '../../../lib/appManagers/appChatsManager';\nimport appDialogsManager, {DialogDom, DIALOG_LIST_ELEMENT_TAG} from '../../../lib/appManagers/appDialogsManager';\nimport {AppManagers} from '../../../lib/appManagers/managers';\nimport combineParticipantBannedRights from '../../../lib/appManagers/utils/chats/combineParticipantBannedRights';\nimport hasRights from '../../../lib/appManagers/utils/chats/hasRights';\nimport getPeerActiveUsernames from '../../../lib/appManagers/utils/peers/getPeerActiveUsernames';\nimport getPeerId from '../../../lib/appManagers/utils/peers/getPeerId';\nimport I18n, {i18n, join, LangPackKey} from '../../../lib/langPack';\nimport rootScope from '../../../lib/rootScope';\nimport CheckboxField from '../../checkboxField';\nimport PopupPickUser from '../../popups/pickUser';\nimport Row, {CreateRowFromCheckboxField} from '../../row';\nimport SettingSection from '../../settingSection';\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(private options: {\n chatId: ChatId,\n listenerSetter: ListenerSetter,\n appendTo: HTMLElement,\n participant?: ChannelParticipant.channelParticipantBanned\n }, private managers: AppManagers) {\n this.construct();\n }\n\n public async construct() {\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 options = this.options;\n const chat = await this.managers.appChatsManager.getChat(options.chatId) as Chat.chat | Chat.channel;\n const defaultBannedRights = chat.default_banned_rights;\n const rights = options.participant ? combineParticipantBannedRights(chat as Chat.channel, options.participant.banned_rights) : defaultBannedRights;\n\n const restrictionText: LangPackKey = options.participant ? 'UserRestrictionsDisabled' : 'EditCantEditPermissionsPublic';\n for(const info of this.v) {\n const mainFlag = info.flags[0];\n const row = CreateRowFromCheckboxField(\n info.checkboxField = new CheckboxField({\n text: info.text,\n checked: hasRights(chat, mainFlag, rights),\n restriction: true,\n listenerSetter: options.listenerSetter\n })\n );\n\n if((\n options.participant &&\n defaultBannedRights.pFlags[mainFlag as keyof typeof defaultBannedRights['pFlags']]\n ) || (\n getPeerActiveUsernames(chat as Chat.channel)[0] &&\n (\n info.flags.includes('pin_messages') ||\n info.flags.includes('change_info')\n )\n )\n ) {\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(restrictionText, 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(row.container);\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 public 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 }, this.managers);\n\n this.eventListener.addEventListener('destroy', () => {\n this.managers.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 listenerSetter: this.listenerSetter\n });\n\n const openPermissions = async(peerId: PeerId) => {\n let participant: AppUserPermissionsTab['participant'];\n try {\n participant = await this.managers.appProfileManager.getChannelParticipant(this.chatId, peerId) as any;\n } catch(err) {\n toast('User is no longer participant');\n return;\n }\n\n const tab = this.slider.createTab(AppUserPermissionsTab);\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, DIALOG_LIST_ELEMENT_TAG);\n if(!target) return;\n\n const peerId = target.dataset.peerId.toPeerId();\n openPermissions(peerId);\n }, {listenerSetter: this.listenerSetter});\n\n const setSubtitle = async(dom: DialogDom, participant: ChannelParticipant.channelParticipantBanned) => {\n const bannedRights = participant.banned_rights;// appChatsManager.combineParticipantBannedRights(this.chatId, participant.banned_rights);\n const defaultBannedRights = ((await this.managers.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 = dom.lastMessageSpan as HTMLElement;\n\n if(cantWhat.length) {\n el.replaceChildren(...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 peerId: getPeerId(participant.peer),\n container: list,\n rippleEnabled: true,\n avatarSize: 'abitbigger',\n append\n });\n\n setSubtitle(dom, 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 this.managers.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(await this.managers.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 copy from '../../../../helpers/object/copy';\nimport {ChatBannedRights, Chat} from '../../../../layer';\n\nexport default function combineParticipantBannedRights(chat: Chat.channel, rights: ChatBannedRights) {\n if(chat.default_banned_rights) {\n rights = copy(rights);\n const defaultRights = chat.default_banned_rights.pFlags;\n for(const i in defaultRights) {\n // @ts-ignore\n rights.pFlags[i] = defaultRights[i];\n }\n }\n\n return rights;\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 debounce from '../../../helpers/schedulers/debounce';\nimport {ChatReactions, Reaction} from '../../../layer';\nimport {i18n, LangPackKey} from '../../../lib/langPack';\nimport CheckboxField from '../../checkboxField';\nimport Row, {RadioFormFromValues} from '../../row';\nimport SettingSection from '../../settingSection';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport wrapStickerToRow from '../../wrappers/stickerToRow';\n\nexport default class AppChatReactionsTab extends SliderSuperTabEventable {\n public chatId: ChatId;\n\n public async init() {\n this.setTitle('Reactions');\n\n const availableReactions = await this.managers.appReactionsManager.getActiveAvailableReactions();\n const chatFull = await this.managers.appProfileManager.getChatFull(this.chatId);\n const isBroadcast = await this.managers.appChatsManager.isBroadcast(this.chatId);\n\n let _chatReactions = chatFull.available_reactions ?? {_: 'chatReactionsNone'};\n let chatReactions = _chatReactions;\n let emoticons = new Set(_chatReactions._ === 'chatReactionsSome' ? _chatReactions.reactions.map((reaction) => (reaction as Reaction.reactionEmoji).emoticon) : []);\n\n const makeReactionFromEmoticons = (emoticons: Array): Reaction[] => emoticons.map((emoticon) => ({_: 'reactionEmoji', emoticon}));\n\n const getCaptionLangPackKey = (): LangPackKey => {\n if(isBroadcast) {\n return 'EnableReactionsChannelInfo';\n }\n\n return chatReactions._ === 'chatReactionsAll' ? 'EnableAllReactionsInfo' : (chatReactions._ === 'chatReactionsNone' ? 'DisableReactionsInfo' : 'EnableSomeReactionsInfo');\n };\n\n const toggleSection = new SettingSection({\n name: isBroadcast ? undefined : 'AvailableReactions',\n caption: getCaptionLangPackKey()\n });\n\n const reactionsSection = new SettingSection({\n name: 'OnlyAllowThisReactions'\n });\n\n const toggleCheckboxFieldsByEmoticons = () => {\n const r: Reaction.reactionEmoji[] = (chatReactions as ChatReactions.chatReactionsSome).reactions as any ?? [];\n emoticons = new Set(r.map(({emoticon}) => emoticon));\n checkboxFieldsByEmoticon.forEach((checkboxField, emoticon) => {\n checkboxField.setValueSilently(emoticons.has(emoticon));\n });\n };\n\n let toggleCheckboxField: CheckboxField;\n if(isBroadcast) {\n toggleCheckboxField = new CheckboxField({toggle: true, checked: _chatReactions._ === 'chatReactionsSome'});\n const toggleRow = new Row({\n checkboxField: toggleCheckboxField,\n titleLangKey: 'EnableReactions',\n listenerSetter: this.listenerSetter\n });\n\n toggleSection.content.append(toggleRow.container);\n\n this.listenerSetter.add(toggleCheckboxField.input)('change', () => {\n let save = true;\n if(!toggleCheckboxField.checked) {\n chatReactions = {_: 'chatReactionsNone'};\n } else if(checkboxFields.every((checkboxField) => !checkboxField.checked)) {\n chatReactions = {_: 'chatReactionsSome', reactions: makeReactionFromEmoticons(availableReactions.map(({reaction}) => reaction))};\n } else if(chatReactions._ !== 'chatReactionsSome') {\n chatReactions = {_: 'chatReactionsSome', reactions: makeReactionFromEmoticons(Array.from(emoticons))};\n } else {\n save = false;\n }\n\n if(save) {\n toggleCheckboxFieldsByEmoticons();\n saveReactionsDebounced();\n }\n });\n } else {\n const a: [ChatReactions['_'], LangPackKey][] = [\n ['chatReactionsAll', 'AllReactions'],\n ['chatReactionsSome', 'SomeReactions'],\n ['chatReactionsNone', 'NoReactions']\n ];\n\n const onChange = () => {\n reactionsSection.container.classList.toggle('hide', chatReactions._ !== 'chatReactionsSome');\n };\n\n let value = _chatReactions._;\n const form = RadioFormFromValues(a.map(([value, langPackKey]) => {\n return {\n langPackKey,\n value,\n checked: _chatReactions._ === value\n };\n }), (_value) => {\n value = _value as any;\n\n if(value === 'chatReactionsAll') {\n chatReactions = {\n _: value,\n pFlags: {\n allow_custom: true\n }\n };\n } else if(value === 'chatReactionsNone') {\n chatReactions = {\n _: value\n };\n } else {\n chatReactions = {\n _: value,\n reactions: makeReactionFromEmoticons(['๐Ÿ‘', '๐Ÿ‘Ž'])\n };\n }\n\n replaceContent(toggleSection.caption, i18n(getCaptionLangPackKey()));\n toggleCheckboxFieldsByEmoticons();\n saveReactionsDebounced();\n onChange();\n });\n\n toggleSection.content.append(form);\n onChange();\n }\n\n const checkboxFieldsByEmoticon: Map = new Map();\n const checkboxFields = availableReactions.map((availableReaction) => {\n const emoticon = availableReaction.reaction;\n const checkboxField = new CheckboxField({\n toggle: true,\n checked: emoticons.has(emoticon)\n });\n\n checkboxFieldsByEmoticon.set(emoticon, checkboxField);\n\n this.listenerSetter.add(checkboxField.input)('change', () => {\n if(checkboxField.checked) {\n emoticons.add(emoticon);\n\n if(toggleCheckboxField && !toggleCheckboxField.checked) {\n toggleCheckboxField.checked = true;\n }\n } else {\n emoticons.delete(emoticon);\n\n if(toggleCheckboxField?.checked && !emoticons.size) {\n toggleCheckboxField.checked = false;\n }\n }\n\n saveReactionsDebounced();\n });\n\n const row = new Row({\n checkboxField,\n title: availableReaction.title,\n havePadding: true,\n listenerSetter: this.listenerSetter\n });\n\n wrapStickerToRow({\n row,\n doc: availableReaction.static_icon,\n size: 'small'\n });\n\n reactionsSection.content.append(row.container);\n\n return checkboxField;\n });\n\n const saveReactions = async() => {\n saveReactionsDebounced.clearTimeout();\n // const newReactions = Array.from(enabledReactions);\n // if([...newReactions].sort().join() === [...originalReactions].sort().join()) {\n // return;\n // }\n\n if(chatReactions._ === 'chatReactionsSome') {\n chatReactions.reactions = makeReactionFromEmoticons(Array.from(emoticons));\n }\n\n // const r = (chatReactions as ChatReactions.chatReactionsSome).reactions;\n // if(r?.length === availableReactions.length) {\n // chatReactions = {_: 'chatReactionsAll'};\n // }\n\n this.managers.appChatsManager.setChatAvailableReactions(this.chatId, chatReactions);\n _chatReactions = chatReactions;\n };\n\n const saveReactionsDebounced = debounce(saveReactions, 3000, false, true);\n\n this.eventListener.addEventListener('destroy', () => {\n if(saveReactionsDebounced.isDebounced()) {\n saveReactions();\n }\n }, {once: true});\n\n this.scrollable.append(toggleSection.container, reactionsSection.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 {SliderSuperTab} from '../../slider'\nimport InputField from '../../inputField';\nimport EditPeer from '../../editPeer';\nimport Row, {CreateRowFromCheckboxField} from '../../row';\nimport Button from '../../button';\nimport {ChatRights} from '../../../lib/appManagers/appChatsManager';\nimport {Chat, ChatFull} from '../../../layer';\nimport AppChatTypeTab from './chatType';\nimport rootScope from '../../../lib/rootScope';\nimport AppGroupPermissionsTab from './groupPermissions';\nimport {i18n, LangPackKey} from '../../../lib/langPack';\nimport PopupDeleteDialog from '../../popups/deleteDialog';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport CheckboxField from '../../checkboxField';\nimport AppChatReactionsTab from './chatReactions';\nimport hasRights from '../../../lib/appManagers/utils/chats/hasRights';\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport SettingSection from '../../settingSection';\nimport getPeerActiveUsernames from '../../../lib/appManagers/utils/peers/getPeerActiveUsernames';\n\nexport default class AppEditChatTab extends SliderSuperTab {\n private chatNameInputField: InputField;\n private descriptionInputField: InputField;\n private editPeer: EditPeer;\n public chatId: ChatId;\n\n protected async _init() {\n // * cleanup prev\n this.listenerSetter.removeAll();\n this.scrollable.container.replaceChildren();\n\n this.container.classList.add('edit-peer-container', 'edit-group-container');\n this.setTitle('Edit');\n\n let [\n chatFull,\n chat,\n isBroadcast,\n isChannel,\n canChangeType,\n canChangePermissions,\n canManageTopics,\n appConfig\n ] = await Promise.all([\n this.managers.appProfileManager.getChatFull(this.chatId, true),\n this.managers.appChatsManager.getChat(this.chatId) as Promise,\n this.managers.appChatsManager.isBroadcast(this.chatId),\n this.managers.appChatsManager.isChannel(this.chatId),\n this.managers.appChatsManager.hasRights(this.chatId, 'change_type'),\n this.managers.appChatsManager.hasRights(this.chatId, 'change_permissions'),\n this.managers.appChatsManager.hasRights(this.chatId, 'manage_topics'),\n this.managers.apiManager.getAppConfig()\n ]);\n\n const chatUpdateListeners: {[type in 'full' | 'basic']: (() => void)[]} = {full: [], basic: []};\n const addChatUpdateListener = (callback: () => void, type: 'full' | 'basic' = 'basic') => {\n chatUpdateListeners[type].push(callback);\n };\n\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n if(this.chatId === chatId) {\n chat = await this.managers.appChatsManager.getChat(this.chatId) as typeof chat;\n chatUpdateListeners['basic'].forEach((callback) => callback());\n }\n });\n\n this.listenerSetter.add(rootScope)('chat_full_update', async(chatId) => {\n if(this.chatId === chatId) {\n chatFull = await this.managers.appProfileManager.getCachedFullChat(chatId) || chatFull;\n chatUpdateListeners['full'].forEach((callback) => callback());\n }\n });\n\n const peerId = this.chatId.toPeerId(true);\n\n {\n const section = new SettingSection({noDelimiter: true, caption: true});\n const inputFields: InputField[] = [];\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.chatNameInputField = new InputField({\n label: isBroadcast ? 'EnterChannelName' : 'CreateGroup.NameHolder',\n name: 'chat-name',\n maxLength: 255,\n required: true\n });\n this.descriptionInputField = new InputField({\n label: 'DescriptionPlaceholder',\n name: 'chat-description',\n maxLength: 255\n });\n\n this.chatNameInputField.setOriginalValue(chat.title);\n this.descriptionInputField.setOriginalValue(chatFull.about);\n\n inputWrapper.append(this.chatNameInputField.container, this.descriptionInputField.container);\n\n inputFields.push(this.chatNameInputField, this.descriptionInputField);\n\n this.editPeer = new EditPeer({\n peerId,\n inputFields,\n listenerSetter: this.listenerSetter,\n popupOptions: {isForum: (chat as Chat.channel).pFlags.forum}\n });\n this.content.append(this.editPeer.nextBtn);\n\n section.content.append(this.editPeer.avatarEdit.container, inputWrapper);\n\n if(canChangeType) {\n const chatTypeRow = new Row({\n titleLangKey: isBroadcast ? 'ChannelType' : 'GroupType',\n clickable: () => {\n const tab = this.slider.createTab(AppChatTypeTab);\n tab.chatId = this.chatId;\n tab.chatFull = chatFull;\n tab.open();\n },\n icon: 'lock',\n listenerSetter: this.listenerSetter\n });\n\n const setChatTypeSubtitle = () => {\n let key: LangPackKey;\n const username = getPeerActiveUsernames(chat as Chat.channel)[0];\n if(isBroadcast) {\n key = username ? 'TypePublic' : 'TypePrivate';\n } else {\n key = username ? 'TypePublicGroup' : 'TypePrivateGroup';\n }\n\n chatTypeRow.subtitle.replaceChildren(i18n(key));\n };\n\n setChatTypeSubtitle();\n addChatUpdateListener(setChatTypeSubtitle);\n section.content.append(chatTypeRow.container);\n }\n\n if(canChangeType || canChangePermissions) {\n const reactionsRow = new Row({\n titleLangKey: 'Reactions',\n icon: 'reactions',\n clickable: () => {\n const tab = this.slider.createTab(AppChatReactionsTab);\n tab.chatId = this.chatId;\n tab.open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const availableReactions = await this.managers.appReactionsManager.getAvailableReactions();\n const availableReactionsLength = availableReactions.filter((availableReaction) => !availableReaction.pFlags.inactive).length;\n const setReactionsLength = () => {\n const chatAvailableReactions = chatFull.available_reactions ?? {_: 'chatReactionsNone'};\n if(chatAvailableReactions._ === 'chatReactionsSome') {\n const length = chatAvailableReactions.reactions.length;\n if(length === availableReactionsLength) {\n replaceContent(reactionsRow.subtitle, i18n('ReactionsAll'));\n } else {\n reactionsRow.subtitle.textContent = length + '/' + availableReactionsLength;\n }\n } else {\n replaceContent(reactionsRow.subtitle, i18n(chatAvailableReactions._ === 'chatReactionsAll' ? 'ReactionsAll' : 'Checkbox.Disabled'));\n }\n };\n\n setReactionsLength();\n addChatUpdateListener(setReactionsLength, 'full');\n section.content.append(reactionsRow.container);\n }\n\n if(canChangePermissions && !isBroadcast) {\n const flags = [\n 'send_messages',\n 'send_media',\n 'send_stickers',\n 'send_polls',\n 'embed_links',\n 'invite_users',\n 'pin_messages',\n 'change_info'\n ] as ChatRights[];\n\n const permissionsRow = new Row({\n titleLangKey: 'ChannelPermissions',\n clickable: () => {\n const tab = this.slider.createTab(AppGroupPermissionsTab);\n tab.chatId = this.chatId;\n tab.open();\n },\n icon: 'permissions',\n listenerSetter: this.listenerSetter\n });\n\n const setPermissionsLength = () => {\n permissionsRow.subtitle.textContent = flags.reduce((acc, f) => acc + +hasRights(chat, f, (chat as Chat.chat).default_banned_rights), 0) + '/' + flags.length;\n };\n\n setPermissionsLength();\n addChatUpdateListener(setPermissionsLength);\n section.content.append(permissionsRow.container);\n }\n\n if(canManageTopics && (chat.participants_count >= appConfig.forum_upgrade_participants_min || (chat as Chat.channel).pFlags.forum) && !isBroadcast) {\n const topicsRow = new Row({\n checkboxField: new CheckboxField({toggle: true}),\n titleLangKey: 'Topics',\n clickable: () => {},\n icon: 'topics',\n listenerSetter: this.listenerSetter\n });\n\n const setTopics = () => {\n const isForum = !!(chat as Chat.channel).pFlags.forum;\n this.editPeer.avatarElem.parentElement.classList.toggle('is-forum', isForum);\n topicsRow.checkboxField.setValueSilently(isForum);\n };\n\n this.listenerSetter.add(topicsRow.checkboxField.input)('change', (e) => {\n if(!e.isTrusted) {\n return;\n }\n\n const promise = this.managers.appChatsManager.toggleForum(this.chatId, topicsRow.checkboxField.checked);\n topicsRow.disableWithPromise(promise);\n });\n\n setTopics();\n addChatUpdateListener(setTopics);\n\n section.caption.replaceChildren(i18n('ForumToggleDescription'));\n section.content.append(topicsRow.container);\n }\n\n section.caption.classList.toggle('hide', !section.caption.childElementCount);\n\n /* const administratorsRow = new Row({\n titleLangKey: 'PeerInfo.Administrators',\n subtitle: '' + ((chatFull as ChatFull.channelFull).admins_count || 1),\n icon: 'admin',\n clickable: true\n });\n\n section.content.append(administratorsRow.container); */\n\n this.scrollable.append(section.container);\n\n attachClickEvent(this.editPeer.nextBtn, () => {\n this.editPeer.nextBtn.disabled = true;\n\n const promises: Promise[] = [];\n\n const id = this.chatId;\n if(this.chatNameInputField.isValidToChange()) {\n promises.push(this.managers.appChatsManager.editTitle(id, this.chatNameInputField.value));\n }\n\n if(this.descriptionInputField.isValidToChange()) {\n promises.push(this.managers.appChatsManager.editAbout(id, this.descriptionInputField.value));\n }\n\n if(this.editPeer.uploadAvatar) {\n promises.push(this.editPeer.uploadAvatar().then((inputFile) => {\n return this.managers.appChatsManager.editPhoto(id, inputFile);\n }));\n }\n\n Promise.race(promises).finally(() => {\n this.editPeer.nextBtn.removeAttribute('disabled');\n this.close();\n });\n }, {listenerSetter: this.listenerSetter});\n\n\n /* if(appChatsManager.hasRights(-this.peerId, 'change_info')) {\n const discussionRow = new Row({\n titleLangKey: 'PeerInfo.Discussion',\n subtitleLangKey: 'PeerInfo.Discussion.Add',\n clickable: true,\n icon: 'message'\n });\n\n section.content.append(discussionRow.container);\n }\n\n const administratorsRow = new Row({\n titleLangKey: 'PeerInfo.Administrators',\n subtitle: '' + chatFull.admins_count,\n icon: 'admin',\n clickable: true\n });\n\n section.content.append(administratorsRow.container); */\n\n if(isBroadcast && await this.managers.appChatsManager.hasRights(this.chatId, 'change_info')) {\n const signMessagesCheckboxField = new CheckboxField({\n text: 'ChannelSignMessages',\n checked: !!(chat as Chat.channel).pFlags.signatures\n });\n\n this.listenerSetter.add(signMessagesCheckboxField.input)('change', () => {\n const toggle = signMessagesCheckboxField.toggleDisability(true);\n this.managers.appChatsManager.toggleSignatures(this.chatId, signMessagesCheckboxField.checked).then(() => {\n toggle();\n });\n });\n\n addChatUpdateListener(() => {\n signMessagesCheckboxField.setValueSilently(!!(chat as Chat.channel).pFlags.signatures);\n });\n\n section.content.append(CreateRowFromCheckboxField(signMessagesCheckboxField).container);\n }\n }\n\n if(!isBroadcast) {\n const section = new SettingSection({\n\n });\n\n /* const membersRow = new Row({\n titleLangKey: isBroadcast ? 'PeerInfo.Subscribers' : 'GroupMembers',\n icon: 'newgroup',\n clickable: true\n });\n\n membersRow.subtitle.append(i18n('Subscribers', [numberThousandSplitter(335356)]));\n\n section.content.append(membersRow.container); */\n\n if(!isBroadcast && canChangeType) {\n const showChatHistoryCheckboxField = new CheckboxField({\n text: 'ChatHistory'\n });\n\n this.listenerSetter.add(showChatHistoryCheckboxField.input)('change', () => {\n const toggle = showChatHistoryCheckboxField.toggleDisability(true);\n this.managers.appChatsManager.togglePreHistoryHidden(this.chatId, !showChatHistoryCheckboxField.checked).then(() => {\n toggle();\n });\n });\n\n // ! it won't be updated because chatFull will be old\n const onChatUpdate = () => {\n showChatHistoryCheckboxField.setValueSilently(isChannel && !(chatFull as ChatFull.channelFull).pFlags.hidden_prehistory);\n };\n\n onChatUpdate();\n addChatUpdateListener(onChatUpdate);\n\n section.content.append(CreateRowFromCheckboxField(showChatHistoryCheckboxField).container);\n }\n\n if(section.content.childElementCount) {\n this.scrollable.append(section.container);\n }\n }\n\n if(await this.managers.appChatsManager.hasRights(this.chatId, 'delete_chat')) {\n const section = new SettingSection({});\n\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'delete', text: isBroadcast ? 'PeerInfo.DeleteChannel' : 'DeleteAndExitButton'});\n\n attachClickEvent(btnDelete, () => {\n new PopupDeleteDialog(peerId/* , 'delete' */, undefined, (promise) => {\n const toggle = toggleDisability([btnDelete], true);\n promise.then(() => {\n this.close();\n }, () => {\n toggle();\n });\n });\n }, {listenerSetter: this.listenerSetter});\n\n section.content.append(btnDelete);\n\n this.scrollable.append(section.container);\n }\n\n if(!isChannel) {\n // ! this one will fire earlier than tab's closeAfterTimeout (destroy) event and listeners will be erased, so destroy won't fire\n this.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\n if(peerId === migrateFrom) {\n this.chatId = migrateTo.toChatId();\n this._init();\n }\n });\n }\n }\n\n public init() {\n return this._init();\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';\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 Button from '../../button';\nimport ButtonIcon from '../../buttonIcon';\nimport I18n, {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';\nimport {Message} from '../../../layer';\nimport getMessageThreadId from '../../../lib/appManagers/utils/messages/getMessageThreadId';\nimport AppEditTopicTab from './editTopic';\n\ntype SharedMediaHistoryStorage = Partial<{\n [type in SearchSuperType]: {mid: number, peerId: PeerId}[]\n}>;\n\nconst historiesStorage: {\n [peerId: PeerId]: {\n [threadId: number]: SharedMediaHistoryStorage\n }\n} = {};\n\n// TODO: ะพั‚ั€ะตะดะฐะบั‚ะธั€ะพะฒะฐะฝะฝะพะต ัะพะพะฑั‰ะตะฝะธะต ะฝะต ะธะทะผะตะฝะธั‚ัั\nexport default class AppSharedMediaTab extends SliderSuperTab {\n private editBtn: HTMLElement;\n\n private peerId: PeerId;\n private threadId: number;\n\n private searchSuper: AppSearchSuper;\n\n private profile: PeerProfile;\n private peerChanged: boolean;\n\n private titleI18n: I18n.IntlElement;\n\n public isFirst: boolean;\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 if(this.isFirst) {\n animatedCloseIcon.classList.add('state-back');\n }\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.titleI18n = new I18n.IntlElement();\n this.title.append(this.titleI18n.element);\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.managers, this.scrollable, this.listenerSetter);\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 setIsSharedMedia(top <= HEADER_HEIGHT);\n };\n\n const setIsSharedMedia = (isSharedMedia: boolean) => {\n animatedCloseIcon.classList.toggle('state-back', this.isFirst || 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({\n content: transitionContainer,\n type: 'slide-fade',\n transitionTime: 400,\n isHeavy: false\n });\n\n transition(0);\n\n attachClickEvent(this.closeBtn, (e) => {\n if(transition.prevId()) {\n this.scrollable.scrollIntoViewNew({\n element: this.scrollable.container.firstElementChild as HTMLElement,\n position: 'start'\n });\n transition(0);\n\n if(!this.isFirst) {\n animatedCloseIcon.classList.remove('state-back');\n }\n } else if(!this.scrollable.isHeavyAnimationInProgress) {\n this.slider.onCloseBtnClick();\n }\n }, {listenerSetter: this.listenerSetter});\n\n attachClickEvent(this.editBtn, async() => {\n let tab: AppEditChatTab | AppEditContactTab | AppEditTopicTab;\n const {peerId, threadId} = this;\n if(threadId && await this.managers.appPeersManager.isForum(peerId)) {\n tab = this.slider.createTab(AppEditTopicTab)\n } else if(peerId.isAnyChat()) {\n tab = this.slider.createTab(AppEditChatTab);\n } else {\n tab = this.slider.createTab(AppEditContactTab);\n }\n\n if(tab) {\n if(tab instanceof AppEditTopicTab) {\n tab.open(peerId, this.threadId);\n } else {\n if(tab instanceof AppEditChatTab) {\n tab.chatId = peerId.toChatId();\n } else {\n tab.peerId = peerId;\n }\n\n tab.open();\n }\n }\n }, {listenerSetter: this.listenerSetter});\n\n this.listenerSetter.add(rootScope)('contacts_update', (userId) => {\n if(this.peerId === userId) {\n this.toggleEditBtn();\n }\n });\n\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\n if(this.peerId === chatId.toPeerId(true)) {\n this.toggleEditBtn();\n }\n });\n\n this.listenerSetter.add(rootScope)('history_multiappend', (message) => {\n this.renderNewMessage(message);\n });\n\n this.listenerSetter.add(rootScope)('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 this.listenerSetter.add(rootScope)('message_sent', ({message}) => {\n this.renderNewMessage(message);\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 const timeout = mediaTab.type === 'members' && rootScope.settings.animationsEnabled ? 250 : 0;\n setTimeout(() => {\n btnAddMembers.classList.toggle('is-hidden', mediaTab.type !== 'members');\n }, timeout);\n },\n managers: this.managers\n });\n\n this.searchSuper.scrollStartCallback = () => {\n setIsSharedMedia(true);\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 attachClickEvent(btnAddMembers, async() => {\n const peerId = this.peerId;\n const id = this.peerId.toChatId();\n const isChannel = await this.managers.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 = this.slider.createTab(AppAddMembersTab);\n tab.open({\n type: 'channel',\n skippable: false,\n takeOut: (peerIds) => {\n showConfirmation(peerIds, () => {\n const promise = this.managers.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 this.managers.appChatsManager.addChatUser(id, peerId, checked.size ? undefined : 0)\n .catch(onError);\n });\n }, 0);\n }\n });\n }\n }, {listenerSetter: this.listenerSetter});\n\n // console.log('construct shared media time:', performance.now() - perf);\n }\n\n private _renderNewMessage(message: Message.message | Message.messageService, threadId?: number) {\n const historyStorage = historiesStorage[message.peerId]?.[threadId];\n if(!historyStorage) return;\n\n for(const mediaTab of this.searchSuper.mediaTabs) {\n const inputFilter = mediaTab.inputFilter;\n const history = historyStorage[inputFilter];\n if(!history) {\n continue;\n }\n\n const filtered = this.searchSuper.filterMessagesByType([message], inputFilter)\n .filter((message) => !history.find((m) => m.mid === message.mid && m.peerId === message.peerId));\n if(filtered.length) {\n history.unshift(...filtered.map((message) => ({mid: message.mid, peerId: message.peerId})));\n\n if(this.peerId === message.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 private async renderNewMessage(message: Message.message | Message.messageService) {\n if(this.init) return; // * not inited yet\n\n const {peerId} = message;\n const isForum = await this.managers.appPeersManager.isForum(peerId);\n const threadId = getMessageThreadId(message, isForum);\n\n this._renderNewMessage(message);\n if(threadId) {\n this._renderNewMessage(message, threadId);\n }\n }\n\n public _deleteDeletedMessages(historyStorage: SharedMediaHistoryStorage, peerId: PeerId, mids: number[]) {\n for(const mid of mids) {\n for(const type of this.searchSuper.mediaTabs) {\n const inputFilter = type.inputFilter;\n\n const history = historyStorage[inputFilter];\n if(!history) continue;\n\n const idx = history.findIndex((m) => m.mid === mid);\n if(idx === -1) {\n continue;\n }\n\n history.splice(idx, 1);\n\n if(this.peerId === peerId) {\n const container = this.searchSuper.tabs[inputFilter];\n const div = container.querySelector(`[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 // can have element in different tabs somehow\n // break;\n }\n }\n }\n\n public deleteDeletedMessages(peerId: PeerId, mids: number[]) {\n if(this.init) return; // * not inited yet\n\n const h = historiesStorage[peerId];\n if(!h) return;\n\n for(const threadId in h) {\n this._deleteDeletedMessages(h[threadId], peerId, mids);\n }\n\n this.scrollable.onScroll();\n }\n\n private async cleanupHTML() {\n // const perf = performance.now();\n const isAnyChat = this.peerId.isAnyChat();\n const [canViewMembers, hasRights] = await Promise.all([\n isAnyChat ? this.searchSuper.canViewMembers() : false,\n isAnyChat ? this.managers.appChatsManager.hasRights(this.peerId.toChatId(), 'invite_users') : false\n ]);\n\n return () => {\n this.profile.cleanupHTML();\n this.editBtn.classList.add('hide');\n this.searchSuper.cleanupHTML(true);\n this.container.classList.toggle('can-add-members', canViewMembers && hasRights);\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?: number) {\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: (historiesStorage[peerId] ??= {})[threadId] ??= {}\n });\n\n this.profile.setPeer(peerId, threadId);\n\n return true;\n }\n\n private async changeTitleKey() {\n const isForum = this.managers.appPeersManager.isForum(this.peerId);\n\n return () => {\n this.titleI18n.compareAndUpdate({key: this.threadId && isForum ? 'AccDescrTopic' : 'Profile'});\n };\n }\n\n public async fillProfileElements() {\n if(!this.peerChanged) {\n return;\n }\n\n this.peerChanged = false;\n const callbacks = await Promise.all([\n this.cleanupHTML(),\n this.toggleEditBtn(true),\n this.profile.fillProfileElements(),\n this.changeTitleKey()\n ]);\n\n return () => {\n callbacks.forEach((callback) => {\n callback?.();\n });\n };\n }\n\n private async toggleEditBtn(manual?: T): Promise void : void> {\n let show: boolean;\n if(this.peerId.isUser()) {\n show = this.peerId !== rootScope.myId && await this.managers.appUsersManager.isContact(this.peerId.toUserId());\n } else {\n const chatId = this.peerId.toChatId();\n const isTopic = this.threadId && await this.managers.appChatsManager.isForum(chatId);\n show = await this.managers.appChatsManager.hasRights(chatId, isTopic ? 'manage_topics' : 'change_info');\n }\n\n const callback = () => {\n this.editBtn.classList.toggle('hide', !show);\n };\n\n return manual ? callback : callback() as any;\n }\n\n public loadSidebarMedia(single: boolean, justLoad?: boolean) {\n this.searchSuper.load(single, justLoad);\n }\n\n onOpenAfterTimeout() {\n super.onOpenAfterTimeout();\n\n this.scrollable.onScroll();\n }\n\n onCloseAfterTimeout() {\n super.onCloseAfterTimeout();\n\n if(this.destroyable) {\n this.profile.destroy();\n this.searchSuper.destroy();\n }\n }\n\n public destroy() {\n this.destroyable = true;\n this.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 rootScope from '../lib/rootScope';\n\ntype SetTransitionOptions = {\n element: HTMLElement,\n className: string,\n forwards: boolean,\n duration: number,\n onTransitionEnd?: () => void,\n useRafs?: number,\n onTransitionStart?: () => void\n};\nconst SetTransition = (options: SetTransitionOptions) => {\n const {element, className, forwards, duration, onTransitionEnd, onTransitionStart, useRafs} = options;\n const {timeout, raf} = element.dataset;\n if(timeout !== undefined) {\n clearTimeout(+timeout);\n }\n\n // useRafs = undefined;\n // duration = 0;\n\n if(raf !== undefined) {\n window.cancelAnimationFrame(+raf);\n if(!useRafs) {\n delete element.dataset.raf;\n }\n }\n\n // if(forwards && className && element.classList.contains(className) && !element.classList.contains('animating')) {\n // return;\n // }\n\n if(useRafs && rootScope.settings.animationsEnabled && duration) {\n element.dataset.raf = '' + window.requestAnimationFrame(() => {\n delete element.dataset.raf;\n SetTransition({\n ...options,\n useRafs: useRafs - 1\n });\n });\n\n return;\n }\n\n if(forwards && className) {\n element.classList.add(className);\n }\n\n const afterTimeout = () => {\n delete element.dataset.timeout;\n if(!forwards && className) {\n element.classList.remove('backwards', className);\n }\n\n element.classList.remove('animating');\n\n onTransitionEnd?.();\n };\n\n onTransitionStart?.();\n if(!rootScope.settings.animationsEnabled || !duration) {\n element.classList.remove('animating', 'backwards');\n afterTimeout();\n return;\n }\n\n element.classList.add('animating');\n\n element.classList.toggle('backwards', !forwards);\n element.dataset.timeout = '' + setTimeout(afterTimeout, duration);\n};\n\nexport default SetTransition;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {horizontalMenu} from './horizontalMenu';\nimport TransitionSlider from './transition';\nimport appNavigationController, {NavigationItem} from './appNavigationController';\nimport SliderSuperTab, {SliderSuperTabConstructable} from './sliderTab';\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\nimport safeAssign from '../helpers/object/safeAssign';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport {getMiddleware, MiddlewareHelper} from '../helpers/middleware';\nimport {MaybePromise} from '../types';\n\nconst TRANSITION_TIME = 250;\n\nexport {SliderSuperTab};\n\nexport default class SidebarSlider {\n protected _selectTab: ReturnType;\n protected historyTabIds: (number | SliderSuperTab)[] = []; // * key is any, since right sidebar is ugly nowz\n protected tabsContainer: HTMLElement;\n public sidebarEl: HTMLElement;\n protected tabs: Map; // * key is any, since right sidebar is ugly now\n private canHideFirst = false;\n private navigationType: NavigationItem['type'];\n protected managers: AppManagers;\n protected middlewareHelper: MiddlewareHelper;\n public onOpenTab: () => MaybePromise;\n\n constructor(options: {\n sidebarEl: SidebarSlider['sidebarEl'],\n tabs?: SidebarSlider['tabs'],\n canHideFirst?: SidebarSlider['canHideFirst'],\n navigationType: SidebarSlider['navigationType']\n }) {\n safeAssign(this, options);\n\n this.tabs ??= new Map();\n\n this.tabsContainer = this.sidebarEl.querySelector('.sidebar-slider');\n this._selectTab = TransitionSlider({\n content: this.tabsContainer,\n type: 'navigation',\n transitionTime: TRANSITION_TIME\n });\n if(!this.canHideFirst) {\n this._selectTab(0);\n }\n\n this.middlewareHelper = getMiddleware();\n\n // Array.from(this.sidebarEl.querySelectorAll('.sidebar-close-button') as any as HTMLElement[]).forEach((el) => {\n // attachClickEvent(el, this.onCloseBtnClick);\n // });\n }\n\n public getMiddleware() {\n return this.middlewareHelper.get();\n }\n\n public onCloseBtnClick = () => {\n const item = appNavigationController.findItemByType(this.navigationType);\n if(item) {\n appNavigationController.back(this.navigationType);\n } else if(this.historyTabIds.length) {\n this.closeTab(this.historyTabIds[this.historyTabIds.length - 1]);\n }\n // this.closeTab();\n };\n\n public closeTab = (id?: number | SliderSuperTab, animate?: boolean, isNavigation?: boolean) => {\n if(id !== undefined && this.historyTabIds[this.historyTabIds.length - 1] !== id) {\n this.removeTabFromHistory(id);\n return false;\n }\n\n // console.log('sidebar-close-button click:', this.historyTabIDs);\n const closingId = this.historyTabIds.pop(); // pop current\n this.onCloseTab(closingId, animate, isNavigation);\n\n const tab = this.historyTabIds[this.historyTabIds.length - 1];\n this._selectTab(tab !== undefined ? (tab instanceof SliderSuperTab ? tab.container : tab) : (this.canHideFirst ? -1 : 0), animate);\n return true;\n };\n\n public async selectTab(id: number | SliderSuperTab) {\n /* if(id instanceof SliderSuperTab) {\n id = id.id;\n } */\n\n if(this.historyTabIds[this.historyTabIds.length - 1] === id) {\n return false;\n }\n\n const tab: SliderSuperTab = id instanceof SliderSuperTab ? id : this.tabs.get(id);\n this.onOpenTab && await this.onOpenTab();\n\n if(tab) {\n // @ts-ignore\n tab.onOpen?.();\n\n // @ts-ignore\n if(tab.onOpenAfterTimeout) {\n setTimeout(() => {\n // @ts-ignore\n tab.onOpenAfterTimeout();\n }, TRANSITION_TIME);\n }\n }\n\n // if(!this.canHideFirst || this.historyTabIds.length) {\n appNavigationController.pushItem({\n type: this.navigationType,\n onPop: (canAnimate) => {\n this.closeTab(undefined, canAnimate, true);\n return true;\n }\n });\n // }\n\n this.historyTabIds.push(id);\n this._selectTab(id instanceof SliderSuperTab ? id.container : id);\n return true;\n }\n\n public removeTabFromHistory(id: number | SliderSuperTab) {\n indexOfAndSplice(this.historyTabIds, id);\n this.onCloseTab(id, undefined);\n }\n\n public sliceTabsUntilTab(tabConstructor: SliderSuperTabConstructable, preserveTab: SliderSuperTab) {\n for(let i = this.historyTabIds.length - 1; i >= 0; --i) {\n const tab = this.historyTabIds[i];\n if(tab === preserveTab) continue;\n else if(tab instanceof tabConstructor) {\n break;\n }\n\n this.removeTabFromHistory(tab);\n // appNavigationController.removeByType(this.navigationType, true);\n }\n }\n\n public getTab(tabConstructor: SliderSuperTabConstructable) {\n return this.historyTabIds.find((t) => t instanceof tabConstructor) as T;\n }\n\n public getHistory() {\n return this.historyTabIds;\n }\n\n public isTabExists(tabConstructor: SliderSuperTabConstructable) {\n return !!this.getTab(tabConstructor);\n }\n\n protected onCloseTab(id: number | SliderSuperTab, animate: boolean, isNavigation?: boolean) {\n if(!isNavigation) {\n appNavigationController.removeByType(this.navigationType, true);\n }\n\n const tab: SliderSuperTab = id instanceof SliderSuperTab ? id : this.tabs.get(id);\n if(tab) {\n try {\n // @ts-ignore\n tab.onClose?.();\n } catch(err) {\n console.error('tab onClose error', tab);\n }\n\n // @ts-ignore\n if(tab.onCloseAfterTimeout) {\n setTimeout(() => {\n // @ts-ignore\n tab.onCloseAfterTimeout();\n }, TRANSITION_TIME + 30);\n }\n }\n }\n\n public addTab(tab: SliderSuperTab) {\n if(!tab.container.parentElement) {\n this.tabsContainer.append(tab.container);\n\n if(tab.closeBtn) {\n tab.closeBtn.addEventListener('click', this.onCloseBtnClick);\n }\n }\n }\n\n public deleteTab(tab: SliderSuperTab) {\n this.tabs.delete(tab);\n }\n\n public createTab(\n ctor: SliderSuperTabConstructable,\n destroyable = true,\n doNotAppend?: boolean\n ) {\n const tab = new ctor(doNotAppend ? undefined : this, destroyable);\n tab.managers = this.managers;\n return tab;\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 EventListenerBase from '../helpers/eventListenerBase';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {getMiddleware, MiddlewareHelper} from '../helpers/middleware';\nimport noop from '../helpers/noop';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport {i18n, LangPackKey} from '../lib/langPack';\nimport ButtonIcon from './buttonIcon';\nimport Scrollable from './scrollable';\nimport SidebarSlider from './slider';\n\nexport interface SliderSuperTabConstructable {\n new(slider: SidebarSlider, destroyable: boolean): T;\n}\n\nexport interface SliderSuperTabEventableConstructable {\n new(slider: SidebarSlider, destroyable: boolean): SliderSuperTabEventable;\n}\n\nexport default class SliderSuperTab {\n public static getInitArgs?(fromTab: SliderSuperTab): any;\n\n public container: HTMLElement;\n\n public header: HTMLElement;\n public closeBtn: HTMLElement;\n public title: HTMLElement;\n\n public content: HTMLElement;\n public scrollable: Scrollable;\n\n public slider: SidebarSlider;\n public destroyable: boolean;\n public listenerSetter: ListenerSetter;\n\n public managers: AppManagers;\n public middlewareHelper: MiddlewareHelper;\n\n constructor(slider: SidebarSlider, destroyable?: boolean) {\n this._constructor(slider, destroyable);\n }\n\n public _constructor(slider: SidebarSlider, destroyable = true): any {\n this.slider = slider;\n this.middlewareHelper = slider ? slider.getMiddleware().create() : getMiddleware();\n this.destroyable = destroyable;\n\n this.container = document.createElement('div');\n this.container.classList.add('tabs-tab', 'sidebar-slider-item');\n\n // * Header\n this.header = document.createElement('div');\n this.header.classList.add('sidebar-header');\n\n this.closeBtn = ButtonIcon('left sidebar-close-button', {noRipple: true});\n this.title = document.createElement('div');\n this.title.classList.add('sidebar-header__title');\n this.header.append(this.closeBtn, this.title);\n\n // * Content\n this.content = document.createElement('div');\n this.content.classList.add('sidebar-content');\n\n this.scrollable = new Scrollable(this.content, undefined, undefined, true);\n this.scrollable.attachBorderListeners(this.container);\n\n this.container.append(this.header, this.content);\n\n this.slider?.addTab(this);\n\n this.listenerSetter = new ListenerSetter();\n }\n\n public close() {\n return this.slider.closeTab(this);\n }\n\n public async open(...args: Parameters) {\n if(this.init) {\n try {\n const result = this.init(...args);\n this.init = null;\n\n if(result instanceof Promise) {\n await result;\n }\n } catch(err) {\n console.error('open tab error', err);\n }\n }\n\n this.slider.selectTab(this);\n }\n\n public init(...args: any[]): Promise | any {\n\n }\n\n protected onOpen() {}\n protected onOpenAfterTimeout() {}\n protected onClose() {}\n\n protected onCloseAfterTimeout() {\n if(this.destroyable) { // ! WARNING, ะฟะพะบะฐ ั‡ั‚ะพ ัั‚ะพ ะฑัƒะดะตั‚ ั€ะฐะฑะพั‚ะฐั‚ัŒ ั‚ะพะปัŒะบะพ ั ัะฐะผะพะน ะฟะพัะปะตะดะฝะตะน ะฒะฝัƒั‚ั€ะตะฝะฝะตะน ะฒะบะปะฐะดะบะพะน !\n this.slider?.deleteTab(this);\n this.container.remove();\n this.scrollable.destroy();\n this.listenerSetter?.removeAll();\n this.middlewareHelper?.destroy();\n }\n }\n\n protected setTitle(key: LangPackKey) {\n this.title.replaceChildren(i18n(key));\n }\n}\n\nexport class SliderSuperTabEventable extends SliderSuperTab {\n public eventListener: EventListenerBase<{\n destroy: () => void | Promise,\n destroyAfter: (promise: Promise) => void,\n close: () => void\n }>;\n\n constructor(slider: SidebarSlider) {\n super(slider);\n this.eventListener = new EventListenerBase();\n }\n\n onClose() {\n this.eventListener.dispatchEvent('close');\n }\n\n onCloseAfterTimeout() {\n const results = this.eventListener.dispatchResultableEvent('destroy');\n this.eventListener.dispatchEvent('destroyAfter', Promise.all(results).then(noop, noop));\n this.eventListener.cleanup();\n return super.onCloseAfterTimeout();\n }\n}\n\n/* // @ts-ignore\ninterface SliderSuperEventsTab extends SliderSuperTab, EventListenerBase<{}> {\n superConstructor: (...args: any[]) => any;\n}\nclass SliderSuperEventsTab implements SliderSuperEventsTab {\n constructor(slider: SidebarSlider) {\n this.superConstructor([slider, true]);\n }\n}\napplyMixins(SliderSuperEventsTab, [SliderSuperTab, EventListenerBase]);\n\n(window as any).lol = SliderSuperEventsTab\n\nexport {SliderSuperEventsTab}; */\n","/*\n * 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, {AppDialogsManager, DialogDom, DialogElementSize} from '../lib/appManagers/appDialogsManager';\nimport {getHeavyAnimationPromise} from '../hooks/useHeavyAnimationCheck';\nimport isInDOM from '../helpers/dom/isInDOM';\nimport positionElementByIndex from '../helpers/dom/positionElementByIndex';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport {fastRaf} from '../helpers/schedulers';\nimport SortedList, {SortedElementBase} from '../helpers/sortedList';\nimport safeAssign from '../helpers/object/safeAssign';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport getUserStatusString from './wrappers/getUserStatusString';\nimport type LazyLoadQueue from './lazyLoadQueue';\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: LazyLoadQueue;\n protected avatarSize: DialogElementSize = 'abitbigger';\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 protected managers: AppManagers;\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 managers: SortedUserList['managers']\n }) {\n super({\n getIndex: options.getIndex || ((element) => this.managers.appUsersManager.getUserStatusForSort(element.id)),\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onListLengthChange && this.onListLengthChange();\n },\n onUpdate: options.onUpdate || (async(element) => {\n const status = getUserStatusString(await this.managers.appUsersManager.getUser(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 peerId: base.id,\n container: false,\n avatarSize: this.avatarSize,\n autonomous: this.autonomous,\n meAsSaved: false,\n rippleEnabled: this.rippleEnabled,\n wrapOptions: {\n lazyLoadQueue: this.lazyLoadQueue\n }\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 IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {simulateClickEvent, attachClickEvent} from '../helpers/dom/clickEvent';\nimport findUpAsChild from '../helpers/dom/findUpAsChild';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport getVisibleRect from '../helpers/dom/getVisibleRect';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {makeMediaSize} from '../helpers/mediaSize';\nimport {getMiddleware, Middleware} from '../helpers/middleware';\nimport {doubleRaf} from '../helpers/schedulers';\nimport pause from '../helpers/schedulers/pause';\nimport windowSize from '../helpers/windowSize';\nimport {MyDocument} from '../lib/appManagers/appDocsManager';\nimport getStickerEffectThumb from '../lib/appManagers/utils/stickers/getStickerEffectThumb';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport {CustomEmojiElement} from '../lib/richTextProcessor/wrapRichText';\nimport lottieLoader from '../lib/rlottie/lottieLoader';\nimport RLottiePlayer from '../lib/rlottie/rlottiePlayer';\nimport rootScope from '../lib/rootScope';\nimport animationIntersector, {AnimationItemGroup} from './animationIntersector';\nimport SetTransition from './singleTransition';\nimport wrapSticker from './wrappers/sticker';\nimport {STICKER_EFFECT_MULTIPLIER} from './wrappers/sticker';\n\nlet hasViewer = false;\nexport default function attachStickerViewerListeners({listenTo, listenerSetter, selector, findTarget: originalFindTarget}: {\n listenerSetter: ListenerSetter,\n listenTo: HTMLElement,\n selector?: string,\n findTarget?: (e: MouseEvent) => HTMLElement\n}) {\n if(IS_TOUCH_SUPPORTED) {\n return;\n }\n\n const findTarget = (e: MouseEvent, checkForParent?: boolean) => {\n let el: HTMLElement;\n if(originalFindTarget) el = originalFindTarget(e);\n else {\n const s = selector || `.media-sticker-wrapper`;\n el = (e.target as HTMLElement).closest(s) as HTMLElement;\n }\n\n return el && (!checkForParent || findUpAsChild(el, listenTo)) ? el : undefined;\n };\n\n const managers = rootScope.managers;\n\n listenerSetter.add(listenTo)('mousedown', (e) => {\n if(hasViewer || e.buttons > 1 || e.button !== 0) return;\n let mediaContainer = findTarget(e);\n if(!mediaContainer) {\n return;\n }\n\n // const img: HTMLImageElement = mediaContainer.querySelector('img.media-sticker');\n\n const docId = mediaContainer.dataset.docId;\n if(!docId) {\n return;\n }\n\n const className = 'sticker-viewer';\n const group: AnimationItemGroup = 'STICKER-VIEWER';\n const openDuration = 200;\n const switchDuration = 200;\n const previousGroup = animationIntersector.getOnlyOnePlayableGroup();\n const _middleware = getMiddleware();\n let container: HTMLElement, previousTransformer: HTMLElement;\n\n const doThatSticker = async({mediaContainer, doc, middleware, lockGroups, isSwitching}: {\n mediaContainer: HTMLElement,\n doc: MyDocument,\n middleware: Middleware,\n lockGroups?: boolean,\n isSwitching?: boolean\n }) => {\n const effectThumb = getStickerEffectThumb(doc);\n const mediaRect: DOMRect = mediaContainer.getBoundingClientRect();\n const s = makeMediaSize(doc.w, doc.h);\n const size = effectThumb ? 280 : 360;\n const boxSize = makeMediaSize(size, size);\n const fitted = mediaRect.width === mediaRect.height ? boxSize : s.aspectFitted(boxSize);\n\n const bubble = findUpClassName(mediaContainer, 'bubble');\n const isOut = bubble ? bubble.classList.contains('is-out') : true;\n\n const transformer = document.createElement('div');\n transformer.classList.add(className + '-transformer');\n\n const stickerContainer = document.createElement('div');\n stickerContainer.classList.add(className + '-sticker');\n /* transformer.style.width = */stickerContainer.style.width = fitted.width + 'px';\n /* transformer.style.height = */stickerContainer.style.height = fitted.height + 'px';\n\n const stickerEmoji = document.createElement('div');\n stickerEmoji.classList.add(className + '-emoji');\n stickerEmoji.append(wrapEmojiText(doc.stickerEmojiRaw));\n\n if(effectThumb) {\n const margin = (size * STICKER_EFFECT_MULTIPLIER - size) / 3 * (isOut ? 1 : -1);\n transformer.classList.add('has-effect');\n // const property = `--margin-${isOut ? 'right' : 'left'}`;\n // stickerContainer.style.setProperty(property, `${margin * 2}px`);\n transformer.style.setProperty('--translateX', `${margin}px`);\n stickerEmoji.style.setProperty('--translateX', `${-margin}px`);\n }\n\n const overflowElement = findUpClassName(mediaContainer, 'scrollable');\n const visibleRect = getVisibleRect(mediaContainer, overflowElement, true, mediaRect);\n if(visibleRect.overflow.vertical || visibleRect.overflow.horizontal) {\n stickerContainer.classList.add('is-overflow');\n }\n\n // if(img) {\n // const ratio = img.naturalWidth / img.naturalHeight;\n // if((mediaRect.width / mediaRect.height).toFixed(1) !== ratio.toFixed(1)) {\n\n // mediaRect = mediaRect.toJSON();\n // }\n // }\n\n const rect = mediaContainer.getBoundingClientRect();\n const scaleX = rect.width / fitted.width;\n const scaleY = rect.height / fitted.height;\n const transformX = rect.left - (windowSize.width - rect.width) / 2;\n const transformY = rect.top - (windowSize.height - rect.height) / 2;\n transformer.style.transform = `translate(${transformX}px, ${transformY}px) scale(${scaleX}, ${scaleY})`;\n if(isSwitching) transformer.classList.add('is-switching');\n transformer.append(stickerContainer, stickerEmoji);\n container.append(transformer);\n\n const o = await wrapSticker({\n doc,\n div: stickerContainer,\n group,\n width: fitted.width,\n height: fitted.height,\n play: false,\n loop: true,\n middleware,\n managers,\n needFadeIn: false,\n isOut,\n withThumb: false,\n relativeEffect: true,\n loopEffect: true\n }).then(({render}) => render);\n if(!middleware()) return;\n\n if(!container.parentElement) {\n document.body.append(container);\n }\n\n const player = Array.isArray(o) ? o[0] : o;\n\n const firstFramePromise = player instanceof RLottiePlayer ?\n new Promise((resolve) => player.addEventListener('firstFrame', resolve, {once: true})) :\n Promise.resolve();\n await Promise.all([firstFramePromise, doubleRaf()]);\n await pause(0); // ! need it because firstFrame will be called just from the loop\n if(!middleware()) return;\n\n if(lockGroups) {\n animationIntersector.setOnlyOnePlayableGroup(group);\n animationIntersector.checkAnimations2(true);\n }\n\n if(player instanceof RLottiePlayer) {\n const prevPlayer = mediaContainer instanceof CustomEmojiElement ?\n mediaContainer.player as RLottiePlayer :\n lottieLoader.getAnimation(mediaContainer);\n if(prevPlayer) {\n player.curFrame = prevPlayer.curFrame;\n player.play();\n await new Promise((resolve) => {\n let i = 0;\n const c = () => {\n if(++i === 2) {\n resolve();\n player.removeEventListener('enterFrame', c);\n }\n };\n\n player.addEventListener('enterFrame', c);\n });\n if(!middleware()) return;\n player.pause();\n }\n } else if(player instanceof HTMLVideoElement) {\n const prevPlayer = mediaContainer.querySelector('video');\n if(prevPlayer) {\n player.currentTime = prevPlayer.currentTime;\n }\n }\n\n return {\n ready: () => {\n if(player instanceof RLottiePlayer || player instanceof HTMLVideoElement) {\n player.play();\n }\n\n if(effectThumb) {\n simulateClickEvent(stickerContainer);\n }\n },\n transformer\n };\n };\n\n const timeout = window.setTimeout(async() => {\n document.removeEventListener('mousemove', onMousePreMove);\n\n container = document.createElement('div');\n container.classList.add(className);\n hasViewer = true;\n\n const middleware = _middleware.get();\n const doc = await managers.appDocsManager.getDoc(docId);\n if(!middleware()) return;\n\n let result: Awaited>;\n try {\n result = await doThatSticker({\n doc,\n mediaContainer,\n middleware,\n lockGroups: true\n });\n if(!result) return;\n } catch(err) {\n return;\n }\n\n const {ready, transformer} = result;\n\n previousTransformer = transformer;\n\n SetTransition({\n element: container,\n className: 'is-visible',\n forwards: true,\n duration: openDuration,\n onTransitionEnd: () => {\n if(!middleware()) return;\n ready();\n }\n });\n\n document.addEventListener('mousemove', onMouseMove);\n }, 125);\n\n const onMouseMove = async(e: MouseEvent) => {\n const newMediaContainer = findTarget(e, true);\n if(!newMediaContainer || mediaContainer === newMediaContainer) {\n return;\n }\n\n const docId = newMediaContainer.dataset.docId;\n if(!docId) {\n return;\n }\n\n mediaContainer = newMediaContainer;\n _middleware.clean();\n const middleware = _middleware.get();\n\n const doc = await managers.appDocsManager.getDoc(docId);\n if(!middleware()) return;\n\n let r: Awaited>;\n try {\n r = await doThatSticker({\n doc,\n mediaContainer,\n middleware,\n isSwitching: true\n });\n if(!r) return;\n } catch(err) {\n console.error('sticker viewer error', err);\n return;\n }\n\n const {ready, transformer} = r;\n\n const _previousTransformer = previousTransformer;\n SetTransition({\n element: _previousTransformer,\n className: 'is-switching',\n forwards: true,\n duration: switchDuration,\n onTransitionEnd: () => {\n _previousTransformer.remove();\n }\n });\n\n previousTransformer = transformer;\n\n SetTransition({\n element: transformer,\n className: 'is-switching',\n forwards: false,\n duration: switchDuration,\n onTransitionEnd: () => {\n if(!middleware()) return;\n ready();\n }\n });\n };\n\n const onMousePreMove = (e: MouseEvent) => {\n if(!findUpAsChild(e.target as HTMLElement, mediaContainer)) {\n onMouseUp();\n }\n };\n\n const onMouseUp = () => {\n clearTimeout(timeout);\n _middleware.clean();\n\n if(container) {\n SetTransition({\n element: container,\n className: 'is-visible',\n forwards: false,\n duration: openDuration,\n onTransitionEnd: () => {\n container.remove();\n animationIntersector.setOnlyOnePlayableGroup(previousGroup);\n animationIntersector.checkAnimations2(false);\n hasViewer = false;\n }\n });\n\n attachClickEvent(document.body, cancelEvent, {capture: true, once: true});\n }\n\n document.removeEventListener('mousemove', onMousePreMove);\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp, {capture: true});\n };\n\n document.addEventListener('mousemove', onMousePreMove);\n document.addEventListener('mouseup', onMouseUp, {once: true, capture: 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\nexport default class StickyIntersector {\n private headersObserver: IntersectionObserver;\n private elementsObserver: IntersectionObserver;\n\n constructor(private container: HTMLElement, private handler: (stuck: boolean, target: HTMLElement) => void) {\n this.observeHeaders();\n this.observeElements();\n }\n\n /**\n * Sets up an intersection observer to notify when elements with the class\n * `.sticky_sentinel--top` become visible/invisible at the top of the container.\n * @param {!Element} container\n */\n private observeHeaders() {\n this.headersObserver = new IntersectionObserver((entries) => {\n for(const entry of entries) {\n const targetInfo = entry.boundingClientRect;\n const stickyTarget = entry.target.parentElement;\n const rootBoundsInfo = entry.rootBounds;\n\n // Started sticking.\n if(targetInfo.bottom < rootBoundsInfo.top) {\n this.handler(true, stickyTarget);\n }\n\n // Stopped sticking.\n if(targetInfo.bottom >= rootBoundsInfo.top &&\n targetInfo.bottom < rootBoundsInfo.bottom) {\n this.handler(false, stickyTarget);\n }\n }\n }, {threshold: 0, root: this.container});\n }\n\n private observeElements() {\n this.elementsObserver = new IntersectionObserver((entries) => {\n const entry = entries\n .filter((entry) => entry.boundingClientRect.top < entry.rootBounds.top)\n .sort((a, b) => a.boundingClientRect.top - b.boundingClientRect.top)[0];\n if(!entry) return;\n\n const container = entry.isIntersecting ? entry.target : entry.target.nextElementSibling;\n this.handler(true, container as HTMLElement);\n }, {root: this.container});\n }\n\n /**\n * @param {!Element} container\n * @param {string} className\n */\n private addSentinel(container: HTMLElement, className: string) {\n const sentinel = document.createElement('div');\n sentinel.classList.add('sticky_sentinel', className);\n return container.appendChild(sentinel);\n }\n\n /**\n * Notifies when elements w/ the `sticky` class begin to stick or stop sticking.\n * Note: the elements should be children of `container`.\n * @param {!Element} container\n */\n public observeStickyHeaderChanges(element: HTMLElement) {\n const headerSentinel = this.addSentinel(element, 'sticky_sentinel--top');\n this.headersObserver.observe(headerSentinel);\n\n this.elementsObserver.observe(element);\n }\n\n public disconnect() {\n this.headersObserver.disconnect();\n this.elementsObserver.disconnect();\n }\n\n public unobserve(element: HTMLElement, headerSentinel: HTMLElement) {\n this.elementsObserver.unobserve(element);\n this.headersObserver.unobserve(headerSentinel);\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 IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport safeAssign from '../helpers/object/safeAssign';\nimport contextMenuController from '../helpers/contextMenuController';\nimport {Middleware} from '../helpers/middleware';\nimport ListenerSetter, {Listener, ListenerOptions} from '../helpers/listenerSetter';\nimport {attachContextMenuListener} from '../helpers/dom/attachContextMenuListener';\nimport pause from '../helpers/schedulers/pause';\nimport deferredPromise from '../helpers/cancellablePromise';\n\ntype E = {\n clientX: number,\n clientY: number,\n target: EventTarget,\n button?: number\n};\n\ntype EE = E | (Exclude & {\n touches: E[]\n});\n\nconst getEvent = (e: EE) => {\n return 'touches' in e ? e.touches[0] : e;\n};\n\nconst attachGlobalListenerTo = document;\n\nlet RESET_GLOBAL = false;\ncontextMenuController.addEventListener('toggle', (visible) => {\n RESET_GLOBAL = visible;\n});\n\nexport type SwipeHandlerOptions = {\n element: SwipeHandler['element'],\n onSwipe: SwipeHandler['onSwipe'],\n verifyTouchTarget?: SwipeHandler['verifyTouchTarget'],\n onFirstSwipe?: SwipeHandler['onFirstSwipe'],\n onReset?: SwipeHandler['onReset'],\n onStart?: SwipeHandler['onStart'],\n cursor?: SwipeHandler['cursor'],\n cancelEvent?: SwipeHandler['cancelEvent'],\n listenerOptions?: SwipeHandler['listenerOptions'],\n setCursorTo?: HTMLElement,\n middleware?: Middleware,\n withDelay?: boolean\n};\n\nconst TOUCH_MOVE_OPTIONS: ListenerOptions = {passive: false};\nconst MOUSE_MOVE_OPTIONS: ListenerOptions = false as any;\n\nexport default class SwipeHandler {\n private element: HTMLElement;\n private onSwipe: (xDiff: number, yDiff: number, e: EE) => boolean | void;\n private verifyTouchTarget: (evt: EE) => boolean | Promise;\n private onFirstSwipe: (e: EE) => void;\n private onReset: () => void;\n private onStart: () => void;\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' | '';\n private cancelEvent: boolean;\n private listenerOptions: ListenerOptions;\n private setCursorTo: HTMLElement;\n\n private isMouseDown: boolean;\n private tempId: number;\n\n private hadMove: boolean;\n private eventUp: E;\n private xDown: number;\n private yDown: number;\n private xAdded: number;\n private yAdded: number;\n\n private withDelay: boolean;\n private listenerSetter: ListenerSetter;\n\n constructor(options: SwipeHandlerOptions) {\n safeAssign(this, options);\n\n this.cursor ??= 'grabbing';\n this.cancelEvent ??= true;\n // this.listenerOptions ??= false as any;\n this.listenerOptions ??= TOUCH_MOVE_OPTIONS;\n\n this.setCursorTo ??= this.element;\n this.listenerSetter = new ListenerSetter();\n this.setListeners();\n\n this.resetValues();\n this.tempId = 0;\n\n options.middleware?.onDestroy(() => {\n this.reset();\n this.removeListeners();\n });\n }\n\n public setListeners() {\n if(!IS_TOUCH_SUPPORTED) {\n // @ts-ignore\n this.listenerSetter.add(this.element)('mousedown', this.handleStart, this.listenerOptions);\n this.listenerSetter.add(attachGlobalListenerTo)('mouseup', this.reset);\n } else {\n if(this.withDelay) {\n attachContextMenuListener({\n element: this.element,\n callback: (e) => {\n cancelEvent(e);\n // @ts-ignore\n this.handleStart(e);\n },\n listenerSetter: this.listenerSetter,\n listenerOptions: this.listenerOptions\n });\n } else {\n // @ts-ignore\n this.listenerSetter.add(this.element)('touchstart', this.handleStart, this.listenerOptions);\n }\n\n this.listenerSetter.add(attachGlobalListenerTo)('touchend', this.reset);\n }\n }\n\n public removeListeners() {\n this.listenerSetter.removeAll();\n }\n\n public setCursor(cursor: SwipeHandler['cursor'] = '') {\n this.cursor = cursor;\n\n if(!IS_TOUCH_SUPPORTED && this.hadMove) {\n this.setCursorTo.style.setProperty('cursor', this.cursor, 'important');\n }\n }\n\n public add(x: number, y: number) {\n this.xAdded = x;\n this.yAdded = y;\n this.handleMove({\n clientX: this.eventUp.clientX,\n clientY: this.eventUp.clientY,\n target: this.eventUp.target\n });\n }\n\n protected resetValues() {\n ++this.tempId;\n this.hadMove = false;\n this.xAdded = this.yAdded = 0;\n this.xDown =\n this.yDown =\n this.eventUp =\n this.isMouseDown =\n undefined;\n }\n\n protected reset = (e?: Event) => {\n /* if(e) {\n cancelEvent(e);\n } */\n\n if(IS_TOUCH_SUPPORTED) {\n this.listenerSetter.removeManual(attachGlobalListenerTo, 'touchmove', this.handleMove, TOUCH_MOVE_OPTIONS);\n } else {\n this.listenerSetter.removeManual(attachGlobalListenerTo, 'mousemove', this.handleMove, MOUSE_MOVE_OPTIONS);\n this.setCursorTo.style.cursor = '';\n }\n\n if(this.hadMove) {\n this.onReset?.();\n }\n\n this.resetValues();\n };\n\n protected handleStart = async(_e: EE) => {\n if(this.isMouseDown) {\n return;\n }\n\n const e = getEvent(_e);\n if(Math.max(0, e.button ?? 0) !== 0) {\n return;\n }\n\n if(this.verifyTouchTarget && !(await this.verifyTouchTarget(_e))) {\n return this.reset();\n }\n\n const tempId = ++this.tempId;\n this.isMouseDown = true;\n\n if(this.withDelay && !IS_TOUCH_SUPPORTED) {\n const options = {...MOUSE_MOVE_OPTIONS, once: true};\n const deferred = deferredPromise();\n const cb = () => deferred.resolve();\n const listener = this.listenerSetter.add(attachGlobalListenerTo)('mousemove', cb, options) as any as Listener;\n\n await Promise.race([\n pause(300),\n deferred\n ]);\n\n deferred.resolve();\n this.listenerSetter.remove(listener);\n\n if(this.tempId !== tempId) {\n return;\n }\n }\n\n this.xDown = e.clientX;\n this.yDown = e.clientY;\n this.eventUp = e;\n\n if(IS_TOUCH_SUPPORTED) {\n // @ts-ignore\n this.listenerSetter.add(attachGlobalListenerTo)('touchmove', this.handleMove, TOUCH_MOVE_OPTIONS);\n } else {\n // @ts-ignore\n this.listenerSetter.add(attachGlobalListenerTo)('mousemove', this.handleMove, MOUSE_MOVE_OPTIONS);\n }\n\n if(this.onStart) {\n this.onStart();\n\n // have to initiate move instantly\n this.hadMove = true;\n this.handleMove(e);\n }\n };\n\n protected handleMove = (_e: EE) => {\n if(this.xDown === undefined || this.yDown === undefined || RESET_GLOBAL) {\n this.reset();\n return;\n }\n\n if(this.cancelEvent) {\n cancelEvent(_e as any);\n }\n\n const e = this.eventUp = getEvent(_e);\n const xUp = e.clientX;\n const yUp = e.clientY;\n\n const xDiff = xUp - this.xDown + this.xAdded;\n const yDiff = yUp - this.yDown + this.yAdded;\n\n if(!this.hadMove) {\n if(!xDiff && !yDiff) {\n return;\n }\n\n this.hadMove = true;\n\n if(!IS_TOUCH_SUPPORTED) {\n this.setCursorTo.style.setProperty('cursor', this.cursor, 'important');\n }\n\n this.onFirstSwipe?.(_e);\n }\n\n const onSwipeResult = this.onSwipe(xDiff, yDiff, _e);\n if(onSwipeResult !== undefined && onSwipeResult) {\n this.reset();\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 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 const 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","/*\n * 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 OverlayClickHandler from '../helpers/overlayClickHandler';\nimport {FormatterArguments, i18n, LangPackKey} from '../lib/langPack';\n\nconst toastEl = document.createElement('div');\ntoastEl.classList.add('toast');\nlet timeout: number;\n\nconst x = new OverlayClickHandler('toast');\nx.addEventListener('toggle', (open) => {\n if(!open) {\n hideToast();\n }\n});\n\nexport function hideToast() {\n x.close();\n\n toastEl.classList.remove('is-visible');\n timeout && clearTimeout(+timeout);\n\n timeout = window.setTimeout(() => {\n toastEl.remove();\n timeout = undefined;\n }, 200);\n}\n\nexport function toast(content: string | Node, onClose?: () => void) {\n x.close();\n\n replaceContent(toastEl, content);\n\n if(!toastEl.parentElement) {\n document.body.append(toastEl);\n void toastEl.offsetLeft; // reflow\n }\n\n toastEl.classList.add('is-visible');\n\n timeout && clearTimeout(+timeout);\n x.open(toastEl);\n\n timeout = window.setTimeout(hideToast, 3000);\n\n if(onClose) {\n x.addEventListener('toggle', onClose, {once: true});\n }\n}\n\nexport function toastNew(options: Partial<{\n langPackKey: LangPackKey,\n langPackArguments: FormatterArguments,\n onClose: () => void\n}>) {\n toast(i18n(options.langPackKey, options.langPackArguments), options.onClose);\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';\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport {dispatchHeavyAnimationEvent} from '../hooks/useHeavyAnimationCheck';\nimport whichChild from '../helpers/dom/whichChild';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport ListenerSetter from '../helpers/listenerSetter';\n\nfunction makeTransitionFunction(options: TransitionFunction) {\n return options;\n}\n\nconst slideNavigation = makeTransitionFunction({\n callback: (tabContent, prevTabContent, toRight) => {\n const width = prevTabContent.getBoundingClientRect().width;\n const elements = [tabContent, prevTabContent];\n if(toRight) elements.reverse();\n elements[0].style.filter = `brightness(80%)`;\n elements[0].style.transform = `translate3d(${-width * .25}px, 0, 0)`;\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\n\n tabContent.classList.add('active');\n void tabContent.offsetWidth; // reflow\n\n tabContent.style.transform = '';\n tabContent.style.filter = '';\n\n return () => {\n prevTabContent.style.transform = prevTabContent.style.filter = '';\n };\n },\n animateFirst: false\n});\n\nconst slideTabs = makeTransitionFunction({\n callback: (tabContent, prevTabContent, toRight) => {\n // Jolly Cobra's // Workaround for scrollable content flickering during animation.\n // const scrollableContainer = findUpClassName(tabContent, 'scrollable-y');\n // if(scrollableContainer && scrollableContainer.style.overflowY !== 'hidden') {\n // // const scrollBarWidth = scrollableContainer.offsetWidth - scrollableContainer.clientWidth;\n // scrollableContainer.style.overflowY = 'hidden';\n // // scrollableContainer.style.paddingRight = `${scrollBarWidth}px`;\n // // this.container.classList.add('sliding');\n // }\n\n // window.requestAnimationFrame(() => {\n const width = prevTabContent.getBoundingClientRect().width;\n /* tabContent.style.setProperty('--width', width + 'px');\n prevTabContent.style.setProperty('--width', width + 'px');\n\n tabContent.classList.add('active'); */\n // void tabContent.offsetWidth; // reflow\n const elements = [tabContent, prevTabContent];\n if(toRight) elements.reverse();\n elements[0].style.transform = `translate3d(${-width}px, 0, 0)`;\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\n\n tabContent.classList.add('active');\n void tabContent.offsetWidth; // reflow\n\n tabContent.style.transform = '';\n // });\n\n return () => {\n prevTabContent.style.transform = '';\n\n // if(scrollableContainer) {\n // // Jolly Cobra's // Workaround for scrollable content flickering during animation.\n // if(isSafari) { // ! safari doesn't respect sticky header, so it flicks when overflow is changing\n // scrollableContainer.style.display = 'none';\n // }\n\n // scrollableContainer.style.overflowY = '';\n\n // if(isSafari) {\n // void scrollableContainer.offsetLeft; // reflow\n // scrollableContainer.style.display = '';\n // }\n\n // // scrollableContainer.style.paddingRight = '0';\n // // this.container.classList.remove('sliding');\n // }\n };\n },\n animateFirst: false\n});\n\nconst slideTopics = makeTransitionFunction({\n callback: (tabContent, prevTabContent) => {\n const rect = tabContent.getBoundingClientRect();\n const offsetX = rect.width - 80;\n\n tabContent.style.transform = `transformX(${offsetX}px)`;\n\n tabContent.classList.add('active');\n void tabContent.offsetWidth; // reflow\n\n tabContent.style.transform = '';\n\n return () => {};\n },\n animateFirst: true\n});\n\nconst transitions: {[type in TransitionSliderType]?: TransitionFunction} = {\n navigation: slideNavigation,\n tabs: slideTabs\n // topics: slideTopics\n};\n\ntype TransitionSliderType = 'tabs' | 'navigation' | 'zoom-fade' | 'slide-fade' | 'topics' | 'none'/* | 'counter' */;\n\ntype TransitionSliderOptions = {\n content: HTMLElement,\n type: TransitionSliderType,\n transitionTime: number,\n onTransitionEnd?: (id: number) => void,\n isHeavy?: boolean,\n once?: boolean,\n withAnimationListener?: boolean,\n listenerSetter?: ListenerSetter,\n animateFirst?: boolean\n};\n\ntype TransitionFunction = {\n callback: (tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) => () => void,\n animateFirst: boolean\n};\n\nconst TransitionSlider = (options: TransitionSliderOptions) => {\n let {\n content,\n type,\n transitionTime,\n onTransitionEnd,\n isHeavy = true,\n once = false,\n withAnimationListener = true,\n listenerSetter,\n animateFirst = false\n } = options;\n\n const {callback: animationFunction, animateFirst: _animateFirst} = transitions[type] || {};\n content.dataset.animation = type;\n\n if(_animateFirst !== undefined) {\n animateFirst = _animateFirst;\n }\n\n const onTransitionEndCallbacks: Map = new Map();\n let animationDeferred: CancellablePromise;\n // let animationStarted = 0;\n let from: HTMLElement = null;\n\n if(withAnimationListener) {\n const listenerName = animationFunction ? 'transitionend' : 'animationend';\n\n const onEndEvent = (e: TransitionEvent | AnimationEvent) => {\n cancelEvent(e);\n\n if((e.target as HTMLElement).parentElement !== content) {\n return;\n }\n\n // console.log('Transition: transitionend', /* content, */ e, selectTab.prevId, performance.now() - animationStarted);\n\n const callback = onTransitionEndCallbacks.get(e.target as HTMLElement);\n callback?.();\n\n if(e.target !== from) {\n return;\n }\n\n if(!animationDeferred && isHeavy) return;\n\n if(animationDeferred) {\n animationDeferred.resolve();\n animationDeferred = undefined;\n }\n\n onTransitionEnd?.(selectTab.prevId());\n\n content.classList.remove('animating', 'backwards', 'disable-hover');\n\n if(once) {\n if(listenerSetter) listenerSetter.removeManual(content, listenerName, onEndEvent);\n else content.removeEventListener(listenerName, onEndEvent/* , {capture: false} */);\n from = animationDeferred = undefined;\n onTransitionEndCallbacks.clear();\n }\n };\n\n // TODO: check for transition type (transform, etc) using by animationFunction\n if(listenerSetter) listenerSetter.add(content)(listenerName, onEndEvent);\n else content.addEventListener(listenerName, onEndEvent/* , {passive: true, capture: false} */);\n }\n\n function selectTab(id: number | HTMLElement, animate = true, overrideFrom?: typeof from) {\n if(overrideFrom) {\n from = overrideFrom;\n }\n\n if(id instanceof HTMLElement) {\n id = whichChild(id);\n }\n\n const prevId = selectTab.prevId();\n if(id === prevId) return false;\n\n // console.log('selectTab id:', id);\n\n const to = content.children[id] as HTMLElement;\n\n if(!rootScope.settings.animationsEnabled || (prevId === -1 && !animateFirst)) {\n animate = false;\n }\n\n if(!withAnimationListener) {\n const timeout = content.dataset.timeout;\n if(timeout !== undefined) {\n clearTimeout(+timeout);\n }\n\n delete content.dataset.timeout;\n }\n\n if(!animate) {\n if(from) from.classList.remove('active', 'to', 'from');\n else if(to) { // fix instant opening back from closed slider (e.g. instant closening and opening right sidebar)\n const callback = onTransitionEndCallbacks.get(to);\n callback?.();\n }\n\n if(to) {\n to.classList.remove('to', 'from');\n to.classList.add('active');\n }\n\n content.classList.remove('animating', 'backwards', 'disable-hover');\n\n from = to;\n\n onTransitionEnd?.(id);\n return;\n }\n\n if(!withAnimationListener) {\n content.dataset.timeout = '' + window.setTimeout(() => {\n to.classList.remove('to');\n from && from.classList.remove('from');\n content.classList.remove('animating', 'backwards', 'disable-hover');\n delete content.dataset.timeout;\n }, transitionTime);\n }\n\n if(from) {\n from.classList.remove('to');\n from.classList.add('from');\n }\n\n content.classList.add('animating'/* , 'disable-hover' */);\n const toRight = prevId < id;\n content.classList.toggle('backwards', !toRight);\n\n let onTransitionEndCallback: ReturnType;\n if(!to) {\n // prevTabContent.classList.remove('active');\n } else {\n if(animationFunction) {\n onTransitionEndCallback = animationFunction(to, from, toRight);\n } else {\n to.classList.add('active');\n }\n\n to.classList.remove('from');\n to.classList.add('to');\n }\n\n if(to) {\n const transitionTimeout = to.dataset.transitionTimeout;\n if(transitionTimeout) {\n clearTimeout(+transitionTimeout);\n }\n\n onTransitionEndCallbacks.set(to, () => {\n to.classList.remove('to');\n onTransitionEndCallbacks.delete(to);\n });\n }\n\n if(from/* && false */) {\n let timeout: number;\n const _from = from;\n const callback = () => {\n clearTimeout(timeout);\n _from.classList.remove('active', 'from');\n\n onTransitionEndCallback?.();\n\n onTransitionEndCallbacks.delete(_from);\n };\n\n if(to) {\n timeout = window.setTimeout(callback, transitionTime + 100); // something happened to container\n onTransitionEndCallbacks.set(_from, callback);\n } else {\n timeout = window.setTimeout(callback, transitionTime);\n onTransitionEndCallbacks.set(_from, () => {\n clearTimeout(timeout);\n onTransitionEndCallbacks.delete(_from);\n });\n }\n\n _from.dataset.transitionTimeout = '' + timeout;\n\n if(isHeavy) {\n if(!animationDeferred) {\n animationDeferred = deferredPromise();\n // animationStarted = performance.now();\n }\n\n dispatchHeavyAnimationEvent(animationDeferred, transitionTime * 2);\n }\n }\n\n from = to;\n }\n\n // selectTab.prevId = -1;\n selectTab.prevId = () => from ? whichChild(from) : -1;\n selectTab.getFrom = () => from;\n selectTab.setFrom = (_from: HTMLElement) => from = _from;\n\n return selectTab;\n};\n\nexport default TransitionSlider;\n","export default function isUsernameValid(username: string) {\n return ((username.length >= 3 && username.length <= 32) || !username.length) && /^[a-zA-Z0-9_]*$/.test(username);\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 ListenerSetter from '../helpers/listenerSetter';\nimport debounce from '../helpers/schedulers/debounce';\nimport {LangPackKey} from '../lib/langPack';\nimport InputField, {InputFieldOptions, InputState} from './inputField';\nimport isUsernameValid from '../lib/richTextProcessor/isUsernameValid';\nimport {AppManagers} from '../lib/appManagers/managers';\n\nexport class UsernameInputField extends InputField {\n private checkUsernamePromise: Promise;\n private checkUsernameDebounced: (username: string) => void;\n public options: InputFieldOptions & {\n peerId?: PeerId,\n listenerSetter: ListenerSetter,\n onChange?: () => void,\n invalidText: LangPackKey,\n takenText: LangPackKey,\n availableText: LangPackKey,\n head?: string\n };\n public error: ApiError;\n\n constructor(\n options: UsernameInputField['options'],\n private managers: AppManagers\n ) {\n super(options);\n\n this.checkUsernameDebounced = debounce(this.checkUsername.bind(this), 150, false, true);\n\n options.listenerSetter.add(this.input)('input', () => {\n const value = this.getValue();\n\n this.error = undefined;\n if(value === this.originalValue || !value.length) {\n this.setState(InputState.Neutral);\n this.options.onChange?.();\n return;\n } else if(!isUsernameValid(value)) { // does not check the last underscore\n this.setError(this.options.invalidText);\n } else {\n this.setState(InputState.Neutral);\n }\n\n if(this.input.classList.contains('error')) {\n this.options.onChange?.();\n return;\n }\n\n this.checkUsernameDebounced(value);\n });\n }\n\n public getValue() {\n let value = this.value;\n if(this.options.head) {\n value = value.slice(this.options.head.length);\n this.setValueSilently(this.options.head + value);\n }\n\n return value;\n }\n\n private checkUsername(username: string) {\n if(this.checkUsernamePromise) return;\n\n this.error = undefined;\n let checkPromise: Promise\n if(this.options.peerId) {\n checkPromise = this.managers.appChatsManager.checkUsername(this.options.peerId.toChatId(), username);\n } else {\n checkPromise = this.managers.appUsersManager.checkUsername(username);\n }\n\n const promise = this.checkUsernamePromise = checkPromise.then((available) => {\n if(this.getValue() !== username) return;\n\n if(available) {\n this.setState(InputState.Valid, this.options.availableText);\n } else {\n this.setError(this.options.takenText);\n }\n }, (err) => {\n if(this.getValue() !== username) return;\n\n this.error = err;\n switch((err as ApiError).type) {\n case 'USERNAME_PURCHASE_AVAILABLE': {\n this.setError(this.options.takenText);\n break;\n }\n\n case 'USERNAME_INVALID':\n default: {\n this.setError(this.options.invalidText);\n break;\n }\n }\n }).then(() => {\n if(this.checkUsernamePromise === promise) {\n this.checkUsernamePromise = undefined;\n }\n\n this.options.onChange?.();\n\n const value = this.getValue();\n if(value !== username && this.isValidToChange() && isUsernameValid(value)) {\n this.checkUsername(value);\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 {attachClickEvent} from '../helpers/dom/clickEvent';\nimport findUpAsChild from '../helpers/dom/findUpAsChild';\nimport placeCaretAtEnd from '../helpers/dom/placeCaretAtEnd';\nimport positionElementByIndex from '../helpers/dom/positionElementByIndex';\nimport Sortable from '../helpers/dom/sortable';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {Middleware} from '../helpers/middleware';\nimport noop from '../helpers/noop';\nimport SortedList, {SortedElementBase} from '../helpers/sortedList';\nimport {Chat, User, Username} from '../layer';\nimport {i18n, LangPackKey} from '../lib/langPack';\nimport rootScope from '../lib/rootScope';\nimport confirmationPopup from './confirmationPopup';\nimport Row from './row';\nimport SettingSection from './settingSection';\nimport {UsernameInputField} from './usernameInputField';\n\nexport default class UsernamesSection extends SettingSection {\n // public section: SettingSection;\n\n constructor(options: {\n peerId: PeerId,\n peer: Chat.channel | User.user,\n listenerSetter: ListenerSetter,\n usernameInputField: UsernameInputField,\n middleware: Middleware\n }) {\n /* const section = this.section = new SettingSection */super({\n name: 'UsernamesProfileHeader',\n caption: !options.peerId.isUser() ? 'UsernamesChannelHelp' : 'UsernamesProfileHelp'\n });\n\n const {peerId, peer, usernameInputField, listenerSetter, middleware} = options;\n const managers = rootScope.managers;\n const channelId = peerId.isUser() ? undefined : peerId.toChatId();\n\n const section = this;\n\n const CLASS_NAME = 'usernames';\n const list = document.createElement('div');\n list.classList.add(CLASS_NAME);\n\n let _usernames: Username[];\n\n interface SortedUsername extends SortedElementBase {\n row: Row\n }\n\n const sortedList = new SortedList({\n getIndex: (element) => _usernames.length - _usernames.findIndex((username) => username.username === element.id),\n onDelete: (element) => {\n element.row.container.remove();\n },\n onSort: (element, idx) => {\n positionElementByIndex(element.row.container, list, idx);\n },\n onElementCreate: (base) => {\n const username = _usernames.find((username) => username.username === base.id);\n const row = new Row({\n title: '@' + username.username,\n subtitle: true,\n clickable: true\n });\n\n const editable = !!username.pFlags.editable;\n const active = !!username.pFlags.active;\n\n if(editable) row.container.dataset.editable = '1';\n row.container.dataset.username = username.username;\n row.container.classList.add(CLASS_NAME + '-username');\n row.subtitle.classList.add(CLASS_NAME + '-username-status');\n const media = row.createMedia('medium');\n media.classList.add(CLASS_NAME + '-username-icon', 'tgico');\n\n row.makeSortable();\n\n changeActive(row, active);\n\n (base as SortedUsername).row = row;\n\n return base as SortedUsername;\n }\n });\n\n const changeActive = (row: Row, active: boolean) => {\n row.subtitle.replaceChildren(i18n(row.container.dataset.editable ? 'UsernameLinkEditable' : (active ? 'UsernameLinkActive' : 'UsernameLinkInactive')));\n row.container.classList.toggle('active', active);\n row.toggleSorting(active);\n };\n\n const applyUsernames = (usernames: Username[] = []) => {\n _usernames = usernames;\n\n sortedList.getAll().forEach((element) => {\n if(!usernames.some((username) => username.username === element.id)) {\n sortedList.delete(element.id);\n }\n });\n\n usernames.forEach((username) => {\n if(!sortedList.has(username.username)) {\n sortedList.add(username.username);\n } else {\n const element = sortedList.get(username.username);\n sortedList.update(username.username, element);\n changeActive(element.row, !!username.pFlags.active);\n }\n });\n\n section.container.classList.toggle('hide', !sortedList.getAll().size);\n };\n\n applyUsernames(peer.usernames);\n\n listenerSetter.add(rootScope)('peer_title_edit', async({peerId: _peerId}) => {\n if(_peerId !== peerId) {\n return;\n }\n\n const peer = await managers.appPeersManager.getPeer(peerId);\n applyUsernames((peer as User.user).usernames);\n });\n\n let cancelClick = false;\n attachClickEvent(list, async(e) => {\n if(cancelClick) {\n cancelClick = false;\n return;\n }\n\n const container = findUpAsChild(e.target as HTMLElement, list);\n if(!container) {\n return;\n }\n\n if(container.dataset.editable) {\n placeCaretAtEnd(usernameInputField.input, true, true);\n return;\n }\n\n const username = container.dataset.username;\n\n const active = container.classList.contains('active');\n let titleLangKey: LangPackKey, descriptionLangKey: LangPackKey;\n if(active) {\n titleLangKey = 'UsernameDeactivateLink';\n descriptionLangKey = channelId ? 'UsernameDeactivateLinkChannelMessage' : 'UsernameDeactivateLinkProfileMessage';\n } else {\n titleLangKey = 'UsernameActivateLink';\n descriptionLangKey = channelId ? 'UsernameActivateLinkChannelMessage' : 'UsernameActivateLinkProfileMessage';\n }\n\n try {\n await confirmationPopup({\n titleLangKey,\n descriptionLangKey,\n button: {\n langKey: active ? 'Hide' : 'Show'\n }\n });\n } catch(err) {\n return;\n }\n\n const newActive = !active;\n let promise: Promise;\n if(channelId) {\n promise = managers.appChatsManager.toggleUsername(channelId, username, newActive);\n } else {\n promise = managers.appUsersManager.toggleUsername(username, newActive);\n }\n\n promise.catch((err: ApiError) => {\n if(err.type === 'USERNAMES_ACTIVE_TOO_MUCH') {\n confirmationPopup({\n titleLangKey: 'UsernameActivateErrorTitle',\n descriptionLangKey: 'UsernameActivateErrorMessage',\n button: {langKey: 'OK', isCancel: true}\n }).catch(noop);\n } else {\n console.error('turn username error', err);\n }\n });\n });\n\n new Sortable({\n list,\n middleware,\n onSort: (idx, newIdx) => {\n const username = _usernames.splice(idx, 1)[0];\n _usernames.splice(newIdx, 0, username);\n sortedList.updateList();\n // can't just update particular element, have to change indexes\n // sortedList.update(username.username);\n\n const usernames = _usernames.filter((username) => username.pFlags.active).map((username) => username.username);\n if(channelId) {\n managers.appChatsManager.reorderUsernames(channelId, usernames);\n } else {\n managers.appUsersManager.reorderUsernames(usernames);\n }\n }\n });\n\n section.content.append(list);\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\ntype TargetType = HTMLElement;\nexport type OnVisibilityChangeItem = {target: TargetType, visible: boolean, entry: IntersectionObserverEntry, index: number};\nexport type OnVisibilityChange = (item: OnVisibilityChangeItem) => void;\n\nexport default class VisibilityIntersector {\n private observer: IntersectionObserver;\n private items: Map = new Map();\n private locked = false;\n\n constructor(onVisibilityChange: OnVisibilityChange, options?: IntersectionObserverInit) {\n this.observer = new IntersectionObserver((entries) => {\n if(this.locked) {\n return;\n }\n\n const changed: OnVisibilityChangeItem[] = [];\n\n entries.forEach((entry, index) => {\n const target = entry.target as TargetType;\n\n if(this.items.get(target) === entry.isIntersecting) {\n return;\n } else {\n this.items.set(target, entry.isIntersecting);\n }\n\n /* if(entry.isIntersecting) {\n console.log('ooo', entry);\n } */\n\n /* if(this.locked) {\n return;\n } */\n\n const change: typeof changed[0] = {target, visible: entry.isIntersecting, entry, index};\n\n // ! order will be incorrect so can't use it\n // changed[entry.isIntersecting ? 'unshift' : 'push'](change);\n changed.push(change);\n\n // onVisibilityChange(target, entry.isIntersecting);\n });\n\n changed.forEach((item) => {\n onVisibilityChange(item);\n });\n }, options);\n }\n\n public getVisible() {\n const items: TargetType[] = [];\n this.items.forEach((value, key) => {\n if(value) {\n items.push(key);\n }\n });\n\n return items;\n }\n\n public clearVisible() {\n const visible = this.getVisible();\n for(const target of visible) {\n this.items.set(target, false);\n }\n }\n\n public isVisible(target: TargetType) {\n return this.items.get(target);\n }\n\n public disconnect() {\n this.observer.disconnect();\n this.items.clear();\n }\n\n public refresh() {\n this.observer.disconnect();\n\n // window.requestAnimationFrame(() => {\n const targets = [...this.items.keys()];\n for(const target of targets) {\n // this.items.set(target, false);\n this.observer.observe(target);\n }\n // });\n }\n\n public refreshVisible() {\n const visible = this.getVisible();\n for(const target of visible) {\n this.observer.unobserve(target);\n }\n\n for(const target of visible) {\n this.observer.observe(target);\n }\n }\n\n public observe(target: TargetType) {\n this.items.set(target, false);\n this.observer.observe(target);\n }\n\n public unobserve(target: TargetType) {\n this.observer.unobserve(target);\n this.items.delete(target);\n }\n\n public unlock() {\n this.locked = false;\n }\n\n public unlockAndRefresh() {\n this.unlock();\n this.refresh();\n }\n\n public lock() {\n this.locked = 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 cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport rootScope from '../lib/rootScope';\nimport appMediaPlaybackController from './appMediaPlaybackController';\nimport RangeSelector from './rangeSelector';\n\nexport default class VolumeSelector extends RangeSelector {\n private static ICONS = ['volume_off', 'volume_mute', 'volume_down', 'volume_up'];\n public btn: HTMLElement;\n protected icon: HTMLSpanElement;\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 const className = 'player-volume';\n const btn = this.btn = document.createElement('div');\n btn.classList.add('btn-icon', className);\n const icon = this.icon = document.createElement('span');\n icon.classList.add(className + '__icon');\n\n btn.append(icon, this.container);\n\n attachClickEvent(icon, this.onMuteClick, {listenerSetter: this.listenerSetter});\n this.listenerSetter.add(appMediaPlaybackController)('playbackParams', 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 public setVolume = () => {\n // const volume = video.volume;\n const {volume, muted} = appMediaPlaybackController;\n let d: string;\n let iconIndex: number;\n if(!volume || muted) {\n iconIndex = 0;\n } else if(volume > .5) {\n iconIndex = 3;\n } else if(volume > 0 && volume < .25) {\n iconIndex = 1;\n } else {\n iconIndex = 2;\n }\n\n VolumeSelector.ICONS.forEach((icon) => this.icon.classList.remove('tgico-' + icon));\n this.icon.classList.add('tgico-' + VolumeSelector.ICONS[iconIndex]);\n\n if(!this.mousedown) {\n this.setProgress(muted ? 0 : volume);\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 {MessageEntity} from '../../layer';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\n\nexport default function wrapCustomEmoji({\n docIds,\n loadPromises,\n middleware,\n lazyLoadQueue,\n customEmojiSize,\n animationGroup\n}: {\n docIds: DocId[],\n loadPromises?: Promise[]\n} & WrapSomethingOptions) {\n const text = ' '.repeat(docIds.length);\n const entities: MessageEntity[] = [];\n docIds.forEach((docId, idx) => {\n entities.push({\n _: 'messageEntityCustomEmoji',\n offset: idx,\n length: 1,\n document_id: docId\n });\n });\n\n const wrapped = wrapRichText(text, {\n entities,\n loadPromises,\n animationGroup,\n customEmojiSize,\n middleware,\n lazyLoadQueue\n });\n\n return wrapped;\n}\n\nexport function wrapCustomEmojiAwaited(options: Parameters[0]) {\n const loadPromises: Promise[] = options.loadPromises ??= [];\n const wrapped = wrapCustomEmoji(options);\n return Promise.all(loadPromises).then(() => wrapped);\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 MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\nimport {CancellablePromise} from '../../helpers/cancellablePromise';\nimport {clearBadCharsAndTrim} from '../../helpers/cleanSearchText';\nimport {formatFullSentTime} from '../../helpers/date';\nimport {simulateClickEvent, attachClickEvent} from '../../helpers/dom/clickEvent';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport formatBytes from '../../helpers/formatBytes';\nimport {MediaSizeType} from '../../helpers/mediaSizes';\nimport noop from '../../helpers/noop';\nimport {Message, MessageMedia, WebPage} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport appDownloadManager, {Progress} from '../../lib/appManagers/appDownloadManager';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getDownloadMediaDetails from '../../lib/appManagers/utils/download/getDownloadMediaDetails';\nimport choosePhotoSize from '../../lib/appManagers/utils/photos/choosePhotoSize';\nimport {joinElementsWith} from '../../lib/langPack';\nimport {MAX_FILE_SAVE_SIZE} from '../../lib/mtproto/mtproto_config';\nimport wrapPlainText from '../../lib/richTextProcessor/wrapPlainText';\nimport rootScope from '../../lib/rootScope';\nimport type {ThumbCache} from '../../lib/storages/thumbs';\nimport {MediaSearchContext} from '../appMediaPlaybackController';\nimport AudioElement from '../audio';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport {MiddleEllipsisElement} from '../middleEllipsis';\nimport ProgressivePreloader from '../preloader';\nimport wrapPhoto from './photo';\nimport wrapSenderToPeer from './senderToPeer';\nimport wrapSentTime from './sentTime';\n\nrootScope.addEventListener('document_downloading', (docId) => {\n const elements = Array.from(document.querySelectorAll(`.document[data-doc-id=\"${docId}\"]`)) as HTMLElement[];\n elements.forEach((element) => {\n if(element.querySelector('.preloader-container.manual')) {\n simulateClickEvent(element);\n }\n });\n});\n\nexport default async function wrapDocument({message, withTime, fontWeight, voiceAsMusic, showSender, searchContext, loadPromises, autoDownloadSize, lazyLoadQueue, sizeType, managers = rootScope.managers, cacheContext, fontSize, getSize}: {\n message: Message.message,\n withTime?: boolean,\n fontWeight?: number,\n voiceAsMusic?: boolean,\n showSender?: boolean,\n searchContext?: MediaSearchContext,\n loadPromises?: Promise[],\n autoDownloadSize?: number,\n lazyLoadQueue?: LazyLoadQueue,\n sizeType?: MediaSizeType,\n managers?: AppManagers,\n cacheContext?: ThumbCache,\n fontSize?: number,\n getSize?: () => number\n}): Promise {\n fontWeight ??= 500;\n sizeType ??= '' as any;\n fontSize ??= 16;\n const noAutoDownload = autoDownloadSize === 0;\n\n const doc = ((message.media as MessageMedia.messageMediaDocument).document || ((message.media as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage).document) as MyDocument;\n const uploadFileName = message?.uploadingFileName;\n if(doc.type === 'audio' || doc.type === 'voice' || doc.type === 'round') {\n const audioElement = new AudioElement();\n audioElement.withTime = withTime;\n audioElement.message = message;\n audioElement.noAutoDownload = noAutoDownload;\n audioElement.lazyLoadQueue = lazyLoadQueue;\n audioElement.loadPromises = loadPromises;\n (audioElement as any).getSize = getSize;\n\n if(voiceAsMusic) audioElement.voiceAsMusic = voiceAsMusic;\n if(searchContext) audioElement.searchContext = searchContext;\n if(showSender) audioElement.showSender = showSender;\n\n audioElement.dataset.fontWeight = '' + fontWeight;\n audioElement.dataset.fontSize = '' + fontSize;\n audioElement.dataset.sizeType = sizeType;\n await audioElement.render();\n return audioElement;\n }\n\n const extSplitted = doc.file_name ? doc.file_name.split('.') : '';\n let ext = '';\n ext = extSplitted.length > 1 && Array.isArray(extSplitted) ?\n clearBadCharsAndTrim(extSplitted.pop().split(' ', 1)[0].toLowerCase()) :\n 'file';\n\n const docDiv = document.createElement('div');\n docDiv.classList.add('document', `ext-${ext}`);\n docDiv.dataset.docId = '' + doc.id;\n (docDiv as any).doc = doc;\n\n // return docDiv;\n\n const icoDiv = document.createElement('div');\n icoDiv.classList.add('document-ico');\n let icoTextEl: HTMLElement;\n\n const hadContext = !!cacheContext;\n const getCacheContext = () => {\n return hadContext ? cacheContext : managers.thumbsStorage.getCacheContext(doc);\n };\n\n cacheContext = await getCacheContext();\n let hasThumb = false;\n if((doc.thumbs?.length || (message.pFlags.is_outgoing && cacheContext.url && doc.type === 'photo'))/* && doc.mime_type !== 'image/gif' */) {\n docDiv.classList.add('document-with-thumb');\n hasThumb = true;\n\n const imgs: (HTMLImageElement | HTMLCanvasElement | HTMLVideoElement)[] = [];\n // ! WARNING, use thumbs for check when thumb will be generated for media\n if(message.pFlags.is_outgoing && ['photo', 'video'].includes(doc.type) && cacheContext.url) {\n icoDiv.innerHTML = ``;\n imgs.push(icoDiv.firstElementChild as HTMLImageElement);\n } else {\n const perf = performance.now();\n const wrapped = await wrapPhoto({\n photo: doc,\n message: null,\n container: icoDiv,\n boxWidth: 54,\n boxHeight: 54,\n loadPromises,\n withoutPreloader: true,\n lazyLoadQueue,\n size: choosePhotoSize(doc, 54, 54, true),\n managers\n });\n // console.log('was wrapping photo', performance.now() - perf);\n icoDiv.style.width = icoDiv.style.height = '';\n if(wrapped.images.thumb) imgs.push(wrapped.images.thumb);\n if(wrapped.images.full) imgs.push(wrapped.images.full);\n }\n\n imgs.forEach((img) => img.classList.add('document-thumb'));\n } else {\n icoTextEl = document.createElement('span');\n icoTextEl.classList.add('document-ico-text');\n icoTextEl.innerText = ext;\n icoDiv.append(icoTextEl);\n }\n\n // let fileName = stringMiddleOverflow(doc.file_name || 'Unknown.file', 26);\n const fileName = doc.file_name ? wrapPlainText(doc.file_name) : 'Unknown.file';\n const descriptionEl = document.createElement('div');\n descriptionEl.classList.add('document-description');\n const bytesContainer = document.createElement('span');\n const bytesEl = formatBytes(doc.size);\n const bytesJoiner = ' / ';\n\n const descriptionParts: (HTMLElement | string | DocumentFragment)[] = [bytesEl];\n\n if(withTime) {\n descriptionParts.push(formatFullSentTime(message.date));\n }\n\n if(showSender) {\n descriptionParts.push(await wrapSenderToPeer(message));\n }\n\n if(!withTime && !showSender) {\n const b = document.createElement('span');\n const bytesMaxEl = formatBytes(doc.size);\n b.append(bytesJoiner, bytesMaxEl);\n b.style.visibility = 'hidden';\n descriptionParts.push(b);\n }\n\n docDiv.innerHTML = `\n ${(cacheContext.downloaded && !uploadFileName) || !message.mid || !hasThumb ? '' : `
`}\n
\n
\n `;\n\n const nameDiv = docDiv.querySelector('.document-name') as HTMLElement;\n const middleEllipsisEl = new MiddleEllipsisElement();\n middleEllipsisEl.dataset.fontWeight = '' + fontWeight;\n middleEllipsisEl.dataset.fontSize = '' + fontSize;\n middleEllipsisEl.dataset.sizeType = sizeType;\n (middleEllipsisEl as any).getSize = getSize;\n middleEllipsisEl.textContent = fileName;\n // setInnerHTML(middleEllipsisEl, fileName);\n\n // * new media popup\n if(!message.mid) {\n docDiv.classList.add('downloaded');\n }\n\n nameDiv.append(middleEllipsisEl);\n\n if(showSender) {\n nameDiv.append(wrapSentTime(message));\n }\n\n const sizeDiv = docDiv.querySelector('.document-size') as HTMLElement;\n bytesContainer.append(...joinElementsWith(descriptionParts, ' ยท '));\n sizeDiv.append(bytesContainer);\n\n docDiv.prepend(icoDiv);\n\n if(!uploadFileName && message.pFlags.is_outgoing && !message.mid) {\n return docDiv;\n }\n\n let downloadDiv: HTMLElement, preloader: ProgressivePreloader = null;\n const onLoad = () => {\n docDiv.classList.remove('downloading');\n\n if(/* !hasThumb || */(doc.size > MAX_FILE_SAVE_SIZE && !uploadFileName)) {\n preloader.setManual();\n preloader.attach(downloadDiv);\n preloader.preloader.classList.add('manual');\n preloader.setDownloadFunction(load);\n return;\n }\n\n if(doc.size <= MAX_FILE_SAVE_SIZE) {\n docDiv.classList.add('downloaded');\n }\n\n if(downloadDiv) {\n if(downloadDiv !== icoDiv) {\n const _downloadDiv = downloadDiv;\n setTimeout(() => {\n _downloadDiv.remove();\n }, 200);\n }\n\n downloadDiv = null;\n }\n\n if(preloader) {\n preloader = null;\n }\n };\n\n const addByteProgress = (promise: CancellablePromise) => {\n docDiv.classList.add('downloading');\n\n const sizeContainer = document.createElement('span');\n const _bytesContainer = formatBytes(doc.size);\n sizeContainer.style.position = 'absolute';\n sizeContainer.style.left = '0';\n promise.then(onLoad, noop).finally(() => {\n // sizeContainer.replaceWith(bytesContainer);\n bytesContainer.style.visibility = '';\n sizeContainer.remove();\n // b && b.classList.remove('hide');\n });\n\n // b && b.classList.add('hide');\n\n const format = (bytes: number) => formatBytes(bytes);\n let d = format(0);\n bytesContainer.style.visibility = 'hidden';\n // bytesContainer.replaceWith(sizeContainer);\n sizeContainer.append(d, bytesJoiner, _bytesContainer);\n bytesContainer.parentElement.append(sizeContainer);\n promise.addNotifyListener((progress: Progress) => {\n const _d = format(progress.done);\n d.replaceWith(_d);\n d = _d;\n });\n };\n\n // ! DO NOT USE ASYNC/AWAIT HERE ! SAFARI WON'T LET DOWNLOAD THE FILE BECAUSE OF ASYNC\n const load = (e?: Event) => {\n const save = !e || e.isTrusted;\n const doc = (docDiv as any).doc;\n // const doc = await managers.appDocsManager.getDoc(docDiv.dataset.docId);\n let download: CancellablePromise;\n const queueId = appImManager.chat.bubbles ? appImManager.chat.bubbles.lazyLoadQueue.queueId : undefined;\n if(!save) {\n download = appDownloadManager.downloadToDisc({media: doc, queueId}, true);\n } else if(doc.type === 'pdf') {\n const canOpenAfter = /* managers.appDocsManager.downloading.has(doc.id) || */!preloader || preloader.detached;\n download = appDownloadManager.downloadMediaURL({media: doc, queueId});\n if(canOpenAfter) {\n download.then(() => {\n setTimeout(async() => { // wait for preloader animation end\n const url = (await getCacheContext()).url;\n window.open(url);\n }, rootScope.settings.animationsEnabled ? 250 : 0);\n });\n }\n } else if(MEDIA_MIME_TYPES_SUPPORTED.has(doc.mime_type) && doc.thumbs?.length) {\n download = appDownloadManager.downloadMediaURL({media: doc, queueId});\n } else {\n download = appDownloadManager.downloadToDisc({media: doc, queueId});\n }\n\n download.catch(() => {\n docDiv.classList.remove('downloading');\n });\n\n if(downloadDiv) {\n preloader.attach(downloadDiv, true, download);\n addByteProgress(download);\n }\n };\n\n const {fileName: downloadFileName} = getDownloadMediaDetails({media: doc, downloadId: '1'});\n if(await managers.apiFileManager.isDownloading(downloadFileName)) {\n downloadDiv = docDiv.querySelector('.document-download') || icoDiv;\n const promise = appDownloadManager.downloadToDisc({media: doc}, true);\n\n preloader = new ProgressivePreloader();\n preloader.attach(downloadDiv, false, promise);\n preloader.setDownloadFunction(load);\n addByteProgress(promise);\n } else if(!cacheContext.downloaded || uploadFileName) {\n downloadDiv = docDiv.querySelector('.document-download') || icoDiv;\n preloader = new ProgressivePreloader({\n isUpload: !!uploadFileName\n });\n\n if(!uploadFileName) {\n preloader.construct();\n preloader.setManual();\n preloader.attach(downloadDiv);\n preloader.setDownloadFunction(load);\n\n if(autoDownloadSize !== undefined && autoDownloadSize >= doc.size) {\n simulateClickEvent(preloader.preloader);\n }\n } else {\n const uploadPromise = appDownloadManager.getUpload(uploadFileName);\n preloader.attachPromise(uploadPromise);\n preloader.attach(downloadDiv);\n addByteProgress(uploadPromise);\n }\n }\n\n attachClickEvent(docDiv, (e) => {\n if(findUpClassName(e.target, 'time')) { // prevent downloading by clicking on time\n return;\n }\n\n if(preloader) {\n preloader.onClick(e);\n } else {\n load(e);\n }\n });\n\n return docDiv;\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 {formatPhoneNumber} from '../../helpers/formatPhoneNumber';\n\nexport default function formatUserPhone(phone: string) {\n return '+' + formatPhoneNumber(phone).formatted;\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 numberThousandSplitter from '../../helpers/number/numberThousandSplitter';\nimport {Chat, ChatParticipants} from '../../layer';\nimport {i18n, LangPackKey} from '../../lib/langPack';\nimport rootScope from '../../lib/rootScope';\n\nexport default async function getChatMembersString(chatId: ChatId, managers = rootScope.managers) {\n const chat: Chat = await managers.appChatsManager.getChat(chatId);\n if(chat._ === 'chatForbidden') {\n return i18n('YouWereKicked');\n }\n\n const chatFull = await managers.appProfileManager.getCachedFullChat(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 isBroadcast = (chat as Chat.channel).pFlags.broadcast;\n count = count || 1;\n\n const key: LangPackKey = isBroadcast ? 'Peer.Status.Subscribers' : 'Peer.Status.Member';\n return i18n(key, [numberThousandSplitter(count)]);\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 _limitSymbols from '../../helpers/string/limitSymbols';\nimport {Chat} from '../../layer';\nimport getPeerActiveUsernames from '../../lib/appManagers/utils/peers/getPeerActiveUsernames';\nimport I18n from '../../lib/langPack';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport rootScope from '../../lib/rootScope';\n\ntype GetPeerTitleOptions = {\n peerId: PeerId,\n plainText?: boolean,\n onlyFirstName?: boolean,\n limitSymbols?: number,\n threadId?: number\n} & Pick;\n\nexport default async function getPeerTitle(\n options: T\n): Promise {\n const {\n peerId = rootScope.myId,\n plainText,\n onlyFirstName,\n limitSymbols,\n managers = rootScope.managers,\n threadId\n } = options;\n\n let title = '';\n if(peerId.isUser()) {\n const user = await managers.appUsersManager.getUser(peerId.toUserId());\n if(user) {\n if(user.first_name) title += user.first_name;\n if(user.last_name && (!onlyFirstName || !title)) title += ' ' + user.last_name;\n }\n\n if(!title) title = !user || user.pFlags.deleted ? I18n.format(onlyFirstName ? 'Deleted' : 'HiddenName', true) : getPeerActiveUsernames(user)[0] || '';\n else title = title.trim();\n } else {\n if(threadId) {\n const topic = await managers.dialogsStorage.getForumTopic(peerId, threadId);\n title = topic?.title || '';\n }\n\n if(!title) {\n const chat = await managers.appChatsManager.getChat(peerId.toChatId()) as Chat.chat;\n title = chat?.title || '';\n }\n\n if(onlyFirstName) {\n title = title.split(' ')[0];\n }\n }\n\n if(limitSymbols !== undefined) {\n title = _limitSymbols(title, limitSymbols, limitSymbols);\n }\n\n return plainText ? title : wrapEmojiText(title) as any;\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 {formatFullSentTimeRaw} from '../../helpers/date';\nimport {User} from '../../layer';\nimport {LangPackKey, i18n} from '../../lib/langPack';\nimport {REPLIES_PEER_ID, SERVICE_PEER_ID} from '../../lib/mtproto/mtproto_config';\n\nexport default function getUserStatusString(user: User.user): HTMLElement {\n if(!user) {\n return document.createElement('span');\n }\n\n let key: LangPackKey;\n let args: any[];\n\n switch(user.id) {\n case REPLIES_PEER_ID.toUserId():\n key = 'Peer.RepliesNotifications';\n break;\n case SERVICE_PEER_ID.toUserId():\n key = 'Peer.ServiceNotifications';\n break;\n default: {\n if(user.pFlags.bot) {\n key = 'Bot';\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 * 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 getImageFromStrippedThumb from '../../helpers/getImageFromStrippedThumb';\nimport noop from '../../helpers/noop';\nimport {Document, Photo, PhotoSize} from '../../layer';\nimport DotRenderer from '../dotRenderer';\nimport SetTransition from '../singleTransition';\n\nexport function toggleMediaSpoiler(options: {\n mediaSpoiler: HTMLElement,\n reveal: boolean,\n destroyAfter?: boolean\n}) {\n const {mediaSpoiler, reveal, destroyAfter} = options;\n SetTransition({\n element: mediaSpoiler,\n forwards: reveal,\n className: 'is-revealing',\n duration: 250,\n onTransitionEnd: () => {\n if(reveal && destroyAfter) {\n mediaSpoiler.remove();\n mediaSpoiler.middlewareHelper.destroy();\n }\n }\n });\n}\n\nexport function onMediaSpoilerClick(options: {\n mediaSpoiler: HTMLElement,\n event: Event\n}) {\n const {mediaSpoiler, event} = options;\n cancelEvent(event);\n\n if(mediaSpoiler.classList.contains('is-revealing')) {\n return;\n }\n\n const video = mediaSpoiler.parentElement.querySelector('video');\n if(video && !mediaSpoiler.parentElement.querySelector('.video-play')) {\n video.autoplay = true;\n video.play().catch(noop);\n }\n\n toggleMediaSpoiler({\n mediaSpoiler,\n reveal: true,\n destroyAfter: true\n });\n}\n\nexport function wrapMediaSpoilerWithImage(options: {\n image: Awaited>['image']\n} & Parameters[0]) {\n const {middleware, image} = options;\n if(!middleware()) {\n return;\n }\n\n image.classList.add('media-spoiler-thumbnail');\n\n const container = document.createElement('div');\n container.classList.add('media-spoiler-container');\n container.middlewareHelper = middleware.create();\n\n const dotRenderer = DotRenderer.create({\n ...options,\n middleware: container.middlewareHelper.get()\n });\n\n container.append(image, dotRenderer.canvas);\n\n return container;\n}\n\nexport default async function wrapMediaSpoiler(\n options: Omit[0], 'image'> & {\n media: Document.document | Photo.photo\n }\n) {\n const {media} = options;\n const sizes = (media as Photo.photo).sizes || (media as Document.document).thumbs;\n const thumb = sizes.find((size) => size._ === 'photoStrippedSize') as PhotoSize.photoStrippedSize;\n if(!thumb) {\n return;\n }\n\n const {image, loadPromise} = getImageFromStrippedThumb(media, thumb, true);\n await loadPromise;\n\n return wrapMediaSpoilerWithImage({\n ...options,\n image\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 {MyMessage} from '../../lib/appManagers/appMessagesManager';\nimport wrapMessageActionTextNewUnsafe from './messageActionTextNewUnsafe';\n\nexport type WrapMessageActionTextOptions = {\n message: MyMessage,\n plain?: boolean\n} & WrapSomethingOptions;\n\nexport default async function wrapMessageActionTextNew(\n options: T\n): Promise {\n try {\n return await wrapMessageActionTextNewUnsafe(options) as any;\n } catch(err) {\n console.error('wrapMessageActionTextNewUnsafe error:', err);\n return options.plain ? '' : document.createElement('span') as any;\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 {hexaToHsla} from '../helpers/color';\nimport {TOPIC_COLORS} from '../lib/mtproto/mtproto_config';\nimport wrapAbbreviation from '../lib/richTextProcessor/wrapAbbreviation';\n\nlet svg: SVGSVGElement, span: HTMLElement, defs: HTMLElement;\nconst hadColors: Map = new Map();\nexport default function topicAvatar(color: number, content: string) {\n if(!svg) {\n defs = document.getElementById('svg-defs') as HTMLElement;\n\n const ns = 'http://www.w3.org/2000/svg';\n\n svg = document.createElementNS(ns, 'svg');\n svg.setAttributeNS(null, 'width', '26');\n svg.setAttributeNS(null, 'height', '26');\n svg.setAttributeNS(null, 'viewBox', '0 0 26 26');\n svg.classList.add('topic-icon-svg');\n\n const use = document.createElementNS(ns, 'use');\n use.setAttributeNS(null, 'href', '#topic-icon');\n svg.append(use);\n\n span = document.createElement('span');\n span.classList.add('topic-icon', 'avatar-like');\n\n const contentSpan = document.createElement('span');\n contentSpan.classList.add('topic-icon-content');\n span.append(svg, contentSpan);\n }\n\n if(!color) {\n console.error('NO TOPIC ICON COLOR!');\n color = TOPIC_COLORS[0];\n }\n\n if(!content) {\n console.error('NO TOPIC NAME!');\n content = '';\n }\n\n const hex = color.toString(16);\n\n const gradientId = `topic-icon-gradient-${color}`;\n let strokeColor = hadColors.get(color);\n if(!strokeColor) {\n const {h, s, l, a} = hexaToHsla('#' + hex);\n defs.insertAdjacentHTML('beforeend', `\n \n \n \n \n `);\n\n hadColors.set(color, strokeColor = `hsla(${h}, ${s}%, ${Math.max(0, l - 40)}%, ${a})`);\n }\n\n const clone = span.cloneNode(true) as typeof span;\n (clone.firstElementChild as HTMLElement).style.fill = `url(#${gradientId})`;\n // (clone.firstElementChild as HTMLElement).style.stroke = `var(--peer-avatar-${color}-filled)`;\n (clone.firstElementChild as HTMLElement).style.stroke = strokeColor;\n clone.lastElementChild.append(wrapAbbreviation(content, true));\n return clone;\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, MessageAction} from '../../layer';\nimport wrapUrl from '../../lib/richTextProcessor/wrapUrl';\n\nexport default function wrapJoinVoiceChatAnchor(message: Message.messageService) {\n const action = message.action as MessageAction.messageActionInviteToGroupCall;\n const {onclick, url} = 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 * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport {formatTime, ONE_DAY} from '../../helpers/date';\nimport htmlToSpan from '../../helpers/dom/htmlToSpan';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport formatCallDuration from '../../helpers/formatCallDuration';\nimport paymentsWrapCurrencyAmount from '../../helpers/paymentsWrapCurrencyAmount';\nimport {ForumTopic, Message, MessageAction} from '../../layer';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport I18n, {FormatterArgument, FormatterArguments, i18n, join, langPack, LangPackKey, _i18n} from '../../lib/langPack';\nimport {GENERAL_TOPIC_ID} from '../../lib/mtproto/mtproto_config';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport wrapPlainText from '../../lib/richTextProcessor/wrapPlainText';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\nimport rootScope from '../../lib/rootScope';\nimport topicAvatar from '../topicAvatar';\nimport {wrapCustomEmojiAwaited} from './customEmoji';\nimport getPeerTitle from './getPeerTitle';\nimport wrapJoinVoiceChatAnchor from './joinVoiceChatAnchor';\nimport {WrapMessageActionTextOptions} from './messageActionTextNew';\nimport wrapMessageForReply, {WrapMessageForReplyOptions} from './messageForReply';\nimport wrapPeerTitle from './peerTitle';\n\nasync function wrapLinkToMessage(options: WrapMessageForReplyOptions) {\n const wrapped = await wrapMessageForReply(options);\n\n if(options.plain) {\n return wrapped;\n }\n\n const a = document.createElement('i');\n a.dataset.savedFrom = (options.message as Message.message).peerId + '_' + (options.message as Message.message).mid;\n a.dir = 'auto';\n a.append(wrapped);\n return a;\n}\n\nfunction wrapSomeText(text: string, plain?: boolean) {\n return plain ? text : htmlToSpan(wrapEmojiText(text));\n}\n\ntype WrapTopicIconOptions = {\n topic: Pick,\n plain?: boolean\n} & WrapSomethingOptions;\nexport async function wrapTopicIcon(options: T): Promise {\n const topic = options.topic;\n\n let iconEmojiId = topic?.icon_emoji_id;\n if(topic?.id === GENERAL_TOPIC_ID) {\n iconEmojiId = '5390854796011906616';\n }\n\n if(!iconEmojiId) {\n if(options.plain) return '' as any;\n\n // if(topic?.id === GENERAL_TOPIC_ID) {\n // const span = document.createElement('span');\n // span.innerHTML = `\n // \n // \n // \n // `;\n\n // span.classList.add('topic-icon');\n\n // return span as any;\n // }\n\n return topicAvatar(topic?.icon_color, topic?.title) as any;\n }\n\n return options.plain ?\n rootScope.managers.appEmojiManager.getCustomEmojiDocument(iconEmojiId).then((doc) => doc.stickerEmojiRaw) :\n wrapCustomEmojiAwaited({\n ...options,\n docIds: [iconEmojiId]\n }).then((fragment) => {\n fragment.lastElementChild.classList.add('topic-icon');\n return fragment;\n }) as any;\n}\n\nfunction wrapMessageActionTopicIcon(options: WrapMessageActionTextOptions) {\n const action = ((options.message as Message.messageService).action as MessageAction.messageActionTopicCreate);\n return wrapTopicIcon({\n ...options,\n topic: action as any as ForumTopic.forumTopic\n });\n}\n\nasync function wrapMessageActionTopicIconAndName(options: WrapMessageActionTextOptions) {\n const action = ((options.message as Message.messageService).action as MessageAction.messageActionTopicCreate);\n const span = document.createElement('span');\n span.classList.add('topic-name');\n span.append(await wrapMessageActionTopicIcon(options), wrapSomeText(action.title, options.plain));\n return span;\n}\n\nexport default async function wrapMessageActionTextNewUnsafe(options: WrapMessageActionTextOptions) {\n const {plain, message, middleware, lazyLoadQueue, customEmojiSize, animationGroup} = options;\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 wrapPlainText(unsafeMessage);\n } else {\n setInnerHTML(element, wrapRichText(unsafeMessage, {noLinebreaks: true}));\n return element;\n }\n } else {\n let _ = action._;\n // let suffix = '';\n let langPackKey: LangPackKey;\n let args: Array>;\n\n const managers = rootScope.managers;\n\n const getNameDivHTML = (peerId: PeerId, plain: boolean) => {\n return plain ? getPeerTitle({peerId, plainText: plain}) : wrapPeerTitle({peerId});\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(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 = rootScope.myId;\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(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 = await managers.appPeersManager.isBroadcast(message.peerId);\n langPackKey = isBroadcast ? 'ChatList.Service.VoiceChatScheduled.Channel' : 'ChatList.Service.VoiceChatScheduled';\n args = [];\n const myId = rootScope.myId;\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;\n const _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 = rootScope.myId;\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 = await managers.appMessagesManager.getMessageByPeer(peerId, message.reply_to_mid);\n\n args = [\n getNameDivHTML(message.fromId, plain)\n ];\n\n if(!pinnedMessage/* || true */) {\n langPackKey = 'ActionPinnedNoText';\n\n if(message.reply_to_mid) { // refresh original message\n managers.appMessagesManager.fetchMessageReplyTo(message);\n }\n } else {\n args.push(wrapLinkToMessage({\n ...options,\n message: pinnedMessage\n }));\n }\n\n break;\n }\n\n case 'messageActionChatJoinedByRequest': {\n const isBroadcast = await managers.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(wrapSomeText(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 await Promise.all(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 = 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 case 'messageActionPaymentSent': {\n const isRecurringInit = action.pFlags.recurring_init;\n const isRecurringUsed = action.pFlags.recurring_used;\n langPackKey = isRecurringUsed ? 'Chat.Service.PaymentSentRecurringUsedNoTitle' : (isRecurringInit ? 'Chat.Service.PaymentSentRecurringInitNoTitle' : 'Chat.Service.PaymentSent1NoTitle');\n const price = paymentsWrapCurrencyAmount(action.total_amount, action.currency);\n args = [price, getNameDivHTML(message.peerId, plain)];\n\n if(message.reply_to_mid) {\n const invoiceMessage = await managers.appMessagesManager.getMessageByPeer(\n message.reply_to?.reply_to_peer_id ? getPeerId(message.reply_to.reply_to_peer_id) : message.peerId,\n message.reply_to_mid\n );\n\n if(!invoiceMessage) {\n managers.appMessagesManager.fetchMessageReplyTo(message);\n } else {\n langPackKey = isRecurringUsed ? 'Chat.Service.PaymentSentRecurringUsed' : (isRecurringInit ? 'Chat.Service.PaymentSentRecurringInit' : 'Chat.Service.PaymentSent1');\n args.push(wrapLinkToMessage({\n ...options,\n message: invoiceMessage\n }).then((el) => {\n if(el instanceof HTMLElement) {\n el.classList.add('is-receipt-link');\n }\n\n return el;\n }));\n }\n }\n\n break;\n }\n\n case 'messageActionSetMessagesTTL': {\n args = [];\n\n const isBroadcast = await managers.appPeersManager.isBroadcast(message.peerId);\n if(action.period) {\n if(isBroadcast) {\n langPackKey = 'ActionTTLChannelChanged';\n } else if(message.fromId === rootScope.myId) {\n langPackKey = 'ActionTTLYouChanged';\n } else {\n langPackKey = 'ActionTTLChanged';\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n let duration: ReturnType;\n if(action.period > 1814400) {\n let key: LangPackKey;\n const args: FormatterArguments = [];\n const year = 31536000;\n if(action.period >= year) {\n key = 'Years';\n args.push(action.period / year | 0);\n } else {\n key = 'Months';\n args.push(action.period / (ONE_DAY * 30) | 0);\n }\n\n duration = plain ? I18n.format(key, true, args) : i18n(key, args);\n } else {\n duration = formatCallDuration(action.period, plain);\n }\n\n args.push(duration);\n } else {\n if(isBroadcast) {\n langPackKey = 'ActionTTLChannelDisabled';\n } else if(message.fromId === rootScope.myId) {\n langPackKey = 'ActionTTLYouDisabled';\n } else {\n langPackKey = 'ActionTTLDisabled';\n args.push(getNameDivHTML(message.fromId, plain));\n }\n }\n break;\n }\n\n case 'messageActionTopicEdit': {\n let iconElement: (typeof args)[0];\n let titleElement: typeof iconElement;\n let authorElement: ReturnType;\n const isMe = !!message.pFlags.out;\n const isIconChanged = action.icon_emoji_id !== undefined;\n const isIconRemoved = isIconChanged && !+action.icon_emoji_id;\n const isTitleChanged = action.title !== undefined;\n const isHiddenChanged = action.hidden !== undefined;\n\n if(!isMe) {\n authorElement = getNameDivHTML(message.fromId, plain);\n }\n\n if(isTitleChanged) {\n titleElement = wrapSomeText(action.title);\n }\n\n if(isIconChanged && !isIconRemoved) {\n iconElement = wrapMessageActionTopicIcon(options);\n }\n\n args = authorElement ? [authorElement] : [];\n\n if(action.closed) {\n langPackKey = isMe ? 'Chat.Service.Group.TopicEdited.You.Paused' : 'Chat.Service.Group.TopicEdited.Paused';\n } else if(action.closed === false) {\n langPackKey = isMe ? 'Chat.Service.Group.TopicEdited.You.Resumed' : 'Chat.Service.Group.TopicEdited.Resumed';\n } else if(isIconRemoved && isTitleChanged) {\n langPackKey = isMe ? 'Chat.Service.TopicEdited.You.Mixed.IconRemoved' : 'Chat.Service.TopicEdited.Mixed.IconRemoved';\n args.push(titleElement);\n } else if(isIconChanged && isTitleChanged) {\n langPackKey = isMe ? 'Chat.Service.TopicEdited.You.Mixed' : 'Chat.Service.TopicEdited.Mixed';\n args.push(wrapMessageActionTopicIconAndName(options));\n } else if(isIconRemoved) {\n langPackKey = isMe ? 'Chat.Service.Group.TopicEdited.You.Icon.Removed' : 'Chat.Service.Group.TopicEdited.Icon.Removed';\n } else if(isTitleChanged) {\n langPackKey = isMe ? 'Chat.Service.Group.TopicEdited.You.Title' : 'Chat.Service.Group.TopicEdited.Title';\n args.push(titleElement);\n } else if(isIconChanged) {\n langPackKey = isMe ? 'Chat.Service.Group.TopicEdited.You.Icon' : 'Chat.Service.Group.TopicEdited.Icon';\n args.push(iconElement);\n } else if(isHiddenChanged) {\n langPackKey = isMe ?\n (action.hidden ? 'Chat.Service.Group.TopicEdited.You.Hided' : 'Chat.Service.Group.TopicEdited.You.Unhided') :\n (action.hidden ? 'Chat.Service.Group.TopicEdited.Hided' : 'Chat.Service.Group.TopicEdited.Unhided');\n }\n\n break;\n }\n\n case 'messageActionTopicCreate': {\n args = [wrapMessageActionTopicIconAndName(options)];\n langPackKey = 'TopicWasCreatedAction';\n break;\n }\n\n case 'messageActionSetChatTheme': {\n const isMe = !!message.pFlags.out;\n let authorElement: ReturnType;\n if(!isMe) {\n authorElement = getNameDivHTML(message.fromId, plain);\n }\n\n args = authorElement ? [authorElement] : [];\n\n if(action.emoticon) {\n args.push(wrapEmojiText(action.emoticon));\n langPackKey = isMe ? 'ChatThemeChangedYou' : 'ChatThemeChangedTo';\n } else {\n langPackKey = isMe ? 'ChatThemeDisabledYou' : 'ChatThemeDisabled';\n }\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 const waited = args && await Promise.all(args);\n\n if(plain) {\n return I18n.format(langPackKey, true, waited);\n } else {\n return _i18n(element, langPackKey, waited);\n }\n\n // str = !langPackKey || langPackKey[0].toUpperCase() === langPackKey[0] ? langPackKey : getNameDivHTML(message.fromId) + langPackKey + (suffix ? ' ' : '');\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 assumeType from '../../helpers/assumeType';\nimport htmlToDocumentFragment from '../../helpers/dom/htmlToDocumentFragment';\nimport {getRestrictionReason} from '../../helpers/restrictions';\nimport escapeRegExp from '../../helpers/string/escapeRegExp';\nimport limitSymbols from '../../helpers/string/limitSymbols';\nimport {Message, DocumentAttribute, DraftMessage} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport {MyDraftMessage} from '../../lib/appManagers/appDraftsManager';\nimport {MyMessage} from '../../lib/appManagers/appMessagesManager';\nimport isMessageRestricted from '../../lib/appManagers/utils/messages/isMessageRestricted';\nimport I18n, {LangPackKey, i18n, UNSUPPORTED_LANG_PACK_KEY} from '../../lib/langPack';\nimport parseEntities from '../../lib/richTextProcessor/parseEntities';\nimport sortEntities from '../../lib/richTextProcessor/sortEntities';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport wrapPlainText from '../../lib/richTextProcessor/wrapPlainText';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\nimport rootScope from '../../lib/rootScope';\nimport {Modify} from '../../types';\nimport wrapMessageActionTextNew, {WrapMessageActionTextOptions} from './messageActionTextNew';\n\nexport type WrapMessageForReplyOptions = Modify & {\n text?: string,\n usingMids?: number[],\n highlightWord?: string,\n withoutMediaType?: boolean\n};\n\n// export default async function wrapMessageForReply(message: MyMessage | MyDraftMessage, text: string, usingMids: number[], plain: true, highlightWord?: string, withoutMediaType?: boolean): Promise;\n// export default async function wrapMessageForReply(message: MyMessage | MyDraftMessage, text?: string, usingMids?: number[], plain?: false, highlightWord?: string, withoutMediaType?: boolean): Promise;\n// export default async function wrapMessageForReply(message: MyMessage | MyDraftMessage, text: string = (message as Message.message).message, usingMids?: number[], plain?: boolean, highlightWord?: string, withoutMediaType?: boolean): Promise {\nexport default async function wrapMessageForReply(\n options: T\n): Promise {\n let {message, text, usingMids, plain, highlightWord, withoutMediaType} = options;\n text ??= (message as Message.message).message;\n\n const parts: (Node | string)[] = [];\n\n let hasAlbumKey = false;\n const addPart = (langKey: LangPackKey, part?: string | HTMLElement | DocumentFragment) => {\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('span');\n if(typeof(part) === 'string') el.innerHTML = part;\n else el.append(part);\n parts.push(el);\n }\n };\n\n const managers = rootScope.managers;\n const appMessagesManager = managers.appMessagesManager;\n\n const isRestricted = isMessageRestricted(message as any);\n\n let entities = (message as Message.message).totalEntities ?? (message as DraftMessage.draftMessage).entities;\n if((message as Message.message).media && !isRestricted) {\n assumeType(message);\n let usingFullAlbum = true;\n if(message.grouped_id) {\n if(usingMids) {\n const mids = await appMessagesManager.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 = await appMessagesManager.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 : 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 const f = '๐Ÿ“Š' + ' ' + (media.poll.question || 'poll');\n addPart(undefined, plain ? f : wrapEmojiText(f));\n break;\n case 'messageMediaContact':\n addPart('AttachContact');\n break;\n case 'messageMediaGame': {\n const f = '๐ŸŽฎ' + ' ' + media.game.title;\n addPart(undefined, plain ? f : 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 const i = parts.length;\n if(document.stickerEmojiRaw) {\n const f = document.stickerEmojiRaw + ' ';\n addPart(undefined, plain ? f : wrapEmojiText(f));\n }\n\n addPart('AttachSticker');\n\n // will combine two parts into one\n const p = parts.splice(i, 2);\n if(plain) parts.push((p[0] as string) + (p[1] ? p[1] as string : ''));\n else {\n const span = window.document.createElement('span');\n span.append(...p);\n parts.push(span);\n }\n\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 : wrapEmojiText(f));\n } else {\n addPart(undefined, plain ? document.file_name : wrapEmojiText(document.file_name));\n }\n\n break;\n }\n\n case 'messageMediaInvoice': {\n if(media.extended_media?._ === 'messageExtendedMediaPreview') {\n addPart(undefined, plain ? media.description : wrapEmojiText(media.description));\n } else {\n addPart(undefined, plain ? media.title : wrapEmojiText(media.title));\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 // /////appMessagesManager.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 = await wrapMessageActionTextNew({message: (message as Message.messageService), plain});\n if(actionWrapped) {\n addPart(undefined, actionWrapped);\n }\n }\n\n if(isRestricted) {\n text = getRestrictionReason((message as Message.message).restriction_reason).text;\n entities = [];\n }\n\n if(text) {\n text = limitSymbols(text, 100);\n\n entities ??= parseEntities(text);\n\n if(plain) {\n parts.push(wrapPlainText(text, entities));\n } else {\n // let entities = parseEntities(text.replace(/\\n/g, ' '));\n\n if(highlightWord) {\n highlightWord = highlightWord.trim();\n let found = false;\n let match: any;\n const regExp = new RegExp(escapeRegExp(highlightWord), 'gi');\n entities = entities.slice(); // fix leaving highlight entity\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 sortEntities(entities);\n }\n }\n\n const messageWrapped = wrapRichText(text, {\n noLinebreaks: true,\n entities,\n noLinks: true,\n noTextFormat: true\n });\n\n parts.push(htmlToDocumentFragment(messageWrapped));\n }\n }\n\n if(plain) {\n return parts.join('') as any;\n } else {\n const fragment = document.createDocumentFragment();\n fragment.append(...parts);\n return fragment as any;\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 PeerTitle, {PeerTitleOptions} from '../peerTitle';\n\nexport default async function wrapPeerTitle(options: PeerTitleOptions) {\n const peerTitle = new PeerTitle();\n await peerTitle.update(options);\n return peerTitle.element;\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 renderMediaWithFadeIn from '../../helpers/dom/renderMediaWithFadeIn';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {Message, PhotoSize, VideoSize, WebDocument} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport {MyPhoto} from '../../lib/appManagers/appPhotosManager';\nimport rootScope from '../../lib/rootScope';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport ProgressivePreloader from '../preloader';\nimport blur from '../../helpers/blur';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getStrippedThumbIfNeeded from '../../helpers/getStrippedThumbIfNeeded';\nimport setAttachmentSize from '../../helpers/setAttachmentSize';\nimport choosePhotoSize from '../../lib/appManagers/utils/photos/choosePhotoSize';\nimport type {ThumbCache} from '../../lib/storages/thumbs';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport isWebDocument from '../../lib/appManagers/utils/webDocs/isWebDocument';\nimport createVideo from '../../helpers/dom/createVideo';\nimport noop from '../../helpers/noop';\nimport {THUMB_TYPE_FULL} from '../../lib/mtproto/mtproto_config';\nimport {Middleware} from '../../helpers/middleware';\n\nexport default async function wrapPhoto({photo, message, container, boxWidth, boxHeight, withTail, isOut, lazyLoadQueue, middleware, size, withoutPreloader, loadPromises, autoDownloadSize, noBlur, noThumb, noFadeIn, blurAfter, managers = rootScope.managers, processUrl}: {\n photo: MyPhoto | MyDocument | WebDocument,\n message?: Message.message | Message.messageService,\n container: HTMLElement,\n boxWidth?: number,\n boxHeight?: number,\n withTail?: boolean,\n isOut?: boolean,\n lazyLoadQueue?: LazyLoadQueue,\n middleware?: Middleware,\n size?: PhotoSize | VideoSize,\n withoutPreloader?: boolean,\n loadPromises?: Promise[],\n autoDownloadSize?: number,\n noBlur?: boolean,\n noThumb?: boolean,\n noFadeIn?: boolean,\n blurAfter?: boolean,\n managers?: AppManagers,\n processUrl?: (url: string) => Promise\n}) {\n const ret = {\n loadPromises: {\n thumb: Promise.resolve() as Promise,\n full: Promise.resolve() as Promise\n },\n images: {\n thumb: null as HTMLImageElement | HTMLCanvasElement,\n full: null as HTMLVideoElement | HTMLImageElement\n },\n preloader: null as ProgressivePreloader,\n aspecter: null as HTMLElement\n };\n\n const isDocument = photo._ === 'document';\n const isImageFromDocument = isDocument && photo.mime_type.startsWith('image/') && !size;\n const isWebDoc = isWebDocument(photo);\n if(!((photo as MyPhoto).sizes || (photo as MyDocument).thumbs) && !isWebDoc && !isImageFromDocument) {\n if(boxWidth && boxHeight && !size && isDocument) {\n setAttachmentSize(photo, container, boxWidth, boxHeight, undefined, message);\n }\n\n return ret;\n }\n\n let noAutoDownload = autoDownloadSize === 0;\n\n if(!size) {\n if(boxWidth === undefined) boxWidth = mediaSizes.active.regular.width;\n if(boxHeight === undefined) boxHeight = mediaSizes.active.regular.height;\n }\n\n container.classList.add('media-container');\n let aspecter = container;\n\n let isFit = true;\n let loadThumbPromise: Promise = Promise.resolve();\n let thumbImage: HTMLImageElement | HTMLCanvasElement;\n // let image: HTMLImageElement;\n let cacheContext: ThumbCache;\n // if(withTail) {\n // image = wrapMediaWithTail(photo, message, container, boxWidth, boxHeight, isOut);\n // } else {\n\n if(boxWidth && boxHeight && !size) { // !album\n const set = setAttachmentSize(\n photo,\n container,\n boxWidth,\n boxHeight,\n undefined,\n message,\n undefined,\n isImageFromDocument ? {\n _: 'photoSize',\n w: photo.w,\n h: photo.h,\n size: photo.size,\n type: THUMB_TYPE_FULL\n } : undefined\n );\n size = set.photoSize;\n isFit = set.isFit;\n cacheContext = await managers.thumbsStorage.getCacheContext(photo, size.type);\n\n if(!isFit && !isWebDoc) {\n aspecter = document.createElement('div');\n aspecter.classList.add('media-container-aspecter');\n aspecter.style.width = set.size.width + 'px';\n aspecter.style.height = set.size.height + 'px';\n\n const gotThumb = getStrippedThumbIfNeeded(photo, cacheContext, !noBlur, true);\n if(gotThumb) {\n loadThumbPromise = gotThumb.loadPromise;\n const thumbImage = gotThumb.image; // local scope\n thumbImage.classList.add('media-photo');\n container.append(thumbImage);\n } else {\n const res = await wrapPhoto({\n container,\n message,\n photo,\n boxWidth: 0,\n boxHeight: 0,\n size,\n lazyLoadQueue,\n isOut,\n loadPromises,\n middleware,\n withoutPreloader,\n withTail,\n autoDownloadSize,\n noBlur,\n noThumb: true,\n blurAfter: true,\n managers\n // noFadeIn: true\n });\n const thumbImage = res.images.full;\n thumbImage.classList.add('media-photo', 'thumbnail');\n // container.append(thumbImage);\n }\n\n container.classList.add('media-container-fitted');\n container.append(aspecter);\n }\n } else {\n if(!size) {\n size = choosePhotoSize(photo, boxWidth, boxHeight, true);\n }\n\n cacheContext = await managers.thumbsStorage.getCacheContext(photo, size?.type);\n }\n\n if(!noThumb && !isWebDoc) {\n const gotThumb = getStrippedThumbIfNeeded(photo, cacheContext, !noBlur);\n if(gotThumb) {\n loadThumbPromise = Promise.all([loadThumbPromise, gotThumb.loadPromise]);\n ret.loadPromises.thumb = ret.loadPromises.full = loadThumbPromise;\n thumbImage = ret.images.thumb = gotThumb.image;\n thumbImage.classList.add('media-photo');\n aspecter.append(thumbImage);\n }\n }\n // }\n\n ret.aspecter = aspecter;\n\n if((size?._ === 'photoSizeEmpty' && isDocument) || (size as PhotoSize.photoStrippedSize)?.bytes) {\n return ret;\n }\n\n let media: HTMLVideoElement | HTMLImageElement;\n if(size?._ === 'videoSize') {\n media = ret.images.full = createVideo();\n media.autoplay = true;\n media.loop = true;\n media.muted = true;\n media.classList.add('media-photo');\n } else {\n media = ret.images.full = new Image();\n media.classList.add('media-photo');\n }\n\n // console.log('wrapPhoto downloaded:', photo, photo.downloaded, container);\n\n const needFadeIn = (thumbImage || !cacheContext.downloaded) && rootScope.settings.animationsEnabled && !noFadeIn;\n\n let preloader: ProgressivePreloader;\n const uploadingFileName = (message as Message.message)?.uploadingFileName;\n if(!withoutPreloader) {\n if(!cacheContext.downloaded || uploadingFileName) {\n preloader = new ProgressivePreloader({\n attachMethod: 'prepend',\n isUpload: !!uploadingFileName\n });\n }\n\n if(uploadingFileName) { // means upload\n preloader.attachPromise(appDownloadManager.getUpload(uploadingFileName));\n preloader.attach(container);\n noAutoDownload = undefined;\n }\n }\n\n\n const getDownloadPromise = () => {\n // const promise = isGif && !size ?\n // managers.appDocsManager.downloadDoc(photo, /* undefined, */lazyLoadQueue?.queueId) :\n // managers.appPhotosManager.preloadPhoto(photo, size, lazyLoadQueue?.queueId, noAutoDownload);\n const haveToDownload = isImageFromDocument && !size;\n const promise = appDownloadManager.downloadMediaURL({\n media: photo,\n thumb: size,\n queueId: lazyLoadQueue?.queueId,\n onlyCache: haveToDownload ? undefined : noAutoDownload\n });\n\n return promise;\n };\n\n const renderOnLoad = (url: string) => {\n return renderMediaWithFadeIn(container, media, url, needFadeIn, aspecter, thumbImage);\n };\n\n const onLoad = async(url: string) => {\n if(middleware && !middleware()) return;\n\n if(processUrl) {\n url = await processUrl(url);\n }\n\n if(blurAfter) {\n const result = blur(url, 12);\n return result.promise.then(() => {\n // image = result.canvas;\n return renderOnLoad(result.canvas.toDataURL());\n });\n }\n\n return renderOnLoad(url);\n };\n\n let loadPromise: Promise;\n const canAttachPreloader = (\n (size as PhotoSize.photoSize).w >= 150 &&\n (size as PhotoSize.photoSize).h >= 150\n ) || noAutoDownload;\n const load = async() => {\n if(noAutoDownload && !withoutPreloader && preloader) {\n preloader.construct();\n preloader.setManual();\n }\n\n const promise = getDownloadPromise();\n const cacheContext = await managers.thumbsStorage.getCacheContext(photo, size?.type);\n if(\n preloader &&\n !cacheContext.downloaded &&\n !withoutPreloader &&\n canAttachPreloader\n ) {\n preloader.attach(container, false, promise);\n }\n\n noAutoDownload = undefined;\n\n const renderPromise = promise.then(onLoad);\n renderPromise.catch(noop);\n return {download: promise, render: renderPromise};\n };\n\n if(preloader) {\n preloader.setDownloadFunction(load);\n }\n\n if(cacheContext.downloaded) {\n loadThumbPromise = loadPromise = (await load()).render;\n } else {\n if(!lazyLoadQueue) loadPromise = (await load()).render;\n /* else if(noAutoDownload) {\n preloader.construct();\n preloader.setManual();\n preloader.attach(container);\n } */ else lazyLoadQueue.push({div: container, load: () => load().then(({download}) => download)});\n }\n\n if(loadPromises && loadThumbPromise) {\n loadPromises.push(loadThumbPromise);\n }\n\n // const perf = performance.now();\n await loadThumbPromise;\n ret.loadPromises.thumb = loadThumbPromise;\n ret.loadPromises.full = loadPromise || Promise.resolve();\n ret.preloader = preloader;\n\n // const elapsedTime = performance.now() - perf;\n // if(elapsedTime > 4) {\n // console.log('wrapping photo thumb time', elapsedTime, photo, size);\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 {MyMessage} from '../../lib/appManagers/appMessagesManager';\nimport getMessageSenderPeerIdOrName from '../../lib/appManagers/utils/messages/getMessageSenderPeerIdOrName';\nimport {i18n} from '../../lib/langPack';\nimport rootScope from '../../lib/rootScope';\nimport wrapPeerTitle from './peerTitle';\n\nexport default async function 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 await wrapPeerTitle({\n ...getMessageSenderPeerIdOrName(message),\n dialog: message.peerId === rootScope.myId\n })\n );\n\n if(await rootScope.managers.appPeersManager.isAnyGroup(message.peerId) || fromMe) {\n const peerTitle = await wrapPeerTitle({peerId: message.peerId});\n senderTitle.append(' โž ', peerTitle);\n }\n\n return senderTitle;\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 {formatDateAccordingToTodayNew} from '../../helpers/date';\nimport {MyMessage} from '../../lib/appManagers/appMessagesManager';\n\nexport default function 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 * 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_WEBP_SUPPORTED from '../../environment/webpSupport';\nimport assumeType from '../../helpers/assumeType';\nimport getPathFromBytes from '../../helpers/bytes/getPathFromBytes';\nimport deferredPromise from '../../helpers/cancellablePromise';\nimport computeLockColor from '../../helpers/computeLockColor';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport createVideo from '../../helpers/dom/createVideo';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport renderImageFromUrl, {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\nimport getImageFromStrippedThumb from '../../helpers/getImageFromStrippedThumb';\nimport getPreviewURLFromThumb from '../../helpers/getPreviewURLFromThumb';\nimport makeError from '../../helpers/makeError';\nimport {makeMediaSize} from '../../helpers/mediaSize';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {Middleware} from '../../helpers/middleware';\nimport onMediaLoad from '../../helpers/onMediaLoad';\nimport {isSavingLottiePreview, saveLottiePreview} from '../../helpers/saveLottiePreview';\nimport throttle from '../../helpers/schedulers/throttle';\nimport sequentialDom from '../../helpers/sequentialDom';\nimport {PhotoSize, VideoSize} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\nimport choosePhotoSize from '../../lib/appManagers/utils/photos/choosePhotoSize';\nimport getStickerEffectThumb from '../../lib/appManagers/utils/stickers/getStickerEffectThumb';\nimport lottieLoader from '../../lib/rlottie/lottieLoader';\nimport type RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport rootScope from '../../lib/rootScope';\nimport type {ThumbCache} from '../../lib/storages/thumbs';\nimport webpWorkerController from '../../lib/webp/webpWorkerController';\nimport {Awaited, SendMessageEmojiInteractionData} from '../../types';\nimport {getEmojiToneIndex} from '../../vendor/emoji';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport PopupStickers from '../popups/stickers';\nimport {hideToast, toastNew} from '../toast';\nimport wrapStickerAnimation from './stickerAnimation';\nimport framesCache from '../../helpers/framesCache';\n\n// https://github.com/telegramdesktop/tdesktop/blob/master/Telegram/SourceFiles/history/view/media/history_view_sticker.cpp#L40\nexport const STICKER_EFFECT_MULTIPLIER = 1 + 0.245 * 2;\nconst EMOJI_EFFECT_MULTIPLIER = 3;\n\nconst locksUrls: {[docId: string]: string} = {};\n\nexport const videosCache: {[key: string]: Promise} = {};\n\nconst onAnimationEnd = (element: HTMLElement, onAnimationEnd: () => void, timeout: number) => {\n const onEnd = () => {\n element.removeEventListener('animationend', onEnd);\n onAnimationEnd();\n clearTimeout(_timeout);\n };\n element.addEventListener('animationend', onEnd);\n const _timeout = setTimeout(onEnd, timeout);\n};\n\nexport default async function wrapSticker({doc, div, middleware, loadStickerMiddleware, lazyLoadQueue, exportLoad, group, play, onlyThumb, emoji, width, height, withThumb, loop, loadPromises, needFadeIn, needUpscale, skipRatio, static: asStatic, managers = rootScope.managers, fullThumb, isOut, noPremium, withLock, relativeEffect, loopEffect, isCustomEmoji, syncedVideo}: {\n doc: MyDocument,\n div: HTMLElement | HTMLElement[],\n middleware?: Middleware,\n loadStickerMiddleware?: Middleware,\n lazyLoadQueue?: LazyLoadQueue,\n exportLoad?: number,\n group?: AnimationItemGroup,\n play?: boolean,\n onlyThumb?: boolean,\n emoji?: string,\n width?: number,\n height?: number,\n withThumb?: boolean,\n loop?: RLottiePlayer['loop'],\n loadPromises?: Promise[],\n needFadeIn?: boolean,\n needUpscale?: boolean,\n skipRatio?: number,\n static?: boolean,\n managers?: AppManagers,\n fullThumb?: PhotoSize | VideoSize,\n isOut?: boolean,\n noPremium?: boolean,\n withLock?: boolean,\n relativeEffect?: boolean,\n loopEffect?: boolean,\n isCustomEmoji?: boolean,\n syncedVideo?: boolean\n}) {\n div = Array.isArray(div) ? div : [div];\n\n if(isCustomEmoji) {\n emoji = doc.stickerEmojiRaw;\n }\n\n const stickerType = doc.sticker;\n if(stickerType === 1) {\n asStatic = true;\n }\n\n if(!width && !height) {\n const sizes = mediaSizes.active;\n const boxSize = emoji ? sizes.emojiSticker : (doc.animated ? sizes.animatedSticker : sizes.staticSticker);\n const size = makeMediaSize(doc.w, doc.h).aspectFitted(boxSize);\n width = size.width;\n height = size.height;\n }\n\n if(stickerType === 2) {\n // LottieLoader.loadLottie();\n lottieLoader.loadLottieWorkers();\n }\n\n div.forEach((div) => {\n div.dataset.docId = '' + doc.id;\n if(emoji) {\n div.dataset.stickerEmoji = emoji;\n }\n\n div.classList.add('media-sticker-wrapper');\n });\n\n /* if(stickerType === 3) {\n const videoRes = wrapVideo({\n doc,\n boxWidth: width,\n boxHeight: height,\n container: div,\n group,\n lazyLoadQueue,\n middleware,\n withoutPreloader: true,\n loadPromises,\n noPlayButton: true,\n noInfo: true\n });\n\n if(videoRes.thumb) {\n if(videoRes.thumb.images.thumb) {\n videoRes.thumb.images.thumb.classList.add('media-sticker', 'thumbnail');\n }\n\n if(videoRes.thumb.images.full) {\n videoRes.thumb.images.full.classList.add('media-sticker');\n }\n }\n\n return videoRes.loadPromise;\n } */\n\n // console.log('wrap sticker', doc, div, onlyThumb);\n\n let cacheContext: ThumbCache;\n const getCacheContext = async(type: string = cacheContext?.type) => {\n return cacheContext = await managers.thumbsStorage.getCacheContext(doc, type);\n };\n\n const isAnimated = !asStatic && (stickerType === 2 || stickerType === 3);\n\n const effectThumb = getStickerEffectThumb(doc);\n if(isOut !== undefined && effectThumb && !isOut) {\n div.forEach((div) => div.classList.add('reflect-x'));\n }\n\n const willHaveLock = effectThumb && withLock;\n if(willHaveLock) {\n const lockUrl = locksUrls[doc.id];\n div.forEach((div) => {\n div.classList.add('is-premium-sticker', 'tgico-premium_lock');\n lockUrl && div.style.setProperty('--lock-url', `url(${lockUrl})`);\n });\n }\n\n if(asStatic && stickerType !== 1) {\n const thumb = choosePhotoSize(doc, width, height, false) as PhotoSize.photoSize;\n await getCacheContext(thumb.type);\n } else {\n await getCacheContext(fullThumb?.type);\n }\n\n const toneIndex = emoji && !isCustomEmoji ? getEmojiToneIndex(emoji) : -1;\n const downloaded = cacheContext.downloaded && !needFadeIn;\n\n const isThumbNeededForType = isAnimated;\n const lottieCachedThumb = stickerType === 2 || stickerType === 3 ? await managers.appDocsManager.getLottieCachedThumb(doc.id, toneIndex) : undefined;\n\n const ret = {render: undefined as typeof loadPromise, load: undefined as typeof load};\n let loadThumbPromise = deferredPromise();\n let haveThumbCached = false;\n if((\n doc.thumbs?.length ||\n lottieCachedThumb\n ) &&\n !div[0].firstElementChild && (\n !downloaded ||\n isThumbNeededForType ||\n onlyThumb\n ) && withThumb !== false/* && doc.thumbs[0]._ !== 'photoSizeEmpty' */\n ) {\n let thumb = lottieCachedThumb || doc.thumbs[0];\n\n // console.log('wrap sticker', thumb, div);\n\n const afterRender = (div: HTMLElement, thumbImage: HTMLElement) => {\n if(!div.childElementCount) {\n sequentialDom.mutateElement(div, () => {\n if(!div.childElementCount) {\n thumbImage.classList.add('media-sticker', 'thumbnail');\n div.append(thumbImage);\n }\n\n loadThumbPromise.resolve();\n });\n } else {\n loadThumbPromise.resolve();\n }\n };\n\n if('url' in thumb) {\n haveThumbCached = true;\n div.forEach((div) => {\n const thumbImage = new Image();\n renderImageFromUrl(thumbImage, (thumb as any).url, () => afterRender(div, thumbImage));\n });\n } else if('bytes' in thumb) {\n if(thumb._ === 'photoPathSize') {\n if(!thumb.bytes.length) {\n thumb = doc.thumbs.find((t) => (t as PhotoSize.photoStrippedSize).bytes?.length) || thumb;\n }\n\n const d = getPathFromBytes((thumb as PhotoSize.photoStrippedSize).bytes);\n const ns = 'http://www.w3.org/2000/svg';\n const svg = document.createElementNS(ns, 'svg');\n svg.classList.add('rlottie-vector', 'media-sticker', 'thumbnail');\n svg.setAttributeNS(null, 'viewBox', `0 0 ${doc.w || 512} ${doc.h || 512}`);\n\n // const defs = document.createElementNS(ns, 'defs');\n // const linearGradient = document.createElementNS(ns, 'linearGradient');\n // linearGradient.setAttributeNS(null, 'id', 'g');\n // linearGradient.setAttributeNS(null, 'x1', '-300%');\n // linearGradient.setAttributeNS(null, 'x2', '-200%');\n // linearGradient.setAttributeNS(null, 'y1', '0');\n // linearGradient.setAttributeNS(null, 'y2', '0');\n // const stops = [\n // ['-10%', '.1'],\n // ['30%', '.07'],\n // ['70%', '.07'],\n // ['110%', '.1']\n // ].map(([offset, stopOpacity]) => {\n // const stop = document.createElementNS(ns, 'stop');\n // stop.setAttributeNS(null, 'offset', offset);\n // stop.setAttributeNS(null, 'stop-opacity', stopOpacity);\n // return stop;\n // });\n // const animates = [\n // ['-300%', '1200%'],\n // ['-200%', '1300%']\n // ].map(([from, to], idx) => {\n // const animate = document.createElementNS(ns, 'animate');\n // animate.setAttributeNS(null, 'attributeName', 'x' + (idx + 1));\n // animate.setAttributeNS(null, 'from', from);\n // animate.setAttributeNS(null, 'to', to);\n // animate.setAttributeNS(null, 'dur', '3s');\n // animate.setAttributeNS(null, 'repeatCount', 'indefinite');\n // return animate;\n // });\n // linearGradient.append(...stops, ...animates);\n // defs.append(linearGradient);\n // svg.append(defs);\n\n const path = document.createElementNS(ns, 'path');\n path.setAttributeNS(null, 'd', d);\n if(rootScope.settings.animationsEnabled && !isCustomEmoji) path.setAttributeNS(null, 'fill', 'url(#g)');\n svg.append(path);\n div.forEach((div, idx) => div.append(idx > 0 ? svg.cloneNode(true) : svg));\n haveThumbCached = true;\n loadThumbPromise.resolve();\n } else if(toneIndex <= 0) {\n const r = () => {\n (div as HTMLElement[]).forEach((div) => {\n const thumbImage = new Image();\n const url = getPreviewURLFromThumb(doc, thumb as PhotoSize.photoStrippedSize, true);\n renderImageFromUrl(thumbImage, url, () => afterRender(div, thumbImage));\n });\n };\n\n if((IS_WEBP_SUPPORTED || doc.pFlags.stickerThumbConverted || cacheContext.url)/* && false */) {\n haveThumbCached = true;\n r();\n } else {\n haveThumbCached = true;\n webpWorkerController.convert('main-' + doc.id, thumb.bytes).then((bytes) => {\n managers.appDocsManager.saveWebPConvertedStrippedThumb(doc.id, bytes);\n (thumb as PhotoSize.photoStrippedSize).bytes = bytes;\n doc.pFlags.stickerThumbConverted = true;\n\n if((middleware && !middleware()) || (div as HTMLElement[])[0].childElementCount) {\n loadThumbPromise.resolve();\n return;\n }\n\n r();\n }).catch(() => loadThumbPromise.resolve());\n }\n }\n } else if(((stickerType === 2 && toneIndex <= 0) || stickerType === 3) && (withThumb || onlyThumb)) {\n const load = async() => {\n if((div as HTMLElement[])[0].childElementCount || (middleware && !middleware())) {\n loadThumbPromise.resolve();\n return;\n }\n\n const r = (div: HTMLElement, thumbImage: HTMLElement, url: string) => {\n if(div.childElementCount || (middleware && !middleware())) {\n loadThumbPromise.resolve();\n return;\n }\n\n if(!url) afterRender(div, thumbImage);\n else renderImageFromUrl(thumbImage, url, () => afterRender(div, thumbImage));\n };\n\n await getCacheContext();\n (div as HTMLElement[]).forEach((div) => {\n if(cacheContext.url) {\n r(div, new Image(), cacheContext.url);\n } else if('bytes' in thumb) {\n const res = getImageFromStrippedThumb(doc, thumb as PhotoSize.photoStrippedSize, true);\n res.loadPromise.then(() => r(div, res.image, ''));\n\n // return managers.appDocsManager.getThumbURL(doc, thumb as PhotoSize.photoStrippedSize).promise.then(r);\n } else {\n appDownloadManager.downloadMediaURL({\n media: doc,\n thumb: thumb as PhotoSize\n }).then(async(url) => {\n return r(div, new Image(), url);\n });\n }\n });\n };\n\n if(lazyLoadQueue && onlyThumb) {\n lazyLoadQueue.push({div: div[0], load});\n loadThumbPromise.resolve();\n return ret;\n } else {\n load();\n\n if((thumb as any).url) {\n haveThumbCached = true;\n }\n }\n }\n }\n\n if(loadPromises && haveThumbCached) {\n loadPromises.push(loadThumbPromise);\n }\n\n if(onlyThumb/* || true */) { // for sticker panel\n return ret;\n }\n\n const middlewareError = makeError('MIDDLEWARE');\n const load = async() => {\n if(middleware && !middleware()) {\n throw middlewareError;\n }\n\n if(stickerType === 2 && !asStatic) {\n const blob = await appDownloadManager.downloadMedia({media: doc, queueId: lazyLoadQueue?.queueId, thumb: fullThumb});\n if(middleware && !middleware()) {\n throw middlewareError;\n }\n\n const animation = await lottieLoader.loadAnimationWorker({\n container: (div as HTMLElement[])[0],\n loop: !!(!emoji || isCustomEmoji) && loop,\n autoplay: play,\n animationData: blob,\n width,\n height,\n name: 'doc' + doc.id,\n needUpscale,\n skipRatio,\n toneIndex,\n sync: isCustomEmoji,\n middleware: loadStickerMiddleware ?? middleware,\n group\n });\n\n // const deferred = deferredPromise();\n\n const setLockColor = willHaveLock ? () => {\n const lockUrl = locksUrls[doc.id] ??= computeLockColor(animation.canvas[0]);\n (div as HTMLElement[]).forEach((div) => div.style.setProperty('--lock-url', `url(${lockUrl})`));\n } : undefined;\n\n const onFirstFrame = (container: HTMLElement, canvas: HTMLCanvasElement) => {\n const element = container.firstElementChild !== canvas && container.firstElementChild as HTMLElement;\n if(needFadeIn !== false) {\n needFadeIn = (needFadeIn || !element || element.tagName === 'svg') && rootScope.settings.animationsEnabled;\n }\n\n const cb = () => {\n if(element && element !== canvas && element.tagName !== 'DIV') {\n element.remove();\n }\n };\n\n if(!needFadeIn) {\n if(element) {\n sequentialDom.mutate(cb);\n }\n } else {\n sequentialDom.mutate(() => {\n canvas && canvas.classList.add('fade-in');\n if(element) {\n element.classList.add('fade-out');\n }\n\n onAnimationEnd(canvas || element, () => {\n sequentialDom.mutate(() => {\n canvas && canvas.classList.remove('fade-in');\n cb();\n });\n }, 400);\n });\n }\n };\n\n animation.addEventListener('firstFrame', () => {\n const canvas = animation.canvas[0];\n if(withThumb !== false || isCustomEmoji) {\n saveLottiePreview(doc, canvas, toneIndex);\n }\n\n if(willHaveLock) {\n setLockColor();\n }\n\n if(!isCustomEmoji) {\n (div as HTMLElement[]).forEach((container, idx) => {\n onFirstFrame(container, animation.canvas[idx]);\n });\n }\n }, {once: true});\n\n if(emoji) {\n managers.appStickersManager.preloadAnimatedEmojiStickerAnimation(emoji);\n }\n\n return animation;\n\n // return deferred;\n // await new Promise((resolve) => setTimeout(resolve, 5e3));\n } else if(asStatic || stickerType === 3) {\n const isSingleVideo = isAnimated && syncedVideo;\n const cacheName = isSingleVideo ? framesCache.generateName('' + doc.id, 0, 0, undefined, undefined) : undefined;\n\n const cachePromise = videosCache[cacheName];\n if(cachePromise) {\n return cachePromise as typeof promise;\n }\n\n const d = isSingleVideo ? (div as HTMLElement[]).slice(0, 1) : div as HTMLElement[];\n const media: HTMLElement[] = d.map(() => {\n let media: HTMLElement;\n if(asStatic) {\n media = new Image();\n } else {\n const video = media = createVideo();\n video.muted = true;\n if(play) video.autoplay = true;\n if(loop) video.loop = true;\n\n if(loop && typeof(loop) === 'number') {\n let previousTime = 0, playedTimes = 0;\n function onTimeupdate(this: HTMLVideoElement) {\n if(previousTime > this.currentTime && ++playedTimes === loop as number) {\n this.autoplay = false;\n this.loop = false;\n this.pause();\n video.removeEventListener('timeupdate', onTimeupdate);\n }\n\n previousTime = this.currentTime;\n }\n\n video.addEventListener('timeupdate', onTimeupdate);\n }\n }\n\n media.classList.add('media-sticker');\n return media;\n });\n\n const thumbImage = (div as HTMLElement[]).map((div, idx) => (div.firstElementChild as HTMLElement) !== media[idx] && div.firstElementChild) as HTMLElement[];\n if(needFadeIn !== false) {\n needFadeIn = (needFadeIn || !downloaded || (asStatic ? thumbImage[0] : (!thumbImage[0] || thumbImage[0].tagName === 'svg'))) && rootScope.settings.animationsEnabled;\n }\n\n if(needFadeIn) {\n media.forEach((media) => media.classList.add('fade-in'));\n }\n\n const promise = new Promise(async(resolve, reject) => {\n const r = async() => {\n if(middleware && !middleware()) {\n reject(middlewareError);\n return;\n }\n\n const mediaLength = media.length;\n const loaded: HTMLElement[] = [];\n const onLoad = (div: HTMLElement, media: HTMLElement, thumbImage: HTMLElement) => {\n sequentialDom.mutateElement(div, () => {\n if(middleware && !middleware()) {\n reject(middlewareError);\n return;\n }\n\n if(!media) {\n if(!isSingleVideo || !isAnimated) {\n thumbImage?.remove();\n }\n\n return;\n }\n\n if(media as HTMLVideoElement) {\n const w = width * window.devicePixelRatio;\n const h = height * window.devicePixelRatio;\n if(!isSavingLottiePreview(doc, toneIndex, w, h)) {\n // const perf = performance.now();\n const canvas = document.createElement('canvas');\n canvas.width = w;\n canvas.height = h;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(media as HTMLVideoElement, 0, 0, canvas.width, canvas.height);\n saveLottiePreview(doc, canvas, toneIndex);\n // console.log('perf', performance.now() - perf);\n }\n }\n\n if(isSingleVideo) {\n resolve(media as any);\n return;\n }\n\n div.append(media);\n\n if(needFadeIn) {\n thumbImage && thumbImage.classList.add('fade-out');\n onAnimationEnd(media, () => {\n media.classList.remove('fade-in');\n thumbImage?.remove();\n }, 400);\n } else {\n thumbImage?.remove();\n }\n\n if(isAnimated) {\n animationIntersector.addAnimation(media as HTMLVideoElement, group, undefined, middleware);\n }\n\n if(loaded.push(media) === mediaLength) {\n resolve(loaded as any);\n }\n });\n };\n\n await getCacheContext();\n let lastPromise: Promise;\n (div as HTMLElement[]).forEach((div, idx) => {\n const _media = media[idx];\n const cb = () => onLoad(div, _media, thumbImage[idx]);\n if(_media) lastPromise = renderImageFromUrlPromise(_media, cacheContext.url);\n lastPromise.then(cb);\n });\n };\n\n await getCacheContext();\n if(cacheContext.url) r();\n else {\n let promise: Promise;\n if(stickerType !== 1 && asStatic) {\n const thumb = choosePhotoSize(doc, width, height, false) as PhotoSize.photoSize;\n // promise = managers.appDocsManager.getThumbURL(doc, thumb).promise\n promise = appDownloadManager.downloadMediaURL({media: doc, thumb, queueId: lazyLoadQueue?.queueId});\n } else {\n promise = appDownloadManager.downloadMediaURL({media: doc, queueId: lazyLoadQueue?.queueId});\n }\n\n promise.then(r, reject);\n }\n });\n\n if(cacheName) {\n videosCache[cacheName] = promise as any;\n loadStickerMiddleware && promise.finally(() => {\n if(!loadStickerMiddleware()) {\n delete videosCache[cacheName];\n }\n });\n }\n\n return promise;\n }\n };\n\n if(exportLoad && ((exportLoad === 1 && (!downloaded || isAnimated)) || exportLoad === 2)) {\n ret.load = load;\n return ret;\n }\n\n const loadPromise: Promise> | void> = lazyLoadQueue && (!downloaded || isAnimated) ?\n (lazyLoadQueue.push({div: div[0], load}), Promise.resolve()) :\n load();\n\n if(downloaded && (asStatic/* || stickerType === 3 */)) {\n loadThumbPromise = loadPromise as any;\n if(loadPromises) {\n loadPromises.push(loadThumbPromise);\n }\n }\n\n if(stickerType === 2 && effectThumb && isOut !== undefined && !noPremium) {\n attachStickerEffectHandler({\n container: div[0],\n doc,\n managers,\n middleware,\n isOut,\n width,\n loadPromise,\n relativeEffect,\n loopEffect\n });\n }\n\n ret.render = loadPromise as any;\n return ret;\n}\n\nfunction attachStickerEffectHandler({container, doc, managers, middleware, isOut, width, loadPromise, relativeEffect, loopEffect}: {\n container: HTMLElement,\n doc: MyDocument,\n managers: AppManagers,\n middleware: Middleware,\n isOut: boolean,\n width: number,\n loadPromise: Promise,\n relativeEffect?: boolean,\n loopEffect?: boolean\n}) {\n managers.appStickersManager.preloadSticker(doc.id, true);\n\n let playing = false;\n attachClickEvent(container, async(e) => {\n cancelEvent(e);\n if(playing) {\n const a = document.createElement('a');\n a.onclick = () => {\n hideToast();\n new PopupStickers(doc.stickerSetInput).show();\n };\n\n toastNew({\n langPackKey: 'Sticker.Premium.Click.Info',\n langPackArguments: [a]\n });\n\n return;\n }\n\n playing = true;\n\n await loadPromise;\n const {animationDiv, stickerPromise} = wrapStickerAnimation({\n doc,\n middleware,\n side: isOut ? 'right' : 'left',\n size: width * STICKER_EFFECT_MULTIPLIER,\n target: container,\n play: true,\n fullThumb: getStickerEffectThumb(doc),\n relativeEffect,\n loopEffect\n });\n\n if(isOut !== undefined && !isOut/* && !relativeEffect */) {\n animationDiv.classList.add('reflect-x');\n }\n\n stickerPromise.then((player) => {\n player.addEventListener('destroy', () => {\n playing = false;\n });\n });\n });\n}\n\nexport async function onEmojiStickerClick({event, container, managers, peerId, middleware}: {\n event: Event,\n container: HTMLElement,\n managers: AppManagers,\n peerId: PeerId,\n middleware: Middleware\n}) {\n cancelEvent(event);\n\n const bubble = findUpClassName(container, 'bubble');\n const emoji = container.dataset.stickerEmoji;\n\n const animation = !container.classList.contains('custom-emoji') ? lottieLoader.getAnimation(container) : undefined;\n if(animation?.paused) {\n const doc = await managers.appStickersManager.getAnimatedEmojiSoundDocument(emoji);\n if(doc) {\n const audio = document.createElement('audio');\n audio.style.display = 'none';\n container.parentElement.append(audio);\n\n try {\n const url = await appDownloadManager.downloadMediaURL({media: doc});\n\n audio.src = url;\n audio.play();\n await onMediaLoad(audio, undefined, true);\n\n audio.addEventListener('ended', () => {\n audio.src = '';\n audio.remove();\n }, {once: true});\n } catch(err) {\n\n }\n }\n\n animation.autoplay = true;\n animation.restart();\n }\n\n if(!peerId.isUser()) {\n return;\n }\n\n const doc = await managers.appStickersManager.getAnimatedEmojiSticker(emoji, true);\n if(!doc) {\n return;\n }\n\n const data: SendMessageEmojiInteractionData = (container as any).emojiData ??= {\n a: [],\n v: 1\n };\n\n const sendInteractionThrottled: () => void = (container as any).sendInteractionThrottled = throttle(() => {\n const length = data.a.length;\n if(!length) {\n return;\n }\n\n const firstTime = data.a[0].t;\n\n data.a.forEach((a) => {\n a.t = (a.t - firstTime) / 1000;\n });\n\n const bubble = findUpClassName(container, 'bubble');\n managers.appMessagesManager.setTyping(appImManager.chat.peerId, {\n _: 'sendMessageEmojiInteraction',\n msg_id: getServerMessageId(+bubble.dataset.mid),\n emoticon: emoji,\n interaction: {\n _: 'dataJSON',\n data: JSON.stringify(data)\n }\n }, true, appImManager.chat.threadId);\n\n data.a.length = 0;\n }, 1000, false);\n\n const isOut = bubble ? bubble.classList.contains('is-out') : undefined;\n const {animationDiv} = wrapStickerAnimation({\n doc,\n middleware,\n side: isOut ? 'right' : 'left',\n size: 360,\n target: container,\n play: true,\n withRandomOffset: true\n });\n\n if(isOut !== undefined && !isOut) {\n animationDiv.classList.add('reflect-x');\n }\n\n // using a trick here: simulated event from interlocutor's interaction won't fire ours\n if(event.isTrusted) {\n data.a.push({\n i: 1,\n t: Date.now()\n });\n\n sendInteractionThrottled();\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/**\n * https://core.telegram.org/api/files#vector-thumbnails\n */\nexport default function getPathFromBytes(bytes: Uint8Array) {\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","// https://github.com/telegramdesktop/tdesktop/blob/543bfab24a76402992421063f1e6444f347d31fe/Telegram/SourceFiles/boxes/sticker_set_box.cpp#L75\nexport default function computeLockColor(canvas: HTMLCanvasElement) {\n const context = canvas.getContext('2d');\n const size = 20 * (canvas.dpr ?? 1);\n const width = size;\n const height = size;\n const skipx = (canvas.width - width) / 2;\n const margin = 0/* * (canvas.dpr ?? 1) */;\n const skipy = canvas.height - height - margin;\n const imageData = context.getImageData(skipx, skipy, width, height).data;\n let sr = 0, sg = 0, sb = 0, sa = 0;\n for(let i = 0; i < imageData.length; i += 4) {\n sr += imageData[i];\n sg += imageData[i + 1];\n sb += imageData[i + 2];\n sa += imageData[i + 3];\n }\n\n const outCanvas = document.createElement('canvas');\n outCanvas.width = size;\n outCanvas.height = size;\n const outContext = outCanvas.getContext('2d');\n const color = new Uint8ClampedArray([sr * 255 / sa, sg * 255 / sa, sb * 255 / sa, 255]);\n const rgba = `rgba(${color[0]}, ${color[1]}, ${color[2]}, ${color[3]})`;\n outContext.fillStyle = rgba;\n outContext.fillRect(0, 0, outCanvas.width, outCanvas.height);\n outContext.fillStyle = `rgba(112, 117, 121, 0.3)`;\n outContext.fillRect(0, 0, outCanvas.width, outCanvas.height);\n // document.querySelector('.popup-title').append(c);\n return outCanvas.toDataURL('image/jpeg');\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_VIBRATE_SUPPORTED from '../../environment/vibrateSupport';\nimport assumeType from '../../helpers/assumeType';\nimport isInDOM from '../../helpers/dom/isInDOM';\nimport makeError from '../../helpers/makeError';\nimport {getMiddleware, Middleware} from '../../helpers/middleware';\nimport throttleWithRaf from '../../helpers/schedulers/throttleWithRaf';\nimport windowSize from '../../helpers/windowSize';\nimport {PhotoSize, VideoSize} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport wrapSticker from './sticker';\n\nexport default function wrapStickerAnimation({\n size,\n doc,\n middleware,\n target,\n side,\n skipRatio,\n play,\n managers,\n fullThumb,\n withRandomOffset,\n relativeEffect,\n loopEffect\n}: {\n size: number,\n doc: MyDocument,\n middleware?: Middleware,\n target: HTMLElement,\n side: 'left' | 'center' | 'right',\n skipRatio?: number,\n play: boolean,\n managers?: AppManagers,\n fullThumb?: PhotoSize | VideoSize,\n withRandomOffset?: boolean,\n relativeEffect?: boolean,\n loopEffect?: boolean\n}) {\n const animationDiv = document.createElement('div');\n animationDiv.classList.add('emoji-animation');\n\n // const size = 280;\n animationDiv.style.width = size + 'px';\n animationDiv.style.height = size + 'px';\n\n let animation: RLottiePlayer;\n const unmountAnimation = () => {\n middlewareHelper.clean();\n animation?.remove();\n animationDiv.remove();\n appImManager.chat.bubbles.scrollable.container.removeEventListener('scroll', onScroll);\n };\n\n const middlewareHelper = middleware?.create() ?? getMiddleware();\n middleware = middlewareHelper.get();\n\n const stickerPromise = wrapSticker({\n div: animationDiv,\n doc,\n middleware,\n withThumb: false,\n needFadeIn: false,\n loop: !!loopEffect,\n width: size,\n height: size,\n play,\n group: 'none',\n skipRatio,\n managers,\n fullThumb\n }).then(({render}) => render).then((_animation) => {\n assumeType(_animation);\n if(!middleware()) {\n _animation.remove();\n throw makeError('MIDDLEWARE');\n }\n\n animation = _animation;\n animation.addEventListener('enterFrame', (frameNo) => {\n if((!loopEffect && frameNo === animation.maxFrame) || !isInDOM(target)) {\n unmountAnimation();\n }\n });\n\n if(IS_VIBRATE_SUPPORTED) {\n animation.addEventListener('firstFrame', () => {\n navigator.vibrate(100);\n }, {once: true});\n }\n\n return animation;\n });\n\n const generateRandomSigned = (max: number) => {\n const r = Math.random() * max * 2;\n return r > max ? -r % max : r;\n };\n\n const randomOffsetX = withRandomOffset ? generateRandomSigned(16) : 0;\n const randomOffsetY = withRandomOffset ? generateRandomSigned(4) : 0;\n const setPosition = () => {\n if(!isInDOM(target)) {\n unmountAnimation();\n return;\n }\n\n const rect = target.getBoundingClientRect();\n\n const factor = rect.width / 200;\n const stableOffsetX = side === 'center' ? 0 : 16 * (side === 'right' ? 1 : -1) * factor;\n // const stableOffsetY = side === 'center' ? 0 : -50 * factor;\n const stableOffsetY = side === 'center' ? 0 : 0 * factor;\n\n const rectX = side === 'right' ? rect.right : rect.left;\n const rectY = rect.top;\n\n const addOffsetX = (side === 'center' ? (rect.width - size) / 2 : (side === 'right' ? -size : 0)) + stableOffsetX + randomOffsetX;\n const addOffsetY = (side === 'center' || true ? (rect.height - size) / 2 : 0) + stableOffsetY + randomOffsetY;\n const x = rectX + addOffsetX;\n const y = rectY + addOffsetY;\n\n if(y <= -size || y >= windowSize.height) {\n unmountAnimation();\n return;\n }\n\n if(relativeEffect) {\n if(side !== 'center') animationDiv.style[side] = Math.abs(stableOffsetX) * -1 + 'px';\n else animationDiv.style.left = addOffsetX + 'px';\n animationDiv.style.top = addOffsetY + 'px';\n } else {\n animationDiv.style.top = y + 'px';\n animationDiv.style.left = x + 'px';\n }\n };\n\n const onScroll = throttleWithRaf(setPosition);\n appImManager.chat.bubbles.scrollable.container.addEventListener('scroll', onScroll);\n\n setPosition();\n\n if(relativeEffect) {\n animationDiv.classList.add('is-relative');\n target.parentElement.append(animationDiv);\n } else {\n appImManager.emojiAnimationContainer.append(animationDiv);\n }\n\n return {animationDiv, stickerPromise};\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';\nimport wrapSticker from './sticker'\nimport {Modify} from '../../types';\n\nexport default async function wrapStickerEmoji(options: Modify[0], {\n div: HTMLElement,\n doc?: never,\n loop?: never\n}>) {\n const {\n emoji,\n div,\n managers = rootScope.managers\n } = options;\n const doc = await managers.appStickersManager.getAnimatedEmojiSticker(emoji);\n if(!doc) {\n div.classList.add('media-sticker-wrapper');\n throw new Error('no sticker');\n }\n\n return wrapSticker({\n doc,\n play: true,\n loop: false,\n ...options\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 createVideo from '../../helpers/dom/createVideo';\nimport renderImageFromUrl from '../../helpers/dom/renderImageFromUrl';\nimport {Document, StickerSet} from '../../layer';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport lottieLoader from '../../lib/rlottie/lottieLoader';\nimport rootScope from '../../lib/rootScope';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport wrapSticker from './sticker';\nimport {Middleware} from '../../helpers/middleware';\n\nexport default async function wrapStickerSetThumb({set, lazyLoadQueue, container, group, autoplay, width, height, managers = rootScope.managers, middleware}: {\n set: StickerSet.stickerSet,\n lazyLoadQueue: LazyLoadQueue,\n container: HTMLElement,\n group: AnimationItemGroup,\n autoplay: boolean,\n width: number,\n height: number,\n managers?: AppManagers\n middleware?: Middleware\n}) {\n if(set.thumbs?.length) {\n container.classList.add('media-sticker-wrapper');\n lazyLoadQueue.push({\n div: container,\n load: async() => {\n const downloadOptions = await managers.appStickersManager.getStickerSetThumbDownloadOptions(set);\n const promise = appDownloadManager.download(downloadOptions);\n\n if(set.pFlags.animated && !set.pFlags.videos) {\n return promise\n .then((blob) => {\n lottieLoader.loadAnimationWorker({\n container,\n loop: true,\n autoplay,\n animationData: blob,\n width,\n height,\n needUpscale: true,\n name: 'setThumb' + set.id,\n group,\n middleware\n });\n });\n } else {\n let media: HTMLElement;\n if(set.pFlags.videos) {\n media = createVideo();\n (media as HTMLVideoElement).autoplay = true;\n (media as HTMLVideoElement).muted = true;\n (media as HTMLVideoElement).loop = true;\n } else {\n media = new Image();\n }\n\n media.classList.add('media-sticker');\n\n return promise.then((blob) => {\n renderImageFromUrl(media, URL.createObjectURL(blob), () => {\n container.append(media);\n\n if(set.pFlags.videos) {\n animationIntersector.addAnimation(media as HTMLVideoElement, group);\n }\n });\n });\n }\n }\n });\n\n return;\n }\n\n let getDocPromise: Promise;\n\n if(set.thumb_document_id) {\n getDocPromise = managers.appEmojiManager.getCustomEmojiDocument(set.thumb_document_id);\n } else {\n getDocPromise = managers.appStickersManager.getStickerSet(set).then((stickerSet) => stickerSet.documents[0]);\n }\n\n const doc = await getDocPromise;\n if(doc._ !== 'documentEmpty') { // as thumb will be used first sticker\n wrapSticker({\n doc,\n div: container,\n group: group,\n lazyLoadQueue,\n managers,\n width,\n height,\n middleware\n }); // kostil\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 {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport Row from '../row';\nimport wrapSticker from './sticker';\n\nexport default function wrapStickerToRow({doc, row, size, managers}: {\n doc: MyDocument,\n row: Row,\n size?: 'small' | 'large',\n managers?: AppManagers\n}) {\n const previousMedia = row.media;\n const media = row.createMedia('small');\n\n if(previousMedia) {\n media.classList.add('hide');\n }\n\n const loadPromises: Promise[] = previousMedia ? [] : undefined;\n\n const _size = size === 'small' ? 32 : 48;\n const result = wrapSticker({\n div: media,\n doc: doc,\n width: _size,\n height: _size,\n loadPromises,\n managers\n }).then(({render}) => render);\n\n loadPromises && Promise.all(loadPromises).then(() => {\n media.classList.remove('hide');\n previousMedia.remove();\n });\n\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\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\nimport {i18n} from '../../lib/langPack';\nimport wrapTelegramUrlToAnchor from '../../lib/richTextProcessor/wrapTelegramUrlToAnchor';\nimport rootScope from '../../lib/rootScope';\nimport wrapPeerTitle from './peerTitle';\n\nexport default async function wrapTopicNameButton(\n options: {\n lastMsgId?: number\n } & Pick[0], 'peerId' | 'threadId' | 'wrapOptions' | 'withIcons'>\n) {\n const {peerId, threadId, lastMsgId} = options;\n\n const loadPromise: Promise = Promise.resolve();\n const a = wrapTelegramUrlToAnchor('t.me/c/' + peerId.toChatId() + (threadId ? '/' + getServerMessageId(threadId) : '') + (lastMsgId ? '/' + getServerMessageId(lastMsgId) : ''));\n a.classList.add('topic-name', 'topic-name-button');\n // if(threadId) {\n // const topic = await rootScope.managers.dialogsStorage.getForumTopic(peerId, threadId);\n // if(!topic) {\n // a.append(i18n('Loading'));\n // loadPromise = rootScope.managers.dialogsStorage.getForumTopicById(peerId, threadId)\n // }\n // } else {\n a.append(await wrapPeerTitle(options));\n // }\n\n return {\n cached: true,\n element: a,\n loadPromise\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 {animateSingle} from '../../helpers/animation';\nimport {ChatAutoDownloadSettings} from '../../helpers/autoDownload';\nimport deferredPromise from '../../helpers/cancellablePromise';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport createVideo from '../../helpers/dom/createVideo';\nimport isInDOM from '../../helpers/dom/isInDOM';\nimport renderImageFromUrl from '../../helpers/dom/renderImageFromUrl';\nimport getStrippedThumbIfNeeded from '../../helpers/getStrippedThumbIfNeeded';\nimport makeError from '../../helpers/makeError';\nimport mediaSizes, {ScreenSize} from '../../helpers/mediaSizes';\nimport {Middleware} from '../../helpers/middleware';\nimport noop from '../../helpers/noop';\nimport onMediaLoad from '../../helpers/onMediaLoad';\nimport {fastRaf} from '../../helpers/schedulers';\nimport throttle from '../../helpers/schedulers/throttle';\nimport sequentialDom from '../../helpers/sequentialDom';\nimport toHHMMSS from '../../helpers/string/toHHMMSS';\nimport {Message, PhotoSize, VideoSize} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {NULL_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport rootScope from '../../lib/rootScope';\nimport {ThumbCache} from '../../lib/storages/thumbs';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport appMediaPlaybackController, {MediaSearchContext} from '../appMediaPlaybackController';\nimport {findMediaTargets} from '../audio';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport ProgressivePreloader from '../preloader';\nimport wrapPhoto from './photo';\n\nconst MAX_VIDEO_AUTOPLAY_SIZE = 50 * 1024 * 1024; // 50 MB\n\nlet roundVideoCircumference = 0;\nmediaSizes.addEventListener('changeScreen', (from, to) => {\n if(to === ScreenSize.mobile || from === ScreenSize.mobile) {\n const elements = Array.from(document.querySelectorAll('.media-round .progress-ring')) as SVGSVGElement[];\n const width = mediaSizes.active.round.width;\n const halfSize = width / 2;\n const radius = halfSize - 7;\n roundVideoCircumference = 2 * Math.PI * radius;\n elements.forEach((element) => {\n element.setAttributeNS(null, 'width', '' + width);\n element.setAttributeNS(null, 'height', '' + width);\n\n const circle = element.firstElementChild as SVGCircleElement;\n circle.setAttributeNS(null, 'cx', '' + halfSize);\n circle.setAttributeNS(null, 'cy', '' + halfSize);\n circle.setAttributeNS(null, 'r', '' + radius);\n\n circle.style.strokeDasharray = roundVideoCircumference + ' ' + roundVideoCircumference;\n circle.style.strokeDashoffset = '' + roundVideoCircumference;\n });\n }\n});\n\nexport default async function wrapVideo({doc, container, message, boxWidth, boxHeight, withTail, isOut, middleware, lazyLoadQueue, noInfo, group, onlyPreview, noPreview, withoutPreloader, loadPromises, noPlayButton, photoSize, videoSize, searchContext, autoDownload, managers = rootScope.managers, noAutoplayAttribute}: {\n doc: MyDocument,\n container?: HTMLElement,\n message?: Message.message,\n boxWidth?: number,\n boxHeight?: number,\n withTail?: boolean,\n isOut?: boolean,\n middleware?: Middleware,\n lazyLoadQueue?: LazyLoadQueue,\n noInfo?: boolean,\n noPlayButton?: boolean,\n group?: AnimationItemGroup,\n onlyPreview?: boolean,\n noPreview?: boolean,\n withoutPreloader?: boolean,\n loadPromises?: Promise[],\n autoDownload?: ChatAutoDownloadSettings,\n photoSize?: PhotoSize,\n videoSize?: VideoSize,\n searchContext?: MediaSearchContext,\n managers?: AppManagers,\n noAutoplayAttribute?: boolean\n}) {\n const autoDownloadSize = autoDownload?.video;\n let noAutoDownload = autoDownloadSize === 0;\n const isAlbumItem = !(boxWidth && boxHeight);\n const canAutoplay = /* doc.sticker || */(\n (\n doc.type !== 'video' || (\n doc.size <= MAX_VIDEO_AUTOPLAY_SIZE &&\n !isAlbumItem\n )\n ) && (doc.type === 'gif' ? rootScope.settings.autoPlay.gifs : rootScope.settings.autoPlay.videos)\n );\n let spanTime: HTMLElement, spanPlay: HTMLElement;\n\n if(!noInfo) {\n spanTime = document.createElement('span');\n spanTime.classList.add('video-time');\n container.append(spanTime);\n\n let needPlayButton = false;\n if(doc.type !== 'gif') {\n spanTime.innerText = toHHMMSS(doc.duration, false);\n\n if(!noPlayButton && doc.type !== 'round') {\n if(canAutoplay && !noAutoDownload) {\n spanTime.classList.add('tgico', 'can-autoplay');\n } else {\n needPlayButton = true;\n }\n }\n } else {\n spanTime.innerText = 'GIF';\n\n if(!canAutoplay && !noPlayButton) {\n needPlayButton = true;\n noAutoDownload = undefined;\n }\n }\n\n if(needPlayButton) {\n spanPlay = document.createElement('span');\n spanPlay.classList.add('video-play', 'tgico-largeplay', 'btn-circle', 'position-center');\n container.append(spanPlay);\n }\n }\n\n const res: {\n thumb?: typeof photoRes,\n loadPromise: Promise\n } = {} as any;\n\n if(doc.mime_type === 'image/gif') {\n const photoRes = await wrapPhoto({\n photo: doc,\n message,\n container,\n boxWidth,\n boxHeight,\n withTail,\n isOut,\n lazyLoadQueue,\n middleware,\n withoutPreloader,\n loadPromises,\n autoDownloadSize,\n size: photoSize,\n managers\n });\n\n res.thumb = photoRes;\n res.loadPromise = photoRes.loadPromises.full;\n return res;\n }\n\n /* const video = doc.type === 'round' ? appMediaPlaybackController.addMedia(doc, message.mid) as HTMLVideoElement : document.createElement('video');\n if(video.parentElement) {\n video.remove();\n } */\n\n let preloader: ProgressivePreloader; // it must be here, otherwise will get error before initialization in round onPlay\n\n const video = createVideo();\n video.classList.add('media-video');\n video.muted = true;\n if(doc.type === 'round') {\n const divRound = document.createElement('div');\n divRound.classList.add('media-round', 'z-depth-1');\n divRound.dataset.mid = '' + message.mid;\n divRound.dataset.peerId = '' + message.peerId;\n (divRound as any).message = message;\n\n const size = mediaSizes.active.round;\n const halfSize = size.width / 2;\n const strokeWidth = 3.5;\n const radius = halfSize - (strokeWidth * 2);\n divRound.innerHTML = `\n \n `;\n\n const circle = divRound.firstElementChild.firstElementChild as SVGCircleElement;\n if(!roundVideoCircumference) {\n roundVideoCircumference = 2 * Math.PI * radius;\n }\n circle.style.strokeDasharray = roundVideoCircumference + ' ' + roundVideoCircumference;\n circle.style.strokeDashoffset = '' + roundVideoCircumference;\n\n spanTime.classList.add('tgico');\n\n const isUnread = message.pFlags.media_unread;\n if(isUnread) {\n divRound.classList.add('is-unread');\n }\n\n const canvas = document.createElement('canvas');\n canvas.width = canvas.height = doc.w/* * window.devicePixelRatio */;\n\n divRound.prepend(canvas, spanTime);\n divRound.append(video);\n container.append(divRound);\n\n const ctx = canvas.getContext('2d');\n /* ctx.beginPath();\n ctx.arc(canvas.width / 2, canvas.height / 2, canvas.width / 2, 0, Math.PI * 2);\n ctx.clip(); */\n\n const onLoad = () => {\n const message: Message.message = (divRound as any).message;\n const globalVideo = appMediaPlaybackController.addMedia(message, !noAutoDownload) as HTMLVideoElement;\n const clear = () => {\n (appImManager.chat.setPeerPromise || Promise.resolve()).finally(() => {\n if(isInDOM(globalVideo)) {\n return;\n }\n\n globalVideo.removeEventListener('play', onPlay);\n globalVideo.removeEventListener('timeupdate', throttledTimeUpdate);\n globalVideo.removeEventListener('pause', onPaused);\n globalVideo.removeEventListener('ended', onEnded);\n });\n };\n\n const onFrame = () => {\n ctx.drawImage(globalVideo, 0, 0);\n\n const offset = roundVideoCircumference - globalVideo.currentTime / globalVideo.duration * roundVideoCircumference;\n circle.style.strokeDashoffset = '' + offset;\n\n return !globalVideo.paused;\n };\n\n const onTimeUpdate = () => {\n if(!globalVideo.duration) {\n return;\n }\n\n if(!isInDOM(globalVideo)) {\n clear();\n return;\n }\n\n if(globalVideo.paused) {\n onFrame();\n }\n\n spanTime.innerText = toHHMMSS(globalVideo.duration - globalVideo.currentTime, false);\n };\n\n const throttledTimeUpdate = throttle(() => {\n fastRaf(onTimeUpdate);\n }, 1000, false);\n\n const onPlay = () => {\n video.classList.add('hide');\n divRound.classList.remove('is-paused');\n animateSingle(onFrame, canvas);\n\n if(preloader && preloader.preloader && preloader.preloader.classList.contains('manual')) {\n preloader.onClick();\n }\n };\n\n const onPaused = () => {\n if(!isInDOM(globalVideo)) {\n clear();\n return;\n }\n\n divRound.classList.add('is-paused');\n };\n\n const onEnded = () => {\n video.classList.remove('hide');\n divRound.classList.add('is-paused');\n\n video.currentTime = 0;\n spanTime.innerText = toHHMMSS(globalVideo.duration, false);\n\n if(globalVideo.currentTime) {\n globalVideo.currentTime = 0;\n }\n };\n\n globalVideo.addEventListener('play', onPlay);\n globalVideo.addEventListener('timeupdate', throttledTimeUpdate);\n globalVideo.addEventListener('pause', onPaused);\n globalVideo.addEventListener('ended', onEnded);\n\n attachClickEvent(canvas, (e) => {\n cancelEvent(e);\n\n // ! ะบะพัั‚ั‹ะปัŒ\n if(preloader && !preloader.detached) {\n preloader.onClick();\n }\n\n // ! can't use it here. on Safari iOS video won't start.\n /* if(globalVideo.readyState < 2) {\n return;\n } */\n\n if(globalVideo.paused) {\n const hadSearchContext = !!searchContext;\n if(appMediaPlaybackController.setSearchContext(searchContext || {\n peerId: NULL_PEER_ID,\n inputFilter: {_: 'inputMessagesFilterEmpty'},\n useSearch: false\n })) {\n const [prev, next] = !hadSearchContext ? [] : findMediaTargets(divRound, message.mid/* , searchContext.useSearch */);\n appMediaPlaybackController.setTargets({peerId: message.peerId, mid: message.mid}, prev, next);\n }\n\n globalVideo.play();\n } else {\n globalVideo.pause();\n }\n });\n\n if(globalVideo.paused) {\n if(globalVideo.duration && globalVideo.currentTime !== globalVideo.duration && globalVideo.currentTime > 0) {\n onFrame();\n onTimeUpdate();\n video.classList.add('hide');\n } else {\n onPaused();\n }\n } else {\n onPlay();\n }\n };\n\n if(message.pFlags.is_outgoing) {\n (divRound as any).onLoad = onLoad;\n divRound.dataset.isOutgoing = '1';\n } else {\n onLoad();\n }\n } else if(!noAutoplayAttribute) {\n video.autoplay = true; // ะดะปั safari\n }\n\n let photoRes: Awaited>;\n if(message) {\n photoRes = await wrapPhoto({\n photo: doc,\n message,\n container,\n boxWidth,\n boxHeight,\n withTail,\n isOut,\n lazyLoadQueue,\n middleware,\n withoutPreloader: true,\n loadPromises,\n autoDownloadSize: autoDownload?.photo,\n size: photoSize,\n managers\n });\n\n res.thumb = photoRes;\n\n if((!canAutoplay && doc.type !== 'gif') || onlyPreview) {\n res.loadPromise = photoRes.loadPromises.full;\n return res;\n }\n\n if(withTail) {\n const foreignObject = (photoRes.images.thumb || photoRes.images.full).parentElement;\n video.width = +foreignObject.getAttributeNS(null, 'width');\n video.height = +foreignObject.getAttributeNS(null, 'height');\n foreignObject.append(video);\n }\n } else if(!noPreview) { // * gifs masonry\n const gotThumb = getStrippedThumbIfNeeded(doc, {} as ThumbCache, true);\n if(gotThumb) {\n const thumbImage = gotThumb.image;\n thumbImage.classList.add('media-poster');\n container.append(thumbImage);\n res.thumb = {\n loadPromises: {\n thumb: gotThumb.loadPromise,\n full: Promise.resolve()\n },\n images: {\n thumb: thumbImage,\n full: null\n },\n preloader: null,\n aspecter: null\n };\n\n loadPromises?.push(gotThumb.loadPromise);\n res.loadPromise = gotThumb.loadPromise;\n }\n }\n\n if(onlyPreview) {\n return res;\n }\n\n if(!video.parentElement && container) {\n (photoRes?.aspecter || container).append(video);\n }\n\n let cacheContext: ThumbCache;\n const getCacheContext = async() => {\n return cacheContext = await managers.thumbsStorage.getCacheContext(doc, videoSize?.type);\n };\n\n await getCacheContext();\n\n const uploadFileName = message?.uploadingFileName;\n if(uploadFileName) { // means upload\n preloader = new ProgressivePreloader({\n attachMethod: 'prepend',\n isUpload: true\n });\n preloader.attachPromise(appDownloadManager.getUpload(uploadFileName));\n preloader.attach(container, false);\n noAutoDownload = undefined;\n } else if(!cacheContext.downloaded && !doc.supportsStreaming && !withoutPreloader) {\n preloader = new ProgressivePreloader({\n attachMethod: 'prepend'\n });\n } else if(doc.supportsStreaming) {\n preloader = new ProgressivePreloader({\n cancelable: false,\n attachMethod: 'prepend'\n });\n }\n\n const renderDeferred = deferredPromise();\n video.addEventListener('error', (e) => {\n if(video.error.code !== 4) {\n console.error('Error ' + video.error.code + '; details: ' + video.error.message);\n }\n\n if(preloader && !uploadFileName) {\n preloader.detach();\n }\n\n if(!renderDeferred.isFulfilled) {\n renderDeferred.resolve();\n }\n }, {once: true});\n\n if(doc.type === 'video') {\n const onTimeUpdate = () => {\n if(!video.duration) {\n return;\n }\n\n spanTime.innerText = toHHMMSS(video.duration - video.currentTime, false);\n };\n\n const throttledTimeUpdate = throttle(() => {\n fastRaf(onTimeUpdate);\n }, 1e3, false);\n\n video.addEventListener('timeupdate', throttledTimeUpdate);\n\n if(spanPlay) {\n video.addEventListener('timeupdate', () => {\n sequentialDom.mutateElement(spanPlay, () => {\n spanPlay.remove();\n });\n }, {once: true});\n }\n }\n\n video.muted = true;\n video.loop = true;\n // video.play();\n if(!noAutoplayAttribute) {\n video.autoplay = true;\n }\n\n let loadPhotoThumbFunc = noAutoDownload && photoRes?.preloader?.loadFunc;\n const load = async() => {\n if(preloader && noAutoDownload && !withoutPreloader) {\n preloader.construct();\n preloader.setManual();\n }\n\n await getCacheContext();\n let loadPromise: Promise = Promise.resolve();\n if((preloader && !uploadFileName) || withoutPreloader) {\n if(!cacheContext.downloaded && !doc.supportsStreaming) {\n const promise = loadPromise = appDownloadManager.downloadMediaURL({\n media: doc,\n queueId: lazyLoadQueue?.queueId,\n onlyCache: noAutoDownload,\n thumb: videoSize\n });\n\n if(preloader) {\n preloader.attach(container, false, promise);\n }\n } else if(doc.supportsStreaming) {\n if(noAutoDownload) {\n loadPromise = Promise.reject(makeError('NO_AUTO_DOWNLOAD'));\n } else if(!cacheContext.downloaded && preloader) { // * check for uploading video\n preloader.attach(container, false, null);\n video.addEventListener(IS_SAFARI ? 'timeupdate' : 'canplay', () => {\n preloader.detach();\n }, {once: true});\n }\n }\n }\n\n if(!noAutoDownload && loadPhotoThumbFunc) {\n loadPhotoThumbFunc();\n loadPhotoThumbFunc = null;\n }\n\n noAutoDownload = undefined;\n\n loadPromise.then(async() => {\n if(middleware && !middleware()) {\n renderDeferred.resolve();\n return;\n }\n\n if(doc.type === 'round') {\n appMediaPlaybackController.resolveWaitingForLoadMedia(message.peerId, message.mid, message.pFlags.is_scheduled);\n }\n\n await getCacheContext();\n\n onMediaLoad(video).then(() => {\n if(group) {\n animationIntersector.addAnimation(video, group);\n }\n\n if(preloader && !uploadFileName) {\n preloader.detach();\n }\n\n renderDeferred.resolve();\n }, (err) => {\n console.error('video load error', err);\n if(spanTime) {\n spanTime.classList.add('is-error');\n }\n renderDeferred.reject(err);\n });\n\n renderImageFromUrl(video, cacheContext.url);\n }, noop);\n\n return {download: loadPromise, render: Promise.all([loadPromise, renderDeferred])};\n };\n\n if(preloader && !uploadFileName) {\n preloader.setDownloadFunction(load);\n }\n\n /* if(doc.size >= 20e6 && !doc.downloaded) {\n let downloadDiv = document.createElement('div');\n downloadDiv.classList.add('download');\n\n let span = document.createElement('span');\n span.classList.add('btn-circle', 'tgico-download');\n downloadDiv.append(span);\n\n downloadDiv.addEventListener('click', () => {\n downloadDiv.remove();\n loadVideo();\n });\n\n container.prepend(downloadDiv);\n\n return;\n } */\n\n if(doc.type === 'gif' && !canAutoplay) {\n attachClickEvent(container, (e) => {\n cancelEvent(e);\n spanPlay.remove();\n load();\n }, {capture: true, once: true});\n } else {\n res.loadPromise = !lazyLoadQueue ?\n (await load()).render :\n (lazyLoadQueue.push({div: container, load: () => load().then(({render}) => render)}), Promise.resolve());\n }\n\n if(res.thumb) {\n await res.thumb.loadPromises.thumb;\n }\n\n return res;\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 limitSymbols from '../../helpers/string/limitSymbols';\nimport {WebPage} from '../../layer';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\n\nexport default function wrapWebPageDescription(webPage: WebPage.webPage) {\n const shortDescriptionText = limitSymbols(webPage.description || '', 150, 180);\n // const siteName = webPage.site_name;\n // let contextHashtag = '';\n // if(siteName === 'GitHub') {\n // const matches = apiWebPage.url.match(/(https?:\\/\\/github\\.com\\/[^\\/]+\\/[^\\/]+)/);\n // if(matches) {\n // contextHashtag = matches[0] + '/issues/{1}';\n // }\n // }\n return wrapRichText(shortDescriptionText/* , {\n contextSite: siteName || 'external',\n contextHashtag: contextHashtag\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 limitSymbols from '../../helpers/string/limitSymbols';\nimport {WebPage} from '../../layer';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\n\nexport default function wrapWebPageTitle(webPage: WebPage.webPage) {\n let shortTitle = webPage.title || webPage.author || webPage.site_name || '';\n shortTitle = limitSymbols(shortTitle, 80, 100);\n return wrapRichText(shortTitle, {noLinks: true, noLinebreaks: true});\n}\n","// Taken from https://core.telegram.org/bots/payments/currencies.json\nexport type Currency = {\n code: string,\n title: string,\n symbol: string,\n native: string,\n thousands_sep: string,\n decimal_sep: string,\n symbol_left: boolean,\n space_between: boolean,\n exp: number,\n min_amount: string | number,\n max_amount: string | number\n};\n\n// eslint-disable-next-line quotes, comma-spacing\nconst Currencies: {[currency: string]: Currency} = {\"AED\":{\"code\":\"AED\",\"title\":\"United Arab Emirates Dirham\",\"symbol\":\"AED\",\"native\":\"ุฏ.ุฅ.โ€\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"367\",\"max_amount\":\"3673030\"},\"AFN\":{\"code\":\"AFN\",\"title\":\"Afghan Afghani\",\"symbol\":\"AFN\",\"native\":\"ุ‹\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"8729\",\"max_amount\":\"87299487\"},\"ALL\":{\"code\":\"ALL\",\"title\":\"Albanian Lek\",\"symbol\":\"ALL\",\"native\":\"Lek\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":false,\"exp\":2,\"min_amount\":\"11842\",\"max_amount\":\"118421187\"},\"AMD\":{\"code\":\"AMD\",\"title\":\"Armenian Dram\",\"symbol\":\"AMD\",\"native\":\"ีคึ€.\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"40943\",\"max_amount\":\"409436718\"},\"ARS\":{\"code\":\"ARS\",\"title\":\"Argentine Peso\",\"symbol\":\"ARS\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"14705\",\"max_amount\":\"147059002\"},\"AUD\":{\"code\":\"AUD\",\"title\":\"Australian Dollar\",\"symbol\":\"AU$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"153\",\"max_amount\":\"1536825\"},\"AZN\":{\"code\":\"AZN\",\"title\":\"Azerbaijani Manat\",\"symbol\":\"AZN\",\"native\":\"ะผะฐะฝ.\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"169\",\"max_amount\":\"1699858\"},\"BAM\":{\"code\":\"BAM\",\"title\":\"Bosnia & Herzegovina Convertible Mark\",\"symbol\":\"BAM\",\"native\":\"KM\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"199\",\"max_amount\":\"1990677\"},\"BDT\":{\"code\":\"BDT\",\"title\":\"Bangladeshi Taka\",\"symbol\":\"BDT\",\"native\":\"เงณ\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"10009\",\"max_amount\":\"100094046\"},\"BGN\":{\"code\":\"BGN\",\"title\":\"Bulgarian Lev\",\"symbol\":\"BGN\",\"native\":\"ะปะฒ.\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"199\",\"max_amount\":\"1993315\"},\"BND\":{\"code\":\"BND\",\"title\":\"Brunei Dollar\",\"symbol\":\"BND\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"142\",\"max_amount\":\"1421883\"},\"BOB\":{\"code\":\"BOB\",\"title\":\"Bolivian Boliviano\",\"symbol\":\"BOB\",\"native\":\"Bs\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"683\",\"max_amount\":\"6832607\"},\"BRL\":{\"code\":\"BRL\",\"title\":\"Brazilian Real\",\"symbol\":\"R$\",\"native\":\"R$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"539\",\"max_amount\":\"5397799\"},\"BYN\":{\"code\":\"BYN\",\"title\":\"Belarusian ruble\",\"symbol\":\"BYN\",\"native\":\"BYN\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"249\",\"max_amount\":\"2495801\"},\"CAD\":{\"code\":\"CAD\",\"title\":\"Canadian Dollar\",\"symbol\":\"CA$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"136\",\"max_amount\":\"1366860\"},\"CHF\":{\"code\":\"CHF\",\"title\":\"Swiss Franc\",\"symbol\":\"CHF\",\"native\":\"CHF\",\"thousands_sep\":\"'\",\"decimal_sep\":\".\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"97\",\"max_amount\":\"976705\"},\"CLP\":{\"code\":\"CLP\",\"title\":\"Chilean Peso\",\"symbol\":\"CLP\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":0,\"min_amount\":\"963\",\"max_amount\":\"9637495\"},\"CNY\":{\"code\":\"CNY\",\"title\":\"Chinese Renminbi Yuan\",\"symbol\":\"CNยฅ\",\"native\":\"CNยฅ\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"709\",\"max_amount\":\"7094102\"},\"COP\":{\"code\":\"COP\",\"title\":\"Colombian Peso\",\"symbol\":\"COP\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"452870\",\"max_amount\":\"4528700000\"},\"CRC\":{\"code\":\"CRC\",\"title\":\"Costa Rican Colรณn\",\"symbol\":\"CRC\",\"native\":\"โ‚ก\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"62506\",\"max_amount\":\"625061070\"},\"CZK\":{\"code\":\"CZK\",\"title\":\"Czech Koruna\",\"symbol\":\"CZK\",\"native\":\"Kฤ\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"2497\",\"max_amount\":\"24975029\"},\"DKK\":{\"code\":\"DKK\",\"title\":\"Danish Krone\",\"symbol\":\"DKK\",\"native\":\"kr\",\"thousands_sep\":\"\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"755\",\"max_amount\":\"7555990\"},\"DOP\":{\"code\":\"DOP\",\"title\":\"Dominican Peso\",\"symbol\":\"DOP\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"5275\",\"max_amount\":\"52757308\"},\"DZD\":{\"code\":\"DZD\",\"title\":\"Algerian Dinar\",\"symbol\":\"DZD\",\"native\":\"ุฏ.ุฌ.โ€\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"14035\",\"max_amount\":\"140353307\"},\"EGP\":{\"code\":\"EGP\",\"title\":\"Egyptian Pound\",\"symbol\":\"EGP\",\"native\":\"ุฌ.ู….โ€\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"1953\",\"max_amount\":\"19537405\"},\"ETB\":{\"code\":\"ETB\",\"title\":\"Ethiopian Birr\",\"symbol\":\"ETB\",\"native\":\"แ‰ฅแˆญ\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"5224\",\"max_amount\":\"52247069\"},\"EUR\":{\"code\":\"EUR\",\"title\":\"Euro\",\"symbol\":\"โ‚ฌ\",\"native\":\"โ‚ฌ\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"101\",\"max_amount\":\"1016045\"},\"GBP\":{\"code\":\"GBP\",\"title\":\"British Pound\",\"symbol\":\"ยฃ\",\"native\":\"ยฃ\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"89\",\"max_amount\":\"894445\"},\"GEL\":{\"code\":\"GEL\",\"title\":\"Georgian Lari\",\"symbol\":\"GEL\",\"native\":\"GEL\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"283\",\"max_amount\":\"2830234\"},\"GTQ\":{\"code\":\"GTQ\",\"title\":\"Guatemalan Quetzal\",\"symbol\":\"GTQ\",\"native\":\"Q\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"778\",\"max_amount\":\"7781323\"},\"HKD\":{\"code\":\"HKD\",\"title\":\"Hong Kong Dollar\",\"symbol\":\"HK$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"784\",\"max_amount\":\"7849750\"},\"HNL\":{\"code\":\"HNL\",\"title\":\"Honduran Lempira\",\"symbol\":\"HNL\",\"native\":\"L\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"2441\",\"max_amount\":\"24413729\"},\"HRK\":{\"code\":\"HRK\",\"title\":\"Croatian Kuna\",\"symbol\":\"HRK\",\"native\":\"kn\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"764\",\"max_amount\":\"7648805\"},\"HUF\":{\"code\":\"HUF\",\"title\":\"Hungarian Forint\",\"symbol\":\"HUF\",\"native\":\"Ft\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"42685\",\"max_amount\":\"426850229\"},\"IDR\":{\"code\":\"IDR\",\"title\":\"Indonesian Rupiah\",\"symbol\":\"IDR\",\"native\":\"Rp\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"1523370\",\"max_amount\":\"15233700000\"},\"ILS\":{\"code\":\"ILS\",\"title\":\"Israeli New Sheqel\",\"symbol\":\"โ‚ช\",\"native\":\"โ‚ช\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"354\",\"max_amount\":\"3543350\"},\"INR\":{\"code\":\"INR\",\"title\":\"Indian Rupee\",\"symbol\":\"โ‚น\",\"native\":\"โ‚น\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"8155\",\"max_amount\":\"81555550\"},\"ISK\":{\"code\":\"ISK\",\"title\":\"Icelandic Krรณna\",\"symbol\":\"ISK\",\"native\":\"kr\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":0,\"min_amount\":\"142\",\"max_amount\":\"1425603\"},\"JMD\":{\"code\":\"JMD\",\"title\":\"Jamaican Dollar\",\"symbol\":\"JMD\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"15013\",\"max_amount\":\"150131044\"},\"JPY\":{\"code\":\"JPY\",\"title\":\"Japanese Yen\",\"symbol\":\"ยฅ\",\"native\":\"๏ฟฅ\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":0,\"min_amount\":\"144\",\"max_amount\":\"1443065\"},\"KES\":{\"code\":\"KES\",\"title\":\"Kenyan Shilling\",\"symbol\":\"KES\",\"native\":\"Ksh\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"12075\",\"max_amount\":\"120750271\"},\"KGS\":{\"code\":\"KGS\",\"title\":\"Kyrgyzstani Som\",\"symbol\":\"KGS\",\"native\":\"KGS\",\"thousands_sep\":\" \",\"decimal_sep\":\"-\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"8018\",\"max_amount\":\"80182898\"},\"KRW\":{\"code\":\"KRW\",\"title\":\"South Korean Won\",\"symbol\":\"โ‚ฉ\",\"native\":\"โ‚ฉ\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":0,\"min_amount\":\"1431\",\"max_amount\":\"14315201\"},\"KZT\":{\"code\":\"KZT\",\"title\":\"Kazakhstani Tenge\",\"symbol\":\"KZT\",\"native\":\"โ‚ธ\",\"thousands_sep\":\" \",\"decimal_sep\":\"-\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"47186\",\"max_amount\":\"471867112\"},\"LBP\":{\"code\":\"LBP\",\"title\":\"Lebanese Pound\",\"symbol\":\"LBP\",\"native\":\"ู„.ู„.โ€\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"150999\",\"max_amount\":\"1509998778\"},\"LKR\":{\"code\":\"LKR\",\"title\":\"Sri Lankan Rupee\",\"symbol\":\"LKR\",\"native\":\"เถปเท”.\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"35546\",\"max_amount\":\"355469651\"},\"MAD\":{\"code\":\"MAD\",\"title\":\"Moroccan Dirham\",\"symbol\":\"MAD\",\"native\":\"ุฏ.ู….โ€\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"1093\",\"max_amount\":\"10938136\"},\"MDL\":{\"code\":\"MDL\",\"title\":\"Moldovan Leu\",\"symbol\":\"MDL\",\"native\":\"MDL\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1926\",\"max_amount\":\"19264439\"},\"MNT\":{\"code\":\"MNT\",\"title\":\"Mongolian Tรถgrรถg\",\"symbol\":\"MNT\",\"native\":\"MNT\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"322444\",\"max_amount\":\"3224442056\"},\"MUR\":{\"code\":\"MUR\",\"title\":\"Mauritian Rupee\",\"symbol\":\"MUR\",\"native\":\"MUR\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"4453\",\"max_amount\":\"44535174\"},\"MVR\":{\"code\":\"MVR\",\"title\":\"Maldivian Rufiyaa\",\"symbol\":\"MVR\",\"native\":\"MVR\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1546\",\"max_amount\":\"15460397\"},\"MXN\":{\"code\":\"MXN\",\"title\":\"Mexican Peso\",\"symbol\":\"MX$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"2012\",\"max_amount\":\"20122860\"},\"MYR\":{\"code\":\"MYR\",\"title\":\"Malaysian Ringgit\",\"symbol\":\"MYR\",\"native\":\"RM\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"463\",\"max_amount\":\"4632502\"},\"MZN\":{\"code\":\"MZN\",\"title\":\"Mozambican Metical\",\"symbol\":\"MZN\",\"native\":\"MTn\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"6382\",\"max_amount\":\"63829729\"},\"NGN\":{\"code\":\"NGN\",\"title\":\"Nigerian Naira\",\"symbol\":\"NGN\",\"native\":\"โ‚ฆ\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"43203\",\"max_amount\":\"432039828\"},\"NIO\":{\"code\":\"NIO\",\"title\":\"Nicaraguan Cรณrdoba\",\"symbol\":\"NIO\",\"native\":\"C$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"3556\",\"max_amount\":\"35566412\"},\"NOK\":{\"code\":\"NOK\",\"title\":\"Norwegian Krone\",\"symbol\":\"NOK\",\"native\":\"kr\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"1069\",\"max_amount\":\"10690975\"},\"NPR\":{\"code\":\"NPR\",\"title\":\"Nepalese Rupee\",\"symbol\":\"NPR\",\"native\":\"เคจเฅ‡เคฐเฅ‚\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"12954\",\"max_amount\":\"129546657\"},\"NZD\":{\"code\":\"NZD\",\"title\":\"New Zealand Dollar\",\"symbol\":\"NZ$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"174\",\"max_amount\":\"1746220\"},\"PAB\":{\"code\":\"PAB\",\"title\":\"Panamanian Balboa\",\"symbol\":\"PAB\",\"native\":\"B\\/.\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"98\",\"max_amount\":\"988722\"},\"PEN\":{\"code\":\"PEN\",\"title\":\"Peruvian Nuevo Sol\",\"symbol\":\"PEN\",\"native\":\"S\\/.\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"390\",\"max_amount\":\"3902208\"},\"PHP\":{\"code\":\"PHP\",\"title\":\"Philippine Peso\",\"symbol\":\"PHP\",\"native\":\"โ‚ฑ\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"5862\",\"max_amount\":\"58627496\"},\"PKR\":{\"code\":\"PKR\",\"title\":\"Pakistani Rupee\",\"symbol\":\"PKR\",\"native\":\"โ‚จ\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"22642\",\"max_amount\":\"226426805\"},\"PLN\":{\"code\":\"PLN\",\"title\":\"Polish Zล‚oty\",\"symbol\":\"PLN\",\"native\":\"zล‚\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"493\",\"max_amount\":\"4932350\"},\"PYG\":{\"code\":\"PYG\",\"title\":\"Paraguayan Guaranรญ\",\"symbol\":\"PYG\",\"native\":\"โ‚ฒ\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":0,\"min_amount\":\"6977\",\"max_amount\":\"69772317\"},\"QAR\":{\"code\":\"QAR\",\"title\":\"Qatari Riyal\",\"symbol\":\"QAR\",\"native\":\"ุฑ.ู‚.โ€\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"364\",\"max_amount\":\"3640989\"},\"RON\":{\"code\":\"RON\",\"title\":\"Romanian Leu\",\"symbol\":\"RON\",\"native\":\"RON\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"502\",\"max_amount\":\"5028645\"},\"RSD\":{\"code\":\"RSD\",\"title\":\"Serbian Dinar\",\"symbol\":\"RSD\",\"native\":\"ะดะธะฝ.\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"11918\",\"max_amount\":\"119184990\"},\"RUB\":{\"code\":\"RUB\",\"title\":\"Russian Ruble\",\"symbol\":\"RUB\",\"native\":\"โ‚ฝ\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"7128\",\"max_amount\":\"71281218\"},\"SAR\":{\"code\":\"SAR\",\"title\":\"Saudi Riyal\",\"symbol\":\"SAR\",\"native\":\"ุฑ.ุณ.โ€\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"375\",\"max_amount\":\"3756546\"},\"SEK\":{\"code\":\"SEK\",\"title\":\"Swedish Krona\",\"symbol\":\"SEK\",\"native\":\"kr\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1109\",\"max_amount\":\"11094972\"},\"SGD\":{\"code\":\"SGD\",\"title\":\"Singapore Dollar\",\"symbol\":\"SGD\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"143\",\"max_amount\":\"1430495\"},\"THB\":{\"code\":\"THB\",\"title\":\"Thai Baht\",\"symbol\":\"เธฟ\",\"native\":\"เธฟ\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"3780\",\"max_amount\":\"37800497\"},\"TJS\":{\"code\":\"TJS\",\"title\":\"Tajikistani Somoni\",\"symbol\":\"TJS\",\"native\":\"TJS\",\"thousands_sep\":\" \",\"decimal_sep\":\";\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"975\",\"max_amount\":\"9753854\"},\"TRY\":{\"code\":\"TRY\",\"title\":\"Turkish Lira\",\"symbol\":\"TRY\",\"native\":\"TL\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1854\",\"max_amount\":\"18543598\"},\"TTD\":{\"code\":\"TTD\",\"title\":\"Trinidad and Tobago Dollar\",\"symbol\":\"TTD\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"672\",\"max_amount\":\"6722681\"},\"TWD\":{\"code\":\"TWD\",\"title\":\"New Taiwan Dollar\",\"symbol\":\"NT$\",\"native\":\"NT$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"3173\",\"max_amount\":\"31738502\"},\"TZS\":{\"code\":\"TZS\",\"title\":\"Tanzanian Shilling\",\"symbol\":\"TZS\",\"native\":\"TSh\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"233199\",\"max_amount\":\"2331999890\"},\"UAH\":{\"code\":\"UAH\",\"title\":\"Ukrainian Hryvnia\",\"symbol\":\"UAH\",\"native\":\"โ‚ด\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":false,\"exp\":2,\"min_amount\":\"3633\",\"max_amount\":\"36338830\"},\"UGX\":{\"code\":\"UGX\",\"title\":\"Ugandan Shilling\",\"symbol\":\"UGX\",\"native\":\"USh\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":0,\"min_amount\":\"3816\",\"max_amount\":\"38166726\"},\"USD\":{\"code\":\"USD\",\"title\":\"United States Dollar\",\"symbol\":\"$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"100\",\"max_amount\":1000000},\"UYU\":{\"code\":\"UYU\",\"title\":\"Uruguayan Peso\",\"symbol\":\"UYU\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"4080\",\"max_amount\":\"40801205\"},\"UZS\":{\"code\":\"UZS\",\"title\":\"Uzbekistani Som\",\"symbol\":\"UZS\",\"native\":\"UZS\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1089058\",\"max_amount\":\"10890583014\"},\"VND\":{\"code\":\"VND\",\"title\":\"Vietnamese ฤแป“ng\",\"symbol\":\"โ‚ซ\",\"native\":\"โ‚ซ\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":0,\"min_amount\":\"23862\",\"max_amount\":\"238625000\"},\"YER\":{\"code\":\"YER\",\"title\":\"Yemeni Rial\",\"symbol\":\"YER\",\"native\":\"ุฑ.ูŠ.โ€\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"25030\",\"max_amount\":\"250300677\"},\"ZAR\":{\"code\":\"ZAR\",\"title\":\"South African Rand\",\"symbol\":\"ZAR\",\"native\":\"R\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"1789\",\"max_amount\":\"17894299\"}};\n\nexport default Currencies;\n","/*\n * 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 {EMOJI_VERSION} from '../environment/emojiVersionsSupport';\n\nexport const EmojiVersions: {[version in EMOJI_VERSION]: {[emoji: string]: number}} = {'14':{'1f6dd':4867, '1f6de':4916, '1f6df':4923, '1f7f0':62832, '1f979':183, '1f9cc':1557, '1fa7b':61332, '1fa7c':61330, '1faa9':51093, '1faaa':61364, '1faab':61189, '1faac':51085, '1fab7':2651, '1fab8':2631, '1fab9':2672, '1faba':2673, '1fac3':1520, '1fac4':1521, '1fac5':1505, '1fad7':3793, '1fad8':3707, '1fad9':3804, '1fae0':111, '1fae1':136, '1fae2':132, '1fae3':133, '1fae4':174, '1fae5':142, '1fae6':1385, '1fae7':61353, '1faf0':1341, '1faf1':1332, '1faf2':1333, '1faf3':1334, '1faf4':1335, '1faf5':1351, '1faf6':1360, '1faf1-1f3fb-200d-1faf2-1f3fc':0, '1faf1-1f3fb-200d-1faf2-1f3fd':0, '1faf1-1f3fb-200d-1faf2-1f3fe':0, '1faf1-1f3fb-200d-1faf2-1f3ff':0, '1faf1-1f3fc-200d-1faf2-1f3fb':0, '1faf1-1f3fc-200d-1faf2-1f3fd':0, '1faf1-1f3fc-200d-1faf2-1f3fe':0, '1faf1-1f3fc-200d-1faf2-1f3ff':0, '1faf1-1f3fd-200d-1faf2-1f3fb':0, '1faf1-1f3fd-200d-1faf2-1f3fc':0, '1faf1-1f3fd-200d-1faf2-1f3fe':0, '1faf1-1f3fd-200d-1faf2-1f3ff':0, '1faf1-1f3fe-200d-1faf2-1f3fb':0, '1faf1-1f3fe-200d-1faf2-1f3fc':0, '1faf1-1f3fe-200d-1faf2-1f3fd':0, '1faf1-1f3fe-200d-1faf2-1f3ff':0, '1faf1-1f3ff-200d-1faf2-1f3fb':0, '1faf1-1f3ff-200d-1faf2-1f3fc':0, '1faf1-1f3ff-200d-1faf2-1f3fd':0, '1faf1-1f3ff-200d-1faf2-1f3fe':0, '1fac3-1f3fb':0, '1fac3-1f3fc':0, '1fac3-1f3fd':0, '1fac3-1f3fe':0, '1fac3-1f3ff':0, '1fac4-1f3fb':0, '1fac4-1f3fc':0, '1fac4-1f3fd':0, '1fac4-1f3fe':0, '1fac4-1f3ff':0, '1fac5-1f3fb':0, '1fac5-1f3fc':0, '1fac5-1f3fd':0, '1fac5-1f3fe':0, '1fac5-1f3ff':0, '1faf0-1f3fb':0, '1faf0-1f3fc':0, '1faf0-1f3fd':0, '1faf0-1f3fe':0, '1faf0-1f3ff':0, '1faf1-1f3fb':0, '1faf1-1f3fc':0, '1faf1-1f3fd':0, '1faf1-1f3fe':0, '1faf1-1f3ff':0, '1faf2-1f3fb':0, '1faf2-1f3fc':0, '1faf2-1f3fd':0, '1faf2-1f3fe':0, '1faf2-1f3ff':0, '1faf3-1f3fb':0, '1faf3-1f3fc':0, '1faf3-1f3fd':0, '1faf3-1f3fe':0, '1faf3-1f3ff':0, '1faf4-1f3fb':0, '1faf4-1f3fc':0, '1faf4-1f3fd':0, '1faf4-1f3fe':0, '1faf4-1f3ff':0, '1faf5-1f3fb':0, '1faf5-1f3fc':0, '1faf5-1f3fd':0, '1faf5-1f3fe':0, '1faf5-1f3ff':0, '1faf6-1f3fb':0, '1faf6-1f3fc':0, '1faf6-1f3fd':0, '1faf6-1f3fe':0, '1faf6-1f3ff':0}, '':{'2049':62835, '2122':62863, '2139':62888, '2194':62764, '2195':62763, '2196':62762, '2197':62756, '2198':62758, '2199':62760, '2328':61194, '2600':4990, '2601':4998, '2602':41013, '2603':41018, '2604':41020, '2611':62851, '2614':41014, '2615':3781, '2618':2667, '2620':1106, '2622':62753, '2623':62754, '2626':62783, '2638':62780, '2639':177, '2648':62788, '2649':62789, '2650':62796, '2651':62797, '2652':62798, '2653':62799, '2660':51095, '2663':51098, '2665':51096, '2666':51097, '2668':4865, '2692':61297, '2693':4922, '2694':61300, '2696':61311, '2697':61319, '2699':61309, '2702':61284, '2705':62850, '2708':4931, '2709':61245, '2712':61259, '2714':62852, '2716':62828, '2721':62779, '2728':51029, '2733':62858, '2734':62859, '2744':41017, '2747':62860, '2753':62836, '2754':62837, '2755':62838, '2757':62839, '2763':1137, '2764':1141, '2795':62829, '2796':62830, '2797':62831, '2934':62767, '2935':62768, '3030':62840, '3297':62912, '3299':62913, '0023-20e3':62864, '002a-20e3':62865, '0030-20e3':62866, '0031-20e3':62867, '0032-20e3':62868, '0033-20e3':62869, '0034-20e3':62870, '0035-20e3':62871, '0036-20e3':62872, '0037-20e3':62873, '0038-20e3':62874, '0039-20e3':62875, '00a9':62861, '00ae':62862, '1f004':51101, '1f0cf':51100, '1f170':62882, '1f171':62884, '1f17e':62893, '1f17f':62895, '1f18e':62883, '1f191':62885, '1f192':62886, '1f193':62887, '1f194':62889, '1f195':62891, '1f196':62892, '1f197':62894, '1f198':62896, '1f199':62897, '1f19a':62898, '1f1e6-1f1e8':71594, '1f1e6-1f1e9':71595, '1f1e6-1f1ea':71596, '1f1e6-1f1eb':71597, '1f1e6-1f1ec':71598, '1f1e6-1f1ee':71599, '1f1e6-1f1f1':71600, '1f1e6-1f1f2':71601, '1f1e6-1f1f4':71602, '1f1e6-1f1f6':71603, '1f1e6-1f1f7':71604, '1f1e6-1f1f8':71605, '1f1e6-1f1f9':71606, '1f1e6-1f1fa':71607, '1f1e6-1f1fc':71608, '1f1e6-1f1fd':71609, '1f1e6-1f1ff':71610, '1f1e7-1f1e6':71611, '1f1e7-1f1e7':71612, '1f1e7-1f1e9':71613, '1f1e7-1f1ea':71614, '1f1e7-1f1eb':71615, '1f1e7-1f1ec':71616, '1f1e7-1f1ed':71617, '1f1e7-1f1ee':71618, '1f1e7-1f1ef':71619, '1f1e7-1f1f1':71620, '1f1e7-1f1f2':71621, '1f1e7-1f1f3':71622, '1f1e7-1f1f4':71623, '1f1e7-1f1f6':71624, '1f1e7-1f1f7':71625, '1f1e7-1f1f8':71626, '1f1e7-1f1f9':71627, '1f1e7-1f1fb':71628, '1f1e7-1f1fc':71629, '1f1e7-1f1fe':71630, '1f1e7-1f1ff':71631, '1f1e8-1f1e6':71632, '1f1e8-1f1e8':71633, '1f1e8-1f1e9':71634, '1f1e8-1f1eb':71635, '1f1e8-1f1ec':71636, '1f1e8-1f1ed':71637, '1f1e8-1f1ee':71638, '1f1e8-1f1f0':71639, '1f1e8-1f1f1':71640, '1f1e8-1f1f2':71641, '1f1e8-1f1f3':71642, '1f1e8-1f1f4':71643, '1f1e8-1f1f5':71644, '1f1e8-1f1f7':71645, '1f1e8-1f1fa':71646, '1f1e8-1f1fb':71647, '1f1e8-1f1fc':71648, '1f1e8-1f1fd':71649, '1f1e8-1f1fe':71650, '1f1e8-1f1ff':71651, '1f1e9-1f1ea':71652, '1f1e9-1f1ec':71653, '1f1e9-1f1ef':71654, '1f1e9-1f1f0':71655, '1f1e9-1f1f2':71656, '1f1e9-1f1f4':71657, '1f1e9-1f1ff':71658, '1f1ea-1f1e6':71659, '1f1ea-1f1e8':71660, '1f1ea-1f1ea':71661, '1f1ea-1f1ec':71662, '1f1ea-1f1ed':71663, '1f1ea-1f1f7':71664, '1f1ea-1f1f8':71665, '1f1ea-1f1f9':71666, '1f1ea-1f1fa':71667, '1f1eb-1f1ee':71668, '1f1eb-1f1ef':71669, '1f1eb-1f1f0':71670, '1f1eb-1f1f2':71671, '1f1eb-1f1f4':71672, '1f1eb-1f1f7':71673, '1f1ec-1f1e6':71674, '1f1ec-1f1e7':71675, '1f1ec-1f1e9':71676, '1f1ec-1f1ea':71677, '1f1ec-1f1eb':71678, '1f1ec-1f1ec':71679, '1f1ec-1f1ed':71680, '1f1ec-1f1ee':71681, '1f1ec-1f1f1':71682, '1f1ec-1f1f2':71683, '1f1ec-1f1f3':71684, '1f1ec-1f1f5':71685, '1f1ec-1f1f6':71686, '1f1ec-1f1f7':71687, '1f1ec-1f1f8':71688, '1f1ec-1f1f9':71689, '1f1ec-1f1fa':71690, '1f1ec-1f1fc':71691, '1f1ec-1f1fe':71692, '1f1ed-1f1f0':71693, '1f1ed-1f1f2':71694, '1f1ed-1f1f3':71695, '1f1ed-1f1f7':71696, '1f1ed-1f1f9':71697, '1f1ed-1f1fa':71698, '1f1ee-1f1e8':71699, '1f1ee-1f1e9':71700, '1f1ee-1f1ea':71701, '1f1ee-1f1f1':71702, '1f1ee-1f1f2':71703, '1f1ee-1f1f3':71704, '1f1ee-1f1f4':71705, '1f1ee-1f1f6':71706, '1f1ee-1f1f7':71707, '1f1ee-1f1f8':71708, '1f1ee-1f1f9':71709, '1f1ef-1f1ea':71710, '1f1ef-1f1f2':71711, '1f1ef-1f1f4':71712, '1f1ef-1f1f5':71713, '1f1f0-1f1ea':71714, '1f1f0-1f1ec':71715, '1f1f0-1f1ed':71716, '1f1f0-1f1ee':71717, '1f1f0-1f1f2':71718, '1f1f0-1f1f3':71719, '1f1f0-1f1f5':71720, '1f1f0-1f1f7':71721, '1f1f0-1f1fc':71722, '1f1f0-1f1fe':71723, '1f1f0-1f1ff':71724, '1f1f1-1f1e6':71725, '1f1f1-1f1e7':71726, '1f1f1-1f1e8':71727, '1f1f1-1f1ee':71728, '1f1f1-1f1f0':71729, '1f1f1-1f1f7':71730, '1f1f1-1f1f8':71731, '1f1f1-1f1f9':71732, '1f1f1-1f1fa':71733, '1f1f1-1f1fb':71734, '1f1f1-1f1fe':71735, '1f1f2-1f1e6':71736, '1f1f2-1f1e8':71737, '1f1f2-1f1e9':71738, '1f1f2-1f1ea':71739, '1f1f2-1f1eb':71740, '1f1f2-1f1ec':71741, '1f1f2-1f1ed':71742, '1f1f2-1f1f0':71743, '1f1f2-1f1f1':71744, '1f1f2-1f1f2':71745, '1f1f2-1f1f3':71746, '1f1f2-1f1f4':71747, '1f1f2-1f1f5':71748, '1f1f2-1f1f6':71749, '1f1f2-1f1f7':71750, '1f1f2-1f1f8':71751, '1f1f2-1f1f9':71752, '1f1f2-1f1fa':71753, '1f1f2-1f1fb':71754, '1f1f2-1f1fc':71755, '1f1f2-1f1fd':71756, '1f1f2-1f1fe':71757, '1f1f2-1f1ff':71758, '1f1f3-1f1e6':71759, '1f1f3-1f1e8':71760, '1f1f3-1f1ea':71761, '1f1f3-1f1eb':71762, '1f1f3-1f1ec':71763, '1f1f3-1f1ee':71764, '1f1f3-1f1f1':71765, '1f1f3-1f1f4':71766, '1f1f3-1f1f5':71767, '1f1f3-1f1f7':71768, '1f1f3-1f1fa':71769, '1f1f3-1f1ff':71770, '1f1f4-1f1f2':71771, '1f1f5-1f1e6':71772, '1f1f5-1f1ea':71773, '1f1f5-1f1eb':71774, '1f1f5-1f1ec':71775, '1f1f5-1f1ed':71776, '1f1f5-1f1f0':71777, '1f1f5-1f1f1':71778, '1f1f5-1f1f2':71779, '1f1f5-1f1f3':71780, '1f1f5-1f1f7':71781, '1f1f5-1f1f8':71782, '1f1f5-1f1f9':71783, '1f1f5-1f1fc':71784, '1f1f5-1f1fe':71785, '1f1f6-1f1e6':71786, '1f1f7-1f1ea':71787, '1f1f7-1f1f4':71788, '1f1f7-1f1f8':71789, '1f1f7-1f1fa':71790, '1f1f7-1f1fc':71791, '1f1f8-1f1e6':71792, '1f1f8-1f1e7':71793, '1f1f8-1f1e8':71794, '1f1f8-1f1e9':71795, '1f1f8-1f1ea':71796, '1f1f8-1f1ec':71797, '1f1f8-1f1ed':71798, '1f1f8-1f1ee':71799, '1f1f8-1f1ef':71800, '1f1f8-1f1f0':71801, '1f1f8-1f1f1':71802, '1f1f8-1f1f2':71803, '1f1f8-1f1f3':71804, '1f1f8-1f1f4':71805, '1f1f8-1f1f7':71806, '1f1f8-1f1f8':71807, '1f1f8-1f1f9':71808, '1f1f8-1f1fb':71809, '1f1f8-1f1fd':71810, '1f1f8-1f1fe':71811, '1f1f8-1f1ff':71812, '1f1f9-1f1e6':71813, '1f1f9-1f1e8':71814, '1f1f9-1f1e9':71815, '1f1f9-1f1eb':71816, '1f1f9-1f1ec':71817, '1f1f9-1f1ed':71818, '1f1f9-1f1ef':71819, '1f1f9-1f1f0':71820, '1f1f9-1f1f1':71821, '1f1f9-1f1f2':71822, '1f1f9-1f1f3':71823, '1f1f9-1f1f4':71824, '1f1f9-1f1f7':71825, '1f1f9-1f1f9':71826, '1f1f9-1f1fb':71827, '1f1f9-1f1fc':71828, '1f1f9-1f1ff':71829, '1f1fa-1f1e6':71830, '1f1fa-1f1ec':71831, '1f1fa-1f1f2':71832, '1f1fa-1f1f3':71833, '1f1fa-1f1f8':71834, '1f1fa-1f1fe':71835, '1f1fa-1f1ff':71836, '1f1fb-1f1e6':71837, '1f1fb-1f1e8':71838, '1f1fb-1f1ea':71839, '1f1fb-1f1ec':71840, '1f1fb-1f1ee':71841, '1f1fb-1f1f3':71842, '1f1fb-1f1fa':71843, '1f1fc-1f1eb':71844, '1f1fc-1f1f8':71845, '1f1fd-1f1f0':71846, '1f1fe-1f1ea':71847, '1f1fe-1f1f9':71848, '1f1ff-1f1e6':71849, '1f1ff-1f1f2':71850, '1f1ff-1f1fc':71851, '1f201':62899, '1f202':62900, '1f21a':62906, '1f22f':62903, '1f232':62907, '1f233':62911, '1f234':62910, '1f235':62915, '1f236':62902, '1f237':62901, '1f238':62909, '1f239':62905, '1f23a':62914, '1f250':62904, '1f251':62908, '1f300':41010, '1f301':4857, '1f302':41012, '1f303':4858, '1f304':4860, '1f305':4861, '1f306':4862, '1f307':4863, '1f308':41011, '1f309':4864, '1f30a':41023, '1f30b':4815, '1f30c':4997, '1f30d':4806, '1f30e':4807, '1f30f':4808, '1f310':4809, '1f311':4977, '1f312':4978, '1f313':4979, '1f314':4980, '1f315':4981, '1f316':4982, '1f317':4983, '1f318':4984, '1f319':4985, '1f31a':4986, '1f31b':4987, '1f31c':4988, '1f31d':4991, '1f31e':4992, '1f31f':4995, '1f320':4996, '1f321':4989, '1f324':41001, '1f325':41002, '1f326':41003, '1f327':41004, '1f328':41005, '1f329':41006, '1f32a':41007, '1f32b':41008, '1f32c':41009, '1f32d':3725, '1f32e':3727, '1f32f':3728, '1f330':3708, '1f331':2659, '1f332':2661, '1f333':2662, '1f334':2663, '1f335':2664, '1f336':3698, '1f337':2658, '1f338':2649, '1f339':2653, '1f33a':2655, '1f33b':2656, '1f33c':2657, '1f33d':3697, '1f33e':2665, '1f33f':2666, '1f340':2668, '1f341':2669, '1f342':2670, '1f343':2671, '1f344':3705, '1f345':3690, '1f346':3694, '1f347':3674, '1f348':3675, '1f349':3676, '1f34a':3677, '1f34b':3678, '1f34c':3679, '1f34d':3680, '1f34e':3682, '1f34f':3683, '1f350':3684, '1f351':3685, '1f352':3686, '1f353':3687, '1f354':3722, '1f355':3724, '1f356':3718, '1f357':3719, '1f358':3744, '1f359':3745, '1f35a':3746, '1f35b':3747, '1f35c':3748, '1f35d':3749, '1f35e':3709, '1f35f':3723, '1f360':3750, '1f361':3756, '1f362':3751, '1f363':3752, '1f364':3753, '1f365':3754, '1f366':3765, '1f367':3766, '1f368':3767, '1f369':3768, '1f36a':3769, '1f36b':3774, '1f36c':3775, '1f36d':3776, '1f36e':3777, '1f36f':3778, '1f370':3771, '1f371':3743, '1f372':3735, '1f373':3733, '1f374':3801, '1f375':3783, '1f376':3784, '1f377':3786, '1f378':3787, '1f379':3788, '1f37a':3789, '1f37b':3790, '1f37c':3779, '1f37d':3800, '1f37e':3785, '1f37f':3739, '1f380':51040, '1f381':51041, '1f382':3770, '1f383':51024, '1f384':51025, '1f385':1527, '1f386':51026, '1f387':51027, '1f388':51030, '1f389':51031, '1f38a':51032, '1f38b':51033, '1f38c':71588, '1f38d':51034, '1f38e':51035, '1f38f':51036, '1f390':51037, '1f391':51038, '1f392':61134, '1f393':61147, '1f396':51045, '1f397':51042, '1f399':61167, '1f39a':61168, '1f39b':61169, '1f39e':61203, '1f39f':51043, '1f3a0':4866, '1f3a1':4868, '1f3a2':4869, '1f3a3':51072, '1f3a4':61170, '1f3a5':61202, '1f3a6':62819, '1f3a7':61171, '1f3a8':51105, '1f3a9':61146, '1f3aa':4871, '1f3ab':51044, '1f3ac':61205, '1f3ad':51103, '1f3ae':51086, '1f3af':51078, '1f3b0':51088, '1f3b1':51081, '1f3b2':51089, '1f3b3':51060, '1f3b4':51102, '1f3b5':61165, '1f3b6':61166, '1f3b7':61173, '1f3b8':61175, '1f3b9':61176, '1f3ba':61177, '1f3bb':61178, '1f3bc':61164, '1f3bd':51074, '1f3be':51058, '1f3bf':51075, '1f3c0':51054, '1f3c1':71586, '1f3c2':1600, '1f3c3-200d-2640':1584, '1f3c3-200d-2642':1583, '1f3c3':1582, '1f3c4-200d-2640':1606, '1f3c4-200d-2642':1605, '1f3c4':1604, '1f3c5':51047, '1f3c6':51046, '1f3c7':1598, '1f3c8':51056, '1f3c9':51057, '1f3ca-200d-2640':1612, '1f3ca-200d-2642':1611, '1f3ca':1610, '1f3cb-200d-2640':1618, '1f3cb-200d-2642':1617, '1f3cb':1616, '1f3cc-200d-2640':1603, '1f3cc-200d-2642':1602, '1f3cc':1601, '1f3cd':4902, '1f3ce':4901, '1f3cf':51061, '1f3d0':51055, '1f3d1':51062, '1f3d2':51063, '1f3d3':51065, '1f3d4':4813, '1f3d5':4817, '1f3d6':4818, '1f3d7':4824, '1f3d8':4829, '1f3d9':4859, '1f3da':4830, '1f3db':4823, '1f3dc':4819, '1f3dd':4820, '1f3de':4821, '1f3df':4822, '1f3e0':4831, '1f3e1':4832, '1f3e2':4833, '1f3e3':4834, '1f3e4':4835, '1f3e5':4836, '1f3e6':4837, '1f3e7':62729, '1f3e8':4838, '1f3e9':4839, '1f3ea':4840, '1f3eb':4841, '1f3ec':4842, '1f3ed':4843, '1f3ee':61216, '1f3ef':4844, '1f3f0':4845, '1f3f3-200d-1f308':71591, '1f3f3-200d-26a7':71592, '1f3f3':71590, '1f3f4-200d-2620':71593, '1f3f4-e0067-e0062-e0065-e006e-e0067-e007f':71852, '1f3f4-e0067-e0062-e0073-e0063-e0074-e007f':71853, '1f3f4-e0067-e0062-e0077-e006c-e0073-e007f':71854, '1f3f4':71589, '1f3f5':2652, '1f3f7':61234, '1f3f8':51066, '1f3f9':61303, '1f3fa':3805, '1f3fb':9525, '1f3fc':9526, '1f3fd':9527, '1f3fe':9528, '1f3ff':9529, '1f400':2576, '1f401':2575, '1f402':2556, '1f403':2557, '1f404':2558, '1f405':2547, '1f406':2548, '1f407':2579, '1f408-200d-2b1b':2544, '1f408':2543, '1f409':2618, '1f40a':2613, '1f40b':2622, '1f40c':2632, '1f40d':2616, '1f40e':2550, '1f40f':2563, '1f410':2565, '1f411':2564, '1f412':2531, '1f413':2596, '1f414':2595, '1f415-200d-1f9ba':2537, '1f415':2535, '1f416':2560, '1f417':2561, '1f418':2570, '1f419':2629, '1f41a':2630, '1f41b':2634, '1f41c':2635, '1f41d':2636, '1f41e':2638, '1f41f':2625, '1f420':2626, '1f421':2627, '1f422':2614, '1f423':2597, '1f424':2598, '1f425':2599, '1f426':2600, '1f427':2601, '1f428':2586, '1f429':2538, '1f42a':2566, '1f42b':2567, '1f42c':2623, '1f42d':2574, '1f42e':2555, '1f42f':2546, '1f430':2578, '1f431':2542, '1f432':2617, '1f433':2621, '1f434':2549, '1f435':2530, '1f436':2534, '1f437':2559, '1f438':2612, '1f439':2577, '1f43a':2539, '1f43b-200d-2744':2585, '1f43b':2584, '1f43c':2587, '1f43d':2562, '1f43e':2593, '1f43f':2580, '1f440':1381, '1f441-200d-1f5e8':1159, '1f441':1382, '1f442':1373, '1f443':1375, '1f444':1384, '1f445':1383, '1f446':1347, '1f447':1349, '1f448':1345, '1f449':1346, '1f44a':1355, '1f44b':1327, '1f44c':1336, '1f44d':1352, '1f44e':1353, '1f44f':1358, '1f450':1361, '1f451':61144, '1f452':61145, '1f453':61110, '1f454':61115, '1f455':61116, '1f456':61117, '1f457':61122, '1f458':61123, '1f459':61128, '1f45a':61129, '1f45b':61130, '1f45c':61131, '1f45d':61132, '1f45e':61136, '1f45f':61137, '1f460':61140, '1f461':61141, '1f462':61143, '1f463':1687, '1f464':1684, '1f465':1685, '1f466':1388, '1f467':1389, '1f468-200d-1f33e':1457, '1f468-200d-1f373':1460, '1f468-200d-1f37c':1524, '1f468-200d-1f393':1448, '1f468-200d-1f3a4':1478, '1f468-200d-1f3a8':1481, '1f468-200d-1f3eb':1451, '1f468-200d-1f3ed':1466, '1f468-200d-1f466-200d-1f466':1674, '1f468-200d-1f466':1673, '1f468-200d-1f467-200d-1f466':1676, '1f468-200d-1f467-200d-1f467':1677, '1f468-200d-1f467':1675, '1f468-200d-1f468-200d-1f466':1663, '1f468-200d-1f468-200d-1f466-200d-1f466':1666, '1f468-200d-1f468-200d-1f467':1664, '1f468-200d-1f468-200d-1f467-200d-1f466':1665, '1f468-200d-1f468-200d-1f467-200d-1f467':1667, '1f468-200d-1f469-200d-1f466':1658, '1f468-200d-1f469-200d-1f466-200d-1f466':1661, '1f468-200d-1f469-200d-1f467':1659, '1f468-200d-1f469-200d-1f467-200d-1f466':1660, '1f468-200d-1f469-200d-1f467-200d-1f467':1662, '1f468-200d-1f4bb':1475, '1f468-200d-1f4bc':1469, '1f468-200d-1f527':1463, '1f468-200d-1f52c':1472, '1f468-200d-1f680':1487, '1f468-200d-1f692':1490, '1f468-200d-1f9af':1574, '1f468-200d-1f9b0':1396, '1f468-200d-1f9b1':1397, '1f468-200d-1f9b2':1399, '1f468-200d-1f9b3':1398, '1f468-200d-1f9bc':1577, '1f468-200d-1f9bd':1580, '1f468-200d-2695':1445, '1f468-200d-2696':1454, '1f468-200d-2708':1484, '1f468-200d-2764-200d-1f468':1655, '1f468-200d-2764-200d-1f48b-200d-1f468':1651, '1f468':1392, '1f469-200d-1f33e':1458, '1f469-200d-1f373':1461, '1f469-200d-1f37c':1523, '1f469-200d-1f393':1449, '1f469-200d-1f3a4':1479, '1f469-200d-1f3a8':1482, '1f469-200d-1f3eb':1452, '1f469-200d-1f3ed':1467, '1f469-200d-1f466-200d-1f466':1679, '1f469-200d-1f466':1678, '1f469-200d-1f467-200d-1f466':1681, '1f469-200d-1f467-200d-1f467':1682, '1f469-200d-1f467':1680, '1f469-200d-1f469-200d-1f466':1668, '1f469-200d-1f469-200d-1f466-200d-1f466':1671, '1f469-200d-1f469-200d-1f467':1669, '1f469-200d-1f469-200d-1f467-200d-1f466':1670, '1f469-200d-1f469-200d-1f467-200d-1f467':1672, '1f469-200d-1f4bb':1476, '1f469-200d-1f4bc':1470, '1f469-200d-1f527':1464, '1f469-200d-1f52c':1473, '1f469-200d-1f680':1488, '1f469-200d-1f692':1491, '1f469-200d-1f9af':1575, '1f469-200d-1f9b0':1401, '1f469-200d-1f9b1':1403, '1f469-200d-1f9b2':1407, '1f469-200d-1f9b3':1405, '1f469-200d-1f9bc':1578, '1f469-200d-1f9bd':1581, '1f469-200d-2695':1446, '1f469-200d-2696':1455, '1f469-200d-2708':1485, '1f469-200d-2764-200d-1f468':1654, '1f469-200d-2764-200d-1f469':1656, '1f469-200d-2764-200d-1f48b-200d-1f468':1650, '1f469-200d-2764-200d-1f48b-200d-1f469':1652, '1f469':1400, '1f46a':1657, '1f46b':1647, '1f46c':1648, '1f46d':1646, '1f46e-200d-2640':1494, '1f46e-200d-2642':1493, '1f46e':1492, '1f46f-200d-2640':1590, '1f46f-200d-2642':1589, '1f46f':1588, '1f470-200d-2640':1518, '1f470-200d-2642':1517, '1f470':1516, '1f471-200d-2640':1409, '1f471-200d-2642':1410, '1f471':1391, '1f472':1511, '1f473-200d-2640':1510, '1f473-200d-2642':1509, '1f473':1508, '1f474':1412, '1f475':1413, '1f476':1386, '1f477-200d-2640':1504, '1f477-200d-2642':1503, '1f477':1502, '1f478':1507, '1f479':1109, '1f47a':1110, '1f47b':1111, '1f47c':1526, '1f47d':1112, '1f47e':1113, '1f47f':1104, '1f480':1105, '1f481-200d-2640':1428, '1f481-200d-2642':1427, '1f481':1426, '1f482-200d-2640':1500, '1f482-200d-2642':1499, '1f482':1498, '1f483':1585, '1f484':61152, '1f485':1366, '1f486-200d-2640':1560, '1f486-200d-2642':1559, '1f486':1558, '1f487-200d-2640':1563, '1f487-200d-2642':1562, '1f487':1561, '1f488':4870, '1f489':61326, '1f48a':61328, '1f48b':1127, '1f48c':1128, '1f48d':61153, '1f48e':61154, '1f48f':1649, '1f490':2648, '1f491':1653, '1f492':4846, '1f493':1133, '1f494':1138, '1f495':1135, '1f496':1131, '1f497':1132, '1f498':1129, '1f499':1145, '1f49a':1144, '1f49b':1143, '1f49c':1146, '1f49d':1130, '1f49e':1134, '1f49f':1136, '1f4a0':62946, '1f4a1':61214, '1f4a2':1151, '1f4a3':1157, '1f4a4':1163, '1f4a5':1152, '1f4a6':1154, '1f4a7':41022, '1f4a8':1155, '1f4a9':1107, '1f4aa':1368, '1f4ab':1153, '1f4ac':1158, '1f4ad':1162, '1f4ae':2650, '1f4af':1150, '1f4b0':61235, '1f4b1':62841, '1f4b2':62842, '1f4b3':61242, '1f4b4':61237, '1f4b5':61238, '1f4b6':61239, '1f4b7':61240, '1f4b8':61241, '1f4b9':61244, '1f4ba':4936, '1f4bb':61191, '1f4bc':61265, '1f4bd':61197, '1f4be':61198, '1f4bf':61199, '1f4c0':61200, '1f4c1':61266, '1f4c2':61267, '1f4c3':61227, '1f4c4':61229, '1f4c5':61269, '1f4c6':61270, '1f4c7':61273, '1f4c8':61274, '1f4c9':61275, '1f4ca':61276, '1f4cb':61277, '1f4cc':61278, '1f4cd':61279, '1f4ce':61280, '1f4cf':61282, '1f4d0':61283, '1f4d1':61232, '1f4d2':61226, '1f4d3':61225, '1f4d4':61218, '1f4d5':61219, '1f4d6':61220, '1f4d7':61221, '1f4d8':61222, '1f4d9':61223, '1f4da':61224, '1f4db':62847, '1f4dc':61228, '1f4dd':61264, '1f4de':61185, '1f4df':61186, '1f4e0':61187, '1f4e1':61325, '1f4e2':61159, '1f4e3':61160, '1f4e4':61249, '1f4e5':61250, '1f4e6':61251, '1f4e7':61246, '1f4e8':61247, '1f4e9':61248, '1f4ea':61253, '1f4eb':61252, '1f4ec':61254, '1f4ed':61255, '1f4ee':61256, '1f4ef':61161, '1f4f0':61230, '1f4f1':61182, '1f4f2':61183, '1f4f3':62823, '1f4f4':62824, '1f4f5':62751, '1f4f6':62822, '1f4f7':61207, '1f4f8':61208, '1f4f9':61209, '1f4fa':61206, '1f4fb':61172, '1f4fc':61210, '1f4fd':61204, '1f4ff':61151, '1f500':62801, '1f501':62802, '1f502':62803, '1f503':62769, '1f504':62770, '1f505':62820, '1f506':62821, '1f507':61155, '1f508':61156, '1f509':61157, '1f50a':61158, '1f50b':61188, '1f50c':61190, '1f50d':61211, '1f50e':61212, '1f50f':61290, '1f510':61291, '1f511':61292, '1f512':61288, '1f513':61289, '1f514':61162, '1f515':61163, '1f516':61233, '1f517':61313, '1f518':62947, '1f519':62771, '1f51a':62772, '1f51b':62773, '1f51c':62774, '1f51d':62775, '1f51e':62752, '1f51f':62876, '1f520':62877, '1f521':62878, '1f522':62879, '1f523':62880, '1f524':62881, '1f525':41021, '1f526':61215, '1f527':61306, '1f528':61294, '1f529':61308, '1f52a':3803, '1f52b':61301, '1f52c':61323, '1f52d':61324, '1f52e':51082, '1f52f':62787, '1f530':62848, '1f531':62846, '1f532':62949, '1f533':62948, '1f534':62916, '1f535':62920, '1f536':62940, '1f537':62941, '1f538':62942, '1f539':62943, '1f53a':62944, '1f53b':62945, '1f53c':62811, '1f53d':62813, '1f549':62778, '1f54a':2602, '1f54b':4854, '1f54c':4850, '1f54d':4852, '1f54e':62786, '1f550':4955, '1f551':4957, '1f552':4959, '1f553':4961, '1f554':4963, '1f555':4965, '1f556':4967, '1f557':4969, '1f558':4971, '1f559':4973, '1f55a':4975, '1f55b':4953, '1f55c':4956, '1f55d':4958, '1f55e':4960, '1f55f':4962, '1f560':4964, '1f561':4966, '1f562':4968, '1f563':4970, '1f564':4972, '1f565':4974, '1f566':4976, '1f567':4954, '1f56f':61213, '1f570':4952, '1f573':1156, '1f574':1587, '1f575-200d-2640':1497, '1f575-200d-2642':1496, '1f575':1495, '1f576':61111, '1f577':2641, '1f578':2642, '1f579':51087, '1f57a':1586, '1f587':61281, '1f58a':61261, '1f58b':61260, '1f58c':61262, '1f58d':61263, '1f590':1329, '1f595':1348, '1f596':1331, '1f5a4':1148, '1f5a5':61192, '1f5a8':61193, '1f5b1':61195, '1f5b2':61196, '1f5bc':51104, '1f5c2':61268, '1f5c3':61285, '1f5c4':61286, '1f5d1':61287, '1f5d2':61271, '1f5d3':61272, '1f5dc':61310, '1f5dd':61293, '1f5de':61231, '1f5e1':61299, '1f5e3':1683, '1f5e8':1160, '1f5ef':1161, '1f5f3':61257, '1f5fa':4810, '1f5fb':4816, '1f5fc':4847, '1f5fd':4848, '1f5fe':4811, '1f5ff':61362, '1f600':11, '1f601':14, '1f602':18, '1f603':12, '1f604':13, '1f605':16, '1f606':15, '1f607':114, '1f608':1103, '1f609':112, '1f60a':113, '1f60b':124, '1f60c':150, '1f60d':116, '1f60e':170, '1f60f':144, '1f610':139, '1f611':140, '1f612':145, '1f613':195, '1f614':151, '1f615':173, '1f616':192, '1f617':119, '1f618':118, '1f619':122, '1f61a':121, '1f61b':125, '1f61c':126, '1f61d':128, '1f61e':194, '1f61f':175, '1f620':1101, '1f621':1100, '1f622':189, '1f623':193, '1f624':199, '1f625':188, '1f626':184, '1f627':185, '1f628':186, '1f629':196, '1f62a':152, '1f62b':197, '1f62c':147, '1f62d':190, '1f62e-200d-1f4a8':148, '1f62e':178, '1f62f':179, '1f630':187, '1f631':191, '1f632':180, '1f633':181, '1f634':154, '1f635-200d-1f4ab':165, '1f635':164, '1f636-200d-1f32b':143, '1f636':141, '1f637':155, '1f638':1116, '1f639':1117, '1f63a':1115, '1f63b':1118, '1f63c':1119, '1f63d':1120, '1f63e':1123, '1f63f':1122, '1f640':1121, '1f641':176, '1f642':19, '1f643':110, '1f644':146, '1f645-200d-2640':1422, '1f645-200d-2642':1421, '1f645':1420, '1f646-200d-2640':1425, '1f646-200d-2642':1424, '1f646':1423, '1f647-200d-2640':1437, '1f647-200d-2642':1436, '1f647':1435, '1f648':1124, '1f649':1125, '1f64a':1126, '1f64b-200d-2640':1431, '1f64b-200d-2642':1430, '1f64b':1429, '1f64c':1359, '1f64d-200d-2640':1416, '1f64d-200d-2642':1415, '1f64d':1414, '1f64e-200d-2640':1419, '1f64e-200d-2642':1418, '1f64e':1417, '1f64f':1364, '1f680':4942, '1f681':4937, '1f682':4872, '1f683':4873, '1f684':4874, '1f685':4875, '1f686':4876, '1f687':4877, '1f688':4878, '1f689':4879, '1f68a':4880, '1f68b':4883, '1f68c':4884, '1f68d':4885, '1f68e':4886, '1f68f':4911, '1f690':4887, '1f691':4888, '1f692':4889, '1f693':4890, '1f694':4891, '1f695':4892, '1f696':4893, '1f697':4894, '1f698':4895, '1f699':4896, '1f69a':4898, '1f69b':4899, '1f69c':4900, '1f69d':4881, '1f69e':4882, '1f69f':4938, '1f6a0':4939, '1f6a1':4940, '1f6a2':4930, '1f6a3-200d-2640':1609, '1f6a3-200d-2642':1608, '1f6a3':1607, '1f6a4':4926, '1f6a5':4918, '1f6a6':4919, '1f6a7':4921, '1f6a8':4917, '1f6a9':71587, '1f6aa':61333, '1f6ab':62745, '1f6ac':61358, '1f6ad':62747, '1f6ae':62730, '1f6af':62748, '1f6b0':62731, '1f6b1':62749, '1f6b2':4907, '1f6b3':62746, '1f6b4-200d-2640':1621, '1f6b4-200d-2642':1620, '1f6b4':1619, '1f6b5-200d-2640':1624, '1f6b5-200d-2642':1623, '1f6b5':1622, '1f6b6-200d-2640':1566, '1f6b6-200d-2642':1565, '1f6b6':1564, '1f6b7':62750, '1f6b8':62743, '1f6b9':62733, '1f6ba':62734, '1f6bb':62735, '1f6bc':62736, '1f6bd':61340, '1f6be':62737, '1f6bf':61342, '1f6c0':1643, '1f6c1':61343, '1f6c2':62738, '1f6c3':62739, '1f6c4':62740, '1f6c5':62741, '1f6cb':61338, '1f6cc':1644, '1f6cd':61133, '1f6ce':4944, '1f6cf':61337, '1f6d0':62776, '1f6d1':4920, '1f6d2':61357, '1f6d5':4851, '1f6d6':4828, '1f6d7':61334, '1f6e0':61298, '1f6e1':61304, '1f6e2':4914, '1f6e3':4912, '1f6e4':4913, '1f6e5':4929, '1f6e9':4932, '1f6eb':4933, '1f6ec':4934, '1f6f0':4941, '1f6f3':4927, '1f6f4':4908, '1f6f5':4903, '1f6f6':4925, '1f6f7':51076, '1f6f8':4943, '1f6f9':4909, '1f6fa':4906, '1f6fb':4897, '1f6fc':4910, '1f7e0':62917, '1f7e1':62918, '1f7e2':62919, '1f7e3':62921, '1f7e4':62922, '1f7e5':62925, '1f7e6':62929, '1f7e7':62926, '1f7e8':62927, '1f7e9':62928, '1f7ea':62930, '1f7eb':62931, '1f90c':1337, '1f90d':1149, '1f90e':1147, '1f90f':1338, '1f910':137, '1f911':129, '1f912':156, '1f913':171, '1f914':135, '1f915':157, '1f916':1114, '1f917':130, '1f918':1343, '1f919':1344, '1f91a':1328, '1f91b':1356, '1f91c':1357, '1f91d':1363, '1f91e':1340, '1f91f':1342, '1f920':167, '1f921':1108, '1f922':158, '1f923':17, '1f924':153, '1f925':149, '1f926-200d-2640':1440, '1f926-200d-2642':1439, '1f926':1438, '1f927':160, '1f928':138, '1f929':117, '1f92a':127, '1f92b':134, '1f92c':1102, '1f92d':131, '1f92e':159, '1f92f':166, '1f930':1519, '1f931':1522, '1f932':1362, '1f933':1367, '1f934':1506, '1f935-200d-2640':1515, '1f935-200d-2642':1514, '1f935':1513, '1f936':1528, '1f937-200d-2640':1443, '1f937-200d-2642':1442, '1f937':1441, '1f938-200d-2640':1627, '1f938-200d-2642':1626, '1f938':1625, '1f939-200d-2640':1639, '1f939-200d-2642':1638, '1f939':1637, '1f93a':1597, '1f93c-200d-2640':1630, '1f93c-200d-2642':1629, '1f93c':1628, '1f93d-200d-2640':1633, '1f93d-200d-2642':1632, '1f93d':1631, '1f93e-200d-2640':1636, '1f93e-200d-2642':1635, '1f93e':1634, '1f93f':51073, '1f940':2654, '1f941':61180, '1f942':3791, '1f943':3792, '1f944':3802, '1f945':51069, '1f947':51048, '1f948':51049, '1f949':51050, '1f94a':51067, '1f94b':51068, '1f94c':51077, '1f94d':51064, '1f94e':51053, '1f94f':51059, '1f950':3710, '1f951':3693, '1f952':3700, '1f953':3721, '1f954':3695, '1f955':3696, '1f956':3711, '1f957':3738, '1f958':3734, '1f959':3730, '1f95a':3732, '1f95b':3780, '1f95c':3706, '1f95d':3689, '1f95e':3715, '1f95f':3757, '1f960':3758, '1f961':3759, '1f962':3799, '1f963':3737, '1f964':3794, '1f965':3692, '1f966':3702, '1f967':3773, '1f968':3713, '1f969':3720, '1f96a':3726, '1f96b':3742, '1f96c':3701, '1f96d':3681, '1f96e':3755, '1f96f':3714, '1f970':115, '1f971':198, '1f972':123, '1f973':168, '1f974':163, '1f975':161, '1f976':162, '1f977':1501, '1f978':169, '1f97a':182, '1f97b':61124, '1f97c':61113, '1f97d':61112, '1f97e':61138, '1f97f':61139, '1f980':3760, '1f981':2545, '1f982':2643, '1f983':2594, '1f984':2551, '1f985':2603, '1f986':2604, '1f987':2583, '1f988':2628, '1f989':2606, '1f98a':2540, '1f98b':2633, '1f98c':2553, '1f98d':2532, '1f98e':2615, '1f98f':2572, '1f990':3762, '1f991':3763, '1f992':2569, '1f993':2552, '1f994':2582, '1f995':2619, '1f996':2620, '1f997':2639, '1f998':2591, '1f999':2568, '1f99a':2610, '1f99b':2573, '1f99c':2611, '1f99d':2541, '1f99e':3761, '1f99f':2644, '1f9a0':2647, '1f9a1':2592, '1f9a2':2605, '1f9a3':2571, '1f9a4':2607, '1f9a5':2588, '1f9a6':2589, '1f9a7':2533, '1f9a8':2590, '1f9a9':2609, '1f9aa':3764, '1f9ab':2581, '1f9ac':2554, '1f9ad':2624, '1f9ae':2536, '1f9af':61312, '1f9b4':1380, '1f9b5':1371, '1f9b6':1372, '1f9b7':1379, '1f9b8-200d-2640':1532, '1f9b8-200d-2642':1531, '1f9b8':1530, '1f9b9-200d-2640':1535, '1f9b9-200d-2642':1534, '1f9b9':1533, '1f9ba':61114, '1f9bb':1374, '1f9bc':4905, '1f9bd':4904, '1f9be':1369, '1f9bf':1370, '1f9c0':3717, '1f9c1':3772, '1f9c2':3741, '1f9c3':3796, '1f9c4':3703, '1f9c5':3704, '1f9c6':3731, '1f9c7':3716, '1f9c8':3740, '1f9c9':3797, '1f9ca':3798, '1f9cb':3795, '1f9cd-200d-2640':1569, '1f9cd-200d-2642':1568, '1f9cd':1567, '1f9ce-200d-2640':1572, '1f9ce-200d-2642':1571, '1f9ce':1570, '1f9cf-200d-2640':1434, '1f9cf-200d-2642':1433, '1f9cf':1432, '1f9d0':172, '1f9d1-200d-1f33e':1456, '1f9d1-200d-1f373':1459, '1f9d1-200d-1f37c':1525, '1f9d1-200d-1f384':1529, '1f9d1-200d-1f393':1447, '1f9d1-200d-1f3a4':1477, '1f9d1-200d-1f3a8':1480, '1f9d1-200d-1f3eb':1450, '1f9d1-200d-1f3ed':1465, '1f9d1-200d-1f4bb':1474, '1f9d1-200d-1f4bc':1468, '1f9d1-200d-1f527':1462, '1f9d1-200d-1f52c':1471, '1f9d1-200d-1f680':1486, '1f9d1-200d-1f692':1489, '1f9d1-200d-1f91d-200d-1f9d1':1645, '1f9d1-200d-1f9af':1573, '1f9d1-200d-1f9b0':1402, '1f9d1-200d-1f9b1':1404, '1f9d1-200d-1f9b2':1408, '1f9d1-200d-1f9b3':1406, '1f9d1-200d-1f9bc':1576, '1f9d1-200d-1f9bd':1579, '1f9d1-200d-2695':1444, '1f9d1-200d-2696':1453, '1f9d1-200d-2708':1483, '1f9d1':1390, '1f9d2':1387, '1f9d3':1411, '1f9d4-200d-2640':1395, '1f9d4-200d-2642':1394, '1f9d4':1393, '1f9d5':1512, '1f9d6-200d-2640':1593, '1f9d6-200d-2642':1592, '1f9d6':1591, '1f9d7-200d-2640':1596, '1f9d7-200d-2642':1595, '1f9d7':1594, '1f9d8-200d-2640':1642, '1f9d8-200d-2642':1641, '1f9d8':1640, '1f9d9-200d-2640':1538, '1f9d9-200d-2642':1537, '1f9d9':1536, '1f9da-200d-2640':1541, '1f9da-200d-2642':1540, '1f9da':1539, '1f9db-200d-2640':1544, '1f9db-200d-2642':1543, '1f9db':1542, '1f9dc-200d-2640':1547, '1f9dc-200d-2642':1546, '1f9dc':1545, '1f9dd-200d-2640':1550, '1f9dd-200d-2642':1549, '1f9dd':1548, '1f9de-200d-2640':1553, '1f9de-200d-2642':1552, '1f9de':1551, '1f9df-200d-2640':1556, '1f9df-200d-2642':1555, '1f9df':1554, '1f9e0':1376, '1f9e1':1142, '1f9e2':61148, '1f9e3':61118, '1f9e4':61119, '1f9e5':61120, '1f9e6':61121, '1f9e7':51039, '1f9e8':51028, '1f9e9':51090, '1f9ea':61320, '1f9eb':61321, '1f9ec':61322, '1f9ed':4812, '1f9ee':61201, '1f9ef':61356, '1f9f0':61316, '1f9f1':4825, '1f9f2':61317, '1f9f3':4945, '1f9f4':61346, '1f9f5':51106, '1f9f6':51108, '1f9f7':61347, '1f9f8':51091, '1f9f9':61348, '1f9fa':61349, '1f9fb':61350, '1f9fc':61352, '1f9fd':61355, '1f9fe':61243, '1f9ff':51084, '1fa70':61142, '1fa71':61125, '1fa72':61126, '1fa73':61127, '1fa74':61135, '1fa78':61327, '1fa79':61329, '1fa7a':61331, '1fa80':51079, '1fa81':51080, '1fa82':4935, '1fa83':61302, '1fa84':51083, '1fa85':51092, '1fa86':51094, '1fa90':4993, '1fa91':61339, '1fa92':61345, '1fa93':61295, '1fa94':61217, '1fa95':61179, '1fa96':61149, '1fa97':61174, '1fa98':61181, '1fa99':61236, '1fa9a':61305, '1fa9b':61307, '1fa9c':61318, '1fa9d':61315, '1fa9e':61335, '1fa9f':61336, '1faa0':61341, '1faa1':51107, '1faa2':51109, '1faa3':61351, '1faa4':61344, '1faa5':61354, '1faa6':61360, '1faa7':61363, '1faa8':4826, '1fab0':2645, '1fab1':2646, '1fab2':2637, '1fab3':2640, '1fab4':2660, '1fab5':4827, '1fab6':2608, '1fac0':1377, '1fac1':1378, '1fac2':1686, '1fad0':3688, '1fad1':3699, '1fad2':3691, '1fad3':3712, '1fad4':3729, '1fad5':3736, '1fad6':3782, '203c':62834, '21a9':62765, '21aa':62766, '231a':4948, '231b':4946, '23cf':62818, '23e9':62805, '23ea':62809, '23eb':62812, '23ec':62814, '23ed':62806, '23ee':62810, '23ef':62807, '23f0':4949, '23f1':4950, '23f2':4951, '23f3':4947, '23f8':62815, '23f9':62816, '23fa':62817, '24c2':62890, '25aa':62938, '25ab':62939, '25b6':62804, '25c0':62808, '25fb':62935, '25fc':62934, '25fd':62937, '25fe':62936, '260e':61184, '261d':1350, '262a':62784, '262e':62785, '262f':62781, '263a':120, '264a':62790, '264b':62791, '264c':62792, '264d':62793, '264e':62794, '264f':62795, '265f':51099, '267b':62844, '267e':62833, '267f':62732, '269b':62777, '269c':62845, '26a0':62742, '26a1':41016, '26a7':62827, '26aa':62924, '26ab':62923, '26b0':61359, '26b1':61361, '26bd':51051, '26be':51052, '26c4':41019, '26c5':4999, '26c8':41000, '26ce':62800, '26cf':61296, '26d1':61150, '26d3':61314, '26d4':62744, '26e9':4853, '26ea':4849, '26f0':4814, '26f1':41015, '26f2':4855, '26f3':51070, '26f4':4928, '26f5':4924, '26f7':1599, '26f8':51071, '26f9-200d-2640':1615, '26f9-200d-2642':1614, '26f9':1613, '26fa':4856, '26fd':4915, '270a':1354, '270b':1330, '270c':1339, '270d':1365, '270f':61258, '271d':62782, '274c':62853, '274e':62854, '2764-200d-1f525':1139, '2764-200d-1fa79':1140, '27a1':62757, '27b0':62855, '27bf':62856, '2b05':62761, '2b06':62755, '2b07':62759, '2b1b':62932, '2b1c':62933, '2b50':4994, '2b55':62849, '303d':62857, '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-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff':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-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3ff':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, '1f48f-1f3fb':0, '1f48f-1f3fc':0, '1f48f-1f3fd':0, '1f48f-1f3fe':0, '1f48f-1f3ff':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f491-1f3fb':0, '1f491-1f3fc':0, '1f491-1f3fd':0, '1f491-1f3fe':0, '1f491-1f3ff':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fe':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fe':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fe':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fe':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, '1f91d-1f3fb':0, '1f91d-1f3fc':0, '1f91d-1f3fd':0, '1f91d-1f3fe':0, '1f91d-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-200d-2640':0, '1f9d4-1f3fc-200d-2640':0, '1f9d4-1f3fd-200d-2640':0, '1f9d4-1f3fe-200d-2640':0, '1f9d4-1f3ff-200d-2640':0, '1f9d4-1f3fb-200d-2642':0, '1f9d4-1f3fc-200d-2642':0, '1f9d4-1f3fd-200d-2642':0, '1f9d4-1f3fe-200d-2642':0, '1f9d4-1f3ff-200d-2642':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}};\n\nconst Emoji: {[emoji: string]: number} = EmojiVersions[''];\nfor(const version in EmojiVersions) {\n if(version) {\n Object.assign(Emoji, EmojiVersions[version as EMOJI_VERSION]);\n }\n}\n\nexport default Emoji;\n\n/* Emoji[\"00a9-fe0f\"] = 6362;\nEmoji[\"00ae-fe0f\"] = 6363;\nEmoji[\"2122-fe0f\"] = 6364; */\n","/*\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 const FontFamily = 'Roboto, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif';\nexport const FontSize = '16px';\nexport const FontWeight = '400';\n","const IS_IMAGE_BITMAP_SUPPORTED = typeof(ImageBitmap) !== 'undefined';\n\nexport default IS_IMAGE_BITMAP_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\n// * Jolly Cobra's animation.ts\n\nimport {fastRaf} from './schedulers';\nimport deferredPromise, {CancellablePromise} from './cancellablePromise';\n\ninterface AnimationInstance {\n isCancelled: boolean;\n deferred: CancellablePromise\n}\n\ntype AnimationInstanceKey = any;\nconst instances: Map = new Map();\n\nexport function createAnimationInstance(key: AnimationInstanceKey) {\n cancelAnimationByKey(key);\n\n const instance: AnimationInstance = {\n isCancelled: false,\n deferred: deferredPromise()\n };\n\n instances.set(key, instance);\n instance.deferred.then(() => {\n if(getAnimationInstance(key) === instance) {\n instances.delete(key);\n }\n });\n\n return instance;\n}\n\nexport function getAnimationInstance(key: AnimationInstanceKey) {\n return instances.get(key);\n}\n\nexport function cancelAnimationByKey(key: AnimationInstanceKey) {\n const instance = getAnimationInstance(key);\n if(instance) {\n instance.isCancelled = true;\n instance.deferred.resolve();\n }\n}\n\nexport function animateSingle(tick: Function, key: AnimationInstanceKey, instance?: AnimationInstance) {\n if(!instance) {\n instance = createAnimationInstance(key);\n }\n\n fastRaf(() => {\n if(instance.isCancelled) {\n return;\n }\n\n if(tick()) {\n animateSingle(tick, key, instance);\n } else {\n instance.deferred.resolve();\n }\n });\n\n return instance.deferred;\n}\n\nexport function animate(tick: Function) {\n fastRaf(() => {\n if(tick()) {\n animate(tick);\n }\n });\n}\n","type K = boolean;\nexport default async function filterAsync(arr: T[], callback: (item: T, idx: number, arr: T[]) => Promise | K) {\n const promises = arr.map(async(item, idx, arr) => {\n if(await callback(item, idx, arr)) {\n return item;\n }\n });\n\n return (await Promise.all(promises)).filter(Boolean);\n}\n","export default function findAndSpliceAll(array: Array, verify: (value: T, index: number, arr: typeof array) => boolean) {\n const out: typeof array = [];\n let idx = -1;\n while((idx = array.findIndex(verify)) !== -1) {\n out.push(array.splice(idx, 1)[0]);\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\nconst ASSETS_PATH = 'assets/audio/';\n\nexport default class AudioAssetPlayer {\n private audio: HTMLAudioElement;\n private tempId: number;\n private assetName: AssetName;\n\n constructor(private assets: AssetName[]) {\n this.tempId = 0;\n }\n\n public playSound(name: AssetName, loop = false) {\n ++this.tempId;\n this.assetName = name;\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 playSoundIfDifferent(name: AssetName, loop?: boolean) {\n if(this.assetName !== name) {\n this.playSound(name, loop);\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 if(!this.audio) {\n return;\n }\n\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\nimport readBlobAs from './readBlobAs';\n\nexport default function readBlobAsDataURL(blob: Blob) {\n return readBlobAs(blob, 'readAsDataURL');\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 deferredPromise, {CancellablePromise} from './cancellablePromise';\nimport {getHeavyAnimationPromise} from '../hooks/useHeavyAnimationCheck';\nimport {fastRaf} from './schedulers';\nimport {ArgumentTypes} from '../types';\n\ntype HeavyQueue> = {\n items: ArgumentTypes[],\n process: (...args: any[]) => ReturnType,\n context: any,\n promise?: CancellablePromise[]>\n};\nconst heavyQueue: HeavyQueue[] = [];\nlet processingQueue = false;\n\nexport default function addHeavyTask>(queue: T, method: 'push' | 'unshift' = 'push') {\n if(!queue.items.length) {\n return Promise.resolve([]) as typeof promise;\n }\n\n const promise = queue.promise = deferredPromise();\n heavyQueue[method](queue);\n processHeavyQueue();\n\n return promise;\n}\n\nfunction processHeavyQueue() {\n if(!processingQueue) {\n const queue = heavyQueue.shift();\n timedChunk(queue).finally(() => {\n processingQueue = false;\n if(heavyQueue.length) {\n processHeavyQueue();\n }\n });\n }\n}\n\nfunction timedChunk>(queue: HeavyQueue) {\n if(!queue.items.length) {\n queue.promise.resolve([] as any);\n return Promise.resolve([]);\n }\n\n const todo = queue.items.slice();\n const results: ReturnType[] = [];\n\n return new Promise((resolve, reject) => {\n const f = async() => {\n const start = performance.now();\n\n do {\n await getHeavyAnimationPromise();\n const possiblePromise = queue.process.apply(queue.context, todo.shift());\n let realResult: typeof results[0];\n // @ts-ignore\n if(possiblePromise instanceof Promise) {\n try {\n realResult = await possiblePromise;\n } catch(err) {\n reject(err);\n return;\n }\n } else {\n realResult = possiblePromise;\n }\n\n results.push(realResult);\n } while(todo.length > 0 && (performance.now() - start) < 6);\n\n if(todo.length > 0) {\n fastRaf(f);\n // setTimeout(f, 25);\n } else {\n resolve(results);\n }\n };\n\n fastRaf(f);\n // setTimeout(f, 25);\n }).then(queue.promise.resolve, queue.promise.reject);\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 fastBlur from '../vendor/fastBlur';\nimport addHeavyTask from './heavyQueue';\nimport IS_CANVAS_FILTER_SUPPORTED from '../environment/canvasFilterSupport';\n\nconst RADIUS = 2;\nconst ITERATIONS = 2;\n\nlet requireBlurPromise: Promise;\nlet fastBlurFunc: typeof fastBlur;\nif(!IS_CANVAS_FILTER_SUPPORTED) {\n requireBlurPromise = import('../vendor/fastBlur').then((m) => {\n fastBlurFunc = m.default;\n });\n} else {\n requireBlurPromise = Promise.resolve();\n}\n\nfunction processBlurNext(\n img: HTMLImageElement,\n radius: number,\n iterations: number,\n canvas: HTMLCanvasElement = document.createElement('canvas')\n) {\n canvas.width = img.width;\n canvas.height = img.height;\n\n const ctx = canvas.getContext('2d', {alpha: false});\n if(IS_CANVAS_FILTER_SUPPORTED) {\n ctx.filter = `blur(${radius}px)`;\n ctx.drawImage(img, -radius * 2, -radius * 2, canvas.width + radius * 4, canvas.height + radius * 4);\n } else {\n ctx.drawImage(img, 0, 0);\n fastBlurFunc(ctx, 0, 0, canvas.width, canvas.height, radius, iterations);\n }\n\n return canvas;\n}\n\ntype CacheValue = {canvas: HTMLCanvasElement, promise: Promise};\nconst cache: Map = new Map();\nconst CACHE_SIZE = 150;\n\nexport default function blur(dataUri: string, radius: number = RADIUS, iterations: number = ITERATIONS) {\n if(!dataUri) {\n throw 'no dataUri for blur: ' + dataUri;\n }\n\n if(cache.size > CACHE_SIZE) {\n cache.clear();\n }\n\n const canvas = document.createElement('canvas');\n canvas.className = 'canvas-thumbnail';\n\n let cached = cache.get(dataUri);\n if(!cached) {\n const promise: CacheValue['promise'] = new Promise((resolve) => {\n // return resolve(dataUri);\n requireBlurPromise.then(() => {\n const img = new Image();\n img.onload = () => {\n // if(IS_CANVAS_FILTER_SUPPORTED) {\n // resolve(processBlurNext(img, radius, iterations));\n // } else {\n const promise = addHeavyTask({\n items: [[img, radius, iterations, canvas]],\n context: null,\n process: processBlurNext\n }, 'unshift');\n\n promise.then(() => {\n resolve();\n });\n // }\n };\n img.src = dataUri;\n });\n });\n\n cache.set(dataUri, cached = {\n canvas,\n promise\n });\n } else {\n canvas.width = cached.canvas.width;\n canvas.height = cached.canvas.height;\n cached.promise.then(() => {\n canvas.getContext('2d').drawImage(cached.canvas, 0, 0, canvas.width, canvas.height);\n });\n }\n\n return {\n ...cached,\n canvas\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 bytesFromHex from './bytesFromHex';\nimport bytesToDataURL from './bytesToDataURL';\nimport convertToUint8Array from './convertToUint8Array';\n\nconst JPEG_HEADER_HEX = 'ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e19282321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aadaad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c353c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc00011080000000003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00';\n\nconst JPEG_HEADER = bytesFromHex(JPEG_HEADER_HEX);\nconst JPEG_TAIL = bytesFromHex('ffd9');\n\nexport function getPreviewBytesFromURL(url: string) {\n const needle = 'base64,';\n const sliced = url.slice(url.indexOf(needle) + needle.length);\n const jpegBytes = [...atob(sliced)].map((char) => char.charCodeAt(0));\n\n return new Uint8Array(jpegBytes);\n // console.log('getPreviewBytesFromURL', bytesToHex(jpegBytes));\n\n // const n = JPEG_HEADER_HEX.slice(-10);\n // const one = jpegBytes[164];\n // const two = jpegBytes[166];\n\n // const body = jpegBytes.slice(bytesToHex(jpegBytes).indexOf(n) / 2 + n.length / 2/* JPEG_HEADER.length */, jpegBytes.length - JPEG_TAIL.length);\n // const original = new Uint8Array([\n // 0xFF,\n // one,\n // two,\n // ...body\n // ]);\n\n // console.log(bytesToHex(body));\n\n // return original;\n}\n\nexport default function getPreviewURLFromBytes(bytes: Uint8Array | number[], isSticker = false) {\n let arr: Uint8Array;\n if(!isSticker && bytes[0] === 0x1) {\n arr = new Uint8Array(JPEG_HEADER.concat(Array.from(bytes.slice(3)), JPEG_TAIL));\n arr[164] = bytes[1];\n arr[166] = bytes[2];\n } else {\n arr = convertToUint8Array(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 dataURL = bytesToDataURL(arr, mimeType);\n return dataURL;\n}\n","export default function bytesToDataURL(bytes: Uint8Array, mimeType: string = 'image/jpeg') {\n return `data:${mimeType};base64,${btoa(String.fromCharCode(...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 * 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 {makeMediaSize} from './mediaSize';\n\nexport default function calcImageInBox(imageW: number, imageH: number, boxW: number, boxH: number, noZoom = true) {\n if(imageW < boxW && imageH < boxH && noZoom) {\n return makeMediaSize(imageW, imageH);\n }\n\n let boxedImageW = boxW;\n let boxedImageH = boxH;\n\n if((imageW / imageH) > (boxW / boxH)) {\n boxedImageH = (imageH * boxW / imageW) | 0;\n } else {\n boxedImageW = (imageW * boxH / imageH) | 0;\n if(boxedImageW > boxW) {\n boxedImageH = (boxedImageH * boxW / boxedImageW) | 0;\n boxedImageW = boxW;\n }\n }\n\n // if (Config.Navigator.retina) {\n // imageW = Math.floor(imageW / 2)\n // imageH = Math.floor(imageH / 2)\n // }\n\n if(noZoom && boxedImageW >= imageW && boxedImageH >= imageH) {\n boxedImageW = imageW;\n boxedImageH = imageH;\n }\n\n return makeMediaSize(boxedImageW, boxedImageH);\n}\n\nMOUNT_CLASS_TO.calcImageInBox = calcImageInBox;\n","export default function drawCircle(ctx: CanvasRenderingContext2D, x: number, y: number, radius: number, fill?: boolean, stroke?: boolean) {\n const dpr = ctx.canvas.dpr;\n if(dpr) {\n x *= dpr;\n y *= dpr;\n radius *= dpr;\n }\n\n ctx.beginPath();\n ctx.arc(x, y, radius, 0, 2 * Math.PI, false);\n ctx.closePath();\n\n if(fill) {\n ctx.fill();\n }\n\n if(stroke) {\n ctx.stroke();\n }\n}\n\nexport function drawCircleFromStart(ctx: CanvasRenderingContext2D, x: number, y: number, radius: number, fill?: boolean, stroke?: boolean) {\n return drawCircle(ctx, x + radius, y + radius, radius, fill, stroke);\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 { MOUNT_CLASS_TO } from \"../../config/debug\";\n\nlet context: CanvasRenderingContext2D;\n/**\n * Get the text width\n * @param {string} text\n * @param {string} font\n */\nexport default function getTextWidth(text: string, font: string) {\n // const perf = performance.now();\n if(!context) {\n const canvas = document.createElement('canvas');\n context = canvas.getContext('2d', {alpha: false});\n }\n\n if(context.font !== font) {\n context.font = font;\n }\n\n // context.font = font;\n const metrics = context.measureText(text);\n // console.log('getTextWidth perf:', performance.now() - perf);\n return metrics.width;\n // return Math.round(metrics.width);\n}\n\n// MOUNT_CLASS_TO && (MOUNT_CLASS_TO.getTextWidth = getTextWidth);\n","import type {MediaSize} from '../mediaSize';\nimport IS_IMAGE_BITMAP_SUPPORTED from '../../environment/imageBitmapSupport';\n\nexport default function scaleMediaElement(options: T): Promise {\n return new Promise(async(resolve) => {\n const canvas = document.createElement('canvas');\n const size = options.size ?? options.mediaSize.aspectFitted(options.boxSize);\n const dpr = window.devicePixelRatio && 1;\n canvas.width = size.width * dpr;\n canvas.height = size.height * dpr;\n const ctx = canvas.getContext('2d');\n\n let source: CanvasImageSource;\n if(IS_IMAGE_BITMAP_SUPPORTED) {\n source = await createImageBitmap(options.media, {resizeWidth: size.width, resizeHeight: size.height});\n } else {\n source = options.media;\n }\n\n ctx.drawImage(source, 0, 0, canvas.width, canvas.height);\n\n if(IS_IMAGE_BITMAP_SUPPORTED) {\n (source as ImageBitmap)?.close();\n }\n\n const mimeType = options.mimeType ?? 'image/jpeg';\n const quality = options.quality ?? 1;\n if(options.toDataURL) {\n const url = canvas.toDataURL(mimeType, quality);\n resolve({url, size} as any);\n } else {\n canvas.toBlob((blob) => {\n resolve({blob, size} as any);\n }, mimeType, quality);\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/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport LatinizeMap from '../config/latinizeMap';\n\nexport const badCharsRe = /[`~!@#$%^&*()\\-_=+\\[\\]\\\\|{}'\";:\\/?.>,<]+/g;\nconst trimRe = /^\\s+|\\s$/g;\n\nconst C2L: {[k: string]: string} = {\n 'ะน': 'q',\n 'ั†': 'w',\n 'ัƒ': 'e',\n 'ะบ': 'r',\n 'ะต': 't',\n 'ะฝ': 'y',\n 'ะณ': 'u',\n 'ัˆ': 'i',\n 'ั‰': 'o',\n 'ะท': 'p',\n 'ั…': '[',\n 'ัŠ': ']',\n 'ั„': 'a',\n 'ั‹': 's',\n 'ะฒ': 'd',\n 'ะฐ': 'f',\n 'ะฟ': 'g',\n 'ั€': 'h',\n 'ะพ': 'j',\n 'ะป': 'k',\n 'ะด': 'l',\n 'ะถ': ';',\n 'ั': '\\'',\n 'ั': 'z',\n 'ั‡': 'x',\n 'ั': 'c',\n 'ะผ': 'v',\n 'ะธ': 'b',\n 'ั‚': 'n',\n 'ัŒ': 'm',\n 'ะฑ': ',',\n 'ัŽ': '.',\n '.': '/'\n};\n\nexport function clearBadCharsAndTrim(text: string) {\n return text.replace(badCharsRe, '').replace(trimRe, '');\n}\n\nexport function fixCyrillic(text: string) {\n return text.toLowerCase().replace(/[\\wะฐ-ั]/g, (ch) => {\n const latinizeCh = C2L[ch];\n return latinizeCh ?? ch;\n });\n}\n\nexport function latinizeString(text: string) {\n return text.replace(/[^A-Za-z0-9]/g, (ch) => {\n const latinizeCh = LatinizeMap[ch];\n return latinizeCh ?? ch;\n });\n}\n\nexport default function cleanSearchText(text: string, latinize = true) {\n return processSearchText(text, {\n clearBadChars: true,\n latinize,\n ignoreCase: true\n });\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 const originalText = text;\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 if(options.latinize) text += '\\x01' + fixCyrillic(originalText);\n return text;\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://stackoverflow.com/a/30810322\nfunction fallbackCopyTextToClipboard(text: string) {\n var textArea = document.createElement('textarea');\n textArea.value = text;\n\n // Avoid scrolling to bottom\n textArea.style.top = '0';\n textArea.style.left = '0';\n textArea.style.position = 'fixed';\n\n document.body.appendChild(textArea);\n textArea.focus();\n textArea.select();\n\n try {\n document.execCommand('copy');\n // const successful = document.execCommand('copy');\n // const msg = successful ? 'successful' : 'unsuccessful';\n // console.log('Fallback: Copying text command was ' + msg);\n } catch(err) {\n // console.error('Fallback: Oops, unable to copy', err);\n }\n\n document.body.removeChild(textArea);\n}\n\nexport function copyTextToClipboard(text: string) {\n if(!navigator.clipboard) {\n fallbackCopyTextToClipboard(text);\n return;\n }\n\n navigator.clipboard.writeText(text).catch((err) => {\n console.error('clipboard error', err);\n fallbackCopyTextToClipboard(text);\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_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport mediaSizes from './mediaSizes';\nimport OverlayClickHandler from './overlayClickHandler';\n\nclass ContextMenuController extends OverlayClickHandler {\n constructor() {\n super('menu', true);\n\n mediaSizes.addEventListener('resize', () => {\n if(this.element) {\n this.close();\n }\n\n /* if(openedMenu && (openedMenu.style.top || openedMenu.style.left)) {\n const rect = openedMenu.getBoundingClientRect();\n const {innerWidth, innerHeight} = window;\n\n console.log(innerWidth, innerHeight, rect);\n } */\n });\n }\n\n public isOpened() {\n return !!this.element;\n }\n\n private onMouseMove = (e: MouseEvent) => {\n const rect = this.element.getBoundingClientRect();\n const {clientX, clientY} = e;\n\n const diffX = clientX >= rect.right ? clientX - rect.right : rect.left - clientX;\n const diffY = clientY >= rect.bottom ? clientY - rect.bottom : rect.top - clientY;\n\n if(diffX >= 100 || diffY >= 100) {\n this.close();\n // openedMenu.parentElement.click();\n }\n // console.log('mousemove', diffX, diffY);\n };\n\n public close() {\n if(this.element) {\n this.element.classList.remove('active');\n this.element.parentElement.classList.remove('menu-open');\n }\n\n super.close();\n\n if(!IS_TOUCH_SUPPORTED) {\n window.removeEventListener('mousemove', this.onMouseMove);\n }\n }\n\n public openBtnMenu(element: HTMLElement, onClose?: () => void) {\n super.open(element);\n\n this.element.classList.add('active', 'was-open');\n this.element.parentElement.classList.add('menu-open');\n\n if(onClose) {\n this.addEventListener('toggle', onClose, {once: true});\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n window.addEventListener('mousemove', this.onMouseMove);\n }\n }\n}\n\nconst contextMenuController = new ContextMenuController();\nexport default contextMenuController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport I18n, {i18n} from '../lib/langPack';\n\nexport const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\nexport const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n\nexport const ONE_DAY = 86400;\n\n// https://stackoverflow.com/a/6117889\nexport const getWeekNumber = (date: Date) => {\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\n const dayNum = d.getUTCDay() || 7;\n d.setUTCDate(d.getUTCDate() + 4 - dayNum);\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\n return Math.ceil((((d.getTime() - yearStart.getTime()) / ONE_DAY) + 1) / 7);\n};\n\nexport function formatDateAccordingToTodayNew(time: Date) {\n const today = new Date();\n const now = today.getTime() / 1000 | 0;\n const timestamp = time.getTime() / 1000 | 0;\n\n const options: Intl.DateTimeFormatOptions = {};\n if((now - timestamp) < ONE_DAY && today.getDate() === time.getDate()) { // if the same day\n options.hour = options.minute = '2-digit';\n } else if(today.getFullYear() !== time.getFullYear()) { // different year\n options.year = options.day = 'numeric';\n options.month = '2-digit';\n } else if((now - timestamp) < (ONE_DAY * 7) && getWeekNumber(today) === getWeekNumber(time)) { // current week\n options.weekday = 'short';\n } else { // same year\n options.month = 'short';\n options.day = 'numeric';\n }\n\n return new I18n.IntlDateElement({\n date: time,\n options\n }).element;\n}\n\nexport function formatFullSentTimeRaw(timestamp: number, options: {\n capitalize?: boolean\n} = {}) {\n const date = new Date();\n const time = new Date(timestamp * 1000);\n const now = date.getTime() / 1000;\n\n const timeEl = formatTime(time);\n\n let dateEl: Node | string;\n if((now - timestamp) < ONE_DAY && date.getDate() === time.getDate()) { // if the same day\n dateEl = i18n(options.capitalize ? 'Date.Today' : 'Peer.Status.Today');\n } else if((now - timestamp) < (ONE_DAY * 2) && (date.getDate() - 1) === time.getDate()) { // yesterday\n dateEl = i18n(options.capitalize ? 'Yesterday' : 'Peer.Status.Yesterday');\n\n if(options.capitalize) {\n (dateEl as HTMLElement).style.textTransform = 'capitalize';\n }\n } else if(date.getFullYear() !== time.getFullYear()) { // different year\n dateEl = new I18n.IntlDateElement({\n date: time,\n options: {\n month: 'short',\n day: 'numeric',\n year: 'numeric'\n }\n }).element;\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate() + ', ' + time.getFullYear();\n } else {\n dateEl = new I18n.IntlDateElement({\n date: time,\n options: {\n month: 'short',\n day: 'numeric'\n }\n }).element;\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate();\n }\n\n return {dateEl, timeEl};\n}\n\nexport function formatFullSentTime(timestamp: number) {\n const {dateEl, timeEl} = formatFullSentTimeRaw(timestamp, {\n capitalize: true\n });\n\n const fragment = document.createDocumentFragment();\n fragment.append(dateEl, ' ', i18n('ScheduleController.at'), ' ', timeEl);\n return fragment;\n}\n\nexport function formatTime(date: Date) {\n return new I18n.IntlDateElement({\n date,\n options: {\n hour: '2-digit',\n minute: '2-digit'\n }\n }).element;\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.formatDateAccordingToTodayNew = formatDateAccordingToTodayNew);\n\nexport const getFullDate = (date: Date, options: Partial<{\n noTime: true,\n noSeconds: true,\n monthAsNumber: true,\n leadingZero: true\n}> = {}) => {\n const joiner = options.monthAsNumber ? '.' : ' ';\n const time = ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2) + (options.noSeconds ? '' : ':' + ('0' + date.getSeconds()).slice(-2));\n\n return (options.leadingZero ? ('0' + date.getDate()).slice(-2) : date.getDate()) +\n joiner + (options.monthAsNumber ? ('0' + (date.getMonth() + 1)).slice(-2) : months[date.getMonth()]) +\n joiner + date.getFullYear() +\n (options.noTime ? '' : ', ' + time);\n};\n\n// https://github.com/DrKLO/Telegram/blob/d52b2c921abd3c1e8d6368858313ad0cb0468c07/TMessagesProj/src/main/java/org/telegram/ui/Adapters/FiltersView.java\nconst minYear = 2013;\nconst yearPattern = new RegExp('20[0-9]{1,2}');\nconst monthYearOrDayPattern = new RegExp('(\\\\w{3,}) ([0-9]{0,4})', 'i');\nconst yearOrDayAndMonthPattern = new RegExp('([0-9]{0,4}) (\\\\w{2,})', 'i');\nconst shortDate = new RegExp('^([0-9]{1,4})(\\\\.| |/|\\\\-)([0-9]{1,4})$', 'i');\nconst longDate = new RegExp('^([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,4})$', 'i');\nconst numberOfDaysEachMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\nexport type DateData = {\n title: string,\n minDate: number,\n maxDate: number,\n};\nexport function fillTipDates(query: string, dates: DateData[]) {\n const q = query.trim().toLowerCase();\n\n if(q.length < 3) {\n return;\n }\n\n if('today'.indexOf(q) === 0) {\n const date = new Date();\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: 'Today',\n minDate,\n maxDate\n });\n return;\n }\n\n if('yesterday'.indexOf(q) === 0) {\n const date = new Date();\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime() - 86400000;\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 86400001;\n dates.push({\n title: 'Yesterday',\n minDate,\n maxDate\n });\n return;\n }\n\n const dayOfWeek = getDayOfWeek(q);\n if(dayOfWeek >= 0) {\n const date = new Date();\n const now = date.getTime();\n const currentDay = date.getDay();\n const distance = dayOfWeek - currentDay;\n date.setDate(date.getDate() + distance);\n if(date.getTime() > now) {\n date.setTime(date.getTime() - 604800000);\n }\n const year = date.getFullYear()\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: formatWeekLong(minDate),\n minDate,\n maxDate\n });\n return;\n }\n\n let matches: any[];\n if((matches = shortDate.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[3];\n const k = parseInt(g1);\n const k1 = parseInt(g2);\n if(k > 0 && k <= 31) {\n if(k1 >= minYear && k <= 12) {\n const selectedYear = k1;\n const month = k - 1;\n createForMonthYear(dates, month, selectedYear);\n return;\n } else if(k1 <= 12) {\n const day = k - 1;\n const month = k1 - 1;\n createForDayMonth(dates, day, month);\n }\n } else if(k >= minYear && k1 <= 12) {\n const selectedYear = k;\n const month = k1 - 1;\n createForMonthYear(dates, month, selectedYear);\n }\n\n return;\n }\n\n if((matches = longDate.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[3];\n const g3 = matches[5];\n if(!matches[2] === matches[4]) {\n return;\n }\n\n const day = parseInt(g1);\n const month = parseInt(g2) - 1;\n let year = parseInt(g3);\n if(year >= 10 && year <= 99) {\n year += 2000;\n }\n\n const currentYear = new Date().getFullYear();\n if(validDateForMonth(day - 1, month) && year >= minYear && year <= currentYear) {\n const date = new Date();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: formatterYearMax(minDate),\n minDate,\n maxDate\n });\n return;\n }\n\n return;\n }\n\n if((matches = yearPattern.exec(q)) !== null) {\n let selectedYear = +q;\n const currentYear = new Date().getFullYear();\n if(selectedYear < minYear) {\n selectedYear = minYear;\n for(let i = currentYear; i >= selectedYear; i--) {\n const date = new Date();\n date.setFullYear(i, 0, 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(i + 1, 0, 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: '' + i,\n minDate,\n maxDate\n });\n }\n } else if(selectedYear <= currentYear) {\n const date = new Date();\n date.setFullYear(selectedYear, 0, 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(selectedYear + 1, 0, 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: '' + selectedYear,\n minDate,\n maxDate\n });\n }\n\n return;\n }\n\n if((matches = monthYearOrDayPattern.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[2];\n const month = getMonth(g1);\n if(month >= 0) {\n const k = +g2;\n if(k > 0 && k <= 31) {\n const day = k - 1;\n createForDayMonth(dates, day, month);\n return;\n } else if(k >= minYear) {\n const selectedYear = k;\n createForMonthYear(dates, month, selectedYear);\n return;\n }\n }\n }\n\n if((matches = yearOrDayAndMonthPattern.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[2];\n const month = getMonth(g2);\n if(month >= 0) {\n const k = +g1;\n if(k > 0 && k <= 31) {\n const day = k - 1;\n createForDayMonth(dates, day, month);\n return;\n } else if(k >= minYear) {\n const selectedYear = k;\n createForMonthYear(dates, month, selectedYear);\n }\n }\n }\n}\n\nfunction createForMonthYear(dates: DateData[], month: number, selectedYear: number) {\n const currentYear = new Date().getFullYear();\n const today = Date.now();\n if(selectedYear >= minYear && selectedYear <= currentYear) {\n const date = new Date();\n date.setFullYear(selectedYear, month, 1);\n date.setHours(0, 0, 0);\n const minDate = date.getTime();\n if(minDate > today) {\n return;\n }\n date.setMonth(date.getMonth() + 1);\n const maxDate = date.getTime() - 1;\n\n dates.push({\n title: formatterMonthYear(minDate),\n minDate,\n maxDate\n });\n }\n}\n\nfunction createForDayMonth(dates: DateData[], day: number, month: number) {\n if(validDateForMonth(day, month)) {\n const currentYear = new Date().getFullYear();\n const today = Date.now();\n\n for(let i = currentYear; i >= minYear; i--) {\n if(month === 1 && day === 28 && !isLeapYear(i)) {\n continue;\n }\n\n const date = new Date();\n date.setFullYear(i, month, day + 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n if(minDate > today) {\n continue;\n }\n\n date.setFullYear(i, month, day + 2);\n date.setHours(0, 0, 0);\n const maxDate = date.getTime() - 1;\n if(i === currentYear) {\n dates.push({\n title: formatterDayMonth(minDate),\n minDate,\n maxDate\n });\n } else {\n dates.push({\n title: formatterYearMax(minDate),\n minDate,\n maxDate\n });\n }\n }\n }\n}\n\nfunction formatterMonthYear(timestamp: number) {\n const date = new Date(timestamp);\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getFullYear();\n}\n\nfunction formatterDayMonth(timestamp: number) {\n const date = new Date(timestamp);\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getDate();\n}\n\nfunction formatterYearMax(timestamp: number) {\n const date = new Date(timestamp);\n return ('0' + date.getDate()).slice(-2) + '.' + ('0' + (date.getMonth() + 1)).slice(-2) + '.' + date.getFullYear();\n}\n\nfunction formatWeekLong(timestamp: number) {\n const date = new Date(timestamp);\n return days[date.getDay()];\n}\n\nfunction validDateForMonth(day: number, month: number) {\n if(month >= 0 && month < 12) {\n if(day >= 0 && day < numberOfDaysEachMonth[month]) {\n return true;\n }\n }\n return false;\n}\n\nfunction isLeapYear(year: number) {\n return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);\n}\n\nfunction getMonth(q: string) {\n /* String[] months = new String[]{\n LocaleController.getString(\"January\", R.string.January).toLowerCase(),\n LocaleController.getString(\"February\", R.string.February).toLowerCase(),\n LocaleController.getString(\"March\", R.string.March).toLowerCase(),\n LocaleController.getString(\"April\", R.string.April).toLowerCase(),\n LocaleController.getString(\"May\", R.string.May).toLowerCase(),\n LocaleController.getString(\"June\", R.string.June).toLowerCase(),\n LocaleController.getString(\"July\", R.string.July).toLowerCase(),\n LocaleController.getString(\"August\", R.string.August).toLowerCase(),\n LocaleController.getString(\"September\", R.string.September).toLowerCase(),\n LocaleController.getString(\"October\", R.string.October).toLowerCase(),\n LocaleController.getString(\"November\", R.string.November).toLowerCase(),\n LocaleController.getString(\"December\", R.string.December).toLowerCase()\n }; */\n\n /* String[] monthsEng = new String[12];\n Calendar c = Calendar.getInstance();\n for (int i = 1; i <= 12; i++) {\n c.set(0, 0, 0, 0, 0, 0);\n c.set(Calendar.MONTH, i);\n monthsEng[i - 1] = c.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH).toLowerCase();\n } */\n\n q = q.toLowerCase();\n for(let i = 0; i < 12; i++) {\n const month = months[i].toLowerCase();\n if(month.indexOf(q) === 0) {\n return i;\n }\n }\n return -1;\n}\n\nfunction getDayOfWeek(q: string) {\n const c = new Date();\n if(q.length <= 3) {\n return -1;\n }\n\n for(let i = 0; i < 7; i++) {\n c.setDate(c.getDate() + 1);\n\n if(formatWeekLong(c.getTime()).toLowerCase().indexOf(q) === 0) {\n return c.getDay();\n }\n }\n return -1;\n}\n\nMOUNT_CLASS_TO.fillTipDates = fillTipDates;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {toastNew} from '../../components/toast';\nimport {LangPackKey} from '../../lib/langPack';\nimport {copyTextToClipboard} from '../clipboard';\nimport cancelEvent from './cancelEvent';\nimport {attachClickEvent} from './clickEvent';\n\nconst T_ME = 'https://t.me/';\nexport default function anchorCopy(options: Partial<{\n // href: string,\n mePath: string,\n username: string\n}> = {}) {\n const anchor = document.createElement('a');\n anchor.classList.add('anchor-copy');\n\n let copyWhat: string, copyText: LangPackKey = 'LinkCopied';\n if(options.mePath) {\n const href = T_ME + options.mePath;\n copyWhat = anchor.href = anchor.innerText = href;\n }\n\n if(options.username) {\n const href = T_ME + options.username;\n anchor.href = href;\n copyWhat = anchor.innerText = '@' + options.username;\n copyText = 'UsernameCopied';\n }\n\n attachClickEvent(anchor, (e) => {\n cancelEvent(e);\n copyTextToClipboard(copyWhat ?? anchor.href);\n toastNew({langPackKey: copyText});\n });\n\n return anchor;\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_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport {IS_APPLE} from '../../environment/userAgent';\nimport contextMenuController from '../contextMenuController';\nimport ListenerSetter, {ListenerOptions} from '../listenerSetter';\nimport cancelEvent from './cancelEvent';\n\nlet _cancelContextMenuOpening = false, _cancelContextMenuOpeningTimeout = 0;\nexport function cancelContextMenuOpening() {\n if(_cancelContextMenuOpeningTimeout) {\n clearTimeout(_cancelContextMenuOpeningTimeout);\n }\n\n _cancelContextMenuOpeningTimeout = window.setTimeout(() => {\n _cancelContextMenuOpeningTimeout = 0;\n _cancelContextMenuOpening = false;\n }, .4e3);\n\n _cancelContextMenuOpening = true;\n}\n\nexport function attachContextMenuListener({\n element,\n callback,\n listenerSetter,\n listenerOptions\n}: {\n element: HTMLElement,\n callback: (e: TouchEvent | MouseEvent) => void,\n listenerSetter?: ListenerSetter,\n listenerOptions?: ListenerOptions\n}) {\n const add = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, element) : element.removeEventListener.bind(element);\n\n // can't cancel further events coming after 'contextmenu' event\n if((IS_APPLE && IS_TOUCH_SUPPORTED) || listenerOptions) {\n let timeout: number;\n\n const options: EventListenerOptions = {\n ...(listenerOptions || {}),\n capture: true\n };\n\n const onCancel = () => {\n clearTimeout(timeout);\n // @ts-ignore\n remove('touchmove', onCancel, options);\n // @ts-ignore\n remove('touchend', onCancel, options);\n // @ts-ignore\n remove('touchcancel', onCancel, options);\n };\n\n add('touchstart', (e: TouchEvent) => {\n if(e.touches.length > 1) {\n onCancel();\n return;\n }\n\n add('touchmove', onCancel, options);\n add('touchend', onCancel, options);\n add('touchcancel', onCancel, options);\n\n timeout = window.setTimeout(() => {\n if(_cancelContextMenuOpening) {\n onCancel();\n return;\n }\n\n callback(e);\n onCancel();\n\n if(contextMenuController.isOpened()) {\n add('touchend', cancelEvent, {once: true}); // * fix instant closing\n }\n }, .4e3);\n }, listenerOptions);\n\n /* if(!isSafari) {\n add('contextmenu', (e: any) => {\n cancelEvent(e);\n }, {passive: false, capture: true});\n } */\n } else {\n add('contextmenu', IS_TOUCH_SUPPORTED ? (e: any) => {\n callback(e);\n\n if(contextMenuController.isOpened()) {\n add('touchend', cancelEvent, {once: true}); // * fix instant closing\n }\n } : callback, listenerOptions);\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 type GrabEvent = {x: number, y: number, isTouch?: boolean, event: TouchEvent | MouseEvent};\n\nexport default function attachGrabListeners(element: HTMLElement,\n onStart: (position: GrabEvent) => void,\n onMove: (position: GrabEvent) => void,\n onEnd?: (position: GrabEvent) => void) {\n // * Mouse\n const onMouseMove = (event: MouseEvent) => {\n onMove({x: event.pageX, y: event.pageY, event});\n };\n\n const onMouseUp = (event: MouseEvent) => {\n document.removeEventListener('mousemove', onMouseMove);\n element.addEventListener('mousedown', onMouseDown, {once: true});\n onEnd?.({x: event.pageX, y: event.pageY, event});\n };\n\n const onMouseDown = (event: MouseEvent) => {\n if(event.button !== 0) {\n element.addEventListener('mousedown', onMouseDown, {once: true});\n return;\n }\n\n onStart({x: event.pageX, y: event.pageY, event});\n onMouseMove(event);\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp, {once: true});\n };\n\n element.addEventListener('mousedown', onMouseDown, {once: true});\n\n // * Touch\n const onTouchMove = (event: TouchEvent) => {\n event.preventDefault();\n onMove({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\n };\n\n const onTouchEnd = (event: TouchEvent) => {\n document.removeEventListener('touchmove', onTouchMove);\n element.addEventListener('touchstart', onTouchStart, {passive: false, once: true});\n const touch = event.touches[0] || event.changedTouches[0];\n onEnd?.({x: touch.clientX, y: touch.clientY, isTouch: true, event});\n };\n\n const onTouchStart = (event: TouchEvent) => {\n onStart({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\n onTouchMove(event);\n\n document.addEventListener('touchmove', onTouchMove, {passive: false});\n document.addEventListener('touchend', onTouchEnd, {passive: false, once: true});\n };\n\n element.addEventListener('touchstart', onTouchStart, {passive: false, once: true});\n\n return () => {\n element.removeEventListener('mousedown', onMouseDown);\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n\n element.removeEventListener('touchstart', onTouchStart);\n document.removeEventListener('touchmove', onTouchMove);\n document.removeEventListener('touchend', onTouchEnd);\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 cancelSelection() {\n if(window.getSelection) {\n if(window.getSelection().empty) { // Chrome\n window.getSelection().empty();\n } else if(window.getSelection().removeAllRanges) { // Firefox\n window.getSelection().removeAllRanges();\n }\n // @ts-ignore\n } else if(document.selection) { // IE?\n // @ts-ignore\n document.selection.empty();\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 ListenerSetter from '../listenerSetter';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport simulateEvent from './dispatchEvent';\n\nexport const CLICK_EVENT_NAME: 'mousedown' /* | 'touchend' */ | 'click' = (IS_TOUCH_SUPPORTED ? 'mousedown' : 'click') as any;\nexport type AttachClickOptions = AddEventListenerOptions & Partial<{listenerSetter: ListenerSetter, touchMouseDown: true}>;\nexport function attachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options: AttachClickOptions = {}) {\n const add = options.listenerSetter ? options.listenerSetter.add(elem) : elem.addEventListener.bind(elem);\n const remove = options.listenerSetter ? options.listenerSetter.removeManual.bind(options.listenerSetter, elem) : elem.removeEventListener.bind(elem);\n\n options.touchMouseDown = true;\n /* if(options.touchMouseDown && CLICK_EVENT_NAME === 'touchend') {\n add('mousedown', callback, options);\n } else if(CLICK_EVENT_NAME === 'touchend') {\n const o = {...options, once: true};\n\n const onTouchStart = (e: TouchEvent) => {\n const onTouchMove = (e: TouchEvent) => {\n remove('touchmove', onTouchMove, o);\n remove('touchend', onTouchEnd, o);\n };\n\n const onTouchEnd = (e: TouchEvent) => {\n remove('touchmove', onTouchMove, o);\n callback(e);\n if(options.once) {\n remove('touchstart', onTouchStart);\n }\n };\n\n add('touchend', onTouchEnd, o);\n add('touchmove', onTouchMove, o);\n };\n\n add('touchstart', onTouchStart);\n } else {\n add(CLICK_EVENT_NAME, callback, options);\n } */\n add(CLICK_EVENT_NAME, callback, options);\n\n // @ts-ignore\n return () => remove(CLICK_EVENT_NAME, callback, options);\n}\n\nexport function detachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options?: AddEventListenerOptions) {\n // if(CLICK_EVENT_NAME === 'touchend') {\n // elem.removeEventListener('touchstart', callback, options);\n // } else {\n elem.removeEventListener(CLICK_EVENT_NAME, callback as any, options);\n // }\n}\n\nexport function simulateClickEvent(elem: HTMLElement) {\n simulateEvent(elem, CLICK_EVENT_NAME);\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_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport EventListenerBase from '../eventListenerBase';\nimport ListenerSetter from '../listenerSetter';\nimport safeAssign from '../object/safeAssign';\nimport findUpClassName from './findUpClassName';\n\nexport default class ControlsHover extends EventListenerBase<{\n toggleControls: (show: boolean) => void\n}> {\n protected hideControlsTimeout: number;\n protected controlsLocked: boolean;\n\n protected canHideControls: () => boolean;\n protected element: HTMLElement;\n protected listenerSetter: ListenerSetter;\n protected showOnLeaveToClassName: string;\n protected ignoreClickClassName: string;\n\n constructor() {\n super(false);\n this.hideControlsTimeout = 0;\n }\n\n public setup(options: {\n element: HTMLElement,\n listenerSetter: ListenerSetter,\n canHideControls?: () => boolean,\n showOnLeaveToClassName?: string,\n ignoreClickClassName?: string\n }) {\n safeAssign(this, options);\n\n const {listenerSetter, element} = this;\n\n if(IS_TOUCH_SUPPORTED) {\n listenerSetter.add(element)('click', (e) => {\n if(this.ignoreClickClassName && findUpClassName(e.target, this.ignoreClickClassName)) {\n return;\n }\n\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 = (setHideTimeout = false) => {\n if(setHideTimeout) {\n if(!this.hideControlsTimeout) {\n this.hideControlsTimeout = window.setTimeout(this.hideControls, 3e3);\n }\n\n return;\n }\n\n clearTimeout(this.hideControlsTimeout);\n this.hideControlsTimeout = 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.hideControlsTimeout) {\n clearTimeout(this.hideControlsTimeout);\n this.hideControlsTimeout = 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.hideControlsTimeout = 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 ButtonMenu, {ButtonMenuItemOptionsVerifiable} from '../../components/buttonMenu';\nimport filterAsync from '../array/filterAsync';\nimport contextMenuController from '../contextMenuController';\nimport ListenerSetter from '../listenerSetter';\nimport {getMiddleware} from '../middleware';\nimport positionMenu from '../positionMenu';\nimport {attachContextMenuListener} from './attachContextMenuListener';\n\nexport default function createContextMenu({\n buttons,\n findElement,\n listenTo,\n appendTo,\n filterButtons,\n onOpen,\n onClose,\n onBeforeOpen,\n listenerSetter: attachListenerSetter\n}: {\n buttons: T[],\n findElement?: (e: MouseEvent | TouchEvent) => HTMLElement,\n listenTo: HTMLElement,\n appendTo?: HTMLElement,\n filterButtons?: (buttons: T[]) => Promise,\n onOpen?: (target: HTMLElement) => any,\n onClose?: () => any,\n onBeforeOpen?: () => any,\n listenerSetter?: ListenerSetter\n}) {\n appendTo ??= document.body;\n\n attachListenerSetter ??= new ListenerSetter();\n const listenerSetter = new ListenerSetter();\n const middleware = getMiddleware();\n let element: HTMLElement;\n\n attachContextMenuListener({\n element: listenTo,\n callback: (e) => {\n const target = findElement ? findElement(e as any) : listenTo;\n if(!target) {\n return;\n }\n\n let _element = element;\n if(e instanceof MouseEvent || e.hasOwnProperty('preventDefault')) (e as any).preventDefault();\n if(_element && _element.classList.contains('active')) {\n return false;\n }\n if(e instanceof MouseEvent || e.hasOwnProperty('cancelBubble')) (e as any).cancelBubble = true;\n\n const r = async() => {\n await onOpen?.(target);\n\n const initResult = await init();\n if(!initResult) {\n return;\n }\n\n _element = initResult.element;\n const {cleanup, destroy} = initResult;\n\n positionMenu(e, _element);\n contextMenuController.openBtnMenu(_element, () => {\n onClose?.();\n cleanup();\n\n setTimeout(() => {\n destroy();\n }, 300);\n });\n };\n\n r();\n },\n listenerSetter: attachListenerSetter\n });\n\n const cleanup = () => {\n listenerSetter.removeAll();\n middleware.clean();\n };\n\n const destroy = () => {\n cleanup();\n attachListenerSetter.removeAll();\n };\n\n const init = async() => {\n cleanup();\n\n buttons.forEach((button) => button.element = undefined);\n const f = filterButtons || ((buttons: T[]) => filterAsync(buttons, (button) => button?.verify ? button.verify() : true));\n\n const filteredButtons = await f(buttons);\n if(!filteredButtons.length) {\n return;\n }\n\n const _element = element = await ButtonMenu({\n buttons: filteredButtons,\n listenerSetter\n });\n _element.classList.add('contextmenu');\n\n await onBeforeOpen?.();\n\n appendTo.append(_element);\n\n return {\n element: _element,\n cleanup,\n destroy: () => {\n _element.remove();\n }\n };\n };\n\n return {element, destroy};\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 {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport PopupStickers from '../../components/popups/stickers';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport rootScope from '../../lib/rootScope';\nimport createContextMenu from './createContextMenu';\nimport findUpClassName from './findUpClassName';\nimport emoticonsDropdown, {EmoticonsDropdown} from '../../components/emoticonsDropdown';\n\nexport default function createStickersContextMenu(options: {\n listenTo: HTMLElement,\n isStickerPack?: boolean,\n verifyRecent?: (target: HTMLElement) => boolean,\n appendTo?: HTMLElement,\n onOpen?: () => any,\n onClose?: () => any,\n onSend?: () => any\n}) {\n const {listenTo, isStickerPack, verifyRecent, appendTo, onOpen, onClose, onSend} = options;\n let target: HTMLElement, doc: MyDocument;\n const verifyFavoriteSticker = async(toAdd: boolean) => {\n const favedStickers = await rootScope.managers.acknowledged.appStickersManager.getFavedStickersStickers();\n if(!favedStickers.cached) {\n return false;\n }\n\n const found = (await favedStickers.result).some((_doc) => _doc.id === doc.id);\n return toAdd ? !found : found;\n };\n\n return createContextMenu({\n listenTo: listenTo,\n appendTo,\n findElement: (e) => target = findUpClassName(e.target, 'media-sticker-wrapper'),\n onOpen: async() => {\n doc = await rootScope.managers.appDocsManager.getDoc(target.dataset.docId);\n return onOpen?.();\n },\n onClose,\n buttons: [{\n icon: 'stickers',\n text: 'Context.ViewStickerSet',\n onClick: () => new PopupStickers(doc.stickerSetInput).show(),\n verify: () => !isStickerPack\n }, {\n icon: 'favourites',\n text: 'AddToFavorites',\n onClick: () => rootScope.managers.appStickersManager.faveSticker(doc.id, false),\n verify: () => verifyFavoriteSticker(true)\n }, {\n icon: 'favourites',\n text: 'DeleteFromFavorites',\n onClick: () => rootScope.managers.appStickersManager.faveSticker(doc.id, true),\n verify: () => verifyFavoriteSticker(false)\n }, {\n icon: 'delete',\n text: 'DeleteFromRecent',\n onClick: () => rootScope.managers.appStickersManager.saveRecentSticker(doc.id, true),\n verify: () => verifyRecent?.(target) ?? false\n }, {\n icon: 'mute',\n text: 'Chat.Send.WithoutSound',\n onClick: () => {\n onSend?.();\n return EmoticonsDropdown.sendDocId(doc.id, false, true);\n },\n verify: () => !!(appImManager.chat.peerId && appImManager.chat.peerId !== rootScope.myId)\n }, {\n icon: 'schedule',\n text: 'Chat.Send.ScheduledMessage',\n onClick: () => appImManager.chat.input.scheduleSending(() => appImManager.chat.input.sendMessageWithDocument(doc)),\n verify: () => !!appImManager.chat.peerId\n }]\n });\n}\n","export default function createVideo(options: {\n pip?: boolean\n} = {}) {\n const video = document.createElement('video');\n if(!options.pip) video.disablePictureInPicture = true;\n video.setAttribute('playsinline', 'true');\n return video;\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 {MOUNT_CLASS_TO} from '../../config/debug';\nimport rootScope from '../../lib/rootScope';\nimport mediaSizes from '../mediaSizes';\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', this.resetCache);\n mediaSizes.addEventListener('resize', this.resetCache);\n }\n\n protected resetCache = () => {\n this.computedStyle = undefined;\n const cache = this.cache;\n this.cache = {};\n\n for(const i in cache) {\n this.getProperty(i);\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 public getPropertyAsSize(name: CustomProperty) {\n const value = this.getProperty(name);\n let size: number;\n\n if(value[value.length - 1] === '%') {\n\n } else if(value.indexOf('rem')) {\n size = +value.replace('rem', '') * 16;\n } else {\n size = +value.replace('px', '');\n }\n\n return size;\n }\n}\n\nconst customProperties = new CustomProperties();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.customProperties = customProperties);\nexport default customProperties;\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","import encodeEntities from '../string/encodeEntities';\n\nexport default function documentFragmentToHTML(fragment: DocumentFragment) {\n return Array.from(fragment.childNodes).map((node) => {\n return node.nodeType === node.TEXT_NODE ? encodeEntities(node.textContent) : (node as Element).outerHTML;\n }).join('');\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 findUpAsChild(el: T, parent: HTMLElement): T {\n if(!el) return null;\n if(el.parentElement === parent) return el;\n\n while(el.parentElement) {\n el = el.parentElement as any;\n if(el.parentElement === parent) {\n return el;\n }\n }\n\n return null;\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 findUpAttribute(el: any, attribute: string): HTMLElement {\n return el.closest(`[${attribute}]`);\n /* if(el.getAttribute(attribute) !== null) return el; // 03.02.2020\n\n while(el.parentElement) {\n el = el.parentElement;\n if(el.getAttribute(attribute) !== null)\n return el;\n }\n return null; */\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 findUpTag(el: any, tag: string): HTMLElement {\n return el.closest(tag);\n /* if(el.tagName === tag) return el; // 03.02.2020\n\n while(el.parentElement) {\n el = el.parentElement;\n if(el.tagName === tag)\n return el;\n }\n return null; */\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 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","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findUpAsChild from './findUpAsChild';\n\nexport default function getCaretPosNew(input: HTMLElement, anchor?: boolean): ReturnType & {selection: Selection} {\n const selection = document.getSelection();\n // let {focusNode: node, focusOffset: offset} = selection;\n const node = selection[anchor ? 'anchorNode' : 'focusNode'];\n const offset = selection[anchor ? 'anchorOffset' : 'focusOffset'];\n if(!findUpAsChild(node, input) && node !== input) {\n return {selection} as any;\n }\n\n return {...getCaretPosF(input, node, offset), selection};\n}\n\nexport function getCaretPosF(input: HTMLElement, node: Node, offset: number) {\n if(node === input) {\n const childNodes = input.childNodes;\n const childNodesLength = childNodes.length;\n if(childNodesLength && offset >= childNodesLength) {\n node = childNodes[childNodesLength - 1];\n offset = (node.textContent || (node as HTMLImageElement).alt || '').length;\n } else {\n node = childNodes[offset];\n offset = 0;\n }\n }\n\n return {node: node as ChildNode, offset};\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 {MessageEntity} from '../../layer';\nimport BOM from '../string/bom';\n\nexport type MarkdownType = 'bold' | 'italic' | 'underline' | 'strikethrough' | 'monospace' | 'link' | 'mentionName' | 'spoiler'/* | 'customEmoji' */;\nexport type MarkdownTag = {\n match: string,\n entityName: Extract;\n};\n\n// https://core.telegram.org/bots/api#html-style\nexport const markdownTags: {[type in MarkdownType]: MarkdownTag} = {\n bold: {\n match: '[style*=\"bold\"], [style*=\"font-weight: 700\"], [style*=\"font-weight: 600\"], [style*=\"font-weight:700\"], [style*=\"font-weight:600\"], b, strong',\n entityName: 'messageEntityBold'\n },\n underline: {\n match: '[style*=\"underline\"], u, ins',\n entityName: 'messageEntityUnderline'\n },\n italic: {\n match: '[style*=\"italic\"], i, em',\n entityName: 'messageEntityItalic'\n },\n monospace: {\n match: '[style*=\"monospace\"], [face*=\"monospace\"], pre',\n entityName: 'messageEntityCode'\n },\n strikethrough: {\n match: '[style*=\"line-through\"], [style*=\"strikethrough\"], strike, del, s',\n entityName: 'messageEntityStrike'\n },\n link: {\n match: 'A:not(.follow)',\n entityName: 'messageEntityTextUrl'\n },\n mentionName: {\n match: 'A.follow',\n entityName: 'messageEntityMentionName'\n },\n spoiler: {\n match: '[style*=\"spoiler\"]',\n entityName: 'messageEntitySpoiler'\n }\n // customEmoji: {\n // match: '.custom-emoji',\n // entityName: 'messageEntityCustomEmoji'\n // }\n};\n\nconst tabulationMatch = '[style*=\"table-cell\"], th, td';\n\n/* export function getDepth(child: Node, container?: Node) {\n let depth = 0;\n\n do {\n if(child === container) {\n return depth;\n }\n\n ++depth;\n } while((child = child.parentNode) !== null);\n\n return depth;\n} */\n\nconst BLOCK_TAGS = new Set([\n 'DIV',\n 'P',\n 'BR',\n 'LI',\n 'SECTION',\n 'H6',\n 'H5',\n 'H4',\n 'H3',\n 'H2',\n 'H1',\n 'TR',\n 'OL',\n 'UL'\n]);\n\n// const INSERT_NEW_LINE_TAGS = new Set([\n// 'OL',\n// 'UL'\n// ]);\n\nconst BOM_REG_EXP = new RegExp(BOM, 'g');\nexport const SELECTION_SEPARATOR = '\\x01';\n\nfunction checkNodeForEntity(node: Node, value: string, entities: MessageEntity[], offset: {offset: number}) {\n const parentElement = node.parentElement;\n\n // let closestTag: MarkdownTag, closestElementByTag: Element, closestDepth = Infinity;\n for(const type in markdownTags) {\n const tag = markdownTags[type as MarkdownType];\n const closest: HTMLElement = parentElement.closest(tag.match + ', [contenteditable=\"true\"]');\n if(closest?.getAttribute('contenteditable') !== null) {\n /* const depth = getDepth(closest, parentElement.closest('[contenteditable]'));\n if(closestDepth > depth) {\n closestDepth = depth;\n closestTag = tag;\n closestElementByTag = closest;\n } */\n continue;\n }\n\n if(tag.entityName === 'messageEntityTextUrl') {\n entities.push({\n _: tag.entityName,\n url: (closest as HTMLAnchorElement).href,\n offset: offset.offset,\n length: value.length\n });\n } else if(tag.entityName === 'messageEntityMentionName') {\n entities.push({\n _: tag.entityName,\n offset: offset.offset,\n length: value.length,\n user_id: (closest as HTMLElement).dataset.follow.toUserId()\n });\n }/* else if(tag.entityName === 'messageEntityCustomEmoji') {\n entities.push({\n _: tag.entityName,\n document_id: (closest as HTMLElement).dataset.docId,\n offset: offset.offset,\n length: emoji.length\n });\n } */ else {\n entities.push({\n _: tag.entityName,\n offset: offset.offset,\n length: value.length\n });\n }\n }\n}\n\nfunction isLineEmpty(line: string[]) {\n const {length} = line;\n if(!length) {\n return true;\n }\n\n if(line[length - 1] === SELECTION_SEPARATOR && length === SELECTION_SEPARATOR.length) {\n return true;\n }\n\n return false;\n}\n\nexport default function getRichElementValue(\n node: HTMLElement,\n lines: string[],\n line: string[],\n selNode?: Node,\n selOffset?: number,\n entities?: MessageEntity[],\n offset = {offset: 0}\n) {\n if(node.nodeType === node.TEXT_NODE) { // TEXT\n let nodeValue = node.nodeValue;\n // if(nodeValue[0] === BOM) {\n nodeValue = nodeValue.replace(BOM_REG_EXP, '');\n // }\n\n /* const tabulation = node.parentElement?.closest(tabulationMatch + ', [contenteditable]');\n if(tabulation?.getAttribute('contenteditable') === null) {\n nodeValue += ' ';\n // line.push('\\t');\n // ++offset.offset;\n } */\n\n if(nodeValue) {\n if(selNode === node) {\n line.push(nodeValue.substr(0, selOffset) + SELECTION_SEPARATOR + nodeValue.substr(selOffset));\n } else {\n line.push(nodeValue);\n }\n } else if(selNode === node) {\n line.push(SELECTION_SEPARATOR);\n }\n\n if(entities && nodeValue.length && node.parentNode) {\n checkNodeForEntity(node, nodeValue, entities, offset);\n }\n\n offset.offset += nodeValue.length;\n return;\n }\n\n if(node.nodeType !== node.ELEMENT_NODE) { // NON-ELEMENT\n return;\n }\n\n const isSelected = selNode === node;\n const isBlock = BLOCK_TAGS.has(node.tagName);\n if(isBlock && (line.length || node.tagName === 'BR'/* || (BLOCK_TAGS.has(node.tagName) && lines.length) */)) {\n lines.push(line.join(''));\n line.length = 0;\n ++offset.offset;\n } else {\n const alt = node.dataset.stickerEmoji || (node as HTMLImageElement).alt;\n const stickerEmoji = node.dataset.stickerEmoji;\n\n if(alt && entities) {\n checkNodeForEntity(node, alt, entities, offset);\n }\n\n if(stickerEmoji && entities) {\n entities.push({\n _: 'messageEntityCustomEmoji',\n document_id: node.dataset.docId,\n offset: offset.offset,\n length: alt.length\n });\n }\n\n if(alt) {\n line.push(alt);\n offset.offset += alt.length;\n }\n }\n\n if(isSelected && !selOffset) {\n line.push(SELECTION_SEPARATOR);\n }\n\n const isTableCell = node.matches(tabulationMatch);\n const wasEntitiesLength = entities?.length;\n const wasLinesLength = lines.length;\n let wasNodeEmpty = true;\n\n let curChild = node.firstChild as HTMLElement;\n while(curChild) {\n getRichElementValue(curChild, lines, line, selNode, selOffset, entities, offset);\n curChild = curChild.nextSibling as any;\n\n if(!isLineEmpty(line)) {\n wasNodeEmpty = false;\n }\n }\n\n if(wasNodeEmpty && lines.length !== wasLinesLength) {\n wasNodeEmpty = false;\n }\n\n if(isSelected && selOffset) {\n line.push(SELECTION_SEPARATOR);\n }\n\n if(isTableCell && node.nextSibling && !isLineEmpty(line)) {\n line.push(' ');\n ++offset.offset;\n\n // * combine entities such as url after adding space\n if(wasEntitiesLength !== undefined) {\n for(let i = wasEntitiesLength, length = entities.length; i < length; ++i) {\n ++entities[i].length;\n }\n }\n }\n\n if(isBlock && !wasNodeEmpty) {\n lines.push(line.join(''));\n line.length = 0;\n ++offset.offset;\n }\n\n if(!wasNodeEmpty && node.tagName === 'P' && node.nextSibling) {\n lines.push('');\n ++offset.offset;\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 {MOUNT_CLASS_TO} from '../../config/debug';\nimport {MessageEntity} from '../../layer';\nimport combineSameEntities from '../../lib/richTextProcessor/combineSameEntities';\nimport sortEntities from '../../lib/richTextProcessor/sortEntities';\nimport getRichElementValue, {SELECTION_SEPARATOR} from './getRichElementValue';\n\nexport function getCaretPos(field: HTMLElement) {\n const sel = window.getSelection();\n let selNode: Node;\n let selOffset: number;\n if(sel?.rangeCount) {\n const range = sel.getRangeAt(0);\n const startOffset = range.startOffset;\n if(\n range.startContainer &&\n range.startContainer == range.endContainer &&\n startOffset == range.endOffset\n ) {\n // * if focused on img, or caret has been set via placeCaretAtEnd\n const possibleChildrenFocusOffset = startOffset - 1;\n const childNodes = field.childNodes;\n if(range.startContainer === field && childNodes[possibleChildrenFocusOffset]) {\n selNode = childNodes[possibleChildrenFocusOffset];\n selOffset = 0;\n\n for(let i = 0; i < range.endOffset; ++i) {\n const node = childNodes[i];\n const value = node.nodeValue || (node as HTMLImageElement).alt;\n\n if(value) {\n selOffset += value.length;\n }\n }\n } else {\n selNode = range.startContainer;\n selOffset = startOffset;\n }\n }\n }\n\n return {node: selNode, offset: selOffset};\n}\n\nexport default function getRichValueWithCaret(\n field: HTMLElement | DocumentFragment,\n withEntities = true,\n withCaret = true\n) {\n const lines: string[] = [];\n const line: string[] = [];\n\n const {node: selNode, offset: selOffset} = !(field instanceof DocumentFragment) && withCaret && getCaretPos(field);\n\n const entities: MessageEntity[] = withEntities ? [] : undefined;\n const offset = {offset: 0};\n if(field instanceof DocumentFragment) {\n let curChild = field.firstChild as HTMLElement;\n while(curChild) {\n getRichElementValue(curChild, lines, line, selNode, selOffset, entities, offset);\n curChild = curChild.nextSibling as any;\n }\n } else {\n getRichElementValue(field, lines, line, selNode, selOffset, entities, offset);\n }\n\n if(line.length) {\n lines.push(line.join(''));\n }\n\n let value = lines.join('\\n');\n const caretPos = value.indexOf(SELECTION_SEPARATOR);\n if(caretPos !== -1) {\n value = value.substr(0, caretPos) + value.substr(caretPos + 1);\n }\n value = value.replace(/\\u00A0/g, ' ');\n\n if(entities?.length) {\n // ! cannot do that here because have the same check before the sending in RichTextProcessor.parseMarkdown\n /* const entity = entities[entities.length - 1];\n const length = value.length;\n const trimmedLength = value.trimRight().length;\n if(length !== trimmedLength) {\n entity.length -= length - trimmedLength;\n } */\n\n combineSameEntities(entities);\n sortEntities(entities);\n }\n\n return {value, entities, caretPos};\n}\n\nMOUNT_CLASS_TO.getRichValueWithCaret = getRichValueWithCaret;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getVisibleRect from './getVisibleRect';\n\nexport type ViewportSlicePart = {element: HTMLElement, rect: DOMRect, visibleRect: ReturnType}[];\n\nexport default function getViewportSlice({overflowElement, overflowRect, selector, extraSize, elements}: {\n overflowElement: HTMLElement,\n overflowRect?: DOMRectMinified,\n extraSize?: number,\n selector?: string,\n elements?: HTMLElement[]\n}) {\n // const perf = performance.now();\n overflowRect ??= overflowElement.getBoundingClientRect();\n elements ??= Array.from(overflowElement.querySelectorAll(selector));\n\n if(extraSize) {\n overflowRect = {\n top: overflowRect.top - extraSize,\n right: overflowRect.right + extraSize,\n bottom: overflowRect.bottom + extraSize,\n left: overflowRect.left - extraSize\n };\n }\n\n const invisibleTop: ViewportSlicePart = [],\n visible: typeof invisibleTop = [],\n invisibleBottom: typeof invisibleTop = [];\n let foundVisible = false;\n for(const element of elements) {\n const rect = element.getBoundingClientRect();\n const visibleRect = getVisibleRect(element, overflowElement, false, rect, overflowRect);\n\n const isVisible = !!visibleRect;\n let array: typeof invisibleTop;\n if(isVisible) {\n foundVisible = true;\n array = visible;\n } else if(foundVisible) {\n array = invisibleBottom;\n } else {\n array = invisibleTop;\n }\n\n array.push({\n element,\n rect,\n visibleRect\n });\n }\n\n // if(extraSize && visible.length) {\n // const maxTop = visible[0].rect.top;\n // const minTop = maxTop - extraSize;\n // const minBottom = visible[visible.length - 1].rect.bottom;\n // const maxBottom = minBottom + extraSize;\n\n // for(let length = invisibleTop.length, i = length - 1; i >= 0; --i) {\n // const element = invisibleTop[i];\n // if(element.rect.top >= minTop) {\n // invisibleTop.splice(i, 1);\n // visible.unshift(element);\n // }\n // }\n\n // for(let i = 0, length = invisibleBottom.length; i < length; ++i) {\n // const element = invisibleBottom[i];\n // if(element.rect.bottom <= maxBottom) {\n // invisibleBottom.splice(i--, 1);\n // --length;\n // visible.push(element);\n // }\n // }\n // }\n\n // console.log('getViewportSlice time:', performance.now() - perf);\n\n return {invisibleTop, visible, invisibleBottom};\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 windowSize from '../windowSize';\n\nexport default function getVisibleRect(\n element: HTMLElement,\n overflowElement: HTMLElement,\n lookForSticky?: boolean,\n rect: DOMRectMinified = element.getBoundingClientRect(),\n overflowRect: DOMRectMinified = overflowElement.getBoundingClientRect()\n) {\n let {top: overflowTop, right: overflowRight, bottom: overflowBottom, left: overflowLeft} = overflowRect;\n\n // * respect sticky headers\n if(lookForSticky) {\n const sticky = overflowElement.querySelector('.sticky');\n if(sticky) {\n const stickyRect = sticky.getBoundingClientRect();\n overflowTop = stickyRect.bottom;\n }\n }\n\n if(rect.top >= overflowBottom ||\n rect.bottom <= overflowTop ||\n rect.right <= overflowLeft ||\n rect.left >= overflowRight) {\n return null;\n }\n\n const overflow = {\n top: false,\n right: false,\n bottom: false,\n left: false,\n vertical: 0 as 0 | 1 | 2,\n horizontal: 0 as 0 | 1 | 2\n };\n\n const windowWidth = windowSize.width;\n const windowHeight = windowSize.height;\n\n return {\n rect: {\n top: rect.top < overflowTop && overflowTop !== 0 ? (overflow.top = true, ++overflow.vertical, overflowTop) : rect.top,\n right: rect.right > overflowRight && overflowRight !== windowWidth ? (overflow.right = true, ++overflow.horizontal, overflowRight) : rect.right,\n bottom: rect.bottom > overflowBottom && overflowBottom !== windowHeight ? (overflow.bottom = true, ++overflow.vertical, overflowBottom) : rect.bottom,\n left: rect.left < overflowLeft && overflowLeft !== 0 ? (overflow.left = true, ++overflow.horizontal, overflowLeft) : rect.left\n },\n overflow\n };\n}\n\n(window as any).getVisibleRect = getVisibleRect;\n","/*\n * 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 as any as TouchEvent) &&\n (options.verifyTouchTarget ? options.verifyTouchTarget(e) : true);\n },\n onSwipe: (xDiff, yDiff, e) => {\n xDiff *= -1;\n yDiff *= -1;\n\n if(!cancelY && Math.abs(yDiff) > 20) {\n return true;\n }\n\n if(Math.abs(xDiff) > Math.abs(yDiff)) {\n cancelEvent(e as any as Event);\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 './attachContextMenuListener';\nimport handleHorizontalSwipe, {SwipeHandlerHorizontalOptions} from './handleHorizontalSwipe';\n\nexport default function handleTabSwipe(options: SwipeHandlerHorizontalOptions) {\n return handleHorizontalSwipe({\n ...options,\n onSwipe: (xDiff, yDiff, e) => {\n xDiff *= -1;\n yDiff *= -1;\n\n if(Math.abs(xDiff) > 50) {\n options.onSwipe(xDiff, yDiff, e);\n cancelContextMenuOpening();\n\n return true;\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\nexport default function htmlToDocumentFragment(html: string | DocumentFragment) {\n if(html instanceof DocumentFragment) return html;\n const template = document.createElement('template');\n html = html.trim(); // Never return a text node of whitespace as the result\n template.innerHTML = html;\n return template.content;\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 htmlToSpan(html: string | DocumentFragment) {\n const span = document.createElement('span');\n if(typeof(html) === 'string') span.innerHTML = html;\n else span.append(html);\n return span;\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/* export function isInDOM(element: Element, parentNode?: HTMLElement): boolean {\n if(!element) {\n return false;\n }\n\n parentNode = parentNode || document.body;\n if(element === parentNode) {\n return true;\n }\n return isInDOM(element.parentNode as HTMLElement, parentNode);\n} */\nexport default function isInDOM(element: Element): boolean {\n return element?.isConnected;\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 isInputEmpty(element: HTMLElement) {\n if(element.isContentEditable || element.tagName !== 'INPUT') {\n /* const value = element.innerText;\n\n return !value.trim() && !serializeNodes(Array.from(element.childNodes)).trim(); */\n // return !getRichValueWithCaret(element, false, false).value.trim();\n return !element.textContent.trim() && !element.querySelector('.emoji, .custom-emoji, .custom-emoji-placeholder');\n } else {\n return !(element as HTMLInputElement).value.trim();\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';\nimport {IS_MOBILE, IS_APPLE} from '../../environment/userAgent';\n\nexport default function isSendShortcutPressed(e: KeyboardEvent) {\n if(e.key === 'Enter' && !IS_MOBILE && !e.isComposing) {\n /* if(e.ctrlKey || e.metaKey) {\n this.messageInput.innerHTML += '
';\n placeCaretAtEnd(this.message)\n return;\n } */\n\n if(rootScope.settings.sendShortcut === 'enter') {\n if(e.shiftKey || e.ctrlKey || e.metaKey) {\n return;\n }\n\n return true;\n } else {\n const secondaryKey = IS_APPLE ? e.metaKey : e.ctrlKey;\n if(e.shiftKey || (IS_APPLE ? e.ctrlKey : e.metaKey)) {\n return;\n }\n\n if(secondaryKey) {\n return true;\n }\n }\n }\n\n return false;\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_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 * 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 IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\n\nexport default function placeCaretAtEnd(el: HTMLElement, ignoreTouchCheck = false, focus = true) {\n if(IS_TOUCH_SUPPORTED && (!ignoreTouchCheck || (document.activeElement.tagName !== 'INPUT' && !(document.activeElement as HTMLElement).isContentEditable))) {\n return;\n }\n\n focus && el.focus();\n if(el instanceof HTMLInputElement) {\n const length = el.value.length;\n el.selectionStart = length;\n el.selectionEnd = length;\n } else {\n const range = document.createRange();\n range.selectNodeContents(el);\n range.collapse(false);\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n }\n}\n\n(window as any).placeCaretAtEnd = placeCaretAtEnd;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport whichChild from './whichChild';\n\nexport default function positionElementByIndex(element: HTMLElement, container: HTMLElement, pos: number, prevPos?: number) {\n if(prevPos === undefined) {\n prevPos = element.parentElement === container ? whichChild(element) : -1;\n }\n\n if(prevPos === pos) {\n return false;\n } else if(prevPos !== -1 && prevPos < pos) { // was higher\n pos += 1;\n }\n\n if(!pos) {\n container.prepend(element);\n } else if(container.childElementCount > pos) {\n container.insertBefore(element, container.children[pos]);\n } else {\n container.append(element);\n }\n\n return true;\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 onMediaLoad from '../onMediaLoad';\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?: () => void,\n useCache = true\n) {\n if(!url) {\n console.error('renderImageFromUrl: no url?', elem, url);\n callback?.();\n return;\n }\n\n const isVideo = elem instanceof HTMLVideoElement;\n if(((loadedURLs[url]/* && false */) && useCache) || isVideo) {\n if(elem) {\n set(elem, url);\n }\n\n if(callback) {\n if(isVideo) {\n onMediaLoad(elem).then(callback);\n } else {\n callback?.();\n }\n // callback && getHeavyAnimationPromise().then(() => callback());\n }\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\n const onLoad = () => {\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?.();\n\n loader.removeEventListener('error', onError);\n };\n\n const onError = (err: ErrorEvent) => {\n console.error('Render image from url failed:', err, url, loader);\n loader.removeEventListener('load', onLoad);\n callback?.();\n };\n\n loader.addEventListener('load', onLoad, {once: true});\n loader.addEventListener('error', onError, {once: true});\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","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport sequentialDom from '../sequentialDom';\nimport {renderImageFromUrlPromise} from './renderImageFromUrl';\n\nexport default function renderMediaWithFadeIn(\n container: HTMLElement,\n media: Parameters[0],\n url: string,\n needFadeIn: boolean,\n aspecter = container,\n thumbImage?: HTMLElement\n) {\n if(needFadeIn) {\n media.classList.add('fade-in');\n }\n\n const promise = renderImageFromUrlPromise(media, url).then(() => {\n return sequentialDom.mutateElement(container, () => {\n aspecter.append(media);\n\n if(needFadeIn) {\n media.addEventListener('animationend', () => {\n sequentialDom.mutate(() => {\n media.classList.remove('fade-in');\n thumbImage?.remove();\n });\n }, {once: true});\n } else {\n thumbImage?.remove();\n }\n });\n });\n\n // recordPromise(promise, 'renderImageWithFadeIn');\n\n return promise;\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 replaceContent(elem: HTMLElement, node: string | Node) {\n if(typeof(node) === 'string') {\n elem.innerHTML = node;\n return;\n }\n\n // * children.length doesn't count text nodes\n const firstChild = elem.firstChild;\n if(firstChild) {\n if(elem.lastChild === firstChild) {\n firstChild.replaceWith(node);\n } else {\n elem.textContent = '';\n elem.append(node);\n }\n } else {\n elem.append(node);\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 clamp from '../number/clamp';\nimport findUpAsChild from './findUpAsChild';\nimport whichChild from './whichChild';\n\nexport default function compareNodes(node1: ChildNode, node1Offset: number, node2: ChildNode, node2Offset: number) {\n let diff: number;\n if(node1 === node2) {\n diff = node1Offset - node2Offset;\n } else if(node1.parentElement === node2.parentElement) {\n diff = whichChild(node1, true) - whichChild(node2, true);\n } else {\n const parents: HTMLElement[] = [];\n let parentElement = node1.parentElement;\n do {\n parents.push(parentElement);\n } while(parentElement = parentElement.parentElement);\n\n parentElement = node2.parentElement;\n do {\n if(parents.includes(parentElement)) {\n break;\n }\n } while(parentElement = parentElement.parentElement);\n\n const commonAncestorContainer = parentElement;\n // const range = document.createRange();\n // range.setStart(node1, 0);\n // range.setEnd(node2, node2.textContent.length);\n // const {commonAncestorContainer} = range;\n node1 = findUpAsChild(node1 as HTMLElement, commonAncestorContainer as HTMLElement);\n node2 = findUpAsChild(node2 as HTMLElement, commonAncestorContainer as HTMLElement);\n diff = whichChild(node1, true) - whichChild(node2, true);\n }\n\n return clamp(diff, -1, 1);\n}\n\n(window as any).compareNodes = compareNodes;\n","/*\n * 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_FIREFOX} from '../../environment/userAgent';\nimport {logger} from '../../lib/logger';\nimport {isCustomFillerNeededBySiblingNode} from '../../lib/richTextProcessor/wrapRichText';\nimport ListenerSetter from '../listenerSetter';\nimport BOM from '../string/bom';\nimport compareNodes from './compareNodes';\nimport getCaretPosNew from './getCaretPosNew';\nimport placeCaretAtEnd from './placeCaretAtEnd';\nimport whichChild from './whichChild';\n\nconst NOT_ONLY_BOMS_REG_EXP = new RegExp(`[^${BOM}]`);\n\nexport const USING_BOMS = false;\n\nexport default class RichInputHandler {\n private static INSTANCE: RichInputHandler;\n\n private listenerSetter: ListenerSetter;\n\n private lastNode: Node;\n private lastOffset: number;\n private savedRanges: WeakMap;\n\n private log: ReturnType;\n\n private inputCaptureCallbacks: Function[];\n\n constructor() {\n this.log = logger('RICH-INPUT');\n this.listenerSetter = new ListenerSetter();\n this.savedRanges = new WeakMap();\n\n this.listenerSetter.add(document)('selectionchange', this.saveSelectionOnChange);\n if(USING_BOMS) {\n this.listenerSetter.add(document)('focusout', this.onFocusOut);\n this.listenerSetter.add(document)('selectionchange', this.onSelectionChange);\n this.listenerSetter.add(document)('beforeinput', this.onBeforeInput);\n this.listenerSetter.add(document)('keydown', this.onKeyDown, {capture: true});\n\n if(IS_FIREFOX) {\n this.inputCaptureCallbacks = [];\n this.listenerSetter.add(document)('input', () => {\n this.inputCaptureCallbacks.forEach((callback) => callback());\n this.inputCaptureCallbacks.length = 0;\n }, {capture: true});\n }\n }\n }\n\n private get input() {\n const selection = document.getSelection();\n const {anchorNode: node} = selection;\n if(!node) return;\n return ((node as HTMLElement).closest ? node as HTMLElement : node.parentElement).closest('[contenteditable=\"true\"]');\n }\n\n private saveRangeForElement(element: HTMLElement) {\n if(element && (element.isContentEditable || element.tagName === 'INPUT')) {\n const selection = document.getSelection();\n if(selection.rangeCount) {\n this.savedRanges.set(element as HTMLElement, document.getSelection().getRangeAt(0));\n }\n }\n }\n\n private saveSelectionOnChange = (e: Event) => {\n const element = document.activeElement as HTMLElement; // e.target as HTMLElement;\n this.saveRangeForElement(element);\n };\n\n private onFocusOut = (e: FocusEvent) => {\n this.lastNode = this.lastOffset = undefined;\n };\n\n private findPreviousSmthIndex(input: HTMLElement, node: ChildNode, something?: NodeListOf) {\n // node = this.getFiller(node);\n // const childNodes = Array.from(node.parentElement.childNodes);\n // fillerIndex = childNodes.indexOf(node);\n // let smthIndex = -1;\n // for(let i = fillerIndex; i >= 0; --i) {\n // const node = childNodes[i];\n // if((node as HTMLElement)?.classList?.contains('input-something')) {\n // smthIndex = i;\n // break;\n // }\n // }\n // return smthIndex;\n\n const elements = Array.from(something ?? input.querySelectorAll('.input-something'));\n const index = elements.findIndex((element) => compareNodes(element, 0, node, 0) >= 0);\n return index === -1 ? elements.length - 1 : Math.max(0, index - 1);\n }\n\n private superMove(\n input: HTMLElement,\n caret: ReturnType,\n toLeft: boolean,\n fromSelectionChange: boolean\n ) {\n const {node, offset, move} = caret;\n const something = input.querySelectorAll('.input-something');\n const smthIndex = this.findPreviousSmthIndex(input, node, something);\n const r = document.createRange();\n r[toLeft ? 'setEnd' : 'setStart'](node, offset);\n\n if(fromSelectionChange) {\n move(toLeft);\n }\n\n const c = this.getCaretPosN();\n if(c.node?.nodeValue === BOM && (!fromSelectionChange || node === this.lastNode)) {\n const idx = this.findPreviousSmthIndex(input, c.node, something);\n\n let moved = !fromSelectionChange;\n\n do {\n const c = this.getCaretPosN();\n const idxidx = this.findPreviousSmthIndex(input, c.node, something);\n r[toLeft ? 'setStart' : 'setEnd'](c.node, c.offset);\n const rangeString = r.toString();\n const onlyBOMs = !NOT_ONLY_BOMS_REG_EXP.test(rangeString);\n this.log('test cursor', rangeString, onlyBOMs, idx, idxidx);\n if(\n onlyBOMs &&\n c.node?.nodeValue === BOM &&\n idxidx === idx &&\n // (idxidx > 1 || c.offset) &&\n // (idxidx < (getFiller(c.node).parentElement.childNodes.length - 2) || c.offset < BOM.length)\n (idxidx || c.offset) &&\n (idxidx < (something.length - 1) || c.offset < BOM.length)\n ) {\n move(toLeft);\n moved = true;\n } else if(!moved) {\n break;\n } else {\n if((!this.getFiller(node as HTMLElement).classList.contains('input-filler-text') && idx !== smthIndex) || c.offset === BOM.length) {\n move(!toLeft);\n }\n\n break;\n }\n } while(true);\n }\n }\n\n private onSelectionChange = (e: Event) => {\n const {input} = this;\n if(!input) {\n this.setSelectionClassName(document.getSelection());\n return;\n }\n\n // return;\n\n // this.log('selectionchange', document.getSelection(), document.getSelection().rangeCount && document.getSelection().getRangeAt(0), getCaretPosN());\n // let {node, offset} = getCaretPos(this.messageInput);\n\n let caret = this.getCaretPosN();\n do {\n const {node, offset, selection, move} = caret;\n\n const nodeValue = node?.nodeValue;\n // if(!nodeValue?.includes(BOM)) {\n if(nodeValue !== BOM || !this.lastNode) {\n break;\n }\n\n // node = getFiller(node);\n\n // const childIndex = whichChild(getFiller(node), true);\n // let toLeft: boolean;\n // // if(node === lastNode) toLeft = lastOffset >= offset;\n // if(node === lastNode) toLeft = lastOffset > offset;\n // else {\n // // toLeft = whichChild(getFiller(lastNode)) > childIndex;\n // toLeft = (lastNode.nodeValue === BOM ? whichChild(getFiller(lastNode), true) : whichChild(findUpAsChild(lastNode as any, getFiller(node).parentElement), true)) > childIndex;\n // }\n\n const toLeft = compareNodes(node, offset, this.lastNode as ChildNode, this.lastOffset) < 0;\n\n // const childNodes = Array.from(node.parentElement.childNodes);\n // if(toLeft) {\n // for(let i = childIndex; i >= 0; --i) {\n // const sibling = childNodes[i];\n // const {textContent} = sibling;\n // for()\n // }\n // }\n\n // {\n // if(toLeft === undefined) {\n // return;\n // }\n\n // const selection = window.getSelection();\n // selection.modify(selection.isCollapsed ? 'move' : 'extend', toLeft ? 'backward' : 'forward', 'character');\n // return;\n // }\n\n // const parent = getFiller(node);\n if(toLeft !== undefined) {\n // let newNode = toLeft ? parent.previousSibling : parent.nextSibling;\n if(selection.isCollapsed) {\n this.superMove(input, caret, toLeft, true);\n\n // if(offset === BOM.length) {\n // newNode = toLeft ? newNode.nextSibling.nextSibling : parent.previousSibling.previousSibling;\n // }\n\n // setCaretAt(newNode);\n } else {\n selection.modify(selection.isCollapsed ? 'move' : 'extend', toLeft ? 'backward' : 'forward', 'character');\n // const range = selection.getRangeAt(0);\n\n // if(toLeft) {\n // newNode = parent.previousSibling.previousSibling.firstChild;\n // const value = newNode.nodeValue;\n // range.setStart(newNode, value?.length);\n // } else {\n // newNode = parent.nextSibling.nextSibling.firstChild;\n // range.setEnd(newNode, 0);\n // }\n }\n }\n\n this.log('selectionchange',\n node,\n offset,\n this.lastNode,\n this.lastOffset,\n node === this.lastNode,\n whichChild(this.getFiller(node)),\n whichChild(this.getFiller(this.lastNode)),\n toLeft,\n selection,\n document.getSelection(),\n document.getSelection().getRangeAt(0),\n node?.parentNode,\n this.lastNode?.parentNode\n );\n\n caret = this.getCaretPosN();\n this.lastNode = node;\n this.lastOffset = offset;\n\n break;\n\n // if(findPreviousSmthIndex(caret.node) !== smthIndex) {\n // break;\n // }\n } while(true);\n\n this.lastNode = this.lastOffset = undefined;\n\n // if(offset === BOM.length) {\n // setCaretAt(parent);\n // } else {\n // setCaretAt(parent.nextSibling);\n // }\n\n this.setSelectionClassName(caret.selection, input);\n };\n\n public restoreSavedRange(input: HTMLElement) {\n const range = this.getSavedRange(input);\n if(!range) {\n return false;\n }\n\n const selection = window.getSelection();\n selection.removeAllRanges();\n selection.addRange(range);\n\n return true;\n }\n\n public getSavedRange(input: HTMLElement) {\n return this.savedRanges.get(input);\n }\n\n public makeFocused(input: HTMLElement) {\n if(document.activeElement !== input && !this.restoreSavedRange(input)) {\n placeCaretAtEnd(input, false, false);\n }\n }\n\n private fixInsertedLineBreaks(input: HTMLElement) {\n input.querySelectorAll('br').forEach((br) => {\n br.classList.add('br-not-br');\n });\n }\n\n private fixBuggedCaret() {\n const selection = document.getSelection();\n const range = selection.getRangeAt(0);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n\n public onBeforeInput = (e: Pick) => {\n const {input, log} = this;\n if(!input) {\n return;\n }\n\n const addInputCallback = this.addInputCallback.bind(this, input);\n\n const caretPos = this.getCaretPosN();\n let {node, offset, selection, move} = caretPos;\n log('beforeinput', e, node, offset, selection, caretPos);\n this.lastNode = this.lastOffset = undefined;\n\n if(e.inputType.startsWith('delete')) { // delete current BOM\n addInputCallback(() => {\n this.processEmptiedFillers(input);\n this.removeExtraBOMs(input);\n this.fixInsertedLineBreaks(input);\n });\n\n if(node?.nodeValue === BOM && selection.isCollapsed && e.inputType.includes('deleteContent')) {\n const toLeft = e.inputType.includes('Backward');\n const moveFirst = (offset === BOM.length && toLeft) || (!offset && !toLeft);\n this.superMove(input, caretPos, toLeft, moveFirst);\n // if((offset === BOM.length && toLeft) || (!offset && !toLeft)) {\n // move(toLeft);\n // }\n\n // addInputCallback(() => {\n // removePossibleBOMSiblingsByNode(getFiller(node));\n // });\n\n // if(node.parentNode.childNodes.length === 1) {\n // (node.parentNode as HTMLElement).remove();\n // move(e.inputType.includes('Backward') ? false : true);\n // } else {\n // move(e.inputType.includes('Backward') ? true : false);\n // addInputCallback(() => {\n // move(e.inputType.includes('Backward') ? false : true);\n // });\n // }\n\n // for(let i = 0, length = BOM.length + (direction === 'backward' ? offset : BOM.length - offset); i < length; ++i) {\n // selection.modify('extend', direction, 'character');\n // }\n\n // selection.modify('extend', direction, 'character');\n // selection.modify('extend', direction, 'character');\n\n // selection.deleteFromDocument();\n // e.preventDefault();\n } else {\n // const filler = getFiller(node);\n // if(filler?.classList?.contains('input-filler-text')) {\n // const {previousSibling, nextSibling} = filler;\n // addInputCallback(() => {\n // if(!filler.isConnected) {\n // removePossibleBOMSiblings(previousSibling, nextSibling);\n // }\n // // removeExtraBOMs();\n // // processEmptiedFillers();\n // });\n // }\n // addInputCallback(() => {\n // this.fixInsertedLineBreaks(input);\n // });\n }\n } else if(e.inputType.startsWith('insert')) { // clear current BOM\n if((node as HTMLElement)?.classList?.contains('input-something')/* || (node.textContent === BOM && offset === BOM.length) */) {\n node = node.previousSibling.firstChild;\n const range = selection.getRangeAt(0);\n range.setStart(node, 0);\n range.setEnd(node, 0);\n range.collapse(true);\n // selection.modify('move', 'backward', 'character');\n\n const c = this.getCaretPosN();\n node = c.node;\n selection = c.selection;\n offset = c.offset;\n }\n if(node && node.textContent === BOM && offset === BOM.length) {\n // const range = selection.getRangeAt(0);\n // range.setStart(node, 0);\n // range.setEnd(node, 0);\n // range.collapse(true);\n selection.modify('move', 'backward', 'character');\n\n const c = this.getCaretPosN();\n node = c.node;\n selection = c.selection;\n offset = c.offset;\n }\n // if(node && node.textContent === BOM && offset === 0) {\n // selection.modify('move', 'forward', 'character');\n // offset = BOM.length;\n // }\n\n if(e.inputType === 'insertLineBreak' || true) {\n // const appendix = 'X';\n // const textNode = document.createTextNode(appendix);\n // if(node.parentElement !== this.messageInput) node.parentElement.after(textNode);\n // else node.after(textNode);\n // selection.modify('move', 'forward', 'character');\n // selection.modify('move', 'forward', 'character');\n // addInputCallback(() => {\n // textNode.remove();\n // });\n\n /* if(node?.nodeValue === BOM) */ {\n // const parent = node.parentElement;\n // parent.contentEditable = 'false';\n // addInputCallback(() => {\n // parent.contentEditable = 'inherit';\n // });\n // node.parentElement.remove();\n\n // const textNode = document.createTextNode(appendix);\n // if(node.parentElement !== this.messageInput) node.parentElement.after(textNode);\n // else node.after(textNode);\n // // selection.modify('move', 'forward', 'character');\n // // selection.modify('move', 'forward', 'character');\n // addInputCallback(() => {\n // textNode.remove();\n // });\n\n // fix case when focused somehow on span instead of text node\n if(node && node.nodeType === node.ELEMENT_NODE) {\n node = node.firstChild;\n log.warn('fixing focus on span');\n }\n\n const isBOM = node?.nodeValue === BOM;\n log('inserting line break', isBOM, node, `\"${node?.nodeValue}\"`, node?.parentElement ? Array.from(node.parentElement.childNodes).slice() : []);\n if(isBOM) {\n // (node as ChildNode).replaceWith(this.messageInput.querySelector('.lol'));\n\n const parentElement = node.parentElement;\n parentElement.classList.replace('input-filler', 'input-filler-text');\n const childNodesLength = parentElement.childNodes.length;\n addInputCallback(() => {\n const newChildNodesLength = parentElement.childNodes.length;\n if(newChildNodesLength > 1/* && newChildNodesLength !== childNodesLength */) {\n log('inserting line break, remove');\n node = Array.from(parentElement.childNodes).find((node) => node.nodeValue === BOM);\n (parentElement as any).t = node;\n // node?.remove();\n\n // const n = parentElement.firstChild;\n // const range = selection.getRangeAt(0);\n // range.setStart(n, n.nodeValue.length);\n // range.setEnd(n, n.nodeValue.length);\n } else if(node.nodeValue !== BOM) {\n log('inserting line break, deleteData');\n (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // node = document.createTextNode(BOM);\n }\n\n this.fixInsertedLineBreaks(input);\n // (parentElement as any).t = node;\n // node.remove();\n });\n // addInputCallback(() => {\n // node.parentElement.classList.replace('input-filler', 'input-filler3');\n // const s = document.createElement('span');\n // s.style.display = 'none';\n // node.replaceWith(s);\n // s.prepend(node);\n // });\n } else if(e.inputType === 'insertLineBreak') {\n addInputCallback(() => {\n this.fixInsertedLineBreaks(input);\n });\n // const range = selection.getRangeAt(0);\n // this.messageInput.querySelectorAll('.input-something').forEach((el) => {\n // el.contentEditable = 'inherit';\n // });\n\n // addInputCallback(() => {\n // this.messageInput.querySelectorAll('.input-something').forEach((el) => {\n // el.contentEditable = 'false';\n // });\n\n // selection.removeAllRanges();\n // selection.addRange(range);\n // }, false);\n }/* else if(node &&\n node.nodeType === node.TEXT_NODE &&\n node.nodeValue.length === offset) {\n\n } */\n\n // if(e.inputType === 'insertLineBreak') {\n // e.preventDefault();\n // document.execCommand('insertHTML', false, '\\n');\n\n // this.messageInputField.simulateInputEvent();\n // }\n\n // node.parentElement.replaceWith(node);\n // selection.removeAllRanges();\n // const range = new Range();\n // range.setStart(node, 0);\n // range.setEnd(node, node.nodeValue.length);\n // selection.addRange(range);\n // node.parentElement.classList.remove('input-filler');\n // node.parentElement\n }\n\n // document.execCommand('insertHTML', false, '\\n');\n // e.preventDefault();\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // if(node?.nodeValue === BOM) {\n // addInputCallback(() => {\n // node.remove();\n // });\n // }\n // this.messageInputField.simulateInputEvent();\n\n // this.messageInput.querySelectorAll('.input-something').forEach((el) => {\n // el.contentEditable = 'inherit';\n // });\n // addInputCallback(() => {\n // this.messageInput.querySelectorAll('.input-something').forEach((el) => {\n // el.contentEditable = 'false';\n // });\n // });\n return;\n }\n\n if(node?.nodeValue === BOM) {\n // node.nodeValue = ''; // ! will move cursor forward\n // addInputCallback(() => {\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // });\n\n if(e.inputType === 'insertLineBreak') {\n if(offset === BOM.length) {\n selection.modify('move', 'backward', 'character');\n }\n\n // if(offset !== BOM.length) {\n // selection.modify('move', 'forward', 'character');\n // }\n\n addInputCallback(() => {\n node.remove();\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // selection.modify('move', 'forward', 'character');\n\n setTimeout(() => {\n selection.modify('move', 'forward', 'character');\n }, 0);\n });\n }\n\n // node.parentElement.replaceWith(node);\n\n // node.parentElement.replaceWith(node);\n if(e.inputType === 'insertLineBreak') {\n // const previousParentSibling = node.parentNode.previousSibling;\n // addInputCallback(() => {\n // if(previousParentSibling.nextSibling.nodeValue === '\\n') {\n // previousParentSibling.nextSibling.remove();\n\n // setTimeout(() => {\n // // selection.modify('move', 'forward', 'character');\n // // selection.modify('move', 'forward', 'character');\n // }, 0);\n // } else {\n // previousParentSibling.nextSibling.nodeValue = previousParentSibling.nextSibling.nodeValue.replace('\\n\\n', '\\n');\n // }\n // });\n } else {\n // if(node.parentElement !== this.messageInput) {\n // node.parentElement.replaceWith(node);\n // }\n\n // setTimeout(() => {\n // this.log(JSON.stringify(node.parentElement.innerHTML));\n // node.nodeValue = node.nodeValue.replace(BOM, '');\n // // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // this.log(JSON.stringify(node.parentElement.innerHTML));\n // }, 1000);\n\n addInputCallback(() => {\n (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n if(!node.nodeValue) {\n node.remove();\n }\n\n // selection.modify('move', 'forward', 'character');\n });\n }\n\n if(selection.isCollapsed && false) {\n node.parentElement.replaceWith(node);\n // const textNode = document.createTextNode(BOM);\n // (node.parentNode as any as ChildNode).after(textNode);\n // setCaretAt(textNode.nextSibling);\n // selection.modify('move', 'forward', 'character');\n node.remove();\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // selection.modify('move', 'forward', 'character');\n // selection.collapseToEnd();\n\n // addInputCallback(() => {\n // (textNode as CharacterData).deleteData(textNode.nodeValue.indexOf(BOM), BOM.length);\n // node.parentElement.remove();\n // });\n }\n } else if(e.inputType === 'insertLineBreak' &&\n node &&\n node.nodeType === node.TEXT_NODE &&\n node.nodeValue.length === offset) {\n log('inserting line break');\n // const appendix = '\\x01';\n\n input.querySelectorAll('.input-something').forEach((el) => {\n el.contentEditable = 'inherit';\n });\n addInputCallback(() => {\n input.querySelectorAll('.input-something').forEach((el) => {\n el.contentEditable = 'false';\n });\n });\n\n // const textNode = document.createTextNode(appendix);\n // if(node.parentElement !== this.messageInput) node.parentElement.after(textNode);\n // else node.after(textNode);\n // // selection.modify('move', 'forward', 'character');\n // addInputCallback(() => {\n // textNode.remove();\n // });\n\n // const offset = node.nodeValue.length;\n // (node as CharacterData).insertData(offset, appendix);\n // addInputCallback(() => {\n // selection.modify('move', 'forward', 'character');\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(appendix), appendix.length);\n // if(!node.nodeValue) {\n // node.remove();\n // }\n // });\n }\n } else if(e.inputType === 'historyUndo') { // have to remove extra BOMs\n addInputCallback(() => {\n this.processFilledFillers(input);\n this.processEmptiedFillers(input);\n this.removeExtraBOMs(input);\n this.removeEmptyTextNodes(input);\n\n // ! lol what, caret will be at the wrong position, have to set it to the same\n this.fixBuggedCaret();\n\n // lol\n // this.messageInput.querySelectorAll('.has-text').forEach((el) => {\n // if(el.textContent === BOM) {\n // el.firstElementChild.replaceWith(el.firstElementChild.firstChild);\n // el.classList.replace('input-filler3', 'input-filler');\n // }\n // });\n });\n } else if(e.inputType === 'historyRedo') {\n // if(node?.nodeValue === BOM && offset === BOM.length) {\n // selection.modify('move', 'backward', 'character');\n // }\n\n addInputCallback(() => {\n this.processFilledFillers(input);\n this.processEmptiedFillers(input);\n\n // fix contenteditable attribute\n input.querySelectorAll('.input-something:not([contenteditable])').forEach((el) => {\n el.contentEditable = 'false';\n });\n\n this.removeExtraBOMs(input);\n\n // ! lol what, caret will be at the wrong position, have to set it to the same\n this.fixBuggedCaret();\n });\n }\n };\n\n private onKeyDown = (e: KeyboardEvent) => {\n const key = e.key;\n\n // // have to ignore line up and down\n if(key === 'ArrowDown' || key === 'ArrowUp') {\n this.lastNode = this.lastOffset = undefined;\n } else {\n const {node, offset} = this.getCaretPosN();\n this.lastNode = node/* getFiller(node) */, this.lastOffset = offset;\n if(this.lastNode === this.input) {\n this.lastNode = this.lastOffset = undefined;\n }\n }\n\n this.log('keydown', this.lastNode, this.lastNode?.parentNode, this.lastOffset, this.getCaretPosN(), e);\n };\n\n private addInputCallback(input: HTMLElement, callback: () => void, capture = true) {\n const newCallback = () => {\n this.log('input modify callback');\n callback();\n };\n\n if(capture && IS_FIREFOX) this.inputCaptureCallbacks.push(newCallback);\n else this.listenerSetter.add(input)('input', newCallback, {once: true, capture});\n }\n\n public removeExtraBOMs(input: HTMLElement) {\n const c = (sibling: ChildNode) => {\n return (sibling as HTMLElement)?.classList?.contains('input-something');\n };\n\n input.querySelectorAll('.input-filler').forEach((el) => {\n const {previousSibling, nextSibling} = el;\n let needed = false;\n\n // if(!(previousSibling as HTMLElement)?.classList?.contains('input-filler') && isCustomFillerNeededBySiblingNode(previousSibling)) {\n if(!(nextSibling as HTMLElement)?.classList?.contains('input-filler') && isCustomFillerNeededBySiblingNode(nextSibling)) {\n needed = c(previousSibling) || c(nextSibling);\n }\n\n if(!needed) {\n this.log.warn('removing empty bom node', el);\n el.remove();\n }\n });\n }\n\n private getFiller(node: Node) {\n return node && node.nodeType === node.TEXT_NODE && node.parentElement !== this.input ? node.parentElement : node as HTMLElement;\n }\n\n private getCaretPosN() {\n const ret = getCaretPosNew(this.input);\n // const {node} = ret;\n // if((node as HTMLElement)?.classList?.contains('input-something')) {\n // ret.node = node.previousSibling;\n // ret.offset = ret.node.textContent.length;\n // }\n\n return {...ret, move: this.move.bind(this, ret.selection)};\n }\n\n private removeEmptyTextNodes(input: HTMLElement) {\n const {log} = this;\n // let i = -1;\n // remove empty text nodes\n const treeWalker = document.createTreeWalker(\n input,\n NodeFilter.SHOW_TEXT,\n {acceptNode: (node) => node.parentElement === input && !node.nodeValue/* && !++i */ ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT}\n );\n\n let textNode: Text;\n while(textNode = treeWalker.nextNode() as Text) {\n log.warn('removing empty text node', textNode);\n textNode.remove();\n }\n }\n\n private removePossibleBOMSiblings(previousSibling: ChildNode, nextSibling: ChildNode) {\n [previousSibling, nextSibling].forEach((sibling) => {\n if((sibling as HTMLElement)?.classList?.contains('input-filler')) {\n sibling.remove();\n }\n });\n }\n\n private removePossibleBOMSiblingsByNode(node: ChildNode) {\n const {previousSibling, nextSibling} = node;\n this.removePossibleBOMSiblings(previousSibling, nextSibling);\n };\n\n private processEmptiedFillers(input: HTMLElement) {\n input.querySelectorAll('.input-filler-text').forEach((el) => {\n this.removeExtraBOMs(el);\n\n let cleanSiblings = true;\n if(!el.textContent) {\n el.classList.replace('input-filler-text', 'input-filler');\n\n const textNode = Array.from(el.childNodes).find((node) => node.nodeType === node.TEXT_NODE);\n if(textNode) {\n (textNode as CharacterData).insertData(0, BOM);\n } else if(((el as any).t as ChildNode)?.nodeValue) {\n el.append((el as any).t);\n } else {\n el.append(document.createTextNode(BOM));\n }\n } else if(!NOT_ONLY_BOMS_REG_EXP.test(el.textContent) && !el.querySelector('.input-something')) {\n el.classList.replace('input-filler-text', 'input-filler');\n } else {\n cleanSiblings = false;\n }\n\n if(cleanSiblings) {\n this.removePossibleBOMSiblingsByNode(el);\n }\n });\n }\n\n private processFilledFillers(input: HTMLElement) {\n // remove the BOM when changing to text\n input.querySelectorAll('.input-filler').forEach((el) => {\n if(el.textContent !== BOM) {\n el.classList.replace('input-filler', 'input-filler-text');\n const t = (el as any).t as ChildNode;\n const bomNode = Array.from(el.childNodes).find((node) => node.nodeType === node.TEXT_NODE && node.nodeValue.includes(BOM));\n if(bomNode && !t?.nodeValue) {\n const idx = bomNode.nodeValue.indexOf(BOM);\n if(idx !== -1) {\n (bomNode as CharacterData).deleteData(idx, BOM.length);\n }\n }\n\n // t?.remove();\n }\n });\n }\n\n private setSelectionClassName(selection: Selection, input?: HTMLElement) {\n // Array.from(this.messageInput.querySelectorAll('.selection')).forEach((element) => {\n // element.classList.remove('selection');\n // });\n\n if(selection.rangeCount) {\n const range = selection.getRangeAt(0);\n\n if(input) {\n Array.from(input.querySelectorAll('.input-selectable')).forEach((element) => {\n element.classList.toggle('selection', !range.collapsed && range.intersectsNode(element));\n });\n } else {\n Array.from(document.querySelectorAll('.input-selectable.selection')).forEach((element) => element.classList.remove('selection'));\n }\n }\n }\n\n private move(selection: Selection, left: boolean) {\n const {focusNode: focusNodeBefore, focusOffset: focusOffsetBefore} = selection;\n selection.modify('extend', left ? 'backward' : 'forward', 'character');\n // if(offset === nodeValue.length) {\n // selection.modify('extend', !left ? 'backward' : 'forward', 'character');\n // }\n if(left) selection.collapseToStart();\n else selection.collapseToEnd();\n const {focusNode: focusNodeAfter, focusOffset: focusOffsetAfter} = selection;\n this.log(\n 'moving cursor',\n left,\n focusNodeBefore,\n focusNodeBefore.nodeType === focusNodeBefore.ELEMENT_NODE ? focusNodeBefore : focusNodeBefore.parentElement,\n focusOffsetBefore,\n focusNodeAfter,\n focusNodeAfter.nodeType === focusNodeAfter.ELEMENT_NODE ? focusNodeAfter : focusNodeAfter.parentElement,\n focusOffsetAfter\n );\n }\n\n public prepareApplyingMarkdown() {\n const {input} = this;\n\n // do not wrap fillers into spans\n const fillers = input.querySelectorAll('.input-filler');\n // fillers.forEach((el) => {\n // el.contentEditable = 'false';\n // });\n\n const smths = input.querySelectorAll('.input-something');\n smths.forEach((el) => {\n el.contentEditable = 'inherit';\n });\n\n return () => {\n fillers.forEach((el) => {\n el.contentEditable = 'inherit';\n });\n\n smths.forEach((el) => {\n el.contentEditable = 'false';\n });\n\n this.removeExtraBOMs(input);\n };\n }\n\n public static getInstance() {\n return this.INSTANCE ??= new RichInputHandler();\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 {ScrollableBase} from '../../components/scrollable';\nimport SwipeHandler from '../../components/swipeHandler';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport rootScope from '../../lib/rootScope';\nimport {Middleware} from '../middleware';\nimport clamp from '../number/clamp';\nimport safeAssign from '../object/safeAssign';\nimport pause from '../schedulers/pause';\nimport cancelEvent from './cancelEvent';\nimport {attachClickEvent} from './clickEvent';\nimport findUpAsChild from './findUpAsChild';\nimport positionElementByIndex from './positionElementByIndex';\nimport whichChild from './whichChild';\n\nexport default class Sortable {\n private element: HTMLElement;\n private elementRect: DOMRect;\n private containerRect: DOMRect;\n private scrollableRect: DOMRect;\n private minY: number;\n private maxY: number;\n private siblings: HTMLElement[];\n private swipeHandler: SwipeHandler;\n private startScrollPos: number;\n private addScrollPos: number;\n\n private list: HTMLElement;\n private middleware: Middleware;\n private onSort: (prevIdx: number, newIdx: number) => void;\n private scrollable: ScrollableBase;\n\n constructor(options: {\n list: HTMLElement,\n middleware: Middleware,\n onSort: Sortable['onSort'],\n scrollable?: Sortable['scrollable']\n }) {\n safeAssign(this, options);\n\n this.swipeHandler = new SwipeHandler({\n element: this.list,\n onSwipe: this.onSwipe,\n verifyTouchTarget: this.verifyTouchTarget,\n onStart: this.onStart,\n onReset: this.onReset,\n setCursorTo: document.body,\n middleware: this.middleware,\n withDelay: true\n });\n }\n\n private onSwipe = (xDiff: number, yDiff: number) => {\n yDiff = clamp(yDiff, this.minY, this.maxY);\n this.element.style.transform = `translateY(${yDiff}px)`;\n const count = Math.round(Math.abs(yDiff) / this.elementRect.height);\n const lastSiblings = this.siblings;\n this.siblings = [];\n const property = yDiff < 0 ? 'previousElementSibling' : 'nextElementSibling';\n let sibling = this.element[property] as HTMLElement;\n for(let i = 0; i < count; ++i) {\n if(this.getSortableTarget(sibling)) {\n this.siblings.push(sibling);\n sibling = sibling[property] as HTMLElement;\n } else {\n break;\n }\n }\n\n (lastSiblings || []).forEach((sibling) => {\n if(!this.siblings.includes(sibling)) {\n sibling.style.transform = '';\n }\n });\n\n this.siblings.forEach((sibling) => {\n const y = this.elementRect.height * (yDiff < 0 ? 1 : -1);\n sibling.style.transform = `translateY(${y}px)`;\n });\n\n if(this.scrollableRect) {\n const diff = yDiff;\n const toEnd = diff > 0;\n const elementEndPos = toEnd ? this.elementRect.bottom : this.elementRect.top;\n const clientY = elementEndPos + diff - this.addScrollPos;\n // console.log(clientY, this.scrollableRect.top, elementEndPos, diff, this.addScrollPos, toEnd);\n let change = 2;\n if((clientY + (toEnd ? 0 : this.elementRect.height)) >= this.scrollableRect.bottom/* && diff < this.maxY */) {\n\n } else if((clientY - (toEnd ? this.elementRect.height : 0)) <= this.scrollableRect.top/* && diff > this.minY */) {\n change *= -1;\n } else {\n change = undefined;\n }\n\n if(change !== undefined) {\n this.scrollable.container[this.scrollable.scrollProperty] += change;\n }\n }\n };\n\n private verifyTouchTarget = (e: {target: EventTarget}) => {\n if(this.list.classList.contains('is-reordering')) {\n return false;\n }\n\n this.element = this.getSortableTarget(e.target as HTMLElement);\n return !!this.element/* && pause(150).then(() => true) */;\n };\n\n private onScroll = () => {\n const scrollPos = this.scrollable.container[this.scrollable.scrollProperty];\n const diff = this.addScrollPos = scrollPos - this.startScrollPos;\n const isVertical = this.scrollable.scrollProperty === 'scrollTop';\n this.swipeHandler.add(isVertical ? 0 : diff, isVertical ? diff : 0);\n };\n\n private onStart = () => {\n this.list.classList.add('is-reordering');\n this.element.classList.add('is-dragging', 'no-transition');\n this.swipeHandler.setCursor('grabbing');\n this.elementRect = this.element.getBoundingClientRect();\n this.containerRect = this.list.getBoundingClientRect();\n\n this.minY = this.containerRect.top - this.elementRect.top;\n this.maxY = this.containerRect.bottom - this.elementRect.bottom;\n this.addScrollPos = 0;\n\n if(this.scrollable) {\n this.startScrollPos = this.scrollable.container[this.scrollable.scrollProperty];\n this.scrollableRect = this.scrollable.container.getBoundingClientRect();\n this.scrollable.container.addEventListener('scroll', this.onScroll);\n }\n };\n\n private onReset = async() => {\n const length = this.siblings.length;\n const move = length && length * (this.siblings[0].previousElementSibling === this.element ? 1 : -1);\n const idx = whichChild(this.element);\n const newIdx = idx + move;\n\n this.element.classList.remove('no-transition');\n this.element.style.transform = move ? `translateY(${move * this.elementRect.height}px)` : '';\n this.swipeHandler.setCursor('');\n\n if(this.scrollable) {\n this.scrollable.container.removeEventListener('scroll', this.onScroll);\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n attachClickEvent(document.body, cancelEvent, {capture: true, once: true});\n }\n\n if(rootScope.settings.animationsEnabled) {\n await pause(250);\n }\n\n this.list.classList.remove('is-reordering');\n this.element.classList.remove('is-dragging');\n positionElementByIndex(this.element, this.list, newIdx, idx);\n [this.element, ...this.siblings].forEach((element) => {\n element.style.transform = '';\n });\n\n this.element =\n this.siblings =\n this.elementRect =\n this.containerRect =\n this.minY =\n this.maxY =\n this.startScrollPos =\n this.addScrollPos =\n undefined;\n\n // cancelClick = true;\n\n if(!move) {\n return;\n }\n\n this.onSort(idx, newIdx);\n };\n\n private getSortableTarget(target: HTMLElement) {\n if(!target) {\n return;\n }\n\n let child = findUpAsChild(target as HTMLElement, this.list);\n if(child && child.classList.contains('cant-sort')) {\n child = undefined;\n }\n\n return child;\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 toggleDisability(elements: HTMLElement[], disable: boolean): () => void {\n if(disable) {\n elements.forEach((el) => el.setAttribute('disabled', 'true'));\n } else {\n elements.forEach((el) => el.removeAttribute('disabled'));\n }\n\n return () => toggleDisability(elements, !disable);\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 whichChild(elem: Node, countNonElements?: boolean) {\n if(!elem.parentNode) {\n return -1;\n }\n\n if(countNonElements) {\n return Array.from(elem.parentNode.childNodes).indexOf(elem as ChildNode);\n }\n\n let i = 0;\n // @ts-ignore\n while((elem = elem.previousElementSibling) !== null) ++i;\n return i;\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, detachClickEvent} from './dom/clickEvent';\nimport findUpAsChild from './dom/findUpAsChild';\nimport EventListenerBase from './eventListenerBase';\nimport ListenerSetter from './listenerSetter';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport safeAssign from './object/safeAssign';\nimport appNavigationController, {NavigationItem} from '../components/appNavigationController';\nimport findUpClassName from './dom/findUpClassName';\nimport rootScope from '../lib/rootScope';\n\nconst KEEP_OPEN = false;\nconst TOGGLE_TIMEOUT = 200;\nconst ANIMATION_DURATION = 200;\n\nexport type IgnoreMouseOutType = 'click' | 'menu' | 'popup';\ntype DropdownHoverTimeoutType = 'toggle' | 'done';\n\nexport default class DropdownHover extends EventListenerBase<{\n open: () => Promise | void,\n openAfterLayout: () => void,\n opened: () => any,\n close: () => any,\n closed: () => any\n}> {\n protected element: HTMLElement;\n protected forceClose: boolean;\n protected inited: boolean;\n protected ignoreMouseOut: Set;\n protected ignoreButtons: Set;\n protected navigationItem: NavigationItem;\n protected ignoreOutClickClassName: string;\n protected timeouts: {[type in DropdownHoverTimeoutType]?: number};\n\n constructor(options: {\n element: DropdownHover['element'],\n ignoreOutClickClassName?: string\n }) {\n super(false);\n safeAssign(this, options);\n this.forceClose = false;\n this.inited = false;\n this.ignoreMouseOut = new Set();\n this.ignoreButtons = new Set();\n this.timeouts = {};\n }\n\n public attachButtonListener(\n button: HTMLElement,\n listenerSetter: ListenerSetter\n ) {\n let firstTime = true;\n if(IS_TOUCH_SUPPORTED) {\n attachClickEvent(button, () => {\n if(firstTime) {\n firstTime = false;\n this.toggle(true);\n } else {\n this.toggle();\n }\n }, {listenerSetter});\n } else {\n listenerSetter.add(button)('mouseover', (e) => {\n if(firstTime) {\n listenerSetter.add(button)('mouseout', (e) => {\n this.clearTimeout('toggle');\n this.onMouseOut(e);\n });\n firstTime = false;\n }\n\n this.setTimeout('toggle', () => {\n this.toggle(true);\n }, TOGGLE_TIMEOUT);\n });\n\n attachClickEvent(button, () => {\n const type: IgnoreMouseOutType = 'click';\n const ignore = !this.ignoreMouseOut.has(type);\n\n if(ignore && !this.ignoreMouseOut.size) {\n this.ignoreButtons.add(button);\n setTimeout(() => {\n attachClickEvent(window, this.onClickOut, {capture: true});\n }, 0);\n }\n\n this.setIgnoreMouseOut(type, ignore);\n this.toggle(ignore);\n }, {listenerSetter});\n }\n }\n\n protected onClickOut = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n if(\n !findUpAsChild(target, this.element) &&\n !Array.from(this.ignoreButtons).some((button) => findUpAsChild(target, button) || target === button) &&\n this.ignoreMouseOut.size <= 1 &&\n (!this.ignoreOutClickClassName || !findUpClassName(target, this.ignoreOutClickClassName))\n ) {\n this.toggle(false);\n }\n };\n\n protected onMouseOut = (e: MouseEvent) => {\n if(KEEP_OPEN || !this.isActive()) return;\n this.clearTimeout('toggle');\n\n if(this.ignoreMouseOut.size) {\n return;\n }\n\n const toElement = (e as any).toElement as HTMLElement;\n if(toElement && findUpAsChild(toElement, this.element)) {\n return;\n }\n\n this.setTimeout('toggle', () => {\n this.toggle(false);\n }, TOGGLE_TIMEOUT);\n };\n\n protected clearTimeout(type: DropdownHoverTimeoutType) {\n if(this.timeouts[type] !== undefined) {\n clearTimeout(this.timeouts[type]);\n delete this.timeouts[type];\n }\n }\n\n protected setTimeout(type: DropdownHoverTimeoutType, cb: () => void, timeout: number) {\n this.clearTimeout(type);\n this.timeouts[type] = window.setTimeout(() => {\n this.clearTimeout(type);\n cb();\n }, timeout);\n }\n\n public init() {\n if(!IS_TOUCH_SUPPORTED) {\n this.element.onmouseout = this.onMouseOut;\n this.element.onmouseover = (e) => {\n if(this.forceClose) {\n return;\n }\n\n // console.log('onmouseover element');\n this.clearTimeout('toggle');\n };\n }\n }\n\n public toggle = async(enable?: boolean) => {\n // if(!this.element) return;\n const willBeActive = (!!this.element.style.display && enable === undefined) || enable;\n if(this.init) {\n if(willBeActive) {\n this.init();\n this.init = null;\n } else {\n return;\n }\n }\n\n if(willBeActive === this.isActive()) {\n return;\n }\n\n const delay = IS_TOUCH_SUPPORTED || !rootScope.settings.animationsEnabled ? 0 : ANIMATION_DURATION;\n if((this.element.style.display && enable === undefined) || enable) {\n const res = this.dispatchResultableEvent('open');\n await Promise.all(res);\n\n this.element.style.display = '';\n void this.element.offsetLeft; // reflow\n this.element.classList.add('active');\n\n this.dispatchEvent('openAfterLayout');\n\n appNavigationController.pushItem(this.navigationItem = {\n type: 'dropdown',\n onPop: () => {\n this.toggle(false);\n }\n });\n\n this.clearTimeout('toggle');\n this.setTimeout('done', () => {\n this.forceClose = false;\n this.dispatchEvent('opened');\n }, delay);\n\n // ! can't use together with resizeObserver\n /* if(isTouchSupported) {\n const height = this.element.scrollHeight + appImManager.chat.input.inputContainer.scrollHeight - 10;\n console.log('[ESG]: toggle: enable height', height);\n appImManager.chat.bubbles.scrollable.scrollTop += height;\n } */\n\n /* if(touchSupport) {\n this.restoreScroll();\n } */\n } else {\n this.dispatchEvent('close');\n this.ignoreMouseOut.clear();\n this.ignoreButtons.clear();\n\n this.element.classList.remove('active');\n\n appNavigationController.removeItem(this.navigationItem);\n detachClickEvent(window, this.onClickOut, {capture: true});\n\n this.clearTimeout('toggle');\n this.setTimeout('done', () => {\n this.element.style.display = 'none';\n this.forceClose = false;\n this.dispatchEvent('closed');\n }, delay);\n\n /* if(isTouchSupported) {\n const scrollHeight = this.container.scrollHeight;\n if(scrollHeight) {\n const height = this.container.scrollHeight + appImManager.chat.input.inputContainer.scrollHeight - 10;\n appImManager.chat.bubbles.scrollable.scrollTop -= height;\n }\n } */\n\n /* if(touchSupport) {\n this.restoreScroll();\n } */\n }\n\n // animationIntersector.checkAnimations(false, EMOTICONSSTICKERGROUP);\n };\n\n public isActive() {\n return this.element.classList.contains('active');\n }\n\n public setIgnoreMouseOut(type: IgnoreMouseOutType, ignore: boolean) {\n ignore ? this.ignoreMouseOut.add(type) : this.ignoreMouseOut.delete(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\n// * Jolly Cobra's fastSmoothScroll slightly patched\n\nimport {dispatchHeavyAnimationEvent} from '../hooks/useHeavyAnimationCheck';\nimport {fastRafPromise} from './schedulers';\nimport {animateSingle, cancelAnimationByKey} from './animation';\nimport rootScope from '../lib/rootScope';\nimport isInDOM from './dom/isInDOM';\n\nconst MIN_JS_DURATION = 250;\nconst MAX_JS_DURATION = 600;\nconst LONG_TRANSITION_MAX_DISTANCE = 1500;\nconst SHORT_TRANSITION_MAX_DISTANCE = 500;\n\nexport enum FocusDirection {\n Up,\n Down,\n Static,\n};\n\nexport type ScrollGetNormalSizeCallback = (options: {rect: DOMRect}) => number;\nexport type ScrollGetElementPositionCallback = (options: {elementRect: DOMRect, containerRect: DOMRect, elementPosition: number}) => number;\nexport type ScrollStartCallbackDimensions = {\n scrollSize: number,\n scrollPosition: number,\n distanceToEnd: number,\n path: number,\n duration: number,\n containerRect: DOMRect,\n elementRect: DOMRect,\n getProgress: () => number\n};\n\nexport type ScrollOptions = {\n container: HTMLElement,\n element: HTMLElement,\n position: ScrollLogicalPosition,\n margin?: number,\n maxDistance?: number,\n forceDirection?: FocusDirection,\n forceDuration?: number,\n axis?: 'x' | 'y',\n getNormalSize?: ScrollGetNormalSizeCallback,\n getElementPosition?: ScrollGetElementPositionCallback,\n fallbackToElementStartWhenCentering?: HTMLElement,\n startCallback?: (dimensions: ScrollStartCallbackDimensions) => void,\n transitionFunction?: (value: number) => number\n};\n\nexport default function fastSmoothScroll(options: ScrollOptions) {\n options.margin ??= 0;\n options.maxDistance ??= LONG_TRANSITION_MAX_DISTANCE;\n options.axis ??= 'y';\n // return;\n\n if(!rootScope.settings.animationsEnabled || options.forceDuration === 0) {\n options.forceDirection = FocusDirection.Static;\n }\n\n if(options.forceDirection === FocusDirection.Static) {\n options.forceDuration = 0;\n return scrollWithJs(options);\n /* return Promise.resolve();\n\n element.scrollIntoView({ block: position });\n\n cancelAnimationByKey(container);\n return Promise.resolve(); */\n }\n\n const promise = fastRafPromise().then(() => scrollWithJs(options));\n\n return options.axis === 'y' ? dispatchHeavyAnimationEvent(promise) : promise;\n}\n\nfunction scrollWithJs(options: ScrollOptions): Promise {\n const {element, container, getNormalSize, getElementPosition, transitionFunction, axis, margin, position, forceDirection, maxDistance, forceDuration} = options;\n if(!isInDOM(element)) {\n cancelAnimationByKey(container);\n return Promise.resolve();\n }\n\n const rectStartKey = axis === 'y' ? 'top' : 'left';\n const rectEndKey = axis === 'y' ? 'bottom' : 'right';\n const sizeKey = axis === 'y' ? 'height' : 'width';\n const scrollSizeKey = axis === 'y' ? 'scrollHeight' : 'scrollWidth';\n const elementScrollSizeKey = axis === 'y' ? 'scrollHeight' : 'offsetWidth'; // can use offsetWidth for X, since it's almost same as scrollWidth\n const scrollPositionKey = axis === 'y' ? 'scrollTop' : 'scrollLeft';\n\n // const { offsetTop: elementTop, offsetHeight: elementHeight } = element;\n const elementRect = element.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect ? container.getBoundingClientRect() : document.body.getBoundingClientRect();\n\n // const transformable = container.firstElementChild as HTMLElement;\n\n const possibleElementPosition = elementRect[rectStartKey] - containerRect[rectStartKey];\n const elementPosition = getElementPosition ? getElementPosition({elementRect, containerRect, elementPosition: possibleElementPosition}) : possibleElementPosition;\n const elementSize = element[elementScrollSizeKey]; // margin is exclusive in DOMRect\n\n const containerSize = getNormalSize ? getNormalSize({rect: containerRect}) : containerRect[sizeKey];\n\n let scrollPosition = container[scrollPositionKey];\n const scrollSize = container[scrollSizeKey];\n /* const elementPosition = element.offsetTop;\n const elementSize = element.offsetHeight;\n\n const scrollPosition = container[scrollPositionKey];\n const scrollSize = container[scrollSizeKey];\n const containerSize = container.offsetHeight; */\n\n let path!: number;\n\n switch(position) {\n case 'start':\n path = elementPosition - margin;\n break;\n case 'end':\n path = elementRect[rectEndKey] /* + (elementSize - elementRect[sizeKey]) */ - containerRect[rectEndKey] + margin;\n break;\n // 'nearest' is not supported yet\n case 'nearest':\n case 'center':\n if(elementSize < containerSize) {\n path = (elementPosition + elementSize / 2) - (containerSize / 2);\n } else {\n if(options.fallbackToElementStartWhenCentering && options.fallbackToElementStartWhenCentering !== element) {\n options.element = options.fallbackToElementStartWhenCentering;\n options.position = 'start';\n return scrollWithJs(options);\n }\n\n path = elementPosition - margin;\n }\n\n break;\n }\n /* switch (position) {\n case 'start':\n path = (elementPosition - margin) - scrollPosition;\n break;\n case 'end':\n path = (elementPosition + elementSize + margin) - (scrollPosition + containerSize);\n break;\n // 'nearest' is not supported yet\n case 'nearest':\n case 'center':\n path = elementSize < containerSize\n ? (elementPosition + elementSize / 2) - (scrollPosition + containerSize / 2)\n : (elementPosition - margin) - scrollPosition;\n break;\n } */\n\n if(Math.abs(path - (margin || 0)) < 1) {\n cancelAnimationByKey(container);\n return Promise.resolve();\n }\n\n if(axis === 'y') {\n if(forceDirection === undefined) {\n if(path > maxDistance) {\n scrollPosition = container.scrollTop += path - maxDistance;\n path = maxDistance;\n } else if(path < -maxDistance) {\n scrollPosition = container.scrollTop += path + maxDistance;\n path = -maxDistance;\n }\n }/* else if(forceDirection === FocusDirection.Up) { // * not tested yet\n container.scrollTop = offsetTop + container.scrollTop + maxDistance;\n } else if(forceDirection === FocusDirection.Down) { // * not tested yet\n container.scrollTop = Math.max(0, offsetTop + container.scrollTop - maxDistance);\n } */\n }\n\n // console.log('scrollWithJs: will scroll path:', path, element);\n\n /* let existsTransform = 0;\n const currentTransform = transformable.style.transform;\n if(currentTransform) {\n existsTransform = parseInt(currentTransform.match(/\\((.+?), (.+?), .+\\)/)[2]);\n //path += existsTransform;\n } */\n\n if(path < 0) {\n const remainingPath = -scrollPosition;\n path = Math.max(path, remainingPath);\n } else if(path > 0) {\n const remainingPath = scrollSize - (scrollPosition + containerSize);\n path = Math.min(path, remainingPath);\n }\n\n const target = container[scrollPositionKey] + path;\n const absPath = Math.abs(path);\n const duration = forceDuration ?? (\n MIN_JS_DURATION + (absPath / LONG_TRANSITION_MAX_DISTANCE) * (MAX_JS_DURATION - MIN_JS_DURATION)\n );\n const startAt = Date.now();\n\n /* transformable.classList.add('no-transition');\n\n const tickTransform = () => {\n const t = duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\n const currentPath = path * transition(t);\n\n transformable.style.transform = `translate3d(0, ${-currentPath}px, 0)`;\n container.dataset.translate = '' + -currentPath;\n\n const willContinue = t < 1;\n if(!willContinue) {\n fastRaf(() => {\n delete container.dataset.transform;\n container.dataset.transform = '';\n transformable.style.transform = '';\n void transformable.offsetLeft; // reflow\n transformable.classList.remove('no-transition');\n void transformable.offsetLeft; // reflow\n container[scrollPositionKey] = Math.round(target);\n });\n }\n\n return willContinue;\n };\n\n return animateSingle(tickTransform, container); */\n\n /* return new Promise((resolve) => {\n fastRaf(() => {\n transformable.style.transform = '';\n transformable.style.transition = '';\n\n setTimeout(resolve, duration);\n });\n });\n\n const transformableHeight = transformable.scrollHeight;\n //transformable.style.minHeight = `${transformableHeight}px`;\n */\n\n const transition = transitionFunction ?? (absPath < SHORT_TRANSITION_MAX_DISTANCE ? shortTransition : longTransition);\n const getProgress = () => duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\n const tick = () => {\n const t = getProgress();\n const value = transition(t);\n const currentPath = path * (1 - value);\n container[scrollPositionKey] = Math.round(target - currentPath);\n\n return t < 1;\n };\n\n if(!duration || !path) {\n cancelAnimationByKey(container);\n tick();\n return Promise.resolve();\n }\n\n /* return new Promise((resolve) => {\n setTimeout(resolve, duration);\n }).then(() => {\n transformable.classList.add('no-transition');\n void transformable.offsetLeft; // reflow\n transformable.style.transform = '';\n transformable.style.transition = '';\n void transformable.offsetLeft; // reflow\n transformable.classList.remove('no-transition');\n void transformable.offsetLeft; // reflow\n fastRaf(() => {\n\n container[scrollPositionKey] = Math.round(target);\n //transformable.style.minHeight = ``;\n });\n\n }); */\n\n if(options.startCallback) {\n const distanceToEnd = scrollSize - Math.round(target + container[axis === 'y' ? 'offsetHeight' : 'offsetWidth']);\n options.startCallback({\n scrollSize,\n scrollPosition,\n distanceToEnd,\n path,\n duration,\n containerRect,\n elementRect,\n getProgress\n });\n }\n\n return animateSingle(tick, container);\n}\n\nfunction longTransition(t: number) {\n return 1 - ((1 - t) ** 5);\n}\n\nfunction shortTransition(t: number) {\n return 1 - ((1 - t) ** 3.5);\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 {InputFileLocation, InputStickerSet, InputWebFileLocation} from '../layer';\nimport type {DownloadOptions} from '../lib/mtproto/apiFileManager';\n\nconst FILENAME_JOINER = '_';\n\nexport function getFileNameByLocation(location: InputFileLocation | InputWebFileLocation, options?: Partial<{\n fileName: string,\n downloadId: string\n}>) {\n const fileName = '';// (options?.fileName || '').split('.');\n const ext = fileName[fileName.length - 1] || '';\n\n let str: string;\n switch(location._) {\n case 'inputPhotoFileLocation': {\n str = ['photo', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\n break;\n }\n\n case 'inputDocumentFileLocation': {\n str = ['document', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\n break;\n }\n\n case 'inputPeerPhotoFileLocation':\n str = ['peerPhoto', location.photo_id, location.pFlags.big ? 'big' : 'small'].join(FILENAME_JOINER);\n break;\n\n case 'inputStickerSetThumb': {\n const id = (location.stickerset as InputStickerSet.inputStickerSetID).id ||\n (location.stickerset as InputStickerSet.inputStickerSetShortName).short_name ||\n (location.stickerset as InputStickerSet.inputStickerSetDice).emoticon ||\n location.stickerset._;\n str = ['stickerSetThumb', id, location.thumb_version].join(FILENAME_JOINER);\n break;\n }\n\n case 'inputFileLocation': {\n str = [location.volume_id, location.local_id].join(FILENAME_JOINER);\n break;\n }\n\n case 'inputWebFileLocation': {\n str = ['webFile', location.url].join(FILENAME_JOINER);\n break;\n }\n\n default: {\n console.error('Unrecognized location:', location);\n str = '';\n break;\n }\n }\n\n return str + (options?.downloadId ? '_download' : '') + (ext ? '.' + ext : ext);\n}\n\nexport type FileURLType = 'photo' | 'thumb' | 'document' | 'stream' | 'download';\nexport function getFileURL(type: FileURLType, options: DownloadOptions) {\n // console.log('getFileURL', location);\n // const perf = performance.now();\n const encoded = encodeURIComponent(JSON.stringify(options));\n // console.log('getFileURL encode:', performance.now() - perf, encoded);\n\n return /* '/' + */type + '/' + encoded;\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 {Message, MessageAction} from '../layer';\nimport type {MyMessage} from '../lib/appManagers/appMessagesManager';\nimport forEachReverse from './array/forEachReverse';\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 {i18n, LangPackKey} from '../lib/langPack';\n\nexport default function formatBytes(bytes: number, decimals: number | 'auto' = 'auto') {\n if(bytes === 0) return i18n('FileSize.B', [0]);\n\n const strictDecimals = decimals === 'auto';\n\n const k = 1024;\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n const _decimals = decimals === 'auto' ? Math.max(0, i - 1) : decimals;\n\n const dm = Math.max(0, _decimals);\n const sizes: LangPackKey[] = ['FileSize.B', 'FileSize.KB', 'FileSize.MB', 'FileSize.GB'];\n\n const fixed = (bytes / Math.pow(k, i)).toFixed(dm);\n return i18n(sizes[i], [strictDecimals ? fixed : parseFloat(fixed)]);\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, join, LangPackKey} from '../lib/langPack';\nimport formatDuration, {DurationType} from './formatDuration';\n\nconst CALL_DURATION_LANG_KEYS: {[type in DurationType]: LangPackKey} = {\n s: 'Seconds',\n m: 'Minutes',\n h: 'Hours',\n d: 'Days',\n w: 'Weeks',\n mm: 'Months',\n y: 'Years'\n};\nexport default function formatCallDuration(duration: number, plain?: boolean) {\n const a = formatDuration(duration, 2);\n if(plain) {\n const strings = a.map((d) => I18n.format(CALL_DURATION_LANG_KEYS[d.type], true, [d.duration]));\n return join(strings, false, plain);\n }\n\n const elements = a.map((d) => i18n(CALL_DURATION_LANG_KEYS[d.type], [d.duration]));\n\n const fragment = document.createElement('span');\n fragment.append(...join(elements, false));\n\n return fragment;\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 type DurationType = 's' | 'm' | 'h' | 'd' | 'w' | 'mm' | 'y';\nexport default function formatDuration(duration: number, showLast = 2) {\n if(!duration) {\n duration = 1;\n }\n\n const d: {duration: number, type: DurationType}[] = [];\n const p = [\n {m: 1, t: 's'},\n {m: 60, t: 'm'},\n {m: 60, t: 'h'},\n {m: 24, t: 'd'},\n {m: 7, t: 'w'}\n ] as Array<{m?: number, t: DurationType}>\n const s = 1;\n let t = s;\n p.forEach((o, idx) => {\n t = Math.round(t * o.m);\n\n if(duration < t) {\n return;\n }\n\n let dd = duration / t;\n if(idx !== (p.length - 1)) {\n const modulus = p[idx === (p.length - 1) ? idx : idx + 1].m;\n dd %= modulus;\n }\n\n d.push({\n duration: dd | 0,\n type: o.t\n });\n });\n\n const out = d.slice(-showLast).reverse();\n for(let i = out.length - 1; i >= 0; --i) {\n if(out[i].duration === 0) {\n out.splice(i, 1);\n }\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\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 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 const 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]) {\n patternMatches += 1.01;\n } else if(_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","/*\n * 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 {RLottieColor} from '../lib/rlottie/rlottiePlayer';\n\nexport type FramesCacheMap = Map;\nexport type FramesCacheMapNew = Map;\nexport type FramesCacheMapURLs = Map;\nexport type FramesCacheItem = {\n frames: FramesCacheMap,\n framesNew: FramesCacheMapNew,\n framesURLs: FramesCacheMapURLs,\n clearCache: () => void,\n counter: number\n};\n\nexport class FramesCache {\n private cache: Map;\n\n constructor() {\n this.cache = new Map();\n }\n\n public static createCache(): FramesCacheItem {\n const cache: FramesCacheItem = {\n frames: new Map(),\n framesNew: new Map(),\n framesURLs: new Map(),\n clearCache: () => {\n cache.framesNew.forEach((value) => {\n (value as ImageBitmap).close?.();\n });\n\n cache.frames.clear();\n cache.framesNew.clear();\n cache.framesURLs.clear();\n },\n counter: 0\n };\n\n return cache;\n }\n\n public getCache(name: string) {\n let cache = this.cache.get(name);\n if(!cache) {\n this.cache.set(name, cache = FramesCache.createCache());\n } else {\n // console.warn('[RLottieCache] cache will be reused', cache);\n }\n\n ++cache.counter;\n return cache;\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 framesCache = new FramesCache();\n\nexport default framesCache;\n","/*\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// generate a path's arc data parameter\n\nimport {MOUNT_CLASS_TO} from '../config/debug';\n\n// http://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands\nfunction arcParameter(rx: number, ry: number, xAxisRotation: number, largeArcFlag: number, sweepFlag: number, x: number, y: number) {\n return [rx, ',', ry, ' ',\n xAxisRotation, ' ',\n largeArcFlag, ',',\n sweepFlag, ' ',\n x, ',', y].join('');\n}\n\nexport default function generatePathData(x: number, y: number, width: number, height: number, tl: number, tr: number, br: number, bl: number) {\n const data: string[] = [];\n\n // start point in top-middle of the rectangle\n data.push('M' + (x + width / 2) + ',' + y);\n\n // next we go to the right\n data.push('H' + (x + width - tr));\n\n if(tr > 0) {\n // now we draw the arc in the top-right corner\n data.push('A' + arcParameter(tr, tr, 0, 0, 1, (x + width), (y + tr)));\n }\n\n // next we go down\n data.push('V' + (y + height - br));\n\n if(br > 0) {\n // now we draw the arc in the lower-right corner\n data.push('A' + arcParameter(br, br, 0, 0, 1, (x + width - br), (y + height)));\n }\n\n // now we go to the left\n data.push('H' + (x + bl));\n\n if(bl > 0) {\n // now we draw the arc in the lower-left corner\n data.push('A' + arcParameter(bl, bl, 0, 0, 1, (x + 0), (y + height - bl)));\n }\n\n // next we go up\n data.push('V' + (y + tl));\n\n if(tl > 0) {\n // now we draw the arc in the top-left corner\n data.push('A' + arcParameter(tl, tl, 0, 0, 1, (x + tl), (y + 0)));\n }\n\n // and we close the path\n data.push('Z');\n\n return data.join(' ');\n}\n\nMOUNT_CLASS_TO.generatePathData = generatePathData;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {PhotoSize} from '../layer';\nimport {MyDocument} from '../lib/appManagers/appDocsManager';\nimport {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport {renderImageFromUrlPromise} from './dom/renderImageFromUrl';\nimport getPreviewURLFromThumb from './getPreviewURLFromThumb';\nimport blur from './blur';\n\nexport default function getImageFromStrippedThumb(\n photo: MyPhoto | MyDocument,\n thumb: PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize,\n useBlur: boolean\n) {\n const url = getPreviewURLFromThumb(photo, thumb, false);\n\n let element: HTMLImageElement | HTMLCanvasElement, loadPromise: Promise;\n if(!useBlur) {\n element = new Image();\n loadPromise = renderImageFromUrlPromise(element, url);\n } else {\n const result = blur(url);\n element = result.canvas;\n loadPromise = result.promise;\n }\n\n element.classList.add('thumbnail');\n\n return {image: element, loadPromise};\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 {MyDocument} from '../lib/appManagers/appDocsManager';\nimport type {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport {PhotoSize} from '../layer';\n// import appDownloadManager from \"../lib/appManagers/appDownloadManager\";\nimport getPreviewURLFromBytes from './bytes/getPreviewURLFromBytes';\n\nexport default function 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 = getPreviewURLFromBytes(thumb.bytes, isSticker));\n return getPreviewURLFromBytes(thumb.bytes, isSticker);\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 {MyDocument} from '../lib/appManagers/appDocsManager';\nimport type {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport {THUMB_TYPE_FULL} from '../lib/mtproto/mtproto_config';\nimport type {ThumbCache} from '../lib/storages/thumbs';\nimport getImageFromStrippedThumb from './getImageFromStrippedThumb';\n\nexport default function getStrippedThumbIfNeeded(photo: MyPhoto | MyDocument, cacheContext: ThumbCache, useBlur: boolean, ignoreCache = false) {\n const isVideo = (['video', 'gif'] as MyDocument['type'][]).includes((photo as MyDocument).type);\n if(!cacheContext.downloaded || isVideo || ignoreCache) {\n if(\n photo._ === 'document' &&\n cacheContext.downloaded &&\n !ignoreCache &&\n (!isVideo || cacheContext.type !== THUMB_TYPE_FULL)\n ) {\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 getImageFromStrippedThumb(photo, thumb as any, useBlur);\n }\n }\n\n return null;\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/forEachReverse';\nimport safeAssign from './object/safeAssign';\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 | Promise;\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 filter(callback: (item: T, idx: number, arr: T[]) => boolean) {\n const filter = (item: T, idx: number, arr: T[]) => {\n if(!callback(item, idx, arr)) {\n arr.splice(idx, 1);\n }\n };\n\n forEachReverse(this.previous, filter);\n forEachReverse(this.next, filter);\n } */\n\n public reset(loadedAll = false) {\n this.current = undefined;\n this.previous = [];\n this.next = [];\n this.setLoaded(true, loadedAll);\n this.setLoaded(false, loadedAll);\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 if(this.current !== undefined) items.unshift(this.current);\n this.previous.push(...items);\n } else {\n items = this.previous.splice(Math.max(0, this.previous.length + length), -length);\n item = items.shift();\n if(!item) {\n return;\n }\n\n if(this.current !== undefined) items.push(this.current);\n this.next.unshift(...items);\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 protected unsetCurrent(toPrevious: boolean) {\n if(toPrevious) this.previous.push(this.current);\n else this.next.unshift(this.current);\n\n this.current = undefined;\n }\n\n public goUnsafe(length: number, dispatchJump?: boolean) {\n const leftLength = length > 0 ? Math.max(0, length - this.next.length) : Math.min(0, length + this.previous.length);\n const item = this.go(length, leftLength ? false : dispatchJump);\n\n /* if(length > 0 ? this.loadedAllUp : this.loadedAllDown) {\n this.unsetCurrent(length > 0);\n } */\n\n return {\n item: !leftLength ? item : undefined,\n leftLength\n };\n }\n\n protected setLoaded(down: boolean, value: boolean) {\n const isChanged = (down ? this.loadedAllDown : this.loadedAllUp) !== value;\n if(!isChanged) {\n return false;\n }\n\n if(down) this.loadedAllDown = value;\n else this.loadedAllUp = value;\n\n if(!value) {\n if(down) this.loadPromiseDown = null;\n else this.loadPromiseUp = null;\n }\n\n return true;\n }\n\n // ะฝะตั‚ ัะผั‹ัะปะฐ ะดะตะปะฐั‚ัŒ ะฟั€ะพะฒะตั€ะบัƒ ะดะปั reverse ะธ loadMediaPromise\n public load(older: boolean) {\n if(older ? this.loadedAllDown : this.loadedAllUp) return Promise.resolve();\n\n let promise = older ? this.loadPromiseDown : this.loadPromiseUp;\n if(promise) return promise;\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 anchor ??= this.current;\n promise = this.loadMore(anchor, older, this.loadCount).then(async(result) => {\n if((older ? this.loadPromiseDown : this.loadPromiseUp) !== promise) {\n return;\n }\n\n if(result.items.length < this.loadCount) {\n this.setLoaded(older, true);\n }\n\n if(this.count === undefined) {\n this.count = result.count || result.items.length;\n }\n\n const processedArr: (Promise | any)[] = [];\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 processedArr.push(processed);\n });\n\n const results = await Promise.all(processedArr);\n if(older) {\n if(this.reverse) this.previous.unshift(...results);\n else this.next.push(...results);\n } else {\n if(this.reverse) this.next.push(...results);\n else this.previous.unshift(...results);\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 EventListenerBase from './eventListenerBase';\n\nexport type Listener = {\n element: ListenerElement,\n event: ListenerEvent,\n callback: ListenerCallback,\n options?: ListenerOptions,\n\n onceFired?: true, // will be set only when options.once is set\n onceCallback?: () => void,\n};\n\nexport type ListenerElement = Window | Document | HTMLElement | Element | EventListenerBase;\nexport type ListenerEvent = string;\nexport type ListenerCallback = Function;\nexport type ListenerOptions = AddEventListenerOptions;\n\n/* const originalAddEventListener = HTMLElement.prototype.addEventListener;\nHTMLElement.prototype.addEventListener = function(this, name: string, callback: EventListenerOrEventListenerObject, options: AddEventListenerOptions) {\n console.log('nu zdarova', name);\n originalAddEventListener.call(this, name, callback, options);\n\n if(options?.ls) {\n return options.ls.addFromElement(this, name, callback as any, options);\n }\n}; */\n\nexport default class ListenerSetter {\n private listeners: Set = new Set();\n\n public add(element: T): T['addEventListener'] {\n return ((event: string, callback: Function, options: ListenerOptions) => {\n const listener: Listener = {element, event, callback, options};\n this.addManual(listener);\n return listener;\n }) as any;\n }\n\n /* public addFromElement(element: T, event: ListenerEvent, callback: ListenerCallback, options: ListenerOptions) {\n const listener: Listener = {element, event, callback, options};\n this.addManual(listener);\n return listener;\n } */\n\n public addManual(listener: Listener) {\n // @ts-ignore\n listener.element.addEventListener(listener.event, listener.callback, listener.options);\n\n if(listener.options?.once) { // remove listener when its called\n listener.onceCallback = () => {\n this.remove(listener);\n listener.onceFired = true;\n };\n\n // @ts-ignore\n listener.element.addEventListener(listener.event, listener.onceCallback, listener.options);\n }\n\n this.listeners.add(listener);\n }\n\n public remove(listener: Listener) {\n if(!listener.onceFired) {\n // @ts-ignore\n listener.element.removeEventListener(listener.event, listener.callback, listener.options);\n\n if(listener.onceCallback) {\n // @ts-ignore\n listener.element.removeEventListener(listener.event, listener.onceCallback, listener.options);\n }\n }\n\n this.listeners.delete(listener);\n }\n\n public removeManual(\n element: T,\n event: ListenerEvent,\n callback: ListenerCallback,\n options?: ListenerOptions\n ) {\n let listener: Listener;\n for(const _listener of this.listeners) {\n if(_listener.element === element &&\n _listener.event === event &&\n _listener.callback === callback &&\n _listener.options === options) {\n listener = _listener;\n break;\n }\n }\n\n if(listener) {\n this.remove(listener);\n }\n }\n\n public removeAll() {\n this.listeners.forEach((listener) => {\n this.remove(listener);\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 calcImageInBox from './calcImageInBox';\n\nexport class MediaSize {\n constructor(public width = 0, public height = width) {\n\n }\n\n public aspect(boxSize: MediaSize, fitted: boolean) {\n return calcImageInBox(this.width, this.height, boxSize.width, boxSize.height, fitted);\n }\n\n public aspectFitted(boxSize: MediaSize) {\n return this.aspect(boxSize, true);\n }\n\n public aspectCovered(boxSize: MediaSize) {\n return this.aspect(boxSize, false);\n }\n}\n\nexport function makeMediaSize(width?: number, height?: number): MediaSize {\n return new MediaSize(width, height);\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 {MOUNT_CLASS_TO} from '../config/debug';\nimport EventListenerBase from './eventListenerBase';\nimport {makeMediaSize, MediaSize} from './mediaSize';\n\ntype MediaTypeSizes = {\n regular: MediaSize,\n webpage: MediaSize,\n album: MediaSize,\n esgSticker: MediaSize,\n animatedSticker: MediaSize,\n staticSticker: MediaSize,\n emojiSticker: MediaSize,\n poll: MediaSize,\n round: MediaSize,\n documentName: MediaSize,\n invoice: MediaSize,\n extendedInvoice: MediaSize,\n customEmoji: MediaSize,\n esgCustomEmoji: MediaSize,\n emojiStatus: MediaSize,\n popupSticker: MediaSize\n};\n\nexport type MediaSizeType = keyof MediaTypeSizes;\n\nexport enum ScreenSize {\n mobile,\n medium,\n large\n}\n\nconst MOBILE_SIZE = 600;\nconst MEDIUM_SIZE = 1275;\nconst LARGE_SIZE = 1680;\n\nconst CUSTOM_EMOJI_SIZE = makeMediaSize(20, 20);\nconst ESG_CUSTOM_EMOJI_SIZE = makeMediaSize(36, 36);\nconst EMOJI_STATUS_SIZE = makeMediaSize(18, 18);\n\nclass MediaSizes extends EventListenerBase<{\n changeScreen: (from: ScreenSize, to: ScreenSize) => void,\n resize: () => void\n}> {\n private screenSizes: {key: ScreenSize, value: number}[] = [\n {key: ScreenSize.mobile, value: MOBILE_SIZE},\n {key: ScreenSize.medium, value: MEDIUM_SIZE},\n {key: ScreenSize.large, value: LARGE_SIZE}\n ];\n\n private sizes: {[k in 'desktop' | 'handhelds']: MediaTypeSizes} = {\n handhelds: {\n regular: makeMediaSize(270, 270),\n webpage: makeMediaSize(270, 200),\n album: makeMediaSize(270, 0),\n esgSticker: makeMediaSize(68, 68),\n animatedSticker: makeMediaSize(180, 180),\n staticSticker: makeMediaSize(180, 180),\n emojiSticker: makeMediaSize(112, 112),\n poll: makeMediaSize(240, 0),\n round: makeMediaSize(200, 200),\n documentName: makeMediaSize(200, 0),\n invoice: makeMediaSize(270, 270),\n extendedInvoice: makeMediaSize(270, 270),\n customEmoji: CUSTOM_EMOJI_SIZE,\n esgCustomEmoji: ESG_CUSTOM_EMOJI_SIZE,\n emojiStatus: EMOJI_STATUS_SIZE,\n popupSticker: makeMediaSize(68, 68)\n },\n desktop: {\n regular: makeMediaSize(420, 340),\n webpage: makeMediaSize(420, 340),\n album: makeMediaSize(420, 0),\n esgSticker: makeMediaSize(72, 72),\n animatedSticker: makeMediaSize(200, 200),\n staticSticker: makeMediaSize(200, 200),\n emojiSticker: makeMediaSize(112, 112),\n poll: makeMediaSize(330, 0),\n round: makeMediaSize(280, 280),\n documentName: makeMediaSize(240, 0),\n invoice: makeMediaSize(320, 320),\n extendedInvoice: makeMediaSize(420, 340),\n customEmoji: CUSTOM_EMOJI_SIZE,\n esgCustomEmoji: ESG_CUSTOM_EMOJI_SIZE,\n emojiStatus: EMOJI_STATUS_SIZE,\n popupSticker: makeMediaSize(80, 80)\n }\n };\n\n public isMobile = false;\n public active: MediaTypeSizes;\n public activeScreen: ScreenSize;\n private rAF: number;\n\n constructor() {\n super();\n\n window.addEventListener('resize', () => {\n if(this.rAF) window.cancelAnimationFrame(this.rAF);\n this.rAF = window.requestAnimationFrame(() => {\n this.handleResize();\n this.rAF = 0;\n });\n });\n this.handleResize();\n }\n\n private handleResize = () => {\n const innerWidth = window.innerWidth;\n // this.isMobile = innerWidth <= 720;\n\n let activeScreen = this.screenSizes[0].key;\n for(let i = this.screenSizes.length - 1; i >= 0; --i) {\n if(this.screenSizes[i].value < innerWidth) {\n activeScreen = (this.screenSizes[i + 1] || this.screenSizes[i]).key;\n break;\n }\n }\n\n const wasScreen = this.activeScreen;\n this.activeScreen = activeScreen;\n this.isMobile = this.activeScreen === ScreenSize.mobile;\n this.active = this.isMobile ? this.sizes.handhelds : this.sizes.desktop;\n\n // console.time('esg');\n // const computedStyle = window.getComputedStyle(document.documentElement);\n // this.active.esgSticker.width = parseFloat(computedStyle.getPropertyValue('--esg-sticker-size'));\n // console.timeEnd('esg');\n\n if(wasScreen !== activeScreen) {\n // console.log('changeScreen', this.activeScreen, activeScreen);\n\n if(wasScreen !== undefined) {\n this.dispatchEvent('changeScreen', wasScreen, activeScreen);\n }\n }\n\n if(wasScreen !== undefined) {\n this.dispatchEvent('resize');\n }\n\n /* if(this.isMobile) {\n for(let i in this.active) {\n // @ts-ignore\n let size = this.active[i];\n size.width = innerWidth\n }\n } */\n };\n}\n\nconst mediaSizes = new MediaSizes();\nMOUNT_CLASS_TO.mediaSizes = mediaSizes;\nexport default mediaSizes;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport makeError from './makeError';\n\nconst error = makeError('MIDDLEWARE');\nexport default function middlewarePromise(middleware: () => boolean, throwWhat: any = error) {\n return (promise: T): T => {\n if(!(promise instanceof Promise)) {\n if(promise instanceof Error) {\n throw promise;\n } else {\n return promise;\n }\n }\n\n return (promise as any as Promise).then((result) => {\n if(!middleware()) {\n throw throwWhat;\n }\n\n return result;\n }) as any;\n };\n}\n","export default function formatNumber(bytes: number, decimals = 2) {\n if(bytes === 0) return '0';\n\n const k = 1000;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['', 'K', 'M', 'B', 'T'];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + sizes[i];\n}\n","export default function numberThousandSplitter(x: number, joiner = ' ') {\n const parts = x.toString().split('.');\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, joiner);\n return parts.join('.');\n}\n","import {IS_APPLE_MOBILE} from '../environment/userAgent';\n\nexport default function onMediaLoad(media: HTMLMediaElement, readyState = media.HAVE_METADATA, useCanplayOnIos?: boolean) {\n return new Promise((resolve, reject) => {\n if(media.readyState >= readyState) {\n resolve();\n return;\n }\n\n const loadEventName = IS_APPLE_MOBILE && !useCanplayOnIos ? 'loadeddata' : 'canplay';\n const errorEventName = 'error';\n const onLoad = () => {\n media.removeEventListener(errorEventName, onError);\n resolve();\n };\n const onError = (e: ErrorEvent) => {\n media.removeEventListener(loadEventName, onLoad);\n reject(media.error);\n };\n media.addEventListener(loadEventName, onLoad, {once: true});\n media.addEventListener(errorEventName, onError, {once: 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 appNavigationController, {NavigationItem} from '../components/appNavigationController';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport {IS_MOBILE_SAFARI} from '../environment/userAgent';\nimport cancelEvent from './dom/cancelEvent';\nimport {CLICK_EVENT_NAME} from './dom/clickEvent';\nimport findUpAsChild from './dom/findUpAsChild';\nimport EventListenerBase from './eventListenerBase';\n\nexport default class OverlayClickHandler extends EventListenerBase<{\n toggle: (open: boolean) => void\n}> {\n protected element: HTMLElement;\n protected overlay: HTMLElement;\n protected listenerOptions: AddEventListenerOptions;\n\n constructor(\n protected navigationType: NavigationItem['type'],\n protected withOverlay?: boolean\n ) {\n super(false);\n this.listenerOptions = withOverlay ? {} : {capture: true};\n }\n\n protected onClick = (e: MouseEvent | TouchEvent) => {\n if(this.element && findUpAsChild(e.target as HTMLElement, this.element)) {\n return;\n }\n\n if(this.listenerOptions?.capture) {\n cancelEvent(e);\n }\n\n this.close();\n };\n\n public close() {\n if(this.element) {\n this.overlay?.remove();\n this.element = undefined;\n this.dispatchEvent('toggle', false);\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n // window.removeEventListener('keydown', onKeyDown, {capture: true});\n window.removeEventListener('contextmenu', this.onClick, this.listenerOptions);\n }\n\n document.removeEventListener(CLICK_EVENT_NAME, this.onClick, this.listenerOptions);\n\n if(!IS_MOBILE_SAFARI) {\n appNavigationController.removeByType(this.navigationType);\n }\n }\n\n public open(element: HTMLElement) {\n this.close();\n\n if(!IS_MOBILE_SAFARI) {\n appNavigationController.pushItem({\n type: this.navigationType,\n onPop: (canAnimate) => {\n this.close();\n }\n });\n }\n\n this.element = element;\n\n if(!this.overlay && this.withOverlay) {\n this.overlay = document.createElement('div');\n this.overlay.classList.add('btn-menu-overlay');\n\n // ! because this event must be canceled, and can't cancel on menu click (below)\n this.overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\n cancelEvent(e);\n this.onClick(e);\n });\n }\n\n this.overlay && this.element.parentElement.insertBefore(this.overlay, this.element);\n\n // document.body.classList.add('disable-hover');\n\n if(!IS_TOUCH_SUPPORTED) {\n // window.addEventListener('keydown', onKeyDown, {capture: true});\n window.addEventListener('contextmenu', this.onClick, {...this.listenerOptions, once: true});\n }\n\n /* // ! because this event must be canceled, and can't cancel on menu click (below)\n overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\n cancelEvent(e);\n onClick(e);\n }); */\n\n // ! safari iOS doesn't handle window click event on overlay, idk why\n document.addEventListener(CLICK_EVENT_NAME, this.onClick, this.listenerOptions);\n\n this.dispatchEvent('toggle', true);\n }\n}\n","import Currencies from '../config/currencies';\n\n// https://stackoverflow.com/a/34141813\nfunction number_format(number: any, decimals: any, dec_point: any, thousands_sep: any): string {\n // Strip all characters but numerical ones.\n number = (number + '').replace(/[^0-9+\\-Ee.]/g, '');\n var n = !isFinite(+number) ? 0 : +number,\n prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),\n sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep,\n dec = (typeof dec_point === 'undefined') ? '.' : dec_point,\n s: any = '',\n toFixedFix = function(n: number, prec: number) {\n var k = Math.pow(10, prec);\n return '' + Math.round(n * k) / k;\n };\n // Fix for IE parseFloat(0.55).toFixed(0) = 0;\n s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.');\n if(s[0].length > 3) {\n s[0] = s[0].replace(/\\B(?=(?:\\d{3})+(?!\\d))/g, sep);\n }\n if((s[1] || '').length < prec) {\n s[1] = s[1] || '';\n s[1] += new Array(prec - s[1].length + 1).join('0');\n }\n return s.join(dec);\n}\n\nexport default function paymentsWrapCurrencyAmount(amount: number | string, currency: string, skipSymbol?: boolean) {\n amount = +amount;\n\n const isNegative = amount < 0;\n\n const currencyData = Currencies[currency];\n if(!currencyData) {\n throw new Error('CURRENCY_WRAP_INVALID');\n }\n\n const amountExp = amount / Math.pow(10, currencyData.exp);\n\n let decimals = currencyData.exp;\n if(currency == 'IRR' && Math.floor(amountExp) == amountExp) {\n decimals = 0; // ัƒ ะธั€ะฐะฝั†ะตะฒ ะบะพะฟะตะนะบะธ ะฟะพั‡ั‚ะธ ะฒัะตะณะดะฐ = 0 ะธ ะฝะต ะฟะพะบะฐะทั‹ะฒะฐัŽั‚ัั ะฒ UI\n }\n\n let formatted = number_format(amountExp, decimals, currencyData.decimal_sep, currencyData.thousands_sep);\n if(skipSymbol) {\n return formatted;\n }\n\n let symbol = currencyData.symbol;\n if(isNegative && !currencyData.space_between && currencyData.symbol_left) {\n symbol = '-' + symbol;\n formatted = formatted.replace('-', '');\n }\n\n let out: string;\n const splitter = currencyData.space_between ? ' ' : '';\n if(currencyData.symbol_left) {\n out = symbol + splitter + formatted;\n } else {\n out = formatted + splitter + symbol;\n }\n return out;\n}\n\n(window as any).p = paymentsWrapCurrencyAmount;\n\n// function paymentsGetCurrencyExp($currency: string) {\n// if($currency == 'CLF') {\n// return 4;\n// }\n// if(['BHD','IQD','JOD','KWD','LYD','OMR','TND'].includes($currency)) {\n// return 3;\n// }\n// if(['BIF','BYR','CLP','CVE','DJF','GNF','ISK','JPY','KMF','KRW','MGA', 'PYG','RWF','UGX','UYI','VND','VUV','XAF','XOF','XPF'].includes($currency)) {\n// return 0;\n// }\n// if($currency == 'MRO') {\n// return 1;\n// }\n// return 2;\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 mediaSizes from './mediaSizes';\n\nexport type MenuPositionPadding = {\n top?: number,\n right?: number,\n bottom?: number,\n left?: number\n};\n\nconst PADDING_TOP = 8;\nconst PADDING_BOTTOM = PADDING_TOP;\nconst PADDING_LEFT = 8;\nconst PADDING_RIGHT = PADDING_LEFT;\nexport default function positionMenu(e: MouseEvent | Touch | TouchEvent, elem: HTMLElement, side?: 'left' | 'right' | 'center', additionalPadding?: MenuPositionPadding) {\n if((e as TouchEvent).touches) {\n e = (e as TouchEvent).touches[0];\n }\n\n const {pageX, pageY} = e as Touch;\n // let {clientX, clientY} = e;\n\n // * side mean the OPEN side\n\n const getScrollWidthFromElement = (Array.from(elem.children) as HTMLElement[]).find((element) => element.classList.contains('btn-menu-item') && !element.classList.contains('hide')) || elem;\n\n let {scrollWidth: menuWidth} = getScrollWidthFromElement;\n const {scrollHeight: menuHeight} = elem;\n // let {innerWidth: windowWidth, innerHeight: windowHeight} = window;\n const rect = document.body.getBoundingClientRect();\n const windowWidth = rect.width;\n const windowHeight = rect.height;\n\n menuWidth += getScrollWidthFromElement.offsetLeft * 2;\n\n let paddingTop = PADDING_TOP, paddingRight = PADDING_RIGHT, paddingBottom = PADDING_BOTTOM, paddingLeft = PADDING_LEFT;\n if(additionalPadding) {\n if(additionalPadding.top) paddingTop += additionalPadding.top;\n if(additionalPadding.right) paddingRight += additionalPadding.right;\n if(additionalPadding.bottom) paddingBottom += additionalPadding.bottom;\n if(additionalPadding.left) paddingLeft += additionalPadding.left;\n }\n\n side = mediaSizes.isMobile ? 'right' : 'left';\n let verticalSide: 'top' /* | 'bottom' */ | 'center' = 'top';\n\n const maxTop = windowHeight - menuHeight - paddingBottom;\n const maxLeft = windowWidth - menuWidth - paddingRight;\n const minTop = paddingTop;\n const minLeft = paddingLeft;\n\n const getSides = () => {\n return {\n x: {\n left: pageX,\n right: Math.min(maxLeft, pageX - menuWidth)\n },\n intermediateX: side === 'right' ? minLeft : maxLeft,\n // intermediateX: clientX < windowWidth / 2 ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\n y: {\n top: pageY,\n bottom: pageY - menuHeight\n },\n // intermediateY: verticalSide === 'top' ? paddingTop : windowHeight - menuHeight - paddingTop,\n // intermediateY: pageY < (windowHeight / 2) ? paddingTop : windowHeight - menuHeight - paddingBottom,\n intermediateY: maxTop\n };\n };\n\n const sides = getSides();\n\n const possibleSides = {\n x: {\n left: (sides.x.left + menuWidth + paddingRight) <= windowWidth,\n right: sides.x.right >= paddingLeft\n },\n y: {\n top: (sides.y.top + menuHeight + paddingBottom) <= windowHeight,\n bottom: (sides.y.bottom - paddingBottom) >= paddingBottom\n }\n };\n\n /* if(side === undefined) {\n if((clientX + menuWidth + PADDING_LEFT) > windowWidth) {\n side = 'right';\n }\n } */\n\n {\n /* const x = sides.x;\n\n const s = Object.keys(x) as (keyof typeof possibleSides.x)[];\n if(side) {\n s.findAndSplice((s) => s === side);\n s.unshift(side);\n }\n\n const possibleSide = s.find((s) => possibleSides.x[s]); */\n // let left: number;\n /* if(possibleSide) {\n left = x[possibleSide];\n side = possibleSide;\n } else {\n left = sides.intermediateX;\n side = undefined;\n } */\n const left = possibleSides.x[side] ? sides.x[side] : (side = 'center', sides.intermediateX);\n\n elem.style.left = left + 'px';\n }\n\n /* if((clientY + menuHeight + PADDING_TOP) > windowHeight) {\n elem.style.top = clamp(clientY - menuHeight, PADDING_TOP, windowHeight - menuHeight - PADDING_TOP) + 'px';\n // elem.style.top = (innerHeight - scrollHeight - PADDING_TOP) + 'px';\n verticalSide = 'bottom';\n } else {\n elem.style.top = Math.max(PADDING_TOP, clientY) + 'px';\n verticalSide = 'top';\n } */\n\n {\n const top = possibleSides.y[verticalSide] ? sides.y[verticalSide] : (verticalSide = 'center', sides.intermediateY);\n\n elem.style.top = top + 'px';\n }\n\n elem.className = elem.className.replace(/(top|center|bottom)-(left|center|right)/g, '');\n elem.classList.add(\n // (verticalSide === 'center' ? verticalSide : (verticalSide === 'bottom' ? 'top' : 'bottom')) +\n (verticalSide === 'center' ? verticalSide : 'bottom') +\n '-' +\n (side === 'center' ? side : (side === 'left' ? 'right' : 'left')));\n\n return {\n width: menuWidth,\n height: menuHeight\n };\n}\n","import {RestrictionReason} from '../layer';\n\nconst platforms = new Set([\n 'all',\n 'web',\n 'webk'\n]);\n\nconst ignore = new Set();\n\nexport function getRestrictionReason(reasons: RestrictionReason[]) {\n // return reasons[0];\n return reasons.find((reason) => platforms.has(reason.platform) && !ignore.has(reason.reason));\n}\n\nexport function isRestricted(reasons: RestrictionReason[]) {\n return !!getRestrictionReason(reasons);\n}\n\nexport function ignoreRestrictionReasons(reasons: string[]) {\n ignore.clear();\n reasons.forEach((reason) => {\n ignore.add(reason);\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 {MyDocument} from '../lib/appManagers/appDocsManager';\nimport rootScope from '../lib/rootScope';\n\nconst savingLottiePreview: {[docId: DocId]: {width: number, height: number}} = {};\n\nexport function isSavingLottiePreview(doc: MyDocument, toneIndex: number, width: number, height: number) {\n const key = doc.id + '-' + toneIndex;\n const saving = savingLottiePreview[key];\n return saving && saving.width >= width && saving.height >= height;\n}\n\nexport async function saveLottiePreview(doc: MyDocument, canvas: HTMLCanvasElement, toneIndex: number) {\n const key = doc.id + '-' + toneIndex;\n const {width, height} = canvas;\n if(isSavingLottiePreview(doc, toneIndex, width, height)) {\n return;\n }\n\n const saving = savingLottiePreview[key] = {\n width,\n height\n };\n\n const thumb = await rootScope.managers.appDocsManager.getLottieCachedThumb(doc.id, toneIndex);\n if(savingLottiePreview[key] !== saving) {\n return;\n }\n\n if(thumb && thumb.w >= width && thumb.h >= height) {\n return;\n }\n\n const promise = new Promise((resolve) => {\n canvas.toBlob((blob) => resolve(blob));\n });\n\n const blob = await promise;\n if(savingLottiePreview[key] !== saving) {\n return;\n }\n\n // console.log('got lottie preview', doc, blob, URL.createObjectURL(blob));\n\n rootScope.managers.appDocsManager.saveLottiePreview(doc.id, blob, width, height, toneIndex);\n\n // delete 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","// * 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 Scrollable from '../components/scrollable';\nimport safeAssign from './object/safeAssign';\n\nexport default class ScrollableLoader {\n public loading = false;\n private scrollable: Scrollable;\n private getPromise: () => Promise;\n private promise: Promise;\n private loaded = false;\n\n constructor(options: {\n scrollable: ScrollableLoader['scrollable'],\n getPromise: ScrollableLoader['getPromise']\n }) {\n safeAssign(this, options);\n\n options.scrollable.onScrolledBottom = () => {\n this.load();\n };\n }\n\n public load() {\n if(this.loaded) {\n return Promise.resolve();\n }\n\n if(this.loading) {\n return this.promise;\n }\n\n this.loading = true;\n this.promise = this.getPromise().then((done) => {\n this.loading = false;\n this.promise = undefined;\n\n if(done) {\n this.loaded = true;\n this.scrollable.onScrolledBottom = null;\n } else {\n this.scrollable.checkForTriggers();\n }\n }, () => {\n this.promise = undefined;\n this.loading = 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 type {MediaSearchContext} from '../components/appMediaPlaybackController';\nimport type {SearchSuperContext} from '../components/appSearchSuper.';\nimport type {Message} from '../layer';\nimport type {MessagesStorageKey, MyMessage} from '../lib/appManagers/appMessagesManager';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport incrementMessageId from '../lib/appManagers/utils/messageId/incrementMessageId';\nimport rootScope from '../lib/rootScope';\nimport forEachReverse from './array/forEachReverse';\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 private otherSideLoader: SearchListLoader;\n private managers: AppManagers;\n\n constructor(options: Omit, 'loadMore'> & {\n onEmptied?: () => void,\n isInner?: boolean,\n managers?: AppManagers\n } = {}) {\n super({\n ...options,\n loadMore: (anchor, older, loadCount) => {\n const backLimit = older ? 0 : loadCount;\n let maxId = anchor?.mid;\n\n if(maxId === undefined) maxId = this.searchContext.maxId;\n if(!older) maxId = incrementMessageId(maxId, 1);\n\n return this.managers.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: async(message) => {\n const filtered = await this.filterMids([message.mid]);\n if(!filtered.length) {\n return;\n }\n\n return options.processItem(message);\n }\n });\n\n this.managers ??= rootScope.managers;\n rootScope.addEventListener('history_delete', this.onHistoryDelete);\n rootScope.addEventListener('history_multiappend', this.onHistoryMultiappend);\n rootScope.addEventListener('message_sent', this.onMessageSent);\n\n if(!options.isInner) {\n this.otherSideLoader = new SearchListLoader({\n ...options,\n isInner: true\n });\n\n // this.otherSideLoader.onLoadedMore = () => {\n\n // };\n }\n }\n\n protected async filterMids(mids: number[]) {\n const storageKey: MessagesStorageKey = `${this.searchContext.peerId}_${this.searchContext.isScheduled ? 'scheduled' : 'history'}`;\n const filtered = (await this.managers.appMessagesManager.filterMessagesByInputFilterFromStorage(this.searchContext.inputFilter._, mids, storageKey, 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 this.current = undefined;\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 = async(message: Message.message | Message.messageService) => {\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 if(message.peerId !== this.searchContext.peerId) {\n return;\n }\n\n const filtered = await this.filterMids([message.mid]);\n const targets = (await Promise.all(filtered.map((message) => this.processItem(message)))).filter(Boolean);\n if(targets.length) {\n /* const {previous, current, next} = this;\n const targets = previous.concat(current, next);\n const currentIdx = targets.length;\n const mid = targets[0].mid;\n let i = 0, length = targets.length;\n for(; i < length; ++i) {\n const target = targets[i];\n if(!target || mid < target.mid) {\n break;\n }\n }\n\n if(i < currentIdx) previous.push(...targets);\n else next. */\n\n if(!this.current) {\n this.previous.push(...targets);\n } else {\n this.next.push(...targets);\n }\n }\n };\n\n protected onMessageSent = ({message}: {message: MyMessage}) => {\n this.onHistoryMultiappend(message);\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 === false) {\n this.loadedAllDown = this.loadedAllUp = true;\n }\n\n if(this.otherSideLoader) {\n this.otherSideLoader.setSearchContext(context);\n }\n }\n\n public reset() {\n super.reset();\n this.searchContext = undefined;\n\n if(this.otherSideLoader) {\n this.otherSideLoader.reset();\n }\n }\n\n public getPrevious(withOtherSide?: boolean) {\n let previous = this.previous;\n\n if(this.otherSideLoader && withOtherSide) {\n previous = previous.concat(this.otherSideLoader.previous);\n }\n\n return previous;\n }\n\n public getNext(withOtherSide?: boolean) {\n let next = this.next;\n\n if(this.otherSideLoader && withOtherSide) {\n next = next.concat(this.otherSideLoader.next);\n }\n\n return next;\n }\n\n public getCurrent() {\n return this.current || this.otherSideLoader?.current;\n }\n\n private goToOtherEnd(length: number) {\n if(length > 0) return this.go(-this.previous.length);\n else return this.go(this.next.length);\n }\n\n public goRound(length: number, dispatchJump?: boolean) {\n let ret: ReturnType['goUnsafe']>;\n\n if(this.otherSideLoader?.current) {\n ret = this.otherSideLoader.goUnsafe(length, dispatchJump);\n if(ret.item) {\n return ret.item;\n }\n\n length = ret.leftLength;\n if(!(length > 0 ? this.otherSideLoader.next : this.otherSideLoader.previous).length) {\n const loaded = length > 0 ? this.otherSideLoader.loadedAllUp : this.otherSideLoader.loadedAllDown;\n if(!loaded) { // do not reset anything until it's loaded\n return;\n }\n\n // if other side is loaded too will start from its begin\n if((length > 0 && (this.otherSideLoader.searchContext.maxId === 1 || this.otherSideLoader.loadedAllDown)) ||\n (length < 0 && (this.otherSideLoader.searchContext.maxId === 0 || this.otherSideLoader.loadedAllUp))) {\n return this.otherSideLoader.goToOtherEnd(length);\n }\n\n this.otherSideLoader.unsetCurrent(length > 0);\n }\n }\n\n ret = this.goUnsafe(length, dispatchJump);\n if(!ret.item) {\n if(this.loadedAllUp && this.loadedAllDown) { // just use the same loader if the list is too short\n return this.goToOtherEnd(length);\n } else if(this.otherSideLoader) {\n length = ret.leftLength;\n ret = this.otherSideLoader.goUnsafe(length, dispatchJump);\n\n if(ret.item) {\n this.unsetCurrent(length > 0);\n }\n }\n }\n\n return ret?.item;\n }\n\n // public setTargets(previous: Item[], next: Item[], reverse: boolean) {\n // super.setTargets(previous, next, reverse);\n // }\n\n protected setLoaded(down: boolean, value: boolean) {\n const changed = super.setLoaded(down, value);\n\n if(changed &&\n this.otherSideLoader &&\n value &&\n this.searchContext?.useSearch !== false/* &&\n (this.reverse ? this.loadedAllUp : this.loadedAllDown) */) {\n const reverse = this.loadedAllUp;\n this.otherSideLoader.setSearchContext({\n ...this.searchContext,\n maxId: reverse ? 1 : 0\n });\n\n // these 'reverse' are different, not a mistake here.\n this.otherSideLoader.reverse = this.reverse;\n this.otherSideLoader.setLoaded(reverse, true);\n this.otherSideLoader.load(!reverse);\n }\n\n return changed;\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 if(this.otherSideLoader) {\n this.otherSideLoader.cleanup();\n this.otherSideLoader = 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 generateMessageId from './generateMessageId';\nimport getServerMessageId from './getServerMessageId';\n\nexport default function incrementMessageId(messageId: number, increment: number) {\n return generateMessageId(getServerMessageId(messageId) + increment);\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 {fastRaf} from './schedulers';\nimport deferredPromise, {CancellablePromise} from './cancellablePromise';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport isInDOM from './dom/isInDOM';\n\nclass SequentialDom {\n private promises: Partial<{\n read: CancellablePromise,\n write: CancellablePromise\n }> = {};\n private raf = fastRaf.bind(null);\n private scheduled = false;\n\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\n let promise = this.promises[kind];\n if(!promise) {\n this.scheduleFlush();\n promise = this.promises[kind] = deferredPromise();\n }\n\n if(callback !== undefined) {\n promise.then(() => callback());\n }\n\n return promise;\n }\n\n public measure(callback?: VoidFunction) {\n return this.do('read', callback);\n }\n\n public mutate(callback?: VoidFunction) {\n return this.do('write', callback);\n }\n\n /**\n * Will fire instantly if element is not connected\n * @param element\n * @param callback\n */\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\n const isConnected = isInDOM(element);\n const promise = isConnected ? this.mutate() : Promise.resolve();\n\n if(callback !== undefined) {\n if(!isConnected) {\n callback();\n } else {\n promise.then(() => callback());\n }\n }\n\n return promise;\n }\n\n private scheduleFlush() {\n if(!this.scheduled) {\n this.scheduled = true;\n\n this.raf(() => {\n this.promises.read && this.promises.read.resolve();\n this.promises.write && this.promises.write.resolve();\n\n this.scheduled = false;\n this.promises = {};\n });\n }\n }\n}\n\nconst sequentialDom = new SequentialDom();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\nexport default sequentialDom;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {PhotoSize, WebDocument} from '../layer';\nimport {REPLIES_HIDDEN_CHANNEL_ID} from '../lib/mtproto/mtproto_config';\nimport {MyDocument} from '../lib/appManagers/appDocsManager';\nimport {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport choosePhotoSize from '../lib/appManagers/utils/photos/choosePhotoSize';\nimport {MediaSize, makeMediaSize} from './mediaSize';\nimport isWebDocument from '../lib/appManagers/utils/webDocs/isWebDocument';\n\nexport default function setAttachmentSize(\n photo: MyPhoto | MyDocument | WebDocument,\n element: HTMLElement | SVGForeignObjectElement,\n boxWidth: number,\n boxHeight: number,\n noZoom = true,\n message?: any,\n pushDocumentSize?: boolean,\n photoSize?: ReturnType\n) {\n const _isWebDocument = isWebDocument(photo);\n // if(_isWebDocument && pushDocumentSize === undefined) {\n // pushDocumentSize = true;\n // }\n\n if(!photoSize) {\n photoSize = 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 || _isWebDocument) {\n size = makeMediaSize(photo.w || (photoSize as PhotoSize.photoSize).w || 512, photo.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.type) || _isWebDocument) {\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.toChatId() !== REPLIES_HIDDEN_CHANNEL_ID)\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 * 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} from '../lib/logger';\nimport insertInDescendSortedArray from './array/insertInDescendSortedArray';\nimport {getMiddleware, MiddlewareHelper} from './middleware';\nimport middlewarePromise from './middlewarePromise';\nimport safeAssign from './object/safeAssign';\nimport pause from './schedulers/pause';\n\nexport type SortedElementBase = {\n id: T,\n index: number\n};\n\nlet id = 0;\n\nexport class BatchProcessor {\n protected queue: Promise[];\n protected promise: Promise;\n\n protected middlewareHelper: MiddlewareHelper;\n protected log: ReturnType;\n\n protected process: (batch: Item[], m: ReturnType, log: BatchProcessor['log']) => Promise;\n protected possibleError: any;\n\n constructor(options: {\n log?: BatchProcessor['log'],\n // middleware: MiddlewareHelper,\n process: BatchProcessor['process'],\n possibleError?: BatchProcessor['possibleError']\n }) {\n safeAssign(this, options);\n\n this.queue = [];\n this.middlewareHelper ??= getMiddleware();\n\n const prefix = 'BATCH-PROCESSOR-' + ++id;\n if(this.log) {\n this.log = this.log.bindPrefix(prefix);\n } else {\n this.log = logger(prefix);\n }\n }\n\n public get queuePromise() {\n return this.promise;\n }\n\n public clear() {\n this.log('clear');\n this.queue.length = 0;\n this.promise = undefined;\n this.middlewareHelper.clean();\n }\n\n public addToQueue(item: BatchProcessor['queue'][0]) {\n this.queue.push(item);\n return this.setQueue();\n }\n\n protected setQueue() {\n if(!this.queue.length) {\n return Promise.resolve();\n }\n\n if(this.promise) {\n return this.promise;\n }\n\n const middleware = this.middlewareHelper.get();\n const log = this.log.bindPrefix('queue');\n const m = middlewarePromise(middleware, this.possibleError);\n\n const processQueue = async(): Promise => {\n log('start', this.queue.length);\n\n const queue = this.queue.splice(0, this.queue.length);\n\n const perf = performance.now();\n const promises = queue.map((promise) => {\n promise.then((details) => {\n log('render item time', performance.now() - perf, details);\n });\n\n return promise;\n });\n\n const renderedQueue = await m(Promise.all(promises));\n await m(this.process(renderedQueue, m, log));\n\n log('queue rendered');\n\n if(this.queue.length) {\n log('have new items to render');\n return processQueue();\n } else {\n log('end');\n }\n };\n\n log('setting pause');\n const promise = this.promise = m(pause(0))\n .then(\n () => processQueue().catch((err: ApiError) => {\n if(err !== this.possibleError) {\n log.error('process queue error', err);\n }\n\n throw err;\n }),\n (err) => {\n log('pause has been cleared');\n throw err;\n }\n )\n .finally(() => {\n if(this.promise === promise) {\n this.promise = undefined;\n }\n });\n\n return promise;\n }\n}\n\nexport default class SortedList {\n protected elements: Map;\n protected sorted: Array;\n\n protected getIndex: (element: SortedElement) => PromiseLike | 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) => PromiseLike | SortedElement;\n\n protected updateElementWith = (callback: () => void) => callback();\n protected updateListWith = (callback: (canUpdate: boolean | undefined) => void) => callback(true);\n\n protected middleware: MiddlewareHelper;\n\n protected batchProcessor: BatchProcessor;\n\n protected log: ReturnType;\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 log?: SortedList['log']\n }) {\n safeAssign(this, options);\n\n this.elements = new Map();\n this.sorted = [];\n this.middleware = getMiddleware();\n\n this.batchProcessor = new BatchProcessor({\n log: this.log,\n process: async(batch, m, log) => {\n // const elements = await Promise.all(batch.map((element) => this.onElementCreate(element)));\n const elements = batch;\n const promises = elements.map((element) => this.update(element.id, element));\n await m(Promise.all(promises));\n }\n });\n }\n\n public clear() {\n this.batchProcessor.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);\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 callback?.(false);\n return;\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 async add(id: SortedElementId) {\n const element = this.get(id);\n if(element) {\n return;\n // return element;\n }\n\n const base: SortedElementBase = {\n id,\n index: 0\n };\n\n this.elements.set(id, base as SortedElement);\n const createPromise = Promise.resolve(this.onElementCreate(base));\n return this.batchProcessor.addToQueue(createPromise);\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 async update(id: SortedElementId, element = this.get(id)) {\n if(!element) {\n return;\n }\n\n element.index = await this.getIndex(element);\n if(this.get(id) !== element) {\n return;\n }\n\n this.onUpdate?.(element);\n\n const idx = insertInDescendSortedArray(this.sorted, element, 'index');\n this.onSort(element, idx);\n }\n}\n","const BOM = '๏ปฟ';\n// const BOM = 'K';\nexport default BOM;\n","export default function encodeEntities(value: string) {\n return value.replace(/&/g, '&').replace(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g, (value) => {\n const hi = value.charCodeAt(0);\n const low = value.charCodeAt(1);\n return '&#' + (((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000) + ';';\n }).replace(/([^\\#-~| |!])/g, (value) => { // non-alphanumeric\n return '&#' + value.charCodeAt(0) + ';';\n }).replace(//g, '>');\n}\n","// credits to https://github.com/sindresorhus/escape-string-regexp/blob/master/index.js\nexport default function escapeRegExp(str: string) {\n return str\n .replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&')\n .replace(/-/g, '\\\\x2d');\n}\n","export default function limitSymbols(str: string, length: number, limitFrom = length + 10) {\n str = str.trim();\n if(str.length > limitFrom) {\n str = str.slice(0, length)/* .replace(/\\s*$/, '') */ + '...';\n }\n\n return str;\n}\n","export default function toHHMMSS(str: string | number, leadZero = false) {\n const sec_num = parseInt(str + '', 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","export default function textToSvgURL(text: string) {\n const blob = new Blob([text], {type: 'image/svg+xml;charset=utf-8'});\n\n // * because iOS Safari doesn't want to eat objectURL\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.onload = (e) => {\n resolve(e.target.result as string);\n };\n reader.readAsDataURL(blob);\n });\n // return URL.createObjectURL(blob);\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_WORKER} from './context';\n\nexport class WindowSize {\n public width: number;\n public height: number;\n\n constructor() {\n if(IS_WORKER) {\n return;\n }\n\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","/*\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// * Jolly Cobra's useHeavyAnimationCheck.ts, patched\n\nimport {AnyToVoidFunction} from '../types';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport DEBUG from '../config/debug';\nimport pause from '../helpers/schedulers/pause';\nimport EventListenerBase from '../helpers/eventListenerBase';\n\nconst eventListener = new EventListenerBase<{\n start: () => void,\n end: () => void\n}>();\nconst ANIMATION_START_EVENT = 'start';\nconst ANIMATION_END_EVENT = 'end';\n\nlet isAnimating = false;\nlet heavyAnimationPromise: CancellablePromise = deferredPromise();\nlet promisesInQueue = 0;\n\nheavyAnimationPromise.resolve();\n\nconst log = console.log.bind(console.log, '[HEAVY-ANIMATION]:');\n\nexport function dispatchHeavyAnimationEvent(promise: Promise, timeout?: number) {\n if(!isAnimating) {\n heavyAnimationPromise = deferredPromise();\n eventListener.dispatchEvent(ANIMATION_START_EVENT);\n isAnimating = true;\n DEBUG && log('start');\n }\n\n ++promisesInQueue;\n DEBUG && log('attach promise, length:', promisesInQueue, timeout);\n\n const promises = [\n timeout !== undefined ? pause(timeout) : undefined,\n promise.finally(() => {})\n ].filter(Boolean);\n\n const perf = performance.now();\n const _heavyAnimationPromise = heavyAnimationPromise;\n Promise.race(promises).then(() => {\n if(heavyAnimationPromise !== _heavyAnimationPromise || heavyAnimationPromise.isFulfilled) { // interrupted\n return;\n }\n\n --promisesInQueue;\n DEBUG && log('promise end, length:', promisesInQueue, performance.now() - perf);\n if(promisesInQueue <= 0) {\n onHeavyAnimationEnd();\n }\n });\n\n return heavyAnimationPromise;\n}\n\n(window as any).dispatchHeavyAnimationEvent = dispatchHeavyAnimationEvent;\n\nfunction onHeavyAnimationEnd() {\n if(heavyAnimationPromise.isFulfilled) {\n return;\n }\n\n isAnimating = false;\n promisesInQueue = 0;\n eventListener.dispatchEvent(ANIMATION_END_EVENT);\n heavyAnimationPromise.resolve();\n\n DEBUG && log('end');\n}\n\nexport function interruptHeavyAnimation() {\n onHeavyAnimationEnd();\n}\n\nexport function getHeavyAnimationPromise() {\n return heavyAnimationPromise;\n}\n\nexport default function(\n handleAnimationStart: AnyToVoidFunction,\n handleAnimationEnd: AnyToVoidFunction,\n listenerSetter?: ListenerSetter\n) {\n // useEffect(() => {\n if(isAnimating) {\n handleAnimationStart();\n }\n\n const add = listenerSetter ? listenerSetter.add(eventListener) : eventListener.addEventListener.bind(eventListener);\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, eventListener) : eventListener.removeEventListener.bind(eventListener);\n add(ANIMATION_START_EVENT, handleAnimationStart);\n add(ANIMATION_END_EVENT, handleAnimationEnd);\n\n return () => {\n remove(ANIMATION_END_EVENT, handleAnimationEnd);\n remove(ANIMATION_START_EVENT, handleAnimationStart);\n };\n // }, [handleAnimationEnd, handleAnimationStart]);\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 '../lib/appManagers/appMessagesManager';\nimport type {ForumTopic} from '../layer';\nimport appDialogsManager, {DIALOG_LIST_ELEMENT_TAG} from '../lib/appManagers/appDialogsManager';\nimport rootScope from '../lib/rootScope';\nimport {ButtonMenuItemOptionsVerifiable, ButtonMenuSync} from './buttonMenu';\nimport PopupDeleteDialog from './popups/deleteDialog';\nimport {i18n, LangPackKey, _i18n} from '../lib/langPack';\nimport findUpTag from '../helpers/dom/findUpTag';\nimport {toastNew} from './toast';\nimport PopupMute from './popups/mute';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport {GENERAL_TOPIC_ID} from '../lib/mtproto/mtproto_config';\nimport showLimitPopup from './popups/limit';\nimport createContextMenu from '../helpers/dom/createContextMenu';\n\nexport default class DialogsContextMenu {\n private buttons: ButtonMenuItemOptionsVerifiable[];\n\n private peerId: PeerId;\n private filterId: number;\n private threadId: number;\n private dialog: Dialog | ForumTopic.forumTopic;\n private canManageTopics: boolean;\n private li: HTMLElement;\n\n constructor(private managers: AppManagers) {\n\n }\n\n public attach(element: HTMLElement) {\n createContextMenu({\n listenTo: element,\n buttons: this.getButtons(),\n appendTo: document.getElementById('page-chats'),\n onOpen: async(li) => {\n this.li = li;\n li.classList.add('menu-open');\n this.peerId = li.dataset.peerId.toPeerId();\n this.threadId = +li.dataset.threadId || undefined;\n this.dialog = await this.managers.dialogsStorage.getDialogOrTopic(this.peerId, this.threadId);\n this.filterId = this.threadId ? undefined : appDialogsManager.filterId;\n this.canManageTopics = this.threadId ? await this.managers.appChatsManager.hasRights(this.peerId.toChatId(), 'manage_topics') : undefined;\n },\n onBeforeOpen: async() => {\n // delete button\n const langPackKey: LangPackKey = this.threadId ? 'Delete' : await this.managers.appPeersManager.getDeleteButtonText(this.peerId);\n const lastButton = this.buttons[this.buttons.length - 1];\n if(lastButton?.element) {\n lastButton.element.lastChild.replaceWith(i18n(langPackKey));\n }\n },\n onClose: () => {\n this.li.classList.remove('menu-open');\n this.li = this.peerId = this.dialog = this.filterId = this.threadId = this.canManageTopics = undefined;\n },\n findElement: (e) => {\n return findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\n }\n });\n }\n\n private getButtons() {\n return this.buttons ??= [{\n icon: 'unread',\n text: 'MarkAsUnread',\n onClick: this.onUnreadClick,\n verify: async() => !this.threadId && !(await this.managers.appMessagesManager.isDialogUnread(this.dialog))\n }, {\n icon: 'readchats',\n text: 'MarkAsRead',\n onClick: this.onUnreadClick,\n verify: () => this.managers.appMessagesManager.isDialogUnread(this.dialog)\n }, {\n icon: 'pin',\n text: 'ChatList.Context.Pin',\n onClick: this.onPinClick,\n verify: async() => {\n if(this.threadId && !this.canManageTopics) {\n return false;\n }\n\n const isPinned = this.filterId !== undefined && this.filterId > 1 ?\n (await this.managers.appMessagesManager.getFilter(this.filterId)).pinnedPeerIds.includes(this.dialog.peerId) :\n !!this.dialog.pFlags?.pinned;\n return !isPinned;\n }\n }, {\n icon: 'unpin',\n text: 'ChatList.Context.Unpin',\n onClick: this.onPinClick,\n verify: async() => {\n if(this.threadId && !this.canManageTopics) {\n return false;\n }\n\n const isPinned = this.filterId !== undefined && this.filterId > 1 ?\n (await this.managers.appMessagesManager.getFilter(this.filterId)).pinnedPeerIds.includes(this.dialog.peerId) :\n !!this.dialog.pFlags?.pinned;\n return isPinned;\n }\n }, {\n icon: 'mute',\n text: 'ChatList.Context.Mute',\n onClick: this.onMuteClick,\n verify: async() => {\n return this.peerId !== rootScope.myId && !(await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.dialog.peerId, threadId: this.threadId}));\n }\n }, {\n icon: 'unmute',\n text: 'ChatList.Context.Unmute',\n onClick: this.onUnmuteClick,\n verify: async() => {\n return this.peerId !== rootScope.myId && (await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.dialog.peerId, threadId: this.threadId}));\n }\n }, {\n icon: 'archive',\n text: 'Archive',\n onClick: this.onArchiveClick,\n verify: () => this.filterId === 0 && this.peerId !== rootScope.myId\n }, {\n icon: 'unarchive',\n text: 'Unarchive',\n onClick: this.onArchiveClick,\n verify: () => this.filterId === 1 && this.peerId !== rootScope.myId\n }, {\n icon: 'hide',\n text: 'Hide',\n onClick: this.onHideTopicClick,\n verify: () => {\n return this.canManageTopics && (this.dialog as ForumTopic.forumTopic).id === GENERAL_TOPIC_ID;\n }\n }, {\n icon: 'lock',\n text: 'CloseTopic',\n onClick: this.onToggleTopicClick,\n verify: () => {\n return this.canManageTopics && !(this.dialog as ForumTopic.forumTopic).pFlags.closed;\n }\n }, {\n icon: 'lockoff',\n text: 'RestartTopic',\n onClick: this.onToggleTopicClick,\n verify: () => {\n return this.canManageTopics && !!(this.dialog as ForumTopic.forumTopic).pFlags.closed;\n }\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick,\n verify: () => {\n if(this.threadId) {\n if(!this.canManageTopics) {\n return false;\n }\n\n return (this.dialog as ForumTopic.forumTopic).id !== GENERAL_TOPIC_ID;\n }\n\n return true;\n }\n }];\n }\n\n private onArchiveClick = async() => {\n const dialog = await this.managers.appMessagesManager.getDialogOnly(this.peerId);\n if(dialog) {\n this.managers.appMessagesManager.editPeerFolders([dialog.peerId], +!dialog.folder_id);\n }\n };\n\n private onHideTopicClick = () => {\n this.managers.appChatsManager.editForumTopic({\n chatId: this.peerId.toChatId(),\n topicId: this.threadId,\n hidden: true\n });\n };\n\n private onToggleTopicClick = () => {\n this.managers.appChatsManager.editForumTopic({\n chatId: this.peerId.toChatId(),\n topicId: this.threadId,\n closed: !(this.dialog as ForumTopic.forumTopic).pFlags.closed\n });\n };\n\n private onPinClick = () => {\n const {peerId, filterId, threadId} = this;\n this.managers.appMessagesManager.toggleDialogPin({\n peerId,\n filterId,\n topicId: threadId\n }).catch(async(err: ApiError) => {\n if(err.type === 'PINNED_DIALOGS_TOO_MUCH' || err.type === 'PINNED_TOO_MUCH') {\n if(threadId) {\n this.managers.apiManager.getLimit('topicPin').then((limit) => {\n toastNew({langPackKey: 'LimitReachedPinnedTopics', langPackArguments: [limit]});\n });\n } else if(filterId >= 1) {\n toastNew({langPackKey: 'PinFolderLimitReached'});\n } else {\n showLimitPopup('pin');\n }\n }\n });\n };\n\n private onUnmuteClick = () => {\n this.managers.appMessagesManager.togglePeerMute({peerId: this.peerId, mute: false, threadId: this.threadId});\n };\n\n private onMuteClick = () => {\n new PopupMute(this.peerId, this.threadId);\n };\n\n private onUnreadClick = async() => {\n const {peerId, dialog} = this;\n if(dialog.unread_count) {\n this.managers.appMessagesManager.readHistory(peerId, dialog.top_message, this.threadId);\n\n if(!this.threadId) {\n this.managers.appMessagesManager.markDialogUnread(peerId, true);\n }\n } else if(!this.threadId) {\n this.managers.appMessagesManager.markDialogUnread(peerId);\n }\n };\n\n private onDeleteClick = () => {\n new PopupDeleteDialog(this.peerId, undefined, undefined, this.threadId);\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 App from '../config/app';\nimport DEBUG from '../config/debug';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport {LangPackKey, i18n} from '../lib/langPack';\nimport {logger} from '../lib/logger';\nimport rootScope from '../lib/rootScope';\nimport Button from './button';\nimport ProgressivePreloader from './preloader';\nimport SetTransition from './singleTransition';\nimport sessionStorage from '../lib/sessionStorage';\nimport {ConnectionStatus} from '../lib/mtproto/connectionStatus';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport singleInstance from '../lib/mtproto/singleInstance';\n\nexport default class ConnectionStatusComponent {\n public static CHANGE_STATE_DELAY = 1000;\n\n private statusContainer: HTMLElement;\n private statusEl: HTMLElement;\n private statusPreloader: ProgressivePreloader;\n\n private currentLangPackKey: LangPackKey;\n\n private hadConnect = false;\n private retryAt: number;\n private connecting = false;\n private timedOut = false;\n private updating = false;\n\n private log: ReturnType;\n\n private setFirstConnectionTimeout: number;\n private setStateTimeout: number;\n\n constructor(private managers: AppManagers, chatsContainer: HTMLElement) {\n this.log = logger('CS', undefined, undefined);\n\n this.statusContainer = document.createElement('div');\n this.statusContainer.classList.add('connection-status'/* , 'hide' */);\n\n this.statusEl = Button('btn-primary bg-warning connection-status-button', {noRipple: true});\n this.statusPreloader = new ProgressivePreloader({cancelable: false});\n this.statusPreloader.constructContainer({color: 'transparent', bold: true});\n this.statusContainer.append(this.statusEl);\n\n chatsContainer.prepend(this.statusContainer);\n\n rootScope.addEventListener('connection_status_change', (status) => {\n // console.log(status);\n\n this.setConnectionStatus();\n });\n\n rootScope.addEventListener('state_synchronizing', (channelId) => {\n if(!channelId) {\n this.updating = true;\n DEBUG && this.log('updating', this.updating);\n this.setState();\n }\n });\n\n rootScope.addEventListener('state_synchronized', (channelId) => {\n DEBUG && this.log('state_synchronized', channelId);\n if(!channelId) {\n this.updating = false;\n DEBUG && this.log('updating', this.updating);\n this.setState();\n }\n });\n\n this.setFirstConnectionTimeout = window.setTimeout(this.setConnectionStatus, ConnectionStatusComponent.CHANGE_STATE_DELAY + 1e3);\n\n // let bool = true;\n // document.addEventListener('dblclick', () => {\n // this.setConnectionStatus(bool ? (bool = false, ConnectionStatus.Closed) : (bool = true, ConnectionStatus.Connected));\n // });\n }\n\n private setConnectionStatus = (overrideStatus?: ConnectionStatus) => {\n Promise.all([\n sessionStorage.get('dc'),\n rootScope.managers.rootScope.getConnectionStatus()\n ]).then(([baseDcId, connectionStatus]) => {\n if(!baseDcId) {\n baseDcId = App.baseDcId;\n }\n\n if(this.setFirstConnectionTimeout) {\n clearTimeout(this.setFirstConnectionTimeout);\n this.setFirstConnectionTimeout = 0;\n }\n\n const status = connectionStatus['NET-' + baseDcId];\n const online = status && (overrideStatus || status.status) === ConnectionStatus.Connected;\n\n if(this.connecting && online) {\n this.managers.apiUpdatesManager.forceGetDifference();\n }\n\n if(online && !this.hadConnect) {\n this.hadConnect = true;\n }\n\n this.timedOut = status && (overrideStatus || status.status) === ConnectionStatus.TimedOut;\n this.connecting = !online;\n this.retryAt = status && status.retryAt;\n DEBUG && this.log('connecting', this.connecting);\n this.setState();\n });\n };\n\n private setStatusText = (langPackKey: LangPackKey, args?: any[]) => {\n if(this.currentLangPackKey === langPackKey) return;\n this.currentLangPackKey = langPackKey;\n replaceContent(this.statusEl, i18n(langPackKey, args));\n this.statusPreloader.attach(this.statusEl);\n };\n\n private getA(langPackKey: LangPackKey, callback: () => void) {\n const a = document.createElement('a');\n a.classList.add('force-reconnect');\n a.append(i18n(langPackKey));\n attachClickEvent(a, (e) => {\n cancelEvent(e);\n callback();\n });\n\n return a;\n }\n\n private setState = () => {\n if(singleInstance.deactivatedReason) {\n return;\n }\n\n const timeout = ConnectionStatusComponent.CHANGE_STATE_DELAY;\n if(this.connecting) {\n if(this.timedOut) {\n const a = this.getA('ConnectionStatus.ForceReconnect', () => this.managers.networkerFactory.forceReconnect());\n this.setStatusText('ConnectionStatus.TimedOut', [a]);\n } else if(this.hadConnect) {\n if(this.retryAt !== undefined) {\n const timerSpan = document.createElement('span');\n const retryAt = this.retryAt;\n const setTime = () => {\n const now = Date.now();\n timerSpan.innerText = '' + Math.max(0, Math.round((retryAt - now) / 1000));\n if(now > retryAt) {\n clearInterval(interval);\n }\n };\n const interval = setInterval(setTime, 1e3);\n setTime();\n\n const a = this.getA('ConnectionStatus.Reconnect', () => this.managers.networkerFactory.forceReconnectTimeout());\n this.setStatusText('ConnectionStatus.ReconnectIn', [timerSpan, a]);\n } else {\n this.setStatusText('ConnectionStatus.Reconnecting');\n }\n } else {\n this.setStatusText('ConnectionStatus.Waiting');\n }\n } else if(this.updating) {\n this.setStatusText('Updating');\n }\n\n DEBUG && this.log('setState', this.connecting || this.updating);\n window.requestAnimationFrame(() => {\n if(this.setStateTimeout) clearTimeout(this.setStateTimeout);\n\n const cb = () => {\n SetTransition({\n element: this.statusContainer,\n className: 'is-shown',\n forwards: this.connecting || this.updating,\n duration: 200\n });\n this.setStateTimeout = 0;\n DEBUG && this.log('setState: isShown:', this.connecting || this.updating);\n };\n\n this.setStateTimeout = window.setTimeout(cb, timeout);\n // cb();\n /* if(timeout) this.setStateTimeout = window.setTimeout(cb, timeout);\n else cb(); */\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\ntype C = 'check' | 'checks' | 'sending' | 'sendingerror' | 'premium_lock';\nexport function setSendingStatus(\n container: HTMLElement,\n message?: C | Message.message | Message.messageService,\n disableAnimationIfRippleFound?: boolean\n) {\n let className: C;\n if(typeof(message) === 'string') {\n className = message;\n } else if(message?.pFlags.out) {\n if(message.error) {\n className = 'sendingerror';\n } else 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","// https://spicyyoghurt.com/tools/easing-functions\nexport default function easeInOutSine(t: number, b: number, c: number, d: number) {\n return t >= d ? b + c : easeInOutSineApply(t / d, c) + b;\n}\n\nexport function easeInOutSineApply(v: number, c: number) {\n return -c / 2 * (Math.cos(Math.PI * v) - 1);\n}\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 const dpr = ctx.canvas.dpr;\n if(dpr) {\n x *= dpr;\n y *= dpr;\n width *= dpr;\n height *= dpr;\n }\n\n if(typeof(radius) === 'number') {\n if(dpr) radius *= dpr;\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] ? (dpr ? radius[side] * dpr : 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/canvas/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","import customProperties from '../dom/customProperties';\nimport clamp from '../number/clamp';\n\nexport default class Shimmer {\n private canvas: HTMLCanvasElement;\n private ctx: CanvasRenderingContext2D;\n private font = '30pt Helvetica';\n private currTime = Date.now();\n private diffTime = 0;\n private spread = 0;\n private paused = false;\n private pausedTime = 0;\n private pauseInterval = 850;\n private lightSource = 0;\n private inc = 0.032;\n private lightSpread = 0.55;\n private animations = ['slide', 'slide', 'slide', 'slide'];\n private currentAnimationIndex = 0;\n private text: string;\n private fillStyle: CanvasRenderingContext2D['fillStyle'];\n\n private keepTime() {\n this.diffTime = Date.now() - this.currTime;\n this.currTime = Date.now();\n }\n\n private cycleAnimation() {\n ++this.currentAnimationIndex;\n if(this.currentAnimationIndex >= this.animations.length) {\n this.currentAnimationIndex = 0;\n }\n }\n\n private animate() {\n const currentAnimation = this.animations[this.currentAnimationIndex];\n if(currentAnimation === 'glow') {\n return this.animateGlow(); // return glow style\n } else if(currentAnimation === 'slide') {\n return this.animateSlide(); // return slide gradient\n } else {\n console.log('unknown animation type: ' + String(currentAnimation));\n }\n }\n\n private animateGlow() {\n var glowEnd = 255,\n rgbStart = 68,\n r = rgbStart,\n g = r,\n b = r,\n increment = 10,\n interval = 800;\n\n return () => {\n var smartInc = increment * (this.diffTime / (1000 / 60));\n if(this.paused) {\n if((Date.now() - this.pausedTime) > interval) {\n r = rgbStart;\n this.cycleAnimation()\n this.paused = false;\n }\n } else {\n r = parseInt('' + (r + smartInc));\n if(r >= glowEnd) {\n this.paused = true;\n this.pausedTime = Date.now()\n }\n }\n return 'rgb('+ r + ',' + r + ',' + r + ')';\n };\n }\n\n private animateSlide(): CanvasGradient {\n var gradient = this.ctx.createLinearGradient(0, 0, this.canvas.width, 0),\n smartInc = this.inc * (this.diffTime / (1000 / 60)),\n lightLeft,\n lightRight,\n lightCenter;\n if(this.paused) {\n if((Date.now() - this.pausedTime) > this.pauseInterval) {\n this.lightSource = -0.6;\n this.cycleAnimation()\n this.paused = false;\n return this.animateSlide();\n }\n } else {\n this.lightSource += smartInc;\n if(this.lightSource > (1 + this.lightSpread)) {\n this.paused = true;\n this.pausedTime = Date.now();\n }\n }\n // lighting positions:\n lightCenter = clamp(this.lightSource, 0, 1);\n lightLeft = clamp(this.lightSource - this.lightSpread, 0, 1);\n lightRight = clamp(this.lightSource + this.lightSpread, 0, 1);\n\n const backgroundColor = customProperties.getProperty('background-color-true');\n const shimmerColor = customProperties.getProperty('surface-color');\n gradient.addColorStop(lightLeft, backgroundColor);\n gradient.addColorStop(lightCenter, shimmerColor);\n gradient.addColorStop(lightRight, backgroundColor);\n\n return gradient;\n }\n\n public settings(dict: Partial<{\n canvas: Shimmer['canvas'],\n fillStyle: Shimmer['fillStyle'],\n font: Shimmer['font'],\n lightSpread: Shimmer['lightSpread'],\n inc: Shimmer['inc'],\n animations: Shimmer['animations'],\n text: Shimmer['text']\n }> = {}) {\n this.canvas = dict.canvas ?? document.createElement('canvas');\n this.ctx = this.canvas.getContext('2d');\n this.font = dict.font ?? this.font;\n this.lightSpread = dict.lightSpread ?? this.lightSpread;\n this.inc = dict.inc ?? this.inc;\n this.animations = dict.animations ?? this.animations;\n this.text = dict.text ?? this.text;\n this.fillStyle = dict.fillStyle;\n\n this.canvas.classList.add('shimmer-canvas');\n }\n\n public on() {\n const {width, height} = this.canvas;\n // record the time we ran:\n this.keepTime();\n // clear and fill the canvas:\n this.ctx.clearRect(0, 0, width, height);\n\n if(this.font) {\n this.ctx.font = this.font;\n }\n\n this.ctx.fillStyle = this.animate() as any;\n this.ctx.fillRect(0, 0, width, height);\n\n if(this.fillStyle) {\n this.ctx.fillStyle = this.fillStyle;\n this.ctx.fillRect(0, 0, width, height);\n }\n\n if(this.text) {\n this.ctx.fillText(this.text, 50, 50);\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 Scrollable from '../components/scrollable';\nimport rootScope from '../lib/rootScope';\nimport {animate} from './animation';\nimport {drawCircleFromStart} from './canvas/drawCircle';\nimport roundRect from './canvas/roundRect';\nimport Shimmer from './canvas/shimmer';\nimport customProperties from './dom/customProperties';\nimport easeInOutSine from './easing/easeInOutSine';\nimport mediaSizes from './mediaSizes';\n\nexport default class DialogsPlaceholder {\n private canvas: HTMLCanvasElement;\n private ctx: CanvasRenderingContext2D;\n private shimmer: Shimmer;\n private tempId: number;\n private detachTime: number;\n\n private length: number;\n private dialogHeight: number;\n private availableLength: number;\n\n private avatarSize: number;\n private marginVertical: number;\n private totalHeight: number;\n private lineHeight: number;\n private lineBorderRadius: number;\n private lineMarginVertical: number;\n private statusWidth: number;\n private generatedValues: {\n firstLineWidth: number,\n secondLineWidth: number,\n statusWidth: number\n }[];\n\n private getRectFrom: () => DOMRectEditable;\n private onRemove: () => void;\n private blockScrollable: Scrollable;\n\n constructor(sizes: Partial<{\n avatarSize: number,\n marginVertical: number,\n totalHeight: number\n }> = {}) {\n this.shimmer = new Shimmer();\n this.tempId = 0;\n this.canvas = document.createElement('canvas');\n this.canvas.classList.add('dialogs-placeholder-canvas');\n this.ctx = this.canvas.getContext('2d');\n\n this.generatedValues = [];\n this.avatarSize = sizes.avatarSize ?? 54;\n this.marginVertical = sizes.marginVertical ?? 9;\n this.totalHeight = sizes.totalHeight ?? (this.avatarSize + this.marginVertical * 2);\n this.lineHeight = 10;\n this.lineBorderRadius = 6;\n this.lineMarginVertical = 8;\n this.statusWidth = 24;\n }\n\n public attach({container, rect, getRectFrom, onRemove, blockScrollable}: {\n container: HTMLElement,\n rect?: ReturnType,\n getRectFrom?: HTMLElement | DialogsPlaceholder['getRectFrom'],\n onRemove?: DialogsPlaceholder['onRemove'],\n blockScrollable?: DialogsPlaceholder['blockScrollable']\n }) {\n const {canvas} = this;\n\n this.onRemove = onRemove;\n this.getRectFrom = typeof(getRectFrom) === 'function' ? getRectFrom : (getRectFrom || container).getBoundingClientRect.bind(getRectFrom || container);\n if(this.blockScrollable = blockScrollable) {\n blockScrollable.container.style.overflowY = 'hidden';\n }\n\n this.updateCanvasSize(rect);\n this.startAnimation();\n container.append(canvas);\n }\n\n public detach(availableLength: number) {\n if(this.detachTime) {\n return;\n }\n\n this.availableLength = availableLength;\n this.detachTime = Date.now();\n\n if(!rootScope.settings.animationsEnabled) {\n this.remove();\n }\n }\n\n public remove() {\n this.stopAnimation();\n\n if(this.canvas.parentElement) {\n this.canvas.remove();\n\n if(this.blockScrollable) {\n this.blockScrollable.container.style.overflowY = '';\n this.blockScrollable = undefined;\n }\n }\n\n this.onRemove?.();\n this.onRemove = undefined;\n }\n\n private updateCanvasSize(rect = this.getRectFrom()) {\n const {canvas} = this;\n const dpr = canvas.dpr = window.devicePixelRatio;\n canvas.width = rect.width * dpr;\n canvas.height = rect.height * dpr;\n canvas.style.width = rect.width + 'px';\n canvas.style.height = rect.height + 'px';\n }\n\n private renderDetachAnimationFrame() {\n const {\n canvas,\n ctx,\n detachTime,\n length,\n availableLength\n } = this;\n\n if(!detachTime) {\n return;\n } else if(!rootScope.settings.animationsEnabled) {\n this.remove();\n return;\n }\n\n const {width} = canvas;\n\n ctx.globalCompositeOperation = 'destination-out';\n\n // ctx.fillStyle = 'rgba(0, 0, 0, 0)';\n // ctx.fillRect(0, 0, width, height);\n\n // const DURATION = 500;\n // const DELAY = DURATION;\n const DURATION = 150;\n const DELAY = 15;\n const elapsedTime = Date.now() - detachTime;\n let completed = true;\n for(let i = 0; i < length; ++i) {\n const delay = availableLength < length && i >= availableLength ? DELAY * (availableLength - 1) : DELAY * i;\n const elapsedRowTime = elapsedTime - delay;\n if(elapsedRowTime <= 0) {\n completed = false;\n continue;\n }\n\n const progress = easeInOutSine(elapsedRowTime, 0, 1, DURATION);\n\n ctx.beginPath();\n ctx.rect(0, this.dialogHeight * i, width, this.dialogHeight);\n ctx.fillStyle = `rgba(0, 0, 0, ${progress})`;\n ctx.fill();\n\n if(progress < 1) {\n completed = false;\n }\n }\n\n // const totalRadius = Math.sqrt(width ** 2 + height ** 2);\n // const gradient = ctx.createRadialGradient(\n // 0, 0, 0,\n // 0, 0, totalRadius);\n // gradient.addColorStop(0, 'rgba(0, 0, 0, 1)');\n // gradient.addColorStop(progress, 'rgba(0, 0, 0, 0)');\n // gradient.addColorStop(1, 'rgba(0, 0, 0, 0)');\n\n // const gradient = ctx.createLinearGradient(0, 0, 0, height);\n // gradient.addColorStop(0, 'rgba(0, 0, 0, 1)');\n // gradient.addColorStop(progress, 'rgba(0, 0, 0, 0)');\n // gradient.addColorStop(1, 'rgba(0, 0, 0, 0)');\n\n // ctx.fillStyle = gradient;\n // ctx.fillRect(0, 0, width, height);\n\n ctx.globalCompositeOperation = 'source-over';\n\n if(completed) {\n this.remove();\n }\n }\n\n private renderFrame() {\n this.shimmer.on();\n this.renderDetachAnimationFrame();\n }\n\n private startAnimation() {\n const {canvas, shimmer} = this;\n const tempId = ++this.tempId;\n const pattern = this.createPattern();\n\n shimmer.settings({\n canvas,\n fillStyle: pattern\n });\n\n const middleware = () => {\n return this.tempId === tempId;\n };\n\n this.renderFrame();\n animate(() => {\n if(!middleware()) {\n return false;\n }\n\n // ! should've removed the loop if animations are disabled\n if(rootScope.settings.animationsEnabled) {\n this.renderFrame();\n }\n\n // ! tempId can be changed during renderFrame\n return middleware();\n });\n\n rootScope.addEventListener('theme_change', this.onThemeChange);\n mediaSizes.addEventListener('resize', this.onResize);\n }\n\n private stopAnimation() {\n ++this.tempId;\n rootScope.removeEventListener('theme_change', this.onThemeChange);\n mediaSizes.removeEventListener('resize', this.onResize);\n }\n\n private onThemeChange = () => {\n this.stopAnimation();\n this.startAnimation();\n };\n\n private onResize = () => {\n const {canvas} = this;\n const {width, height, dpr} = canvas;\n this.updateCanvasSize();\n if(canvas.width === width && canvas.height === height && canvas.dpr === dpr) {\n return;\n }\n\n this.stopAnimation();\n this.startAnimation();\n };\n\n private createPattern() {\n const {canvas, ctx} = this;\n\n const patternCanvas = document.createElement('canvas');\n const patternContext = patternCanvas.getContext('2d');\n const dpr = canvas.dpr;\n patternCanvas.dpr = dpr;\n patternCanvas.width = canvas.width;\n patternCanvas.height = canvas.height;\n\n patternContext.fillStyle = customProperties.getProperty('surface-color');\n patternContext.fillRect(0, 0, patternCanvas.width, patternCanvas.height);\n\n patternContext.fillStyle = '#000';\n patternContext.globalCompositeOperation = 'destination-out';\n\n const dialogHeight = this.dialogHeight = this.totalHeight * dpr;\n const length = this.length = Math.ceil(canvas.height / dialogHeight);\n for(let i = 0; i < length; ++i) {\n this.drawChat(patternContext, i, i * dialogHeight);\n }\n\n return ctx.createPattern(patternCanvas, 'no-repeat');\n }\n\n private drawChat(ctx: CanvasRenderingContext2D, i: number, y: number) {\n let generatedValues = this.generatedValues[i];\n if(!generatedValues) {\n generatedValues = this.generatedValues[i] = {\n firstLineWidth: 40 + Math.random() * 100, // 120\n secondLineWidth: 120 + Math.random() * 130, // 240\n statusWidth: 24 + Math.random() * 16\n };\n }\n\n const {\n firstLineWidth,\n secondLineWidth,\n statusWidth\n } = generatedValues;\n\n const {canvas} = ctx;\n const {dpr} = canvas;\n y /= dpr;\n\n const {\n avatarSize,\n marginVertical,\n lineHeight,\n lineBorderRadius,\n lineMarginVertical\n } = this;\n\n let marginLeft = 17;\n\n if(avatarSize) {\n drawCircleFromStart(ctx, marginLeft, y + marginVertical, avatarSize / 2, true);\n marginLeft += avatarSize + 10;\n }\n\n // 9 + 54 - 10 - 8 = 45 ........ 72 - 9 - 10 - 8\n roundRect(ctx, marginLeft, y + marginVertical + lineMarginVertical, firstLineWidth, lineHeight, lineBorderRadius, true);\n // roundRect(ctx, marginLeft, y + marginVertical + avatarSize - lineHeight - lineMarginVertical, secondLineWidth, lineHeight, lineBorderRadius, true);\n roundRect(ctx, marginLeft, y + this.totalHeight - marginVertical - lineHeight - lineMarginVertical, secondLineWidth, lineHeight, lineBorderRadius, true);\n\n roundRect(ctx, canvas.width / dpr - 24 - statusWidth, y + marginVertical + lineMarginVertical, statusWidth, lineHeight, lineBorderRadius, true);\n }\n}\n","import rootScope from '../../lib/rootScope';\n\nexport default function shake(element: HTMLElement) {\n if(!rootScope.settings.animationsEnabled) {\n return;\n }\n\n const keyframes: Keyframe[] = [\n {transform: 'translateX(0)'},\n {transform: 'translateX(.25rem)'},\n {transform: 'translateX(-.25rem)'},\n {transform: 'translateX(0)'}\n ];\n\n element.animate([...keyframes, ...keyframes, ...keyframes], {\n duration: 300,\n iterations: 1,\n easing: 'ease-in-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 type {MyDialogFilter as DialogFilter, MyDialogFilter} from '../storages/filters';\nimport type LazyLoadQueue from '../../components/lazyLoadQueue';\nimport type {Dialog, ForumTopic, MyMessage} from './appMessagesManager';\nimport type {MyPhoto} from './appPhotosManager';\nimport type {MyDocument} from './appDocsManager';\nimport type {State} from '../../config/state';\nimport AvatarElement from '../../components/avatar';\nimport DialogsContextMenu from '../../components/dialogsContextMenu';\nimport {horizontalMenu} from '../../components/horizontalMenu';\nimport ripple from '../../components/ripple';\nimport Scrollable, {ScrollableX, SliceSides} from '../../components/scrollable';\nimport {formatDateAccordingToTodayNew} from '../../helpers/date';\nimport {IS_MOBILE_SAFARI, IS_SAFARI} from '../../environment/userAgent';\nimport {logger, LogTypes} from '../logger';\nimport rootScope from '../rootScope';\nimport appImManager, {AppImManager, APP_TABS} from './appImManager';\nimport Button from '../../components/button';\nimport SetTransition from '../../components/singleTransition';\nimport {MyDraftMessage} from './appDraftsManager';\nimport DEBUG, {MOUNT_CLASS_TO} from '../../config/debug';\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 wrapPhoto from '../../components/wrappers/photo';\nimport AppEditFolderTab from '../../components/sidebarLeft/tabs/editFolder';\nimport appSidebarLeft 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 {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 {setSendingStatus} from '../../components/sendingStatus';\nimport SortedList, {SortedElementBase} from '../../helpers/sortedList';\nimport debounce from '../../helpers/schedulers/debounce';\nimport {FOLDER_ID_ALL, FOLDER_ID_ARCHIVE, NULL_PEER_ID, REAL_FOLDERS, REAL_FOLDER_ID} from '../mtproto/mtproto_config';\nimport groupCallActiveIcon from '../../components/groupCallActiveIcon';\nimport {Chat, Message, NotifyPeer} from '../../layer';\nimport IS_GROUP_CALL_SUPPORTED from '../../environment/groupCallSupport';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport appNavigationController, {NavigationItem} from '../../components/appNavigationController';\nimport appMediaPlaybackController from '../../components/appMediaPlaybackController';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport {AppManagers} from './managers';\nimport appSidebarRight from '../../components/sidebarRight';\nimport PopupElement from '../../components/popups';\nimport choosePhotoSize from './utils/photos/choosePhotoSize';\nimport wrapEmojiText from '../richTextProcessor/wrapEmojiText';\nimport wrapMessageForReply from '../../components/wrappers/messageForReply';\nimport isMessageRestricted from './utils/messages/isMessageRestricted';\nimport getMediaFromMessage from './utils/messages/getMediaFromMessage';\nimport getMessageSenderPeerIdOrName from './utils/messages/getMessageSenderPeerIdOrName';\nimport wrapStickerEmoji from '../../components/wrappers/stickerEmoji';\nimport getDialogIndexKey from './utils/dialogs/getDialogIndexKey';\nimport getProxiedManagers from './getProxiedManagers';\nimport getDialogIndex from './utils/dialogs/getDialogIndex';\nimport {attachContextMenuListener} from '../../helpers/dom/attachContextMenuListener';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport wrapPeerTitle from '../../components/wrappers/peerTitle';\nimport middlewarePromise from '../../helpers/middlewarePromise';\nimport appDownloadManager from './appDownloadManager';\nimport groupCallsController from '../calls/groupCallsController';\nimport callsController from '../calls/callsController';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport noop from '../../helpers/noop';\nimport DialogsPlaceholder from '../../helpers/dialogsPlaceholder';\nimport pause from '../../helpers/schedulers/pause';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport filterAsync from '../../helpers/array/filterAsync';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport whichChild from '../../helpers/dom/whichChild';\nimport {getMiddleware, MiddlewareHelper} from '../../helpers/middleware';\nimport makeError from '../../helpers/makeError';\nimport getUnsafeRandomInt from '../../helpers/number/getUnsafeRandomInt';\nimport Row, {RowMediaSizeType} from '../../components/row'\nimport SettingSection from '../../components/settingSection';\nimport {SliderSuperTabEventable} from '../../components/sliderTab';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport {AckedResult} from '../mtproto/superMessagePort';\nimport ButtonMenuToggle from '../../components/buttonMenuToggle';\nimport getMessageThreadId from './utils/messages/getMessageThreadId';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport AppSharedMediaTab from '../../components/sidebarRight/tabs/sharedMedia';\nimport {dispatchHeavyAnimationEvent} from '../../hooks/useHeavyAnimationCheck';\nimport AppArchivedTab from '../../components/sidebarLeft/tabs/archivedTab';\nimport shake from '../../helpers/dom/shake';\nimport AppEditTopicTab from '../../components/sidebarRight/tabs/editTopic';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\n\nexport const DIALOG_LIST_ELEMENT_TAG = 'A';\n\nexport type DialogDom = {\n avatarEl: AvatarElement,\n captionDiv: HTMLElement,\n titleSpan: HTMLSpanElement,\n titleSpanContainer: HTMLSpanElement,\n statusSpan: HTMLSpanElement,\n lastTimeSpan: HTMLSpanElement,\n unreadBadge?: HTMLElement,\n unreadAvatarBadge?: HTMLElement,\n callIcon?: ReturnType,\n mentionsBadge?: HTMLElement,\n lastMessageSpan: HTMLSpanElement,\n containerEl: HTMLElement,\n listEl: HTMLElement,\n subtitleEl: HTMLElement,\n\n setLastMessagePromise?: CancellablePromise,\n setUnreadMessagePromise?: CancellablePromise\n};\n\ninterface SortedDialog extends SortedElementBase {\n dom: DialogDom,\n dialogElement: DialogElement\n}\n\nfunction setPromiseMiddleware}, K extends keyof T>(obj: T, key: K) {\n const oldPromise: CancellablePromise = obj[key] as any;\n oldPromise?.reject();\n\n // @ts-ignore\n const deferred = obj[key] = deferredPromise();\n deferred.catch(() => {}).finally(() => {\n if((obj[key] as any) === deferred) {\n delete obj[key];\n }\n });\n\n const middleware = middlewarePromise(() => (obj[key] as any) === deferred);\n return {deferred, middleware};\n}\n\nconst BADGE_SIZE = 22;\nconst BADGE_TRANSITION_TIME = 250;\n\nclass SortedDialogList extends SortedList {\n public managers: AppManagers;\n public log: ReturnType;\n public list: HTMLElement;\n public indexKey: ReturnType;\n public onListLengthChange: () => void;\n public forumPeerId: PeerId;\n\n constructor(options: {\n managers: SortedDialogList['managers'],\n log?: SortedDialogList['log'],\n list: SortedDialogList['list'],\n indexKey: SortedDialogList['indexKey'],\n onListLengthChange?: SortedDialogList['onListLengthChange'],\n forumPeerId?: SortedDialogList['forumPeerId']\n }) {\n super({\n getIndex: (element) => this.managers.dialogsStorage.getDialogIndex(this.forumPeerId ?? element.id, this.indexKey, this.forumPeerId ? element.id : undefined),\n onDelete: (element) => {\n element.dom.listEl.remove();\n 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?.();\n }\n },\n onElementCreate: async(base) => {\n const loadPromises: Promise[] = [];\n\n const dialogElement = appDialogsManager.addListDialog({\n peerId: this.forumPeerId ?? base.id,\n loadPromises,\n isBatch: true,\n threadId: this.forumPeerId ? base.id : undefined,\n isMainList: this.indexKey === 'index_0'\n });\n (base as SortedDialog).dom = dialogElement.dom;\n (base as SortedDialog).dialogElement = dialogElement;\n\n await Promise.all(loadPromises);\n return base as SortedDialog;\n },\n updateElementWith: fastRafConventional,\n log: options.log\n });\n\n safeAssign(this, options);\n }\n\n public clear() {\n this.list.replaceChildren();\n super.clear();\n }\n}\n\nexport type DialogElementSize = RowMediaSizeType;\ntype DialogElementOptions = {\n peerId: PeerId,\n rippleEnabled?: boolean,\n onlyFirstName?: boolean,\n meAsSaved?: boolean,\n avatarSize?: RowMediaSizeType,\n autonomous?: boolean,\n loadPromises?: Promise[],\n fromName?: string,\n noIcons?: boolean,\n threadId?: number,\n wrapOptions?: WrapSomethingOptions,\n isMainList?: boolean\n};\nclass DialogElement extends Row {\n public dom: DialogDom;\n\n constructor({\n peerId,\n rippleEnabled = true,\n onlyFirstName = false,\n meAsSaved = true,\n avatarSize = 'bigger',\n autonomous,\n loadPromises,\n fromName,\n noIcons,\n threadId,\n wrapOptions = {},\n isMainList\n }: DialogElementOptions) {\n super({\n clickable: true,\n noRipple: !rippleEnabled,\n havePadding: !threadId,\n title: true,\n titleRightSecondary: true,\n subtitle: true,\n subtitleRight: true,\n noWrap: true,\n asLink: true\n });\n\n this.subtitleRight.remove();\n\n const avatarEl = threadId ? undefined : new AvatarElement();\n if(avatarEl) {\n const avatarSizeMap: {[k in DialogElementSize]?: number} = {\n bigger: 54,\n abitbigger: 42,\n small: 32\n };\n const s = avatarSizeMap[avatarSize];\n avatarEl.classList.add('dialog-avatar', 'avatar-' + s);\n avatarEl.updateWithOptions({\n loadPromises,\n lazyLoadQueue: wrapOptions.lazyLoadQueue,\n isDialog: !!meAsSaved,\n peerId,\n peerTitle: fromName\n });\n\n this.applyMediaElement(avatarEl, avatarSize);\n }\n\n const captionDiv = this.container;\n\n const titleSpanContainer = this.title;\n titleSpanContainer.classList.add('user-title');\n\n this.titleRow.classList.add('dialog-title');\n\n const peerTitle = new PeerTitle();\n const peerTitlePromise = peerTitle.update({\n peerId,\n fromName,\n dialog: meAsSaved,\n onlyFirstName,\n withIcons: !noIcons,\n threadId: threadId\n });\n\n loadPromises?.push(peerTitlePromise);\n titleSpanContainer.append(peerTitle.element);\n\n // for muted icon\n titleSpanContainer.classList.add('tgico'); // * ัั‚ะฐ ัั‚ั€ะพะบะฐ ะฑัƒะดะตั‚ ะฐะบั‚ัƒะฐะปัŒะฝะฐ ั‚ะพะปัŒะบะพ ะดะปั !container, ะฝะพ ะปะฐะดะฝะพ\n\n // const titleIconsPromise = generateTitleIcons(peerId).then((elements) => {\n // titleSpanContainer.append(...elements);\n // });\n\n // if(loadPromises) {\n // loadPromises.push(titleIconsPromise);\n // }\n // }\n\n const span = this.subtitle;\n // span.classList.add('user-last-message');\n\n const li = this.container;\n li.classList.add('chatlist-chat', 'chatlist-chat-' + avatarSize);\n if(!autonomous) {\n (li as HTMLAnchorElement).href = '#' + peerId;\n }\n // if(rippleEnabled) {\n // ripple(li);\n // }\n\n if(avatarSize === 'bigger') {\n this.container.classList.add('row-big');\n } else if(avatarSize === 'small') {\n this.container.classList.add('row-small');\n }\n\n li.dataset.peerId = '' + peerId;\n if(threadId) {\n li.dataset.threadId = '' + threadId;\n }\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 rightSpan = this.titleRight;\n rightSpan.classList.add('dialog-title-details');\n rightSpan.append(statusSpan, lastTimeSpan);\n\n this.subtitleRow.classList.add('dialog-subtitle');\n\n const dom: DialogDom = this.dom = {\n avatarEl,\n captionDiv,\n titleSpan: peerTitle.element,\n titleSpanContainer,\n statusSpan,\n lastTimeSpan,\n lastMessageSpan: span,\n containerEl: li,\n listEl: li,\n subtitleEl: this.subtitleRow\n };\n\n if(!autonomous) {\n (li as any).dialogDom = dom;\n\n const chat = appImManager.chat;\n if(chat && appImManager.isSamePeer(chat, {peerId, threadId: threadId, type: 'chat'})) {\n appDialogsManager.setDialogActive(li, true);\n }\n\n if(isMainList && appDialogsManager.forumTab?.peerId === peerId && !threadId) {\n li.classList.add('is-forum-open');\n }\n }\n }\n\n public createUnreadBadge() {\n if(this.dom.unreadBadge) return;\n const badge = this.dom.unreadBadge = document.createElement('div');\n badge.className = `dialog-subtitle-badge badge badge-${BADGE_SIZE}`;\n this.dom.subtitleEl.append(badge);\n }\n\n public createUnreadAvatarBadge() {\n if(this.dom.unreadAvatarBadge) return;\n const badge = this.dom.unreadAvatarBadge = document.createElement('div');\n badge.className = `dialog-subtitle-badge badge badge-${BADGE_SIZE} avatar-badge`;\n this.dom.listEl.append(badge);\n }\n\n public createMentionsBadge() {\n if(this.dom.mentionsBadge) return;\n const badge = this.dom.mentionsBadge = document.createElement('div');\n badge.className = `dialog-subtitle-badge badge badge-${BADGE_SIZE} mention mention-badge`;\n badge.innerText = '@';\n this.dom.lastMessageSpan.after(badge);\n }\n\n public toggleBadgeByKey(\n key: Extract,\n hasBadge: boolean,\n justCreated: boolean,\n batch?: boolean\n ) {\n SetTransition({\n element: this.dom[key],\n className: 'is-visible',\n forwards: hasBadge,\n duration: batch ? 0 : BADGE_TRANSITION_TIME,\n onTransitionEnd: hasBadge ? undefined : () => {\n this.dom[key].remove();\n delete this.dom[key];\n },\n useRafs: !justCreated || !isInDOM(this.dom[key]) ? 2 : 0\n });\n }\n}\n\nclass ForumTab extends SliderSuperTabEventable {\n private rows: HTMLElement;\n private subtitle: HTMLElement;\n\n public peerId: PeerId;\n private firstTime: boolean;\n\n private log: ReturnType;\n\n private xd: Some3;\n\n public async toggle(value: boolean) {\n if(this.init2) {\n await this.init2();\n }\n\n SetTransition({\n element: this.container,\n className: 'is-visible',\n forwards: value,\n duration: 300,\n onTransitionEnd: !value ? () => {\n this.onCloseAfterTimeout();\n } : undefined,\n useRafs: this.firstTime ? (this.firstTime = undefined, 2) : undefined\n });\n }\n\n public init(options: {\n peerId: PeerId,\n managers: AppManagers\n }) {\n safeAssign(this, options);\n\n this.log = logger('FORUM');\n this.firstTime = true;\n this.container.classList.add('topics-container');\n\n const isFloating = !this.slider;\n if(isFloating) {\n this.closeBtn.classList.replace('tgico-left', 'tgico-close');\n this.container.classList.add('active', 'is-floating');\n\n attachClickEvent(this.closeBtn, () => {\n appDialogsManager.toggleForumTab(undefined, this);\n }, {listenerSetter: this.listenerSetter});\n }\n\n this.rows = document.createElement('div');\n this.rows.classList.add('sidebar-header__rows');\n\n this.subtitle = document.createElement('div');\n this.subtitle.classList.add('sidebar-header__subtitle');\n\n this.title.replaceWith(this.rows);\n this.rows.append(this.title, this.subtitle);\n\n const list = appDialogsManager.createChatList();\n appDialogsManager.setListClickListener(list, null, true);\n this.scrollable.append(list);\n\n this.xd = new Some3(this.peerId, isFloating ? 80 : 0);\n this.xd.scrollable = this.scrollable;\n this.xd.sortedList = new SortedDialogList({\n managers: this.managers,\n log: this.log,\n list,\n indexKey: 'index_0',\n forumPeerId: this.peerId\n });\n this.xd.bindScrollable();\n\n const getOptionsForMessages = (): Parameters[0] => {\n return {\n peerId: this.peerId,\n type: 'chat'\n };\n };\n\n const btnMenu = ButtonMenuToggle({\n listenerSetter: this.listenerSetter,\n direction: 'bottom-left',\n buttons: [{\n icon: 'info',\n text: 'ForumTopic.Context.Info',\n onClick: async() => {\n const tab = appSidebarLeft.createTab(AppSharedMediaTab, true);\n tab.isFirst = true;\n tab.setPeer(this.peerId);\n (await tab.fillProfileElements())();\n tab.loadSidebarMedia(true);\n tab.open();\n }\n }, {\n icon: 'message',\n text: 'ForumTopic.Context.ShowAsMessages',\n onClick: () => {\n const chat = appImManager.chat;\n appImManager[chat?.peerId === this.peerId ? 'setPeer' : 'setInnerPeer'](getOptionsForMessages());\n },\n verify: () => {\n const chat = appImManager.chat;\n return !chat || !appImManager.isSamePeer(chat, getOptionsForMessages());\n }\n }, {\n icon: 'adduser',\n text: 'ForumTopic.Context.AddMember',\n onClick: () => {},\n verify: () => false && this.managers.appChatsManager.hasRights(this.peerId.toChatId(), 'invite_users')\n }, {\n icon: 'add',\n text: 'ForumTopic.Context.New',\n onClick: () => {\n appSidebarLeft.createTab(AppEditTopicTab).open(this.peerId);\n },\n separator: true,\n verify: () => this.managers.appChatsManager.hasRights(this.peerId.toChatId(), 'manage_topics')\n }]\n });\n\n this.listenerSetter.add(rootScope)('history_reload', (peerId) => {\n if(this.peerId !== peerId) {\n return;\n }\n\n this.xd.fullReset();\n });\n\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n if(this.peerId !== chatId.toPeerId(true)) {\n return;\n }\n\n const chat = await this.managers.appChatsManager.getChat(chatId);\n if(!(chat as Chat.channel).pFlags.forum) {\n appDialogsManager.toggleForumTab(undefined, this);\n }\n });\n\n if(IS_TOUCH_SUPPORTED) {\n handleTabSwipe({\n element: this.container,\n onSwipe: () => {\n appDialogsManager.toggleForumTab(undefined, this);\n },\n middleware: this.middlewareHelper.get()\n });\n }\n\n this.header.append(btnMenu);\n\n if(!isFloating) {\n return this.init2();\n }\n }\n\n public async init2() {\n this.init2 = undefined;\n\n const middleware = this.middlewareHelper.get();\n const peerId = this.peerId;\n\n this.managers.apiUpdatesManager.subscribeToChannelUpdates(this.peerId.toChatId());\n middleware.onDestroy(() => {\n this.managers.apiUpdatesManager.unsubscribeFromChannelUpdates(this.peerId.toChatId());\n });\n\n const peerTitlePromise = wrapPeerTitle({\n peerId,\n dialog: true,\n wrapOptions: {middleware}\n });\n\n const setStatusPromise = appImManager.setPeerStatus({\n peerId,\n element: this.subtitle,\n needClear: true,\n useWhitespace: false,\n middleware,\n noTyping: true\n });\n\n // this.managers.dialogsStorage.getForumTopics(this.peerId).then((messagesForumTopics) => {\n // console.log(messagesForumTopics);\n\n // const promises = messagesForumTopics.topics.map((forumTopic) => {\n // return this.sortedDialogList.add(forumTopic.id);\n // });\n\n // return Promise.all(promises);\n // }).then(() => {\n // this.dialogsPlaceholder.detach(this.sortedDialogList.getAll().size);\n // });\n\n return Promise.all([\n peerTitlePromise,\n setStatusPromise,\n this.xd.onChatsScroll().then((loadResult) => {\n return loadResult.cached ? loadResult.renderPromise : undefined\n })\n ]).then(([\n peerTitle,\n setStatus,\n _\n ]) => {\n if(!middleware()) {\n return;\n }\n\n this.title.append(peerTitle);\n setStatus?.();\n });\n }\n\n public onCloseAfterTimeout() {\n super.onCloseAfterTimeout();\n this.xd.destroy();\n }\n}\n\nconst NOT_IMPLEMENTED_ERROR = new Error('not implemented');\n\ntype DialogKey = Parameters[0];\nclass Some {\n public sortedList: SortedDialogList;\n public scrollable: Scrollable;\n public loadedDialogsAtLeastOnce: boolean;\n public needPlaceholderAtFirstTime: boolean;\n protected offsets: {top: number, bottom: number};\n protected indexKey: ReturnType;\n protected sliceTimeout: number;\n protected managers: AppManagers;\n protected listenerSetter: ListenerSetter;\n protected loadDialogsPromise: Promise<{cached: boolean, renderPromise: Some2['loadDialogsRenderPromise']}>;\n protected loadDialogsRenderPromise: Promise;\n protected placeholder: DialogsPlaceholder;\n protected log: ReturnType;\n protected placeholderOptions: ConstructorParameters[0];\n\n constructor() {\n this.log = logger('CL');\n this.offsets = {top: 0, bottom: 0};\n this.managers = rootScope.managers;\n this.listenerSetter = new ListenerSetter();\n }\n\n public getOffsetIndex(side: 'top' | 'bottom') {\n return {index: this.scrollable.loadedAll[side] ? 0 : this.offsets[side]};\n }\n\n protected isDialogMustBeInViewport(dialog: T) {\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 = getDialogIndex(dialog, this.indexKey);\n return (!topOffset.index || index <= topOffset.index) &&\n (!bottomOffset.index || index >= bottomOffset.index);\n }\n\n public setIndexKey(indexKey: Some['indexKey']) {\n this.indexKey = indexKey;\n this.sortedList.indexKey = indexKey;\n }\n\n protected deleteDialogByKey(key: DialogKey) {\n this.sortedList.delete(key);\n }\n\n public deleteDialog(dialog: T) {\n return this.deleteDialogByKey(this.getDialogKey(dialog));\n }\n\n public updateDialog(dialog: T) {\n const key = this.getDialogKey(dialog);\n if(this.isDialogMustBeInViewport(dialog)) {\n if(!this.sortedList.has(key) && this.loadedDialogsAtLeastOnce) {\n this.sortedList.add(key);\n return;\n }\n } else {\n this.deleteDialog(dialog);\n return;\n }\n\n const dialogElement = this.getDialogElement(key);\n if(dialogElement) {\n appDialogsManager.setLastMessageN({\n dialog,\n dialogElement,\n setUnread: true\n });\n this.sortedList.update(key);\n }\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.sortedList.list.childElementCount || appDialogsManager.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 const perf = performance.now();\n\n const scrollTopWas = this.scrollable.scrollTop;\n\n const firstElementChild = this.sortedList.list.firstElementChild;\n const rectContainer = this.scrollable.container.getBoundingClientRect();\n const rectTarget = firstElementChild.getBoundingClientRect();\n const children = Array.from(this.scrollable.splitUp.children) as HTMLElement[];\n\n // const padding = 8;\n // const offsetTop = this.folders.container.offsetTop;\n let offsetTop = this.scrollable.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.scrollable.loadedAll.top = false;\n }\n\n if(sliceFromEnd.length) {\n this.scrollable.loadedAll.bottom = false;\n }\n\n sliced.push(...sliceFromStart);\n sliced.push(...sliceFromEnd);\n\n sliced.forEach((el) => {\n this.deleteDialogByKey(this.getDialogKeyFromElement(el));\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 const scrollTop = firstElement.offsetTop - elementOverflow;\n this.scrollable.scrollTop = this.scrollable.lastScrollPosition = scrollTop;\n\n this.log('slice time', performance.now() - perf, this.indexKey, scrollTop);\n /* const firstElementRect = firstElement.getBoundingClientRect();\n const scrollTop = */\n\n // this.scroll.scrollIntoView(firstElement, false);\n });\n }, 200);\n };\n\n public onChatsScrollTop() {\n return this.onChatsScroll('top');\n };\n\n public onChatsScroll(side: SliceSides = 'bottom') {\n return this.loadDialogs(side);\n };\n\n public createPlaceholder(): DialogsPlaceholder {\n const placeholder = this.placeholder = new DialogsPlaceholder(this.placeholderOptions);\n const getRectFrom = this.getRectFromForPlaceholder();\n placeholder.attach({\n container: this.sortedList.list.parentElement,\n getRectFrom,\n onRemove: () => {\n if(this.placeholder === placeholder) {\n this.placeholder = undefined;\n }\n },\n blockScrollable: this.scrollable\n });\n\n return placeholder;\n }\n\n public loadDialogs(side: SliceSides) {\n /* if(testScroll) {\n return;\n } */\n\n const log = this.log.bindPrefix('load-' + getUnsafeRandomInt(1000, 9999));\n log('try', side);\n\n if(this.loadDialogsPromise || this.loadDialogsRenderPromise/* || 1 === 1 */) return this.loadDialogsPromise;\n else if(this.scrollable.loadedAll[side]) {\n return Promise.resolve({\n cached: true,\n renderPromise: Promise.resolve()\n });\n }\n\n log.warn('start', side);\n const middlewareError = makeError('MIDDLEWARE');\n\n const cachedInfoPromise = deferredPromise();\n const renderPromise = new Promise(async(resolve, reject) => {\n const chatList = this.sortedList.list;\n\n let placeholder = this.placeholder;\n try {\n const getConversationsResult = this.loadDialogsInner(side);\n const a = await getConversationsResult;\n\n if(\n !chatList.childElementCount &&\n !placeholder &&\n (\n (!this.loadedDialogsAtLeastOnce && this.needPlaceholderAtFirstTime) ||\n !a.cached\n )\n ) {\n if(this.loadDialogsRenderPromise !== renderPromise) {\n throw middlewareError;\n }\n\n placeholder = this.createPlaceholder();\n\n cachedInfoPromise.resolve(false);\n }\n\n const result = await a.result;\n // await pause(5000);\n if(this.loadDialogsRenderPromise !== renderPromise) {\n throw middlewareError;\n }\n\n cachedInfoPromise.resolve(a.cached);\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.scrollable.loadedAll[side] = true;\n }\n } else if(result.isTopEnd) {\n this.scrollable.loadedAll[side] = true;\n }\n\n const length = result.dialogs.length;\n log(`will render ${length} dialogs`);\n if(length) {\n const dialogs = side === 'top' ? result.dialogs.slice().reverse() : result.dialogs;\n\n const loadPromises = dialogs.map((dialog) => {\n return this.sortedList.add(this.getDialogKey(dialog as T));\n });\n\n await Promise.all(loadPromises).catch();\n if(this.loadDialogsRenderPromise !== renderPromise) {\n throw middlewareError;\n }\n }\n\n const offsetDialog = result.dialogs[side === 'top' ? 0 : length - 1];\n if(offsetDialog) {\n this.offsets[side] = getDialogIndex(offsetDialog, this.indexKey);\n }\n\n // don't set it before - no need to fire length change with every dialog\n this.loadedDialogsAtLeastOnce = true;\n appDialogsManager.onListLengthChange();\n\n log('getDialogs', result, chatList.childElementCount);\n\n setTimeout(() => {\n this.scrollable.onScroll();\n }, 0);\n\n if(placeholder) {\n // await pause(500);\n placeholder.detach(chatList.childElementCount);\n }\n } catch(err) {\n if((err as ApiError)?.type !== 'MIDDLEWARE') {\n log.error(err);\n }\n\n reject(err);\n cachedInfoPromise.reject(err);\n return;\n }\n\n resolve();\n }).finally(() => {\n if(this.loadDialogsRenderPromise === renderPromise) {\n log('end');\n this.loadDialogsRenderPromise = undefined;\n } else {\n log('has been cleared');\n }\n });\n\n this.loadDialogsRenderPromise = renderPromise;\n const loadDialogsPromise = this.loadDialogsPromise = cachedInfoPromise.then((cached) => {\n return {\n cached,\n renderPromise\n };\n }).finally(() => {\n if(this.loadDialogsPromise === loadDialogsPromise) {\n this.loadDialogsPromise = undefined;\n }\n });\n\n return loadDialogsPromise;\n }\n\n public async setOffsets() {\n const chatList = this.sortedList.list;\n const [firstDialog, lastDialog] = await Promise.all([\n this.getDialogFromElement(chatList.firstElementChild as HTMLElement),\n this.getDialogFromElement(chatList.lastElementChild as HTMLElement)\n ]);\n\n const {indexKey} = this;\n this.offsets.top = getDialogIndex(firstDialog, indexKey);\n this.offsets.bottom = getDialogIndex(lastDialog, indexKey);\n }\n\n public getDialogKey(dialog: T): DialogKey {\n throw NOT_IMPLEMENTED_ERROR;\n }\n\n public getDialogKeyFromElement(element: HTMLElement): DialogKey {\n throw NOT_IMPLEMENTED_ERROR;\n }\n\n public getRectFromForPlaceholder(): Parameters[0]['getRectFrom'] {\n throw NOT_IMPLEMENTED_ERROR;\n }\n\n public getDialogFromElement(element: HTMLElement): Promise {\n throw NOT_IMPLEMENTED_ERROR;\n }\n\n public loadDialogsInner(side: SliceSides): ReturnType {\n throw NOT_IMPLEMENTED_ERROR;\n }\n\n public async setTyping(dialog: T) {\n const key = this.getDialogKey(dialog);\n const dom = this.getDialogDom(key);\n if(!dom) {\n return;\n }\n\n const oldTypingElement = dom.lastMessageSpan.querySelector('.peer-typing-container') as HTMLElement;\n const newTypingElement = await appImManager.getPeerTyping(\n dialog.peerId,\n oldTypingElement,\n dialog._ === 'forumTopic' ? dialog.id : undefined\n );\n if(!oldTypingElement && newTypingElement) {\n replaceContent(dom.lastMessageSpan, newTypingElement);\n dom.lastMessageSpan.classList.add('user-typing');\n }\n }\n\n public unsetTyping(dialog: T) {\n const key = this.getDialogKey(dialog);\n const dialogElement = this.getDialogElement(key);\n if(!dialogElement) {\n return;\n }\n\n dialogElement.dom.lastMessageSpan.classList.remove('user-typing');\n appDialogsManager.setLastMessageN({\n dialog,\n lastMessage: null,\n dialogElement,\n setUnread: null\n });\n }\n\n public getDialogDom(key: DialogKey) {\n // return this.doms[peerId];\n const element = this.sortedList.get(key);\n return element?.dom;\n }\n\n public getDialogElement(key: DialogKey) {\n const element = this.sortedList.get(key);\n return element?.dialogElement;\n }\n\n public bindScrollable() {\n this.scrollable.container.addEventListener('scroll', this.onChatsRegularScroll);\n this.scrollable.onScrolledTop = this.onChatsScrollTop.bind(this);\n this.scrollable.onScrolledBottom = this.onChatsScroll.bind(this);\n this.scrollable.setVirtualContainer(this.sortedList.list);\n }\n\n public clear() {\n this.sortedList.clear();\n this.placeholder?.remove();\n }\n\n public reset() {\n this.scrollable.loadedAll.top = true;\n this.scrollable.loadedAll.bottom = false;\n this.offsets.top = this.offsets.bottom = 0;\n this.loadDialogsRenderPromise = undefined;\n this.loadDialogsPromise = undefined;\n }\n\n public fullReset() {\n this.reset();\n this.clear();\n return this.onChatsScroll();\n }\n\n public destroy() {\n this.clear();\n this.scrollable.destroy();\n this.listenerSetter.removeAll();\n }\n}\n\nclass Some3 extends Some {\n constructor(public peerId: PeerId, public paddingX: number) {\n super();\n\n this.placeholderOptions = {\n avatarSize: 0,\n marginVertical: 5,\n totalHeight: 64\n };\n\n this.listenerSetter.add(rootScope)('peer_typings', async({peerId, threadId, typings}) => {\n if(!threadId || this.peerId !== peerId) {\n return;\n }\n\n const dialog = await this.managers.dialogsStorage.getForumTopic(peerId, threadId);\n\n if(!dialog) return;\n\n if(typings.length) {\n this.setTyping(dialog);\n } else {\n this.unsetTyping(dialog);\n }\n });\n\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\n for(const [peerId, {dialog, topics}] of dialogs) {\n if(peerId !== this.peerId || !topics?.size) {\n continue;\n }\n\n topics.forEach((forumTopic) => {\n this.updateDialog(forumTopic);\n });\n }\n });\n\n this.listenerSetter.add(rootScope)('dialog_unread', ({dialog}) => {\n if(dialog?._ !== 'forumTopic' || dialog.peerId !== this.peerId) {\n return;\n }\n\n appDialogsManager.setUnreadMessagesN({dialog, dialogElement: this.getDialogElement(this.getDialogKey(dialog))});\n });\n\n this.listenerSetter.add(rootScope)('dialog_notify_settings', async(dialog) => {\n if(dialog.peerId !== this.peerId) {\n return;\n }\n\n if(dialog._ === 'dialog') {\n const all = this.sortedList.getAll();\n const entries = [...all.entries()];\n const promises = entries.map(([id]) => this.managers.dialogsStorage.getForumTopic(this.peerId, id));\n const topics = await Promise.all(promises);\n entries.forEach(([id, element], idx) => {\n appDialogsManager.setUnreadMessagesN({dialog: topics[idx], dialogElement: element.dialogElement}); // ะฒะพะทะผะพะถะฝะพ ัั‚ะพ ะฝะต ะฝัƒะถะฝะพ, ะฝะพ ะฝัƒะถะฝะพ ะผะตะฝัั‚ัŒ is-muted\n });\n\n return;\n }\n\n appDialogsManager.setUnreadMessagesN({dialog, dialogElement: this.getDialogElement(this.getDialogKey(dialog))}); // ะฒะพะทะผะพะถะฝะพ ัั‚ะพ ะฝะต ะฝัƒะถะฝะพ, ะฝะพ ะฝัƒะถะฝะพ ะผะตะฝัั‚ัŒ is-muted\n });\n\n this.listenerSetter.add(rootScope)('dialog_drop', (dialog) => {\n if(dialog._ !== 'forumTopic' || dialog.peerId !== this.peerId) {\n return;\n }\n\n this.deleteDialogByKey(this.getDialogKey(dialog));\n });\n\n this.listenerSetter.add(rootScope)('dialog_draft', ({dialog, drop, peerId}) => {\n if(dialog._ !== 'forumTopic' || dialog.peerId !== this.peerId) {\n return;\n }\n\n if(drop) {\n this.deleteDialog(dialog);\n } else {\n this.updateDialog(dialog);\n }\n });\n }\n\n protected isDialogMustBeInViewport(dialog: ForumTopic) {\n if(dialog.pFlags.hidden) return false;\n return super.isDialogMustBeInViewport(dialog);\n }\n\n public getDialogKey(dialog: ForumTopic) {\n return dialog.id;\n }\n\n public getDialogKeyFromElement(element: HTMLElement) {\n return +element.dataset.threadId;\n }\n\n public getRectFromForPlaceholder() {\n return (): DOMRectEditable => {\n const sidebarRect = appSidebarLeft.rect;\n const paddingY = 56;\n return {\n top: paddingY,\n right: sidebarRect.right,\n bottom: 0,\n left: this.paddingX,\n width: sidebarRect.width - this.paddingX,\n height: sidebarRect.height - paddingY\n };\n };\n }\n\n public getDialogFromElement(element: HTMLElement) {\n return this.managers.dialogsStorage.getForumTopic(+element.dataset.peerId, +element.dataset.threadId);\n }\n\n public async loadDialogsInner(side: SliceSides) {\n const {indexKey} = this;\n let loadCount = windowSize.height / 64 * 1.25 | 0;\n let offsetIndex = 0;\n\n const filterId = this.peerId;\n const {index: currentOffsetIndex} = this.getOffsetIndex(side);\n offsetIndex = currentOffsetIndex;\n if(currentOffsetIndex) {\n if(side === 'top') {\n const storage = await this.managers.dialogsStorage.getFolderDialogs(filterId, true);\n const index = storage.findIndex((dialog) => getDialogIndex(dialog, indexKey) <= currentOffsetIndex);\n const needIndex = Math.max(0, index - loadCount);\n loadCount = index - needIndex;\n offsetIndex = getDialogIndex(storage[needIndex], indexKey) + 1;\n } else {\n offsetIndex = currentOffsetIndex;\n }\n }\n\n return this.managers.acknowledged.dialogsStorage.getDialogs({\n offsetIndex,\n limit: loadCount,\n filterId,\n skipMigrated: true\n });\n }\n}\n\nclass Some2 extends Some {\n constructor(protected filterId: number) {\n super();\n\n this.needPlaceholderAtFirstTime = true;\n\n this.listenerSetter.add(rootScope)('peer_typings', async({peerId, typings}) => {\n const [dialog, isForum] = await Promise.all([\n this.managers.appMessagesManager.getDialogOnly(peerId),\n this.managers.appPeersManager.isForum(peerId)\n ]);\n\n if(!dialog || isForum) return;\n\n if(typings.length) {\n this.setTyping(dialog);\n } else {\n this.unsetTyping(dialog);\n }\n });\n\n this.listenerSetter.add(rootScope)('user_update', async(userId) => {\n if(!this.isActive) {\n return;\n }\n\n const peerId = userId.toPeerId();\n const dom = this.getDialogDom(peerId);\n if(!dom) {\n return;\n }\n\n const status = await this.managers.appUsersManager.getUserStatus(userId);\n const online = status?._ === 'userStatusOnline';\n this.setOnlineStatus(dom.avatarEl, online);\n });\n\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n const peerId = chatId.toPeerId(true);\n this.processDialogForCallStatus(peerId);\n });\n\n this.listenerSetter.add(rootScope)('dialog_flush', ({dialog}) => {\n if(!this.isActive || !dialog) {\n return;\n }\n\n appDialogsManager.setLastMessageN({\n dialog,\n setUnread: true\n });\n this.validateDialogForFilter(dialog);\n });\n\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\n if(!this.isActive) {\n return;\n }\n\n for(const [peerId, {dialog, topics}] of dialogs) {\n if(dialog?._ !== 'dialog') {\n continue;\n }\n\n this.updateDialog(dialog);\n\n appDialogsManager.processContact?.(peerId.toPeerId());\n\n this.validateDialogForFilter(dialog);\n }\n });\n\n this.listenerSetter.add(rootScope)('dialog_drop', (dialog) => {\n if(!this.isActive || dialog._ !== 'dialog') {\n return;\n }\n\n this.deleteDialogByKey(dialog.peerId);\n appDialogsManager.processContact?.(dialog.peerId);\n });\n\n this.listenerSetter.add(rootScope)('dialog_unread', ({dialog}) => {\n if(!this.isActive || dialog?._ !== 'dialog') {\n return;\n }\n\n appDialogsManager.setUnreadMessagesN({dialog, dialogElement: this.getDialogElement(this.getDialogKey(dialog))});\n this.validateDialogForFilter(dialog);\n });\n\n this.listenerSetter.add(rootScope)('dialog_notify_settings', (dialog) => {\n if(!this.isActive || dialog._ === 'forumTopic') {\n return;\n }\n\n this.validateDialogForFilter(dialog);\n appDialogsManager.setUnreadMessagesN({dialog, dialogElement: this.getDialogElement(this.getDialogKey(dialog))}); // ะฒะพะทะผะพะถะฝะพ ัั‚ะพ ะฝะต ะฝัƒะถะฝะพ, ะฝะพ ะฝัƒะถะฝะพ ะผะตะฝัั‚ัŒ is-muted\n });\n\n this.listenerSetter.add(rootScope)('dialog_draft', ({dialog, drop, peerId}) => {\n if(!this.isActive || dialog._ === 'forumTopic') {\n return;\n }\n\n if(drop) {\n this.deleteDialog(dialog);\n } else {\n this.updateDialog(dialog);\n }\n\n appDialogsManager.processContact?.(peerId);\n });\n\n this.listenerSetter.add(rootScope)('filter_update', async(filter) => {\n if(this.isActive && filter.id === this.filterId && !REAL_FOLDERS.has(filter.id)) {\n const dialogs = await this.managers.dialogsStorage.getCachedDialogs(true);\n await 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 }\n\n private get isActive() {\n return appDialogsManager.xd === this;\n }\n\n public getRectFromForPlaceholder() {\n return this.filterId === FOLDER_ID_ARCHIVE ? appDialogsManager.chatsContainer : appDialogsManager.folders.container;\n }\n\n public async loadDialogsInner(side: SliceSides) {\n const {filterId, indexKey} = this;\n let loadCount = windowSize.height / 72 * 1.25 | 0;\n let offsetIndex = 0;\n\n const doNotRenderChatList = appDialogsManager.doNotRenderChatList; // cache before awaits\n\n const {index: currentOffsetIndex} = this.getOffsetIndex(side);\n if(currentOffsetIndex) {\n if(side === 'top') {\n const storage = await this.managers.dialogsStorage.getFolderDialogs(filterId, true);\n const index = storage.findIndex((dialog) => getDialogIndex(dialog, indexKey) <= currentOffsetIndex);\n const needIndex = Math.max(0, index - loadCount);\n loadCount = index - needIndex;\n offsetIndex = getDialogIndex(storage[needIndex], indexKey) + 1;\n } else {\n offsetIndex = currentOffsetIndex;\n }\n }\n\n const promise = this.managers.acknowledged.dialogsStorage.getDialogs({\n offsetIndex,\n limit: loadCount,\n filterId,\n skipMigrated: true\n });\n\n const a = await promise;\n if(doNotRenderChatList) {\n a.result = Promise.reject(makeError('MIDDLEWARE'));\n }\n\n return a;\n }\n\n public 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({\n element: element,\n className: 'is-visible',\n forwards: online,\n duration: 250,\n onTransitionEnd: online ? undefined : () => {\n element.classList.remove(className);\n },\n useRafs: online && !hasClassName ? 2 : 0\n });\n }\n\n public generateScrollable(list: HTMLUListElement, filter: Parameters[0]) {\n const filterId = filter.id;\n const scrollable = new Scrollable(null, 'CL', 500);\n scrollable.container.dataset.filterId = '' + filterId;\n\n const indexKey = getDialogIndexKey(filter.localId);\n const sortedDialogList = new SortedDialogList({\n managers: rootScope.managers,\n log: this.log,\n list: list,\n indexKey,\n onListLengthChange: appDialogsManager.onListLengthChange\n });\n\n this.scrollable = scrollable;\n this.sortedList = sortedDialogList;\n this.setIndexKey(indexKey);\n this.bindScrollable();\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 public testDialogForFilter(dialog: Dialog) {\n if(!REAL_FOLDERS.has(this.filterId) ? getDialogIndex(dialog, this.indexKey) === undefined : this.filterId !== dialog.folder_id) {\n return false;\n }\n\n return true;\n }\n\n protected isDialogMustBeInViewport(dialog: Dialog) {\n if(dialog.migratedTo !== undefined || !this.testDialogForFilter(dialog)) return false;\n return super.isDialogMustBeInViewport(dialog);\n }\n\n /**\n * ะฃะดะฐะปะธั‚ ะฝะตะฟะพะดั…ะพะดัั‰ะธะต ั‡ะฐั‚ั‹ ะธะท ัะฟะธัะบะฐ, ะฝะพ ะฝะต ะดะพะฑะฐะฒะธั‚ ะธั…(!)\n */\n public async validateListForFilter() {\n this.sortedList.getAll().forEach(async(element) => {\n const dialog = await rootScope.managers.appMessagesManager.getDialogOnly(element.id);\n if(!this.testDialogForFilter(dialog)) {\n this.deleteDialog(dialog);\n }\n });\n }\n\n /**\n * ะฃะดะฐะปะธั‚ ะฝะตะฟะพะดั…ะพะดัั‰ะธะน ั‡ะฐั‚ ะธะท ัะฟะธัะบะฐ, ะฝะพ ะฝะต ะดะพะฑะฐะฒะธั‚ ะตะณะพ(!)\n */\n public validateDialogForFilter(dialog: Dialog) {\n if(!this.getDialogElement(dialog.peerId)) {\n return;\n }\n\n if(!this.testDialogForFilter(dialog)) {\n this.deleteDialog(dialog);\n }\n }\n\n public 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({\n element: dom.callIcon.canvas,\n className: 'is-visible',\n forwards: visible,\n duration: BADGE_TRANSITION_TIME,\n onTransitionEnd: visible ? undefined : () => {\n dom.callIcon.canvas.remove();\n dom.callIcon = undefined;\n },\n useRafs: visible ? 2 : 0\n });\n }\n\n public async processDialogForCallStatus(peerId: PeerId, dom?: DialogDom) {\n if(!IS_GROUP_CALL_SUPPORTED) {\n return;\n }\n\n if(!dom) dom = this.getDialogDom(peerId);\n if(!dom) return;\n\n const chat = await rootScope.managers.appChatsManager.getChat(peerId.toChatId()) as Chat.chat | Chat.channel;\n this.setCallStatus(dom, !!(chat.pFlags.call_active && chat.pFlags.call_not_empty));\n }\n\n public onChatsScroll(side: SliceSides = 'bottom') {\n if(this.scrollable.loadedAll[side]) {\n appDialogsManager.loadContacts?.();\n }\n\n this.log('onChatsScroll', side);\n return super.onChatsScroll(side);\n }\n\n public toggleAvatarUnreadBadges(value: boolean, useRafs: number) {\n if(!value) {\n this.sortedList.getAll().forEach((sortedDialog) => {\n const {dom, dialogElement} = sortedDialog;\n if(!dom.unreadAvatarBadge) {\n return;\n }\n\n dialogElement.toggleBadgeByKey('unreadAvatarBadge', false, false, false);\n });\n\n return;\n }\n\n const reuseClassNames = ['unread', 'mention'];\n this.sortedList.getAll().forEach((sortedDialog) => {\n const {dom, dialogElement} = sortedDialog;\n const unreadContent = dom.unreadBadge?.textContent;\n if(!unreadContent || dom.unreadBadge.classList.contains('backwards')) {\n return;\n }\n\n const isUnreadAvatarBadgeMounted = !!dom.unreadAvatarBadge;\n dialogElement.createUnreadAvatarBadge();\n dialogElement.toggleBadgeByKey('unreadAvatarBadge', true, isUnreadAvatarBadgeMounted);\n dom.unreadAvatarBadge.textContent = unreadContent;\n const unreadAvatarBadgeClassList = dom.unreadAvatarBadge.classList;\n const unreadBadgeClassList = dom.unreadBadge.classList;\n reuseClassNames.forEach((className) => {\n unreadAvatarBadgeClassList.toggle(className, unreadBadgeClassList.contains(className));\n });\n });\n }\n\n public getDialogKey(dialog: Dialog) {\n return dialog.peerId;\n }\n\n public getDialogKeyFromElement(element: HTMLElement) {\n return +element.dataset.peerId;\n }\n\n public getDialogFromElement(element: HTMLElement) {\n return rootScope.managers.appMessagesManager.getDialogOnly(element.dataset.peerId.toPeerId());\n }\n}\n\n// const testScroll = false;\n// let testTopSlice = 1;\n\nexport class AppDialogsManager {\n public chatsContainer = document.getElementById('chatlist-container') as HTMLDivElement;\n\n private log = logger('DIALOGS', LogTypes.Log | LogTypes.Error | LogTypes.Warn | LogTypes.Debug);\n\n private contextMenu: DialogsContextMenu;\n\n public filterId: number;\n public 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\n private lastActiveElements: Set = new Set();\n\n public loadContacts: () => void;\n public processContact: (peerId: PeerId) => void;\n\n private initedListeners = false;\n\n public onListLengthChange: () => Promise;\n private allChatsIntlElement: I18n.IntlElement;\n\n private emptyDialogsPlaceholderSubtitle: I18n.IntlElement;\n private updateContactsLengthPromise: Promise;\n\n private filtersNavigationItem: NavigationItem;\n\n private managers: AppManagers;\n private selectTab: ReturnType;\n\n public doNotRenderChatList: boolean;\n\n private stateMiddlewareHelper: MiddlewareHelper;\n\n private forumsTabs: Map;\n private forumsSlider: HTMLElement;\n public forumTab: ForumTab;\n private forumNavigationItem: NavigationItem;\n\n public xd: Some2;\n public xds: {[filterId: number]: Some2} = {};\n\n public start() {\n const managers = this.managers = getProxiedManagers();\n\n this.contextMenu = new DialogsContextMenu(managers);\n this.stateMiddlewareHelper = getMiddleware();\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 this.forumsTabs = new Map();\n this.forumsSlider = document.createElement('div');\n this.forumsSlider.classList.add('topics-slider');\n this.chatsContainer.parentElement.parentElement.append(this.forumsSlider);\n // findUpClassName(this.chatsContainer, 'chatlist-container').append(this.forumsSlider);\n\n // appSidebarLeft.onOpenTab = () => {\n // return this.toggleForumTab();\n // };\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 verifyTouchTarget: () => {\n return !this.forumTab;\n }\n });\n }\n\n this.allChatsIntlElement = new I18n.IntlElement({\n key: 'FilterAllChatsShort'\n });\n\n rootScope.addEventListener('premium_toggle', async(isPremium) => {\n if(isPremium) {\n return;\n }\n\n const isFolderAvailable = await this.managers.filtersStorage.isFilterIdAvailable(this.filterId);\n if(!isFolderAvailable) {\n selectTab(whichChild(this.filtersRendered[FOLDER_ID_ALL].menu), false);\n }\n });\n\n rootScope.addEventListener('state_cleared', () => {\n const clearCurrent = REAL_FOLDERS.has(this.filterId);\n // setTimeout(() =>\n apiManagerProxy.getState().then(async(state) => {\n this.xd.loadedDialogsAtLeastOnce = false;\n this.showFiltersPromise = undefined;\n\n /* const clearPromises: Promise[] = [];\n for(const name in this.managers.appStateManager.storagesResults) {\n const results = this.managers.appStateManager.storagesResults[name as keyof AppStateManager['storages']];\n const storage = this.managers.appStateManager.storages[name as keyof AppStateManager['storages']];\n results.length = 0;\n clearPromises.push(storage.clear());\n } */\n\n if(clearCurrent) {\n this.xd.clear();\n this.onTabChange();\n }\n\n this.onStateLoaded(state);\n })// , 5000);\n });\n\n this.setFilterId(FOLDER_ID_ALL, FOLDER_ID_ALL);\n this.addFilter({\n id: FOLDER_ID_ALL,\n title: '',\n localId: FOLDER_ID_ALL\n });\n\n const foldersScrollable = new ScrollableX(this.folders.menuScrollContainer);\n bottomPart.prepend(this.folders.menuScrollContainer);\n const selectTab = this.selectTab = horizontalMenu(this.folders.menu, this.folders.container, async(id, tabContent) => {\n /* if(id !== 0) {\n id += 1;\n } */\n\n const _id = id;\n id = +tabContent.dataset.filterId || FOLDER_ID_ALL;\n\n const isFilterAvailable = this.filterId === -1 || REAL_FOLDERS.has(id) || await this.managers.filtersStorage.isFilterIdAvailable(id);\n if(!isFilterAvailable) {\n return false;\n }\n\n const wasFilterId = this.filterId;\n if(!IS_MOBILE_SAFARI) {\n if(_id) {\n if(!this.filtersNavigationItem) {\n this.filtersNavigationItem = {\n type: 'filters',\n onPop: () => {\n selectTab(0);\n this.filtersNavigationItem = undefined;\n }\n };\n\n appNavigationController.spliceItems(1, 0, this.filtersNavigationItem);\n }\n } else if(this.filtersNavigationItem) {\n appNavigationController.removeItem(this.filtersNavigationItem);\n this.filtersNavigationItem = undefined;\n }\n }\n\n if(wasFilterId === id) return;\n\n this.xds[id].clear();\n const promise = this.setFilterIdAndChangeTab(id).then(({cached, renderPromise}) => {\n if(cached) {\n return renderPromise;\n }\n });\n\n if(wasFilterId !== -1) {\n return promise;\n }\n }, () => {\n for(const folderId in this.xds) {\n if(+folderId !== this.filterId) {\n this.xds[folderId].clear();\n }\n }\n }, undefined, foldersScrollable);\n\n apiManagerProxy.getState().then((state) => {\n // * it should've had a better place :(\n appMediaPlaybackController.setPlaybackParams(state.playbackParams);\n appMediaPlaybackController.addEventListener('playbackParams', (params) => {\n this.managers.appStateManager.pushToState('playbackParams', params);\n });\n\n return this.onStateLoaded(state);\n })/* .then(() => {\n const isLoadedMain = this.managers.appMessagesManager.dialogsStorage.isDialogsLoaded(0);\n const isLoadedArchive = this.managers.appMessagesManager.dialogsStorage.isDialogsLoaded(1);\n const wasLoaded = isLoadedMain || isLoadedArchive;\n const a: Promise = isLoadedMain ? Promise.resolve() : this.managers.appMessagesManager.getConversationsAll('', 0);\n const b: Promise = isLoadedArchive ? Promise.resolve() : this.managers.appMessagesManager.getConversationsAll('', 1);\n a.finally(() => {\n b.then(() => {\n if(wasLoaded) {\n (apiUpdatesManager.updatesState.syncLoading || Promise.resolve()).then(() => {\n this.managers.appMessagesManager.refreshConversations();\n });\n }\n });\n });\n }) */;\n\n mediaSizes.addEventListener('resize', () => {\n this.changeFiltersAllChatsKey();\n });\n\n new ConnectionStatusComponent(this.managers, this.chatsContainer);\n this.chatsContainer.append(bottomPart);\n\n setTimeout(() => {\n lottieLoader.loadLottieWorkers();\n }, 200);\n\n PopupElement.MANAGERS = rootScope.managers = managers;\n appDownloadManager.construct(managers);\n appSidebarLeft.construct(managers);\n appSidebarRight.construct(managers);\n groupCallsController.construct(managers);\n callsController.construct(managers);\n appImManager.construct(managers);\n\n // start\n\n this.xd = this.xds[this.filterId];\n\n // selectTab(0, false);\n }\n\n public get chatList() {\n return this.xd.sortedList.list;\n }\n\n public setFilterId(filterId: number, localId: MyDialogFilter['localId']) {\n this.filterId = filterId;\n }\n\n public async setFilterIdAndChangeTab(filterId: number) {\n this.filterId = filterId;\n return this.onTabChange();\n }\n\n private initListeners() {\n rootScope.addEventListener('dialog_flush', ({dialog}) => {\n if(!dialog) {\n return;\n }\n\n this.setFiltersUnreadCount();\n });\n\n rootScope.addEventListener('folder_unread', async(folder) => {\n if(folder.id < 0) {\n const dialogElement = this.xd.getDialogElement(folder.id);\n if(!dialogElement) {\n return;\n }\n\n this.setUnreadMessagesN({\n dialog: await this.managers.dialogsStorage.getDialogOnly(folder.id),\n dialogElement\n });\n } else {\n this.setFilterUnreadCount(folder.id);\n }\n });\n\n rootScope.addEventListener('contacts_update', (userId) => {\n this.processContact?.(userId.toPeerId());\n });\n\n appImManager.addEventListener('peer_changed', ({peerId, threadId, isForum}) => {\n const options: Parameters[0] = {peerId, threadId: isForum ? threadId : undefined};\n // const perf = performance.now();\n for(const element of this.lastActiveElements) {\n const elementThreadId = +element.dataset.threadId || undefined;\n const elementPeerId = element.dataset.peerId.toPeerId();\n if(!appImManager.isSamePeer({peerId: elementPeerId, threadId: elementThreadId}, options)) {\n this.setDialogActive(element, false);\n }\n }\n\n const elements = Array.from(document.querySelectorAll(`[data-autonomous=\"0\"] .chatlist-chat[data-peer-id=\"${peerId}\"]`)) as HTMLElement[];\n elements.forEach((element) => {\n const elementThreadId = +element.dataset.threadId || undefined;\n if(appImManager.isSamePeer({peerId, threadId: elementThreadId}, options)) {\n this.setDialogActive(element, true);\n }\n });\n // this.log('peer_changed total time:', performance.now() - perf);\n });\n\n rootScope.addEventListener('filter_update', async(filter) => {\n if(REAL_FOLDERS.has(filter.id)) {\n return;\n }\n\n if(!this.filtersRendered[filter.id]) {\n this.addFilter(filter);\n return;\n }\n\n const elements = this.filtersRendered[filter.id];\n setInnerHTML(elements.title, 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 elements.container.remove();\n elements.menu.remove();\n\n this.xds[filter.id].destroy();\n delete this.xds[filter.id];\n delete this.filtersRendered[filter.id];\n\n this.onFiltersLengthChange();\n\n if(this.filterId === filter.id) {\n this.selectTab(0, false);\n }\n });\n\n rootScope.addEventListener('filter_order', async(order) => {\n order = order.slice();\n indexOfAndSplice(order, FOLDER_ID_ARCHIVE);\n\n const containerToAppend = this.folders.menu as HTMLElement;\n const r = await Promise.all(order.map(async(filterId) => {\n const [indexKey, filter] = await Promise.all([\n this.managers.dialogsStorage.getDialogIndexKeyByFilterId(filterId),\n this.managers.filtersStorage.getFilter(filterId)\n ]);\n\n return {indexKey, filter};\n }));\n\n order.forEach((filterId, idx) => {\n const {indexKey, filter} = r[idx];\n const renderedFilter = this.filtersRendered[filterId];\n\n this.xds[filterId].setIndexKey(indexKey);\n\n positionElementByIndex(renderedFilter.menu, containerToAppend, filter.localId);\n positionElementByIndex(renderedFilter.container, this.folders.container, filter.localId);\n });\n\n /* if(this.filterId) {\n const tabIndex = order.indexOf(this.filterId) + 1;\n selectTab.prevId = tabIndex;\n } */\n });\n }\n\n public setDialogActive(listEl: HTMLElement, active: boolean) {\n const dom = (listEl as any).dialogDom as DialogDom;\n listEl.classList.toggle('active', active);\n listEl.classList.toggle('is-forum-open', this.forumTab?.peerId === listEl.dataset.peerId.toPeerId() && !listEl.dataset.threadId);\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 this.stateMiddlewareHelper.clean();\n const middleware = this.stateMiddlewareHelper.get();\n const filtersArr = state.filtersArr;\n const haveFilters = filtersArr.length > REAL_FOLDERS.size;\n // const filter = filtersArr.find((filter) => filter.id !== FOLDER_ID_ARCHIVE);\n\n const addFilters = (filters: MyDialogFilter[]) => {\n for(const filter of filters) {\n this.addFilter(filter);\n }\n };\n\n let addFiltersPromise: Promise;\n if(haveFilters) {\n addFilters(filtersArr);\n } else {\n addFiltersPromise = this.managers.filtersStorage.getDialogFilters().then(addFilters);\n }\n\n this.doNotRenderChatList = true;\n const loadDialogsPromise = this.xd.onChatsScroll();\n const m = middlewarePromise(middleware);\n try {\n await m(loadDialogsPromise);\n } catch(err) {\n\n }\n\n // show the placeholder before the filters, and then will reset to the default tab again\n if(!haveFilters) {\n this.selectTab(0, false);\n }\n\n addFiltersPromise && await m(addFiltersPromise);\n // this.folders.menu.children[0].classList.add('active');\n\n this.doNotRenderChatList = undefined;\n\n this.filterId = -1;\n this.selectTab(0, false);\n\n if(!this.initedListeners) {\n this.initListeners();\n this.initedListeners = true;\n }\n\n haveFilters && this.showFiltersPromise && await m(this.showFiltersPromise);\n\n this.managers.appNotificationsManager.getNotifyPeerTypeSettings();\n\n await (await m(loadDialogsPromise)).renderPromise.catch(noop);\n this.managers.appMessagesManager.fillConversations();\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 = this.managers.appMessagesManager.getDialogByPeerId(peerId);\n return {index: dialog[0].index, pos: dialog[1]};\n }\n }\n\n return {index: 0, pos: -1};\n } */\n\n public onTabChange = () => {\n this.xd = this.xds[this.filterId];\n this.xd.reset();\n return this.xd.onChatsScroll();\n };\n\n private async setFilterUnreadCount(filterId: number) {\n // if(filterId === FOLDER_ID_ALL) {\n // return;\n // }\n\n const unreadSpan = this.filtersRendered[filterId]?.unread;\n if(!unreadSpan) {\n return;\n }\n\n const {unreadUnmutedCount, unreadCount} = await this.managers.dialogsStorage.getFolderUnreadCount(filterId);\n\n unreadSpan.classList.toggle('badge-gray', !unreadUnmutedCount);\n const count = filterId === FOLDER_ID_ALL ? unreadUnmutedCount : unreadCount;\n unreadSpan.innerText = count ? '' + count : '';\n }\n\n private setFiltersUnreadCount() {\n for(const filterId in this.filtersRendered) {\n this.setFilterUnreadCount(+filterId);\n }\n }\n\n public l(filter: Parameters[0]) {\n const ul = this.createChatList();\n const xd = this.xds[filter.id] = new Some2(filter.id);\n const scrollable = xd.generateScrollable(ul, filter);\n this.setListClickListener(ul, null, true);\n\n return {ul, xd, scrollable};\n }\n\n private addFilter(filter: Pick) {\n if(filter.id === FOLDER_ID_ARCHIVE) {\n return;\n }\n\n const containerToAppend = this.folders.menu as HTMLElement;\n const renderedFilter = this.filtersRendered[filter.id];\n if(renderedFilter) {\n positionElementByIndex(renderedFilter.menu, containerToAppend, filter.localId);\n positionElementByIndex(renderedFilter.container, this.folders.container, filter.localId);\n return;\n }\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.id === FOLDER_ID_ALL) titleSpan.append(this.allChatsIntlElement.element);\n else setInnerHTML(titleSpan, 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 ripple(menuTab);\n menuTab.append(span);\n\n menuTab.dataset.filterId = '' + filter.id;\n\n positionElementByIndex(menuTab, containerToAppend, filter.localId);\n // containerToAppend.append(li);\n\n const {ul, scrollable} = this.l(filter);\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.localId);\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 let promise = this.showFiltersPromise;\n return promise ??= this.showFiltersPromise = pause(0).then(() => {\n if(this.showFiltersPromise !== promise) {\n return;\n }\n\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 });\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 === FOLDER_ID_ARCHIVE) {\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.xd.scrollable.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 const div = document.createElement('div');\n const emoji = '๐Ÿ“‚';\n const size = 128;\n wrapStickerEmoji({\n div,\n emoji: emoji,\n width: size,\n height: size\n });\n\n placeholderContainer.prepend(div);\n\n const button = Button('btn-primary btn-color-primary btn-control tgico', {\n text: 'FilterHeaderEdit',\n icon: 'settings'\n });\n\n attachClickEvent(button, async() => {\n const tab = appSidebarLeft.createTab(AppEditFolderTab);\n tab.setInitFilter(await this.managers.filtersStorage.getFilter(this.filterId));\n tab.open();\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 return this.updateContactsLengthPromise ??= this.managers.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.replaceChildren();\n this.loadContacts = undefined;\n this.processContact = undefined;\n }\n\n private _onListLengthChange = () => {\n if(!this.xd.loadedDialogsAtLeastOnce) {\n return;\n }\n\n this.checkIfPlaceholderNeeded();\n\n if(this.filterId !== FOLDER_ID_ALL) 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 this.managers.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: 'abitbigger',\n createChatListOptions: {\n dialogSize: 48,\n new: true\n },\n autonomous: false,\n onListLengthChange,\n managers: this.managers\n });\n\n this.loadContacts = () => {\n const pageCount = windowSize.height / 60 | 0;\n const promise = filterAsync(contacts.splice(0, pageCount), this.verifyPeerIdForContacts);\n\n promise.then((arr) => {\n arr.forEach((peerId) => {\n sortedUserList.add(peerId);\n });\n });\n\n if(!contacts.length) {\n this.loadContacts = undefined;\n }\n };\n\n this.loadContacts();\n\n this.processContact = async(peerId) => {\n if(peerId.isAnyChat()) {\n return;\n }\n\n const good = await 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 = async(peerId: PeerId) => {\n const [isContact, dialog] = await Promise.all([\n this.managers.appPeersManager.isContact(peerId),\n this.managers.appMessagesManager.getDialogOnly(peerId)\n ]);\n\n return isContact && !dialog;\n };\n\n public async toggleForumTab(newTab?: ForumTab, hideTab = this.forumTab) {\n if(!hideTab && !newTab) {\n return;\n }\n\n if(hideTab) {\n const dialogElement = this.xd.getDialogElement(hideTab.peerId);\n if(dialogElement) {\n dialogElement.dom.listEl.classList.remove('is-forum-open');\n }\n }\n\n if(hideTab === newTab) {\n newTab = undefined;\n }\n\n hideTab?.toggle(false);\n const promise = newTab?.toggle(true);\n if(hideTab === this.forumTab) {\n this.forumTab = newTab;\n }\n\n if(newTab) {\n const dialogElement = this.xd.getDialogElement(newTab.peerId);\n if(dialogElement) {\n dialogElement.dom.listEl.classList.add('is-forum-open');\n }\n\n appImManager.selectTab(APP_TABS.CHATLIST);\n }\n\n if(promise) {\n await promise;\n }\n\n if(newTab && !this.forumNavigationItem) {\n this.forumNavigationItem = {\n type: 'forum',\n onPop: () => {\n this.forumNavigationItem = undefined;\n this.toggleForumTab();\n }\n };\n\n appNavigationController.pushItem(this.forumNavigationItem);\n } else if(!newTab && this.forumNavigationItem) {\n appNavigationController.removeItem(this.forumNavigationItem);\n this.forumNavigationItem = undefined;\n }\n\n const forwards = !!newTab;\n const useRafs = promise ? 2 : undefined;\n this.xd.toggleAvatarUnreadBadges(forwards, useRafs);\n\n const deferred = deferredPromise();\n const duration = 300;\n SetTransition({\n element: this.forumsSlider.parentElement,\n className: 'is-forum-visible',\n duration,\n forwards,\n useRafs,\n onTransitionEnd: () => {\n deferred.resolve();\n }\n });\n\n dispatchHeavyAnimationEvent(deferred, duration).then(() => deferred.resolve());\n }\n\n public toggleForumTabByPeerId(peerId: PeerId, show?: boolean) {\n const {managers} = this;\n const history = appSidebarLeft.getHistory();\n const lastTab = history[history.length - 1];\n let forumTab: ForumTab;\n if(lastTab/* && !(lastTab instanceof AppArchivedTab) */) {\n if(lastTab instanceof ForumTab && lastTab.peerId === peerId && show) {\n shake(lastTab.container);\n return;\n }\n\n forumTab = appSidebarLeft.createTab(ForumTab);\n forumTab.open({peerId, managers});\n return;\n }\n\n forumTab = this.forumsTabs.get(peerId);\n const isSameTab = this.forumTab && this.forumTab === forumTab;\n show ??= !isSameTab;\n if(show === isSameTab) {\n if(show) {\n shake(forumTab.container);\n }\n\n return;\n }\n\n if(show && !forumTab) {\n forumTab = new ForumTab(undefined);\n forumTab.init({peerId, managers});\n\n this.forumsTabs.set(peerId, forumTab);\n this.forumsSlider.append(forumTab.container);\n\n forumTab.managers = this.managers;\n forumTab.eventListener.addEventListener('destroy', () => {\n this.forumsTabs.delete(peerId);\n });\n }\n\n return this.toggleForumTab(forumTab);\n }\n\n public setListClickListener(\n list: HTMLUListElement,\n onFound?: () => void,\n withContext = false,\n autonomous = false,\n openInner = false\n ) {\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\n this.log('dialogs click list');\n const target = e.target as HTMLElement;\n const elem = findUpTag(target, DIALOG_LIST_ELEMENT_TAG);\n\n if(!elem) {\n return;\n }\n\n const peerId = elem.dataset.peerId.toPeerId();\n const lastMsgId = +elem.dataset.mid || undefined;\n const threadId = +elem.dataset.threadId || undefined;\n\n onFound?.();\n\n const isForum = !!elem.querySelector('.is-forum');\n if(isForum && !e.shiftKey && !lastMsgId) {\n this.toggleForumTabByPeerId(peerId);\n return;\n }\n\n if(e.ctrlKey || e.metaKey) {\n window.open((elem as HTMLAnchorElement).href || ('#' + peerId), '_blank');\n cancelEvent(e);\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(\n (!threadId || lastMsgId) &&\n this.xd.sortedList.list === list &&\n this.xd !== this.xds[FOLDER_ID_ARCHIVE]\n ) {\n this.toggleForumTab();\n }\n\n setPeerFunc({\n peerId,\n lastMsgId,\n threadId: threadId\n });\n }, {capture: true});\n\n // cancel link click\n // ! do not change it to attachClickEvent\n list.addEventListener('click', (e) => {\n if(e.button === 0) {\n cancelEvent(e);\n }\n }, {capture: true});\n\n if(withContext) {\n this.contextMenu.attach(list);\n }\n }\n\n public createChatList(options: {\n // avatarSize?: number,\n // handheldsSize?: number,\n // size?: number,\n new?: boolean,\n dialogSize?: number,\n ignoreClick?: boolean\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.ignoreClick) {\n // list.classList.add('disable-hover');\n // }\n\n /* if(options.handheldsSize) {\n list.classList.add('chatlist-handhelds-' + options.handheldsSize);\n } */\n\n return list;\n }\n\n public setLastMessageN(options: Parameters[0]) {\n const promise = this.setLastMessage(options);\n return promise.catch((err: ApiError) => {\n if(err?.type !== 'MIDDLEWARE') {\n this.log.error('set last message error', err);\n }\n });\n }\n\n private async setLastMessage({\n dialog,\n lastMessage,\n dialogElement,\n highlightWord,\n isBatch = false,\n setUnread = false\n }: {\n dialog: Dialog | ForumTopic,\n lastMessage?: Message.message | Message.messageService,\n dialogElement?: DialogElement,\n highlightWord?: string,\n isBatch?: boolean,\n setUnread?: boolean\n }) {\n if(!dialogElement) {\n dialogElement = this.xd.getDialogElement(dialog.peerId);\n\n if(!dialogElement) {\n return;\n }\n }\n\n const {dom} = dialogElement;\n const {peerId} = dialog;\n\n const {deferred: promise, middleware} = setPromiseMiddleware(dom, 'setLastMessagePromise');\n\n let draftMessage: MyDraftMessage;\n if(!lastMessage) {\n if(\n dialog.draft?._ === 'draftMessage' && (\n !peerId.isAnyChat() ||\n dialog._ === 'forumTopic' ||\n !(await this.managers.appPeersManager.isForum(peerId))\n )\n ) {\n draftMessage = dialog.draft;\n }\n\n lastMessage = (dialog as Dialog).topMessage;\n if(lastMessage?.mid !== dialog.top_message) {\n const promise = this.managers.appMessagesManager.getMessageByPeer(peerId, dialog.top_message);\n lastMessage = await middleware(promise);\n }\n }\n\n const isSearch = setUnread !== null && !setUnread;\n // * do not uncomment `setUnread` - unsetTyping right after this call will interrupt setting unread badges\n if(/* setUnread */!isSearch) {\n this.setUnreadMessagesN({dialog, dialogElement, isBatch, setLastMessagePromise: promise});\n }\n\n if(!lastMessage/* || (lastMessage._ === 'messageService' && !lastMessage.rReply) */) {\n dom.lastMessageSpan.replaceChildren();\n dom.lastTimeSpan.replaceChildren();\n delete dom.listEl.dataset.mid;\n\n promise.resolve();\n return;\n }\n\n const isRestricted = lastMessage && isMessageRestricted(lastMessage as Message.message);\n\n /* if(!dom.lastMessageSpan.classList.contains('user-typing')) */ {\n let mediaContainer: HTMLElement;\n const willPrepend: (Promise | HTMLElement)[] = [];\n if(lastMessage && !draftMessage && !isRestricted) {\n const media: MyDocument | MyPhoto = getMediaFromMessage(lastMessage);\n const videoTypes: Set = new Set(['video', 'gif', 'round']);\n if(media && (media._ === 'photo' || videoTypes.has(media.type))) {\n const size = choosePhotoSize(media, 20, 20);\n\n if(size._ !== 'photoSizeEmpty') {\n mediaContainer = document.createElement('div');\n mediaContainer.classList.add('dialog-subtitle-media');\n\n if((media as MyDocument).type === 'round') {\n mediaContainer.classList.add('is-round');\n }\n\n willPrepend.push(wrapPhoto({\n photo: media,\n message: lastMessage,\n container: mediaContainer,\n withoutPreloader: true,\n size\n }).then(() => mediaContainer));\n\n if(videoTypes.has((media as MyDocument).type)) {\n const playIcon = document.createElement('span');\n playIcon.classList.add('tgico-play');\n\n mediaContainer.append(playIcon);\n }\n }\n }\n }\n\n /* if(lastMessage.from_id === auth.id) { // You: */\n if(draftMessage) {\n const span = document.createElement('span');\n span.classList.add('danger');\n span.append(i18n('Draft'), ': ');\n willPrepend.unshift(span);\n } else if(peerId.isAnyChat() && peerId !== lastMessage.fromId && !(lastMessage as Message.messageService).action) {\n const span = document.createElement('span');\n span.classList.add('primary-text');\n\n if(lastMessage.fromId === rootScope.myId) {\n span.append(i18n('FromYou'));\n willPrepend.unshift(span);\n } else {\n // str = sender.first_name || sender.last_name || sender.username;\n const p = middleware(wrapPeerTitle({\n peerId: lastMessage.fromId,\n onlyFirstName: true\n })).then((element) => {\n span.prepend(element);\n return span;\n }, noop);\n\n willPrepend.unshift(p);\n }\n\n span.append(': ');\n // console.log(sender, senderBold.innerText);\n }\n\n const withoutMediaType = !!mediaContainer && !!(lastMessage as Message.message)?.message;\n\n let fragment: DocumentFragment;\n if(highlightWord && (lastMessage as Message.message).message) {\n fragment = await middleware(wrapMessageForReply({message: lastMessage, highlightWord, withoutMediaType}));\n } else if(draftMessage) {\n fragment = await middleware(wrapMessageForReply({message: draftMessage}));\n } else if(lastMessage) {\n fragment = await middleware(wrapMessageForReply({message: lastMessage, withoutMediaType}));\n } else { // rare case\n fragment = document.createDocumentFragment();\n }\n\n if(willPrepend.length) {\n const elements = await middleware(Promise.all(willPrepend));\n fragment.prepend(...elements);\n }\n\n replaceContent(dom.lastMessageSpan, fragment);\n }\n\n if(lastMessage || 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(isSearch) {\n dom.listEl.dataset.mid = '' + lastMessage.mid;\n\n const replyTo = lastMessage.reply_to;\n if(replyTo?.pFlags?.forum_topic) {\n dom.listEl.dataset.threadId = '' + getMessageThreadId(lastMessage);\n }\n }\n\n promise.resolve();\n }\n\n public setUnreadMessagesN(options: Parameters[0]) {\n return this.setUnreadMessages(options).catch(() => {});\n }\n\n private async setUnreadMessages({\n dialog,\n dialogElement,\n isBatch = false,\n setLastMessagePromise\n }: {\n dialog: Dialog | ForumTopic,\n dialogElement: DialogElement,\n isBatch?: boolean,\n setLastMessagePromise?: Promise\n }) {\n const {dom} = dialogElement;\n if(!dom) {\n // this.log.error('setUnreadMessages no dom!', dialog);\n return;\n }\n\n const isTopic = dialog._ === 'forumTopic';\n\n const {deferred, middleware} = setPromiseMiddleware(dom, 'setUnreadMessagePromise');\n\n const {peerId} = dialog;\n const promises = Promise.all([\n this.managers.appNotificationsManager.isPeerLocalMuted({peerId: peerId, respectType: true, threadId: isTopic ? dialog.id : undefined}),\n dialog.draft?._ !== 'draftMessage' ? this.managers.appMessagesManager.getMessageByPeer(peerId, dialog.top_message) : undefined,\n isTopic ? !!dialog.pFlags.pinned : this.managers.dialogsStorage.isDialogPinned(peerId, this.filterId),\n this.managers.appMessagesManager.isDialogUnread(dialog),\n peerId.isAnyChat() && !isTopic ? this.managers.acknowledged.dialogsStorage.getForumUnreadCount(peerId).then((result) => {\n if(result.cached) {\n return result.result;\n } else {\n result.result.then(() => {\n this.setUnreadMessagesN({dialog, dialogElement});\n });\n\n return {count: 0, hasUnmuted: false};\n }\n }).catch(() => undefined as {count: number, hasUnmuted: boolean}) : undefined\n ]);\n\n let [isMuted, lastMessage, isPinned, isDialogUnread, forumUnreadCount] = await middleware(promises);\n const wasMuted = dom.listEl.classList.contains('is-muted');\n\n const {count: unreadTopicsCount, hasUnmuted: hasUnmutedTopic} = forumUnreadCount || {};\n\n let setStatusMessage: MyMessage;\n if(lastMessage && lastMessage.pFlags.out && lastMessage.peerId !== rootScope.myId) {\n setStatusMessage = lastMessage;\n }\n\n const unreadCount = unreadTopicsCount ?? dialog.unread_count;\n if(unreadTopicsCount !== undefined) {\n isDialogUnread = !!unreadCount;\n }\n\n if(isTopic && !isDialogUnread) {\n isDialogUnread = !getServerMessageId(dialog.read_inbox_max_id);\n }\n\n const hasUnreadBadge = isPinned || isDialogUnread;\n const hasUnreadAvatarBadge = this.xd !== this.xds[FOLDER_ID_ARCHIVE] && !isTopic && !!this.forumTab && this.xd.getDialogElement(peerId) === dialogElement && isDialogUnread;\n // dom.messageEl.classList.toggle('has-badge', hasBadge);\n\n // * have to await all promises before modifying something\n\n if(setLastMessagePromise) {\n try {\n await middleware(setLastMessagePromise);\n } catch(err) {\n return;\n }\n }\n\n const transitionDuration = isBatch ? 0 : BADGE_TRANSITION_TIME;\n\n dom.listEl.classList.toggle('no-unmuted-topic', !isMuted && hasUnmutedTopic !== undefined && !hasUnmutedTopic);\n\n if(isMuted !== wasMuted) {\n SetTransition({\n element: dom.listEl,\n className: 'is-muted',\n forwards: isMuted,\n duration: transitionDuration\n });\n }\n\n setSendingStatus(dom.statusSpan, isTopic && dialog.pFlags.closed ? 'premium_lock' : setStatusMessage, true);\n\n // if(isTopic) {\n // dom.statusSpan.parentElement.classList.toggle('is-closed', !!dialog.pFlags.closed);\n // }\n\n const isUnreadBadgeMounted = !!dom.unreadBadge;\n if(hasUnreadBadge) {\n dialogElement.createUnreadBadge();\n }\n\n const isUnreadAvatarBadgeMounted = !!dom.unreadAvatarBadge;\n if(hasUnreadAvatarBadge) {\n dialogElement.createUnreadAvatarBadge();\n }\n\n const hasMentionsBadge = dialog.unread_mentions_count && (dialog.unread_mentions_count > 1 || dialog.unread_count > 1);\n const isMentionsBadgeMounted = !!dom.mentionsBadge;\n if(hasMentionsBadge) {\n dialogElement.createMentionsBadge();\n }\n\n const a: [Parameters[0], boolean, boolean][] = [\n ['unreadBadge', hasUnreadBadge, isUnreadBadgeMounted],\n ['unreadAvatarBadge', hasUnreadAvatarBadge, isUnreadAvatarBadgeMounted],\n ['mentionsBadge', hasMentionsBadge, isMentionsBadgeMounted]\n ];\n\n a.forEach(([key, hasBadge, isBadgeMounted]) => {\n const badge = dom[key];\n if(!badge) {\n return;\n }\n\n dialogElement.toggleBadgeByKey(key, hasBadge, isBadgeMounted, isBatch);\n });\n\n if(!hasUnreadBadge) {\n deferred.resolve();\n return;\n }\n\n if(isPinned) {\n dom.unreadBadge.classList.add('tgico-chatspinned', 'tgico');\n } else if(dom.unreadBadge) {\n dom.unreadBadge.classList.remove('tgico-chatspinned', 'tgico');\n }\n\n let isUnread = true, isMention = false, unreadBadgeText: string;\n if(dialog.unread_mentions_count && unreadCount === 1) {\n unreadBadgeText = '@';\n isMention = true;\n // dom.unreadBadge.classList.add('tgico-mention', 'tgico');\n } else if(isDialogUnread) {\n // dom.unreadMessagesSpan.innerText = '' + (unreadCount ? formatNumber(unreadCount, 1) : ' ');\n unreadBadgeText = '' + (unreadCount ? formatNumber(unreadCount, 1) : ' ');\n } else {\n unreadBadgeText = '';\n isUnread = false;\n }\n\n if(isTopic) {\n const notVisited = isDialogUnread && unreadBadgeText === ' ';\n dom.unreadBadge.classList.toggle('not-visited', notVisited);\n }\n\n const b: Array<[HTMLElement, string]> = [\n [dom.unreadBadge, unreadBadgeText],\n [dom.unreadAvatarBadge, unreadBadgeText || undefined]\n ];\n\n b.filter(Boolean).forEach(([badge, text]) => {\n if(text !== undefined) {\n badge.innerText = unreadBadgeText;\n }\n\n badge.classList.toggle('unread', isUnread);\n badge.classList.toggle('mention', isMention);\n });\n\n deferred.resolve();\n }\n\n private async getDialog(dialog: Dialog | ForumTopic | PeerId, threadId?: number) {\n if(typeof(dialog) !== 'object') {\n let originalDialog: Dialog | ForumTopic;\n if(threadId) {\n originalDialog = await this.managers.dialogsStorage.getForumTopic(dialog, threadId);\n if(!originalDialog) {\n const peerId = dialog || NULL_PEER_ID;\n return {\n peerId,\n pFlags: {}\n } as any as ForumTopic;\n }\n } else {\n originalDialog = await this.managers.appMessagesManager.getDialogOnly(dialog);\n if(!originalDialog) {\n const peerId = dialog || NULL_PEER_ID;\n return {\n peerId,\n peer: await this.managers.appPeersManager.getOutputPeer(peerId),\n pFlags: {}\n } as any as Dialog;\n }\n }\n\n return originalDialog;\n }\n\n return dialog as Dialog | ForumTopic;\n }\n\n public addListDialog(options: Parameters[0] & {isBatch?: boolean}) {\n options.autonomous = false;\n\n const ret = this.addDialogNew(options);\n\n if(ret) {\n const {peerId} = options;\n const getDialogPromise = this.getDialog(peerId, options.threadId);\n const promise = getDialogPromise.then((dialog) => {\n const promises: Promise[] = [];\n const isUser = peerId.isUser();\n if(!isUser && dialog._ === 'dialog') {\n promises.push(this.xd.processDialogForCallStatus(peerId, ret.dom));\n }\n\n if(peerId !== rootScope.myId && isUser) {\n promises.push(this.managers.appUsersManager.getUserStatus(peerId.toUserId()).then((status) => {\n if(status?._ === 'userStatusOnline') {\n this.xd.setOnlineStatus(ret.dom.avatarEl, true);\n }\n }));\n }\n\n promises.push(this.setLastMessageN({\n dialog,\n dialogElement: ret,\n isBatch: options.isBatch,\n setUnread: true\n }));\n\n return Promise.all(promises);\n });\n\n options.loadPromises?.push(promise);\n }\n\n return ret;\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 = this.addDialogNew({\n ...options,\n ...getMessageSenderPeerIdOrName(message),\n peerId\n });\n\n this.setLastMessageN({\n dialog: {_: 'dialog', peerId} as any,\n lastMessage: message,\n dialogElement: ret,\n highlightWord: query\n });\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: DialogElementOptions & {container?: HTMLElement | Scrollable | false, append?: boolean}) {\n const d = new DialogElement({\n autonomous: !!options.container,\n avatarSize: 'bigger',\n ...options\n // avatarSize: !options.avatarSize || options.avatarSize >= 54 ? 'bigger' : 'abitbigger',\n });\n\n if(options.container) {\n const method = !options.append ? 'append' : 'prepend';\n options.container[method](d.container);\n }\n\n return d;\n // return this.addDialog(options.peerId, options.container, options.rippleEnabled, options.onlyFirstName, options.meAsSaved, options.append, options.avatarSize, options.autonomous, options.lazyLoadQueue, options.loadPromises, options.fromName, options.noIcons);\n }\n}\n\nconst appDialogsManager = new AppDialogsManager();\nMOUNT_CLASS_TO.appDialogsManager = appDialogsManager;\nexport default appDialogsManager;\n","export default function getUnsafeRandomInt(min: number, max: number) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1)) + min;\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 {DownloadMediaOptions, DownloadOptions} from '../mtproto/apiFileManager';\nimport type {AppMessagesManager} from './appMessagesManager';\nimport type {MyDocument} from './appDocsManager';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport {InputFile, Photo, PhotoSize} from '../../layer';\nimport getFileNameForUpload from '../../helpers/getFileNameForUpload';\nimport {AppManagers} from './managers';\nimport rootScope from '../rootScope';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport noop from '../../helpers/noop';\nimport getDownloadMediaDetails from './utils/download/getDownloadMediaDetails';\nimport getDownloadFileNameFromOptions from './utils/download/getDownloadFileNameFromOptions';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport makeError from '../../helpers/makeError';\nimport createDownloadAnchor from '../../helpers/dom/createDownloadAnchor';\nimport {getFileNameByLocation} from '../../helpers/fileName';\nimport getDocumentDownloadOptions from './utils/docs/getDocumentDownloadOptions';\nimport getPhotoDownloadOptions from './utils/photos/getPhotoDownloadOptions';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\n\nexport type ResponseMethodBlob = 'blob';\nexport type ResponseMethodJson = 'json';\nexport type ResponseMethod = ResponseMethodBlob | ResponseMethodJson;\n\n/* export type DownloadBlob = {promise: Promise, controller: AbortController};\nexport type DownloadJson = {promise: Promise, controller: AbortController}; */\nexport type DownloadBlob = CancellablePromise;\nexport type DownloadUrl = CancellablePromise;\nexport type DownloadJson = CancellablePromise;\n// export type Download = DownloadBlob/* | DownloadJson */;\nexport type Download = DownloadBlob | DownloadUrl/* | DownloadJson */;\n\nexport type Progress = {done: number, fileName: string, total: number, offset: number};\nexport type ProgressCallback = (details: Progress) => void;\n\ntype DownloadType = 'url' | 'blob' | 'void' | 'disc';\n\nexport class AppDownloadManager {\n private downloads: {[fileName: string]: {main: Download} & {[type in DownloadType]?: Download}} = {};\n // private downloadsToDisc: {[fileName: string]: Download} = {};\n private progress: {[fileName: string]: Progress} = {};\n // private progressCallbacks: {[fileName: string]: Array} = {};\n private managers: AppManagers;\n\n public construct(managers: AppManagers) {\n this.managers = managers;\n rootScope.addEventListener('download_progress', (details) => {\n // const callbacks = this.progressCallbacks[details.fileName];\n // if(callbacks) {\n // callbacks.forEach((callback) => callback(details));\n // }\n\n const download = this.downloads[details.fileName];\n if(download?.main?.notifyAll) {\n this.progress[details.fileName] = details;\n download.main.notifyAll(details);\n }\n });\n }\n\n private getNewDeferred(fileName: string, type?: DownloadType) {\n const deferred = deferredPromise();\n\n let download = this.downloads[fileName];\n if(!download) {\n download = this.downloads[fileName] = {\n main: deferred as any\n };\n\n deferred.cancel = () => {\n const error = makeError('DOWNLOAD_CANCELED');\n\n this.managers.apiFileManager.cancelDownload(fileName);\n\n deferred.reject(error);\n deferred.cancel = noop;\n };\n\n deferred.catch(() => {\n this.clearDownload(fileName, type);\n }).finally(() => {\n delete this.progress[fileName];\n // delete this.progressCallbacks[fileName];\n });\n } else {\n const main = download.main;\n (['cancel', 'addNotifyListener', 'notify', 'notifyAll'] as (keyof CancellablePromise)[]).forEach((key) => {\n if(!main[key]) {\n return;\n }\n\n // @ts-ignore\n deferred[key] = main[key].bind(main);\n });\n }\n\n const haveToClear = type === 'disc';\n if(haveToClear) {\n deferred.catch(noop).finally(() => {\n this.clearDownload(fileName, type);\n });\n }\n\n return download[type] = deferred as any;\n }\n\n public getNewDeferredForUpload>(fileName: string, promise: T) {\n const deferred = this.getNewDeferred(fileName);\n promise.then(deferred.resolve, deferred.reject);\n\n deferred.finally(() => {\n this.clearDownload(fileName);\n });\n\n return deferred as CancellablePromise>;\n }\n\n private clearDownload(fileName: string, type?: DownloadType) {\n const downloads = this.downloads[fileName];\n if(!downloads) {\n return;\n }\n\n delete downloads[type];\n\n const length = Object.keys(downloads).length;\n if(!length || (downloads.main && length === 1)) {\n delete this.downloads[fileName];\n }\n }\n\n public getUpload(fileName: string): ReturnType['promise'] {\n let deferred: CancellablePromise = this.getDownload(fileName);\n if(deferred) {\n return deferred;\n }\n\n deferred = this.getNewDeferred(fileName);\n this.managers.appMessagesManager.getUploadPromise(fileName).then(deferred.resolve, deferred.reject);\n return deferred;\n }\n\n /* public fakeDownload(fileName: string, value: Blob | string) {\n const deferred = this.getNewDeferred(fileName);\n if(typeof(value) === 'string') {\n fetch(value)\n .then((response) => response.blob())\n .then((blob) => deferred.resolve(blob));\n } else {\n deferred.resolve(value);\n }\n\n return deferred;\n } */\n\n private d(fileName: string, getPromise: () => Promise, type?: DownloadType) {\n let deferred = this.getDownload(fileName, type);\n if(deferred) return deferred;\n\n deferred = this.getNewDeferred(fileName, type);\n getPromise().then(deferred.resolve, deferred.reject);\n return deferred;\n }\n\n public download(options: DownloadOptions): DownloadBlob {\n const fileName = getDownloadFileNameFromOptions(options);\n return this.d(fileName, () => this.managers.apiFileManager.download(options), 'blob') as any;\n }\n\n public downloadMedia(options: DownloadMediaOptions, type: DownloadType = 'blob', promiseBefore?: Promise): DownloadBlob {\n const {downloadOptions, fileName} = getDownloadMediaDetails(options);\n\n return this.d(fileName, () => {\n let cb: any;\n if(type === 'url') {\n cb = this.managers.apiFileManager.downloadMediaURL;\n } else if(type === 'void'/* || type === 'disc' */) {\n cb = this.managers.apiFileManager.downloadMediaVoid;\n } else /* if(type === 'blob') */ {\n cb = this.managers.apiFileManager.downloadMedia;\n }\n\n if(promiseBefore) {\n return promiseBefore.then(() => cb(options));\n }\n\n return cb(options);\n }, type) as any;\n }\n\n public downloadMediaURL(options: DownloadMediaOptions): DownloadUrl {\n return this.downloadMedia(options, 'url') as any;\n }\n\n public downloadMediaVoid(options: DownloadMediaOptions): DownloadBlob {\n return this.downloadMedia(options, 'void');\n }\n\n public upload(file: File | Blob, fileName?: string, promise?: Promise) {\n if(!fileName) {\n fileName = getFileNameForUpload(file);\n }\n\n if(!promise) {\n promise = this.managers.apiFileManager.upload({file, fileName});\n }\n\n const deferred = this.getNewDeferredForUpload(fileName, promise);\n return deferred as any as CancellablePromise;\n }\n\n public getDownload(fileName: string, type?: DownloadType) {\n const d = this.downloads[fileName];\n return d && d[type];\n }\n\n // public addProgressCallback(fileName: string, callback: ProgressCallback) {\n // const progress = this.progress[fileName];\n // (this.progressCallbacks[fileName] ?? (this.progressCallbacks[fileName] = [])).push(callback);\n\n // if(progress) {\n // callback(progress);\n // }\n // }\n\n public downloadToDisc(options: DownloadMediaOptions, justAttach?: boolean) {\n const media = options.media;\n const isDocument = media._ === 'document';\n if(!isDocument && !options.thumb) {\n options.thumb = (media as Photo.photo).sizes.slice().pop() as PhotoSize.photoSize;\n }\n\n // const {fileName: cacheFileName} = getDownloadMediaDetails(options);\n // if(justAttach) {\n // const promise = this.downloadsToDisc[cacheFileName];\n // if(promise) {\n // return promise;\n // }\n // }\n\n // const {downloadOptions, fileName} = getDownloadMediaDetails(options);\n // if(downloadOptions.size && downloadOptions.size > MAX_FILE_SAVE_SIZE) {\n const id = '' + (Math.random() * 0x7FFFFFFF | 0);\n // const id = 'test';\n const url = `download/${id}`;\n options.downloadId = id;\n\n const pingPromise = apiManagerProxy.pingServiceWorkerWithIframe();\n\n const promise = this.downloadMedia(options, 'disc', pingPromise);\n // this.downloadsToDisc[cacheFileName] = promise;\n\n if(justAttach) {\n return promise;\n }\n\n const iframe = document.createElement('iframe');\n iframe.hidden = true;\n\n pingPromise.then(() => {\n iframe.src = url;\n document.body.append(iframe);\n });\n\n // createDownloadAnchor(url, 'asd.txt');\n\n // const events = [\n // 'emptied',\n // 'abort',\n // 'suspend',\n // 'reset',\n // 'error',\n // 'ended',\n // 'load'\n // ].forEach((event) => {\n // iframe.addEventListener(event, () => alert(event));\n // iframe.contentWindow.addEventListener(event, () => alert(event));\n // });\n\n let element: HTMLElement, hadProgress = false;\n const onProgress = () => {\n if(hadProgress) {\n return;\n }\n\n hadProgress = true;\n element = iframe;\n\n indexOfAndSplice(promise.listeners, onProgress);\n };\n\n promise.addNotifyListener(onProgress);\n promise.then((blob) => {\n if(!blob) {\n return;\n }\n\n const url = URL.createObjectURL(blob);\n const downloadOptions = isDocument ?\n getDocumentDownloadOptions(media) :\n getPhotoDownloadOptions(media as any, options.thumb as PhotoSize.photoSize);\n const fileName = (options.media as MyDocument).file_name || getFileNameByLocation(downloadOptions.location);\n createDownloadAnchor(url, downloadOptions.fileName || fileName, () => {\n URL.revokeObjectURL(url);\n });\n }).catch(noop).finally(() => {\n if(!hadProgress) {\n onProgress();\n }\n\n setTimeout(() => {\n element?.remove();\n }, 1000);\n\n // if(this.downloadsToDisc[cacheFileName] === promise) {\n // delete this.downloadsToDisc[cacheFileName];\n // }\n });\n\n return promise;\n }\n}\n\nconst appDownloadManager = new AppDownloadManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appDownloadManager = appDownloadManager);\nexport default appDownloadManager;\n","/*\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 createDownloadAnchor(url: string, fileName: string, onRemove?: () => void) {\n const a = document.createElement('a');\n a.href = url;\n a.download = fileName;\n a.target = '_blank';\n\n a.style.position = 'absolute';\n a.style.top = '1px';\n a.style.left = '1px';\n\n document.body.append(a);\n\n try {\n const clickEvent = document.createEvent('MouseEvents');\n clickEvent.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\n a.dispatchEvent(clickEvent);\n } catch(e) {\n console.error('Download click error', e);\n try {\n a.click();\n } catch(e) {\n window.open(url as string, '_blank');\n }\n }\n\n setTimeout(() => {\n a.remove();\n onRemove && onRemove();\n }, 100);\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 partition(arr: T[], callback: (item: T, idx: number, arr: T[]) => boolean) {\n const good: T[] = [], bad: T[] = [];\n for(let i = 0, length = arr.length; i < length; ++i) {\n const item = arr[i];\n (callback(item, i, arr) ? good : bad).push(item);\n }\n\n return [good, bad];\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// import { generatePathData } from \"../../helpers/dom\";\nimport {MyMessage} from '../../lib/appManagers/appMessagesManager';\nimport type Chat from './chat';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport insertInDescendSortedArray from '../../helpers/array/insertInDescendSortedArray';\nimport positionElementByIndex from '../../helpers/dom/positionElementByIndex';\nimport AvatarElement from '../avatar';\nimport {Message} from '../../layer';\nimport {NULL_PEER_ID, REPLIES_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport {SERVICE_AS_REGULAR, STICKY_OFFSET} from './bubbles';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport partition from '../../helpers/array/partition';\nimport noop from '../../helpers/noop';\nimport getMessageThreadId from '../../lib/appManagers/utils/messages/getMessageThreadId';\n\ntype GroupItem = {\n bubble: HTMLElement,\n fromId: PeerId,\n mid: number,\n groupMid?: number,\n timestamp: number,\n dateTimestamp: number,\n mounted: boolean,\n single: boolean,\n group?: BubbleGroup,\n message: Message.message | Message.messageService // use it only to set avatar\n};\n\nclass BubbleGroup {\n container: HTMLElement;\n chat: Chat;\n groups: BubbleGroups;\n items: GroupItem[]; // descend sorted\n avatarContainer: HTMLElement;\n avatarLoadPromise: ReturnType;\n avatar: AvatarElement;\n mounted: boolean;\n dateTimestamp: number;\n offset: number;\n\n constructor(chat: Chat, groups: BubbleGroups, dateTimestamp: number) {\n this.container = document.createElement('div');\n this.container.classList.add('bubbles-group');\n this.chat = chat;\n this.groups = groups;\n this.items = [];\n this.dateTimestamp = dateTimestamp;\n this.offset = 0;\n }\n\n createAvatar(message: Message.message | Message.messageService) {\n if(this.avatarLoadPromise) {\n return this.avatarLoadPromise;\n } else if(message._ === 'messageService') {\n return;\n }\n\n this.avatarContainer = document.createElement('div');\n this.avatarContainer.classList.add('bubbles-group-avatar-container');\n ++this.offset;\n\n const fwdFrom = message.fwd_from;\n const fwdFromId = message.fwdFromId;\n const isForwardFromChannel = message.from_id && message.from_id._ === 'peerChannel' && message.fromId === fwdFromId;\n const currentPeerId = this.chat.peerId;\n const avatar = this.avatar = new AvatarElement();\n this.avatar.classList.add('bubbles-group-avatar', 'user-avatar', 'avatar-40'/* , 'can-zoom-fade' */);\n const peerId = ((fwdFrom && (currentPeerId === rootScope.myId || currentPeerId === REPLIES_PEER_ID)) || isForwardFromChannel ? fwdFromId : message.fromId) || NULL_PEER_ID;\n const avatarLoadPromise = this.avatar.updateWithOptions({\n lazyLoadQueue: this.chat.bubbles.lazyLoadQueue,\n peerId,\n peerTitle: !fwdFromId && fwdFrom && fwdFrom.from_name ? /* '๐Ÿ”ฅ FF ๐Ÿ”ฅ' */fwdFrom.from_name : undefined\n });\n\n // this.avatarLoadPromise = Promise.all([\n // avatarLoadPromise,\n // peerId && peerId.isUser() ? this.chat.managers.appUsersManager.getUser(peerId.toUserId()) : undefined\n // ]).then(([result, user]) => {\n // if(user?.pFlags?.premium) {\n // avatar.classList.add('is-premium', 'tgico-star');\n // }\n\n // return result;\n // });\n this.avatarLoadPromise = avatarLoadPromise;\n\n this.avatarContainer.append(this.avatar);\n this.container.append(this.avatarContainer);\n\n return this.avatarLoadPromise;\n }\n\n get firstTimestamp() {\n return this.firstItem.timestamp;\n }\n\n get firstMid() {\n return this.firstItem.mid;\n }\n\n get firstItem() {\n return this.items[this.items.length - 1];\n }\n\n get lastTimestamp() {\n return this.lastItem.timestamp;\n }\n\n get lastMid() {\n return this.lastItem.mid;\n }\n\n get lastItem() {\n return this.items[0];\n }\n\n updateClassNames() {\n const items = this.items;\n const length = items.length;\n if(!length) {\n return;\n }\n\n // const elements = Array.from(this.container.children);\n // if(this.offset) elements.splice(0, this.offset);\n\n // const length = elements.length;\n // if(!length) {\n // return;\n // }\n\n const first = items[length - 1].bubble;\n\n if(items.length === 1) {\n first.classList.add('is-group-first', 'is-group-last');\n // this.setClipIfNeeded(first);\n return;\n } else {\n first.classList.remove('is-group-last');\n first.classList.add('is-group-first');\n // this.setClipIfNeeded(first, true);\n }\n\n for(let i = 1, _length = length - 1; i < _length; ++i) {\n const bubble = items[i].bubble;\n bubble.classList.remove('is-group-last', 'is-group-first');\n // this.setClipIfNeeded(bubble, true);\n }\n\n const last = items[0].bubble;\n last.classList.remove('is-group-first');\n last.classList.add('is-group-last');\n // this.setClipIfNeeded(last);\n }\n\n insertItem(item: GroupItem) {\n const {items} = this;\n insertInDescendSortedArray(items, item, this.groups.sortGroupItemsKey);\n\n item.group = this;\n if(items.length === 1) {\n this.groups.insertGroup(this);\n }\n }\n\n removeItem(item: GroupItem) {\n indexOfAndSplice(this.items, item);\n\n if(!this.items.length) {\n indexOfAndSplice(this.groups.groups, this);\n }\n\n item.group = undefined;\n }\n\n mount(updateClassNames?: boolean) {\n if(!this.groups.groups.includes(this) || !this.items.length) { // group can be already removed\n debugger;\n\n if(this.mounted) {\n this.onItemUnmount();\n }\n\n return;\n }\n\n const {offset, items} = this;\n const {length} = items;\n forEachReverse(items, (item, idx) => {\n this.mountItem(item, length - 1 - idx, offset);\n });\n\n if(updateClassNames) {\n this.updateClassNames();\n }\n\n this.onItemMount();\n }\n\n mountItem(item: GroupItem, idx = this.items.indexOf(item), offset = this.offset) {\n if(item.mounted) {\n return;\n }\n\n positionElementByIndex(item.bubble, this.container, offset + idx);\n item.mounted = true;\n }\n\n unmountItem(item: GroupItem) {\n if(!item.mounted) {\n return;\n }\n\n item.bubble.remove();\n item.mounted = false;\n this.onItemUnmount();\n }\n\n onItemMount() {\n if(this.mounted) {\n return;\n }\n\n const dateContainer = this.chat.bubbles.getDateContainerByTimestamp(this.dateTimestamp / 1000);\n // const idx = this.groups.indexOf(group);\n const dateGroups = this.groups.groups.filter((_group) => _group.dateTimestamp === this.dateTimestamp);\n const dateGroupsLength = dateGroups.length;\n const idx = dateGroups.indexOf(this);\n const unmountedLength = dateGroups.slice(idx + 1).reduce((acc, v) => acc + (v.mounted ? 0 : 1), 0);\n positionElementByIndex(this.container, dateContainer.container, STICKY_OFFSET + dateGroupsLength - 1 - idx - unmountedLength);\n this.mounted = true;\n }\n\n onItemUnmount() {\n if(!this.mounted) {\n return;\n }\n\n if(!this.items.length) {\n this.container.remove();\n this.chat.bubbles.deleteEmptyDateGroups();\n this.mounted = false;\n } else {\n this.updateClassNames();\n }\n }\n}\n\n// class BubbleGroupItem implements GroupItem {\n// bubble: HTMLElement;\n// fromId: PeerId;\n// mid: number;\n// timestamp: number;\n// dateTimestamp: number;\n// mounted: boolean;\n// single: boolean;\n// group: BubbleGroup;\n\n// constructor(details: GroupItem) {\n// Object.assign(this, details);\n// }\n// }\n\nexport default class BubbleGroups {\n public itemsArr: Array = []; // descend sorted\n private itemsMap: Map = new Map();\n public groups: Array = []; // descend sorted\n private newGroupDiff = 121; // * 121 in scheduled messages\n private sortItemsKey: Extract;\n private sortGroupsKey: Extract;\n public sortGroupItemsKey: Extract;\n\n constructor(private chat: Chat) {\n this.sortItemsKey = chat.type === 'scheduled' ? 'timestamp' : 'mid';\n this.sortGroupsKey = chat.type === 'scheduled' ? 'lastTimestamp' : 'lastMid';\n this.sortGroupItemsKey = /* chat.type === 'scheduled' ? 'timestamp' : */'groupMid';\n }\n\n removeItem(item: GroupItem) {\n item.group?.removeItem(item);\n this.removeItemFromCache(item);\n }\n\n removeAndUnmountBubble(bubble: HTMLElement) {\n const item = this.getItemByBubble(bubble);\n if(!item) {\n if(bubble.parentElement) {\n bubble.remove(); // * can be a placeholder\n }\n\n return false;\n }\n\n const items = this.itemsArr;\n const index = items.indexOf(item);\n const siblings = this.getSiblingsAtIndex(index, items);\n\n const group = item.group;\n this.removeItem(item);\n\n const modifiedGroups: Set = new Set();\n if(group) {\n group.unmountItem(item);\n modifiedGroups.add(group);\n }\n\n const [previousSibling, nextSibling] = siblings;\n if(\n previousSibling &&\n nextSibling &&\n this.canItemsBeGrouped(previousSibling, nextSibling) &&\n previousSibling.group !== nextSibling.group\n ) {\n const group = nextSibling.group;\n this.f(nextSibling.group.items);\n group.onItemUnmount();\n modifiedGroups.add(previousSibling.group);\n this.groupUngrouped();\n }\n\n this.mountUnmountGroups(Array.from(modifiedGroups));\n\n return true;\n }\n\n mountUnmountGroups(groups: BubbleGroup[]) {\n // groups.sort((a, b) => (b.lastItem?.mid ?? 0) - (a.lastItem?.mid ?? 0));\n\n const [toMount, toUnmount] = partition(groups, (group) => !!group.items.length);\n toUnmount.forEach((group) => {\n group.onItemUnmount();\n })\n\n toMount.forEach((group) => {\n group.mount(true);\n });\n\n // toMount.forEach((group) => {\n // group.updateClassNames();\n // });\n }\n\n f(items: GroupItem[], index: number = 0, length = items.length) {\n for(; index < length; ++index) {\n const item = items[index];\n item.mounted = false;\n item.group.removeItem(item);\n --length;\n --index;\n }\n }\n\n getItemByBubble(bubble: HTMLElement) {\n return this.itemsMap.get(bubble);\n }\n\n getLastGroup() {\n return this.groups[0];\n }\n\n changeBubbleMid(bubble: HTMLElement, mid: number) {\n const item = this.getItemByBubble(bubble);\n if(!item) {\n return;\n }\n\n item.mid = mid;\n\n // indexOfAndSplice(item.group.items, item);\n // // const canChangeGroupMid = !item.group.items.length || item.group.items.every((item) => item.groupMid === item.mid);\n // // if(canChangeGroupMid) item.groupMid = mid;\n // item.group.insertItem(item);\n\n indexOfAndSplice(this.itemsArr, item);\n this.insertItemToArray(item, this.itemsArr);\n }\n\n changeItemBubble(item: GroupItem, bubble: HTMLElement) {\n this.itemsMap.delete(item.bubble);\n item.bubble = bubble;\n this.itemsMap.set(bubble, item);\n }\n\n changeBubbleByBubble(from: HTMLElement, to: HTMLElement) {\n const item = this.getItemByBubble(from);\n if(!item) {\n return;\n }\n\n this.changeItemBubble(item, to);\n }\n\n canItemsBeGrouped(item1: GroupItem, item2: GroupItem) {\n return item2.fromId === item1.fromId &&\n Math.abs(item2.timestamp - item1.timestamp) <= this.newGroupDiff &&\n item1.dateTimestamp === item2.dateTimestamp &&\n !item1.single &&\n !item2.single &&\n item1.message.pFlags.out === item2.message.pFlags.out &&\n (!this.chat.isAllMessagesForum || getMessageThreadId(item1.message, true) === getMessageThreadId(item2.message, true)) &&\n (!item1.message.pFlags.out || item1.message.fromId === rootScope.myId);\n }\n\n getSiblingsAtIndex(itemIndex: number, items: GroupItem[]) {\n return [items[itemIndex - 1], items[itemIndex + 1]] as const;\n }\n\n // findGroupSiblingInSiblings(item: GroupItem, siblings: ReturnType) {\n // return siblings.find((sibling) => sibling && this.canItemsBeGrouped(item, sibling));\n // }\n\n findGroupSiblingByItem(item: GroupItem, items: GroupItem[]) {\n items = items.slice();\n const idx = this.insertItemToArray(item, items);\n // return this.findGroupSiblingInSiblings(item, this.getSiblingsAtIndex(idx, items));\n return this.findGroupSiblingInItems(item, items, idx);\n }\n\n findGroupSiblingInItems(item: GroupItem, items: GroupItem[], index = items.indexOf(item), length = items.length) {\n const previousItem = items[index - 1];\n let siblingGroupedItem: GroupItem;\n if(previousItem?.group && this.canItemsBeGrouped(item, previousItem)) {\n siblingGroupedItem = previousItem;\n } else {\n for(let k = index + 1; k < length; ++k) {\n const nextItem = items[k];\n if(this.canItemsBeGrouped(item, nextItem)) {\n if(nextItem.group) {\n siblingGroupedItem = nextItem;\n }\n } else {\n break;\n }\n }\n }\n\n return siblingGroupedItem;\n }\n\n addItemToGroup(item: GroupItem, group: BubbleGroup) {\n group.insertItem(item);\n this.addItemToCache(item);\n }\n\n insertItemToArray(item: GroupItem, array: GroupItem[]) {\n return insertInDescendSortedArray(array, item, this.sortItemsKey);\n }\n\n insertGroup(group: BubbleGroup) {\n return insertInDescendSortedArray(this.groups, group, this.sortGroupsKey);\n }\n\n addItemToCache(item: GroupItem) {\n this.insertItemToArray(item, this.itemsArr);\n this.itemsMap.set(item.bubble, item);\n }\n\n removeItemFromCache(item: GroupItem) {\n indexOfAndSplice(this.itemsArr, item);\n this.itemsMap.delete(item.bubble);\n }\n\n getMessageFromId(message: MyMessage) {\n let fromId = /* (this.chat.peerId.isAnyChat() && message.viaBotId) || */message.fromId;\n\n // fix for saved messages forward to self\n if(fromId === rootScope.myId && message.peerId === rootScope.myId && (message as Message.message).fwdFromId === fromId) {\n fromId = fromId.toPeerId(true);\n }\n\n return fromId;\n }\n\n createItem(bubble: HTMLElement, message: MyMessage) {\n const single = !(message._ === 'message' || (message.action && SERVICE_AS_REGULAR.has(message.action._)));\n const {mid, date: timestamp} = message;\n const {dateTimestamp} = this.chat.bubbles.getDateForDateContainer(timestamp);\n const item: GroupItem = {\n mid,\n groupMid: this.chat.type === 'scheduled' ? +`${(timestamp * 1000 - dateTimestamp) / 1000}.${mid}` : mid,\n fromId: this.getMessageFromId(message),\n bubble,\n // timestamp: this.chat.type === 'scheduled' ? +`${(timestamp * 1000 - dateTimestamp) / 1000}.${mid}` : timestamp,\n timestamp,\n dateTimestamp,\n mounted: false,\n single,\n message\n };\n\n return item;\n }\n\n splitSiblingsOnGrouping(siblings: ReturnType) {\n const [previousSibling, nextSibling] = siblings;\n const previousGroup = previousSibling?.group;\n const nextGroup = nextSibling?.group;\n\n if(!previousGroup) {\n return;\n }\n\n // will refresh group\n // if(previousGroup === nextGroup) {\n const items = previousGroup.items;\n const index = items.indexOf(previousSibling) + 1;\n const length = items.length;\n if(index === length) {\n return;\n }\n\n const modifiedGroups: BubbleGroup[] = [previousGroup];\n // if(previousGroup !== nextGroup && nextGroup) {\n // modifiedGroups.push(nextGroup);\n // }\n\n this.f(items, index, length);\n return modifiedGroups;\n // }\n }\n\n prepareForGrouping(bubble: HTMLElement, message: MyMessage) {\n const foundItem = this.getItemByBubble(bubble);\n if(foundItem) { // should happen only on edit\n // debugger;\n return;\n }\n\n const item = this.createItem(bubble, message);\n this.addItemToCache(item);\n }\n\n groupUngrouped() {\n const items = this.itemsArr;\n const length = items.length;\n const modifiedGroups: Set = new Set();\n // for(let i = length - 1; i >= 0; --i) {\n for(let i = 0; i < length; ++i) {\n const item = items[i];\n if(item.group) {\n continue;\n }\n\n let hadGroup = true;\n const siblings = this.getSiblingsAtIndex(i, items);\n const siblingGroupedItem = this.findGroupSiblingInItems(item, items, i, length);\n\n // const foundItem = this.findGroupSiblingInSiblings(item, siblings);\n const foundItem = siblingGroupedItem;\n const group = foundItem?.group ?? (hadGroup = false, new BubbleGroup(this.chat, this, item.dateTimestamp));\n\n modifiedGroups.add(group);\n group.insertItem(item);\n\n if(!hadGroup) {\n const splittedGroups = this.splitSiblingsOnGrouping(siblings);\n if(splittedGroups) {\n splittedGroups.forEach((group) => modifiedGroups.add(group));\n }\n }\n }\n\n return modifiedGroups;\n }\n\n // addBubble(bubble: HTMLElement, message: MyMessage, unmountIfFound?: boolean) {\n // const oldItem = this.getItemByBubble(bubble);\n // if(unmountIfFound) { // updating position\n // this.removeAndUnmountBubble(bubble);\n // } else if(oldItem) { // editing\n // const group = oldItem.group;\n // this.changeItemBubble(oldItem, bubble);\n // oldItem.mounted = false;\n\n // return {item: oldItem, group};\n // }\n\n // const item = this.createItem(bubble, message);\n\n // const foundItem = this.findSameGroupItem(item, this.itemsArr);\n\n // const group = foundItem?.group ?? new BubbleGroup(this.chat, this, item.dateTimestamp);\n // this.addItemToGroup(item, group);\n\n // return {item, group};\n // }\n\n /* setClipIfNeeded(bubble: HTMLDivElement, remove = false) {\n //console.log('setClipIfNeeded', bubble, remove);\n const className = bubble.className;\n if(className.includes('is-message-empty') && (className.includes('photo') || className.includes('video'))) {\n let container = bubble.querySelector('.bubble__media-container') as SVGSVGElement;\n //console.log('setClipIfNeeded', bubble, remove, container);\n if(!container) return;\n\n try {\n Array.from(container.children).forEach((object) => {\n if(object instanceof SVGDefsElement) return;\n\n if(remove) {\n object.removeAttributeNS(null, 'clip-path');\n } else {\n let clipId = container.dataset.clipId;\n let path = container.firstElementChild.firstElementChild.lastElementChild as SVGPathElement;\n let width = +object.getAttributeNS(null, 'width');\n let height = +object.getAttributeNS(null, 'height');\n let isOut = className.includes('is-out');\n let isReply = className.includes('is-reply');\n let d = '';\n\n //console.log('setClipIfNeeded', object, width, height, isOut);\n\n let tr: number, tl: number;\n if(className.includes('forwarded') || isReply) {\n tr = tl = 0;\n } else if(isOut) {\n tr = className.includes('is-group-first') ? 12 : 6;\n tl = 12;\n } else {\n tr = 12;\n tl = className.includes('is-group-first') ? 12 : 6;\n }\n\n if(isOut) {\n d = generatePathData(0, 0, width - 9, height, tl, tr, 0, 12);\n } else {\n d = generatePathData(9, 0, width - 9, height, tl, tr, 12, 0);\n }\n\n path.setAttributeNS(null, 'd', d);\n object.setAttributeNS(null, 'clip-path', 'url(#' + clipId + ')');\n }\n });\n } catch(err) {}\n }\n } */\n\n // updateGroupByMessageId(mid: number) {\n // const item = this.itemsArr.find((g) => g.mid === mid);\n // if(item) {\n // item.group.updateGroup();\n // }\n // }\n\n cleanup() {\n this.itemsArr = [];\n this.groups = [];\n this.itemsMap.clear();\n }\n\n // findIncorrentPositions() {\n // var bubbles = Array.from(this.chat.bubbles.chatInner.querySelectorAll('.bubbles-group .bubble')).reverse();\n // var items = this.itemsArr;\n // for(var i = 0, length = items.length; i < length; ++i) {\n // const item = items[i];\n // const foundBubble = bubbles[i];\n // if(item.bubble !== foundBubble) {\n // console.log('incorrect position', i, item, foundBubble);\n // // debugger;\n // // break;\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 PopupElement, {PopupOptions} from '.';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport I18n, {FormatterArguments, i18n, LangPackKey} from '../../lib/langPack';\nimport InputField from '../inputField';\n\nexport default class PopupDatePicker extends PopupElement {\n protected controlsDiv: HTMLElement;\n protected monthTitle: HTMLElement;\n protected prevBtn: HTMLElement;\n protected nextBtn: HTMLElement;\n\n protected monthsContainer: HTMLElement;\n protected month: HTMLElement;\n\n protected minMonth: Date;\n protected maxMonth: Date;\n protected minDate: Date;\n protected maxDate: Date;\n protected selectedDate: Date;\n protected selectedMonth: Date;\n protected selectedEl: HTMLElement;\n\n protected timeDiv: HTMLDivElement;\n protected hoursInputField: InputField;\n protected minutesInputField: InputField;\n\n constructor(initDate: Date, public onPick: (timestamp: number) => void, protected options: Partial<{\n noButtons: true,\n noTitle: true,\n minDate: Date,\n maxDate: Date\n withTime: true,\n showOverflowMonths: true\n }> & PopupOptions = {}) {\n super('popup-date-picker', {\n body: true,\n overlayClosable: true,\n buttons: options.noButtons ? [] : [{\n langKey: 'JumpToDate',\n callback: () => {\n if(this.onPick) {\n this.onPick(this.selectedDate.getTime() / 1000 | 0);\n }\n }\n }, {\n langKey: 'Cancel',\n isCancel: true\n }],\n title: true,\n ...options\n });\n\n this.minDate = options.minDate || new Date('2013-08-01T00:00:00');\n\n if(initDate < this.minDate) {\n initDate.setFullYear(this.minDate.getFullYear(), this.minDate.getMonth(), this.minDate.getDate());\n }\n\n // Controls\n this.controlsDiv = document.createElement('div');\n this.controlsDiv.classList.add('date-picker-controls');\n\n this.prevBtn = document.createElement('button');\n this.prevBtn.classList.add('btn-icon', 'tgico-down', 'date-picker-prev');\n attachClickEvent(this.prevBtn, this.onPrevClick, {listenerSetter: this.listenerSetter});\n\n this.nextBtn = document.createElement('button');\n this.nextBtn.classList.add('btn-icon', 'tgico-down', 'date-picker-next');\n attachClickEvent(this.nextBtn, this.onNextClick, {listenerSetter: this.listenerSetter});\n\n this.monthTitle = document.createElement('div');\n this.monthTitle.classList.add('date-picker-month-title');\n\n this.controlsDiv.append(this.prevBtn, this.monthTitle, this.nextBtn);\n\n // Month\n this.monthsContainer = document.createElement('div');\n this.monthsContainer.classList.add('date-picker-months');\n attachClickEvent(this.monthsContainer, this.onDateClick, {listenerSetter: this.listenerSetter});\n\n this.body.append(this.controlsDiv, this.monthsContainer);\n\n // Time inputs\n if(options.withTime) {\n this.timeDiv = document.createElement('div');\n this.timeDiv.classList.add('date-picker-time');\n\n const delimiter = document.createElement('div');\n delimiter.classList.add('date-picker-time-delimiter');\n delimiter.append(':');\n\n const handleTimeInput = (max: number, inputField: InputField, onInput: (length: number) => void, onOverflow?: (number: number) => void) => {\n const maxString = '' + max;\n this.listenerSetter.add(inputField.input)('input', (e) => {\n let value = inputField.value.replace(/\\D/g, '');\n if(value.length > 2) {\n value = value.slice(0, 2);\n } else {\n if((value.length === 1 && +value[0] > +maxString[0]) || (value.length === 2 && +value > max)) {\n if(value.length === 2 && onOverflow) {\n onOverflow(+value[1]);\n }\n\n value = '0' + value[0];\n }\n }\n\n inputField.setValueSilently(value);\n onInput(value.length);\n });\n };\n\n this.hoursInputField = new InputField({plainText: true});\n this.minutesInputField = new InputField({plainText: true});\n\n handleTimeInput(23, this.hoursInputField, (length) => {\n if(length === 2) {\n this.minutesInputField.input.focus();\n }\n\n this.setTimeTitle();\n }, (number) => {\n this.minutesInputField.value = (number + this.minutesInputField.value).slice(0, 2);\n });\n handleTimeInput(59, this.minutesInputField, (length) => {\n if(!length) {\n this.hoursInputField.input.focus();\n }\n\n this.setTimeTitle();\n });\n\n this.selectedDate = initDate;\n\n initDate.setMinutes(initDate.getMinutes() + 10);\n\n this.hoursInputField.setValueSilently(('0' + initDate.getHours()).slice(-2));\n this.minutesInputField.setValueSilently(('0' + initDate.getMinutes()).slice(-2));\n\n initDate.setHours(0, 0, 0, 0);\n\n this.timeDiv.append(this.hoursInputField.container, delimiter, this.minutesInputField.container);\n\n attachClickEvent(this.btnConfirm, () => {\n if(this.onPick) {\n this.selectedDate.setHours(+this.hoursInputField.value || 0, +this.minutesInputField.value || 0, 0, 0);\n this.onPick(this.selectedDate.getTime() / 1000 | 0);\n }\n\n this.hide();\n }, {listenerSetter: this.listenerSetter});\n\n this.body.append(this.timeDiv);\n\n this.prevBtn.classList.add('primary');\n this.nextBtn.classList.add('primary');\n }\n\n const popupCenterer = document.createElement('div');\n popupCenterer.classList.add('popup-centerer');\n popupCenterer.append(this.container);\n this.element.append(popupCenterer);\n\n // const passed = (initDate.getTime() - (initDate.getTimezoneOffset() * 60000)) % 86400000;\n // this.selectedDate = this.maxDate = new Date(initDate.getTime() - passed);\n initDate.setHours(0, 0, 0, 0);\n this.selectedDate = initDate;\n\n this.maxDate = options.maxDate || new Date();\n this.maxDate.setHours(0, 0, 0, 0);\n\n this.selectedMonth = new Date(this.selectedDate);\n this.selectedMonth.setDate(1);\n\n this.maxMonth = new Date(this.maxDate);\n this.maxMonth.setDate(1);\n\n this.minMonth = new Date(this.minDate);\n this.minMonth.setHours(0, 0, 0, 0);\n this.minMonth.setDate(1);\n\n if(this.selectedMonth.getTime() === this.minMonth.getTime()) {\n this.prevBtn.setAttribute('disabled', 'true');\n }\n\n if(this.selectedMonth.getTime() === this.maxMonth.getTime()) {\n this.nextBtn.setAttribute('disabled', 'true');\n }\n\n if(options.noTitle) {\n this.setTitle = () => {};\n }\n\n this.setTimeTitle();\n this.setTitle();\n this.setMonth();\n }\n\n onPrevClick = (e: MouseEvent) => {\n this.selectedMonth.setMonth(this.selectedMonth.getMonth() - 1);\n this.setMonth();\n\n if(this.selectedMonth.getTime() === this.minMonth.getTime()) {\n this.prevBtn.setAttribute('disabled', 'true');\n }\n\n this.nextBtn.removeAttribute('disabled');\n };\n\n onNextClick = (e: MouseEvent) => {\n this.selectedMonth.setMonth(this.selectedMonth.getMonth() + 1);\n this.setMonth();\n\n if(this.selectedMonth.getTime() === this.maxMonth.getTime()) {\n this.nextBtn.setAttribute('disabled', 'true');\n }\n\n this.prevBtn.removeAttribute('disabled');\n };\n\n onDateClick = (e: MouseEvent) => {\n // cancelEvent(e);\n const target = e.target as HTMLElement;\n\n if(!target.dataset.timestamp) return;\n\n if(this.selectedEl) {\n if(this.selectedEl === target) return;\n this.selectedEl.classList.remove('active');\n }\n\n this.selectedEl = target;\n\n target.classList.add('active');\n const timestamp = +target.dataset.timestamp;\n\n this.selectedDate = new Date(timestamp);\n\n this.setTitle();\n this.setTimeTitle();\n };\n\n public setTimeTitle() {\n if(this.btnConfirm && this.selectedDate) {\n let key: LangPackKey;\n const args: FormatterArguments = [];\n const date = new Date();\n date.setHours(0, 0, 0, 0);\n\n const timeOptions: Intl.DateTimeFormatOptions = {\n minute: '2-digit',\n hour: '2-digit'\n };\n\n const sendDate = new Date(this.selectedDate.getTime());\n sendDate.setHours(+this.hoursInputField.value, +this.minutesInputField.value);\n\n if(this.selectedDate.getTime() === date.getTime()) {\n key = 'Schedule.SendToday';\n }/* else if(this.selectedDate.getTime() === (date.getTime() + 86400e3)) {\n dayStr = 'Tomorrow';\n } */ else {\n key = 'Schedule.SendDate';\n\n const dateOptions: Intl.DateTimeFormatOptions = {\n month: 'short',\n day: 'numeric'\n };\n\n if(sendDate.getFullYear() !== date.getFullYear()) {\n dateOptions.year = 'numeric';\n }\n\n args.push(new I18n.IntlDateElement({\n date: sendDate,\n options: dateOptions\n }).element);\n }\n\n args.push(new I18n.IntlDateElement({\n date: sendDate,\n options: timeOptions\n }).element);\n\n this.btnConfirm.firstChild.replaceWith(i18n(key, args));\n }\n }\n\n public setTitle() {\n // const splitted = this.selectedDate.toString().split(' ', 3);\n // this.title.innerText = splitted[0] + ', ' + splitted[1] + ' ' + splitted[2];\n this.title.textContent = '';\n this.title.append(new I18n.IntlDateElement({\n date: this.selectedDate,\n options: {\n day: 'numeric',\n month: 'long',\n weekday: 'short'\n }\n }).element);\n }\n\n private renderElement(disabled: boolean, innerText: string | HTMLElement = '') {\n const el = document.createElement('button');\n el.classList.add('btn-icon', 'date-picker-month-date');\n\n if(disabled) {\n el.setAttribute('disabled', 'true');\n }\n\n if(innerText) {\n el.append(innerText);\n }\n\n return el;\n }\n\n public setMonth() {\n const firstDate = new Date(this.selectedMonth);\n\n const options: Intl.DateTimeFormatOptions = {\n year: 'numeric',\n month: this.timeDiv && mediaSizes.isMobile ? 'short' : 'long'\n };\n\n this.monthTitle.textContent = '';\n this.monthTitle.append(new I18n.IntlDateElement({date: firstDate, options}).element);\n // this.monthTitle.innerText = (this.timeDiv && mediaSizes.isMobile ? monthName.slice(0, 3) : monthName) + ' ' + this.selectedMonth.getFullYear();\n\n if(this.month) {\n this.month.remove();\n }\n\n this.month = document.createElement('div');\n this.month.classList.add('date-picker-month');\n\n const weekStartDate = new Date();\n const day = weekStartDate.getDay();\n if(day !== 1) {\n weekStartDate.setHours(-24 * (day - 1));\n }\n\n for(let i = 0; i < 7; ++i) {\n const el = this.renderElement(true, new I18n.IntlDateElement({date: weekStartDate, options: {weekday: 'narrow'}}).element);\n el.classList.remove('date-picker-month-date');\n el.classList.add('date-picker-month-day');\n this.month.append(el);\n weekStartDate.setDate(weekStartDate.getDate() + 1);\n }\n\n // 0 - sunday\n let dayIndex = firstDate.getDay() - 1;\n if(dayIndex === -1) dayIndex = 7 - 1;\n\n const clonedDate = new Date(firstDate.getTime());\n clonedDate.setDate(clonedDate.getDate() - dayIndex - 1);\n\n // Padding first week\n for(let i = 0; i < dayIndex; ++i) {\n if(this.options.showOverflowMonths) {\n clonedDate.setDate(clonedDate.getDate() + 1);\n this.month.append(this.renderElement(true, '' + clonedDate.getDate()));\n } else {\n this.month.append(this.renderElement(true));\n }\n }\n\n do {\n const date = firstDate.getDate();\n const el = this.renderElement(firstDate > this.maxDate || firstDate < this.minDate, '' + date);\n el.dataset.timestamp = '' + firstDate.getTime();\n\n if(firstDate.getTime() === this.selectedDate.getTime()) {\n this.selectedEl = el;\n el.classList.add('active');\n }\n\n this.month.append(el);\n\n firstDate.setDate(date + 1);\n } while(firstDate.getDate() !== 1);\n\n const remainder = this.month.childElementCount % 7;\n if(this.options.showOverflowMonths && remainder) {\n for(let i = remainder; i < 7; ++i) {\n this.month.append(this.renderElement(true, '' + firstDate.getDate()));\n firstDate.setDate(firstDate.getDate() + 1);\n }\n }\n\n const lines = Math.ceil(this.month.childElementCount / 7);\n this.container.dataset.lines = '' + lines;\n\n this.monthsContainer.append(this.month);\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 {setDirection} from '../helpers/dom/setInnerHTML';\n\nexport default class DivAndCaption {\n public container: HTMLElement;\n public border: HTMLElement;\n public content: HTMLElement;\n public title: HTMLElement;\n public subtitle: HTMLElement;\n\n constructor(protected className: string, public fill?: T) {\n this.container = document.createElement('div');\n this.container.className = className;\n\n this.border = document.createElement('div');\n this.border.classList.add(className + '-border');\n\n this.content = document.createElement('div');\n this.content.classList.add(className + '-content');\n\n this.title = document.createElement('div');\n this.title.classList.add(className + '-title');\n setDirection(this.title);\n\n this.subtitle = document.createElement('div');\n this.subtitle.classList.add(className + '-subtitle');\n setDirection(this.subtitle);\n\n this.content.append(this.title, this.subtitle);\n this.container.append(this.border, this.content);\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 {Middleware} from '../../helpers/middleware';\nimport limitSymbols from '../../helpers/string/limitSymbols';\nimport {Document, Message, MessageMedia, Photo, WebPage} from '../../layer';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport choosePhotoSize from '../../lib/appManagers/utils/photos/choosePhotoSize';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport DivAndCaption from '../divAndCaption';\nimport wrapMessageForReply from '../wrappers/messageForReply';\nimport wrapPhoto from '../wrappers/photo';\nimport wrapSticker from '../wrappers/sticker';\nimport wrapVideo from '../wrappers/video';\nimport {AnimationItemGroup} from '../animationIntersector';\n\nconst MEDIA_SIZE = 32;\n\nexport async function wrapReplyDivAndCaption(options: {\n title: string | HTMLElement | DocumentFragment,\n titleEl: HTMLElement,\n subtitle: string | HTMLElement | DocumentFragment,\n subtitleEl: HTMLElement,\n message: Message.message | Message.messageService,\n mediaEl: HTMLElement,\n loadPromises?: Promise[],\n animationGroup: AnimationItemGroup\n}) {\n let {title, titleEl, subtitle, subtitleEl, mediaEl, message, loadPromises, animationGroup} = options;\n if(title !== undefined) {\n if(typeof(title) === 'string') {\n title = limitSymbols(title, 140);\n title = wrapEmojiText(title);\n }\n\n replaceContent(titleEl, title);\n }\n\n if(!loadPromises) {\n loadPromises = [];\n }\n\n let messageMedia: MessageMedia | WebPage.webPage = (message as Message.message)?.media;\n let setMedia = false, isRound = false;\n const mediaChildren = mediaEl ? Array.from(mediaEl.children).slice() : [];\n let middleware: Middleware;\n if(messageMedia && mediaEl) {\n subtitleEl.textContent = '';\n subtitleEl.append(await wrapMessageForReply({message, animationGroup, withoutMediaType: true}));\n\n messageMedia = (messageMedia as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage || messageMedia;\n const photo = (messageMedia as MessageMedia.messageMediaPhoto).photo as Photo.photo;\n const document = (messageMedia as MessageMedia.messageMediaDocument).document as Document.document;\n if(photo || (document && document.thumbs?.length)/* ['video', 'sticker', 'gif', 'round', 'photo', 'audio'].indexOf(document.type) !== -1) */) {\n middleware = appImManager.chat.bubbles.getMiddleware();\n const lazyLoadQueue = appImManager.chat.bubbles.lazyLoadQueue;\n\n if(document?.type === 'sticker') {\n await wrapSticker({\n doc: document,\n div: mediaEl,\n lazyLoadQueue,\n group: animationGroup,\n // onlyThumb: document.sticker === 2,\n width: MEDIA_SIZE,\n height: MEDIA_SIZE,\n middleware,\n loadPromises\n });\n setMedia = true;\n } else if(document?.type === 'gif' && document.video_thumbs) {\n setMedia = true;\n await wrapVideo({\n doc: document,\n container: mediaEl,\n boxWidth: MEDIA_SIZE,\n boxHeight: MEDIA_SIZE,\n lazyLoadQueue,\n noPlayButton: true,\n noInfo: true,\n middleware,\n loadPromises,\n withoutPreloader: true,\n videoSize: document.video_thumbs[0],\n group: animationGroup\n });\n } else {\n const m = photo || document;\n isRound = document?.type === 'round';\n\n try {\n await wrapPhoto({\n photo: m,\n container: mediaEl,\n boxWidth: MEDIA_SIZE,\n boxHeight: MEDIA_SIZE,\n size: choosePhotoSize(m, MEDIA_SIZE, MEDIA_SIZE),\n middleware,\n lazyLoadQueue,\n noBlur: true,\n withoutPreloader: true,\n loadPromises\n });\n setMedia = true;\n } catch(err) {\n\n }\n }\n }\n } else {\n if(message) {\n subtitleEl.textContent = '';\n subtitleEl.append(await wrapMessageForReply({message}));\n } else {\n if(typeof(subtitle) === 'string') {\n subtitle = limitSymbols(subtitle, 140);\n subtitle = wrapEmojiText(subtitle);\n }\n\n replaceContent(subtitleEl, subtitle || '');\n }\n }\n\n Promise.all(loadPromises).then(() => {\n if(middleware && !middleware()) return;\n mediaChildren.forEach((child) => child.remove());\n\n if(mediaEl) {\n mediaEl.classList.toggle('is-round', isRound);\n }\n });\n\n return setMedia;\n}\n\nexport default class ReplyContainer extends DivAndCaption<(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message?: any) => Promise> {\n private mediaEl: HTMLElement;\n\n constructor(protected className: string, protected animationGroup: AnimationItemGroup) {\n super(className, async(title, subtitle = '', message?) => {\n if(!this.mediaEl) {\n this.mediaEl = document.createElement('div');\n this.mediaEl.classList.add(this.className + '-media');\n }\n\n const isMediaSet = await wrapReplyDivAndCaption({\n title,\n titleEl: this.title,\n subtitle,\n subtitleEl: this.subtitle,\n mediaEl: this.mediaEl,\n message,\n animationGroup\n });\n\n this.container.classList.toggle('is-media', isMediaSet);\n if(isMediaSet) {\n this.content.prepend(this.mediaEl);\n } else {\n this.mediaEl.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 {hexToRgb} from '../../helpers/color';\nimport {Message} from '../../layer';\nimport getPeerColorById from '../../lib/appManagers/utils/peers/getPeerColorById';\nimport {AnimationItemGroup} from '../animationIntersector';\nimport ReplyContainer from '../chat/replyContainer';\n\nexport default function wrapReply(\n title: Parameters[0],\n subtitle: Parameters[1],\n animationGroup: AnimationItemGroup,\n message?: Message.message | Message.messageService,\n setColorPeerId?: PeerId\n) {\n const replyContainer = new ReplyContainer('reply', animationGroup);\n const fillPromise = replyContainer.fill(title, subtitle, message);\n\n if(setColorPeerId) {\n const hex = getPeerColorById(setColorPeerId, false);\n const [r, g, b] = hexToRgb(hex);\n replyContainer.container.style.setProperty('--override-color', `${r}, ${g}, ${b}`);\n replyContainer.container.classList.add('is-overriding-color');\n // replyContainer.border.style.backgroundColor = hex;\n // replyContainer.title.style.color = hex;\n }\n\n return {container: replyContainer.container, fillPromise};\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 AvatarElement from './avatar';\nimport type LazyLoadQueue from './lazyLoadQueue';\n\nconst CLASS_NAME = 'stacked-avatars';\nconst AVATAR_CLASS_NAME = CLASS_NAME + '-avatar';\nconst AVATAR_CONTAINER_CLASS_NAME = AVATAR_CLASS_NAME + '-container';\n\nexport default class StackedAvatars {\n public container: HTMLElement;\n private lazyLoadQueue: LazyLoadQueue;\n private avatarSize: number;\n\n constructor(options: {\n lazyLoadQueue?: StackedAvatars['lazyLoadQueue'],\n avatarSize: StackedAvatars['avatarSize']\n }) {\n this.lazyLoadQueue = options.lazyLoadQueue;\n this.avatarSize = options.avatarSize;\n\n this.container = document.createElement('div');\n this.container.classList.add(CLASS_NAME);\n\n this.container.style.setProperty('--avatar-size', options.avatarSize + 'px');\n }\n /**\n * MACOS, ANDROID - ะฑะตะท ั€ะตะฒะตั€ัะฐ\n * WINDOWS DESKTOP - ั€ะตะฒะตั€ั\n * ะฒัะต ะฟั€ะธะปะพะถะตะฝะธั ะฝะฐะบะปะฐะดั‹ะฒะฐัŽั‚ ะฐะฒะฐั‚ะฐั€ะบัƒ ะฟะตั€ะฒัƒัŽ ะฝะฐ ะฒั‚ะพั€ัƒัŽ, ะฐ ะฒ ะผะฐะบะตั‚ะต ะทะฐั‚ะพ ะฒั‚ะพั€ะฐั ะฝะฐ ะฟะตั€ะฒัƒัŽ, ะ›ะžะ›!\n */\n public render(peerIds: PeerId[], loadPromises?: Promise[]) {\n const children = this.container.children;\n peerIds = peerIds.slice().reverse();\n if(peerIds.length > 3) {\n peerIds = peerIds.slice(-3);\n }\n\n peerIds.forEach((peerId, idx) => {\n let avatarContainer = children[idx] as HTMLElement;\n if(!avatarContainer) {\n avatarContainer = document.createElement('div');\n avatarContainer.classList.add(AVATAR_CONTAINER_CLASS_NAME);\n }\n\n let avatarElem = avatarContainer.firstElementChild as AvatarElement;\n if(!avatarElem) {\n avatarElem = new AvatarElement();\n avatarElem.classList.add('avatar-' + this.avatarSize, AVATAR_CLASS_NAME);\n avatarElem.updateOptions({\n isDialog: false,\n loadPromises\n });\n }\n\n avatarElem.updateWithOptions({\n lazyLoadQueue: this.lazyLoadQueue,\n peerId: peerId\n });\n\n if(!avatarElem.parentNode) {\n avatarContainer.append(avatarElem);\n }\n\n if(!avatarContainer.parentNode) {\n this.container.append(avatarContainer);\n }\n });\n\n // if were 3 and became 2\n (Array.from(children) as HTMLElement[]).slice(peerIds.length).forEach((el) => el.remove());\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';\nimport rootScope from '../../lib/rootScope';\nimport ripple from '../ripple';\nimport I18n from '../../lib/langPack';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport StackedAvatars from '../stackedAvatars';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport type LazyLoadQueue from '../lazyLoadQueue';\n\nconst TAG_NAME = 'replies-element';\n\nrootScope.addEventListener('replies_updated', (message) => {\n (Array.from(document.querySelectorAll(TAG_NAME + `[data-post-key=\"${message.peerId}_${message.mid}\"]`)) as RepliesElement[]).forEach((element) => {\n element.message = message;\n element.render();\n });\n});\n\nexport default class RepliesElement extends HTMLElement {\n public message: Message.message;\n public type: 'footer' | 'beside';\n public loadPromises: Promise[];\n public lazyLoadQueue: LazyLoadQueue;\n public stackedAvatars: StackedAvatars;\n public text: I18n.IntlElement;\n public managers: AppManagers;\n\n private updated = false;\n\n constructor() {\n super();\n this.managers = rootScope.managers;\n }\n\n public init() {\n this.render();\n this.dataset.postKey = this.message.peerId + '_' + this.message.mid;\n this.classList.add('replies', 'replies-' + this.type);\n }\n\n public render() {\n const replies = this.message.replies;\n\n /* if(this.firstChild) {\n this.innerHTML = '';\n } */\n\n if(this.type === 'footer') {\n let leftPart: HTMLElement;\n if(this.firstElementChild) {\n leftPart = this.firstElementChild as HTMLElement;\n }\n\n if(replies?.recent_repliers) {\n if(leftPart && !leftPart.classList.contains('replies-footer-avatars')) {\n this.innerHTML = '';\n leftPart = null;\n }\n\n if(!this.stackedAvatars) {\n this.stackedAvatars = new StackedAvatars({\n lazyLoadQueue: this.lazyLoadQueue,\n avatarSize: 30\n });\n\n this.stackedAvatars.container.classList.add('replies-footer-avatars');\n }\n\n leftPart = this.stackedAvatars.container;\n\n this.stackedAvatars.render(replies.recent_repliers.map((peer) => getPeerId(peer)), this.loadPromises);\n } else {\n if(leftPart && !leftPart.classList.contains('tgico-comments')) {\n leftPart.remove();\n leftPart = null;\n }\n\n if(!leftPart) {\n leftPart = document.createElement('span');\n leftPart.classList.add('tgico-comments');\n }\n }\n\n if(!leftPart.parentElement) {\n this.prepend(leftPart);\n }\n\n if(!this.text) {\n this.text = new I18n.IntlElement();\n }\n\n const text = this.text;\n if(replies) {\n if(replies.replies) {\n text.compareAndUpdate({key: 'Comments', args: [replies.replies]});\n } else {\n text.compareAndUpdate({key: 'LeaveAComment'});\n }\n } else {\n text.compareAndUpdate({key: 'ViewInChat'});\n }\n\n if(replies) {\n // const historyStorage = appMessagesManager.getHistoryStorage(replies.channel_id.toPeerId(true));\n let isUnread = false;\n if(replies.replies) {\n if(replies.read_max_id !== undefined && replies.max_id !== undefined) {\n isUnread = replies.read_max_id < replies.max_id;\n }/* else {\n isUnread = !historyStorage.readMaxId || historyStorage.readMaxId < (replies.max_id || 0);\n } */\n }\n this.classList.toggle('is-unread', isUnread);\n }\n\n let textSpan = this.children[1] as HTMLElement;\n if(!textSpan) {\n textSpan = document.createElement('span');\n textSpan.classList.add('replies-footer-text');\n\n const iconSpan = document.createElement('span');\n iconSpan.classList.add('tgico-next');\n\n const rippleContainer = document.createElement('div');\n ripple(rippleContainer);\n\n this.append(textSpan, iconSpan, rippleContainer);\n }\n\n replaceContent(textSpan, text.element);\n } else {\n this.classList.add('bubble-beside-button');\n this.innerHTML = `${replies?.replies ? formatNumber(replies.replies, 0) : ''}`;\n }\n\n if(replies && !this.updated && !this.message.pFlags.is_outgoing) {\n this.managers.appMessagesManager.subscribeRepliesThread(this.message.peerId, this.message.mid);\n this.managers.appMessagesManager.updateMessage(this.message.peerId, this.message.mid, 'replies_updated');\n this.updated = true;\n }\n\n if(this.loadPromises) {\n this.loadPromises = undefined;\n }\n }\n}\n\ncustomElements.define(TAG_NAME, RepliesElement);\n","/*\n * 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 setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport {Message} from '../../layer';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport {i18n, _i18n} from '../../lib/langPack';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport rootScope from '../../lib/rootScope';\nimport type LazyLoadQueue from '../lazyLoadQueue';\nimport PeerTitle from '../peerTitle';\nimport wrapReply from '../wrappers/reply';\nimport Chat, {ChatType} 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 = (options: {\n chatType: ChatType,\n message: Message.message | Message.messageService,\n reactionsMessage?: Message.message\n }) => {\n const {chatType, message} = options;\n const date = new Date(message.date * 1000);\n const args: (HTMLElement | string)[] = [];\n\n let editedSpan: HTMLElement,\n sponsoredSpan: HTMLElement;\n // reactionsElement: ReactionsElement,\n // reactionsMessage: Message.message;\n\n const isSponsored = !!(message as Message.message).pFlags.sponsored;\n const isMessage = !('action' in message) && !isSponsored;\n // let hasReactions: boolean;\n\n const 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 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 setInnerHTML(span, wrapEmojiText(postAuthor));\n span.insertAdjacentHTML('beforeend', ',' + NBSP)\n args.push(span);\n }\n }\n\n if(message.edit_date && chatType !== 'scheduled' && !message.pFlags.edit_hide) {\n args.unshift(editedSpan = makeEdited());\n }\n\n if(chatType !== 'pinned' && message.pFlags.pinned) {\n const i = document.createElement('i');\n i.classList.add('tgico-pinnedchat', 'time-icon');\n args.unshift(i);\n }\n\n // if(USER_REACTIONS_INLINE && message.peer_id._ === 'peerUser'/* && message.reactions?.results?.length */) {\n // hasReactions = true;\n\n // reactionsMessage = options.reactionsMessage;\n // reactionsElement = new ReactionsElement();\n // reactionsElement.init(reactionsMessage, 'inline', true);\n // reactionsElement.render();\n // args.unshift(reactionsElement);\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 && !message.pFlags.edit_hide ? `\\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 // if(reactionsElement) {\n // const _reactionsElement = clonedArgs[clonedArgs.indexOf(reactionsElement)] = new ReactionsElement();\n // _reactionsElement.init(reactionsMessage, 'inline');\n // _reactionsElement.render();\n // }\n clonedArgs = clonedArgs.map((a) => a instanceof HTMLElement && !a.classList.contains('i18n') && !a.classList.contains('reactions') ? 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 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?: LazyLoadQueue\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 = async({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 currentReplyDiv?.remove();\n\n bubble.classList.remove('is-reply');\n return;\n }\n\n\n const replyToPeerId = message.reply_to.reply_to_peer_id ? getPeerId(message.reply_to.reply_to_peer_id) : chat.peerId;\n\n const originalMessage = await rootScope.managers.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 let titlePeerId: PeerId;\n // need to download separately\n if(!originalMessage) {\n // ////////this.log('message to render reply empty, need download', message, message.reply_to_mid);\n rootScope.managers.appMessagesManager.fetchMessageReplyTo(message);\n chat.bubbles.needUpdate.push({replyToPeerId, replyMid: message.reply_to_mid, mid: message.mid});\n\n originalPeerTitle = i18n('Loading');\n } else {\n const originalMessageFwdFromId = (originalMessage as Message.message).fwdFromId;\n titlePeerId = message.fwdFromId && message.fwdFromId === originalMessageFwdFromId ? message.fwdFromId : originalMessage.fromId || originalMessageFwdFromId;\n originalPeerTitle = new PeerTitle({\n peerId: titlePeerId,\n dialog: false,\n onlyFirstName: false,\n plainText: false\n }).element;\n }\n\n const {container, fillPromise} = wrapReply(originalPeerTitle, undefined, chat.animationGroup, originalMessage, chat.isAnyGroup ? titlePeerId : undefined);\n await fillPromise;\n if(currentReplyDiv) {\n if(currentReplyDiv.classList.contains('floating-part')) {\n container.classList.add('floating-part');\n }\n currentReplyDiv.replaceWith(container);\n } else {\n bubbleContainer.append(container);\n }\n // bubbleContainer.insertBefore(, nameContainer);\n bubble.classList.add('is-reply');\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\nexport default function reflowScrollableElement(element: HTMLElement) {\n element.style.display = 'none';\n void element.offsetLeft; // reflow\n element.style.display = '';\n}\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\nexport enum INTERNAL_LINK_TYPE {\n MESSAGE,\n PRIVATE_POST,\n STICKER_SET,\n JOIN_CHAT,\n VOICE_CHAT,\n USER_PHONE_NUMBER,\n INVOICE,\n EMOJI_SET\n};\n\nexport type InternalLink = InternalLink.InternalLinkMessage | InternalLink.InternalLinkPrivatePost | InternalLink.InternalLinkStickerSet | InternalLink.InternalLinkJoinChat | InternalLink.InternalLinkVoiceChat | InternalLink.InternalLinkUserPhoneNumber | InternalLink.InternalLinkInvoice | InternalLink.InternalLinkEmojiSet;\n\nexport namespace InternalLink {\n export interface InternalLinkMessage {\n _: INTERNAL_LINK_TYPE.MESSAGE,\n domain: string,\n post?: string,\n comment?: string,\n thread?: string,\n start?: string,\n stack?: number // local\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 stack?: number // local\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 export interface InternalLinkUserPhoneNumber {\n _: INTERNAL_LINK_TYPE.USER_PHONE_NUMBER,\n phone: string\n }\n\n export interface InternalLinkInvoice {\n _: INTERNAL_LINK_TYPE.INVOICE,\n slug: string\n }\n\n export interface InternalLinkEmojiSet {\n _: INTERNAL_LINK_TYPE.EMOJI_SET,\n set: 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 [INTERNAL_LINK_TYPE.USER_PHONE_NUMBER]: InternalLink.InternalLinkUserPhoneNumber,\n [INTERNAL_LINK_TYPE.INVOICE]: InternalLink.InternalLinkInvoice,\n [INTERNAL_LINK_TYPE.EMOJI_SET]: InternalLink.InternalLinkEmojiSet\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, {addCancelButton} from '.';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport numberThousandSplitter from '../../helpers/number/numberThousandSplitter';\nimport {ChatInvite} from '../../layer';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {i18n, _i18n} from '../../lib/langPack';\nimport {NULL_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport AvatarElement from '../avatar';\nimport putPhoto from '../putPhoto';\nimport {toastNew} from '../toast';\nimport wrapPhoto from '../wrappers/photo';\n\n// const FAKE_CHAT_ID = Number.MAX_SAFE_INTEGER - 0x1000;\n\nexport default class PopupJoinChatInvite extends PopupElement {\n constructor(\n private hash: string,\n private chatInvite: ChatInvite.chatInvite\n ) {\n super('popup-join-chat-invite', {\n closable: true,\n overlayClosable: true,\n body: true,\n buttons: addCancelButton([{\n langKey: chatInvite.pFlags.request_needed ? 'RequestJoin.Button' : (chatInvite.pFlags.broadcast ? 'JoinByPeekChannelTitle' : 'JoinByPeekGroupTitle'),\n callback: () => {\n this.managers.appChatsManager.importChatInvite(hash)\n .then((chatId) => {\n const peerId = chatId.toPeerId(true);\n appImManager.setInnerPeer({peerId});\n }, (error) => {\n if(error.type === 'INVITE_REQUEST_SENT') {\n toastNew({langPackKey: 'RequestToJoinSent'});\n }\n });\n }\n }])\n });\n\n this.construct();\n }\n\n private async construct() {\n this.header.remove();\n /* const fakeChat: Chat.channel | Chat.chat = {\n _: chatInvite.pFlags.channel ? 'channel' : 'chat',\n id: FAKE_CHAT_ID,\n title: chatInvite.title,\n photo: chatInvite.photo as any,\n date: Date.now() / 1000 | 0,\n version: 0,\n participants_count: chatInvite.participants_count,\n pFlags: chatInvite.pFlags as any\n };\n\n appChatsManager.saveApiChat(fakeChat); */\n\n const {chatInvite, managers, hash} = this;\n\n const avatarElem = new AvatarElement();\n avatarElem.classList.add('avatar-100');\n avatarElem.isDialog = false;\n if(chatInvite.photo._ === 'photo') {\n chatInvite.photo = await managers.appPhotosManager.savePhoto(chatInvite.photo);\n wrapPhoto({\n container: avatarElem,\n message: null,\n photo: chatInvite.photo,\n boxHeight: 100,\n boxWidth: 100,\n withoutPreloader: true\n });\n avatarElem.style.width = avatarElem.style.height = '';\n } else {\n putPhoto({\n div: avatarElem,\n peerId: NULL_PEER_ID,\n isDialog: false,\n title: chatInvite.title\n });\n }\n\n const title = document.createElement('div');\n title.classList.add('chat-title');\n setInnerHTML(title, wrapEmojiText(chatInvite.title));\n // avatarElem.setAttribute('peer', '' + -fakeChat.id);\n\n const isBroadcast = chatInvite.pFlags.broadcast;\n const peopleCount = i18n(isBroadcast ? 'Subscribers' : 'Members', [numberThousandSplitter(chatInvite.participants_count)]);\n peopleCount.classList.add('chat-participants-count');\n\n this.body.append(avatarElem, title, peopleCount);\n\n if(chatInvite.pFlags.request_needed) {\n const caption = document.createElement('div');\n _i18n(caption, isBroadcast ? 'RequestToJoinChannelDescription' : 'RequestToJoinGroupDescription');\n caption.classList.add('chat-participants-count', 'request-caption');\n\n this.body.append(caption);\n }\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 callbackify from '../../helpers/callbackify';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport {Document, MessagePeerReaction, ReactionCount} from '../../layer';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport rootScope from '../../lib/rootScope';\nimport SetTransition from '../singleTransition';\nimport StackedAvatars from '../stackedAvatars';\nimport {Awaited} from '../../types';\nimport wrapSticker from '../wrappers/sticker';\nimport wrapCustomEmoji from '../wrappers/customEmoji';\nimport wrapStickerAnimation from '../wrappers/stickerAnimation';\nimport {makeMediaSize} from '../../helpers/mediaSize';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport {fastRaf} from '../../helpers/schedulers';\nimport noop from '../../helpers/noop';\nimport {Middleware} from '../../helpers/middleware';\n\nconst CLASS_NAME = 'reaction';\nconst TAG_NAME = CLASS_NAME + '-element';\nconst REACTION_INLINE_SIZE = 14;\nconst REACTION_BLOCK_SIZE = 22;\n\nexport const REACTION_DISPLAY_INLINE_COUNTER_AT = 2;\nexport const REACTION_DISPLAY_BLOCK_COUNTER_AT = 4;\n\nexport type ReactionLayoutType = 'block' | 'inline';\n\nexport default class ReactionElement extends HTMLElement {\n private type: ReactionLayoutType;\n private counter: HTMLElement;\n private stickerContainer: HTMLElement;\n private stackedAvatars: StackedAvatars;\n private canRenderAvatars: boolean;\n private _reactionCount: ReactionCount;\n private wrapStickerPromise: Awaited>['render'];\n private managers: AppManagers;\n private middleware: Middleware;\n\n constructor() {\n super();\n this.classList.add(CLASS_NAME);\n this.managers = rootScope.managers;\n }\n\n public get reactionCount() {\n return this._reactionCount;\n }\n\n public set reactionCount(reactionCount: ReactionCount) {\n this._reactionCount = reactionCount;\n }\n\n public get count() {\n return this.reactionCount.count;\n }\n\n public init(type: ReactionLayoutType, middleware: Middleware) {\n this.type = type;\n this.classList.add(CLASS_NAME + '-' + type);\n this.middleware = middleware;\n }\n\n public setCanRenderAvatars(canRenderAvatars: boolean) {\n this.canRenderAvatars = canRenderAvatars;\n }\n\n public render(doNotRenderSticker?: boolean) {\n const hadStickerContainer = !!this.stickerContainer;\n if(!hadStickerContainer) {\n this.stickerContainer = document.createElement('div');\n this.stickerContainer.classList.add(CLASS_NAME + '-sticker');\n this.append(this.stickerContainer);\n }\n\n const reactionCount = this.reactionCount;\n if(!doNotRenderSticker && !hadStickerContainer) {\n const reaction = reactionCount.reaction;\n if(reaction._ === 'reactionEmoji') {\n const availableReaction = this.managers.appReactionsManager.getReaction(reaction.emoticon);\n callbackify(availableReaction, (availableReaction) => {\n if(!availableReaction.center_icon) {\n this.stickerContainer.classList.add('is-static');\n }\n\n if(availableReaction.pFlags.inactive) {\n this.classList.add('is-inactive');\n }\n\n this.renderDoc(availableReaction.center_icon ?? availableReaction.static_icon);\n });\n } else if(reaction._ === 'reactionCustomEmoji') {\n this.stickerContainer.classList.add('is-custom');\n const wrapped = wrapCustomEmoji({\n docIds: [reaction.document_id],\n customEmojiSize: makeMediaSize(REACTION_BLOCK_SIZE, REACTION_BLOCK_SIZE)\n });\n\n this.stickerContainer.append(wrapped);\n }\n }\n }\n\n private renderDoc(doc: Document.document) {\n const size = this.type === 'inline' ? REACTION_INLINE_SIZE : REACTION_BLOCK_SIZE;\n const wrapPromise = this.wrapStickerPromise = wrapSticker({\n div: this.stickerContainer,\n doc,\n width: size,\n height: size,\n static: true,\n managers: this.managers,\n middleware: this.middleware\n }).then(({render}) => render).finally(() => {\n if(this.wrapStickerPromise === wrapPromise) {\n this.wrapStickerPromise = undefined;\n }\n });\n }\n\n public renderCounter() {\n const reactionCount = this.reactionCount;\n const displayOn = this.type === 'inline' ? REACTION_DISPLAY_INLINE_COUNTER_AT : REACTION_DISPLAY_BLOCK_COUNTER_AT;\n if(reactionCount.count >= displayOn || (this.type === 'block' && !this.canRenderAvatars)) {\n if(!this.counter) {\n this.counter = document.createElement(this.type === 'inline' ? 'i' : 'span');\n this.counter.classList.add(CLASS_NAME + '-counter');\n }\n\n const formatted = formatNumber(reactionCount.count);\n if(this.counter.textContent !== formatted) {\n this.counter.textContent = formatted;\n }\n\n if(!this.counter.parentElement) {\n this.append(this.counter);\n }\n } else if(this.counter?.parentElement) {\n this.counter.remove();\n this.counter = undefined;\n }\n }\n\n public renderAvatars(recentReactions: MessagePeerReaction[]) {\n if(this.type === 'inline') {\n return;\n }\n\n if(this.reactionCount.count >= REACTION_DISPLAY_BLOCK_COUNTER_AT || !this.canRenderAvatars) {\n if(this.stackedAvatars) {\n this.stackedAvatars.container.remove();\n this.stackedAvatars = undefined;\n }\n\n return;\n }\n\n if(!this.stackedAvatars) {\n this.stackedAvatars = new StackedAvatars({\n avatarSize: 24\n });\n\n this.append(this.stackedAvatars.container);\n }\n\n this.stackedAvatars.render(recentReactions.map((reaction) => getPeerId(reaction.peer_id)));\n }\n\n public setIsChosen(isChosen = this.reactionCount.chosen_order !== undefined) {\n if(this.type === 'inline') return;\n const wasChosen = this.classList.contains('is-chosen') && !this.classList.contains('backwards');\n if(wasChosen !== isChosen) {\n SetTransition({\n element: this,\n className: 'is-chosen',\n forwards: isChosen,\n duration: this.isConnected ? 300 : 0\n });\n }\n }\n\n public fireAroundAnimation() {\n const reaction = this.reactionCount.reaction;\n if(reaction._ !== 'reactionEmoji') return;\n callbackify(this.managers.appReactionsManager.getReaction(reaction.emoticon), (availableReaction) => {\n const size = this.type === 'inline' ? REACTION_INLINE_SIZE + 14 : REACTION_BLOCK_SIZE + 18;\n const div = document.createElement('div');\n div.classList.add(CLASS_NAME + '-sticker-activate');\n\n Promise.all([\n wrapSticker({\n div: div,\n doc: availableReaction.center_icon,\n width: size,\n height: size,\n withThumb: false,\n needUpscale: true,\n play: false,\n skipRatio: 1,\n group: 'none',\n needFadeIn: false,\n managers: this.managers,\n middleware: this.middleware\n }).then(({render}) => render as Promise),\n\n wrapStickerAnimation({\n doc: availableReaction.around_animation,\n size: 80,\n target: this.stickerContainer,\n side: 'center',\n skipRatio: 1,\n play: false,\n managers: this.managers,\n middleware: this.middleware\n }).stickerPromise.catch(noop)\n ]).then(([iconPlayer, aroundPlayer]) => {\n const remove = () => {\n // if(!isInDOM(div)) return;\n iconPlayer.remove();\n div.remove();\n this.stickerContainer.classList.remove('has-animation');\n };\n\n if(!aroundPlayer) {\n remove();\n return;\n }\n\n const removeOnFrame = () => {\n // if(!isInDOM(div)) return;\n fastRaf(remove);\n };\n\n iconPlayer.addEventListener('enterFrame', (frameNo) => {\n if(frameNo === iconPlayer.maxFrame) {\n if(this.wrapStickerPromise) { // wait for fade in animation\n this.wrapStickerPromise.then(() => {\n setTimeout(removeOnFrame, 1e3);\n });\n } else {\n removeOnFrame();\n }\n }\n });\n\n iconPlayer.addEventListener('firstFrame', () => {\n this.stickerContainer.append(div);\n this.stickerContainer.classList.add('has-animation');\n iconPlayer.play();\n aroundPlayer.play();\n }, {once: true});\n });\n });\n }\n}\n\ncustomElements.define(TAG_NAME, ReactionElement);\n","/*\n * 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/forEachReverse';\nimport positionElementByIndex from '../../helpers/dom/positionElementByIndex';\nimport {Middleware, MiddlewareHelper} from '../../helpers/middleware';\nimport {Message, ReactionCount} from '../../layer';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport reactionsEqual from '../../lib/appManagers/utils/reactions/reactionsEqual';\nimport rootScope from '../../lib/rootScope';\nimport ReactionElement, {ReactionLayoutType, REACTION_DISPLAY_BLOCK_COUNTER_AT} from './reaction';\n\nconst CLASS_NAME = 'reactions';\nconst TAG_NAME = CLASS_NAME + '-element';\n\nconst REACTIONS_ELEMENTS: Map> = new Map();\nexport {REACTIONS_ELEMENTS};\n\nexport default class ReactionsElement extends HTMLElement {\n private message: Message.message;\n private key: string;\n private isPlaceholder: boolean;\n private type: ReactionLayoutType;\n private sorted: ReactionElement[];\n private onConnectCallback: () => void;\n private managers: AppManagers;\n private middleware: Middleware;\n private middlewareHelpers: Map;\n\n constructor() {\n super();\n this.classList.add(CLASS_NAME);\n this.sorted = [];\n this.middlewareHelpers = new Map();\n this.managers = rootScope.managers;\n }\n\n connectedCallback() {\n let set = REACTIONS_ELEMENTS.get(this.key);\n if(!set) {\n REACTIONS_ELEMENTS.set(this.key, set = new Set());\n }\n\n set.add(this);\n\n if(this.onConnectCallback && this.isConnected) {\n this.onConnectCallback();\n this.onConnectCallback = undefined;\n }\n }\n\n disconnectedCallback() {\n const set = REACTIONS_ELEMENTS.get(this.key);\n set.delete(this);\n if(!set.size) {\n REACTIONS_ELEMENTS.delete(this.key);\n }\n }\n\n public getReactionCount(reactionElement: ReactionElement) {\n return this.sorted[this.sorted.indexOf(reactionElement)].reactionCount;\n }\n\n public getMessage() {\n return this.message;\n }\n\n public init(\n message: Message.message,\n type: ReactionLayoutType,\n middleware: Middleware,\n isPlaceholder = this.isPlaceholder\n ) {\n if(this.key !== undefined) {\n this.disconnectedCallback();\n }\n\n if(this.middleware !== middleware) {\n middleware.onDestroy(() => {\n this.middlewareHelpers.clear();\n });\n }\n\n this.message = message;\n this.key = this.message.peerId + '_' + this.message.mid;\n this.middleware = middleware;\n this.isPlaceholder = isPlaceholder;\n\n if(this.type !== type) {\n this.type = type;\n this.classList.add(CLASS_NAME + '-' + type);\n }\n\n this.connectedCallback();\n }\n\n public changeMessage(message: Message.message) {\n return this.init(message, this.type, this.middleware);\n }\n\n public update(message: Message.message, changedResults?: ReactionCount[]) {\n this.message = message;\n this.render(changedResults);\n }\n\n public render(changedResults?: ReactionCount[]) {\n const reactions = this.message.reactions;\n const hasReactions = !!(reactions && reactions.results.length);\n this.classList.toggle('has-no-reactions', !hasReactions);\n if(!hasReactions && !this.sorted.length) return;\n\n const availableReactionsResult = this.managers.appReactionsManager.getAvailableReactions();\n // callbackify(availableReactionsResult, () => {\n const counts = hasReactions ? (\n reactions.results\n // availableReactionsResult instanceof Promise ?\n // reactions.results :\n // reactions.results.filter((reactionCount) => {\n // return this.managers.appReactionsManager.isReactionActive(reactionCount.reaction);\n // })\n ) : [];\n\n // if(this.message.peerId.isUser()) {\n // counts.sort((a, b) => (b.count - a.count) || ((b.chosen_order ?? 0) - (a.chosen_order ?? 0)));\n // } else {\n counts.sort((a, b) => (b.count - a.count) || ((a.chosen_order ?? 0) - (b.chosen_order ?? 0)));\n // }\n\n forEachReverse(this.sorted, (reactionElement, idx, arr) => {\n const reaction = reactionElement.reactionCount.reaction;\n const found = counts.some((reactionCount) => reactionsEqual(reactionCount.reaction, reaction));\n if(!found) {\n const middlewareHelper = this.middlewareHelpers.get(reactionElement);\n middlewareHelper.destroy();\n this.middlewareHelpers.delete(reactionElement);\n arr.splice(idx, 1);\n reactionElement.remove();\n }\n });\n\n const totalReactions = counts.reduce((acc, c) => acc + c.count, 0);\n const canRenderAvatars = reactions && (!!reactions.pFlags.can_see_list || this.message.peerId.isUser()) && totalReactions < REACTION_DISPLAY_BLOCK_COUNTER_AT;\n this.sorted = counts.map((reactionCount, idx) => {\n let reactionElement = this.sorted.find((reactionElement) => reactionsEqual(reactionElement.reactionCount.reaction, reactionCount.reaction));\n if(!reactionElement) {\n const middlewareHelper = this.middleware.create();\n reactionElement = new ReactionElement();\n reactionElement.init(this.type, middlewareHelper.get());\n this.middlewareHelpers.set(reactionElement, middlewareHelper);\n }\n\n positionElementByIndex(reactionElement, this, idx);\n\n const recentReactions = reactions.recent_reactions ? reactions.recent_reactions.filter((reaction) => reactionsEqual(reaction.reaction, reactionCount.reaction)) : [];\n reactionElement.reactionCount = {...reactionCount};\n reactionElement.setCanRenderAvatars(canRenderAvatars);\n reactionElement.render(this.isPlaceholder);\n reactionElement.renderCounter();\n reactionElement.renderAvatars(recentReactions);\n reactionElement.setIsChosen();\n\n return reactionElement;\n });\n\n // this.sorted.forEach((reactionElement, idx) => {\n // /* if(this.type === 'block' && this.childElementCount !== this.sorted.length) { // because of appended time\n // idx += 1;\n // } */\n\n // positionElementByIndex(reactionElement, this, idx);\n // });\n\n if(!this.isPlaceholder && changedResults?.length) {\n if(this.isConnected) {\n this.handleChangedResults(changedResults);\n } else {\n this.onConnectCallback = () => {\n this.handleChangedResults(changedResults);\n };\n }\n }\n // });\n\n // ! ั‚ัƒั‚ ะฒะพะพะฑั‰ะต ะฝะต ะดะพะปะถะฝะพ ะฑั‹ั‚ัŒ ัั‚ะพะณะพ ะบะพะดะฐ, ะฝะพ ะฟะพะบะฐ ะพะฝ ะฟะพะฑัƒะดะตั‚ ั‚ัƒั‚\n if(!this.sorted.length && this.type === 'block') {\n const parentElement = this.parentElement;\n this.remove();\n\n if(parentElement.classList.contains('document-message') && !parentElement.childNodes.length) {\n parentElement.remove();\n return;\n }\n\n const timeSpan = this.querySelector('.time');\n if(timeSpan) {\n parentElement.append(timeSpan);\n }\n }\n }\n\n private handleChangedResults(changedResults: ReactionCount[]) {\n // ! temp\n if(this.message.peerId !== appImManager.chat.peerId) return;\n\n changedResults.forEach((reactionCount) => {\n const reactionElement = this.sorted.find((reactionElement) => reactionsEqual(reactionElement.reactionCount.reaction, reactionCount.reaction));\n reactionElement?.fireAroundAnimation();\n });\n }\n}\n\ncustomElements.define(TAG_NAME, ReactionsElement);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Scrollable from '../components/scrollable';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport {IS_SAFARI} from '../environment/userAgent';\nimport getVisibleRect from './dom/getVisibleRect';\nimport reflowScrollableElement from './dom/reflowScrollableElement';\n\nexport default class ScrollSaver {\n private scrollHeight: number;\n private scrollHeightMinusTop: number;\n private scrollTop: number;\n private clientHeight: number;\n private elements: {element: HTMLElement, rect: DOMRect}[];\n\n /**\n *\n * @param scrollable to reset scroll position and direction\n * @param reverse true means top\n */\n constructor(\n private scrollable: Scrollable,\n private query: string,\n private reverse: boolean\n ) {\n\n }\n\n private get container() {\n return this.scrollable.container;\n }\n\n public getSaved() {\n return {\n scrollHeight: this.scrollHeight,\n scrollTop: this.scrollTop,\n clientHeight: this.clientHeight\n };\n }\n\n public findElements() {\n if(!this.query) return [];\n\n const {container} = this;\n const containerRect = container.getBoundingClientRect();\n const bubbles = Array.from(container.querySelectorAll(this.query)) as HTMLElement[];\n const elements: ScrollSaver['elements'] = [];\n for(const bubble of bubbles) {\n const elementRect = bubble.getBoundingClientRect();\n const visibleRect = getVisibleRect(bubble, container, undefined, elementRect, containerRect);\n if(visibleRect) {\n elements.push({element: bubble, rect: elementRect});\n // break; // find first\n } else if(elements.length) { // find last\n break;\n }\n }\n\n if(!elements.length) {\n const bubble = bubbles[0];\n if(bubble) {\n elements.push({element: bubble, rect: bubble.getBoundingClientRect()});\n }\n }\n\n return elements;\n }\n\n public replaceSaved(from: HTMLElement, to: HTMLElement) {\n if(!this.elements) {\n return;\n }\n\n const idx = this.elements.findIndex(({element}) => from === element);\n if(idx !== -1) {\n this.elements[idx].element = to;\n }\n }\n\n public findAndSetElements() {\n this.elements = this.findElements();\n }\n\n public save() {\n this.findAndSetElements();\n // console.warn('scroll save', this.elements);\n this._save();\n }\n\n public _save() {\n const {scrollTop, scrollHeight, clientHeight} = this.container;\n\n // previousScrollHeight = scrollHeight;\n // previousScrollHeight = scrollHeight + padding;\n this.scrollHeight = scrollHeight;\n this.scrollTop = scrollTop;\n this.clientHeight = clientHeight;\n this.scrollHeightMinusTop = this.reverse ? scrollHeight - scrollTop : scrollTop;\n\n // this.chatInner.style.paddingTop = padding + 'px';\n /* if(reverse) {\n previousScrollHeightMinusTop = this.scrollable.scrollHeight - scrollTop;\n } else {\n previousScrollHeightMinusTop = scrollTop;\n } */\n }\n\n private onRestore(useReflow?: boolean) {\n if(IS_SAFARI && useReflow/* && !isAppleMobile */) { // * fix blinking and jumping\n reflowScrollableElement(this.container);\n }\n }\n\n private setScrollTop(newScrollTop: number, useReflow?: boolean) {\n // touchSupport for safari iOS\n // isTouchSupported && isApple && (container.container.style.overflow = 'hidden');\n this.scrollable.setScrollTopSilently(this.scrollTop = newScrollTop);\n // container.scrollTop = scrollHeight;\n // isTouchSupported && isApple && (container.container.style.overflow = '');\n\n this.onRestore(useReflow);\n }\n\n public restore(useReflow?: boolean) {\n const {scrollTop, scrollHeight} = this.scrollable;\n this.scrollHeight = scrollHeight;\n\n if(!this.elements.length) { // maybe all messages have been deleted\n this._restore(useReflow);\n return;\n }\n\n let anchor: ScrollSaver['elements'][0];\n // for(let i = this.elements.length - 1; i >= 0; --i) {\n // const _anchor = this.elements[i];\n // if(_anchor.element.parentElement) {\n // anchor = _anchor;\n // break;\n // }\n // }\n anchor = this.elements[this.elements.length - 1];\n\n if(!anchor?.element?.parentElement) { // try to find new anchor\n this.findAndSetElements();\n anchor = this.elements[this.elements.length - 1];\n\n if(!anchor) { // fallback to old method if smth is really strange\n this._restore(useReflow);\n return;\n }\n }\n\n const {element, rect} = anchor;\n const newRect = element.getBoundingClientRect();\n const diff = newRect.bottom - rect.bottom;\n this.setScrollTop(scrollTop + diff, useReflow);\n // if(diff) debugger;\n // console.warn('scroll restore', rect, diff, newRect);\n }\n\n public _restore(useReflow?: boolean) {\n const {scrollHeightMinusTop: previousScrollHeightMinusTop, scrollable} = this;\n // if(previousScrollHeightMinusTop === undefined) {\n // throw new Error('scroll was not saved');\n // }\n\n // const scrollHeight = container.scrollHeight;\n const scrollHeight = this.scrollHeight;\n // if(scrollHeight === this.scrollHeight) {\n // return;\n // }\n\n // this.scrollHeight = scrollHeight;\n\n /* const scrollHeight = container.scrollHeight;\n const addedHeight = scrollHeight - previousScrollHeight;\n\n this.chatInner.style.paddingTop = (10000 - addedHeight) + 'px'; */\n /* const scrollHeight = scrollHeight;\n const addedHeight = scrollHeight - previousScrollHeight;\n\n this.chatInner.style.paddingTop = (padding - addedHeight) + 'px';\n\n //const newScrollTop = reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n const newScrollTop = reverse ? scrollHeight - addedHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n this.log('performHistoryResult: will set scrollTop',\n previousScrollHeightMinusTop, scrollHeight,\n newScrollTop, container.container.clientHeight); */\n // const newScrollTop = reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n const newScrollTop = this.reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n\n /* if(DEBUG) {\n this.log('performHistoryResult: will set up scrollTop:', newScrollTop, this.isHeavyAnimationInProgress);\n } */\n\n this.setScrollTop(newScrollTop, useReflow);\n\n /* if(DEBUG) {\n this.log('performHistoryResult: have set up scrollTop:', newScrollTop, container.scrollTop, container.scrollHeight, this.isHeavyAnimationInProgress);\n } */\n }\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.ScrollSaver = ScrollSaver);\n","/*\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 type IntersectionTarget = Element;\nexport type IntersectionCallback = (entry: IntersectionObserverEntry) => void;\n\nexport default class SuperIntersectionObserver {\n private observing: Map>;\n private observingQueue: SuperIntersectionObserver['observing'];\n private observer: IntersectionObserver;\n private freezedObservingNew: boolean;\n\n constructor(init?: IntersectionObserverInit) {\n this.observing = new Map();\n this.observingQueue = new Map();\n this.freezedObservingNew = false;\n\n this.observer = new IntersectionObserver((entries) => {\n const observing = this.observing;\n for(let i = 0, length = entries.length; i < length; ++i) {\n const entry = entries[i];\n const callbacks = observing.get(entry.target);\n if(!callbacks) {\n console.error('intersection process no callbacks:', entry);\n debugger;\n continue;\n }\n\n for(const callback of callbacks) {\n try {\n callback(entry);\n } catch(err) {\n console.error('intersection process callback error:', err);\n }\n }\n }\n }, init);\n }\n\n public disconnect() {\n this.observing.clear();\n this.observingQueue.clear();\n this.observer.disconnect();\n }\n\n public toggleObservingNew(value: boolean) {\n if(this.freezedObservingNew === value) {\n return;\n }\n\n this.freezedObservingNew = value;\n\n const queue = this.observingQueue;\n if(!value && queue.size) {\n for(const [target, callbacks] of queue) {\n for(const callback of callbacks) {\n this.observe(target, callback);\n }\n }\n\n queue.clear();\n }\n }\n\n public has(target: IntersectionTarget, callback: IntersectionCallback, observing = this.observing) {\n const callbacks = observing.get(target);\n return !!(callbacks && callbacks.has(callback));\n }\n\n public observe(target: IntersectionTarget, callback: IntersectionCallback) {\n if(this.freezedObservingNew && this.has(target, callback)) {\n return;\n }\n\n const observing = this.freezedObservingNew ? this.observingQueue : this.observing;\n let callbacks = observing.get(target);\n if(callbacks && callbacks.has(callback)) {\n return;\n }\n\n if(!callbacks) {\n callbacks = new Set();\n observing.set(target, callbacks);\n\n if(observing === this.observing) {\n this.observer.observe(target);\n }\n }\n\n callbacks.add(callback);\n }\n\n public unobserve(target: IntersectionTarget, callback: IntersectionCallback) {\n const observing = this.freezedObservingNew && !this.has(target, callback) ? this.observingQueue : this.observing;\n const callbacks = observing.get(target);\n if(!callbacks) {\n return;\n }\n\n callbacks.delete(callback);\n if(!callbacks.size) {\n observing.delete(target);\n this.observer.unobserve(target);\n }\n }\n}\n","import type {MyDocument} from '../../appDocsManager';\nimport type {MyMessage} from '../../appMessagesManager';\nimport {Message, MessageMedia} from '../../../../layer';\n\nexport default function isMentionUnread(message: MyMessage) {\n if(!message) {\n return false;\n }\n\n const doc = ((message as Message.message).media as MessageMedia.messageMediaDocument)?.document as MyDocument;\n return !!(\n message.pFlags.media_unread &&\n message.pFlags.mentioned &&\n (\n !doc ||\n !(['voice', 'round'] as MyDocument['type'][]).includes(doc.type)\n )\n );\n}\n","export default function accumulate(arr: number[], initialValue: number) {\n return arr.reduce((acc, value) => acc + value, initialValue);\n}\n","function cacheCallback(callback: (str: A) => T) {\n const stringResults: any = {}, numberResults: any = {};\n return (value: A): T => {\n const key = '_' + value;\n return (typeof(value) === 'string' ? stringResults : numberResults)[key] ??= callback(value);\n };\n}\n\nexport default cacheCallback;\n","export default function replaceNonNumber(str: string) {\n return str.replace(/\\D/g, '');\n}\n","import cacheCallback from '../cacheCallback';\nimport replaceNonNumber from '../string/replaceNonNumber';\n\nconst CARD_BRAND_REGEXP: {[brand: string]: RegExp} = {\n visa: /^4/,\n mastercard: /^(51|52|53|54|55|222|23|24|25|26|27)/,\n amex: /^(34|37)/,\n discover: /^(60|64|65)/,\n diners: /^(30|38|39)/,\n diners14: /^(36)/,\n jcb: /^(35)/,\n unionpay: /^(62[0-6,8-9]|627[0-6,8-9]|6277[0-7,9]|62778[1-9]|81)/,\n elo: /^(5067|509|636368|627780)/,\n mir: /^(220[0-4])/\n};\n\n// * taken from Stripe\nexport const CARD_BRANDS: {[b: string]: {\n minLength: number,\n maxLength: number,\n cvcMaxLength: number,\n cvcMinLength: number | null\n}} = {\n visa: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n mastercard: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n amex: {\n minLength: 15,\n maxLength: 15,\n cvcMaxLength: 4,\n cvcMinLength: 3\n },\n unionpay: {\n minLength: 13,\n maxLength: 19,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n diners: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n diners14: {\n minLength: 14,\n maxLength: 14,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n discover: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n jcb: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n elo: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n mir: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n unknown: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 4,\n cvcMinLength: 3\n }\n};\n\nexport const detectCardBrand = cacheCallback((card: string = '') => {\n const keys = Object.keys(CARD_BRAND_REGEXP);\n const sanitizedCard = replaceNonNumber(card);\n let brand: string;\n let last = 0;\n keys.forEach((key) => {\n const regExp = CARD_BRAND_REGEXP[key];\n const match = sanitizedCard.match(regExp);\n if(match) {\n const result = match[0];\n if(result && result.length > last) {\n brand = key;\n last = result.length;\n }\n }\n });\n\n return brand || 'unknown';\n});\n\nexport function cardBrandToUnifiedBrand(brand: string) {\n return brand === 'diners14' ? 'diners' : brand;\n}\n\nexport function detectUnifiedCardBrand(card = '') {\n const brand = detectCardBrand(card);\n return cardBrandToUnifiedBrand(brand);\n}\n","export default function createArray(length: number, fill?: T1, map?: any): T1[] {\n const arr = new Array(length);\n arr.fill(fill);\n return map ? arr.map(map) : arr;\n}\n","const delta = '๏ผ'.charCodeAt(0) - '0'.charCodeAt(0);\nconst buggedRegExp = /[๏ผ-๏ผ™]/g;\n\n// function hasBuggedNumbers(str: string) {\n// return !!str.match(a);\n// }\n\nfunction getDistanceFromBuggedToNormal(char: string) {\n return String.fromCharCode(char.charCodeAt(0) - delta);\n}\n\nexport function fixBuggedNumbers(str: string) {\n return str.replace(buggedRegExp, getDistanceFromBuggedToNormal);\n}\n","import {fixBuggedNumbers} from '../string/buggedNumbers';\nimport replaceNonNumber from '../string/replaceNonNumber';\n\nexport type PatternCharacter = {\n type: 'optional',\n result: string,\n consumed: number\n} | {\n type: 'required',\n result: string,\n consumed: number,\n partial?: boolean\n} | {\n type: 'formatting',\n result: string,\n consumed: number\n};\n\nexport type PatternFunction = (str: string) => ((str: string) => PatternCharacter)[];\n\nfunction makeOptionalCharacter(result: string, consumed: number): PatternCharacter {\n return {type: 'optional', result, consumed};\n}\n\nfunction makeRequiredCharacter(result: string, consumed: number, partial?: boolean): PatternCharacter {\n return {type: 'required', result, consumed, partial};\n}\n\nfunction makeFormattingCharacter(result: string, consumed: number): PatternCharacter {\n return {type: 'formatting', result, consumed};\n}\n\nfunction wrapCharacterRegExpFactory(regExp: RegExp, optional?: boolean) {\n return (str: string) => {\n const _regExp = new RegExp('^'.concat(regExp.source.replace(/^\\^/, '')));\n const match = str.match(_regExp);\n const makeCharacter = optional ? makeOptionalCharacter : makeRequiredCharacter;\n if(match) {\n const result = match[0];\n return makeCharacter(result, match.index + result.length);\n }\n\n return makeCharacter('', str.length);\n };\n}\n\nfunction makeCapitalPatternCharacter(str: string) {\n const char = wrapCharacterRegExpFactory(/\\w/)(str);\n return char.result ? makeRequiredCharacter(char.result.toUpperCase(), char.consumed) : char;\n}\n\nconst makeMonthDigitPatternCharacter = wrapCharacterRegExpFactory(/1[0-2]|0?[1-9]|0/);\n\nfunction digit(str: string) {\n return wrapCharacterRegExpFactory(/[0-9]/)(fixBuggedNumbers(str));\n}\n\nconst patternCharacters = {\n digit,\n capitalCharacter: makeCapitalPatternCharacter,\n month: (str: string) => {\n const char = makeMonthDigitPatternCharacter(fixBuggedNumbers(str));\n const cleanedResult = replaceNonNumber(char.result);\n const isPartial = ['0', '1'].includes(char.result) && str.length === 1;\n if(isPartial || (char.result === '0' && str.length >= 2)) {\n return makeRequiredCharacter(char.result, str.length, true);\n }\n\n return makeRequiredCharacter(cleanedResult.length === 1 ? '0' + cleanedResult : cleanedResult, char.consumed);\n },\n formattingCharacter: (str: string) => {\n return (str1: string) => {\n const consumed = str === str1[0] ? 1 : 0;\n return makeFormattingCharacter(str, consumed);\n }\n },\n optionalPattern: (regExp: RegExp) => {\n return (str: string) => {\n const char = wrapCharacterRegExpFactory(regExp, true)(str);\n return char.result ? char : makeOptionalCharacter('', 0);\n };\n }\n};\n\nexport default patternCharacters;\n","import {IS_ANDROID} from '../../environment/userAgent';\nimport createArray from '../array/createArray';\nimport cacheCallback from '../cacheCallback';\nimport replaceNonNumber from '../string/replaceNonNumber';\nimport {CARD_BRANDS, detectCardBrand} from './cardBrands';\nimport patternCharacters from './patternCharacters';\n\nconst digit = patternCharacters.digit;\nconst capitalCharacter = patternCharacters.capitalCharacter;\nconst spaceCharacter = patternCharacters.formattingCharacter(' ');\nconst yearOptionalPattern = patternCharacters.optionalPattern(/\\d\\d/);\nconst sixteenPattern = [digit, digit, digit, digit, spaceCharacter, digit, digit, digit, digit, digit, digit, spaceCharacter, digit, digit, digit, digit, digit];\nconst fifteenPattern = [digit, digit, digit, digit, spaceCharacter, digit, digit, digit, digit, digit, digit, spaceCharacter, digit, digit, digit, digit];\n\nconst requiredPostcodes = new Set(['DZ', 'AR', 'AM', 'AU', 'AT', 'AZ', 'PT', 'BD', 'BY', 'BE', 'BA', 'BR', 'BN', 'BG', 'CA', 'IC', 'CN', 'CO', 'HR', 'CY', 'CZ', 'DK', 'EC', 'GB', 'EE', 'FO', 'FI', 'FR', 'GE', 'DE', 'GR', 'GL', 'GU', 'GG', 'NL', 'HU', 'IN', 'ID', 'IL', 'IT', 'JP', 'JE', 'KZ', 'KR', 'FM', 'KG', 'LV', 'LI', 'LT', 'LU', 'MK', 'MG', 'PT', 'MY', 'MH', 'MQ', 'YT', 'MX', 'MN', 'ME', 'NL', 'NZ', 'GB', 'NO', 'PK', 'PH', 'PL', 'FM', 'PT', 'PR', 'RE', 'RU', 'SA', 'SF', 'RS', 'SG', 'SK', 'SI', 'ZA', 'ES', 'LK', 'SX', 'VI', 'VI', 'SE', 'CH', 'TW', 'TJ', 'TH', 'TU', 'TN', 'TR', 'TM', 'VI', 'UA', 'GB', 'US', 'UY', 'UZ', 'VA', 'VN', 'GB', 'FM']);\n\nconst generateFourPattern = cacheCallback((length: number) => {\n const out: Array = [];\n\n for(let i = 0, k = 0; i < length;) {\n if(k === 4) {\n out.push(spaceCharacter);\n k = 0;\n } else {\n out.push(digit);\n ++i;\n ++k;\n }\n }\n\n return out;\n});\n\nfunction generateCardNumberPattern(card: string) {\n const brand = detectCardBrand(card);\n if(brand === 'amex') return sixteenPattern;\n if(brand === 'diners14') return fifteenPattern;\n const {minLength, maxLength} = CARD_BRANDS[brand];\n const s = replaceNonNumber(card).length;\n const d = Math.min(Math.max(minLength, s), maxLength);\n return generateFourPattern(d);\n}\n\nconst cardFormattingPatterns = {\n cardNumber: generateCardNumberPattern,\n cardExpiry: () => [patternCharacters.month, patternCharacters.formattingCharacter('/'), digit, digit, yearOptionalPattern],\n cardCvc: (card?: string) => cardFormattingPatterns.cardCvcFromBrand(detectCardBrand(card)),\n cardCvcFromBrand: cacheCallback((brand: string) => {\n const info = CARD_BRANDS[brand];\n const {cvcMinLength, cvcMaxLength} = info;\n const pattern = createArray(cvcMinLength || cvcMaxLength, digit);\n if(cvcMinLength && cvcMinLength < cvcMaxLength) {\n const i = cvcMaxLength - cvcMinLength;\n const h = patternCharacters.optionalPattern(/\\d/);\n if(i) {\n pattern.push(...createArray(i, h));\n }\n }\n\n return pattern;\n }),\n postalCodeFromCountry: cacheCallback((iso2: string) => {\n switch(iso2) {\n case 'US':\n return createArray(5, digit);\n case 'CA':\n return IS_ANDROID ? null : [capitalCharacter, capitalCharacter, capitalCharacter, spaceCharacter, capitalCharacter, capitalCharacter, capitalCharacter];\n default:\n const optionalDigits = createArray(10, patternCharacters.optionalPattern(/\\d/));\n if(requiredPostcodes.has(iso2)) {\n optionalDigits[0] = digit;\n }\n return optionalDigits;\n }\n })\n};\n\nexport default cardFormattingPatterns;\n","import accumulate from '../array/accumulate';\nimport {PatternFunction} from './patternCharacters';\n\nfunction accumulateLengths(strs: string[]) {\n return accumulate(strs.map((str) => str.length), 0);\n}\n\nfunction formatValueByPattern(\n getPattern: PatternFunction,\n value: string,\n options: Partial<{\n selectionStart: number,\n selectionEnd: number\n }> = {},\n pushRest?: boolean\n) {\n const pattern = getPattern(value);\n\n if(!pattern) {\n return {\n value: value,\n selection: null as typeof options,\n autocorrectComplete: !!value\n };\n }\n\n const length = pattern.length;\n const c: string[] = [];\n const s: string[] = [];\n\n let l = 0;\n let i = 0;\n let f = options.selectionStart === 0 ? 0 : null;\n let d = options.selectionEnd === 0 ? 0 : null;\n const p = () => {\n if(f === null && (i + 1) >= options.selectionStart) f = accumulateLengths(c) + (pushRest ? s.length : 0);\n if(d === null && (i + 1) >= options.selectionEnd) d = accumulateLengths(c) + (pushRest ? s.length : 0);\n };\n const m = (e: number) => {\n if(e > 0) {\n p();\n i += e;\n }\n };\n\n for(; l < length;) {\n const getCharacter = pattern[l];\n const character = getCharacter(value.slice(i));\n const {type, result, consumed} = character;\n if(type === 'required') {\n if(result) {\n c.push(...s, result);\n s.length = 0;\n ++l;\n\n if(character.partial) {\n m(value.length - i);\n break;\n }\n\n m(consumed);\n } else {\n if(!consumed) {\n break;\n }\n\n m(1);\n }\n } else if(type === 'optional') {\n if(result) {\n c.push(...s, result);\n s.length = 0;\n m(consumed);\n }\n\n ++l;\n } else if(type === 'formatting') {\n if(!pushRest && i >= value.length) {\n break;\n }\n\n s.push(result);\n ++l;\n m(consumed);\n }\n }\n\n if(pushRest) {\n c.push(...s);\n }\n\n return {\n value: c.join(''),\n selection: {\n selectionStart: f === null || value.length && options.selectionStart === value.length ? accumulateLengths(c) : f,\n selectionEnd: d === null || value.length && options.selectionEnd === value.length ? accumulateLengths(c) : d\n },\n autocorrectComplete: l === length\n };\n}\n\nexport default formatValueByPattern;\n","import {CARD_BRANDS, detectCardBrand} from './cardBrands';\nimport formatInputValueByPattern from './formatInputValueByPattern';\nimport NBSP from '../string/nbsp';\nimport replaceNonNumber from '../string/replaceNonNumber';\n\nexport type PatternValidationOptions = Partial<{\n ignoreIncomplete: boolean\n}>;\n\nconst nbspRegExp = new RegExp(NBSP, 'g');\n\nfunction makeValidationError(code?: string) {\n return code ? {\n type: 'invalid',\n code\n } : null;\n}\n\n// Luhn algorithm\nfunction validateCompleteCardNumber(card: string) {\n const t = '0'.charCodeAt(0);\n const n = card.length % 2;\n let a = 0;\n for(let i = card.length - 1; i >= 0; --i) {\n const c = n === (i % 2);\n let o = card.charCodeAt(i) - t;\n if(c) o *= 2;\n if(o > 9) o -= 9;\n a += o;\n }\n return !(a % 10);\n}\n\nfunction validateExpiry(year: number, month: number, options?: PatternValidationOptions) {\n const date = new Date(Date.now());\n const _year = year < 100 ? date.getFullYear() % 100 : date.getFullYear();\n const nextMonth = date.getMonth() + 1;\n\n if(isNaN(year) || isNaN(month)) {\n return options?.ignoreIncomplete ? null : 'incomplete';\n }\n\n if((year - _year) < 0) {\n return 'invalid_expiry_year_past';\n }\n\n if((year - _year) > 50) {\n return 'invalid_expiry_year';\n }\n\n return !(year - _year) && month < nextMonth ? 'invalid_expiry_month_past' : null;\n}\n\nfunction getCardInfoByNumber(card: string) {\n const sanitized = replaceNonNumber(card);\n const brand = detectCardBrand(card);\n return {\n sanitized,\n brand,\n minLength: CARD_BRANDS[brand].minLength\n };\n}\n\nfunction makeCardNumberError(str: string, length: number, ignoreIncomplete: boolean) {\n if(str.length >= length) {\n return validateCompleteCardNumber(str) || detectCardBrand(str) === 'mir' ? null : makeValidationError('invalid');\n }\n\n return ignoreIncomplete ? null : makeValidationError('incomplete');\n}\n\nexport function validateCardNumber(str: string, options: PatternValidationOptions = {}) {\n const {sanitized, minLength} = getCardInfoByNumber(str);\n return makeCardNumberError(sanitized, minLength, options.ignoreIncomplete);\n}\n\nexport function validateCardExpiry(str: string, options: PatternValidationOptions = {}) {\n const sanitized = str.replace(nbspRegExp, '').split(/ ?\\/ ?/);\n const [monthStr, yearStr = ''] = sanitized;\n const [month, year] = [monthStr, yearStr].map((str) => +str);\n const s = yearStr.length === 2 ? year % 100 : year;\n return yearStr.length < 2 || yearStr.length === 3 ? (options.ignoreIncomplete ? null : makeValidationError('incomplete')) : makeValidationError(validateExpiry(s, month, options));\n}\n\nexport function validateAnyIncomplete(formatted: ReturnType, str: string, options: PatternValidationOptions = {}) {\n return formatted.meta.autocorrectComplete || options.ignoreIncomplete ? null : makeValidationError('incomplete');\n}\n","const NBSP = 'โ€Ž';\nexport default NBSP;\n","/*\n * 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 from '../helpers/eventListenerBase';\nimport {TelegramWebViewEvent, TelegramWebViewEventCallback, TelegramWebViewEventMap} from '../types';\n\nconst weakMap: WeakMap = new WeakMap();\nwindow.addEventListener('message', (e) => {\n const callback = weakMap.get(e.source as Window);\n if(!callback) {\n return;\n }\n\n callback(JSON.parse(e.data));\n});\n\nexport default class TelegramWebView extends EventListenerBase<{\n [type in keyof TelegramWebViewEventMap]: (data: TelegramWebViewEventMap[type]) => void\n}> {\n public iframe: HTMLIFrameElement;\n\n constructor({url, sandbox}: {\n url: string,\n sandbox?: string\n }) {\n super(false);\n\n const iframe = this.iframe = document.createElement('iframe');\n iframe.src = url;\n if(sandbox) iframe.setAttribute('sandbox', sandbox);\n }\n\n public onMount() {\n weakMap.set(this.iframe.contentWindow, this.onTelegramWebViewEvent);\n }\n\n public destroy() {\n this.cleanup();\n weakMap.delete(this.iframe.contentWindow);\n }\n\n private onTelegramWebViewEvent = ({eventType, eventData}: TelegramWebViewEvent) => {\n if((eventData as any) === '') {\n eventData = undefined;\n }\n\n console.log('onTelegramWebViewEvent', eventType, eventData);\n this.dispatchEvent(eventType, eventData as any);\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 '.';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport TelegramWebView from '../telegramWebView';\n\nexport function createVerificationIframe(options: ConstructorParameters[0]) {\n const result = new TelegramWebView({\n ...options,\n sandbox: 'allow-forms allow-scripts allow-same-origin allow-modals'\n });\n const {iframe} = result;\n iframe.allow = 'payment';\n iframe.classList.add('payment-verification');\n return result;\n}\n\nexport default class PopupPaymentVerification extends PopupElement<{\n finish: () => void\n}> {\n private telegramWebView: TelegramWebView;\n\n constructor(private url: string, private openPathAfter?: boolean) {\n super('popup-payment popup-payment-verification', {\n closable: true,\n overlayClosable: true,\n body: true,\n title: 'Checkout.WebConfirmation.Title'\n });\n\n this.d();\n }\n\n private d() {\n const telegramWebView = this.telegramWebView = createVerificationIframe({\n url: this.url\n });\n\n telegramWebView.addEventListener('web_app_open_tg_link', (e) => {\n this.dispatchEvent('finish');\n this.hide();\n if(this.openPathAfter) {\n appImManager.openUrl('https://t.me' + e.path_full);\n }\n });\n\n this.body.append(telegramWebView.iframe);\n this.show();\n telegramWebView.onMount();\n }\n\n protected destroy() {\n this.telegramWebView.destroy();\n return super.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 PopupElement from '.';\nimport cardFormattingPatterns from '../../helpers/cards/cardFormattingPatterns';\nimport {detectUnifiedCardBrand} from '../../helpers/cards/cardBrands';\nimport formatInputValueByPattern from '../../helpers/cards/formatInputValueByPattern';\nimport {validateAnyIncomplete, validateCardExpiry, validateCardNumber} from '../../helpers/cards/validateCard';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\nimport noop from '../../helpers/noop';\nimport {PaymentsPaymentForm} from '../../layer';\nimport {LangPackKey, _i18n} from '../../lib/langPack';\nimport CheckboxField from '../checkboxField';\nimport confirmationPopup from '../confirmationPopup';\nimport CountryInputField from '../countryInputField';\nimport InputField, {InputFieldOptions, InputState} from '../inputField';\nimport Row from '../row';\nimport {getPaymentBrandIconPath, PaymentButton, PaymentsCredentialsToken} from './payment';\nimport {createVerificationIframe} from './paymentVerification';\nimport {PasswordInputHelpers} from '../passwordInputField';\nimport SettingSection from '../settingSection';\nimport TelegramWebView from '../telegramWebView';\n\nexport type PaymentCardDetails = {\n cardNumber: string;\n cardholderName: string;\n expiryFull: string;\n expiryMonth: string;\n expiryYear: string;\n cvc: string;\n country: string;\n zip: string;\n save?: boolean;\n};\n\nexport type PaymentCardDetailsShort = {\n title: string,\n save?: boolean;\n icon?: string;\n};\n\nexport type PaymentCardDetailsResult = PaymentCardDetails | PaymentCardDetailsShort;\n\nexport class InputFieldCorrected extends InputField {\n private lastKeyDown: string;\n private lastTransformed: ReturnType;\n\n constructor(public options: InputFieldOptions & {\n formatMethod: typeof cardFormattingPatterns['cardNumber'],\n validateMethod?: typeof validateCardNumber,\n errorKeys?: {[code: string]: LangPackKey},\n optional?: boolean,\n onChange?: (transformed: InputFieldCorrected['lastTransformed']) => void,\n onKeyDown?: (e: KeyboardEvent) => void\n }) {\n super(options);\n\n // const handleIncomplete = (t?: any) => {\n // if(\n // (!lastTransformed.value && t) ||\n // lastTransformed.meta.autocorrectComplete ||\n // lastTransformed.meta.error ||\n // optional\n // ) {\n // return;\n // }\n\n\n // };\n\n this.input.addEventListener('keydown', this.onKeyDown);\n this.input.addEventListener('input', this.onInput);\n this.input.addEventListener('blur', this.onBlur);\n }\n\n private onKeyDown = (e: KeyboardEvent) => {\n this.lastKeyDown = e.key;\n this.options.onKeyDown?.(e);\n };\n\n private onInput = () => {\n const value = this.value;\n const deleting = this.lastKeyDown === 'Backspace' && (((this.lastTransformed && this.lastTransformed.value.length) || 0) - value.length) === 1;\n const result = this.lastTransformed = formatInputValueByPattern({\n value: value,\n getPattern: this.options.formatMethod,\n deleting,\n input: this.input\n });\n\n const transformedValue = result.value;\n if(transformedValue !== value) {\n this.setValueSilently(transformedValue);\n\n if(result.selection) {\n (this.input as HTMLInputElement).selectionStart = result.selection.selectionStart;\n (this.input as HTMLInputElement).selectionEnd = result.selection.selectionEnd;\n }\n }\n\n this.validateNew(transformedValue, {ignoreIncomplete: true/* !result.meta.autocorrectComplete */});\n\n this.options.onChange?.(result);\n };\n\n private onBlur = () => {\n const value = this.lastTransformed?.value;\n if(value) {\n this.validateNew(value);\n }\n };\n\n public update() {\n this.onInput();\n }\n\n public validate = () => {\n return this.validateNew();\n };\n\n public validateNew(\n value = this.lastTransformed?.value ?? '',\n t: any = {},\n justReturn?: boolean\n ) {\n let result: ReturnType;\n if(this.options.validateMethod) {\n result = this.options.validateMethod?.(value, t);\n } else {\n result = validateAnyIncomplete(this.lastTransformed, value, t);\n }\n\n if(result?.code) {\n const langPackKey: LangPackKey = this.options.errorKeys?.[result.code];\n !justReturn && this.setState(InputState.Error, langPackKey);\n return false;\n }\n\n !justReturn && this.setState(InputState.Neutral);\n return true;\n }\n}\n\nexport function handleInputFieldsOnChange(inputFields: (CountryInputField | InputField | InputFieldCorrected)[], _onChange: (valid: boolean) => void) {\n const onChange = () => {\n const valid = inputFields.every((inputField) => {\n return 'validateNew' in inputField ? inputField.validateNew(undefined, undefined, true) : inputField.isValid();\n });\n\n _onChange(valid);\n };\n\n inputFields.forEach((inputField) => {\n if(inputField instanceof InputFieldCorrected) {\n const original = inputField.options.onChange;\n inputField.options.onChange = (...args: any[]) => {\n // @ts-ignore\n original?.(...args);\n onChange();\n };\n\n if('update' in inputField) {\n inputField.update();\n }\n } else {\n inputField.input.addEventListener('input', onChange);\n }\n });\n\n return {validate: onChange};\n}\n\nexport function createCountryZipFields(country?: boolean, zip?: boolean) {\n let countryInputField: CountryInputField, postcodeInputField: InputFieldCorrected;\n if(country || zip) {\n if(country) countryInputField = new CountryInputField({\n noPhoneCodes: true,\n onCountryChange: () => {\n postcodeInputField?.update();\n },\n required: true,\n autocomplete: 'country'\n });\n if(zip) postcodeInputField = new InputFieldCorrected({\n label: 'PaymentShippingZipPlaceholder',\n plainText: true,\n inputMode: 'numeric',\n autocomplete: 'postal-code',\n formatMethod: (/* ...args */) => {\n const {country} = countryInputField.getSelected();\n const iso2 = country?.iso2;\n return cardFormattingPatterns.postalCodeFromCountry(iso2 && iso2.toUpperCase());\n }\n });\n }\n\n return {countryInputField, postcodeInputField};\n}\n\nexport type PaymentsNativeProvider = 'stripe' | 'smartglocal';\nexport type PaymentsNativeParams = {\n need_country?: boolean,\n need_zip?: boolean,\n need_cardholder_name?: boolean,\n publishable_key?: string, // stripe\n public_token?: string, // smartglocal\n gpay_params: string,\n};\nconst SUPPORTED_NATIVE_PROVIDERS: Set = new Set(['stripe', 'smartglocal']);\n\nexport default class PopupPaymentCard extends PopupElement<{\n finish: (obj: {token: any, card: PaymentCardDetailsResult}) => void\n}> {\n protected telegramWebView: TelegramWebView;\n\n constructor(private paymentForm: PaymentsPaymentForm, private savedCard?: PaymentCardDetails) {\n super('popup-payment popup-payment-card', {\n closable: true,\n overlayClosable: true,\n body: true,\n scrollable: SUPPORTED_NATIVE_PROVIDERS.has(paymentForm.native_provider as PaymentsNativeProvider),\n title: 'PaymentCardInfo'\n });\n\n if(SUPPORTED_NATIVE_PROVIDERS.has(paymentForm.native_provider as PaymentsNativeProvider)) {\n this.d();\n } else {\n const telegramWebView = this.telegramWebView = createVerificationIframe({\n url: paymentForm.url\n });\n\n telegramWebView.addEventListener('payment_form_submit', (data) => {\n const cardOut = {title: data.title, save: false} as any as PaymentCardDetails;\n this.dispatchEvent('finish', {\n token: data.credentials,\n card: cardOut\n });\n\n this.hide();\n\n if(paymentForm.pFlags.can_save_credentials) {\n confirmationPopup({\n titleLangKey: 'PaymentCardSavePaymentInformation',\n descriptionLangKey: 'PaymentCardSavePaymentInformationInfoLine1',\n button: {\n langKey: 'Save'\n }\n }).then(() => {\n cardOut.save = true;\n }, noop);\n }\n });\n\n // putPreloader(this.body, true);\n this.body.append(telegramWebView.iframe);\n this.show();\n telegramWebView.onMount();\n }\n }\n\n protected destroy() {\n this.telegramWebView?.destroy();\n return super.destroy();\n }\n\n private d() {\n const savedCard = this.savedCard;\n const cardSection = new SettingSection({name: 'PaymentInfo.Card.Title', noDelimiter: true, noShadow: true});\n\n const nativeParams: PaymentsNativeParams = JSON.parse(this.paymentForm.native_params.data);\n\n let lastBrand: string, brandIconTempId = 0, lastBrandImg: HTMLImageElement;\n const setBrandIcon = (brand: string) => {\n if(lastBrand === brand) {\n return;\n }\n\n const tempId = ++brandIconTempId;\n lastBrand = brand;\n\n const path = getPaymentBrandIconPath(brand);\n if(!path) {\n if(lastBrandImg) {\n lastBrandImg.remove();\n lastBrandImg = undefined;\n }\n\n return;\n }\n\n const img = new Image();\n img.classList.add('input-field-icon');\n renderImageFromUrlPromise(img, path, false).then(() => {\n if(brandIconTempId !== tempId) {\n return;\n }\n\n if(lastBrandImg) {\n lastBrandImg.replaceWith(img);\n } else {\n cardInputField.container.append(img);\n }\n\n lastBrandImg = img;\n });\n };\n const cardInputField = new InputFieldCorrected({\n label: 'PaymentCardNumber',\n plainText: true,\n inputMode: 'numeric',\n autocomplete: 'cc-number',\n formatMethod: cardFormattingPatterns.cardNumber,\n validateMethod: validateCardNumber,\n errorKeys: {\n invalid: 'PaymentCard.Error.Invalid',\n incomplete: 'PaymentCard.Error.Incomplete'\n },\n onChange: (transformed) => {\n setBrandIcon(detectUnifiedCardBrand(transformed.value));\n cvcInputField.update(); // format cvc\n }\n });\n\n let nameInputField: InputField;\n if(nativeParams.need_cardholder_name) nameInputField = new InputField({\n label: 'Checkout.NewCard.CardholderNamePlaceholder',\n maxLength: 255,\n required: true,\n autocomplete: 'cc-name'\n });\n\n const expireInputField = new InputFieldCorrected({\n label: 'SecureId.Identity.Placeholder.ExpiryDate',\n plainText: true,\n inputMode: 'numeric',\n autocomplete: 'cc-exp',\n formatMethod: cardFormattingPatterns.cardExpiry,\n validateMethod: validateCardExpiry\n });\n\n // handle autocomplete: 01/2345 -> 01/45\n expireInputField.input.addEventListener('input', () => {\n let value = expireInputField.value;\n if(value.length < 5) {\n return;\n }\n\n const splitted = value.split('/');\n if(splitted[1].length !== 4) {\n return;\n }\n\n value = [splitted[0], splitted[1].slice(2)].join('/');\n expireInputField.setValueSilently(value);\n }, {capture: true});\n\n const cvcInputField = new InputFieldCorrected({\n labelText: 'CVC',\n plainText: true,\n inputMode: 'numeric',\n autocomplete: 'cc-csc',\n name: 'cvc',\n formatMethod: () => cardFormattingPatterns.cardCvc(cardInputField.value)\n // validateMethod: (...args) => _5AH3.a.cardCvc(cardInputField.value)(...args)\n });\n\n const passwordHelpers = new PasswordInputHelpers(cvcInputField.container, cvcInputField.input as HTMLInputElement);\n\n const switchFocusOrder: (InputFieldCorrected | InputField)[] = [\n cardInputField,\n expireInputField,\n cvcInputField,\n nameInputField\n ].filter(Boolean);\n switchFocusOrder.forEach((inputField) => {\n const onKeyDown = (e: KeyboardEvent) => {\n if(!inputField.value && e.key === 'Backspace') {\n const previousInputField = switchFocusOrder[switchFocusOrder.indexOf(inputField) - 1];\n if(previousInputField) {\n // previousInputField.value = previousInputField.value.slice(0, -1);\n placeCaretAtEnd(previousInputField.input, true);\n }\n }\n };\n\n if(inputField instanceof InputFieldCorrected) {\n inputField.options.onKeyDown = onKeyDown;\n\n const original = inputField.options.onChange;\n inputField.options.onChange = (transformed) => {\n original?.(transformed);\n\n if(document.activeElement === inputField.input && transformed.meta.autocorrectComplete) {\n for(let i = switchFocusOrder.indexOf(inputField), length = switchFocusOrder.length; i < length; ++i) {\n const nextInputField = switchFocusOrder[i];\n if(\n nextInputField instanceof InputFieldCorrected ?\n !nextInputField.validateNew(undefined, undefined, true) :\n !nextInputField.value\n ) {\n placeCaretAtEnd(nextInputField.input, true);\n break;\n }\n }\n }\n };\n } else {\n inputField.input.addEventListener('keydown', onKeyDown);\n }\n });\n\n const inputFieldsRow = document.createElement('div');\n inputFieldsRow.classList.add('input-fields-row');\n inputFieldsRow.append(expireInputField.container, cvcInputField.container);\n\n const form = document.createElement('form');\n form.append(...[\n cardInputField.container,\n inputFieldsRow,\n nameInputField?.container\n ].filter(Boolean))\n\n cardSection.content.append(form);\n\n let billingSection: SettingSection;\n // let saveCheckboxField: CheckboxField;\n const {countryInputField, postcodeInputField} = createCountryZipFields(nativeParams.need_country, nativeParams.need_zip);\n if(nativeParams.need_country || nativeParams.need_zip) {\n billingSection = new SettingSection({name: 'PaymentInfo.Billing.Title', noDelimiter: true, noShadow: true});\n\n // const inputFieldsRow2 = inputFieldsRow.cloneNode() as HTMLElement;\n // inputFieldsRow2.append(countryInputField.container, postcodeInputField.container);\n // billingSection.content.append(inputFieldsRow2);\n billingSection.content.append(...[countryInputField, postcodeInputField].filter(Boolean).map((i) => i.container));\n }\n\n const canSave = !!this.paymentForm.pFlags.can_save_credentials;\n const saveCheckboxField = new CheckboxField({\n text: 'PaymentCardSavePaymentInformation',\n checked: !!canSave\n });\n const saveRow = new Row({\n checkboxField: saveCheckboxField,\n subtitleLangKey: canSave ? 'PaymentCardSavePaymentInformationInfoLine1' : 'Checkout.2FA.Text'\n });\n\n if(!canSave) {\n saveRow.container.classList.add('is-disabled');\n }\n\n (billingSection || cardSection).content.append(saveRow.container);\n\n this.scrollable.append(...[cardSection, billingSection].filter(Boolean).map((s) => s.container));\n\n const payButton = PaymentButton({\n key: 'PaymentInfo.Done',\n onClick: async() => {\n const data: PaymentCardDetails = {\n cardNumber: cardInputField.value,\n expiryFull: expireInputField.value,\n expiryMonth: expireInputField.value.split('/')[0],\n expiryYear: expireInputField.value.split('/')[1],\n cvc: cvcInputField.value,\n\n cardholderName: nameInputField?.value,\n country: countryInputField?.value,\n zip: postcodeInputField?.value,\n\n save: saveCheckboxField?.checked\n };\n\n const nativeProvider: PaymentsNativeProvider = this.paymentForm.native_provider as any;\n let out: PaymentsCredentialsToken;\n if(nativeProvider === 'stripe') {\n const url = new URL('https://api.stripe.com/v1/tokens');\n url.search = new URLSearchParams({\n 'card[number]': data.cardNumber,\n 'card[exp_month]': data.expiryMonth,\n 'card[exp_year]': data.expiryYear,\n 'card[cvc]': data.cvc,\n 'card[address_zip]': data.zip,\n 'card[address_country]': data.country,\n 'card[name]': data.cardholderName\n }).toString();\n\n const response = await fetch(url.toString(), {\n method: 'POST',\n credentials: 'same-origin',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'Authorization': `Bearer ${nativeParams.publishable_key}`\n }\n });\n\n out = await response.json();\n } else if(nativeProvider === 'smartglocal') {\n const params = {\n card: {\n number: data.cardNumber.replace(/[^\\d]+/g, ''),\n expiration_month: data.expiryMonth,\n expiration_year: data.expiryYear,\n security_code: data.cvc.replace(/[^\\d]+/g, '')\n }\n };\n\n const url = /* DEBUG_PAYMENT_SMART_GLOCAL */false ?\n 'https://tgb-playground.smart-glocal.com/cds/v1/tokenize/card' :\n 'https://tgb.smart-glocal.com/cds/v1/tokenize/card';\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n 'X-PUBLIC-TOKEN': nativeParams.public_token\n },\n body: JSON.stringify(params)\n });\n\n const json: { // smartglocal\n data: {\n info: {\n card_network: string,\n card_type: string,\n masked_card_number: string\n },\n token: string\n },\n status: 'ok'\n } = await response.json();\n\n out = {type: 'card', token: json.data.token}\n }\n\n this.dispatchEvent('finish', {token: out, card: data});\n this.hide();\n }\n });\n\n const inputFields = ([\n cardInputField,\n nameInputField,\n expireInputField,\n cvcInputField,\n countryInputField,\n postcodeInputField\n ] as const).filter(Boolean);\n handleInputFieldsOnChange(inputFields, (valid) => {\n payButton.disabled = !valid;\n // payButton.classList.toggle('btn-disabled', !valid);\n });\n\n if(savedCard) {\n cardInputField.value = savedCard.cardNumber;\n expireInputField.value = savedCard.expiryFull;\n cvcInputField.value = savedCard.cvc;\n nameInputField && (nameInputField.value = savedCard.cardholderName);\n countryInputField && (countryInputField.value = savedCard.country);\n postcodeInputField && (postcodeInputField.value = savedCard.zip);\n }\n\n this.body.append(this.btnConfirmOnEnter = payButton);\n\n this.show();\n\n if(!cardInputField.validateNew(undefined, undefined, true)) {\n placeCaretAtEnd(cardInputField.input);\n }\n }\n}\n","import formatValueByPattern from './formatValueByPattern';\n\nexport default function formatInputValueByPattern(options: {\n value: string,\n getPattern: Parameters[0],\n deleting?: boolean,\n input?: HTMLElement\n}) {\n const {value: originalValue, getPattern, deleting, input} = options;\n const pushRest = !deleting && !!originalValue.length;\n const result = formatValueByPattern(getPattern, originalValue, {\n selectionStart: input ? (input as HTMLInputElement).selectionStart : 0,\n selectionEnd: input ? (input as HTMLInputElement).selectionEnd : 0\n }, pushRest)\n const {value, selection} = result;\n\n return {\n value,\n meta: {\n autocorrectComplete: result.autocorrectComplete,\n empty: !value\n },\n selection\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 '.';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {AccountPassword, AccountTmpPassword} from '../../layer';\nimport {InputState} from '../inputField';\nimport PasswordInputField from '../passwordInputField';\nimport SettingSection from '../settingSection';\nimport {PaymentButton} from './payment';\n\nexport default class PopupPaymentCardConfirmation extends PopupElement<{\n finish: (tmpPassword: AccountTmpPassword) => void\n}> {\n constructor(card: string, passwordState: AccountPassword) {\n super('popup-payment popup-payment-card-confirmation', {\n closable: true,\n overlayClosable: true,\n body: true,\n scrollable: true,\n title: 'Checkout.PasswordEntry.Title'\n });\n\n const section = new SettingSection({noDelimiter: true, noShadow: true, caption: 'Checkout.PasswordEntry.Text', captionArgs: [card]});\n const passwordInputField = new PasswordInputField({labelText: passwordState.hint});\n section.content.append(passwordInputField.container);\n this.scrollable.append(section.container);\n\n const onInput = () => {\n payButton.disabled = !passwordInputField.value;\n passwordInputField.setState(InputState.Neutral);\n };\n\n passwordInputField.input.addEventListener('input', onInput);\n\n const payButton = PaymentButton({\n key: 'Checkout.PasswordEntry.Pay',\n onClick: async() => {\n try {\n const inputCheckPassword = await this.managers.passwordManager.getInputCheckPassword(passwordInputField.value, passwordState);\n const tmpPassword = await this.managers.apiManager.invokeApi('account.getTmpPassword', {\n password: inputCheckPassword,\n period: 60\n });\n\n this.dispatchEvent('finish', tmpPassword);\n this.hide();\n } catch(err) {\n if((err as ApiError).type === 'PASSWORD_HASH_INVALID') {\n (err as ApiError).handled = true;\n passwordInputField.setError('PASSWORD_HASH_INVALID');\n }\n\n throw err;\n }\n }\n });\n this.body.append(this.btnConfirmOnEnter = payButton);\n\n onInput();\n\n this.show();\n\n placeCaretAtEnd(passwordInputField.input);\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 '.';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {InputInvoice, PaymentRequestedInfo, PaymentsPaymentForm, PaymentsValidatedRequestedInfo} from '../../layer';\nimport matchEmail from '../../lib/richTextProcessor/matchEmail';\nimport CheckboxField from '../checkboxField';\nimport CountryInputField from '../countryInputField';\nimport InputField from '../inputField';\nimport Row from '../row';\nimport SettingSection from '../settingSection';\nimport TelInputField from '../telInputField';\nimport {PaymentButton} from './payment';\nimport {createCountryZipFields, handleInputFieldsOnChange, InputFieldCorrected} from './paymentCard';\n\nexport type PaymentShippingAddress = PaymentRequestedInfo;\n\ntype ShippingFocusField = 'name' | 'email' | 'phone';\n\nexport default class PopupPaymentShipping extends PopupElement<{\n finish: (o: {shippingAddress: PaymentShippingAddress, requestedInfo: PaymentsValidatedRequestedInfo}) => void\n}> {\n constructor(\n private paymentForm: PaymentsPaymentForm,\n private inputInvoice: InputInvoice,\n private focus?: ShippingFocusField\n ) {\n super('popup-payment popup-payment-shipping', {\n closable: true,\n overlayClosable: true,\n body: true,\n scrollable: true,\n title: 'PaymentShippingInfo'\n });\n\n this.d();\n }\n\n private d() {\n const paymentForm = this.paymentForm;\n const invoice = paymentForm.invoice;\n const savedInfo = this.paymentForm.saved_info;\n\n let addressSection: SettingSection,\n address1InputField: InputField,\n address2InputField: InputField,\n cityInputField: InputField,\n stateInputField: InputField,\n countryInputField: CountryInputField,\n postcodeInputField: InputFieldCorrected;\n if(invoice.pFlags.shipping_address_requested) {\n addressSection = new SettingSection({name: 'PaymentShippingAddress', noDelimiter: true, noShadow: true});\n address1InputField = new InputField({label: 'PaymentShippingAddress1Placeholder', maxLength: 64, required: true});\n address2InputField = new InputField({label: 'PaymentShippingAddress2Placeholder', maxLength: 64});\n cityInputField = new InputField({label: 'PaymentShippingCityPlaceholder', maxLength: 64, required: true});\n stateInputField = new InputField({label: 'PaymentShippingStatePlaceholder', maxLength: 64});\n const res = createCountryZipFields(true, true);\n countryInputField = res.countryInputField;\n postcodeInputField = res.postcodeInputField;\n\n addressSection.content.append(...[\n address1InputField,\n address2InputField,\n cityInputField,\n stateInputField,\n countryInputField,\n postcodeInputField\n ].filter(Boolean).map((inputField) => inputField.container));\n }\n\n let receiverSection: SettingSection;\n let nameInputField: InputField, emailInputField: InputField, telInputField: TelInputField;\n if([invoice.pFlags.name_requested, invoice.pFlags.email_requested, invoice.pFlags.phone_requested].includes(true)) {\n receiverSection = new SettingSection({name: 'PaymentShippingReceiver', noDelimiter: true, noShadow: true});\n\n const validateEmail = () => {\n const value = emailInputField.value;\n const match = matchEmail(value);\n if(!match || match[0].length !== value.length) {\n return false;\n }\n\n return true;\n };\n\n const validatePhone = () => {\n return !!telInputField.value.match(/\\d/);\n };\n\n if(invoice.pFlags.name_requested) nameInputField = new InputField({label: 'PaymentShippingName', maxLength: 256, required: true});\n if(invoice.pFlags.email_requested) emailInputField = new InputField({label: 'PaymentShippingEmailPlaceholder', maxLength: 64, required: true, validate: validateEmail});\n if(invoice.pFlags.phone_requested) telInputField = new TelInputField({required: true, validate: validatePhone});\n\n receiverSection.content.append(...[\n nameInputField,\n emailInputField,\n telInputField\n ].filter(Boolean).map((inputField) => inputField.container));\n }\n\n const saveCheckboxField = new CheckboxField({\n text: 'PaymentShippingSave',\n checked: true\n });\n const saveRow = new Row({\n checkboxField: saveCheckboxField,\n subtitleLangKey: 'PaymentShippingSaveInfo'\n });\n\n (receiverSection || addressSection).content.append(saveRow.container);\n\n this.scrollable.append(...[addressSection, receiverSection].filter(Boolean).map((section) => section.container));\n\n const payButton = PaymentButton({\n key: 'PaymentInfo.Done',\n onClick: async() => {\n const selectedCountry = countryInputField && countryInputField.getSelected().country;\n const data: PaymentShippingAddress = {\n _: 'paymentRequestedInfo',\n shipping_address: selectedCountry && {\n _: 'postAddress',\n street_line1: address1InputField.value,\n street_line2: address2InputField.value,\n city: cityInputField.value,\n state: stateInputField.value,\n // country: countryInputField.value,\n country_iso2: selectedCountry?.iso2,\n post_code: postcodeInputField.value\n },\n name: nameInputField?.value,\n email: emailInputField?.value,\n phone: telInputField?.value\n };\n\n try {\n const requestedInfo = await this.managers.appPaymentsManager.validateRequestedInfo(this.inputInvoice, data, saveCheckboxField?.checked);\n\n this.dispatchEvent('finish', {\n shippingAddress: data,\n requestedInfo\n });\n\n this.hide();\n } catch(err: any) {\n const errorMap: {[err: string]: InputField} = {\n ADDRESS_STREET_LINE1_INVALID: address1InputField,\n ADDRESS_STREET_LINE2_INVALID: address2InputField,\n ADDRESS_COUNTRY_INVALID: countryInputField,\n ADDRESS_CITY_INVALID: cityInputField,\n ADDRESS_STATE_INVALID: stateInputField,\n ADDRESS_POSTCODE_INVALID: postcodeInputField,\n\n REQ_INFO_NAME_INVALID: nameInputField,\n REQ_INFO_EMAIL_INVALID: emailInputField,\n REQ_INFO_PHONE_INVALID: telInputField\n };\n\n const inputField = errorMap[(err as ApiError).type];\n if(inputField) {\n inputField.setError();\n (err as any).handled = true;\n }\n\n throw err;\n }\n }\n });\n this.body.append(this.btnConfirmOnEnter = payButton);\n\n if(savedInfo) {\n const shippingAddress = savedInfo.shipping_address;\n if(shippingAddress) {\n address1InputField.value = shippingAddress.street_line1;\n address2InputField.value = shippingAddress.street_line2;\n cityInputField.value = shippingAddress.city;\n stateInputField.value = shippingAddress.state;\n countryInputField.selectCountryByIso2(shippingAddress.country_iso2);\n postcodeInputField.value = shippingAddress.post_code;\n }\n\n savedInfo.name && nameInputField && (nameInputField.value = savedInfo.name);\n savedInfo.email && emailInputField && (emailInputField.value = savedInfo.email);\n savedInfo.phone && telInputField && (telInputField.value = savedInfo.phone);\n }\n\n const {validate} = handleInputFieldsOnChange([\n address1InputField,\n address2InputField,\n cityInputField,\n stateInputField,\n countryInputField,\n postcodeInputField,\n nameInputField,\n emailInputField,\n telInputField\n ].filter(Boolean), (valid) => {\n payButton.disabled = !valid;\n });\n\n validate();\n\n this.show();\n\n let focusField: InputField;\n if(this.focus) {\n const focusMap: {[field in ShippingFocusField]?: InputField} = {\n name: nameInputField,\n email: emailInputField,\n phone: telInputField\n };\n\n focusField = focusMap[this.focus];\n } else {\n focusField = address1InputField;\n }\n\n if(focusField) {\n placeCaretAtEnd(focusField.input);\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 PopupElement from '.';\nimport accumulate from '../../helpers/array/accumulate';\nimport paymentsWrapCurrencyAmount from '../../helpers/paymentsWrapCurrencyAmount';\nimport {PaymentsPaymentForm, PaymentsValidatedRequestedInfo, ShippingOption} from '../../layer';\nimport RadioField from '../radioField';\nimport Row, {RadioFormFromRows} from '../row';\nimport SettingSection from '../settingSection';\nimport {PaymentButton} from './payment';\n\nexport default class PopupPaymentShippingMethods extends PopupElement<{\n finish: (shippingOption: ShippingOption) => void\n}> {\n constructor(\n private paymentForm: PaymentsPaymentForm,\n private requestedInfo: PaymentsValidatedRequestedInfo,\n private shippingOption: ShippingOption\n ) {\n super('popup-payment popup-payment-shipping-methods', {\n closable: true,\n overlayClosable: true,\n body: true,\n scrollable: true,\n title: 'PaymentShippingMethod'\n });\n\n this.d();\n }\n\n private d() {\n const section = new SettingSection({name: 'PaymentCheckoutShippingMethod', noDelimiter: true, noShadow: true});\n\n const rows = this.requestedInfo.shipping_options.map((shippingOption) => {\n return new Row({\n radioField: new RadioField({\n text: shippingOption.title,\n name: 'shipping-method',\n value: shippingOption.id\n }),\n subtitle: paymentsWrapCurrencyAmount(\n accumulate(shippingOption.prices.map(({amount}) => +amount), 0),\n this.paymentForm.invoice.currency\n )\n });\n });\n\n let lastShippingId: string;\n const form = RadioFormFromRows(rows, (value) => {\n lastShippingId = value;\n });\n\n if(this.shippingOption) {\n rows.find((row) => row.radioField.input.value === this.shippingOption.id).radioField.checked = true;\n } else {\n rows[0].radioField.checked = true;\n }\n\n section.content.append(form);\n\n this.scrollable.append(section.container);\n\n const payButton = PaymentButton({\n key: 'PaymentInfo.Done',\n onClick: () => {\n this.dispatchEvent('finish', this.requestedInfo.shipping_options.find((option) => option.id === lastShippingId));\n this.hide();\n }\n });\n this.body.append(this.btnConfirmOnEnter = payButton);\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 PopupElement from '.';\nimport Currencies from '../../config/currencies';\nimport {FontFamily, FontSize} from '../../config/font';\nimport accumulate from '../../helpers/array/accumulate';\nimport getTextWidth from '../../helpers/canvas/getTextWidth';\nimport {detectUnifiedCardBrand} from '../../helpers/cards/cardBrands';\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport findUpAsChild from '../../helpers/dom/findUpAsChild';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport toggleDisability from '../../helpers/dom/toggleDisability';\nimport {formatPhoneNumber} from '../../helpers/formatPhoneNumber';\nimport paymentsWrapCurrencyAmount from '../../helpers/paymentsWrapCurrencyAmount';\nimport ScrollSaver from '../../helpers/scrollSaver';\nimport tsNow from '../../helpers/tsNow';\nimport {AccountTmpPassword, InputInvoice, InputPaymentCredentials, LabeledPrice, Message, MessageMedia, PaymentRequestedInfo, PaymentSavedCredentials, PaymentsPaymentForm, PaymentsPaymentReceipt, PaymentsValidatedRequestedInfo, PostAddress, ShippingOption} from '../../layer';\nimport I18n, {i18n, LangPackKey, _i18n} from '../../lib/langPack';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\nimport rootScope from '../../lib/rootScope';\nimport AvatarElement from '../avatar';\nimport Button from '../button';\nimport CheckboxField from '../checkboxField';\nimport PeerTitle from '../peerTitle';\nimport {putPreloader} from '../putPreloader';\nimport Row from '../row';\nimport {toastNew} from '../toast';\nimport wrapPeerTitle from '../wrappers/peerTitle';\nimport wrapPhoto from '../wrappers/photo';\nimport PopupPaymentCard, {PaymentCardDetails, PaymentCardDetailsResult} from './paymentCard';\nimport PopupPaymentCardConfirmation from './paymentCardConfirmation';\nimport PopupPaymentShipping, {PaymentShippingAddress} from './paymentShipping';\nimport PopupPaymentShippingMethods from './paymentShippingMethods';\nimport PopupPaymentVerification from './paymentVerification';\n\nconst iconPath = 'assets/img/';\nconst icons = [\n 'amex',\n 'card',\n 'diners',\n 'discover',\n 'jcb',\n 'mastercard',\n 'visa',\n 'unionpay',\n 'mir',\n 'logo'\n];\n\nexport function getPaymentBrandIconPath(brand: string) {\n if(!icons.includes(brand)) {\n return;\n }\n\n return `${iconPath}${brand}.svg`;\n}\n\nexport function PaymentButton(options: {\n onClick: () => Promise | void,\n key?: LangPackKey,\n textEl?: I18n.IntlElement\n}) {\n const textEl = options.textEl ?? new I18n.IntlElement({key: options.key ?? 'PaymentInfo.Done'});\n const key = textEl.key;\n const payButton = Button('btn-primary btn-color-primary payment-item-pay');\n payButton.append(textEl.element);\n attachClickEvent(payButton, async() => {\n const result = options.onClick();\n if(!(result instanceof Promise)) {\n return;\n }\n\n const d = putPreloader(payButton);\n const toggle = toggleDisability([payButton], true);\n textEl.compareAndUpdate({key: 'PleaseWait'});\n try {\n await result;\n } catch(err) {\n if(!(err as any).handled) {\n console.error('payment button error', err);\n }\n\n toggle();\n textEl.compareAndUpdate({key});\n d.remove();\n }\n });\n return payButton;\n}\n\nexport type PaymentsCredentialsToken = {type: 'card', token?: string, id?: string};\n\nexport default class PopupPayment extends PopupElement {\n private tipButtonsMap: Map;\n\n constructor(\n private message: Message.message,\n private inputInvoice: InputInvoice,\n private paymentForm?: PaymentsPaymentForm | PaymentsPaymentReceipt,\n private isReceipt?: boolean\n ) {\n super('popup-payment', {\n closable: true,\n overlayClosable: true,\n body: true,\n scrollable: true,\n title: true\n });\n\n this.tipButtonsMap = new Map();\n this.d().catch((err) => {\n console.error('payment popup error', err);\n this.hide();\n });\n }\n\n private async d() {\n this.element.classList.add('is-loading');\n this.show();\n\n let confirmed = false;\n const onConfirmed = () => {\n if(confirmed) {\n return;\n }\n\n confirmed = true;\n if(popupPaymentVerification) {\n popupPaymentVerification.hide();\n }\n\n this.hide();\n };\n\n let {paymentForm, message} = this;\n\n if(message) {\n this.listenerSetter.add(rootScope)('payment_sent', ({peerId, mid}) => {\n if(message.peerId === peerId && message.mid === mid) {\n onConfirmed();\n }\n });\n }\n\n const mediaInvoice = message?.media as MessageMedia.messageMediaInvoice;\n const isReceipt = this.isReceipt ??\n (\n mediaInvoice ?\n !!mediaInvoice.receipt_msg_id || mediaInvoice.extended_media?._ === 'messageExtendedMedia' :\n paymentForm._ === 'payments.paymentReceipt'\n );\n const isTest = mediaInvoice ? mediaInvoice.pFlags.test : paymentForm.invoice.pFlags.test;\n\n const photo = mediaInvoice ? mediaInvoice.photo : paymentForm.photo;\n const title = mediaInvoice ? mediaInvoice.title : paymentForm.title;\n const description = mediaInvoice ? mediaInvoice.description : paymentForm.description;\n\n _i18n(this.title, isReceipt ? 'PaymentReceipt' : 'PaymentCheckout');\n if(isTest) {\n this.title.append(' (Test)');\n }\n\n const className = 'payment-item';\n\n const itemEl = document.createElement('div');\n itemEl.classList.add(className);\n\n const detailsClassName = className + '-details';\n const details = document.createElement('div');\n details.classList.add(detailsClassName);\n\n let photoEl: HTMLElement;\n if(photo) {\n photoEl = document.createElement('div');\n photoEl.classList.add(detailsClassName + '-photo', 'media-container-contain');\n wrapPhoto({\n photo: photo,\n container: photoEl,\n boxWidth: 100,\n boxHeight: 100,\n size: {_: 'photoSizeEmpty', type: ''}\n });\n details.append(photoEl);\n }\n\n const linesClassName = detailsClassName + '-lines';\n const linesEl = document.createElement('div');\n linesEl.classList.add(linesClassName);\n\n const titleEl = document.createElement('div');\n titleEl.classList.add(linesClassName + '-title');\n\n const descriptionEl = document.createElement('div');\n descriptionEl.classList.add(linesClassName + '-description');\n\n const botName = document.createElement('div');\n botName.classList.add(linesClassName + '-bot-name');\n\n linesEl.append(titleEl, descriptionEl, botName);\n\n setInnerHTML(titleEl, wrapEmojiText(title));\n setInnerHTML(descriptionEl, wrapEmojiText(description));\n\n const peerTitle = new PeerTitle();\n botName.append(peerTitle.element);\n\n details.append(linesEl);\n itemEl.append(details);\n this.scrollable.append(itemEl);\n\n const preloaderContainer = document.createElement('div');\n preloaderContainer.classList.add(className + '-preloader-container');\n const preloader = putPreloader(preloaderContainer, true);\n this.scrollable.container.append(preloaderContainer);\n\n const inputInvoice = this.inputInvoice;\n if(!paymentForm) {\n if(isReceipt) paymentForm = await this.managers.appPaymentsManager.getPaymentReceipt(message.peerId, mediaInvoice.receipt_msg_id || (inputInvoice as InputInvoice.inputInvoiceMessage).msg_id);\n else paymentForm = await this.managers.appPaymentsManager.getPaymentForm(inputInvoice);\n this.paymentForm = paymentForm;\n }\n\n let savedInfo = (paymentForm as PaymentsPaymentForm).saved_info || (paymentForm as PaymentsPaymentReceipt).info;\n const savedCredentials = (paymentForm as PaymentsPaymentForm).saved_credentials?.[0];\n let [lastRequestedInfo, passwordState, providerPeerTitle] = await Promise.all([\n !isReceipt && savedInfo && this.managers.appPaymentsManager.validateRequestedInfo(inputInvoice, savedInfo),\n savedCredentials && this.managers.passwordManager.getState(),\n wrapPeerTitle({peerId: paymentForm.provider_id.toPeerId()})\n ]);\n\n // console.log(paymentForm, lastRequestedInfo);\n\n await peerTitle.update({peerId: paymentForm.bot_id.toPeerId()});\n preloaderContainer.remove();\n this.element.classList.remove('is-loading');\n\n const wrapAmount = (amount: string | number, skipSymbol?: boolean) => {\n return paymentsWrapCurrencyAmount(amount, currency, skipSymbol);\n };\n\n const {invoice} = paymentForm;\n const currency = invoice.currency;\n\n const isRecurring = invoice.pFlags.recurring && !isReceipt;\n\n await peerTitle.update({peerId: paymentForm.bot_id.toPeerId()});\n const peerTitle2 = isRecurring ? await wrapPeerTitle({peerId: paymentForm.bot_id.toPeerId()}) : undefined;\n preloaderContainer.remove();\n this.element.classList.remove('is-loading');\n\n const makeLabel = () => {\n const labelEl = document.createElement('div');\n labelEl.classList.add(pricesClassName + '-price');\n\n const left = document.createElement('span');\n const right = document.createElement('span');\n labelEl.append(left, right);\n return {label: labelEl, left, right};\n };\n\n const pricesClassName = className + '-prices';\n const prices = document.createElement('div');\n prices.classList.add(pricesClassName);\n const makePricesElements = (prices: LabeledPrice[]) => {\n return prices.map((price) => {\n const {amount, label} = price;\n\n const _label = makeLabel();\n _label.left.textContent = label;\n\n const wrappedAmount = wrapAmount(amount);\n _label.right.textContent = wrappedAmount;\n\n return _label.label;\n });\n };\n\n const pricesElements = makePricesElements(invoice.prices);\n\n let getTipsAmount = (): number => 0;\n let shippingAmount = 0;\n\n const getTotalTotal = () => totalAmount + getTipsAmount() + shippingAmount;\n const setTotal = () => {\n const wrapped = wrapAmount(getTotalTotal());\n totalLabel.right.textContent = wrapped;\n payI18n.compareAndUpdate({\n key: 'PaymentCheckoutPay',\n args: [wrapped]\n });\n };\n\n const payI18n = new I18n.IntlElement();\n\n const totalLabel = makeLabel();\n totalLabel.label.classList.add('is-total');\n _i18n(totalLabel.left, 'PaymentTransactionTotal');\n const totalAmount = accumulate(invoice.prices.map(({amount}) => +amount), 0);\n\n const canTip = (invoice.max_tip_amount !== undefined && !isReceipt) || !!(paymentForm as PaymentsPaymentReceipt).tip_amount;\n if(canTip) {\n const tipsClassName = className + '-tips';\n\n const currencyData = Currencies[currency];\n\n getTipsAmount = () => +getInputValue().replace(/\\D/g, '');\n\n const getInputValue = () => {\n // return input.textContent;\n return input.value;\n };\n\n const setInputWidth = () => {\n const width = getTextWidth(getInputValue(), `500 ${FontSize} ${FontFamily}`);\n input.style.width = width + 'px';\n };\n\n const setInputValue = (amount: string | number) => {\n amount = Math.min(+amount, +invoice.max_tip_amount);\n const wrapped = wrapAmount(amount, true);\n\n input.value = wrapped;\n // input.textContent = wrapped;\n if(document.activeElement === input) {\n placeCaretAtEnd(input);\n }\n\n unsetActiveTip && unsetActiveTip();\n const tipEl = this.tipButtonsMap.get(amount);\n if(tipEl) {\n tipEl.classList.add('active');\n }\n\n setInputWidth();\n setTotal();\n };\n\n const tipsLabel = makeLabel();\n _i18n(tipsLabel.left, isReceipt ? 'PaymentTip' : 'PaymentTipOptional');\n const input = document.createElement('input');\n input.type = 'tel';\n // const input: HTMLElement = document.createElement('div');\n // input.contentEditable = 'true';\n input.classList.add('input-clear', tipsClassName + '-input');\n tipsLabel.right.append(input);\n\n if(!isReceipt) {\n tipsLabel.label.style.cursor = 'text';\n } else {\n tipsLabel.label.classList.add('disable-hover');\n }\n\n tipsLabel.label.addEventListener('mousedown', (e) => {\n if(!findUpAsChild(e.target as HTMLElement, input)) {\n placeCaretAtEnd(input);\n }\n });\n\n const haveToIgnoreEvents = input instanceof HTMLInputElement ? 1 : 2;\n const onSelectionChange = () => {\n if(ignoreNextSelectionChange) {\n --ignoreNextSelectionChange;\n return;\n }\n\n // setTimeout(() => {\n ignoreNextSelectionChange = haveToIgnoreEvents;\n placeCaretAtEnd(input);\n // }, 0);\n };\n\n const onFocus = () => {\n // cancelEvent(e);\n setTimeout(() => {\n ignoreNextSelectionChange = haveToIgnoreEvents;\n placeCaretAtEnd(input);\n document.addEventListener('selectionchange', onSelectionChange);\n }, 0);\n };\n\n const onFocusOut = () => {\n input.addEventListener('focus', onFocus, {once: true});\n document.removeEventListener('selectionchange', onSelectionChange);\n };\n\n let ignoreNextSelectionChange: number;\n input.addEventListener('focusout', onFocusOut);\n onFocusOut();\n\n input.addEventListener('input', () => {\n setInputValue(getTipsAmount());\n });\n\n const s = [currencyData.symbol, currencyData.space_between ? ' ' : ''];\n if(!currencyData.symbol_left) s.reverse();\n tipsLabel.right[currencyData.symbol_left ? 'prepend' : 'append'](s.join(''));\n\n pricesElements.push(tipsLabel.label);\n\n //\n let unsetActiveTip: () => void;\n if(!isReceipt) {\n const tipsEl = document.createElement('div');\n tipsEl.classList.add(tipsClassName);\n\n const tipClassName = tipsClassName + '-tip';\n const tipButtons = invoice.suggested_tip_amounts.map((tipAmount) => {\n const button = Button(tipClassName, {noRipple: true});\n button.textContent = wrapAmount(tipAmount);\n\n this.tipButtonsMap.set(+tipAmount, button);\n return button;\n });\n\n unsetActiveTip = () => {\n const prevTipEl = tipsEl.querySelector('.active');\n if(prevTipEl) {\n prevTipEl.classList.remove('active');\n }\n };\n\n attachClickEvent(tipsEl, (e) => {\n const tipEl = findUpClassName(e.target, tipClassName);\n if(!tipEl) {\n return;\n }\n\n let tipAmount = 0;\n if(tipEl.classList.contains('active')) {\n tipEl.classList.remove('active');\n } else {\n unsetActiveTip();\n tipEl.classList.add('active');\n\n for(const [amount, el] of this.tipButtonsMap) {\n if(el === tipEl) {\n tipAmount = amount;\n break;\n }\n }\n }\n\n setInputValue(tipAmount);\n });\n\n setInputValue(0);\n\n tipsEl.append(...tipButtons);\n pricesElements.push(tipsEl);\n } else {\n setInputValue((paymentForm as PaymentsPaymentReceipt).tip_amount);\n }\n } else {\n setTotal();\n }\n\n pricesElements.push(totalLabel.label);\n\n prices.append(...pricesElements);\n itemEl.append(prices);\n\n // /\n\n const setRowIcon = async(row: Row, icon?: string) => {\n const img = document.createElement('img');\n img.classList.add('media-photo');\n await renderImageFromUrlPromise(img, getPaymentBrandIconPath(icon));\n let container = row.media;\n if(!container) {\n container = row.createMedia('small');\n container.classList.add('media-container-cover');\n container.append(img);\n } else {\n replaceContent(container, img);\n }\n\n row.container.classList.remove('row-with-icon');\n };\n\n const createRow = (options: ConstructorParameters[0]) => {\n if(options.titleLangKey) {\n options.subtitleLangKey = options.titleLangKey;\n }\n\n options.noWrap = true;\n const row = new Row(options);\n row.container.classList.add(className + '-row');\n\n if(options.titleLangKey) {\n row.subtitle.classList.add('hide');\n }\n\n return row;\n };\n\n const setRowTitle = (row: Row, textContent: string) => {\n row.title.textContent = textContent;\n if(!textContent) {\n const e = I18n.weakMap.get(row.subtitle.firstElementChild as HTMLElement) as I18n.IntlElement;\n row.title.append(i18n(e.key));\n }\n\n row.subtitle.classList.toggle('hide', !textContent);\n };\n\n const setCardSubtitle = (card: PaymentCardDetailsResult) => {\n let brand: string;\n let str: string;\n let icon: string;\n if('title' in card) {\n brand = card.title.split(' ').shift();\n str = card.title;\n icon = card.icon;\n } else {\n brand = detectUnifiedCardBrand(card.cardNumber);\n str = brand + ' *' + card.cardNumber.split(' ').pop();\n }\n\n methodRow.title.classList.remove('tgico', 'tgico-card_outline');\n setRowIcon(methodRow, icon || brand.toLowerCase());\n setRowTitle(methodRow, str);\n };\n\n const onMethodClick = () => {\n new PopupPaymentCard(paymentForm as PaymentsPaymentForm, previousCardDetails as PaymentCardDetails).addEventListener('finish', ({token, card}) => {\n previousToken = token, previousCardDetails = card;\n\n setCardSubtitle(card);\n });\n };\n\n let previousCardDetails: PaymentCardDetailsResult, previousToken: PaymentsCredentialsToken;\n const methodRow = createRow({\n titleLangKey: 'PaymentCheckoutMethod',\n clickable: isReceipt ? undefined : onMethodClick,\n icon: 'card_outline'\n });\n\n methodRow.container.classList.add(className + '-method-row');\n\n if(savedCredentials) {\n setCardSubtitle(savedCredentials);\n } else if((paymentForm as PaymentsPaymentReceipt).credentials_title) {\n setCardSubtitle({title: (paymentForm as PaymentsPaymentReceipt).credentials_title});\n }\n\n const providerRow = createRow({\n title: providerPeerTitle,\n subtitleLangKey: 'PaymentCheckoutProvider'\n });\n\n const providerAvatar = new AvatarElement();\n providerAvatar.classList.add('avatar-32');\n providerRow.createMedia('small').append(providerAvatar);\n /* await */ providerAvatar.updateWithOptions({peerId: paymentForm.provider_id.toPeerId()});\n\n let shippingAddressRow: Row, shippingNameRow: Row, shippingEmailRow: Row, shippingPhoneRow: Row, shippingMethodRow: Row;\n let lastShippingOption: ShippingOption, onShippingAddressClick: (focus?: ConstructorParameters[2]) => void, onShippingMethodClick: () => void;\n const setShippingTitle = invoice.pFlags.shipping_address_requested ? (shippingAddress?: PaymentShippingAddress) => {\n if(!shippingAddress) {\n shippingMethodRow.subtitle.classList.add('hide');\n replaceContent(shippingMethodRow.title, i18n('PaymentShippingAddress'));\n return;\n }\n\n const postAddress = shippingAddress.shipping_address;\n setRowTitle(shippingAddressRow, [postAddress.city, postAddress.street_line1, postAddress.street_line2].filter(Boolean).join(', '));\n\n shippingMethodRow.container.classList.toggle('hide', !lastRequestedInfo && !isReceipt);\n } : undefined;\n\n const setShippingInfo = (info: PaymentRequestedInfo) => {\n setShippingTitle && setShippingTitle(info);\n shippingNameRow && setRowTitle(shippingNameRow, info.name);\n shippingEmailRow && setRowTitle(shippingEmailRow, info.email);\n shippingPhoneRow && setRowTitle(shippingPhoneRow, info.phone && ('+' + formatPhoneNumber(info.phone).formatted));\n };\n\n if(!isReceipt) {\n onShippingAddressClick = (focus) => {\n new PopupPaymentShipping(paymentForm as PaymentsPaymentForm, inputInvoice, focus).addEventListener('finish', ({shippingAddress, requestedInfo}) => {\n lastRequestedInfo = requestedInfo;\n savedInfo = (paymentForm as PaymentsPaymentForm).saved_info = shippingAddress;\n setShippingInfo(shippingAddress);\n });\n };\n }\n\n if(invoice.pFlags.shipping_address_requested) {\n const setShippingOption = (shippingOption?: ShippingOption) => {\n const scrollSaver = new ScrollSaver(this.scrollable, undefined, true);\n scrollSaver.save();\n if(lastShippingPricesElements) {\n lastShippingPricesElements.forEach((node) => node.remove());\n }\n\n if(!shippingOption) {\n shippingAmount = 0;\n\n setTotal();\n scrollSaver.restore();\n this.onContentUpdate();\n return;\n }\n\n lastShippingOption = shippingOption;\n setRowTitle(shippingMethodRow, shippingOption.title);\n\n shippingAmount = accumulate(shippingOption.prices.map(({amount}) => +amount), 0);\n lastShippingPricesElements = makePricesElements(shippingOption.prices);\n let l = totalLabel.label;\n if(canTip) {\n l = l.previousElementSibling as any;\n if(!isReceipt) {\n l = l.previousElementSibling as any;\n }\n }\n\n lastShippingPricesElements.forEach((element) => l.parentElement.insertBefore(element, l));\n\n setTotal();\n scrollSaver.restore();\n this.onContentUpdate();\n };\n\n shippingAddressRow = createRow({\n icon: 'location',\n titleLangKey: 'PaymentShippingAddress',\n clickable: !isReceipt && onShippingAddressClick.bind(null, undefined)\n });\n\n let lastShippingPricesElements: HTMLElement[];\n shippingMethodRow = createRow({\n icon: 'shipping',\n titleLangKey: 'PaymentCheckoutShippingMethod',\n clickable: !isReceipt && (onShippingMethodClick = () => {\n new PopupPaymentShippingMethods(paymentForm as PaymentsPaymentForm, lastRequestedInfo, lastShippingOption).addEventListener('finish', (shippingOption) => {\n setShippingOption(shippingOption);\n });\n })\n });\n\n shippingMethodRow.container.classList.add('hide');\n\n const shippingOption = (paymentForm as PaymentsPaymentReceipt).shipping;\n if(shippingOption) {\n setShippingOption(shippingOption);\n }\n }\n\n if(invoice.pFlags.name_requested) {\n shippingNameRow = createRow({\n icon: 'newprivate',\n titleLangKey: 'PaymentCheckoutName',\n clickable: !isReceipt && onShippingAddressClick.bind(null, 'name')\n });\n }\n\n if(invoice.pFlags.email_requested) {\n shippingEmailRow = createRow({\n icon: 'mention',\n titleLangKey: 'PaymentShippingEmailPlaceholder',\n clickable: !isReceipt && onShippingAddressClick.bind(null, 'email')\n });\n }\n\n if(invoice.pFlags.phone_requested) {\n shippingPhoneRow = createRow({\n icon: 'phone',\n titleLangKey: 'PaymentCheckoutPhoneNumber',\n clickable: !isReceipt && onShippingAddressClick.bind(null, 'phone')\n });\n }\n\n if(savedInfo) {\n setShippingInfo(savedInfo);\n }\n\n const rows = [\n methodRow,\n providerRow,\n shippingAddressRow,\n shippingMethodRow,\n shippingNameRow,\n shippingEmailRow,\n shippingPhoneRow\n ].filter(Boolean);\n\n const acceptTermsCheckboxField = isRecurring && new CheckboxField({\n text: 'Payments.Recurrent.Accept',\n textArgs: [wrapRichText(invoice.recurring_terms_url), peerTitle2]\n });\n\n const acceptTermsRow = isRecurring && createRow({\n checkboxField: acceptTermsCheckboxField\n });\n\n const recurringElements = isRecurring ? [document.createElement('hr'), acceptTermsRow.container] : [];\n\n this.scrollable.append(...[\n document.createElement('hr'),\n ...rows.map((row) => row.container),\n ...recurringElements\n ].filter(Boolean));\n\n // /\n let popupPaymentVerification: PopupPaymentVerification, lastTmpPasword: AccountTmpPassword;\n const onClick = () => {\n const missingInfo = invoice.pFlags.name_requested && !savedInfo?.name ? 'name' : (invoice.pFlags.email_requested && !savedInfo?.email ? 'email' : (invoice.pFlags.phone_requested && !savedInfo?.phone ? 'phone' : undefined));\n if(invoice.pFlags.shipping_address_requested) {\n if(!lastRequestedInfo) {\n onShippingAddressClick();\n return;\n } else if(!lastShippingOption) {\n onShippingMethodClick();\n return;\n }\n } else if(missingInfo) {\n onShippingAddressClick(missingInfo);\n return;\n }\n\n if(!previousCardDetails && !lastTmpPasword) {\n if(!savedCredentials) {\n onMethodClick();\n return;\n }\n\n Promise.resolve(passwordState ?? this.managers.passwordManager.getState()).then((_passwordState) => {\n new PopupPaymentCardConfirmation(savedCredentials.title, _passwordState).addEventListener('finish', (tmpPassword) => {\n passwordState = undefined;\n lastTmpPasword = tmpPassword;\n simulateClickEvent(payButton);\n\n // * reserve 5 seconds\n const diff = tmpPassword.valid_until - tsNow(true) - 5;\n setTimeout(() => {\n if(lastTmpPasword === tmpPassword) {\n lastTmpPasword = undefined;\n }\n }, diff * 1000);\n });\n });\n\n return;\n }\n\n return Promise.resolve().then(async() => {\n const credentials: InputPaymentCredentials = lastTmpPasword ? {\n _: 'inputPaymentCredentialsSaved',\n id: savedCredentials.id,\n tmp_password: lastTmpPasword.tmp_password\n } : {\n _: 'inputPaymentCredentials',\n data: {\n _: 'dataJSON',\n data: JSON.stringify(previousToken.token ? previousToken : {type: previousToken.type, id: previousToken.id})\n },\n pFlags: {\n save: previousCardDetails.save || undefined\n }\n };\n\n try {\n const paymentResult = await this.managers.appPaymentsManager.sendPaymentForm(\n inputInvoice,\n (paymentForm as PaymentsPaymentForm).form_id,\n lastRequestedInfo?.id,\n lastShippingOption?.id,\n credentials,\n getTipsAmount()\n );\n\n if(paymentResult._ === 'payments.paymentResult') {\n onConfirmed();\n } else {\n popupPaymentVerification = new PopupPaymentVerification(paymentResult.url, !mediaInvoice.extended_media);\n popupPaymentVerification.addEventListener('finish', () => {\n popupPaymentVerification = undefined;\n\n onConfirmed();\n });\n await new Promise((resolve, reject) => {\n popupPaymentVerification.addEventListener('close', () => {\n popupPaymentVerification = undefined;\n if(confirmed) {\n resolve();\n } else {\n const err = new Error('payment not finished');\n (err as ApiError).handled = true;\n reject(err);\n }\n });\n });\n }\n } catch(err) {\n if((err as ApiError).type === 'BOT_PRECHECKOUT_TIMEOUT') {\n toastNew({langPackKey: 'Error.AnError'});\n (err as ApiError).handled = true;\n } else if((err as ApiError).type === 'TMP_PASSWORD_INVALID') {\n passwordState = lastTmpPasword = undefined;\n simulateClickEvent(payButton);\n (err as ApiError).handled = true;\n }\n\n throw err;\n }\n });\n };\n\n const onChange = () => {\n payButton.disabled = !!(acceptTermsCheckboxField && !acceptTermsCheckboxField.checked);\n };\n\n let payButton: HTMLButtonElement;\n if(isReceipt) {\n payButton = PaymentButton({\n onClick: () => this.hide(),\n key: 'Done'\n });\n } else {\n payButton = PaymentButton({\n onClick: onClick,\n textEl: payI18n\n });\n }\n\n onChange();\n if(acceptTermsCheckboxField) {\n acceptTermsCheckboxField.input.addEventListener('change', onChange);\n }\n\n this.body.append(this.btnConfirmOnEnter = payButton);\n\n this.onContentUpdate();\n }\n}\n","/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\nFor license and copyright information please follow this link:\nhttps://github.com/telegramdesktop/tdesktop/blob/master/LEGAL\n*/\n\nimport accumulate from '../helpers/array/accumulate';\nimport clamp from '../helpers/number/clamp';\n\ntype Size = {w: number, h: number};\nexport type GroupMediaLayout = {\n geometry: {\n x: number,\n y: number,\n width: number,\n height: number\n },\n sides: number\n};\ntype Attempt = {\n lineCounts: number[],\n heights: number[]\n};\nexport const RectPart = {\n None: 0,\n Top: 1,\n Right: 2,\n Bottom: 4,\n Left: 8\n};\n\n// https://github.com/telegramdesktop/tdesktop/blob/4669c07dc5335cbf4795bbbe5b0ab7c007b9aee2/Telegram/SourceFiles/ui/grouped_layout.cpp\nexport class Layouter {\n private count: number;\n private ratios: number[];\n private proportions: string;\n private averageRatio: number;\n private maxSizeRatio: number;\n\n constructor(private sizes: Size[], private maxWidth: number, private minWidth: number, private spacing: number, private maxHeight = maxWidth) {\n this.count = sizes.length;\n this.ratios = Layouter.countRatios(sizes);\n this.proportions = Layouter.countProportions(this.ratios);\n this.averageRatio = accumulate(this.ratios, 1) / this.count; // warn\n this.maxSizeRatio = maxWidth / this.maxHeight;\n }\n\n public layout(): GroupMediaLayout[] {\n if(!this.count) return [];\n // else if(this.count === 1) return this.layoutOne();\n\n if(this.count >= 5 || this.ratios.find((r) => r > 2)) {\n return new ComplexLayouter(this.ratios, this.averageRatio, this.maxWidth, this.minWidth, this.spacing).layout();\n }\n\n if(this.count === 2) return this.layoutTwo();\n else if(this.count === 3) return this.layoutThree();\n return this.layoutFour();\n }\n\n private layoutTwo(): ReturnType {\n if((this.proportions === 'ww') &&\n (this.averageRatio > 1.4 * this.maxSizeRatio) &&\n (this.ratios[1] - this.ratios[0] < 0.2)) {\n return this.layoutTwoTopBottom();\n } else if(this.proportions === 'ww' || this.proportions === 'qq') {\n return this.layoutTwoLeftRightEqual();\n }\n return this.layoutTwoLeftRight();\n }\n\n private layoutThree(): ReturnType {\n // console.log('layoutThree:', this);\n if(this.proportions[0] === 'n') {\n return this.layoutThreeLeftAndOther();\n }\n return this.layoutThreeTopAndOther();\n }\n\n private layoutFour(): ReturnType {\n if(this.proportions[0] === 'w') {\n return this.layoutFourTopAndOther();\n }\n return this.layoutFourLeftAndOther();\n }\n\n private layoutTwoTopBottom(): ReturnType {\n const width = this.maxWidth;\n const height = Math.round(Math.min(\n width / this.ratios[0],\n Math.min(\n width / this.ratios[1],\n (this.maxHeight - this.spacing) / 2)));\n\n return [\n {\n geometry: {x: 0, y: 0, width, height},\n sides: RectPart.Left | RectPart.Top | RectPart.Right\n },\n {\n geometry: {x: 0, y: height + this.spacing, width, height},\n sides: RectPart.Left | RectPart.Bottom | RectPart.Right\n }\n ];\n }\n\n private layoutTwoLeftRightEqual(): ReturnType {\n const width = (this.maxWidth - this.spacing) / 2;\n const height = Math.round(Math.min(\n width / this.ratios[0],\n Math.min(width / this.ratios[1], this.maxHeight * 1)));\n\n return [\n {\n geometry: {x: 0, y: 0, width, height},\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\n },\n {\n geometry: {x: width + this.spacing, y: 0, width, height},\n sides: RectPart.Top | RectPart.Right | RectPart.Bottom\n }\n ];\n }\n\n private layoutTwoLeftRight(): ReturnType {\n const minimalWidth = Math.round(this.minWidth * 1.5);\n const secondWidth = Math.min(\n Math.round(Math.max(\n 0.4 * (this.maxWidth - this.spacing),\n (this.maxWidth - this.spacing) / this.ratios[0] /\n (1 / this.ratios[0] + 1 / this.ratios[1]))),\n this.maxWidth - this.spacing - minimalWidth);\n const firstWidth = this.maxWidth -\n secondWidth -\n this.spacing;\n const height = Math.min(\n this.maxHeight,\n Math.round(Math.min(\n firstWidth / this.ratios[0],\n secondWidth / this.ratios[1])));\n\n return [\n {\n geometry: {x: 0, y: 0, width: firstWidth, height},\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\n },\n {\n geometry: {x: firstWidth + this.spacing, y: 0, width: secondWidth, height},\n sides: RectPart.Top | RectPart.Right | RectPart.Bottom\n }\n ];\n }\n\n private layoutThreeLeftAndOther(): ReturnType {\n const firstHeight = this.maxHeight;\n const thirdHeight = Math.round(Math.min(\n (this.maxHeight - this.spacing) / 2.,\n (this.ratios[1] * (this.maxWidth - this.spacing) /\n (this.ratios[2] + this.ratios[1]))));\n const secondHeight = firstHeight -\n thirdHeight -\n this.spacing;\n const rightWidth = Math.max(\n this.minWidth,\n Math.round(Math.min(\n (this.maxWidth - this.spacing) / 2.,\n Math.min(\n thirdHeight * this.ratios[2],\n secondHeight * this.ratios[1]))));\n const leftWidth = Math.min(\n Math.round(firstHeight * this.ratios[0]),\n this.maxWidth - this.spacing - rightWidth);\n\n return [\n {\n geometry: {x: 0, y: 0, width: leftWidth, height: firstHeight},\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\n },\n {\n geometry: {x: leftWidth + this.spacing, y: 0, width: rightWidth, height: secondHeight},\n sides: RectPart.Top | RectPart.Right\n },\n {\n geometry: {x: leftWidth + this.spacing, y: secondHeight + this.spacing, width: rightWidth, height: thirdHeight},\n sides: RectPart.Bottom | RectPart.Right\n }\n ];\n }\n\n private layoutThreeTopAndOther(): ReturnType {\n const firstWidth = this.maxWidth;\n const firstHeight = Math.round(Math.min(\n firstWidth / this.ratios[0],\n (this.maxHeight - this.spacing) * 0.66));\n const secondWidth = (this.maxWidth - this.spacing) / 2;\n const secondHeight = Math.min(\n this.maxHeight - firstHeight - this.spacing,\n Math.round(Math.min(\n secondWidth / this.ratios[1],\n secondWidth / this.ratios[2])));\n const thirdWidth = firstWidth - secondWidth - this.spacing;\n\n return [\n {\n geometry: {x: 0, y: 0, width: firstWidth, height: firstHeight},\n sides: RectPart.Left | RectPart.Top | RectPart.Right\n },\n {\n geometry: {x: 0, y: firstHeight + this.spacing, width: secondWidth, height: secondHeight},\n sides: RectPart.Bottom | RectPart.Left\n },\n {\n geometry: {x: secondWidth + this.spacing, y: firstHeight + this.spacing, width: thirdWidth, height: secondHeight},\n sides: RectPart.Bottom | RectPart.Right\n }\n ];\n }\n\n private layoutFourTopAndOther(): ReturnType {\n const w = this.maxWidth;\n const h0 = Math.round(Math.min(\n w / this.ratios[0],\n (this.maxHeight - this.spacing) * 0.66));\n const h = Math.round(\n (this.maxWidth - 2 * this.spacing) /\n (this.ratios[1] + this.ratios[2] + this.ratios[3]));\n const w0 = Math.max(\n this.minWidth,\n Math.round(Math.min(\n (this.maxWidth - 2 * this.spacing) * 0.4,\n h * this.ratios[1])));\n const w2 = Math.round(Math.max(\n Math.max(\n this.minWidth * 1.,\n (this.maxWidth - 2 * this.spacing) * 0.33),\n h * this.ratios[3]));\n const w1 = w - w0 - w2 - 2 * this.spacing;\n const h1 = Math.min(\n this.maxHeight - h0 - this.spacing,\n h);\n\n return [\n {\n geometry: {x: 0, y: 0, width: w, height: h0},\n sides: RectPart.Left | RectPart.Top | RectPart.Right\n },\n {\n geometry: {x: 0, y: h0 + this.spacing, width: w0, height: h1},\n sides: RectPart.Bottom | RectPart.Left\n },\n {\n geometry: {x: w0 + this.spacing, y: h0 + this.spacing, width: w1, height: h1},\n sides: RectPart.Bottom\n },\n {\n geometry: {x: w0 + this.spacing + w1 + this.spacing, y: h0 + this.spacing, width: w2, height: h1},\n sides: RectPart.Right | RectPart.Bottom\n }\n ];\n }\n\n private layoutFourLeftAndOther(): ReturnType {\n const h = this.maxHeight;\n const w0 = Math.round(Math.min(\n h * this.ratios[0],\n (this.maxWidth - this.spacing) * 0.6));\n\n const w = Math.round(\n (this.maxHeight - 2 * this.spacing) /\n (1. / this.ratios[1] + 1. / this.ratios[2] + 1. / this.ratios[3])\n );\n const h0 = Math.round(w / this.ratios[1]);\n const h1 = Math.round(w / this.ratios[2]);\n const h2 = h - h0 - h1 - 2 * this.spacing;\n const w1 = Math.max(\n this.minWidth,\n Math.min(this.maxWidth - w0 - this.spacing, w));\n\n return [\n {\n geometry: {x: 0, y: 0, width: w0, height: h},\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\n },\n {\n geometry: {x: w0 + this.spacing, y: 0, width: w1, height: h0},\n sides: RectPart.Top | RectPart.Right\n },\n {\n geometry: {x: w0 + this.spacing, y: h0 + this.spacing, width: w1, height: h1},\n sides: RectPart.Right\n },\n {\n geometry: {x: w0 + this.spacing, y: h0 + h1 + 2 * this.spacing, width: w1, height: h2},\n sides: RectPart.Bottom | RectPart.Right\n }\n ];\n }\n\n private static countRatios(sizes: Size[]) {\n return sizes.map((size) => size.w / size.h);\n }\n\n private static countProportions(ratios: number[]) {\n return ratios.map((ratio) => (ratio > 1.2) ? 'w' : (ratio < 0.8) ? 'n' : 'q').join('');\n }\n}\n\nclass ComplexLayouter {\n private ratios: number[];\n private count: number;\n\n constructor(ratios: number[], private averageRatio: number, private maxWidth: number, private minWidth: number, private spacing: number, private maxHeight = maxWidth * 4 / 3) {\n this.ratios = ComplexLayouter.cropRatios(ratios, averageRatio);\n this.count = ratios.length;\n }\n\n private static cropRatios(ratios: number[], averageRatio: number) {\n const kMaxRatio = 2.75;\n const kMinRatio = 0.6667;\n return ratios.map((ratio) => {\n return averageRatio > 1.1 ?\n clamp(ratio, 1., kMaxRatio) :\n clamp(ratio, kMinRatio, 1.);\n });\n }\n\n public layout(): GroupMediaLayout[] {\n const result = new Array(this.count);\n\n const attempts: Attempt[] = [];\n const multiHeight = (offset: number, count: number) => {\n const ratios = this.ratios.slice(offset, offset + count); // warn\n const sum = accumulate(ratios, 0);\n return (this.maxWidth - (count - 1) * this.spacing) / sum;\n };\n const pushAttempt = (lineCounts: number[]) => {\n const heights: number[] = [];\n let offset = 0;\n for(const count of lineCounts) {\n heights.push(multiHeight(offset, count));\n offset += count;\n }\n attempts.push({lineCounts, heights}); // warn\n };\n\n for(let first = 1; first !== this.count; ++first) {\n const second = this.count - first;\n if(first > 3 || second > 3) {\n continue;\n }\n pushAttempt([first, second]);\n }\n for(let first = 1; first !== this.count - 1; ++first) {\n for(let second = 1; second !== this.count - first; ++second) {\n const third = this.count - first - second;\n if((first > 3) ||\n (second > ((this.averageRatio < 0.85) ? 4 : 3)) ||\n (third > 3)) {\n continue;\n }\n pushAttempt([first, second, third]);\n }\n }\n for(let first = 1; first !== this.count - 1; ++first) {\n for(let second = 1; second !== this.count - first; ++second) {\n for(let third = 1; third !== this.count - first - second; ++third) {\n const fourth = this.count - first - second - third;\n if(first > 3 || second > 3 || third > 3 || fourth > 3) {\n continue;\n }\n pushAttempt([first, second, third, fourth]);\n }\n }\n }\n\n let optimalAttempt: Attempt = null;\n let optimalDiff = 0;\n for(const attempt of attempts) {\n const {heights, lineCounts: counts} = attempt;\n const lineCount = counts.length;\n const totalHeight = accumulate(heights, 0) +\n this.spacing * (lineCount - 1);\n const minLineHeight = Math.min(...heights);\n const maxLineHeight = Math.max(...heights);\n const bad1 = (minLineHeight < this.minWidth) ? 1.5 : 1;\n const bad2 = (() => {\n for(let line = 1; line !== lineCount; ++line) {\n if(counts[line - 1] > counts[line]) {\n return 1.5;\n }\n }\n return 1.;\n })();\n const diff = Math.abs(totalHeight - this.maxHeight) * bad1 * bad2;\n if(!optimalAttempt || diff < optimalDiff) {\n optimalAttempt = attempt;\n optimalDiff = diff;\n }\n }\n\n const optimalCounts = optimalAttempt.lineCounts;\n const optimalHeights = optimalAttempt.heights;\n const rowCount = optimalCounts.length;\n\n let index = 0;\n let y = 0;\n for(let row = 0; row !== rowCount; ++row) {\n const colCount = optimalCounts[row];\n const lineHeight = optimalHeights[row];\n const height = Math.round(lineHeight);\n\n let x = 0;\n for(let col = 0; col !== colCount; ++col) {\n const sides = RectPart.None |\n (row === 0 ? RectPart.Top : RectPart.None) |\n (row === rowCount - 1 ? RectPart.Bottom : RectPart.None) |\n (col === 0 ? RectPart.Left : RectPart.None) |\n (col === colCount - 1 ? RectPart.Right : RectPart.None);\n\n const ratio = this.ratios[index];\n const width = (col === colCount - 1) ?\n (this.maxWidth - x) :\n Math.round(ratio * lineHeight);\n result[index] = {\n geometry: {x, y, width, height},\n sides\n };\n\n x += width + this.spacing;\n ++index;\n }\n y += height + this.spacing;\n }\n\n return result;\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 {Layouter, RectPart} from './groupedLayout';\n\nexport default function prepareAlbum(options: {\n container: HTMLElement,\n items: {w: number, h: number}[],\n maxWidth: number,\n minWidth: number,\n spacing: number,\n maxHeight?: number,\n forMedia?: true\n}) {\n const layouter = new Layouter(options.items, options.maxWidth, options.minWidth, options.spacing, options.maxHeight);\n const layout = layouter.layout();\n\n const widthItem = layout.find((item) => item.sides & RectPart.Right);\n const width = widthItem.geometry.width + widthItem.geometry.x;\n\n const heightItem = layout.find((item) => item.sides & RectPart.Bottom);\n const height = heightItem.geometry.height + heightItem.geometry.y;\n\n const container = options.container;\n container.style.width = width + 'px';\n container.style.height = height + 'px';\n const children = container.children;\n\n layout.forEach(({geometry, sides}, idx) => {\n let div: HTMLElement;\n div = children[idx] as HTMLElement;\n if(!div) {\n div = document.createElement('div');\n container.append(div);\n }\n\n div.classList.add('album-item', 'grouped-item');\n\n div.style.width = (geometry.width / width * 100) + '%';\n div.style.height = (geometry.height / height * 100) + '%';\n div.style.top = (geometry.y / height * 100) + '%';\n div.style.left = (geometry.x / width * 100) + '%';\n\n if(sides & RectPart.Left && sides & RectPart.Top) {\n div.style.borderTopLeftRadius = 'inherit';\n }\n\n if(sides & RectPart.Left && sides & RectPart.Bottom) {\n div.style.borderBottomLeftRadius = 'inherit';\n }\n\n if(sides & RectPart.Right && sides & RectPart.Top) {\n div.style.borderTopRightRadius = 'inherit';\n }\n\n if(sides & RectPart.Right && sides & RectPart.Bottom) {\n div.style.borderBottomRightRadius = 'inherit';\n }\n\n if(options.forMedia) {\n const mediaDiv = document.createElement('div');\n mediaDiv.classList.add('album-item-media');\n\n div.append(mediaDiv);\n }\n\n // @ts-ignore\n // div.style.backgroundColor = '#' + Math.floor(Math.random() * (2 ** 24 - 1)).toString(16).padStart(6, '0');\n });\n\n /* if(options.forMedia) {\n layout.forEach((_, i) => {\n const mediaDiv = document.createElement('div');\n mediaDiv.classList.add('album-item-media');\n\n options.container.children[i].append(mediaDiv);\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 {ChatAutoDownloadSettings} from '../../helpers/autoDownload';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {Middleware} from '../../helpers/middleware';\nimport {Document, Message, MessageMedia, Photo, PhotoSize} from '../../layer';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getMediaFromMessage from '../../lib/appManagers/utils/messages/getMediaFromMessage';\nimport choosePhotoSize from '../../lib/appManagers/utils/photos/choosePhotoSize';\nimport rootScope from '../../lib/rootScope';\nimport {AnimationItemGroup} from '../animationIntersector';\nimport Chat from '../chat/chat';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport prepareAlbum from '../prepareAlbum';\nimport wrapMediaSpoiler from './mediaSpoiler';\nimport wrapPhoto from './photo';\nimport wrapVideo from './video';\n\nexport default function wrapAlbum({messages, attachmentDiv, middleware, uploading, lazyLoadQueue, isOut, chat, loadPromises, autoDownload, managers = rootScope.managers, animationGroup}: {\n messages: Message.message[],\n attachmentDiv: HTMLElement,\n middleware?: Middleware,\n lazyLoadQueue?: LazyLoadQueue,\n uploading?: boolean,\n isOut: boolean,\n chat: Chat,\n loadPromises?: Promise[],\n autoDownload?: ChatAutoDownloadSettings,\n managers?: AppManagers,\n animationGroup?: AnimationItemGroup\n}) {\n const items: {size: PhotoSize.photoSize, media: Photo.photo | Document.document, message: Message.message}[] = [];\n\n // !lowest msgID will be the FIRST in album\n for(const message of messages) {\n const media: Photo.photo | Document.document = getMediaFromMessage(message);\n\n const size: any = media._ === 'photo' ? choosePhotoSize(media, 480, 480) : {w: media.w, h: media.h};\n items.push({size, media, message});\n }\n\n /* // * pending\n if(storage[0] < 0) {\n items.reverse();\n } */\n\n prepareAlbum({\n container: attachmentDiv,\n items: items.map((i) => ({w: i.size.w, h: i.size.h})),\n maxWidth: mediaSizes.active.album.width,\n minWidth: 100,\n spacing: 2,\n forMedia: true\n });\n\n const {width, height} = attachmentDiv.style;\n const containerWidth = parseInt(width);\n const containerHeight = parseInt(height);\n\n items.forEach((item, idx) => {\n const {size, media, message} = item;\n\n const messageMedia = message.media;\n const hasSpoiler = !!(messageMedia as MessageMedia.messageMediaPhoto | MessageMedia.messageMediaDocument).pFlags?.spoiler;\n\n const div = attachmentDiv.children[idx] as HTMLElement;\n div.dataset.mid = '' + message.mid;\n div.dataset.peerId = '' + message.peerId;\n const mediaDiv = div.firstElementChild as HTMLElement;\n const isPhoto = media._ === 'photo';\n let thumbPromise: Promise;\n if(isPhoto) {\n thumbPromise = wrapPhoto({\n photo: media,\n message,\n container: mediaDiv,\n boxWidth: 0,\n boxHeight: 0,\n isOut,\n lazyLoadQueue,\n middleware,\n size,\n loadPromises,\n autoDownloadSize: autoDownload.photo,\n managers\n });\n } else {\n thumbPromise = wrapVideo({\n doc: media,\n container: mediaDiv,\n message,\n boxWidth: 0,\n boxHeight: 0,\n withTail: false,\n isOut,\n lazyLoadQueue,\n middleware,\n loadPromises,\n autoDownload,\n managers,\n noAutoplayAttribute: hasSpoiler\n });\n }\n\n if(thumbPromise) {\n loadPromises?.push(thumbPromise);\n }\n\n if(hasSpoiler) {\n const promise = (thumbPromise || Promise.resolve()).then(async() => {\n if(!middleware()) {\n return;\n }\n\n const {width, height} = div.style;\n const itemWidth = +width.slice(0, -1) / 100 * containerWidth;\n const itemHeight = +height.slice(0, -1) / 100 * containerHeight;\n const container = await wrapMediaSpoiler({\n media,\n animationGroup,\n middleware,\n width: itemWidth,\n height: itemHeight\n });\n\n if(!middleware()) {\n return;\n }\n\n mediaDiv.append(container);\n });\n\n loadPromises?.push(promise);\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 {SliderSuperTab} from '../../slider';\nimport appSidebarRight from '..';\nimport {roundPercents} from '../../poll';\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport {i18n} from '../../../lib/langPack';\nimport setInnerHTML from '../../../helpers/dom/setInnerHTML';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport Button from '../../button';\nimport {Message, MessageMedia} from '../../../layer';\n\nexport default class AppPollResultsTab extends SliderSuperTab {\n private resultsDiv: HTMLElement;\n\n public async init(message: Message.message) {\n this.container.id = 'poll-results-container';\n this.container.classList.add('chatlist-container');\n\n this.resultsDiv = document.createElement('div');\n this.resultsDiv.classList.add('poll-results');\n this.scrollable.append(this.resultsDiv);\n\n const poll = await this.managers.appPollsManager.getPoll((message.media as MessageMedia.messageMediaPoll).poll.id);\n\n this.setTitle(poll.poll.pFlags.quiz ? 'PollResults.Title.Quiz' : 'PollResults.Title.Poll');\n\n const title = document.createElement('h3');\n setInnerHTML(title, wrapEmojiText(poll.poll.question));\n\n const percents = poll.results.results.map((v) => v.voters / poll.results.total_voters * 100);\n roundPercents(percents);\n\n const fragment = document.createDocumentFragment();\n poll.results.results.forEach((result, idx) => {\n if(!result.voters) return;\n\n const hr = document.createElement('hr');\n\n const answer = poll.poll.answers[idx];\n\n // Head\n const answerEl = document.createElement('div');\n answerEl.classList.add('poll-results-answer');\n\n const answerTitle = document.createElement('div');\n setInnerHTML(answerTitle, wrapEmojiText(answer.text));\n\n const answerPercents = document.createElement('div');\n answerPercents.innerText = Math.round(percents[idx]) + '%';\n\n answerEl.append(answerTitle, answerPercents);\n\n // Humans\n const list = appDialogsManager.createChatList();\n list.classList.add('poll-results-voters');\n\n appDialogsManager.setListClickListener(list, () => {\n appSidebarRight.onCloseBtnClick();\n }, undefined, true);\n\n list.style.minHeight = Math.min(result.voters, 4) * 48 + 'px';\n\n fragment.append(hr, answerEl, list);\n\n let offset: string, limit = 4, loading = false, left = Math.max(0, result.voters - 4);\n const load = () => {\n if(loading) return;\n loading = true;\n\n this.managers.appPollsManager.getVotes(message, answer.option, offset, limit).then((votesList) => {\n votesList.votes.forEach((vote) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: vote.user_id.toPeerId(false),\n container: list,\n rippleEnabled: false,\n meAsSaved: false,\n avatarSize: 'small'\n });\n dom.lastMessageSpan.parentElement.remove();\n });\n\n if(offset) {\n left = Math.max(0, left - votesList.votes.length);\n\n if(left) {\n (showMore.lastElementChild as HTMLElement).replaceWith(i18n('PollResults.LoadMore', [Math.min(20, left)]));\n }\n }\n\n offset = votesList.next_offset;\n limit = 20;\n\n if(!left || !votesList.votes.length) {\n showMore.remove();\n }\n }).finally(() => {\n loading = false;\n });\n };\n\n const showMore = Button('poll-results-more btn btn-primary btn-transparent', {icon: 'down'});\n showMore.addEventListener('click', load);\n showMore.append(i18n('PollResults.LoadMore', [Math.min(20, left)]));\n\n fragment.append(showMore);\n\n load();\n });\n\n this.resultsDiv.append(title, fragment);\n\n appSidebarRight.toggleSidebar(true).then(() => {\n /* appPollsManager.getVotes(mid).then((votes) => {\n console.log('gOt VotEs', votes);\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 mediaSizes from '../helpers/mediaSizes';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport appImManager from '../lib/appManagers/appImManager';\nimport rootScope from '../lib/rootScope';\nimport ripple from './ripple';\nimport appSidebarRight from './sidebarRight';\nimport AppPollResultsTab from './sidebarRight/tabs/pollResults';\nimport {FormatterArguments, i18n, LangPackKey} from '../lib/langPack';\nimport {fastRaf} from '../helpers/schedulers';\nimport SetTransition from './singleTransition';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent, detachClickEvent, simulateClickEvent} from '../helpers/dom/clickEvent';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport windowSize from '../helpers/windowSize';\nimport {Message, MessageMedia, Poll, PollResults} from '../layer';\nimport toHHMMSS from '../helpers/string/toHHMMSS';\nimport StackedAvatars from './stackedAvatars';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport wrapRichText from '../lib/richTextProcessor/wrapRichText';\n\nlet lineTotalLength = 0;\nconst tailLength = 9;\nconst times = 10;\nconst fullTime = 340;\nconst oneTime = fullTime / times;\n\nexport const roundPercents = (percents: number[]) => {\n // console.log('roundPercents before percents:', percents);\n\n const sum = percents.reduce((acc, p) => acc + Math.round(p), 0);\n if(sum > 100) {\n const diff = sum - 100;\n const length = percents.length;\n for(let i = 0; i < diff; ++i) {\n let minIndex = -1, minRemainder = 1;\n for(let k = 0; k < length; ++k) {\n const remainder = percents[k] % 1;\n if(remainder >= 0.5 && remainder < minRemainder) {\n minRemainder = remainder;\n minIndex = k;\n }\n }\n\n if(minIndex === -1) {\n // throw new Error('lol chto');\n return;\n }\n\n percents[minIndex] -= minRemainder;\n }\n } else if(sum < 100) {\n const diff = 100 - sum;\n const length = percents.length;\n for(let i = 0; i < diff; ++i) {\n let minIndex = -1, maxRemainder = 0;\n for(let k = 0; k < length; ++k) {\n const remainder = percents[k] % 1;\n if(remainder < 0.5 && remainder > maxRemainder) {\n maxRemainder = remainder;\n minIndex = k;\n }\n }\n\n if(minIndex === -1) {\n // throw new Error('lol chto');\n return;\n }\n\n percents[minIndex] += 1 - maxRemainder;\n }\n }\n\n // console.log('roundPercents after percents:', percents);\n};\n\n/* const connectedPolls: {id: string, element: PollElement}[] = [];\nrootScope.on('poll_update', (e) => {\n const {poll, results} = e as {poll: Poll, results: PollResults};\n\n //console.log('poll_update', poll, results);\n for(const connected of connectedPolls) {\n if(connected.id === poll.id) {\n const pollElement = connected.element;\n pollElement.isClosed = !!poll.pFlags.closed;\n pollElement.performResults(results, poll.chosenIndexes);\n }\n }\n}); */\n\nrootScope.addEventListener('poll_update', ({poll, results}) => {\n const pollElements = Array.from(document.querySelectorAll(`poll-element[poll-id=\"${poll.id}\"]`)) as PollElement[];\n pollElements.forEach((pollElement) => {\n // console.log('poll_update', poll, results);\n pollElement.isClosed = !!poll.pFlags.closed;\n pollElement.performResults(results, poll.chosenIndexes);\n });\n});\n\nmediaSizes.addEventListener('resize', () => {\n PollElement.setMaxLength();\n PollElement.resizePolls();\n});\n\nmediaSizes.addEventListener('changeScreen', () => {\n PollElement.setMaxLength();\n});\n\nconst hideQuizHint = (element: HTMLElement, onHide: () => void, timeout: number) => {\n element.classList.remove('active');\n\n clearTimeout(timeout);\n setTimeout(() => {\n onHide();\n element.remove();\n\n if(prevQuizHint === element && prevQuizHintOnHide === onHide && prevQuizHintTimeout === timeout) {\n prevQuizHint = prevQuizHintOnHide = null;\n prevQuizHintTimeout = 0;\n }\n }, 200);\n};\n\nlet prevQuizHint: HTMLElement, prevQuizHintOnHide: () => void, prevQuizHintTimeout: number;\nlet isListenerSet = false;\nconst setQuizHint = (solution: string, solution_entities: any[], onHide: () => void) => {\n if(prevQuizHint) {\n hideQuizHint(prevQuizHint, prevQuizHintOnHide, prevQuizHintTimeout);\n }\n\n const element = document.createElement('div');\n element.classList.add('quiz-hint');\n\n const container = document.createElement('div');\n container.classList.add('container', 'tgico');\n\n const textEl = document.createElement('div');\n textEl.classList.add('text');\n\n container.append(textEl);\n element.append(container);\n\n setInnerHTML(textEl, wrapRichText(solution, {entities: solution_entities}));\n appImManager.chat.bubbles.container.append(element);\n\n void element.offsetLeft; // reflow\n element.classList.add('active');\n\n prevQuizHint = element;\n prevQuizHintOnHide = onHide;\n prevQuizHintTimeout = window.setTimeout(() => {\n hideQuizHint(element, onHide, prevQuizHintTimeout);\n }, IS_TOUCH_SUPPORTED ? 5000 : 7000);\n\n if(!isListenerSet) {\n isListenerSet = true;\n appImManager.addEventListener('peer_changed', () => {\n if(prevQuizHint) {\n hideQuizHint(prevQuizHint, prevQuizHintOnHide, prevQuizHintTimeout);\n }\n });\n }\n};\n\nexport default class PollElement extends HTMLElement {\n public static MAX_OFFSET = -46.5;\n public static MAX_LENGTH = 0;\n public svgLines: SVGSVGElement[];\n private numberDivs: HTMLDivElement[];\n private answerDivs: HTMLDivElement[];\n private descDiv: HTMLElement;\n private typeDiv: HTMLElement;\n private avatarsDiv: HTMLElement;\n private viewResults: HTMLElement;\n private votersCountDiv: HTMLDivElement;\n\n // private maxLength: number;\n // private maxLengths: number[];\n private maxPercents: number[];\n\n public isClosed = false;\n private isQuiz = false;\n private isRetracted = false;\n private isPublic = false;\n private isMultiple = false;\n private chosenIndexes: number[] = [];\n private percents: number[];\n\n public message: Message.message;\n public managers: AppManagers;\n\n private quizInterval: number;\n private quizTimer: SVGSVGElement;\n\n private sendVoteBtn: HTMLElement;\n private chosingIndexes: number[] = [];\n\n private sendVotePromise: Promise;\n private sentVote = false;\n\n public static setMaxLength() {\n const width = windowSize.width <= 360 ? windowSize.width - 120 : mediaSizes.active.poll.width;\n this.MAX_LENGTH = width + tailLength + this.MAX_OFFSET + -13.7; // 13 - position left\n }\n\n public static resizePolls() {\n if(!this.MAX_LENGTH) return;\n const pollElements = Array.from(document.querySelectorAll('poll-element.is-voted')) as PollElement[];\n pollElements.forEach((pollElement) => {\n pollElement.svgLines.forEach((svg, idx) => {\n // void svg.getBoundingClientRect(); // reflow\n pollElement.setLineProgress(idx, 1);\n });\n });\n }\n\n public async render() {\n // ะฑั€ะฐัƒะทะตั€ ะฒั‹ะทั‹ะฒะฐะตั‚ ัั‚ะพั‚ ะผะตั‚ะพะด ะฟั€ะธ ะดะพะฑะฐะฒะปะตะฝะธะธ ัะปะตะผะตะฝั‚ะฐ ะฒ ะดะพะบัƒะผะตะฝั‚\n // (ะผะพะถะตั‚ ะฒั‹ะทั‹ะฒะฐั‚ัŒัั ะผะฝะพะณะพ ั€ะฐะท, ะตัะปะธ ัะปะตะผะตะฝั‚ ะผะฝะพะณะพะบั€ะฐั‚ะฝะพ ะดะพะฑะฐะฒะปัะตั‚ัั/ัƒะดะฐะปัะตั‚ัั)\n\n if(!lineTotalLength) {\n lineTotalLength = (document.getElementById('poll-line') as any as SVGPathElement).getTotalLength();\n // console.log('line total length:', lineTotalLength);\n PollElement.setMaxLength();\n }\n\n // const {poll, results} = this.managers.appPollsManager.getPoll(pollId);\n const {poll, results} = this.message.media as MessageMedia.messageMediaPoll;\n\n /* const timestamp = Date.now() / 1000 | 0;\n if(timestamp < this.message.date) { */\n if(this.message.pFlags.is_scheduled) {\n this.classList.add('disable-hover');\n }\n\n // console.log('pollElement poll:', poll, results);\n\n let descKey: LangPackKey;\n if(poll.pFlags) {\n this.isPublic = !!poll.pFlags.public_voters;\n this.isQuiz = !!poll.pFlags.quiz;\n this.isClosed = !!poll.pFlags.closed;\n this.isMultiple = !!poll.pFlags.multiple_choice;\n\n if(this.isClosed) {\n descKey = 'Chat.Poll.Type.Closed';\n this.classList.add('is-closed');\n } else if(this.isQuiz) {\n descKey = this.isPublic ? 'Chat.Poll.Type.Quiz' : 'Chat.Poll.Type.AnonymousQuiz';\n } else {\n descKey = this.isPublic ? 'Chat.Poll.Type.Public' : 'Chat.Poll.Type.Anonymous';\n }\n }\n\n this.classList.toggle('is-multiple', this.isMultiple);\n\n const multipleSelect = this.isMultiple ? '' : '';\n const votes = poll.answers.map((answer, idx) => {\n return `\n
\n
\n
\n \n \n \n ${multipleSelect}\n
\n
\n
\n \n \n \n \n
\n `;\n }).join('');\n\n this.innerHTML = `\n
\n
\n
\n
\n
\n ${votes}`;\n\n setInnerHTML(this.firstElementChild, wrapEmojiText(poll.question));\n\n Array.from(this.querySelectorAll('.poll-answer-text')).forEach((el, idx) => {\n setInnerHTML(el, wrapEmojiText(poll.answers[idx].text));\n });\n\n this.descDiv = this.firstElementChild.nextElementSibling as HTMLElement;\n this.typeDiv = this.descDiv.firstElementChild as HTMLElement;\n this.avatarsDiv = this.descDiv.lastElementChild as HTMLElement;\n\n if(descKey) {\n this.typeDiv.append(i18n(descKey));\n }\n\n if(this.isQuiz) {\n this.classList.add('is-quiz');\n\n if(poll.close_period && poll.close_date) {\n const timeLeftDiv = document.createElement('div');\n timeLeftDiv.classList.add('poll-time');\n this.descDiv.append(timeLeftDiv);\n\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n // svg.setAttributeNS(null, 'viewBox', '0 0 15 15');\n svg.classList.add('poll-quiz-timer');\n\n this.quizTimer = svg;\n\n const strokeWidth = 2;\n const radius = 7;\n const circumference = 2 * Math.PI * radius;\n\n const circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle');\n circle.classList.add('poll-quiz-timer-circle');\n circle.setAttributeNS(null, 'cx', '16');\n circle.setAttributeNS(null, 'cy', '16');\n circle.setAttributeNS(null, 'r', '' + radius);\n circle.setAttributeNS(null, 'stroke-width', '' + strokeWidth);\n\n svg.append(circle);\n this.descDiv.append(svg);\n\n const period = poll.close_period * 1000;\n const closeTime = (poll.close_date - await rootScope.managers.timeManager.getServerTimeOffset()) * 1000;\n\n // console.log('closeTime:', poll.close_date, serverTimeManager.serverTimeOffset, Date.now() / 1000 | 0);\n\n // let time = Date.now();\n // let percents = (closeTime - time) / period;\n\n // timeLeftDiv.innerHTML = String((closeTime - time) / 1000 + 1 | 0).toHHMMSS();\n\n // // @ts-ignore\n // circle.style.strokeDashoffset = circumference + percents * circumference;\n // circle.style.strokeDasharray = ${circumference} ${circumference};\n\n this.quizInterval = window.setInterval(() => {\n const time = Date.now();\n const percents = (closeTime - time) / period;\n const timeLeft = (closeTime - time) / 1000 + 1 | 0;\n timeLeftDiv.innerHTML = toHHMMSS(timeLeft);\n\n if(timeLeft <= 5) {\n timeLeftDiv.style.color = '#ee545c';\n circle.style.stroke = '#ee545c';\n }\n // timeLeftDiv.style.visibility = 'visible';\n\n // @ts-ignore\n circle.style.strokeDashoffset = circumference + percents * circumference;\n circle.style.strokeDasharray = `${circumference} ${circumference}`;\n\n if(time >= closeTime) {\n clearInterval(this.quizInterval);\n timeLeftDiv.innerHTML = '';\n // @ts-ignore\n circle.style.strokeDashoffset = circumference;\n this.quizInterval = 0;\n\n setTimeout(() => {\n // ะฝัƒะถะฝะพ ะทะฐะฟั€ะพัะธั‚ัŒ ะฐะฟะดะตะนั‚ ั‡ั‚ะพะฑั‹ ะพะฟั€ะพั ะพะฑะฝะพะฒะธะปัั\n this.managers.appPollsManager.getResults(this.message);\n }, 3e3);\n }\n }, 1e3);\n }\n }\n\n this.answerDivs = Array.from(this.querySelectorAll('.poll-answer')) as HTMLDivElement[];\n this.svgLines = Array.from(this.querySelectorAll('.poll-line')) as SVGSVGElement[];\n this.numberDivs = Array.from(this.querySelectorAll('.poll-answer-percents')) as HTMLDivElement[];\n\n const footerDiv = document.createElement('div');\n footerDiv.classList.add('poll-footer');\n\n this.viewResults = document.createElement('div');\n this.viewResults.className = 'poll-footer-button poll-view-results hide';\n this.viewResults.append(i18n('Chat.Poll.ViewResults'));\n\n this.votersCountDiv = document.createElement('div');\n this.votersCountDiv.className = 'poll-votes-count';\n\n footerDiv.append(this.viewResults, this.votersCountDiv);\n this.append(footerDiv);\n\n this.viewResults.addEventListener('click', (e) => {\n cancelEvent(e);\n\n if(!appSidebarRight.isTabExists(AppPollResultsTab)) {\n appSidebarRight.createTab(AppPollResultsTab).open(this.message);\n }\n });\n ripple(this.viewResults);\n\n if(this.isMultiple) {\n this.sendVoteBtn = document.createElement('div');\n this.sendVoteBtn.classList.add('poll-footer-button', 'poll-send-vote');\n this.sendVoteBtn.append(i18n('Chat.Poll.SubmitVote'));\n ripple(this.sendVoteBtn);\n\n if(!poll.chosenIndexes.length) {\n this.votersCountDiv.classList.add('hide');\n }\n\n attachClickEvent(this.sendVoteBtn, (e) => {\n cancelEvent(e);\n /* const indexes = this.answerDivs.filter((el) => el.classList.contains('is-chosing')).map((el) => +el.dataset.index);\n if(indexes.length) {\n\n } */\n if(this.chosingIndexes.length) {\n this.sendVotes(this.chosingIndexes).then(() => {\n this.chosingIndexes.length = 0;\n this.answerDivs.forEach((el) => {\n el.classList.remove('is-chosing');\n });\n });\n }\n });\n\n footerDiv.append(this.sendVoteBtn);\n }\n\n // const width = this.getBoundingClientRect().width;\n // const width = mediaSizes.active.poll.width;\n // this.maxLength = width + tailLength + this.maxOffset + -13.7; // 13 - position left\n\n const canVote = !(poll.chosenIndexes.length || this.isClosed);\n if(!canVote || this.isPublic) {\n this.performResults(results, poll.chosenIndexes, false);\n }\n\n if(canVote) {\n this.setVotersCount(results);\n attachClickEvent(this, this.clickHandler);\n }\n }\n\n initQuizHint(results: PollResults) {\n if(results.solution && results.solution_entities) {\n const toggleHint = document.createElement('div');\n toggleHint.classList.add('tgico-tip', 'poll-hint');\n this.descDiv.append(toggleHint);\n\n // let active = false;\n attachClickEvent(toggleHint, (e) => {\n cancelEvent(e);\n\n // active = true;\n toggleHint.classList.add('active');\n setQuizHint(results.solution, results.solution_entities, () => {\n // active = false;\n toggleHint.classList.remove('active');\n });\n });\n\n if(this.sentVote) {\n const correctResult = results.results.find((r) => r.pFlags.correct);\n if(correctResult && !correctResult.pFlags.chosen) {\n simulateClickEvent(toggleHint);\n }\n }\n }\n }\n\n clickHandler(e: Event) {\n const target = findUpClassName(e.target, 'poll-answer') as HTMLElement;\n if(!target) {\n return;\n }\n\n cancelEvent(e);\n const answerIndex = +target.dataset.index;\n if(this.isMultiple) {\n target.classList.toggle('is-chosing');\n\n const foundIndex = this.chosingIndexes.indexOf(answerIndex);\n if(foundIndex !== -1) {\n this.chosingIndexes.splice(foundIndex, 1);\n } else {\n this.chosingIndexes.push(answerIndex);\n }\n } else {\n this.sendVotes([answerIndex]);\n }\n\n /* target.classList.add('is-voting');\n setTimeout(() => { // simulate\n this.setResults([100, 0], answerIndex);\n target.classList.remove('is-voting');\n }, 1000); */\n }\n\n sendVotes(indexes: number[]) {\n if(this.sendVotePromise) return this.sendVotePromise;\n\n const targets = this.answerDivs.filter((_, idx) => indexes.includes(idx));\n targets.forEach((target) => {\n target.classList.add('is-voting');\n });\n\n this.classList.add('disable-hover');\n this.sentVote = true;\n return this.sendVotePromise = this.managers.appPollsManager.sendVote(this.message, indexes).then(() => {\n targets.forEach((target) => {\n target.classList.remove('is-voting');\n });\n\n this.classList.remove('disable-hover');\n }).catch(() => {\n this.sentVote = false;\n }).finally(() => {\n this.sendVotePromise = null;\n });\n }\n\n performResults(results: PollResults, chosenIndexes: number[], animate = true) {\n if(!rootScope.settings.animationsEnabled) {\n animate = false;\n }\n\n if(this.isQuiz && (results.results?.length || this.isClosed)) {\n this.answerDivs.forEach((el, idx) => {\n el.classList.toggle('is-correct', !!results.results[idx].pFlags.correct);\n });\n\n if(this.initQuizHint) {\n this.initQuizHint(results);\n this.initQuizHint = null;\n }\n\n if(this.quizInterval) {\n clearInterval(this.quizInterval);\n this.quizInterval = 0;\n }\n\n if(this.quizTimer?.parentElement) {\n this.quizTimer.remove();\n }\n\n const timeEl = this.descDiv.querySelector('.poll-time');\n if(timeEl) {\n timeEl.remove();\n }\n }\n\n if(this.isClosed) {\n this.classList.add('is-closed');\n replaceContent(this.typeDiv, i18n('Chat.Poll.Type.Closed'));\n }\n\n // set chosen\n if(this.chosenIndexes.length !== chosenIndexes.length || this.isClosed) { // if we voted\n this.isRetracted = this.chosenIndexes.length && !chosenIndexes.length;\n this.chosenIndexes = chosenIndexes.slice();\n\n if(this.isRetracted) {\n attachClickEvent(this, this.clickHandler);\n } else {\n detachClickEvent(this, this.clickHandler);\n }\n }\n\n // is need update\n if(this.chosenIndexes.length || this.isRetracted || this.isClosed) {\n const percents = results.results.map((v) => results.total_voters ? v.voters / results.total_voters * 100 : 0);\n\n this.classList.toggle('no-transition', !animate);\n if(animate) {\n SetTransition({\n element: this,\n className: '',\n forwards: !this.isRetracted,\n duration: 340\n });\n }\n\n fastRaf(() => {\n this.setResults(this.isRetracted ? this.percents : percents, this.chosenIndexes, animate);\n this.percents = percents;\n this.isRetracted = false;\n });\n }\n\n this.setVotersCount(results);\n\n if(this.isPublic) {\n if(!this.isMultiple) {\n this.viewResults.classList.toggle('hide', !results.total_voters || !this.chosenIndexes.length);\n this.votersCountDiv.classList.toggle('hide', !!this.chosenIndexes.length);\n }\n\n const peerIds = (results.recent_voters || []).map((userId) => userId.toPeerId());\n const stackedAvatars = new StackedAvatars({avatarSize: 16});\n stackedAvatars.render(peerIds);\n replaceContent(this.avatarsDiv, stackedAvatars.container);\n }\n\n if(this.isMultiple) {\n const isVoted = !!this.chosenIndexes.length;\n\n const hideSendVoteBtn = this.isClosed || isVoted;\n const hideViewResultsBtn = !this.isPublic || !results.total_voters || (!isVoted && !this.isClosed);\n this.sendVoteBtn.classList.toggle('hide', hideSendVoteBtn);\n this.viewResults.classList.toggle('hide', hideViewResultsBtn);\n this.votersCountDiv.classList.toggle('hide', !hideSendVoteBtn || !hideViewResultsBtn);\n }\n }\n\n setResults(percents: number[], chosenIndexes: number[], animate: boolean) {\n this.svgLines.forEach((svg) => svg.style.display = '');\n\n this.answerDivs.forEach((el, idx) => {\n el.classList.toggle('is-chosen', chosenIndexes.includes(idx));\n });\n\n const maxValue = Math.max(...percents);\n // this.maxLengths = percents.map((p) => p / maxValue * this.maxLength);\n this.maxPercents = percents.map((p) => p / maxValue);\n\n // line\n if(this.isRetracted) {\n this.svgLines.forEach((svg, idx) => {\n this.setLineProgress(idx, -1);\n });\n } else {\n const cb = () => {\n this.svgLines.forEach((svg, idx) => {\n // void svg.getBoundingClientRect(); // reflow\n this.setLineProgress(idx, 1);\n });\n };\n\n animate ? fastRaf(cb) : cb();\n }\n\n percents = percents.slice();\n roundPercents(percents);\n let getPercentValue: (percents: number, index: number) => number;\n const iterate = (i: number) => {\n percents.forEach((percents, idx) => {\n const value = getPercentValue(percents, i);\n this.numberDivs[idx].innerText = value + '%';\n });\n };\n // numbers\n if(this.isRetracted) {\n getPercentValue = (percents, index) => Math.round(percents / times * index);\n\n if(animate) {\n for(let i = (times - 1), k = 0; i >= 0; --i, ++k) {\n setTimeout(() => {\n iterate(i);\n }, oneTime * k);\n }\n } else {\n iterate(0);\n }\n } else {\n getPercentValue = (percents, index) => Math.round(percents / times * (index + 1));\n\n if(animate) {\n for(let i = 0; i < times; ++i) {\n setTimeout(() => {\n iterate(i);\n }, oneTime * i);\n }\n } else {\n iterate(times - 1);\n }\n }\n\n if(this.isRetracted) {\n if(animate) {\n this.classList.add('is-retracting');\n }\n\n this.classList.remove('is-voted');\n const cb = () => {\n this.svgLines.forEach((svg) => svg.style.display = 'none');\n };\n\n if(animate) {\n setTimeout(() => {\n this.classList.remove('is-retracting');\n cb();\n }, fullTime);\n } else {\n cb();\n }\n } else {\n this.classList.add('is-voted');\n }\n }\n\n setVotersCount(results: PollResults) {\n const votersCount = results.total_voters || 0;\n let key: LangPackKey;\n const args: FormatterArguments = [votersCount];\n if(this.isClosed) {\n if(this.isQuiz) key = votersCount ? 'Chat.Quiz.TotalVotes' : 'Chat.Quiz.TotalVotesResultEmpty';\n else key = votersCount ? 'Chat.Poll.TotalVotes1' : 'Chat.Poll.TotalVotesResultEmpty';\n } else {\n if(this.isQuiz) key = votersCount ? 'Chat.Quiz.TotalVotes' : 'Chat.Quiz.TotalVotesEmpty';\n else key = votersCount ? 'Chat.Poll.TotalVotes1' : 'Chat.Poll.TotalVotesEmpty';\n }\n\n replaceContent(this.votersCountDiv, i18n(key, args));\n }\n\n setLineProgress(index: number, multiplier: number) {\n const svg = this.svgLines[index];\n\n if(multiplier === -1) {\n svg.style.strokeDasharray = '';\n svg.style.strokeDashoffset = '';\n } else {\n // svg.style.strokeDasharray = (multiplier * this.maxLengths[index]) + ', 485.9';\n svg.style.strokeDasharray = (multiplier * this.maxPercents[index] * PollElement.MAX_LENGTH) + ', 485.9';\n // svg.style.strokeDasharray = (multiplier * this.maxPercents[index] * 100) + '%, 485.9';\n svg.style.strokeDashoffset = '' + multiplier * PollElement.MAX_OFFSET;\n }\n }\n\n // ัƒ ัะปะตะผะตะฝั‚ะฐ ะผะพะณัƒั‚ ะฑั‹ั‚ัŒ ะตั‰ั‘ ะดั€ัƒะณะธะต ะผะตั‚ะพะดั‹ ะธ ัะฒะพะนัั‚ะฒะฐ\n}\n\ncustomElements.define('poll-element', PollElement);\n","// https://stackoverflow.com/a/14824756/6758968\nconst ltrChars = 'A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02B8\\u0300-\\u0590\\u0800-\\u1FFF'+'\\u2C00-\\uFB1C\\uFDFE-\\uFE6F\\uFEFD-\\uFFFF',\n rtlChars = '\\u0591-\\u07FF\\uFB1D-\\uFDFD\\uFE70-\\uFEFC',\n fullRtlDirCheck = new RegExp('^[^'+ltrChars+']*['+rtlChars+']'),\n justRtlDirCheck = new RegExp('['+rtlChars+']');\n\nexport default function isRTL(s: string, anyChar?: boolean) {\n return anyChar ? justRtlDirCheck.test(s) : fullRtlDirCheck.test(s);\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 {AppImManager, ChatSavedPosition, ChatSetPeerOptions} from '../../lib/appManagers/appImManager';\nimport type {HistoryResult, MyMessage} from '../../lib/appManagers/appMessagesManager';\nimport type {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport type Chat from './chat';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport {logger} from '../../lib/logger';\nimport rootScope from '../../lib/rootScope';\nimport BubbleGroups from './bubbleGroups';\nimport PopupDatePicker from '../popups/datePicker';\nimport PopupForward from '../popups/forward';\nimport PopupStickers from '../popups/stickers';\nimport ProgressivePreloader from '../preloader';\nimport Scrollable, {SliceSides} from '../scrollable';\nimport StickyIntersector from '../stickyIntersector';\nimport animationIntersector from '../animationIntersector';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {IS_ANDROID, IS_APPLE, IS_MOBILE, IS_SAFARI} from '../../environment/userAgent';\nimport I18n, {FormatterArguments, i18n, langPack, LangPackKey, UNSUPPORTED_LANG_PACK_KEY, _i18n} from '../../lib/langPack';\nimport AvatarElement from '../avatar';\nimport ripple from '../ripple';\nimport {MessageRender} from './messageRender';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport PollElement from '../poll';\nimport AudioElement from '../audio';\nimport {Chat as MTChat, ChatInvite, Document, Message, MessageEntity, MessageMedia, MessageReplyHeader, Photo, PhotoSize, ReactionCount, ReplyMarkup, SponsoredMessage, Update, UrlAuthResult, User, WebPage} from '../../layer';\nimport {BOT_START_PARAM, NULL_PEER_ID, REPLIES_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport {FocusDirection, ScrollStartCallbackDimensions} from '../../helpers/fastSmoothScroll';\nimport useHeavyAnimationCheck, {getHeavyAnimationPromise, dispatchHeavyAnimationEvent, interruptHeavyAnimation} from '../../hooks/useHeavyAnimationCheck';\nimport {fastRaf, fastRafPromise} from '../../helpers/schedulers';\nimport deferredPromise from '../../helpers/cancellablePromise';\nimport RepliesElement from './replies';\nimport DEBUG from '../../config/debug';\nimport {SliceEnd} from '../../helpers/slicedArray';\nimport PeerTitle from '../peerTitle';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport {toast, toastNew} from '../toast';\nimport {getMiddleware, Middleware} from '../../helpers/middleware';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent, detachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport htmlToDocumentFragment from '../../helpers/dom/htmlToDocumentFragment';\nimport reflowScrollableElement from '../../helpers/dom/reflowScrollableElement';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport whichChild from '../../helpers/dom/whichChild';\nimport {cancelAnimationByKey} from '../../helpers/animation';\nimport assumeType from '../../helpers/assumeType';\nimport debounce, {DebounceReturnType} from '../../helpers/schedulers/debounce';\nimport {SEND_WHEN_ONLINE_TIMESTAMP} from '../../lib/mtproto/constants';\nimport windowSize from '../../helpers/windowSize';\nimport {formatPhoneNumber} from '../../helpers/formatPhoneNumber';\nimport AppMediaViewer from '../appMediaViewer';\nimport SetTransition from '../singleTransition';\nimport handleHorizontalSwipe from '../../helpers/dom/handleHorizontalSwipe';\nimport findUpAttribute from '../../helpers/dom/findUpAttribute';\nimport findUpAsChild from '../../helpers/dom/findUpAsChild';\nimport formatCallDuration from '../../helpers/formatCallDuration';\nimport IS_CALL_SUPPORTED from '../../environment/callSupport';\nimport Button from '../button';\nimport {CallType} from '../../lib/calls/types';\nimport getVisibleRect from '../../helpers/dom/getVisibleRect';\nimport PopupJoinChatInvite from '../popups/joinChatInvite';\nimport {InternalLink, INTERNAL_LINK_TYPE} from '../../lib/appManagers/internalLink';\nimport ReactionsElement, {REACTIONS_ELEMENTS} from './reactions';\nimport type ReactionElement from './reaction';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport pause from '../../helpers/schedulers/pause';\nimport ScrollSaver from '../../helpers/scrollSaver';\nimport getObjectKeysAndSort from '../../helpers/object/getObjectKeysAndSort';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport getViewportSlice from '../../helpers/dom/getViewportSlice';\nimport SuperIntersectionObserver from '../../helpers/dom/superIntersectionObserver';\nimport generateFakeIcon from '../generateFakeIcon';\nimport copyFromElement from '../../helpers/dom/copyFromElement';\nimport PopupElement from '../popups';\nimport setAttachmentSize from '../../helpers/setAttachmentSize';\nimport wrapWebPageDescription from '../wrappers/webPageDescription';\nimport wrapWebPageTitle from '../wrappers/webPageTitle';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\nimport wrapMessageActionTextNew from '../wrappers/messageActionTextNew';\nimport isMentionUnread from '../../lib/appManagers/utils/messages/isMentionUnread';\nimport getMediaFromMessage from '../../lib/appManagers/utils/messages/getMediaFromMessage';\nimport getPeerColorById from '../../lib/appManagers/utils/peers/getPeerColorById';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\nimport generateMessageId from '../../lib/appManagers/utils/messageId/generateMessageId';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {Awaited, SendMessageEmojiInteractionData} from '../../types';\nimport idleController from '../../helpers/idleController';\nimport overlayCounter from '../../helpers/overlayCounter';\nimport {cancelContextMenuOpening} from '../../helpers/dom/attachContextMenuListener';\nimport contextMenuController from '../../helpers/contextMenuController';\nimport {AckedResult} from '../../lib/mtproto/superMessagePort';\nimport middlewarePromise from '../../helpers/middlewarePromise';\nimport {EmoticonsDropdown} from '../emoticonsDropdown';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport noop from '../../helpers/noop';\nimport getAlbumText from '../../lib/appManagers/utils/messages/getAlbumText';\nimport paymentsWrapCurrencyAmount from '../../helpers/paymentsWrapCurrencyAmount';\nimport PopupPayment from '../popups/payment';\nimport isInDOM from '../../helpers/dom/isInDOM';\nimport getStickerEffectThumb from '../../lib/appManagers/utils/stickers/getStickerEffectThumb';\nimport attachStickerViewerListeners from '../stickerViewer';\nimport {makeMediaSize, MediaSize} from '../../helpers/mediaSize';\nimport wrapSticker, {onEmojiStickerClick} from '../wrappers/sticker';\nimport wrapAlbum from '../wrappers/album';\nimport wrapDocument from '../wrappers/document';\nimport wrapGroupedDocuments from '../wrappers/groupedDocuments';\nimport wrapPhoto from '../wrappers/photo';\nimport wrapPoll from '../wrappers/poll';\nimport wrapVideo from '../wrappers/video';\nimport isRTL from '../../helpers/string/isRTL';\nimport NBSP from '../../helpers/string/nbsp';\nimport DotRenderer from '../dotRenderer';\nimport toHHMMSS from '../../helpers/string/toHHMMSS';\nimport {BatchProcessor} from '../../helpers/sortedList';\nimport wrapUrl from '../../lib/richTextProcessor/wrapUrl';\nimport getMessageThreadId from '../../lib/appManagers/utils/messages/getMessageThreadId';\nimport wrapTopicNameButton from '../wrappers/topicNameButton';\nimport wrapMediaSpoiler, {onMediaSpoilerClick, toggleMediaSpoiler} from '../wrappers/mediaSpoiler';\nimport confirmationPopup from '../confirmationPopup';\nimport wrapPeerTitle from '../wrappers/peerTitle';\nimport {PopupPeerCheckboxOptions} from '../popups/peer';\nimport toggleDisability from '../../helpers/dom/toggleDisability';\nimport {copyTextToClipboard} from '../../helpers/clipboard';\n\nexport const USER_REACTIONS_INLINE = false;\nconst USE_MEDIA_TAILS = false;\ntype MESSAGE_ACTION_TYPE = Message.messageService['action']['_'];\ntype IGNORE_ACTION_KEY = MESSAGE_ACTION_TYPE;\ntype IGNORE_ACTION_VALUE = true | ((message: Message.messageService) => boolean);\nconst IGNORE_ACTIONS: Map = new Map([\n ['messageActionHistoryClear', true],\n ['messageActionChatCreate', (message) => message.pFlags.out]\n // 'messageActionChannelMigrateFrom'\n] as [IGNORE_ACTION_KEY, IGNORE_ACTION_VALUE][]);\n\nexport const SERVICE_AS_REGULAR: Set = new Set();\n\nif(IS_CALL_SUPPORTED) {\n SERVICE_AS_REGULAR.add('messageActionPhoneCall');\n}\n\nconst TEST_SCROLL_TIMES: number = undefined;\nlet TEST_SCROLL = TEST_SCROLL_TIMES;\n\nlet queueId = 0;\n\ntype GenerateLocalMessageType = IsService extends true ? Message.messageService : Message.message;\n\nconst SPONSORED_MESSAGE_ID_OFFSET = 1;\nexport const STICKY_OFFSET = 3;\nconst SCROLLED_DOWN_THRESHOLD = 300;\nconst PEER_CHANGED_ERROR = new Error('peer changed');\n\nconst DO_NOT_SLICE_VIEWPORT = false;\nconst DO_NOT_SLICE_VIEWPORT_ON_RENDER = false;\nconst DO_NOT_UPDATE_MESSAGE_VIEWS = false;\nconst DO_NOT_UPDATE_MESSAGE_REACTIONS = false;\nconst DO_NOT_UPDATE_MESSAGE_REPLY = false;\n\nconst BIG_EMOJI_SIZES: {[size: number]: number} = {\n 1: 96,\n 2: 90,\n 3: 84,\n 4: 72,\n 5: 60,\n 6: 48,\n 7: 36\n};\nconst BIG_EMOJI_SIZES_LENGTH = Object.keys(BIG_EMOJI_SIZES).length;\n\ntype Bubble = {\n bubble: HTMLElement,\n mids: Set,\n groupedId?: string\n};\n\ntype MyHistoryResult = HistoryResult | {history: number[]};\n\nfunction getMainMidForGrouped(mids: number[]) {\n return Math.max(...mids);\n}\n\nexport default class ChatBubbles {\n public container: HTMLDivElement;\n public chatInner: HTMLDivElement;\n public scrollable: Scrollable;\n\n private getHistoryTopPromise: Promise;\n private getHistoryBottomPromise: Promise;\n\n // public messagesCount: number = -1;\n\n private unreadOut = new Set();\n public needUpdate: {replyToPeerId: PeerId, replyMid: number, mid: number}[] = []; // if need wrapSingleMessage\n\n public bubbles: {[mid: string]: HTMLElement} = {};\n public skippedMids: Set = new Set();\n public bubblesNewByGroupedId: {[groupId: string]: Bubble} = {};\n public bubblesNew: {[mid: string]: Bubble} = {};\n private dateMessages: {[timestamp: number]: {\n div: HTMLElement,\n firstTimestamp: number,\n container: HTMLElement,\n timeout?: number\n }} = {};\n\n private scrolledDown = true;\n private isScrollingTimeout = 0;\n\n private stickyIntersector: StickyIntersector;\n\n private unreaded: Map = new Map();\n private unreadedSeen: Set = new Set();\n private readPromise: Promise;\n\n private bubbleGroups: BubbleGroups;\n\n private preloader: ProgressivePreloader = null;\n\n // private messagesQueueOnRender: () => void = null;\n private messagesQueueOnRenderAdditional: () => void = null;\n\n private firstUnreadBubble: HTMLElement = null;\n private attachedUnreadBubble: boolean;\n\n public lazyLoadQueue: LazyLoadQueue;\n\n private middlewareHelper = getMiddleware();\n\n private log: ReturnType;\n\n public listenerSetter: ListenerSetter;\n\n private followStack: number[] = [];\n\n private isHeavyAnimationInProgress = false;\n private scrollingToBubble: HTMLElement;\n\n private isFirstLoad = true;\n private needReflowScroll: boolean;\n\n private fetchNewPromise: Promise;\n\n private passEntities: Partial<{\n [_ in MessageEntity['_']]: boolean\n }> = {};\n\n private onAnimateLadder: () => Promise | void;\n // private ladderDeferred: CancellablePromise;\n private resolveLadderAnimation: () => Promise;\n private emptyPlaceholderBubble: HTMLElement;\n\n private viewsMids: Set = new Set();\n private sendViewCountersDebounced: () => Promise;\n\n private isTopPaddingSet = false;\n\n private getSponsoredMessagePromise: Promise;\n\n private previousStickyDate: HTMLElement;\n private sponsoredMessage: SponsoredMessage.sponsoredMessage;\n\n private hoverBubble: HTMLElement;\n private hoverReaction: HTMLElement;\n private sliceViewportDebounced: DebounceReturnType;\n private resizeObserver: ResizeObserver;\n private willScrollOnLoad: boolean;\n public observer: SuperIntersectionObserver;\n\n private renderingMessages: Set = new Set();\n private setPeerCached: boolean;\n private attachPlaceholderOnRender: () => void;\n\n private bubblesToEject: Set = new Set();\n private bubblesToReplace: Map = new Map(); // TO -> FROM\n private updatePlaceholderPosition: () => void;\n private setPeerOptions: {lastMsgId: number; topMessage: number; savedPosition: ChatSavedPosition};\n\n private setPeerTempId: number = 0;\n\n private renderNewPromises: Set> = new Set();\n private updateGradient: boolean;\n\n private extendedMediaMessages: Set = new Set();\n private pollExtendedMediaMessagesPromise: Promise;\n\n private batchProcessor: BatchProcessor>>;\n\n // private reactions: Map;\n\n constructor(\n private chat: Chat,\n private managers: AppManagers\n ) {\n this.log = this.chat.log;\n // this.chat.log.error('Bubbles construction');\n\n this.listenerSetter = new ListenerSetter();\n\n this.constructBubbles();\n\n // * constructor end\n\n this.batchProcessor = new BatchProcessor({\n log: this.log,\n process: this.processBatch,\n possibleError: PEER_CHANGED_ERROR\n });\n this.bubbleGroups = new BubbleGroups(this.chat);\n this.preloader = new ProgressivePreloader({\n cancelable: false\n });\n this.lazyLoadQueue = new LazyLoadQueue(undefined, true);\n this.lazyLoadQueue.queueId = ++queueId;\n\n // this.reactions = new Map();\n\n // * events\n\n // will call when sent for update pos\n this.listenerSetter.add(rootScope)('history_update', async({storageKey, sequential, message}) => {\n if(this.chat.messagesStorageKey !== storageKey || this.chat.type === 'scheduled') {\n return;\n }\n\n const {mid} = message;\n const log = false ? this.log.bindPrefix('history_update-' + mid) : undefined;\n log && log('start');\n\n const bubble = this.bubbles[mid];\n if(!bubble) return;\n\n if(this.renderNewPromises.size) {\n log && log.error('will await new messages render');\n await Promise.all(Array.from(this.renderNewPromises));\n }\n\n if(this.messagesQueuePromise) {\n log && log.error('messages render in process');\n await this.messagesQueuePromise;\n }\n\n if(this.bubbles[mid] !== bubble) return;\n\n // await getHeavyAnimationPromise();\n\n const item = this.bubbleGroups.getItemByBubble(bubble);\n if(!item) { // probably a group item\n log && log.error('no item by bubble', bubble);\n return;\n } else if(item.mid === mid) {\n log && log.warn('wow what', item, mid);\n return;\n }\n\n if(sequential) {\n const group = item.group;\n const newItem = this.bubbleGroups.createItem(bubble, message);\n // newItem.mid = item.mid;\n const _items = this.bubbleGroups.itemsArr.slice();\n indexOfAndSplice(_items, item);\n const foundItem = this.bubbleGroups.findGroupSiblingByItem(newItem, _items);\n if(\n group === foundItem?.group ||\n (group === this.bubbleGroups.getLastGroup() && group.items.length === 1 && newItem.dateTimestamp === item.dateTimestamp) ||\n (this.peerId === rootScope.myId && sequential && newItem.dateTimestamp === item.dateTimestamp)\n ) {\n log && log('item has correct position', item);\n this.bubbleGroups.changeBubbleMid(bubble, mid);\n return;\n }\n }\n\n // return;\n\n // await fastRafPromise();\n // if(this.bubbles[mid] !== bubble) return;\n\n // const groupIndex = this.bubbleGroups.groups.indexOf(group);\n this.bubbleGroups.removeAndUnmountBubble(bubble);\n // if(!group.items.length) { // group has collapsed, next message can have higher mid so have to reposition them too\n // log && log('group has collapsed', item);\n\n // const siblingGroups = this.bubbleGroups.groups.slice(0, groupIndex + 1);\n // for(let length = siblingGroups.length, i = length - 2; i >= 0; --i) {\n // const siblingGroup = siblingGroups[i];\n // const siblingItems = siblingGroup.items;\n // const nextGroup = siblingGroups[i + 1];\n // const nextItems = nextGroup.items;\n\n // let _break = false, moved = false;\n // for(let j = siblingItems.length - 1; j >= 0; --j) {\n // const siblingItem = siblingItems[j];\n // const foundItem = this.bubbleGroups.findGroupSiblingByItem(siblingItem, nextItems);\n // if(!foundItem) {\n // _break = true;\n // break;\n // }\n\n // log('will move item', siblingItem, nextGroup);\n // this.bubbleGroups.removeAndUnmountBubble(siblingItem.bubble);\n // this.bubbleGroups.addItemToGroup(siblingItem, nextGroup);\n // moved = true;\n // }\n\n // if(moved) {\n // nextGroup.mount();\n // }\n\n // if(_break) {\n // break;\n // }\n // }\n // }\n\n const {groups} = this.groupBubbles([{bubble, message}]);\n this.bubbleGroups.mountUnmountGroups(groups);\n\n if(this.scrollingToBubble) {\n this.scrollToEnd();\n }\n\n log && log('end');\n\n // this.bubbleGroups.findIncorrentPositions();\n });\n\n this.listenerSetter.add(rootScope)('dialog_flush', ({peerId}) => {\n if(this.peerId === peerId) {\n this.deleteMessagesByIds(Object.keys(this.bubbles).map((m) => +m));\n }\n });\n\n // Calls when message successfully sent and we have an id\n this.listenerSetter.add(rootScope)('message_sent', async(e) => {\n const {storageKey, tempId, tempMessage, mid, message} = e;\n\n // ! can't use peerId to validate here, because id can be the same in 'scheduled' and 'chat' types\n if(this.chat.messagesStorageKey !== storageKey) {\n return;\n }\n\n const bubbles = this.bubbles;\n const _bubble = bubbles[tempId];\n if(_bubble) {\n const bubble = bubbles[tempId];\n bubbles[mid] = bubble;\n bubble.dataset.mid = '' + mid;\n delete bubbles[tempId];\n\n fastRaf(() => {\n const mid = +bubble.dataset.mid;\n if(bubbles[mid] === bubble && bubble.classList.contains('is-outgoing')) {\n bubble.classList.remove('is-sending', 'is-outgoing');\n bubble.classList.add((this.peerId === rootScope.myId && this.chat.type !== 'scheduled') || !this.unreadOut.has(mid) ? 'is-read' : 'is-sent');\n }\n });\n }\n\n if(this.unreadOut.has(tempId)) {\n this.unreadOut.delete(tempId);\n this.unreadOut.add(mid);\n }\n\n // * check timing of scheduled message\n if(this.chat.type === 'scheduled') {\n const timestamp = Date.now() / 1000 | 0;\n const maxTimestamp = tempMessage.date - 10;\n if(timestamp >= maxTimestamp) {\n this.deleteMessagesByIds([mid]);\n }\n }\n\n if(!_bubble) {\n return;\n }\n\n let messages: (Message.message | Message.messageService)[], tempIds: number[];\n const groupedId = (message as Message.message).grouped_id;\n if(groupedId) {\n messages = await this.managers.appMessagesManager.getMessagesByAlbum(groupedId);\n const mids = messages.map(({mid}) => mid);\n if(!mids.length || getMainMidForGrouped(mids) !== mid || bubbles[mid] !== _bubble) {\n return;\n }\n\n if(bubbles[mid] !== _bubble) {\n return;\n }\n\n tempIds = (Array.from(_bubble.querySelectorAll('.grouped-item')) as HTMLElement[]).map((el) => +el.dataset.mid);\n } else {\n messages = [message];\n tempIds = [tempId];\n }\n\n const reactionsElements = Array.from(_bubble.querySelectorAll('reactions-element')) as ReactionsElement[];\n if(reactionsElements.length) {\n reactionsElements.forEach((reactionsElement) => {\n reactionsElement.changeMessage(message as Message.message);\n });\n }\n\n (messages as Message.message[]).forEach((message, idx) => {\n if(!message) {\n return;\n }\n\n const tempId = tempIds[idx];\n const mid = message.mid;\n const bubble: HTMLElement = _bubble.querySelector(`.document-container[data-mid=\"${mid}\"]`) || _bubble;\n\n if(message._ !== 'message') {\n return;\n }\n\n if(message.replies) {\n const repliesElement = _bubble.querySelector('replies-element') as RepliesElement;\n if(repliesElement) {\n repliesElement.message = message;\n repliesElement.init();\n }\n }\n\n const media = message.media ?? {} as MessageMedia.messageMediaEmpty;\n const doc = (media as MessageMedia.messageMediaDocument).document as Document.document;\n const poll = (media as MessageMedia.messageMediaPoll).poll;\n const webPage = (media as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage;\n if(doc) {\n const div = bubble.querySelector(`.document-container[data-mid=\"${tempId}\"] .document`);\n if(div) {\n const container = findUpClassName(div, 'document-container');\n\n if(!tempMessage.media?.document?.thumbs?.length && doc.thumbs?.length) {\n getHeavyAnimationPromise().then(async() => {\n const timeSpan = div.querySelector('.time');\n const newDiv = await wrapDocument({message, fontSize: rootScope.settings.messagesTextSize});\n div.replaceWith(newDiv);\n\n if(timeSpan) {\n (newDiv.querySelector('.document') || newDiv).append(timeSpan);\n }\n });\n }\n\n if(container) {\n container.dataset.mid = '' + mid;\n }\n }\n\n const element = bubble.querySelector(`audio-element[data-mid=\"${tempId}\"], .document[data-doc-id=\"${tempId}\"], .media-round[data-mid=\"${tempId}\"]`) as HTMLElement;\n if(element) {\n if(element instanceof AudioElement || element.classList.contains('media-round')) {\n element.dataset.mid = '' + message.mid;\n delete element.dataset.isOutgoing;\n (element as any).message = message;\n (element as any).onLoad(true);\n } else {\n element.dataset.docId = '' + doc.id;\n (element as any).doc = doc;\n }\n }\n } else if(poll) {\n const pollElement = bubble.querySelector('poll-element') as PollElement;\n if(pollElement) {\n pollElement.message = message;\n pollElement.setAttribute('poll-id', '' + poll.id);\n pollElement.setAttribute('message-id', '' + mid);\n }\n } else if(webPage && !bubble.querySelector('.web')) {\n getHeavyAnimationPromise().then(() => {\n this.safeRenderMessage(message, true, bubble);\n this.scrollToBubbleIfLast(bubble);\n });\n }\n\n // set new mids to album items for mediaViewer\n if(groupedId) {\n const item = (bubble.querySelector(`.grouped-item[data-mid=\"${tempId}\"]`) as HTMLElement) || bubble; // * it can be .document-container\n if(item) {\n item.dataset.mid = '' + mid;\n }\n }\n });\n });\n\n this.listenerSetter.add(rootScope)('message_edit', async({storageKey, message}) => {\n if(storageKey !== this.chat.messagesStorageKey) return;\n\n const bubble = this.bubbles[message.mid];\n if(!bubble) return;\n\n await getHeavyAnimationPromise();\n if(this.bubbles[message.mid] !== bubble) return;\n\n this.safeRenderMessage(message, true, bubble);\n });\n\n this.listenerSetter.add(rootScope)('message_error', async({storageKey, tempId}) => {\n if(storageKey !== this.chat.messagesStorageKey) return;\n\n const bubble = this.bubbles[tempId];\n if(!bubble) return;\n\n await getHeavyAnimationPromise();\n if(this.bubbles[tempId] !== bubble) return;\n\n bubble.classList.remove('is-outgoing');\n bubble.classList.add('is-error');\n });\n\n this.listenerSetter.add(rootScope)('album_edit', ({peerId, messages, deletedMids}) => {\n if(peerId !== this.peerId) return;\n\n const mids = messages.map(({mid}) => mid);\n const oldMids = mids.concat(Array.from(deletedMids));\n const wasMainMid = getMainMidForGrouped(oldMids);\n const bubble = this.bubbles[wasMainMid];\n if(!bubble) {\n return;\n }\n\n const mainMid = getMainMidForGrouped(mids);\n const message = messages.find((message) => message.mid === mainMid);\n this.safeRenderMessage(message, true, bubble);\n });\n\n // this.listenerSetter.add(rootScope)('peer_title_edit', async(peerId) => {\n // if(peerId.isUser()) {\n // const middleware = this.getMiddleware();\n // const user = await this.managers.appUsersManager.getUser(peerId.toUserId());\n // if(!middleware()) return;\n\n // const isPremium = user?.pFlags?.premium;\n // const groups = this.bubbleGroups.groups.filter((group) => group.avatar?.peerId === peerId);\n // groups.forEach((group) => {\n // group.avatar.classList.toggle('is-premium', isPremium);\n // group.avatar.classList.toggle('tgico-star', isPremium);\n // });\n // }\n // });\n\n if(!DO_NOT_UPDATE_MESSAGE_REACTIONS/* && false */) {\n this.listenerSetter.add(rootScope)('messages_reactions', async(arr) => {\n if(this.chat.type === 'scheduled') {\n return;\n }\n\n let scrollSaver: ScrollSaver;\n\n const a = arr.map(async({message, changedResults}) => {\n if(this.peerId !== message.peerId) {\n return;\n }\n\n const result = await this.getMountedBubble(message.mid, message);\n if(!result) {\n return;\n }\n\n return {bubble: result.bubble, message, changedResults};\n });\n\n let top: number;\n (await Promise.all(a)).filter(Boolean).forEach(({bubble, message, changedResults}) => {\n if(!scrollSaver) {\n scrollSaver = this.createScrollSaver(false);\n scrollSaver.save();\n }\n\n const key = message.peerId + '_' + message.mid;\n const set = REACTIONS_ELEMENTS.get(key);\n if(set) {\n for(const element of set) {\n element.update(message, changedResults);\n }\n } else if(!message.reactions || !message.reactions.results.length) {\n return;\n } else {\n this.appendReactionsElementToBubble(bubble, message, message, changedResults);\n }\n });\n\n if(scrollSaver) {\n scrollSaver.restore();\n }\n });\n }\n\n !DO_NOT_UPDATE_MESSAGE_REPLY && this.listenerSetter.add(rootScope)('messages_downloaded', async({peerId, mids}) => {\n const middleware = this.getMiddleware();\n await getHeavyAnimationPromise();\n if(!middleware()) return;\n\n (mids as number[]).forEach((mid) => {\n const needUpdate = this.needUpdate;\n const filtered: typeof needUpdate[0][] = [];\n forEachReverse(this.needUpdate, (obj, idx) => {\n if(obj.replyMid === mid && obj.replyToPeerId === peerId) {\n this.needUpdate.splice(idx, 1)[0];\n filtered.push(obj);\n }\n });\n\n filtered.forEach(async({mid, replyMid, replyToPeerId}) => {\n const bubble = this.bubbles[mid];\n if(!bubble) return;\n\n const message = (await this.chat.getMessage(mid)) as Message.message;\n\n MessageRender.setReply({\n chat: this.chat,\n bubble,\n message\n });\n });\n });\n });\n\n attachStickerViewerListeners({\n listenTo: this.scrollable.container,\n listenerSetter: this.listenerSetter,\n findTarget: (e) => {\n const target = e.target as HTMLElement;\n const found = target.closest('.attachment.media-sticker-wrapper') || (findUpClassName(target, 'attachment') && target.closest('.custom-emoji'));\n return found as HTMLElement;\n }\n });\n attachClickEvent(this.scrollable.container, this.onBubblesClick, {listenerSetter: this.listenerSetter});\n // this.listenerSetter.add(this.bubblesContainer)('click', this.onBubblesClick/* , {capture: true, passive: false} */);\n\n this.listenerSetter.add(this.scrollable.container)('mousedown', (e) => {\n if(e.button !== 0) return;\n\n const code: HTMLElement = findUpTag(e.target, 'CODE');\n if(code) {\n cancelEvent(e);\n copyFromElement(code);\n\n const onClick = (e: MouseEvent) => {\n cancelEvent(e);\n toastNew({\n langPackKey: 'TextCopied',\n onClose: () => {\n detach();\n }\n });\n };\n\n const detach = attachClickEvent(window, onClick, {listenerSetter: this.listenerSetter, once: true, capture: true});\n return;\n }\n });\n\n /* if(false) */this.stickyIntersector = new StickyIntersector(this.scrollable.container, (stuck, target) => {\n for(const timestamp in this.dateMessages) {\n const dateMessage = this.dateMessages[timestamp];\n if(dateMessage.container === target) {\n const dateBubble = dateMessage.div;\n\n // dateMessage.container.classList.add('has-sticky-dates');\n\n // SetTransition(dateBubble, 'kek', stuck, this.previousStickyDate ? 300 : 0);\n // if(this.previousStickyDate) {\n // dateBubble.classList.add('kek');\n // }\n\n dateBubble.classList.toggle('is-sticky', stuck);\n if(stuck) {\n this.previousStickyDate = dateBubble;\n }\n\n break;\n }\n }\n\n if(this.previousStickyDate) {\n // fastRaf(() => {\n // this.bubblesContainer.classList.add('has-sticky-dates');\n // });\n }\n });\n\n if(!IS_SAFARI) {\n this.sliceViewportDebounced = debounce(this.sliceViewport.bind(this), 3000, false, true);\n }\n\n let middleware: ReturnType;\n useHeavyAnimationCheck(() => {\n this.isHeavyAnimationInProgress = true;\n this.lazyLoadQueue.lock();\n middleware = this.getMiddleware();\n\n // if(this.sliceViewportDebounced) {\n // this.sliceViewportDebounced.clearTimeout();\n // }\n }, () => {\n this.isHeavyAnimationInProgress = false;\n\n if(middleware?.()) {\n this.lazyLoadQueue.unlockAndRefresh();\n\n // if(this.sliceViewportDebounced) {\n // this.sliceViewportDebounced();\n // }\n }\n\n middleware = null;\n }, this.listenerSetter);\n }\n\n private constructBubbles() {\n const container = this.container = document.createElement('div');\n container.classList.add('bubbles', 'scrolled-down');\n\n const chatInner = this.chatInner = document.createElement('div');\n chatInner.classList.add('bubbles-inner');\n\n this.setScroll();\n\n container.append(this.scrollable.container);\n }\n\n public attachContainerListeners() {\n const container = this.container;\n\n this.chat.contextMenu.attachTo(container);\n this.chat.selection.attachListeners(container, new ListenerSetter());\n\n if(DEBUG) {\n this.listenerSetter.add(container)('dblclick', async(e) => {\n const bubble = findUpClassName(e.target, 'grouped-item') || findUpClassName(e.target, 'bubble');\n if(bubble) {\n const mid = +bubble.dataset.mid\n this.log('debug message:', await this.chat.getMessage(mid));\n this.highlightBubble(bubble);\n }\n });\n }\n\n if(!IS_MOBILE) {\n this.listenerSetter.add(container)('dblclick', async(e) => {\n if(this.chat.type === 'pinned' ||\n this.chat.selection.isSelecting ||\n !(await this.chat.canSend())) {\n return;\n }\n\n const target = e.target as HTMLElement;\n const bubble = target.classList.contains('bubble') ?\n target :\n (target.classList.contains('document-selection') ? target.parentElement : null);\n if(bubble && !bubble.classList.contains('bubble-first')) {\n const mid = +bubble.dataset.mid;\n const message = await this.chat.getMessage(mid);\n if(message.pFlags.is_outgoing) {\n return;\n }\n\n this.chat.input.initMessageReply(mid);\n }\n });\n } else if(IS_TOUCH_SUPPORTED) {\n const className = 'is-gesturing-reply';\n const MAX = 64;\n const replyAfter = MAX * .75;\n let shouldReply = false;\n let target: HTMLElement;\n let icon: HTMLElement;\n let swipeAvatar: HTMLElement;\n handleHorizontalSwipe({\n element: container,\n verifyTouchTarget: async(e) => {\n if(this.chat.type === 'pinned' || this.chat.selection.isSelecting || !(await this.chat.canSend())) {\n return false;\n }\n\n // cancelEvent(e);\n target = findUpClassName(e.target, 'bubble');\n if(target) {\n try {\n const avatar = target.parentElement.querySelector('.bubbles-group-avatar') as HTMLElement\n if(avatar) {\n const visibleRect = getVisibleRect(avatar, target);\n if(visibleRect) {\n swipeAvatar = avatar;\n }\n }\n } catch(err) {}\n\n [target, swipeAvatar].filter(Boolean).forEach((element) => {\n SetTransition({\n element,\n className,\n forwards: true,\n duration: 250\n });\n void element.offsetLeft; // reflow\n });\n\n if(!icon) {\n icon = document.createElement('span');\n icon.classList.add('tgico-reply_filled', 'bubble-gesture-reply-icon');\n } else {\n icon.classList.remove('is-visible');\n icon.style.opacity = '';\n }\n\n target/* .querySelector('.bubble-content') */.append(icon);\n }\n\n return !!target;\n },\n onSwipe: (xDiff) => {\n shouldReply = xDiff >= replyAfter;\n\n if(shouldReply && !icon.classList.contains('is-visible')) {\n icon.classList.add('is-visible');\n }\n icon.style.opacity = '' + Math.min(1, xDiff / replyAfter);\n\n const x = -Math.max(0, Math.min(MAX, xDiff));\n const transform = `translateX(${x}px)`;\n target.style.transform = transform;\n if(swipeAvatar) {\n swipeAvatar.style.transform = transform;\n }\n cancelContextMenuOpening();\n },\n onReset: () => {\n const _target = target;\n const _swipeAvatar = swipeAvatar;\n target = swipeAvatar = undefined;\n\n const onTransitionEnd = () => {\n if(icon.parentElement === _target) {\n icon.classList.remove('is-visible');\n icon.remove();\n }\n };\n\n [_target, _swipeAvatar].filter(Boolean).forEach((element, idx) => {\n SetTransition({\n element,\n className,\n forwards: false,\n duration: 250,\n onTransitionEnd: idx === 0 ? onTransitionEnd : undefined\n });\n });\n\n fastRaf(() => {\n _target.style.transform = '';\n if(_swipeAvatar) {\n _swipeAvatar.style.transform = '';\n }\n\n if(shouldReply) {\n const {mid} = _target.dataset;\n this.chat.input.initMessageReply(+mid);\n shouldReply = false;\n }\n });\n },\n listenerOptions: {capture: true}\n });\n }\n }\n\n public constructPeerHelpers() {\n // will call when message is sent (only 1)\n this.listenerSetter.add(rootScope)('history_append', async({storageKey, message}) => {\n if(storageKey !== this.chat.messagesStorageKey || this.chat.type === 'scheduled') return;\n\n if(rootScope.settings.animationsEnabled) {\n this.updateGradient = true;\n }\n\n if(!this.scrollable.loadedAll.bottom) {\n this.chat.setMessageId();\n } else {\n this.renderNewMessage(message, true);\n }\n });\n\n this.listenerSetter.add(rootScope)('history_multiappend', (message) => {\n if(this.peerId !== message.peerId || this.chat.type === 'scheduled') return;\n this.renderNewMessage(message);\n });\n\n this.listenerSetter.add(rootScope)('history_delete', ({peerId, msgs}) => {\n if(peerId !== this.peerId || this.chat.type === 'scheduled') {\n return;\n }\n\n this.deleteMessagesByIds(Array.from(msgs));\n });\n\n this.listenerSetter.add(rootScope)('dialog_unread', ({peerId}) => {\n if(peerId === this.peerId) {\n this.chat.input.setUnreadCount();\n\n getHeavyAnimationPromise().then(() => {\n this.updateUnreadByDialog();\n });\n }\n });\n\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\n if(!dialogs.has(this.peerId) || this.chat.type === 'scheduled') {\n return;\n }\n\n this.chat.input.setUnreadCount();\n });\n\n this.listenerSetter.add(rootScope)('dialog_notify_settings', (dialog) => {\n if(this.peerId !== dialog.peerId || this.chat.type === 'scheduled') {\n return;\n }\n\n this.chat.input.setUnreadCount();\n });\n\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n const {peerId} = this;\n if(peerId !== chatId.toPeerId(true)) {\n return;\n }\n\n const chat = await this.managers.appChatsManager.getChat(chatId);\n const hadRights = this.chatInner.classList.contains('has-rights');\n const hasRights = await this.chat.canSend();\n\n if(hadRights !== hasRights) {\n const callbacks = await Promise.all([\n this.finishPeerChange(),\n this.chat.input.finishPeerChange()\n ]);\n\n callbacks.forEach((callback) => callback());\n }\n\n if(!!(chat as MTChat.channel).pFlags.forum !== this.chat.isForum && this.chat.type === 'chat') {\n this.chat.peerId = 0;\n this.chat.appImManager.setPeer({peerId});\n }\n });\n\n this.listenerSetter.add(rootScope)('history_reload', (peerId) => {\n if(peerId !== this.peerId) {\n return;\n }\n\n const mids = getObjectKeysAndSort(this.bubbles, 'desc').filter((mid) => mid > 0);\n const middleware = this.getMiddleware();\n this.managers.appMessagesManager.reloadMessages(this.peerId, mids).then((messages) => {\n if(!middleware()) return;\n\n const toDelete: number[] = [];\n messages.forEach((message, idx) => {\n const mid = mids[idx];\n if(message) {\n const bubble = this.bubbles[message.mid];\n if(!bubble) return;\n\n this.safeRenderMessage(message, true, bubble);\n } else {\n toDelete.push(mid);\n }\n });\n\n this.deleteMessagesByIds(toDelete);\n\n this.setLoaded('top', false);\n this.setLoaded('bottom', false);\n this.scrollable.checkForTriggers();\n });\n });\n\n this.listenerSetter.add(rootScope)('settings_updated', async({key}) => {\n if(key === 'settings.emoji.big') {\n const middleware = this.getMiddleware();\n const mids = getObjectKeysAndSort(this.bubbles, 'desc');\n const m = mids.map(async(mid) => {\n const bubble = this.bubbles[mid];\n if(bubble.classList.contains('can-have-big-emoji')) {\n return {bubble, message: await this.chat.getMessage(mid)};\n }\n });\n\n const awaited = await Promise.all(m);\n if(!middleware()) {\n return;\n }\n\n awaited.filter(Boolean).forEach(({bubble, message}) => {\n if(this.bubbles[message.mid] !== bubble) {\n return;\n }\n\n this.safeRenderMessage(message, true, bubble);\n });\n }\n });\n\n !DO_NOT_UPDATE_MESSAGE_VIEWS && this.listenerSetter.add(rootScope)('messages_views', (arr) => {\n if(this.chat.type === 'scheduled') return;\n\n fastRaf(() => {\n let scrollSaver: ScrollSaver;\n for(const {peerId, views, mid} of arr) {\n if(this.peerId !== peerId) continue;\n\n const bubble = this.bubbles[mid];\n if(!bubble) continue;\n\n const postViewsElements = Array.from(bubble.querySelectorAll('.post-views')) as HTMLElement[];\n if(!postViewsElements.length) continue;\n\n const str = formatNumber(views, 1);\n let different = false;\n postViewsElements.forEach((postViews) => {\n if(different || postViews.textContent !== str) {\n if(!scrollSaver) {\n scrollSaver = this.createScrollSaver(true);\n scrollSaver.save();\n }\n\n different = true;\n postViews.textContent = str;\n }\n });\n }\n\n scrollSaver?.restore();\n });\n });\n\n this.observer = new SuperIntersectionObserver({root: this.scrollable.container});\n\n this.sendViewCountersDebounced = debounce(() => {\n const mids = [...this.viewsMids];\n this.viewsMids.clear();\n\n this.managers.appMessagesManager.incrementMessageViews(this.peerId, mids);\n }, 1000, false, true);\n\n // * pinned part start\n this.listenerSetter.add(rootScope)('peer_pinned_messages', ({peerId, mids, pinned}) => {\n if(this.chat.type !== 'pinned' || peerId !== this.peerId) {\n return;\n }\n\n if(mids) {\n if(!pinned) {\n this.deleteMessagesByIds(mids);\n }\n }\n });\n // * pinned part end\n\n // * scheduled part start\n const onUpdate = async() => {\n this.chat.topbar.setTitle((await this.managers.appMessagesManager.getScheduledMessagesStorage(this.peerId)).size);\n };\n\n this.listenerSetter.add(rootScope)('scheduled_new', (message) => {\n if(this.chat.type !== 'scheduled' || message.peerId !== this.peerId) return;\n\n this.renderNewMessage(message);\n onUpdate();\n });\n\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId, mids}) => {\n if(this.chat.type !== 'scheduled' || peerId !== this.peerId) return;\n\n this.deleteMessagesByIds(mids);\n onUpdate();\n });\n // * scheduled part end\n }\n\n private get peerId() {\n return this.chat.peerId;\n }\n\n public get messagesQueuePromise() {\n return this.batchProcessor.queuePromise;\n }\n\n private createScrollSaver(reverse = true) {\n const scrollSaver = new ScrollSaver(this.scrollable, '.bubble:not(.is-date)', reverse);\n return scrollSaver;\n }\n\n private unreadedObserverCallback = (entry: IntersectionObserverEntry) => {\n if(entry.isIntersecting) {\n const target = entry.target as HTMLElement;\n const mid = this.unreaded.get(target as HTMLElement);\n this.onUnreadedInViewport(target, mid);\n }\n };\n\n private viewsObserverCallback = (entry: IntersectionObserverEntry) => {\n if(entry.isIntersecting) {\n const mid = +(entry.target as HTMLElement).dataset.mid;\n this.observer.unobserve(entry.target, this.viewsObserverCallback);\n\n if(mid) {\n this.viewsMids.add(mid);\n this.sendViewCountersDebounced();\n } else {\n const {sponsoredMessage} = this;\n const randomId = sponsoredMessage?.random_id;\n if(randomId) {\n this.managers.appChatsManager.viewSponsoredMessage(this.peerId.toChatId(), randomId);\n delete sponsoredMessage.random_id;\n }\n }\n }\n };\n\n private stickerEffectObserverCallback = (entry: IntersectionObserverEntry) => {\n if(entry.isIntersecting) {\n this.observer.unobserve(entry.target, this.stickerEffectObserverCallback);\n\n const attachmentDiv: HTMLElement = entry.target.querySelector('.attachment');\n getHeavyAnimationPromise().then(() => {\n if(isInDOM(attachmentDiv)) {\n simulateClickEvent(attachmentDiv);\n }\n });\n }\n };\n\n private createResizeObserver() {\n if(!('ResizeObserver' in window) || this.resizeObserver) {\n return;\n }\n\n const container = this.scrollable.container;\n let wasHeight = 0/* container.offsetHeight */;\n let resizing = false;\n let skip = false;\n let scrolled = 0;\n let part = 0;\n let rAF = 0;\n // let skipNext = true;\n\n const onResizeEnd = () => {\n const height = container.offsetHeight;\n const isScrolledDown = this.scrollable.isScrolledDown;\n if(height !== wasHeight && (!skip || !isScrolledDown)) { // * fix opening keyboard while ESG is active, offsetHeight will change right between 'start' and this first frame\n part += wasHeight - height;\n }\n\n /* if(DEBUG) {\n this.log('resize end', scrolled, part, this.scrollable.scrollTop, height, wasHeight, this.scrollable.isScrolledDown);\n } */\n\n if(part) {\n this.scrollable.setScrollTopSilently(this.scrollable.scrollTop + Math.round(part));\n }\n\n wasHeight = height;\n scrolled = 0;\n rAF = 0;\n part = 0;\n resizing = false;\n skip = false;\n };\n\n const setEndRAF = (single: boolean) => {\n if(rAF) window.cancelAnimationFrame(rAF);\n rAF = window.requestAnimationFrame(single ? onResizeEnd : () => {\n rAF = window.requestAnimationFrame(onResizeEnd);\n // this.log('resize after RAF', part);\n });\n };\n\n const processEntries: ResizeObserverCallback = (entries) => {\n /* if(skipNext) {\n skipNext = false;\n return;\n } */\n\n if(skip) {\n setEndRAF(false);\n return;\n }\n\n const entry = entries[0];\n const height = entry.contentRect.height;/* Math.ceil(entry.contentRect.height); */\n\n if(!wasHeight) {\n wasHeight = height;\n return;\n }\n\n const realDiff = wasHeight - height;\n let diff = realDiff + part;\n const _part = diff % 1;\n diff -= _part;\n\n if(!resizing) {\n resizing = true;\n\n /* if(DEBUG) {\n this.log('resize start', realDiff, this.scrollable.scrollTop, this.scrollable.container.offsetHeight, this.scrollable.isScrolledDown);\n } */\n\n if(realDiff < 0 && this.scrollable.isScrolledDown) {\n // if(isSafari) { // * fix opening keyboard while ESG is active\n part = -realDiff;\n // }\n\n skip = true;\n setEndRAF(false);\n return;\n }\n }\n\n scrolled += diff;\n\n /* if(DEBUG) {\n this.log('resize', wasHeight - height, diff, this.scrollable.container.offsetHeight, this.scrollable.isScrolledDown, height, wasHeight);\n } */\n\n if(diff) {\n const needScrollTop = this.scrollable.scrollTop + diff;\n this.scrollable.setScrollTopSilently(needScrollTop);\n }\n\n setEndRAF(false);\n\n part = _part;\n wasHeight = height;\n };\n\n const resizeObserver = this.resizeObserver = new ResizeObserver(processEntries);\n resizeObserver.observe(container);\n }\n\n private destroyResizeObserver() {\n const resizeObserver = this.resizeObserver;\n if(!resizeObserver) {\n return;\n }\n\n resizeObserver.disconnect();\n this.resizeObserver = undefined;\n }\n\n private onBubblesMouseMove = async(e: MouseEvent) => {\n const content = findUpClassName(e.target, 'bubble-content');\n if(\n this.chat.type !== 'scheduled' &&\n content &&\n !this.chat.selection.isSelecting &&\n !findUpClassName(e.target, 'service') &&\n !findUpClassName(e.target, 'bubble-beside-button')\n ) {\n const bubble = findUpClassName(content, 'bubble');\n if(!this.chat.selection.canSelectBubble(bubble)) {\n this.unhoverPrevious();\n return;\n }\n\n let {hoverBubble, hoverReaction} = this;\n if(bubble === hoverBubble) {\n return;\n }\n\n this.unhoverPrevious();\n\n hoverBubble = this.hoverBubble = bubble;\n hoverReaction = this.hoverReaction;\n // hoverReaction = contentWrapper.querySelector('.bubble-hover-reaction');\n if(!hoverReaction) {\n hoverReaction = this.hoverReaction = document.createElement('div');\n hoverReaction.classList.add('bubble-hover-reaction');\n\n const stickerWrapper = document.createElement('div');\n stickerWrapper.classList.add('bubble-hover-reaction-sticker');\n hoverReaction.append(stickerWrapper);\n\n content.append(hoverReaction);\n\n let message = await this.chat.getMessage(+bubble.dataset.mid);\n if(message?._ !== 'message') {\n this.unhoverPrevious();\n return;\n }\n\n message = await this.managers.appMessagesManager.getGroupsFirstMessage(message);\n\n const middleware = this.getMiddleware(() => this.hoverReaction === hoverReaction);\n Promise.all([\n this.managers.appReactionsManager.getAvailableReactionsByMessage(message),\n pause(400)\n ]).then(([availableReactions]) => {\n const availableReaction = availableReactions[0];\n if(!availableReaction) {\n hoverReaction.remove();\n return;\n }\n\n wrapSticker({\n div: stickerWrapper,\n doc: availableReaction.select_animation,\n width: 18,\n height: 18,\n needUpscale: true,\n middleware,\n group: this.chat.animationGroup,\n withThumb: false,\n needFadeIn: false\n }).then(({render}) => render).then((player) => {\n assumeType(player);\n\n player.addEventListener('firstFrame', () => {\n if(!middleware()) {\n // debugger;\n return;\n }\n\n hoverReaction.dataset.loaded = '1';\n this.setHoverVisible(hoverReaction, true);\n }, {once: true});\n\n attachClickEvent(hoverReaction, (e) => {\n cancelEvent(e); // cancel triggering selection\n\n this.managers.appReactionsManager.sendReaction(message as Message.message, availableReaction);\n this.unhoverPrevious();\n }, {listenerSetter: this.listenerSetter});\n }, noop);\n });\n } else if(hoverReaction.dataset.loaded) {\n this.setHoverVisible(hoverReaction, true);\n }\n } else {\n this.unhoverPrevious();\n }\n };\n\n public setReactionsHoverListeners() {\n this.listenerSetter.add(contextMenuController)('toggle', this.unhoverPrevious);\n this.listenerSetter.add(overlayCounter)('change', this.unhoverPrevious);\n this.listenerSetter.add(this.chat.selection)('toggle', this.unhoverPrevious);\n this.listenerSetter.add(this.container)('mousemove', this.onBubblesMouseMove);\n }\n\n private setHoverVisible(hoverReaction: HTMLElement, visible: boolean) {\n if(hoverReaction.parentElement) {\n hoverReaction.parentElement.classList.toggle('hover-reaction-visible', visible);\n }\n\n SetTransition({\n element: hoverReaction,\n className: 'is-visible',\n forwards: visible,\n duration: 200,\n onTransitionEnd: visible ? undefined : () => {\n hoverReaction.remove();\n },\n useRafs: 2\n });\n }\n\n private unhoverPrevious = () => {\n const {hoverBubble, hoverReaction} = this;\n if(hoverBubble) {\n this.setHoverVisible(hoverReaction, false);\n this.hoverBubble = undefined;\n this.hoverReaction = undefined;\n }\n };\n\n public setStickyDateManually() {\n return;\n\n const timestamps = Object.keys(this.dateMessages).map((k) => +k).sort((a, b) => b - a);\n let lastVisible: HTMLElement;\n\n // if(this.chatInner.classList.contains('is-scrolling')) {\n const {scrollTop} = this.scrollable.container;\n const isOverflown = scrollTop > 0;\n if(isOverflown) {\n for(const timestamp of timestamps) {\n const dateMessage = this.dateMessages[timestamp];\n const visibleRect = getVisibleRect(dateMessage.container, this.scrollable.container);\n if(visibleRect && visibleRect.overflow.top) {\n lastVisible = dateMessage.div;\n } else if(lastVisible) {\n break;\n }\n }\n }\n // }\n\n if(lastVisible === this.previousStickyDate) {\n return;\n }\n\n if(lastVisible) {\n const needReflow = /* !!this.chat.setPeerPromise || */!this.previousStickyDate;\n if(needReflow) {\n lastVisible.classList.add('no-transition');\n }\n\n lastVisible.classList.add('is-sticky');\n\n if(needReflow) {\n void lastVisible.offsetLeft; // reflow\n lastVisible.classList.remove('no-transition');\n }\n }\n\n if(this.previousStickyDate && this.previousStickyDate !== lastVisible) {\n this.previousStickyDate.classList.remove('is-sticky');\n }\n\n this.previousStickyDate = lastVisible;\n }\n\n public getRenderedLength() {\n return Object.keys(this.bubbles).length - this.skippedMids.size;\n }\n\n private onUnreadedInViewport(target: HTMLElement, mid: number) {\n this.unreadedSeen.add(mid);\n this.observer.unobserve(target, this.unreadedObserverCallback);\n this.unreaded.delete(target);\n this.readUnreaded();\n }\n\n private readUnreaded() {\n if(this.readPromise) return;\n\n const middleware = this.getMiddleware();\n this.readPromise = idleController.getFocusPromise().then(async() => {\n if(!middleware()) return;\n let maxId = Math.max(...Array.from(this.unreadedSeen));\n\n // ? if message with maxId is not rendered ?\n if(this.scrollable.loadedAll.bottom) {\n const bubblesMaxId = Math.max(...Object.keys(this.bubbles).map((i) => +i));\n if(maxId >= bubblesMaxId) {\n maxId = Math.max((await this.chat.getHistoryMaxId()) || 0, maxId);\n }\n }\n\n this.unreaded.forEach((mid, target) => {\n if(mid <= maxId) {\n this.onUnreadedInViewport(target, mid);\n }\n });\n\n const readContents: number[] = [];\n for(const mid of this.unreadedSeen) {\n const message: MyMessage = await this.chat.getMessage(mid);\n if(isMentionUnread(message)) {\n readContents.push(mid);\n }\n }\n\n this.managers.appMessagesManager.readMessages(this.peerId, readContents);\n\n this.unreadedSeen.clear();\n\n if(DEBUG) {\n this.log('will readHistory by maxId:', maxId);\n }\n\n // return;\n\n return this.managers.appMessagesManager.readHistory(this.peerId, maxId, this.chat.threadId).catch((err: any) => {\n this.log.error('readHistory err:', err);\n this.managers.appMessagesManager.readHistory(this.peerId, maxId, this.chat.threadId);\n }).finally(() => {\n if(!middleware()) return;\n this.readPromise = undefined;\n\n if(this.unreadedSeen.size) {\n this.readUnreaded();\n }\n });\n });\n }\n\n public onBubblesClick = async(e: Event) => {\n let target = e.target as HTMLElement;\n let bubble: HTMLElement = null;\n try {\n bubble = findUpClassName(target, 'bubble');\n } catch(err) {}\n\n if(!bubble && !this.chat.selection.isSelecting) {\n const avatar = findUpClassName(target, 'user-avatar');\n if(!avatar) {\n return;\n }\n\n const peerId = avatar.dataset.peerId.toPeerId();\n if(peerId !== NULL_PEER_ID) {\n this.chat.appImManager.setInnerPeer({peerId});\n } else {\n toast(I18n.format('HidAccount', true));\n }\n return;\n }\n\n if(bubble.classList.contains('is-date') && findUpClassName(target, 'bubble-content')) {\n if(bubble.classList.contains('is-fake')) {\n bubble = bubble.previousElementSibling as HTMLElement;\n }\n\n if(bubble.classList.contains('is-sticky') && !this.chatInner.classList.contains('is-scrolling')) {\n return;\n }\n\n for(const timestamp in this.dateMessages) {\n const d = this.dateMessages[timestamp];\n if(d.div === bubble) {\n PopupElement.createPopup(PopupDatePicker, new Date(+timestamp), this.onDatePick).show();\n break;\n }\n }\n\n return;\n }\n\n if(!IS_TOUCH_SUPPORTED && findUpClassName(target, 'time')) {\n this.chat.selection.toggleByElement(bubble);\n return;\n }\n\n // ! Trusted - due to audio autoclick\n if(this.chat.selection.isSelecting && e.isTrusted) {\n if(bubble.classList.contains('service') && bubble.dataset.mid === undefined) {\n return;\n }\n\n cancelEvent(e);\n // console.log('bubble click', e);\n\n if(IS_TOUCH_SUPPORTED && this.chat.selection.selectedText) {\n this.chat.selection.selectedText = undefined;\n return;\n }\n\n // this.chatSelection.toggleByBubble(bubble);\n this.chat.selection.toggleByElement(findUpClassName(target, 'grouped-item') || bubble);\n return;\n }\n\n const mediaSpoiler: HTMLElement = findUpClassName(target, 'media-spoiler-container');\n if(mediaSpoiler) {\n onMediaSpoilerClick({\n event: e,\n mediaSpoiler\n });\n return;\n }\n\n const contactDiv: HTMLElement = findUpClassName(target, 'contact');\n if(contactDiv) {\n const peerId = contactDiv.dataset.peerId.toPeerId();\n if(peerId) {\n this.chat.appImManager.setInnerPeer({\n peerId\n });\n } else {\n const phone = contactDiv.querySelector('.contact-number');\n copyTextToClipboard(phone.innerText.replace(/\\s/g, ''));\n toastNew({langPackKey: 'PhoneCopied'});\n cancelEvent(e);\n }\n\n return;\n }\n\n const callDiv: HTMLElement = findUpClassName(target, 'bubble-call');\n if(callDiv) {\n this.chat.appImManager.callUser(this.peerId.toUserId(), callDiv.dataset.type as any);\n return;\n }\n\n const buyButton: HTMLElement = findUpClassName(target, 'is-buy');\n if(buyButton) {\n cancelEvent(e);\n\n const message = await this.chat.getMessage(+bubble.dataset.mid);\n if(!message) {\n return;\n }\n\n new PopupPayment(\n message as Message.message,\n await this.managers.appPaymentsManager.getInputInvoiceByPeerId(message.peerId, message.mid)\n );\n return;\n }\n\n const reactionElement = findUpTag(target, 'REACTION-ELEMENT') as ReactionElement;\n if(reactionElement) {\n cancelEvent(e);\n if(reactionElement.classList.contains('is-inactive')) {\n return;\n }\n\n const reactionsElement = reactionElement.parentElement as ReactionsElement;\n const reactionCount = reactionsElement.getReactionCount(reactionElement);\n\n const message = reactionsElement.getMessage();\n this.managers.appReactionsManager.sendReaction(message, reactionCount.reaction);\n\n return;\n }\n\n const stickerEmojiEl = findUpAttribute(target, 'data-sticker-emoji');\n if(stickerEmojiEl && stickerEmojiEl.parentElement.querySelectorAll('[data-sticker-emoji]').length === 1 && bubble.classList.contains('emoji-big')) {\n onEmojiStickerClick({\n event: e,\n container: stickerEmojiEl,\n managers: this.managers,\n middleware: this.getMiddleware(),\n peerId: this.peerId\n });\n\n return;\n }\n\n const commentsDiv: HTMLElement = findUpClassName(target, 'replies');\n if(commentsDiv) {\n const bubbleMid = +bubble.dataset.mid;\n if(this.peerId === REPLIES_PEER_ID) {\n const message = await this.chat.getMessage(bubbleMid) as Message.message;\n const peerId = getPeerId(message.reply_to.reply_to_peer_id);\n const threadId = message.reply_to.reply_to_top_id;\n const lastMsgId = message.fwd_from.saved_from_msg_id;\n this.chat.appImManager.openThread({\n peerId,\n lastMsgId,\n threadId\n });\n } else {\n const message1 = await this.chat.getMessage(bubbleMid);\n const message = await this.managers.appMessagesManager.getMessageWithReplies(message1 as Message.message);\n const replies = message.replies;\n if(replies) {\n this.managers.appMessagesManager.getDiscussionMessage(this.peerId, message.mid).then((message) => {\n this.chat.appImManager.setInnerPeer({\n peerId: replies.channel_id.toPeerId(true),\n type: 'discussion',\n threadId: (message as MyMessage).mid\n });\n });\n }\n }\n\n return;\n }\n\n const via = findUpClassName(target, 'is-via');\n if(via) {\n const el = via.querySelector('.peer-title') as HTMLElement;\n if(target === el || findUpAsChild(target, el)) {\n const message = el.innerText + ' ';\n this.managers.appDraftsManager.setDraft(this.peerId, this.chat.threadId, message);\n cancelEvent(e);\n\n return;\n }\n }\n\n const nameDiv = findUpClassName(target, 'peer-title') || findUpTag(target, 'AVATAR-ELEMENT') || findUpAttribute(target, 'data-saved-from');\n if(nameDiv && nameDiv !== bubble) {\n target = nameDiv || target;\n const peerIdStr = target.dataset.peerId || target.getAttribute('peer') || (target as AvatarElement).peerId;\n const savedFrom = target.dataset.savedFrom;\n if(typeof(peerIdStr) === 'string' || savedFrom) {\n if(savedFrom) {\n const [peerId, mid] = savedFrom.split('_');\n if(target.classList.contains('is-receipt-link')) {\n const message = await this.managers.appMessagesManager.getMessageByPeer(peerId.toPeerId(), +mid);\n if(message) {\n const inputInvoice = await this.managers.appPaymentsManager.getInputInvoiceByPeerId(this.peerId, +bubble.dataset.mid);\n new PopupPayment(message as Message.message, inputInvoice, undefined, true);\n }\n } else {\n this.chat.appImManager.setInnerPeer({\n peerId: peerId.toPeerId(),\n lastMsgId: +mid\n });\n }\n } else {\n const peerId = peerIdStr.toPeerId();\n if(peerId !== NULL_PEER_ID) {\n this.chat.appImManager.setInnerPeer({peerId});\n } else {\n toast(I18n.format('HidAccount', true));\n }\n }\n }\n\n return;\n }\n\n // this.log('chatInner click:', target);\n // const isVideoComponentElement = target.tagName === 'SPAN' && findUpClassName(target, 'media-container');\n /* if(isVideoComponentElement) {\n const video = target.parentElement.querySelector('video') as HTMLElement;\n if(video) {\n video.click(); // hot-fix for time and play button\n return;\n }\n } */\n\n if(bubble.classList.contains('sticker') && target.parentElement.classList.contains('attachment')) {\n const messageId = +bubble.dataset.mid;\n const message = await this.chat.getMessage(messageId);\n\n const doc = ((message as Message.message).media as MessageMedia.messageMediaDocument)?.document as Document.document;\n\n if(doc?.stickerSetInput) {\n new PopupStickers(doc.stickerSetInput).show();\n }\n\n return;\n }\n\n const documentDiv = findUpClassName(target, 'document-with-thumb');\n if((target.tagName === 'IMG' && !target.classList.contains('emoji') && !target.classList.contains('document-thumb')) ||\n target.classList.contains('album-item') ||\n // || isVideoComponentElement\n (target.tagName === 'VIDEO' && !bubble.classList.contains('round')) ||\n (documentDiv && !documentDiv.querySelector('.preloader-container')) ||\n target.classList.contains('canvas-thumbnail')) {\n const groupedItem = findUpClassName(target, 'album-item') || findUpClassName(target, 'document-container');\n const preloader = (groupedItem || bubble).querySelector('.preloader-container');\n if(preloader) {\n simulateClickEvent(preloader);\n cancelEvent(e);\n return;\n }\n\n cancelEvent(e);\n const messageId = +(groupedItem || bubble).dataset.mid;\n const message = await this.chat.getMessage(messageId);\n if(!message) {\n this.log.warn('no message by messageId:', messageId);\n return;\n }\n\n const SINGLE_MEDIA_CLASSNAME = 'webpage';\n const isSingleMedia = bubble.classList.contains(SINGLE_MEDIA_CLASSNAME);\n\n const f = documentDiv ? (media: any) => {\n return AppMediaViewer.isMediaCompatibleForDocumentViewer(media);\n } : (media: any) => {\n return media._ === 'photo' || ['video', 'gif'].includes(media.type);\n };\n\n const targets: {element: HTMLElement, mid: number, peerId: PeerId}[] = [];\n const ids = isSingleMedia ? [messageId] : (await Promise.all(Object.keys(this.bubbles).map((k) => +k).map(async(mid) => {\n /* if(isSingleMedia && !this.bubbles[id].classList.contains(SINGLE_MEDIA_CLASSNAME)) {\n return false;\n } */\n // if(!this.scrollable.visibleElements.find((e) => e.element === this.bubbles[id])) return false;\n\n const message = await this.chat.getMessage(mid);\n const media = getMediaFromMessage(message);\n\n return media && f(media) && mid;\n }))).filter(Boolean).sort((a, b) => a - b);\n\n ids.forEach((id) => {\n let selector: string;\n if(documentDiv) {\n selector = '.document-container';\n } else {\n const withTail = this.bubbles[id].classList.contains('with-media-tail');\n selector = '.album-item video, .album-item img, .preview video, .preview img, ';\n if(withTail) {\n selector += '.bubble__media-container';\n } else {\n selector += '.attachment video, .attachment img';\n }\n }\n\n const elements = Array.from(this.bubbles[id].querySelectorAll(selector)) as HTMLElement[];\n const parents: Set = new Set();\n if(documentDiv) {\n elements.forEach((element) => {\n targets.push({\n element: element.querySelector('.document-ico'),\n mid: +element.dataset.mid,\n peerId: this.peerId\n });\n });\n } else {\n const hasAspecter = !!this.bubbles[id].querySelector('.media-container-aspecter');\n elements.forEach((element) => {\n if(hasAspecter && !findUpClassName(element, 'media-container-aspecter')) return;\n const albumItem = findUpClassName(element, 'album-item');\n const parent = albumItem || element.parentElement;\n if(parents.has(parent)) return;\n parents.add(parent);\n targets.push({\n element,\n mid: albumItem ? +albumItem.dataset.mid : id,\n peerId: this.peerId\n });\n });\n }\n });\n\n targets.sort((a, b) => a.mid - b.mid);\n\n const idx = targets.findIndex((t) => t.mid === messageId);\n\n if(DEBUG) {\n this.log('open mediaViewer single with ids:', ids, idx, targets);\n }\n\n if(!targets[idx]) {\n this.log('no target for media viewer!', target);\n return;\n }\n\n new AppMediaViewer()\n .setSearchContext({\n threadId: this.chat.threadId,\n peerId: this.peerId,\n inputFilter: {_: documentDiv ? 'inputMessagesFilterDocument' : 'inputMessagesFilterPhotoVideo'},\n useSearch: this.chat.type !== 'scheduled' && !isSingleMedia,\n isScheduled: this.chat.type === 'scheduled'\n })\n .openMedia(message, targets[idx].element, 0, true, targets.slice(0, idx), targets.slice(idx + 1));\n\n // appMediaViewer.openMedia(message, target as HTMLImageElement);\n return;\n }\n\n if(['IMG', 'DIV', 'SPAN'/* , 'A' */].indexOf(target.tagName) === -1) target = findUpTag(target, 'DIV');\n\n if(['DIV', 'SPAN'].indexOf(target.tagName) !== -1/* || target.tagName === 'A' */) {\n if(target.classList.contains('goto-original')) {\n const savedFrom = bubble.dataset.savedFrom;\n const [peerId, mid] = savedFrom.split('_');\n // //this.log('savedFrom', peerId, msgID);\n this.chat.appImManager.setInnerPeer({\n peerId: peerId.toPeerId(),\n lastMsgId: +mid\n });\n return;\n } else if(target.classList.contains('forward')) {\n const mid = +bubble.dataset.mid;\n const message = await this.managers.appMessagesManager.getMessageByPeer(this.peerId, mid);\n new PopupForward({\n [this.peerId]: await this.managers.appMessagesManager.getMidsByMessage(message)\n });\n // appSidebarRight.forwardTab.open([mid]);\n return;\n }\n\n let isReplyClick = false;\n\n try {\n isReplyClick = !!findUpClassName(e.target, 'reply');\n } catch(err) {}\n\n if(isReplyClick && bubble.classList.contains('is-reply')/* || bubble.classList.contains('forwarded') */) {\n const bubbleMid = +bubble.dataset.mid;\n this.followStack.push(bubbleMid);\n\n const message = (await this.chat.getMessage(bubbleMid)) as Message.message;\n\n const replyToPeerId = message.reply_to.reply_to_peer_id ? getPeerId(message.reply_to.reply_to_peer_id) : this.peerId;\n const replyToMid = message.reply_to.reply_to_msg_id;\n\n this.chat.appImManager.setInnerPeer({\n peerId: replyToPeerId,\n lastMsgId: replyToMid,\n type: this.chat.type,\n threadId: this.chat.threadId\n });\n\n /* if(this.chat.type === 'discussion') {\n this.chat.appImManager.setMessageId(, originalMessageId);\n } else {\n this.chat.appImManager.setInnerPeer(this.peerId, originalMessageId);\n } */\n // this.chat.setMessageId(, originalMessageId);\n }\n }\n\n // console.log('chatInner click', e);\n };\n\n public async onGoDownClick() {\n if(!this.followStack.length) {\n // this.onScroll(true, undefined, true);\n this.chat.setMessageId(/* , dialog.top_message */);\n // const dialog = this.appMessagesManager.getDialogByPeerId(this.peerId)[0];\n\n // if(dialog) {\n // this.chat.setPeer(this.peerId/* , dialog.top_message */);\n // } else {\n // this.log('will scroll down 3');\n // this.scroll.scrollTop = this.scroll.scrollHeight;\n // }\n\n return;\n }\n\n const middleware = this.getMiddleware();\n const slice = this.followStack.slice();\n const messages = await Promise.all(slice.map((mid) => this.chat.getMessage(mid)));\n if(!middleware()) return;\n\n slice.forEach((mid, idx) => {\n const message = messages[idx];\n\n const bubble = this.bubbles[mid];\n let bad = true;\n if(bubble) {\n const rect = bubble.getBoundingClientRect();\n bad = (windowSize.height / 2) > rect.top;\n } else if(message) {\n bad = false;\n }\n\n if(bad) {\n this.followStack.splice(this.followStack.indexOf(mid), 1);\n }\n });\n\n this.followStack.sort((a, b) => b - a);\n\n const mid = this.followStack.pop();\n this.chat.setMessageId(mid);\n }\n\n public getBubbleByPoint(verticalSide: 'top' | 'bottom') {\n const slice = this.getViewportSlice();\n const item = slice.visible[verticalSide === 'top' ? 0 : slice.visible.length - 1];\n return item?.element;\n }\n\n public async getGroupedBubble(groupId: string) {\n const mids = await this.managers.appMessagesManager.getMidsByAlbum(groupId);\n for(const mid of mids) {\n if(this.bubbles[mid] && !this.skippedMids.has(mid)) {\n // const maxId = Math.max(...mids); // * because in scheduled album can be rendered by lowest mid during sending\n return {\n bubble: this.bubbles[mid],\n mid: mid\n // message: await this.chat.getMessage(maxId) as Message.message\n };\n }\n }\n }\n\n public getBubbleGroupedItems(bubble: HTMLElement) {\n return Array.from(bubble.querySelectorAll('.grouped-item')) as HTMLElement[];\n }\n\n public async getMountedBubble(mid: number, message?: Message.message | Message.messageService) {\n if(message === undefined) {\n message = await this.chat.getMessage(mid);\n }\n\n if(!message) {\n return;\n }\n\n const groupedId = (message as Message.message).grouped_id;\n if(groupedId) {\n const a = await this.getGroupedBubble(groupedId);\n if(a) {\n a.bubble = a.bubble.querySelector(`.document-container[data-mid=\"${mid}\"]`) || a.bubble;\n return a;\n }\n }\n\n const bubble = this.bubbles[mid];\n if(!bubble) return;\n\n return {bubble, mid};\n }\n\n private findNextMountedBubbleByMsgId(mid: number, prev?: boolean) {\n const mids = getObjectKeysAndSort(this.bubbles, prev ? 'desc' : 'asc');\n\n let filterCallback: (_mid: number) => boolean;\n if(prev) filterCallback = (_mid) => _mid < mid;\n else filterCallback = (_mid) => mid < _mid;\n\n const foundMid = mids.find((_mid) => {\n if(!filterCallback(_mid)) return false;\n return !!this.bubbles[_mid]?.parentElement;\n });\n\n return this.bubbles[foundMid];\n }\n\n public loadMoreHistory(top: boolean, justLoad = false) {\n // this.log('loadMoreHistory', top);\n if(\n !this.peerId ||\n /* TEST_SCROLL || */\n this.chat.setPeerPromise ||\n this.isHeavyAnimationInProgress ||\n (top && (this.getHistoryTopPromise || this.scrollable.loadedAll.top)) ||\n (!top && (this.getHistoryBottomPromise || this.scrollable.loadedAll.bottom))\n ) {\n return;\n }\n\n // warning, ะตัะปะธ ะธะดั‹ ั‚ะพะปัŒะบะพ ะพั‚ั€ะธั†ะฐั‚ะตะปัŒะฝั‹ะต ั‚ะพ ะฒะฝะธะท ะฝะต ะฟะพะฟะฐะดั‘ั‚ (ั…ะพั‚ั ะผะฑ ะธ ั‚ะฐะบ ะฝะต ะฟะพะฟะฐะดั‘ั‚)\n // some messages can have negative id (such as sponsored message)\n const history = Object.keys(this.bubbles)\n .map((id) => +id)\n .filter((id) => id > 0 && !this.skippedMids.has(id))\n .sort((a, b) => a - b);\n\n if(!history.length) {\n history.push(0);\n }\n\n if(top) {\n if(DEBUG) {\n this.log('Will load more (up) history by id:', history[0], 'maxId:', history[history.length - 1], justLoad/* , history */);\n }\n\n this.getHistory1(history[0], true, undefined, undefined, justLoad);\n } else {\n // let dialog = this.appMessagesManager.getDialogByPeerId(this.peerId)[0];\n // const historyMaxId = await this.chat.getHistoryMaxId();\n\n // // if scroll down after search\n // if(history.indexOf(historyMaxId) !== -1) {\n // this.setLoaded('bottom', true);\n // return;\n // }\n\n if(DEBUG) {\n this.log('Will load more (down) history by id:', history[history.length - 1], justLoad/* , history */);\n }\n\n this.getHistory1(history[history.length - 1], false, true, undefined, justLoad);\n }\n }\n\n public onScroll = (ignoreHeavyAnimation?: boolean, scrollDimensions?: ScrollStartCallbackDimensions, forceDown?: boolean) => {\n // return;\n\n if(this.isHeavyAnimationInProgress) {\n this.sliceViewportDebounced?.clearTimeout();\n\n // * ะ’ ั‚ะฐะบะพะผ ัะปัƒั‡ะฐะต, ะบะฝะพะฟะบะฐ ะฝะต ะฑัƒะดะตั‚ ะผะพั€ะณะฐั‚ัŒ ะตัะปะธ ั‡ะฐั‚ ะฒ ัะฐะผะพะผ ะฝะธะทัƒ, ะธ ะฟั€ะฐะฒะธะปัŒะฝะพ ะพั‚ั€ะฐะฑะพั‚ะฐะตั‚ ัะปัƒั‡ะฐะน ะฝะฐะฟะธัะฐะฝะธั ะฝะพะฒะพะณะพ ัะพะพะฑั‰ะตะฝะธั ะธ ะฟั€ะพัะบั€ะพะปะปะฐ ะฒะฝะธะท\n if(this.scrolledDown && !ignoreHeavyAnimation) {\n return;\n }\n } else {\n this.chat.topbar.pinnedMessage?.setCorrectIndexThrottled(this.scrollable.lastScrollDirection);\n this.sliceViewportDebounced?.();\n this.setStickyDateManually();\n }\n\n // lottieLoader.checkAnimations(false, 'chat');\n\n if(scrollDimensions && scrollDimensions.distanceToEnd < SCROLLED_DOWN_THRESHOLD && this.scrolledDown) {\n return;\n }\n\n const distanceToEnd = forceDown ? 0 : scrollDimensions?.distanceToEnd ?? this.scrollable.getDistanceToEnd();\n if(/* !IS_TOUCH_SUPPORTED && */(this.scrollable.lastScrollDirection !== 0 && distanceToEnd > 0) || scrollDimensions || forceDown) {\n // if(/* !IS_TOUCH_SUPPORTED && */(this.scrollable.lastScrollDirection !== 0 || scrollDimensions) && distanceToEnd > 0) {\n if(this.isScrollingTimeout) {\n clearTimeout(this.isScrollingTimeout);\n } else if(!this.chatInner.classList.contains('is-scrolling')) {\n this.chatInner.classList.add('is-scrolling');\n }\n\n this.isScrollingTimeout = window.setTimeout(() => {\n this.chatInner.classList.remove('is-scrolling');\n this.isScrollingTimeout = 0;\n }, 1350 + (scrollDimensions?.duration ?? 0));\n }\n\n if(distanceToEnd < SCROLLED_DOWN_THRESHOLD && (forceDown || this.scrollable.loadedAll.bottom || this.chat.setPeerPromise || !this.peerId)) {\n this.container.classList.add('scrolled-down');\n this.scrolledDown = true;\n } else if(this.container.classList.contains('scrolled-down')) {\n this.container.classList.remove('scrolled-down');\n this.scrolledDown = false;\n }\n };\n\n public setScroll() {\n if(this.scrollable) {\n this.destroyScrollable();\n }\n\n this.scrollable = new Scrollable(null, 'IM', /* 10300 */300);\n this.setLoaded('top', false, false);\n this.setLoaded('bottom', false, false);\n\n this.scrollable.container.append(this.chatInner);\n\n /* const getScrollOffset = () => {\n //return Math.round(Math.max(300, appPhotosManager.windowH / 1.5));\n return 300;\n };\n\n window.addEventListener('resize', () => {\n this.scrollable.onScrollOffset = getScrollOffset();\n });\n\n this.scrollable = new Scrollable(this.bubblesContainer, 'y', 'IM', this.chatInner, getScrollOffset()); */\n\n this.scrollable.onAdditionalScroll = this.onScroll;\n this.scrollable.onScrolledTop = () => this.loadMoreHistory(true);\n this.scrollable.onScrolledBottom = () => this.loadMoreHistory(false);\n // this.scrollable.attachSentinels(undefined, 300);\n\n if(IS_TOUCH_SUPPORTED && false) {\n this.scrollable.container.addEventListener('touchmove', () => {\n if(this.isScrollingTimeout) {\n clearTimeout(this.isScrollingTimeout);\n } else if(!this.chatInner.classList.contains('is-scrolling')) {\n this.chatInner.classList.add('is-scrolling');\n }\n }, {passive: true});\n\n this.scrollable.container.addEventListener('touchend', () => {\n if(!this.chatInner.classList.contains('is-scrolling')) {\n return;\n }\n\n if(this.isScrollingTimeout) {\n clearTimeout(this.isScrollingTimeout);\n }\n\n this.isScrollingTimeout = window.setTimeout(() => {\n this.chatInner.classList.remove('is-scrolling');\n this.isScrollingTimeout = 0;\n }, 1350);\n }, {passive: true});\n }\n }\n\n public async updateUnreadByDialog() {\n const historyStorage = await this.chat.getHistoryStorage();\n const maxId = this.peerId === rootScope.myId ? historyStorage.readMaxId : historyStorage.readOutboxMaxId;\n\n // /////this.log('updateUnreadByDialog', maxId, dialog, this.unreadOut);\n\n for(const msgId of this.unreadOut) {\n if(msgId > 0 && msgId <= maxId) {\n const bubble = this.bubbles[msgId];\n if(bubble) {\n this.unreadOut.delete(msgId);\n\n if(bubble.classList.contains('is-outgoing') || bubble.classList.contains('is-error')) {\n continue;\n }\n\n bubble.classList.remove('is-sent', 'is-sending', 'is-outgoing'); // is-sending can be when there are bulk of updates (e.g. sending command to Stickers bot)\n bubble.classList.add('is-read');\n }\n }\n }\n }\n\n public destroyBubble(bubble: HTMLElement, mid = +bubble.dataset.mid) {\n // this.log.warn('destroy bubble', bubble, mid);\n bubble.middlewareHelper.destroy();\n\n /* const mounted = this.getMountedBubble(mid);\n if(!mounted) return; */\n\n if(this.bubbles[mid] === bubble) { // have to check because can clear bubble with same id later\n delete this.bubbles[mid];\n }\n\n this.skippedMids.delete(mid);\n\n if(this.firstUnreadBubble === bubble) {\n this.firstUnreadBubble = null;\n }\n\n this.bubbleGroups.removeAndUnmountBubble(bubble);\n if(this.observer) {\n this.observer.unobserve(bubble, this.unreadedObserverCallback);\n this.unreaded.delete(bubble);\n\n this.observer.unobserve(bubble, this.viewsObserverCallback);\n this.viewsMids.delete(mid);\n\n this.observer.unobserve(bubble, this.stickerEffectObserverCallback);\n }\n\n // this.reactions.delete(mid);\n }\n\n public deleteMessagesByIds(mids: number[], permanent = true, ignoreOnScroll?: boolean) {\n let deleted = false;\n mids.forEach((mid) => {\n const bubble = this.bubbles[mid];\n if(!bubble) return;\n\n this.destroyBubble(bubble, mid);\n\n deleted = true;\n });\n\n if(!deleted) {\n return;\n }\n\n this.scrollable.ignoreNextScrollEvent();\n if(permanent && this.chat.selection.isSelecting) {\n this.chat.selection.deleteSelectedMids(this.peerId, mids);\n }\n\n animationIntersector.checkAnimations(false, this.chat.animationGroup);\n this.deleteEmptyDateGroups();\n\n if(!ignoreOnScroll) {\n this.scrollable.onScroll();\n // this.onScroll();\n }\n }\n\n private pollExtendedMediaMessages() {\n const mids = Array.from(this.extendedMediaMessages);\n return this.managers.appMessagesManager.getExtendedMedia(this.peerId, mids);\n }\n\n private setExtendedMediaMessagesPollInterval() {\n if(this.pollExtendedMediaMessagesPromise || !this.extendedMediaMessages.size) {\n return;\n }\n\n this.pollExtendedMediaMessagesPromise = pause(30000)\n .then(() => this.pollExtendedMediaMessages())\n .then(() => this.setExtendedMediaMessagesPollInterval());\n }\n\n private setTopPadding(middleware = this.getMiddleware()) {\n let isPaddingNeeded = false;\n let setPaddingTo: HTMLElement;\n if(!this.isTopPaddingSet && this.chat.type !== 'scheduled') {\n const {clientHeight, scrollHeight} = this.scrollable.container;\n isPaddingNeeded = clientHeight === scrollHeight;\n /* const firstEl = this.chatInner.firstElementChild as HTMLElement;\n if(this.chatInner.firstElementChild) {\n const visibleRect = getVisibleRect(firstEl, this.scrollable.container);\n isPaddingNeeded = !visibleRect.overflow.top && (visibleRect.rect.top - firstEl.offsetTop) !== this.scrollable.container.getBoundingClientRect().top;\n } else {\n isPaddingNeeded = true;\n } */\n\n if(isPaddingNeeded) {\n /* const add = clientHeight - scrollHeight;\n this.chatInner.style.paddingTop = add + 'px';\n this.scrollable.scrollTop += add; */\n setPaddingTo = this.chatInner;\n setPaddingTo.style.paddingTop = clientHeight + 'px';\n this.scrollable.setScrollTopSilently(scrollHeight);\n this.isTopPaddingSet = true;\n }\n }\n\n return {\n isPaddingNeeded,\n unsetPadding: isPaddingNeeded ? () => {\n if(middleware() && isPaddingNeeded) {\n setPaddingTo.style.paddingTop = '';\n this.isTopPaddingSet = false;\n }\n } : undefined\n };\n }\n\n private renderNewMessage(message: MyMessage, scrolledDown?: boolean) {\n const promise = this._renderNewMessage(message, scrolledDown);\n this.renderNewPromises.add(promise);\n promise.catch(noop).finally(() => {\n this.renderNewPromises.delete(promise);\n });\n return promise;\n }\n\n private async _renderNewMessage(message: MyMessage, scrolledDown?: boolean) {\n if(!this.scrollable.loadedAll.bottom) { // seems search active or sliced\n // this.log('renderNewMessagesByIds: seems search is active, skipping render:', mids);\n const setPeerPromise = this.chat.setPeerPromise;\n if(setPeerPromise) {\n const middleware = this.getMiddleware();\n setPeerPromise.then(async() => {\n if(!middleware()) return;\n const newMessage = await this.chat.getMessage(message.mid);\n if(!middleware()) return;\n this.renderNewMessage(newMessage);\n });\n }\n\n return;\n }\n\n if(this.chat.threadId && getMessageThreadId(message, this.chat.isForum) !== this.chat.threadId) {\n return;\n }\n\n if(this.bubbles[message.mid]) {\n return;\n }\n // ! should scroll even without new messages\n /* if(!mids.length) {\n return;\n } */\n\n if(!scrolledDown) {\n scrolledDown = this.scrolledDown && (\n !this.scrollingToBubble ||\n this.scrollingToBubble === this.getLastBubble() ||\n this.scrollingToBubble === this.chatInner\n );\n }\n\n const middleware = this.getMiddleware();\n const {isPaddingNeeded, unsetPadding} = this.setTopPadding(middleware);\n\n const promise = this.performHistoryResult({history: [message]}, false);\n if(scrolledDown) {\n promise.then(() => {\n if(!middleware()) return;\n // this.log('renderNewMessagesByIDs: messagesQueuePromise after', this.scrollable.isScrolledDown);\n // this.scrollable.scrollTo(this.scrollable.scrollHeight, 'top', true, true, 5000);\n // const bubble = this.bubbles[Math.max(...mids)];\n\n let bubble: HTMLElement;\n if(this.chat.type === 'scheduled') {\n bubble = this.bubbles[message.mid];\n }\n\n const promise = bubble ? this.scrollToBubbleEnd(bubble) : this.scrollToEnd();\n if(isPaddingNeeded) {\n // it will be called only once even if was set multiple times (that won't happen)\n promise.then(unsetPadding);\n }\n\n // this.scrollable.scrollIntoViewNew(this.chatInner, 'end');\n\n /* setTimeout(() => {\n this.log('messagesQueuePromise afterafter:', this.chatInner.childElementCount, this.scrollable.scrollHeight);\n }, 10); */\n });\n }\n\n return promise;\n }\n\n public getLastBubble() {\n const group = this.bubbleGroups.getLastGroup();\n return group?.lastItem?.bubble;\n }\n\n public scrollToBubble(\n element: HTMLElement,\n position: ScrollLogicalPosition,\n forceDirection?: FocusDirection,\n forceDuration?: number\n ) {\n const bubble = findUpClassName(element, 'bubble');\n\n if(!element.parentElement) {\n this.log.error('element is not connected', bubble);\n }\n\n let fallbackToElementStartWhenCentering: HTMLElement;\n // * if it's a start, then scroll to start of the group\n if(bubble && position !== 'end') {\n const item = this.bubbleGroups.getItemByBubble(bubble);\n if(item && item.group.firstItem === item && whichChild(item.group.container) === (this.stickyIntersector ? STICKY_OFFSET : 1)) {\n const dateGroup = item.group.container.parentElement;\n // if(whichChild(dateGroup) === 0) {\n fallbackToElementStartWhenCentering = dateGroup;\n // position = 'start';\n // element = dateGroup;\n // }\n }\n }\n\n // const isLastBubble = this.getLastBubble() === bubble;\n /* if(isLastBubble) {\n element = this.getLastDateGroup();\n } */\n\n const margin = 4; // * 4 = .25rem\n /* if(isLastBubble && this.chat.type === 'chat' && this.bubblesContainer.classList.contains('is-chat-input-hidden')) {\n margin = 20;\n } */\n\n const isChangingHeight = (this.chat.input.messageInput && this.chat.input.messageInput.classList.contains('is-changing-height')) || this.chat.container.classList.contains('is-toggling-helper');\n const promise = this.scrollable.scrollIntoViewNew({\n element,\n position,\n margin,\n forceDirection,\n forceDuration,\n axis: 'y',\n getNormalSize: isChangingHeight ? ({rect}) => {\n // return rect.height;\n\n let height = windowSize.height;\n // height -= this.chat.topbar.container.getBoundingClientRect().height;\n height -= this.container.offsetTop;\n height -= mediaSizes.isMobile || windowSize.height < 570 ? 58 : 78;\n return height;\n\n /* const rowsWrapperHeight = this.chat.input.rowsWrapper.getBoundingClientRect().height;\n const diff = rowsWrapperHeight - 54;\n return rect.height + diff; */\n } : undefined,\n fallbackToElementStartWhenCentering,\n startCallback: (dimensions) => {\n // this.onScroll(true, this.scrolledDown && dimensions.distanceToEnd <= SCROLLED_DOWN_THRESHOLD ? undefined : dimensions);\n this.onScroll(true, dimensions);\n\n if(this.updateGradient) {\n const {gradientRenderer} = this.chat;\n gradientRenderer?.toNextPosition(dimensions.getProgress);\n this.updateGradient = undefined;\n }\n }\n });\n\n // fix flickering date when opening unread chat and focusing message\n if(forceDirection === FocusDirection.Static) {\n this.scrollable.lastScrollPosition = this.scrollable.scrollTop;\n }\n\n return promise;\n }\n\n public scrollToEnd() {\n return this.scrollToBubbleEnd(this.chatInner);\n }\n\n public async scrollToBubbleEnd(bubble: HTMLElement) {\n /* if(DEBUG) {\n this.log('scrollToNewLastBubble: will scroll into view:', bubble);\n } */\n\n if(bubble) {\n this.scrollingToBubble = bubble;\n const middleware = this.getMiddleware();\n await this.scrollToBubble(bubble, 'end', undefined, undefined);\n if(!middleware()) return;\n this.scrollingToBubble = undefined;\n }\n }\n\n // ! can't get it by chatInner.lastElementChild because placeholder can be the last...\n // private getLastDateGroup() {\n // let lastTime = 0, lastElem: HTMLElement;\n // for(const i in this.dateMessages) {\n // const dateMessage = this.dateMessages[i];\n // if(dateMessage.firstTimestamp > lastTime) {\n // lastElem = dateMessage.container;\n // lastTime = dateMessage.firstTimestamp;\n // }\n // }\n\n // return lastElem;\n // }\n\n public async scrollToBubbleIfLast(bubble: HTMLElement) {\n if(this.getLastBubble() === bubble) {\n // return this.scrollToBubbleEnd(bubble);\n return this.scrollToEnd();\n }\n }\n\n public highlightBubble(element: HTMLElement) {\n const datasetKey = 'highlightTimeout';\n if(element.dataset[datasetKey]) {\n clearTimeout(+element.dataset[datasetKey]);\n element.classList.remove('is-highlighted');\n void element.offsetWidth; // reflow\n }\n\n element.classList.add('is-highlighted');\n element.dataset[datasetKey] = '' + setTimeout(() => {\n element.classList.remove('is-highlighted');\n delete element.dataset[datasetKey];\n }, 2000);\n }\n\n private createDateBubble(timestamp: number, date: Date = new Date(timestamp * 1000)) {\n let dateElement: HTMLElement;\n\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n\n const isScheduled = this.chat.type === 'scheduled';\n\n if(today.getTime() === date.getTime()) {\n dateElement = i18n(isScheduled ? 'Chat.Date.ScheduledForToday' : 'Date.Today');\n } else if(isScheduled && timestamp === SEND_WHEN_ONLINE_TIMESTAMP) {\n dateElement = i18n('MessageScheduledUntilOnline');\n } else {\n const options: Intl.DateTimeFormatOptions = {\n day: 'numeric',\n month: 'long'\n };\n\n if(date.getFullYear() !== today.getFullYear()) {\n options.year = 'numeric';\n }\n\n dateElement = new I18n.IntlDateElement({\n date,\n options\n }).element;\n\n if(isScheduled) {\n dateElement = i18n('Chat.Date.ScheduledFor', [dateElement]);\n }\n }\n\n const bubble = document.createElement('div');\n bubble.className = 'bubble service is-date';\n const bubbleContent = document.createElement('div');\n bubbleContent.classList.add('bubble-content');\n const serviceMsg = document.createElement('div');\n serviceMsg.classList.add('service-msg');\n\n serviceMsg.append(dateElement);\n\n bubbleContent.append(serviceMsg);\n bubble.append(bubbleContent);\n\n return bubble;\n }\n\n public getDateForDateContainer(timestamp: number) {\n const date = new Date(timestamp * 1000);\n date.setHours(0, 0, 0);\n return {date, dateTimestamp: date.getTime()};\n }\n\n public getDateContainerByTimestamp(timestamp: number) {\n const {date, dateTimestamp} = this.getDateForDateContainer(timestamp);\n let ret = this.dateMessages[dateTimestamp];\n if(ret) {\n return ret;\n }\n\n const bubble = this.createDateBubble(timestamp, date);\n // bubble.classList.add('is-sticky');\n const fakeBubble = this.createDateBubble(timestamp, date);\n fakeBubble.classList.add('is-fake');\n\n const container = document.createElement('section');\n container.className = 'bubbles-date-group';\n container.append(bubble, fakeBubble);\n\n ret = this.dateMessages[dateTimestamp] = {\n div: bubble,\n container,\n firstTimestamp: date.getTime()\n };\n\n const haveTimestamps = getObjectKeysAndSort(this.dateMessages, 'asc');\n const length = haveTimestamps.length;\n let i = 0, insertBefore: HTMLElement; // there can be 'first bubble' (e.g. bot description) so can't insert by index\n for(; i < haveTimestamps.length; ++i) {\n const t = haveTimestamps[i];\n insertBefore = this.dateMessages[t].container;\n if(dateTimestamp < t) {\n break;\n }\n }\n\n if(i === length && insertBefore) {\n insertBefore = insertBefore.nextElementSibling as HTMLElement;\n }\n\n if(!insertBefore) {\n this.chatInner.append(container);\n } else {\n this.chatInner.insertBefore(container, insertBefore);\n }\n\n this.stickyIntersector?.observeStickyHeaderChanges(container);\n\n if(this.chatInner.parentElement) {\n this.container.classList.add('has-groups');\n }\n\n return ret;\n }\n\n private destroyScrollable() {\n this.scrollable.destroy();\n }\n\n public destroy() {\n // this.chat.log.error('Bubbles destroying');\n\n this.destroyScrollable();\n\n this.listenerSetter.removeAll();\n\n this.lazyLoadQueue.clear();\n this.observer && this.observer.disconnect();\n this.stickyIntersector && this.stickyIntersector.disconnect();\n\n delete this.lazyLoadQueue;\n this.observer && delete this.observer;\n this.stickyIntersector && delete this.stickyIntersector;\n }\n\n public cleanup(bubblesToo = false) {\n this.log('cleanup');\n\n this.bubbles = {}; // clean it before so sponsored message won't be deleted faster on peer changing\n // //console.time('appImManager cleanup');\n this.setLoaded('top', false, false);\n this.setLoaded('bottom', false, false);\n\n // cancel scroll\n cancelAnimationByKey(this.scrollable.container);\n\n // do not wait ending of previous scale animation\n interruptHeavyAnimation();\n\n if(TEST_SCROLL !== undefined) {\n TEST_SCROLL = TEST_SCROLL_TIMES;\n }\n\n this.skippedMids.clear();\n this.dateMessages = {};\n this.bubbleGroups.cleanup();\n this.unreadOut.clear();\n this.needUpdate.length = 0;\n this.lazyLoadQueue.clear();\n this.renderNewPromises.clear();\n\n // clear messages\n if(bubblesToo) {\n this.scrollable.container.textContent = '';\n this.chatInner.textContent = '';\n this.cleanupPlaceholders();\n }\n\n this.firstUnreadBubble = null;\n this.attachedUnreadBubble = false;\n\n this.batchProcessor.clear();\n\n this.getHistoryTopPromise = this.getHistoryBottomPromise = undefined;\n this.fetchNewPromise = undefined;\n this.getSponsoredMessagePromise = undefined;\n this.updateGradient = undefined;\n\n if(this.stickyIntersector) {\n this.stickyIntersector.disconnect();\n }\n\n if(this.observer) {\n this.observer.disconnect();\n\n this.unreaded.clear();\n this.unreadedSeen.clear();\n this.readPromise = undefined;\n\n this.viewsMids.clear();\n }\n\n this.middlewareHelper.clean();\n\n this.onAnimateLadder = undefined;\n this.resolveLadderAnimation = undefined;\n this.attachPlaceholderOnRender = undefined;\n this.emptyPlaceholderBubble = undefined;\n this.sponsoredMessage = undefined;\n this.previousStickyDate = undefined;\n\n this.scrollingToBubble = undefined;\n // //console.timeEnd('appImManager cleanup');\n\n this.isTopPaddingSet = false;\n\n this.renderingMessages.clear();\n this.bubblesToEject.clear();\n this.bubblesToReplace.clear();\n\n // this.reactions.clear();\n\n if(this.isScrollingTimeout) {\n clearTimeout(this.isScrollingTimeout);\n this.isScrollingTimeout = 0;\n }\n\n this.container.classList.remove('has-sticky-dates');\n this.scrollable.cancelMeasure();\n }\n\n private cleanupPlaceholders(bubble = this.emptyPlaceholderBubble) {\n if(bubble) {\n this.destroyBubble(bubble);\n }\n }\n\n public async setPeer(options: ChatSetPeerOptions & {samePeer: boolean}): Promise<{cached?: boolean, promise: Chat['setPeerPromise']}> {\n const {samePeer, peerId, stack} = options;\n let {lastMsgId, startParam} = options;\n const tempId = ++this.setPeerTempId;\n\n if(!peerId) {\n this.cleanup(true);\n this.preloader.detach();\n return null;\n }\n\n const perf = performance.now();\n const log = this.log.bindPrefix('setPeer');\n log.warn('start');\n\n const middleware = () => {\n return this.setPeerTempId === tempId;\n };\n\n const m = middlewarePromise(middleware, PEER_CHANGED_ERROR);\n\n if(!samePeer) {\n await m(this.chat.onChangePeer(options, m));\n }\n\n /* if(samePeer && this.chat.setPeerPromise) {\n return {cached: true, promise: this.chat.setPeerPromise};\n } */\n\n const chatType = this.chat.type;\n\n if(chatType === 'scheduled' || this.chat.isRestricted) {\n lastMsgId = 0;\n }\n\n const historyStorage = await m(this.chat.getHistoryStorage());\n const topMessage = chatType === 'pinned' ? await m(this.managers.appMessagesManager.getPinnedMessagesMaxId(peerId, this.chat.threadId)) : historyStorage.maxId ?? 0;\n const isTarget = lastMsgId !== undefined;\n\n // * this one will fix topMessage for null message in history (e.g. channel comments with only 1 comment and it is a topMessage)\n /* if(chatType !== 'pinned' && topMessage && !historyStorage.history.slice.includes(topMessage)) {\n topMessage = 0;\n } */\n\n let followingUnread: boolean;\n let readMaxId = 0, savedPosition: ReturnType, overrideAdditionMsgId: number;\n if(!isTarget) {\n if(!samePeer) {\n savedPosition = this.chat.appImManager.getChatSavedPosition(this.chat);\n }\n\n if(savedPosition) {\n\n } else if(topMessage) {\n readMaxId = await m(this.managers.appMessagesManager.getReadMaxIdIfUnread(peerId, this.chat.threadId));\n const dialog = await m(this.chat.getDialogOrTopic());\n if(/* dialog.unread_count */readMaxId && !samePeer && (!dialog || dialog.unread_count !== 1)) {\n const foundSlice = historyStorage.history.findSliceOffset(readMaxId);\n if(foundSlice && foundSlice.slice.isEnd(SliceEnd.Bottom)) {\n overrideAdditionMsgId = foundSlice.slice[foundSlice.offset - 25] || foundSlice.slice[0] || readMaxId;\n }\n\n followingUnread = !isTarget;\n lastMsgId = readMaxId;\n } else {\n lastMsgId = topMessage;\n // lastMsgID = topMessage;\n }\n }\n }\n\n const isJump = lastMsgId !== topMessage/* && overrideAdditionMsgId === undefined */;\n\n if(startParam === undefined && await m(this.chat.isStartButtonNeeded())) {\n startParam = BOT_START_PARAM;\n }\n\n if(samePeer) {\n if(stack && lastMsgId) {\n this.followStack.push(stack);\n }\n\n const mounted = await m(this.getMountedBubble(lastMsgId));\n if(mounted) {\n if(isTarget) {\n this.scrollToBubble(mounted.bubble, 'center');\n this.highlightBubble(mounted.bubble);\n this.chat.dispatchEvent('setPeer', lastMsgId, false);\n } else if(topMessage && !isJump) {\n // log('will scroll down', this.scroll.scrollTop, this.scroll.scrollHeight);\n // scrollable.setScrollTopSilently(scrollable.scrollHeight);\n this.scrollToEnd();\n this.chat.dispatchEvent('setPeer', lastMsgId, true);\n }\n\n if(startParam !== undefined) {\n this.chat.input.setStartParam(startParam);\n }\n\n return null;\n }\n } else {\n if(this.peerId) { // * set new queue id if new peer (setting not from 0)\n this.lazyLoadQueue.queueId = ++queueId;\n this.managers.apiFileManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId);\n }\n\n this.followStack.length = 0;\n\n this.passEntities = {\n messageEntityBotCommand: await m(this.managers.appPeersManager.isAnyGroup(peerId)) || this.chat.isBot\n };\n }\n\n if(DEBUG) {\n log('setPeer peerId:', peerId, historyStorage, lastMsgId, topMessage);\n }\n\n // add last message, bc in getHistory will load < max_id\n const additionMsgId = overrideAdditionMsgId ?? (isJump || chatType === 'scheduled' || this.chat.isRestricted ? 0 : topMessage);\n\n let maxBubbleId = 0;\n if(samePeer) {\n const el = this.getBubbleByPoint('bottom'); // ! this may not work if being called when chat is hidden\n // this.chat.log('[PM]: setCorrectIndex: get last element perf:', performance.now() - perf, el);\n if(el) {\n maxBubbleId = +el.dataset.mid;\n }\n\n if(maxBubbleId <= 0) {\n maxBubbleId = Math.max(...Object.keys(this.bubbles).map((mid) => +mid));\n }\n } else {\n this.isFirstLoad = true;\n this.destroyResizeObserver();\n }\n\n const oldChatInner = this.chatInner;\n const oldPlaceholderBubble = this.emptyPlaceholderBubble;\n this.cleanup();\n const chatInner = this.chatInner = document.createElement('div');\n if(samePeer) {\n chatInner.className = oldChatInner.className;\n chatInner.classList.remove('disable-hover', 'is-scrolling');\n } else {\n chatInner.classList.add('bubbles-inner');\n }\n\n this.lazyLoadQueue.lock();\n\n // const haveToScrollToBubble = (topMessage && (isJump || samePeer)) || isTarget;\n const haveToScrollToBubble = samePeer || (topMessage && isJump) || isTarget;\n const fromUp = maxBubbleId > 0 && (!lastMsgId || maxBubbleId < lastMsgId || lastMsgId < 0);\n const scrollFromDown = !fromUp && samePeer;\n const scrollFromUp = !scrollFromDown && fromUp/* && (samePeer || forwardingUnread) */;\n this.willScrollOnLoad = scrollFromDown || scrollFromUp;\n\n this.setPeerOptions = {\n lastMsgId,\n topMessage,\n savedPosition\n };\n\n let result: Awaited>;\n if(!savedPosition) {\n result = await m(this.getHistory1(lastMsgId, true, isJump, additionMsgId));\n } else {\n result = {\n promise: getHeavyAnimationPromise().then(() => {\n return this.performHistoryResult({history: savedPosition.mids}, true);\n }) as any,\n cached: true,\n waitPromise: Promise.resolve()\n };\n }\n\n this.setPeerCached = result.cached;\n\n log.warn('got history');// warning\n\n const {promise, cached} = result;\n\n if(!cached && !samePeer) {\n await m(this.chat.finishPeerChange(isTarget, isJump, lastMsgId, startParam));\n this.scrollable.container.textContent = '';\n // oldContainer.textContent = '';\n // oldChatInner.remove();\n this.preloader.attach(this.container);\n }\n\n /* this.ladderDeferred && this.ladderDeferred.resolve();\n this.ladderDeferred = deferredPromise(); */\n\n animationIntersector.lockGroup(this.chat.animationGroup);\n const setPeerPromise = m(promise).then(async() => {\n log.warn('promise fulfilled');\n\n const mountedByLastMsgId = haveToScrollToBubble ? await m(lastMsgId ? this.getMountedBubble(lastMsgId) : {bubble: this.getLastBubble()}) : undefined;\n if(cached && !samePeer) {\n log.warn('finishing peer change');\n await m(this.chat.finishPeerChange(isTarget, isJump, lastMsgId, startParam)); // * ะบะพัั‚ั‹ะปัŒ\n log.warn('finished peer change');\n }\n\n this.preloader.detach();\n\n if(this.resolveLadderAnimation) {\n this.resolveLadderAnimation();\n this.resolveLadderAnimation = undefined;\n }\n\n this.setPeerCached = undefined;\n\n // this.ladderDeferred.resolve();\n\n const scrollable = this.scrollable;\n scrollable.lastScrollDirection = 0;\n scrollable.lastScrollPosition = 0;\n replaceContent(scrollable.container, chatInner);\n // this.chat.topbar.container.nextElementSibling.replaceWith(container);\n\n if(oldPlaceholderBubble) {\n this.cleanupPlaceholders(oldPlaceholderBubble);\n }\n\n if(this.attachPlaceholderOnRender) {\n this.attachPlaceholderOnRender();\n }\n\n if(!isTarget && this.chat.isPinnedMessagesNeeded()) {\n this.chat.topbar.pinnedMessage?.setCorrectIndex(0);\n }\n\n this.container.classList.toggle('has-groups', !!Object.keys(this.dateMessages).length);\n\n log.warn('mounted chat', this.chatInner === chatInner, this.chatInner.parentElement, performance.now() - perf);\n\n animationIntersector.unlockGroup(this.chat.animationGroup);\n animationIntersector.checkAnimations(false, this.chat.animationGroup/* , true */);\n\n // fastRaf(() => {\n this.lazyLoadQueue.unlock();\n // });\n\n // if(dialog && lastMsgID && lastMsgID !== topMessage && (this.bubbles[lastMsgID] || this.firstUnreadBubble)) {\n if(savedPosition) {\n scrollable.setScrollTopSilently(savedPosition.top);\n /* const mountedByLastMsgId = this.getMountedBubble(lastMsgId);\n let bubble: HTMLElement = mountedByLastMsgId?.bubble;\n if(!bubble?.parentElement) {\n bubble = this.findNextMountedBubbleByMsgId(lastMsgId);\n }\n\n if(bubble) {\n const top = bubble.getBoundingClientRect().top;\n const distance = savedPosition.top - top;\n scrollable.scrollTop += distance;\n } */\n } else if(haveToScrollToBubble) {\n let unsetPadding: () => void;\n if(scrollFromDown) {\n scrollable.setScrollTopSilently(99999);\n } else if(scrollFromUp) {\n const set = this.setTopPadding();\n if(set.isPaddingNeeded) {\n unsetPadding = set.unsetPadding;\n }\n\n scrollable.setScrollTopSilently(0);\n }\n\n // const mountedByLastMsgId = lastMsgId ? this.getMountedBubble(lastMsgId) : {bubble: this.getLastBubble()};\n let bubble: HTMLElement = (followingUnread && this.firstUnreadBubble) || mountedByLastMsgId?.bubble;\n if(!bubble?.parentElement) {\n bubble = this.findNextMountedBubbleByMsgId(lastMsgId, false) || this.findNextMountedBubbleByMsgId(lastMsgId, true);\n }\n\n let promise: Promise;\n // ! sometimes there can be no bubble\n if(bubble) {\n const lastBubble = this.getLastBubble();\n const position: ScrollLogicalPosition = followingUnread ? 'start' : (!isJump && !isTarget && lastBubble === bubble ? 'end' : 'center');\n\n if(position === 'end' && lastBubble === bubble && samePeer) {\n promise = this.scrollToEnd();\n } else {\n promise = this.scrollToBubble(bubble, position, !samePeer ? FocusDirection.Static : undefined);\n }\n\n if(!followingUnread && isTarget) {\n this.highlightBubble(bubble);\n }\n }\n\n if(unsetPadding) {\n (promise || Promise.resolve()).then(() => {\n unsetPadding();\n });\n }\n } else {\n scrollable.setScrollTopSilently(99999);\n }\n\n // if(!cached) {\n this.onRenderScrollSet();\n // }\n\n this.onScroll();\n\n const afterSetPromise = Promise.all([setPeerPromise, getHeavyAnimationPromise()]);\n afterSetPromise.then(() => { // check whether list isn't full\n scrollable.checkForTriggers();\n\n // if(cached) {\n // this.onRenderScrollSet();\n // }\n });\n\n this.chat.dispatchEvent('setPeer', lastMsgId, !isJump);\n\n Promise.all([\n this.setFetchReactionsInterval(afterSetPromise),\n this.setFetchHistoryInterval({\n afterSetPromise,\n lastMsgId,\n samePeer,\n savedPosition,\n topMessage\n })\n ]).then(() => {\n log('scrolledAllDown:', scrollable.loadedAll.bottom);\n // if(!this.unreaded.length && dialog) { // lol\n if(scrollable.loadedAll.bottom && topMessage && !this.unreaded.size) { // lol\n this.onScrolledAllDown();\n }\n });\n\n if(chatType === 'chat' && !this.chat.isForumTopic) {\n const dialog = await m(this.managers.appMessagesManager.getDialogOnly(peerId));\n if(dialog?.pFlags.unread_mark) {\n this.managers.appMessagesManager.markDialogUnread(peerId, true);\n }\n }\n\n // this.chatInner.classList.remove('disable-hover', 'is-scrolling'); // warning, performance!\n }).catch((err) => {\n log.error('setPeer promise error:', err);\n if(!middleware()) {\n this.preloader.detach();\n }\n\n throw err;\n });\n\n return {cached, promise: setPeerPromise};\n }\n\n private async setFetchReactionsInterval(afterSetPromise: Promise) {\n const middleware = this.getMiddleware();\n const needReactionsInterval = this.chat.isChannel;\n if(needReactionsInterval) {\n const fetchReactions = async() => {\n if(!middleware()) return;\n\n const mids: number[] = [];\n for(const mid in this.bubbles) {\n let message = await this.chat.getMessage(+mid);\n if(message?._ !== 'message') {\n continue;\n }\n\n message = await this.managers.appMessagesManager.getGroupsFirstMessage(message);\n mids.push(message.mid);\n }\n\n const promise = mids.length ? this.managers.appReactionsManager.getMessagesReactions(this.peerId, mids) : Promise.resolve();\n promise.then(() => {\n setTimeout(fetchReactions, 10e3);\n });\n };\n\n Promise.all([afterSetPromise, getHeavyAnimationPromise(), pause(500)]).then(() => {\n fetchReactions();\n });\n }\n }\n\n private async setFetchHistoryInterval({\n lastMsgId,\n topMessage,\n afterSetPromise,\n savedPosition,\n samePeer\n }: {\n lastMsgId: number,\n topMessage: number,\n afterSetPromise: Promise,\n savedPosition: ChatSavedPosition,\n samePeer: boolean\n }) {\n const middleware = this.getMiddleware();\n const peerId = this.peerId;\n\n const needFetchInterval = await this.managers.appMessagesManager.isFetchIntervalNeeded(peerId);\n const needFetchNew = savedPosition || needFetchInterval;\n if(!needFetchNew) {\n return;\n }\n\n await afterSetPromise;\n if(!middleware()) {\n return;\n }\n\n const chatId = peerId.toChatId();\n middleware.onClean(() => {\n this.managers.apiUpdatesManager.unsubscribeFromChannelUpdates(chatId);\n });\n\n this.managers.apiUpdatesManager.subscribeToChannelUpdates(chatId);\n return;\n\n this.setLoaded('bottom', false);\n this.scrollable.checkForTriggers();\n\n if(!needFetchInterval) {\n return;\n }\n\n const f = () => {\n this.fetchNewPromise = new Promise(async(resolve) => {\n if(!middleware() || !(await this.managers.appMessagesManager.isFetchIntervalNeeded(peerId))) {\n resolve();\n return;\n }\n\n this.managers.appMessagesManager.getNewHistory(peerId, this.chat.threadId).then((result) => {\n if(!middleware() || !result) {\n resolve();\n return;\n }\n\n const {isBottomEnd} = result;\n if(this.scrollable.loadedAll.bottom && this.scrollable.loadedAll.bottom !== isBottomEnd) {\n this.setLoaded('bottom', isBottomEnd);\n this.onScroll();\n }\n\n setTimeout(f, 30e3);\n resolve();\n });\n }).finally(() => {\n this.fetchNewPromise = undefined;\n });\n };\n\n if(samePeer) {\n setTimeout(f, 30e3);\n } else {\n f();\n }\n }\n\n public async onScrolledAllDown() {\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\n const historyMaxId = await this.chat.getHistoryMaxId();\n this.managers.appMessagesManager.readHistory(this.peerId, historyMaxId, this.chat.threadId, true);\n }\n }\n\n public async finishPeerChange() {\n const [isChannel, canWrite, isAnyGroup] = await Promise.all([\n this.chat.isChannel,\n this.chat.canSend(),\n this.chat.isAnyGroup\n ]);\n\n return () => {\n this.chatInner.classList.toggle('has-rights', canWrite);\n this.container.classList.toggle('is-chat-input-hidden', !canWrite);\n\n this.chatInner.classList.toggle('is-chat', isAnyGroup);\n this.chatInner.classList.toggle('is-channel', isChannel);\n\n this.createResizeObserver();\n };\n }\n\n private processBatch = async(...args: Parameters) => {\n let [loadQueue, m, log] = args;\n\n const filterQueue = (queue: typeof loadQueue) => {\n return queue.filter((details) => {\n // message can be deleted during rendering\n return details && this.bubbles[details.bubble.dataset.mid] === details.bubble;\n });\n };\n\n loadQueue = filterQueue(loadQueue);\n\n log('messages rendered');\n\n const reverse = loadQueue[0]?.reverse;\n\n const {groups, avatarPromises} = this.groupBubbles(loadQueue.filter((details) => details.updatePosition));\n\n // if(groups.length > 2 && loadQueue.length === 1) {\n // debugger;\n // }\n\n const promises = loadQueue.reduce((acc, details) => {\n const perf = performance.now();\n\n const promises = details.promises.slice();\n const timePromises = promises.map(async(promise) => (await promise, performance.now() - perf));\n Promise.all(timePromises).then((times) => {\n log.groupCollapsed('media message time', performance.now() - perf, details, times);\n times.forEach((time, idx) => {\n log('media message time', time, idx, promises[idx]);\n });\n log.groupEnd();\n });\n\n // if(details.updatePosition) {\n // if(res) {\n // groups.add(res.group);\n // if(details.needAvatar) {\n // details.promises.push(res.group.createAvatar(details.message));\n // }\n // }\n // }\n\n acc.push(...details.promises);\n return acc;\n }, [] as Promise[]);\n\n promises.push(...avatarPromises);\n // promises.push(pause(200));\n\n // * ัั‚ะพ ะฝัƒะถะฝะพ ะดะปั ั‚ะพะณะพ, ั‡ั‚ะพะฑั‹ ะตัะปะธ ะทะฐั…ะพั‡ะตั‚ ะฟะพะดะณั€ัƒะทะธั‚ัŒ reply ะธะปะธ ะบะฐะบะพะต-ะปะธะฑะพ ัะพะพะฑั‰ะตะฝะธะต, ั‚ะพ ัะบั€ะพะปะป ะฝะต ะฟั€ะตั€ะฒะฐะปัั\n // * ะตัะปะธ ะดะพะฑะฐะฒะธั‚ัŒ ัั‚ะพั‚ ะฟั€ะพะผะธั - ะฒ ั‚ะฐะบะพะผ ัะปัƒั‡ะฐะต ะฝัƒะถะฝะพ ัะดะตะปะฐั‚ัŒ, ั‡ั‚ะพะฑั‹ ัะบั€ะพะปะปะธะปะพ ะบ ะฟะพัะปะตะดะฝะตะผัƒ ัะพะพะฑั‰ะตะฝะธัŽ ะฟะพัะปะต ั€ะตะฝะดะตั€ะฐ\n // promises.push(getHeavyAnimationPromise());\n\n log('media promises to call', promises, loadQueue, this.isHeavyAnimationInProgress);\n await m(Promise.all([...promises, this.setUnreadDelimiter()]).catch(noop)); // ะฝะต ะฝะฐัˆั‘ะป ะผะตัั‚ะฐ ะปัƒั‡ัˆะต\n await m(fastRafPromise()); // have to be the last\n log('media promises end');\n\n loadQueue = filterQueue(loadQueue);\n\n const {restoreScroll, scrollSaver} = this.prepareToSaveScroll(reverse);\n // if(this.messagesQueueOnRender) {\n // this.messagesQueueOnRender();\n // }\n\n this.messagesQueueOnRenderAdditional?.();\n\n this.ejectBubbles();\n for(const [bubble, oldBubble] of this.bubblesToReplace) {\n if(scrollSaver) {\n scrollSaver.replaceSaved(oldBubble, bubble);\n }\n\n if(!loadQueue.find((details) => details.bubble === bubble)) {\n continue;\n }\n\n const item = this.bubbleGroups.getItemByBubble(bubble);\n if(!item) {\n this.log.error('NO ITEM BY BUBBLE', bubble);\n } else {\n item.mounted = false;\n if(!groups.includes(item.group)) {\n groups.push(item.group);\n }\n }\n\n this.bubblesToReplace.delete(bubble);\n }\n\n if(this.chat.selection.isSelecting) {\n loadQueue.forEach(({bubble}) => {\n this.chat.selection.toggleElementCheckbox(bubble, true);\n });\n }\n\n loadQueue.forEach(({message, bubble, updatePosition}) => {\n if(message.pFlags.local && updatePosition) {\n this.chatInner[(message as Message.message).pFlags.sponsored ? 'append' : 'prepend'](bubble);\n return;\n }\n });\n\n this.bubbleGroups.mountUnmountGroups(groups);\n // this.bubbleGroups.findIncorrentPositions();\n\n this.updatePlaceholderPosition?.();\n\n restoreScroll?.();\n\n // this.setStickyDateManually();\n };\n\n public renderMessagesQueue(options: ReturnType) {\n return this.batchProcessor.addToQueue(options);\n }\n\n private ejectBubbles() {\n for(const bubble of this.bubblesToEject) {\n bubble.remove();\n // this.bubbleGroups.removeAndUnmountBubble(bubble);\n }\n\n this.bubblesToEject.clear();\n }\n\n public groupBubbles(items: Array<{\n // Awaited> &\n bubble: HTMLElement,\n message: Message.message | Message.messageService\n }/* & {\n unmountIfFound?: boolean\n } */>) {\n let modifiedGroups: typeof groups;\n\n if(this.chat.type === 'scheduled') {\n modifiedGroups = new Set();\n items.forEach(({bubble, message}) => {\n const item = this.bubbleGroups.getItemByBubble(bubble);\n const group = item?.group;\n if(group && item.message.date !== message.date) {\n this.bubbleGroups.removeItem(item);\n modifiedGroups.add(group);\n }\n });\n }\n\n items.forEach(({bubble, message}) => {\n this.bubbleGroups.prepareForGrouping(bubble, message);\n });\n\n const groups = this.bubbleGroups.groupUngrouped();\n\n const avatarPromises = Array.from(groups).map((group) => {\n if(group.avatar) return;\n const firstItem = group.firstItem;\n if(firstItem && this.chat.isAvatarNeeded(firstItem.message)) {\n return group.createAvatar(firstItem.message);\n }\n }).filter(Boolean);\n\n if(modifiedGroups) {\n for(const group of modifiedGroups) {\n groups.add(group);\n }\n }\n\n return {\n groups: [...groups],\n avatarPromises\n };\n }\n\n public getMiddleware(additionalCallback?: () => boolean) {\n return this.middlewareHelper.get(additionalCallback);\n }\n\n private async wrapMediaSpoiler({\n media,\n promise,\n middleware,\n attachmentDiv\n }: {\n media: Photo.photo | MyDocument,\n promise: Promise,\n middleware: Middleware,\n attachmentDiv: HTMLElement\n }) {\n await promise;\n if(!middleware()) {\n return;\n }\n\n const {width, height} = attachmentDiv.style;\n const container = await wrapMediaSpoiler({\n media,\n width: parseInt(width),\n height: parseInt(height),\n middleware,\n animationGroup: this.chat.animationGroup\n });\n\n if(!middleware()) {\n return;\n }\n\n attachmentDiv.append(container);\n }\n\n private async safeRenderMessage(\n message: Message.message | Message.messageService,\n reverse?: boolean,\n bubble?: HTMLElement,\n updatePosition = true,\n processResult?: (result: ReturnType, bubble: HTMLElement) => typeof result\n ) {\n if(!message || this.renderingMessages.has(message.mid) || (this.bubbles[message.mid] && !bubble)) {\n return;\n }\n\n const middlewareHelper = this.getMiddleware().create();\n const middleware = middlewareHelper.get();\n\n let result: Awaited> & {updatePosition: typeof updatePosition};\n try {\n this.renderingMessages.add(message.mid);\n\n // const groupedId = (message as Message.message).grouped_id;\n const newBubble = document.createElement('div');\n newBubble.middlewareHelper = middlewareHelper;\n newBubble.dataset.mid = '' + message.mid;\n newBubble.dataset.peerId = '' + message.peerId;\n newBubble.dataset.timestamp = '' + message.date;\n\n // const bubbleNew: Bubble = this.bubblesNew[message.mid] ??= {\n // bubble: newBubble,\n // mids: new Set(),\n // groupedId\n // };\n\n // bubbleNew.mids.add(message.mid);\n\n if(bubble) {\n bubble.middlewareHelper.destroy();\n this.skippedMids.delete(message.mid);\n\n this.bubblesToEject.add(bubble);\n this.bubblesToReplace.delete(bubble);\n this.bubblesToReplace.set(newBubble, bubble);\n this.bubbleGroups.changeBubbleByBubble(bubble, newBubble);\n }\n\n bubble = this.bubbles[message.mid] = newBubble;\n let originalPromise = this.renderMessage(message, reverse, bubble, middleware);\n if(processResult) {\n originalPromise = processResult(originalPromise, bubble);\n }\n\n const promise = originalPromise.then((r) => ((r && middleware() ? {...r, updatePosition} : undefined) as typeof result));\n\n this.renderMessagesQueue(promise.catch(() => undefined));\n\n result = await promise;\n if(!middleware()) {\n return;\n }\n\n if(!result) {\n this.skippedMids.add(+message.mid);\n }\n } catch(err) {\n this.log.error('renderMessage error:', err);\n }\n\n if(!middleware()) {\n return;\n }\n\n this.renderingMessages.delete(message.mid);\n return result;\n }\n\n // reverse means top\n private async renderMessage(\n message: Message.message | Message.messageService,\n reverse = false,\n bubble: HTMLElement,\n middleware: Middleware\n ) {\n // if(DEBUG) {\n // this.log('message to render:', message);\n // }\n\n // if(!bubble && this.bubbles[message.mid]) {\n // return;\n // }\n\n // await pause(1000);\n\n const isMessage = message._ === 'message';\n const groupedId = isMessage && message.grouped_id;\n let albumMids: number[], reactionsMessage: Message.message;\n const albumMessages = groupedId ? await this.managers.appMessagesManager.getMessagesByAlbum(groupedId) : undefined;\n\n const albumMustBeRenderedFull = this.chat.type !== 'pinned';\n\n if(groupedId && albumMustBeRenderedFull) { // will render only last album's message\n albumMids = albumMessages.map((message) => message.mid);\n const mainMid = getMainMidForGrouped(albumMids);\n if(message.mid !== mainMid) {\n return;\n }\n }\n\n if(isMessage) {\n reactionsMessage = groupedId ? albumMessages[0] : message;\n }\n\n // * can't use 'message.pFlags.out' here because this check will be used to define side of message (left-right)\n const our = this.chat.isOurMessage(message);\n\n const messageDiv = document.createElement('div');\n messageDiv.classList.add('message', 'spoilers-container');\n\n const contentWrapper = document.createElement('div');\n contentWrapper.classList.add('bubble-content-wrapper');\n\n const bubbleContainer = document.createElement('div');\n bubbleContainer.classList.add('bubble-content');\n\n bubble.classList.add('bubble');\n contentWrapper.append(bubbleContainer);\n bubble.append(contentWrapper);\n\n let isInUnread = !our &&\n !message.pFlags.out &&\n (\n message.pFlags.unread ||\n isMentionUnread(message)\n );\n\n if(!isInUnread && this.chat.peerId.isAnyChat()) {\n const readMaxId = await this.managers.appMessagesManager.getReadMaxIdIfUnread(this.chat.peerId, this.chat.threadId);\n if(readMaxId !== undefined && readMaxId < message.mid) {\n isInUnread = true;\n }\n }\n\n if(isInUnread && this.observer) {\n // this.log('not our message', message, message.pFlags.unread);\n this.observer.observe(bubble, this.unreadedObserverCallback);\n this.unreaded.set(bubble, message.mid);\n }\n\n const loadPromises: Promise[] = [];\n const ret = {\n bubble,\n promises: loadPromises,\n message,\n reverse\n };\n\n const wrapOptions: WrapSomethingOptions = {\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n customEmojiSize: this.chat.appImManager.customEmojiSize,\n animationGroup: this.chat.animationGroup\n };\n\n if(message._ === 'messageService' && (!message.action || !SERVICE_AS_REGULAR.has(message.action._))) {\n const action = message.action;\n if(action) {\n const _ = action._;\n\n const ignoreAction = IGNORE_ACTIONS.get(_);\n if(ignoreAction && (ignoreAction === true || ignoreAction(message))) {\n return;\n }\n\n if(langPack.hasOwnProperty(_) && !langPack[_]) {\n return;\n }\n }\n\n bubble.className = 'bubble service';\n\n bubbleContainer.innerHTML = '';\n const s = document.createElement('div');\n s.classList.add('service-msg');\n if(action) {\n let promise: Promise;\n if(action._ === 'messageActionChannelMigrateFrom') {\n const peerTitle = new PeerTitle();\n promise = peerTitle.update({peerId: action.chat_id.toPeerId(true), wrapOptions});\n s.append(i18n('ChatMigration.From', [peerTitle.element]));\n } else if(action._ === 'messageActionChatMigrateTo') {\n const peerTitle = new PeerTitle();\n promise = peerTitle.update({peerId: action.channel_id.toPeerId(true), wrapOptions});\n s.append(i18n('ChatMigration.To', [peerTitle.element]));\n } else {\n s.append(await wrapMessageActionTextNew({\n message,\n ...wrapOptions\n }));\n }\n }\n bubbleContainer.append(s);\n\n if(message.pFlags.is_single) { // * Ignore 'Discussion started'\n bubble.classList.add('is-group-last');\n }\n\n return ret;\n }\n\n let messageMedia: MessageMedia = isMessage && message.media;\n let needToSetHTML = true;\n let messageMessage: string, totalEntities: MessageEntity[];\n if(isMessage) {\n if(groupedId && albumMustBeRenderedFull) {\n const t = getAlbumText(albumMessages);\n messageMessage = t?.message || '';\n // totalEntities = t.entities;\n totalEntities = t?.totalEntities || [];\n } else {\n messageMessage = message.message;\n // totalEntities = message.entities;\n totalEntities = message.totalEntities;\n }\n\n const document = (messageMedia as MessageMedia.messageMediaDocument)?.document as MyDocument;\n if(document) {\n if(document?.type === 'sticker') {\n messageMessage = totalEntities = undefined;\n } else if(!['video', 'gif'].includes(document.type)) {\n needToSetHTML = false;\n }\n }\n } else {\n if(message.action._ === 'messageActionPhoneCall') {\n messageMedia = {\n _: 'messageMediaCall',\n action: message.action\n };\n }\n }\n\n let bigEmojis = 0, customEmojiSize: MediaSize;\n if(totalEntities && !messageMedia) {\n const emojiEntities = totalEntities.filter((e) => e._ === 'messageEntityEmoji'/* || e._ === 'messageEntityCustomEmoji' */);\n const strLength = messageMessage.replace(/\\s/g, '').length;\n const emojiStrLength = emojiEntities.reduce((acc, curr) => acc + curr.length, 0);\n\n if(emojiStrLength === strLength /* && emojiEntities.length <= 3 *//* && totalEntities.length === emojiEntities.length */) {\n bigEmojis = Math.min(BIG_EMOJI_SIZES_LENGTH, emojiEntities.length);\n\n customEmojiSize = mediaSizes.active.customEmoji;\n\n const size = BIG_EMOJI_SIZES[bigEmojis];\n if(size) {\n customEmojiSize = makeMediaSize(size, size);\n bubble.style.setProperty('--emoji-size', size + 'px');\n }\n }\n }\n\n customEmojiSize ??= this.chat.appImManager.customEmojiSize;\n\n const richText = wrapRichText(messageMessage, {\n entities: totalEntities,\n passEntities: this.passEntities,\n loadPromises,\n lazyLoadQueue: this.lazyLoadQueue,\n customEmojiSize,\n middleware,\n animationGroup: this.chat.animationGroup\n });\n\n let canHaveTail = true;\n let isStandaloneMedia = false;\n let attachmentDiv: HTMLElement;\n if(bigEmojis) {\n if(rootScope.settings.emoji.big) {\n const sticker = bigEmojis === 1 &&\n !totalEntities.find((entity) => entity._ === 'messageEntityCustomEmoji') &&\n await this.managers.appStickersManager.getAnimatedEmojiSticker(messageMessage);\n if(bigEmojis === 1 && !messageMedia && sticker) {\n messageMedia = {\n _: 'messageMediaDocument',\n document: sticker,\n pFlags: {}\n };\n } else {\n attachmentDiv = document.createElement('div');\n attachmentDiv.classList.add('attachment', 'spoilers-container');\n\n setInnerHTML(attachmentDiv, richText);\n\n bubbleContainer.append(attachmentDiv);\n }\n\n bubble.classList.add('is-message-empty', 'emoji-big');\n isStandaloneMedia = true;\n canHaveTail = false;\n needToSetHTML = false;\n }\n\n bubble.classList.add('can-have-big-emoji');\n }\n\n if(needToSetHTML) {\n setInnerHTML(messageDiv, richText);\n }\n\n const haveRTLChar = isRTL(messageMessage, true);\n\n const timeSpan = MessageRender.setTime({\n chatType: this.chat.type,\n message,\n reactionsMessage\n });\n messageDiv.append(timeSpan);\n bubbleContainer.prepend(messageDiv);\n // bubble.prepend(timeSpan, messageDiv); // that's bad\n\n if(haveRTLChar) {\n timeSpan.classList.add('is-block');\n }\n\n let topicNameButtonContainer: HTMLElement;\n if(isMessage && this.chat.isAllMessagesForum) {\n const result = await wrapTopicNameButton({\n peerId: this.peerId,\n threadId: getMessageThreadId(message, this.chat.isForum),\n lastMsgId: message.mid,\n wrapOptions: {\n middleware\n },\n withIcons: true\n });\n\n const {element} = result;\n // if(isStandaloneMedia) {\n // element.classList.add('floating-part');\n // }\n\n topicNameButtonContainer = document.createElement('div');\n topicNameButtonContainer.classList.add(/* 'name', */'topic-name-button-container');\n topicNameButtonContainer.append(element);\n }\n\n if(isMessage && message.views) {\n bubble.classList.add('channel-post');\n\n if(!message.fwd_from?.saved_from_msg_id && this.chat.type !== 'pinned') {\n const forward = document.createElement('div');\n forward.classList.add('bubble-beside-button', 'forward', 'tgico-forward_filled');\n bubbleContainer.prepend(forward);\n bubble.classList.add('with-beside-button');\n }\n\n if(!message.pFlags.is_outgoing && this.observer) {\n this.observer.observe(bubble, this.viewsObserverCallback);\n }\n }\n\n const replyMarkup = isMessage && message.reply_markup;\n let replyMarkupRows = replyMarkup?._ === 'replyInlineMarkup' && replyMarkup.rows;\n if(replyMarkupRows) {\n replyMarkupRows = replyMarkupRows.filter((row) => row.buttons.length);\n }\n\n if(replyMarkupRows) {\n const containerDiv = document.createElement('div');\n containerDiv.classList.add('reply-markup');\n replyMarkupRows.forEach((row) => {\n const buttons = row.buttons;\n\n const rowDiv = document.createElement('div');\n rowDiv.classList.add('reply-markup-row');\n\n buttons.forEach((button) => {\n let text: DocumentFragment | HTMLElement | string = wrapRichText(button.text, {noLinks: true, noLinebreaks: true});\n\n let buttonEl: HTMLButtonElement | HTMLAnchorElement;\n\n switch(button._) {\n case 'keyboardButtonUrl': {\n const r = wrapRichText(' ', {\n entities: [{\n _: 'messageEntityTextUrl',\n length: 1,\n offset: 0,\n url: button.url\n }]\n });\n\n buttonEl = htmlToDocumentFragment(r).firstElementChild as HTMLAnchorElement;\n buttonEl.classList.add('is-link');\n\n break;\n }\n\n case 'keyboardButtonSwitchInline': {\n buttonEl = document.createElement('button');\n buttonEl.classList.add('is-switch-inline');\n attachClickEvent(buttonEl, (e) => {\n cancelEvent(e);\n\n const botId = message.viaBotId || message.fromId;\n let promise: Promise;\n if(button.pFlags.same_peer) promise = Promise.resolve(this.peerId);\n else promise = this.managers.appInlineBotsManager.checkSwitchReturn(botId).then((peerId) => {\n if(peerId) {\n return peerId;\n }\n\n return new Promise((resolve, reject) => {\n const popup = new PopupForward(undefined, (peerId) => {\n resolve(peerId);\n });\n\n popup.addEventListener('close', () => {\n reject();\n });\n });\n });\n\n promise.then((peerId) => {\n const threadId = this.peerId === peerId ? this.chat.threadId : undefined;\n this.chat.appImManager.setInnerPeer({peerId});\n this.managers.appInlineBotsManager.switchInlineQuery(peerId, threadId, botId, button.query);\n });\n });\n break;\n }\n\n case 'keyboardButtonBuy': {\n const mediaInvoice = messageMedia._ === 'messageMediaInvoice' ? messageMedia : undefined;\n if(mediaInvoice?.extended_media) {\n break;\n }\n\n buttonEl = document.createElement('button');\n buttonEl.classList.add('is-buy');\n\n if(mediaInvoice?.receipt_msg_id) {\n text = i18n('Message.ReplyActionButtonShowReceipt');\n }\n\n break;\n }\n\n case 'keyboardButtonUrlAuth': {\n buttonEl = document.createElement('button');\n buttonEl.classList.add('is-url-auth');\n\n const {peerId} = this;\n const {mid} = message;\n const {url, button_id} = button;\n\n attachClickEvent(buttonEl, () => {\n const toggle = toggleDisability([buttonEl], true);\n this.chat.appImManager.handleUrlAuth({\n peerId,\n mid,\n url,\n buttonId: button_id\n }).then(() => {\n toggle();\n });\n });\n break;\n }\n\n default: {\n buttonEl = document.createElement('button');\n break;\n }\n }\n\n if(!buttonEl) {\n return;\n }\n\n buttonEl.classList.add('reply-markup-button', 'rp', 'tgico');\n const t = document.createElement('span');\n t.classList.add('reply-markup-button-text');\n if(typeof(text) === 'string') {\n t.insertAdjacentHTML('beforeend', text);\n } else {\n t.append(text);\n }\n\n ripple(buttonEl);\n buttonEl.append(t);\n\n rowDiv.append(buttonEl);\n });\n\n if(!rowDiv.childElementCount) {\n return;\n }\n\n containerDiv.append(rowDiv);\n });\n\n const haveButtons = !!containerDiv.childElementCount;\n\n haveButtons && attachClickEvent(containerDiv, (e) => {\n let target = e.target as HTMLElement;\n\n if(!target.classList.contains('reply-markup-button')) target = findUpClassName(target, 'reply-markup-button');\n if(\n !target ||\n target.classList.contains('is-link') ||\n target.classList.contains('is-switch-inline') ||\n target.classList.contains('is-buy') ||\n target.classList.contains('is-url-auth')\n ) return;\n\n cancelEvent(e);\n\n const column = whichChild(target);\n const row = replyMarkupRows[whichChild(target.parentElement)];\n\n if(!row.buttons || !row.buttons[column]) {\n this.log.warn('no such button', row, column, message);\n return;\n }\n\n const button = row.buttons[column];\n this.managers.appInlineBotsManager.callbackButtonClick(this.peerId, message.mid, button).then((callbackAnswer) => {\n if(typeof callbackAnswer.message === 'string' && callbackAnswer.message.length) {\n toast(wrapRichText(callbackAnswer.message, {noLinks: true, noLinebreaks: true}));\n }\n\n // console.log('callbackButtonClick callbackAnswer:', callbackAnswer);\n });\n });\n\n if(haveButtons) {\n // canHaveTail = false;\n bubble.classList.add('with-reply-markup');\n contentWrapper.append(containerDiv);\n }\n }\n\n const isOutgoing = message.pFlags.is_outgoing/* && this.peerId !== rootScope.myId */;\n if(our) {\n if(message.pFlags.unread || isOutgoing) this.unreadOut.add(message.mid);\n let status = '';\n if(message.error) status = 'is-error';\n else if(isOutgoing) status = 'is-sending';\n else status = message.pFlags.unread || (message as Message.message).pFlags.is_scheduled ? 'is-sent' : 'is-read';\n bubble.classList.add(status);\n }\n\n if(isOutgoing && !message.error) {\n bubble.classList.add('is-outgoing');\n }\n\n const messageWithReplies = isMessage && await this.managers.appMessagesManager.getMessageWithCommentReplies(message);\n const withReplies = !!messageWithReplies && message.mid > 0;\n\n if(withReplies) {\n bubble.classList.add('with-replies');\n }\n\n const fwdFrom = isMessage && message.fwd_from;\n const fwdFromId = isMessage && message.fwdFromId;\n\n const isOut = this.chat.isOutMessage(message);\n let nameContainer: HTMLElement = bubbleContainer;\n\n const canHideNameIfMedia = !message.viaBotId && (message.fromId === rootScope.myId || !message.pFlags.out);\n\n const isMessageEmpty = !messageMessage/* && (!topicNameButtonContainer || isStandaloneMedia) */;\n\n let viewButton: HTMLAnchorElement;\n // media\n if(messageMedia/* && messageMedia._ === 'messageMediaPhoto' */) {\n attachmentDiv = document.createElement('div');\n attachmentDiv.classList.add('attachment');\n\n if(isMessageEmpty) {\n bubble.classList.add('is-message-empty');\n }\n\n let processingWebPage = false;\n\n /* if(isMessage) */switch(messageMedia._) {\n case 'messageMediaPhoto': {\n const photo = messageMedia.photo;\n // //////this.log('messageMediaPhoto', photo);\n\n if(isMessageEmpty) {\n canHaveTail = false;\n }\n\n if(canHideNameIfMedia) {\n bubble.classList.add('hide-name');\n }\n\n bubble.classList.add('photo');\n\n if(albumMustBeRenderedFull && groupedId && albumMids.length !== 1) {\n bubble.classList.add('is-album', 'is-grouped');\n wrapAlbum({\n messages: albumMessages,\n attachmentDiv,\n middleware: this.getMiddleware(),\n isOut: our,\n lazyLoadQueue: this.lazyLoadQueue,\n chat: this.chat,\n loadPromises,\n autoDownload: this.chat.autoDownload\n });\n\n break;\n }\n\n const withTail = !IS_ANDROID && canHaveTail && !withReplies && USE_MEDIA_TAILS;\n if(withTail) bubble.classList.add('with-media-tail');\n const p = wrapPhoto({\n photo: photo as Photo.photo,\n message,\n container: attachmentDiv,\n withTail,\n isOut,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware: this.getMiddleware(),\n loadPromises,\n autoDownloadSize: this.chat.autoDownload.photo\n });\n\n if(messageMedia.pFlags.spoiler) {\n loadPromises.push(this.wrapMediaSpoiler({\n media: photo as Photo.photo,\n promise: p,\n middleware,\n attachmentDiv\n }));\n }\n\n break;\n }\n\n case 'messageMediaWebPage': {\n processingWebPage = true;\n\n const webPage: WebPage = messageMedia.webpage;\n // //////this.log('messageMediaWebPage', webpage);\n if(webPage._ !== 'webPage') {\n break;\n }\n\n const wrapped = wrapUrl(webPage.url);\n if(wrapped?.onclick === 'im') {\n const map: {[type: string]: LangPackKey} = {\n telegram_channel: 'Chat.Message.ViewChannel',\n telegram_megagroup: 'OpenGroup',\n telegram_bot: 'Chat.Message.ViewBot'\n };\n\n const langPackKey = map[webPage.type] || 'OpenMessage';\n viewButton = this.makeViewButton({text: langPackKey, asLink: true});\n viewButton.href = wrapped.url;\n viewButton.setAttribute('onclick', `${wrapped.onclick}(this)`);\n }\n\n bubble.classList.add('webpage');\n\n const box = document.createElement('div');\n box.classList.add('web');\n\n const quote = document.createElement('div');\n quote.classList.add('quote');\n\n let previewResizer: HTMLDivElement, preview: HTMLDivElement;\n const photo: Photo.photo = webPage.photo as any;\n if(photo || webPage.document) {\n previewResizer = document.createElement('div');\n previewResizer.classList.add('preview-resizer');\n preview = document.createElement('div');\n preview.classList.add('preview');\n previewResizer.append(preview);\n }\n\n const quoteTextDiv = document.createElement('div');\n quoteTextDiv.classList.add('quote-text');\n\n const doc = webPage.document as MyDocument;\n if(doc) {\n if(doc.type === 'gif' || doc.type === 'video' || doc.type === 'round') {\n // if(doc.size <= 20e6) {\n const mediaSize = doc.type === 'round' ? mediaSizes.active.round : mediaSizes.active.webpage;\n if(doc.type === 'round') {\n bubble.classList.add('round');\n preview.classList.add('is-round');\n } else {\n bubble.classList.add('video');\n }\n wrapVideo({\n doc,\n container: preview,\n message: message as Message.message,\n boxWidth: mediaSize.width,\n boxHeight: mediaSize.height,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware: this.getMiddleware(),\n isOut,\n group: this.chat.animationGroup,\n loadPromises,\n autoDownload: this.chat.autoDownload,\n noInfo: message.mid < 0\n });\n // }\n } else {\n const docDiv = await wrapDocument({\n message: message as Message.message,\n autoDownloadSize: this.chat.autoDownload.file,\n lazyLoadQueue: this.lazyLoadQueue,\n loadPromises,\n sizeType: 'documentName',\n searchContext: {\n useSearch: false,\n peerId: this.peerId,\n inputFilter: {\n _: 'inputMessagesFilterEmpty'\n }\n },\n fontSize: rootScope.settings.messagesTextSize\n });\n preview.append(docDiv);\n preview.classList.add('preview-with-document');\n quoteTextDiv.classList.add('has-document');\n // messageDiv.classList.add((webpage.type || 'document') + '-message');\n // doc = null;\n }\n }\n\n if(previewResizer) {\n quoteTextDiv.append(previewResizer);\n }\n\n let t: HTMLElement;\n if(webPage.site_name) {\n const html = wrapRichText(webPage.url);\n const a: HTMLAnchorElement = htmlToDocumentFragment(html).firstElementChild as any;\n a.classList.add('webpage-name');\n const strong = document.createElement('strong');\n setInnerHTML(strong, wrapEmojiText(webPage.site_name));\n a.textContent = '';\n a.append(strong);\n quoteTextDiv.append(a);\n t = a;\n }\n\n const title = wrapWebPageTitle(webPage);\n if(title.textContent) {\n const titleDiv = document.createElement('div');\n titleDiv.classList.add('title');\n const strong = document.createElement('strong');\n setInnerHTML(strong, title);\n titleDiv.append(strong);\n quoteTextDiv.append(titleDiv);\n t = titleDiv;\n }\n\n const description = wrapWebPageDescription(webPage);\n if(description.textContent) {\n const textDiv = document.createElement('div');\n textDiv.classList.add('text');\n setInnerHTML(textDiv, description);\n quoteTextDiv.append(textDiv);\n t = textDiv;\n }\n\n /* if(t) {\n t.append(timeSpan);\n } else {\n box.classList.add('no-text');\n } */\n\n quote.append(quoteTextDiv);\n\n if(photo && !doc) {\n bubble.classList.add('photo');\n\n const size: PhotoSize.photoSize = photo.sizes[photo.sizes.length - 1] as any;\n let isSquare = false;\n if(size.w === size.h && t) {\n bubble.classList.add('is-square-photo');\n isSquare = true;\n setAttachmentSize(photo, preview, 48, 48, false);\n\n /* if(t) {\n t.append(timeSpan);\n } */\n } else if(size.h > size.w) {\n bubble.classList.add('is-vertical-photo');\n }\n\n wrapPhoto({\n photo,\n message,\n container: preview,\n boxWidth: isSquare ? 0 : mediaSizes.active.webpage.width,\n boxHeight: isSquare ? 0 : mediaSizes.active.webpage.height,\n isOut,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware: this.getMiddleware(),\n loadPromises,\n withoutPreloader: isSquare,\n autoDownloadSize: this.chat.autoDownload.photo\n });\n }\n\n box.append(quote);\n\n // bubble.prepend(box);\n // if(timeSpan.parentElement === messageDiv) {\n messageDiv.insertBefore(box, timeSpan);\n // } else {\n // messageDiv.append(box);\n // }\n\n // this.log('night running', bubble.scrollHeight);\n\n break;\n }\n\n case 'messageMediaDocument': {\n const doc = messageMedia.document as MyDocument;\n\n // this.log('messageMediaDocument', doc, bubble);\n\n if(doc.sticker/* && doc.size <= 1e6 */) {\n bubble.classList.add('sticker');\n canHaveTail = false;\n isStandaloneMedia = true;\n\n if(doc.animated) {\n bubble.classList.add('sticker-animated');\n }\n\n const sizes = mediaSizes.active;\n const isEmoji = bubble.classList.contains('emoji-big');\n const boxSize = isEmoji ? sizes.emojiSticker : (doc.animated ? sizes.animatedSticker : sizes.staticSticker);\n setAttachmentSize(doc, attachmentDiv, boxSize.width, boxSize.height);\n // let preloader = new ProgressivePreloader(attachmentDiv, false);\n bubbleContainer.style.minWidth = attachmentDiv.style.width;\n bubbleContainer.style.minHeight = attachmentDiv.style.height;\n // appPhotosManager.setAttachmentSize(doc, bubble);\n wrapSticker({\n doc,\n div: attachmentDiv,\n middleware,\n lazyLoadQueue: this.lazyLoadQueue,\n group: this.chat.animationGroup,\n // play: !!message.pending || !multipleRender,\n play: true,\n loop: true,\n emoji: isEmoji ? messageMessage : undefined,\n withThumb: true,\n loadPromises,\n isOut,\n noPremium: messageMedia?.pFlags?.nopremium\n });\n\n if((getStickerEffectThumb(doc) || isEmoji) && (isInUnread || isOutgoing)/* || true */) {\n this.observer.observe(bubble, this.stickerEffectObserverCallback);\n }\n } else if(doc.type === 'video' || doc.type === 'gif' || doc.type === 'round'/* && doc.size <= 20e6 */) {\n // this.log('never get free 2', doc);\n\n const isRound = doc.type === 'round';\n if(isRound) {\n isStandaloneMedia = true;\n }\n\n if(isRound || isMessageEmpty) {\n canHaveTail = false;\n }\n\n if(canHideNameIfMedia) {\n bubble.classList.add('hide-name');\n }\n\n bubble.classList.add(isRound ? 'round' : 'video');\n if(albumMustBeRenderedFull && groupedId && albumMids.length !== 1) {\n bubble.classList.add('is-album', 'is-grouped');\n\n wrapAlbum({\n messages: albumMessages,\n attachmentDiv,\n middleware,\n isOut: our,\n lazyLoadQueue: this.lazyLoadQueue,\n chat: this.chat,\n loadPromises,\n autoDownload: this.chat.autoDownload\n });\n } else {\n const withTail = !IS_ANDROID && !IS_APPLE && !isRound && canHaveTail && !withReplies && USE_MEDIA_TAILS;\n if(withTail) bubble.classList.add('with-media-tail');\n const p = wrapVideo({\n doc,\n container: attachmentDiv,\n message: message as Message.message,\n boxWidth: mediaSizes.active.regular.width,\n boxHeight: mediaSizes.active.regular.height,\n withTail,\n isOut,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n group: this.chat.animationGroup,\n loadPromises,\n autoDownload: this.chat.autoDownload,\n searchContext: isRound ? {\n peerId: this.peerId,\n inputFilter: {_: 'inputMessagesFilterRoundVoice'},\n threadId: this.chat.threadId,\n useSearch: !(message as Message.message).pFlags.is_scheduled,\n isScheduled: (message as Message.message).pFlags.is_scheduled\n } : undefined,\n noInfo: message.mid < 0,\n noAutoplayAttribute: !!messageMedia.pFlags.spoiler\n });\n\n if(messageMedia.pFlags.spoiler) {\n loadPromises.push(this.wrapMediaSpoiler({\n media: doc,\n promise: p,\n middleware,\n attachmentDiv\n }));\n }\n }\n } else {\n const newNameContainer = await wrapGroupedDocuments({\n albumMustBeRenderedFull,\n message,\n bubble,\n messageDiv,\n chat: this.chat,\n loadPromises,\n autoDownloadSize: this.chat.autoDownload.file,\n lazyLoadQueue: this.lazyLoadQueue,\n searchContext: doc.type === 'voice' || doc.type === 'audio' ? {\n peerId: this.peerId,\n inputFilter: {_: doc.type === 'voice' ? 'inputMessagesFilterRoundVoice' : 'inputMessagesFilterMusic'},\n threadId: this.chat.threadId,\n useSearch: !(message as Message.message).pFlags.is_scheduled,\n isScheduled: (message as Message.message).pFlags.is_scheduled\n } : undefined,\n sizeType: 'documentName',\n fontSize: rootScope.settings.messagesTextSize,\n richTextFragment: richText\n });\n\n if(newNameContainer) {\n nameContainer = newNameContainer;\n }\n\n const lastContainer = messageDiv.lastElementChild.querySelector('.document-message, .document, .audio');\n // lastContainer && lastContainer.append(timeSpan.cloneNode(true));\n lastContainer && lastContainer.append(timeSpan);\n\n bubble.classList.remove('is-message-empty');\n const addClassName = (!(['photo', 'pdf'] as MyDocument['type'][]).includes(doc.type) ? doc.type || 'document' : 'document') + '-message';\n messageDiv.classList.add(addClassName);\n\n if(doc.type === 'audio' || doc.type === 'voice') {\n bubble.classList.add('min-content');\n }\n\n processingWebPage = true;\n }\n\n break;\n }\n\n case 'messageMediaCall': {\n const action = messageMedia.action;\n const div = document.createElement('div');\n div.classList.add('bubble-call', action.pFlags.video ? 'tgico-videocamera' : 'tgico-phone');\n\n const type: CallType = action.pFlags.video ? 'video' : 'voice';\n div.dataset.type = type;\n\n const title = document.createElement('div');\n title.classList.add('bubble-call-title');\n\n _i18n(title, isOut ?\n (action.pFlags.video ? 'CallMessageVideoOutgoing' : 'CallMessageOutgoing') :\n (action.pFlags.video ? 'CallMessageVideoIncoming' : 'CallMessageIncoming'));\n\n const subtitle = document.createElement('div');\n subtitle.classList.add('bubble-call-subtitle');\n\n if(action.duration !== undefined) {\n subtitle.append(formatCallDuration(action.duration));\n } else {\n let langPackKey: LangPackKey;\n switch(action.reason._) {\n case 'phoneCallDiscardReasonBusy':\n langPackKey = 'Call.StatusBusy';\n break;\n case 'phoneCallDiscardReasonMissed':\n langPackKey = 'Chat.Service.Call.Missed';\n break;\n // case 'phoneCallDiscardReasonHangup':\n default:\n langPackKey = 'Chat.Service.Call.Cancelled';\n break;\n }\n\n subtitle.classList.add('is-reason');\n _i18n(subtitle, langPackKey);\n }\n\n subtitle.classList.add('tgico', 'arrow-' + (action.duration !== undefined ? 'green' : 'red'));\n\n div.append(title, subtitle);\n\n processingWebPage = true;\n\n bubble.classList.remove('is-message-empty');\n messageDiv.classList.add('call-message');\n messageDiv.append(div);\n\n break;\n }\n\n case 'messageMediaContact': {\n // this.log('wrapping contact', message);\n\n const contact = messageMedia;\n const contactDiv = document.createElement('div');\n contactDiv.classList.add('contact');\n contactDiv.dataset.peerId = '' + contact.user_id;\n\n processingWebPage = true;\n\n const contactDetails = document.createElement('div');\n contactDetails.className = 'contact-details';\n const contactNameDiv = document.createElement('div');\n contactNameDiv.className = 'contact-name';\n const fullName = [\n contact.first_name,\n contact.last_name\n ].filter(Boolean).join(' ');\n contactNameDiv.append(\n fullName.trim() ? wrapEmojiText(fullName) : i18n('AttachContact')\n );\n\n const contactNumberDiv = document.createElement('div');\n contactNumberDiv.className = 'contact-number';\n contactNumberDiv.textContent = contact.phone_number ? '+' + formatPhoneNumber(contact.phone_number).formatted : 'Unknown phone number';\n\n contactDiv.append(contactDetails);\n contactDetails.append(contactNameDiv, contactNumberDiv);\n\n const avatarElem = new AvatarElement();\n avatarElem.updateWithOptions({\n lazyLoadQueue: this.lazyLoadQueue,\n peerId: contact.user_id.toPeerId(),\n peerTitle: contact.user_id ? undefined : (fullName.trim() ? fullName : I18n.format('AttachContact', true)[0])\n });\n avatarElem.classList.add('contact-avatar', 'avatar-54');\n\n contactDiv.prepend(avatarElem);\n\n bubble.classList.remove('is-message-empty');\n messageDiv.classList.add('contact-message');\n messageDiv.append(contactDiv);\n\n break;\n }\n\n case 'messageMediaPoll': {\n bubble.classList.remove('is-message-empty');\n\n const pollElement = wrapPoll(message);\n messageDiv.prepend(pollElement);\n messageDiv.classList.add('poll-message');\n\n break;\n }\n\n case 'messageMediaInvoice': {\n const isTest = messageMedia.pFlags.test;\n const extendedMedia = messageMedia.extended_media;\n const isAlreadyPaid = extendedMedia?._ === 'messageExtendedMedia';\n const isNotPaid = extendedMedia?._ === 'messageExtendedMediaPreview';\n let innerMedia = isAlreadyPaid ?\n (extendedMedia.media as MessageMedia.messageMediaPhoto).photo as Photo.photo ||\n (extendedMedia.media as MessageMedia.messageMediaDocument).document as Document.document :\n messageMedia.photo;\n\n const wrappedPrice = paymentsWrapCurrencyAmount(messageMedia.total_amount, messageMedia.currency);\n let priceEl: HTMLElement;\n if(!extendedMedia) {\n priceEl = document.createElement(innerMedia ? 'span' : 'div');\n const f = document.createDocumentFragment();\n const l = i18n(messageMedia.receipt_msg_id ? 'PaymentReceipt' : (isTest ? 'PaymentTestInvoice' : 'PaymentInvoice'));\n l.classList.add('text-uppercase');\n const joiner = ' ' + NBSP;\n const p = document.createElement('span');\n p.classList.add('text-bold');\n p.textContent = wrappedPrice + joiner;\n f.append(p, l);\n if(isTest && messageMedia.receipt_msg_id) {\n const a = document.createElement('span');\n a.classList.add('text-uppercase', 'pre-wrap');\n a.append(joiner + '(Test)');\n f.append(a);\n }\n setInnerHTML(priceEl, f);\n } else if(isNotPaid) {\n priceEl = document.createElement('span');\n priceEl.classList.add('extended-media-buy', 'tgico-premium_lock');\n attachmentDiv.classList.add('is-buy');\n _i18n(priceEl, 'Checkout.PayPrice', [wrappedPrice]);\n\n if(extendedMedia.video_duration !== undefined) {\n const videoTime = document.createElement('span');\n videoTime.classList.add('video-time');\n videoTime.textContent = toHHMMSS(extendedMedia.video_duration, false);\n attachmentDiv.append(videoTime);\n }\n }\n\n if(isNotPaid) {\n (extendedMedia.thumb as PhotoSize.photoStrippedSize).w = extendedMedia.w;\n (extendedMedia.thumb as PhotoSize.photoStrippedSize).h = extendedMedia.h;\n innerMedia = {\n _: 'photo',\n access_hash: '',\n pFlags: {},\n date: 0,\n dc_id: 0,\n file_reference: [],\n id: 0,\n sizes: [extendedMedia.thumb]\n };\n }\n\n if(innerMedia) {\n const mediaSize = extendedMedia ? mediaSizes.active.extendedInvoice : mediaSizes.active.invoice;\n if(innerMedia._ === 'document') {\n wrapVideo({\n doc: innerMedia,\n container: attachmentDiv,\n withTail: false,\n isOut,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n loadPromises,\n boxWidth: mediaSize.width,\n boxHeight: mediaSize.height,\n group: this.chat.animationGroup,\n message: message as Message.message\n });\n bubble.classList.add('video');\n } else {\n wrapPhoto({\n photo: innerMedia,\n container: attachmentDiv,\n withTail: false,\n isOut,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n loadPromises,\n boxWidth: mediaSize.width,\n boxHeight: mediaSize.height,\n message: isAlreadyPaid ? message : undefined\n });\n bubble.classList.add('photo');\n }\n\n if(priceEl) {\n if(!extendedMedia) {\n priceEl.classList.add('video-time');\n }\n\n attachmentDiv.append(priceEl);\n }\n } else {\n attachmentDiv = undefined;\n }\n\n if(isNotPaid) {\n const {mid} = message;\n this.extendedMediaMessages.add(mid);\n middleware.onClean(() => {\n this.extendedMediaMessages.delete(mid);\n });\n this.setExtendedMediaMessagesPollInterval();\n\n const {width, height} = attachmentDiv.style;\n const dotRenderer = DotRenderer.create({\n width: parseInt(width),\n height: parseInt(height),\n middleware,\n animationGroup: this.chat.animationGroup\n });\n attachmentDiv.append(dotRenderer.canvas);\n }\n\n let titleDiv: HTMLElement;\n if(!extendedMedia) {\n titleDiv = document.createElement('div');\n titleDiv.classList.add('bubble-primary-color');\n setInnerHTML(titleDiv, wrapEmojiText(messageMedia.title));\n }\n\n const richText = isAlreadyPaid ? undefined : wrapEmojiText(messageMedia.description);\n messageDiv.prepend(...[titleDiv, !innerMedia && priceEl, richText].filter(Boolean));\n\n if(!richText) canHaveTail = false;\n else bubble.classList.remove('is-message-empty');\n bubble.classList.add('is-invoice');\n\n break;\n }\n\n default:\n attachmentDiv = undefined;\n bubble.classList.remove('is-message-empty');\n messageDiv.append(i18n(UNSUPPORTED_LANG_PACK_KEY), timeSpan);\n this.log.warn('unrecognized media type:', messageMedia._, message);\n break;\n }\n\n if(!processingWebPage && attachmentDiv) {\n bubbleContainer.append(attachmentDiv);\n }\n\n /* if(bubble.classList.contains('is-message-empty') && (bubble.classList.contains('photo') || bubble.classList.contains('video'))) {\n bubble.classList.add('no-tail');\n\n if(!bubble.classList.contains('with-media-tail')) {\n bubble.classList.add('use-border-radius');\n }\n } */\n }\n\n if(isStandaloneMedia) {\n bubble.classList.add('just-media');\n }\n\n if(viewButton) {\n timeSpan.before(viewButton);\n // messageDiv.append(viewButton);\n }\n\n let savedFrom = '';\n\n // const needName = ((peerId.isAnyChat() && (peerId !== message.fromId || our)) && message.fromId !== rootScope.myId) || message.viaBotId;\n const needName = (message.fromId !== rootScope.myId && this.chat.isAnyGroup) || message.viaBotId || (message as Message.message).pFlags.sponsored;\n if(needName || fwdFrom || message.reply_to_mid || topicNameButtonContainer) { // chat\n let title: HTMLElement | DocumentFragment;\n let titleVia: typeof title;\n\n const isForwardFromChannel = message.from_id?._ === 'peerChannel' && message.fromId === fwdFromId;\n\n const mustHaveName = !!(message.viaBotId/* || topicNameButtonContainer */);\n const isHidden = fwdFrom && !fwdFrom.from_id;\n if(message.viaBotId) {\n titleVia = document.createElement('span');\n titleVia.innerText = '@' + (await this.managers.appPeersManager.getPeerUsername(message.viaBotId));\n titleVia.classList.add('peer-title');\n }\n\n if(mustHaveName) {\n bubble.classList.add('must-have-name');\n }\n\n const isForward = fwdFromId || fwdFrom;\n if(isHidden) {\n // /////this.log('message to render hidden', message);\n title = document.createElement('span');\n setInnerHTML(title, wrapEmojiText(fwdFrom.from_name));\n title.classList.add('peer-title');\n // title = fwdFrom.from_name;\n bubble.classList.add('hidden-profile');\n } else {\n title = new PeerTitle({peerId: fwdFromId || message.fromId, withPremiumIcon: !isForward, wrapOptions}).element;\n }\n\n let replyContainer: HTMLElement;\n if(\n isMessage &&\n message.reply_to_mid &&\n message.reply_to_mid !== this.chat.threadId &&\n (!this.chat.isAllMessagesForum || message.reply_to.reply_to_top_id)\n ) {\n replyContainer = await MessageRender.setReply({\n chat: this.chat,\n bubble,\n bubbleContainer,\n message\n });\n }\n\n // this.log(title);\n\n let nameDiv: HTMLElement;\n if(isForward) {\n if(this.peerId !== rootScope.myId && !isForwardFromChannel) {\n bubble.classList.add('forwarded');\n }\n\n if(message.savedFrom) {\n savedFrom = message.savedFrom;\n title.dataset.savedFrom = savedFrom;\n }\n\n nameDiv = document.createElement('div');\n title.dataset.peerId = '' + fwdFromId;\n\n if((this.peerId === rootScope.myId || this.peerId === REPLIES_PEER_ID || isForwardFromChannel) && !isStandaloneMedia) {\n nameDiv.style.color = getPeerColorById(fwdFromId, false);\n nameDiv.classList.add('colored-name');\n nameDiv.append(title);\n } else {\n /* const fromTitle = message.fromId === this.myID || appPeersManager.isBroadcast(fwdFromId || message.fromId) ? '' : `
${appPeersManager.getPeerTitle(message.fromId)}
`;\n nameDiv.innerHTML = fromTitle + 'Forwarded from ' + title; */\n const args: FormatterArguments = [title];\n if(isStandaloneMedia) {\n const br = document.createElement('br');\n br.classList.add('hide-ol');\n args.unshift(br);\n }\n nameDiv.append(i18n('ForwardedFrom', [args]));\n }\n } else if(!message.viaBotId) {\n if(!isStandaloneMedia && needName) {\n nameDiv = document.createElement('div');\n nameDiv.append(title);\n\n const peer = await this.managers.appPeersManager.getPeer(message.fromId);\n const pFlags = (peer as User.user)?.pFlags;\n if(pFlags && (pFlags.scam || pFlags.fake)) {\n nameDiv.append(generateFakeIcon(pFlags.scam));\n }\n\n if(!our) {\n nameDiv.style.color = getPeerColorById(message.fromId, false);\n nameDiv.classList.add('colored-name');\n }\n\n nameDiv.dataset.peerId = '' + message.fromId;\n } else /* if(!message.reply_to_mid) */ {\n bubble.classList.add('hide-name');\n }\n }\n\n if(message.viaBotId) {\n if(!nameDiv) {\n nameDiv = document.createElement('div');\n } else {\n nameDiv.append(' ');\n }\n\n const span = document.createElement('span');\n span.append(i18n('ViaBot'), ' ', titleVia);\n span.classList.add('is-via');\n\n nameDiv.append(span);\n }\n\n if(topicNameButtonContainer) {\n if(isStandaloneMedia) {\n topicNameButtonContainer.classList.add('floating-part');\n } else {\n if(!nameDiv) {\n nameDiv = document.createElement('div');\n }\n\n nameDiv.append(topicNameButtonContainer);\n\n bubble.classList.remove('hide-name');\n }\n }\n\n if(nameDiv) {\n nameDiv.classList.add('name');\n\n if(isStandaloneMedia) {\n nameContainer.append(nameContainer = document.createElement('div'));\n nameContainer.classList.add('name-with-reply', 'floating-part');\n } else {\n nameDiv.classList.add('floating-part');\n }\n\n nameContainer.append(nameDiv);\n\n if(isStandaloneMedia && replyContainer) {\n nameContainer.append(replyContainer);\n }\n } else if(isStandaloneMedia && replyContainer) {\n replyContainer.classList.add('floating-part');\n }\n\n if(topicNameButtonContainer && isStandaloneMedia) {\n if(!attachmentDiv) {\n this.log.error('no attachment div?', bubble, message);\n debugger;\n } else {\n attachmentDiv.after(topicNameButtonContainer);\n }\n }\n } else {\n bubble.classList.add('hide-name');\n }\n\n if(this.chat.type === 'pinned') {\n savedFrom = `${this.chat.peerId}_${message.mid}`;\n }\n\n const isThreadStarter = messageWithReplies && messageWithReplies.mid === this.chat.threadId;\n if(isThreadStarter) {\n bubble.classList.add('is-thread-starter', 'is-group-last');\n }\n\n if(savedFrom && (this.chat.type === 'pinned' || fwdFrom.saved_from_msg_id) && this.peerId !== REPLIES_PEER_ID) {\n const goto = document.createElement('div');\n goto.classList.add('bubble-beside-button', 'goto-original', 'tgico-arrow_next');\n bubbleContainer.append(goto);\n bubble.dataset.savedFrom = savedFrom;\n bubble.classList.add('with-beside-button');\n }\n\n bubble.classList.add(isOut ? 'is-out' : 'is-in');\n\n if(withReplies) {\n const isFooter = MessageRender.renderReplies({\n bubble,\n bubbleContainer,\n message: messageWithReplies,\n messageDiv,\n loadPromises,\n lazyLoadQueue: this.lazyLoadQueue\n });\n\n if(isFooter) {\n canHaveTail = true;\n } else {\n bubble.classList.add('with-beside-replies');\n }\n }\n\n if(isMessage) {\n this.appendReactionsElementToBubble(bubble, message, reactionsMessage);\n }\n\n /* if(isMessage) {\n const reactionHover = document.createElement('div');\n reactionHover.classList.add('bubble-reaction-hover');\n contentWrapper.append(reactionHover);\n } */\n\n if(canHaveTail) {\n bubble.classList.add('can-have-tail');\n\n bubbleContainer.append(generateTail());\n }\n\n return ret;\n }\n\n private appendReactionsElementToBubble(\n bubble: HTMLElement,\n message: Message.message,\n reactionsMessage: Message.message,\n changedResults?: ReactionCount[]\n ) {\n if(this.peerId.isUser() && USER_REACTIONS_INLINE/* || true */) {\n return;\n }\n\n if(!reactionsMessage?.reactions || !reactionsMessage.reactions.results.length) {\n return;\n }\n\n // message = this.appMessagesManager.getMessageWithReactions(message);\n\n const reactionsElement = new ReactionsElement();\n reactionsElement.init(reactionsMessage, 'block', bubble.middlewareHelper.get());\n reactionsElement.render(changedResults);\n\n if(bubble.classList.contains('is-message-empty')) {\n bubble.querySelector('.bubble-content-wrapper').append(reactionsElement);\n } else {\n const messageDiv = bubble.querySelector('.message');\n if(bubble.classList.contains('is-multiple-documents')) {\n const documentContainer = messageDiv.lastElementChild as HTMLElement;\n let documentMessageDiv = documentContainer.querySelector('.document-message');\n\n let timeSpan: HTMLElement = documentMessageDiv && documentMessageDiv.querySelector('.time');\n if(!timeSpan) {\n timeSpan = MessageRender.setTime({\n chatType: this.chat.type,\n message,\n reactionsMessage\n });\n }\n\n reactionsElement.append(timeSpan);\n\n if(!documentMessageDiv) {\n documentMessageDiv = document.createElement('div');\n documentMessageDiv.classList.add('document-message');\n documentContainer.querySelector('.document-wrapper').prepend(documentMessageDiv);\n }\n\n documentMessageDiv.append(reactionsElement);\n } else {\n const timeSpan = Array.from(bubble.querySelectorAll('.time')).pop();\n reactionsElement.append(timeSpan);\n\n messageDiv.append(reactionsElement);\n }\n }\n }\n\n private prepareToSaveScroll(reverse?: boolean) {\n const isMounted = !!this.chatInner.parentElement;\n if(!isMounted) {\n return {};\n }\n\n const log = this.log.bindPrefix('prepareToSaveScroll');\n log('save');\n const scrollSaver = this.createScrollSaver(reverse);\n scrollSaver.save(); // * let's save scroll position by point before the slicing, not after\n\n if(this.getRenderedLength() && !this.chat.setPeerPromise) {\n const viewportSlice = this.getViewportSlice();\n this.deleteViewportSlice(viewportSlice, true);\n }\n\n // scrollSaver.save(); // ! slicing will corrupt scroll position\n // const saved = scrollSaver.getSaved();\n // const hadScroll = saved.scrollHeight !== saved.clientHeight;\n\n return {\n restoreScroll: () => {\n log('restore');\n // scrollSaver.restore(_history.length === 1 && !reverse ? false : true);\n scrollSaver.restore(reverse);\n this.onRenderScrollSet(scrollSaver.getSaved());\n },\n scrollSaver\n };\n }\n\n public async performHistoryResult(\n historyResult: HistoryResult | {history: (Message.message | Message.messageService | number)[]},\n reverse: boolean\n ) {\n const log = false ? this.log.bindPrefix('perform-' + (Math.random() * 1000 | 0)) : undefined;\n log?.('start', this.chatInner.parentElement);\n\n let history = historyResult.history;\n history = history.slice(); // need\n\n if(this.needReflowScroll) {\n reflowScrollableElement(this.scrollable.container);\n this.needReflowScroll = false;\n }\n\n const cb = (message: Message.message | Message.messageService) => {\n if(!message) {\n return;\n } else if(message.pFlags.local) {\n return this.processLocalMessageRender(message);\n } else {\n return this.safeRenderMessage(message, reverse);\n }\n };\n\n const messages = await Promise.all(history.map((mid) => {\n return typeof(mid) === 'number' ? this.chat.getMessage(mid) : mid;\n }));\n\n const setLoadedPromises: Promise[] = [];\n if(!this.scrollable.loadedAll['bottom'] || !this.scrollable.loadedAll['top']) {\n let isEnd = (historyResult as HistoryResult).isEnd;\n if(!isEnd) {\n const historyStorage = await this.chat.getHistoryStorage();\n const firstSlice = historyStorage.history.first;\n const lastSlice = historyStorage.history.last;\n isEnd = {top: false, bottom: false, both: false};\n if(firstSlice.isEnd(SliceEnd.Bottom) && (!firstSlice.length || history.includes(firstSlice[0]))) {\n isEnd.bottom = true;\n }\n\n if(lastSlice.isEnd(SliceEnd.Top) && (!lastSlice.length || history.includes(lastSlice[lastSlice.length - 1]))) {\n isEnd.top = true;\n }\n }\n\n if(!isEnd.bottom && this.setPeerOptions) {\n const {lastMsgId, topMessage, savedPosition} = this.setPeerOptions;\n this.setPeerOptions = undefined;\n if((!lastMsgId && !savedPosition) || this.bubbles[topMessage] || lastMsgId === topMessage) {\n isEnd.bottom = true;\n }\n }\n\n if(isEnd.top) setLoadedPromises.push(this.setLoaded('top', true));\n if(isEnd.bottom) setLoadedPromises.push(this.setLoaded('bottom', true));\n }\n\n await Promise.all(setLoadedPromises);\n\n // ! it is important to insert bubbles to group reversed way\n // const length = history.length, promises: Promise[] = [];\n // if(reverse) for(let i = 0; i < length; ++i) promises.push(cb(messages[i]));\n // else for(let i = length - 1; i >= 0; --i) promises.push(cb(messages[i]));\n const promises = messages.map(cb);\n\n // cannot combine them into one promise\n await Promise.all(promises);\n await this.messagesQueuePromise;\n\n if(this.scrollable.loadedAll.top && this.messagesQueueOnRenderAdditional) {\n this.messagesQueueOnRenderAdditional();\n this.messagesQueueOnRenderAdditional?.(); // * can set it second time\n }\n\n log?.('performHistoryResult end');\n }\n\n private onRenderScrollSet(state?: {scrollHeight: number, clientHeight: number}) {\n const className = 'has-sticky-dates';\n if(!this.container.classList.contains(className)) {\n const isLoading = !this.preloader.detached;\n\n if(isLoading ||\n (\n state ??= {\n scrollHeight: this.scrollable.scrollHeight,\n clientHeight: this.scrollable.container.clientHeight\n },\n state.scrollHeight !== state.clientHeight\n )\n ) {\n /* for(const timestamp in this.dateMessages) {\n const dateMessage = this.dateMessages[timestamp];\n dateMessage.div.classList.add('is-sticky');\n } */\n\n const middleware = this.getMiddleware();\n const callback = () => {\n if(!middleware()) return;\n this.container.classList.add(className);\n };\n\n if(this.willScrollOnLoad) {\n callback();\n } else {\n setTimeout(callback, 600);\n }\n\n return;\n }\n }\n\n this.willScrollOnLoad = undefined;\n }\n\n public onDatePick = (timestamp: number) => {\n const peerId = this.peerId;\n this.managers.appMessagesManager.requestHistory(peerId, 0, 2, -1, timestamp, this.chat.threadId).then((history) => {\n if(!history?.messages?.length) {\n this.log.error('no history!');\n return;\n } else if(this.peerId !== peerId) {\n return;\n }\n\n this.chat.setMessageId((history.messages[0] as MyMessage).mid);\n // console.log('got history date:', history);\n });\n };\n\n public requestHistory(maxId: number, loadCount: number, backLimit: number) {\n // const middleware = this.getMiddleware();\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\n return this.managers.acknowledged.appMessagesManager.getHistory(this.peerId, maxId, loadCount, backLimit, this.chat.threadId);\n } else if(this.chat.type === 'pinned') {\n return this.managers.acknowledged.appMessagesManager.getSearch({\n peerId: this.peerId,\n inputFilter: {_: 'inputMessagesFilterPinned'},\n maxId,\n limit: loadCount,\n backLimit\n }).then((ackedResult) => {\n return {\n cached: ackedResult.cached,\n result: Promise.resolve(ackedResult.result).then((value) => {\n return {history: value.history.map((m) => m.mid)};\n })\n };\n });\n } else if(this.chat.type === 'scheduled') {\n return this.managers.acknowledged.appMessagesManager.getScheduledMessages(this.peerId).then((ackedResult) => {\n // this.setLoaded('top', true);\n // this.setLoaded('bottom', true);\n return {\n cached: ackedResult.cached,\n result: Promise.resolve(ackedResult.result).then((mids) => ({history: mids.slice().reverse()}))\n };\n });\n }\n }\n\n private async animateAsLadder(additionMsgId: number, additionMsgIds: number[], isAdditionRender: boolean, backLimit: number, maxId: number) {\n /* const middleware = this.getMiddleware();\n await this.ladderDeferred; */\n\n const log = this.log.bindPrefix('ladder');\n if(this.chat.setPeerPromise && !this.resolveLadderAnimation) {\n log.warn('will be delayed');\n // @ts-ignore\n this.resolveLadderAnimation = this.animateAsLadder.bind(this, additionMsgId, additionMsgIds, isAdditionRender, backLimit, maxId);\n return;\n }\n\n /* if(!middleware()) {\n return;\n } */\n\n if(!Object.keys(this.bubbles).length) {\n log.warn('no bubbles');\n return;\n }\n\n let sortedMids = getObjectKeysAndSort(this.bubbles, 'desc');\n\n if(isAdditionRender && additionMsgIds.length) {\n sortedMids = sortedMids.filter((mid) => !additionMsgIds.includes(mid));\n }\n\n let targetMid: number;\n if(backLimit) {\n targetMid = maxId || Math.max(...sortedMids); // * on discussion enter\n } else {\n if(additionMsgId) {\n targetMid = additionMsgId;\n } else { // * if maxId === 0\n targetMid = Math.max(...sortedMids);\n }\n }\n\n const topIds = sortedMids.slice(sortedMids.findIndex((mid) => targetMid > mid));\n const middleIds = isAdditionRender ? [] : [targetMid];\n const bottomIds = isAdditionRender ? [] : sortedMids.slice(0, sortedMids.findIndex((mid) => targetMid >= mid)).reverse();\n\n if(DEBUG) {\n log('targeting mid:', targetMid, maxId, additionMsgId,\n topIds.map((m) => getServerMessageId(m)),\n bottomIds.map((m) => getServerMessageId(m)));\n }\n\n const setBubbles: HTMLElement[] = [];\n\n this.chatInner.classList.add('zoom-fading');\n const delay = isAdditionRender ? 10 : 40;\n const offsetIndex = isAdditionRender ? 0 : 1;\n const animateAsLadder = (mids: number[], offsetIndex = 0) => {\n const animationPromise = deferredPromise();\n let lastMsDelay = 0;\n mids.forEach((mid, idx) => {\n const bubble = this.bubbles[mid];\n if(!bubble || this.skippedMids.has(mid)) {\n log.warn('no bubble by mid:', mid);\n return;\n }\n\n lastMsDelay = ((idx + offsetIndex) || 0.1) * delay;\n // lastMsDelay = (idx + offsetIndex) * delay;\n // lastMsDelay = (idx || 0.1) * 1000;\n\n const contentWrapper = bubble.lastElementChild as HTMLElement;\n const elementsToAnimate: HTMLElement[] = [contentWrapper];\n const item = this.bubbleGroups.getItemByBubble(bubble);\n if(item && item.group.avatar && item.group.lastItem === item) {\n elementsToAnimate.push(item.group.avatar);\n }\n\n elementsToAnimate.forEach((element) => {\n element.classList.add('zoom-fade', 'can-zoom-fade');\n element.style.transitionDelay = lastMsDelay + 'ms';\n });\n\n if(idx === (mids.length - 1)) {\n const onTransitionEnd = (e: TransitionEvent) => {\n if(e.target !== contentWrapper) {\n return;\n }\n\n animationPromise.resolve();\n contentWrapper.removeEventListener('transitionend', onTransitionEnd);\n };\n\n contentWrapper.addEventListener('transitionend', onTransitionEnd);\n }\n\n setBubbles.push(...elementsToAnimate);\n });\n\n if(!mids.length) {\n animationPromise.resolve();\n }\n\n return {lastMsDelay, animationPromise};\n };\n\n const topRes = animateAsLadder(topIds, offsetIndex);\n const middleRes = animateAsLadder(middleIds);\n const bottomRes = animateAsLadder(bottomIds, offsetIndex);\n const promises = [topRes.animationPromise, middleRes.animationPromise, bottomRes.animationPromise];\n const delays: number[] = [topRes.lastMsDelay, middleRes.lastMsDelay, bottomRes.lastMsDelay];\n\n if(this.onAnimateLadder) {\n await this.onAnimateLadder();\n }\n\n fastRaf(() => {\n this.setStickyDateManually(); // ! maybe it's not efficient\n\n setBubbles.forEach((element) => {\n element.classList.remove('zoom-fade');\n });\n });\n\n let promise: Promise;\n if(topIds.length || middleIds.length || bottomIds.length) {\n promise = Promise.all(promises);\n\n dispatchHeavyAnimationEvent(promise, Math.max(...delays) + 200) // * 200 - transition time\n .then(() => {\n fastRaf(() => {\n setBubbles.forEach((element) => {\n element.style.transitionDelay = '';\n element.classList.remove('can-zoom-fade');\n });\n\n this.chatInner.classList.remove('zoom-fading');\n });\n\n // ! ะฒ ั…ั€ะพะผะต, ะบะฐะบะธะผ-ั‚ะพ ะพะฑั€ะฐะทะพะผ ะธะท-ะทะฐ zoom-fade ะบะปะฐััะฐ ะฝะฐั‡ะธะฝะฐะตั‚ ะฟั€ั‹ะณะฐั‚ัŒ ัะบั€ะพะปะป ะฟั€ะธ ะฟะพะดะณั€ัƒะทะบะต ัะพะพะฑั‰ะตะฝะธะน ะฒะฒะตั€ั…,\n // ! ั‚.ะต. ัะบั€ะพะปะป ะฝะต ัั‚ะฐะฒะธั‚ัั, ั‚ะฐะบ ะถะต, ะบะฐะบ ะฒ ัะฐั„ะฐั€ะธ ะฟั€ะธ translateZ ะฝะฐ ะฑะปะพะบ ะฒั‹ัˆะต scrollable\n // if(!IS_SAFARI) {\n // this.needReflowScroll = true;\n // }\n });\n }\n\n return promise;\n }\n\n private async renderEmptyPlaceholder(\n type: 'group' | 'saved' | 'noMessages' | 'noScheduledMessages' | 'greeting' | 'restricted',\n bubble: HTMLElement,\n message: any,\n elements: (Node | string)[]\n ) {\n const BASE_CLASS = 'empty-bubble-placeholder';\n bubble.classList.add(BASE_CLASS, BASE_CLASS + '-' + type);\n\n let title: HTMLElement;\n if(type === 'group') title = i18n('GroupEmptyTitle1');\n else if(type === 'saved') title = i18n('ChatYourSelfTitle');\n else if(type === 'noMessages' || type === 'greeting') title = i18n('NoMessages');\n else if(type === 'noScheduledMessages') title = i18n('NoScheduledMessages');\n else if(type === 'restricted') {\n title = document.createElement('span');\n title.innerText = await this.managers.appPeersManager.getRestrictionReasonText(this.peerId);\n }\n title.classList.add('center', BASE_CLASS + '-title');\n\n elements.push(title);\n\n let listElements: HTMLElement[];\n if(type === 'group') {\n elements.push(i18n('GroupEmptyTitle2'));\n listElements = [\n i18n('GroupDescription1'),\n i18n('GroupDescription2'),\n i18n('GroupDescription3'),\n i18n('GroupDescription4')\n ];\n } else if(type === 'saved') {\n listElements = [\n i18n('ChatYourSelfDescription1'),\n i18n('ChatYourSelfDescription2'),\n i18n('ChatYourSelfDescription3'),\n i18n('ChatYourSelfDescription4')\n ];\n } else if(type === 'greeting') {\n const subtitle = i18n('NoMessagesGreetingsDescription');\n subtitle.classList.add('center', BASE_CLASS + '-subtitle');\n\n // findAndSplice(this.messagesQueue, q => q.bubble === bubble);\n\n const stickerDiv = document.createElement('div');\n stickerDiv.classList.add(BASE_CLASS + '-sticker');\n\n const middleware = this.getMiddleware();\n\n await this.managers.appStickersManager.getGreetingSticker().then(async(doc) => {\n if(!middleware()) return;\n\n const loadPromises: Promise[] = [];\n await wrapSticker({\n doc,\n // doc: appDocsManager.getDoc(\"5431607541660389336\"), // cubigator mockup\n div: stickerDiv,\n middleware,\n lazyLoadQueue: this.lazyLoadQueue,\n group: this.chat.animationGroup,\n // play: !!message.pending || !multipleRender,\n play: true,\n loop: true,\n withThumb: true,\n loadPromises\n });\n\n attachClickEvent(stickerDiv, (e) => {\n cancelEvent(e);\n EmoticonsDropdown.onMediaClick({target: e.target});\n });\n\n return Promise.all(loadPromises);\n });\n\n // this.renderMessagesQueue({\n // message,\n // bubble,\n // reverse: false,\n // promises: [loadPromise]\n // });\n\n elements.push(subtitle, stickerDiv);\n }\n\n if(listElements) {\n elements.push(\n ...listElements.map((elem) => {\n const span = document.createElement('span');\n span.classList.add(BASE_CLASS + '-list-item');\n span.append(elem);\n return span;\n })\n );\n\n if(type === 'group') {\n listElements.forEach((elem) => {\n const i = document.createElement('span');\n i.classList.add('tgico-check');\n elem.prepend(i);\n });\n } else if(type === 'saved') {\n listElements.forEach((elem) => {\n const i = document.createElement('span');\n i.classList.add(BASE_CLASS + '-list-bullet');\n i.innerText = 'โ€ข';\n elem.prepend(i);\n });\n }\n }\n\n if(elements.length > 1) {\n bubble.classList.add('has-description');\n }\n\n elements.forEach((element: any) => element.classList.add(BASE_CLASS + '-line'));\n }\n\n private async processLocalMessageRender(\n message: Message.message | Message.messageService,\n animate?: boolean,\n middleware = this.getMiddleware()\n ) {\n const isSponsored = !!(message as Message.message).pFlags.sponsored;\n const m = middlewarePromise(middleware);\n\n const p: Parameters[4] = async(result) => {\n const {bubble} = await m(result);\n if(!bubble) {\n return result;\n }\n\n (bubble as any).message = message;\n\n bubble.classList.add('is-group-last', 'is-group-first');\n\n const updatePosition = () => {\n if(this.updatePlaceholderPosition === updatePosition) {\n this.updatePlaceholderPosition = undefined;\n }\n\n appendTo[method](bubble);\n };\n\n if(!isSponsored) {\n bubble.classList.add('bubble-first');\n bubble.classList.remove('can-have-tail', 'is-in');\n }\n\n const elements: (Node | string)[] = [];\n const isBot = this.chat.isBot;\n let renderPromise: Promise, appendTo = this.container, method: 'append' | 'prepend' = 'append';\n if(this.chat.isRestricted) {\n renderPromise = this.renderEmptyPlaceholder('restricted', bubble, message, elements);\n } else if(isSponsored) {\n let text: LangPackKey, mid: number, startParam: string, callback: () => void;\n\n bubble.classList.add('avoid-selection');\n bubble.style.order = '999999';\n\n const sponsoredMessage = this.sponsoredMessage = (message as Message.message).sponsoredMessage;\n const peerId = getPeerId(sponsoredMessage.from_id);\n // const peer = this.appPeersManager.getPeer(peerId);\n if(sponsoredMessage.channel_post) {\n text = 'OpenChannelPost';\n mid = generateMessageId(sponsoredMessage.channel_post);\n } else if(sponsoredMessage.start_param || isBot) {\n text = 'Chat.Message.ViewBot';\n startParam = sponsoredMessage.start_param;\n } else {\n text = await this.managers.appPeersManager.isAnyGroup(peerId) ? 'Chat.Message.ViewGroup' : 'Chat.Message.ViewChannel';\n }\n\n if(sponsoredMessage.chat_invite) {\n callback = () => {\n new PopupJoinChatInvite(sponsoredMessage.chat_invite_hash, sponsoredMessage.chat_invite as ChatInvite.chatInvite);\n };\n } else if(sponsoredMessage.chat_invite_hash) {\n callback = () => {\n const link: InternalLink = {\n _: INTERNAL_LINK_TYPE.JOIN_CHAT,\n invite: sponsoredMessage.chat_invite_hash\n };\n\n this.chat.appImManager.processInternalLink(link);\n };\n } else {\n callback = () => {\n this.chat.appImManager.setInnerPeer({\n peerId,\n lastMsgId: mid,\n startParam\n });\n };\n }\n\n const button = this.makeViewButton({text});\n\n this.observer.observe(button, this.viewsObserverCallback);\n\n if(callback) {\n attachClickEvent(button, callback);\n }\n\n bubble.querySelector('.bubble-content').prepend(button);\n\n appendTo = this.chatInner;\n method = 'append';\n animate = false;\n\n // return result;\n } else if(isBot && message._ === 'message') {\n const b = document.createElement('b');\n b.append(i18n('BotInfoTitle'));\n elements.push(b, '\\n\\n');\n appendTo = this.chatInner;\n method = 'prepend';\n } else if(this.chat.isAnyGroup && ((await m(this.managers.appPeersManager.getPeer(this.peerId))) as MTChat.chat).pFlags.creator) {\n renderPromise = this.renderEmptyPlaceholder('group', bubble, message, elements);\n } else if(this.chat.type === 'scheduled') {\n renderPromise = this.renderEmptyPlaceholder('noScheduledMessages', bubble, message, elements);\n } else if(rootScope.myId === this.peerId) {\n renderPromise = this.renderEmptyPlaceholder('saved', bubble, message, elements);\n } else if(this.peerId.isUser() && !isBot && await m(this.chat.canSend()) && this.chat.type === 'chat') {\n renderPromise = this.renderEmptyPlaceholder('greeting', bubble, message, elements);\n } else {\n renderPromise = this.renderEmptyPlaceholder('noMessages', bubble, message, elements);\n }\n\n if(renderPromise) {\n await renderPromise;\n }\n\n if(elements.length) {\n const messageDiv = bubble.querySelector('.message, .service-msg');\n messageDiv.prepend(...elements);\n }\n\n const isWaitingForAnimation = !!this.messagesQueueOnRenderAdditional;\n const noTransition = this.setPeerCached && !isWaitingForAnimation;\n if(noTransition) {\n const setOn = bubble.firstElementChild;\n setOn.classList.add('no-transition');\n\n if(this.chat.setPeerPromise) {\n this.chat.setPeerPromise.catch(noop).finally(() => {\n setOn.classList.remove('no-transition');\n });\n }\n }\n\n if(animate === undefined && !noTransition) {\n animate = true;\n }\n\n if(isWaitingForAnimation || animate) {\n this.updatePlaceholderPosition = updatePosition;\n\n this.onAnimateLadder = () => {\n // appendTo[method](bubble);\n this.onAnimateLadder = undefined;\n\n // need raf here because animation won't fire if this message is single\n if(!this.messagesQueuePromise) {\n return fastRafPromise();\n }\n };\n } else if(this.chat.setPeerPromise) {\n this.attachPlaceholderOnRender = () => {\n this.attachPlaceholderOnRender = undefined;\n updatePosition();\n // appendTo[method](bubble);\n };\n } else {\n this.updatePlaceholderPosition = updatePosition;\n // appendTo[method](bubble);\n }\n\n if(!isWaitingForAnimation && animate) {\n await m(getHeavyAnimationPromise());\n const additionMsgIds = getObjectKeysAndSort(this.bubbles);\n indexOfAndSplice(additionMsgIds, message.mid);\n this.animateAsLadder(message.mid, additionMsgIds, false, 0, 0);\n }\n\n bubble.middlewareHelper.onDestroy(() => {\n if(this.emptyPlaceholderBubble === bubble) {\n this.emptyPlaceholderBubble = undefined;\n }\n });\n\n this.emptyPlaceholderBubble = bubble;\n\n return result;\n };\n\n return this.safeRenderMessage(\n message,\n !isSponsored,\n undefined,\n false,\n p\n );\n }\n\n private makeViewButton[1]>(options: T) {\n return Button('btn-primary btn-primary-transparent bubble-view-button', options);\n }\n\n private generateLocalMessageId(addOffset = 0) {\n // const INCREMENT = 0x10;\n const offset = (this.chat.type === 'scheduled' ? -1 : 0) + addOffset;\n // offset = generateMessageId(offset);\n // id: -Math.abs(+this.peerId * INCREMENT + offset),\n const id = -Math.abs(offset);\n const mid = -Math.abs(generateMessageId(id));\n return {id, mid};\n }\n\n private async generateLocalFirstMessage(service?: T, fill?: (message: GenerateLocalMessageType) => void, addOffset = 0): Promise> {\n const {id, mid} = this.generateLocalMessageId(addOffset);\n let message: Omit & {message?: string} = {\n _: service ? 'messageService' : 'message',\n date: 0,\n id,\n mid,\n peer_id: await this.managers.appPeersManager.getOutputPeer(this.peerId),\n pFlags: {\n local: true\n }\n };\n\n if(!service) {\n message.message = '';\n }/* else {\n (message as Message.messageService).action = {} as any;\n } */\n\n assumeType>(message);\n\n fill && fill(message);\n\n const savedMessages = await this.managers.appMessagesManager.saveMessages([message], {storage: new Map() as any});\n message = savedMessages[0];\n message.mid = mid;\n return message as any;\n }\n\n public getViewportSlice() {\n // this.log.trace('viewport slice');\n return getViewportSlice({\n overflowElement: this.scrollable.container,\n selector: '.bubbles-date-group .bubble:not(.is-date)',\n extraSize: Math.max(700, windowSize.height) * 2\n });\n }\n\n public deleteViewportSlice(slice: ReturnType, ignoreScrollSaving?: boolean) {\n if(DO_NOT_SLICE_VIEWPORT_ON_RENDER) {\n return;\n }\n\n const {invisibleTop, invisibleBottom} = slice;\n const invisible = invisibleTop.concat(invisibleBottom);\n if(!invisible.length) {\n return;\n }\n\n if(invisibleTop.length) {\n this.setLoaded('top', false);\n this.getHistoryTopPromise = undefined;\n }\n\n if(invisibleBottom.length) {\n this.setLoaded('bottom', false);\n this.getHistoryBottomPromise = undefined;\n }\n\n const mids = invisible.map(({element}) => +element.dataset.mid);\n\n let scrollSaver: ScrollSaver;\n if(/* !!invisibleTop.length !== !!invisibleBottom.length && */!ignoreScrollSaving) {\n scrollSaver = this.createScrollSaver(!!invisibleTop.length);\n scrollSaver.save();\n }\n\n this.deleteMessagesByIds(mids, false, true);\n\n if(scrollSaver) {\n scrollSaver.restore();\n } else if(invisibleTop.length) {\n this.scrollable.lastScrollPosition = this.scrollable.scrollTop;\n }\n }\n\n public sliceViewport(ignoreHeavyAnimation?: boolean) {\n // Safari cannot reset the scroll.\n if(IS_SAFARI || (this.isHeavyAnimationInProgress && !ignoreHeavyAnimation) || DO_NOT_SLICE_VIEWPORT) {\n return;\n }\n\n // const scrollSaver = new ScrollSaver(this.scrollable, true);\n // scrollSaver.save();\n const slice = this.getViewportSlice();\n // if(IS_SAFARI) slice.invisibleTop = [];\n this.deleteViewportSlice(slice);\n // scrollSaver.restore();\n }\n\n private async setLoaded(side: SliceSides, value: boolean, checkPlaceholders = true) {\n const willChange = this.scrollable.loadedAll[side] !== value;\n if(!willChange) {\n return;\n }\n\n const log = this.log.bindPrefix('setLoaded');\n log('change', side, value);\n\n this.scrollable.loadedAll[side] = value;\n this.scrollable.onScroll(); // ! WARNING\n // return;\n\n if(!checkPlaceholders) {\n return;\n }\n\n if(!this.chat.isRestricted) {\n if(side === 'bottom' && this.chat.isBroadcast/* && false */) {\n this.toggleSponsoredMessage(value);\n }\n\n if(side === 'top' && value && this.chat.isBot) {\n return this.renderBotPlaceholder();\n }\n }\n\n return this.checkIfEmptyPlaceholderNeeded();\n }\n\n private async toggleSponsoredMessage(value: boolean) {\n const log = this.log.bindPrefix('sponsored');\n log('checking');\n const {mid} = this.generateLocalMessageId(SPONSORED_MESSAGE_ID_OFFSET);\n if(value) {\n const middleware = this.getMiddleware(() => {\n return this.scrollable.loadedAll.bottom && this.getSponsoredMessagePromise === promise;\n });\n\n const promise = this.getSponsoredMessagePromise = this.managers.appChatsManager.getSponsoredMessage(this.peerId.toChatId())\n .then(async(sponsoredMessages) => {\n if(!middleware() || sponsoredMessages._ === 'messages.sponsoredMessagesEmpty') {\n return;\n }\n\n const sponsoredMessage = sponsoredMessages.messages[0];\n if(!sponsoredMessage) {\n log('no message');\n return;\n }\n\n const messagePromise = this.generateLocalFirstMessage(false, (message) => {\n message.message = sponsoredMessage.message;\n message.from_id = sponsoredMessage.from_id;\n message.entities = sponsoredMessage.entities;\n message.pFlags.sponsored = true;\n message.sponsoredMessage = sponsoredMessage;\n }, SPONSORED_MESSAGE_ID_OFFSET);\n\n return Promise.all([\n messagePromise,\n this.getHistoryTopPromise, // wait for top load and execute rendering after or with it\n this.messagesQueuePromise\n ]).then(([message]) => {\n if(!middleware()) return;\n // this.processLocalMessageRender(message);\n log('rendering', message);\n return this.performHistoryResult({history: [message]}, false);\n });\n }).finally(() => {\n if(this.getSponsoredMessagePromise === promise) {\n this.getSponsoredMessagePromise = undefined;\n }\n });\n } else {\n log('clearing rendered', mid);\n this.getSponsoredMessagePromise = undefined;\n this.deleteMessagesByIds([mid]);\n }\n }\n\n private async renderBotPlaceholder() {\n const _log = this.log.bindPrefix('bot placeholder');\n\n const middleware = this.getMiddleware();\n const result = await this.managers.acknowledged.appProfileManager.getProfile(this.peerId.toUserId());\n _log('getting profile, cached:', result.cached);\n const processPromise = result.result.then(async(userFull) => {\n if(!middleware()) {\n return;\n }\n\n if(!userFull.bot_info?.description) {\n _log.warn('no description');\n return this.checkIfEmptyPlaceholderNeeded();\n }\n\n const message = await this.generateLocalFirstMessage(false, (message) => {\n const botInfo = userFull.bot_info;\n message.message = botInfo.description;\n if(botInfo.description_document) message.media = {_: 'messageMediaDocument', document: botInfo.description_document, pFlags: {}};\n if(botInfo.description_photo) message.media = {_: 'messageMediaPhoto', photo: botInfo.description_photo, pFlags: {}};\n });\n\n if(!middleware()) {\n return;\n }\n\n _log('rendering');\n const renderPromise = this.processLocalMessageRender(message, !result.cached).then(() => {\n _log('done');\n });\n\n return {renderPromise};\n });\n\n if(!result.cached) {\n return;\n }\n\n return processPromise;\n }\n\n public async checkIfEmptyPlaceholderNeeded() {\n if(this.scrollable.loadedAll.top &&\n this.scrollable.loadedAll.bottom &&\n this.emptyPlaceholderBubble === undefined &&\n (\n this.chat.isRestricted ||\n !(await this.chat.getHistoryStorage()).count ||\n (\n // !Object.keys(this.bubbles).length ||\n // ! WARNING ! ! ! ! ! ! REPLACE LINE ABOVE WITH THESE\n Object.keys(this.bubbles).length &&\n !this.getRenderedLength()\n ) ||\n (this.chat.type === 'scheduled' && !Object.keys(this.bubbles).length)\n )\n ) {\n this.log('inject empty peer placeholder');\n\n const message = await this.generateLocalFirstMessage(true);\n return {renderPromise: this.processLocalMessageRender(message)};\n }\n }\n\n public getHistory1(maxId?: number, reverse?: boolean, isBackLimit?: boolean, additionMsgId?: number, justLoad?: boolean) {\n const middleware = this.getMiddleware(justLoad ? undefined : () => {\n return (reverse ? this.getHistoryTopPromise : this.getHistoryBottomPromise) === waitPromise;\n });\n\n const result = this.getHistory(maxId, reverse, isBackLimit, additionMsgId, justLoad, middleware);\n const waitPromise = result.then((res) => res && (res.waitPromise || res.promise));\n\n (reverse ? this.getHistoryTopPromise = waitPromise : this.getHistoryBottomPromise = waitPromise);\n waitPromise.then(() => {\n if(!middleware()) {\n return;\n }\n\n (reverse ? this.getHistoryTopPromise = undefined : this.getHistoryBottomPromise = undefined);\n\n if(!justLoad) {\n // preload more\n // if(!isFirstMessageRender) {\n if(this.chat.type === 'chat'/* || this.chat.type === 'discussion' */) {\n /* const storage = this.appMessagesManager.getHistoryStorage(peerId, this.chat.threadId);\n const isMaxIdInHistory = storage.history.indexOf(maxId) !== -1;\n if(isMaxIdInHistory || true) { // * otherwise it is a search or jump */\n setTimeout(() => {\n if(reverse) {\n this.loadMoreHistory(true, true);\n } else {\n this.loadMoreHistory(false, true);\n }\n }, 0);\n // }\n }\n // }\n\n // this.scrollable.onScroll();\n }\n });\n\n return result;\n }\n\n /**\n * Load and render history\n * @param maxId max message id\n * @param reverse 'true' means up\n * @param isBackLimit is search\n * @param additionMsgId for the last message\n * @param justLoad do not render\n */\n public async getHistory(\n maxId = 0,\n reverse = false,\n isBackLimit = false,\n additionMsgId = 0,\n justLoad = false,\n middleware?: () => boolean\n ): Promise<{cached: boolean, promise: Promise, waitPromise: Promise}> {\n const peerId = this.peerId;\n\n const isBroadcast = this.chat.isBroadcast;\n // console.time('appImManager call getHistory');\n const pageCount = Math.min(30, windowSize.height / 40/* * 1.25 */ | 0);\n // const loadCount = Object.keys(this.bubbles).length > 0 ? 50 : pageCount;\n const realLoadCount = isBroadcast ? 20 : (Object.keys(this.bubbles).length > 0 ? Math.max(35, pageCount) : pageCount);\n // const realLoadCount = pageCount;//const realLoadCount = 50;\n let loadCount = realLoadCount;\n\n /* if(TEST_SCROLL) {\n //loadCount = 1;\n if(Object.keys(this.bubbles).length > 0)\n return {cached: false, promise: Promise.resolve(true)};\n } */\n if(TEST_SCROLL !== undefined) {\n if(TEST_SCROLL) {\n if(Object.keys(this.bubbles).length > 0) {\n --TEST_SCROLL;\n }\n } else {\n return {cached: false, promise: Promise.resolve(), waitPromise: Promise.resolve()};\n }\n }\n\n // //console.time('render history total');\n\n let backLimit = 0;\n if(isBackLimit) {\n backLimit = loadCount;\n\n if(!reverse) { // if not jump\n loadCount = 0;\n // maxId = this.appMessagesManager.incrementMessageId(maxId, 1);\n }\n }\n\n let additionMsgIds: number[];\n if(additionMsgId && !isBackLimit) {\n if(this.chat.type === 'pinned') {\n additionMsgIds = [additionMsgId];\n } else {\n const historyStorage = await this.chat.getHistoryStorage();\n const slice = historyStorage.history.slice;\n if(slice.length < loadCount && !slice.isEnd(SliceEnd.Both)) {\n additionMsgIds = slice.slice();\n\n // * filter last album, because we don't know is it the last item\n for(let i = additionMsgIds.length - 1; i >= 0; --i) {\n const message = await this.chat.getMessage(additionMsgIds[i]);\n if((message as Message.message)?.grouped_id) additionMsgIds.splice(i, 1);\n else break;\n }\n\n maxId = additionMsgIds[additionMsgIds.length - 1] || maxId;\n }\n }\n }\n\n /* const result = additionMsgID ?\n {history: [additionMsgID]} :\n appMessagesManager.getHistory(this.peerId, maxId, loadCount, backLimit); */\n let result: AckedResult = await this.requestHistory(maxId, loadCount, backLimit) as any;\n let resultPromise: typeof result['result'];\n\n this.log('i vin brehnya', result, maxId, loadCount, backLimit);\n\n // const isFirstMessageRender = !!additionMsgID && result.cached && !appMessagesManager.getMessage(additionMsgID).grouped_id;\n const isAdditionRender = additionMsgIds?.length && !result.cached;\n const isFirstMessageRender = (this.isFirstLoad && backLimit && !result.cached) || isAdditionRender;\n if(isAdditionRender) {\n resultPromise = result.result;\n\n result = {\n cached: true,\n result: Promise.resolve({history: additionMsgIds})\n };\n\n // additionMsgID = 0;\n }\n\n this.isFirstLoad = false;\n\n const processResult = async(historyResult: Awaited) => {\n if((historyResult as HistoryResult).isEnd?.top) {\n if(this.chat.type === 'discussion') { // * inject discussion start\n const serviceStartMessageId = await this.managers.appMessagesManager.getThreadServiceMessageId(this.peerId, this.chat.threadId);\n if(serviceStartMessageId) historyResult.history.push(serviceStartMessageId);\n const mids = await this.chat.getMidsByMid(this.chat.threadId);\n historyResult.history.push(...mids.reverse());\n }\n\n // synchronize bot placeholder appearance\n await this.managers.appProfileManager.getProfileByPeerId(peerId);\n\n // await this.setLoaded('top', true);\n }\n };\n\n const sup = (historyResult: Awaited) => {\n return getHeavyAnimationPromise().then(() => {\n return processResult(historyResult);\n }).then(() => {\n if(!isAdditionRender && additionMsgId) {\n historyResult.history.unshift(additionMsgId);\n }\n\n return this.performHistoryResult(historyResult, reverse);\n });\n };\n\n const processPromise = (_promise: typeof result['result']) => {\n const promise = Promise.resolve(_promise).then((result) => {\n if(middleware && !middleware()) {\n throw PEER_CHANGED_ERROR;\n }\n\n if(justLoad) {\n // ะฝัƒะถะฝะพ ะดะตะปะฐั‚ัŒ ะธะท-ะทะฐ ั€ะฐะฝะฝะตะน ะฟั€ะพะณั€ัƒะทะบะธ\n this.scrollable.onScroll();\n // fastRaf(() => {\n // this.scrollable.checkForTriggers();\n // });\n return;\n }\n\n return sup(result);\n }, (err) => {\n this.log.error('getHistory error:', err);\n throw err;\n });\n\n return promise;\n };\n\n let promise: Promise, cached: boolean;\n if(!result.cached) {\n cached = false;\n promise = processPromise(result.result);\n } else if(justLoad) {\n // ะฝัƒะถะฝะพ ะดะตะปะฐั‚ัŒ ะธะท-ะทะฐ ั€ะฐะฝะฝะตะน ะฟั€ะพะณั€ัƒะทะบะธ\n this.scrollable.onScroll();\n return null;\n } else {\n cached = true;\n promise = sup(await result.result);\n }\n\n const waitPromise = isAdditionRender ? processPromise(resultPromise) : promise;\n\n if(isFirstMessageRender && rootScope.settings.animationsEnabled/* && false */) {\n let times = isAdditionRender ? 2 : 1;\n this.messagesQueueOnRenderAdditional = () => {\n this.log('messagesQueueOnRenderAdditional');\n\n if(--times) return;\n\n this.messagesQueueOnRenderAdditional = undefined;\n\n const promise = this.animateAsLadder(additionMsgId, additionMsgIds, isAdditionRender, backLimit, maxId);\n promise.then(() => {\n setTimeout(() => { // preload messages\n this.loadMoreHistory(reverse, true);\n }, 0);\n });\n };\n } else {\n this.messagesQueueOnRenderAdditional = undefined;\n }\n\n if(justLoad) {\n return null;\n }\n\n return {cached, promise, waitPromise};\n }\n\n public async setUnreadDelimiter() {\n if(!(this.chat.type === 'chat' || this.chat.type === 'discussion')) {\n return;\n }\n\n if(this.attachedUnreadBubble) {\n return;\n }\n\n const historyMaxId = await this.chat.getHistoryMaxId();\n let readMaxId = await this.managers.appMessagesManager.getReadMaxIdIfUnread(this.peerId, this.chat.threadId);\n if(!readMaxId) return;\n\n readMaxId = Object.keys(this.bubbles)\n .filter((mid) => !this.bubbles[mid].classList.contains('is-out'))\n .map((i) => +i)\n .sort((a, b) => a - b)\n .find((i) => i > readMaxId);\n\n if(readMaxId && this.bubbles[readMaxId]) {\n const bubble = this.bubbles[readMaxId];\n if(this.firstUnreadBubble && this.firstUnreadBubble !== bubble) {\n this.firstUnreadBubble.classList.remove('is-first-unread');\n this.firstUnreadBubble = null;\n }\n\n if(readMaxId !== historyMaxId) {\n bubble.classList.add('is-first-unread');\n }\n\n this.firstUnreadBubble = bubble;\n this.attachedUnreadBubble = true;\n }\n }\n\n public deleteEmptyDateGroups() {\n const mustBeCount = this.stickyIntersector ? STICKY_OFFSET : 1;\n let deleted = false;\n for(const i in this.dateMessages) {\n const dateMessage = this.dateMessages[i];\n\n if(dateMessage.container.childElementCount === mustBeCount) { // only date div + sentinel div\n dateMessage.container.remove();\n if(this.stickyIntersector) {\n this.stickyIntersector.unobserve(dateMessage.container, dateMessage.div);\n }\n delete this.dateMessages[i];\n deleted = true;\n\n // * no sense in it\n /* if(dateMessage.div === this.previousStickyDate) {\n this.previousStickyDate = undefined;\n } */\n }\n }\n\n if(!deleted) {\n return;\n }\n\n if(!Object.keys(this.dateMessages).length) {\n this.container.classList.remove('has-groups');\n }\n\n this.checkIfEmptyPlaceholderNeeded();\n this.setStickyDateManually();\n }\n}\n\nexport function generateTail() {\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttributeNS(null, 'viewBox', '0 0 11 20');\n svg.setAttributeNS(null, 'width', '11');\n svg.setAttributeNS(null, 'height', '20');\n svg.classList.add('bubble-tail');\n\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use.setAttributeNS(null, 'href', '#message-tail-filled');\n\n svg.append(use);\n\n return svg;\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 {copyTextToClipboard} from '../clipboard';\n// import SelectionSaver from \"../selectionSaver\";\n// import selectElementContents from \"./selectElementContents\";\n\nexport default function copyFromElement(element: HTMLElement) {\n copyTextToClipboard(element.textContent);\n // const saver = new SelectionSaver();\n // saver.save();\n // selectElementContents(element);\n // document.execCommand('copy');\n // saver.restore();\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 {MediaSizeType} from '../../helpers/mediaSizes';\nimport {Message} from '../../layer';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {MediaSearchContext} from '../appMediaPlaybackController';\nimport Chat from '../chat/chat';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport wrapDocument from './document';\n\nexport default async function wrapGroupedDocuments({albumMustBeRenderedFull, message, bubble, messageDiv, chat, loadPromises, autoDownloadSize, lazyLoadQueue, searchContext, useSearch, sizeType, managers, fontWeight, fontSize, richTextFragment}: {\n albumMustBeRenderedFull: boolean,\n message: any,\n messageDiv: HTMLElement,\n bubble: HTMLElement,\n uploading?: boolean,\n chat: Chat,\n loadPromises?: Promise[],\n autoDownloadSize?: number,\n lazyLoadQueue?: LazyLoadQueue,\n searchContext?: MediaSearchContext,\n useSearch?: boolean,\n sizeType?: MediaSizeType,\n managers?: AppManagers,\n fontWeight?: number,\n fontSize?: number,\n richTextFragment?: DocumentFragment\n}) {\n let nameContainer: HTMLElement;\n const mids = albumMustBeRenderedFull ? await chat.getMidsByMid(message.mid) : [message.mid];\n /* if(isPending) {\n mids.reverse();\n } */\n\n const promises = mids.map(async(mid, idx) => {\n const message = (await chat.getMessage(mid)) as Message.message;\n const div = await wrapDocument({\n message,\n loadPromises,\n autoDownloadSize,\n lazyLoadQueue,\n searchContext,\n sizeType,\n managers,\n fontWeight,\n fontSize\n });\n\n const container = document.createElement('div');\n container.classList.add('document-container');\n container.dataset.mid = '' + mid;\n container.dataset.peerId = '' + message.peerId;\n\n const wrapper = document.createElement('div');\n wrapper.classList.add('document-wrapper');\n\n if(message.message) {\n const messageDiv = document.createElement('div');\n messageDiv.classList.add('document-message');\n\n setInnerHTML(messageDiv, richTextFragment);\n wrapper.append(messageDiv);\n }\n\n if(mids.length > 1) {\n const selection = document.createElement('div');\n selection.classList.add('document-selection');\n container.append(selection);\n\n container.classList.add('grouped-item');\n\n if(idx === 0) {\n nameContainer = wrapper;\n }\n }\n\n wrapper.append(div);\n container.append(wrapper);\n return container;\n });\n\n const containers = await Promise.all(promises);\n messageDiv.append(...containers);\n\n if(mids.length > 1) {\n bubble.classList.add('is-multiple-documents', 'is-grouped');\n }\n\n return nameContainer;\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 {AppManagers} from '../../lib/appManagers/managers';\nimport rootScope from '../../lib/rootScope';\nimport PollElement from '../poll';\n\nexport default function wrapPoll(message: any, managers: AppManagers = rootScope.managers) {\n const elem = new PollElement();\n elem.message = message;\n elem.managers = managers;\n elem.setAttribute('peer-id', '' + message.peerId);\n elem.setAttribute('poll-id', message.media.poll.id);\n elem.setAttribute('message-id', '' + message.mid);\n elem.render();\n return elem;\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, {addCancelButton} from '.';\nimport PopupPeer, {PopupPeerButtonCallbackCheckboxes, PopupPeerOptions} from './peer';\nimport rootScope from '../../lib/rootScope';\nimport {FormatterArguments, LangPackKey} from '../../lib/langPack';\nimport wrapPeerTitle from '../wrappers/peerTitle';\n\nexport default class PopupPinMessage {\n constructor(private peerId: PeerId, private mid: number, private unpin?: true, private onConfirm?: () => void) {\n this.construct();\n }\n\n private async construct() {\n const {peerId, mid, unpin, onConfirm} = this;\n let title: LangPackKey, description: LangPackKey, descriptionArgs: FormatterArguments;\n const buttons: PopupPeerOptions['buttons'] = [], checkboxes: PopupPeerOptions['checkboxes'] = [];\n\n const managers = PopupElement.MANAGERS;\n\n const canUnpin = await managers.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 = managers.appMessagesManager.unpinAllMessages(peerId);\n } else {\n promise = managers.appMessagesManager.hidePinnedMessages(peerId);\n }\n } else {\n promise = managers.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 = ['' + ((await managers.appMessagesManager.getPinnedMessagesCount(peerId)) || 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(await managers.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: [await wrapPeerTitle({peerId})],\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","/*\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 isSelectionEmpty(selection = window.getSelection()) {\n if(!selection?.rangeCount) {\n return true;\n }\n\n const selectionRange = selection.getRangeAt(0);\n if(selectionRange.collapsed || !selectionRange.START_TO_END) {\n return true;\n }\n\n return false;\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 appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport lottieLoader from '../lib/rlottie/lottieLoader';\nimport rootScope from '../lib/rootScope';\nimport {getEmojiToneIndex} from '../vendor/emoji';\nimport mediaSizes from './mediaSizes';\nimport {saveLottiePreview} from './saveLottiePreview';\n\nexport default function preloadAnimatedEmojiSticker(emoji: string, width?: number, height?: number) {\n return rootScope.managers.appStickersManager.preloadAnimatedEmojiSticker(emoji).then(({doc}) => {\n if(!doc) {\n return;\n }\n\n return appDownloadManager.downloadMedia({media: doc})\n .then(async(blob) => {\n const mediaSize = mediaSizes.active.emojiSticker;\n const toneIndex = getEmojiToneIndex(emoji);\n const animation = await lottieLoader.loadAnimationWorker({\n container: undefined,\n animationData: blob,\n width: width ?? mediaSize.width,\n height: height ?? mediaSize.height,\n name: 'doc' + doc.id,\n autoplay: false,\n loop: false,\n toneIndex,\n group: 'none'\n });\n\n animation.addEventListener('firstFrame', () => {\n saveLottiePreview(doc, animation.canvas[0], toneIndex);\n animation.remove();\n }, {once: true});\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 {ReportReason} from '../../layer';\nimport InputField from '../inputField';\nimport {toastNew} from '../toast';\nimport wrapStickerEmoji from '../wrappers/stickerEmoji';\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 this.managers.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 size = 100;\n wrapStickerEmoji({\n div,\n emoji: PopupReportMessagesConfirm.STICKER_EMOJI,\n width: size,\n height: size\n }).then(({render}) => render).finally(() => {\n this.show();\n });\n\n this.header.replaceWith(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 preloadAnimatedEmojiSticker from '../../helpers/preloadAnimatedEmojiSticker';\nimport {ReportReason} from '../../layer';\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 ['ReportChatPersonalDetails', 'inputReportReasonPersonalDetails'],\n ['ReportChatIllegalDrugs', 'inputReportReasonIllegalDrugs']\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 = 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 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 scrollable: true\n });\n\n this.scrollable.append(this.description);\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 PopupElement from '.';\nimport {Message, Reaction} from '../../layer';\nimport ReactionsElement from '../chat/reactions';\nimport {horizontalMenu} from '../horizontalMenu';\nimport Scrollable from '../scrollable';\nimport ScrollableLoader from '../../helpers/scrollableLoader';\nimport appDialogsManager from '../../lib/appManagers/appDialogsManager';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport wrapSticker from '../wrappers/sticker';\nimport ReactionElement from '../chat/reaction';\nimport getUserStatusString from '../wrappers/getUserStatusString';\nimport {makeMediaSize} from '../../helpers/mediaSize';\nimport wrapCustomEmoji from '../wrappers/customEmoji';\nimport SettingSection from '../settingSection';\n\nexport default class PopupReactedList extends PopupElement {\n constructor(\n private message: Message.message\n ) {\n super('popup-reacted-list', {closable: true, overlayClosable: true, body: true});\n\n this.init();\n }\n\n private async init() {\n const middleware = this.middlewareHelper.get();\n const message = await this.managers.appMessagesManager.getGroupsFirstMessage(this.message);\n if(!middleware()) return;\n const canViewReadParticipants = await this.managers.appMessagesManager.canViewMessageReadParticipants(message);\n if(!middleware()) return;\n // this.body.append(generateDelimiter());\n\n const reactionsElement = new ReactionsElement();\n const newMessage: Message.message = {\n ...message,\n mid: 0,\n id: 0,\n reactions: {\n _: 'messageReactions',\n results: [],\n\n ...message.reactions,\n\n pFlags: {},\n recent_reactions: []\n }\n };\n\n newMessage.reactions.results = newMessage.reactions.results.map((reactionCount) => {\n return {\n ...reactionCount,\n chosen_order: undefined,\n pFlags: {}\n };\n });\n\n reactionsElement.init(newMessage, 'block', this.middlewareHelper.get());\n reactionsElement.render();\n reactionsElement.classList.add('no-stripe');\n reactionsElement.classList.remove('has-no-reactions');\n\n reactionsElement.append(this.btnClose);\n\n this.header.append(reactionsElement);\n\n const tabsContainer = document.createElement('div');\n tabsContainer.classList.add('tabs-container');\n tabsContainer.dataset.animation = 'tabs';\n\n const loaders: Map = new Map();\n\n let hasAllReactions = false;\n if(newMessage.reactions.results.length) {\n const reaction = this.createFakeReaction('reactions', newMessage.reactions.results.reduce((acc, r) => acc + r.count, 0));\n\n reactionsElement.prepend(reaction);\n newMessage.reactions.results.unshift(reaction.reactionCount);\n hasAllReactions = true;\n }\n\n let hasReadParticipants = false;\n if(canViewReadParticipants) {\n try {\n const readUserIds = await this.managers.appMessagesManager.getMessageReadParticipants(message.peerId, message.mid);\n if(!middleware()) return;\n if(!readUserIds.length) {\n throw '';\n }\n\n const reaction = this.createFakeReaction('checks', readUserIds.length);\n\n reactionsElement.prepend(reaction);\n newMessage.reactions.results.unshift(reaction.reactionCount);\n hasReadParticipants = true;\n } catch(err) {\n\n }\n }\n\n newMessage.reactions.results.forEach((reactionCount) => {\n const scrollable = new Scrollable(undefined);\n scrollable.container.classList.add('tabs-tab');\n\n const section = new SettingSection({\n noShadow: true,\n noDelimiter: true\n });\n\n const chatlist = appDialogsManager.createChatList({\n dialogSize: 72\n });\n\n appDialogsManager.setListClickListener(chatlist, () => {\n this.hide();\n }, undefined, false, true);\n\n section.content.append(chatlist);\n scrollable.container.append(section.container);\n\n const skipReadParticipants = (reactionCount.reaction as any) !== 'checks';\n const skipReactionsList = (reactionCount.reaction as any) === 'checks';\n if(['checks', 'reactions'].includes(reactionCount.reaction as any)) {\n reactionCount.reaction = undefined;\n }\n\n const size = 24;\n const mediaSize = makeMediaSize(size, size);\n\n let nextOffset: string;\n const loader = new ScrollableLoader({\n scrollable,\n getPromise: async() => {\n const result = await this.managers.appMessagesManager.getMessageReactionsListAndReadParticipants(message, undefined, reactionCount.reaction, nextOffset, skipReadParticipants, skipReactionsList);\n nextOffset = result.nextOffset;\n\n await Promise.all(result.combined.map(async({peerId, reaction}) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n autonomous: true,\n container: chatlist,\n avatarSize: 'abitbigger',\n rippleEnabled: false,\n meAsSaved: false\n });\n\n if(reaction) {\n const stickerContainer = document.createElement('div');\n stickerContainer.classList.add('reacted-list-reaction-icon');\n\n if(reaction._ === 'reactionEmoji') {\n const availableReaction = await this.managers.appReactionsManager.getReactionCached(reaction.emoticon);\n\n wrapSticker({\n doc: availableReaction.static_icon,\n div: stickerContainer,\n width: 24,\n height: 24,\n middleware\n });\n } else if(reaction._ === 'reactionCustomEmoji') {\n stickerContainer.append(wrapCustomEmoji({\n docIds: [reaction.document_id],\n customEmojiSize: mediaSize,\n middleware\n }));\n }\n\n dom.listEl.append(stickerContainer);\n }\n\n replaceContent(dom.lastMessageSpan, getUserStatusString(await this.managers.appUsersManager.getUser(peerId.toUserId())));\n }));\n\n return !nextOffset;\n }\n });\n\n loaders.set(scrollable.container, loader);\n\n tabsContainer.append(scrollable.container);\n });\n\n this.body.append(tabsContainer);\n\n const selectTab = horizontalMenu(reactionsElement, tabsContainer, (id, tabContent) => {\n if(id === (reactionsElement.childElementCount - 1)) {\n return false;\n }\n\n const reaction = reactionsElement.children[id] as ReactionElement;\n const prevId = selectTab.prevId();\n if(prevId !== -1) {\n (reactionsElement.children[prevId] as ReactionElement).setIsChosen(false);\n }\n\n reaction.setIsChosen(true);\n\n const loader = loaders.get(tabContent);\n loader.load();\n }, undefined, undefined, undefined, this.listenerSetter);\n\n // selectTab(hasAllReactions && hasReadParticipants ? 1 : 0, false);\n selectTab(0, false);\n\n this.show();\n }\n\n private createFakeReaction(icon: string, count: number) {\n const reaction = new ReactionElement();\n reaction.init('block', this.middlewareHelper.get());\n reaction.reactionCount = {\n _: 'reactionCount',\n count: count,\n reaction: icon as any\n };\n reaction.setCanRenderAvatars(false);\n reaction.renderCounter();\n\n const allReactionsSticker = document.createElement('div');\n allReactionsSticker.classList.add('reaction-counter', 'reaction-sticker-icon', 'tgico-' + icon);\n reaction.prepend(allReactionsSticker);\n\n return reaction;\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_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport {IS_MOBILE, IS_SAFARI} from '../../environment/userAgent';\nimport assumeType from '../../helpers/assumeType';\nimport callbackify from '../../helpers/callbackify';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport getVisibleRect from '../../helpers/dom/getVisibleRect';\nimport {getMiddleware} from '../../helpers/middleware';\nimport noop from '../../helpers/noop';\nimport {fastRaf} from '../../helpers/schedulers';\nimport {Message, AvailableReaction, Reaction} from '../../layer';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport lottieLoader from '../../lib/rlottie/lottieLoader';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport rootScope from '../../lib/rootScope';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport Scrollable, {ScrollableBase, ScrollableX} from '../scrollable';\nimport wrapSticker from '../wrappers/sticker';\n\nconst REACTIONS_CLASS_NAME = 'btn-menu-reactions';\nconst REACTION_CLASS_NAME = REACTIONS_CLASS_NAME + '-reaction';\n\nconst REACTION_SIZE = 26;\nconst PADDING = 4;\nexport const REACTION_CONTAINER_SIZE = REACTION_SIZE + PADDING * 2;\n\nconst CAN_USE_TRANSFORM = !IS_SAFARI;\n\ntype ChatReactionsMenuPlayers = {\n select?: RLottiePlayer,\n appear?: RLottiePlayer,\n selectWrapper: HTMLElement,\n appearWrapper: HTMLElement,\n reaction: Reaction\n};\nexport class ChatReactionsMenu {\n public widthContainer: HTMLElement;\n public container: HTMLElement;\n private reactionsMap: Map;\n public scrollable: ScrollableBase;\n private animationGroup: AnimationItemGroup;\n private middleware: ReturnType;\n private message: Message.message;\n\n constructor(\n private managers: AppManagers,\n private type: 'horizontal' | 'vertical',\n middleware: ChatReactionsMenu['middleware']\n ) {\n const widthContainer = this.widthContainer = document.createElement('div');\n widthContainer.classList.add(REACTIONS_CLASS_NAME + '-container');\n widthContainer.classList.add(REACTIONS_CLASS_NAME + '-container-' + type);\n\n const reactionsContainer = this.container = document.createElement('div');\n reactionsContainer.classList.add(REACTIONS_CLASS_NAME);\n\n const reactionsScrollable = this.scrollable = type === 'vertical' ? new Scrollable(undefined) : new ScrollableX(undefined);\n reactionsContainer.append(reactionsScrollable.container);\n reactionsScrollable.onAdditionalScroll = this.onScroll;\n reactionsScrollable.setListeners();\n\n reactionsScrollable.container.classList.add('no-scrollbar');\n\n // ['big'].forEach((type) => {\n // const bubble = document.createElement('div');\n // bubble.classList.add(REACTIONS_CLASS_NAME + '-bubble', REACTIONS_CLASS_NAME + '-bubble-' + type);\n // reactionsContainer.append(bubble);\n // });\n\n this.reactionsMap = new Map();\n this.animationGroup = `CHAT-MENU-REACTIONS-${Date.now()}`;\n animationIntersector.setOverrideIdleGroup(this.animationGroup, true);\n\n if(!IS_TOUCH_SUPPORTED) {\n reactionsContainer.addEventListener('mousemove', this.onMouseMove);\n }\n\n attachClickEvent(reactionsContainer, (e) => {\n const reactionDiv = findUpClassName(e.target, REACTION_CLASS_NAME);\n if(!reactionDiv) return;\n\n const players = this.reactionsMap.get(reactionDiv);\n if(!players) return;\n\n this.managers.appReactionsManager.sendReaction(this.message, players.reaction);\n });\n\n widthContainer.append(reactionsContainer);\n\n this.middleware = middleware ?? getMiddleware();\n }\n\n public init(message: Message.message) {\n this.message = message;\n\n const middleware = this.middleware.get();\n // const result = Promise.resolve(this.appReactionsManager.getAvailableReactionsForPeer(message.peerId)).then((res) => pause(1000).then(() => res));\n const result = this.managers.appReactionsManager.getAvailableReactionsByMessage(message);\n callbackify(result, (reactions) => {\n if(!middleware() || !reactions.length) return;\n reactions.forEach((reaction) => {\n if(reaction.pFlags.premium && !rootScope.premium) return;\n this.renderReaction(reaction);\n });\n\n const setVisible = () => {\n this.container.classList.add('is-visible');\n };\n\n if(result instanceof Promise) {\n fastRaf(setVisible);\n } else {\n setVisible();\n }\n });\n }\n\n public cleanup() {\n this.middleware.clean();\n this.scrollable.removeListeners();\n this.reactionsMap.clear();\n animationIntersector.setOverrideIdleGroup(this.animationGroup, false);\n animationIntersector.checkAnimations(true, this.animationGroup, true);\n }\n\n private onScroll = () => {\n this.reactionsMap.forEach((players, div) => {\n this.onScrollProcessItem(div, players);\n });\n };\n\n private canUseAnimations() {\n return rootScope.settings.animationsEnabled && !IS_MOBILE;\n }\n\n private renderReaction(reaction: AvailableReaction) {\n const reactionDiv = document.createElement('div');\n reactionDiv.classList.add(REACTION_CLASS_NAME);\n\n const scaleContainer = document.createElement('div');\n scaleContainer.classList.add(REACTION_CLASS_NAME + '-scale');\n\n const appearWrapper = document.createElement('div');\n let selectWrapper: HTMLElement;;\n appearWrapper.classList.add(REACTION_CLASS_NAME + '-appear');\n\n if(this.canUseAnimations()) {\n selectWrapper = document.createElement('div');\n selectWrapper.classList.add(REACTION_CLASS_NAME + '-select', 'hide');\n }\n\n const players: ChatReactionsMenuPlayers = {\n selectWrapper,\n appearWrapper,\n reaction: {_: 'reactionEmoji', emoticon: reaction.reaction}\n };\n this.reactionsMap.set(reactionDiv, players);\n\n const middleware = this.middleware.get();\n\n const hoverScale = IS_TOUCH_SUPPORTED ? 1 : 1.25;\n const size = REACTION_SIZE * hoverScale;\n\n const options = {\n width: size,\n height: size,\n skipRatio: 1,\n needFadeIn: false,\n withThumb: false,\n group: this.animationGroup,\n middleware\n };\n\n if(!this.canUseAnimations()) {\n delete options.needFadeIn;\n delete options.withThumb;\n\n wrapSticker({\n doc: reaction.static_icon,\n div: appearWrapper,\n ...options\n });\n } else {\n let isFirst = true;\n wrapSticker({\n doc: reaction.appear_animation,\n div: appearWrapper,\n play: true,\n ...options\n }).then(({render}) => render).then((player) => {\n assumeType(player);\n\n players.appear = player;\n\n player.addEventListener('enterFrame', (frameNo) => {\n if(player.maxFrame === frameNo) {\n selectLoadPromise.then((selectPlayer) => {\n assumeType(selectPlayer);\n appearWrapper.classList.add('hide');\n selectWrapper.classList.remove('hide');\n\n if(isFirst) {\n players.select = selectPlayer;\n isFirst = false;\n }\n }, noop);\n }\n });\n }, noop);\n\n const selectLoadPromise = wrapSticker({\n doc: reaction.select_animation,\n div: selectWrapper,\n ...options\n }).then(({render}) => render).then((player) => {\n assumeType(player);\n\n return lottieLoader.waitForFirstFrame(player);\n }).catch(noop);\n }\n\n scaleContainer.append(appearWrapper);\n selectWrapper && scaleContainer.append(selectWrapper);\n reactionDiv.append(scaleContainer);\n this.scrollable.append(reactionDiv);\n }\n\n private onScrollProcessItem(div: HTMLElement, players: ChatReactionsMenuPlayers) {\n // return;\n\n const scaleContainer = div.firstElementChild as HTMLElement;\n const visibleRect = getVisibleRect(div, this.scrollable.container);\n let transform: string;\n if(!visibleRect) {\n if(!players.appearWrapper.classList.contains('hide') || !players.appear) {\n return;\n }\n\n if(players.select) {\n players.select.stop();\n }\n\n players.appear.stop();\n players.appear.autoplay = true;\n players.appearWrapper.classList.remove('hide');\n players.selectWrapper.classList.add('hide');\n\n transform = '';\n } else if(visibleRect.overflow.left || visibleRect.overflow.right) {\n const diff = Math.abs(visibleRect.rect.left - visibleRect.rect.right);\n const scale = Math.min(diff ** 2 / REACTION_CONTAINER_SIZE ** 2, 1);\n\n transform = 'scale(' + scale + ')';\n } else {\n transform = '';\n }\n\n if(CAN_USE_TRANSFORM) {\n scaleContainer.style.transform = transform;\n }\n }\n\n private onMouseMove = (e: MouseEvent) => {\n const reactionDiv = findUpClassName(e.target, REACTION_CLASS_NAME);\n if(!reactionDiv) {\n return;\n }\n\n const players = this.reactionsMap.get(reactionDiv);\n if(!players) {\n return;\n }\n\n // do not play select animation when appearing\n if(!players.appear?.paused) {\n return;\n }\n\n const player = players.select;\n if(!player) {\n return;\n }\n\n if(player.paused) {\n player.autoplay = true;\n player.restart();\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 {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport type Chat from './chat';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport ButtonMenu, {ButtonMenuItemOptions} from '../buttonMenu';\nimport PopupDeleteMessages from '../popups/deleteMessages';\nimport PopupForward from '../popups/forward';\nimport PopupPinMessage from '../popups/unpinMessage';\nimport {copyTextToClipboard} from '../../helpers/clipboard';\nimport PopupSendNow from '../popups/sendNow';\nimport {toast} from '../toast';\nimport I18n, {i18n, LangPackKey} from '../../lib/langPack';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport isSelectionEmpty from '../../helpers/dom/isSelectionEmpty';\nimport {Message, Poll, Chat as MTChat, MessageMedia, AvailableReaction, MessageEntity, InputStickerSet, StickerSet, Document, Reaction} from '../../layer';\nimport PopupReportMessages from '../popups/reportMessages';\nimport assumeType from '../../helpers/assumeType';\nimport PopupSponsored from '../popups/sponsored';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport {getMiddleware} from '../../helpers/middleware';\nimport PeerTitle from '../peerTitle';\nimport StackedAvatars from '../stackedAvatars';\nimport {IS_APPLE} from '../../environment/userAgent';\nimport PopupReactedList from '../popups/reactedList';\nimport {ChatReactionsMenu, REACTION_CONTAINER_SIZE} from './reactionsMenu';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport positionMenu, {MenuPositionPadding} from '../../helpers/positionMenu';\nimport contextMenuController from '../../helpers/contextMenuController';\nimport {attachContextMenuListener} from '../../helpers/dom/attachContextMenuListener';\nimport filterAsync from '../../helpers/array/filterAsync';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport {SERVICE_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport {MessagesStorageKey} from '../../lib/appManagers/appMessagesManager';\nimport filterUnique from '../../helpers/array/filterUnique';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport PopupStickers from '../popups/stickers';\nimport getMediaFromMessage from '../../lib/appManagers/utils/messages/getMediaFromMessage';\nimport canSaveMessageMedia from '../../lib/appManagers/utils/messages/canSaveMessageMedia';\nimport getAlbumText from '../../lib/appManagers/utils/messages/getAlbumText';\n\nexport default class ChatContextMenu {\n private buttons: (ButtonMenuItemOptions & {verify: () => boolean | Promise, notDirect?: () => boolean, withSelection?: true, isSponsored?: true, localName?: 'views' | 'emojis'})[];\n private element: HTMLElement;\n\n private isSelectable: boolean;\n private isSelected: boolean;\n private target: HTMLElement;\n private isTargetAGroupedItem: boolean;\n private isTextSelected: boolean;\n private isAnchorTarget: boolean;\n private isUsernameTarget: boolean;\n private isSponsored: boolean;\n private isOverBubble: boolean;\n private peerId: PeerId;\n private mid: number;\n private message: Message.message | Message.messageService;\n private noForwards: boolean;\n\n private reactionsMenu: ChatReactionsMenu;\n private listenerSetter: ListenerSetter;\n private attachListenerSetter: ListenerSetter;\n\n private viewerPeerId: PeerId;\n private middleware: ReturnType;\n private canOpenReactedList: boolean;\n\n private emojiInputsPromise: CancellablePromise;\n private albumMessages: Message.message[];\n private linkToMessage: Awaited>;\n private selectedMessagesText: string;\n\n constructor(\n private chat: Chat,\n private managers: AppManagers\n ) {\n this.listenerSetter = new ListenerSetter();\n this.attachListenerSetter = new ListenerSetter();\n this.middleware = getMiddleware();\n }\n\n public attachTo(element: HTMLElement) {\n this.attachListenerSetter.removeAll();\n\n if(IS_TOUCH_SUPPORTED/* && false */) {\n attachClickEvent(element, (e) => {\n if(this.chat.selection.isSelecting) {\n return;\n }\n\n this.chat.log('touchend', e);\n\n const badSelectors = [\n '.name',\n '.peer-title',\n '.reply',\n '.document',\n 'audio-element',\n 'avatar-element',\n 'a',\n '.bubble-beside-button',\n 'replies-element',\n '[data-saved-from]:not(.bubble)',\n 'poll-element',\n '.attachment',\n '.reply-markup-button'\n ];\n const good = !(e.target as HTMLElement).closest(badSelectors.join(', '));\n if(good) {\n cancelEvent(e);\n // onContextMenu((e as TouchEvent).changedTouches[0]);\n // onContextMenu((e as TouchEvent).changedTouches ? (e as TouchEvent).changedTouches[0] : e as MouseEvent);\n this.onContextMenu(e);\n }\n }, {listenerSetter: this.attachListenerSetter});\n } else attachContextMenuListener({\n element,\n callback: this.onContextMenu,\n listenerSetter: this.attachListenerSetter\n });\n }\n\n private onContextMenu = (e: MouseEvent | Touch | TouchEvent) => {\n let bubble: HTMLElement, contentWrapper: HTMLElement;\n\n try {\n contentWrapper = findUpClassName(e.target, 'bubble-content-wrapper');\n bubble = contentWrapper ? contentWrapper.parentElement : findUpClassName(e.target, 'bubble');\n } catch(e) {}\n\n // ! context menu click by date bubble (there is no pointer-events)\n if(!bubble || bubble.classList.contains('bubble-first')) return;\n\n let element = this.element;\n if(e instanceof MouseEvent || e.hasOwnProperty('preventDefault')) (e as any).preventDefault();\n if(element && element.classList.contains('active')) {\n return false;\n }\n if(e instanceof MouseEvent || e.hasOwnProperty('cancelBubble')) (e as any).cancelBubble = true;\n\n let mid = +bubble.dataset.mid;\n if(!mid) return;\n\n const r = async() => {\n const isSponsored = this.isSponsored = mid < 0;\n this.isSelectable = this.chat.selection.canSelectBubble(bubble);\n this.peerId = this.chat.peerId;\n // this.msgID = msgID;\n this.target = e.target as HTMLElement;\n this.isTextSelected = !isSelectionEmpty();\n this.isAnchorTarget = this.target.tagName === 'A' && (\n (this.target as HTMLAnchorElement).target === '_blank' ||\n this.target.classList.contains('anchor-url')\n );\n this.isUsernameTarget = this.target.tagName === 'A' && this.target.classList.contains('mention');\n\n const mids = await this.chat.getMidsByMid(mid);\n // * ะตัะปะธ ะพั‚ะบั€ั‹ั‚ัŒ ะบะพะฝั‚ะตะบัั‚ะฝะพะต ะผะตะฝัŽ ะดะปั ะฐะปัŒะฑะพะผะฐ ะฝะต ะฟะพ ะฑะฐะฑะฑะปัƒ, ะธ ะฟะพัะปะตะดะฝะธะน ัะปะตะผะตะฝั‚ ะฝะต ะฒั‹ะฑั€ะฐะฝ, ั‡ั‚ะพะฑั‹ ะฟะพะบะฐะทะฐั‚ัŒ ะพัั‚ะฐะปัŒะฝั‹ะต ะฟัƒะฝะบั‚ั‹\n if(this.chat.selection.isSelecting && !contentWrapper) {\n if(isSponsored) {\n return;\n }\n\n if(mids.length > 1) {\n const selectedMid = this.chat.selection.isMidSelected(this.peerId, mid) ?\n mid :\n mids.find((mid) => this.chat.selection.isMidSelected(this.peerId, mid));\n if(selectedMid) {\n mid = selectedMid;\n }\n }\n }\n\n this.isOverBubble = !!contentWrapper;\n\n const groupedItem = findUpClassName(this.target, 'grouped-item');\n this.isTargetAGroupedItem = !!groupedItem;\n if(groupedItem) {\n this.mid = +groupedItem.dataset.mid;\n } else {\n this.mid = mid;\n }\n\n this.isSelected = this.chat.selection.isMidSelected(this.peerId, this.mid);\n this.message = (bubble as any).message || await this.chat.getMessage(this.mid);\n this.albumMessages = (this.message as Message.message).grouped_id ? await this.managers.appMessagesManager.getMessagesByAlbum((this.message as Message.message).grouped_id) : undefined;\n this.noForwards = !isSponsored && !(await this.managers.appMessagesManager.canForward(this.message));\n this.viewerPeerId = undefined;\n this.canOpenReactedList = undefined;\n this.linkToMessage = await this.getUrlToMessage();\n this.selectedMessagesText = await this.getSelectedMessagesText();\n\n const initResult = await this.init();\n if(!initResult) {\n return;\n }\n\n element = initResult.element;\n const {cleanup, destroy, menuPadding, reactionsMenu, reactionsMenuPosition} = initResult;\n let isReactionsMenuVisible = false;\n if(reactionsMenu) {\n const className = 'is-visible';\n isReactionsMenuVisible = reactionsMenu.container.classList.contains(className);\n if(isReactionsMenuVisible) reactionsMenu.container.classList.remove(className);\n\n if(reactionsMenuPosition === 'horizontal') {\n const offsetSize = element[/* reactionsMenuPosition === 'vertical' ? 'offsetHeight' : */'offsetWidth'];\n // if(reactionsMenu.scrollable.container.scrollWidth > offsetWidth) {\n const INNER_CONTAINER_PADDING = 8;\n const visibleLength = (offsetSize - INNER_CONTAINER_PADDING) / REACTION_CONTAINER_SIZE;\n const nextVisiblePart = visibleLength % 1;\n const MIN_NEXT_VISIBLE_PART = 0.65;\n if(nextVisiblePart < MIN_NEXT_VISIBLE_PART) {\n const minSize = (offsetSize + (MIN_NEXT_VISIBLE_PART - nextVisiblePart) * REACTION_CONTAINER_SIZE) | 0;\n element.style[/* reactionsMenuPosition === 'vertical' ? 'minHeight' : */'minWidth'] = minSize + 'px';\n }\n // }\n }\n }\n\n const side: 'left' | 'right' = bubble.classList.contains('is-in') ? 'left' : 'right';\n // bubble.parentElement.append(element);\n // appImManager.log('contextmenu', e, bubble, side);\n positionMenu((e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent, element, side, menuPadding);\n\n if(reactionsMenu) {\n reactionsMenu.widthContainer.style.top = element.style.top;\n reactionsMenu.widthContainer.style.left = element.style.left;\n reactionsMenu.widthContainer.style.setProperty('--menu-width', element[reactionsMenuPosition === 'vertical' ? 'offsetHeight' : 'offsetWidth'] + 'px');\n element.parentElement.append(reactionsMenu.widthContainer);\n if(isReactionsMenuVisible) void reactionsMenu.container.offsetLeft; // reflow\n }\n\n contextMenuController.openBtnMenu(element, () => {\n if(reactionsMenu) {\n reactionsMenu.container.classList.remove('is-visible');\n }\n\n this.mid = 0;\n this.peerId = undefined;\n this.target = null;\n this.viewerPeerId = undefined;\n this.canOpenReactedList = undefined;\n cleanup();\n\n setTimeout(() => {\n destroy();\n }, 300);\n });\n\n if(isReactionsMenuVisible) {\n reactionsMenu.container.classList.add('is-visible');\n }\n };\n\n r();\n };\n\n public cleanup() {\n this.listenerSetter.removeAll();\n this.reactionsMenu && this.reactionsMenu.cleanup();\n this.middleware.clean();\n }\n\n public destroy() {\n this.cleanup();\n this.attachListenerSetter.removeAll();\n }\n\n private async filterButtons(buttons: ChatContextMenu['buttons']) {\n if(this.isSponsored) {\n return buttons.filter((button) => {\n return button.isSponsored;\n });\n } else {\n return filterAsync(buttons, async(button) => {\n let good: boolean;\n\n // if((appImManager.chatSelection.isSelecting && !button.withSelection) || (button.withSelection && !appImManager.chatSelection.isSelecting)) {\n if(this.chat.selection.isSelecting && !button.withSelection) {\n good = false;\n } else {\n good = this.isOverBubble || IS_TOUCH_SUPPORTED || true ?\n await button.verify() :\n button.notDirect && await button.verify() && button.notDirect();\n }\n\n return !!good;\n });\n }\n }\n\n private setButtons() {\n const verifyFavoriteSticker = async(toAdd: boolean) => {\n const doc = ((this.message as Message.message).media as MessageMedia.messageMediaDocument)?.document;\n if(!(doc as MyDocument)?.sticker) {\n return false;\n }\n\n const favedStickers = await this.managers.acknowledged.appStickersManager.getFavedStickersStickers();\n if(!favedStickers.cached) {\n return false;\n }\n\n const found = (await favedStickers.result).some((_doc) => _doc.id === doc.id);\n return toAdd ? !found : found;\n };\n\n this.buttons = [{\n icon: 'send2',\n text: 'MessageScheduleSend',\n onClick: this.onSendScheduledClick,\n verify: () => this.chat.type === 'scheduled' && !this.message.pFlags.is_outgoing\n }, {\n icon: 'send2',\n text: 'Message.Context.Selection.SendNow',\n onClick: this.onSendScheduledClick,\n verify: () => this.chat.type === 'scheduled' && this.isSelected && !this.chat.selection.selectionSendNowBtn.hasAttribute('disabled'),\n notDirect: () => true,\n withSelection: true\n }, {\n icon: 'schedule',\n text: 'MessageScheduleEditTime',\n onClick: () => {\n this.chat.input.scheduleSending(() => {\n assumeType(this.message);\n this.managers.appMessagesManager.editMessage(this.message, this.message.message, {\n scheduleDate: this.chat.input.scheduleDate,\n entities: this.message.entities\n });\n\n this.chat.input.onMessageSent(false, false);\n }, new Date(this.message.date * 1000));\n },\n verify: () => this.chat.type === 'scheduled'\n }, {\n icon: 'reply',\n text: 'Reply',\n onClick: this.onReplyClick,\n verify: async() => await this.chat.canSend() &&\n !this.message.pFlags.is_outgoing &&\n !!this.chat.input.messageInput &&\n this.chat.type !== 'scheduled'/* ,\n cancelEvent: true */\n }, {\n icon: 'favourites',\n text: 'AddToFavorites',\n onClick: this.onFaveStickerClick.bind(this, false),\n verify: () => verifyFavoriteSticker(true)\n }, {\n icon: 'favourites',\n text: 'DeleteFromFavorites',\n onClick: this.onFaveStickerClick.bind(this, true),\n verify: () => verifyFavoriteSticker(false)\n }, {\n icon: 'edit',\n text: 'Edit',\n onClick: this.onEditClick,\n verify: async() => (await this.managers.appMessagesManager.canEditMessage(this.message, 'text')) && !!this.chat.input.messageInput\n }, {\n icon: 'copy',\n text: 'Copy',\n onClick: this.onCopyClick,\n verify: () => !this.noForwards && !!(this.message as Message.message).message && !this.isTextSelected && (!this.isAnchorTarget || (this.message as Message.message).message !== this.target.innerText)\n }, {\n icon: 'copy',\n text: 'Chat.CopySelectedText',\n onClick: this.onCopyClick,\n verify: () => !this.noForwards && !!(this.message as Message.message).message && this.isTextSelected\n }, {\n icon: 'copy',\n text: 'Message.Context.Selection.Copy',\n onClick: this.onCopyClick,\n verify: async() => {\n if(!this.isSelected || this.noForwards) {\n return false;\n }\n\n for(const [peerId, mids] of this.chat.selection.selectedMids) {\n const storageKey: MessagesStorageKey = `${peerId}_${this.chat.type === 'scheduled' ? 'scheduled' : 'history'}`;\n for(const mid of mids) {\n const message = (await this.managers.appMessagesManager.getMessageFromStorage(storageKey, mid)) as Message.message;\n if(!!message.message) {\n return true;\n }\n }\n }\n\n return false;\n },\n notDirect: () => true,\n withSelection: true\n }, {\n icon: 'copy',\n text: 'CopyLink',\n onClick: this.onCopyAnchorLinkClick,\n verify: () => this.isAnchorTarget,\n withSelection: true\n }, {\n icon: 'copy',\n text: 'Text.Context.Copy.Username',\n onClick: () => {\n copyTextToClipboard(this.target.innerHTML);\n },\n verify: () => this.isUsernameTarget,\n withSelection: true\n }, {\n icon: 'copy',\n text: 'Text.Context.Copy.Hashtag',\n onClick: () => {\n copyTextToClipboard(this.target.innerHTML);\n },\n verify: () => this.target.classList.contains('anchor-hashtag'),\n withSelection: true\n }, {\n icon: 'link',\n text: 'MessageContext.CopyMessageLink1',\n onClick: this.onCopyLinkClick,\n verify: async() => await this.managers.appPeersManager.isChannel(this.peerId) && !this.message.pFlags.is_outgoing\n }, {\n icon: 'pin',\n text: 'Message.Context.Pin',\n onClick: this.onPinClick,\n verify: async() => !this.message.pFlags.is_outgoing &&\n this.message._ !== 'messageService' &&\n !this.message.pFlags.pinned &&\n await this.managers.appPeersManager.canPinMessage(this.peerId) &&\n this.chat.type !== 'scheduled'\n }, {\n icon: 'unpin',\n text: 'Message.Context.Unpin',\n onClick: this.onUnpinClick,\n verify: async() => (this.message as Message.message).pFlags.pinned && await this.managers.appPeersManager.canPinMessage(this.peerId)\n }, {\n icon: 'download',\n text: 'MediaViewer.Context.Download',\n onClick: () => {\n appDownloadManager.downloadToDisc({media: getMediaFromMessage(this.message)});\n },\n verify: () => {\n if(!canSaveMessageMedia(this.message) || this.noForwards) {\n return false;\n }\n\n const isPhoto: boolean = !!((this.message as Message.message).media as MessageMedia.messageMediaPhoto)?.photo;\n let isGoodType = false\n\n if(isPhoto) {\n isGoodType = true;\n } else {\n const doc: MyDocument = ((this.message as Message.message).media as MessageMedia.messageMediaDocument)?.document as any;\n if(!doc) return false;\n // isGoodType = doc.type && (['gif', 'video', 'audio', 'voice', 'sticker'] as MyDocument['type'][]).includes(doc.type)\n isGoodType = true;\n }\n\n let hasTarget = !!IS_TOUCH_SUPPORTED;\n\n if(isGoodType) hasTarget ||= !!findUpClassName(this.target, 'document') || !!findUpClassName(this.target, 'audio') || !!findUpClassName(this.target, 'media-sticker-wrapper') || !!findUpClassName(this.target, 'media-photo') || !!findUpClassName(this.target, 'media-video');\n\n return isGoodType && hasTarget;\n }\n }, {\n icon: 'checkretract',\n text: 'Chat.Poll.Unvote',\n onClick: this.onRetractVote,\n verify: () => {\n const poll = (this.message as any).media?.poll as Poll;\n return poll && poll.chosenIndexes.length && !poll.pFlags.closed && !poll.pFlags.quiz;\n }/* ,\n cancelEvent: true */\n }, {\n icon: 'stop',\n text: 'Chat.Poll.Stop',\n onClick: this.onStopPoll,\n verify: async() => {\n const poll = (this.message as any).media?.poll;\n return await this.managers.appMessagesManager.canEditMessage(this.message, 'poll') && poll && !poll.pFlags.closed && !this.message.pFlags.is_outgoing;\n }/* ,\n cancelEvent: true */\n }, {\n icon: 'forward',\n text: 'Forward',\n onClick: this.onForwardClick, // let forward the message if it's outgoing but not ours (like a changelog)\n verify: () => !this.noForwards && this.chat.type !== 'scheduled' && (!this.message.pFlags.is_outgoing || this.message.fromId === SERVICE_PEER_ID) && this.message._ !== 'messageService'\n }, {\n icon: 'forward',\n text: 'Message.Context.Selection.Forward',\n onClick: this.onForwardClick,\n verify: () => this.chat.selection.selectionForwardBtn &&\n this.isSelected &&\n !this.chat.selection.selectionForwardBtn.hasAttribute('disabled'),\n notDirect: () => true,\n withSelection: true\n }, {\n icon: 'flag',\n text: 'ReportChat',\n onClick: () => {\n new PopupReportMessages(this.peerId, [this.mid]);\n },\n verify: async() => !this.message.pFlags.out && this.message._ === 'message' && !this.message.pFlags.is_outgoing && await this.managers.appPeersManager.isChannel(this.peerId),\n notDirect: () => true,\n withSelection: true\n }, {\n icon: 'select',\n text: 'Message.Context.Select',\n onClick: this.onSelectClick,\n verify: () => !(this.message as Message.messageService).action && !this.isSelected && this.isSelectable,\n notDirect: () => true,\n withSelection: true\n }, {\n icon: 'select',\n text: 'Message.Context.Selection.Clear',\n onClick: this.onClearSelectionClick,\n verify: () => this.isSelected,\n notDirect: () => true,\n withSelection: true\n }, {\n onClick: () => {\n if(this.viewerPeerId) {\n this.chat.appImManager.setInnerPeer({\n peerId: this.viewerPeerId\n });\n } else if(this.canOpenReactedList) {\n new PopupReactedList(this.message as Message.message);\n } else {\n return false;\n }\n },\n verify: async() => !this.peerId.isUser() && (!!(this.message as Message.message).reactions?.recent_reactions?.length || await this.managers.appMessagesManager.canViewMessageReadParticipants(this.message)),\n notDirect: () => true,\n localName: 'views'\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick,\n verify: async() => this.managers.appMessagesManager.canDeleteMessage(this.message)\n }, {\n icon: 'delete danger',\n text: 'Message.Context.Selection.Delete',\n onClick: this.onDeleteClick,\n verify: () => this.isSelected && !this.chat.selection.selectionDeleteBtn.hasAttribute('disabled'),\n notDirect: () => true,\n withSelection: true\n }, {\n icon: 'info',\n text: 'Chat.Message.Sponsored.What',\n onClick: () => {\n new PopupSponsored();\n },\n verify: () => false,\n isSponsored: true\n }, {\n // icon: 'smile',\n text: 'Loading',\n onClick: () => {\n this.emojiInputsPromise.then((inputs) => {\n new PopupStickers(inputs, true).show();\n });\n },\n verify: () => !!this.getUniqueCustomEmojisFromMessage().length,\n notDirect: () => true,\n localName: 'emojis'\n }];\n }\n\n private getMessageWithText() {\n return (this.albumMessages && getAlbumText(this.albumMessages)) || this.message;\n }\n\n private getUniqueCustomEmojisFromMessage() {\n const docIds: DocId[] = [];\n\n const message = this.getMessageWithText();\n\n const entities = (message as Message.message).entities;\n if(entities) {\n const filtered = entities.filter((entity) => entity._ === 'messageEntityCustomEmoji') as MessageEntity.messageEntityCustomEmoji[];\n docIds.push(...filtered.map((entity) => entity.document_id));\n }\n\n const reactions = (message as Message.message).reactions;\n if(reactions) {\n const results = reactions.results.filter((reactionCount) => reactionCount.reaction._ === 'reactionCustomEmoji');\n docIds.push(...results.map((reactionCount) => (reactionCount.reaction as Reaction.reactionCustomEmoji).document_id));\n }\n\n return filterUnique(docIds);\n }\n\n private async init() {\n this.cleanup();\n this.setButtons();\n\n const filteredButtons = await this.filterButtons(this.buttons);\n if(!filteredButtons.length) {\n return;\n }\n\n const element = this.element = await ButtonMenu({\n buttons: filteredButtons,\n listenerSetter: this.listenerSetter\n });\n element.id = 'bubble-contextmenu';\n element.classList.add('contextmenu');\n\n const viewsButton = filteredButtons.find((button) => button.localName === 'views');\n if(viewsButton) {\n const reactions = (this.message as Message.message).reactions;\n const recentReactions = reactions?.recent_reactions;\n const isViewingReactions = !!recentReactions?.length;\n const participantsCount = await this.managers.appMessagesManager.canViewMessageReadParticipants(this.message) ?\n ((await this.managers.appPeersManager.getPeer(this.peerId)) as MTChat.chat).participants_count :\n undefined;\n const reactedLength = reactions ? reactions.results.reduce((acc, r) => acc + r.count, 0) : undefined;\n\n viewsButton.element.classList.add('tgico-' + (isViewingReactions ? 'reactions' : 'checks'));\n const i18nElem = new I18n.IntlElement({\n key: isViewingReactions ? (\n participantsCount === undefined ? 'Chat.Context.ReactedFast' : 'Chat.Context.Reacted'\n ) : 'NobodyViewed',\n args: isViewingReactions ? (\n participantsCount === undefined ? [reactedLength] : [participantsCount, participantsCount]\n ) : undefined,\n element: viewsButton.textElement\n });\n\n let fakeText: HTMLElement;\n if(isViewingReactions) {\n if(participantsCount === undefined) {\n fakeText = i18n('Chat.Context.ReactedFast', [reactedLength]);\n } else {\n fakeText = i18n(\n recentReactions.length === participantsCount ? 'Chat.Context.ReactedFast' : 'Chat.Context.Reacted',\n [recentReactions.length, participantsCount]\n );\n }\n } else {\n fakeText = i18n('Loading');\n }\n\n fakeText.classList.add('btn-menu-item-text-fake');\n viewsButton.element.append(fakeText);\n\n const AVATAR_SIZE = 22;\n const MAX_AVATARS = 3;\n const PADDING_PER_AVATAR = 1.125;\n i18nElem.element.style.visibility = 'hidden';\n i18nElem.element.style.paddingRight = isViewingReactions ? PADDING_PER_AVATAR * Math.min(MAX_AVATARS, recentReactions.length) + 'rem' : '1rem';\n const middleware = this.middleware.get();\n this.managers.appMessagesManager.getMessageReactionsListAndReadParticipants(this.message as Message.message).then((result) => {\n if(!middleware()) {\n return;\n }\n\n if(fakeText) {\n fakeText.remove();\n }\n\n const reactions = result.combined;\n const reactedLength = participantsCount === undefined ?\n result.reactionsCount :\n (\n isViewingReactions ?\n reactions.filter((reaction) => reaction.reaction).length :\n reactions.length\n );\n\n let fakeElem: HTMLElement;\n if(reactions.length === 1) {\n fakeElem = new PeerTitle({\n peerId: reactions[0].peerId,\n onlyFirstName: true,\n dialog: false\n }).element;\n\n if(!isViewingReactions || result.readParticipants.length <= 1) {\n this.viewerPeerId = reactions[0].peerId;\n }\n } else if(isViewingReactions) {\n const isFull = reactedLength === reactions.length || participantsCount === undefined;\n fakeElem = i18n(\n isFull ? 'Chat.Context.ReactedFast' : 'Chat.Context.Reacted',\n isFull ? [reactedLength] : [reactedLength, reactions.length]\n );\n } else {\n if(!reactions.length) {\n i18nElem.element.style.visibility = '';\n } else {\n fakeElem = i18n('MessageSeen', [reactions.length]);\n }\n }\n\n if(fakeElem) {\n fakeElem.style.paddingRight = PADDING_PER_AVATAR * Math.min(MAX_AVATARS, reactedLength) + 'rem';\n fakeElem.classList.add('btn-menu-item-text-fake');\n viewsButton.element.append(fakeElem);\n }\n\n if(reactions.length) {\n const avatars = new StackedAvatars({avatarSize: AVATAR_SIZE});\n avatars.render(recentReactions ? recentReactions.map((r) => getPeerId(r.peer_id)) : reactions.map((reaction) => reaction.peerId));\n viewsButton.element.append(avatars.container);\n\n // if(reactions.length > 1) {\n // if(isViewingReactions) {\n this.canOpenReactedList = true;\n // }\n }\n });\n }\n\n let menuPadding: MenuPositionPadding;\n let reactionsMenu: ChatReactionsMenu;\n let reactionsMenuPosition: 'horizontal' | 'vertical';\n if(\n this.message._ === 'message' &&\n !this.chat.selection.isSelecting &&\n !this.message.pFlags.is_outgoing &&\n !this.message.pFlags.is_scheduled &&\n !this.message.pFlags.local\n ) {\n reactionsMenuPosition = (IS_APPLE || IS_TOUCH_SUPPORTED)/* && false */ ? 'horizontal' : 'vertical';\n reactionsMenu = this.reactionsMenu = new ChatReactionsMenu(this.managers, reactionsMenuPosition, this.middleware);\n reactionsMenu.init(await this.managers.appMessagesManager.getGroupsFirstMessage(this.message));\n // element.prepend(reactionsMenu.widthContainer);\n\n const size = 36;\n const margin = 8;\n const totalSize = size + margin;\n const paddingLeft = 0, paddingRight = 0;\n if(reactionsMenuPosition === 'vertical') {\n menuPadding = {\n top: paddingLeft,\n // bottom: 36, // positionMenu will detect it itself somehow\n left: totalSize\n };\n } else {\n menuPadding = {\n top: totalSize,\n right: paddingRight,\n left: paddingLeft\n };\n }\n }\n\n const emojisButton = filteredButtons.find((button) => button.localName === 'emojis');\n if(emojisButton) {\n emojisButton.element.classList.add('is-multiline');\n emojisButton.element.parentElement.insertBefore(document.createElement('hr'), emojisButton.element);\n\n const setPadding = () => {\n menuPadding ??= {};\n menuPadding.bottom = 24;\n };\n\n const docIds = this.getUniqueCustomEmojisFromMessage();\n const inputsPromise = this.emojiInputsPromise = deferredPromise();\n\n await this.managers.appEmojiManager.getCachedCustomEmojiDocuments(docIds).then(async(docs) => {\n const p = async(docs: Document.document[]) => {\n const s: Map = new Map();\n docs.forEach((doc) => {\n if(!doc || s.has(doc.stickerSetInput.id)) {\n return;\n }\n\n s.set(doc.stickerSetInput.id, doc.stickerSetInput);\n });\n\n const inputs = [...s.values()];\n inputsPromise.resolve(inputs);\n if(s.size === 1) {\n const result = await this.managers.acknowledged.appStickersManager.getStickerSet(inputs[0]);\n const promise = result.result.then((set) => {\n const el = i18n('MessageContainsEmojiPack', [wrapEmojiText(set.set.title)]);\n replaceContent(emojisButton.textElement, el);\n });\n\n return result.cached ? promise : (setPadding(), undefined);\n }\n\n replaceContent(emojisButton.textElement, i18n('MessageContainsEmojiPacks', [s.size]));\n };\n\n if(docs.some((doc) => !doc)) {\n setPadding();\n this.managers.appEmojiManager.getCustomEmojiDocuments(docIds).then(p);\n } else {\n return p(docs);\n }\n });\n // emojisButton.element.append(i18n('Loading'));\n }\n\n this.chat.container.append(element);\n\n return {\n element,\n cleanup: () => {\n this.cleanup();\n reactionsMenu && reactionsMenu.cleanup();\n },\n destroy: () => {\n element.remove();\n reactionsMenu && reactionsMenu.widthContainer.remove();\n },\n menuPadding,\n reactionsMenu,\n reactionsMenuPosition\n };\n }\n\n private async getUrlToMessage() {\n if(this.peerId.isUser()) {\n return;\n }\n\n let threadMessage: Message.message;\n const {peerId, mid} = this;\n const threadId = this.chat.threadId;\n if(this.chat.type === 'discussion') {\n threadMessage = (await this.managers.appMessagesManager.getMessageByPeer(peerId, threadId)) as Message.message;\n }\n\n const username = await this.managers.appPeersManager.getPeerUsername(threadMessage ? threadMessage.fromId : peerId);\n const msgId = getServerMessageId(mid);\n let url = 'https://t.me/';\n if(username) {\n url += username;\n if(threadMessage) url += `/${getServerMessageId(threadMessage.fwd_from.channel_post)}?comment=${msgId}`;\n else if(threadId) url += `/${getServerMessageId(threadId)}/${msgId}`;\n else url += '/' + msgId;\n } else {\n url += 'c/' + peerId.toChatId();\n if(threadMessage) url += `/${msgId}?thread=${getServerMessageId(threadMessage.mid)}`;\n else if(threadId) url += `/${getServerMessageId(threadId)}/${msgId}`;\n else url += '/' + msgId;\n }\n\n return {url, isPrivate: !username};\n }\n\n private async getSelectedMessagesText() {\n if(!isSelectionEmpty()) {\n return '';\n }\n\n const mids = this.chat.selection.isSelecting ?\n [...this.chat.selection.selectedMids.get(this.peerId)].sort((a, b) => a - b) :\n [this.mid];\n\n const parts: string[] = await Promise.all(mids.map(async(mid) => {\n const message = (await this.chat.getMessage(mid)) as Message.message;\n return message?.message ? message.message + '\\n' : '';\n }));\n\n return parts.join('');\n }\n\n private onSendScheduledClick = async() => {\n if(this.chat.selection.isSelecting) {\n simulateClickEvent(this.chat.selection.selectionSendNowBtn);\n } else {\n new PopupSendNow(this.peerId, await this.chat.getMidsByMid(this.mid));\n }\n };\n\n private onReplyClick = () => {\n this.chat.input.initMessageReply(this.mid);\n };\n\n private onFaveStickerClick = (unfave?: boolean) => {\n const docId = ((this.message as Message.message).media as MessageMedia.messageMediaDocument).document.id;\n this.managers.appStickersManager.faveSticker(docId, unfave);\n };\n\n private onEditClick = () => {\n const message = this.getMessageWithText();\n this.chat.input.initMessageEditing(this.isTargetAGroupedItem ? this.mid : message.mid);\n };\n\n private onCopyClick = async() => {\n if(isSelectionEmpty()) {\n copyTextToClipboard(this.selectedMessagesText);\n } else {\n document.execCommand('copy');\n // cancelSelection();\n }\n };\n\n private onCopyAnchorLinkClick = () => {\n copyTextToClipboard((this.target as HTMLAnchorElement).href);\n };\n\n private onCopyLinkClick = () => {\n const {url, isPrivate} = this.linkToMessage;\n const key: LangPackKey = isPrivate ? 'LinkCopiedPrivateInfo' : 'LinkCopied';\n toast(I18n.format(key, true));\n copyTextToClipboard(url);\n };\n\n private onPinClick = () => {\n new PopupPinMessage(this.peerId, this.mid);\n };\n\n private onUnpinClick = () => {\n new PopupPinMessage(this.peerId, this.mid, true);\n };\n\n private onRetractVote = () => {\n this.managers.appPollsManager.sendVote(this.message as Message.message, []);\n };\n\n private onStopPoll = () => {\n this.managers.appPollsManager.stopPoll(this.message as Message.message);\n };\n\n private onForwardClick = async() => {\n if(this.chat.selection.isSelecting) {\n simulateClickEvent(this.chat.selection.selectionForwardBtn);\n } else {\n const peerId = this.peerId;\n const mids = this.isTargetAGroupedItem ? [this.mid] : await this.chat.getMidsByMid(this.mid);\n new PopupForward({\n [peerId]: mids\n });\n }\n };\n\n private onSelectClick = () => {\n this.chat.selection.toggleByElement(findUpClassName(this.target, 'grouped-item') || findUpClassName(this.target, 'bubble'));\n };\n\n private onClearSelectionClick = () => {\n this.chat.selection.cancelSelection();\n };\n\n private onDeleteClick = async() => {\n if(this.chat.selection.isSelecting) {\n simulateClickEvent(this.chat.selection.selectionDeleteBtn);\n } else {\n new PopupDeleteMessages(this.peerId, this.isTargetAGroupedItem ? [this.mid] : await this.chat.getMidsByMid(this.mid), this.chat.type);\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 contextMenuController from '../../helpers/contextMenuController';\nimport {attachContextMenuListener} from '../../helpers/dom/attachContextMenuListener';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport rootScope from '../../lib/rootScope';\nimport {ButtonMenuItemOptions, ButtonMenuSync} from '../buttonMenu';\n\nexport default class SendMenu {\n public sendMenu: HTMLElement;\n private sendMenuButtons: (ButtonMenuItemOptions & {verify: () => boolean})[];\n private type: 'schedule' | 'reminder';\n\n constructor(options: {\n onSilentClick: () => void,\n onScheduleClick: () => void,\n listenerSetter?: ListenerSetter,\n openSide: string,\n onContextElement: HTMLElement,\n onOpen?: () => boolean\n }) {\n this.sendMenuButtons = [{\n icon: 'mute',\n text: 'Chat.Send.WithoutSound',\n onClick: options.onSilentClick,\n verify: () => this.type === 'schedule'\n }, {\n icon: 'schedule',\n text: 'Chat.Send.ScheduledMessage',\n onClick: options.onScheduleClick,\n verify: () => this.type === 'schedule'\n }, {\n icon: 'schedule',\n text: 'Chat.Send.SetReminder',\n onClick: options.onScheduleClick,\n verify: () => this.type === 'reminder'\n }];\n\n this.sendMenu = ButtonMenuSync({buttons: this.sendMenuButtons, listenerSetter: options.listenerSetter});\n this.sendMenu.classList.add('menu-send', options.openSide);\n\n attachContextMenuListener({\n element: options.onContextElement,\n callback: (e) => {\n if(options.onOpen && !options.onOpen()) {\n return;\n }\n\n this.sendMenuButtons.forEach((button) => {\n button.element.classList.toggle('hide', !button.verify());\n });\n\n cancelEvent(e);\n contextMenuController.openBtnMenu(this.sendMenu);\n },\n listenerSetter: options.listenerSetter\n });\n }\n\n public setPeerId(peerId: PeerId) {\n this.type = peerId === rootScope.myId ? 'reminder' : 'schedule';\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 PopupElement from '.';\nimport CheckboxField from '../checkboxField';\nimport InputField from '../inputField';\nimport RadioField from '../radioField';\nimport Scrollable from '../scrollable';\nimport SendContextMenu from '../chat/sendContextMenu';\nimport I18n, {_i18n} from '../../lib/langPack';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport isInputEmpty from '../../helpers/dom/isInputEmpty';\nimport whichChild from '../../helpers/dom/whichChild';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport {Poll} from '../../layer';\nimport getRichValueWithCaret from '../../helpers/dom/getRichValueWithCaret';\n\nconst MAX_LENGTH_QUESTION = 255;\nconst MAX_LENGTH_OPTION = 100;\nconst MAX_LENGTH_SOLUTION = 200;\n\nexport default class PopupCreatePoll extends PopupElement {\n private questionInputField: InputField;\n private questions: HTMLElement;\n protected scrollable: Scrollable;\n private tempId = 0;\n\n private anonymousCheckboxField: CheckboxField;\n private multipleCheckboxField: PopupCreatePoll['anonymousCheckboxField'];\n private quizCheckboxField: PopupCreatePoll['anonymousCheckboxField'];\n\n private correctAnswers: Uint8Array[];\n private quizSolutionField: InputField;\n private optionInputFields: InputField[];\n\n constructor(private chat: Chat) {\n super('popup-create-poll popup-new-media', {closable: true, withConfirm: 'Create', body: true, title: 'NewPoll'});\n this.construct();\n }\n\n private async construct() {\n this.questionInputField = new InputField({\n placeholder: 'AskAQuestion',\n label: 'AskAQuestion',\n name: 'question',\n maxLength: MAX_LENGTH_QUESTION\n });\n\n this.listenerSetter.add(this.questionInputField.input)('input', () => {\n this.handleChange();\n });\n\n this.optionInputFields = [];\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 });\n\n sendMenu.setPeerId(this.chat.peerId);\n\n this.header.append(sendMenu.sendMenu);\n }\n\n this.header.append(this.questionInputField.container);\n\n const hr = document.createElement('hr');\n const d = document.createElement('div');\n d.classList.add('caption');\n _i18n(d, 'PollOptions');\n\n this.questions = document.createElement('form');\n this.questions.classList.add('poll-create-questions');\n\n const dd = document.createElement('div');\n dd.classList.add('poll-create-settings');\n\n const settingsCaption = document.createElement('div');\n settingsCaption.classList.add('caption');\n _i18n(settingsCaption, 'Settings');\n\n if(!(await this.chat.managers.appPeersManager.isBroadcast(this.chat.peerId))) {\n this.anonymousCheckboxField = new CheckboxField({\n text: 'NewPoll.Anonymous',\n name: 'anonymous'\n });\n this.anonymousCheckboxField.input.checked = true;\n dd.append(this.anonymousCheckboxField.label);\n }\n\n this.multipleCheckboxField = new CheckboxField({\n text: 'NewPoll.MultipleChoice',\n name: 'multiple'\n });\n this.quizCheckboxField = new CheckboxField({\n text: 'NewPoll.Quiz',\n name: 'quiz'\n });\n\n this.listenerSetter.add(this.multipleCheckboxField.input)('change', () => {\n const checked = this.multipleCheckboxField.input.checked;\n this.quizCheckboxField.input.toggleAttribute('disabled', checked);\n });\n\n this.listenerSetter.add(this.quizCheckboxField.input)('change', () => {\n const checked = this.quizCheckboxField.input.checked;\n\n (Array.from(this.questions.children) as HTMLElement[]).map((el) => {\n el.classList.toggle('radio-field', checked);\n });\n\n if(!checked) {\n this.correctAnswers = undefined;\n this.quizSolutionField.setValueSilently('');\n }\n\n quizElements.forEach((el) => el.classList.toggle('hide', !checked));\n\n this.multipleCheckboxField.input.toggleAttribute('disabled', checked);\n this.handleChange();\n });\n\n dd.append(this.multipleCheckboxField.label, this.quizCheckboxField.label);\n\n const quizElements: HTMLElement[] = [];\n\n const quizSolutionCaption = document.createElement('div');\n quizSolutionCaption.classList.add('caption');\n _i18n(quizSolutionCaption, 'AccDescrQuizExplanation');\n\n const quizHr = document.createElement('hr');\n\n const quizSolutionContainer = document.createElement('div');\n quizSolutionContainer.classList.add('poll-create-questions');\n\n this.quizSolutionField = new InputField({\n placeholder: 'NewPoll.Explanation.Placeholder',\n label: 'NewPoll.Explanation.Placeholder',\n name: 'solution',\n maxLength: MAX_LENGTH_SOLUTION\n });\n\n this.listenerSetter.add(this.questionInputField.input)('input', () => {\n this.handleChange();\n });\n\n const quizSolutionSubtitle = document.createElement('div');\n quizSolutionSubtitle.classList.add('subtitle');\n _i18n(quizSolutionSubtitle, 'AddAnExplanationInfo');\n\n quizSolutionContainer.append(this.quizSolutionField.container, quizSolutionSubtitle);\n\n quizElements.push(quizHr, quizSolutionCaption, quizSolutionContainer);\n quizElements.forEach((el) => el.classList.add('hide'));\n\n this.body.parentElement.insertBefore(hr, this.body);\n this.body.append(d, this.questions, document.createElement('hr'), settingsCaption, dd, ...quizElements);\n\n attachClickEvent(this.btnConfirm, this.onSubmitClick, {listenerSetter: this.listenerSetter});\n\n this.scrollable = new Scrollable(this.body);\n this.appendMoreField();\n\n this.onEscape = () => {\n return !this.getFilledAnswers().length;\n };\n\n this.handleChange();\n }\n\n private getFilledAnswers() {\n const answers = Array.from(this.questions.children).map((el, idx) => {\n const input = el.querySelector('.input-field-input') as HTMLElement;\n return input instanceof HTMLInputElement ? input.value : getRichValueWithCaret(input, false, false).value;\n }).filter((v) => !!v.trim());\n\n return answers;\n }\n\n private onSubmitClick = () => {\n this.send();\n };\n\n private validate() {\n const question = this.questionInputField.value;\n if(!question) {\n return false;\n }\n\n if(question.length > MAX_LENGTH_QUESTION) {\n return false;\n }\n\n if(this.quizCheckboxField.input.checked && !this.correctAnswers?.length) {\n return false;\n }\n\n const answers = this.getFilledAnswers();\n if(answers.length < 2) {\n return false;\n }\n\n const tooLongOption = answers.find((a) => a.length > MAX_LENGTH_OPTION);\n if(tooLongOption) {\n return false;\n }\n\n const {value: quizSolution} = getRichValueWithCaret(this.quizSolutionField.input, false, false);\n if(quizSolution.length > MAX_LENGTH_SOLUTION) {\n return false;\n }\n\n return true;\n }\n\n private handleChange() {\n const valid = this.validate();\n this.btnConfirm.toggleAttribute('disabled', !valid);\n }\n\n public async send(force = false) {\n const question = this.questionInputField.value;\n\n const answers = this.getFilledAnswers();\n\n const {value: quizSolution, entities: quizSolutionEntities} = getRichValueWithCaret(this.quizSolutionField.input, true, false);\n\n if(this.chat.type === 'scheduled' && !force) {\n this.chat.input.scheduleSending(() => {\n this.send(true);\n });\n\n return;\n }\n\n this.hide();\n\n // const randomID = [nextRandomInt(0xFFFFFFFF), nextRandomInt(0xFFFFFFFF)];\n // const randomIDS = bigint(randomID[0]).shiftLeft(32).add(bigint(randomID[1])).toString();\n\n const pFlags: Poll['pFlags'] = {};\n\n if(this.anonymousCheckboxField && !this.anonymousCheckboxField.input.checked) {\n pFlags.public_voters = true;\n }\n\n if(this.multipleCheckboxField.input.checked) {\n pFlags.multiple_choice = true;\n }\n\n if(this.quizCheckboxField.input.checked) {\n pFlags.quiz = true;\n }\n\n const poll: Poll = {\n _: 'poll',\n pFlags,\n question,\n answers: answers.map((value, idx) => {\n return {\n _: 'pollAnswer',\n text: value,\n option: new Uint8Array([idx])\n };\n }),\n id: undefined\n };\n // poll.id = randomIDS;\n\n const inputMediaPoll = await this.chat.managers.appPollsManager.getInputMediaPoll(poll, this.correctAnswers, quizSolution, quizSolutionEntities);\n\n // console.log('Will try to create poll:', inputMediaPoll);\n\n this.chat.managers.appMessagesManager.sendOther(this.chat.peerId, inputMediaPoll, {\n ...this.chat.getMessageSendingParams()\n });\n\n if(this.chat.input.helperType === 'reply') {\n this.chat.input.clearHelper();\n }\n\n this.chat.input.onMessageSent(false, false);\n }\n\n onInput = (e: Event) => {\n const target = e.target as HTMLInputElement;\n\n const radioLabel = findUpTag(target, 'LABEL');\n const isEmpty = isInputEmpty(target);\n if(!isEmpty) {\n target.parentElement.classList.add('is-filled');\n radioLabel.classList.remove('hidden-widget');\n radioLabel.firstElementChild.removeAttribute('disabled');\n }\n\n const isLast = !radioLabel.nextElementSibling;\n if(isLast && !isEmpty && this.questions.childElementCount < 10) {\n this.appendMoreField();\n }\n\n this.handleChange();\n };\n\n onDeleteClick = (e: MouseEvent) => {\n const target = e.target as HTMLSpanElement;\n const label = findUpTag(target, 'LABEL');\n const idx = whichChild(label);\n\n if(this.correctAnswers && this.correctAnswers[0][0] === idx) {\n this.correctAnswers = undefined;\n }\n\n label.remove();\n this.optionInputFields.splice(idx, 1);\n\n this.optionInputFields.forEach((inputField, idx) => {\n inputField.options.labelOptions.length = 0;\n inputField.options.labelOptions.push(idx + 1);\n const i18nElement = I18n.weakMap.get(inputField.label.firstElementChild as HTMLElement);\n i18nElement.update();\n });\n\n this.handleChange();\n };\n\n private appendMoreField() {\n const tempId = this.tempId++;\n const idx = this.questions.childElementCount + 1;\n const questionField = new InputField({\n placeholder: 'NewPoll.OptionsAddOption',\n label: 'NewPoll.OptionLabel',\n labelOptions: [idx],\n name: 'question-' + tempId,\n maxLength: MAX_LENGTH_OPTION\n });\n this.listenerSetter.add(questionField.input)('input', this.onInput);\n\n const radioField = new RadioField({\n text: '',\n name: 'question'\n });\n radioField.main.append(questionField.container);\n attachClickEvent(questionField.input, cancelEvent, {listenerSetter: this.listenerSetter});\n radioField.label.classList.add('hidden-widget');\n radioField.input.disabled = true;\n if(!this.quizCheckboxField.input.checked) {\n radioField.label.classList.remove('radio-field');\n }\n this.listenerSetter.add(radioField.input)('change', () => {\n const checked = radioField.input.checked;\n if(checked) {\n const idx = whichChild(radioField.label);\n this.correctAnswers = [new Uint8Array([idx])];\n this.handleChange();\n }\n });\n\n const deleteBtn = document.createElement('span');\n deleteBtn.classList.add('btn-icon', 'tgico-close');\n questionField.container.append(deleteBtn);\n\n attachClickEvent(deleteBtn, this.onDeleteClick, {listenerSetter: this.listenerSetter, once: true});\n\n this.questions.append(radioField.label);\n\n this.scrollable.scrollIntoViewNew({\n element: this.questions.lastElementChild as HTMLElement,\n position: 'center'\n });\n // this.scrollable.scrollTo(this.scrollable.scrollHeight, 'top', true, true);\n\n this.optionInputFields.push(questionField);\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 pause from './schedulers/pause';\nimport {makeMediaSize} from './mediaSize';\nimport scaleMediaElement from './canvas/scaleMediaElement';\nimport preloadVideo from './preloadVideo';\n\nexport function createPosterFromMedia(media: HTMLVideoElement | HTMLImageElement) {\n let width: number, height: number;\n if(media instanceof HTMLVideoElement) {\n width = media.videoWidth;\n height = media.videoHeight;\n } else {\n width = media.naturalWidth;\n height = media.naturalHeight;\n }\n\n return scaleMediaElement({\n media,\n mediaSize: makeMediaSize(width, height),\n boxSize: makeMediaSize(320, 240),\n quality: .9\n });\n}\n\nexport function createPosterFromVideo(video: HTMLVideoElement): ReturnType {\n return new Promise((resolve, reject) => {\n video.onseeked = () => {\n video.onseeked = () => {\n createPosterFromMedia(video).then(resolve);\n\n video.onseeked = undefined;\n };\n\n video.currentTime = 0;\n };\n\n video.onerror = reject;\n video.currentTime = Math.min(video.duration, 1);\n });\n}\n\nexport async function createPosterForVideo(url: string) {\n const video = await preloadVideo(url);\n\n return Promise.race([\n pause(2000) as Promise,\n createPosterFromVideo(video)\n ]);\n}\n\n\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 {USING_BOMS} from '../helpers/dom/richInputHandler';\nimport BOM from '../helpers/string/bom';\nimport {_i18n} from '../lib/langPack';\nimport InputField, {InputFieldOptions} from './inputField';\nimport SetTransition from './singleTransition';\n\nconst USELESS_REG_EXP = new RegExp(`(${BOM})|()`, 'g');\n\nexport default class InputFieldAnimated extends InputField {\n public inputFake: HTMLElement;\n public onChangeHeight: (height: number) => void;\n\n // public onLengthChange: (length: number, isOverflow: boolean) => void;\n // protected wasInputFakeClientHeight: number;\n // protected showScrollDebounced: () => void;\n\n constructor(options?: InputFieldOptions) {\n super(options);\n\n this.input.addEventListener('input', () => {\n this.updateInnerHTML();\n this.onFakeInput();\n });\n\n if(options.placeholder) {\n _i18n(this.inputFake, options.placeholder, undefined, 'placeholder');\n }\n\n this.input.classList.add('scrollable', 'scrollable-y', 'no-scrollbar');\n // this.wasInputFakeClientHeight = 0;\n // this.showScrollDebounced = debounce(() => this.input.classList.remove('no-scrollbar'), 150, false, true);\n this.inputFake = document.createElement('div');\n // this.inputFake.contentEditable = 'true';\n this.inputFake.contentEditable = 'true';\n this.inputFake.tabIndex = -1;\n this.inputFake.className = this.input.className + ' input-field-input-fake';\n }\n\n public onFakeInput(setHeight = true) {\n const {scrollHeight: newHeight/* , clientHeight */} = this.inputFake;\n /* if(this.wasInputFakeClientHeight && this.wasInputFakeClientHeight !== clientHeight) {\n this.input.classList.add('no-scrollbar'); // ! ะฒ ัะฐั„ะฐั€ะธ ะผะพะถะตั‚ ะฒะพะพะฑั‰ะต ะฝะต ะฟะพัะฒะธั‚ัŒัั ัะบั€ะพะปะป ะฟะพัะปะต ะฐะฝะธะผะฐั†ะธะธ, ั‚ะฐะบ ะบะฐะบ ะตะผัƒ ะฝัƒะถะตะฝ ะฟะพะปะฝั‹ะน reflow ะฑะปะพะบะฐ ั overflow.\n this.showScrollDebounced();\n } */\n\n const currentHeight = +this.input.style.height.replace('px', '');\n if(currentHeight === newHeight) {\n return;\n }\n\n const TRANSITION_DURATION_FACTOR = 50;\n const transitionDuration = Math.round(\n TRANSITION_DURATION_FACTOR * Math.log(Math.abs(newHeight - currentHeight))\n );\n\n // this.wasInputFakeClientHeight = clientHeight;\n this.input.style.transitionDuration = `${transitionDuration}ms`;\n\n if(setHeight) {\n this.onChangeHeight?.(newHeight);\n this.input.style.height = newHeight ? newHeight + 'px' : '';\n }\n\n const className = 'is-changing-height';\n SetTransition({\n element: this.input,\n className,\n forwards: true,\n duration: transitionDuration,\n onTransitionEnd: () => {\n this.input.classList.remove(className);\n }\n });\n }\n\n protected updateInnerHTML(innerHTML = this.input.innerHTML) {\n innerHTML = innerHTML.replace(//, '')\n .replace(/().+?\\/custom-emoji-element>/g, '$1')\n\n if(USING_BOMS) {\n innerHTML = innerHTML.replace(USELESS_REG_EXP, '');\n }\n\n this.inputFake.innerHTML = innerHTML;\n }\n\n public setValueSilently(value: Parameters[0], fromSet?: boolean) {\n super.setValueSilently(value, fromSet);\n\n this.updateInnerHTML();\n if(!fromSet) {\n this.onFakeInput();\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 Chat from '../chat/chat';\nimport type {SendFileDetails} from '../../lib/appManagers/appMessagesManager';\nimport PopupElement from '.';\nimport Scrollable from '../scrollable';\nimport {toast} from '../toast';\nimport SendContextMenu from '../chat/sendContextMenu';\nimport {createPosterFromMedia, createPosterFromVideo} from '../../helpers/createPoster';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport I18n, {FormatterArguments, i18n, LangPackKey} from '../../lib/langPack';\nimport calcImageInBox from '../../helpers/calcImageInBox';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\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';\nimport createVideo from '../../helpers/dom/createVideo';\nimport prepareAlbum from '../prepareAlbum';\nimport {makeMediaSize, MediaSize} from '../../helpers/mediaSize';\nimport {ThumbCache} from '../../lib/storages/thumbs';\nimport onMediaLoad from '../../helpers/onMediaLoad';\nimport apiManagerProxy from '../../lib/mtproto/mtprotoworker';\nimport {THUMB_TYPE_FULL} from '../../lib/mtproto/mtproto_config';\nimport wrapDocument from '../wrappers/document';\nimport createContextMenu from '../../helpers/dom/createContextMenu';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport wrapMediaSpoiler, {toggleMediaSpoiler} from '../wrappers/mediaSpoiler';\nimport {MiddlewareHelper} from '../../helpers/middleware';\nimport {AnimationItemGroup} from '../animationIntersector';\nimport scaleMediaElement from '../../helpers/canvas/scaleMediaElement';\nimport {doubleRaf} from '../../helpers/schedulers';\nimport defineNotNumerableProperties from '../../helpers/object/defineNotNumerableProperties';\nimport {Photo, PhotoSize} from '../../layer';\nimport {getPreviewBytesFromURL} from '../../helpers/bytes/getPreviewURLFromBytes';\nimport {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\nimport ButtonMenuToggle from '../buttonMenuToggle';\nimport partition from '../../helpers/array/partition';\nimport InputFieldAnimated from '../inputFieldAnimated';\n\ntype SendFileParams = SendFileDetails & {\n file?: File,\n scaledBlob?: Blob,\n noSound?: boolean,\n itemDiv: HTMLElement,\n mediaSpoiler?: HTMLElement,\n middlewareHelper: MiddlewareHelper\n // strippedBytes?: PhotoSize.photoStrippedSize['bytes']\n};\n\nlet currentPopup: PopupNewMedia;\n\nconst MAX_WIDTH = 400 - 16;\n\nexport function getCurrentNewMediaPopup() {\n return currentPopup;\n}\n\nexport default class PopupNewMedia extends PopupElement {\n private mediaContainer: HTMLElement;\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 messageInputField: InputFieldAnimated;\n private captionLengthMax: number;\n\n private animationGroup: AnimationItemGroup;\n private _scrollable: Scrollable;\n private inputContainer: HTMLDivElement;\n\n constructor(\n private chat: Chat,\n private files: File[],\n willAttachType: PopupNewMedia['willAttach']['type'],\n private ignoreInputValue?: boolean\n ) {\n super('popup-send-photo popup-new-media', {\n closable: true,\n withConfirm: 'Modal.Send',\n confirmShortcutIsSendShortcut: true,\n body: true,\n title: true,\n scrollable: true\n });\n\n this.animationGroup = '';\n this.construct(willAttachType);\n }\n\n private async construct(willAttachType: PopupNewMedia['willAttach']['type']) {\n this.willAttach = {\n type: willAttachType,\n sendFileDetails: [],\n group: true\n };\n\n const captionMaxLength = await this.managers.apiManager.getLimit('caption');\n this.captionLengthMax = captionMaxLength;\n\n attachClickEvent(this.btnConfirm, () => this.send(), {listenerSetter: this.listenerSetter});\n\n const btnMenu = await ButtonMenuToggle({\n listenerSetter: this.listenerSetter,\n direction: 'bottom-left',\n buttons: [{\n icon: 'image',\n text: 'Popup.Attach.AsMedia',\n onClick: () => this.changeType('media'),\n verify: () => this.hasAnyMedia() && this.willAttach.type === 'document'\n }, {\n icon: 'document',\n text: 'SendAsFile',\n onClick: () => this.changeType('document'),\n verify: () => this.files.length === 1 && this.willAttach.type !== 'document'\n }, {\n icon: 'document',\n text: 'SendAsFiles',\n onClick: () => this.changeType('document'),\n verify: () => this.files.length > 1 && this.willAttach.type !== 'document'\n }, {\n icon: 'groupmedia',\n text: 'Popup.Attach.GroupMedia',\n onClick: () => this.changeGroup(true),\n verify: () => !this.willAttach.group && this.canGroupSomething()\n }, {\n icon: 'groupmediaoff',\n text: 'Popup.Attach.UngroupMedia',\n onClick: () => this.changeGroup(false),\n verify: () => this.willAttach.group && this.canGroupSomething()\n }, {\n icon: 'mediaspoiler',\n text: 'EnablePhotoSpoiler',\n onClick: () => this.changeSpoilers(true),\n verify: () => this.canToggleSpoilers(true, true)\n }, {\n icon: 'mediaspoiler',\n text: 'Popup.Attach.EnableSpoilers',\n onClick: () => this.changeSpoilers(true),\n verify: () => this.canToggleSpoilers(true, false)\n }, {\n icon: 'mediaspoileroff',\n text: 'DisablePhotoSpoiler',\n onClick: () => this.changeSpoilers(false),\n verify: () => this.canToggleSpoilers(false, true)\n }, {\n icon: 'mediaspoileroff',\n text: 'Popup.Attach.RemoveSpoilers',\n onClick: () => this.changeSpoilers(false),\n verify: () => this.canToggleSpoilers(false, false)\n }]\n });\n\n this.header.append(btnMenu);\n\n this.btnConfirm.remove();\n\n this.mediaContainer = document.createElement('div');\n this.mediaContainer.classList.add('popup-photo');\n this.scrollable.container.append(this.mediaContainer);\n\n const inputContainer = this.inputContainer = document.createElement('div');\n inputContainer.classList.add('popup-input-container');\n\n const c = document.createElement('div');\n c.classList.add('popup-input-inputs', 'input-message-container');\n\n this.messageInputField = new InputFieldAnimated({\n placeholder: 'PreviewSender.CaptionPlaceholder',\n name: 'message',\n withLinebreaks: true,\n maxLength: this.captionLengthMax\n });\n\n this.listenerSetter.add(this.scrollable.container)('scroll', this.onScroll);\n this.listenerSetter.add(this.messageInputField.input)('scroll', this.onScroll);\n\n this.messageInputField.input.classList.replace('input-field-input', 'input-message-input');\n this.messageInputField.inputFake.classList.replace('input-field-input', 'input-message-input');\n\n c.append(this.messageInputField.input, this.messageInputField.inputFake);\n inputContainer.append(c, this.btnConfirm);\n\n if(!this.ignoreInputValue) {\n this.messageInputField.value = this.wasInputValue = this.chat.input.messageInputField.input.innerHTML;\n this.chat.input.messageInputField.value = '';\n }\n\n this.container.append(inputContainer);\n\n this.attachFiles();\n\n this.addEventListener('close', () => {\n this.files.length = 0;\n this.willAttach.sendFileDetails.length = 0;\n\n if(currentPopup === this) {\n currentPopup = undefined;\n }\n });\n\n let target: HTMLElement, isMedia: boolean, item: SendFileParams;\n createContextMenu({\n buttons: [{\n icon: 'mediaspoiler',\n text: 'EnablePhotoSpoiler',\n onClick: () => {\n this.applyMediaSpoiler(item);\n },\n verify: () => isMedia && !item.mediaSpoiler\n }, {\n icon: 'mediaspoileroff',\n text: 'DisablePhotoSpoiler',\n onClick: () => {\n this.removeMediaSpoiler(item);\n },\n verify: () => !!(isMedia && item.mediaSpoiler)\n }],\n listenTo: this.mediaContainer,\n listenerSetter: this.listenerSetter,\n findElement: (e) => {\n target = findUpClassName(e.target, 'popup-item');\n isMedia = target.classList.contains('popup-item-media');\n item = this.willAttach.sendFileDetails.find((i) => i.itemDiv === target);\n return target;\n }\n });\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: 'top-left',\n onContextElement: this.btnConfirm,\n listenerSetter: this.listenerSetter\n });\n\n sendMenu.setPeerId(this.chat.peerId);\n\n this.container.append(sendMenu.sendMenu);\n }\n\n currentPopup = this;\n }\n\n private onScroll = () => {\n const {input} = this.messageInputField;\n this.scrollable.onAdditionalScroll();\n if(input.scrollTop > 0 && input.scrollHeight > 130) {\n this.scrollable.container.classList.remove('scrolled-bottom');\n }\n };\n\n private async applyMediaSpoiler(item: SendFileParams, noAnimation?: boolean) {\n const middleware = item.middlewareHelper.get();\n const {width: widthStr, height: heightStr} = item.itemDiv.style;\n\n let width: number, height: number;\n if(item.itemDiv.classList.contains('album-item')) {\n const {width: containerWidthStr, height: containerHeightStr} = item.itemDiv.parentElement.style;\n const containerWidth = parseInt(containerWidthStr);\n const containerHeight = parseInt(containerHeightStr);\n\n width = +widthStr.slice(0, -1) / 100 * containerWidth;\n height = +heightStr.slice(0, -1) / 100 * containerHeight;\n } else {\n width = parseInt(widthStr);\n height = parseInt(heightStr);\n }\n\n const {url} = await scaleMediaElement({\n media: item.itemDiv.firstElementChild as HTMLImageElement,\n boxSize: makeMediaSize(40, 40),\n mediaSize: makeMediaSize(width, height),\n toDataURL: true,\n quality: 0.2\n });\n\n const strippedBytes = getPreviewBytesFromURL(url);\n const photoSize: PhotoSize.photoStrippedSize = {\n _: 'photoStrippedSize',\n bytes: strippedBytes,\n type: 'i'\n };\n\n item.strippedBytes = strippedBytes;\n\n const photo: Photo.photo = {\n _: 'photo',\n sizes: [\n photoSize\n ],\n id: 0,\n access_hash: 0,\n date: 0,\n dc_id: 0,\n file_reference: [],\n pFlags: {}\n };\n\n const mediaSpoiler = await wrapMediaSpoiler({\n middleware,\n width,\n height,\n animationGroup: this.animationGroup,\n media: photo\n });\n\n if(!middleware()) {\n return;\n }\n\n if(!noAnimation) {\n mediaSpoiler.classList.add('is-revealing');\n }\n\n item.mediaSpoiler = mediaSpoiler;\n item.itemDiv.append(mediaSpoiler);\n\n await doubleRaf();\n if(!middleware()) {\n return;\n }\n\n toggleMediaSpoiler({\n mediaSpoiler,\n reveal: false\n });\n }\n\n private removeMediaSpoiler(item: SendFileParams) {\n toggleMediaSpoiler({\n mediaSpoiler: item.mediaSpoiler,\n reveal: true,\n destroyAfter: true\n });\n\n item.mediaSpoiler = undefined;\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 partition() {\n const [media, files] = partition(this.willAttach.sendFileDetails, (d) => MEDIA_MIME_TYPES_SUPPORTED.has(d.file.type));\n return {\n media,\n files\n };\n }\n\n private mediaCount() {\n return this.partition().media.length;\n }\n\n private hasAnyMedia() {\n return this.mediaCount() > 0;\n }\n\n private canGroupSomething() {\n const {media, files} = this.partition();\n return media.length > 1 || files.length > 1;\n }\n\n private canToggleSpoilers(toggle: boolean, single: boolean) {\n let good = this.willAttach.type === 'media' && this.hasAnyMedia();\n if(single && good) {\n good = this.files.length === 1;\n }\n\n if(good) {\n const media = this.willAttach.sendFileDetails\n .filter((d) => MEDIA_MIME_TYPES_SUPPORTED.has(d.file.type))\n const mediaWithSpoilers = media.filter((d) => d.mediaSpoiler);\n\n good = single ? true : media.length > 1;\n\n if(good) {\n good = toggle ? media.length !== mediaWithSpoilers.length : media.length === mediaWithSpoilers.length;\n }\n }\n\n return good;\n }\n\n private changeType(type: PopupNewMedia['willAttach']['type']) {\n this.willAttach.type = type;\n this.attachFiles();\n }\n\n public changeGroup(group: boolean) {\n this.willAttach.group = group;\n this.attachFiles();\n }\n\n public changeSpoilers(toggle: boolean) {\n this.partition().media.forEach((item) => {\n if(toggle && !item.mediaSpoiler) {\n this.applyMediaSpoiler(item);\n } else if(!toggle && item.mediaSpoiler) {\n this.removeMediaSpoiler(item);\n }\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 const {input} = this.messageInputField;\n if(target !== input) {\n if(target.tagName === 'INPUT' || target.isContentEditable) {\n return;\n }\n\n input.focus();\n placeCaretAtEnd(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.messageInputField.value;\n if(caption.length > this.captionLengthMax) {\n toast(I18n.format('Error.PreviewSender.CaptionTooLong', true));\n return;\n }\n\n const willAttach = this.willAttach;\n willAttach.isMedia = willAttach.type === 'media' || undefined;\n const {sendFileDetails, isMedia} = willAttach;\n\n const {peerId, input} = this.chat;\n\n const {length} = sendFileDetails;\n const sendingParams = this.chat.getMessageSendingParams();\n this.iterate((sendFileParams) => {\n if(caption && sendFileParams.length !== length) {\n this.managers.appMessagesManager.sendText(peerId, caption, {\n ...sendingParams,\n clearDraft: true\n });\n\n caption = undefined;\n }\n\n const d: SendFileDetails[] = sendFileParams.map((params) => {\n return {\n ...params,\n file: params.scaledBlob || params.file,\n spoiler: !!params.mediaSpoiler\n };\n });\n\n const w = {\n ...willAttach,\n sendFileDetails: d\n };\n\n this.managers.appMessagesManager.sendAlbum(peerId, Object.assign({\n ...sendingParams,\n caption,\n isMedia,\n clearDraft: true\n }, w));\n\n caption = undefined;\n });\n\n input.replyToMsgId = this.chat.threadId;\n input.onMessageSent();\n this.wasInputValue = undefined;\n\n this.hide();\n }\n\n private modifyMimeTypeForTelegram(mimeType: string) {\n return mimeType === 'image/webp' ? 'image/jpeg' : mimeType;\n }\n\n private async scaleImageForTelegram(image: HTMLImageElement, mimeType: string, convertWebp?: boolean) {\n const PHOTO_SIDE_LIMIT = 2560;\n let url = image.src, scaledBlob: Blob;\n if(\n mimeType !== 'image/gif' &&\n (Math.max(image.naturalWidth, image.naturalHeight) > PHOTO_SIDE_LIMIT || (convertWebp && mimeType === 'image/webp'))\n ) {\n const {blob} = await scaleMediaElement({\n media: image,\n boxSize: makeMediaSize(PHOTO_SIDE_LIMIT, PHOTO_SIDE_LIMIT),\n mediaSize: makeMediaSize(image.naturalWidth, image.naturalHeight),\n mimeType: this.modifyMimeTypeForTelegram(mimeType) as any\n });\n\n scaledBlob = blob;\n URL.revokeObjectURL(url);\n url = await apiManagerProxy.invoke('createObjectURL', blob);\n await renderImageFromUrlPromise(image, url);\n }\n\n return scaledBlob && {url, blob: scaledBlob};\n }\n\n private async attachMedia(params: SendFileParams) {\n const {itemDiv} = params;\n itemDiv.classList.add('popup-item-media');\n\n const file = params.file;\n const isVideo = file.type.startsWith('video/');\n\n if(isVideo) {\n const video = createVideo();\n video.src = params.objectURL = await apiManagerProxy.invoke('createObjectURL', file);\n video.autoplay = true;\n video.controls = false;\n video.muted = true;\n\n video.addEventListener('timeupdate', () => {\n video.pause();\n }, {once: true});\n\n itemDiv.append(video);\n\n let error: Error;\n try {\n await onMediaLoad(video);\n } catch(err) {\n error = err as any;\n }\n\n params.width = video.videoWidth;\n params.height = video.videoHeight;\n params.duration = Math.floor(video.duration);\n\n if(error) {\n throw error;\n }\n\n const audioDecodedByteCount = (video as any).webkitAudioDecodedByteCount;\n if(audioDecodedByteCount !== undefined) {\n params.noSound = !audioDecodedByteCount;\n }\n\n const thumb = await createPosterFromVideo(video);\n params.thumb = {\n url: await apiManagerProxy.invoke('createObjectURL', thumb.blob),\n ...thumb\n };\n } else {\n const img = new Image();\n itemDiv.append(img);\n const url = params.objectURL = await apiManagerProxy.invoke('createObjectURL', file);\n\n await renderImageFromUrlPromise(img, url);\n const mimeType = params.file.type;\n const scaled = await this.scaleImageForTelegram(img, mimeType, true);\n if(scaled) {\n params.objectURL = scaled.url;\n params.scaledBlob = scaled.blob;\n }\n\n params.width = img.naturalWidth;\n params.height = img.naturalHeight;\n\n if(file.type === 'image/gif') {\n params.noSound = true;\n\n return Promise.all([\n getGifDuration(img).then((duration) => {\n params.duration = Math.ceil(duration);\n }),\n\n createPosterFromMedia(img).then(async(thumb) => {\n params.thumb = {\n url: await apiManagerProxy.invoke('createObjectURL', thumb.blob),\n ...thumb\n };\n })\n ]).then(() => {});\n }\n }\n }\n\n private async attachDocument(params: SendFileParams): ReturnType {\n const {itemDiv} = params;\n itemDiv.classList.add('popup-item-document');\n const file = params.file;\n\n const isPhoto = file.type.startsWith('image/');\n const isAudio = file.type.startsWith('audio/');\n if(isPhoto || isAudio || file.size < 20e6) {\n params.objectURL ||= await apiManagerProxy.invoke('createObjectURL', file);\n }\n\n let img: HTMLImageElement;\n if(isPhoto) {\n img = new Image();\n await renderImageFromUrlPromise(img, params.objectURL);\n const scaled = await this.scaleImageForTelegram(img, params.file.type);\n if(scaled) {\n params.objectURL = scaled.url;\n }\n }\n\n const doc = {\n _: 'document',\n file: file,\n file_name: file.name || '',\n size: file.size,\n type: isPhoto ? 'photo' : 'doc'\n } as MyDocument;\n\n let cacheContext: ThumbCache;\n if(params.objectURL) {\n cacheContext = {\n url: params.objectURL,\n downloaded: file.size,\n type: THUMB_TYPE_FULL\n };\n }\n\n const docDiv = await 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 cacheContext\n });\n\n if(isPhoto) {\n params.width = img.naturalWidth;\n params.height = img.naturalHeight;\n }\n\n itemDiv.append(docDiv);\n }\n\n private attachFile = (file: File) => {\n const willAttach = this.willAttach;\n const shouldCompress = this.shouldCompress(file.type);\n\n const itemDiv = document.createElement('div');\n itemDiv.classList.add('popup-item');\n\n const params: SendFileParams = {\n file\n } as any;\n\n // do not pass these properties to worker\n defineNotNumerableProperties(params, ['scaledBlob', 'middlewareHelper', 'itemDiv', 'mediaSpoiler']);\n\n params.middlewareHelper = this.middlewareHelper.get().create();\n params.itemDiv = itemDiv;\n\n const promise = shouldCompress ? this.attachMedia(params) : this.attachDocument(params);\n willAttach.sendFileDetails.push(params);\n return promise.catch((err) => {\n itemDiv.style.backgroundColor = '#000';\n console.error('error rendering file', err);\n });\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.ignoreInputValue && 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(params: SendFileParams) {\n if(this.shouldCompress(params.file.type)) {\n const size = calcImageInBox(params.width, params.height, MAX_WIDTH, 320);\n params.itemDiv.style.width = size.width + 'px';\n params.itemDiv.style.height = size.height + 'px';\n }\n\n this.mediaContainer.append(params.itemDiv);\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\n const oldSendFileDetails = willAttach.sendFileDetails.splice(0, willAttach.sendFileDetails.length);\n oldSendFileDetails.forEach((params) => {\n params.middlewareHelper.destroy();\n });\n\n const promises = files.map((file) => this.attachFile(file));\n\n Promise.all(promises).then(() => {\n mediaContainer.replaceChildren();\n\n if(!files.length) {\n return;\n }\n\n this.setTitle();\n\n this.iterate((sendFileDetails) => {\n const shouldCompress = this.shouldCompress(sendFileDetails[0].file.type);\n if(shouldCompress && 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: MAX_WIDTH,\n minWidth: 100,\n spacing: 4\n });\n\n mediaContainer.append(albumContainer);\n } else {\n sendFileDetails.forEach((params) => {\n this.appendMediaToContainer(params);\n });\n }\n\n if(!shouldCompress) {\n return;\n }\n\n sendFileDetails.forEach((params) => {\n const oldParams = oldSendFileDetails.find((o) => o.file === params.file);\n if(!oldParams) {\n return;\n }\n\n if(oldParams.mediaSpoiler) {\n this.applyMediaSpoiler(params, true);\n }\n });\n });\n }).then(() => {\n this.onRender();\n this.onScroll();\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 fastSmoothScroll from '../fastSmoothScroll';\nimport cancelEvent from './cancelEvent';\nimport {attachClickEvent, detachClickEvent} from './clickEvent';\nimport findUpAsChild from './findUpAsChild';\nimport findUpClassName from './findUpClassName';\n\ntype ArrowKey = 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight';\nconst HANDLE_EVENT = 'keydown';\nconst ACTIVE_CLASS_NAME = 'active';\n\nconst AXIS_Y_KEYS: ArrowKey[] = ['ArrowUp', 'ArrowDown'];\nconst AXIS_X_KEYS: ArrowKey[] = ['ArrowLeft', 'ArrowRight'];\n\nexport type ListNavigationOptions = {\n list: HTMLElement,\n type: 'xy' | 'x' | 'y',\n onSelect: (target: Element) => void | boolean | Promise,\n once: boolean,\n waitForKey?: string[]\n};\n\nexport default function attachListNavigation({list, type, onSelect, once, waitForKey}: ListNavigationOptions) {\n let waitForKeySet = waitForKey?.length ? new Set(waitForKey) : undefined;\n const keyNames = new Set(type === 'xy' ? AXIS_Y_KEYS.concat(AXIS_X_KEYS) : (type === 'x' ? AXIS_X_KEYS : AXIS_Y_KEYS));\n\n let target: Element;\n const getCurrentTarget = () => {\n return target || list.querySelector('.' + ACTIVE_CLASS_NAME) || list.firstElementChild;\n };\n\n const setCurrentTarget = (_target: Element, scrollTo: boolean) => {\n if(target === _target) {\n return;\n }\n\n let hadTarget = false;\n if(target) {\n hadTarget = true;\n target.classList.remove(ACTIVE_CLASS_NAME);\n }\n\n target = _target;\n if(!target) return;\n target.classList.add(ACTIVE_CLASS_NAME);\n\n if(hadTarget && scrollable && scrollTo) {\n fastSmoothScroll({\n container: scrollable,\n element: target as HTMLElement,\n position: 'center',\n forceDuration: 100,\n axis: type === 'x' ? 'x' : 'y'\n });\n }\n };\n\n const getNextTargetX = (currentTarget: Element, isNext: boolean) => {\n let nextTarget: Element;\n if(isNext) nextTarget = currentTarget.nextElementSibling || list.firstElementChild;\n else nextTarget = currentTarget.previousElementSibling || list.lastElementChild;\n\n return nextTarget;\n };\n\n const getNextTargetY = (currentTarget: Element, isNext: boolean) => {\n const property = isNext ? 'nextElementSibling' : 'previousElementSibling';\n const endProperty = isNext ? 'firstElementChild' : 'lastElementChild';\n const currentRect = currentTarget.getBoundingClientRect();\n\n let nextTarget = currentTarget[property] || list[endProperty];\n while(nextTarget !== currentTarget) {\n const targetRect = nextTarget.getBoundingClientRect();\n if(targetRect.x === currentRect.x && targetRect.y !== currentRect.y) {\n break;\n }\n\n nextTarget = nextTarget[property] || list[endProperty];\n }\n\n return nextTarget;\n };\n\n let handleArrowKey: (currentTarget: Element, key: ArrowKey) => Element;\n if(type === 'xy') { // flex-direction: row; flex-wrap: wrap;\n handleArrowKey = (currentTarget, key) => {\n if(key === 'ArrowUp' || key === 'ArrowDown') return getNextTargetY(currentTarget, key === 'ArrowDown');\n else return getNextTargetX(currentTarget, key === 'ArrowRight');\n };\n } else { // flex-direction: row | column;\n handleArrowKey = (currentTarget, key) => getNextTargetX(currentTarget, key === 'ArrowRight' || key === 'ArrowDown');\n }\n\n let onKeyDown = (e: KeyboardEvent) => {\n const key = e.key;\n if(!keyNames.has(key as any)) {\n if(key === 'Enter' || (type !== 'xy' && key === 'Tab')) {\n cancelEvent(e);\n fireSelect(getCurrentTarget());\n }\n\n return;\n }\n\n cancelEvent(e);\n\n if(list.childElementCount > 1) {\n let currentTarget = getCurrentTarget();\n currentTarget = handleArrowKey(currentTarget, key as any);\n setCurrentTarget(currentTarget, true);\n }\n };\n\n const scrollable = findUpClassName(list, 'scrollable');\n list.classList.add('navigable-list');\n\n const onMouseMove = (e: MouseEvent) => {\n const target = findUpAsChild(e.target as HTMLElement, list) as HTMLElement;\n if(!target) {\n return;\n }\n\n setCurrentTarget(target, false);\n };\n\n const onClick = (e: Event) => {\n cancelEvent(e); // cancel keyboard closening\n\n const target = findUpAsChild(e.target as HTMLElement, list) as HTMLElement;\n if(!target) {\n return;\n }\n\n setCurrentTarget(target, false);\n fireSelect(getCurrentTarget());\n };\n\n const fireSelect = async(target: Element) => {\n const canContinue = await onSelect(target);\n if(canContinue !== undefined ? !canContinue : once) {\n detach();\n }\n };\n\n let attached = false;\n const attach = () => {\n if(attached) return;\n attached = true;\n // const input = document.activeElement as HTMLElement;\n // input.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\n document.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\n list.addEventListener('mousemove', onMouseMove, {passive: true});\n attachClickEvent(list, onClick);\n };\n\n const detach = () => {\n if(!attached) return;\n attached = false;\n // input.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\n document.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\n list.removeEventListener('mousemove', onMouseMove);\n detachClickEvent(list, onClick);\n };\n\n const resetTarget = () => {\n if(waitForKeySet) return;\n setCurrentTarget(list.firstElementChild, false);\n };\n\n if(waitForKeySet) {\n const _onKeyDown = onKeyDown;\n onKeyDown = (e) => {\n if(waitForKeySet.has(e.key)) {\n cancelEvent(e);\n\n document.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\n onKeyDown = _onKeyDown;\n document.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\n\n waitForKeySet = undefined;\n resetTarget();\n }\n };\n } else {\n resetTarget();\n }\n\n attach();\n\n return {\n attach,\n detach,\n resetTarget\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 attachListNavigation, {ListNavigationOptions} from '../../helpers/dom/attachListNavigation';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport {IS_MOBILE} from '../../environment/userAgent';\nimport rootScope from '../../lib/rootScope';\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\nimport SetTransition from '../singleTransition';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport safeAssign from '../../helpers/object/safeAssign';\n\nexport default class AutocompleteHelper extends EventListenerBase<{\n hidden: () => void,\n visible: () => void,\n hiding: () => void\n}> {\n protected hidden = true;\n protected container: HTMLElement;\n protected list: HTMLElement;\n protected resetTarget: () => void;\n protected attach: () => void;\n protected detach: () => void;\n protected init?(): void;\n\n protected controller: AutocompleteHelperController;\n protected listType: 'xy' | 'x' | 'y';\n protected onSelect: ListNavigationOptions['onSelect'];\n protected waitForKey?: string[];\n\n protected navigationItem: NavigationItem;\n\n constructor(options: {\n appendTo: HTMLElement,\n controller?: AutocompleteHelper['controller'],\n listType: AutocompleteHelper['listType'],\n onSelect: AutocompleteHelper['onSelect'],\n waitForKey?: AutocompleteHelper['waitForKey']\n }) {\n super(false);\n\n safeAssign(this, options);\n\n this.container = document.createElement('div');\n this.container.classList.add('autocomplete-helper', 'z-depth-1');\n\n options.appendTo.append(this.container);\n\n this.attachNavigation();\n\n this.controller && this.controller.addHelper(this);\n }\n\n public toggleListNavigation(enabled: boolean) {\n if(enabled) {\n this.attach && this.attach();\n } else {\n this.detach && this.detach();\n }\n }\n\n protected onVisible = () => {\n if(this.detach) { // it can be so because 'visible' calls before animation's end\n this.detach();\n }\n\n const list = this.list;\n const {attach, detach, resetTarget} = attachListNavigation({\n list,\n type: this.listType,\n onSelect: this.onSelect,\n once: true,\n waitForKey: this.waitForKey\n });\n\n this.attach = attach;\n this.detach = detach;\n this.resetTarget = resetTarget;\n if(!IS_MOBILE && !this.navigationItem) {\n this.navigationItem = {\n type: 'autocomplete-helper',\n onPop: () => {\n this.navigationItem = undefined;\n this.toggle(true);\n },\n noBlurOnPop: true\n };\n\n appNavigationController.pushItem(this.navigationItem);\n }\n\n this.addEventListener('hidden', () => {\n this.resetTarget = undefined;\n this.attach = undefined;\n this.detach = undefined;\n\n list.innerHTML = '';\n detach();\n\n if(this.navigationItem) {\n appNavigationController.removeItem(this.navigationItem);\n this.navigationItem = undefined;\n }\n }, {once: true});\n };\n\n protected attachNavigation() {\n this.addEventListener('visible', this.onVisible);\n }\n\n public toggle(hide?: boolean, fromController = false, skipAnimation?: boolean) {\n if(this.init) {\n return;\n }\n\n if(hide === undefined) {\n hide = this.container.classList.contains('is-visible') && !this.container.classList.contains('backwards');\n }\n\n if(this.hidden === hide) {\n if(!hide) {\n this.dispatchEvent('visible'); // reset target and listener\n }\n\n return;\n }\n\n this.hidden = hide;\n\n if(!hide) {\n this.controller && this.controller.hideOtherHelpers(this);\n this.dispatchEvent('visible'); // fire it before so target will be set\n } else {\n if(this.navigationItem) {\n appNavigationController.removeItem(this.navigationItem);\n this.navigationItem = undefined;\n }\n\n if(!fromController && this.controller) {\n this.controller.hideOtherHelpers();\n }\n\n if(this.detach) { // force detach here\n this.detach();\n }\n }\n\n const useRafs = this.controller || hide ? 0 : 2;\n\n if(hide) {\n this.dispatchEvent('hiding');\n }\n\n SetTransition({\n element: this.container,\n className: 'is-visible',\n forwards: !hide,\n duration: rootScope.settings.animationsEnabled && !skipAnimation ? 300 : 0,\n onTransitionEnd: () => {\n this.hidden && this.dispatchEvent('hidden');\n },\n useRafs\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 Chat from './chat';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport preloadAnimatedEmojiSticker from '../../helpers/preloadAnimatedEmojiSticker';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport rootScope from '../../lib/rootScope';\nimport {EmoticonsDropdown} from '../emoticonsDropdown';\nimport {SuperStickerRenderer} from '../emoticonsDropdown/tabs/stickers';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport Scrollable from '../scrollable';\nimport attachStickerViewerListeners from '../stickerViewer';\nimport AutocompleteHelper from './autocompleteHelper';\nimport AutocompleteHelperController from './autocompleteHelperController';\n\nexport default class StickersHelper extends AutocompleteHelper {\n private scrollable: Scrollable;\n private superStickerRenderer: SuperStickerRenderer;\n private lazyLoadQueue: LazyLoadQueue;\n private onChangeScreen: () => void;\n private listenerSetter: ListenerSetter;\n\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n private chat: Chat,\n private managers: AppManagers\n ) {\n super({\n appendTo,\n controller,\n listType: 'xy',\n onSelect: async(target) => {\n return !(await EmoticonsDropdown.onMediaClick({target}, true));\n },\n waitForKey: ['ArrowUp', 'ArrowDown']\n });\n\n this.container.classList.add('stickers-helper');\n\n this.addEventListener('visible', () => {\n setTimeout(() => { // it is not rendered yet\n this.scrollable.container.scrollTop = 0;\n }, 0);\n\n rootScope.dispatchEvent('choosing_sticker', true);\n });\n\n this.addEventListener('hidden', () => {\n if(this.onChangeScreen) {\n mediaSizes.removeEventListener('changeScreen', this.onChangeScreen);\n this.onChangeScreen = undefined;\n\n this.listenerSetter.removeAll();\n this.listenerSetter = undefined;\n }\n\n rootScope.dispatchEvent('choosing_sticker', false);\n });\n }\n\n public checkEmoticon(emoticon: string) {\n const middleware = this.controller.getMiddleware();\n\n if(this.lazyLoadQueue) {\n this.lazyLoadQueue.clear();\n }\n\n preloadAnimatedEmojiSticker(emoticon);\n this.managers.appStickersManager.getStickersByEmoticon(emoticon)\n .then((stickers) => {\n if(!middleware()) {\n return;\n }\n\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n const container = this.list.cloneNode() as HTMLElement;\n\n let ready: Promise;\n\n this.lazyLoadQueue.clear();\n if(stickers.length) {\n ready = new Promise((resolve) => {\n const promises: Promise[] = [];\n stickers.forEach((sticker) => {\n container.append(this.superStickerRenderer.renderSticker(sticker as MyDocument, undefined, promises));\n });\n\n (Promise.all(promises) as Promise).finally(resolve);\n });\n } else {\n ready = Promise.resolve();\n }\n\n ready.then(() => {\n this.list.replaceWith(container);\n this.list = container;\n\n if(!this.onChangeScreen) {\n this.onChangeScreen = () => {\n const width = (this.list.childElementCount * mediaSizes.active.popupSticker.width) + (this.list.childElementCount - 1 * 1);\n this.list.style.width = width + 'px';\n };\n mediaSizes.addEventListener('changeScreen', this.onChangeScreen);\n\n this.listenerSetter = new ListenerSetter();\n attachStickerViewerListeners({listenTo: this.container, listenerSetter: this.listenerSetter});\n }\n\n this.onChangeScreen();\n\n this.toggle(!stickers.length);\n this.scrollable.scrollTop = 0;\n });\n });\n }\n\n public init() {\n this.list = document.createElement('div');\n this.list.classList.add('stickers-helper-stickers', 'super-stickers');\n\n this.container.append(this.list);\n\n this.scrollable = new Scrollable(this.container);\n this.lazyLoadQueue = new LazyLoadQueue();\n this.superStickerRenderer = new SuperStickerRenderer(this.lazyLoadQueue, this.chat.animationGroup, this.managers);\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 {SEND_WHEN_ONLINE_TIMESTAMP} from '../../lib/mtproto/constants';\nimport Button from '../button';\nimport PopupDatePicker from './datePicker';\n\nconst getMinDate = () => {\n const date = new Date();\n // date.setDate(date.getDate() - 1);\n date.setHours(0, 0, 0, 0);\n return date;\n};\n\nconst getMaxDate = () => {\n const date = new Date();\n date.setFullYear(date.getFullYear() + 1);\n date.setDate(date.getDate() - 1);\n return date;\n};\n\nconst checkDate = (date: Date) => {\n return date.getTime() > getMaxDate().getTime() ? new Date() : date;\n};\n\nexport default class PopupSchedule extends PopupDatePicker {\n constructor(initDate: Date, onPick: (timestamp: number) => void, canSendWhenOnline: boolean) {\n super(checkDate(initDate), onPick, {\n noButtons: true,\n noTitle: true,\n closable: true,\n withConfirm: true,\n minDate: getMinDate(),\n maxDate: getMaxDate(),\n withTime: true,\n showOverflowMonths: true,\n confirmShortcutIsSendShortcut: true,\n title: true\n });\n\n this.element.classList.add('popup-schedule');\n this.header.append(this.controlsDiv);\n this.title.replaceWith(this.monthTitle);\n this.body.append(this.btnConfirm);\n\n if(canSendWhenOnline) {\n const btnSendWhenOnline = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Schedule.SendWhenOnline'});\n this.body.append(btnSendWhenOnline);\n\n attachClickEvent(btnSendWhenOnline, () => {\n onPick(SEND_WHEN_ONLINE_TIMESTAMP);\n this.hide();\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 ChatInput from './input';\nimport {appendEmoji, getEmojiFromElement} from '../emoticonsDropdown/tabs/emoji';\nimport {ScrollableX} from '../scrollable';\nimport AutocompleteHelper from './autocompleteHelper';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nexport default class EmojiHelper extends AutocompleteHelper {\n private scrollable: ScrollableX;\n\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n chatInput: ChatInput,\n private managers: AppManagers\n ) {\n super({\n appendTo,\n controller,\n listType: 'x',\n onSelect: (target) => {\n chatInput.onEmojiSelected(getEmojiFromElement(target as any), true);\n }\n });\n\n this.container.classList.add('emoji-helper');\n }\n\n public init() {\n this.list = document.createElement('div');\n this.list.classList.add('emoji-helper-emojis', 'super-emojis');\n\n this.container.append(this.list);\n\n this.scrollable = new ScrollableX(this.container);\n\n this.addEventListener('visible', () => {\n setTimeout(() => { // it is not rendered yet\n this.scrollable.container.scrollLeft = 0;\n }, 0);\n });\n }\n\n public render(emojis: string[], waitForKey: boolean) {\n if(this.init) {\n if(!emojis.length) {\n return;\n }\n\n this.init();\n this.init = null;\n }\n\n emojis = emojis.slice(0, 80);\n\n if(emojis.length) {\n this.list.innerHTML = '';\n emojis.forEach((emoji) => {\n appendEmoji(emoji, this.list, false, true);\n });\n }\n\n this.waitForKey = waitForKey ? ['ArrowUp', 'ArrowDown'] : undefined;\n this.toggle(!emojis.length);\n\n /* window.requestAnimationFrame(() => {\n this.container.style.width = (3 * 2) + (emojis.length * 44) + 'px';\n }); */\n }\n\n public checkQuery(query: string, firstChar: string) {\n const middleware = this.controller.getMiddleware();\n this.managers.appEmojiManager.getBothEmojiKeywords().then(async() => {\n if(!middleware()) {\n return;\n }\n\n const q = query.replace(/^:/, '');\n const emojis = await this.managers.appEmojiManager.searchEmojis(q);\n if(!middleware()) {\n return;\n }\n\n this.render(emojis, firstChar !== ':');\n // console.log(emojis);\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 wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport AvatarElement from '../avatar';\nimport PeerTitle from '../peerTitle';\nimport Scrollable from '../scrollable';\nimport AutocompleteHelper from './autocompleteHelper';\nimport AutocompleteHelperController from './autocompleteHelperController';\n\nexport default class AutocompletePeerHelper extends AutocompleteHelper {\n protected static BASE_CLASS = 'autocomplete-peer-helper';\n protected static BASE_CLASS_LIST_ELEMENT = AutocompletePeerHelper.BASE_CLASS + '-list-element';\n private scrollable: Scrollable;\n\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n protected className: string,\n onSelect: (target: Element) => boolean | void\n ) {\n super({\n appendTo,\n controller,\n listType: 'y',\n onSelect\n });\n\n this.container.classList.add(AutocompletePeerHelper.BASE_CLASS, className);\n }\n\n public init() {\n this.list = document.createElement('div');\n this.list.classList.add(AutocompletePeerHelper.BASE_CLASS + '-list', this.className + '-list');\n\n this.container.append(this.list);\n\n this.scrollable = new Scrollable(this.container);\n\n this.addEventListener('visible', () => {\n setTimeout(() => { // it is not rendered yet\n this.scrollable.container.scrollTop = 0;\n }, 0);\n });\n }\n\n public render(data: {peerId: PeerId, name?: string, description?: string}[], doNotShow?: boolean) {\n if(this.init) {\n if(!data.length) {\n return;\n }\n\n this.init();\n this.init = null;\n }\n\n if(data.length) {\n this.list.innerHTML = '';\n data.forEach((d) => {\n const div = AutocompletePeerHelper.listElement({\n className: this.className,\n peerId: d.peerId,\n name: d.name,\n description: d.description\n });\n\n this.list.append(div);\n });\n }\n\n if(!doNotShow) {\n this.toggle(!data.length);\n }\n }\n\n public static listElement(options: {\n className: string,\n peerId: PeerId,\n name?: string,\n description?: string\n }) {\n const BASE = AutocompletePeerHelper.BASE_CLASS_LIST_ELEMENT;\n options.className += '-list-element';\n\n const div = document.createElement('div');\n div.classList.add(BASE, options.className);\n div.dataset.peerId = '' + options.peerId;\n\n const avatar = new AvatarElement();\n avatar.classList.add('avatar-30', BASE + '-avatar', options.className + '-avatar');\n avatar.updateWithOptions({\n isDialog: false,\n peerId: options.peerId\n });\n\n const name = document.createElement('div');\n name.classList.add(BASE + '-name', options.className + '-name');\n if(!options.name) {\n name.append(new PeerTitle({\n peerId: options.peerId,\n dialog: false,\n onlyFirstName: false,\n plainText: false\n }).element);\n } else {\n setInnerHTML(name, wrapEmojiText(options.name));\n }\n\n div.append(avatar, name);\n\n if(options.description) {\n const description = document.createElement('div');\n description.classList.add(BASE + '-description', options.className + '-description');\n setInnerHTML(description, wrapEmojiText(options.description));\n div.append(description);\n }\n\n return div;\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 ChatInput from './input';\nimport type {BotInfo, ChatFull, UserFull} from '../../layer';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport AutocompletePeerHelper from './autocompletePeerHelper';\nimport SearchIndex from '../../lib/searchIndex';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nexport function processPeerFullForCommands(peerId: PeerId, full: ChatFull.chatFull | ChatFull.channelFull | UserFull.userFull, query?: string) {\n const botInfos: BotInfo.botInfo[] = [].concat(full.bot_info);\n let index: SearchIndex;\n\n if(query !== undefined) {\n index = new SearchIndex({\n ignoreCase: true\n });\n }\n\n type T = {peerId: PeerId, name: string, description: string, index: number, command: string};\n const commands: Map = new Map();\n botInfos.forEach((botInfo) => {\n if(!botInfo.commands) {\n return;\n }\n\n botInfo.commands.forEach(({command, description}, idx) => {\n const c = '/' + command;\n commands.set(command, {\n peerId: botInfo.user_id ? botInfo.user_id.toPeerId(false) : peerId,\n command: command,\n name: c,\n description: description,\n index: idx\n });\n\n if(index) {\n index.indexObject(command, c);\n }\n });\n });\n\n let out: T[];\n if(!index) {\n out = [...commands.values()];\n } else {\n const found = index.search(query);\n out = Array.from(found).map((command) => commands.get(command));\n }\n\n out = out.sort((a, b) => commands.get(a.command).index - commands.get(b.command).index);\n\n return out;\n}\n\nexport default class CommandsHelper extends AutocompletePeerHelper {\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n chatInput: ChatInput,\n private managers: AppManagers\n ) {\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 async checkQuery(query: string, peerId: PeerId) {\n if(!(await this.managers.appUsersManager.isBot(peerId))) {\n return false;\n }\n\n const middleware = this.controller.getMiddleware();\n this.managers.appProfileManager.getProfileByPeerId(peerId).then((full) => {\n if(!middleware()) {\n return;\n }\n\n const filtered = processPeerFullForCommands(peerId, full, query);\n this.render(filtered);\n // console.log('found commands', found, filtered);\n });\n\n return 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 {getMiddleware} from '../../helpers/middleware';\nimport AutocompleteHelper from './autocompleteHelper';\n\nexport default class AutocompleteHelperController {\n private helpers: Set = new Set();\n private middleware = getMiddleware();\n /* private tempId = 0;\n\n public incrementToggleCount() {\n return ++this.tempId;\n }\n\n public getToggleCount() {\n return this.tempId;\n } */\n\n public toggleListNavigation(enabled: boolean) {\n for(const helper of this.helpers) {\n helper.toggleListNavigation(enabled);\n }\n }\n\n public getMiddleware() {\n this.middleware.clean();\n return this.middleware.get();\n }\n\n public addHelper(helper: AutocompleteHelper) {\n this.helpers.add(helper);\n }\n\n public hideOtherHelpers(preserveHelper?: AutocompleteHelper) {\n this.helpers.forEach((helper) => {\n if(helper !== preserveHelper) {\n helper.toggle(true, true);\n }\n });\n\n if(!preserveHelper) {\n this.middleware.clean();\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 ChatInput from './input';\nimport type {MessageEntity} from '../../layer';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport AutocompletePeerHelper from './autocompletePeerHelper';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerActiveUsernames from '../../lib/appManagers/utils/peers/getPeerActiveUsernames';\nimport rootScope from '../../lib/rootScope';\n\nexport default class MentionsHelper extends AutocompletePeerHelper {\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n chatInput: ChatInput,\n private managers: AppManagers\n ) {\n super(\n appendTo,\n controller,\n 'mentions-helper',\n (target) => {\n const userId = (target as HTMLElement).dataset.peerId.toUserId();\n const user = Promise.resolve(managers.appUsersManager.getUser(userId)).then((user) => {\n let str = '', entity: MessageEntity;\n const usernames = getPeerActiveUsernames(user);\n if(usernames[0]) {\n str = '@' + usernames[0];\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\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.managers.appProfileManager.getMentions(peerId && peerId.toChatId(), trimmed, topMsgId).then(async(peerIds) => {\n if(!middleware()) return;\n\n peerIds = peerIds.filter((peerId) => peerId !== rootScope.myId);\n\n // const username = trimmed.slice(1).toLowerCase();\n\n const p = peerIds.map(async(peerId) => {\n const user = await this.managers.appUsersManager.getUser(peerId);\n const usernames = getPeerActiveUsernames(user);\n // if(usernames.length && usernames.some((_username) => _username.toLowerCase() === username)) { // hide full matched suggestion\n // return;\n // }\n\n return {\n peerId,\n description: usernames[0] ? '@' + usernames[0] : undefined\n };\n });\n\n this.render((await Promise.all(p)).filter(Boolean));\n });\n\n return 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 type ChatInput from './input';\nimport DropdownHover from '../../helpers/dropdownHover';\nimport {KeyboardButton, ReplyMarkup} from '../../layer';\nimport rootScope from '../../lib/rootScope';\nimport ListenerSetter, {Listener} from '../../helpers/listenerSetter';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport findUpAsChild from '../../helpers/dom/findUpAsChild';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {getHeavyAnimationPromise} from '../../hooks/useHeavyAnimationCheck';\nimport confirmationPopup from '../confirmationPopup';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport Scrollable from '../scrollable';\n\nexport default class ReplyKeyboard extends DropdownHover {\n private static BASE_CLASS = 'reply-keyboard';\n private appendTo: HTMLElement;\n private listenerSetter: ListenerSetter;\n private managers: AppManagers;\n private btnHover: HTMLElement;\n private peerId: PeerId;\n private touchListener: Listener;\n private chatInput: ChatInput;\n private scrollable: Scrollable;\n\n constructor(options: {\n listenerSetter: ListenerSetter,\n managers: AppManagers,\n appendTo: HTMLElement,\n btnHover: HTMLElement,\n chatInput: ChatInput\n }) {\n super({\n element: document.createElement('div')\n });\n\n safeAssign(this, options);\n\n this.element.classList.add(ReplyKeyboard.BASE_CLASS);\n this.element.style.display = 'none';\n\n this.scrollable = new Scrollable();\n this.element.append(this.scrollable.container);\n\n this.attachButtonListener(this.btnHover, this.listenerSetter);\n this.listenerSetter.add(rootScope)('history_reply_markup', async({peerId}) => {\n if(this.peerId === peerId) {\n if(this.checkAvailability() && this.isActive()) {\n await this.render();\n }\n\n getHeavyAnimationPromise().then(() => {\n this.checkForceReply();\n });\n }\n });\n }\n\n public init() {\n this.appendTo.append(this.element);\n\n this.listenerSetter.add(this)('open', async() => {\n await this.render();\n\n if(IS_TOUCH_SUPPORTED) {\n this.touchListener = this.listenerSetter.add(document.body)('touchstart', this.onBodyTouchStart, {passive: false, capture: true}) as any as Listener;\n this.listenerSetter.add(this)('close', () => {\n this.listenerSetter.remove(this.touchListener);\n }, {once: true});\n }\n });\n\n attachClickEvent(this.element, (e) => {\n const target = findUpClassName(e.target, 'btn');\n if(!target) {\n return;\n }\n\n const type = target.dataset.type as KeyboardButton['_'];\n const {peerId} = this;\n switch(type) {\n case 'keyboardButtonRequestPhone': {\n confirmationPopup({\n titleLangKey: 'ShareYouPhoneNumberTitle',\n button: {\n langKey: 'OK'\n },\n descriptionLangKey: 'AreYouSureShareMyContactInfoBot'\n }).then(() => {\n this.managers.appMessagesManager.sendContact(peerId, rootScope.myId);\n });\n break;\n }\n\n default: {\n this.managers.appMessagesManager.sendText(peerId, target.dataset.text);\n break;\n }\n }\n\n this.toggle(false);\n }, {listenerSetter: this.listenerSetter});\n\n return super.init();\n }\n\n private onBodyTouchStart = (e: TouchEvent) => {\n const target = e.touches[0].target as HTMLElement;\n if(!findUpAsChild(target, this.element) && target !== this.btnHover) {\n cancelEvent(e);\n this.toggle(false);\n }\n };\n\n public async checkForceReply() {\n const replyMarkup = await this.getReplyMarkup();\n if(replyMarkup._ === 'replyKeyboardForceReply' &&\n !replyMarkup.pFlags.hidden &&\n !replyMarkup.pFlags.used) {\n replyMarkup.pFlags.used = true;\n this.chatInput.initMessageReply(replyMarkup.mid);\n }\n }\n\n private async getReplyMarkup(): Promise {\n return (await this.managers.appMessagesManager.getHistoryStorageTransferable(this.peerId)).replyMarkup ?? {\n _: 'replyKeyboardHide',\n pFlags: {}\n };\n }\n\n public async render(replyMarkup?: ReplyMarkup.replyKeyboardMarkup) {\n if(replyMarkup === undefined) {\n replyMarkup = await this.getReplyMarkup() as any;\n }\n\n this.scrollable.container.replaceChildren();\n\n for(const row of replyMarkup.rows) {\n const div = document.createElement('div');\n div.classList.add(ReplyKeyboard.BASE_CLASS + '-row');\n\n for(const button of row.buttons) {\n const btn = document.createElement('button');\n btn.classList.add(ReplyKeyboard.BASE_CLASS + '-button', 'btn');\n setInnerHTML(btn, wrapEmojiText(button.text));\n btn.dataset.text = button.text;\n btn.dataset.type = button._;\n div.append(btn);\n }\n\n this.scrollable.container.append(div);\n }\n }\n\n public async checkAvailability(replyMarkup?: ReplyMarkup) {\n if(replyMarkup === undefined) {\n replyMarkup = await this.getReplyMarkup();\n }\n\n const hide = replyMarkup._ === 'replyKeyboardHide' || !(replyMarkup as ReplyMarkup.replyInlineMarkup).rows?.length;\n this.btnHover.classList.toggle('hide', hide);\n\n if(hide) {\n this.toggle(false);\n }\n\n return !hide;\n }\n\n public setPeer(peerId: PeerId) {\n this.peerId = peerId;\n\n this.checkAvailability();\n this.checkForceReply();\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';\nimport debounce from '../../helpers/schedulers/debounce';\nimport {WebDocument} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport Scrollable from '../scrollable';\nimport AutocompleteHelper from './autocompleteHelper';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport Button from '../button';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport {MyPhoto} from '../../lib/appManagers/appPhotosManager';\nimport assumeType from '../../helpers/assumeType';\nimport GifsMasonry from '../gifsMasonry';\nimport {SuperStickerRenderer} from '../emoticonsDropdown/tabs/stickers';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport readBlobAsDataURL from '../../helpers/blob/readBlobAsDataURL';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport renderMediaWithFadeIn from '../../helpers/dom/renderMediaWithFadeIn';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\nimport generateQId from '../../lib/appManagers/utils/inlineBots/generateQId';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport {AnimationItemGroup} from '../animationIntersector';\nimport wrapPhoto from '../wrappers/photo';\n\nconst ANIMATION_GROUP: AnimationItemGroup = 'INLINE-HELPER';\n// const GRID_ITEMS = 5;\n\nexport default class InlineHelper extends AutocompleteHelper {\n private scrollable: Scrollable;\n private lazyLoadQueue: LazyLoadQueue;\n private gifsMasonry: GifsMasonry;\n private superStickerRenderer: SuperStickerRenderer;\n private onChangeScreen: () => void;\n public checkQuery: (peerId: PeerId, username: string, query: string) => ReturnType;\n\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n private chat: Chat,\n private managers: AppManagers\n ) {\n super({\n appendTo,\n controller,\n listType: 'xy',\n waitForKey: ['ArrowUp', 'ArrowDown'],\n onSelect: (target) => {\n if(!target) return false; // can happen when there is only button\n const {peerId, botId, queryId} = this.list.dataset;\n return this.chat.input.getReadyToSend(() => {\n const queryAndResultIds = generateQId(queryId, (target as HTMLElement).dataset.resultId);\n this.managers.appInlineBotsManager.sendInlineResult(peerId.toPeerId(), botId, queryAndResultIds, {\n ...this.chat.getMessageSendingParams(),\n clearDraft: true\n });\n\n this.chat.input.onMessageSent(true, true);\n });\n }\n });\n\n this.container.classList.add('inline-helper');\n\n this.addEventListener('visible', () => {\n setTimeout(() => { // it is not rendered yet\n this.scrollable.container.scrollTop = 0;\n }, 0);\n });\n\n this.checkQuery = debounce(this._checkQuery, 200, true, true);\n\n this.addEventListener('hidden', () => {\n if(this.onChangeScreen) {\n mediaSizes.removeEventListener('changeScreen', this.onChangeScreen);\n this.onChangeScreen = undefined;\n }\n });\n }\n\n public _checkQuery = async(peerId: PeerId, username: string, query: string) => {\n const middleware = this.controller.getMiddleware();\n\n const peer = await this.managers.appUsersManager.resolveUsername(username);\n if(!middleware()) {\n throw 'PEER_CHANGED';\n }\n\n if(peer._ !== 'user' || !peer.pFlags.bot) {\n throw 'NOT_A_BOT';\n }\n\n const renderPromise = this.managers.appInlineBotsManager.getInlineResults(peerId, peer.id, query).then((botResults) => {\n if(!middleware()) {\n throw 'PEER_CHANGED';\n }\n\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n const list = this.list.cloneNode() as HTMLElement;\n list.dataset.peerId = '' + peerId;\n list.dataset.botId = '' + peer.id;\n list.dataset.queryId = '' + botResults.query_id;\n\n const gifsMasonry = new GifsMasonry(null, ANIMATION_GROUP, this.scrollable, false);\n\n this.lazyLoadQueue.clear();\n this.superStickerRenderer.clear();\n\n const loadPromises: Promise[] = [];\n const isGallery = !!botResults.pFlags.gallery;\n // botResults.results.length = 3;\n for(const item of botResults.results) {\n const container = document.createElement('div');\n container.classList.add('inline-helper-result');\n container.dataset.resultId = item.id;\n\n const preview = isGallery ? undefined : document.createElement('div');\n if(preview) {\n preview.classList.add('inline-helper-result-preview');\n\n container.append(preview);\n }\n\n list.append(container);\n\n if(!isGallery) {\n preview.classList.add('empty');\n setInnerHTML(preview, wrapEmojiText([...item.title.trim()][0]));\n\n const title = document.createElement('div');\n title.classList.add('inline-helper-result-title');\n setInnerHTML(title, wrapEmojiText(item.title));\n\n const description = document.createElement('div');\n description.classList.add('inline-helper-result-description');\n setInnerHTML(description, wrapRichText(item.description, {\n noCommands: true,\n noLinks: true\n }));\n\n container.append(title, description);\n\n const separator = document.createElement('div');\n separator.classList.add('inline-helper-separator');\n\n list.append(separator);\n } else {\n container.classList.add('grid-item');\n }\n\n if(item._ === 'botInlineResult') {\n if(item.thumb && item.thumb.mime_type.indexOf('image/') === 0) {\n let mediaContainer: HTMLElement;\n if(preview) {\n mediaContainer = document.createElement('div');\n preview.append(mediaContainer);\n } else {\n mediaContainer = container;\n }\n\n mediaContainer.classList.add('media-container');\n isGallery && mediaContainer.classList.add('no-border-radius');\n\n this.lazyLoadQueue.push({\n div: container,\n load: () => {\n return appDownloadManager.download({\n dcId: 4,\n location: {\n _: 'inputWebFileLocation',\n access_hash: (item.thumb as WebDocument.webDocument).access_hash,\n url: item.thumb.url\n },\n size: item.thumb.size,\n mimeType: item.thumb.mime_type\n }).then((blob) => {\n const image = new Image();\n image.classList.add('media-photo');\n readBlobAsDataURL(blob).then((dataURL) => {\n renderMediaWithFadeIn(mediaContainer, image, dataURL, true);\n });\n });\n }\n });\n }\n } else {\n const media = item.document as MyDocument || item.photo as MyPhoto;\n if((['sticker', 'gif'] as MyDocument['type'][]).includes((media as MyDocument)?.type) && isGallery) {\n assumeType(media);\n\n if(media.type === 'gif') {\n gifsMasonry.add(media, container);\n } else if(media.type === 'sticker') {\n container.classList.add('super-sticker');\n this.superStickerRenderer.renderSticker(media, container, loadPromises);\n if(media.animated) {\n this.superStickerRenderer.observeAnimated(container);\n }\n }\n } else if(media) {\n const size = isGallery ? 48 : undefined;\n isGallery && container.classList.add('no-border-radius');\n wrapPhoto({\n photo: media,\n container: isGallery ? container : preview,\n boxWidth: size,\n boxHeight: size,\n middleware,\n lazyLoadQueue: this.lazyLoadQueue,\n loadPromises\n });\n }\n }\n }\n\n return Promise.all(loadPromises).then(() => {\n if(!middleware()) {\n gifsMasonry.clear();\n return;\n }\n\n list.classList.toggle('is-gallery', isGallery);\n list.classList.toggle('super-stickers', isGallery);\n this.container.classList.toggle('is-gallery', isGallery);\n\n /* if(isGallery) {\n list.style.gridTemplateColumns = `repeat(${Math.min(botResults.results.length, 4)}, 1fr)`;\n }\n\n this.container.style.setProperty('width', isGallery ? `${Math.min(botResults.results.length, 4) * 25}%` : '', 'important'); */\n\n const parent = this.list.parentElement;\n parent.textContent = '';\n if(botResults.switch_pm) {\n const btnSwitchToPM = Button('btn-primary btn-secondary btn-primary-transparent primary');\n setInnerHTML(btnSwitchToPM, wrapEmojiText(botResults.switch_pm.text));\n attachClickEvent(btnSwitchToPM, (e) => {\n this.chat.appImManager.setInnerPeer({peerId});\n this.managers.appInlineBotsManager.switchToPM(peerId, peer.id, botResults.switch_pm.start_param);\n });\n parent.append(btnSwitchToPM);\n }\n parent.append(this.list = list);\n\n if(this.gifsMasonry) {\n this.gifsMasonry.detach();\n }\n this.gifsMasonry = gifsMasonry;\n gifsMasonry.attach();\n\n if(!this.onChangeScreen) {\n this.onChangeScreen = () => {\n if(this.list.classList.contains('is-gallery')) {\n const width = (this.list.childElementCount * mediaSizes.active.popupSticker.width) + (this.list.childElementCount - 1 * 1);\n this.list.style.width = width + 'px';\n } else {\n this.list.style.width = '';\n }\n };\n mediaSizes.addEventListener('changeScreen', this.onChangeScreen);\n }\n\n this.onChangeScreen();\n\n this.toggle(!botResults.results.length && !botResults.switch_pm);\n this.scrollable.scrollTop = 0;\n });\n });\n\n return {user: peer, renderPromise};\n };\n\n public init() {\n this.list = document.createElement('div');\n this.list.classList.add('inline-helper-results');\n\n this.container.append(this.list);\n\n this.scrollable = new Scrollable(this.container);\n this.lazyLoadQueue = new LazyLoadQueue();\n this.superStickerRenderer = new SuperStickerRenderer(this.lazyLoadQueue, ANIMATION_GROUP, this.managers);\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 ChatInput from './input';\nimport callbackify from '../../helpers/callbackify';\nimport AutocompletePeerHelper from './autocompletePeerHelper';\nimport {processPeerFullForCommands} from './commandsHelper';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nconst CLASS_NAME = 'bot-commands';\nexport default class ChatBotCommands extends AutocompletePeerHelper {\n private userId: UserId;\n\n constructor(\n appendTo: HTMLElement,\n chatInput: ChatInput,\n private managers: AppManagers\n ) {\n super(appendTo, undefined, CLASS_NAME, (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 this.toggle(true);\n });\n });\n }\n\n public setUserId(userId: UserId, middleware: () => boolean) {\n if(this.userId === userId && this.list?.childElementCount) {\n this.toggle(false);\n return;\n }\n\n this.userId = userId;\n return callbackify(this.managers.appProfileManager.getProfile(userId), (full) => {\n if(!middleware()) return;\n const filtered = processPeerFullForCommands(userId.toPeerId(false), full);\n\n const PADDING_TOP = 8;\n // const PADDING_BOTTOM = 8;\n const PADDING_BOTTOM = 24;\n const height = filtered.length * 50 + PADDING_TOP + PADDING_BOTTOM;\n this.container.style.setProperty('--height', height + 'px');\n\n this.render(filtered);\n\n // this.container.style.top =\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 {AckedResult} from '../lib/mtproto/superMessagePort';\nimport {Modify} from '../types';\n\nexport default async function modifyAckedResult(acked: AckedResult): Promise, {result: T | Promise}>> {\n return {\n cached: acked.cached,\n result: acked.cached ? await acked.result : acked.result\n };\n}\n\nexport function modifyAckedPromise(promise: Promise>) {\n return promise.then(modifyAckedResult);\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 indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport callbackify from '../../helpers/callbackify';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport {getMiddleware} from '../../helpers/middleware';\nimport {modifyAckedPromise} from '../../helpers/modifyAckedResult';\nimport {ChatFull} from '../../layer';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport {i18n} from '../../lib/langPack';\nimport {AckedResult} from '../../lib/mtproto/superMessagePort';\nimport rootScope from '../../lib/rootScope';\nimport AvatarElement from '../avatar';\nimport {ButtonMenuItemOptions, ButtonMenuSync} from '../buttonMenu';\nimport ButtonMenuToggle from '../buttonMenuToggle';\nimport PeerTitle from '../peerTitle';\nimport SetTransition from '../singleTransition';\nimport getChatMembersString from '../wrappers/getChatMembersString';\n\nconst SEND_AS_ANIMATION_DURATION = 300;\n\nexport default class ChatSendAs {\n private avatar: AvatarElement;\n private container: HTMLElement;\n private closeBtn: HTMLElement;\n private btnMenu: HTMLElement;\n private sendAsPeerIds: PeerId[];\n private sendAsPeerId: PeerId;\n private updatingPromise: ReturnType;\n private middleware: ReturnType;\n private listenerSetter: ListenerSetter;\n private peerId: PeerId;\n private addedListener: boolean;\n private buttons: ButtonMenuItemOptions[];\n\n constructor(\n private managers: AppManagers,\n private onReady: (container: HTMLElement, skipAnimation?: boolean) => void,\n private onChange: (sendAsPeerId: PeerId) => void\n ) {\n this.middleware = getMiddleware();\n this.listenerSetter = new ListenerSetter();\n this.construct();\n }\n\n private construct() {\n this.container = document.createElement('div');\n this.container.classList.add('new-message-send-as-container');\n\n this.closeBtn = document.createElement('div');\n this.closeBtn.classList.add('new-message-send-as-close', 'new-message-send-as-avatar', 'tgico-close');\n\n const sendAsButtons: ButtonMenuItemOptions[] = [{\n text: 'SendMessageAsTitle',\n onClick: undefined\n }];\n\n this.buttons = [];\n\n let previousAvatar: HTMLElement;\n const onSendAsMenuToggle = (visible: boolean) => {\n if(visible) {\n previousAvatar = this.avatar;\n }\n\n const isChanged = this.avatar !== previousAvatar;\n const useRafs = !visible && isChanged ? 2 : 0;\n\n SetTransition({\n element: this.closeBtn,\n className: 'is-visible',\n forwards: visible,\n duration: SEND_AS_ANIMATION_DURATION,\n useRafs\n });\n if(!isChanged) {\n SetTransition({\n element: previousAvatar,\n className: 'is-visible',\n forwards: !visible,\n duration: SEND_AS_ANIMATION_DURATION,\n useRafs\n });\n }\n };\n\n ButtonMenuToggle({\n buttonOptions: {noRipple: true},\n listenerSetter: this.listenerSetter,\n container: this.container,\n direction: 'top-right',\n buttons: sendAsButtons,\n onOpenBefore: () => {\n onSendAsMenuToggle(true);\n },\n onOpen: (e, btnMenu) => {\n sendAsButtons[0].element.classList.add('btn-menu-item-header');\n this.btnMenu = btnMenu as any;\n this.btnMenu.classList.add('scrollable', 'scrollable-y');\n this.btnMenu.append(...this.buttons.map((button) => button.element));\n },\n onClose: () => {\n onSendAsMenuToggle(false);\n },\n onCloseAfter: () => {\n this.btnMenu = undefined;\n }\n });\n\n this.container.append(this.closeBtn);\n }\n\n private async updateButtons(peerIds: PeerId[]) {\n const promises: Promise[] = peerIds.map(async(sendAsPeerId, idx) => {\n const textElement = document.createElement('div');\n\n const subtitle = document.createElement('div');\n subtitle.classList.add('btn-menu-item-subtitle');\n if(sendAsPeerId.isUser()) {\n subtitle.append(i18n('Chat.SendAs.PersonalAccount'));\n } else if(sendAsPeerId === this.peerId) {\n subtitle.append(i18n('VoiceChat.DiscussionGroup'));\n } else {\n subtitle.append(await getChatMembersString(sendAsPeerId.toChatId()));\n }\n\n textElement.append(\n new PeerTitle({peerId: sendAsPeerId}).element,\n subtitle\n );\n\n return {\n onClick: idx ? async() => {\n const currentPeerId = this.peerId;\n this.changeSendAsPeerId(sendAsPeerId);\n\n const middleware = this.middleware.get();\n const executeButtonsUpdate = () => {\n if(this.sendAsPeerId !== sendAsPeerId || !middleware()) return;\n const peerIds = this.sendAsPeerIds.slice();\n indexOfAndSplice(peerIds, sendAsPeerId);\n peerIds.unshift(sendAsPeerId);\n this.updateButtons(peerIds);\n };\n\n if(rootScope.settings.animationsEnabled) {\n setTimeout(executeButtonsUpdate, 250);\n } else {\n executeButtonsUpdate();\n }\n\n // return;\n this.managers.appMessagesManager.saveDefaultSendAs(currentPeerId, sendAsPeerId);\n } : undefined,\n textElement\n };\n });\n\n const buttons = await Promise.all(promises);\n const btnMenu = ButtonMenuSync({buttons}/* , this.listenerSetter */);\n buttons.forEach((button, idx) => {\n const peerId = peerIds[idx];\n const avatar = new AvatarElement();\n avatar.classList.add('avatar-26', 'btn-menu-item-icon');\n avatar.updateWithOptions({peerId});\n\n if(!idx) {\n avatar.classList.add('active');\n }\n\n button.element.prepend(avatar);\n });\n\n this.buttons = buttons;\n\n // if already opened\n this.btnMenu?.append(...this.buttons.map((button) => button.element));\n }\n\n private async updateAvatar(sendAsPeerId: PeerId, skipAnimation?: boolean) {\n const previousAvatar = this.avatar;\n if(previousAvatar) {\n if(previousAvatar.peerId === sendAsPeerId) {\n return;\n }\n }\n\n if(!previousAvatar) {\n skipAnimation = true;\n }\n\n const useRafs = skipAnimation ? 0 : 2;\n const duration = skipAnimation ? 0 : SEND_AS_ANIMATION_DURATION;\n const avatar = this.avatar = new AvatarElement();\n avatar.classList.add('new-message-send-as-avatar', 'avatar-30');\n await avatar.updateWithOptions({\n isDialog: false,\n peerId: sendAsPeerId\n });\n\n SetTransition({\n element: avatar,\n className: 'is-visible',\n forwards: true,\n duration,\n useRafs\n });\n if(previousAvatar) {\n SetTransition({\n element: previousAvatar,\n className: 'is-visible',\n forwards: false,\n duration,\n onTransitionEnd: () => {\n previousAvatar.remove();\n },\n useRafs\n });\n }\n\n this.container.append(avatar);\n }\n\n private changeSendAsPeerId(sendAsPeerId: PeerId, skipAnimation?: boolean) {\n this.sendAsPeerId = sendAsPeerId;\n this.onChange(sendAsPeerId);\n return this.updateAvatar(sendAsPeerId, skipAnimation);\n }\n\n private getDefaultSendAs(): Promise> {\n // return rootScope.myId;\n return this.managers.acknowledged.appProfileManager.getChannelFull(this.peerId.toChatId()).then((acked) => {\n return {\n cached: acked.cached,\n result: acked.result.then((channelFull) => {\n return channelFull.default_send_as ? getPeerId(channelFull.default_send_as) : undefined\n })\n };\n });\n }\n\n public async updateManual(skipAnimation?: boolean): Promise<() => void> {\n const peerId = this.peerId;\n if(this.updatingPromise || !(await this.managers.appPeersManager.isChannel(peerId))) {\n return;\n }\n\n const middleware = this.middleware.get(() => {\n return !this.updatingPromise || this.updatingPromise === updatingPromise;\n });\n\n const {container} = this;\n const chatId = peerId.toChatId();\n const result = (await modifyAckedPromise(this.getDefaultSendAs())).result;\n // const result = Promise.resolve(this.getDefaultSendAs());\n\n const wasSkippingAnimation = skipAnimation;\n if(result instanceof Promise) {\n skipAnimation = undefined;\n }\n\n const auto = wasSkippingAnimation && !skipAnimation;\n\n const updatingPromise = this.updatingPromise = callbackify(result, async(sendAsPeerId) => {\n if(!middleware() || sendAsPeerId === undefined) return;\n\n await this.changeSendAsPeerId(sendAsPeerId, skipAnimation);\n if(!middleware()) return;\n\n this.managers.appChatsManager.getSendAs(chatId).then((sendAsPeers) => {\n if(!middleware()) return;\n\n const peers = sendAsPeers.filter((sendAsPeer) => !sendAsPeer.pFlags.premium_required).map((sendAsPeer) => sendAsPeer.peer);\n const peerIds = peers.map((peer) => getPeerId(peer));\n this.sendAsPeerIds = peerIds.slice();\n\n indexOfAndSplice(peerIds, sendAsPeerId);\n peerIds.unshift(sendAsPeerId);\n this.updateButtons(peerIds);\n });\n\n const callback = () => {\n this.onReady(container, skipAnimation);\n\n if(!this.addedListener) {\n this.listenerSetter.add(rootScope)('peer_full_update', (peerId) => {\n if(this.peerId === peerId) {\n this.update();\n }\n });\n\n this.addedListener = true;\n }\n };\n\n if(auto) {\n callback();\n return;\n }\n\n return callback;\n });\n\n updatingPromise.finally(() => {\n if(this.updatingPromise === updatingPromise) {\n this.updatingPromise = undefined;\n }\n });\n\n if(!auto) {\n return updatingPromise;\n }\n }\n\n public update(skipAnimation?: boolean) {\n return this.updateManual(skipAnimation).then((callback) => callback?.());\n }\n\n public setPeerId(peerId?: PeerId) {\n /* if(this.avatar) {\n this.avatar.remove();\n this.avatar = undefined;\n } */\n\n this.middleware.clean();\n this.updatingPromise = undefined;\n this.peerId = peerId;\n }\n\n public destroy() {\n this.container.remove();\n this.setPeerId();\n this.listenerSetter.removeAll();\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 {markdownTags, MarkdownType} from './getRichElementValue';\n\nexport default function hasMarkupInSelection(types: T[], onlyFull?: boolean) {\n const result: Record = {} as any;\n types.forEach((tag) => result[tag] = 0);\n const selection = window.getSelection();\n let nodes = -1;\n if(!selection.isCollapsed) {\n const range = selection.getRangeAt(0);\n const commonAncestor = range.commonAncestorContainer;\n const root = commonAncestor.nodeType === commonAncestor.ELEMENT_NODE ?\n commonAncestor as HTMLElement :\n (commonAncestor as ChildNode).parentElement;\n const treeWalker = document.createTreeWalker(\n root.closest('[contenteditable=\"true\"]'),\n NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT,\n {acceptNode: (node) => range.intersectsNode(node) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT}\n );\n\n nodes = 0;\n let node: Node;\n while(node = treeWalker.nextNode()) {\n ++nodes;\n for(const type of types) {\n const tag = markdownTags[type];\n const matches = (node.nodeType === node.ELEMENT_NODE ? node as HTMLElement : node.parentElement).closest(tag.match);\n if(matches) {\n ++result[type];\n }\n }\n }\n }\n\n const resultBoolean: Record = {} as any;\n for(const type of types) {\n resultBoolean[type] = result[type] >= (onlyFull ? nodes : 1);\n }\n\n return resultBoolean;\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 {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport {AppImManager, APP_TABS} from '../../lib/appManagers/appImManager';\nimport type {MyDraftMessage} from '../../lib/appManagers/appDraftsManager';\nimport type Chat from './chat';\nimport Recorder from '../../../public/recorder.min';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\n// import Recorder from '../opus-recorder/dist/recorder.min';\nimport opusDecodeController from '../../lib/opusDecodeController';\nimport {ButtonMenuItemOptions, ButtonMenuItemOptionsVerifiable, ButtonMenuSync} from '../buttonMenu';\nimport emoticonsDropdown from '../emoticonsDropdown';\nimport PopupCreatePoll from '../popups/createPoll';\nimport PopupForward from '../popups/forward';\nimport PopupNewMedia from '../popups/newMedia';\nimport {toast, toastNew} from '../toast';\nimport {MessageEntity, DraftMessage, WebPage, Message, UserFull, AttachMenuPeerType} from '../../layer';\nimport StickersHelper from './stickersHelper';\nimport ButtonIcon from '../buttonIcon';\nimport ButtonMenuToggle from '../buttonMenuToggle';\nimport ListenerSetter, {Listener} from '../../helpers/listenerSetter';\nimport Button from '../button';\nimport PopupSchedule from '../popups/schedule';\nimport SendMenu from './sendContextMenu';\nimport rootScope from '../../lib/rootScope';\nimport PopupPinMessage from '../popups/unpinMessage';\nimport tsNow from '../../helpers/tsNow';\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\nimport {IS_MOBILE, IS_MOBILE_SAFARI} from '../../environment/userAgent';\nimport I18n, {i18n, join, LangPackKey} from '../../lib/langPack';\nimport {generateTail} from './bubbles';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport ButtonCorner from '../buttonCorner';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport cancelSelection from '../../helpers/dom/cancelSelection';\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport isInputEmpty from '../../helpers/dom/isInputEmpty';\nimport isSendShortcutPressed from '../../helpers/dom/isSendShortcutPressed';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {MarkdownType} from '../../helpers/dom/getRichElementValue';\nimport getRichValueWithCaret from '../../helpers/dom/getRichValueWithCaret';\nimport EmojiHelper from './emojiHelper';\nimport CommandsHelper from './commandsHelper';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport AutocompleteHelper from './autocompleteHelper';\nimport MentionsHelper from './mentionsHelper';\nimport fixSafariStickyInput from '../../helpers/dom/fixSafariStickyInput';\nimport ReplyKeyboard from './replyKeyboard';\nimport InlineHelper from './inlineHelper';\nimport debounce from '../../helpers/schedulers/debounce';\nimport noop from '../../helpers/noop';\nimport {putPreloader} from '../putPreloader';\nimport SetTransition from '../singleTransition';\nimport PeerTitle from '../peerTitle';\nimport {fastRaf} from '../../helpers/schedulers';\nimport PopupDeleteMessages from '../popups/deleteMessages';\nimport fixSafariStickyInputFocusing, {IS_STICKY_INPUT_BUGGED} from '../../helpers/dom/fixSafariStickyInputFocusing';\nimport PopupPeer from '../popups/peer';\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\nimport appMediaPlaybackController from '../appMediaPlaybackController';\nimport {BOT_START_PARAM, NULL_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport setCaretAt from '../../helpers/dom/setCaretAt';\nimport CheckboxField from '../checkboxField';\nimport DropdownHover from '../../helpers/dropdownHover';\nimport RadioForm from '../radioForm';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport toggleDisability from '../../helpers/dom/toggleDisability';\nimport callbackify from '../../helpers/callbackify';\nimport ChatBotCommands from './botCommands';\nimport copy from '../../helpers/object/copy';\nimport toHHMMSS from '../../helpers/string/toHHMMSS';\nimport documentFragmentToHTML from '../../helpers/dom/documentFragmentToHTML';\nimport PopupElement from '../popups';\nimport getEmojiEntityFromEmoji from '../../lib/richTextProcessor/getEmojiEntityFromEmoji';\nimport mergeEntities from '../../lib/richTextProcessor/mergeEntities';\nimport parseEntities from '../../lib/richTextProcessor/parseEntities';\nimport parseMarkdown from '../../lib/richTextProcessor/parseMarkdown';\nimport wrapDraftText from '../../lib/richTextProcessor/wrapDraftText';\nimport wrapDraft from '../wrappers/draft';\nimport wrapMessageForReply from '../wrappers/messageForReply';\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport contextMenuController from '../../helpers/contextMenuController';\nimport {emojiFromCodePoints} from '../../vendor/emoji';\nimport {modifyAckedPromise} from '../../helpers/modifyAckedResult';\nimport ChatSendAs from './sendAs';\nimport filterAsync from '../../helpers/array/filterAsync';\nimport InputFieldAnimated from '../inputFieldAnimated';\nimport getStickerEffectThumb from '../../lib/appManagers/utils/stickers/getStickerEffectThumb';\nimport PopupStickers from '../popups/stickers';\nimport wrapPeerTitle from '../wrappers/peerTitle';\nimport wrapReply from '../wrappers/reply';\nimport {getEmojiFromElement} from '../emoticonsDropdown/tabs/emoji';\nimport hasMarkupInSelection from '../../helpers/dom/hasMarkupInSelection';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport RichInputHandler from '../../helpers/dom/richInputHandler';\nimport {insertRichTextAsHTML} from '../inputField';\nimport getCaretPosNew from '../../helpers/dom/getCaretPosNew';\nimport draftsAreEqual from '../../lib/appManagers/utils/drafts/draftsAreEqual';\nimport isSelectionEmpty from '../../helpers/dom/isSelectionEmpty';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport getAttachMenuBotIcon from '../../lib/appManagers/utils/attachMenuBots/getAttachMenuBotIcon';\nimport TelegramWebView from '../telegramWebView';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport {MARKDOWN_ENTITIES} from '../../lib/richTextProcessor';\n\nconst RECORD_MIN_TIME = 500;\nconst POSTING_MEDIA_NOT_ALLOWED = 'Posting media content isn\\'t allowed in this group.';\n\ntype ChatInputHelperType = 'edit' | 'webpage' | 'forward' | 'reply';\n\nexport default class ChatInput {\n // private static AUTO_COMPLETE_REG_EXP = /(\\s|^)((?::|.)(?!.*[:@]).*|(?:[@\\/]\\S*))$/;\n private static AUTO_COMPLETE_REG_EXP = /(\\s|^)((?:(?:@|^\\/)\\S*)|(?::|^[^:@\\/])(?!.*[:@\\/]).*)$/;\n public messageInput: HTMLElement;\n public messageInputField: InputFieldAnimated;\n private fileInput: HTMLInputElement;\n private inputMessageContainer: HTMLDivElement;\n private btnSend: HTMLButtonElement;\n private btnCancelRecord: HTMLButtonElement;\n private lastUrl = '';\n private lastTimeType = 0;\n\n public chatInput: HTMLElement;\n public inputContainer: HTMLElement;\n public rowsWrapper: HTMLDivElement;\n private newMessageWrapper: HTMLDivElement;\n private btnToggleEmoticons: HTMLButtonElement;\n private btnToggleReplyMarkup: HTMLButtonElement;\n private btnSendContainer: HTMLDivElement;\n\n private replyKeyboard: ReplyKeyboard;\n\n private attachMenu: HTMLElement;\n private attachMenuButtons: ButtonMenuItemOptionsVerifiable[];\n\n private sendMenu: SendMenu;\n\n private replyElements: {\n container: HTMLElement,\n cancelBtn: HTMLButtonElement,\n iconBtn: HTMLButtonElement\n } = {} as any;\n\n private forwardElements: {\n changePeer: ButtonMenuItemOptions,\n showSender: ButtonMenuItemOptions,\n hideSender: ButtonMenuItemOptions,\n showCaption: ButtonMenuItemOptions,\n hideCaption: ButtonMenuItemOptions,\n container: HTMLElement,\n modifyArgs?: ButtonMenuItemOptions[]\n };\n private forwardHover: DropdownHover;\n private forwardWasDroppingAuthor: boolean;\n\n private getWebPagePromise: Promise;\n private willSendWebPage: WebPage = null;\n private forwarding: {[fromPeerId: PeerId]: number[]};\n public replyToMsgId: number;\n public editMsgId: number;\n public editMessage: Message.message;\n private noWebPage: true;\n public scheduleDate: number;\n public sendSilent: true;\n public startParam: string;\n\n private recorder: any;\n public recording = false;\n private recordCanceled = false;\n private recordTimeEl: HTMLElement;\n private recordRippleEl: HTMLElement;\n private recordStartTime = 0;\n private recordingOverlayListener: Listener;\n private recordingNavigationItem: NavigationItem;\n\n // private scrollTop = 0;\n // private scrollOffsetTop = 0;\n // private scrollDiff = 0;\n\n public helperType: Exclude;\n private helperFunc: () => void | Promise;\n private helperWaitingForward: boolean;\n\n public willAttachType: 'document' | 'media';\n\n private lockRedo = false;\n private canRedoFromHTML = '';\n private readonly undoHistory: string[] = [];\n private readonly executedHistory: string[] = [];\n private canUndoFromHTML = '';\n\n private autocompleteHelperController: AutocompleteHelperController;\n private stickersHelper: StickersHelper;\n private emojiHelper: EmojiHelper;\n private commandsHelper: CommandsHelper;\n private mentionsHelper: MentionsHelper;\n private inlineHelper: InlineHelper;\n private listenerSetter: ListenerSetter;\n\n private pinnedControlBtn: HTMLButtonElement;\n\n private goDownBtn: HTMLButtonElement;\n private goDownUnreadBadge: HTMLElement;\n private goMentionBtn: HTMLButtonElement;\n private goMentionUnreadBadge: HTMLSpanElement;\n private btnScheduled: HTMLButtonElement;\n\n private btnPreloader: HTMLButtonElement;\n\n private saveDraftDebounced: () => void;\n\n private fakeRowsWrapper: HTMLDivElement;\n\n private previousQuery: string;\n\n private releaseMediaPlayback: () => void;\n\n private botStartBtn: HTMLButtonElement;\n private rowsWrapperWrapper: HTMLDivElement;\n private controlContainer: HTMLElement;\n private fakeSelectionWrapper: HTMLDivElement;\n\n private fakeWrapperTo: HTMLElement;\n private toggleBotStartBtnDisability: () => void;\n\n private botCommandsToggle: HTMLElement;\n private botCommands: ChatBotCommands;\n private botCommandsIcon: HTMLDivElement;\n private hasBotCommands: boolean;\n\n // private activeContainer: HTMLElement;\n\n private sendAs: ChatSendAs;\n public sendAsPeerId: PeerId;\n\n private replyInTopicOverlay: HTMLDivElement;\n\n constructor(\n private chat: Chat,\n private appImManager: AppImManager,\n private managers: AppManagers\n ) {\n this.listenerSetter = new ListenerSetter();\n }\n\n public construct() {\n this.chatInput = document.createElement('div');\n this.chatInput.classList.add('chat-input', 'hide');\n\n this.inputContainer = document.createElement('div');\n this.inputContainer.classList.add('chat-input-container');\n\n this.rowsWrapperWrapper = document.createElement('div');\n this.rowsWrapperWrapper.classList.add('rows-wrapper-wrapper');\n\n this.rowsWrapper = document.createElement('div');\n this.rowsWrapper.classList.add('rows-wrapper', 'chat-input-wrapper');\n\n this.rowsWrapperWrapper.append(this.rowsWrapper);\n\n const tail = generateTail();\n this.rowsWrapper.append(tail);\n\n const fakeRowsWrapper = this.fakeRowsWrapper = document.createElement('div');\n fakeRowsWrapper.classList.add('fake-wrapper', 'fake-rows-wrapper');\n\n const fakeSelectionWrapper = this.fakeSelectionWrapper = document.createElement('div');\n fakeSelectionWrapper.classList.add('fake-wrapper', 'fake-selection-wrapper');\n\n this.inputContainer.append(this.rowsWrapperWrapper, fakeRowsWrapper, fakeSelectionWrapper);\n this.chatInput.append(this.inputContainer);\n\n this.goDownBtn = ButtonCorner({icon: 'arrow_down', className: 'bubbles-corner-button chat-secondary-button bubbles-go-down hide'});\n this.inputContainer.append(this.goDownBtn);\n\n attachClickEvent(this.goDownBtn, (e) => {\n cancelEvent(e);\n this.chat.bubbles.onGoDownClick();\n }, {listenerSetter: this.listenerSetter});\n\n // * constructor end\n\n /* let setScrollTopTimeout: number;\n // @ts-ignore\n let height = window.visualViewport.height; */\n // @ts-ignore\n // this.listenerSetter.add(window.visualViewport)('resize', () => {\n // const scrollable = this.chat.bubbles.scrollable;\n // const wasScrolledDown = scrollable.isScrolledDown;\n\n // /* if(wasScrolledDown) {\n // this.saveScroll();\n // } */\n\n // // @ts-ignore\n // let newHeight = window.visualViewport.height;\n // const diff = height - newHeight;\n // const scrollTop = scrollable.scrollTop;\n // const needScrollTop = wasScrolledDown ? scrollable.scrollHeight : scrollTop + diff; // * wasScrolledDown ัั‚ะพ ะฟั€ะพะฒะตั€ะบะฐ ะดะปั ะดะตัะบั‚ะพะฟ ั…ั€ะพะผะฐ, ะบะพะณะดะฐ ะฟั€ะพะฟะฐะดะฐะตั‚ ะฟะฐะฝะตะปัŒ ะทะฐะณั€ัƒะทะพะบ ัะฝะธะทัƒ\n\n // console.log('resize before', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, wasScrolledDown, scrollable.lastScrollTop, diff, needScrollTop);\n\n // scrollable.scrollTop = needScrollTop;\n\n // if(setScrollTopTimeout) clearTimeout(setScrollTopTimeout);\n // setScrollTopTimeout = window.setTimeout(() => {\n // const diff = height - newHeight;\n // const isScrolledDown = scrollable.scrollHeight - Math.round(scrollable.scrollTop + scrollable.container.offsetHeight + diff) <= 1;\n // height = newHeight;\n\n // scrollable.scrollTop = needScrollTop;\n\n // console.log('resize after', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, scrollable.isScrolledDown, scrollable.lastScrollTop, isScrolledDown);\n\n // /* if(isScrolledDown) {\n // scrollable.scrollTop = scrollable.scrollHeight;\n // } */\n\n // //scrollable.scrollTop += diff;\n // setScrollTopTimeout = 0;\n // }, 0);\n // });\n\n // ! Can't use it with resizeObserver\n /* this.listenerSetter.add(window.visualViewport)('resize', () => {\n const scrollable = this.chat.bubbles.scrollable;\n const wasScrolledDown = scrollable.isScrolledDown;\n\n // @ts-ignore\n let newHeight = window.visualViewport.height;\n const diff = height - newHeight;\n const needScrollTop = wasScrolledDown ? scrollable.scrollHeight : scrollable.scrollTop + diff; // * wasScrolledDown ัั‚ะพ ะฟั€ะพะฒะตั€ะบะฐ ะดะปั ะดะตัะบั‚ะพะฟ ั…ั€ะพะผะฐ, ะบะพะณะดะฐ ะฟั€ะพะฟะฐะดะฐะตั‚ ะฟะฐะฝะตะปัŒ ะทะฐะณั€ัƒะทะพะบ ัะฝะธะทัƒ\n\n //console.log('resize before', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, wasScrolledDown, scrollable.lastScrollTop, diff, needScrollTop);\n\n scrollable.scrollTop = needScrollTop;\n height = newHeight;\n\n if(setScrollTopTimeout) clearTimeout(setScrollTopTimeout);\n setScrollTopTimeout = window.setTimeout(() => { // * try again for scrolled down Android Chrome\n scrollable.scrollTop = needScrollTop;\n\n //console.log('resize after', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, scrollable.isScrolledDown, scrollable.lastScrollTop, isScrolledDown);\n setScrollTopTimeout = 0;\n }, 0);\n }); */\n\n const c = this.controlContainer = document.createElement('div');\n c.classList.add('chat-input-control', 'chat-input-wrapper');\n this.inputContainer.append(c);\n }\n\n public constructPeerHelpers() {\n this.replyElements.container = document.createElement('div');\n this.replyElements.container.classList.add('reply-wrapper');\n\n this.replyElements.iconBtn = ButtonIcon('');\n this.replyElements.cancelBtn = ButtonIcon('close reply-cancel', {noRipple: true});\n\n this.replyElements.container.append(this.replyElements.iconBtn, this.replyElements.cancelBtn);\n\n //\n\n const onHideAuthorClick = () => {\n isChangingAuthor = true;\n };\n\n const onHideCaptionClick = () => {\n isChangingAuthor = false;\n };\n\n const forwardElements: ChatInput['forwardElements'] = this.forwardElements = {} as any;\n let isChangingAuthor = false;\n const forwardButtons: ButtonMenuItemOptions[] = [\n forwardElements.showSender = {\n text: 'Chat.Alert.Forward.Action.Show1',\n onClick: onHideAuthorClick,\n checkForClose: () => this.canToggleHideAuthor(),\n checkboxField: new CheckboxField({checked: true})\n },\n forwardElements.hideSender = {\n text: 'Chat.Alert.Forward.Action.Hide1',\n onClick: onHideAuthorClick,\n checkForClose: () => this.canToggleHideAuthor(),\n checkboxField: new CheckboxField({checked: false})\n },\n forwardElements.showCaption = {\n text: 'Chat.Alert.Forward.Action.ShowCaption',\n onClick: onHideCaptionClick,\n checkboxField: new CheckboxField({checked: true})\n },\n forwardElements.hideCaption = {\n text: 'Chat.Alert.Forward.Action.HideCaption',\n onClick: onHideCaptionClick,\n checkboxField: new CheckboxField({checked: false})\n },\n forwardElements.changePeer = {\n text: 'Chat.Alert.Forward.Action.Another',\n onClick: () => {\n this.changeForwardRecipient();\n },\n icon: 'replace'\n }\n ];\n const forwardBtnMenu = forwardElements.container = ButtonMenuSync({\n buttons: forwardButtons,\n listenerSetter: this.listenerSetter\n });\n // forwardBtnMenu.classList.add('top-center');\n\n const children = Array.from(forwardBtnMenu.children) as HTMLElement[];\n const groups: {\n elements: HTMLElement[],\n onChange: (value: string, event: Event) => void\n }[] = [{\n elements: children.slice(0, 2),\n onChange: (value, e) => {\n const checked = !!+value;\n if(isChangingAuthor) {\n this.forwardWasDroppingAuthor = !checked;\n }\n\n const replyTitle = this.replyElements.container.querySelector('.reply-title');\n if(replyTitle) {\n const el = replyTitle.firstElementChild as HTMLElement;\n const i = I18n.weakMap.get(el) as I18n.IntlElement;\n const langPackKey: LangPackKey = forwardElements.showSender.checkboxField.checked ? 'Chat.Accessory.Forward' : 'Chat.Accessory.Hidden';\n i.key = langPackKey;\n i.update();\n }\n }\n }, {\n elements: children.slice(2, 4),\n onChange: (value) => {\n const checked = !!+value;\n let b: ButtonMenuItemOptions;\n if(checked && this.forwardWasDroppingAuthor !== undefined) {\n b = this.forwardWasDroppingAuthor ? forwardElements.hideSender : forwardElements.showSender;\n } else {\n b = checked ? forwardElements.showSender : forwardElements.hideSender;\n }\n\n b.checkboxField.checked = true;\n }\n }];\n groups.forEach((group) => {\n const container = RadioForm(group.elements.map((e) => {\n return {\n container: e,\n input: e.querySelector('input')\n };\n }), group.onChange);\n\n const hr = document.createElement('hr');\n container.append(hr);\n forwardBtnMenu.append(container);\n });\n\n forwardBtnMenu.append(forwardElements.changePeer.element);\n\n if(!IS_TOUCH_SUPPORTED) {\n const forwardHover = this.forwardHover = new DropdownHover({\n element: forwardBtnMenu\n });\n }\n\n forwardElements.modifyArgs = forwardButtons.slice(0, -1);\n this.replyElements.container.append(forwardBtnMenu);\n\n forwardElements.modifyArgs.forEach((b, idx) => {\n const {input} = b.checkboxField;\n input.type = 'radio';\n input.name = idx < 2 ? 'author' : 'caption';\n input.value = '' + +!(idx % 2);\n });\n\n //\n\n this.newMessageWrapper = document.createElement('div');\n this.newMessageWrapper.classList.add('new-message-wrapper');\n\n this.replyInTopicOverlay = document.createElement('div');\n this.replyInTopicOverlay.classList.add('reply-in-topic-overlay', 'hide');\n this.replyInTopicOverlay.append(i18n('Chat.Input.ReplyToAnswer'));\n\n this.btnToggleEmoticons = ButtonIcon('none toggle-emoticons', {noRipple: true});\n\n this.inputMessageContainer = document.createElement('div');\n this.inputMessageContainer.classList.add('input-message-container');\n\n this.goDownUnreadBadge = document.createElement('span');\n this.goDownUnreadBadge.classList.add('badge', 'badge-24', 'badge-primary');\n this.goDownBtn.append(this.goDownUnreadBadge);\n\n this.goMentionBtn = ButtonCorner({icon: 'mention', className: 'bubbles-corner-button chat-secondary-button bubbles-go-mention'});\n this.goMentionUnreadBadge = document.createElement('span');\n this.goMentionUnreadBadge.classList.add('badge', 'badge-24', 'badge-primary');\n this.goMentionBtn.append(this.goMentionUnreadBadge);\n this.inputContainer.append(this.goMentionBtn);\n\n attachClickEvent(this.goMentionBtn, (e) => {\n cancelEvent(e);\n const middleware = this.chat.bubbles.getMiddleware();\n this.managers.appMessagesManager.goToNextMention(this.chat.peerId, this.chat.threadId).then((mid) => {\n if(!middleware()) {\n return;\n }\n\n if(mid) {\n this.chat.setMessageId(mid);\n }\n });\n }, {listenerSetter: this.listenerSetter});\n\n this.btnScheduled = ButtonIcon('scheduled btn-scheduled float hide', {noRipple: true});\n\n attachClickEvent(this.btnScheduled, (e) => {\n this.appImManager.openScheduled(this.chat.peerId);\n }, {listenerSetter: this.listenerSetter});\n\n this.listenerSetter.add(rootScope)('scheduled_new', ({peerId}) => {\n if(this.chat.peerId !== peerId) {\n return;\n }\n\n this.btnScheduled.classList.remove('hide');\n });\n\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId}) => {\n if(this.chat.peerId !== peerId) {\n return;\n }\n\n this.managers.appMessagesManager.getScheduledMessages(this.chat.peerId).then((value) => {\n this.btnScheduled.classList.toggle('hide', !value.length);\n });\n });\n\n this.btnToggleReplyMarkup = ButtonIcon('botcom toggle-reply-markup float hide', {noRipple: true});\n this.replyKeyboard = new ReplyKeyboard({\n appendTo: this.rowsWrapper,\n listenerSetter: this.listenerSetter,\n managers: this.managers,\n btnHover: this.btnToggleReplyMarkup,\n chatInput: this\n });\n this.listenerSetter.add(this.replyKeyboard)('open', () => this.btnToggleReplyMarkup.classList.add('active'));\n this.listenerSetter.add(this.replyKeyboard)('close', () => this.btnToggleReplyMarkup.classList.remove('active'));\n\n this.botCommands = new ChatBotCommands(this.rowsWrapper, this, this.managers);\n this.botCommandsToggle = document.createElement('div');\n this.botCommandsToggle.classList.add('new-message-bot-commands');\n\n const scaler = document.createElement('div');\n scaler.classList.add('new-message-bot-commands-icon-scale');\n\n const icon = this.botCommandsIcon = document.createElement('div');\n icon.classList.add('animated-menu-icon', 'animated-menu-close-icon');\n scaler.append(icon);\n this.botCommandsToggle.append(scaler);\n\n attachClickEvent(this.botCommandsToggle, (e) => {\n cancelEvent(e);\n const isShown = icon.classList.contains('state-back');\n if(isShown) {\n this.botCommands.toggle(true);\n icon.classList.remove('state-back');\n } else {\n this.botCommands.setUserId(this.chat.peerId.toUserId(), this.chat.bubbles.getMiddleware());\n icon.classList.add('state-back');\n }\n }, {listenerSetter: this.listenerSetter});\n\n this.botCommands.addEventListener('visible', () => {\n icon.classList.add('state-back');\n });\n\n this.botCommands.addEventListener('hiding', () => {\n icon.classList.remove('state-back');\n });\n\n this.attachMenuButtons = [{\n icon: 'image',\n text: 'Chat.Input.Attach.PhotoOrVideo',\n onClick: () => {\n this.fileInput.value = '';\n const accept = [...MEDIA_MIME_TYPES_SUPPORTED].join(', ');\n this.fileInput.setAttribute('accept', accept);\n this.willAttachType = 'media';\n this.fileInput.click();\n },\n verify: () => this.chat.canSend('send_media')\n }, {\n icon: 'document',\n text: 'Chat.Input.Attach.Document',\n onClick: () => {\n this.fileInput.value = '';\n this.fileInput.removeAttribute('accept');\n this.willAttachType = 'document';\n this.fileInput.click();\n },\n verify: () => this.chat.canSend('send_media')\n }, {\n icon: 'poll',\n text: 'Poll',\n onClick: () => {\n PopupElement.createPopup(PopupCreatePoll, this.chat).show();\n },\n verify: () => (this.chat.peerId.isAnyChat() || this.chat.isBot) && this.chat.canSend('send_polls')\n }];\n\n const attachMenuButtons = this.attachMenuButtons.slice();\n this.attachMenu = ButtonMenuToggle({\n buttonOptions: {noRipple: true},\n listenerSetter: this.listenerSetter,\n direction: 'top-left',\n buttons: this.attachMenuButtons,\n onOpenBefore: async() => {\n const attachMenuBots = await this.managers.appAttachMenuBotsManager.getAttachMenuBots();\n const buttons = attachMenuButtons.slice();\n const attachMenuBotsButtons = attachMenuBots.filter((attachMenuBot) => {\n return !attachMenuBot.pFlags.inactive;\n }).map((attachMenuBot) => {\n const icon = getAttachMenuBotIcon(attachMenuBot);\n const button: typeof buttons[0] = {\n regularText: wrapEmojiText(attachMenuBot.short_name),\n onClick: () => {\n this.managers.appAttachMenuBotsManager.requestWebView({\n botId: attachMenuBot.bot_id,\n peerId: this.chat.peerId,\n ...this.chat.getMessageSendingParams()\n }).then((webViewResultUrl) => {\n const SANDBOX_ATTRIBUTES = [\n 'allow-scripts',\n 'allow-same-origin',\n 'allow-popups',\n 'allow-forms',\n 'allow-modals',\n 'allow-storage-access-by-user-activation'\n ].join(' ');\n\n class P extends PopupElement<{\n finish: () => void\n }> {\n private telegramWebView: TelegramWebView;\n\n constructor(private url: string) {\n super('popup-payment popup-payment-verification', {\n closable: true,\n overlayClosable: true,\n body: true,\n titleRaw: attachMenuBot.short_name\n });\n\n this.d();\n }\n\n protected destroy() {\n this.telegramWebView.destroy();\n return super.destroy();\n }\n\n private d() {\n const telegramWebView = this.telegramWebView = new TelegramWebView({\n url: this.url,\n sandbox: SANDBOX_ATTRIBUTES\n });\n\n telegramWebView.iframe.classList.add('payment-verification');\n\n this.body.append(telegramWebView.iframe);\n this.show();\n telegramWebView.onMount();\n }\n }\n\n new P(webViewResultUrl.url);\n });\n },\n iconDoc: icon?.icon as MyDocument,\n verify: async() => {\n let found = false;\n\n const verifyMap: {\n [type in AttachMenuPeerType['_']]: () => boolean | Promise\n } = {\n attachMenuPeerTypeSameBotPM: () => this.chat.peerId.toUserId() === attachMenuBot.bot_id,\n attachMenuPeerTypeBotPM: () => this.chat.isBot,\n attachMenuPeerTypePM: () => this.chat.peerId.isUser(),\n attachMenuPeerTypeChat: () => this.chat.isAnyGroup,\n attachMenuPeerTypeBroadcast: () => this.chat.isBroadcast\n };\n\n for(const peerType of attachMenuBot.peer_types) {\n const verify = verifyMap[peerType._];\n found = await verify();\n if(found) {\n break;\n }\n }\n\n return found;\n }\n };\n\n return button;\n });\n\n buttons.splice(buttons.length, 0, ...attachMenuBotsButtons);\n this.attachMenuButtons.splice(0, this.attachMenuButtons.length, ...buttons);\n }\n });\n this.attachMenu.classList.add('attach-file', 'tgico-attach');\n this.attachMenu.classList.remove('tgico-more');\n\n // this.inputContainer.append(this.sendMenu);\n\n this.recordTimeEl = document.createElement('div');\n this.recordTimeEl.classList.add('record-time');\n\n this.fileInput = document.createElement('input');\n this.fileInput.type = 'file';\n this.fileInput.multiple = true;\n this.fileInput.style.display = 'none';\n\n this.newMessageWrapper.append(...[this.botCommandsToggle, this.btnToggleEmoticons, this.inputMessageContainer, this.btnScheduled, this.btnToggleReplyMarkup, this.attachMenu, this.recordTimeEl, this.fileInput].filter(Boolean));\n\n this.rowsWrapper.append(this.replyElements.container);\n this.autocompleteHelperController = new AutocompleteHelperController();\n this.stickersHelper = new StickersHelper(this.rowsWrapper, this.autocompleteHelperController, this.chat, this.managers);\n this.emojiHelper = new EmojiHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.managers);\n this.commandsHelper = new CommandsHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.managers);\n this.mentionsHelper = new MentionsHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.managers);\n this.inlineHelper = new InlineHelper(this.rowsWrapper, this.autocompleteHelperController, this.chat, this.managers);\n this.rowsWrapper.append(this.newMessageWrapper);\n\n this.btnCancelRecord = ButtonIcon('binfilled btn-circle btn-record-cancel chat-secondary-button');\n\n this.btnSendContainer = document.createElement('div');\n this.btnSendContainer.classList.add('btn-send-container');\n\n this.recordRippleEl = document.createElement('div');\n this.recordRippleEl.classList.add('record-ripple');\n\n this.btnSend = ButtonIcon('none btn-circle btn-send animated-button-icon');\n this.btnSend.insertAdjacentHTML('afterbegin', `\n \n \n \n \n `);\n\n this.btnSendContainer.append(this.recordRippleEl, this.btnSend);\n\n this.sendMenu = new SendMenu({\n onSilentClick: () => {\n this.sendSilent = true;\n this.sendMessage();\n },\n onScheduleClick: () => {\n this.scheduleSending(undefined);\n },\n listenerSetter: this.listenerSetter,\n openSide: 'top-left',\n onContextElement: this.btnSend,\n onOpen: () => {\n return this.chat.type !== 'scheduled' && (!this.isInputEmpty() || !!Object.keys(this.forwarding).length);\n }\n });\n\n this.btnSendContainer.append(this.sendMenu.sendMenu);\n\n this.inputContainer.append(this.btnCancelRecord, this.btnSendContainer);\n\n emoticonsDropdown.attachButtonListener(this.btnToggleEmoticons, this.listenerSetter);\n this.listenerSetter.add(emoticonsDropdown)('open', this.onEmoticonsOpen);\n this.listenerSetter.add(emoticonsDropdown)('close', this.onEmoticonsClose);\n\n this.attachMessageInputField();\n\n /* this.attachMenu.addEventListener('mousedown', (e) => {\n const hidden = this.attachMenu.querySelectorAll('.hide');\n if(hidden.length === this.attachMenuButtons.length) {\n toast(POSTING_MEDIA_NOT_ALLOWED);\n cancelEvent(e);\n return false;\n }\n }, {passive: false, capture: true}); */\n\n this.listenerSetter.add(rootScope)('settings_updated', () => {\n if(this.stickersHelper || this.emojiHelper) {\n // this.previousQuery = undefined;\n this.previousQuery = '';\n this.checkAutocomplete();\n /* if(!rootScope.settings.stickers.suggest) {\n this.stickersHelper.checkEmoticon('');\n } else {\n this.onMessageInput();\n } */\n }\n\n this.messageInputField?.onFakeInput();\n });\n\n this.listenerSetter.add(rootScope)('draft_updated', ({peerId, threadId, draft, force}) => {\n if(this.chat.threadId !== threadId || this.chat.peerId !== peerId || this.chat.type === 'scheduled') return;\n this.setDraft(draft, true, force);\n });\n\n this.listenerSetter.add(this.appImManager)('peer_changing', (chat) => {\n if(this.chat === chat && (this.chat.type === 'chat' || this.chat.type === 'discussion')) {\n this.saveDraft();\n }\n });\n\n this.listenerSetter.add(this.appImManager)('chat_changing', ({from, to}) => {\n if(this.chat === from) {\n this.autocompleteHelperController.toggleListNavigation(false);\n } else if(this.chat === to) {\n this.autocompleteHelperController.toggleListNavigation(true);\n }\n });\n\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId, mids}) => {\n if(this.chat.type === 'scheduled' && this.chat.peerId === peerId && mids.includes(this.editMsgId)) {\n this.onMessageSent();\n }\n });\n\n this.listenerSetter.add(rootScope)('history_delete', ({peerId, msgs}) => {\n if(this.chat.peerId === peerId && this.chat.type !== 'scheduled') {\n if(msgs.has(this.editMsgId)) {\n this.onMessageSent();\n }\n\n if(this.replyToMsgId && msgs.has(this.replyToMsgId)) {\n this.clearHelper('reply');\n }\n\n /* if(this.chat.isStartButtonNeeded()) {\n this.setStartParam(BOT_START_PARAM);\n } */\n }\n });\n\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\n if(dialogs.has(this.chat.peerId) && (this.chat.type === 'chat' || this.chat.type === 'discussion')) {\n if(this.startParam === BOT_START_PARAM) {\n this.setStartParam();\n } else { // updateNewMessage comes earlier than dialog appers\n this.center(true);\n }\n }\n });\n\n try {\n this.recorder = new Recorder({\n // encoderBitRate: 32,\n // encoderPath: \"../dist/encoderWorker.min.js\",\n encoderSampleRate: 48000,\n monitorGain: 0,\n numberOfChannels: 1,\n recordingGain: 1,\n reuseWorker: true\n });\n } catch(err) {\n console.error('Recorder constructor error:', err);\n }\n\n this.updateSendBtn();\n\n this.listenerSetter.add(this.fileInput)('change', (e) => {\n const files = (e.target as HTMLInputElement & EventTarget).files;\n if(!files.length) {\n return;\n }\n\n PopupElement.createPopup(PopupNewMedia, this.chat, Array.from(files).slice(), this.willAttachType);\n this.fileInput.value = '';\n }, false);\n\n /* let time = Date.now();\n this.btnSend.addEventListener('touchstart', (e) => {\n time = Date.now();\n });\n\n let eventName1 = 'touchend';\n this.btnSend.addEventListener(eventName1, (e: Event) => {\n //cancelEvent(e);\n console.log(eventName1 + ', time: ' + (Date.now() - time));\n });\n\n let eventName = 'mousedown';\n this.btnSend.addEventListener(eventName, (e: Event) => {\n cancelEvent(e);\n console.log(eventName + ', time: ' + (Date.now() - time));\n }); */\n attachClickEvent(this.btnSend, this.onBtnSendClick, {listenerSetter: this.listenerSetter, touchMouseDown: true});\n\n if(this.recorder) {\n attachClickEvent(this.btnCancelRecord, this.onCancelRecordClick, {listenerSetter: this.listenerSetter});\n\n this.recorder.onstop = () => {\n this.setRecording(false);\n this.chatInput.classList.remove('is-locked');\n this.recordRippleEl.style.transform = '';\n };\n\n this.recorder.ondataavailable = (typedArray: Uint8Array) => {\n if(this.releaseMediaPlayback) {\n this.releaseMediaPlayback();\n this.releaseMediaPlayback = undefined;\n }\n\n if(this.recordingOverlayListener) {\n this.listenerSetter.remove(this.recordingOverlayListener);\n this.recordingOverlayListener = undefined;\n }\n\n if(this.recordingNavigationItem) {\n appNavigationController.removeItem(this.recordingNavigationItem);\n this.recordingNavigationItem = undefined;\n }\n\n if(this.recordCanceled) {\n return;\n }\n\n const {peerId, threadId} = this.chat;\n const replyToMsgId = this.replyToMsgId;\n\n const duration = (Date.now() - this.recordStartTime) / 1000 | 0;\n const dataBlob = new Blob([typedArray], {type: 'audio/ogg'});\n /* const fileName = new Date().toISOString() + \".opus\";\n console.log('Recorder data received', typedArray, dataBlob); */\n\n // let perf = performance.now();\n opusDecodeController.decode(typedArray, true).then((result) => {\n // console.log('WAVEFORM!:', /* waveform, */performance.now() - perf);\n\n opusDecodeController.setKeepAlive(false);\n\n // ั‚ัƒั‚ objectURL ัั‚ะฐะฒะธั‚ัั ัƒะถะต ั audio/wav\n this.managers.appMessagesManager.sendFile(peerId, {\n file: dataBlob,\n isVoiceMessage: true,\n isMedia: true,\n duration,\n waveform: result.waveform,\n objectURL: result.url,\n replyToMsgId,\n threadId,\n clearDraft: true\n });\n\n this.onMessageSent(false, true);\n });\n };\n }\n\n attachClickEvent(this.replyElements.cancelBtn, this.onHelperCancel, {listenerSetter: this.listenerSetter});\n attachClickEvent(this.replyElements.container, this.onHelperClick, {listenerSetter: this.listenerSetter});\n\n this.saveDraftDebounced = debounce(() => this.saveDraft(), 2500, false, true);\n\n this.botStartBtn = Button('btn-primary btn-transparent text-bold chat-input-control-button');\n this.botStartBtn.append(i18n('BotStart'));\n\n attachClickEvent(this.botStartBtn, () => {\n const {startParam} = this;\n if(startParam === undefined) {\n return;\n }\n\n const toggle = this.toggleBotStartBtnDisability = toggleDisability([this.botStartBtn], true);\n const peerId = this.chat.peerId;\n const middleware = this.chat.bubbles.getMiddleware(() => {\n return this.chat.peerId === peerId && this.startParam === startParam && this.toggleBotStartBtnDisability === toggle;\n });\n\n this.managers.appMessagesManager.startBot(peerId.toUserId(), undefined, startParam).then(() => {\n if(middleware()) {\n toggle();\n this.toggleBotStartBtnDisability = undefined;\n this.setStartParam();\n }\n });\n }, {listenerSetter: this.listenerSetter});\n\n this.controlContainer.append(this.botStartBtn, this.replyInTopicOverlay);\n\n // * pinned part start\n this.pinnedControlBtn = Button('btn-primary btn-transparent text-bold chat-input-control-button', {icon: 'unpin'});\n this.controlContainer.append(this.pinnedControlBtn);\n\n this.listenerSetter.add(this.pinnedControlBtn)('click', () => {\n const peerId = this.chat.peerId;\n\n new PopupPinMessage(peerId, 0, true, () => {\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 // * pinned part end\n }\n\n public _center(neededFakeContainer: HTMLElement, animate?: boolean) {\n if(!neededFakeContainer && !this.inputContainer.classList.contains('is-centering')) {\n return;\n }\n\n if(neededFakeContainer === this.fakeWrapperTo) {\n return;\n }\n\n /* if(neededFakeContainer === this.botStartContainer && this.fakeWrapperTo === this.fakeSelectionWrapper) {\n this.inputContainer.classList.remove('is-centering');\n void this.rowsWrapper.offsetLeft; // reflow\n // this.inputContainer.classList.add('is-centering');\n // void this.rowsWrapper.offsetLeft; // reflow\n } */\n\n const fakeSelectionWrapper = neededFakeContainer || this.fakeWrapperTo;\n const forwards = !!neededFakeContainer;\n const oldFakeWrapperTo = this.fakeWrapperTo;\n let transform = '', borderRadius = '', needTranslateX: number;\n // if(forwards) {]\n const fakeSelectionRect = fakeSelectionWrapper.getBoundingClientRect();\n const fakeRowsRect = this.fakeRowsWrapper.getBoundingClientRect();\n const widthFrom = fakeRowsRect.width;\n const widthTo = fakeSelectionRect.width;\n\n if(widthFrom !== widthTo) {\n const scale = (widthTo/* - 8 */) / widthFrom;\n const initTranslateX = (widthFrom - widthTo) / 2;\n needTranslateX = fakeSelectionRect.left - fakeRowsRect.left - initTranslateX;\n\n if(forwards) {\n transform = `translateX(${needTranslateX}px) scaleX(${scale})`;\n // transform = `translateX(0px) scaleX(${scale})`;\n\n if(scale < 1) {\n const br = 16;\n borderRadius = '' + (br + br * (1 - scale)) + 'px';\n }\n }\n // scale = widthTo / widthFrom;\n }\n // }\n\n this.fakeWrapperTo = neededFakeContainer;\n\n const duration = animate ? 200 : 0;\n SetTransition({\n element: this.inputContainer,\n className: 'is-centering',\n forwards,\n duration\n });\n SetTransition({\n element: this.rowsWrapperWrapper,\n className: 'is-centering-to-control',\n forwards: !!(forwards && neededFakeContainer && neededFakeContainer.classList.contains('chat-input-control')),\n duration\n });\n this.rowsWrapper.style.transform = transform;\n this.rowsWrapper.style.borderRadius = borderRadius;\n\n return {\n transform,\n borderRadius,\n needTranslateX: oldFakeWrapperTo && (\n (\n neededFakeContainer &&\n neededFakeContainer.classList.contains('chat-input-control') &&\n oldFakeWrapperTo === this.fakeSelectionWrapper\n ) || oldFakeWrapperTo.classList.contains('chat-input-control')\n ) ? needTranslateX * -.5 : needTranslateX,\n widthFrom,\n widthTo\n };\n }\n\n public async center(animate = false) {\n return this._center(await this.getNeededFakeContainer(), animate);\n }\n\n public setStartParam(startParam?: string) {\n if(this.startParam === startParam) {\n return;\n }\n\n this.startParam = startParam;\n this.center(true);\n }\n\n public isReplyInTopicOverlayNeeded() {\n return this.chat.isForum &&\n !this.chat.isForumTopic &&\n !this.replyToMsgId &&\n this.chat.type === 'chat';\n }\n\n public async getNeededFakeContainer(startParam = this.startParam) {\n if(this.chat.selection.isSelecting) {\n return this.fakeSelectionWrapper;\n } else if(\n startParam !== undefined ||\n !(await this.chat.canSend()) ||\n this.chat.type === 'pinned' ||\n await this.chat.isStartButtonNeeded() ||\n this.isReplyInTopicOverlayNeeded()\n ) {\n return this.controlContainer;\n }\n }\n\n // public getActiveContainer() {\n // if(this.chat.selection.isSelecting) {\n // return this.chat\n // }\n // return this.startParam !== undefined ? this.botStartContainer : this.rowsWrapper;\n // }\n\n // public setActiveContainer() {\n // const container = this.activeContainer;\n // const newContainer = this.getActiveContainer();\n // if(newContainer === container) {\n // return;\n // }\n\n\n // }\n\n private onCancelRecordClick = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n this.recordCanceled = true;\n this.recorder.stop();\n opusDecodeController.setKeepAlive(false);\n };\n\n private onEmoticonsOpen = () => {\n const toggleClass = IS_TOUCH_SUPPORTED ? 'flip-icon' : 'active';\n this.btnToggleEmoticons.classList.toggle(toggleClass, true);\n };\n\n private onEmoticonsClose = () => {\n const toggleClass = IS_TOUCH_SUPPORTED ? 'flip-icon' : 'active';\n this.btnToggleEmoticons.classList.toggle(toggleClass, false);\n };\n\n public getReadyToSend(callback: () => void) {\n return this.chat.type === 'scheduled' ? (this.scheduleSending(callback), true) : (callback(), false);\n }\n\n public scheduleSending = async(callback: () => void = this.sendMessage.bind(this, true), initDate = new Date()) => {\n const {peerId} = this.chat;\n const middleware = this.chat.bubbles.getMiddleware();\n const canSendWhenOnline = rootScope.myId !== peerId && peerId.isUser() && await this.managers.appUsersManager.isUserOnlineVisible(peerId);\n\n new PopupSchedule(initDate, (timestamp) => {\n if(!middleware()) {\n return;\n }\n\n const minTimestamp = (Date.now() / 1000 | 0) + 10;\n if(timestamp <= minTimestamp) {\n timestamp = undefined;\n }\n\n this.scheduleDate = timestamp;\n callback();\n\n if(this.chat.type !== 'scheduled' && timestamp) {\n setTimeout(() => { // ! need timeout here because .forwardMessages will be called after timeout\n if(!middleware()) {\n return;\n }\n\n const popups = PopupElement.getPopups(PopupStickers);\n popups.forEach((popup) => popup.hide());\n\n this.appImManager.openScheduled(peerId);\n }, 0);\n }\n }, canSendWhenOnline).show();\n };\n\n public async setUnreadCount() {\n if(!this.goDownUnreadBadge) {\n return;\n }\n\n const dialog = await this.managers.dialogsStorage.getDialogOrTopic(this.chat.peerId, this.chat.type === 'discussion' ? undefined : this.chat.threadId);\n const count = dialog?.unread_count;\n this.goDownUnreadBadge.innerText = '' + (count || '');\n this.goDownUnreadBadge.classList.toggle('badge-gray', await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.chat.peerId, respectType: true, threadId: this.chat.threadId}));\n\n if(this.goMentionUnreadBadge && this.chat.type === 'chat') {\n const hasMentions = !!(dialog?.unread_mentions_count && dialog.unread_count);\n this.goMentionUnreadBadge.innerText = hasMentions ? '' + (dialog.unread_mentions_count) : '';\n this.goMentionBtn.classList.toggle('is-visible', hasMentions);\n }\n }\n\n public getCurrentInputAsDraft(ignoreEmptyValue?: boolean) {\n const {value, entities} = getRichValueWithCaret(this.messageInputField.input, true, false);\n\n let draft: DraftMessage.draftMessage;\n if((value.length || ignoreEmptyValue) || this.replyToMsgId) {\n draft = {\n _: 'draftMessage',\n date: tsNow(true),\n message: value,\n entities: entities.length ? entities : undefined,\n pFlags: {\n no_webpage: this.noWebPage\n },\n reply_to_msg_id: this.replyToMsgId\n };\n }\n\n return draft;\n }\n\n public saveDraft() {\n if(!this.chat.peerId || this.editMsgId || this.chat.type === 'scheduled') return;\n const draft = this.getCurrentInputAsDraft();\n this.managers.appDraftsManager.syncDraft(this.chat.peerId, this.chat.threadId, draft);\n }\n\n public destroy() {\n // this.chat.log.error('Input destroying');\n\n this.listenerSetter.removeAll();\n }\n\n public cleanup(helperToo = true) {\n if(!this.chat.peerId) {\n this.chatInput.classList.add('hide');\n this.goDownBtn.classList.add('hide');\n }\n\n cancelSelection();\n\n this.lastTimeType = 0;\n this.startParam = undefined;\n\n if(this.toggleBotStartBtnDisability) {\n this.toggleBotStartBtnDisability();\n this.toggleBotStartBtnDisability = undefined;\n }\n\n if(this.messageInput) {\n this.clearInput();\n helperToo && this.clearHelper();\n }\n }\n\n public async setDraft(draft?: MyDraftMessage, fromUpdate = true, force = false) {\n if((!force && !isInputEmpty(this.messageInput)) || this.chat.type === 'scheduled') return false;\n\n if(!draft) {\n draft = await this.managers.appDraftsManager.getDraft(this.chat.peerId, this.chat.threadId);\n\n if(!draft) {\n if(force) { // this situation can only happen when sending message with clearDraft\n /* const height = this.chatInput.getBoundingClientRect().height;\n const willChangeHeight = 78 - height;\n this.willChangeHeight = willChangeHeight; */\n if(this.chat.container.classList.contains('is-helper-active')) {\n this.t();\n }\n\n this.messageInputField.inputFake.textContent = '';\n this.messageInputField.onFakeInput(false);\n\n ((this.chat.bubbles.messagesQueuePromise || Promise.resolve()) as Promise).then(() => {\n fastRaf(() => {\n this.onMessageSent();\n });\n });\n }\n\n return false;\n }\n }\n\n const wrappedDraft = wrapDraft(draft, this.chat.peerId);\n const currentDraft = this.getCurrentInputAsDraft();\n\n if(draftsAreEqual(draft, currentDraft) &&/* this.messageInputField.value === wrappedDraft && */this.replyToMsgId === draft.reply_to_msg_id) return false;\n\n if(fromUpdate) {\n this.clearHelper();\n }\n\n this.noWebPage = draft.pFlags.no_webpage;\n if(draft.reply_to_msg_id) {\n this.initMessageReply(draft.reply_to_msg_id);\n }\n\n this.setInputValue(wrappedDraft, fromUpdate, fromUpdate);\n return true;\n }\n\n private createSendAs() {\n this.sendAsPeerId = undefined;\n\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\n let firstChange = true;\n this.sendAs = new ChatSendAs(\n this.managers,\n (container, skipAnimation) => {\n let useRafs = 0;\n if(!container.parentElement) {\n this.newMessageWrapper.prepend(container);\n useRafs = 2;\n }\n\n this.updateOffset('as', true, skipAnimation, useRafs);\n },\n (sendAsPeerId) => {\n this.sendAsPeerId = sendAsPeerId;\n\n // do not change placeholder earlier than finishPeerChange does\n if(firstChange) {\n firstChange = false;\n return;\n }\n\n this.getPlaceholderKey().then((key) => {\n this.updateMessageInputPlaceholder(key);\n });\n }\n );\n } else {\n this.sendAs = undefined;\n }\n\n return this.sendAs;\n }\n\n public async finishPeerChange(startParam?: string) {\n const peerId = this.chat.peerId;\n\n const {forwardElements, btnScheduled, replyKeyboard, sendMenu, goDownBtn, chatInput, botCommandsToggle} = this;\n\n const previousSendAs = this.sendAs;\n const sendAs = this.createSendAs();\n\n const [\n isBroadcast,\n canPinMessage,\n isBot,\n canSend,\n neededFakeContainer,\n ackedPeerFull,\n ackedScheduledMids,\n setSendAsCallback,\n filteredAttachMenuButtons\n ] = await Promise.all([\n this.managers.appPeersManager.isBroadcast(peerId),\n this.managers.appPeersManager.canPinMessage(peerId),\n this.managers.appPeersManager.isBot(peerId),\n this.chat.canSend(),\n this.getNeededFakeContainer(startParam),\n modifyAckedPromise(this.managers.acknowledged.appProfileManager.getProfileByPeerId(peerId)),\n btnScheduled ? modifyAckedPromise(this.managers.acknowledged.appMessagesManager.getScheduledMessages(peerId)) : undefined,\n sendAs ? (sendAs.setPeerId(this.chat.peerId), sendAs.updateManual(true)) : undefined,\n this.filterAttachMenuButtons()\n ]);\n\n const placeholderKey = this.messageInput ? await this.getPlaceholderKey() : undefined;\n\n return () => {\n // console.warn('[input] finishpeerchange start');\n\n chatInput.classList.remove('hide');\n goDownBtn.classList.toggle('is-broadcast', isBroadcast);\n goDownBtn.classList.remove('hide');\n\n this.messageInputField?.onFakeInput();\n\n if(this.goDownUnreadBadge) {\n this.setUnreadCount();\n }\n\n if(this.chat.type === 'pinned') {\n chatInput.classList.toggle('can-pin', canPinMessage);\n }/* else if(this.chat.type === 'chat') {\n } */\n\n if(forwardElements) {\n this.forwardWasDroppingAuthor = false;\n forwardElements.showCaption.checkboxField.setValueSilently(true);\n forwardElements.showSender.checkboxField.setValueSilently(true);\n }\n\n if(btnScheduled && ackedScheduledMids) {\n btnScheduled.classList.add('hide');\n const middleware = this.chat.bubbles.getMiddleware();\n callbackify(ackedScheduledMids.result, (mids) => {\n if(!middleware() || !mids) return;\n btnScheduled.classList.toggle('hide', !mids.length);\n });\n }\n\n if(this.newMessageWrapper) {\n this.updateOffset(null, false, true);\n }\n\n if(botCommandsToggle) {\n this.hasBotCommands = undefined;\n this.botCommands.toggle(true, undefined, true);\n this.updateBotCommandsToggle(true);\n botCommandsToggle.remove();\n if(isBot) {\n const middleware = this.chat.bubbles.getMiddleware();\n const result = ackedPeerFull.result;\n callbackify(result, (userFull) => {\n if(!middleware()) return;\n this.updateBotCommands(userFull as UserFull.userFull, !(result instanceof Promise));\n });\n }\n }\n\n if(previousSendAs) {\n previousSendAs.destroy();\n }\n\n if(setSendAsCallback) {\n setSendAsCallback();\n }\n\n if(replyKeyboard) {\n replyKeyboard.setPeer(peerId);\n }\n\n if(sendMenu) {\n sendMenu.setPeerId(peerId);\n }\n\n if(this.messageInput) {\n this.updateMessageInput(canSend, placeholderKey, filteredAttachMenuButtons);\n this.messageInput.dataset.peerId = '' + peerId;\n }\n\n let haveSomethingInControl = false;\n if(this.pinnedControlBtn) {\n const good = this.chat.type === 'pinned';\n haveSomethingInControl ||= good;\n this.pinnedControlBtn.classList.toggle('hide', !good);\n this.pinnedControlBtn.replaceChildren(i18n(canPinMessage ? 'Chat.Input.UnpinAll' : 'Chat.Pinned.DontShow'));\n }\n\n {\n const good = this.chat.isForum && !this.chat.isForumTopic && this.chat.type === 'chat';\n haveSomethingInControl ||= good;\n this.replyInTopicOverlay.classList.toggle('hide', !good);\n }\n\n this.botStartBtn.classList.toggle('hide', haveSomethingInControl);\n\n // * testing\n // this.startParam = this.appPeersManager.isBot(peerId) ? '123' : undefined;\n\n this.startParam = startParam;\n\n this._center(neededFakeContainer, false);\n\n // console.warn('[input] finishpeerchange ends');\n };\n }\n\n private updateOffset(type: 'commands' | 'as', forwards: boolean, skipAnimation?: boolean, useRafs?: number) {\n if(type) {\n this.newMessageWrapper.dataset.offset = type;\n } else {\n delete this.newMessageWrapper.dataset.offset;\n }\n\n SetTransition({\n element: this.newMessageWrapper,\n className: 'has-offset',\n forwards,\n duration: skipAnimation ? 0 : 300,\n useRafs\n });\n }\n\n private updateBotCommands(userFull: UserFull.userFull, skipAnimation?: boolean) {\n this.hasBotCommands = !!userFull.bot_info?.commands?.length;\n this.updateBotCommandsToggle(skipAnimation);\n }\n\n private updateBotCommandsToggle(skipAnimation?: boolean) {\n const {botCommandsToggle, hasBotCommands} = this;\n\n const show = !!hasBotCommands && this.isInputEmpty();\n if(!hasBotCommands) {\n if(!botCommandsToggle.parentElement) {\n return;\n }\n\n botCommandsToggle.remove();\n }\n\n const forwards = show;\n const useRafs = botCommandsToggle.parentElement ? 0 : 2;\n\n if(!botCommandsToggle.parentElement) {\n this.newMessageWrapper.prepend(botCommandsToggle);\n }\n\n this.updateOffset('commands', forwards, skipAnimation, useRafs);\n }\n\n private async getPlaceholderKey() {\n const {peerId, threadId, isForum} = this.chat;\n let key: LangPackKey;\n if(threadId && !isForum) {\n key = 'Comment';\n } else if(await this.managers.appPeersManager.isBroadcast(peerId)) {\n key = 'ChannelBroadcast';\n } else if(\n (this.sendAsPeerId !== undefined && this.sendAsPeerId !== rootScope.myId) ||\n await this.managers.appMessagesManager.isAnonymousSending(peerId)\n ) {\n key = 'SendAnonymously';\n } else {\n key = 'Message';\n }\n\n return key;\n }\n\n private updateMessageInputPlaceholder(key: LangPackKey) {\n // console.warn('[input] update placeholder');\n const i = I18n.weakMap.get(this.messageInput) as I18n.IntlElement;\n if(!i) {\n return;\n }\n\n i.compareAndUpdate({key});\n }\n\n private filterAttachMenuButtons() {\n if(!this.attachMenuButtons) return;\n return filterAsync(this.attachMenuButtons, (button) => {\n return button.verify();\n });\n }\n\n public updateMessageInput(canSend: boolean, placeholderKey: LangPackKey, visible: ChatInput['attachMenuButtons']) {\n const {chatInput, attachMenu, messageInput} = this;\n const {peerId, threadId} = this.chat;\n const isHidden = chatInput.classList.contains('is-hidden');\n const willBeHidden = !canSend;\n if(isHidden !== willBeHidden) {\n chatInput.classList.add('no-transition');\n chatInput.classList.toggle('is-hidden', !canSend);\n void chatInput.offsetLeft; // reflow\n chatInput.classList.remove('no-transition');\n }\n\n this.updateMessageInputPlaceholder(placeholderKey);\n\n if(!canSend) {\n messageInput.contentEditable = 'inherit';\n } else {\n messageInput.contentEditable = 'true';\n this.setDraft(undefined, false);\n\n if(!messageInput.innerHTML) {\n this.messageInputField.onFakeInput();\n }\n }\n\n if(attachMenu) {\n attachMenu.toggleAttribute('disabled', !visible.length);\n attachMenu.classList.toggle('btn-disabled', !visible.length);\n }\n\n this.updateSendBtn();\n }\n\n private attachMessageInputField() {\n const oldInputField = this.messageInputField;\n this.messageInputField = new InputFieldAnimated({\n placeholder: 'Message',\n name: 'message',\n withLinebreaks: true\n });\n\n this.messageInputField.input.classList.replace('input-field-input', 'input-message-input');\n this.messageInputField.inputFake.classList.replace('input-field-input', 'input-message-input');\n this.messageInput = this.messageInputField.input;\n this.attachMessageInputListeners();\n\n if(IS_STICKY_INPUT_BUGGED) {\n fixSafariStickyInputFocusing(this.messageInput);\n }\n\n if(oldInputField) {\n oldInputField.input.replaceWith(this.messageInputField.input);\n oldInputField.inputFake.replaceWith(this.messageInputField.inputFake);\n } else {\n this.inputMessageContainer.append(this.messageInputField.input, this.messageInputField.inputFake);\n }\n }\n\n private attachMessageInputListeners() {\n this.listenerSetter.add(this.messageInput)('keydown', (e) => {\n const key = e.key;\n\n if(isSendShortcutPressed(e)) {\n cancelEvent(e);\n this.sendMessage();\n } else if(e.ctrlKey || e.metaKey) {\n this.handleMarkdownShortcut(e);\n } else if((key === 'PageUp' || key === 'PageDown') && !e.shiftKey) { // * fix pushing page to left (Chrome Windows)\n e.preventDefault();\n\n if(key === 'PageUp') {\n const range = document.createRange();\n const sel = window.getSelection();\n\n range.setStart(this.messageInput.childNodes[0] || this.messageInput, 0);\n range.collapse(true);\n\n sel.removeAllRanges();\n sel.addRange(range);\n } else {\n placeCaretAtEnd(this.messageInput);\n }\n }\n });\n\n if(IS_TOUCH_SUPPORTED) {\n attachClickEvent(this.messageInput, (e) => {\n if(emoticonsDropdown.isActive()) {\n emoticonsDropdown.toggle(false);\n blurActiveElement();\n cancelEvent(e);\n // this.messageInput.focus();\n return;\n }\n\n this.appImManager.selectTab(APP_TABS.CHAT); // * set chat tab for album orientation\n // this.saveScroll();\n }, {listenerSetter: this.listenerSetter});\n\n /* this.listenerSetter.add(window)('resize', () => {\n this.restoreScroll();\n }); */\n\n /* if(isSafari) {\n this.listenerSetter.add(this.messageInput)('mousedown', () => {\n window.requestAnimationFrame(() => {\n window.requestAnimationFrame(() => {\n emoticonsDropdown.toggle(false);\n });\n });\n });\n } */\n }\n\n /* this.listenerSetter.add(this.messageInput)('beforeinput', (e: Event) => {\n // * validate due to manual formatting through browser's context menu\n const inputType = (e as InputEvent).inputType;\n //console.log('message beforeinput event', e);\n\n if(inputType.indexOf('format') === 0) {\n //console.log('message beforeinput format', e, inputType, this.messageInput.innerHTML);\n const markdownType = inputType.split('format')[1].toLowerCase() as MarkdownType;\n if(this.applyMarkdown(markdownType)) {\n cancelEvent(e); // * cancel legacy markdown event\n }\n }\n }); */\n this.listenerSetter.add(this.messageInput)('input', this.onMessageInput);\n this.listenerSetter.add(this.messageInput)('keyup', () => {\n this.checkAutocomplete();\n });\n\n this.listenerSetter.add(this.messageInput)('focusin', () => {\n if((this.chat.type === 'chat' || this.chat.type === 'discussion') &&\n this.chat.bubbles.scrollable.loadedAll.bottom) {\n this.managers.appMessagesManager.readAllHistory(this.chat.peerId, this.chat.threadId);\n }\n });\n }\n\n private prepareDocumentExecute = () => {\n this.executedHistory.push(this.messageInput.innerHTML);\n return () => this.canUndoFromHTML = this.messageInput.innerHTML;\n };\n\n private undoRedo = (e: Event, type: 'undo' | 'redo', needHTML: string) => {\n cancelEvent(e); // cancel legacy event\n\n let html = this.messageInput.innerHTML;\n if(html && html !== needHTML) {\n this.lockRedo = true;\n\n let sameHTMLTimes = 0;\n do {\n document.execCommand(type, false, null);\n const currentHTML = this.messageInput.innerHTML;\n if(html === currentHTML) {\n if(++sameHTMLTimes > 2) { // * unlink, removeFormat (ะฐ ะผะพะถะตั‚ ะธ ะฝะตั‚, ัะปัƒั‡ะฐะน: ะทะฐะฑะพะปะดะธั‚ัŒ ะฟะพะดั‡ั‘ั€ะบะฝัƒั‚ั‹ะน ั‚ะตะบัั‚ (ะฒั‹ะดะตะปะธั‚ัŒ ั€ะพะฒะฝะพ ะตะณะพ), ะฟะพะฟั€ะพะฑะพะฒะฐั‚ัŒ ะพั‚ะผะตะฝะธั‚ัŒ)\n break;\n }\n } else {\n sameHTMLTimes = 0;\n }\n\n html = currentHTML;\n } while(html !== needHTML);\n\n this.lockRedo = false;\n }\n };\n\n public applyMarkdown(type: MarkdownType, href?: string) {\n // const MONOSPACE_FONT = 'var(--font-monospace)';\n // const SPOILER_FONT = 'spoiler';\n const commandsMap: Partial<{[key in typeof type]: string | (() => void)}> = {\n // bold: 'Bold',\n // italic: 'Italic',\n // underline: 'Underline',\n // strikethrough: 'Strikethrough',\n // monospace: () => document.execCommand('fontName', false, MONOSPACE_FONT),\n link: href ? () => document.execCommand('createLink', false, href) : () => document.execCommand('unlink', false, null)\n // spoiler: () => document.execCommand('fontName', false, SPOILER_FONT)\n };\n\n const c = (type: MarkdownType) => {\n commandsMap[type] = () => {\n const k = (canCombine.includes(type) ? canCombine : [type]).filter((type) => hasMarkup[type]);\n if(!indexOfAndSplice(k, type)) {\n k.push(type);\n }\n\n if(!k.length) {\n return this.resetCurrentFontFormatting();\n } else {\n return document.execCommand('fontName', false, 'markup-' + k.join('-'));\n }\n };\n };\n\n const canCombine = ['bold', 'italic', 'underline', 'strikethrough', 'spoiler'] as (typeof type)[];\n canCombine.forEach((type) => {\n c(type);\n });\n\n c('monospace');\n\n if(!commandsMap[type]) {\n return false;\n }\n\n const command = commandsMap[type];\n\n // type = 'monospace';\n\n // const saveExecuted = this.prepareDocumentExecute();\n const executed: any[] = [];\n /**\n * * clear previous formatting, due to Telegram's inability to handle several entities\n */\n /* const checkForSingle = () => {\n const nodes = getSelectedNodes();\n //console.log('Using formatting:', commandsMap[type], nodes, this.executedHistory);\n\n const parents = [...new Set(nodes.map((node) => node.parentNode))];\n //const differentParents = !!nodes.find((node) => node.parentNode !== firstParent);\n const differentParents = parents.length > 1;\n\n let notSingle = false;\n if(differentParents) {\n notSingle = true;\n } else {\n const node = nodes[0];\n if(node && (node.parentNode as HTMLElement) !== this.messageInput && (node.parentNode.parentNode as HTMLElement) !== this.messageInput) {\n notSingle = true;\n }\n }\n\n if(notSingle) {\n //if(type === 'monospace') {\n executed.push(document.execCommand('styleWithCSS', false, 'true'));\n //}\n\n executed.push(document.execCommand('unlink', false, null));\n executed.push(document.execCommand('removeFormat', false, null));\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\n\n //if(type === 'monospace') {\n executed.push(document.execCommand('styleWithCSS', false, 'false'));\n //}\n }\n }; */\n\n // fix applying markdown when range starts from contenteditable=\"false\"\n let textNode: Text;\n // do {\n // // const {node, offset, selection} = getCaretPosNew(this.messageInput, true);\n // const selection = document.getSelection();\n // const range = selection.getRangeAt(0);\n // const {node, offset} = getCaretPosF(this.messageInput, range.startContainer, range.startOffset);\n // // const node = range.startContainer as ChildNode;\n // if(node?.textContent === BOM || (node as HTMLElement)?.isContentEditable === false) {\n // // selection.modify('extend', 'backward', 'character');\n // textNode = document.createTextNode(BOM);\n // (node.nodeType === node.ELEMENT_NODE ? node : node.parentElement).before(textNode);\n // range.setStart(textNode, 0);\n // }/* else {\n // break;\n // } */\n\n // break;\n // } while(true);\n\n const richInputHandler = RichInputHandler.getInstance();\n const restore = richInputHandler.prepareApplyingMarkdown();\n\n const listener = this.listenerSetter.add(this.messageInput)('input', cancelEvent, {capture: true, passive: false}) as any as Listener;\n\n executed.push(document.execCommand('styleWithCSS', false, 'true'));\n\n const hasMarkup = hasMarkupInSelection(Object.keys(commandsMap) as (typeof type)[]);\n\n // * monospace can't be combined with different types\n /* if(type === 'monospace' || type === 'spoiler') {\n // executed.push(document.execCommand('styleWithCSS', false, 'true'));\n\n const haveThisType = hasMarkup[type];\n // executed.push(document.execCommand('removeFormat', false, null));\n\n if(haveThisType) {\n executed.push(this.resetCurrentFontFormatting());\n } else {\n // if(type === 'monospace' || hasMarkup['monospace']) {\n // executed.push(this.resetCurrentFormatting());\n // }\n\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\n }\n } else */{\n if(hasMarkup['monospace'] && type === 'link') {\n executed.push(this.resetCurrentFormatting());\n }\n\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\n }\n\n executed.push(document.execCommand('styleWithCSS', false, 'false'));\n\n restore();\n\n // checkForSingle();\n // saveExecuted();\n if(this.appImManager.markupTooltip) {\n this.appImManager.markupTooltip.setActiveMarkupButton();\n }\n\n if(textNode) {\n (textNode.parentElement === this.messageInput ? textNode : textNode.parentElement).remove();\n textNode.nodeValue = '';\n }\n\n this.listenerSetter.remove(listener);\n this.messageInputField.simulateInputEvent();\n\n return true;\n }\n\n private resetCurrentFormatting() {\n return document.execCommand('removeFormat', false, null);\n }\n\n private resetCurrentFontFormatting() {\n return document.execCommand('fontName', false, 'Roboto');\n }\n\n private handleMarkdownShortcut = (e: KeyboardEvent) => {\n // console.log('handleMarkdownShortcut', e);\n const formatKeys: {[key: string]: MarkdownType} = {\n 'KeyB': 'bold',\n 'KeyI': 'italic',\n 'KeyU': 'underline',\n 'KeyS': 'strikethrough',\n 'KeyM': 'monospace',\n 'KeyP': 'spoiler'\n };\n\n if(this.appImManager.markupTooltip) {\n formatKeys['KeyK'] = 'link';\n }\n\n const code = e.code;\n const applyMarkdown = formatKeys[code];\n\n const selection = document.getSelection();\n if(!isSelectionEmpty(selection) && applyMarkdown) {\n // * ะบะพัั‚ั‹ะปัŒั‡ะธะบ\n if(code === 'KeyK') {\n this.appImManager.markupTooltip.showLinkEditor();\n } else {\n this.applyMarkdown(applyMarkdown);\n }\n\n cancelEvent(e); // cancel legacy event\n }\n\n // return;\n if(code === 'KeyZ') {\n let html = this.messageInput.innerHTML;\n\n if(e.shiftKey) {\n if(this.undoHistory.length) {\n this.executedHistory.push(html);\n html = this.undoHistory.pop();\n this.undoRedo(e, 'redo', html);\n html = this.messageInput.innerHTML;\n this.canRedoFromHTML = this.undoHistory.length ? html : '';\n this.canUndoFromHTML = html;\n }\n } else {\n // * ะฟะพะดะพะถะดั‘ะผ, ะบะพะณะดะฐ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปัŒ ัะฐะผ ะฒะพััั‚ะฐะฝะพะฒะธั‚ ะฟะพะปะต ะดะพ ะฝัƒะถะฝะพะณะพ ัะพัั‚ะพัะฝะธั, ะบะพั‚ะพั€ะพะต ัั‚ะฐะปะพ ัั€ะฐะทัƒ ะฟะพัะปะต saveExecuted\n if(this.executedHistory.length && (!this.canUndoFromHTML || html === this.canUndoFromHTML)) {\n this.undoHistory.push(html);\n html = this.executedHistory.pop();\n this.undoRedo(e, 'undo', html);\n\n // * ะฟะพัั‚ะฐะฒะธะผ ะฝะพะฒะพะต ัะพัั‚ะพัะฝะธะต ั‡ั‚ะพะฑั‹ ัะฝะพะฒะฐ ะฟะพะดะพะถะดะฐั‚ัŒ, ะตัะปะธ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปัŒ ะธะทะผะตะฝะธั‚ ั‡ั‚ะพ-ั‚ะพ, ะธ ะฟะพั‚ะพะผ ะฟะพะฟั€ะพะฑัƒะตั‚ ะพั‚ะบะฐั‚ะธั‚ัŒ ะดะพ ะฟั€ะตะดั‹ะดัƒั‰ะตะณะพ ัะพัั‚ะพัะฝะธั\n this.canUndoFromHTML = this.canRedoFromHTML = this.messageInput.innerHTML;\n }\n }\n }\n };\n\n private onMessageInput = (e?: Event) => {\n // * validate due to manual formatting through browser's context menu\n /* const inputType = (e as InputEvent).inputType;\n console.log('message input event', e);\n if(inputType === 'formatBold') {\n console.log('message input format', this.messageInput.innerHTML);\n cancelEvent(e);\n }\n\n if(!isSelectionSingle()) {\n alert('not single');\n } */\n\n // console.log('messageInput input', this.messageInput.innerText);\n // const value = this.messageInput.innerText;\n const {value: richValue, entities: markdownEntities, caretPos} = getRichValueWithCaret(this.messageInputField.input);\n\n // const entities = parseEntities(value);\n const value = parseMarkdown(richValue, markdownEntities, true);\n const entities = mergeEntities(markdownEntities, parseEntities(value));\n\n // this.chat.log('messageInput entities', richValue, value, markdownEntities, caretPos);\n\n if(this.canRedoFromHTML && !this.lockRedo && this.messageInput.innerHTML !== this.canRedoFromHTML) {\n this.canRedoFromHTML = '';\n this.undoHistory.length = 0;\n }\n\n const urlEntities: Array = (!this.editMessage?.media || this.editMessage.media._ === 'messageMediaWebPage') && entities.filter((e) => e._ === 'messageEntityUrl' || e._ === 'messageEntityTextUrl') as any;\n if(urlEntities.length) {\n for(const entity of urlEntities) {\n let url: string;\n if(entity._ === 'messageEntityTextUrl') {\n url = entity.url;\n } else {\n url = richValue.slice(entity.offset, entity.offset + entity.length);\n\n if(!(url.includes('http://') || url.includes('https://'))) {\n continue;\n }\n }\n\n // console.log('messageInput url:', url);\n\n if(this.lastUrl !== url) {\n this.lastUrl = url;\n // this.willSendWebPage = null;\n const promise = this.getWebPagePromise = this.managers.appWebPagesManager.getWebPage(url).then((webpage) => {\n if(this.getWebPagePromise === promise) this.getWebPagePromise = undefined;\n if(this.lastUrl !== url) return;\n if(webpage._ === 'webPage') {\n // console.log('got webpage: ', webpage);\n\n this.setTopInfo('webpage', () => {}, webpage.site_name || webpage.title || 'Webpage', webpage.description || webpage.url || '');\n delete this.noWebPage;\n this.willSendWebPage = webpage;\n } else if(this.willSendWebPage) {\n this.onHelperCancel();\n }\n });\n }\n\n break;\n }\n } else if(this.lastUrl) {\n this.lastUrl = '';\n delete this.noWebPage;\n this.willSendWebPage = null;\n\n if(this.helperType) {\n this.helperFunc();\n } else {\n this.clearHelper();\n }\n }\n\n const isEmpty = !richValue.trim();\n if(isEmpty) {\n if(this.lastTimeType) {\n this.managers.appMessagesManager.setTyping(this.chat.peerId, {_: 'sendMessageCancelAction'}, undefined, this.chat.threadId);\n }\n\n if(this.appImManager.markupTooltip) {\n this.appImManager.markupTooltip.hide();\n }\n\n // * Chrome has a bug - it will preserve the formatting if the input with monospace text is cleared\n // * so have to reset formatting\n if(document.activeElement === this.messageInput) {\n // document.execCommand('styleWithCSS', false, 'true');\n setTimeout(() => {\n if(document.activeElement === this.messageInput) {\n this.resetCurrentFontFormatting();\n }\n }, 0);\n // document.execCommand('styleWithCSS', false, 'false');\n }\n } else {\n const time = Date.now();\n if((time - this.lastTimeType) >= 6000) {\n this.lastTimeType = time;\n this.managers.appMessagesManager.setTyping(this.chat.peerId, {_: 'sendMessageTypingAction'}, undefined, this.chat.threadId);\n }\n\n if(this.botCommands) {\n this.botCommands.toggle(true);\n }\n }\n\n if(this.botCommands) {\n this.updateBotCommandsToggle();\n }\n\n if(!this.editMsgId) {\n this.saveDraftDebounced();\n }\n\n this.checkAutocomplete(richValue, caretPos, entities);\n\n this.updateSendBtn();\n };\n\n public insertAtCaret(insertText: string, insertEntity?: MessageEntity, isHelper = true) {\n RichInputHandler.getInstance().makeFocused(this.messageInput);\n\n const {value: fullValue, caretPos, entities} = getRichValueWithCaret(this.messageInput);\n const pos = caretPos >= 0 ? caretPos : fullValue.length;\n const prefix = fullValue.substr(0, pos);\n const suffix = fullValue.substr(pos);\n\n const matches = isHelper ? prefix.match(ChatInput.AUTO_COMPLETE_REG_EXP) : null;\n\n const matchIndex = matches ? matches.index + (matches[0].length - matches[2].length) : prefix.length;\n const newPrefix = prefix.slice(0, matchIndex);\n const newValue = newPrefix + insertText + suffix;\n\n if(isHelper && caretPos !== -1) {\n const match = matches[2];\n // const {node, selection} = getCaretPosNew(this.messageInput);\n\n const selection = document.getSelection();\n // const range = document.createRange();\n let counter = 0;\n while(selection.toString() !== match) {\n if(++counter >= 10000) {\n throw new Error('lolwhat');\n }\n\n // for(let i = 0; i < match.length; ++i) {\n selection.modify('extend', 'backward', 'character');\n }\n }\n\n {\n // const fragment = wrapDraftText(insertText, {entities: insertEntity ? [insertEntity] : undefined, wrappingForPeerId: this.chat.peerId});\n insertRichTextAsHTML(this.messageInput, insertText, insertEntity ? [insertEntity] : undefined, this.chat.peerId);\n // const {node, offset} = getCaretPos(this.messageInput);\n // const fragmentLastChild = fragment.lastChild;\n // if(node?.nodeType === node.TEXT_NODE) {\n // const prefix = node.nodeValue.slice(0, offset);\n // const suffix = node.nodeValue.slice(offset);\n\n // const suffixNode = document.createTextNode(suffix);\n\n // node.nodeValue = prefix;\n // node.parentNode.insertBefore(suffixNode, node.nextSibling);\n // node.parentNode.insertBefore(fragment, suffixNode);\n\n // setCaretAt(fragmentLastChild.nextSibling);\n\n // this.messageInputField.simulateInputEvent();\n // }\n }\n return;\n\n // merge emojis\n const hadEntities = parseEntities(fullValue);\n mergeEntities(entities, hadEntities);\n\n // max for additional whitespace\n const insertLength = insertEntity ? Math.max(insertEntity.length, insertText.length) : insertText.length;\n const addEntities: MessageEntity[] = [];\n if(insertEntity) {\n addEntities.push(insertEntity);\n insertEntity.offset = matchIndex;\n }\n\n // add offset to entities next to emoji\n const diff = matches ? insertLength - matches[2].length : insertLength;\n entities.forEach((entity) => {\n if(entity.offset >= matchIndex) {\n entity.offset += diff;\n }\n });\n\n mergeEntities(entities, addEntities);\n\n if(/* caretPos !== -1 && caretPos !== fullValue.length */true) {\n const caretEntity: MessageEntity.messageEntityCaret = {\n _: 'messageEntityCaret',\n offset: matchIndex + insertLength,\n length: 0\n };\n\n let insertCaretAtIndex = 0;\n for(let length = entities.length; insertCaretAtIndex < length; ++insertCaretAtIndex) {\n const entity = entities[insertCaretAtIndex];\n if(entity.offset > caretEntity.offset) {\n break;\n }\n }\n\n entities.splice(insertCaretAtIndex, 0, caretEntity);\n }\n\n // const saveExecuted = this.prepareDocumentExecute();\n // can't exec .value here because it will instantly check for autocomplete\n const value = documentFragmentToHTML(wrapDraftText(newValue, {entities}));\n this.messageInputField.setValueSilently(value);\n\n const caret = this.messageInput.querySelector('.composer-sel');\n if(caret) {\n setCaretAt(caret);\n caret.remove();\n }\n\n // but it's needed to be checked only here\n this.onMessageInput();\n\n // saveExecuted();\n\n // document.execCommand('insertHTML', true, wrapEmojiText(emoji));\n }\n\n public onEmojiSelected = (emoji: ReturnType, autocomplete: boolean) => {\n const entity: MessageEntity = emoji.docId ? {_: 'messageEntityCustomEmoji', document_id: emoji.docId, length: emoji.emoji.length, offset: 0} : getEmojiEntityFromEmoji(emoji.emoji);\n this.insertAtCaret(emoji.emoji, entity, autocomplete);\n };\n\n private async checkAutocomplete(value?: string, caretPos?: number, entities?: MessageEntity[]) {\n // return;\n\n if(value === undefined) {\n const r = getRichValueWithCaret(this.messageInputField.input, true, true);\n value = r.value;\n caretPos = r.caretPos;\n entities = r.entities;\n }\n\n if(caretPos === -1) {\n caretPos = value.length;\n }\n\n if(entities === undefined) {\n const _value = parseMarkdown(value, entities, true);\n entities = mergeEntities(entities, parseEntities(_value));\n }\n\n value = value.slice(0, caretPos);\n\n if(this.previousQuery === value) {\n return;\n }\n\n this.previousQuery = value;\n\n const matches = value.match(ChatInput.AUTO_COMPLETE_REG_EXP);\n let foundHelper: AutocompleteHelper;\n if(matches) {\n const entity = entities[0];\n\n let query = matches[2];\n const firstChar = query[0];\n\n if(this.stickersHelper &&\n rootScope.settings.stickers.suggest &&\n await this.chat.canSend('send_stickers') &&\n entity?._ === 'messageEntityEmoji' && entity.length === value.length && !entity.offset) {\n foundHelper = this.stickersHelper;\n this.stickersHelper.checkEmoticon(value);\n } else if(firstChar === '@') { // mentions\n const topMsgId = this.chat.threadId ? getServerMessageId(this.chat.threadId) : undefined;\n if(await this.mentionsHelper.checkQuery(query, this.chat.peerId.isUser() ? NULL_PEER_ID : this.chat.peerId, topMsgId)) {\n foundHelper = this.mentionsHelper;\n }\n } else if(!matches[1] && firstChar === '/') { // commands\n if(await this.commandsHelper.checkQuery(query, this.chat.peerId)) {\n foundHelper = this.commandsHelper;\n }\n } else if(rootScope.settings.emoji.suggest) { // emoji\n query = query.replace(/^\\s*/, '');\n if(!value.match(/^\\s*:(.+):\\s*$/) && !value.match(/:[;!@#$%^&*()-=|]/) && query) {\n foundHelper = this.emojiHelper;\n this.emojiHelper.checkQuery(query, firstChar);\n }\n }\n }\n\n foundHelper = this.checkInlineAutocomplete(value, foundHelper);\n\n this.autocompleteHelperController.hideOtherHelpers(foundHelper);\n }\n\n private checkInlineAutocomplete(value: string, foundHelper?: AutocompleteHelper): AutocompleteHelper {\n let needPlaceholder = false;\n\n const setPreloaderShow = (show: boolean) => {\n if(!this.btnPreloader) {\n return;\n }\n\n SetTransition({\n element: this.btnPreloader,\n className: 'show',\n forwards: show,\n duration: 400\n });\n };\n\n if(!foundHelper) {\n const inlineMatch = value.match(/^@([a-zA-Z\\\\d_]{3,32})\\s/);\n if(inlineMatch) {\n const username = inlineMatch[1];\n const query = value.slice(inlineMatch[0].length);\n needPlaceholder = inlineMatch[0].length === value.length;\n\n foundHelper = this.inlineHelper;\n\n if(!this.btnPreloader) {\n this.btnPreloader = ButtonIcon('none btn-preloader float show disable-hover', {noRipple: true});\n putPreloader(this.btnPreloader, true);\n this.inputMessageContainer.parentElement.insertBefore(this.btnPreloader, this.inputMessageContainer.nextSibling);\n } else {\n setPreloaderShow(true);\n }\n\n this.inlineHelper.checkQuery(this.chat.peerId, username, query).then(({user, renderPromise}) => {\n if(needPlaceholder && user.bot_inline_placeholder) {\n this.messageInput.dataset.inlinePlaceholder = user.bot_inline_placeholder;\n }\n\n renderPromise.then(() => {\n setPreloaderShow(false);\n });\n }).catch((err: ApiError) => {\n setPreloaderShow(false);\n });\n }\n }\n\n if(!needPlaceholder) {\n delete this.messageInput.dataset.inlinePlaceholder;\n }\n\n if(foundHelper !== this.inlineHelper) {\n setPreloaderShow(false);\n }\n\n return foundHelper;\n }\n\n private setRecording(value: boolean) {\n if(this.recording === value) {\n return;\n }\n\n SetTransition({\n element: this.chatInput,\n className: 'is-recording',\n forwards: value,\n duration: 200\n });\n this.recording = value;\n this.updateSendBtn();\n }\n\n private onBtnSendClick = async(e: Event) => {\n cancelEvent(e);\n\n if(!this.recorder || this.recording || !this.isInputEmpty() || this.forwarding || this.editMsgId) {\n if(this.recording) {\n if((Date.now() - this.recordStartTime) < RECORD_MIN_TIME) {\n this.onCancelRecordClick();\n } else {\n this.recorder.stop();\n }\n } else {\n this.sendMessage();\n }\n } else {\n const isAnyChat = this.chat.peerId.isAnyChat();\n if(isAnyChat && !(await this.chat.canSend('send_media'))) {\n toast(POSTING_MEDIA_NOT_ALLOWED);\n return;\n }\n\n this.chatInput.classList.add('is-locked');\n blurActiveElement();\n\n let restricted = false;\n if(!isAnyChat) {\n const userFull = await this.managers.appProfileManager.getProfile(this.chat.peerId.toUserId());\n if(userFull?.pFlags.voice_messages_forbidden) {\n toastNew({\n langPackKey: 'Chat.SendVoice.PrivacyError',\n langPackArguments: [await wrapPeerTitle({peerId: this.chat.peerId})]\n });\n restricted = true;\n }\n }\n\n if(restricted) {\n this.chatInput.classList.remove('is-locked');\n return;\n }\n\n this.recorder.start().then(() => {\n this.releaseMediaPlayback = appMediaPlaybackController.setSingleMedia();\n this.recordCanceled = false;\n\n this.setRecording(true);\n opusDecodeController.setKeepAlive(true);\n\n const showDiscardPopup = () => {\n new PopupPeer('popup-cancel-record', {\n titleLangKey: 'DiscardVoiceMessageTitle',\n descriptionLangKey: 'DiscardVoiceMessageDescription',\n buttons: [{\n langKey: 'DiscardVoiceMessageAction',\n callback: () => {\n simulateClickEvent(this.btnCancelRecord);\n }\n }, {\n langKey: 'Continue',\n isCancel: true\n }]\n }).show();\n };\n\n this.recordingOverlayListener = this.listenerSetter.add(document.body)('mousedown', (e) => {\n if(!findUpClassName(e.target, 'chat-input') && !findUpClassName(e.target, 'popup-cancel-record')) {\n cancelEvent(e);\n showDiscardPopup();\n }\n }, {capture: true, passive: false}) as any;\n\n appNavigationController.pushItem(this.recordingNavigationItem = {\n type: 'voice',\n onPop: () => {\n setTimeout(() => {\n showDiscardPopup();\n }, 0);\n\n return false;\n }\n });\n\n this.recordStartTime = Date.now();\n\n const sourceNode: MediaStreamAudioSourceNode = this.recorder.sourceNode;\n const context = sourceNode.context;\n\n const analyser = context.createAnalyser();\n sourceNode.connect(analyser);\n // analyser.connect(context.destination);\n analyser.fftSize = 32;\n\n const frequencyData = new Uint8Array(analyser.frequencyBinCount);\n const max = frequencyData.length * 255;\n const min = 54 / 150;\n const r = () => {\n if(!this.recording) return;\n\n analyser.getByteFrequencyData(frequencyData);\n\n let sum = 0;\n frequencyData.forEach((value) => {\n sum += value;\n });\n\n const percents = Math.min(1, (sum / max) + min);\n // console.log('frequencyData', frequencyData, percents);\n\n this.recordRippleEl.style.transform = `scale(${percents})`;\n\n const diff = Date.now() - this.recordStartTime;\n const ms = diff % 1000;\n\n const formatted = toHHMMSS(diff / 1000) + ',' + ('00' + Math.round(ms / 10)).slice(-2);\n\n this.recordTimeEl.innerText = formatted;\n\n fastRaf(r);\n };\n\n r();\n }).catch((e: Error) => {\n switch(e.name as string) {\n case 'NotAllowedError': {\n toast('Please allow access to your microphone');\n break;\n }\n\n case 'NotReadableError': {\n toast(e.message);\n break;\n }\n\n default:\n console.error('Recorder start error:', e, e.name, e.message);\n toast(e.message);\n break;\n }\n\n this.setRecording(false);\n this.chatInput.classList.remove('is-locked');\n });\n }\n };\n\n private onHelperCancel = async(e?: Event, force?: boolean) => {\n if(e) {\n cancelEvent(e);\n }\n\n if(this.willSendWebPage) {\n const lastUrl = this.lastUrl;\n let needReturn = false;\n if(this.helperType) {\n // if(this.helperFunc) {\n await this.helperFunc();\n // }\n\n needReturn = true;\n }\n\n // * restore values\n this.lastUrl = lastUrl;\n this.noWebPage = true;\n this.willSendWebPage = null;\n\n if(needReturn) return;\n }\n\n if(this.helperType === 'edit' && !force) {\n const message = this.editMessage;\n const draft = this.getCurrentInputAsDraft(true);\n if(draft) {\n delete draft.pFlags.no_webpage;\n }\n // const value = parseMarkdown(this.messageInputField.value, []);\n // if(message.message !== value) {\n const originalDraft = {...message, _: 'draftMessage'} as DraftMessage.draftMessage;\n if(originalDraft.entities?.length) {\n const canPassEntitiesTypes = new Set(Object.values(MARKDOWN_ENTITIES));\n originalDraft.entities = originalDraft.entities.slice();\n forEachReverse(originalDraft.entities, (entity, idx, arr) => {\n if(!canPassEntitiesTypes.has(entity._)) {\n arr.splice(idx, 1);\n }\n });\n\n if(!originalDraft.entities.length) {\n delete originalDraft.entities;\n }\n }\n\n if(!draftsAreEqual(draft, originalDraft)) {\n new PopupPeer('discard-editing', {\n buttons: [{\n langKey: 'Alert.Confirm.Discard',\n callback: () => {\n this.onHelperCancel(undefined, true);\n }\n }],\n descriptionLangKey: 'Chat.Edit.Cancel.Text'\n }).show();\n\n return;\n }\n }\n\n this.clearHelper();\n this.updateSendBtn();\n };\n\n private onHelperClick = (e: Event) => {\n cancelEvent(e);\n\n if(!findUpClassName(e.target, 'reply')) return;\n if(this.helperType === 'forward') {\n const {forwardElements} = this;\n if(forwardElements && IS_TOUCH_SUPPORTED && !forwardElements.container.classList.contains('active')) {\n contextMenuController.openBtnMenu(forwardElements.container);\n }\n } else if(this.helperType === 'reply') {\n this.chat.setMessageId(this.replyToMsgId);\n } else if(this.helperType === 'edit') {\n this.chat.setMessageId(this.editMsgId);\n }\n };\n\n private changeForwardRecipient() {\n if(this.helperWaitingForward) return;\n this.helperWaitingForward = true;\n\n const forwarding = copy(this.forwarding);\n const helperFunc = this.helperFunc;\n this.clearHelper();\n this.updateSendBtn();\n let selected = false;\n const popup = new PopupForward(forwarding, () => {\n selected = true;\n });\n\n popup.addEventListener('close', () => {\n this.helperWaitingForward = false;\n\n if(!selected) {\n helperFunc();\n }\n });\n }\n\n public async clearInput(canSetDraft = true, fireEvent = true, clearValue = '') {\n if(document.activeElement === this.messageInput && IS_MOBILE_SAFARI) { // fix first char uppercase\n const i = document.createElement('input');\n document.body.append(i);\n fixSafariStickyInput(i);\n this.messageInputField.setValueSilently(clearValue);\n fixSafariStickyInput(this.messageInput);\n i.remove();\n } else {\n this.messageInputField.setValueSilently(clearValue);\n }\n\n if(IS_TOUCH_SUPPORTED) {\n // this.messageInput.innerText = '';\n } else {\n // this.attachMessageInputField();\n // this.messageInput.innerText = '';\n\n // clear executions\n this.canRedoFromHTML = '';\n this.undoHistory.length = 0;\n this.executedHistory.length = 0;\n this.canUndoFromHTML = '';\n }\n\n let set = false;\n if(canSetDraft) {\n set = await this.setDraft(undefined, false);\n }\n\n if(!set && fireEvent) {\n this.onMessageInput();\n }\n }\n\n public isInputEmpty() {\n return isInputEmpty(this.messageInput);\n }\n\n public updateSendBtn() {\n let icon: 'send' | 'record' | 'edit' | 'schedule';\n\n const isInputEmpty = this.isInputEmpty();\n\n if(this.editMsgId) icon = 'edit';\n else if(!this.recorder || this.recording || !isInputEmpty || this.forwarding) icon = this.chat.type === 'scheduled' ? 'schedule' : 'send';\n else icon = 'record';\n\n ['send', 'record', 'edit', 'schedule'].forEach((i) => {\n this.btnSend.classList.toggle(i, icon === i);\n });\n\n if(this.btnScheduled) {\n this.btnScheduled.classList.toggle('show', isInputEmpty && this.chat.type !== 'scheduled');\n }\n\n if(this.btnToggleReplyMarkup) {\n this.btnToggleReplyMarkup.classList.toggle('show', isInputEmpty && this.chat.type !== 'scheduled');\n }\n }\n\n private getValueAndEntities(input: HTMLElement) {\n const {entities: apiEntities, value} = getRichValueWithCaret(this.messageInput, true, false);\n const myEntities = parseEntities(value);\n const totalEntities = mergeEntities(apiEntities, myEntities);\n\n return {value, totalEntities};\n }\n\n public onMessageSent(clearInput = true, clearReply?: boolean) {\n if(this.chat.type !== 'scheduled') {\n this.managers.appMessagesManager.readAllHistory(this.chat.peerId, this.chat.threadId, true);\n }\n\n this.scheduleDate = undefined;\n this.sendSilent = undefined;\n\n const {totalEntities} = this.getValueAndEntities(this.messageInput);\n let nextOffset = 0;\n const emojiEntities: (MessageEntity.messageEntityEmoji | MessageEntity.messageEntityCustomEmoji)[] = totalEntities.filter((entity) => {\n if(entity._ === 'messageEntityEmoji' || entity._ === 'messageEntityCustomEmoji') {\n const endOffset = entity.offset + entity.length;\n return endOffset <= nextOffset ? false : (nextOffset = endOffset, true);\n }\n\n return false;\n }) as any;\n emojiEntities.forEach((entity) => {\n const emoji: AppEmoji = entity._ === 'messageEntityEmoji' ? {emoji: emojiFromCodePoints(entity.unicode)} : {docId: entity.document_id, emoji: ''};\n this.managers.appEmojiManager.pushRecentEmoji(emoji);\n });\n\n if(clearInput) {\n this.lastUrl = '';\n delete this.noWebPage;\n this.willSendWebPage = null;\n this.clearInput();\n }\n\n if(clearReply || clearInput) {\n this.clearHelper();\n }\n\n this.updateSendBtn();\n }\n\n public sendMessage(force = false) {\n const {editMsgId, chat} = this;\n if(chat.type === 'scheduled' && !force && !editMsgId) {\n this.scheduleSending();\n return;\n }\n\n const {peerId} = chat;\n const {noWebPage} = this;\n const sendingParams = this.chat.getMessageSendingParams();\n\n const {value, entities} = getRichValueWithCaret(this.messageInputField.input, true, false);\n\n // return;\n if(editMsgId) {\n const message = this.editMessage;\n if(value.trim() || message.media) {\n this.managers.appMessagesManager.editMessage(message, value, {\n entities,\n noWebPage: noWebPage\n });\n\n this.onMessageSent();\n } else {\n new PopupDeleteMessages(peerId, [editMsgId], chat.type);\n\n return;\n }\n } else if(value.trim()) {\n this.managers.appMessagesManager.sendText(peerId, value, {\n entities,\n ...sendingParams,\n noWebPage: noWebPage,\n webPage: this.getWebPagePromise ? undefined : this.willSendWebPage,\n clearDraft: true\n });\n\n if(this.chat.type === 'scheduled') {\n this.onMessageSent(true);\n } else {\n this.onMessageSent(false, false);\n }\n // this.onMessageSent();\n }\n\n // * wait for sendText set messageId for invokeAfterMsg\n if(this.forwarding) {\n const forwarding = copy(this.forwarding);\n // setTimeout(() => {\n for(const fromPeerId in forwarding) {\n this.managers.appMessagesManager.forwardMessages(peerId, fromPeerId.toPeerId(), forwarding[fromPeerId], {\n ...sendingParams,\n dropAuthor: this.forwardElements && this.forwardElements.hideSender.checkboxField.checked,\n dropCaptions: this.isDroppingCaptions()\n }).catch(async(err: ApiError) => {\n if(err.type === 'VOICE_MESSAGES_FORBIDDEN') {\n toastNew({\n langPackKey: 'Chat.SendVoice.PrivacyError',\n langPackArguments: [await wrapPeerTitle({peerId})]\n });\n }\n });\n }\n\n if(!value) {\n this.onMessageSent();\n }\n // }, 0);\n }\n\n // this.onMessageSent();\n }\n\n public async sendMessageWithDocument(\n document: MyDocument | DocId,\n force = false,\n clearDraft = false,\n silent = false\n ) {\n document = await this.managers.appDocsManager.getDoc(document);\n\n const flag = document.type === 'sticker' ? 'send_stickers' : (document.type === 'gif' ? 'send_gifs' : 'send_media');\n if(this.chat.peerId.isAnyChat() && !(await this.chat.canSend(flag))) {\n toast(POSTING_MEDIA_NOT_ALLOWED);\n return false;\n }\n\n if(this.chat.type === 'scheduled' && !force) {\n this.scheduleSending(() => this.sendMessageWithDocument(document, true, clearDraft, silent));\n return false;\n }\n\n if(!document) {\n return false;\n }\n\n if(document.sticker && getStickerEffectThumb(document) && !rootScope.premium) {\n return false;\n }\n\n this.managers.appMessagesManager.sendFile(this.chat.peerId, {\n ...this.chat.getMessageSendingParams(),\n file: document,\n isMedia: true,\n clearDraft,\n silent\n });\n this.onMessageSent(clearDraft, true);\n\n if(document.type === 'sticker') {\n this.managers.appStickersManager.saveRecentSticker(document.id);\n }\n\n return true;\n }\n\n private canToggleHideAuthor() {\n const {forwardElements} = this;\n if(!forwardElements) return false;\n const hideCaptionCheckboxField = forwardElements.hideCaption.checkboxField;\n return !hideCaptionCheckboxField.checked ||\n findUpTag(hideCaptionCheckboxField.label, 'FORM').classList.contains('hide');\n }\n\n private isDroppingCaptions() {\n return !this.canToggleHideAuthor();\n }\n\n /* public sendSomething(callback: () => void, force = false) {\n if(this.chat.type === 'scheduled' && !force) {\n this.scheduleSending(() => this.sendSomething(callback, true));\n return false;\n }\n\n callback();\n this.onMessageSent(false, true);\n\n return true;\n } */\n\n public async initMessageEditing(mid: number) {\n const message = (await this.chat.getMessage(mid)) as Message.message;\n\n let input = wrapDraftText(message.message, {entities: message.totalEntities, wrappingForPeerId: this.chat.peerId});\n const f = async() => {\n const replyFragment = await wrapMessageForReply({message, usingMids: [message.mid]});\n this.setTopInfo('edit', f, i18n('AccDescrEditing'), replyFragment, input, message);\n\n this.editMsgId = mid;\n this.editMessage = message;\n input = undefined;\n };\n f();\n }\n\n public initMessagesForward(fromPeerIdsMids: {[fromPeerId: PeerId]: number[]}) {\n const f = async() => {\n // const peerTitles: string[]\n const fromPeerIds = Object.keys(fromPeerIdsMids).map((fromPeerId) => fromPeerId.toPeerId());\n const smth: Set = new Set();\n let length = 0, messagesWithCaptionsLength = 0;\n\n const p = fromPeerIds.map(async(fromPeerId) => {\n const mids = fromPeerIdsMids[fromPeerId];\n const promises = mids.map(async(mid) => {\n const message = (await this.managers.appMessagesManager.getMessageByPeer(fromPeerId, mid)) as Message.message;\n if(message.fwd_from?.from_name && !message.fromId && !message.fwdFromId) {\n smth.add('N' + message.fwd_from.from_name);\n } else {\n smth.add('P' + message.fromId);\n }\n\n if(message.media && message.message) {\n ++messagesWithCaptionsLength;\n }\n });\n\n await Promise.all(promises);\n\n length += mids.length;\n });\n\n await Promise.all(p);\n\n const onlyFirstName = smth.size > 2;\n const peerTitles = [...smth].map((smth) => {\n const type = smth[0];\n smth = smth.slice(1);\n if(type === 'P') {\n const peerId = smth.toPeerId();\n return peerId === rootScope.myId ? i18n('Chat.Accessory.Forward.You') : new PeerTitle({peerId, dialog: false, onlyFirstName}).element;\n } else {\n return onlyFirstName ? smth.split(' ')[0] : smth;\n }\n });\n\n const {forwardElements} = this;\n const form = findUpTag(forwardElements.showCaption.checkboxField.label, 'FORM');\n form.classList.toggle('hide', !messagesWithCaptionsLength);\n const hideCaption = forwardElements.hideCaption.checkboxField.checked;\n if(messagesWithCaptionsLength && hideCaption) {\n forwardElements.hideSender.checkboxField.setValueSilently(true);\n } else if(this.forwardWasDroppingAuthor !== undefined) {\n (this.forwardWasDroppingAuthor ? forwardElements.hideSender : forwardElements.showSender).checkboxField.setValueSilently(true);\n }\n\n const titleKey: LangPackKey = forwardElements.showSender.checkboxField.checked ? 'Chat.Accessory.Forward' : 'Chat.Accessory.Hidden';\n const title = i18n(titleKey, [length]);\n\n const senderTitles = document.createDocumentFragment();\n if(peerTitles.length < 3) {\n senderTitles.append(...join(peerTitles, false));\n } else {\n senderTitles.append(peerTitles[0], i18n('AndOther', [peerTitles.length - 1]));\n }\n\n let firstMessage: Message.message, usingFullAlbum: boolean;\n if(fromPeerIds.length === 1) {\n const fromPeerId = fromPeerIds[0];\n const mids = fromPeerIdsMids[fromPeerId];\n firstMessage = (await this.managers.appMessagesManager.getMessageByPeer(fromPeerId, mids[0])) as Message.message;\n\n usingFullAlbum = !!firstMessage.grouped_id;\n if(usingFullAlbum) {\n const albumMids = await this.managers.appMessagesManager.getMidsByMessage(firstMessage);\n if(albumMids.length !== length || albumMids.find((mid) => !mids.includes(mid))) {\n usingFullAlbum = false;\n }\n }\n }\n\n const subtitleFragment = document.createDocumentFragment();\n const delimiter = ': ';\n if(usingFullAlbum || length === 1) {\n const mids = fromPeerIdsMids[fromPeerIds[0]];\n const replyFragment = await wrapMessageForReply({message: firstMessage, usingMids: mids});\n subtitleFragment.append(\n senderTitles,\n delimiter,\n replyFragment\n );\n } else {\n subtitleFragment.append(\n i18n('Chat.Accessory.Forward.From'),\n delimiter,\n senderTitles\n );\n }\n\n const newReply = this.setTopInfo('forward', f, title, subtitleFragment);\n\n forwardElements.modifyArgs.forEach((b, idx) => {\n const text = b.textElement;\n const intl: I18n.IntlElement = I18n.weakMap.get(text) as any;\n intl.args = [idx < 2 ? fromPeerIds.length : messagesWithCaptionsLength];\n intl.update();\n });\n\n if(this.forwardHover) {\n this.forwardHover.attachButtonListener(newReply, this.listenerSetter);\n }\n\n this.forwarding = fromPeerIdsMids;\n };\n\n f();\n }\n\n public async initMessageReply(mid: number) {\n if(this.replyToMsgId === mid) {\n return;\n }\n\n let message = await this.chat.getMessage(mid);\n const f = () => {\n let peerTitleEl: HTMLElement;\n if(!message) { // load missing replying message\n peerTitleEl = i18n('Loading');\n\n this.managers.appMessagesManager.reloadMessages(this.chat.peerId, mid).then((_message) => {\n if(this.replyToMsgId !== mid) {\n return;\n }\n\n message = _message;\n if(!message) {\n this.clearHelper('reply');\n } else {\n f();\n }\n });\n } else {\n peerTitleEl = new PeerTitle({\n peerId: message.fromId,\n dialog: false\n }).element;\n }\n\n this.setTopInfo('reply', f, peerTitleEl, message && (message as Message.message).message, undefined, message);\n this.setReplyToMsgId(mid)\n };\n f();\n }\n\n public setReplyToMsgId(mid: number) {\n this.replyToMsgId = mid;\n this.center(true);\n }\n\n public clearHelper(type?: ChatInputHelperType) {\n if(this.helperType === 'edit' && type !== 'edit') {\n this.clearInput();\n }\n\n if(type) {\n this.lastUrl = '';\n delete this.noWebPage;\n this.willSendWebPage = null;\n }\n\n if(type !== 'reply') {\n this.setReplyToMsgId(undefined);\n this.forwarding = undefined;\n }\n\n this.editMsgId = this.editMessage = undefined;\n this.helperType = this.helperFunc = undefined;\n\n if(this.chat.container.classList.contains('is-helper-active')) {\n appNavigationController.removeByType('input-helper');\n this.chat.container.classList.remove('is-helper-active');\n this.t();\n }\n }\n\n private t() {\n const className = 'is-toggling-helper';\n SetTransition({\n element: this.chat.container,\n className,\n forwards: true,\n duration: 150,\n onTransitionEnd: () => {\n this.chat.container.classList.remove(className);\n }\n });\n }\n\n public setInputValue(value: Parameters[0], clear = true, focus = true) {\n if(!value) value = '';\n\n if(clear) this.clearInput(false, false, value as string);\n else this.messageInputField.setValueSilently(value);\n\n fastRaf(() => {\n focus && placeCaretAtEnd(this.messageInput);\n this.onMessageInput();\n this.messageInput.scrollTop = this.messageInput.scrollHeight;\n });\n }\n\n public setTopInfo(\n type: ChatInputHelperType,\n callerFunc: () => void,\n title: Parameters[0] = '',\n subtitle: Parameters[1] = '',\n input?: Parameters[0],\n message?: any\n ) {\n if(this.willSendWebPage && type === 'reply') {\n return;\n }\n\n if(type !== 'webpage') {\n this.clearHelper(type);\n this.helperType = type;\n this.helperFunc = callerFunc;\n }\n\n const replyParent = this.replyElements.container;\n const oldReply = replyParent.lastElementChild.previousElementSibling;\n const haveReply = oldReply.classList.contains('reply');\n\n this.replyElements.iconBtn.replaceWith(this.replyElements.iconBtn = ButtonIcon((type === 'webpage' ? 'link' : type) + ' active reply-icon', {noRipple: true}));\n const {container} = wrapReply(title, subtitle, this.chat.animationGroup, message);\n if(haveReply) {\n oldReply.replaceWith(container);\n } else {\n replyParent.insertBefore(container, replyParent.lastElementChild);\n }\n\n if(type === 'webpage') {\n container.style.cursor = 'default';\n }\n\n if(!this.chat.container.classList.contains('is-helper-active')) {\n this.chat.container.classList.add('is-helper-active');\n this.t();\n }\n\n /* const scroll = appImManager.scrollable;\n if(scroll.isScrolledDown && !scroll.scrollLocked && !appImManager.messagesQueuePromise && !appImManager.setPeerPromise) {\n scroll.scrollTo(scroll.scrollHeight, 'top', true, true, 200);\n } */\n\n if(!IS_MOBILE) {\n appNavigationController.pushItem({\n type: 'input-helper',\n onPop: () => {\n this.onHelperCancel();\n }\n });\n }\n\n if(input !== undefined) {\n this.setInputValue(input);\n }\n\n setTimeout(() => {\n this.updateSendBtn();\n }, 0);\n\n return container;\n }\n\n // public saveScroll() {\n // this.scrollTop = this.chat.bubbles.scrollable.container.scrollTop;\n // this.scrollOffsetTop = this.chatInput.offsetTop;\n // }\n\n // public restoreScroll() {\n // if(this.chatInput.style.display) return;\n // //console.log('input resize', offsetTop, this.chatInput.offsetTop);\n // let newOffsetTop = this.chatInput.offsetTop;\n // let container = this.chat.bubbles.scrollable.container;\n // let scrollTop = container.scrollTop;\n // let clientHeight = container.clientHeight;\n // let maxScrollTop = container.scrollHeight;\n\n // if(newOffsetTop < this.scrollOffsetTop) {\n // this.scrollDiff = this.scrollOffsetTop - newOffsetTop;\n // container.scrollTop += this.scrollDiff;\n // } else if(scrollTop !== this.scrollTop) {\n // let endDiff = maxScrollTop - (scrollTop + clientHeight);\n // if(endDiff < this.scrollDiff/* && false */) {\n // //container.scrollTop -= endDiff;\n // } else {\n // container.scrollTop -= this.scrollDiff;\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 {DraftMessage} from '../../layer';\nimport mergeEntities from '../../lib/richTextProcessor/mergeEntities';\nimport parseEntities from '../../lib/richTextProcessor/parseEntities';\nimport wrapDraftText from '../../lib/richTextProcessor/wrapDraftText';\n\nexport default function wrapDraft(draft: DraftMessage.draftMessage, wrappingForPeerId: PeerId, loadPromises?: Promise[]) {\n const myEntities = parseEntities(draft.message);\n const apiEntities = draft.entities || [];\n const totalEntities = mergeEntities(apiEntities.slice(), myEntities); // ! only in this order, otherwise bold and emoji formatting won't work\n\n return wrapDraftText(draft.message, {entities: totalEntities, wrappingForPeerId, loadPromises});\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';\nimport type ChatTopbar from './topbar';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport DivAndCaption from '../divAndCaption';\nimport ripple from '../ripple';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport {Message} from '../../layer';\nimport safeAssign from '../../helpers/object/safeAssign';\n\nconst classNames: string[] = ['is-pinned-message-shown', 'is-pinned-audio-shown'];\nconst CLASSNAME_BASE = 'pinned-container';\nconst HEIGHT = 52;\n\nexport default class PinnedContainer {\n public wrapperUtils: HTMLElement;\n public btnClose: HTMLElement;\n protected wrapper: HTMLElement;\n\n protected topbar: ChatTopbar;\n protected chat: Chat;\n protected listenerSetter: ListenerSetter;\n public className: string;\n public divAndCaption: DivAndCaption<(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message?: any) => void>;\n\n protected floating = false;\n\n public onClose?: () => void | Promise;\n\n constructor(options: {\n topbar: PinnedContainer['topbar'],\n chat: PinnedContainer['chat'],\n listenerSetter: PinnedContainer['listenerSetter'],\n className: PinnedContainer['className'],\n divAndCaption: PinnedContainer['divAndCaption'],\n onClose?: PinnedContainer['onClose'],\n floating?: PinnedContainer['floating']\n }) {\n safeAssign(this, options);\n\n const {divAndCaption, className} = this;\n divAndCaption.container.classList.add(CLASSNAME_BASE, 'hide');\n divAndCaption.title.classList.add(CLASSNAME_BASE + '-title');\n divAndCaption.subtitle.classList.add(CLASSNAME_BASE + '-subtitle');\n divAndCaption.content.classList.add(CLASSNAME_BASE + '-content');\n\n this.btnClose = document.createElement('button');\n this.btnClose.classList.add(CLASSNAME_BASE + '-close', `pinned-${className}-close`, 'btn-icon', 'tgico-close');\n\n this.wrapper = document.createElement('div');\n this.wrapper.classList.add(CLASSNAME_BASE + '-wrapper');\n ripple(this.wrapper);\n\n this.wrapperUtils = document.createElement('div');\n this.wrapperUtils.classList.add(CLASSNAME_BASE + '-wrapper-utils');\n this.wrapperUtils.append(this.btnClose);\n\n this.wrapper.append(...Array.from(divAndCaption.container.children), this.wrapperUtils);\n\n divAndCaption.container.append(this.wrapper/* , this.close */);\n\n this.attachOnCloseEvent(this.btnClose);\n }\n\n public attachOnCloseEvent(elem: HTMLElement) {\n attachClickEvent(elem, (e) => {\n cancelEvent(e);\n\n ((this.onClose ? this.onClose() : null) || Promise.resolve(true)).then((needClose) => {\n if(needClose) {\n this.toggle(true);\n }\n });\n }, {listenerSetter: this.listenerSetter});\n }\n\n public toggle(hide?: boolean) {\n const isHidden = this.divAndCaption.container.classList.contains('hide');\n if(hide === undefined) {\n hide = !isHidden;\n } else if(hide === isHidden) {\n return;\n }\n\n // const scrollable = this.chat.bubbles.scrollable;\n\n const isFloating = (this.floating || mediaSizes.isMobile) && !hide;\n // const scrollTop = isFloating || this.divAndCaption.container.classList.contains('is-floating') ? scrollable.scrollTop : undefined;\n\n this.divAndCaption.container.classList.toggle('is-floating', isFloating);\n this.divAndCaption.container.classList.toggle('hide', hide);\n\n this.topbar.container.classList.toggle('is-pinned-floating', isFloating);\n this.topbar.container.classList.toggle(`is-pinned-${this.className}-shown`, !hide);\n\n // const active = classNames.filter((className) => this.topbar.container.classList.contains(className));\n // const maxActive = hide ? 0 : 1;\n\n // * not sure when it became unneeded\n // if(scrollTop !== undefined && active.length <= maxActive/* && !scrollable.isScrolledDown */) {\n // scrollable.scrollTop = scrollTop + ((hide ? -1 : 1) * HEIGHT);\n // }\n\n this.topbar.setFloating();\n this.topbar.setUtilsWidth();\n }\n\n public isVisible() {\n return !this.divAndCaption.container.classList.contains('hide');\n }\n\n public isFloating() {\n return this.divAndCaption.container.classList.contains('is-floating');\n }\n\n public fill(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message: Message.message) {\n this.divAndCaption.container.dataset.peerId = '' + message.peerId;\n this.divAndCaption.container.dataset.mid = '' + message.mid;\n this.divAndCaption.fill(title, subtitle, message);\n this.topbar.setUtilsWidth();\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}\n","/*\n * 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, {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 ButtonIcon from '../buttonIcon';\nimport {DocumentAttribute} from '../../layer';\nimport MediaProgressLine from '../mediaProgressLine';\nimport VolumeSelector from '../volumeSelector';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nexport default class ChatAudio extends PinnedContainer {\n private toggleEl: HTMLElement;\n private progressLine: MediaProgressLine;\n private volumeSelector: VolumeSelector;\n private fasterEl: HTMLElement;\n private repeatEl: HTMLButtonElement;\n\n constructor(protected topbar: ChatTopbar, protected chat: Chat, protected managers: AppManagers) {\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('fast_rewind active', {noRipple: true});\n const nextEl = ButtonIcon('fast_forward active', {noRipple: true});\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\n this.repeatEl = ButtonIcon('audio_repeat', {noRipple: true});\n attachClick(this.repeatEl, () => {\n const params = appMediaPlaybackController.getPlaybackParams();\n if(!params.round) {\n appMediaPlaybackController.round = true;\n } else if(params.loop) {\n appMediaPlaybackController.round = false;\n appMediaPlaybackController.loop = false;\n } else {\n appMediaPlaybackController.loop = !appMediaPlaybackController.loop;\n }\n });\n\n const fasterEl = this.fasterEl = ButtonIcon('playback_2x', {noRipple: true});\n attachClick(fasterEl, () => {\n appMediaPlaybackController.playbackRate = fasterEl.classList.contains('active') ? 1 : 1.75;\n });\n\n this.wrapperUtils.prepend(this.volumeSelector.btn, fasterEl, this.repeatEl);\n\n const progressWrapper = document.createElement('div');\n progressWrapper.classList.add('pinned-audio-progress-wrapper');\n\n this.progressLine = new MediaProgressLine({\n media: undefined,\n streamable: undefined,\n withTransition: true,\n useTransform: true\n });\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(appMediaPlaybackController)('play', this.onMediaPlay);\n this.topbar.listenerSetter.add(appMediaPlaybackController)('pause', this.onPause);\n this.topbar.listenerSetter.add(appMediaPlaybackController)('stop', this.onStop);\n this.topbar.listenerSetter.add(appMediaPlaybackController)('playbackParams', this.onPlaybackParams);\n\n const playingDetails = appMediaPlaybackController.getPlayingDetails();\n if(playingDetails) {\n this.onMediaPlay(playingDetails);\n this.onPlaybackParams(playingDetails.playbackParams);\n }\n }\n\n public destroy() {\n if(this.progressLine) {\n this.progressLine.removeListeners();\n }\n }\n\n private onPlaybackParams = (playbackParams: ReturnType) => {\n this.fasterEl.classList.toggle('active', playbackParams.playbackRate > 1);\n\n this.repeatEl.classList.remove('tgico-audio_repeat', 'tgico-audio_repeat_single');\n this.repeatEl.classList.add(playbackParams.loop ? 'tgico-audio_repeat_single' : 'tgico-audio_repeat');\n this.repeatEl.classList.toggle('active', playbackParams.loop || playbackParams.round);\n };\n\n private onPause = () => {\n this.toggleEl.classList.remove('flip-icon');\n };\n\n private onStop = () => {\n this.toggle(true);\n };\n\n private onMediaPlay = ({doc, message, media, playbackParams}: ReturnType) => {\n let title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment;\n const isMusic = doc.type !== 'voice' && doc.type !== 'round';\n if(!isMusic) {\n title = new PeerTitle({peerId: message.fromId, fromName: message.fwd_from?.from_name}).element;\n\n // subtitle = 'Voice message';\n subtitle = formatFullSentTime(message.date);\n } else {\n const audioAttribute = doc.attributes.find((attr) => attr._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio;\n title = wrapEmojiText(audioAttribute?.title ?? doc.file_name);\n subtitle = audioAttribute?.performer ? wrapEmojiText(audioAttribute.performer) : i18n('AudioUnknownArtist');\n }\n\n this.fasterEl.classList.toggle('hide', isMusic);\n this.repeatEl.classList.toggle('hide', !isMusic);\n\n this.onPlaybackParams(playbackParams);\n this.volumeSelector.setVolume();\n\n this.progressLine.setMedia(media);\n\n this.fill(title, subtitle, message);\n // this.toggleEl.classList.add('flip-icon');\n this.toggleEl.classList.toggle('flip-icon', !media.paused);\n this.toggle(false);\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 ChatTopbar from './topbar';\nimport PopupPinMessage from '../popups/unpinMessage';\nimport PinnedContainer from './pinnedContainer';\nimport PinnedMessageBorder from './pinnedMessageBorder';\nimport ReplyContainer, {wrapReplyDivAndCaption} from './replyContainer';\nimport rootScope from '../../lib/rootScope';\nimport Chat from './chat';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport ButtonIcon from '../buttonIcon';\nimport {getHeavyAnimationPromise} from '../../hooks/useHeavyAnimationCheck';\nimport {i18n} from '../../lib/langPack';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport handleScrollSideEvent from '../../helpers/dom/handleScrollSideEvent';\nimport debounce from '../../helpers/schedulers/debounce';\nimport throttle from '../../helpers/schedulers/throttle';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {Message} from '../../layer';\nimport {logger} from '../../lib/logger';\n\nclass AnimatedSuper {\n static DURATION = 200;\n static BASE_CLASS = 'animated-super';\n container: HTMLDivElement;\n rows: {[index: string]: {element: HTMLElement, timeout?: number, new?: true}} = {};\n clearTimeout: number;\n\n constructor() {\n this.container = document.createElement('div');\n this.container.className = AnimatedSuper.BASE_CLASS;\n }\n\n public getRow(index: number, animateFirst = false) {\n if(this.rows[index]) return this.rows[index].element;\n const row = document.createElement('div');\n const isFirst = !Object.keys(this.rows).length && !animateFirst;\n row.className = AnimatedSuper.BASE_CLASS + '-row' + (isFirst ? '' : ' is-hiding hide');\n this.rows[index] = {element: row, new: true};\n this.container.append(row);\n return row;\n }\n\n public clearRow(index: number) {\n if(!this.rows[index]) return;\n this.rows[index].element.remove();\n delete this.rows[index];\n }\n\n public clearRows(currentIndex?: number) {\n if(this.clearTimeout) clearTimeout(this.clearTimeout);\n this.clearTimeout = window.setTimeout(() => {\n for(const i in this.rows) {\n if(+i === currentIndex) continue;\n this.clearRow(+i);\n }\n }, AnimatedSuper.DURATION);\n }\n\n public setNewRow(index: number, reflow = false) {\n const row = this.rows[index];\n if(row.new) {\n if(reflow) {\n row.element.classList.remove('hide');\n void row.element.offsetLeft; // reflow\n } else {\n row.element.classList.remove('is-hiding', 'hide');\n }\n\n delete row.new;\n }\n\n this.clearRows(index);\n }\n\n public animate(index: number, previousIndex: number, fromTop = index > previousIndex, ignorePrevious = false) {\n if(index === previousIndex) { // * handle if set index 0 and previousIndex 0\n return this.setNewRow(index);\n }\n\n const row = this.rows[index];\n const previousRow = this.rows[previousIndex];\n if(!previousRow && !ignorePrevious) {\n return this.setNewRow(index);\n }\n\n const sides = ['from-top', 'from-bottom'];\n if(!fromTop) sides.reverse();\n\n row.element.classList.add(sides[0]);\n row.element.classList.remove(sides[1]);\n if(previousRow) {\n previousRow.element.classList.add(sides[1]);\n previousRow.element.classList.remove(sides[0]);\n }\n\n if(row.new) {\n this.setNewRow(index, true);\n }\n\n row.element.classList.toggle('is-hiding', false);\n previousRow && previousRow.element.classList.toggle('is-hiding', true);\n\n /* const height = row.element.getBoundingClientRect().height;\n row.element.style.transform = `translateY(${fromTop ? height * -1 : height}px)`;\n if(previousRow) {\n previousRow.element.style.transform = `translateY(${fromTop ? height : height * -1}px)`;\n } */\n\n /* row.element.style.setProperty('--height', row.element.getBoundingClientRect().height + 'px');\n if(previousRow) {\n previousRow.element.style.setProperty('--height', previousRow.element.getBoundingClientRect().height + 'px');\n } */\n\n this.clearRows(index);\n }\n}\n\nclass AnimatedCounter {\n static EMPTY_INDEX = -1;\n static BASE_CLASS = 'animated-counter';\n container: HTMLElement;\n decimals: {\n container: HTMLElement,\n placeholder: HTMLElement,\n animatedSuper: AnimatedSuper\n }[] = [];\n previousNumber = 0;\n clearTimeout: number;\n\n constructor(private reverse = false) {\n this.container = document.createElement('div');\n this.container.className = AnimatedCounter.BASE_CLASS;\n }\n\n getDecimal(index: number) {\n if(this.decimals[index]) return this.decimals[index];\n const item = document.createElement('div');\n item.className = AnimatedCounter.BASE_CLASS + '-decimal';\n\n const placeholder = document.createElement('div');\n placeholder.className = AnimatedCounter.BASE_CLASS + '-decimal-placeholder';\n\n const animatedSuper = new AnimatedSuper();\n animatedSuper.container.className = AnimatedCounter.BASE_CLASS + '-decimal-wrapper';\n\n item.append(placeholder, animatedSuper.container);\n\n this.container.append(item);\n\n return this.decimals[index] = {container: item, placeholder, animatedSuper};\n }\n\n clear(number: number) {\n if(this.clearTimeout) clearTimeout(this.clearTimeout);\n\n const decimals = ('' + number).length;\n if(decimals >= this.decimals.length) {\n return;\n }\n\n this.clearTimeout = window.setTimeout(() => {\n const byDecimal = this.decimals.splice(decimals, this.decimals.length - decimals);\n byDecimal.forEach((decimal) => {\n decimal.container.remove();\n });\n }, AnimatedSuper.DURATION);\n }\n\n /* prepareNumber(number: number) {\n const decimals = ('' + number).length;\n if(this.decimals.length < decimals) {\n for(let i = this.decimals.length; i < decimals; ++i) {\n this.getDecimal(i);\n }\n }\n } */\n\n hideLeft(number: number) {\n const decimals = ('' + number).length;\n const byDecimal = this.decimals.slice(decimals);// this.decimals.splice(deleteCount, this.decimals.length - deleteCount);\n byDecimal.forEach((decimal) => {\n const previousDecimalNumber = +decimal.placeholder.innerText || 0;\n const row = decimal.animatedSuper.getRow(AnimatedCounter.EMPTY_INDEX, true);\n decimal.animatedSuper.animate(AnimatedCounter.EMPTY_INDEX, previousDecimalNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\n });\n\n this.clear(number);\n }\n\n setCount(number: number) {\n // this.prepareNumber(number);\n\n const previousByDecimal = Array.from('' + this.previousNumber).map((n) => +n);\n const byDecimal = Array.from('' + number).map((n) => +n);\n byDecimal.forEach((decimalNumber, idx) => {\n const decimal = this.getDecimal(idx);\n // const row = decimal.animatedSuper.getRow(number, true);\n const row = decimal.animatedSuper.getRow(decimalNumber, true);\n const previousDecimalNumber = previousByDecimal[idx] ?? AnimatedCounter.EMPTY_INDEX;\n row.innerText = decimal.placeholder.innerText = '' + decimalNumber;\n // decimal.animatedSuper.animate(number, this.previousNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\n decimal.animatedSuper.animate(decimalNumber, previousDecimalNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\n });\n\n this.hideLeft(number);\n // this.clear(number);\n this.previousNumber = number;\n }\n}\n\nexport default class ChatPinnedMessage {\n private static LOAD_COUNT = 50;\n private static LOAD_OFFSET = 5;\n\n public pinnedMessageContainer: PinnedContainer;\n private pinnedMessageBorder: PinnedMessageBorder;\n\n private pinnedMaxMid = 0;\n public pinnedMid = 0;\n public pinnedIndex = -1;\n private wasPinnedIndex = 0;\n private wasPinnedMediaIndex = 0;\n\n public locked = false;\n private waitForScrollBottom = false;\n\n public count = 0;\n private mids: number[] = [];\n private offsetIndex = 0;\n\n private loading = false;\n private loadedBottom = false;\n private loadedTop = false;\n\n private animatedSubtitle: AnimatedSuper;\n private animatedMedia: AnimatedSuper;\n private animatedCounter: AnimatedCounter;\n\n private listenerSetter: ListenerSetter;\n private scrollDownListenerSetter: ListenerSetter = null;\n\n public hidden = false;\n\n private getCurrentIndexPromise: Promise = null;\n private btnOpen: HTMLButtonElement;\n\n private setPinnedMessage: () => void;\n\n private isStatic: boolean;\n\n private debug: boolean;\n\n public setCorrectIndexThrottled: (lastScrollDirection?: number) => void;\n\n private log: ReturnType;\n\n constructor(private topbar: ChatTopbar, private chat: Chat, private managers: AppManagers) {\n this.listenerSetter = new ListenerSetter();\n this.log = logger('PM');\n this.debug = true;\n this.isStatic = false;\n\n const dAC = new ReplyContainer('pinned-message', chat.animationGroup);\n this.pinnedMessageContainer = new PinnedContainer({\n topbar,\n chat,\n listenerSetter: this.listenerSetter,\n className: 'message',\n divAndCaption: dAC,\n onClose: async() => {\n if(await managers.appPeersManager.canPinMessage(this.chat.peerId)) {\n new PopupPinMessage(this.chat.peerId, this.pinnedMid, true);\n } else {\n new PopupPinMessage(this.chat.peerId, 0, true);\n }\n\n return false;\n }\n });\n\n this.pinnedMessageBorder = new PinnedMessageBorder();\n dAC.border.replaceWith(this.pinnedMessageBorder.render(1, 0));\n\n this.animatedSubtitle = new AnimatedSuper();\n dAC.subtitle.append(this.animatedSubtitle.container);\n\n this.animatedMedia = new AnimatedSuper();\n this.animatedMedia.container.classList.add('pinned-message-media-container');\n dAC.content.prepend(this.animatedMedia.container);\n\n this.animatedCounter = new AnimatedCounter(true);\n dAC.title.append(i18n('PinnedMessage'), ' ', this.animatedCounter.container);\n\n const btnClose = this.pinnedMessageContainer.btnClose.cloneNode(true) as HTMLElement;\n this.pinnedMessageContainer.attachOnCloseEvent(btnClose);\n dAC.container.prepend(btnClose);\n\n this.btnOpen = ButtonIcon('pinlist pinned-container-close pinned-message-pinlist', {noRipple: true});\n\n this.pinnedMessageContainer.wrapperUtils.prepend(this.btnOpen);\n\n attachClickEvent(this.btnOpen, (e) => {\n cancelEvent(e);\n this.topbar.openPinned(true);\n }, {listenerSetter: this.listenerSetter});\n\n this.listenerSetter.add(rootScope)('peer_pinned_messages', ({peerId}) => {\n if(peerId === this.chat.peerId) {\n // this.wasPinnedIndex = 0;\n // setTimeout(() => {\n if(this.hidden) {\n this.pinnedMessageContainer.toggle(this.hidden = false);\n }\n\n this.loadedTop = this.loadedBottom = false;\n this.pinnedIndex = -1;\n this.pinnedMid = 0;\n this.count = 0;\n this.mids = [];\n this.offsetIndex = 0;\n this.pinnedMaxMid = 0;\n this.setCorrectIndex(0);\n // }, 300);\n }\n });\n\n this.listenerSetter.add(rootScope)('peer_pinned_hidden', ({peerId}) => {\n if(peerId === this.chat.peerId) {\n this.pinnedMessageContainer.toggle(this.hidden = true);\n }\n });\n\n // * 200 - no lags\n // * 100 - need test\n this.setPinnedMessage = debounce(() => this._setPinnedMessage(), 100, true, true);\n this.setCorrectIndexThrottled = throttle(this.setCorrectIndex.bind(this), 100, false);\n\n this.isStatic = !this.chat.isPinnedMessagesNeeded();\n }\n\n public destroy() {\n this.pinnedMessageContainer.divAndCaption.container.remove();\n this.pinnedMessageContainer.toggle(true);\n this.listenerSetter.removeAll();\n this.unsetScrollDownListener(false);\n }\n\n public setCorrectIndex(lastScrollDirection?: number) {\n if(this.isStatic) return;\n // return;\n\n if(this.locked || this.hidden/* || this.chat.setPeerPromise || this.chat.bubbles.messagesQueuePromise */) {\n return;\n }\n\n if((this.loadedBottom || this.loadedTop) && !this.count) {\n return;\n }\n\n // const perf = performance.now();\n const el = this.chat.bubbles.getBubbleByPoint('bottom');\n // this.log('setCorrectIndex: get last element perf:', performance.now() - perf, el);\n if(!el) return;\n\n // return;\n\n const mid = el.dataset.mid;\n if(el && mid !== undefined) {\n // this.log('setCorrectIndex will test mid:', mid);\n this.testMid(+mid, lastScrollDirection);\n }\n }\n\n public testMid(mid: number, lastScrollDirection?: number) {\n if(this.isStatic) return;\n\n // if(lastScrollDirection !== undefined) return;\n if(this.hidden) return;\n\n // this.log('testMid', mid);\n\n let currentIndex: number = this.mids.findIndex((_mid) => _mid <= mid);\n if(currentIndex !== -1 && !this.isNeededMore(currentIndex)) {\n currentIndex += this.offsetIndex;\n } else if(this.loadedTop && mid < this.mids[this.mids.length - 1]) {\n // currentIndex = 0;\n currentIndex = this.mids.length - 1 + this.offsetIndex;\n } else {\n if(!this.getCurrentIndexPromise) {\n this.getCurrentIndexPromise = this.getCurrentIndex(mid, lastScrollDirection !== undefined);\n }\n\n return;\n }\n\n // const idx = Math.max(0, this.mids.indexOf(mid));\n\n /* if(currentIndex === this.count) {\n currentIndex = 0;\n } */\n\n // this.log('testMid: pinned currentIndex', currentIndex, mid);\n\n const changed = this.pinnedIndex !== currentIndex;\n if(changed) {\n if(this.waitForScrollBottom && lastScrollDirection !== undefined) {\n if(this.pinnedIndex === 0 || this.pinnedIndex > currentIndex) { // ะตัะปะธ ะฝะต ัะบั€ะพะปะปะธะป ะฒะฝะธะท ะธ ะฟั‹ั‚ะฐะตั‚ัั ะฟะพัั‚ะฐะฒะธั‚ัŒ ะฝะธะถะฝะธะน ะฟะธะฝะฝะตะด - ะฒั‹ะนั‚ะธ\n return;\n }\n }\n\n this.pinnedIndex = currentIndex;\n this.pinnedMid = this.mids.find((_mid) => _mid <= mid) || this.mids[this.mids.length - 1];\n this.setPinnedMessage();\n }\n }\n\n private isNeededMore(currentIndex: number) {\n return (this.count > ChatPinnedMessage.LOAD_COUNT &&\n (\n (!this.loadedBottom && currentIndex <= ChatPinnedMessage.LOAD_OFFSET) ||\n (!this.loadedTop && (this.count - 1 - currentIndex) <= ChatPinnedMessage.LOAD_OFFSET)\n )\n );\n }\n\n private async getCurrentIndex(mid: number, correctAfter = true) {\n if(this.loading) return;\n this.loading = true;\n\n try {\n const log = this.debug ? this.log.bindPrefix('getCurrentIndex') : undefined;\n log && log('start', mid, correctAfter);\n\n let gotRest = false;\n const promises = [\n this.managers.appMessagesManager.getSearch({\n peerId: this.chat.peerId,\n inputFilter: {_: 'inputMessagesFilterPinned'},\n maxId: mid,\n limit: ChatPinnedMessage.LOAD_COUNT,\n backLimit: ChatPinnedMessage.LOAD_COUNT,\n threadId: this.chat.threadId\n })\n .then((r) => {\n gotRest = true;\n return r;\n })\n ];\n\n if(!this.pinnedMaxMid) {\n const promise = this.managers.appMessagesManager.getPinnedMessage(this.chat.peerId, this.chat.threadId).then((p) => {\n if(!p.maxId) return;\n this.pinnedMaxMid = p.maxId;\n\n if(!gotRest && correctAfter) {\n this.mids = [this.pinnedMaxMid];\n this.count = p.count;\n this.pinnedIndex = 0;\n this.pinnedMid = this.mids[0];\n this.setPinnedMessage();\n // this.pinnedMessageContainer.toggle(false);\n }\n });\n\n promises.push(promise as any);\n }\n\n const result = (await Promise.all(promises))[0];\n\n let backLimited = result.history.findIndex((message) => message.mid <= mid);\n if(backLimited === -1) {\n backLimited = result.history.length;\n }/* else {\n backLimited -= 1;\n } */\n\n this.offsetIndex = result.offset_id_offset ? result.offset_id_offset - backLimited : 0;\n this.mids = result.history.map((message) => message.mid).slice();\n this.count = result.count;\n\n if(!this.count) {\n this.pinnedMessageContainer.toggle(true);\n }\n\n this.loadedTop = (this.offsetIndex + this.mids.length) === this.count;\n this.loadedBottom = !this.offsetIndex;\n\n log && log('result', mid, result, backLimited, this.offsetIndex, this.loadedTop, this.loadedBottom);\n } catch(err) {\n this.log.error('getCurrentIndex error', err);\n }\n\n this.loading = false;\n\n if(this.locked) {\n this.testMid(mid);\n } else if(correctAfter) {\n this.setCorrectIndex(0);\n }\n\n this.getCurrentIndexPromise = null;\n // return result.offset_id_offset || 0;\n }\n\n public setScrollDownListener() {\n this.waitForScrollBottom = true;\n\n if(!this.scrollDownListenerSetter) {\n this.scrollDownListenerSetter = new ListenerSetter();\n handleScrollSideEvent(this.chat.bubbles.scrollable.container, 'bottom', () => {\n this.unsetScrollDownListener();\n }, this.scrollDownListenerSetter);\n }\n }\n\n public unsetScrollDownListener(refreshPosition = true) {\n this.waitForScrollBottom = false;\n\n if(this.scrollDownListenerSetter) {\n this.scrollDownListenerSetter.removeAll();\n this.scrollDownListenerSetter = null;\n }\n\n if(refreshPosition) {\n this.setCorrectIndex(0);\n }\n }\n\n public async handleFollowingPinnedMessage() {\n this.locked = true;\n\n this.debug && this.log('handleFollowingPinnedMessage');\n try {\n this.setScrollDownListener();\n\n const setPeerPromise = this.chat.setPeerPromise;\n if(setPeerPromise instanceof Promise) {\n await setPeerPromise;\n }\n\n // await this.chat.bubbles.scrollable.scrollLockedPromise;\n await getHeavyAnimationPromise();\n\n if(this.getCurrentIndexPromise) {\n await this.getCurrentIndexPromise;\n }\n\n this.debug && this.log('handleFollowingPinnedMessage: unlock');\n this.locked = false;\n\n /* // ะฟะพะดะพะถะดั‘ะผ, ะฟะพะบะฐ ัะบั€ะพะปะป ะพัั‚ะฐะฝะพะฒะธั‚ัั\n setTimeout(() => {\n this.log('handleFollowingPinnedMessage: unlock');\n this.locked = false;\n }, 50); */\n } catch(err) {\n this.log.error('handleFollowingPinnedMessage error:', err);\n\n this.locked = false;\n this.waitForScrollBottom = false;\n this.setCorrectIndex(0);\n }\n }\n\n public async followPinnedMessage(mid: number) {\n const message = await this.chat.getMessage(mid);\n if(!message) {\n return;\n }\n\n this.chat.setMessageId(mid);\n (this.chat.setPeerPromise || Promise.resolve()).then(() => { // * debounce fast clicker\n this.handleFollowingPinnedMessage();\n this.testMid(this.pinnedIndex >= (this.count - 1) ? this.pinnedMaxMid : mid - 1);\n });\n }\n\n public async _setPinnedMessage() {\n // ///this.log('setting pinned message', message);\n // return;\n /* const promise: Promise = this.chat.setPeerPromise || this.chat.bubbles.messagesQueuePromise || Promise.resolve();\n Promise.all([\n promise\n ]).then(() => { */\n // const mids = results[0];\n const count = this.count;\n if(count) {\n const pinnedIndex = this.pinnedIndex;\n const message = await this.chat.getMessage(this.pinnedMid);\n\n // this.animatedCounter.prepareNumber(count);\n\n // setTimeout(() => {\n const isLast = pinnedIndex === 0;\n this.animatedCounter.container.classList.toggle('is-last', isLast);\n // SetTransition(this.animatedCounter.container, 'is-last', isLast, AnimatedSuper.DURATION);\n if(!isLast) {\n this.animatedCounter.setCount(count - pinnedIndex);\n }\n // }, 100);\n\n // this.pinnedMessageContainer.fill(undefined, message.message, message);\n this.pinnedMessageContainer.toggle(false);\n\n const fromTop = pinnedIndex > this.wasPinnedIndex;\n\n this.debug && this.log('setPinnedMessage: fromTop', fromTop, pinnedIndex, this.wasPinnedIndex);\n\n const writeTo = this.animatedSubtitle.getRow(pinnedIndex);\n const writeMediaTo = this.animatedMedia.getRow(pinnedIndex);\n writeMediaTo.classList.add('pinned-message-media');\n // writeMediaTo.innerHTML = writeMediaTo.style.cssText = writeMediaTo.dataset.docId = '';\n const loadPromises: Promise[] = [];\n const isMediaSet = await wrapReplyDivAndCaption({\n title: undefined,\n titleEl: null,\n subtitle: (message as Message.message).message,\n subtitleEl: writeTo,\n message,\n mediaEl: writeMediaTo,\n loadPromises,\n animationGroup: this.chat.animationGroup\n });\n\n await Promise.all(loadPromises);\n\n this.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-media', isMediaSet);\n\n // if(this.wasPinnedIndex !== this.pinnedIndex) {\n this.animatedSubtitle.animate(pinnedIndex, this.wasPinnedIndex);\n if(isMediaSet) {\n this.animatedMedia.animate(pinnedIndex, this.wasPinnedMediaIndex); // * wasPinnedMediaIndex ะธะท-ะทะฐ ั‚ะพะณะพ, ั‡ั‚ะพ ะฑะปะพะบ ะผะตะฝัะตั‚ัั ั ะดั€ัƒะณะธะผ ะฐะปะณะพั€ะธั‚ะผะพะผ\n this.wasPinnedMediaIndex = pinnedIndex;\n } else {\n this.animatedMedia.clearRows();\n }\n // }\n\n this.pinnedMessageBorder.render(count, count - pinnedIndex - 1);\n this.wasPinnedIndex = pinnedIndex;\n this.pinnedMessageContainer.divAndCaption.container.dataset.mid = '' + message.mid;\n } else {\n this.pinnedMessageContainer.toggle(true);\n this.wasPinnedIndex = 0;\n }\n\n this.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-many', this.count > 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 type ListenerSetter from '../listenerSetter';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\n\nexport default function handleScrollSideEvent(elem: HTMLElement, side: 'top' | 'bottom', callback: () => void, listenerSetter: ListenerSetter) {\n if(IS_TOUCH_SUPPORTED) {\n let lastY: number;\n const options = {passive: true};\n listenerSetter.add(elem)('touchstart', (e) => {\n if(e.touches.length > 1) {\n onTouchEnd();\n return;\n }\n\n lastY = e.touches[0].clientY;\n\n listenerSetter.add(elem)('touchmove', onTouchMove, options);\n listenerSetter.add(elem)('touchend', onTouchEnd, options);\n }, options);\n\n const onTouchMove = (e: TouchEvent) => {\n const clientY = e.touches[0].clientY;\n\n const isDown = clientY < lastY;\n if(side === 'bottom' && isDown) callback();\n else if(side === 'top' && !isDown) callback();\n lastY = clientY;\n // alert('isDown: ' + !!isDown);\n };\n\n const onTouchEnd = () => {\n listenerSetter.removeManual(elem, 'touchmove', onTouchMove, options);\n listenerSetter.removeManual(elem, 'touchend', onTouchEnd, options);\n };\n } else {\n listenerSetter.add(elem)('wheel', (e) => {\n const isDown = e.deltaY > 0;\n // this.log('wheel', e, isDown);\n if(side === 'bottom' && isDown) callback();\n else if(side === 'top' && !isDown) callback();\n }, {passive: 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 type {Channel} from '../../lib/appManagers/appChatsManager';\nimport type {AppSidebarRight} from '../sidebarRight';\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 ListenerSetter from '../../helpers/listenerSetter';\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 AppEditContactTab from '../sidebarRight/tabs/editContact';\nimport appMediaPlaybackController from '../appMediaPlaybackController';\nimport IS_GROUP_CALL_SUPPORTED from '../../environment/groupCallSupport';\nimport IS_CALL_SUPPORTED from '../../environment/callSupport';\nimport {CallType} from '../../lib/calls/types';\nimport PopupMute from '../popups/mute';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport hasRights from '../../lib/appManagers/utils/chats/hasRights';\nimport wrapPeerTitle from '../wrappers/peerTitle';\nimport groupCallsController from '../../lib/calls/groupCallsController';\nimport apiManagerProxy from '../../lib/mtproto/mtprotoworker';\nimport {makeMediaSize} from '../../helpers/mediaSize';\nimport {FOLDER_ID_ALL} from '../../lib/mtproto/mtproto_config';\nimport formatNumber from '../../helpers/number/formatNumber';\n\ntype ButtonToVerify = {element?: HTMLElement, verify: () => boolean | Promise};\n\nexport default class ChatTopbar {\n public container: HTMLDivElement;\n private btnBack: HTMLButtonElement;\n private btnBackBadge: HTMLElement;\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: HTMLElement;\n\n private chatAudio: ChatAudio;\n public pinnedMessage: ChatPinnedMessage;\n\n private setUtilsRAF: number;\n private setPeerStatusInterval: number;\n\n public listenerSetter: ListenerSetter;\n\n private menuButtons: Parameters[0]['buttons'];\n private buttonsToVerify: ButtonToVerify[];\n private chatInfoContainer: HTMLDivElement;\n private person: HTMLDivElement;\n\n constructor(\n private chat: Chat,\n private appSidebarRight: AppSidebarRight,\n private managers: AppManagers\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', 'hide');\n this.container.dataset.floating = '0';\n\n this.btnBack = ButtonIcon('left sidebar-close-button', {noRipple: true});\n this.btnBackBadge = document.createElement('span');\n this.btnBackBadge.classList.add('badge', 'badge-20', 'badge-primary', 'back-unread-badge');\n this.btnBack.append(this.btnBackBadge);\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 = this.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.managers);\n\n if(this.menuButtons.length) {\n this.btnMore = ButtonMenuToggle({\n listenerSetter: this.listenerSetter,\n direction: 'bottom-left',\n buttons: this.menuButtons,\n onOpen: async(e, element) => {\n const deleteButton = this.menuButtons[this.menuButtons.length - 1];\n if(deleteButton?.element) {\n const deleteButtonText = await this.managers.appPeersManager.getDeleteButtonText(this.peerId);\n deleteButton.element.lastChild.replaceWith(i18n(deleteButtonText));\n }\n }\n });\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') || findUpClassName(e.target, 'pinned-container-wrapper-utils')) {\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: ButtonToVerify['verify']) {\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 r = async() => {\n const buttons = this.buttonsToVerify.concat(isMenuOpen ? this.menuButtons as any : []);\n const results = await Promise.all(buttons.map(async(button) => {\n return {\n result: await button.verify(),\n button\n }\n }));\n\n results.forEach(({button, result}) => {\n button.element.classList.toggle('hide', !result);\n });\n };\n\n r();\n };\n\n private verifyVideoChatButton = async(type?: 'group' | 'broadcast') => {\n if(!IS_GROUP_CALL_SUPPORTED || this.peerId.isUser() || this.chat.type !== 'chat' || this.chat.threadId) return false;\n\n const currentGroupCall = groupCallsController.groupCall;\n const chatId = this.peerId.toChatId();\n if(currentGroupCall?.chatId === chatId) {\n return false;\n }\n\n if(type) {\n if(((await this.managers.appPeersManager.isBroadcast(this.peerId)) && type === 'group') ||\n ((await this.managers.appPeersManager.isAnyGroup(this.peerId)) && type === 'broadcast')) {\n return false;\n }\n }\n\n const chat = await this.managers.appChatsManager.getChat(chatId);\n return (chat as MTChat.chat).pFlags?.call_active || hasRights(chat, 'manage_call');\n };\n\n private verifyCallButton = async(type?: CallType) => {\n if(!IS_CALL_SUPPORTED || !this.peerId.isUser()) return false;\n const userId = this.peerId.toUserId();\n const userFull = await this.managers.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: this.onMuteClick,\n verify: async() => this.chat.type === 'chat' && rootScope.myId !== this.peerId && !(await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.peerId, respectType: false, threadId: this.chat.threadId}))\n }, {\n icon: 'unmute',\n text: 'ChatList.Context.Unmute',\n onClick: () => {\n this.managers.appMessagesManager.togglePeerMute({peerId: this.peerId, threadId: this.chat.threadId});\n },\n verify: async() => this.chat.type === 'chat' && rootScope.myId !== this.peerId && (await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.peerId, respectType: false, threadId: this.chat.threadId}))\n }, {\n icon: 'comments',\n text: 'ViewDiscussion',\n onClick: () => {\n const middleware = this.chat.bubbles.getMiddleware();\n Promise.resolve(this.managers.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: async() => {\n const chatFull = await this.managers.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 apiManagerProxy.getState().then((state) => {\n if(state.chatContextMenuHintWasShown) {\n return;\n }\n\n const original = selection.toggleByElement.bind(selection);\n selection.toggleByElement = async(bubble) => {\n this.managers.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 && !!this.chat.bubbles.getRenderedLength()\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 = this.appSidebarRight.createTab(AppEditContactTab);\n tab.peerId = this.peerId;\n tab.open();\n\n this.appSidebarRight.toggleSidebar(true);\n }\n },\n verify: async() => this.peerId.isUser() && !(await this.managers.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.managers.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: async() => rootScope.myId !== this.peerId && this.peerId.isUser() && (await this.managers.appPeersManager.isContact(this.peerId)) && !!(await this.managers.appUsersManager.getUser(this.peerId.toUserId())).phone\n }, {\n icon: 'bots',\n text: 'Settings',\n onClick: () => {\n this.managers.appMessagesManager.sendText(this.peerId, '/settings');\n },\n verify: async() => {\n try {\n const attachMenuBot = await this.managers.appAttachMenuBotsManager.getAttachMenuBot(this.peerId.toUserId());\n return !!attachMenuBot?.pFlags?.has_settings;\n } catch(err) {\n return false;\n }\n }\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.managers.appUsersManager.toggleBlock(this.peerId, true).then((value) => {\n if(value) {\n toastNew({langPackKey: 'UserBlocked'});\n }\n });\n }\n }]\n }).show();\n },\n verify: async() => {\n if(!this.peerId.isUser()) return false;\n const userFull = await this.managers.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.managers.appUsersManager.toggleBlock(this.peerId, false).then((value) => {\n if(value) {\n toastNew({langPackKey: 'UserUnblocked'});\n }\n });\n },\n verify: async() => {\n const userFull = await this.managers.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: async() => this.chat.type === 'chat' && !!(await this.managers.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 private constructAvatar() {\n const avatarElement = new AvatarElement();\n avatarElement.isDialog = true;\n avatarElement.classList.add('avatar-42', 'person-avatar');\n return avatarElement;\n }\n\n private get peerId() {\n return this.chat.peerId;\n }\n\n public constructPeerHelpers() {\n this.avatarElement = this.constructAvatar();\n\n this.subtitle = document.createElement('div');\n this.subtitle.classList.add('info');\n\n this.pinnedMessage = new ChatPinnedMessage(this, this.chat, this.managers);\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, this.onMuteClick);\n\n this.attachClickEvent(this.btnJoin, async() => {\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(await this.managers.appChatsManager.isChannel(chatId)) {\n promise = this.managers.appChatsManager.joinChannel(chatId);\n } else {\n promise = this.managers.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)('folder_unread', (folder) => {\n if(folder.id !== FOLDER_ID_ALL) {\n return;\n }\n\n const size = folder.unreadUnmutedPeerIds.size;\n this.btnBackBadge.textContent = size ? '' + formatNumber(size, 1) : '';\n // this.btnBack.classList.remove('tgico-left', 'tgico-previous');\n // this.btnBack.classList.add(size ? 'tgico-previous' : 'tgico-left');\n });\n\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n if(this.peerId === chatId.toPeerId(true)) {\n const chat = await this.managers.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 this.chat.addEventListener('setPeer', (mid, isTopMessage) => {\n const middleware = this.chat.bubbles.getMiddleware();\n apiManagerProxy.getState().then((state) => {\n if(!middleware() || !this.pinnedMessage) 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 this.listenerSetter.add(rootScope)('peer_pinned_messages', ({peerId, mids}) => {\n if(this.chat.type !== 'pinned' || peerId !== this.peerId) {\n return;\n }\n\n if(mids) {\n this.setTitle();\n }\n });\n\n this.setPeerStatusInterval = window.setInterval(this.setPeerStatus, 60e3);\n\n return this;\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 onMuteClick = () => {\n new PopupMute(this.peerId);\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 this.listenerSetter.removeAll();\n window.clearInterval(this.setPeerStatusInterval);\n\n this.pinnedMessage?.destroy(); // * ะฒะพะทะผะพะถะฝะพ ัั‚ะพ ะผะพะถะฝะพ ะฝะต ะดะตะปะฐั‚ัŒ\n this.chatAudio?.destroy();\n\n delete this.chatAudio;\n delete this.pinnedMessage;\n }\n\n public cleanup() {\n if(!this.chat.peerId) {\n this.container.classList.add('hide');\n }\n }\n\n public async finishPeerChange(isTarget: boolean) {\n const {peerId, threadId} = this.chat;\n\n let newAvatar: AvatarElement;\n if(this.chat.type === 'chat') {\n if(this.avatarElement?.peerId !== this.peerId || this.avatarElement.threadId !== this.chat.threadId) {\n newAvatar = this.constructAvatar();\n } else {\n newAvatar = this.avatarElement;\n }\n }\n\n const [isBroadcast, isAnyChat, chat, _, setTitleCallback, setStatusCallback, state] = await Promise.all([\n this.managers.appPeersManager.isBroadcast(peerId),\n this.managers.appPeersManager.isAnyChat(peerId),\n peerId.isAnyChat() ? this.managers.appChatsManager.getChat(peerId.toChatId()) : undefined,\n newAvatar ? newAvatar.updateWithOptions({peerId, threadId, wrapOptions: {customEmojiSize: makeMediaSize(32, 32)}}) : undefined,\n this.setTitleManual(),\n this.setPeerStatusManual(true),\n apiManagerProxy.getState()\n ]);\n\n return () => {\n const canHaveSomeButtons = !(this.chat.type === 'pinned' || this.chat.type === 'scheduled');\n this.btnMute && this.btnMute.classList.toggle('hide', !isBroadcast || !canHaveSomeButtons);\n if(this.btnJoin) {\n if(isAnyChat && !this.chat.isRestricted && canHaveSomeButtons) {\n replaceContent(this.btnJoin, i18n(isBroadcast ? 'Chat.Subscribe' : 'ChannelJoin'));\n this.btnJoin.classList.toggle('hide', !(chat as MTChat.chat)?.pFlags?.left);\n } else {\n this.btnJoin.classList.add('hide');\n }\n }\n\n if(this.btnSearch) {\n this.btnSearch.classList.toggle('hide', !canHaveSomeButtons);\n }\n\n if(this.btnPinned) {\n this.btnPinned.classList.toggle('hide', !canHaveSomeButtons);\n }\n\n if(this.avatarElement !== newAvatar) {\n if(newAvatar) {\n if(this.avatarElement) {\n this.avatarElement.replaceWith(newAvatar);\n } else {\n this.person.prepend(newAvatar);\n }\n }\n\n this.avatarElement?.remove();\n this.avatarElement = newAvatar;\n }\n\n this.setUtilsWidth();\n\n this.verifyButtons();\n\n if(this.btnMore) {\n this.btnMore.classList.toggle('hide', !canHaveSomeButtons);\n }\n\n const isPinnedMessagesNeeded = this.chat.isPinnedMessagesNeeded();\n if(isPinnedMessagesNeeded || this.chat.type === 'discussion') {\n if(this.chat.wasAlreadyUsed || !this.pinnedMessage) { // * change\n const newPinnedMessage = new ChatPinnedMessage(this, this.chat, this.managers);\n if(this.pinnedMessage) {\n this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.replaceWith(newPinnedMessage.pinnedMessageContainer.divAndCaption.container);\n this.pinnedMessage.destroy();\n // this.pinnedMessage.pinnedMessageContainer.toggle(true);\n } else {\n this.chatUtils.prepend(this.pinnedMessage.pinnedMessageContainer.divAndCaption.container);\n }\n\n this.pinnedMessage = newPinnedMessage;\n }\n\n if(isPinnedMessagesNeeded) {\n this.pinnedMessage.hidden = !!state.hiddenPinnedMessages[peerId];\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 } else if(this.pinnedMessage) {\n this.pinnedMessage.destroy();\n this.pinnedMessage = undefined;\n }\n\n setTitleCallback();\n setStatusCallback?.();\n this.subtitle.classList.toggle('hide', !setStatusCallback);\n this.setMutedState();\n\n this.container.classList.remove('hide');\n };\n }\n\n public async setTitleManual(count?: number) {\n const {peerId, threadId} = this.chat;\n const middleware = () => this.chat.bubbles.getMiddleware();\n let titleEl: HTMLElement, icons: Element[];\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.managers.appMessagesManager.getSearchCounters(peerId, [{_: 'inputMessagesFilterPinned'}], false).then((result) => {\n if(!middleware()) return;\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 titleEl = i18n(peerId === rootScope.myId ? 'Reminders' : 'ScheduledMessages');\n } else if(this.chat.type === 'discussion') {\n if(count === undefined) {\n const result = await this.managers.acknowledged.appMessagesManager.getHistory(peerId, 0, 1, 0, threadId);\n if(!middleware()) return;\n if(result.cached) {\n const historyResult = await result.result;\n if(!middleware()) return;\n count = historyResult.count;\n } else result.result.then((historyResult) => {\n if(!middleware()) return;\n this.setTitle(historyResult.count);\n });\n }\n\n if(count === undefined) titleEl = i18n('Loading');\n else titleEl = i18n('Chat.Title.Comments', [count]);\n } else if(this.chat.type === 'chat') {\n [titleEl/* , icons */] = await Promise.all([\n wrapPeerTitle({\n peerId,\n dialog: true,\n withIcons: !threadId,\n threadId: threadId\n })\n // generateTitleIcons(peerId)\n ]);\n\n if(!middleware()) {\n return;\n }\n }\n\n return () => {\n replaceContent(this.title, titleEl);\n // if(icons) {\n // this.title.append(...icons);\n // }\n };\n }\n\n public setTitle(count?: number) {\n this.setTitleManual(count).then((setTitleCallback) => setTitleCallback());\n }\n\n public async setMutedState() {\n if(!this.btnMute) return;\n\n const peerId = this.peerId;\n const muted = await this.managers.appNotificationsManager.isPeerLocalMuted({peerId, respectType: false, threadId: this.chat.threadId});\n if(await this.managers.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 // 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?.pinnedMessageContainer].filter(Boolean);\n const count = containers.reduce((acc, container) => {\n const isFloating = container.isFloating();\n this.container.classList.toggle(`is-pinned-${container.className}-floating`, isFloating);\n\n if(!container.isVisible()) {\n return acc;\n }\n\n return acc + +isFloating;\n }, 0);\n this.container.dataset.floating = '' + count;\n };\n\n public setPeerStatusManual = async(needClear = false) => {\n if(!this.subtitle || this.chat.type !== 'chat') return;\n\n if(this.chat.threadId) {\n const title = await wrapPeerTitle({peerId: this.peerId, dialog: true});\n const span = i18n('TopicProfileStatus', [title]);\n return () => replaceContent(this.subtitle, span);\n }\n\n const peerId = this.peerId;\n return this.chat.appImManager.setPeerStatus({\n peerId,\n element: this.subtitle,\n needClear,\n useWhitespace: false,\n middleware: () => peerId === this.peerId\n });\n };\n\n public setPeerStatus = (needClear?: boolean) => {\n return this.setPeerStatusManual(needClear).then((callback) => {\n callback?.();\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 appSidebarRight from '..';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport AppSearch, {SearchGroup} from '../../appSearch';\nimport ButtonIcon from '../../buttonIcon';\nimport InputSearch from '../../inputSearch';\nimport PopupElement from '../../popups';\nimport PopupDatePicker from '../../popups/datePicker';\nimport {SliderSuperTab} from '../../slider';\n\nexport default class AppPrivateSearchTab extends SliderSuperTab {\n private inputSearch: InputSearch;\n private appSearch: AppSearch;\n private btnPickDate: HTMLElement;\n\n private peerId: PeerId;\n private threadId = 0;\n private query = '';\n private onDatePick: (timestamp: number) => void;\n\n onOpenAfterTimeout() {\n this.appSearch.beginSearch(this.peerId, this.threadId, this.query);\n }\n\n public init(\n peerId: PeerId,\n threadId?: number,\n onDatePick?: AppPrivateSearchTab['onDatePick'],\n query?: string\n ) {\n this.container.id = 'search-private-container';\n this.container.classList.add('chatlist-container');\n this.inputSearch = new InputSearch('Search');\n this.title.replaceWith(this.inputSearch.container);\n\n this.btnPickDate = ButtonIcon('calendar sidebar-header-right');\n this.header.append(this.btnPickDate);\n\n const c = document.createElement('div');\n c.classList.add('chatlist-container');\n this.scrollable.container.replaceWith(c);\n this.appSearch = new AppSearch(c, this.inputSearch, {\n messages: new SearchGroup('Chat.Search.PrivateSearch', 'messages')\n });\n\n if(!this.peerId) {\n this.query = query;\n this.peerId = peerId;\n this.threadId = threadId;\n this.onDatePick = onDatePick;\n\n this.btnPickDate.classList.toggle('hide', !this.onDatePick);\n if(this.onDatePick) {\n attachClickEvent(this.btnPickDate, () => {\n PopupElement.createPopup(PopupDatePicker, new Date(), this.onDatePick).show();\n });\n }\n\n query && this.appSearch.searchInput.inputField.setValueSilently(query);\n\n appSidebarRight.toggleSidebar(true);\n } else {\n this.appSearch.beginSearch(this.peerId, this.threadId, query);\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 ChatTopbar from './topbar';\nimport AppSearch, {SearchGroup} from '../appSearch';\nimport PopupDatePicker from '../popups/datePicker';\nimport ripple from '../ripple';\nimport InputSearch from '../inputSearch';\nimport type Chat from './chat';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport whichChild from '../../helpers/dom/whichChild';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport {i18n} from '../../lib/langPack';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\nimport {IS_MOBILE_SAFARI} from '../../environment/userAgent';\nimport PopupElement from '../popups';\nimport {DIALOG_LIST_ELEMENT_TAG} from '../../lib/appManagers/appDialogsManager';\n\nexport default class ChatSearch {\n private element: HTMLElement;\n private backBtn: HTMLElement;\n private inputSearch: InputSearch;\n\n private results: HTMLElement;\n\n private footer: HTMLElement;\n private dateBtn: HTMLElement;\n private foundCountEl: HTMLElement;\n private controls: HTMLElement;\n private downBtn: HTMLElement;\n private upBtn: HTMLElement;\n\n private appSearch: AppSearch;\n private searchGroup: SearchGroup;\n\n private foundCount = 0;\n private selectedIndex = 0;\n private setPeerPromise: Promise;\n private listenerSetter: ListenerSetter;\n private navigationItem: NavigationItem;\n\n constructor(private topbar: ChatTopbar, private chat: Chat, query?: string) {\n this.element = document.createElement('div');\n this.element.classList.add('sidebar-header', 'chat-search', 'chatlist-container');\n\n this.backBtn = document.createElement('button');\n this.backBtn.classList.add('btn-icon', 'tgico-left', 'sidebar-close-button');\n ripple(this.backBtn);\n\n const listenerSetter = this.listenerSetter = new ListenerSetter();\n\n const attachClick = (element: HTMLElement, callback: (e: MouseEvent) => void) => {\n attachClickEvent(element, callback, {listenerSetter});\n };\n\n attachClick(this.backBtn, () => {\n this.destroy();\n });\n\n this.inputSearch = new InputSearch('Search');\n\n // Results\n this.results = document.createElement('div');\n this.results.classList.add('chat-search-results', 'chatlist-container');\n\n this.searchGroup = new SearchGroup(false, 'messages', undefined, '', false);\n attachClick(this.searchGroup.list, this.onResultsClick);\n\n this.appSearch = new AppSearch(this.results, this.inputSearch, {\n messages: this.searchGroup\n }, (count) => {\n this.foundCount = count;\n\n if(!this.foundCount) {\n replaceContent(this.foundCountEl, this.inputSearch.value ? i18n('NoResult') : '');\n this.results.classList.remove('active');\n this.chat.bubbles.container.classList.remove('search-results-active');\n this.upBtn.setAttribute('disabled', 'true');\n this.downBtn.setAttribute('disabled', 'true');\n } else {\n this.selectResult(this.searchGroup.list.children[0] as HTMLElement);\n }\n });\n this.appSearch.beginSearch(this.chat.peerId, this.chat.threadId);\n\n // appImManager.topbar.parentElement.insertBefore(this.results, appImManager.bubblesContainer);\n this.chat.bubbles.container.append(this.results);\n\n // Footer\n this.footer = document.createElement('div');\n this.footer.classList.add('chat-search-footer');\n\n attachClick(this.footer, this.onFooterClick);\n ripple(this.footer);\n\n this.foundCountEl = document.createElement('span');\n this.foundCountEl.classList.add('chat-search-count');\n\n this.dateBtn = document.createElement('button');\n this.dateBtn.classList.add('btn-icon', 'tgico-calendar');\n\n this.controls = document.createElement('div');\n this.controls.classList.add('chat-search-controls');\n\n this.upBtn = document.createElement('button');\n this.upBtn.classList.add('btn-icon', 'tgico-up');\n this.downBtn = document.createElement('button');\n this.downBtn.classList.add('btn-icon', 'tgico-down');\n\n this.upBtn.setAttribute('disabled', 'true');\n this.downBtn.setAttribute('disabled', 'true');\n\n attachClick(this.dateBtn, this.onDateClick);\n attachClick(this.upBtn, this.onUpClick);\n attachClick(this.downBtn, this.onDownClick);\n this.controls.append(this.upBtn, this.downBtn);\n\n this.footer.append(this.foundCountEl, this.dateBtn, this.controls);\n\n this.topbar.container.parentElement.insertBefore(this.footer, chat.input.chatInput);\n\n // Append container\n this.element.append(this.backBtn, this.inputSearch.container);\n\n this.topbar.container.classList.add('hide-pinned');\n this.topbar.container.parentElement.append(this.element);\n\n this.inputSearch.input.focus();\n\n if(query) {\n this.setQuery(query);\n }\n\n if(!IS_MOBILE_SAFARI) {\n this.navigationItem = {\n type: 'mobile-search',\n onPop: () => {\n this.destroy();\n }\n };\n\n appNavigationController.pushItem(this.navigationItem);\n }\n }\n\n public destroy() {\n this.topbar.container.classList.remove('hide-pinned');\n this.element.remove();\n this.inputSearch.remove();\n this.results.remove();\n this.footer.remove();\n this.listenerSetter.removeAll();\n this.chat.bubbles.container.classList.remove('search-results-active');\n this.chat.search = undefined;\n appNavigationController.removeItem(this.navigationItem);\n }\n\n public setQuery(query: string) {\n this.inputSearch.inputField.value = query;\n }\n\n private onDateClick = (e: MouseEvent) => {\n cancelEvent(e);\n PopupElement.createPopup(PopupDatePicker, new Date(), this.chat.bubbles.onDatePick).show();\n };\n\n private selectResult(elem: HTMLElement) {\n if(this.setPeerPromise) return this.setPeerPromise;\n\n const peerId = elem.dataset.peerId.toPeerId();\n const lastMsgId = +elem.dataset.mid || undefined;\n\n const index = whichChild(elem);\n\n if(index === (this.foundCount - 1)) {\n this.upBtn.setAttribute('disabled', 'true');\n } else {\n this.upBtn.removeAttribute('disabled');\n }\n\n if(!index) {\n this.downBtn.setAttribute('disabled', 'true');\n } else {\n this.downBtn.removeAttribute('disabled');\n }\n\n this.results.classList.remove('active');\n this.chat.bubbles.container.classList.remove('search-results-active');\n\n const res = this.chat.setPeer({peerId, lastMsgId});\n this.setPeerPromise = ((res instanceof Promise ? res : Promise.resolve(res)) as Promise).then(() => {\n this.selectedIndex = index;\n replaceContent(this.foundCountEl, i18n('Of', [index + 1, this.foundCount]));\n\n const renderedCount = this.searchGroup.list.childElementCount;\n if(this.selectedIndex >= (renderedCount - 6)) {\n this.appSearch.searchMore();\n }\n }).finally(() => {\n this.setPeerPromise = null;\n });\n }\n\n private onResultsClick = (e: MouseEvent) => {\n const target = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\n if(target) {\n this.selectResult(target);\n }\n };\n\n private onFooterClick = (e: MouseEvent) => {\n if(this.foundCount) {\n this.chat.bubbles.container.classList.toggle('search-results-active');\n this.results.classList.toggle('active');\n }\n };\n\n private onUpClick = (e: MouseEvent) => {\n cancelEvent(e);\n this.selectResult(this.searchGroup.list.children[this.selectedIndex + 1] as HTMLElement);\n };\n\n private onDownClick = (e: MouseEvent) => {\n cancelEvent(e);\n this.selectResult(this.searchGroup.list.children[this.selectedIndex - 1] as HTMLElement);\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 indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\nimport mediaSizes, {ScreenSize} from '../../helpers/mediaSizes';\nimport windowSize from '../../helpers/windowSize';\nimport IS_IMAGE_BITMAP_SUPPORTED from '../../environment/imageBitmapSupport';\n\ntype ChatBackgroundPatternRendererInitOptions = {\n url: string,\n width: number,\n height: number,\n mask?: boolean\n};\n\nexport default class ChatBackgroundPatternRenderer {\n private static INSTANCES: ChatBackgroundPatternRenderer[] = [];\n\n // private pattern: CanvasPattern;\n private objectUrl: string;\n private options: ChatBackgroundPatternRendererInitOptions;\n private canvases: Set;\n // private createCanvasPatternPromise: Promise;\n // private exportCanvasPatternToImagePromise: Promise;\n private renderImageFromUrlPromise: Promise;\n private image: HTMLImageElement;\n private imageBitmap: ImageBitmap;\n\n constructor() {\n this.canvases = new Set();\n }\n\n public static getInstance(options: ChatBackgroundPatternRendererInitOptions) {\n let instance = this.INSTANCES.find((instance) => {\n return deepEqual(instance.options, options);\n });\n\n if(!instance) {\n instance = new ChatBackgroundPatternRenderer();\n instance.init(options);\n this.INSTANCES.push(instance);\n }\n\n return instance;\n }\n\n public init(options: ChatBackgroundPatternRendererInitOptions) {\n // if(this.options) {\n // if(this.options.width !== options.width || this.options.height !== options.height) {\n // this.createCanvasPatternPromise =\n // this.pattern =\n // this.exportCanvasPatternToImagePromise =\n // undefined;\n // }\n // }\n\n this.options = options;\n }\n\n public renderToCanvas(canvas: HTMLCanvasElement) {\n // return this.createCanvasPattern(canvas).then(() => {\n // return this.fillCanvas(canvas);\n // });\n\n return this.renderImageFromUrl(this.options.url).then(() => {\n return this.fillCanvas(canvas);\n });\n }\n\n private renderImageFromUrl(url: string) {\n if(this.renderImageFromUrlPromise) return this.renderImageFromUrlPromise;\n const img = this.image = document.createElement('img');\n img.crossOrigin = 'anonymous';\n return this.renderImageFromUrlPromise = renderImageFromUrlPromise(img, url, false).then(() => {\n if(!IS_IMAGE_BITMAP_SUPPORTED) {\n return img;\n }\n\n return createImageBitmap(img, {\n resizeWidth: 1440,\n resizeHeight: 2960\n }).then((imageBitmap) => {\n this.imageBitmap = imageBitmap;\n return img;\n });\n });\n }\n\n /* private createCanvasPattern(canvas: HTMLCanvasElement) {\n if(this.createCanvasPatternPromise) return this.createCanvasPatternPromise;\n return this.createCanvasPatternPromise = this.renderImageFromUrl(this.options.url).then((img) => {\n let createPatternFrom: HTMLImageElement | HTMLCanvasElement;\n if(IS_SAFARI) {\n const canvas = createPatternFrom = document.createElement('canvas');\n canvas.width = img.naturalWidth;\n canvas.height = img.naturalHeight;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n } else {\n createPatternFrom = img;\n }\n\n const perf = performance.now();\n this.pattern = canvas.getContext('2d').createPattern(createPatternFrom, 'repeat-x');\n console.warn('creating pattern time:', performance.now() - perf);\n\n return this.pattern;\n });\n }\n\n public exportCanvasPatternToImage(canvas: HTMLCanvasElement) {\n if(this.exportCanvasPatternToImagePromise) return this.exportCanvasPatternToImagePromise;\n return this.exportCanvasPatternToImagePromise = new Promise((resolve) => {\n canvas.toBlob((blob) => {\n const newUrl = this.objectUrl = URL.createObjectURL(blob);\n resolve(newUrl);\n }, 'image/png');\n });\n } */\n\n public cleanup(canvas: HTMLCanvasElement) {\n this.canvases.delete(canvas);\n\n if(!this.canvases.size) {\n indexOfAndSplice(ChatBackgroundPatternRenderer.INSTANCES, this);\n\n if(this.objectUrl) {\n this.imageBitmap?.close();\n URL.revokeObjectURL(this.objectUrl);\n }\n }\n }\n\n public fillCanvas(canvas: HTMLCanvasElement) {\n const context = canvas.getContext('2d');\n const {width, height} = canvas;\n // const perf = performance.now();\n // if(context.fillStyle instanceof CanvasPattern) {\n // context.clearRect(0, 0, width, height);\n // }\n\n const source = this.imageBitmap || this.image;\n\n let imageWidth = source.width, imageHeight = source.height;\n // let patternHeight = 1480 * canvas.dpr;\n // if(+canvas.dataset.originalHeight !== height) patternHeight *= .6875;\n const patternHeight = (500 + (windowSize.height / 2.5)) * canvas.dpr;\n const ratio = patternHeight / imageHeight;\n imageWidth *= ratio;\n imageHeight = patternHeight;\n\n if(this.options.mask) {\n context.fillStyle = '#000';\n context.fillRect(0, 0, width, height);\n context.globalCompositeOperation = 'destination-out';\n } else {\n context.globalCompositeOperation = 'source-over';\n }\n\n const d = (y: number) => {\n for(let x = 0; x < width; x += imageWidth) {\n context.drawImage(source, x, y, imageWidth, imageHeight);\n }\n };\n\n const centerY = (height - imageHeight) / 2;\n d(centerY);\n\n if(centerY > 0) {\n let topY = centerY;\n do {\n d(topY -= imageHeight);\n } while(topY >= 0);\n }\n\n const endY = height - 1;\n for(let bottomY = centerY + imageHeight; bottomY < endY; bottomY += imageHeight) {\n d(bottomY);\n }\n\n // for(let x = 0; x < width; x += imageWidth) {\n // for(let y = 0; y < height; y += imageHeight) {\n // context.drawImage(img, x, y, imageWidth, imageHeight);\n // }\n // }\n // context.fillStyle = this.pattern;\n // context.fillRect(0, 0, width, height);\n // console.warn('fill canvas time', performance.now() - perf);\n }\n\n public setCanvasDimensions(canvas: HTMLCanvasElement) {\n const devicePixelRatio = Math.min(2, window.devicePixelRatio);\n const width = this.options.width * devicePixelRatio;\n let height = this.options.height * devicePixelRatio;\n\n canvas.dpr = devicePixelRatio;\n canvas.dataset.originalHeight = '' + height;\n if(mediaSizes.activeScreen === ScreenSize.large) height *= 1.5;\n canvas.width = width;\n canvas.height = height;\n }\n\n public createCanvas() {\n const canvas = document.createElement('canvas');\n this.canvases.add(canvas);\n this.setCanvasDimensions(canvas);\n return canvas;\n }\n\n public resize(width: number, height: number) {\n this.init({\n ...this.options,\n width,\n height\n });\n\n const promises: Promise[] = [];\n for(const canvas of this.canvases) {\n this.setCanvasDimensions(canvas);\n promises.push(this.renderToCanvas(canvas));\n }\n\n return Promise.all(promises);\n }\n\n public static resizeInstances(width: number, height: number) {\n return Promise.all(this.INSTANCES.map((instance) => instance.resize(width, height)));\n }\n\n /* public setResizeMode(resizing: boolean) {\n const canvases = Array.from(this.canvases);\n const canvas = canvases[canvases.length - 1];\n canvas.style.display = resizing ? 'none' : '';\n const img = this.img;\n img.style.display = resizing ? '' : 'none';\n\n return {img, canvas};\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 {ChatRights} from '../../lib/appManagers/appChatsManager';\nimport {AppImManager, APP_TABS, ChatSetPeerOptions} from '../../lib/appManagers/appImManager';\nimport type {MessageSendingParams, MessagesStorageKey} from '../../lib/appManagers/appMessagesManager';\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 {NULL_PEER_ID, REPLIES_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport SetTransition from '../singleTransition';\nimport AppPrivateSearchTab from '../sidebarRight/tabs/search';\nimport renderImageFromUrl from '../../helpers/dom/renderImageFromUrl';\nimport mediaSizes, {ScreenSize} from '../../helpers/mediaSizes';\nimport ChatSearch from './search';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport getAutoDownloadSettingsByPeerId, {ChatAutoDownloadSettings} from '../../helpers/autoDownload';\nimport ChatBackgroundGradientRenderer from './gradientRenderer';\nimport ChatBackgroundPatternRenderer from './patternRenderer';\nimport pause from '../../helpers/schedulers/pause';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport SlicedArray from '../../helpers/slicedArray';\nimport themeController from '../../helpers/themeController';\nimport AppSharedMediaTab from '../sidebarRight/tabs/sharedMedia';\nimport noop from '../../helpers/noop';\nimport middlewarePromise from '../../helpers/middlewarePromise';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport {Message, WallPaper} from '../../layer';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport {getColorsFromWallPaper} from '../../helpers/color';\n\nexport type ChatType = 'chat' | 'pinned' | '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 public messagesStorageKey: MessagesStorageKey;\n\n public noForwards: boolean;\n\n public inited: boolean;\n\n public isRestricted: boolean;\n public autoDownload: ChatAutoDownloadSettings;\n\n public gradientRenderer: ChatBackgroundGradientRenderer;\n public patternRenderer: ChatBackgroundPatternRenderer;\n public gradientCanvas: HTMLCanvasElement;\n public patternCanvas: HTMLCanvasElement;\n public backgroundTempId: number;\n public setBackgroundPromise: Promise;\n public sharedMediaTab: AppSharedMediaTab;\n public sharedMediaTabs: AppSharedMediaTab[];\n // public renderDarkPattern: () => Promise;\n\n public isBot: boolean;\n public isChannel: boolean;\n public isBroadcast: boolean;\n public isAnyGroup: boolean;\n public isMegagroup: boolean;\n public isForum: boolean;\n public isAllMessagesForum: boolean;\n public isAnonymousSending: boolean;\n\n public animationGroup: AnimationItemGroup;\n\n constructor(\n public appImManager: AppImManager,\n public managers: AppManagers\n ) {\n super();\n\n this.type = 'chat';\n this.animationGroup = `chat-${Math.round(Math.random() * 65535)}`;\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.warn('constructor');\n\n this.peerId = NULL_PEER_ID;\n\n this.container.append(this.backgroundEl);\n this.appImManager.chatsContainer.append(this.container);\n\n this.backgroundTempId = 0;\n this.sharedMediaTabs = [];\n }\n\n public setBackground(url: string, skipAnimation?: boolean): Promise {\n const theme = themeController.getTheme();\n const themeSettings = theme.settings;\n const wallPaper = themeSettings.wallpaper;\n const colors = getColorsFromWallPaper(wallPaper);\n\n let item: HTMLElement;\n const isColorBackground = !!colors && !(wallPaper as WallPaper.wallPaper).slug && !wallPaper.settings.intensity;\n if(\n isColorBackground &&\n document.documentElement.style.cursor === 'grabbing' &&\n this.gradientRenderer &&\n !this.patternRenderer\n ) {\n this.gradientCanvas.dataset.colors = colors;\n this.gradientRenderer.init(this.gradientCanvas);\n return Promise.resolve();\n }\n\n const tempId = ++this.backgroundTempId;\n\n const previousGradientRenderer = this.gradientRenderer;\n const previousPatternRenderer = this.patternRenderer;\n const previousGradientCanvas = this.gradientCanvas;\n const previousPatternCanvas = this.patternCanvas;\n\n this.gradientRenderer =\n this.patternRenderer =\n this.gradientCanvas =\n this.patternCanvas =\n // this.renderDarkPattern =\n undefined;\n\n const intensity = wallPaper.settings?.intensity && wallPaper.settings.intensity / 100;\n const isDarkPattern = !!intensity && intensity < 0;\n\n let patternRenderer: ChatBackgroundPatternRenderer;\n let patternCanvas = item?.firstElementChild as HTMLCanvasElement;\n let gradientCanvas: HTMLCanvasElement;\n if(!item) {\n item = document.createElement('div');\n item.classList.add('chat-background-item');\n\n if(url) {\n if(intensity) {\n item.classList.add('is-pattern');\n\n const rect = this.appImManager.chatsContainer.getBoundingClientRect();\n patternRenderer = this.patternRenderer = ChatBackgroundPatternRenderer.getInstance({\n url,\n width: rect.width,\n height: rect.height,\n mask: isDarkPattern\n });\n\n patternCanvas = this.patternCanvas = patternRenderer.createCanvas();\n patternCanvas.classList.add('chat-background-item-canvas', 'chat-background-item-pattern-canvas');\n\n if(isDarkPattern) {\n item.classList.add('is-dark');\n }\n\n // if(isDarkPattern) {\n // this.renderDarkPattern = () => {\n // return patternRenderer.exportCanvasPatternToImage(patternCanvas).then((url) => {\n // if(this.backgroundTempId !== tempId) {\n // return;\n // }\n\n // gradientCanvas.style.webkitMaskImage = `url(${url})`;\n // });\n // };\n // }\n } else {\n item.classList.add('is-image');\n }\n } else {\n item.classList.add('is-color');\n }\n }\n\n let gradientRenderer: ChatBackgroundGradientRenderer;\n if(colors) {\n // if(color.includes(',')) {\n const {canvas, gradientRenderer: _gradientRenderer} = ChatBackgroundGradientRenderer.create(colors);\n gradientRenderer = this.gradientRenderer = _gradientRenderer;\n gradientCanvas = this.gradientCanvas = canvas;\n gradientCanvas.classList.add('chat-background-item-canvas', 'chat-background-item-color-canvas');\n\n if(rootScope.settings.animationsEnabled) {\n gradientRenderer.scrollAnimate(true);\n }\n // } else {\n // item.style.backgroundColor = color;\n // item.style.backgroundImage = 'none';\n // }\n }\n\n if(patternRenderer) {\n const setOpacityTo = isDarkPattern ? gradientCanvas : patternCanvas;\n let opacityMax = Math.abs(intensity) * (isDarkPattern ? .5 : 1);\n if(isDarkPattern) {\n opacityMax = Math.max(0.3, opacityMax);\n }\n setOpacityTo.style.setProperty('--opacity-max', '' + opacityMax);\n }\n\n const promise = new Promise((resolve) => {\n const cb = () => {\n if(this.backgroundTempId !== tempId) {\n if(patternRenderer) {\n patternRenderer.cleanup(patternCanvas);\n }\n\n if(gradientRenderer) {\n gradientRenderer.cleanup();\n }\n\n return;\n }\n\n const prev = this.backgroundEl.lastElementChild as HTMLElement;\n\n if(prev === item) {\n resolve();\n return;\n }\n\n const append = [\n gradientCanvas,\n // isDarkPattern && this.renderDarkPattern ? undefined : patternCanvas\n patternCanvas\n ].filter(Boolean);\n if(append.length) {\n item.append(...append);\n }\n\n this.backgroundEl.append(item);\n\n SetTransition({\n element: item,\n className: 'is-visible',\n forwards: true,\n duration: !skipAnimation ? 200 : 0,\n onTransitionEnd: prev ? () => {\n previousPatternRenderer?.cleanup(previousPatternCanvas);\n previousGradientRenderer?.cleanup();\n\n prev.remove();\n } : null,\n useRafs: 2\n });\n\n resolve();\n };\n\n if(patternRenderer) {\n const renderPatternPromise = patternRenderer.renderToCanvas(patternCanvas);\n renderPatternPromise.then(() => {\n if(this.backgroundTempId !== tempId) {\n return;\n }\n\n // let promise: Promise;\n // if(isDarkPattern && this.renderDarkPattern) {\n // promise = this.renderDarkPattern();\n // } else {\n // const promise = Promise.resolve();\n // }\n\n // promise.then(cb);\n cb();\n });\n } else if(url) {\n renderImageFromUrl(item, url, cb);\n } else {\n cb();\n }\n });\n\n return this.setBackgroundPromise = Promise.race([\n pause(500),\n promise\n ]);\n }\n\n public setType(type: ChatType) {\n this.type = type;\n }\n\n public init(/* peerId: PeerId */) {\n // this.initPeerId = peerId;\n\n this.topbar = new ChatTopbar(this, appSidebarRight, this.managers);\n this.bubbles = new ChatBubbles(this, this.managers);\n this.input = new ChatInput(this, this.appImManager, this.managers);\n this.contextMenu = new ChatContextMenu(this, this.managers);\n this.selection = new ChatSelection(this, this.bubbles, this.input, this.managers);\n\n this.topbar.constructUtils();\n this.topbar.constructPeerHelpers();\n\n this.topbar.construct();\n this.input.construct();\n\n this.bubbles.constructPeerHelpers();\n this.input.constructPeerHelpers();\n\n if(!IS_TOUCH_SUPPORTED) {\n this.bubbles.setReactionsHoverListeners();\n }\n\n this.bubbles.attachContainerListeners();\n\n this.container.append(this.topbar.container, this.bubbles.container, this.input.chatInput);\n\n this.bubbles.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\n if(this.peerId === migrateFrom) {\n this.setPeer({peerId: migrateTo});\n }\n });\n\n this.bubbles.listenerSetter.add(rootScope)('dialog_drop', (dialog) => {\n if(dialog.peerId === this.peerId && (dialog._ === 'dialog' || this.threadId === dialog.id)) {\n this.appImManager.setPeer();\n }\n });\n\n this.bubbles.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n const {peerId} = this;\n if(peerId.isAnyChat() && peerId.toChatId() === chatId) {\n const isAnonymousSending = await this.managers.appMessagesManager.isAnonymousSending(peerId);\n if(peerId === this.peerId) {\n this.isAnonymousSending = isAnonymousSending;\n }\n }\n });\n\n const freezeObservers = (freeze: boolean) => {\n const cb = () => {\n this.bubbles.observer?.toggleObservingNew(freeze);\n animationIntersector.toggleIntersectionGroup(this.animationGroup, freeze);\n if(freeze) {\n animationIntersector.checkAnimations(freeze, this.animationGroup);\n }\n };\n\n if(!freeze) {\n setTimeout(() => {\n cb();\n }, 400);\n } else {\n cb();\n }\n };\n\n this.bubbles.listenerSetter.add(this.appImManager)('chat_changing', ({to}) => {\n freezeObservers(to !== this);\n });\n\n this.bubbles.listenerSetter.add(this.appImManager)('tab_changing', (tabId) => {\n freezeObservers(this.appImManager.chat !== this || (tabId !== APP_TABS.CHAT && mediaSizes.activeScreen === ScreenSize.mobile));\n });\n }\n\n public beforeDestroy() {\n this.bubbles.cleanup();\n }\n\n private cleanupBackground() {\n ++this.backgroundTempId;\n if(this.patternRenderer) {\n this.patternRenderer.cleanup(this.patternCanvas);\n this.patternRenderer = undefined;\n }\n\n if(this.gradientRenderer) {\n this.gradientRenderer.cleanup();\n this.gradientRenderer = undefined;\n }\n }\n\n public destroy() {\n // const perf = performance.now();\n\n this.destroySharedMediaTab();\n this.topbar.destroy();\n this.bubbles.destroy();\n this.input.destroy();\n this.contextMenu && this.contextMenu.destroy();\n this.selection && this.selection.attachListeners(undefined, undefined);\n\n this.cleanupBackground();\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.topbar.cleanup();\n this.selection.cleanup();\n }\n\n public get isForumTopic() {\n return !!(this.isForum && this.threadId);\n }\n\n public async onChangePeer(options: ChatSetPeerOptions, m: ReturnType) {\n const {peerId, threadId} = this;\n\n const searchTab = appSidebarRight.getTab(AppPrivateSearchTab);\n searchTab?.close();\n\n const [\n noForwards,\n isRestricted,\n isAnyGroup,\n _,\n isMegagroup,\n isBroadcast,\n isChannel,\n isBot,\n isForum,\n isAnonymousSending\n ] = await m(Promise.all([\n this.managers.appPeersManager.noForwards(peerId),\n this.managers.appPeersManager.isPeerRestricted(peerId),\n this._isAnyGroup(peerId),\n this.setAutoDownloadMedia(),\n this.managers.appPeersManager.isMegagroup(peerId),\n this.managers.appPeersManager.isBroadcast(peerId),\n this.managers.appPeersManager.isChannel(peerId),\n this.managers.appPeersManager.isBot(peerId),\n this.managers.appPeersManager.isForum(peerId),\n this.managers.appMessagesManager.isAnonymousSending(peerId)\n ]));\n\n // ! WARNING: TEMPORARY, HAVE TO GET TOPIC\n if(isForum && threadId) {\n await m(this.managers.dialogsStorage.getForumTopicOrReload(peerId, threadId));\n }\n\n this.noForwards = noForwards;\n this.isRestricted = isRestricted;\n this.isAnyGroup = isAnyGroup;\n this.isMegagroup = isMegagroup;\n this.isBroadcast = isBroadcast;\n this.isChannel = isChannel;\n this.isBot = isBot;\n this.isForum = isForum;\n this.isAllMessagesForum = isForum && !threadId;\n this.isAnonymousSending = isAnonymousSending;\n\n if(threadId && !this.isForum) {\n options.type = 'discussion';\n }\n\n const type = options.type ?? 'chat';\n this.setType(type);\n\n this.messagesStorageKey = `${this.peerId}_${this.type === 'scheduled' ? 'scheduled' : 'history'}`;\n\n this.container.classList.toggle('no-forwards', this.noForwards);\n\n this.sharedMediaTab = appSidebarRight.createSharedMediaTab();\n this.sharedMediaTabs.push(this.sharedMediaTab);\n\n this.sharedMediaTab.setPeer(peerId, threadId);\n this.input.clearHelper(); // ะบะพัั‚ั‹ะปัŒ\n this.selection.cleanup(); // TODO: REFACTOR !!!!!!\n }\n\n public setPeer(options: ChatSetPeerOptions) {\n const {peerId, threadId} = options;\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 appMediaViewer = (window as any).appMediaViewer as AppMediaViewerBase;\n // if(appMediaViewer) {\n // appMediaViewer.close();\n // }\n\n const samePeer = this.appImManager.isSamePeer(this, options);\n if(!samePeer) {\n this.appImManager.dispatchEvent('peer_changing', this);\n this.peerId = peerId || NULL_PEER_ID;\n this.threadId = threadId;\n } else if(this.setPeerPromise) {\n return;\n }\n\n if(!peerId) {\n appSidebarRight.toggleSidebar(false);\n this.cleanup(true);\n this.bubbles.setPeer({samePeer: false, peerId});\n this.peerId = 0;\n this.appImManager.dispatchEvent('peer_changed', this);\n\n appSidebarRight.replaceSharedMediaTab();\n this.destroySharedMediaTab();\n this.sharedMediaTab = undefined;\n\n return;\n }\n\n this.peerChanged = samePeer;\n\n const bubblesSetPeerPromise = this.bubbles.setPeer({...options, samePeer});\n const setPeerPromise = this.setPeerPromise = bubblesSetPeerPromise.then((result) => {\n return result.promise;\n }).catch(noop).finally(() => {\n if(this.setPeerPromise === setPeerPromise) {\n this.setPeerPromise = null;\n }\n });\n\n return bubblesSetPeerPromise;\n }\n\n public destroySharedMediaTab(tab = this.sharedMediaTab) {\n if(!tab) {\n return;\n }\n\n indexOfAndSplice(this.sharedMediaTabs, tab);\n tab.destroy();\n }\n\n public async setAutoDownloadMedia() {\n this.autoDownload = await getAutoDownloadSettingsByPeerId(this.peerId);\n }\n\n public setMessageId(messageId?: number) {\n return this.setPeer({\n peerId: this.peerId,\n threadId: this.threadId,\n lastMsgId: messageId\n });\n }\n\n public async finishPeerChange(isTarget: boolean, isJump: boolean, lastMsgId: number, startParam?: string) {\n if(this.peerChanged) return;\n\n const peerId = this.peerId;\n this.peerChanged = true;\n this.wasAlreadyUsed = true;\n\n const middleware = this.bubbles.getMiddleware();\n\n this.cleanup(false);\n\n const sharedMediaTab = this.sharedMediaTab;\n\n const callbacksPromise = Promise.all([\n this.topbar.finishPeerChange(isTarget),\n this.bubbles.finishPeerChange(),\n this.input.finishPeerChange(startParam),\n sharedMediaTab.fillProfileElements()\n ]);\n\n const callbacks = await callbacksPromise;\n sharedMediaTab.loadSidebarMedia(true);\n\n if(!middleware()) {\n return;\n }\n\n callbacks.forEach((callback) => {\n callback?.();\n });\n\n appSidebarRight.replaceSharedMediaTab(sharedMediaTab);\n\n this.sharedMediaTabs.filter((tab) => tab !== sharedMediaTab).forEach((tab) => this.destroySharedMediaTab(tab));\n\n this.container.dataset.type = this.type;\n this.log.setPrefix('CHAT-' + peerId + '-' + this.type);\n\n this.appImManager.dispatchEvent('peer_changed', this);\n }\n\n public getMessage(mid: number) {\n return this.managers.appMessagesManager.getMessageFromStorage(this.messagesStorageKey, mid);\n }\n\n public async getMidsByMid(mid: number) {\n return this.managers.appMessagesManager.getMidsByMessage(await this.getMessage(mid));\n }\n\n public getHistoryStorage(ignoreThreadId?: boolean) {\n return this.managers.appMessagesManager.getHistoryStorageTransferable(this.peerId, ignoreThreadId ? undefined : this.threadId)\n .then((historyStorageTransferable) => {\n return {\n ...historyStorageTransferable,\n history: SlicedArray.fromJSON(historyStorageTransferable.historySerialized)\n }\n });\n }\n\n public getDialogOrTopic() {\n return this.isForum && this.threadId ? this.managers.dialogsStorage.getForumTopic(this.peerId, this.threadId) : this.managers.dialogsStorage.getDialogOnly(this.peerId);\n }\n\n public getHistoryMaxId() {\n return this.getHistoryStorage().then((historyStorage) => historyStorage.maxId);\n }\n\n public async _isAnyGroup(peerId: PeerId) {\n return peerId === rootScope.myId || peerId === REPLIES_PEER_ID || (await this.managers.appPeersManager.isAnyGroup(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 = appSidebarRight.createTab(AppPrivateSearchTab);\n }\n\n tab.open(this.peerId, this.threadId, this.bubbles.onDatePick, query);\n }\n }\n\n public canSend(action?: ChatRights) {\n return this.managers.appMessagesManager.canSendToPeer(this.peerId, this.threadId, action);\n }\n\n public isStartButtonNeeded() {\n return Promise.all([\n this.managers.appPeersManager.isBot(this.peerId),\n this.managers.appMessagesManager.getDialogOnly(this.peerId),\n this.getHistoryStorage(true)\n ]).then(([isBot, dialog, historyStorage]) => {\n return isBot && !dialog && !historyStorage.history.length;\n });\n }\n\n public getMessageSendingParams(): MessageSendingParams {\n return {\n threadId: this.threadId,\n replyToMsgId: this.input.replyToMsgId,\n scheduleDate: this.input.scheduleDate,\n silent: this.input.sendSilent,\n sendAsPeerId: this.input.sendAsPeerId\n };\n }\n\n public isOurMessage(message: Message.message | Message.messageService) {\n return message.fromId === rootScope.myId || (!!message.pFlags.out && this.isMegagroup);\n }\n\n public isOutMessage(message: Message.message | Message.messageService) {\n const fwdFrom = (message as Message.message).fwd_from;\n const isOut = this.isOurMessage(message) && (!fwdFrom || this.peerId !== rootScope.myId);\n return !!isOut;\n }\n\n public isAvatarNeeded(message: Message.message | Message.messageService) {\n return this.isAnyGroup && !this.isOutMessage(message);\n }\n\n public isPinnedMessagesNeeded() {\n return this.type === 'chat' || this.isForum;\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 {State} from '../config/state';\nimport rootScope from '../lib/rootScope';\n\nexport type ChatAutoDownloadSettings = {\n photo: number,\n video: number,\n file: number\n};\n\nexport default async function getAutoDownloadSettingsByPeerId(peerId: PeerId): Promise {\n let type: keyof State['settings']['autoDownload'];\n\n let photoSizeMax = 0, videoSizeMax = 0, fileSizeMax = 0;\n const settings = rootScope.settings;\n const appPeersManager = rootScope.managers.appPeersManager;\n if(!settings.autoDownloadNew.pFlags.disabled && peerId) {\n if(peerId.isUser()) {\n if(await appPeersManager.isContact(peerId)) {\n type = 'contacts';\n } else {\n type = 'private';\n }\n } else if(await appPeersManager.isBroadcast(peerId)) {\n type = 'channels';\n } else {\n type = 'groups';\n }\n\n if(settings.autoDownload.photo[type]) photoSizeMax = settings.autoDownloadNew.photo_size_max;\n if(settings.autoDownload.video[type]) videoSizeMax = settings.autoDownloadNew.video_size_max;\n if(settings.autoDownload.file[type]) fileSizeMax = settings.autoDownloadNew.file_size_max;\n }\n\n return {\n photo: photoSizeMax,\n video: videoSizeMax,\n file: fileSizeMax\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 {AppImManager} from '../../lib/appManagers/appImManager';\nimport ButtonIcon from '../buttonIcon';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport {IS_APPLE, IS_MOBILE} from '../../environment/userAgent';\nimport appNavigationController from '../appNavigationController';\nimport {_i18n} from '../../lib/langPack';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport isSelectionEmpty from '../../helpers/dom/isSelectionEmpty';\nimport {MarkdownType} from '../../helpers/dom/getRichElementValue';\nimport getVisibleRect from '../../helpers/dom/getVisibleRect';\nimport clamp from '../../helpers/number/clamp';\nimport matchUrl from '../../lib/richTextProcessor/matchUrl';\nimport matchUrlProtocol from '../../lib/richTextProcessor/matchUrlProtocol';\nimport hasMarkupInSelection from '../../helpers/dom/hasMarkupInSelection';\n\nexport default class MarkupTooltip {\n public container: HTMLElement;\n private wrapper: HTMLElement;\n private buttons: {[type in MarkdownType]: HTMLElement} = {} as any;\n private linkBackButton: HTMLElement;\n private linkApplyButton: HTMLButtonElement;\n private hideTimeout: number;\n private addedListener = false;\n private waitingForMouseUp = false;\n private linkInput: HTMLInputElement;\n private savedRange: Range;\n private mouseUpCounter: number = 0;\n // private log: ReturnType;\n\n constructor(private appImManager: AppImManager) {\n // this.log = logger('MARKUP');\n }\n\n private init() {\n this.container = document.createElement('div');\n this.container.classList.add('markup-tooltip', 'z-depth-1', 'hide');\n\n this.wrapper = document.createElement('div');\n this.wrapper.classList.add('markup-tooltip-wrapper');\n\n const tools1 = document.createElement('div');\n const tools2 = document.createElement('div');\n tools1.classList.add('markup-tooltip-tools');\n tools2.classList.add('markup-tooltip-tools');\n\n const arr = ['bold', 'italic', 'underline', 'strikethrough', 'monospace', 'spoiler', 'link'] as (keyof MarkupTooltip['buttons'])[];\n arr.forEach((c) => {\n const button = ButtonIcon(c, {noRipple: true});\n tools1.append(this.buttons[c] = button);\n\n if(c !== 'link') {\n button.addEventListener('mousedown', (e) => {\n cancelEvent(e);\n this.appImManager.chat.input.applyMarkdown(c);\n this.cancelClosening();\n\n /* this.mouseUpCounter = 0;\n this.setMouseUpEvent(); */\n // this.hide();\n });\n } else {\n attachClickEvent(button, (e) => {\n cancelEvent(e);\n this.showLinkEditor();\n this.cancelClosening();\n });\n }\n });\n\n this.linkBackButton = ButtonIcon('left', {noRipple: true});\n this.linkInput = document.createElement('input');\n _i18n(this.linkInput, 'MarkupTooltip.LinkPlaceholder', undefined, 'placeholder');\n this.linkInput.classList.add('input-clear');\n this.linkInput.addEventListener('keydown', (e) => {\n const valid = !this.linkInput.value.length || !!matchUrl(this.linkInput.value);// /^(http)|(https):\\/\\//i.test(this.linkInput.value);\n\n if(e.key === 'Enter') {\n if(!valid) {\n if(this.linkInput.classList.contains('error')) {\n this.linkInput.classList.remove('error');\n void this.linkInput.offsetLeft; // reflow\n }\n\n this.linkInput.classList.add('error');\n } else {\n this.applyLink(e);\n }\n }\n });\n\n this.linkInput.addEventListener('input', (e) => {\n const valid = this.isLinkValid();\n\n this.linkInput.classList.toggle('is-valid', valid);\n this.linkInput.classList.remove('error');\n });\n\n this.linkBackButton.addEventListener('mousedown', (e) => {\n // this.log('linkBackButton click');\n cancelEvent(e);\n this.container.classList.remove('is-link');\n // input.value = '';\n this.resetSelection();\n this.setTooltipPosition();\n this.cancelClosening();\n });\n\n this.linkApplyButton = ButtonIcon('check markup-tooltip-link-apply', {noRipple: true});\n this.linkApplyButton.addEventListener('mousedown', (e) => {\n // this.log('linkApplyButton click');\n this.applyLink(e);\n });\n\n const applyDiv = document.createElement('div');\n applyDiv.classList.add('markup-tooltip-link-apply-container');\n\n const delimiter1 = document.createElement('span');\n const delimiter2 = document.createElement('span');\n const delimiter3 = document.createElement('span');\n delimiter1.classList.add('markup-tooltip-delimiter');\n delimiter2.classList.add('markup-tooltip-delimiter');\n delimiter3.classList.add('markup-tooltip-delimiter');\n tools1.insertBefore(delimiter1, this.buttons.link);\n applyDiv.append(delimiter3, this.linkApplyButton);\n tools2.append(this.linkBackButton, delimiter2, this.linkInput, applyDiv);\n // tools1.insertBefore(delimiter2, this.buttons.link.nextSibling);\n\n this.wrapper.append(tools1, tools2);\n this.container.append(this.wrapper);\n document.body.append(this.container);\n\n window.addEventListener('resize', () => {\n this.hide();\n });\n }\n\n public showLinkEditor() {\n if(!this.container || !this.container.classList.contains('is-visible')) { // * if not inited yet (Ctrl+A + Ctrl+K)\n this.show();\n }\n\n const button = this.buttons.link;\n this.container.classList.add('is-link');\n\n const selection = document.getSelection();\n this.savedRange = selection.getRangeAt(0);\n\n if(button.classList.contains('active')) {\n const startContainer = this.savedRange.startContainer;\n const anchor = startContainer.parentElement as HTMLAnchorElement;\n this.linkInput.value = anchor.href;\n } else {\n this.linkInput.value = '';\n }\n\n this.setTooltipPosition(true);\n\n setTimeout(() => {\n this.linkInput.focus(); // !!! instant focus will break animation\n }, 200);\n this.linkInput.classList.toggle('is-valid', this.isLinkValid());\n }\n\n private applyLink(e: Event) {\n cancelEvent(e);\n this.resetSelection();\n let url = this.linkInput.value;\n if(url && !matchUrlProtocol(url)) {\n url = 'https://' + url;\n }\n this.appImManager.chat.input.applyMarkdown('link', url);\n setTimeout(() => {\n this.hide();\n }, 0);\n }\n\n private isLinkValid() {\n return !this.linkInput.value.length || !!matchUrl(this.linkInput.value);\n }\n\n private resetSelection(range: Range = this.savedRange) {\n const selection = window.getSelection();\n selection.removeAllRanges();\n selection.addRange(range);\n this.appImManager.chat.input.messageInput.focus();\n }\n\n public hide() {\n // return;\n\n if(this.init) return;\n\n this.container.classList.remove('is-visible');\n // document.removeEventListener('mouseup', this.onMouseUp);\n document.removeEventListener('mouseup', this.onMouseUpSingle);\n this.waitingForMouseUp = false;\n\n appNavigationController.removeByType('markup');\n\n if(this.hideTimeout) clearTimeout(this.hideTimeout);\n this.hideTimeout = window.setTimeout(() => {\n this.hideTimeout = undefined;\n this.container.classList.add('hide');\n this.container.classList.remove('is-link');\n }, 200);\n }\n\n public getActiveMarkupButton() {\n const currentMarkups: Set = new Set();\n\n // const nodes = getSelectedNodes();\n // const parents = [...new Set(nodes.map((node) => node.parentNode))];\n // // if(parents.length > 1 && parents) return [];\n\n // (parents as HTMLElement[]).forEach((node) => {\n // for(const type in markdownTags) {\n // const tag = markdownTags[type as MarkdownType];\n // const closest = node.closest(tag.match + ', [contenteditable=\"true\"]');\n // if(closest !== this.appImManager.chat.input.messageInput) {\n // currentMarkups.add(this.buttons[type as MarkdownType]);\n // }\n // }\n // });\n\n const types = Object.keys(this.buttons) as MarkdownType[];\n const markup = hasMarkupInSelection(types);\n types.forEach((type) => {\n if(markup[type]) {\n currentMarkups.add(this.buttons[type as MarkdownType]);\n }\n });\n\n return [...currentMarkups];\n }\n\n public setActiveMarkupButton() {\n const activeButtons = this.getActiveMarkupButton();\n\n for(const i in this.buttons) {\n // @ts-ignore\n const button = this.buttons[i];\n button.classList.toggle('active', activeButtons.includes(button));\n }\n }\n\n private setTooltipPosition(isLinkToggle = false) {\n const selection = document.getSelection();\n const range = selection.getRangeAt(0);\n\n const bodyRect = document.body.getBoundingClientRect();\n const selectionRect = range.getBoundingClientRect();\n const inputRect = this.appImManager.chat.input.rowsWrapper.getBoundingClientRect();\n\n this.container.style.maxWidth = inputRect.width + 'px';\n\n const visibleRect = getVisibleRect(undefined, this.appImManager.chat.input.messageInput, false, selectionRect);\n\n const selectionTop = visibleRect.rect.top/* selectionRect.top */ + (bodyRect.top * -1);\n\n const currentTools = this.container.classList.contains('is-link') ? this.wrapper.lastElementChild : this.wrapper.firstElementChild;\n\n const sizesRect = currentTools.getBoundingClientRect();\n const top = selectionTop - sizesRect.height - 8;\n\n const minX = inputRect.left;\n const maxX = (inputRect.left + inputRect.width) - Math.min(inputRect.width, sizesRect.width);\n let left: number;\n if(isLinkToggle) {\n const containerRect = this.container.getBoundingClientRect();\n left = clamp(containerRect.left, minX, maxX);\n } else {\n const x = selectionRect.left + (selectionRect.width - sizesRect.width) / 2;\n left = clamp(x, minX, maxX);\n }\n\n /* const isClamped = x !== minX && x !== maxX && (left === minX || left === maxX || this.container.getBoundingClientRect().left >= maxX);\n\n if(isLinkToggle && this.container.classList.contains('is-link') && !isClamped) return; */\n\n this.container.style.transform = `translate3d(${left}px, ${top}px, 0)`;\n }\n\n public show() {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n if(isSelectionEmpty()) {\n this.hide();\n return;\n }\n\n if(this.hideTimeout !== undefined) {\n clearTimeout(this.hideTimeout);\n }\n\n if(this.container.classList.contains('is-visible')) {\n return;\n }\n\n this.setActiveMarkupButton();\n\n this.container.classList.remove('is-link');\n const isFirstShow = this.container.classList.contains('hide');\n if(isFirstShow) {\n this.container.classList.remove('hide');\n this.container.classList.add('no-transition');\n }\n\n this.setTooltipPosition();\n\n if(isFirstShow) {\n void this.container.offsetLeft; // reflow\n this.container.classList.remove('no-transition');\n }\n\n this.container.classList.add('is-visible');\n\n if(!IS_MOBILE) {\n appNavigationController.pushItem({\n type: 'markup',\n onPop: () => {\n this.hide();\n }\n });\n }\n\n // this.log('selection', selectionRect, activeButton);\n }\n\n /* private onMouseUp = (e: Event) => {\n this.log('onMouseUp');\n if(findUpClassName(e.target, 'markup-tooltip')) return;\n\n this.hide();\n //document.removeEventListener('mouseup', this.onMouseUp);\n }; */\n\n private onMouseUpSingle = (e?: Event) => {\n // this.log('onMouseUpSingle');\n this.waitingForMouseUp = false;\n\n if(IS_TOUCH_SUPPORTED) {\n e && cancelEvent(e);\n if(this.mouseUpCounter++ === 0) {\n this.resetSelection(this.savedRange);\n } else {\n this.hide();\n return;\n }\n }\n\n this.show();\n\n /* !isTouchSupported && document.addEventListener('mouseup', this.onMouseUp); */\n };\n\n public setMouseUpEvent() {\n if(this.waitingForMouseUp) return;\n this.waitingForMouseUp = true;\n\n // this.log('setMouseUpEvent');\n\n document.addEventListener('mouseup', this.onMouseUpSingle, {once: true});\n }\n\n public cancelClosening() {\n if(IS_TOUCH_SUPPORTED && !IS_APPLE) {\n document.removeEventListener('mouseup', this.onMouseUpSingle);\n document.addEventListener('mouseup', (e) => {\n cancelEvent(e);\n this.mouseUpCounter = 1;\n this.waitingForMouseUp = false;\n this.setMouseUpEvent();\n }, {once: true});\n }\n }\n\n public handleSelection() {\n if(this.addedListener) return;\n this.addedListener = true;\n document.addEventListener('selectionchange', (e) => {\n // this.log('selectionchange');\n\n if(document.activeElement === this.linkInput) {\n return;\n }\n\n const messageInput = this.appImManager.chat.input.messageInput;\n if(document.activeElement !== messageInput) {\n this.hide();\n return;\n }\n\n const selection = document.getSelection();\n if(isSelectionEmpty(selection)) {\n this.hide();\n return;\n }\n\n if(IS_TOUCH_SUPPORTED) {\n if(IS_APPLE) {\n this.show();\n this.setTooltipPosition(); // * because can skip this in .show();\n } else {\n if(this.mouseUpCounter === 2) {\n this.mouseUpCounter = 0;\n return;\n }\n\n this.savedRange = selection.getRangeAt(0);\n this.setMouseUpEvent();\n /* document.addEventListener('touchend', (e) => {\n cancelEvent(e);\n this.resetSelection(range);\n this.show();\n }, {once: true, passive: false}); */\n }\n } else if(this.container && this.container.classList.contains('is-visible')) {\n this.setActiveMarkupButton();\n this.setTooltipPosition();\n } else if(messageInput.matches(':active')) {\n this.setMouseUpEvent();\n } else {\n this.show();\n }\n });\n\n document.addEventListener('beforeinput', (e) => {\n if(e.inputType === 'historyRedo' || e.inputType === 'historyUndo') {\n e.target.addEventListener('input', () => this.setActiveMarkupButton(), {once: true});\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 generatePathData from '../../helpers/generatePathData';\nimport {FormatterArguments, i18n, LangPackKey} from '../../lib/langPack';\n\nexport default class ChatDragAndDrop {\n container: HTMLDivElement;\n svg: SVGSVGElement;\n outlineWrapper: HTMLDivElement;\n path: SVGPathElement;\n\n constructor(appendTo: HTMLElement, private options: {\n icon?: string,\n header: LangPackKey,\n headerArgs?: FormatterArguments,\n subtitle?: LangPackKey,\n onDrop: (e: DragEvent) => void\n }) {\n this.container = document.createElement('div');\n this.container.classList.add('drop', 'z-depth-1');\n\n this.outlineWrapper = document.createElement('div');\n this.outlineWrapper.classList.add('drop-outline-wrapper');\n\n this.svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n this.svg.classList.add('drop-outline');\n\n this.path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n this.path.classList.add('drop-outline-path');\n\n let dropIcon: HTMLElement;\n if(options.icon) {\n dropIcon = document.createElement('div');\n dropIcon.classList.add('drop-icon', 'tgico-' + options.icon);\n }\n\n const dropHeader = document.createElement('div');\n dropHeader.classList.add('drop-header');\n dropHeader.append(i18n(options.header, options.headerArgs));\n\n let dropSubtitle: HTMLElement;\n if(options.subtitle) {\n dropSubtitle = document.createElement('div');\n dropSubtitle.classList.add('drop-subtitle');\n dropSubtitle.append(i18n(options.subtitle));\n }\n\n this.svg.append(this.path);\n this.outlineWrapper.append(this.svg);\n\n this.container.append(...[this.outlineWrapper, dropIcon, dropHeader, dropSubtitle].filter(Boolean));\n appendTo.append(this.container);\n\n this.container.addEventListener('dragover', this.onDragOver);\n this.container.addEventListener('dragleave', this.onDragLeave);\n this.container.addEventListener('drop', this.onDrop);\n }\n\n onDragOver = (e: DragEvent) => {\n this.container.classList.add('is-dragover');\n // SetTransition(this.container, 'is-dragover', true, 500);\n };\n\n onDragLeave = (e: DragEvent) => {\n this.container.classList.remove('is-dragover');\n // SetTransition(this.container, 'is-dragover', false, 500);\n };\n\n onDrop = (e: DragEvent) => {\n this.options.onDrop(e);\n };\n\n destroy() {\n delete this.options;\n this.container.remove();\n this.container.removeEventListener('dragover', this.onDragOver);\n this.container.removeEventListener('dragleave', this.onDragLeave);\n this.container.removeEventListener('drop', this.onDrop);\n }\n\n setPath() {\n const rect = this.outlineWrapper.getBoundingClientRect();\n this.svg.setAttributeNS(null, 'preserveAspectRatio', 'none');\n this.svg.setAttributeNS(null, 'viewBox', `0 0 ${rect.width} ${rect.height}`);\n this.svg.setAttributeNS(null, 'width', `${rect.width}`);\n this.svg.setAttributeNS(null, 'height', `${rect.height}`);\n\n const radius = 10;\n // const strokeWidth = 2;\n const sizeX = rect.width - radius;\n const sizeY = rect.height - radius;\n const pos = radius / 2;\n const d = generatePathData(pos, pos, sizeX, sizeY, radius, radius, radius, radius);\n this.path.setAttributeNS(null, 'd', d);\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 {doubleRaf} from '../schedulers';\n\nexport default function disableTransition(elements: HTMLElement[]) {\n elements.forEach((el) => el.classList.add('no-transition'));\n\n doubleRaf().then(() => {\n elements.forEach((el) => el.classList.remove('no-transition'));\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 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 noop from '../../helpers/noop';\nimport safeAssign from '../../helpers/object/safeAssign';\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/safeAssign';\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) 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 || !this.getColor) {\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 {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 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';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport toggleClassName from '../../helpers/toggleClassName';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport themeController from '../../helpers/themeController';\nimport groupCallsController from '../../lib/calls/groupCallsController';\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 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 const color: RLottieColor = 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 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() {\n super('popup-group-call', {\n body: true,\n withoutOverlay: true,\n closable: true,\n title: true\n });\n\n this.videosCount = 0;\n this.container.classList.add(className, 'night');\n\n const instance = this.instance = groupCallsController.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 managers: this.managers\n });\n this.groupCallParticipants = new GroupCallParticipantsElement({\n appendTo: this.body,\n instance,\n listenerSetter,\n managers: this.managers\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 toggleDisability = toggleClassName.bind(null, 'btn-disabled');\n\n private onVideoClick = () => {\n const toggle = this.toggleDisability([this.btnVideo], true);\n this.instance.toggleVideoSharing().finally(() => {\n toggle();\n });\n };\n\n private onScreenClick = () => {\n const toggle = this.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 = async() => {\n const hangUp = (discard: boolean) => {\n this.instance.hangUp(discard);\n };\n\n if(await this.managers.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.checkAnimations2(isFull);\n\n themeController.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 {GROUP_CALL_PARTICIPANT_MUTED_STATE} from '.';\nimport {GroupCallParticipantVideoType} from './participantVideo';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\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, 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 appDialogsManager, {DialogDom, AppDialogsManager, DialogElementSize} from '../../lib/appManagers/appDialogsManager';\nimport {getGroupCallParticipantMutedState} from '.';\nimport GroupCallParticipantMutedIcon from './participantMutedIcon';\nimport GroupCallParticipantStatusElement from './participantStatus';\nimport type GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport type LazyLoadQueue from '../lazyLoadQueue';\n\ninterface SortedParticipant extends SortedElementBase {\n dom: DialogDom,\n mutedIcon: GroupCallParticipantMutedIcon,\n status: GroupCallParticipantStatusElement\n}\n\nexport default class GroupCallParticipantsList extends SortedList {\n public list: HTMLUListElement;\n\n protected lazyLoadQueue: LazyLoadQueue;\n protected avatarSize: DialogElementSize = 'abitbigger';\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: async(element) => (await this.instance.getParticipantByPeerId(element.id)).date,\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onElementDestroy(element);\n },\n onUpdate: async(element) => {\n const participant = await this.instance.getParticipantByPeerId(element.id);\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 peerId: base.id,\n container: false,\n avatarSize: this.avatarSize,\n autonomous: this.autonomous,\n meAsSaved: false,\n rippleEnabled: this.rippleEnabled,\n wrapOptions: {\n lazyLoadQueue: this.lazyLoadQueue\n }\n });\n\n const className = 'group-call-participant';\n dom.listEl.classList.add(className);\n\n const mutedIcon = new GroupCallParticipantMutedIcon(true);\n const status = new GroupCallParticipantStatusElement(['presentation', 'video']);\n replaceContent(dom.lastMessageSpan, status.container);\n dom.listEl.append(mutedIcon.container);\n (base as SortedParticipant).mutedIcon = mutedIcon;\n (base as SortedParticipant).status = status;\n\n /* instance.getParticipantByPeerId(base.id).then((participant) => {\n const mutedState = getGroupCallParticipantMutedState(participant);\n\n mutedIcon.setState(mutedState);\n status.setState(mutedState, participant);\n }); */\n\n (base as SortedParticipant).dom = dom;\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 {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', {alpha: false});\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","/*\n * 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 {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';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport {AppManagers} from '../../lib/appManagers/managers';\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 managers: AppManagers, 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: 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 {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/safeAssign';\nimport {GroupCallParticipant} from '../../layer';\nimport {GroupCallOutputSource} from '../../lib/appManagers/appGroupCallsManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\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 participantsElements: Map>;\n private displayPinned: boolean;\n private containers: Map;\n private onLengthChange: (length: number) => void;\n private managers: AppManagers;\n\n constructor(options: {\n appendTo: HTMLElement,\n instance: GroupCallInstance,\n listenerSetter: ListenerSetter,\n displayPinned: boolean,\n onLengthChange?: GroupCallParticipantsVideoElement['onLengthChange'],\n managers: AppManagers\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 = 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.managers, 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 async setInstance(instance: GroupCallInstance) {\n (await 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 filterAsync from '../../helpers/array/filterAsync';\nimport contextMenuController from '../../helpers/contextMenuController';\nimport {attachContextMenuListener} from '../../helpers/dom/attachContextMenuListener';\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/safeAssign';\nimport positionMenu from '../../helpers/positionMenu';\nimport ScrollableLoader from '../../helpers/scrollableLoader';\nimport {GroupCallParticipant} from '../../layer';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport rootScope from '../../lib/rootScope';\nimport {ButtonMenuItemOptions, ButtonMenuSync} from '../buttonMenu';\nimport confirmationPopup from '../confirmationPopup';\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 | Promise})[];\n private element: HTMLElement;\n private chatId: ChatId;\n private targetPeerId: PeerId;\n private participant: GroupCallParticipant;\n private instance: GroupCallInstance;\n private canManageCall: boolean;\n private managers: AppManagers;\n\n constructor(options: {\n listenerSetter: ListenerSetter,\n onContextElement: HTMLElement,\n managers: AppManagers,\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.managers.appChatsManager.hasRights(this.chatId, 'ban_users'),\n onClick: async() => {\n confirmationPopup({\n peerId: this.targetPeerId,\n title: new PeerTitle({peerId: this.targetPeerId}).element,\n descriptionLangKey: await this.managers.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.managers.appChatsManager.kickFromChat(this.chatId, this.targetPeerId);\n }, noop);\n }\n }];\n\n const {listenerSetter} = options;\n this.managers = options.managers;\n this.instance = options.instance;\n this.chatId = this.instance.chatId;\n\n this.element = ButtonMenuSync({buttons: this.buttons, listenerSetter});\n this.element.classList.add('group-call-participant-menu', 'night');\n\n attachContextMenuListener({\n element: options.onContextElement,\n callback: async(e) => {\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 cancelEvent(e);\n\n const peerId = this.targetPeerId = li.dataset.peerId.toPeerId();\n this.participant = await this.instance.getParticipantByPeerId(peerId);\n if(this.participant.pFlags.self) {\n return;\n }\n\n this.canManageCall = await this.managers.appChatsManager.hasRights(this.chatId, 'manage_call');\n\n await filterAsync(this.buttons, async(button) => {\n const good = await button.verify(peerId);\n button.element.classList.toggle('hide', !good);\n return good;\n });\n\n positionMenu((e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent, this.element, 'right');\n contextMenuController.openBtnMenu(this.element);\n },\n listenerSetter\n });\n\n listenerSetter.add(rootScope)('group_call_participant', ({groupCallId, participant}) => {\n if(this.instance.id === groupCallId) {\n const peerId = getPeerId(participant.peer);\n if(this.targetPeerId === peerId) {\n contextMenuController.close();\n }\n }\n });\n\n let appendTo: HTMLElement = document.body;\n addFullScreenListener(document.body, () => {\n const isFull = isFullScreen();\n appendTo = isFull ? PopupElement.getPopups(PopupGroupCall)[0].getContainer(): document.body;\n\n if(!isFull) {\n contextMenuController.close();\n }\n }, listenerSetter);\n }\n\n private onOpenProfileClick = () => {\n const popup = PopupElement.getPopups(PopupGroupCall)[0];\n if(popup) {\n popup.hide();\n }\n\n appImManager.setInnerPeer({peerId: this.targetPeerId});\n };\n\n private toggleParticipantMuted = (muted: boolean) => {\n this.instance.editParticipant(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 listenerSetter: ListenerSetter;\n private groupCallParticipantsVideo: GroupCallParticipantsVideoElement;\n private contextMenu: GroupCallParticipantContextMenu;\n private managers: AppManagers;\n\n constructor(options: {\n appendTo: HTMLElement,\n instance: GroupCallInstance,\n listenerSetter: ListenerSetter,\n managers: AppManagers\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.managers.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 = 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 async 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 const participants = await instance.participants;\n 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 wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\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, wrapEmojiText(groupCall.title));\n } else {\n if(peerTitle.options.peerId !== peerId) {\n peerTitle.options.peerId = peerId;\n peerTitle.update();\n }\n\n if(peerTitle.element.parentElement !== appendTo) {\n appendTo.append(peerTitle.element);\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 {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 EventListenerBase from '../helpers/eventListenerBase';\nimport mediaSizes from '../helpers/mediaSizes';\nimport clamp from '../helpers/number/clamp';\nimport safeAssign from '../helpers/object/safeAssign';\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: SwipeHandler['verifyTouchTarget'];\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 // 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/safeAssign';\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\nexport default function toggleClassName(className: string, elements: HTMLElement[], disable: boolean) {\n elements.forEach((element) => {\n element.classList.toggle(className, disable);\n });\n\n return () => toggleClassName(className, elements, !disable);\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 toHHMMSS from '../../helpers/string/toHHMMSS';\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 = toHHMMSS(instance.duration, 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 this.container.classList.toggle('has-duration', connectionState === CALL_STATE.CONNECTED);\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 IS_SCREEN_SHARING_SUPPORTED from '../../environment/screenSharingSupport';\nimport {IS_MOBILE} from '../../environment/userAgent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport ControlsHover from '../../helpers/dom/controlsHover';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport {addFullScreenListener, cancelFullScreen, isFullScreen, requestFullScreen} from '../../helpers/dom/fullScreen';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport MovablePanel from '../../helpers/movablePanel';\nimport onMediaLoad from '../../helpers/onMediaLoad';\nimport themeController from '../../helpers/themeController';\nimport toggleClassName from '../../helpers/toggleClassName';\nimport CallInstance from '../../lib/calls/callInstance';\nimport CALL_STATE from '../../lib/calls/callState';\nimport I18n, {i18n} from '../../lib/langPack';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport animationIntersector from '../animationIntersector';\nimport AvatarElement from '../avatar';\nimport ButtonIcon from '../buttonIcon';\nimport GroupCallMicrophoneIconMini from '../groupCall/microphoneIconMini';\nimport {MovableState} from '../movableElement';\nimport PeerTitle from '../peerTitle';\nimport PopupElement from '../popups';\nimport SetTransition from '../singleTransition';\nimport makeButton from './button';\nimport CallDescriptionElement from './description';\nimport callVideoCanvasBlur from './videoCanvasBlur';\n\nconst className = 'call';\n\nconst MIN_WIDTH = 400;\nconst MIN_HEIGHT = 580;\n\nconst INIT_STATE: MovableState = {\n width: MIN_WIDTH,\n height: MIN_HEIGHT\n};\n\nlet previousState: MovableState = {...INIT_STATE};\n\nexport default class PopupCall extends PopupElement {\n private peerId: PeerId;\n\n private description: CallDescriptionElement;\n private emojisSubtitle: HTMLElement;\n\n private partyStates: HTMLElement;\n private partyMutedState: HTMLElement;\n\n private firstButtonsRow: HTMLElement;\n private secondButtonsRow: HTMLElement;\n\n private declineI18nElement: I18n.IntlElement;\n\n private makeButton: (options: Parameters[2]) => HTMLElement;\n private btnAccept: HTMLElement;\n private btnDecline: HTMLElement;\n private btnVideo: HTMLElement;\n private btnScreen: HTMLElement;\n private btnMute: HTMLElement;\n private btnFullScreen: HTMLButtonElement;\n private btnExitFullScreen: HTMLButtonElement;\n\n private movablePanel: MovablePanel;\n private microphoneIcon: GroupCallMicrophoneIconMini;\n private muteI18nElement: I18n.IntlElement;\n\n private videoContainers: {\n input?: HTMLElement,\n output?: HTMLElement\n };\n\n private controlsHover: ControlsHover;\n\n constructor(private instance: CallInstance) {\n super('popup-call', {\n withoutOverlay: true,\n closable: true\n });\n\n this.videoContainers = {};\n\n const {container, listenerSetter} = this;\n container.classList.add(className, 'night');\n\n const avatarContainer = document.createElement('div');\n avatarContainer.classList.add(className + '-avatar');\n\n const peerId = this.peerId = this.instance.interlocutorUserId.toPeerId();\n const avatar = new AvatarElement();\n avatar.classList.add('avatar-full');\n avatar.updateWithOptions({\n isBig: true,\n peerId: peerId\n });\n avatarContainer.append(avatar);\n\n const title = new PeerTitle({\n peerId\n }).element;\n\n title.classList.add(className + '-title');\n\n const subtitle = document.createElement('div');\n subtitle.classList.add(className + '-subtitle');\n\n const description = this.description = new CallDescriptionElement(subtitle);\n\n const emojisSubtitle = this.emojisSubtitle = document.createElement('div');\n emojisSubtitle.classList.add(className + '-emojis');\n\n container.append(avatarContainer, title, subtitle);\n\n if(!IS_MOBILE) {\n this.btnFullScreen = ButtonIcon('fullscreen');\n this.btnExitFullScreen = ButtonIcon('smallscreen hide');\n attachClickEvent(this.btnFullScreen, this.onFullScreenClick, {listenerSetter});\n attachClickEvent(this.btnExitFullScreen, () => cancelFullScreen(), {listenerSetter});\n addFullScreenListener(this.container, this.onFullScreenChange, listenerSetter);\n this.header.prepend(this.btnExitFullScreen);\n this.header.append(this.btnFullScreen);\n\n container.append(emojisSubtitle);\n } else {\n this.header.append(emojisSubtitle);\n }\n\n this.partyStates = document.createElement('div');\n this.partyStates.classList.add(className + '-party-states');\n\n this.partyMutedState = document.createElement('div');\n this.partyMutedState.classList.add(className + '-party-state');\n const stateText = i18n('VoipUserMicrophoneIsOff', [new PeerTitle({peerId, onlyFirstName: true, limitSymbols: 18}).element]);\n stateText.classList.add(className + '-party-state-text');\n const mutedIcon = new GroupCallMicrophoneIconMini(false, true);\n mutedIcon.setState(false, false);\n this.partyMutedState.append(\n mutedIcon.container,\n stateText\n );\n\n this.partyStates.append(this.partyMutedState);\n this.container.append(this.partyStates);\n\n this.makeButton = makeButton.bind(null, className, this.listenerSetter);\n this.constructFirstButtons();\n this.constructSecondButtons();\n\n listenerSetter.add(instance)('state', () => {\n this.updateInstance();\n });\n\n listenerSetter.add(instance)('mediaState', () => {\n this.updateInstance();\n });\n\n this.movablePanel = new MovablePanel({\n listenerSetter,\n movableOptions: {\n minWidth: MIN_WIDTH,\n minHeight: MIN_HEIGHT,\n element: this.element,\n verifyTouchTarget: (e) => {\n const target = e.target;\n if(findUpClassName(target, 'call-button') ||\n findUpClassName(target, 'btn-icon') ||\n isFullScreen()) {\n return false;\n }\n\n return true;\n }\n },\n // onResize: () => this.toggleBigLayout(),\n previousState: !this.instance.wasTryingToJoin && !this.instance.isOutgoing ? {...INIT_STATE} : previousState\n });\n\n const movableElement = this.movablePanel.movable;\n if(movableElement) {\n this.listenerSetter.add(movableElement)('resize', () => {\n this.resizeVideoContainers();\n });\n }\n\n const controlsHover = this.controlsHover = new ControlsHover();\n controlsHover.setup({\n element: this.container,\n listenerSetter: this.listenerSetter,\n showOnLeaveToClassName: 'call-buttons'\n });\n controlsHover.showControls(false);\n\n this.addEventListener('close', () => {\n const {movablePanel} = this;\n previousState = movablePanel.state;\n\n this.microphoneIcon.destroy();\n\n movablePanel.destroy();\n });\n\n this.updateInstance();\n }\n\n public getCallInstance() {\n return this.instance;\n }\n\n private constructFirstButtons() {\n const buttons = this.firstButtonsRow = document.createElement('div');\n buttons.classList.add(className + '-buttons', 'is-first');\n\n const toggleDisability = toggleClassName.bind(null, 'btn-disabled');\n\n const btnVideo = this.btnVideo = this.makeButton({\n text: 'Call.Camera',\n icon: 'videocamera_filled',\n callback: () => {\n const toggle = toggleDisability([btnVideo, btnScreen], true);\n this.instance.toggleVideoSharing().finally(toggle);\n }\n });\n\n const btnScreen = this.btnScreen = this.makeButton({\n text: 'Call.Screen',\n icon: 'sharescreen_filled',\n callback: () => {\n const toggle = toggleDisability([btnVideo, btnScreen], true);\n this.instance.toggleScreenSharing().finally(toggle);\n }\n });\n\n if(!IS_SCREEN_SHARING_SUPPORTED) {\n btnScreen.classList.add('hide');\n this.container.classList.add('no-screen');\n }\n\n this.muteI18nElement = new I18n.IntlElement({\n key: 'Call.Mute'\n });\n const btnMute = this.btnMute = this.makeButton({\n text: this.muteI18nElement.element,\n callback: () => {\n this.instance.toggleMuted();\n }\n });\n\n const microphoneIcon = this.microphoneIcon = new GroupCallMicrophoneIconMini(true, true);\n btnMute.firstElementChild.append(microphoneIcon.container);\n\n // btnVideo.classList.add('disabled');\n // btnScreen.classList.add('disabled');\n\n buttons.append(btnVideo, btnScreen, btnMute);\n this.container.append(buttons);\n }\n\n private constructSecondButtons() {\n const buttons = this.secondButtonsRow = document.createElement('div');\n buttons.classList.add(className + '-buttons', 'is-second');\n\n this.declineI18nElement = new I18n.IntlElement({\n key: 'Call.Decline'\n });\n const btnDecline = this.btnDecline = this.makeButton({\n text: this.declineI18nElement.element,\n icon: 'endcall_filled',\n callback: () => {\n this.instance.hangUp('phoneCallDiscardReasonHangup');\n },\n isDanger: true\n });\n\n const btnAccept = this.btnAccept = this.makeButton({\n text: 'Call.Accept',\n icon: 'phone_filled',\n callback: () => {\n this.instance.acceptCall();\n },\n isConfirm: true\n });\n\n buttons.append(btnDecline, btnAccept);\n this.container.append(buttons);\n }\n\n private onFullScreenClick = () => {\n requestFullScreen(this.container);\n };\n\n private onFullScreenChange = () => {\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 themeController.setThemeColor(isFull ? '#000000' : undefined);\n\n this.resizeVideoContainers();\n }\n };\n\n private createVideoContainer(video: HTMLVideoElement) {\n const _className = className + '-video';\n const container = document.createElement('div');\n container.classList.add(_className + '-container');\n\n video.classList.add(_className);\n if(video.paused) {\n video.play();\n }\n\n attachClickEvent(container, () => {\n if(!container.classList.contains('small')) {\n return;\n }\n\n const big = Object.values(this.videoContainers).find((container) => !container.classList.contains('small'));\n big.classList.add('small');\n big.style.cssText = container.style.cssText;\n container.classList.remove('small');\n container.style.cssText = '';\n\n this.resizeVideoContainers();\n });\n\n const canvas = callVideoCanvasBlur(video);\n canvas.classList.add(_className + '-blur');\n\n container.append(canvas, video);\n\n return container;\n }\n\n private updateInstance() {\n const {instance} = this;\n const {connectionState} = instance;\n if(connectionState === CALL_STATE.CLOSED) {\n if(this.container.classList.contains('is-full-screen')) {\n cancelFullScreen();\n }\n\n this.btnVideo.classList.add('disabled');\n\n this.hide();\n return;\n }\n\n const isPendingIncoming = !instance.isOutgoing && connectionState === CALL_STATE.PENDING;\n this.declineI18nElement.compareAndUpdate({\n key: connectionState === CALL_STATE.PENDING ? 'Call.Decline' : 'Call.End'\n });\n this.btnAccept.classList.toggle('disable', !isPendingIncoming);\n this.btnAccept.classList.toggle('hide-me', !isPendingIncoming);\n this.container.classList.toggle('two-button-rows', isPendingIncoming);\n\n const isMuted = instance.isMuted;\n const onFrame = () => {\n this.btnMute.firstElementChild.classList.toggle('active', isMuted);\n };\n\n const player = this.microphoneIcon.getItem().player;\n this.microphoneIcon.setState(!isMuted, !isMuted, onFrame);\n if(!player) {\n onFrame();\n }\n\n this.muteI18nElement.compareAndUpdate({\n key: isMuted ? 'VoipUnmute' : 'Call.Mute'\n });\n\n const isSharingVideo = instance.isSharingVideo;\n this.btnVideo.firstElementChild.classList.toggle('active', isSharingVideo);\n\n const isSharingScreen = instance.isSharingScreen;\n this.btnScreen.firstElementChild.classList.toggle('active', isSharingScreen);\n\n const outputState = instance.getMediaState('output');\n\n SetTransition({\n element: this.partyMutedState,\n className: 'is-visible',\n forwards: !!outputState?.muted,\n duration: 300\n });\n\n const containers = this.videoContainers;\n const oldContainers = {...containers};\n ['input' as const, 'output' as const].forEach((type) => {\n const mediaState = instance.getMediaState(type);\n const video = instance.getVideoElement(type) as HTMLVideoElement;\n\n const hasFrame = !!(video && video.videoWidth && video.videoHeight);\n if(video && !hasFrame && !video.dataset.hasPromise) {\n video.dataset.hasPromise = '1';\n // container.classList.add('hide');\n onMediaLoad(video).then(() => {\n delete video.dataset.hasPromise;\n this.updateInstance();\n // this.resizeVideoContainers();\n // container.classList.remove('hide');\n });\n }\n\n const isActive = !!video && hasFrame && !!(mediaState && (mediaState.videoState === 'active' || mediaState.screencastState === 'active'));\n let videoContainer = containers[type];\n\n if(isActive && video && !videoContainer) {\n videoContainer = containers[type] = this.createVideoContainer(video);\n this.container.append(videoContainer);\n }\n\n if(!isActive && videoContainer) {\n videoContainer.remove();\n delete containers[type];\n }\n });\n\n {\n const input = containers.input;\n const output = containers.output;\n if(Object.keys(oldContainers).length !== Object.keys(containers).length && input) {\n input.classList.toggle('small', !!output);\n }\n\n if(output && !input) {\n output.classList.remove('small');\n }\n }\n\n this.resizeVideoContainers();\n\n this.container.classList.toggle('no-video', !Object.keys(containers).length);\n\n if(!this.emojisSubtitle.textContent && connectionState < CALL_STATE.EXCHANGING_KEYS) {\n Promise.resolve(instance.getEmojisFingerprint()).then((emojis) => {\n replaceContent(this.emojisSubtitle, wrapEmojiText(emojis.join('')));\n });\n }\n\n this.setDescription();\n }\n\n private resizeVideoContainers() {\n Object.values(this.videoContainers).forEach((container) => {\n const isSmall = container.classList.contains('small');\n if(isSmall) {\n const video = container.querySelector('video');\n const popupWidth = this.movablePanel.state;\n const MAX_WIDTH_PX = 240;\n const MAX_HEIGHT_PX = 240;\n\n const isVertical = video.videoHeight > video.videoWidth;\n const MAX_SIZE = isVertical ? MAX_HEIGHT_PX : MAX_WIDTH_PX;\n\n const biggestSideSize = 1 / 3 * (isFullScreen() ? 0xFFFF : (isVertical ? popupWidth.height : popupWidth.width));\n const widthRatio = isVertical ? video.videoWidth / video.videoHeight : 1;\n const heightRatio = isVertical ? 1 : video.videoHeight / video.videoWidth;\n container.style.width = biggestSideSize * widthRatio + 'px';\n container.style.height = biggestSideSize * heightRatio + 'px';\n container.style.maxWidth = MAX_SIZE * widthRatio + 'px';\n container.style.maxHeight = MAX_SIZE * heightRatio + 'px';\n } else {\n container.style.cssText = '';\n }\n });\n }\n\n private setDescription() {\n this.description.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 cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport ListenerSetter from '../helpers/listenerSetter';\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 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';\nimport PopupCall from './call';\nimport GroupCallMicrophoneIconMini from './groupCall/microphoneIconMini';\nimport CallInstance from '../lib/calls/callInstance';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport groupCallsController from '../lib/calls/groupCallsController';\nimport StreamManager from '../lib/calls/streamManager';\nimport callsController from '../lib/calls/callsController';\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 managers: AppManagers\n ) {\n const listenerSetter = this.listenerSetter = new ListenerSetter();\n\n listenerSetter.add(callsController)('instance', ({instance}) => {\n if(!this.instance) {\n this.updateInstance(instance);\n }\n });\n\n listenerSetter.add(callsController)('accepting', (instance) => {\n if(this.instance !== instance) {\n this.updateInstance(instance);\n }\n });\n\n listenerSetter.add(groupCallsController)('instance', (instance) => {\n this.updateInstance(instance);\n });\n\n listenerSetter.add(rootScope)('group_call_update', (groupCall) => {\n const instance = groupCallsController.groupCall;\n if(instance?.id === groupCall.id) {\n this.updateInstance(instance);\n }\n });\n\n listenerSetter.add(StreamManager.ANALYSER_LISTENER)('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 const isChangingInstance = this.instance !== instance;\n if(isChangingInstance) {\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 this.container.classList.toggle('is-call', !(instance instanceof GroupCallInstance));\n }\n\n const isMuted = this.instance.isMuted;\n const 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') || isChangingInstance) || isClosed) {\n if(isClosed) {\n weave.setAmplitude(0);\n }\n\n SetTransition({\n element: document.body,\n className: 'is-calling',\n forwards: !isClosed,\n duration: 250,\n onTransitionEnd: isClosed ? () => {\n weave.componentWillUnmount();\n\n this.clearCurrentInstance();\n } : undefined\n });\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.getPopups(PopupGroupCall).length) {\n return;\n }\n\n new PopupGroupCall().show();\n } else if(this.instance instanceof CallInstance) {\n const popups = PopupElement.getPopups(PopupCall);\n if(popups.find((popup) => popup.getCallInstance() === this.instance)) {\n return;\n }\n\n new PopupCall(this.instance).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\nimport type {PushNotificationObject} from '../serviceWorker/push';\nimport getPeerTitle from '../../components/wrappers/getPeerTitle';\nimport wrapMessageForReply from '../../components/wrappers/messageForReply';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {FontFamily} from '../../config/font';\nimport {NOTIFICATION_BADGE_PATH, NOTIFICATION_ICON_PATH} from '../../config/notifications';\nimport {IS_MOBILE} from '../../environment/userAgent';\nimport IS_VIBRATE_SUPPORTED from '../../environment/vibrateSupport';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport drawCircle from '../../helpers/canvas/drawCircle';\nimport customProperties from '../../helpers/dom/customProperties';\nimport idleController from '../../helpers/idleController';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport tsNow from '../../helpers/tsNow';\nimport {Message, MessagePeerReaction, PeerNotifySettings} from '../../layer';\nimport I18n, {FormatterArguments, LangPackKey} from '../langPack';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport singleInstance from '../mtproto/singleInstance';\nimport webPushApiManager, {PushSubscriptionNotify} from '../mtproto/webPushApiManager';\nimport fixEmoji from '../richTextProcessor/fixEmoji';\nimport getAbbreviation from '../richTextProcessor/getAbbreviation';\nimport wrapPlainText from '../richTextProcessor/wrapPlainText';\nimport rootScope from '../rootScope';\nimport appImManager from './appImManager';\nimport appRuntimeManager from './appRuntimeManager';\nimport {AppManagers} from './managers';\nimport generateMessageId from './utils/messageId/generateMessageId';\nimport getMessageThreadId from './utils/messages/getMessageThreadId';\nimport getPeerColorById from './utils/peers/getPeerColorById';\nimport getPeerId from './utils/peers/getPeerId';\nimport {logger} from '../logger';\n\ntype MyNotification = Notification & {\n hidden?: boolean,\n show?: () => void,\n};\n\nexport type NotifyOptions = Partial<{\n tag: string;\n image: string;\n key: string;\n title: string;\n message: string;\n silent: boolean;\n onclick: () => void;\n noIncrement: boolean;\n}>;\n\nexport type NotificationSettings = {\n nodesktop: boolean,\n volume: number,\n novibrate: boolean,\n nopreview: boolean,\n nopush: boolean,\n nosound: boolean\n};\n\nexport class UiNotificationsManager {\n private notificationsUiSupport: boolean;\n private notificationsShown: {[key: string]: MyNotification | true} = {};\n private notificationIndex = 0;\n private notificationsCount = 0;\n private soundsPlayed: {[tag: string]: number} = {};\n private vibrateSupport = IS_VIBRATE_SUPPORTED;\n private nextSoundAt: number;\n private prevSoundVolume: number;\n\n private faviconElements = Array.from(document.head.querySelectorAll('link[rel=\"icon\"], link[rel=\"alternate icon\"]'));\n\n private titleBackup = document.title;\n private titleChanged = false;\n private titleInterval: number;\n private prevFavicon: string;\n\n private notifySoundEl: HTMLElement;\n\n private stopped = false;\n\n private topMessagesDeferred: CancellablePromise;\n\n private settings: NotificationSettings = {} as any;\n\n private registeredDevice: any;\n private pushInited = false;\n\n private managers: AppManagers;\n private setAppBadge: (contents?: any) => Promise;\n\n private avatarCanvas: HTMLCanvasElement;\n private avatarContext: CanvasRenderingContext2D;\n private avatarGradients: {[color: string]: CanvasGradient};\n\n private log: ReturnType;\n\n construct(managers: AppManagers) {\n this.managers = managers;\n\n this.log = logger('NOTIFICATIONS');\n\n navigator.vibrate = navigator.vibrate || (navigator as any).mozVibrate || (navigator as any).webkitVibrate;\n this.setAppBadge = (navigator as any).setAppBadge && (navigator as any).setAppBadge.bind(navigator);\n this.setAppBadge && this.setAppBadge(0);\n\n this.notificationsUiSupport = ('Notification' in window) || ('mozNotification' in navigator);\n\n this.notifySoundEl = document.createElement('div');\n this.notifySoundEl.id = 'notify-sound';\n document.body.append(this.notifySoundEl);\n\n this.topMessagesDeferred = deferredPromise();\n\n singleInstance.addEventListener('deactivated', () => {\n this.stop();\n });\n\n singleInstance.addEventListener('activated', () => {\n if(this.stopped) {\n this.start();\n }\n });\n\n idleController.addEventListener('change', (idle) => {\n if(this.stopped) {\n return;\n }\n\n if(!idle) {\n this.clear();\n }\n\n this.toggleToggler();\n });\n\n rootScope.addEventListener('notification_reset', (peerString) => {\n this.soundReset(peerString);\n });\n\n rootScope.addEventListener('notification_cancel', (str) => {\n this.cancel(str);\n });\n\n if(this.setAppBadge) {\n rootScope.addEventListener('folder_unread', (folder) => {\n if(folder.id === 0) {\n this.setAppBadge(folder.unreadUnmutedPeerIds.size);\n }\n });\n }\n\n webPushApiManager.addEventListener('push_init', (tokenData) => {\n this.pushInited = true;\n if(!this.settings.nodesktop && !this.settings.nopush) {\n if(tokenData) {\n this.registerDevice(tokenData);\n } else {\n webPushApiManager.subscribe();\n }\n } else {\n this.unregisterDevice(tokenData);\n }\n });\n webPushApiManager.addEventListener('push_subscribe', (tokenData) => {\n this.registerDevice(tokenData);\n });\n webPushApiManager.addEventListener('push_unsubscribe', (tokenData) => {\n this.unregisterDevice(tokenData);\n });\n\n rootScope.addEventListener('dialogs_multiupdate', () => {\n // unregisterTopMsgs()\n this.topMessagesDeferred.resolve();\n }, {once: true});\n\n webPushApiManager.addEventListener('push_notification_click', (notificationData) => {\n if(notificationData.action === 'push_settings') {\n /* this.topMessagesDeferred.then(() => {\n $modal.open({\n templateUrl: templateUrl('settings_modal'),\n controller: 'SettingsModalController',\n windowClass: 'settings_modal_window mobile_modal',\n backdrop: 'single'\n })\n }); */\n return;\n }\n\n if(notificationData.action === 'mute1d') {\n this.managers.apiManager.invokeApi('account.updateDeviceLocked', {\n period: 86400\n }).then(() => {\n // var toastData = toaster.pop({\n // type: 'info',\n // body: _('push_action_mute1d_success'),\n // bodyOutputType: 'trustedHtml',\n // clickHandler: () => {\n // toaster.clear(toastData)\n // },\n // showCloseButton: false\n // })\n });\n\n return;\n }\n\n const peerId = notificationData.custom && notificationData.custom.peerId.toPeerId();\n console.log('click', notificationData, peerId);\n if(peerId) {\n this.topMessagesDeferred.then(async() => {\n const chatId = peerId.isAnyChat() ? peerId.toChatId() : undefined;\n if(chatId && !(await this.managers.appChatsManager.hasChat(chatId))) {\n return;\n }\n\n if(peerId.isUser() && !(await this.managers.appUsersManager.hasUser(peerId.toUserId()))) {\n return;\n }\n\n appImManager.setInnerPeer({\n peerId,\n lastMsgId: generateMessageId(+notificationData.custom.msg_id)\n });\n });\n }\n });\n }\n\n public async buildNotification({\n message,\n fwdCount,\n peerReaction,\n peerTypeNotifySettings\n }: {\n message: Message.message | Message.messageService,\n fwdCount?: number,\n peerReaction?: MessagePeerReaction,\n peerTypeNotifySettings?: PeerNotifySettings\n }) {\n const peerId = message.peerId;\n const isAnyChat = peerId.isAnyChat();\n const notification: NotifyOptions = {};\n const [peerString, isForum = false] = await Promise.all([\n this.managers.appPeersManager.getPeerString(peerId),\n isAnyChat && this.managers.appPeersManager.isForum(peerId)\n ]);\n let notificationMessage: string;\n let wrappedMessage = false;\n\n if(peerTypeNotifySettings.show_previews) {\n if(message._ === 'message' && message.fwd_from && fwdCount > 1) {\n notificationMessage = I18n.format('Notifications.Forwarded', true, [fwdCount]);\n } else {\n notificationMessage = await wrapMessageForReply({message, plain: true});\n\n const reaction = peerReaction?.reaction;\n if(reaction?._ === 'reactionEmoji') {\n const langPackKey: LangPackKey = /* isAnyChat ? 'Notification.Group.Reacted' : */'Notification.Contact.Reacted';\n const args: FormatterArguments = [\n fixEmoji(reaction.emoticon), // can be plain heart\n notificationMessage\n ];\n\n /* if(isAnyChat) {\n args.unshift(appPeersManager.getPeerTitle(message.fromId, true));\n } */\n\n notificationMessage = I18n.format(langPackKey, true, args);\n } else {\n wrappedMessage = true;\n }\n }\n } else {\n notificationMessage = I18n.format('Notifications.New', true);\n }\n\n if(peerReaction) {\n notification.noIncrement = true;\n notification.silent = true;\n }\n\n const peerTitleOptions/* : Partial[0]> */ = {\n plainText: true as const,\n managers: this.managers\n };\n\n const threadId = isForum ? getMessageThreadId(message, isForum) : undefined;\n const notificationFromPeerId = peerReaction ? getPeerId(peerReaction.peer_id) : message.fromId;\n const peerTitle = notification.title = await getPeerTitle({...peerTitleOptions, peerId, threadId: threadId});\n if(isForum) {\n const peerTitle = await getPeerTitle({...peerTitleOptions, peerId});\n notification.title += ` (${peerTitle})`;\n\n if(wrappedMessage && notificationFromPeerId !== message.peerId) {\n notificationMessage = await getPeerTitle({...peerTitleOptions, peerId: notificationFromPeerId}) +\n ': ' + notificationMessage;\n }\n } else if(isAnyChat && notificationFromPeerId !== message.peerId) {\n notification.title = await getPeerTitle({...peerTitleOptions, peerId: notificationFromPeerId}) +\n ' @ ' +\n notification.title;\n }\n\n notification.title = wrapPlainText(notification.title);\n\n notification.onclick = () => {\n appImManager.setInnerPeer({peerId, lastMsgId: message.mid, threadId});\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 = await this.managers.appPeersManager.getPeerPhoto(peerId);\n if(peerPhoto) {\n const url = await this.managers.appAvatarsManager.loadAvatar(peerId, peerPhoto, 'photo_small');\n\n if(!peerReaction) { // ! WARNING, message can be already read\n message = await this.managers.appMessagesManager.getMessageByPeer(message.peerId, message.mid);\n if(!message || !message.pFlags.unread) return;\n }\n\n notification.image = url;\n } else {\n let {avatarCanvas, avatarContext} = this;\n if(!this.avatarCanvas) {\n avatarCanvas = this.avatarCanvas = document.createElement('canvas');\n avatarContext = this.avatarContext = avatarCanvas.getContext('2d');\n\n const SIZE = 54;\n const dpr = 1;\n avatarCanvas.dpr = dpr;\n avatarCanvas.width = avatarCanvas.height = SIZE * dpr;\n\n this.avatarGradients = {};\n } else {\n avatarContext.clearRect(0, 0, avatarCanvas.width, avatarCanvas.height);\n }\n\n const color = getPeerColorById(peerId, true);\n let gradient = this.avatarGradients[color];\n if(!gradient) {\n gradient = this.avatarGradients[color] = avatarContext.createLinearGradient(avatarCanvas.width / 2, 0, avatarCanvas.width / 2, avatarCanvas.height);\n\n const colorTop = customProperties.getProperty(`peer-avatar-${color}-top`);\n const colorBottom = customProperties.getProperty(`peer-avatar-${color}-bottom`);\n gradient.addColorStop(0, colorTop);\n gradient.addColorStop(1, colorBottom);\n }\n\n avatarContext.fillStyle = gradient;\n\n drawCircle(avatarContext, avatarCanvas.width / 2, avatarCanvas.height / 2, avatarCanvas.width / 2);\n avatarContext.fill();\n\n const fontSize = 20 * avatarCanvas.dpr;\n const abbreviation = getAbbreviation(peerTitle);\n\n avatarContext.font = `700 ${fontSize}px ${FontFamily}`;\n avatarContext.textBaseline = 'middle';\n avatarContext.textAlign = 'center';\n avatarContext.fillStyle = 'white';\n avatarContext.fillText(abbreviation.text, avatarCanvas.width / 2, avatarCanvas.height * (window.devicePixelRatio > 1 ? .5625 : 5));\n\n notification.image = avatarCanvas.toDataURL();\n }\n\n const pushData: PushNotificationObject = {\n custom: {\n msg_id: '' + message.mid,\n peerId: '' + peerId\n },\n description: '',\n loc_key: '',\n loc_args: [],\n mute: '',\n random_id: 0,\n title: ''\n };\n\n const result = await this.notify(notification, pushData);\n if(result && this.registeredDevice) {\n webPushApiManager.ignorePushByMid(peerId, message.mid);\n }\n }\n\n private toggleToggler(enable = idleController.isIdle) {\n if(IS_MOBILE) return;\n\n const resetTitle = (isBlink?: boolean) => {\n this.titleChanged = false;\n document.title = this.titleBackup;\n this.setFavicon();\n };\n\n window.clearInterval(this.titleInterval);\n this.titleInterval = 0;\n\n if(!enable) {\n resetTitle();\n } else {\n this.titleInterval = window.setInterval(() => {\n const count = this.notificationsCount;\n if(!count) {\n this.toggleToggler(false);\n } else if(this.titleChanged) {\n resetTitle(true);\n } else {\n this.titleChanged = true;\n document.title = I18n.format('Notifications.Count', true, [count]);\n // this.setFavicon('assets/img/favicon_unread.ico');\n\n // fetch('assets/img/favicon.ico')\n // .then((res) => res.blob())\n // .then((blob) => {\n // const img = document.createElement('img');\n // img.src = URL.createObjectURL(blob);\n\n const canvas = document.createElement('canvas');\n canvas.width = 32 * window.devicePixelRatio;\n canvas.height = canvas.width;\n\n const ctx = canvas.getContext('2d');\n ctx.beginPath();\n ctx.arc(canvas.width / 2, canvas.height / 2, canvas.width / 2, 0, 2 * Math.PI, false);\n ctx.fillStyle = '#3390ec';\n ctx.fill();\n\n let fontSize = 24;\n let str = '' + count;\n if(count < 10) {\n fontSize = 22;\n } else if(count < 100) {\n fontSize = 20;\n } else {\n str = '99+';\n fontSize = 16;\n }\n\n fontSize *= window.devicePixelRatio;\n\n ctx.font = `700 ${fontSize}px ${FontFamily}`;\n ctx.textBaseline = 'middle';\n ctx.textAlign = 'center';\n ctx.fillStyle = 'white';\n ctx.fillText(str, canvas.width / 2, canvas.height * .5625);\n\n /* const ctx = canvas.getContext('2d');\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height); */\n\n this.setFavicon(canvas.toDataURL());\n // });\n }\n }, 1000);\n }\n }\n\n private setFavicon(href?: string) {\n if(this.prevFavicon === href) {\n return;\n }\n\n this.prevFavicon = href;\n this.faviconElements.forEach((element, idx, arr) => {\n const link = element.cloneNode() as HTMLLinkElement;\n\n link.dataset.href ||= link.href;\n\n href ??= link.dataset.href;\n link.href = href;\n element.replaceWith(arr[idx] = link);\n });\n }\n\n public async notify(data: NotifyOptions, pushData: PushNotificationObject) {\n this.log('notify', data, idleController.isIdle, this.notificationsUiSupport, this.stopped);\n\n if(this.stopped) {\n return;\n }\n\n data.image ||= NOTIFICATION_ICON_PATH;\n\n if(!data.noIncrement) {\n ++this.notificationsCount;\n }\n\n if(!this.titleInterval) {\n this.toggleToggler();\n }\n\n const idx = ++this.notificationIndex;\n const key = data.key || 'k' + idx;\n this.notificationsShown[key] = true;\n\n const now = tsNow();\n if(this.settings.volume > 0 && !this.settings.nosound/* &&\n (\n !data.tag ||\n !this.soundsPlayed[data.tag] ||\n now > this.soundsPlayed[data.tag] + 60000\n ) */\n ) {\n this.testSound(this.settings.volume);\n this.soundsPlayed[data.tag] = now;\n }\n\n if(!this.notificationsUiSupport ||\n 'Notification' in window && Notification.permission !== 'granted') {\n return;\n }\n\n if(this.settings.nodesktop) {\n if(this.vibrateSupport && !this.settings.novibrate) {\n navigator.vibrate([200, 100, 200]);\n return;\n }\n\n return;\n }\n\n if(!('Notification' in window)) {\n return;\n }\n\n let notification: MyNotification;\n\n const notificationOptions: NotificationOptions = {\n badge: NOTIFICATION_BADGE_PATH,\n icon: data.image || '',\n body: data.message || '',\n tag: data.tag || '',\n silent: data.silent || false,\n data: pushData\n };\n\n try {\n if(data.tag) {\n for(const i in this.notificationsShown) {\n const notification = this.notificationsShown[i];\n if(typeof(notification) !== 'boolean' && notification.tag === data.tag) {\n notification.hidden = true;\n }\n }\n }\n\n // throw new Error('test');\n notification = new Notification(data.title, notificationOptions);\n } catch(e) {\n try {\n const registration = await navigator.serviceWorker.ready;\n await registration.showNotification(data.title, notificationOptions);\n const notifications = await registration.getNotifications({tag: notificationOptions.tag});\n notification = notifications[notifications.length - 1];\n } catch(err) {\n this.log.error('creating push error', err, data, notificationOptions);\n }\n\n if(!notification) {\n this.notificationsUiSupport = false;\n webPushApiManager.setLocalNotificationsDisabled();\n return;\n }\n }\n\n notification.onclick = () => {\n this.log('notification onclick');\n notification.close();\n appRuntimeManager.focus();\n this.clear();\n data.onclick?.();\n };\n\n notification.onclose = () => {\n this.log('notification onclose');\n if(!notification.hidden) {\n delete this.notificationsShown[key];\n this.clear();\n }\n };\n\n notification.show?.();\n this.notificationsShown[key] = notification;\n\n if(!IS_MOBILE) {\n setTimeout(() => {\n this.hide(key);\n }, 8000);\n }\n\n return true;\n }\n\n public updateLocalSettings = () => {\n const keys = ['notify_nodesktop', 'notify_volume', 'notify_novibrate', 'notify_nopreview', 'notify_nopush'];\n const promises = keys.map(() => undefined);\n // const promises = keys.map((k) => stateStorage.get(k as any));\n Promise.all(promises)\n .then((updSettings) => {\n this.settings.nodesktop = updSettings[0];\n this.settings.volume = updSettings[1] === undefined ? 0.5 : updSettings[1];\n this.settings.novibrate = updSettings[2];\n this.settings.nopreview = updSettings[3];\n this.settings.nopush = updSettings[4];\n\n if(this.pushInited) {\n const needPush = !this.settings.nopush && !this.settings.nodesktop && webPushApiManager.isAvailable || false;\n const hasPush = this.registeredDevice !== false;\n if(needPush !== hasPush) {\n if(needPush) {\n webPushApiManager.subscribe();\n } else {\n webPushApiManager.unsubscribe();\n }\n }\n }\n\n webPushApiManager.setSettings(this.settings);\n });\n\n apiManagerProxy.getState().then((state) => {\n this.settings.nosound = !state.settings.notifications.sound;\n });\n }\n\n public getLocalSettings() {\n return this.settings;\n }\n\n private hide(key: string) {\n const notification = this.notificationsShown[key];\n if(notification) {\n this.closeNotification(notification);\n }\n }\n\n public soundReset(tag: string) {\n delete this.soundsPlayed[tag];\n }\n\n private requestPermission = () => {\n Notification.requestPermission();\n window.removeEventListener('click', this.requestPermission);\n };\n\n public testSound(volume: number) {\n const now = tsNow();\n if(this.nextSoundAt && now < this.nextSoundAt && this.prevSoundVolume === volume) {\n return;\n }\n\n this.nextSoundAt = now + 1000;\n this.prevSoundVolume = volume;\n const filename = 'assets/audio/notification.mp3';\n const audio = document.createElement('audio');\n audio.autoplay = true;\n audio.setAttribute('mozaudiochannel', 'notification');\n audio.volume = volume;\n audio.innerHTML = `\n \n \n `;\n this.notifySoundEl.append(audio);\n\n audio.addEventListener('ended', () => {\n audio.remove();\n }, {once: true});\n }\n\n public cancel(key: string) {\n const notification = this.notificationsShown[key];\n this.log('cancel', key, notification);\n if(notification) {\n if(this.notificationsCount > 0) {\n --this.notificationsCount;\n }\n\n this.closeNotification(notification);\n delete this.notificationsShown[key];\n }\n }\n\n private closeNotification(notification: boolean | MyNotification) {\n try {\n if(typeof(notification) !== 'boolean' && notification.close) {\n this.log('close notification', notification);\n notification.hidden = true;\n notification.close();\n }\n } catch(e) {}\n }\n\n public clear() {\n this.log.warn('clear');\n\n for(const i in this.notificationsShown) {\n const notification = this.notificationsShown[i];\n this.closeNotification(notification);\n }\n\n this.notificationsShown = {};\n this.notificationsCount = 0;\n\n webPushApiManager.hidePushNotifications();\n }\n\n public start() {\n this.log('start');\n\n this.updateLocalSettings();\n rootScope.addEventListener('settings_updated', this.updateLocalSettings);\n webPushApiManager.start();\n\n if(!this.notificationsUiSupport) {\n return false;\n }\n\n if('Notification' in window && Notification.permission !== 'granted' && Notification.permission !== 'denied') {\n window.addEventListener('click', this.requestPermission);\n }\n\n try {\n if('onbeforeunload' in window) {\n window.addEventListener('beforeunload', this.clear);\n }\n } catch(e) {}\n }\n\n private stop() {\n this.log('stop');\n\n this.clear();\n window.clearInterval(this.titleInterval);\n this.titleInterval = 0;\n this.setFavicon();\n this.stopped = true;\n }\n\n private registerDevice(tokenData: PushSubscriptionNotify) {\n if(this.registeredDevice && deepEqual(this.registeredDevice, tokenData)) {\n return false;\n }\n\n this.managers.apiManager.invokeApi('account.registerDevice', {\n token_type: tokenData.tokenType,\n token: tokenData.tokenValue,\n other_uids: [],\n app_sandbox: false,\n secret: new Uint8Array()\n }).then(() => {\n this.log('registered device');\n this.registeredDevice = tokenData;\n }, (error) => {\n error.handled = true;\n });\n }\n\n private unregisterDevice(tokenData: PushSubscriptionNotify) {\n if(!this.registeredDevice) {\n return false;\n }\n\n this.managers.apiManager.invokeApi('account.unregisterDevice', {\n token_type: tokenData.tokenType,\n token: tokenData.tokenValue,\n other_uids: []\n }).then(() => {\n this.registeredDevice = false;\n }, (error) => {\n error.handled = true;\n });\n }\n}\n\nconst uiNotificationsManager = new UiNotificationsManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.uiNotificationsManager = uiNotificationsManager);\nexport default uiNotificationsManager;\n","export const NOTIFICATION_ICON_PATH = 'assets/img/logo_filled_rounded.png';\nexport const NOTIFICATION_BADGE_PATH = 'assets/img/logo_plain.svg'; // masked\n","export default async function getFilesFromEvent(e: ClipboardEvent | DragEvent, onlyTypes = false): Promise {\n const files: any[] = [];\n\n const scanFiles = async(entry: any, item: DataTransferItem) => {\n if(entry.isDirectory) {\n const directoryReader = entry.createReader();\n await new Promise((resolve, reject) => {\n directoryReader.readEntries(async(entries: any) => {\n for(const entry of entries) {\n await scanFiles(entry, item);\n }\n\n resolve();\n });\n });\n } else if(entry) {\n if(onlyTypes) {\n files.push(entry.type);\n } else {\n const itemFile = item.getAsFile(); // * Safari can't handle entry.file with pasting\n const file = entry instanceof File ?\n entry :\n (\n entry instanceof DataTransferItem ?\n entry.getAsFile() :\n await new Promise((resolve, reject) => entry.file(resolve, (err: any) => resolve(itemFile)))\n );\n\n /* if(!onlyTypes) {\n console.log('getFilesFromEvent: got file', item, file);\n } */\n\n if(!file) return;\n files.push(file);\n }\n }\n };\n\n if(e instanceof DragEvent && e.dataTransfer.files && !e.dataTransfer.items) {\n for(let i = 0; i < e.dataTransfer.files.length; i++) {\n const file = e.dataTransfer.files[i];\n files.push(onlyTypes ? file.type : file);\n }\n } else {\n // @ts-ignore\n const items = (e.dataTransfer || e.clipboardData || e.originalEvent.clipboardData).items;\n\n const promises: Promise[] = [];\n for(let i = 0; i < items.length; ++i) {\n const item: DataTransferItem = items[i];\n if(item.kind === 'file') {\n const entry = (onlyTypes ? item : item.webkitGetAsEntry()) || item.getAsFile();\n promises.push(scanFiles(entry, item));\n }\n }\n\n await Promise.all(promises);\n }\n\n /* if(!onlyTypes) {\n console.log('getFilesFromEvent: got files:', e, files);\n } */\n\n return files;\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 {T_ME_PREFIXES} from '../lib/mtproto/mtproto_config';\nimport cancelEvent from './dom/cancelEvent';\nimport parseUriParams from './string/parseUriParams';\n\nexport default function addAnchorListener(options: {\n name: 'showMaskedAlert' | 'execBotCommand' | 'searchByHashtag' | 'addstickers' | 'im' |\n 'resolve' | 'privatepost' | 'addstickers' | 'voicechat' | 'joinchat' | 'join' | 'invoice' |\n 'addemoji',\n protocol?: 'tg',\n callback: (params: Params, element?: HTMLAnchorElement) => boolean | any,\n noPathnameParams?: boolean,\n noUriParams?: boolean,\n noCancelEvent?: boolean\n}) {\n (window as any)[(options.protocol ? options.protocol + '_' : '') + options.name] = (element?: HTMLAnchorElement/* , e: Event */) => {\n !options.noCancelEvent && cancelEvent(null);\n\n let href = element.href;\n let pathnameParams: any[];\n let uriParams: any;\n\n const u = new URL(href);\n const match = u.host.match(/(.+?)\\.t(?:elegram)?\\.me/);\n if(match && !T_ME_PREFIXES.has(match[1])) {\n u.pathname = match[1] + (u.pathname === '/' ? '' : u.pathname);\n href = u.toString();\n }\n\n if(!options.noPathnameParams) pathnameParams = new URL(href).pathname.split('/').slice(1);\n if(!options.noUriParams) uriParams = parseUriParams(href);\n\n const res = options.callback({pathnameParams, uriParams} as Params, element);\n return res === undefined ? res : false;\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 {GroupCallId, MyGroupCall} from './appGroupCallsManager';\nimport type GroupCallInstance from '../calls/groupCallInstance';\nimport type CallInstance from '../calls/callInstance';\nimport animationIntersector, {AnimationItemGroup} 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 rootScope from '../rootScope';\nimport Chat, {ChatType} from '../../components/chat/chat';\nimport PopupNewMedia, {getCurrentNewMediaPopup} from '../../components/popups/newMedia';\nimport MarkupTooltip from '../../components/chat/markupTooltip';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\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 stateStorage from '../stateStorage';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport appNavigationController from '../../components/appNavigationController';\nimport AppPrivateSearchTab from '../../components/sidebarRight/tabs/search';\nimport I18n, {i18n, join, LangPackKey} from '../langPack';\nimport {ChatFull, ChatInvite, ChatParticipant, ChatParticipants, Message, MessageAction, MessageMedia, SendMessageAction, User, Chat as MTChat, UrlAuthResult, WallPaper} from '../../layer';\nimport PeerTitle from '../../components/peerTitle';\nimport PopupPeer, {PopupPeerCheckboxOptions} from '../../components/popups/peer';\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 PopupElement from '../../components/popups';\nimport singleInstance, {InstanceDeactivateReason, 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 {InternalLink, InternalLinkTypeMap, INTERNAL_LINK_TYPE} from './internalLink';\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 TopbarCall from '../../components/topbarCall';\nimport confirmationPopup from '../../components/confirmationPopup';\nimport IS_GROUP_CALL_SUPPORTED from '../../environment/groupCallSupport';\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';\nimport PopupCall from '../../components/call';\nimport copy from '../../helpers/object/copy';\nimport getObjectKeysAndSort from '../../helpers/object/getObjectKeysAndSort';\nimport numberThousandSplitter from '../../helpers/number/numberThousandSplitter';\nimport ChatBackgroundPatternRenderer from '../../components/chat/patternRenderer';\nimport {IS_FIREFOX} from '../../environment/userAgent';\nimport compareVersion from '../../helpers/compareVersion';\nimport {AppManagers} from './managers';\nimport uiNotificationsManager from './uiNotificationsManager';\nimport appMediaPlaybackController from '../../components/appMediaPlaybackController';\nimport {PHONE_NUMBER_REG_EXP} from '../richTextProcessor';\nimport wrapEmojiText from '../richTextProcessor/wrapEmojiText';\nimport wrapRichText, {CustomEmojiRendererElement, renderEmojis} from '../richTextProcessor/wrapRichText';\nimport wrapUrl from '../richTextProcessor/wrapUrl';\nimport generateMessageId from './utils/messageId/generateMessageId';\nimport getUserStatusString from '../../components/wrappers/getUserStatusString';\nimport getChatMembersString from '../../components/wrappers/getChatMembersString';\nimport {STATE_INIT} from '../../config/state';\nimport CacheStorageController from '../files/cacheStorage';\nimport themeController from '../../helpers/themeController';\nimport overlayCounter from '../../helpers/overlayCounter';\nimport appDialogsManager from './appDialogsManager';\nimport idleController from '../../helpers/idleController';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport {AckedResult} from '../mtproto/superMessagePort';\nimport groupCallsController from '../calls/groupCallsController';\nimport callsController from '../calls/callsController';\nimport getFilesFromEvent from '../../helpers/files/getFilesFromEvent';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport appRuntimeManager from './appRuntimeManager';\nimport paymentsWrapCurrencyAmount from '../../helpers/paymentsWrapCurrencyAmount';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport {CLICK_EVENT_NAME} from '../../helpers/dom/clickEvent';\nimport PopupPayment from '../../components/popups/payment';\nimport wrapPeerTitle from '../../components/wrappers/peerTitle';\nimport NBSP from '../../helpers/string/nbsp';\nimport {makeMediaSize, MediaSize} from '../../helpers/mediaSize';\nimport {MiddleEllipsisElement} from '../../components/middleEllipsis';\nimport addAnchorListener from '../../helpers/addAnchorListener';\nimport parseUriParams from '../../helpers/string/parseUriParams';\nimport getMessageThreadId from './utils/messages/getMessageThreadId';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport {MTAppConfig} from '../mtproto/appConfig';\nimport PopupForward from '../../components/popups/forward';\nimport AppBackgroundTab from '../../components/sidebarLeft/tabs/background';\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 stack?: number,\n commentId?: number,\n type?: ChatType\n};\n\nexport type ChatSetInnerPeerOptions = Modify;\n\nexport enum APP_TABS {\n CHATLIST,\n CHAT,\n PROFILE\n}\n\nexport class AppImManager extends EventListenerBase<{\n chat_changing: (details: {from: Chat, to: Chat}) => void,\n peer_changed: (chat: Chat) => void,\n peer_changing: (chat: Chat) => void,\n tab_changing: (tabId: number) => void\n}> {\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 private tabId: APP_TABS;\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 public emojiAnimationContainer: HTMLDivElement;\n\n private lastBackgroundUrl: string;\n\n public managers: AppManagers;\n\n public cacheStorage = new CacheStorageController('cachedFiles');\n public customEmojiSize: MediaSize;\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 public construct(managers: AppManagers) {\n this.managers = managers;\n\n const {\n apiUpdatesManager\n } = managers;\n apiUpdatesManager.attach(I18n.lastRequestedLangCode);\n\n appMediaPlaybackController.construct(managers);\n uiNotificationsManager.construct(managers);\n uiNotificationsManager.start();\n\n this.log = logger('IM', LogTypes.Log | LogTypes.Warn | LogTypes.Debug | LogTypes.Error);\n\n this.backgroundPromises = {};\n STATE_INIT.settings.themes.forEach((theme) => {\n const themeSettings = theme.settings;\n if(!themeSettings) {\n return;\n }\n\n const {wallpaper} = themeSettings;\n const slug = (wallpaper as WallPaper.wallPaper).slug;\n if(!slug) {\n return;\n }\n\n const url = 'assets/img/' + slug + '.svg' + (IS_FIREFOX ? '?1' : '');\n this.backgroundPromises[slug] = Promise.resolve(url);\n });\n\n this.selectTab(APP_TABS.CHATLIST);\n\n idleController.addEventListener('change', (idle) => {\n this.offline = idle;\n this.updateStatus();\n if(idle) {\n clearInterval(this.updateStatusInterval);\n } else {\n this.updateStatusInterval = window.setInterval(() => this.updateStatus(), 50e3);\n }\n });\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 const onPremiumToggle = (isPremium: boolean) => {\n document.body.classList.toggle('is-premium', isPremium);\n };\n rootScope.addEventListener('premium_toggle', onPremiumToggle);\n onPremiumToggle(rootScope.premium);\n this.managers.rootScope.getPremium().then(onPremiumToggle);\n\n useHeavyAnimationCheck(() => {\n animationIntersector.setOnlyOnePlayableGroup('lock');\n animationIntersector.checkAnimations2(true);\n }, () => {\n animationIntersector.setOnlyOnePlayableGroup();\n animationIntersector.checkAnimations2(false);\n });\n\n themeController.AppBackgroundTab = AppBackgroundTab;\n\n if(IS_FIREFOX && apiManagerProxy.oldVersion && compareVersion(apiManagerProxy.oldVersion, '1.4.3') === -1) {\n this.deleteFilesIterative((response) => {\n return response.headers.get('Content-Type') === 'image/svg+xml';\n }).then(() => {\n this.applyCurrentTheme();\n });\n } else {\n this.applyCurrentTheme();\n }\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 mediaSizes.addEventListener('resize', () => {\n // const perf = performance.now();\n const rect = this.chatsContainer.getBoundingClientRect();\n ChatBackgroundPatternRenderer.resizeInstances(rect.width, rect.height).then(() => {\n // this.log.warn('resize bg time:', performance.now() - perf);\n // for(const chat of this.chats) {\n // if(chat.renderDarkPattern) {\n // chat.renderDarkPattern();\n // }\n // }\n });\n });\n\n this.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_title_edit', ({peerId, threadId}) => {\n if(this.chat?.peerId === peerId && !threadId && this.tabId !== undefined) {\n this.overrideHash(peerId);\n }\n });\n\n rootScope.addEventListener('peer_typings', ({peerId, typings}) => {\n const chat = this.chat;\n if(\n !chat ||\n chat.peerId !== peerId ||\n overlayCounter.isOverlayActive || (\n mediaSizes.activeScreen === ScreenSize.mobile &&\n this.tabId !== APP_TABS.CHAT\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[generateMessageId(typing.action.msg_id)];\n if(bubble && bubble.classList.contains('emoji-big') && getVisibleRect(bubble, chat.bubbles.scrollable.container)) {\n const stickerWrapper: HTMLElement = bubble.querySelector('.media-sticker-wrapper:not(.bubble-hover-reaction-sticker):not(.reaction-sticker)');\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 this.managers.appMessagesManager.setTyping(peerId, {\n _: 'sendMessageEmojiInteractionSeen',\n emoticon: action.emoticon\n });\n }\n }\n });\n\n const onInstanceDeactivated = (reason: InstanceDeactivateReason) => {\n const isUpdated = reason === 'version';\n const popup = new PopupElement('popup-instance-deactivated', {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(isUpdated ? 'Deactivated.Version.Title' : 'Deactivated.Title'));\n\n const subtitle = document.createElement('div');\n subtitle.classList.add('subtitle');\n subtitle.append(i18n(isUpdated ? 'Deactivated.Version.Subtitle' : 'Deactivated.Subtitle'));\n\n c.append(header, subtitle);\n\n document.body.classList.add('deactivated');\n\n const onClose = isUpdated ? () => {\n appRuntimeManager.reload();\n } : () => {\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.addEventListener('close', onClose);\n popup.show();\n };\n\n singleInstance.addEventListener('deactivated', onInstanceDeactivated);\n if(singleInstance.deactivatedReason) {\n onInstanceDeactivated(singleInstance.deactivatedReason);\n }\n\n // remove scroll listener when setting chat to tray\n this.addEventListener('chat_changing', ({to}) => {\n this.toggleChatGradientAnimation(to);\n });\n\n rootScope.addEventListener('service_notification', (update) => {\n confirmationPopup({\n button: {langKey: 'OK', isCancel: true},\n description: wrapRichText(update.message)\n });\n });\n\n rootScope.addEventListener('payment_sent', async({peerId, mid, receiptMessage}) => {\n const message = await this.managers.appMessagesManager.getMessageByPeer(peerId, mid);\n if(!message) {\n return;\n }\n\n const action = receiptMessage.action as MessageAction.messageActionPaymentSent;\n toastNew({\n langPackKey: 'PaymentInfoHint',\n langPackArguments: [\n paymentsWrapCurrencyAmount(action.total_amount, action.currency),\n wrapEmojiText(((message as Message.message).media as MessageMedia.messageMediaInvoice).title)\n ]\n });\n });\n\n (window as any).onSpoilerClick = (e: MouseEvent) => {\n const spoiler = findUpClassName(e.target, 'spoiler');\n const parentElement = findUpClassName(spoiler, 'spoilers-container') || spoiler.parentElement;\n\n const className = 'is-spoiler-visible';\n const isVisible = parentElement.classList.contains(className);\n if(!isVisible) {\n cancelEvent(e);\n\n if(CLICK_EVENT_NAME !== 'click') {\n window.addEventListener('click', cancelEvent, {capture: true, once: true});\n }\n }\n\n const duration = 400 / 2;\n const showDuration = 5000;\n const useRafs = !isVisible ? 2 : 0;\n if(useRafs) {\n parentElement.classList.add('will-change');\n }\n\n const spoilerTimeout = parentElement.dataset.spoilerTimeout;\n if(spoilerTimeout !== null) {\n clearTimeout(+spoilerTimeout);\n delete parentElement.dataset.spoilerTimeout;\n }\n\n SetTransition({\n element: parentElement,\n className,\n forwards: true,\n duration,\n onTransitionEnd: () => {\n parentElement.dataset.spoilerTimeout = '' + window.setTimeout(() => {\n SetTransition({\n element: parentElement,\n className,\n forwards: false,\n duration,\n onTransitionEnd: () => {\n parentElement.classList.remove('will-change');\n delete parentElement.dataset.spoilerTimeout;\n }\n });\n }, showDuration);\n },\n useRafs\n });\n };\n\n rootScope.addEventListener('sticker_updated', ({type, faved}) => {\n if(type === 'faved') {\n toastNew({\n langPackKey: faved ? 'AddedToFavorites' : 'RemovedFromFavorites'\n });\n } else if(!faved) {\n toastNew({\n langPackKey: 'RemovedFromRecent'\n });\n }\n });\n\n apiManagerProxy.addEventListener('notificationBuild', async(options) => {\n const isForum = await this.managers.appPeersManager.isForum(options.message.peerId);\n const threadId = getMessageThreadId(options.message, isForum);\n if(this.chat.peerId === options.message.peerId && this.chat.threadId === threadId && !idleController.isIdle) {\n return;\n }\n\n uiNotificationsManager.buildNotification(options);\n });\n\n this.addEventListener('peer_changed', async({peerId}) => {\n document.body.classList.toggle('has-chat', !!peerId);\n\n this.emojiAnimationContainer.textContent = '';\n\n this.overrideHash(peerId);\n\n apiManagerProxy.updateTabState('chatPeerIds', this.chats.map((chat) => chat.peerId).filter(Boolean));\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(managers);\n }\n\n if(IS_CALL_SUPPORTED) {\n callsController.addEventListener('instance', ({instance/* , hasCurrent */}) => {\n // if(hasCurrent) {\n // return;\n // }\n\n const popup = new PopupCall(instance);\n\n instance.addEventListener('acceptCallOverride', () => {\n return this.discardCurrentCall(instance.interlocutorUserId.toPeerId(), undefined, instance)\n .then(() => {\n callsController.dispatchEvent('accepting', instance);\n return true;\n })\n .catch(() => false);\n });\n\n popup.addEventListener('close', () => {\n const currentCall = callsController.currentCall;\n if(currentCall && currentCall !== instance && !instance.wasTryingToJoin) {\n instance.hangUp('phoneCallDiscardReasonBusy');\n }\n }, {once: true});\n\n popup.show();\n });\n\n callsController.addEventListener('incompatible', async(userId) => {\n toastNew({\n langPackKey: 'VoipPeerIncompatible',\n langPackArguments: [\n await wrapPeerTitle({peerId: userId.toPeerId()})\n ]\n });\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 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 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 this.managers.appMessagesManager.sendText(peerId, '/' + command);\n }); */\n\n this.managers.appMessagesManager.sendText(this.chat.peerId, '/' + command + (bot ? '@' + bot : ''));\n\n // console.log(command, bot);\n }\n });\n\n 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 ([\n ['addstickers', INTERNAL_LINK_TYPE.STICKER_SET],\n ['addemoji', INTERNAL_LINK_TYPE.EMOJI_SET]\n ] as [\n 'addstickers' | 'addemoji',\n INTERNAL_LINK_TYPE.STICKER_SET | INTERNAL_LINK_TYPE.EMOJI_SET\n ][]).forEach(([name, type]) => {\n addAnchorListener<{pathnameParams: [typeof name, string]}>({\n name,\n callback: ({pathnameParams}) => {\n if(!pathnameParams[1]) {\n return;\n }\n\n const link: InternalLink = {\n _: type,\n set: pathnameParams[1]\n };\n\n this.processInternalLink(link);\n }\n });\n\n addAnchorListener<{\n uriParams: {\n set: string\n }\n }>({\n name,\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(type, uriParams);\n this.processInternalLink(link);\n }\n });\n });\n\n // * t.me/invoice/asdasdad\n // * t.me/$asdasdad\n addAnchorListener<{pathnameParams: ['invoice', string] | string}>({\n name: 'invoice',\n callback: ({pathnameParams}) => {\n const link: InternalLink = {\n _: INTERNAL_LINK_TYPE.INVOICE,\n slug: pathnameParams.length > 1 ? pathnameParams[1] : pathnameParams[0].slice(1)\n };\n\n this.processInternalLink(link);\n }\n });\n\n // Support old t.me/joinchat/asd and new t.me/+asd\n 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 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 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}, element) => {\n let link: InternalLink;\n if(PHONE_NUMBER_REG_EXP.test(pathnameParams[0])) {\n link = {\n _: INTERNAL_LINK_TYPE.USER_PHONE_NUMBER,\n phone: pathnameParams[0].slice(1)\n };\n } else if(pathnameParams[0] === 'c') {\n pathnameParams.shift();\n const thread = 'thread' in uriParams ? uriParams.thread : pathnameParams[2] && pathnameParams[1];\n link = {\n _: INTERNAL_LINK_TYPE.PRIVATE_POST,\n channel: pathnameParams[0],\n post: pathnameParams[2] || pathnameParams[1],\n thread,\n comment: uriParams.comment,\n stack: this.getStackFromElement(element)\n };\n } else {\n const thread = 'thread' in uriParams ? uriParams.thread : pathnameParams[2] && pathnameParams[1];\n link = {\n _: INTERNAL_LINK_TYPE.MESSAGE,\n domain: pathnameParams[0],\n post: pathnameParams[2] || pathnameParams[1],\n thread,\n comment: uriParams.comment,\n start: 'start' in uriParams ? uriParams.start : undefined,\n stack: this.getStackFromElement(element)\n };\n }\n\n this.processInternalLink(link);\n }\n });\n\n 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 phone?: string\n }\n }>({\n name: 'resolve',\n protocol: 'tg',\n callback: ({uriParams}, element) => {\n let link: InternalLink;\n if(uriParams.phone) {\n link = this.makeLink(INTERNAL_LINK_TYPE.USER_PHONE_NUMBER, uriParams as Required);\n } else if(uriParams.domain === 'telegrampassport') {\n\n } else {\n link = this.makeLink(INTERNAL_LINK_TYPE.MESSAGE, {\n ...uriParams,\n stack: this.getStackFromElement(element)\n });\n }\n\n this.processInternalLink(link);\n }\n });\n\n 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 addAnchorListener<{\n uriParams: {\n slug: string\n }\n }>({\n name: 'invoice',\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.INVOICE, uriParams);\n this.processInternalLink(link);\n }\n });\n\n ['joinchat' as const, 'join' as const].forEach((name) => {\n 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(true);\n this.attachKeydownListener();\n this.handleAutologinDomains();\n this.checkForShare();\n }\n\n private checkForShare() {\n const share = apiManagerProxy.share;\n if(share) {\n apiManagerProxy.share = undefined;\n new PopupForward(undefined, async(peerId) => {\n await this.setPeer({peerId});\n if(share.files?.length) {\n const foundMedia = share.files.some((file) => MEDIA_MIME_TYPES_SUPPORTED.has(file.type));\n new PopupNewMedia(this.chat, share.files, foundMedia ? 'media' : 'document');\n } else {\n this.managers.appMessagesManager.sendText(peerId, share.text);\n }\n });\n }\n }\n\n public handleUrlAuth(options: {\n peerId?: PeerId,\n mid?: number,\n buttonId?: number,\n url: string\n }) {\n const {peerId, mid, buttonId, url} = options;\n\n const openWindow = (url: string) => {\n window.open(url, '_blank');\n };\n\n const onUrlAuthResultAccepted = (urlAuthResult: UrlAuthResult.urlAuthResultAccepted) => {\n openWindow(urlAuthResult.url);\n };\n\n const onUrlAuthResult = async(urlAuthResult: UrlAuthResult): Promise => {\n if(urlAuthResult._ === 'urlAuthResultRequest') {\n const b = document.createElement('b');\n b.append(urlAuthResult.domain);\n const peerTitle = await wrapPeerTitle({peerId: rootScope.myId});\n const botPeerTitle = await wrapPeerTitle({peerId: urlAuthResult.bot.id.toPeerId()});\n\n const logInCheckbox: PopupPeerCheckboxOptions = {\n text: 'OpenUrlOption1',\n textArgs: [b.cloneNode(true), peerTitle],\n checked: true\n };\n\n const allowMessagesCheckbox: PopupPeerCheckboxOptions = urlAuthResult.pFlags.request_write_access ? {\n text: 'OpenUrlOption2',\n textArgs: [botPeerTitle],\n checked: true\n } : undefined;\n\n const checkboxes: PopupPeerCheckboxOptions[] = [\n logInCheckbox,\n allowMessagesCheckbox\n ];\n\n const confirmationPromise = confirmationPopup({\n titleLangKey: 'OpenUrlTitle',\n button: {\n langKey: 'Open'\n },\n descriptionLangKey: 'OpenUrlAlert2',\n descriptionLangArgs: [b],\n checkboxes: checkboxes.filter(Boolean)\n });\n\n if(allowMessagesCheckbox) {\n logInCheckbox.checkboxField.input.addEventListener('change', () => {\n const disabled = !logInCheckbox.checkboxField.checked;\n allowMessagesCheckbox.checkboxField.toggleDisability(disabled);\n\n if(disabled) {\n allowMessagesCheckbox.checkboxField.checked = false;\n }\n });\n }\n\n const [logInChecked, allowMessagesChecked] = await confirmationPromise;\n\n if(!logInChecked) {\n openWindow(url);\n return;\n }\n\n const result = await this.managers.appSeamlessLoginManager.acceptUrlAuth(\n url,\n peerId,\n mid,\n buttonId,\n allowMessagesChecked\n );\n\n return onUrlAuthResult(result);\n } else if(urlAuthResult._ === 'urlAuthResultAccepted') {\n onUrlAuthResultAccepted(urlAuthResult);\n } else {\n openWindow(url);\n }\n };\n\n return this.managers.appSeamlessLoginManager.requestUrlAuth(\n url,\n peerId,\n mid,\n buttonId\n ).then((urlAuthResult) => {\n onUrlAuthResult(urlAuthResult);\n });\n }\n\n private handleAutologinDomains() {\n let appConfig: MTAppConfig;\n rootScope.addEventListener('app_config', (_appConfig) => {\n appConfig = _appConfig;\n });\n\n const onAnchorClick = (element: HTMLAnchorElement) => {\n const url = new URL(element.href);\n if(appConfig.url_auth_domains.includes(url.hostname)) {\n this.handleUrlAuth({url: element.href});\n cancelEvent();\n return;\n }\n\n if(!appConfig.autologin_token || !appConfig.autologin_domains) {\n return;\n }\n\n const originalUrl = element.dataset.originalUrl ??= element.href;\n if(appConfig.autologin_domains.includes(url.hostname)) {\n url.searchParams.set('autologin_token', appConfig.autologin_token);\n element.href = url.toString();\n\n setTimeout(() => {\n element.href = originalUrl;\n delete element.dataset.originalUrl;\n }, 0);\n }\n };\n\n document.addEventListener('click', (e) => {\n const anchor = findUpTag(e.target as HTMLElement, 'A') as HTMLAnchorElement;\n if(anchor?.href) {\n onAnchorClick(anchor);\n }\n });\n\n // addAnchorListener({\n // name: 'handleUrlClick',\n // callback: (_, element) => {\n // onAnchorClick(element);\n // },\n // noCancelEvent: true,\n // noPathnameParams: true,\n // noUriParams: true\n // });\n }\n\n private getStackFromElement(element: HTMLElement) {\n const possibleBubble = findUpClassName(element, 'bubble');\n return possibleBubble ? +possibleBubble.dataset.mid : undefined;\n }\n\n private deleteFilesIterative(callback: (response: Response) => boolean) {\n return this.cacheStorage.timeoutOperation((cache) => {\n const perf = performance.now();\n return cache.keys().then((requests) => {\n const promises = requests.map((request) => {\n return cache.match(request).then((response) => {\n return callback(response);\n });\n });\n\n return Promise.all(promises).then((values) => {\n values.map((isBad, idx) => {\n if(!isBad) {\n return;\n }\n\n const request = requests[idx];\n return cache.delete(request);\n });\n\n return Promise.all(values.filter(Boolean));\n });\n }).then(() => {\n this.log('deleted files', performance.now() - perf);\n });\n });\n }\n\n private toggleChatGradientAnimation(activatingChat: Chat) {\n this.chats.forEach((chat) => {\n if(chat.gradientRenderer) {\n chat.gradientRenderer.scrollAnimate(rootScope.settings.animationsEnabled && chat === activatingChat);\n }\n });\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 const isSelectionCollapsed = document.getSelection().isCollapsed;\n if(overlayCounter.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((key.startsWith('Arrow') || (e.shiftKey && key === 'Shift')) && !isSelectionCollapsed) {\n return;\n } else if(e.code === 'KeyC' && (e.ctrlKey || e.metaKey) && target.tagName !== 'INPUT') {\n return;\n } else if(e.altKey && (key === 'ArrowUp' || key === 'ArrowDown')) {\n cancelEvent(e);\n this.managers.dialogsStorage.getNextDialog(this.chat.peerId, key === 'ArrowDown', appDialogsManager.filterId).then((dialog) => {\n if(dialog) {\n this.setPeer({peerId: dialog.peerId});\n }\n });\n } else if(key === 'ArrowUp' && this.chat.type !== 'scheduled') {\n if(!chat.input.editMsgId && chat.input.isInputEmpty()) {\n this.managers.appMessagesManager.getFirstMessageToEdit(chat.peerId, chat.threadId).then((message) => {\n if(message) {\n chat.input.initMessageEditing(message.mid);\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.isContentEditable &&\n !IS_TOUCH_SUPPORTED &&\n (!mediaSizes.isMobile || this.tabId === APP_TABS.CHAT) &&\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 ? generateMessageId(+link.post) : undefined;\n const commentId = link.comment ? generateMessageId(+link.comment) : undefined;\n const threadId = link.thread ? generateMessageId(+link.thread) : undefined;\n\n this.openUsername({\n userName: link.domain,\n lastMsgId: postId,\n commentId,\n startParam: link.start,\n stack: link.stack,\n threadId\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 = await this.managers.appChatsManager.getChat(chatId);\n if(!chat) {\n try {\n await this.managers.appChatsManager.resolveChannel(chatId);\n } catch(err) {\n toastNew({langPackKey: 'LinkNotFound'});\n throw err;\n }\n }\n\n const postId = generateMessageId(+link.post);\n const threadId = link.thread ? generateMessageId(+link.thread) : undefined;\n\n this.op({\n peer: chat,\n lastMsgId: postId,\n threadId,\n stack: link.stack\n });\n break;\n }\n\n case INTERNAL_LINK_TYPE.EMOJI_SET:\n case INTERNAL_LINK_TYPE.STICKER_SET: {\n new PopupStickers({id: link.set}, link._ === INTERNAL_LINK_TYPE.EMOJI_SET).show();\n break;\n }\n\n case INTERNAL_LINK_TYPE.JOIN_CHAT: {\n this.managers.appChatsManager.checkChatInvite(link.invite).then((chatInvite) => {\n if((chatInvite as ChatInvite.chatInvitePeek).chat) {\n this.managers.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);\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 case INTERNAL_LINK_TYPE.USER_PHONE_NUMBER: {\n this.managers.appUsersManager.resolvePhone(link.phone).then((user) => {\n this.setInnerPeer({\n peerId: user.id.toPeerId(false)\n });\n }).catch((err) => {\n if(err.type === 'PHONE_NOT_OCCUPIED') {\n toastNew({langPackKey: 'Alert.UserDoesntExists'});\n }\n });\n\n break;\n }\n\n case INTERNAL_LINK_TYPE.INVOICE: {\n this.managers.appPaymentsManager.getInputInvoiceBySlug(link.slug).then((inputInvoice) => {\n this.managers.appPaymentsManager.getPaymentForm(inputInvoice).then((paymentForm) => {\n // const message: Message.message = {\n // _: 'message',\n // date: 0,\n // id: 0,\n // peerId: 0,\n // peer_id: undefined,\n // message: '',\n // media: {\n // _: 'messageMediaInvoice',\n // currency: paymentForm.invoice.currency,\n // description: paymentForm.description,\n\n // }\n // };\n new PopupPayment(undefined, inputInvoice, paymentForm);\n });\n });\n break;\n }\n\n default: {\n this.log.warn('Not supported internal link:', link);\n break;\n }\n }\n }\n\n public openUrl(url: string) {\n const {url: wrappedUrl, onclick} = wrapUrl(url);\n if(!onclick) {\n return;\n }\n\n const a = document.createElement('a');\n a.href = wrappedUrl;\n (window as any)[onclick](a);\n }\n\n private onHashChange = (saveState?: boolean) => {\n try {\n this.onHashChangeUnsafe(saveState);\n } catch(err) {\n this.log.error('hash change error', err);\n }\n };\n\n private onHashChangeUnsafe = (saveState?: boolean) => {\n const hash = location.hash;\n if(!saveState) {\n appNavigationController.replaceState();\n }\n\n const splitted = hash.split('?');\n const params = parseUriParams(hash, splitted);\n this.log('hashchange', hash, splitted[0], params);\n if(!hash) {\n return;\n }\n\n if(params.tgaddr) {\n this.openUrl(params.tgaddr);\n return;\n }\n\n switch(splitted[0]) {\n default: {\n params.p = splitted[0].slice(1);\n }\n\n case '#/im': {\n if(!Object.keys(params).length) {\n break;\n }\n\n const p: string = params.p;\n const postId = params.post !== undefined ? 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 private async op(options: {\n peer: User.user | MTChat\n } & Omit) {\n let {peer, commentId, threadId, lastMsgId} = options;\n const isUser = peer._ === 'user';\n const peerId = peer.id.toPeerId(!isUser);\n\n const isForum = peer._ === 'channel' && peer.pFlags.forum;\n // open forum tab\n if(!commentId && !threadId && !lastMsgId && isForum) {\n appDialogsManager.toggleForumTabByPeerId(peerId, true);\n return;\n }\n\n // handle t.me/username/thread or t.me/username/messageId\n if(isForum && lastMsgId && !threadId) {\n const message = await this.managers.appMessagesManager.reloadMessages(peerId, lastMsgId);\n if(message) {\n threadId = options.threadId = getMessageThreadId(message, isForum);\n } else {\n threadId = options.threadId = lastMsgId;\n lastMsgId = options.lastMsgId = undefined;\n }\n }\n\n if(threadId) {\n return this.openThread({\n ...(options as any as Parameters[0]),\n peerId\n });\n } else if(commentId) {\n return this.openComment({\n peerId,\n msgId: lastMsgId,\n commentId\n });\n }\n\n return this.setInnerPeer({\n ...options,\n peerId\n });\n }\n\n public openPremiumBot() {\n return this.managers.apiManager.getAppConfig().then((appConfig) => {\n return this.openUsername({userName: appConfig.premium_bot_username});\n });\n }\n\n public openUsername(options: {\n userName: string\n } & Omit) {\n const {userName} = options;\n return this.managers.appUsersManager.resolveUsername(userName).then((peer) => {\n return this.op({\n peer,\n ...options\n });\n }, (err: ApiError) => {\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 async openThread(options: {\n peerId: PeerId,\n lastMsgId: number,\n threadId: number,\n stack?: number\n }) {\n if(await this.managers.appChatsManager.isForum(options.peerId.toChatId())) {\n await this.managers.dialogsStorage.getForumTopicOrReload(options.peerId, options.threadId);\n return this.setInnerPeer(options);\n }\n\n return this.managers.appMessagesManager.reloadMessages(options.peerId, options.threadId).then((message) => {\n if(!message) {\n options.lastMsgId = undefined;\n } else {\n this.managers.appMessagesManager.generateThreadServiceStartMessage(message);\n }\n\n return this.setInnerPeer({\n ...options,\n type: 'discussion'\n });\n });\n }\n\n /**\n * Opens comment directly from original channel\n */\n public openComment(options: {\n peerId: PeerId,\n msgId: number,\n commentId: number\n }) {\n return this.managers.appMessagesManager.getDiscussionMessage(options.peerId, options.msgId).then((message) => {\n return this.openThread({\n peerId: message.peerId,\n lastMsgId: options.commentId,\n threadId: message.mid\n });\n });\n }\n\n public async callUser(userId: UserId, type: CallType) {\n const call = callsController.getCallByUserId(userId);\n if(call) {\n return;\n }\n\n const userFull = await this.managers.appProfileManager.getProfile(userId);\n if(userFull.pFlags.phone_calls_private) {\n wrapPeerTitle({peerId: userId.toPeerId()}).then((element) => {\n return confirmationPopup({\n descriptionLangKey: 'Call.PrivacyErrorMessage',\n descriptionLangArgs: [element],\n button: {\n langKey: 'OK',\n isCancel: true\n }\n });\n });\n\n return;\n }\n\n await this.discardCurrentCall(userId.toPeerId());\n\n callsController.startCallInternal(userId, type === 'video');\n }\n\n private discardCurrentCall(toPeerId: PeerId, ignoreGroupCall?: GroupCallInstance, ignoreCall?: CallInstance) {\n if(groupCallsController.groupCall && groupCallsController.groupCall !== ignoreGroupCall) return this.discardGroupCallConfirmation(toPeerId);\n else if(callsController.currentCall && callsController.currentCall !== ignoreCall) return this.discardCallConfirmation(toPeerId);\n else return Promise.resolve();\n }\n\n private async discardCallConfirmation(toPeerId: PeerId) {\n const currentCall = callsController.currentCall;\n if(currentCall) {\n await Promise.all([\n wrapPeerTitle({peerId: currentCall.interlocutorUserId.toPeerId(false)}),\n wrapPeerTitle({peerId: toPeerId})\n ]).then(([title1, title2]) => {\n return 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: [title1, title2],\n button: {\n langKey: 'OK'\n }\n });\n });\n\n if(!currentCall.isClosing) {\n await currentCall.hangUp('phoneCallDiscardReasonDisconnect');\n }\n }\n }\n\n private async discardGroupCallConfirmation(toPeerId: PeerId) {\n const currentGroupCall = groupCallsController.groupCall;\n if(currentGroupCall) {\n await Promise.all([\n wrapPeerTitle({peerId: currentGroupCall.chatId.toPeerId(true)}),\n wrapPeerTitle({peerId: toPeerId})\n ]).then(([title1, title2]) => {\n return 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: [title1, title2],\n button: {\n langKey: 'OK'\n }\n });\n });\n\n if(groupCallsController.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 = this.managers.appChatsManager.hasRights(chatId, 'manage_call');\n const next = async() => {\n const chatFull = await this.managers.appProfileManager.getChatFull(chatId);\n let call: MyGroupCall;\n if(!chatFull.call) {\n if(!hasRights) {\n return;\n }\n\n call = await this.managers.appGroupCallsManager.createGroupCall(chatId);\n } else {\n call = chatFull.call;\n }\n\n groupCallsController.joinGroupCall(chatId, call.id, true, false);\n };\n\n if(groupCallId) {\n const groupCall = await this.managers.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): ReturnType {\n const theme = themeController.getTheme();\n\n const slug = (theme.settings?.wallpaper as WallPaper.wallPaper)?.slug;\n if(slug) {\n const defaultTheme = STATE_INIT.settings.themes.find((t) => t.name === theme.name);\n // const isDefaultBackground = theme.background.blur === defaultTheme.background.blur &&\n // slug === defaultslug;\n\n // if(!isDefaultBackground) {\n return this.getBackground(slug).then((url) => {\n return this.setBackground(url, broadcastEvent);\n }, () => { // * if NO_ENTRY_FOUND\n theme.settings = copy(defaultTheme.settings); // * reset background\n return this.setCurrentBackground(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] = this.cacheStorage.getFile('backgrounds/' + slug).then((blob) => {\n return URL.createObjectURL(blob);\n });\n }\n\n public setBackground(url: string, broadcastEvent = true): Promise {\n this.lastBackgroundUrl = url;\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 key = chat.peerId + (chat.threadId ? '_' + chat.threadId : '');\n const chatPositions = stateStorage.getFromCache('chatPositions');\n if(!(chatBubbles.scrollable.getDistanceToEnd() <= 16 && chatBubbles.scrollable.loadedAll.bottom) && chatBubbles.getRenderedLength()) {\n chatBubbles.sliceViewport(true);\n const top = chatBubbles.scrollable.scrollTop;\n\n const position = {\n mids: getObjectKeysAndSort(chatBubbles.bubbles, 'desc').filter((mid) => mid > 0 && !chatBubbles.skippedMids.has(mid)),\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 applyCurrentTheme(slug?: string, backgroundUrl?: string, broadcastEvent?: boolean) {\n if(backgroundUrl) {\n this.backgroundPromises[slug] = Promise.resolve(backgroundUrl);\n }\n\n themeController.setTheme();\n\n return this.setCurrentBackground(broadcastEvent === undefined ? !!slug : broadcastEvent);\n }\n\n private setSettings = () => {\n const {messagesTextSize} = rootScope.settings;\n\n this.customEmojiSize = makeMediaSize(messagesTextSize + 4, messagesTextSize + 4);\n document.documentElement.style.setProperty('--messages-text-size', messagesTextSize + 'px');\n\n const firstTime = !this.customEmojiSize;\n if(!firstTime) {\n const ellipsisElements = document.querySelectorAll('middle-ellipsis-element');\n ellipsisElements.forEach((element) => {\n element.disconnectedCallback();\n element.dataset.fontSize = '' + messagesTextSize;\n if(element.title) element.textContent = element.title;\n element.connectedCallback();\n });\n\n const renderers = document.querySelectorAll('.chat custom-emoji-renderer-element');\n renderers.forEach((renderer) => {\n renderer.forceRenderAfterSize = true;\n });\n }\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 topbar.pinnedMessage?.setCorrectIndex(0); // * ะฑัƒะดัƒ ะผะพะปะธั‚ัŒัั ะฑะพะณะฐะผ, ั‡ั‚ะพะฑั‹ ัั‚ะพ ะฝะธั‡ะตะณะพ ะฝะต ัะปะพะผะฐะปะพ, ะฝะพ ัั‚ะพ ะธัะฟั€ะฐะฒะปัะตั‚ ะฟะพะปัƒั‡ะตะฝะธะต ะฟะธะฝะฝะตะดะฐ ะฟะพัะปะต ะฐะฝะธะผะฐั†ะธะธ\n\n this.managers.apiFileManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId);\n }, rootScope.settings.animationsEnabled ? 250 : 0, false, true);\n\n if(lottieLoader.setLoop(rootScope.settings.stickers.loop)) {\n animationIntersector.checkAnimations2(false);\n }\n\n for(const chat of this.chats) {\n chat.setAutoDownloadMedia();\n }\n\n I18n.setTimeFormat(rootScope.settings.timeFormat);\n\n this.toggleChatGradientAnimation(this.chat);\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 const types: string[] = await getFilesFromEvent(e, true);\n if(!isFiles || (!(await 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 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 this.log('drop', e);\n this.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 this.log('drop', e);\n this.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 this.log('drop', e);\n this.onDocumentPaste(e, 'media');\n }\n }));\n }\n\n this.chat.container.append(_dropsContainer);\n }\n }\n\n // if(!mount) return;\n\n SetTransition({\n element: _dropsContainer,\n className: 'is-visible',\n forwards: mount,\n duration: 200,\n onTransitionEnd: () => {\n if(!mount) {\n _drops.forEach((drop) => {\n drop.destroy();\n });\n\n _drops.length = 0;\n }\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 >= this.managers.appPhotosManager.windowW) || (e.pageY <= 0 || e.pageY >= this.managers.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 async canDrag() {\n const chat = this.chat;\n const peerId = chat?.peerId;\n return !(!peerId || overlayCounter.isOverlayActive || !(await chat.canSend('send_media')));\n }\n\n private onDocumentPaste = async(e: ClipboardEvent | DragEvent, attachType?: 'media' | 'document') => {\n const newMediaPopup = getCurrentNewMediaPopup();\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 const files = await getFilesFromEvent(e);\n if(!(await this.canDrag()) && !newMediaPopup) return;\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 PopupElement.createPopup(PopupNewMedia, this.chat, files, chatInput.willAttachType);\n }\n };\n\n private async overrideHash(peerId?: PeerId) {\n let str: string;\n if(peerId) {\n const username = await this.managers.appPeersManager.getPeerUsername(peerId);\n str = username ? '@' + username : '' + peerId;\n }\n\n appNavigationController.overrideHash(str);\n }\n\n public selectTab(id: APP_TABS, 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 === APP_TABS.CHATLIST);\n\n const prevTabId = this.tabId;\n if(prevTabId !== undefined) {\n this.overrideHash(id > APP_TABS.CHATLIST ? this.chat?.peerId : undefined);\n this.dispatchEvent('tab_changing', id);\n }\n\n this.log('selectTab', id, prevTabId);\n\n let animationPromise: Promise = rootScope.settings.animationsEnabled ? doubleRaf() : Promise.resolve();\n if(\n prevTabId !== undefined &&\n prevTabId !== id &&\n rootScope.settings.animationsEnabled &&\n animate !== false/* &&\n mediaSizes.activeScreen !== ScreenSize.large */\n ) {\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 === APP_TABS.PROFILE && id < APP_TABS.PROFILE) {\n document.body.classList.remove(RIGHT_COLUMN_ACTIVE_CLASSNAME);\n }\n\n if(prevTabId !== undefined && id > prevTabId) {\n if(id < APP_TABS.PROFILE || !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 const onImTabChange = (window as any).onImTabChange;\n onImTabChange && onImTabChange(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 return this.managers.appUsersManager.updateMyOnlineStatus(this.offline);\n }\n\n private createNewChat() {\n const chat = new Chat(\n this,\n this.managers\n );\n\n if(this.chats.length) {\n chat.setBackground(this.lastBackgroundUrl, 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 this.dispatchEvent('peer_changing', this.chat);\n }\n\n if(!spliced) {\n spliced = this.chats.splice(fromIndex, this.chats.length - fromIndex);\n }\n\n const chatTo = this.chat;\n this.dispatchEvent('chat_changing', {from: chatFrom, to: chatTo});\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(chatTo.container, animate);\n\n if(justReturn) {\n this.dispatchEvent('peer_changed', chatTo);\n\n const searchTab = appSidebarRight.getTab(AppPrivateSearchTab);\n searchTab?.close();\n\n appSidebarRight.replaceSharedMediaTab(chatTo.sharedMediaTab);\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 async setPeer(options: Partial = {}, animate?: boolean): Promise {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n options.peerId ??= NULL_PEER_ID;\n\n const {peerId, lastMsgId, threadId} = options;\n\n const chat = this.chat;\n const chatIndex = this.chats.indexOf(chat);\n const isSamePeer = this.isSamePeer(chat, options as any);\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 && !isSamePeer) {\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(isSamePeer && mediaSizes.activeScreen <= ScreenSize.medium && document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME)) {\n this.selectTab(APP_TABS.CHAT, animate);\n return false;\n }\n\n if(peerId || mediaSizes.activeScreen !== ScreenSize.mobile) {\n const result = await chat.setPeer(options as any as Parameters[0]);\n\n // * wait for cached render\n const promise = result?.cached ? result.promise : Promise.resolve();\n if(peerId) {\n Promise.all([\n promise,\n chat.setBackgroundPromise\n ]).then(() => {\n // window.requestAnimationFrame(() => {\n setTimeout(() => { // * setTimeout is better here\n setTimeout(() => {\n this.chatsSelectTab(this.chat.container);\n }, 0);\n this.selectTab(APP_TABS.CHAT, animate);\n }, 0);\n });\n }\n }\n\n if(!peerId) {\n this.selectTab(APP_TABS.CHATLIST, animate);\n return false;\n }\n }\n\n public async setInnerPeer(options: ChatSetInnerPeerOptions) {\n const {peerId} = options;\n if(peerId === NULL_PEER_ID || !peerId) {\n return;\n }\n\n if(!options.type) {\n if(options.threadId && !(await this.managers.appPeersManager.isForum(options.peerId))) {\n options.type = 'discussion';\n }\n\n options.type ??= 'chat';\n }\n\n // * reuse current chat\n const existingIndex = this.chats.findIndex((chat) => this.isSamePeer(chat, options) || (mediaSizes.activeScreen === ScreenSize.mobile && this.tabId === 0));\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 this.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 async getPeerTyping(peerId: PeerId, container?: HTMLElement, threadId?: number) {\n // const log = this.log.bindPrefix('getPeerTyping-' + peerId);\n // log('getting peer typing');\n\n const isUser = peerId.isUser();\n if(isUser && await this.managers.appUsersManager.isBot(peerId)) {\n // log('a bot');\n return;\n }\n\n const typings = await this.managers.appProfileManager.getPeerTypings(peerId, threadId);\n if(!typings?.length) {\n // log('have no typing');\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 = 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 // log('no langPackKey');\n return;\n }\n\n let peerTitlePromise: Promise;\n let args: any[];\n if(peerId.isAnyChat()) {\n const peerTitle = new PeerTitle();\n peerTitlePromise = peerTitle.update({peerId: typing.userId.toPeerId(false), onlyFirstName: true});\n args = [\n peerTitle.element,\n typings.length - 1\n ];\n\n await peerTitlePromise;\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 if(action._ === 'sendMessageEmojiInteractionSeen') {\n if(args) {\n args.pop();\n } else {\n args = [];\n }\n\n const span = htmlToSpan(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\n // log('returning typing');\n return container;\n }\n\n private async getChatStatus(chatId: ChatId, noTyping?: boolean): Promise> {\n const typingEl = noTyping ? undefined : await this.getPeerTyping(chatId.toPeerId(true));\n if(typingEl) {\n return {cached: true, result: Promise.resolve(typingEl)};\n }\n\n const result = await this.managers.acknowledged.appProfileManager.getChatFull(chatId);\n const dooo = async(chatInfo: ChatFull) => {\n // this.chat.log('chatInfo res:', chatInfo);\n\n const participants_count = (chatInfo as ChatFull.channelFull).participants_count ||\n ((chatInfo as ChatFull.chatFull).participants as ChatParticipants.chatParticipants)?.participants?.length ||\n 1;\n // if(participants_count) {\n let subtitle = await getChatMembersString(chatId);\n\n if(participants_count < 2) {\n return subtitle;\n }\n\n const onlines = await this.managers.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 };\n\n const promise = Promise.resolve(result.result).then(dooo);\n return {\n cached: result.cached,\n result: promise\n };\n }\n\n private async getUserStatus(userId: UserId, ignoreSelf?: boolean) {\n const result: AckedResult = {\n cached: true,\n result: Promise.resolve(undefined as HTMLElement)\n };\n\n const user = await this.managers.appUsersManager.getUser(userId);\n if(!user || (user.pFlags.self && !ignoreSelf)) {\n return result;\n }\n\n const subtitle = getUserStatusString(user);\n\n if(!user.pFlags.bot && !user.pFlags.support) {\n let typingEl = await this.getPeerTyping(userId.toPeerId());\n if(!typingEl && user.status?._ === 'userStatusOnline') {\n typingEl = document.createElement('span');\n typingEl.classList.add('online');\n typingEl.append(subtitle);\n }\n\n if(typingEl) {\n result.result = Promise.resolve(typingEl);\n return result;\n }\n }\n\n result.result = Promise.resolve(subtitle);\n return result;\n }\n\n private async getPeerStatus(peerId: PeerId, ignoreSelf?: boolean, noTyping?: boolean) {\n if(!peerId) return;\n let promise: Promise>;\n if(peerId.isAnyChat()) {\n promise = this.getChatStatus(peerId.toChatId(), noTyping);\n } else {\n promise = this.getUserStatus(peerId.toUserId(), ignoreSelf);\n }\n\n return promise;\n }\n\n public async setPeerStatus(options: {\n peerId: PeerId,\n element: HTMLElement,\n needClear: boolean,\n useWhitespace: boolean,\n middleware: () => boolean,\n ignoreSelf?: boolean,\n noTyping?: boolean\n }) {\n // const log = this.log.bindPrefix('status-' + peerId);\n // log('setting status', element);\n\n const {peerId, element, needClear, useWhitespace, middleware, ignoreSelf, noTyping} = options;\n\n if(!needClear) {\n // * good good good\n const typingContainer = element.querySelector('.peer-typing-container') as HTMLElement;\n if(typingContainer && await this.getPeerTyping(peerId, typingContainer)) {\n // log('already have a status');\n return;\n }\n }\n\n const result = await this.getPeerStatus(peerId, ignoreSelf, noTyping);\n // log('getPeerStatus result', result);\n if(!middleware()) {\n // log.warn('middleware');\n return;\n }\n\n const set = async() => {\n const subtitle = result && await result.result;\n if(!middleware()) {\n return;\n }\n\n return () => replaceContent(element, subtitle || placeholder);\n };\n\n const placeholder = useWhitespace ? NBSP : ''; // ! HERE U CAN FIND WHITESPACE\n if(!result || result.cached || needClear === undefined) {\n return await set();\n } else if(needClear) {\n return () => {\n element.textContent = placeholder;\n return set().then((callback) => callback?.());\n };\n }\n }\n\n public setChoosingStickerTyping(cancel: boolean) {\n this.managers.appMessagesManager.setTyping(this.chat.peerId, {_: cancel ? 'sendMessageCancelAction' : 'sendMessageChooseStickerAction'}, undefined, this.chat.threadId);\n }\n\n public isSamePeer(options1: {peerId: PeerId, threadId?: number, type?: ChatType}, options2: typeof options1) {\n return options1.peerId === options2.peerId &&\n options1.threadId === options2.threadId &&\n (typeof(options1.type) !== typeof(options2.type) || options1.type === options2.type);\n }\n}\n\nconst appImManager = new AppImManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appImManager = appImManager);\nexport default appImManager;\n","import {Message, MessageMedia} from '../../../../layer';\n\nexport default function canSaveMessageMedia(message: Message.message | Message.messageService) {\n return message &&\n !message.pFlags.is_outgoing &&\n !(message as Message.message).pFlags.noforwards &&\n !((message as Message.message).media as MessageMedia.messageMediaInvoice)?.extended_media\n}\n","import {Document, Message, MessageAction, MessageExtendedMedia, MessageMedia, Photo, WebPage} from '../../../../layer';\n\nexport default function getMediaFromMessage(message: Message) {\n if(!message) return;\n\n let media: any;\n if((message as Message.messageService).action) {\n media = ((message as Message.messageService).action as MessageAction.messageActionChannelEditPhoto).photo;\n } else if((message as Message.message).media) {\n let messageMedia = (message as Message.message).media;\n if((messageMedia as MessageMedia.messageMediaWebPage).webpage) {\n messageMedia = (messageMedia as MessageMedia.messageMediaWebPage).webpage as any as MessageMedia;\n } else if((messageMedia as MessageMedia.messageMediaInvoice).extended_media?._ === 'messageExtendedMedia') {\n messageMedia = ((messageMedia as MessageMedia.messageMediaInvoice).extended_media as MessageExtendedMedia.messageExtendedMedia).media;\n }\n\n media = (messageMedia as MessageMedia.messageMediaDocument).document ||\n (messageMedia as MessageMedia.messageMediaPhoto).photo;\n }\n\n return media as Photo.photo | Document.document;\n}\n","import {Message} from '../../../../layer';\nimport type {MyMessage} from '../../appMessagesManager';\n\nexport default function 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","import {isRestricted} from '../../../../helpers/restrictions';\nimport {Message} from '../../../../layer';\n\nexport default function isMessageRestricted(message: Message.message) {\n return !!(message.restriction_reason && isRestricted(message.restriction_reason));\n}\n","// https://github.com/eelcohn/Telegram-API/wiki/Calculating-color-for-a-Telegram-user-on-IRC\n/*\n HTML-color IRC-color Description\n #c03d33 4 red\n #4fad2d 3 green\n #d09306 7 yellow\n #168acd 10 blue\n #8544d6 6 purple\n #cd4073 13 pink\n #2996ad 11 sea\n #ce671b 5 orange\n*/\nconst DialogColorsFg = ['#fc5c51', '#0fb297', '#d09306', '#3d72ed', '#895dd5', '#cd4073', '#00c1a6', '#fa790f'];\nconst DialogColors = ['red', 'green', 'yellow', 'blue', 'violet', 'pink', 'cyan', 'orange'];\nconst DialogColorsMap = [0, 7, 4, 1, 6, 3, 5];\n\nexport default function getPeerColorById(peerId: PeerId, pic = true) {\n if(!peerId) return '';\n\n const idx = DialogColorsMap[Math.abs(+peerId) % 7];\n const color = (pic ? DialogColors : DialogColorsFg)[idx];\n return color;\n}\n","import {Chat, User} from '../../../../layer';\n\nexport default function getPeerEditableUsername(peer: User.user | Chat.channel) {\n if(peer.username) {\n return peer.username;\n }\n\n const usernames = peer.usernames;\n const username = usernames?.find((username) => username.pFlags.editable);\n return username?.username;\n}\n","import isObject from '../../../../helpers/object/isObject';\nimport {InputChannel, InputPeer, Peer} from '../../../../layer';\nimport {NULL_PEER_ID} from '../../../mtproto/mtproto_config';\n\nexport default function getPeerId(peerId: {user_id: UserId} | {channel_id: ChatId} | {chat_id: ChatId} | InputPeer | InputChannel | PeerId | string): PeerId {\n if(peerId !== undefined && ((peerId as string).isPeerId ? (peerId as string).isPeerId() : false)) return peerId as PeerId;\n // if(typeof(peerId) === 'string' && /^[uc]/.test(peerId)) return peerId as PeerId;\n // if(typeof(peerId) === 'number') return peerId;\n else if(isObject(peerId)) {\n const userId = (peerId as Peer.peerUser).user_id;\n if(userId !== undefined) {\n return userId.toPeerId(false);\n }\n\n const chatId = (peerId as Peer.peerChannel).channel_id || (peerId as Peer.peerChat).chat_id;\n if(chatId !== undefined) {\n return chatId.toPeerId(true);\n }\n\n return NULL_PEER_ID; // maybe it is an inputPeerSelf\n // } else if(!peerId) return 'u0';\n } else if(!peerId) return NULL_PEER_ID;\n\n const isUser = (peerId as string).charAt(0) === 'u';\n const peerParams = (peerId as string).substr(1).split('_');\n\n return isUser ? peerParams[0].toPeerId() : (peerParams[0] || '').toPeerId(true);\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 {MyDocument} from '../../appDocsManager';\nimport type {MyPhoto} from '../../appPhotosManager';\nimport type {PhotoSize, VideoSize, WebDocument} from '../../../../layer';\nimport calcImageInBox from '../../../../helpers/calcImageInBox';\nimport {THUMB_TYPE_FULL} from '../../../mtproto/mtproto_config';\n\nexport default function choosePhotoSize(\n photo: MyPhoto | MyDocument | WebDocument,\n boxWidth = 0,\n boxHeight = 0,\n useBytes = false,\n pushDocumentSize = false\n) {\n if(window.devicePixelRatio > 1) {\n boxWidth *= 2;\n boxHeight *= 2;\n }\n\n /*\n s box 100x100\n m box 320x320\n x box 800x800\n y box 1280x1280\n w box 2560x2560\n a crop 160x160\n b crop 320x320\n c crop 640x640\n d crop 1280x1280 */\n\n let sizes: PhotoSize[] = (photo as MyPhoto).sizes || (photo as MyDocument).thumbs as PhotoSize[];\n let bestPhotoSize: typeof sizes[0] = {_: 'photoSizeEmpty', type: THUMB_TYPE_FULL};\n if(pushDocumentSize && sizes && photo._ !== 'photo') {\n sizes = sizes.concat({\n _: 'photoSize',\n w: photo.w,\n h: photo.h,\n size: photo.size,\n type: THUMB_TYPE_FULL\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 * 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/safeAssign';\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 const 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 SDP from '../sdp';\nimport {CallSignalingData, P2PVideoCodec} from '../types';\nimport parseMediaSectionInfo from './parseMediaSectionInfo';\n\nexport default function parseSignalingData(sdp: SDP) {\n const info = parseMediaSectionInfo(sdp, sdp.media[0]);\n\n const data: CallSignalingData.initialSetup = {\n '@type': 'InitialSetup',\n 'fingerprints': [info.fingerprint],\n 'ufrag': info.ufrag,\n 'pwd': info.pwd,\n 'audio': undefined,\n 'video': undefined,\n 'screencast': undefined\n };\n\n const convertNumber = (number: number) => '' + number;\n\n for(const section of sdp.media) {\n const mediaType = section.mediaType;\n if(mediaType === 'application' || !section.isSending) {\n continue;\n }\n\n const codec: P2PVideoCodec = data[mediaType === 'video' && data['video'] ? 'screencast' : mediaType] = {} as any;\n const info = parseMediaSectionInfo(sdp, section);\n codec.ssrc = convertNumber(info.source);\n\n if(info.sourceGroups) {\n codec.ssrcGroups = info.sourceGroups.map((sourceGroup) => ({semantics: sourceGroup.semantics, ssrcs: sourceGroup.sources.map(convertNumber)}));\n }\n\n const rtpExtensions: P2PVideoCodec['rtpExtensions'] = codec.rtpExtensions = [];\n section.attributes.get('extmap').forEach((attribute) => {\n rtpExtensions.push({\n id: +attribute.key,\n uri: attribute.value\n });\n });\n\n const payloadTypesMap: Map = new Map();\n\n const getPayloadType = (id: number) => {\n let payloadType = payloadTypesMap.get(id);\n if(!payloadType) {\n payloadTypesMap.set(id, payloadType = {\n id\n } as any);\n }\n\n return payloadType;\n };\n\n section.attributes.get('rtpmap').forEach((attribute) => {\n const id = +attribute.key;\n const payloadType = getPayloadType(id);\n const splitted = attribute.value.split('/');\n const [name, clockrate, channels] = splitted;\n payloadType.name = name;\n payloadType.clockrate = +clockrate;\n payloadType.channels = channels ? +channels : 0;\n });\n\n section.attributes.get('rtcp-fb').forEach((attribute) => {\n const id = +attribute.key;\n const payloadType = getPayloadType(id);\n payloadType.feedbackTypes = attribute.lines.map((line) => {\n const splitted = line.split(' ');\n const [type, subtype] = splitted;\n return {\n type,\n subtype: subtype || ''\n };\n });\n });\n\n section.attributes.get('fmtp').forEach((attribute) => {\n const id = +attribute.key;\n const payloadType = getPayloadType(id);\n const parameters: P2PVideoCodec['payloadTypes'][0]['parameters'] = payloadType.parameters = {};\n const splitted = attribute.value.split(';');\n for(const str of splitted) {\n const [key, value] = str.split('=');\n parameters[key] = value;\n }\n });\n\n codec.payloadTypes = Array.from(payloadTypesMap.values());\n\n /* if(codec.payloadTypes.length > 5) {\n codec.payloadTypes.length = Math.min(codec.payloadTypes.length, 5);\n } */\n }\n\n return data;\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 CallConnectionInstanceBase, {CallConnectionInstanceOptions} from './callConnectionInstanceBase';\nimport CallInstance from './callInstance';\nimport parseSignalingData from './helpers/parseSignalingData';\nimport {parseSdp} from './sdp/utils';\n\nexport default class CallConnectionInstance extends CallConnectionInstanceBase {\n private call: CallInstance;\n\n constructor(options: CallConnectionInstanceOptions & {\n call: CallConnectionInstance['call']\n }) {\n super(options);\n }\n\n protected async negotiateInternal() {\n const {connection, call} = this;\n\n if(!connection.localDescription && !connection.remoteDescription && !call.isOutgoing) {\n return;\n }\n\n let descriptionInit: RTCSessionDescriptionInit;\n if(call.offerReceived) {\n call.offerReceived = false;\n\n const answer = descriptionInit = await connection.createAnswer();\n\n this.log('[sdp] local', answer.type, answer.sdp);\n await connection.setLocalDescription(answer);\n\n this.log('[InitialSetup] send 2');\n } else {\n const offer = descriptionInit = await connection.createOffer();\n\n this.log('[sdp] local', offer.sdp);\n await connection.setLocalDescription(offer);\n\n call.offerSent = true;\n\n this.log('[InitialSetup] send 0');\n }\n\n const initialSetup = parseSignalingData(parseSdp(descriptionInit.sdp));\n call.sendCallSignalingData(initialSetup);\n }\n}\n","const subtle = typeof(window) !== 'undefined' && 'crypto' in window ? window.crypto.subtle : self.crypto.subtle;\n\nexport default subtle;\n","/*\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 bufferConcats from '../../../helpers/bytes/bufferConcats';\nimport subtle from '../../crypto/subtle';\nimport sha256 from '../../crypto/utils/sha256';\n\nconst kMaxIncomingPacketSize = 128 * 1024 * 1024;\n\nexport default class P2PEncryptor {\n private type: 'Signaling';\n private counter: number;\n private seqMap: Map;\n\n constructor(private isOutgoing: boolean, private p2pKey: Uint8Array) {\n this.type = 'Signaling';\n this.counter = 0;\n this.seqMap = new Map();\n }\n\n private concatSHA256(parts: Uint8Array[]) {\n return sha256(bufferConcats(...parts));\n }\n\n private async encryptPrepared(buffer: Uint8Array) {\n const result = {\n counter: 0, // this.counterFromSeq(this.readSeq(buffer)),\n bytes: new Uint8Array(16 + buffer.length)\n };\n\n const x = (this.isOutgoing ? 0 : 8) + (this.type === 'Signaling' ? 128 : 0);\n const key = this.p2pKey;\n\n const msgKeyLarge = await this.concatSHA256([key.subarray(x + 88, x + 88 + 32), buffer]);\n const msgKey = result.bytes;\n for(let i = 0; i < 16; ++i) {\n msgKey[i] = msgKeyLarge[i + 8];\n }\n\n const aesKeyIv = await this.prepareAesKeyIv(key, msgKey, x);\n\n const bytes = await this.aesProcessCtr(buffer, buffer.length, aesKeyIv, true);\n\n result.bytes = new Uint8Array([...result.bytes.subarray(0, 16), ...bytes]);\n\n return result;\n }\n\n public encryptRawPacket(buffer: Uint8Array) {\n const seq = ++this.counter;\n const arr = new ArrayBuffer(4);\n const view = new DataView(arr);\n view.setUint32(0, seq >>> 0, false); // byteOffset = 0; litteEndian = false\n\n const result = new Uint8Array([...new Uint8Array(arr), ...buffer]);\n\n return this.encryptPrepared(result);\n }\n\n private async prepareAesKeyIv(key: Uint8Array, msgKey: Uint8Array, x: number) {\n const [sha256a, sha256b] = await Promise.all([\n this.concatSHA256([\n msgKey.subarray(0, 16),\n key.subarray(x, x + 36)\n ]),\n\n this.concatSHA256([\n key.subarray(40 + x, 40 + x + 36),\n msgKey.subarray(0, 16)\n ])\n ]);\n\n return {\n key: new Uint8Array([\n ...sha256a.subarray(0, 8),\n ...sha256b.subarray(8, 8 + 16),\n ...sha256a.subarray(24, 24 + 8)\n ]),\n iv: new Uint8Array([\n ...sha256b.subarray(0, 4),\n ...sha256a.subarray(8, 8 + 8),\n ...sha256b.subarray(24, 24 + 4)\n ])\n };\n }\n\n private async aesProcessCtr(encryptedData: Uint8Array, dataSize: number, aesKeyIv: {key: Uint8Array, iv: Uint8Array}, encrypt = true) {\n const cryptoKey = await subtle.importKey(\n 'raw',\n aesKeyIv.key,\n {name: 'AES-CTR'},\n false,\n [encrypt ? 'encrypt' : 'decrypt']\n );\n\n const buffer: ArrayBuffer = await subtle[encrypt ? 'encrypt' : 'decrypt']({\n name: 'AES-CTR',\n counter: aesKeyIv.iv,\n length: aesKeyIv.iv.length * 8\n },\n cryptoKey,\n encryptedData\n );\n\n return new Uint8Array(buffer);\n }\n\n private constTimeIsDifferent(a: Uint8Array, b: Uint8Array, count: number) {\n let msgKeyEquals = true;\n for(let i = 0; i < count; ++i) {\n if(a[i] !== b[i]) {\n msgKeyEquals = false;\n }\n }\n\n return !msgKeyEquals;\n }\n\n public async decryptRawPacket(buffer: Uint8Array) {\n if(buffer.length < 21 || buffer.length > kMaxIncomingPacketSize) {\n return;\n }\n\n const {isOutgoing, type} = this;\n\n const x = (isOutgoing ? 8 : 0) + (type === 'Signaling' ? 128 : 0);\n const key = this.p2pKey;\n\n const msgKey = buffer.subarray(0, 16);\n const encryptedData = buffer.subarray(16);\n const encryptedDataSize = buffer.length - 16;\n\n const aesKeyIv = await this.prepareAesKeyIv(key, msgKey, x);\n\n const decryptionBuffer = await this.aesProcessCtr(encryptedData, encryptedDataSize, aesKeyIv, false);\n\n const msgKeyLarge = await this.concatSHA256([\n key.subarray(88 + x, 88 + x + 32),\n decryptionBuffer\n ]);\n\n if(this.constTimeIsDifferent(msgKeyLarge.subarray(8), msgKey, 16)) {\n return;\n }\n\n const dataView = new DataView(decryptionBuffer.buffer);\n const seq = dataView.getUint32(0);\n if(this.seqMap.has(seq)) {\n return;\n }\n this.seqMap.set(seq, seq);\n\n return decryptionBuffer.slice(4);\n }\n}\n","import convertToUint8Array from '../../../helpers/bytes/convertToUint8Array';\nimport subtle from '../subtle';\n// import sha256 from '@cryptography/sha256';\n\nexport default function sha256(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","/*\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 StringFromLineBuilder from '../stringFromLineBuilder';\nimport {addDataChannel, addExtmap, addPayloadTypes, addSsrc} from './p2PSdpBuilder';\n\nexport default class ChromeP2PSdpBuilder {\n static generateOffer(info: any) {\n const {fingerprints, ufrag, pwd, audio, video} = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n const stringBuilder = new StringFromLineBuilder();\n stringBuilder.add(\n 'v=0',\n 'o=- 1 2 IN IP4 127.0.0.1',\n 's=-',\n 't=0 0'\n );\n\n if(fingerprints) {\n fingerprints.forEach((x: any) => {\n const {hash, fingerprint, setup} = x;\n stringBuilder.add(\n `a=fingerprint:${hash} ${fingerprint}`,\n `a=setup:${setup}`\n );\n });\n }\n if(ufrag && pwd) {\n stringBuilder.add(\n `a=ice-ufrag:${ufrag}`,\n `a=ice-pwd:${pwd}`\n );\n }\n\n stringBuilder.add(\n 'a=group:BUNDLE 0 1 2',\n 'a=extmap-allow-mixed',\n 'a=msid-semantic: WMS *'\n );\n const streamName = 'stream' + media.map((x) => x.ssrc).join('_');\n for(let i = 0; i < media.length; i++) {\n const m = media[i];\n const {type, ssrc, ssrcGroups, payloadTypes, rtpExtensions} = m;\n switch(type) {\n case 'audio': {\n stringBuilder.add(\n `m=audio 56930 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} audio${ssrc}`);\n }\n stringBuilder.add(\n 'a=rtcp-mux',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n\n break;\n }\n\n case 'video': {\n stringBuilder.add(\n `m=video 61986 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} video${ssrc}`);\n }\n stringBuilder.add(\n 'a=rtcp-mux',\n 'a=rtcp-rsize',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n break;\n }\n }\n }\n stringBuilder.add(addDataChannel(2));\n return stringBuilder.finalize();\n }\n\n static generateAnswer(info: any) {\n const {fingerprints, ufrag, pwd, audio, video} = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n const stringBuilder = new StringFromLineBuilder();\n stringBuilder.add(\n 'v=0',\n 'o=- 1 2 IN IP4 127.0.0.1',\n 's=-',\n 't=0 0'\n );\n\n if(fingerprints) {\n fingerprints.forEach((x: any) => {\n const {hash, fingerprint, setup} = x;\n stringBuilder.add(\n `a=fingerprint:${hash} ${fingerprint}`,\n `a=setup:${setup}`\n );\n });\n }\n if(ufrag && pwd) {\n stringBuilder.add(\n `a=ice-ufrag:${ufrag}`,\n `a=ice-pwd:${pwd}`\n );\n }\n\n stringBuilder.add(\n 'a=group:BUNDLE 0 1 2',\n 'a=extmap-allow-mixed',\n 'a=msid-semantic: WMS *'\n );\n const streamName = 'stream' + media.map((x) => x.ssrc).join('_');\n for(let i = 0; i < media.length; i++) {\n const m = media[i];\n const {type, ssrc, ssrcGroups, payloadTypes, rtpExtensions} = m;\n switch(type) {\n case 'audio': {\n stringBuilder.add(\n `m=audio 56930 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} audio${ssrc}`);\n }\n stringBuilder.add(\n 'a=rtcp-mux',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n break;\n }\n\n case 'video': {\n stringBuilder.add(\n `m=video 61986 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} video${ssrc}`);\n }\n\n stringBuilder.add(\n 'a=rtcp-mux',\n 'a=rtcp-rsize',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n break;\n }\n }\n }\n stringBuilder.add(addDataChannel(2));\n return stringBuilder.finalize();\n }\n}\n","/*\n* Copyright (c) 2018-present, Evgeny Nadymov\n*\n* This source code is licensed under the GPL v.3.0 license found in the\n* LICENSE file in the root directory of this source tree.\n*/\n\nimport ChromeP2PSdpBuilder from './chromeP2PSdpBuilder';\nimport { FirefoxP2PSdpBuilder } from './firefoxP2PSdpBuilder';\nimport { SafariP2PSdpBuilder } from './safariP2PSdpBuilder';\n// import { TG_CALLS_SDP_STRING } from '../../Stores/CallStore';\n\nexport function p2pParseCandidate(candidate) {\n if(!candidate || !candidate.startsWith('candidate:')) {\n return;\n }\n \n const sdpString = candidate;\n candidate = candidate.substr('candidate:'.length);\n \n const [foundation, component, protocol, priority, ip, port, ...other] = candidate.split(' ');\n const c = {\n sdpString,\n foundation,\n component,\n protocol,\n priority,\n address: { ip, port }\n };\n \n for(let i = 0; i < other.length; i += 2) {\n switch(other[i]) {\n case 'typ': {\n c.type = other[i + 1];\n break;\n }\n case 'raddr': {\n if(!c.relAddress) {\n c.relAddress = {};\n }\n \n c.relAddress.ip = other[i + 1];\n break;\n }\n case 'rport': {\n if(!c.relAddress) {\n c.relAddress = {};\n }\n \n c.relAddress.port = other[i + 1];\n break;\n }\n case 'generation': {\n c.generation = other[i + 1];\n break;\n }\n case 'tcptype': {\n c.tcpType = other[i + 1];\n break;\n }\n case 'network-id': {\n c.networkId = other[i + 1];\n break;\n }\n case 'network-cost': {\n c.networkCost = other[i + 1];\n break;\n }\n case 'ufrag': {\n c.username = other[i + 1];\n break;\n }\n }\n }\n \n return c;\n}\n\nexport function p2pParseSdp(sdp) {\n const lines = sdp.split('\\r\\n');\n const lookup = (prefix, force = true, lineFrom = 0, lineTo = Number.MAX_VALUE) => {\n if (lineTo === -1) {\n lineTo = Number.MAX_VALUE;\n }\n for (let i = lineFrom; i < lines.length && i < lineTo; i++) {\n const line = lines[i];\n if (line.startsWith(prefix)) {\n return line.substr(prefix.length);\n }\n }\n \n if (force) {\n console.error(\"Can't find prefix\", prefix);\n }\n \n return null;\n };\n const findIndex = (prefix, lineFrom = 0, lineTo = Number.MAX_VALUE) => {\n if (lineTo === -1) {\n lineTo = Number.MAX_VALUE;\n }\n for (let i = lineFrom; i < lines.length && i < lineTo; i++) {\n const line = lines[i];\n if (line.startsWith(prefix)) {\n return i;\n }\n }\n \n return -1;\n };\n \n const pwdIndex = findIndex('a=ice-pwd:');\n const ufragIndex = findIndex('a=ice-ufrag:');\n if (pwdIndex === -1 && ufragIndex === -1) {\n return {\n // sessionId: lookup('o=').split(' ')[1],\n ufrag: null,\n pwd: null,\n fingerprints: []\n };\n }\n \n const info = {\n // sessionId: lookup('o=').split(' ')[1],\n ufrag: null,\n pwd: null,\n fingerprints: []\n };\n \n let mediaIndex = findIndex('m=');\n const fingerprint = lookup('a=fingerprint:', false);\n const setup = lookup('a=setup:', false);\n if (fingerprint && setup) {\n info.fingerprints.push({\n hash: fingerprint.split(' ')[0],\n fingerprint: fingerprint.split(' ')[1],\n setup\n });\n }\n \n const ufrag = lookup('a=ice-ufrag:', false);\n const pwd = lookup('a=ice-pwd:', false);\n if (ufrag && pwd) {\n info.ufrag = ufrag;\n info.pwd = pwd;\n }\n \n while (mediaIndex !== -1) {\n let nextMediaIndex = findIndex('m=', mediaIndex + 1);\n \n const extmap = [];\n const types = [];\n const mediaType = lookup('m=', true, mediaIndex, nextMediaIndex).split(' ')[0];\n const media = {\n // type: lookup('m=', true, mediaIndex, nextMediaIndex).split(' ')[0],\n // mid: lookup('a=mid:', true, mediaIndex, nextMediaIndex),\n // dir: findDirection(mediaIndex, nextMediaIndex),\n rtpExtensions: extmap,\n payloadTypes: types\n }\n \n const lineTo = nextMediaIndex === -1 ? lines.length : nextMediaIndex;\n const fmtp = new Map();\n const rtcpFb = new Map();\n for (let i = mediaIndex; i < lineTo; i++) {\n const line = lines[i];\n if (line.startsWith('a=extmap:')) {\n const [ id, uri ] = line.substr('a=extmap:'.length).split(' ');\n extmap.push({ id: parseInt(id), uri });\n } else if (line.startsWith('a=fmtp:')) {\n const [ id, str ] = line.substr('a=fmtp:'.length).split(' ');\n const obj = { };\n const arr = str.split(';').map(x => {\n const [ key, value ] = x.split('=');\n obj[key] = value;\n return { [key]: value };\n });\n fmtp.set(parseInt(id), obj);\n } else if (line.startsWith('a=rtcp-fb:')) {\n const [ id, type = '', subtype = '' ] = line.substr('a=rtcp-fb:'.length).split(' ');\n if (rtcpFb.has(parseInt(id))) {\n rtcpFb.get(parseInt(id)).push({ type, subtype });\n } else {\n rtcpFb.set(parseInt(id), [{ type, subtype }])\n }\n } else if (line.startsWith('a=rtpmap')) {\n const [ id, str ] = line.substr('a=rtpmap:'.length).split(' ');\n const [ name, clockrate, channels = '0' ] = str.split('/');\n const obj = { id: parseInt(id), name, clockrate: parseInt(clockrate), channels: parseInt(channels) };\n \n types.push(obj);\n }\n }\n \n for (let i = 0; i < types.length; i++) {\n const { id } = types[i];\n if (rtcpFb.has(id)) {\n types[i].feedbackTypes = rtcpFb.get(id);\n }\n if (fmtp.has(id)) {\n types[i].parameters = fmtp.get(id);\n }\n }\n \n const ssrc = lookup('a=ssrc:', false, mediaIndex, nextMediaIndex);\n if (ssrc) {\n media.ssrc = ssrc.split(' ')[0];\n }\n \n const ssrcGroup = lookup('a=ssrc-group:', false, mediaIndex, nextMediaIndex);\n if (ssrcGroup) {\n const [ semantics, ...ssrcs ] = ssrcGroup.split(' ');\n media.ssrcGroups = [{\n semantics,\n ssrcs\n }]\n }\n \n switch (mediaType) {\n case 'audio': {\n info.audio = media;\n break;\n }\n case 'video': {\n info.video = media;\n break;\n }\n }\n \n mediaIndex = nextMediaIndex;\n }\n\n if(!info.video.ssrcGroups) {\n info.video.ssrcGroups = [];\n }\n\n info['@type'] = 'InitialSetup';\n \n // console.log('[p2pParseSdp]', sdp, info);\n return info;\n}\n\nexport function isFirefox() {\n return navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n}\n\nfunction isSafari() {\n return navigator.userAgent.toLowerCase().indexOf('safari') > -1 && navigator.userAgent.toLowerCase().indexOf('chrome') === -1;\n}\n\nexport function addExtmap(extmap) {\n let sdp = [];\n // return sdp;\n for (let j = 0; j < extmap.length; j++) {\n const ext = extmap[j];\n const { id, uri } = ext;\n // if (isFirefox() && uri.indexOf(''))\n console.log('[extmap] add', id, uri);\n sdp.push(`a=extmap:${id} ${uri}`);\n }\n \n return sdp.join('\\n');\n}\n\nexport function addPayloadTypes(types) {\n let sdp = [];\n console.log('[SDP] addPayloadTypes', types);\n for (let i = 0; i < types.length; i++) {\n const type = types[i];\n const { id, name, clockrate, channels, feedbackTypes, parameters } = type;\n sdp.push(`a=rtpmap:${id} ${name}/${clockrate}${channels ? '/' + channels : ''}`);\n if (feedbackTypes) {\n feedbackTypes.forEach(x => {\n const { type, subtype } = x;\n sdp.push(`a=rtcp-fb:${id} ${[type, subtype].join(' ')}`);\n });\n }\n if (parameters) {\n const fmtp = [];\n Object.getOwnPropertyNames(parameters).forEach(pName => {\n fmtp.push(`${pName}=${parameters[pName]}`);\n });\n \n sdp.push(`a=fmtp:${id} ${fmtp.join(';')}`);\n }\n }\n \n return sdp.join('\\n');\n}\n\nexport function addSsrc(type, ssrc, ssrcGroups, streamName) {\n let sdp = [];\n \n if (ssrcGroups && ssrcGroups.length > 0) {\n ssrcGroups.forEach(ssrcGroup => {\n if (ssrcGroup && ssrcGroup.ssrcs.length > 0) {\n sdp.push(`a=ssrc-group:${ssrcGroup.semantics} ${ssrcGroup.ssrcs.join(' ')}`);\n ssrcGroup.ssrcs.forEach(ssrc => {\n sdp.push(\n `a=ssrc:${ssrc} cname:stream${ssrc}`,\n `a=ssrc:${ssrc} msid:${streamName} ${type}${ssrc}`,\n `a=ssrc:${ssrc} mslabel:${type}${ssrc}`,\n `a=ssrc:${ssrc} label:${type}${ssrc}`\n );\n });\n }\n });\n } else if (ssrc) {\n sdp.push(\n `a=ssrc:${ssrc} cname:stream${ssrc}`,\n `a=ssrc:${ssrc} msid:${streamName} ${type}${ssrc}`,\n `a=ssrc:${ssrc} mslabel:${type}${ssrc}`,\n `a=ssrc:${ssrc} label:${type}${ssrc}`\n );\n }\n \n return sdp.join('\\n');\n}\n\nexport function addDataChannel(mid) {\n return `m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144`;\n}\n\nexport class P2PSdpBuilder {\n static generateCandidate(info) {\n if (!info) return null;\n \n const { sdpString, sdpMLineIndex, sdpMid, foundation, component, protocol, priority, address, type, relAddress, generation, tcpType, networkId, networkCost, username } = info;\n if (/* TG_CALLS_SDP_STRING */true) {\n if (sdpString) {\n return {\n candidate: sdpString,\n sdpMLineIndex,\n sdpMid\n };\n }\n }\n throw 'no sdpString';\n \n let candidate = `candidate:${foundation} ${component} ${protocol} ${priority} ${address.ip} ${address.port}`;\n const attrs = []\n if (type) {\n attrs.push(`typ ${type}`);\n }\n if (relAddress) {\n attrs.push(`raddr ${relAddress.ip}`);\n attrs.push(`rport ${relAddress.port}`);\n }\n if (tcpType) {\n attrs.push(`tcptype ${tcpType}`);\n }\n if (generation) {\n attrs.push(`generation ${generation}`);\n }\n if (username) {\n attrs.push(`ufrag ${username}`);\n }\n if (networkId) {\n attrs.push(`network-id ${networkId}`);\n }\n if (networkCost) {\n attrs.push(`network-cost ${networkCost}`);\n }\n if (attrs.length > 0) {\n candidate += ` ${attrs.join(' ')}`;\n }\n \n return { candidate, sdpMid, sdpMLineIndex };\n }\n \n static generateOffer(info) {\n if (isFirefox()) {\n return FirefoxP2PSdpBuilder.generateOffer(info);\n } else if (isSafari()) {\n return SafariP2PSdpBuilder.generateOffer(info);\n }\n \n return ChromeP2PSdpBuilder.generateOffer(info);\n }\n \n static generateAnswer(info) {\n if (isFirefox()) {\n return FirefoxP2PSdpBuilder.generateAnswer(info);\n } else if (isSafari()) {\n return SafariP2PSdpBuilder.generateAnswer(info);\n }\n \n return ChromeP2PSdpBuilder.generateAnswer(info);\n }\n}","/*\n * Copyright (c) 2018-present, Evgeny Nadymov\n *\n * This source code is licensed under the GPL v.3.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { addDataChannel, addExtmap, addPayloadTypes, addSsrc } from './p2PSdpBuilder';\n\nexport class FirefoxP2PSdpBuilder {\n static generateOffer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n let sdp = `v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, ssrc, ssrcGroups, payloadTypes, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n\n static generateAnswer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n let sdp = `v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, mid, ssrc, ssrcGroups, payloadTypes, dir, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n}","/*\n * Copyright (c) 2018-present, Evgeny Nadymov\n *\n * This source code is licensed under the GPL v.3.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { addDataChannel, addExtmap, addPayloadTypes, addSsrc } from './p2PSdpBuilder';\n\nexport class SafariP2PSdpBuilder {\n static generateOffer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n if (!media.length) {\n return `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n`;\n }\n\n let sdp = `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, ssrc, ssrcGroups, payloadTypes, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} audio${ssrc}`;\n }\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} video${ssrc}`;\n }\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n\n static generateAnswer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n if (!media.length) {\n return `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n`;\n }\n\n let sdp = `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, ssrc, ssrcGroups, payloadTypes, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} audio${ssrc}`;\n }\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} video${ssrc}`;\n }\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\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 {IS_SAFARI} from '../../environment/userAgent';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport debounce from '../../helpers/schedulers/debounce';\nimport {GroupCallParticipantVideoSourceGroup, PhoneCall, PhoneCallDiscardReason, PhoneCallProtocol, Update} from '../../layer';\nimport {emojiFromCodePoints} from '../../vendor/emoji';\nimport type {CallId} from '../appManagers/appCallsManager';\nimport type {AppManagers} from '../appManagers/managers';\nimport {logger} from '../logger';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport CallConnectionInstance from './callConnectionInstance';\nimport CallInstanceBase from './callInstanceBase';\nimport callsController from './callsController';\nimport CALL_STATE from './callState';\nimport {GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS} from './constants';\nimport parseSignalingData from './helpers/parseSignalingData';\nimport stopTrack from './helpers/stopTrack';\nimport localConferenceDescription, {ConferenceEntry, generateSsrc} from './localConferenceDescription';\nimport getCallProtocol from './p2P/getCallProtocol';\nimport getRtcConfiguration from './p2P/getRtcConfiguration';\nimport P2PEncryptor from './p2P/p2PEncryptor';\nimport {p2pParseCandidate, P2PSdpBuilder} from './p2P/p2PSdpBuilder';\nimport {parseSdp} from './sdp/utils';\nimport {WebRTCLineType} from './sdpBuilder';\nimport StreamManager from './streamManager';\nimport {AudioCodec, CallMediaState, CallSignalingData, DiffieHellmanInfo, P2PAudioCodec, P2PVideoCodec, VideoCodec} from './types';\n\nexport default class CallInstance extends CallInstanceBase<{\n state: (state: CALL_STATE) => void,\n id: (id: CallId, prevId: CallId) => void,\n muted: (muted: boolean) => void,\n mediaState: (mediaState: CallMediaState) => void,\n acceptCallOverride: () => Promise,\n}> {\n public dh: Partial;\n public id: CallId;\n public call: PhoneCall;\n public interlocutorUserId: UserId;\n public protocol: PhoneCallProtocol;\n public isOutgoing: boolean;\n public encryptionKey: Uint8Array;\n public connectionInstance: CallConnectionInstance;\n public encryptor: P2PEncryptor;\n public decryptor: P2PEncryptor;\n public candidates: RTCIceCandidate[];\n\n public offerReceived: boolean;\n public offerSent: boolean;\n\n public createdParticipantEntries: boolean;\n public release: () => Promise;\n public _connectionState: CALL_STATE;\n\n public createdAt: number;\n public connectedAt: number;\n public discardReason: string;\n\n private managers: AppManagers;\n\n private hangUpTimeout: number;\n\n private mediaStates: {\n input: CallMediaState,\n output?: CallMediaState\n };\n\n private sendMediaState: () => Promise;\n\n private decryptQueue: Uint8Array[];\n\n private getEmojisFingerprintPromise: Promise;\n private emojisFingerprint: [string, string, string, string];\n\n private wasStartingScreen: boolean;\n private wasStartingVideo: boolean;\n public wasTryingToJoin: boolean;\n\n public streamManager: StreamManager;\n\n constructor(options: {\n isOutgoing: boolean,\n interlocutorUserId: UserId,\n managers: CallInstance['managers'],\n protocol?: PhoneCallProtocol\n }) {\n super();\n\n this.log = logger('CALL');\n\n if(!this.protocol) {\n this.protocol = getCallProtocol();\n }\n\n safeAssign(this, options);\n\n this.createdAt = Date.now();\n this.offerReceived = false;\n this.offerSent = false;\n this.decryptQueue = [];\n this.candidates = [];\n\n this.addEventListener('state', (state) => {\n this.log('state', CALL_STATE[state]);\n\n if(state === CALL_STATE.CLOSED) {\n this.cleanup();\n }\n });\n\n const streamManager = this.streamManager = new StreamManager(GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS);\n streamManager.direction = 'sendrecv';\n streamManager.types.push('screencast');\n if(!this.isOutgoing) {\n streamManager.locked = true;\n streamManager.canCreateConferenceEntry = false;\n }\n\n let mediaState: CallMediaState = {\n '@type': 'MediaState',\n 'type': 'input',\n 'lowBattery': false,\n 'muted': true,\n 'screencastState': 'inactive',\n 'videoRotation': 0,\n 'videoState': 'inactive'\n };\n\n const self = this;\n mediaState = new Proxy(mediaState, {\n set: function(target, key, value) {\n // @ts-ignore\n target[key] = value;\n self.setMediaState(mediaState);\n self.sendMediaState();\n return true;\n }\n });\n\n this.mediaStates = {\n input: mediaState\n };\n\n this.sendMediaState = debounce(this._sendMediaState.bind(this), 0, false, true);\n }\n\n get connectionState() {\n const {_connectionState, connectionInstance} = this;\n if(_connectionState !== undefined) {\n return _connectionState;\n } else if(!connectionInstance) {\n return CALL_STATE.CONNECTING;\n } else {\n const {iceConnectionState} = connectionInstance.connection;\n if(iceConnectionState === 'closed') {\n return CALL_STATE.CLOSED;\n } else if(iceConnectionState !== 'connected' && (!IS_SAFARI || iceConnectionState !== 'completed')) {\n return CALL_STATE.CONNECTING;\n } else {\n return CALL_STATE.CONNECTED;\n }\n }\n }\n\n get sortIndex() {\n const connectionState = this.connectionState;\n const state = CALL_STATE.CLOSED - connectionState + 1;\n let index = state * 10000000000000;\n index += 2147483647000 - (connectionState === CALL_STATE.PENDING && this.isOutgoing ? 0 : this.createdAt);\n return index;\n }\n\n public getVideoElement(type: CallMediaState['type']) {\n if(type === 'input') return this.elements.get('main');\n else {\n const mediaState = this.getMediaState('output');\n if(!mediaState) {\n return;\n }\n\n const type: WebRTCLineType = mediaState.videoState === 'active' ? 'video' : (mediaState.screencastState === 'active' ? 'screencast' : undefined);\n if(!type) {\n return;\n }\n\n const entry = this.description.findEntry((entry) => entry.type === type);\n if(!entry) {\n return;\n }\n\n return this.elements.get('' + entry.recvEntry.source);\n }\n }\n\n public async startScreenSharingInternal() {\n try {\n this.wasStartingScreen = true;\n this.wasStartingVideo = false;\n this.streamManager.types = ['audio', 'screencast'];\n await this.requestScreen();\n } catch(err) {\n this.log.error('startScreenSharing error', err);\n }\n }\n\n public async toggleScreenSharing() {\n if(this.isSharingVideo) {\n await this.stopVideoSharing();\n }\n\n if(this.isSharingScreen) {\n return this.stopVideoSharing();\n } else {\n return this.startScreenSharingInternal();\n }\n }\n\n public async startVideoSharingInternal() {\n try {\n this.wasStartingScreen = false;\n this.wasStartingVideo = true;\n this.streamManager.types = ['audio', 'video'];\n await this.requestInputSource(false, true, false);\n } catch(err) {\n this.log.error('startVideoSharing error', err);\n }\n }\n\n public async stopVideoSharing() {\n const mediaState = this.getMediaState('input');\n mediaState.videoState = mediaState.screencastState = 'inactive';\n\n const {streamManager, description} = this;\n const track = streamManager.inputStream.getVideoTracks()[0];\n if(track) {\n stopTrack(track);\n streamManager.appendToConference(description); // clear sender track\n }\n }\n\n public async toggleVideoSharing() {\n if(this.isSharingScreen) {\n await this.stopVideoSharing();\n }\n\n if(this.isSharingVideo) {\n return this.stopVideoSharing();\n } else {\n return this.startVideoSharingInternal();\n }\n }\n\n public getMediaState(type: CallMediaState['type']) {\n return this.mediaStates[type];\n }\n\n public setMediaState(mediaState: CallMediaState) {\n this.mediaStates[mediaState.type] = mediaState;\n this.dispatchEvent('mediaState', mediaState);\n }\n\n public isSharingVideoType(type: 'video' | 'screencast') {\n try {\n const hasVideoTrack = super.isSharingVideo;\n return hasVideoTrack && !!((this.wasStartingScreen && type === 'screencast') || (this.wasStartingVideo && type === 'video'));\n\n // ! it will be used before the track appears\n // return !!this.description.entries.find((entry) => entry.type === type && entry.transceiver.sender.track.enabled);\n } catch(err) {\n return false;\n }\n }\n\n public get isSharingVideo() {\n return this.isSharingVideoType('video');\n }\n\n public get isSharingScreen() {\n return this.isSharingVideoType('screencast');\n }\n\n public get isMuted() {\n const audioTrack = this.streamManager.inputStream.getAudioTracks()[0];\n return !audioTrack?.enabled;\n }\n\n public get isClosing() {\n const {connectionState} = this;\n return connectionState === CALL_STATE.CLOSING || connectionState === CALL_STATE.CLOSED;\n }\n\n public get description(): localConferenceDescription {\n return this.connectionInstance?.description;\n }\n\n public setHangUpTimeout(timeout: number, reason: PhoneCallDiscardReason['_']) {\n this.clearHangUpTimeout();\n this.hangUpTimeout = ctx.setTimeout(() => {\n this.hangUpTimeout = undefined;\n this.hangUp(reason);\n }, timeout);\n }\n\n public clearHangUpTimeout() {\n if(this.hangUpTimeout !== undefined) {\n clearTimeout(this.hangUpTimeout);\n this.hangUpTimeout = undefined;\n }\n }\n\n public setPhoneCall(phoneCall: PhoneCall) {\n this.call = phoneCall;\n\n const {id} = phoneCall;\n if(this.id !== id) {\n const prevId = this.id;\n this.id = id;\n this.dispatchEvent('id', id, prevId);\n }\n }\n\n public async acceptCall() {\n const canAccept = (await Promise.all(this.dispatchResultableEvent('acceptCallOverride')))[0] ?? true;\n if(this.isClosing || !canAccept) {\n return;\n }\n\n // this.clearHangUpTimeout();\n this.overrideConnectionState(CALL_STATE.EXCHANGING_KEYS);\n\n const call = this.call as PhoneCall.phoneCallRequested;\n this.requestInputSource(true, !!call.pFlags.video, false);\n\n const g_a_hash = call.g_a_hash;\n this.managers.appCallsManager.generateDh().then(async(dh) => {\n this.dh = { // ! it is correct\n g_a_hash,\n b: dh.a,\n g_b: dh.g_a,\n g_b_hash: dh.g_a_hash,\n p: dh.p\n };\n\n return this.managers.apiManager.invokeApi('phone.acceptCall', {\n peer: await this.managers.appCallsManager.getCallInput(this.id),\n protocol: this.protocol,\n g_b: this.dh.g_b\n });\n }).then(async(phonePhoneCall) => {\n await this.managers.appCallsManager.savePhonePhoneCall(phonePhoneCall);\n }).catch((err) => {\n this.log.error('accept call error', err);\n // if(err.type === 'CALL_PROTOCOL_COMPAT_LAYER_INVALID') {\n\n // }\n\n this.hangUp('phoneCallDiscardReasonHangup');\n });\n }\n\n public joinCall() {\n this.log('joinCall');\n\n this.getEmojisFingerprint();\n\n this.overrideConnectionState();\n\n const {isOutgoing, encryptionKey, streamManager} = this;\n\n const configuration = getRtcConfiguration(this.call as PhoneCall.phoneCall);\n this.log('joinCall configuration', configuration);\n if(!configuration) return;\n\n const connectionInstance = this.connectionInstance = new CallConnectionInstance({\n call: this,\n streamManager,\n log: this.log.bindPrefix('connection')\n });\n\n const connection = connectionInstance.createPeerConnection(configuration);\n connection.addEventListener('iceconnectionstatechange', () => {\n const state = this.connectionState;\n if(this.connectedAt === undefined && state === CALL_STATE.CONNECTED) {\n this.connectedAt = Date.now();\n }\n\n this.dispatchEvent('state', state);\n });\n connection.addEventListener('negotiationneeded', () => {\n connectionInstance.negotiate();\n });\n connection.addEventListener('icecandidate', (event) => {\n const {candidate} = event;\n connection.log('onicecandidate', candidate);\n if(candidate?.candidate) {\n this.sendIceCandidate(candidate);\n }\n });\n connection.addEventListener('track', (event) => {\n const {track} = event;\n connection.log('ontrack', track);\n this.onTrack(event);\n });\n\n const description = connectionInstance.createDescription();\n\n this.encryptor = new P2PEncryptor(isOutgoing, encryptionKey);\n this.decryptor = new P2PEncryptor(!isOutgoing, encryptionKey);\n\n this.log('currentCall', this);\n\n if(isOutgoing) {\n connectionInstance.appendStreamToConference();\n }\n\n this.createDataChannel();\n\n this.processDecryptQueue();\n }\n\n private createDataChannelEntry() {\n const dataChannelEntry = this.description.createEntry('application');\n dataChannelEntry.setDirection('sendrecv');\n dataChannelEntry.sendEntry = dataChannelEntry.recvEntry = dataChannelEntry;\n }\n\n private createDataChannel() {\n if(this.connectionInstance.dataChannel) {\n return;\n }\n\n const channel = this.connectionInstance.createDataChannel({\n id: 0,\n negotiated: true\n });\n channel.addEventListener('message', (e) => {\n this.applyDataChannelData(JSON.parse(e.data));\n });\n channel.addEventListener('open', () => {\n this.sendMediaState();\n });\n }\n\n private applyDataChannelData(data: CallMediaState) {\n switch(data['@type']) {\n case 'MediaState': {\n data.type = 'output';\n this.log('got output media state', data);\n this.setMediaState(data);\n break;\n }\n\n default:\n this.log.error('unknown data channel data:', data);\n break;\n }\n }\n\n private _sendMediaState() {\n const {connectionInstance} = this;\n if(!connectionInstance) return;\n\n const mediaState = {...this.getMediaState('input')};\n // mediaState.videoRotation = 90;\n delete mediaState.type;\n this.log('sendMediaState', mediaState);\n\n connectionInstance.sendDataChannelData(mediaState);\n }\n\n public async sendCallSignalingData(data: CallSignalingData) {\n /* if(data['@type'] === 'InitialSetup') {\n this.filterNotVP8(data);\n } */\n\n const json = JSON.stringify(data);\n const arr = new TextEncoder().encode(json);\n const {bytes} = await this.encryptor.encryptRawPacket(arr);\n\n this.log('sendCallSignalingData', this.id, json);\n await this.managers.apiManager.invokeApi('phone.sendSignalingData', {\n peer: await this.managers.appCallsManager.getCallInput(this.id),\n data: bytes\n });\n }\n\n public sendIceCandidate(iceCandidate: RTCIceCandidate) {\n this.log('sendIceCandidate', iceCandidate);\n const {candidate, sdpMLineIndex} = iceCandidate;\n if(sdpMLineIndex !== 0) {\n return;\n }\n\n const parsed = p2pParseCandidate(candidate);\n // const parsed = {sdpString: candidate};\n /* if(parsed.address.ip !== '') {\n return;\n } */\n\n this.sendCallSignalingData({\n '@type': 'Candidates',\n 'candidates': [parsed]\n });\n }\n\n public async confirmCall() {\n const {protocol, id, call} = this;\n const dh = this.dh as DiffieHellmanInfo.a;\n\n // this.clearHangUpTimeout();\n this.overrideConnectionState(CALL_STATE.EXCHANGING_KEYS);\n const {key, key_fingerprint} = await this.managers.appCallsManager.computeKey((call as PhoneCall.phoneCallAccepted).g_b, dh.a, dh.p);\n\n const phonePhoneCall = await this.managers.apiManager.invokeApi('phone.confirmCall', {\n peer: await this.managers.appCallsManager.getCallInput(id),\n protocol: protocol,\n g_a: dh.g_a,\n key_fingerprint: key_fingerprint\n });\n\n this.encryptionKey = key;\n await this.managers.appCallsManager.savePhonePhoneCall(phonePhoneCall);\n this.joinCall();\n }\n\n public getEmojisFingerprint() {\n if(this.emojisFingerprint) return this.emojisFingerprint;\n if(this.getEmojisFingerprintPromise) return this.getEmojisFingerprintPromise;\n return this.getEmojisFingerprintPromise = apiManagerProxy.invokeCrypto('get-emojis-fingerprint', this.encryptionKey, this.dh.g_a).then((codePoints) => {\n this.getEmojisFingerprintPromise = undefined;\n return this.emojisFingerprint = codePoints.map((codePoints) => emojiFromCodePoints(codePoints)) as [string, string, string, string];\n });\n }\n\n private unlockStreamManager() {\n this.connectionInstance.streamManager.locked = false;\n this.connectionInstance.appendStreamToConference();\n }\n\n private async doTheMagic() {\n this.connectionInstance.appendStreamToConference();\n\n const connection = this.connectionInstance.connection;\n\n let answer = await connection.createAnswer();\n\n this.log('[sdp] local', answer.type, answer.sdp);\n await connection.setLocalDescription(answer);\n\n connection.getTransceivers().filter((transceiver) => transceiver.direction === 'recvonly').forEach((transceiver) => {\n const entry = this.connectionInstance.description.getEntryByMid(transceiver.mid);\n entry.transceiver = entry.recvEntry.transceiver = transceiver;\n transceiver.direction = 'sendrecv';\n });\n\n const isAnswer = false;\n\n const description = this.description;\n const bundle = description.entries.map((entry) => entry.mid);\n const sdpDescription: RTCSessionDescriptionInit = {\n type: isAnswer ? 'answer' : 'offer',\n sdp: description.generateSdp({\n bundle,\n entries: description.entries.filter((entry) => bundle.includes(entry.mid)),\n // isAnswer: isAnswer\n isAnswer: !isAnswer\n })\n };\n\n await connection.setRemoteDescription(sdpDescription);\n\n answer = await connection.createAnswer();\n\n await connection.setLocalDescription(answer);\n\n const initialSetup = parseSignalingData(parseSdp(answer.sdp));\n this.log('[InitialSetup] send 1');\n this.sendCallSignalingData(initialSetup);\n\n this.unlockStreamManager();\n }\n\n public overrideConnectionState(state?: CALL_STATE) {\n this._connectionState = state;\n this.dispatchEvent('state', this.connectionState);\n }\n\n public get duration() {\n return this.connectedAt !== undefined ? (Date.now() - this.connectedAt) / 1000 | 0 : 0;\n }\n\n protected onInputStream(stream: MediaStream): void {\n super.onInputStream(stream);\n\n const videoTrack = stream.getVideoTracks()[0];\n if(videoTrack) {\n const state = this.getMediaState('input');\n\n // handle starting camera\n if(!this.wasStartingScreen && !this.wasStartingVideo) {\n this.wasStartingVideo = true;\n }\n\n if(this.isSharingVideo) {\n state.videoState = 'active';\n } else if(this.isSharingScreen) {\n state.screencastState = 'active';\n }\n\n videoTrack.addEventListener('ended', () => {\n this.stopVideoSharing();\n }, {once: true});\n }\n\n if(stream.getAudioTracks().length) {\n this.onMutedChange();\n }\n }\n\n private onMutedChange() {\n const isMuted = this.isMuted;\n this.dispatchEvent('muted', isMuted);\n\n const state = this.getMediaState('input');\n state.muted = isMuted;\n }\n\n public toggleMuted(): Promise {\n return this.requestAudioSource(true).then(() => {\n this.setMuted();\n this.onMutedChange();\n });\n }\n\n public async hangUp(discardReason?: PhoneCallDiscardReason['_'], discardedByOtherParty?: boolean) {\n if(this.isClosing) {\n return;\n }\n\n this.discardReason = discardReason;\n this.log('hangUp', discardReason);\n this.overrideConnectionState(CALL_STATE.CLOSED);\n\n if(this.connectionInstance) {\n this.connectionInstance.closeConnectionAndStream(true);\n }\n\n if(discardReason && !discardedByOtherParty) {\n let hasVideo = false;\n for(const type in this.mediaStates) {\n const mediaState = this.mediaStates[type as 'input' | 'output'];\n hasVideo = mediaState.videoState === 'active' || mediaState.screencastState === 'active' || hasVideo;\n }\n\n await this.managers.appCallsManager.discardCall(this.id, this.duration, discardReason, hasVideo);\n }\n }\n\n private performCodec(_codec: P2PAudioCodec | P2PVideoCodec) {\n const payloadTypes: AudioCodec['payload-types'] = _codec.payloadTypes.map((payloadType) => {\n return {\n ...payloadType,\n 'rtcp-fbs': payloadType.feedbackTypes\n }\n });\n\n const codec: AudioCodec = {\n 'rtp-hdrexts': _codec.rtpExtensions,\n 'payload-types': payloadTypes\n };\n\n return codec;\n }\n\n private setDataToDescription(data: CallSignalingData.initialSetup) {\n this.description.setData({\n transport: {\n 'pwd': data.pwd,\n 'ufrag': data.ufrag,\n 'fingerprints': data.fingerprints,\n 'rtcp-mux': true\n },\n audio: this.performCodec(data.audio),\n video: data.video ? this.performCodec(data.video) as VideoCodec : undefined,\n screencast: data.screencast ? this.performCodec(data.screencast) as VideoCodec : undefined\n });\n }\n\n private filterNotVP8(initialSetup: CallSignalingData.initialSetup) {\n if(!this.isOutgoing) { // only VP8 works now\n [initialSetup.video, initialSetup.screencast].filter(Boolean).forEach((codec) => {\n const payloadTypes = codec.payloadTypes;\n const idx = payloadTypes.findIndex((payloadType) => payloadType.name === 'VP8');\n const vp8PayloadType = payloadTypes[idx];\n const rtxIdx = payloadTypes.findIndex((payloadType) => +payloadType.parameters?.apt === vp8PayloadType.id);\n codec.payloadTypes = [payloadTypes[idx], payloadTypes[rtxIdx]];\n });\n }\n }\n\n public async applyCallSignalingData(data: CallSignalingData) {\n this.log('applyCallSignalingData', this, data);\n\n const {connection, description} = this.connectionInstance;\n\n switch(data['@type']) {\n case 'InitialSetup': {\n this.log('[sdp] InitialSetup', data);\n\n this.filterNotVP8(data);\n this.setDataToDescription(data);\n\n const performSsrcGroups = (ssrcGroups: P2PVideoCodec['ssrcGroups']): GroupCallParticipantVideoSourceGroup[] => {\n return ssrcGroups.map((ssrcGroup) => {\n return {\n _: 'groupCallParticipantVideoSourceGroup',\n semantics: ssrcGroup.semantics,\n sources: ssrcGroup.ssrcs.map((source) => +source)\n };\n });\n };\n\n const ssrcs = [\n generateSsrc('audio', +data.audio.ssrc),\n data.video ? generateSsrc('video', performSsrcGroups(data.video.ssrcGroups)) : undefined,\n data.screencast ? generateSsrc('screencast', performSsrcGroups(data.screencast.ssrcGroups)) : undefined\n ].filter(Boolean);\n\n ssrcs.forEach((ssrc) => {\n let entry = description.getEntryBySource(ssrc.source);\n if(entry) {\n return;\n }\n\n const sendRecvEntry = description.findFreeSendRecvEntry(ssrc.type, false);\n entry = new ConferenceEntry(sendRecvEntry.mid, ssrc.type);\n entry.setDirection('sendrecv');\n sendRecvEntry.recvEntry = entry;\n\n description.setEntrySource(entry, ssrc.sourceGroups || ssrc.source);\n });\n\n this.createDataChannelEntry();\n\n const isAnswer = this.offerSent;\n this.offerSent = false;\n\n const bundle = description.entries.map((entry) => entry.mid);\n const sdpDescription: RTCSessionDescriptionInit = {\n type: isAnswer ? 'answer' : 'offer',\n sdp: description.generateSdp({\n bundle,\n entries: description.entries.filter((entry) => bundle.includes(entry.mid)),\n // isAnswer: isAnswer\n isAnswer: !isAnswer\n })\n };\n\n this.log('[sdp] remote', sdpDescription.sdp);\n\n await connection.setRemoteDescription(sdpDescription);\n\n await this.tryToReleaseCandidates();\n\n if(!isAnswer) {\n await this.doTheMagic();\n }\n\n break;\n }\n\n case 'Candidates': {\n for(const candidate of data.candidates) {\n const init: RTCIceCandidateInit = P2PSdpBuilder.generateCandidate(candidate);\n init.sdpMLineIndex = 0;\n const iceCandidate = new RTCIceCandidate(init);\n this.candidates.push(iceCandidate);\n }\n\n await this.tryToReleaseCandidates();\n break;\n }\n\n default: {\n this.log.error('unrecognized signaling data', data);\n }\n }\n }\n\n public async tryToReleaseCandidates() {\n const {connectionInstance} = this;\n if(!connectionInstance) {\n return;\n }\n\n const {connection} = connectionInstance;\n if(connection.remoteDescription) {\n const promises: Promise[] = this.candidates.map((candidate) => this.addIceCandidate(connection, candidate));\n this.candidates.length = 0;\n\n await Promise.all(promises);\n } else {\n this.log('[candidates] postpone');\n }\n }\n\n private async addIceCandidate(connection: RTCPeerConnection, candidate: RTCIceCandidate) {\n this.log('[candidate] start', candidate);\n try {\n // if(!candidate.address) return;\n await connection.addIceCandidate(candidate);\n this.log('[candidate] add', candidate);\n } catch(e) {\n this.log.error('[candidate] error', candidate, e);\n }\n }\n\n private async processDecryptQueue() {\n const {encryptor} = this;\n if(!encryptor) {\n this.log.warn('got encrypted signaling data before the encryption key');\n return;\n }\n\n const length = this.decryptQueue.length;\n if(!length) {\n return;\n }\n\n const queue = this.decryptQueue.slice();\n this.decryptQueue.length = 0;\n\n for(const data of queue) {\n const decryptedData = await encryptor.decryptRawPacket(data);\n if(!decryptedData) {\n continue;\n }\n\n // this.log('[update] updateNewCallSignalingData', update, decryptedData);\n\n const str = new TextDecoder().decode(decryptedData);\n try {\n const signalingData: CallSignalingData = JSON.parse(str);\n this.log('[update] updateNewCallSignalingData', signalingData);\n this.applyCallSignalingData(signalingData);\n } catch(err) {\n this.log.error('wrong signaling data', str);\n this.hangUp('phoneCallDiscardReasonDisconnect');\n callsController.dispatchEvent('incompatible', this.interlocutorUserId);\n }\n }\n }\n\n public onUpdatePhoneCallSignalingData(data: Uint8Array) {\n this.decryptQueue.push(data);\n this.processDecryptQueue();\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 {PhoneCallProtocol} from '../../../layer';\n\nexport default function getCallProtocol(): PhoneCallProtocol {\n return {\n _: 'phoneCallProtocol',\n pFlags: {\n udp_p2p: true,\n udp_reflector: true\n },\n min_layer: 92,\n max_layer: 92,\n library_versions: ['4.0.0']\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 {PhoneCall} from '../../../layer';\n\nexport default function getRtcConfiguration(call: PhoneCall.phoneCall): RTCConfiguration {\n const iceServers: RTCIceServer[] = [];\n call.connections.forEach((connection) => {\n switch(connection._) {\n /* case 'callServerTypeTelegramReflector': {\n break;\n } */\n case 'phoneConnectionWebrtc': {\n const {ip, ipv6, port, username, password} = connection;\n const urls: string[] = [];\n if(connection.pFlags.turn) {\n if(ip) {\n urls.push(`turn:${ip}:${port}`);\n }\n if(ipv6) {\n urls.push(`turn:[${ipv6}]:${port}`);\n }\n } else if(connection.pFlags.stun) {\n if(ip) {\n urls.push(`stun:${ip}:${port}`);\n }\n if(ipv6) {\n urls.push(`stun:[${ipv6}]:${port}`);\n }\n }\n\n if(urls.length > 0) {\n iceServers.push({\n urls,\n username,\n credential: password\n });\n }\n break;\n }\n }\n });\n\n return {\n iceServers,\n iceTransportPolicy: call.pFlags.p2p_allowed ? 'all' : 'relay'\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 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: DisplayMediaStreamOptions,\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 getScreenConstraints from './helpers/getScreenConstraints';\nimport getStreamCached from './helpers/getStreamCached';\nimport getVideoConstraints from './helpers/getVideoConstraints';\nimport stopTrack from './helpers/stopTrack';\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 this.onInputStream(stream);\n });\n }\n\n public requestScreen() {\n return this.getStream({\n isScreen: true,\n constraints: getScreenConstraints(true)\n }).then((stream) => {\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 } else {\n element.setAttribute('playsinline', 'true');\n element.muted = true;\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 videoTracks = stream.getVideoTracks();\n if(videoTracks.length) {\n this.saveInputVideoStream(stream, 'main');\n }\n\n const {streamManager, description} = this;\n streamManager.addStream(stream, 'input');\n\n if(description) {\n streamManager.appendToConference(description);\n }\n } else { // if call is declined earlier than stream appears\n stream.getTracks().forEach((track) => {\n stopTrack(track);\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\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 AudioAssetPlayer from '../../helpers/audioAssetPlayer';\n\nexport type CallAudioAssetName = 'call_busy.mp3' | 'call_connect.mp3' | 'call_end.mp3' | 'call_incoming.mp3' | 'call_outgoing.mp3' | 'voip_failed.mp3' | 'voip_connecting.mp3';\n\nlet audioAsset: AudioAssetPlayer;\nexport default function getCallAudioAsset() {\n return audioAsset ??= new AudioAssetPlayer([\n 'call_busy.mp3',\n 'call_connect.mp3',\n 'call_end.mp3',\n 'call_incoming.mp3',\n 'call_outgoing.mp3',\n 'voip_failed.mp3'\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 getCallAudioAsset, {CallAudioAssetName} from '../../components/call/getAudioAsset';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport IS_CALL_SUPPORTED from '../../environment/callSupport';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport insertInDescendSortedArray from '../../helpers/array/insertInDescendSortedArray';\nimport AudioAssetPlayer from '../../helpers/audioAssetPlayer';\nimport bytesCmp from '../../helpers/bytes/bytesCmp';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport tsNow from '../../helpers/tsNow';\nimport {PhoneCallProtocol} from '../../layer';\nimport {CallId} from '../appManagers/appCallsManager';\nimport {AppManagers} from '../appManagers/managers';\nimport {logger} from '../logger';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport {NULL_PEER_ID} from '../mtproto/mtproto_config';\nimport rootScope from '../rootScope';\nimport CallInstance from './callInstance';\nimport CALL_STATE from './callState';\n\nconst CALL_REQUEST_TIMEOUT = 45e3;\n\nexport class CallsController extends EventListenerBase<{\n instance: (details: {hasCurrent: boolean, instance: CallInstance}) => void,\n accepting: (instance: CallInstance) => void, // ัั‚ะพ ะบะพัั‚ั‹ะปัŒ. ะธัะฟะพะปัŒะทัƒะตั‚ัั ะฟั€ะธ ะฟะฐั€ะฐะปะปะตะปัŒะฝะพะผ ะฒั‹ะทะพะฒะต, ั‡ั‚ะพะฑั‹ ะทะฐะผะตะฝะธั‚ัŒ ะทะฒะพะฝะพะบ ะฒ topbarCall\n incompatible: (userId: UserId) => void,\n}> {\n private log: ReturnType;\n private managers: AppManagers;\n private audioAsset: AudioAssetPlayer;\n private instances: Map;\n private sortedInstances: Array;\n private tempId: number;\n\n public construct(managers: AppManagers) {\n this.managers = managers;\n this.log = logger('CC');\n\n if(!IS_CALL_SUPPORTED) {\n return;\n }\n\n this.audioAsset = getCallAudioAsset();\n this.tempId = 0;\n this.instances = new Map();\n this.sortedInstances = [];\n\n rootScope.addEventListener('call_update', async(call) => {\n let instance = this.instances.get(call.id);\n\n if(instance) {\n instance.setPhoneCall(call);\n }\n\n switch(call._) {\n case 'phoneCallDiscarded': {\n if(instance) {\n instance.hangUp(call.reason?._, true);\n }\n\n break;\n }\n\n case 'phoneCallAccepted': {\n if(instance) {\n /* if(!this.verifyProtocolCompatibility(call.protocol)) {\n instance.hangUp('phoneCallDiscardReasonDisconnect');\n rootScope.dispatchEvent('call_incompatible', instance.interlocutorUserId);\n break;\n } */\n\n instance.confirmCall();\n }\n\n break;\n }\n\n case 'phoneCallRequested': {\n if(!instance) {\n /* if(!this.verifyProtocolCompatibility(call.protocol)) {\n rootScope.dispatchEvent('call_incompatible', call.admin_id);\n break;\n } */\n\n instance = this.createCallInstance({\n isOutgoing: false,\n interlocutorUserId: call.admin_id\n });\n\n instance.overrideConnectionState(CALL_STATE.PENDING);\n instance.setPhoneCall(call);\n instance.setHangUpTimeout(CALL_REQUEST_TIMEOUT, 'phoneCallDiscardReasonMissed');\n }\n\n break;\n }\n\n case 'phoneCall': {\n if(!instance || instance.encryptionKey) {\n break;\n }\n\n const g_a = instance.dh.g_a = call.g_a_or_b;\n const dh = instance.dh;\n const g_a_hash = await apiManagerProxy.invokeCrypto('sha256', g_a);\n if(!bytesCmp(dh.g_a_hash, g_a_hash)) {\n this.log.error('Incorrect g_a_hash', dh.g_a_hash, g_a_hash);\n break;\n }\n\n const {key, key_fingerprint} = await this.managers.appCallsManager.computeKey(g_a, dh.b, dh.p);\n if(call.key_fingerprint !== key_fingerprint) {\n this.log.error('Incorrect key fingerprint', call.key_fingerprint, key_fingerprint, g_a, dh);\n instance.hangUp('phoneCallDiscardReasonDisconnect');\n break;\n }\n\n instance.encryptionKey = key;\n instance.joinCall();\n\n break;\n }\n }\n });\n\n rootScope.addEventListener('call_signaling', ({callId, data}) => {\n const instance = this.instances.get(callId);\n if(instance?.id !== callId) {\n return;\n }\n\n instance.onUpdatePhoneCallSignalingData(data);\n });\n }\n\n public get currentCall() {\n return this.sortedInstances[0];\n }\n\n public getCallByUserId(userId: UserId) {\n for(const [callId, instance] of this.instances) {\n if(instance.interlocutorUserId === userId) {\n return instance;\n }\n }\n }\n\n private createCallInstance(options: {\n isOutgoing: boolean,\n interlocutorUserId: UserId,\n protocol?: PhoneCallProtocol\n }) {\n const call = new CallInstance({\n managers: this.managers,\n ...options\n });\n\n call.addEventListener('state', (state) => {\n const currentCall = this.currentCall;\n if(state === CALL_STATE.CLOSED) {\n this.instances.delete(call.id);\n indexOfAndSplice(this.sortedInstances, call);\n } else {\n insertInDescendSortedArray(this.sortedInstances, call, 'sortIndex');\n }\n\n if(state === CALL_STATE.EXCHANGING_KEYS) {\n call.wasTryingToJoin = true;\n }\n\n const hasConnected = call.connectedAt !== undefined;\n if(state === CALL_STATE.EXCHANGING_KEYS || (state === CALL_STATE.CONNECTING && hasConnected)) {\n call.setHangUpTimeout(CALL_REQUEST_TIMEOUT, 'phoneCallDiscardReasonDisconnect');\n } else {\n call.clearHangUpTimeout();\n }\n\n if(currentCall === call || !currentCall) {\n if(state === CALL_STATE.CLOSED) {\n if(!call.isOutgoing && !call.wasTryingToJoin) { // incoming call has been accepted on other device or ended\n this.audioAsset.stopSound();\n } else if(call.wasTryingToJoin && !hasConnected) { // something has happened during the key exchanging\n this.audioAsset.playSound('voip_failed.mp3');\n } else {\n this.audioAsset.playSound(call.discardReason === 'phoneCallDiscardReasonBusy' ? 'call_busy.mp3' : 'call_end.mp3');\n }\n } else if(state === CALL_STATE.PENDING) {\n this.audioAsset.playSound(call.isOutgoing ? 'call_outgoing.mp3' : 'call_incoming.mp3', true);\n } else if(state === CALL_STATE.EXCHANGING_KEYS) {\n this.audioAsset.playSoundIfDifferent('call_connect.mp3');\n } else if(state === CALL_STATE.CONNECTING) {\n if(call.duration) {\n this.audioAsset.playSound('voip_connecting.mp3', true);\n }\n } else {\n this.audioAsset.stopSound();\n }\n }\n });\n\n call.addEventListener('id', (id, prevId) => {\n if(prevId !== undefined) {\n this.instances.delete(prevId);\n }\n\n const hasCurrent = !!this.currentCall;\n this.instances.set(id, call);\n\n if(prevId === undefined) {\n this.dispatchEvent('instance', {instance: call, hasCurrent: hasCurrent});\n }\n });\n\n return call;\n }\n\n public async startCallInternal(userId: UserId, isVideo: boolean) {\n this.log('p2pStartCallInternal', userId, isVideo);\n\n const fullInfo = await this.managers.appProfileManager.getProfile(userId);\n if(!fullInfo) return;\n\n const {video_calls_available} = fullInfo.pFlags;\n\n const call = this.createCallInstance({\n isOutgoing: true,\n interlocutorUserId: userId\n });\n\n call.requestInputSource(true, !!(isVideo && video_calls_available), false);\n\n call.overrideConnectionState(CALL_STATE.REQUESTING);\n call.setPhoneCall({\n _: 'phoneCallWaiting',\n access_hash: '',\n admin_id: NULL_PEER_ID,\n date: tsNow(true),\n id: --this.tempId,\n participant_id: userId,\n protocol: call.protocol,\n pFlags: {\n video: isVideo || undefined\n }\n });\n\n // return;\n this.managers.appCallsManager.generateDh().then(async(dh) => {\n call.dh = dh;\n\n return this.managers.appCallsManager.requestCall(userId, call.protocol, call.dh.g_a_hash, isVideo && video_calls_available);\n }).then((phoneCall) => {\n call.overrideConnectionState(CALL_STATE.PENDING);\n call.setPhoneCall(phoneCall);\n call.setHangUpTimeout(CALL_REQUEST_TIMEOUT, 'phoneCallDiscardReasonHangup');\n });\n }\n}\n\nconst callsController = new CallsController();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.callsController = callsController);\nexport default callsController;\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","/*\n * 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/forEachReverse';\nimport throttle from '../../helpers/schedulers/throttle';\nimport {GroupCallConnectionType, JoinGroupCallJsonPayload} from '../appManagers/appGroupCallsManager';\nimport {AppManagers} from '../appManagers/managers';\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 private managers: AppManagers;\n\n constructor(options: CallConnectionInstanceOptions & {\n groupCall: GroupCallConnectionInstance['groupCall'],\n type: GroupCallConnectionInstance['type'],\n options: GroupCallConnectionInstance['options'],\n managers: AppManagers\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 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 update = await this.managers.appGroupCallsManager.joinGroupCall(groupCallId, params, options);\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 if(this.options.type === 'presentation') {\n promise.then(() => {\n this.connection.getTransceivers().find((transceiver) => {\n if(transceiver.sender?.track?.kind === 'video') {\n transceiver.sender.setParameters({\n ...transceiver.sender.getParameters(),\n degradationPreference: 'maintain-resolution'\n });\n }\n });\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 {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/forEachReverse';\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 forEachReverse from '../../../helpers/array/forEachReverse';\nimport copy from '../../../helpers/object/copy';\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 const 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 type {GroupCallConnectionType, GroupCallId, GroupCallOutputSource} from '../appManagers/appGroupCallsManager';\nimport {IS_SAFARI} from '../../environment/userAgent';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport throttle from '../../helpers/schedulers/throttle';\nimport {GroupCall, GroupCallParticipant} from '../../layer';\nimport {logger} from '../logger';\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';\nimport getPeerId from '../appManagers/utils/peers/getPeerId';\nimport {AppManagers} from '../appManagers/managers';\nimport {generateSelfVideo, makeSsrcFromParticipant, makeSsrcsFromParticipant} from './groupCallsController';\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 private managers: AppManagers;\n\n constructor(options: {\n id: GroupCallInstance['id'],\n chatId: GroupCallInstance['chatId'],\n isSpeakingMap?: GroupCallInstance['isSpeakingMap'],\n connections?: GroupCallInstance['connections'],\n managers: AppManagers\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 this.managers.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 async getParticipantByPeerId(peerId: PeerId) {\n return NULL_PEER_ID === peerId ? this.participant : (await this.participants).get(peerId);\n }\n\n public toggleMuted() {\n return this.requestAudioSource(true).then(() => this.changeUserMuted(NULL_PEER_ID));\n }\n\n public async changeUserMuted(peerId: PeerId, muted?: boolean) {\n const participant = await this.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(participant, {muted});\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 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 managers: this.managers,\n ...options\n });\n }\n\n public changeRaiseHand(raise: boolean) {\n return this.editParticipant(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.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 this.managers.appGroupCallsManager.saveApiParticipant(this.id, this.participant);\n\n return this.managers.appGroupCallsManager.leaveGroupCallPresentation(this.id);\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 this.editParticipant(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.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 this.editParticipant(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 const d = discard || (this.joined ? this.connections.main.sources.audio.source : undefined);\n this.managers.appGroupCallsManager.hangUp(this.id, d);\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 this.getParticipantByPeerId(entry.peerId).then((participant) => {\n if(participant) {\n rootScope.dispatchEvent('group_call_participant', {groupCallId: this.id, participant});\n }\n });\n }\n\n return source;\n }\n\n public async editParticipant(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 isCurrentCall = true;\n const isUpdatingMeInCurrentCall = isCurrentCall && participant.pFlags.self;\n\n if(isUpdatingMeInCurrentCall) {\n if(options.muted !== undefined && !this.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 = generateSelfVideo(this.connections.main.sources.video);\n }\n\n if(!participant.pFlags.muted && participant.pFlags.can_self_unmute) {\n this.setMuted(false);\n }\n\n this.dispatchEvent('state', this.state);\n }\n\n // rootScope.dispatchEvent('group_call_participant', {groupCallId, participant});\n\n /* if(participant.pFlags.self) {\n processUpdate = false;\n } */\n }\n\n return this.managers.appGroupCallsManager.editParticipant(this.id, participant, options);\n }\n\n public onParticipantUpdate(participant: GroupCallParticipant, doNotDispatchParticipantUpdate?: PeerId) {\n const connectionInstance = this.connections.main;\n const {connection, description} = connectionInstance;\n\n const peerId = 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} = 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 ? [] : 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","/*\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\nimport AudioAssetPlayer from '../../helpers/audioAssetPlayer';\n\nexport type GroupCallAudioAssetName = 'group_call_connect.mp3' | 'group_call_end.mp3' | 'group_call_start.mp3' | 'voip_onallowtalk.mp3';\n\nlet audioAsset: AudioAssetPlayer;\nexport default function getGroupCallAudioAsset() {\n return 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 * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getGroupCallAudioAsset from '../../components/groupCall/getAudioAsset';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport {GroupCallParticipant, GroupCallParticipantVideo, GroupCallParticipantVideoSourceGroup} from '../../layer';\nimport {GroupCallId, GroupCallConnectionType} from '../appManagers/appGroupCallsManager';\nimport {AppManagers} from '../appManagers/managers';\nimport {logger} from '../logger';\nimport rootScope from '../rootScope';\nimport GroupCallInstance from './groupCallInstance';\nimport GROUP_CALL_STATE from './groupCallState';\nimport createMainStreamManager from './helpers/createMainStreamManager';\nimport {generateSsrc} from './localConferenceDescription';\nimport {WebRTCLineType} from './sdpBuilder';\nimport StreamManager from './streamManager';\nimport {Ssrc} from './types';\n\nconst IS_MUTED = true;\n\nexport function makeSsrcsFromParticipant(participant: GroupCallParticipant) {\n return [\n makeSsrcFromParticipant(participant, 'audio', participant.source),\n participant.video?.audio_source && makeSsrcFromParticipant(participant, 'audio', participant.video.audio_source),\n participant.video && makeSsrcFromParticipant(participant, 'video', participant.video.source_groups, participant.video.endpoint),\n participant.presentation?.audio_source && makeSsrcFromParticipant(participant, 'audio', participant.presentation.audio_source),\n participant.presentation && makeSsrcFromParticipant(participant, 'video', participant.presentation.source_groups, participant.presentation.endpoint)\n ].filter(Boolean);\n};\n\nexport function makeSsrcFromParticipant(participant: GroupCallParticipant, type: WebRTCLineType, source?: number | GroupCallParticipantVideoSourceGroup[], endpoint?: string): Ssrc {\n return generateSsrc(type, source, endpoint);\n}\n\nexport function 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\nexport class GroupCallsController extends EventListenerBase<{\n instance: (instance: GroupCallInstance) => void\n}> {\n private audioAsset: ReturnType;\n private log: ReturnType;\n private currentGroupCall: GroupCallInstance;\n private managers: AppManagers;\n\n public construct(managers: AppManagers) {\n this.managers = managers;\n this.audioAsset = getGroupCallAudioAsset();\n this.log = logger('GCC');\n\n rootScope.addEventListener('group_call_update', (groupCall) => {\n const {currentGroupCall} = this;\n if(currentGroupCall?.id === groupCall.id) {\n currentGroupCall.groupCall = groupCall;\n\n if(groupCall._ === 'groupCallDiscarded') {\n currentGroupCall.hangUp(false, false, true);\n }\n }\n });\n\n rootScope.addEventListener('group_call_participant', ({groupCallId, participant}) => {\n const {currentGroupCall} = this;\n if(currentGroupCall?.id === groupCallId) {\n currentGroupCall.onParticipantUpdate(participant/* , this.doNotDispatchParticipantUpdate */);\n }\n });\n }\n\n get groupCall() {\n return this.currentGroupCall;\n }\n\n public setCurrentGroupCall(groupCall: GroupCallInstance) {\n this.currentGroupCall = groupCall;\n\n if(groupCall) {\n this.dispatchEvent('instance', groupCall);\n }\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 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 .then(() => {\n // have to refresh participants because of the new connection\n const {currentGroupCall} = this;\n currentGroupCall.participants.then((participants) => {\n if(this.currentGroupCall !== currentGroupCall || currentGroupCall.state === GROUP_CALL_STATE.CLOSED) {\n return;\n }\n\n participants.forEach((participant) => {\n if(!participant.pFlags.self) {\n currentGroupCall.onParticipantUpdate(participant);\n }\n });\n });\n });\n }\n\n private 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 managers: this.managers\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.managers.appGroupCallsManager.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 this.managers.appGroupCallsManager.getGroupCallParticipants(groupCallId);\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\nconst groupCallsController = new GroupCallsController();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.groupCallController = groupCallsController);\nexport default groupCallsController;\n","/*\n * 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","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","export default function getScreenConstraints(skipAudio?: boolean) {\n const constraints: DisplayMediaStreamOptions = {\n video: {\n // @ts-ignore\n // cursor: 'always',\n width: {max: 1920},\n height: {max: 1080},\n frameRate: {max: 30}\n }\n };\n\n if(!skipAudio) {\n constraints.audio = true;\n }\n\n return constraints;\n}\n","export default async function getScreenStream(constraints: DisplayMediaStreamOptions) {\n const screenStream = await navigator.mediaDevices.getDisplayMedia(constraints);\n const track = screenStream.getVideoTracks()[0];\n track.contentHint = 'text';\n return screenStream;\n}\n","export default async function getStream(constraints: MediaStreamConstraints, muted: boolean) {\n // console.log('getStream', constraints);\n\n const stream = await navigator.mediaDevices.getUserMedia(constraints);\n stream.getTracks().forEach((x) => {\n x.enabled = !muted;\n });\n\n // console.log('getStream result', stream);\n return 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\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","import simulateEvent from '../../../helpers/dom/dispatchEvent';\n\nexport default function stopTrack(track: MediaStreamTrack) {\n track.stop();\n simulateEvent(track, 'ended');\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/indexOfAndSplice';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {GroupCallParticipantVideoSourceGroup} from '../../layer';\nimport {fixMediaLineType, 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(fixMediaLineType(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 public readonly screencast?: 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","/*\n * 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, lines: SDPLine[] = [];\n const mediaSections: SDPMediaSection[] = [];\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 * 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\n// screencast is for Peer-to-Peer only\nexport type WebRTCLineTypeTrue = 'video' | 'audio' | 'application';\nexport type WebRTCLineType = WebRTCLineTypeTrue | 'screencast';\n\nexport const WEBRTC_MEDIA_PORT = '9';\n\nexport function fixMediaLineType(mediaType: WebRTCLineType) {\n return mediaType === 'screencast' ? 'video' : mediaType;\n}\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 return mediaType === 'application' ? 'DTLS/SCTP' : 'UDP/TLS/RTP/SAVPF';\n}\n\nexport function generateMediaFirstLine(mediaType: WebRTCLineType, port = WEBRTC_MEDIA_PORT, payloadIds: (string | number)[]) {\n const connectionType = getConnectionTypeForMediaType(mediaType);\n return `m=${fixMediaLineType(mediaType)} ${port} ${connectionType} ${payloadIds.join(' ')}`;\n}\n\ntype ConferenceData = UpdateGroupCallConnectionData | LocalConferenceDescription;\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=${fixMediaLineType(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\nimport EventListenerBase from '../../helpers/eventListenerBase';\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 {fixMediaLineType, WebRTCLineType} from './sdpBuilder';\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 public static ANALYSER_LISTENER = new EventListenerBase<{amplitude: (details: {amplitudes: StreamAmplitude[], type: 'all' | 'input'}) => void}>();\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 locked: boolean;\n public types: WebRTCLineType[];\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 this.types = ['audio', 'video'];\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 StreamManager.ANALYSER_LISTENER.dispatchEvent('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.locked) {\n return;\n }\n\n const {inputStream, direction, canCreateConferenceEntry} = this;\n const transceiverInit: RTCRtpTransceiverInit = {direction, streams: [inputStream]};\n const types = this.types.map((type) => {\n return [\n type,\n /* type === 'video' || type === 'screencast' ?\n {sendEncodings: [{maxBitrate: 2500000}], ...transceiverInit} : */\n transceiverInit\n ] as const;\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 /* if(this.isScreenSharingManager) {\n transceiver.sender.setParameters({\n ...transceiver.sender.getParameters(),\n degradationPreference: 'maintain-resolution'\n });\n } */\n }\n\n if(entry.direction !== transceiver.direction) {\n transceiver.direction = entry.direction;\n }\n\n const mediaTrackType = fixMediaLineType(type);\n const trackIdx = tracks.findIndex((track) => track.kind === mediaTrackType);\n const track = trackIdx !== -1 ? tracks.splice(trackIdx, 1)[0] : undefined;\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","/*\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 this.lines = [];\n this.newLine = [];\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","/*\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 return 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 return source >>> 0;\n}\n\nexport function getAmplitude(array: Uint8Array, scale = 3) {\n if(!array) return 0;\n\n const {length} = array;\n let total = 0;\n for(let i = 0; i < length; ++i) {\n total += array[i] * array[i];\n }\n const rms = Math.sqrt(total / length) / 255;\n\n return 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\nimport {MessageEntity} from '../../layer';\nimport getEmojiEntityFromEmoji from './getEmojiEntityFromEmoji';\nimport emojiRegExp from '../../vendor/emoji/regex';\n\nconst EMOJI_REG_EXP = new RegExp(`(^${emojiRegExp})`);\n\nexport default function getAbbreviation(str: string, onlyFirst = false): {\n text: string,\n entities: MessageEntity[]\n} {\n const splitted = (str || '').trim().split(' ');\n if(!splitted[0]) return {text: '', entities: []};\n\n const entities: MessageEntity.messageEntityEmoji[] = [];\n\n const firstEmojiMatch = splitted[0].match(EMOJI_REG_EXP);\n const first = firstEmojiMatch?.[0] || splitted[0][0];\n if(firstEmojiMatch) {\n entities.push(getEmojiEntityFromEmoji(first));\n }\n\n const length = splitted.length;\n if(onlyFirst || length === 1) return {text: first, entities};\n\n const lastEmojiMatch = splitted[length - 1].match(EMOJI_REG_EXP);\n const last = lastEmojiMatch?.[0] || splitted[length - 1][0];\n if(lastEmojiMatch) {\n entities.push({\n ...getEmojiEntityFromEmoji(last),\n offset: first.length\n });\n }\n\n return {text: first + last, entities};\n}\n","import {MessageEntity} from '../../layer';\nimport {toCodePoints} from '../../vendor/emoji';\n\nexport default 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","import {EMAIL_REG_EXP} from '.';\n\nexport default function matchEmail(text: string) {\n return !text ? null : text.match(EMAIL_REG_EXP);\n}\n","export default function setBlankToAnchor(anchor: HTMLAnchorElement) {\n anchor.target = '_blank';\n anchor.rel = 'noopener noreferrer';\n return anchor;\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 wrapEmojiText from './wrapEmojiText';\nimport getAbbreviation from './getAbbreviation';\n\nexport default function wrapAbbreviation(str: string, onlyFirst?: boolean) {\n const {text, entities} = getAbbreviation(str, onlyFirst);\n return wrapEmojiText(text, undefined, entities);\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 '../rootScope';\nimport wrapRichText from './wrapRichText';\n\nexport default function wrapDraftText(text: string, options: Partial<{\n wrappingForPeerId: PeerId\n}> & Parameters[1] = {}) {\n if(!text) {\n return wrapRichText('');\n }\n\n let entities = options.entities;\n if(entities && !rootScope.premium && options.wrappingForPeerId !== rootScope.myId) {\n entities = entities.filter((entity) => entity._ !== 'messageEntityCustomEmoji');\n }\n\n const fragment = wrapRichText(text, {\n ...options,\n entities,\n noLinks: true,\n wrappingDraft: true,\n passEntities: {\n messageEntityTextUrl: true,\n messageEntityMentionName: true\n }\n });\n\n return fragment;\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 {MessageEntity} from '../../layer';\nimport parseEntities from './parseEntities';\nimport wrapRichText from './wrapRichText';\n\nexport default function wrapEmojiText(text: string, isDraft = false, entities?: MessageEntity[]) {\n if(!text) return wrapRichText('');\n\n entities ??= parseEntities(text).filter((e) => e._ === 'messageEntityEmoji');\n return wrapRichText(text, {entities, wrappingDraft: isDraft});\n}\n","import IS_EMOJI_SUPPORTED from './emojiSupport';\n\nexport type EMOJI_VERSION = '' | '14';\n\nconst EMOJI_VERSIONS_SUPPORTED: {\n [v in EMOJI_VERSION]: boolean\n} = {} as any;\n\n// Thanks to WebZ for the detect\nfunction isEmojiSupported(emoji: string) {\n const ALLOWABLE_CALCULATION_ERROR_SIZE = 5;\n const inlineEl = document.createElement('span');\n inlineEl.classList.add('emoji');\n document.body.appendChild(inlineEl);\n\n inlineEl.innerText = emoji; // Emoji from 14.0 version\n const newEmojiWidth = inlineEl.offsetWidth;\n inlineEl.innerText = 'โค๏ธ'; // Emoji from 1.0 version\n const legacyEmojiWidth = inlineEl.offsetWidth;\n\n document.body.removeChild(inlineEl);\n\n return Math.abs(newEmojiWidth - legacyEmojiWidth) < ALLOWABLE_CALCULATION_ERROR_SIZE;\n}\n\nif(IS_EMOJI_SUPPORTED) {\n EMOJI_VERSIONS_SUPPORTED[''] = true;\n\n const a: [keyof typeof EMOJI_VERSIONS_SUPPORTED, string][] = [\n ['14', '๐Ÿซฑ๐Ÿป']\n ];\n\n a.forEach(([version, emoji]) => {\n EMOJI_VERSIONS_SUPPORTED[version] = isEmojiSupported(emoji);\n });\n}\n\nexport default EMOJI_VERSIONS_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 {EMOJI_VERSION} from '../../environment/emojiVersionsSupport';\nimport {SITE_HASHTAGS} from '.';\nimport {EmojiVersions} from '../../config/emoji';\nimport IS_EMOJI_SUPPORTED from '../../environment/emojiSupport';\nimport buildURLHash from '../../helpers/buildURLHash';\nimport copy from '../../helpers/object/copy';\nimport encodeEntities from '../../helpers/string/encodeEntities';\nimport {MessageEntity} from '../../layer';\nimport encodeSpoiler from './encodeSpoiler';\nimport parseEntities from './parseEntities';\nimport setBlankToAnchor from './setBlankToAnchor';\nimport wrapUrl from './wrapUrl';\nimport EMOJI_VERSIONS_SUPPORTED from '../../environment/emojiVersionsSupport';\nimport {CLICK_EVENT_NAME} from '../../helpers/dom/clickEvent';\nimport IS_CUSTOM_EMOJI_SUPPORTED from '../../environment/customEmojiSupport';\nimport rootScope from '../rootScope';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport wrapSticker, {videosCache} from '../../components/wrappers/sticker';\nimport RLottiePlayer, {getLottiePixelRatio} from '../rlottie/rlottiePlayer';\nimport animationIntersector, {AnimationItemGroup} from '../../components/animationIntersector';\nimport type {MyDocument} from '../appManagers/appDocsManager';\nimport LazyLoadQueue from '../../components/lazyLoadQueue';\nimport {Awaited} from '../../types';\nimport {MediaSize} from '../../helpers/mediaSize';\nimport IS_WEBM_SUPPORTED from '../../environment/webmSupport';\nimport assumeType from '../../helpers/assumeType';\nimport noop from '../../helpers/noop';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport getViewportSlice from '../../helpers/dom/getViewportSlice';\nimport {getMiddleware, Middleware, MiddlewareHelper} from '../../helpers/middleware';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport BOM from '../../helpers/string/bom';\nimport framesCache from '../../helpers/framesCache';\nimport wrapTelegramUrlToAnchor from './wrapTelegramUrlToAnchor';\n\nconst resizeObserver = new ResizeObserver((entries) => {\n for(const entry of entries) {\n const renderer = entry.target.parentElement as CustomEmojiRendererElement;\n renderer.setDimensionsFromRect(entry.contentRect);\n }\n});\n\nconst globalLazyLoadQueue = new LazyLoadQueue();\n\nexport class CustomEmojiElement extends HTMLElement {\n public elements: CustomEmojiElements;\n public renderer: CustomEmojiRendererElement;\n public player: RLottiePlayer | HTMLVideoElement;\n public paused: boolean;\n public syncedPlayer: SyncedPlayer;\n public clean: boolean;\n public lastChildWas: Node;\n // public docId: DocId;\n public placeholder: HTMLImageElement;\n public middlewareHelper: MiddlewareHelper;\n\n constructor() {\n super();\n this.paused = true;\n this.classList.add('custom-emoji');\n }\n\n public get docId() {\n return this.dataset.docId;\n }\n\n public static create(docId: DocId) {\n const element = new CustomEmojiElement();\n // element.docId = docId;\n element.dataset.docId = '' + docId;\n return element;\n }\n\n public get isConnected() {\n return this.placeholder?.isConnected ?? super.isConnected;\n }\n\n public connectedCallback() {\n // if(this.isConnected) {\n // return;\n // }\n\n if(this.player) {\n animationIntersector.addAnimation(this, this.renderer.animationGroup, undefined, true);\n }\n\n // this.connectedCallback = undefined;\n }\n\n public disconnectedCallback() {\n if(this.isConnected || !this.renderer?.isSelectable) { // prepend on sibling can invoke disconnectedCallback\n return;\n }\n\n this.clear();\n }\n\n public destroy() {\n this.clear();\n }\n\n public clear(replaceChildren = true) {\n if(this.clean) {\n return;\n }\n\n // if(this.docId === '5399836826758290421') {\n // console.log('clear', this, this.isConnected);\n // }\n\n this.clean = true;\n this.pause();\n\n const {syncedPlayer} = this;\n if(syncedPlayer) {\n syncedPlayer.pausedElements.delete(this);\n }\n\n this.middlewareHelper?.clean();\n\n if(this.renderer) {\n const elements = this.renderer.customEmojis.get(this.docId);\n if(elements?.delete(this) && !elements.size) {\n this.renderer.customEmojis.delete(this.docId);\n this.renderer.playersSynced.delete(elements);\n }\n\n if(replaceChildren) {\n if(this.renderer.isSelectable) {\n this.replaceChildren(createCustomFiller(true));\n } else {\n // otherwise https://bugs.chromium.org/p/chromium/issues/detail?id=1144736#c27 will happen\n this.replaceChildren();\n }\n }\n }\n\n if(this.player) {\n animationIntersector.removeAnimationByPlayer(this);\n }\n\n if(globalLazyLoadQueue) {\n globalLazyLoadQueue.delete({div: this});\n }\n\n /* this.disconnectedCallback = */this.elements =\n this.renderer =\n this.player =\n this.syncedPlayer =\n undefined;\n }\n\n public pause() {\n if(this.paused) {\n return;\n }\n\n this.paused = true;\n\n if(this.player instanceof HTMLVideoElement && !this.syncedPlayer) {\n this.renderer.lastPausedVideo = this.player;\n this.player.pause();\n }\n\n if(this.syncedPlayer && !this.syncedPlayer.pausedElements.has(this)) {\n this.syncedPlayer.pausedElements.add(this);\n\n if(this.syncedPlayer.player && this.syncedPlayer.pausedElements.size === this.syncedPlayer.middlewares.size) {\n this.syncedPlayer.player.pause();\n }\n }\n }\n\n public play() {\n if(!this.paused) {\n return;\n }\n\n this.paused = false;\n\n if(this.player instanceof HTMLVideoElement) {\n this.player.currentTime = this.renderer.lastPausedVideo?.currentTime || this.player.currentTime;\n this.player.play().catch(noop);\n }\n\n if(this.syncedPlayer && this.syncedPlayer.pausedElements.has(this)) {\n this.syncedPlayer.pausedElements.delete(this);\n\n if(this.syncedPlayer.pausedElements.size !== this.syncedPlayer.middlewares.size) {\n this.player.play();\n }\n }\n }\n\n public remove() {\n this.clear();\n // this.elements = this.renderer = this.player = undefined;\n }\n\n public get autoplay() {\n return true;\n }\n}\n\ntype CustomEmojiElements = Set;\n\nexport class CustomEmojiRendererElement extends HTMLElement {\n public canvas: HTMLCanvasElement;\n public context: CanvasRenderingContext2D;\n\n public playersSynced: Map;\n public clearedElements: WeakSet;\n public customEmojis: Parameters[1]['customEmojis'];\n public lastPausedVideo: HTMLVideoElement;\n\n public lastRect: DOMRect;\n public isDimensionsSet: boolean;\n\n public animationGroup: AnimationItemGroup;\n public size: MediaSize;\n\n public isSelectable: boolean;\n public isCanvasClean: boolean;\n\n public ignoreSettingDimensions: boolean;\n\n public forceRenderAfterSize: boolean;\n\n public middlewareHelper: MiddlewareHelper;\n\n public auto: boolean;\n\n constructor() {\n super();\n\n this.classList.add('custom-emoji-renderer');\n this.canvas = document.createElement('canvas');\n this.canvas.classList.add('custom-emoji-canvas');\n this.context = this.canvas.getContext('2d');\n this.append(this.canvas);\n\n this.playersSynced = new Map();\n this.clearedElements = new WeakSet();\n this.customEmojis = new Map();\n\n this.animationGroup = 'EMOJI';\n this.isCanvasClean = false;\n }\n\n public connectedCallback() {\n if(emojiRenderers.has(this)) {\n return;\n }\n\n // this.setDimensions();\n // animationIntersector.addAnimation(this, this.animationGroup);\n resizeObserver.observe(this.canvas);\n emojiRenderers.add(this);\n\n this.connectedCallback = undefined;\n }\n\n public disconnectedCallback() {\n if(this.isConnected || !this.auto) {\n return;\n }\n\n this.destroy?.();\n\n this.disconnectedCallback = undefined;\n }\n\n public destroy() {\n // if(this.isConnected) {\n // return;\n // }\n\n resizeObserver.unobserve(this.canvas);\n\n this.customEmojis.forEach((elements) => {\n elements.forEach((element) => {\n element.clear();\n });\n });\n\n emojiRenderers.delete(this);\n this.playersSynced.clear();\n this.middlewareHelper?.clean();\n this.customEmojis.clear();\n\n this.destroy =\n this.lastPausedVideo =\n undefined;\n }\n\n public getOffsets(offsetsMap: Map = new Map()) {\n if(!this.playersSynced.size) {\n return offsetsMap;\n }\n\n const overflowElement = findUpClassName(this, 'scrollable') || this.offsetParent as HTMLElement;\n if(!overflowElement) {\n return offsetsMap;\n }\n\n const overflowRect = overflowElement.getBoundingClientRect();\n const rect = this.getBoundingClientRect();\n\n for(const elements of this.playersSynced.keys()) {\n const elementsArr = Array.from(elements);\n const placeholders = this.isSelectable ? elementsArr.map((element) => element.placeholder) : elementsArr;\n const {visible} = getViewportSlice({\n overflowElement,\n overflowRect,\n elements: placeholders,\n extraSize: this.size.height * 2.5 // let's add some margin\n });\n\n const offsets = visible.map(({rect: elementRect}) => {\n const top = elementRect.top - rect.top;\n const left = elementRect.left - rect.left;\n return {top, left, width: elementRect.width};\n });\n\n if(offsets.length) {\n offsetsMap.set(elements, offsets);\n }\n }\n\n // const rect = this.getBoundingClientRect();\n // const visibleRect = getVisibleRect(this, overflowElement, undefined, rect);\n // const minTop = visibleRect ? visibleRect.rect.top - this.size.height : 0;\n // const maxTop = Infinity;\n // for(const elements of this.playersSynced.keys()) {\n // const offsets = elements.map((element) => {\n // const elementRect = element.getBoundingClientRect();\n // const top = elementRect.top - rect.top;\n // const left = elementRect.left - rect.left;\n // return top >= minTop && (top + elementRect.height) <= maxTop ? {top, left} : undefined;\n // }).filter(Boolean);\n\n // if(offsets.length) {\n // offsetsMap.set(elements, offsets);\n // }\n // }\n\n return offsetsMap;\n }\n\n public clearCanvas() {\n if(this.isCanvasClean) {\n return;\n }\n\n const {context, canvas} = this;\n context.clearRect(0, 0, canvas.width, canvas.height);\n this.isCanvasClean = true;\n }\n\n public render(offsetsMap: ReturnType) {\n const {context, canvas, isDimensionsSet} = this;\n if(!isDimensionsSet) {\n this.setDimensionsFromRect(undefined, false);\n }\n\n this.isCanvasClean = false;\n\n const {width, height, dpr} = canvas;\n for(const [elements, offsets] of offsetsMap) {\n const player = this.playersSynced.get(elements);\n const frame = syncedPlayersFrames.get(player) || (player instanceof HTMLVideoElement ? player : undefined);\n if(!frame) {\n continue;\n }\n\n const isImageData = frame instanceof ImageData;\n let frameWidth: number, frameHeight: number;\n if(player instanceof HTMLVideoElement) {\n frameWidth = this.size.width * dpr;\n frameHeight = this.size.height * dpr;\n } else {\n frameWidth = frame.width;\n frameHeight = frame.height;\n }\n\n // ! check performance of scaling\n const elementWidth = Math.round(offsets[0].width * dpr);\n if(elementWidth !== frameWidth) {\n // if(this.size.width === 36) {\n // console.warn('different width', elementWidth, frameWidth, this);\n // }\n\n frameWidth = elementWidth;\n frameHeight = elementWidth;\n }\n\n const maxTop = height - frameHeight;\n const maxLeft = width - frameWidth;\n\n if(!this.clearedElements.has(elements) && !this.isSelectable) {\n if(this.isSelectable/* && false */) {\n elements.forEach((element) => {\n element.lastChildWas ??= element.lastChild;\n replaceContent(element, element.firstChild);\n });\n } else {\n elements.forEach((element) => {\n element.replaceChildren();\n });\n }\n\n this.clearedElements.add(elements);\n }\n\n offsets.forEach(({top, left}) => {\n top = Math.round(top * dpr), left = Math.round(left * dpr);\n if(left < 0 ||/* top > maxTop || */left > maxLeft) {\n return;\n }\n\n if(isImageData) {\n context.putImageData(frame, left, top);\n } else {\n // context.clearRect(left, top, width, height);\n context.drawImage(frame, left, top, frameWidth, frameHeight);\n }\n });\n }\n }\n\n public checkForAnyFrame() {\n for(const player of this.playersSynced.values()) {\n if(syncedPlayersFrames.has(player) || player instanceof HTMLVideoElement) {\n return true;\n }\n }\n\n return false;\n }\n\n public remove() {\n super.remove();\n // this.canvas.remove();\n }\n\n // public setDimensions() {\n // const {canvas} = this;\n // sequentialDom.mutateElement(canvas, () => {\n // const rect = canvas.getBoundingClientRect();\n // this.setDimensionsFromRect(rect);\n // });\n // }\n\n public setDimensionsFromRect(rect: DOMRect = this.lastRect, forceRenderAfter = true) {\n const {canvas} = this;\n const {dpr} = canvas;\n\n if(this.lastRect !== rect) {\n this.lastRect = rect;\n }\n\n if(!rect || !dpr || this.ignoreSettingDimensions) {\n return;\n }\n\n const {width, height} = rect;\n // if(this.isSelectable) {\n // height = this.parentElement.scrollHeight || height;\n\n // this.style.width = width + 'px';\n // this.style.height = height + 'px';\n // }\n\n const newWidth = Math.floor(Math.round(width * dpr));\n const newHeight = Math.floor(Math.round(height * dpr));\n if(canvas.width === newWidth && canvas.height === newHeight) {\n return;\n }\n\n canvas.width = newWidth;\n canvas.height = newHeight;\n this.isDimensionsSet = true;\n this.isCanvasClean = true;\n\n if(this.forceRenderAfterSize || (this.isSelectable && forceRenderAfter)) {\n this.forceRenderAfterSize = undefined;\n this.forceRender();\n }\n }\n\n public forceRender() {\n if(!this.isDimensionsSet) {\n return;\n }\n\n if(!renderEmojis(new Set([this]))) {\n this.clearCanvas();\n }\n }\n\n public add(\n addCustomEmojis: Parameters[1]['customEmojis'],\n lazyLoadQueue?: LazyLoadQueue | false,\n onlyThumb?: boolean,\n withThumb?: boolean\n ) {\n const renderer = this;\n\n addCustomEmojis.forEach((addElements, docId) => { // prevent adding old elements\n let elements = this.customEmojis.get(docId);\n if(!elements) this.customEmojis.set(docId, elements = new Set());\n else this.clearedElements.delete(elements);\n\n for(const el of addElements) {\n if(elements.has(el)) {\n addElements.delete(el);\n } else {\n el.clean = false;\n el.renderer = renderer;\n el.elements = elements;\n el.middlewareHelper = this.middlewareHelper.get().create();\n elements.add(el);\n\n if(el.lastChildWas && !el.lastChildWas.parentNode) {\n el.append(el.lastChildWas);\n }\n }\n }\n\n if(!addElements.size) {\n addCustomEmojis.delete(docId);\n }\n });\n\n if(!addCustomEmojis.size) {\n return;\n }\n\n const usingOwnQueue = !!(!lazyLoadQueue && lazyLoadQueue !== false && globalLazyLoadQueue);\n\n const docIds = Array.from(addCustomEmojis.keys());\n\n const managers = rootScope.managers;\n const middleware = this.middlewareHelper.get();\n const size = this.size;\n\n const loadPromise = managers.appEmojiManager.getCachedCustomEmojiDocuments(docIds).then((docs) => {\n if(middleware && !middleware()) return;\n\n const loadPromises: Promise[] = [];\n const wrap = (doc: MyDocument, _loadPromises?: Promise[]) => {\n const docId = doc.id;\n const newElements = addCustomEmojis.get(docId);\n const customEmojis = renderer.customEmojis.get(docId);\n const isLottie = doc.sticker === 2;\n const isStatic = doc.mime_type === 'video/webm' && !IS_WEBM_SUPPORTED;\n const willHaveSyncedPlayer = (isLottie || (doc.sticker === 3 && this.isSelectable)) && !onlyThumb && !isStatic;\n\n const loadPromises: Promise[] = [];\n const newElementsArray = Array.from(newElements);\n const promise = wrapSticker({\n div: newElementsArray,\n doc,\n width: size.width,\n height: size.height,\n loop: true,\n play: CUSTOM_EMOJI_INSTANT_PLAY,\n managers,\n isCustomEmoji: true,\n group: 'none',\n loadPromises,\n middleware,\n exportLoad: usingOwnQueue || lazyLoadQueue === false ? 2 : 1, // 2 - export load always, 1 - do not export load if cached static\n needFadeIn: false,\n loadStickerMiddleware: willHaveSyncedPlayer && middleware ? middleware.create().get(() => {\n // if(syncedPlayers.get(key) !== syncedPlayer) {\n // return false;\n // }\n\n // let good = false;\n // for(const middleware of syncedPlayer.middlewares) {\n // if(middleware()) {\n // good = true;\n // break;\n // }\n // }\n\n // return good;\n return !!syncedPlayer.middlewares.size;\n }) : undefined,\n static: isStatic,\n onlyThumb,\n withThumb: withThumb ?? (renderer.clearedElements.has(customEmojis) ? false : undefined),\n syncedVideo: this.isSelectable\n });\n\n if(_loadPromises) {\n promise.then(() => _loadPromises.push(...loadPromises));\n }\n\n const addition: {\n onRender?: (_p: Awaited['render']>) => Promise,\n elements: typeof newElements\n } = {\n elements: newElements\n };\n\n if(doc.sticker === 1 || onlyThumb || isStatic) {\n if(this.isSelectable) {\n addition.onRender = () => Promise.all(loadPromises).then(() => {\n if(middleware && !middleware()) return;\n newElementsArray.forEach((element) => {\n const {placeholder} = element;\n placeholder.src = (element.firstElementChild as HTMLImageElement).src;\n });\n });\n }\n\n return promise.then((res) => ({...res, ...addition}));\n }\n\n // eslint-disable-next-line prefer-const\n addition.onRender = (_p) => Promise.all(loadPromises).then(() => {\n if((middleware && !middleware()) || !doc.animated) {\n return;\n }\n\n const players = Array.isArray(_p) ? _p as HTMLVideoElement[] : [_p as RLottiePlayer];\n const player = Array.isArray(players) ? players[0] : players;\n assumeType(player);\n newElementsArray.forEach((element, idx) => {\n const player = players[idx] || players[0];\n element.player = player;\n\n if(syncedPlayer) {\n element.syncedPlayer = syncedPlayer;\n if(element.paused) {\n element.syncedPlayer.pausedElements.add(element);\n } else if(player.paused) {\n player.play();\n }\n }\n\n if(element.isConnected) {\n animationIntersector.addAnimation(element, element.renderer.animationGroup, undefined, true);\n }\n });\n\n if(player instanceof RLottiePlayer || (player instanceof HTMLVideoElement && this.isSelectable)) {\n syncedPlayer.player = player;\n renderer.playersSynced.set(customEmojis, player);\n }\n\n if(player instanceof RLottiePlayer) {\n player.group = renderer.animationGroup;\n\n player.overrideRender ??= (frame) => {\n syncedPlayersFrames.set(player, frame);\n // frames.set(containers, frame);\n };\n } else if(player instanceof HTMLVideoElement) {\n // player.play();\n\n // const cache = framesCache.getCache(key);\n // let {width, height} = renderer.size;\n // width *= dpr;\n // height *= dpr;\n\n // const onFrame = (frame: ImageBitmap | HTMLCanvasElement) => {\n // topFrames.set(player, frame);\n // player.requestVideoFrameCallback(callback);\n // };\n\n // let frameNo = -1, lastTime = 0;\n // const callback: VideoFrameRequestCallback = (now, metadata) => {\n // const time = player.currentTime;\n // if(lastTime > time) {\n // frameNo = -1;\n // }\n\n // const _frameNo = ++frameNo;\n // lastTime = time;\n // // const frameNo = Math.floor(player.currentTime * 1000 / CUSTOM_EMOJI_FRAME_INTERVAL);\n // // const frameNo = metadata.presentedFrames;\n // const imageBitmap = cache.framesNew.get(_frameNo);\n\n // if(imageBitmap) {\n // onFrame(imageBitmap);\n // } else if(IS_IMAGE_BITMAP_SUPPORTED) {\n // createImageBitmap(player, {resizeWidth: width, resizeHeight: height}).then((imageBitmap) => {\n // cache.framesNew.set(_frameNo, imageBitmap);\n // if(frameNo === _frameNo) onFrame(imageBitmap);\n // });\n // } else {\n // const canvas = document.createElement('canvas');\n // const context = canvas.getContext('2d');\n // canvas.width = width;\n // canvas.height = height;\n // context.drawImage(player, 0, 0);\n // cache.framesNew.set(_frameNo, canvas);\n // onFrame(canvas);\n // }\n // };\n\n // // player.requestVideoFrameCallback(callback);\n // // setInterval(callback, CUSTOM_EMOJI_FRAME_INTERVAL);\n }\n\n if(willHaveSyncedPlayer) {\n const dpr = getLottiePixelRatio(this.size.width, this.size.height);\n renderer.canvas.dpr = dpr;\n setRenderInterval();\n }\n });\n\n let syncedPlayer: SyncedPlayer;\n const key = [docId, size.width, size.height].join('-');\n if(willHaveSyncedPlayer) {\n syncedPlayer = syncedPlayers.get(key);\n if(!syncedPlayer) {\n syncedPlayer = {\n player: undefined,\n middlewares: new Set(),\n pausedElements: new Set(),\n key\n };\n\n syncedPlayers.set(key, syncedPlayer);\n }\n\n for(const element of newElements) {\n const middleware = element.middlewareHelper.get();\n syncedPlayer.middlewares.add(middleware);\n middleware.onClean(() => {\n syncedPlayer.middlewares.delete(middleware);\n\n if(!syncedPlayer.middlewares.size) {\n if(syncedPlayer.player) {\n const frame = syncedPlayersFrames.get(syncedPlayer.player);\n if(frame) {\n (frame as ImageBitmap).close?.();\n syncedPlayersFrames.delete(syncedPlayer.player);\n }\n\n syncedPlayersFrames.delete(syncedPlayer.player);\n if(syncedPlayer.player instanceof RLottiePlayer) {\n syncedPlayer.player.overrideRender = noop;\n syncedPlayer.player.remove();\n } else if(syncedPlayer.player instanceof HTMLVideoElement) {\n const cacheName = framesCache.generateName('' + element.docId, 0, 0, undefined, undefined);\n delete videosCache[cacheName];\n }\n\n syncedPlayer.player = undefined;\n }\n\n if(syncedPlayers.get(syncedPlayer.key) === syncedPlayer && syncedPlayers.delete(syncedPlayer.key) && !syncedPlayers.size) {\n clearRenderInterval();\n }\n }\n });\n }\n }\n\n return promise.then((res) => ({...res, ...addition}));\n };\n\n const missing: DocId[] = [];\n const cachedPromises = docs.map((doc, idx) => {\n if(!doc) {\n missing.push(docIds[idx]);\n return;\n }\n\n return wrap(doc, loadPromises);\n }).filter(Boolean);\n\n const uncachedPromisesPromise = !missing.length ?\n Promise.resolve([] as typeof cachedPromises) :\n managers.appEmojiManager.getCustomEmojiDocuments(missing).then((docs) => {\n if(middleware && !middleware()) return [];\n return docs.filter(Boolean).map((doc) => wrap(doc));\n });\n\n const loadFromPromises = (promises: typeof cachedPromises) => {\n return Promise.all(promises).then((arr) => {\n const promises = arr.map(({load, onRender, elements}) => {\n if(!load) {\n return;\n }\n\n const l = () => load().then(onRender);\n\n if(usingOwnQueue) {\n elements.forEach((element) => {\n globalLazyLoadQueue.push({\n div: element,\n load: () => {\n elements.forEach((element) => {\n globalLazyLoadQueue.delete({div: element});\n });\n\n return l();\n }\n });\n });\n } else {\n return l();\n }\n });\n\n return Promise.all(promises);\n });\n };\n\n const load = () => {\n if(middleware && !middleware()) return;\n const cached = loadFromPromises(cachedPromises);\n const uncached = uncachedPromisesPromise.then((promises) => loadFromPromises(promises));\n return Promise.all([cached, uncached]);\n };\n\n if(lazyLoadQueue) {\n lazyLoadQueue.push({\n div: renderer.canvas,\n load\n });\n } else {\n load();\n }\n\n return Promise.all(cachedPromises).then(() => Promise.all(loadPromises)).then(() => {});\n });\n\n // recordPromise(loadPromise, 'render emojis: ' + docIds.length);\n\n return loadPromise;\n }\n\n public static create(options: CustomEmojiRendererElementOptions) {\n const renderer = new CustomEmojiRendererElement();\n renderer.animationGroup = options.animationGroup;\n renderer.size = options.customEmojiSize || mediaSizes.active.customEmoji;\n renderer.isSelectable = options.isSelectable;\n if(options.wrappingDraft) {\n renderer.contentEditable = 'false';\n renderer.style.height = 'inherit';\n }\n // const middleware = () => !!renderer.disconnectedCallback && (!options.middleware || options.middleware());\n let middleware = options.middleware;\n if(middleware) {\n renderer.middlewareHelper = middleware.create();\n middleware = renderer.middlewareHelper.get();\n middleware.onDestroy(() => {\n renderer.destroy?.();\n });\n } else {\n // console.error('no middleware', this, options);\n renderer.auto = true;\n renderer.middlewareHelper = getMiddleware();\n }\n\n return renderer;\n }\n}\n\ntype CustomEmojiRenderer = CustomEmojiRendererElement;\ntype SyncedPlayer = {\n player: RLottiePlayer | HTMLVideoElement,\n middlewares: Set,\n pausedElements: Set,\n key: string\n};\ntype CustomEmojiFrame = Parameters[0] | HTMLVideoElement;\n\nconst CUSTOM_EMOJI_INSTANT_PLAY = true; // do not wait for animationIntersector\nlet emojiRenderInterval: number;\nconst emojiRenderers: Set = new Set();\nconst syncedPlayers: Map = new Map();\nconst syncedPlayersFrames: Map = new Map();\nexport const renderEmojis = (renderers = emojiRenderers) => {\n const r = Array.from(renderers);\n const t = r.filter((r) => r.isConnected && r.checkForAnyFrame() && !r.ignoreSettingDimensions);\n if(!t.length) {\n return false;\n }\n\n const o = t.map((renderer) => {\n const paused = [...renderer.playersSynced.values()].reduce((acc, v) => acc + +!!v.paused, 0);\n if(renderer.playersSynced.size === paused) {\n return;\n }\n\n const offsets = renderer.getOffsets();\n if(offsets.size) {\n return [renderer, offsets] as const;\n }\n }).filter(Boolean);\n\n for(const [renderer] of o) {\n renderer.clearCanvas();\n }\n\n for(const [renderer, offsets] of o) {\n renderer.render(offsets);\n }\n\n return true;\n};\nconst CUSTOM_EMOJI_FPS = 60;\nconst CUSTOM_EMOJI_FRAME_INTERVAL = 1000 / CUSTOM_EMOJI_FPS;\nconst setRenderInterval = () => {\n if(emojiRenderInterval) {\n return;\n }\n\n emojiRenderInterval = window.setInterval(renderEmojis, CUSTOM_EMOJI_FRAME_INTERVAL);\n renderEmojis();\n};\nconst clearRenderInterval = () => {\n if(!emojiRenderInterval) {\n return;\n }\n\n clearInterval(emojiRenderInterval);\n emojiRenderInterval = undefined;\n};\n\n(window as any).syncedPlayers = syncedPlayers;\n(window as any).emojiRenderers = emojiRenderers;\n\ncustomElements.define('custom-emoji-element', CustomEmojiElement);\ncustomElements.define('custom-emoji-renderer-element', CustomEmojiRendererElement);\n\ntype CustomEmojiRendererElementOptions = Partial<{\n loadPromises: Promise[],\n customEmojiRenderer: CustomEmojiRendererElement,\n\n isSelectable: boolean,\n wrappingDraft: boolean\n}> & WrapSomethingOptions;\n\n/**\n * * Expecting correctly sorted nested entities (RichTextProcessor.sortEntities)\n */\nexport default 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 isSelectable: boolean,\n\n contextHashtag?: string,\n\n // ! recursive, do not provide\n nasty?: {\n i: number,\n usedLength: number,\n text: string,\n lastEntity?: MessageEntity\n },\n voodoo?: boolean,\n customEmojis?: Map,\n customWraps?: Set,\n}> & CustomEmojiRendererElementOptions = {}) {\n const fragment = document.createDocumentFragment();\n if(!text) {\n return fragment;\n }\n\n const nasty = options.nasty ??= {\n i: 0,\n usedLength: 0,\n text\n };\n\n const wrapSomething = (wrapElement: HTMLElement, noFiller?: boolean) => {\n const element = document.createElement('span');\n // element.append(BOM, a, BOM);\n if(options.wrappingDraft) {\n element.contentEditable = 'false';\n }\n // element.style.display = 'inline-block';\n element.classList.add('input-something');\n element.append(/* BOM, */wrapElement);\n\n (lastElement || fragment).append(element);\n\n wrapElement.classList.add('input-selectable');\n // if(wrapElement instanceof HTMLImageElement) {\n // element.prepend(f());\n // } else {\n !noFiller && wrapElement.append(createCustomFiller(true));\n // }\n\n customWraps.add(element);\n\n return element;\n };\n\n options.isSelectable ||= options.wrappingDraft;\n\n const customEmojis = options.customEmojis ??= new Map() as Map;\n const customWraps = options.customWraps ??= new Set();\n\n const entities = options.entities ??= parseEntities(nasty.text);\n\n const passEntities = options.passEntities ??= {};\n const contextSite = options.contextSite ??= 'Telegram';\n const contextExternal = contextSite !== 'Telegram';\n\n const textLength = nasty.text.length;\n const length = entities.length;\n let lastElement: HTMLElement | DocumentFragment;\n for(; nasty.i < length; ++nasty.i) {\n let entity = entities[nasty.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 entity.length = textLength - entity.offset;\n }\n\n if(entity.length) {\n nasty.lastEntity = entity;\n }\n\n let nextEntity = entities[nasty.i + 1];\n\n const startOffset = entity.offset;\n const endOffset = startOffset + entity.length;\n const endPartOffset = Math.min(endOffset, nextEntity?.offset ?? 0xFFFF);\n const fullEntityText = nasty.text.slice(startOffset, endOffset);\n const sliced = nasty.text.slice(startOffset, endPartOffset);\n let partText = sliced;\n\n if(nasty.usedLength < startOffset) {\n (lastElement || fragment).append(nasty.text.slice(nasty.usedLength, startOffset));\n }\n\n if(lastElement) {\n lastElement = fragment;\n }\n\n nasty.usedLength = endPartOffset;\n\n let element: HTMLElement,\n property: 'textContent' | 'alt' = 'textContent',\n usedText = false;\n switch(entity._) {\n case 'messageEntityBold': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n // element.style.fontWeight = 'bold';\n element.style.fontFamily = 'markup-bold';\n } else {\n element = document.createElement('strong');\n }\n }\n\n break;\n }\n\n case 'messageEntityItalic': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n // element.style.fontStyle = 'italic';\n element.style.fontFamily = 'markup-italic';\n } else {\n element = document.createElement('em');\n }\n }\n\n break;\n }\n\n case 'messageEntityStrike': {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n // const styleName = IS_SAFARI ? 'text-decoration' : 'text-decoration-line';\n // element.style.cssText = `${styleName}: line-through;`;\n element.style.fontFamily = 'markup-strikethrough';\n } else/* if(!options.noTextFormat) */ {\n element = document.createElement('del');\n }\n\n break;\n }\n\n case 'messageEntityUnderline': {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n // const styleName = IS_SAFARI ? 'text-decoration' : 'text-decoration-line';\n // element.style.cssText = `${styleName}: underline;`;\n element.style.fontFamily = 'markup-underline';\n } else if(!options.noTextFormat) {\n element = document.createElement('u');\n }\n\n break;\n }\n\n case 'messageEntityPre':\n case 'messageEntityCode': {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n // element.style.fontFamily = 'var(--font-monospace)';\n element.style.fontFamily = 'markup-monospace';\n } else if(!options.noTextFormat) {\n element = document.createElement('code');\n }\n\n break;\n }\n\n // case 'messageEntityPre': {\n // if(options.wrappingDraft) {\n // element = document.createElement('span');\n // element.style.fontFamily = 'var(--font-monospace)';\n // } else if(!options.noTextFormat) {\n // element = document.createElement('pre');\n // const inner = document.createElement('code');\n // if(entity.language) {\n // inner.className = 'language-' + entity.language;\n // inner.textContent = entityText;\n // usedText = true;\n // }\n // }\n\n // break;\n // }\n\n case 'messageEntityHighlight': {\n element = document.createElement('i');\n element.className = 'text-highlight';\n break;\n }\n\n case 'messageEntityBotCommand': {\n // if(!(options.noLinks || options.noCommands || contextExternal)/* && !entity.unsafe */) {\n if(!options.noLinks && passEntities[entity._]) {\n let command = fullEntityText.slice(1);\n let bot: string | boolean;\n let atPos: number;\n if((atPos = command.indexOf('@')) !== -1) {\n bot = command.slice(atPos + 1);\n command = command.slice(0, atPos);\n } else {\n bot = options.fromBot;\n }\n\n element = document.createElement('a');\n (element as HTMLAnchorElement).href = encodeEntities('tg://bot_command?command=' + encodeURIComponent(command) + (bot ? '&bot=' + encodeURIComponent(bot) : ''));\n if(!contextExternal) {\n element.setAttribute('onclick', 'execBotCommand(this)');\n }\n }\n\n break;\n }\n\n case 'messageEntityCustomEmoji': {\n if(!IS_CUSTOM_EMOJI_SUPPORTED) {\n break;\n }\n\n while(nextEntity?._ === 'messageEntityEmoji' && nextEntity.offset < endOffset) {\n ++nasty.i;\n nasty.lastEntity = nextEntity;\n nasty.usedLength += nextEntity.length;\n nextEntity = entities[nasty.i + 1];\n }\n\n const customEmojiElement = element = CustomEmojiElement.create(entity.document_id);\n const {docId} = customEmojiElement;\n let set = customEmojis.get(docId);\n if(!set) customEmojis.set(docId, set = new Set());\n set.add(customEmojiElement);\n customEmojiElement.dataset.stickerEmoji = fullEntityText;\n\n if(options.wrappingDraft) {\n element = document.createElement('img');\n (element as HTMLImageElement).alt = fullEntityText;\n for(const i in customEmojiElement.dataset) {\n element.dataset[i] = customEmojiElement.dataset[i];\n }\n (element as any).customEmojiElement = customEmojiElement;\n customEmojiElement.placeholder = element as HTMLImageElement;\n element.classList.add('custom-emoji-placeholder');\n (element as HTMLImageElement).src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAAtJREFUGFdjYAACAAAFAAGq1chRAAAAAElFTkSuQmCC';\n property = 'alt';\n break;\n }\n\n if(options.isSelectable) {\n // const s = document.createElement('span');\n // s.append(fullEntityText);\n // element.append(s);\n // element.textContent = fullEntityText;\n // element.textContent = 'a';\n // element.contentEditable = 'false';\n\n // const x = f();\n // x.style.display = 'inline-block';\n // x.contentEditable = 'false';\n // (lastElement || fragment).append(BOM);\n // (lastElement || fragment).append(x);\n\n element = wrapSomething(element, !!options.customEmojiRenderer);\n\n // const a = element;\n // element = document.createElement('span');\n // element.append(BOM, a, BOM);\n // element.contentEditable = 'false';\n }\n\n property = 'alt';\n break;\n }\n\n case 'messageEntityEmoji': {\n let isSupported = IS_EMOJI_SUPPORTED;\n if(isSupported) {\n for(const version in EmojiVersions) {\n if(version) {\n const emojiData = EmojiVersions[version as EMOJI_VERSION];\n if(emojiData.hasOwnProperty(entity.unicode) && !EMOJI_VERSIONS_SUPPORTED[version as EMOJI_VERSION]) {\n isSupported = false;\n break;\n }\n }\n }\n }\n\n // if(!(options.wrappingDraft && isSupported)) { // * fix safari emoji\n if(!isSupported) { // no wrapping needed\n // if(isSupported) { // ! contenteditable=\"false\" ะฝัƒะถะตะฝ ะดะปั ะฟะพะปั ะฒะฒะพะดะฐ, ะธะฝะฐั‡ะต ั‚ะฐะผ ะฑัƒะดะตั‚ ะผะตะฝัั‚ัŒัั ัˆั€ะธั„ั‚ ะฒ Safari, ะธะปะธ ะถะต ั€ะตะฝะดะตั€ะธั‚ัŒ ัะผะฐะนะปะธะบ ะฝะฐะฟั€ัะผัƒัŽ, ะฑะตะท ะบะพะฝั‚ะตะนะฝะตั€ะฐ\n // insertPart(entity, '', '');\n // } else {\n element = document.createElement('img');\n (element as HTMLImageElement).src = `assets/img/emoji/${entity.unicode}.png`;\n property = 'alt';\n element.className = 'emoji';\n\n // if(options.isSelectable) {\n // usedText = true;\n // (element as HTMLImageElement).alt = partText;\n // element = wrapSomething(element);\n // }\n\n // const a = element;\n // a.contentEditable = 'false';\n // element = document.createElement('span');\n // element.append(a);\n // element.contentEditable = 'false';\n // }\n // } else if(options.mustWrapEmoji) {\n } else if(!options.wrappingDraft) {\n element = document.createElement('span');\n element.className = 'emoji';\n }/* else if(!IS_SAFARI) {\n insertPart(entity, '', '');\n } */\n /* if(!isSupported) {\n insertPart(entity, `\"`,`);\n } */\n\n break;\n }\n\n case 'messageEntityCaret': {\n element = document.createElement('span');\n element.className = 'composer-sel';\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 // let inner: string;\n let url: string = (entity as MessageEntity.messageEntityTextUrl).url || fullEntityText;\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 if(nextEntity?._ === 'messageEntityUrl' &&\n nextEntity.length === entity.length &&\n nextEntity.offset === entity.offset) {\n nasty.lastEntity = nextEntity;\n ++nasty.i;\n }\n\n if(url !== fullEntityText) {\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 url :\n `javascript:electronHelpers.openExternal('${url}');`;\n\n element = document.createElement('a');\n element.className = 'anchor-url';\n (element as HTMLAnchorElement).href = href;\n\n if(!(currentContext || typeof electronHelpers !== 'undefined')) {\n setBlankToAnchor(element as HTMLAnchorElement);\n }\n\n if(onclick) {\n element.setAttribute('onclick', onclick + '(this)');\n }\n }\n\n break;\n }\n\n case 'messageEntityEmail': {\n if(!options.noLinks) {\n element = document.createElement('a');\n (element as HTMLAnchorElement).href = encodeEntities('mailto:' + fullEntityText);\n setBlankToAnchor(element as HTMLAnchorElement);\n }\n\n break;\n }\n\n case 'messageEntityHashtag': {\n const contextUrl = !options.noLinks && SITE_HASHTAGS[contextSite];\n if(contextUrl) {\n const hashtag = fullEntityText.slice(1);\n element = document.createElement('a');\n element.className = 'anchor-hashtag';\n (element as HTMLAnchorElement).href = contextUrl.replace('{1}', encodeURIComponent(hashtag));\n if(contextExternal) {\n setBlankToAnchor(element as HTMLAnchorElement);\n } else {\n element.setAttribute('onclick', 'searchByHashtag(this)');\n }\n }\n\n break;\n }\n\n case 'messageEntityMentionName': {\n if(!(options.noLinks && !passEntities[entity._])) {\n element = document.createElement('a');\n (element as HTMLAnchorElement).href = buildURLHash('' + entity.user_id);\n element.className = 'follow';\n element.dataset.follow = '' + entity.user_id;\n }\n\n break;\n }\n\n case 'messageEntityMention': {\n // const contextUrl = !options.noLinks && siteMentions[contextSite];\n if(!options.noLinks) {\n const username = fullEntityText.slice(1);\n\n element = wrapTelegramUrlToAnchor('t.me/' + username);\n element.className = 'mention';\n\n // insertPart(entity, ``, '');\n }\n\n break;\n }\n\n case 'messageEntitySpoiler': {\n if(options.noTextFormat) {\n const encoded = encodeSpoiler(nasty.text, entity);\n nasty.text = encoded.text;\n partText = encoded.entityText;\n if(endPartOffset !== endOffset) {\n nasty.usedLength += endOffset - endPartOffset;\n }\n let n: MessageEntity;\n for(; n = entities[nasty.i + 1], n && n.offset < endOffset;) {\n // nasty.usedLength += n.length;\n ++nasty.i;\n nasty.lastEntity = n;\n nextEntity = entities[nasty.i + 1];\n }\n } else if(options.wrappingDraft) {\n element = document.createElement('span');\n // element.style.fontFamily = 'spoiler';\n element.style.fontFamily = 'markup-spoiler';\n } else {\n const container = document.createElement('span');\n container.className = 'spoiler';\n element = document.createElement('span');\n element.className = 'spoiler-text';\n element.textContent = partText;\n usedText = true;\n container.append(element);\n fragment.append(container);\n\n container[`on${CLICK_EVENT_NAME}`] = (window as any).onSpoilerClick;\n }\n\n break;\n }\n }\n\n if(!usedText && partText) {\n if(element) {\n // @ts-ignore\n element[property] = partText;\n } else {\n (element || fragment).append(partText);\n }\n }\n\n if(element && !element.parentNode) {\n (lastElement || fragment).append(element);\n }\n\n while(nextEntity && nextEntity.offset < endOffset) {\n ++nasty.i;\n\n (element || fragment).append(wrapRichText(nasty.text, {\n ...options,\n voodoo: true\n }));\n\n nextEntity = entities[nasty.i + 1];\n }\n\n // if(!element?.parentNode) {\n // (lastElement || fragment).append(element ?? partText);\n // }\n\n if(nasty.usedLength <= endOffset) {\n if(nasty.usedLength < endOffset) {\n (element || fragment).append(nasty.text.slice(nasty.usedLength, endOffset));\n nasty.usedLength = endOffset;\n }\n\n lastElement = fragment;\n nasty.lastEntity = undefined;\n } else if(entity.length > partText.length && element) {\n lastElement = element;\n } else {\n lastElement = fragment;\n }\n\n if(options.voodoo) {\n return fragment;\n }\n }\n\n if(nasty.lastEntity) {\n nasty.usedLength = nasty.lastEntity.offset + nasty.lastEntity.length;\n }\n\n if(nasty.usedLength < textLength) {\n (lastElement || fragment).append(nasty.text.slice(nasty.usedLength));\n }\n\n if((!options.wrappingDraft || options.customEmojiRenderer) && customEmojis.size) {\n let renderer = options.customEmojiRenderer;\n if(!renderer) {\n renderer = CustomEmojiRendererElement.create(options);\n fragment.prepend(renderer);\n }\n\n const loadPromise = renderer.add(customEmojis, options.lazyLoadQueue, options.wrappingDraft);\n options.loadPromises?.push(loadPromise);\n // recordPromise(loadPromise, 'render emojis: ' + docIds.length);\n }\n\n if(customWraps.size) {\n insertCustomFillers(customWraps);\n }\n\n return fragment;\n}\n\nexport const createCustomFiller = (notFiller?: boolean) => {\n const x = document.createElement('span');\n x.classList.add(notFiller ? 'input-filler2' : 'input-filler');\n x.textContent = BOM;\n return x;\n};\n\nexport function isCustomFillerNeededBySiblingNode(node: ChildNode) {\n if(\n // !node?.textContent ||\n // node.textContent.endsWith('\\n') ||\n node?.textContent !== BOM ||\n (node as HTMLElement)?.getAttribute?.('contenteditable') === 'false'\n ) {\n // if(!node || (node as HTMLElement).firstElementChild || node.textContent.endsWith('\\n')) {\n if(!node || node.textContent !== BOM || (node as HTMLElement).firstElementChild) {\n return 2;\n } else if(node.nodeType === node.ELEMENT_NODE) {\n return 1;\n }/* else if(node.nodeType === node.TEXT_NODE && !node.nodeValue) {\n (node as CharacterData).insertData(0, BOM);\n } */\n }\n\n return 0;\n}\n\nexport function insertCustomFillers(elements: Iterable) {\n const check = (element: HTMLElement, node: ChildNode, method: 'before' | 'after') => {\n const needed = isCustomFillerNeededBySiblingNode(node);\n if(needed === 2) {\n element[method](createCustomFiller());\n } else if(needed === 1) {\n node.appendChild(document.createTextNode(BOM));\n }\n };\n\n for(const element of elements) {\n const {previousSibling, nextSibling} = element;\n check(element, previousSibling, 'before');\n check(element, nextSibling, 'after');\n }\n}\n\n(window as any).wrapRichText = wrapRichText;\n","// just for the future\nexport default function buildURLHash(str: string) {\n return '#' + encodeURIComponent(str);\n}\n","import wrapUrl from './wrapUrl';\n\nexport default function wrapTelegramUrlToAnchor(url1: string) {\n const {url, onclick} = wrapUrl(url1);\n const element = document.createElement('a');\n (element as HTMLAnchorElement).href = url;\n if(onclick) {\n element.setAttribute('onclick', `${onclick}(this)`);\n }\n\n return element;\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 CAN_USE_TRANSFERABLES from '../../environment/canUseTransferables';\nimport EventListenerBase from '../../helpers/eventListenerBase';\n\nexport default class QueryableWorker extends EventListenerBase<{\n ready: () => void,\n frame: (reqId: number, frameNo: number, frame: Uint8ClampedArray | ImageBitmap) => 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(args: any[], transfer?: Transferable[]) {\n this.worker.postMessage({\n queryMethod: args.shift(),\n queryMethodArguments: args\n }, CAN_USE_TRANSFERABLES ? transfer: undefined);\n }\n}\n","const IS_WEB_ASSEMBLY_SUPPORTED = typeof(WebAssembly) !== 'undefined';\n\nexport default IS_WEB_ASSEMBLY_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 animationIntersector, {AnimationItemGroup} from '../../components/animationIntersector';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport pause from '../../helpers/schedulers/pause';\nimport {logger, LogTypes} from '../logger';\nimport RLottiePlayer, {RLottieOptions} from './rlottiePlayer';\nimport QueryableWorker from './queryableWorker';\nimport blobConstruct from '../../helpers/blob/blobConstruct';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport IS_WEB_ASSEMBLY_SUPPORTED from '../../environment/webAssemblySupport';\nimport makeError from '../../helpers/makeError';\nimport App from '../../config/app';\n\nexport type LottieAssetName = 'EmptyFolder' | 'Folders_1' | 'Folders_2' |\n 'TwoFactorSetupMonkeyClose' | 'TwoFactorSetupMonkeyCloseAndPeek' |\n 'TwoFactorSetupMonkeyCloseAndPeekToIdle' | 'TwoFactorSetupMonkeyIdle' |\n 'TwoFactorSetupMonkeyPeek' | 'TwoFactorSetupMonkeyTracking' |\n 'voice_outlined2' | 'voip_filled' | 'voice_mini' | 'jolly_roger';\n\nexport class LottieLoader {\n private loadPromise: Promise = !IS_WEB_ASSEMBLY_SUPPORTED ? Promise.reject() : undefined;\n private loaded = false;\n\n private workersLimit = App.threads;\n private players: {[reqId: number]: RLottiePlayer} = {};\n private playersByCacheName: {[cacheName: string]: Set} = {};\n\n private workers: QueryableWorker[] = [];\n private curWorkerNum = 0;\n\n private log = logger('LOTTIE', LogTypes.Error);\n\n public getAnimation(element: HTMLElement) {\n for(const i in this.players) {\n if(this.players[i].el.includes(element)) {\n return this.players[i];\n }\n }\n\n return null;\n }\n\n public setLoop(loop: boolean) {\n let changed = false;\n for(const i in this.players) {\n const player = this.players[i];\n if(player._loop && player.loop !== loop) {\n changed = true;\n player.loop = loop;\n\n // if(player._autoplay && player.autoplay !== player._autoplay) {\n player.autoplay = player._autoplay;\n // }\n }\n }\n\n return changed;\n }\n\n public loadLottieWorkers() {\n if(this.loadPromise) {\n return this.loadPromise;\n }\n\n return this.loadPromise = new Promise((resolve, reject) => {\n let remain = this.workersLimit;\n for(let i = 0; i < this.workersLimit; ++i) {\n const worker = new Worker(new URL('./rlottie.worker.ts', import.meta.url));\n const queryableWorker = this.workers[i] = new QueryableWorker(worker);\n\n queryableWorker.addEventListener('ready', () => {\n this.log('worker #' + i + ' ready');\n\n queryableWorker.addEventListener('frame', this.onFrame);\n queryableWorker.addEventListener('loaded', this.onPlayerLoaded);\n queryableWorker.addEventListener('error', this.onPlayerError);\n\n --remain;\n if(!remain) {\n this.log('workers ready');\n resolve();\n this.loaded = true;\n }\n }, {once: true});\n\n queryableWorker.addEventListener('workerError', (error) => {\n reject('rlottie load error: ' + error.message);\n this.loaded = false;\n }, {once: true});\n }\n });\n }\n\n private makeAssetUrl(name: LottieAssetName) {\n return 'assets/tgs/' + name + '.json';\n }\n\n public loadAnimationAsAsset(params: Omit, name: LottieAssetName) {\n // (params as RLottieOptions).name = name;\n return this.loadAnimationFromURL(params, this.makeAssetUrl(name));\n }\n\n public loadAnimationDataFromURL(url: string): Promise {\n if(!IS_WEB_ASSEMBLY_SUPPORTED) {\n return this.loadPromise as any;\n }\n\n this.loadLottieWorkers();\n\n return fetch(url)\n .then((res) => {\n if(!res.headers || res.headers.get('content-type') === 'application/octet-stream') {\n return res.arrayBuffer()\n .then((data) => apiManagerProxy.invokeCrypto('gzipUncompress', data))\n .then((arr) => blobConstruct(arr as Uint8Array, ''));\n } else {\n return res.blob();\n }\n });\n /* .then((str) => {\n return new Promise((resolve) => setTimeout(() => resolve(str), 2e3));\n }) */\n }\n\n public loadAnimationFromURLManually(name: LottieAssetName) {\n const url = this.makeAssetUrl(name);\n return this.loadAnimationDataFromURL(url).then((blob) => {\n return (params: Omit) => this.loadAnimationFromURLNext(blob, params, url);\n });\n }\n\n public loadAnimationFromURL(params: Omit, url: string) {\n return this.loadAnimationDataFromURL(url).then((blob) => {\n return this.loadAnimationFromURLNext(blob, params, url);\n });\n }\n\n public loadAnimationFromURLNext(blob: Blob, params: Omit, url: string) {\n const newParams = Object.assign(params, {animationData: blob, needUpscale: true});\n newParams.name ||= url;\n return this.loadAnimationWorker(newParams);\n }\n\n public waitForFirstFrame(player: RLottiePlayer) {\n return Promise.race([\n /* new Promise((resolve) => {\n player.addEventListener('firstFrame', () => {\n setTimeout(() => resolve(), 1500);\n }, true);\n }) */\n new Promise((resolve) => {\n player.addEventListener('firstFrame', resolve, {once: true});\n }),\n pause(2500)\n ]).then(() => player);\n }\n\n public async loadAnimationWorker(params: RLottieOptions): Promise {\n if(!IS_WEB_ASSEMBLY_SUPPORTED) {\n return this.loadPromise as any;\n }\n\n if(!this.loaded) {\n await this.loadLottieWorkers();\n }\n\n const {middleware, group = ''} = params;\n if(middleware && !middleware()) {\n throw makeError('MIDDLEWARE');\n }\n\n if(params.sync) {\n const cacheName = RLottiePlayer.CACHE.generateName(params.name, params.width, params.height, params.color, params.toneIndex);\n const players = this.playersByCacheName[cacheName];\n if(players?.size) {\n return Promise.resolve(players.entries().next().value[0]);\n }\n }\n\n const containers = Array.isArray(params.container) ? params.container : [params.container];\n if(!params.width || !params.height) {\n params.width = parseInt(containers[0].style.width);\n params.height = parseInt(containers[0].style.height);\n }\n\n if(!params.width || !params.height) {\n throw new Error('No size for sticker!');\n }\n\n params.group = group;\n\n const player = this.initPlayer(containers, params);\n\n animationIntersector.addAnimation(player, group, undefined, middleware);\n\n return player;\n }\n\n private onPlayerLoaded = (reqId: number, frameCount: number, fps: number) => {\n const player = this.players[reqId];\n if(!player) {\n this.log.warn('onPlayerLoaded on destroyed player:', reqId, frameCount);\n return;\n }\n\n this.log.debug('onPlayerLoaded');\n player.onLoad(frameCount, fps);\n };\n\n private onFrame = (reqId: number, frameNo: number, frame: Uint8ClampedArray | ImageBitmap) => {\n const player = this.players[reqId];\n if(!player) {\n this.log.warn('onFrame on destroyed player:', reqId, frameNo);\n return;\n }\n\n if(player.clamped !== undefined && frame instanceof Uint8ClampedArray) {\n player.clamped = frame;\n }\n\n player.renderFrame(frame, frameNo);\n };\n\n private onPlayerError = (reqId: number, error: Error) => {\n const player = this.players[reqId];\n if(!player) {\n return;\n }\n\n // ! will need refactoring later, this is not the best way to remove the animation\n const animations = animationIntersector.getAnimations(player.el[0]);\n animations.forEach((animation) => {\n animationIntersector.removeAnimation(animation);\n });\n };\n\n public onDestroy(reqId: number) {\n delete this.players[reqId];\n }\n\n public destroyWorkers() {\n if(!IS_WEB_ASSEMBLY_SUPPORTED) {\n return;\n }\n\n this.workers.forEach((worker, idx) => {\n worker.terminate();\n this.log('worker #' + idx + ' terminated');\n });\n\n this.log('workers destroyed');\n this.workers.length = 0;\n this.curWorkerNum = 0;\n this.loaded = false;\n this.loadPromise = undefined;\n }\n\n private initPlayer(el: RLottiePlayer['el'], options: RLottieOptions) {\n const player = new RLottiePlayer({\n el,\n worker: this.workers[this.curWorkerNum++],\n options\n });\n\n const {reqId, cacheName} = player;\n this.players[reqId] = player;\n\n const playersByCacheName = cacheName ? this.playersByCacheName[cacheName] ??= new Set() : undefined;\n if(cacheName) {\n playersByCacheName.add(player);\n }\n\n if(this.curWorkerNum >= this.workers.length) {\n this.curWorkerNum = 0;\n }\n\n player.addEventListener('destroy', () => {\n this.onDestroy(reqId);\n if(playersByCacheName.delete(player) && !playersByCacheName.size) {\n delete this.playersByCacheName[cacheName];\n }\n });\n\n player.loadFromData(options.animationData);\n\n return player;\n }\n}\n\nconst lottieLoader = new LottieLoader();\nMOUNT_CLASS_TO.lottieLoader = lottieLoader;\nexport default lottieLoader;\n","/*\n * 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 {AnimationItemGroup, AnimationItemWrapper} from '../../components/animationIntersector';\nimport type {Middleware} from '../../helpers/middleware';\nimport CAN_USE_TRANSFERABLES from '../../environment/canUseTransferables';\nimport IS_APPLE_MX from '../../environment/appleMx';\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/clamp';\nimport QueryableWorker from './queryableWorker';\nimport IS_IMAGE_BITMAP_SUPPORTED from '../../environment/imageBitmapSupport';\nimport framesCache, {FramesCache, FramesCacheItem} from '../../helpers/framesCache';\n\nexport type RLottieOptions = {\n container: HTMLElement | HTMLElement[],\n middleware?: Middleware,\n canvas?: HTMLCanvasElement,\n autoplay?: boolean,\n animationData: Blob,\n loop?: RLottiePlayer['loop'],\n width?: number,\n height?: number,\n group?: AnimationItemGroup,\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 sync?: boolean\n};\n\nexport type RLottieColor = [number, number, number];\n\nexport function getLottiePixelRatio(width: number, height: number, needUpscale?: boolean) {\n let pixelRatio = clamp(window.devicePixelRatio, 1, 2);\n if(pixelRatio > 1 && !needUpscale) {\n if(width > 90 && height > 90) {\n if(!IS_APPLE && mediaSizes.isMobile) {\n pixelRatio = 1;\n }\n } else if((width > 60 && height > 60) || IS_ANDROID) {\n pixelRatio = Math.max(1.5, pixelRatio - 1.5);\n }\n }\n\n return pixelRatio;\n}\n\nexport default class RLottiePlayer extends EventListenerBase<{\n enterFrame: (frameNo: number) => void,\n ready: () => void,\n firstFrame: () => void,\n cached: () => void,\n destroy: () => void\n}> implements AnimationItemWrapper {\n public static CACHE = framesCache;\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 public name: string;\n public 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 contexts: 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: number | boolean = true;\n public _loop: RLottiePlayer['loop']; // ! will be used to store original value for settings.stickers.loop\n public group: AnimationItemGroup = '';\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 cache: FramesCacheItem;\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 public overrideRender: (frame: ImageData | HTMLCanvasElement | ImageBitmap) => void;\n private renderedFirstFrame: boolean;\n\n private raw: boolean;\n\n constructor({el, worker, options}: {\n el: RLottiePlayer['el'],\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(const 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 this.raw = this.color !== undefined;\n\n if(this.name) {\n this.cacheName = RLottiePlayer.CACHE.generateName(this.name, this.width, this.height, this.color, this.toneIndex);\n }\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 && !IS_APPLE_MX)) && 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 = getLottiePixelRatio(this.width, this.height, options.needUpscale);\n\n this.width = Math.round(this.width * pixelRatio);\n this.height = Math.round(this.height * pixelRatio);\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 // this.cachingDelta = 0;\n // if(isApple) {\n // this.cachingDelta = 0; //2 // 50%\n // }\n\n if(!this.canvas) {\n this.canvas = this.el.map(() => {\n const canvas = document.createElement('canvas');\n canvas.classList.add('rlottie');\n canvas.width = this.width;\n canvas.height = this.height;\n canvas.dpr = pixelRatio;\n return canvas;\n });\n }\n\n this.contexts = this.canvas.map((canvas) => canvas.getContext('2d'));\n\n if(!IS_IMAGE_BITMAP_SUPPORTED || this.raw) {\n this.imageData = new ImageData(this.width, this.height);\n\n if(CAN_USE_TRANSFERABLES) {\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\n }\n }\n\n if(this.name) {\n this.cache = RLottiePlayer.CACHE.getCache(this.cacheName);\n } else {\n this.cache = FramesCache.createCache();\n }\n }\n\n public clearCache() {\n if(this.cachingDelta === Infinity) {\n return;\n }\n\n if(this.cacheName && this.cache.counter > 1) { // skip clearing because same sticker can be still visible\n return;\n }\n\n this.cache.clearCache();\n }\n\n public sendQuery(args: any[], transfer?: Transferable[]) {\n this.worker.sendQuery([args.shift(), this.reqId, ...args], transfer);\n }\n\n public loadFromData(data: RLottieOptions['animationData']) {\n this.sendQuery(['loadFromData', data, this.width, this.height, this.toneIndex, this.color !== undefined/* , this.canvas.transferControlToOffscreen() */]);\n }\n\n public play() {\n if(!this.paused) {\n return;\n }\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 this.rafId = undefined;\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 this.pause();\n this.sendQuery(['destroy']);\n if(this.cacheName) RLottiePlayer.CACHE.releaseCache(this.cacheName);\n this.dispatchEvent('destroy');\n this.cleanup();\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 | HTMLCanvasElement | ImageBitmap, frameNo: number) {\n /* this.setListenerResult('enterFrame', frameNo);\n return; */\n\n try {\n if(frame instanceof Uint8ClampedArray) {\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\n // this.context.putImageData(new ImageData(frame, this.width, this.height), 0, 0);\n this.contexts.forEach((context, idx) => {\n let cachedSource: HTMLCanvasElement | ImageBitmap = this.cache.framesNew.get(frameNo);\n if(!(frame instanceof Uint8ClampedArray)) {\n cachedSource = frame;\n } else if(idx > 0) {\n cachedSource = this.canvas[0];\n }\n\n if(!cachedSource) {\n // console.log('drawing from data');\n const c = document.createElement('canvas');\n c.width = context.canvas.width;\n c.height = context.canvas.height;\n c.getContext('2d').putImageData(this.imageData, 0, 0);\n this.cache.framesNew.set(frameNo, c);\n cachedSource = c;\n }\n\n if(this.overrideRender && this.renderedFirstFrame) {\n this.overrideRender(cachedSource || this.imageData);\n } else if(cachedSource) {\n // console.log('drawing from canvas');\n context.clearRect(0, 0, cachedSource.width, cachedSource.height);\n context.drawImage(cachedSource, 0, 0);\n } else {\n context.putImageData(this.imageData, 0, 0);\n }\n\n if(!this.renderedFirstFrame) {\n this.renderedFirstFrame = true;\n }\n });\n\n this.dispatchEvent('enterFrame', frameNo);\n } catch(err) {\n console.error('RLottiePlayer renderFrame error:', err/* , frame */, this.width, this.height);\n this.autoplay = false;\n this.pause();\n }\n }\n\n public renderFrame(frame: Parameters[0], frameNo: number) {\n const canCacheFrame = this.cachingDelta && (frameNo % this.cachingDelta || !frameNo);\n if(canCacheFrame) {\n if(frame instanceof Uint8ClampedArray && !this.cache.frames.has(frameNo)) {\n this.cache.frames.set(frameNo, new Uint8ClampedArray(frame));// frame;\n } else if(IS_IMAGE_BITMAP_SUPPORTED && frame instanceof ImageBitmap && !this.cache.framesNew.has(frameNo)) {\n this.cache.framesNew.set(frameNo, frame);\n }\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\n if(delta < 0) {\n const timeout = this.frInterval > -delta ? -delta % this.frInterval : this.frInterval;\n if(this.rafId) clearTimeout(this.rafId);\n this.rafId = window.setTimeout(() => {\n this.renderFrame2(frame, frameNo);\n }, timeout);\n // await new Promise((resolve) => setTimeout(resolve, -delta % this.frInterval));\n return;\n }\n }\n\n this.renderFrame2(frame, frameNo);\n }\n\n public requestFrame(frameNo: number) {\n const frame = this.cache.frames.get(frameNo);\n const frameNew = this.cache.framesNew.get(frameNo);\n if(frameNew) {\n this.renderFrame(frameNew, frameNo);\n } else if(frame) {\n this.renderFrame(frame, frameNo);\n } else {\n if(this.clamped && !this.clamped.length) { // fix detached\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\n }\n\n this.sendQuery(['renderFrame', frameNo], this.clamped ? [this.clamped.buffer] : undefined);\n }\n }\n\n private onLap() {\n if(++this.playedTimes === this.loop) {\n this.loop = false;\n }\n\n if(!this.loop) {\n this.pause(false);\n return false;\n }\n\n return true;\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 return 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 return this.onLap();\n }\n\n return true;\n }\n\n public setMainLoop() {\n // window.cancelAnimationFrame(this.rafId);\n clearTimeout(this.rafId);\n this.rafId = undefined;\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[0].parentNode && this.el && !this.overrideRender) {\n this.el.forEach((container, idx) => container.append(this.canvas[idx]));\n }\n\n // console.log('enterFrame firstFrame');\n\n // let lastTime = this.frThen;\n this.frameListener = () => {\n if(this.paused || !this.currentMethod) {\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 // setInterval(this.frameListener, this.frInterval);\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","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Page from './page';\nimport lottieLoader from '../lib/rlottie/lottieLoader';\nimport {horizontalMenu} from '../components/horizontalMenu';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport fastSmoothScroll from '../helpers/fastSmoothScroll';\nimport whichChild from '../helpers/dom/whichChild';\n\nclass PagesManager {\n private pageId = -1;\n private page: Page;\n\n private selectTab: ReturnType;\n public pagesDiv: HTMLDivElement;\n public scrollableDiv: HTMLElement;\n\n constructor() {\n this.pagesDiv = document.getElementById('auth-pages') as HTMLDivElement;\n this.scrollableDiv = this.pagesDiv.querySelector('.scrollable') as HTMLElement;\n this.selectTab = horizontalMenu(null, this.scrollableDiv.querySelector('.tabs-container') as HTMLDivElement, null, () => {\n if(this.page?.onShown) {\n this.page.onShown();\n }\n });\n }\n\n public setPage(page: Page) {\n if(page.isAuthPage) {\n this.pagesDiv.style.display = '';\n\n const id = whichChild(page.pageEl);\n if(this.pageId === id) return;\n\n this.selectTab(id);\n\n if(this.pageId !== -1 && id > 1) {\n lottieLoader.loadLottieWorkers();\n }\n\n\n this.pageId = id;\n\n if(this.scrollableDiv) {\n fastSmoothScroll({\n container: this.scrollableDiv,\n element: this.scrollableDiv.firstElementChild as HTMLElement,\n position: 'start'\n });\n }\n } else {\n this.pagesDiv.style.display = 'none';\n page.pageEl.style.display = '';\n\n this.pageId = -1;\n }\n\n this.page = page;\n }\n}\n\nconst pagesManager = new PagesManager();\nMOUNT_CLASS_TO.pagesManager = pagesManager;\nexport default pagesManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport pagesManager from './pagesManager';\n\nexport default class Page {\n public pageEl: HTMLDivElement;\n private installed = false;\n\n constructor(\n className: string,\n public isAuthPage: boolean,\n private onFirstMount?: (...args: any[]) => Promise | void,\n private onMount?: (...args: any[]) => Promise | void,\n public onShown?: () => void\n ) {\n this.pageEl = document.body.querySelector('.' + className) as HTMLDivElement;\n }\n\n public async mount(...args: any[]) {\n // this.pageEl.style.display = '';\n\n if(this.onMount) {\n const res = this.onMount(...args);\n if(res instanceof Promise) {\n await res;\n }\n }\n\n if(!this.installed) {\n if(this.onFirstMount) {\n try {\n const res = this.onFirstMount(...args);\n if(res instanceof Promise) {\n await res;\n }\n } catch(err) {\n console.error('PAGE MOUNT ERROR:', err);\n }\n }\n\n this.installed = true;\n }\n\n pagesManager.setPage(this);\n }\n}\n","// https://github.com/twitter/twemoji-parser/blob/master/src/lib/regex.js\n\nexport function encodeEmoji(emojiText: string) {\n const codepoints = toCodePoints(removeVS16s(emojiText)).join('-');\n return codepoints;\n}\n\nconst vs16RegExp = /\\uFE0F/g;\n// avoid using a string literal like '\\u200D' here because minifiers expand it inline\nconst zeroWidthJoiner = String.fromCharCode(0x200d);\n\nconst removeVS16s = (rawEmoji: string) => (rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, '') : rawEmoji);\n\nexport function toCodePoints(unicodeSurrogates: string): Array {\n const points = [];\n let char = 0;\n let previous = 0;\n let i = 0;\n while(i < unicodeSurrogates.length) {\n char = unicodeSurrogates.charCodeAt(i++);\n if(previous) {\n points.push((0x10000 + ((previous - 0xd800) << 10) + (char - 0xdc00)).toString(16));\n previous = 0;\n } else if(char > 0xd800 && char <= 0xdbff) {\n previous = char;\n } else {\n points.push(char.toString(16));\n }\n }\n\n if(points.length && points[0].length === 2) {\n points[0] = '00' + points[0];\n }\n\n return points;\n}\n\nexport function getEmojiToneIndex(input: string) {\n const match = input.match(/[\\uDFFB-\\uDFFF]/);\n return match ? 5 - (57343 - match[0].charCodeAt(0)) : 0;\n}\n\nconst VIRTUAL_COUNTRIES_EMOJIS: Map = new Map([\n ['FT', '๐Ÿดโ€โ˜ ']\n]);\n\nexport function getCountryEmoji(iso2: string) {\n return VIRTUAL_COUNTRIES_EMOJIS.get(iso2) ??\n String.fromCharCode(55356, 56741 + iso2.charCodeAt(0), 55356, 56741 + iso2.charCodeAt(1));\n}\n\nexport function emojiFromCodePoints(codePoints: string) {\n return codePoints.split('-').reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\n}\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}])}));","/**\n * https://github.com/gre/bezier-easing\n * BezierEasing - use bezier curve for transition easing function\n * by Gaรซtan Renaudeau 2014 - 2015 โ€“ MIT License\n */\n\n// These values are established by empiricism with tests (tradeoff: performance VS precision)\nvar NEWTON_ITERATIONS = 4;\nvar NEWTON_MIN_SLOPE = 0.001;\nvar SUBDIVISION_PRECISION = 0.0000001;\nvar SUBDIVISION_MAX_ITERATIONS = 10;\n\nvar kSplineTableSize = 11;\nvar kSampleStepSize = 1.0 / (kSplineTableSize - 1.0);\n\nvar float32ArraySupported = typeof Float32Array === 'function';\n\nfunction A (aA1, aA2) { return 1.0 - 3.0 * aA2 + 3.0 * aA1; }\nfunction B (aA1, aA2) { return 3.0 * aA2 - 6.0 * aA1; }\nfunction C (aA1) { return 3.0 * aA1; }\n\n// Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2.\nfunction calcBezier (aT, aA1, aA2) { return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT; }\n\n// Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2.\nfunction getSlope (aT, aA1, aA2) { return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1); }\n\nfunction binarySubdivide (aX, aA, aB, mX1, mX2) {\n var currentX, currentT, i = 0;\n do {\n currentT = aA + (aB - aA) / 2.0;\n currentX = calcBezier(currentT, mX1, mX2) - aX;\n if (currentX > 0.0) {\n aB = currentT;\n } else {\n aA = currentT;\n }\n } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS);\n return currentT;\n}\n\nfunction newtonRaphsonIterate (aX, aGuessT, mX1, mX2) {\n for (var i = 0; i < NEWTON_ITERATIONS; ++i) {\n var currentSlope = getSlope(aGuessT, mX1, mX2);\n if (currentSlope === 0.0) {\n return aGuessT;\n }\n var currentX = calcBezier(aGuessT, mX1, mX2) - aX;\n aGuessT -= currentX / currentSlope;\n }\n return aGuessT;\n}\n\nfunction LinearEasing (x) {\n return x;\n}\n\nmodule.exports = function bezier (mX1, mY1, mX2, mY2) {\n if (!(0 <= mX1 && mX1 <= 1 && 0 <= mX2 && mX2 <= 1)) {\n throw new Error('bezier x values must be in [0, 1] range');\n }\n\n if (mX1 === mY1 && mX2 === mY2) {\n return LinearEasing;\n }\n\n // Precompute samples table\n var sampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize);\n for (var i = 0; i < kSplineTableSize; ++i) {\n sampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2);\n }\n\n function getTForX (aX) {\n var intervalStart = 0.0;\n var currentSample = 1;\n var lastSample = kSplineTableSize - 1;\n\n for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) {\n intervalStart += kSampleStepSize;\n }\n --currentSample;\n\n // Interpolate to provide an initial guess for t\n var dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]);\n var guessForT = intervalStart + dist * kSampleStepSize;\n\n var initialSlope = getSlope(guessForT, mX1, mX2);\n if (initialSlope >= NEWTON_MIN_SLOPE) {\n return newtonRaphsonIterate(aX, guessForT, mX1, mX2);\n } else if (initialSlope === 0.0) {\n return guessForT;\n } else {\n return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, mX1, mX2);\n }\n }\n\n return function BezierEasing (x) {\n // Because JavaScript number are imprecise, we should guarantee the extremes are right.\n if (x === 0 || x === 1) {\n return x;\n }\n return calcBezier(getTForX(x), mY1, mY2);\n };\n};\n"],"names":["animationIntersector","constructor","this","observer","IntersectionObserver","entries","entry","target","group","byGroups","intersectionLockedGroups","animation","find","p","el","isIntersecting","visible","add","checkAnimation","delete","_animation","clearCache","Set","overrideIdleGroups","byPlayer","Map","lockedGroups","onlyOnePlayableGroup","videosLocked","doc","type","checkAnimations2","idle","setOverrideIdleGroup","override","getAnimations","element","found","player","push","removeAnimation","HTMLVideoElement","remove","IS_SAFARI","setTimeout","src","load","length","unobserve","removeAnimationByPlayer","item","get","addAnimation","observeElement","controlled","has","canvas","placeholder","HTMLElement","onClean","loop","observe","set","checkAnimations","blurred","destroy","imitateIntersection","undefined","groups","Object","keys","animations","paused","pause","autoplay","play","getOnlyOnePlayableGroup","setOnlyOnePlayableGroup","lockGroup","unlockGroup","refreshGroup","forEach","lockIntersectionGroup","unlockIntersectionGroup","toggleIntersectionGroup","lock","SHOULD_USE_SAFARI_FIX","navigator","userAgent","match","err","AppMediaPlaybackController","media","scheduled","mediaDetails","waitingMediaForLoad","waitingScheduledMediaForLoad","waitingDocumentsForLoad","playbackRates","voice","video","audio","seekBackward","details","playingMedia","currentTime","Math","max","seekOffset","seekForward","min","duration","seekTo","seekTime","onMediaDocumentLoad","managers","appDocsManager","getDoc","docId","supportsStreaming","handleSafariStreamable","cacheContext","thumbsStorage","getCacheContext","url","playbackRate","id","size","onPlay","e","peerId","mid","pip","message","getMessageByMedia","stop","setMedia","verify","listLoader","current","getCurrent","jumpLength","withOtherSide","previous","getPrevious","idx","findIndex","getNext","go","setTargets","dispatchEvent","getPlayingDetails","pauseMediaInOtherTabs","onPause","onEnded","isTrusted","lockedSwitchers","round","next","toggle","clean","s","isScheduled","storage","playingMediaType","playItem","searchContext","getMedia","resolveWaitingForLoadMedia","dispatchJump","goRound","browserPlay","bindBrowserCallback","browserPause","browserStop","browserSeekBackward","browserSeekForward","browserSeekTo","browserNext","browserPrevious","seekToStart","construct","container","document","createElement","style","cssText","body","append","mediaSession","actions","seekbackward","seekforward","seekto","previoustrack","nexttrack","action","setActionHandler","console","warn","skipMediaPlayEvent","properties","key","_key","value","dispatchPlaybackParams","defineProperties","getPlaybackParams","volume","muted","setPlaybackParams","params","_volume","_muted","_playbackRate","_loop","_round","addMedia","autoload","pFlags","is_scheduled","setAttribute","addEventListener","media_unread","fromId","appMessagesManager","readMessages","once","deferred","resolve","w","waitingStorage","then","promise","isSafariBuffering","safariBuffering","setSafariBuffering","setNewMediadata","pictureInPictureElement","artwork","isVoice","title","artist","thumbs","bytes","sizes","h","thumb","appPeersManager","getPeerPhoto","plainText","onlyFirstName","attribute","attributes","_","file_name","performer","IS_APPLE","metadata","MediaMetadata","setCurrentMediadata","playbackParams","cb","willBePlayed","willBePlayedMedia","setSearchContext","context","getSearchContext","prev","reset","loadCount","loadWhenLeft","processItem","onJump","older","onEmptied","reverse","folderId","getPlaybackMediaTypeFromMessage","mediaType","setSingleMedia","wasPlaying","toggleSwitchers","playPaused","removeEventListener","enabled","setPictureInPicture","listenerSetter","removeAll","appMediaPlaybackController","AppMediaViewer","captionTimeout","super","isForDocument","inputFilter","isMediaCompatibleForDocumentViewer","onPrevClick","openMedia","getMessageByPeer","onNextClick","onDeleteClick","content","close","onForwardClick","onAuthorClick","Number","MAX_SAFE_INTEGER","threadId","tab","lastMsgId","onDownloadClick","queueId","caption","classList","setCaptionTimeout","clearTimeout","window","onAdditionalScroll","wholeDiv","buttons","btnMenuForward","icon","text","onClick","btnMenuDownload","btnMenuDelete","setBtnMenuToggle","setListeners","forward","author","onCaptionClick","a","spoiler","HTMLAnchorElement","contains","onclick","getAttribute","includes","capture","click","getScheduledMessageByPeer","setCaption","html","entities","totalEntities","firstElementChild","fromRight","prevTargets","nextTargets","setMoverPromise","fwd_from","from_name","noForwards","isServiceMessage","cantForwardMessage","canForward","cantDownloadMessage","download","canDeleteMessage","hide","button","_openMedia","date","static","mime_type","VideoPlayer","streamable","onPlaybackRackMenuToggle","onPip","onPipClose","wrapper","setup","canHideControls","playbackRateButton","showOnLeaveToClassName","ignoreClickClassName","parentNode","insertBefore","appendChild","skin","stylePlayer","controls","querySelector","progress","onSeekStart","onSeekEnd","prepend","catch","name","finally","initDuration","buildControls","timeDuration","insertAdjacentHTML","pipButton","querySelectorAll","fullScreenButton","timeElapsed","textContent","toHHMMSS","volumeSelector","leftControls","btn","parentElement","Array","from","togglePlay","requestPictureInPicture","visibility","debounceTime","debouncedPip","debounce","listener","timeout","overlayCounter","code","good","toggleFullScreen","altKey","nextIdx","PLAYBACK_RATES","indexOf","cancelEvent","onFullScreen","bind","hideControls","showControls","setPlaybackRateIcon","onMediaLoad","isPaused","IS_MOBILE","pictureInPictureEnabled","map","rate","regularText","btnMenu","onOpen","onClose","PLAYBACK_RATES_ICONS","className","IS_APPLE_MOBILE","webkitEnterFullscreen","enterFullscreen","isFull","cleanup","removeListeners","MEDIA_VIEWER_CLASSNAME","AppMediaViewerBase","topButtons","tempId","preloader","preloaderStreamable","isFirstOpen","pageEl","getElementById","zoomElements","zoomSwipeStartX","zoomSwipeStartY","zoomSwipeX","zoomSwipeY","setZoomValue","rangeSelector","moversContainer","transform","btnOut","btnIn","toggleZoom","setMoverAnimationPromise","tagName","highlightSwitchersTimeout","isZooming","mover","classNames","findUpClassName","onKeyDown","ctrlKeyDown","changeZoom","ctrlKey","metaKey","onKeyUp","onWheel","scrollingUp","deltaY","rootScope","log","logger","cancelable","lazyLoadQueue","overlaysDiv","mainDiv","topbar","topbarLeft","onlyMobile","authorRight","avatarEl","nameEl","buttonsDiv","concat","noRipple","zoom","step","withTransition","setHandlers","onScrub","onMouseUp","main","innerHTML","onLoadedMore","setNewMover","moveLength","onSwipe","xDiff","yDiff","abs","windowSize","verifyTouchTarget","enable","isVisible","mousedown","zoomValue","setProgress","videoPlayer","lockControls","zoomSwipeHandler","lastDiffX","lastDiffY","multiplier","onFirstSwipe","onReset","cursor","addProgress","btnMenuToggle","buttonOptions","direction","Promise","reject","navigationItem","appNavigationController","clear","setMoverToTarget","onAnimationEnd","appMediaViewer","removeGlobalListeners","toggleOverlay","active","toggleGlobalListeners","setGlobalListeners","passive","closing","removeCenterFromMover","wasActive","delay","realParent","rect","getBoundingClientRect","SVGImageElement","SVGForeignObjectElement","left","needOpacity","overflowElement","visibleRect","getVisibleRect","overflow","vertical","horizontal","containerRect","top","aspecter","width","HTMLImageElement","setFullAspect","offsetLeft","height","scaleX","scaleY","borderRadius","getComputedStyle","getPropertyValue","brSplitted","str","splitted","split","i","fillPropertyValue","r","parseInt","join","willBeLeft","willBeTop","path","opacity","isOut","ret","isFulfilled","isRejected","SVGSVGElement","sizeTailPath","toggleWholeActive","mediaElement","selector","queryFrom","matches","elements","pop","getContext","naturalWidth","naturalHeight","videoWidth","videoHeight","HTMLCanvasElement","drawImage","image","Image","createVideo","clipId","dataset","newClipId","newSvg","createElementNS","setAttributeNS","outerHTML","replace","lastElementChild","defs","use","SVGUseElement","d","getAttributeNS","x","y","sX","sY","br","v","generatePathData","foreignObject","renderImageFromUrl","display","proportion","upscale","start","Date","now","diff","_br","moveTheMover","toLeft","windowW","newTransform","p1","newMover","updateMediaSource","toLowerCase","setAuthorInfo","timestamp","isPeerId","wrapTitlePromise","dialog","wrapEmojiText","oldAvatar","newAvatar","cloneNode","all","updateWithOptions","peerTitle","replaceContent","replaceWith","setAuthorPromise","isDocument","isVideo","useContainerAsTarget","IS_MOBILE_SAFARI","onPop","canAnimate","maxWidth","padding","windowH","mediaSizes","maxHeight","thumbPromise","setAttachmentSize","photoSize","img","downloaded","gotThumb","getStrippedThumbIfNeeded","loadPromise","useController","div","moverVideo","canPlayThrough","createPlayer","ckin","overlay","open","otherMediaViewer","releaseSingleMedia","show","readyState","HAVE_FUTURE_DATA","attach","attachCanPlay","detach","loading","networkState","NETWORK_LOADING","isntEnoughData","unshift","appDownloadManager","toast","langPackKey","error","cancellablePromise","attachPromise","imgs","haveImage","setManual","onPopState","hash","location","state","debug","isPossibleSwipe","currentHash","overriddenHash","overrideHash","onHashChange","pushState","navigations","manual","handleItem","onEscape","back","onTouchStart","touches","options","history","scrollRestoration","replaceState","pushItem","noBlurOnPop","findItemByType","index","backByItem","splice","onItemAdded","noHistory","unshiftItem","spliceItems","items","origin","pathname","search","removeItem","removeByType","single","SearchGroup","clearable","clickable","autonomous","onFound","noIcons","list","setActive","childElementCount","AppSearch","searchInput","searchGroups","onSearch","minMsgId","loadedCount","foundCount","searchPromise","searchTimeout","query","listsContainer","scrollable","messages","setVirtualContainer","onChange","searchMore","onScrolledBottom","trim","beginSearch","inputField","input","focus","maxId","limit","res","count","shift","searchGroup","avatarSize","meAsSaved","SearchContextMenu","attachTo","searchSuper","onGotoClick","appImManager","selection","isSelecting","selectionForwardBtn","onSelectClick","toggleByElement","onClearSelectionClick","cancelSelection","selectionDeleteBtn","attachContextMenuListener","callback","init","MouseEvent","preventDefault","cancelBubble","toPeerId","isSelected","isMidSelected","withSelection","positionMenu","contextMenuController","AppSearchSuper","tabs","prevTabId","middleware","historyStorage","usedFromHistory","loadMutex","nextRates","loadPromises","loaded","loadedChats","firstLoad","monthContainers","mediaTabsMap","asChatList","groupByMonth","hideEmptyTabs","showSender","onTransitionStart","onTransitionEnd","safeAssign","searchContextMenu","navScrollableContainer","navScrollable","nav","tabsMenu","mediaTab","mediaTabs","menuTab","span","ripple","unlockScroll","tabsContainer","swipeHandler","handleTabSwipe","prevId","selectTab","children","onTouchMove","lockers","lockTouchScroll","contentTab","searchGroupMedia","canLoadMediaTab","horizontalMenu","tabContent","animate","skipScroll","scrollIntoViewNew","position","startCallback","scrollStartCallback","newMediaTab","onChangeTab","fromMediaTab","offsetTop","scrollTop","scroll","scrollHeight","rect2","onScroll","onMediaClick","targetClassName","mediaSpoiler","event","targets","containerEl","copySearchContext","slice","inputMessagesFilterPhotoVideo","inputMessagesFilterDocument","useHeavyAnimationCheck","unlockAndRefresh","filterMessagesByType","filterMessagesByInputFilter","processEmptyFilter","dialogElement","appDialogsManager","setLastMessagePromise","lastMessage","highlightWord","noop","processPhotoVideoFilter","promises","getMediaFromMessage","wrapped","choosePhotoSize","boxWidth","boxHeight","onlyPreview","withoutPreloader","noPlayButton","photo","noBlur","animationGroup","multiply","images","full","filter","Boolean","processDocumentFilter","withTime","fontWeight","voiceAsMusic","autoDownloadSize","getSize","processUrlFilter","webPage","webpage","entity","display_url","sliced","offset","matchUrl","same","URL","hostname","description","previewDiv","setInnerHTML","wrapAbbreviation","subtitleFragment","htmlToDocumentFragment","wrapRichText","innerText","decodeURIComponent","href","firstChild","wrapPlainText","row","titleRight","subtitle","havePadding","applyMediaElement","performSearchResult","elemsToAppend","sharedMediaDiv","processCallback","results","awaited","method","monthContainer","getMonthContainerByTimestamp","toggleElementCheckbox","afterPerforming","parent","child","loadChats","renderedPeerIds","inputMessagesFilterEmpty","setResults","showMembersCount","dom","peer","getPeer","participants_count","participants","regExp","RegExp","escapeRegExp","cleanSearchText","titleSpan","lastMessageSpan","getChatMembersString","toChatId","username","getPeerUsername","user","appUsersManager","getUser","phone","formatPhoneNumber","formatted","onLoad","arg","getContactsPeerIds","contacts","searchContacts","my_results","globalContacts","showMore","intlElement","isShort","update","dialogsStorage","getDialogs","offsetIndex","filterId","dialogs","minDate","renderRecentSearch","recent","replaceChildren","recentSearch","isUser","getUserStatusString","toUserId","getTopPeers","peers","people","subtitleEl","loadMembers","renderParticipants","membersList","rippleEnabled","li","findUpTag","DIALOG_LIST_ELEMENT_TAG","participant","getParticipantPeerId","isAnyChat","deleted","appChatsManager","isChannel","LOAD_COUNT","appProfileManager","getChannelParticipants","getChatFull","chatFull","loadType","justLoad","used","slicedLength","ids","notFilteredMessages","m","checkForTriggers","getSearch","nextRate","next_rate","loadFirstTime","filters","counters","canViewMembers","getSearchCounters","firstMediaTab","counter","c","membersTab","loadFirstTimePromise","toLoad","t","findAndSplice","setHours","setDate","dateTimestamp","getTime","containers","month","getFullYear","year","dateElement","haveTimestamps","getObjectKeysAndSort","positionElementByIndex","chatId","isBroadcast","hasRights","isForum","cleanScrollPositions","cleanupHTML","goFirst","putPreloader","empty","newInputFilter","copy","setQuery","maxDate","AppSelectPeers","chatsContainer","selected","freezed","loadedWhat","peerType","multiSelect","exceptSelf","tempIds","selfPresence","needSwitchList","design","onInput","cachedContacts","getMoreResults","f","renderResultsFunc","renderResults","peerIds","splitUp","notRendered","filterPeerTypeBy","section","innerContainer","topContainer","selectedContainer","selectedScrollable","sectionNameLangPackKey","noShadow","checkbox","checked","debouncedInput","appendTo","getResultsPromise","onFirstRender","renderSaved","testSelfSearch","getTempId","getMoreDialogs","archived","pageCount","skipMigrated","newOffsetIndex","chatRightsAction","filterByRights","isEnd","getMoreContacts","isGlobalSearch","searchResult","resultPeerIds","arr","getMoreChannelParticipants","channelParticipants","q","getMoreSomething","call","isNonContactUser","checkboxField","label","isDialog","insertAdjacentElement","offsetWidth","getSelected","addInitial","values","requestAnimationFrame","forceDirection","constructDownloadPreloader","tryAgainOnFail","circle","totalLength","mids","attr","elem","findMediaTargets","anchor","anchorMid","isBubbles","justAudioSelector","selectors","prefix","mediaItems","AudioElement","render","isRealVoice","isOutgoing","is_outgoing","uploadingFileName","durationStr","downloadDiv","onTypeLoad","audioEl","out","waveform","Uint8Array","valueCount","result","dataView","DataView","buffer","byteIndex","bitShift","getUint16","decodeWaveform","svg","svgContainer","availW","barHeightMax","minW","maxW","normValue","wfSize","barCount","maxValue","maxDelta","barX","sumI","bar_value","barWidth","createWaveformBars","fakeSvgContainer","waveformContainer","timeDiv","onTimeUpdate","throttledTimeUpdate","addAudioListener","readyPromise","mousemove","scrub","offsetX","targetTouches","pageX","scrubTime","wrapVoiceMessage","descriptionEl","audioAttribute","parts","titleEl","middleEllipsisEl","fontSize","sizeType","subtitleDiv","launched","progressLine","lastChild","wrapAudio","audioTimeDiv","HAVE_CURRENT_DATA","onTypeDisconnect","getTimeStr","hadSearchContext","useSearch","autoDownload","shouldPlay","onDownloadInit","pauseListener","notifyAll","done","total","cancel","Error","playListener","setDownloadFunction","disconnectedCallback","isConnected","customElements","define","AvatarListLoader","loadMore","photoId","appPhotosManager","getUserPhotos","photos","loadedAllUp","AppMediaViewerAvatar","getPhoto","onAvatarUpdate","openAvatarViewer","getTarget","hadMessage","isObject","data","believeMe","seen","getAvatarQueueKey","AvatarElement","addedToQueue","middlewareHelper","attachClickEvent","updateOptions","wasPeerId","wasThreadId","newPeerId","wrapOptions","create","onlyThumb","putPhoto","isBig","AvatarEdit","clearRect","Button","asLink","asDiv","rippleSquare","disabled","ButtonMenuItem","separator","iconDoc","noCheckboxClickListener","textElement","textArgs","iconElement","noFadeIn","processUrl","fetch","response","color","DOMParser","parseFromString","stroke","strokeWidth","keepOpen","menu","checkForClose","multiline","ButtonMenuSync","b","ButtonMenu","ButtonMenuToggleHandler","openedMenu","ButtonMenuToggle","attachListenerSetter","onOpenBefore","onCloseAfter","closeTimeout","filteredButtons","_element","ChatBackgroundGradientRenderer","_width","_height","_tails","_scrollTails","_curve","_positions","_phases","_animatingToNextPosition","_scrollDelta","_onWheelRAF","drawOnWheel","floor","ceil","changeTailAndDraw","drawNextPositionAnimated","getProgress","transitionValue","nextPositionTail","_nextPositionTail","_nextPositionTails","_nextPositionLeft","frames","_frames","drawImageData","_incrementalCurve","hexToRgb","hex","g","getPositions","positions","getNextPositions","phase","curveMax","curve","pos","distances","nextPos","distance","curPosition","tail","changeTail","_tail","_phase","curPos","drawGradient","getGradientImageData","_hctx","createImageData","pixels","centerDistanceY","centerDistanceY2","centerDistanceX","swirlFactor","sqrt","theta","sinTheta","sin","cosTheta","cos","pixelX","pixelY","distanceSum","_colors","distanceX","distanceY","putImageData","_ctx","_hc","cancelAnimationFrame","colors","alpha","_canvas","fillStyle","fillRect","toNextPosition","tails","nextPhaseOnIdx","inc","toFixed","curves","last","scrollAnimate","createCanvas","gradientRenderer","accumulateMapSet","reduce","acc","AppSelection","selectedMids","onMouseDown","targetLookupClassName","verifyTarget","selecting","firstTarget","processElement","checkBetween","isInDOM","seenSet","seenLength","findUpAsChild","elementsBetween","getElementsBetween","toggleByMid","canceledSelection","onMouseMove","getElementFromTarget","verifyMouseMoveTarget","removeManual","listenElement","documentListenerOptions","first","firstRect","lastRect","isHigher","lookupBetweenParentClassName","lookupBetweenElementsQuery","firstIndex","lastIndex","doNotAnimate","onCancelSelection","toggleSelection","navigationType","random","attachListeners","selectedText","getSelection","toString","createRange","verifyTouchLongPress","isElementShouldBeSelected","appendCheckbox","hasCheckbox","getCheckboxInputFromElement","forwards","updateContainer","forceSelection","cantForward","cantDelete","cantSend","storageKey","cantForwardDeleteMids","onUpdateContainer","toggleCheckboxes","wasSelecting","blurActiveElement","toggleResult","onToggleSelection","updateElementSelection","toggleMid","unselect","deleteSelectedMids","SearchSelection","selectionCountEl","selectionGotoBtn","selectionContainer","BASE_CLASS","btnCancel","attachClickOptions","obj","fromPeerId","sort","isPrivate","transitionElement","ChatSelection","chat","bubbles","recording","bubble","canSelectBubble","isGroupedBubbleSelected","getMidsFromGroupContainer","getBubbleGroupedItems","groupContainer","isGroupedSelected","isGroupedMidsSelected","mounted","getMountedBubble","needTranslateX","widthFrom","widthTo","center","selectionInputWrapper","selectionSendNowBtn","selectionLeft","selectionRight","translateButtonsX","right","inputContainer","toggleAttribute","skippedMids","isGrouped","groupedCheckboxInput","CheckboxField","restriction","toggleDisability","stateKey","stateValues","stateValue","setValueSilently","box","checkSvg","bg","border","withRipple","withHover","Event","disable","CodeInputField","assign","autocomplete","lastLength","setLabel","onFill","confirmationPopup","checkboxes","cancelButton","isCancel","countries","setCountries","country","hidden","default_name","localeCompare","VIRTUAL_COUNTRIES","CountryInputField","hidePicker","hideTimeout","selectWrapper","selectCountryByTarget","defaultName","phoneCodeEl","phoneCode","countryCode","simulateInputEvent","lastCountrySelected","lastCountryCodeSelected","country_codes","_countryCode","country_code","onCountryChange","liMap","arrowDown","selectList","initSelect","noPhoneCodes","iso2","emoji","liArr","Infinity","spanEmoji","select","margin","mouseDownHandlerAttached","onKeyPress","_value","names","abbr","word","test","blur","selectCountryByIso2","countryName","DotRenderer","dpr","devicePixelRatio","prepare","dots","generateDot","adding","radius","Path2D","arc","PI","mOpacity","draw","dot","addOpacity","easedOpacity","globalAlpha","fill","renderFirstFrame","dotRenderer","EditPeer","_disabled","isChanged","uploadAvatar","changedLength","requiredLength","requiredValidLength","inputFields","isValid","required","handleChange","nextBtn","withoutAvatar","avatarElem","doNotEditAvatar","avatarEdit","_upload","popupOptions","lockWithPromise","unlockOnSuccess","GifsTab","gifsContainer","EmoticonsDropdown","masonry","EMOTICONSSTICKERGROUP","getGifs","docs","processInvisibleDiv","ANIMATIONGROUP","AppGifsTab","nextOffset","loadedAll","onGifsClick","fileId","inputSearch","gifsDiv","onCloseAfterTimeout","newSearch","gifBotPeerId","resolveUsername","appInlineBotsManager","getInlineResults","next_offset","AppStickersTab","setsDiv","listenTo","sticker","stickerSet","access_hash","appStickersManager","getStickerSet","toggleStickerSet","changed","installed_date","removeAttribute","renderFeatured","renderSet","header","countDiv","stickersDiv","stickerDiv","documents","withLock","getFeaturedStickers","coveredSets","filterRendered","forEachReverse","covered","searchStickerSets","scrollOptions","forceDuration","transitionFunction","ignoreOutClickClassName","tabId","onSelectTabClick","searchButton","emojiTab","deleteBtn","scrollTo","checkRights","tabsEl","tabsElements","canSendStickers","canSendGifs","canSendToPeer","stickersTab","gifsTab","whichChild","savedRange","getGoodRange","onOpened","unlock","refresh","onClosed","range","getSavedRange","setStartAfter","newRange","cloneRange","collapsed","node","endContainer","endOffset","newStartNode","previousSibling","nodeType","TEXT_NODE","nodeValue","ELEMENT_NODE","isContentEditable","selectNode","newOffset","setStart","deleteContents","HIDE_EMOJI_TAB","INIT_TAB_ID","lastMouseMoveEvent","mouseMoveEventAttached","isActive","onMouseOut","getElement","axis","clearDraft","silent","emoticonsDropdown","forceClose","addLazyLoadQueueRepeat","divs","intersector","getVisible","clearVisible","sel","rangeCount","activeElement","getRangeAt","menuOnClick","emoticons","menuScroll","prevTab","jumpedTo","getElementPosition","elementPosition","scrollToTab","scrollingToContent","stickyIntersector","stuck","getCategoryByContainer","which","getCategoryByMenuTab","additionalOffset","setActiveStatic","local","scrollLeft","clientWidth","sendDocId","loadedURLs","appendEmoji","unify","kek","getEmojiEntityFromEmoji","wrapSingleEmoji","fixEmoji","getEmojiFromElement","superEmoji","stickerEmoji","EMOJI_RECENT_ID","EMOJI_RECENT_CATEGORY","CUSTOM_EMOJI_RECENT_CATEGORY","EMOJI_CATEGORIES","sorted","category","order","EMOJI_ELEMENT_SIZE","EmojiTab","onCategoryVisibility","categoriesMap","renderer","newChildren","customEmojis","customEmojiElement","clearCanvas","onContentClick","isStandalone","langPackArguments","activeElements","menuInnerScroll","intersectionOptions","root","categoriesIntersector","menuOnClickResult","innerScrollWrapper","preparedMap","noRegularEmoji","emojis","titleLangPackKey","createLocalCategory","unified","addEmojiToCategory","batch","appEmojiManager","getRecentEmojis","stickerSetId","getLocalStickerSet","getCustomEmojis","recentCustom","mainSet","sets","recentCategory","categories","recentCustomCategory","CUSTOM_EMOJI_RECENT_ID","createRendererForCategory","paddingTop","toggleLocalCategory","resizeCategories","after","renderStickerSet","toggleCustomCategory","postponedEvent","positionCategory","toggleRenderers","ignore","ignoreSettingDimensions","setDimensionsFromRect","deleteCategory","isCategoryVisible","forceRender","closeScrollTop","createCategory","menuTabPadding","stickerEmojiRaw","setCategoryItemsHeight","getCustomCategory","hasPremium","canSeeCustomCategory","customEmojiSize","activeEmoji","spliceExceed","onLocalCategoryUpdate","LazyLoadQueueRepeat","parallelLimit","onVisibilityChange","elementsMap","queueItem","wasSeen","queue","indexOfAndSplice","setProcessQueueTimeout","SuperStickerRenderer","regularLazyLoadQueue","animated","checkAnimationContainer","processVisible","processInvisible","renderSticker","observeAnimated","unobserveAnimated","StickersTabCategory","noMenuTab","getContainerSize","getElementMediaSize","gapX","gapY","containerWidth","elementSize","itemsPerRow","rows","minHeight","EmoticonsTabC","categoryItemsClassName","args","postponedEvents","categoriesByMenuTabMap","localCategories","menuWrapper","isLocal","esgWidth","customProperties","observeStickyHeaderChanges","posItems","foundMenuScroll","posMenu","notMountedItems","notMountedMenus","itemsIdx","menuIdx","disconnect","StickersTab","setTyping","setFavedLimit","categoryAppendStickers","superStickerRenderer","clearCategoryItems","onCategoryStickers","stickers","deleteSticker","unshiftSticker","favedCategory","clearButton","titleLangKey","descriptionLangKey","langKey","clearRecentStickers","premiumCategory","apiManager","getLimit","getFavedStickersStickers","getRecentStickersStickers","getAllStickers","getPremiumStickers","isPremium","race","rendererLazyLoadQueue","faved","createStickersContextMenu","verifyRecent","unshiftRecentSticker","saveRecentSticker","deleteRecentSticker","generateDelimiter","delimiter","generateFakeIcon","isScam","LazyLoadQueueRepeat2","spliced","findAndSpliceAll","GifsMasonry","scrollPromise","processVisibleDiv","noInfo","noPreview","transitionTime","scrollableX","proxy","Proxy","apply","that","selectTarget","result1","canChange","mutateCallback","useStripe","indicator","currentIndicator","shiftLeft","scaleFactor","insertRichTextAsHTML","wrappingForPeerId","some","createCustomEmojiRendererForInput","fragment","wrapDraftText","customEmojiRenderer","contentEditable","richInputHandler","customEmojiElements","ces","documentFragmentToHTML","pre","getCaretPosNew","createTextNode","collapse","removeAllRanges","addRange","onBeforeInput","inputType","execCommand","removeExtraBOMs","findUpAttribute","noLinebreaks","originalEvent","clipboardData","getData","usePlainText","filterEntity","curChild","nextSibling","richValue","getRichValueWithCaret","lines","textLength","lineIndex","line","nextLine","correctedText","entities2","parseEntities","mergeEntities","InputState","wrappingDraft","isSelectable","processCustomEmojisInInput","hasSet","connectedCallback","InputField","validate","maxLength","showLengthOn","canBeEdited","labelText","onInputCallbacks","isCollapsed","centerX","focusOnNext","clientX","isInputEmpty","inputMode","labelEl","showingLength","wasError","inputLength","isError","withLinebreaks","selectNodeContents","selectElementContents","labelOptions","fromSet","originalValue","isValidToChange","setDraftValue","setOriginalValue","setState","Valid","setError","InputSearch","prevValue","onClearClick","onClear","searchIcon","clearBtn","LazyLoadQueue","ignoreHeavyAnimation","getItem","addElement","LazyLoadQueueIntersector","inProcess","loadItem","intersectorTimeout","processQueue","MediaProgressLine","useTransform","onLoadedData","seek","progressRAF","setLoadProgress","onProgress","filledLoad","setSeekMax","buf","buffered","numRanges","nearestStart","end","percents","testQueue","pendingTest","setTestQueue","testElement","getElementWidth","mapped","firstTime","font","textWidth","elementWidth","newElementWidth","widthChanged","smallerText","smallerWidth","smallerTextLength","half","half1","substr","half2","MiddleEllipsisElement","PasswordMonkey","passwordInputField","needFrame","noCache","currentFrame","setSpeed","helpers","onVisibilityClickAdditional","passwordVisible","setDirection","curFrame","TrackingMonkey","playAnimation","frame","idleAnimation","PasswordInputHelpers","onVisibilityClick","toggleVisible","stealthy","tabIndex","PasswordInputField","PeerProfileAvatars","avatar","avatars","draggable","loadCallback","intersectionObserver","loadCallbacks","addTab","gradient","info","arrowPrevious","arrowNext","checkScrollTop","SWITCH_ZONE","freeze","_e","clickX","toRight","cancelNextClick","minX","lastX","SCALE","TRANSLATE_TEMPLATE","addIndex","loadNearestToTarget","setPeer","backLimit","filterChatPhotosMessages","chat_photo","generateFakeAvatarMessage","activeTab","photo_id","setText","PeerProfile","noDelimiter","bio","contextMenu","subtitleLangKey","isAnonymous","getUserPhone","link","notifications","togglePeerMute","appNotificationsManager","isPeerLocalMuted","respectType","setPeerStatus","setMoreDetails","n","fillUsername","userId","self","fillUserPhone","setAvatar","setPeerStatusInterval","setInterval","needClear","callbacks","useWhitespace","ignoreSelf","clearSetMoreDetailsTimeout","canBeDetailed","createAvatar","_setAvatar","isTopic","oldAvatars","getUsernamesAlso","usernames","also","anchorCopy","getPeerActiveUsernames","formatUserPhone","fillNotifications","notificationsRow","fillName","withIcons","fillRows","fillProfileElements","cleaned","_setMoreDetails","peerFull","getMiddlewarePromise","getServerMessageId","about","getChat","exportedInvite","exported_invite","address","setMoreDetailsTimeout","isPeerRestricted","acknowledged","getProfileByPeerId","setPromise","cached","middlewarePromise","makeError","clearInterval","generateTitleIcons","noVerifiedIcon","noFakeIcon","noPremiumIcon","verified","use2","generateVerifiedIcon","fake","scam","premium","emojiStatus","emoji_status","generatePremiumIcon","weakMap","WeakMap","PeerTitle","setOptions","setHasInner","hasInner","fromName","limitSymbols","topic","forumTopic","getTopicIconPromise","icons","topicIcon","getPeerTitle","withPremiumIcon","inner","createDocumentFragment","PopupAvatar","closable","withConfirm","cropper","crop","removeHandlers","h6","btnClose","cropContainer","file","files","readBlobAsDataURL","contents","onload","originalImage","cropComponent","cropImage","event_state","cropLeft","cropTop","cropWidth","cropHeight","scaledRatio","overlayColor","CROPWIDTH","offsetHeight","CROPHEIGHT","updateCropSize","updateCropImage","startMoving","resizing","keyHandler","imgZoom","bottom","newWidth","newHeight","clientHeight","String","fromCharCode","charCode","stopPropagation","container_width","container_height","container_left","container_top","mouse_x","scrollX","mouse_y","clientY","pageY","scrollY","saveEventState","moving","endMoving","currentTouch","complete","btnConfirm","toBlob","blob","darkenCanvas","onCrop","postCanvas","ctx","PopupDeleteDialog","onSelect","peerTitleElement","getDialogType","callbackLeave","flush","leave","flushHistory","callbackDelete","titleArgs","descriptionArgs","isDanger","titleLangArgs","descriptionLangArgs","PopupDeleteMessages","onConfirm","revoke","deleteScheduledMessages","deleteMessages","isMegagroup","_hasRights","canRevoke","PopupForward","peerIdMids","peerTypes","forwardMessages","DEFAULT_APPEND_TO","appendPopupTo","onFullScreenChange","PopupElement","reAppend","titleRaw","MANAGERS","confirmShortcutIsSendShortcut","withoutOverlay","overlayClosable","attachScrollableListeners","btnConfirmOnEnter","buttonsEl","buttonsElements","langArgs","POPUPS","setClassOn","attachBorderListeners","onContentUpdate","popup","popupConstructor","ctor","addCancelButton","pin","descriptionPremium","descriptionLocked","folders","P","_a","limitPremium","isLocked","limitContainer","hint","free","setHintActive","showLimitPopup","appConfig","premium_purchase_blocked","times","ONE_HOUR","PopupMute","time","mutePeer","muteUntil","radioForm","PopupPeer","noTitle","o","original","nextElementSibling","PopupPickUser","PopupSendNow","sendScheduledMessages","ANIMATION_GROUP","PopupStickers","stickerSetInput","isEmojis","onStickersClick","updateAdded","stickersFooter","onStickerSetUpdate","_set","updateButton","loadStickerSet","createStickerSetElements","headerRow","buttonRight","added","itemsContainer","setsPromises","isArray","firstSet","isStickerPack","onSend","containersPromises","docIds","toggleStickerSets","isAdd","buttonAppend","installed","ProgressivePreloader","detached","isUpload","attachMethod","loadFunc","constructContainer","bold","constructDownloadIcon","downloadSvg","cancelSvg","previousElementSibling","func","startTime","onEnd","notify","elapsedTime","TRANSITION_TIME","addNotifyListener","useRafs","getTotalLength","strokeDasharray","putAvatar","renderThumbPromise","thumbImage","isFullLoaded","loadThumbPromise","stripped_thumb","getPreviewURLFromBytes","sequentialDom","renderPromise","myId","getForumTopic","setProperty","getPeerColorById","forum","avatarAvailable","avatarRendered","appAvatarsManager","isAvatarCached","first_name","last_name","getPeerInitials","returnDiv","setButtonLoader","RadioField","alignRight","RadioForm","radios","form","RangeSelector","events","setFilled","filled","stepStr","decimals","_removeListeners","rectMax","offsetAxisValue","rippleClickId","attachListenerTo","handler","drawRipple","clickId","_handler","touchStartFired","clickY","isRippleUnneeded","touchEnd","setContent","Row","checkboxFieldOptions","radioField","noWrap","subtitleRight","subtitleRow","createRow","subtitleLangArgs","isToggle","withCheckboxSubtitle","titleRightContent","titleRightSecondary","titleRow","createTitle","navigationTab","buttonRightLangKey","_subtitle","createSubtitle","midtitle","_midtitle","createMidtitle","createMedia","disableWithPromise","makeSortable","sortIcon","toggleSorting","CreateRowFromCheckboxField","RadioFormFromRows","RadioFormFromValues","checkedRadioField","ScrollableBase","logPrefix","onScrollMeasure","lastScrollPosition","lastScrollDirection","isHeavyAnimationInProgress","needCheckAfterAnimation","cancelMeasure","onScrolledTop","scrollPosition","scrollProperty","addScrollListener","addedScrollListener","removeScrollListener","removeHeavyAnimationListener","Scrollable","onScrollOffset","withPaddingContainer","maxScrollTop","isScrolledDown","getDistanceToEnd","setScrollTopSilently","ignoreNextScrollEvent","ScrollableX","splitCount","scrollHorizontally","deltaX","scrollWidth","SettingSection","fakeGradientDelimiter","hr","generateContentElement","nameArgs","captionOld","captionArgs","generateSection","AppNewGroupTab","isGeoChat","setTitle","inputWrapper","groupNameInputField","groupLocationInputField","valueCheck","userLocationCoords","userLocationAddress","createChannel","geo_point","megagroup","inputFile","editPhoto","inviteToChannel","createChat","chatsSection","new","startLocating","geolocation","getCurrentPosition","lat","coords","latitude","long","longitude","uri","json","display_name","GeolocationPositionError","PrivacyType","getPrivacyRulesDetails","rules","types","allowPeers","users","chats","disallowPeers","rule","PrivacySection","onRadioChange","captions","captionElement","radioSection","exceptions","radioRows","skipTypes","noExceptions","exceptionTexts","exception","_peerIds","slider","createTab","skippable","takeOut","newPeerIds","generateStr","splitPeersByType","selectedPeerIds","appPrivacyManager","getPrivacy","inputKey","setRadio","k","eventListener","chatKey","usersKey","getUserInput","setPrivacy","AppPrivacyPhoneNumberTab","getSelf","captionEl","mePath","phoneSection","sCaption","AppTwoStepVerificationSetTab","stickerContainer","inputContent","btnReturn","sliceTabsUntilTab","AppSettingsTab","canFocus","isFirstInput","AppTwoStepVerificationEmailConfirmationTab","isFirst","email","codeInputField","passwordManager","confirmPasswordEmail","goNext","btnChange","btnResend","cancelPasswordEmail","AppTwoStepVerificationEmailTab","resendPasswordEmail","onOpenAfterTimeout","onContinueClick","btnContinue","btnSkip","matchEmail","toggleButtons","updateSettings","currentPassword","plainPassword","newPassword","symbols","AppTwoStepVerificationHintTab","onSkipClick","saveHint","AppTwoStepVerificationReEnterPasswordTab","monkey","verifyInput","AppTwoStepVerificationEnterPasswordTab","isNew","has_password","textEl","getStateInterval","getState","_state","check","auth","AppTwoStepVerificationTab","removeTabFromHistory","btnChangePassword","btnDisablePassword","btnSetRecoveryEmail","has_recovery","btnSetPassword","AppPrivacyLastSeenTab","AppPrivacyProfilePhotoTab","AppPrivacyForwardMessagesTab","AppPrivacyAddToGroupsTab","AppPrivacyCallsTab","AppActiveSessionsTab","Session","app_name","app_version","ip","date_active","date_created","device_model","system_version","platform","authorizations","session","btnTerminate","invokeApi","otherSection","onError","onTerminateClick","menuElement","AppBlockedUsersTab","btnAdd","toggleBlock","bot","blocked","getBlocked","convertKeyToInputKey","toUpperCase","AppPrivacyVoicesTab","AppActiveWebSessionsTab","sessions","bot_id","region","domain","browser","appSeamlessLoginManager","resetWebAuthorizations","leftLength","resetWebAuthorization","AppPrivacyAndSecurityTab","fromTab","getAppConfig","globalPrivacy","getGlobalPrivacySettings","contentSettings","webAuthorizations","getWebAuthorizations","SUBTITLE","blockedPeerIds","blockedUsersRow","passwordState","twoFactorRowOptions","email_unconfirmed_pattern","twoFactorRow","activeSessionsRow","updateActiveSessions","websitesRow","updateActiveWebsites","websites","setBlockedCount","updateBlocked","rowsByKeys","numberVisibilityRow","lastSeenTimeRow","photoVisibilityRow","callRow","linkAccountRow","groupChatsAddRow","voicesRow","updatePrivacyRow","disallowLength","allowLength","destroyed","setGlobalPrivacySettings","archive_and_mute_new_noncontact_peers","settings","onPremiumToggle","autoarchive_setting_available","_enabled","sensitive_enabled","sensitive_can_change","payment","appPaymentsManager","clearSavedInfo","deleteButton","appDraftsManager","clearAllDrafts","auths","AppQuickReactionTab","appReactionsManager","getQuickReaction","getAvailableReactions","quickReaction","availableReactions","reaction","inactive","availableReaction","static_icon","setDefaultReaction","emoticon","RangeSettingSelector","initialValue","minValue","writeValue","nameDiv","valueDiv","valueContainer","AppGeneralSettingsTab","themes","allStickers","chatBackgroundButton","initArgs","animationsCheckboxField","themesContainer","themesMap","currentTheme","themeController","isNight","applyThemeOnItem","theme","wallPaperContainer","wallPaperContainers","lastOnFrameNo","lastActive","restart","onFrameNo","frameNo","maxFrame","availableBaseThemes","defaultThemes","default","themeSettings","base_theme","wallPaper","wallpaper","emoticonContainer","bubbleIn","marginTop","dayRow","nightRow","systemRow","newIsNight","enterRow","ctrlEnterRow","kilometersRow","milesRow","formats","format","runFirst","getNextTimeout","_callback","run","eachTimeout","getSeconds","eachMinute","toLocaleTimeString","hour","minute","suggestCheckboxField","bigCheckboxField","reactionsRow","renderQuickReaction","getCustomEmojiDocument","document_id","loopCheckboxField","stickerSets","stickersContent","assumeType","AppChatFoldersTab","filtersRendered","animationData","lottieLoader","renderFolder","dialogFilter","non_contacts","broadcasts","bots","folder","getFolderDialogs","channels","isAnyGroup","filtersStorage","getFilter","setInitFilter","localId","getInitArgs","createFolderBtn","foldersSection","suggestedSection","canCreateFolder","onFiltersContainerUpdate","renderFiltersPromise","toggleAllChats","getSuggestedFilters","loadAnimationPromise","onSort","prevIdx","newIdx","updateDialogFiltersOrder","getDialogFilters","getSuggestedDialogsFilters","suggestedFilters","includePeerIds","excludePeerIds","pinnedPeerIds","createDialogFilter","AppNotificationsTab","NotifySection","enabledRow","typeText","previewEnabledRow","inputNotifyPeer","getNotifySettings","notifySettings","applySettings","isMuted","show_previews","mute","showPreviews","inputSettings","mute_until","flags","updateNotifySettings","notify_settings","contactsSignUpRow","soundRow","sound","getContactSignUpNotification","setContactSignUpNotification","AppLanguageTab","languages1","lang_pack","languages2","rendered","webLangCodes","language","lang_code","native_name","langPack","autoDownloadPeerTypeSection","contactsCheckboxField","privateCheckboxField","groupsCheckboxField","channelsCheckboxField","AppAutoDownloadPhotoTab","AppAutoDownloadFileTab","debouncedSave","sizeMax","appStateManager","setByKey","MIN","MAX_RANGE","MAX","upTo","formatBytes","compareAndUpdate","AppAutoDownloadVideoTab","AUTO_DOWNLOAD_FOR_KEYS","private","AppDataAndStorageTab","autoCheckboxField","autoDownloadNew","autoRow","resetButton","deepEqual","setSubtitles","setAutoDownloadSubtitle","photoRow","videoRow","fileRow","file_size_max","openTab","tabConstructor","onDisabledChange","peerKeys","enabledKeys","isAll","logOut","edit","profile","fillPromise","changeAvatarBtn","upload","uploadProfilePhoto","updateChangeAvatarBtn","languageArgs","devicesRow","languageRow","buttonsSection","getEditProfileArgs","editProfileArgs","getAuthorizations","overwrite","getAuthorizationsPromise","AppNewChannelTab","channelNameInputField","channelDescriptionInputField","onLengthChange","broadcast","channelId","PopupCreateContact","importContact","nameInputField","lastNameInputField","telInputField","editPeer","AppContactsTab","openContacts","isContact","sortedUserList","createList","renderPage","AppArchivedTab","wasFilterId","ul","AppPeopleNearbyTab","isLocationWatched","parseDistance","startWatching","latestLocationSaved","getLocated","accuracy","watchPosition","isLongitudeDifferent","isLatitudeDifferent","distanceCheck","calculateDistance","stopWatching","lat1","long1","lat2","long2","asin","LEFT_COLUMN_ACTIVE_CLASSNAME","AppSidebarLeft","sidebarEl","sidebarHeader","onContactsClick","backBtn","btnArchive","isDialogsLoaded","themeCheckboxField","sessionStorage","kz_version","installPrompt","toolsBtn","btnMenuFooter","rel","archivedCount","newBtnMenu","updateBtn","reload","initSearch","unreadPeerIds","formatNumber","checkUpdateInterval","cache","status","ok","hasUpdate","onResize","documentElement","searchContainer","pickedElements","selectedPeerId","selectedMinDate","selectedMaxDate","updatePicked","removeProperty","helper","unselectEntity","renderEntity","dates","dateData","pushRecentSearch","peopleContainer","hideNewBtnMenuTimeout","transition","activeClassName","onFocus","clearRecentSearchBtn","clearRecentSearch","appSidebarLeft","AppAddMembersTab","attachToPromise","isPrivacy","removeLoader","averageColorFromCanvas","pixel","getImageData","pixelsLength","outPixel","Uint8ClampedArray","highlightningColor","rgba","l","ColorPicker","hue","saturation","lightness","onGrabStart","boxDragger","onGrabEnd","sliders","hueDragger","hexInputField","rgbInputField","inputs","valid","setColor","rgbRegExp","attachBoxListeners","attachHueListeners","attachGrabListeners","boxRect","saturationHandler","hueRect","hueHandler","updateHexInput","updateRgbInput","rgb","boxX","percentY","boxY","percentHue","hueX","updatePicker","getCurrentColor","rgbaArray","hexa","hsl","hsla","clamp","maxX","maxY","posX","posY","lightnessX","lightnessY","AppBackgroundColorTab","_applyColor","updateColorPicker","colorPicker","background_color","pushToState","onColorChange","applyColor","gridSection","grid","backgroundColor","throttle","isColored","AppBackgroundTab","clicked","wallPapersByElement","elementsByKey","onUploadClick","accept","requestFile","endsWith","createObjectURL","mimeType","scaleMediaElement","File","prepareWallPaperUpload","uploadPromise","uploadWallPaper","uploadDeferred","newKey","getWallPaperKey","setBackgroundDocument","addWallPaper","onResetClick","defaultTheme","blurCheckboxField","onGridClick","getWallPaperKeyFromTheme","backgrounds","uploadButton","colorButton","pattern","wallPapers","gridContainer","hasFile","isDark","dark","intensity","webkitMaskImage","_tempId","saveToCache","slug","hadSettings","onReady","getPixelPromise","imageUrl","imageSource","ratio","averageColorFromImageSource","averageColor","toDataURL","AppIncludedChatsTab","getContacts","foundInFilters","dialogsByFilters","onSelectChange","confirmBtn","editFolderTab","originalFilter","cmp","pinned_peers","other","otherLegacy","getInputPeerById","setFilter","onAppConfig","dialog_filters_chats_limit_premium","dialog_filters_chats_limit_default","categoriesSection","exclude_muted","ico","exclude_archived","exclude_read","selectedPeers","addedInitial","_add","flag","hasOwnProperty","AppEditFolderTab","deleting","deleteFolderButton","updateDialogFilter","bool","menuBtn","inputSection","generateList","h2Text","to","includedFlagsContainer","excludedFlagsContainer","include","include_peers","editCheckForChange","reloadMissingPromises","reloadMissingPeerIds","onEditOpen","onCreateOpen","ignoreClick","hasPeer","getDialogOnly","filtered","filterAsync","renderMore","_length","exclude_peers","purchaseUsernameCaption","purchaseText","setUsername","AppEditProfileTab","bioMaxLength","userFull","firstNameInputField","bioInputField","usernameInputField","isPurchase","availableText","takenText","invalidText","profilePromise","updateProfile","updateUsername","RIGHT_COLUMN_ACTIVE_CLASSNAME","AppSidebarRight","canHideFirst","isColumnProportionSet","toggleSidebar","setColumnProportion","createSharedMediaTab","replaceSharedMediaTab","previousTab","sharedMediaTab","historyTabIds","_selectTab","getFrom","setFrom","onCloseTab","isNavigation","willChange","animationPromise","appSidebarRight","AppEditContactTab","privacy","notificationsCheckboxField","profileNameDiv","profileSubtitleDiv","phoneRow","privacyRule","sharePhoneCheckboxField","btnDelete","deleteContacts","addContact","mediaSize","AppEditTopicTab","colorIndex","isGeneral","originalTopic","iconDiv","icon_emoji_id","setIcon","editForumTopic","topicId","iconEmojiId","createForumTopic","iconColor","onDestroy","emojiElement","icon_color","force","isMainIcon","newTopic","oldTopic","oldEl","applyFadeAnimation","fadeIn","iterations","easing","AppChatTypeTab","privateRow","publicRow","privateSection","publicContainer","chatUpdateListeners","basic","linkRow","btnRevoke","getChatInviteLink","publicSection","linkInputField","applyBtn","getValue","head","usernamesSection","getPeerEditableUsername","wasUsername","migrateChat","makeChannelPrivate","toggleNoForwards","onChatUpdate","noforwards","addChatUpdateListener","AppUserPermissionsTab","destroyListener","ChatPermissions","rights","banned_rights","editBanned","btnDeleteException","clearChannelParticipantBannedRights","kickFromChannel","exceptionText","toggleWith","defaultBannedRights","default_banned_rights","defaultRights","combineParticipantBannedRights","restrictionText","mainFlag","until_date","AppGroupPermissionsTab","chatPermissions","editChatDefaultBannedRights","addExceptionRow","openPermissions","getChannelParticipant","setSubtitle","bannedRights","cantWhat","getPeerId","setLength","exceptionsCount","loader","setLoader","getPromise","migrateFrom","migrateTo","AppChatReactionsTab","getActiveAvailableReactions","_chatReactions","available_reactions","chatReactions","reactions","makeReactionFromEmoticons","getCaptionLangPackKey","toggleSection","reactionsSection","toggleCheckboxFieldsByEmoticons","checkboxFieldsByEmoticon","toggleCheckboxField","toggleRow","save","checkboxFields","every","saveReactionsDebounced","allow_custom","saveReactions","setChatAvailableReactions","isDebounced","AppEditChatTab","_init","canChangeType","canChangePermissions","canManageTopics","getCachedFullChat","chatNameInputField","descriptionInputField","chatTypeRow","setChatTypeSubtitle","availableReactionsLength","setReactionsLength","chatAvailableReactions","permissionsRow","setPermissionsLength","forum_upgrade_participants_min","topicsRow","setTopics","toggleForum","editTitle","editAbout","signMessagesCheckboxField","signatures","toggleSignatures","showChatHistoryCheckboxField","togglePreHistoryHidden","hidden_prehistory","historiesStorage","AppSharedMediaTab","newCloseBtn","closeBtn","animatedCloseIcon","transitionContainer","transitionFirstItem","titleI18n","editBtn","transitionLastItem","secondTitle","setIsSharedMedia","isSharedMedia","isHeavy","onCloseBtnClick","toggleEditBtn","renderNewMessage","msgs","deleteDeletedMessages","btnAddMembers","showConfirmation","addChatUser","_renderNewMessage","getMessageThreadId","_deleteDeletedMessages","setLoadMutex","peerChanged","changeTitleKey","loadSidebarMedia","destroyable","SetTransition","raf","afterTimeout","SidebarSlider","closeTab","closingId","getMiddleware","onOpenTab","preserveTab","getTab","getHistory","isTabExists","deleteTab","doNotAppend","SliderSuperTab","_constructor","SliderSuperTabEventable","dispatchResultableEvent","SortedUserList","getIndex","getUserStatusForSort","onDelete","listEl","onListLengthChange","onUpdate","willChangeLength","onElementCreate","base","updateElementWith","updateListWith","createChatListOptions","doTimeout","updateList","SORT_INTERVAL","hasViewer","attachStickerViewerListeners","findTarget","originalFindTarget","checkForParent","closest","mediaContainer","previousGroup","_middleware","previousTransformer","doThatSticker","lockGroups","isSwitching","effectThumb","mediaRect","boxSize","fitted","aspectFitted","transformer","transformX","transformY","needFadeIn","withThumb","relativeEffect","loopEffect","firstFramePromise","prevPlayer","ready","onMousePreMove","newMediaContainer","_previousTransformer","StickyIntersector","observeHeaders","observeElements","headersObserver","targetInfo","boundingClientRect","stickyTarget","rootBoundsInfo","rootBounds","threshold","elementsObserver","addSentinel","sentinel","headerSentinel","getEvent","attachGlobalListenerTo","RESET_GLOBAL","TOUCH_MOVE_OPTIONS","MOUSE_MOVE_OPTIONS","SwipeHandler","handleMove","setCursorTo","hadMove","resetValues","handleStart","isMouseDown","withDelay","xDown","yDown","eventUp","onStart","xUp","yUp","xAdded","yAdded","onSwipeResult","listenerOptions","setCursor","TelInputField","pasted","lastValue","telEl","HTMLInputElement","pixelRatio","letterSpacing","IS_ANDROID","originalFunc","formattedPhoneNumber","leftPattern","shiftKey","toastEl","hideToast","toastNew","transitions","navigation","prevTabContent","animateFirst","withAnimationListener","animationFunction","_animateFirst","onTransitionEndCallbacks","animationDeferred","listenerName","onEndEvent","overrideFrom","onTransitionEndCallback","transitionTimeout","_from","isUsernameValid","UsernameInputField","checkUsernameDebounced","checkUsername","checkUsernamePromise","checkPromise","available","UsernamesSection","CLASS_NAME","_usernames","sortedList","editable","changeActive","applyUsernames","getAll","_peerId","cancelClick","newActive","toggleUsername","reorderUsernames","VisibilityIntersector","locked","change","refreshVisible","VolumeSelector","onMuteClick","setVolume","iconIndex","ICONS","wrapCustomEmoji","repeat","wrapCustomEmojiAwaited","wrapDocument","noAutoDownload","uploadFileName","audioElement","extSplitted","ext","docDiv","icoDiv","icoTextEl","hadContext","hasThumb","performance","fileName","bytesContainer","descriptionParts","bytesMaxEl","sizeDiv","_downloadDiv","addByteProgress","sizeContainer","_bytesContainer","_d","canOpenAfter","downloadFileName","downloadId","apiFileManager","isDownloading","support","was_online","today","getDate","dateEl","timeEl","toggleMediaSpoiler","reveal","destroyAfter","onMediaSpoilerClick","wrapMediaSpoiler","wrapMediaSpoilerWithImage","wrapMessageActionTextNew","plain","hadColors","wrapJoinVoiceChatAnchor","wrapUrl","wrapLinkToMessage","savedFrom","dir","wrapSomeText","htmlToSpan","wrapTopicIcon","ns","contentSpan","gradientId","strokeColor","clone","topicAvatar","wrapMessageActionTopicIcon","wrapMessageActionTopicIconAndName","wrapMessageActionTextNewUnsafe","unsafeMessage","getNameDivHTML","formatCallDuration","post","schedule_date","daysToStart","tomorrowDate","_args","day","pinnedMessage","reply_to_mid","fetchMessageReplyTo","user_id","joined","anchorHTML","isRecurringInit","recurring_init","isRecurringUsed","recurring_used","paymentsWrapCurrencyAmount","total_amount","currency","invoiceMessage","reply_to","reply_to_peer_id","period","titleElement","authorElement","isMe","isIconChanged","isIconRemoved","isTitleChanged","isHiddenChanged","closed","waited","wrapMessageForReply","usingMids","withoutMediaType","hasAlbumKey","addPart","part","isRestricted","usingFullAlbum","grouped_id","getMidsByMessage","albumText","getAlbumText","poll","question","game","extended_media","actionWrapped","restriction_reason","exec","messageWrapped","noLinks","noTextFormat","wrapPeerTitle","wrapPhoto","withTail","noThumb","blurAfter","isImageFromDocument","startsWith","isWebDoc","isFit","renderOnLoad","canAttachPreloader","haveToDownload","onlyCache","getDownloadPromise","wrapSenderToPeer","senderTitle","fromMe","wrapSentTime","STICKER_EFFECT_MULTIPLIER","locksUrls","videosCache","_timeout","wrapSticker","loadStickerMiddleware","exportLoad","needUpscale","skipRatio","asStatic","fullThumb","noPremium","isCustomEmoji","syncedVideo","stickerType","emojiSticker","animatedSticker","staticSticker","isAnimated","getStickerEffectThumb","willHaveLock","lockUrl","toneIndex","isThumbNeededForType","lottieCachedThumb","getLottieCachedThumb","haveThumbCached","afterRender","num","getPathFromBytes","getPreviewURLFromThumb","stickerThumbConverted","webpWorkerController","saveWebPConvertedStrippedThumb","getImageFromStrippedThumb","middlewareError","sync","setLockColor","skipx","skipy","imageData","sr","sg","sb","sa","outCanvas","outContext","computeLockColor","onFirstFrame","saveLottiePreview","preloadAnimatedEmojiStickerAnimation","isSingleVideo","cacheName","framesCache","cachePromise","previousTime","playedTimes","onTimeupdate","mediaLength","lastPromise","_media","preloadSticker","playing","animationDiv","stickerPromise","side","attachStickerEffectHandler","onEmojiStickerClick","getAnimatedEmojiSoundDocument","getAnimatedEmojiSticker","emojiData","sendInteractionThrottled","msg_id","interaction","JSON","stringify","withRandomOffset","wrapStickerAnimation","unmountAnimation","vibrate","generateRandomSigned","randomOffsetX","randomOffsetY","setPosition","factor","stableOffsetX","stableOffsetY","rectX","rectY","addOffsetX","addOffsetY","wrapStickerEmoji","wrapStickerSetThumb","downloadOptions","getStickerSetThumbDownloadOptions","videos","getDocPromise","thumb_document_id","wrapStickerToRow","previousMedia","_size","wrapTopicNameButton","roundVideoCircumference","wrapVideo","videoSize","noAutoplayAttribute","isAlbumItem","canAutoplay","spanTime","spanPlay","needPlayButton","photoRes","divRound","halfSize","strokeDashoffset","globalVideo","onPaused","onFrame","renderDeferred","loadPhotoThumbFunc","wrapWebPageDescription","shortDescriptionText","wrapWebPageTitle","shortTitle","site_name","EmojiVersions","Emoji","version","FontFamily","FontSize","FontWeight","instances","getAnimationInstance","cancelAnimationByKey","instance","isCancelled","animateSingle","tick","createAnimationInstance","array","AudioAssetPlayer","assets","playSound","assetName","createAudio","playSoundIfDifferent","Audio","stopSound","cancelDelayedPlay","playSoundWithTimeout","heavyQueue","processingQueue","addHeavyTask","processHeavyQueue","todo","possiblePromise","process","realResult","timedChunk","requireBlurPromise","fastBlurFunc","processBlurNext","dataUri","JPEG_HEADER","bytesFromHex","JPEG_TAIL","getPreviewBytesFromURL","needle","jpegBytes","atob","char","charCodeAt","isSticker","convertToUint8Array","dataURL","btoa","bytesToDataURL","calcImageInBox","imageW","imageH","boxW","boxH","noZoom","boxedImageW","boxedImageH","drawCircle","beginPath","closePath","drawCircleFromStart","getTextWidth","measureText","source","createImageBitmap","resizeWidth","resizeHeight","quality","badCharsRe","trimRe","C2L","clearBadCharsAndTrim","latinize","processSearchText","clearBadChars","ignoreCase","hasTag","includeTag","charAt","originalText","ch","latinizeCh","latinizeString","fixCyrillic","fallbackCopyTextToClipboard","textArea","removeChild","copyTextToClipboard","clipboard","writeText","ContextMenuController","diffX","diffY","isOpened","openBtnMenu","months","days","ONE_DAY","getWeekNumber","UTC","getMonth","dayNum","getUTCDay","setUTCDate","getUTCDate","yearStart","getUTCFullYear","formatDateAccordingToTodayNew","weekday","formatFullSentTimeRaw","formatTime","capitalize","textTransform","formatFullSentTime","getFullDate","joiner","monthAsNumber","getHours","getMinutes","noSeconds","leadingZero","noTime","minYear","yearPattern","monthYearOrDayPattern","yearOrDayAndMonthPattern","shortDate","longDate","numberOfDaysEachMonth","fillTipDates","setFullYear","dayOfWeek","formatWeekLong","getDay","getDayOfWeek","setTime","g1","g2","createForDayMonth","createForMonthYear","selectedYear","currentYear","g3","validDateForMonth","formatterYearMax","k1","setMonth","formatterMonthYear","formatterDayMonth","T_ME","copyWhat","copyText","_cancelContextMenuOpening","_cancelContextMenuOpeningTimeout","cancelContextMenuOpening","onCancel","onMove","isTouch","onTouchEnd","touch","changedTouches","CLICK_EVENT_NAME","touchMouseDown","detachClickEvent","simulateClickEvent","ControlsHover","setHideTimeout","hideControlsTimeout","isShown","controlsLocked","toggleControls","relatedTarget","createContextMenu","findElement","filterButtons","onBeforeOpen","initResult","verifyFavoriteSticker","toAdd","favedStickers","_doc","disablePictureInPicture","resetCache","computedStyle","getProperty","getPropertyAsSize","simulateEvent","childNodes","tag","requestFullScreen","requestFullscreen","mozRequestFullScreen","webkitRequestFullscreen","msRequestFullscreen","cancelFullScreen","mozCancelFullScreen","webkitCancelFullScreen","msExitFullscreen","addFullScreenListener","addListener","eventName","getFullScreenElement","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","msFullscreenElement","isFullScreen","getCaretPosF","childNodesLength","alt","markdownTags","entityName","underline","italic","monospace","strikethrough","mentionName","BLOCK_TAGS","BOM_REG_EXP","SELECTION_SEPARATOR","checkNodeForEntity","follow","isLineEmpty","getRichElementValue","selNode","selOffset","isBlock","isTableCell","wasEntitiesLength","wasLinesLength","wasNodeEmpty","field","withEntities","withCaret","DocumentFragment","startOffset","startContainer","possibleChildrenFocusOffset","getCaretPos","caretPos","getViewportSlice","overflowRect","extraSize","invisibleTop","invisibleBottom","foundVisible","lookForSticky","overflowTop","overflowRight","overflowBottom","overflowLeft","sticky","windowWidth","windowHeight","handleHorizontalSwipe","cancelY","template","isSendShortcutPressed","isComposing","secondaryKey","isSwipingBackSafari","TouchEvent","placeCaretAtEnd","ignoreTouchCheck","selectionStart","selectionEnd","prevPos","backgroundImage","useCache","isImage","renderImageFromUrlPromise","renderMediaWithFadeIn","compareNodes","node1","node1Offset","node2","node2Offset","parents","commonAncestorContainer","NOT_ONLY_BOMS_REG_EXP","USING_BOMS","RichInputHandler","saveSelectionOnChange","saveRangeForElement","onFocusOut","lastNode","lastOffset","onSelectionChange","setSelectionClassName","caret","getCaretPosN","move","superMove","modify","getFiller","addInputCallback","processEmptiedFillers","fixInsertedLineBreaks","moveFirst","setEnd","isBOM","deleteData","processFilledFillers","removeEmptyTextNodes","fixBuggedCaret","savedRanges","IS_FIREFOX","inputCaptureCallbacks","anchorNode","findPreviousSmthIndex","something","fromSelectionChange","smthIndex","moved","idxidx","rangeString","onlyBOMs","restoreSavedRange","makeFocused","newCallback","sibling","needed","treeWalker","createTreeWalker","NodeFilter","SHOW_TEXT","acceptNode","FILTER_REJECT","FILTER_ACCEPT","textNode","nextNode","removePossibleBOMSiblings","removePossibleBOMSiblingsByNode","cleanSiblings","insertData","bomNode","intersectsNode","focusNode","focusNodeBefore","focusOffset","focusOffsetBefore","collapseToStart","collapseToEnd","focusNodeAfter","focusOffsetAfter","prepareApplyingMarkdown","fillers","smths","INSTANCE","Sortable","minY","elementRect","lastSiblings","siblings","property","getSortableTarget","scrollableRect","toEnd","addScrollPos","scrollPos","startScrollPos","isVertical","countNonElements","DropdownHover","onClickOut","ignoreButtons","ignoreMouseOut","toElement","willBeActive","inited","timeouts","attachButtonListener","setIgnoreMouseOut","onmouseout","onmouseover","FocusDirection","fastSmoothScroll","maxDistance","Static","scrollWithJs","getNormalSize","rectStartKey","rectEndKey","sizeKey","scrollSizeKey","elementScrollSizeKey","scrollPositionKey","possibleElementPosition","containerSize","scrollSize","fallbackToElementStartWhenCentering","remainingPath","absPath","startAt","shortTransition","longTransition","currentPath","distanceToEnd","FILENAME_JOINER","getFileNameByLocation","thumb_size","big","stickerset","short_name","thumb_version","volume_id","local_id","strictDecimals","_decimals","dm","fixed","pow","parseFloat","CALL_DURATION_LANG_KEYS","mm","showLast","dd","formatDuration","strings","prefixes","maxPrefixLength","setPrefix","originalStr","prefixCountry","patterns","searchForPattern","mostMatchedPatternMatches","mostMatchedPattern","_pattern","patternMatches","symbol","FramesCache","framesNew","framesURLs","getCache","createCache","releaseCache","getCacheCounter","generateName","arcParameter","rx","ry","xAxisRotation","largeArcFlag","sweepFlag","tl","tr","bl","useBlur","ignoreCache","ListLoader","loadedAllDown","setLoaded","unsetCurrent","toPrevious","goUnsafe","down","loadPromiseDown","loadPromiseUp","processedArr","processed","ListenerSetter","listeners","addManual","onceCallback","onceFired","_listener","MediaSize","aspect","aspectCovered","makeMediaSize","ScreenSize","CUSTOM_EMOJI_SIZE","ESG_CUSTOM_EMOJI_SIZE","EMOJI_STATUS_SIZE","MediaSizes","screenSizes","mobile","medium","large","handhelds","regular","album","esgSticker","documentName","invoice","extendedInvoice","customEmoji","esgCustomEmoji","popupSticker","desktop","isMobile","handleResize","innerWidth","activeScreen","wasScreen","rAF","throwWhat","numberThousandSplitter","HAVE_METADATA","useCanplayOnIos","loadEventName","errorEventName","OverlayClickHandler","withOverlay","amount","skipSymbol","isNegative","currencyData","amountExp","exp","number","dec_point","thousands_sep","isFinite","prec","sep","dec","toFixedFix","number_format","decimal_sep","space_between","symbol_left","splitter","additionalPadding","getScrollWidthFromElement","menuWidth","menuHeight","paddingRight","paddingBottom","paddingLeft","verticalSide","maxTop","maxLeft","minLeft","sides","intermediateX","intermediateY","possibleSides","platforms","getRestrictionReason","reasons","reason","savingLottiePreview","isSavingLottiePreview","saving","throttleWithRaf","fn","schedulerFn","waiting","throttleWith","ScrollableLoader","SearchListLoader","messageId","generateMessageId","filterMids","onHistoryDelete","shouldBeDeleted","onHistoryMultiappend","onMessageSent","isInner","otherSideLoader","filterMessagesByInputFilterFromStorage","goToOtherEnd","do","kind","scheduleFlush","measure","mutate","mutateElement","read","write","pushDocumentSize","_isWebDocument","replies","comments","channel_id","BatchProcessor","bindPrefix","queuePromise","addToQueue","setQueue","possibleError","perf","renderedQueue","SortedList","batchProcessor","_updateList","canUpdate","createPromise","noScheduler","encodeEntities","limitFrom","leadZero","sec_num","hours","minutes","seconds","textToSvgURL","Blob","reader","FileReader","readAsDataURL","visualViewport","innerHeight","ANIMATION_START_EVENT","ANIMATION_END_EVENT","isAnimating","heavyAnimationPromise","promisesInQueue","dispatchHeavyAnimationEvent","_heavyAnimationPromise","onHeavyAnimationEnd","interruptHeavyAnimation","getHeavyAnimationPromise","handleAnimationStart","handleAnimationEnd","DialogsContextMenu","onArchiveClick","editPeerFolders","folder_id","onHideTopicClick","onToggleTopicClick","onPinClick","toggleDialogPin","onUnmuteClick","onUnreadClick","unread_count","readHistory","top_message","markDialogUnread","getButtons","getDialogOrTopic","getDeleteButtonText","lastButton","isDialogUnread","pinned","ConnectionStatusComponent","hadConnect","connecting","timedOut","updating","setConnectionStatus","overrideStatus","baseDcId","connectionStatus","setFirstConnectionTimeout","online","apiUpdatesManager","forceGetDifference","retryAt","setStatusText","currentLangPackKey","statusEl","statusPreloader","singleInstance","CHANGE_STATE_DELAY","getA","networkerFactory","forceReconnect","timerSpan","interval","forceReconnectTimeout","setStateTimeout","statusContainer","SENDING_STATUS","easeInOutSine","easeInOutSineApply","roundRect","defaultRadius","moveTo","lineTo","quadraticCurveTo","DPR","SIZE","MARGIN","WIDTH","RADIUS","Shimmer","currTime","diffTime","spread","pausedTime","pauseInterval","lightSource","lightSpread","currentAnimationIndex","keepTime","cycleAnimation","currentAnimation","animateGlow","animateSlide","smartInc","lightLeft","lightRight","lightCenter","createLinearGradient","shimmerColor","addColorStop","dict","on","fillText","DialogsPlaceholder","onThemeChange","stopAnimation","startAnimation","updateCanvasSize","shimmer","generatedValues","marginVertical","totalHeight","lineHeight","lineBorderRadius","lineMarginVertical","statusWidth","getRectFrom","onRemove","blockScrollable","overflowY","availableLength","detachTime","renderDetachAnimationFrame","globalCompositeOperation","completed","elapsedRowTime","dialogHeight","renderFrame","createPattern","patternCanvas","patternContext","drawChat","firstLineWidth","secondLineWidth","marginLeft","shake","keyframes","setPromiseMiddleware","oldPromise","SortedDialogList","getDialogIndex","forumPeerId","indexKey","addListDialog","isBatch","isMainList","DialogElement","bigger","abitbigger","small","captionDiv","titleSpanContainer","peerTitlePromise","statusSpan","lastTimeSpan","rightSpan","dialogDom","setDialogActive","forumTab","createUnreadBadge","unreadBadge","badge","createUnreadAvatarBadge","unreadAvatarBadge","createMentionsBadge","mentionsBadge","toggleBadgeByKey","hasBadge","justCreated","ForumTab","init2","isFloating","toggleForumTab","createChatList","setListClickListener","xd","Some3","bindScrollable","getOptionsForMessages","fullReset","subscribeToChannelUpdates","unsubscribeFromChannelUpdates","setStatusPromise","noTyping","onChatsScroll","loadResult","setStatus","NOT_IMPLEMENTED_ERROR","Some","onChatsRegularScroll","sliceTimeout","processContact","scrollTopWas","rectContainer","rectTarget","firstY","lastY","firstElement","elementFromPoint","lastElement","elementOverflow","sliceFromStart","sliceFromEnd","deleteDialogByKey","getDialogKeyFromElement","setOffsets","offsets","getOffsetIndex","isDialogMustBeInViewport","topOffset","bottomOffset","setIndexKey","deleteDialog","getDialogKey","updateDialog","loadedDialogsAtLeastOnce","getDialogElement","setLastMessageN","setUnread","onChatsScrollTop","loadDialogs","createPlaceholder","placeholderOptions","getRectFromForPlaceholder","loadDialogsPromise","loadDialogsRenderPromise","cachedInfoPromise","chatList","getConversationsResult","loadDialogsInner","needPlaceholderAtFirstTime","isTopEnd","offsetDialog","firstDialog","lastDialog","getDialogFromElement","getDialogDom","oldTypingElement","newTypingElement","unsetTyping","paddingX","typings","topics","setUnreadMessagesN","drop","sidebarRect","currentOffsetIndex","needIndex","Some2","getUserStatus","setOnlineStatus","processDialogForCallStatus","validateDialogForFilter","getCachedDialogs","validateListForFilter","doNotRenderChatList","hasClassName","generateScrollable","getDialogIndexKey","sortedDialogList","testDialogForFilter","migratedTo","setCallStatus","callIcon","START_X","wasMounted","itemProgress","groupCallActiveIcon","call_active","call_not_empty","loadContacts","toggleAvatarUnreadBadges","sortedDialog","reuseClassNames","unreadContent","isUnreadAvatarBadgeMounted","unreadAvatarBadgeClassList","unreadBadgeClassList","AppDialogsManager","Log","menuScrollContainer","lastActiveElements","initedListeners","xds","onTabChange","_onListLengthChange","checkIfPlaceholderNeeded","hasContacts","removeContactsPlaceholder","updateContactsLength","dialogSize","verifyPeerIdForContacts","getProxiedManagers","stateMiddlewareHelper","bottomPart","forumsTabs","forumsSlider","allChatsIntlElement","isFilterIdAvailable","clearCurrent","showFiltersPromise","onStateLoaded","setFilterId","addFilter","foldersScrollable","_id","filtersNavigationItem","setFilterIdAndChangeTab","changeFiltersAllChatsKey","groupCallsController","callsController","initListeners","setFiltersUnreadCount","setFilterUnreadCount","elementThreadId","elementPeerId","onFiltersLengthChange","containerToAppend","getDialogIndexKeyByFilterId","renderedFilter","filtersArr","haveFilters","addFilters","addFiltersPromise","getNotifyPeerTypeSettings","fillConversations","unreadSpan","unread","unreadUnmutedCount","unreadCount","getFolderUnreadCount","wasShowing","generateEmptyPlaceholder","classNameType","subtitleArgs","placeholderContainer","needPlaceholder","emptyDialogsPlaceholderSubtitle","usersLength","placeholderType","updatePartClassName","updateContactsLengthPromise","newTab","hideTab","forumNavigationItem","toggleForumTabByPeerId","lastTab","isSameTab","withContext","openInner","lastActiveListElement","setPeerFunc","setLastMessage","draftMessage","draft","topMessage","isSearch","isMessageRestricted","willPrepend","videoTypes","playIcon","replyTo","forum_topic","setUnreadMessages","isDialogPinned","getForumUnreadCount","hasUnmuted","isPinned","forumUnreadCount","wasMuted","unreadTopicsCount","hasUnmutedTopic","setStatusMessage","read_inbox_max_id","hasUnreadBadge","hasUnreadAvatarBadge","transitionDuration","disableAnimationIfRippleFound","iconClassName","setSendingStatus","isUnreadBadgeMounted","hasMentionsBadge","unread_mentions_count","isMentionsBadgeMounted","isBadgeMounted","unreadBadgeText","isUnread","isMention","notVisited","getDialog","originalDialog","getOutputPeer","addDialogNew","addDialogAndSetLastMessage","getMessageSenderPeerIdOrName","downloads","getNewDeferred","cancelDownload","clearDownload","getNewDeferredForUpload","getUpload","getDownload","getUploadPromise","getDownloadFileNameFromOptions","downloadMedia","promiseBefore","getDownloadMediaDetails","downloadMediaURL","downloadMediaVoid","getFileNameForUpload","downloadToDisc","justAttach","pingPromise","iframe","hadProgress","getDocumentDownloadOptions","getPhotoDownloadOptions","clickEvent","createEvent","initMouseEvent","createDownloadAnchor","revokeObjectURL","partition","bad","BubbleGroup","avatarLoadPromise","avatarContainer","fwdFrom","fwdFromId","isForwardFromChannel","from_id","currentPeerId","firstTimestamp","firstItem","firstMid","lastTimestamp","lastItem","lastMid","updateClassNames","insertItem","insertInDescendSortedArray","sortGroupItemsKey","insertGroup","mount","onItemUnmount","mountItem","onItemMount","unmountItem","dateContainer","getDateContainerByTimestamp","dateGroups","_group","dateGroupsLength","unmountedLength","STICKY_OFFSET","deleteEmptyDateGroups","BubbleGroups","itemsArr","itemsMap","newGroupDiff","sortItemsKey","sortGroupsKey","removeItemFromCache","removeAndUnmountBubble","getItemByBubble","getSiblingsAtIndex","modifiedGroups","canItemsBeGrouped","groupUngrouped","mountUnmountGroups","toMount","toUnmount","getLastGroup","changeBubbleMid","insertItemToArray","changeItemBubble","changeBubbleByBubble","item1","item2","isAllMessagesForum","itemIndex","findGroupSiblingByItem","findGroupSiblingInItems","previousItem","siblingGroupedItem","nextItem","addItemToGroup","addItemToCache","getMessageFromId","createItem","SERVICE_AS_REGULAR","getDateForDateContainer","groupMid","splitSiblingsOnGrouping","prepareForGrouping","hadGroup","foundItem","splittedGroups","PopupDatePicker","initDate","onPick","noButtons","selectedDate","selectedMonth","minMonth","prevBtn","maxMonth","onDateClick","selectedEl","setTimeTitle","controlsDiv","monthTitle","monthsContainer","handleTimeInput","onOverflow","maxString","hoursInputField","minutesInputField","setMinutes","popupCenterer","timeOptions","sendDate","dateOptions","renderElement","firstDate","weekStartDate","dayIndex","clonedDate","showOverflowMonths","remainder","DivAndCaption","MEDIA_SIZE","wrapReplyDivAndCaption","mediaEl","messageMedia","isRound","mediaChildren","video_thumbs","ReplyContainer","isMediaSet","wrapReply","setColorPeerId","replyContainer","AVATAR_CLASS_NAME","AVATAR_CONTAINER_CLASS_NAME","StackedAvatars","TAG_NAME","RepliesElement","updated","postKey","leftPart","recent_repliers","stackedAvatars","read_max_id","max_id","textSpan","iconSpan","rippleContainer","subscribeRepliesThread","updateMessage","makeEdited","edited","makeSponsored","MessageRender","chatType","editedSpan","sponsoredSpan","isSponsored","sponsored","isMessage","views","postAuthor","post_author","postViewsSpan","channelViews","edit_date","edit_hide","timeSpan","clonedArgs","renderReplies","bubbleContainer","messageDiv","isFooter","repliesFooter","setReply","isReplacing","currentReplyDiv","replyToPeerId","originalMessage","originalPeerTitle","titlePeerId","originalMessageFwdFromId","needUpdate","replyMid","reflowScrollableElement","SEND_WHEN_ONLINE_TIMESTAMP","INTERNAL_LINK_TYPE","PopupJoinChatInvite","chatInvite","request_needed","importChatInvite","savePhoto","peopleCount","ReactionElement","reactionCount","_reactionCount","setCanRenderAvatars","canRenderAvatars","doNotRenderSticker","hadStickerContainer","getReaction","callbackify","center_icon","renderDoc","wrapPromise","wrapStickerPromise","renderCounter","displayOn","renderAvatars","recentReactions","peer_id","setIsChosen","isChosen","chosen_order","fireAroundAnimation","REACTION_INLINE_SIZE","REACTION_BLOCK_SIZE","around_animation","iconPlayer","aroundPlayer","removeOnFrame","REACTIONS_ELEMENTS","ReactionsElement","middlewareHelpers","onConnectCallback","getReactionCount","reactionElement","getMessage","isPlaceholder","changeMessage","changedResults","hasReactions","counts","reactionsEqual","totalReactions","can_see_list","recent_reactions","handleChangedResults","ScrollSaver","getSaved","findElements","replaceSaved","findAndSetElements","_save","scrollHeightMinusTop","onRestore","useReflow","setScrollTop","newScrollTop","restore","_restore","previousScrollHeightMinusTop","SuperIntersectionObserver","observing","observingQueue","freezedObservingNew","toggleObservingNew","isMentionUnread","mentioned","accumulate","stringResults","numberResults","replaceNonNumber","CARD_BRAND_REGEXP","visa","mastercard","amex","discover","diners","diners14","jcb","unionpay","elo","mir","CARD_BRANDS","minLength","cvcMaxLength","cvcMinLength","unknown","detectCardBrand","card","sanitizedCard","brand","detectUnifiedCardBrand","createArray","delta","buggedRegExp","getDistanceFromBuggedToNormal","fixBuggedNumbers","makeOptionalCharacter","consumed","makeRequiredCharacter","partial","wrapCharacterRegExpFactory","optional","_regExp","makeCharacter","makeMonthDigitPatternCharacter","digit","capitalCharacter","cleanedResult","formattingCharacter","str1","makeFormattingCharacter","optionalPattern","spaceCharacter","yearOptionalPattern","sixteenPattern","fifteenPattern","requiredPostcodes","generateFourPattern","cardFormattingPatterns","cardNumber","cardExpiry","cardCvc","cardCvcFromBrand","postalCodeFromCountry","optionalDigits","accumulateLengths","strs","nbspRegExp","makeValidationError","validateCardNumber","sanitized","getCardInfoByNumber","ignoreIncomplete","validateCompleteCardNumber","makeCardNumberError","validateCardExpiry","monthStr","yearStr","_year","nextMonth","isNaN","validateExpiry","parse","TelegramWebView","sandbox","onTelegramWebViewEvent","eventType","eventData","onMount","contentWindow","createVerificationIframe","allow","PopupPaymentVerification","openPathAfter","telegramWebView","path_full","InputFieldCorrected","lastKeyDown","lastTransformed","getPattern","pushRest","autocorrectComplete","character","getCharacter","meta","formatInputValueByPattern","formatMethod","transformedValue","validateNew","onBlur","justReturn","validateMethod","validateAnyIncomplete","errorKeys","handleInputFieldsOnChange","_onChange","createCountryZipFields","zip","countryInputField","postcodeInputField","SUPPORTED_NATIVE_PROVIDERS","PopupPaymentCard","paymentForm","savedCard","native_provider","cardOut","token","credentials","can_save_credentials","cardSection","nativeParams","native_params","lastBrand","lastBrandImg","brandIconTempId","cardInputField","invalid","incomplete","transformed","getPaymentBrandIconPath","setBrandIcon","cvcInputField","need_cardholder_name","expireInputField","switchFocusOrder","previousInputField","nextInputField","inputFieldsRow","billingSection","need_country","need_zip","canSave","saveCheckboxField","saveRow","payButton","PaymentButton","expiryFull","expiryMonth","expiryYear","cvc","cardholderName","nativeProvider","URLSearchParams","headers","publishable_key","expiration_month","expiration_year","security_code","public_token","PopupPaymentCardConfirmation","inputCheckPassword","getInputCheckPassword","tmpPassword","password","handled","PopupPaymentShipping","inputInvoice","savedInfo","saved_info","addressSection","address1InputField","address2InputField","cityInputField","stateInputField","receiverSection","emailInputField","shipping_address_requested","name_requested","email_requested","phone_requested","validateEmail","validatePhone","selectedCountry","shipping_address","street_line1","street_line2","city","country_iso2","post_code","requestedInfo","validateRequestedInfo","shippingAddress","ADDRESS_STREET_LINE1_INVALID","ADDRESS_STREET_LINE2_INVALID","ADDRESS_COUNTRY_INVALID","ADDRESS_CITY_INVALID","ADDRESS_STATE_INVALID","ADDRESS_POSTCODE_INVALID","REQ_INFO_NAME_INVALID","REQ_INFO_EMAIL_INVALID","REQ_INFO_PHONE_INVALID","focusField","PopupPaymentShippingMethods","shippingOption","shipping_options","prices","lastShippingId","option","PopupPayment","isReceipt","tipButtonsMap","confirmed","onConfirmed","popupPaymentVerification","mediaInvoice","receipt_msg_id","isTest","itemEl","detailsClassName","photoEl","linesClassName","linesEl","botName","preloaderContainer","getPaymentReceipt","getPaymentForm","savedCredentials","saved_credentials","lastRequestedInfo","providerPeerTitle","provider_id","wrapAmount","isRecurring","recurring","peerTitle2","makeLabel","pricesClassName","makePricesElements","price","_label","wrappedAmount","pricesElements","getTipsAmount","shippingAmount","setTotal","totalAmount","totalLabel","payI18n","canTip","max_tip_amount","tip_amount","tipsClassName","getInputValue","setInputWidth","setInputValue","unsetActiveTip","tipEl","tipsLabel","haveToIgnoreEvents","ignoreNextSelectionChange","tipsEl","tipClassName","tipButtons","suggested_tip_amounts","tipAmount","prevTipEl","setRowIcon","setRowTitle","setCardSubtitle","methodRow","onMethodClick","previousCardDetails","previousToken","credentials_title","providerRow","providerAvatar","shippingAddressRow","shippingNameRow","shippingEmailRow","shippingPhoneRow","shippingMethodRow","lastShippingOption","onShippingAddressClick","onShippingMethodClick","setShippingTitle","postAddress","setShippingInfo","setShippingOption","scrollSaver","lastShippingPricesElements","shipping","acceptTermsCheckboxField","recurring_terms_url","acceptTermsRow","recurringElements","lastTmpPasword","missingInfo","tmp_password","paymentResult","sendPaymentForm","form_id","_passwordState","valid_until","tsNow","Layouter","minWidth","spacing","ratios","countRatios","proportions","countProportions","averageRatio","maxSizeRatio","layout","ComplexLayouter","layoutTwo","layoutThree","layoutFour","layoutTwoTopBottom","layoutTwoLeftRightEqual","layoutTwoLeftRight","layoutThreeLeftAndOther","layoutThreeTopAndOther","layoutFourTopAndOther","layoutFourLeftAndOther","geometry","RectPart","minimalWidth","secondWidth","firstWidth","firstHeight","thirdHeight","secondHeight","rightWidth","leftWidth","thirdWidth","h0","w0","w2","w1","h1","h2","cropRatios","attempts","multiHeight","sum","pushAttempt","lineCounts","heights","second","third","fourth","optimalAttempt","optimalDiff","attempt","lineCount","minLineHeight","bad1","bad2","optimalCounts","optimalHeights","rowCount","colCount","col","prepareAlbum","widthItem","heightItem","borderTopLeftRadius","borderBottomLeftRadius","borderTopRightRadius","borderBottomRightRadius","forMedia","mediaDiv","wrapAlbum","attachmentDiv","uploading","containerHeight","hasSpoiler","itemWidth","itemHeight","AppPollResultsTab","resultsDiv","appPollsManager","getPoll","quiz","voters","total_voters","roundPercents","answer","answers","answerEl","answerTitle","answerPercents","getVotes","votesList","votes","vote","lineTotalLength","minIndex","minRemainder","maxRemainder","pollElement","isClosed","performResults","chosenIndexes","PollElement","setMaxLength","resizePolls","hideQuizHint","onHide","prevQuizHint","prevQuizHintOnHide","prevQuizHintTimeout","isListenerSet","isQuiz","isRetracted","isPublic","isMultiple","chosingIndexes","sentVote","MAX_LENGTH","MAX_OFFSET","svgLines","setLineProgress","descKey","public_voters","multiple_choice","multipleSelect","descDiv","typeDiv","avatarsDiv","close_period","close_date","timeLeftDiv","quizTimer","circumference","closeTime","quizInterval","timeLeft","getResults","answerDivs","numberDivs","footerDiv","viewResults","votersCountDiv","sendVoteBtn","sendVotes","canVote","setVotersCount","clickHandler","initQuizHint","solution","solution_entities","toggleHint","setQuizHint","correctResult","correct","chosen","answerIndex","foundIndex","indexes","sendVotePromise","sendVote","recent_voters","isVoted","hideSendVoteBtn","hideViewResultsBtn","maxPercents","getPercentValue","iterate","fullTime","votersCount","rtlChars","justRtlDirCheck","IGNORE_ACTIONS","TEST_SCROLL_TIMES","TEST_SCROLL","PEER_CHANGED_ERROR","BIG_EMOJI_SIZES","BIG_EMOJI_SIZES_LENGTH","getMainMidForGrouped","ChatBubbles","unreadOut","bubblesNewByGroupedId","bubblesNew","dateMessages","scrolledDown","isScrollingTimeout","unreaded","unreadedSeen","messagesQueueOnRenderAdditional","firstUnreadBubble","followStack","isFirstLoad","passEntities","viewsMids","isTopPaddingSet","renderingMessages","bubblesToEject","bubblesToReplace","setPeerTempId","renderNewPromises","extendedMediaMessages","unreadedObserverCallback","onUnreadedInViewport","viewsObserverCallback","sendViewCountersDebounced","sponsoredMessage","randomId","random_id","viewSponsoredMessage","stickerEffectObserverCallback","onBubblesMouseMove","unhoverPrevious","hoverBubble","hoverReaction","setHoverVisible","stickerWrapper","getGroupsFirstMessage","getAvailableReactionsByMessage","select_animation","sendReaction","onBubblesClick","setInnerPeer","chatInner","onDatePick","contactDiv","callDiv","callUser","getInputInvoiceByPeerId","reactionsElement","stickerEmojiEl","bubbleMid","reply_to_top_id","saved_from_msg_id","openThread","message1","getMessageWithReplies","getDiscussionMessage","via","setDraft","peerIdStr","documentDiv","groupedItem","SINGLE_MEDIA_CLASSNAME","isSingleMedia","hasAspecter","albumItem","isReplyClick","replyToMid","reply_to_msg_id","scrollDimensions","forceDown","sliceViewportDebounced","setCorrectIndexThrottled","setStickyDateManually","setPeerPromise","processBatch","loadQueue","filterQueue","avatarPromises","groupBubbles","updatePosition","timePromises","groupCollapsed","groupEnd","setUnreadDelimiter","restoreScroll","prepareToSaveScroll","ejectBubbles","oldBubble","bubbleGroups","updatePlaceholderPosition","requestHistory","setMessageId","constructBubbles","sequential","messagesStorageKey","messagesQueuePromise","newItem","_items","scrollingToBubble","scrollToEnd","deleteMessagesByIds","tempMessage","_bubble","groupedId","getMessagesByAlbum","reactionsElements","repliesElement","newDiv","safeRenderMessage","scrollToBubbleIfLast","deletedMids","wasMainMid","mainMid","createScrollSaver","appendReactionsElementToBubble","dateMessage","dateBubble","previousStickyDate","sliceViewport","setScroll","attachContainerListeners","highlightBubble","replyAfter","swipeAvatar","shouldReply","canSend","_target","_swipeAvatar","initMessageReply","constructPeerHelpers","updateGradient","setUnreadCount","updateUnreadByDialog","finishPeerChange","reloadMessages","toDelete","postViewsElements","different","postViews","incrementMessageViews","getScheduledMessagesStorage","createResizeObserver","resizeObserver","wasHeight","skip","scrolled","onResizeEnd","setEndRAF","ResizeObserver","contentRect","realDiff","_part","needScrollTop","destroyResizeObserver","setReactionsHoverListeners","getRenderedLength","readUnreaded","readPromise","idleController","bubblesMaxId","getHistoryMaxId","readContents","onGoDownClick","getBubbleByPoint","getGroupedBubble","groupId","getMidsByAlbum","findNextMountedBubbleByMsgId","filterCallback","_mid","foundMid","loadMoreHistory","getHistoryTopPromise","getHistoryBottomPromise","getHistory1","destroyScrollable","getHistoryStorage","readMaxId","readOutboxMaxId","msgId","destroyBubble","permanent","ignoreOnScroll","pollExtendedMediaMessages","getExtendedMedia","setExtendedMediaMessagesPollInterval","pollExtendedMediaMessagesPromise","setTopPadding","setPaddingTo","isPaddingNeeded","unsetPadding","newMessage","getLastBubble","performHistoryResult","scrollToBubbleEnd","scrollToBubble","isChangingHeight","messageInput","dimensions","datasetKey","createDateBubble","bubbleContent","serviceMsg","fakeBubble","bubblesToo","cleanupPlaceholders","attachedUnreadBubble","fetchNewPromise","getSponsoredMessagePromise","onAnimateLadder","resolveLadderAnimation","attachPlaceholderOnRender","emptyPlaceholderBubble","samePeer","stack","startParam","onChangePeer","getPinnedMessagesMaxId","isTarget","followingUnread","savedPosition","overrideAdditionMsgId","getChatSavedPosition","getReadMaxIdIfUnread","foundSlice","findSliceOffset","isJump","isStartButtonNeeded","setStartParam","setQueueId","messageEntityBotCommand","isBot","additionMsgId","maxBubbleId","oldChatInner","oldPlaceholderBubble","haveToScrollToBubble","fromUp","scrollFromDown","scrollFromUp","willScrollOnLoad","setPeerOptions","waitPromise","setPeerCached","mountedByLastMsgId","isPinnedMessagesNeeded","setCorrectIndex","lastBubble","onRenderScrollSet","afterSetPromise","setFetchReactionsInterval","setFetchHistoryInterval","onScrolledAllDown","isForumTopic","unread_mark","fetchReactions","getMessagesReactions","needFetchInterval","isFetchIntervalNeeded","historyMaxId","canWrite","renderMessagesQueue","isAvatarNeeded","additionalCallback","processResult","newBubble","originalPromise","renderMessage","albumMids","reactionsMessage","albumMessages","albumMustBeRenderedFull","our","isOurMessage","contentWrapper","isInUnread","ignoreAction","chat_id","is_single","messageMessage","needToSetHTML","bigEmojis","emojiEntities","strLength","curr","richText","canHaveTail","isStandaloneMedia","haveRTLChar","topicNameButtonContainer","replyMarkup","reply_markup","replyMarkupRows","containerDiv","rowDiv","buttonEl","botId","viaBotId","same_peer","checkSwitchReturn","switchInlineQuery","button_id","handleUrlAuth","buttonId","haveButtons","column","callbackButtonClick","callbackAnswer","messageWithReplies","getMessageWithCommentReplies","withReplies","isOutMessage","nameContainer","canHideNameIfMedia","isMessageEmpty","viewButton","processingWebPage","telegram_channel","telegram_megagroup","telegram_bot","makeViewButton","quote","previewResizer","preview","quoteTextDiv","strong","titleDiv","textDiv","isSquare","isEmoji","nopremium","newNameContainer","richTextFragment","getMidsByMid","wrapGroupedDocuments","lastContainer","addClassName","contact","contactDetails","contactNameDiv","fullName","contactNumberDiv","phone_number","wrapPoll","extendedMedia","isAlreadyPaid","isNotPaid","innerMedia","wrappedPrice","priceEl","video_duration","videoTime","dc_id","file_reference","before","needName","titleVia","mustHaveName","isHidden","isForward","goto","generateTail","documentContainer","documentMessageDiv","viewportSlice","deleteViewportSlice","historyResult","needReflowScroll","setLoadedPromises","firstSlice","lastSlice","both","processLocalMessageRender","ackedResult","getScheduledMessages","animateAsLadder","additionMsgIds","isAdditionRender","targetMid","sortedMids","topIds","middleIds","bottomIds","setBubbles","lastMsDelay","elementsToAnimate","transitionDelay","topRes","middleRes","bottomRes","delays","renderEmptyPlaceholder","listElements","getRestrictionReasonText","getGreetingSticker","channel_post","start_param","chat_invite","chat_invite_hash","JOIN_CHAT","invite","processInternalLink","creator","isWaitingForAnimation","noTransition","setOn","generateLocalMessageId","addOffset","generateLocalFirstMessage","service","saveMessages","ignoreScrollSaving","invisible","checkPlaceholders","toggleSponsoredMessage","renderBotPlaceholder","checkIfEmptyPlaceholderNeeded","getSponsoredMessage","sponsoredMessages","messagePromise","_log","getProfile","processPromise","bot_info","botInfo","description_document","description_photo","isBackLimit","resultPromise","isFirstMessageRender","serviceStartMessageId","getThreadServiceMessageId","sup","_promise","mustBeCount","PopupPinMessage","unpin","canUnpin","canPinMessage","oneSide","unpinAllMessages","hidePinnedMessages","updatePinnedMessage","buttonText","getPinnedMessagesCount","pinButtonText","isSelectionEmpty","selectionRange","START_TO_END","preloadAnimatedEmojiSticker","PopupReportMessagesConfirm","reportMessages","STICKER_EMOJI","PopupReportMessages","preloadStickerPromise","PopupSponsored","PopupReactedList","canViewReadParticipants","canViewMessageReadParticipants","loaders","hasAllReactions","createFakeReaction","hasReadParticipants","readUserIds","getMessageReadParticipants","chatlist","skipReadParticipants","skipReactionsList","getMessageReactionsListAndReadParticipants","combined","getReactionCached","allReactionsSticker","REACTIONS_CLASS_NAME","REACTION_CLASS_NAME","CAN_USE_TRANSFORM","ChatReactionsMenu","reactionsMap","players","onScrollProcessItem","reactionDiv","appear","widthContainer","reactionsContainer","reactionsScrollable","renderReaction","setVisible","canUseAnimations","scaleContainer","appearWrapper","appear_animation","selectLoadPromise","selectPlayer","REACTION_SIZE","ChatContextMenu","onContextMenu","isTextSelected","isAnchorTarget","isUsernameTarget","selectedMid","isOverBubble","isTargetAGroupedItem","viewerPeerId","canOpenReactedList","linkToMessage","getUrlToMessage","selectedMessagesText","getSelectedMessagesText","menuPadding","reactionsMenu","reactionsMenuPosition","isReactionsMenuVisible","offsetSize","nextVisiblePart","MIN_NEXT_VISIBLE_PART","minSize","onSendScheduledClick","onReplyClick","onFaveStickerClick","unfave","faveSticker","onEditClick","getMessageWithText","initMessageEditing","onCopyClick","onCopyAnchorLinkClick","onCopyLinkClick","onUnpinClick","onRetractVote","onStopPoll","stopPoll","setButtons","hasAttribute","notDirect","scheduleSending","editMessage","scheduleDate","canEditMessage","getMessageFromStorage","canSaveMessageMedia","isGoodType","hasTarget","localName","emojiInputsPromise","getUniqueCustomEmojisFromMessage","filterUnique","viewsButton","isViewingReactions","participantsCount","reactedLength","i18nElem","fakeText","AVATAR_SIZE","MAX_AVATARS","PADDING_PER_AVATAR","reactionsCount","fakeElem","readParticipants","totalSize","emojisButton","setPadding","inputsPromise","getCachedCustomEmojiDocuments","getCustomEmojiDocuments","threadMessage","SendMenu","sendMenuButtons","onSilentClick","onScheduleClick","sendMenu","openSide","onContextElement","setPeerId","PopupCreatePoll","onSubmitClick","send","radioLabel","isEmpty","questions","appendMoreField","correctAnswers","optionInputFields","questionInputField","sendSilent","settingsCaption","anonymousCheckboxField","multipleCheckboxField","quizCheckboxField","quizSolutionField","quizElements","quizSolutionCaption","quizHr","quizSolutionContainer","quizSolutionSubtitle","getFilledAnswers","quizSolution","quizSolutionEntities","inputMediaPoll","getInputMediaPoll","sendOther","getMessageSendingParams","helperType","clearHelper","questionField","createPosterFromMedia","getGifDuration","arrayBuffer","USELESS_REG_EXP","InputFieldAnimated","updateInnerHTML","onFakeInput","inputFake","setHeight","currentHeight","onChangeHeight","currentPopup","getCurrentNewMediaPopup","PopupNewMedia","willAttachType","ignoreInputValue","messageInputField","attachFile","willAttach","shouldCompress","itemDiv","defineNotNumerableProperties","attachMedia","attachDocument","sendFileDetails","captionMaxLength","captionLengthMax","changeType","hasAnyMedia","changeGroup","canGroupSomething","changeSpoilers","canToggleSpoilers","isMedia","wasInputValue","attachFiles","applyMediaSpoiler","removeMediaSpoiler","noAnimation","widthStr","heightStr","containerWidthStr","containerHeightStr","strippedBytes","appendDrops","mediaCount","mediaWithSpoilers","addFiles","toPush","_file","lastModified","sendingParams","sendFileParams","sendText","scaledBlob","sendAlbum","replyToMsgId","modifyMimeTypeForTelegram","scaleImageForTelegram","convertWebp","PHOTO_SIDE_LIMIT","objectURL","audioDecodedByteCount","webkitAudioDecodedByteCount","noSound","onseeked","onerror","createPosterFromVideo","scaled","isPhoto","isAudio","onRender","foundPhotos","foundVideos","foundFiles","appendMediaToContainer","firstType","oldSendFileDetails","albumContainer","oldParams","HANDLE_EVENT","ACTIVE_CLASS_NAME","AXIS_Y_KEYS","AXIS_X_KEYS","attachListNavigation","waitForKey","waitForKeySet","keyNames","getCurrentTarget","setCurrentTarget","hadTarget","getNextTargetX","currentTarget","isNext","nextTarget","handleArrowKey","endProperty","currentRect","targetRect","getNextTargetY","fireSelect","canContinue","attached","resetTarget","_onKeyDown","AutocompleteHelper","onVisible","listType","attachNavigation","controller","addHelper","toggleListNavigation","fromController","skipAnimation","hideOtherHelpers","StickersHelper","onChangeScreen","checkEmoticon","getStickersByEmoticon","getMinDate","getMaxDate","PopupSchedule","canSendWhenOnline","btnSendWhenOnline","EmojiHelper","chatInput","onEmojiSelected","checkQuery","firstChar","getBothEmojiKeywords","searchEmojis","AutocompletePeerHelper","doNotShow","listElement","BASE","BASE_CLASS_LIST_ELEMENT","processPeerFullForCommands","botInfos","commands","command","indexObject","CommandsHelper","getReadyToSend","sendMessage","AutocompleteHelperController","preserveHelper","MentionsHelper","insertAtCaret","topMsgId","trimmed","getMentions","ReplyKeyboard","onBodyTouchStart","btnHover","checkAvailability","checkForceReply","touchListener","sendContact","getReplyMarkup","getHistoryStorageTransferable","InlineHelper","queryId","queryAndResultIds","generateQId","resultId","sendInlineResult","_checkQuery","botResults","query_id","gifsMasonry","isGallery","gallery","noCommands","dcId","switch_pm","btnSwitchToPM","switchToPM","ChatBotCommands","setUserId","modifyAckedResult","acked","modifyAckedPromise","ChatSendAs","sendAsButtons","previousAvatar","onSendAsMenuToggle","updateButtons","sendAsPeerId","changeSendAsPeerId","executeButtonsUpdate","sendAsPeerIds","saveDefaultSendAs","updateAvatar","getDefaultSendAs","getChannelFull","channelFull","default_send_as","updateManual","updatingPromise","wasSkippingAnimation","auto","getSendAs","sendAsPeers","sendAsPeer","premium_required","addedListener","hasMarkupInSelection","onlyFull","nodes","commonAncestor","SHOW_ELEMENT","resultBoolean","POSTING_MEDIA_NOT_ALLOWED","ChatInput","lastUrl","lastTimeType","replyElements","willSendWebPage","recordCanceled","recordStartTime","lockRedo","canRedoFromHTML","undoHistory","executedHistory","canUndoFromHTML","onCancelRecordClick","recorder","opusDecodeController","onEmoticonsOpen","toggleClass","btnToggleEmoticons","onEmoticonsClose","isUserOnlineVisible","openScheduled","prepareDocumentExecute","undoRedo","needHTML","sameHTMLTimes","currentHTML","handleMarkdownShortcut","formatKeys","markupTooltip","applyMarkdown","showLinkEditor","onMessageInput","markdownEntities","parseMarkdown","urlEntities","getWebPagePromise","appWebPagesManager","getWebPage","setTopInfo","noWebPage","onHelperCancel","helperFunc","botCommands","resetCurrentFontFormatting","updateBotCommandsToggle","editMsgId","saveDraftDebounced","checkAutocomplete","updateSendBtn","onBtnSendClick","forwarding","restricted","voice_messages_forbidden","releaseMediaPlayback","setRecording","showDiscardPopup","btnCancelRecord","recordingOverlayListener","recordingNavigationItem","sourceNode","analyser","createAnalyser","connect","fftSize","frequencyData","frequencyBinCount","getByteFrequencyData","recordRippleEl","ms","recordTimeEl","needReturn","getCurrentInputAsDraft","no_webpage","originalDraft","canPassEntitiesTypes","draftsAreEqual","onHelperClick","forwardElements","rowsWrapperWrapper","rowsWrapper","fakeRowsWrapper","fakeSelectionWrapper","goDownBtn","controlContainer","iconBtn","cancelBtn","onHideAuthorClick","isChangingAuthor","onHideCaptionClick","forwardButtons","canToggleHideAuthor","hideSender","showCaption","hideCaption","changePeer","changeForwardRecipient","forwardBtnMenu","forwardWasDroppingAuthor","replyTitle","forwardHover","modifyArgs","newMessageWrapper","replyInTopicOverlay","inputMessageContainer","goDownUnreadBadge","goMentionBtn","goMentionUnreadBadge","goToNextMention","btnScheduled","btnToggleReplyMarkup","replyKeyboard","botCommandsToggle","scaler","botCommandsIcon","attachMenuButtons","fileInput","attachMenu","attachMenuBots","appAttachMenuBotsManager","getAttachMenuBots","attachMenuBotsButtons","attachMenuBot","getAttachMenuBotIcon","requestWebView","webViewResultUrl","SANDBOX_ATTRIBUTES","verifyMap","attachMenuPeerTypeSameBotPM","attachMenuPeerTypeBotPM","attachMenuPeerTypePM","attachMenuPeerTypeChat","attachMenuPeerTypeBroadcast","peer_types","multiple","autocompleteHelperController","stickersHelper","emojiHelper","commandsHelper","mentionsHelper","inlineHelper","btnSendContainer","btnSend","attachMessageInputField","previousQuery","saveDraft","encoderSampleRate","monitorGain","numberOfChannels","recordingGain","reuseWorker","onstop","ondataavailable","typedArray","dataBlob","sendFile","isVoiceMessage","botStartBtn","toggleBotStartBtnDisability","startBot","pinnedControlBtn","originalChat","pinnedMessageContainer","_center","neededFakeContainer","fakeWrapperTo","oldFakeWrapperTo","fakeSelectionRect","fakeRowsRect","scale","initTranslateX","getNeededFakeContainer","isReplyInTopicOverlayNeeded","hasMentions","ignoreEmptyValue","syncDraft","helperToo","clearInput","fromUpdate","getDraft","wrappedDraft","myEntities","apiEntities","wrapDraft","currentDraft","createSendAs","firstChange","sendAs","updateOffset","getPlaceholderKey","updateMessageInputPlaceholder","previousSendAs","ackedPeerFull","ackedScheduledMids","setSendAsCallback","filteredAttachMenuButtons","filterAttachMenuButtons","placeholderKey","hasBotCommands","updateBotCommands","updateMessageInput","haveSomethingInControl","isAnonymousSending","oldInputField","attachMessageInputListeners","fixSafariStickyInputFocusing","APP_TABS","CHAT","readAllHistory","commandsMap","canCombine","hasMarkup","executed","resetCurrentFormatting","setActiveMarkupButton","insertText","insertEntity","isHelper","fullValue","AUTO_COMPLETE_REG_EXP","matchIndex","foundHelper","checkInlineAutocomplete","setPreloaderShow","btnPreloader","inlineMatch","bot_inline_placeholder","inlinePlaceholder","helperWaitingForward","canSetDraft","fireEvent","clearValue","fixSafariStickyInput","getValueAndEntities","clearReply","unicode","pushRecentEmoji","dropAuthor","dropCaptions","isDroppingCaptions","sendMessageWithDocument","hideCaptionCheckboxField","replyFragment","initMessagesForward","fromPeerIdsMids","fromPeerIds","smth","messagesWithCaptionsLength","peerTitles","titleKey","senderTitles","firstMessage","newReply","intl","peerTitleEl","_message","setReplyToMsgId","callerFunc","replyParent","oldReply","haveReply","CLASSNAME_BASE","PinnedContainer","floating","divAndCaption","wrapperUtils","attachOnCloseEvent","needClose","setFloating","setUtilsWidth","BAR_HEIGHTS","ChatAudio","onPlaybackParams","fasterEl","repeatEl","toggleEl","onStop","onMediaPlay","isMusic","prevEl","nextEl","attachClick","volumeProgressLineContainer","tunnel","progressWrapper","playingDetails","PinnedMessageBorder","drawRect","getClipPath","barHeight","GAP","clipPath","getBarHeight","ONE","TWO","THREE","FOUR","MORE","getMarkHeight","markHeight","getMarkTranslateY","getTrackTranslateY","trackHeight","getTrackHeight","clipPathId","markTranslateY","trackTranslateY","mark","AnimatedSuper","getRow","clearRow","clearRows","currentIndex","DURATION","setNewRow","reflow","previousIndex","fromTop","ignorePrevious","previousRow","AnimatedCounter","previousNumber","getDecimal","animatedSuper","decimal","hideLeft","previousDecimalNumber","EMPTY_INDEX","setCount","previousByDecimal","decimalNumber","ChatPinnedMessage","pinnedMaxMid","pinnedMid","pinnedIndex","wasPinnedIndex","wasPinnedMediaIndex","waitForScrollBottom","loadedBottom","loadedTop","scrollDownListenerSetter","getCurrentIndexPromise","isStatic","dAC","pinnedMessageBorder","animatedSubtitle","animatedMedia","animatedCounter","btnOpen","openPinned","setPinnedMessage","_setPinnedMessage","unsetScrollDownListener","testMid","isNeededMore","getCurrentIndex","LOAD_OFFSET","correctAfter","gotRest","getPinnedMessage","backLimited","offset_id_offset","setScrollDownListener","isDown","handleScrollSideEvent","refreshPosition","handleFollowingPinnedMessage","followPinnedMessage","isLast","writeTo","writeMediaTo","ChatTopbar","verifyButtons","isMenuOpen","btnMore","buttonsToVerify","menuButtons","verifyVideoChatButton","currentGroupCall","groupCall","verifyCallButton","getCachedFullUser","phone_calls_available","video_calls_available","onJoinGroupCallClick","joinGroupCall","resize","setUtilsRAF","chatUtils","chatAudio","setPeerStatusManual","btnBack","btnBackBadge","chatInfoContainer","chatInfo","person","avatarElement","deleteButtonText","btnJoin","btnPinned","btnCall","btnGroupCall","btnMute","btnSearch","pushButtonToVerify","onBtnBackClick","isFirstChat","constructUtils","linked_chat_id","onCallClick","chatContextMenuHintWasShown","contactPeerId","getAttachMenuBot","has_settings","constructAvatar","joinChannel","unreadUnmutedPeerIds","setMutedState","isTopMessage","hiddenPinnedMessages","byCurrent","setTitleCallback","setStatusCallback","setTitleManual","canHaveSomeButtons","wasAlreadyUsed","newPinnedMessage","AppPrivateSearchTab","appSearch","btnPickDate","ChatSearch","selectedIndex","onResultsClick","selectResult","onFooterClick","onUpClick","onDownClick","foundCountEl","upBtn","downBtn","footer","dateBtn","renderedCount","ChatBackgroundPatternRenderer","canvases","INSTANCES","renderToCanvas","fillCanvas","crossOrigin","imageBitmap","objectUrl","imageWidth","imageHeight","patternHeight","mask","centerY","topY","endY","bottomY","setCanvasDimensions","originalHeight","Chat","backgroundEl","backgroundTempId","sharedMediaTabs","setBackground","patternRenderer","gradientCanvas","previousGradientRenderer","previousPatternRenderer","previousPatternCanvas","isDarkPattern","getInstance","_gradientRenderer","setOpacityTo","opacityMax","setBackgroundPromise","setType","freezeObservers","beforeDestroy","cleanupBackground","destroySharedMediaTab","searchTab","_isAnyGroup","setAutoDownloadMedia","getForumTopicOrReload","isSamePeer","bubblesSetPeerPromise","photoSizeMax","videoSizeMax","fileSizeMax","photo_size_max","video_size_max","getAutoDownloadSettingsByPeerId","callbacksPromise","ignoreThreadId","historyStorageTransferable","historySerialized","MarkupTooltip","waitingForMouseUp","mouseUpCounter","onMouseUpSingle","resetSelection","tools1","tools2","cancelClosening","linkBackButton","linkInput","applyLink","isLinkValid","setTooltipPosition","linkApplyButton","applyDiv","delimiter1","delimiter2","delimiter3","matchUrlProtocol","getActiveMarkupButton","currentMarkups","markup","activeButtons","isLinkToggle","bodyRect","selectionRect","inputRect","selectionTop","sizesRect","isFirstShow","setMouseUpEvent","handleSelection","ChatDragAndDrop","dropIcon","onDragOver","onDragLeave","onDrop","outlineWrapper","dropHeader","dropSubtitle","headerArgs","setPath","sizeX","sizeY","disableTransition","LineBlobDrawable","maxRadius","minRadius","N","radiusNext","speed","generateBlob","radDif","generateNextBlob","amplitude","speedScale","paint","pinnedTop","progressToPinned","r1","progressNext","x1","x2","cx","y1","y2","bezierCurveTo","WeavingState","stateId","createGradient","shader","getGradientFromType","x0","y0","dt","TopbarWeave","handleDevicePixelRatioChanged","setSize","forceUpdate","resizeHandler","resizeCanvas","invokeDraw","handleFocus","focused","handleBlur","lbd","lbd1","lbd2","currentState","previousState","progressToState","lastUpdateTime","animateToAmplitude","animateAmplitudeDiff","amplitude2","animateAmplitudeDiff2","top1","top2","paint1","setCurrentState","states","componentDidMount","matchMedia","setAmplitude","componentWillUnmount","setCanvasSize","RLottieIconItemPart","playPart","RLottieIconItem","createPart","initFrame","skipFirstFrameRendering","inverseColor","onLoadForColor","onLoadForPart","getPart","RLottieIcon","startFrame","endFrame","frameCount","SuperRLottieIcon","partState","colorState","getColor","partCallback","changedPartState","changedColorState","setPartState","setColorState","prevState","renderIfPaused","invoke","GroupCallMicrophoneIcon","GROUP_CALL_MICROPHONE_BUTTON_STATE","partName","HAND","MUTED","UNMUTED","GroupCallParticipantMutedIcon","colored","GROUP_CALL_PARTICIPANT_MUTED_STATE","colorStr","MUTED_FOR_ME","MUTED_BY_ADMIN","propertyValue","getColorByMutedState","generateEqualParts","clearMutedStateModifier","GroupCallParticipantStatusElement","element2","actionClassName","GroupCallParticipantsList","getParticipantByPeerId","onElementDestroy","getGroupCallParticipantMutedState","mutedIcon","callVideoCanvasBlur","GroupCallParticipantVideoElement","setPinned","setParticipant","groupCallParticipantMutedIcon","groupCallParticipantStatus","updateParticipant","GroupCallParticipantsVideoElement","participantsElements","groupCallId","setElementDisplay","pinnedSource","pinSource","unpinAll","setInstance","shouldDisplayElement","displayPinned","shouldDisplay","hasAnyVideo","participantElements","participantVideo","getVideoElementFromParticipantByType","_onLengthChange","GroupCallParticipantContextMenu","onOpenProfileClick","PopupGroupCall","targetPeerId","toggleParticipantMuted","editParticipant","canManageCall","can_self_unmute","muted_by_you","kickFromChat","getContainer","GroupCallParticipantsElement","groupCallParticipantsVideo","appGroupCallsManager","getGroupCallParticipants","GroupCallDescriptionElement","descriptionIntl","GroupCallTitleElement","makeButton","_className","buttonDiv","isConfirm","resizeHandlerClassName","MovableElement","fixDimensions","fixPosition","addResizeHandlers","setSwipeHandler","destroyElements","handlers","startTop","startLeft","startWidth","startHeight","resizingSide","isEnlarging","resizeDiff","maxPossible","setPositionToCenter","MovablePanel","toggleMovable","movable","movableOptions","toggleClassName","raise_hand_rating","onFullScreenClick","onToggleControls","buttonsContainer","onVideoClick","btnVideo","toggleVideoSharing","onScreenClick","btnScreen","toggleScreenSharing","toggleMuted","changeRaiseHand","onLeaveClick","hangUp","discard","toggleBigLayout","btnFullScreen","btnExitFullScreen","wasFullScreen","movablePanel","videosCount","wasBig","btnInvite","btnShowColumn","toggleRightColumn","btnFullScreen2","headerInfo","newHeader","newHeaderInfo","newHeaderTitle","btnHideColumn","videosScrollable","groupCallTitle","groupCallDescription","groupCallBodyHeaderDescription","constructButtons","groupCallParticipants","updateInstance","setHasPinned","groupCallMicrophoneIcon","_makeButton","microphoneIcon","btnLeave","setDescription","microphoneButtonState","getGroupCallMicrophoneButtonState","micState","CallDescriptionElement","connectionState","connectedAt","GroupCallMicrophoneIconMini","INIT_STATE","PopupCall","resizeVideoContainers","videoContainers","interlocutorUserId","emojisSubtitle","partyStates","partyMutedState","stateText","constructFirstButtons","constructSecondButtons","wasTryingToJoin","movableElement","controlsHover","getCallInstance","firstButtonsRow","muteI18nElement","secondButtonsRow","declineI18nElement","btnDecline","btnAccept","acceptCall","createVideoContainer","isPendingIncoming","isSharingVideo","isSharingScreen","outputState","getMediaState","oldContainers","mediaState","getVideoElement","hasFrame","hasPromise","videoState","screencastState","videoContainer","output","getEmojisFingerprint","popupWidth","MAX_WIDTH_PX","MAX_HEIGHT_PX","MAX_SIZE","biggestSideSize","widthRatio","heightRatio","TopbarCall","onState","amplitudes","weave","clearCurrentInstance","currentDescription","instanceListenerSetter","isChangingInstance","callDescription","convertCallStateToGroupState","groupCallMicrophoneIconMini","throttledMuteClick","weaveContainer","uiNotificationsManager","notificationsShown","notificationIndex","notificationsCount","soundsPlayed","vibrateSupport","faviconElements","titleBackup","titleChanged","stopped","pushInited","updateLocalSettings","updSettings","nodesktop","novibrate","nopreview","nopush","needPush","webPushApiManager","registeredDevice","nosound","requestPermission","Notification","mozVibrate","webkitVibrate","setAppBadge","notificationsUiSupport","notifySoundEl","topMessagesDeferred","toggleToggler","peerString","soundReset","tokenData","unregisterDevice","registerDevice","notificationData","custom","hasChat","hasUser","buildNotification","fwdCount","peerReaction","peerTypeNotifySettings","notification","getPeerString","notificationMessage","wrappedMessage","noIncrement","peerTitleOptions","notificationFromPeerId","peerPhoto","loadAvatar","avatarCanvas","avatarContext","avatarGradients","colorTop","colorBottom","abbreviation","getAbbreviation","textBaseline","textAlign","pushData","loc_key","loc_args","resetTitle","isBlink","setFavicon","titleInterval","prevFavicon","testSound","permission","notificationOptions","registration","serviceWorker","showNotification","getNotifications","appRuntimeManager","onclose","getLocalSettings","closeNotification","nextSoundAt","prevSoundVolume","filename","token_type","tokenType","tokenValue","other_uids","app_sandbox","secret","getFilesFromEvent","onlyTypes","scanFiles","isDirectory","directoryReader","createReader","readEntries","itemFile","getAsFile","DataTransferItem","DragEvent","dataTransfer","webkitGetAsEntry","addAnchorListener","protocol","noCancelEvent","pathnameParams","uriParams","u","host","noPathnameParams","noUriParams","parseUriParams","AppImManager","columnEl","offline","updateStatusInterval","cacheStorage","saveState","onHashChangeUnsafe","tgaddr","openUrl","postId","openUsername","userName","setSettings","messagesTextSize","forceRenderAfterSize","chatsSelectTabDebounced","toggleChatGradientAnimation","onDocumentPaste","attachType","newMediaPopup","_types","canDrag","backgroundPromises","CHATLIST","updateStatus","emojiAnimationContainer","appendEmojiAnimationContainer","createNewChat","chatsSelectTab","getPremium","compareVersion","deleteFilesIterative","applyCurrentTheme","resizeInstances","saveChatPosition","choosing","setChoosingStickerTyping","typing","onInstanceDeactivated","isUpdated","receiptMessage","onSpoilerClick","spoilerTimeout","stateStorage","topbarCall","discardCurrentCall","currentCall","setAuthorized","telegramMeWebManager","hashtag","STICKER_SET","EMOJI_SET","makeLink","INVOICE","VOICE_CHAT","USER_PHONE_NUMBER","thread","PRIVATE_POST","channel","comment","getStackFromElement","MESSAGE","attachKeydownListener","handleAutologinDomains","checkForShare","share","foundMedia","openWindow","onUrlAuthResult","urlAuthResult","botPeerTitle","logInCheckbox","allowMessagesCheckbox","request_write_access","confirmationPromise","logInChecked","allowMessagesChecked","acceptUrlAuth","onUrlAuthResultAccepted","requestUrlAuth","_appConfig","onAnchorClick","url_auth_domains","autologin_token","autologin_domains","originalUrl","searchParams","possibleBubble","timeoutOperation","requests","request","isBad","activatingChat","screen","IGNORE_KEYS","isSelectionCollapsed","getFirstMessageToEdit","getNextDialog","newEvent","KeyboardEvent","commentId","resolveChannel","op","checkChatInvite","saveApiChat","resolvePhone","getInputInvoiceBySlug","wrappedUrl","openComment","openPremiumBot","premium_bot_username","generateThreadServiceStartMessage","phone_calls_private","ignoreGroupCall","ignoreCall","discardGroupCallConfirmation","discardCallConfirmation","title1","title2","isClosing","getGroupCallFull","createGroupCall","setCurrentBackground","broadcastEvent","getBackground","getFile","lastBackgroundUrl","chatBubbles","chatPositions","backgroundUrl","attachDragAndDropListeners","drops","mediaDrops","isFiles","_dropsContainer","mediaDropsContainer","dropsContainer","_drops","PROFILE","onImTabChange","updateMyOnlineStatus","spliceChats","fromIndex","chatFrom","chatTo","chatIndex","existingIndex","oldChat","getTypingElement","eye","getPeerTyping","getPeerTypings","langPackKeys","multi","mapa","typingElement","descriptionElement","getChatStatus","typingEl","onlines","getOnlines","getPeerStatus","typingContainer","options1","options2","DialogColorsFg","DialogColors","DialogColorsMap","pic","peerParams","useBytes","bestPhotoSize","CallConnectionInstanceBase","connection","sources","createPeerConnection","config","RTCPeerConnection","signalingState","iceConnectionState","createDataChannel","dataChannel","createDescription","appendStreamToConference","streamManager","appendToConference","closeConnection","closeConnectionAndStream","stopStream","negotiate","negotiating","negotiateInternal","sendDataChannelData","parseSignalingData","sdp","parseMediaSectionInfo","fingerprint","ufrag","pwd","convertNumber","isSending","codec","ssrc","sourceGroups","ssrcGroups","sourceGroup","semantics","ssrcs","rtpExtensions","payloadTypesMap","getPayloadType","payloadType","clockrate","feedbackTypes","subtype","parameters","payloadTypes","CallConnectionInstance","localDescription","remoteDescription","descriptionInit","offerReceived","createAnswer","setLocalDescription","offer","createOffer","offerSent","initialSetup","sendCallSignalingData","crypto","subtle","P2PEncryptor","p2pKey","seqMap","concatSHA256","bufferConcats","encryptPrepared","msgKeyLarge","subarray","msgKey","aesKeyIv","prepareAesKeyIv","aesProcessCtr","encryptRawPacket","seq","ArrayBuffer","setUint32","sha256a","sha256b","iv","encryptedData","dataSize","encrypt","cryptoKey","constTimeIsDifferent","msgKeyEquals","decryptRawPacket","encryptedDataSize","decryptionBuffer","getUint32","ChromeP2PSdpBuilder","fingerprints","stringBuilder","streamName","addExtmap","addPayloadTypes","addSsrc","finalize","FirefoxP2PSdpBuilder","SafariP2PSdpBuilder","isFirefox","isSafari","extmap","j","fmtp","getOwnPropertyNames","pName","ssrcGroup","P2PSdpBuilder","sdpString","sdpMLineIndex","sdpMid","foundation","component","priority","relAddress","generation","tcpType","networkId","networkCost","candidate","generateOffer","generateAnswer","CallInstance","udp_p2p","udp_reflector","min_layer","max_layer","library_versions","createdAt","decryptQueue","candidates","canCreateConferenceEntry","setMediaState","sendMediaState","mediaStates","_sendMediaState","_connectionState","connectionInstance","sortIndex","findEntry","recvEntry","startScreenSharingInternal","wasStartingScreen","wasStartingVideo","requestScreen","stopVideoSharing","startVideoSharingInternal","requestInputSource","track","inputStream","getVideoTracks","stopTrack","isSharingVideoType","audioTrack","getAudioTracks","setHangUpTimeout","clearHangUpTimeout","hangUpTimeout","setPhoneCall","phoneCall","canAccept","overrideConnectionState","g_a_hash","appCallsManager","generateDh","dh","g_b","g_a","g_b_hash","getCallInput","phonePhoneCall","savePhonePhoneCall","joinCall","encryptionKey","configuration","iceServers","connections","ipv6","port","urls","turn","stun","credential","iceTransportPolicy","p2p_allowed","getRtcConfiguration","sendIceCandidate","onTrack","encryptor","decryptor","processDecryptQueue","createDataChannelEntry","dataChannelEntry","createEntry","sendEntry","negotiated","applyDataChannelData","TextEncoder","encode","iceCandidate","parsed","p2pParseCandidate","confirmCall","key_fingerprint","computeKey","emojisFingerprint","getEmojisFingerprintPromise","codePoints","unlockStreamManager","doTheMagic","getTransceivers","transceiver","getEntryByMid","bundle","sdpDescription","generateSdp","isAnswer","setRemoteDescription","onInputStream","stream","videoTrack","onMutedChange","requestAudioSource","setMuted","discardReason","discardedByOtherParty","hasVideo","discardCall","performCodec","_codec","setDataToDescription","setData","transport","screencast","filterNotVP8","vp8PayloadType","rtxIdx","apt","applyCallSignalingData","performSsrcGroups","getEntryBySource","sendRecvEntry","findFreeSendRecvEntry","setEntrySource","tryToReleaseCandidates","generateCandidate","RTCIceCandidate","addIceCandidate","decryptedData","TextDecoder","decode","signalingData","onUpdatePhoneCallSignalingData","getStreamCached","_cache","isScreen","constraints","getScreenStream","getStream","CallInstanceBase","fixSafariAudio","isSharingAudio","hasInputTrackKind","isAudioGood","isVideoGood","getAudioConstraints","getVideoConstraints","getScreenConstraints","endpoint","tryAddTrack","streams","saveInputVideoStream","isOutput","elementEndpoint","addTrack","useStream","outputStream","srcObject","sinkId","outputDeviceId","setSinkId","getTracks","addStream","CALL_STATE","audioAsset","CALL_REQUEST_TIMEOUT","CallsController","sortedInstances","createCallInstance","admin_id","g_a_or_b","bytesCmp","callId","getCallByUserId","hasConnected","hasCurrent","startCallInternal","fullInfo","participant_id","requestCall","GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX","GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS","GroupCallConnectionInstance","negotiateThrottled","bundlePolicy","rtcpMuxPolicy","iceCandidatePoolSize","maybeUpdateRemoteVideoConstraints","updateConstraintsInterval","invokeJoinGroupCall","localSdp","mainChannels","processedChannels","sectionInfo","payload","processMediaSection","audioChannel","videoChannel","useChannel","setEntryPeerId","performExtmap","filterServerCodecs","isNewConnection","originalOffer","iceRestart","hasMunged","skipAddingMulticast","mediaLine","mediaLineParts","localMLine","codecIds","newData","setPort","setSource","newSdp","addSsrcEntry","newChannel","mungedSdp","fixLocalOffer","entriesToDelete","shouldBeSkipped","answerDescription","deleteEntry","iceGatheringState","updateConstraints","sender","setParameters","getParameters","degradationPreference","colibriClass","defaultConstraints","onStageEndpoints","addInputVideoStream","GroupCallInstance","isSpeakingMap","pinnedSources","participantsSsrcs","hadAutoPinnedSources","dispatchPinnedThrottled","getCachedParticipants","presentation","unpinSource","changeUserMuted","source_groups","createConnectionInstance","raise","raiseHand","stopScreenSharing","startScreenSharing","startScreenSharingPromise","saveApiParticipant","leaveGroupCallPresentation","videoPaused","videoStopped","startVideoSharing","startVideoSharingPromise","rejoin","isDiscarded","isUpdatingMeInCurrentCall","onParticipantUpdate","doNotDispatchParticipantUpdate","hasLeft","oldSsrcs","modifiedTypes","oldSsrc","oldSource","oldEntry","originalDirection","setEndpoint","createTransceiver","GROUP_CALL_STATE","makeSsrcsFromParticipant","makeSsrcFromParticipant","audio_source","generateSelfVideo","audioSource","GroupCallsController","setCurrentGroupCall","startConnectingSound","stopConnectingSound","joinVideo","MediaStream","createMainStreamManager","joinGroupCallInternal","handleUpdateGroupCallParticipants","updatingSdp","channelCount","constraint","mediaDevices","getSupportedConstraints","constraintSupported","skipAudio","frameRate","screenStream","getDisplayMedia","contentHint","getUserMedia","clientInfo","lookupAttributeKeys","telegramSourceGroups","sdpLines","rest","parseSourceGroups","raw","ConferenceEntry","addTransceiver","generateSsrc","LocalConferenceDescription","sessionId","maxSeenId","entriesByMid","entriesBySource","entriesByPeerId","getEntriesByPeerId","conference","SDP","mediaSections","splitStringByLimitWithRest","UniqueNumberGenerator","generate","maxTries","_try","SDPAttributeSplitted","SDPMediaLineParts","SDPLine","SDPAttributeInner","missed","exists","nestedMap","makeAttributes","innerParts","SDPAttributes","fillAttributes","attributesMap","linesArray","SDPMediaSection","isReceiving","resultShouldBeArray","SDPSessionSection","parseSdp","createSection","sessionSection","lineStr","isIncorrectSdpLine","parseSdpLine","addSimulcast","generator","originalSsrcs","ssrcs2","ssrcsStrLines","ssrc2","WEBRTC_MEDIA_PORT","fixMediaLineType","getConnectionTypeForMediaType","generateMediaFirstLine","payloadIds","connectionType","SDPBuilder","addCandidate","performCandidate","addHeader","sId","bundleMids","addTransport","skipCandidates","addSource","addMsid","isApplication","isInactive","hdrexts","hdrext","fbs","fb","addConference","AudioStreamAnalyser","streamSource","createMediaStreamSource","gain","createGain","minDecibels","maxDecibels","smoothingTimeConstant","StreamManager","getAmplitude","streamAnalyser","analyse","ANALYSER_LISTENER","AudioContext","webkitAudioContext","getSource","itemSource","removeTrack","finalizeAddingTrack","changeTimer","substring","replaceInputAudio","oldTrack","timer","transceiverInit","tracks","mediaTrackType","trackIdx","replaceTrack","StringFromLineBuilder","newLine","addJoined","toTelegramSource","fromTelegramSource","rms","EMOJI_REG_EXP","onlyFirst","firstEmojiMatch","lastEmojiMatch","E","setBlankToAnchor","messageEntityTextUrl","messageEntityMentionName","isDraft","EMOJI_VERSIONS_SUPPORTED","inlineEl","newEmojiWidth","legacyEmojiWidth","isEmojiSupported","globalLazyLoadQueue","CustomEmojiElement","syncedPlayer","pausedElements","playersSynced","createCustomFiller","lastPausedVideo","middlewares","CustomEmojiRendererElement","clearedElements","WeakSet","isCanvasClean","emojiRenderers","getOffsets","offsetsMap","offsetParent","elementsArr","placeholders","isDimensionsSet","syncedPlayersFrames","isImageData","ImageData","frameWidth","frameHeight","lastChildWas","checkForAnyFrame","forceRenderAfter","renderEmojis","addCustomEmojis","addElements","usingOwnQueue","wrap","_loadPromises","newElements","isLottie","willHaveSyncedPlayer","newElementsArray","CUSTOM_EMOJI_INSTANT_PLAY","addition","_p","overrideRender","setRenderInterval","syncedPlayers","clearRenderInterval","missing","cachedPromises","uncachedPromisesPromise","loadFromPromises","uncached","emojiRenderInterval","renderers","nasty","usedLength","wrapSomething","wrapElement","noFiller","customWraps","contextSite","contextExternal","lastEntity","nextEntity","endPartOffset","fullEntityText","partText","usedText","fontFamily","atPos","fromBot","encodeURIComponent","isSupported","masked","currentContext","electronHelpers","contextUrl","wrapTelegramUrlToAnchor","encoded","encodeSpoiler","entityText","voodoo","insertCustomFillers","notFiller","isCustomFillerNeededBySiblingNode","url1","QueryableWorker","worker","terminate","onmessage","queryMethodListener","queryMethodArguments","postMessage","sendQuery","transfer","queryMethod","workersLimit","playersByCacheName","workers","curWorkerNum","onPlayerLoaded","reqId","fps","clamped","onPlayerError","getAnimation","setLoop","_autoplay","loadLottieWorkers","remain","Worker","queryableWorker","makeAssetUrl","loadAnimationAsAsset","loadAnimationFromURL","loadAnimationDataFromURL","blobConstruct","loadAnimationFromURLManually","loadAnimationFromURLNext","newParams","loadAnimationWorker","waitForFirstFrame","initPlayer","destroyWorkers","loadFromData","getLottiePixelRatio","RLottiePlayer","cachingDelta","CACHE","skipDelta","contexts","setMainLoop","clearPendingRAF","rafId","resetCurrentFrame","minFrame","requestFrame","applyInversing","renderFrame2","cachedSource","renderedFirstFrame","ImageBitmap","frInterval","frThen","frameNew","onLap","mainLoopForwards","mainLoopBackwards","currentMethod","frameListener","listenerResults","enterFrame","playToFrame","bounds","setMinMax","playToFrameOnFrameCallback","setInverseColor","pagesManager","pageId","pagesDiv","scrollableDiv","page","onShown","setPage","isAuthPage","Page","onFirstMount","encodeEmoji","emojiText","toCodePoints","removeVS16s","vs16RegExp","zeroWidthJoiner","rawEmoji","unicodeSurrogates","points","getEmojiToneIndex","VIRTUAL_COUNTRIES_EMOJIS","getCountryEmoji","emojiFromCodePoints","fromCodePoint","module","exports","defineProperty","enumerable","Symbol","toStringTag","__esModule","prototype","isRecordingSupported","bufferLength","encoderApplication","encoderFrameSize","encoderPath","maxFramesPerPage","mediaTrackConstraints","resampleQuality","streamPages","wavBitDepth","encodedSamplePosition","WebAssembly","clearStream","audioContext","closeAudioContext","encodeBuffers","getChannelData","encoder","buffers","initAudioContext","initAudioGraph","scriptProcessorNode","createScriptProcessor","destination","onaudioprocess","inputBuffer","monitorGainNode","setMonitorGain","recordingGainNode","setRecordingGain","initSourceNode","loadWorker","initWorker","streamPage","storePage","recordedPages","samplePosition","finish","originalSampleRate","sampleRate","wavSampleRate","onpause","resume","onresume","setTargetAtTime","onstart","destroyWorker","Function","kSampleStepSize","float32ArraySupported","Float32Array","A","aA1","aA2","B","C","calcBezier","aT","getSlope","LinearEasing","mX1","mY1","mX2","mY2","sampleValues","aX","intervalStart","currentSample","kSplineTableSize","guessForT","initialSlope","aGuessT","currentSlope","newtonRaphsonIterate","aA","aB","currentX","currentT","binarySubdivide","getTForX"],"sourceRoot":""} \ No newline at end of file diff --git a/public/684.c02f8f5d69deae872060.chunk.js b/public/684.c02f8f5d69deae872060.chunk.js new file mode 100644 index 00000000..8a09cc48 --- /dev/null +++ b/public/684.c02f8f5d69deae872060.chunk.js @@ -0,0 +1,2 @@ +(this.webpackChunktweb=this.webpackChunktweb||[]).push([[684],{5814:(e,t,i)=>{"use strict";i.d(t,{Z:()=>m});var s=i(5400),n=i(3512),a=i(4762),o=i(410),r=i(8487),d=i(3772),l=i(1655),c=i(7625),h=i(2586),u=i(3013),p=i(3035);const f=new class{constructor(){this.observer=new IntersectionObserver((e=>{for(const t of e){const e=t.target;for(const i in this.byGroups){if(this.intersectionLockedGroups[i])continue;const s=this.byGroups[i].find((t=>t.el===e));if(s){if(t.isIntersecting)this.visible.add(s),this.checkAnimation(s,!1);else{this.visible.delete(s),this.checkAnimation(s,!0);const e=s.animation;e instanceof d.Z&&e.clearCache()}break}}}})),this.visible=new Set,this.overrideIdleGroups=new Set,this.byGroups={},this.byPlayer=new Map,this.lockedGroups={},this.onlyOnePlayableGroup="",this.intersectionLockedGroups={},this.videosLocked=!1,u.Z.addEventListener("play",(({doc:e})=>{"round"===e.type&&(this.videosLocked=!0,this.checkAnimations2())})),u.Z.addEventListener("pause",(()=>{this.videosLocked&&(this.videosLocked=!1,this.checkAnimations2())})),h.Z.addEventListener("change",(e=>{this.checkAnimations2(e)}))}setOverrideIdleGroup(e,t){t?this.overrideIdleGroups.add(e):this.overrideIdleGroups.delete(e)}getAnimations(e){const t=[];for(const i in this.byGroups)for(const s of this.byGroups[i])s.el===e&&t.push(s);return t}removeAnimation(e){const{el:t,animation:i}=e;i instanceof HTMLVideoElement||i.remove(),i instanceof HTMLVideoElement&&a.IS_SAFARI&&setTimeout((()=>{i.src="",i.load()}),1e3);const s=this.byGroups[e.group];s&&((0,l.Z)(s,e),s.length||delete this.byGroups[e.group]),this.observer.unobserve(t),this.visible.delete(e),this.byPlayer.delete(i)}removeAnimationByPlayer(e){const t=this.byPlayer.get(e);t&&this.removeAnimation(t)}addAnimation(e,t="",i,a){var o,r,l,c;if("none"===t||this.byPlayer.has(e))return;i||(e instanceof d.Z?i=e.el[0]:e instanceof s.KZ?i=e.canvas:e instanceof s.LD?i=null!==(o=e.placeholder)&&void 0!==o?o:e:e instanceof HTMLElement&&(i=e));const h={el:i,animation:e,group:t,controlled:a};a&&"boolean"!=typeof a&&a.onClean((()=>{this.removeAnimationByPlayer(e)})),e instanceof d.Z&&!n.Z.settings.stickers.loop&&e.loop&&(e.loop=n.Z.settings.stickers.loop),(null!==(r=(l=this.byGroups)[c=t])&&void 0!==r?r:l[c]=[]).push(h),this.observer.observe(h.el),this.byPlayer.set(e,h)}checkAnimations(e,t,i,s){if(void 0!==t&&!this.byGroups[t])return;const n=void 0!==t?[t]:Object.keys(this.byGroups);for(const t of n){if(s&&this.intersectionLockedGroups[t])continue;const n=this.byGroups[t];(0,c.Z)(n,(t=>{this.checkAnimation(t,e,i)}))}}checkAnimations2(e){this.checkAnimations(e,void 0,void 0,!0)}checkAnimation(e,t,i){const{el:s,animation:n,group:a}=e;i||!this.lockedGroups[a]&&!(0,r.Z)(s)?e.controlled&&!i||this.removeAnimation(e):t||this.onlyOnePlayableGroup&&this.onlyOnePlayableGroup!==a||n instanceof HTMLVideoElement&&this.videosLocked?n.paused||n.pause():!(n.paused&&this.visible.has(e)&&n.autoplay)||this.onlyOnePlayableGroup&&this.onlyOnePlayableGroup!==a||h.Z.isIdle&&!this.overrideIdleGroups.has(e.group)||n.play()}getOnlyOnePlayableGroup(){return this.onlyOnePlayableGroup}setOnlyOnePlayableGroup(e=""){this.onlyOnePlayableGroup=e}lockGroup(e){this.lockedGroups[e]=!0}unlockGroup(e){delete this.lockedGroups[e],this.checkAnimations(void 0,e)}refreshGroup(e){const t=this.byGroups[e];(null==t?void 0:t.length)&&(t.forEach((e=>{this.observer.unobserve(e.el)})),(0,p.T2)((()=>{t.forEach((e=>{this.observer.observe(e.el)}))})))}lockIntersectionGroup(e){this.intersectionLockedGroups[e]=!0}unlockIntersectionGroup(e){delete this.intersectionLockedGroups[e],this.refreshGroup(e)}toggleIntersectionGroup(e,t){t?this.lockIntersectionGroup(e):this.unlockIntersectionGroup(e)}};o.GO&&(o.GO.animationIntersector=f);const m=f},3013:(e,t,i)=>{"use strict";i.d(t,{Z:()=>L});var s=i(3512),n=i(3725),a=i(4762),o=i(410),r=i(6669),d=i(5432),l=i(2325),c=i(3719),h=i(8479),u=i(6848),p=i(3699),f=i(7530),m=i(493),g=i(2312),v=i(925),b=i(3241),y=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const w=(()=>{try{return a.IS_SAFARI&&+navigator.userAgent.match(/ Version\/(\d+)/)[1]<14}catch(e){return!1}})();class S extends b.Z{constructor(){super(...arguments),this.media=new Map,this.scheduled=new Map,this.mediaDetails=new Map,this.waitingMediaForLoad=new Map,this.waitingScheduledMediaForLoad=new Map,this.waitingDocumentsForLoad={},this.playbackRates={voice:1,video:1,audio:1},this.seekBackward=(e,t=this.playingMedia)=>{t&&(t.currentTime=Math.max(0,t.currentTime-(e.seekOffset||10)))},this.seekForward=(e,t=this.playingMedia)=>{t&&(t.currentTime=Math.min(t.duration,t.currentTime+(e.seekOffset||10)))},this.seekTo=(e,t=this.playingMedia)=>{t&&(t.currentTime=e.seekTime)},this.onMediaDocumentLoad=e=>y(this,void 0,void 0,(function*(){const t=this.mediaDetails.get(e),i=yield this.managers.appDocsManager.getDoc(t.docId);"audio"===i.type&&i.supportsStreaming&&w&&this.handleSafariStreamable(e);const s=yield this.managers.thumbsStorage.getCacheContext(i);e.src=s.url,this.playingMedia===e&&(e.playbackRate=this.playbackRate,"audio"===i.type&&(e.loop=this.loop));const n=this.waitingDocumentsForLoad[i.id];n&&(n.delete(e),n.size||delete this.waitingDocumentsForLoad[i.id])})),this.onPlay=e=>{const t=e.target,i=this.mediaDetails.get(t),{peerId:s,mid:n}=i,a=this.pip;a&&a.pause();const o=this.getMessageByMedia(t);if(this.playingMedia!==t){this.stop(),this.setMedia(t,o);const e=e=>e.mid===n&&e.peerId===s,i=this.listLoader,a=i.getCurrent();if(!a||!e(a)){let t;for(const s of[!1,!0]){const n=i.getPrevious(s);let a=n.findIndex(e);if(-1!==a?t=-(n.length-a):(a=i.getNext(s).findIndex(e),-1!==a&&(t=a+1)),void 0!==t)break}t?this.go(t,!1):this.setTargets({peerId:s,mid:n})}}setTimeout((()=>{this.playingMedia===t&&(this.dispatchEvent("play",this.getPlayingDetails()),this.pauseMediaInOtherTabs())}),0)},this.onPause=e=>{this.dispatchEvent("pause")},this.onEnded=e=>{if(!e.isTrusted)return;this.onPause(e);const t=this.listLoader;!this.lockedSwitchers&&(this.round||!t.current||t.next.length)&&t.getNext(!0).length&&this.next()||(this.stop(),this.dispatchEvent("stop"))},this.play=()=>this.toggle(!0),this.pause=()=>this.toggle(!1),this.stop=(e=this.playingMedia)=>{if(!e)return!1;if(e.paused||e.pause(),e.currentTime=0,(0,r.Z)(e,"ended"),e===this.playingMedia){const t=this.mediaDetails.get(e);if(null==t?void 0:t.clean){e.src="";const i=t.peerId,s=t.isScheduled?this.scheduled:this.media,n=s.get(i);n&&(n.delete(t.mid),n.size||s.delete(i)),e.remove(),this.mediaDetails.delete(e)}this.playingMedia=void 0,this.playingMediaType=void 0}return!0},this.playItem=e=>{const{peerId:t,mid:i}=e,s=this.searchContext.isScheduled;this.getMedia(t,i,s).play(),setTimeout((()=>{this.resolveWaitingForLoadMedia(t,i,s)}),0)},this.go=(e,t)=>{const i=this.listLoader;if(!this.lockedSwitchers&&i)return"audio"===this.playingMediaType?i.goRound(e,t):i.go(e,t)},this.browserPlay=this.bindBrowserCallback((e=>this.toggle(!0,e))),this.browserPause=this.bindBrowserCallback((e=>this.toggle(!1,e))),this.browserStop=this.bindBrowserCallback((e=>this.stop(e))),this.browserSeekBackward=this.bindBrowserCallback(((e,t)=>this.seekBackward(t,e))),this.browserSeekForward=this.bindBrowserCallback(((e,t)=>this.seekForward(t,e))),this.browserSeekTo=this.bindBrowserCallback(((e,t)=>this.seekTo(t,e))),this.browserNext=this.bindBrowserCallback((e=>e||this.next())),this.browserPrevious=this.bindBrowserCallback((e=>e?this.seekToStart(e):this.previous())),this.next=()=>this.go(1),this.previous=()=>{if(!this.seekToStart(this.playingMedia))return this.go(-1)}}construct(e){if(this.managers=e,this.container=document.createElement("div"),this.container.style.cssText="display: none;",document.body.append(this.container),navigator.mediaSession){const e={play:this.browserPlay,pause:this.browserPause,stop:this.browserStop,seekbackward:this.browserSeekBackward,seekforward:this.browserSeekForward,seekto:this.browserSeekTo,previoustrack:this.browserPrevious,nexttrack:this.browserNext};for(const t in e)try{navigator.mediaSession.setActionHandler(t,e[t])}catch(e){console.warn("MediaSession action is not supported:",t)}}s.Z.addEventListener("document_downloaded",(e=>{const t=this.waitingDocumentsForLoad[e];if(t)for(const e of t)this.onMediaDocumentLoad(e)})),s.Z.addEventListener("media_play",(()=>{this.skipMediaPlayEvent?this.skipMediaPlayEvent=!1:!this.pause()&&this.pip&&this.pip.pause()}));const t={};["volume","muted","playbackRate","loop","round"].forEach((e=>{const i="_"+e;t[e]={get:()=>this[i],set:t=>{this[i]!==t&&(this[i]=t,!this.playingMedia||"loop"===e&&"audio"!==this.playingMediaType||"round"===e||(this.playingMedia[e]=t),"playbackRate"===e&&void 0!==this.playingMediaType&&(this.playbackRates[this.playingMediaType]=t),this.dispatchPlaybackParams())}}})),Object.defineProperties(this,t)}dispatchPlaybackParams(){this.dispatchEvent("playbackParams",this.getPlaybackParams())}getPlaybackParams(){const{volume:e,muted:t,playbackRate:i,playbackRates:s,loop:n,round:a}=this;return{volume:e,muted:t,playbackRate:i,playbackRates:s,loop:n,round:a}}setPlaybackParams(e){this.playbackRates=e.playbackRates,this._volume=e.volume,this._muted=e.muted,this._playbackRate=e.playbackRate,this._loop=e.loop,this._round=e.round}addMedia(e,t,i){const{peerId:a,mid:o}=e,r=e.pFlags.is_scheduled?this.scheduled:this.media;let d=r.get(e.peerId);d||r.set(e.peerId,d=new Map);let l=d.get(o);if(l)return l;const c=(0,f.Z)(e);d.set(o,l=document.createElement("round"===c.type||"video"===c.type?"video":"audio")),"round"===c.type&&l.setAttribute("playsinline","true");const h={peerId:a,mid:o,docId:c.id,doc:c,message:e,clean:i,isScheduled:e.pFlags.is_scheduled};this.mediaDetails.set(l,h),l.volume=1,this.container.append(l),l.addEventListener("play",this.onPlay),l.addEventListener("pause",this.onPause),l.addEventListener("ended",this.onEnded),"audio"!==c.type&&(null==e?void 0:e.pFlags.media_unread)&&e.fromId!==s.Z.myId&&l.addEventListener("timeupdate",(()=>{this.managers.appMessagesManager.readMessages(a,[o])}),{once:!0});const u=(0,n.Z)();if(t)u.resolve();else{const t=e.pFlags.is_scheduled?this.waitingScheduledMediaForLoad:this.waitingMediaForLoad;let i=t.get(a);i||t.set(a,i=new Map),i.set(o,u)}return u.then((()=>y(this,void 0,void 0,(function*(){if(c.supportsStreaming||(yield this.managers.thumbsStorage.getCacheContext(c)).url)this.onMediaDocumentLoad(l);else{let e=this.waitingDocumentsForLoad[c.id];e||(e=this.waitingDocumentsForLoad[c.id]=new Set),e.add(l),g.Z.downloadMediaURL({media:c})}})))),l}getMedia(e,t,i){const s=(i?this.scheduled:this.media).get(e);return null==s?void 0:s.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,i){const s=i?this.waitingScheduledMediaForLoad:this.waitingMediaForLoad,n=s.get(e);if(!n)return;const a=n.get(t);a&&(a.resolve(),n.delete(t),n.size||s.delete(e))}isSafariBuffering(e){return!!e.safariBuffering}setSafariBuffering(e,t){e.safariBuffering=t}setNewMediadata(e,t=this.playingMedia){var i,s;return y(this,void 0,void 0,(function*(){if(document.pictureInPictureElement)return;yield(0,v.Z)(t,void 0,!1);const n=(0,f.Z)(e),o=[],r="voice"===n.type||"round"===n.type;let c="",h="";if(null===(i=n.thumbs)||void 0===i?void 0:i.length){const i=n.thumbs[n.thumbs.length-1];if(!i.bytes){const s=yield this.managers.thumbsStorage.getCacheContext(n,i.type);s.url?o.push({src:s.url,sizes:`${i.w}x${i.h}`,type:"image/jpeg"}):g.Z.downloadMediaURL({media:n,thumb:i}).then((()=>{this.playingMedia===t&&s.url&&this.setNewMediadata(e)}))}}else if(r){const t=e.fromId||e.peerId;yield this.managers.appPeersManager.getPeerPhoto(t),c=yield(0,m.Z)({peerId:t,plainText:!0,onlyFirstName:!1}),h=l.ZP.format("voice"===n.type?"AttachAudio":"AttachRound",!0)}if(!r){const e=n.attributes.find((e=>"documentAttributeAudio"===e._));c=null!==(s=null==e?void 0:e.title)&&void 0!==s?s:n.file_name,h=null==e?void 0:e.performer}o.length||(a.IS_APPLE?d.Z?o.push({src:"assets/img/apple-touch-icon-precomposed.png",sizes:"180x180",type:"image/png"}):o.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}`;o.push({src:`assets/img/android-chrome-${t}.png`,sizes:t,type:"image/png"})})));const u=new MediaMetadata({title:c,artist:h,artwork:o});navigator.mediaSession.metadata=u}))}setCurrentMediadata(){const{playingMedia:e}=this;if(!e)return;const t=this.getMessageByMedia(e);this.setNewMediadata(t,e)}getMessageByMedia(e){return this.mediaDetails.get(e).message}getPlayingDetails(){const{playingMedia:e}=this;if(!e)return;const t=this.getMessageByMedia(e);return{doc:(0,f.Z)(t),message:t,media:e,playbackParams:this.getPlaybackParams()}}pauseMediaInOtherTabs(){this.skipMediaPlayEvent=!0,s.Z.dispatchEvent("media_play")}toggle(e,t=this.playingMedia){return!!t&&(void 0===e&&(e=t.paused),t.paused===e&&(e?t.play():t.pause(),!0))}bindBrowserCallback(e){return t=>{e(this.pip,t)}}seekToStart(e){return(null==e?void 0:e.currentTime)>5&&(e.currentTime=0,this.toggle(!0,e),!0)}willBePlayed(e){this.willBePlayedMedia=e}setSearchContext(e){return!(0,u.Z)(this.searchContext,e)&&(this.searchContext=(0,h.Z)(e),!0)}getSearchContext(){return this.searchContext}setTargets(e,t,i){let s=this.listLoader;s?s.reset():s=this.listLoader=new c.Z({loadCount:10,loadWhenLeft:5,processItem:e=>(this.addMedia(e,!1),{peerId:e.peerId,mid:e.mid}),onJump:(e,t)=>{this.playItem(e)},onEmptied:()=>{this.dispatchEvent("stop"),this.stop()}});const n=void 0===this.searchContext.folderId;t?s.setTargets(t,i,n):s.reverse=n,s.setSearchContext(this.searchContext),s.current=e,s.load(!0),s.load(!1)}getPlaybackMediaTypeFromMessage(e){const t=(0,f.Z)(e);let i="audio";return(null==t?void 0:t.type)&&("voice"===t.type||"round"===t.type?i="voice":"video"===t.type&&(i="video")),i}setMedia(e,t){const i=this.getPlaybackMediaTypeFromMessage(t);this._playbackRate=this.playbackRates[i],this.playingMedia=e,this.playingMediaType=i,this.playingMedia.volume=this.volume,this.playingMedia.muted=this.muted,this.playingMedia.playbackRate=this.playbackRate,"audio"===i&&(this.playingMedia.loop=this.loop),"mediaSession"in navigator&&this.setNewMediadata(t)}setSingleMedia(e,t){const i=this.playingMedia,s=this.pause();let n;return e?(n=()=>{const e=this.pip;e&&e.pause(),this.pauseMediaInOtherTabs()},e.paused||n(),e.addEventListener("play",n)):this.pauseMediaInOtherTabs(),this.willBePlayed(void 0),e?this.setMedia(e,t):this.playingMedia=void 0,this.toggleSwitchers(!1),(t=s)=>{this.toggleSwitchers(!0),i&&(this.mediaDetails.get(i)?this.setMedia(i,this.getMessageByMedia(i)):this.next()||this.previous()),this.playingMedia===e&&(this.playingMedia=void 0,this.playingMediaType=void 0),e&&e.removeEventListener("play",n),t&&this.play()}}toggleSwitchers(e){this.lockedSwitchers=!e}setPictureInPicture(e){this.pip=e;const t=new p.Z;t.add(e)("leavepictureinpicture",(()=>{this.pip===e&&(this.pip=void 0,t.removeAll())}),{once:!0}),t.add(e)("play",(t=>{this.playingMedia!==e&&this.pause(),this.pauseMediaInOtherTabs()}))}}const C=new S;o.GO.appMediaPlaybackController=C;const L=C},1784:(e,t,i)=>{"use strict";i.d(t,{Z:()=>L});var s=i(2341),n=i(3910),a=i(2738),o=i(8497),r=i(4668),d=i(130),l=i(4755),c=i(3719),h=i(2312),u=i(9322),p=i(3709),f=i(7530),m=i(5400),g=i(8544),v=i(5128),b=i(4524),y=i(8805),w=i(4332),S=i(1669),C=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class L extends g.Z{get searchContext(){return this.listLoader.searchContext}constructor(){let e;super(new c.Z({processItem:e=>{const t="inputMessagesFilterDocument"===this.searchContext.inputFilter._,{mid:i,peerId:s}=e,n=(0,f.Z)(e);if(n&&(!t||L.isMediaCompatibleForDocumentViewer(n)))return{element:null,mid:i,peerId:s}}}),["delete","forward"]),this.onPrevClick=e=>C(this,void 0,void 0,(function*(){this.openMedia(yield this.getMessageByPeer(e.peerId,e.mid),e.element,-1)})),this.onNextClick=e=>C(this,void 0,void 0,(function*(){this.openMedia(yield this.getMessageByPeer(e.peerId,e.mid),e.element,1)})),this.onDeleteClick=()=>{const e=this.target;new v.Z(e.peerId,[e.mid],"chat",(()=>{this.target={element:this.content.media},this.close()}))},this.onForwardClick=()=>{const e=this.target;e.mid&&new b.Z({[e.peerId]:[e.mid]},(()=>this.close()))},this.onAuthorClick=e=>C(this,void 0,void 0,(function*(){const{mid:t,peerId:i}=this.target;if(t&&t!==Number.MAX_SAFE_INTEGER){const s=this.searchContext.threadId,n=yield this.getMessageByPeer(i,t);this.close(e).then((()=>C(this,void 0,void 0,(function*(){if(l.Z.isMobile){const e=w.ZP.getTab(S.Z);e&&e.close()}u.ZP.setInnerPeer({peerId:n.peerId,lastMsgId:t,type:s?"discussion":void 0,threadId:s})}))))}})),this.onDownloadClick=()=>{const{message:e}=this.target,t=(0,f.Z)(e);t&&h.Z.downloadToDisc({media:t,queueId:u.ZP.chat.bubbles.lazyLoadQueue.queueId})},this.listLoader.onEmptied=()=>{this.close()},this.content.caption=document.createElement("div"),this.content.caption.classList.add(g.x+"-caption","spoilers-container");const t=()=>{e&&clearTimeout(e),e=window.setTimeout((()=>{e=void 0,this.content.caption.classList.remove("is-focused")}),800)};this.content.caption.addEventListener("touchstart",(()=>{l.Z.isMobile&&(this.content.caption.classList.add("is-focused"),e&&(clearTimeout(e),e=void 0),document.addEventListener("touchend",t,{once:!0}))})),new y.ZP(this.content.caption).onAdditionalScroll=t,this.wholeDiv.append(this.content.caption),(0,a.fc)(this.buttons.delete,this.onDeleteClick);const i=[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(i),this.setListeners()}setListeners(){super.setListeners(),(0,a.fc)(this.buttons.forward,this.onForwardClick),(0,a.fc)(this.author.container,this.onAuthorClick);const e=t=>{const i=(0,r.Z)(t.target,"A"),s=(0,o.Z)(t.target,"spoiler");if(i instanceof HTMLAnchorElement&&(!s||this.content.caption.classList.contains("is-spoiler-visible"))){const s=i.getAttribute("onclick");if(!s||s.includes("showMaskedAlert"))return;return(0,n.Z)(t),this.close().then((()=>{this.content.caption.removeEventListener("click",e,{capture:!0}),i.click()})),!1}};this.content.caption.addEventListener("click",e,{capture:!0})}getMessageByPeer(e,t){return this.searchContext.isScheduled?this.managers.appMessagesManager.getScheduledMessageByPeer(e,t):this.managers.appMessagesManager.getMessageByPeer(e,t)}setCaption(e){const t=e.message;let i="";t&&(i=(0,m.ZP)(t,{entities:e.totalEntities})),(0,d.Z)(this.content.caption.firstElementChild,i),this.content.caption.classList.toggle("hide",!t)}setSearchContext(e){return this.listLoader.setSearchContext(e),this}openMedia(e,t,i=0,s=!1,n=[],a=[]){const o=Object.create(null,{_openMedia:{get:()=>super._openMedia}});return C(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;const r=e.mid,d=e.fwd_from&&!e.fromId?e.fwd_from.from_name:e.fromId,l=(0,f.Z)(e),c=yield this.managers.appPeersManager.noForwards(e.peerId),h="messageService"===e._,u=h||!(yield this.managers.appMessagesManager.canForward(e)),m=(h?c:u)||!(0,p.Z)(e);[[[this.buttons.forward,this.btnMenuForward],u],[[this.buttons.download,this.btnMenuDownload],m],[[this.buttons.delete,this.btnMenuDelete],!(yield this.managers.appMessagesManager.canDeleteMessage(e))]].forEach((([e,t])=>{e.forEach((e=>{e instanceof HTMLElement?e.classList.toggle("hide",t):e.verify=()=>!t}))})),this.wholeDiv.classList.toggle("no-forwards",m),this.setCaption(e);const g=o._openMedia.call(this,l,e.date,d,i,t,s,n,a,e);return this.target.mid=r,this.target.peerId=e.peerId,this.target.message=e,g}))}static isMediaCompatibleForDocumentViewer(e){return"photo"===e._||s.Z.has(e.mime_type)}}},8544:(e,t,i)=>{"use strict";i.d(t,{x:()=>J,Z:()=>ee});var s=i(3725),n=i(4755),a=i(5432),o=i(4762),r=i(5003),d=i(3013),l=i(3910),c=i(3699),h=i(3003),u=i(5322),p=i(7529),f=i(6733),m=i(5157),g=i(7207),v=i(8427),b=i(5701),y=i(3815),w=i(925),S=i(2738);class C extends p.Z{constructor({video:e,play:t=!1,streamable:i=!1,duration:s,onPlaybackRackMenuToggle:n,onPip:a,onPipClose:o}){if(super(),this.video=e,this.wrapper=document.createElement("div"),this.wrapper.classList.add("ckin__player"),this.onPlaybackRackMenuToggle=n,this.onPip=a,this.onPipClose=o,this.listenerSetter=new c.Z,this.setup({element:this.wrapper,listenerSetter:this.listenerSetter,canHideControls:()=>!(this.video.paused||this.playbackRateButton&&this.playbackRateButton.classList.contains("menu-open")),showOnLeaveToClassName:"media-viewer-caption",ignoreClickClassName:"ckin__controls"}),e.parentNode.insertBefore(this.wrapper,e),this.wrapper.appendChild(e),this.skin="default",this.stylePlayer(s),this.setBtnMenuToggle(),"default"===this.skin){const t=this.wrapper.querySelector(".default__controls.ckin__controls");this.progress=new g.Z({media:e,streamable:i,onSeekStart:()=>{this.wrapper.classList.add("is-seeking")},onSeekEnd:()=>{this.wrapper.classList.remove("is-seeking")}}),t.prepend(this.progress.container)}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:i,skin:s,listenerSetter:n}=this;t.classList.add(s);const o=this.buildControls();let r;if(t.insertAdjacentHTML("beforeend",o),"default"===s){this.playbackRateButton=this.wrapper.querySelector(".playback-rate"),this.pipButton=this.wrapper.querySelector(".pip");const e=t.querySelectorAll(".toggle"),s=t.querySelector(".fullscreen"),o=t.querySelector("#time-elapsed");r=t.querySelector("#time-duration"),r.textContent=(0,m.Z)(0|i.duration);const c=new v.Z(n),h=t.querySelector(".left-controls");if(c.btn.classList.remove("btn-icon"),h.insertBefore(c.btn,o.parentElement),Array.from(e).forEach((e=>{(0,S.fc)(e,(()=>{this.togglePlay()}),{listenerSetter:this.listenerSetter})})),this.pipButton){(0,S.fc)(this.pipButton,(()=>{this.video.requestPictureInPicture()}),{listenerSetter:this.listenerSetter});const e=e=>{this.wrapper.style.visibility=e?"hidden":"",this.onPip&&this.onPip(e)},t=20,s=(0,b.Z)(e,t,!1,!0);n.add(i)("enterpictureinpicture",(()=>{s(!0),n.add(i)("leavepictureinpicture",(()=>{const e=n.add(i)("pause",(()=>{clearTimeout(s),this.onPipClose&&this.onPipClose()}),{once:!0}),s=setTimeout((()=>{n.remove(e)}),t)}),{once:!0})})),n.add(i)("leavepictureinpicture",(()=>{s(!1)}))}a.Z||((0,S.fc)(i,(()=>{this.togglePlay()}),{listenerSetter:this.listenerSetter}),n.add(document)("keydown",(e=>{if(y.Z.overlaysActive>1||document.pictureInPictureElement===i)return;const{key:s,code:n}=e;let a=!0;if("KeyF"===n)this.toggleFullScreen();else if("KeyM"===n)d.Z.muted=!d.Z.muted;else if("Space"===n)this.togglePlay();else if(!e.altKey||"Equal"!==n&&"Minus"!==n)!t.classList.contains("ckin__fullscreen")||"ArrowLeft"!==s&&"ArrowRight"!==s?a=!1:"ArrowLeft"===s?d.Z.seekBackward({action:"seekbackward"}):d.Z.seekForward({action:"seekforward"});else{const e="Equal"===n?1:-1,t=d.Z.playbackRate,i=C.PLAYBACK_RATES.indexOf(t)+e;i>=0&&i{a.Z||this.toggleFullScreen()})),(0,S.fc)(s,(()=>{this.toggleFullScreen()}),{listenerSetter:this.listenerSetter}),(0,f.Ms)(t,this.onFullScreen.bind(this,s),n),n.add(i)("timeupdate",(()=>{o.textContent=(0,m.Z)(0|i.currentTime)})),n.add(i)("play",(()=>{t.classList.add("played"),a.Z||n.add(i)("play",(()=>{this.hideControls(!0)}))}),{once:!0}),n.add(i)("pause",(()=>{this.showControls(!1)})),n.add(d.Z)("playbackParams",(()=>{this.setPlaybackRateIcon()}))}n.add(i)("play",(()=>{t.classList.add("is-playing")})),n.add(i)("pause",(()=>{t.classList.remove("is-playing")})),i.duration||e?r.textContent=(0,m.Z)(Math.round(i.duration||e)):(0,w.Z)(i).then((()=>{r.textContent=(0,m.Z)(Math.round(i.duration))}))}togglePlay(){const e=this.video.paused;this.video[e?"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 ${!o.IS_MOBILE&&document.pictureInPictureEnabled?``:""}\n \n
\n
\n
`}setBtnMenuToggle(){const e=C.PLAYBACK_RATES.map(((e,t)=>({regularText:e+"x",onClick:()=>{d.Z.playbackRate=e}}))),t=(0,h.b)({buttons:e});t.classList.add("top-left"),(0,u.v)({el:this.playbackRateButton,onOpen:this.onPlaybackRackMenuToggle?()=>{this.onPlaybackRackMenuToggle(!0)}:void 0,onClose:this.onPlaybackRackMenuToggle?()=>{this.onPlaybackRackMenuToggle(!1)}:void 0}),this.playbackRateButton.append(t),this.setPlaybackRateIcon()}setPlaybackRateIcon(){const e=this.playbackRateButton;C.PLAYBACK_RATES_ICONS.forEach((t=>{t="tgico-"+t,e.classList.remove(t)}));let t=C.PLAYBACK_RATES.indexOf(d.Z.playbackRate);-1===t&&(t=C.PLAYBACK_RATES.indexOf(1)),e.classList.add("tgico-"+C.PLAYBACK_RATES_ICONS[t])}toggleFullScreen(){const e=this.wrapper;if(o.IS_APPLE_MOBILE){const e=this.video;return e.webkitEnterFullscreen(),void e.enterFullscreen()}(0,f.rB)()?(0,f.C8)():(0,f.Dj)(e)}onFullScreen(e){const t=(0,f.rB)();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"))}cleanup(){super.cleanup(),this.listenerSetter.removeAll(),this.progress.removeListeners(),this.onPlaybackRackMenuToggle=this.onPip=void 0}}C.PLAYBACK_RATES=[.5,1,1.5,2],C.PLAYBACK_RATES_ICONS=["playback_05","playback_1x","playback_15","playback_2x"];var L=i(3512),E=i(5814),I=i(9331),M=i(2230),P=i(3442),Z=i(3757),T=i(632),k=i(5824),x=i(8497),A=i(6740),_=i(8204),F=i(9171),D=i(5565),R=i(3035),B=i(65),N=i(241),O=i(3241),U=i(1507),H=i(7660),z=i(8580),j=i(1713),G=i(8115),V=i(4421),K=i(2312),W=i(7362),$=i(2796),q=i(3228);function Y(e,t,i){return e>=t&&e<=i}var Q=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const X=.5,J="media-viewer";class ee extends O.Z{get target(){return this.listLoader.current}set target(e){this.listLoader.current=e}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.transform={x:0,y:0,scale:1},this.lastTransform=this.transform,this.lastZoomCenter=this.transform,this.lastDragOffset=this.transform,this.lastDragDelta=this.transform,this.onSwipeFirst=()=>{this.lastDragOffset=this.lastDragDelta={x:0,y:0},this.lastTransform=Object.assign({},this.transform),this.moversContainer.classList.add("no-transition"),this.isGesturingNow=!0,this.lastGestureTime=Date.now(),this.clampZoomDebounced.clearTimeout(),this.lastTransform.x||this.lastTransform.y||this.isZooming||(this.initialContentRect=this.content.media.getBoundingClientRect())},this.onSwipeReset=()=>{this.moversContainer.classList.remove("no-transition"),this.clampZoomDebounced.clearTimeout();const{draggingType:e}=this;if(this.isZoomingNow=!1,this.isGesturingNow=!1,this.draggingType=void 0,!this.closing)if(this.transform.scale>1){const t=Math.min(this.transform.scale,4),i=t/this.transform.scale;let s=this.transform.x*i+(this.lastZoomCenter.x-i*this.lastZoomCenter.x),n=this.transform.y*i+(this.lastZoomCenter.y-i*this.lastZoomCenter.y);if(e&&"wheel"!==e&&this.lastTransform.scale===this.transform.scale){const e=.1,t=Math.max(1,Date.now()-this.lastGestureTime),i=Math.abs(this.lastDragOffset.x)/t,a=Math.abs(this.lastDragOffset.y)/t;s-=Math.abs(this.lastDragOffset.x)*i*e*-this.lastDragDelta.x,n-=Math.abs(this.lastDragOffset.y)*a*e*-this.lastDragDelta.y}const[a]=this.calculateOffsetBoundaries({x:s,y:n,scale:t});this.lastTransform=a,this.setTransform(a)}else this.transform.scale<1&&this.resetZoom()},this.onZoom=({initialCenterX:e,initialCenterY:t,zoom:i,zoomAdd:s,currentCenterX:n,currentCenterY:a,dragOffsetX:o,dragOffsetY:r,zoomFactor:d})=>{e||(e=N.Z.width/2),t||(t=N.Z.height/2),n||(n=N.Z.width/2),a||(a=N.Z.height/2),this.isZoomingNow=!0;const l=s?(0,q.Z)(this.lastTransform.scale+s,X,12):null!=i?i:(0,q.Z)(this.lastTransform.scale*d,X,12),c=l/this.lastTransform.scale,h=Math.abs(Math.min(this.lastTransform.x,0)),u=Math.abs(Math.min(this.lastTransform.y,0));this.lastZoomCenter={x:n,y:a};const p=h+e,f=u+t,{scaleOffsetX:m,scaleOffsetY:g}=this.calculateScaleOffset({x:p,y:f,scale:c}),[v]=this.calculateOffsetBoundaries({x:this.lastTransform.x+m+o,y:this.lastTransform.y+g+r,scale:l});this.setTransform(v)},this.calculateOffsetBoundaries=({x:e,y:t,scale:i},s=0)=>{if(!this.initialContentRect)return[{x:e,y:t,scale:i},!0,!0];let n=!0,a=!0;const{minX:o,maxX:r,minY:d,maxY:l}=this.getZoomBoundaries(i,s);return n=Y(e,r,o),e=(0,q.Z)(e,r,o),a=Y(t,l,d),[{x:e,y:t=(0,q.Z)(t,l,d),scale:i},n,a]},this.setZoomValue=(e=this.transform.scale)=>{var t;null!==(t=this.initialContentRect)&&void 0!==t||(this.initialContentRect=this.content.media.getBoundingClientRect()),1===e&&(this.transform.x=0,this.transform.y=0),this.moversContainer.style.transform=`translate3d(${this.transform.x.toFixed(3)}px, ${this.transform.y.toFixed(3)}px, 0px) scale(${e.toFixed(3)})`,this.zoomElements.btnOut.classList.toggle("inactive",e===X),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((0,l.Z)(e),a.Z)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 i=this.isZooming;let s=null;const n=["ckin__player","media-viewer-buttons","media-viewer-author","media-viewer-caption","zoom-container"];i&&n.push("media-viewer-movers"),n.find((e=>{try{if(s=(0,x.Z)(t,e),s)return!0}catch(e){return!1}})),s&&(i||"IMG"!==t.tagName&&"image"!==t.tagName)||this.close()},this.onKeyDown=e=>{if(y.Z.overlaysActive>1)return;const t=e.key;let i=!0;"ArrowRight"===t?!this.isZooming&&this.buttons.next.click():"ArrowLeft"===t?!this.isZooming&&this.buttons.prev.click():"-"===t||"="===t?this.ctrlKeyDown&&this.addZoomStep("="===t):i=!1,(e.ctrlKey||e.metaKey)&&(this.ctrlKeyDown=!0),i&&(0,l.Z)(e)},this.onKeyUp=e=>{y.Z.overlaysActive>1||e.ctrlKey||e.metaKey||(this.ctrlKeyDown=!1,this.isZooming&&this.setZoomValue())},this.managers=L.Z.managers,this.log=(0,r.kg)("AMV"),this.preloader=new P.Z,this.preloaderStreamable=new P.Z({cancelable:!1,streamable:!0}),this.preloader.construct(),this.preloaderStreamable.construct(),this.lazyLoadQueue=new V.Z,this.wholeDiv=document.createElement("div"),this.wholeDiv.classList.add(J+"-whole"),this.overlaysDiv=document.createElement("div"),this.overlaysDiv.classList.add("overlays");const i=document.createElement("div");i.classList.add(J);const s=this.topbar=document.createElement("div");s.classList.add(J+"-topbar",J+"-appear");const n=document.createElement("div");n.classList.add(J+"-topbar-left"),this.buttons["mobile-close"]=(0,M.Z)("close",{onlyMobile:!0}),this.author.container=document.createElement("div"),this.author.container.classList.add(J+"-author","no-select");const o=document.createElement("div");this.author.avatarEl=new I.Z,this.author.avatarEl.classList.add(J+"-userpic","avatar-44"),this.author.nameEl=document.createElement("div"),this.author.nameEl.classList.add(J+"-name"),this.author.date=document.createElement("div"),this.author.date.classList.add(J+"-date"),o.append(this.author.nameEl,this.author.date),this.author.container.append(this.author.avatarEl,o);const d=document.createElement("div");d.classList.add(J+"-buttons"),t.concat(["download","zoom","close"]).forEach((e=>{const t=(0,M.Z)(e,{noRipple:!0});this.buttons[e]=t,d.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=(0,M.Z)("zoomout",{noRipple:!0}),(0,S.fc)(this.zoomElements.btnOut,(()=>this.addZoomStep(!1))),this.zoomElements.btnIn=(0,M.Z)("zoomin",{noRipple:!0}),(0,S.fc)(this.zoomElements.btnIn,(()=>this.addZoomStep(!0))),this.zoomElements.rangeSelector=new B.Z({step:.01,min:X,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),a.Z,this.content.main=document.createElement("div"),this.content.main.classList.add(J+"-content"),this.content.container=document.createElement("div"),this.content.container.classList.add(J+"-container"),this.content.media=document.createElement("div"),this.content.media.classList.add(J+"-media"),this.content.container.append(this.content.media),this.content.main.append(this.content.container),i.append(this.content.main),this.overlaysDiv.append(i),n.append(this.buttons["mobile-close"],this.author.container),s.append(n,d),this.buttons.prev=document.createElement("div"),this.buttons.prev.className=`${J}-switcher ${J}-switcher-left`,this.buttons.prev.innerHTML=``,this.buttons.next=document.createElement("div"),this.buttons.next.className=`${J}-switcher ${J}-switcher-right`,this.buttons.next.innerHTML=``,this.moversContainer=document.createElement("div"),this.moversContainer.classList.add(J+"-movers"),this.moversContainer.append(this.buttons.prev,this.buttons.next),this.wholeDiv.append(this.overlaysDiv,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()}setListeners(){(0,S.fc)(this.buttons.download,this.onDownloadClick),[this.buttons.close,this.buttons["mobile-close"],this.preloaderStreamable.preloader].forEach((e=>{(0,S.fc)(e,this.close.bind(this))})),[[-1,this.buttons.prev],[1,this.buttons.next]].forEach((([e,t])=>{t.addEventListener("click",(t=>{(0,l.Z)(t),this.setMoverPromise||this.listLoader.go(e)}))})),(0,S.fc)(this.buttons.zoom,(()=>{this.isZooming?this.resetZoom():this.addZoomStep(!0)})),this.wholeDiv.addEventListener("click",this.onClick),this.listLoader.onJump=(e,t)=>{t?this.onNextClick(e):this.onPrevClick(e)};const e=(e,t)=>{const[i,s]=[e-this.lastDragOffset.x,t-this.lastDragOffset.y],[n,a,o]=this.calculateOffsetBoundaries({x:this.transform.x+i,y:this.transform.y+s,scale:this.transform.scale});return this.lastDragDelta={x:i,y:s},this.lastDragOffset={x:e,y:t},this.setTransform(n),{inBoundsX:a,inBoundsY:o}},t=(0,b.Z)((()=>{this.lastGestureTime=Date.now()}),500,!1,!0);this.clampZoomDebounced=(0,b.Z)((()=>{this.onSwipeReset()}),300,!1,!0),this.swipeHandler=new Z.Z({element:this.wholeDiv,onReset:this.onSwipeReset,onFirstSwipe:this.onSwipeFirst,onSwipe:(i,s,n,o)=>{if(!(0,f.rB)())if(!this.isZooming||this.isZoomingNow){if(!this.isZoomingNow&&a.Z)return Math.abs(i)/N.Z.width>.2||Math.abs(i)>125?(i>0?this.buttons.prev.click():this.buttons.next.click(),!0):(Math.abs(s)/N.Z.height>.2||Math.abs(s)>125)&&(this.close(),!0)}else{t(),this.draggingType=n.type;const{inBoundsX:a,inBoundsY:r}=e(i,s);null==o||o(!a,!r)}},onZoom:this.onZoom,onDoubleClick:({centerX:e,centerY:t})=>{if(this.isZooming)this.resetZoom();else{const i=3;this.changeZoomByPosition(e,t,i)}},verifyTouchTarget:e=>!((0,x.Z)(e.target,"ckin__controls")||(0,x.Z)(e.target,"media-viewer-caption")||(0,x.Z)(e.target,"media-viewer-topbar")&&"wheel"!==e.type),cursor:""})}changeZoomByPosition(e,t,i){const{scaleOffsetX:s,scaleOffsetY:n}=this.calculateScaleOffset({x:e,y:t,scale:i}),a=this.calculateOffsetBoundaries({x:s,y:n,scale:i})[0];this.setTransform(a)}setTransform(e){this.transform=e,this.changeZoom(e.scale)}calculateScaleOffset({x:e,y:t,scale:i}){return{scaleOffsetX:e-i*e,scaleOffsetY:t-i*t}}toggleZoom(e){const t=this.isZooming,i=void 0===e;if((this.zoomElements.rangeSelector.mousedown||this.ctrlKeyDown)&&(e=!0),null!=e||(e=!t),t!==e){if(this.buttons.zoom.classList.toggle("zoom-in",!e),this.zoomElements.container.classList.toggle("is-visible",this.isZooming=e),this.wholeDiv.classList.toggle("is-zooming",e),i||!e){const t=e?this.transform.scale:1;this.setZoomValue(t),this.zoomElements.rangeSelector.setProgress(t)}this.videoPlayer&&this.videoPlayer.lockControls(!e&&void 0)}}addZoomStep(e){this.addZoom(.5*(e?1:-1))}resetZoom(){this.setTransform({x:0,y:0,scale:1})}changeZoom(e=this.transform.scale){this.transform.scale=e,this.zoomElements.rangeSelector.setProgress(e),this.setZoomValue(e)}addZoom(e){this.lastTransform=this.transform,this.onZoom({zoomAdd:e,currentCenterX:0,currentCenterY:0,initialCenterX:0,initialCenterY:0,dragOffsetX:0,dragOffsetY:0}),this.lastTransform=this.transform,this.clampZoomDebounced()}getZoomBounce(){return this.isGesturingNow&&a.Z?50:0}getZoomBoundaries(e=this.transform.scale,t=0){if(!this.initialContentRect)return{minX:0,maxX:0,minY:0,maxY:0};const i=(N.Z.width-N.Z.width*e)/2,s=(N.Z.height-N.Z.height*e)/2;return{minX:Math.max(-this.initialContentRect.left*e,i),maxX:N.Z.width-this.initialContentRect.right*e,minY:Math.max(-this.initialContentRect.top*e+t,s),maxY:N.Z.height-this.initialContentRect.bottom*e}}setBtnMenuToggle(e){const t=(0,u.Z)({buttonOptions:{onlyMobile:!0},direction:"bottom-left",buttons:e});this.topbar.append(t)}close(e){var t,i;if(e&&(0,l.Z)(e),this.setMoverAnimationPromise)return Promise.reject();this.closing=!0,null===(t=this.swipeHandler)||void 0===t||t.removeListeners(),this.navigationItem&&k.Z.removeItem(this.navigationItem),this.lazyLoadQueue.clear();const s=this.setMoverToTarget(null===(i=this.target)||void 0===i?void 0:i.element,!0).then((({onAnimationEnd:e})=>e));return this.listLoader.reset(),this.listLoader.cleanup&&this.listLoader.cleanup(),this.setMoverPromise=null,this.tempId=-1,window.appMediaViewer===this&&(window.appMediaViewer=void 0),this.removeGlobalListeners(),s.finally((()=>{this.wholeDiv.remove(),this.toggleOverlay(!1)})),s}toggleOverlay(e){y.Z.isOverlayActive=e,E.Z.checkAnimations2(e)}toggleGlobalListeners(e){e?this.setGlobalListeners():this.removeGlobalListeners()}removeGlobalListeners(){window.removeEventListener("keydown",this.onKeyDown),window.removeEventListener("keyup",this.onKeyUp)}setGlobalListeners(){window.addEventListener("keydown",this.onKeyDown),window.addEventListener("keyup",this.onKeyUp)}setMoverToTarget(e,t=!1,i=0){return Q(this,void 0,void 0,(function*(){this.dispatchEvent("setMoverBefore");const n=this.content.mover;t||(n.innerHTML="");const a=this.isZooming&&t?this.transform.scale:1;this.removeCenterFromMover(n);const o=0!==i,r=L.Z.settings.animationsEnabled?o?350:200:0;let d,l;e&&(e instanceof I.Z||e.classList.contains("grid-item")?(d=e,l=e.getBoundingClientRect()):e instanceof SVGImageElement||e.parentElement instanceof SVGForeignObjectElement?(d=(0,x.Z)(e,"attachment"),l=d.getBoundingClientRect()):e.classList.contains("profile-avatars-avatar")&&(d=(0,x.Z)(e,"profile-avatars-container"),l=d.getBoundingClientRect(),t&&e.getBoundingClientRect().left!==l.left&&(e=d=l=void 0))),e||(e=this.content.media),l||(d=e.parentElement,l=e.getBoundingClientRect());let c=!1;if(e!==this.content.media&&!e.classList.contains("profile-avatars-avatar")){const i=(0,x.Z)(d,"scrollable"),s=(0,_.Z)(d,i,!0);!t||s&&2!==s.overflow.vertical&&2!==s.overflow.horizontal?!s||1!==s.overflow.vertical&&1!==s.overflow.horizontal||(c=!0):(d=(e=this.content.media).parentElement,l=e.getBoundingClientRect())}const h=this.content.media.getBoundingClientRect();let u,p,f,m="";if(o?(u=1===i?N.Z.width:-h.width,p=h.top):(u=l.left,p=l.top),m+=`translate3d(${u}px,${p}px,0) `,e instanceof HTMLImageElement||e instanceof HTMLVideoElement||"DIV"===e.tagName){if(n.firstElementChild&&n.firstElementChild.classList.contains("media-viewer-aspecter")){f=n.firstElementChild;const e=f.querySelector(".ckin__player");if(e){const t=e.firstElementChild;f.append(t),e.remove()}f.style.cssText||(n.classList.remove("active"),this.setFullAspect(f,h,l),n.offsetLeft,n.classList.add("active"))}else f=document.createElement("div"),f.classList.add("media-viewer-aspecter"),n.prepend(f);f.style.cssText=`width: ${l.width}px; height: ${l.height}px; transform: scale3d(${h.width/l.width}, ${h.height/l.height}, 1);`}n.style.width=h.width+"px",n.style.height=h.height+"px";const g=l.width/h.width,v=l.height/h.height;o||(m+=`scale3d(${g},${v},1) `);let b=window.getComputedStyle(d).getPropertyValue("border-radius");const y=function(e){const 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}(b);if(b=y.map((e=>parseInt(e)/g+"px")).join(" "),o||(n.style.borderRadius=b),t&&1!==a){const e=l.left-(N.Z.width*g-l.width)/2,t=l.top-(N.Z.height*v-l.height)/2;this.moversContainer.style.transform=`matrix(${g}, 0, 0, ${v}, ${e}, ${t})`}else n.style.transform=m;let w;c&&(n.style.opacity="0");const S=e.classList.contains("is-out"),C=this.setMoverAnimationPromise=(0,s.Z)(),E={onAnimationEnd:C},M=setTimeout((()=>{C.isFulfilled||C.isRejected||C.resolve()}),1e3);if(C.finally((()=>{this.dispatchEvent("setMoverAfter"),this.setMoverAnimationPromise===C&&(this.setMoverAnimationPromise=null),clearTimeout(M)})),t)return e instanceof SVGSVGElement&&(w=n.querySelector("path"),w&&this.sizeTailPath(w,h,g,r,!1,S,b)),e.classList.contains("media-viewer-media")&&n.classList.add("hiding"),this.toggleWholeActive(!1),setTimeout((()=>{n.style.borderRadius=b,n.firstElementChild&&(n.firstElementChild.style.borderRadius=b)}),r/2),setTimeout((()=>{n.innerHTML="",n.classList.remove("moving","active","hiding"),n.style.cssText="display: none;",C.resolve()}),r),n.classList.remove("opening"),E;{let t,i;const s="video, img, .canvas-thumbnail",a=e.matches(s)?e.parentElement:e,r=Array.from(a.querySelectorAll(s));if(r.length){e=r.pop();const t=document.createElement("canvas"),i=t.getContext("2d");e instanceof HTMLImageElement?(t.width=e.naturalWidth,t.height=e.naturalHeight):e instanceof HTMLVideoElement?(t.width=e.videoWidth,t.height=e.videoHeight):e instanceof HTMLCanvasElement&&(t.width=e.width,t.height=e.height),t.className="canvas-thumbnail thumbnail media-photo",i.drawImage(e,0,0),e=t}if("DIV"===e.tagName||"AVATAR-ELEMENT"===e.tagName){const s=Array.from(e.querySelectorAll("img")).pop();s&&(t=new Image,i=s.src,n.append(t))}else if(e instanceof HTMLImageElement)t=new Image,i=e.src;else if(e instanceof HTMLVideoElement)t=(0,H.Z)(),t.src=e.src;else if(e instanceof SVGSVGElement){const t=e.dataset.clipId,i=t+"-mv",{width:s,height:a}=h,o=document.createElementNS("http://www.w3.org/2000/svg","svg");o.setAttributeNS(null,"width",""+s),o.setAttributeNS(null,"height",""+a),o.setAttributeNS(null,"viewBox",`0 0 ${s} ${a}`),o.setAttributeNS(null,"preserveAspectRatio","xMidYMid meet"),o.insertAdjacentHTML("beforeend",e.firstElementChild.outerHTML.replace(t,i)),o.insertAdjacentHTML("beforeend",e.lastElementChild.outerHTML.replace(t,i));const r=o.firstElementChild,d=r.firstElementChild.firstElementChild;if(d instanceof SVGUseElement){let e,t=d.getAttributeNS(null,"transform");t=t.replace(/translate\((.+?), (.+?)\) scale\((.+?), (.+?)\)/,((e,t,i,n,o)=>`translate(${t=2!=(t=+t)?s-2/g:2/g}, ${a}) scale(${+n/g}, ${+o/v})`)),d.setAttributeNS(null,"transform",t),w=r.firstElementChild.lastElementChild;const i=b.split(" ").map((e=>parseInt(e)));e=S?(0,F.Z)(0,0,s-9/g,a,...i):(0,F.Z)(9/g,0,s-9/g,a,...i),w.setAttributeNS(null,"d",e)}const l=o.lastElementChild;l.setAttributeNS(null,"width",""+h.width),l.setAttributeNS(null,"height",""+h.height),n.prepend(o)}else e instanceof HTMLCanvasElement&&(t=e);f&&(f.style.borderRadius=b,t&&f.append(t)),t=n.querySelector("video, img"),t instanceof HTMLImageElement&&(t.classList.add("thumbnail"),f||(t.style.width=h.width+"px",t.style.height=h.height+"px"),i&&(yield(0,A.cj)(t,i))),n.style.display="",(0,R.T2)((()=>{n.classList.add(o?"moving":"active")}))}return n.classList.add("opening"),yield(0,R.d1)(),n.style.transform=`translate3d(${h.left}px,${h.top}px,0) scale3d(1,1,1)`,c&&(n.style.opacity=""),f&&this.setFullAspect(f,h,l),setTimeout((()=>{n.style.borderRadius="",n.firstElementChild&&(n.firstElementChild.style.borderRadius="")}),0),n.dataset.timeout=""+setTimeout((()=>{n.classList.remove("moving","opening"),f&&(n.querySelector("video"),n.classList.remove("active"),f.style.cssText="",n.offsetLeft),n.classList.add("center","no-transition"),n.classList.add("active"),delete n.dataset.timeout,C.resolve()}),r),w&&this.sizeTailPath(w,h,g,r,!0,S,b),E}))}toggleWholeActive(e){e?this.wholeDiv.classList.add("active"):(this.wholeDiv.classList.add("backwards"),setTimeout((()=>{this.wholeDiv.classList.remove("active")}),0))}setFullAspect(e,t,i){const s=t.width/t.height;let{width:n,height:a}=i;s>0?n=a*s:a=n*s,e.style.cssText=`width: ${n}px; height: ${a}px; transform: scale3d(${t.width/n}, ${t.height/a}, 1);`}sizeTailPath(e,t,i,s,n,a,o){const r=Date.now(),{width:d,height:l}=t;s/=2;const c=o.split(" ").map((e=>parseInt(e))),h=()=>{const t=Date.now()-r;let o=s?t/s:1;o>1&&(o=1),n&&(o=1-o);const u=c.map((e=>e*o));let p;p=a?(0,F.Z)(0,0,d-9/i*o,l,...u):(0,F.Z)(9/i*o,0,d,l,...u),e.setAttributeNS(null,"d",p),t{const a=t?-s.width:i;return e.replace(n,a+"px")}));e.style.transform=n,setTimeout((()=>{e.remove()}),350)}setNewMover(){const e=document.createElement("div");return e.classList.add("media-viewer-mover"),e.style.display="none",this.content.mover?this.content.mover.parentElement.append(e):this.moversContainer.append(e),this.content.mover=e}updateMediaSource(e,t,i){const s=e.tagName.toLowerCase()===i?e:e.querySelector(i);if(s&&!(0,x.Z)(e,"document")){if((0,x.Z)(e,"attachment")){const t=e.parentElement.parentElement.querySelector(".preloader-container");if(t){if("video"===i)return void(t.classList.contains("manual")&&t.click());t.remove()}}s.src!==t&&(0,A.ZP)(s,t),s.classList.contains("thumbnail")&&s.parentElement.classList.contains("media-container-aspecter")&&s.classList.remove("thumbnail")}}setAuthorInfo(e,t){const i=e.isPeerId();let s;if(i)s=(0,W.Z)({peerId:e,dialog:!1,onlyFirstName:!1,plainText:!1});else{const t=s=document.createElement("span");t.append((0,G.Z)(e)),t.classList.add("peer-title")}const n=this.author.avatarEl,a=this.author.avatarEl=n.cloneNode();return Promise.all([this.author.avatarEl.updateWithOptions({peerId:e||U.NM,peerTitle:i?void 0:""+e}),s]).then((([e,i])=>{this.author.avatarEl===a&&((0,D.Z)(this.author.date,(0,T.OD)(t)),(0,D.Z)(this.author.nameEl,i),n.replaceWith(this.author.avatarEl))}))}_openMedia(e,t,i,s,a,r=!1,c=[],h=[],u){return Q(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;const p=this.setAuthorInfo(i,t),f="document"===e._,m=f&&e.mime_type&&(["video","gif"].includes(e.type)||0===e.mime_type.indexOf("video/"));this.isFirstOpen&&(this.isFirstOpen=!1,this.listLoader.setTargets(c,h,r),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 g=this.content.media,v=!a||a===g;v&&(a=g),this.target={element:a};const b=++this.tempId;g.firstElementChild&&(g.innerHTML=""),0!==s?(this.moveTheMover(this.content.mover,1===s),this.setNewMover()):(this.navigationItem={type:"media",onPop:e=>{if(this.setMoverAnimationPromise)return!1;!e&&o.IS_MOBILE_SAFARI&&this.wholeDiv.remove(),this.close()}},k.Z.pushItem(this.navigationItem),this.toggleOverlay(!0),this.setGlobalListeners(),yield p,this.wholeDiv.parentElement||(this.pageEl.insertBefore(this.wholeDiv,document.getElementById("main-columns")),this.wholeDiv.offsetLeft),this.toggleWholeActive(!0));const y=this.content.mover,w=N.Z.width;let S=0;const L=N.Z.height;L<1e6&&!n.Z.isMobile&&(S=120);const E=L-120-S;let I=Promise.resolve();const M=(0,j.Z)(e,g,w,E,!n.Z.isMobile,void 0,!!(f&&e.w&&e.h)).photoSize;if(v){const t=yield this.managers.thumbsStorage.getCacheContext(e,M.type);let i;if(t.downloaded)i=new Image,i.src=t.url;else{const s=(0,z.Z)(e,t,!0);s&&(I=s.loadPromise,i=s.image)}i&&(i.classList.add("thumbnail"),g.append(i))}const P=!(!f||!e.supportsStreaming),Z=P?this.preloaderStreamable:this.preloader,T=(t=(null==M?void 0:M.type))=>this.managers.thumbsStorage.getCacheContext(e,t);let x;if(m){const t=u&&"gif"!==e.type,i=(0,H.Z)({pip:t});this.wholeDiv.classList.contains("no-forwards")&&i.addEventListener("contextmenu",l.Z);const n=()=>this.setMoverToTarget(a,!1,s).then((({onAnimationEnd:s})=>{const n=y.firstElementChild&&y.firstElementChild.classList.contains("media-viewer-aspecter")?y.firstElementChild:y,r=y.querySelector("video");r&&r.remove(),i.setAttribute("playsinline","true"),i.addEventListener("timeupdate",(()=>{this.tempId!==b&&i.pause()})),this.addEventListener("setMoverAfter",(()=>{i.src="",i.load()}),{once:!0}),o.IS_SAFARI&&(i.autoplay=!0),"gif"===e.type?(i.muted=!0,i.autoplay=!0,i.loop=!0):e.duration<60&&(i.loop=!0),n.append(i);const c=new Promise((e=>{i.addEventListener("canplay",e,{once:!0})})),h=()=>{"gif"!==e.type&&(i.dataset.ckin="default",i.dataset.overlay="1",Promise.all([c,s]).then((()=>{this.tempId===b&&((this.videoPlayer=new C({video:i,play:!0,streamable:P,onPlaybackRackMenuToggle:e=>{this.wholeDiv.classList.toggle("hide-caption",!!e)},onPip:e=>{const s=window.appMediaViewer;if(!e&&s&&s!==this)return this.releaseSingleMedia=void 0,void this.close();this.moversContainer.lastElementChild.classList.toggle("hiding",e),this.toggleWholeActive(!e),this.toggleOverlay(!e),this.toggleGlobalListeners(!e),this.navigationItem&&(e?k.Z.removeItem(this.navigationItem):k.Z.pushItem(this.navigationItem)),t&&(e?(this.releaseSingleMedia(!1),this.releaseSingleMedia=void 0,d.Z.setPictureInPicture(i)):this.releaseSingleMedia=d.Z.setSingleMedia(i,u))},onPipClose:()=>{this.close()}})).addEventListener("toggleControls",(e=>{this.wholeDiv.classList.toggle("has-video-controls",e)})),this.addEventListener("setMoverBefore",(()=>{this.wholeDiv.classList.remove("has-video-controls"),this.videoPlayer.cleanup(),this.videoPlayer=void 0}),{once:!0}),this.isZooming&&this.videoPlayer.lockControls(!1))})))};if(P){s.then((()=>{i.readyState{i.addEventListener("canplay",(()=>{Z.detach(),i.parentElement.classList.remove("is-buffering")}),{once:!0})};i.addEventListener("waiting",(()=>{const t=i.networkState===i.NETWORK_LOADING,s=i.readyState{(0,l.Z)(e)})),e()}this.lazyLoadQueue.unshift({load:()=>Q(this,void 0,void 0,(function*(){const r=P?Promise.resolve():K.Z.downloadMediaURL({media:e});return P||s.then((()=>Q(this,void 0,void 0,(function*(){(yield T()).url||Z.attach(y,!0,r)})))),Promise.all([r,s]).then((()=>Q(this,void 0,void 0,(function*(){if(this.tempId!==b)return void this.log.warn("media viewer changed video");const e=(yield T()).url;i.addEventListener("error",(()=>{(0,$.bC)({langPackKey:o.IS_MOBILE?"Video.Unsupported.Mobile":"Video.Unsupported.Desktop"}),4!==i.error.code&&this.log.error("Error "+i.error.code+"; details: "+i.error.message),null==Z||Z.detach()}),{once:!0}),a instanceof SVGSVGElement?n.firstElementChild.lastElementChild.append(i):(0,A.ZP)(i,e),t&&(this.releaseSingleMedia=d.Z.setSingleMedia(i,u),this.addEventListener("setMoverBefore",(()=>{this.releaseSingleMedia&&(this.releaseSingleMedia(),this.releaseSingleMedia=void 0)}),{once:!0})),this.updateMediaSource(a,e,"video"),h()})))),r}))})}));x=I.then(n)}else{const t=()=>this.setMoverToTarget(a,!1,s).then((({onAnimationEnd:t})=>{this.lazyLoadQueue.unshift({load:()=>Q(this,void 0,void 0,(function*(){const i=f?K.Z.downloadMediaURL({media:e}):K.Z.downloadMediaURL({media:e,thumb:M}),s=!f&&e.sizes.slice().filter((e=>e.w));null==s||s.sort(((e,t)=>t.size-e.size));const o=!f&&K.Z.downloadMediaURL({media:e,thumb:null==s?void 0:s[0]});return t.then((()=>Q(this,void 0,void 0,(function*(){(yield T()).url||this.preloader.attachPromise(i)})))),Promise.all([t,i]).then((()=>Q(this,void 0,void 0,(function*(){var e;if(this.tempId!==b)return void this.log.warn("media viewer changed photo");const t=(yield T()).url;if(a instanceof SVGSVGElement)this.updateMediaSource(a,t,"img"),this.updateMediaSource(y,t,"img"),n.Z.isMobile&&y.querySelectorAll("img").forEach((e=>{e.classList.remove("thumbnail")}));else{const i=y.firstElementChild&&y.firstElementChild.classList.contains("media-viewer-aspecter")?y.firstElementChild:y,s=["CANVAS","IMG"].includes(null===(e=i.firstElementChild)||void 0===e?void 0:e.tagName)?i.firstElementChild:null;if((null==s?void 0:s.src)!==t){const e=new Image;e.classList.add("thumbnail"),(0,A.ZP)(e,t,(()=>{(0,R.T2)((()=>{this.updateMediaSource(a,t,"img"),s&&(0,R.T2)((()=>{s.remove()})),i.append(e)}))}),!1),null==o||o.then((t=>{const i=new Image;i.classList.add("thumbnail"),(0,A.ZP)(i,t,(()=>{(0,R.T2)((()=>{e.replaceWith(i)}))}),!1)}))}}})))).catch((e=>{this.log.error(e),this.preloader.attach(y),this.preloader.setManual()})),i}))})}));x=I.then(t)}return this.setMoverPromise=x.catch((()=>{this.setMoverAnimationPromise=null})).finally((()=>{this.setMoverPromise=null}))}))}}},5824:(e,t,i)=>{"use strict";i.d(t,{Z:()=>h});var s=i(410),n=i(4762),a=i(5003),o=i(8799),r=i(3910),d=i(3444),l=i(1655);const c=new class{constructor(){if(this.onPopState=e=>{const t=window.location.hash,i=e.state;if(this.debug&&this.log("popstate",e,this.isPossibleSwipe,t),t!==this.currentHash)if(this.debug&&this.log.warn(`hash changed, new=${t}, current=${this.currentHash}, overridden=${this.overriddenHash}`),i===this.id&&this.overriddenHash&&this.overriddenHash!==t)this.overrideHash(this.overriddenHash);else{if(!i||this.overriddenHash||!t)return this.currentHash=t,void(this.onHashChange&&this.onHashChange());this.overrideHash()}if(i!==this.id&&(this.pushState(),!this.navigations.length))return;const s=this.navigations.pop();s?(this.manual=!this.isPossibleSwipe,this.handleItem(s)):this.pushState()},this.onKeyDown=e=>{const t=this.navigations[this.navigations.length-1];t&&("Escape"!==e.key||t.onEscape&&!t.onEscape()||((0,r.Z)(e),this.back(t.type)))},this.onTouchStart=e=>{e.touches.length>1||(this.debug&&this.log("touchstart"),(0,d.Z)(e)&&(this.isPossibleSwipe=!0,window.addEventListener("touchend",(()=>{setTimeout((()=>{this.isPossibleSwipe=!1}),100)}),{passive:!0,once:!0})))},this.navigations=[],this.id=Date.now(),this.manual=!1,this.log=(0,a.kg)("NC"),this.debug=!0,this.currentHash=window.location.hash,this.overriddenHash="",this.isPossibleSwipe=!1,window.addEventListener("popstate",this.onPopState),window.addEventListener("keydown",this.onKeyDown,{capture:!0,passive:!1}),n.IS_MOBILE_SAFARI){const e={passive:!0};window.addEventListener("touchstart",this.onTouchStart,e)}history.scrollRestoration="manual",this.pushState()}overrideHash(e=""){e&&"#"!==e[0]?e="#"+e:"#"===e&&(e=""),this.currentHash!==e&&(this.overriddenHash=this.currentHash=e,this.replaceState(),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||(0,o.Z)(),this.manual=!1}findItemByType(e){for(let t=this.navigations.length-1;t>=0;--t){const i=this.navigations[t];if(i.type===e)return{item:i,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)}onItemAdded(e){this.debug&&this.log("onItemAdded",e,this.navigations),e.noHistory||this.pushState()}pushItem(e){this.navigations.push(e),this.onItemAdded(e)}unshiftItem(e){this.navigations.unshift(e),this.onItemAdded(e)}spliceItems(e,t,...i){this.navigations.splice(e,t,...i),i.forEach((e=>{this.onItemAdded(e)}))}pushState(){this.debug&&this.log("push"),this.manual=!1,history.pushState(this.id,"")}replaceState(){this.debug&&this.log.warn("replace");const e=location.origin+location.pathname+location.search+this.overriddenHash;history.replaceState(this.id,"",e)}removeItem(e){e&&(0,l.Z)(this.navigations,e)}removeByType(e,t=!1){for(let i=this.navigations.length-1;i>=0&&(this.navigations[i].type!==e||(this.navigations.splice(i,1),!t));--i);}};s.GO.appNavigationController=c;const h=c},5884:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l,z:()=>d});var s=i(4277),n=i(8805),a=i(5565),o=i(2325),r=i(3512);class d{constructor(e,t,i=!0,n,a=!0,r=!0,d,l){this.name=e,this.type=t,this.clearable=i,this.autonomous=r,this.onFound=d,this.noIcons=l,this.list=s.default.createChatList(),this.container=document.createElement("div"),n&&(this.container.className=n),e&&(this.nameEl=document.createElement("div"),this.nameEl.classList.add("search-group__name"),"string"==typeof e&&this.nameEl.append((0,o.ag)(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",a&&s.default.setListClickListener(this.list,d,void 0,r)}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 l{constructor(e,t,i,s,a){this.container=e,this.searchInput=t,this.searchGroups=i,this.onSearch=s,this.noIcons=a,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 n.ZP(this.container),this.listsContainer=this.scrollable.container;for(const 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(const e in this.searchGroups)this.searchGroups[e].clear();this.searchPromise=null}beginSearch(e,t=0,i=""){this.peerId=e,this.threadId=t,this.query!==i&&(this.searchInput.inputField.value=i),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=r.Z.managers.appMessagesManager.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:i,history:n}=t;n.length&&n[0].mid===this.minMsgId&&n.shift();const r=this.searchGroups.messages;n.forEach((t=>{try{const i=this.peerId?t.fromId:t.peerId;s.default.addDialogAndSetLastMessage({peerId:i,container:this.scrollable,avatarSize:"bigger",meAsSaved:!1,message:t,query:e,noIcons:this.noIcons})}catch(e){console.error("[appSearch] render search result",e)}})),r.toggle(),this.minMsgId=n.length&&n[n.length-1].mid,-1===this.loadedCount&&(this.loadedCount=0),this.loadedCount+=n.length,-1===this.foundCount&&(this.foundCount=i,r.nameEl&&(0,a.Z)(r.nameEl,(0,o.ag)(i?"Chat.Search.MessagesFound":"Chat.Search.NoMessagesFound",[i])),this.onSearch&&this.onSearch(this.foundCount))})).catch((e=>{console.error("search error",e),this.searchPromise=null}))}}},6360:(e,t,i)=>{"use strict";i.d(t,{Z:()=>fe});var s=i(4277),n=i(5003),a=i(3512),o=i(5884),r=i(6008),d=i(2153),l=i(279),c=i(1405),h=i(8805),u=i(8594),p=i(2325),f=i(8497),m=i(3624),g=i(2894),v=i(4668),b=i(4332),y=i(4755),w=i(9322),S=i(4484),C=i(467),L=i(5432),E=i(1154),I=i(241),M=i(6272),P=i(3003),Z=i(4524),T=i(5128),k=i(7479),x=i(5705),A=i(6054),_=i(3910),F=i(2738),D=i(1784),R=i(8479),B=i(7401),N=i(5953),O=i(3738),U=i(4064),H=i(130),z=i(7030),j=i(2498),G=i(1336),V=i(5798),K=i(2342),W=i(2491),$=i(5400),q=i(5671),Y=i(1604),Q=i(7530),X=i(6566),J=i(177),ee=i(3061),te=i(2566),ie=i(6976),se=i(3416),ne=i(1483),ae=i(3855),oe=i(3699),re=i(296),de=i(9492),le=i(2887),ce=i(319),he=i(6131),ue=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class pe{constructor(e,t,i){this.attachTo=e,this.searchSuper=t,this.listenerSetter=i,this.onGotoClick=()=>{w.ZP.setInnerPeer({peerId:this.peerId,lastMsgId:this.mid,threadId:this.searchSuper.searchContext.threadId})},this.onForwardClick=()=>{this.searchSuper.selection.isSelecting?(0,F.tH)(this.searchSuper.selection.selectionForwardBtn):new Z.Z({[this.peerId]:[this.mid]})},this.onSelectClick=()=>{this.searchSuper.selection.toggleByElement(this.target)},this.onClearSelectionClick=()=>{this.searchSuper.selection.cancelSelection()},this.onDeleteClick=()=>{this.searchSuper.selection.isSelecting?(0,F.tH)(this.searchSuper.selection.selectionDeleteBtn):new T.Z(this.peerId,[this.mid],"chat")},this.managers=t.managers;L.Z||(0,ie.E)({element:e,callback:e=>{let i;this.init&&(this.init(),this.init=null);try{i=(0,f.Z)(e.target,"search-super-item")}catch(e){}if(i){if(e instanceof MouseEvent&&e.preventDefault(),this.element.classList.contains("active"))return!1;e instanceof MouseEvent&&(e.cancelBubble=!0),(()=>{ue(this,void 0,void 0,(function*(){this.target=i,this.peerId=i.dataset.peerId.toPeerId(),this.mid=+i.dataset.mid,this.isSelected=t.selection.isMidSelected(this.peerId,this.mid),yield Promise.all(this.buttons.map((e=>ue(this,void 0,void 0,(function*(){let t;t=!(this.isSelected&&!e.withSelection)&&(!e.verify||(yield e.verify())),e.element.classList.toggle("hide",!t)}))))),i.classList.add("menu-open"),(0,ne.Z)(e,this.element),se.Z.openBtnMenu(this.element,(()=>{i.classList.remove("menu-open")}))}))})()}},listenerSetter:i})}init(){this.buttons=[{icon:"forward",text:"Forward",onClick:this.onForwardClick,verify:()=>ue(this,void 0,void 0,(function*(){return this.managers.appMessagesManager.canForward(yield this.managers.appMessagesManager.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:()=>ue(this,void 0,void 0,(function*(){return this.managers.appMessagesManager.canDeleteMessage(yield this.managers.appMessagesManager.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=(0,P.b)({buttons:this.buttons,listenerSetter:this.listenerSetter}),this.element.classList.add("search-contextmenu","contextmenu"),document.getElementById("page-chats").append(this.element)}}class fe{constructor(e){this.tabs={},this.prevTabId=-1,this.lazyLoadQueue=new d.Z,this.middleware=(0,m.k)(),this.historyStorage={},this.usedFromHistory={},this.loadMutex=Promise.resolve(),this.nextRates={},this.loadPromises={},this.loaded={},this.loadedChats=!1,this.firstLoad=!0,this.log=(0,n.kg)("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")},(0,N.Z)(this,e),this.container=document.createElement("div"),this.container.classList.add("search-super"),this.listenerSetter=new oe.Z,this.searchContextMenu=new pe(this.container,this,this.listenerSetter),this.selection=new A.e(this,this.managers,this.listenerSetter);const t=this.navScrollableContainer=document.createElement("div");t.classList.add("search-super-tabs-scrollable","menu-horizontal-scrollable","sticky");const i=this.navScrollable=new h.v7(t);i.container.classList.add("search-super-nav-scrollable");const s=this.nav=document.createElement("nav");s.classList.add("search-super-tabs","menu-horizontal-div"),this.tabsMenu=s,i.container.append(s);for(const e of this.mediaTabs){const t=document.createElement("div");t.classList.add("menu-horizontal-div-item");const i=document.createElement("span"),s=document.createElement("i");i.append((0,p.ag)(e.name)),i.append(s),t.append(i),(0,c.Z)(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"),L.Z&&(this.swipeHandler=(0,E.Z)({element:this.tabsContainer,onSwipe:(e,t,i)=>{e*=-1;const s=this.selectTab.prevId(),n=Array.from(this.tabsMenu.children);let o;if(e>0){for(let e=s+1;e=0;--e)if(!n[e].classList.contains("hide")){o=e;break}void 0!==o&&(a=function(e){const t=e=>{(0,_.Z)(e)};let i=2;const s=()=>{--i||e.removeEventListener("touchmove",t,{capture:!0})};return e.addEventListener("touchmove",t,{capture:!0,passive:!1}),e.addEventListener("touchend",s,{once:!0}),s}(this.tabsContainer),this.selectTab(o))},verifyTouchTarget:e=>!(0,f.Z)(e.target,"scrollable-x")}));for(const e of this.mediaTabs){const t=document.createElement("div");t.classList.add("search-super-container-"+e.type,"tabs-tab");const i=document.createElement("div");i.classList.add("search-super-content-"+e.type),t.append(i),this.tabsContainer.append(t),this.tabs[e.inputFilter]=i,e.contentTab=i}this.container.append(t,this.tabsContainer),this.searchGroupMedia=new o.z(!1,"messages",!0),this.scrollable.onScrolledBottom=()=>{this.mediaTab.contentTab&&this.canLoadMediaTab(this.mediaTab)&&this.load(!0)},this.selectTab=(0,r.X)(this.tabsMenu,this.tabsContainer,((e,t,i)=>{if(this.prevTabId===e&&!this.skipScroll)return void this.scrollable.scrollIntoViewNew({element:this.container,position:"start",startCallback:this.scrollStartCallback});const s=this.mediaTabs[e];this.onChangeTab&&this.onChangeTab(s);const n=this.mediaTab;if(this.mediaTab=s,-1!==this.prevTabId&&i&&this.onTransitionStart(),this.skipScroll)this.skipScroll=!1;else{const e=this.container.offsetTop;let t=this.scrollable.scrollTop;if(tn&&(s.scroll={scrollTop:n,scrollHeight:0})}if(s.scroll){const e=n.scroll.scrollTop-s.scroll.scrollTop;e&&(s.contentTab.style.transform=`translateY(${e}px)`)}}-1===this.prevTabId||s.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,i,this.listenerSetter),(0,F.fc)(this.tabsContainer,(e=>{this.selection.isSelecting&&((0,_.Z)(e),this.selection.toggleByElement((0,f.Z)(e.target,"search-super-item")))}),{capture:!0,passive:!1,listenerSetter:this.listenerSetter});const l=(e,t,i,s)=>ue(this,void 0,void 0,(function*(){const n=(0,f.Z)(s.target,e);if(!n)return;const a=+n.dataset.mid;if(!a)return void this.log.warn("no messageId by click on target:",n);const o=n.querySelector(".media-spoiler-container");if(o)return void(0,he.kN)({event:s,mediaSpoiler:o});const r=n.dataset.peerId.toPeerId(),d=Array.from(this.tabs[i].querySelectorAll("."+t)).map((t=>{const i=(0,f.Z)(t,e);return{element:t,mid:+i.dataset.mid,peerId:i.dataset.peerId.toPeerId()}})),l=d.findIndex((e=>e.mid===a&&e.peerId===r)),c=yield this.managers.appMessagesManager.getMessageByPeer(r,a);(new D.Z).setSearchContext(this.copySearchContext(i)).openMedia(c,d[l].element,0,!1,d.slice(0,l),d.slice(l+1))}));(0,F.fc)(this.tabs.inputMessagesFilterPhotoVideo,l.bind(null,"grid-item","grid-item","inputMessagesFilterPhotoVideo"),{listenerSetter:this.listenerSetter}),(0,F.fc)(this.tabs.inputMessagesFilterDocument,l.bind(null,"document-with-thumb","media-container","inputMessagesFilterDocument"),{listenerSetter:this.listenerSetter}),this.mediaTab=this.mediaTabs[0],(0,u.ZP)((()=>{this.lazyLoadQueue.lock()}),(()=>{this.lazyLoadQueue.unlockAndRefresh()}),this.listenerSetter)}filterMessagesByType(e,t){return(0,X.Z)(t,e,e.length)}processEmptyFilter({message:e,searchGroup:t}){const i=[],n=s.default.addDialogNew({peerId:e.peerId,container:t.list,avatarSize:"bigger",loadPromises:i}),a=s.default.setLastMessageN({dialog:{_:"dialog",peerId:e.peerId},lastMessage:e,dialogElement:n,highlightWord:this.searchContext.query});return i.push(a),Promise.all(i).then(ce.Z)}processPhotoVideoFilter({message:e,promises:t,middleware:i}){return ue(this,void 0,void 0,(function*(){const s=(0,Q.Z)(e),n=document.createElement("div");let a;n.classList.add("grid-item");const o=(0,z.Z)(s,200,200);if(a="photo"!==s._?yield(yield(0,le.Z)({doc:s,message:e,container:n,boxWidth:0,boxHeight:0,lazyLoadQueue:this.lazyLoadQueue,middleware:i,onlyPreview:!0,withoutPreloader:!0,noPlayButton:!0,photoSize:o})).thumb:yield(0,de.Z)({photo:s,message:e,container:n,boxWidth:0,boxHeight:0,lazyLoadQueue:this.lazyLoadQueue,middleware:i,withoutPreloader:!0,noBlur:!0,size:o}),e.media.pFlags.spoiler){const e=yield(0,he.ZP)({animationGroup:"chat",media:s,middleware:i,width:140,height:140,multiply:.3});n.append(e)}return[a.images.thumb,a.images.full].filter(Boolean).forEach((e=>{e.classList.add("grid-item-media")})),t.push(a.loadPromises.thumb),{element:n,message:e}}))}processDocumentFilter({message:e,inputFilter:t}){return ue(this,void 0,void 0,(function*(){const i=(0,Q.Z)(e),s=this.showSender||["voice","round"].includes(i.type),n=yield(0,re.Z)({message:e,withTime:!s,fontWeight:400,voiceAsMusic:!0,showSender:s,searchContext:this.copySearchContext(t),lazyLoadQueue:this.lazyLoadQueue,autoDownloadSize:0,getSize:()=>320});return["audio","voice","round"].includes(i.type)&&n.classList.add("audio-48"),{message:e,element:n}}))}processUrlFilter({message:e,promises:t,middleware:i}){var s;return ue(this,void 0,void 0,(function*(){let n=null===(s=e.media)||void 0===s?void 0:s.webpage;if(!n){const t=e.totalEntities?e.totalEntities.find((e=>"messageEntityUrl"===e._||"messageEntityTextUrl"===e._)):null;let i,s,a;if(t)a=e.message.slice(t.offset,t.offset+t.length);else{const t=(0,K.Z)(e.message);if(!t)return;i=t[0]}i="messageEntityTextUrl"===(null==t?void 0:t._)?t.url:i||a,s=i;const o=e.message===i;i.match(/^(ftp|http|https):\/\//)||(s="https://"+i,i=i.includes("@")?i:"https://"+i),s=new URL(s).hostname,n={_:"webPage",url:i,display_url:s,id:"",hash:0},o||(n.description=e.message)}if("webPageEmpty"===n._)return;const a=document.createElement("div");a.classList.add("preview"),n.photo?(0,de.Z)({container:a,message:null,photo:n.photo,boxWidth:0,boxHeight:0,withoutPreloader:!0,lazyLoadQueue:this.lazyLoadQueue,middleware:i,size:(0,z.Z)(n.photo,60,60,!1),loadPromises:t,noBlur:!0}):(a.classList.add("empty"),(0,H.Z)(a,(0,V.Z)(n.title||n.display_url||n.description||n.url,!0)));const o=(0,G.Z)(n),r=(0,j.Z)(n),d=(0,x.Z)((0,$.ZP)(n.url||"")).firstElementChild;if(d instanceof HTMLAnchorElement)try{d.innerText=decodeURIComponent(d.href)}catch(e){}r.firstChild&&r.append("\n"),r.append(d),this.showSender&&r.append("\n",yield(0,q.Z)(e)),o.textContent||o.append((0,W.Z)(n.display_url.split("/",1)[0]));const l=new k.ZP({title:o,titleRight:(0,Y.Z)(e),subtitle:r,havePadding:!0,clickable:!0,noRipple:!0});return l.applyMediaElement(a,"big"),l.container.innerText.trim().length?{message:e,element:l.container}:void 0}))}performSearchResult(e,t,i=!0){return ue(this,void 0,void 0,(function*(){const s=[],n=t.contentTab,a=[],o=this.middleware.get();let r,d=t.inputFilter;yield(0,u.e9)(),"inputMessagesFilterPhotoVideo"===d&&this.searchContext.query.trim()?(d="inputMessagesFilterEmpty",r=this.searchGroupMedia,n.append(r.container)):"inputMessagesFilterEmpty"===d&&(r=this.searchGroups.messages);const l={elemsToAppend:s,inputFilter:d,message:void 0,middleware:o,promises:a,searchGroup:r};let c;switch(d){case"inputMessagesFilterEmpty":c=this.processEmptyFilter;break;case"inputMessagesFilterPhotoVideo":c=this.processPhotoVideoFilter;break;case"inputMessagesFilterVoice":case"inputMessagesFilterRoundVoice":case"inputMessagesFilterMusic":case"inputMessagesFilterDocument":c=this.processDocumentFilter;break;case"inputMessagesFilterUrl":c=this.processUrlFilter}if(c){c=c.bind(this);const t=e.map((e=>ue(this,void 0,void 0,(function*(){try{return l.message=e,yield c(l)}catch(t){this.log.error("error rendering filter",d,l,e,t)}})))),i=(yield Promise.all(t)).filter(Boolean);s.push(...i)}if(r&&r.list.childElementCount&&r.setActive(),this.loadMutex&&a.push(this.loadMutex),!a.length||(yield Promise.all(a),o())){if(s.length){const e=i?"append":"prepend";s.forEach((t=>{var i;const{element:s,message:n}=t,a=this.getMonthContainerByTimestamp(this.groupByMonth?n.date:0,d);s.classList.add("search-super-item"),s.dataset.mid=""+n.mid,s.dataset.peerId=""+n.peerId,a.items[e](s),(null===(i=this.selection)||void 0===i?void 0:i.isSelecting)&&this.selection.toggleElementCheckbox(s,!0)}))}this.afterPerforming("inputMessagesFilterEmpty"===d?1:s.length,n)}}))}afterPerforming(e,t){if(t){const i=t.parentElement;if(Array.from(i.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"),i.append(e)}}}loadChats(){const e=new Set,t=this.middleware.get();for(const e in this.searchGroups){const t=this.searchGroups[e];this.tabs.inputMessagesFilterEmpty.append(t.container),t.clear()}const i=this.searchContext.query;if(i){const n=(t,n,o=!1)=>{t.map((t=>{if(e.has(t))return;e.add(t);const{dom:i}=s.default.addDialogNew({peerId:t,container:n.list,avatarSize:"abitbigger",autonomous:n.autonomous});return{dom:i,peerId:t}})).filter(Boolean).forEach((({dom:e,peerId:t})=>ue(this,void 0,void 0,(function*(){const s=yield this.managers.appPeersManager.getPeer(t);if(o&&(s.participants_count||s.participants)){const s=new RegExp(`(${(0,O.Z)(i)}|${(0,O.Z)((0,C.ZP)(i))})`,"gi");e.titleSpan.innerHTML=e.titleSpan.innerHTML.replace(s,"$1"),e.lastMessageSpan.append(yield(0,J.Z)(t.toChatId()))}else if(t===a.Z.myId)e.lastMessageSpan.append((0,p.ag)("Presence.YourChat"));else{let i=yield this.managers.appPeersManager.getPeerUsername(t);if(i)i="@"+i;else{const e=yield this.managers.appUsersManager.getUser(t);e&&e.phone&&(i="+"+(0,M.u)(e.phone).formatted)}e.lastMessageSpan.textContent=i}})))),n.toggle()},o=e=>{if(t())return e};return Promise.all([this.managers.appUsersManager.getContactsPeerIds(i,!0,void 0,10).then(o).then((e=>{e&&n(e,this.searchGroups.contacts,!0)})),this.managers.appUsersManager.searchContacts(i,20).then(o).then((e=>{if(e&&(n(e.my_results,this.searchGroups.contacts,!0),n(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 p.ZP.IntlElement({key:"Separator.ShowMore"});e.append(t.element),this.searchGroups.globalContacts.nameEl.append(e),(0,F.fc)(e,(()=>{const e=this.searchGroups.globalContacts.container.classList.toggle("is-short");t.key=e?"Separator.ShowMore":"Separator.ShowLess",t.update()}))}})),this.managers.dialogsStorage.getDialogs({query:i,offsetIndex:0,limit:20,filterId:0}).then(o).then((e=>{e&&n(e.dialogs.map((e=>e.peerId)),this.searchGroups.contacts,!0)}))])}if(this.searchContext.peerId||this.searchContext.minDate)return Promise.resolve();{const e=(e=!0)=>ae.Z.getState().then((i=>{t()&&(this.searchGroups.recent.list.replaceChildren(),i.recentSearch.slice(0,20).forEach((e=>ue(this,void 0,void 0,(function*(){const{dom:t}=s.default.addDialogNew({peerId:e,container:this.searchGroups.recent.list,meAsSaved:!0,avatarSize:"abitbigger",autonomous:!0});t.lastMessageSpan.append(yield e.isUser()?(0,ee.Z)(yield this.managers.appUsersManager.getUser(e.toUserId())):(0,J.Z)(e.toChatId()))})))),i.recentSearch.length?e&&this.searchGroups.recent.setActive():this.searchGroups.recent.clear())}));return Promise.all([this.managers.appUsersManager.getTopPeers("correspondents").then((e=>{if(!t())return;const i=e.findIndex((e=>e.id===a.Z.myId));-1!==i&&(e=e.slice()).splice(i,1),e.forEach((e=>{const{dom:t}=s.default.addDialogNew({peerId:e.id,container:this.searchGroups.people.list,onlyFirstName:!0,avatarSize:"bigger",autonomous:!1,noIcons:this.searchGroups.people.noIcons});t.subtitleEl.remove()})),this.searchGroups.people.toggle()})),e()])}}loadMembers(e){return ue(this,void 0,void 0,(function*(){const t=this.searchContext.peerId.toChatId(),i=this.middleware.get();let n;const a=t=>ue(this,void 0,void 0,(function*(){if(this.loadMutex&&(yield this.loadMutex,!i()))return;let n=this.membersList;n||(n=new g.Z({lazyLoadQueue:this.lazyLoadQueue,rippleEnabled:!1,managers:this.managers}),(0,F.fc)(n.list,(e=>{const t=(0,v.Z)(e.target,s.DIALOG_LIST_ELEMENT_TAG);if(!t)return;const i=t.dataset.peerId.toPeerId();let n=Promise.resolve();y.Z.isMobile&&(n=b.ZP.toggleSidebar(!1)),n.then((()=>{w.ZP.setInnerPeer({peerId:i})}))})),e.contentTab.append(n.list),this.afterPerforming(1,e.contentTab));for(const e of t){const t=(0,te.Z)(e);if(t.isAnyChat())continue;const s=yield this.managers.appUsersManager.getUser(t);if(!i())return;s.pFlags.deleted||n.add(t)}}));if(yield this.managers.appChatsManager.isChannel(t)){const s=this.membersList?200:50;n=this.managers.appProfileManager.getChannelParticipants(t,void 0,s,this.nextRates[e.inputFilter]).then((t=>{if(!i())return;const n=e.contentTab.firstElementChild;return this.nextRates[e.inputFilter]=(n?n.childElementCount:0)+t.participants.length,t.participants.length{if(!i())return;this.loaded[e.inputFilter]=!0;const s=t.participants;return"chatParticipantsForbidden"!==s._?a(s.participants):void 0}));return this.loadPromises[e.inputFilter]=n.finally((()=>{i()&&(this.loadPromises[e.inputFilter]=null)}))}))}loadType(e,t,i,s){var n,a;const o=e.inputFilter;if(this.loadPromises[o])return this.loadPromises[o];if("members"===e.type)return this.loadMembers(e);const r=null!==(n=(a=this.historyStorage)[o])&&void 0!==n?n:a[o]=[];if(!("inputMessagesFilterEmpty"!==o||r.length||(this.loadedChats||(this.loadChats(),this.loadedChats=!0),this.searchContext.query.trim()||this.searchContext.peerId||this.searchContext.minDate)))return this.loaded[o]=!0,Promise.resolve();const d=this.loadPromises[o]=Promise.resolve().then((()=>ue(this,void 0,void 0,(function*(){var n,a;if(r.length&&this.usedFromHistory[o]this.managers.appMessagesManager.getMessageByPeer(e.peerId,e.mid))));t.push(...this.filterMessagesByType(a,o))}while(n{setTimeout((()=>{this.scrollable.checkForTriggers()}),0)}))}const l=r.length?r[r.length-1].mid:0,c=yield this.managers.appMessagesManager.getSearch(Object.assign(Object.assign({},this.searchContext),{inputFilter:{_:o},maxId:l,limit:i,nextRate:null!==(n=(a=this.nextRates)[o])&&void 0!==n?n:a[o]=0}));if(r.push(...c.history.map((e=>({mid:e.mid,peerId:e.peerId})))),s()&&((c.history.length{setTimeout((()=>{if(s()&&this.mediaTab===e){const e=this.load(!0,!0);e&&e.then((()=>{s()&&setTimeout((()=>{this.scrollable.checkForTriggers()}),0)}))}}),0)})),this.performSearchResult(this.filterMessagesByType(c.history,o),e)})))).catch((e=>{this.log.error("load error:",e)})).finally((()=>{this.loadPromises[o]=null}));return d}canLoadMediaTab(e){const t=e.inputFilter;return!this.loaded[t]||this.historyStorage[t]&&this.usedFromHistory[t]"inputMessagesFilterEmpty"!==e.inputFilter)),n=s.map((e=>({_:e.inputFilter}))),[a,o]=yield Promise.all([this.managers.appMessagesManager.getSearchCounters(t,n,void 0,i),this.canViewMembers()]);if(!e())return;if(this.loadMutex&&(yield this.loadMutex,!e()))return;let r,d=0;s.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===r&&(r=e),++d)}));const l=this.mediaTabsMap.get("members");l.menuTab.classList.toggle("hide",!o),o&&(r=l,++d),this.container.classList.toggle("hide",!r),this.container.parentElement.classList.toggle("search-empty",!r),r&&(this.skipScroll=!0,this.selectTab(this.mediaTabs.indexOf(r),!1),this.navScrollableContainer.classList.toggle("hide",d<=1))}))}load(e=!1,t=!1){var i;return ue(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(yield null!==(i=this.loadFirstTimePromise)&&void 0!==i?i:this.loadFirstTimePromise=this.loadFirstTime(),!n())return;this.loadFirstTimePromise=void 0,this.firstLoad=!1}let a=e?[this.mediaTab]:this.mediaTabs.filter((e=>e!==this.mediaTab));if(a=a.filter((e=>this.canLoadMediaTab(e))),s.isUser()&&(0,U.Z)(a,(e=>"members"===e.type)),!a.length)return;const o=t?50:Math.round(3*(I.Z.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 i;const s=new Date(1e3*e);s.setHours(0,0,0),s.setDate(1);const n=s.getTime(),a=null!==(i=this.monthContainers[t])&&void 0!==i?i:this.monthContainers[t]={};if(!(n in a)){const e=document.createElement("div");e.className="search-super-month";const i=document.createElement("div");i.classList.add("search-super-month-name");const o={month:"long"};s.getFullYear()!==(new Date).getFullYear()&&(o.year="numeric");const r=new p.ZP.IntlDateElement({date:s,options:o}).element;i.append(r),e.append(i);const d=document.createElement("div");d.classList.add("search-super-month-items"),e.append(i,d);const l=(0,B.Z)(a,"desc");let c=0;for(;cl[c]);++c);a[n]={container:e,items:d},(0,S.Z)(e,this.tabs[t],c)}return a[n]}canViewMembers(){const{peerId:e}=this.searchContext;if(!e.isAnyChat())return Promise.resolve(!1);const t=e.toChatId();return Promise.all([this.managers.appChatsManager.isBroadcast(t),this.managers.appChatsManager.hasRights(t,"view_participants"),this.managers.appChatsManager.isForum(t)]).then((([e,t,i])=>!e&&t&&(!this.searchContext.threadId||!i)))}cleanup(){var e;this.loadPromises={},this.loaded={},this.loadedChats=!1,this.nextRates={},this.firstLoad=!0,this.prevTabId=-1,this.lazyLoadQueue.clear(),this.mediaTabs.forEach((e=>{this.usedFromHistory[e.inputFilter]=-1})),(null===(e=this.selection)||void 0===e?void 0:e.isSelecting)&&this.selection.cancelSelection(),this.middleware.clean(),this.loadFirstTimePromise=void 0,this.cleanScrollPositions(),this.membersList=void 0}cleanScrollPositions(){this.mediaTabs.forEach((e=>{e.scroll=void 0}))}cleanupHTML(e=!1){this.mediaTabs.forEach((e=>{if(e.contentTab.replaceChildren(),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")||(0,l.y)(t,!0);const i=t.querySelector(".content-empty");i&&i.remove()}})),this.monthContainers={},this.searchGroupMedia.clear(),this.scrollable.scrollTop=0}copySearchContext(e){const t=(0,R.Z)(this.searchContext);return t.inputFilter={_:e},t.nextRate=this.nextRates[e],t}setQuery({peerId:e,query:t,threadId:i,historyStorage:s,folderId:n,minDate:a,maxDate:o}){this.searchContext={peerId:e,query:t||"",inputFilter:{_:this.mediaTab.inputFilter},threadId:i,folderId:n,minDate:a,maxDate:o},this.historyStorage=null!=s?s:{},this.cleanup()}destroy(){var e,t;this.cleanup(),this.listenerSetter.removeAll(),this.scrollable.destroy(),null===(e=this.swipeHandler)||void 0===e||e.removeListeners(),null===(t=this.selection)||void 0===t||t.cleanup(),this.scrollStartCallback=void 0,this.onChangeTab=void 0,this.selectTab=void 0,this.searchContextMenu=void 0,this.swipeHandler=void 0,this.selection=void 0}}},5644:(e,t,i)=>{"use strict";i.d(t,{Z:()=>A});var s=i(4277),n=i(3512),a=i(8805),o=i(4789),r=i(9807),d=i(2325),l=i(8763),c=i(8497),h=i(8842),u=i(3910),p=i(5565),f=i(5701),m=i(241),g=i(2738),v=i(6690),b=i(1655),y=i(5953),w=i(4064),S=i(9331),C=i(2353),L=i(2566),E=i(177),I=i(3061),M=i(8493),P=i(7120),Z=i(8050),T=i(36),k=i(5029),x=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class A{constructor(e){this.container=document.createElement("div"),this.list=s.default.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="abitbigger",this.exceptSelf=!1,this.tempIds={},this.selfPresence="Presence.YourChat",this.needSwitchList=!1,this.design="round",this.onInput=()=>{const e=this.input.value;if(this.query!==e){(this.peerType.includes("contacts")||this.peerType.includes("dialogs"))&&(this.cachedContacts=void 0),this.peerType.includes("dialogs")&&(this.folderId=0,this.offsetIndex=0);for(const e in this.tempIds)++this.tempIds[e];this.list=s.default.createChatList(),this.promise=void 0,this.loadedWhat={},this.query=e,this.renderedPeerIds.clear(),this.needSwitchList=!0,this.getMoreResults()}},this.checkForTriggers=()=>{this.scrollable.checkForTriggers()},(0,y.Z)(this,e),this.container.classList.add("selector","selector-"+this.design);const t=(this.renderResultsFunc||this.renderResults).bind(this);if(this.renderResultsFunc=e=>x(this,void 0,void 0,(function*(){return 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=yield(0,C.Z)(e,(e=>x(this,void 0,void 0,(function*(){if(e.isPeerId()&&(yield this.managers.appPeersManager.getPeer(e)))for(const t of this.filterPeerTypeBy)if(yield this.managers.appPeersManager[t](e))return!0;return!0}))))),t(e)})),this.input=document.createElement("input"),this.input.classList.add("selector-search-input"),this.placeholder?(0,d.$d)(this.input,this.placeholder,void 0,"placeholder"):(0,d.$d)(this.input,"SendMessageTo",void 0,"placeholder"),this.input.type="text",this.multiSelect){const e=new k.Z({});e.innerContainer.classList.add("selector-search-section");const 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 a.ZP(t),(0,g.fc)(this.selectedContainer,(e=>{if(this.freezed)return;let t=e.target;if(t=(0,c.Z)(t,"selector-user"),!t)return;const i=t.dataset.key,s=this.chatsContainer.querySelector('[data-peer-id="'+i+'"]');s?(0,g.tH)(s):this.remove(i.toPeerId())})),e.content.append(t),this.container.append(e.container)}this.chatsContainer.classList.add("chatlist-container");const i=new k.Z({name:this.sectionNameLangPackKey,noShadow:!0});i.content.append(this.list),this.chatsContainer.append(i.container),this.scrollable=new a.ZP(this.chatsContainer),this.scrollable.setVirtualContainer(this.list),(0,g.fc)(this.chatsContainer,(e=>{const t=(0,l.Z)(e.target,"data-peer-id");if((0,u.Z)(e),!t)return;if(this.freezed)return;let i=t.dataset.peerId;if(i=i.isPeerId()?i.toPeerId():i,!this.multiSelect)return void this.add(i);this.selected.has(i)?this.remove(i):this.add(i);const s=t.querySelector("input");s.checked=!s.checked}));const n=(0,f.Z)(this.onInput,200,!1,!0);this.input.addEventListener("input",n),this.scrollable.onScrolledBottom=()=>{this.getMoreResults()},this.scrollable.container.prepend((0,T.G)()),this.container.append(this.chatsContainer),this.appendTo.append(this.container),setTimeout((()=>{const t=this.getMoreResults();e.onFirstRender&&t.then((()=>{e.onFirstRender()}))}),0)}renderSaved(){return x(this,void 0,void 0,(function*(){this.exceptSelf||this.offsetIndex||0!==this.folderId||!this.peerType.includes("dialogs")||this.query&&!(yield this.managers.appUsersManager.testSelfSearch(this.query))||(yield this.renderResultsFunc([n.Z.myId]))}))}getTempId(e){var t,i;null!==(t=(i=this.tempIds)[e])&&void 0!==t||(i[e]=0);const s=++this.tempIds[e];return{tempId:s,middleware:()=>this.tempIds[e]===s}}getMoreDialogs(){return x(this,void 0,void 0,(function*(){if(this.loadedWhat.dialogs&&this.loadedWhat.archived)return;const e=m.Z.height/56*1.25|0,{middleware:t}=this.getTempId("dialogs"),i=this.managers.dialogsStorage.getDialogs({query:this.query,offsetIndex:this.offsetIndex,limit:e,filterId:this.folderId,skipMigrated:!0});i.catch((()=>{t()&&(this.loadedWhat[this.loadedWhat.dialogs?"archived":"dialogs"]=!0)}));const s=yield i;if(!t())return;let a=s.dialogs;if(a.length){const e=(0,Z.Z)(a[a.length-1])||0;if(a=a.slice(),(0,w.Z)(a,(e=>e.peerId===n.Z.myId)),this.chatRightsAction&&(a=yield(0,C.Z)(a,(e=>this.filterByRights(e.peerId))),!t()))return;if(yield this.renderSaved(),!t())return;this.offsetIndex=e}if(this.renderResultsFunc(a.map((e=>e.peerId))),s.isEnd){if(!this.loadedWhat.dialogs){if(yield this.renderSaved(),!t())return;return 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 x(this,void 0,void 0,(function*(){const t=yield this.managers.appPeersManager.getPeer(e);return e.isUser()?"send_messages"!==this.chatRightsAction||(0,M.Z)(t):!!(0,P.Z)(t,this.chatRightsAction)||void 0}))}getMoreContacts(){return x(this,void 0,void 0,(function*(){if(this.loadedWhat.contacts)return;const e=this.peerType.includes("contacts");if(!this.cachedContacts){const{middleware:t}=this.getTempId("contacts"),i=Promise.all([e?this.managers.appUsersManager.getContactsPeerIds(this.query):[],this.query?this.managers.appUsersManager.searchContacts(this.query):void 0]);i.catch((()=>{t()&&(this.loadedWhat.contacts=!0)}));const[s,a]=yield i;if(!t())return;if(a){let i=e?a.my_results.concat(a.results):a.my_results;if(this.chatRightsAction&&(i=yield(0,C.Z)(i,(e=>this.filterByRights(e))),!t()))return;this.peerType.includes("dialogs")||(i=i.filter((e=>e.isUser()))),this.cachedContacts=(0,v.Z)(s.concat(i))}else this.cachedContacts=s.slice();(0,b.Z)(this.cachedContacts,n.Z.myId)}const t=m.Z.height/56*1.25|0,i=this.cachedContacts.splice(0,t);this.renderResultsFunc(i),this.cachedContacts.length||(this.loadedWhat.contacts=!0)}))}getMoreChannelParticipants(){return x(this,void 0,void 0,(function*(){if(this.loadedWhat.channelParticipants)return;const{middleware:e}=this.getTempId("channelParticipants"),t=this.managers.appProfileManager.getChannelParticipants(this.peerId.toChatId(),{_:"channelParticipantsSearch",q:this.query},50,this.list.childElementCount);t.catch((()=>{e()&&(this.loadedWhat.channelParticipants=!0)}));const i=yield t;if(!e())return;const s=i.participants.map((e=>(0,L.Z)(e)));(0,b.Z)(s,n.Z.myId),this.renderResultsFunc(s),(this.list.childElementCount>=i.count||i.participants.length<50)&&(this.loadedWhat.channelParticipants=!0)}))}getMoreResults(){if(this.promise)return this.promise;const e=(()=>this.peerType.includes("dialogs")&&!this.loadedWhat.archived?this.getMoreSomething("dialogs"):!this.peerType.includes("contacts")&&!this.peerType.includes("dialogs")||this.loadedWhat.contacts?this.peerType.includes("channelParticipants")&&!this.loadedWhat.channelParticipants?this.getMoreSomething("channelParticipants"):void 0:this.getMoreSomething("contacts"))();if(!e)return Promise.resolve();const t=this.promise=e.catch((e=>{console.error("get more result error",e)})).finally((()=>{this.promise===t&&(this.promise=void 0),this.checkForTriggers()}));return t}getMoreSomething(e){return{dialogs:this.getMoreDialogs,contacts:this.getMoreContacts,channelParticipants:this.getMoreChannelParticipants}[e].call(this)}renderResults(e){return x(this,void 0,void 0,(function*(){!this.peerType.includes("dialogs")&&this.loadedWhat.contacts&&(e=yield(0,C.Z)(e,(e=>this.managers.appUsersManager.isNonContactUser(e)))),e.forEach((e=>x(this,void 0,void 0,(function*(){const{dom:t}=s.default.addDialogNew({peerId:e,container:this.scrollable,rippleEnabled:this.rippleEnabled,avatarSize:this.avatarSize});if(this.multiSelect){const i=this.selected.has(e),s=new r.Z;i&&(s.input.checked=!0),t.containerEl.prepend(s.label)}let i;i=e.isAnyChat()?yield(0,E.Z)(e.toChatId()):e===n.Z.myId?(0,d.ag)(this.selfPresence):(0,I.Z)(yield this.managers.appUsersManager.getUser(e.toUserId())),t.lastMessageSpan.append(i)}))))}))}add(e,t,i=!0){var s;if(this.selected.add(e),!this.multiSelect)return void this.onChange(this.selected.size);this.query.trim()&&(this.input.value="",this.onInput());const n=document.createElement("div");n.classList.add("selector-user","scale-in");const a=new S.Z;if(a.classList.add("selector-user-avatar","tgico","avatar-32"),a.isDialog=!0,n.dataset.key=""+e,e.isPeerId()){if(void 0===t){const i=new h.Z;i.update({peerId:e.toPeerId(),dialog:!0}),t=i.element}a.updateWithOptions({peerId:e})}return t&&("string"==typeof t?n.innerHTML=t:((0,p.Z)(n,t),n.append(t))),n.insertAdjacentElement("afterbegin",a),this.selectedContainer.insertBefore(n,this.input),null===(s=this.onChange)||void 0===s||s.call(this,this.selected.size),i&&this.selectedScrollable.scrollIntoViewNew({element:this.input,position:"center"}),n}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 i=()=>{this.selected.delete(e),t.remove(),this.onChange&&this.onChange(this.selected.size)};n.Z.settings.animationsEnabled?t.addEventListener("animationend",i,{once:!0}):i()}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:o.f.Static})}))}}},8448:(e,t,i)=>{"use strict";i.d(t,{ZP:()=>F,ns:()=>_});var s=i(3442),n=i(3013),a=i(4755),o=i(4762),r=i(3512),d=i(3910),l=i(2738),c=i(3725),h=i(3699),u=i(319),p=i(8497),f=i(2325),m=i(3251),g=i(632),v=i(9966),b=i(1507),y=i(4081),w=i(5296),S=i(3228),C=i(5157),L=i(7207),E=i(130),I=i(8115),M=i(5671),P=i(1604),Z=i(7530),T=i(2312),k=i(9492),x=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function A(e=!0){const t=new s.Z({cancelable:!0,tryAgainOnFail:e});return t.construct(),e||(t.circle.setAttributeNS(null,"r","23"),t.totalLength=143.58203125),t}r.Z.addEventListener("messages_media_read",(({mids:e,peerId:t})=>{e.forEach((e=>{const i=`[data-mid="${e}"][data-peer-id="${t}"]`;Array.from(document.querySelectorAll(`audio-element.is-unread${i}, .media-round.is-unread${i}`)).forEach((e=>{e.classList.remove("is-unread")}))}))}));const _=(e,t)=>{let i,s;const n=!e.classList.contains("search-super-item"),a=(0,p.Z)(e,n?"bubbles-inner":"tabs-tab");if(a){const t=':not([data-is-outgoing="1"])',o=`.audio:not(.is-voice)${t}`;let r;if(r=e.matches(o)?[o]:[`.audio.is-voice${t}`,`.media-round${t}`],n){const e=".bubble:not(.webpage) ";r=r.map((t=>e+t))}const d=r.join(", "),l=Array.from(a.querySelectorAll(d)),c=l.indexOf(e),h=l.map((e=>({peerId:e.dataset.peerId.toPeerId(),mid:+e.dataset.mid})));i=h.slice(0,c),s=h.slice(c+1)}return(s.length&&s[0].midt)&&([i,s]=[s.reverse(),i.reverse()]),[i,s]};class F extends HTMLElement{constructor(){super(...arguments),this.withTime=!1,this.voiceAsMusic=!1,this.showSender=!1,this.listenerSetter=new h.Z}render(){var e,t,i;return x(this,void 0,void 0,(function*(){this.classList.add("audio"),this.managers=r.Z.managers,this.dataset.mid=""+this.message.mid,this.dataset.peerId=""+this.message.peerId;const s=(0,Z.Z)(this.message),h="voice"===s.type,p=!this.voiceAsMusic&&h,F=this.message.pFlags.is_outgoing,D=null===(e=this.message)||void 0===e?void 0:e.uploadingFileName,R=(0,C.Z)(0|s.duration);this.innerHTML='\n
\n
\n
\n
\n
\n
';const B=this.firstElementChild,N=document.createElement("div");N.classList.add("audio-download"),"audio"!==s.type&&this.message&&this.message.pFlags.media_unread&&this.classList.add("is-unread"),D&&(this.classList.add("is-outgoing"),this.append(N));const O=yield p?function(e){return x(this,void 0,void 0,(function*(){e.classList.add("is-voice");const t=e.message,i=(0,Z.Z)(t);t.pFlags.out&&e.classList.add("is-out");let s=i.attributes.find((e=>"documentAttributeAudio"===e._)).waveform||new Uint8Array([]);s=function(e){e instanceof Uint8Array||(e=new Uint8Array(e));const t=8*e.length/5|0;if(!t)return new Uint8Array([]);let i;try{const s=new DataView(e.buffer);i=new Uint8Array(t);for(let e=0;e>n&31}}catch(e){i=new Uint8Array([])}return i}(s.slice(0,63));const{svg:n,container:o,availW:r}=function(e,t){const i=a.Z.isMobile?16:23,s=a.Z.isMobile?152:190,n=a.Z.isMobile?190:256,o=(0,S.Z)(t/60*n,s,n),r=document.createElementNS("http://www.w3.org/2000/svg","svg");r.classList.add("audio-waveform-bars"),r.setAttributeNS(null,"width",""+o),r.setAttributeNS(null,"height",""+i),r.setAttributeNS(null,"viewBox",`0 0 ${o} ${i}`);const d=Math.max(...e),l=e.length?e.length:100,c=Math.min(o/4|0,l);let h=0;const u=i-4;let p="";for(let t=0,s=0,n=0;t=l){n=n+c-l,n<(c+1)/2&&h\n `,s+=4,h=n<(c+1)/2?0:a}else h{let t=e.audio;const i=()=>{c.style.width=t.currentTime/t.duration*100+"%"};(!t.paused||t.currentTime>0&&t.currentTime!==t.duration)&&i();const s=(0,v.Z)(i);return e.addAudioListener("timeupdate",s),e.addAudioListener("ended",s),e.addAudioListener("play",(()=>{(0,w.cK)((()=>!!t&&(i(),!t.paused)),e)})),e.readyPromise.then((()=>{let e=!1,i=!1;function s(e){let i;if(e instanceof MouseEvent)i=e.offsetX;else{const t=e.target.getBoundingClientRect();i=e.targetTouches[0].pageX-t.left}const s=i/r*t.duration;t.currentTime=s}f.addEventListener("mouseleave",(s=>{e&&(t.play(),e=!1),i=!1})),f.addEventListener("mousemove",(t=>{i=!0,e&&s(t)})),f.addEventListener("mousedown",(i=>{i.preventDefault(),0===i.button&&(t.paused||t.pause(),s(i),e=!0)})),f.addEventListener("mouseup",(s=>{i&&e&&(t.play(),e=!1)})),(0,l.fc)(f,(e=>{(0,d.Z)(e),t.paused||s(e)}))}),u.Z),()=>{f.remove(),f=null,t=null}}}))}(this):function(e){var t;return x(this,void 0,void 0,(function*(){const i=e.withTime,s=e.message,n=(0,Z.Z)(s),a="voice"===n.type||"round"===n.type,o=document.createElement("div");o.classList.add("audio-description");const r=n.attributes.find((e=>"documentAttributeAudio"===e._));if(!a){const t=[];(null==r?void 0:r.performer)&&t.push((0,I.Z)(r.performer)),i?t.push((0,g.OD)(s.date)):t.length||t.push((0,y.Z)(n.size)),e.showSender&&t.push(yield(0,M.Z)(s)),o.append(...(0,f.A1)(t," โ€ข "))}e.insertAdjacentHTML("beforeend",'\n
\n
\n
\n
');const d=e.querySelector(".audio-title"),l=new m.I;l.dataset.fontWeight=e.dataset.fontWeight,l.dataset.fontSize=e.dataset.fontSize,l.dataset.sizeType=e.dataset.sizeType,l.getSize=e.getSize,a?l.append(yield(0,M.Z)(s)):(0,E.Z)(l,(0,I.Z)(null!==(t=null==r?void 0:r.title)&&void 0!==t?t:n.file_name)),d.append(l),e.showSender&&d.append((0,P.Z)(s));const c=e.querySelector(".audio-subtitle");return c.append(o),()=>{let t=!1,i=new L.Z({media:e.audio,streamable:n.supportsStreaming});e.addAudioListener("ended",(()=>{e.classList.remove("audio-show-progress"),c.lastChild.replaceWith(o),t=!1}));const s=()=>{t||(e.classList.add("audio-show-progress"),t=!0,i&&c.lastChild.replaceWith(i.container))};return e.addAudioListener("play",s),(!e.audio.paused||e.audio.currentTime>0)&&s(),()=>{i.removeListeners(),i.container.remove(),i=null}}}))}(this),U=this.querySelector(".audio-time");U.innerHTML=R;const H=this.onLoad=e=>{this.onLoad=void 0;const t=this.audio=n.Z.addMedia(this.message,e),i=this.readyPromise=(0,c.Z)();this.audio.readyState>=this.audio.HAVE_CURRENT_DATA?i.resolve():this.addAudioListener("canplay",(()=>i.resolve()),{once:!0}),this.onTypeDisconnect=O();const s=()=>(0,C.Z)(0|t.currentTime)+(p?" / "+R:""),a=()=>{U.innerText=s(),B.classList.toggle("playing",!t.paused)};(!t.paused||t.currentTime>0&&t.currentTime!==t.duration)&&a();const o=(e,i=t.paused)=>{if(e&&(0,d.Z)(e),i){const e=!!this.searchContext;if(n.Z.setSearchContext(this.searchContext||{peerId:b.NM,inputFilter:{_:"inputMessagesFilterEmpty"},useSearch:!1})){const[t,i]=e?_(this,this.message.mid):[];n.Z.setTargets({peerId:this.message.peerId,mid:this.message.mid},t,i)}t.play().catch((()=>{}))}else t.pause()};return(0,l.fc)(B,(e=>o(e)),{listenerSetter:this.listenerSetter}),this.addAudioListener("ended",(()=>{B.classList.remove("playing"),U.innerText=R})),this.addAudioListener("timeupdate",(()=>{!t.currentTime&&t.paused||n.Z.isSafariBuffering(t)||(U.innerText=s())})),this.addAudioListener("pause",(()=>{B.classList.remove("playing")})),this.addAudioListener("play",a),o};if(null===(t=s.thumbs)||void 0===t?void 0:t.length){const e=[],t=yield(0,k.Z)({photo:s,message:null,container:B,boxWidth:48,boxHeight:48,loadPromises:this.loadPromises,withoutPreloader:!0,lazyLoadQueue:this.lazyLoadQueue});B.style.width=B.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(F)D&&(this.preloader=A(!1),this.preloader.attachPromise(T.Z.getUpload(D)),this.dataset.isOutgoing="1",this.preloader.attach(N,!1));else{let e=this.preloader;const t="audio"!==s.type;H(t);const a=t=>{if(this.audio.src)return;n.Z.resolveWaitingForLoadMedia(this.message.peerId,this.message.mid,this.message.pFlags.is_scheduled);const i=()=>{t&&(n.Z.willBePlayed(this.audio),o.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=A(!1),s=(0,c.Z)();s.notifyAll({done:75,total:100}),s.catch((()=>{this.audio.pause(),n.Z.willBePlayed(void 0)})),s.cancel=()=>{s.cancel=u.Z;const e=new Error;e.type="CANCELED",s.reject(e)},t.attach(N,!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=A(),t||(this.readyPromise=(0,c.Z)());const n=()=>{i();const n=T.Z.downloadMediaURL({media:s});return t||n.then((()=>{this.readyPromise.resolve()})),e.attach(N,!1,n),{download:n}};e.setDownloadFunction(n),n()}this.classList.contains("corner-download")?B.append(N):this.append(N),this.classList.add("downloading"),this.readyPromise.then((()=>{this.classList.remove("downloading"),N.classList.add("downloaded"),setTimeout((()=>{N.remove()}),200),n.Z.willBePlayedMedia===this.audio&&(this.audio.play(),n.Z.willBePlayed(void 0))}))};(null===(i=this.audio)||void 0===i?void 0:i.src)||(t?a(!1):(0,l.fc)(B,(()=>{a(!0)}),{once:!0,capture:!0,passive:!1,listenerSetter:this.listenerSetter}))}}))}get addAudioListener(){return this.listenerSetter.add(this.audio)}disconnectedCallback(){setTimeout((()=>{this.isConnected||(this.onTypeDisconnect&&(this.onTypeDisconnect(),this.onTypeDisconnect=null),this.readyPromise&&this.readyPromise.reject(),this.listenerSetter&&(this.listenerSetter.removeAll(),this.listenerSetter=null),this.preloader&&(this.preloader=null))}),100)}}customElements.define("audio-element",F)},9331:(e,t,i)=>{"use strict";i.d(t,{Z:()=>C,C:()=>b});var s=i(3512),n=i(2738),a=i(3910),o=i(1784),r=i(6074);class d extends r.Z{constructor(e){super(Object.assign(Object.assign({},e),{loadMore:(e,t,i)=>{if(this.peerId.isAnyChat()||!t)return Promise.resolve({count:0,items:[]});const s=null==e?void 0:e.photoId;return this.managers.appPhotosManager.getUserPhotos(this.peerId,s,i).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 l=i(2312),c=i(9322),h=i(8544);class u extends h.Z{constructor(e){super(new d({peerId:e,managers:s.Z.managers}),[]),this.onPrevClick=e=>{this.openMedia(e.photoId,e.element,-1)},this.onNextClick=e=>{this.openMedia(e.photoId,e.element,1)},this.onDownloadClick=()=>{l.Z.downloadToDisc({media:this.target.photo,queueId:c.ZP.chat.bubbles.lazyLoadQueue.queueId})},this.peerId=e,this.setBtnMenuToggle([{icon:"download",text:"MediaViewer.Context.Download",onClick:this.onDownloadClick}]),this.setListeners()}openMedia(e,t,i=0,s,n){const a=Object.create(null,{_openMedia:{get:()=>super._openMedia}});return o=this,r=void 0,l=function*(){if(this.setMoverPromise)return this.setMoverPromise;const o=yield this.managers.appPhotosManager.getPhoto(e),r=a._openMedia.call(this,o,o.date,this.peerId,i,t,!1,s,n);return this.target.photoId=o.id,this.target.photo=o,r},new((d=void 0)||(d=Promise))((function(e,t){function i(e){try{n(l.next(e))}catch(e){t(e)}}function s(e){try{n(l.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof d?n:new d((function(e){e(n)}))).then(i,s)}n((l=l.apply(o,r||[])).next())}));var o,r,d,l}}var p=i(5880),f=i(9931),m=i(3624),g=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const v=({peerId:e,threadId:t})=>{let i='avatar-element[data-peer-id="'+e+'"]';t&&(i+='[data-thread-id="'+t+'"]'),Array.from(document.querySelectorAll(i)).forEach((e=>{e.update()}))};function b(e,t,i,n,a,r){return g(this,void 0,void 0,(function*(){let d=yield s.Z.managers.appProfileManager.getFullPhoto(t);if(!i()||!d)return;const l=()=>Array.from(e.querySelectorAll("img")).find((e=>!e.classList.contains("emoji")))?e:null;if(t.isAnyChat()){const e=!!n,c="inputMessagesFilterChatPhotos";if(!n&&(n=yield s.Z.managers.appMessagesManager.getSearch({peerId:t,inputFilter:{_:c},maxId:0,limit:1}).then((e=>e.history[0])),!i()))return;if(n){n.action.photo.id!==d.id&&(e||(n=s.Z.managers.appMessagesManager.generateFakeAvatarMessage(t,d)));const i=e=>e.map((e=>({element:e.element,mid:e.item.mid,peerId:e.item.peerId})));return void(new o.Z).setSearchContext({peerId:t,inputFilter:{_:c}}).openMedia(n,l(),void 0,void 0,a?i(a):void 0,r?i(r):void 0)}}if(d){!(0,p.Z)(n)&&n&&(d=yield s.Z.managers.appPhotosManager.getPhoto(n));const e=e=>e.map((e=>({element:e.element,photoId:e.item})));new u(t).openMedia(d.id,l(),void 0,a?e(a):void 0,r?e(r):void 0)}}))}s.Z.addEventListener("avatar_update",v),s.Z.addEventListener("peer_title_edit",(e=>g(void 0,void 0,void 0,(function*(){(yield s.Z.managers.appAvatarsManager.isAvatarCached(e.peerId))||v(e)}))));const y=new Map,w=new Set;function S(e,t){return e+(t?"_"+t:"")}class C extends HTMLElement{constructor(){super(),this.addedToQueue=!1,this.classList.add("avatar-like"),this.middlewareHelper=(0,m.k)()}disconnectedCallback(){var e;const t=S(this.peerId,this.threadId),i=y.get(t);(null==i?void 0:i.has(this))&&(i.delete(this),i.size||y.delete(t)),null===(e=this.lazyLoadQueue)||void 0===e||e.delete({div:this})}attachClickEvent(){let e=!1;(0,n.fc)(this,(t=>g(this,void 0,void 0,(function*(){if((0,a.Z)(t),e)return;const i=this.peerId;e=!0,yield b(this,this.peerId,(()=>this.peerId===i)),e=!1}))))}updateOptions(e){for(const t in e)this[t]=e[t]}updateWithOptions(e){var t;const i=this.peerId,s=this.threadId;this.updateOptions(e);const n=this.peerId,a=this.threadId;if(i===n&&s===a)return;if(this.dataset.peerId=""+n,a?this.dataset.threadId=""+a:s&&delete this.dataset.threadId,i){const e=S(i,s),t=y.get(e);t&&(t.delete(this),t.size||y.delete(e))}const o=null===(t=e.wrapOptions)||void 0===t?void 0:t.middleware;return this.middlewareHelper.destroy(),o?this.middlewareHelper=o.create():this.middlewareHelper.destroy(),this.update()}remove(){this.middlewareHelper.destroy(),super.remove()}r(e=!1){const t=(0,f.Z)({div:this,peerId:this.peerId,isDialog:this.isDialog,title:this.peerTitle,onlyThumb:e,isBig:this.isBig,threadId:this.threadId,wrapOptions:Object.assign({middleware:this.middlewareHelper.get()},this.wrapOptions||{})});return this.loadPromises&&(this.loadPromises.push(t),t.finally((()=>{this.loadPromises=void 0}))),t}update(){if(this.lazyLoadQueue){if(!w.has(this.peerId)){if(this.addedToQueue)return;this.addedToQueue=!0;const e=S(this.peerId,this.threadId);let t=y.get(e);return t||y.set(e,t=new Set),t.add(this),this.lazyLoadQueue.push({div:this,load:()=>(w.add(this.peerId),this.update())}),this.r(!0)}this.addedToQueue&&this.lazyLoadQueue.delete({div:this})}w.add(this.peerId);const e=this.r();this.addedToQueue&&e.finally((()=>{this.addedToQueue=!1}));const t=S(this.peerId,this.threadId),i=y.get(t);if(i){i.delete(this);const e=Array.from(i);y.delete(t);for(let t=0,i=e.length;t{"use strict";i.d(t,{Z:()=>o});var s=i(2738),n=i(1168),a=i(6765);class o{constructor(e,t){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),(0,s.fc)(this.container,(()=>{n.Z.createPopup(a.Z,t).open(this.canvas,e)}))}clear(){this.canvas.getContext("2d").clearRect(0,0,this.canvas.width,this.canvas.height)}}},4494:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(2325),n=i(1405);function a(e,t={}){const i=document.createElement(t.asLink?"a":t.asDiv?"div":"button");return i.className=e+(t.icon?" tgico-"+t.icon:""),t.noRipple||(t.rippleSquare&&i.classList.add("rp-square"),(0,n.Z)(i)),t.onlyMobile&&i.classList.add("only-handhelds"),t.disabled&&i.setAttribute("disabled","true"),t.text&&i.append((0,s.ag)(t.text)),i}},8119:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4494);const n=(e={})=>(0,s.Z)("btn-circle btn-corner z-depth-1"+(e.className?" "+e.className:""),e)},2230:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4494);const n=(e,t={})=>(0,s.Z)("btn-icon",Object.assign({icon:e||void 0},t))},3003:(e,t,i)=>{"use strict";i.d(t,{Z:()=>v,b:()=>g});var s=i(7238),n=i(3416),a=i(3910),o=i(2738),r=i(8497),d=i(130),l=i(2325),c=i(9492),h=i(8812),u=i(8222),p=i(4762),f=i(1405);function m(e){if(e.element)return[e.separator,e.element].filter(Boolean);const{icon:t,iconDoc:i,text:s,onClick:m,checkboxField:g,noCheckboxClickListener:v}=e,b=document.createElement("div");b.className="btn-menu-item rp-overflow"+(t?" tgico-"+t:""),p.IS_MOBILE&&(0,f.Z)(b);let y=e.textElement;if(y||(y=e.textElement=s?(0,l.ag)(s,e.textArgs):document.createElement("span"),e.regularText&&(0,d.Z)(y,e.regularText)),i){const t=document.createElement("span");t.classList.add("btn-menu-item-icon"),b.append(t),e.loadPromise=(0,c.Z)({container:t,photo:i,boxWidth:24,boxHeight:24,withoutPreloader:!0,noFadeIn:!0,noBlur:!0,processUrl:e=>fetch(e).then((e=>e.text())).then((e=>{const t=u.Z.getProperty("primary-text-color"),i=(new DOMParser).parseFromString(e,"image/svg+xml").firstElementChild;return i.querySelectorAll("path").forEach((e=>{e.setAttributeNS(null,"fill",t),e.style.stroke=t,e.style.strokeWidth=".25px"})),(0,h.Z)(i.outerHTML)}))}).then((e=>e.loadPromises.thumb))}y.classList.add("btn-menu-item-text"),b.append(y);const w=!!g||!!e.keepOpen;return m&&(0,o.fc)(b,(t=>{var i;(0,a.Z)(t);const s=(0,r.Z)(t.target,"btn-menu");s&&!s.classList.contains("active")||(m(t),!1!==(null===(i=e.checkForClose)||void 0===i?void 0:i.call(e))&&(w||n.Z.close(),g&&!v&&(g.checked="radio"===g.input.type||!g.checked)))}),e.options),g&&b.append(g.label),!0===e.separator&&(e.separator=document.createElement("hr")),e.multiline&&b.classList.add("is-multiline"),[e.separator,e.element=b].filter(Boolean)}function g({listenerSetter:e,buttons:t}){const i=document.createElement("div");i.classList.add("btn-menu"),e&&t.forEach((t=>{t.options?t.options.listenerSetter=e:t.options={listenerSetter:e}}));const n=t.map(m);return i.append(...(0,s.Z)(n)),i}function v(e){return t=this,i=void 0,n=function*(){const t=g(e);return yield Promise.all(e.buttons.map((({loadPromise:e})=>e))),t},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}},5322:(e,t,i)=>{"use strict";i.d(t,{Z:()=>u,v:()=>h});var s=i(3416),n=i(3910),a=i(2738),o=i(3699),r=i(2230),d=i(3003),l=i(2353),c=i(3035);function h({el:e,onOpen:t,options:i,onClose:o}){((null==i?void 0:i.listenerSetter)?i.listenerSetter.add(e):e.addEventListener.bind(e))(a.pf,(i=>{if(!e.classList.contains("btn-menu-toggle"))return!1;if((0,n.Z)(i),e.classList.contains("menu-open"))s.Z.close();else{const n=null==t?void 0:t(i),a=()=>{const t=e.querySelector(".btn-menu");s.Z.openBtnMenu(t,o)};n instanceof Promise?n.then(a):a()}}))}function u({buttonOptions:e,listenerSetter:t,container:i,direction:s,buttons:n,onOpenBefore:a,onOpen:u,onClose:p,onCloseAfter:f}){e&&(e.asDiv=!0);const m=null!=i?i:(0,r.Z)("more",e);m.classList.add("btn-menu-toggle");const g=new o.Z;let v,b;return h({el:m,onOpen:e=>{return t=this,i=void 0,r=function*(){if(yield null==a?void 0:a(e),b)return clearTimeout(b),void(b=void 0);const t=yield(i=n,(0,l.Z)(i,(e=>{var t,i;return null===(i=null===(t=null==e?void 0:e.verify)||void 0===t?void 0:t.call(e))||void 0===i||i})));var i;if(!t.length)return;const o=v=yield(0,d.Z)({buttons:t,listenerSetter:g});o.classList.add(s),yield null==u?void 0:u(e,o),m.append(o),yield(0,c.d1)()},new((o=void 0)||(o=Promise))((function(e,s){function n(e){try{d(r.next(e))}catch(e){s(e)}}function a(e){try{d(r.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof o?i:new o((function(e){e(i)}))).then(n,a)}d((r=r.apply(t,i||[])).next())}));var t,i,o,r},options:{listenerSetter:t},onClose:()=>{null==p||p(),b=window.setTimeout((()=>{null==f||f(),b=void 0,g.removeAll(),n.forEach((e=>e.element=void 0)),v.remove()}),300)}}),m}},1571:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(5296),n=i(2064);class a{constructor(){this._width=50,this._height=50,this._tails=90,this._scrollTails=50,this._curve=[0,.25,.5,.75,1,1.5,2,2.5,3,3.5,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,18.3,18.6,18.9,19.2,19.5,19.8,20.1,20.4,20.7,21,21.3,21.6,21.9,22.2,22.5,22.8,23.1,23.4,23.7,24,24.3,24.6,24.9,25.2,25.5,25.8,26.1,26.3,26.4,26.5,26.6,26.7,26.8,26.9,27],this._positions=[{x:.8,y:.1},{x:.6,y:.2},{x:.35,y:.25},{x:.25,y:.6},{x:.2,y:.9},{x:.4,y:.8},{x:.65,y:.75},{x:.75,y:.4}],this._phases=this._positions.length,this.onWheel=e=>{this._animatingToNextPosition||(this._scrollDelta+=e.deltaY,void 0===this._onWheelRAF&&(this._onWheelRAF=requestAnimationFrame(this.drawOnWheel)))},this.drawOnWheel=()=>{const e=this._scrollDelta/this._scrollTails;this._scrollDelta%=this._scrollTails;const t=e>0?Math.floor(e):Math.ceil(e);t&&this.changeTailAndDraw(t),this._onWheelRAF=void 0},this.drawNextPositionAnimated=e=>{var t;let i,s;if(e){const s=e();i=s>=1;const a=-1*(n=s)*(n-2),o=null!==(t=this._nextPositionTail)&&void 0!==t?t:0,r=(this._nextPositionTail=this._nextPositionTails*a)-o;r&&(this._nextPositionLeft-=r,this.changeTailAndDraw(r))}else{const e=this._frames;s=e.shift(),i=!e.length}var n;return s&&this.drawImageData(s),i&&(this._nextPositionLeft=void 0,this._nextPositionTails=void 0,this._nextPositionTail=void 0,this._animatingToNextPosition=void 0),!i};const e=this._tails/this._curve[this._curve.length-1];for(let t=0,i=this._curve.length;t{var s;return e-(null!==(s=i[t-1])&&void 0!==s?s:0)}))}hexToRgb(e){const t=(0,n.oo)(e);return{r:t[0],g:t[1],b:t[2]}}getPositions(e){const t=this._positions.slice();t.push(...t.splice(0,e));const i=[];for(let e=0;e({x:(e.x-s[i].x)/t,y:(e.y-s[i].y)/t})));return i.map((e=>n.map(((t,i)=>({x:s[i].x+t.x*e,y:s[i].y+t.y*e})))))}curPosition(e,t){return this.getNextPositions(e,this._tails,[t])[0]}changeTail(e){for(this._tail+=e;this._tail>=this._tails;)this._tail-=this._tails,++this._phase>=this._phases&&(this._phase-=this._phases);for(;this._tail<0;)this._tail+=this._tails,--this._phase<0&&(this._phase+=this._phases)}changeTailAndDraw(e){this.changeTail(e);const t=this.curPosition(this._phase,this._tail);this.drawGradient(t)}getGradientImageData(e){const t=this._hctx.createImageData(this._width,this._height),i=t.data;let s=0;for(let t=0;tthis.hexToRgb(e))),this._hc||(this._hc=document.createElement("canvas"),this._hc.width=this._width,this._hc.height=this._height,this._hctx=this._hc.getContext("2d",{alpha:!1})),this._canvas=e,this._ctx=this._canvas.getContext("2d",{alpha:!1}),this.update()}update(){if(this._colors.length<2){const e=this._colors[0];return this._ctx.fillStyle=`rgb(${e.r}, ${e.g}, ${e.b})`,void this._ctx.fillRect(0,0,this._width,this._height)}const e=this.curPosition(this._phase,this._tail);this.drawGradient(e)}toNextPosition(e){var t,i;if(this._colors.length<2)return;if(e)return this._nextPositionLeft=this._tails+(null!==(t=this._nextPositionLeft)&&void 0!==t?t:0),this._nextPositionTails=this._nextPositionLeft,this._nextPositionTail=void 0,this._animatingToNextPosition=!0,void(0,s.cK)(this.drawNextPositionAnimated.bind(this,e),this);const n=this._tail,a=this._tails;let o;const r=[];for(let e=0,t=this._incrementalCurve.length;ea&&void 0===o&&(o=e,s%=a),r.push(s)}[r.slice(0,o),void 0!==o?r.slice(o):[]].forEach(((e,t,i)=>{const s=e[e.length-1];if(void 0!==s&&s>a&&(e[e.length-1]=+s.toFixed(2)),this._tail=null!=s?s:0,!e.length)return;const n=this.getNextPositions(this._phase,a,e);t!==i.length-1&&++this._phase>=this._phases&&(this._phase-=this._phases);const o=n.map((e=>this.getGradientImageData(e)));this._frames.push(...o)})),this._animatingToNextPosition=!0,(0,s.cK)(this.drawNextPositionAnimated,this)}scrollAnimate(e){}cleanup(){this.scrollAnimate(!1)}static createCanvas(e){const t=document.createElement("canvas");return t.width=50,t.height=50,void 0!==e&&(t.dataset.colors=e),t}static create(e){const t=this.createCanvas(e),i=new a;return i.init(t),{gradientRenderer:i,canvas:t}}}},6054:(e,t,i)=>{"use strict";i.d(t,{e:()=>k,Z:()=>x});var s=i(5432),n=i(4494),a=i(2230),o=i(9807),r=i(5128),d=i(4524),l=i(9099),c=i(1962),h=i(5824),u=i(4762),p=i(2325),f=i(8497),m=i(8799),g=i(3910),v=i(6760),b=i(5565),y=i(8487),w=i(144),S=i(2738),C=i(5975),L=i(3241),E=i(5953),I=i(6976),M=(i(6690),i(9322)),P=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Z=e=>[...e.values()].reduce(((e,t)=>e+t.size),0);class T extends L.Z{constructor(e){super(!1),this.selectedMids=new Map,this.isSelecting=!1,this.onMouseDown=e=>{const t=(0,f.Z)(e.target,this.targetLookupClassName);if(0!==e.button)return;if(this.verifyTarget&&!this.verifyTarget(e,t))return;const i=new Map;let s,n=t;const a=(e,t=!0)=>{const o=+e.dataset.mid;if(!o||!e.dataset.peerId)return;const r=e.dataset.peerId.toPeerId();(0,y.Z)(n)||(n=e);let d=i.get(r);if(d||i.set(r,d=new Set),d.has(o))return;const l=this.isMidSelected(r,o);if(void 0===s&&(s=!l),d.add(o),s&&!l||!s&&l){const s=Z(i);if(this.toggleByElement&&t){s<2&&(0,C.Z)(e,n)&&(n=e);const t=this.getElementsBetween(n,e);t.length&&t.forEach((e=>{a(e,!1)}))}if(this.selectedMids.size)this.toggleByElement&&this.toggleByElement(e);else if(2===s&&this.toggleByMid)for(const[e,t]of i)for(const i of t)this.toggleByMid(e,i)}};let o=!1;const r=e=>{o||((0,v.Z)(),o=!0);const t=this.getElementFromTarget(e.target);if(t)return this.verifyMouseMoveTarget&&!this.verifyMouseMoveTarget(e,t,s)?(this.listenerSetter.removeManual(this.listenElement,"mousemove",r),void this.listenerSetter.removeManual(document,"mouseup",d,l)):void a(t)},d=e=>{i.size&&(0,S.fc)(window,g.Z,{capture:!0,once:!0,passive:!1}),this.listenerSetter.removeManual(this.listenElement,"mousemove",r),(0,v.Z)()},l={once:!0};this.listenerSetter.add(this.listenElement)("mousemove",r),this.listenerSetter.add(document)("mouseup",d,l)},this.getElementsBetween=(e,t)=>{if(e===t)return[];const i=e.getBoundingClientRect(),s=t.getBoundingClientRect(),n=(i.top-s.top||i.left-s.left)<0,a=(0,f.Z)(e,this.lookupBetweenParentClassName);if(!a)return[];const o=Array.from(a.querySelectorAll(this.lookupBetweenElementsQuery));let r=o.indexOf(e),d=o.indexOf(t);return n||([d,r]=[r,d]),o.slice(r+1,d)},this.cancelSelection=e=>P(this,void 0,void 0,(function*(){e&&(this.doNotAnimate=!0),this.onCancelSelection&&(yield this.onCancelSelection()),this.selectedMids.clear(),this.toggleSelection(),(0,v.Z)(),e&&(this.doNotAnimate=void 0)})),(0,E.Z)(this,e),this.navigationType="multiselect-"+(0,w.a)()}attachListeners(e,t){if(this.listenElement&&this.listenerSetter.removeAll(),this.listenElement=e,this.listenerSetter=t,e)return s.Z?(t.add(e)("touchend",(()=>{this.isSelecting&&(this.selectedText=window.getSelection?window.getSelection().toString():document.selection?document.selection.createRange().text:"")})),void(0,I.E)({element:e,callback:t=>{if(this.isSelecting||this.verifyTouchLongPress&&!this.verifyTouchLongPress())return;document.body.classList.add("no-select"),e.addEventListener("touchend",(e=>{(0,g.Z)(e),document.body.classList.remove("no-select")}),{once:!0,capture:!0}),(0,v.Z)();const i=this.getElementFromTarget(t.target);i&&this.toggleByElement(i)},listenerSetter:t})):void t.add(e)("mousedown",this.onMouseDown)}isElementShouldBeSelected(e){return this.isMidSelected(e.dataset.peerId.toPeerId(),+e.dataset.mid)}appendCheckbox(e,t){e.prepend(t.label)}toggleElementCheckbox(e,t){const i=!!this.getCheckboxInputFromElement(e);if(t){if(i)return!1;const t=new o.Z({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 i&&(this.getCheckboxInputFromElement(e).parentElement.remove(),(0,l.Z)({element:e,className:"is-selected",forwards:!1,duration:200}));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){var t;return P(this,void 0,void 0,(function*(){const i=this.selectedMids.size;if(!i&&!e)return;let s=!i,n=!i;const a=!i;for(const[e,t]of this.selectedMids){const i=`${e}_${this.isScheduled?"scheduled":"history"}`,a=yield this.managers.appMessagesManager.cantForwardDeleteMids(i,Array.from(t));if(s=a.cantForward,n=a.cantDelete,s&&n)break}null===(t=this.onUpdateContainer)||void 0===t||t.call(this,s,n,a)}))}toggleSelection(e=!0,t=!1){var i;const n=this.isSelecting,a=this.selectedMids.size;if(this.isSelecting=!!a||t,n===this.isSelecting)return!1;this.dispatchEvent("toggle",this.isSelecting),s.Z||(this.listenElement.classList.toggle("no-select",this.isSelecting),n&&(0,v.Z)()),(0,m.Z)();const o=!!a||t,r=null===(i=this.onToggleSelection)||void 0===i?void 0:i.call(this,o,!this.doNotAnimate);return u.IS_MOBILE_SAFARI||(o?h.Z.pushItem({type:this.navigationType,onPop:()=>{this.cancelSelection()}}):h.Z.removeByType(this.navigationType)),t&&(r||Promise.resolve()).then((()=>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(),(0,l.Z)({element:e,className:"is-selected",forwards:t,duration:200})}isMidSelected(e,t){const i=this.selectedMids.get(e);return null==i?void 0:i.has(t)}length(){return Z(this.selectedMids)}toggleMid(e,t,i){let s=this.selectedMids.get(e);return i||void 0===i&&(null==s?void 0:s.has(t))?s&&(s.delete(t),s.size||this.selectedMids.delete(e)):(s||(s=new Set,this.selectedMids.set(e,s)),s.add(t)),!0}deleteSelectedMids(e,t){const i=this.selectedMids.get(e);i&&(t.forEach((e=>{i.delete(e)})),i.size||this.selectedMids.delete(e),this.updateContainer(),this.toggleSelection())}}class k extends T{constructor(e,t,i){super({managers:t,verifyTarget:(e,t)=>!!t&&this.isSelecting,getElementFromTarget:e=>(0,f.Z)(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,i=e.dataset.peerId.toPeerId();this.toggleMid(i,t)&&this.updateElementSelection(e,this.isMidSelected(i,t))},this.toggleByMid=(e,t)=>{const i=this.searchSuper.mediaTab.contentTab.querySelector(`.search-super-item[data-peer-id="${e}"][data-mid="${t}"]`);this.toggleByElement(i)},this.onUpdateContainer=(e,t,i)=>{const s=this.length();(0,b.Z)(this.selectionCountEl,(0,p.ag)("messages",[s])),this.selectionGotoBtn.classList.toggle("hide",1!==s),this.selectionForwardBtn.classList.toggle("hide",e),this.selectionDeleteBtn&&this.selectionDeleteBtn.classList.toggle("hide",t)},this.onToggleSelection=(e,t)=>{if((0,l.Z)({element:this.searchSuper.navScrollableContainer,className:"is-selecting",forwards:e,duration:t?200:0,onTransitionEnd:()=>{this.isSelecting||(this.selectionContainer.remove(),this.selectionContainer=this.selectionForwardBtn=this.selectionDeleteBtn=null,this.selectedText=void 0)}}),(0,l.Z)({element:this.searchSuper.container,className:"is-selecting",forwards:e,duration:200}),this.isSelecting&&!this.selectionContainer){const e="search-super-selection";this.selectionContainer=document.createElement("div"),this.selectionContainer.classList.add(e+"-container");const t=(0,a.Z)(`close ${e}-cancel`,{noRipple:!0});(0,S.fc)(t,(()=>this.cancelSelection()),{listenerSetter:this.listenerSetter,once:!0}),this.selectionCountEl=document.createElement("div"),this.selectionCountEl.classList.add(e+"-count"),this.selectionGotoBtn=(0,a.Z)(`message ${e}-goto`);const i={listenerSetter:this.listenerSetter};(0,S.fc)(this.selectionGotoBtn,(()=>{const e=[...this.selectedMids.keys()][0],t=[...this.selectedMids.get(e)][0];this.cancelSelection(),M.ZP.setInnerPeer({peerId:e,lastMsgId:t})}),i),this.selectionForwardBtn=(0,a.Z)(`forward ${e}-forward`),(0,S.fc)(this.selectionForwardBtn,(()=>{const e={};for(const[t,i]of this.selectedMids)e[t]=Array.from(i).sort(((e,t)=>e-t));new d.Z(e,(()=>{this.cancelSelection()}))}),i),this.isPrivate&&(this.selectionDeleteBtn=(0,a.Z)(`delete danger ${e}-delete`),(0,S.fc)(this.selectionDeleteBtn,(()=>{const e=[...this.selectedMids.keys()][0];new r.Z(e,[...this.selectedMids.get(e)],"chat",(()=>{this.cancelSelection()}))}),i)),this.selectionContainer.append(...[t,this.selectionCountEl,this.selectionGotoBtn,this.selectionForwardBtn,this.selectionDeleteBtn].filter(Boolean));const s=this.selectionContainer;s.style.opacity="0",this.searchSuper.navScrollableContainer.append(s),s.offsetLeft,s.style.opacity=""}},this.isPrivate=!e.showSender,this.attachListeners(e.container,i)}toggleSelection(e=!0,t=!1){const i=super.toggleSelection(e,t);return i&&e&&Array.from(this.searchSuper.tabsContainer.querySelectorAll(".search-super-item")).forEach((e=>{this.toggleElementCheckbox(e,this.isSelecting)})),i}}class x extends T{constructor(e,t,i,s){super({managers:s,getElementFromTarget:e=>(0,f.Z)(e,"grouped-item")||(0,f.Z)(e,"bubble"),verifyTarget:(e,t)=>!(!this.selectedMids.size&&!e.target.classList.contains("bubble")&&!e.target.classList.contains("document-selection")&&t),verifyMouseMoveTarget:(e,t,i)=>!(e.target!==t&&!e.target.classList.contains("document-selection")&&void 0===i&&!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=i,this.toggleByElement=e=>{if(!this.canSelectBubble(e))return;const t=+e.dataset.mid;if(e.classList.contains("is-grouped")){if(!this.isGroupedBubbleSelected(e)){const t=this.selectedMids.get(this.chat.peerId);t&&this.getMidsFromGroupContainer(e).forEach((e=>t.delete(e)))}this.bubbles.getBubbleGroupedItems(e).map(this.toggleByElement)}else if(this.toggleMid(this.chat.peerId,t)){if(e.classList.contains("grouped-item")){const t=(0,f.Z)(e,"bubble"),i=this.isGroupedBubbleSelected(t),s=this.isGroupedMidsSelected(t);(s||i)&&this.updateElementSelection(t,s)}this.updateElementSelection(e,this.isMidSelected(this.chat.peerId,t))}},this.toggleByMid=(e,t)=>P(this,void 0,void 0,(function*(){const e=yield this.bubbles.getMountedBubble(t);e&&this.toggleByElement(e.bubble)})),this.onToggleSelection=(e,t)=>P(this,void 0,void 0,(function*(){const{needTranslateX:i,widthFrom:s,widthTo:o}=yield this.chat.input.center(t);(0,l.Z)({element:this.listenElement,className:"is-selecting",forwards:e,duration:t?200:0,onTransitionEnd:()=>{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 h=sthis.cancelSelection()),{once:!0,listenerSetter:this.listenerSetter}),this.selectionCountEl=document.createElement("div"),this.selectionCountEl.classList.add("selection-container-count"),"scheduled"===this.chat.type?(this.selectionSendNowBtn=(0,n.Z)("btn-primary btn-transparent btn-short text-bold selection-container-send",{icon:"send2"}),this.selectionSendNowBtn.append((0,p.ag)("MessageScheduleSend")),(0,S.fc)(this.selectionSendNowBtn,(()=>{new c.Z(this.chat.peerId,[...this.selectedMids.get(this.chat.peerId)],(()=>{this.cancelSelection()}))}),e)):(this.selectionForwardBtn=(0,n.Z)("btn-primary btn-transparent text-bold selection-container-forward",{icon:"forward"}),this.selectionForwardBtn.append((0,p.ag)("Forward")),(0,S.fc)(this.selectionForwardBtn,(()=>{const e={};for(const[t,i]of this.selectedMids)e[t]=Array.from(i).sort(((e,t)=>e-t));new d.Z(e,(()=>{this.cancelSelection()}))}),e)),this.selectionDeleteBtn=(0,n.Z)("btn-primary btn-transparent danger text-bold selection-container-delete",{icon:"delete"}),this.selectionDeleteBtn.append((0,p.ag)("Delete")),(0,S.fc)(this.selectionDeleteBtn,(()=>{new r.Z(this.chat.peerId,[...this.selectedMids.get(this.chat.peerId)],this.chat.type,(()=>{this.cancelSelection()}))}),e);const i=this.selectionLeft=document.createElement("div");i.classList.add("selection-container-left"),i.append(t,this.selectionCountEl);const s=this.selectionRight=document.createElement("div");s.classList.add("selection-container-right"),s.append(...[this.selectionSendNowBtn,this.selectionForwardBtn,this.selectionDeleteBtn].filter(Boolean)),void 0!==h&&(i.style.transform=`translateX(${-h}px)`,s.style.transform=`translateX(${h}px)`),this.selectionContainer.append(i,s),this.selectionInputWrapper.style.opacity="0",this.selectionInputWrapper.append(this.selectionContainer),this.input.inputContainer.append(this.selectionInputWrapper),this.selectionInputWrapper.offsetLeft,this.selectionInputWrapper.style.opacity="",i.style.transform="",s.style.transform=""}}else this.selectionLeft&&void 0!==h&&(this.selectionLeft.style.transform=`translateX(-${h}px)`,this.selectionRight.style.transform=`translateX(${h}px)`)})),this.onUpdateContainer=(e,t,i)=>{(0,b.Z)(this.selectionCountEl,(0,p.ag)("messages",[this.length()])),this.selectionSendNowBtn&&this.selectionSendNowBtn.toggleAttribute("disabled",i),this.selectionForwardBtn&&this.selectionForwardBtn.toggleAttribute("disabled",e),this.selectionDeleteBtn&&this.selectionDeleteBtn.toggleAttribute("disabled",t)},this.onCancelSelection=()=>P(this,void 0,void 0,(function*(){}))}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 i=super.toggleSelection(e,t);if(i&&e)for(const e in this.bubbles.bubbles){if(this.bubbles.skippedMids.has(+e))continue;const t=this.bubbles.bubbles[e];this.toggleElementCheckbox(t,this.isSelecting)}return i}toggleElementCheckbox(e,t){if(!this.canSelectBubble(e))return;const i=super.toggleElementCheckbox(e,t);return i&&e.classList.contains("is-grouped")&&this.bubbles.getBubbleGroupedItems(e).forEach((e=>this.toggleElementCheckbox(e,t))),i}isElementShouldBeSelected(e){const t=e.classList.contains("is-grouped");return super.isElementShouldBeSelected(e)&&(!t||this.isGroupedMidsSelected(e))}isGroupedBubbleSelected(e){const t=this.getCheckboxInputFromElement(e);return null==t?void 0:t.checked}getMidsFromGroupContainer(e){const t=this.chat.bubbles.getBubbleGroupedItems(e);return t.length||t.push(e),t.map((e=>+e.dataset.mid))}isGroupedMidsSelected(e){const t=this.getMidsFromGroupContainer(e),i=t.filter((e=>this.isMidSelected(this.chat.peerId,e)));return t.length===i.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-outgoing")||e.classList.contains("is-error")||e.classList.contains("bubble-first")||e.classList.contains("avoid-selection"))}}},9807:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(1405),n=i(2325),a=i(9750),o=i(3512),r=i(3855);class d{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),this.listenerSetter=e.listenerSetter;const i=this.input=document.createElement("input");if(i.classList.add("checkbox-field-input"),i.type="checkbox",e.name&&(i.id="input-"+e.name),e.checked&&(i.checked=!0),e.stateKey){let t=!1;const s=()=>{if(!t)return;let s;s=e.stateValues?e.stateValues[i.checked?1:0]:i.checked,o.Z.managers.appStateManager.setByKey(e.stateKey,s)};r.Z.getState().then((i=>{t=!0;const s=(0,a.Z)(i,e.stateKey);let n;n=e.stateValues?1===e.stateValues.indexOf(s):s,this.setValueSilently(n)})),e.listenerSetter?e.listenerSetter.add(i)("change",s):i.addEventListener("change",s)}let d;if(e.text?(d=this.span=document.createElement("span"),d.classList.add("checkbox-caption"),(0,n.$d)(d,e.text,e.textArgs)):t.classList.add("checkbox-without-caption"),t.append(i),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 i=document.createElementNS("http://www.w3.org/2000/svg","svg");i.classList.add("checkbox-box-check"),i.setAttributeNS(null,"viewBox","0 0 24 24");const s=document.createElementNS("http://www.w3.org/2000/svg","use");s.setAttributeNS(null,"href","#check"),s.setAttributeNS(null,"x","-1"),i.append(s);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,i),t.append(e)}d&&t.append(d),e.withRipple?(t.classList.add("checkbox-ripple","hover-effect"),(0,s.Z)(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)}}},4489:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(503);class n extends s.ZP{constructor(e){super(Object.assign(e,{plainText:!0})),this.options=e;const t=this.input;t.type="tel",t.setAttribute("required",""),t.autocomplete="off";let i=0;this.input.addEventListener("input",(t=>{this.input.classList.remove("error"),this.setLabel();const s=this.value.replace(/\D/g,"").slice(0,e.length);this.setValueSilently(s);const n=this.value.length;if(n===e.length)e.onFill(this.value);else if(n===i)return;i=n}))}}},5592:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(1168),n=i(8127);function a(e){return new Promise(((t,i)=>{var a;const{button:o,checkbox:r}=e;o.callback=i=>{t(r||!i?i?!!i.size:void 0:e.checkboxes.map((e=>i.has(e.text))))};const d=(0,s.x)(e.buttons||[o]),l=d.find((e=>e.isCancel));l.callback=()=>{i()},e.buttons=d,null!==(a=e.checkboxes)&&void 0!==a||(e.checkboxes=r&&[r]),new n.Z("popup-confirmation",e).show()}))}},5431:(e,t,i)=>{"use strict";i.d(t,{Z:()=>S});var s=i(9976),n=i(3910),a=i(8497),o=i(4668),r=i(5565),d=i(130),l=i(4789),c=i(144),h=i(2325),u=i(8115),p=i(3512),f=i(671),m=i(503),g=i(8805);let v;const b=()=>{v=h.ZP.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 y=()=>{b(),p.Z.addEventListener("language_change",(()=>{b()}))};const w=new Set(["FT"]);class S extends m.ZP{constructor(e={}){super(Object.assign({label:"Country",name:(0,c.a)()},e)),this.options=e,this.hidePicker=()=>{void 0===this.hideTimeout&&(this.selectWrapper.classList.remove("active"),this.hideTimeout=window.setTimeout((()=>{this.selectWrapper.classList.add("hide"),this.hideTimeout=void 0}),200))},this.selectCountryByTarget=e=>{var t,i;const s=e.querySelector("[data-default-name]").dataset.defaultName,n=e.querySelector(".phone-code"),a=null==n?void 0:n.innerText,o=a&&a.replace(/\D/g,"");(0,r.Z)(this.input,(0,h.ag)(s)),this.simulateInputEvent(),this.lastCountrySelected=v.find((e=>e.default_name===s)),this.lastCountryCodeSelected=o&&this.lastCountrySelected.country_codes.find((e=>e.country_code===o)),null===(i=(t=this.options).onCountryChange)||void 0===i||i.call(t,this.lastCountrySelected,this.lastCountryCodeSelected),this.hidePicker()},y&&(y(),y=void 0),this.liMap=new Map,this.container.classList.add("input-select");const t=this.selectWrapper=document.createElement("div");t.classList.add("select-wrapper","z-depth-3","hide");const i=document.createElement("span");i.classList.add("arrow","arrow-down"),this.container.append(i);const p=document.createElement("ul");t.appendChild(p),new g.ZP(t);let m=()=>{m=null,v.forEach((t=>{if(e.noPhoneCodes&&w.has(t.iso2))return;const i=(0,f.Ml)(t.iso2),n=[];for(let a=0,o=Math.min(t.country_codes.length,e.noPhoneCodes?1:1/0);a{if(0!==e.button)return;const t=(0,o.Z)(e.target,"LI");this.selectCountryByTarget(t)})),this.container.appendChild(t)};m(),this.input.addEventListener("focus",(e=>{m?m():v.forEach((e=>{const t=this.liMap.get(e.iso2);t&&t.forEach((e=>e.style.display=""))})),clearTimeout(this.hideTimeout),this.hideTimeout=void 0,t.classList.remove("hide"),t.offsetWidth,t.classList.add("active"),this.select(),(0,l.Z)({container:(0,a.Z)(this.container,"scrollable-y"),element:this.input,position:"start",margin:4}),setTimeout((()=>{b||(document.addEventListener("mousedown",S,{capture:!0}),b=!0)}),0)}));let b=!1;const S=e=>{(0,a.Z)(e.target,"input-select")||e.target!==this.input&&(this.hidePicker(),document.removeEventListener("mousedown",S,{capture:!0}),b=!1)},C=e=>{const t=e.key;if(e.ctrlKey||"Control"===t)return!1;const i=this.value.toLowerCase(),s=[];v.forEach((e=>{const t=this.liMap.get(e.iso2);if(!t)return;const n=[e.name,e.default_name,e.iso2];n.filter(Boolean).forEach((e=>{const t=e.split(" ").filter((e=>/\w/.test(e))).map((e=>e[0])).join("");t.length>1&&n.push(t)}));const a=!!n.filter(Boolean).find((e=>-1!==e.toLowerCase().indexOf(i)));t.forEach((e=>e.style.display=a?"":"none")),a&&s.push(e)})),0===s.length?v.forEach((e=>{const t=this.liMap.get(e.iso2);t&&t.forEach((e=>e.style.display=""))})):1===s.length&&"Enter"===t&&((0,n.Z)(e),this.selectCountryByTarget(this.liMap.get(s[0].iso2)[0]))};this.input.addEventListener("keyup",C),this.input.addEventListener("keydown",(e=>{"Enter"===e.key&&C(e)})),i.addEventListener("mousedown",(e=>{this.input.matches(":focus")?(this.hidePicker(),this.input.blur()):(e.cancelBubble=!0,e.preventDefault(),this.input.focus())}))}getSelected(){return{country:this.lastCountrySelected,code:this.lastCountryCodeSelected}}selectCountryByIso2(e){this.selectCountryByTarget(this.liMap.get(e)[0])}override(e,t,i){var s,n;(0,r.Z)(this.input,e?(0,h.ag)(e.default_name):i),this.lastCountrySelected=e,this.lastCountryCodeSelected=t,null===(n=(s=this.options).onCountryChange)||void 0===n||n.call(s,this.lastCountrySelected,this.lastCountryCodeSelected)}}},6628:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(4762),n=i(5296),a=i(3228),o=i(5814);class r{constructor(e,t,i){this.width=e,this.height=t,this.multiply=i;const s=this.canvas=document.createElement("canvas"),n=this.dpr=window.devicePixelRatio;s.width=e*n,s.height=t*n,s.classList.add("canvas-thumbnail","canvas-dots"),this.paused=!0,this.autoplay=!0,this.tempId=0,this.context=s.getContext("2d")}prepare(){let e=Math.round(this.width*this.height/(35*(s.IS_MOBILE?2:1)));e*=this.multiply||1,e=Math.min(s.IS_MOBILE?1e3:2200,e),e=Math.round(e);const t=this.dots=new Array(e);for(let i=0;i=.8?1:.5)*this.dpr,a=new Path2D;return a.arc(t,i,n,0,2*Math.PI,!1),{x:t,y:i,opacity:s,radius:n,mOpacity:s,adding:null!=e?e:Math.random()>=.5,counter:0,path:a}}draw(){const{context:e,canvas:t,dots:i}=this;e.clearRect(0,0,t.width,t.height),e.fillStyle="#fff";for(let t=0,s=i.length;t=1&&(i[t]=this.generateDot(s.adding))):s.mOpacity>=1&&(s.adding=!1)}}remove(){this.pause()}pause(){this.paused||(this.paused=!0,++this.tempId)}renderFirstFrame(){this.dots||this.prepare(),this.draw()}play(){if(!this.paused)return;this.paused=!1;const e=++this.tempId;this.dots||this.prepare(),(0,n.jt)((()=>this.tempId===e&&!this.paused&&(this.draw(),!0)))}static create({width:e,height:t,middleware:i,animationGroup:s,multiply:n}){const a=new r(e,t,n);return a.renderFirstFrame(),o.Z.addAnimation(a,s,a.canvas,i),a}}},2621:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(187),n=i(9331),a=i(8119),o=i(5953),r=i(1507);class d{constructor(e){this._disabled=!1,this.avatarSize=120,this.isChanged=()=>{if(this.uploadAvatar)return!0;let e=0,t=0,i=0;return this.inputFields.forEach((s=>{s.isValid()&&(s.isChanged()&&++e,s.required&&++i),s.required&&++t})),t===i&&e>0},this.handleChange=()=>{this.nextBtn.classList.toggle("is-visible",this.isChanged())},(0,o.Z)(this,e),this.peerId||(this.peerId=r.NM),this.nextBtn?this.nextBtn.classList.contains("btn-corner")||(this.handleChange=()=>{this.nextBtn.toggleAttribute("disabled",!this.isChanged()||this.disabled)}):this.nextBtn=(0,a.Z)({icon:"check"}),e.withoutAvatar||(this.avatarElem=new n.Z,this.avatarElem.classList.add("avatar-placeholder","avatar-"+this.avatarSize),this.avatarElem.updateWithOptions({peerId:this.peerId}),e.doNotEditAvatar||(this.avatarEdit=new s.Z((e=>{this.uploadAvatar=e,this.handleChange(),this.avatarElem.remove()}),e.popupOptions),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}))}}},3173:(e,t,i)=>{"use strict";i.d(t,{Yd:()=>Q,Jo:()=>J,ZP:()=>te});var s=i(5432),n=i(9322),a=i(3512),o=i(5814),r=i(6008),d=i(2153),l=i(4332),c=i(5117),h=i(6039),u=i(1080),p=i(8805),f=i(279),m=i(2738);class g{constructor(e){this.managers=e}init(){this.content=document.getElementById("content-gifs");const e=this.content.firstElementChild;(0,m.fc)(e,J.onMediaClick);const t=this.scrollable=new p.ZP(this.content,"GIFS"),i=new u.Z(e,Q,t),s=(0,f.y)(this.content,!0);this.managers.appDocsManager.getGifs().then((e=>{e.forEach((e=>{i.add(e)})),s.remove()})),te.addLazyLoadQueueRepeat(i.lazyLoadQueue,i.processInvisibleDiv),this.init=null}onClose(){}}var v=i(6057),b=i(410),y=i(3552),w=i(3607),S=i(4755),C=i(8497),L=i(1507),E=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const I="GIFS-SEARCH";class M extends y._{constructor(){super(...arguments),this.nextOffset="",this.loadedAll=!1,this.onGifsClick=e=>E(this,void 0,void 0,(function*(){const t=(0,C.Z)(e.target,"gif");if(!t)return;const i=t.dataset.docId;(yield n.ZP.chat.input.sendMessageWithDocument(i))?S.Z.isMobile&&l.ZP.onCloseBtnClick():console.warn("got no doc by id:",i)}))}init(){this.container.id="search-gifs-container",this.inputSearch=new w.Z("SearchGifsTitle",(e=>{this.reset(),this.search(e)})),this.title.replaceWith(this.inputSearch.container),this.gifsDiv=document.createElement("div"),this.gifsDiv.classList.add("gifs-masonry"),(0,m.fc)(this.gifsDiv,this.onGifsClick,{listenerSetter:this.listenerSetter}),this.scrollable.append(this.gifsDiv),this.masonry=new u.Z(this.gifsDiv,I,this.scrollable),l.ZP.toggleSidebar(!0).then((()=>{this.search("",!0),this.scrollable.onScrolledBottom=()=>{this.search(this.inputSearch.value,!1)}}))}onClose(){this.scrollable.onScrolledBottom=()=>{}}onCloseAfterTimeout(){return this.reset(),this.gifsDiv.innerHTML="",o.Z.checkAnimations(void 0,I),this.inputSearch.remove(),super.onCloseAfterTimeout()}reset(){this.searchPromise=null,this.nextOffset="",this.loadedAll=!1,this.masonry.clear()}search(e,t=!0){return E(this,void 0,void 0,(function*(){if(!this.searchPromise&&!this.loadedAll){this.gifBotPeerId||(this.gifBotPeerId=(yield this.managers.appUsersManager.resolveUsername("gif")).id.toPeerId(!1));try{this.searchPromise=this.managers.appInlineBotsManager.getInlineResults(L.NM,this.gifBotPeerId,e,this.nextOffset);const{results:i,next_offset:s}=yield this.searchPromise;if(this.inputSearch.value!==e)return;this.searchPromise=null,this.nextOffset=s,t&&(this.gifsDiv.innerHTML=""),i.length?i.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}}}))}}var P=i(6787),Z=i(2325),T=i(7625),k=i(130),x=i(8115),A=i(9259),_=i(3541);class F extends y._{init(){this.container.id="stickers-container",this.container.classList.add("chatlist-container"),this.lazyLoadQueue=new d.Z,this.inputSearch=new w.Z("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),(0,A.Z)({listenTo:this.setsDiv,listenerSetter:this.listenerSetter}),(0,m.fc)(this.setsDiv,(e=>{const t=(0,C.Z)(e.target,"sticker-set-sticker");if(t){const e=t.dataset.docId;return void n.ZP.chat.input.sendMessageWithDocument(e)}const i=(0,C.Z)(e.target,"sticker-set");if(!i)return;const s=i.dataset.stickerSet,a=i.dataset.access_hash,o=(0,C.Z)(e.target,"sticker-set-button");o?(e.preventDefault(),e.cancelBubble=!0,o.setAttribute("disabled","true"),this.managers.appStickersManager.getStickerSet({id:s,access_hash:a}).then((e=>{this.managers.appStickersManager.toggleStickerSet(e.set).then((t=>{t&&(o.textContent="",o.append((0,Z.ag)(e.set.installed_date?"Stickers.SearchAdded":"Stickers.SearchAdd")),o.classList.toggle("gray",!!e.set.installed_date))})).finally((()=>{o.removeAttribute("disabled")}))}))):this.managers.appStickersManager.getStickerSet({id:s,access_hash:a}).then((e=>{new P.Z(e.set).show()}))}),{listenerSetter:this.listenerSetter}),l.ZP.toggleSidebar(!0).then((()=>{this.renderFeatured()}))}onCloseAfterTimeout(){return this.setsDiv.innerHTML="",o.Z.checkAnimations(void 0,"STICKERS-SEARCH"),super.onCloseAfterTimeout()}renderSet(e){const t=document.createElement("div");t.classList.add("sticker-set");const i=document.createElement("div");i.classList.add("sticker-set-header");const s=document.createElement("div");s.classList.add("sticker-set-details"),s.innerHTML='
',(0,k.Z)(s.firstElementChild,(0,x.Z)(e.title));const n=document.createElement("div");n.classList.add("sticker-set-count"),n.append((0,Z.ag)("Stickers",[e.count])),s.append(n);const a=document.createElement("button");a.classList.add("btn-primary","btn-color-primary","sticker-set-button"),a.append((0,Z.ag)(e.installed_date?"Stickers.SearchAdded":"Stickers.SearchAdd")),e.installed_date&&a.classList.add("gray"),i.append(s,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.inputSearch.value||(e=this.filterRendered("",e)).forEach((e=>{this.renderSet(e.set)}))}))}filterRendered(e,t){t=t.slice();const i=Array.from(this.setsDiv.children);return(0,T.Z)(i,(i=>{const s=i.dataset.stickerSet,n=t.findIndex((e=>e.set.id===s));-1!==n?t.splice(n,1):e&&i.dataset.title.toLowerCase().includes(e.toLowerCase())||i.remove()})),o.Z.checkAnimations(void 0,"STICKERS-SEARCH"),t}search(e){return e?this.managers.appStickersManager.searchStickerSets(e,!1).then((t=>{this.inputSearch.value===e&&(t=this.filterRendered(e,t)).forEach((e=>{this.renderSet(e.set)}))})):this.renderFeatured()}}var D,R=i(4668),B=i(8799),N=i(2648),O=i(3910),U=i(6339),H=i(5418),z=i(4762),j=i(3815),G=i(319),V=i(4789),K=i(6802),W=i.n(K),$=i(669),q=i(3299),Y=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Q="emoticons-dropdown",X={forceDuration:200,transitionFunction:W()(.42,0,.58,1)};class J extends U.Z{constructor(){super({element:document.getElementById("emoji-dropdown"),ignoreOutClickClassName:"input-message-input"}),this.tabId=-1,this.onSelectTabClick=e=>{if(this.tabId!==e)o.Z.checkAnimations(!0,Q),this.tabId=e,this.searchButton.classList.toggle("hide",this.tabId===this.emojiTab.tabId),this.deleteBtn.classList.toggle("hide",this.tabId!==this.emojiTab.tabId);else{const{tab:e}=this;this.scrollTo(e,e.scrollable.container.firstElementChild)}},this.checkRights=()=>Y(this,void 0,void 0,(function*(){const{peerId:e,threadId:t}=n.ZP.chat,i=this.tabsEl.children,s=Array.from(i),[a,o]=yield Promise.all([this.managers.appMessagesManager.canSendToPeer(e,t,"send_stickers"),this.managers.appMessagesManager.canSendToPeer(e,t,"send_gifs")]);s[this.stickersTab.tabId+1].toggleAttribute("disabled",!a),s[this.gifsTab.tabId+1].toggleAttribute("disabled",!o);const r=this.tabsEl.querySelector(".active");!r||(0,N.Z)(r)===this.emojiTab.tabId+1||a&&o||this.selectTab(this.emojiTab.tabId,!1)})),this.addEventListener("open",(()=>Y(this,void 0,void 0,(function*(){var e;s.Z&&(0,B.Z)()&&(yield(0,H.Z)(100)),this.element.parentElement!==n.ZP.chat.input.chatInput&&n.ZP.chat.input.chatInput.append(this.element),this.savedRange=this.getGoodRange(),J.lazyLoadQueue.lock(),o.Z.lockIntersectionGroup(Q);const t=this.tab;null===(e=t.onOpen)||void 0===e||e.call(t)})))),this.addEventListener("opened",(()=>{var e;o.Z.unlockIntersectionGroup(Q),J.lazyLoadQueue.unlockAndRefresh();const t=this.tab;null===(e=t.onOpened)||void 0===e||e.call(t)})),this.addEventListener("close",(()=>{var e;J.lazyLoadQueue.lock(),o.Z.lockIntersectionGroup(Q),o.Z.checkAnimations(!0,Q);const t=this.tab;null===(e=t.onClose)||void 0===e||e.call(t)})),this.addEventListener("closed",(()=>{var e;o.Z.unlockIntersectionGroup(Q),J.lazyLoadQueue.unlock(),J.lazyLoadQueue.refresh(),this.savedRange=void 0;const t=this.tab;null===(e=t.onClosed)||void 0===e||e.call(t)}))}get tab(){return this.tabs[this.tabId]}init(){this.managers=a.Z.managers,this.emojiTab=new h.ZP({managers:this.managers}),this.stickersTab=new v.ZP(this.managers),this.gifsTab=new g(this.managers),this.tabs={},[this.emojiTab,this.stickersTab,this.gifsTab].forEach(((e,t)=>{e.tabId=t,this.tabs[t]=e})),this.container=this.element.querySelector(".emoji-container .tabs-container"),this.container.prepend(this.emojiTab.container,this.stickersTab.container),this.tabsEl=this.element.querySelector(".emoji-tabs"),this.selectTab=(0,r.X)(this.tabsEl,this.container,this.onSelectTabClick,(()=>{var e;const{tab:t}=this;null===(e=t.init)||void 0===e||e.call(t),o.Z.checkAnimations(!1,Q)})),this.searchButton=this.element.querySelector(".emoji-tabs-search"),this.searchButton.addEventListener("click",(()=>{this.tabId===this.stickersTab.tabId?l.ZP.isTabExists(F)||l.ZP.createTab(F).open():l.ZP.isTabExists(M)||l.ZP.createTab(M).open()})),this.deleteBtn=this.element.querySelector(".emoji-tabs-delete"),(0,m.fc)(this.deleteBtn,(e=>{(0,O.Z)(e);const t=n.ZP.chat.input.messageInput;let i=$.Z.getInstance().getSavedRange(t);i||(i=document.createRange(),i.setStartAfter(t.lastChild));const s=i.cloneRange();if(i.collapsed){const{node:e,offset:n}=(0,q.q)(t,i.endContainer,i.endOffset);let a;if(n)a=e;else{if(a=e.previousSibling,!a)return;for(;a.nodeType===a.TEXT_NODE&&!a.nodeValue&&(a=a.previousSibling););if(a.nodeType===a.ELEMENT_NODE&&!a.isContentEditable)return}if(a.nodeType===a.ELEMENT_NODE&&"IMG"===a.tagName)s.selectNode(a);else{const e=[...a.textContent];let t;if(n){let i=0;t=e.find((e=>(i+=e.length,i>=n)))}else t=e.pop()||"";const i=n?n-t.length:a.textContent.length-t.length;s.setStart(a,i)}}s.deleteContents(),n.ZP.chat.input.messageInputField.simulateInputEvent()}));const e=z.IS_APPLE_MOBILE&&!1,t=e?this.stickersTab.tabId:this.emojiTab.tabId;if(e&&this.tabsEl.children[1].classList.add("hide"),(0,m.tH)(this.tabsEl.children[t+1]),this.tabs[t].init&&this.tabs[t].init(),!s.Z){let e,t=!1;const i=t=>{e=t};j.Z.addEventListener("change",(s=>{s?t||(document.body.addEventListener("mousemove",i),t=!0):t&&(document.body.removeEventListener("mousemove",i),e&&this.onMouseOut(e))}))}return n.ZP.addEventListener("peer_changing",(()=>{this.toggle(!1)})),n.ZP.addEventListener("peer_changed",this.checkRights),this.checkRights(),super.init()}getElement(){return this.element}scrollTo(e,t){e.scrollable.scrollIntoViewNew(Object.assign({element:t,axis:"y",position:"start"},X))}static sendDocId(e,t,i){return Y(this,void 0,void 0,(function*(){return(yield n.ZP.chat.input.sendMessageWithDocument(e,void 0,t,i))?(ee.container&&(ee.forceClose=!0,ee.toggle(!1)),!0):(console.warn("got no doc by id:",e),!1)}))}addLazyLoadQueueRepeat(e,t){this.addEventListener("close",(()=>{e.lock()})),this.addEventListener("closed",(()=>{const i=e.intersector.getVisible();for(const e of i)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===n.ZP.chat.input.messageInput)return e.getRangeAt(0)}}D=J,J.lazyLoadQueue=new d.Z(1),J.menuOnClick=(e,t,i,s,n,a)=>{let o=-1;const r=(e,t=!0)=>{if(e===n)return!1;let i=!1;return n&&(n.elements.menuTab.classList.remove("active"),n.menuScroll&&n.menuScroll!==e.menuScroll&&(i=!0,n.menuScroll.container.parentElement.classList.remove("active"),n.menuScroll.scrollIntoViewNew(Object.assign({element:n.menuScroll.container.firstElementChild,forceDirection:t?void 0:V.f.Static,position:"center",axis:"x"},X)))),e.elements.menuTab.classList.add("active"),e.menuScroll&&(e.menuScroll.container.parentElement.classList.add("active"),t&&s.scrollIntoViewNew(Object.assign({element:e.menuScroll.container.parentElement,position:"center",axis:"x"},X))),n&&((e,t)=>{const i=e.menuScroll||s;i&&i.scrollIntoViewNew(Object.assign({element:e.elements.menuTab,position:"center",axis:"x",getElementPosition:t?({elementPosition:e})=>e-106:void 0},X))})(e,i),n=e,!0};let d=!1;const l=new c.Z(i.container,((t,s)=>{if(d)return;if(Math.abs(o-i.container.scrollTop)<=1)return;o=-1;const n=e.getCategoryByContainer(s),a=(0,N.Z)(s);(t||!a&&!n.menuScroll)&&r(n)}));(0,m.fc)(t,(t=>{let s=(0,C.Z)(t.target,"menu-horizontal-div-item");if(!s){if(s=(0,C.Z)(t.target,"menu-horizontal-inner"),!s||s.classList.contains("active"))return;s=s.firstElementChild.firstElementChild}const n=(0,N.Z)(s),a=e.getCategoryByMenuTab(s);r(a);let l=0,c=0;if(n>0||a.menuScroll){const e=a.elements.container;c=1,l=e.offsetTop+c}o=l,d=!0,i.scrollIntoViewNew(Object.assign({element:l?a.elements.container:i.container.firstElementChild,position:"start",axis:"y",getElementPosition:l?({elementPosition:e})=>e+c:void 0},X)).finally((()=>{r(a),d=!1}))}),{listenerSetter:a});const h=i.onAdditionalScroll?i.onAdditionalScroll.bind(i):G.Z;return i.onAdditionalScroll=()=>{e.content.parentElement.classList.toggle("scrolled-top",!i.scrollTop),h()},{stickyIntersector:l,setActive:r,setActiveStatic:t=>{if(null==n?void 0:n.local)return;e.scrollable.scrollTop=t.elements.container.offsetTop+1;const i=e.menuScroll.container,s=t.elements.menuTab;i.scrollLeft=s.offsetLeft-i.clientWidth/2+s.offsetWidth/2,r(t,!1)}}},J.onMediaClick=(e,t=!1,i)=>Y(void 0,void 0,void 0,(function*(){const s=(0,R.Z)(e.target,"DIV");if(!s)return!1;const n=s.dataset.docId;return!!n&&D.sendDocId(n,t,i)}));const ee=new J;b.GO.emoticonsDropdown=ee;const te=ee},6039:(e,t,i)=>{"use strict";i.d(t,{IA:()=>F,ZP:()=>j,xG:()=>D});var s=i(3173),n=i(3910),a=i(8497),o=i(3035),r=i(5418),d=i(9322),l=i(3512),c=i(671),h=i(279),u=i(8805),p=i(9976),f=i(5432),m=i(8799),g=i(3447),v=i(7746),b=i(8115),y=i(7197),w=i(5400),S=i(2738),C=i(6057),L=i(9405),E=i(2940),I=i(4755),M=i(1273),P=i(9259),Z=i(4064),T=i(4484),k=i(6787),x=i(2796),A=i(5953);const _=new Set;function F(e,t,i=!1,s=!1){var n;const a=document.createElement("span");let r;if(a.classList.add("super-emoji"),s&&!p.Z?r=function(e){return(0,w.ZP)(e,{entities:[(0,y.Z)(e)]})}(e):(e=(0,v.Z)(e),r=(0,b.Z)(e)),a.append(r),a.children.length>1){const e=a.firstElementChild;a.innerHTML="",a.append(e)}if("IMG"===(null===(n=a.firstElementChild)||void 0===n?void 0:n.tagName)){const e=a.firstElementChild,t=e.src;if(!_.has(t)){e.setAttribute("loading","lazy");const i=document.createElement("span");i.classList.add("emoji-placeholder"),l.Z.settings.animationsEnabled&&(e.style.opacity="0",i.style.opacity="1"),e.addEventListener("load",(()=>{(0,o.T2)((()=>{l.Z.settings.animationsEnabled&&(e.style.opacity="",i.style.opacity=""),a.classList.remove("empty"),_.add(t)}))}),{once:!0}),a.append(i)}}return t&&(i?t.prepend(a):t.appendChild(a)),a}function D(e){const t=(0,a.Z)(e,"super-emoji");if(!t)return;const i=t.firstElementChild;return i&&i.classList.contains("custom-emoji")?{emoji:i.dataset.stickerEmoji,docId:i.dataset.docId}:e.nodeType===e.TEXT_NODE?{emoji:e.nodeValue}:("SPAN"===e.tagName&&!e.classList.contains("emoji")&&e.firstElementChild&&(e=e.firstElementChild),{emoji:e.getAttribute("alt")||e.innerText})}const R="Emoji.Recent",B=[R,"recent"],N=["",""],O=[["Emoji.SmilesAndPeople","smile"],["Emoji.AnimalsAndNature","animals"],["Emoji.FoodAndDrink","eats"],["Emoji.TravelAndPlaces","car"],["Emoji.ActivityAndSport","sport"],["Emoji.Objects","lamp"],["Emoji.Flags","flag"],["Skin Tones",""]];let U;function H(){if(U)return U;U=new Map([[N,[]],[B,[]]]);for(const e in g.Z){const t=""+g.Z[e],i=O[+t[0]-1];if(!i)continue;let s=U.get(i);s||(s=[],U.set(i,s)),s[+t.slice(1)||0]=e}U.delete(O.pop()),O.unshift(N,B);const e=O.map((([e])=>e)),t=[...U.entries()].sort(((t,i)=>e.indexOf(t[0][0])-e.indexOf(i[0][0])));return U=new Map(t),U}const z=(0,L.C)(42,42);class j extends C.pw{constructor(e){super(e.managers,"super-emojis",(()=>z),16,4,0),this.onCategoryVisibility=({target:e,visible:t})=>{const i=this.categoriesMap.get(e),s=i.elements.renderer,n=[];if(s){n.push(s);const e=new Map;t?(n.push(...i.items.map((({docId:t,element:i})=>{if(!t)return i;const s=i.firstElementChild;return s.clear(!1),e.set(s.docId,new Set([s])),i}))),s.add(e,void 0,void 0,!1)):(s.clearCanvas(),s.middlewareHelper.clean())}else t&&n.push(...i.items.map((({element:e})=>e)));if(i.elements.items.replaceChildren(...n),s&&!t){const e=new Map;i.items.forEach((({docId:t,element:i})=>{if(!t)return;const s=i.firstElementChild;s.clear(),e.set(s.docId,new Set([s]))})),s.add(e,void 0,!0)}},this.onContentClick=e=>{(0,n.Z)(e);const{target:t}=e,i=(0,a.Z)(t,"emoji-category"),s=this.categoriesMap.get(i);if((0,a.Z)(t,"category-title")){if(s.local)return;return void new k.Z({id:s.set.id,access_hash:s.set.access_hash},!0).show()}const o=D(t);if(o){if(o.docId&&!l.Z.premium&&(this.isStandalone?""!==s.id:this.peerId!==l.Z.myId)){const e=document.createElement("a");return e.onclick=()=>{d.ZP.openPremiumBot(),(0,x.PE)()},void(0,x.bC)({langPackKey:"CustomEmoji.PremiumAlert",langPackArguments:[e]})}this.onClick?this.onClick(Object.assign(Object.assign({},o),{element:(0,a.Z)(t,"super-emoji").firstElementChild})):d.ZP.chat.input.onEmojiSelected(o,!1),f.Z&&(0,m.Z)()}},(0,A.Z)(this,e),this.container.classList.add("emoji-padding"),this.content.id="content-emoji",this.activeElements=[]}destroy(){var e;super.destroy(),null===(e=this.menuInnerScroll)||void 0===e||e.destroy()}init(){super.init(),this.init=void 0;const e={root:this.isStandalone?this.content:s.ZP.getElement()};this.categoriesIntersector=new E.Z(this.onCategoryVisibility,e),this.menuOnClickResult=s.Jo.menuOnClick(this,this.menu,this.scrollable,this.menuScroll,void 0,this.listenerSetter);const t=(0,h.y)(this.content,!0);let i,n;if(!this.isStandalone){const e=this.menuInnerScroll=new u.v7(void 0);e.container.classList.add("menu-horizontal-inner-scroll"),i=document.createElement("div"),i.classList.add("menu-horizontal-inner"),i.append(e.container)}H(),n=this.noRegularEmoji?new Map([[[N[0],"recent"],[]]]):H(),n.forEach(((e,[t,i])=>{const s=this.createLocalCategory(t,t,i,!i);s.elements.container.classList.remove("hide"),s.elements.items.classList.add(i&&!this.isStandalone?"is-local":"not-local"),e.forEach((e=>{const t=(0,c.zu)(e);this.addEmojiToCategory({category:s,emoji:{emoji:t},batch:!0})}))}));const a=Promise.all([this.isStandalone?void 0:(0,r.Z)(200),!this.noRegularEmoji&&this.managers.appEmojiManager.getRecentEmojis("native"),!this.isStandalone&&this.managers.appEmojiManager.getRecentEmojis("custom"),this.stickerSetId&&this.managers.appStickersManager.getLocalStickerSet(this.stickerSetId),this.managers.appEmojiManager.getCustomEmojis()]).then((([e,n,a,o,r])=>{t.remove(),o&&(a=o.documents.map((e=>e.id)));const c=this.categories[R],h=this.categories[""];if(this.isStandalone||[c&&[c,n],h&&[h,a]].filter(Boolean).forEach((([e,t])=>{e.limit=32,t.splice(32,t.length-32)})),c&&n)for(const e of n)this.addEmojiToCategory({category:c,emoji:{emoji:e},batch:!0});if(h){if(this.createRendererForCategory(h),a)for(const e of a)this.addEmojiToCategory({category:h,emoji:{emoji:"",docId:e},batch:!0});h.elements.container.style.paddingTop=".5rem"}O.forEach((([e])=>{const t=this.categories[e];t&&(this.toggleLocalCategory(t,!0),e!==R&&""!==e&&(t.menuScroll=this.menuInnerScroll,this.menuInnerScroll.container.append(t.elements.menuTab)))})),this.resizeCategories(),c&&i&&c.elements.menuTab.after(i),r.sets.forEach((e=>{this.renderStickerSet(e)})),this.listenerSetter.add(l.Z)("premium_toggle",(()=>{this.toggleCustomCategory()})),this.listenerSetter.add(l.Z)("stickers_top",this.postponedEvent((e=>{const t=this.categories[e];t&&(this.positionCategory(t,!0),this.listenerSetter.add(s.ZP)("openAfterLayout",(()=>{this.menuOnClickResult.setActiveStatic(t)}),{once:!0}))})));const u=e=>{for(const t in this.categories){const i=this.categories[t].elements.renderer;i&&(i.ignoreSettingDimensions=e,e||i.setDimensionsFromRect(void 0,!0))}};!this.isStandalone&&this.listenerSetter.add(s.ZP)("opened",(()=>{u(!1)})),!this.isStandalone&&this.listenerSetter.add(s.ZP)("close",(()=>{u(!0)})),this.listenerSetter.add(l.Z)("stickers_installed",(e=>{!this.categories[e.id]&&e.pFlags.emojis&&this.renderStickerSet(e,!0)})),this.listenerSetter.add(l.Z)("stickers_deleted",(e=>{const t=this.categories[e.id];if(this.deleteCategory(t)){const{renderer:e}=t.elements;e&&e.middlewareHelper.clean()}})),!this.isStandalone&&this.listenerSetter.add(l.Z)("emoji_recent",this.postponedEvent((e=>{const t=this.categories[e.docId?"":R];if(!t)return;const i=e.docId?t=>t.docId===e.docId:t=>t.emoji===e.emoji,s=(0,Z.Z)(t.items,i);if(s){if(t.items.unshift(s),this.isCategoryVisible(t)){const{renderer:e}=t.elements;(0,T.Z)(s.element,t.elements.items,e?1:0,-1),null==e||e.forceRender()}}else this.addEmojiToCategory({category:t,emoji:e,batch:!1,prepend:!0});0===this.closeScrollTop&&this.menuOnClickResult.setActive(e.docId?this.categories[R]:t)}))),!this.isStandalone&&this.listenerSetter.add(d.ZP)("peer_changed",(()=>{this.toggleCustomCategory()})),this.toggleCustomCategory(),this.menuOnClickResult.setActive(null!=c?c:h)}));return(0,S.fc)(this.content,this.onContentClick,{listenerSetter:this.listenerSetter}),(0,P.Z)({listenTo:this.content,listenerSetter:this.listenerSetter}),a}renderStickerSet(e,t){const i=this.createCategory(e,(0,b.Z)(e.title));this.positionCategory(i,t);const{container:n,menuTabPadding:a}=i.elements;i.elements.items.classList.add("not-local"),i.elements.container.classList.add("is-premium-set"),i.elements.title.classList.add("tgico"),this.createRendererForCategory(i),this.managers.appStickersManager.getStickerSet(e).then((({documents:e})=>{e.forEach((e=>{this.addEmojiToCategory({category:i,emoji:{docId:e.id,emoji:e.stickerEmojiRaw},batch:!0})})),this.onCategoryVisibility({target:i.elements.container,visible:this.isCategoryVisible(i)}),i.setCategoryItemsHeight(),n.classList.remove("hide")})),(0,M.Z)({set:e,container:a,group:s.Yd,lazyLoadQueue:s.Jo.lazyLoadQueue,width:32,height:32,autoplay:!1})}get peerId(){return d.ZP.chat.peerId}getCustomCategory(){return this.categories[""]}toggleCustomCategory(){const e=this.categories[""],t=l.Z.premium||this.peerId===l.Z.myId,i=t||this.isStandalone;super.toggleLocalCategory(e,!!e.items.length&&i),this.content.classList.toggle("has-premium",t)}toggleLocalCategory(e,t){""!==e.id?super.toggleLocalCategory(e,t):this.toggleCustomCategory()}createRendererForCategory(e){const t=w.KZ.create({animationGroup:s.Yd,customEmojiSize:I.Z.active.esgCustomEmoji});e.elements.renderer=t,e.elements.items.append(t)}addEmojiToCategory(e){const{category:t,emoji:i,batch:s,prepend:n}=e;let a=e.element;if(a){const e=document.createElement("span");e.classList.add("super-emoji"),e.append(a),a=e}else if(i.docId){const e=w.LD.create(i.docId),t=document.createElement("span");t.classList.add("super-emoji"),t.append(e),a=t}else a=F(i.emoji,void 0,!1);const o=Object.assign(Object.assign({},i||{emoji:void 0}),{element:a});(e.active||this.activeEmoji&&(o.docId?this.activeEmoji.docId===o.docId:this.activeEmoji.emoji===o.emoji))&&(this.activeEmoji,this.activeElements.push(o),a.classList.add("active")),t.items[n?"unshift":"push"](o),s||this.spliceExceed(t)||this.onLocalCategoryUpdate(t)}setActive(e){var t,i;(e===this.activeEmoji||(null==e?void 0:e.docId)?e.docId!==(null===(t=this.activeEmoji)||void 0===t?void 0:t.docId):(null==e?void 0:e.emoji)!==(null===(i=this.activeEmoji)||void 0===i?void 0:i.emoji))&&(this.activeEmoji=e,this.activeElements.forEach((e=>{e.element.classList.remove("active")})),this.activeElements.length=0,this.categoriesMap.forEach((t=>{t.items.forEach((t=>{(e.docId?t.docId===e.docId:t.emoji===e.emoji)&&(t.element.classList.add("active"),this.activeElements.push(t))}))})))}onClose(){this.closeScrollTop=this.scrollable.scrollTop}}},6057:(e,t,i)=>{"use strict";i.d(t,{pw:()=>D,vT:()=>_,ZP:()=>R});var s=i(3173),n=i(8497),a=i(4755),o=i(2325),r=i(8115),d=i(3512),l=i(5814),c=i(1655),h=i(7009),u=i(2940);class p extends h.Z{constructor(e,t,i){super(e),this.onVisibilityChange=t,this.elementsMap=new Map,this.intersector=new u.Z((e=>{var t;const{target:i,visible:s}=e,n=this.elementsMap.get(i);n.visible=s,s?(n.wasSeen=!0,this.queue.includes(n)||this.queue.push(n)):(0,c.Z)(this.queue,n),null===(t=this.onVisibilityChange)||void 0===t||t.call(this,e),this.setProcessQueueTimeout()}),i)}clear(){super.clear(),this.elementsMap.clear()}observe(e){this.elementsMap.set(e.div,e),super.observe(e)}unobserve(e){this.elementsMap.delete(e.div),super.unobserve(e)}}var f=i(279),m=i(6787),g=i(8805),v=i(4064),b=i(2738),y=i(4484),w=i(319),S=i(2230),C=i(5592),L=i(3163),E=i(5975),I=i(7625),M=i(9259),P=i(3699),Z=i(3541),T=i(1273),k=i(8222),x=i(241),A=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class _{constructor(e,t,i,s){this.regularLazyLoadQueue=e,this.group=t,this.managers=i,this.options=s,this.animated=new Set,this.checkAnimationContainer=(e,t)=>{l.Z.getAnimations(e).forEach((e=>{t?l.Z.checkAnimation(e,!1):l.Z.removeAnimation(e)}))},this.processVisible=e=>A(this,void 0,void 0,(function*(){const t=e.dataset.docId,i=yield this.managers.appDocsManager.getDoc(t),s=a.Z.active.esgSticker.width,n=(0,Z.ZP)({doc:i,div:e,width:s,height:s,lazyLoadQueue:null,group:this.group,onlyThumb:!1,play:!0,loop:!0,withLock:!0}).then((({render:e})=>e));return n.then((()=>{this.checkAnimationContainer(e,this.lazyLoadQueue.intersector.isVisible(e))})),n})),this.processInvisible=e=>A(this,void 0,void 0,(function*(){const t=e.dataset.docId,i=yield this.managers.appDocsManager.getDoc(t);this.checkAnimationContainer(e,!1),e.textContent="",this.renderSticker(i,e)})),this.lazyLoadQueue=new p(void 0,(({target:e,visible:t})=>{t||this.processInvisible(e)}),s)}clear(){this.lazyLoadQueue.clear()}renderSticker(e,t,i){return t||((t=document.createElement("div")).classList.add("grid-item","super-sticker"),t.dataset.docId=""+e.id,e.animated&&this.observeAnimated(t)),(0,Z.ZP)({doc:e,div:t,lazyLoadQueue:this.regularLazyLoadQueue,group:this.group,onlyThumb:e.animated,loadPromises:i}),t}observeAnimated(e){this.animated.add(e),this.lazyLoadQueue.observe({div:e,load:this.processVisible})}unobserveAnimated(e){this.animated.delete(e),this.lazyLoadQueue.delete({div:e})}}class F{constructor(e){var t,i;const s=document.createElement("div");s.classList.add("emoji-category");const n=document.createElement("div");let a,o,r;n.classList.add("category-items"),e.title&&(a=document.createElement("div"),a.classList.add("category-title"),a.append(e.title)),e.noMenuTab||(o=(0,S.Z)(void 0,{noRipple:!0}),o.classList.add("menu-horizontal-div-item"),r=document.createElement("div"),r.classList.add("menu-horizontal-div-item-padding"),o.append(r)),a&&s.append(a),s.append(n),this.elements={container:s,title:a,items:n,menuTab:o,menuTabPadding:r},this.id=e.id,this.items=[],this.getContainerSize=e.getContainerSize,this.getElementMediaSize=e.getElementMediaSize,this.gapX=null!==(t=e.gapX)&&void 0!==t?t:0,this.gapY=null!==(i=e.gapY)&&void 0!==i?i:0}setCategoryItemsHeight(){const{width:e}=this.getContainerSize(),t=this.getElementMediaSize().width;let i=e/t;this.gapX&&(i-=Math.floor(i-1)*this.gapX/t),i=Math.floor(i);const s=Math.ceil(this.items.length/i);let n=s*t;this.gapY&&(n+=(s-1)*this.gapY),this.elements.items.style.minHeight=n+"px"}}class D{constructor(e,t,i,n,a,o){this.managers=e,this.categoryItemsClassName=t,this.getElementMediaSize=i,this.padding=n,this.gapX=a,this.gapY=o,this.mounted=!1,this.resizeCategories=()=>{for(const[e,t]of this.categoriesMap)t.setCategoryItemsHeight()},this.postponedEvent=e=>(...t)=>{s.ZP.isActive()?this.postponedEvents.push({cb:e,args:t}):e(...t)},this.categories={},this.categoriesMap=new Map,this.categoriesByMenuTabMap=new Map,this.localCategories=[],this.postponedEvents=[],this.listenerSetter=new P.Z,this.container=document.createElement("div"),this.container.classList.add("tabs-tab","emoticons-container"),this.menuWrapper=document.createElement("div"),this.menuWrapper.classList.add("menu-wrapper","emoticons-menu-wrapper"),this.menu=document.createElement("nav"),this.menu.className="menu-horizontal-div no-stripe justify-start emoticons-menu",this.menuWrapper.append(this.menu),this.menuScroll=new g.v7(this.menuWrapper),this.content=document.createElement("div"),this.content.classList.add("emoticons-content"),this.container.append(this.menuWrapper,this.content),this.scrollable=new g.ZP(this.content,"STICKERS")}getCategoryByContainer(e){return this.categoriesMap.get(e)}getCategoryByMenuTab(e){return this.categoriesByMenuTabMap.get(e)}createCategory(e,t,i,s){const n=new F({id:""+e.id,title:t,overflowElement:this.content,getContainerSize:()=>{let e,t;if(this.getContainerSize){const i=this.getContainerSize();e=i.width,t=i.height}else{const t=k.Z.getPropertyAsSize("esg-width");e=void 0===t?x.Z.width:t}return{width:e-this.padding,height:t}},getElementMediaSize:this.getElementMediaSize,gapX:this.gapX,gapY:this.gapY,noMenuTab:s});this.categoryItemsClassName&&n.elements.items.classList.add(this.categoryItemsClassName);const a=n.elements.container;return a.classList.add("hide"),n.set=e,this.categories[e.id]=n,this.categoriesMap.set(a,n),!s&&this.categoriesByMenuTabMap.set(n.elements.menuTab,n),this.categoriesIntersector.observe(a),!s&&this.menuOnClickResult.stickyIntersector.observeStickyHeaderChanges(a),i||!s&&n.elements.menuTab.classList.add("not-local"),n}positionCategory(e,t){const{menuTab:i,container:s}=e.elements,n=t?this.localCategories.filter((e=>e.mounted)).length:65535;let a=!1;const o=t?this.localCategories.filter((e=>e.menuScroll&&!a?(a=!0,!0):e.mounted&&!e.menuScroll&&e.elements.menuTab)).length:65535;(0,y.Z)(s,this.scrollable.container,n),(0,y.Z)(i,this.menu,o)}isCategoryVisible(e){return this.categoriesIntersector.getVisible().includes(e.elements.container)}toggleLocalCategory(e,t){var i;if(t){const t=this.localCategories.indexOf(e),i=this.localCategories.slice(0,t);let s=0,n=0;i.forEach((e=>{e.mounted?e.elements.menuTab&&!e.menuScroll||++n:(++s,++n)}));const a=t-s,o=t-n;e.elements.menuTab&&(0,y.Z)(e.elements.menuTab,this.menu,o),(0,y.Z)(e.elements.container,this.scrollable.container,a)}else null===(i=e.elements.menuTab)||void 0===i||i.remove(),e.elements.container.remove();e.mounted=t}createLocalCategory(e,t,i,s){const n=this.createCategory({id:e},t&&(0,o.ag)(t),!0,s);return n.local=!0,this.localCategories.push(n),n.elements.title&&n.elements.title.classList.add("disable-hover"),s||(i&&n.elements.menuTab.classList.add("tgico","tgico-"+i),n.elements.menuTabPadding.remove()),this.toggleLocalCategory(n,!1),n}onLocalCategoryUpdate(e){e.setCategoryItemsHeight(),this.toggleLocalCategory(e,!!e.items.length)}deleteCategory(e){return!!e&&(e.elements.container.remove(),e.elements.menuTab.remove(),this.categoriesIntersector.unobserve(e.elements.container),delete this.categories[e.id],this.categoriesMap.delete(e.elements.container),this.categoriesByMenuTabMap.delete(e.elements.menuTab),!0)}spliceExceed(e){if(void 0===e.limit)return!1;const{items:t,limit:i}=e;return t.splice(i,t.length-i).forEach((({element:e})=>{e.remove()})),this.onLocalCategoryUpdate(e),!0}init(){this.listenerSetter.add(s.ZP)("closed",(()=>{this.postponedEvents.forEach((({cb:e,args:t})=>{e(...t)})),this.postponedEvents.length=0}))}destroy(){var e,t,i,s;this.getContainerSize=void 0,this.postponedEvents.length=0,null===(e=this.categoriesIntersector)||void 0===e||e.disconnect(),this.listenerSetter.removeAll(),this.scrollable.destroy(),null===(t=this.menuScroll)||void 0===t||t.destroy(),null===(s=null===(i=this.menuOnClickResult)||void 0===i?void 0:i.stickyIntersector)||void 0===s||s.disconnect()}}class R extends D{constructor(e){super(e,"super-stickers",(()=>a.Z.active.esgSticker),6,4,4),this.onCategoryVisibility=({target:e,visible:t,entry:i})=>{const s=this.categoriesMap.get(e);s.elements.items.replaceChildren(...t?s.items.map((({element:e})=>e)):[])},this.setTyping=(e=!1)=>{(e||s.ZP.isActive()&&s.ZP.tab===this)&&d.Z.dispatchEvent("choosing_sticker",!e)},this.container.classList.add("stickers-padding"),this.content.id="content-stickers"}setFavedLimit(e){this.categories.faved.limit=e}categoryAppendStickers(e,t){const{container:i}=e.elements;t.then((t=>{const s=this.isCategoryVisible(e);t.forEach((t=>{const i=this.superStickerRenderer.renderSticker(t);e.items.push({document:t,element:i}),s&&e.elements.items.append(i)})),e.setCategoryItemsHeight(),i.classList.remove("hide")}))}renderStickerSet(e,t=!1){return A(this,void 0,void 0,(function*(){const i=this.createCategory(e,(0,r.Z)(e.title)),{menuTabPadding:n}=i.elements,a=this.managers.appStickersManager.getStickerSet(e);this.categoryAppendStickers(i,a.then((e=>e.documents))),this.positionCategory(i,t),(0,T.Z)({set:e,container:n,group:s.Yd,lazyLoadQueue:s.Jo.lazyLoadQueue,width:32,height:32,autoplay:!1})}))}init(){super.init(),this.scrollable.onAdditionalScroll=()=>{this.setTyping()};const e={root:s.ZP.getElement()};this.categoriesIntersector=new u.Z(this.onCategoryVisibility,e);const t=e=>{e.elements.items.replaceChildren(),e.items.forEach((({element:e})=>this.superStickerRenderer.unobserveAnimated(e))),e.items.length=0};this.scrollable.container.addEventListener("click",(e=>{const t=e.target;if((0,n.Z)(t,"category-title")){const e=(0,n.Z)(t,"emoji-category"),i=this.categoriesMap.get(e);if(i.local)return;new m.Z({id:i.set.id,access_hash:i.set.access_hash}).show()}else s.Jo.onMediaClick(e)})),this.menuOnClickResult=s.Jo.menuOnClick(this,this.menu,this.scrollable,this.menuScroll);const i=(0,f.y)(this.content,!0),o=(e,t)=>{e.limit&&(t=t.slice(0,e.limit));const i=new Set(t.map((e=>e.id)));(0,I.Z)(e.items,(t=>{i.has(t.document.id)||this.deleteSticker(e,t.document,!0)})),this.toggleLocalCategory(e,!!t.length),(0,I.Z)(t,((t,i)=>{this.unshiftSticker(e,t,!0,i)})),this.spliceExceed(e),e.elements.container.classList.remove("hide")},r=this.createLocalCategory("faved","FavoriteStickers","savedmessages"),l=this.createLocalCategory("recent","Stickers.Recent","recent");l.limit=20;const c=(0,S.Z)("close",{noRipple:!0});l.elements.title.append(c),(0,b.fc)(c,(()=>{(0,C.Z)({titleLangKey:"ClearRecentStickersAlertTitle",descriptionLangKey:"ClearRecentStickersAlertMessage",button:{langKey:"Clear"}}).then((()=>{this.managers.appStickersManager.clearRecentStickers()}),w.Z)}));const h=this.createLocalCategory("premium","PremiumStickersShort"),p=document.createElement("span");p.classList.add("tgico-star","color-premium"),h.elements.menuTab.append(p);const g=[Promise.all([this.managers.apiManager.getLimit("favedStickers"),this.managers.appStickersManager.getFavedStickersStickers()]).then((([e,t])=>{this.setFavedLimit(e),o(r,t)})),this.managers.appStickersManager.getRecentStickersStickers().then((e=>{o(l,e)})),this.managers.appStickersManager.getAllStickers().then((e=>{for(const t of e.sets)this.renderStickerSet(t)})),this.managers.appStickersManager.getPremiumStickers().then((e=>{const t=e.length;this.toggleLocalCategory(h,d.Z.premium&&!!t),this.categoryAppendStickers(h,Promise.resolve(e)),d.Z.addEventListener("premium_toggle",(e=>{this.toggleLocalCategory(this.categories.premium,e&&!!t)}))}))];Promise.race(g).finally((()=>{i.remove()})),Promise.all(g).finally((()=>{this.mounted=!0,this.setTyping();const e=this.categories.faved,t=this.categories.recent;this.menuOnClickResult.setActive(e.items.length?e:t),d.Z.addEventListener("stickers_installed",(e=>{this.categories[e.id]||this.renderStickerSet(e,!0)}))})),this.superStickerRenderer=new _(s.Jo.lazyLoadQueue,s.Yd,this.managers,e);const v=this.superStickerRenderer.lazyLoadQueue;s.ZP.addLazyLoadQueueRepeat(v,this.superStickerRenderer.processInvisible),d.Z.addEventListener("sticker_updated",(({type:e,document:t,faved:i})=>{const s=this.categories["faved"===e?"faved":"recent"];s&&(i?this.unshiftSticker(s,t):this.deleteSticker(s,t))})),d.Z.addEventListener("stickers_deleted",(({id:e})=>{const i=this.categories[e];this.deleteCategory(i)&&t(i)})),d.Z.addEventListener("stickers_top",this.postponedEvent((e=>{const t=this.categories[e];t&&(this.positionCategory(t,!0),s.ZP.addEventListener("openAfterLayout",(()=>{this.menuOnClickResult.setActiveStatic(t)}),{once:!0}))}))),d.Z.addEventListener("stickers_updated",(({type:e,stickers:t})=>{const i=this.categories["faved"===e?"faved":"recent"];i&&o(i,t)})),d.Z.addEventListener("app_config",(()=>{this.managers.apiManager.getLimit("favedStickers").then((e=>{this.setFavedLimit(e)}))})),a.Z.addEventListener("resize",this.resizeCategories),(0,M.Z)({listenTo:this.content,listenerSetter:new P.Z});const y="menu";(0,L.Z)({listenTo:this.content,verifyRecent:e=>!!(0,E.Z)(e,this.categories.recent.elements.items),onOpen:()=>{s.ZP.setIgnoreMouseOut(y,!0)},onClose:()=>{s.ZP.setIgnoreMouseOut(y,!1)}}),this.init=null}deleteSticker(e,t,i){const s=(0,v.Z)(e.items,(e=>e.document.id===t.id));s&&(s.element.remove(),i||this.onLocalCategoryUpdate(e))}unshiftSticker(e,t,i,s){if(void 0!==s){const i=e.items[s];if(i&&i.document.id===t.id)return}let n=(0,v.Z)(e.items,(e=>e.document.id===t.id));n||(n={element:this.superStickerRenderer.renderSticker(t),document:t}),e.items.unshift(n),e.elements.items.prepend(n.element),i||this.spliceExceed(e)}unshiftRecentSticker(e){this.managers.appStickersManager.saveRecentSticker(e.id)}deleteRecentSticker(e){this.managers.appStickersManager.saveRecentSticker(e.id,!0)}onClosed(){this.setTyping(!0)}onOpened(){this.setTyping(),this.resizeCategories()}}},36:(e,t,i)=>{"use strict";i.d(t,{G:()=>s});const s=()=>{const e=document.createElement("div");return e.classList.add("gradient-delimiter"),e}},5948:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(2325);function n(e){const t=document.createElement("span");return t.classList.add("badge-fake"),(0,s.$d)(t,e?"ScamMessage":"FakeMessage"),t}},1080:(e,t,i)=>{"use strict";i.d(t,{Z:()=>f});var s=i(5814),n=i(3725),a=i(3035),o=i(3512),r=i(8847),d=i(7009),l=i(2940);class c extends d.Z{constructor(e,t){super(e),this.onVisibilityChange=t,this.intersector=new l.Z((e=>{const{target:t,visible:i}=e,s=(0,r.Z)(this.queue,(e=>e.div===t));i&&s.length&&s.forEach((e=>{this.queue.unshift(e)})),this.onVisibilityChange&&this.onVisibilityChange(e),this.setProcessQueueTimeout()}))}observe(e){super.observe(e)}}var h=i(2887),u=i(319),p=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class f{constructor(e,t,i,r=!0){this.element=e,this.group=t,this.scrollable=i,this.scrollPromise=Promise.resolve(),this.timeout=0,this.onScroll=()=>{this.timeout?clearTimeout(this.timeout):this.scrollPromise=(0,n.Z)(),this.timeout=window.setTimeout((()=>{this.timeout=0,this.scrollPromise.resolve()}),150)},this.processInvisibleDiv=e=>this.scrollPromise.then((()=>p(this,void 0,void 0,(function*(){if(this.lazyLoadQueue.intersector.isVisible(e))return;const t=e.querySelector("video"),i=e.querySelector("img, canvas");i&&(i.classList.remove("hide"),yield(0,a.d1)()),!this.lazyLoadQueue.intersector.isVisible(e)&&t&&(t.remove(),t.src="",t.load(),s.Z.getAnimations(t).forEach((e=>{s.Z.removeAnimation(e)})))})))),this.managers=o.Z.managers,this.lazyLoadQueue=new c(void 0,(({target:e,visible:t})=>{t?this.processVisibleDiv(e):this.processInvisibleDiv(e)})),r&&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){e.querySelector("video")||this.lazyLoadQueue.push({div:e,load:()=>{const t=e.dataset.docId;return Promise.all([this.managers.appDocsManager.getDoc(t),this.scrollPromise]).then((([t])=>p(this,void 0,void 0,(function*(){const i=(yield(0,h.Z)({doc:t,container:e,lazyLoadQueue:null,group:this.group,noInfo:!0,noPreview:!0})).loadPromise;return i.finally((()=>{const t=e.querySelector("video"),i=e.querySelector("img, canvas");i&&i.classList.add("hide"),t&&!t.parentElement&&setTimeout((()=>{t.src="",t.load(),s.Z.getAnimations(t).forEach((e=>{s.Z.removeAnimation(e)}))}),0),this.lazyLoadQueue.intersector.isVisible(e)||this.processInvisibleDiv(e)})),i}))))}})}add(e,t=this.element){const i=document.createElement("div");i.classList.add("gif","grid-item"),i.dataset.docId=""+e.id,t.append(i),this.lazyLoadQueue.observe({div:i,load:u.Z}),(0,h.Z)({doc:e,container:i,lazyLoadQueue:null,noInfo:!0,onlyPreview:!0})}}},6008:(e,t,i)=>{"use strict";i.d(t,{X:()=>c});var s=i(426),n=i(3512),a=i(3035),o=i(4789),r=i(5975),d=i(2648),l=i(2738);function c(e,t,i,c,h=200,u,p){const f=(0,s.Z)({content:t,type:e||"tabs"===t.dataset.animation?"tabs":"navigation",transitionTime:h,onTransitionEnd:c,listenerSetter:p});if(!e)return f;const m=new Proxy(f,{apply:(t,i,s)=>{const n=+s[0],a=void 0===s[1]||s[1],o=e.querySelector(`[data-tab="${n}"]`)||e.children[n];g(o,n,a)}}),g=(s,r,d=!0)=>{return l=this,c=void 0,m=function*(){const l=t.children[r];if(i){const e=i(r,l,d),t=e instanceof Promise?yield e:e;if(void 0!==t&&!t)return}u&&u.scrollIntoViewNew({element:s.parentElement.children[r],position:"center",forceDirection:d?void 0:o.f.Static,forceDuration:h,axis:"x"}),n.Z.settings.animationsEnabled||(d=!1);const c=f.prevId();if(s.classList.contains("active")||r===c)return!1;const p=d?a.T2:e=>e(),m=e.querySelector(b.toLowerCase()+".active");m&&p((()=>{m.classList.remove("active")})),v&&-1!==c&&d&&p((()=>{const e=s.querySelector("i"),t=s.parentElement.children[c].querySelector("i");t.classList.remove("animate"),e.classList.remove("animate");const i=t.parentElement.parentElement.offsetLeft-e.parentElement.parentElement.offsetLeft,n=t.clientWidth/e.clientWidth;e.style.transform=`translate3d(${i}px, 0, 0) scale3d(${n}, 1, 1)`,(0,a.T2)((()=>{e.classList.add("animate"),e.style.transform="none"}))})),p((()=>{s.classList.add("active")})),f(r,d)},new((p=void 0)||(p=Promise))((function(e,t){function i(e){try{n(m.next(e))}catch(e){t(e)}}function s(e){try{n(m.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof p?n:new p((function(e){e(n)}))).then(i,s)}n((m=m.apply(l,c||[])).next())}));var l,c,p,m},v=!e.classList.contains("no-stripe"),b=e.firstElementChild.tagName;return(0,l.fc)(e,(t=>{let i,s=t.target;if(s=(0,r.Z)(s,e),!s)return!1;if(s.dataset.tab){if(i=+s.dataset.tab,-1===i)return!1}else i=(0,d.Z)(s);g(s,i)}),{listenerSetter:p}),m}},503:(e,t,i)=>{"use strict";i.d(t,{I1:()=>C,ZP:()=>I,rf:()=>w});var s=i(3910),n=i(6669),a=i(1544),o=i(8763),r=i(4668),d=i(3299),l=i(9336),c=i(1293),h=i(5565),u=i(669),p=i(130),f=i(2325),m=i(1507),g=i(6241),v=i(6535),b=i(3066),y=i(5400);function w(e,t,i,o){return r=this,l=void 0,h=function*(){const r=[],l=(null==i?void 0:i.some((e=>"messageEntityCustomEmoji"===e._)))?L():void 0,c=(0,b.Z)(t,{entities:i,wrappingForPeerId:o,loadPromises:r,customEmojiRenderer:l});c.querySelectorAll('[contenteditable="false"]').forEach((e=>{e.contentEditable="inherit",e.classList.add("pc")})),r.length&&(yield Promise.all(r)),c.querySelectorAll(".input-selectable").forEach((e=>{e.prepend((0,y.SZ)(!0))}));const h=u.Y?u.Z.getInstance():void 0,p=Array.from(c.querySelectorAll(".custom-emoji-placeholder")).map((e=>(e.dataset.ces="1",e.customEmojiElement))),f=(0,a.Z)(c);null==l||l.destroy();const m=(0,d.Z)(e);if(m.node);else{const t=document.createRange();let i=e.lastChild;i||e.append(i=document.createTextNode("")),t.setStartAfter(i),t.collapse(!0),m.selection.removeAllRanges(),m.selection.addRange(t)}e.addEventListener("input",s.Z,{capture:!0,once:!0,passive:!1}),null==h||h.onBeforeInput({inputType:"insertContent"}),window.document.execCommand("insertHTML",!1,f),Array.from(e.querySelectorAll("[data-ces]")).forEach(((e,t)=>{delete e.dataset.ces;const i=p[t];e.customEmojiElement=i,i.placeholder=e})),e.querySelectorAll(".pc").forEach((e=>{e.contentEditable="false"})),null==h||h.removeExtraBOMs(e),(0,n.Z)(e,"input")},new((c=void 0)||(c=Promise))((function(e,t){function i(e){try{n(h.next(e))}catch(e){t(e)}}function s(e){try{n(h.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof c?n:new c((function(e){e(n)}))).then(i,s)}n((h=h.apply(r,l||[])).next())}));var r,l,c,h}let S=()=>{document.addEventListener("paste",(e=>{const t=(0,o.Z)(e.target,'contenteditable="true"');if(!t)return;const i=!!t.dataset.noLinebreaks;let s,n;e.preventDefault();let a=(e.originalEvent||e).clipboardData.getData("text/plain"),r=!0,d=(e.originalEvent||e).clipboardData.getData("text/html");const c=e=>"messageEntityEmoji"===e._||"messageEntityLinebreak"===e._&&!i;if(i){const e=/[\r\n]/g;a=a.replace(e,""),d=d.replace(e,"")}const h=(t.dataset.peerId||m.NM).toPeerId();if(d.trim()){console.log(d.replace(/ (style|class|id)=".+?"/g,"")),d=d.replace(//,""),d=d.replace(//,""),d=d.replace('
',"");const e=d.match(/([\s\S]*)<\/body>/);e&&(d=e[1].trim());const t=(new DOMParser).parseFromString(d,"text/html").body||document.createElement("body");let i=t.firstChild;for(;i;){const e=i.nextSibling;i.nodeType===i.TEXT_NODE&&(i.nodeValue.trim()||i.remove()),i=e}const o=(0,l.Z)(t,!0,!1);h||(o.entities=o.entities.filter((e=>"messageEntityCustomEmoji"!==e._)));{const e=o.value.split("\n");let t=0;for(let i=0;i{e.offset>=n&&(e.offset-=1)})),t+=a.length}t+=1}const i=e.join("\n");o.value=i}if(o.value.replace(/\s/g,"").length===a.replace(/\s/g,"").length||o.entities.find((e=>"messageEntityCustomEmoji"===e._))){s=o.value,n=o.entities,r=!1;let e=(0,v.Z)(s);e=e.filter(c),(0,g.Z)(n,e)}console.log("usePlainText",r)}r&&(s=a,n=(0,v.Z)(s),n=n.filter(c)),w(t,s,n,h)})),S=null};var C;function L(){return y.KZ.create({wrappingDraft:!0,isSelectable:!0})}function E(e){const t=Array.from(e.querySelectorAll(".custom-emoji, .custom-emoji-placeholder"));let i=e.querySelector(".custom-emoji-renderer");if(!i&&t.length)i=L(),e.prepend(i);else if(i&&!t.length)return void i.remove();if(!i)return;const s=new Map;t.forEach((e=>{const t=e instanceof y.LD?e:e.customEmojiElement,{docId:i}=t;let n=s.get(i);n||s.set(i,n=new Set),n.add(t)}));for(const[e,t]of s){let s=i.customEmojis.get(e);if(s)for(const e of s)t.has(e)||e.destroy();else s=new Set;for(const e of t)s.has(e)||e.connectedCallback()}i.add(s,!1),i.forceRender()}!function(e){e[e.Neutral=0]="Neutral",e[e.Valid=1]="Valid",e[e.Error=2]="Error"}(C||(C={}));class I{constructor(e={}){this.options=e,this.container=document.createElement("div"),this.container.classList.add("input-field"),this.required=e.required,this.validate=e.validate,void 0!==e.maxLength&&void 0===e.showLengthOn&&(e.showLengthOn=Math.min(40,Math.round(e.maxLength/3)));const{placeholder:t,maxLength:i,showLengthOn:s,name:n,plainText:a,canBeEdited:o=!0,autocomplete:d}=e,h=e.label||e.labelText,m=[];let g;if(a?(this.container.innerHTML=`\n \n `,g=this.container.firstElementChild):(S&&S(),this.container.innerHTML='
',g=this.container.firstElementChild,g.contentEditable=""+!!o,u.Z.getInstance(),g.addEventListener("mousedown",(e=>{var t;const i=document.getSelection();if(!i.isCollapsed)return;const s=(0,r.Z)(e.target,"IMG");if(!s)return;const n=s.getBoundingClientRect(),a=n.left+n.width/2,o=e.clientX>=a,d=document.createRange();d.setStartAfter(o?s:null!==(t=s.previousSibling)&&void 0!==t?t:s),i.removeAllRanges(),i.addRange(d)})),m.push((()=>{(0,c.Z)(g)&&g.replaceChildren(),u.Y&&Array.from(g.querySelectorAll("br:not(.br-not-br)")).forEach((e=>{e.remove()})),(0,y.Cx)(Array.from(g.querySelectorAll(".input-something"))),E(g)}))),(0,p.m)(g),e.inputMode&&(g.inputMode=e.inputMode),t&&(0,f.$d)(g,t,void 0,"placeholder"),h||t){const e=document.createElement("div");e.classList.add("input-field-border"),this.container.append(e)}if(h&&(this.label=document.createElement("label"),this.setLabel(),this.container.append(this.label)),i){const e=this.container.lastElementChild;let t=!1;const n=()=>{const n=g.classList.contains("error"),o=a?g.value.length:[...(0,l.Z)(g,!1,!1).value].length,r=i-o,d=r<0;g.classList.toggle("error",d),d||r<=s?(this.setLabel(),e.append(` (${i-o})`),t||(t=!0)):(n&&!d||t)&&(this.setLabel(),t=!1)};m.push(n)}!e.withLinebreaks&&!a&&(g.dataset.noLinebreaks="1",g.addEventListener("keypress",(e=>{if("Enter"===e.key)return e.preventDefault(),!1}))),m.length&&g.addEventListener("input",(()=>{m.forEach((e=>e()))})),this.input=g}select(){this.value&&(this.options.plainText?this.input.select():function(e){const t=document.createRange();t.selectNodeContents(e);const i=window.getSelection();i.removeAllRanges(),i.addRange(t)}(this.input))}setLabel(){this.label.textContent="",this.options.labelText?(0,p.Z)(this.label,this.options.labelText):this.label.append((0,f.ag)(this.options.label,this.options.labelOptions))}get value(){return this.options.plainText?this.input.value:(0,l.Z)(this.input,!1,!1).value}set value(e){this.setValueSilently(e,!0),this.simulateInputEvent()}simulateInputEvent(){(0,n.Z)(this.input,"input")}setValueSilently(e,t){this.options.plainText?this.input.value=e:((0,h.Z)(this.input,e),E(this.input))}isChanged(){return this.value!==this.originalValue}isValid(){return!this.input.classList.contains("error")&&(!this.validate||this.validate())&&(!this.required||!(0,c.Z)(this.input))}isValidToChange(){return this.isValid()&&this.isChanged()}setDraftValue(e="",t){this.options.plainText||(e=(0,a.Z)((0,b.Z)(e))),t?this.setValueSilently(e,!1):this.value=e}setOriginalValue(e="",t){this.originalValue=e,this.setDraftValue(e,t)}setState(e,t){t?(this.label.textContent="",this.label.append((0,f.ag)(t,this.options.labelOptions))):this.setLabel(),this.input.classList.toggle("error",!!(e&C.Error)),this.input.classList.toggle("valid",!!(e&C.Valid))}setError(e){this.setState(C.Error,e)}}},3607:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(503);class n{constructor(e,t){this.prevValue="",this.timeout=0,this.onInput=()=>{if(!this.onChange)return;const 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 s.ZP({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 i=document.createElement("i");i.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(i,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)}}},2153:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(2940),n=i(8847),a=i(4064),o=i(7009),r=i(8594);class d extends o.Z{constructor(e,t){super(e),this.onVisibilityChange=({target:e,visible:t})=>{(0,n.Z)(this.queue,(t=>t.div===e)).forEach((e=>{t&&(e.wasSeen=!0),e.visible=t;const i=this.queue.findIndex((e=>!e.visible));this.queue.splice(Math.max(0,i),0,e)})),this.setProcessQueueTimeout()},this.intersector=new s.Z(this.onVisibilityChange),!t&&(0,r.ZP)((()=>{this.lock()}),(()=>{this.unlockAndRefresh()}))}getItem(){return(0,a.Z)(this.queue,(e=>e.wasSeen))}processItem(e){const t=Object.create(null,{processItem:{get:()=>super.processItem}});return i=this,s=void 0,a=function*(){yield t.processItem.call(this,e),this.intersector.unobserve(e.div)},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}addElement(e,t){var i;return!!super.addElement(e,t)&&(this.observe(t),null!==(i=t.wasSeen)&&void 0!==i||(t.wasSeen=!1),!0)}}},7009:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(8847),n=i(4421);class a extends n.Z{constructor(e){super(e),this.queue=[],this.inProcess=new Set}lock(){super.lock(),this.intersector.lock()}unlock(){super.unlock(),this.intersector.unlock()}unlockAndRefresh(){super.unlock(),this.intersector.unlockAndRefresh()}clear(){super.clear(),this.intersector.disconnect()}refresh(){this.intersector.refresh()}loadItem(e){return e.load(e.div)}addElement(e,t){if(this.queue.find((e=>e.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(){var e;null!==(e=this.intersectorTimeout)&&void 0!==e||(this.intersectorTimeout=window.setTimeout((()=>{this.intersectorTimeout=void 0,this.processQueue()}),0))}push(e){super.push(e)}unshift(e){super.unshift(e)}delete(e){(0,s.Z)(this.queue,(t=>t.div===e.div)),this.unobserve(e)}observe(e){this.intersector.observe(e.div)}unobserve(e){this.intersector.unobserve(e.div)}}},7207:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(3013),n=i(65);class a extends n.Z{constructor(e){super({step:1e3/60/1e3,min:0,max:1,withTransition:e.withTransition,useTransform:e.useTransform},0),this.options=e,this.onLoadedData=()=>{this.max=this.media.duration,this.seek.setAttribute("max",""+this.max)},this.onEnded=()=>{this.setProgress()},this.onPlay=()=>{const e=()=>{this.setProgress(),this.progressRAF=this.media.paused?void 0:window.requestAnimationFrame(e)};this.progressRAF&&(window.cancelAnimationFrame(this.progressRAF),this.progressRAF=void 0),this.streamable&&this.setLoadProgress(),e()},this.onTimeUpdate=()=>{this.media.paused&&(this.setProgress(),this.streamable&&this.setLoadProgress())},this.onProgress=e=>{this.setLoadProgress()},e.media&&this.setMedia(e.media,e.streamable)}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 i=!1;this.setSeekMax(),this.setListeners(),this.setHandlers({onMouseDown:()=>{var e,t;i=!this.media.paused,i&&this.media.pause(),null===(t=null===(e=this.options)||void 0===e?void 0:e.onSeekStart)||void 0===t||t.call(e)},onMouseUp:e=>{var t,s;i&&this.media.play(),null===(s=null===(t=this.options)||void 0===t?void 0:t.onSeekEnd)||void 0===s||s.call(t)}})}scrub(e){const t=super.scrub(e);return this.media.currentTime=t,t}setLoadProgress(){if(s.Z.isSafariBuffering(this.media))return;const e=this.media.buffered,t=e.length,i=this.media.currentTime;let n=0,a=0;for(let s=0;s=t&&t>=n&&(n=t,a=e.end(s))}const o=this.media.duration?a/this.media.duration:0;this.filledLoad.style.width=100*o+"%"}setSeekMax(){this.max=this.media.duration||0,this.max>0?this.onLoadedData():this.media.addEventListener("loadeddata",this.onLoadedData)}setProgress(){if(s.Z.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("pause",this.onTimeUpdate),this.media.addEventListener("timeupdate",this.onTimeUpdate),this.streamable&&this.media.addEventListener("progress",this.onProgress)}removeListeners(){super.removeListeners(),this.media&&(this.media.removeEventListener("loadeddata",this.onLoadedData),this.media.removeEventListener("ended",this.onEnded),this.media.removeEventListener("play",this.onPlay),this.media.removeEventListener("pause",this.onTimeUpdate),this.media.removeEventListener("timeupdate",this.onTimeUpdate),this.streamable&&this.media.removeEventListener("progress",this.onProgress)),this.progressRAF&&(window.cancelAnimationFrame(this.progressRAF),this.progressRAF=void 0)}}},3251:(e,t,i)=>{"use strict";i.d(t,{I:()=>f});var s=i(3189),n=i(8097),a=i(4755),o=i(3228),r=i(3035);const d=new Map,l=new Set;let c=!1;function h(){c||(c=!0,(0,r.T2)((()=>{c=!1,l.forEach(p),l.clear()})))}function u(e){const t=e.getSize;if(t)return t();const i=e.dataset.sizeType;return i?a.Z.active[i].width:e.getBoundingClientRect().width}function p(e){let t=d.get(e);const i=!t;let{text:a,textLength:r,from:l,multiplier:c,font:h,textWidth:p,elementWidth:f}=t||{};if(i){a=e.textContent,r=a.length,l=50,c=l>0&&l/100;let i=e.dataset.fontSize;i&&+i&&(i+="px"),h=`${e.dataset.fontWeight||s.U9} ${i||s.Bf} ${s.bt}`,p=(0,n.Z)(a,h),f=u(e),t={text:a,textLength:r,from:l,multiplier:c,font:h,textWidth:p,elementWidth:f},d.set(e,t)}const m=u(e),g=i||f!==m;if(!i&&g&&(t.elementWidth=f=m),g)if(p>f){e.setAttribute("title",a);let i=a,s=f;for(;i.length>3;){const t=i.length,a=c&&(0,o.Z)(c*t<<0,1,t-2)||Math.max(t+l-1,1),r=i.substr(0,a).replace(/\s*$/,""),d=i.substr(a+1).replace(/^\s*/,"");if(i=r+d,s=(0,n.Z)(i+"โ€ฆ",h),s{for(const[e]of d)l.add(e);h()}),{capture:!0,passive:!0});class f extends HTMLElement{connectedCallback(){d.set(this,null),this.dataset.sizeType||this.getSize?p(this):(l.add(this),h())}disconnectedCallback(){d.delete(this),l.delete(this)}}customElements.define("middle-ellipsis-element",f)},4425:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(1447);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=s.Z.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.helpers.onVisibilityClickAdditional=()=>{this.passwordInputField.helpers.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())},s.Z.waitForFirstFrame(e))))}remove(){this.animation&&this.animation.remove()}}},3083:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(1447);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 i=e.input;i.addEventListener("blur",(()=>{this.playAnimation(0)})),i.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[0].style.display="none"),this.animation.canvas[0].style.display=""):t=0;const i=this.needFrame>t?-1:1;this.animation.setDirection(i),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([s.Z.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(),s.Z.waitForFirstFrame(e)))),s.Z.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[0].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[0].style.display="",this.idleAnimation.play(),this.animation.canvas[0].style.display="none")})),s.Z.waitForFirstFrame(e))))])}remove(){this.animation&&this.animation.remove(),this.idleAnimation&&this.idleAnimation.remove()}}},6830:(e,t,i)=>{"use strict";i.d(t,{T:()=>a,Z:()=>o});var s=i(3910),n=i(503);class a{constructor(e,t){this.container=e,this.input=t,this.passwordVisible=!1,this.onVisibilityClick=e=>{(0,s.Z)(e),this.passwordVisible=!this.passwordVisible,this.toggleVisible.classList.toggle("eye-hidden",this.passwordVisible),this.input.type=this.passwordVisible?"text":"password",this.onVisibilityClickAdditional&&this.onVisibilityClickAdditional()},t.type="password",t.setAttribute("required",""),t.name="notsearch_password",t.autocomplete="off";const i=document.createElement("input");i.classList.add("stealthy"),i.tabIndex=-1,i.type="password",t.parentElement.prepend(i),t.parentElement.insertBefore(i.cloneNode(),t.nextSibling);const n=this.toggleVisible=document.createElement("span");n.classList.add("toggle-visible","tgico"),e.classList.add("input-field-password"),e.append(n),n.addEventListener("click",this.onVisibilityClick),n.addEventListener("touchend",this.onVisibilityClick)}}class o extends n.ZP{constructor(e={}){super(Object.assign({plainText:!0},e)),this.helpers=new a(this.container,this.input)}}},8261:(e,t,i)=>{"use strict";i.d(t,{Z:()=>G});var s=i(2365),n=i(3725),a=i(2166),o=i(3532),r=i(2738),d=i(5565),l=i(130),c=i(3699),h=i(5471),u=i(9405),p=i(3624),f=i(8631),m=i(9322),g=i(2790),v=i(5102),b=i(2325),y=i(5400),w=i(3512),S=i(9331),C=i(9807),L=i(36),E=i(5432),I=i(4064),M=i(3910),P=i(1708),Z=i(6074),T=i(3035),k=i(7030),x=i(9931),A=i(3757),_=i(9492),F=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class D{constructor(e,t){this.scrollable=e,this.managers=t,this.processItem=e=>F(this,void 0,void 0,(function*(){const t=document.createElement("div");let i;t.classList.add(D.BASE_CLASS+"-avatar","media-container","hide"),this.avatars.append(t),e&&(i="object"!=typeof e?yield this.managers.appPhotosManager.getPhoto(e):e.action.photo);const s=new Image;s.classList.add("avatar-photo"),s.draggable=!1;const n=()=>F(this,void 0,void 0,(function*(){if(i){const e=yield(0,_.Z)({container:t,photo:i,size:(0,k.Z)(i,420,420,!1),withoutPreloader:!0});[e.images.thumb,e.images.full].filter(Boolean).forEach((e=>{e.classList.add("avatar-photo")}))}else{const e=yield this.managers.appPeersManager.getPeerPhoto(this.peerId);yield(0,x.Y)(t,this.peerId,e,"photo_big",s)}t.classList.remove("hide")}));return this.avatars.childElementCount<=3?yield n():(this.intersectionObserver.observe(t),this.loadCallbacks.set(t,n)),this.addTab(),e})),this.container=document.createElement("div"),this.container.classList.add(D.BASE_CLASS+"-container"),this.avatars=document.createElement("div"),this.avatars.classList.add(D.BASE_CLASS+"-avatars"),this.gradient=document.createElement("div"),this.gradient.classList.add(D.BASE_CLASS+"-gradient"),this.info=document.createElement("div"),this.info.classList.add(D.BASE_CLASS+"-info"),this.tabs=document.createElement("div"),this.tabs.classList.add(D.BASE_CLASS+"-tabs"),this.arrowPrevious=document.createElement("div"),this.arrowPrevious.classList.add(D.BASE_CLASS+"-arrow","tgico-avatarprevious"),this.arrowNext=document.createElement("div"),this.arrowNext.classList.add(D.BASE_CLASS+"-arrow",D.BASE_CLASS+"-arrow-next","tgico-avatarnext"),this.container.append(this.avatars,this.gradient,this.info,this.tabs,this.arrowPrevious,this.arrowNext),this.loadCallbacks=new Map,this.listenerSetter=new c.Z;const i=()=>0===this.scrollable.scrollTop||(this.scrollable.scrollIntoViewNew({element:this.scrollable.container.firstElementChild,position:"start"}),!1),s=1/3;let n=!1,a=!1;(0,r.fc)(this.container,(e=>F(this,void 0,void 0,(function*(){if(a)return void(0,M.Z)(e);if(n)return void(n=!1);if(!i())return;const t=this.container.getBoundingClientRect(),o=e.pageX,r=o-t.left;if(!this.listLoader.previous.length&&!this.listLoader.next.length||r>t.width*s&&r{t.push({element:this.avatars.children[i],item:e})}));const i=t.slice(0,this.listLoader.previous.length),s=t.slice(this.listLoader.previous.length+1),n=this.avatars.children[this.listLoader.previous.length];a=!0,(0,S.C)(n,e,(()=>e===this.peerId),this.listLoader.current,i,s),a=!1}else{const e=o>t.right-t.width/2;let i;this.avatars.classList.add("no-transition"),this.avatars.offsetLeft,i=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(i),(0,T.T2)((()=>{this.avatars.classList.remove("no-transition")}))}}))),{listenerSetter:this.listenerSetter});const o=()=>{n=!0,document.body.addEventListener(E.Z?"touchend":"click",(e=>{n=!1}),{once:!0})};let d=0,l=0,h=0,u=0;this.swipeHandler=new A.Z({element:this.avatars,onSwipe:(e,t)=>{h=e*=-1;let i=l+e*-D.SCALE;return i>0?i=0:ii()?!this.container.classList.contains("is-single")&&!a:(o(),(0,M.Z)(e),!1),onFirstSwipe:()=>{const e=this.avatars.getBoundingClientRect();d=e.width,u=-d*(this.tabs.childElementCount-1),l=e.left-this.container.getBoundingClientRect().left,this.avatars.style.transform=D.TRANSLATE_TEMPLATE.replace("{x}",l+"px"),this.container.classList.add("is-swiping"),this.avatars.classList.add("no-transition"),this.avatars.offsetLeft},onReset:()=>{const e=Math.ceil(Math.abs(h)/(d/D.SCALE))*(h>=0?1:-1);o(),this.avatars.classList.remove("no-transition"),(0,T.T2)((()=>{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){return F(this,void 0,void 0,(function*(){this.peerId=e;const t=yield this.managers.appPeersManager.getPeerPhoto(e);if(!t)return;const i=this.listLoader=new Z.Z({loadCount:50,loadMore:(t,s,n)=>{if(!s)return Promise.resolve({count:void 0,items:[]});if(e.isUser()){const i=t;return this.managers.appPhotosManager.getUserPhotos(e,i,n).then((e=>({count:e.count,items:e.photos})))}{const t=[];return i.current||t.push(this.managers.appProfileManager.getChatFull(e.toChatId())),t.push(this.managers.appMessagesManager.getSearch({peerId:e,maxId:Number.MAX_SAFE_INTEGER,inputFilter:{_:"inputMessagesFilterChatPhotos"},limit:n,backLimit:0})),Promise.all(t).then((e=>F(this,void 0,void 0,(function*(){const t=e.pop();if((0,P.Z)(t),!i.current){const s=e[0],n=(0,I.Z)(t.history,(e=>e.action.photo.id===s.chat_photo.id));i.current=n||(yield this.managers.appMessagesManager.generateFakeAvatarMessage(this.peerId,s.chat_photo))}return{count:t.count,items:t.history}}))))}},processItem:this.processItem,onJump:(e,t)=>{const i=this.listLoader.index,s=100*D.SCALE*i;this.avatars.style.transform=D.TRANSLATE_TEMPLATE.replace("{x}",`-${s}%`);const n=this.tabs.querySelector(".active");n&&n.classList.remove("active"),this.tabs.children[i].classList.add("active"),this.loadNearestToTarget(this.avatars.children[i])}});"userProfilePhoto"===t._&&(i.current=t.photo_id),yield this.processItem(i.current),i.load(!0)}))}addTab(){const e=document.createElement("div");e.classList.add(D.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),i=t.indexOf(e);t.slice(Math.max(0,i-3),Math.min(t.length,i+3)).forEach((e=>{const t=this.loadCallbacks.get(e);t&&(t(),this.loadCallbacks.delete(e),this.intersectionObserver.unobserve(e))}))}cleanup(){var e;this.listenerSetter.removeAll(),this.swipeHandler.removeListeners(),null===(e=this.intersectionObserver)||void 0===e||e.disconnect()}}D.BASE_CLASS="profile-avatars",D.SCALE=s.Z?2:1,D.TRANSLATE_TEMPLATE=s.Z?`translate3d({x}, 0, -1px) scale(${D.SCALE})`:"translate({x}, 0)";var R=i(7479),B=i(5029),N=i(2796),O=i(8210),U=i(7362),H=i(9102),z=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const j=(e,t)=>{(0,l.Z)(t.title,e||""),t.container.style.display=e?"":"none"};class G{constructor(e,t,i,n=!0){this.managers=e,this.scrollable=t,this.listenerSetter=i,this.isDialog=n,s.Z||this.scrollable.container.classList.add("no-parallax"),i||(this.listenerSetter=new c.Z),this.middlewareHelper=(0,p.k)()}init(){this.init=null,this.element=document.createElement("div"),this.element.classList.add("profile-content"),this.section=new B.Z({noDelimiter:!0}),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 R.ZP({title:" ",subtitle:!0,icon:"info",clickable:e=>{"A"!==e.target.tagName&&((0,a.T)(this.bio.title.textContent),(0,N.Am)(b.ZP.format("BioCopied",!0)))},listenerSetter:this.listenerSetter,contextMenu:{buttons:[{icon:"copy",text:"Text.CopyLabel_About",onClick:()=>{(0,r.tH)(this.bio.container)},verify:()=>!this.peerId.isUser()},{icon:"copy",text:"Text.CopyLabel_Bio",onClick:()=>{(0,r.tH)(this.bio.container)},verify:()=>this.peerId.isUser()}]}}),this.bio.title.classList.add("pre-wrap"),this.username=new R.ZP({title:" ",subtitleLangKey:"Username",icon:"username",clickable:()=>{(0,a.T)("@"+this.username.title.textContent),(0,N.Am)(b.ZP.format("UsernameCopied",!0))},listenerSetter:this.listenerSetter,contextMenu:{buttons:[{icon:"copy",text:"Text.CopyLabel_Username",onClick:()=>{(0,r.tH)(this.username.container)}}]}}),this.phone=new R.ZP({title:" ",subtitle:!0,icon:"phone",clickable:()=>{(0,a.T)(this.phone.title.textContent.replace(/\s/g,"")),(0,N.Am)(b.ZP.format("PhoneCopied",!0))},listenerSetter:this.listenerSetter,contextMenu:{buttons:[{icon:"copy",text:"Text.CopyLabel_PhoneNumber",onClick:()=>{(0,r.tH)(this.phone.container)}},{icon:"info",text:"PeerInfo.Phone.AnonymousInfo",textArgs:[document.createElement("a")],onClick:()=>{window.open("https://fragment.com/numbers","_blank")},separator:!0,multiline:!0,verify:()=>z(this,void 0,void 0,(function*(){const{isAnonymous:e}=(yield this.managers.appUsersManager.getUserPhone(this.peerId.toUserId()))||{};return e}))}]}}),this.link=new R.ZP({title:" ",subtitleLangKey:"SetUrlPlaceholder",icon:"link",clickable:()=>{const e=this.link.title.textContent;(0,a.T)(e);const t=e.includes("/c/");(0,N.Am)(b.ZP.format(t?"LinkCopiedPrivateInfo":"LinkCopied",!0))},listenerSetter:this.listenerSetter,contextMenu:{buttons:[{icon:"copy",text:"Text.CopyLabel_ShareLink",onClick:()=>{(0,r.tH)(this.link.container)}}]}}),this.location=new R.ZP({title:" ",subtitleLangKey:"ChatLocation",icon:"location"}),this.section.content.append(this.phone.container,this.username.container,this.location.container,this.bio.container,this.link.container);const{listenerSetter:e}=this;this.isDialog&&(this.notifications=new R.ZP({checkboxField:new C.Z({toggle:!0}),titleLangKey:"Notifications",icon:"unmute",listenerSetter:this.listenerSetter}),e.add(this.notifications.checkboxField.input)("change",(e=>{e.isTrusted&&this.managers.appMessagesManager.togglePeerMute({peerId:this.peerId,threadId:this.threadId})})),e.add(w.Z)("dialog_notify_settings",(e=>z(this,void 0,void 0,(function*(){if(this.peerId===e.peerId){const e=yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.peerId,respectType:!1,threadId:this.threadId});this.notifications.checkboxField.checked=!e}})))),this.section.content.append(this.notifications.container)),this.element.append(this.section.container),s.Z&&this.element.append((0,L.G)()),e.add(w.Z)("peer_typings",(({peerId:e})=>{this.peerId===e&&this.setPeerStatus()})),e.add(w.Z)("peer_bio_edit",(e=>{e===this.peerId&&this.setMoreDetails(!0)}));const t=({peerId:e,threadId:t})=>z(this,void 0,void 0,(function*(){return this.peerId===e&&(!(yield this.managers.appPeersManager.isForum(this.peerId))||!this.threadId||this.threadId===t)}));e.add(w.Z)("peer_title_edit",(e=>z(this,void 0,void 0,(function*(){(yield t(e))&&(this.fillUsername(),this.setMoreDetails(!0))})))),e.add(w.Z)("user_update",(e=>{this.peerId===e.toPeerId()&&this.setPeerStatus()})),e.add(w.Z)("contacts_update",(e=>z(this,void 0,void 0,(function*(){this.peerId===e.toPeerId()&&((yield this.managers.appUsersManager.getUser(e)).pFlags.self&&this.isDialog||this.fillUserPhone())})))),e.add(w.Z)("avatar_update",(e=>z(this,void 0,void 0,(function*(){(yield t(e))&&this.setAvatar()})))),this.setPeerStatusInterval=window.setInterval((()=>this.setPeerStatus()),6e4)}setPeerStatus(e=!1,t){return z(this,void 0,void 0,(function*(){const i=this.peerId,s=[];s.push((()=>{this.element.classList.toggle("is-me",i===w.Z.myId)}));let n=Promise.resolve();if(i&&(w.Z.myId!==i||!this.isDialog)){const t=yield this.managers.appPeersManager.isForum(this.peerId),a=this.middlewareHelper.get();n=t&&this.threadId?(0,H.Z)({peerId:i,wrapOptions:{middleware:a}}).then((({element:e})=>{this.subtitle.replaceChildren(e)})):m.ZP.setPeerStatus({peerId:i,element:this.subtitle,needClear:e,useWhitespace:!0,middleware:a,ignoreSelf:!this.isDialog}),n.then((e=>e&&s.push(e)))}const a=()=>s.forEach((e=>e()));return n.then((()=>{if(t)return a;a()}))}))}cleanupHTML(){[this.bio,this.phone,this.username,this.location,this.link].forEach((e=>{e.container.style.display="none"})),this.notifications&&(this.notifications.container.style.display="",this.notifications.checkboxField.checked=!0),this.clearSetMoreDetailsTimeout()}canBeDetailed(){return this.peerId!==w.Z.myId||!this.isDialog}createAvatar(){const e=new S.Z;return e.classList.add("profile-avatar","avatar-120"),e.isDialog=this.isDialog,e.attachClickEvent(),e}_setAvatar(){return z(this,void 0,void 0,(function*(){const{peerId:e}=this,t=!(!this.threadId||!(yield this.managers.appPeersManager.isForum(e)));if(this.canBeDetailed()&&!t&&(yield this.managers.appPeersManager.getPeerPhoto(e))){const t=this.avatars;return this.avatars=new D(this.scrollable,this.managers),yield this.avatars.setPeer(e),()=>{var e;this.avatars.info.append(this.name,this.subtitle),null===(e=this.avatar)||void 0===e||e.remove(),this.avatar=void 0,t?t.container.replaceWith(this.avatars.container):this.element.prepend(this.avatars.container),s.Z&&this.scrollable.container.classList.add("parallax")}}const i=this.createAvatar();return yield i.updateWithOptions({peerId:e,threadId:t?this.threadId:void 0,wrapOptions:{customEmojiSize:(0,u.C)(120,120),middleware:this.middlewareHelper.get()}}),()=>{var e;s.Z&&this.scrollable.container.classList.remove("parallax"),this.avatars&&(this.avatars.container.remove(),this.avatars.cleanup(),this.avatars=void 0),null===(e=this.avatar)||void 0===e||e.remove(),this.avatar=i,this.section.content.prepend(this.avatar,this.name,this.subtitle)}}))}setAvatar(e){const t=this._setAvatar();return e?t:t.then((e=>e()))}getUsernamesAlso(e){const t=e.slice(1);if(t.length){const e=t.map((e=>(0,o.Z)({username:e})));return(0,b.ag)("UsernameAlso",[(0,b.v_)(e,!1)])}}fillUsername(){return z(this,void 0,void 0,(function*(){const{peerId:e}=this;if(e.isUser()&&this.canBeDetailed()){const t=yield this.managers.appPeersManager.getPeerActiveUsernames(e),i=this.getUsernamesAlso(t);return()=>{this.username.subtitle.replaceChildren(i||(0,b.ag)("Username")),j(t[0],this.username)}}}))}fillUserPhone(){return z(this,void 0,void 0,(function*(){const{peerId:e}=this;if(e.isUser()&&this.canBeDetailed()){const{phone:t,isAnonymous:i}=(yield this.managers.appUsersManager.getUserPhone(e.toUserId()))||{};return()=>{this.phone.subtitle.replaceChildren((0,b.ag)(i?"AnonymousNumber":"Phone")),j(t?(0,O.Z)(t):void 0,this.phone)}}}))}fillNotifications(){return z(this,void 0,void 0,(function*(){const e=this.notifications;if(e){if(this.canBeDetailed()){const t=yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.peerId,respectType:!1,threadId:this.threadId});return()=>{e.checkboxField.checked=!t}}return()=>{e.container.style.display="none"}}}))}fillName(){return z(this,void 0,void 0,(function*(){const{peerId:e}=this,[t]=yield Promise.all([(0,U.Z)({peerId:e,dialog:this.isDialog,withIcons:!this.threadId,threadId:this.threadId})]);return()=>{(0,d.Z)(this.name,t)}}))}fillRows(e){return z(this,void 0,void 0,(function*(){return Promise.all([this.fillName(),this.fillUsername(),this.fillUserPhone(),this.fillNotifications(),this.setMoreDetails(void 0,e),this.setPeerStatus(!0,!0)]).then((e=>()=>{e.forEach((e=>null==e?void 0:e()))}))}))}fillProfileElements(){return z(this,void 0,void 0,(function*(){if(!this.cleaned)return;this.cleaned=!1,this.cleanupHTML();const e=(0,n.Z)();this.middlewareHelper.get().onClean((()=>{e.reject()}));const t=yield Promise.all([this.setAvatar(!0),this.fillRows(e)]);return()=>{e.resolve(),t.forEach((e=>null==e?void 0:e()))}}))}_setMoreDetails(e,t){return z(this,void 0,void 0,(function*(){const i=this.getMiddlewarePromise();if(this.threadId&&(yield i(this.managers.appPeersManager.isForum(e)))){let t="https://t.me/";const s=(0,g.Z)(this.threadId),n=yield i(this.managers.appPeersManager.getPeerUsername(e));return t+=n?`${n}/${s}`:`c/${e.toChatId()}/${s}`,()=>{j(t,this.link)}}const s=[];if(s.push((()=>{this.bio.subtitle.replaceChildren((0,b.ag)(e.isUser()?"UserBio":"Info")),j(t.about?(0,y.ZP)(t.about):void 0,this.bio)})),!e.isUser()){const n=yield i(this.managers.appChatsManager.getChat(e.toChatId())),a=(0,v.Z)(n);let o;if(a.length)o=this.getUsernamesAlso(a),s.push((()=>j("https://t.me/"+a[0],this.link)));else{const e=t.exported_invite;"chatInviteExported"===(null==e?void 0:e._)&&s.push((()=>j(e.link,this.link)))}s.push((()=>this.link.subtitle.replaceChildren(o||(0,b.ag)("SetUrlPlaceholder"))))}const n=t.location;return"channelLocation"==(null==n?void 0:n._)&&s.push((()=>j(n.address,this.location))),this.setMoreDetailsTimeout=window.setTimeout((()=>this.setMoreDetails(!0)),6e4),()=>{s.forEach((e=>e()))}}))}setMoreDetails(e,t){return z(this,void 0,void 0,(function*(){this.clearSetMoreDetailsTimeout();const{peerId:i}=this,s=this.getMiddlewarePromise();if(!i||!this.canBeDetailed()||(yield s(this.managers.appPeersManager.isPeerRestricted(i))))return;const n=yield s(this.managers.acknowledged.appProfileManager.getProfileByPeerId(i,e)),a=s(n.result).then((e=>z(this,void 0,void 0,(function*(){if(!(yield s(this.managers.appPeersManager.isPeerRestricted(i))))return yield s(this._setMoreDetails(i,e))}))));if(n.cached&&t)return a;(t||Promise.resolve()).then((()=>a)).then((e=>{null==e||e()}))}))}getMiddlewarePromise(){return(0,f.Z)(this.middlewareHelper.get(),(0,h.Z)("MIDDLEWARE"))}setPeer(e,t){var i;this.peerId===e&&this.threadId===t||(null===(i=this.init)||void 0===i||i.call(this),this.peerId=e,this.threadId=t,this.middlewareHelper.clean(),this.cleaned=!0)}clearSetMoreDetailsTimeout(){void 0!==this.setMoreDetailsTimeout&&(clearTimeout(this.setMoreDetailsTimeout),this.setMoreDetailsTimeout=void 0)}destroy(){var e;this.peerId=this.threadId=void 0,this.clearSetMoreDetailsTimeout(),clearInterval(this.setPeerStatusInterval),null===(e=this.avatars)||void 0===e||e.cleanup(),this.middlewareHelper.destroy()}}},8842:(e,t,i)=>{"use strict";i.d(t,{Z:()=>g});var s=i(3512),n=i(2325),a=i(5565),o=i(1507),r=i(8456),d=i(130),l=i(5953),c=i(8115),h=i(493),u=(i(4755),i(5948));i(3541);function p(e,t,i,n,a){return o=this,r=void 0,l=function*(){const t=[],o=yield s.Z.managers.appPeersManager.getPeer(e);if(o.pFlags.verified&&!i&&t.push(function(){const e=document.createElement("span");e.classList.add("verified-icon","tgico");const t=document.createElementNS("http://www.w3.org/2000/svg","svg");t.setAttributeNS(null,"viewBox","0 0 26 26"),t.setAttributeNS(null,"width","26"),t.setAttributeNS(null,"height","26"),t.classList.add("verified-icon-svg");const i=document.createElementNS("http://www.w3.org/2000/svg","use");i.setAttributeNS(null,"href","#verified-icon-background"),i.classList.add("verified-icon-background");const s=document.createElementNS("http://www.w3.org/2000/svg","use");return s.setAttributeNS(null,"href","#verified-icon-check"),s.classList.add("verified-icon-check"),t.append(s,i),e.append(t),e}()),!o.pFlags.fake&&!o.pFlags.scam||n||t.push((0,u.Z)(o.pFlags.scam)),o.pFlags.premium&&!a){const e=o.emoji_status;e&&e._,t.push(function(){const e=document.createElement("span");return e.classList.add("premium-icon","tgico-star"),e}())}return t},new((d=void 0)||(d=Promise))((function(e,t){function i(e){try{n(l.next(e))}catch(e){t(e)}}function s(e){try{n(l.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof d?n:new d((function(e){e(n)}))).then(i,s)}n((l=l.apply(o,r||[])).next())}));var o,r,d,l}var f=i(9345);const m=new WeakMap;s.Z.addEventListener("peer_title_edit",(({peerId:e,threadId:t})=>{let i=`.peer-title[data-peer-id="${e}"]`;t&&(i+=`[data-thread-id="${t}"]`),Array.from(document.querySelectorAll(i)).forEach((e=>{const t=m.get(e);null==t||t.update()}))}));class g{constructor(e){this.element=document.createElement("span"),this.element.classList.add("peer-title"),(0,d.m)(this.element),this.options={},e&&this.update(e),m.set(this.element,this)}setOptions(e){if(e){(0,l.Z)(this.options,e);for(const t in e){const i=e[t];"object"!=typeof i&&"function"!=typeof i&&(this.element.dataset[t]=i?""+("boolean"==typeof i?+i:i):"0")}}}setHasInner(e){this.hasInner!==e&&(this.hasInner=e,this.element.classList.toggle("with-icons",e))}update(e){var t,i,l,u,m,g,v,b;return m=this,g=void 0,b=function*(){this.setOptions(e);let m,g=this.options.fromName;if(void 0!==g)return void 0!==this.options.limitSymbols&&(g=(0,r.Z)(g,this.options.limitSymbols,this.options.limitSymbols)),void(0,d.Z)(this.element,(0,c.Z)(g));null!==(t=(u=this.options).peerId)&&void 0!==t||(u.peerId=o.NM);const{peerId:v,threadId:b}=this.options;if(v===s.Z.myId&&this.options.dialog)(0,a.Z)(this.element,(0,n.ag)(this.options.onlyFirstName?"Saved":"SavedMessages"));else{if(b){const[e,t]=yield Promise.all([s.Z.managers.dialogsStorage.getForumTopic(v,b),s.Z.managers.appPeersManager.isForum(v)]);if(!e&&t)return s.Z.managers.dialogsStorage.getForumTopicById(v,b).then((e=>{if(!e&&this.options.threadId===b)return this.options.threadId=void 0,void this.update({threadId:void 0});this.update()}),(()=>{this.options.threadId===b&&(this.options.threadId=void 0,this.update({threadId:void 0}))})),(0,d.Z)(this.element,(0,n.ag)("Loading")),void this.setHasInner(!1)}const e=b&&this.options.withIcons?s.Z.managers.dialogsStorage.getForumTopic(v,b).then((e=>{var t;return(0,f.e)(Object.assign(Object.assign({},null!==(t=this.options.wrapOptions)&&void 0!==t?t:{}),{topic:e}))})):void 0,[t,a,o]=yield Promise.all([(0,h.Z)(this.options),this.options.withIcons&&p(v,null===(i=this.options.wrapOptions)||void 0===i||i.middleware)||this.options.withPremiumIcon&&p(v,null===(l=this.options.wrapOptions)||void 0===l||l.middleware,!0,!0),e]);if((null==a?void 0:a.length)||o){const e=document.createElement("span");e.classList.add("peer-title-inner"),m=!0,(0,d.Z)(e,t);const i=document.createDocumentFragment();i.append(...[o,e,...null!=a?a:[]].filter(Boolean)),(0,d.Z)(this.element,i)}else(0,d.Z)(this.element,t)}this.setHasInner(m)},new((v=void 0)||(v=Promise))((function(e,t){function i(e){try{n(b.next(e))}catch(e){t(e)}}function s(e){try{n(b.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof v?n:new v((function(e){e(n)}))).then(i,s)}n((b=b.apply(m,g||[])).next())}))}}},6765:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(1168),n=i(2325),a=i(2738),o=i(8678),r=i(2312);class d extends s.Z{constructor(e={}){super("popup-avatar",{closable:!0,withConfirm:!0}),this.image=new Image,this.cropper={crop:()=>{},removeHandlers:()=>{}},this.h6=document.createElement("h6"),(0,n.$d)(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),e.isForum&&this.cropContainer.classList.add("is-forum"),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&&(0,o.Z)(t).then((e=>{this.image=new Image,this.cropContainer.append(this.image),this.image.src=e,this.image.onload=()=>{this.show(),this.cropper=function(e,t){let i,s,n,a={},o=0,r=0,d=0,l=0,c=0;function h(){e.classList.add("crop-blur"),e.draggable=!1,n=new Image,n.src=e.src,n.draggable=!1,n.classList.add("crop-overlay-image"),t||(t=document.createElement("canvas")),i=document.createElement("div"),i.classList.add("crop-component"),s=document.createElement("div"),s.classList.add("crop-overlay");const a=document.createElement("div");a.classList.add("crop-overlay-color"),i.appendChild(s),e.parentNode.appendChild(i),i.appendChild(n),i.appendChild(e),i.appendChild(a),s.appendChild(n),n.style.maxWidth=e.width+"px",c=e.naturalWidth/e.offsetWidth;const o=e.offsetWidth/2-100,r=e.offsetHeight/2-100;u(200,200),p(o,r),f(o,r),s.addEventListener("mousedown",b,!1),s.addEventListener("touchstart",b,!1),s.addEventListener("wheel",v,!1),document.addEventListener("keypress",g,!1)}function u(e,t){d=e*c,l=t*c,s.style.width=e+"px",s.style.height=t+"px"}function p(e,t){r=t*c,o=e*c,n.style.top=-t+"px",n.style.left=-e+"px"}function f(e,t){s.style.top=t+"px",s.style.left=e+"px"}function m(e){e=e*Math.PI*2;let t,i,a,o,r=Math.floor(s.clientWidth+e),d=Math.floor(s.clientHeight+e),l=n.clientWidth,c=n.clientHeight;r<50||r>l||(t=s.offsetLeft-e/2,i=s.offsetTop-e/2,a=t+r,o=i+d,t<0&&(t=0),i<0&&(i=0),a>l||o>c||(u(r,r),p(t,i),f(t,i)))}function g(e){switch(e.preventDefault(),String.fromCharCode(e.charCode)){case"+":m(4);break;case"-":m(-4)}}function v(e){e.preventDefault(),m(e.deltaY>0?1:-1)}function b(e){e.preventDefault(),e.stopPropagation(),function(e){a.container_width=s.offsetWidth,a.container_height=s.offsetHeight,a.container_left=s.offsetLeft,a.container_top=s.offsetTop,a.mouse_x=(e.clientX||e.pageX||e.touches&&e.touches[0].clientX)+window.scrollX,a.mouse_y=(e.clientY||e.pageY||e.touches&&e.touches[0].clientY)+window.scrollY}(e),document.addEventListener("mousemove",w),document.addEventListener("touchmove",w),document.addEventListener("mouseup",y),document.addEventListener("touchend",y)}function y(e){e.preventDefault(),document.removeEventListener("mouseup",y),document.removeEventListener("touchend",y),document.removeEventListener("mousemove",w),document.removeEventListener("touchmove",w)}function w(e){let t,i,o,r,d={x:0,y:0};e.preventDefault(),e.stopPropagation(),d.x=e.pageX||e.touches&&e.touches[0].pageX,d.y=e.pageY||e.touches&&e.touches[0].pageY,t=d.x-(a.mouse_x-a.container_left),i=d.y-(a.mouse_y-a.container_top),o=s.offsetWidth,r=s.offsetHeight,t<0?t=0:t>n.offsetWidth-o&&(t=n.offsetWidth-o),i<0?i=0:i>n.offsetHeight-r&&(i=n.offsetHeight-r),p(t,i),f(t,i)}return e.complete?h():e.onload=h,{crop:function(){t.width=d,t.height=l,t.getContext("2d").drawImage(e,o,r,d,l,0,0,d,l)},removeHandlers:function(){s.removeEventListener("mousedown",b),s.removeEventListener("touchstart",b),s.removeEventListener("wheel",v),document.removeEventListener("mouseup",y),document.removeEventListener("touchend",y),document.removeEventListener("mousemove",w),document.removeEventListener("touchmove",w),document.removeEventListener("keypress",g),i.remove(),s.remove(),n.remove()}}}(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",(0,a.fc)(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((()=>r.Z.upload(this.blob)))}open(e,t){this.canvas=e,this.onCrop=t,this.input.click()}darkenCanvas(){const e=this.canvas.getContext("2d");e.fillStyle="rgba(0, 0, 0, 0.3)",e.fillRect(0,0,this.canvas.width,this.canvas.height)}}},6194:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(1168),n=i(7362),a=i(8127);class o{constructor(e,t,i,s){this.peerId=e,this.peerType=t,this.onSelect=i,this.threadId=s,this.construct()}construct(){return e=this,t=void 0,o=function*(){let{peerId:e,peerType:t,onSelect:i,threadId:o}=this;const r=yield(0,n.Z)({peerId:e,threadId:o}),d=s.Z.MANAGERS;void 0===t&&(t=yield d.appPeersManager.getDialogType(e));const l=(t,s=g&&!!t.size)=>{let n=d.appChatsManager.leave(e.toChatId());s&&(n=n.then((()=>d.appMessagesManager.flushHistory(e)))),null==i||i(n)},c=t=>{let s;if(o)s=d.appMessagesManager.flushHistory(e,!1,!0,o);else if(e.isUser())s=d.appMessagesManager.flushHistory(e,!1,g?!!t.size:void 0);else{if(!t.size)return l(t);s=d.appChatsManager.delete(e.toChatId())}null==i||i(s)};let h,u,p,f,m,g;switch(t){case"channel":(yield d.appChatsManager.hasRights(e.toChatId(),"delete_chat"))?(h="ChannelDeleteMenu",p="AreYouSureDeleteAndExitChannel",m=[{langKey:"ChannelDeleteMenu",isDanger:!0,callback:c}],g=[{text:"DeleteChannelForAll"}]):(h="LeaveChannelMenu",p="ChannelLeaveAlertWithName",f=[r],m=[{langKey:"LeaveChannel",isDanger:!0,callback:l}]);break;case"chat":h="DeleteChatUser",p="AreYouSureDeleteThisChatWithUser",f=[r],m=[{langKey:"DeleteChatUser",isDanger:!0,callback:c}],g=[{text:"DeleteMessagesOptionAlso",textArgs:[yield(0,n.Z)({peerId:e})]}];break;case"saved":h="DeleteChatUser",p="AreYouSureDeleteThisChatSavedMessages",m=[{langKey:"DeleteChatUser",isDanger:!0,callback:c}];break;case"megagroup":case"group":o?(h="DeleteTopics",u=[1],p="DeleteSelectedTopic",f=[r],m=[{langKey:"Delete",isDanger:!0,callback:c}]):(yield d.appChatsManager.hasRights(e.toChatId(),"delete_chat"))?(h="DeleteMegaMenu",p="AreYouSureDeleteAndExit",m=[{langKey:"DeleteMegaMenu",isDanger:!0,callback:c}],g=[{text:"DeleteChat.DeleteGroupForAll"}]):(h="LeaveMegaMenu",p="AreYouSureDeleteAndExitName",f=[r],m=[{langKey:"DeleteChatUser",isDanger:!0,callback:e=>l(e,!0)}])}new a.Z("popup-delete-chat",{peerId:e,threadId:o,titleLangKey:h,titleLangArgs:u,descriptionLangKey:p,descriptionLangArgs:f,buttons:m,checkboxes:g}).show()},new((i=void 0)||(i=Promise))((function(s,n){function a(e){try{d(o.next(e))}catch(e){n(e)}}function r(e){try{d(o.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(a,r)}d((o=o.apply(e,t||[])).next())}));var e,t,i,o}}},5128:(e,t,i)=>{"use strict";i.d(t,{Z:()=>h});var s=i(3512),n=i(1168),a=i(8127),o=i(2325),r=i(7120),d=i(2353),l=i(7362),c=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class h{constructor(e,t,i,s,n){this.peerId=e,this.mids=t,this.type=i,this.onConfirm=s,this.threadId=n,this.construct()}construct(){return c(this,void 0,void 0,(function*(){let{peerId:e,mids:t,type:i,onConfirm:h,threadId:u}=this;const p=yield(0,l.Z)({peerId:e,threadId:u}),f=n.Z.MANAGERS;t=t.slice();const m=(s,n)=>{h&&h(),"scheduled"===i?f.appMessagesManager.deleteScheduledMessages(e,t):f.appMessagesManager.deleteMessages(e,t,!!s.size||n)},g=[{langKey:"Delete",isDanger:!0,callback:m}],v=[];let b,y,w,S;if(1===t.length?b="DeleteSingleMessagesTitle":(b="DeleteMessagesTitle",y=[(0,o.ag)("messages",[t.length])]),w=(yield f.appPeersManager.isMegagroup(e))?1===t.length?"AreYouSureDeleteSingleMessageMega":"AreYouSureDeleteFewMessagesMega":1===t.length?"AreYouSureDeleteSingleMessage":"AreYouSureDeleteFewMessages",e===s.Z.myId||"scheduled"===i);else if(e.isUser())v.push({text:"DeleteMessagesOptionAlso",textArgs:[p]});else{const i=yield f.appChatsManager.getChat(e.toChatId()),n=(0,r.Z)(i,"delete_messages");if("chat"===i._){const i=n?t.slice():yield(0,d.Z)(t,(t=>c(this,void 0,void 0,(function*(){return(yield f.appMessagesManager.getMessageByPeer(e,t)).fromId===s.Z.myId}))));i.length&&(i.length===t.length?v.push({text:"DeleteForAll"}):(v.push({text:"DeleteMessagesOption"}),w="DeleteMessagesTextGroup",S=[(0,o.ag)("messages",[i.length])]))}else g[0].callback=e=>m(e,!0)}(0,n.x)(g),new a.Z("popup-delete-chat",{peerId:e,threadId:u,titleLangKey:b,titleLangArgs:y,descriptionLangKey:w,descriptionLangArgs:S,buttons:g,checkboxes:v}).show()}))}}},4524:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(9322),n=i(3512),a=i(2796),o=i(2995);class r extends o.Z{constructor(e,t){super({peerTypes:["dialogs","contacts"],onSelect:!e&&t?t:i=>{return o=this,r=void 0,l=function*(){if(t){const e=t(i);e instanceof Promise&&(yield e)}if(i!==n.Z.myId)s.ZP.setInnerPeer({peerId:i}),s.ZP.chat.input.initMessagesForward(e);else{let t=0;for(const s in e){const n=e[s];t+=n.length,this.managers.appMessagesManager.forwardMessages(i,s.toPeerId(),n)}(0,a.bC)({langPackKey:t>0?"FwdMessagesToSavedMessages":"FwdMessageToSavedMessages"})}},new((d=void 0)||(d=Promise))((function(e,t){function i(e){try{n(l.next(e))}catch(e){t(e)}}function s(e){try{n(l.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof d?n:new d((function(e){e(n)}))).then(i,s)}n((l=l.apply(o,r||[])).next())}));var o,r,d,l},placeholder:"ShareModal.Search.ForwardPlaceholder",chatRightsAction:"send_messages",selfPresence:"ChatYourSelf"})}}},1168:(e,t,i)=>{"use strict";i.d(t,{Z:()=>L,x:()=>E});var s=i(1405),n=i(5814),a=i(5824),o=i(2325),r=i(8497),d=i(8799),l=i(3699),c=i(2738),h=i(6299),u=i(3910),p=i(3241),f=i(6733),m=i(1655),g=i(3815),v=i(8805),b=i(3624),y=i(8115);const w=document.body;let S=w;const C=()=>{S=(0,f.W7)()||w,L.reAppend()};(0,f.Ms)(w,C);class L extends p.Z{constructor(e,t={}){if(super(!1),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.Z.backByItem(this.navigationItem)},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"),(t.title||t.titleRaw)&&(this.title.classList.add("popup-title"),"string"==typeof t.title?(0,o.$d)(this.title,t.title):t.titleRaw&&this.title.append((0,y.Z)(t.titleRaw)),this.header.append(this.title)),this.middlewareHelper=(0,b.k)(),this.listenerSetter=new l.Z,this.managers=L.MANAGERS,this.confirmShortcutIsSendShortcut=t.confirmShortcutIsSendShortcut,t.closable&&(this.btnClose=document.createElement("span"),this.btnClose.classList.add("btn-icon","popup-close","tgico-close"),this.header.prepend(this.btnClose),(0,c.fc)(this.btnClose,this.hide,{listenerSetter:this.listenerSetter,once:!0})),this.withoutOverlay=t.withoutOverlay,this.withoutOverlay&&this.element.classList.add("no-overlay"),t.overlayClosable&&(0,c.fc)(this.element,(e=>{(0,r.Z)(e.target,"popup-container")||this.hide()}),{listenerSetter:this.listenerSetter}),t.withConfirm&&(this.btnConfirm=document.createElement("button"),this.btnConfirm.classList.add("btn-primary","btn-color-primary"),!0!==t.withConfirm&&this.btnConfirm.append((0,o.ag)(t.withConfirm)),this.header.append(this.btnConfirm),(0,s.Z)(this.btnConfirm)),this.container.append(this.header),t.body&&(this.body=document.createElement("div"),this.body.classList.add("popup-body"),this.container.append(this.body)),t.scrollable){const e=this.scrollable=new v.ZP(this.body);this.attachScrollableListeners(),this.body||this.container.insertBefore(e.container,this.header.nextSibling)}let i=this.btnConfirm;const n=this.buttons=t.buttons;if(null==n?void 0:n.length){const e=this.buttonsEl=document.createElement("div");e.classList.add("popup-buttons");const t=n.map((e=>{const t=document.createElement("button");return t.className="btn"+(e.isDanger?" danger":" primary"),e.noRipple||(0,s.Z)(t),e.text?t.textContent=e.text:t.append((0,o.ag)(e.langKey,e.langArgs)),(0,c.fc)(t,(()=>{var t;null===(t=e.callback)||void 0===t||t.call(e),this.destroy()}),{listenerSetter:this.listenerSetter,once:!0}),e.element=t}));if(!i&&2===n.length){const e=n.find((e=>!e.isCancel));e&&(i=e.element)}e.append(...t),this.container.append(e)}this.btnConfirmOnEnter=i,this.element.append(this.container),L.POPUPS.push(this)}attachScrollableListeners(e){return this.scrollable.attachBorderListeners(e)}onContentUpdate(){this.scrollable&&this.scrollable.onAdditionalScroll()}show(){this.navigationItem={type:"popup",onPop:()=>this.destroy(),onEscape:this.onEscape},a.Z.pushItem(this.navigationItem),(0,d.Z)(),S.append(this.element),this.element.offsetWidth,this.element.classList.add("active"),this.onContentUpdate(),this.withoutOverlay||(g.Z.isOverlayActive=!0,n.Z.checkAnimations2(!0)),setTimeout((()=>{this.element.classList.contains("active")&&this.listenerSetter.add(document.body)("keydown",(e=>{L.POPUPS[L.POPUPS.length-1]===this&&(this.confirmShortcutIsSendShortcut?(0,h.Z)(e):"Enter"===e.key)&&((0,c.tH)(this.btnConfirmOnEnter),(0,u.Z)(e))}))}),0)}destroy(){this.dispatchEvent("close"),this.element.classList.add("hiding"),this.element.classList.remove("active"),this.listenerSetter.removeAll(),this.middlewareHelper.destroy(),this.withoutOverlay||(g.Z.isOverlayActive=!1),a.Z.removeItem(this.navigationItem),this.navigationItem=void 0,(0,m.Z)(L.POPUPS,this),C(),setTimeout((()=>{var e;this.element.remove(),this.dispatchEvent("closeAfterTimeout"),this.cleanup(),null===(e=this.scrollable)||void 0===e||e.destroy(),this.withoutOverlay||n.Z.checkAnimations2(!1)}),150)}static reAppend(){this.POPUPS.forEach((e=>{const{element:t,container:i}=e,s=t.parentElement;s&&s!==S&&S!==i&&S.append(t)}))}static getPopups(e){return this.POPUPS.filter((t=>t instanceof e))}static createPopup(e,...t){return new e(...t)}}L.POPUPS=[];const E=e=>(e.find((e=>e.isCancel))||e.push({langKey:"Cancel",isCancel:!0}),e)},3186:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(3035),n=i(9322),a=i(2325),o=i(3512),r=i(8127);const d={pin:{title:"LimitReached",description:"LimitReachedPinDialogs",descriptionPremium:"LimitReachedPinDialogsPremium",descriptionLocked:"LimitReachedPinDialogsLocked",icon:"limit_pin"},folders:{title:"LimitReached",description:"LimitReachedFolders",descriptionPremium:"LimitReachedFoldersPremium",descriptionLocked:"LimitReachedFoldersLocked",icon:"limit_folders"}};class l extends r.Z{constructor(e,t){super("popup-limit",{buttons:void 0===e.isPremium?[{langKey:"LimitReached.Ok",isCancel:!0}]:e.isPremium?[{langKey:"OK",isCancel:!0}]:[{langKey:"IncreaseLimit",callback:()=>{n.ZP.openPremiumBot()},noRipple:!0},{langKey:"Cancel",isCancel:!0}],descriptionLangKey:void 0===e.isPremium?t.descriptionLocked:e.isPremium?t.descriptionPremium:t.description,descriptionLangArgs:e.isPremium?[e.limitPremium]:[e.limit,e.limitPremium],titleLangKey:t.title});const i=void 0===e.isPremium;if(i)this.element.classList.add("is-locked");else if(e.isPremium)this.element.classList.add("is-premium");else{const e=this.buttons.find((e=>!e.isCancel));e.element.classList.add("popup-limit-button");const t=document.createElement("i");t.classList.add("popup-limit-button-icon","tgico-premium_double"),e.element.append(t)}const r=document.createElement("div");r.classList.add("popup-limit-line");const d=document.createElement("div");d.classList.add("popup-limit-hint");const l=document.createElement("span");if(l.classList.add("popup-limit-hint-icon","tgico-"+t.icon),d.append(l,""+(e.isPremium?e.limitPremium:e.limit)),r.append(d),!i){const t=document.createElement("div");t.classList.add("limit-line");const i=document.createElement("div");i.classList.add("limit-line-free");const s=document.createElement("div");s.classList.add("limit-line-premium"),t.append(i,s),(0,a.$d)(i,"LimitFree"),s.append((0,a.ag)("LimitPremium"),""+e.limitPremium),r.append(t)}this.container.insertBefore(r,this.description);const c=()=>{d.classList.add("active")};o.Z.settings.animationsEnabled?(0,s.d1)().then(c):c()}}function c(e){return function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))}(this,void 0,void 0,(function*(){const t=d[e],[i,s,n]=yield Promise.all([o.Z.managers.apiManager.getAppConfig(),...[!1,!0].map((t=>o.Z.managers.apiManager.getLimit(e,t)))]),a=i.premium_purchase_blocked;new l({isPremium:a?void 0:o.Z.premium,limit:s,limitPremium:n},t).show()}))}},3897:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(7298),n=i(1507),a=i(7479),o=i(8127);const r=[{value:3600,langPackKey:"ChatList.Mute.1Hour"},{value:14400,langPackKey:"ChatList.Mute.4Hours"},{value:28800,langPackKey:"ChatList.Mute.8Hours"},{value:86400,langPackKey:"ChatList.Mute.1Day"},{value:259200,langPackKey:"ChatList.Mute.3Days"},{value:-1,langPackKey:"ChatList.Mute.Forever",checked:!0}];class d extends o.Z{constructor(e,t){let i;super("popup-mute",{peerId:e,titleLangKey:"Notifications",buttons:[{langKey:"ChatList.Context.Mute",callback:()=>{this.managers.appMessagesManager.mutePeer({peerId:e,muteUntil:-1===i?n.rU:(0,s.Z)(!0)+i,threadId:t})}}],body:!0});const o=(0,a.ZC)(r,(e=>{i=+e}));this.body.append(o),this.show()}}},8127:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(9331),n=i(1168),a=i(2325),o=i(9807),r=i(130);class d extends n.Z{constructor(e,t={}){if(super("popup-peer"+(e?" "+e:""),Object.assign(Object.assign({overlayClosable:!0},t),{title:!0,buttons:t.buttons&&(0,n.x)(t.buttons)})),this.className=e,t.peerId){const e=new s.Z;e.classList.add("avatar-32"),e.updateWithOptions({isDialog:!0,peerId:t.peerId,threadId:t.threadId,wrapOptions:{middleware:this.middlewareHelper.get()}}),this.header.prepend(e)}t.noTitle||(t.titleLangKey||!t.title?this.title.append((0,a.ag)(t.titleLangKey||"AppName",t.titleLangArgs)):t.title instanceof HTMLElement?this.title.append(t.title):this.title.innerText=t.title||"");const i=document.createDocumentFragment();if(t.descriptionLangKey||t.description){const e=this.description=document.createElement("p");e.classList.add("popup-description"),t.descriptionLangKey?e.append((0,a.ag)(t.descriptionLangKey,t.descriptionLangArgs)):t.description&&(0,r.Z)(e,t.description),i.append(e)}t.checkboxes&&(this.container.classList.add("have-checkbox"),t.checkboxes.forEach((e=>{e.withRipple=!0;const t=new o.Z(e);e.checkboxField=t,i.append(t.label)})),t.buttons.forEach((e=>{if(e.callback){const i=e.callback;e.callback=()=>{const e=new Set;t.checkboxes.forEach((t=>{t.checkboxField.checked&&e.add(t.text)})),i(e)}}}))),this.container.insertBefore(i,this.header.nextElementSibling)}}},2995:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(5432),n=i(5644),a=i(1168);class o extends a.Z{constructor(e){super("popup-forward",{closable:!0,overlayClosable:!0,body:!0,title:!0}),this.selector=new n.Z({appendTo:this.body,onChange:()=>{return t=this,i=void 0,n=function*(){const t=this.selector.getSelected(),i=t[t.length-1].toPeerId();if(e.onSelect){const t=e.onSelect(i);if(t instanceof Promise)try{yield t}catch(e){return}}this.selector=null,this.hide()},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n},peerType:e.peerTypes,onFirstRender:()=>{this.show(),this.selector.checkForTriggers(),s.Z||this.selector.input.focus()},chatRightsAction:e.chatRightsAction,multiSelect:!1,rippleEnabled:!1,avatarSize:"abitbigger",peerId:e.peerId,placeholder:e.placeholder,selfPresence:e.selfPresence,managers:this.managers}),this.scrollable=this.selector.scrollable,this.attachScrollableListeners(),this.title.append(this.selector.input)}}},1962:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(8127);class n extends s.Z{constructor(e,t,i){super("popup-delete-chat",{title:`Send Message${t.length>1?"s":""} Now`,description:t.length>1?"Send "+t.length+" messages now?":"Send message now?",buttons:[{langKey:"Send",callback:()=>{i&&i(),this.managers.appMessagesManager.sendScheduledMessages(e,t)}}]}),this.show()}}},6787:(e,t,i)=>{"use strict";i.d(t,{Z:()=>P});var s=i(1168),n=i(3541),a=i(2153),o=i(279),r=i(5814),d=i(9322),l=i(4755),c=i(2325),h=i(4494),u=i(8497),p=i(1656),f=i(2738),m=i(2796),g=i(130),v=i(8115),b=i(3163),y=i(9259),w=i(7479),S=i(5565),C=i(3512),L=i(9083),E=i(3173),I=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const M="STICKERS-POPUP";class P extends s.Z{constructor(e,t){super("popup-stickers",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:!0}),this.stickerSetInput=e,this.isEmojis=t,this.onStickersClick=e=>I(this,void 0,void 0,(function*(){const t=(0,u.Z)(e.target,"sticker-set-sticker");if(!t)return;const i=t.dataset.docId;(yield d.ZP.chat.input.sendMessageWithDocument(i))&&this.hide()})),this.title.append((0,c.ag)("Loading")),this.updateAdded={},E.ZP.setIgnoreMouseOut("popup",!0),this.addEventListener("close",(()=>{E.ZP.setIgnoreMouseOut("popup",!1),r.Z.setOnlyOnePlayableGroup()})),this.appendTo=this.scrollable.container,this.appendTo.classList.add("is-loading"),(0,o.y)(this.appendTo,!0),this.stickersFooter=document.createElement("div"),this.stickersFooter.classList.add("sticker-set-footer");const i=(0,h.Z)("btn-primary btn-primary-transparent disable-hover",{noRipple:!0,text:"Loading"});this.stickersFooter.append(i),this.body.append(this.stickersFooter),(0,y.Z)({listenTo:this.appendTo,listenerSetter:this.listenerSetter});const s=e=>{const t=this.sets.findIndex((t=>t.id===e.id));if(-1===t)return;this.sets[t]=e;const i=this.updateAdded[e.id];null==i||i(!!e.installed_date),this.updateButton()};this.listenerSetter.add(C.Z)("stickers_installed",s),this.listenerSetter.add(C.Z)("stickers_deleted",s),this.loadStickerSet()}createStickerSetElements(e){const t=document.createElement("div");let i,s;t.classList.add("sticker-set"),e&&(i=new w.ZP({title:(0,v.Z)(e.title),subtitle:(0,c.ag)(e.pFlags.emojis?"EmojiCount":"Stickers",[e.count]),buttonRight:!0}),s=e=>{(0,S.Z)(i.buttonRight,(0,c.ag)(e?"Stickers.SearchAdded":"Stickers.SearchAdd")),i.buttonRight.classList.toggle("active",e)},s(!!e.installed_date),t.append(i.container));const n=document.createElement("div");return n.classList.add("sticker-set-stickers"),t.append(n),{container:t,headerRow:i,updateAdded:s,itemsContainer:n}}loadStickerSet(){var e;return I(this,void 0,void 0,(function*(){const t=this.middlewareHelper.get(),i=(Array.isArray(this.stickerSetInput)?this.stickerSetInput:[this.stickerSetInput]).map((e=>this.managers.appStickersManager.getStickerSet(e)));let s=yield Promise.all(i);if(!t())return;let o=s[0];if(1===s.length&&!o)return(0,m.bC)({langPackKey:this.isEmojis?"AddEmojiNotFound":"StickerSet.DontExist"}),void this.hide();s=s.filter(Boolean),o=s[0],this.sets=s.map((e=>e.set));const d=null!==(e=this.isEmojis)&&void 0!==e?e:this.isEmojis=!!o.set.pFlags.emojis;if(!d){(0,f.fc)(this.appendTo,this.onStickersClick,{listenerSetter:this.listenerSetter});const{destroy:e}=(0,b.Z)({listenTo:this.appendTo,isStickerPack:!0,onSend:()=>this.hide()});this.addEventListener("close",e)}r.Z.setOnlyOnePlayableGroup(M);const u=new a.Z,y=[],w=s.map((e=>I(this,void 0,void 0,(function*(){const{container:i,itemsContainer:a,headerRow:o,updateAdded:r}=this.createStickerSetElements(s.length>1?e.set:void 0);let c;o&&(0,f.fc)(o.buttonRight,(()=>{this.managers.appStickersManager.toggleStickerSet(e.set)}),{listenerSetter:this.listenerSetter}),this.updateAdded[e.set.id]=r;const h=e.documents.filter((e=>"document"===(null==e?void 0:e._)));if(d){const e=(0,L.Z)({docIds:h.map((e=>e.id)),loadPromises:y,animationGroup:M,customEmojiSize:l.Z.active.esgCustomEmoji,middleware:t});Array.from(e.children).slice(1).forEach((e=>{const t=document.createElement("span");t.classList.add("super-emoji"),e.replaceWith(t),t.append(e)})),c=[e],a.classList.replace("sticker-set-stickers","super-emojis"),a.classList.add("is-emojis","not-local")}else c=yield Promise.all(h.map((e=>I(this,void 0,void 0,(function*(){const i=document.createElement("div");i.classList.add("sticker-set-sticker");const s=l.Z.active.popupSticker.width;return yield(0,n.ZP)({doc:e,div:i,lazyLoadQueue:u,group:M,play:!0,loop:!0,width:s,height:s,withLock:!0,loadPromises:y,middleware:t}),i})))));return a.append(...c.filter(Boolean)),i})))),S=yield Promise.all(w);yield Promise.all(y);const C=this.button=(0,h.Z)("",{noRipple:!0});this.updateButton(),(0,f.fc)(C,(()=>{const e=(0,p.Z)([C],!0);this.managers.appStickersManager.toggleStickerSets(s.map((e=>e.set))).then((()=>{this.hide()})).catch((()=>{e()}))}),{listenerSetter:this.listenerSetter}),1===s.length?(0,g.Z)(this.title,(0,v.Z)(o.set.title)):(0,g.Z)(this.title,(0,c.ag)("Emoji")),this.stickersFooter.textContent="",this.stickersFooter.append(C),this.appendTo.classList.remove("is-loading"),this.appendTo.textContent="",this.appendTo.append(...S),this.scrollable.onAdditionalScroll()}))}updateButton(){const{sets:e,isEmojis:t}=this;let i,s;if(1===e.length){const n=e[0];s=(0,c.ag)(t?"EmojiCount":"Stickers",[n.count]),i=!n.installed_date}else{const t=e.filter((e=>e.installed_date));let n;e.length===t.length?(i=!1,n=e.length):(i=!0,n=e.length-t.length),s=(0,c.ag)("EmojiPackCount",[n])}this.button.className=i?"btn-primary btn-color-primary":"btn-primary btn-primary-transparent danger",(0,S.Z)(this.button,(0,c.ag)(i?"AddStickersCount":"RemoveStickersCount",[s]))}}},3442:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l});var s=i(9099),n=i(3035),a=i(3910),o=i(2738),r=i(8487),d=i(5953);class l{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=>{var t,i,s;e&&(0,a.Z)(e),this.preloader.classList.contains("manual")?null===(t=this.loadFunc)||void 0===t||t.call(this,e):null===(s=null===(i=this.promise)||void 0===i?void 0:i.cancel)||void 0===s||s.call(i)},e&&(0,d.Z)(this,e),this.isUpload&&(this.tryAgainOnFail=!1)}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&&(0,o.fc)(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,i=Date.now(),s=s=>{if(e.notify=e.notifyAll=null,t!==this.tempId)return;const a=Date.now()-i;if(!s&&this.cancelable){this.setProgress(100);const e=150;a{t===this.tempId&&this.detach()}),e)}else this.tryAgainOnFail?(this.attach(this.preloader.parentElement),(0,n.T2)((()=>{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 i=e.done/e.total*100;this.setProgress(i)}))}attach(e,t=!1,i){var n;null===(n=this.construct)||void 0===n||n.call(this),this.preloader.parentElement&&this.preloader.classList.remove("manual"),this.detached=!1,i&&this.attachPromise(i);let a=0;(this.detached||this.preloader.parentElement!==e)&&(a=(0,r.Z)(this.preloader)?1:2,this.preloader.parentElement!==e&&e[this.attachMethod](this.preloader)),(0,s.Z)({element:this.preloader,className:"is-visible",forwards:!0,duration:200,useRafs:a}),this.cancelable&&t&&this.setProgress(0)}detach(){var e;this.detached||(this.detached=!0,(null===(e=this.preloader)||void 0===e?void 0:e.parentElement)&&(0,s.Z)({element:this.preloader,className:"is-visible",forwards:!1,duration:200,onTransitionEnd:()=>{this.preloader.remove()},useRafs:1}))}setProgress(e){if(this.totalLength||(0,r.Z)(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=""}}},9931:(e,t,i)=>{"use strict";i.d(t,{Z:()=>b,Y:()=>g});var s=i(4059),n=i(6740),a=i(5565),o=i(130),r=i(9674),d=i(5990),l=i(7256),c=i(1507),h=i(5798),u=i(3512),p=i(9345),f=i(319),m=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function g(e,t,i,o,d=new Image,l=!1){return m(this,void 0,void 0,(function*(){const l=yield u.Z.managers.acknowledged.appAvatarsManager.loadAvatar(t,i,o),c=l.result,h=l.cached;let p,m,v;if(d.classList.add("avatar-photo"),h)m=()=>{(0,a.Z)(e,d),e.dataset.color=""};else{const l=u.Z.settings.animationsEnabled;l&&d.classList.add("fade-in");let c=!1;if("photo_big"===o){const s=yield g(e,t,i,"photo_small");p=s.loadThumbPromise||s.loadPromise,v=s.thumbImage}else if(i.stripped_thumb){v=new Image,e.classList.add("avatar-relative"),v.classList.add("avatar-photo","avatar-photo-thumbnail");const t=(0,s.Z)(i.stripped_thumb);p=(0,n.cj)(v,t).then((()=>{c||(0,a.Z)(e,v)}))}m=()=>{c=!0,v?e.append(d):(0,a.Z)(e,d),setTimeout((()=>{e.childElementCount&&r.Z.mutateElement(d,(()=>{e.dataset.color="",l&&d.classList.remove("fade-in"),null==v||v.remove()}))}),l?200:0)}}const b=c.then((e=>(0,n.cj)(d,e))).then(m);return p&&(yield p.catch(f.Z)),{cached:h,loadPromise:b,loadThumbPromise:h?b:p||Promise.resolve(),thumbImage:v}}))}function v(e,t,i,s,n,a){(0,o.Z)(e,t),e.dataset.color=i,e.classList.remove("tgico-saved","tgico-deletedaccount","tgico-reply_filled","is-forum","is-topic"),s&&e.classList.add(s),n&&e.classList.add("is-forum"),a&&e.classList.add("is-topic")}function b({div:e,peerId:t,isDialog:i=!1,title:s="",onlyThumb:n=!1,isBig:a,threadId:o,wrapOptions:r={}}){var f,b;return m(this,void 0,void 0,(function*(){const m=u.Z.myId;if(t===m&&i)return void v(e,"","","tgico-saved");const y=u.Z.managers;if(o){const i=yield y.dialogsStorage.getForumTopic(t,o);return v(e,"","",void 0,void 0,!0),r.customEmojiSize&&e.style.setProperty("--size",r.customEmojiSize.width+"px"),(0,p.e)(Object.assign(Object.assign({},r),{topic:i,lazyLoadQueue:!1})).then((t=>{e.replaceChildren(t)}))}const w=yield y.appPeersManager.getPeer(t);if(t!==c.NM&&t.isUser()&&(null===(f=null==w?void 0:w.pFlags)||void 0===f?void 0:f.deleted))return void v(e,"",(0,d.Z)(t),"tgico-deletedaccount");const S=!!(null===(b=null==w?void 0:w.pFlags)||void 0===b?void 0:b.forum),C=a?"photo_big":"photo_small",L=(0,l.Z)(w),E=!!L,I=!!e.firstElementChild&&!e.firstElementChild.classList.contains("emoji");if(!E||!I||!(yield y.appAvatarsManager.isAvatarCached(t,C))){let n="";if(!t||t===m&&i||(n=(0,d.Z)(t)),t===c.hj)return void v(e,"",n,"tgico-reply_filled");const a=s?(0,h.Z)(s):function(e){var t;let i="";return e&&(i=null!==(t=e.title)&&void 0!==t?t:[e.first_name,e.last_name].filter(Boolean).join(" ")),(0,h.Z)(i)}(w);v(e,a,n,"",S)}return E?g(e,t,L,C,void 0,n):void 0}))}},279:(e,t,i)=>{"use strict";function s(e,t=!1){const i='\n \n \n ';if(t){const t=document.createElement("div");return t.classList.add("preloader"),t.innerHTML=i,e&&e.appendChild(t),t}return e.insertAdjacentHTML("beforeend",i),e.lastElementChild}function n(e,t="check"){return e.classList.remove("tgico-"+t),e.disabled=!0,s(e),()=>{e.innerHTML="",e.classList.add("tgico-"+t),e.removeAttribute("disabled")}}i.d(t,{p:()=>n,y:()=>s}),i(410).GO.putPreloader=s},1218:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(9750),n=i(2325),a=i(3855),o=i(3512);class r{constructor(e){const t=this.label=document.createElement("label");t.classList.add("radio-field"),e.alignRight&&t.classList.add("radio-field-right");const i=this.input=document.createElement("input");i.type="radio",i.name="input-radio-"+e.name,e.value&&(i.value=e.value,e.stateKey&&(a.Z.getState().then((t=>{i.checked=(0,s.Z)(t,e.stateKey)===e.value})),i.addEventListener("change",(()=>{o.Z.managers.appStateManager.setByKey(e.stateKey,e.value)}))));const r=this.main=document.createElement("div");r.classList.add("radio-field-main"),e.text?r.innerHTML=e.text:e.langKey&&(0,n.$d)(r,e.langKey),t.append(i,r)}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}}},5133:(e,t,i)=>{"use strict";function s(e,t){const i=document.createElement("form");return e.forEach((e=>{const{container:s,input:n}=e;i.append(s),n.addEventListener("change",(e=>{n.checked&&t(n.value,e)}))})),i}i.d(t,{Z:()=>s})},65:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(5077),n=i(3228),a=i(5953);class o{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)},(0,a.Z)(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 i=this.seek=document.createElement("input");i.classList.add("progress-line__seek"),i.type="range",i.step=""+this.step,i.min=""+this.min,i.max=""+this.max,i.value=""+t,t&&this.setProgress(t);const s=""+this.step,n=s.indexOf(".");this.decimals=-1===n?0:s.length-n-1,this.container.append(this.filled,i)}get value(){return+this.seek.value}setHandlers(e){this.events=e}setListeners(){this.seek.addEventListener("input",this.onInput),this._removeListeners=(0,s.Z)(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=(0,n.Z)(t,0,1),this.useTransform?this.filled.style.transform=`scaleX(${t})`:this.filled.style.width=100*t+"%"}scrub(e){var t;const i=this.vertical?this.rect.height:this.rect.width,s=(0,n.Z)(this.vertical?-(e.y-this.rect.bottom):e.x-this.rect.left,0,i);let a=this.min+s/i*(this.max-this.min);return a-this.min<(this.max-this.min)/2&&(a-=this.step/10),a=+a.toFixed(this.decimals),a=(0,n.Z)(a,this.min,this.max),this.setProgress(a),(null===(t=this.events)||void 0===t?void 0:t.onScrub)&&this.events.onScrub(a),a}removeListeners(){this._removeListeners&&(this._removeListeners(),this._removeListeners=null),this.seek.removeEventListener("input",this.onInput),this.events={}}}},1405:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(8497),n=i(9674),a=i(5432),o=i(3512),r=i(5975),d=i(3035);let l=0;function c(e,t=(()=>Promise.resolve()),i=null,c=!1,h=e){if(e.querySelector(".c-ripple"))return;e.classList.add("rp");const u=document.createElement("div");let p;u.classList.add("c-ripple"),e.classList.contains("rp-square")&&u.classList.add("is-square"),e[c?"prepend":"append"](u);const f=(e,s)=>{const o=Date.now(),r=document.createElement("div"),c=l++,h=1e3*+window.getComputedStyle(u).getPropertyValue("--ripple-duration").replace("s",""),f=p=()=>{const e=Date.now()-o,t=()=>{n.Z.mutate((()=>{r.remove()})),null==i||i(c)};if(er.classList.add("hiding")),Math.max(i-h/2,0)),setTimeout(t,i)}else r.classList.add("hiding"),setTimeout(t,h/2);a.Z||(window.removeEventListener("contextmenu",p),window.removeEventListener("mousemove",p)),p=null,g=!1};null==t||t(c),(0,d.T2)((()=>{if(f!==p)return;const t=u.getBoundingClientRect();r.classList.add("c-ripple__circle");const i=e-t.left,n=s-t.top,a=Math.sqrt(Math.pow(Math.abs(n-t.height/2)+t.height/2,2)+Math.pow(Math.abs(i-t.width/2)+t.width/2,2)),o=i-a/2,d=n-a/2;r.style.width=r.style.height=a+"px",r.style.left=o+"px",r.style.top=d+"px",u.append(r)}))},m=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||(0,s.Z)(t.target,"c-ripple")!==u)&&(h===e||!(0,r.Z)(t.target,h));let g=!1;if(a.Z){const e=()=>{null==p||p()};h.addEventListener("touchstart",(t=>{if(!o.Z.settings.animationsEnabled)return;if(t.touches.length>1||g||m(t))return;g=!0;const{clientX:i,clientY:s}=t.touches[0];f(i,s),h.addEventListener("touchend",e,{once:!0}),window.addEventListener("touchmove",(t=>{t.cancelBubble=!0,t.stopPropagation(),e(),h.removeEventListener("touchend",e)}),{once:!0})}),{passive:!0})}else h.addEventListener("mousedown",(e=>{if(![0,2].includes(e.button))return;if(!o.Z.settings.animationsEnabled)return;if("0"===h.dataset.ripple||m(e))return;if(g)return void(g=!1);const{clientX:t,clientY:i}=e;f(t,i),window.addEventListener("mouseup",p,{once:!0,passive:!0}),window.addEventListener("contextmenu",p,{once:!0,passive:!0})}),{passive:!0})}},7479:(e,t,i)=>{"use strict";i.d(t,{De:()=>g,ZC:()=>v,ZP:()=>f,tG:()=>m});var s=i(9807),n=i(1218),a=i(1405),o=i(5133),r=i(2325),d=i(5565),l=i(130),c=i(2738),h=i(4494),u=i(4531);const p=(e,t)=>{!0===t||("string"==typeof t?(0,l.Z)(e,t):e.append(t))};class f{constructor(e={}){this.freezed=!1,e.checkboxFieldOptions&&(e.checkboxField=new s.Z(Object.assign({listenerSetter:e.listenerSetter},e.checkboxFieldOptions)));const t=e.asLink?"a":e.radioField||e.checkboxField?"label":"div";if(this.container=document.createElement(t),this.container.classList.add("row","no-subtitle"),e.noWrap&&this.container.classList.add("no-wrap"),e.subtitle){const t=this.subtitle;if(p(t,e.subtitle),e.noWrap&&t.classList.add("no-wrap"),e.subtitleRight){this.container.append(this.subtitleRow=this.createRow()),this.subtitleRow.classList.add("row-subtitle-row");const i=this.subtitleRight=document.createElement("div");i.classList.add("row-subtitle","row-subtitle-right"),p(i,e.subtitleRight),this.subtitleRow.append(t,i)}}else e.subtitleLangKey&&this.subtitle.append((0,r.ag)(e.subtitleLangKey,e.subtitleLangArgs));let i=!!e.havePadding;if(e.radioField||e.checkboxField){if(e.radioField&&(this.radioField=e.radioField,this.container.append(this.radioField.label),i=!0),e.checkboxField){this.checkboxField=e.checkboxField;const t=e.checkboxField.label.classList.contains("checkbox-field-toggle");if(t?(this.container.classList.add("row-with-toggle"),e.titleRight=this.checkboxField.label):(i=!0,this.container.append(this.checkboxField.label)),e.withCheckboxSubtitle&&!t){const t=()=>{(0,d.Z)(this.subtitle,(0,r.ag)(this.checkboxField.input.checked?"Checkbox.Enabled":"Checkbox.Disabled"))};e.listenerSetter?e.listenerSetter.add(this.checkboxField.input)("change",t):this.checkboxField.input.addEventListener("change",t)}}(e.radioField||e.checkboxField).label.classList.add("disable-hover")}if(e.title||e.titleLangKey){let t;const i=e.titleRight||e.titleRightSecondary;if(i?(this.container.append(t=this.titleRow=this.createRow()),this.titleRow.classList.add("row-title-row")):t=this.container,this.title=this.createTitle(),e.noWrap&&this.title.classList.add("no-wrap"),e.title?p(this.title,e.title):e.titleLangKey&&this.title.append((0,r.ag)(e.titleLangKey)),t.append(this.title),i){const s=this.titleRight=document.createElement("div");s.classList.add("row-title","row-title-right"),e.titleRightSecondary&&s.classList.add("row-title-right-secondary"),p(s,i),t.append(s)}}e.icon&&(i=!0,this.container.classList.add("tgico","tgico-"+e.icon),this.container.classList.add("row-with-icon")),i&&this.container.classList.add("row-with-padding"),e.navigationTab&&(e.clickable=()=>e.navigationTab.open()),(e.clickable||e.radioField||e.checkboxField)&&("function"==typeof e.clickable&&(0,c.fc)(this.container,(t=>{this.freezed||e.clickable(t)}),{listenerSetter:e.listenerSetter}),this.container.classList.add("row-clickable","hover-effect"),e.noRipple||(0,a.Z)(this.container,void 0,void 0,!0)),(e.buttonRight||e.buttonRightLangKey)&&(this.buttonRight=e.buttonRight instanceof HTMLElement?e.buttonRight:(0,h.Z)("btn-primary btn-color-primary",{text:e.buttonRightLangKey}),this.container.append(this.buttonRight)),e.contextMenu&&(0,u.Z)(Object.assign(Object.assign({},e.contextMenu),{listenTo:this.container,listenerSetter:e.listenerSetter}))}get subtitle(){var e;return null!==(e=this._subtitle)&&void 0!==e?e:this._subtitle=this.createSubtitle()}get midtitle(){var e;return null!==(e=this._midtitle)&&void 0!==e?e:this._midtitle=this.createMidtitle()}createRow(){const e=document.createElement("div");return e.classList.add("row-row"),e}createTitle(){const e=document.createElement("div");return e.classList.add("row-title"),(0,l.m)(e),e}createSubtitle(){const e=document.createElement("div");return e.classList.add("row-subtitle"),(0,l.m)(e),this.title?this.title.after(e):this.container.prepend(e),this.container.classList.remove("no-subtitle"),e}createMidtitle(){const e=document.createElement("div");return e.classList.add("row-midtitle"),this.subtitle.parentElement.insertBefore(e,this.subtitle),e}createMedia(e){const t=document.createElement("div");return this.applyMediaElement(t,e)}applyMediaElement(e,t){return this.container.classList.add("row-with-padding"),this.media=e,e.classList.add("row-media"),t&&e.classList.add("row-media-"+t),this.container.append(e),e}disableWithPromise(e){this.container.classList.add("is-disabled"),e.finally((()=>{this.container.classList.remove("is-disabled")}))}makeSortable(){const e=document.createElement("span");this.container.classList.add("row-sortable","tgico"),e.classList.add("row-sortable-icon","tgico-menu"),this.container.append(e)}toggleSorting(e){this.container.classList.toggle("cant-sort",!e)}}const m=e=>new f({checkboxField:e,listenerSetter:e.listenerSetter}),g=(e,t)=>(0,o.Z)(e.map((e=>({container:e.container,input:e.radioField.input}))),t),v=(e,t)=>{const i="name-"+(8388607*Math.random()|0);let s;const a=e.map((({langPackKey:e,value:t,checked:a})=>{const o=new f({radioField:new n.Z({langKey:e,name:i,value:""+t})});return a&&(s=o.radioField),o})),o=g(a,t);return s&&(s.checked=!0),o}},8805:(e,t,i)=>{"use strict";i.d(t,{ZP:()=>l,v7:()=>c});var s=i(5432),n=i(5003),a=i(4789),o=i(8594),r=i(3910);class d{constructor(e,t="",i=document.createElement("div")){this.el=e,this.container=i,this.onScrollMeasure=0,this.lastScrollPosition=0,this.lastScrollDirection=0,this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation=!1,this.onScroll=()=>{if(this.isHeavyAnimationInProgress)return this.cancelMeasure(),void(this.needCheckAfterAnimation=!0);(this.onScrolledTop||this.onScrolledBottom||this.splitUp||this.onAdditionalScroll)&&(this.onScrollMeasure||(this.onScrollMeasure=window.setTimeout((()=>{this.onScrollMeasure=0;const e=this.container[this.scrollProperty];this.lastScrollDirection=this.lastScrollPosition===e?0:this.lastScrollPositionthis.container.append(e))),e.append(this.container))}addScrollListener(){this.addedScrollListener||(this.addedScrollListener=!0,this.container.addEventListener("scroll",this.onScroll,{passive:!0,capture:!0}))}removeScrollListener(){this.addedScrollListener&&(this.addedScrollListener=!1,this.container.removeEventListener("scroll",this.onScroll,{capture:!0}))}setListeners(){this.removeHeavyAnimationListener||(window.addEventListener("resize",this.onScroll,{passive:!0}),this.addScrollListener(),this.removeHeavyAnimationListener=(0,o.ZP)((()=>{this.isHeavyAnimationInProgress=!0,this.onScrollMeasure&&(this.cancelMeasure(),this.needCheckAfterAnimation=!0)}),(()=>{this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation&&(this.onScroll(),this.needCheckAfterAnimation=!1)})))}removeListeners(){this.removeHeavyAnimationListener&&(window.removeEventListener("resize",this.onScroll),this.removeScrollListener(),this.removeHeavyAnimationListener(),this.removeHeavyAnimationListener=void 0)}destroy(){this.removeListeners(),this.onAdditionalScroll=void 0,this.onScrolledTop=void 0,this.onScrolledBottom=void 0}append(...e){this.container.append(...e)}scrollIntoViewNew(e){return(0,a.Z)(Object.assign(Object.assign({},e),{container:this.container}))}cancelMeasure(){this.onScrollMeasure&&(clearTimeout(this.onScrollMeasure),this.onScrollMeasure=0)}}class l extends d{constructor(e,t="",i=300,s){super(e,t),this.onScrollOffset=i,this.loadedAll={top:!0,bottom:!1},this.checkForTriggers=()=>{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,i=this.lastScrollPosition;this.onScrolledTop&&i<=this.onScrollOffset&&this.lastScrollDirection<=0&&this.onScrolledTop(),this.onScrolledBottom&&t-i<=this.onScrollOffset&&this.lastScrollDirection>=0&&this.onScrolledBottom()},this.container.classList.add("scrollable-y"),this.setListeners(),this.scrollProperty="scrollTop"}attachBorderListeners(e=this.container){const t=this.onAdditionalScroll;this.onAdditionalScroll=()=>{null==t||t(),e.classList.toggle("scrolled-top",!this.scrollTop),e.classList.toggle("scrolled-bottom",this.isScrolledDown)},e.classList.add("scrolled-top","scrolled-bottom","scrollable-y-bordered")}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}setScrollTopSilently(e){this.lastScrollPosition=e,this.ignoreNextScrollEvent(),this.scrollTop=e}ignoreNextScrollEvent(){this.removeHeavyAnimationListener&&(this.removeScrollListener(),this.container.addEventListener("scroll",(e=>{(0,r.Z)(e),this.addScrollListener()}),{capture:!0,passive:!1,once:!0}))}get scrollHeight(){return this.container.scrollHeight}}class c extends d{constructor(e,t="",i=300,n=15,a=document.createElement("div")){if(super(e,t,a),this.onScrollOffset=i,this.splitCount=n,this.container=a,this.container.classList.add("scrollable-x"),!s.Z){const e=e=>{!e.deltaX&&this.container.scrollWidth>this.container.clientWidth&&(this.container.scrollLeft+=e.deltaY/4,(0,r.Z)(e))};this.container.addEventListener("wheel",e,{passive:!1})}this.scrollProperty="scrollLeft"}}},5029:(e,t,i)=>{"use strict";i.d(t,{R:()=>r,Z:()=>o});var s=i(2325),n=i(36);const a="sidebar-left-section";class o{constructor(e={}){var t;const i=this.container=document.createElement("div");i.classList.add(a+"-container");const o=this.innerContainer=document.createElement("div");if(o.classList.add(a),e.noShadow&&o.classList.add("no-shadow"),e.fakeGradientDelimiter)o.append((0,n.G)()),o.classList.add("with-fake-delimiter");else if(e.noDelimiter)o.classList.add("no-delimiter");else{const e=document.createElement("hr");o.append(e)}const r=this.content=this.generateContentElement();if(e.name){const t=this.title=document.createElement("div");t.classList.add("sidebar-left-h2",a+"-name"),(0,s.XZ)({element:t,key:e.name,args:e.nameArgs}),r.append(t)}i.append(o);const d=null!==(t=e.caption)&&void 0!==t?t:e.captionOld;if(d){const t=this.caption=this.generateContentElement();t.classList.add(a+"-caption"),e.captionOld||i.append(t),!0!==d&&(0,s.XZ)({element:t,key:d,args:e.captionArgs})}}generateContentElement(){const e=document.createElement("div");return e.classList.add(a+"-content"),this.innerContainer.append(e),e}}const r=(e,t,i)=>{const s=new o({name:t,caption:i});return e.append(s.container),s.content}},744:(e,t,i)=>{"use strict";i.d(t,{ir:()=>Gt,ZP:()=>Wt});var s=i(9322),n=i(3512),a=i(5884),o=i(9331),r=i(8805),d=i(3607),l=i(3552),c=i(426),h=i(4277),u=i(503),p=i(187),f=i(2325),m=i(8119),g=i(3061),v=i(2738),b=i(5029);class y extends l._{constructor(){super(...arguments),this.uploadAvatar=null,this.isGeoChat=!1}init(e,t=!1){this.isGeoChat=t,this.peerIds=e,this.container.classList.add("new-group-container"),this.setTitle("NewGroup"),this.avatarEdit=new p.Z((e=>{this.uploadAvatar=e}));const i=new b.Z({}),n=document.createElement("div");n.classList.add("input-wrapper"),this.groupNameInputField=new u.ZP({label:"CreateGroup.NameHolder",maxLength:128}),this.groupLocationInputField=new u.ZP({label:"ChatLocation",name:"location",canBeEdited:!1}),n.append(this.groupNameInputField.container,this.groupLocationInputField.container),this.listenerSetter.add(this.groupNameInputField.input)("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=(0,m.Z)({icon:"arrow_next"}),(0,v.fc)(this.nextBtn,(()=>{const e=this.groupNameInputField.value;let t;if(this.isGeoChat){if(!this.userLocationAddress||!this.userLocationCoords)return;t=this.managers.appChatsManager.createChannel({title:e,about:"",geo_point:Object.assign({_:"inputGeoPoint"},this.userLocationCoords),address:this.userLocationAddress,megagroup:!0}).then((e=>(this.uploadAvatar&&this.uploadAvatar().then((t=>{this.managers.appChatsManager.editPhoto(e,t)})),this.peerIds.length&&this.managers.appChatsManager.inviteToChannel(e,this.peerIds),e)))}else this.nextBtn.disabled=!0,t=this.managers.appChatsManager.createChat(e,this.peerIds.map((e=>e.toUserId()))).then((e=>(this.uploadAvatar&&this.uploadAvatar().then((t=>{this.managers.appChatsManager.editPhoto(e,t)})),e)));t&&t.then((e=>{this.close(),s.ZP.setInnerPeer({peerId:e.toPeerId(!0)})}))}),{listenerSetter:this.listenerSetter});const a=new b.Z({name:"Members",nameArgs:[this.peerIds.length]}),o=this.list=h.default.createChatList({new:!0});return a.content.append(o),i.content.append(this.avatarEdit.container,n),this.content.append(this.nextBtn),this.scrollable.append(i.container,a.container),t?(this.setTitle("NearbyCreateGroup"),this.groupLocationInputField.container.classList.remove("hide"),this.groupLocationInputField.setValueSilently(f.ZP.format("Loading",!0)),this.startLocating()):this.groupLocationInputField.container.classList.add("hide"),Promise.all(this.peerIds.map((e=>{return t=this,i=void 0,n=function*(){const{dom:t}=h.default.addDialogNew({peerId:e,container:this.list,rippleEnabled:!1,avatarSize:"abitbigger"});t.lastMessageSpan.append((0,g.Z)(yield this.managers.appUsersManager.getUser(e)))},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n})))}onCloseAfterTimeout(){this.avatarEdit.clear(),this.uploadAvatar=null,this.groupNameInputField.value="",this.groupLocationInputField.container.classList.add("hide"),this.nextBtn.disabled=!1}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 w,S=i(6360),C=i(632),L=i(410),E=i(5322),I=i(4494),M=i(6024),P=i(7479),Z=i(5565),T=i(144);function k(e){const t=[],i={users:[],chats:[]},s={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":i.chats.push(...e.chats);break;case"privacyValueAllowUsers":i.users.push(...e.users);break;case"privacyValueDisallowChatParticipants":s.chats.push(...e.chats);break;case"privacyValueDisallowUsers":s.users.push(...e.users)}})),{type:t[0],disallowPeers:s,allowPeers:i}}!function(e){e[e.Everybody=2]="Everybody",e[e.Contacts=1]="Contacts",e[e.Nobody=0]="Nobody"}(w||(w={}));const x=w;var A=i(1218),_=i(5670);class F{constructor(e){this.options=e,this.onRadioChange=e=>{e=+e,this.type=e;const t=this.options.captions[this.type],i=this.radioSection.caption;t?t instanceof HTMLElement?(0,Z.Z)(i,t):(0,f.$d)(i,t):i.innerHTML="",i.classList.toggle("hide",!t),this.exceptions&&(this.exceptions.get("allow").row.container.classList.toggle("hide",this.type===x.Everybody),this.exceptions.get("disallow").row.container.classList.toggle("hide",this.type===x.Nobody)),this.options.onRadioChange&&this.options.onRadioChange(e)},e.captions&&e.captions.reverse();const t=e.managers;this.radioSection=new b.Z({name:e.title,caption:!0}),this.radioRows=new Map;let i=[{type:x.Everybody,langKey:"PrivacySettingsController.Everbody"},{type:x.Contacts,langKey:"PrivacySettingsController.MyContacts"},{type:x.Nobody,langKey:"PrivacySettingsController.Nobody"}];e.skipTypes&&(i=i.filter((t=>!e.skipTypes.includes(t.type))));const s=(0,T.a)();i.forEach((({type:e,langKey:t})=>{const i=new P.ZP({radioField:new A.Z({langKey:t,name:s,value:""+e})});this.radioRows.set(e,i)}));const n=(0,P.De)([...this.radioRows.values()],this.onRadioChange);if(this.radioSection.content.append(n),e.appendTo&&e.appendTo.append(this.radioSection.container),!e.noExceptions){const t=(0,b.R)(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((i=>{i.row=new P.ZP(i),i.row.container.addEventListener("click",(()=>{a.then((()=>{const t=this.peerIds[i.key];e.tab.slider.createTab(_.Z).open({type:"privacy",skippable:!0,title:i.titleLangKey,placeholder:"PrivacyModal.Search.Placeholder",takeOut:e=>{t.length=0,t.push(...e),i.row.subtitle.innerHTML="",i.row.subtitle.append(...this.generateStr(this.splitPeersByType(e)))},selectedPeerIds:t})}))})),t.append(i.row.container)}))}const a=t.appPrivacyManager.getPrivacy(e.inputKey).then((i=>{const s=k(i);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",(()=>{return i=this,s=void 0,a=function*(){const i=[];switch(this.type){case x.Everybody:i.push({_:"inputPrivacyValueAllowAll"});break;case x.Contacts:i.push({_:"inputPrivacyValueAllowContacts"});break;case x.Nobody:i.push({_:"inputPrivacyValueDisallowAll"})}if(this.exceptions){const e=[["allow","inputPrivacyValueAllowChatParticipants","inputPrivacyValueAllowUsers"],["disallow","inputPrivacyValueDisallowChatParticipants","inputPrivacyValueDisallowUsers"]];for(const[s,n,a]of e){if(this.exceptions.get(s).row.container.classList.contains("hide"))continue;const e=this.peerIds[s];if(e){const s=this.splitPeersByType(e);s.chats.length&&i.push({_:n,chats:s.chats}),s.users.length&&i.push({_:a,users:yield Promise.all(s.users.map((e=>t.appUsersManager.getUserInput(e))))})}}}t.appPrivacyManager.setPrivacy(e.inputKey,i)},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}),{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?(0,f.v_)([e.users.length?(0,f.ag)("Users",[e.users.length]):null,e.chats.length?(0,f.ag)("Chats",[e.chats.length]):null].filter(Boolean),!1):[(0,f.ag)("PrivacySettingsController.AddUsers")]}}var D=i(3532);class R extends M.h{init(){return e=this,t=void 0,s=function*(){this.container.classList.add("privacy-tab","privacy-phone-number"),this.setTitle("PrivacyPhone");const e="+"+(yield this.managers.appUsersManager.getSelf()).phone,t=document.createElement("div");t.append((0,f.ag)("PrivacyPhoneInfo"),document.createElement("br"),document.createElement("br"),(0,f.ag)("PrivacyPhoneInfo4"),document.createElement("br"),(0,D.Z)({mePath:e}));const i=new F({tab:this,title:"PrivacyPhoneTitle",inputKey:"inputPrivacyKeyPhoneNumber",captions:[t,t,""],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,onRadioChange:e=>{n.setRadio(x.Everybody),n.radioSection.container.classList.toggle("hide",e!==x.Nobody)},managers:this.managers}),s="PrivacyPhoneInfo3",n=new F({tab:this,title:"PrivacyPhoneTitle2",inputKey:"inputPrivacyKeyAddedByPhone",captions:[s,s,""],noExceptions:!0,skipTypes:[x.Nobody],managers:this.managers});this.scrollable.container.insertBefore(n.radioSection.container,i.radioSection.container.nextSibling)},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var B=i(8127),N=i(5772),O=i(279);class U extends l._{init(){this.container.classList.add("two-step-verification","two-step-verification-set"),this.setTitle("TwoStepVerificationPasswordSet");const e=new b.Z({captionOld:"TwoStepVerificationPasswordSetInfo",noDelimiter:!0}),t=document.createElement("div");(0,N.Z)({emoji:"๐Ÿฅณ",div:t,width:160,height:160}),e.content.append(t);const i=e.generateContentElement(),s=document.createElement("div");s.classList.add("input-wrapper");const n=(0,I.Z)("btn-primary btn-color-primary",{text:"TwoStepVerificationPasswordReturnSettings"});(0,v.fc)(n,(e=>{this.close()})),this.slider.sliceTabsUntilTab(Ct,this),s.append(n),i.append(s),this.scrollable.container.append(e.container)}}var H=i(4489),z=i(4762);function j(e){return!z.IS_MOBILE_SAFARI||!e}var G=i(1656);class V extends l._{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 b.Z({captionOld:!0,noDelimiter:!0});(0,f.$d)(e.caption,"TwoStepAuth.ConfirmEmailCodeDesc",[this.email]);const t=document.createElement("div");(0,N.Z)({div:t,width:160,height:160,emoji:"๐Ÿ“ฌ"}),e.content.append(t);const i=e.generateContentElement(),s=document.createElement("div");s.classList.add("input-wrapper");const n=this.codeInputField=new H.Z({name:"recovery-email-code",label:"TwoStepAuth.RecoveryCode",length:this.length,onFill:e=>{d(!0),this.managers.passwordManager.confirmPasswordEmail(""+e).then((e=>{r()})).catch((e=>{switch(e.type){case"CODE_INVALID":n.input.classList.add("error"),(0,Z.Z)(n.label,(0,f.ag)("TwoStepAuth.RecoveryCodeInvalid"));break;case"EMAIL_HASH_EXPIRED":n.input.classList.add("error"),(0,Z.Z)(n.label,(0,f.ag)("TwoStepAuth.RecoveryCodeExpired"));break;default:console.error("confirm error",e)}d(!1)}))}}),a=(0,I.Z)("btn-primary btn-primary-transparent primary",{text:"TwoStepAuth.EmailCodeChangeEmail"}),o=(0,I.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"ResendCode"}),r=()=>{this.slider.createTab(U).open()},d=e=>{(0,G.Z)([n.input,a,o],e)};(0,v.fc)(a,(e=>{d(!0),this.managers.passwordManager.cancelPasswordEmail().then((e=>{this.slider.sliceTabsUntilTab($,this),this.close()}),(()=>{d(!1)}))})),(0,v.fc)(o,(e=>{d(!0);const t=(0,O.y)(o);this.managers.passwordManager.resendPasswordEmail().then((e=>{t.remove(),d(!1)}))})),s.append(n.container,a,o),i.append(s),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){j(this.isFirst)&&this.codeInputField.input.focus()}}var K=i(3910),W=i(1171);class $ extends l._{constructor(){super(...arguments),this.isFirst=!1}init(){this.container.classList.add("two-step-verification","two-step-verification-email"),this.setTitle("RecoveryEmailTitle");const e=new b.Z({captionOld:!0,noDelimiter:!0}),t=document.createElement("div");(0,N.Z)({div:t,width:160,height:160,emoji:"๐Ÿ’Œ"}),e.content.append(t);const i=e.generateContentElement(),s=document.createElement("div");s.classList.add("input-wrapper");const n=this.inputField=new u.ZP({name:"recovery-email",label:"RecoveryEmail",plainText:!0});n.input.addEventListener("keypress",(e=>{if("Enter"===e.key)return(0,K.Z)(e),d()})),n.input.addEventListener("input",(e=>{n.input.classList.remove("error")}));const a=(0,I.Z)("btn-primary btn-color-primary",{text:"Continue"}),o=(0,I.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"YourEmailSkip"}),r=()=>{this.slider.createTab(U).open()},d=()=>{const e=n.value.trim(),t=(0,W.Z)(e);if(!t||t[0].length!==e.length)return void n.input.classList.add("error");l(!0);const i=(0,O.y)(a);this.managers.passwordManager.updateSettings({hint:this.hint,currentPassword:this.plainPassword,newPassword:this.newPassword,email:e}).then((e=>{r()}),(t=>{if(t.type.includes("EMAIL_UNCONFIRMED")){const i=+t.type.match(/^EMAIL_UNCONFIRMED_(\d+)/)[1],s=this.slider.createTab(V);s.state=this.state,s.email=e,s.length=i,s.open()}else console.log("password set error",t);l(!1),i.remove()}))};(0,v.fc)(a,d);const l=e=>{e?(a.setAttribute("disabled","true"),o.setAttribute("disabled","true")):(a.removeAttribute("disabled"),o.removeAttribute("disabled"))};(0,v.fc)(o,(e=>{new B.Z("popup-skip-email",{buttons:[{langKey:"Cancel",isCancel:!0},{langKey:"YourEmailSkip",callback:()=>{l(!0),(0,O.y)(o),this.managers.passwordManager.updateSettings({hint:this.hint,currentPassword:this.plainPassword,newPassword:this.newPassword,email:""}).then((()=>{r()}),(e=>{l(!1)}))},isDanger:!0}],titleLangKey:"YourEmailSkipWarning",descriptionLangKey:"YourEmailSkipWarningText"}).show()})),s.append(n.container,a,o),i.append(s),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){j(this.isFirst)&&this.inputField.input.focus()}}var q=i(130),Y=i(8115),Q=i(4425),X=i(6830),J=i(3083),ee=i(2796);class te extends l._{init(){this.container.classList.add("two-step-verification","two-step-verification-hint"),this.setTitle("TwoStepAuth.SetupHintTitle");const e=new b.Z({noDelimiter:!0}),t=document.createElement("div");(0,N.Z)({div:t,width:160,height:160,emoji:"๐Ÿ’ก"}),e.content.append(t);const i=document.createElement("div");i.classList.add("input-wrapper");const s=this.inputField=new u.ZP({name:"hint",label:"TwoStepAuth.SetupHintPlaceholder"});s.input.addEventListener("keypress",(e=>{if("Enter"===e.key)return(0,K.Z)(e),s.value?r():d()}));const n=(e,t)=>{e&&(0,K.Z)(e);const i=t?s.value:void 0;if(i&&this.newPassword===i)return void(0,ee.Am)(f.ZP.format("PasswordAsHintError",!0));const n=this.slider.createTab($);n.state=this.state,n.plainPassword=this.plainPassword,n.newPassword=this.newPassword,n.hint=i,n.open()},a=(0,I.Z)("btn-primary btn-color-primary",{text:"Continue"}),o=(0,I.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"YourEmailSkip"}),r=e=>n(e,!0),d=e=>n(e,!1);(0,v.fc)(a,r),(0,v.fc)(o,d),i.append(s.container,a,o),e.content.append(i),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){this.inputField.input.focus()}}class ie extends l._{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 b.Z({noDelimiter:!0}),t=document.createElement("div");t.classList.add("input-wrapper");const i=this.passwordInputField=new X.Z({name:"re-enter-password",label:"PleaseReEnterPassword"}),s=new J.Z(i,157),n=(0,I.Z)("btn-primary btn-color-primary",{text:"Continue"});t.append(i.container,n),e.content.append(s.container,t),this.scrollable.container.append(e.container),i.input.addEventListener("keypress",(e=>{if(i.input.classList.contains("error")&&i.setState(u.I1.Neutral),"Enter"===e.key)return o()}));const a=()=>this.newPassword===i.value||(i.setError(),!1),o=e=>{if(e&&(0,K.Z)(e),!a())return;const t=this.slider.createTab(te);t.state=this.state,t.plainPassword=this.plainPassword,t.newPassword=this.newPassword,t.open()};return(0,v.fc)(n,o),s.load()}onOpenAfterTimeout(){this.passwordInputField.input.focus()}}class se extends l._{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 b.Z({noDelimiter:!0}),i=document.createElement("div");i.classList.add("input-wrapper");const s=this.passwordInputField=new X.Z({name:"enter-password",label:e?"PleaseEnterFirstPassword":this.state.hint?void 0:"LoginPassword",labelText:!e&&this.state.hint?(0,Y.Z)(this.state.hint):void 0}),n=new Q.Z(s,157),a=(0,I.Z)("btn-primary btn-color-primary"),o=new f.ZP.IntlElement({key:"Continue"});a.append(o.element),i.append(s.container,a),t.content.append(n.container,i),this.scrollable.container.append(t.container),s.input.addEventListener("keypress",(e=>{if(s.input.classList.contains("error")&&(s.input.classList.remove("error"),o.key="Continue",o.update()),"Enter"===e.key)return d()}));const r=()=>!!s.value.length||(s.input.classList.add("error"),!1);let d;if(e)d=e=>{if(e&&(0,K.Z)(e),!r())return;const t=this.slider.createTab(ie);t.state=this.state,t.newPassword=s.value,t.plainPassword=this.plainPassword,t.open()};else{let e;const t=()=>(e||(e=window.setInterval(t,1e4)),this.managers.passwordManager.getState().then((e=>{this.state=e,this.state.hint?(0,q.Z)(s.label,(0,Y.Z)(this.state.hint)):(0,Z.Z)(s.label,(0,f.ag)("LoginPassword"))})));d=i=>{if(!r())return void(0,K.Z)(i);a.setAttribute("disabled","true"),o.key="PleaseWait",o.update();const d=(0,O.y)(a),l=s.value;this.managers.passwordManager.check(s.value,this.state).then((t=>{if(console.log(t),"auth.authorization"===t._){clearInterval(e),n&&n.remove();const t=this.slider.createTab(ne);t.state=this.state,t.plainPassword=l,t.open(),this.slider.removeTabFromHistory(this)}}),(e=>{a.removeAttribute("disabled"),s.input.classList.add("error"),e.type,o.key="PASSWORD_HASH_INVALID",o.update(),d.remove(),s.select(),t()}))},t()}return(0,v.fc)(a,d),n.load()}onOpenAfterTimeout(){j(this.isFirst)&&this.passwordInputField.input.focus()}}class ne extends l._{init(){this.container.classList.add("two-step-verification","two-step-verification-main"),this.setTitle("TwoStepVerificationTitle");const e=new b.Z({captionOld:!0,noDelimiter:!0}),t=document.createElement("div");(0,N.Z)({div:t,width:168,height:168,emoji:"๐Ÿ”"}),e.content.append(t);const i=e.generateContentElement();if(this.state.pFlags.has_password){(0,f.$d)(e.caption,"TwoStepAuth.GenericHelp");const t=(0,I.Z)("btn-primary btn-transparent",{icon:"edit",text:"TwoStepAuth.ChangePassword"}),s=(0,I.Z)("btn-primary btn-transparent",{icon:"passwordoff",text:"TwoStepAuth.RemovePassword"}),n=(0,I.Z)("btn-primary btn-transparent",{icon:"email",text:this.state.pFlags.has_recovery?"TwoStepAuth.ChangeEmail":"TwoStepAuth.SetupEmail"});(0,v.fc)(t,(()=>{const e=this.slider.createTab(se);e.state=this.state,e.plainPassword=this.plainPassword,e.open()})),(0,v.fc)(s,(()=>{new B.Z("popup-disable-password",{buttons:[{langKey:"Disable",callback:()=>{this.managers.passwordManager.updateSettings({currentPassword:this.plainPassword}).then((()=>{this.slider.sliceTabsUntilTab(Ct,this),this.close()}))},isDanger:!0}],titleLangKey:"TurnPasswordOffQuestionTitle",descriptionLangKey:"TurnPasswordOffQuestion"}).show()})),(0,v.fc)(n,(()=>{const e=this.slider.createTab($);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{(0,f.$d)(e.caption,"TwoStepAuth.SetPasswordHelp");const t=document.createElement("div");t.classList.add("input-wrapper");const s=(0,I.Z)("btn-primary btn-color-primary",{text:"TwoStepVerificationSetPassword"});t.append(s),i.append(t),(0,v.fc)(s,(e=>{const t=this.slider.createTab(se);t.state=this.state,t.open()}))}this.scrollable.container.append(e.container)}}class ae extends M.h{init(){this.container.classList.add("privacy-tab","privacy-last-seen"),this.setTitle("PrivacyLastSeen");const e="PrivacySettingsController.LastSeenDescription";new F({tab:this,title:"LastSeenTitle",inputKey:"inputPrivacyKeyStatusTimestamp",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,managers:this.managers})}}class oe extends M.h{init(){this.container.classList.add("privacy-tab","privacy-profile-photo"),this.setTitle("PrivacyProfilePhoto");const e="PrivacySettingsController.ProfilePhoto.CustomHelp";new F({tab:this,title:"PrivacyProfilePhotoTitle",inputKey:"inputPrivacyKeyProfilePhoto",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,skipTypes:[x.Nobody],managers:this.managers})}}class re extends M.h{init(){this.container.classList.add("privacy-tab","privacy-forward-messages"),this.setTitle("PrivacySettings.Forwards");const e="PrivacySettingsController.Forwards.CustomHelp";new F({tab:this,title:"PrivacyForwardsTitle",inputKey:"inputPrivacyKeyForwards",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,managers:this.managers})}}class de extends M.h{init(){this.container.classList.add("privacy-tab","privacy-add-to-groups"),this.setTitle("PrivacySettings.Groups");const e="PrivacySettingsController.GroupDescription";new F({tab:this,title:"WhoCanAddMe",inputKey:"inputPrivacyKeyChatInvite",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,skipTypes:[x.Nobody],managers:this.managers})}}class le extends M.h{init(){this.container.classList.add("privacy-tab","privacy-calls"),this.setTitle("PrivacySettings.VoiceCalls");const e="PrivacySettingsController.PhoneCallDescription";new F({tab:this,title:"WhoCanCallMe",inputKey:"inputPrivacyKeyPhoneCall",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,managers:this.managers});{const e="PrivacySettingsController.P2p.Desc";new F({tab:this,title:"PrivacyP2PHeader",inputKey:"inputPrivacyKeyPhoneP2P",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,managers:this.managers})}}}var ce=i(3003),he=i(8497),ue=i(4064),pe=i(6976),fe=i(1483),me=i(3416);class ge extends M.h{init(){this.container.classList.add("active-sessions-container"),this.setTitle("SessionsTitle");const e=e=>{const t=new P.ZP({title:[e.app_name,e.app_version].join(" "),subtitle:[e.ip,e.country].join(" - "),clickable:!0,titleRight:e.pFlags.current?void 0:(0,C.zM)(new Date(1e3*Math.max(e.date_active,e.date_created)))});return t.container.dataset.hash=""+e.hash,t.midtitle.textContent=[e.device_model,e.system_version||e.platform].filter(Boolean).join(", "),t},t=this.authorizations.slice();{const n=new b.Z({name:"CurrentSession",caption:"ClearOtherSessionsHelp"}),a=(0,ue.Z)(t,(e=>e.pFlags.current)),o=e(a);if(n.content.append(o.container),t.length){const e=(0,I.Z)("btn-primary btn-transparent danger",{icon:"stop",text:"TerminateAllSessions"});(0,v.fc)(e,(t=>{new B.Z("revoke-session",{buttons:[{langKey:"Terminate",isDanger:!0,callback:()=>{const t=(0,G.Z)([e],!0);this.managers.apiManager.invokeApi("auth.resetAuthorizations").then((t=>{e.remove(),i.container.remove()}),s).finally((()=>{t()}))}}],titleLangKey:"AreYouSureSessionsTitle",descriptionLangKey:"AreYouSureSessions"}).show()}),{listenerSetter:this.listenerSetter}),n.content.append(e)}this.scrollable.append(n.container)}if(!t.length)return;const i=new b.Z({name:"OtherSessions",caption:"SessionsListInfo"});t.forEach((t=>{i.content.append(e(t).container)})),this.scrollable.append(i.container);const s=e=>{"FRESH_RESET_AUTHORISATION_FORBIDDEN"===e.type&&(0,ee.Am)(f.ZP.format("RecentSessions.Error.FreshReset",!0))};let n;const a=()=>{const e=n.dataset.hash;new B.Z("revoke-session",{buttons:[{langKey:"Terminate",isDanger:!0,callback:()=>{this.managers.apiManager.invokeApi("account.resetAuthorization",{hash:e}).then((e=>{e&&n.remove()}),s)}}],titleLangKey:"AreYouSureSessionTitle",descriptionLangKey:"TerminateSessionText"}).show()},o=this.menuElement=(0,ce.b)({buttons:[{icon:"stop",text:"Terminate",onClick:a}]});o.id="active-sessions-contextmenu",o.classList.add("contextmenu"),document.getElementById("page-chats").append(o),(0,pe.E)({element:this.scrollable.container,callback:e=>{n=(0,he.Z)(e.target,"row"),n&&"0"!==n.dataset.hash&&(e instanceof MouseEvent&&e.preventDefault(),e instanceof MouseEvent&&(e.cancelBubble=!0),(0,fe.Z)(e,o),me.Z.openBtnMenu(o))},listenerSetter:this.listenerSetter}),(0,v.fc)(this.scrollable.container,(e=>{n=(0,he.Z)(e.target,"row"),n&&"0"!==n.dataset.hash&&a()}),{listenerSetter:this.listenerSetter})}onCloseAfterTimeout(){var e;return null===(e=this.menuElement)||void 0===e||e.remove(),super.onCloseAfterTimeout()}}var ve=i(2995),be=i(4668),ye=i(8210),we=i(5102);class Se extends l._{init(){this.container.classList.add("blocked-users-container"),this.setTitle("BlockedUsers");const e=new b.Z({caption:"BlockedUsersInfo"});e.caption.parentElement.prepend(e.caption),this.scrollable.append(e.container);const t=(0,m.Z)({icon:"add",className:"is-visible"});this.content.append(t),(0,v.fc)(t,(e=>{new ve.Z({peerTypes:["contacts"],placeholder:"BlockModal.Search.Placeholder",onSelect:e=>{this.managers.appUsersManager.toggleBlock(e,!0)}})}),{listenerSetter:this.listenerSetter});const i=h.default.createChatList();this.scrollable.container.classList.add("chatlist-container"),e.content.append(i);const s=(e,t)=>{return s=this,n=void 0,o=function*(){const{dom:s}=h.default.addDialogNew({peerId:e,container:i,rippleEnabled:!0,avatarSize:"abitbigger",append:t}),n=yield this.managers.appUsersManager.getUser(e.toUserId());if(!n)return;const a=(0,we.Z)(n)[0];n.pFlags.bot?s.lastMessageSpan.append("@"+a):n.phone?s.lastMessageSpan.innerHTML=(0,ye.Z)(n.phone):s.lastMessageSpan.append(a?"@"+a:(0,g.Z)(n))},new((a=void 0)||(a=Promise))((function(e,t){function i(e){try{d(o.next(e))}catch(e){t(e)}}function r(e){try{d(o.throw(e))}catch(e){t(e)}}function d(t){var s;t.done?e(t.value):(s=t.value,s instanceof a?s:new a((function(e){e(s)}))).then(i,r)}d((o=o.apply(s,n||[])).next())}));var s,n,a,o};for(const e of this.peerIds)s(e,!0);let a;const o=this.menuElement=(0,ce.b)({buttons:[{icon:"lockoff",text:"Unblock",onClick:()=>{const e=a.dataset.peerId.toPeerId();this.managers.appUsersManager.toggleBlock(e,!1)},options:{listenerSetter:this.listenerSetter}}]});o.id="blocked-users-contextmenu",o.classList.add("contextmenu"),document.getElementById("page-chats").append(o),(0,pe.E)({element:this.scrollable.container,callback:e=>{a=(0,be.Z)(e.target,h.DIALOG_LIST_ELEMENT_TAG),a&&(e instanceof MouseEvent&&e.preventDefault(),e instanceof MouseEvent&&(e.cancelBubble=!0),(0,fe.Z)(e,o),me.Z.openBtnMenu(o))},listenerSetter:this.listenerSetter}),this.listenerSetter.add(n.Z)("peer_block",(e=>{const{peerId:t,blocked:n}=e,a=i.querySelector(`[data-peer-id="${t}"]`);n?a||s(t,!1):a&&a.remove()}));let r=!1;this.scrollable.onScrolledBottom=()=>{r||(r=!0,this.managers.appUsersManager.getBlocked(i.childElementCount,50).then((e=>{for(const t of e.peerIds)s(t,!0);(e.peerIds.length<50||i.childElementCount===e.count)&&(this.scrollable.onScrolledBottom=null),this.scrollable.checkForTriggers()})).finally((()=>{r=!1})))}}onOpenAfterTimeout(){this.scrollable.onScroll()}onCloseAfterTimeout(){return this.menuElement&&this.menuElement.remove(),super.onCloseAfterTimeout()}}var Ce=i(9807);function Le(e){return"input"+(e[0].toUpperCase()+e.slice(1))}var Ee=i(5592),Ie=i(319);class Me extends M.h{init(){this.container.classList.add("privacy-tab","privacy-voices"),this.setTitle("PrivacyVoiceMessages");const e="PrivacyVoiceMessagesInfo";new F({tab:this,title:"PrivacyVoiceMessagesTitle",inputKey:"inputPrivacyKeyVoiceMessages",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,managers:this.managers})}}var Pe=i(7362),Ze=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Te extends M.h{init(e){return Ze(this,void 0,void 0,(function*(){this.container.classList.add("active-sessions-container"),this.setTitle("WebSessionsTitle");const t=e=>Ze(this,void 0,void 0,(function*(){const t=e.bot_id.toPeerId(),i=new P.ZP({title:yield(0,Pe.Z)({peerId:t}),subtitle:[e.ip,e.region].join(" - "),clickable:!0,titleRight:(0,C.zM)(new Date(1e3*Math.max(e.date_active,e.date_created)))}),s=i.createMedia("big"),n=new o.Z;return n.classList.add("avatar-48"),yield n.updateWithOptions({peerId:t}),s.append(n),i.container.dataset.hash=""+e.hash,i.container.dataset.peerId=""+t,i.midtitle.textContent=[e.domain,e.browser,e.platform].filter(Boolean).join(", "),i}));{const e=new b.Z({caption:"ClearOtherWebSessionsHelp"}),t=(0,I.Z)("btn-primary btn-transparent danger",{icon:"stop",text:"TerminateAllWebSessions"});(0,v.fc)(t,(()=>Ze(this,void 0,void 0,(function*(){yield(0,Ee.Z)({descriptionLangKey:"AreYouSureWebSessions",button:{langKey:"Disconnect",isDanger:!0}}),(0,G.Z)([t],!0),this.managers.appSeamlessLoginManager.resetWebAuthorizations().then((()=>{this.close()}))}))),{listenerSetter:this.listenerSetter}),e.content.append(t),this.scrollable.append(e.container)}{const i=new b.Z({name:"OtherWebSessions",caption:"TerminateWebSessionInfo"}),s=yield Promise.all(e.map(t));i.content.append(...s.map((e=>e.container)));let n=s.length;(0,v.fc)(i.content,(e=>Ze(this,void 0,void 0,(function*(){const t=(0,he.Z)(e.target,"row");if(!t)return;yield(0,Ee.Z)({descriptionLangKey:"TerminateWebSessionText",descriptionLangArgs:[yield(0,Pe.Z)({peerId:t.dataset.peerId.toPeerId()})],button:{langKey:"Disconnect",isDanger:!0}});const i=t.dataset.hash;t.classList.add("is-disabled"),this.managers.appSeamlessLoginManager.resetWebAuthorization(i).then((()=>{--n?t.remove():this.close()}))}))),{listenerSetter:this.listenerSetter}),this.scrollable.append(i.container)}}))}}class ke extends M.h{static getInitArgs(e){return{appConfig:e.managers.apiManager.getAppConfig(),globalPrivacy:e.managers.appPrivacyManager.getGlobalPrivacySettings(),contentSettings:e.managers.apiManager.invokeApi("account.getContentSettings"),webAuthorizations:e.managers.appSeamlessLoginManager.getWebAuthorizations()}}init(e){this.container.classList.add("dont-u-dare-block-me"),this.setTitle("PrivacySettings");const t="Loading",i=[];{const s=new b.Z({noDelimiter:!0,caption:"SessionsInfo"});let a;const o=new P.ZP({icon:"deleteuser",titleLangKey:"BlockedUsers",subtitleLangKey:t,clickable:()=>{const e=this.slider.createTab(Se);e.peerIds=a,e.open()},listenerSetter:this.listenerSetter});let r;o.freezed=!0;const d={icon:"lock",titleLangKey:"TwoStepVerification",subtitleLangKey:t,clickable:e=>{let t;r.pFlags.has_password?t=this.slider.createTab(se):r.email_unconfirmed_pattern?(t=this.slider.createTab(V),t.email=r.email_unconfirmed_pattern,t.length=6,t.isFirst=!0,this.managers.passwordManager.resendPasswordEmail()):t=this.slider.createTab(ne),t.state=r,t.open()},listenerSetter:this.listenerSetter},l=new P.ZP(d);l.freezed=!0;const c=this.activeSessionsRow=new P.ZP({icon:"activesessions",titleLangKey:"SessionsTitle",subtitleLangKey:t,clickable:()=>{const e=this.slider.createTab(ge);e.authorizations=this.authorizations,e.eventListener.addEventListener("destroy",(()=>{this.updateActiveSessions()}),{once:!0}),e.open()},listenerSetter:this.listenerSetter});c.freezed=!0;const h=this.websitesRow=new P.ZP({icon:"mention",titleLangKey:"OtherWebSessions",subtitleLangKey:t,clickable:()=>{const e=this.slider.createTab(Te);e.eventListener.addEventListener("destroy",(()=>{this.updateActiveWebsites()})),e.open(this.websites)},listenerSetter:this.listenerSetter});h.freezed=!0,s.content.append(o.container,l.container,c.container,h.container),this.scrollable.append(s.container);const u=e=>{e?(0,Z.Z)(o.subtitle,(0,f.ag)("PrivacySettingsController.UserCount",[e])):(0,Z.Z)(o.subtitle,(0,f.ag)("BlockedEmpty",[e]))};this.listenerSetter.add(n.Z)("peer_block",(()=>{p()}));const p=()=>{this.managers.appUsersManager.getBlocked().then((e=>{o.freezed=!1,u(e.count),a=e.peerIds}))};p(),this.managers.passwordManager.getState().then((e=>{r=e,(0,Z.Z)(l.subtitle,(0,f.ag)(e.pFlags.has_password?"PrivacyAndSecurity.Item.On":"PrivacyAndSecurity.Item.Off")),l.freezed=!1})),this.updateActiveSessions(),i.push(this.updateActiveWebsites(e.webAuthorizations))}{const e=new b.Z({name:"PrivacyTitle",caption:"GroupsAndChannelsHelp"});e.content.classList.add("privacy-navigation-container");const i={},s=i.inputPrivacyKeyPhoneNumber=new P.ZP({titleLangKey:"PrivacyPhoneTitle",subtitleLangKey:t,clickable:()=>{this.slider.createTab(R).open()},listenerSetter:this.listenerSetter}),a=i.inputPrivacyKeyStatusTimestamp=new P.ZP({titleLangKey:"LastSeenTitle",subtitleLangKey:t,clickable:()=>{this.slider.createTab(ae).open()},listenerSetter:this.listenerSetter}),o=i.inputPrivacyKeyProfilePhoto=new P.ZP({titleLangKey:"PrivacyProfilePhotoTitle",subtitleLangKey:t,clickable:()=>{this.slider.createTab(oe).open()},listenerSetter:this.listenerSetter}),r=i.inputPrivacyKeyPhoneCall=new P.ZP({titleLangKey:"WhoCanCallMe",subtitleLangKey:t,clickable:()=>{this.slider.createTab(le).open()},listenerSetter:this.listenerSetter}),d=i.inputPrivacyKeyForwards=new P.ZP({titleLangKey:"PrivacyForwardsTitle",subtitleLangKey:t,clickable:()=>{this.slider.createTab(re).open()},listenerSetter:this.listenerSetter}),l=i.inputPrivacyKeyChatInvite=new P.ZP({titleLangKey:"WhoCanAddMe",subtitleLangKey:t,clickable:()=>{this.slider.createTab(de).open()},listenerSetter:this.listenerSetter}),c=i.inputPrivacyKeyVoiceMessages=new P.ZP({titleLangKey:"PrivacyVoiceMessagesTitle",subtitleLangKey:t,clickable:()=>{n.Z.premium?this.slider.createTab(Me).open():(0,ee.bC)({langPackKey:"PrivacyVoiceMessagesPremiumOnly"})},listenerSetter:this.listenerSetter}),h=e=>{const t=i[e];t&&this.managers.appPrivacyManager.getPrivacy(e).then((e=>{const i=k(e),s=i.type===x.Everybody?"PrivacySettingsController.Everbody":i.type===x.Contacts?"PrivacySettingsController.MyContacts":"PrivacySettingsController.Nobody",n=i.disallowPeers.users.length+i.disallowPeers.chats.length,a=i.allowPeers.users.length+i.allowPeers.chats.length;t.subtitle.innerHTML="";const o=(0,f.ag)(s);t.subtitle.append(o),(n||a)&&t.subtitle.append(` (${[-n,a?"+"+a:0].filter(Boolean).join(", ")})`)}))};e.content.append(s.container,a.container,o.container,r.container,d.container,l.container,c.container),this.scrollable.append(e.container);for(const e in i)h(e);n.Z.addEventListener("privacy_update",(e=>{h(Le(e.key._))}))}{const t=new b.Z({name:"NewChatsFromNonContacts",caption:"ArchiveAndMuteInfo"}),s=new Ce.Z({text:"ArchiveAndMute"}),a=new P.ZP({checkboxField:s});let o,r;t.content.append(a.container),this.eventListener.addEventListener("destroy",(()=>{if(r=!0,void 0!==o&&o!==s.checked)return this.managers.appPrivacyManager.setGlobalPrivacySettings({_:"globalPrivacySettings",archive_and_mute_new_noncontact_peers:s.checked})}),{once:!0});const d=Promise.all([e.appConfig,e.globalPrivacy]).then((([e,i])=>{if(r)return;const a=i=>{t.container.classList.toggle("hide",!i&&!e.autoarchive_setting_available)};this.listenerSetter.add(n.Z)("premium_toggle",a),a(n.Z.premium),o=!!i.archive_and_mute_new_noncontact_peers,s.setValueSilently(o)}));i.push(d),this.scrollable.append(t.container)}{const t=new b.Z({name:"Privacy.SensitiveContent",caption:"PrivacyAndSecurity.SensitiveDesc"});t.container.classList.add("hide");const s=new Ce.Z({text:"PrivacyAndSecurity.SensitiveText"}),n=new P.ZP({checkboxField:s});let a;t.content.append(n.container),this.eventListener.addEventListener("destroy",(()=>{if(void 0===a)return;const e=n.checkboxField.checked;return e!==a?this.managers.apiManager.invokeApi("account.setContentSettings",{sensitive_enabled:e}):void 0}),{once:!0});const o=e.contentSettings.then((e=>{e.pFlags.sensitive_can_change&&(a=!!e.pFlags.sensitive_enabled,s.setValueSilently(a),t.container.classList.remove("hide"))}));i.push(o),this.scrollable.append(t.container)}{const e=new b.Z({name:"PrivacyPayments",caption:"PrivacyPaymentsClearInfo"}),t=()=>{const e={titleLangKey:"PrivacyPaymentsClearAlertTitle",descriptionLangKey:"PrivacyPaymentsClearAlertText",button:{langKey:"Clear"},checkboxes:[{text:"PrivacyClearShipping",checked:!0},{text:"PrivacyClearPayment",checked:!0}]};(0,Ee.Z)(e).then((()=>{const[t,s]=e.checkboxes.map((e=>e.checkboxField.checked)),n=(0,G.Z)([i],!0);this.managers.appPaymentsManager.clearSavedInfo(t,s).then((()=>{(t||s)&&(n(),(0,ee.bC)({langPackKey:t&&s?"PrivacyPaymentsPaymentShippingCleared":t?"PrivacyPaymentsShippingInfoCleared":"PrivacyPaymentsPaymentInfoCleared"}))}))}),Ie.Z)},i=(0,I.Z)("btn-primary btn-transparent",{icon:"delete",text:"PrivacyPaymentsClear"});this.listenerSetter.add(i)("click",t),e.content.append(i),this.scrollable.append(e.container)}{const e=new b.Z({name:"FilterChats"}),t=()=>{new B.Z("popup-delete-drafts",{buttons:[{langKey:"Delete",callback:()=>{const e=(0,G.Z)([i],!0);this.managers.appDraftsManager.clearAllDrafts().then((()=>{e()}))},isDanger:!0}],titleLangKey:"AreYouSureClearDraftsTitle",descriptionLangKey:"AreYouSureClearDrafts"}).show()},i=(0,I.Z)("btn-primary btn-transparent",{icon:"delete",text:"PrivacyDeleteCloudDrafts"});this.listenerSetter.add(i)("click",t),e.content.append(i),this.scrollable.append(e.container)}return Promise.all(i)}updateActiveSessions(){return this.managers.apiManager.invokeApi("account.getAuthorizations").then((e=>{this.activeSessionsRow.freezed=!1,this.authorizations=e.authorizations,(0,f.$d)(this.activeSessionsRow.subtitle,"Privacy.Devices",[this.authorizations.length])}))}updateActiveWebsites(e=this.managers.appSeamlessLoginManager.getWebAuthorizations()){return e.then((e=>{this.websitesRow.freezed=!1,this.websites=e,(0,f.$d)(this.websitesRow.subtitle,"Privacy.Websites",[this.websites.length]),this.websitesRow.container.classList.toggle("hide",!this.websites.length)}))}}var xe=i(65),Ae=i(9439),_e=i(8938),Fe=i(2153),De=i(6787),Re=i(6761);var Be=i(3731),Ne=i(62);class Oe extends M.Z{init(){return this.setTitle("DoubleTapSetting"),this.container.classList.add("quick-reaction-container"),Promise.all([this.managers.appReactionsManager.getQuickReaction(),this.managers.appReactionsManager.getAvailableReactions()]).then((([e,t])=>{t=t.filter((e=>!e.pFlags.inactive));const i=new b.Z,s=t.map((t=>{const i=new A.Z({name:"quick-reaction",text:t.title,value:t.reaction,alignRight:!0}),s=new P.ZP({radioField:i,havePadding:!0});return i.main.classList.add("quick-reaction-title"),(0,Ne.Z)({row:s,doc:t.static_icon,size:"small"}),t.reaction===e.reaction&&i.setValueSilently(!0),s})),n=(0,P.De)(s,(e=>{this.managers.appReactionsManager.setDefaultReaction({_:"reactionEmoji",emoticon:e})}));i.content.append(n),this.scrollable.append(i.container)}))}}var Ue=i(236),He=i(1273),ze=i(6714),je=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Ge{constructor(e,t,i,s,n,a=!0){const o="range-setting-selector";this.container=document.createElement("div"),this.container.classList.add(o);const r=document.createElement("div");r.classList.add(o+"-details");const d=document.createElement("div");d.classList.add(o+"-name"),(0,f.$d)(d,e);const l=this.valueContainer=document.createElement("div");l.classList.add(o+"-value"),a&&(l.innerHTML=""+i),r.append(d,l),this.range=new xe.Z({step:t,min:s,max:n},i),this.range.setListeners(),this.range.setHandlers({onScrub:e=>{this.onChange&&this.onChange(e),a&&(l.innerText=""+e)}}),this.container.append(r,this.range.container)}}class Ve extends M.h{static getInitArgs(){return{themes:n.Z.managers.appThemesManager.getThemes(),allStickers:n.Z.managers.appStickersManager.getAllStickers(),quickReaction:n.Z.managers.appReactionsManager.getQuickReaction()}}init(e){this.container.classList.add("general-settings-container"),this.setTitle("General");const t=b.R.bind(null,this.scrollable),i=[];{const e=t("Settings"),i=new Ge("TextSize",1,n.Z.settings.messagesTextSize,12,20);i.onChange=e=>{n.Z.managers.appStateManager.setByKey("settings.messagesTextSize",e)};const s=(0,I.Z)("btn-primary btn-transparent",{icon:"image",text:"ChatBackground"}),a=Ae.Z.getInitArgs();(0,v.fc)(s,(()=>{this.slider.createTab(Ae.Z).open(a)}));const o=new Ce.Z({text:"EnableAnimations",name:"animations",stateKey:"settings.animationsEnabled",listenerSetter:this.listenerSetter});e.append(i.container,s,(0,P.tG)(o).container)}{const s=t("ColorTheme"),a=new r.v7(null),o=a.container;o.classList.add("themes-container");const d=new Map;let l=ze.Z.getTheme(),c=ze.Z.isNight();const h=e=>{ze.Z.applyTheme(e.theme,e.container);const t=e.container.querySelector(".background-item");null==t||t.remove();const i=e.wallPaperContainers[c?"baseThemeNight":"baseThemeClassic"];i&&e.container.prepend(i)};let u;(0,v.fc)(o,(e=>je(this,void 0,void 0,(function*(){const t=(0,he.Z)(e.target,"theme-container");if(!t)return;const i=o.querySelector(".active");i&&i.classList.remove("active");const s=d.get(t);if(t.classList.add("active"),yield ze.Z.applyNewTheme(s.theme),null==u||u(-1),s.player&&n.Z.settings.animationsEnabled)if(z.IS_SAFARI)s.player.paused&&s.player.restart();else{s.player.paused&&s.player.stop(!0),s.player.el[0].style.transform="scale(2)";const e=u=t=>{s.player.maxFrame!==t&&-1!==t||(s.player.el[0].style.transform="",s.player.removeEventListener("enterFrame",e),u===e&&(u=void 0))};setTimeout((()=>{u===e&&(s.player.play(),s.player.addEventListener("enterFrame",e))}),250)}}))),{listenerSetter:this.listenerSetter});const p=new Set(["baseThemeClassic","baseThemeNight"]),f=e.themes.then((e=>je(this,void 0,void 0,(function*(){const t=e.filter((e=>e.pFlags.default));t.unshift(Ue.t);const i=t.map((e=>je(this,void 0,void 0,(function*(){const t=document.createElement("div"),i={container:t,theme:e,wallPaperContainers:{}},s=e.settings.filter((e=>p.has(e.base_theme._))).map((e=>{const t=e.wallpaper,s=Ae.Z.addWallPaper(t);return i.wallPaperContainers[e.base_theme._]=s.container,s}));d.set(t,i),h(i),e.id===l.id&&t.classList.add("active");const n=[];let a;if(e.emoticon){a=document.createElement("div"),a.classList.add("theme-emoticon");const t=49;(0,N.Z)({div:a,width:t,height:t,emoji:e.emoticon,managers:this.managers,loadPromises:n,middleware:this.middlewareHelper.get(),play:!1}).then((({render:e})=>e)).then((e=>{i.player=e}))}const o=document.createElement("div");o.classList.add("theme-bubble");const r=o.cloneNode();return r.classList.add("is-in"),o.classList.add("is-out"),n.push(...s.map((e=>e.loadPromise))),t.classList.add("theme-container"),yield Promise.all(n),a&&t.append(a),t.append(r,o),t})))),s=yield Promise.all(i);a.append(...s)}))));i.push(f);const m=document.createElement("form");m.style.marginTop=".5rem";const g="theme",b="settings.theme",y=new P.ZP({radioField:new A.Z({langKey:"ThemeDay",name:g,value:"day",stateKey:b})}),w=new P.ZP({radioField:new A.Z({langKey:"ThemeNight",name:g,value:"night",stateKey:b})}),S=new P.ZP({radioField:new A.Z({langKey:"AutoNightSystemDefault",name:g,value:"system",stateKey:b})});this.listenerSetter.add(n.Z)("settings_updated",(({key:e,value:t,settings:i})=>{e===b&&n.Z.dispatchEvent("theme_change")})),this.listenerSetter.add(n.Z)("theme_change",(()=>{l=ze.Z.getTheme();const e=ze.Z.isNight();if(c===e)return;c=e;const t=o.querySelector(".active");let i;t&&t.classList.remove("active"),d.forEach((e=>{h(e),e.theme.id===l.id&&(e.container.classList.add("active"),i=e.container)})),i&&a.scrollIntoViewNew({element:i,position:"center",axis:"x"})})),m.append(y.container,w.container,S.container),s.append(o,m)}{const e=t("General.Keyboard"),i=document.createElement("form"),s="send-shortcut",n="settings.sendShortcut",a=new P.ZP({radioField:new A.Z({langKey:"General.SendShortcut.Enter",name:s,value:"enter",stateKey:n}),subtitleLangKey:"General.SendShortcut.NewLine.ShiftEnter"}),o=new P.ZP({radioField:new A.Z({name:s,value:"ctrlEnter",stateKey:n}),subtitleLangKey:"General.SendShortcut.NewLine.Enter"});(0,f.$d)(o.radioField.main,"General.SendShortcut.CtrlEnter",[z.IS_APPLE?"โŒ˜":"Ctrl"]),i.append(a.container,o.container),e.append(i)}if(Be.Z){const e=t("DistanceUnitsTitle"),i=document.createElement("form"),s="distance-unit",n="settings.distanceUnit",a=new P.ZP({radioField:new A.Z({langKey:"DistanceUnitsKilometers",name:s,value:"kilometers",stateKey:n})}),o=new P.ZP({radioField:new A.Z({langKey:"DistanceUnitsMiles",name:s,value:"miles",stateKey:n})});i.append(a.container,o.container),e.append(i)}{const e=t("General.TimeFormat"),i=document.createElement("form"),s="time-format",n="settings.timeFormat",a=[["h12","General.TimeFormat.h12"],["h23","General.TimeFormat.h23"]],o=a.map((([e,t])=>new P.ZP({radioField:new A.Z({langKey:t,name:s,value:e,stateKey:n})}))),r=function(e,t=!0){return function(e,t,i=!0){const s=e;let n;return i||(e=Ie.Z),function i(){e(),n=Re.Z.setTimeout(i,t())}(),e=s,()=>{clearTimeout(n)}}(e,(()=>1e3*(60-(new Date).getSeconds())),t)}((()=>{const e=new Date;a.forEach((([t],i)=>{const s=e.toLocaleTimeString("en-us-u-hc-"+t,{hour:"2-digit",minute:"2-digit"});o[i].subtitle.textContent=s}))}));this.eventListener.addEventListener("destroy",r),i.append(...o.map((e=>e.container))),e.append(i)}{const e=t("Emoji"),i=new Ce.Z({text:"GeneralSettings.EmojiPrediction",name:"suggest-emoji",stateKey:"settings.emoji.suggest",listenerSetter:this.listenerSetter}),s=new Ce.Z({text:"GeneralSettings.BigEmoji",name:"emoji-big",stateKey:"settings.emoji.big",listenerSetter:this.listenerSetter});e.append((0,P.tG)(i).container,(0,P.tG)(s).container)}{const t=new b.Z({name:"Telegram.InstalledStickerPacksController",caption:"StickersBotInfo"}),s=new P.ZP({titleLangKey:"DoubleTapSetting",havePadding:!0,clickable:()=>{this.slider.createTab(Oe).open()},listenerSetter:this.listenerSetter}),a=()=>{e.quickReaction.then((e=>"availableReaction"===e._?e.static_icon:this.managers.appEmojiManager.getCustomEmojiDocument(e.document_id))).then((e=>{(0,Ne.Z)({row:s,doc:e,size:"small"})}))};a(),this.listenerSetter.add(n.Z)("quick_reaction",a);const o=new Ce.Z({text:"Stickers.SuggestStickers",name:"suggest",stateKey:"settings.stickers.suggest",listenerSetter:this.listenerSetter}),r=new Ce.Z({text:"InstalledStickers.LoopAnimated",name:"loop",stateKey:"settings.stickers.loop",listenerSetter:this.listenerSetter}),d={},l=t.generateContentElement(),c=new Fe.Z,h=(e,t="append")=>{const i=new P.ZP({title:(0,Y.Z)(e.title),subtitleLangKey:"Stickers",subtitleLangArgs:[e.count],havePadding:!0,clickable:()=>{new De.Z({id:e.id,access_hash:e.access_hash}).show()},listenerSetter:this.listenerSetter});d[e.id]=i;const s=document.createElement("div");s.classList.add("row-media"),(0,He.Z)({set:e,container:s,group:"GENERAL-SETTINGS",lazyLoadQueue:c,width:36,height:36,autoplay:!0,middleware:this.middlewareHelper.get()}),i.container.append(s),l[t](i.container)},u=e.allStickers.then((e=>{(0,_e.Z)(e);const t=e.sets.map((e=>h(e)));return Promise.all(t)}));i.push(u),this.listenerSetter.add(n.Z)("stickers_installed",(e=>{d[e.id]||h(e,"prepend")})),this.listenerSetter.add(n.Z)("stickers_deleted",(e=>{d[e.id]&&(d[e.id].container.remove(),delete d[e.id])})),t.content.append(s.container,(0,P.tG)(o).container,(0,P.tG)(r).container),this.scrollable.append(t.container)}return Promise.all(i)}}var Ke=i(2010),We=i(1447),$e=i(534),qe=i(4484),Ye=i(1507),Qe=i(2914),Xe=i(2648),Je=i(1655),et=i(3186),tt=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class it extends l._{constructor(){super(...arguments),this.filtersRendered={}}static getInitArgs(){return{animationData:We.Z.loadAnimationFromURLManually("Folders_1"),filters:n.Z.managers.filtersStorage.getDialogFilters()}}renderFolder(e,t,i,s){return tt(this,void 0,void 0,(function*(){let n,a="";const o=[];if("dialogFilterSuggested"===e._)n=e.filter,a=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&&o.push((0,f.ag)(t))}if(!o.length){const e=yield this.managers.dialogsStorage.getFolderDialogs(n.id);let t=0,i=0,s=0;yield Promise.all(e.map((e=>tt(this,void 0,void 0,(function*(){(yield this.managers.appPeersManager.isAnyGroup(e.peerId))?s++:(yield this.managers.appPeersManager.isBroadcast(e.peerId))?i++:t++}))))),t&&o.push((0,f.ag)("Chats",[t])),i&&o.push((0,f.ag)("Channels",[i])),s&&o.push((0,f.ag)("Groups",[s]))}}if(i)n.id!==Ye.J$&&(0,Z.Z)(i.title,(0,Y.Z)(n.title)),i.subtitle.textContent="",i.subtitle.append(...(0,f.v_)(o));else if(i=new P.ZP({title:n.id===Ye.J$?(0,f.ag)("FilterAllChats"):(0,Y.Z)(n.title),subtitle:a,clickable:!0,buttonRightLangKey:"dialogFilterSuggested"===e._?"Add":void 0}),o.length&&i.subtitle.append(...(0,f.v_)(o)),"dialogFilter"===e._){const e=n.id;if(!this.filtersRendered[n.id]&&n.id!==Ye.J$){const t=$e.Z.getInitArgs();(0,v.fc)(i.container,(()=>tt(this,void 0,void 0,(function*(){const i=yield this.managers.filtersStorage.getFilter(e),s=this.slider.createTab($e.Z);s.setInitFilter(i),s.open(t)}))),{listenerSetter:this.listenerSetter})}this.filtersRendered[n.id]=i,i.makeSortable()}const r=i.container;if(s){const e=n.localId;void 0!==e?(0,qe.Z)(r,r.parentElement||t,e):t&&t.append(r)}return i}))}init(e=it.getInitArgs()){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 t=document.createElement("div");t.classList.add("caption"),(0,f.XZ)({element:t,key:"ChatList.Filter.Header"}),this.createFolderBtn=(0,I.Z)("btn-primary btn-color-primary btn-control tgico",{text:"ChatList.Filter.NewTitle",icon:"add"}),this.foldersSection=new b.Z({name:"Filters"}),this.foldersSection.container.classList.add("hide"),this.list=document.createElement("div"),this.foldersSection.content.append(this.list),this.suggestedSection=new b.Z({name:"FilterRecommended"}),this.suggestedSection.container.classList.add("hide"),this.scrollable.append(this.stickerContainer,t,this.createFolderBtn,this.foldersSection.container,this.suggestedSection.container),(0,v.fc)(this.createFolderBtn,(()=>tt(this,void 0,void 0,(function*(){(yield this.canCreateFolder())?this.slider.createTab($e.Z).open():(0,et.Z)("folders")}))),{listenerSetter:this.listenerSetter});const i=()=>{this.foldersSection.container.classList.toggle("hide",!Object.keys(this.filtersRendered).length)},s=[],a=e.filters.then((e=>tt(this,void 0,void 0,(function*(){for(const t of e)t.id!==Ye.Zi&&(yield this.renderFolder(t,this.list,void 0,!0));this.toggleAllChats(),i()}))));return s.push(a),this.listenerSetter.add(n.Z)("filter_update",(e=>tt(this,void 0,void 0,(function*(){const t=this.filtersRendered[e.id];t?yield this.renderFolder(e,null,t):e.id!==Ye.Zi&&(yield this.renderFolder(e,this.list,void 0,!0)),i(),this.getSuggestedFilters()})))),this.listenerSetter.add(n.Z)("filter_delete",(e=>{const t=this.filtersRendered[e.id];t&&(this.getSuggestedFilters(),t.container.remove(),delete this.filtersRendered[e.id]),i()})),this.listenerSetter.add(n.Z)("filter_order",(e=>{e.filter((e=>!!this.filtersRendered[e])).forEach(((e,t)=>{const i=this.filtersRendered[e].container;(0,qe.Z)(i,i.parentElement,t+1)}))})),this.listenerSetter.add(n.Z)("premium_toggle",(()=>{this.toggleAllChats()})),this.loadAnimationPromise=e.animationData.then((e=>tt(this,void 0,void 0,(function*(){const t=yield e({container:this.stickerContainer,loop:!1,autoplay:!1,width:86,height:86});return this.animation=t,We.Z.waitForFirstFrame(t)})))),s.push(this.loadAnimationPromise),new Qe.Z({list:this.list,middleware:this.middlewareHelper.get(),onSort:(e,t)=>{let i=[];for(const e in this.filtersRendered){const t=this.filtersRendered[e];i[(0,Xe.Z)(t.container)]=+e}i=i.filter((e=>void 0!==e)),n.Z.premium||(0,Je.Z)(i,Ye.J$),this.managers.filtersStorage.updateDialogFiltersOrder(i)},scrollable:this.scrollable}),this.getSuggestedFilters(),Promise.all(s)}onOpenAfterTimeout(){return this.loadAnimationPromise.then((()=>{this.animation.autoplay=!0,this.animation.play()})),super.onOpenAfterTimeout()}toggleAllChats(){this.filtersRendered[Ye.J$].container.classList.toggle("hide",!n.Z.premium)}canCreateFolder(){return tt(this,void 0,void 0,(function*(){const[e,t]=yield Promise.all([this.managers.apiManager.getLimit("folders"),this.managers.filtersStorage.getDialogFilters()]);return t.filter((e=>!Ye.DZ.has(e.id))).lengthtt(this,void 0,void 0,(function*(){this.suggestedSection.container.classList.toggle("hide",!e.length),Array.from(this.suggestedSection.content.children).slice(1).forEach((e=>e.remove()));for(const t of e){const e=yield this.renderFolder(t);this.suggestedSection.content.append(e.container);const i=e.buttonRight;(0,v.fc)(i,(s=>tt(this,void 0,void 0,(function*(){if((0,K.Z)(s),!(yield this.canCreateFolder()))return void(0,et.Z)("folders");i.setAttribute("disabled","true");const n=t.filter;n.includePeerIds=[],n.excludePeerIds=[],n.pinnedPeerIds=[],this.managers.filtersStorage.createDialogFilter(n,!0).then((()=>{e.container.remove(),this.suggestedSection.container.classList.toggle("hide",1===this.suggestedSection.content.childElementCount)})).finally((()=>{i.removeAttribute("disabled")}))}))),{listenerSetter:this.listenerSetter})}}))))}}var st=i(8479),nt=i(3855),at=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class ot extends M.h{init(){this.container.classList.add("notifications-container"),this.setTitle("Telegram.NotificationSettingsViewController");const e=e=>{const t=new b.Z({name:e.name}),i=new P.ZP({checkboxField:new Ce.Z({text:e.typeText,checked:!0}),subtitleLangKey:"Loading",listenerSetter:this.listenerSetter,withCheckboxSubtitle:!0}),s=new P.ZP({checkboxField:new Ce.Z({text:"MessagePreview",checked:!0}),subtitleLangKey:"Loading",listenerSetter:this.listenerSetter,withCheckboxSubtitle:!0});t.content.append(i.container,s.container),this.scrollable.append(t.container);const a={_:e.inputKey},o=this.managers.appNotificationsManager.getNotifySettings(a);(o instanceof Promise?o:Promise.resolve(o)).then((t=>{const o=()=>at(this,void 0,void 0,(function*(){const e=yield this.managers.appNotificationsManager.isMuted(t);return i.checkboxField.checked=!e,s.checkboxField.checked=t.show_previews,e}));o(),this.eventListener.addEventListener("destroy",(()=>at(this,void 0,void 0,(function*(){const e=!i.checkboxField.checked,n=s.checkboxField.checked;if(e===(yield this.managers.appNotificationsManager.isMuted(t))&&n===t.show_previews)return;const o=(0,st.Z)(t);o._="inputPeerNotifySettings",o.mute_until=e?Ye.rU:0,o.show_previews=n,delete o.flags,this.managers.appNotificationsManager.updateNotifySettings(a,o)}))),{once:!0}),this.listenerSetter.add(n.Z)("notify_settings",(i=>{const s=Le(i.peer._);e.inputKey===s&&(t=i.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 b.Z({name:"NotificationsOther"}),t=new P.ZP({checkboxField:new Ce.Z({text:"ContactJoined",checked:!0}),subtitleLangKey:"Loading",listenerSetter:this.listenerSetter,withCheckboxSubtitle:!0}),i=new P.ZP({checkboxField:new Ce.Z({text:"Notifications.Sound",checked:!0,stateKey:"settings.notifications.sound",listenerSetter:this.listenerSetter}),subtitleLangKey:"Loading",listenerSetter:this.listenerSetter,withCheckboxSubtitle:!0});nt.Z.getState().then((e=>{i.checkboxField.checked=e.settings.notifications.sound})),e.content.append(t.container,i.container),this.scrollable.append(e.container),this.managers.appNotificationsManager.getContactSignUpNotification().then((e=>{t.checkboxField.checked=e,this.eventListener.addEventListener("destroy",(()=>{const i=t.checkboxField.checked;e!==i&&this.managers.appNotificationsManager.setContactSignUpNotification(!i)}),{once:!0})}))}}}class rt extends l._{static getInitArgs(){return{languages1:n.Z.managers.apiManager.invokeApiCacheable("langpack.getLanguages",{lang_pack:"web"}),languages2:Promise.resolve([])}}init(e){this.header.classList.add("with-border"),this.container.classList.add("language-container"),this.setTitle("Telegram.LanguageViewController");const t=new b.Z({}),i=new Map,s=Promise.all([e.languages1,e.languages2]).then((([e,s])=>{const n=new Set,a=e.map((e=>e.lang_code)),o=(0,T.a)();e.concat(s).forEach((e=>{if(n.has(e.lang_code))return;n.add(e.lang_code);const t=new P.ZP({radioField:new A.Z({text:e.name,name:o,value:e.lang_code}),subtitle:e.native_name});i.set(e.lang_code,t)}));const r=(0,P.De)([...i.values()],(e=>{f.ZP.getLangPack(e,a.includes(e))}));f.ZP.getCacheLangPack().then((e=>{const t=i.get(e.lang_code);t?t.radioField.setValueSilently(!0):console.error("no row",t,e)})),t.content.append(r)}));return this.scrollable.append(t.container),s}}var dt=i(4081),lt=i(6848),ct=i(5701);function ht(e,t,i){const s=new b.Z({name:t}),n="settings.autoDownload."+e+".",a=new Ce.Z({text:"AutodownloadContacts",name:"contacts",stateKey:n+"contacts",listenerSetter:i}),o=new Ce.Z({text:"AutodownloadPrivateChats",name:"private",stateKey:n+"private",listenerSetter:i}),r=new Ce.Z({text:"AutodownloadGroupChats",name:"groups",stateKey:n+"groups",listenerSetter:i}),d=new Ce.Z({text:"AutodownloadChannels",name:"channels",stateKey:n+"channels",listenerSetter:i});return s.content.append((0,P.tG)(a).container,(0,P.tG)(o).container,(0,P.tG)(r).container,(0,P.tG)(d).container),s}class ut extends M.h{init(){this.setTitle("AutoDownloadPhotos");const e=ht("photo","AutoDownloadPhotosTitle",this.listenerSetter);this.scrollable.append(e.container)}}class pt extends M.h{init(){this.setTitle("AutoDownloadFiles");const e=(0,ct.Z)((e=>{this.managers.appStateManager.setByKey("settings.autoDownloadNew.file_size_max",e)}),200,!1,!0),t=ht("file","AutoDownloadFilesTitle",this.listenerSetter),i=524288,s=20447232,a=n.Z.settings.autoDownloadNew.file_size_max,o=Math.sqrt(Math.sqrt((a-i)/s)),r=new f.ZP.IntlElement({key:"AutodownloadSizeLimitUpTo",args:[(0,dt.Z)(a)]}),d=new Ge("AutoDownloadMaxFileSize",.01,o,0,1,!1);d.onChange=t=>{const n=Math.pow(t,4)*s+i|0;r.compareAndUpdate({args:[(0,dt.Z)(n)]}),e(n)},d.valueContainer.append(r.element),t.content.append(d.container),this.scrollable.append(t.container)}}class ft extends M.h{init(){this.setTitle("AutoDownloadVideos");const e=ht("video","AutoDownloadVideosTitle",this.listenerSetter);this.scrollable.append(e.container)}}const mt={contacts:"AutoDownloadContacts",private:"AutoDownloadPm",groups:"AutoDownloadGroups",channels:"AutoDownloadChannels"};class gt extends M.h{init(){return e=this,t=void 0,s=function*(){this.setTitle("DataSettings");{const e=new b.Z({name:"AutomaticMediaDownload",caption:"AutoDownloadAudioInfo"}),t=yield nt.Z.getState(),i=new Ce.Z({text:"AutoDownloadMedia",name:"auto",checked:!t.settings.autoDownloadNew.pFlags.disabled,listenerSetter:this.listenerSetter}),s=new P.ZP({checkboxField:i,listenerSetter:this.listenerSetter}),a=()=>{(0,G.Z)([h],(0,lt.Z)(t.settings.autoDownload,Ue.h.settings.autoDownload)&&(0,lt.Z)(t.settings.autoDownloadNew,Ue.h.settings.autoDownloadNew))},o=()=>{this.setAutoDownloadSubtitle(d,t.settings.autoDownload.photo),this.setAutoDownloadSubtitle(l,t.settings.autoDownload.video),this.setAutoDownloadSubtitle(c,t.settings.autoDownload.file,t.settings.autoDownloadNew.file_size_max)},r=e=>{const t=this.slider.createTab(e);t.open(),this.listenerSetter.add(t.eventListener)("destroy",(()=>{o(),a()}),{once:!0})},d=new P.ZP({titleLangKey:"AutoDownloadPhotos",subtitle:"",clickable:()=>{r(ut)},listenerSetter:this.listenerSetter}),l=new P.ZP({titleLangKey:"AutoDownloadVideos",subtitle:"",clickable:()=>{r(ft)},listenerSetter:this.listenerSetter}),c=new P.ZP({titleLangKey:"AutoDownloadFiles",subtitle:"",clickable:()=>{r(pt)},listenerSetter:this.listenerSetter}),h=(0,I.Z)("btn-primary btn-transparent primary",{icon:"delete",text:"ResetAutomaticMediaDownload"});(0,v.fc)(h,(()=>{(0,Ee.Z)({titleLangKey:"ResetAutomaticMediaDownloadAlertTitle",descriptionLangKey:"ResetAutomaticMediaDownloadAlert",button:{langKey:"Reset"}}).then((()=>{const e=n.Z.settings;e.autoDownloadNew=(0,st.Z)(Ue.h.settings.autoDownloadNew),e.autoDownload=(0,st.Z)(Ue.h.settings.autoDownload),t.settings=e,this.managers.appStateManager.setByKey("settings",e),o(),i.checked=!t.settings.autoDownloadNew.pFlags.disabled}))}));const u=()=>{const e=!i.checked,t=n.Z.settings;e?t.autoDownloadNew.pFlags.disabled=!0:delete t.autoDownloadNew.pFlags.disabled,[d,l,c].forEach((t=>{t.container.classList.toggle("is-disabled",e)})),this.managers.appStateManager.setByKey("settings",t),a()};i.input.addEventListener("change",u),u(),o(),e.content.append(s.container,d.container,l.container,c.container,h),this.scrollable.append(e.container)}{const e=new b.Z({name:"AutoplayMedia"});e.content.append(new P.ZP({checkboxField:new Ce.Z({text:"AutoplayGIF",name:"gifs",stateKey:"settings.autoPlay.gifs",listenerSetter:this.listenerSetter}),listenerSetter:this.listenerSetter}).container,new P.ZP({checkboxField:new Ce.Z({text:"AutoplayVideo",name:"videos",stateKey:"settings.autoPlay.videos",listenerSetter:this.listenerSetter}),listenerSetter:this.listenerSetter}).container),this.scrollable.append(e.container)}},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}setAutoDownloadSubtitle(e,t,i){let s;const n=[],a=Object.keys(t),o=a.map((e=>t[e]?mt[e]:void 0)).filter(Boolean);if(o.length&&0!==i){const e=o.length===a.length;if(void 0!==i?(s=e?"AutoDownloadUpToOnAllChats":"AutoDownloadOnUpToFor",n.push((0,dt.Z)(i))):s=e?"AutoDownloadOnAllChats":"AutoDownloadOnFor",!e){const e=document.createElement("span");e.append(...(0,f.v_)(o.map((e=>(0,f.ag)(e))),!0,!1)),n.push(e)}}else s="AutoDownloadOff";(0,Z.Z)(e.subtitle,(0,f.ag)(s,n))}}var vt=i(2230),bt=i(8261),yt=i(6765),wt=i(1168),St=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Ct extends l._{constructor(){super(...arguments),this.buttons={}}init(){return St(this,void 0,void 0,(function*(){this.container.classList.add("settings-container"),this.setTitle("Settings");const e=(0,E.Z)({listenerSetter:this.listenerSetter,direction:"bottom-left",buttons:[{icon:"logout",text:"EditAccount.Logout",onClick:()=>{new B.Z("logout",{titleLangKey:"LogOut",descriptionLangKey:"LogOut.Description",buttons:[{langKey:"LogOut",callback:()=>{this.managers.apiManager.logOut()},isDanger:!0}]}).show()}}]});this.buttons.edit=(0,vt.Z)("edit"),this.header.append(this.buttons.edit,e),this.profile=new bt.Z(this.managers,this.scrollable,this.listenerSetter,!1),this.profile.init(),this.profile.setPeer(n.Z.myId);const t=this.profile.fillProfileElements(),i=(0,I.Z)("btn-circle btn-corner z-depth-1 profile-change-avatar",{icon:"cameraadd"});(0,v.fc)(i,(()=>{const e=document.createElement("canvas");wt.Z.createPopup(yt.Z).open(e,(e=>{e().then((e=>this.managers.appProfileManager.uploadProfilePhoto(e)))}))}),{listenerSetter:this.listenerSetter}),this.profile.element.lastElementChild.firstElementChild.append(i);const s=()=>St(this,void 0,void 0,(function*(){var e;const t=yield this.managers.appUsersManager.getSelf();i.classList.toggle("hide","userProfilePhoto"!==(null===(e=t.photo)||void 0===e?void 0:e._))}));s(),this.listenerSetter.add(n.Z)("avatar_update",(({peerId:e})=>{n.Z.myId===e&&s()}));const a=document.createElement("div");a.classList.add("profile-buttons");const o=(e,t,i,s)=>{if(!s){const e=i.getInitArgs;e&&(s=()=>[e(this)])}return{icon:e,text:t,tabConstructor:i,getInitArgs:s,args:null==s?void 0:s()}},r=[o("unmute","AccountSettings.Notifications",ot),o("data","DataSettings",gt),o("lock","AccountSettings.PrivacyAndSecurity",ke),o("settings","Telegram.GeneralSettingsViewController",Ve),o("folder","AccountSettings.Filters",it)].map((e=>{const{icon:t,text:i,tabConstructor:s,getInitArgs:n}=e;return new P.ZP({titleLangKey:i,icon:t,clickable:()=>St(this,void 0,void 0,(function*(){const t=e.args?yield e.args:[],i=this.slider.createTab(s);i.open(...t),i instanceof M.h&&n&&i.eventListener.addEventListener("destroyAfter",(t=>{e.args=t.then((()=>n()))}))})),listenerSetter:this.listenerSetter})})),d=rt.getInitArgs();r.push(this.devicesRow=new P.ZP({titleLangKey:"Devices",titleRightSecondary:" ",icon:"activesessions",clickable:()=>St(this,void 0,void 0,(function*(){this.authorizations||(yield this.updateActiveSessions());const e=this.slider.createTab(ge);e.authorizations=this.authorizations,e.eventListener.addEventListener("destroy",(()=>{this.authorizations=void 0,this.updateActiveSessions(!0)}),{once:!0}),e.open()})),listenerSetter:this.listenerSetter}),this.languageRow=new P.ZP({titleLangKey:"AccountSettings.Language",titleRightSecondary:(0,f.ag)("LanguageName"),icon:"language",clickable:()=>{this.slider.createTab(rt).open(d)},listenerSetter:this.listenerSetter})),a.append(...r.map((e=>e.container)));const l=new b.Z;l.content.append(a),this.scrollable.append(this.profile.element,l.container);const c=()=>{h=Ke.Z.getInitArgs()};let h;(0,v.fc)(this.buttons.edit,(()=>{this.slider.createTab(Ke.Z).open(h)}),{listenerSetter:this.listenerSetter}),c(),this.listenerSetter.add(n.Z)("user_update",(e=>{n.Z.myId.toUserId()===e&&c()})),We.Z.loadLottieWorkers(),this.updateActiveSessions(),(yield t)()}))}getAuthorizations(e){if(this.getAuthorizationsPromise&&!e)return this.getAuthorizationsPromise;const t=this.getAuthorizationsPromise=this.managers.apiManager.invokeApi("account.getAuthorizations").finally((()=>{this.getAuthorizationsPromise===t&&(this.getAuthorizationsPromise=void 0)}));return t}updateActiveSessions(e){return this.getAuthorizations(e).then((e=>{this.authorizations=e.authorizations,this.devicesRow.titleRight.textContent=""+this.authorizations.length}))}onCloseAfterTimeout(){return this.profile.destroy(),super.onCloseAfterTimeout()}}class Lt extends l._{constructor(){super(...arguments),this.uploadAvatar=null}init(){this.container.classList.add("new-channel-container"),this.setTitle("NewChannel"),this.avatarEdit=new p.Z((e=>{this.uploadAvatar=e}));const e=new b.Z({caption:"Channel.DescriptionHolderDescrpiton"}),t=document.createElement("div");t.classList.add("input-wrapper"),this.channelNameInputField=new u.ZP({label:"EnterChannelName",maxLength:128}),this.channelDescriptionInputField=new u.ZP({label:"DescriptionOptionalPlaceholder",maxLength:255}),t.append(this.channelNameInputField.container,this.channelDescriptionInputField.container);const i=()=>{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",i),this.channelDescriptionInputField.input.addEventListener("input",i),this.nextBtn=(0,m.Z)({icon:"arrow_next"}),(0,v.fc)(this.nextBtn,(()=>{const e=this.channelNameInputField.value,t=this.channelDescriptionInputField.value;this.nextBtn.disabled=!0,this.managers.appChatsManager.createChannel({title:e,about:t,broadcast:!0}).then((e=>{this.uploadAvatar&&this.uploadAvatar().then((t=>{this.managers.appChatsManager.editPhoto(e,t)})),s.ZP.setInnerPeer({peerId:e.toPeerId(!0)}),Wt.removeTabFromHistory(this),this.slider.createTab(_.Z).open({type:"channel",skippable:!0,title:"GroupAddMembers",placeholder:"SendMessageTo",takeOut:t=>this.managers.appChatsManager.inviteToChannel(e,t)})}))}),{listenerSetter:this.listenerSetter}),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 Et=i(241),It=i(2621),Mt=i(709),Pt=i(6272);class Zt extends wt.Z{constructor(){super("popup-create-contact popup-send-photo popup-new-media",{closable:!0,withConfirm:"Add",title:"AddContactTitle"}),this.construct()}construct(){return e=this,t=void 0,s=function*(){(0,v.fc)(this.btnConfirm,(()=>{const e=this.managers.appUsersManager.importContact(i.value,s.value,n.value);e.then((()=>{this.hide()}),(e=>{"NO_USER"===e.type&&((0,ee.bC)({langPackKey:"Contacts.PhoneNumber.NotRegistred"}),d.disabled=!1)})),d.lockWithPromise(e)}),{listenerSetter:this.listenerSetter});const e=[],t=document.createElement("div");t.classList.add("name-fields");const i=new u.ZP({label:"FirstName",name:"create-contact-name",maxLength:70,required:!0}),s=new u.ZP({label:"LastName",name:"create-contact-lastname",maxLength:70}),n=new Mt.Z({required:!0});e.push(i,s,n);const a=()=>{const e=i.value+" "+s.value;d.avatarElem.peerTitle=e,d.avatarElem.update()};this.listenerSetter.add(i.input)("input",a),this.listenerSetter.add(s.input)("input",a),n.validate=()=>!!n.value.match(/\d/);const o=yield this.managers.appUsersManager.getSelf(),r=(0,Pt.u)(o.phone);r.code&&(n.value="+"+r.code.country_code);const d=new It.Z({inputFields:e,listenerSetter:this.listenerSetter,doNotEditAvatar:!0,nextBtn:this.btnConfirm,avatarSize:100});t.append(i.container,s.container,d.avatarElem),this.container.append(t,n.container),this.show()},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var Tt=i(2894),kt=i(3624);class xt extends l._{init(){this.container.id="contacts-container";const e=(0,m.Z)({icon:"add",className:"is-visible"});this.content.append(e),(0,v.fc)(e,(()=>{wt.Z.createPopup(Zt)}),{listenerSetter:this.listenerSetter}),this.inputSearch=new d.Z("Search",(e=>{this.openContacts(e)})),this.listenerSetter.add(n.Z)("contacts_update",(e=>{return t=this,i=void 0,n=function*(){const t=yield this.managers.appUsersManager.isContact(e),i=e.toPeerId();t?this.sortedUserList.add(i):this.sortedUserList.delete(i)},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n})),this.title.replaceWith(this.inputSearch.container),this.middleware=(0,kt.k)(),this.openContacts()}createList(){const e=new Tt.Z({managers:this.managers}),t=e.list;return t.id="contacts",t.classList.add("contacts-container"),h.default.setListClickListener(t,(()=>{this.close()}),void 0,!0),e}onClose(){this.middleware.clean()}onOpenAfterTimeout(){!z.IS_MOBILE&&j(!0)&&this.inputSearch.input.focus()}openContacts(e){this.middleware.clean();const t=this.middleware.get();this.scrollable.onScrolledBottom=null,this.scrollable.container.textContent="",this.managers.appUsersManager.getContactsPeerIds(e,void 0,"online").then((e=>{if(!t())return;const i=this.sortedUserList=this.createList();let s=()=>{const t=Et.Z.height/56*1.25|0;e.splice(0,t).forEach((e=>{i.add(e)})),e.length||(s=void 0,this.scrollable.onScrolledBottom=null)};s(),this.scrollable.onScrolledBottom=()=>{s?s():this.scrollable.onScrolledBottom=null},(0,Z.Z)(this.scrollable.container,i.list)}))}}class At extends l._{init(){if(this.wasFilterId=h.default.filterId,this.container.id="chats-archived-container",this.setTitle("ArchivedChats"),this.header.classList.add("can-have-forum"),this.content.classList.add("can-have-forum"),!h.default.xds[At.filterId]){const{ul:e,scrollable:t}=h.default.l({title:void 0,id:At.filterId,localId:Ye.Zi});t.container.append(e)}const e=h.default.xds[At.filterId].scrollable;return this.scrollable.container.replaceWith(e.container),e.attachBorderListeners(this.container),h.default.setFilterIdAndChangeTab(At.filterId).then((({cached:e,renderPromise:t})=>{if(e)return t}))}onOpenAfterTimeout(){h.default.xds[this.wasFilterId].clear()}onClose(){this.scrollable.onAdditionalScroll=void 0,h.default.setFilterIdAndChangeTab(this.wasFilterId)}onCloseAfterTimeout(){return h.default.xds[At.filterId].clear(),super.onCloseAfterTimeout()}}At.filterId=Ye.Zi;class _t extends l._{constructor(){super(...arguments),this.isLocationWatched=!1}parseDistance(e){return"miles"===n.Z.settings.distanceUnit?e>1609.34?(0,f.ag)("MilesAway",[Math.round(e/1609)]):(0,f.ag)("FootsAway",[Math.round(3.281*e)]):e>=1e3?(0,f.ag)("KMetersAway2",[e/1e3]):(0,f.ag)("MetersAway2",[e])}startWatching(){this.latestLocationSaved&&!this.isLocationWatched&&(this.isLocationWatched=!0,(0,ee.Am)("Your position is now being shared. Do not close the page or it will be suspended."),this.managers.appUsersManager.getLocated(this.latestLocationSaved.latitude,this.latestLocationSaved.longitude,this.latestLocationSaved.accuracy,!0,2147483647),navigator.geolocation.watchPosition((e=>{const t=e.coords.longitude!==this.latestLocationSaved.longitude,i=e.coords.latitude!==this.latestLocationSaved.latitude,s=this.calculateDistance(e.coords.latitude,e.coords.longitude,this.latestLocationSaved.latitude,this.latestLocationSaved.longitude)>100;(i||t)&&s&&(this.managers.appUsersManager.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,(0,ee.Am)("The sharing of your position has been stopped. You will no longer be visible to other users."),this.managers.appUsersManager.getLocated(0,0,0,!1,0))}calculateDistance(e,t,i,s){const n=.017453292519943295;return 12742*Math.asin(Math.sqrt(.5-Math.cos((i-e)*n)+Math.cos(e*n)*Math.cos(i*n)*(1-Math.cos((s-t)*n)/2)))}}var Ft=i(5824),Dt=i(8842),Rt=i(4159),Bt=i(7487),Nt=i(1405),Ot=i(2559),Ut=i(4755),Ht=i(3035),zt=i(6472),jt=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Gt="is-left-column-shown";class Vt extends l.Z{constructor(){super({sidebarEl:document.getElementById("column-left"),navigationType:"left"}),this.searchGroups={}}construct(e){this.managers=e,this.inputSearch=new d.Z("Search");const t=this.sidebarEl.querySelector(".item-main .sidebar-header");t.append(this.inputSearch.container);const i=()=>{this.createTab(xt).open()};this.backBtn=this.sidebarEl.querySelector(".sidebar-back-button");const a={icon:"archive",text:"ArchivedChats",onClick:()=>{this.createTab(At).open()},verify:()=>jt(this,void 0,void 0,(function*(){return!!(yield this.managers.dialogsStorage.getFolderDialogs(Ye.Zi,!1)).length||!(yield this.managers.dialogsStorage.isDialogsLoaded(Ye.Zi))}))},o=new Ce.Z({toggle:!0,checked:"night"===ze.Z.getTheme().name});o.input.addEventListener("change",(()=>jt(this,void 0,void 0,(function*(){ze.Z.switchTheme(o.input.checked?"night":"day")})))),n.Z.addEventListener("theme_change",(()=>{o.setValueSilently("night"===ze.Z.getTheme().name)}));const r=[{icon:"savedmessages",text:"SavedMessages",onClick:()=>{setTimeout((()=>{s.ZP.setPeer({peerId:s.ZP.myId})}),0)}},a,{icon:"user",text:"Contacts",onClick:i},Be.Z?{icon:"group",text:"PeopleNearby",onClick:()=>{this.createTab(_t).open()}}:void 0,{icon:"settings",text:"Settings",onClick:()=>{this.createTab(Ct).open()}},{icon:"darkmode",text:"DarkMode",onClick:()=>{},checkboxField:o},{icon:"animations",text:"Animations",onClick:()=>{},checkboxField:new Ce.Z({toggle:!0,checked:!0,stateKey:"settings.animationsEnabled"})},{icon:"help",text:"TelegramFeatures",onClick:()=>{const e=f.ZP.format("TelegramFeaturesUrl",!0);s.ZP.openUrl(e)}},{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([Bt.Z.set({kz_version:"Z"}),Bt.Z.delete("tgme_sync")]).then((()=>{location.href="https://web.telegram.org/z/"}))},verify:()=>Rt.Z.isMainDomain},{icon:"char w",text:"ChatList.Menu.SwitchTo.Webogram",onClick:()=>{Bt.Z.delete("tgme_sync").then((()=>{location.href="https://web.telegram.org/?legacy=1"}))},verify:()=>Rt.Z.isMainDomain},{icon:"download",text:"PWA.Install",onClick:()=>{const e=(0,zt.B)();null==e||e()},verify:()=>!!(0,zt.B)()}].filter(Boolean);this.toolsBtn=(0,E.Z)({direction:"bottom-right",buttons:r,onOpen:(e,t)=>{var i;const s=document.createElement("a");s.href="https://github.com/morethanwords/tweb/blob/master/CHANGELOG.md",s.target="_blank",s.rel="noopener noreferrer",s.classList.add("btn-menu-footer"),s.addEventListener(v.pf,(e=>{e.stopPropagation(),me.Z.close()}));const n=document.createElement("span");n.classList.add("btn-menu-footer-text"),n.innerHTML="Telegram Web"+Rt.Z.suffix+" "+Rt.Z.versionFull,s.append(n),t.classList.add("has-footer"),t.append(s),null===(i=a.element)||void 0===i||i.append(this.archivedCount)}}),this.toolsBtn.classList.remove("tgico-more"),this.toolsBtn.classList.add("sidebar-tools-button","is-visible"),this.backBtn.parentElement.insertBefore(this.toolsBtn,this.backBtn),this.newBtnMenu=(0,E.Z)({direction:"top-left",buttons:[{icon:"newchannel",text:"NewChannel",onClick:()=>{this.createTab(Lt).open()}},{icon:"newgroup",text:"NewGroup",onClick:()=>{this.createTab(_.Z).open({type:"chat",skippable:!1,takeOut:e=>this.createTab(y).open(e),title:"GroupAddMembers",placeholder:"SendMessageTo"})}},{icon:"newprivate",text:"NewPrivateChat",onClick:i}]}),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",t.nextElementSibling.append(this.newBtnMenu),this.updateBtn=document.createElement("div"),this.updateBtn.className="btn-circle rp btn-corner z-depth-1 btn-update is-hidden",(0,Nt.Z)(this.updateBtn),this.updateBtn.append((0,f.ag)("Update")),(0,v.fc)(this.updateBtn,(()=>{this.updateBtn.classList.contains("is-hidden")||location.reload()})),t.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",n.Z.addEventListener("folder_unread",(e=>{if(e.id===Ye.Zi){const t=e.unreadPeerIds.size;this.archivedCount.textContent=""+(0,Ot.Z)(t,1),this.archivedCount.classList.toggle("hide",!t)}})),this.managers.appUsersManager.getTopPeers("correspondents");const l={type:"global-search-focus",onPop:()=>(setTimeout((()=>{this.inputSearch.input.focus()}),0),!1),noHistory:!0};Ft.Z.pushItem(l),nt.Z.getState().then((()=>{const e=setInterval((()=>{fetch("version",{cache:"no-cache"}).then((e=>200===e.status&&e.ok&&e.text()||Promise.reject())).then((t=>{t!==Rt.Z.versionFull&&(this.hasUpdate=!0,clearInterval(e),this.newBtnMenu.classList.contains("is-hidden")||this.updateBtn.classList.remove("is-hidden"))})).catch(Ie.Z)}),18e5)}));const c=()=>{const e=this.rect=this.tabsContainer.getBoundingClientRect();document.documentElement.style.setProperty("--left-column-width",e.width+"px")};(0,Ht.T2)(c),Ut.Z.addEventListener("resize",c)}initSearch(){const e=this.sidebarEl.querySelector("#search-container"),t=new r.ZP(e),i=()=>{(0,v.tH)(this.backBtn)};this.searchGroups={contacts:new a.z("SearchAllChatsShort","contacts",void 0,void 0,void 0,void 0,i),globalContacts:new a.z("GlobalSearch","contacts",void 0,void 0,void 0,void 0,i),messages:new a.z("SearchMessages","messages"),people:new a.z(!1,"contacts",!0,"search-group-people",!0,!1,i,!0),recent:new a.z("Recent","contacts",!0,"search-group-recent",!0,!0,i)};const s=this.searchSuper=new S.Z({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,managers:this.managers});e.prepend(s.nav.parentElement.parentElement),t.container.append(s.container),s.setQuery({peerId:"".toPeerId(),folderId:0}),s.selectTab(0),s.load(!0);const n=[];let d="".toPeerId(),l=0,u=0;const p=()=>{this.inputSearch.container.classList.toggle("is-picked-twice",2===n.length),this.inputSearch.container.classList.toggle("is-picked",!!n.length),n.length?this.inputSearch.input.style.setProperty("--paddingLeft",n[n.length-1].getBoundingClientRect().right-this.inputSearch.input.getBoundingClientRect().left+"px"):this.inputSearch.input.style.removeProperty("--paddingLeft")},f=document.createElement("div");f.classList.add("search-helper"),f.addEventListener("click",(e=>{const t=(0,he.Z)(e.target,"selector-user");if(!t)return;const i=t.dataset.key;if(0===i.indexOf("date_")){const[e,t,s]=i.split("_");l=+t,u=+s}else d=i.toPeerId();t.addEventListener("click",(()=>{g(t)})),this.inputSearch.container.append(t),this.inputSearch.onChange(this.inputSearch.value=""),n.push(t),p()})),s.nav.parentElement.append(f);const m=(e,t)=>{const i=document.createElement("div");i.classList.add("selector-user");const s=new o.Z;return s.classList.add("selector-user-avatar","tgico","avatar-32"),s.isDialog=!0,i.dataset.key=""+e,e.isPeerId()?(void 0===t&&(t=new Dt.Z({peerId:e.toPeerId()}).element),s.updateWithOptions({peerId:e})):s.classList.add("tgico-calendarfilter"),t&&("string"==typeof t?i.innerHTML=t:((0,Z.Z)(i,t),i.append(t))),i.insertAdjacentElement("afterbegin",s),i},g=e=>{0===e.dataset.key.indexOf("date_")?l=u=0:d="".toPeerId(),e.remove(),(0,Je.Z)(n,e),setTimeout((()=>{p(),this.inputSearch.onChange(this.inputSearch.value)}),0)};this.inputSearch.onClear=()=>{n.forEach((e=>{g(e)}))},this.inputSearch.onChange=e=>{if(s.cleanupHTML(),s.setQuery({peerId:d,folderId:d?void 0:0,query:e,minDate:l,maxDate:u}),s.load(!0),f.innerHTML="",s.nav.classList.remove("hide"),!d&&e.trim()){const t=s.middleware.get();Promise.all([this.managers.dialogsStorage.getDialogs({query:e}).then((({dialogs:e})=>e.map((e=>e.peerId)))),this.managers.appUsersManager.getContactsPeerIds(e,!0)]).then((e=>{t()&&(new Set(e[0].concat(e[1])).forEach((e=>{f.append(m(e))})),s.nav.classList.toggle("hide",!!f.innerHTML))}))}if(!l&&e.trim()){const t=[];(0,C.fl)(e,t),t.forEach((e=>{f.append(m("date_"+e.minDate+"_"+e.maxDate,e.title))})),s.nav.classList.toggle("hide",!!f.innerHTML)}},s.tabs.inputMessagesFilterEmpty.addEventListener("mousedown",(e=>{const t=(0,be.Z)(e.target,h.DIALOG_LIST_ELEMENT_TAG);if(!t)return;const i=(0,he.Z)(t,"search-group");if(!i||i.classList.contains("search-group-recent")||i.classList.contains("search-group-people"))return;const s=t.getAttribute("data-peer-id").toPeerId();this.managers.appUsersManager.pushRecentSearch(s)}),{capture:!0});const b=document.createElement("div");b.classList.add("search-group-scrollable"),b.append(this.searchGroups.people.list),this.searchGroups.people.container.append(b),new r.v7(b);let y,w=!0;const L=(0,c.Z)({content:e.parentElement,type:"zoom-fade",transitionTime:150,onTransitionEnd:e=>{y&&clearTimeout(y),0!==e||w||(s.selectTab(0,!1),this.inputSearch.onClearClick(),y=window.setTimeout((()=>{y=0,this.newBtnMenu.classList.remove("is-hidden"),this.hasUpdate&&this.updateBtn.classList.remove("is-hidden")}),150)),w=!1}});L(0);const E="is-visible",I=()=>{this.toolsBtn.classList.remove(E),this.backBtn.classList.add(E),this.newBtnMenu.classList.add("is-hidden"),this.updateBtn.classList.add("is-hidden"),this.toolsBtn.parentElement.firstElementChild.classList.toggle("state-back",!0);const e="global-search";z.IS_MOBILE_SAFARI||Ft.Z.findItemByType(e)||Ft.Z.pushItem({onPop:()=>{i()},type:e}),L(1)};this.inputSearch.input.addEventListener("focus",I),I(),(0,v.fc)(this.backBtn,(e=>{this.toolsBtn.classList.add(E),this.backBtn.classList.remove(E),this.toolsBtn.parentElement.firstElementChild.classList.toggle("state-back",!1),Ft.Z.removeByType("global-search"),L(0)}));const M=(0,vt.Z)("close");this.searchGroups.recent.nameEl.append(M),M.addEventListener("click",(()=>{(0,Ee.Z)({descriptionLangKey:"Search.Confirm.ClearHistory",button:{langKey:"ClearButton",isDanger:!0}}).then((()=>this.managers.appUsersManager.clearRecentSearch().then((()=>{this.searchGroups.recent.clear()}))))}))}}const Kt=new Vt;L.GO.appSidebarLeft=Kt;const Wt=Kt},5670:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(3552),n=i(5644),a=i(279),o=i(8119);class r extends s._{init(e){this.container.classList.add("add-members-container"),this.nextBtn=(0,o.Z)({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())),t=this.takeOut(e);this.skippable?this.close():t instanceof Promise?this.attachToPromise(t):void 0===t&&this.close()})),this.setTitle(e.title),this.peerType=e.type,this.takeOut=e.takeOut,this.skippable=e.skippable;const t="privacy"===this.peerType;this.selector=new n.Z({appendTo:this.content,onChange:this.skippable?null:e=>{this.nextBtn.classList.toggle("is-visible",!!e)},peerType:[t?"dialogs":"contacts"],placeholder:e.placeholder,exceptSelf:t,filterPeerTypeBy:t?["isAnyGroup","isUser"]:void 0,managers:this.managers,design:"square"}),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)}attachToPromise(e){const t=(0,a.p)(this.nextBtn,"arrow_next");e.then((()=>{this.close()}),(()=>{t()}))}}},9439:(e,t,i)=>{"use strict";i.d(t,{Z:()=>B});var s=i(6740);function n(e){const t=e.getContext("2d"),i=new Array(4).fill(0),s=t.getImageData(0,0,e.width,e.height).data,n=s.length/4;for(let e=0;e0&&(i=Math.min(100,i+5+.1*(100-i))),s=Math.max(0,.65*s),`hsla(${t}, ${i}%, ${s}%, .4)`}var h=i(8479),u=i(9674),p=i(1571),f=i(2312),m=i(9322),g=i(3512),v=i(4494),b=i(9807),y=i(3442),w=i(3552),S=i(6724),C=i(6714),L=i(5077),E=i(3228),I=i(503);class M{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(M.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 I.ZP({plainText:!0,label:"Appearance.Color.Hex"}),this.rgbInputField=new I.ZP({plainText:!0,label:"Appearance.Color.RGB"});const t=document.createElement("div");t.className=M.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]+)/),i=t&&t[0].length===e.length&&[6].includes(e.length);this.hexInputField.setState(i?I.I1.Neutral:I.I1.Error),e="#"+e,this.hexInputField.setValueSilently(e),i&&this.setColor(e,!1,!0)}));const i=/^(?: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(i);this.rgbInputField.setState(e?I.I1.Neutral:I.I1.Error),e&&this.setColor((0,l.dI)(+e[1],+e[2],+e[3]),!0,!1)})),this.attachBoxListeners(),this.attachHueListeners()}attachBoxListeners(){(0,L.Z)(this.elements.box,(()=>{this.onGrabStart(),this.boxRect=this.elements.box.getBoundingClientRect()}),(e=>{this.saturationHandler(e.x,e.y)}),(()=>{this.onGrabEnd()}))}attachHueListeners(){(0,L.Z)(this.elements.hue,(()=>{this.onGrabStart(),this.hueRect=this.elements.hue.getBoundingClientRect()}),(e=>{this.hueHandler(e.x)}),(()=>{this.onGrabEnd()}))}setColor(e,t=!0,i=!0){if(void 0===e)e={h:0,s:100,l:50,a:1};else if("string"==typeof e)if("#"===e[0])e=(0,l.cw)(e);else{const t=e.match(/[.?\d]+/g);e=(0,l.dI)(+t[0],+t[1],+t[2],void 0===t[3]?1:+t[3])}this.boxRect=this.elements.box.getBoundingClientRect();const s=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+s,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,i)}getCurrentColor(){const e=(0,l.Y6)(this.hue,this.saturation,this.lightness,this.alpha),t=(0,l.t1)(e),i=t.slice(0,-2);return{hsl:`hsl(${this.hue}, ${this.saturation}%, ${this.lightness}%)`,rgb:`rgb(${e[0]}, ${e[1]}, ${e[2]})`,hex:i,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 i=this.getCurrentColor();this.elements.boxDragger.setAttributeNS(null,"fill",i.hex),e&&(this.hexInputField.setValueSilently(i.hex),this.hexInputField.setState(I.I1.Neutral)),t&&(this.rgbInputField.setValueSilently(i.rgbaArray.slice(0,-1).join(", ")),this.rgbInputField.setState(I.I1.Neutral)),this.onChange&&this.onChange(i)}hueHandler(e,t=!0){const i=(0,E.Z)(e-this.hueRect.left,0,this.hueRect.width)/this.hueRect.width;this.hue=Math.round(360*i);const s=`hsla(${this.hue}, 100%, 50%, ${this.alpha})`;this.elements.hueDragger.setAttributeNS(null,"x",100*i+"%"),this.elements.hueDragger.setAttributeNS(null,"fill",s),this.elements.saturation.lastElementChild.setAttributeNS(null,"stop-color",s),t&&this.updatePicker()}saturationHandler(e,t,i=!0){const s=this.boxRect.width,n=this.boxRect.height,a=(0,E.Z)(e-this.boxRect.left,0,s)/s*100,o=(0,E.Z)(t-this.boxRect.top,0,n)/n*100,r=this.elements.boxDragger;r.setAttributeNS(null,"x",a+"%"),r.setAttributeNS(null,"y",o+"%");const d=(0,E.Z)(a,0,100),l=100-d/2,c=100-(0,E.Z)(o,0,100),h=(0,E.Z)(c/100*l,0,100);this.saturation=d,this.lightness=h,i&&this.updatePicker()}}M.BASE_CLASS="color-picker";var P=i(5029);class Z extends w._{constructor(){super(...arguments),this._applyColor=(e,t=!0)=>{if(t)this.colorPicker.setColor(e);else{const t=(0,l.Pi)(e),i=this.theme.settings,s=c(t),n={_:"wallPaperNoFile",id:0,pFlags:{},settings:{_:"wallPaperSettings",background_color:parseInt(e.slice(1),16),pFlags:{}}};i.wallpaper=n,i.highlightningColor=s,this.managers.appStateManager.pushToState("settings",g.Z.settings),m.ZP.applyCurrentTheme(void 0,void 0,!0),this.setActive()}},this.onColorChange=e=>{this.applyColor(e.hex,!1)}}init(){this.container.classList.add("background-container","background-color-container"),this.setTitle("SetColor"),this.theme=C.Z.getTheme();const e=new P.Z({});this.colorPicker=new M,e.content.append(this.colorPicker.container),this.scrollable.append(e.container);const t=new P.Z({}),i=this.grid=document.createElement("div");i.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 s=document.createElement("div");s.classList.add("grid-item-media"),s.style.backgroundColor=e,t.append(s),i.append(t)})),(0,r.fc)(i,(e=>{const t=(0,d.Z)(e.target,"grid-item");if(!t||t.classList.contains("active"))return;const i=t.dataset.color;i&&this.applyColor(i)}),{listenerSetter:this.listenerSetter}),t.content.append(i),this.scrollable.append(t.container),this.applyColor=(0,S.Z)(this._applyColor,16,!0)}setActive(){const e=this.grid.querySelector(".active"),t=this.theme.settings.wallpaper.settings.background_color,i=t?this.grid.querySelector(`.grid-item[data-color="${t}"]`):null;e!==i&&(e&&e.classList.remove("active"),i&&i.classList.add("active"))}onOpen(){setTimeout((()=>{var e,t;const i=this.theme.settings,s=null===(t=null===(e=null==i?void 0:i.wallpaper)||void 0===e?void 0:e.settings)||void 0===t?void 0:t.background_color,n=!!s&&"wallPaperNoFile"===i.wallpaper._;n&&(this.colorPicker.onChange=this.onColorChange),this.colorPicker.setColor(s&&"#"+s.toString(16)||"#cccccc"),n||(this.colorPicker.onChange=this.onColorChange)}),0)}onCloseAfterTimeout(){return this.colorPicker.onChange=void 0,this.colorPicker=void 0,super.onCloseAfterTimeout()}}var T,k=i(7030),x=i(236),A=i(7814),_=i(9405),F=i(9492),D=i(7479),R=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class B extends w._{constructor(){super(...arguments),this.clicked=new Set,this.wallPapersByElement=new Map,this.elementsByKey=new Map,this.onUploadClick=()=>{(function(e){const t=document.createElement("input");t.type="file",t.style.display="none",e&&(t.accept=e),document.body.append(t);const i=new Promise(((e,i)=>{t.addEventListener("change",(t=>{const s=t.target.files[0];s?e(s):i("NO_FILE_SELECTED")}),{once:!0})})).finally((()=>{t.remove()}));return t.click(),i})("image/x-png,image/png,image/jpeg").then((e=>R(this,void 0,void 0,(function*(){if(e.name.endsWith(".png")){const t=document.createElement("img"),i=URL.createObjectURL(e);yield(0,s.cj)(t,i,!1);const n="image/jpeg",{blob:a}=yield(0,A.Z)({media:t,size:new _.c(t.naturalWidth,t.naturalHeight),mimeType:n});e=new File([a],e.name.replace(/\.png$/,".jpg"),{type:n})}const t=yield this.managers.appDocsManager.prepareWallPaperUpload(e),i=this.managers.appDocsManager.uploadWallPaper(t.id),n=f.Z.getNewDeferredForUpload(e.name,i),a=(0,o.Z)();a.addNotifyListener=n.addNotifyListener,a.cancel=n.cancel,n.then((e=>{this.clicked.delete(r),this.elementsByKey.delete(r),this.wallPapersByElement.set(l,e);const t=this.getWallPaperKey(e);this.elementsByKey.set(t,l),B.setBackgroundDocument(e).then(a.resolve,a.reject)}),a.reject);const r=this.getWallPaperKey(t);a.catch((()=>{l.remove()}));const d=new y.Z({isUpload:!0,cancelable:!0,tryAgainOnFail:!1}),{container:l}=yield this.addWallPaper(t,!1);this.clicked.add(r),d.attach(l,!1,a)}))))},this.onResetClick=()=>{var e,t,i,s;const n=x.h.settings.themes.find((e=>e.name===this.theme.name));n&&(++B.tempId,this.theme.settings=(0,h.Z)(n.settings),this.managers.appStateManager.pushToState("settings",g.Z.settings),m.ZP.applyCurrentTheme(void 0,void 0,!0),this.blurCheckboxField.setValueSilently(null===(s=null===(i=null===(t=null===(e=this.theme.settings)||void 0===e?void 0:e.wallpaper)||void 0===t?void 0:t.settings)||void 0===i?void 0:i.pFlags)||void 0===s?void 0:s.blur))},this.onGridClick=e=>{const t=(0,d.Z)(e.target,"grid-item");if(!t)return;const i=this.wallPapersByElement.get(t);if("wallPaperNoFile"===i._)return void B.setBackgroundDocument(i);const s=this.getWallPaperKey(i);if(this.clicked.has(s))return;this.clicked.add(s);const n=i.document,a=new y.Z({cancelable:!0,tryAgainOnFail:!1}),o=()=>R(this,void 0,void 0,(function*(){var e,s,o,r;const d=B.setBackgroundDocument(i);(yield this.managers.thumbsStorage.getCacheContext(n)).url&&!(null===(r=null===(o=null===(s=null===(e=this.theme.settings)||void 0===e?void 0:e.wallpaper)||void 0===s?void 0:s.settings)||void 0===o?void 0:o.pFlags)||void 0===r?void 0:r.blur)||a.attach(t,!0,d)}));a.construct(),(0,r.fc)(t,(e=>{a.preloader.parentElement?(a.onClick(e),a.detach()):o()}),{listenerSetter:this.listenerSetter}),o()},this.setActive=()=>{const e=this.grid.querySelector(".active"),t=this.elementsByKey.get(this.getWallPaperKeyFromTheme(this.theme));e!==t&&(e&&e.classList.remove("active"),t&&t.classList.add("active"))}}static getInitArgs(){return{backgrounds:g.Z.managers.appThemesManager.getWallPapers()}}get theme(){return C.Z.getTheme()}init(e=B.getInitArgs()){var t,i,s;this.container.classList.add("background-container","background-image-container"),this.setTitle("ChatBackground");{const e=(0,P.R)(this.scrollable),n=(0,v.Z)("btn-primary btn-transparent",{icon:"cameraadd",text:"ChatBackground.UploadWallpaper"}),a=(0,v.Z)("btn-primary btn-transparent",{icon:"colorize",text:"SetColor"}),d=(0,v.Z)("btn-primary btn-transparent",{icon:"favourites",text:"Appearance.Reset"});(0,r.fc)(n,this.onUploadClick,{listenerSetter:this.listenerSetter}),(0,r.fc)(a,(()=>{this.slider.createTab(Z).open()}),{listenerSetter:this.listenerSetter}),(0,r.fc)(d,this.onResetClick,{listenerSetter:this.listenerSetter});const l=null===(t=this.theme.settings)||void 0===t?void 0:t.wallpaper,c=this.blurCheckboxField=new b.Z({text:"ChatBackground.Blur",name:"blur",checked:null===(s=null===(i=null==l?void 0:l.settings)||void 0===i?void 0:i.pFlags)||void 0===s?void 0:s.blur});this.listenerSetter.add(c.input)("change",(()=>R(this,void 0,void 0,(function*(){this.theme.settings.wallpaper.settings.pFlags.blur=c.input.checked||void 0,yield this.managers.appStateManager.pushToState("settings",g.Z.settings),setTimeout((()=>{const e=o.querySelector(".active");if(!e)return;const t=this.wallPapersByElement.get(e);t.pFlags.pattern||"wallPaperNoFile"===t._||B.setBackgroundDocument(t)}),100)})))),e.append(n,a,d,(0,D.tG)(c).container)}g.Z.addEventListener("background_change",this.setActive);const n=e.backgrounds.then((e=>{const t=e.map((e=>this.addWallPaper(e)));return Promise.all(t)})),a=(0,P.R)(this.scrollable),o=this.grid=document.createElement("div");return o.classList.add("grid"),(0,r.fc)(o,this.onGridClick,{listenerSetter:this.listenerSetter}),a.append(o),n}getWallPaperKey(e){return""+e.id}getWallPaperKeyFromTheme(e){var t;return""+(this.getWallPaperKey(null===(t=e.settings)||void 0===t?void 0:t.wallpaper)||"")}static addWallPaper(e,t=document.createElement("div")){var i;const s=(0,l.EM)(e),n="wallPaper"===e._;if(n&&e.pFlags.pattern&&!s)return;const a=!!e.pFlags.dark;let o=n?e.document:void 0;n&&!o&&(o={_:"webDocumentNoProxy",attributes:[],size:1e5,url:"assets/img/pattern.svg",w:1440,h:2960,mime_type:"image/svg+xml"}),t.classList.add("background-item"),t.dataset.id=""+e.id;const r=document.createElement("div");r.classList.add("background-item-media");const d=[];let c,h;if(n){h=(0,k.Z)(o,200,200),c=(0,F.Z)({photo:o,message:null,container:r,withoutPreloader:!0,size:h,noFadeIn:e.pFlags.pattern}),e.pFlags.pattern&&r.classList.add("is-pattern");const i=c.then((({loadPromises:e,images:t})=>R(this,void 0,void 0,(function*(){return(yield e.thumb)||e.full,t})))).then((i=>{var s;return e.pFlags.pattern&&(a?(i.full.style.display="none",i.thumb&&(i.thumb.style.display="none")):(null===(s=e.settings)||void 0===s?void 0:s.intensity)&&(i.full.style.opacity=""+Math.abs(e.settings.intensity)/100)),u.Z.mutate((()=>{t.append(r)}))}));d.push(i)}else t.append(r);if(null===(i=e.settings)||void 0===i?void 0:i.background_color){const{canvas:t}=p.Z.create(s);if(t.classList.add("background-colors-canvas"),a&&n){const i=c.then((({loadPromises:i})=>i.full.then((()=>R(this,void 0,void 0,(function*(){const i=yield g.Z.managers.thumbsStorage.getCacheContext(o,h.type);t.style.webkitMaskImage=`url(${i.url})`,t.style.opacity=""+(e.pFlags.dark?100+e.settings.intensity:e.settings.intensity)/100,r.append(t)}))))));d.push(i)}else r.append(t)}return{container:t,media:r,loadPromise:Promise.all(d)}}addWallPaper(e,t=!0){const i=B.addWallPaper(e);if(i){const{container:s,media:n}=i;s.classList.add("grid-item"),n.classList.add("grid-item-media");const a=this.getWallPaperKey(e);this.wallPapersByElement.set(s,e),this.elementsByKey.set(a,s),this.getWallPaperKeyFromTheme(this.theme)===a&&s.classList.add("active"),this.grid[t?"append":"prepend"](s)}return i&&i.loadPromise.then((()=>i))}}T=B,B.tempId=0,B.setBackgroundDocument=(e,t)=>{const i=++T.tempId,r=()=>i===T.tempId,d=e.document,h=(0,o.Z)();let u;d?(u=f.Z.downloadMediaURL({media:d,queueId:m.ZP.chat.bubbles?m.ZP.chat.bubbles.lazyLoadQueue.queueId:0}),h.addNotifyListener=u.addNotifyListener,h.cancel=u.cancel):u=Promise.resolve();const v=(e,t)=>{fetch(t).then((t=>{m.ZP.cacheStorage.save("backgrounds/"+e,t)}))};return u.then((()=>R(void 0,void 0,void 0,(function*(){var i,o,u;if(!r())return void h.resolve();const f=!!t;null!=t||(t=C.Z.getTheme().settings);const b=i=>{var a;let o;const d=(0,l.EM)(e);if(i&&!d)o=function(e){const t=document.createElement("img");return(0,s.cj)(t,e,!1).then((()=>function(e,t,i){const s=document.createElement("canvas"),a=t/i;return 1===a?(s.width=50,s.height=s.width/a):a>1?(s.height=50,s.width=s.height/a):s.width=s.height=50,s.getContext("2d").drawImage(e,0,0,t,i,0,0,s.width,s.height),n(s)}(t,t.naturalWidth,t.naturalHeight)))}(i);else{const{canvas:e}=p.Z.create(d);o=Promise.resolve(n(e))}const u=null!==(a=e.slug)&&void 0!==a?a:"";Promise.all([o,u&&v(u,i)]).then((([s])=>{if(!r())return void h.resolve();const n=c(Array.from(s));t.wallpaper=e,t.highlightningColor=n,f||g.Z.managers.appStateManager.pushToState("settings",g.Z.settings),m.ZP.applyCurrentTheme(u,i,!0).then(h.resolve)}))};if(!d)return void b();const y=yield g.Z.managers.thumbsStorage.getCacheContext(d);(null===(u=null===(o=null===(i=t.wallpaper)||void 0===i?void 0:i.settings)||void 0===o?void 0:o.pFlags)||void 0===u?void 0:u.blur)?setTimeout((()=>{const{canvas:e,promise:t}=(0,a.Z)(y.url,12,4);t.then((()=>{r()?b(e.toDataURL()):h.resolve()}))}),200):r()&&b(y.url)})))),h}},534:(e,t,i)=>{"use strict";i.d(t,{Z:()=>T});var s=i(4277),n=i(1447),a=i(3552),o=i(2796),r=i(503),d=i(2230),l=i(5322),c=i(4494),h=i(5644),u=i(9807),p=i(2325),f=i(8479),m=i(7625),g=i(130),v=i(8115),b=i(1507),y=i(3512),w=i(2738),S=i(5029),C=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class L extends a._{constructor(){super(...arguments),this.renderResults=e=>C(this,void 0,void 0,(function*(){yield this.managers.appUsersManager.getContacts(),e.forEach((e=>{const{dom:t}=s.default.addDialogNew({peerId:e,container:this.selector.scrollable,rippleEnabled:!0,avatarSize:"abitbigger"}),i=this.selector.selected.has(e);t.containerEl.append(this.checkbox(i));const n=[];this.dialogsByFilters.forEach(((t,i)=>{if(t.has(e)){const e=document.createElement("span");(0,g.Z)(e,(0,v.Z)(i.title)),n.push(e)}})),(0,p.v_)(n,!1).forEach((e=>{t.lastMessageSpan.append(e)}))}))})),this.onSelectChange=e=>{"included"===this.type&&(this.confirmBtn.style.display=e?"":"none")}}init(e,t,i){this.originalFilter=e,this.filter=(0,f.Z)(this.originalFilter),this.type=t,this.editFolderTab=i,this.content.remove(),this.container.classList.add("included-chatlist-container"),this.confirmBtn=(0,d.Z)("check btn-confirm blue",{noRipple:!0}),this.confirmBtn.style.display="none",this.header.append(this.confirmBtn),(0,w.fc)(this.confirmBtn,(()=>C(this,void 0,void 0,(function*(){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 i of e)i.isPeerId()?t.push(i.toPeerId()):this.filter.pFlags[i]=!0;let i;i="included"===this.type?e=>t.includes(e):e=>!t.includes(e),(0,m.Z)(this.filter.pinnedPeerIds,((e,t)=>{i(e)||(this.filter.pinnedPeerIds.splice(t,1),this.filter.pinned_peers.splice(t,1))}));const s="included"===this.type?"excludePeerIds":"includePeerIds",n="included"===this.type?"exclude_peers":"include_peers";(0,m.Z)(this.filter[s],((e,i)=>{t.includes(e)&&(this.filter[s].splice(i,1),this.filter[n].splice(i,1))})),this.filter["included"===this.type?"includePeerIds":"excludePeerIds"]=t,this.filter["included"===this.type?"include_peers":"exclude_peers"]=yield Promise.all(t.map((e=>this.managers.appPeersManager.getInputPeerById(e)))),this.editFolderTab.setFilter(this.filter,!1),this.close()}))),{listenerSetter:this.listenerSetter});const s=e=>{this.limit=y.Z.premium?e.dialog_filters_chats_limit_premium:e.dialog_filters_chats_limit_default};return this.listenerSetter.add(y.Z)("app_config",s),this.dialogsByFilters=new Map,Promise.all([this.managers.filtersStorage.getDialogFilters().then((e=>C(this,void 0,void 0,(function*(){yield Promise.all(e.filter((e=>!b.DZ.has(e.id))).map((e=>C(this,void 0,void 0,(function*(){const t=(yield this.managers.dialogsStorage.getFolderDialogs(e.id)).map((e=>e.peerId));this.dialogsByFilters.set(e,new Set(t))})))))})))),this.managers.apiManager.getAppConfig().then((e=>{s(e)}))])}checkbox(e){const t=new u.Z({round:!0});return e&&(t.input.checked=e),t.label}onOpen(){this.confirmBtn.style.display="excluded"===this.type?"":"none",this.setTitle("included"===this.type?"FilterAlwaysShow":"FilterNeverShow");const e=this.filter,t=new S.Z({noDelimiter:!0,name:"FilterChatTypes"});let i;t.container.classList.add("folder-categories"),i="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 s=document.createDocumentFragment();for(const e in i){const t=(0,c.Z)("btn-primary btn-transparent folder-category-button",{icon:i[e].ico,text:i[e].text});t.dataset.peerId=e,t.append(this.checkbox()),s.append(t)}t.content.append(s);const n=("included"===this.type?e.includePeerIds:e.excludePeerIds).slice();this.selector=new h.Z({appendTo:this.container,onChange:this.onSelectChange,peerType:["dialogs"],renderResultsFunc:this.renderResults,placeholder:"Search",sectionNameLangPackKey:"FilterChats",managers:this.managers}),this.selector.selected=new Set(n);let a=!1;const r=this.selector.add.bind(this.selector);this.selector.add=(e,t,s)=>{if(this.selector.selected.size>=this.limit&&a&&!i[e]){const t=this.selector.list.querySelector(`[data-peer-id="${e}"] [type="checkbox"]`);t&&setTimeout((()=>{t.checked=!1}),0);const i=p.ZP.format("excluded"===this.type?"ChatList.Filter.Exclude.LimitReached":"ChatList.Filter.Include.LimitReached",!0);return void(0,o.Am)(i)}const n=r(e,i[e]?(0,p.ag)(i[e].text):void 0,s);return i[e]&&n.querySelector("avatar-element").classList.add("tgico-"+i[e].ico),n},this.selector.scrollable.container.append(t.container,this.selector.scrollable.container.lastElementChild),this.selector.addInitial(n),a=!0;for(const s in e.pFlags)i.hasOwnProperty(s)&&e.pFlags[s]&&(0,w.tH)(t.content.querySelector(`[data-peer-id="${s}"]`))}onCloseAfterTimeout(){return this.selector&&(this.selector.container.remove(),this.selector=null),super.onCloseAfterTimeout()}}var E=i(8127),I=i(6848),M=i(3066),P=i(2353),Z=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class T extends a._{constructor(){super(...arguments),this.flags={}}static getInitArgs(){return{animationData:n.Z.loadAnimationFromURLManually("Folders_2")}}init(e=T.getInitArgs()){this.container.classList.add("edit-folder-container"),this.caption=document.createElement("div"),this.caption.classList.add("caption"),this.caption.append((0,p.ag)("FilterIncludeExcludeInfo")),this.stickerContainer=document.createElement("div"),this.stickerContainer.classList.add("sticker-container"),this.confirmBtn=(0,d.Z)("check btn-confirm hide blue");let t=!1;const i={icon:"delete danger",text:"FilterMenuDelete",onClick:()=>{new E.Z("filter-delete",{titleLangKey:"ChatList.Filter.Confirm.Remove.Header",descriptionLangKey:"ChatList.Filter.Confirm.Remove.Text",buttons:[{langKey:"Delete",callback:()=>{t||(t=!0,this.managers.filtersStorage.updateDialogFilter(this.filter,!0).then((e=>{this.close()})).finally((()=>{t=!1})))},isDanger:!0}]}).show()}};this.menuBtn=(0,l.Z)({listenerSetter:this.listenerSetter,direction:"bottom-left",buttons:[i]}),this.menuBtn.classList.add("hide"),this.header.append(this.confirmBtn,this.menuBtn);const s=new S.Z({}),a=document.createElement("div");a.classList.add("input-wrapper"),this.nameInputField=new r.ZP({label:"FilterNameHint",maxLength:12}),a.append(this.nameInputField.container),s.content.append(a);const h=(e,t,i,s)=>{const n=new S.Z({name:t,noDelimiter:!0});n.container.classList.add("folder-list",e);const a=n.generateContentElement();return a.classList.add("folder-categories"),i.forEach((e=>{const t=(0,c.Z)("folder-category-button btn btn-primary btn-transparent",{icon:e.icon,text:e.text,noRipple:!e.withRipple||void 0});e.name&&(s[e.name]=t),a.append(t)})),n};this.includePeerIds=h("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=h("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,s.container,this.includePeerIds.container,this.excludePeerIds.container);const u=this.includePeerIds.container.querySelector(".folder-categories"),f=this.excludePeerIds.container.querySelector(".folder-categories");(0,w.fc)(u.querySelector(".btn"),(()=>{this.slider.createTab(L).open(this.filter,"included",this)}),{listenerSetter:this.listenerSetter}),(0,w.fc)(f.querySelector(".btn"),(()=>{this.slider.createTab(L).open(this.filter,"excluded",this)}),{listenerSetter:this.listenerSetter}),(0,w.fc)(this.confirmBtn,(()=>{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(u.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?this.managers.filtersStorage.updateDialogFilter(this.filter):this.managers.filtersStorage.createDialogFilter(this.filter),e.then((e=>{this.close()})).catch((e=>{"DIALOG_FILTERS_TOO_MUCH"===e.type?(0,o.Am)("Sorry, you can't create more folders."):console.error("updateDialogFilter error:",e)})).finally((()=>{this.confirmBtn.removeAttribute("disabled")}))):(0,o.Am)("Please choose at least one chat for this folder.")}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(this.nameInputField.input)("input",(()=>{this.filter.title=this.nameInputField.value,this.editCheckForChange()}));const m="edit"===this.type?[this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id,"pinned_peers"),this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id,"include_peers"),this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id,"exclude_peers")]:[];return Promise.all([this.loadAnimationPromise=e.animationData.then((e=>Z(this,void 0,void 0,(function*(){const t=yield e({container:this.stickerContainer,loop:!1,autoplay:!1,width:86,height:86});return this.animation=t,n.Z.waitForFirstFrame(t)})))),...m]).then((()=>{"edit"===this.type?(this.setFilter(this.originalFilter,!0),this.onEditOpen()):(this.setInitFilter(),this.onCreateOpen())}))}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");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=(0,M.Z)(e.title);for(const t in this.flags)this.flags[t].style.display=e.pFlags[t]?"":"none";["includePeerIds","excludePeerIds"].forEach((t=>Z(this,void 0,void 0,(function*(){const i=this[t],n=s.default.createChatList({ignoreClick:!0});let a=e[t];const o=e=>Z(this,void 0,void 0,(function*(){return!!(yield this.managers.appMessagesManager.getDialogOnly(e))||!!e.isUser()&&"user"===(yield this.managers.appUsersManager.getUser(e.toUserId()))._})),r=yield(0,P.Z)(a,(e=>o(e)));a.length=0,a.push(...r),a=a.slice();const d=e=>Z(this,void 0,void 0,(function*(){for(let t=0,i=Math.min(a.length,e);td(20)),{listenerSetter:this.listenerSetter}),l.append((0,p.ag)("FilterShowMoreChats",[a.length])),e.append(l)}d(4)}))))}editCheckForChange(){if("edit"===this.type){const e=!(0,I.Z)(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=(0,f.Z)(e)):(this.filter=e,this.onEditOpen(),this.editCheckForChange())}setInitFilter(e){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")}}},2010:(e,t,i)=>{"use strict";i.d(t,{J:()=>f,Z:()=>m});var s=i(503),n=i(3552),a=i(2621),o=i(6726),r=i(2325),d=i(2738),l=i(3512),c=i(2521),h=i(6082),u=i(5029),p=i(9522);function f(){const e=document.createElement("div"),t=(0,c.Z)(document.createElement("a")),i=(0,r.ag)("Username.Purchase",[t]);return i.classList.add("username-purchase-help"),e.append(i,document.createElement("br"),document.createElement("br")),e.classList.add("hide"),{element:e,setUsername:i=>{i&&(t.href="https://fragment.com/username/"+i),e.classList.toggle("hide",!i)}}}class m extends n._{static getInitArgs(){return{bioMaxLength:l.Z.managers.apiManager.getLimit("bio"),user:l.Z.managers.appUsersManager.getSelf(),userFull:l.Z.managers.appProfileManager.getProfile(l.Z.myId.toUserId())}}init(e){return t=this,i=void 0,c=function*(){this.container.classList.add("edit-profile-container"),this.setTitle("EditAccount.Title");const t=[],[i,n,c]=yield Promise.all([e.bioMaxLength,e.user,e.userFull]);{const e=(0,u.R)(this.scrollable,void 0,"Bio.Description"),n=document.createElement("div");n.classList.add("input-wrapper"),this.firstNameInputField=new s.ZP({label:"EditProfile.FirstNameLabel",name:"first-name",maxLength:70}),this.lastNameInputField=new s.ZP({label:"Login.Register.LastName.Placeholder",name:"last-name",maxLength:64}),this.bioInputField=new s.ZP({label:"EditProfile.BioLabel",name:"bio",maxLength:i}),n.append(this.firstNameInputField.container,this.lastNameInputField.container,this.bioInputField.container);const o=document.createElement("div");o.classList.add("caption"),(0,r.XZ)({element:o,key:"Bio.Description"}),t.push(this.firstNameInputField,this.lastNameInputField,this.bioInputField),this.editPeer=new a.Z({peerId:l.Z.myId,inputFields:t,listenerSetter:this.listenerSetter}),this.content.append(this.editPeer.nextBtn),e.append(this.editPeer.avatarEdit.container,n)}{const e=new u.Z({name:"EditAccount.Username",caption:!0}),i=document.createElement("div");i.classList.add("input-wrapper"),this.usernameInputField=new o.l({label:"EditProfile.Username.Label",name:"username",plainText:!0,listenerSetter:this.listenerSetter,onChange:()=>{this.editPeer.handleChange();const{error:e}=this.usernameInputField,t="USERNAME_PURCHASE_AVAILABLE"===(null==e?void 0:e.type);n(t?this.usernameInputField.value:void 0)},availableText:"EditProfile.Username.Available",takenText:"EditProfile.Username.Taken",invalidText:"EditProfile.Username.Invalid"},this.managers),i.append(this.usernameInputField.container);const s=e.caption,{setUsername:n,element:a}=f();s.append(a,(0,r.ag)("UsernameHelp")),t.push(this.usernameInputField),e.content.append(i),this.scrollable.append(e.container)}{const e=new p.Z({peerId:l.Z.myId,peer:n,listenerSetter:this.listenerSetter,usernameInputField:this.usernameInputField,middleware:this.middlewareHelper.get()});this.scrollable.append(e.container)}(0,d.fc)(this.editPeer.nextBtn,(()=>{this.editPeer.nextBtn.disabled=!0;const e=[],t=this.managers.appProfileManager.updateProfile(this.firstNameInputField.value,this.lastNameInputField.value,this.bioInputField.value);e.push(t.then((()=>{this.close()}),(e=>{console.error("updateProfile error:",e)}))),this.editPeer.uploadAvatar&&e.push(this.editPeer.uploadAvatar().then((e=>this.managers.appProfileManager.uploadProfilePhoto(e)))),this.usernameInputField.isValidToChange()&&e.push(this.managers.appUsersManager.updateUsername(this.usernameInputField.value)),Promise.race(e).finally((()=>{this.editPeer.nextBtn.removeAttribute("disabled")}))}),{listenerSetter:this.listenerSetter}),this.firstNameInputField.setOriginalValue(n.first_name,!0),this.lastNameInputField.setOriginalValue(n.last_name,!0),this.bioInputField.setOriginalValue(c.about,!0),this.usernameInputField.setOriginalValue((0,h.Z)(n),!0),this.editPeer.handleChange()},new((n=void 0)||(n=Promise))((function(e,s){function a(e){try{r(c.next(e))}catch(e){s(e)}}function o(e){try{r(c.throw(e))}catch(e){s(e)}}function r(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(a,o)}r((c=c.apply(t,i||[])).next())}));var t,i,n,c}}},4332:(e,t,i)=>{"use strict";i.d(t,{HQ:()=>d,ZP:()=>h});var s=i(9322),n=i(3552),a=i(4755),o=i(1669),r=i(410);const d="is-right-column-shown";class l extends n.Z{constructor(){super({sidebarEl:document.getElementById("column-right"),canHideFirst:!0,navigationType:"right"}),this.isColumnProportionSet=!1}construct(e){this.managers=e,a.Z.addEventListener("changeScreen",((e,t)=>{t===a._.medium&&e!==a._.mobile&&this.toggleSidebar(!1)})),a.Z.addEventListener("resize",(()=>{this.setColumnProportion()}))}createSharedMediaTab(){const e=this.createTab(o.Z,!1,!0);return e.slider=this,e}replaceSharedMediaTab(e){const t=this.sharedMediaTab;if(t){const i=this.historyTabIds.indexOf(t);this._selectTab.getFrom()===t.container&&this._selectTab.setFrom(null==e?void 0:e.container),e?(-1!==i&&(this.historyTabIds[i]=e),t.container.classList.contains("active")&&e.container.classList.add("active"),t.container.replaceWith(e.container)):(-1!==i&&this.historyTabIds.splice(i,1),t.container.remove())}else this.tabsContainer.prepend(e.container);this.sharedMediaTab=e}onCloseTab(e,t,i){this.historyTabIds.length||this.toggleSidebar(!1,t),super.onCloseTab(e,t,i)}setColumnProportion(){const e=this.sidebarEl.scrollWidth/this.sidebarEl.previousElementSibling.scrollWidth;document.documentElement.style.setProperty("--right-column-proportion",""+e)}toggleSidebar(e,t){const i=document.body.classList.contains(d);let n;if(void 0!==e?e?i||(n=!0):i&&(n=!0):n=!0,!n)return Promise.resolve();i||this.historyTabIds.length||this.sharedMediaTab.open(),this.isColumnProportionSet||(this.setColumnProportion(),this.isColumnProportionSet=!0);const a=s.ZP.selectTab(i?s.oo.CHAT:s.oo.PROFILE,t);return document.body.classList.toggle(d,e),a}}const c=new l;r.GO.appSidebarRight=c;const h=c},4240:(e,t,i)=>{"use strict";i.d(t,{Z:()=>S});var s=i(3552),n=i(503),a=i(2621),o=i(7479),r=i(9807),d=i(4494),l=i(8842),c=i(3512),h=i(8127),u=i(1168),p=i(2325),f=i(2738),m=i(1656),g=i(2946),v=i(8210),b=i(5029),y=i(7362),w=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class S extends s._{init(){return w(this,void 0,void 0,(function*(){const{peerId:e}=this,t=e.toUserId();this.container.classList.add("edit-peer-container","edit-contact-container");const[i,s]=yield Promise.all([this.managers.appUsersManager.isContact(t),this.managers.appPrivacyManager.getPrivacy("inputPrivacyKeyPhoneNumber")]),S=!i;this.setTitle(S?"AddContactTitle":"Edit");{const i=new b.Z({noDelimiter:!0}),s=[],d=document.createElement("div");if(d.classList.add("input-wrapper"),this.nameInputField=new n.ZP({label:"FirstName",name:"contact-name",maxLength:70,required:!0}),this.lastNameInputField=new n.ZP({label:"LastName",name:"contact-lastname",maxLength:70}),t){const e=yield this.managers.appUsersManager.getUser(t);S?(this.nameInputField.setDraftValue(e.first_name),this.lastNameInputField.setDraftValue(e.last_name)):(this.nameInputField.setOriginalValue(e.first_name),this.lastNameInputField.setOriginalValue(e.last_name))}if(d.append(this.nameInputField.container,this.lastNameInputField.container),s.push(this.nameInputField,this.lastNameInputField),this.editPeer=new a.Z({peerId:e,inputFields:s,listenerSetter:this.listenerSetter,doNotEditAvatar:!0}),this.content.append(this.editPeer.nextBtn),e){const s=document.createElement("div");s.classList.add("avatar-edit"),s.append(this.editPeer.avatarElem);const n=new r.Z({text:"Notifications"});n.input.addEventListener("change",(t=>{t.isTrusted&&this.managers.appMessagesManager.togglePeerMute({peerId:e})})),this.listenerSetter.add(c.Z)("notify_settings",(e=>w(this,void 0,void 0,(function*(){if("notifyPeer"!==e.peer._)return;const t=(0,g.Z)(e.peer.peer);if(t==t){const t=!(yield this.managers.appNotificationsManager.isMuted(e.notify_settings));t!==n.checked&&(n.checked=t)}}))));const a=document.createElement("div");a.classList.add("profile-name"),a.append(new l.Z({peerId:e}).element);const h=document.createElement("div");if(h.classList.add("profile-subtitle"),h.append((0,p.ag)("EditContact.OriginalName")),i.content.append(s,a,h,d),S){const s=yield this.managers.appUsersManager.getUser(t),n=new o.ZP({icon:"phone",titleLangKey:s.phone?void 0:"MobileHidden",title:s.phone?(0,v.Z)(s.phone):void 0,subtitleLangKey:s.phone?"Phone":"MobileHiddenExceptionInfo",subtitleLangArgs:s.phone?void 0:[new l.Z({peerId:e}).element]});i.content.append(n.container)}else{const t=new o.ZP({checkboxField:n,withCheckboxSubtitle:!0,listenerSetter:this.listenerSetter}),s=!(yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:e,respectType:!1}));n.checked=s,i.content.append(t.container)}}else i.content.append(d);this.scrollable.append(i.container)}if(S){if(s.some((e=>"privacyValueDisallowAll"===e._))&&!s.some((e=>"privacyValueAllowUsers"===e._&&e.users.includes(t)))){const e=new b.Z({caption:"NewContact.Exception.ShareMyPhoneNumber.Desc",captionArgs:[yield(0,y.Z)({peerId:this.peerId})]}),t=this.sharePhoneCheckboxField=new r.Z({text:"NewContact.Exception.ShareMyPhoneNumber",checked:!0}),i=(0,o.tG)(t);e.content.append(i.container),this.scrollable.append(e.container)}}else{const i=new b.Z,s=(0,d.Z)("btn-primary btn-transparent danger",{icon:"delete",text:"PeerInfo.DeleteContact"});(0,f.fc)(s,(()=>{new h.Z("popup-delete-contact",{peerId:e,titleLangKey:"DeleteContact",descriptionLangKey:"AreYouSureDeleteContact",buttons:(0,u.x)([{langKey:"Delete",callback:()=>{const e=(0,m.Z)([s],!0);this.managers.appUsersManager.deleteContacts([t]).then((()=>{this.close()}),(()=>{e()}))},isDanger:!0}])}).show()}),{listenerSetter:this.listenerSetter}),i.content.append(s),this.scrollable.append(i.container)}(0,f.fc)(this.editPeer.nextBtn,(()=>w(this,void 0,void 0,(function*(){var e;this.editPeer.nextBtn.disabled=!0,this.managers.appUsersManager.addContact(t,this.nameInputField.value,this.lastNameInputField.value,(yield this.managers.appUsersManager.getUser(t)).phone,null===(e=this.sharePhoneCheckboxField)||void 0===e?void 0:e.checked).finally((()=>{this.editPeer.nextBtn.removeAttribute("disabled"),this.close()}))}))),{listenerSetter:this.listenerSetter})}))}}},730:(e,t,i)=>{"use strict";i.d(t,{Z:()=>C});var s=i(2738),n=i(1656),a=i(9405),o=i(8479),r=i(6848),d=i(9322),l=i(1507),c=i(3785),h=i(2230),u=i(9807),p=i(6039),f=i(503),m=i(7479),g=i(5029),v=i(744),b=i(6024),y=i(9345),w=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const S=(0,a.C)(64,64);class C extends b.Z{init(e,t){return w(this,void 0,void 0,(function*(){this.colorIndex=0;const i=!t,a=t===l.Ox;this.container.classList.add("edit-topic-container"),this.setTitle(i?"NewTopic":"ForumTopic.Title.Edit");const r=e.toChatId();t&&(this.topic=this.originalTopic=(0,o.Z)(yield this.managers.dialogsStorage.getForumTopic(e,t)));{const i=new g.Z({name:a?"CreateGeneralTopicTitle":"CreateTopicTitle"}),o=this.iconDiv=document.createElement("div");o.classList.add("edit-topic-icon-container"),!t&&(0,s.fc)(o,(()=>{this.topic.icon_emoji_id||(this.colorIndex=(this.colorIndex+1)%l.OS.length,this.setIcon())}),{listenerSetter:this.listenerSetter}),t&&o.classList.add("disable-hover");const c=document.createElement("div");c.classList.add("input-wrapper");const u=this.nameInputField=new f.ZP({label:"ForumTopic.Name.Placeholder",withLinebreaks:!1,name:"topic-name",maxLength:70,required:!0});this.topic&&u.setOriginalValue(this.topic.title,!0);const p=this.confirmBtn=(0,h.Z)("check btn-confirm blue hide",{noRipple:!0});this.header.append(p),(0,s.fc)(p,(()=>{const i=(0,n.Z)([p],!0);t?this.managers.appChatsManager.editForumTopic({chatId:r,topicId:t,title:u.value,iconEmojiId:this.topic.icon_emoji_id||0}).then((()=>{this.close()})).catch((e=>{console.error("edit topic error",e),i()})):this.managers.appChatsManager.createForumTopic({chatId:r,iconColor:l.OS[this.colorIndex],iconEmojiId:this.topic.icon_emoji_id,title:u.value}).then((t=>{this.close(),d.ZP.setInnerPeer({peerId:e,threadId:t})})).catch((e=>{console.error("create topic error",e),i()}))}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(u.input)("input",(()=>{var e;this.validate(),this.setIcon(null===(e=this.topic)||void 0===e?void 0:e.icon_emoji_id)})),c.append(u.container),i.content.append(o,c),this.scrollable.append(i.container)}const c=[];if(a){const e=new g.Z({caption:"EditTopicHideInfo"}),i=new u.Z({checked:!this.topic.pFlags.hidden,text:"EditTopicHide"});this.listenerSetter.add(i.input)("change",(()=>{const e=this.managers.appChatsManager.editForumTopic({chatId:r,topicId:t,hidden:!i.checked});s.disableWithPromise(e)}));const s=new m.ZP({checkboxField:i});e.content.append(s.container),this.scrollable.append(e.container)}else{const e=new g.Z({});e.container.classList.add("edit-topic-emoticons-container");const t=new p.ZP({managers:this.managers,isStandalone:!0,noRegularEmoji:!0,stickerSetId:"inputStickerSetEmojiDefaultTopicIcons",onClick:e=>{t.setActive(e.docId?e:{emoji:void 0,docId:void 0}),this.setIcon(e.docId)}});t.getContainerSize=()=>({width:v.ZP.rect.width,height:400}),this.middlewareHelper.onDestroy((()=>{t.destroy()})),t.container.classList.remove("tabs-tab"),this.emojiElement=document.createElement("span"),this.emojiElement.classList.add("super-emoji-topic-icon");const i=t.init().then((()=>w(this,void 0,void 0,(function*(){var e;const i=t.getCustomCategory(),s=null===(e=this.topic)||void 0===e?void 0:e.icon_emoji_id;t.addEmojiToCategory({category:i,element:this.emojiElement,batch:!1,prepend:!0,active:!s}),s&&t.setActive({docId:s,emoji:""})}))));c.push(i),e.content.replaceWith(t.container),this.scrollable.append(e.container)}return Promise.all(c).then((()=>this.s()))}))}validate(){let e=this.nameInputField.isValidToChange();!e&&this.originalTopic&&(e=this.topic.icon_emoji_id!==this.originalTopic.icon_emoji_id),this.confirmBtn.classList.toggle("hide",!e)}s(){var e,t;return(null===(e=this.topic)||void 0===e?void 0:e.icon_color)&&(this.colorIndex=l.OS.indexOf(this.topic.icon_color)),this.setIcon(null===(t=this.topic)||void 0===t?void 0:t.icon_emoji_id,void 0,!0)}setIcon(e,t=this.iconDiv,i){var s;return w(this,void 0,void 0,(function*(){const n=this.nameInputField.value,a=t===this.iconDiv;if(a){const t={id:null===(s=this.topic)||void 0===s?void 0:s.id,icon_color:l.OS[this.colorIndex],title:(0,c.Z)(n,!0).text||"A",icon_emoji_id:e},a=this.topic;if(this.topic=t,!i&&a&&a.icon_color===t.icon_color&&a.title===t.title||this.setIcon(void 0,this.emojiElement),(0,r.Z)(a,t)&&!i)return;this.validate()}const o=yield(0,y.e)({topic:a?this.topic:Object.assign(Object.assign({},this.topic),{icon_emoji_id:void 0}),customEmojiSize:S,middleware:this.middlewareHelper.get()}),d=document.createElement("div");d.classList.add("edit-topic-icon"),d.append(o);const h=t.lastElementChild;t.append(d);const u=(e,t)=>{const i=e.animate([{opacity:"0",transform:"scale(0.8)"},{opacity:"1",transform:"scale(1)"}],{duration:200,iterations:1,easing:"ease-in-out",fill:"forwards",direction:t?"normal":"reverse"});return new Promise((e=>{i.addEventListener("finish",(()=>{e()}),{once:!0})}))};h&&u(h,!1).then((()=>h.remove())),u(d,!0)}))}}},1669:(e,t,i)=>{"use strict";i.d(t,{Z:()=>de});var s=i(3512),n=i(6360),a=i(3552),o=i(426),r=i(503),d=i(2621),l=i(7479),c=i(4494),h=i(2166),u=i(144),p=i(279),f=i(1218),m=i(2796),g=i(6726),v=i(6024),b=i(2325),y=i(8127),w=i(8119),S=i(2738),C=i(1656),L=i(9807),E=i(5029),I=i(9522),M=i(6082),P=i(5102),Z=i(2010),T=i(5592),k=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class x extends v.h{init(){return k(this,void 0,void 0,(function*(){this.container.classList.add("edit-peer-container","group-type-container");const e=yield this.managers.appChatsManager.isBroadcast(this.chatId);this.setTitle(e?"ChannelType":"GroupType");const t=new E.Z({name:e?"ChannelType":"GroupType"}),i=(0,u.a)(),n=new l.ZP({radioField:new f.Z({langKey:e?"ChannelPrivate":"MegaPrivate",name:i,value:"private"}),subtitleLangKey:e?"ChannelPrivateInfo":"MegaPrivateInfo"}),a=new l.ZP({radioField:new f.Z({langKey:e?"ChannelPublic":"MegaPublic",name:i,value:"public"}),subtitleLangKey:e?"ChannelPublicInfo":"MegaPublicInfo"}),o=(0,l.De)([n,a],(e=>{const t=[[v.container],[H]];"public"===e&&t.reverse(),t[0].forEach((e=>e.classList.remove("hide"))),t[1].forEach((e=>e.classList.add("hide"))),R()}));let r=yield this.managers.appChatsManager.getChat(this.chatId);const d={basic:[]};this.listenerSetter.add(s.Z)("chat_update",(e=>k(this,void 0,void 0,(function*(){this.chatId===e&&(r=yield this.managers.appChatsManager.getChat(this.chatId),d.basic.forEach((e=>e())))})))),t.content.append(o);const v=new E.Z({}),x=new l.ZP({title:this.chatFull.exported_invite.link,subtitleLangKey:e?"ChannelPrivateLinkHelp":"MegaPrivateLinkHelp",clickable:()=>{(0,h.T)(this.chatFull.exported_invite.link),(0,m.Am)(b.ZP.format("LinkCopied",!0))},listenerSetter:this.listenerSetter}),A=(0,c.Z)("btn-primary btn-transparent danger",{icon:"delete",text:"RevokeLink"});(0,S.fc)(A,(()=>{new y.Z("revoke-link",{buttons:[{langKey:"RevokeButton",callback:()=>{const e=(0,C.Z)([A],!0);this.managers.appProfileManager.getChatInviteLink(this.chatId,!0).then((t=>{e(),x.title.innerHTML=t}))}}],titleLangKey:"RevokeLink",descriptionLangKey:"RevokeAlert"}).show()}),{listenerSetter:this.listenerSetter}),v.content.append(x.container,A);const _=new E.Z({caption:!0,noDelimiter:!0}),F=document.createElement("div");F.classList.add("input-wrapper");const D="t.me/",R=()=>{const e=n.radioField.checked&&z!==D||B.isValidToChange()&&B.input.classList.contains("valid");j.classList.toggle("is-visible",e);const{error:t}=B,i="USERNAME_PURCHASE_AVAILABLE"===(null==t?void 0:t.type);N(i?B.getValue():void 0)},B=new g.l({label:"SetUrlPlaceholder",name:"group-public-link",plainText:!0,listenerSetter:this.listenerSetter,availableText:"Link.Available",invalidText:"Link.Invalid",takenText:"Link.Taken",onChange:R,peerId:this.chatId.toPeerId(!0),head:D},this.managers),{setUsername:N,element:O}=(0,Z.J)();_.caption.append(O,(0,b.ag)(e?"Channel.UsernameAboutChannel":"Channel.UsernameAboutGroup"));const U=new I.Z({peerId:this.chatId.toPeerId(!0),peer:r,listenerSetter:this.listenerSetter,usernameInputField:B,middleware:this.middlewareHelper.get()}),H=document.createElement("div");H.append(_.container,U.container);const z=D+((0,M.Z)(r)||"");F.append(B.container),_.content.append(F);const j=(0,w.Z)({icon:"check",className:"is-visible"});this.content.append(j),(0,S.fc)(j,(()=>k(this,void 0,void 0,(function*(){const t=a.radioField.checked?B.getValue():"";if(!t){const t=yield this.managers.appChatsManager.getChat(this.chatId),i=(0,M.Z)(t);i&&(yield(0,T.Z)({descriptionLangKey:e?"ChannelVisibility.Confirm.MakePrivate.Channel":"ChannelVisibility.Confirm.MakePrivate.Group",descriptionLangArgs:[i],button:{langKey:"OK"}}))}(0,p.p)(j),this.managers.appChatsManager.migrateChat(this.chatId).then((e=>t?this.managers.appChatsManager.updateUsername(e,t):this.managers.appChatsManager.makeChannelPrivate(e))).then((()=>{this.close()}))}))),{listenerSetter:this.listenerSetter}),(z!==D||(0,P.Z)(r).length?a:n).radioField.checked=!0,B.setOriginalValue(z,!0),this.scrollable.append(t.container,v.container,H);{const t=new E.Z({name:"SavingContentTitle",caption:e?"RestrictSavingContentInfoChannel":"RestrictSavingContentInfoGroup"}),i=new L.Z({text:"RestrictSavingContent",withRipple:!0});this.listenerSetter.add(i.input)("change",(()=>{const e=i.toggleDisability(!0);this.managers.appChatsManager.toggleNoForwards(this.chatId,i.checked).then((()=>{e()}))}));const s=()=>{i.setValueSilently(!!r.pFlags.noforwards)};((e,t="basic")=>{d[t].push(e)})(s),s(),t.content.append(i.label),this.scrollable.append(t.container)}}))}}var A=i(4668),_=i(5565),F=i(8936),D=i(4277),R=i(8479),B=i(7120),N=i(2946),O=i(2995),U=i(6848),H=i(3061);class z extends v.h{init(){return e=this,t=void 0,s=function*(){let e;this.container.classList.add("edit-peer-container","user-permissions-container"),this.setTitle("UserRestrictions");{const t=new E.Z({name:"UserRestrictionsCanDo"}),i=document.createElement("div");i.classList.add("chatlist-container"),t.content.insertBefore(i,t.title);const s=D.default.createChatList({new:!0});i.append(s);const{dom:n}=D.default.addDialogNew({peerId:this.userId.toPeerId(!1),container:s,rippleEnabled:!0,avatarSize:"abitbigger"});n.lastMessageSpan.append((0,H.Z)(yield this.managers.appUsersManager.getUser(this.userId)));const a=new G({chatId:this.chatId,listenerSetter:this.listenerSetter,appendTo:t.content,participant:"channelParticipantBanned"===this.participant._?this.participant:void 0},this.managers);e=()=>{const e=a.takeOut();"channelParticipantBanned"===this.participant._&&(0,U.Z)(this.participant.banned_rights.pFlags,e.pFlags)||this.managers.appChatsManager.editBanned(this.chatId,this.participant,e)},this.eventListener.addEventListener("destroy",e,{once:!0}),this.scrollable.append(t.container)}{const t=new E.Z({});if("channelParticipantBanned"===this.participant._){const i=(0,c.Z)("btn-primary btn-transparent danger",{icon:"delete",text:"GroupPermission.Delete"});(0,S.fc)(i,(()=>{const t=(0,C.Z)([i],!0);this.managers.appChatsManager.clearChannelParticipantBannedRights(this.chatId,this.participant).then((()=>{this.eventListener.removeEventListener("destroy",e),this.close()}),(()=>{t()}))}),{listenerSetter:this.listenerSetter}),t.content.append(i)}const i=(0,c.Z)("btn-primary btn-transparent danger",{icon:"deleteuser",text:"UserRestrictionsBlock"});(0,S.fc)(i,(()=>{(0,C.Z)([i],!0),this.managers.appChatsManager.kickFromChannel(this.chatId,this.participant).then((()=>{this.eventListener.removeEventListener("destroy",e),this.close()}))}),{listenerSetter:this.listenerSetter}),t.content.append(i),this.scrollable.append(t.container)}},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var j=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class G{constructor(e,t){this.options=e,this.managers=t,this.construct()}construct(){return j(this,void 0,void 0,(function*(){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 e=this.options,t=yield this.managers.appChatsManager.getChat(e.chatId),i=t.default_banned_rights,s=e.participant?function(e,t){if(e.default_banned_rights){t=(0,R.Z)(t);const i=e.default_banned_rights.pFlags;for(const e in i)t.pFlags[e]=i[e]}return t}(t,e.participant.banned_rights):i,n=e.participant?"UserRestrictionsDisabled":"EditCantEditPermissionsPublic";for(const a of this.v){const o=a.flags[0],r=(0,l.tG)(a.checkboxField=new L.Z({text:a.text,checked:(0,B.Z)(t,o,s),restriction:!0,listenerSetter:e.listenerSetter}));(e.participant&&i.pFlags[o]||(0,P.Z)(t)[0]&&(a.flags.includes("pin_messages")||a.flags.includes("change_info")))&&(a.checkboxField.input.disabled=!0,(0,S.fc)(a.checkboxField.label,(e=>{(0,m.Am)(b.ZP.format(n,!0))}),{listenerSetter:e.listenerSetter})),this.toggleWith[o]&&e.listenerSetter.add(a.checkboxField.input)("change",(()=>{a.checkboxField.checked||this.v.filter((e=>this.toggleWith[o].includes(e.flags[0]))).forEach((e=>{e.checkboxField.checked=!1}))})),e.appendTo.append(r.container)}}))}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 V extends v.h{init(){return j(this,void 0,void 0,(function*(){let e;this.container.classList.add("edit-peer-container","group-permissions-container"),this.setTitle("ChannelPermissions");{const t=new E.Z({name:"ChannelPermissionsHeader"});e=new G({chatId:this.chatId,listenerSetter:this.listenerSetter,appendTo:t.content},this.managers),this.eventListener.addEventListener("destroy",(()=>{this.managers.appChatsManager.editChatDefaultBannedRights(this.chatId,e.takeOut())}),{once:!0}),this.scrollable.append(t.container)}{const t=new E.Z({name:"PrivacyExceptions"}),i=new l.ZP({titleLangKey:"ChannelAddException",subtitleLangKey:"Loading",icon:"adduser",clickable:()=>{new O.Z({peerTypes:["channelParticipants"],onSelect:e=>{setTimeout((()=>{n(e)}),0)},placeholder:"ExceptionModal.Search.Placeholder",peerId:-this.chatId})},listenerSetter:this.listenerSetter}),n=e=>j(this,void 0,void 0,(function*(){let t;try{t=yield this.managers.appProfileManager.getChannelParticipant(this.chatId,e)}catch(e){return void(0,m.Am)("User is no longer participant")}const i=this.slider.createTab(z);i.participant=t,i.chatId=this.chatId,i.userId=e,i.open()}));t.content.append(i.container);const a=t.generateContentElement();a.classList.add("chatlist-container");const o=D.default.createChatList({new:!0});a.append(o),(0,S.fc)(o,(e=>{const t=(0,A.Z)(e.target,D.DIALOG_LIST_ELEMENT_TAG);if(!t)return;const i=t.dataset.peerId.toPeerId();n(i)}),{listenerSetter:this.listenerSetter});const r=(t,i)=>j(this,void 0,void 0,(function*(){const s=i.banned_rights,n=(yield this.managers.appChatsManager.getChat(this.chatId)).default_banned_rights,a=[];e.v.forEach((e=>{const t=e.flags[0];s.pFlags[t]&&!n.pFlags[t]&&a.push(e.exceptionText)}));const o=t.lastMessageSpan;a.length&&o.replaceChildren(...(0,b.v_)(a.map((e=>(0,b.ag)(e))),!1)),o.classList.toggle("hide",!a.length)})),d=(e,t)=>{const{dom:i}=D.default.addDialogNew({peerId:(0,N.Z)(e.peer),container:o,rippleEnabled:!0,avatarSize:"abitbigger",append:t});r(i,e)},c=()=>{(0,_.Z)(i.subtitle,(0,b.ag)(u?"Permissions.ExceptionsCount":"Permissions.NoExceptions",[u]))};let h,u=0;const p=()=>(h=new F.Z({scrollable:this.scrollable,getPromise:()=>this.managers.appProfileManager.getChannelParticipants(this.chatId,{_:"channelParticipantsBanned",q:""},50,o.childElementCount).then((e=>{for(const t of e.participants)d(t,!0);return u=e.count,c(),e.participants.length<50||e.count===o.childElementCount}))}),h.load());this.scrollable.append(t.container),(yield this.managers.appChatsManager.isChannel(this.chatId))?yield p():(c(),this.listenerSetter.add(s.Z)("dialog_migrate",(({migrateFrom:e,migrateTo:t})=>{this.chatId===e&&(this.chatId=t,p())})))}}))}onOpenAfterTimeout(){this.scrollable.onScroll()}}var K=i(6194),W=i(5701),$=i(62),q=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Y extends v.h{init(){var e;return q(this,void 0,void 0,(function*(){this.setTitle("Reactions");const t=yield this.managers.appReactionsManager.getActiveAvailableReactions(),i=yield this.managers.appProfileManager.getChatFull(this.chatId),s=yield this.managers.appChatsManager.isBroadcast(this.chatId);let n=null!==(e=i.available_reactions)&&void 0!==e?e:{_:"chatReactionsNone"},a=n,o=new Set("chatReactionsSome"===n._?n.reactions.map((e=>e.emoticon)):[]);const r=e=>e.map((e=>({_:"reactionEmoji",emoticon:e}))),d=()=>s?"EnableReactionsChannelInfo":"chatReactionsAll"===a._?"EnableAllReactionsInfo":"chatReactionsNone"===a._?"DisableReactionsInfo":"EnableSomeReactionsInfo",c=new E.Z({name:s?void 0:"AvailableReactions",caption:d()}),h=new E.Z({name:"OnlyAllowThisReactions"}),u=()=>{var e;const t=null!==(e=a.reactions)&&void 0!==e?e:[];o=new Set(t.map((({emoticon:e})=>e))),f.forEach(((e,t)=>{e.setValueSilently(o.has(t))}))};let p;if(s){p=new L.Z({toggle:!0,checked:"chatReactionsSome"===n._});const e=new l.ZP({checkboxField:p,titleLangKey:"EnableReactions",listenerSetter:this.listenerSetter});c.content.append(e.container),this.listenerSetter.add(p.input)("change",(()=>{let e=!0;p.checked?m.every((e=>!e.checked))?a={_:"chatReactionsSome",reactions:r(t.map((({reaction:e})=>e)))}:"chatReactionsSome"!==a._?a={_:"chatReactionsSome",reactions:r(Array.from(o))}:e=!1:a={_:"chatReactionsNone"},e&&(u(),v())}))}else{const e=[["chatReactionsAll","AllReactions"],["chatReactionsSome","SomeReactions"],["chatReactionsNone","NoReactions"]],t=()=>{h.container.classList.toggle("hide","chatReactionsSome"!==a._)};let i=n._;const s=(0,l.ZC)(e.map((([e,t])=>({langPackKey:t,value:e,checked:n._===e}))),(e=>{i=e,a="chatReactionsAll"===i?{_:i,pFlags:{allow_custom:!0}}:"chatReactionsNone"===i?{_:i}:{_:i,reactions:r(["๐Ÿ‘","๐Ÿ‘Ž"])},(0,_.Z)(c.caption,(0,b.ag)(d())),u(),v(),t()}));c.content.append(s),t()}const f=new Map,m=t.map((e=>{const t=e.reaction,i=new L.Z({toggle:!0,checked:o.has(t)});f.set(t,i),this.listenerSetter.add(i.input)("change",(()=>{i.checked?(o.add(t),p&&!p.checked&&(p.checked=!0)):(o.delete(t),(null==p?void 0:p.checked)&&!o.size&&(p.checked=!1)),v()}));const s=new l.ZP({checkboxField:i,title:e.title,havePadding:!0,listenerSetter:this.listenerSetter});return(0,$.Z)({row:s,doc:e.static_icon,size:"small"}),h.content.append(s.container),i})),g=()=>q(this,void 0,void 0,(function*(){v.clearTimeout(),"chatReactionsSome"===a._&&(a.reactions=r(Array.from(o))),this.managers.appChatsManager.setChatAvailableReactions(this.chatId,a),n=a})),v=(0,W.Z)(g,3e3,!1,!0);this.eventListener.addEventListener("destroy",(()=>{v.isDebounced()&&g()}),{once:!0}),this.scrollable.append(c.container,h.container)}))}}var Q=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class X extends a._{_init(){return Q(this,void 0,void 0,(function*(){this.listenerSetter.removeAll(),this.scrollable.container.replaceChildren(),this.container.classList.add("edit-peer-container","edit-group-container"),this.setTitle("Edit");let[e,t,i,n,a,o,h,u]=yield Promise.all([this.managers.appProfileManager.getChatFull(this.chatId,!0),this.managers.appChatsManager.getChat(this.chatId),this.managers.appChatsManager.isBroadcast(this.chatId),this.managers.appChatsManager.isChannel(this.chatId),this.managers.appChatsManager.hasRights(this.chatId,"change_type"),this.managers.appChatsManager.hasRights(this.chatId,"change_permissions"),this.managers.appChatsManager.hasRights(this.chatId,"manage_topics"),this.managers.apiManager.getAppConfig()]);const p={full:[],basic:[]},f=(e,t="basic")=>{p[t].push(e)};this.listenerSetter.add(s.Z)("chat_update",(e=>Q(this,void 0,void 0,(function*(){this.chatId===e&&(t=yield this.managers.appChatsManager.getChat(this.chatId),p.basic.forEach((e=>e())))})))),this.listenerSetter.add(s.Z)("chat_full_update",(t=>Q(this,void 0,void 0,(function*(){this.chatId===t&&(e=(yield this.managers.appProfileManager.getCachedFullChat(t))||e,p.full.forEach((e=>e())))}))));const m=this.chatId.toPeerId(!0);{const s=new E.Z({noDelimiter:!0,caption:!0}),n=[],c=document.createElement("div");if(c.classList.add("input-wrapper"),this.chatNameInputField=new r.ZP({label:i?"EnterChannelName":"CreateGroup.NameHolder",name:"chat-name",maxLength:255,required:!0}),this.descriptionInputField=new r.ZP({label:"DescriptionPlaceholder",name:"chat-description",maxLength:255}),this.chatNameInputField.setOriginalValue(t.title),this.descriptionInputField.setOriginalValue(e.about),c.append(this.chatNameInputField.container,this.descriptionInputField.container),n.push(this.chatNameInputField,this.descriptionInputField),this.editPeer=new d.Z({peerId:m,inputFields:n,listenerSetter:this.listenerSetter,popupOptions:{isForum:t.pFlags.forum}}),this.content.append(this.editPeer.nextBtn),s.content.append(this.editPeer.avatarEdit.container,c),a){const n=new l.ZP({titleLangKey:i?"ChannelType":"GroupType",clickable:()=>{const t=this.slider.createTab(x);t.chatId=this.chatId,t.chatFull=e,t.open()},icon:"lock",listenerSetter:this.listenerSetter}),a=()=>{let e;const s=(0,P.Z)(t)[0];e=i?s?"TypePublic":"TypePrivate":s?"TypePublicGroup":"TypePrivateGroup",n.subtitle.replaceChildren((0,b.ag)(e))};a(),f(a),s.content.append(n.container)}if(a||o){const t=new l.ZP({titleLangKey:"Reactions",icon:"reactions",clickable:()=>{const e=this.slider.createTab(Y);e.chatId=this.chatId,e.open()},listenerSetter:this.listenerSetter}),i=(yield this.managers.appReactionsManager.getAvailableReactions()).filter((e=>!e.pFlags.inactive)).length,n=()=>{var s;const n=null!==(s=e.available_reactions)&&void 0!==s?s:{_:"chatReactionsNone"};if("chatReactionsSome"===n._){const e=n.reactions.length;e===i?(0,_.Z)(t.subtitle,(0,b.ag)("ReactionsAll")):t.subtitle.textContent=e+"/"+i}else(0,_.Z)(t.subtitle,(0,b.ag)("chatReactionsAll"===n._?"ReactionsAll":"Checkbox.Disabled"))};n(),f(n,"full"),s.content.append(t.container)}if(o&&!i){const e=["send_messages","send_media","send_stickers","send_polls","embed_links","invite_users","pin_messages","change_info"],i=new l.ZP({titleLangKey:"ChannelPermissions",clickable:()=>{const e=this.slider.createTab(V);e.chatId=this.chatId,e.open()},icon:"permissions",listenerSetter:this.listenerSetter}),n=()=>{i.subtitle.textContent=e.reduce(((e,i)=>e+ +(0,B.Z)(t,i,t.default_banned_rights)),0)+"/"+e.length};n(),f(n),s.content.append(i.container)}if(h&&(t.participants_count>=u.forum_upgrade_participants_min||t.pFlags.forum)&&!i){const e=new l.ZP({checkboxField:new L.Z({toggle:!0}),titleLangKey:"Topics",clickable:()=>{},icon:"topics",listenerSetter:this.listenerSetter}),i=()=>{const i=!!t.pFlags.forum;this.editPeer.avatarElem.parentElement.classList.toggle("is-forum",i),e.checkboxField.setValueSilently(i)};this.listenerSetter.add(e.checkboxField.input)("change",(t=>{if(!t.isTrusted)return;const i=this.managers.appChatsManager.toggleForum(this.chatId,e.checkboxField.checked);e.disableWithPromise(i)})),i(),f(i),s.caption.replaceChildren((0,b.ag)("ForumToggleDescription")),s.content.append(e.container)}if(s.caption.classList.toggle("hide",!s.caption.childElementCount),this.scrollable.append(s.container),(0,S.fc)(this.editPeer.nextBtn,(()=>{this.editPeer.nextBtn.disabled=!0;const e=[],t=this.chatId;this.chatNameInputField.isValidToChange()&&e.push(this.managers.appChatsManager.editTitle(t,this.chatNameInputField.value)),this.descriptionInputField.isValidToChange()&&e.push(this.managers.appChatsManager.editAbout(t,this.descriptionInputField.value)),this.editPeer.uploadAvatar&&e.push(this.editPeer.uploadAvatar().then((e=>this.managers.appChatsManager.editPhoto(t,e)))),Promise.race(e).finally((()=>{this.editPeer.nextBtn.removeAttribute("disabled"),this.close()}))}),{listenerSetter:this.listenerSetter}),i&&(yield this.managers.appChatsManager.hasRights(this.chatId,"change_info"))){const e=new L.Z({text:"ChannelSignMessages",checked:!!t.pFlags.signatures});this.listenerSetter.add(e.input)("change",(()=>{const t=e.toggleDisability(!0);this.managers.appChatsManager.toggleSignatures(this.chatId,e.checked).then((()=>{t()}))})),f((()=>{e.setValueSilently(!!t.pFlags.signatures)})),s.content.append((0,l.tG)(e).container)}}if(!i){const t=new E.Z({});if(!i&&a){const i=new L.Z({text:"ChatHistory"});this.listenerSetter.add(i.input)("change",(()=>{const e=i.toggleDisability(!0);this.managers.appChatsManager.togglePreHistoryHidden(this.chatId,!i.checked).then((()=>{e()}))}));const s=()=>{i.setValueSilently(n&&!e.pFlags.hidden_prehistory)};s(),f(s),t.content.append((0,l.tG)(i).container)}t.content.childElementCount&&this.scrollable.append(t.container)}if(yield this.managers.appChatsManager.hasRights(this.chatId,"delete_chat")){const e=new E.Z({}),t=(0,c.Z)("btn-primary btn-transparent danger",{icon:"delete",text:i?"PeerInfo.DeleteChannel":"DeleteAndExitButton"});(0,S.fc)(t,(()=>{new K.Z(m,void 0,(e=>{const i=(0,C.Z)([t],!0);e.then((()=>{this.close()}),(()=>{i()}))}))}),{listenerSetter:this.listenerSetter}),e.content.append(t),this.scrollable.append(e.container)}n||this.listenerSetter.add(s.Z)("dialog_migrate",(({migrateFrom:e,migrateTo:t})=>{m===e&&(this.chatId=t.toChatId(),this._init())}))}))}init(){return this._init()}}var J=i(8842),ee=i(4240),te=i(2230),ie=i(5670),se=i(8261),ne=i(4993),ae=i(730),oe=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const re={};class de extends a._{init(){this.container.classList.add("shared-media-container","profile-container");const e=(0,c.Z)("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),this.isFirst&&t.classList.add("state-back");const i=document.createElement("div");i.className="transition slide-fade";const a=document.createElement("div");a.classList.add("transition-item"),this.titleI18n=new b.ZP.IntlElement,this.title.append(this.titleI18n.element),this.editBtn=(0,te.Z)("edit"),a.append(this.title,this.editBtn);const r=document.createElement("div");r.classList.add("transition-item");const d=this.title.cloneNode();d.append((0,b.ag)("PeerInfo.SharedMedia")),r.append(d),i.append(a,r),this.header.append(i),this.profile=new se.Z(this.managers,this.scrollable,this.listenerSetter),this.profile.init(),this.scrollable.append(this.profile.element),this.scrollable.onAdditionalScroll=()=>{const e=this.searchSuper.nav.getBoundingClientRect();if(!e.width)return;const t=e.top-1;l(t<=56)};const l=e=>{t.classList.toggle("state-back",this.isFirst||e),this.searchSuper.container.classList.toggle("is-full-viewport",e),h(+e),e||this.searchSuper.cleanScrollPositions()},h=(0,o.Z)({content:i,type:"slide-fade",transitionTime:400,isHeavy:!1});h(0),(0,S.fc)(this.closeBtn,(e=>{h.prevId()?(this.scrollable.scrollIntoViewNew({element:this.scrollable.container.firstElementChild,position:"start"}),h(0),this.isFirst||t.classList.remove("state-back")):this.scrollable.isHeavyAnimationInProgress||this.slider.onCloseBtnClick()}),{listenerSetter:this.listenerSetter}),(0,S.fc)(this.editBtn,(()=>oe(this,void 0,void 0,(function*(){let e;const{peerId:t,threadId:i}=this;e=i&&(yield this.managers.appPeersManager.isForum(t))?this.slider.createTab(ae.Z):t.isAnyChat()?this.slider.createTab(X):this.slider.createTab(ee.Z),e&&(e instanceof ae.Z?e.open(t,this.threadId):(e instanceof X?e.chatId=t.toChatId():e.peerId=t,e.open()))}))),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(s.Z)("contacts_update",(e=>{this.peerId===e&&this.toggleEditBtn()})),this.listenerSetter.add(s.Z)("chat_update",(e=>{this.peerId===e.toPeerId(!0)&&this.toggleEditBtn()})),this.listenerSetter.add(s.Z)("history_multiappend",(e=>{this.renderNewMessage(e)})),this.listenerSetter.add(s.Z)("history_delete",(({peerId:e,msgs:t})=>{this.deleteDeletedMessages(e,Array.from(t))})),this.listenerSetter.add(s.Z)("message_sent",(({message:e})=>{this.renderNewMessage(e)})),this.searchSuper=new n.Z({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=>{const t="members"===e.type&&s.Z.settings.animationsEnabled?250:0;setTimeout((()=>{u.classList.toggle("is-hidden","members"!==e.type)}),t)},managers:this.managers}),this.searchSuper.scrollStartCallback=()=>{l(!0)},this.profile.element.append(this.searchSuper.container);const u=(0,w.Z)({icon:"addmember_filled"});this.content.append(u),(0,S.fc)(u,(()=>oe(this,void 0,void 0,(function*(){const e=this.peerId,t=this.peerId.toChatId(),i=yield this.managers.appChatsManager.isChannel(t),s=(t,s)=>{let n,a,o,r,d;if(t.length>1)n="AddMembersAlertTitle",a=[(0,b.ag)("Members",[t.length])],o="AddMembersAlertCountText",r=t.map((e=>{const t=document.createElement("b");return t.append(new J.Z({peerId:e}).element),t})),i||(d=[{text:"AddMembersForwardMessages",checked:!0}]);else{n="AddOneMemberAlertTitle",o="AddMembersAlertNamesText";const e=document.createElement("b");e.append(new J.Z({peerId:t[0]}).element),r=[e],i||(d=[{text:"AddOneMemberForwardMessages",textArgs:[new J.Z({peerId:t[0]}).element],checked:!0}])}r.push(new J.Z({peerId:e}).element),new y.Z("popup-add-members",{peerId:e,titleLangKey:n,descriptionLangKey:o,descriptionLangArgs:r,buttons:[{langKey:"Add",callback:s}],checkboxes:d}).show()},n=e=>{"USER_PRIVACY_RESTRICTED"===e.type&&(0,m.bC)({langPackKey:"InviteToGroupError"})};if(i){const e=this.slider.createTab(ie.Z);e.open({type:"channel",skippable:!1,takeOut:i=>(s(i,(()=>{const s=this.managers.appChatsManager.inviteToChannel(t,i);s.catch(n),e.attachToPromise(s)})),!1),title:"GroupAddMembers",placeholder:"SendMessageTo"})}else new O.Z({peerTypes:["contacts"],placeholder:"Search",onSelect:e=>{setTimeout((()=>{s([e],(i=>{this.managers.appChatsManager.addChatUser(t,e,i.size?void 0:0).catch(n)}))}),0)}})}))),{listenerSetter:this.listenerSetter})}_renderNewMessage(e,t){var i;const s=null===(i=re[e.peerId])||void 0===i?void 0:i[t];if(s)for(const t of this.searchSuper.mediaTabs){const i=t.inputFilter,n=s[i];if(!n)continue;const a=this.searchSuper.filterMessagesByType([e],i).filter((e=>!n.find((t=>t.mid===e.mid&&t.peerId===e.peerId))));a.length&&(n.unshift(...a.map((e=>({mid:e.mid,peerId:e.peerId})))),this.peerId===e.peerId&&-1!==this.searchSuper.usedFromHistory[i]&&(this.searchSuper.usedFromHistory[i]+=a.length,this.searchSuper.performSearchResult(a,t,!1)))}}renderNewMessage(e){return oe(this,void 0,void 0,(function*(){if(this.init)return;const{peerId:t}=e,i=yield this.managers.appPeersManager.isForum(t),s=(0,ne.Z)(e,i);this._renderNewMessage(e),s&&this._renderNewMessage(e,s)}))}_deleteDeletedMessages(e,t,i){for(const s of i)for(const i of this.searchSuper.mediaTabs){const n=i.inputFilter,a=e[n];if(!a)continue;const o=a.findIndex((e=>e.mid===s));if(-1!==o&&(a.splice(o,1),this.peerId===t)){const e=this.searchSuper.tabs[n].querySelector(`[data-mid="${s}"][data-peer-id="${t}"]`);e&&(this.searchSuper.selection.isSelecting&&this.searchSuper.selection.toggleByElement(e),e.remove()),this.searchSuper.usedFromHistory[n]>=o+1&&--this.searchSuper.usedFromHistory[n]}}}deleteDeletedMessages(e,t){if(this.init)return;const i=re[e];if(i){for(const s in i)this._deleteDeletedMessages(i[s],e,t);this.scrollable.onScroll()}}cleanupHTML(){return oe(this,void 0,void 0,(function*(){const e=this.peerId.isAnyChat(),[t,i]=yield Promise.all([!!e&&this.searchSuper.canViewMembers(),!!e&&this.managers.appChatsManager.hasRights(this.peerId.toChatId(),"invite_users")]);return()=>{this.profile.cleanupHTML(),this.editBtn.classList.add("hide"),this.searchSuper.cleanupHTML(!0),this.container.classList.toggle("can-add-members",t&&i)}}))}setLoadMutex(e){this.searchSuper.loadMutex=e}setPeer(e,t){var i,s,n;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,threadId:t,historyStorage:null!==(s=(n=null!==(i=re[e])&&void 0!==i?i:re[e]={})[t])&&void 0!==s?s:n[t]={}}),this.profile.setPeer(e,t),!0)}changeTitleKey(){return oe(this,void 0,void 0,(function*(){const e=this.managers.appPeersManager.isForum(this.peerId);return()=>{this.titleI18n.compareAndUpdate({key:this.threadId&&e?"AccDescrTopic":"Profile"})}}))}fillProfileElements(){return oe(this,void 0,void 0,(function*(){if(!this.peerChanged)return;this.peerChanged=!1;const e=yield Promise.all([this.cleanupHTML(),this.toggleEditBtn(!0),this.profile.fillProfileElements(),this.changeTitleKey()]);return()=>{e.forEach((e=>{null==e||e()}))}}))}toggleEditBtn(e){return oe(this,void 0,void 0,(function*(){let t;if(this.peerId.isUser())t=this.peerId!==s.Z.myId&&(yield this.managers.appUsersManager.isContact(this.peerId.toUserId()));else{const e=this.peerId.toChatId(),i=this.threadId&&(yield this.managers.appChatsManager.isForum(e));t=yield this.managers.appChatsManager.hasRights(e,i?"manage_topics":"change_info")}const i=()=>{this.editBtn.classList.toggle("hide",!t)};return e?i:i()}))}loadSidebarMedia(e,t){this.searchSuper.load(e,t)}onOpenAfterTimeout(){super.onOpenAfterTimeout(),this.scrollable.onScroll()}onCloseAfterTimeout(){super.onCloseAfterTimeout(),this.destroyable&&(this.profile.destroy(),this.searchSuper.destroy())}destroy(){this.destroyable=!0,this.onCloseAfterTimeout()}}},9099:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(3512);const n=e=>{const{element:t,className:i,forwards:a,duration:o,onTransitionEnd:r,onTransitionStart:d,useRafs:l}=e,{timeout:c,raf:h}=t.dataset;if(void 0!==c&&clearTimeout(+c),void 0!==h&&(window.cancelAnimationFrame(+h),l||delete t.dataset.raf),l&&s.Z.settings.animationsEnabled&&o)return void(t.dataset.raf=""+window.requestAnimationFrame((()=>{delete t.dataset.raf,n(Object.assign(Object.assign({},e),{useRafs:l-1}))})));a&&i&&t.classList.add(i);const u=()=>{delete t.dataset.timeout,!a&&i&&t.classList.remove("backwards",i),t.classList.remove("animating"),null==r||r()};if(null==d||d(),!s.Z.settings.animationsEnabled||!o)return t.classList.remove("animating","backwards"),void u();t.classList.add("animating"),t.classList.toggle("backwards",!a),t.dataset.timeout=""+setTimeout(u,o)},a=n},3552:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l,_:()=>a.Z});var s=i(426),n=i(5824),a=i(6024),o=i(1655),r=i(5953),d=i(3624);class l{constructor(e){var t;this.historyTabIds=[],this.canHideFirst=!1,this.onCloseBtnClick=()=>{n.Z.findItemByType(this.navigationType)?n.Z.back(this.navigationType):this.historyTabIds.length&&this.closeTab(this.historyTabIds[this.historyTabIds.length-1])},this.closeTab=(e,t,i)=>{if(void 0!==e&&this.historyTabIds[this.historyTabIds.length-1]!==e)return this.removeTabFromHistory(e),!1;const s=this.historyTabIds.pop();this.onCloseTab(s,t,i);const n=this.historyTabIds[this.historyTabIds.length-1];return this._selectTab(void 0!==n?n instanceof a.Z?n.container:n:this.canHideFirst?-1:0,t),!0},(0,r.Z)(this,e),null!==(t=this.tabs)&&void 0!==t||(this.tabs=new Map),this.tabsContainer=this.sidebarEl.querySelector(".sidebar-slider"),this._selectTab=(0,s.Z)({content:this.tabsContainer,type:"navigation",transitionTime:250}),this.canHideFirst||this._selectTab(0),this.middlewareHelper=(0,d.k)()}getMiddleware(){return this.middlewareHelper.get()}selectTab(e){var t,i,s,o,r;return i=this,s=void 0,r=function*(){if(this.historyTabIds[this.historyTabIds.length-1]===e)return!1;const i=e instanceof a.Z?e:this.tabs.get(e);return this.onOpenTab&&(yield this.onOpenTab()),i&&(null===(t=i.onOpen)||void 0===t||t.call(i),i.onOpenAfterTimeout&&setTimeout((()=>{i.onOpenAfterTimeout()}),250)),n.Z.pushItem({type:this.navigationType,onPop:e=>(this.closeTab(void 0,e,!0),!0)}),this.historyTabIds.push(e),this._selectTab(e instanceof a.Z?e.container:e),!0},new((o=void 0)||(o=Promise))((function(e,t){function n(e){try{d(r.next(e))}catch(e){t(e)}}function a(e){try{d(r.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof o?i:new o((function(e){e(i)}))).then(n,a)}d((r=r.apply(i,s||[])).next())}))}removeTabFromHistory(e){(0,o.Z)(this.historyTabIds,e),this.onCloseTab(e,void 0)}sliceTabsUntilTab(e,t){for(let i=this.historyTabIds.length-1;i>=0;--i){const s=this.historyTabIds[i];if(s!==t){if(s instanceof e)break;this.removeTabFromHistory(s)}}}getTab(e){return this.historyTabIds.find((t=>t instanceof e))}getHistory(){return this.historyTabIds}isTabExists(e){return!!this.getTab(e)}onCloseTab(e,t,i){var s;i||n.Z.removeByType(this.navigationType,!0);const o=e instanceof a.Z?e:this.tabs.get(e);if(o){try{null===(s=o.onClose)||void 0===s||s.call(o)}catch(e){console.error("tab onClose error",o)}o.onCloseAfterTimeout&&setTimeout((()=>{o.onCloseAfterTimeout()}),280)}}addTab(e){e.container.parentElement||(this.tabsContainer.append(e.container),e.closeBtn&&e.closeBtn.addEventListener("click",this.onCloseBtnClick))}deleteTab(e){this.tabs.delete(e)}createTab(e,t=!0,i){const s=new e(i?void 0:this,t);return s.managers=this.managers,s}}},6024:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c,h:()=>h});var s=i(3241),n=i(3699),a=i(3624),o=i(319),r=i(2325),d=i(2230),l=i(8805);class c{constructor(e,t){this._constructor(e,t)}_constructor(e,t=!0){var i;this.slider=e,this.middlewareHelper=e?e.getMiddleware().create():(0,a.k)(),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=(0,d.Z)("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 l.ZP(this.content,void 0,void 0,!0),this.scrollable.attachBorderListeners(this.container),this.container.append(this.header,this.content),null===(i=this.slider)||void 0===i||i.addTab(this),this.listenerSetter=new n.Z}close(){return this.slider.closeTab(this)}open(...e){return t=this,i=void 0,n=function*(){if(this.init)try{const t=this.init(...e);this.init=null,t instanceof Promise&&(yield t)}catch(e){console.error("open tab error",e)}this.slider.selectTab(this)},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}init(...e){}onOpen(){}onOpenAfterTimeout(){}onClose(){}onCloseAfterTimeout(){var e,t,i;this.destroyable&&(null===(e=this.slider)||void 0===e||e.deleteTab(this),this.container.remove(),this.scrollable.destroy(),null===(t=this.listenerSetter)||void 0===t||t.removeAll(),null===(i=this.middlewareHelper)||void 0===i||i.destroy())}setTitle(e){this.title.replaceChildren((0,r.ag)(e))}}class h extends c{constructor(e){super(e),this.eventListener=new s.Z}onClose(){this.eventListener.dispatchEvent("close")}onCloseAfterTimeout(){const e=this.eventListener.dispatchResultableEvent("destroy");return this.eventListener.dispatchEvent("destroyAfter",Promise.all(e).then(o.Z,o.Z)),this.eventListener.cleanup(),super.onCloseAfterTimeout()}}},2894:(e,t,i)=>{"use strict";i.d(t,{Z:()=>p});var s=i(4277),n=i(8594),a=i(8487),o=i(4484),r=i(5565),d=i(3035),l=i(5345),c=i(5953),h=i(3061),u=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class p extends l.Z{constructor(e){let t;super({getIndex:e.getIndex||(e=>this.managers.appUsersManager.getUserStatusForSort(e.id)),onDelete:e=>{e.dom.listEl.remove(),this.onListLengthChange&&this.onListLengthChange()},onUpdate:e.onUpdate||(e=>u(this,void 0,void 0,(function*(){const t=(0,h.Z)(yield this.managers.appUsersManager.getUser(e.id));(0,r.Z)(e.dom.lastMessageSpan,t)}))),onSort:(e,t)=>{const i=e.dom.listEl.parentElement!==this.list;(0,o.Z)(e.dom.listEl,this.list,t),i&&this.onListLengthChange&&this.onListLengthChange()},onElementCreate:e=>{const{dom:t}=s.default.addDialogNew({peerId:e.id,container:!1,avatarSize:this.avatarSize,autonomous:this.autonomous,meAsSaved:!1,rippleEnabled:this.rippleEnabled,wrapOptions:{lazyLoadQueue:this.lazyLoadQueue}});return e.dom=t,e},updateElementWith:d.T2,updateListWith:e=>u(this,void 0,void 0,(function*(){return(0,a.Z)(this.list)?(yield(0,n.e9)(),(0,a.Z)(this.list)?void e(!0):e(!1)):e(!1)}))}),this.avatarSize="abitbigger",this.rippleEnabled=!0,this.autonomous=!0,(0,c.Z)(this,e),this.list=s.default.createChatList(this.createChatListOptions);const i=()=>{t=window.setTimeout((()=>{this.updateList((e=>{e&&i()}))}),p.SORT_INTERVAL)};i()}}p.SORT_INTERVAL=3e4},9259:(e,t,i)=>{"use strict";i.d(t,{Z:()=>I});var s=i(5432),n=i(3910),a=i(2738),o=i(5975),r=i(8497),d=i(8204),l=i(9405),c=i(3624),h=i(3035),u=i(5418),p=i(241),f=i(13),m=i(8115),g=i(5400),v=i(1447),b=i(3772),y=i(3512),w=i(5814),S=i(9099),C=i(3541),L=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};let E=!1;function I({listenTo:e,listenerSetter:t,selector:i,findTarget:I}){if(s.Z)return;const M=(t,s)=>{let n;if(I)n=I(t);else{const e=i||".media-sticker-wrapper";n=t.target.closest(e)}return!n||s&&!(0,o.Z)(n,e)?void 0:n},P=y.Z.managers;t.add(e)("mousedown",(e=>{if(E||e.buttons>1||0!==e.button)return;let t=M(e);if(!t)return;const i=t.dataset.docId;if(!i)return;const s="sticker-viewer",y="STICKER-VIEWER",I=w.Z.getOnlyOnePlayableGroup(),Z=(0,c.k)();let T,k;const x=({mediaContainer:e,doc:t,middleware:i,lockGroups:n,isSwitching:o})=>L(this,void 0,void 0,(function*(){const c=(0,f.Z)(t),S=e.getBoundingClientRect(),L=(0,l.C)(t.w,t.h),E=c?280:360,I=(0,l.C)(E,E),M=S.width===S.height?I:L.aspectFitted(I),Z=(0,r.Z)(e,"bubble"),k=!Z||Z.classList.contains("is-out"),x=document.createElement("div");x.classList.add(s+"-transformer");const A=document.createElement("div");A.classList.add(s+"-sticker"),A.style.width=M.width+"px",A.style.height=M.height+"px";const _=document.createElement("div");if(_.classList.add(s+"-emoji"),_.append((0,m.Z)(t.stickerEmojiRaw)),c){const e=(E*C.Vp-E)/3*(k?1:-1);x.classList.add("has-effect"),x.style.setProperty("--translateX",`${e}px`),_.style.setProperty("--translateX",-e+"px")}const F=(0,r.Z)(e,"scrollable"),D=(0,d.Z)(e,F,!0,S);(D.overflow.vertical||D.overflow.horizontal)&&A.classList.add("is-overflow");const R=e.getBoundingClientRect(),B=R.width/M.width,N=R.height/M.height,O=R.left-(p.Z.width-R.width)/2,U=R.top-(p.Z.height-R.height)/2;x.style.transform=`translate(${O}px, ${U}px) scale(${B}, ${N})`,o&&x.classList.add("is-switching"),x.append(A,_),T.append(x);const H=yield(0,C.ZP)({doc:t,div:A,group:y,width:M.width,height:M.height,play:!1,loop:!0,middleware:i,managers:P,needFadeIn:!1,isOut:k,withThumb:!1,relativeEffect:!0,loopEffect:!0}).then((({render:e})=>e));if(!i())return;T.parentElement||document.body.append(T);const z=Array.isArray(H)?H[0]:H,j=z instanceof b.Z?new Promise((e=>z.addEventListener("firstFrame",e,{once:!0}))):Promise.resolve();if(yield Promise.all([j,(0,h.d1)()]),yield(0,u.Z)(0),i()){if(n&&(w.Z.setOnlyOnePlayableGroup(y),w.Z.checkAnimations2(!0)),z instanceof b.Z){const t=e instanceof g.LD?e.player:v.Z.getAnimation(e);if(t){if(z.curFrame=t.curFrame,z.play(),yield new Promise((e=>{let t=0;const i=()=>{2==++t&&(e(),z.removeEventListener("enterFrame",i))};z.addEventListener("enterFrame",i)})),!i())return;z.pause()}}else if(z instanceof HTMLVideoElement){const t=e.querySelector("video");t&&(z.currentTime=t.currentTime)}return{ready:()=>{(z instanceof b.Z||z instanceof HTMLVideoElement)&&z.play(),c&&(0,a.tH)(A)},transformer:x}}})),A=window.setTimeout((()=>L(this,void 0,void 0,(function*(){document.removeEventListener("mousemove",F),T=document.createElement("div"),T.classList.add(s),E=!0;const e=Z.get(),n=yield P.appDocsManager.getDoc(i);if(!e())return;let a;try{if(a=yield x({doc:n,mediaContainer:t,middleware:e,lockGroups:!0}),!a)return}catch(e){return}const{ready:o,transformer:r}=a;k=r,(0,S.Z)({element:T,className:"is-visible",forwards:!0,duration:200,onTransitionEnd:()=>{e()&&o()}}),document.addEventListener("mousemove",_)}))),125),_=e=>L(this,void 0,void 0,(function*(){const i=M(e,!0);if(!i||t===i)return;const s=i.dataset.docId;if(!s)return;t=i,Z.clean();const n=Z.get(),a=yield P.appDocsManager.getDoc(s);if(!n())return;let o;try{if(o=yield x({doc:a,mediaContainer:t,middleware:n,isSwitching:!0}),!o)return}catch(e){return void console.error("sticker viewer error",e)}const{ready:r,transformer:d}=o,l=k;(0,S.Z)({element:l,className:"is-switching",forwards:!0,duration:200,onTransitionEnd:()=>{l.remove()}}),k=d,(0,S.Z)({element:d,className:"is-switching",forwards:!1,duration:200,onTransitionEnd:()=>{n()&&r()}})})),F=e=>{(0,o.Z)(e.target,t)||D()},D=()=>{clearTimeout(A),Z.clean(),T&&((0,S.Z)({element:T,className:"is-visible",forwards:!1,duration:200,onTransitionEnd:()=>{T.remove(),w.Z.setOnlyOnePlayableGroup(I),w.Z.checkAnimations2(!1),E=!1}}),(0,a.fc)(document.body,n.Z,{capture:!0,once:!0})),document.removeEventListener("mousemove",F),document.removeEventListener("mousemove",_),document.removeEventListener("mouseup",D,{capture:!0})};document.addEventListener("mousemove",F),document.addEventListener("mouseup",D,{once:!0,capture:!0})}))}},5117:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});class s{constructor(e,t){this.container=e,this.handler=t,this.observeHeaders(),this.observeElements()}observeHeaders(){this.headersObserver=new IntersectionObserver((e=>{for(const t of e){const e=t.boundingClientRect,i=t.target.parentElement,s=t.rootBounds;e.bottom=s.top&&e.bottom{const t=e.filter((e=>e.boundingClientRect.tope.boundingClientRect.top-t.boundingClientRect.top))[0];if(!t)return;const i=t.isIntersecting?t.target:t.target.nextElementSibling;this.handler(!0,i)}),{root:this.container})}addSentinel(e,t){const i=document.createElement("div");return i.classList.add("sticky_sentinel",t),e.appendChild(i)}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)}}},3757:(e,t,i)=>{"use strict";i.d(t,{Z:()=>E});var s=i(3910),n=i(5432),a=i(5953),o=i(3416),r=i(3699),d=i(6976),l=i(5418),c=i(3725),h=i(3228),u=i(5701),p=i(5003),f=i(3444),m=i(241);const g=e=>"touches"in e?e.touches[0]:e;function v(e,t){return t?Math.hypot(t.pageX-e.pageX,t.pageY-e.pageY):0}function b(e,t){return{x:(e.pageX+t.pageX)/2,y:(e.pageY+t.pageY)/2}}const y=document;let w=!1;o.Z.addEventListener("toggle",(e=>{w=e}));const S={passive:!1},C=!1,L={capture:!0,passive:!1};class E{constructor(e){var t,i,o,d,m;this.reset=e=>{var t,i,s;this.log("reset"),n.Z?this.listenerSetter.removeManual(y,"touchmove",this.handleMove,S):(this.listenerSetter.removeManual(y,"mousemove",this.handleMove,C),this.setCursorTo.style.cursor=""),this.hadMove&&(null===(t=this.onReset)||void 0===t||t.call(this)),null===(i=this.releaseWheelDrag)||void 0===i||i.clearTimeout(),null===(s=this.releaseWheelZoom)||void 0===s||s.clearTimeout(),this.resetValues()},this.handleStart=e=>{return t=this,i=void 0,a=function*(){var t,i;if(this.log("start"),this.isMouseDown){const t=e.touches;return void(2===(null==t?void 0:t.length)&&(this.initialDistance=v(t[0],t[1]),this.initialTouchCenter=b(t[0],t[1])))}const s=g(e);if(0!==Math.max(0,null!==(t=s.button)&&void 0!==t?t:0))return;if((0,f.Z)(e))return;const a=++this.tempId,o=null===(i=this.verifyTouchTarget)||void 0===i?void 0:i.call(this,e);if(void 0!==o){let e;if(o instanceof Promise){if(e=yield o,this.tempId!==a)return}else e=o;if(!e)return this.reset()}if(this.isMouseDown=!0,this.withDelay&&!n.Z){const e=Object.assign(Object.assign({},C),{once:!0}),t=(0,c.Z)(),i=()=>t.resolve(),s=this.listenerSetter.add(y)("mousemove",i,e);if(yield Promise.race([(0,l.Z)(300),t]),t.resolve(),this.listenerSetter.remove(s),this.tempId!==a)return}this.xDown=s.clientX,this.yDown=s.clientY,this.eventUp=s,n.Z?this.listenerSetter.add(y)("touchmove",this.handleMove,S):this.listenerSetter.add(y)("mousemove",this.handleMove,C),this.onStart&&(this.onStart(),this.hadMove=!0,this.handleMove(s))},new((s=void 0)||(s=Promise))((function(e,n){function o(e){try{d(a.next(e))}catch(e){n(e)}}function r(e){try{d(a.throw(e))}catch(e){n(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((a=a.apply(t,i||[])).next())}));var t,i,s,a},this.handleMove=e=>{var t,i;if(void 0===this.xDown||void 0===this.yDown||w)return void this.reset();if(this.cancelEvent&&(0,s.Z)(e),(null===(t=this.releaseWheelDrag)||void 0===t?void 0:t.isDebounced())||(null===(i=this.releaseWheelZoom)||void 0===i?void 0:i.isDebounced()))return;this.log("move");const n=this.eventUp=g(e),a=n.clientX,o=n.clientY,r=a-this.xDown+this.xAdded,d=o-this.yDown+this.yAdded;if(!this.hadMove){if(!r&&!d)return;this.setHadMove(e)}const l=e.touches;if(this.onZoom&&this.initialDistance>0&&2===l.length){const e=v(l[0],l[1]),t=b(l[0],l[1]),i=t.x-this.initialTouchCenter.x,s=t.y-this.initialTouchCenter.y,n={zoomFactor:e/this.initialDistance,initialCenterX:this.initialTouchCenter.x,initialCenterY:this.initialTouchCenter.y,dragOffsetX:i,dragOffsetY:s,currentCenterX:t.x,currentCenterY:t.y};this.onZoom(n)}this.dispatchOnSwipe(r,d,e)},this.handleWheel=e=>{var t;if(!this.hadMove&&this.verifyTouchTarget){const t=this.verifyTouchTarget(e);if(void 0!==t&&!t)return void this.reset(e)}if((0,s.Z)(e),this.log("wheel"),this.onDoubleClick&&Object.is(e.deltaX,-0)&&Object.is(e.deltaY,-0)&&e.ctrlKey)return this.onWheelCapture(e),this.onDoubleClick({centerX:e.pageX,centerY:e.pageY}),void this.reset();e.metaKey||e.ctrlKey||e.shiftKey?((null===(t=this.releaseWheelDrag)||void 0===t?void 0:t.isDebounced())&&this.reset(),this.onWheelZoom(e)):this.handleWheelDrag(e)},this.handleWheelDrag=e=>{this.log("wheel drag"),this.onWheelCapture(e),this.isDragCanceled.x&&Math.sign(this.initialDragOffset.x)!==Math.sign(e.deltaX)||(this.initialDragOffset.x-=e.deltaX),this.isDragCanceled.y&&Math.sign(this.initialDragOffset.y)!==Math.sign(e.deltaY)||(this.initialDragOffset.y-=e.deltaY);const{x:t,y:i}=this.initialDragOffset;this.releaseWheelDrag(e),this.dispatchOnSwipe(t,i,e,((e,t)=>{this.isDragCanceled={x:e,y:t}}))},this.onWheelCapture=e=>{this.hadMove||(this.log("wheel capture"),this.handleStart(e),this.setHadMove(e),this.initialTouchCenter={x:e.x,y:e.y})},this.onWheelZoom=e=>{if(!this.onZoom)return;this.log("wheel zoom"),this.onWheelCapture(e);const t=e.x-this.initialTouchCenter.x,i=e.y-this.initialTouchCenter.y,s=(0,h.Z)(e.deltaY,-25,25);this.wheelZoom-=.01*s;const n={zoomAdd:this.wheelZoom-1,initialCenterX:this.initialTouchCenter.x,initialCenterY:this.initialTouchCenter.y,dragOffsetX:t,dragOffsetY:i,currentCenterX:e.x,currentCenterY:e.y};this.onZoom(n),this.releaseWheelZoom(e)},(0,a.Z)(this,e),this.log=(0,p.kg)("SWIPE-HANDLER"),null!==(t=this.cursor)&&void 0!==t||(this.cursor="grabbing"),null!==(i=this.cancelEvent)&&void 0!==i||(this.cancelEvent=!0),null!==(o=this.listenerOptions)&&void 0!==o||(this.listenerOptions=S),null!==(d=this.setCursorTo)&&void 0!==d||(this.setCursorTo=this.element),this.listenerSetter=new r.Z,this.setListeners(),this.resetValues(),this.tempId=0,null===(m=e.middleware)||void 0===m||m.onDestroy((()=>{this.reset(),this.removeListeners()})),this.releaseWheelDrag=(0,u.Z)(this.reset,150,!1),this.releaseWheelZoom=(0,u.Z)(this.reset,150,!1)}setListeners(){n.Z?(this.withDelay?(0,d.E)({element:this.element,callback:e=>{(0,s.Z)(e),this.handleStart(e)},listenerSetter:this.listenerSetter,listenerOptions:this.listenerOptions}):this.listenerSetter.add(this.element)("touchstart",this.handleStart,this.listenerOptions),this.onDoubleClick&&this.listenerSetter.add(this.element)("dblclick",(e=>{this.onDoubleClick({centerX:e.pageX,centerY:e.pageY})})),this.listenerSetter.add(y)("touchend",this.reset)):(this.listenerSetter.add(this.element)("mousedown",this.handleStart,this.listenerOptions),this.listenerSetter.add(y)("mouseup",this.reset),(this.onZoom||this.onDoubleClick)&&this.listenerSetter.add(this.element)("wheel",this.handleWheel,L))}removeListeners(){this.log("remove listeners"),this.reset(),this.listenerSetter.removeAll()}setCursor(e=""){this.cursor=e,!n.Z&&this.hadMove&&this.setCursorTo.style.setProperty("cursor",this.cursor,"important")}add(e,t){this.xAdded=e,this.yAdded=t,this.handleMove({clientX:this.eventUp.clientX,clientY:this.eventUp.clientY,target:this.eventUp.target})}resetValues(){++this.tempId,this.hadMove=!1,this.xAdded=this.yAdded=0,this.xDown=this.yDown=this.eventUp=this.isMouseDown=void 0,this.onZoom&&(this.initialDistance=0,this.initialTouchCenter={x:m.Z.width/2,y:m.Z.height/2},this.initialDragOffset={x:0,y:0},this.isDragCanceled={x:!1,y:!1},this.wheelZoom=1)}setHadMove(e){var t;this.hadMove||(this.log("had move"),this.hadMove=!0,this.setCursorTo.style.setProperty("cursor",this.cursor,"important"),null===(t=this.onFirstSwipe)||void 0===t||t.call(this,e))}dispatchOnSwipe(...e){const t=this.onSwipe(...e);void 0!==t&&t&&this.reset()}}},709:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(2398),n=i(6272),a=i(4762),o=i(503);class r extends o.ZP{constructor(e={}){super(Object.assign({label:"Contacts.PhoneNumber.Placeholder",name:"phone"},e)),this.pasted=!1,this.lastValue="",this.container.classList.add("input-field-phone");const 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 i;a.IS_APPLE?i=-.16*e:a.IS_ANDROID&&(i=0),t.style.setProperty("--letter-spacing",i+"px")}const i=this.setValueSilently.bind(this);this.setValueSilently=e=>{i(e),(0,s.Z)(this.input,!0)}}t.addEventListener("input",(()=>{t.classList.remove("error");const i=this.value;let s;Math.abs(i.length-this.lastValue.length)>1&&!this.pasted&&a.IS_APPLE_MOBILE&&this.setValueSilently(this.lastValue+i),this.pasted=!1,this.setLabel();let o,r,d,l="";"+"===this.value.replace(/\++/,"+")?this.setValueSilently("+"):(s=(0,n.u)(this.value),o=s.formatted,r=s.country,l=s.leftPattern,d=s.code,this.setValueSilently(this.lastValue=o?"+"+o:"")),t.dataset.leftPattern=l,e.onInput&&e.onInput(s)})),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}))}}},2796:(e,t,i)=>{"use strict";i.d(t,{Am:()=>c,PE:()=>l,bC:()=>h});var s=i(5565),n=i(2296),a=i(2325);const o=document.createElement("div");let r;o.classList.add("toast");const d=new n.Z("toast");function l(){d.close(),o.classList.remove("is-visible"),r&&clearTimeout(+r),r=window.setTimeout((()=>{o.remove(),r=void 0}),200)}function c(e,t){d.close(),(0,s.Z)(o,e),o.parentElement||(document.body.append(o),o.offsetLeft),o.classList.add("is-visible"),r&&clearTimeout(+r),d.open(o),r=window.setTimeout(l,3e3),t&&d.addEventListener("toggle",t,{once:!0})}function h(e){c((0,a.ag)(e.langPackKey,e.langPackArguments),e.onClose)}d.addEventListener("toggle",(e=>{e||l()}))},426:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l});var s=i(3512),n=i(3725),a=i(8594),o=i(2648),r=i(3910);const d={navigation:{callback:(e,t,i)=>{const s=t.getBoundingClientRect().width,n=[e,t];return i&&n.reverse(),n[0].style.filter="brightness(80%)",n[0].style.transform=`translate3d(${.25*-s}px, 0, 0)`,n[1].style.transform=`translate3d(${s}px, 0, 0)`,e.classList.add("active"),e.offsetWidth,e.style.transform="",e.style.filter="",()=>{t.style.transform=t.style.filter=""}},animateFirst:!1},tabs:{callback:(e,t,i)=>{const s=t.getBoundingClientRect().width,n=[e,t];return i&&n.reverse(),n[0].style.transform=`translate3d(${-s}px, 0, 0)`,n[1].style.transform=`translate3d(${s}px, 0, 0)`,e.classList.add("active"),e.offsetWidth,e.style.transform="",()=>{t.style.transform=""}},animateFirst:!1}},l=e=>{let{content:t,type:i,transitionTime:l,onTransitionEnd:c,isHeavy:h=!0,once:u=!1,withAnimationListener:p=!0,listenerSetter:f,animateFirst:m=!1}=e;const{callback:g,animateFirst:v}=d[i]||{};t.dataset.animation=i,void 0!==v&&(m=v);const b=new Map;let y,w=null;if(p){const e=g?"transitionend":"animationend",i=s=>{if((0,r.Z)(s),s.target.parentElement!==t)return;const n=b.get(s.target);null==n||n(),s.target===w&&(!y&&h||(y&&(y.resolve(),y=void 0),null==c||c(S.prevId()),t.classList.remove("animating","backwards","disable-hover"),u&&(f?f.removeManual(t,e,i):t.removeEventListener(e,i),w=y=void 0,b.clear())))};f?f.add(t)(e,i):t.addEventListener(e,i)}function S(e,i=!0,r){r&&(w=r),e instanceof HTMLElement&&(e=(0,o.Z)(e));const d=S.prevId();if(e===d)return!1;const u=t.children[e];if(s.Z.settings.animationsEnabled&&(-1!==d||m)||(i=!1),!p){const e=t.dataset.timeout;void 0!==e&&clearTimeout(+e),delete t.dataset.timeout}if(!i){if(w)w.classList.remove("active","to","from");else if(u){const e=b.get(u);null==e||e()}return u&&(u.classList.remove("to","from"),u.classList.add("active")),t.classList.remove("animating","backwards","disable-hover"),w=u,void(null==c||c(e))}p||(t.dataset.timeout=""+window.setTimeout((()=>{u.classList.remove("to"),w&&w.classList.remove("from"),t.classList.remove("animating","backwards","disable-hover"),delete t.dataset.timeout}),l)),w&&(w.classList.remove("to"),w.classList.add("from")),t.classList.add("animating");const f=d{u.classList.remove("to"),b.delete(u)}))}if(w){let e;const t=w,i=()=>{clearTimeout(e),t.classList.remove("active","from"),null==v||v(),b.delete(t)};u?(e=window.setTimeout(i,l+100),b.set(t,i)):(e=window.setTimeout(i,l),b.set(t,(()=>{clearTimeout(e),b.delete(t)}))),t.dataset.transitionTimeout=""+e,h&&(y||(y=(0,n.Z)()),(0,a.YW)(y,2*l))}w=u}return S.prevId=()=>w?(0,o.Z)(w):-1,S.getFrom=()=>w,S.setFrom=e=>w=e,S}},6726:(e,t,i)=>{"use strict";i.d(t,{l:()=>o});var s=i(5701),n=i(503);function a(e){return(e.length>=3&&e.length<=32||!e.length)&&/^[a-zA-Z0-9_]*$/.test(e)}class o extends n.ZP{constructor(e,t){super(e),this.managers=t,this.checkUsernameDebounced=(0,s.Z)(this.checkUsername.bind(this),150,!1,!0),e.listenerSetter.add(this.input)("input",(()=>{var e,t,i,s;const o=this.getValue();if(this.error=void 0,o===this.originalValue||!o.length)return this.setState(n.I1.Neutral),void(null===(t=(e=this.options).onChange)||void 0===t||t.call(e));a(o)?this.setState(n.I1.Neutral):this.setError(this.options.invalidText),this.input.classList.contains("error")?null===(s=(i=this.options).onChange)||void 0===s||s.call(i):this.checkUsernameDebounced(o)}))}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){if(this.checkUsernamePromise)return;let t;this.error=void 0,t=this.options.peerId?this.managers.appChatsManager.checkUsername(this.options.peerId.toChatId(),e):this.managers.appUsersManager.checkUsername(e);const i=this.checkUsernamePromise=t.then((t=>{this.getValue()===e&&(t?this.setState(n.I1.Valid,this.options.availableText):this.setError(this.options.takenText))}),(t=>{this.getValue()===e&&(this.error=t,"USERNAME_PURCHASE_AVAILABLE"===t.type?this.setError(this.options.takenText):this.setError(this.options.invalidText))})).then((()=>{var t,s;this.checkUsernamePromise===i&&(this.checkUsernamePromise=void 0),null===(s=(t=this.options).onChange)||void 0===s||s.call(t);const n=this.getValue();n!==e&&this.isValidToChange()&&a(n)&&this.checkUsername(n)}))}}},9522:(e,t,i)=>{"use strict";i.d(t,{Z:()=>g});var s=i(2738),n=i(5975),a=i(2398),o=i(4484),r=i(2914),d=i(319),l=i(5345),c=i(2325),h=i(3512),u=i(5592),p=i(7479),f=i(5029),m=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class g extends f.Z{constructor(e){super({name:"UsernamesProfileHeader",caption:e.peerId.isUser()?"UsernamesProfileHelp":"UsernamesChannelHelp"});const{peerId:t,peer:i,usernameInputField:f,listenerSetter:g,middleware:v}=e,b=h.Z.managers,y=t.isUser()?void 0:t.toChatId(),w=this,S="usernames",C=document.createElement("div");let L;C.classList.add(S);const E=new l.Z({getIndex:e=>L.length-L.findIndex((t=>t.username===e.id)),onDelete:e=>{e.row.container.remove()},onSort:(e,t)=>{(0,o.Z)(e.row.container,C,t)},onElementCreate:e=>{const t=L.find((t=>t.username===e.id)),i=new p.ZP({title:"@"+t.username,subtitle:!0,clickable:!0}),s=!!t.pFlags.editable,n=!!t.pFlags.active;return s&&(i.container.dataset.editable="1"),i.container.dataset.username=t.username,i.container.classList.add(S+"-username"),i.subtitle.classList.add(S+"-username-status"),i.createMedia("medium").classList.add(S+"-username-icon","tgico"),i.makeSortable(),I(i,n),e.row=i,e}}),I=(e,t)=>{e.subtitle.replaceChildren((0,c.ag)(e.container.dataset.editable?"UsernameLinkEditable":t?"UsernameLinkActive":"UsernameLinkInactive")),e.container.classList.toggle("active",t),e.toggleSorting(t)},M=(e=[])=>{L=e,E.getAll().forEach((t=>{e.some((e=>e.username===t.id))||E.delete(t.id)})),e.forEach((e=>{if(E.has(e.username)){const t=E.get(e.username);E.update(e.username,t),I(t.row,!!e.pFlags.active)}else E.add(e.username)})),w.container.classList.toggle("hide",!E.getAll().size)};M(i.usernames),g.add(h.Z)("peer_title_edit",(({peerId:e})=>m(this,void 0,void 0,(function*(){if(e!==t)return;const i=yield b.appPeersManager.getPeer(t);M(i.usernames)}))));let P=!1;(0,s.fc)(C,(e=>m(this,void 0,void 0,(function*(){if(P)return void(P=!1);const t=(0,n.Z)(e.target,C);if(!t)return;if(t.dataset.editable)return void(0,a.Z)(f.input,!0,!0);const i=t.dataset.username,s=t.classList.contains("active");let o,r;s?(o="UsernameDeactivateLink",r=y?"UsernameDeactivateLinkChannelMessage":"UsernameDeactivateLinkProfileMessage"):(o="UsernameActivateLink",r=y?"UsernameActivateLinkChannelMessage":"UsernameActivateLinkProfileMessage");try{yield(0,u.Z)({titleLangKey:o,descriptionLangKey:r,button:{langKey:s?"Hide":"Show"}})}catch(e){return}const l=!s;let c;c=y?b.appChatsManager.toggleUsername(y,i,l):b.appUsersManager.toggleUsername(i,l),c.catch((e=>{"USERNAMES_ACTIVE_TOO_MUCH"===e.type?(0,u.Z)({titleLangKey:"UsernameActivateErrorTitle",descriptionLangKey:"UsernameActivateErrorMessage",button:{langKey:"OK",isCancel:!0}}).catch(d.Z):console.error("turn username error",e)}))})))),new r.Z({list:C,middleware:v,onSort:(e,t)=>{const i=L.splice(e,1)[0];L.splice(t,0,i),E.updateList();const s=L.filter((e=>e.pFlags.active)).map((e=>e.username));y?b.appChatsManager.reorderUsernames(y,s):b.appUsersManager.reorderUsernames(s)}}),w.content.append(C)}}},2940:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});class s{constructor(e,t){this.items=new Map,this.locked=!1,this.observer=new IntersectionObserver((t=>{if(this.locked)return;const i=[];t.forEach(((e,t)=>{const s=e.target;if(this.items.get(s)===e.isIntersecting)return;this.items.set(s,e.isIntersecting);const n={target:s,visible:e.isIntersecting,entry:e,index:t};i.push(n)})),i.forEach((t=>{e(t)}))}),t)}getVisible(){const e=[];return this.items.forEach(((t,i)=>{t&&e.push(i)})),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}}},8427:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(3910),n=i(2738),a=i(3013),o=i(65);class r extends o.Z{constructor(e,t=!1){super({step:.01,min:0,max:1,vertical:t},1),this.listenerSetter=e,this.vertical=t,this.onMuteClick=e=>{e&&(0,s.Z)(e),a.Z.muted=!a.Z.muted},this.setVolume=()=>{const{volume:e,muted:t}=a.Z;let i;i=!e||t?0:e>.5?3:e>0&&e<.25?1:2,r.ICONS.forEach((e=>this.icon.classList.remove("tgico-"+e))),this.icon.classList.add("tgico-"+r.ICONS[i]),this.mousedown||this.setProgress(t?0:e)},this.setListeners(),this.setHandlers({onScrub:e=>{const t=Math.max(Math.min(e,1),0);a.Z.muted=!1,a.Z.volume=t}});const i="player-volume",o=this.btn=document.createElement("div");o.classList.add("btn-icon",i);const d=this.icon=document.createElement("span");d.classList.add(i+"__icon"),o.append(d,this.container),(0,n.fc)(d,this.onMuteClick,{listenerSetter:this.listenerSetter}),this.listenerSetter.add(a.Z)("playbackParams",this.setVolume),this.setVolume()}}r.ICONS=["volume_off","volume_mute","volume_down","volume_up"]},9083:(e,t,i)=>{"use strict";i.d(t,{N:()=>a,Z:()=>n});var s=i(5400);function n({docIds:e,loadPromises:t,middleware:i,lazyLoadQueue:n,customEmojiSize:a,animationGroup:o}){const r=" ".repeat(e.length),d=[];return e.forEach(((e,t)=>{d.push({_:"messageEntityCustomEmoji",offset:t,length:1,document_id:e})})),(0,s.ZP)(r,{entities:d,loadPromises:t,animationGroup:o,customEmojiSize:a,middleware:i,lazyLoadQueue:n})}function a(e){var t;const i=null!==(t=e.loadPromises)&&void 0!==t?t:e.loadPromises=[],s=n(e);return Promise.all(i).then((()=>s))}},296:(e,t,i)=>{"use strict";i.d(t,{Z:()=>I});var s=i(2341),n=i(467),a=i(632),o=i(2738),r=i(8497),d=i(4081),l=i(319),c=i(2312),h=i(9322),u=i(1243),p=i(7030),f=i(2325),m=i(1507),g=i(2491),v=i(3512),b=i(8448),y=i(3251),w=i(3442),S=i(9492),C=i(5671),L=i(1604),E=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function I({message:e,withTime:t,fontWeight:i,voiceAsMusic:I,showSender:M,searchContext:P,loadPromises:Z,autoDownloadSize:T,lazyLoadQueue:k,sizeType:x,managers:A=v.Z.managers,cacheContext:_,fontSize:F,getSize:D}){var R;return E(this,void 0,void 0,(function*(){null!=i||(i=500),null!=x||(x=""),null!=F||(F=16);const B=0===T,N=e.media.document||e.media.webpage.document,O=null==e?void 0:e.uploadingFileName;if("audio"===N.type||"voice"===N.type||"round"===N.type){const s=new b.ZP;return s.withTime=t,s.message=e,s.noAutoDownload=B,s.lazyLoadQueue=k,s.loadPromises=Z,s.getSize=D,I&&(s.voiceAsMusic=I),P&&(s.searchContext=P),M&&(s.showSender=M),s.dataset.fontWeight=""+i,s.dataset.fontSize=""+F,s.dataset.sizeType=x,yield s.render(),s}const U=N.file_name?N.file_name.split("."):"";let H="";H=U.length>1&&Array.isArray(U)?(0,n.ST)(U.pop().split(" ",1)[0].toLowerCase()):"file";const z=document.createElement("div");z.classList.add("document",`ext-${H}`),z.dataset.docId=""+N.id,z.doc=N;const j=document.createElement("div");let G;j.classList.add("document-ico");const V=!!_,K=()=>V?_:A.thumbsStorage.getCacheContext(N);_=yield K();let W=!1;if((null===(R=N.thumbs)||void 0===R?void 0:R.length)||e.pFlags.is_outgoing&&_.url&&"photo"===N.type){z.classList.add("document-with-thumb"),W=!0;const t=[];if(e.pFlags.is_outgoing&&["photo","video"].includes(N.type)&&_.url)j.innerHTML=``,t.push(j.firstElementChild);else{performance.now();const e=yield(0,S.Z)({photo:N,message:null,container:j,boxWidth:54,boxHeight:54,loadPromises:Z,withoutPreloader:!0,lazyLoadQueue:k,size:(0,p.Z)(N,54,54,!0),managers:A});j.style.width=j.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 G=document.createElement("span"),G.classList.add("document-ico-text"),G.innerText=H,j.append(G);const $=N.file_name?(0,g.Z)(N.file_name):"Unknown.file";document.createElement("div").classList.add("document-description");const q=document.createElement("span"),Y=[(0,d.Z)(N.size)];if(t&&Y.push((0,a.OD)(e.date)),M&&Y.push(yield(0,C.Z)(e)),!t&&!M){const e=document.createElement("span"),t=(0,d.Z)(N.size);e.append(" / ",t),e.style.visibility="hidden",Y.push(e)}z.innerHTML=`\n ${_.downloaded&&!O||!e.mid||!W?"":'
'}\n
\n
\n `;const Q=z.querySelector(".document-name"),X=new y.I;X.dataset.fontWeight=""+i,X.dataset.fontSize=""+F,X.dataset.sizeType=x,X.getSize=D,X.textContent=$,e.mid||z.classList.add("downloaded"),Q.append(X),M&&Q.append((0,L.Z)(e));const J=z.querySelector(".document-size");if(q.append(...(0,f.A1)(Y," ยท ")),J.append(q),z.prepend(j),!O&&e.pFlags.is_outgoing&&!e.mid)return z;let ee,te=null;const ie=()=>{if(z.classList.remove("downloading"),N.size>m.Iw&&!O)return te.setManual(),te.attach(ee),te.preloader.classList.add("manual"),void te.setDownloadFunction(ne);if(N.size<=m.Iw&&z.classList.add("downloaded"),ee){if(ee!==j){const e=ee;setTimeout((()=>{e.remove()}),200)}ee=null}te&&(te=null)},se=e=>{z.classList.add("downloading");const t=document.createElement("span"),i=(0,d.Z)(N.size);t.style.position="absolute",t.style.left="0",e.then(ie,l.Z).finally((()=>{q.style.visibility="",t.remove()}));const s=e=>(0,d.Z)(e);let n=s(0);q.style.visibility="hidden",t.append(n," / ",i),q.parentElement.append(t),e.addNotifyListener((e=>{const t=s(e.done);n.replaceWith(t),n=t}))},ne=e=>{var t;const i=!e||e.isTrusted,n=z.doc;let a;const o=h.ZP.chat.bubbles?h.ZP.chat.bubbles.lazyLoadQueue.queueId:void 0;if(i)if("pdf"===n.type){const e=!te||te.detached;a=c.Z.downloadMediaURL({media:n,queueId:o}),e&&a.then((()=>{setTimeout((()=>E(this,void 0,void 0,(function*(){const e=(yield K()).url;window.open(e)}))),v.Z.settings.animationsEnabled?250:0)}))}else a=s.Z.has(n.mime_type)&&(null===(t=n.thumbs)||void 0===t?void 0:t.length)?c.Z.downloadMediaURL({media:n,queueId:o}):c.Z.downloadToDisc({media:n,queueId:o});else a=c.Z.downloadToDisc({media:n,queueId:o},!0);a.catch((()=>{z.classList.remove("downloading")})),ee&&(te.attach(ee,!0,a),se(a))},{fileName:ae}=(0,u.Z)({media:N,downloadId:"1"});if(yield A.apiFileManager.isDownloading(ae)){ee=z.querySelector(".document-download")||j;const e=c.Z.downloadToDisc({media:N},!0);te=new w.Z,te.attach(ee,!1,e),te.setDownloadFunction(ne),se(e)}else if(!_.downloaded||O)if(ee=z.querySelector(".document-download")||j,te=new w.Z({isUpload:!!O}),O){const e=c.Z.getUpload(O);te.attachPromise(e),te.attach(ee),se(e)}else te.construct(),te.setManual(),te.attach(ee),te.setDownloadFunction(ne),void 0!==T&&T>=N.size&&(0,o.tH)(te.preloader);return(0,o.fc)(z,(e=>{(0,r.Z)(e.target,"time")||(te?te.onClick(e):ne(e))})),z}))}v.Z.addEventListener("document_downloading",(e=>{Array.from(document.querySelectorAll(`.document[data-doc-id="${e}"]`)).forEach((e=>{e.querySelector(".preloader-container.manual")&&(0,o.tH)(e)}))}))},8210:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(6272);function n(e){return"+"+(0,s.u)(e).formatted}},177:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(2575),n=i(2325),a=i(3512);function o(e,t=a.Z.managers){var i,o,r,d,l,c;return r=this,d=void 0,c=function*(){const a=yield t.appChatsManager.getChat(e);if("chatForbidden"===a._)return(0,n.ag)("YouWereKicked");const r=yield t.appProfileManager.getCachedFullChat(e);let d;d=r?"channelFull"===r._?r.participants_count:null===(i=r.participants.participants)||void 0===i?void 0:i.length:a.participants_count||(null===(o=a.participants)||void 0===o?void 0:o.participants.length),d=d||1;const l=a.pFlags.broadcast?"Peer.Status.Subscribers":"Peer.Status.Member";return(0,n.ag)(l,[(0,s.Z)(d)])},new((l=void 0)||(l=Promise))((function(e,t){function i(e){try{n(c.next(e))}catch(e){t(e)}}function s(e){try{n(c.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof l?n:new l((function(e){e(n)}))).then(i,s)}n((c=c.apply(r,d||[])).next())}))}},493:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(8456),n=i(5102),a=i(2325),o=i(8115),r=i(3512);function d(e){return t=this,i=void 0,l=function*(){const{peerId:t=r.Z.myId,plainText:i,onlyFirstName:d,limitSymbols:l,managers:c=r.Z.managers,threadId:h}=e;let u="";if(t.isUser()){const e=yield c.appUsersManager.getUser(t.toUserId());e&&(e.first_name&&(u+=e.first_name),!e.last_name||d&&u||(u+=" "+e.last_name)),u=u?u.trim():!e||e.pFlags.deleted?a.ZP.format(d?"Deleted":"HiddenName",!0):(0,n.Z)(e)[0]||""}else{if(h){const e=yield c.dialogsStorage.getForumTopic(t,h);u=(null==e?void 0:e.title)||""}if(!u){const e=yield c.appChatsManager.getChat(t.toChatId());u=(null==e?void 0:e.title)||""}d&&(u=u.split(" ")[0])}return void 0!==l&&(u=(0,s.Z)(u,l,l)),i?u:(0,o.Z)(u)},new((d=void 0)||(d=Promise))((function(e,s){function n(e){try{o(l.next(e))}catch(e){s(e)}}function a(e){try{o(l.throw(e))}catch(e){s(e)}}function o(t){var i;t.done?e(t.value):(i=t.value,i instanceof d?i:new d((function(e){e(i)}))).then(n,a)}o((l=l.apply(t,i||[])).next())}));var t,i,d,l}},3061:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(632),n=i(2325),a=i(1507);function o(e){var t;if(!e)return document.createElement("span");let i,o;switch(e.id){case a.hj.toUserId():i="Peer.RepliesNotifications";break;case a.yF.toUserId():i="Peer.ServiceNotifications";break;default:if(e.pFlags.bot){i="Bot";break}if(e.pFlags.support){i="SupportStatus";break}switch(null===(t=e.status)||void 0===t?void 0:t._){case"userStatusRecently":i="Lately";break;case"userStatusLastWeek":i="WithinAWeek";break;case"userStatusLastMonth":i="WithinAMonth";break;case"userStatusOffline":{const t=e.status.was_online,n=new Date,a=(n.getTime()/1e3|0)-t;if(a<60)i="Peer.Status.justNow";else if(a<3600)i="Peer.Status.minAgo",o=[a/60|0];else if(a<86400&&n.getDate()===new Date(1e3*t).getDate())i="LastSeen.HoursAgo",o=[a/3600|0];else{i="Peer.Status.LastSeenAt";const{dateEl:e,timeEl:n}=(0,s.rz)(t);o=[e,n]}break}case"userStatusOnline":i="Online";break;default:i="ALongTimeAgo"}}return(0,n.ag)(i,o)}},6131:(e,t,i)=>{"use strict";i.d(t,{MR:()=>d,ZP:()=>c,kN:()=>l});var s=i(3910),n=i(1046),a=i(319),o=i(6628),r=i(9099);function d(e){const{mediaSpoiler:t,reveal:i,destroyAfter:s}=e;(0,r.Z)({element:t,forwards:i,className:"is-revealing",duration:250,onTransitionEnd:()=>{i&&s&&(t.remove(),t.middlewareHelper.destroy())}})}function l(e){const{mediaSpoiler:t,event:i}=e;if((0,s.Z)(i),t.classList.contains("is-revealing"))return;const n=t.parentElement.querySelector("video");n&&!t.parentElement.querySelector(".video-play")&&(n.autoplay=!0,n.play().catch(a.Z)),d({mediaSpoiler:t,reveal:!0,destroyAfter:!0})}function c(e){return t=this,i=void 0,a=function*(){const{media:t}=e,i=(t.sizes||t.thumbs).find((e=>"photoStrippedSize"===e._));if(!i)return;const{image:s,loadPromise:a}=(0,n.Z)(t,i,!0);return yield a,function(e){const{middleware:t,image:i}=e;if(!t())return;i.classList.add("media-spoiler-thumbnail");const s=document.createElement("div");s.classList.add("media-spoiler-container"),s.middlewareHelper=t.create();const n=o.Z.create(Object.assign(Object.assign({},e),{middleware:s.middlewareHelper.get()}));return s.append(i,n.canvas),s}(Object.assign(Object.assign({},e),{image:s}))},new((s=void 0)||(s=Promise))((function(e,n){function o(e){try{d(a.next(e))}catch(e){n(e)}}function r(e){try{d(a.throw(e))}catch(e){n(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((a=a.apply(t,i||[])).next())}));var t,i,s,a}},6239:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(9345);function n(e){return t=this,i=void 0,a=function*(){try{return yield(0,s.Z)(e)}catch(t){return console.error("wrapMessageActionTextNewUnsafe error:",t),e.plain?"":document.createElement("span")}},new((n=void 0)||(n=Promise))((function(e,s){function o(e){try{d(a.next(e))}catch(e){s(e)}}function r(e){try{d(a.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(t,i||[])).next())}));var t,i,n,a}},9345:(e,t,i)=>{"use strict";i.d(t,{Z:()=>F,e:()=>x});var s=i(1655),n=i(632),a=i(2614),o=i(130),r=i(8939),d=i(5180),l=i(2946),c=i(2325),h=i(1507),u=i(8115),p=i(2491),f=i(5400),m=i(3512),g=i(2064),v=i(5798);let b,y,w;const S=new Map;var C=i(9083),L=i(493),E=i(3591);function I(e){const t=e.action,{onclick:i,url:s}=(0,E.Z)(`tg://voicechat?chat_id=${e.peerId.toChatId()}&id=${t.call.id}&access_hash=${t.call.access_hash}`);if(!i)return document.createElement("span");const n=document.createElement("a");return n.href=s,n.setAttribute("onclick",i+"(this)"),n}var M=i(496),P=i(7362),Z=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function T(e){return Z(this,void 0,void 0,(function*(){const t=yield(0,M.Z)(e);if(e.plain)return t;const i=document.createElement("i");return i.dataset.savedFrom=e.message.peerId+"_"+e.message.mid,i.dir="auto",i.append(t),i}))}function k(e,t){return t?e:(0,a.Z)((0,u.Z)(e))}function x(e){return Z(this,void 0,void 0,(function*(){const t=e.topic;let i=null==t?void 0:t.icon_emoji_id;return(null==t?void 0:t.id)===h.Ox&&(i="5390854796011906616"),i?e.plain?m.Z.managers.appEmojiManager.getCustomEmojiDocument(i).then((e=>e.stickerEmojiRaw)):(0,C.N)(Object.assign(Object.assign({},e),{docIds:[i]})).then((e=>(e.lastElementChild.classList.add("topic-icon"),e))):e.plain?"":function(e,t){if(!b){w=document.getElementById("svg-defs");const e="http://www.w3.org/2000/svg";b=document.createElementNS(e,"svg"),b.setAttributeNS(null,"width","26"),b.setAttributeNS(null,"height","26"),b.setAttributeNS(null,"viewBox","0 0 26 26"),b.classList.add("topic-icon-svg");const t=document.createElementNS(e,"use");t.setAttributeNS(null,"href","#topic-icon"),b.append(t),y=document.createElement("span"),y.classList.add("topic-icon","avatar-like");const i=document.createElement("span");i.classList.add("topic-icon-content"),y.append(b,i)}e||(console.error("NO TOPIC ICON COLOR!"),e=h.OS[0]),t||(console.error("NO TOPIC NAME!"),t="");const i=e.toString(16),s=`topic-icon-gradient-${e}`;let n=S.get(e);if(!n){const{h:t,s:a,l:o,a:r}=(0,g.cw)("#"+i);w.insertAdjacentHTML("beforeend",`\n \n \n \n \n `),S.set(e,n=`hsla(${t}, ${a}%, ${Math.max(0,o-40)}%, ${r})`)}const a=y.cloneNode(!0);return a.firstElementChild.style.fill=`url(#${s})`,a.firstElementChild.style.stroke=n,a.lastElementChild.append((0,v.Z)(t,!0)),a}(null==t?void 0:t.icon_color,null==t?void 0:t.title)}))}function A(e){const t=e.message.action;return x(Object.assign(Object.assign({},e),{topic:t}))}function _(e){return Z(this,void 0,void 0,(function*(){const t=e.message.action,i=document.createElement("span");return i.classList.add("topic-name"),i.append(yield A(e),k(t.title,e.plain)),i}))}function F(e){var t;return Z(this,void 0,void 0,(function*(){const{plain:i,message:h,middleware:g,lazyLoadQueue:v,customEmojiSize:b,animationGroup:y}=e,w=i?void 0:document.createElement("span"),S="action"in h&&h.action;if(S.message){const e=S.message;return i?(0,p.Z)(e):((0,o.Z)(w,(0,f.ZP)(e,{noLinebreaks:!0})),w)}{let o,p,g=S._;const v=m.Z.managers,b=(e,t)=>t?(0,L.Z)({peerId:e,plainText:t}):(0,P.Z)({peerId:e});switch(S._){case"messageActionPhoneCall":g+="."+S.type,p=[(0,r.Z)(S.duration,i)];break;case"messageActionGroupCall":g+="."+S.type,p=[],g.endsWith("You")||h.pFlags.post||p.push(b(h.fromId,i)),void 0!==S.duration?p.push((0,r.Z)(S.duration,i)):p.push(I(h));break;case"messageActionInviteToGroupCall":{const e=[h.fromId,S.users[0].toPeerId()];let t="Chat.Service.VoiceChatInvitation";const n=m.Z.myId;e[0]===n?t+="ByYou":e[1]===n&&(t+="ForYou"),(0,s.Z)(e,n),o=t,p=e.map((e=>b(e,i))),p.push(I(h));break}case"messageActionGroupCallScheduled":{const e=new Date,t=new Date(1e3*S.schedule_date),s=(t.getTime()-e.getTime())/864e5,a=new Date(e);a.setDate(a.getDate()+1);const r=yield v.appPeersManager.isBroadcast(h.peerId);o=r?"ChatList.Service.VoiceChatScheduled.Channel":"ChatList.Service.VoiceChatScheduled",p=[];const d=m.Z.myId;let l;h.fromId===d?o+="You":r||p.push(b(h.fromId,i));const u=[];s<1&&t.getDate()===e.getDate()?l="TodayAtFormattedWithToday":s<2&&t.getDate()===a.getDate()?l="Time.TomorrowAt":(l="formatDateAtTime",u.push(new c.ZP.IntlDateElement({date:t,options:{day:"2-digit",month:"2-digit",year:"2-digit"}}).element)),u.push((0,n.mr)(t));const f=(0,c.ag)(l,u);p.push(f);break}case"messageActionChatCreate":{const e=m.Z.myId;h.fromId===e?g+="You":p=[b(h.fromId,i)];break}case"messageActionPinMessage":{const t=h.peerId,s=yield v.appMessagesManager.getMessageByPeer(t,h.reply_to_mid);p=[b(h.fromId,i)],s?p.push(T(Object.assign(Object.assign({},e),{message:s}))):(o="ActionPinnedNoText",h.reply_to_mid&&v.appMessagesManager.fetchMessageReplyTo(h));break}case"messageActionChatJoinedByRequest":{const e=yield v.appPeersManager.isBroadcast(h.peerId);h.pFlags.out?o=e?"RequestToJoinChannelApproved":"RequestToJoinGroupApproved":(o=e?"ChatService.UserJoinedChannelByRequest":"ChatService.UserJoinedGroupByRequest",p=[b(h.fromId,i)]);break}case"messageActionContactSignUp":case"messageActionChatReturn":case"messageActionChatLeave":case"messageActionChatJoined":case"messageActionChatEditPhoto":case"messageActionChatDeletePhoto":case"messageActionChatEditVideo":case"messageActionChatJoinedByLink":case"messageActionChannelEditVideo":case"messageActionChannelDeletePhoto":p=[b(h.fromId,i)];break;case"messageActionChannelEditTitle":case"messageActionChatEditTitle":p=[],"messageActionChatEditTitle"===S._&&p.push(b(h.fromId,i)),p.push(k(S.title));break;case"messageActionChatDeleteUser":case"messageActionChatAddUsers":case"messageActionChatAddUser":{const e=S.users||[S.user_id];if(p=[b(h.fromId,i)],e.length>1){const t=(0,c.v_)(yield Promise.all(e.map((e=>b(e.toPeerId(),i)))),!1,i);if(i)p.push(...t);else{const e=document.createElement("span");e.append(...t),p.push(e)}}else p.push(b(e[0].toPeerId(),i));break}case"messageActionBotAllowed":{const e=(0,f.ZP)(S.domain,{entities:[{_:"messageEntityUrl",length:S.domain.length,offset:0}]});p=[(0,a.Z)(e)];break}case"messageActionPaymentSent":{const s=S.pFlags.recurring_init,n=S.pFlags.recurring_used;if(o=n?"Chat.Service.PaymentSentRecurringUsedNoTitle":s?"Chat.Service.PaymentSentRecurringInitNoTitle":"Chat.Service.PaymentSent1NoTitle",p=[(0,d.Z)(S.total_amount,S.currency),b(h.peerId,i)],h.reply_to_mid){const i=yield v.appMessagesManager.getMessageByPeer((null===(t=h.reply_to)||void 0===t?void 0:t.reply_to_peer_id)?(0,l.Z)(h.reply_to.reply_to_peer_id):h.peerId,h.reply_to_mid);i?(o=n?"Chat.Service.PaymentSentRecurringUsed":s?"Chat.Service.PaymentSentRecurringInit":"Chat.Service.PaymentSent1",p.push(T(Object.assign(Object.assign({},e),{message:i})).then((e=>(e instanceof HTMLElement&&e.classList.add("is-receipt-link"),e))))):v.appMessagesManager.fetchMessageReplyTo(h)}break}case"messageActionSetMessagesTTL":{p=[];const e=yield v.appPeersManager.isBroadcast(h.peerId);if(S.period){let t;if(e?o="ActionTTLChannelChanged":h.fromId===m.Z.myId?o="ActionTTLYouChanged":(o="ActionTTLChanged",p.push(b(h.fromId,i))),S.period>1814400){let e;const s=[],a=31536e3;S.period>=a?(e="Years",s.push(S.period/a|0)):(e="Months",s.push(S.period/(30*n.s2)|0)),t=i?c.ZP.format(e,!0,s):(0,c.ag)(e,s)}else t=(0,r.Z)(S.period,i);p.push(t)}else e?o="ActionTTLChannelDisabled":h.fromId===m.Z.myId?o="ActionTTLYouDisabled":(o="ActionTTLDisabled",p.push(b(h.fromId,i)));break}case"messageActionTopicEdit":{let t,s,n;const a=!!h.pFlags.out,r=void 0!==S.icon_emoji_id,d=r&&!+S.icon_emoji_id,l=void 0!==S.title,c=void 0!==S.hidden;a||(n=b(h.fromId,i)),l&&(s=k(S.title)),r&&!d&&(t=A(e)),p=n?[n]:[],S.closed?o=a?"Chat.Service.Group.TopicEdited.You.Paused":"Chat.Service.Group.TopicEdited.Paused":!1===S.closed?o=a?"Chat.Service.Group.TopicEdited.You.Resumed":"Chat.Service.Group.TopicEdited.Resumed":d&&l?(o=a?"Chat.Service.TopicEdited.You.Mixed.IconRemoved":"Chat.Service.TopicEdited.Mixed.IconRemoved",p.push(s)):r&&l?(o=a?"Chat.Service.TopicEdited.You.Mixed":"Chat.Service.TopicEdited.Mixed",p.push(_(e))):d?o=a?"Chat.Service.Group.TopicEdited.You.Icon.Removed":"Chat.Service.Group.TopicEdited.Icon.Removed":l?(o=a?"Chat.Service.Group.TopicEdited.You.Title":"Chat.Service.Group.TopicEdited.Title",p.push(s)):r?(o=a?"Chat.Service.Group.TopicEdited.You.Icon":"Chat.Service.Group.TopicEdited.Icon",p.push(t)):c&&(o=a?S.hidden?"Chat.Service.Group.TopicEdited.You.Hided":"Chat.Service.Group.TopicEdited.You.Unhided":S.hidden?"Chat.Service.Group.TopicEdited.Hided":"Chat.Service.Group.TopicEdited.Unhided");break}case"messageActionTopicCreate":p=[_(e)],o="TopicWasCreatedAction";break;case"messageActionSetChatTheme":{const e=!!h.pFlags.out;let t;e||(t=b(h.fromId,i)),p=t?[t]:[],S.emoticon?(p.push((0,u.Z)(S.emoticon)),o=e?"ChatThemeChangedYou":"ChatThemeChangedTo"):o=e?"ChatThemeDisabledYou":"ChatThemeDisabled";break}default:o=c.Hz[g]||`[${S._}]`}o||(o=c.Hz[g],void 0===o&&(o="["+g+"]"));const y=p&&(yield Promise.all(p));return i?c.ZP.format(o,!0,y):(0,c.$d)(w,o,y)}}))}},496:(e,t,i)=>{"use strict";i.d(t,{Z:()=>v});var s=i(8938),n=i(5705),a=i(677),o=i(3738),r=i(8456),d=i(5381),l=i(2325),c=i(6535),h=i(1346),u=i(8115),p=i(2491),f=i(5400),m=i(3512),g=i(6239);function v(e){var t,i,v,b,y,w;return v=this,b=void 0,w=function*(){let{message:v,text:b,usingMids:y,plain:w,highlightWord:S,withoutMediaType:C}=e;null!=b||(b=v.message);const L=[];let E=!1;const I=(e,t)=>{if(e){if(void 0===t&&E)return;t=w?l.ZP.format(e,!0):(0,l.ag)(e)}if(w)L.push(t);else{const e=document.createElement("span");"string"==typeof t?e.innerHTML=t:e.append(t),L.push(e)}},M=m.Z.managers.appMessagesManager,P=(0,d.Z)(v);let Z=null!==(t=v.totalEntities)&&void 0!==t?t:v.entities;if(v.media&&!P){(0,s.Z)(v);let e=!0;if(v.grouped_id){if(y){const t=yield M.getMidsByMessage(v);if(y.length===t.length){for(const i of t)if(!y.includes(i)){e=!1;break}}else e=!1}if(e){const e=yield M.getAlbumText(v.grouped_id);b=(null==e?void 0:e.message)||"",Z=(null==e?void 0:e.totalEntities)||[],C||(I("AttachAlbum"),E=!0)}}else e=!1;if(!e&&!C||!b){const e=v.media;switch(e._){case"messageMediaPhoto":I("AttachPhoto");break;case"messageMediaDice":I(void 0,w?e.emoticon:(0,u.Z)(e.emoticon));break;case"messageMediaVenue":b=e.title,I("AttachLocation");break;case"messageMediaGeo":I("AttachLocation");break;case"messageMediaGeoLive":I("AttachLiveLocation");break;case"messageMediaPoll":const t="๐Ÿ“Š "+(e.poll.question||"poll");I(void 0,w?t:(0,u.Z)(t));break;case"messageMediaContact":I("AttachContact");break;case"messageMediaGame":{const t="๐ŸŽฎ "+e.game.title;I(void 0,w?t:(0,u.Z)(t));break}case"messageMediaDocument":{const t=e.document;if("video"===t.type)I("AttachVideo");else if("voice"===t.type)I("AttachAudio");else if("gif"===t.type)I("AttachGif");else if("round"===t.type)I("AttachRound");else if("sticker"===t.type){const e=L.length;if(t.stickerEmojiRaw){const e=t.stickerEmojiRaw+" ";I(void 0,w?e:(0,u.Z)(e))}I("AttachSticker");const i=L.splice(e,2);if(w)L.push(i[0]+(i[1]?i[1]:""));else{const e=window.document.createElement("span");e.append(...i),L.push(e)}b=""}else if("audio"===t.type){const e=t.attributes.find((e=>"documentAttributeAudio"===e._&&(e.title||e.performer))),i="๐ŸŽต "+(e?[e.title,e.performer].filter(Boolean).join(" - "):t.file_name);I(void 0,w?i:(0,u.Z)(i))}else I(void 0,w?t.file_name:(0,u.Z)(t.file_name));break}case"messageMediaInvoice":"messageExtendedMediaPreview"===(null===(i=e.extended_media)||void 0===i?void 0:i._)?I(void 0,w?e.description:(0,u.Z)(e.description)):I(void 0,w?e.title:(0,u.Z)(e.title));break;case"messageMediaUnsupported":I(l.nK)}}const t=L.length;for(let e=1;e{"use strict";i.d(t,{Z:()=>n});var s=i(8842);function n(e){return t=this,i=void 0,a=function*(){const t=new s.Z;return yield t.update(e),t.element},new((n=void 0)||(n=Promise))((function(e,s){function o(e){try{d(a.next(e))}catch(e){s(e)}}function r(e){try{d(a.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(t,i||[])).next())}));var t,i,n,a}},9492:(e,t,i)=>{"use strict";i.d(t,{Z:()=>v});var s=i(2830),n=i(4755),a=i(3512),o=i(3442),r=i(6705),d=i(8580),l=i(1713),c=i(7030),h=i(2312),u=i(3114),p=i(7660),f=i(319),m=i(1507),g=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function v({photo:e,message:t,container:i,boxWidth:b,boxHeight:y,withTail:w,isOut:S,lazyLoadQueue:C,middleware:L,size:E,withoutPreloader:I,loadPromises:M,autoDownloadSize:P,noBlur:Z,noThumb:T,noFadeIn:k,blurAfter:x,managers:A=a.Z.managers,processUrl:_}){return g(this,void 0,void 0,(function*(){const F={loadPromises:{thumb:Promise.resolve(),full:Promise.resolve()},images:{thumb:null,full:null},preloader:null,aspecter:null},D="document"===e._,R=D&&e.mime_type.startsWith("image/")&&!E,B=(0,u.Z)(e);if(!(e.sizes||e.thumbs||B||R))return b&&y&&!E&&D&&(0,l.Z)(e,i,b,y,void 0,t),F;let N=0===P;E||(void 0===b&&(b=n.Z.active.regular.width),void 0===y&&(y=n.Z.active.regular.height)),i.classList.add("media-container");let O,U,H,z=i,j=!0,G=Promise.resolve();if(b&&y&&!E){const s=(0,l.Z)(e,i,b,y,void 0,t,void 0,R?{_:"photoSize",w:e.w,h:e.h,size:e.size,type:m.Pt}:void 0);if(E=s.photoSize,j=s.isFit,U=yield A.thumbsStorage.getCacheContext(e,E.type),!j&&!B){z=document.createElement("div"),z.classList.add("media-container-aspecter"),z.style.width=s.size.width+"px",z.style.height=s.size.height+"px";const n=(0,d.Z)(e,U,!Z,!0);if(n){G=n.loadPromise;const e=n.image;e.classList.add("media-photo"),i.append(e)}else(yield v({container:i,message:t,photo:e,boxWidth:0,boxHeight:0,size:E,lazyLoadQueue:C,isOut:S,loadPromises:M,middleware:L,withoutPreloader:I,withTail:w,autoDownloadSize:P,noBlur:Z,noThumb:!0,blurAfter:!0,managers:A})).images.full.classList.add("media-photo","thumbnail");i.classList.add("media-container-fitted"),i.append(z)}}else E||(E=(0,c.Z)(e,b,y,!0)),U=yield A.thumbsStorage.getCacheContext(e,null==E?void 0:E.type);if(!T&&!B){const t=(0,d.Z)(e,U,!Z);t&&(G=Promise.all([G,t.loadPromise]),F.loadPromises.thumb=F.loadPromises.full=G,O=F.images.thumb=t.image,O.classList.add("media-photo"),z.append(O))}if(F.aspecter=z,"photoSizeEmpty"===(null==E?void 0:E._)&&D||(null==E?void 0:E.bytes))return F;"videoSize"===(null==E?void 0:E._)?(H=F.images.full=(0,p.Z)(),H.autoplay=!0,H.loop=!0,H.muted=!0,H.classList.add("media-photo")):(H=F.images.full=new Image,H.classList.add("media-photo"));const V=(O||!U.downloaded)&&a.Z.settings.animationsEnabled&&!k;let K;const W=null==t?void 0:t.uploadingFileName;I||(U.downloaded&&!W||(K=new o.Z({attachMethod:"prepend",isUpload:!!W})),W&&(K.attachPromise(h.Z.getUpload(W)),K.attach(i),N=void 0));const $=e=>(0,s.Z)(i,H,e,V,z,O),q=e=>g(this,void 0,void 0,(function*(){if(!L||L()){if(_&&(e=yield _(e)),x){const t=(0,r.Z)(e,12);return t.promise.then((()=>$(t.canvas.toDataURL())))}return $(e)}}));let Y;const Q=E.w>=150&&E.h>=150||N,X=()=>g(this,void 0,void 0,(function*(){N&&!I&&K&&(K.construct(),K.setManual());const t=(()=>{const t=R&&!E;return h.Z.downloadMediaURL({media:e,thumb:E,queueId:null==C?void 0:C.queueId,onlyCache:t?void 0:N})})(),s=yield A.thumbsStorage.getCacheContext(e,null==E?void 0:E.type);K&&!s.downloaded&&!I&&Q&&K.attach(i,!1,t),N=void 0;const n=t.then(q);return n.catch(f.Z),{download:t,render:n}}));return K&&K.setDownloadFunction(X),U.downloaded?G=Y=(yield X()).render:C?C.push({div:i,load:()=>X().then((({download:e})=>e))}):Y=(yield X()).render,M&&G&&M.push(G),yield G,F.loadPromises.thumb=G,F.loadPromises.full=Y||Promise.resolve(),F.preloader=K,F}))}},5671:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(2291),n=i(2325),a=i(3512),o=i(7362);function r(e){return t=this,i=void 0,d=function*(){const t=document.createElement("span");t.classList.add("sender-title");const i=e.fromId===a.Z.myId&&e.peerId!==a.Z.myId;if(t.append(i?(0,n.ag)("FromYou"):yield(0,o.Z)(Object.assign(Object.assign({},(0,s.Z)(e)),{dialog:e.peerId===a.Z.myId}))),(yield a.Z.managers.appPeersManager.isAnyGroup(e.peerId))||i){const i=yield(0,o.Z)({peerId:e.peerId});t.append(" โž ",i)}return t},new((r=void 0)||(r=Promise))((function(e,s){function n(e){try{o(d.next(e))}catch(e){s(e)}}function a(e){try{o(d.throw(e))}catch(e){s(e)}}function o(t){var i;t.done?e(t.value):(i=t.value,i instanceof r?i:new r((function(e){e(i)}))).then(n,a)}o((d=d.apply(t,i||[])).next())}));var t,i,r,d}},1604:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(632);function n(e){const t=document.createElement("span");return t.classList.add("sent-time"),t.append((0,s.zM)(new Date(1e3*e.date))),t}},3541:(e,t,i)=>{"use strict";i.d(t,{Vp:()=>F,ZP:()=>N,_2:()=>O,_i:()=>R});var s=i(5269),n=i(3725),a=i(3910),o=i(2738),r=i(7660),d=i(8497),l=i(6740),c=i(1046),h=i(1185),u=i(5471),p=i(9405),f=i(4755),m=i(925),g=i(3174),v=i(6724),b=i(9674),y=i(2312),w=i(9322),S=i(2790),C=i(7030),L=i(13),E=i(1447),I=i(3512),M=i(7730),P=i(671),Z=i(5814),T=i(6787),k=i(2796),x=i(6775),A=i(645),_=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const F=1.49,D={},R={},B=(e,t,i)=>{const s=()=>{e.removeEventListener("animationend",s),t(),clearTimeout(n)};e.addEventListener("animationend",s);const n=setTimeout(s,i)};function N({doc:e,div:t,middleware:i,loadStickerMiddleware:d,lazyLoadQueue:m,exportLoad:v,group:w,play:S,onlyThumb:N,emoji:O,width:U,height:H,withThumb:z,loop:j,loadPromises:G,needFadeIn:V,needUpscale:K,skipRatio:W,static:$,managers:q=I.Z.managers,fullThumb:Y,isOut:Q,noPremium:X,withLock:J,relativeEffect:ee,loopEffect:te,isCustomEmoji:ie,syncedVideo:se}){var ne;return _(this,void 0,void 0,(function*(){t=Array.isArray(t)?t:[t],ie&&(O=e.stickerEmojiRaw);const ae=e.sticker;if(1===ae&&($=!0),!U&&!H){const t=f.Z.active,i=O?t.emojiSticker:e.animated?t.animatedSticker:t.staticSticker,s=(0,p.C)(e.w,e.h).aspectFitted(i);U=s.width,H=s.height}let oe;2===ae&&E.Z.loadLottieWorkers(),t.forEach((t=>{t.dataset.docId=""+e.id,O&&(t.dataset.stickerEmoji=O),t.classList.add("media-sticker-wrapper")}));const re=(t=(null==oe?void 0:oe.type))=>_(this,void 0,void 0,(function*(){return oe=yield q.thumbsStorage.getCacheContext(e,t)})),de=!$&&(2===ae||3===ae),le=(0,L.Z)(e);void 0!==Q&&le&&!Q&&t.forEach((e=>e.classList.add("reflect-x")));const ce=le&&J;if(ce){const i=D[e.id];t.forEach((e=>{e.classList.add("is-premium-sticker","tgico-premium_lock"),i&&e.style.setProperty("--lock-url",`url(${i})`)}))}if($&&1!==ae){const t=(0,C.Z)(e,U,H,!1);yield re(t.type)}else yield re(null==Y?void 0:Y.type);const he=O&&!ie?(0,P.tB)(O):-1,ue=oe.downloaded&&!V,pe=de,fe=2===ae||3===ae?yield q.appDocsManager.getLottieCachedThumb(e.id,he):void 0,me={render:void 0,load:void 0};let ge=(0,n.Z)(),ve=!1;if(((null===(ne=e.thumbs)||void 0===ne?void 0:ne.length)||fe)&&!t[0].firstElementChild&&(!ue||pe||N)&&!1!==z){let n=fe||e.thumbs[0];const a=(e,t)=>{e.childElementCount?ge.resolve():b.Z.mutateElement(e,(()=>{e.childElementCount||(t.classList.add("media-sticker","thumbnail"),e.append(t)),ge.resolve()}))};if("url"in n)ve=!0,t.forEach((e=>{const t=new Image;(0,l.ZP)(t,n.url,(()=>a(e,t)))}));else if("bytes"in n){if("photoPathSize"===n._){n.bytes.length||(n=e.thumbs.find((e=>{var t;return null===(t=e.bytes)||void 0===t?void 0:t.length}))||n);const i=function(e){let t="M";for(let i=0,s=e.length;i=192?t+="AACAAAAHAAALMAAAQASTAVAAAZaacaaaahaaalmaaaqastava.az0123456789-,"[s-128-64]:(s>=128?t+=",":s>=64&&(t+="-"),t+=""+(63&s))}return t+="z",t}(n.bytes),s="http://www.w3.org/2000/svg",a=document.createElementNS(s,"svg");a.classList.add("rlottie-vector","media-sticker","thumbnail"),a.setAttributeNS(null,"viewBox",`0 0 ${e.w||512} ${e.h||512}`);const o=document.createElementNS(s,"path");o.setAttributeNS(null,"d",i),I.Z.settings.animationsEnabled&&!ie&&o.setAttributeNS(null,"fill","url(#g)"),a.append(o),t.forEach(((e,t)=>e.append(t>0?a.cloneNode(!0):a))),ve=!0,ge.resolve()}else if(he<=0){const o=()=>{t.forEach((t=>{const i=new Image,s=(0,h.Z)(e,n,!0);(0,l.ZP)(i,s,(()=>a(t,i)))}))};s.Z||e.pFlags.stickerThumbConverted||oe.url?(ve=!0,o()):(ve=!0,M.Z.convert("main-"+e.id,n.bytes).then((s=>{q.appDocsManager.saveWebPConvertedStrippedThumb(e.id,s),n.bytes=s,e.pFlags.stickerThumbConverted=!0,i&&!i()||t[0].childElementCount?ge.resolve():o()})).catch((()=>ge.resolve())))}}else if((2===ae&&he<=0||3===ae)&&(z||N)){const s=()=>_(this,void 0,void 0,(function*(){if(t[0].childElementCount||i&&!i())return void ge.resolve();const s=(e,t,s)=>{e.childElementCount||i&&!i()?ge.resolve():s?(0,l.ZP)(t,s,(()=>a(e,t))):a(e,t)};yield re(),t.forEach((t=>{if(oe.url)s(t,new Image,oe.url);else if("bytes"in n){const i=(0,c.Z)(e,n,!0);i.loadPromise.then((()=>s(t,i.image,"")))}else y.Z.downloadMediaURL({media:e,thumb:n}).then((e=>_(this,void 0,void 0,(function*(){return s(t,new Image,e)}))))}))}));if(m&&N)return m.push({div:t[0],load:s}),ge.resolve(),me;s(),n.url&&(ve=!0)}}if(G&&ve&&G.push(ge),N)return me;const be=(0,u.Z)("MIDDLEWARE"),ye=()=>_(this,void 0,void 0,(function*(){if(i&&!i())throw be;if(2===ae&&!$){const s=yield y.Z.downloadMedia({media:e,queueId:null==m?void 0:m.queueId,thumb:Y});if(i&&!i())throw be;const n=yield E.Z.loadAnimationWorker({container:t[0],loop:!(O&&!ie)&&j,autoplay:S,animationData:s,width:U,height:H,name:"doc"+e.id,needUpscale:K,skipRatio:W,toneIndex:he,sync:ie,middleware:null!=d?d:i,group:w}),a=ce?()=>{var i,s;const a=null!==(i=D[s=e.id])&&void 0!==i?i:D[s]=function(e){var t;const i=e.getContext("2d"),s=20*(null!==(t=e.dpr)&&void 0!==t?t:1),n=s,a=s,o=(e.width-n)/2,r=e.height-a-0,d=i.getImageData(o,r,n,a).data;let l=0,c=0,h=0,u=0;for(let e=0;ee.style.setProperty("--lock-url",`url(${a})`)))}:void 0,o=(e,t)=>{const i=e.firstElementChild!==t&&e.firstElementChild;!1!==V&&(V=(V||!i||"svg"===i.tagName)&&I.Z.settings.animationsEnabled);const s=()=>{i&&i!==t&&"DIV"!==i.tagName&&i.remove()};V?b.Z.mutate((()=>{t&&t.classList.add("fade-in"),i&&i.classList.add("fade-out"),B(t||i,(()=>{b.Z.mutate((()=>{t&&t.classList.remove("fade-in"),s()}))}),400)})):i&&b.Z.mutate(s)};return n.addEventListener("firstFrame",(()=>{const i=n.canvas[0];(!1!==z||ie)&&(0,g.O)(e,i,he),ce&&a(),ie||t.forEach(((e,t)=>{o(e,n.canvas[t])}))}),{once:!0}),O&&q.appStickersManager.preloadAnimatedEmojiStickerAnimation(O),n}if($||3===ae){const s=de&&se,n=s?A.Z.generateName(""+e.id,0,0,void 0,void 0):void 0,a=R[n];if(a)return a;const o=(s?t.slice(0,1):t).map((()=>{let e;if($)e=new Image;else{const t=e=(0,r.Z)();if(t.muted=!0,S&&(t.autoplay=!0),j&&(t.loop=!0),j&&"number"==typeof j){let i=0,s=0;function n(){i>this.currentTime&&++s===j&&(this.autoplay=!1,this.loop=!1,this.pause(),t.removeEventListener("timeupdate",n)),i=this.currentTime}t.addEventListener("timeupdate",n)}}return e.classList.add("media-sticker"),e})),c=t.map(((e,t)=>e.firstElementChild!==o[t]&&e.firstElementChild));!1!==V&&(V=(V||!ue||($?c[0]:!c[0]||"svg"===c[0].tagName))&&I.Z.settings.animationsEnabled),V&&o.forEach((e=>e.classList.add("fade-in")));const h=new Promise(((n,a)=>_(this,void 0,void 0,(function*(){const r=()=>_(this,void 0,void 0,(function*(){if(i&&!i())return void a(be);const r=o.length,d=[];let h;yield re(),t.forEach(((t,u)=>{const p=o[u];p&&(h=(0,l.cj)(p,oe.url)),h.then((()=>((t,o,l)=>{b.Z.mutateElement(t,(()=>{if(!i||i())if(o){if(o){const t=U*window.devicePixelRatio,i=H*window.devicePixelRatio;if(!(0,g.k)(e,he,t,i)){const s=document.createElement("canvas");s.width=t,s.height=i,s.getContext("2d").drawImage(o,0,0,s.width,s.height),(0,g.O)(e,s,he)}}s?n(o):(t.append(o),V?(l&&l.classList.add("fade-out"),B(o,(()=>{o.classList.remove("fade-in"),null==l||l.remove()}),400)):null==l||l.remove(),de&&Z.Z.addAnimation(o,w,void 0,i),d.push(o)===r&&n(d))}else s&&de||null==l||l.remove();else a(be)}))})(t,p,c[u])))}))}));if(yield re(),oe.url)r();else{let t;if(1!==ae&&$){const i=(0,C.Z)(e,U,H,!1);t=y.Z.downloadMediaURL({media:e,thumb:i,queueId:null==m?void 0:m.queueId})}else t=y.Z.downloadMediaURL({media:e,queueId:null==m?void 0:m.queueId});t.then(r,a)}}))));return n&&(R[n]=h,d&&h.finally((()=>{d()||delete R[n]}))),h}}));if(v&&(1===v&&(!ue||de)||2===v))return me.load=ye,me;const we=!m||ue&&!de?ye():(m.push({div:t[0],load:ye}),Promise.resolve());return ue&&$&&(ge=we,G&&G.push(ge)),2===ae&&le&&void 0!==Q&&!X&&function({container:e,doc:t,managers:i,middleware:s,isOut:n,width:r,loadPromise:d,relativeEffect:l,loopEffect:c}){i.appStickersManager.preloadSticker(t.id,!0);let h=!1;(0,o.fc)(e,(i=>_(this,void 0,void 0,(function*(){if((0,a.Z)(i),h){const e=document.createElement("a");return e.onclick=()=>{(0,k.PE)(),new T.Z(t.stickerSetInput).show()},void(0,k.bC)({langPackKey:"Sticker.Premium.Click.Info",langPackArguments:[e]})}h=!0,yield d;const{animationDiv:o,stickerPromise:u}=(0,x.Z)({doc:t,middleware:s,side:n?"right":"left",size:r*F,target:e,play:!0,fullThumb:(0,L.Z)(t),relativeEffect:l,loopEffect:c});void 0===n||n||o.classList.add("reflect-x"),u.then((e=>{e.addEventListener("destroy",(()=>{h=!1}))}))}))))}({container:t[0],doc:e,managers:q,middleware:i,isOut:Q,width:U,loadPromise:we,relativeEffect:ee,loopEffect:te}),me.render=we,me}))}function O({event:e,container:t,managers:i,peerId:s,middleware:n}){var o,r;return _(this,void 0,void 0,(function*(){(0,a.Z)(e);const l=(0,d.Z)(t,"bubble"),c=t.dataset.stickerEmoji,h=t.classList.contains("custom-emoji")?void 0:E.Z.getAnimation(t);if(null==h?void 0:h.paused){const e=yield i.appStickersManager.getAnimatedEmojiSoundDocument(c);if(e){const i=document.createElement("audio");i.style.display="none",t.parentElement.append(i);try{const t=yield y.Z.downloadMediaURL({media:e});i.src=t,i.play(),yield(0,m.Z)(i,void 0,!0),i.addEventListener("ended",(()=>{i.src="",i.remove()}),{once:!0})}catch(e){}}h.autoplay=!0,h.restart()}if(!s.isUser())return;const u=yield i.appStickersManager.getAnimatedEmojiSticker(c,!0);if(!u)return;const p=null!==(o=(r=t).emojiData)&&void 0!==o?o:r.emojiData={a:[],v:1},f=t.sendInteractionThrottled=(0,v.Z)((()=>{if(!p.a.length)return;const e=p.a[0].t;p.a.forEach((t=>{t.t=(t.t-e)/1e3}));const s=(0,d.Z)(t,"bubble");i.appMessagesManager.setTyping(w.ZP.chat.peerId,{_:"sendMessageEmojiInteraction",msg_id:(0,S.Z)(+s.dataset.mid),emoticon:c,interaction:{_:"dataJSON",data:JSON.stringify(p)}},!0,w.ZP.chat.threadId),p.a.length=0}),1e3,!1),g=l?l.classList.contains("is-out"):void 0,{animationDiv:b}=(0,x.Z)({doc:u,middleware:n,side:g?"right":"left",size:360,target:t,play:!0,withRandomOffset:!0});void 0===g||g||b.classList.add("reflect-x"),e.isTrusted&&(p.a.push({i:1,t:Date.now()}),f())}))}},6775:(e,t,i)=>{"use strict";i.d(t,{Z:()=>u});var s=i(2131),n=i(8938),a=i(8487),o=i(5471),r=i(3624),d=i(9966),l=i(241),c=i(9322),h=i(3541);function u({size:e,doc:t,middleware:i,target:u,side:p,skipRatio:f,play:m,managers:g,fullThumb:v,withRandomOffset:b,relativeEffect:y,loopEffect:w}){var S;const C=document.createElement("div");let L;C.classList.add("emoji-animation"),C.style.width=e+"px",C.style.height=e+"px";const E=()=>{I.clean(),null==L||L.remove(),C.remove(),c.ZP.chat.bubbles.scrollable.container.removeEventListener("scroll",x)},I=null!==(S=null==i?void 0:i.create())&&void 0!==S?S:(0,r.k)();i=I.get();const M=(0,h.ZP)({div:C,doc:t,middleware:i,withThumb:!1,needFadeIn:!1,loop:!!w,width:e,height:e,play:m,group:"none",skipRatio:f,managers:g,fullThumb:v}).then((({render:e})=>e)).then((e=>{if((0,n.Z)(e),!i())throw e.remove(),(0,o.Z)("MIDDLEWARE");return L=e,L.addEventListener("enterFrame",(e=>{(w||e!==L.maxFrame)&&(0,a.Z)(u)||E()})),s.Z&&L.addEventListener("firstFrame",(()=>{navigator.vibrate(100)}),{once:!0}),L})),P=e=>{const t=Math.random()*e*2;return t>e?-t%e:t},Z=b?P(16):0,T=b?P(4):0,k=()=>{if(!(0,a.Z)(u))return void E();const t=u.getBoundingClientRect(),i=t.width/200,s="center"===p?0:16*("right"===p?1:-1)*i,n="center"===p?0:0*i,o="right"===p?t.right:t.left,r=t.top,d=("center"===p?(t.width-e)/2:"right"===p?-e:0)+s+Z,c=(t.height-e)/2+n+T,h=o+d,f=r+c;f<=-e||f>=l.Z.height?E():y?("center"!==p?C.style[p]=-1*Math.abs(s)+"px":C.style.left=d+"px",C.style.top=c+"px"):(C.style.top=f+"px",C.style.left=h+"px")},x=(0,d.Z)(k);return c.ZP.chat.bubbles.scrollable.container.addEventListener("scroll",x),k(),y?(C.classList.add("is-relative"),u.parentElement.append(C)):c.ZP.emojiAnimationContainer.append(C),{animationDiv:C,stickerPromise:M}}},5772:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(3512),n=i(3541);function a(e){return t=this,i=void 0,o=function*(){const{emoji:t,div:i,managers:a=s.Z.managers}=e,o=yield a.appStickersManager.getAnimatedEmojiSticker(t);if(!o)throw i.classList.add("media-sticker-wrapper"),new Error("no sticker");return(0,n.ZP)(Object.assign({doc:o,play:!0,loop:!1},e))},new((a=void 0)||(a=Promise))((function(e,s){function n(e){try{d(o.next(e))}catch(e){s(e)}}function r(e){try{d(o.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof a?i:new a((function(e){e(i)}))).then(n,r)}d((o=o.apply(t,i||[])).next())}));var t,i,a,o}},1273:(e,t,i)=>{"use strict";i.d(t,{Z:()=>h});var s=i(7660),n=i(6740),a=i(2312),o=i(1447),r=i(3512),d=i(5814),l=i(3541),c=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function h({set:e,lazyLoadQueue:t,container:i,group:h,autoplay:u,width:p,height:f,managers:m=r.Z.managers,middleware:g}){var v;return c(this,void 0,void 0,(function*(){if(null===(v=e.thumbs)||void 0===v?void 0:v.length)return i.classList.add("media-sticker-wrapper"),void t.push({div:i,load:()=>c(this,void 0,void 0,(function*(){const t=yield m.appStickersManager.getStickerSetThumbDownloadOptions(e),r=a.Z.download(t);if(e.pFlags.animated&&!e.pFlags.videos)return r.then((t=>{o.Z.loadAnimationWorker({container:i,loop:!0,autoplay:u,animationData:t,width:p,height:f,needUpscale:!0,name:"setThumb"+e.id,group:h,middleware:g})}));{let t;return e.pFlags.videos?(t=(0,s.Z)(),t.autoplay=!0,t.muted=!0,t.loop=!0):t=new Image,t.classList.add("media-sticker"),r.then((s=>{(0,n.ZP)(t,URL.createObjectURL(s),(()=>{i.append(t),e.pFlags.videos&&d.Z.addAnimation(t,h)}))}))}}))});let r;r=e.thumb_document_id?m.appEmojiManager.getCustomEmojiDocument(e.thumb_document_id):m.appStickersManager.getStickerSet(e).then((e=>e.documents[0]));const b=yield r;"documentEmpty"!==b._&&(0,l.ZP)({doc:b,div:i,group:h,lazyLoadQueue:t,managers:m,width:p,height:f,middleware:g})}))}},62:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(3541);function n({doc:e,row:t,size:i,managers:n}){const a=t.media,o=t.createMedia("small");a&&o.classList.add("hide");const r=a?[]:void 0,d="small"===i?32:48,l=(0,s.ZP)({div:o,doc:e,width:d,height:d,loadPromises:r,managers:n}).then((({render:e})=>e));return r&&Promise.all(r).then((()=>{o.classList.remove("hide"),a.remove()})),l}},9102:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(2790),n=i(4497),a=i(7362);function o(e){return t=this,i=void 0,r=function*(){const{peerId:t,threadId:i,lastMsgId:o}=e,r=Promise.resolve(),d=(0,n.Z)("t.me/c/"+t.toChatId()+(i?"/"+(0,s.Z)(i):"")+(o?"/"+(0,s.Z)(o):""));return d.classList.add("topic-name","topic-name-button"),d.append(yield(0,a.Z)(e)),{cached:!0,element:d,loadPromise:r}},new((o=void 0)||(o=Promise))((function(e,s){function n(e){try{d(r.next(e))}catch(e){s(e)}}function a(e){try{d(r.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof o?i:new o((function(e){e(i)}))).then(n,a)}d((r=r.apply(t,i||[])).next())}));var t,i,o,r}},2887:(e,t,i)=>{"use strict";i.d(t,{Z:()=>x});var s=i(4762),n=i(5296),a=i(3725),o=i(3910),r=i(2738),d=i(7660),l=i(8487),c=i(6740),h=i(8580),u=i(5471),p=i(4755),f=i(319),m=i(925),g=i(3035),v=i(6724),b=i(9674),y=i(5157),w=i(2312),S=i(9322),C=i(1507),L=i(3512),E=i(5814),I=i(3013),M=i(8448),P=i(3442),Z=i(9492),T=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};let k=0;function x({doc:e,container:t,message:i,boxWidth:x,boxHeight:A,withTail:_,isOut:F,middleware:D,lazyLoadQueue:R,noInfo:B,group:N,onlyPreview:O,noPreview:U,withoutPreloader:H,loadPromises:z,noPlayButton:j,photoSize:G,videoSize:V,searchContext:K,autoDownload:W,managers:$=L.Z.managers,noAutoplayAttribute:q}){var Y;return T(this,void 0,void 0,(function*(){const Q=null==W?void 0:W.video;let X=0===Q;const J=!(x&&A),ee=("video"!==e.type||e.size<=52428800&&!J)&&("gif"===e.type?L.Z.settings.autoPlay.gifs:L.Z.settings.autoPlay.videos);let te,ie;if(!B){te=document.createElement("span"),te.classList.add("video-time"),t.append(te);let i=!1;"gif"!==e.type?(te.innerText=(0,y.Z)(e.duration,!1),j||"round"===e.type||(ee&&!X?te.classList.add("tgico","can-autoplay"):i=!0)):(te.innerText="GIF",ee||j||(i=!0,X=void 0)),i&&(ie=document.createElement("span"),ie.classList.add("video-play","tgico-largeplay","btn-circle","position-center"),t.append(ie))}const se={};if("image/gif"===e.mime_type){const s=yield(0,Z.Z)({photo:e,message:i,container:t,boxWidth:x,boxHeight:A,withTail:_,isOut:F,lazyLoadQueue:R,middleware:D,withoutPreloader:H,loadPromises:z,autoDownloadSize:Q,size:G,managers:$});return se.thumb=s,se.loadPromise=s.loadPromises.full,se}let ne;const ae=(0,d.Z)();if(ae.classList.add("media-video"),ae.muted=!0,"round"===e.type){const s=document.createElement("div");s.classList.add("media-round","z-depth-1"),s.dataset.mid=""+i.mid,s.dataset.peerId=""+i.peerId,s.message=i;const a=p.Z.active.round,d=a.width/2,c=3.5,h=d-2*c;s.innerHTML=`\n \n `;const u=s.firstElementChild.firstElementChild;k||(k=2*Math.PI*h),u.style.strokeDasharray=k+" "+k,u.style.strokeDashoffset=""+k,te.classList.add("tgico"),i.pFlags.media_unread&&s.classList.add("is-unread");const f=document.createElement("canvas");f.width=f.height=e.w,s.prepend(f,te),s.append(ae),t.append(s);const m=f.getContext("2d"),b=()=>{const e=s.message,t=I.Z.addMedia(e,!X),i=()=>{(S.ZP.chat.setPeerPromise||Promise.resolve()).finally((()=>{(0,l.Z)(t)||(t.removeEventListener("play",h),t.removeEventListener("timeupdate",c),t.removeEventListener("pause",p),t.removeEventListener("ended",b))}))},a=()=>{m.drawImage(t,0,0);const e=k-t.currentTime/t.duration*k;return u.style.strokeDashoffset=""+e,!t.paused},d=()=>{t.duration&&((0,l.Z)(t)?(t.paused&&a(),te.innerText=(0,y.Z)(t.duration-t.currentTime,!1)):i())},c=(0,v.Z)((()=>{(0,g.T2)(d)}),1e3,!1),h=()=>{ae.classList.add("hide"),s.classList.remove("is-paused"),(0,n.cK)(a,f),ne&&ne.preloader&&ne.preloader.classList.contains("manual")&&ne.onClick()},p=()=>{(0,l.Z)(t)?s.classList.add("is-paused"):i()},b=()=>{ae.classList.remove("hide"),s.classList.add("is-paused"),ae.currentTime=0,te.innerText=(0,y.Z)(t.duration,!1),t.currentTime&&(t.currentTime=0)};t.addEventListener("play",h),t.addEventListener("timeupdate",c),t.addEventListener("pause",p),t.addEventListener("ended",b),(0,r.fc)(f,(i=>{if((0,o.Z)(i),ne&&!ne.detached&&ne.onClick(),t.paused){const i=!!K;if(I.Z.setSearchContext(K||{peerId:C.NM,inputFilter:{_:"inputMessagesFilterEmpty"},useSearch:!1})){const[t,n]=i?(0,M.ns)(s,e.mid):[];I.Z.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?(a(),d(),ae.classList.add("hide")):p():h()};i.pFlags.is_outgoing?(s.onLoad=b,s.dataset.isOutgoing="1"):b()}else q||(ae.autoplay=!0);let oe,re;if(i){if(oe=yield(0,Z.Z)({photo:e,message:i,container:t,boxWidth:x,boxHeight:A,withTail:_,isOut:F,lazyLoadQueue:R,middleware:D,withoutPreloader:!0,loadPromises:z,autoDownloadSize:null==W?void 0:W.photo,size:G,managers:$}),se.thumb=oe,!ee&&"gif"!==e.type||O)return se.loadPromise=oe.loadPromises.full,se;if(_){const e=(oe.images.thumb||oe.images.full).parentElement;ae.width=+e.getAttributeNS(null,"width"),ae.height=+e.getAttributeNS(null,"height"),e.append(ae)}}else if(!U){const i=(0,h.Z)(e,{},!0);if(i){const e=i.image;e.classList.add("media-poster"),t.append(e),se.thumb={loadPromises:{thumb:i.loadPromise,full:Promise.resolve()},images:{thumb:e,full:null},preloader:null,aspecter:null},null==z||z.push(i.loadPromise),se.loadPromise=i.loadPromise}}if(O)return se;!ae.parentElement&&t&&((null==oe?void 0:oe.aspecter)||t).append(ae);const de=()=>T(this,void 0,void 0,(function*(){return re=yield $.thumbsStorage.getCacheContext(e,null==V?void 0:V.type)}));yield de();const le=null==i?void 0:i.uploadingFileName;le?(ne=new P.Z({attachMethod:"prepend",isUpload:!0}),ne.attachPromise(w.Z.getUpload(le)),ne.attach(t,!1),X=void 0):re.downloaded||e.supportsStreaming||H?e.supportsStreaming&&(ne=new P.Z({cancelable:!1,attachMethod:"prepend"})):ne=new P.Z({attachMethod:"prepend"});const ce=(0,a.Z)();if(ae.addEventListener("error",(e=>{4!==ae.error.code&&console.error("Error "+ae.error.code+"; details: "+ae.error.message),ne&&!le&&ne.detach(),ce.isFulfilled||ce.resolve()}),{once:!0}),"video"===e.type){const e=()=>{ae.duration&&(te.innerText=(0,y.Z)(ae.duration-ae.currentTime,!1))},t=(0,v.Z)((()=>{(0,g.T2)(e)}),1e3,!1);ae.addEventListener("timeupdate",t),ie&&ae.addEventListener("timeupdate",(()=>{b.Z.mutateElement(ie,(()=>{ie.remove()}))}),{once:!0})}ae.muted=!0,ae.loop=!0,q||(ae.autoplay=!0);let he=X&&(null===(Y=null==oe?void 0:oe.preloader)||void 0===Y?void 0:Y.loadFunc);const ue=()=>T(this,void 0,void 0,(function*(){ne&&X&&!H&&(ne.construct(),ne.setManual()),yield de();let n=Promise.resolve();if(ne&&!le||H)if(re.downloaded||e.supportsStreaming)e.supportsStreaming&&(X?n=Promise.reject((0,u.Z)("NO_AUTO_DOWNLOAD")):!re.downloaded&&ne&&(ne.attach(t,!1,null),ae.addEventListener(s.IS_SAFARI?"timeupdate":"canplay",(()=>{ne.detach()}),{once:!0})));else{const i=n=w.Z.downloadMediaURL({media:e,queueId:null==R?void 0:R.queueId,onlyCache:X,thumb:V});ne&&ne.attach(t,!1,i)}return!X&&he&&(he(),he=null),X=void 0,n.then((()=>T(this,void 0,void 0,(function*(){!D||D()?("round"===e.type&&I.Z.resolveWaitingForLoadMedia(i.peerId,i.mid,i.pFlags.is_scheduled),yield de(),(0,m.Z)(ae).then((()=>{N&&E.Z.addAnimation(ae,N),ne&&!le&&ne.detach(),ce.resolve()}),(e=>{console.error("video load error",e),te&&te.classList.add("is-error"),ce.reject(e)})),(0,c.ZP)(ae,re.url)):ce.resolve()}))),f.Z),{download:n,render:Promise.all([n,ce])}}));return ne&&!le&&ne.setDownloadFunction(ue),"gif"!==e.type||ee?se.loadPromise=R?(R.push({div:t,load:()=>ue().then((({render:e})=>e))}),Promise.resolve()):(yield ue()).render:(0,r.fc)(t,(e=>{(0,o.Z)(e),ie.remove(),ue()}),{capture:!0,once:!0}),se.thumb&&(yield se.thumb.loadPromises.thumb),se}))}p.Z.addEventListener("changeScreen",((e,t)=>{if(t===p._.mobile||e===p._.mobile){const e=Array.from(document.querySelectorAll(".media-round .progress-ring")),t=p.Z.active.round.width,i=t/2,s=i-7;k=2*Math.PI*s,e.forEach((e=>{e.setAttributeNS(null,"width",""+t),e.setAttributeNS(null,"height",""+t);const n=e.firstElementChild;n.setAttributeNS(null,"cx",""+i),n.setAttributeNS(null,"cy",""+i),n.setAttributeNS(null,"r",""+s),n.style.strokeDasharray=k+" "+k,n.style.strokeDashoffset=""+k}))}}))},2498:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(8456),n=i(5400);function a(e){const t=(0,s.Z)(e.description||"",150,180);return(0,n.ZP)(t)}},1336:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(8456),n=i(5400);function a(e){let t=e.title||e.author||e.site_name||"";return t=(0,s.Z)(t,80,100),(0,n.ZP)(t,{noLinks:!0,noLinebreaks:!0})}},7445:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});const s={AED:{code:"AED",title:"United Arab Emirates Dirham",symbol:"AED",native:"ุฏ.ุฅ.โ€",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"367",max_amount:"3673030"},AFN:{code:"AFN",title:"Afghan Afghani",symbol:"AFN",native:"ุ‹",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"8729",max_amount:"87299487"},ALL:{code:"ALL",title:"Albanian Lek",symbol:"ALL",native:"Lek",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!1,exp:2,min_amount:"11842",max_amount:"118421187"},AMD:{code:"AMD",title:"Armenian Dram",symbol:"AMD",native:"ีคึ€.",thousands_sep:",",decimal_sep:".",symbol_left:!1,space_between:!0,exp:2,min_amount:"40943",max_amount:"409436718"},ARS:{code:"ARS",title:"Argentine Peso",symbol:"ARS",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"14705",max_amount:"147059002"},AUD:{code:"AUD",title:"Australian Dollar",symbol:"AU$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"153",max_amount:"1536825"},AZN:{code:"AZN",title:"Azerbaijani Manat",symbol:"AZN",native:"ะผะฐะฝ.",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"169",max_amount:"1699858"},BAM:{code:"BAM",title:"Bosnia & Herzegovina Convertible Mark",symbol:"BAM",native:"KM",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"199",max_amount:"1990677"},BDT:{code:"BDT",title:"Bangladeshi Taka",symbol:"BDT",native:"เงณ",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"10009",max_amount:"100094046"},BGN:{code:"BGN",title:"Bulgarian Lev",symbol:"BGN",native:"ะปะฒ.",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"199",max_amount:"1993315"},BND:{code:"BND",title:"Brunei Dollar",symbol:"BND",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!1,exp:2,min_amount:"142",max_amount:"1421883"},BOB:{code:"BOB",title:"Bolivian Boliviano",symbol:"BOB",native:"Bs",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"683",max_amount:"6832607"},BRL:{code:"BRL",title:"Brazilian Real",symbol:"R$",native:"R$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"539",max_amount:"5397799"},BYN:{code:"BYN",title:"Belarusian ruble",symbol:"BYN",native:"BYN",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"249",max_amount:"2495801"},CAD:{code:"CAD",title:"Canadian Dollar",symbol:"CA$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"136",max_amount:"1366860"},CHF:{code:"CHF",title:"Swiss Franc",symbol:"CHF",native:"CHF",thousands_sep:"'",decimal_sep:".",symbol_left:!1,space_between:!0,exp:2,min_amount:"97",max_amount:"976705"},CLP:{code:"CLP",title:"Chilean Peso",symbol:"CLP",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:0,min_amount:"963",max_amount:"9637495"},CNY:{code:"CNY",title:"Chinese Renminbi Yuan",symbol:"CNยฅ",native:"CNยฅ",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"709",max_amount:"7094102"},COP:{code:"COP",title:"Colombian Peso",symbol:"COP",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"452870",max_amount:"4528700000"},CRC:{code:"CRC",title:"Costa Rican Colรณn",symbol:"CRC",native:"โ‚ก",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!1,exp:2,min_amount:"62506",max_amount:"625061070"},CZK:{code:"CZK",title:"Czech Koruna",symbol:"CZK",native:"Kฤ",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"2497",max_amount:"24975029"},DKK:{code:"DKK",title:"Danish Krone",symbol:"DKK",native:"kr",thousands_sep:"",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"755",max_amount:"7555990"},DOP:{code:"DOP",title:"Dominican Peso",symbol:"DOP",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"5275",max_amount:"52757308"},DZD:{code:"DZD",title:"Algerian Dinar",symbol:"DZD",native:"ุฏ.ุฌ.โ€",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"14035",max_amount:"140353307"},EGP:{code:"EGP",title:"Egyptian Pound",symbol:"EGP",native:"ุฌ.ู….โ€",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"1953",max_amount:"19537405"},ETB:{code:"ETB",title:"Ethiopian Birr",symbol:"ETB",native:"แ‰ฅแˆญ",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"5224",max_amount:"52247069"},EUR:{code:"EUR",title:"Euro",symbol:"โ‚ฌ",native:"โ‚ฌ",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"101",max_amount:"1016045"},GBP:{code:"GBP",title:"British Pound",symbol:"ยฃ",native:"ยฃ",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"89",max_amount:"894445"},GEL:{code:"GEL",title:"Georgian Lari",symbol:"GEL",native:"GEL",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"283",max_amount:"2830234"},GTQ:{code:"GTQ",title:"Guatemalan Quetzal",symbol:"GTQ",native:"Q",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"778",max_amount:"7781323"},HKD:{code:"HKD",title:"Hong Kong Dollar",symbol:"HK$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"784",max_amount:"7849750"},HNL:{code:"HNL",title:"Honduran Lempira",symbol:"HNL",native:"L",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"2441",max_amount:"24413729"},HRK:{code:"HRK",title:"Croatian Kuna",symbol:"HRK",native:"kn",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"764",max_amount:"7648805"},HUF:{code:"HUF",title:"Hungarian Forint",symbol:"HUF",native:"Ft",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"42685",max_amount:"426850229"},IDR:{code:"IDR",title:"Indonesian Rupiah",symbol:"IDR",native:"Rp",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!1,exp:2,min_amount:"1523370",max_amount:"15233700000"},ILS:{code:"ILS",title:"Israeli New Sheqel",symbol:"โ‚ช",native:"โ‚ช",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"354",max_amount:"3543350"},INR:{code:"INR",title:"Indian Rupee",symbol:"โ‚น",native:"โ‚น",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"8155",max_amount:"81555550"},ISK:{code:"ISK",title:"Icelandic Krรณna",symbol:"ISK",native:"kr",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:0,min_amount:"142",max_amount:"1425603"},JMD:{code:"JMD",title:"Jamaican Dollar",symbol:"JMD",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"15013",max_amount:"150131044"},JPY:{code:"JPY",title:"Japanese Yen",symbol:"ยฅ",native:"๏ฟฅ",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:0,min_amount:"144",max_amount:"1443065"},KES:{code:"KES",title:"Kenyan Shilling",symbol:"KES",native:"Ksh",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"12075",max_amount:"120750271"},KGS:{code:"KGS",title:"Kyrgyzstani Som",symbol:"KGS",native:"KGS",thousands_sep:" ",decimal_sep:"-",symbol_left:!1,space_between:!0,exp:2,min_amount:"8018",max_amount:"80182898"},KRW:{code:"KRW",title:"South Korean Won",symbol:"โ‚ฉ",native:"โ‚ฉ",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:0,min_amount:"1431",max_amount:"14315201"},KZT:{code:"KZT",title:"Kazakhstani Tenge",symbol:"KZT",native:"โ‚ธ",thousands_sep:" ",decimal_sep:"-",symbol_left:!0,space_between:!1,exp:2,min_amount:"47186",max_amount:"471867112"},LBP:{code:"LBP",title:"Lebanese Pound",symbol:"LBP",native:"ู„.ู„.โ€",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"150999",max_amount:"1509998778"},LKR:{code:"LKR",title:"Sri Lankan Rupee",symbol:"LKR",native:"เถปเท”.",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"35546",max_amount:"355469651"},MAD:{code:"MAD",title:"Moroccan Dirham",symbol:"MAD",native:"ุฏ.ู….โ€",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"1093",max_amount:"10938136"},MDL:{code:"MDL",title:"Moldovan Leu",symbol:"MDL",native:"MDL",thousands_sep:",",decimal_sep:".",symbol_left:!1,space_between:!0,exp:2,min_amount:"1926",max_amount:"19264439"},MNT:{code:"MNT",title:"Mongolian Tรถgrรถg",symbol:"MNT",native:"MNT",thousands_sep:" ",decimal_sep:",",symbol_left:!0,space_between:!1,exp:2,min_amount:"322444",max_amount:"3224442056"},MUR:{code:"MUR",title:"Mauritian Rupee",symbol:"MUR",native:"MUR",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"4453",max_amount:"44535174"},MVR:{code:"MVR",title:"Maldivian Rufiyaa",symbol:"MVR",native:"MVR",thousands_sep:",",decimal_sep:".",symbol_left:!1,space_between:!0,exp:2,min_amount:"1546",max_amount:"15460397"},MXN:{code:"MXN",title:"Mexican Peso",symbol:"MX$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"2012",max_amount:"20122860"},MYR:{code:"MYR",title:"Malaysian Ringgit",symbol:"MYR",native:"RM",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"463",max_amount:"4632502"},MZN:{code:"MZN",title:"Mozambican Metical",symbol:"MZN",native:"MTn",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"6382",max_amount:"63829729"},NGN:{code:"NGN",title:"Nigerian Naira",symbol:"NGN",native:"โ‚ฆ",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"43203",max_amount:"432039828"},NIO:{code:"NIO",title:"Nicaraguan Cรณrdoba",symbol:"NIO",native:"C$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"3556",max_amount:"35566412"},NOK:{code:"NOK",title:"Norwegian Krone",symbol:"NOK",native:"kr",thousands_sep:" ",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"1069",max_amount:"10690975"},NPR:{code:"NPR",title:"Nepalese Rupee",symbol:"NPR",native:"เคจเฅ‡เคฐเฅ‚",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"12954",max_amount:"129546657"},NZD:{code:"NZD",title:"New Zealand Dollar",symbol:"NZ$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"174",max_amount:"1746220"},PAB:{code:"PAB",title:"Panamanian Balboa",symbol:"PAB",native:"B/.",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"98",max_amount:"988722"},PEN:{code:"PEN",title:"Peruvian Nuevo Sol",symbol:"PEN",native:"S/.",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"390",max_amount:"3902208"},PHP:{code:"PHP",title:"Philippine Peso",symbol:"PHP",native:"โ‚ฑ",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"5862",max_amount:"58627496"},PKR:{code:"PKR",title:"Pakistani Rupee",symbol:"PKR",native:"โ‚จ",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"22642",max_amount:"226426805"},PLN:{code:"PLN",title:"Polish Zล‚oty",symbol:"PLN",native:"zล‚",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"493",max_amount:"4932350"},PYG:{code:"PYG",title:"Paraguayan Guaranรญ",symbol:"PYG",native:"โ‚ฒ",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:0,min_amount:"6977",max_amount:"69772317"},QAR:{code:"QAR",title:"Qatari Riyal",symbol:"QAR",native:"ุฑ.ู‚.โ€",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"364",max_amount:"3640989"},RON:{code:"RON",title:"Romanian Leu",symbol:"RON",native:"RON",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"502",max_amount:"5028645"},RSD:{code:"RSD",title:"Serbian Dinar",symbol:"RSD",native:"ะดะธะฝ.",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"11918",max_amount:"119184990"},RUB:{code:"RUB",title:"Russian Ruble",symbol:"RUB",native:"โ‚ฝ",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"7128",max_amount:"71281218"},SAR:{code:"SAR",title:"Saudi Riyal",symbol:"SAR",native:"ุฑ.ุณ.โ€",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"375",max_amount:"3756546"},SEK:{code:"SEK",title:"Swedish Krona",symbol:"SEK",native:"kr",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"1109",max_amount:"11094972"},SGD:{code:"SGD",title:"Singapore Dollar",symbol:"SGD",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"143",max_amount:"1430495"},THB:{code:"THB",title:"Thai Baht",symbol:"เธฟ",native:"เธฟ",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"3780",max_amount:"37800497"},TJS:{code:"TJS",title:"Tajikistani Somoni",symbol:"TJS",native:"TJS",thousands_sep:" ",decimal_sep:";",symbol_left:!1,space_between:!0,exp:2,min_amount:"975",max_amount:"9753854"},TRY:{code:"TRY",title:"Turkish Lira",symbol:"TRY",native:"TL",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"1854",max_amount:"18543598"},TTD:{code:"TTD",title:"Trinidad and Tobago Dollar",symbol:"TTD",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"672",max_amount:"6722681"},TWD:{code:"TWD",title:"New Taiwan Dollar",symbol:"NT$",native:"NT$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"3173",max_amount:"31738502"},TZS:{code:"TZS",title:"Tanzanian Shilling",symbol:"TZS",native:"TSh",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"233199",max_amount:"2331999890"},UAH:{code:"UAH",title:"Ukrainian Hryvnia",symbol:"UAH",native:"โ‚ด",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!1,exp:2,min_amount:"3633",max_amount:"36338830"},UGX:{code:"UGX",title:"Ugandan Shilling",symbol:"UGX",native:"USh",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:0,min_amount:"3816",max_amount:"38166726"},USD:{code:"USD",title:"United States Dollar",symbol:"$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"100",max_amount:1e6},UYU:{code:"UYU",title:"Uruguayan Peso",symbol:"UYU",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"4080",max_amount:"40801205"},UZS:{code:"UZS",title:"Uzbekistani Som",symbol:"UZS",native:"UZS",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"1089058",max_amount:"10890583014"},VND:{code:"VND",title:"Vietnamese ฤแป“ng",symbol:"โ‚ซ",native:"โ‚ซ",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:0,min_amount:"23862",max_amount:"238625000"},YER:{code:"YER",title:"Yemeni Rial",symbol:"YER",native:"ุฑ.ูŠ.โ€",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"25030",max_amount:"250300677"},ZAR:{code:"ZAR",title:"South African Rand",symbol:"ZAR",native:"R",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"1789",max_amount:"17894299"}}},3447:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a,i:()=>s});const s={14:{"1f6dd":4867,"1f6de":4916,"1f6df":4923,"1f7f0":62832,"1f979":183,"1f9cc":1557,"1fa7b":61332,"1fa7c":61330,"1faa9":51093,"1faaa":61364,"1faab":61189,"1faac":51085,"1fab7":2651,"1fab8":2631,"1fab9":2672,"1faba":2673,"1fac3":1520,"1fac4":1521,"1fac5":1505,"1fad7":3793,"1fad8":3707,"1fad9":3804,"1fae0":111,"1fae1":136,"1fae2":132,"1fae3":133,"1fae4":174,"1fae5":142,"1fae6":1385,"1fae7":61353,"1faf0":1341,"1faf1":1332,"1faf2":1333,"1faf3":1334,"1faf4":1335,"1faf5":1351,"1faf6":1360,"1faf1-1f3fb-200d-1faf2-1f3fc":0,"1faf1-1f3fb-200d-1faf2-1f3fd":0,"1faf1-1f3fb-200d-1faf2-1f3fe":0,"1faf1-1f3fb-200d-1faf2-1f3ff":0,"1faf1-1f3fc-200d-1faf2-1f3fb":0,"1faf1-1f3fc-200d-1faf2-1f3fd":0,"1faf1-1f3fc-200d-1faf2-1f3fe":0,"1faf1-1f3fc-200d-1faf2-1f3ff":0,"1faf1-1f3fd-200d-1faf2-1f3fb":0,"1faf1-1f3fd-200d-1faf2-1f3fc":0,"1faf1-1f3fd-200d-1faf2-1f3fe":0,"1faf1-1f3fd-200d-1faf2-1f3ff":0,"1faf1-1f3fe-200d-1faf2-1f3fb":0,"1faf1-1f3fe-200d-1faf2-1f3fc":0,"1faf1-1f3fe-200d-1faf2-1f3fd":0,"1faf1-1f3fe-200d-1faf2-1f3ff":0,"1faf1-1f3ff-200d-1faf2-1f3fb":0,"1faf1-1f3ff-200d-1faf2-1f3fc":0,"1faf1-1f3ff-200d-1faf2-1f3fd":0,"1faf1-1f3ff-200d-1faf2-1f3fe":0,"1fac3-1f3fb":0,"1fac3-1f3fc":0,"1fac3-1f3fd":0,"1fac3-1f3fe":0,"1fac3-1f3ff":0,"1fac4-1f3fb":0,"1fac4-1f3fc":0,"1fac4-1f3fd":0,"1fac4-1f3fe":0,"1fac4-1f3ff":0,"1fac5-1f3fb":0,"1fac5-1f3fc":0,"1fac5-1f3fd":0,"1fac5-1f3fe":0,"1fac5-1f3ff":0,"1faf0-1f3fb":0,"1faf0-1f3fc":0,"1faf0-1f3fd":0,"1faf0-1f3fe":0,"1faf0-1f3ff":0,"1faf1-1f3fb":0,"1faf1-1f3fc":0,"1faf1-1f3fd":0,"1faf1-1f3fe":0,"1faf1-1f3ff":0,"1faf2-1f3fb":0,"1faf2-1f3fc":0,"1faf2-1f3fd":0,"1faf2-1f3fe":0,"1faf2-1f3ff":0,"1faf3-1f3fb":0,"1faf3-1f3fc":0,"1faf3-1f3fd":0,"1faf3-1f3fe":0,"1faf3-1f3ff":0,"1faf4-1f3fb":0,"1faf4-1f3fc":0,"1faf4-1f3fd":0,"1faf4-1f3fe":0,"1faf4-1f3ff":0,"1faf5-1f3fb":0,"1faf5-1f3fc":0,"1faf5-1f3fd":0,"1faf5-1f3fe":0,"1faf5-1f3ff":0,"1faf6-1f3fb":0,"1faf6-1f3fc":0,"1faf6-1f3fd":0,"1faf6-1f3fe":0,"1faf6-1f3ff":0},"":{2049:62835,2122:62863,2139:62888,2194:62764,2195:62763,2196:62762,2197:62756,2198:62758,2199:62760,2328:61194,2600:4990,2601:4998,2602:41013,2603:41018,2604:41020,2611:62851,2614:41014,2615:3781,2618:2667,2620:1106,2622:62753,2623:62754,2626:62783,2638:62780,2639:177,2648:62788,2649:62789,2650:62796,2651:62797,2652:62798,2653:62799,2660:51095,2663:51098,2665:51096,2666:51097,2668:4865,2692:61297,2693:4922,2694:61300,2696:61311,2697:61319,2699:61309,2702:61284,2705:62850,2708:4931,2709:61245,2712:61259,2714:62852,2716:62828,2721:62779,2728:51029,2733:62858,2734:62859,2744:41017,2747:62860,2753:62836,2754:62837,2755:62838,2757:62839,2763:1137,2764:1141,2795:62829,2796:62830,2797:62831,2934:62767,2935:62768,3030:62840,3297:62912,3299:62913,"0023-20e3":62864,"002a-20e3":62865,"0030-20e3":62866,"0031-20e3":62867,"0032-20e3":62868,"0033-20e3":62869,"0034-20e3":62870,"0035-20e3":62871,"0036-20e3":62872,"0037-20e3":62873,"0038-20e3":62874,"0039-20e3":62875,"00a9":62861,"00ae":62862,"1f004":51101,"1f0cf":51100,"1f170":62882,"1f171":62884,"1f17e":62893,"1f17f":62895,"1f18e":62883,"1f191":62885,"1f192":62886,"1f193":62887,"1f194":62889,"1f195":62891,"1f196":62892,"1f197":62894,"1f198":62896,"1f199":62897,"1f19a":62898,"1f1e6-1f1e8":71594,"1f1e6-1f1e9":71595,"1f1e6-1f1ea":71596,"1f1e6-1f1eb":71597,"1f1e6-1f1ec":71598,"1f1e6-1f1ee":71599,"1f1e6-1f1f1":71600,"1f1e6-1f1f2":71601,"1f1e6-1f1f4":71602,"1f1e6-1f1f6":71603,"1f1e6-1f1f7":71604,"1f1e6-1f1f8":71605,"1f1e6-1f1f9":71606,"1f1e6-1f1fa":71607,"1f1e6-1f1fc":71608,"1f1e6-1f1fd":71609,"1f1e6-1f1ff":71610,"1f1e7-1f1e6":71611,"1f1e7-1f1e7":71612,"1f1e7-1f1e9":71613,"1f1e7-1f1ea":71614,"1f1e7-1f1eb":71615,"1f1e7-1f1ec":71616,"1f1e7-1f1ed":71617,"1f1e7-1f1ee":71618,"1f1e7-1f1ef":71619,"1f1e7-1f1f1":71620,"1f1e7-1f1f2":71621,"1f1e7-1f1f3":71622,"1f1e7-1f1f4":71623,"1f1e7-1f1f6":71624,"1f1e7-1f1f7":71625,"1f1e7-1f1f8":71626,"1f1e7-1f1f9":71627,"1f1e7-1f1fb":71628,"1f1e7-1f1fc":71629,"1f1e7-1f1fe":71630,"1f1e7-1f1ff":71631,"1f1e8-1f1e6":71632,"1f1e8-1f1e8":71633,"1f1e8-1f1e9":71634,"1f1e8-1f1eb":71635,"1f1e8-1f1ec":71636,"1f1e8-1f1ed":71637,"1f1e8-1f1ee":71638,"1f1e8-1f1f0":71639,"1f1e8-1f1f1":71640,"1f1e8-1f1f2":71641,"1f1e8-1f1f3":71642,"1f1e8-1f1f4":71643,"1f1e8-1f1f5":71644,"1f1e8-1f1f7":71645,"1f1e8-1f1fa":71646,"1f1e8-1f1fb":71647,"1f1e8-1f1fc":71648,"1f1e8-1f1fd":71649,"1f1e8-1f1fe":71650,"1f1e8-1f1ff":71651,"1f1e9-1f1ea":71652,"1f1e9-1f1ec":71653,"1f1e9-1f1ef":71654,"1f1e9-1f1f0":71655,"1f1e9-1f1f2":71656,"1f1e9-1f1f4":71657,"1f1e9-1f1ff":71658,"1f1ea-1f1e6":71659,"1f1ea-1f1e8":71660,"1f1ea-1f1ea":71661,"1f1ea-1f1ec":71662,"1f1ea-1f1ed":71663,"1f1ea-1f1f7":71664,"1f1ea-1f1f8":71665,"1f1ea-1f1f9":71666,"1f1ea-1f1fa":71667,"1f1eb-1f1ee":71668,"1f1eb-1f1ef":71669,"1f1eb-1f1f0":71670,"1f1eb-1f1f2":71671,"1f1eb-1f1f4":71672,"1f1eb-1f1f7":71673,"1f1ec-1f1e6":71674,"1f1ec-1f1e7":71675,"1f1ec-1f1e9":71676,"1f1ec-1f1ea":71677,"1f1ec-1f1eb":71678,"1f1ec-1f1ec":71679,"1f1ec-1f1ed":71680,"1f1ec-1f1ee":71681,"1f1ec-1f1f1":71682,"1f1ec-1f1f2":71683,"1f1ec-1f1f3":71684,"1f1ec-1f1f5":71685,"1f1ec-1f1f6":71686,"1f1ec-1f1f7":71687,"1f1ec-1f1f8":71688,"1f1ec-1f1f9":71689,"1f1ec-1f1fa":71690,"1f1ec-1f1fc":71691,"1f1ec-1f1fe":71692,"1f1ed-1f1f0":71693,"1f1ed-1f1f2":71694,"1f1ed-1f1f3":71695,"1f1ed-1f1f7":71696,"1f1ed-1f1f9":71697,"1f1ed-1f1fa":71698,"1f1ee-1f1e8":71699,"1f1ee-1f1e9":71700,"1f1ee-1f1ea":71701,"1f1ee-1f1f1":71702,"1f1ee-1f1f2":71703,"1f1ee-1f1f3":71704,"1f1ee-1f1f4":71705,"1f1ee-1f1f6":71706,"1f1ee-1f1f7":71707,"1f1ee-1f1f8":71708,"1f1ee-1f1f9":71709,"1f1ef-1f1ea":71710,"1f1ef-1f1f2":71711,"1f1ef-1f1f4":71712,"1f1ef-1f1f5":71713,"1f1f0-1f1ea":71714,"1f1f0-1f1ec":71715,"1f1f0-1f1ed":71716,"1f1f0-1f1ee":71717,"1f1f0-1f1f2":71718,"1f1f0-1f1f3":71719,"1f1f0-1f1f5":71720,"1f1f0-1f1f7":71721,"1f1f0-1f1fc":71722,"1f1f0-1f1fe":71723,"1f1f0-1f1ff":71724,"1f1f1-1f1e6":71725,"1f1f1-1f1e7":71726,"1f1f1-1f1e8":71727,"1f1f1-1f1ee":71728,"1f1f1-1f1f0":71729,"1f1f1-1f1f7":71730,"1f1f1-1f1f8":71731,"1f1f1-1f1f9":71732,"1f1f1-1f1fa":71733,"1f1f1-1f1fb":71734,"1f1f1-1f1fe":71735,"1f1f2-1f1e6":71736,"1f1f2-1f1e8":71737,"1f1f2-1f1e9":71738,"1f1f2-1f1ea":71739,"1f1f2-1f1eb":71740,"1f1f2-1f1ec":71741,"1f1f2-1f1ed":71742,"1f1f2-1f1f0":71743,"1f1f2-1f1f1":71744,"1f1f2-1f1f2":71745,"1f1f2-1f1f3":71746,"1f1f2-1f1f4":71747,"1f1f2-1f1f5":71748,"1f1f2-1f1f6":71749,"1f1f2-1f1f7":71750,"1f1f2-1f1f8":71751,"1f1f2-1f1f9":71752,"1f1f2-1f1fa":71753,"1f1f2-1f1fb":71754,"1f1f2-1f1fc":71755,"1f1f2-1f1fd":71756,"1f1f2-1f1fe":71757,"1f1f2-1f1ff":71758,"1f1f3-1f1e6":71759,"1f1f3-1f1e8":71760,"1f1f3-1f1ea":71761,"1f1f3-1f1eb":71762,"1f1f3-1f1ec":71763,"1f1f3-1f1ee":71764,"1f1f3-1f1f1":71765,"1f1f3-1f1f4":71766,"1f1f3-1f1f5":71767,"1f1f3-1f1f7":71768,"1f1f3-1f1fa":71769,"1f1f3-1f1ff":71770,"1f1f4-1f1f2":71771,"1f1f5-1f1e6":71772,"1f1f5-1f1ea":71773,"1f1f5-1f1eb":71774,"1f1f5-1f1ec":71775,"1f1f5-1f1ed":71776,"1f1f5-1f1f0":71777,"1f1f5-1f1f1":71778,"1f1f5-1f1f2":71779,"1f1f5-1f1f3":71780,"1f1f5-1f1f7":71781,"1f1f5-1f1f8":71782,"1f1f5-1f1f9":71783,"1f1f5-1f1fc":71784,"1f1f5-1f1fe":71785,"1f1f6-1f1e6":71786,"1f1f7-1f1ea":71787,"1f1f7-1f1f4":71788,"1f1f7-1f1f8":71789,"1f1f7-1f1fa":71790,"1f1f7-1f1fc":71791,"1f1f8-1f1e6":71792,"1f1f8-1f1e7":71793,"1f1f8-1f1e8":71794,"1f1f8-1f1e9":71795,"1f1f8-1f1ea":71796,"1f1f8-1f1ec":71797,"1f1f8-1f1ed":71798,"1f1f8-1f1ee":71799,"1f1f8-1f1ef":71800,"1f1f8-1f1f0":71801,"1f1f8-1f1f1":71802,"1f1f8-1f1f2":71803,"1f1f8-1f1f3":71804,"1f1f8-1f1f4":71805,"1f1f8-1f1f7":71806,"1f1f8-1f1f8":71807,"1f1f8-1f1f9":71808,"1f1f8-1f1fb":71809,"1f1f8-1f1fd":71810,"1f1f8-1f1fe":71811,"1f1f8-1f1ff":71812,"1f1f9-1f1e6":71813,"1f1f9-1f1e8":71814,"1f1f9-1f1e9":71815,"1f1f9-1f1eb":71816,"1f1f9-1f1ec":71817,"1f1f9-1f1ed":71818,"1f1f9-1f1ef":71819,"1f1f9-1f1f0":71820,"1f1f9-1f1f1":71821,"1f1f9-1f1f2":71822,"1f1f9-1f1f3":71823,"1f1f9-1f1f4":71824,"1f1f9-1f1f7":71825,"1f1f9-1f1f9":71826,"1f1f9-1f1fb":71827,"1f1f9-1f1fc":71828,"1f1f9-1f1ff":71829,"1f1fa-1f1e6":71830,"1f1fa-1f1ec":71831,"1f1fa-1f1f2":71832,"1f1fa-1f1f3":71833,"1f1fa-1f1f8":71834,"1f1fa-1f1fe":71835,"1f1fa-1f1ff":71836,"1f1fb-1f1e6":71837,"1f1fb-1f1e8":71838,"1f1fb-1f1ea":71839,"1f1fb-1f1ec":71840,"1f1fb-1f1ee":71841,"1f1fb-1f1f3":71842,"1f1fb-1f1fa":71843,"1f1fc-1f1eb":71844,"1f1fc-1f1f8":71845,"1f1fd-1f1f0":71846,"1f1fe-1f1ea":71847,"1f1fe-1f1f9":71848,"1f1ff-1f1e6":71849,"1f1ff-1f1f2":71850,"1f1ff-1f1fc":71851,"1f201":62899,"1f202":62900,"1f21a":62906,"1f22f":62903,"1f232":62907,"1f233":62911,"1f234":62910,"1f235":62915,"1f236":62902,"1f237":62901,"1f238":62909,"1f239":62905,"1f23a":62914,"1f250":62904,"1f251":62908,"1f300":41010,"1f301":4857,"1f302":41012,"1f303":4858,"1f304":4860,"1f305":4861,"1f306":4862,"1f307":4863,"1f308":41011,"1f309":4864,"1f30a":41023,"1f30b":4815,"1f30c":4997,"1f30d":4806,"1f30e":4807,"1f30f":4808,"1f310":4809,"1f311":4977,"1f312":4978,"1f313":4979,"1f314":4980,"1f315":4981,"1f316":4982,"1f317":4983,"1f318":4984,"1f319":4985,"1f31a":4986,"1f31b":4987,"1f31c":4988,"1f31d":4991,"1f31e":4992,"1f31f":4995,"1f320":4996,"1f321":4989,"1f324":41001,"1f325":41002,"1f326":41003,"1f327":41004,"1f328":41005,"1f329":41006,"1f32a":41007,"1f32b":41008,"1f32c":41009,"1f32d":3725,"1f32e":3727,"1f32f":3728,"1f330":3708,"1f331":2659,"1f332":2661,"1f333":2662,"1f334":2663,"1f335":2664,"1f336":3698,"1f337":2658,"1f338":2649,"1f339":2653,"1f33a":2655,"1f33b":2656,"1f33c":2657,"1f33d":3697,"1f33e":2665,"1f33f":2666,"1f340":2668,"1f341":2669,"1f342":2670,"1f343":2671,"1f344":3705,"1f345":3690,"1f346":3694,"1f347":3674,"1f348":3675,"1f349":3676,"1f34a":3677,"1f34b":3678,"1f34c":3679,"1f34d":3680,"1f34e":3682,"1f34f":3683,"1f350":3684,"1f351":3685,"1f352":3686,"1f353":3687,"1f354":3722,"1f355":3724,"1f356":3718,"1f357":3719,"1f358":3744,"1f359":3745,"1f35a":3746,"1f35b":3747,"1f35c":3748,"1f35d":3749,"1f35e":3709,"1f35f":3723,"1f360":3750,"1f361":3756,"1f362":3751,"1f363":3752,"1f364":3753,"1f365":3754,"1f366":3765,"1f367":3766,"1f368":3767,"1f369":3768,"1f36a":3769,"1f36b":3774,"1f36c":3775,"1f36d":3776,"1f36e":3777,"1f36f":3778,"1f370":3771,"1f371":3743,"1f372":3735,"1f373":3733,"1f374":3801,"1f375":3783,"1f376":3784,"1f377":3786,"1f378":3787,"1f379":3788,"1f37a":3789,"1f37b":3790,"1f37c":3779,"1f37d":3800,"1f37e":3785,"1f37f":3739,"1f380":51040,"1f381":51041,"1f382":3770,"1f383":51024,"1f384":51025,"1f385":1527,"1f386":51026,"1f387":51027,"1f388":51030,"1f389":51031,"1f38a":51032,"1f38b":51033,"1f38c":71588,"1f38d":51034,"1f38e":51035,"1f38f":51036,"1f390":51037,"1f391":51038,"1f392":61134,"1f393":61147,"1f396":51045,"1f397":51042,"1f399":61167,"1f39a":61168,"1f39b":61169,"1f39e":61203,"1f39f":51043,"1f3a0":4866,"1f3a1":4868,"1f3a2":4869,"1f3a3":51072,"1f3a4":61170,"1f3a5":61202,"1f3a6":62819,"1f3a7":61171,"1f3a8":51105,"1f3a9":61146,"1f3aa":4871,"1f3ab":51044,"1f3ac":61205,"1f3ad":51103,"1f3ae":51086,"1f3af":51078,"1f3b0":51088,"1f3b1":51081,"1f3b2":51089,"1f3b3":51060,"1f3b4":51102,"1f3b5":61165,"1f3b6":61166,"1f3b7":61173,"1f3b8":61175,"1f3b9":61176,"1f3ba":61177,"1f3bb":61178,"1f3bc":61164,"1f3bd":51074,"1f3be":51058,"1f3bf":51075,"1f3c0":51054,"1f3c1":71586,"1f3c2":1600,"1f3c3-200d-2640":1584,"1f3c3-200d-2642":1583,"1f3c3":1582,"1f3c4-200d-2640":1606,"1f3c4-200d-2642":1605,"1f3c4":1604,"1f3c5":51047,"1f3c6":51046,"1f3c7":1598,"1f3c8":51056,"1f3c9":51057,"1f3ca-200d-2640":1612,"1f3ca-200d-2642":1611,"1f3ca":1610,"1f3cb-200d-2640":1618,"1f3cb-200d-2642":1617,"1f3cb":1616,"1f3cc-200d-2640":1603,"1f3cc-200d-2642":1602,"1f3cc":1601,"1f3cd":4902,"1f3ce":4901,"1f3cf":51061,"1f3d0":51055,"1f3d1":51062,"1f3d2":51063,"1f3d3":51065,"1f3d4":4813,"1f3d5":4817,"1f3d6":4818,"1f3d7":4824,"1f3d8":4829,"1f3d9":4859,"1f3da":4830,"1f3db":4823,"1f3dc":4819,"1f3dd":4820,"1f3de":4821,"1f3df":4822,"1f3e0":4831,"1f3e1":4832,"1f3e2":4833,"1f3e3":4834,"1f3e4":4835,"1f3e5":4836,"1f3e6":4837,"1f3e7":62729,"1f3e8":4838,"1f3e9":4839,"1f3ea":4840,"1f3eb":4841,"1f3ec":4842,"1f3ed":4843,"1f3ee":61216,"1f3ef":4844,"1f3f0":4845,"1f3f3-200d-1f308":71591,"1f3f3-200d-26a7":71592,"1f3f3":71590,"1f3f4-200d-2620":71593,"1f3f4-e0067-e0062-e0065-e006e-e0067-e007f":71852,"1f3f4-e0067-e0062-e0073-e0063-e0074-e007f":71853,"1f3f4-e0067-e0062-e0077-e006c-e0073-e007f":71854,"1f3f4":71589,"1f3f5":2652,"1f3f7":61234,"1f3f8":51066,"1f3f9":61303,"1f3fa":3805,"1f3fb":9525,"1f3fc":9526,"1f3fd":9527,"1f3fe":9528,"1f3ff":9529,"1f400":2576,"1f401":2575,"1f402":2556,"1f403":2557,"1f404":2558,"1f405":2547,"1f406":2548,"1f407":2579,"1f408-200d-2b1b":2544,"1f408":2543,"1f409":2618,"1f40a":2613,"1f40b":2622,"1f40c":2632,"1f40d":2616,"1f40e":2550,"1f40f":2563,"1f410":2565,"1f411":2564,"1f412":2531,"1f413":2596,"1f414":2595,"1f415-200d-1f9ba":2537,"1f415":2535,"1f416":2560,"1f417":2561,"1f418":2570,"1f419":2629,"1f41a":2630,"1f41b":2634,"1f41c":2635,"1f41d":2636,"1f41e":2638,"1f41f":2625,"1f420":2626,"1f421":2627,"1f422":2614,"1f423":2597,"1f424":2598,"1f425":2599,"1f426":2600,"1f427":2601,"1f428":2586,"1f429":2538,"1f42a":2566,"1f42b":2567,"1f42c":2623,"1f42d":2574,"1f42e":2555,"1f42f":2546,"1f430":2578,"1f431":2542,"1f432":2617,"1f433":2621,"1f434":2549,"1f435":2530,"1f436":2534,"1f437":2559,"1f438":2612,"1f439":2577,"1f43a":2539,"1f43b-200d-2744":2585,"1f43b":2584,"1f43c":2587,"1f43d":2562,"1f43e":2593,"1f43f":2580,"1f440":1381,"1f441-200d-1f5e8":1159,"1f441":1382,"1f442":1373,"1f443":1375,"1f444":1384,"1f445":1383,"1f446":1347,"1f447":1349,"1f448":1345,"1f449":1346,"1f44a":1355,"1f44b":1327,"1f44c":1336,"1f44d":1352,"1f44e":1353,"1f44f":1358,"1f450":1361,"1f451":61144,"1f452":61145,"1f453":61110,"1f454":61115,"1f455":61116,"1f456":61117,"1f457":61122,"1f458":61123,"1f459":61128,"1f45a":61129,"1f45b":61130,"1f45c":61131,"1f45d":61132,"1f45e":61136,"1f45f":61137,"1f460":61140,"1f461":61141,"1f462":61143,"1f463":1687,"1f464":1684,"1f465":1685,"1f466":1388,"1f467":1389,"1f468-200d-1f33e":1457,"1f468-200d-1f373":1460,"1f468-200d-1f37c":1524,"1f468-200d-1f393":1448,"1f468-200d-1f3a4":1478,"1f468-200d-1f3a8":1481,"1f468-200d-1f3eb":1451,"1f468-200d-1f3ed":1466,"1f468-200d-1f466-200d-1f466":1674,"1f468-200d-1f466":1673,"1f468-200d-1f467-200d-1f466":1676,"1f468-200d-1f467-200d-1f467":1677,"1f468-200d-1f467":1675,"1f468-200d-1f468-200d-1f466":1663,"1f468-200d-1f468-200d-1f466-200d-1f466":1666,"1f468-200d-1f468-200d-1f467":1664,"1f468-200d-1f468-200d-1f467-200d-1f466":1665,"1f468-200d-1f468-200d-1f467-200d-1f467":1667,"1f468-200d-1f469-200d-1f466":1658,"1f468-200d-1f469-200d-1f466-200d-1f466":1661,"1f468-200d-1f469-200d-1f467":1659,"1f468-200d-1f469-200d-1f467-200d-1f466":1660,"1f468-200d-1f469-200d-1f467-200d-1f467":1662,"1f468-200d-1f4bb":1475,"1f468-200d-1f4bc":1469,"1f468-200d-1f527":1463,"1f468-200d-1f52c":1472,"1f468-200d-1f680":1487,"1f468-200d-1f692":1490,"1f468-200d-1f9af":1574,"1f468-200d-1f9b0":1396,"1f468-200d-1f9b1":1397,"1f468-200d-1f9b2":1399,"1f468-200d-1f9b3":1398,"1f468-200d-1f9bc":1577,"1f468-200d-1f9bd":1580,"1f468-200d-2695":1445,"1f468-200d-2696":1454,"1f468-200d-2708":1484,"1f468-200d-2764-200d-1f468":1655,"1f468-200d-2764-200d-1f48b-200d-1f468":1651,"1f468":1392,"1f469-200d-1f33e":1458,"1f469-200d-1f373":1461,"1f469-200d-1f37c":1523,"1f469-200d-1f393":1449,"1f469-200d-1f3a4":1479,"1f469-200d-1f3a8":1482,"1f469-200d-1f3eb":1452,"1f469-200d-1f3ed":1467,"1f469-200d-1f466-200d-1f466":1679,"1f469-200d-1f466":1678,"1f469-200d-1f467-200d-1f466":1681,"1f469-200d-1f467-200d-1f467":1682,"1f469-200d-1f467":1680,"1f469-200d-1f469-200d-1f466":1668,"1f469-200d-1f469-200d-1f466-200d-1f466":1671,"1f469-200d-1f469-200d-1f467":1669,"1f469-200d-1f469-200d-1f467-200d-1f466":1670,"1f469-200d-1f469-200d-1f467-200d-1f467":1672,"1f469-200d-1f4bb":1476,"1f469-200d-1f4bc":1470,"1f469-200d-1f527":1464,"1f469-200d-1f52c":1473,"1f469-200d-1f680":1488,"1f469-200d-1f692":1491,"1f469-200d-1f9af":1575,"1f469-200d-1f9b0":1401,"1f469-200d-1f9b1":1403,"1f469-200d-1f9b2":1407,"1f469-200d-1f9b3":1405,"1f469-200d-1f9bc":1578,"1f469-200d-1f9bd":1581,"1f469-200d-2695":1446,"1f469-200d-2696":1455,"1f469-200d-2708":1485,"1f469-200d-2764-200d-1f468":1654,"1f469-200d-2764-200d-1f469":1656,"1f469-200d-2764-200d-1f48b-200d-1f468":1650,"1f469-200d-2764-200d-1f48b-200d-1f469":1652,"1f469":1400,"1f46a":1657,"1f46b":1647,"1f46c":1648,"1f46d":1646,"1f46e-200d-2640":1494,"1f46e-200d-2642":1493,"1f46e":1492,"1f46f-200d-2640":1590,"1f46f-200d-2642":1589,"1f46f":1588,"1f470-200d-2640":1518,"1f470-200d-2642":1517,"1f470":1516,"1f471-200d-2640":1409,"1f471-200d-2642":1410,"1f471":1391,"1f472":1511,"1f473-200d-2640":1510,"1f473-200d-2642":1509,"1f473":1508,"1f474":1412,"1f475":1413,"1f476":1386,"1f477-200d-2640":1504,"1f477-200d-2642":1503,"1f477":1502,"1f478":1507,"1f479":1109,"1f47a":1110,"1f47b":1111,"1f47c":1526,"1f47d":1112,"1f47e":1113,"1f47f":1104,"1f480":1105,"1f481-200d-2640":1428,"1f481-200d-2642":1427,"1f481":1426,"1f482-200d-2640":1500,"1f482-200d-2642":1499,"1f482":1498,"1f483":1585,"1f484":61152,"1f485":1366,"1f486-200d-2640":1560,"1f486-200d-2642":1559,"1f486":1558,"1f487-200d-2640":1563,"1f487-200d-2642":1562,"1f487":1561,"1f488":4870,"1f489":61326,"1f48a":61328,"1f48b":1127,"1f48c":1128,"1f48d":61153,"1f48e":61154,"1f48f":1649,"1f490":2648,"1f491":1653,"1f492":4846,"1f493":1133,"1f494":1138,"1f495":1135,"1f496":1131,"1f497":1132,"1f498":1129,"1f499":1145,"1f49a":1144,"1f49b":1143,"1f49c":1146,"1f49d":1130,"1f49e":1134,"1f49f":1136,"1f4a0":62946,"1f4a1":61214,"1f4a2":1151,"1f4a3":1157,"1f4a4":1163,"1f4a5":1152,"1f4a6":1154,"1f4a7":41022,"1f4a8":1155,"1f4a9":1107,"1f4aa":1368,"1f4ab":1153,"1f4ac":1158,"1f4ad":1162,"1f4ae":2650,"1f4af":1150,"1f4b0":61235,"1f4b1":62841,"1f4b2":62842,"1f4b3":61242,"1f4b4":61237,"1f4b5":61238,"1f4b6":61239,"1f4b7":61240,"1f4b8":61241,"1f4b9":61244,"1f4ba":4936,"1f4bb":61191,"1f4bc":61265,"1f4bd":61197,"1f4be":61198,"1f4bf":61199,"1f4c0":61200,"1f4c1":61266,"1f4c2":61267,"1f4c3":61227,"1f4c4":61229,"1f4c5":61269,"1f4c6":61270,"1f4c7":61273,"1f4c8":61274,"1f4c9":61275,"1f4ca":61276,"1f4cb":61277,"1f4cc":61278,"1f4cd":61279,"1f4ce":61280,"1f4cf":61282,"1f4d0":61283,"1f4d1":61232,"1f4d2":61226,"1f4d3":61225,"1f4d4":61218,"1f4d5":61219,"1f4d6":61220,"1f4d7":61221,"1f4d8":61222,"1f4d9":61223,"1f4da":61224,"1f4db":62847,"1f4dc":61228,"1f4dd":61264,"1f4de":61185,"1f4df":61186,"1f4e0":61187,"1f4e1":61325,"1f4e2":61159,"1f4e3":61160,"1f4e4":61249,"1f4e5":61250,"1f4e6":61251,"1f4e7":61246,"1f4e8":61247,"1f4e9":61248,"1f4ea":61253,"1f4eb":61252,"1f4ec":61254,"1f4ed":61255,"1f4ee":61256,"1f4ef":61161,"1f4f0":61230,"1f4f1":61182,"1f4f2":61183,"1f4f3":62823,"1f4f4":62824,"1f4f5":62751,"1f4f6":62822,"1f4f7":61207,"1f4f8":61208,"1f4f9":61209,"1f4fa":61206,"1f4fb":61172,"1f4fc":61210,"1f4fd":61204,"1f4ff":61151,"1f500":62801,"1f501":62802,"1f502":62803,"1f503":62769,"1f504":62770,"1f505":62820,"1f506":62821,"1f507":61155,"1f508":61156,"1f509":61157,"1f50a":61158,"1f50b":61188,"1f50c":61190,"1f50d":61211,"1f50e":61212,"1f50f":61290,"1f510":61291,"1f511":61292,"1f512":61288,"1f513":61289,"1f514":61162,"1f515":61163,"1f516":61233,"1f517":61313,"1f518":62947,"1f519":62771,"1f51a":62772,"1f51b":62773,"1f51c":62774,"1f51d":62775,"1f51e":62752,"1f51f":62876,"1f520":62877,"1f521":62878,"1f522":62879,"1f523":62880,"1f524":62881,"1f525":41021,"1f526":61215,"1f527":61306,"1f528":61294,"1f529":61308,"1f52a":3803,"1f52b":61301,"1f52c":61323,"1f52d":61324,"1f52e":51082,"1f52f":62787,"1f530":62848,"1f531":62846,"1f532":62949,"1f533":62948,"1f534":62916,"1f535":62920,"1f536":62940,"1f537":62941,"1f538":62942,"1f539":62943,"1f53a":62944,"1f53b":62945,"1f53c":62811,"1f53d":62813,"1f549":62778,"1f54a":2602,"1f54b":4854,"1f54c":4850,"1f54d":4852,"1f54e":62786,"1f550":4955,"1f551":4957,"1f552":4959,"1f553":4961,"1f554":4963,"1f555":4965,"1f556":4967,"1f557":4969,"1f558":4971,"1f559":4973,"1f55a":4975,"1f55b":4953,"1f55c":4956,"1f55d":4958,"1f55e":4960,"1f55f":4962,"1f560":4964,"1f561":4966,"1f562":4968,"1f563":4970,"1f564":4972,"1f565":4974,"1f566":4976,"1f567":4954,"1f56f":61213,"1f570":4952,"1f573":1156,"1f574":1587,"1f575-200d-2640":1497,"1f575-200d-2642":1496,"1f575":1495,"1f576":61111,"1f577":2641,"1f578":2642,"1f579":51087,"1f57a":1586,"1f587":61281,"1f58a":61261,"1f58b":61260,"1f58c":61262,"1f58d":61263,"1f590":1329,"1f595":1348,"1f596":1331,"1f5a4":1148,"1f5a5":61192,"1f5a8":61193,"1f5b1":61195,"1f5b2":61196,"1f5bc":51104,"1f5c2":61268,"1f5c3":61285,"1f5c4":61286,"1f5d1":61287,"1f5d2":61271,"1f5d3":61272,"1f5dc":61310,"1f5dd":61293,"1f5de":61231,"1f5e1":61299,"1f5e3":1683,"1f5e8":1160,"1f5ef":1161,"1f5f3":61257,"1f5fa":4810,"1f5fb":4816,"1f5fc":4847,"1f5fd":4848,"1f5fe":4811,"1f5ff":61362,"1f600":11,"1f601":14,"1f602":18,"1f603":12,"1f604":13,"1f605":16,"1f606":15,"1f607":114,"1f608":1103,"1f609":112,"1f60a":113,"1f60b":124,"1f60c":150,"1f60d":116,"1f60e":170,"1f60f":144,"1f610":139,"1f611":140,"1f612":145,"1f613":195,"1f614":151,"1f615":173,"1f616":192,"1f617":119,"1f618":118,"1f619":122,"1f61a":121,"1f61b":125,"1f61c":126,"1f61d":128,"1f61e":194,"1f61f":175,"1f620":1101,"1f621":1100,"1f622":189,"1f623":193,"1f624":199,"1f625":188,"1f626":184,"1f627":185,"1f628":186,"1f629":196,"1f62a":152,"1f62b":197,"1f62c":147,"1f62d":190,"1f62e-200d-1f4a8":148,"1f62e":178,"1f62f":179,"1f630":187,"1f631":191,"1f632":180,"1f633":181,"1f634":154,"1f635-200d-1f4ab":165,"1f635":164,"1f636-200d-1f32b":143,"1f636":141,"1f637":155,"1f638":1116,"1f639":1117,"1f63a":1115,"1f63b":1118,"1f63c":1119,"1f63d":1120,"1f63e":1123,"1f63f":1122,"1f640":1121,"1f641":176,"1f642":19,"1f643":110,"1f644":146,"1f645-200d-2640":1422,"1f645-200d-2642":1421,"1f645":1420,"1f646-200d-2640":1425,"1f646-200d-2642":1424,"1f646":1423,"1f647-200d-2640":1437,"1f647-200d-2642":1436,"1f647":1435,"1f648":1124,"1f649":1125,"1f64a":1126,"1f64b-200d-2640":1431,"1f64b-200d-2642":1430,"1f64b":1429,"1f64c":1359,"1f64d-200d-2640":1416,"1f64d-200d-2642":1415,"1f64d":1414,"1f64e-200d-2640":1419,"1f64e-200d-2642":1418,"1f64e":1417,"1f64f":1364,"1f680":4942,"1f681":4937,"1f682":4872,"1f683":4873,"1f684":4874,"1f685":4875,"1f686":4876,"1f687":4877,"1f688":4878,"1f689":4879,"1f68a":4880,"1f68b":4883,"1f68c":4884,"1f68d":4885,"1f68e":4886,"1f68f":4911,"1f690":4887,"1f691":4888,"1f692":4889,"1f693":4890,"1f694":4891,"1f695":4892,"1f696":4893,"1f697":4894,"1f698":4895,"1f699":4896,"1f69a":4898,"1f69b":4899,"1f69c":4900,"1f69d":4881,"1f69e":4882,"1f69f":4938,"1f6a0":4939,"1f6a1":4940,"1f6a2":4930,"1f6a3-200d-2640":1609,"1f6a3-200d-2642":1608,"1f6a3":1607,"1f6a4":4926,"1f6a5":4918,"1f6a6":4919,"1f6a7":4921,"1f6a8":4917,"1f6a9":71587,"1f6aa":61333,"1f6ab":62745,"1f6ac":61358,"1f6ad":62747,"1f6ae":62730,"1f6af":62748,"1f6b0":62731,"1f6b1":62749,"1f6b2":4907,"1f6b3":62746,"1f6b4-200d-2640":1621,"1f6b4-200d-2642":1620,"1f6b4":1619,"1f6b5-200d-2640":1624,"1f6b5-200d-2642":1623,"1f6b5":1622,"1f6b6-200d-2640":1566,"1f6b6-200d-2642":1565,"1f6b6":1564,"1f6b7":62750,"1f6b8":62743,"1f6b9":62733,"1f6ba":62734,"1f6bb":62735,"1f6bc":62736,"1f6bd":61340,"1f6be":62737,"1f6bf":61342,"1f6c0":1643,"1f6c1":61343,"1f6c2":62738,"1f6c3":62739,"1f6c4":62740,"1f6c5":62741,"1f6cb":61338,"1f6cc":1644,"1f6cd":61133,"1f6ce":4944,"1f6cf":61337,"1f6d0":62776,"1f6d1":4920,"1f6d2":61357,"1f6d5":4851,"1f6d6":4828,"1f6d7":61334,"1f6e0":61298,"1f6e1":61304,"1f6e2":4914,"1f6e3":4912,"1f6e4":4913,"1f6e5":4929,"1f6e9":4932,"1f6eb":4933,"1f6ec":4934,"1f6f0":4941,"1f6f3":4927,"1f6f4":4908,"1f6f5":4903,"1f6f6":4925,"1f6f7":51076,"1f6f8":4943,"1f6f9":4909,"1f6fa":4906,"1f6fb":4897,"1f6fc":4910,"1f7e0":62917,"1f7e1":62918,"1f7e2":62919,"1f7e3":62921,"1f7e4":62922,"1f7e5":62925,"1f7e6":62929,"1f7e7":62926,"1f7e8":62927,"1f7e9":62928,"1f7ea":62930,"1f7eb":62931,"1f90c":1337,"1f90d":1149,"1f90e":1147,"1f90f":1338,"1f910":137,"1f911":129,"1f912":156,"1f913":171,"1f914":135,"1f915":157,"1f916":1114,"1f917":130,"1f918":1343,"1f919":1344,"1f91a":1328,"1f91b":1356,"1f91c":1357,"1f91d":1363,"1f91e":1340,"1f91f":1342,"1f920":167,"1f921":1108,"1f922":158,"1f923":17,"1f924":153,"1f925":149,"1f926-200d-2640":1440,"1f926-200d-2642":1439,"1f926":1438,"1f927":160,"1f928":138,"1f929":117,"1f92a":127,"1f92b":134,"1f92c":1102,"1f92d":131,"1f92e":159,"1f92f":166,"1f930":1519,"1f931":1522,"1f932":1362,"1f933":1367,"1f934":1506,"1f935-200d-2640":1515,"1f935-200d-2642":1514,"1f935":1513,"1f936":1528,"1f937-200d-2640":1443,"1f937-200d-2642":1442,"1f937":1441,"1f938-200d-2640":1627,"1f938-200d-2642":1626,"1f938":1625,"1f939-200d-2640":1639,"1f939-200d-2642":1638,"1f939":1637,"1f93a":1597,"1f93c-200d-2640":1630,"1f93c-200d-2642":1629,"1f93c":1628,"1f93d-200d-2640":1633,"1f93d-200d-2642":1632,"1f93d":1631,"1f93e-200d-2640":1636,"1f93e-200d-2642":1635,"1f93e":1634,"1f93f":51073,"1f940":2654,"1f941":61180,"1f942":3791,"1f943":3792,"1f944":3802,"1f945":51069,"1f947":51048,"1f948":51049,"1f949":51050,"1f94a":51067,"1f94b":51068,"1f94c":51077,"1f94d":51064,"1f94e":51053,"1f94f":51059,"1f950":3710,"1f951":3693,"1f952":3700,"1f953":3721,"1f954":3695,"1f955":3696,"1f956":3711,"1f957":3738,"1f958":3734,"1f959":3730,"1f95a":3732,"1f95b":3780,"1f95c":3706,"1f95d":3689,"1f95e":3715,"1f95f":3757,"1f960":3758,"1f961":3759,"1f962":3799,"1f963":3737,"1f964":3794,"1f965":3692,"1f966":3702,"1f967":3773,"1f968":3713,"1f969":3720,"1f96a":3726,"1f96b":3742,"1f96c":3701,"1f96d":3681,"1f96e":3755,"1f96f":3714,"1f970":115,"1f971":198,"1f972":123,"1f973":168,"1f974":163,"1f975":161,"1f976":162,"1f977":1501,"1f978":169,"1f97a":182,"1f97b":61124,"1f97c":61113,"1f97d":61112,"1f97e":61138,"1f97f":61139,"1f980":3760,"1f981":2545,"1f982":2643,"1f983":2594,"1f984":2551,"1f985":2603,"1f986":2604,"1f987":2583,"1f988":2628,"1f989":2606,"1f98a":2540,"1f98b":2633,"1f98c":2553,"1f98d":2532,"1f98e":2615,"1f98f":2572,"1f990":3762,"1f991":3763,"1f992":2569,"1f993":2552,"1f994":2582,"1f995":2619,"1f996":2620,"1f997":2639,"1f998":2591,"1f999":2568,"1f99a":2610,"1f99b":2573,"1f99c":2611,"1f99d":2541,"1f99e":3761,"1f99f":2644,"1f9a0":2647,"1f9a1":2592,"1f9a2":2605,"1f9a3":2571,"1f9a4":2607,"1f9a5":2588,"1f9a6":2589,"1f9a7":2533,"1f9a8":2590,"1f9a9":2609,"1f9aa":3764,"1f9ab":2581,"1f9ac":2554,"1f9ad":2624,"1f9ae":2536,"1f9af":61312,"1f9b4":1380,"1f9b5":1371,"1f9b6":1372,"1f9b7":1379,"1f9b8-200d-2640":1532,"1f9b8-200d-2642":1531,"1f9b8":1530,"1f9b9-200d-2640":1535,"1f9b9-200d-2642":1534,"1f9b9":1533,"1f9ba":61114,"1f9bb":1374,"1f9bc":4905,"1f9bd":4904,"1f9be":1369,"1f9bf":1370,"1f9c0":3717,"1f9c1":3772,"1f9c2":3741,"1f9c3":3796,"1f9c4":3703,"1f9c5":3704,"1f9c6":3731,"1f9c7":3716,"1f9c8":3740,"1f9c9":3797,"1f9ca":3798,"1f9cb":3795,"1f9cd-200d-2640":1569,"1f9cd-200d-2642":1568,"1f9cd":1567,"1f9ce-200d-2640":1572,"1f9ce-200d-2642":1571,"1f9ce":1570,"1f9cf-200d-2640":1434,"1f9cf-200d-2642":1433,"1f9cf":1432,"1f9d0":172,"1f9d1-200d-1f33e":1456,"1f9d1-200d-1f373":1459,"1f9d1-200d-1f37c":1525,"1f9d1-200d-1f384":1529,"1f9d1-200d-1f393":1447,"1f9d1-200d-1f3a4":1477,"1f9d1-200d-1f3a8":1480,"1f9d1-200d-1f3eb":1450,"1f9d1-200d-1f3ed":1465,"1f9d1-200d-1f4bb":1474,"1f9d1-200d-1f4bc":1468,"1f9d1-200d-1f527":1462,"1f9d1-200d-1f52c":1471,"1f9d1-200d-1f680":1486,"1f9d1-200d-1f692":1489,"1f9d1-200d-1f91d-200d-1f9d1":1645,"1f9d1-200d-1f9af":1573,"1f9d1-200d-1f9b0":1402,"1f9d1-200d-1f9b1":1404,"1f9d1-200d-1f9b2":1408,"1f9d1-200d-1f9b3":1406,"1f9d1-200d-1f9bc":1576,"1f9d1-200d-1f9bd":1579,"1f9d1-200d-2695":1444,"1f9d1-200d-2696":1453,"1f9d1-200d-2708":1483,"1f9d1":1390,"1f9d2":1387,"1f9d3":1411,"1f9d4-200d-2640":1395,"1f9d4-200d-2642":1394,"1f9d4":1393,"1f9d5":1512,"1f9d6-200d-2640":1593,"1f9d6-200d-2642":1592,"1f9d6":1591,"1f9d7-200d-2640":1596,"1f9d7-200d-2642":1595,"1f9d7":1594,"1f9d8-200d-2640":1642,"1f9d8-200d-2642":1641,"1f9d8":1640,"1f9d9-200d-2640":1538,"1f9d9-200d-2642":1537,"1f9d9":1536,"1f9da-200d-2640":1541,"1f9da-200d-2642":1540,"1f9da":1539,"1f9db-200d-2640":1544,"1f9db-200d-2642":1543,"1f9db":1542,"1f9dc-200d-2640":1547,"1f9dc-200d-2642":1546,"1f9dc":1545,"1f9dd-200d-2640":1550,"1f9dd-200d-2642":1549,"1f9dd":1548,"1f9de-200d-2640":1553,"1f9de-200d-2642":1552,"1f9de":1551,"1f9df-200d-2640":1556,"1f9df-200d-2642":1555,"1f9df":1554,"1f9e0":1376,"1f9e1":1142,"1f9e2":61148,"1f9e3":61118,"1f9e4":61119,"1f9e5":61120,"1f9e6":61121,"1f9e7":51039,"1f9e8":51028,"1f9e9":51090,"1f9ea":61320,"1f9eb":61321,"1f9ec":61322,"1f9ed":4812,"1f9ee":61201,"1f9ef":61356,"1f9f0":61316,"1f9f1":4825,"1f9f2":61317,"1f9f3":4945,"1f9f4":61346,"1f9f5":51106,"1f9f6":51108,"1f9f7":61347,"1f9f8":51091,"1f9f9":61348,"1f9fa":61349,"1f9fb":61350,"1f9fc":61352,"1f9fd":61355,"1f9fe":61243,"1f9ff":51084,"1fa70":61142,"1fa71":61125,"1fa72":61126,"1fa73":61127,"1fa74":61135,"1fa78":61327,"1fa79":61329,"1fa7a":61331,"1fa80":51079,"1fa81":51080,"1fa82":4935,"1fa83":61302,"1fa84":51083,"1fa85":51092,"1fa86":51094,"1fa90":4993,"1fa91":61339,"1fa92":61345,"1fa93":61295,"1fa94":61217,"1fa95":61179,"1fa96":61149,"1fa97":61174,"1fa98":61181,"1fa99":61236,"1fa9a":61305,"1fa9b":61307,"1fa9c":61318,"1fa9d":61315,"1fa9e":61335,"1fa9f":61336,"1faa0":61341,"1faa1":51107,"1faa2":51109,"1faa3":61351,"1faa4":61344,"1faa5":61354,"1faa6":61360,"1faa7":61363,"1faa8":4826,"1fab0":2645,"1fab1":2646,"1fab2":2637,"1fab3":2640,"1fab4":2660,"1fab5":4827,"1fab6":2608,"1fac0":1377,"1fac1":1378,"1fac2":1686,"1fad0":3688,"1fad1":3699,"1fad2":3691,"1fad3":3712,"1fad4":3729,"1fad5":3736,"1fad6":3782,"203c":62834,"21a9":62765,"21aa":62766,"231a":4948,"231b":4946,"23cf":62818,"23e9":62805,"23ea":62809,"23eb":62812,"23ec":62814,"23ed":62806,"23ee":62810,"23ef":62807,"23f0":4949,"23f1":4950,"23f2":4951,"23f3":4947,"23f8":62815,"23f9":62816,"23fa":62817,"24c2":62890,"25aa":62938,"25ab":62939,"25b6":62804,"25c0":62808,"25fb":62935,"25fc":62934,"25fd":62937,"25fe":62936,"260e":61184,"261d":1350,"262a":62784,"262e":62785,"262f":62781,"263a":120,"264a":62790,"264b":62791,"264c":62792,"264d":62793,"264e":62794,"264f":62795,"265f":51099,"267b":62844,"267e":62833,"267f":62732,"269b":62777,"269c":62845,"26a0":62742,"26a1":41016,"26a7":62827,"26aa":62924,"26ab":62923,"26b0":61359,"26b1":61361,"26bd":51051,"26be":51052,"26c4":41019,"26c5":4999,"26c8":41e3,"26ce":62800,"26cf":61296,"26d1":61150,"26d3":61314,"26d4":62744,"26e9":4853,"26ea":4849,"26f0":4814,"26f1":41015,"26f2":4855,"26f3":51070,"26f4":4928,"26f5":4924,"26f7":1599,"26f8":51071,"26f9-200d-2640":1615,"26f9-200d-2642":1614,"26f9":1613,"26fa":4856,"26fd":4915,"270a":1354,"270b":1330,"270c":1339,"270d":1365,"270f":61258,"271d":62782,"274c":62853,"274e":62854,"2764-200d-1f525":1139,"2764-200d-1fa79":1140,"27a1":62757,"27b0":62855,"27bf":62856,"2b05":62761,"2b06":62755,"2b07":62759,"2b1b":62932,"2b1c":62933,"2b50":4994,"2b55":62849,"303d":62857,"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-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff":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-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3ff":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,"1f48f-1f3fb":0,"1f48f-1f3fc":0,"1f48f-1f3fd":0,"1f48f-1f3fe":0,"1f48f-1f3ff":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f491-1f3fb":0,"1f491-1f3fc":0,"1f491-1f3fd":0,"1f491-1f3fe":0,"1f491-1f3ff":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fe":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,"1f91d-1f3fb":0,"1f91d-1f3fc":0,"1f91d-1f3fd":0,"1f91d-1f3fe":0,"1f91d-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-200d-2640":0,"1f9d4-1f3fc-200d-2640":0,"1f9d4-1f3fd-200d-2640":0,"1f9d4-1f3fe-200d-2640":0,"1f9d4-1f3ff-200d-2640":0,"1f9d4-1f3fb-200d-2642":0,"1f9d4-1f3fc-200d-2642":0,"1f9d4-1f3fd-200d-2642":0,"1f9d4-1f3fe-200d-2642":0,"1f9d4-1f3ff-200d-2642":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}},n=s[""];for(const e in s)e&&Object.assign(n,s[e]);const a=n},3189:(e,t,i)=>{"use strict";i.d(t,{Bf:()=>n,U9:()=>a,bt:()=>s});const s='Roboto, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif',n="16px",a="400"},356:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});const s="undefined"!=typeof ImageBitmap},5296:(e,t,i)=>{"use strict";i.d(t,{Kx:()=>r,cK:()=>d,jt:()=>l});var s=i(3035),n=i(3725);const a=new Map;function o(e){return a.get(e)}function r(e){const t=o(e);t&&(t.isCancelled=!0,t.deferred.resolve())}function d(e,t,i){return i||(i=function(e){r(e);const t={isCancelled:!1,deferred:(0,n.Z)()};return a.set(e,t),t.deferred.then((()=>{o(e)===t&&a.delete(e)})),t}(t)),(0,s.T2)((()=>{i.isCancelled||(e()?d(e,t,i):i.deferred.resolve())})),i.deferred}function l(e){(0,s.T2)((()=>{e()&&l(e)}))}},2353:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function n(e,t){return s(this,void 0,void 0,(function*(){const i=e.map(((e,i,n)=>s(this,void 0,void 0,(function*(){if(yield t(e,i,n))return e}))));return(yield Promise.all(i)).filter(Boolean)}))}},8847:(e,t,i)=>{"use strict";function s(e,t){const i=[];let s=-1;for(;-1!==(s=e.findIndex(t));)i.push(e.splice(s,1)[0]);return i}i.d(t,{Z:()=>s})},5916:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});class s{constructor(e){this.assets=e,this.tempId=0}playSound(e,t=!1){++this.tempId,this.assetName=e;try{const i=this.createAudio();i.autoplay=!0,i.src="assets/audio/"+e,i.loop=t,i.play()}catch(t){console.error("playSound",e,t)}}playSoundIfDifferent(e,t){this.assetName!==e&&this.playSound(e,t)}createAudio(){let{audio:e}=this;return e||(e=this.audio=new Audio,e.play(),e)}stopSound(){this.audio&&this.audio.pause()}cancelDelayedPlay(){++this.tempId}playSoundWithTimeout(e,t,i){const s=++this.tempId;setTimeout((()=>{this.tempId===s&&this.playSound(e,t)}),i)}}},8678:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(3019);function n(e){return(0,s.Z)(e,"readAsDataURL")}},6705:(e,t,i)=>{"use strict";i.d(t,{Z:()=>m});var s=i(3725),n=i(8594),a=i(3035);const o=[];let r=!1;function d(e,t="push"){if(!e.items.length)return Promise.resolve([]);const i=e.promise=(0,s.Z)();return o[t](e),l(),i}function l(){r||function(e){if(!e.items.length)return e.promise.resolve([]),Promise.resolve([]);const t=e.items.slice(),i=[];return new Promise(((s,o)=>{const r=()=>{return d=this,l=void 0,h=function*(){const d=performance.now();do{yield(0,n.e9)();const s=e.process.apply(e.context,t.shift());let a;if(s instanceof Promise)try{a=yield s}catch(e){return void o(e)}else a=s;i.push(a)}while(t.length>0&&performance.now()-d<6);t.length>0?(0,a.T2)(r):s(i)},new((c=void 0)||(c=Promise))((function(e,t){function i(e){try{n(h.next(e))}catch(e){t(e)}}function s(e){try{n(h.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof c?n:new c((function(e){e(n)}))).then(i,s)}n((h=h.apply(d,l||[])).next())}));var d,l,c,h};(0,a.T2)(r)})).then(e.promise.resolve,e.promise.reject)}(o.shift()).finally((()=>{r=!1,o.length&&l()}))}var c=i(6663);let h,u;function p(e,t,i,s=document.createElement("canvas")){s.width=e.width,s.height=e.height;const n=s.getContext("2d",{alpha:!1});return c.Z?(n.filter=`blur(${t}px)`,n.drawImage(e,2*-t,2*-t,s.width+4*t,s.height+4*t)):(n.drawImage(e,0,0),u(n,0,0,s.width,s.height,t,i)),s}h=c.Z?Promise.resolve():i.e(77).then(i.bind(i,7077)).then((e=>{u=e.default}));const f=new Map;function m(e,t=2,i=2){if(!e)throw"no dataUri for blur: "+e;f.size>150&&f.clear();const s=document.createElement("canvas");s.className="canvas-thumbnail";let n=f.get(e);if(n)s.width=n.canvas.width,s.height=n.canvas.height,n.promise.then((()=>{s.getContext("2d").drawImage(n.canvas,0,0,s.width,s.height)}));else{const a=new Promise((n=>{h.then((()=>{const a=new Image;a.onload=()=>{d({items:[[a,t,i,s]],context:null,process:p},"unshift").then((()=>{n()}))},a.src=e}))}));f.set(e,n={canvas:s,promise:a})}return Object.assign(Object.assign({},n),{canvas:s})}},4059:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l,o:()=>d});var s=i(4762),n=i(3306),a=i(9818);const o=(0,n.Z)("ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e19282321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aadaad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c353c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc00011080000000003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00"),r=(0,n.Z)("ffd9");function d(e){const t="base64,",i=e.slice(e.indexOf(t)+t.length),s=[...atob(i)].map((e=>e.charCodeAt(0)));return new Uint8Array(s)}function l(e,t=!1){let i,n;t||1!==e[0]?i=(0,a.Z)(e):(i=new Uint8Array(o.concat(Array.from(e.slice(3)),r)),i[164]=e[1],i[166]=e[2]),n=t?s.IS_SAFARI?"image/png":"image/webp":"image/jpeg";const d=function(e,t="image/jpeg"){return`data:${t};base64,${btoa(String.fromCharCode(...e))}`}(i,n);return d}},9897:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(410),n=i(9405);function a(e,t,i,s,a=!0){if(ei/s?r=t*i/e|0:(o=e*s/t|0,o>i&&(r=r*i/o|0,o=i)),a&&o>=e&&r>=t&&(o=e,r=t),(0,n.C)(o,r)}s.GO.calcImageInBox=a},2890:(e,t,i)=>{"use strict";function s(e,t,i,s,n,a){const o=e.canvas.dpr;o&&(t*=o,i*=o,s*=o),e.beginPath(),e.arc(t,i,s,0,2*Math.PI,!1),e.closePath(),n&&e.fill(),a&&e.stroke()}function n(e,t,i,n,a,o){return s(e,t+n,i+n,n,a,o)}i.d(t,{Z:()=>s,o:()=>n})},8097:(e,t,i)=>{"use strict";let s;function n(e,t){if(!s){const e=document.createElement("canvas");s=e.getContext("2d",{alpha:!1})}return s.font!==t&&(s.font=t),s.measureText(e).width}i.d(t,{Z:()=>n})},7814:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(356);function n(e){return new Promise((t=>{return i=this,n=void 0,o=function*(){var i,n,a;const o=document.createElement("canvas"),r=null!==(i=e.size)&&void 0!==i?i:e.mediaSize.aspectFitted(e.boxSize),d=window.devicePixelRatio&&1;o.width=r.width*d,o.height=r.height*d;const l=o.getContext("2d");let c;c=s.Z?yield createImageBitmap(e.media,{resizeWidth:r.width,resizeHeight:r.height}):e.media,l.drawImage(c,0,0,o.width,o.height),s.Z&&(null==c||c.close());const h=null!==(n=e.mimeType)&&void 0!==n?n:"image/jpeg",u=null!==(a=e.quality)&&void 0!==a?a:1;if(e.toDataURL){const e=o.toDataURL(h,u);t({url:e,size:r})}else o.toBlob((e=>{t({blob:e,size:r})}),h,u)},new((a=void 0)||(a=Promise))((function(e,t){function s(e){try{d(o.next(e))}catch(e){t(e)}}function r(e){try{d(o.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof a?i:new a((function(e){e(i)}))).then(s,r)}d((o=o.apply(i,n||[])).next())}));var i,n,a,o}))}},467:(e,t,i)=>{"use strict";i.d(t,{ST:()=>r,ZP:()=>d,gV:()=>l});var s=i(5813);const n=/[`~!@#$%^&*()\-_=+\[\]\\|{}'";:\/?.>,<]+/g,a=/^\s+|\s$/g,o={ะน:"q",ั†:"w",ัƒ:"e",ะบ:"r",ะต:"t",ะฝ:"y",ะณ:"u",ัˆ:"i",ั‰:"o",ะท:"p",ั…:"[",ัŠ:"]",ั„:"a",ั‹:"s",ะฒ:"d",ะฐ:"f",ะฟ:"g",ั€:"h",ะพ:"j",ะป:"k",ะด:"l",ะถ:";",ั:"'",ั:"z",ั‡:"x",ั:"c",ะผ:"v",ะธ:"b",ั‚:"n",ัŒ:"m",ะฑ:",",ัŽ:".",".":"/"};function r(e){return e.replace(n,"").replace(a,"")}function d(e,t=!0){return l(e,{clearBadChars:!0,latinize:t,ignoreCase:!0})}function l(e,t={}){const i=t.includeTag&&"%"===e.charAt(0),n=e;return t.clearBadChars&&(e=r(e)),t.latinize&&(e=function(e){return e.replace(/[^A-Za-z0-9]/g,(e=>{const t=s.Z[e];return null!=t?t:e}))}(e)),t.ignoreCase&&(e=e.toLowerCase()),i&&(e="%"+e),t.latinize&&(e+=""+function(e){return e.toLowerCase().replace(/[\wะฐ-ั]/g,(e=>{const t=o[e];return null!=t?t:e}))}(n)),e}},2166:(e,t,i)=>{"use strict";function s(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)}function n(e){navigator.clipboard?navigator.clipboard.writeText(e).catch((t=>{console.error("clipboard error",t),s(e)})):s(e)}i.d(t,{T:()=>n})},3416:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(5432),n=i(4755),a=i(2296);class o extends a.Z{constructor(){super("menu",!0),this.onMouseMove=e=>{const t=this.element.getBoundingClientRect(),{clientX:i,clientY:s}=e,n=i>=t.right?i-t.right:t.left-i,a=s>=t.bottom?s-t.bottom:t.top-s;(n>=100||a>=100)&&this.close()},n.Z.addEventListener("resize",(()=>{this.element&&this.close()}))}isOpened(){return!!this.element}close(){this.element&&(this.element.classList.remove("active"),this.element.parentElement.classList.remove("menu-open")),super.close(),s.Z||window.removeEventListener("mousemove",this.onMouseMove)}openBtnMenu(e,t){super.open(e),this.element.classList.add("active","was-open"),this.element.parentElement.classList.add("menu-open"),t&&this.addEventListener("toggle",t,{once:!0}),s.Z||window.addEventListener("mousemove",this.onMouseMove)}}const r=new o},632:(e,t,i)=>{"use strict";i.d(t,{OD:()=>h,fl:()=>S,mr:()=>u,rz:()=>c,s2:()=>r,xE:()=>p,zM:()=>l});var s=i(410),n=i(2325);const a=["January","February","March","April","May","June","July","August","September","October","November","December"],o=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],r=86400,d=e=>{const t=new Date(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate())),i=t.getUTCDay()||7;t.setUTCDate(t.getUTCDate()+4-i);const s=new Date(Date.UTC(t.getUTCFullYear(),0,1));return Math.ceil(((t.getTime()-s.getTime())/r+1)/7)};function l(e){const t=new Date,i=t.getTime()/1e3|0,s=e.getTime()/1e3|0,a={};return i-s{const i=t.monthAsNumber?".":" ",s=("0"+e.getHours()).slice(-2)+":"+("0"+e.getMinutes()).slice(-2)+(t.noSeconds?"":":"+("0"+e.getSeconds()).slice(-2));return(t.leadingZero?("0"+e.getDate()).slice(-2):e.getDate())+i+(t.monthAsNumber?("0"+(e.getMonth()+1)).slice(-2):a[e.getMonth()])+i+e.getFullYear()+(t.noTime?"":", "+s)},f=2013,m=new RegExp("20[0-9]{1,2}"),g=new RegExp("(\\w{3,}) ([0-9]{0,4})","i"),v=new RegExp("([0-9]{0,4}) (\\w{2,})","i"),b=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"),w=[31,29,31,30,31,30,31,31,30,31,30,31];function S(e,t){const i=e.trim().toLowerCase();if(i.length<3)return;if(0==="today".indexOf(i)){const e=new Date,i=e.getFullYear(),s=e.getMonth(),n=e.getDate();e.setFullYear(i,s,n),e.setHours(0,0,0);const a=e.getTime();e.setFullYear(i,s,n+1),e.setHours(0,0,0);const o=e.getTime()-1;return void t.push({title:"Today",minDate:a,maxDate:o})}if(0==="yesterday".indexOf(i)){const e=new Date,i=e.getFullYear(),s=e.getMonth(),n=e.getDate();e.setFullYear(i,s,n),e.setHours(0,0,0);const a=e.getTime()-864e5;e.setFullYear(i,s,n+1),e.setHours(0,0,0);const o=e.getTime()-86400001;return void t.push({title:"Yesterday",minDate:a,maxDate:o})}const s=function(e){const t=new Date;if(e.length<=3)return-1;for(let i=0;i<7;i++)if(t.setDate(t.getDate()+1),0===P(t.getTime()).toLowerCase().indexOf(e))return t.getDay();return-1}(i);if(s>=0){const e=new Date,i=e.getTime(),n=s-e.getDay();e.setDate(e.getDate()+n),e.getTime()>i&&e.setTime(e.getTime()-6048e5);const a=e.getFullYear(),o=e.getMonth(),r=e.getDate();e.setFullYear(a,o,r),e.setHours(0,0,0);const d=e.getTime();e.setFullYear(a,o,r+1),e.setHours(0,0,0);const l=e.getTime()-1;return void t.push({title:P(d),minDate:d,maxDate:l})}let n;if(null===(n=b.exec(i)))if(null===(n=y.exec(i)))if(null===(n=m.exec(i))){if(null!==(n=g.exec(i))){const e=n[1],i=n[2],s=T(e);if(s>=0){const e=+i;if(e>0&&e<=31)return void L(t,e-1,s);if(e>=f)return void C(t,s,e)}}if(null!==(n=v.exec(i))){const e=n[1],i=T(n[2]);if(i>=0){const s=+e;if(s>0&&s<=31)return void L(t,s-1,i);s>=f&&C(t,i,s)}}}else{let e=+i;const s=(new Date).getFullYear();if(e=e;i--){const e=new Date;e.setFullYear(i,0,1),e.setHours(0,0,0);const s=e.getTime();e.setFullYear(i+1,0,1),e.setHours(0,0,0);const n=e.getTime()-1;t.push({title:""+i,minDate:s,maxDate:n})}}else if(e<=s){const i=new Date;i.setFullYear(e,0,1),i.setHours(0,0,0);const s=i.getTime();i.setFullYear(e+1,0,1),i.setHours(0,0,0);const n=i.getTime()-1;t.push({title:""+e,minDate:s,maxDate:n})}}else{const e=n[1],i=n[3],s=n[5];if(!n[2]===n[4])return;const a=parseInt(e),o=parseInt(i)-1;let r=parseInt(s);r>=10&&r<=99&&(r+=2e3);const d=(new Date).getFullYear();if(Z(a-1,o)&&r>=f&&r<=d){const e=new Date;e.setFullYear(r,o,a),e.setHours(0,0,0);const i=e.getTime();e.setFullYear(r,o,a+1),e.setHours(0,0,0);const s=e.getTime()-1;return void t.push({title:M(i),minDate:i,maxDate:s})}}else{const e=n[1],i=n[3],s=parseInt(e),a=parseInt(i);if(s>0&&s<=31){if(a>=f&&s<=12)return void C(t,s-1,a);a<=12&&L(t,s-1,a-1)}else s>=f&&a<=12&&C(t,a-1,s)}}function C(e,t,i){const s=(new Date).getFullYear(),n=Date.now();if(i>=f&&i<=s){const s=new Date;s.setFullYear(i,t,1),s.setHours(0,0,0);const a=s.getTime();if(a>n)return;s.setMonth(s.getMonth()+1);const o=s.getTime()-1;e.push({title:E(a),minDate:a,maxDate:o})}}function L(e,t,i){if(Z(t,i)){const n=(new Date).getFullYear(),a=Date.now();for(let o=n;o>=f;o--){if(1===i&&28===t&&((s=o)%4!=0||s%100==0)&&s%400!=0)continue;const r=new Date;r.setFullYear(o,i,t+1),r.setHours(0,0,0);const d=r.getTime();if(d>a)continue;r.setFullYear(o,i,t+2),r.setHours(0,0,0);const l=r.getTime()-1;o===n?e.push({title:I(d),minDate:d,maxDate:l}):e.push({title:M(d),minDate:d,maxDate:l})}}var s}function E(e){const t=new Date(e);return a[t.getMonth()].slice(0,3)+" "+t.getFullYear()}function I(e){const t=new Date(e);return a[t.getMonth()].slice(0,3)+" "+t.getDate()}function M(e){const t=new Date(e);return("0"+t.getDate()).slice(-2)+"."+("0"+(t.getMonth()+1)).slice(-2)+"."+t.getFullYear()}function P(e){const t=new Date(e);return o[t.getDay()]}function Z(e,t){return t>=0&&t<12&&e>=0&&e{"use strict";i.d(t,{Z:()=>d});var s=i(2796),n=i(2166),a=i(3910),o=i(2738);const r="https://t.me/";function d(e={}){const t=document.createElement("a");t.classList.add("anchor-copy");let i,d="LinkCopied";if(e.mePath){const s=r+e.mePath;i=t.href=t.innerText=s}if(e.username){const s=r+e.username;t.href=s,i=t.innerText="@"+e.username,d="UsernameCopied"}return(0,o.fc)(t,(e=>{(0,a.Z)(e),(0,n.T)(null!=i?i:t.href),(0,s.bC)({langPackKey:d})})),t}},6976:(e,t,i)=>{"use strict";i.d(t,{E:()=>c,s:()=>l});var s=i(5432),n=i(4762),a=i(3416),o=i(3910);let r=!1,d=0;function l(){d&&clearTimeout(d),d=window.setTimeout((()=>{d=0,r=!1}),400),r=!0}function c({element:e,callback:t,listenerSetter:i,listenerOptions:d}){const l=i?i.add(e):e.addEventListener.bind(e),c=i?i.removeManual.bind(i,e):e.removeEventListener.bind(e);if(n.IS_APPLE&&s.Z||d){let e;const i=Object.assign(Object.assign({},d||{}),{capture:!0}),s=()=>{clearTimeout(e),c("touchmove",s,i),c("touchend",s,i),c("touchcancel",s,i)};l("touchstart",(n=>{n.touches.length>1?s():(l("touchmove",s,i),l("touchend",s,i),l("touchcancel",s,i),e=window.setTimeout((()=>{r?s():(t(n),s(),a.Z.isOpened()&&l("touchend",o.Z,{once:!0}))}),400))}),d)}else l("contextmenu",s.Z?e=>{t(e),a.Z.isOpened()&&l("touchend",o.Z,{once:!0})}:t,d)}},5077:(e,t,i)=>{"use strict";function s(e,t,i,s){const n=e=>{i({x:e.pageX,y:e.pageY,event:e})},a=t=>{document.removeEventListener("mousemove",n),e.addEventListener("mousedown",o,{once:!0}),null==s||s({x:t.pageX,y:t.pageY,event:t})},o=i=>{0===i.button?(t({x:i.pageX,y:i.pageY,event:i}),n(i),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(),i({x:e.touches[0].clientX,y:e.touches[0].clientY,isTouch:!0,event:e})},d=t=>{document.removeEventListener("touchmove",r),e.addEventListener("touchstart",l,{passive:!1,once:!0});const i=t.touches[0]||t.changedTouches[0];null==s||s({x:i.clientX,y:i.clientY,isTouch:!0,event:t})},l=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",d,{passive:!1,once:!0})};return e.addEventListener("touchstart",l,{passive:!1,once:!0}),()=>{e.removeEventListener("mousedown",o),document.removeEventListener("mousemove",n),document.removeEventListener("mouseup",a),e.removeEventListener("touchstart",l),document.removeEventListener("touchmove",r),document.removeEventListener("touchend",d)}}i.d(t,{Z:()=>s})},6760:(e,t,i)=>{"use strict";function s(){window.getSelection?window.getSelection().empty?window.getSelection().empty():window.getSelection().removeAllRanges&&window.getSelection().removeAllRanges():document.selection&&document.selection.empty()}i.d(t,{Z:()=>s})},2738:(e,t,i)=>{"use strict";i.d(t,{EN:()=>r,fc:()=>o,pf:()=>a,tH:()=>d});var s=i(5432),n=i(6669);const a=s.Z?"mousedown":"click";function o(e,t,i={}){const s=i.listenerSetter?i.listenerSetter.add(e):e.addEventListener.bind(e),n=i.listenerSetter?i.listenerSetter.removeManual.bind(i.listenerSetter,e):e.removeEventListener.bind(e);return i.touchMouseDown=!0,s(a,t,i),()=>n(a,t,i)}function r(e,t,i){e.removeEventListener(a,t,i)}function d(e){(0,n.Z)(e,a)}},7529:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(5432),n=i(3241),a=i(5953),o=i(8497);class r extends n.Z{constructor(){super(!1),this.hideControls=(e=!1)=>{if(e)return void(this.hideControlsTimeout||(this.hideControlsTimeout=window.setTimeout(this.hideControls,3e3)));clearTimeout(this.hideControlsTimeout),this.hideControlsTimeout=0;const t=this.element.classList.contains("show-controls");if(!1!==this.controlsLocked){if(this.canHideControls&&!this.canHideControls()||!t||this.controlsLocked)return}else if(!t)return;this.dispatchEvent("toggleControls",!1),this.element.classList.remove("show-controls")},this.showControls=(e=!0)=>{this.hideControlsTimeout?(clearTimeout(this.hideControlsTimeout),this.hideControlsTimeout=0):this.element.classList.contains("show-controls")||!1===this.controlsLocked||(this.dispatchEvent("toggleControls",!0),this.element.classList.add("show-controls")),e&&!this.controlsLocked&&(this.hideControlsTimeout=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.hideControlsTimeout=0}setup(e){(0,a.Z)(this,e);const{listenerSetter:t,element:i}=this;s.Z?t.add(i)("click",(e=>{this.ignoreClickClassName&&(0,o.Z)(e.target,this.ignoreClickClassName)||this.toggleControls()})):(t.add(i)("mousemove",(()=>{this.showControls()})),t.add(i)("mouseenter",(()=>{this.showControls(!1)})),t.add(i)("mouseleave",(e=>{e.relatedTarget&&this.showOnLeaveToClassName&&(0,o.Z)(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)}}},4531:(e,t,i)=>{"use strict";i.d(t,{Z:()=>h});var s=i(3003),n=i(2353),a=i(3416),o=i(3699),r=i(3624),d=i(1483),l=i(6976),c=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function h({buttons:e,findElement:t,listenTo:i,appendTo:h,filterButtons:u,onOpen:p,onClose:f,onBeforeOpen:m,listenerSetter:g}){null!=h||(h=document.body),null!=g||(g=new o.Z);const v=new o.Z,b=(0,r.k)();let y;(0,l.E)({element:i,callback:e=>{const s=t?t(e):i;if(!s)return;let n=y;if((e instanceof MouseEvent||e.hasOwnProperty("preventDefault"))&&e.preventDefault(),n&&n.classList.contains("active"))return!1;(e instanceof MouseEvent||e.hasOwnProperty("cancelBubble"))&&(e.cancelBubble=!0),(()=>{c(this,void 0,void 0,(function*(){yield null==p?void 0:p(s);const t=yield S();if(!t)return;n=t.element;const{cleanup:i,destroy:o}=t;(0,d.Z)(e,n),a.Z.openBtnMenu(n,(()=>{null==f||f(),i(),setTimeout((()=>{o()}),300)}))}))})()},listenerSetter:g});const w=()=>{v.removeAll(),b.clean()},S=()=>c(this,void 0,void 0,(function*(){w(),e.forEach((e=>e.element=void 0));const t=u||(e=>(0,n.Z)(e,(e=>!(null==e?void 0:e.verify)||e.verify()))),i=yield t(e);if(!i.length)return;const a=y=yield(0,s.Z)({buttons:i,listenerSetter:v});return a.classList.add("contextmenu"),yield null==m?void 0:m(),h.append(a),{element:a,cleanup:w,destroy:()=>{a.remove()}}}));return{element:y,destroy:()=>{w(),g.removeAll()}}}},3163:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(6787),n=i(9322),a=i(3512),o=i(4531),r=i(8497),d=i(3173),l=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function c(e){const{listenTo:t,isStickerPack:i,verifyRecent:c,appendTo:h,onOpen:u,onClose:p,onSend:f}=e;let m,g;const v=e=>l(this,void 0,void 0,(function*(){const t=yield a.Z.managers.acknowledged.appStickersManager.getFavedStickersStickers();if(!t.cached)return!1;const i=(yield t.result).some((e=>e.id===g.id));return e?!i:i}));return(0,o.Z)({listenTo:t,appendTo:h,findElement:e=>m=(0,r.Z)(e.target,"media-sticker-wrapper"),onOpen:()=>l(this,void 0,void 0,(function*(){return g=yield a.Z.managers.appDocsManager.getDoc(m.dataset.docId),null==u?void 0:u()})),onClose:p,buttons:[{icon:"stickers",text:"Context.ViewStickerSet",onClick:()=>new s.Z(g.stickerSetInput).show(),verify:()=>!i},{icon:"favourites",text:"AddToFavorites",onClick:()=>a.Z.managers.appStickersManager.faveSticker(g.id,!1),verify:()=>v(!0)},{icon:"favourites",text:"DeleteFromFavorites",onClick:()=>a.Z.managers.appStickersManager.faveSticker(g.id,!0),verify:()=>v(!1)},{icon:"delete",text:"DeleteFromRecent",onClick:()=>a.Z.managers.appStickersManager.saveRecentSticker(g.id,!0),verify:()=>{var e;return null!==(e=null==c?void 0:c(m))&&void 0!==e&&e}},{icon:"mute",text:"Chat.Send.WithoutSound",onClick:()=>(null==f||f(),d.Jo.sendDocId(g.id,!1,!0)),verify:()=>!(!n.ZP.chat.peerId||n.ZP.chat.peerId===a.Z.myId)},{icon:"schedule",text:"Chat.Send.ScheduledMessage",onClick:()=>n.ZP.chat.input.scheduleSending((()=>n.ZP.chat.input.sendMessageWithDocument(g))),verify:()=>!!n.ZP.chat.peerId}]})}},7660:(e,t,i)=>{"use strict";function s(e={}){const t=document.createElement("video");return e.pip||(t.disablePictureInPicture=!0),t.setAttribute("playsinline","true"),t}i.d(t,{Z:()=>s})},8222:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(410),n=i(3512),a=i(4755);const o=new class{constructor(){this.resetCache=()=>{this.computedStyle=void 0;const e=this.cache;this.cache={};for(const t in e)this.getProperty(t)},this.cache={},n.Z.addEventListener("theme_change",this.resetCache),a.Z.addEventListener("resize",this.resetCache)}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)}getPropertyAsSize(e){const t=this.getProperty(e);let i;return"%"===t[t.length-1]||(i=t.indexOf("rem")?16*+t.replace("rem",""):+t.replace("px","")),i}};s.GO&&(s.GO.customProperties=o);const r=o},6669:(e,t,i)=>{"use strict";function s(e,t){const i=new Event(t,{bubbles:!0,cancelable:!0});e.dispatchEvent(i)}i.d(t,{Z:()=>s})},1544:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4056);function n(e){return Array.from(e.childNodes).map((e=>e.nodeType===e.TEXT_NODE?(0,s.Z)(e.textContent):e.outerHTML)).join("")}},5975:(e,t,i)=>{"use strict";function s(e,t){if(!e)return null;if(e.parentElement===t)return e;for(;e.parentElement;)if((e=e.parentElement).parentElement===t)return e;return null}i.d(t,{Z:()=>s})},8763:(e,t,i)=>{"use strict";function s(e,t){return e.closest(`[${t}]`)}i.d(t,{Z:()=>s})},4668:(e,t,i)=>{"use strict";function s(e,t){return e.closest(t)}i.d(t,{Z:()=>s})},6733:(e,t,i)=>{"use strict";function s(e){e.requestFullscreen?e.requestFullscreen():e.mozRequestFullScreen?e.mozRequestFullScreen():e.webkitRequestFullscreen?e.webkitRequestFullscreen():e.msRequestFullscreen&&e.msRequestFullscreen()}function n(){document.cancelFullScreen?document.cancelFullScreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitCancelFullScreen?document.webkitCancelFullScreen():document.msExitFullscreen&&document.msExitFullscreen()}function a(e,t,i){const s=i?i.add(e):e.addEventListener.bind(e);"webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange".split(" ").forEach((e=>{s(e,t,!1)}))}function o(){return document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement}function r(){return!!o()}i.d(t,{C8:()=>n,Dj:()=>s,Ms:()=>a,W7:()=>o,rB:()=>r})},3299:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n,q:()=>a});var s=i(5975);function n(e,t){const i=document.getSelection(),n=i[t?"anchorNode":"focusNode"],o=i[t?"anchorOffset":"focusOffset"];return(0,s.Z)(n,e)||n===e?Object.assign(Object.assign({},a(e,n,o)),{selection:i}):{selection:i}}function a(e,t,i){if(t===e){const s=e.childNodes,n=s.length;n&&i>=n?i=((t=s[n-1]).textContent||t.alt||"").length:(t=s[i],i=0)}return{node:t,offset:i}}},9041:(e,t,i)=>{"use strict";i.d(t,{CS:()=>r,ZP:()=>c,o8:()=>n});var s=i(6854);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:"messageEntityCode"},strikethrough:{match:'[style*="line-through"], [style*="strikethrough"], strike, del, s',entityName:"messageEntityStrike"},link:{match:"A:not(.follow)",entityName:"messageEntityTextUrl"},mentionName:{match:"A.follow",entityName:"messageEntityMentionName"},spoiler:{match:'[style*="spoiler"]',entityName:"messageEntitySpoiler"}},a=new Set(["DIV","P","BR","LI","SECTION","H6","H5","H4","H3","H2","H1","TR","OL","UL"]),o=new RegExp(s.Z,"g"),r="";function d(e,t,i,s){const a=e.parentElement;for(const e in n){const o=n[e],r=a.closest(o.match+', [contenteditable="true"]');null===(null==r?void 0:r.getAttribute("contenteditable"))&&("messageEntityTextUrl"===o.entityName?i.push({_:o.entityName,url:r.href,offset:s.offset,length:t.length}):"messageEntityMentionName"===o.entityName?i.push({_:o.entityName,offset:s.offset,length:t.length,user_id:r.dataset.follow.toUserId()}):i.push({_:o.entityName,offset:s.offset,length:t.length}))}}function l(e){const{length:t}=e;return!t||e[t-1]===r&&t===r.length}function c(e,t,i,s,n,h,u={offset:0}){var p;if(e.nodeType===e.TEXT_NODE){let t=e.nodeValue;return t=t.replace(o,""),t?s===e?i.push(t.substr(0,n)+r+t.substr(n)):i.push(t):s===e&&i.push(r),h&&t.length&&e.parentNode&&d(e,t,h,u),void(u.offset+=t.length)}if(e.nodeType!==e.ELEMENT_NODE)return;const f=()=>{t.push(i.join("")),i.length=0,++u.offset},m=s===e,g=a.has(e.tagName);if(g&&(i.length||"BR"===e.tagName))f();else{const t=e.dataset.stickerEmoji||e.alt,s=e.dataset.stickerEmoji;t&&h&&d(e,t,h,u),s&&h&&h.push({_:"messageEntityCustomEmoji",document_id:e.dataset.docId,offset:u.offset,length:t.length}),t&&(i.push(t),u.offset+=t.length)}m&&!n&&i.push(r);const v=e.matches('[style*="table-cell"], th, td'),b=null==h?void 0:h.length;t.length;let y=!0,w=e.firstChild;for(;w;)c(w,t,i,s,n,h,u),w=w.nextSibling,l(i)||(y=!1);if(y&&(null===(p=e.textContent)||void 0===p?void 0:p.replace(/[\r\n]/g,""))&&(y=!1),m&&n&&i.push(r),v&&e.nextSibling&&!l(i)&&(i.push(" "),++u.offset,void 0!==b))for(let e=b,t=h.length;e{"use strict";i.d(t,{Z:()=>r});var s=i(410),n=i(6875),a=i(1346),o=i(9041);function r(e,t=!0,i=!0){const s=[],r=[],{node:d,offset:l}=!(e instanceof DocumentFragment)&&i&&function(e){const t=window.getSelection();let i,s;if(null==t?void 0:t.rangeCount){const n=t.getRangeAt(0),a=n.startOffset;if(n.startContainer&&n.startContainer==n.endContainer&&a==n.endOffset){const t=a-1,o=e.childNodes;if(n.startContainer===e&&o[t]){i=o[t],s=0;for(let e=0;e{"use strict";i.d(t,{Z:()=>n});var s=i(8204);function n({overflowElement:e,overflowRect:t,selector:i,extraSize:n,elements:a}){null!=t||(t=e.getBoundingClientRect()),null!=a||(a=Array.from(e.querySelectorAll(i))),n&&(t={top:t.top-n,right:t.right+n,bottom:t.bottom+n,left:t.left-n});const o=[],r=[],d=[];let l=!1;for(const i of a){const n=i.getBoundingClientRect(),a=(0,s.Z)(i,e,!1,n,t);let c;a?(l=!0,c=r):c=l?d:o,c.push({element:i,rect:n,visibleRect:a})}return{invisibleTop:o,visible:r,invisibleBottom:d}}},8204:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(241);function n(e,t,i,n=e.getBoundingClientRect(),a=t.getBoundingClientRect()){let{top:o,right:r,bottom:d,left:l}=a;if(i){const e=t.querySelector(".sticky");e&&(o=e.getBoundingClientRect().bottom)}if(n.top>=d||n.bottom<=o||n.right<=l||n.left>=r)return null;const c={top:!1,right:!1,bottom:!1,left:!1,vertical:0,horizontal:0},h=s.Z.width,u=s.Z.height;return{rect:{top:n.topr&&r!==h?(c.right=!0,++c.horizontal,r):n.right,bottom:n.bottom>d&&d!==u?(c.bottom=!0,++c.vertical,d):n.bottom,left:n.left{"use strict";i.d(t,{Z:()=>r});var s=i(3757),n=i(3910),a=i(8497),o=i(3444);function r(e){let t=!1;return new s.Z(Object.assign(Object.assign({},e),{verifyTouchTarget:t=>!(0,a.Z)(t.target,"progress-line")&&!(0,o.Z)(t)&&(!e.verifyTouchTarget||e.verifyTouchTarget(t)),onSwipe:(i,s,a)=>{if(i*=-1,s*=-1,!t&&Math.abs(s)>20)return!0;if(Math.abs(i)>Math.abs(s))(0,n.Z)(a),t=!0;else if(!t&&Math.abs(s)>Math.abs(i))return!0;return e.onSwipe(i,s,a)},onReset:()=>{t=!1,e.onReset&&e.onReset()},cancelEvent:!1}))}},1154:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(6976),n=i(2416);function a(e){return(0,n.Z)(Object.assign(Object.assign({},e),{onSwipe:(t,i,n)=>{if(t*=-1,i*=-1,Math.abs(t)>50)return e.onSwipe(t,i,n),(0,s.s)(),!0}}))}},5705:(e,t,i)=>{"use strict";function s(e){if(e instanceof DocumentFragment)return e;const t=document.createElement("template");return e=e.trim(),t.innerHTML=e,t.content}i.d(t,{Z:()=>s})},2614:(e,t,i)=>{"use strict";function s(e){const t=document.createElement("span");return"string"==typeof e?t.innerHTML=e:t.append(e),t}i.d(t,{Z:()=>s})},8487:(e,t,i)=>{"use strict";function s(e){return null==e?void 0:e.isConnected}i.d(t,{Z:()=>s})},1293:(e,t,i)=>{"use strict";function s(e){return e.isContentEditable||"INPUT"!==e.tagName?!e.textContent.trim()&&!e.querySelector(".emoji, .custom-emoji, .custom-emoji-placeholder"):!e.value.trim()}i.d(t,{Z:()=>s})},6299:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(3512),n=i(4762);function a(e){if("Enter"===e.key&&!n.IS_MOBILE&&!e.isComposing){if("enter"===s.Z.settings.sendShortcut){if(e.shiftKey||e.ctrlKey||e.metaKey)return;return!0}{const t=n.IS_APPLE?e.metaKey:e.ctrlKey;if(e.shiftKey||(n.IS_APPLE?e.ctrlKey:e.metaKey))return;if(t)return!0}}return!1}},3444:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4762);function n(e){return s.IS_MOBILE_SAFARI&&e instanceof TouchEvent&&e.touches[0].clientX<30}},2398:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(5432);function n(e,t=!1,i=!0){if(!s.Z||t&&("INPUT"===document.activeElement.tagName||document.activeElement.isContentEditable))if(i&&e.focus(),e instanceof HTMLInputElement){const t=e.value.length;e.selectionStart=t,e.selectionEnd=t}else{const t=document.createRange();t.selectNodeContents(e),t.collapse(!1);const i=window.getSelection();i.removeAllRanges(),i.addRange(t)}}window.placeCaretAtEnd=n},4484:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(2648);function n(e,t,i,n){return void 0===n&&(n=e.parentElement===t?(0,s.Z)(e):-1),n!==i&&(-1!==n&&ni?t.insertBefore(e,t.children[i]):t.append(e):t.prepend(e),!0)}},6740:(e,t,i)=>{"use strict";i.d(t,{ZP:()=>o,cj:()=>r});var s=i(925);const n={},a=(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 o(e,t,i,o=!0){if(!t)return console.error("renderImageFromUrl: no url?",e,t),void(null==i||i());const r=e instanceof HTMLVideoElement;if(n[t]&&o||r)e&&a(e,t),i&&(r?(0,s.Z)(e).then(i):null==i||i());else{const s=e instanceof HTMLImageElement,o=s?e:new Image;o.src=t;const r=()=>{!s&&e&&a(e,t),n[t]=!0,null==i||i(),o.removeEventListener("error",d)},d=e=>{console.error("Render image from url failed:",e,t,o),o.removeEventListener("load",r),null==i||i()};o.addEventListener("load",r,{once:!0}),o.addEventListener("error",d,{once:!0})}}function r(e,t,i){return new Promise((s=>{o(e,t,s,i)}))}},2830:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(9674),n=i(6740);function a(e,t,i,a,o=e,r){return a&&t.classList.add("fade-in"),(0,n.cj)(t,i).then((()=>s.Z.mutateElement(e,(()=>{o.append(t),a?t.addEventListener("animationend",(()=>{s.Z.mutate((()=>{t.classList.remove("fade-in"),null==r||r.remove()}))}),{once:!0}):null==r||r.remove()}))))}},5565:(e,t,i)=>{"use strict";function s(e,t){if("string"==typeof t)return void(e.innerHTML=t);const i=e.firstChild;i?e.lastChild===i?i.replaceWith(t):(e.textContent="",e.append(t)):e.append(t)}i.d(t,{Z:()=>s})},669:(e,t,i)=>{"use strict";i.d(t,{Y:()=>m,Z:()=>g});var s=i(4762),n=i(5003),a=i(5400),o=i(3699),r=i(6854),d=i(3228),l=i(5975),c=i(2648);function h(e,t,i,s){let n;if(e===i)n=t-s;else if(e.parentElement===i.parentElement)n=(0,c.Z)(e,!0)-(0,c.Z)(i,!0);else{const t=[];let s=e.parentElement;do{t.push(s)}while(s=s.parentElement);s=i.parentElement;do{if(t.includes(s))break}while(s=s.parentElement);const a=s;e=(0,l.Z)(e,a),i=(0,l.Z)(i,a),n=(0,c.Z)(e,!0)-(0,c.Z)(i,!0)}return(0,d.Z)(n,-1,1)}window.compareNodes=h;var u=i(3299),p=i(2398);const f=new RegExp(`[^${r.Z}]`),m=!1;class g{constructor(){this.saveSelectionOnChange=e=>{const t=document.activeElement;this.saveRangeForElement(t)},this.onFocusOut=e=>{this.lastNode=this.lastOffset=void 0},this.onSelectionChange=e=>{var t;const{input:i}=this;if(!i)return void this.setSelectionClassName(document.getSelection());let s=this.getCaretPosN();for(;;){const{node:e,offset:n,selection:a,move:o}=s;if((null==e?void 0:e.nodeValue)!==r.Z||!this.lastNode)break;const d=h(e,n,this.lastNode,this.lastOffset)<0;void 0!==d&&(a.isCollapsed?this.superMove(i,s,d,!0):a.modify(a.isCollapsed?"move":"extend",d?"backward":"forward","character")),this.log("selectionchange",e,n,this.lastNode,this.lastOffset,e===this.lastNode,(0,c.Z)(this.getFiller(e)),(0,c.Z)(this.getFiller(this.lastNode)),d,a,document.getSelection(),document.getSelection().getRangeAt(0),null==e?void 0:e.parentNode,null===(t=this.lastNode)||void 0===t?void 0:t.parentNode),s=this.getCaretPosN(),this.lastNode=e,this.lastOffset=n;break}this.lastNode=this.lastOffset=void 0,this.setSelectionClassName(s.selection,i)},this.onBeforeInput=e=>{var t;const{input:i,log:s}=this;if(!i)return;const n=this.addInputCallback.bind(this,i),a=this.getCaretPosN();let{node:o,offset:d,selection:l,move:c}=a;if(s("beforeinput",e,o,d,l,a),this.lastNode=this.lastOffset=void 0,e.inputType.startsWith("delete")){if(n((()=>{this.processEmptiedFillers(i),this.removeExtraBOMs(i),this.fixInsertedLineBreaks(i)})),(null==o?void 0:o.nodeValue)===r.Z&&l.isCollapsed&&e.inputType.includes("deleteContent")){const t=e.inputType.includes("Backward"),s=d===r.Z.length&&t||!d&&!t;this.superMove(i,a,t,s)}}else{if(e.inputType.startsWith("insert")){if(null===(t=null==o?void 0:o.classList)||void 0===t?void 0:t.contains("input-something")){o=o.previousSibling.firstChild;const e=l.getRangeAt(0);e.setStart(o,0),e.setEnd(o,0),e.collapse(!0);const t=this.getCaretPosN();o=t.node,l=t.selection,d=t.offset}if(o&&o.textContent===r.Z&&d===r.Z.length){l.modify("move","backward","character");const e=this.getCaretPosN();o=e.node,l=e.selection,d=e.offset}e.inputType;{o&&o.nodeType===o.ELEMENT_NODE&&(o=o.firstChild,s.warn("fixing focus on span"));const t=(null==o?void 0:o.nodeValue)===r.Z;if(s("inserting line break",t,o,`"${null==o?void 0:o.nodeValue}"`,(null==o?void 0:o.parentElement)?Array.from(o.parentElement.childNodes).slice():[]),t){const e=o.parentElement;e.classList.replace("input-filler","input-filler-text"),e.childNodes.length,n((()=>{e.childNodes.length>1?(s("inserting line break, remove"),o=Array.from(e.childNodes).find((e=>e.nodeValue===r.Z)),e.t=o):o.nodeValue!==r.Z&&(s("inserting line break, deleteData"),o.deleteData(o.nodeValue.indexOf(r.Z),r.Z.length)),this.fixInsertedLineBreaks(i)}))}else"insertLineBreak"===e.inputType&&n((()=>{this.fixInsertedLineBreaks(i)}))}return}"historyUndo"===e.inputType?n((()=>{this.processFilledFillers(i),this.processEmptiedFillers(i),this.removeExtraBOMs(i),this.removeEmptyTextNodes(i),this.fixBuggedCaret()})):"historyRedo"===e.inputType&&n((()=>{this.processFilledFillers(i),this.processEmptiedFillers(i),i.querySelectorAll(".input-something:not([contenteditable])").forEach((e=>{e.contentEditable="false"})),this.removeExtraBOMs(i),this.fixBuggedCaret()}))}},this.onKeyDown=e=>{var t;const i=e.key;if("ArrowDown"===i||"ArrowUp"===i)this.lastNode=this.lastOffset=void 0;else{const{node:e,offset:t}=this.getCaretPosN();this.lastNode=e,this.lastOffset=t,this.lastNode===this.input&&(this.lastNode=this.lastOffset=void 0)}this.log("keydown",this.lastNode,null===(t=this.lastNode)||void 0===t?void 0:t.parentNode,this.lastOffset,this.getCaretPosN(),e)},this.log=(0,n.kg)("RICH-INPUT"),this.listenerSetter=new o.Z,this.savedRanges=new WeakMap,this.listenerSetter.add(document)("selectionchange",this.saveSelectionOnChange),m&&(this.listenerSetter.add(document)("focusout",this.onFocusOut),this.listenerSetter.add(document)("selectionchange",this.onSelectionChange),this.listenerSetter.add(document)("beforeinput",this.onBeforeInput),this.listenerSetter.add(document)("keydown",this.onKeyDown,{capture:!0}),s.IS_FIREFOX&&(this.inputCaptureCallbacks=[],this.listenerSetter.add(document)("input",(()=>{this.inputCaptureCallbacks.forEach((e=>e())),this.inputCaptureCallbacks.length=0}),{capture:!0})))}get input(){const e=document.getSelection(),{anchorNode:t}=e;if(t)return(t.closest?t:t.parentElement).closest('[contenteditable="true"]')}saveRangeForElement(e){e&&(e.isContentEditable||"INPUT"===e.tagName)&&document.getSelection().rangeCount&&this.savedRanges.set(e,document.getSelection().getRangeAt(0))}findPreviousSmthIndex(e,t,i){const s=Array.from(null!=i?i:e.querySelectorAll(".input-something")),n=s.findIndex((e=>h(e,0,t,0)>=0));return-1===n?s.length-1:Math.max(0,n-1)}superMove(e,t,i,s){var n,a;const{node:o,offset:d,move:l}=t,c=e.querySelectorAll(".input-something"),h=this.findPreviousSmthIndex(e,o,c),u=document.createRange();u[i?"setEnd":"setStart"](o,d),s&&l(i);const p=this.getCaretPosN();if((null===(n=p.node)||void 0===n?void 0:n.nodeValue)===r.Z&&(!s||o===this.lastNode)){const t=this.findPreviousSmthIndex(e,p.node,c);let n=!s;for(;;){const s=this.getCaretPosN(),d=this.findPreviousSmthIndex(e,s.node,c);u[i?"setStart":"setEnd"](s.node,s.offset);const p=u.toString(),m=!f.test(p);if(this.log("test cursor",p,m,t,d),!m||(null===(a=s.node)||void 0===a?void 0:a.nodeValue)!==r.Z||d!==t||!d&&!s.offset||!(d{e.classList.add("br-not-br")}))}fixBuggedCaret(){const e=document.getSelection(),t=e.getRangeAt(0);e.removeAllRanges(),e.addRange(t)}addInputCallback(e,t,i=!0){const n=()=>{this.log("input modify callback"),t()};i&&s.IS_FIREFOX?this.inputCaptureCallbacks.push(n):this.listenerSetter.add(e)("input",n,{once:!0,capture:i})}removeExtraBOMs(e){const t=e=>{var t;return null===(t=null==e?void 0:e.classList)||void 0===t?void 0:t.contains("input-something")};e.querySelectorAll(".input-filler").forEach((e=>{var i;const{previousSibling:s,nextSibling:n}=e;let o=!1;!(null===(i=null==n?void 0:n.classList)||void 0===i?void 0:i.contains("input-filler"))&&(0,a.Hc)(n)&&(o=t(s)||t(n)),o||(this.log.warn("removing empty bom node",e),e.remove())}))}getFiller(e){return e&&e.nodeType===e.TEXT_NODE&&e.parentElement!==this.input?e.parentElement:e}getCaretPosN(){const e=(0,u.Z)(this.input);return Object.assign(Object.assign({},e),{move:this.move.bind(this,e.selection)})}removeEmptyTextNodes(e){const{log:t}=this,i=document.createTreeWalker(e,NodeFilter.SHOW_TEXT,{acceptNode:t=>t.parentElement!==e||t.nodeValue?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT});let s;for(;s=i.nextNode();)t.warn("removing empty text node",s),s.remove()}removePossibleBOMSiblings(e,t){[e,t].forEach((e=>{var t;(null===(t=null==e?void 0:e.classList)||void 0===t?void 0:t.contains("input-filler"))&&e.remove()}))}removePossibleBOMSiblingsByNode(e){const{previousSibling:t,nextSibling:i}=e;this.removePossibleBOMSiblings(t,i)}processEmptiedFillers(e){e.querySelectorAll(".input-filler-text").forEach((e=>{var t;this.removeExtraBOMs(e);let i=!0;if(e.textContent)f.test(e.textContent)||e.querySelector(".input-something")?i=!1:e.classList.replace("input-filler-text","input-filler");else{e.classList.replace("input-filler-text","input-filler");const i=Array.from(e.childNodes).find((e=>e.nodeType===e.TEXT_NODE));i?i.insertData(0,r.Z):(null===(t=e.t)||void 0===t?void 0:t.nodeValue)?e.append(e.t):e.append(document.createTextNode(r.Z))}i&&this.removePossibleBOMSiblingsByNode(e)}))}processFilledFillers(e){e.querySelectorAll(".input-filler").forEach((e=>{if(e.textContent!==r.Z){e.classList.replace("input-filler","input-filler-text");const t=e.t,i=Array.from(e.childNodes).find((e=>e.nodeType===e.TEXT_NODE&&e.nodeValue.includes(r.Z)));if(i&&!(null==t?void 0:t.nodeValue)){const e=i.nodeValue.indexOf(r.Z);-1!==e&&i.deleteData(e,r.Z.length)}}}))}setSelectionClassName(e,t){if(e.rangeCount){const i=e.getRangeAt(0);t?Array.from(t.querySelectorAll(".input-selectable")).forEach((e=>{e.classList.toggle("selection",!i.collapsed&&i.intersectsNode(e))})):Array.from(document.querySelectorAll(".input-selectable.selection")).forEach((e=>e.classList.remove("selection")))}}move(e,t){const{focusNode:i,focusOffset:s}=e;e.modify("extend",t?"backward":"forward","character"),t?e.collapseToStart():e.collapseToEnd();const{focusNode:n,focusOffset:a}=e;this.log("moving cursor",t,i,i.nodeType===i.ELEMENT_NODE?i:i.parentElement,s,n,n.nodeType===n.ELEMENT_NODE?n:n.parentElement,a)}prepareApplyingMarkdown(){const{input:e}=this,t=e.querySelectorAll(".input-filler"),i=e.querySelectorAll(".input-something");return i.forEach((e=>{e.contentEditable="inherit"})),()=>{t.forEach((e=>{e.contentEditable="inherit"})),i.forEach((e=>{e.contentEditable="false"})),this.removeExtraBOMs(e)}}static getInstance(){var e;return null!==(e=this.INSTANCE)&&void 0!==e?e:this.INSTANCE=new g}}},2914:(e,t,i)=>{"use strict";i.d(t,{Z:()=>f});var s=i(3757),n=i(5432),a=i(3512),o=i(3228),r=i(5953),d=i(5418),l=i(3910),c=i(2738),h=i(5975),u=i(4484),p=i(2648);class f{constructor(e){this.onSwipe=(e,t)=>{t=(0,o.Z)(t,this.minY,this.maxY),this.element.style.transform=`translateY(${t}px)`;const i=Math.round(Math.abs(t)/this.elementRect.height),s=this.siblings;this.siblings=[];const n=t<0?"previousElementSibling":"nextElementSibling";let a=this.element[n];for(let e=0;e{this.siblings.includes(e)||(e.style.transform="")})),this.siblings.forEach((e=>{const i=this.elementRect.height*(t<0?1:-1);e.style.transform=`translateY(${i}px)`})),this.scrollableRect){const e=t,i=e>0,s=(i?this.elementRect.bottom:this.elementRect.top)+e-this.addScrollPos;let n=2;s+(i?0:this.elementRect.height)>=this.scrollableRect.bottom||(s-(i?this.elementRect.height:0)<=this.scrollableRect.top?n*=-1:n=void 0),void 0!==n&&(this.scrollable.container[this.scrollable.scrollProperty]+=n)}},this.verifyTouchTarget=e=>!this.list.classList.contains("is-reordering")&&(this.element=this.getSortableTarget(e.target),!!this.element),this.onScroll=()=>{const e=this.scrollable.container[this.scrollable.scrollProperty],t=this.addScrollPos=e-this.startScrollPos,i="scrollTop"===this.scrollable.scrollProperty;this.swipeHandler.add(i?0:t,i?t:0)},this.onStart=()=>{this.list.classList.add("is-reordering"),this.element.classList.add("is-dragging","no-transition"),this.swipeHandler.setCursor("grabbing"),this.elementRect=this.element.getBoundingClientRect(),this.containerRect=this.list.getBoundingClientRect(),this.minY=this.containerRect.top-this.elementRect.top,this.maxY=this.containerRect.bottom-this.elementRect.bottom,this.addScrollPos=0,this.scrollable&&(this.startScrollPos=this.scrollable.container[this.scrollable.scrollProperty],this.scrollableRect=this.scrollable.container.getBoundingClientRect(),this.scrollable.container.addEventListener("scroll",this.onScroll))},this.onReset=()=>{return e=this,t=void 0,s=function*(){const e=this.siblings.length,t=e&&e*(this.siblings[0].previousElementSibling===this.element?1:-1),i=(0,p.Z)(this.element),s=i+t;this.element.classList.remove("no-transition"),this.element.style.transform=t?`translateY(${t*this.elementRect.height}px)`:"",this.swipeHandler.setCursor(""),this.scrollable&&this.scrollable.container.removeEventListener("scroll",this.onScroll),n.Z||(0,c.fc)(document.body,l.Z,{capture:!0,once:!0}),a.Z.settings.animationsEnabled&&(yield(0,d.Z)(250)),this.list.classList.remove("is-reordering"),this.element.classList.remove("is-dragging"),(0,u.Z)(this.element,this.list,s,i),[this.element,...this.siblings].forEach((e=>{e.style.transform=""})),this.element=this.siblings=this.elementRect=this.containerRect=this.minY=this.maxY=this.startScrollPos=this.addScrollPos=void 0,t&&this.onSort(i,s)},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s},(0,r.Z)(this,e),this.swipeHandler=new s.Z({element:this.list,onSwipe:this.onSwipe,verifyTouchTarget:this.verifyTouchTarget,onStart:this.onStart,onReset:this.onReset,setCursorTo:document.body,middleware:this.middleware,withDelay:!0})}getSortableTarget(e){if(!e)return;let t=(0,h.Z)(e,this.list);return t&&t.classList.contains("cant-sort")&&(t=void 0),t}}},1656:(e,t,i)=>{"use strict";function s(e,t){return t?e.forEach((e=>e.setAttribute("disabled","true"))):e.forEach((e=>e.removeAttribute("disabled"))),()=>s(e,!t)}i.d(t,{Z:()=>s})},2648:(e,t,i)=>{"use strict";function s(e,t){if(!e.parentNode)return-1;if(t)return Array.from(e.parentNode.childNodes).indexOf(e);let i=0;for(;null!==(e=e.previousElementSibling);)++i;return i}i.d(t,{Z:()=>s})},6339:(e,t,i)=>{"use strict";i.d(t,{Z:()=>h});var s=i(2738),n=i(5975),a=i(3241),o=i(5432),r=i(5953),d=i(5824),l=i(8497),c=i(3512);class h extends a.Z{constructor(e){super(!1),this.onClickOut=e=>{const t=e.target;(0,n.Z)(t,this.element)||Array.from(this.ignoreButtons).some((e=>(0,n.Z)(t,e)||t===e))||!(this.ignoreMouseOut.size<=1)||this.ignoreOutClickClassName&&(0,l.Z)(t,this.ignoreOutClickClassName)||this.toggle(!1)},this.onMouseOut=e=>{if(!this.isActive())return;if(this.clearTimeout("toggle"),this.ignoreMouseOut.size)return;const t=e.toElement;t&&(0,n.Z)(t,this.element)||this.setTimeout("toggle",(()=>{this.toggle(!1)}),200)},this.toggle=e=>{return t=this,i=void 0,a=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())return;const i=o.Z||!c.Z.settings.animationsEnabled?0:200;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"),this.dispatchEvent("openAfterLayout"),d.Z.pushItem(this.navigationItem={type:"dropdown",onPop:()=>{this.toggle(!1)}}),this.clearTimeout("toggle"),this.setTimeout("done",(()=>{this.forceClose=!1,this.dispatchEvent("opened")}),i)}else this.dispatchEvent("close"),this.ignoreMouseOut.clear(),this.ignoreButtons.clear(),this.element.classList.remove("active"),d.Z.removeItem(this.navigationItem),(0,s.EN)(window,this.onClickOut,{capture:!0}),this.clearTimeout("toggle"),this.setTimeout("done",(()=>{this.element.style.display="none",this.forceClose=!1,this.dispatchEvent("closed")}),i)},new((n=void 0)||(n=Promise))((function(e,s){function o(e){try{d(a.next(e))}catch(e){s(e)}}function r(e){try{d(a.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(t,i||[])).next())}));var t,i,n,a},(0,r.Z)(this,e),this.forceClose=!1,this.inited=!1,this.ignoreMouseOut=new Set,this.ignoreButtons=new Set,this.timeouts={}}attachButtonListener(e,t){let i=!0;o.Z?(0,s.fc)(e,(()=>{i?(i=!1,this.toggle(!0)):this.toggle()}),{listenerSetter:t}):(t.add(e)("mouseover",(s=>{i&&(t.add(e)("mouseout",(e=>{this.clearTimeout("toggle"),this.onMouseOut(e)})),i=!1),this.setTimeout("toggle",(()=>{this.toggle(!0)}),200)})),(0,s.fc)(e,(()=>{const t="click",i=!this.ignoreMouseOut.has(t);i&&!this.ignoreMouseOut.size&&(this.ignoreButtons.add(e),setTimeout((()=>{(0,s.fc)(window,this.onClickOut,{capture:!0})}),0)),this.setIgnoreMouseOut(t,i),this.toggle(i)}),{listenerSetter:t}))}clearTimeout(e){void 0!==this.timeouts[e]&&(clearTimeout(this.timeouts[e]),delete this.timeouts[e])}setTimeout(e,t,i){this.clearTimeout(e),this.timeouts[e]=window.setTimeout((()=>{this.clearTimeout(e),t()}),i)}init(){o.Z||(this.element.onmouseout=this.onMouseOut,this.element.onmouseover=e=>{this.forceClose||this.clearTimeout("toggle")})}isActive(){return this.element.classList.contains("active")}setIgnoreMouseOut(e,t){t?this.ignoreMouseOut.add(e):this.ignoreMouseOut.delete(e)}}},4789:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l,f:()=>s});var s,n=i(8594),a=i(3035),o=i(5296),r=i(3512),d=i(8487);function l(e){var t,i,o;if(null!==(t=e.margin)&&void 0!==t||(e.margin=0),null!==(i=e.maxDistance)&&void 0!==i||(e.maxDistance=1500),null!==(o=e.axis)&&void 0!==o||(e.axis="y"),r.Z.settings.animationsEnabled&&0!==e.forceDuration||(e.forceDirection=s.Static),e.forceDirection===s.Static)return e.forceDuration=0,c(e);const d=(0,a.AD)().then((()=>c(e)));return"y"===e.axis?(0,n.YW)(d):d}function c(e){const{element:t,container:i,getNormalSize:s,getElementPosition:n,transitionFunction:a,axis:r,margin:l,position:p,forceDirection:f,maxDistance:m,forceDuration:g}=e;if(!(0,d.Z)(t))return(0,o.Kx)(i),Promise.resolve();const v="y"===r?"top":"left",b="y"===r?"bottom":"right",y="y"===r?"height":"width",w="y"===r?"scrollHeight":"scrollWidth",S="y"===r?"scrollHeight":"offsetWidth",C="y"===r?"scrollTop":"scrollLeft",L=t.getBoundingClientRect(),E=i.getBoundingClientRect?i.getBoundingClientRect():document.body.getBoundingClientRect(),I=L[v]-E[v],M=n?n({elementRect:L,containerRect:E,elementPosition:I}):I,P=t[S],Z=s?s({rect:E}):E[y];let T=i[C];const k=i[w];let x;switch(p){case"start":x=M-l;break;case"end":x=L[b]-E[b]+l;break;case"nearest":case"center":if(Pm?(T=i.scrollTop+=x-m,x=m):x<-m&&(T=i.scrollTop+=x+m,x=-m)),x<0){const e=-T;x=Math.max(x,e)}else if(x>0){const e=k-(T+Z);x=Math.min(x,e)}const A=i[C]+x,_=Math.abs(x),F=null!=g?g:250+_/1500*350,D=Date.now(),R=null!=a?a:_<500?u:h,B=()=>F?Math.min((Date.now()-D)/F,1):1,N=()=>{const e=B(),t=R(e),s=x*(1-t);return i[C]=Math.round(A-s),e<1};if(!F||!x)return(0,o.Kx)(i),N(),Promise.resolve();if(e.startCallback){const t=k-Math.round(A+i["y"===r?"offsetHeight":"offsetWidth"]);e.startCallback({scrollSize:k,scrollPosition:T,distanceToEnd:t,path:x,duration:F,containerRect:E,elementRect:L,getProgress:B})}return(0,o.cK)(N,i)}function h(e){return 1-Math.pow(1-e,5)}function u(e){return 1-Math.pow(1-e,3.5)}!function(e){e[e.Up=0]="Up",e[e.Down=1]="Down",e[e.Static=2]="Static"}(s||(s={}))},8801:(e,t,i)=>{"use strict";i.d(t,{P:()=>n});const s="_";function n(e,t){const i=""["".length-1]||"";let n;switch(e._){case"inputPhotoFileLocation":n=["photo",""[0],e.id,e.thumb_size].filter(Boolean).join(s);break;case"inputDocumentFileLocation":n=["document",""[0],e.id,e.thumb_size].filter(Boolean).join(s);break;case"inputPeerPhotoFileLocation":n=["peerPhoto",e.photo_id,e.pFlags.big?"big":"small"].join(s);break;case"inputStickerSetThumb":n=["stickerSetThumb",e.stickerset.id||e.stickerset.short_name||e.stickerset.emoticon||e.stickerset._,e.thumb_version].join(s);break;case"inputFileLocation":n=[e.volume_id,e.local_id].join(s);break;case"inputWebFileLocation":n=["webFile",e.url].join(s);break;default:console.error("Unrecognized location:",e),n=""}return n+((null==t?void 0:t.downloadId)?"_download":"")+(i?"."+i:i)}},1708:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(7625);function n(e){(0,s.Z)(e.history,((t,i,s)=>{t.action.photo||(s.splice(i,1),void 0!==e.count&&--e.count)}))}},4081:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(2325);function n(e,t="auto"){if(0===e)return(0,s.ag)("FileSize.B",[0]);const i="auto"===t,n=Math.floor(Math.log(e)/Math.log(1024)),a="auto"===t?Math.max(0,n-1):t,o=Math.max(0,a),r=(e/Math.pow(1024,n)).toFixed(o);return(0,s.ag)(["FileSize.B","FileSize.KB","FileSize.MB","FileSize.GB"][n],[i?r:parseFloat(r)])}},8939:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(2325);const n={s:"Seconds",m:"Minutes",h:"Hours",d:"Days",w:"Weeks",mm:"Months",y:"Years"};function a(e,t){const i=function(e,t=2){e||(e=1);const i=[],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,a)=>{if(n=Math.round(n*t.m),e=0;--e)0===a[e].duration&&a.splice(e,1);return a}(e,2);if(t){const e=i.map((e=>s.ZP.format(n[e.type],!0,[e.duration])));return(0,s.v_)(e,!1,t)}const a=i.map((e=>(0,s.ag)(n[e.type],[e.duration]))),o=document.createElement("span");return o.append(...(0,s.v_)(a,!1)),o}},6272:(e,t,i)=>{"use strict";i.d(t,{u:()=>r});var s=i(2325);const n=new Map;let a=0;const o=(e,t,i="")=>{i=t.country_code+i,a=Math.max(a,i.length),n.set(i,{country:e,code:t})};function r(e){e=e||"",n.size||s.ZP.countriesList.forEach((e=>{e.country_codes.forEach((t=>{t.prefixes?t.prefixes.forEach((i=>{o(e,t,i)})):o(e,t)}))}));let t=e.replace(/\D/g,"");const i=t.slice(0,a);let r;for(let e=i.length-1;e>=0&&(r=n.get(i.slice(0,e+1)),!r);--e);if(!r)return{formatted:t,country:void 0,code:void 0,leftPattern:""};const d=r.country,l=r.code.patterns||[],c=t.slice(r.code.country_code.length);let h="",u=0,p="";for(let e=l.length-1;e>=0;--e){h=l[e];const t=h.replace(/ /g,"");let i=0;for(let e=0,s=Math.min(c.length,t.length);eu&&(u=i,p=h)}h=p||h,h=h.replace(/\d/g,"X"),h=r.code.country_code+" "+h,h.split("").forEach(((e,i)=>{" "===e&&" "!==t[i]&&t.length>i&&(t=t.slice(0,i)+" "+t.slice(i))}));let f=h&&h.length>t.length?h.slice(t.length):"";return f&&(f=f.replace(/X/g,"โ€’")),{formatted:t,country:d,code:r.code,leftPattern:f}}},645:(e,t,i)=>{"use strict";i.d(t,{M:()=>s,Z:()=>n});class s{constructor(){this.cache=new Map}static createCache(){const e={frames:new Map,framesNew:new Map,framesURLs:new Map,clearCache:()=>{e.framesNew.forEach((e=>{var t,i;null===(i=(t=e).close)||void 0===i||i.call(t)})),e.frames.clear(),e.framesNew.clear(),e.framesURLs.clear()},counter:0};return e}getCache(e){let t=this.cache.get(e);return t||this.cache.set(e,t=s.createCache()),++t.counter,t}releaseCache(e){const t=this.cache.get(e);t&&!--t.counter&&this.cache.delete(e)}getCacheCounter(e){const t=this.cache.get(e);return null==t?void 0:t.counter}generateName(e,t,i,s,n){return[e,t,i,s?"colored":"",n||""].filter(Boolean).join("-")}}const n=new s},9171:(e,t,i)=>{"use strict";function s(e,t,i,s,n,a,o){return[e,",",t," ",i," ",s,",",n," ",a,",",o].join("")}function n(e,t,i,n,a,o,r,d){const l=[];return l.push("M"+(e+i/2)+","+t),l.push("H"+(e+i-o)),o>0&&l.push("A"+s(o,o,0,0,1,e+i,t+o)),l.push("V"+(t+n-r)),r>0&&l.push("A"+s(r,r,0,0,1,e+i-r,t+n)),l.push("H"+(e+d)),d>0&&l.push("A"+s(d,d,0,0,1,e+0,t+n-d)),l.push("V"+(t+a)),a>0&&l.push("A"+s(a,a,0,0,1,e+a,t+0)),l.push("Z"),l.join(" ")}i.d(t,{Z:()=>n}),i(410).GO.generatePathData=n},1046:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(6740),n=i(1185),a=i(6705);function o(e,t,i){const o=(0,n.Z)(e,t,!1);let r,d;if(i){const e=(0,a.Z)(o);r=e.canvas,d=e.promise}else r=new Image,d=(0,s.cj)(r,o);return r.classList.add("thumbnail"),{image:r,loadPromise:d}}},1185:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4059);function n(e,t,i=!1){return(0,s.Z)(t.bytes,i)}},8580:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(1507),n=i(1046);function a(e,t,i,a=!1){const o=["video","gif"].includes(e.type);if(!t.downloaded||o||a){if("document"===e._&&t.downloaded&&!a&&(!o||t.type!==s.Pt))return null;const r=e.sizes||e.thumbs,d=(null==r?void 0:r.length)?r.find((e=>"photoStrippedSize"===e._)):null;if(d&&"bytes"in d)return(0,n.Z)(e,d,i)}return null}},6074:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(7625),n=i(5953);class a{constructor(e){this.previous=[],this.next=[],this.reverse=!1,this.loadCount=50,this.loadWhenLeft=20,this.loadedAllUp=!1,this.loadedAllDown=!1,(0,n.Z)(this,e)}setTargets(e,t,i){this.previous=e,this.next=t,this.reverse=i}get index(){return void 0!==this.count?this.previous.length:-1}reset(e=!1){this.current=void 0,this.previous=[],this.next=[],this.setLoaded(!0,e),this.setLoaded(!1,e)}go(e,t=!0){let i,s;if(e>0){if(i=this.next.splice(0,e),s=i.pop(),!s)return;void 0!==this.current&&i.unshift(this.current),this.previous.push(...i)}else{if(i=this.previous.splice(Math.max(0,this.previous.length+e),-e),s=i.shift(),!s)return;void 0!==this.current&&i.push(this.current),this.next.unshift(...i)}return this.next.length0),this.current}unsetCurrent(e){e?this.previous.push(this.current):this.next.unshift(this.current),this.current=void 0}goUnsafe(e,t){const i=e>0?Math.max(0,e-this.next.length):Math.min(0,e+this.previous.length),s=this.go(e,!i&&t);return{item:i?void 0:s,leftLength:i}}setLoaded(e,t){return(e?this.loadedAllDown:this.loadedAllUp)!==t&&(e?this.loadedAllDown=t:this.loadedAllUp=t,t||(e?this.loadPromiseDown=null:this.loadPromiseUp=null),!0)}load(e){if(e?this.loadedAllDown:this.loadedAllUp)return Promise.resolve();let t,i=e?this.loadPromiseDown:this.loadPromiseUp;return i||(t=e?this.reverse?this.previous[0]:this.next[this.next.length-1]:this.reverse?this.next[this.next.length-1]:this.previous[0],null!=t||(t=this.current),i=this.loadMore(t,e,this.loadCount).then((t=>{return n=this,a=void 0,r=function*(){if((e?this.loadPromiseDown:this.loadPromiseUp)!==i)return;t.items.length{const t=this.processItem?this.processItem(e):e;t&&n.push(t)}));const a=yield Promise.all(n);e?this.reverse?this.previous.unshift(...a):this.next.push(...a):this.reverse?this.next.push(...a):this.previous.unshift(...a),this.onLoadedMore&&this.onLoadedMore()},new((o=void 0)||(o=Promise))((function(e,t){function i(e){try{d(r.next(e))}catch(e){t(e)}}function s(e){try{d(r.throw(e))}catch(e){t(e)}}function d(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(i,s)}d((r=r.apply(n,a||[])).next())}));var n,a,o,r}),(()=>{})).then((()=>{e?this.loadPromiseDown=null:this.loadPromiseUp=null})),e?this.loadPromiseDown=i:this.loadPromiseUp=i,i)}}},3699:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});class s{constructor(){this.listeners=new Set}add(e){return(t,i,s)=>{const n={element:e,event:t,callback:i,options:s};return this.addManual(n),n}}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,i,s){let n;for(const a of this.listeners)if(a.element===e&&a.event===t&&a.callback===i&&a.options===s){n=a;break}n&&this.remove(n)}removeAll(){this.listeners.forEach((e=>{this.remove(e)}))}}},9405:(e,t,i)=>{"use strict";i.d(t,{C:()=>a,c:()=>n});var s=i(9897);class n{constructor(e=0,t=e){this.width=e,this.height=t}aspect(e,t){return(0,s.Z)(this.width,this.height,e.width,e.height,t)}aspectFitted(e){return this.aspect(e,!0)}aspectCovered(e){return this.aspect(e,!1)}}function a(e,t){return new n(e,t)}},4755:(e,t,i)=>{"use strict";i.d(t,{Z:()=>u,_:()=>s});var s,n=i(410),a=i(3241),o=i(9405);!function(e){e[e.mobile=0]="mobile",e[e.medium=1]="medium",e[e.large=2]="large"}(s||(s={}));const r=(0,o.C)(20,20),d=(0,o.C)(36,36),l=(0,o.C)(18,18);class c extends a.Z{constructor(){super(),this.screenSizes=[{key:s.mobile,value:600},{key:s.medium,value:1275},{key:s.large,value:1680}],this.sizes={handhelds:{regular:(0,o.C)(270,270),webpage:(0,o.C)(270,200),album:(0,o.C)(270,0),esgSticker:(0,o.C)(68,68),animatedSticker:(0,o.C)(180,180),staticSticker:(0,o.C)(180,180),emojiSticker:(0,o.C)(112,112),poll:(0,o.C)(240,0),round:(0,o.C)(200,200),documentName:(0,o.C)(200,0),invoice:(0,o.C)(270,270),extendedInvoice:(0,o.C)(270,270),customEmoji:r,esgCustomEmoji:d,emojiStatus:l,popupSticker:(0,o.C)(68,68)},desktop:{regular:(0,o.C)(420,340),webpage:(0,o.C)(420,340),album:(0,o.C)(420,0),esgSticker:(0,o.C)(72,72),animatedSticker:(0,o.C)(200,200),staticSticker:(0,o.C)(200,200),emojiSticker:(0,o.C)(112,112),poll:(0,o.C)(330,0),round:(0,o.C)(280,280),documentName:(0,o.C)(240,0),invoice:(0,o.C)(320,320),extendedInvoice:(0,o.C)(420,340),customEmoji:r,esgCustomEmoji:d,emojiStatus:l,popupSticker:(0,o.C)(80,80)}},this.isMobile=!1,this.handleResize=()=>{const e=window.innerWidth;let t=this.screenSizes[0].key;for(let i=this.screenSizes.length-1;i>=0;--i)if(this.screenSizes[i].value{this.rAF&&window.cancelAnimationFrame(this.rAF),this.rAF=window.requestAnimationFrame((()=>{this.handleResize(),this.rAF=0}))})),this.handleResize()}}const h=new c;n.GO.mediaSizes=h;const u=h},8631:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});const s=(0,i(5471).Z)("MIDDLEWARE");function n(e,t=s){return i=>{if(!(i instanceof Promise)){if(i instanceof Error)throw i;return i}return i.then((i=>{if(!e())throw t;return i}))}}},2559:(e,t,i)=>{"use strict";function s(e,t=2){if(0===e)return"0";const i=t<0?0:t,s=Math.floor(Math.log(e)/Math.log(1e3));return parseFloat((e/Math.pow(1e3,s)).toFixed(i))+["","K","M","B","T"][s]}i.d(t,{Z:()=>s})},2575:(e,t,i)=>{"use strict";function s(e,t=" "){const i=e.toString().split(".");return i[0]=i[0].replace(/\B(?=(\d{3})+(?!\d))/g,t),i.join(".")}i.d(t,{Z:()=>s})},925:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4762);function n(e,t=e.HAVE_METADATA,i){return new Promise(((n,a)=>{if(e.readyState>=t)return void n();const o=s.IS_APPLE_MOBILE&&!i?"loadeddata":"canplay",r="error",d=()=>{e.removeEventListener(r,l),n()},l=t=>{e.removeEventListener(o,d),a(e.error)};e.addEventListener(o,d,{once:!0}),e.addEventListener(r,l,{once:!0})}))}},2296:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(5824),n=i(5432),a=i(4762),o=i(3910),r=i(2738),d=i(5975),l=i(3241);class c extends l.Z{constructor(e,t){super(!1),this.navigationType=e,this.withOverlay=t,this.onClick=e=>{var t;this.element&&(0,d.Z)(e.target,this.element)||((null===(t=this.listenerOptions)||void 0===t?void 0:t.capture)&&(0,o.Z)(e),this.close())},this.listenerOptions=t?{}:{capture:!0}}close(){var e;this.element&&(null===(e=this.overlay)||void 0===e||e.remove(),this.element=void 0,this.dispatchEvent("toggle",!1)),n.Z||window.removeEventListener("contextmenu",this.onClick,this.listenerOptions),document.removeEventListener(r.pf,this.onClick,this.listenerOptions),a.IS_MOBILE_SAFARI||s.Z.removeByType(this.navigationType)}open(e){this.close(),a.IS_MOBILE_SAFARI||s.Z.pushItem({type:this.navigationType,onPop:e=>{this.close()}}),this.element=e,!this.overlay&&this.withOverlay&&(this.overlay=document.createElement("div"),this.overlay.classList.add("btn-menu-overlay"),this.overlay.addEventListener(r.pf,(e=>{(0,o.Z)(e),this.onClick(e)}))),this.overlay&&this.element.parentElement.insertBefore(this.overlay,this.element),n.Z||window.addEventListener("contextmenu",this.onClick,Object.assign(Object.assign({},this.listenerOptions),{once:!0})),document.addEventListener(r.pf,this.onClick,this.listenerOptions),this.dispatchEvent("toggle",!0)}}},5180:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(7445);function n(e,t,i){const n=(e=+e)<0,a=s.Z[t];if(!a)throw new Error("CURRENCY_WRAP_INVALID");const o=e/Math.pow(10,a.exp);let r=a.exp;"IRR"==t&&Math.floor(o)==o&&(r=0);let d=function(e,t,i,s){e=(e+"").replace(/[^0-9+\-Ee.]/g,"");var n=isFinite(+e)?+e:0,a=isFinite(+t)?Math.abs(t):0,o=void 0===s?",":s,r=void 0===i?".":i,d="";return(d=(a?function(e,t){var i=Math.pow(10,t);return""+Math.round(e*i)/i}(n,a):""+Math.round(n)).split("."))[0].length>3&&(d[0]=d[0].replace(/\B(?=(?:\d{3})+(?!\d))/g,o)),(d[1]||"").length{"use strict";i.d(t,{Z:()=>n});var s=i(4755);function n(e,t,i,n){e.touches&&(e=e.touches[0]);const{pageX:a,pageY:o}=e,r=Array.from(t.children).find((e=>e.classList.contains("btn-menu-item")&&!e.classList.contains("hide")))||t;let{scrollWidth:d}=r;const{scrollHeight:l}=t,c=document.body.getBoundingClientRect(),h=c.width,u=c.height;d+=2*r.offsetLeft;let p=8,f=8,m=8,g=8;n&&(n.top&&n.top,n.right&&(f+=n.right),n.bottom&&(m+=n.bottom),n.left&&(g+=n.left)),i=s.Z.isMobile?"right":"left";let v="top";const b=u-l-m,y=h-d-f,w=g,S={x:{left:a,right:Math.min(y,a-d)},intermediateX:"right"===i?w:y,y:{top:o,bottom:o-l},intermediateY:b},C={left:S.x.left+d+f<=h,right:S.x.right>=g},L={top:S.y.top+l+m<=u,bottom:S.y.bottom-m>=m};{const e=C[i]?S.x[i]:(i="center",S.intermediateX);t.style.left=e+"px"}{const e=L[v]?S.y[v]:(v="center",S.intermediateY);t.style.top=e+"px"}return t.className=t.className.replace(/(top|center|bottom)-(left|center|right)/g,""),t.classList.add(("center"===v?v:"bottom")+"-"+("center"===i?i:"left"===i?"right":"left")),{width:d,height:l}}},677:(e,t,i)=>{"use strict";i.d(t,{RP:()=>a,X:()=>o});const s=new Set(["all","web","webk"]),n=new Set;function a(e){return e.find((e=>s.has(e.platform)&&!n.has(e.reason)))}function o(e){return!!a(e)}},3174:(e,t,i)=>{"use strict";i.d(t,{O:()=>o,k:()=>a});var s=i(3512);const n={};function a(e,t,i,s){const a=e.id+"-"+t,o=n[a];return o&&o.width>=i&&o.height>=s}function o(e,t,i){return o=this,r=void 0,l=function*(){const o=e.id+"-"+i,{width:r,height:d}=t;if(a(e,i,r,d))return;const l=n[o]={width:r,height:d},c=yield s.Z.managers.appDocsManager.getLottieCachedThumb(e.id,i);if(n[o]!==l)return;if(c&&c.w>=r&&c.h>=d)return;const h=new Promise((e=>{t.toBlob((t=>e(t)))})),u=yield h;n[o]===l&&s.Z.managers.appDocsManager.saveLottiePreview(e.id,u,r,d,i)},new((d=void 0)||(d=Promise))((function(e,t){function i(e){try{n(l.next(e))}catch(e){t(e)}}function s(e){try{n(l.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof d?n:new d((function(e){e(n)}))).then(i,s)}n((l=l.apply(o,r||[])).next())}));var o,r,d,l}},9966:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(3035);function n(e){return function(e,t){let i,s=!1;return(...n)=>{i=n,s||(s=!0,e((()=>{s=!1,t(...i)})))}}(s.T2,e)}},8936:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(5953);class n{constructor(e){this.loading=!1,this.loaded=!1,(0,s.Z)(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}))))}}},3719:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(3781),n=i(2790),a=i(3512),o=i(7625),r=i(1708),d=i(6074),l=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class c extends d.Z{constructor(e={}){var t;super(Object.assign(Object.assign({},e),{loadMore:(e,t,i)=>{const a=t?0:i;let o=null==e?void 0:e.mid;var d;return void 0===o&&(o=this.searchContext.maxId),t||(d=o,1,o=(0,s.Z)((0,n.Z)(d)+1)),this.managers.appMessagesManager.getSearch(Object.assign(Object.assign({},this.searchContext),{peerId:this.searchContext.peerId||(null==e?void 0:e.peerId),maxId:o,limit:a?0:i,backLimit:a})).then((e=>("inputMessagesFilterChatPhotos"===this.searchContext.inputFilter._&&(0,r.Z)(e),e.next_rate&&(this.searchContext.nextRate=e.next_rate),{count:e.count,items:e.history})))},processItem:t=>l(this,void 0,void 0,(function*(){if((yield this.filterMids([t.mid])).length)return e.processItem(t)}))})),this.onHistoryDelete=({peerId:e,msgs:t})=>{const i=i=>i.peerId===e&&t.has(i.mid),s=(e,t,s)=>{i(e)&&s.splice(t,1)};(0,o.Z)(this.previous,s),(0,o.Z)(this.next,s),this.current&&i(this.current)&&(this.current=void 0,this.onEmptied&&this.onEmptied())},this.onHistoryMultiappend=e=>l(this,void 0,void 0,(function*(){if(void 0!==this.searchContext.folderId)return;if(!this.loadedAllUp||this.loadPromiseUp)return;if(e.peerId!==this.searchContext.peerId)return;const t=yield this.filterMids([e.mid]),i=(yield Promise.all(t.map((e=>this.processItem(e))))).filter(Boolean);i.length&&(this.current?this.next.push(...i):this.previous.push(...i))})),this.onMessageSent=({message:e})=>{this.onHistoryMultiappend(e)},null!==(t=this.managers)&&void 0!==t||(this.managers=a.Z.managers),a.Z.addEventListener("history_delete",this.onHistoryDelete),a.Z.addEventListener("history_multiappend",this.onHistoryMultiappend),a.Z.addEventListener("message_sent",this.onMessageSent),e.isInner||(this.otherSideLoader=new c(Object.assign(Object.assign({},e),{isInner:!0})))}filterMids(e){return l(this,void 0,void 0,(function*(){const t=`${this.searchContext.peerId}_${this.searchContext.isScheduled?"scheduled":"history"}`;return yield this.managers.appMessagesManager.filterMessagesByInputFilterFromStorage(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),!1===this.searchContext.useSearch&&(this.loadedAllDown=this.loadedAllUp=!0),this.otherSideLoader&&this.otherSideLoader.setSearchContext(e)}reset(){super.reset(),this.searchContext=void 0,this.otherSideLoader&&this.otherSideLoader.reset()}getPrevious(e){let t=this.previous;return this.otherSideLoader&&e&&(t=t.concat(this.otherSideLoader.previous)),t}getNext(e){let t=this.next;return this.otherSideLoader&&e&&(t=t.concat(this.otherSideLoader.next)),t}getCurrent(){var e;return this.current||(null===(e=this.otherSideLoader)||void 0===e?void 0:e.current)}goToOtherEnd(e){return e>0?this.go(-this.previous.length):this.go(this.next.length)}goRound(e,t){var i;let s;if(null===(i=this.otherSideLoader)||void 0===i?void 0:i.current){if(s=this.otherSideLoader.goUnsafe(e,t),s.item)return s.item;if(!((e=s.leftLength)>0?this.otherSideLoader.next:this.otherSideLoader.previous).length){if(!(e>0?this.otherSideLoader.loadedAllUp:this.otherSideLoader.loadedAllDown))return;if(e>0&&(1===this.otherSideLoader.searchContext.maxId||this.otherSideLoader.loadedAllDown)||e<0&&(0===this.otherSideLoader.searchContext.maxId||this.otherSideLoader.loadedAllUp))return this.otherSideLoader.goToOtherEnd(e);this.otherSideLoader.unsetCurrent(e>0)}}if(s=this.goUnsafe(e,t),!s.item){if(this.loadedAllUp&&this.loadedAllDown)return this.goToOtherEnd(e);this.otherSideLoader&&(e=s.leftLength,s=this.otherSideLoader.goUnsafe(e,t),s.item&&this.unsetCurrent(e>0))}return null==s?void 0:s.item}setLoaded(e,t){var i;const s=super.setLoaded(e,t);if(s&&this.otherSideLoader&&t&&!1!==(null===(i=this.searchContext)||void 0===i?void 0:i.useSearch)){const e=this.loadedAllUp;this.otherSideLoader.setSearchContext(Object.assign(Object.assign({},this.searchContext),{maxId:e?1:0})),this.otherSideLoader.reverse=this.reverse,this.otherSideLoader.setLoaded(e,!0),this.otherSideLoader.load(!e)}return s}cleanup(){this.reset(),a.Z.removeEventListener("history_delete",this.onHistoryDelete),a.Z.removeEventListener("history_multiappend",this.onHistoryMultiappend),a.Z.removeEventListener("message_sent",this.onMessageSent),this.onEmptied=void 0,this.otherSideLoader&&(this.otherSideLoader.cleanup(),this.otherSideLoader=void 0)}}},9674:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(3035),n=i(3725),a=i(410),o=i(8487);const r=new class{constructor(){this.promises={},this.raf=s.T2.bind(null),this.scheduled=!1}do(e,t){let i=this.promises[e];return i||(this.scheduleFlush(),i=this.promises[e]=(0,n.Z)()),void 0!==t&&i.then((()=>t())),i}measure(e){return this.do("read",e)}mutate(e){return this.do("write",e)}mutateElement(e,t){const i=(0,o.Z)(e),s=i?this.mutate():Promise.resolve();return void 0!==t&&(i?s.then((()=>t())):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.GO&&(a.GO.sequentialDom=r);const d=r},1713:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(1507),n=i(7030),a=i(9405),o=i(3114);function r(e,t,i,r,d=!0,l,c,h){const u=(0,o.Z)(e);let p;h||(h=(0,n.Z)(e,i,r,void 0,c));const f="document"===e._;p=f||u?(0,a.C)(e.w||h.w||512,e.h||h.h||512):(0,a.C)(h.w||100,h.h||100);let m=(0,a.C)(i,r);m=p=p.aspect(m,d);let g=!0;return(!f||["video","gif"].includes(e.type)||u)&&(m.width<200&&m.height<200&&(m=p=p.aspectCovered((0,a.C)(200,200))),l&&(l.message||l.reply_to_mid||l.media.webpage||l.replies&&l.replies.pFlags.comments&&l.replies.channel_id.toChatId()!==s.IA)&&m.width<320&&(m=(0,a.C)(320,m.height),g=!1),g&&m.width<120&&l&&(m=(0,a.C)(120,m.height),g=!1)),t.style.width=m.width+"px",t.style.height=m.height+"px",{photoSize:h,size:p,isFit:g}}},5345:(e,t,i)=>{"use strict";i.d(t,{Z:()=>u,s:()=>h});var s=i(5003),n=i(6519),a=i(3624),o=i(8631),r=i(5953),d=i(5418),l=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};let c=0;class h{constructor(e){var t;(0,r.Z)(this,e),this.queue=[],null!==(t=this.middlewareHelper)&&void 0!==t||(this.middlewareHelper=(0,a.k)());const i="BATCH-PROCESSOR-"+ ++c;this.log?this.log=this.log.bindPrefix(i):this.log=(0,s.kg)(i)}get queuePromise(){return this.promise}clear(){this.log("clear"),this.queue.length=0,this.promise=void 0,this.middlewareHelper.clean()}addToQueue(e){return this.queue.push(e),this.setQueue()}setQueue(){if(!this.queue.length)return Promise.resolve();if(this.promise)return this.promise;const e=this.middlewareHelper.get(),t=this.log.bindPrefix("queue"),i=(0,o.Z)(e,this.possibleError),s=()=>l(this,void 0,void 0,(function*(){t("start",this.queue.length);const e=this.queue.splice(0,this.queue.length),n=performance.now(),a=e.map((e=>(e.then((e=>{t("render item time",performance.now()-n,e)})),e))),o=yield i(Promise.all(a));if(yield i(this.process(o,i,t)),t("queue rendered"),this.queue.length)return t("have new items to render"),s();t("end")}));t("setting pause");const n=this.promise=i((0,d.Z)(0)).then((()=>s().catch((e=>{throw e!==this.possibleError&&t.error("process queue error",e),e}))),(e=>{throw t("pause has been cleared"),e})).finally((()=>{this.promise===n&&(this.promise=void 0)}));return n}}class u{constructor(e){this.updateElementWith=e=>e(),this.updateListWith=e=>e(!0),(0,r.Z)(this,e),this.elements=new Map,this.sorted=[],this.middleware=(0,a.k)(),this.batchProcessor=new h({log:this.log,process:(e,t,i)=>l(this,void 0,void 0,(function*(){const i=e.map((e=>this.update(e.id,e)));yield t(Promise.all(i))}))})}clear(){this.batchProcessor.clear(),this.middleware.clean(),this.elements.clear(),this.sorted.length=0}_updateList(){this.elements.forEach((e=>{this.update(e.id)})),this.onSort&&this.sorted.forEach(((e,t)=>{this.onSort(e,t)}))}updateList(e){const t=this.middleware.get();this.updateListWith((i=>{t()&&(void 0===i||i)?(this._updateList(),null==e||e(!0)):null==e||e(!1)}))}has(e){return this.elements.has(e)}get(e){return this.elements.get(e)}getAll(){return this.elements}add(e){return l(this,void 0,void 0,(function*(){if(this.get(e))return;const t={id:e,index:0};this.elements.set(e,t);const i=Promise.resolve(this.onElementCreate(t));return this.batchProcessor.addToQueue(i)}))}delete(e,t){const i=this.elements.get(e);if(!i)return!1;this.elements.delete(e);const s=this.sorted.indexOf(i);if(-1!==s&&this.sorted.splice(s,1),this.onDelete)if(t)this.onDelete(i);else{const e=this.middleware.get();this.updateElementWith((()=>{e()&&this.onDelete(i)}))}return!0}update(e,t=this.get(e)){var i;return l(this,void 0,void 0,(function*(){if(!t)return;if(t.index=yield this.getIndex(t),this.get(e)!==t)return;null===(i=this.onUpdate)||void 0===i||i.call(this,t);const s=(0,n.Z)(this.sorted,t,"index");this.onSort(t,s)}))}}},6854:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});const s="\ufeff"},4056:(e,t,i)=>{"use strict";function s(e){return e.replace(/&/g,"&").replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,(e=>"&#"+(1024*(e.charCodeAt(0)-55296)+(e.charCodeAt(1)-56320)+65536)+";")).replace(/([^\#-~| |!])/g,(e=>"&#"+e.charCodeAt(0)+";")).replace(//g,">")}i.d(t,{Z:()=>s})},3738:(e,t,i)=>{"use strict";function s(e){return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}i.d(t,{Z:()=>s})},8456:(e,t,i)=>{"use strict";function s(e,t,i=t+10){return(e=e.trim()).length>i&&(e=e.slice(0,t)+"..."),e}i.d(t,{Z:()=>s})},5157:(e,t,i)=>{"use strict";function s(e,t=!1){const i=parseInt(e+"",10),s=Math.floor(i/3600);let n=Math.floor((i-3600*s)/60),a=i-3600*s-60*n;return s&&(t=!0),n<10&&(n=t?"0"+n:n),a<10&&(a="0"+a),(s?s+":":"")+n+":"+a}i.d(t,{Z:()=>s})},8812:(e,t,i)=>{"use strict";function s(e){const t=new Blob([e],{type:"image/svg+xml;charset=utf-8"});return new Promise((e=>{const i=new FileReader;i.onload=t=>{e(t.target.result)},i.readAsDataURL(t)}))}i.d(t,{Z:()=>s})},241:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(410),n=i(1352);const a=new class{constructor(){if(n.kC)return;const e="visualViewport"in window?window.visualViewport:window,t=()=>{this.width=e.width||e.innerWidth,this.height=e.height||e.innerHeight};e.addEventListener("resize",t),t()}};s.GO&&(s.GO.windowSize=a);const o=a},8594:(e,t,i)=>{"use strict";i.d(t,{YW:()=>p,ZP:()=>v,e9:()=>g,gp:()=>m});var s=i(3725),n=i(410),a=i(5418);const o=new(i(3241).Z),r="start",d="end";let l=!1,c=(0,s.Z)(),h=0;c.resolve();const u=console.log.bind(console.log,"[HEAVY-ANIMATION]:");function p(e,t){l||(c=(0,s.Z)(),o.dispatchEvent(r),l=!0,n.ZP&&u("start")),++h,n.ZP&&u("attach promise, length:",h,t);const i=[void 0!==t?(0,a.Z)(t):void 0,e.finally((()=>{}))].filter(Boolean),d=performance.now(),p=c;return Promise.race(i).then((()=>{c!==p||c.isFulfilled||(--h,n.ZP&&u("promise end, length:",h,performance.now()-d),h<=0&&f())})),c}function f(){c.isFulfilled||(l=!1,h=0,o.dispatchEvent(d),c.resolve(),n.ZP&&u("end"))}function m(){f()}function g(){return c}function v(e,t,i){l&&e();const s=i?i.add(o):o.addEventListener.bind(o),n=i?i.removeManual.bind(i,o):o.removeEventListener.bind(o);return s(r,e),s(d,t),()=>{n(d,t),n(r,e)}}window.dispatchHeavyAnimationEvent=p},4277:(e,t,i)=>{"use strict";i.r(t),i.d(t,{AppDialogsManager:()=>lt,DIALOG_LIST_ELEMENT_TAG:()=>et,default:()=>ht});var s=i(9331),n=i(3512),a=i(6194),o=i(2325),r=i(4668),d=i(2796),l=i(3897),c=i(1507),h=i(3186),u=i(4531),p=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class f{constructor(e){this.managers=e,this.onArchiveClick=()=>p(this,void 0,void 0,(function*(){const e=yield this.managers.appMessagesManager.getDialogOnly(this.peerId);e&&this.managers.appMessagesManager.editPeerFolders([e.peerId],+!e.folder_id)})),this.onHideTopicClick=()=>{this.managers.appChatsManager.editForumTopic({chatId:this.peerId.toChatId(),topicId:this.threadId,hidden:!0})},this.onToggleTopicClick=()=>{this.managers.appChatsManager.editForumTopic({chatId:this.peerId.toChatId(),topicId:this.threadId,closed:!this.dialog.pFlags.closed})},this.onPinClick=()=>{const{peerId:e,filterId:t,threadId:i}=this;this.managers.appMessagesManager.toggleDialogPin({peerId:e,filterId:t,topicId:i}).catch((e=>p(this,void 0,void 0,(function*(){"PINNED_DIALOGS_TOO_MUCH"!==e.type&&"PINNED_TOO_MUCH"!==e.type||(i?this.managers.apiManager.getLimit("topicPin").then((e=>{(0,d.bC)({langPackKey:"LimitReachedPinnedTopics",langPackArguments:[e]})})):t>=1?(0,d.bC)({langPackKey:"PinFolderLimitReached"}):(0,h.Z)("pin"))}))))},this.onUnmuteClick=()=>{this.managers.appMessagesManager.togglePeerMute({peerId:this.peerId,mute:!1,threadId:this.threadId})},this.onMuteClick=()=>{new l.Z(this.peerId,this.threadId)},this.onUnreadClick=()=>p(this,void 0,void 0,(function*(){const{peerId:e,dialog:t}=this;t.unread_count?(this.managers.appMessagesManager.readHistory(e,t.top_message,this.threadId),this.threadId||this.managers.appMessagesManager.markDialogUnread(e,!0)):this.threadId||this.managers.appMessagesManager.markDialogUnread(e)})),this.onDeleteClick=()=>{new a.Z(this.peerId,void 0,void 0,this.threadId)}}attach(e){(0,u.Z)({listenTo:e,buttons:this.getButtons(),appendTo:document.getElementById("page-chats"),onOpen:e=>p(this,void 0,void 0,(function*(){this.li=e,e.classList.add("menu-open"),this.peerId=e.dataset.peerId.toPeerId(),this.threadId=+e.dataset.threadId||void 0,this.dialog=yield this.managers.dialogsStorage.getDialogOrTopic(this.peerId,this.threadId),this.filterId=this.threadId?void 0:ht.filterId,this.canManageTopics=this.threadId?yield this.managers.appChatsManager.hasRights(this.peerId.toChatId(),"manage_topics"):void 0})),onBeforeOpen:()=>p(this,void 0,void 0,(function*(){const e=this.threadId?"Delete":yield this.managers.appPeersManager.getDeleteButtonText(this.peerId),t=this.buttons[this.buttons.length-1];(null==t?void 0:t.element)&&t.element.lastChild.replaceWith((0,o.ag)(e))})),onClose:()=>{this.li.classList.remove("menu-open"),this.li=this.peerId=this.dialog=this.filterId=this.threadId=this.canManageTopics=void 0},findElement:e=>(0,r.Z)(e.target,et)})}getButtons(){var e;return null!==(e=this.buttons)&&void 0!==e?e:this.buttons=[{icon:"unread",text:"MarkAsUnread",onClick:this.onUnreadClick,verify:()=>p(this,void 0,void 0,(function*(){return!this.threadId&&!(yield this.managers.appMessagesManager.isDialogUnread(this.dialog))}))},{icon:"readchats",text:"MarkAsRead",onClick:this.onUnreadClick,verify:()=>this.managers.appMessagesManager.isDialogUnread(this.dialog)},{icon:"pin",text:"ChatList.Context.Pin",onClick:this.onPinClick,verify:()=>p(this,void 0,void 0,(function*(){var e;return!(this.threadId&&!this.canManageTopics)&&!(void 0!==this.filterId&&this.filterId>1?(yield this.managers.appMessagesManager.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:()=>p(this,void 0,void 0,(function*(){var e;return!(this.threadId&&!this.canManageTopics)&&(void 0!==this.filterId&&this.filterId>1?(yield this.managers.appMessagesManager.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:()=>p(this,void 0,void 0,(function*(){return this.peerId!==n.Z.myId&&!(yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.dialog.peerId,threadId:this.threadId}))}))},{icon:"unmute",text:"ChatList.Context.Unmute",onClick:this.onUnmuteClick,verify:()=>p(this,void 0,void 0,(function*(){return this.peerId!==n.Z.myId&&(yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.dialog.peerId,threadId:this.threadId}))}))},{icon:"archive",text:"Archive",onClick:this.onArchiveClick,verify:()=>0===this.filterId&&this.peerId!==n.Z.myId},{icon:"unarchive",text:"Unarchive",onClick:this.onArchiveClick,verify:()=>1===this.filterId&&this.peerId!==n.Z.myId},{icon:"hide",text:"Hide",onClick:this.onHideTopicClick,verify:()=>this.canManageTopics&&this.dialog.id===c.Ox},{icon:"lock",text:"CloseTopic",onClick:this.onToggleTopicClick,verify:()=>this.canManageTopics&&!this.dialog.pFlags.closed},{icon:"lockoff",text:"RestartTopic",onClick:this.onToggleTopicClick,verify:()=>this.canManageTopics&&!!this.dialog.pFlags.closed},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>!this.threadId||!!this.canManageTopics&&this.dialog.id!==c.Ox}]}}var m=i(6008),g=i(1405),v=i(8805),b=i(632),y=i(4762),w=i(5003),S=i(9322),C=i(4494),L=i(9099),E=i(410),I=i(8842),M=i(1447),P=i(9492),Z=i(534),T=i(744),k=i(2738),x=i(4484),A=i(5565),_=i(4159),F=i(3442),D=i(7487),R=i(9174),B=i(3910),N=i(490);class O{constructor(e,t){this.managers=e,this.hadConnect=!1,this.connecting=!1,this.timedOut=!1,this.updating=!1,this.setConnectionStatus=e=>{Promise.all([D.Z.get("dc"),n.Z.managers.rootScope.getConnectionStatus()]).then((([t,i])=>{t||(t=_.Z.baseDcId),this.setFirstConnectionTimeout&&(clearTimeout(this.setFirstConnectionTimeout),this.setFirstConnectionTimeout=0);const s=i["NET-"+t],n=s&&(e||s.status)===R.Q.Connected;this.connecting&&n&&this.managers.apiUpdatesManager.forceGetDifference(),n&&!this.hadConnect&&(this.hadConnect=!0),this.timedOut=s&&(e||s.status)===R.Q.TimedOut,this.connecting=!n,this.retryAt=s&&s.retryAt,E.ZP&&this.log("connecting",this.connecting),this.setState()}))},this.setStatusText=(e,t)=>{this.currentLangPackKey!==e&&(this.currentLangPackKey=e,(0,A.Z)(this.statusEl,(0,o.ag)(e,t)),this.statusPreloader.attach(this.statusEl))},this.setState=()=>{if(N.Z.deactivatedReason)return;const e=O.CHANGE_STATE_DELAY;if(this.connecting)if(this.timedOut){const e=this.getA("ConnectionStatus.ForceReconnect",(()=>this.managers.networkerFactory.forceReconnect()));this.setStatusText("ConnectionStatus.TimedOut",[e])}else if(this.hadConnect)if(void 0!==this.retryAt){const e=document.createElement("span"),t=this.retryAt,i=()=>{const i=Date.now();e.innerText=""+Math.max(0,Math.round((t-i)/1e3)),i>t&&clearInterval(s)},s=setInterval(i,1e3);i();const n=this.getA("ConnectionStatus.Reconnect",(()=>this.managers.networkerFactory.forceReconnectTimeout()));this.setStatusText("ConnectionStatus.ReconnectIn",[e,n])}else this.setStatusText("ConnectionStatus.Reconnecting");else this.setStatusText("ConnectionStatus.Waiting");else this.updating&&this.setStatusText("Updating");E.ZP&&this.log("setState",this.connecting||this.updating),window.requestAnimationFrame((()=>{this.setStateTimeout&&clearTimeout(this.setStateTimeout),this.setStateTimeout=window.setTimeout((()=>{(0,L.Z)({element:this.statusContainer,className:"is-shown",forwards:this.connecting||this.updating,duration:200}),this.setStateTimeout=0,E.ZP&&this.log("setState: isShown:",this.connecting||this.updating)}),e)}))},this.log=(0,w.kg)("CS",void 0,void 0),this.statusContainer=document.createElement("div"),this.statusContainer.classList.add("connection-status"),this.statusEl=(0,C.Z)("btn-primary bg-warning connection-status-button",{noRipple:!0}),this.statusPreloader=new F.Z({cancelable:!1}),this.statusPreloader.constructContainer({color:"transparent",bold:!0}),this.statusContainer.append(this.statusEl),t.prepend(this.statusContainer),n.Z.addEventListener("connection_status_change",(e=>{this.setConnectionStatus()})),n.Z.addEventListener("state_synchronizing",(e=>{e||(this.updating=!0,E.ZP&&this.log("updating",this.updating),this.setState())})),n.Z.addEventListener("state_synchronized",(e=>{E.ZP&&this.log("state_synchronized",e),e||(this.updating=!1,E.ZP&&this.log("updating",this.updating),this.setState())})),this.setFirstConnectionTimeout=window.setTimeout(this.setConnectionStatus,O.CHANGE_STATE_DELAY+1e3)}getA(e,t){const i=document.createElement("a");return i.classList.add("force-reconnect"),i.append((0,o.ag)(e)),(0,k.fc)(i,(e=>{(0,B.Z)(e),t()})),i}}O.CHANGE_STATE_DELAY=1e3;var U,H=i(6740),z=i(3035),j=i(2894),G=i(5432),V=i(1154),K=i(241),W=i(8487);!function(e){e[e.Error=-1]="Error",e[e.Pending=0]="Pending",e[e.Sent=1]="Sent",e[e.Read=2]="Read"}(U||(U={}));var $=i(5345),q=i(5701),Y=i(5296),Q=i(8222);function X(e,t,i,s){return e>=s?t+i:function(e,t){return-t/2*(Math.cos(Math.PI*e)-1)}(e/s,i)+t}var J=i(4755);function ee(e,t,i,s,n,a,o,r){const d=e.canvas.dpr;if(d&&(t*=d,i*=d,s*=d,n*=d),"number"==typeof a)d&&(a*=d),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]?d?a[t]*d:a[t]:e[t]}e.beginPath(),e.moveTo(t+a.tl,i),e.lineTo(t+s-a.tr,i),e.quadraticCurveTo(t+s,i,t+s,i+a.tr),e.lineTo(t+s,i+n-a.br),e.quadraticCurveTo(t+s,i+n,t+s-a.br,i+n),e.lineTo(t+a.bl,i+n),e.quadraticCurveTo(t,i+n,t,i+n-a.bl),e.lineTo(t,i+a.tl),e.quadraticCurveTo(t,i,t+a.tl,i),e.closePath(),o&&e.fill(),r&&e.stroke()}const te=window.devicePixelRatio,ie=20*te,se=2.5*te,ne=2*te,ae=1*te;var oe=i(6818),re=i(5824),de=i(3013),le=i(130),ce=i(4332),he=i(1168),ue=i(7030),pe=i(8115),fe=i(496),me=i(5381),ge=i(7530),ve=i(2291),be=i(5772),ye=i(3385),we=i(2554),Se=i(8050),Ce=i(3725),Le=i(7362),Ee=i(8631),Ie=i(2312),Me=i(2059),Pe=i(2493),Ze=i(319),Te=i(2890),ke=i(3228);class xe{constructor(){this.font="30pt Helvetica",this.currTime=Date.now(),this.diffTime=0,this.spread=0,this.paused=!1,this.pausedTime=0,this.pauseInterval=850,this.lightSource=0,this.inc=.032,this.lightSpread=.55,this.animations=["slide","slide","slide","slide"],this.currentAnimationIndex=0}keepTime(){this.diffTime=Date.now()-this.currTime,this.currTime=Date.now()}cycleAnimation(){++this.currentAnimationIndex,this.currentAnimationIndex>=this.animations.length&&(this.currentAnimationIndex=0)}animate(){const e=this.animations[this.currentAnimationIndex];return"glow"===e?this.animateGlow():"slide"===e?this.animateSlide():void console.log("unknown animation type: "+String(e))}animateGlow(){var e=68;return()=>{var t=this.diffTime/(1e3/60)*10;return this.paused?Date.now()-this.pausedTime>800&&(e=68,this.cycleAnimation(),this.paused=!1):(e=parseInt(""+(e+t)))>=255&&(this.paused=!0,this.pausedTime=Date.now()),"rgb("+e+","+e+","+e+")"}}animateSlide(){var e,t,i,s=this.ctx.createLinearGradient(0,0,this.canvas.width,0),n=this.inc*(this.diffTime/(1e3/60));if(this.paused){if(Date.now()-this.pausedTime>this.pauseInterval)return this.lightSource=-.6,this.cycleAnimation(),this.paused=!1,this.animateSlide()}else this.lightSource+=n,this.lightSource>1+this.lightSpread&&(this.paused=!0,this.pausedTime=Date.now());i=(0,ke.Z)(this.lightSource,0,1),e=(0,ke.Z)(this.lightSource-this.lightSpread,0,1),t=(0,ke.Z)(this.lightSource+this.lightSpread,0,1);const a=Q.Z.getProperty("background-color-true"),o=Q.Z.getProperty("surface-color");return s.addColorStop(e,a),s.addColorStop(i,o),s.addColorStop(t,a),s}settings(e={}){var t,i,s,n,a,o;this.canvas=null!==(t=e.canvas)&&void 0!==t?t:document.createElement("canvas"),this.ctx=this.canvas.getContext("2d"),this.font=null!==(i=e.font)&&void 0!==i?i:this.font,this.lightSpread=null!==(s=e.lightSpread)&&void 0!==s?s:this.lightSpread,this.inc=null!==(n=e.inc)&&void 0!==n?n:this.inc,this.animations=null!==(a=e.animations)&&void 0!==a?a:this.animations,this.text=null!==(o=e.text)&&void 0!==o?o:this.text,this.fillStyle=e.fillStyle,this.canvas.classList.add("shimmer-canvas")}on(){const{width:e,height:t}=this.canvas;this.keepTime(),this.ctx.clearRect(0,0,e,t),this.font&&(this.ctx.font=this.font),this.ctx.fillStyle=this.animate(),this.ctx.fillRect(0,0,e,t),this.fillStyle&&(this.ctx.fillStyle=this.fillStyle,this.ctx.fillRect(0,0,e,t)),this.text&&this.ctx.fillText(this.text,50,50)}}class Ae{constructor(e={}){var t,i,s;this.onThemeChange=()=>{this.stopAnimation(),this.startAnimation()},this.onResize=()=>{const{canvas:e}=this,{width:t,height:i,dpr:s}=e;this.updateCanvasSize(),e.width===t&&e.height===i&&e.dpr===s||(this.stopAnimation(),this.startAnimation())},this.shimmer=new xe,this.tempId=0,this.canvas=document.createElement("canvas"),this.canvas.classList.add("dialogs-placeholder-canvas"),this.ctx=this.canvas.getContext("2d"),this.generatedValues=[],this.avatarSize=null!==(t=e.avatarSize)&&void 0!==t?t:54,this.marginVertical=null!==(i=e.marginVertical)&&void 0!==i?i:9,this.totalHeight=null!==(s=e.totalHeight)&&void 0!==s?s:this.avatarSize+2*this.marginVertical,this.lineHeight=10,this.lineBorderRadius=6,this.lineMarginVertical=8,this.statusWidth=24}attach({container:e,rect:t,getRectFrom:i,onRemove:s,blockScrollable:n}){const{canvas:a}=this;this.onRemove=s,this.getRectFrom="function"==typeof i?i:(i||e).getBoundingClientRect.bind(i||e),(this.blockScrollable=n)&&(n.container.style.overflowY="hidden"),this.updateCanvasSize(t),this.startAnimation(),e.append(a)}detach(e){this.detachTime||(this.availableLength=e,this.detachTime=Date.now(),n.Z.settings.animationsEnabled||this.remove())}remove(){var e;this.stopAnimation(),this.canvas.parentElement&&(this.canvas.remove(),this.blockScrollable&&(this.blockScrollable.container.style.overflowY="",this.blockScrollable=void 0)),null===(e=this.onRemove)||void 0===e||e.call(this),this.onRemove=void 0}updateCanvasSize(e=this.getRectFrom()){const{canvas:t}=this,i=t.dpr=window.devicePixelRatio;t.width=e.width*i,t.height=e.height*i,t.style.width=e.width+"px",t.style.height=e.height+"px"}renderDetachAnimationFrame(){const{canvas:e,ctx:t,detachTime:i,length:s,availableLength:a}=this;if(!i)return;if(!n.Z.settings.animationsEnabled)return void this.remove();const{width:o}=e;t.globalCompositeOperation="destination-out";const r=Date.now()-i;let d=!0;for(let e=0;e=a?15*(a-1):15*e);if(i<=0){d=!1;continue}const n=X(i,0,1,150);t.beginPath(),t.rect(0,this.dialogHeight*e,o,this.dialogHeight),t.fillStyle=`rgba(0, 0, 0, ${n})`,t.fill(),n<1&&(d=!1)}t.globalCompositeOperation="source-over",d&&this.remove()}renderFrame(){this.shimmer.on(),this.renderDetachAnimationFrame()}startAnimation(){const{canvas:e,shimmer:t}=this,i=++this.tempId,s=this.createPattern();t.settings({canvas:e,fillStyle:s});const a=()=>this.tempId===i;this.renderFrame(),(0,Y.jt)((()=>!!a()&&(n.Z.settings.animationsEnabled&&this.renderFrame(),a()))),n.Z.addEventListener("theme_change",this.onThemeChange),J.Z.addEventListener("resize",this.onResize)}stopAnimation(){++this.tempId,n.Z.removeEventListener("theme_change",this.onThemeChange),J.Z.removeEventListener("resize",this.onResize)}createPattern(){const{canvas:e,ctx:t}=this,i=document.createElement("canvas"),s=i.getContext("2d"),n=e.dpr;i.dpr=n,i.width=e.width,i.height=e.height,s.fillStyle=Q.Z.getProperty("surface-color"),s.fillRect(0,0,i.width,i.height),s.fillStyle="#000",s.globalCompositeOperation="destination-out";const a=this.dialogHeight=this.totalHeight*n,o=this.length=Math.ceil(e.height/a);for(let e=0;e{})).finally((()=>{e[t]===s&&delete e[t]}));const n=(0,Ee.Z)((()=>e[t]===s));return{deferred:s,middleware:n}}class it extends $.Z{constructor(e){super({getIndex:e=>{var t;return this.managers.dialogsStorage.getDialogIndex(null!==(t=this.forumPeerId)&&void 0!==t?t:e.id,this.indexKey,this.forumPeerId?e.id:void 0)},onDelete:e=>{var t;e.dom.listEl.remove(),null===(t=this.onListLengthChange)||void 0===t||t.call(this)},onSort:(e,t)=>{var i;const s=e.dom.listEl.parentElement!==this.list;(0,x.Z)(e.dom.listEl,this.list,t),s&&(null===(i=this.onListLengthChange)||void 0===i||i.call(this))},onElementCreate:e=>Je(this,void 0,void 0,(function*(){var t;const i=[],s=ct.addListDialog({peerId:null!==(t=this.forumPeerId)&&void 0!==t?t:e.id,loadPromises:i,isBatch:!0,threadId:this.forumPeerId?e.id:void 0,isMainList:"index_0"===this.indexKey});return e.dom=s.dom,e.dialogElement=s,yield Promise.all(i),e})),updateElementWith:z.TR,log:e.log}),(0,je.Z)(this,e)}clear(){this.list.replaceChildren(),super.clear()}}class st extends Ue.ZP{constructor({peerId:e,rippleEnabled:t=!0,onlyFirstName:i=!1,meAsSaved:n=!0,avatarSize:a="bigger",autonomous:o,loadPromises:r,fromName:d,noIcons:l,threadId:c,wrapOptions:h={},isMainList:u}){var p;super({clickable:!0,noRipple:!t,havePadding:!c,title:!0,titleRightSecondary:!0,subtitle:!0,subtitleRight:!0,noWrap:!0,asLink:!0}),this.subtitleRight.remove();const f=c?void 0:new s.Z;if(f){const t={bigger:54,abitbigger:42,small:32}[a];f.classList.add("dialog-avatar","avatar-"+t),f.updateWithOptions({loadPromises:r,lazyLoadQueue:h.lazyLoadQueue,isDialog:!!n,peerId:e,peerTitle:d}),this.applyMediaElement(f,a)}const m=this.container,g=this.title;g.classList.add("user-title"),this.titleRow.classList.add("dialog-title");const v=new I.Z,b=v.update({peerId:e,fromName:d,dialog:n,onlyFirstName:i,withIcons:!l,threadId:c});null==r||r.push(b),g.append(v.element),g.classList.add("tgico");const y=this.subtitle,w=this.container;w.classList.add("chatlist-chat","chatlist-chat-"+a),o||(w.href="#"+e),"bigger"===a?this.container.classList.add("row-big"):"small"===a&&this.container.classList.add("row-small"),w.dataset.peerId=""+e,c&&(w.dataset.threadId=""+c);const C=document.createElement("span");C.classList.add("message-status","sending-status");const L=document.createElement("span");L.classList.add("message-time");const E=this.titleRight;E.classList.add("dialog-title-details"),E.append(C,L),this.subtitleRow.classList.add("dialog-subtitle");const M=this.dom={avatarEl:f,captionDiv:m,titleSpan:v.element,titleSpanContainer:g,statusSpan:C,lastTimeSpan:L,lastMessageSpan:y,containerEl:w,listEl:w,subtitleEl:this.subtitleRow};if(!o){w.dialogDom=M;const t=S.ZP.chat;t&&S.ZP.isSamePeer(t,{peerId:e,threadId:c,type:"chat"})&&ct.setDialogActive(w,!0),u&&(null===(p=ct.forumTab)||void 0===p?void 0:p.peerId)===e&&!c&&w.classList.add("is-forum-open")}}createUnreadBadge(){if(this.dom.unreadBadge)return;const e=this.dom.unreadBadge=document.createElement("div");e.className="dialog-subtitle-badge badge badge-22",this.dom.subtitleEl.append(e)}createUnreadAvatarBadge(){if(this.dom.unreadAvatarBadge)return;const e=this.dom.unreadAvatarBadge=document.createElement("div");e.className="dialog-subtitle-badge badge badge-22 avatar-badge",this.dom.listEl.append(e)}createMentionsBadge(){if(this.dom.mentionsBadge)return;const e=this.dom.mentionsBadge=document.createElement("div");e.className="dialog-subtitle-badge badge badge-22 mention mention-badge",e.innerText="@",this.dom.lastMessageSpan.after(e)}toggleBadgeByKey(e,t,i,s){(0,L.Z)({element:this.dom[e],className:"is-visible",forwards:t,duration:s?0:250,onTransitionEnd:t?void 0:()=>{this.dom[e].remove(),delete this.dom[e]},useRafs:i&&(0,W.Z)(this.dom[e])?0:2})}}class nt extends ze.h{toggle(e){return Je(this,void 0,void 0,(function*(){this.init2&&(yield this.init2()),(0,L.Z)({element:this.container,className:"is-visible",forwards:e,duration:300,onTransitionEnd:e?void 0:()=>{this.onCloseAfterTimeout()},useRafs:this.firstTime?(this.firstTime=void 0,2):void 0})}))}init(e){(0,je.Z)(this,e),this.log=(0,w.kg)("FORUM"),this.firstTime=!0,this.container.classList.add("topics-container");const t=!this.slider;t&&(this.closeBtn.classList.replace("tgico-left","tgico-close"),this.container.classList.add("active","is-floating"),(0,k.fc)(this.closeBtn,(()=>{ct.toggleForumTab(void 0,this)}),{listenerSetter:this.listenerSetter})),this.rows=document.createElement("div"),this.rows.classList.add("sidebar-header__rows"),this.subtitle=document.createElement("div"),this.subtitle.classList.add("sidebar-header__subtitle"),this.title.replaceWith(this.rows),this.rows.append(this.title,this.subtitle);const i=ct.createChatList();ct.setListClickListener(i,null,!0),this.scrollable.append(i),this.xd=new rt(this.peerId,t?80:0),this.xd.scrollable=this.scrollable,this.xd.sortedList=new it({managers:this.managers,log:this.log,list:i,indexKey:"index_0",forumPeerId:this.peerId}),this.xd.bindScrollable();const s=()=>({peerId:this.peerId,type:"chat"}),a=(0,Ve.Z)({listenerSetter:this.listenerSetter,direction:"bottom-left",buttons:[{icon:"info",text:"ForumTopic.Context.Info",onClick:()=>Je(this,void 0,void 0,(function*(){const e=T.ZP.createTab($e.Z,!0);e.isFirst=!0,e.setPeer(this.peerId),(yield e.fillProfileElements())(),e.loadSidebarMedia(!0),e.open()}))},{icon:"message",text:"ForumTopic.Context.ShowAsMessages",onClick:()=>{const e=S.ZP.chat;S.ZP[(null==e?void 0:e.peerId)===this.peerId?"setPeer":"setInnerPeer"](s())},verify:()=>{const e=S.ZP.chat;return!e||!S.ZP.isSamePeer(e,s())}},{icon:"adduser",text:"ForumTopic.Context.AddMember",onClick:()=>{},verify:()=>!1},{icon:"add",text:"ForumTopic.Context.New",onClick:()=>{T.ZP.createTab(Qe.Z).open(this.peerId)},separator:!0,verify:()=>this.managers.appChatsManager.hasRights(this.peerId.toChatId(),"manage_topics")}]});if(this.listenerSetter.add(n.Z)("history_reload",(e=>{this.peerId===e&&this.xd.fullReset()})),this.listenerSetter.add(n.Z)("chat_update",(e=>Je(this,void 0,void 0,(function*(){this.peerId===e.toPeerId(!0)&&((yield this.managers.appChatsManager.getChat(e)).pFlags.forum||ct.toggleForumTab(void 0,this))})))),G.Z&&(0,V.Z)({element:this.container,onSwipe:()=>{ct.toggleForumTab(void 0,this)},middleware:this.middlewareHelper.get()}),this.header.append(a),!t)return this.init2()}init2(){return Je(this,void 0,void 0,(function*(){this.init2=void 0;const e=this.middlewareHelper.get(),t=this.peerId;this.managers.apiUpdatesManager.subscribeToChannelUpdates(this.peerId.toChatId()),e.onDestroy((()=>{this.managers.apiUpdatesManager.unsubscribeFromChannelUpdates(this.peerId.toChatId())}));const i=(0,Le.Z)({peerId:t,dialog:!0,wrapOptions:{middleware:e}}),s=S.ZP.setPeerStatus({peerId:t,element:this.subtitle,needClear:!0,useWhitespace:!1,middleware:e,noTyping:!0});return Promise.all([i,s,this.xd.onChatsScroll().then((e=>e.cached?e.renderPromise:void 0))]).then((([t,i,s])=>{e()&&(this.title.append(t),null==i||i())}))}))}onCloseAfterTimeout(){super.onCloseAfterTimeout(),this.xd.destroy()}}const at=new Error("not implemented");class ot{constructor(){this.onChatsRegularScroll=()=>{this.sliceTimeout&&clearTimeout(this.sliceTimeout),this.sliceTimeout=window.setTimeout((()=>{this.sliceTimeout=void 0,this.sortedList.list.childElementCount&&!ct.processContact&&(0,z.TR)((()=>{const e=performance.now(),t=this.scrollable.scrollTop,i=this.sortedList.list.firstElementChild,s=this.scrollable.container.getBoundingClientRect(),n=i.getBoundingClientRect(),a=Array.from(this.scrollable.splitUp.children);let o=this.scrollable.splitUp.offsetTop;o&&t{this.deleteDialogByKey(this.getDialogKeyFromElement(e))})),this.setOffsets();const b=c.offsetTop-u;this.scrollable.scrollTop=this.scrollable.lastScrollPosition=b,this.log("slice time",performance.now()-e,this.indexKey,b)}))}),200)},this.log=(0,w.kg)("CL"),this.offsets={top:0,bottom:0},this.managers=n.Z.managers,this.listenerSetter=new Ge.Z}getOffsetIndex(e){return{index:this.scrollable.loadedAll[e]?0:this.offsets[e]}}isDialogMustBeInViewport(e){const t=this.getOffsetIndex("top"),i=this.getOffsetIndex("bottom");if(!t.index&&!i.index)return!0;const s=(0,Se.Z)(e,this.indexKey);return(!t.index||s<=t.index)&&(!i.index||s>=i.index)}setIndexKey(e){this.indexKey=e,this.sortedList.indexKey=e}deleteDialogByKey(e){this.sortedList.delete(e)}deleteDialog(e){return this.deleteDialogByKey(this.getDialogKey(e))}updateDialog(e){const t=this.getDialogKey(e);if(!this.isDialogMustBeInViewport(e))return void this.deleteDialog(e);if(!this.sortedList.has(t)&&this.loadedDialogsAtLeastOnce)return void this.sortedList.add(t);const i=this.getDialogElement(t);i&&(ct.setLastMessageN({dialog:e,dialogElement:i,setUnread:!0}),this.sortedList.update(t))}onChatsScrollTop(){return this.onChatsScroll("top")}onChatsScroll(e="bottom"){return this.loadDialogs(e)}createPlaceholder(){const e=this.placeholder=new Ae(this.placeholderOptions),t=this.getRectFromForPlaceholder();return e.attach({container:this.sortedList.list.parentElement,getRectFrom:t,onRemove:()=>{this.placeholder===e&&(this.placeholder=void 0)},blockScrollable:this.scrollable}),e}loadDialogs(e){const t=this.log.bindPrefix("load-"+(i=1e3,s=9999,i=Math.ceil(i),s=Math.floor(s),Math.floor(Math.random()*(s-i+1))+i));var i,s;if(t("try",e),this.loadDialogsPromise||this.loadDialogsRenderPromise)return this.loadDialogsPromise;if(this.scrollable.loadedAll[e])return Promise.resolve({cached:!0,renderPromise:Promise.resolve()});t.warn("start",e);const n=(0,Oe.Z)("MIDDLEWARE"),a=(0,Ce.Z)(),o=new Promise(((i,s)=>Je(this,void 0,void 0,(function*(){const r=this.sortedList.list;let d=this.placeholder;try{const i=this.loadDialogsInner(e),s=yield i;if(!r.childElementCount&&!d&&(!this.loadedDialogsAtLeastOnce&&this.needPlaceholderAtFirstTime||!s.cached)){if(this.loadDialogsRenderPromise!==o)throw n;d=this.createPlaceholder(),a.resolve(!1)}const l=yield s.result;if(this.loadDialogsRenderPromise!==o)throw n;a.resolve(s.cached),"bottom"===e?l.isEnd&&(this.scrollable.loadedAll[e]=!0):l.isTopEnd&&(this.scrollable.loadedAll[e]=!0);const c=l.dialogs.length;if(t(`will render ${c} dialogs`),c){const t=("top"===e?l.dialogs.slice().reverse():l.dialogs).map((e=>this.sortedList.add(this.getDialogKey(e))));if(yield Promise.all(t).catch(),this.loadDialogsRenderPromise!==o)throw n}const h=l.dialogs["top"===e?0:c-1];h&&(this.offsets[e]=(0,Se.Z)(h,this.indexKey)),this.loadedDialogsAtLeastOnce=!0,ct.onListLengthChange(),t("getDialogs",l,r.childElementCount),setTimeout((()=>{this.scrollable.onScroll()}),0),d&&d.detach(r.childElementCount)}catch(e){return"MIDDLEWARE"!==(null==e?void 0:e.type)&&t.error(e),s(e),void a.reject(e)}i()})))).finally((()=>{this.loadDialogsRenderPromise===o?(t("end"),this.loadDialogsRenderPromise=void 0):t("has been cleared")}));this.loadDialogsRenderPromise=o;const r=this.loadDialogsPromise=a.then((e=>({cached:e,renderPromise:o}))).finally((()=>{this.loadDialogsPromise===r&&(this.loadDialogsPromise=void 0)}));return r}setOffsets(){return Je(this,void 0,void 0,(function*(){const e=this.sortedList.list,[t,i]=yield Promise.all([this.getDialogFromElement(e.firstElementChild),this.getDialogFromElement(e.lastElementChild)]),{indexKey:s}=this;this.offsets.top=(0,Se.Z)(t,s),this.offsets.bottom=(0,Se.Z)(i,s)}))}getDialogKey(e){throw at}getDialogKeyFromElement(e){throw at}getRectFromForPlaceholder(){throw at}getDialogFromElement(e){throw at}loadDialogsInner(e){throw at}setTyping(e){return Je(this,void 0,void 0,(function*(){const t=this.getDialogKey(e),i=this.getDialogDom(t);if(!i)return;const s=i.lastMessageSpan.querySelector(".peer-typing-container"),n=yield S.ZP.getPeerTyping(e.peerId,s,"forumTopic"===e._?e.id:void 0);!s&&n&&((0,A.Z)(i.lastMessageSpan,n),i.lastMessageSpan.classList.add("user-typing"))}))}unsetTyping(e){const t=this.getDialogKey(e),i=this.getDialogElement(t);i&&(i.dom.lastMessageSpan.classList.remove("user-typing"),ct.setLastMessageN({dialog:e,lastMessage:null,dialogElement:i,setUnread:null}))}getDialogDom(e){const t=this.sortedList.get(e);return null==t?void 0:t.dom}getDialogElement(e){const t=this.sortedList.get(e);return null==t?void 0:t.dialogElement}bindScrollable(){this.scrollable.container.addEventListener("scroll",this.onChatsRegularScroll),this.scrollable.onScrolledTop=this.onChatsScrollTop.bind(this),this.scrollable.onScrolledBottom=this.onChatsScroll.bind(this),this.scrollable.setVirtualContainer(this.sortedList.list)}clear(){var e;this.sortedList.clear(),null===(e=this.placeholder)||void 0===e||e.remove()}reset(){this.scrollable.loadedAll.top=!0,this.scrollable.loadedAll.bottom=!1,this.offsets.top=this.offsets.bottom=0,this.loadDialogsRenderPromise=void 0,this.loadDialogsPromise=void 0}fullReset(){return this.reset(),this.clear(),this.onChatsScroll()}destroy(){this.clear(),this.scrollable.destroy(),this.listenerSetter.removeAll()}}class rt extends ot{constructor(e,t){super(),this.peerId=e,this.paddingX=t,this.placeholderOptions={avatarSize:0,marginVertical:5,totalHeight:64},this.listenerSetter.add(n.Z)("peer_typings",(({peerId:e,threadId:t,typings:i})=>Je(this,void 0,void 0,(function*(){if(!t||this.peerId!==e)return;const s=yield this.managers.dialogsStorage.getForumTopic(e,t);s&&(i.length?this.setTyping(s):this.unsetTyping(s))})))),this.listenerSetter.add(n.Z)("dialogs_multiupdate",(e=>{for(const[t,{dialog:i,topics:s}]of e)t===this.peerId&&(null==s?void 0:s.size)&&s.forEach((e=>{this.updateDialog(e)}))})),this.listenerSetter.add(n.Z)("dialog_unread",(({dialog:e})=>{"forumTopic"===(null==e?void 0:e._)&&e.peerId===this.peerId&&ct.setUnreadMessagesN({dialog:e,dialogElement:this.getDialogElement(this.getDialogKey(e))})})),this.listenerSetter.add(n.Z)("dialog_notify_settings",(e=>Je(this,void 0,void 0,(function*(){if(e.peerId===this.peerId)if("dialog"!==e._)ct.setUnreadMessagesN({dialog:e,dialogElement:this.getDialogElement(this.getDialogKey(e))});else{const e=[...this.sortedList.getAll().entries()],t=e.map((([e])=>this.managers.dialogsStorage.getForumTopic(this.peerId,e))),i=yield Promise.all(t);e.forEach((([e,t],s)=>{ct.setUnreadMessagesN({dialog:i[s],dialogElement:t.dialogElement})}))}})))),this.listenerSetter.add(n.Z)("dialog_drop",(e=>{"forumTopic"===e._&&e.peerId===this.peerId&&this.deleteDialogByKey(this.getDialogKey(e))})),this.listenerSetter.add(n.Z)("dialog_draft",(({dialog:e,drop:t,peerId:i})=>{"forumTopic"===e._&&e.peerId===this.peerId&&(t?this.deleteDialog(e):this.updateDialog(e))}))}isDialogMustBeInViewport(e){return!e.pFlags.hidden&&super.isDialogMustBeInViewport(e)}getDialogKey(e){return e.id}getDialogKeyFromElement(e){return+e.dataset.threadId}getRectFromForPlaceholder(){return()=>{const e=T.ZP.rect;return{top:56,right:e.right,bottom:0,left:this.paddingX,width:e.width-this.paddingX,height:e.height-56}}}getDialogFromElement(e){return this.managers.dialogsStorage.getForumTopic(+e.dataset.peerId,+e.dataset.threadId)}loadDialogsInner(e){return Je(this,void 0,void 0,(function*(){const{indexKey:t}=this;let i=K.Z.height/64*1.25|0,s=0;const n=this.peerId,{index:a}=this.getOffsetIndex(e);if(s=a,a)if("top"===e){const e=yield this.managers.dialogsStorage.getFolderDialogs(n,!0),o=e.findIndex((e=>(0,Se.Z)(e,t)<=a)),r=Math.max(0,o-i);i=o-r,s=(0,Se.Z)(e[r],t)+1}else s=a;return this.managers.acknowledged.dialogsStorage.getDialogs({offsetIndex:s,limit:i,filterId:n,skipMigrated:!0})}))}}class dt extends ot{constructor(e){super(),this.filterId=e,this.needPlaceholderAtFirstTime=!0,this.listenerSetter.add(n.Z)("peer_typings",(({peerId:e,typings:t})=>Je(this,void 0,void 0,(function*(){const[i,s]=yield Promise.all([this.managers.appMessagesManager.getDialogOnly(e),this.managers.appPeersManager.isForum(e)]);i&&!s&&(t.length?this.setTyping(i):this.unsetTyping(i))})))),this.listenerSetter.add(n.Z)("user_update",(e=>Je(this,void 0,void 0,(function*(){if(!this.isActive)return;const t=e.toPeerId(),i=this.getDialogDom(t);if(!i)return;const s=yield this.managers.appUsersManager.getUserStatus(e),n="userStatusOnline"===(null==s?void 0:s._);this.setOnlineStatus(i.avatarEl,n)})))),this.listenerSetter.add(n.Z)("chat_update",(e=>Je(this,void 0,void 0,(function*(){const t=e.toPeerId(!0);this.processDialogForCallStatus(t)})))),this.listenerSetter.add(n.Z)("dialog_flush",(({dialog:e})=>{this.isActive&&e&&(ct.setLastMessageN({dialog:e,setUnread:!0}),this.validateDialogForFilter(e))})),this.listenerSetter.add(n.Z)("dialogs_multiupdate",(e=>{var t;if(this.isActive)for(const[i,{dialog:s,topics:n}]of e)"dialog"===(null==s?void 0:s._)&&(this.updateDialog(s),null===(t=ct.processContact)||void 0===t||t.call(ct,i.toPeerId()),this.validateDialogForFilter(s))})),this.listenerSetter.add(n.Z)("dialog_drop",(e=>{var t;this.isActive&&"dialog"===e._&&(this.deleteDialogByKey(e.peerId),null===(t=ct.processContact)||void 0===t||t.call(ct,e.peerId))})),this.listenerSetter.add(n.Z)("dialog_unread",(({dialog:e})=>{this.isActive&&"dialog"===(null==e?void 0:e._)&&(ct.setUnreadMessagesN({dialog:e,dialogElement:this.getDialogElement(this.getDialogKey(e))}),this.validateDialogForFilter(e))})),this.listenerSetter.add(n.Z)("dialog_notify_settings",(e=>{this.isActive&&"forumTopic"!==e._&&(this.validateDialogForFilter(e),ct.setUnreadMessagesN({dialog:e,dialogElement:this.getDialogElement(this.getDialogKey(e))}))})),this.listenerSetter.add(n.Z)("dialog_draft",(({dialog:e,drop:t,peerId:i})=>{var s;this.isActive&&"forumTopic"!==e._&&(t?this.deleteDialog(e):this.updateDialog(e),null===(s=ct.processContact)||void 0===s||s.call(ct,i))})),this.listenerSetter.add(n.Z)("filter_update",(e=>Je(this,void 0,void 0,(function*(){if(this.isActive&&e.id===this.filterId&&!c.DZ.has(e.id)){const e=yield this.managers.dialogsStorage.getCachedDialogs(!0);yield this.validateListForFilter();for(let t=0,i=e.length;t(0,Se.Z)(e,i)<=o)),r=Math.max(0,a-s);s=a-r,n=(0,Se.Z)(e[r],i)+1}else n=o;const r=this.managers.acknowledged.dialogsStorage.getDialogs({offsetIndex:n,limit:s,filterId:t,skipMigrated:!0}),d=yield r;return a&&(d.result=Promise.reject((0,Oe.Z)("MIDDLEWARE"))),d}))}setOnlineStatus(e,t){const i="is-online",s=e.classList.contains(i);!s&&t&&e.classList.add(i),(0,L.Z)({element:e,className:"is-visible",forwards:t,duration:250,onTransitionEnd:t?void 0:()=>{e.classList.remove(i)},useRafs:t&&!s?2:0})}generateScrollable(e,t){const i=t.id,s=new v.ZP(null,"CL",500);s.container.dataset.filterId=""+i;const a=(0,ye.Z)(t.localId),o=new it({managers:n.Z.managers,log:this.log,list:e,indexKey:a,onListLengthChange:ct.onListLengthChange});return this.scrollable=s,this.sortedList=o,this.setIndexKey(a),this.bindScrollable(),s}testDialogForFilter(e){return c.DZ.has(this.filterId)?this.filterId===e.folder_id:void 0!==(0,Se.Z)(e,this.indexKey)}isDialogMustBeInViewport(e){return!(void 0!==e.migratedTo||!this.testDialogForFilter(e))&&super.isDialogMustBeInViewport(e)}validateListForFilter(){return Je(this,void 0,void 0,(function*(){this.sortedList.getAll().forEach((e=>Je(this,void 0,void 0,(function*(){const t=yield n.Z.managers.appMessagesManager.getDialogOnly(e.id);this.testDialogForFilter(t)||this.deleteDialog(t)}))))}))}validateDialogForFilter(e){this.getDialogElement(e.peerId)&&(this.testDialogForFilter(e)||this.deleteDialog(e))}setCallStatus(e,t){let{callIcon:i,listEl:s}=e;if(!i&&t){const{canvas:t,startAnimation:n}=e.callIcon=i=function(e=!1){const t=document.createElement("canvas");t.width=t.height=ie;const i=t.getContext("2d"),s=(ie-(3*ne+2*se))/2,n=Date.now();let a=!1;const o=()=>{if(t.isConnected)a||(a=t.isConnected);else if(a)return!1;const o=X((Date.now()-n)%1e3,0,1,1e3);i.clearRect(0,0,ie,ie),i.fillStyle=e&&!J.Z.isMobile?Q.Z.getProperty("primary-color"):"#fff";for(let e=0;e<3;++e){let t;t=o>=.5?e%2?2-2*o:2*(o-.5):e%2?2*o:1-2*o;let n=4+8*t;n*=te,ee(i,s+e*ne+e*se,(ie-n)/2,ne,n,ae,!0)}return!0};return{canvas:t,startAnimation:()=>{(0,Y.jt)(o),o()},setActive:t=>{e=t,o()}}}(s.classList.contains("active"));t.classList.add("dialog-group-call-icon"),s.append(t),n()}i&&(0,L.Z)({element:e.callIcon.canvas,className:"is-visible",forwards:t,duration:250,onTransitionEnd:t?void 0:()=>{e.callIcon.canvas.remove(),e.callIcon=void 0},useRafs:t?2:0})}processDialogForCallStatus(e,t){return Je(this,void 0,void 0,(function*(){if(!oe.Z)return;if(t||(t=this.getDialogDom(e)),!t)return;const i=yield n.Z.managers.appChatsManager.getChat(e.toChatId());this.setCallStatus(t,!(!i.pFlags.call_active||!i.pFlags.call_not_empty))}))}onChatsScroll(e="bottom"){var t;return this.scrollable.loadedAll[e]&&(null===(t=ct.loadContacts)||void 0===t||t.call(ct)),this.log("onChatsScroll",e),super.onChatsScroll(e)}toggleAvatarUnreadBadges(e,t){if(!e)return void this.sortedList.getAll().forEach((e=>{const{dom:t,dialogElement:i}=e;t.unreadAvatarBadge&&i.toggleBadgeByKey("unreadAvatarBadge",!1,!1,!1)}));const i=["unread","mention"];this.sortedList.getAll().forEach((e=>{var t;const{dom:s,dialogElement:n}=e,a=null===(t=s.unreadBadge)||void 0===t?void 0:t.textContent;if(!a||s.unreadBadge.classList.contains("backwards"))return;const o=!!s.unreadAvatarBadge;n.createUnreadAvatarBadge(),n.toggleBadgeByKey("unreadAvatarBadge",!0,o),s.unreadAvatarBadge.textContent=a;const r=s.unreadAvatarBadge.classList,d=s.unreadBadge.classList;i.forEach((e=>{r.toggle(e,d.contains(e))}))}))}getDialogKey(e){return e.peerId}getDialogKeyFromElement(e){return+e.dataset.peerId}getDialogFromElement(e){return n.Z.managers.appMessagesManager.getDialogOnly(e.dataset.peerId.toPeerId())}}class lt{constructor(){this.chatsContainer=document.getElementById("chatlist-container"),this.log=(0,w.kg)("DIALOGS",w.v9.Log|w.v9.Error|w.v9.Warn|w.v9.Debug),this.folders={menu:document.getElementById("folders-tabs"),menuScrollContainer:null,container:document.getElementById("folders-container")},this.filtersRendered={},this.lastActiveElements=new Set,this.initedListeners=!1,this.xds={},this.onTabChange=()=>(this.xd=this.xds[this.filterId],this.xd.reset(),this.xd.onChatsScroll()),this._onListLengthChange=()=>{if(!this.xd.loadedDialogsAtLeastOnce)return;if(this.checkIfPlaceholderNeeded(),this.filterId!==c.J$)return;const e=this.chatList,t=e.childElementCount,i=e.parentElement.parentElement,s=e.parentElement.nextElementSibling,n=!!s.childElementCount;if(t>=10)return void(n&&this.removeContactsPlaceholder());if(n)return;i.classList.add("with-contacts");const a=new He.Z({name:"Contacts",noDelimiter:!0,fakeGradientDelimiter:!0});a.container.classList.add("hide"),this.managers.appUsersManager.getContactsPeerIds(void 0,void 0,"online").then((e=>{let t=!1;const i=()=>{t&&a.container.classList.toggle("hide",!s.list.childElementCount),this.updateContactsLength(!0)},s=new j.Z({avatarSize:"abitbigger",createChatListOptions:{dialogSize:48,new:!0},autonomous:!1,onListLengthChange:i,managers:this.managers});this.loadContacts=()=>{const t=K.Z.height/60|0;(0,De.Z)(e.splice(0,t),this.verifyPeerIdForContacts).then((e=>{e.forEach((e=>{s.add(e)}))})),e.length||(this.loadContacts=void 0)},this.loadContacts(),this.processContact=e=>Je(this,void 0,void 0,(function*(){if(e.isAnyChat())return;const t=yield this.verifyPeerIdForContacts(e),i=s.has(e);!i&&t?s.add(e):i&&!t&&s.delete(e)}));const n=s.list;n.classList.add("chatlist-new"),this.setListClickListener(n),a.content.append(n),t=!0,i()})),s.append(a.container)},this.verifyPeerIdForContacts=e=>Je(this,void 0,void 0,(function*(){const[t,i]=yield Promise.all([this.managers.appPeersManager.isContact(e),this.managers.appMessagesManager.getDialogOnly(e)]);return t&&!i}))}start(){const e=this.managers=(0,we.Z)();this.contextMenu=new f(e),this.stateMiddlewareHelper=(0,Ne.k)(),this.folders.menuScrollContainer=this.folders.menu.parentElement,this.onListLengthChange=(0,q.Z)(this._onListLengthChange,100,!1,!0);const t=document.createElement("div");t.classList.add("connection-status-bottom"),t.append(this.folders.container),this.forumsTabs=new Map,this.forumsSlider=document.createElement("div"),this.forumsSlider.classList.add("topics-slider"),this.chatsContainer.parentElement.parentElement.append(this.forumsSlider),G.Z&&(0,V.Z)({element:this.folders.container,onSwipe:e=>{const t=s.prevId();s(e<0?t+1:t-1)},verifyTouchTarget:()=>!this.forumTab}),this.allChatsIntlElement=new o.ZP.IntlElement({key:"FilterAllChatsShort"}),n.Z.addEventListener("premium_toggle",(e=>Je(this,void 0,void 0,(function*(){e||(yield this.managers.filtersStorage.isFilterIdAvailable(this.filterId))||s((0,Be.Z)(this.filtersRendered[c.J$].menu),!1)})))),n.Z.addEventListener("state_cleared",(()=>{const e=c.DZ.has(this.filterId);Fe.Z.getState().then((t=>Je(this,void 0,void 0,(function*(){this.xd.loadedDialogsAtLeastOnce=!1,this.showFiltersPromise=void 0,e&&(this.xd.clear(),this.onTabChange()),this.onStateLoaded(t)}))))})),this.setFilterId(c.J$,c.J$),this.addFilter({id:c.J$,title:"",localId:c.J$});const i=new v.v7(this.folders.menuScrollContainer);t.prepend(this.folders.menuScrollContainer);const s=this.selectTab=(0,m.X)(this.folders.menu,this.folders.container,((e,t)=>Je(this,void 0,void 0,(function*(){const i=e;if(e=+t.dataset.filterId||c.J$,-1!==this.filterId&&!c.DZ.has(e)&&!(yield this.managers.filtersStorage.isFilterIdAvailable(e)))return!1;const n=this.filterId;if(y.IS_MOBILE_SAFARI||(i?this.filtersNavigationItem||(this.filtersNavigationItem={type:"filters",onPop:()=>{s(0),this.filtersNavigationItem=void 0}},re.Z.spliceItems(1,0,this.filtersNavigationItem)):this.filtersNavigationItem&&(re.Z.removeItem(this.filtersNavigationItem),this.filtersNavigationItem=void 0)),n===e)return;this.xds[e].clear();const a=this.setFilterIdAndChangeTab(e).then((({cached:e,renderPromise:t})=>{if(e)return t}));return-1!==n?a:void 0}))),(()=>{for(const e in this.xds)+e!==this.filterId&&this.xds[e].clear()}),void 0,i);Fe.Z.getState().then((e=>(de.Z.setPlaybackParams(e.playbackParams),de.Z.addEventListener("playbackParams",(e=>{this.managers.appStateManager.pushToState("playbackParams",e)})),this.onStateLoaded(e)))),J.Z.addEventListener("resize",(()=>{this.changeFiltersAllChatsKey()})),new O(this.managers,this.chatsContainer),this.chatsContainer.append(t),setTimeout((()=>{M.Z.loadLottieWorkers()}),200),he.Z.MANAGERS=n.Z.managers=e,Ie.Z.construct(e),T.ZP.construct(e),ce.ZP.construct(e),Me.ZP.construct(e),Pe.Z.construct(e),S.ZP.construct(e),this.xd=this.xds[this.filterId]}get chatList(){return this.xd.sortedList.list}setFilterId(e,t){this.filterId=e}setFilterIdAndChangeTab(e){return Je(this,void 0,void 0,(function*(){return this.filterId=e,this.onTabChange()}))}initListeners(){n.Z.addEventListener("dialog_flush",(({dialog:e})=>{e&&this.setFiltersUnreadCount()})),n.Z.addEventListener("folder_unread",(e=>Je(this,void 0,void 0,(function*(){if(e.id<0){const t=this.xd.getDialogElement(e.id);if(!t)return;this.setUnreadMessagesN({dialog:yield this.managers.dialogsStorage.getDialogOnly(e.id),dialogElement:t})}else this.setFilterUnreadCount(e.id)})))),n.Z.addEventListener("contacts_update",(e=>{var t;null===(t=this.processContact)||void 0===t||t.call(this,e.toPeerId())})),S.ZP.addEventListener("peer_changed",(({peerId:e,threadId:t,isForum:i})=>{const s={peerId:e,threadId:i?t:void 0};for(const e of this.lastActiveElements){const t=+e.dataset.threadId||void 0,i=e.dataset.peerId.toPeerId();S.ZP.isSamePeer({peerId:i,threadId:t},s)||this.setDialogActive(e,!1)}Array.from(document.querySelectorAll(`[data-autonomous="0"] .chatlist-chat[data-peer-id="${e}"]`)).forEach((t=>{const i=+t.dataset.threadId||void 0;S.ZP.isSamePeer({peerId:e,threadId:i},s)&&this.setDialogActive(t,!0)}))})),n.Z.addEventListener("filter_update",(e=>Je(this,void 0,void 0,(function*(){if(c.DZ.has(e.id))return;if(!this.filtersRendered[e.id])return void this.addFilter(e);const t=this.filtersRendered[e.id];(0,le.Z)(t.title,(0,pe.Z)(e.title))})))),n.Z.addEventListener("filter_delete",(e=>{const t=this.filtersRendered[e.id];t&&(t.container.remove(),t.menu.remove(),this.xds[e.id].destroy(),delete this.xds[e.id],delete this.filtersRendered[e.id],this.onFiltersLengthChange(),this.filterId===e.id&&this.selectTab(0,!1))})),n.Z.addEventListener("filter_order",(e=>Je(this,void 0,void 0,(function*(){e=e.slice(),(0,Re.Z)(e,c.Zi);const t=this.folders.menu,i=yield Promise.all(e.map((e=>Je(this,void 0,void 0,(function*(){const[t,i]=yield Promise.all([this.managers.dialogsStorage.getDialogIndexKeyByFilterId(e),this.managers.filtersStorage.getFilter(e)]);return{indexKey:t,filter:i}})))));e.forEach(((e,s)=>{const{indexKey:n,filter:a}=i[s],o=this.filtersRendered[e];this.xds[e].setIndexKey(n),(0,x.Z)(o.menu,t,a.localId),(0,x.Z)(o.container,this.folders.container,a.localId)}))}))))}setDialogActive(e,t){var i;const s=e.dialogDom;e.classList.toggle("active",t),e.classList.toggle("is-forum-open",(null===(i=this.forumTab)||void 0===i?void 0:i.peerId)===e.dataset.peerId.toPeerId()&&!e.dataset.threadId),t?this.lastActiveElements.add(e):this.lastActiveElements.delete(e),(null==s?void 0:s.callIcon)&&s.callIcon.setActive(t)}onStateLoaded(e){return Je(this,void 0,void 0,(function*(){this.stateMiddlewareHelper.clean();const t=this.stateMiddlewareHelper.get(),i=e.filtersArr,s=i.length>c.DZ.size,n=e=>{for(const t of e)this.addFilter(t)};let a;s?n(i):a=this.managers.filtersStorage.getDialogFilters().then(n),this.doNotRenderChatList=!0;const o=this.xd.onChatsScroll(),r=(0,Ee.Z)(t);try{yield r(o)}catch(e){}s||this.selectTab(0,!1),a&&(yield r(a)),this.doNotRenderChatList=void 0,this.filterId=-1,this.selectTab(0,!1),this.initedListeners||(this.initListeners(),this.initedListeners=!0),s&&this.showFiltersPromise&&(yield r(this.showFiltersPromise)),this.managers.appNotificationsManager.getNotifyPeerTypeSettings(),yield(yield r(o)).renderPromise.catch(Ze.Z),this.managers.appMessagesManager.fillConversations()}))}setFilterUnreadCount(e){var t;return Je(this,void 0,void 0,(function*(){const i=null===(t=this.filtersRendered[e])||void 0===t?void 0:t.unread;if(!i)return;const{unreadUnmutedCount:s,unreadCount:n}=yield this.managers.dialogsStorage.getFolderUnreadCount(e);i.classList.toggle("badge-gray",!s);const a=e===c.J$?s:n;i.innerText=a?""+a:""}))}setFiltersUnreadCount(){for(const e in this.filtersRendered)this.setFilterUnreadCount(+e)}l(e){const t=this.createChatList(),i=this.xds[e.id]=new dt(e.id),s=i.generateScrollable(t,e);return this.setListClickListener(t,null,!0),{ul:t,xd:i,scrollable:s}}addFilter(e){if(e.id===c.Zi)return;const t=this.folders.menu,i=this.filtersRendered[e.id];if(i)return(0,x.Z)(i.menu,t,e.localId),void(0,x.Z)(i.container,this.folders.container,e.localId);const s=document.createElement("div");s.classList.add("menu-horizontal-div-item");const n=document.createElement("span"),a=document.createElement("span");a.classList.add("text-super"),e.id===c.J$?a.append(this.allChatsIntlElement.element):(0,le.Z)(a,(0,pe.Z)(e.title));const o=document.createElement("div");o.classList.add("badge","badge-20","badge-primary");const r=document.createElement("i");n.append(a,o,r),(0,g.Z)(s),s.append(n),s.dataset.filterId=""+e.id,(0,x.Z)(s,t,e.localId);const{ul:d,scrollable:l}=this.l(e);l.container.classList.add("tabs-tab","chatlist-parts");const h=document.createElement("div");h.classList.add("chatlist-top");const u=document.createElement("div");u.classList.add("chatlist-bottom"),h.append(d),l.container.append(h,u);const p=l.container;(0,x.Z)(l.container,this.folders.container,e.localId),this.filtersRendered[e.id]={menu:s,container:p,unread:o,title:a},this.onFiltersLengthChange()}changeFiltersAllChatsKey(){const e=this.folders.menuScrollContainer.firstElementChild,t=e.scrollWidth>e.clientWidth?"FilterAllChatsShort":"FilterAllChats";this.allChatsIntlElement.compareAndUpdate({key:t})}onFiltersLengthChange(){let e=this.showFiltersPromise;return null!=e?e:e=this.showFiltersPromise=(0,_e.Z)(0).then((()=>{if(this.showFiltersPromise!==e)return;const t=Object.keys(this.filtersRendered).length>1,i=!this.folders.menuScrollContainer.classList.contains("hide");t!==i&&(this.folders.menuScrollContainer.classList.toggle("hide",!t),t&&!i&&this.setFiltersUnreadCount(),this.chatsContainer.classList.toggle("has-filters",t)),this.changeFiltersAllChatsKey(),this.showFiltersPromise=void 0}))}generateEmptyPlaceholder(e){const t="empty-placeholder",i=document.createElement("div");i.classList.add(t,t+"-"+e.classNameType);const s=document.createElement("div");s.classList.add(t+"-header"),(0,o.$d)(s,e.title);const n=document.createElement("div");return n.classList.add(t+"-subtitle"),e.subtitle&&(0,o.$d)(n,e.subtitle,e.subtitleArgs),i.append(s,n),{container:i,header:s,subtitle:n}}checkIfPlaceholderNeeded(){if(this.filterId===c.Zi)return;const e=this.chatList,t=e.parentElement;let i=Array.from(t.children).find((e=>e.matches(".empty-placeholder")));const s=this.xd.scrollable.loadedAll.bottom&&!e.childElementCount;if(s&&i)return;if(!s)return void(i&&(t.classList.remove("with-placeholder"),i.remove()));let n,a;if(this.filterId){n=this.generateEmptyPlaceholder({title:"FilterNoChatsToDisplay",subtitle:"FilterNoChatsToDisplayInfo",classNameType:a="folder"}),i=n.container;const e=document.createElement("div"),t="๐Ÿ“‚",s=128;(0,be.Z)({div:e,emoji:t,width:s,height:s}),i.prepend(e);const o=(0,C.Z)("btn-primary btn-color-primary btn-control tgico",{text:"FilterHeaderEdit",icon:"settings"});(0,k.fc)(o,(()=>Je(this,void 0,void 0,(function*(){const e=T.ZP.createTab(Z.Z);e.setInitFilter(yield this.managers.filtersStorage.getFilter(this.filterId)),e.open()})))),i.append(o)}else{n=this.generateEmptyPlaceholder({title:"ChatList.Main.EmptyPlaceholder.Title",classNameType:a="dialogs"}),i=n.container;const e=document.createElement("img");e.classList.add("empty-placeholder-dialogs-icon"),this.emptyDialogsPlaceholderSubtitle=new o.ZP.IntlElement({element:n.subtitle}),Promise.all([this.updateContactsLength(!1),(0,H.cj)(e,"assets/img/EmptyChats.svg"),(0,z.AD)()]).then((([e])=>{i.classList.add("visible"),t.classList.toggle("has-contacts",!!e)})),i.prepend(e)}t.append(i),t.classList.add("with-placeholder"),t.dataset.placeholderType=a}updateContactsLength(e){var t;return null!==(t=this.updateContactsLengthPromise)&&void 0!==t?t:this.updateContactsLengthPromise=this.managers.appUsersManager.getContacts().then((t=>{const i=this.emptyDialogsPlaceholderSubtitle;if(i){let e,s;t.length?(e="ChatList.Main.EmptyPlaceholder.Subtitle",s=[(0,o.ag)("Contacts.Count",[t.length])]):(e="ChatList.Main.EmptyPlaceholder.SubtitleNoContacts",s=[]),i.compareAndUpdate({key:e,args:s})}return e&&this.chatList.parentElement.classList.toggle("has-contacts",!!t.length),this.updateContactsLengthPromise=void 0,t.length}))}removeContactsPlaceholder(){const e=this.chatList,t=e.parentElement.parentElement,i=e.parentElement.nextElementSibling;t.classList.remove("with-contacts"),i.replaceChildren(),this.loadContacts=void 0,this.processContact=void 0}toggleForumTab(e,t=this.forumTab){return Je(this,void 0,void 0,(function*(){if(!t&&!e)return;if(t){const e=this.xd.getDialogElement(t.peerId);e&&e.dom.listEl.classList.remove("is-forum-open")}t===e&&(e=void 0),null==t||t.toggle(!1);const i=null==e?void 0:e.toggle(!0);if(t===this.forumTab&&(this.forumTab=e),e){const t=this.xd.getDialogElement(e.peerId);t&&t.dom.listEl.classList.add("is-forum-open"),S.ZP.selectTab(S.oo.CHATLIST)}i&&(yield i),e&&!this.forumNavigationItem?(this.forumNavigationItem={type:"forum",onPop:()=>{this.forumNavigationItem=void 0,this.toggleForumTab()}},re.Z.pushItem(this.forumNavigationItem)):!e&&this.forumNavigationItem&&(re.Z.removeItem(this.forumNavigationItem),this.forumNavigationItem=void 0);const s=!!e,n=i?2:void 0;this.xd.toggleAvatarUnreadBadges(s,n);const a=(0,Ce.Z)();(0,L.Z)({element:this.forumsSlider.parentElement,className:"is-forum-visible",duration:300,forwards:s,useRafs:n,onTransitionEnd:()=>{a.resolve()}}),(0,qe.YW)(a,300).then((()=>a.resolve()))}))}toggleForumTabByPeerId(e,t){const{managers:i}=this,s=T.ZP.getHistory(),n=s[s.length-1];let a;if(n)return n instanceof nt&&n.peerId===e&&t?void Ye(n.container):(a=T.ZP.createTab(nt),void a.open({peerId:e,managers:i}));a=this.forumsTabs.get(e);const o=this.forumTab&&this.forumTab===a;if(null!=t||(t=!o),t!==o)return t&&!a&&(a=new nt(void 0),a.init({peerId:e,managers:i}),this.forumsTabs.set(e,a),this.forumsSlider.append(a.container),a.managers=this.managers,a.eventListener.addEventListener("destroy",(()=>{this.forumsTabs.delete(e)}))),this.toggleForumTab(a);t&&Ye(a.container)}setListClickListener(e,t,i=!1,s=!1,n=!1){let a;const o=(n?S.ZP.setInnerPeer:S.ZP.setPeer).bind(S.ZP);e.dataset.autonomous=""+ +s,e.addEventListener("mousedown",(i=>{if(0!==i.button)return;this.log("dialogs click list");const n=i.target,d=(0,r.Z)(n,et);if(!d)return;const l=d.dataset.peerId.toPeerId(),h=+d.dataset.mid||void 0,u=+d.dataset.threadId||void 0;if(null==t||t(),!d.querySelector(".is-forum")||i.shiftKey||h){if(i.ctrlKey||i.metaKey)return window.open(d.href||"#"+l,"_blank"),void(0,B.Z)(i);s&&(a&&!(a===d)&&a.classList.remove("active"),d&&(d.classList.add("active"),a=d,this.lastActiveElements.add(d))),u&&!h||this.xd.sortedList.list!==e||this.xd===this.xds[c.Zi]||this.toggleForumTab(),o({peerId:l,lastMsgId:h,threadId:u})}else this.toggleForumTabByPeerId(l)}),{capture:!0}),e.addEventListener("click",(e=>{0===e.button&&(0,B.Z)(e)}),{capture:!0}),i&&this.contextMenu.attach(e)}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}setLastMessageN(e){return this.setLastMessage(e).catch((e=>{"MIDDLEWARE"!==(null==e?void 0:e.type)&&this.log.error("set last message error",e)}))}setLastMessage({dialog:e,lastMessage:t,dialogElement:i,highlightWord:s,isBatch:a=!1,setUnread:r=!1}){var d,l;return Je(this,void 0,void 0,(function*(){if(!i&&!(i=this.xd.getDialogElement(e.peerId)))return;const{dom:c}=i,{peerId:h}=e,{deferred:u,middleware:p}=tt(c,"setLastMessagePromise");let f;if(!t&&("draftMessage"!==(null===(d=e.draft)||void 0===d?void 0:d._)||h.isAnyChat()&&"forumTopic"!==e._&&(yield this.managers.appPeersManager.isForum(h))||(f=e.draft),(null==(t=e.topMessage)?void 0:t.mid)!==e.top_message)){const i=this.managers.appMessagesManager.getMessageByPeer(h,e.top_message);t=yield p(i)}const m=null!==r&&!r;if(m||this.setUnreadMessagesN({dialog:e,dialogElement:i,isBatch:a,setLastMessagePromise:u}),!t)return c.lastMessageSpan.replaceChildren(),c.lastTimeSpan.replaceChildren(),delete c.listEl.dataset.mid,void u.resolve();const g=t&&(0,me.Z)(t);{let e;const i=[];if(t&&!f&&!g){const s=(0,ge.Z)(t),n=new Set(["video","gif","round"]);if(s&&("photo"===s._||n.has(s.type))){const a=(0,ue.Z)(s,20,20);if("photoSizeEmpty"!==a._&&(e=document.createElement("div"),e.classList.add("dialog-subtitle-media"),"round"===s.type&&e.classList.add("is-round"),i.push((0,P.Z)({photo:s,message:t,container:e,withoutPreloader:!0,size:a}).then((()=>e))),n.has(s.type))){const t=document.createElement("span");t.classList.add("tgico-play"),e.append(t)}}}if(f){const e=document.createElement("span");e.classList.add("danger"),e.append((0,o.ag)("Draft"),": "),i.unshift(e)}else if(h.isAnyChat()&&h!==t.fromId&&!t.action){const e=document.createElement("span");if(e.classList.add("primary-text"),t.fromId===n.Z.myId)e.append((0,o.ag)("FromYou")),i.unshift(e);else{const s=p((0,Le.Z)({peerId:t.fromId,onlyFirstName:!0})).then((t=>(e.prepend(t),e)),Ze.Z);i.unshift(s)}e.append(": ")}const a=!!e&&!!(null==t?void 0:t.message);let r;if(r=s&&t.message?yield p((0,fe.Z)({message:t,highlightWord:s,withoutMediaType:a})):f?yield p((0,fe.Z)({message:f})):t?yield p((0,fe.Z)({message:t,withoutMediaType:a})):document.createDocumentFragment(),i.length){const e=yield p(Promise.all(i));r.prepend(...e)}(0,A.Z)(c.lastMessageSpan,r)}if(t||f){const e=f?Math.max(f.date,t.date||0):t.date;(0,A.Z)(c.lastTimeSpan,(0,b.zM)(new Date(1e3*e)))}else c.lastTimeSpan.textContent="";if(m){c.listEl.dataset.mid=""+t.mid;const e=t.reply_to;(null===(l=null==e?void 0:e.pFlags)||void 0===l?void 0:l.forum_topic)&&(c.listEl.dataset.threadId=""+(0,Ke.Z)(t))}u.resolve()}))}setUnreadMessagesN(e){return this.setUnreadMessages(e).catch((()=>{}))}setUnreadMessages({dialog:e,dialogElement:t,isBatch:i=!1,setLastMessagePromise:s}){var a;return Je(this,void 0,void 0,(function*(){const{dom:o}=t;if(!o)return;const r="forumTopic"===e._,{deferred:d,middleware:l}=tt(o,"setUnreadMessagePromise"),{peerId:h}=e,u=Promise.all([this.managers.appNotificationsManager.isPeerLocalMuted({peerId:h,respectType:!0,threadId:r?e.id:void 0}),"draftMessage"!==(null===(a=e.draft)||void 0===a?void 0:a._)?this.managers.appMessagesManager.getMessageByPeer(h,e.top_message):void 0,r?!!e.pFlags.pinned:this.managers.dialogsStorage.isDialogPinned(h,this.filterId),this.managers.appMessagesManager.isDialogUnread(e),h.isAnyChat()&&!r?this.managers.acknowledged.dialogsStorage.getForumUnreadCount(h).then((i=>i.cached?i.result:(i.result.then((()=>{this.setUnreadMessagesN({dialog:e,dialogElement:t})})),{count:0,hasUnmuted:!1}))).catch((()=>{})):void 0]);let[p,f,m,g,v]=yield l(u);const b=o.listEl.classList.contains("is-muted"),{count:y,hasUnmuted:w}=v||{};let S;f&&f.pFlags.out&&f.peerId!==n.Z.myId&&(S=f);const C=null!=y?y:e.unread_count;void 0!==y&&(g=!!C),r&&!g&&(g=!(0,Xe.Z)(e.read_inbox_max_id));const E=m||g,I=this.xd!==this.xds[c.Zi]&&!r&&!!this.forumTab&&this.xd.getDialogElement(h)===t&&g;if(s)try{yield l(s)}catch(e){return}const M=i?0:250;o.listEl.classList.toggle("no-unmuted-topic",!p&&void 0!==w&&!w),p!==b&&(0,L.Z)({element:o.listEl,className:"is-muted",forwards:p,duration:M}),function(e,t,i){let s;if("string"==typeof t?s=t:(null==t?void 0:t.pFlags.out)&&(s=t.error?"sendingerror":t.pFlags.is_outgoing?"sending":t.pFlags.unread?"check":"checks"),!s)return void(e.textContent="");const n="tgico-"+s,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()}(o.statusSpan,r&&e.pFlags.closed?"premium_lock":S);const P=!!o.unreadBadge;E&&t.createUnreadBadge();const Z=!!o.unreadAvatarBadge;I&&t.createUnreadAvatarBadge();const T=e.unread_mentions_count&&(e.unread_mentions_count>1||e.unread_count>1),k=!!o.mentionsBadge;if(T&&t.createMentionsBadge(),[["unreadBadge",E,P],["unreadAvatarBadge",I,Z],["mentionsBadge",T,k]].forEach((([e,s,n])=>{o[e]&&t.toggleBadgeByKey(e,s,n,i)})),!E)return void d.resolve();m?o.unreadBadge.classList.add("tgico-chatspinned","tgico"):o.unreadBadge&&o.unreadBadge.classList.remove("tgico-chatspinned","tgico");let x,A=!0,_=!1;if(e.unread_mentions_count&&1===C?(x="@",_=!0):g?x=""+(C?(0,We.Z)(C,1):" "):(x="",A=!1),r){const e=g&&" "===x;o.unreadBadge.classList.toggle("not-visited",e)}[[o.unreadBadge,x],[o.unreadAvatarBadge,x||void 0]].filter(Boolean).forEach((([e,t])=>{void 0!==t&&(e.innerText=x),e.classList.toggle("unread",A),e.classList.toggle("mention",_)})),d.resolve()}))}getDialog(e,t){return Je(this,void 0,void 0,(function*(){if("object"!=typeof e){let i;if(t){if(i=yield this.managers.dialogsStorage.getForumTopic(e,t),!i)return{peerId:e||c.NM,pFlags:{}}}else if(i=yield this.managers.appMessagesManager.getDialogOnly(e),!i){const t=e||c.NM;return{peerId:t,peer:yield this.managers.appPeersManager.getOutputPeer(t),pFlags:{}}}return i}return e}))}addListDialog(e){var t;e.autonomous=!1;const i=this.addDialogNew(e);if(i){const{peerId:s}=e,a=this.getDialog(s,e.threadId).then((t=>{const a=[],o=s.isUser();return o||"dialog"!==t._||a.push(this.xd.processDialogForCallStatus(s,i.dom)),s!==n.Z.myId&&o&&a.push(this.managers.appUsersManager.getUserStatus(s.toUserId()).then((e=>{"userStatusOnline"===(null==e?void 0:e._)&&this.xd.setOnlineStatus(i.dom.avatarEl,!0)}))),a.push(this.setLastMessageN({dialog:t,dialogElement:i,isBatch:e.isBatch,setUnread:!0})),Promise.all(a)}));null===(t=e.loadPromises)||void 0===t||t.push(a)}return i}addDialogAndSetLastMessage(e){const{peerId:t,message:i,query:s}=e,n=this.addDialogNew(Object.assign(Object.assign(Object.assign({},e),(0,ve.Z)(i)),{peerId:t}));return this.setLastMessageN({dialog:{_:"dialog",peerId:t},lastMessage:i,dialogElement:n,highlightWord:s}),i.peerId!==t&&(n.dom.listEl.dataset.peerId=""+i.peerId),n}addDialogNew(e){const t=new st(Object.assign({autonomous:!!e.container,avatarSize:"bigger"},e));if(e.container){const i=e.append?"prepend":"append";e.container[i](t.container)}return t}}const ct=new lt;E.GO.appDialogsManager=ct;const ht=ct},2312:(e,t,i)=>{"use strict";i.d(t,{Z:()=>v});var s=i(3725),n=i(2202),a=i(3512),o=i(410),r=i(319),d=i(1243),l=i(7086),c=i(1655),h=i(5471),u=i(8801),p=i(6658),f=i(7667),m=i(3855);const g=new class{constructor(){this.downloads={},this.progress={}}construct(e){this.managers=e,a.Z.addEventListener("download_progress",(e=>{var t;const i=this.downloads[e.fileName];(null===(t=null==i?void 0:i.main)||void 0===t?void 0:t.notifyAll)&&(this.progress[e.fileName]=e,i.main.notifyAll(e))}))}getNewDeferred(e,t){const i=(0,s.Z)();let n=this.downloads[e];if(n){const e=n.main;["cancel","addNotifyListener","notify","notifyAll"].forEach((t=>{e[t]&&(i[t]=e[t].bind(e))}))}else n=this.downloads[e]={main:i},i.cancel=()=>{const t=(0,h.Z)("DOWNLOAD_CANCELED");this.managers.apiFileManager.cancelDownload(e),i.reject(t),i.cancel=r.Z},i.catch((()=>{this.clearDownload(e,t)})).finally((()=>{delete this.progress[e]}));return"disc"===t&&i.catch(r.Z).finally((()=>{this.clearDownload(e,t)})),n[t]=i}getNewDeferredForUpload(e,t){const i=this.getNewDeferred(e);return t.then(i.resolve,i.reject),i.finally((()=>{this.clearDownload(e)})),i}clearDownload(e,t){const i=this.downloads[e];if(!i)return;delete i[t];const s=Object.keys(i).length;(!s||i.main&&1===s)&&delete this.downloads[e]}getUpload(e){let t=this.getDownload(e);return t||(t=this.getNewDeferred(e),this.managers.appMessagesManager.getUploadPromise(e).then(t.resolve,t.reject),t)}d(e,t,i){let s=this.getDownload(e,i);return s||(s=this.getNewDeferred(e,i),t().then(s.resolve,s.reject),s)}download(e){const t=(0,l.Z)(e);return this.d(t,(()=>this.managers.apiFileManager.download(e)),"blob")}downloadMedia(e,t="blob",i){const{downloadOptions:s,fileName:n}=(0,d.Z)(e);return this.d(n,(()=>{let s;return s="url"===t?this.managers.apiFileManager.downloadMediaURL:"void"===t?this.managers.apiFileManager.downloadMediaVoid:this.managers.apiFileManager.downloadMedia,i?i.then((()=>s(e))):s(e)}),t)}downloadMediaURL(e){return this.downloadMedia(e,"url")}downloadMediaVoid(e){return this.downloadMedia(e,"void")}upload(e,t,i){return t||(t=(0,n.Z)(e)),i||(i=this.managers.apiFileManager.upload({file:e,fileName:t})),this.getNewDeferredForUpload(t,i)}getDownload(e,t){const i=this.downloads[e];return i&&i[t]}downloadToDisc(e,t){const i=e.media,s="document"===i._;s||e.thumb||(e.thumb=i.sizes.slice().pop());const n=""+(2147483647*Math.random()|0),a=`download/${n}`;e.downloadId=n;const o=m.Z.pingServiceWorkerWithIframe(),d=this.downloadMedia(e,"disc",o);if(t)return d;const l=document.createElement("iframe");l.hidden=!0,o.then((()=>{l.src=a,document.body.append(l)}));let h,g=!1;const v=()=>{g||(g=!0,h=l,(0,c.Z)(d.listeners,v))};return d.addNotifyListener(v),d.then((t=>{if(!t)return;const n=URL.createObjectURL(t),a=s?(0,p.Z)(i):(0,f.Z)(i,e.thumb),o=e.media.file_name||(0,u.P)(a.location);!function(e,t,i){const s=document.createElement("a");s.href=e,s.download=t,s.target="_blank",s.style.position="absolute",s.style.top="1px",s.style.left="1px",document.body.append(s);try{const e=document.createEvent("MouseEvents");e.initMouseEvent("click",!0,!1,window,0,0,0,0,0,!1,!1,!1,!1,0,null),s.dispatchEvent(e)}catch(t){console.error("Download click error",t);try{s.click()}catch(t){window.open(e,"_blank")}}setTimeout((()=>{s.remove(),i&&i()}),100)}(n,a.fileName||o,(()=>{URL.revokeObjectURL(n)}))})).catch(r.Z).finally((()=>{g||v(),setTimeout((()=>{null==h||h.remove()}),1e3)})),d}};o.GO&&(o.GO.appDownloadManager=g);const v=g},9322:(e,t,i)=>{"use strict";i.d(t,{oo:()=>Qr,ZP:()=>id});var s=i(5814),n=i(744),a=i(4332),o=i(4755),r=i(5003),d=i(3512),l=i(3241),c=i(5432),h=i(1655),u=i(6519),p=i(4484),f=i(9331),m=i(1507),g=i(7625);function v(e,t){const i=[],s=[];for(let n=0,a=e.length;n{this.mountItem(e,s-1-i,t)})),e&&this.updateClassNames(),this.onItemMount()}mountItem(e,t=this.items.indexOf(e),i=this.offset){e.mounted||((0,p.Z)(e.bubble,this.container,i+t),e.mounted=!0)}unmountItem(e){e.mounted&&(e.bubble.remove(),e.mounted=!1,this.onItemUnmount())}onItemMount(){if(this.mounted)return;const e=this.chat.bubbles.getDateContainerByTimestamp(this.dateTimestamp/1e3),t=this.groups.groups.filter((e=>e.dateTimestamp===this.dateTimestamp)),i=t.length,s=t.indexOf(this),n=t.slice(s+1).reduce(((e,t)=>e+(t.mounted?0:1)),0);(0,p.Z)(this.container,e.container,Cs+i-1-s-n),this.mounted=!0}onItemUnmount(){this.mounted&&(this.items.length?this.updateClassNames():(this.container.remove(),this.chat.bubbles.deleteEmptyDateGroups(),this.mounted=!1))}}class w{constructor(e){this.chat=e,this.itemsArr=[],this.itemsMap=new Map,this.groups=[],this.newGroupDiff=121,this.sortItemsKey="scheduled"===e.type?"timestamp":"mid",this.sortGroupsKey="scheduled"===e.type?"lastTimestamp":"lastMid",this.sortGroupItemsKey="groupMid"}removeItem(e){var t;null===(t=e.group)||void 0===t||t.removeItem(e),this.removeItemFromCache(e)}removeAndUnmountBubble(e){const t=this.getItemByBubble(e);if(!t)return e.parentElement&&e.remove(),!1;const i=this.itemsArr,s=i.indexOf(t),n=this.getSiblingsAtIndex(s,i),a=t.group;this.removeItem(t);const o=new Set;a&&(a.unmountItem(t),o.add(a));const[r,d]=n;if(r&&d&&this.canItemsBeGrouped(r,d)&&r.group!==d.group){const e=d.group;this.f(d.group.items),e.onItemUnmount(),o.add(r.group),this.groupUngrouped()}return this.mountUnmountGroups(Array.from(o)),!0}mountUnmountGroups(e){const[t,i]=v(e,(e=>!!e.items.length));i.forEach((e=>{e.onItemUnmount()})),t.forEach((e=>{e.mount(!0)}))}f(e,t=0,i=e.length){for(;ts.add(e)))}}return s}cleanup(){this.itemsArr=[],this.groups=[],this.itemsMap.clear()}}var S=i(1168),C=i(2738),L=i(2325),E=i(503);class I extends S.Z{constructor(e,t,i={}){if(super("popup-date-picker",Object.assign({body:!0,overlayClosable:!0,buttons:i.noButtons?[]:[{langKey:"JumpToDate",callback:()=>{this.onPick&&this.onPick(this.selectedDate.getTime()/1e3|0)}},{langKey:"Cancel",isCancel:!0}],title:!0},i)),this.onPick=t,this.options=i,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 i=+t.dataset.timestamp;this.selectedDate=new Date(i),this.setTitle(),this.setTimeTitle()},this.minDate=i.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&&s&&s(+o[1]),o="0"+o[0]),t.setValueSilently(o),i(o.length)}))};this.hoursInputField=new E.ZP({plainText:!0}),this.minutesInputField=new E.ZP({plainText:!0}),i(23,this.hoursInputField,(e=>{2===e&&this.minutesInputField.input.focus(),this.setTimeTitle()}),(e=>{this.minutesInputField.value=(e+this.minutesInputField.value).slice(0,2)})),i(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),(0,C.fc)(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 s=document.createElement("div");s.classList.add("popup-centerer"),s.append(this.container),this.element.append(s),e.setHours(0,0,0,0),this.selectedDate=e,this.maxDate=i.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"),i.noTitle&&(this.setTitle=()=>{}),this.setTimeTitle(),this.setTitle(),this.setMonth()}setTimeTitle(){if(this.btnConfirm&&this.selectedDate){let e;const t=[],i=new Date;i.setHours(0,0,0,0);const s={minute:"2-digit",hour:"2-digit"},n=new Date(this.selectedDate.getTime());if(n.setHours(+this.hoursInputField.value,+this.minutesInputField.value),this.selectedDate.getTime()===i.getTime())e="Schedule.SendToday";else{e="Schedule.SendDate";const s={month:"short",day:"numeric"};n.getFullYear()!==i.getFullYear()&&(s.year="numeric"),t.push(new L.ZP.IntlDateElement({date:n,options:s}).element)}t.push(new L.ZP.IntlDateElement({date:n,options:s}).element),this.btnConfirm.firstChild.replaceWith((0,L.ag)(e,t))}}setTitle(){this.title.textContent="",this.title.append(new L.ZP.IntlDateElement({date:this.selectedDate,options:{day:"numeric",month:"long",weekday:"short"}}).element)}renderElement(e,t=""){const i=document.createElement("button");return i.classList.add("btn-icon","date-picker-month-date"),e&&i.setAttribute("disabled","true"),t&&i.append(t),i}setMonth(){const e=new Date(this.selectedMonth),t={year:"numeric",month:this.timeDiv&&o.Z.isMobile?"short":"long"};this.monthTitle.textContent="",this.monthTitle.append(new L.ZP.IntlDateElement({date:e,options:t}).element),this.month&&this.month.remove(),this.month=document.createElement("div"),this.month.classList.add("date-picker-month");const i=new Date,s=i.getDay();1!==s&&i.setHours(-24*(s-1));for(let e=0;e<7;++e){const e=this.renderElement(!0,new L.ZP.IntlDateElement({date:i,options:{weekday:"narrow"}}).element);e.classList.remove("date-picker-month-date"),e.classList.add("date-picker-month-day"),this.month.append(e),i.setDate(i.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{f&&!f()||(p.forEach((e=>e.remove())),o&&o.classList.toggle("is-round",u))})),h}))}class X extends G{constructor(e,t){super(e,((e,i="",s)=>q(this,void 0,void 0,(function*(){this.mediaEl||(this.mediaEl=document.createElement("div"),this.mediaEl.classList.add(this.className+"-media"));const n=yield Q({title:e,titleEl:this.title,subtitle:i,subtitleEl:this.subtitle,mediaEl:this.mediaEl,message:s,animationGroup:t});this.container.classList.toggle("is-media",n),n?this.content.prepend(this.mediaEl):this.mediaEl.remove()})))),this.className=e,this.animationGroup=t}}function J(e,t,i,s,n){const a=new X("reply",i),o=a.fill(e,t,s);if(n){const e=(0,U.Z)(n,!1),[t,i,s]=(0,O.oo)(e);a.container.style.setProperty("--override-color",`${t}, ${i}, ${s}`),a.container.classList.add("is-overriding-color")}return{container:a.container,fillPromise:o}}const ee="stacked-avatars",te=ee+"-avatar",ie=te+"-container";class se{constructor(e){this.lazyLoadQueue=e.lazyLoadQueue,this.avatarSize=e.avatarSize,this.container=document.createElement("div"),this.container.classList.add(ee),this.container.style.setProperty("--avatar-size",e.avatarSize+"px")}render(e,t){const i=this.container.children;(e=e.slice().reverse()).length>3&&(e=e.slice(-3)),e.forEach(((e,s)=>{let n=i[s];n||(n=document.createElement("div"),n.classList.add(ie));let a=n.firstElementChild;a||(a=new f.Z,a.classList.add("avatar-"+this.avatarSize,te),a.updateOptions({isDialog:!1,loadPromises:t})),a.updateWithOptions({lazyLoadQueue:this.lazyLoadQueue,peerId:e}),a.parentNode||n.append(a),n.parentNode||this.container.append(n)})),Array.from(i).slice(e.length).forEach((e=>e.remove()))}}const ne="replies-element";d.Z.addEventListener("replies_updated",(e=>{Array.from(document.querySelectorAll(ne+`[data-post-key="${e.peerId}_${e.mid}"]`)).forEach((t=>{t.message=e,t.render()}))}));class ae extends HTMLElement{constructor(){super(),this.updated=!1,this.managers=d.Z.managers}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;this.firstElementChild&&(t=this.firstElementChild),(null==e?void 0:e.recent_repliers)?(t&&!t.classList.contains("replies-footer-avatars")&&(this.innerHTML="",t=null),this.stackedAvatars||(this.stackedAvatars=new se({lazyLoadQueue:this.lazyLoadQueue,avatarSize:30}),this.stackedAvatars.container.classList.add("replies-footer-avatars")),t=this.stackedAvatars.container,this.stackedAvatars.render(e.recent_repliers.map((e=>(0,R.Z)(e))),this.loadPromises)):(t&&!t.classList.contains("tgico-comments")&&(t.remove(),t=null),t||(t=document.createElement("span"),t.classList.add("tgico-comments"))),t.parentElement||this.prepend(t),this.text||(this.text=new L.ZP.IntlElement);const i=this.text;if(e?e.replies?i.compareAndUpdate({key:"Comments",args:[e.replies]}):i.compareAndUpdate({key:"LeaveAComment"}):i.compareAndUpdate({key:"ViewInChat"}),e){let t=!1;e.replies&&void 0!==e.read_max_id&&void 0!==e.max_id&&(t=e.read_max_id${(null==e?void 0:e.replies)?(0,D.Z)(e.replies,0):""}`;!e||this.updated||this.message.pFlags.is_outgoing||(this.managers.appMessagesManager.subscribeRepliesThread(this.message.peerId,this.message.mid),this.managers.appMessagesManager.updateMessage(this.message.peerId,this.message.mid,"replies_updated"),this.updated=!0),this.loadPromises&&(this.loadPromises=void 0)}}customElements.define(ne,ae);const oe=()=>{const e=document.createElement("i");return e.classList.add("edited"),(0,L.$d)(e,"EditedMessage"),e},re=()=>(0,L.ag)("SponsoredMessage");var de;!function(e){e.setTime=e=>{var t;const{chatType:i,message:s}=e,n=new Date(1e3*s.date),a=[];let o,r;const d=!!s.pFlags.sponsored,l=!("action"in s)&&!d,c=d?void 0:(0,_.mr)(n);if(l){if(s.views){const e=s.post_author||(null===(t=s.fwd_from)||void 0===t?void 0:t.post_author),i=document.createElement("span");i.classList.add("post-views"),i.innerHTML=(0,D.Z)(s.views,1);const n=document.createElement("i");if(n.classList.add("tgico-channelviews","time-icon"),a.push(i,n),e){const t=document.createElement("span");(0,F.Z)(t,(0,B.Z)(e)),t.insertAdjacentHTML("beforeend",", "),a.push(t)}}if(s.edit_date&&"scheduled"!==i&&!s.pFlags.edit_hide&&a.unshift(o=oe()),"pinned"!==i&&s.pFlags.pinned){const e=document.createElement("i");e.classList.add("tgico-pinnedchat","time-icon"),a.unshift(e)}}else d&&a.push(r=re());c&&a.push(c);let h=d?void 0:(0,_.xE)(n);l&&(h+=(s.edit_date&&!s.pFlags.edit_hide?`\nEdited: ${(0,_.xE)(new Date(1e3*s.edit_date))}`:"")+(s.fwd_from?`\nOriginal: ${(0,_.xE)(new Date(1e3*s.fwd_from.date))}`:""));const u=document.createElement("span");u.classList.add("time","tgico"),u.append(...a);const p=document.createElement("div");p.classList.add("inner","tgico"),h&&(p.title=h);let f=a;return o&&(f[f.indexOf(o)]=oe()),r&&(f[f.indexOf(r)]=re()),f=f.map((e=>e instanceof HTMLElement&&!e.classList.contains("i18n")&&!e.classList.contains("reactions")?e.cloneNode(!0):e)),c&&(f[f.length-1]=(0,_.mr)(n)),p.append(...f),u.append(p),u},e.renderReplies=({bubble:e,bubbleContainer:t,message:i,messageDiv:s,loadPromises:n,lazyLoadQueue:a})=>{const o=!e.classList.contains("sticker")&&!e.classList.contains("emoji-big")&&!e.classList.contains("round"),r=new ae;return r.message=i,r.type=o?"footer":"beside",r.loadPromises=n,r.lazyLoadQueue=a,r.init(),t.prepend(r),o},e.setReply=({chat:e,bubble:t,bubbleContainer:i,message:s})=>{return n=this,a=void 0,r=function*(){const n=!i;n&&(i=t.querySelector(".bubble-content"));const a=n?i.querySelector(".reply"):null;if(!s.reply_to_mid)return null==a||a.remove(),void t.classList.remove("is-reply");const o=s.reply_to.reply_to_peer_id?(0,R.Z)(s.reply_to.reply_to_peer_id):e.peerId,r=yield d.Z.managers.appMessagesManager.getMessageByPeer(o,s.reply_to_mid);let l,c;if(r){const e=r.fwdFromId;c=s.fwdFromId&&s.fwdFromId===e?s.fwdFromId:r.fromId||e,l=new N.Z({peerId:c,dialog:!1,onlyFirstName:!1,plainText:!1}).element}else d.Z.managers.appMessagesManager.fetchMessageReplyTo(s),e.bubbles.needUpdate.push({replyToPeerId:o,replyMid:s.reply_to_mid,mid:s.mid}),l=(0,L.ag)("Loading");const{container:h,fillPromise:u}=J(l,void 0,e.animationGroup,r,e.isAnyGroup?c:void 0);return yield u,a?(a.classList.contains("floating-part")&&h.classList.add("floating-part"),a.replaceWith(h)):i.append(h),t.classList.add("is-reply"),h},new((o=void 0)||(o=Promise))((function(e,t){function i(e){try{d(r.next(e))}catch(e){t(e)}}function s(e){try{d(r.throw(e))}catch(e){t(e)}}function d(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(i,s)}d((r=r.apply(n,a||[])).next())}));var n,a,o,r}}(de||(de={}));var le=i(2153),ce=i(3699),he=i(8448),ue=i(4789),pe=i(8594),fe=i(3035),me=i(3725),ge=i(410),ve=i(252),be=i(8497),ye=i(4668),we=i(2796),Se=i(3624),Ce=i(3910),Le=i(5705);function Ee(e){e.style.display="none",e.offsetLeft,e.style.display=""}var Ie=i(2648),Me=i(5296),Pe=i(8938),Ze=i(5701);const Te=2147483646;var ke,xe=i(241),Ae=i(6272),_e=i(1784),Fe=i(9099),De=i(2416),Re=i(8763),Be=i(5975),Ne=i(8939),Oe=i(993),Ue=i(4494),He=i(8204),ze=i(2575),je=i(9931);class Ge extends S.Z{constructor(e,t){super("popup-join-chat-invite",{closable:!0,overlayClosable:!0,body:!0,buttons:(0,S.x)([{langKey:t.pFlags.request_needed?"RequestJoin.Button":t.pFlags.broadcast?"JoinByPeekChannelTitle":"JoinByPeekGroupTitle",callback:()=>{this.managers.appChatsManager.importChatInvite(e).then((e=>{const t=e.toPeerId(!0);id.setInnerPeer({peerId:t})}),(e=>{"INVITE_REQUEST_SENT"===e.type&&(0,we.bC)({langPackKey:"RequestToJoinSent"})}))}}])}),this.hash=e,this.chatInvite=t,this.construct()}construct(){return e=this,t=void 0,s=function*(){this.header.remove();const{chatInvite:e,managers:t,hash:i}=this,s=new f.Z;s.classList.add("avatar-100"),s.isDialog=!1,"photo"===e.photo._?(e.photo=yield t.appPhotosManager.savePhoto(e.photo),(0,K.Z)({container:s,message:null,photo:e.photo,boxHeight:100,boxWidth:100,withoutPreloader:!0}),s.style.width=s.style.height=""):(0,je.Z)({div:s,peerId:m.NM,isDialog:!1,title:e.title});const n=document.createElement("div");n.classList.add("chat-title"),(0,F.Z)(n,(0,B.Z)(e.title));const a=e.pFlags.broadcast,o=(0,L.ag)(a?"Subscribers":"Members",[(0,ze.Z)(e.participants_count)]);if(o.classList.add("chat-participants-count"),this.body.append(s,n,o),e.pFlags.request_needed){const e=document.createElement("div");(0,L.$d)(e,a?"RequestToJoinChannelDescription":"RequestToJoinGroupDescription"),e.classList.add("chat-participants-count","request-caption"),this.body.append(e)}this.show()},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}!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",e[e.USER_PHONE_NUMBER=5]="USER_PHONE_NUMBER",e[e.INVOICE=6]="INVOICE",e[e.EMOJI_SET=7]="EMOJI_SET"}(ke||(ke={}));var Ve=i(5285),Ke=i(6654),We=i(9083),$e=i(6775),qe=i(9405),Ye=i(319);const Qe="reaction",Xe=Qe+"-element";class Je extends HTMLElement{constructor(){super(),this.classList.add(Qe),this.managers=d.Z.managers}get reactionCount(){return this._reactionCount}set reactionCount(e){this._reactionCount=e}get count(){return this.reactionCount.count}init(e,t){this.type=e,this.classList.add(Qe+"-"+e),this.middleware=t}setCanRenderAvatars(e){this.canRenderAvatars=e}render(e){const t=!!this.stickerContainer;t||(this.stickerContainer=document.createElement("div"),this.stickerContainer.classList.add(Qe+"-sticker"),this.append(this.stickerContainer));const i=this.reactionCount;if(!e&&!t){const e=i.reaction;if("reactionEmoji"===e._){const t=this.managers.appReactionsManager.getReaction(e.emoticon);(0,Ke.Z)(t,(e=>{var t;e.center_icon||this.stickerContainer.classList.add("is-static"),e.pFlags.inactive&&this.classList.add("is-inactive"),this.renderDoc(null!==(t=e.center_icon)&&void 0!==t?t:e.static_icon)}))}else if("reactionCustomEmoji"===e._){this.stickerContainer.classList.add("is-custom");const t=(0,We.Z)({docIds:[e.document_id],customEmojiSize:(0,qe.C)(22,22)});this.stickerContainer.append(t)}}}renderDoc(e){const t="inline"===this.type?14:22,i=this.wrapStickerPromise=(0,W.ZP)({div:this.stickerContainer,doc:e,width:t,height:t,static:!0,managers:this.managers,middleware:this.middleware}).then((({render:e})=>e)).finally((()=>{this.wrapStickerPromise===i&&(this.wrapStickerPromise=void 0)}))}renderCounter(){var e;const t=this.reactionCount,i="inline"===this.type?2:4;if(t.count>=i||"block"===this.type&&!this.canRenderAvatars){this.counter||(this.counter=document.createElement("inline"===this.type?"i":"span"),this.counter.classList.add(Qe+"-counter"));const e=(0,D.Z)(t.count);this.counter.textContent!==e&&(this.counter.textContent=e),this.counter.parentElement||this.append(this.counter)}else(null===(e=this.counter)||void 0===e?void 0:e.parentElement)&&(this.counter.remove(),this.counter=void 0)}renderAvatars(e){"inline"!==this.type&&(this.reactionCount.count>=4||!this.canRenderAvatars?this.stackedAvatars&&(this.stackedAvatars.container.remove(),this.stackedAvatars=void 0):(this.stackedAvatars||(this.stackedAvatars=new se({avatarSize:24}),this.append(this.stackedAvatars.container)),this.stackedAvatars.render(e.map((e=>(0,R.Z)(e.peer_id))))))}setIsChosen(e=void 0!==this.reactionCount.chosen_order){"inline"!==this.type&&(this.classList.contains("is-chosen")&&!this.classList.contains("backwards"))!==e&&(0,Fe.Z)({element:this,className:"is-chosen",forwards:e,duration:this.isConnected?300:0})}fireAroundAnimation(){const e=this.reactionCount.reaction;"reactionEmoji"===e._&&(0,Ke.Z)(this.managers.appReactionsManager.getReaction(e.emoticon),(e=>{const t="inline"===this.type?28:40,i=document.createElement("div");i.classList.add(Qe+"-sticker-activate"),Promise.all([(0,W.ZP)({div:i,doc:e.center_icon,width:t,height:t,withThumb:!1,needUpscale:!0,play:!1,skipRatio:1,group:"none",needFadeIn:!1,managers:this.managers,middleware:this.middleware}).then((({render:e})=>e)),(0,$e.Z)({doc:e.around_animation,size:80,target:this.stickerContainer,side:"center",skipRatio:1,play:!1,managers:this.managers,middleware:this.middleware}).stickerPromise.catch(Ye.Z)]).then((([e,t])=>{const s=()=>{e.remove(),i.remove(),this.stickerContainer.classList.remove("has-animation")};if(!t)return void s();const n=()=>{(0,fe.T2)(s)};e.addEventListener("enterFrame",(t=>{t===e.maxFrame&&(this.wrapStickerPromise?this.wrapStickerPromise.then((()=>{setTimeout(n,1e3)})):n())})),e.addEventListener("firstFrame",(()=>{this.stickerContainer.append(i),this.stickerContainer.classList.add("has-animation"),e.play(),t.play()}),{once:!0})}))}))}}customElements.define(Xe,Je);const et="reactions",tt=et+"-element",it=new Map;class st extends HTMLElement{constructor(){super(),this.classList.add(et),this.sorted=[],this.middlewareHelpers=new Map,this.managers=d.Z.managers}connectedCallback(){let e=it.get(this.key);e||it.set(this.key,e=new Set),e.add(this),this.onConnectCallback&&this.isConnected&&(this.onConnectCallback(),this.onConnectCallback=void 0)}disconnectedCallback(){const e=it.get(this.key);e.delete(this),e.size||it.delete(this.key)}getReactionCount(e){return this.sorted[this.sorted.indexOf(e)].reactionCount}getMessage(){return this.message}init(e,t,i,s=this.isPlaceholder){void 0!==this.key&&this.disconnectedCallback(),this.middleware!==i&&i.onDestroy((()=>{this.middlewareHelpers.clear()})),this.message=e,this.key=this.message.peerId+"_"+this.message.mid,this.middleware=i,this.isPlaceholder=s,this.type!==t&&(this.type=t,this.classList.add(et+"-"+t)),this.connectedCallback()}changeMessage(e){return this.init(e,this.type,this.middleware)}update(e,t){this.message=e,this.render(t)}render(e){const t=this.message.reactions,i=!(!t||!t.results.length);if(this.classList.toggle("has-no-reactions",!i),!i&&!this.sorted.length)return;this.managers.appReactionsManager.getAvailableReactions();const s=i?t.results:[];s.sort(((e,t)=>{var i,s;return t.count-e.count||(null!==(i=e.chosen_order)&&void 0!==i?i:0)-(null!==(s=t.chosen_order)&&void 0!==s?s:0)})),(0,g.Z)(this.sorted,((e,t,i)=>{const n=e.reactionCount.reaction;s.some((e=>(0,Ve.Z)(e.reaction,n)))||(this.middlewareHelpers.get(e).destroy(),this.middlewareHelpers.delete(e),i.splice(t,1),e.remove())}));const n=s.reduce(((e,t)=>e+t.count),0),a=t&&(!!t.pFlags.can_see_list||this.message.peerId.isUser())&&n<4;if(this.sorted=s.map(((e,i)=>{let s=this.sorted.find((t=>(0,Ve.Z)(t.reactionCount.reaction,e.reaction)));if(!s){const e=this.middleware.create();s=new Je,s.init(this.type,e.get()),this.middlewareHelpers.set(s,e)}(0,p.Z)(s,this,i);const n=t.recent_reactions?t.recent_reactions.filter((t=>(0,Ve.Z)(t.reaction,e.reaction))):[];return s.reactionCount=Object.assign({},e),s.setCanRenderAvatars(a),s.render(this.isPlaceholder),s.renderCounter(),s.renderAvatars(n),s.setIsChosen(),s})),!this.isPlaceholder&&(null==e?void 0:e.length)&&(this.isConnected?this.handleChangedResults(e):this.onConnectCallback=()=>{this.handleChangedResults(e)}),!this.sorted.length&&"block"===this.type){const e=this.parentElement;if(this.remove(),e.classList.contains("document-message")&&!e.childNodes.length)return void e.remove();const t=this.querySelector(".time");t&&e.append(t)}}handleChangedResults(e){this.message.peerId===id.chat.peerId&&e.forEach((e=>{const t=this.sorted.find((t=>(0,Ve.Z)(t.reactionCount.reaction,e.reaction)));null==t||t.fireAroundAnimation()}))}}customElements.define(tt,st);var nt=i(5418);class at{constructor(e,t,i){this.scrollable=e,this.query=t,this.reverse=i}get container(){return this.scrollable.container}getSaved(){return{scrollHeight:this.scrollHeight,scrollTop:this.scrollTop,clientHeight:this.clientHeight}}findElements(){if(!this.query)return[];const{container:e}=this,t=e.getBoundingClientRect(),i=Array.from(e.querySelectorAll(this.query)),s=[];for(const n of i){const i=n.getBoundingClientRect();if((0,He.Z)(n,e,void 0,i,t))s.push({element:n,rect:i});else if(s.length)break}if(!s.length){const e=i[0];e&&s.push({element:e,rect:e.getBoundingClientRect()})}return s}replaceSaved(e,t){if(!this.elements)return;const i=this.elements.findIndex((({element:t})=>e===t));-1!==i&&(this.elements[i].element=t)}findAndSetElements(){this.elements=this.findElements()}save(){this.findAndSetElements(),this._save()}_save(){const{scrollTop:e,scrollHeight:t,clientHeight:i}=this.container;this.scrollHeight=t,this.scrollTop=e,this.clientHeight=i,this.scrollHeightMinusTop=this.reverse?t-e:e}onRestore(e){x.IS_SAFARI&&e&&Ee(this.container)}setScrollTop(e,t){this.scrollable.setScrollTopSilently(this.scrollTop=e),this.onRestore(t)}restore(e){var t;const{scrollTop:i,scrollHeight:s}=this.scrollable;if(this.scrollHeight=s,!this.elements.length)return void this._restore(e);let n;if(n=this.elements[this.elements.length-1],!(null===(t=null==n?void 0:n.element)||void 0===t?void 0:t.parentElement)&&(this.findAndSetElements(),n=this.elements[this.elements.length-1],!n))return void this._restore(e);const{element:a,rect:o}=n,r=a.getBoundingClientRect().bottom-o.bottom;this.setScrollTop(i+r,e)}_restore(e){const{scrollHeightMinusTop:t,scrollable:i}=this,s=this.scrollHeight,n=this.reverse?s-t:t;this.setScrollTop(n,e)}}ge.GO&&(ge.GO.ScrollSaver=at);var ot=i(7401),rt=i(4881);class dt{constructor(e){this.observing=new Map,this.observingQueue=new Map,this.freezedObservingNew=!1,this.observer=new IntersectionObserver((e=>{const t=this.observing;for(let i=0,s=e.length;ie+t),t)}var xt=i(8097);const At=function(e){const t={},i={};return s=>{var n,a;const o="_"+s;return null!==(n=(a="string"==typeof s?t:i)[o])&&void 0!==n?n:a[o]=e(s)}};function _t(e){return e.replace(/\D/g,"")}const Ft={visa:/^4/,mastercard:/^(51|52|53|54|55|222|23|24|25|26|27)/,amex:/^(34|37)/,discover:/^(60|64|65)/,diners:/^(30|38|39)/,diners14:/^(36)/,jcb:/^(35)/,unionpay:/^(62[0-6,8-9]|627[0-6,8-9]|6277[0-7,9]|62778[1-9]|81)/,elo:/^(5067|509|636368|627780)/,mir:/^(220[0-4])/},Dt={visa:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},mastercard:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},amex:{minLength:15,maxLength:15,cvcMaxLength:4,cvcMinLength:3},unionpay:{minLength:13,maxLength:19,cvcMaxLength:3,cvcMinLength:null},diners:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},diners14:{minLength:14,maxLength:14,cvcMaxLength:3,cvcMinLength:null},discover:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},jcb:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},elo:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},mir:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},unknown:{minLength:16,maxLength:16,cvcMaxLength:4,cvcMinLength:3}},Rt=At(((e="")=>{const t=Object.keys(Ft),i=_t(e);let s,n=0;return t.forEach((e=>{const t=Ft[e],a=i.match(t);if(a){const t=a[0];t&&t.length>n&&(s=e,n=t.length)}})),s||"unknown"}));function Bt(e=""){return"diners14"===(t=Rt(e))?"diners":t;var t}var Nt=i(2398),Ot=i(6740),Ut=i(1656),Ht=i(7298),zt=i(9807),jt=i(279),Gt=i(7479),Vt=i(7362);function Kt(e,t,i){const s=new Array(e);return s.fill(t),i?s.map(i):s}const Wt="๏ผ".charCodeAt(0)-"0".charCodeAt(0),$t=/[๏ผ-๏ผ™]/g;function qt(e){return String.fromCharCode(e.charCodeAt(0)-Wt)}function Yt(e){return e.replace($t,qt)}function Qt(e,t){return{type:"optional",result:e,consumed:t}}function Xt(e,t,i){return{type:"required",result:e,consumed:t,partial:i}}function Jt(e,t){return i=>{const s=new RegExp("^".concat(e.source.replace(/^\^/,""))),n=i.match(s),a=t?Qt:Xt;if(n){const e=n[0];return a(e,n.index+e.length)}return a("",i.length)}}const ei=Jt(/1[0-2]|0?[1-9]|0/),ti={digit:function(e){return Jt(/[0-9]/)(Yt(e))},capitalCharacter:function(e){const t=Jt(/\w/)(e);return t.result?Xt(t.result.toUpperCase(),t.consumed):t},month:e=>{const t=ei(Yt(e)),i=_t(t.result);return["0","1"].includes(t.result)&&1===e.length||"0"===t.result&&e.length>=2?Xt(t.result,e.length,!0):Xt(1===i.length?"0"+i:i,t.consumed)},formattingCharacter:e=>t=>{const i=e===t[0]?1:0;return function(e,t){return{type:"formatting",result:e,consumed:t}}(e,i)},optionalPattern:e=>t=>{const i=Jt(e,!0)(t);return i.result?i:Qt("",0)}},ii=ti.digit,si=ti.capitalCharacter,ni=ti.formattingCharacter(" "),ai=ti.optionalPattern(/\d\d/),oi=[ii,ii,ii,ii,ni,ii,ii,ii,ii,ii,ii,ni,ii,ii,ii,ii,ii],ri=[ii,ii,ii,ii,ni,ii,ii,ii,ii,ii,ii,ni,ii,ii,ii,ii],di=new Set(["DZ","AR","AM","AU","AT","AZ","PT","BD","BY","BE","BA","BR","BN","BG","CA","IC","CN","CO","HR","CY","CZ","DK","EC","GB","EE","FO","FI","FR","GE","DE","GR","GL","GU","GG","NL","HU","IN","ID","IL","IT","JP","JE","KZ","KR","FM","KG","LV","LI","LT","LU","MK","MG","PT","MY","MH","MQ","YT","MX","MN","ME","NL","NZ","GB","NO","PK","PH","PL","FM","PT","PR","RE","RU","SA","SF","RS","SG","SK","SI","ZA","ES","LK","SX","VI","VI","SE","CH","TW","TJ","TH","TU","TN","TR","TM","VI","UA","GB","US","UY","UZ","VA","VN","GB","FM"]),li=At((e=>{const t=[];for(let i=0,s=0;i[ti.month,ti.formattingCharacter("/"),ii,ii,ai],cardCvc:e=>ci.cardCvcFromBrand(Rt(e)),cardCvcFromBrand:At((e=>{const t=Dt[e],{cvcMinLength:i,cvcMaxLength:s}=t,n=Kt(i||s,ii);if(i&&i{switch(e){case"US":return Kt(5,ii);case"CA":return x.IS_ANDROID?null:[si,si,si,ni,si,si,si];default:const t=Kt(10,ti.optionalPattern(/\d/));return di.has(e)&&(t[0]=ii),t}}))},hi=ci;function ui(e){return kt(e.map((e=>e.length)),0)}const pi=new RegExp("โ€Ž","g");function fi(e){return e?{type:"invalid",code:e}:null}function mi(e,t={}){const{sanitized:i,minLength:s}=function(e){const t=_t(e),i=Rt(e);return{sanitized:t,brand:i,minLength:Dt[i].minLength}}(e);return function(e,t,i){return e.length>=t?function(e){const t="0".charCodeAt(0),i=e.length%2;let s=0;for(let n=e.length-1;n>=0;--n){const a=i===n%2;let o=e.charCodeAt(n)-t;a&&(o*=2),o>9&&(o-=9),s+=o}return!(s%10)}(e)||"mir"===Rt(e)?null:fi("invalid"):i?null:fi("incomplete")}(i,s,t.ignoreIncomplete)}function gi(e,t={}){const i=e.replace(pi,"").split(/ ?\/ ?/),[s,n=""]=i,[a,o]=[s,n].map((e=>+e)),r=2===n.length?o%100:o;return n.length<2||3===n.length?t.ignoreIncomplete?null:fi("incomplete"):fi(function(e,t,i){const s=new Date(Date.now()),n=e<100?s.getFullYear()%100:s.getFullYear(),a=s.getMonth()+1;return isNaN(e)||isNaN(t)?(null==i?void 0:i.ignoreIncomplete)?null:"incomplete":e-n<0?"invalid_expiry_year_past":e-n>50?"invalid_expiry_year":!(e-n)&&t{const t=yi.get(e.source);t&&t(JSON.parse(e.data))}));class wi extends l.Z{constructor({url:e,sandbox:t}){super(!1),this.onTelegramWebViewEvent=({eventType:e,eventData:t})=>{""===t&&(t=void 0),console.log("onTelegramWebViewEvent",e,t),this.dispatchEvent(e,t)};const i=this.iframe=document.createElement("iframe");i.src=e,t&&i.setAttribute("sandbox",t)}onMount(){yi.set(this.iframe.contentWindow,this.onTelegramWebViewEvent)}destroy(){this.cleanup(),yi.delete(this.iframe.contentWindow)}}function Si(e){const t=new wi(Object.assign(Object.assign({},e),{sandbox:"allow-forms allow-scripts allow-same-origin allow-modals"})),{iframe:i}=t;return i.allow="payment",i.classList.add("payment-verification"),t}class Ci extends S.Z{constructor(e,t){super("popup-payment popup-payment-verification",{closable:!0,overlayClosable:!0,body:!0,title:"Checkout.WebConfirmation.Title"}),this.url=e,this.openPathAfter=t,this.d()}d(){const e=this.telegramWebView=Si({url:this.url});e.addEventListener("web_app_open_tg_link",(e=>{this.dispatchEvent("finish"),this.hide(),this.openPathAfter&&id.openUrl("https://t.me"+e.path_full)})),this.body.append(e.iframe),this.show(),e.onMount()}destroy(){return this.telegramWebView.destroy(),super.destroy()}}var Li=i(6830),Ei=i(5029);class Ii extends E.ZP{constructor(e){super(e),this.options=e,this.onKeyDown=e=>{var t,i;this.lastKeyDown=e.key,null===(i=(t=this.options).onKeyDown)||void 0===i||i.call(t,e)},this.onInput=()=>{var e,t;const i=this.value,s="Backspace"===this.lastKeyDown&&(this.lastTransformed&&this.lastTransformed.value.length||0)-i.length==1,n=this.lastTransformed=function(e){const{value:t,getPattern:i,deleting:s,input:n}=e,a=!s&&!!t.length,o=function(e,t,i={},s){const n=e(t);if(!n)return{value:t,selection:null,autocorrectComplete:!!t};const a=n.length,o=[],r=[];let d=0,l=0,c=0===i.selectionStart?0:null,h=0===i.selectionEnd?0:null;const u=e=>{e>0&&(null===c&&l+1>=i.selectionStart&&(c=ui(o)+(s?r.length:0)),null===h&&l+1>=i.selectionEnd&&(h=ui(o)+(s?r.length:0)),l+=e)};for(;d=t.length)break;r.push(a),++d,u(c)}}return s&&o.push(...r),{value:o.join(""),selection:{selectionStart:null===c||t.length&&i.selectionStart===t.length?ui(o):c,selectionEnd:null===h||t.length&&i.selectionEnd===t.length?ui(o):h},autocorrectComplete:d===a}}(i,t,{selectionStart:n?n.selectionStart:0,selectionEnd:n?n.selectionEnd:0},a),{value:r,selection:d}=o;return{value:r,meta:{autocorrectComplete:o.autocorrectComplete,empty:!r},selection:d}}({value:i,getPattern:this.options.formatMethod,deleting:s,input:this.input}),a=n.value;a!==i&&(this.setValueSilently(a),n.selection&&(this.input.selectionStart=n.selection.selectionStart,this.input.selectionEnd=n.selection.selectionEnd)),this.validateNew(a,{ignoreIncomplete:!0}),null===(t=(e=this.options).onChange)||void 0===t||t.call(e,n)},this.onBlur=()=>{var e;const t=null===(e=this.lastTransformed)||void 0===e?void 0:e.value;t&&this.validateNew(t)},this.validate=()=>this.validateNew(),this.input.addEventListener("keydown",this.onKeyDown),this.input.addEventListener("input",this.onInput),this.input.addEventListener("blur",this.onBlur)}update(){this.onInput()}validateNew(e,t,i){var s,n,a,o,r;let d;if(void 0===e&&(e=null!==(n=null===(s=this.lastTransformed)||void 0===s?void 0:s.value)&&void 0!==n?n:""),void 0===t&&(t={}),d=this.options.validateMethod?null===(o=(a=this.options).validateMethod)||void 0===o?void 0:o.call(a,e,t):function(e,t,i={}){return e.meta.autocorrectComplete||i.ignoreIncomplete?null:fi("incomplete")}(this.lastTransformed,0,t),null==d?void 0:d.code){const e=null===(r=this.options.errorKeys)||void 0===r?void 0:r[d.code];return!i&&this.setState(E.I1.Error,e),!1}return!i&&this.setState(E.I1.Neutral),!0}}function Mi(e,t){const i=()=>{const i=e.every((e=>"validateNew"in e?e.validateNew(void 0,void 0,!0):e.isValid()));t(i)};return e.forEach((e=>{if(e instanceof Ii){const t=e.options.onChange;e.options.onChange=(...e)=>{null==t||t(...e),i()},"update"in e&&e.update()}else e.input.addEventListener("input",i)})),{validate:i}}function Pi(e,t){let i,s;return(e||t)&&(e&&(i=new bi.Z({noPhoneCodes:!0,onCountryChange:()=>{null==s||s.update()},required:!0,autocomplete:"country"})),t&&(s=new Ii({label:"PaymentShippingZipPlaceholder",plainText:!0,inputMode:"numeric",autocomplete:"postal-code",formatMethod:()=>{const{country:e}=i.getSelected(),t=null==e?void 0:e.iso2;return hi.postalCodeFromCountry(t&&t.toUpperCase())}}))),{countryInputField:i,postcodeInputField:s}}const Zi=new Set(["stripe","smartglocal"]);class Ti extends S.Z{constructor(e,t){if(super("popup-payment popup-payment-card",{closable:!0,overlayClosable:!0,body:!0,scrollable:Zi.has(e.native_provider),title:"PaymentCardInfo"}),this.paymentForm=e,this.savedCard=t,Zi.has(e.native_provider))this.d();else{const t=this.telegramWebView=Si({url:e.url});t.addEventListener("payment_form_submit",(t=>{const i={title:t.title,save:!1};this.dispatchEvent("finish",{token:t.credentials,card:i}),this.hide(),e.pFlags.can_save_credentials&&(0,vi.Z)({titleLangKey:"PaymentCardSavePaymentInformation",descriptionLangKey:"PaymentCardSavePaymentInformationInfoLine1",button:{langKey:"Save"}}).then((()=>{i.save=!0}),Ye.Z)})),this.body.append(t.iframe),this.show(),t.onMount()}}destroy(){var e;return null===(e=this.telegramWebView)||void 0===e||e.destroy(),super.destroy()}d(){const e=this.savedCard,t=new Ei.Z({name:"PaymentInfo.Card.Title",noDelimiter:!0,noShadow:!0}),i=JSON.parse(this.paymentForm.native_params.data);let s,n,a=0;const o=new Ii({label:"PaymentCardNumber",plainText:!0,inputMode:"numeric",autocomplete:"cc-number",formatMethod:hi.cardNumber,validateMethod:mi,errorKeys:{invalid:"PaymentCard.Error.Invalid",incomplete:"PaymentCard.Error.Incomplete"},onChange:e=>{(e=>{if(s===e)return;const t=++a;s=e;const i=Ni(e);if(!i)return void(n&&(n.remove(),n=void 0));const r=new Image;r.classList.add("input-field-icon"),(0,Ot.cj)(r,i,!1).then((()=>{a===t&&(n?n.replaceWith(r):o.container.append(r),n=r)}))})(Bt(e.value)),l.update()}});let r;i.need_cardholder_name&&(r=new E.ZP({label:"Checkout.NewCard.CardholderNamePlaceholder",maxLength:255,required:!0,autocomplete:"cc-name"}));const d=new Ii({label:"SecureId.Identity.Placeholder.ExpiryDate",plainText:!0,inputMode:"numeric",autocomplete:"cc-exp",formatMethod:hi.cardExpiry,validateMethod:gi});d.input.addEventListener("input",(()=>{let e=d.value;if(e.length<5)return;const t=e.split("/");4===t[1].length&&(e=[t[0],t[1].slice(2)].join("/"),d.setValueSilently(e))}),{capture:!0});const l=new Ii({labelText:"CVC",plainText:!0,inputMode:"numeric",autocomplete:"cc-csc",name:"cvc",formatMethod:()=>hi.cardCvc(o.value)}),c=(new Li.T(l.container,l.input),[o,d,l,r].filter(Boolean));c.forEach((e=>{const t=t=>{if(!e.value&&"Backspace"===t.key){const t=c[c.indexOf(e)-1];t&&(0,Nt.Z)(t.input,!0)}};if(e instanceof Ii){e.options.onKeyDown=t;const i=e.options.onChange;e.options.onChange=t=>{if(null==i||i(t),document.activeElement===e.input&&t.meta.autocorrectComplete)for(let t=c.indexOf(e),i=c.length;te.container))));const g=!!this.paymentForm.pFlags.can_save_credentials,v=new zt.Z({text:"PaymentCardSavePaymentInformation",checked:!!g}),b=new Gt.ZP({checkboxField:v,subtitleLangKey:g?"PaymentCardSavePaymentInformationInfoLine1":"Checkout.2FA.Text"});g||b.container.classList.add("is-disabled"),(p||t).content.append(b.container),this.scrollable.append(...[t,p].filter(Boolean).map((e=>e.container)));const y=Oi({key:"PaymentInfo.Done",onClick:()=>{return e=this,t=void 0,n=function*(){const e={cardNumber:o.value,expiryFull:d.value,expiryMonth:d.value.split("/")[0],expiryYear:d.value.split("/")[1],cvc:l.value,cardholderName:null==r?void 0:r.value,country:null==f?void 0:f.value,zip:null==m?void 0:m.value,save:null==v?void 0:v.checked},t=this.paymentForm.native_provider;let s;if("stripe"===t){const t=new URL("https://api.stripe.com/v1/tokens");t.search=new URLSearchParams({"card[number]":e.cardNumber,"card[exp_month]":e.expiryMonth,"card[exp_year]":e.expiryYear,"card[cvc]":e.cvc,"card[address_zip]":e.zip,"card[address_country]":e.country,"card[name]":e.cardholderName}).toString();const n=yield fetch(t.toString(),{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/x-www-form-urlencoded",Authorization:`Bearer ${i.publishable_key}`}});s=yield n.json()}else if("smartglocal"===t){const t={card:{number:e.cardNumber.replace(/[^\d]+/g,""),expiration_month:e.expiryMonth,expiration_year:e.expiryYear,security_code:e.cvc.replace(/[^\d]+/g,"")}},n="https://tgb.smart-glocal.com/cds/v1/tokenize/card",a=yield fetch(n,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json","X-PUBLIC-TOKEN":i.public_token},body:JSON.stringify(t)});s={type:"card",token:(yield a.json()).data.token}}this.dispatchEvent("finish",{token:s,card:e}),this.hide()},new((s=void 0)||(s=Promise))((function(i,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?i(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}d((n=n.apply(e,t||[])).next())}));var e,t,s,n}});Mi([o,r,d,l,f,m].filter(Boolean),(e=>{y.disabled=!e})),e&&(o.value=e.cardNumber,d.value=e.expiryFull,l.value=e.cvc,r&&(r.value=e.cardholderName),f&&(f.value=e.country),m&&(m.value=e.zip)),this.body.append(this.btnConfirmOnEnter=y),this.show(),o.validateNew(void 0,void 0,!0)||(0,Nt.Z)(o.input)}}class ki extends S.Z{constructor(e,t){super("popup-payment popup-payment-card-confirmation",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:"Checkout.PasswordEntry.Title"});const i=new Ei.Z({noDelimiter:!0,noShadow:!0,caption:"Checkout.PasswordEntry.Text",captionArgs:[e]}),s=new Li.Z({labelText:t.hint});i.content.append(s.container),this.scrollable.append(i.container);const n=()=>{a.disabled=!s.value,s.setState(E.I1.Neutral)};s.input.addEventListener("input",n);const a=Oi({key:"Checkout.PasswordEntry.Pay",onClick:()=>{return e=this,i=void 0,a=function*(){try{const e=yield this.managers.passwordManager.getInputCheckPassword(s.value,t),i=yield this.managers.apiManager.invokeApi("account.getTmpPassword",{password:e,period:60});this.dispatchEvent("finish",i),this.hide()}catch(e){throw"PASSWORD_HASH_INVALID"===e.type&&(e.handled=!0,s.setError("PASSWORD_HASH_INVALID")),e}},new((n=void 0)||(n=Promise))((function(t,s){function o(e){try{d(a.next(e))}catch(e){s(e)}}function r(e){try{d(a.throw(e))}catch(e){s(e)}}function d(e){var i;e.done?t(e.value):(i=e.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(e,i||[])).next())}));var e,i,n,a}});this.body.append(this.btnConfirmOnEnter=a),n(),this.show(),(0,Nt.Z)(s.input)}}var xi=i(1171),Ai=i(709);class _i extends S.Z{constructor(e,t,i){super("popup-payment popup-payment-shipping",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:"PaymentShippingInfo"}),this.paymentForm=e,this.inputInvoice=t,this.focus=i,this.d()}d(){const e=this.paymentForm.invoice,t=this.paymentForm.saved_info;let i,s,n,a,o,r,d,l,c,h,u;if(e.pFlags.shipping_address_requested){i=new Ei.Z({name:"PaymentShippingAddress",noDelimiter:!0,noShadow:!0}),s=new E.ZP({label:"PaymentShippingAddress1Placeholder",maxLength:64,required:!0}),n=new E.ZP({label:"PaymentShippingAddress2Placeholder",maxLength:64}),a=new E.ZP({label:"PaymentShippingCityPlaceholder",maxLength:64,required:!0}),o=new E.ZP({label:"PaymentShippingStatePlaceholder",maxLength:64});const e=Pi(!0,!0);r=e.countryInputField,d=e.postcodeInputField,i.content.append(...[s,n,a,o,r,d].filter(Boolean).map((e=>e.container)))}if([e.pFlags.name_requested,e.pFlags.email_requested,e.pFlags.phone_requested].includes(!0)){l=new Ei.Z({name:"PaymentShippingReceiver",noDelimiter:!0,noShadow:!0});const t=()=>{const e=h.value,t=(0,xi.Z)(e);return!(!t||t[0].length!==e.length)},i=()=>!!u.value.match(/\d/);e.pFlags.name_requested&&(c=new E.ZP({label:"PaymentShippingName",maxLength:256,required:!0})),e.pFlags.email_requested&&(h=new E.ZP({label:"PaymentShippingEmailPlaceholder",maxLength:64,required:!0,validate:t})),e.pFlags.phone_requested&&(u=new Ai.Z({required:!0,validate:i})),l.content.append(...[c,h,u].filter(Boolean).map((e=>e.container)))}const p=new zt.Z({text:"PaymentShippingSave",checked:!0}),f=new Gt.ZP({checkboxField:p,subtitleLangKey:"PaymentShippingSaveInfo"});(l||i).content.append(f.container),this.scrollable.append(...[i,l].filter(Boolean).map((e=>e.container)));const m=Oi({key:"PaymentInfo.Done",onClick:()=>{return e=this,t=void 0,l=function*(){const e=r&&r.getSelected().country,t={_:"paymentRequestedInfo",shipping_address:e&&{_:"postAddress",street_line1:s.value,street_line2:n.value,city:a.value,state:o.value,country_iso2:null==e?void 0:e.iso2,post_code:d.value},name:null==c?void 0:c.value,email:null==h?void 0:h.value,phone:null==u?void 0:u.value};try{const e=yield this.managers.appPaymentsManager.validateRequestedInfo(this.inputInvoice,t,null==p?void 0:p.checked);this.dispatchEvent("finish",{shippingAddress:t,requestedInfo:e}),this.hide()}catch(e){const t={ADDRESS_STREET_LINE1_INVALID:s,ADDRESS_STREET_LINE2_INVALID:n,ADDRESS_COUNTRY_INVALID:r,ADDRESS_CITY_INVALID:a,ADDRESS_STATE_INVALID:o,ADDRESS_POSTCODE_INVALID:d,REQ_INFO_NAME_INVALID:c,REQ_INFO_EMAIL_INVALID:h,REQ_INFO_PHONE_INVALID:u}[e.type];throw t&&(t.setError(),e.handled=!0),e}},new((i=void 0)||(i=Promise))((function(s,n){function a(e){try{r(l.next(e))}catch(e){n(e)}}function o(e){try{r(l.throw(e))}catch(e){n(e)}}function r(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(a,o)}r((l=l.apply(e,t||[])).next())}));var e,t,i,l}});if(this.body.append(this.btnConfirmOnEnter=m),t){const e=t.shipping_address;e&&(s.value=e.street_line1,n.value=e.street_line2,a.value=e.city,o.value=e.state,r.selectCountryByIso2(e.country_iso2),d.value=e.post_code),t.name&&c&&(c.value=t.name),t.email&&h&&(h.value=t.email),t.phone&&u&&(u.value=t.phone)}const{validate:g}=Mi([s,n,a,o,r,d,c,h,u].filter(Boolean),(e=>{m.disabled=!e}));let v;g(),this.show(),v=this.focus?{name:c,email:h,phone:u}[this.focus]:s,v&&(0,Nt.Z)(v.input)}}var Fi=i(1218);class Di extends S.Z{constructor(e,t,i){super("popup-payment popup-payment-shipping-methods",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:"PaymentShippingMethod"}),this.paymentForm=e,this.requestedInfo=t,this.shippingOption=i,this.d()}d(){const e=new Ei.Z({name:"PaymentCheckoutShippingMethod",noDelimiter:!0,noShadow:!0}),t=this.requestedInfo.shipping_options.map((e=>new Gt.ZP({radioField:new Fi.Z({text:e.title,name:"shipping-method",value:e.id}),subtitle:(0,Pt.Z)(kt(e.prices.map((({amount:e})=>+e)),0),this.paymentForm.invoice.currency)})));let i;const s=(0,Gt.De)(t,(e=>{i=e}));this.shippingOption?t.find((e=>e.radioField.input.value===this.shippingOption.id)).radioField.checked=!0:t[0].radioField.checked=!0,e.content.append(s),this.scrollable.append(e.container);const n=Oi({key:"PaymentInfo.Done",onClick:()=>{this.dispatchEvent("finish",this.requestedInfo.shipping_options.find((e=>e.id===i))),this.hide()}});this.body.append(this.btnConfirmOnEnter=n),this.show()}}var Ri=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Bi=["amex","card","diners","discover","jcb","mastercard","visa","unionpay","mir","logo"];function Ni(e){if(Bi.includes(e))return`assets/img/${e}.svg`}function Oi(e){var t,i;const s=null!==(t=e.textEl)&&void 0!==t?t:new L.ZP.IntlElement({key:null!==(i=e.key)&&void 0!==i?i:"PaymentInfo.Done"}),n=s.key,a=(0,Ue.Z)("btn-primary btn-color-primary payment-item-pay");return a.append(s.element),(0,C.fc)(a,(()=>Ri(this,void 0,void 0,(function*(){const t=e.onClick();if(!(t instanceof Promise))return;const i=(0,jt.y)(a),o=(0,Ut.Z)([a],!0);s.compareAndUpdate({key:"PleaseWait"});try{yield t}catch(e){e.handled||console.error("payment button error",e),o(),s.compareAndUpdate({key:n}),i.remove()}})))),a}class Ui extends S.Z{constructor(e,t,i,s){super("popup-payment",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:!0}),this.message=e,this.inputInvoice=t,this.paymentForm=i,this.isReceipt=s,this.tipButtonsMap=new Map,this.d().catch((e=>{console.error("payment popup error",e),this.hide()}))}d(){var e,t,i;return Ri(this,void 0,void 0,(function*(){this.element.classList.add("is-loading"),this.show();let s=!1;const n=()=>{s||(s=!0,Te&&Te.hide(),this.hide())};let{paymentForm:a,message:o}=this;o&&this.listenerSetter.add(d.Z)("payment_sent",(({peerId:e,mid:t})=>{o.peerId===e&&o.mid===t&&n()}));const r=null==o?void 0:o.media,l=null!==(e=this.isReceipt)&&void 0!==e?e:r?!!r.receipt_msg_id||"messageExtendedMedia"===(null===(t=r.extended_media)||void 0===t?void 0:t._):"payments.paymentReceipt"===a._,c=r?r.pFlags.test:a.invoice.pFlags.test,h=r?r.photo:a.photo,u=r?r.title:a.title,p=r?r.description:a.description;(0,L.$d)(this.title,l?"PaymentReceipt":"PaymentCheckout"),c&&this.title.append(" (Test)");const m="payment-item",g=document.createElement("div");g.classList.add(m);const v=m+"-details",b=document.createElement("div");let y;b.classList.add(v),h&&(y=document.createElement("div"),y.classList.add(v+"-photo","media-container-contain"),(0,K.Z)({photo:h,container:y,boxWidth:100,boxHeight:100,size:{_:"photoSizeEmpty",type:""}}),b.append(y));const w=v+"-lines",S=document.createElement("div");S.classList.add(w);const E=document.createElement("div");E.classList.add(w+"-title");const I=document.createElement("div");I.classList.add(w+"-description");const M=document.createElement("div");M.classList.add(w+"-bot-name"),S.append(E,I,M),(0,F.Z)(E,(0,B.Z)(u)),(0,F.Z)(I,(0,B.Z)(p));const P=new N.Z;M.append(P.element),b.append(S),g.append(b),this.scrollable.append(g);const Z=document.createElement("div");Z.classList.add(m+"-preloader-container"),(0,jt.y)(Z,!0),this.scrollable.container.append(Z);const T=this.inputInvoice;a||(a=l?yield this.managers.appPaymentsManager.getPaymentReceipt(o.peerId,r.receipt_msg_id||T.msg_id):yield this.managers.appPaymentsManager.getPaymentForm(T),this.paymentForm=a);let k=a.saved_info||a.info;const x=null===(i=a.saved_credentials)||void 0===i?void 0:i[0];let[A,_,D]=yield Promise.all([!l&&k&&this.managers.appPaymentsManager.validateRequestedInfo(T,k),x&&this.managers.passwordManager.getState(),(0,Vt.Z)({peerId:a.provider_id.toPeerId()})]);yield P.update({peerId:a.bot_id.toPeerId()}),Z.remove(),this.element.classList.remove("is-loading");const R=(e,t)=>(0,Pt.Z)(e,U,t),{invoice:O}=a,U=O.currency,z=O.pFlags.recurring&&!l;yield P.update({peerId:a.bot_id.toPeerId()});const j=z?yield(0,Vt.Z)({peerId:a.bot_id.toPeerId()}):void 0;Z.remove(),this.element.classList.remove("is-loading");const G=()=>{const e=document.createElement("div");e.classList.add(V+"-price");const t=document.createElement("span"),i=document.createElement("span");return e.append(t,i),{label:e,left:t,right:i}},V=m+"-prices",W=document.createElement("div");W.classList.add(V);const $=e=>e.map((e=>{const{amount:t,label:i}=e,s=G();s.left.textContent=i;const n=R(t);return s.right.textContent=n,s.label})),q=$(O.prices);let Y=()=>0,Q=0;const X=()=>{const e=R(te+Y()+Q);ee.right.textContent=e,J.compareAndUpdate({key:"PaymentCheckoutPay",args:[e]})},J=new L.ZP.IntlElement,ee=G();ee.label.classList.add("is-total"),(0,L.$d)(ee.left,"PaymentTransactionTotal");const te=kt(O.prices.map((({amount:e})=>+e)),0),ie=void 0!==O.max_tip_amount&&!l||!!a.tip_amount;if(ie){const e=m+"-tips",t=Zt.Z[U];Y=()=>+i().replace(/\D/g,"");const i=()=>r.value,s=()=>{const e=(0,xt.Z)(i(),`500 ${Tt.Bf} ${Tt.bt}`);r.style.width=e+"px"},n=e=>{e=Math.min(+e,+O.max_tip_amount);const t=R(e,!0);r.value=t,document.activeElement===r&&(0,Nt.Z)(r),g&&g();const i=this.tipButtonsMap.get(e);i&&i.classList.add("active"),s(),X()},o=G();(0,L.$d)(o.left,l?"PaymentTip":"PaymentTipOptional");const r=document.createElement("input");r.type="tel",r.classList.add("input-clear",e+"-input"),o.right.append(r),l?o.label.classList.add("disable-hover"):o.label.style.cursor="text",o.label.addEventListener("mousedown",(e=>{(0,Be.Z)(e.target,r)||(0,Nt.Z)(r)}));const d=r instanceof HTMLInputElement?1:2,c=()=>{p?--p:(p=d,(0,Nt.Z)(r))},h=()=>{setTimeout((()=>{p=d,(0,Nt.Z)(r),document.addEventListener("selectionchange",c)}),0)},u=()=>{r.addEventListener("focus",h,{once:!0}),document.removeEventListener("selectionchange",c)};let p;r.addEventListener("focusout",u),u(),r.addEventListener("input",(()=>{n(Y())}));const f=[t.symbol,t.space_between?" ":""];let g;if(t.symbol_left||f.reverse(),o.right[t.symbol_left?"prepend":"append"](f.join("")),q.push(o.label),l)n(a.tip_amount);else{const t=document.createElement("div");t.classList.add(e);const i=e+"-tip",s=O.suggested_tip_amounts.map((e=>{const t=(0,Ue.Z)(i,{noRipple:!0});return t.textContent=R(e),this.tipButtonsMap.set(+e,t),t}));g=()=>{const e=t.querySelector(".active");e&&e.classList.remove("active")},(0,C.fc)(t,(e=>{const t=(0,be.Z)(e.target,i);if(!t)return;let s=0;if(t.classList.contains("active"))t.classList.remove("active");else{g(),t.classList.add("active");for(const[e,i]of this.tipButtonsMap)if(i===t){s=e;break}}n(s)})),n(0),t.append(...s),q.push(t)}}else X();q.push(ee.label),W.append(...q),g.append(W);const se=(e,t)=>Ri(this,void 0,void 0,(function*(){const i=document.createElement("img");i.classList.add("media-photo"),yield(0,Ot.cj)(i,Ni(t));let s=e.media;s?(0,H.Z)(s,i):(s=e.createMedia("small"),s.classList.add("media-container-cover"),s.append(i)),e.container.classList.remove("row-with-icon")})),ne=e=>{e.titleLangKey&&(e.subtitleLangKey=e.titleLangKey),e.noWrap=!0;const t=new Gt.ZP(e);return t.container.classList.add(m+"-row"),e.titleLangKey&&t.subtitle.classList.add("hide"),t},ae=(e,t)=>{if(e.title.textContent=t,!t){const t=L.ZP.weakMap.get(e.subtitle.firstElementChild);e.title.append((0,L.ag)(t.key))}e.subtitle.classList.toggle("hide",!t)},oe=e=>{let t,i,s;"title"in e?(t=e.title.split(" ").shift(),i=e.title,s=e.icon):(t=Bt(e.cardNumber),i=t+" *"+e.cardNumber.split(" ").pop()),ce.title.classList.remove("tgico","tgico-card_outline"),se(ce,s||t.toLowerCase()),ae(ce,i)},re=()=>{new Ti(a,de).addEventListener("finish",(({token:e,card:t})=>{le=e,de=t,oe(t)}))};let de,le;const ce=ne({titleLangKey:"PaymentCheckoutMethod",clickable:l?void 0:re,icon:"card_outline"});ce.container.classList.add(m+"-method-row"),x?oe(x):a.credentials_title&&oe({title:a.credentials_title});const he=ne({title:D,subtitleLangKey:"PaymentCheckoutProvider"}),ue=new f.Z;let pe,fe,me,ge,ve,ye,Se,Ce;ue.classList.add("avatar-32"),he.createMedia("small").append(ue),ue.updateWithOptions({peerId:a.provider_id.toPeerId()});const Le=O.pFlags.shipping_address_requested?e=>{if(!e)return ve.subtitle.classList.add("hide"),void(0,H.Z)(ve.title,(0,L.ag)("PaymentShippingAddress"));const t=e.shipping_address;ae(pe,[t.city,t.street_line1,t.street_line2].filter(Boolean).join(", ")),ve.container.classList.toggle("hide",!A&&!l)}:void 0,Ee=e=>{Le&&Le(e),fe&&ae(fe,e.name),me&&ae(me,e.email),ge&&ae(ge,e.phone&&"+"+(0,Ae.u)(e.phone).formatted)};if(l||(Se=e=>{new _i(a,T,e).addEventListener("finish",(({shippingAddress:e,requestedInfo:t})=>{A=t,k=a.saved_info=e,Ee(e)}))}),O.pFlags.shipping_address_requested){const e=e=>{const i=new at(this.scrollable,void 0,!0);if(i.save(),t&&t.forEach((e=>e.remove())),!e)return Q=0,X(),i.restore(),void this.onContentUpdate();ye=e,ae(ve,e.title),Q=kt(e.prices.map((({amount:e})=>+e)),0),t=$(e.prices);let s=ee.label;ie&&(s=s.previousElementSibling,l||(s=s.previousElementSibling)),t.forEach((e=>s.parentElement.insertBefore(e,s))),X(),i.restore(),this.onContentUpdate()};let t;pe=ne({icon:"location",titleLangKey:"PaymentShippingAddress",clickable:!l&&Se.bind(null,void 0)}),ve=ne({icon:"shipping",titleLangKey:"PaymentCheckoutShippingMethod",clickable:!l&&(Ce=()=>{new Di(a,A,ye).addEventListener("finish",(t=>{e(t)}))})}),ve.container.classList.add("hide");const i=a.shipping;i&&e(i)}O.pFlags.name_requested&&(fe=ne({icon:"newprivate",titleLangKey:"PaymentCheckoutName",clickable:!l&&Se.bind(null,"name")})),O.pFlags.email_requested&&(me=ne({icon:"mention",titleLangKey:"PaymentShippingEmailPlaceholder",clickable:!l&&Se.bind(null,"email")})),O.pFlags.phone_requested&&(ge=ne({icon:"phone",titleLangKey:"PaymentCheckoutPhoneNumber",clickable:!l&&Se.bind(null,"phone")})),k&&Ee(k);const Ie=[ce,he,pe,ve,fe,me,ge].filter(Boolean),Me=z&&new zt.Z({text:"Payments.Recurrent.Accept",textArgs:[(0,ft.ZP)(O.recurring_terms_url),j]}),Pe=z&&ne({checkboxField:Me}),Ze=z?[document.createElement("hr"),Pe.container]:[];let Te,ke;this.scrollable.append(...[document.createElement("hr"),...Ie.map((e=>e.container)),...Ze].filter(Boolean));const xe=()=>{_e.disabled=!(!Me||Me.checked)};let _e;_e=Oi(l?{onClick:()=>this.hide(),key:"Done"}:{onClick:()=>{const e=O.pFlags.name_requested&&!(null==k?void 0:k.name)?"name":O.pFlags.email_requested&&!(null==k?void 0:k.email)?"email":O.pFlags.phone_requested&&!(null==k?void 0:k.phone)?"phone":void 0;if(O.pFlags.shipping_address_requested){if(!A)return void Se();if(!ye)return void Ce()}else if(e)return void Se(e);return de||ke?Promise.resolve().then((()=>Ri(this,void 0,void 0,(function*(){const e=ke?{_:"inputPaymentCredentialsSaved",id:x.id,tmp_password:ke.tmp_password}:{_:"inputPaymentCredentials",data:{_:"dataJSON",data:JSON.stringify(le.token?le:{type:le.type,id:le.id})},pFlags:{save:de.save||void 0}};try{const t=yield this.managers.appPaymentsManager.sendPaymentForm(T,a.form_id,null==A?void 0:A.id,null==ye?void 0:ye.id,e,Y());"payments.paymentResult"===t._?n():(Te=new Ci(t.url,!r.extended_media),Te.addEventListener("finish",(()=>{Te=void 0,n()})),yield new Promise(((e,t)=>{Te.addEventListener("close",(()=>{if(Te=void 0,s)e();else{const e=new Error("payment not finished");e.handled=!0,t(e)}}))})))}catch(e){throw"BOT_PRECHECKOUT_TIMEOUT"===e.type?((0,we.bC)({langPackKey:"Error.AnError"}),e.handled=!0):"TMP_PASSWORD_INVALID"===e.type&&(_=ke=void 0,(0,C.tH)(_e),e.handled=!0),e}})))):x?void Promise.resolve(null!=_?_:this.managers.passwordManager.getState()).then((e=>{new ki(x.title,e).addEventListener("finish",(e=>{_=void 0,ke=e,(0,C.tH)(_e);const t=e.valid_until-(0,Ht.Z)(!0)-5;setTimeout((()=>{ke===e&&(ke=void 0)}),1e3*t)}))})):void re()},textEl:J}),xe(),Me&&Me.input.addEventListener("change",xe),this.body.append(this.btnConfirmOnEnter=_e),this.onContentUpdate()}))}}var Hi=i(8487),zi=i(13),ji=i(9259),Gi=i(3228);class Vi{constructor(e,t,i,s,n=t){this.sizes=e,this.maxWidth=t,this.minWidth=i,this.spacing=s,this.maxHeight=n,this.count=e.length,this.ratios=Vi.countRatios(e),this.proportions=Vi.countProportions(this.ratios),this.averageRatio=kt(this.ratios,1)/this.count,this.maxSizeRatio=t/this.maxHeight}layout(){return this.count?this.count>=5||this.ratios.find((e=>e>2))?new Ki(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:11},{geometry:{x:0,y:t+this.spacing,width:e,height:t},sides:14}]}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:13},{geometry:{x:e+this.spacing,y:0,width:e,height:t},sides:7}]}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),i=this.maxWidth-t-this.spacing,s=Math.min(this.maxHeight,Math.round(Math.min(i/this.ratios[0],t/this.ratios[1])));return[{geometry:{x:0,y:0,width:i,height:s},sides:13},{geometry:{x:i+this.spacing,y:0,width:t,height:s},sides:7}]}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]))),i=e-t-this.spacing,s=Math.max(this.minWidth,Math.round(Math.min((this.maxWidth-this.spacing)/2,Math.min(t*this.ratios[2],i*this.ratios[1])))),n=Math.min(Math.round(e*this.ratios[0]),this.maxWidth-this.spacing-s);return[{geometry:{x:0,y:0,width:n,height:e},sides:13},{geometry:{x:n+this.spacing,y:0,width:s,height:i},sides:3},{geometry:{x:n+this.spacing,y:i+this.spacing,width:s,height:t},sides:6}]}layoutThreeTopAndOther(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],.66*(this.maxHeight-this.spacing))),i=(this.maxWidth-this.spacing)/2,s=Math.min(this.maxHeight-t-this.spacing,Math.round(Math.min(i/this.ratios[1],i/this.ratios[2]))),n=e-i-this.spacing;return[{geometry:{x:0,y:0,width:e,height:t},sides:11},{geometry:{x:0,y:t+this.spacing,width:i,height:s},sides:12},{geometry:{x:i+this.spacing,y:t+this.spacing,width:n,height:s},sides:6}]}layoutFourTopAndOther(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],.66*(this.maxHeight-this.spacing))),i=Math.round((this.maxWidth-2*this.spacing)/(this.ratios[1]+this.ratios[2]+this.ratios[3])),s=Math.max(this.minWidth,Math.round(Math.min(.4*(this.maxWidth-2*this.spacing),i*this.ratios[1]))),n=Math.round(Math.max(Math.max(1*this.minWidth,.33*(this.maxWidth-2*this.spacing)),i*this.ratios[3])),a=e-s-n-2*this.spacing,o=Math.min(this.maxHeight-t-this.spacing,i);return[{geometry:{x:0,y:0,width:e,height:t},sides:11},{geometry:{x:0,y:t+this.spacing,width:s,height:o},sides:12},{geometry:{x:s+this.spacing,y:t+this.spacing,width:a,height:o},sides:4},{geometry:{x:s+this.spacing+a+this.spacing,y:t+this.spacing,width:n,height:o},sides:6}]}layoutFourLeftAndOther(){const e=this.maxHeight,t=Math.round(Math.min(e*this.ratios[0],.6*(this.maxWidth-this.spacing))),i=Math.round((this.maxHeight-2*this.spacing)/(1/this.ratios[1]+1/this.ratios[2]+1/this.ratios[3])),s=Math.round(i/this.ratios[1]),n=Math.round(i/this.ratios[2]),a=e-s-n-2*this.spacing,o=Math.max(this.minWidth,Math.min(this.maxWidth-t-this.spacing,i));return[{geometry:{x:0,y:0,width:t,height:e},sides:13},{geometry:{x:t+this.spacing,y:0,width:o,height:s},sides:3},{geometry:{x:t+this.spacing,y:s+this.spacing,width:o,height:n},sides:2},{geometry:{x:t+this.spacing,y:s+n+2*this.spacing,width:o,height:a},sides:6}]}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 Ki{constructor(e,t,i,s,n,a=4*i/3){this.averageRatio=t,this.maxWidth=i,this.minWidth=s,this.spacing=n,this.maxHeight=a,this.ratios=Ki.cropRatios(e,t),this.count=e.length}static cropRatios(e,t){return e.map((e=>t>1.1?(0,Gi.Z)(e,1,2.75):(0,Gi.Z)(e,.6667,1)))}layout(){const e=new Array(this.count),t=[],i=(e,t)=>{const i=kt(this.ratios.slice(e,e+t),0);return(this.maxWidth-(t-1)*this.spacing)/i},s=e=>{const s=[];let n=0;for(const t of e)s.push(i(n,t)),n+=t;t.push({lineCounts:e,heights:s})};for(let e=1;e!==this.count;++e){const t=this.count-e;e>3||t>3||s([e,t])}for(let e=1;e!==this.count-1;++e)for(let t=1;t!==this.count-e;++t){const i=this.count-e-t;e>3||t>(this.averageRatio<.85?4:3)||i>3||s([e,t,i])}for(let e=1;e!==this.count-1;++e)for(let t=1;t!==this.count-e;++t)for(let i=1;i!==this.count-e-t;++i){const n=this.count-e-t-i;e>3||t>3||i>3||n>3||s([e,t,i,n])}let n=null,a=0;for(const e of t){const{heights:t,lineCounts:i}=e,s=i.length,o=kt(t,0)+this.spacing*(s-1),r=Math.min(...t),d=(Math.max(...t),r{for(let e=1;e!==s;++e)if(i[e-1]>i[e])return 1.5;return 1})(),c=Math.abs(o-this.maxHeight)*d*l;(!n||c2&e.sides)),s=i.geometry.width+i.geometry.x,n=t.find((e=>4&e.sides)),a=n.geometry.height+n.geometry.y,o=e.container;o.style.width=s+"px",o.style.height=a+"px";const r=o.children;t.forEach((({geometry:t,sides:i},n)=>{let d;if(d=r[n],d||(d=document.createElement("div"),o.append(d)),d.classList.add("album-item","grouped-item"),d.style.width=t.width/s*100+"%",d.style.height=t.height/a*100+"%",d.style.top=t.y/a*100+"%",d.style.left=t.x/s*100+"%",8&i&&1&i&&(d.style.borderTopLeftRadius="inherit"),8&i&&4&i&&(d.style.borderBottomLeftRadius="inherit"),2&i&&1&i&&(d.style.borderTopRightRadius="inherit"),2&i&&4&i&&(d.style.borderBottomRightRadius="inherit"),e.forMedia){const e=document.createElement("div");e.classList.add("album-item-media"),d.append(e)}}))}var $i=i(6131);function qi({messages:e,attachmentDiv:t,middleware:i,uploading:s,lazyLoadQueue:n,isOut:a,chat:r,loadPromises:l,autoDownload:c,managers:h=d.Z.managers,animationGroup:u}){const p=[];for(const t of e){const e=(0,vt.Z)(t),i="photo"===e._?(0,j.Z)(e,480,480):{w:e.w,h:e.h};p.push({size:i,media:e,message:t})}Wi({container:t,items:p.map((e=>({w:e.size.w,h:e.size.h}))),maxWidth:o.Z.active.album.width,minWidth:100,spacing:2,forMedia:!0});const{width:f,height:m}=t.style,g=parseInt(f),v=parseInt(m);p.forEach(((e,s)=>{var o;const{size:r,media:d,message:p}=e,f=!!(null===(o=p.media.pFlags)||void 0===o?void 0:o.spoiler),m=t.children[s];m.dataset.mid=""+p.mid,m.dataset.peerId=""+p.peerId;const b=m.firstElementChild;let y;if(y="photo"===d._?(0,K.Z)({photo:d,message:p,container:b,boxWidth:0,boxHeight:0,isOut:a,lazyLoadQueue:n,middleware:i,size:r,loadPromises:l,autoDownloadSize:c.photo,managers:h}):(0,$.Z)({doc:d,container:b,message:p,boxWidth:0,boxHeight:0,withTail:!1,isOut:a,lazyLoadQueue:n,middleware:i,loadPromises:l,autoDownload:c,managers:h,noAutoplayAttribute:f}),y&&(null==l||l.push(y)),f){const e=(y||Promise.resolve()).then((()=>{return e=this,t=void 0,n=function*(){if(!i())return;const{width:e,height:t}=m.style,s=+e.slice(0,-1)/100*g,n=+t.slice(0,-1)/100*v,a=yield(0,$i.ZP)({media:d,animationGroup:u,middleware:i,width:s,height:n});i()&&b.append(a)},new((s=void 0)||(s=Promise))((function(i,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?i(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}d((n=n.apply(e,t||[])).next())}));var e,t,s,n}));null==l||l.push(e)}}))}var Yi=i(296),Qi=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))},Xi=i(3552),Ji=i(4277);class es extends Xi._{init(e){return t=this,i=void 0,n=function*(){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);const t=yield this.managers.appPollsManager.getPoll(e.media.poll.id);this.setTitle(t.poll.pFlags.quiz?"PollResults.Title.Quiz":"PollResults.Title.Poll");const i=document.createElement("h3");(0,F.Z)(i,(0,B.Z)(t.poll.question));const s=t.results.results.map((e=>e.voters/t.results.total_voters*100));ss(s);const n=document.createDocumentFragment();t.results.results.forEach(((i,o)=>{if(!i.voters)return;const r=document.createElement("hr"),d=t.poll.answers[o],l=document.createElement("div");l.classList.add("poll-results-answer");const c=document.createElement("div");(0,F.Z)(c,(0,B.Z)(d.text));const h=document.createElement("div");h.innerText=Math.round(s[o])+"%",l.append(c,h);const u=Ji.default.createChatList();u.classList.add("poll-results-voters"),Ji.default.setListClickListener(u,(()=>{a.ZP.onCloseBtnClick()}),void 0,!0),u.style.minHeight=48*Math.min(i.voters,4)+"px",n.append(r,l,u);let p,f=4,m=!1,g=Math.max(0,i.voters-4);const v=()=>{m||(m=!0,this.managers.appPollsManager.getVotes(e,d.option,p,f).then((e=>{e.votes.forEach((e=>{const{dom:t}=Ji.default.addDialogNew({peerId:e.user_id.toPeerId(!1),container:u,rippleEnabled:!1,meAsSaved:!1,avatarSize:"small"});t.lastMessageSpan.parentElement.remove()})),p&&(g=Math.max(0,g-e.votes.length),g&&b.lastElementChild.replaceWith((0,L.ag)("PollResults.LoadMore",[Math.min(20,g)]))),p=e.next_offset,f=20,g&&e.votes.length||b.remove()})).finally((()=>{m=!1})))},b=(0,Ue.Z)("poll-results-more btn btn-primary btn-transparent",{icon:"down"});b.addEventListener("click",v),b.append((0,L.ag)("PollResults.LoadMore",[Math.min(20,g)])),n.append(b),v()})),this.resultsDiv.append(i,n),a.ZP.toggleSidebar(!0).then((()=>{}))},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}}var ts=i(5157);let is=0;const ss=e=>{const t=e.reduce(((e,t)=>e+Math.round(t)),0);if(t>100){const i=t-100,s=e.length;for(let t=0;t=.5&&si&&(i=s,t=n)}if(-1===t)return;e[t]+=1-i}}};d.Z.addEventListener("poll_update",(({poll:e,results:t})=>{Array.from(document.querySelectorAll(`poll-element[poll-id="${e.id}"]`)).forEach((i=>{i.isClosed=!!e.pFlags.closed,i.performResults(t,e.chosenIndexes)}))})),o.Z.addEventListener("resize",(()=>{ls.setMaxLength(),ls.resizePolls()})),o.Z.addEventListener("changeScreen",(()=>{ls.setMaxLength()}));const ns=(e,t,i)=>{e.classList.remove("active"),clearTimeout(i),setTimeout((()=>{t(),e.remove(),as===e&&os===t&&rs===i&&(as=os=null,rs=0)}),200)};let as,os,rs,ds=!1;class ls extends HTMLElement{constructor(){super(...arguments),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=xe.Z.width<=360?xe.Z.width-120:o.Z.active.poll.width;this.MAX_LENGTH=e+9+this.MAX_OFFSET+-13.7}static resizePolls(){this.MAX_LENGTH&&Array.from(document.querySelectorAll("poll-element.is-voted")).forEach((e=>{e.svgLines.forEach(((t,i)=>{e.setLineProgress(i,1)}))}))}render(){return e=this,t=void 0,s=function*(){is||(is=document.getElementById("poll-line").getTotalLength(),ls.setMaxLength());const{poll:e,results:t}=this.message.media;let i;this.message.pFlags.is_scheduled&&this.classList.add("disable-hover"),e.pFlags&&(this.isPublic=!!e.pFlags.public_voters,this.isQuiz=!!e.pFlags.quiz,this.isClosed=!!e.pFlags.closed,this.isMultiple=!!e.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 s=this.isMultiple?'':"",n=e.answers.map(((e,t)=>`\n
\n
\n
\n \n \n \n ${s}\n
\n
\n
\n \n \n
\n `)).join("");if(this.innerHTML=`\n
\n
\n
\n
\n
\n ${n}`,(0,F.Z)(this.firstElementChild,(0,B.Z)(e.question)),Array.from(this.querySelectorAll(".poll-answer-text")).forEach(((t,i)=>{(0,F.Z)(t,(0,B.Z)(e.answers[i].text))})),this.descDiv=this.firstElementChild.nextElementSibling,this.typeDiv=this.descDiv.firstElementChild,this.avatarsDiv=this.descDiv.lastElementChild,i&&this.typeDiv.append((0,L.ag)(i)),this.isQuiz&&(this.classList.add("is-quiz"),e.close_period&&e.close_date)){const t=document.createElement("div");t.classList.add("poll-time"),this.descDiv.append(t);const i=document.createElementNS("http://www.w3.org/2000/svg","svg");i.classList.add("poll-quiz-timer"),this.quizTimer=i;const s=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",""+s),i.append(o),this.descDiv.append(i);const r=1e3*e.close_period,l=1e3*(e.close_date-(yield d.Z.managers.timeManager.getServerTimeOffset()));this.quizInterval=window.setInterval((()=>{const e=Date.now(),i=(l-e)/r,s=(l-e)/1e3+1|0;t.innerHTML=(0,ts.Z)(s),s<=5&&(t.style.color="#ee545c",o.style.stroke="#ee545c"),o.style.strokeDashoffset=a+i*a,o.style.strokeDasharray=`${a} ${a}`,e>=l&&(clearInterval(this.quizInterval),t.innerHTML="",o.style.strokeDashoffset=a,this.quizInterval=0,setTimeout((()=>{this.managers.appPollsManager.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((0,L.ag)("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=>{(0,Ce.Z)(e),a.ZP.isTabExists(es)||a.ZP.createTab(es).open(this.message)})),(0,A.Z)(this.viewResults),this.isMultiple&&(this.sendVoteBtn=document.createElement("div"),this.sendVoteBtn.classList.add("poll-footer-button","poll-send-vote"),this.sendVoteBtn.append((0,L.ag)("Chat.Poll.SubmitVote")),(0,A.Z)(this.sendVoteBtn),e.chosenIndexes.length||this.votersCountDiv.classList.add("hide"),(0,C.fc)(this.sendVoteBtn,(e=>{(0,Ce.Z)(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=!(e.chosenIndexes.length||this.isClosed);r&&!this.isPublic||this.performResults(t,e.chosenIndexes,!1),r&&(this.setVotersCount(t),(0,C.fc)(this,this.clickHandler))},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}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),(0,C.fc)(t,(i=>{(0,Ce.Z)(i),t.classList.add("active"),((e,t,i)=>{as&&ns(as,os,rs);const s=document.createElement("div");s.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),s.append(n),(0,F.Z)(a,(0,ft.ZP)(e,{entities:t})),id.chat.bubbles.container.append(s),s.offsetLeft,s.classList.add("active"),as=s,os=i,rs=window.setTimeout((()=>{ns(s,i,rs)}),c.Z?5e3:7e3),ds||(ds=!0,id.addEventListener("peer_changed",(()=>{as&&ns(as,os,rs)})))})(e.solution,e.solution_entities,(()=>{t.classList.remove("active")}))})),this.sentVote){const i=e.results.find((e=>e.pFlags.correct));i&&!i.pFlags.chosen&&(0,C.tH)(t)}}}clickHandler(e){const t=(0,be.Z)(e.target,"poll-answer");if(!t)return;(0,Ce.Z)(e);const i=+t.dataset.index;if(this.isMultiple){t.classList.toggle("is-chosing");const e=this.chosingIndexes.indexOf(i);-1!==e?this.chosingIndexes.splice(e,1):this.chosingIndexes.push(i)}else this.sendVotes([i])}sendVotes(e){if(this.sendVotePromise)return this.sendVotePromise;const t=this.answerDivs.filter(((t,i)=>e.includes(i)));return t.forEach((e=>{e.classList.add("is-voting")})),this.classList.add("disable-hover"),this.sentVote=!0,this.sendVotePromise=this.managers.appPollsManager.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,i=!0){var s,n;if(d.Z.settings.animationsEnabled||(i=!1),this.isQuiz&&((null===(s=e.results)||void 0===s?void 0:s.length)||this.isClosed)){this.answerDivs.forEach(((t,i)=>{t.classList.toggle("is-correct",!!e.results[i].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"),(0,H.Z)(this.typeDiv,(0,L.ag)("Chat.Poll.Type.Closed"))),(this.chosenIndexes.length!==t.length||this.isClosed)&&(this.isRetracted=this.chosenIndexes.length&&!t.length,this.chosenIndexes=t.slice(),this.isRetracted?(0,C.fc)(this,this.clickHandler):(0,C.EN)(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",!i),i&&(0,Fe.Z)({element:this,className:"",forwards:!this.isRetracted,duration:340}),(0,fe.T2)((()=>{this.setResults(this.isRetracted?this.percents:t,this.chosenIndexes,i),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));const t=(e.recent_voters||[]).map((e=>e.toPeerId())),i=new se({avatarSize:16});i.render(t),(0,H.Z)(this.avatarsDiv,i.container)}if(this.isMultiple){const t=!!this.chosenIndexes.length,i=this.isClosed||t,s=!this.isPublic||!e.total_voters||!t&&!this.isClosed;this.sendVoteBtn.classList.toggle("hide",i),this.viewResults.classList.toggle("hide",s),this.votersCountDiv.classList.toggle("hide",!i||!s)}}setResults(e,t,i){this.svgLines.forEach((e=>e.style.display="")),this.answerDivs.forEach(((e,i)=>{e.classList.toggle("is-chosen",t.includes(i))}));const s=Math.max(...e);if(this.maxPercents=e.map((e=>e/s)),this.isRetracted)this.svgLines.forEach(((e,t)=>{this.setLineProgress(t,-1)}));else{const e=()=>{this.svgLines.forEach(((e,t)=>{this.setLineProgress(t,1)}))};i?(0,fe.T2)(e):e()}let n;e=e.slice(),ss(e);const a=t=>{e.forEach(((e,i)=>{const s=n(e,t);this.numberDivs[i].innerText=s+"%"}))};if(this.isRetracted)if(n=(e,t)=>Math.round(e/10*t),i)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)),i)for(let e=0;e<10;++e)setTimeout((()=>{a(e)}),34*e);else a(9);if(this.isRetracted){i&&this.classList.add("is-retracting"),this.classList.remove("is-voted");const e=()=>{this.svgLines.forEach((e=>e.style.display="none"))};i?setTimeout((()=>{this.classList.remove("is-retracting"),e()}),340):e()}else this.classList.add("is-voted")}setVotersCount(e){const t=e.total_voters||0;let i;const s=[t];i=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",(0,H.Z)(this.votersCountDiv,(0,L.ag)(i,s))}setLineProgress(e,t){const i=this.svgLines[e];-1===t?(i.style.strokeDasharray="",i.style.strokeDashoffset=""):(i.style.strokeDasharray=t*this.maxPercents[e]*ls.MAX_LENGTH+", 485.9",i.style.strokeDashoffset=""+t*ls.MAX_OFFSET)}}ls.MAX_OFFSET=-46.5,ls.MAX_LENGTH=0,customElements.define("poll-element",ls);const cs="ึ‘-฿ฟ๏ฌ-๏ทฝ๏นฐ-๏ปผ",hs=(new RegExp("^[^A-Za-zร€-ร–ร˜-รถรธ-สธฬ€-ึเ €-แฟฟโฐ€-๏ฌœ๏ทพ-๏นฏ๏ปฝ-๏ฟฟ]*["+cs+"]"),new RegExp("["+cs+"]"));var us=i(6628),ps=i(5345),fs=i(3591),ms=i(9102),gs=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const vs=new Map([["messageActionHistoryClear",!0],["messageActionChatCreate",e=>e.pFlags.out]]),bs=new Set;Oe.Z&&bs.add("messageActionPhoneCall");const ys=void 0;let ws=ys,Ss=0;const Cs=3,Ls=new Error("peer changed"),Es={1:96,2:90,3:84,4:72,5:60,6:48,7:36},Is=Object.keys(Es).length;function Ms(e){return Math.max(...e)}class Ps{constructor(e,t){let i;this.chat=e,this.managers=t,this.unreadOut=new Set,this.needUpdate=[],this.bubbles={},this.skippedMids=new Set,this.bubblesNewByGroupedId={},this.bubblesNew={},this.dateMessages={},this.scrolledDown=!0,this.isScrollingTimeout=0,this.unreaded=new Map,this.unreadedSeen=new Set,this.preloader=null,this.messagesQueueOnRenderAdditional=null,this.firstUnreadBubble=null,this.middlewareHelper=(0,Se.k)(),this.followStack=[],this.isHeavyAnimationInProgress=!1,this.isFirstLoad=!0,this.passEntities={},this.viewsMids=new Set,this.isTopPaddingSet=!1,this.renderingMessages=new Set,this.bubblesToEject=new Set,this.bubblesToReplace=new Map,this.setPeerTempId=0,this.renderNewPromises=new Set,this.extendedMediaMessages=new Set,this.unreadedObserverCallback=e=>{if(e.isIntersecting){const t=e.target,i=this.unreaded.get(t);this.onUnreadedInViewport(t,i)}},this.viewsObserverCallback=e=>{if(e.isIntersecting){const t=+e.target.dataset.mid;if(this.observer.unobserve(e.target,this.viewsObserverCallback),t)this.viewsMids.add(t),this.sendViewCountersDebounced();else{const{sponsoredMessage:e}=this,t=null==e?void 0:e.random_id;t&&(this.managers.appChatsManager.viewSponsoredMessage(this.peerId.toChatId(),t),delete e.random_id)}}},this.stickerEffectObserverCallback=e=>{if(e.isIntersecting){this.observer.unobserve(e.target,this.stickerEffectObserverCallback);const t=e.target.querySelector(".attachment");(0,pe.e9)().then((()=>{(0,Hi.Z)(t)&&(0,C.tH)(t)}))}},this.onBubblesMouseMove=e=>gs(this,void 0,void 0,(function*(){const t=(0,be.Z)(e.target,"bubble-content");if("scheduled"===this.chat.type||!t||this.chat.selection.isSelecting||(0,be.Z)(e.target,"service")||(0,be.Z)(e.target,"bubble-beside-button"))this.unhoverPrevious();else{const e=(0,be.Z)(t,"bubble");if(!this.chat.selection.canSelectBubble(e))return void this.unhoverPrevious();let{hoverBubble:i,hoverReaction:s}=this;if(e===i)return;if(this.unhoverPrevious(),i=this.hoverBubble=e,s=this.hoverReaction,s)s.dataset.loaded&&this.setHoverVisible(s,!0);else{s=this.hoverReaction=document.createElement("div"),s.classList.add("bubble-hover-reaction");const i=document.createElement("div");i.classList.add("bubble-hover-reaction-sticker"),s.append(i),t.append(s);let n=yield this.chat.getMessage(+e.dataset.mid);if("message"!==(null==n?void 0:n._))return void this.unhoverPrevious();n=yield this.managers.appMessagesManager.getGroupsFirstMessage(n);const a=this.getMiddleware((()=>this.hoverReaction===s));Promise.all([this.managers.appReactionsManager.getAvailableReactionsByMessage(n),(0,nt.Z)(400)]).then((([e])=>{const t=e[0];t?(0,W.ZP)({div:i,doc:t.select_animation,width:18,height:18,needUpscale:!0,middleware:a,group:this.chat.animationGroup,withThumb:!1,needFadeIn:!1}).then((({render:e})=>e)).then((e=>{(0,Pe.Z)(e),e.addEventListener("firstFrame",(()=>{a()&&(s.dataset.loaded="1",this.setHoverVisible(s,!0))}),{once:!0}),(0,C.fc)(s,(e=>{(0,Ce.Z)(e),this.managers.appReactionsManager.sendReaction(n,t),this.unhoverPrevious()}),{listenerSetter:this.listenerSetter})}),Ye.Z):s.remove()}))}}})),this.unhoverPrevious=()=>{const{hoverBubble:e,hoverReaction:t}=this;e&&(this.setHoverVisible(t,!1),this.hoverBubble=void 0,this.hoverReaction=void 0)},this.onBubblesClick=e=>gs(this,void 0,void 0,(function*(){var t;let i=e.target,s=null;try{s=(0,be.Z)(i,"bubble")}catch(e){}if(!s&&!this.chat.selection.isSelecting){const e=(0,be.Z)(i,"user-avatar");if(!e)return;const t=e.dataset.peerId.toPeerId();return void(t!==m.NM?this.chat.appImManager.setInnerPeer({peerId:t}):(0,we.Am)(L.ZP.format("HidAccount",!0)))}if(s.classList.contains("is-date")&&(0,be.Z)(i,"bubble-content")){if(s.classList.contains("is-fake")&&(s=s.previousElementSibling),s.classList.contains("is-sticky")&&!this.chatInner.classList.contains("is-scrolling"))return;for(const e in this.dateMessages)if(this.dateMessages[e].div===s){S.Z.createPopup(I,new Date(+e),this.onDatePick).show();break}return}if(!c.Z&&(0,be.Z)(i,"time"))return void this.chat.selection.toggleByElement(s);if(this.chat.selection.isSelecting&&e.isTrusted){if(s.classList.contains("service")&&void 0===s.dataset.mid)return;return(0,Ce.Z)(e),c.Z&&this.chat.selection.selectedText?void(this.chat.selection.selectedText=void 0):void this.chat.selection.toggleByElement((0,be.Z)(i,"grouped-item")||s)}const n=(0,be.Z)(i,"media-spoiler-container");if(n)return void(0,$i.kN)({event:e,mediaSpoiler:n});const a=(0,be.Z)(i,"contact");if(a){const t=a.dataset.peerId.toPeerId();if(t)this.chat.appImManager.setInnerPeer({peerId:t});else{const t=a.querySelector(".contact-number");(0,ct.T)(t.innerText.replace(/\s/g,"")),(0,we.bC)({langPackKey:"PhoneCopied"}),(0,Ce.Z)(e)}return}const o=(0,be.Z)(i,"bubble-call");if(o)return void this.chat.appImManager.callUser(this.peerId.toUserId(),o.dataset.type);if((0,be.Z)(i,"is-buy")){(0,Ce.Z)(e);const t=yield this.chat.getMessage(+s.dataset.mid);if(!t)return;return void new Ui(t,yield this.managers.appPaymentsManager.getInputInvoiceByPeerId(t.peerId,t.mid))}const r=(0,ye.Z)(i,"REACTION-ELEMENT");if(r){if((0,Ce.Z)(e),r.classList.contains("is-inactive"))return;const t=r.parentElement,i=t.getReactionCount(r),s=t.getMessage();return void this.managers.appReactionsManager.sendReaction(s,i.reaction)}const d=(0,Re.Z)(i,"data-sticker-emoji");if(d&&1===d.parentElement.querySelectorAll("[data-sticker-emoji]").length&&s.classList.contains("emoji-big"))return void(0,W._2)({event:e,container:d,managers:this.managers,middleware:this.getMiddleware(),peerId:this.peerId});if((0,be.Z)(i,"replies")){const e=+s.dataset.mid;if(this.peerId===m.hj){const t=yield this.chat.getMessage(e),i=(0,R.Z)(t.reply_to.reply_to_peer_id),s=t.reply_to.reply_to_top_id,n=t.fwd_from.saved_from_msg_id;this.chat.appImManager.openThread({peerId:i,lastMsgId:n,threadId:s})}else{const t=yield this.chat.getMessage(e),i=yield this.managers.appMessagesManager.getMessageWithReplies(t),s=i.replies;s&&this.managers.appMessagesManager.getDiscussionMessage(this.peerId,i.mid).then((e=>{this.chat.appImManager.setInnerPeer({peerId:s.channel_id.toPeerId(!0),type:"discussion",threadId:e.mid})}))}return}const l=(0,be.Z)(i,"is-via");if(l){const t=l.querySelector(".peer-title");if(i===t||(0,Be.Z)(i,t)){const i=t.innerText+" ";return this.managers.appDraftsManager.setDraft(this.peerId,this.chat.threadId,i),void(0,Ce.Z)(e)}}const h=(0,be.Z)(i,"peer-title")||(0,ye.Z)(i,"AVATAR-ELEMENT")||(0,Re.Z)(i,"data-saved-from");if(h&&h!==s){i=h||i;const e=i.dataset.peerId||i.getAttribute("peer")||i.peerId,t=i.dataset.savedFrom;if("string"==typeof e||t)if(t){const[e,n]=t.split("_");if(i.classList.contains("is-receipt-link")){const t=yield this.managers.appMessagesManager.getMessageByPeer(e.toPeerId(),+n);if(t){const e=yield this.managers.appPaymentsManager.getInputInvoiceByPeerId(this.peerId,+s.dataset.mid);new Ui(t,e,void 0,!0)}}else this.chat.appImManager.setInnerPeer({peerId:e.toPeerId(),lastMsgId:+n})}else{const t=e.toPeerId();t!==m.NM?this.chat.appImManager.setInnerPeer({peerId:t}):(0,we.Am)(L.ZP.format("HidAccount",!0))}return}if(s.classList.contains("sticker")&&i.parentElement.classList.contains("attachment")){const e=+s.dataset.mid,i=null===(t=(yield this.chat.getMessage(e)).media)||void 0===t?void 0:t.document;return void((null==i?void 0:i.stickerSetInput)&&new P.Z(i.stickerSetInput).show())}const u=(0,be.Z)(i,"document-with-thumb");if("IMG"===i.tagName&&!i.classList.contains("emoji")&&!i.classList.contains("document-thumb")||i.classList.contains("album-item")||"VIDEO"===i.tagName&&!s.classList.contains("round")||u&&!u.querySelector(".preloader-container")||i.classList.contains("canvas-thumbnail")){const t=(0,be.Z)(i,"album-item")||(0,be.Z)(i,"document-container"),n=(t||s).querySelector(".preloader-container");if(n)return(0,C.tH)(n),void(0,Ce.Z)(e);(0,Ce.Z)(e);const a=+(t||s).dataset.mid,o=yield this.chat.getMessage(a);if(!o)return void this.log.warn("no message by messageId:",a);const r="webpage",d=s.classList.contains(r),l=u?e=>_e.Z.isMediaCompatibleForDocumentViewer(e):e=>"photo"===e._||["video","gif"].includes(e.type),c=[],h=d?[a]:(yield Promise.all(Object.keys(this.bubbles).map((e=>+e)).map((e=>gs(this,void 0,void 0,(function*(){const t=yield this.chat.getMessage(e),i=(0,vt.Z)(t);return i&&l(i)&&e})))))).filter(Boolean).sort(((e,t)=>e-t));h.forEach((e=>{let t;u?t=".document-container":(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 i=Array.from(this.bubbles[e].querySelectorAll(t)),s=new Set;if(u)i.forEach((e=>{c.push({element:e.querySelector(".document-ico"),mid:+e.dataset.mid,peerId:this.peerId})}));else{const t=!!this.bubbles[e].querySelector(".media-container-aspecter");i.forEach((i=>{if(t&&!(0,be.Z)(i,"media-container-aspecter"))return;const n=(0,be.Z)(i,"album-item"),a=n||i.parentElement;s.has(a)||(s.add(a),c.push({element:i,mid:n?+n.dataset.mid:e,peerId:this.peerId}))}))}})),c.sort(((e,t)=>e.mid-t.mid));const p=c.findIndex((e=>e.mid===a));return ge.ZP&&this.log("open mediaViewer single with ids:",h,p,c),c[p]?void(new _e.Z).setSearchContext({threadId:this.chat.threadId,peerId:this.peerId,inputFilter:{_:u?"inputMessagesFilterDocument":"inputMessagesFilterPhotoVideo"},useSearch:"scheduled"!==this.chat.type&&!d,isScheduled:"scheduled"===this.chat.type}).openMedia(o,c[p].element,0,!0,c.slice(0,p),c.slice(p+1)):void this.log("no target for media viewer!",i)}if(-1===["IMG","DIV","SPAN"].indexOf(i.tagName)&&(i=(0,ye.Z)(i,"DIV")),-1!==["DIV","SPAN"].indexOf(i.tagName)){if(i.classList.contains("goto-original")){const e=s.dataset.savedFrom,[t,i]=e.split("_");return void this.chat.appImManager.setInnerPeer({peerId:t.toPeerId(),lastMsgId:+i})}if(i.classList.contains("forward")){const e=+s.dataset.mid,t=yield this.managers.appMessagesManager.getMessageByPeer(this.peerId,e);return void new M.Z({[this.peerId]:yield this.managers.appMessagesManager.getMidsByMessage(t)})}let t=!1;try{t=!!(0,be.Z)(e.target,"reply")}catch(e){}if(t&&s.classList.contains("is-reply")){const e=+s.dataset.mid;this.followStack.push(e);const t=yield this.chat.getMessage(e),i=t.reply_to.reply_to_peer_id?(0,R.Z)(t.reply_to.reply_to_peer_id):this.peerId,n=t.reply_to.reply_to_msg_id;this.chat.appImManager.setInnerPeer({peerId:i,lastMsgId:n,type:this.chat.type,threadId:this.chat.threadId})}}})),this.onScroll=(e,t,i)=>{var s,n,a,o,r;if(this.isHeavyAnimationInProgress){if(null===(s=this.sliceViewportDebounced)||void 0===s||s.clearTimeout(),this.scrolledDown&&!e)return}else null===(n=this.chat.topbar.pinnedMessage)||void 0===n||n.setCorrectIndexThrottled(this.scrollable.lastScrollDirection),null===(a=this.sliceViewportDebounced)||void 0===a||a.call(this),this.setStickyDateManually();if(t&&t.distanceToEnd<300&&this.scrolledDown)return;const d=i?0:null!==(o=null==t?void 0:t.distanceToEnd)&&void 0!==o?o:this.scrollable.getDistanceToEnd();(0!==this.scrollable.lastScrollDirection&&d>0||t||i)&&(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+(null!==(r=null==t?void 0:t.duration)&&void 0!==r?r:0))),d<300&&(i||this.scrollable.loadedAll.bottom||this.chat.setPeerPromise||!this.peerId)?(this.container.classList.add("scrolled-down"),this.scrolledDown=!0):this.container.classList.contains("scrolled-down")&&(this.container.classList.remove("scrolled-down"),this.scrolledDown=!1)},this.processBatch=(...e)=>gs(this,void 0,void 0,(function*(){var t,i,s;let[n,a,o]=e;const r=e=>e.filter((e=>e&&this.bubbles[e.bubble.dataset.mid]===e.bubble));n=r(n),o("messages rendered");const d=null===(t=n[0])||void 0===t?void 0:t.reverse,{groups:l,avatarPromises:c}=this.groupBubbles(n.filter((e=>e.updatePosition))),h=n.reduce(((e,t)=>{const i=performance.now(),s=t.promises.slice(),n=s.map((e=>gs(this,void 0,void 0,(function*(){return yield e,performance.now()-i}))));return Promise.all(n).then((e=>{o.groupCollapsed("media message time",performance.now()-i,t,e),e.forEach(((e,t)=>{o("media message time",e,t,s[t])})),o.groupEnd()})),e.push(...t.promises),e}),[]);h.push(...c),o("media promises to call",h,n,this.isHeavyAnimationInProgress),yield a(Promise.all([...h,this.setUnreadDelimiter()]).catch(Ye.Z)),yield a((0,fe.AD)()),o("media promises end"),n=r(n);const{restoreScroll:u,scrollSaver:p}=this.prepareToSaveScroll(d);null===(i=this.messagesQueueOnRenderAdditional)||void 0===i||i.call(this),this.ejectBubbles();for(const[e,t]of this.bubblesToReplace){if(p&&p.replaceSaved(t,e),!n.find((t=>t.bubble===e)))continue;const i=this.bubbleGroups.getItemByBubble(e);i?(i.mounted=!1,l.includes(i.group)||l.push(i.group)):this.log.error("NO ITEM BY BUBBLE",e),this.bubblesToReplace.delete(e)}this.chat.selection.isSelecting&&n.forEach((({bubble:e})=>{this.chat.selection.toggleElementCheckbox(e,!0)})),n.forEach((({message:e,bubble:t,updatePosition:i})=>{e.pFlags.local&&i&&this.chatInner[e.pFlags.sponsored?"append":"prepend"](t)})),this.bubbleGroups.mountUnmountGroups(l),null===(s=this.updatePlaceholderPosition)||void 0===s||s.call(this),null==u||u()})),this.onDatePick=e=>{const t=this.peerId;this.managers.appMessagesManager.requestHistory(t,0,2,-1,e,this.chat.threadId).then((e=>{var i;(null===(i=null==e?void 0:e.messages)||void 0===i?void 0:i.length)?this.peerId===t&&this.chat.setMessageId(e.messages[0].mid):this.log.error("no history!")}))},this.log=this.chat.log,this.listenerSetter=new ce.Z,this.constructBubbles(),this.batchProcessor=new ps.s({log:this.log,process:this.processBatch,possibleError:Ls}),this.bubbleGroups=new w(this.chat),this.preloader=new Z.Z({cancelable:!1}),this.lazyLoadQueue=new le.Z(void 0,!0),this.lazyLoadQueue.queueId=++Ss,this.listenerSetter.add(d.Z)("history_update",(({storageKey:e,sequential:t,message:i})=>gs(this,void 0,void 0,(function*(){if(this.chat.messagesStorageKey!==e||"scheduled"===this.chat.type)return;const{mid:s}=i,n=this.bubbles[s];if(!n)return;if(this.renderNewPromises.size&&(yield Promise.all(Array.from(this.renderNewPromises))),this.messagesQueuePromise&&(yield this.messagesQueuePromise),this.bubbles[s]!==n)return;const a=this.bubbleGroups.getItemByBubble(n);if(!a)return;if(a.mid===s)return;if(t){const e=a.group,o=this.bubbleGroups.createItem(n,i),r=this.bubbleGroups.itemsArr.slice();(0,h.Z)(r,a);const l=this.bubbleGroups.findGroupSiblingByItem(o,r);if(e===(null==l?void 0:l.group)||e===this.bubbleGroups.getLastGroup()&&1===e.items.length&&o.dateTimestamp===a.dateTimestamp||this.peerId===d.Z.myId&&t&&o.dateTimestamp===a.dateTimestamp)return void this.bubbleGroups.changeBubbleMid(n,s)}this.bubbleGroups.removeAndUnmountBubble(n);const{groups:o}=this.groupBubbles([{bubble:n,message:i}]);this.bubbleGroups.mountUnmountGroups(o),this.scrollingToBubble&&this.scrollToEnd()})))),this.listenerSetter.add(d.Z)("dialog_flush",(({peerId:e})=>{this.peerId===e&&this.deleteMessagesByIds(Object.keys(this.bubbles).map((e=>+e)))})),this.listenerSetter.add(d.Z)("message_sent",(e=>gs(this,void 0,void 0,(function*(){const{storageKey:t,tempId:i,tempMessage:s,mid:n,message:a}=e;if(this.chat.messagesStorageKey!==t)return;const o=this.bubbles,r=o[i];if(r){const e=o[i];o[n]=e,e.dataset.mid=""+n,delete o[i],(0,fe.T2)((()=>{const t=+e.dataset.mid;o[t]===e&&e.classList.contains("is-outgoing")&&(e.classList.remove("is-sending","is-outgoing"),e.classList.add(this.peerId===d.Z.myId&&"scheduled"!==this.chat.type||!this.unreadOut.has(t)?"is-read":"is-sent"))}))}if(this.unreadOut.has(i)&&(this.unreadOut.delete(i),this.unreadOut.add(n)),"scheduled"===this.chat.type&&(Date.now()/1e3|0)>=s.date-10&&this.deleteMessagesByIds([n]),!r)return;let l,c;const h=a.grouped_id;if(h){l=yield this.managers.appMessagesManager.getMessagesByAlbum(h);const e=l.map((({mid:e})=>e));if(!e.length||Ms(e)!==n||o[n]!==r)return;if(o[n]!==r)return;c=Array.from(r.querySelectorAll(".grouped-item")).map((e=>+e.dataset.mid))}else l=[a],c=[i];const u=Array.from(r.querySelectorAll("reactions-element"));u.length&&u.forEach((e=>{e.changeMessage(a)})),l.forEach(((e,t)=>{var i,n,a,o,l;if(!e)return;const u=c[t],p=e.mid,f=r.querySelector(`.document-container[data-mid="${p}"]`)||r;if("message"!==e._)return;if(e.replies){const t=r.querySelector("replies-element");t&&(t.message=e,t.init())}const m=null!==(i=e.media)&&void 0!==i?i:{},g=m.document,v=m.poll,b=m.webpage;if(g){const t=f.querySelector(`.document-container[data-mid="${u}"] .document`);if(t){const i=(0,be.Z)(t,"document-container");!(null===(o=null===(a=null===(n=s.media)||void 0===n?void 0:n.document)||void 0===a?void 0:a.thumbs)||void 0===o?void 0:o.length)&&(null===(l=g.thumbs)||void 0===l?void 0:l.length)&&(0,pe.e9)().then((()=>gs(this,void 0,void 0,(function*(){const i=t.querySelector(".time"),s=yield(0,Yi.Z)({message:e,fontSize:d.Z.settings.messagesTextSize});t.replaceWith(s),i&&(s.querySelector(".document")||s).append(i)})))),i&&(i.dataset.mid=""+p)}const i=f.querySelector(`audio-element[data-mid="${u}"], .document[data-doc-id="${u}"], .media-round[data-mid="${u}"]`);i&&(i instanceof he.ZP||i.classList.contains("media-round")?(i.dataset.mid=""+e.mid,delete i.dataset.isOutgoing,i.message=e,i.onLoad(!0)):(i.dataset.docId=""+g.id,i.doc=g))}else if(v){const t=f.querySelector("poll-element");t&&(t.message=e,t.setAttribute("poll-id",""+v.id),t.setAttribute("message-id",""+p))}else b&&!f.querySelector(".web")&&(0,pe.e9)().then((()=>{this.safeRenderMessage(e,!0,f),this.scrollToBubbleIfLast(f)}));if(h){const e=f.querySelector(`.grouped-item[data-mid="${u}"]`)||f;e&&(e.dataset.mid=""+p)}}))})))),this.listenerSetter.add(d.Z)("message_edit",(({storageKey:e,message:t})=>gs(this,void 0,void 0,(function*(){if(e!==this.chat.messagesStorageKey)return;const i=this.bubbles[t.mid];i&&(yield(0,pe.e9)(),this.bubbles[t.mid]===i&&this.safeRenderMessage(t,!0,i))})))),this.listenerSetter.add(d.Z)("message_error",(({storageKey:e,tempId:t})=>gs(this,void 0,void 0,(function*(){if(e!==this.chat.messagesStorageKey)return;const i=this.bubbles[t];i&&(yield(0,pe.e9)(),this.bubbles[t]===i&&(i.classList.remove("is-outgoing"),i.classList.add("is-error")))})))),this.listenerSetter.add(d.Z)("album_edit",(({peerId:e,messages:t,deletedMids:i})=>{if(e!==this.peerId)return;const s=t.map((({mid:e})=>e)),n=Ms(s.concat(Array.from(i))),a=this.bubbles[n];if(!a)return;const o=Ms(s),r=t.find((e=>e.mid===o));this.safeRenderMessage(r,!0,a)})),this.listenerSetter.add(d.Z)("messages_reactions",(e=>gs(this,void 0,void 0,(function*(){if("scheduled"===this.chat.type)return;let t;const i=e.map((({message:e,changedResults:t})=>gs(this,void 0,void 0,(function*(){if(this.peerId!==e.peerId)return;const i=yield this.getMountedBubble(e.mid,e);return i?{bubble:i.bubble,message:e,changedResults:t}:void 0}))));(yield Promise.all(i)).filter(Boolean).forEach((({bubble:e,message:i,changedResults:s})=>{t||(t=this.createScrollSaver(!1),t.save());const n=i.peerId+"_"+i.mid,a=it.get(n);if(a)for(const e of a)e.update(i,s);else{if(!i.reactions||!i.reactions.results.length)return;this.appendReactionsElementToBubble(e,i,i,s)}})),t&&t.restore()})))),this.listenerSetter.add(d.Z)("messages_downloaded",(({peerId:e,mids:t})=>gs(this,void 0,void 0,(function*(){const i=this.getMiddleware();yield(0,pe.e9)(),i()&&t.forEach((t=>{this.needUpdate;const i=[];(0,g.Z)(this.needUpdate,((s,n)=>{s.replyMid===t&&s.replyToPeerId===e&&(this.needUpdate.splice(n,1)[0],i.push(s))})),i.forEach((({mid:e,replyMid:t,replyToPeerId:i})=>gs(this,void 0,void 0,(function*(){const t=this.bubbles[e];if(!t)return;const i=yield this.chat.getMessage(e);de.setReply({chat:this.chat,bubble:t,message:i})}))))}))})))),(0,ji.Z)({listenTo:this.scrollable.container,listenerSetter:this.listenerSetter,findTarget:e=>{const t=e.target;return t.closest(".attachment.media-sticker-wrapper")||(0,be.Z)(t,"attachment")&&t.closest(".custom-emoji")}}),(0,C.fc)(this.scrollable.container,this.onBubblesClick,{listenerSetter:this.listenerSetter}),this.listenerSetter.add(this.scrollable.container)("mousedown",(e=>{if(0!==e.button)return;const t=(0,ye.Z)(e.target,"CODE");if(t){(0,Ce.Z)(e),i=t,(0,ct.T)(i.textContent);const s=e=>{(0,Ce.Z)(e),(0,we.bC)({langPackKey:"TextCopied",onClose:()=>{n()}})},n=(0,C.fc)(window,s,{listenerSetter:this.listenerSetter,once:!0,capture:!0})}else var i})),this.stickyIntersector=new k.Z(this.scrollable.container,((e,t)=>{for(const i in this.dateMessages){const s=this.dateMessages[i];if(s.container===t){const t=s.div;t.classList.toggle("is-sticky",e),e&&(this.previousStickyDate=t);break}}this.previousStickyDate})),x.IS_SAFARI||(this.sliceViewportDebounced=(0,Ze.Z)(this.sliceViewport.bind(this),3e3,!1,!0)),(0,pe.ZP)((()=>{this.isHeavyAnimationInProgress=!0,this.lazyLoadQueue.lock(),i=this.getMiddleware()}),(()=>{this.isHeavyAnimationInProgress=!1,(null==i?void 0:i())&&this.lazyLoadQueue.unlockAndRefresh(),i=null}),this.listenerSetter)}constructBubbles(){const e=this.container=document.createElement("div");e.classList.add("bubbles","scrolled-down"),(this.chatInner=document.createElement("div")).classList.add("bubbles-inner"),this.setScroll(),e.append(this.scrollable.container)}attachContainerListeners(){const e=this.container;if(this.chat.contextMenu.attachTo(e),this.chat.selection.attachListeners(e,new ce.Z),ge.ZP&&this.listenerSetter.add(e)("dblclick",(e=>gs(this,void 0,void 0,(function*(){const t=(0,be.Z)(e.target,"grouped-item")||(0,be.Z)(e.target,"bubble");if(t){const e=+t.dataset.mid;this.log("debug message:",yield this.chat.getMessage(e)),this.highlightBubble(t)}})))),x.IS_MOBILE){if(c.Z){const t="is-gesturing-reply",i=64,s=.75*i;let n,a,o,r=!1;(0,De.Z)({element:e,verifyTouchTarget:e=>gs(this,void 0,void 0,(function*(){if("pinned"===this.chat.type||this.chat.selection.isSelecting||!(yield this.chat.canSend()))return!1;if(n=(0,be.Z)(e.target,"bubble"),n){try{const e=n.parentElement.querySelector(".bubbles-group-avatar");e&&(0,He.Z)(e,n)&&(o=e)}catch(e){}[n,o].filter(Boolean).forEach((e=>{(0,Fe.Z)({element:e,className:t,forwards:!0,duration:250}),e.offsetLeft})),a?(a.classList.remove("is-visible"),a.style.opacity=""):(a=document.createElement("span"),a.classList.add("tgico-reply_filled","bubble-gesture-reply-icon")),n.append(a)}return!!n})),onSwipe:e=>{r=e>=s,r&&!a.classList.contains("is-visible")&&a.classList.add("is-visible"),a.style.opacity=""+Math.min(1,e/s);const t=`translateX(${-Math.max(0,Math.min(i,e))}px)`;n.style.transform=t,o&&(o.style.transform=t),(0,Ct.s)()},onReset:()=>{const e=n,i=o;n=o=void 0;const s=()=>{a.parentElement===e&&(a.classList.remove("is-visible"),a.remove())};[e,i].filter(Boolean).forEach(((e,i)=>{(0,Fe.Z)({element:e,className:t,forwards:!1,duration:250,onTransitionEnd:0===i?s:void 0})})),(0,fe.T2)((()=>{if(e.style.transform="",i&&(i.style.transform=""),r){const{mid:t}=e.dataset;this.chat.input.initMessageReply(+t),r=!1}}))},listenerOptions:{capture:!0}})}}else this.listenerSetter.add(e)("dblclick",(e=>gs(this,void 0,void 0,(function*(){if("pinned"===this.chat.type||this.chat.selection.isSelecting||!(yield this.chat.canSend()))return;const t=e.target,i=t.classList.contains("bubble")?t:t.classList.contains("document-selection")?t.parentElement:null;if(i&&!i.classList.contains("bubble-first")){const e=+i.dataset.mid;if((yield this.chat.getMessage(e)).pFlags.is_outgoing)return;this.chat.input.initMessageReply(e)}}))))}constructPeerHelpers(){this.listenerSetter.add(d.Z)("history_append",(({storageKey:e,message:t})=>gs(this,void 0,void 0,(function*(){e===this.chat.messagesStorageKey&&"scheduled"!==this.chat.type&&(d.Z.settings.animationsEnabled&&(this.updateGradient=!0),this.scrollable.loadedAll.bottom?this.renderNewMessage(t,!0):this.chat.setMessageId())})))),this.listenerSetter.add(d.Z)("history_multiappend",(e=>{this.peerId===e.peerId&&"scheduled"!==this.chat.type&&this.renderNewMessage(e)})),this.listenerSetter.add(d.Z)("history_delete",(({peerId:e,msgs:t})=>{e===this.peerId&&"scheduled"!==this.chat.type&&this.deleteMessagesByIds(Array.from(t))})),this.listenerSetter.add(d.Z)("dialog_unread",(({peerId:e})=>{e===this.peerId&&(this.chat.input.setUnreadCount(),(0,pe.e9)().then((()=>{this.updateUnreadByDialog()})))})),this.listenerSetter.add(d.Z)("dialogs_multiupdate",(e=>{e.has(this.peerId)&&"scheduled"!==this.chat.type&&this.chat.input.setUnreadCount()})),this.listenerSetter.add(d.Z)("dialog_notify_settings",(e=>{this.peerId===e.peerId&&"scheduled"!==this.chat.type&&this.chat.input.setUnreadCount()})),this.listenerSetter.add(d.Z)("chat_update",(e=>gs(this,void 0,void 0,(function*(){const{peerId:t}=this;if(t!==e.toPeerId(!0))return;const i=yield this.managers.appChatsManager.getChat(e);this.chatInner.classList.contains("has-rights")!==(yield this.chat.canSend())&&(yield Promise.all([this.finishPeerChange(),this.chat.input.finishPeerChange()])).forEach((e=>e())),!!i.pFlags.forum!==this.chat.isForum&&"chat"===this.chat.type&&(this.chat.peerId=0,this.chat.appImManager.setPeer({peerId:t}))})))),this.listenerSetter.add(d.Z)("history_reload",(e=>{if(e!==this.peerId)return;const t=(0,ot.Z)(this.bubbles,"desc").filter((e=>e>0)),i=this.getMiddleware();this.managers.appMessagesManager.reloadMessages(this.peerId,t).then((e=>{if(!i())return;const s=[];e.forEach(((e,i)=>{const n=t[i];if(e){const t=this.bubbles[e.mid];if(!t)return;this.safeRenderMessage(e,!0,t)}else s.push(n)})),this.deleteMessagesByIds(s),this.setLoaded("top",!1),this.setLoaded("bottom",!1),this.scrollable.checkForTriggers()}))})),this.listenerSetter.add(d.Z)("settings_updated",(({key:e})=>gs(this,void 0,void 0,(function*(){if("settings.emoji.big"===e){const e=this.getMiddleware(),t=(0,ot.Z)(this.bubbles,"desc").map((e=>gs(this,void 0,void 0,(function*(){const t=this.bubbles[e];if(t.classList.contains("can-have-big-emoji"))return{bubble:t,message:yield this.chat.getMessage(e)}})))),i=yield Promise.all(t);if(!e())return;i.filter(Boolean).forEach((({bubble:e,message:t})=>{this.bubbles[t.mid]===e&&this.safeRenderMessage(t,!0,e)}))}})))),this.listenerSetter.add(d.Z)("messages_views",(e=>{"scheduled"!==this.chat.type&&(0,fe.T2)((()=>{let t;for(const{peerId:i,views:s,mid:n}of e){if(this.peerId!==i)continue;const e=this.bubbles[n];if(!e)continue;const a=Array.from(e.querySelectorAll(".post-views"));if(!a.length)continue;const o=(0,D.Z)(s,1);let r=!1;a.forEach((e=>{(r||e.textContent!==o)&&(t||(t=this.createScrollSaver(!0),t.save()),r=!0,e.textContent=o)}))}null==t||t.restore()}))})),this.observer=new dt({root:this.scrollable.container}),this.sendViewCountersDebounced=(0,Ze.Z)((()=>{const e=[...this.viewsMids];this.viewsMids.clear(),this.managers.appMessagesManager.incrementMessageViews(this.peerId,e)}),1e3,!1,!0),this.listenerSetter.add(d.Z)("peer_pinned_messages",(({peerId:e,mids:t,pinned:i})=>{"pinned"===this.chat.type&&e===this.peerId&&t&&(i||this.deleteMessagesByIds(t))}));const e=()=>gs(this,void 0,void 0,(function*(){this.chat.topbar.setTitle((yield this.managers.appMessagesManager.getScheduledMessagesStorage(this.peerId)).size)}));this.listenerSetter.add(d.Z)("scheduled_new",(t=>{"scheduled"===this.chat.type&&t.peerId===this.peerId&&(this.renderNewMessage(t),e())})),this.listenerSetter.add(d.Z)("scheduled_delete",(({peerId:t,mids:i})=>{"scheduled"===this.chat.type&&t===this.peerId&&(this.deleteMessagesByIds(i),e())}))}get peerId(){return this.chat.peerId}get messagesQueuePromise(){return this.batchProcessor.queuePromise}createScrollSaver(e=!0){return new at(this.scrollable,".bubble:not(.is-date)",e)}createResizeObserver(){if(!("ResizeObserver"in window)||this.resizeObserver)return;const e=this.scrollable.container;let t=0,i=!1,s=!1,n=0,a=0,o=0;const r=()=>{const r=e.offsetHeight,d=this.scrollable.isScrolledDown;r===t||s&&d||(a+=t-r),a&&this.scrollable.setScrollTopSilently(this.scrollable.scrollTop+Math.round(a)),t=r,n=0,o=0,a=0,i=!1,s=!1},d=e=>{o&&window.cancelAnimationFrame(o),o=window.requestAnimationFrame(e?r:()=>{o=window.requestAnimationFrame(r)})};(this.resizeObserver=new ResizeObserver((e=>{if(s)return void d(!1);const o=e[0].contentRect.height;if(!t)return void(t=o);const r=t-o;let l=r+a;const c=l%1;if(l-=c,!i&&(i=!0,r<0&&this.scrollable.isScrolledDown))return a=-r,s=!0,void d(!1);if(n+=l,l){const e=this.scrollable.scrollTop+l;this.scrollable.setScrollTopSilently(e)}d(!1),a=c,t=o}))).observe(e)}destroyResizeObserver(){const e=this.resizeObserver;e&&(e.disconnect(),this.resizeObserver=void 0)}setReactionsHoverListeners(){this.listenerSetter.add(Lt.Z)("toggle",this.unhoverPrevious),this.listenerSetter.add(St.Z)("change",this.unhoverPrevious),this.listenerSetter.add(this.chat.selection)("toggle",this.unhoverPrevious),this.listenerSetter.add(this.container)("mousemove",this.onBubblesMouseMove)}setHoverVisible(e,t){e.parentElement&&e.parentElement.classList.toggle("hover-reaction-visible",t),(0,Fe.Z)({element:e,className:"is-visible",forwards:t,duration:200,onTransitionEnd:t?void 0:()=>{e.remove()},useRafs:2})}setStickyDateManually(){}getRenderedLength(){return Object.keys(this.bubbles).length-this.skippedMids.size}onUnreadedInViewport(e,t){this.unreadedSeen.add(t),this.observer.unobserve(e,this.unreadedObserverCallback),this.unreaded.delete(e),this.readUnreaded()}readUnreaded(){if(this.readPromise)return;const e=this.getMiddleware();this.readPromise=wt.Z.getFocusPromise().then((()=>gs(this,void 0,void 0,(function*(){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((yield this.chat.getHistoryMaxId())||0,t))}this.unreaded.forEach(((e,i)=>{e<=t&&this.onUnreadedInViewport(i,e)}));const i=[];for(const e of this.unreadedSeen)gt(yield this.chat.getMessage(e))&&i.push(e);return this.managers.appMessagesManager.readMessages(this.peerId,i),this.unreadedSeen.clear(),ge.ZP&&this.log("will readHistory by maxId:",t),this.managers.appMessagesManager.readHistory(this.peerId,t,this.chat.threadId).catch((e=>{this.log.error("readHistory err:",e),this.managers.appMessagesManager.readHistory(this.peerId,t,this.chat.threadId)})).finally((()=>{e()&&(this.readPromise=void 0,this.unreadedSeen.size&&this.readUnreaded())}))}))))}onGoDownClick(){return gs(this,void 0,void 0,(function*(){if(!this.followStack.length)return void this.chat.setMessageId();const e=this.getMiddleware(),t=this.followStack.slice(),i=yield Promise.all(t.map((e=>this.chat.getMessage(e))));if(!e())return;t.forEach(((e,t)=>{const s=i[t],n=this.bubbles[e];let a=!0;if(n){const e=n.getBoundingClientRect();a=xe.Z.height/2>e.top}else s&&(a=!1);a&&this.followStack.splice(this.followStack.indexOf(e),1)})),this.followStack.sort(((e,t)=>t-e));const s=this.followStack.pop();this.chat.setMessageId(s)}))}getBubbleByPoint(e){const t=this.getViewportSlice(),i=t.visible["top"===e?0:t.visible.length-1];return null==i?void 0:i.element}getGroupedBubble(e){return gs(this,void 0,void 0,(function*(){const t=yield this.managers.appMessagesManager.getMidsByAlbum(e);for(const e of t)if(this.bubbles[e]&&!this.skippedMids.has(e))return{bubble:this.bubbles[e],mid:e}}))}getBubbleGroupedItems(e){return Array.from(e.querySelectorAll(".grouped-item"))}getMountedBubble(e,t){return gs(this,void 0,void 0,(function*(){if(void 0===t&&(t=yield this.chat.getMessage(e)),!t)return;const i=t.grouped_id;if(i){const t=yield this.getGroupedBubble(i);if(t)return t.bubble=t.bubble.querySelector(`.document-container[data-mid="${e}"]`)||t.bubble,t}const s=this.bubbles[e];return s&&!this.skippedMids.has(e)?{bubble:s,mid:e}:void 0}))}findNextMountedBubbleByMsgId(e,t){const i=(0,ot.Z)(this.bubbles,t?"desc":"asc");let s;s=t?t=>te{var t;return!!s(e)&&!!(null===(t=this.bubbles[e])||void 0===t?void 0:t.parentElement)}));return this.bubbles[n]}loadMoreHistory(e,t=!1){if(!this.peerId||this.chat.setPeerPromise||this.isHeavyAnimationInProgress||e&&(this.getHistoryTopPromise||this.scrollable.loadedAll.top)||!e&&(this.getHistoryBottomPromise||this.scrollable.loadedAll.bottom))return;const i=Object.keys(this.bubbles).map((e=>+e)).filter((e=>e>0&&!this.skippedMids.has(e))).sort(((e,t)=>e-t));i.length||i.push(0),e?(ge.ZP&&this.log("Will load more (up) history by id:",i[0],"maxId:",i[i.length-1],t),this.getHistory1(i[0],!0,void 0,void 0,t)):(ge.ZP&&this.log("Will load more (down) history by id:",i[i.length-1],t),this.getHistory1(i[i.length-1],!1,!0,void 0,t))}setScroll(){this.scrollable&&this.destroyScrollable(),this.scrollable=new T.ZP(null,"IM",300),this.setLoaded("top",!1,!1),this.setLoaded("bottom",!1,!1),this.scrollable.container.append(this.chatInner),this.scrollable.onAdditionalScroll=this.onScroll,this.scrollable.onScrolledTop=()=>this.loadMoreHistory(!0),this.scrollable.onScrolledBottom=()=>this.loadMoreHistory(!1),c.Z}updateUnreadByDialog(){return gs(this,void 0,void 0,(function*(){const e=yield this.chat.getHistoryStorage(),t=this.peerId===d.Z.myId?e.readMaxId:e.readOutboxMaxId;for(const e of this.unreadOut)if(e>0&&e<=t){const t=this.bubbles[e];if(t){if(this.unreadOut.delete(e),t.classList.contains("is-outgoing")||t.classList.contains("is-error"))continue;t.classList.remove("is-sent","is-sending","is-outgoing"),t.classList.add("is-read")}}}))}destroyBubble(e,t=+e.dataset.mid){e.middlewareHelper.destroy(),this.bubbles[t]===e&&delete this.bubbles[t],this.skippedMids.delete(t),this.firstUnreadBubble===e&&(this.firstUnreadBubble=null),this.bubbleGroups.removeAndUnmountBubble(e),this.observer&&(this.observer.unobserve(e,this.unreadedObserverCallback),this.unreaded.delete(e),this.observer.unobserve(e,this.viewsObserverCallback),this.viewsMids.delete(t),this.observer.unobserve(e,this.stickerEffectObserverCallback))}deleteMessagesByIds(e,t=!0,i){let n=!1;e.forEach((e=>{const t=this.bubbles[e];t&&(this.destroyBubble(t,e),n=!0)})),n&&(this.scrollable.ignoreNextScrollEvent(),t&&this.chat.selection.isSelecting&&this.chat.selection.deleteSelectedMids(this.peerId,e),s.Z.checkAnimations(!1,this.chat.animationGroup),this.deleteEmptyDateGroups(),i||this.scrollable.onScroll())}pollExtendedMediaMessages(){const e=Array.from(this.extendedMediaMessages);return this.managers.appMessagesManager.getExtendedMedia(this.peerId,e)}setExtendedMediaMessagesPollInterval(){!this.pollExtendedMediaMessagesPromise&&this.extendedMediaMessages.size&&(this.pollExtendedMediaMessagesPromise=(0,nt.Z)(3e4).then((()=>this.pollExtendedMediaMessages())).then((()=>this.setExtendedMediaMessagesPollInterval())))}setTopPadding(e=this.getMiddleware()){let t,i=!1;if(!this.isTopPaddingSet&&"scheduled"!==this.chat.type){const{clientHeight:e,scrollHeight:s}=this.scrollable.container;i=e===s,i&&(t=this.chatInner,t.style.paddingTop=e+"px",this.scrollable.setScrollTopSilently(s),this.isTopPaddingSet=!0)}return{isPaddingNeeded:i,unsetPadding:i?()=>{e()&&i&&(t.style.paddingTop="",this.isTopPaddingSet=!1)}:void 0}}renderNewMessage(e,t){const i=this._renderNewMessage(e,t);return this.renderNewPromises.add(i),i.catch(Ye.Z).finally((()=>{this.renderNewPromises.delete(i)})),i}_renderNewMessage(e,t){return gs(this,void 0,void 0,(function*(){if(!this.scrollable.loadedAll.bottom){const t=this.chat.setPeerPromise;if(t){const i=this.getMiddleware();t.then((()=>gs(this,void 0,void 0,(function*(){if(!i())return;const t=yield this.chat.getMessage(e.mid);i()&&this.renderNewMessage(t)}))))}return}if(this.chat.threadId&&(0,b.Z)(e,this.chat.isForum)!==this.chat.threadId)return;if(this.bubbles[e.mid])return;t||(t=this.scrolledDown&&(!this.scrollingToBubble||this.scrollingToBubble===this.getLastBubble()||this.scrollingToBubble===this.chatInner));const i=this.getMiddleware(),{isPaddingNeeded:s,unsetPadding:n}=this.setTopPadding(i),a=this.performHistoryResult({history:[e]},!1);return t&&a.then((()=>{if(!i())return;let t;"scheduled"===this.chat.type&&(t=this.bubbles[e.mid]);const a=t?this.scrollToBubbleEnd(t):this.scrollToEnd();s&&a.then(n)})),a}))}getLastBubble(){var e;const t=this.bubbleGroups.getLastGroup();return null===(e=null==t?void 0:t.lastItem)||void 0===e?void 0:e.bubble}scrollToBubble(e,t,i,s){const n=(0,be.Z)(e,"bubble");let a;if(e.parentElement||this.log.error("element is not connected",n),n&&"end"!==t){const e=this.bubbleGroups.getItemByBubble(n);e&&e.group.firstItem===e&&(0,Ie.Z)(e.group.container)===(this.stickyIntersector?Cs:1)&&(a=e.group.container.parentElement)}const r=this.chat.input.messageInput&&this.chat.input.messageInput.classList.contains("is-changing-height")||this.chat.container.classList.contains("is-toggling-helper"),d=this.scrollable.scrollIntoViewNew({element:e,position:t,margin:4,forceDirection:i,forceDuration:s,axis:"y",getNormalSize:r?({rect:e})=>{let t=xe.Z.height;return t-=this.container.offsetTop,t-=o.Z.isMobile||xe.Z.height<570?58:78,t}:void 0,fallbackToElementStartWhenCentering:a,startCallback:e=>{if(this.onScroll(!0,e),this.updateGradient){const{gradientRenderer:t}=this.chat;null==t||t.toNextPosition(e.getProgress),this.updateGradient=void 0}}});return i===ue.f.Static&&(this.scrollable.lastScrollPosition=this.scrollable.scrollTop),d}scrollToEnd(){return this.scrollToBubbleEnd(this.chatInner)}scrollToBubbleEnd(e){return gs(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}}))}scrollToBubbleIfLast(e){return gs(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)}createDateBubble(e,t=new Date(1e3*e)){let i;const s=new Date;s.setHours(0,0,0,0);const n="scheduled"===this.chat.type;if(s.getTime()===t.getTime())i=(0,L.ag)(n?"Chat.Date.ScheduledForToday":"Date.Today");else if(n&&e===Te)i=(0,L.ag)("MessageScheduledUntilOnline");else{const e={day:"numeric",month:"long"};t.getFullYear()!==s.getFullYear()&&(e.year="numeric"),i=new L.ZP.IntlDateElement({date:t,options:e}).element,n&&(i=(0,L.ag)("Chat.Date.ScheduledFor",[i]))}const a=document.createElement("div");a.className="bubble service is-date";const o=document.createElement("div");o.classList.add("bubble-content");const r=document.createElement("div");return r.classList.add("service-msg"),r.append(i),o.append(r),a.append(o),a}getDateForDateContainer(e){const t=new Date(1e3*e);return t.setHours(0,0,0),{date:t,dateTimestamp:t.getTime()}}getDateContainerByTimestamp(e){var t;const{date:i,dateTimestamp:s}=this.getDateForDateContainer(e);let n=this.dateMessages[s];if(n)return n;const a=this.createDateBubble(e,i),o=this.createDateBubble(e,i);o.classList.add("is-fake");const r=document.createElement("section");r.className="bubbles-date-group",r.append(a,o),n=this.dateMessages[s]={div:a,container:r,firstTimestamp:i.getTime()};const d=(0,ot.Z)(this.dateMessages,"asc"),l=d.length;let c,h=0;for(;hthis.setPeerTempId===d,u=(0,Et.Z)(h,Ls);i||(yield u(this.chat.onChangePeer(e,u)));const p=this.chat.type;("scheduled"===p||this.chat.isRestricted)&&(o=0);const f=yield u(this.chat.getHistoryStorage()),g="pinned"===p?yield u(this.managers.appMessagesManager.getPinnedMessagesMaxId(n,this.chat.threadId)):null!==(t=f.maxId)&&void 0!==t?t:0,v=void 0!==o;let b,y,w,S=0;if(!v)if(i||(y=this.chat.appImManager.getChatSavedPosition(this.chat)),y);else if(g){S=yield u(this.managers.appMessagesManager.getReadMaxIdIfUnread(n,this.chat.threadId));const e=yield u(this.chat.getDialogOrTopic());if(!S||i||e&&1===e.unread_count)o=g;else{const e=f.history.findSliceOffset(S);e&&e.slice.isEnd(ve.D.Bottom)&&(w=e.slice[e.offset-25]||e.slice[0]||S),b=!v,o=S}}const C=o!==g;if(void 0===r&&(yield u(this.chat.isStartButtonNeeded()))&&(r=m.gZ),i){a&&o&&this.followStack.push(a);const e=yield u(this.getMountedBubble(o));if(e)return v?(this.scrollToBubble(e.bubble,"center"),this.highlightBubble(e.bubble),this.chat.dispatchEvent("setPeer",o,!1)):g&&!C&&(this.scrollToEnd(),this.chat.dispatchEvent("setPeer",o,!0)),void 0!==r&&this.chat.input.setStartParam(r),null}else this.peerId&&(this.lazyLoadQueue.queueId=++Ss,this.managers.apiFileManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId)),this.followStack.length=0,this.passEntities={messageEntityBotCommand:(yield u(this.managers.appPeersManager.isAnyGroup(n)))||this.chat.isBot};ge.ZP&&c("setPeer peerId:",n,f,o,g);const L=null!=w?w:C||"scheduled"===p||this.chat.isRestricted?0:g;let E=0;if(i){const e=this.getBubbleByPoint("bottom");e&&(E=+e.dataset.mid),E<=0&&(E=Math.max(...Object.keys(this.bubbles).map((e=>+e))))}else this.isFirstLoad=!0,this.destroyResizeObserver();const I=this.chatInner,M=this.emptyPlaceholderBubble;this.cleanup();const P=this.chatInner=document.createElement("div");i?(P.className=I.className,P.classList.remove("disable-hover","is-scrolling")):P.classList.add("bubbles-inner"),this.lazyLoadQueue.lock();const Z=i||g&&C||v,T=E>0&&(!o||Ethis.performHistoryResult({history:y.mids},!0))),cached:!0,waitPromise:Promise.resolve()}:yield u(this.getHistory1(o,!0,C,L)),this.setPeerCached=A.cached,c.warn("got history");const{promise:_,cached:F}=A;F||i||(yield u(this.chat.finishPeerChange(v,C,o,r)),this.scrollable.container.textContent="",this.preloader.attach(this.container)),s.Z.lockGroup(this.chat.animationGroup);const D=u(_).then((()=>gs(this,void 0,void 0,(function*(){var e;c.warn("promise fulfilled");const t=Z?yield u(o?this.getMountedBubble(o):{bubble:this.getLastBubble()}):void 0;F&&!i&&(c.warn("finishing peer change"),yield u(this.chat.finishPeerChange(v,C,o,r)),c.warn("finished peer change")),this.preloader.detach(),this.resolveLadderAnimation&&(this.resolveLadderAnimation(),this.resolveLadderAnimation=void 0),this.setPeerCached=void 0;const a=this.scrollable;if(a.lastScrollDirection=0,a.lastScrollPosition=0,(0,H.Z)(a.container,P),M&&this.cleanupPlaceholders(M),this.attachPlaceholderOnRender&&this.attachPlaceholderOnRender(),!v&&this.chat.isPinnedMessagesNeeded()&&(null===(e=this.chat.topbar.pinnedMessage)||void 0===e||e.setCorrectIndex(0)),this.container.classList.toggle("has-groups",!!Object.keys(this.dateMessages).length),c.warn("mounted chat",this.chatInner===P,this.chatInner.parentElement,performance.now()-l),s.Z.unlockGroup(this.chat.animationGroup),s.Z.checkAnimations(!1,this.chat.animationGroup),this.lazyLoadQueue.unlock(),y)a.setScrollTopSilently(y.top);else if(Z){let e;if(k)a.setScrollTopSilently(99999);else if(x){const t=this.setTopPadding();t.isPaddingNeeded&&(e=t.unsetPadding),a.setScrollTopSilently(0)}let s,n=b&&this.firstUnreadBubble||(null==t?void 0:t.bubble);if((null==n?void 0:n.parentElement)||(n=this.findNextMountedBubbleByMsgId(o,!1)||this.findNextMountedBubbleByMsgId(o,!0)),n){const e=this.getLastBubble(),t=b?"start":C||v||e!==n?"center":"end";s="end"===t&&e===n&&i?this.scrollToEnd():this.scrollToBubble(n,t,i?void 0:ue.f.Static),!b&&v&&this.highlightBubble(n)}e&&(s||Promise.resolve()).then((()=>{e()}))}else a.setScrollTopSilently(99999);this.onRenderScrollSet(),this.onScroll();const d=Promise.all([D,(0,pe.e9)()]);if(d.then((()=>{a.checkForTriggers()})),this.chat.dispatchEvent("setPeer",o,!C),Promise.all([this.setFetchReactionsInterval(d),this.setFetchHistoryInterval({afterSetPromise:d,lastMsgId:o,samePeer:i,savedPosition:y,topMessage:g})]).then((()=>{c("scrolledAllDown:",a.loadedAll.bottom),a.loadedAll.bottom&&g&&!this.unreaded.size&&this.onScrolledAllDown()})),"chat"===p&&!this.chat.isForumTopic){const e=yield u(this.managers.appMessagesManager.getDialogOnly(n));(null==e?void 0:e.pFlags.unread_mark)&&this.managers.appMessagesManager.markDialogUnread(n,!0)}})))).catch((e=>{throw c.error("setPeer promise error:",e),h()||this.preloader.detach(),e}));return{cached:F,promise:D}}))}setFetchReactionsInterval(e){return gs(this,void 0,void 0,(function*(){const t=this.getMiddleware();if(this.chat.isChannel){const i=()=>gs(this,void 0,void 0,(function*(){if(!t())return;const e=[];for(const t in this.bubbles){let i=yield this.chat.getMessage(+t);"message"===(null==i?void 0:i._)&&(i=yield this.managers.appMessagesManager.getGroupsFirstMessage(i),e.push(i.mid))}(e.length?this.managers.appReactionsManager.getMessagesReactions(this.peerId,e):Promise.resolve()).then((()=>{setTimeout(i,1e4)}))}));Promise.all([e,(0,pe.e9)(),(0,nt.Z)(500)]).then((()=>{i()}))}}))}setFetchHistoryInterval({lastMsgId:e,topMessage:t,afterSetPromise:i,savedPosition:s,samePeer:n}){return gs(this,void 0,void 0,(function*(){const e=this.getMiddleware(),t=this.peerId,n=yield this.managers.appMessagesManager.isFetchIntervalNeeded(t);if(!s&&!n)return;if(yield i,!e())return;const a=t.toChatId();e.onClean((()=>{this.managers.apiUpdatesManager.unsubscribeFromChannelUpdates(a)})),this.managers.apiUpdatesManager.subscribeToChannelUpdates(a)}))}onScrolledAllDown(){return gs(this,void 0,void 0,(function*(){if("chat"===this.chat.type||"discussion"===this.chat.type){const e=yield this.chat.getHistoryMaxId();this.managers.appMessagesManager.readHistory(this.peerId,e,this.chat.threadId,!0)}}))}finishPeerChange(){return gs(this,void 0,void 0,(function*(){const[e,t,i]=yield Promise.all([this.chat.isChannel,this.chat.canSend(),this.chat.isAnyGroup]);return()=>{this.chatInner.classList.toggle("has-rights",t),this.container.classList.toggle("is-chat-input-hidden",!t),this.chatInner.classList.toggle("is-chat",i),this.chatInner.classList.toggle("is-channel",e),this.createResizeObserver()}}))}renderMessagesQueue(e){return this.batchProcessor.addToQueue(e)}ejectBubbles(){for(const e of this.bubblesToEject)e.remove();this.bubblesToEject.clear()}groupBubbles(e){let t;"scheduled"===this.chat.type&&(t=new Set,e.forEach((({bubble:e,message:i})=>{const s=this.bubbleGroups.getItemByBubble(e),n=null==s?void 0:s.group;n&&s.message.date!==i.date&&(this.bubbleGroups.removeItem(s),t.add(n))}))),e.forEach((({bubble:e,message:t})=>{this.bubbleGroups.prepareForGrouping(e,t)}));const i=this.bubbleGroups.groupUngrouped(),s=Array.from(i).map((e=>{if(e.avatar)return;const t=e.firstItem;return t&&this.chat.isAvatarNeeded(t.message)?e.createAvatar(t.message):void 0})).filter(Boolean);if(t)for(const e of t)i.add(e);return{groups:[...i],avatarPromises:s}}getMiddleware(e){return this.middlewareHelper.get(e)}wrapMediaSpoiler({media:e,promise:t,middleware:i,attachmentDiv:s}){return gs(this,void 0,void 0,(function*(){if(yield t,!i())return;const{width:n,height:a}=s.style,o=yield(0,$i.ZP)({media:e,width:parseInt(n),height:parseInt(a),middleware:i,animationGroup:this.chat.animationGroup});i()&&s.append(o)}))}safeRenderMessage(e,t,i,s=!0,n){return gs(this,void 0,void 0,(function*(){if(!e||this.renderingMessages.has(e.mid)||this.bubbles[e.mid]&&!i)return;const a=this.getMiddleware().create(),o=a.get();let r;try{this.renderingMessages.add(e.mid);const d=document.createElement("div");d.middlewareHelper=a,d.dataset.mid=""+e.mid,d.dataset.peerId=""+e.peerId,d.dataset.timestamp=""+e.date,i&&(i.middlewareHelper.destroy(),this.skippedMids.delete(e.mid),this.bubblesToEject.add(i),this.bubblesToReplace.delete(i),this.bubblesToReplace.set(d,i),this.bubbleGroups.changeBubbleByBubble(i,d)),i=this.bubbles[e.mid]=d;let l=this.renderMessage(e,t,i,o);n&&(l=n(l,i));const c=l.then((e=>e&&o()?Object.assign(Object.assign({},e),{updatePosition:s}):void 0));if(this.renderMessagesQueue(c.catch((()=>{}))),r=yield c,!o())return;r||this.skippedMids.add(+e.mid)}catch(e){this.log.error("renderMessage error:",e)}return o()?(this.renderingMessages.delete(e.mid),r):void 0}))}renderMessage(e,t=!1,i,s){var n,a,r;return gs(this,void 0,void 0,(function*(){const l="message"===e._,c=l&&e.grouped_id;let h,u;const p=c?yield this.managers.appMessagesManager.getMessagesByAlbum(c):void 0,g="pinned"!==this.chat.type;if(c&&g){h=p.map((e=>e.mid));const t=Ms(h);if(e.mid!==t)return}l&&(u=c?p[0]:e);const v=this.chat.isOurMessage(e),y=document.createElement("div");y.classList.add("message","spoilers-container");const w=document.createElement("div");w.classList.add("bubble-content-wrapper");const S=document.createElement("div");S.classList.add("bubble-content"),i.classList.add("bubble"),w.append(S),i.append(w);let E=!v&&!e.pFlags.out&&(e.pFlags.unread||gt(e));if(!E&&this.chat.peerId.isAnyChat()){const t=yield this.managers.appMessagesManager.getReadMaxIdIfUnread(this.chat.peerId,this.chat.threadId);void 0!==t&&t"messageEntityEmoji"===e._)),t=T.replace(/\s/g,"").length;if(e.reduce(((e,t)=>e+t.length),0)===t){O=Math.min(Is,e.length),R=o.Z.active.customEmoji;const t=Es[O];t&&(R=(0,qe.C)(t,t),i.style.setProperty("--emoji-size",t+"px"))}}null!=R||(R=this.chat.appImManager.customEmojiSize);const H=(0,ft.ZP)(T,{entities:k,passEntities:this.passEntities,loadPromises:I,lazyLoadQueue:this.lazyLoadQueue,customEmojiSize:R,middleware:s,animationGroup:this.chat.animationGroup});let z,j=!0,G=!1;if(O){if(d.Z.settings.emoji.big){const e=1===O&&!k.find((e=>"messageEntityCustomEmoji"===e._))&&(yield this.managers.appStickersManager.getAnimatedEmojiSticker(T));1===O&&!_&&e?_={_:"messageMediaDocument",document:e,pFlags:{}}:(z=document.createElement("div"),z.classList.add("attachment","spoilers-container"),(0,F.Z)(z,H),S.append(z)),i.classList.add("is-message-empty","emoji-big"),G=!0,j=!1,D=!1}i.classList.add("can-have-big-emoji")}D&&(0,F.Z)(y,H);const V=(q=T,hs.test(q));var q;const Y=de.setTime({chatType:this.chat.type,message:e,reactionsMessage:u});let Q;if(y.append(Y),S.prepend(y),V&&Y.classList.add("is-block"),l&&this.chat.isAllMessagesForum){const t=yield(0,ms.Z)({peerId:this.peerId,threadId:(0,b.Z)(e,this.chat.isForum),lastMsgId:e.mid,wrapOptions:{middleware:s},withIcons:!0}),{element:i}=t;Q=document.createElement("div"),Q.classList.add("topic-name-button-container"),Q.append(i)}if(l&&e.views){if(i.classList.add("channel-post"),!(null===(n=e.fwd_from)||void 0===n?void 0:n.saved_from_msg_id)&&"pinned"!==this.chat.type){const e=document.createElement("div");e.classList.add("bubble-beside-button","forward","tgico-forward_filled"),S.prepend(e),i.classList.add("with-beside-button")}!e.pFlags.is_outgoing&&this.observer&&this.observer.observe(i,this.viewsObserverCallback)}const X=l&&e.reply_markup;let J="replyInlineMarkup"===(null==X?void 0:X._)&&X.rows;if(J&&(J=J.filter((e=>e.buttons.length))),J){const t=document.createElement("div");t.classList.add("reply-markup"),J.forEach((i=>{const s=i.buttons,n=document.createElement("div");n.classList.add("reply-markup-row"),s.forEach((t=>{let i,s=(0,ft.ZP)(t.text,{noLinks:!0,noLinebreaks:!0});switch(t._){case"keyboardButtonUrl":{const e=(0,ft.ZP)(" ",{entities:[{_:"messageEntityTextUrl",length:1,offset:0,url:t.url}]});i=(0,Le.Z)(e).firstElementChild,i.classList.add("is-link");break}case"keyboardButtonSwitchInline":i=document.createElement("button"),i.classList.add("is-switch-inline"),(0,C.fc)(i,(i=>{(0,Ce.Z)(i);const s=e.viaBotId||e.fromId;let n;n=t.pFlags.same_peer?Promise.resolve(this.peerId):this.managers.appInlineBotsManager.checkSwitchReturn(s).then((e=>e||new Promise(((e,t)=>{const i=new M.Z(void 0,(t=>{e(t)}));i.addEventListener("close",(()=>{t()}))})))),n.then((e=>{const i=this.peerId===e?this.chat.threadId:void 0;this.chat.appImManager.setInnerPeer({peerId:e}),this.managers.appInlineBotsManager.switchInlineQuery(e,i,s,t.query)}))}));break;case"keyboardButtonBuy":{const e="messageMediaInvoice"===_._?_:void 0;if(null==e?void 0:e.extended_media)break;i=document.createElement("button"),i.classList.add("is-buy"),(null==e?void 0:e.receipt_msg_id)&&(s=(0,L.ag)("Message.ReplyActionButtonShowReceipt"));break}case"keyboardButtonUrlAuth":{i=document.createElement("button"),i.classList.add("is-url-auth");const{peerId:s}=this,{mid:n}=e,{url:a,button_id:o}=t;(0,C.fc)(i,(()=>{const e=(0,Ut.Z)([i],!0);this.chat.appImManager.handleUrlAuth({peerId:s,mid:n,url:a,buttonId:o}).then((()=>{e()}))}));break}default:i=document.createElement("button")}if(!i)return;i.classList.add("reply-markup-button","rp","tgico");const a=document.createElement("span");a.classList.add("reply-markup-button-text"),"string"==typeof s?a.insertAdjacentHTML("beforeend",s):a.append(s),(0,A.Z)(i),i.append(a),n.append(i)})),n.childElementCount&&t.append(n)}));const s=!!t.childElementCount;s&&(0,C.fc)(t,(t=>{let i=t.target;if(i.classList.contains("reply-markup-button")||(i=(0,be.Z)(i,"reply-markup-button")),!i||i.classList.contains("is-link")||i.classList.contains("is-switch-inline")||i.classList.contains("is-buy")||i.classList.contains("is-url-auth"))return;(0,Ce.Z)(t);const s=(0,Ie.Z)(i),n=J[(0,Ie.Z)(i.parentElement)];if(!n.buttons||!n.buttons[s])return void this.log.warn("no such button",n,s,e);const a=n.buttons[s];this.managers.appInlineBotsManager.callbackButtonClick(this.peerId,e.mid,a).then((e=>{"string"==typeof e.message&&e.message.length&&(0,we.Am)((0,ft.ZP)(e.message,{noLinks:!0,noLinebreaks:!0}))}))})),s&&(i.classList.add("with-reply-markup"),w.append(t))}const ee=e.pFlags.is_outgoing;if(v){(e.pFlags.unread||ee)&&this.unreadOut.add(e.mid);let t="";t=e.error?"is-error":ee?"is-sending":e.pFlags.unread||e.pFlags.is_scheduled?"is-sent":"is-read",i.classList.add(t)}ee&&!e.error&&i.classList.add("is-outgoing");const te=l&&(yield this.managers.appMessagesManager.getMessageWithCommentReplies(e)),ie=!!te&&e.mid>0;ie&&i.classList.add("with-replies");const se=l&&e.fwd_from,ne=l&&e.fwdFromId,ae=this.chat.isOutMessage(e);let oe=S;const re=!(e.viaBotId||e.fromId!==d.Z.myId&&e.pFlags.out),le=!T;let ce;if(_){z=document.createElement("div"),z.classList.add("attachment"),le&&i.classList.add("is-message-empty");let t=!1;switch(_._){case"messageMediaPhoto":{const t=_.photo;if(le&&(j=!1),re&&i.classList.add("hide-name"),i.classList.add("photo"),g&&c&&1!==h.length){i.classList.add("is-album","is-grouped"),qi({messages:p,attachmentDiv:z,middleware:this.getMiddleware(),isOut:v,lazyLoadQueue:this.lazyLoadQueue,chat:this.chat,loadPromises:I,autoDownload:this.chat.autoDownload});break}const n=!x.IS_ANDROID&&j&&!ie&&!1;n&&i.classList.add("with-media-tail");const a=(0,K.Z)({photo:t,message:e,container:z,withTail:n,isOut:ae,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),loadPromises:I,autoDownloadSize:this.chat.autoDownload.photo});_.pFlags.spoiler&&I.push(this.wrapMediaSpoiler({media:t,promise:a,middleware:s,attachmentDiv:z}));break}case"messageMediaWebPage":{t=!0;const s=_.webpage;if("webPage"!==s._)break;const n=(0,fs.Z)(s.url);if("im"===(null==n?void 0:n.onclick)){const e={telegram_channel:"Chat.Message.ViewChannel",telegram_megagroup:"OpenGroup",telegram_bot:"Chat.Message.ViewBot"}[s.type]||"OpenMessage";ce=this.makeViewButton({text:e,asLink:!0}),ce.href=n.url,ce.setAttribute("onclick",`${n.onclick}(this)`)}i.classList.add("webpage");const a=document.createElement("div");a.classList.add("web");const r=document.createElement("div");let l,c;r.classList.add("quote");const h=s.photo;(h||s.document)&&(l=document.createElement("div"),l.classList.add("preview-resizer"),c=document.createElement("div"),c.classList.add("preview"),l.append(c));const u=document.createElement("div");u.classList.add("quote-text");const p=s.document;if(p)if("gif"===p.type||"video"===p.type||"round"===p.type){const t="round"===p.type?o.Z.active.round:o.Z.active.webpage;"round"===p.type?(i.classList.add("round"),c.classList.add("is-round")):i.classList.add("video"),(0,$.Z)({doc:p,container:c,message:e,boxWidth:t.width,boxHeight:t.height,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),isOut:ae,group:this.chat.animationGroup,loadPromises:I,autoDownload:this.chat.autoDownload,noInfo:e.mid<0})}else{const t=yield(0,Yi.Z)({message:e,autoDownloadSize:this.chat.autoDownload.file,lazyLoadQueue:this.lazyLoadQueue,loadPromises:I,sizeType:"documentName",searchContext:{useSearch:!1,peerId:this.peerId,inputFilter:{_:"inputMessagesFilterEmpty"}},fontSize:d.Z.settings.messagesTextSize});c.append(t),c.classList.add("preview-with-document"),u.classList.add("has-document")}let f;if(l&&u.append(l),s.site_name){const e=(0,ft.ZP)(s.url),t=(0,Le.Z)(e).firstElementChild;t.classList.add("webpage-name");const i=document.createElement("strong");(0,F.Z)(i,(0,B.Z)(s.site_name)),t.textContent="",t.append(i),u.append(t),f=t}const m=(0,pt.Z)(s);if(m.textContent){const e=document.createElement("div");e.classList.add("title");const t=document.createElement("strong");(0,F.Z)(t,m),e.append(t),u.append(e),f=e}const g=(0,ut.Z)(s);if(g.textContent){const e=document.createElement("div");e.classList.add("text"),(0,F.Z)(e,g),u.append(e),f=e}if(r.append(u),h&&!p){i.classList.add("photo");const t=h.sizes[h.sizes.length-1];let s=!1;t.w===t.h&&f?(i.classList.add("is-square-photo"),s=!0,(0,ht.Z)(h,c,48,48,!1)):t.h>t.w&&i.classList.add("is-vertical-photo"),(0,K.Z)({photo:h,message:e,container:c,boxWidth:s?0:o.Z.active.webpage.width,boxHeight:s?0:o.Z.active.webpage.height,isOut:ae,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),loadPromises:I,withoutPreloader:s,autoDownloadSize:this.chat.autoDownload.photo})}a.append(r),y.insertBefore(a,Y);break}case"messageMediaDocument":{const n=_.document;if(n.sticker){i.classList.add("sticker"),j=!1,G=!0,n.animated&&i.classList.add("sticker-animated");const e=o.Z.active,t=i.classList.contains("emoji-big"),r=t?e.emojiSticker:n.animated?e.animatedSticker:e.staticSticker;(0,ht.Z)(n,z,r.width,r.height),S.style.minWidth=z.style.width,S.style.minHeight=z.style.height,(0,W.ZP)({doc:n,div:z,middleware:s,lazyLoadQueue:this.lazyLoadQueue,group:this.chat.animationGroup,play:!0,loop:!0,emoji:t?T:void 0,withThumb:!0,loadPromises:I,isOut:ae,noPremium:null===(a=null==_?void 0:_.pFlags)||void 0===a?void 0:a.nopremium}),((0,zi.Z)(n)||t)&&(E||ee)&&this.observer.observe(i,this.stickerEffectObserverCallback)}else if("video"===n.type||"gif"===n.type||"round"===n.type){const t="round"===n.type;if(t&&(G=!0),(t||le)&&(j=!1),re&&i.classList.add("hide-name"),i.classList.add(t?"round":"video"),g&&c&&1!==h.length)i.classList.add("is-album","is-grouped"),qi({messages:p,attachmentDiv:z,middleware:s,isOut:v,lazyLoadQueue:this.lazyLoadQueue,chat:this.chat,loadPromises:I,autoDownload:this.chat.autoDownload});else{const a=!x.IS_ANDROID&&!x.IS_APPLE&&!t&&j&&!ie&&!1;a&&i.classList.add("with-media-tail");const r=(0,$.Z)({doc:n,container:z,message:e,boxWidth:o.Z.active.regular.width,boxHeight:o.Z.active.regular.height,withTail:a,isOut:ae,lazyLoadQueue:this.lazyLoadQueue,middleware:s,group:this.chat.animationGroup,loadPromises:I,autoDownload:this.chat.autoDownload,searchContext:t?{peerId:this.peerId,inputFilter:{_:"inputMessagesFilterRoundVoice"},threadId:this.chat.threadId,useSearch:!e.pFlags.is_scheduled,isScheduled:e.pFlags.is_scheduled}:void 0,noInfo:e.mid<0,noAutoplayAttribute:!!_.pFlags.spoiler});_.pFlags.spoiler&&I.push(this.wrapMediaSpoiler({media:n,promise:r,middleware:s,attachmentDiv:z}))}}else{const s=yield function({albumMustBeRenderedFull:e,message:t,bubble:i,messageDiv:s,chat:n,loadPromises:a,autoDownloadSize:o,lazyLoadQueue:r,searchContext:d,useSearch:l,sizeType:c,managers:h,fontWeight:u,fontSize:p,richTextFragment:f}){return Qi(this,void 0,void 0,(function*(){let l;const m=e?yield n.getMidsByMid(t.mid):[t.mid],g=m.map(((e,t)=>Qi(this,void 0,void 0,(function*(){const i=yield n.getMessage(e),s=yield(0,Yi.Z)({message:i,loadPromises:a,autoDownloadSize:o,lazyLoadQueue:r,searchContext:d,sizeType:c,managers:h,fontWeight:u,fontSize:p}),g=document.createElement("div");g.classList.add("document-container"),g.dataset.mid=""+e,g.dataset.peerId=""+i.peerId;const v=document.createElement("div");if(v.classList.add("document-wrapper"),i.message){const e=document.createElement("div");e.classList.add("document-message"),(0,F.Z)(e,f),v.append(e)}if(m.length>1){const e=document.createElement("div");e.classList.add("document-selection"),g.append(e),g.classList.add("grouped-item"),0===t&&(l=v)}return v.append(s),g.append(v),g})))),v=yield Promise.all(g);return s.append(...v),m.length>1&&i.classList.add("is-multiple-documents","is-grouped"),l}))}({albumMustBeRenderedFull:g,message:e,bubble:i,messageDiv:y,chat:this.chat,loadPromises:I,autoDownloadSize:this.chat.autoDownload.file,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,sizeType:"documentName",fontSize:d.Z.settings.messagesTextSize,richTextFragment:H});s&&(oe=s);const a=y.lastElementChild.querySelector(".document-message, .document, .audio");a&&a.append(Y),i.classList.remove("is-message-empty");const o=(["photo","pdf"].includes(n.type)?"document":n.type||"document")+"-message";y.classList.add(o),"audio"!==n.type&&"voice"!==n.type||i.classList.add("min-content"),t=!0}break}case"messageMediaCall":{const e=_.action,s=document.createElement("div");s.classList.add("bubble-call",e.pFlags.video?"tgico-videocamera":"tgico-phone");const n=e.pFlags.video?"video":"voice";s.dataset.type=n;const a=document.createElement("div");a.classList.add("bubble-call-title"),(0,L.$d)(a,ae?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((0,Ne.Z)(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"),(0,L.$d)(o,t)}o.classList.add("tgico","arrow-"+(void 0!==e.duration?"green":"red")),s.append(a,o),t=!0,i.classList.remove("is-message-empty"),y.classList.add("call-message"),y.append(s);break}case"messageMediaContact":{const e=_,s=document.createElement("div");s.classList.add("contact"),s.dataset.peerId=""+e.user_id,t=!0;const n=document.createElement("div");n.className="contact-details";const a=document.createElement("div");a.className="contact-name";const o=[e.first_name,e.last_name].filter(Boolean).join(" ");a.append(o.trim()?(0,B.Z)(o):(0,L.ag)("AttachContact"));const r=document.createElement("div");r.className="contact-number",r.textContent=e.phone_number?"+"+(0,Ae.u)(e.phone_number).formatted:"Unknown phone number",s.append(n),n.append(a,r);const d=new f.Z;d.updateWithOptions({lazyLoadQueue:this.lazyLoadQueue,peerId:e.user_id.toPeerId(),peerTitle:e.user_id?void 0:o.trim()?o:L.ZP.format("AttachContact",!0)[0]}),d.classList.add("contact-avatar","avatar-54"),s.prepend(d),i.classList.remove("is-message-empty"),y.classList.add("contact-message"),y.append(s);break}case"messageMediaPoll":{i.classList.remove("is-message-empty");const t=function(e,t=d.Z.managers){const i=new ls;return i.message=e,i.managers=t,i.setAttribute("peer-id",""+e.peerId),i.setAttribute("poll-id",e.media.poll.id),i.setAttribute("message-id",""+e.mid),i.render(),i}(e);y.prepend(t),y.classList.add("poll-message");break}case"messageMediaInvoice":{const t=_.pFlags.test,n=_.extended_media,a="messageExtendedMedia"===(null==n?void 0:n._),r="messageExtendedMediaPreview"===(null==n?void 0:n._);let d=a?n.media.photo||n.media.document:_.photo;const l=(0,Pt.Z)(_.total_amount,_.currency);let c,h;if(n){if(r&&(c=document.createElement("span"),c.classList.add("extended-media-buy","tgico-premium_lock"),z.classList.add("is-buy"),(0,L.$d)(c,"Checkout.PayPrice",[l]),void 0!==n.video_duration)){const e=document.createElement("span");e.classList.add("video-time"),e.textContent=(0,ts.Z)(n.video_duration,!1),z.append(e)}}else{c=document.createElement(d?"span":"div");const e=document.createDocumentFragment(),i=(0,L.ag)(_.receipt_msg_id?"PaymentReceipt":t?"PaymentTestInvoice":"PaymentInvoice");i.classList.add("text-uppercase");const s=" โ€Ž",n=document.createElement("span");if(n.classList.add("text-bold"),n.textContent=l+s,e.append(n,i),t&&_.receipt_msg_id){const t=document.createElement("span");t.classList.add("text-uppercase","pre-wrap"),t.append(s+"(Test)"),e.append(t)}(0,F.Z)(c,e)}if(r&&(n.thumb.w=n.w,n.thumb.h=n.h,d={_:"photo",access_hash:"",pFlags:{},date:0,dc_id:0,file_reference:[],id:0,sizes:[n.thumb]}),d){const t=n?o.Z.active.extendedInvoice:o.Z.active.invoice;"document"===d._?((0,$.Z)({doc:d,container:z,withTail:!1,isOut:ae,lazyLoadQueue:this.lazyLoadQueue,middleware:s,loadPromises:I,boxWidth:t.width,boxHeight:t.height,group:this.chat.animationGroup,message:e}),i.classList.add("video")):((0,K.Z)({photo:d,container:z,withTail:!1,isOut:ae,lazyLoadQueue:this.lazyLoadQueue,middleware:s,loadPromises:I,boxWidth:t.width,boxHeight:t.height,message:a?e:void 0}),i.classList.add("photo")),c&&(n||c.classList.add("video-time"),z.append(c))}else z=void 0;if(r){const{mid:t}=e;this.extendedMediaMessages.add(t),s.onClean((()=>{this.extendedMediaMessages.delete(t)})),this.setExtendedMediaMessagesPollInterval();const{width:i,height:n}=z.style,a=us.Z.create({width:parseInt(i),height:parseInt(n),middleware:s,animationGroup:this.chat.animationGroup});z.append(a.canvas)}n||(h=document.createElement("div"),h.classList.add("bubble-primary-color"),(0,F.Z)(h,(0,B.Z)(_.title)));const u=a?void 0:(0,B.Z)(_.description);y.prepend(...[h,!d&&c,u].filter(Boolean)),u?i.classList.remove("is-message-empty"):j=!1,i.classList.add("is-invoice");break}default:z=void 0,i.classList.remove("is-message-empty"),y.append((0,L.ag)(L.nK),Y),this.log.warn("unrecognized media type:",_._,e)}!t&&z&&S.append(z)}G&&i.classList.add("just-media"),ce&&Y.before(ce);let he="";const ue=e.fromId!==d.Z.myId&&this.chat.isAnyGroup||e.viaBotId||e.pFlags.sponsored;if(ue||se||e.reply_to_mid||Q){let t,s;const n="peerChannel"===(null===(r=e.from_id)||void 0===r?void 0:r._)&&e.fromId===ne,a=!!e.viaBotId,o=se&&!se.from_id;e.viaBotId&&(s=document.createElement("span"),s.innerText="@"+(yield this.managers.appPeersManager.getPeerUsername(e.viaBotId)),s.classList.add("peer-title")),a&&i.classList.add("must-have-name");const c=ne||se;let h,u;if(o?(t=document.createElement("span"),(0,F.Z)(t,(0,B.Z)(se.from_name)),t.classList.add("peer-title"),i.classList.add("hidden-profile")):t=new N.Z({peerId:ne||e.fromId,withPremiumIcon:!c,wrapOptions:Z}).element,l&&e.reply_to_mid&&e.reply_to_mid!==this.chat.threadId&&(!this.chat.isAllMessagesForum||e.reply_to.reply_to_top_id)&&(h=yield de.setReply({chat:this.chat,bubble:i,bubbleContainer:S,message:e})),c)if(this.peerId===d.Z.myId||n||i.classList.add("forwarded"),e.savedFrom&&(he=e.savedFrom,t.dataset.savedFrom=he),u=document.createElement("div"),t.dataset.peerId=""+ne,this.peerId!==d.Z.myId&&this.peerId!==m.hj&&!n||G){const e=[t];if(G){const t=document.createElement("br");t.classList.add("hide-ol"),e.unshift(t)}u.append((0,L.ag)("ForwardedFrom",[e]))}else u.style.color=(0,U.Z)(ne,!1),u.classList.add("colored-name"),u.append(t);else if(!e.viaBotId)if(!G&&ue){u=document.createElement("div"),u.append(t);const i=yield this.managers.appPeersManager.getPeer(e.fromId),s=null==i?void 0:i.pFlags;s&&(s.scam||s.fake)&&u.append((0,lt.Z)(s.scam)),v||(u.style.color=(0,U.Z)(e.fromId,!1),u.classList.add("colored-name")),u.dataset.peerId=""+e.fromId}else i.classList.add("hide-name");if(e.viaBotId){u?u.append(" "):u=document.createElement("div");const e=document.createElement("span");e.append((0,L.ag)("ViaBot")," ",s),e.classList.add("is-via"),u.append(e)}Q&&(G?Q.classList.add("floating-part"):(u||(u=document.createElement("div")),u.append(Q),i.classList.remove("hide-name"))),u?(u.classList.add("name"),G?(oe.append(oe=document.createElement("div")),oe.classList.add("name-with-reply","floating-part")):u.classList.add("floating-part"),oe.append(u),G&&h&&oe.append(h)):G&&h&&h.classList.add("floating-part"),Q&&G&&(z?z.after(Q):this.log.error("no attachment div?",i,e))}else i.classList.add("hide-name");if("pinned"===this.chat.type&&(he=`${this.chat.peerId}_${e.mid}`),te&&te.mid===this.chat.threadId&&i.classList.add("is-thread-starter","is-group-last"),he&&("pinned"===this.chat.type||se.saved_from_msg_id)&&this.peerId!==m.hj){const e=document.createElement("div");e.classList.add("bubble-beside-button","goto-original","tgico-arrow_next"),S.append(e),i.dataset.savedFrom=he,i.classList.add("with-beside-button")}return i.classList.add(ae?"is-out":"is-in"),ie&&(de.renderReplies({bubble:i,bubbleContainer:S,message:te,messageDiv:y,loadPromises:I,lazyLoadQueue:this.lazyLoadQueue})?j=!0:i.classList.add("with-beside-replies")),l&&this.appendReactionsElementToBubble(i,e,u),j&&(i.classList.add("can-have-tail"),S.append(Zs())),P}))}appendReactionsElementToBubble(e,t,i,s){if(this.peerId.isUser(),!(null==i?void 0:i.reactions)||!i.reactions.results.length)return;const n=new st;if(n.init(i,"block",e.middlewareHelper.get()),n.render(s),e.classList.contains("is-message-empty"))e.querySelector(".bubble-content-wrapper").append(n);else{const s=e.querySelector(".message");if(e.classList.contains("is-multiple-documents")){const e=s.lastElementChild;let a=e.querySelector(".document-message"),o=a&&a.querySelector(".time");o||(o=de.setTime({chatType:this.chat.type,message:t,reactionsMessage:i})),n.append(o),a||(a=document.createElement("div"),a.classList.add("document-message"),e.querySelector(".document-wrapper").prepend(a)),a.append(n)}else{const t=Array.from(e.querySelectorAll(".time")).pop();n.append(t),s.append(n)}}}prepareToSaveScroll(e){if(!this.chatInner.parentElement)return{};const t=this.log.bindPrefix("prepareToSaveScroll");t("save");const i=this.createScrollSaver(e);if(i.save(),this.getRenderedLength()&&!this.chat.setPeerPromise){const e=this.getViewportSlice();this.deleteViewportSlice(e,!0)}return{restoreScroll:()=>{t("restore"),i.restore(e),this.onRenderScrollSet(i.getSaved())},scrollSaver:i}}performHistoryResult(e,t){var i;return gs(this,void 0,void 0,(function*(){let s=e.history;s=s.slice(),this.needReflowScroll&&(Ee(this.scrollable.container),this.needReflowScroll=!1);const n=yield Promise.all(s.map((e=>"number"==typeof e?this.chat.getMessage(e):e))),a=[];if(!this.scrollable.loadedAll.bottom||!this.scrollable.loadedAll.top){let t=e.isEnd;if(!t){const e=yield this.chat.getHistoryStorage(),i=e.history.first,n=e.history.last;t={top:!1,bottom:!1,both:!1},!i.isEnd(ve.D.Bottom)||i.length&&!s.includes(i[0])||(t.bottom=!0),!n.isEnd(ve.D.Top)||n.length&&!s.includes(n[n.length-1])||(t.top=!0)}if(!t.bottom&&this.setPeerOptions){const{lastMsgId:e,topMessage:i,savedPosition:s}=this.setPeerOptions;this.setPeerOptions=void 0,(!e&&!s||this.bubbles[i]||e===i)&&(t.bottom=!0)}t.top&&a.push(this.setLoaded("top",!0)),t.bottom&&a.push(this.setLoaded("bottom",!0))}yield Promise.all(a);const o=n.map((e=>e?e.pFlags.local?this.processLocalMessageRender(e):this.safeRenderMessage(e,t):void 0));yield Promise.all(o),yield this.messagesQueuePromise,this.scrollable.loadedAll.top&&this.messagesQueueOnRenderAdditional&&(this.messagesQueueOnRenderAdditional(),null===(i=this.messagesQueueOnRenderAdditional)||void 0===i||i.call(this))}))}onRenderScrollSet(e){const t="has-sticky-dates";if(this.container.classList.contains(t)||this.preloader.detached&&(null!=e||(e={scrollHeight:this.scrollable.scrollHeight,clientHeight:this.scrollable.container.clientHeight}),e.scrollHeight===e.clientHeight))this.willScrollOnLoad=void 0;else{const e=this.getMiddleware(),i=()=>{e()&&this.container.classList.add(t)};this.willScrollOnLoad?i():setTimeout(i,600)}}requestHistory(e,t,i){return"chat"===this.chat.type||"discussion"===this.chat.type?this.managers.acknowledged.appMessagesManager.getHistory(this.peerId,e,t,i,this.chat.threadId):"pinned"===this.chat.type?this.managers.acknowledged.appMessagesManager.getSearch({peerId:this.peerId,inputFilter:{_:"inputMessagesFilterPinned"},maxId:e,limit:t,backLimit:i}).then((e=>({cached:e.cached,result:Promise.resolve(e.result).then((e=>({history:e.history.map((e=>e.mid))})))}))):"scheduled"===this.chat.type?this.managers.acknowledged.appMessagesManager.getScheduledMessages(this.peerId).then((e=>({cached:e.cached,result:Promise.resolve(e.result).then((e=>({history:e.slice().reverse()})))}))):void 0}animateAsLadder(e,t,i,s,n){return gs(this,void 0,void 0,(function*(){const a=this.log.bindPrefix("ladder");if(this.chat.setPeerPromise&&!this.resolveLadderAnimation)return a.warn("will be delayed"),void(this.resolveLadderAnimation=this.animateAsLadder.bind(this,e,t,i,s,n));if(!Object.keys(this.bubbles).length)return void a.warn("no bubbles");let o,r=(0,ot.Z)(this.bubbles,"desc");i&&t.length&&(r=r.filter((e=>!t.includes(e)))),o=s?n||Math.max(...r):e||Math.max(...r);const d=r.slice(r.findIndex((e=>o>e))),l=i?[]:[o],c=i?[]:r.slice(0,r.findIndex((e=>o>=e))).reverse();ge.ZP&&a("targeting mid:",o,n,e,d.map((e=>(0,bt.Z)(e))),c.map((e=>(0,bt.Z)(e))));const h=[];this.chatInner.classList.add("zoom-fading");const u=i?10:40,p=i?0:1,f=(e,t=0)=>{const i=(0,me.Z)();let s=0;return e.forEach(((n,o)=>{const r=this.bubbles[n];if(!r||this.skippedMids.has(n))return void a.warn("no bubble by mid:",n);s=(o+t||.1)*u;const d=r.lastElementChild,l=[d],c=this.bubbleGroups.getItemByBubble(r);if(c&&c.group.avatar&&c.group.lastItem===c&&l.push(c.group.avatar),l.forEach((e=>{e.classList.add("zoom-fade","can-zoom-fade"),e.style.transitionDelay=s+"ms"})),o===e.length-1){const e=t=>{t.target===d&&(i.resolve(),d.removeEventListener("transitionend",e))};d.addEventListener("transitionend",e)}h.push(...l)})),e.length||i.resolve(),{lastMsDelay:s,animationPromise:i}},m=f(d,p),g=f(l),v=f(c,p),b=[m.animationPromise,g.animationPromise,v.animationPromise],y=[m.lastMsDelay,g.lastMsDelay,v.lastMsDelay];let w;return this.onAnimateLadder&&(yield this.onAnimateLadder()),(0,fe.T2)((()=>{this.setStickyDateManually(),h.forEach((e=>{e.classList.remove("zoom-fade")}))})),(d.length||l.length||c.length)&&(w=Promise.all(b),(0,pe.YW)(w,Math.max(...y)+200).then((()=>{(0,fe.T2)((()=>{h.forEach((e=>{e.style.transitionDelay="",e.classList.remove("can-zoom-fade")})),this.chatInner.classList.remove("zoom-fading")}))}))),w}))}renderEmptyPlaceholder(e,t,i,s){return gs(this,void 0,void 0,(function*(){const i="empty-bubble-placeholder";let n,a;if(t.classList.add(i,i+"-"+e),"group"===e?n=(0,L.ag)("GroupEmptyTitle1"):"saved"===e?n=(0,L.ag)("ChatYourSelfTitle"):"noMessages"===e||"greeting"===e?n=(0,L.ag)("NoMessages"):"noScheduledMessages"===e?n=(0,L.ag)("NoScheduledMessages"):"restricted"===e&&(n=document.createElement("span"),n.innerText=yield this.managers.appPeersManager.getRestrictionReasonText(this.peerId)),n.classList.add("center",i+"-title"),s.push(n),"group"===e)s.push((0,L.ag)("GroupEmptyTitle2")),a=[(0,L.ag)("GroupDescription1"),(0,L.ag)("GroupDescription2"),(0,L.ag)("GroupDescription3"),(0,L.ag)("GroupDescription4")];else if("saved"===e)a=[(0,L.ag)("ChatYourSelfDescription1"),(0,L.ag)("ChatYourSelfDescription2"),(0,L.ag)("ChatYourSelfDescription3"),(0,L.ag)("ChatYourSelfDescription4")];else if("greeting"===e){const e=(0,L.ag)("NoMessagesGreetingsDescription");e.classList.add("center",i+"-subtitle");const t=document.createElement("div");t.classList.add(i+"-sticker");const n=this.getMiddleware();yield this.managers.appStickersManager.getGreetingSticker().then((e=>gs(this,void 0,void 0,(function*(){if(!n())return;const i=[];return yield(0,W.ZP)({doc:e,div:t,middleware:n,lazyLoadQueue:this.lazyLoadQueue,group:this.chat.animationGroup,play:!0,loop:!0,withThumb:!0,loadPromises:i}),(0,C.fc)(t,(e=>{(0,Ce.Z)(e),It.Jo.onMediaClick({target:e.target})})),Promise.all(i)})))),s.push(e,t)}a&&(s.push(...a.map((e=>{const t=document.createElement("span");return t.classList.add(i+"-list-item"),t.append(e),t}))),"group"===e?a.forEach((e=>{const t=document.createElement("span");t.classList.add("tgico-check"),e.prepend(t)})):"saved"===e&&a.forEach((e=>{const t=document.createElement("span");t.classList.add(i+"-list-bullet"),t.innerText="โ€ข",e.prepend(t)}))),s.length>1&&t.classList.add("has-description"),s.forEach((e=>e.classList.add(i+"-line")))}))}processLocalMessageRender(e,t,i=this.getMiddleware()){return gs(this,void 0,void 0,(function*(){const s=!!e.pFlags.sponsored,n=(0,Et.Z)(i);return this.safeRenderMessage(e,!s,void 0,!1,(i=>gs(this,void 0,void 0,(function*(){const{bubble:a}=yield n(i);if(!a)return i;a.message=e,a.classList.add("is-group-last","is-group-first");const o=()=>{this.updatePlaceholderPosition===o&&(this.updatePlaceholderPosition=void 0),u[p](a)};s||(a.classList.add("bubble-first"),a.classList.remove("can-have-tail","is-in"));const r=[],l=this.chat.isBot;let c,u=this.container,p="append";if(this.chat.isRestricted)c=this.renderEmptyPlaceholder("restricted",a,e,r);else if(s){let i,s,n,o;a.classList.add("avoid-selection"),a.style.order="999999";const r=this.sponsoredMessage=e.sponsoredMessage,d=(0,R.Z)(r.from_id);r.channel_post?(i="OpenChannelPost",s=(0,yt.Z)(r.channel_post)):r.start_param||l?(i="Chat.Message.ViewBot",n=r.start_param):i=(yield this.managers.appPeersManager.isAnyGroup(d))?"Chat.Message.ViewGroup":"Chat.Message.ViewChannel",o=r.chat_invite?()=>{new Ge(r.chat_invite_hash,r.chat_invite)}:r.chat_invite_hash?()=>{const e={_:ke.JOIN_CHAT,invite:r.chat_invite_hash};this.chat.appImManager.processInternalLink(e)}:()=>{this.chat.appImManager.setInnerPeer({peerId:d,lastMsgId:s,startParam:n})};const c=this.makeViewButton({text:i});this.observer.observe(c,this.viewsObserverCallback),o&&(0,C.fc)(c,o),a.querySelector(".bubble-content").prepend(c),u=this.chatInner,p="append",t=!1}else if(l&&"message"===e._){const e=document.createElement("b");e.append((0,L.ag)("BotInfoTitle")),r.push(e,"\n\n"),u=this.chatInner,p="prepend"}else c=this.chat.isAnyGroup&&(yield n(this.managers.appPeersManager.getPeer(this.peerId))).pFlags.creator?this.renderEmptyPlaceholder("group",a,e,r):"scheduled"===this.chat.type?this.renderEmptyPlaceholder("noScheduledMessages",a,e,r):d.Z.myId===this.peerId?this.renderEmptyPlaceholder("saved",a,e,r):this.peerId.isUser()&&!l&&(yield n(this.chat.canSend()))&&"chat"===this.chat.type?this.renderEmptyPlaceholder("greeting",a,e,r):this.renderEmptyPlaceholder("noMessages",a,e,r);c&&(yield c),r.length&&a.querySelector(".message, .service-msg").prepend(...r);const f=!!this.messagesQueueOnRenderAdditional,m=this.setPeerCached&&!f;if(m){const e=a.firstElementChild;e.classList.add("no-transition"),this.chat.setPeerPromise&&this.chat.setPeerPromise.catch(Ye.Z).finally((()=>{e.classList.remove("no-transition")}))}if(void 0!==t||m||(t=!0),f||t?(this.updatePlaceholderPosition=o,this.onAnimateLadder=()=>{if(this.onAnimateLadder=void 0,!this.messagesQueuePromise)return(0,fe.AD)()}):this.chat.setPeerPromise?this.attachPlaceholderOnRender=()=>{this.attachPlaceholderOnRender=void 0,o()}:this.updatePlaceholderPosition=o,!f&&t){yield n((0,pe.e9)());const t=(0,ot.Z)(this.bubbles);(0,h.Z)(t,e.mid),this.animateAsLadder(e.mid,t,!1,0,0)}return a.middlewareHelper.onDestroy((()=>{this.emptyPlaceholderBubble===a&&(this.emptyPlaceholderBubble=void 0)})),this.emptyPlaceholderBubble=a,i}))))}))}makeViewButton(e){return(0,Ue.Z)("btn-primary btn-primary-transparent bubble-view-button",e)}generateLocalMessageId(e=0){const t=("scheduled"===this.chat.type?-1:0)+e,i=-Math.abs(t);return{id:i,mid:-Math.abs((0,yt.Z)(i))}}generateLocalFirstMessage(e,t,i=0){return gs(this,void 0,void 0,(function*(){const{id:s,mid:n}=this.generateLocalMessageId(i);let a={_:e?"messageService":"message",date:0,id:s,mid:n,peer_id:yield this.managers.appPeersManager.getOutputPeer(this.peerId),pFlags:{local:!0}};return e||(a.message=""),(0,Pe.Z)(a),t&&t(a),a=(yield this.managers.appMessagesManager.saveMessages([a],{storage:new Map}))[0],a.mid=n,a}))}getViewportSlice(){return(0,rt.Z)({overflowElement:this.scrollable.container,selector:".bubbles-date-group .bubble:not(.is-date)",extraSize:2*Math.max(700,xe.Z.height)})}deleteViewportSlice(e,t){const{invisibleTop:i,invisibleBottom:s}=e,n=i.concat(s);if(!n.length)return;i.length&&(this.setLoaded("top",!1),this.getHistoryTopPromise=void 0),s.length&&(this.setLoaded("bottom",!1),this.getHistoryBottomPromise=void 0);const a=n.map((({element:e})=>+e.dataset.mid));let o;t||(o=this.createScrollSaver(!!i.length),o.save()),this.deleteMessagesByIds(a,!1,!0),o?o.restore():i.length&&(this.scrollable.lastScrollPosition=this.scrollable.scrollTop)}sliceViewport(e){if(x.IS_SAFARI||this.isHeavyAnimationInProgress&&!e)return;const t=this.getViewportSlice();this.deleteViewportSlice(t)}setLoaded(e,t,i=!0){return gs(this,void 0,void 0,(function*(){if(this.scrollable.loadedAll[e]!==t)return this.log.bindPrefix("setLoaded")("change",e,t),this.scrollable.loadedAll[e]=t,this.scrollable.onScroll(),i?!this.chat.isRestricted&&("bottom"===e&&this.chat.isBroadcast&&this.toggleSponsoredMessage(t),"top"===e&&t&&this.chat.isBot)?this.renderBotPlaceholder():this.checkIfEmptyPlaceholderNeeded():void 0}))}toggleSponsoredMessage(e){return gs(this,void 0,void 0,(function*(){const t=this.log.bindPrefix("sponsored");t("checking");const{mid:i}=this.generateLocalMessageId(1);if(e){const e=this.getMiddleware((()=>this.scrollable.loadedAll.bottom&&this.getSponsoredMessagePromise===i)),i=this.getSponsoredMessagePromise=this.managers.appChatsManager.getSponsoredMessage(this.peerId.toChatId()).then((i=>gs(this,void 0,void 0,(function*(){if(!e()||"messages.sponsoredMessagesEmpty"===i._)return;const s=i.messages[0];if(!s)return void t("no message");const n=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([n,this.getHistoryTopPromise,this.messagesQueuePromise]).then((([i])=>{if(e())return t("rendering",i),this.performHistoryResult({history:[i]},!1)}))})))).finally((()=>{this.getSponsoredMessagePromise===i&&(this.getSponsoredMessagePromise=void 0)}))}else t("clearing rendered",i),this.getSponsoredMessagePromise=void 0,this.deleteMessagesByIds([i])}))}renderBotPlaceholder(){return gs(this,void 0,void 0,(function*(){const e=this.log.bindPrefix("bot placeholder"),t=this.getMiddleware(),i=yield this.managers.acknowledged.appProfileManager.getProfile(this.peerId.toUserId());e("getting profile, cached:",i.cached);const s=i.result.then((s=>gs(this,void 0,void 0,(function*(){var n;if(!t())return;if(!(null===(n=s.bot_info)||void 0===n?void 0:n.description))return e.warn("no description"),this.checkIfEmptyPlaceholderNeeded();const a=yield this.generateLocalFirstMessage(!1,(e=>{const t=s.bot_info;e.message=t.description,t.description_document&&(e.media={_:"messageMediaDocument",document:t.description_document,pFlags:{}}),t.description_photo&&(e.media={_:"messageMediaPhoto",photo:t.description_photo,pFlags:{}})}));return t()?(e("rendering"),{renderPromise:this.processLocalMessageRender(a,!i.cached).then((()=>{e("done")}))}):void 0}))));if(i.cached)return s}))}checkIfEmptyPlaceholderNeeded(){return gs(this,void 0,void 0,(function*(){if(this.scrollable.loadedAll.top&&this.scrollable.loadedAll.bottom&&void 0===this.emptyPlaceholderBubble&&(this.chat.isRestricted||!(yield this.chat.getHistoryStorage()).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=yield this.generateLocalFirstMessage(!0);return{renderPromise:this.processLocalMessageRender(e)}}}))}getHistory1(e,t,i,s,n){const a=this.getMiddleware(n?void 0:()=>(t?this.getHistoryTopPromise:this.getHistoryBottomPromise)===r),o=this.getHistory(e,t,i,s,n,a),r=o.then((e=>e&&(e.waitPromise||e.promise)));return t?this.getHistoryTopPromise=r:this.getHistoryBottomPromise=r,r.then((()=>{a()&&(t?this.getHistoryTopPromise=void 0:this.getHistoryBottomPromise=void 0,n||"chat"===this.chat.type&&setTimeout((()=>{t?this.loadMoreHistory(!0,!0):this.loadMoreHistory(!1,!0)}),0))})),o}getHistory(e=0,t=!1,i=!1,s=0,n=!1,a){return gs(this,void 0,void 0,(function*(){const o=this.peerId,r=this.chat.isBroadcast,l=Math.min(30,xe.Z.height/40|0);let c=r?20:Object.keys(this.bubbles).length>0?Math.max(35,l):l;if(void 0!==ws){if(!ws)return{cached:!1,promise:Promise.resolve(),waitPromise:Promise.resolve()};Object.keys(this.bubbles).length>0&&--ws}let h,u=0;if(i&&(u=c,t||(c=0)),s&&!i)if("pinned"===this.chat.type)h=[s];else{const t=(yield this.chat.getHistoryStorage()).history.slice;if(t.length=0;--e){const t=yield this.chat.getMessage(h[e]);if(!(null==t?void 0:t.grouped_id))break;h.splice(e,1)}e=h[h.length-1]||e}}let p,f=yield this.requestHistory(e,c,u);this.log("i vin brehnya",f,e,c,u);const m=(null==h?void 0:h.length)&&!f.cached,g=this.isFirstLoad&&u&&!f.cached||m;m&&(p=f.result,f={cached:!0,result:Promise.resolve({history:h})}),this.isFirstLoad=!1;const v=e=>gs(this,void 0,void 0,(function*(){var t;if(null===(t=e.isEnd)||void 0===t?void 0:t.top){if("discussion"===this.chat.type){const t=yield this.managers.appMessagesManager.getThreadServiceMessageId(this.peerId,this.chat.threadId);t&&e.history.push(t);const i=yield this.chat.getMidsByMid(this.chat.threadId);e.history.push(...i.reverse())}yield this.managers.appProfileManager.getProfileByPeerId(o)}})),b=e=>(0,pe.e9)().then((()=>v(e))).then((()=>(!m&&s&&e.history.unshift(s),this.performHistoryResult(e,t)))),y=e=>{const t=Promise.resolve(e).then((e=>{if(a&&!a())throw Ls;if(!n)return b(e);this.scrollable.onScroll()}),(e=>{throw this.log.error("getHistory error:",e),e}));return t};let w,S;if(f.cached){if(n)return this.scrollable.onScroll(),null;S=!0,w=b(yield f.result)}else S=!1,w=y(f.result);const C=m?y(p):w;if(g&&d.Z.settings.animationsEnabled){let i=m?2:1;this.messagesQueueOnRenderAdditional=()=>{this.log("messagesQueueOnRenderAdditional"),--i||(this.messagesQueueOnRenderAdditional=void 0,this.animateAsLadder(s,h,m,u,e).then((()=>{setTimeout((()=>{this.loadMoreHistory(t,!0)}),0)})))}}else this.messagesQueueOnRenderAdditional=void 0;return n?null:{cached:S,promise:w,waitPromise:C}}))}setUnreadDelimiter(){return gs(this,void 0,void 0,(function*(){if("chat"!==this.chat.type&&"discussion"!==this.chat.type)return;if(this.attachedUnreadBubble)return;const e=yield this.chat.getHistoryMaxId();let t=yield this.managers.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])){const i=this.bubbles[t];this.firstUnreadBubble&&this.firstUnreadBubble!==i&&(this.firstUnreadBubble.classList.remove("is-first-unread"),this.firstUnreadBubble=null),t!==e&&i.classList.add("is-first-unread"),this.firstUnreadBubble=i,this.attachedUnreadBubble=!0}}))}deleteEmptyDateGroups(){const e=this.stickyIntersector?Cs:1;let t=!1;for(const i in this.dateMessages){const s=this.dateMessages[i];s.container.childElementCount===e&&(s.container.remove(),this.stickyIntersector&&this.stickyIntersector.unobserve(s.container,s.div),delete this.dateMessages[i],t=!0)}t&&(Object.keys(this.dateMessages).length||this.container.classList.remove("has-groups"),this.checkIfEmptyPlaceholderNeeded(),this.setStickyDateManually())}}function Zs(){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}var Ts=i(3003),ks=i(5128),xs=i(8127);class As{constructor(e,t,i,s){this.peerId=e,this.mid=t,this.unpin=i,this.onConfirm=s,this.construct()}construct(){return e=this,t=void 0,s=function*(){const{peerId:e,mid:t,unpin:i,onConfirm:s}=this;let n,a,o;const r=[],l=[],c=S.Z.MANAGERS,h=yield c.appPeersManager.canPinMessage(e),u=(n,a,o)=>{setTimeout((()=>{let n;n=i&&!t?h?c.appMessagesManager.unpinAllMessages(e):c.appMessagesManager.hidePinnedMessages(e):c.appMessagesManager.updatePinnedMessage(e,t,i,o,a),s&&n.then(s)}),300)};if(i){let i="UnpinMessage";t?(n="UnpinMessageAlertTitle",a="Chat.Confirm.Unpin"):h?(n="Popup.Unpin.AllTitle",a="Chat.UnpinAllMessagesConfirmation",o=[""+((yield c.appMessagesManager.getPinnedMessagesCount(e))||1)]):(n="Popup.Unpin.HideTitle",a="Popup.Unpin.HideDescription",i="Popup.Unpin.Hide"),r.push({langKey:i,isDanger:!0,callback:u})}else{n="PinMessageAlertTitle";const t="PinMessage";e.isAnyChat()?(r.push({langKey:t,callback:e=>u(0,!1,!e.size)}),(yield c.appChatsManager.isBroadcast(e.toChatId()))?a="PinMessageAlertChannel":(a="PinMessageAlert",l.push({text:"PinNotify",checked:!0}))):(a="PinMessageAlertChat",e===d.Z.myId?r.push({langKey:t,callback:u}):(r.push({langKey:t,callback:e=>u(0,!e.size)}),l.push({text:"PinAlsoFor",textArgs:[yield(0,Vt.Z)({peerId:e})],checked:!0})))}(0,S.x)(r),new xs.Z("popup-delete-chat",{peerId:e,titleLangKey:n,descriptionLangKey:a,descriptionLangArgs:o,buttons:r,checkboxes:l}).show()},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var _s=i(1962);function Fs(e=window.getSelection()){if(!(null==e?void 0:e.rangeCount))return!0;const t=e.getRangeAt(0);return!(!t.collapsed&&t.START_TO_END)}var Ds=i(2312),Rs=i(1447),Bs=i(671),Ns=i(3174);function Os(e,t,i){return d.Z.managers.appStickersManager.preloadAnimatedEmojiSticker(e).then((({doc:s})=>{if(s)return Ds.Z.downloadMedia({media:s}).then((n=>{return a=this,r=void 0,l=function*(){const a=o.Z.active.emojiSticker,r=(0,Bs.tB)(e),d=yield Rs.Z.loadAnimationWorker({container:void 0,animationData:n,width:null!=t?t:a.width,height:null!=i?i:a.height,name:"doc"+s.id,autoplay:!1,loop:!1,toneIndex:r,group:"none"});d.addEventListener("firstFrame",(()=>{(0,Ns.O)(s,d.canvas[0],r),d.remove()}),{once:!0})},new((d=void 0)||(d=Promise))((function(e,t){function i(e){try{n(l.next(e))}catch(e){t(e)}}function s(e){try{n(l.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof d?n:new d((function(e){e(n)}))).then(i,s)}n((l=l.apply(a,r||[])).next())}));var a,r,d,l}))}))}var Us=i(5772);class Hs extends xs.Z{constructor(e,t,i,s){super("popup-report-messages-confirm",{noTitle:!0,descriptionLangKey:"ReportInfo",buttons:[{langKey:"ReportChat",callback:()=>{a.isValid()&&(s&&s(),this.managers.appMessagesManager.reportMessages(e,t,i,a.value).then((e=>{e&&(0,we.bC)({langPackKey:"ReportSentInfo"})})))}}],body:!0});const n=document.createElement("div");(0,Us.Z)({div:n,emoji:Hs.STICKER_EMOJI,width:100,height:100}).then((({render:e})=>e)).finally((()=>{this.show()})),this.header.replaceWith(n);const a=new E.ZP({label:"ReportHint",maxLength:512,placeholder:"ReportChatDescription"});a.input.addEventListener("input",(()=>{this.buttons[0].element.toggleAttribute("disabled",!a.isValid())})),this.body.append(a.container)}}Hs.STICKER_EMOJI="๐Ÿ‘ฎโ€โ™€๏ธ";class zs extends xs.Z{constructor(e,t,i){super("popup-report-messages",{titleLangKey:"ChatTitle.ReportMessages",buttons:[],body:!0}),t=t.slice();const s=[["ReportChatSpam","inputReportReasonSpam"],["ReportChatViolence","inputReportReasonViolence"],["ReportChatChild","inputReportReasonChildAbuse"],["ReportChatPornography","inputReportReasonPornography"],["ReportChatOther","inputReportReasonOther"],["ReportChatPersonalDetails","inputReportReasonPersonalDetails"],["ReportChatIllegalDrugs","inputReportReasonIllegalDrugs"]];s.forEach((e=>{const t=(0,Ue.Z)("btn-primary btn-transparent",{text:e[0]});this.body.append(t)}));const n=Os(Hs.STICKER_EMOJI);(0,C.fc)(this.body,(a=>{const o=(0,be.Z)(a.target,"btn-primary"),r=s[(0,Ie.Z)(o)][1];n.then((()=>{this.hide(),new Hs(e,t,r,i)}))}),{listenerSetter:this.listenerSetter}),this.buttonsEl.style.marginTop=".5rem",this.show()}}class js extends xs.Z{constructor(){super("popup-sponsored",{titleLangKey:"Chat.Message.Sponsored.What",descriptionLangKey:"Chat.Message.Ad.Text",descriptionLangArgs:[(0,L.ag)("Chat.Message.Sponsored.Link")],buttons:[{langKey:"OK",isCancel:!0},{langKey:"Chat.Message.Ad.ReadMore",callback:()=>{window.open(L.ZP.format("Chat.Message.Sponsored.Link",!0))},isCancel:!0}],scrollable:!0}),this.scrollable.append(this.description),this.show()}}var Gs=i(6008),Vs=i(8936),Ks=i(3061),Ws=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class $s extends S.Z{constructor(e){super("popup-reacted-list",{closable:!0,overlayClosable:!0,body:!0}),this.message=e,this.init()}init(){return Ws(this,void 0,void 0,(function*(){const e=this.middlewareHelper.get(),t=yield this.managers.appMessagesManager.getGroupsFirstMessage(this.message);if(!e())return;const i=yield this.managers.appMessagesManager.canViewMessageReadParticipants(t);if(!e())return;const s=new st,n=Object.assign(Object.assign({},t),{mid:0,id:0,reactions:Object.assign(Object.assign({_:"messageReactions",results:[]},t.reactions),{pFlags:{},recent_reactions:[]})});n.reactions.results=n.reactions.results.map((e=>Object.assign(Object.assign({},e),{chosen_order:void 0,pFlags:{}}))),s.init(n,"block",this.middlewareHelper.get()),s.render(),s.classList.add("no-stripe"),s.classList.remove("has-no-reactions"),s.append(this.btnClose),this.header.append(s);const a=document.createElement("div");a.classList.add("tabs-container"),a.dataset.animation="tabs";const o=new Map;let r=!1;if(n.reactions.results.length){const e=this.createFakeReaction("reactions",n.reactions.results.reduce(((e,t)=>e+t.count),0));s.prepend(e),n.reactions.results.unshift(e.reactionCount),r=!0}let d=!1;if(i)try{const i=yield this.managers.appMessagesManager.getMessageReadParticipants(t.peerId,t.mid);if(!e())return;if(!i.length)throw"";const a=this.createFakeReaction("checks",i.length);s.prepend(a),n.reactions.results.unshift(a.reactionCount),d=!0}catch(e){}n.reactions.results.forEach((i=>{const s=new T.ZP(void 0);s.container.classList.add("tabs-tab");const n=new Ei.Z({noShadow:!0,noDelimiter:!0}),r=Ji.default.createChatList({dialogSize:72});Ji.default.setListClickListener(r,(()=>{this.hide()}),void 0,!1,!0),n.content.append(r),s.container.append(n.container);const d="checks"!==i.reaction,l="checks"===i.reaction;["checks","reactions"].includes(i.reaction)&&(i.reaction=void 0);const c=(0,qe.C)(24,24);let h;const u=new Vs.Z({scrollable:s,getPromise:()=>Ws(this,void 0,void 0,(function*(){const s=yield this.managers.appMessagesManager.getMessageReactionsListAndReadParticipants(t,void 0,i.reaction,h,d,l);return h=s.nextOffset,yield Promise.all(s.combined.map((({peerId:t,reaction:i})=>Ws(this,void 0,void 0,(function*(){const{dom:s}=Ji.default.addDialogNew({peerId:t,autonomous:!0,container:r,avatarSize:"abitbigger",rippleEnabled:!1,meAsSaved:!1});if(i){const t=document.createElement("div");if(t.classList.add("reacted-list-reaction-icon"),"reactionEmoji"===i._){const s=yield this.managers.appReactionsManager.getReactionCached(i.emoticon);(0,W.ZP)({doc:s.static_icon,div:t,width:24,height:24,middleware:e})}else"reactionCustomEmoji"===i._&&t.append((0,We.Z)({docIds:[i.document_id],customEmojiSize:c,middleware:e}));s.listEl.append(t)}(0,H.Z)(s.lastMessageSpan,(0,Ks.Z)(yield this.managers.appUsersManager.getUser(t.toUserId())))}))))),!h}))});o.set(s.container,u),a.append(s.container)})),this.body.append(a);const l=(0,Gs.X)(s,a,((e,t)=>{if(e===s.childElementCount-1)return!1;const i=s.children[e],n=l.prevId();-1!==n&&s.children[n].setIsChosen(!1),i.setIsChosen(!0),o.get(t).load()}),void 0,void 0,void 0,this.listenerSetter);l(0,!1),this.show()}))}createFakeReaction(e,t){const i=new Je;i.init("block",this.middlewareHelper.get()),i.reactionCount={_:"reactionCount",count:t,reaction:e},i.setCanRenderAvatars(!1),i.renderCounter();const s=document.createElement("div");return s.classList.add("reaction-counter","reaction-sticker-icon","tgico-"+e),i.prepend(s),i}}const qs="btn-menu-reactions",Ys=qs+"-reaction",Qs=!x.IS_SAFARI;class Xs{constructor(e,t,i){this.managers=e,this.type=t,this.onScroll=()=>{this.reactionsMap.forEach(((e,t)=>{this.onScrollProcessItem(t,e)}))},this.onMouseMove=e=>{var t;const i=(0,be.Z)(e.target,Ys);if(!i)return;const s=this.reactionsMap.get(i);if(!s)return;if(!(null===(t=s.appear)||void 0===t?void 0:t.paused))return;const n=s.select;n&&n.paused&&(n.autoplay=!0,n.restart())};const n=this.widthContainer=document.createElement("div");n.classList.add(qs+"-container"),n.classList.add(qs+"-container-"+t);const a=this.container=document.createElement("div");a.classList.add(qs);const o=this.scrollable="vertical"===t?new T.ZP(void 0):new T.v7(void 0);a.append(o.container),o.onAdditionalScroll=this.onScroll,o.setListeners(),o.container.classList.add("no-scrollbar"),this.reactionsMap=new Map,this.animationGroup=`CHAT-MENU-REACTIONS-${Date.now()}`,s.Z.setOverrideIdleGroup(this.animationGroup,!0),c.Z||a.addEventListener("mousemove",this.onMouseMove),(0,C.fc)(a,(e=>{const t=(0,be.Z)(e.target,Ys);if(!t)return;const i=this.reactionsMap.get(t);i&&this.managers.appReactionsManager.sendReaction(this.message,i.reaction)})),n.append(a),this.middleware=null!=i?i:(0,Se.k)()}init(e){this.message=e;const t=this.middleware.get(),i=this.managers.appReactionsManager.getAvailableReactionsByMessage(e);(0,Ke.Z)(i,(e=>{if(!t()||!e.length)return;e.forEach((e=>{e.pFlags.premium&&!d.Z.premium||this.renderReaction(e)}));const s=()=>{this.container.classList.add("is-visible")};i instanceof Promise?(0,fe.T2)(s):s()}))}cleanup(){this.middleware.clean(),this.scrollable.removeListeners(),this.reactionsMap.clear(),s.Z.setOverrideIdleGroup(this.animationGroup,!1),s.Z.checkAnimations(!0,this.animationGroup,!0)}canUseAnimations(){return d.Z.settings.animationsEnabled&&!x.IS_MOBILE}renderReaction(e){const t=document.createElement("div");t.classList.add(Ys);const i=document.createElement("div");i.classList.add(Ys+"-scale");const s=document.createElement("div");let n;s.classList.add(Ys+"-appear"),this.canUseAnimations()&&(n=document.createElement("div"),n.classList.add(Ys+"-select","hide"));const a={selectWrapper:n,appearWrapper:s,reaction:{_:"reactionEmoji",emoticon:e.reaction}};this.reactionsMap.set(t,a);const o=this.middleware.get(),r=26*(c.Z?1:1.25),d={width:r,height:r,skipRatio:1,needFadeIn:!1,withThumb:!1,group:this.animationGroup,middleware:o};if(this.canUseAnimations()){let t=!0;(0,W.ZP)(Object.assign({doc:e.appear_animation,div:s,play:!0},d)).then((({render:e})=>e)).then((e=>{(0,Pe.Z)(e),a.appear=e,e.addEventListener("enterFrame",(o=>{e.maxFrame===o&&i.then((e=>{(0,Pe.Z)(e),s.classList.add("hide"),n.classList.remove("hide"),t&&(a.select=e,t=!1)}),Ye.Z)}))}),Ye.Z);const i=(0,W.ZP)(Object.assign({doc:e.select_animation,div:n},d)).then((({render:e})=>e)).then((e=>((0,Pe.Z)(e),Rs.Z.waitForFirstFrame(e)))).catch(Ye.Z)}else delete d.needFadeIn,delete d.withThumb,(0,W.ZP)(Object.assign({doc:e.static_icon,div:s},d));i.append(s),n&&i.append(n),t.append(i),this.scrollable.append(t)}onScrollProcessItem(e,t){const i=e.firstElementChild,s=(0,He.Z)(e,this.scrollable.container);let n;if(s)if(s.overflow.left||s.overflow.right){const e=Math.abs(s.rect.left-s.rect.right);n="scale("+Math.min(Math.pow(e,2)/Math.pow(34,2),1)+")"}else n="";else{if(!t.appearWrapper.classList.contains("hide")||!t.appear)return;t.select&&t.select.stop(),t.appear.stop(),t.appear.autoplay=!0,t.appearWrapper.classList.remove("hide"),t.selectWrapper.classList.add("hide"),n=""}Qs&&(i.style.transform=n)}}var Js=i(1483),en=i(2353),tn=i(6690),sn=i(3709),nn=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class an{constructor(e,t){this.chat=e,this.managers=t,this.onContextMenu=e=>{let t,i;try{i=(0,be.Z)(e.target,"bubble-content-wrapper"),t=i?i.parentElement:(0,be.Z)(e.target,"bubble")}catch(e){}if(!t||t.classList.contains("bubble-first"))return;let s=this.element;if((e instanceof MouseEvent||e.hasOwnProperty("preventDefault"))&&e.preventDefault(),s&&s.classList.contains("active"))return!1;(e instanceof MouseEvent||e.hasOwnProperty("cancelBubble"))&&(e.cancelBubble=!0);let n=+t.dataset.mid;n&&(()=>{nn(this,void 0,void 0,(function*(){const a=this.isSponsored=n<0;this.isSelectable=this.chat.selection.canSelectBubble(t),this.peerId=this.chat.peerId,this.target=e.target,this.isTextSelected=!Fs(),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");const o=yield this.chat.getMidsByMid(n);if(this.chat.selection.isSelecting&&!i){if(a)return;if(o.length>1){const e=this.chat.selection.isMidSelected(this.peerId,n)?n:o.find((e=>this.chat.selection.isMidSelected(this.peerId,e)));e&&(n=e)}}this.isOverBubble=!!i;const r=(0,be.Z)(this.target,"grouped-item");this.isTargetAGroupedItem=!!r,this.mid=r?+r.dataset.mid:n,this.isSelected=this.chat.selection.isMidSelected(this.peerId,this.mid),this.message=t.message||(yield this.chat.getMessage(this.mid)),this.albumMessages=this.message.grouped_id?yield this.managers.appMessagesManager.getMessagesByAlbum(this.message.grouped_id):void 0,this.noForwards=!a&&!(yield this.managers.appMessagesManager.canForward(this.message)),this.viewerPeerId=void 0,this.canOpenReactedList=void 0,this.linkToMessage=yield this.getUrlToMessage(),this.selectedMessagesText=yield this.getSelectedMessagesText();const d=yield this.init();if(!d)return;s=d.element;const{cleanup:l,destroy:c,menuPadding:h,reactionsMenu:u,reactionsMenuPosition:p}=d;let f=!1;if(u){const e="is-visible";if(f=u.container.classList.contains(e),f&&u.container.classList.remove(e),"horizontal"===p){const e=s.offsetWidth,t=(e-8)/34%1,i=.65;if(t{u&&u.container.classList.remove("is-visible"),this.mid=0,this.peerId=void 0,this.target=null,this.viewerPeerId=void 0,this.canOpenReactedList=void 0,l(),setTimeout((()=>{c()}),300)})),f&&u.container.classList.add("is-visible")}))})()},this.onSendScheduledClick=()=>nn(this,void 0,void 0,(function*(){this.chat.selection.isSelecting?(0,C.tH)(this.chat.selection.selectionSendNowBtn):new _s.Z(this.peerId,yield this.chat.getMidsByMid(this.mid))})),this.onReplyClick=()=>{this.chat.input.initMessageReply(this.mid)},this.onFaveStickerClick=e=>{const t=this.message.media.document.id;this.managers.appStickersManager.faveSticker(t,e)},this.onEditClick=()=>{const e=this.getMessageWithText();this.chat.input.initMessageEditing(this.isTargetAGroupedItem?this.mid:e.mid)},this.onCopyClick=()=>nn(this,void 0,void 0,(function*(){Fs()?(0,ct.T)(this.selectedMessagesText):document.execCommand("copy")})),this.onCopyAnchorLinkClick=()=>{(0,ct.T)(this.target.href)},this.onCopyLinkClick=()=>{const{url:e,isPrivate:t}=this.linkToMessage,i=t?"LinkCopiedPrivateInfo":"LinkCopied";(0,we.Am)(L.ZP.format(i,!0)),(0,ct.T)(e)},this.onPinClick=()=>{new As(this.peerId,this.mid)},this.onUnpinClick=()=>{new As(this.peerId,this.mid,!0)},this.onRetractVote=()=>{this.managers.appPollsManager.sendVote(this.message,[])},this.onStopPoll=()=>{this.managers.appPollsManager.stopPoll(this.message)},this.onForwardClick=()=>nn(this,void 0,void 0,(function*(){if(this.chat.selection.isSelecting)(0,C.tH)(this.chat.selection.selectionForwardBtn);else{const e=this.peerId,t=this.isTargetAGroupedItem?[this.mid]:yield this.chat.getMidsByMid(this.mid);new M.Z({[e]:t})}})),this.onSelectClick=()=>{this.chat.selection.toggleByElement((0,be.Z)(this.target,"grouped-item")||(0,be.Z)(this.target,"bubble"))},this.onClearSelectionClick=()=>{this.chat.selection.cancelSelection()},this.onDeleteClick=()=>nn(this,void 0,void 0,(function*(){this.chat.selection.isSelecting?(0,C.tH)(this.chat.selection.selectionDeleteBtn):new ks.Z(this.peerId,this.isTargetAGroupedItem?[this.mid]:yield this.chat.getMidsByMid(this.mid),this.chat.type)})),this.listenerSetter=new ce.Z,this.attachListenerSetter=new ce.Z,this.middleware=(0,Se.k)()}attachTo(e){this.attachListenerSetter.removeAll(),c.Z?(0,C.fc)(e,(e=>{this.chat.selection.isSelecting||(this.chat.log("touchend",e),!e.target.closest([".name",".peer-title",".reply",".document","audio-element","avatar-element","a",".bubble-beside-button","replies-element","[data-saved-from]:not(.bubble)","poll-element",".attachment",".reply-markup-button"].join(", "))&&((0,Ce.Z)(e),this.onContextMenu(e)))}),{listenerSetter:this.attachListenerSetter}):(0,Ct.E)({element:e,callback:this.onContextMenu,listenerSetter:this.attachListenerSetter})}cleanup(){this.listenerSetter.removeAll(),this.reactionsMenu&&this.reactionsMenu.cleanup(),this.middleware.clean()}destroy(){this.cleanup(),this.attachListenerSetter.removeAll()}filterButtons(e){return nn(this,void 0,void 0,(function*(){return this.isSponsored?e.filter((e=>e.isSponsored)):(0,en.Z)(e,(e=>nn(this,void 0,void 0,(function*(){let t;return this.chat.selection.isSelecting&&!e.withSelection?t=!1:(this.isOverBubble||c.Z,t=yield e.verify()),!!t}))))}))}setButtons(){const e=e=>nn(this,void 0,void 0,(function*(){var t;const i=null===(t=this.message.media)||void 0===t?void 0:t.document;if(!(null==i?void 0:i.sticker))return!1;const s=yield this.managers.acknowledged.appStickersManager.getFavedStickersStickers();if(!s.cached)return!1;const n=(yield s.result).some((e=>e.id===i.id));return e?!n:n}));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((()=>{(0,Pe.Z)(this.message),this.managers.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:()=>nn(this,void 0,void 0,(function*(){return(yield this.chat.canSend())&&!this.message.pFlags.is_outgoing&&!!this.chat.input.messageInput&&"scheduled"!==this.chat.type}))},{icon:"favourites",text:"AddToFavorites",onClick:this.onFaveStickerClick.bind(this,!1),verify:()=>e(!0)},{icon:"favourites",text:"DeleteFromFavorites",onClick:this.onFaveStickerClick.bind(this,!0),verify:()=>e(!1)},{icon:"edit",text:"Edit",onClick:this.onEditClick,verify:()=>nn(this,void 0,void 0,(function*(){return(yield this.managers.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:()=>nn(this,void 0,void 0,(function*(){if(!this.isSelected||this.noForwards)return!1;for(const[e,t]of this.chat.selection.selectedMids){const i=`${e}_${"scheduled"===this.chat.type?"scheduled":"history"}`;for(const e of t)if((yield this.managers.appMessagesManager.getMessageFromStorage(i,e)).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:()=>{(0,ct.T)(this.target.innerHTML)},verify:()=>this.isUsernameTarget,withSelection:!0},{icon:"copy",text:"Text.Context.Copy.Hashtag",onClick:()=>{(0,ct.T)(this.target.innerHTML)},verify:()=>this.target.classList.contains("anchor-hashtag"),withSelection:!0},{icon:"link",text:"MessageContext.CopyMessageLink1",onClick:this.onCopyLinkClick,verify:()=>nn(this,void 0,void 0,(function*(){return(yield this.managers.appPeersManager.isChannel(this.peerId))&&!this.message.pFlags.is_outgoing}))},{icon:"pin",text:"Message.Context.Pin",onClick:this.onPinClick,verify:()=>nn(this,void 0,void 0,(function*(){return!this.message.pFlags.is_outgoing&&"messageService"!==this.message._&&!this.message.pFlags.pinned&&(yield this.managers.appPeersManager.canPinMessage(this.peerId))&&"scheduled"!==this.chat.type}))},{icon:"unpin",text:"Message.Context.Unpin",onClick:this.onUnpinClick,verify:()=>nn(this,void 0,void 0,(function*(){return this.message.pFlags.pinned&&(yield this.managers.appPeersManager.canPinMessage(this.peerId))}))},{icon:"download",text:"MediaViewer.Context.Download",onClick:()=>{Ds.Z.downloadToDisc({media:(0,vt.Z)(this.message)})},verify:()=>{var e,t;if(!(0,sn.Z)(this.message)||this.noForwards)return!1;let i=!1;if(null===(e=this.message.media)||void 0===e?void 0:e.photo)i=!0;else{if(!(null===(t=this.message.media)||void 0===t?void 0:t.document))return!1;i=!0}let s=!!c.Z;return i&&(s||(s=!!((0,be.Z)(this.target,"document")||(0,be.Z)(this.target,"audio")||(0,be.Z)(this.target,"media-sticker-wrapper")||(0,be.Z)(this.target,"media-photo")||(0,be.Z)(this.target,"media-video")))),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:()=>nn(this,void 0,void 0,(function*(){var e;const t=null===(e=this.message.media)||void 0===e?void 0:e.poll;return(yield this.managers.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.fromId!==m.yF||"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 zs(this.peerId,[this.mid])},verify:()=>nn(this,void 0,void 0,(function*(){return!this.message.pFlags.out&&"message"===this.message._&&!this.message.pFlags.is_outgoing&&(yield this.managers.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},{onClick:()=>{if(this.viewerPeerId)this.chat.appImManager.setInnerPeer({peerId:this.viewerPeerId});else{if(!this.canOpenReactedList)return!1;new $s(this.message)}},verify:()=>nn(this,void 0,void 0,(function*(){var e,t;return!this.peerId.isUser()&&(!!(null===(t=null===(e=this.message.reactions)||void 0===e?void 0:e.recent_reactions)||void 0===t?void 0:t.length)||(yield this.managers.appMessagesManager.canViewMessageReadParticipants(this.message)))})),notDirect:()=>!0,localName:"views"},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>nn(this,void 0,void 0,(function*(){return this.managers.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 js},verify:()=>!1,isSponsored:!0},{text:"Loading",onClick:()=>{this.emojiInputsPromise.then((e=>{new P.Z(e,!0).show()}))},verify:()=>!!this.getUniqueCustomEmojisFromMessage().length,notDirect:()=>!0,localName:"emojis"}]}getMessageWithText(){return this.albumMessages&&(0,Mt.Z)(this.albumMessages)||this.message}getUniqueCustomEmojisFromMessage(){const e=[],t=this.getMessageWithText(),i=t.entities;if(i){const t=i.filter((e=>"messageEntityCustomEmoji"===e._));e.push(...t.map((e=>e.document_id)))}const s=t.reactions;if(s){const t=s.results.filter((e=>"reactionCustomEmoji"===e.reaction._));e.push(...t.map((e=>e.reaction.document_id)))}return(0,tn.Z)(e)}init(){return nn(this,void 0,void 0,(function*(){this.cleanup(),this.setButtons();const e=yield this.filterButtons(this.buttons);if(!e.length)return;const t=this.element=yield(0,Ts.Z)({buttons:e,listenerSetter:this.listenerSetter});t.id="bubble-contextmenu",t.classList.add("contextmenu");const i=e.find((e=>"views"===e.localName));if(i){const e=this.message.reactions,t=null==e?void 0:e.recent_reactions,s=!!(null==t?void 0:t.length),n=(yield this.managers.appMessagesManager.canViewMessageReadParticipants(this.message))?(yield this.managers.appPeersManager.getPeer(this.peerId)).participants_count:void 0,a=e?e.results.reduce(((e,t)=>e+t.count),0):void 0;i.element.classList.add("tgico-"+(s?"reactions":"checks"));const o=new L.ZP.IntlElement({key:s?void 0===n?"Chat.Context.ReactedFast":"Chat.Context.Reacted":"NobodyViewed",args:s?void 0===n?[a]:[n,n]:void 0,element:i.textElement});let r;r=s?void 0===n?(0,L.ag)("Chat.Context.ReactedFast",[a]):(0,L.ag)(t.length===n?"Chat.Context.ReactedFast":"Chat.Context.Reacted",[t.length,n]):(0,L.ag)("Loading"),r.classList.add("btn-menu-item-text-fake"),i.element.append(r);const d=22,l=3,c=1.125;o.element.style.visibility="hidden",o.element.style.paddingRight=s?c*Math.min(l,t.length)+"rem":"1rem";const h=this.middleware.get();this.managers.appMessagesManager.getMessageReactionsListAndReadParticipants(this.message).then((e=>{if(!h())return;r&&r.remove();const a=e.combined,u=void 0===n?e.reactionsCount:s?a.filter((e=>e.reaction)).length:a.length;let p;if(1===a.length)p=new N.Z({peerId:a[0].peerId,onlyFirstName:!0,dialog:!1}).element,(!s||e.readParticipants.length<=1)&&(this.viewerPeerId=a[0].peerId);else if(s){const e=u===a.length||void 0===n;p=(0,L.ag)(e?"Chat.Context.ReactedFast":"Chat.Context.Reacted",e?[u]:[u,a.length])}else a.length?p=(0,L.ag)("MessageSeen",[a.length]):o.element.style.visibility="";if(p&&(p.style.paddingRight=c*Math.min(l,u)+"rem",p.classList.add("btn-menu-item-text-fake"),i.element.append(p)),a.length){const e=new se({avatarSize:d});e.render(t?t.map((e=>(0,R.Z)(e.peer_id))):a.map((e=>e.peerId))),i.element.append(e.container),this.canOpenReactedList=!0}}))}let s,n,a;if(!("message"!==this.message._||this.chat.selection.isSelecting||this.message.pFlags.is_outgoing||this.message.pFlags.is_scheduled||this.message.pFlags.local)){a=x.IS_APPLE||c.Z?"horizontal":"vertical",n=this.reactionsMenu=new Xs(this.managers,a,this.middleware),n.init(yield this.managers.appMessagesManager.getGroupsFirstMessage(this.message));const e=44,t=0;s="vertical"===a?{top:t,left:e}:{top:e,right:0,left:t}}const o=e.find((e=>"emojis"===e.localName));if(o){o.element.classList.add("is-multiline"),o.element.parentElement.insertBefore(document.createElement("hr"),o.element);const e=()=>{null!=s||(s={}),s.bottom=24},t=this.getUniqueCustomEmojisFromMessage(),i=this.emojiInputsPromise=(0,me.Z)();yield this.managers.appEmojiManager.getCachedCustomEmojiDocuments(t).then((s=>nn(this,void 0,void 0,(function*(){const n=t=>nn(this,void 0,void 0,(function*(){const s=new Map;t.forEach((e=>{e&&!s.has(e.stickerSetInput.id)&&s.set(e.stickerSetInput.id,e.stickerSetInput)}));const n=[...s.values()];if(i.resolve(n),1===s.size){const t=yield this.managers.acknowledged.appStickersManager.getStickerSet(n[0]),i=t.result.then((e=>{const t=(0,L.ag)("MessageContainsEmojiPack",[(0,B.Z)(e.set.title)]);(0,H.Z)(o.textElement,t)}));return t.cached?i:void e()}(0,H.Z)(o.textElement,(0,L.ag)("MessageContainsEmojiPacks",[s.size]))}));if(!s.some((e=>!e)))return n(s);e(),this.managers.appEmojiManager.getCustomEmojiDocuments(t).then(n)}))))}return this.chat.container.append(t),{element:t,cleanup:()=>{this.cleanup(),n&&n.cleanup()},destroy:()=>{t.remove(),n&&n.widthContainer.remove()},menuPadding:s,reactionsMenu:n,reactionsMenuPosition:a}}))}getUrlToMessage(){return nn(this,void 0,void 0,(function*(){if(this.peerId.isUser())return;let e;const{peerId:t,mid:i}=this,s=this.chat.threadId;"discussion"===this.chat.type&&(e=yield this.managers.appMessagesManager.getMessageByPeer(t,s));const n=yield this.managers.appPeersManager.getPeerUsername(e?e.fromId:t),a=(0,bt.Z)(i);let o="https://t.me/";return n?(o+=n,o+=e?`/${(0,bt.Z)(e.fwd_from.channel_post)}?comment=${a}`:s?`/${(0,bt.Z)(s)}/${a}`:"/"+a):(o+="c/"+t.toChatId(),o+=e?`/${a}?thread=${(0,bt.Z)(e.mid)}`:s?`/${(0,bt.Z)(s)}/${a}`:"/"+a),{url:o,isPrivate:!n}}))}getSelectedMessagesText(){return nn(this,void 0,void 0,(function*(){if(!Fs())return"";const e=this.chat.selection.isSelecting?[...this.chat.selection.selectedMids.get(this.peerId)].sort(((e,t)=>e-t)):[this.mid];return(yield Promise.all(e.map((e=>nn(this,void 0,void 0,(function*(){const t=yield this.chat.getMessage(e);return(null==t?void 0:t.message)?t.message+"\n":""})))))).join("")}))}}var on=i(4329),rn=i.n(on),dn=i(9043);class ln{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=(0,Ts.b)({buttons:this.sendMenuButtons,listenerSetter:e.listenerSetter}),this.sendMenu.classList.add("menu-send",e.openSide),(0,Ct.E)({element:e.onContextElement,callback:t=>{e.onOpen&&!e.onOpen()||(this.sendMenuButtons.forEach((e=>{e.element.classList.toggle("hide",!e.verify())})),(0,Ce.Z)(t),Lt.Z.openBtnMenu(this.sendMenu))},listenerSetter:e.listenerSetter})}setPeerId(e){this.type=e===d.Z.myId?"reminder":"schedule"}}var cn=i(1293),hn=i(9336),un=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class pn extends S.Z{constructor(e){super("popup-create-poll popup-new-media",{closable:!0,withConfirm:"Create",body:!0,title:"NewPoll"}),this.chat=e,this.tempId=0,this.onSubmitClick=()=>{this.send()},this.onInput=e=>{const t=e.target,i=(0,ye.Z)(t,"LABEL"),s=(0,cn.Z)(t);s||(t.parentElement.classList.add("is-filled"),i.classList.remove("hidden-widget"),i.firstElementChild.removeAttribute("disabled")),!i.nextElementSibling&&!s&&this.questions.childElementCount<10&&this.appendMoreField(),this.handleChange()},this.onDeleteClick=e=>{const t=e.target,i=(0,ye.Z)(t,"LABEL"),s=(0,Ie.Z)(i);this.correctAnswers&&this.correctAnswers[0][0]===s&&(this.correctAnswers=void 0),i.remove(),this.optionInputFields.splice(s,1),this.optionInputFields.forEach(((e,t)=>{e.options.labelOptions.length=0,e.options.labelOptions.push(t+1),L.ZP.weakMap.get(e.label.firstElementChild).update()})),this.handleChange()},this.construct()}construct(){return un(this,void 0,void 0,(function*(){if(this.questionInputField=new E.ZP({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 ln({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 e=document.createElement("hr"),t=document.createElement("div");t.classList.add("caption"),(0,L.$d)(t,"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 s=document.createElement("div");s.classList.add("caption"),(0,L.$d)(s,"Settings"),(yield this.chat.managers.appPeersManager.isBroadcast(this.chat.peerId))||(this.anonymousCheckboxField=new zt.Z({text:"NewPoll.Anonymous",name:"anonymous"}),this.anonymousCheckboxField.input.checked=!0,i.append(this.anonymousCheckboxField.label)),this.multipleCheckboxField=new zt.Z({text:"NewPoll.MultipleChoice",name:"multiple"}),this.quizCheckboxField=new zt.Z({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("")),n.forEach((t=>t.classList.toggle("hide",!e))),this.multipleCheckboxField.input.toggleAttribute("disabled",e),this.handleChange()})),i.append(this.multipleCheckboxField.label,this.quizCheckboxField.label);const n=[],a=document.createElement("div");a.classList.add("caption"),(0,L.$d)(a,"AccDescrQuizExplanation");const o=document.createElement("hr"),r=document.createElement("div");r.classList.add("poll-create-questions"),this.quizSolutionField=new E.ZP({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"),(0,L.$d)(d,"AddAnExplanationInfo"),r.append(this.quizSolutionField.container,d),n.push(o,a,r),n.forEach((e=>e.classList.add("hide"))),this.body.parentElement.insertBefore(e,this.body),this.body.append(t,this.questions,document.createElement("hr"),s,i,...n),(0,C.fc)(this.btnConfirm,this.onSubmitClick,{listenerSetter:this.listenerSetter}),this.scrollable=new T.ZP(this.body),this.appendMoreField(),this.onEscape=()=>!this.getFilledAnswers().length,this.handleChange()}))}getFilledAnswers(){return Array.from(this.questions.children).map(((e,t)=>{const i=e.querySelector(".input-field-input");return i instanceof HTMLInputElement?i.value:(0,hn.Z)(i,!1,!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 i=this.getFilledAnswers();if(i.length<2)return!1;if(i.find((e=>e.length>100)))return!1;const{value:s}=(0,hn.Z)(this.quizSolutionField.input,!1,!1);return!(s.length>200)}handleChange(){const e=this.validate();this.btnConfirm.toggleAttribute("disabled",!e)}send(e=!1){return un(this,void 0,void 0,(function*(){const t=this.questionInputField.value,i=this.getFilledAnswers(),{value:s,entities:n}=(0,hn.Z)(this.quizSolutionField.input,!0,!1);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:i.map(((e,t)=>({_:"pollAnswer",text:e,option:new Uint8Array([t])}))),id:void 0},r=yield this.chat.managers.appPollsManager.getInputMediaPoll(o,this.correctAnswers,s,n);this.chat.managers.appMessagesManager.sendOther(this.chat.peerId,r,Object.assign({},this.chat.getMessageSendingParams())),"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,i=new E.ZP({placeholder:"NewPoll.OptionsAddOption",label:"NewPoll.OptionLabel",labelOptions:[t],name:"question-"+e,maxLength:100});this.listenerSetter.add(i.input)("input",this.onInput);const s=new Fi.Z({text:"",name:"question"});s.main.append(i.container),(0,C.fc)(i.input,Ce.Z,{listenerSetter:this.listenerSetter}),s.label.classList.add("hidden-widget"),s.input.disabled=!0,this.quizCheckboxField.input.checked||s.label.classList.remove("radio-field"),this.listenerSetter.add(s.input)("change",(()=>{if(s.input.checked){const e=(0,Ie.Z)(s.label);this.correctAnswers=[new Uint8Array([e])],this.handleChange()}}));const n=document.createElement("span");n.classList.add("btn-icon","tgico-close"),i.container.append(n),(0,C.fc)(n,this.onDeleteClick,{listenerSetter:this.listenerSetter,once:!0}),this.questions.append(s.label),this.scrollable.scrollIntoViewNew({element:this.questions.lastElementChild,position:"center"}),this.optionInputFields.push(i)}}var fn=i(7814);function mn(e){let t,i;return e instanceof HTMLVideoElement?(t=e.videoWidth,i=e.videoHeight):(t=e.naturalWidth,i=e.naturalHeight),(0,fn.Z)({media:e,mediaSize:(0,qe.C)(t,i),boxSize:(0,qe.C)(320,240),quality:.9})}var gn=i(9897),vn=i(2341);function bn(e){const t=e.src;return fetch(t).then((e=>e.arrayBuffer())).then((e=>{const t=new Uint8Array(e);let i=0;for(let e=0,s=t.length;e${Pn.Z})|(
)`,"g");class Tn extends E.ZP{constructor(e){super(e),this.input.addEventListener("input",(()=>{this.updateInnerHTML(),this.onFakeInput()})),e.placeholder&&(0,L.$d)(this.inputFake,e.placeholder,void 0,"placeholder"),this.input.classList.add("scrollable","scrollable-y","no-scrollbar"),this.inputFake=document.createElement("div"),this.inputFake.contentEditable="true",this.inputFake.tabIndex=-1,this.inputFake.className=this.input.className+" input-field-input-fake"}onFakeInput(e=!0){var t;const{scrollHeight:i}=this.inputFake,s=+this.input.style.height.replace("px","");if(s===i)return;const n=Math.round(50*Math.log(Math.abs(i-s)));this.input.style.transitionDuration=`${n}ms`,e&&(null===(t=this.onChangeHeight)||void 0===t||t.call(this,i),this.input.style.height=i?i+"px":"");const a="is-changing-height";(0,Fe.Z)({element:this.input,className:a,forwards:!0,duration:n,onTransitionEnd:()=>{this.input.classList.remove(a)}})}updateInnerHTML(e=this.input.innerHTML){e=e.replace(//,"").replace(/().+?\/custom-emoji-element>/g,"$1"),Mn.Y&&(e=e.replace(Zn,"")),this.inputFake.innerHTML=e}setValueSilently(e,t){super.setValueSilently(e,t),this.updateInnerHTML(),t||this.onFakeInput()}}var kn=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};let xn;function An(){return xn}class _n extends S.Z{constructor(e,t,i,s){super("popup-send-photo popup-new-media",{closable:!0,withConfirm:"Modal.Send",confirmShortcutIsSendShortcut:!0,body:!0,title:!0,scrollable:!0}),this.chat=e,this.files=t,this.ignoreInputValue=s,this.onScroll=()=>{const{input:e}=this.messageInputField;this.scrollable.onAdditionalScroll(),e.scrollTop>0&&e.scrollHeight>130&&this.scrollable.container.classList.remove("scrolled-bottom")},this.onKeyDown=e=>{const t=e.target,{input:i}=this.messageInputField;if(t!==i){if("INPUT"===t.tagName||t.isContentEditable)return;i.focus(),(0,Nt.Z)(i)}},this.attachFile=e=>{const t=this.willAttach,i=this.shouldCompress(e.type),s=document.createElement("div");s.classList.add("popup-item");const n={file:e};(0,Ln.Z)(n,["scaledBlob","middlewareHelper","itemDiv","mediaSpoiler"]),n.middlewareHelper=this.middlewareHelper.get().create(),n.itemDiv=s;const a=i?this.attachMedia(n):this.attachDocument(n);return t.sendFileDetails.push(n),a.catch((e=>{s.style.backgroundColor="#000",console.error("error rendering file",e)}))},this.animationGroup="",this.construct(i)}construct(e){return kn(this,void 0,void 0,(function*(){this.willAttach={type:e,sendFileDetails:[],group:!0};const t=yield this.managers.apiManager.getLimit("caption");this.captionLengthMax=t,(0,C.fc)(this.btnConfirm,(()=>this.send()),{listenerSetter:this.listenerSetter});const i=yield(0,In.Z)({listenerSetter:this.listenerSetter,direction:"bottom-left",buttons:[{icon:"image",text:"Popup.Attach.AsMedia",onClick:()=>this.changeType("media"),verify:()=>this.hasAnyMedia()&&"document"===this.willAttach.type},{icon:"document",text:"SendAsFile",onClick:()=>this.changeType("document"),verify:()=>1===this.files.length&&"document"!==this.willAttach.type},{icon:"document",text:"SendAsFiles",onClick:()=>this.changeType("document"),verify:()=>this.files.length>1&&"document"!==this.willAttach.type},{icon:"groupmedia",text:"Popup.Attach.GroupMedia",onClick:()=>this.changeGroup(!0),verify:()=>!this.willAttach.group&&this.canGroupSomething()},{icon:"groupmediaoff",text:"Popup.Attach.UngroupMedia",onClick:()=>this.changeGroup(!1),verify:()=>this.willAttach.group&&this.canGroupSomething()},{icon:"mediaspoiler",text:"EnablePhotoSpoiler",onClick:()=>this.changeSpoilers(!0),verify:()=>this.canToggleSpoilers(!0,!0)},{icon:"mediaspoiler",text:"Popup.Attach.EnableSpoilers",onClick:()=>this.changeSpoilers(!0),verify:()=>this.canToggleSpoilers(!0,!1)},{icon:"mediaspoileroff",text:"DisablePhotoSpoiler",onClick:()=>this.changeSpoilers(!1),verify:()=>this.canToggleSpoilers(!1,!0)},{icon:"mediaspoileroff",text:"Popup.Attach.RemoveSpoilers",onClick:()=>this.changeSpoilers(!1),verify:()=>this.canToggleSpoilers(!1,!1)}]});this.header.append(i),this.btnConfirm.remove(),this.mediaContainer=document.createElement("div"),this.mediaContainer.classList.add("popup-photo"),this.scrollable.container.append(this.mediaContainer);const s=this.inputContainer=document.createElement("div");s.classList.add("popup-input-container");const n=document.createElement("div");let a,o,r;if(n.classList.add("popup-input-inputs","input-message-container"),this.messageInputField=new Tn({placeholder:"PreviewSender.CaptionPlaceholder",name:"message",withLinebreaks:!0,maxLength:this.captionLengthMax}),this.listenerSetter.add(this.scrollable.container)("scroll",this.onScroll),this.listenerSetter.add(this.messageInputField.input)("scroll",this.onScroll),this.messageInputField.input.classList.replace("input-field-input","input-message-input"),this.messageInputField.inputFake.classList.replace("input-field-input","input-message-input"),n.append(this.messageInputField.input,this.messageInputField.inputFake),s.append(n,this.btnConfirm),this.ignoreInputValue||(this.messageInputField.value=this.wasInputValue=this.chat.input.messageInputField.input.innerHTML,this.chat.input.messageInputField.value=""),this.container.append(s),this.attachFiles(),this.addEventListener("close",(()=>{this.files.length=0,this.willAttach.sendFileDetails.length=0,xn===this&&(xn=void 0)})),(0,Cn.Z)({buttons:[{icon:"mediaspoiler",text:"EnablePhotoSpoiler",onClick:()=>{this.applyMediaSpoiler(r)},verify:()=>o&&!r.mediaSpoiler},{icon:"mediaspoileroff",text:"DisablePhotoSpoiler",onClick:()=>{this.removeMediaSpoiler(r)},verify:()=>!(!o||!r.mediaSpoiler)}],listenTo:this.mediaContainer,listenerSetter:this.listenerSetter,findElement:e=>(a=(0,be.Z)(e.target,"popup-item"),o=a.classList.contains("popup-item-media"),r=this.willAttach.sendFileDetails.find((e=>e.itemDiv===a)),a)}),"scheduled"!==this.chat.type){const e=new ln({onSilentClick:()=>{this.chat.input.sendSilent=!0,this.send()},onScheduleClick:()=>{this.chat.input.scheduleSending((()=>{this.send()}))},openSide:"top-left",onContextElement:this.btnConfirm,listenerSetter:this.listenerSetter});e.setPeerId(this.chat.peerId),this.container.append(e.sendMenu)}xn=this}))}applyMediaSpoiler(e,t){return kn(this,void 0,void 0,(function*(){const i=e.middlewareHelper.get(),{width:s,height:n}=e.itemDiv.style;let a,o;if(e.itemDiv.classList.contains("album-item")){const{width:t,height:i}=e.itemDiv.parentElement.style,r=parseInt(t),d=parseInt(i);a=+s.slice(0,-1)/100*r,o=+n.slice(0,-1)/100*d}else a=parseInt(s),o=parseInt(n);const{url:r}=yield(0,fn.Z)({media:e.itemDiv.firstElementChild,boxSize:(0,qe.C)(40,40),mediaSize:(0,qe.C)(a,o),toDataURL:!0,quality:.2}),d=(0,En.o)(r),l={_:"photoStrippedSize",bytes:d,type:"i"};e.strippedBytes=d;const c={_:"photo",sizes:[l],id:0,access_hash:0,date:0,dc_id:0,file_reference:[],pFlags:{}},h=yield(0,$i.ZP)({middleware:i,width:a,height:o,animationGroup:this.animationGroup,media:c});i()&&(t||h.classList.add("is-revealing"),e.mediaSpoiler=h,e.itemDiv.append(h),yield(0,fe.d1)(),i()&&(0,$i.MR)({mediaSpoiler:h,reveal:!1}))}))}removeMediaSpoiler(e){(0,$i.MR)({mediaSpoiler:e.mediaSpoiler,reveal:!0,destroyAfter:!0}),e.mediaSpoiler=void 0}appendDrops(e){this.body.append(e)}get type(){return this.willAttach.type}set type(e){this.willAttach.type=e}partition(){const[e,t]=v(this.willAttach.sendFileDetails,(e=>vn.Z.has(e.file.type)));return{media:e,files:t}}mediaCount(){return this.partition().media.length}hasAnyMedia(){return this.mediaCount()>0}canGroupSomething(){const{media:e,files:t}=this.partition();return e.length>1||t.length>1}canToggleSpoilers(e,t){let i="media"===this.willAttach.type&&this.hasAnyMedia();if(t&&i&&(i=1===this.files.length),i){const s=this.willAttach.sendFileDetails.filter((e=>vn.Z.has(e.file.type))),n=s.filter((e=>e.mediaSpoiler));i=!!t||s.length>1,i&&(i=e?s.length!==n.length:s.length===n.length)}return i}changeType(e){this.willAttach.type=e,this.attachFiles()}changeGroup(e){this.willAttach.group=e,this.attachFiles()}changeSpoilers(e){this.partition().media.forEach((t=>{e&&!t.mediaSpoiler?this.applyMediaSpoiler(t):!e&&t.mediaSpoiler&&this.removeMediaSpoiler(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.messageInputField.value;if(t.length>this.captionLengthMax)return void(0,we.Am)(L.ZP.format("Error.PreviewSender.CaptionTooLong",!0));const i=this.willAttach;i.isMedia="media"===i.type||void 0;const{sendFileDetails:s,isMedia:n}=i,{peerId:a,input:o}=this.chat,{length:r}=s,d=this.chat.getMessageSendingParams();this.iterate((e=>{t&&e.length!==r&&(this.managers.appMessagesManager.sendText(a,t,Object.assign(Object.assign({},d),{clearDraft:!0})),t=void 0);const s=e.map((e=>Object.assign(Object.assign({},e),{file:e.scaledBlob||e.file,spoiler:!!e.mediaSpoiler}))),o=Object.assign(Object.assign({},i),{sendFileDetails:s});this.managers.appMessagesManager.sendAlbum(a,Object.assign(Object.assign(Object.assign({},d),{caption:t,isMedia:n,clearDraft:!0}),o)),t=void 0})),o.replyToMsgId=this.chat.threadId,o.onMessageSent(),this.wasInputValue=void 0,this.hide()}modifyMimeTypeForTelegram(e){return"image/webp"===e?"image/jpeg":e}scaleImageForTelegram(e,t,i){return kn(this,void 0,void 0,(function*(){const s=2560;let n,a=e.src;if("image/gif"!==t&&(Math.max(e.naturalWidth,e.naturalHeight)>s||i&&"image/webp"===t)){const{blob:i}=yield(0,fn.Z)({media:e,boxSize:(0,qe.C)(s,s),mediaSize:(0,qe.C)(e.naturalWidth,e.naturalHeight),mimeType:this.modifyMimeTypeForTelegram(t)});n=i,URL.revokeObjectURL(a),a=yield Sn.Z.invoke("createObjectURL",i),yield(0,Ot.cj)(e,a)}return n&&{url:a,blob:n}}))}attachMedia(e){return kn(this,void 0,void 0,(function*(){const{itemDiv:t}=e;t.classList.add("popup-item-media");const i=e.file;if(i.type.startsWith("video/")){const s=(0,yn.Z)();let n;s.src=e.objectURL=yield Sn.Z.invoke("createObjectURL",i),s.autoplay=!0,s.controls=!1,s.muted=!0,s.addEventListener("timeupdate",(()=>{s.pause()}),{once:!0}),t.append(s);try{yield(0,wn.Z)(s)}catch(e){n=e}if(e.width=s.videoWidth,e.height=s.videoHeight,e.duration=Math.floor(s.duration),n)throw n;const a=s.webkitAudioDecodedByteCount;void 0!==a&&(e.noSound=!a);const o=yield function(e){return new Promise(((t,i)=>{e.onseeked=()=>{e.onseeked=()=>{mn(e).then(t),e.onseeked=void 0},e.currentTime=0},e.onerror=i,e.currentTime=Math.min(e.duration,1)}))}(s);e.thumb=Object.assign({url:yield Sn.Z.invoke("createObjectURL",o.blob)},o)}else{const s=new Image;t.append(s);const n=e.objectURL=yield Sn.Z.invoke("createObjectURL",i);yield(0,Ot.cj)(s,n);const a=e.file.type,o=yield this.scaleImageForTelegram(s,a,!0);if(o&&(e.objectURL=o.url,e.scaledBlob=o.blob),e.width=s.naturalWidth,e.height=s.naturalHeight,"image/gif"===i.type)return e.noSound=!0,Promise.all([bn(s).then((t=>{e.duration=Math.ceil(t)})),mn(s).then((t=>kn(this,void 0,void 0,(function*(){e.thumb=Object.assign({url:yield Sn.Z.invoke("createObjectURL",t.blob)},t)}))))]).then((()=>{}))}}))}attachDocument(e){return kn(this,void 0,void 0,(function*(){const{itemDiv:t}=e;t.classList.add("popup-item-document");const i=e.file,s=i.type.startsWith("image/"),n=i.type.startsWith("audio/");let a;if((s||n||i.size<2e7)&&(e.objectURL||(e.objectURL=yield Sn.Z.invoke("createObjectURL",i))),s){a=new Image,yield(0,Ot.cj)(a,e.objectURL);const t=yield this.scaleImageForTelegram(a,e.file.type);t&&(e.objectURL=t.url)}const o={_:"document",file:i,file_name:i.name||"",size:i.size,type:s?"photo":"doc"};let r;e.objectURL&&(r={url:e.objectURL,downloaded:i.size,type:m.Pt});const d=yield(0,Yi.Z)({message:{_:"message",pFlags:{is_outgoing:!0},mid:0,peerId:0,media:{_:"messageMediaDocument",document:o}},cacheContext:r});s&&(e.width=a.naturalWidth,e.height=a.naturalHeight),t.append(d)}))}shouldCompress(e){return"media"===this.willAttach.type&&vn.Z.has(e)}onRender(){this.element.classList.contains("active")||(this.listenerSetter.add(document.body)("keydown",this.onKeyDown),!this.ignoreInputValue&&this.addEventListener("close",(()=>{this.wasInputValue&&(this.chat.input.messageInputField.value=this.wasInputValue)})),this.show())}setTitle(){const{willAttach:e,title:t,files:i}=this;let s;const n=[];if("document"===e.type)s="PreviewSender.SendFile",n.push(i.length);else{let e=0,t=0,a=0;i.forEach((i=>{i.type.startsWith("image/")?++e:i.type.startsWith("video/")?++t:++a})),[e,t,a].filter((e=>e>0)).length>1?(s="PreviewSender.SendFile",n.push(i.length)):e?(s="PreviewSender.SendPhoto",n.push(e)):t&&(s="PreviewSender.SendVideo",n.push(t))}(0,H.Z)(t,(0,L.ag)(s,n))}appendMediaToContainer(e){if(this.shouldCompress(e.file.type)){const t=(0,gn.Z)(e.width,e.height,384,320);e.itemDiv.style.width=t.width+"px",e.itemDiv.style.height=t.height+"px"}this.mediaContainer.append(e.itemDiv)}iterate(e){const{sendFileDetails:t}=this.willAttach;if(!this.willAttach.group)return void t.forEach((t=>e([t])));const i=t.length;for(let s=0;s{e.middlewareHelper.destroy()}));const n=e.map((e=>this.attachFile(e)));Promise.all(n).then((()=>{i.replaceChildren(),e.length&&(this.setTitle(),this.iterate((e=>{const t=this.shouldCompress(e[0].file.type);if(t&&e.length>1){const t=document.createElement("div");t.classList.add("popup-item-album","popup-item"),t.append(...e.map((e=>e.itemDiv))),Wi({container:t,items:e.map((e=>({w:e.width,h:e.height}))),maxWidth:384,minWidth:100,spacing:4}),i.append(t)}else e.forEach((e=>{this.appendMediaToContainer(e)}));t&&e.forEach((e=>{const t=s.find((t=>t.file===e.file));t&&t.mediaSpoiler&&this.applyMediaSpoiler(e,!0)}))})))})).then((()=>{this.onRender(),this.onScroll()}))}}var Fn=i(6057);const Dn="keydown",Rn="active",Bn=["ArrowUp","ArrowDown"],Nn=["ArrowLeft","ArrowRight"];function On({list:e,type:t,onSelect:i,once:s,waitForKey:n}){let a=(null==n?void 0:n.length)?new Set(n):void 0;const o=new Set("xy"===t?Bn.concat(Nn):"x"===t?Nn:Bn);let r;const d=()=>r||e.querySelector("."+Rn)||e.firstElementChild,l=(e,i)=>{if(r===e)return;let s=!1;r&&(s=!0,r.classList.remove(Rn)),r=e,r&&(r.classList.add(Rn),s&&p&&i&&(0,ue.Z)({container:p,element:r,position:"center",forceDuration:100,axis:"x"===t?"x":"y"}))},c=(t,i)=>{let s;return s=i?t.nextElementSibling||e.firstElementChild:t.previousElementSibling||e.lastElementChild,s};let h;h="xy"===t?(t,i)=>"ArrowUp"===i||"ArrowDown"===i?((t,i)=>{const s=i?"nextElementSibling":"previousElementSibling",n=i?"firstElementChild":"lastElementChild",a=t.getBoundingClientRect();let o=t[s]||e[n];for(;o!==t;){const t=o.getBoundingClientRect();if(t.x===a.x&&t.y!==a.y)break;o=o[s]||e[n]}return o})(t,"ArrowDown"===i):c(t,"ArrowRight"===i):(e,t)=>c(e,"ArrowRight"===t||"ArrowDown"===t);let u=i=>{const s=i.key;if(o.has(s)){if((0,Ce.Z)(i),e.childElementCount>1){let e=d();e=h(e,s),l(e,!0)}}else("Enter"===s||"xy"!==t&&"Tab"===s)&&((0,Ce.Z)(i),g(d()))};const p=(0,be.Z)(e,"scrollable");e.classList.add("navigable-list");const f=t=>{const i=(0,Be.Z)(t.target,e);i&&l(i,!1)},m=t=>{(0,Ce.Z)(t);const i=(0,Be.Z)(t.target,e);i&&(l(i,!1),g(d()))},g=e=>{return t=this,n=void 0,o=function*(){const t=yield i(e);(void 0!==t?!t:s)&&y()},new((a=void 0)||(a=Promise))((function(e,i){function s(e){try{d(o.next(e))}catch(e){i(e)}}function r(e){try{d(o.throw(e))}catch(e){i(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof a?i:new a((function(e){e(i)}))).then(s,r)}d((o=o.apply(t,n||[])).next())}));var t,n,a,o};let v=!1;const b=()=>{v||(v=!0,document.addEventListener(Dn,u,{capture:!0,passive:!1}),e.addEventListener("mousemove",f,{passive:!0}),(0,C.fc)(e,m))},y=()=>{v&&(v=!1,document.removeEventListener(Dn,u,{capture:!0}),e.removeEventListener("mousemove",f),(0,C.EN)(e,m))},w=()=>{a||l(e.firstElementChild,!1)};if(a){const e=u;u=t=>{a.has(t.key)&&((0,Ce.Z)(t),document.removeEventListener(Dn,u,{capture:!0}),u=e,document.addEventListener(Dn,u,{capture:!0,passive:!1}),a=void 0,w())}}else w();return b(),{attach:b,detach:y,resetTarget:w}}var Un=i(5824),Hn=i(5953);class zn extends l.Z{constructor(e){super(!1),this.hidden=!0,this.onVisible=()=>{this.detach&&this.detach();const e=this.list,{attach:t,detach:i,resetTarget:s}=On({list:e,type:this.listType,onSelect:this.onSelect,once:!0,waitForKey:this.waitForKey});this.attach=t,this.detach=i,this.resetTarget=s,x.IS_MOBILE||this.navigationItem||(this.navigationItem={type:"autocomplete-helper",onPop:()=>{this.navigationItem=void 0,this.toggle(!0)},noBlurOnPop:!0},Un.Z.pushItem(this.navigationItem)),this.addEventListener("hidden",(()=>{this.resetTarget=void 0,this.attach=void 0,this.detach=void 0,e.innerHTML="",i(),this.navigationItem&&(Un.Z.removeItem(this.navigationItem),this.navigationItem=void 0)}),{once:!0})},(0,Hn.Z)(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&&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,i){if(this.init)return;if(void 0===e&&(e=this.container.classList.contains("is-visible")&&!this.container.classList.contains("backwards")),this.hidden===e)return void(e||this.dispatchEvent("visible"));this.hidden=e,e?(this.navigationItem&&(Un.Z.removeItem(this.navigationItem),this.navigationItem=void 0),!t&&this.controller&&this.controller.hideOtherHelpers(),this.detach&&this.detach()):(this.controller&&this.controller.hideOtherHelpers(this),this.dispatchEvent("visible"));const s=this.controller||e?0:2;e&&this.dispatchEvent("hiding"),(0,Fe.Z)({element:this.container,className:"is-visible",forwards:!e,duration:d.Z.settings.animationsEnabled&&!i?300:0,onTransitionEnd:()=>{this.hidden&&this.dispatchEvent("hidden")},useRafs:s})}}class jn extends zn{constructor(e,t,i,s){super({appendTo:e,controller:t,listType:"xy",onSelect:e=>{return t=this,i=void 0,n=function*(){return!(yield It.Jo.onMediaClick({target:e},!0))},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n},waitForKey:["ArrowUp","ArrowDown"]}),this.chat=i,this.managers=s,this.container.classList.add("stickers-helper"),this.addEventListener("visible",(()=>{setTimeout((()=>{this.scrollable.container.scrollTop=0}),0),d.Z.dispatchEvent("choosing_sticker",!0)})),this.addEventListener("hidden",(()=>{this.onChangeScreen&&(o.Z.removeEventListener("changeScreen",this.onChangeScreen),this.onChangeScreen=void 0,this.listenerSetter.removeAll(),this.listenerSetter=void 0),d.Z.dispatchEvent("choosing_sticker",!1)}))}checkEmoticon(e){const t=this.controller.getMiddleware();this.lazyLoadQueue&&this.lazyLoadQueue.clear(),Os(e),this.managers.appStickersManager.getStickersByEmoticon(e).then((e=>{if(!t())return;this.init&&(this.init(),this.init=null);const i=this.list.cloneNode();let s;this.lazyLoadQueue.clear(),s=e.length?new Promise((t=>{const s=[];e.forEach((e=>{i.append(this.superStickerRenderer.renderSticker(e,void 0,s))})),Promise.all(s).finally(t)})):Promise.resolve(),s.then((()=>{this.list.replaceWith(i),this.list=i,this.onChangeScreen||(this.onChangeScreen=()=>{const e=this.list.childElementCount*o.Z.active.popupSticker.width+(this.list.childElementCount-1);this.list.style.width=e+"px"},o.Z.addEventListener("changeScreen",this.onChangeScreen),this.listenerSetter=new ce.Z,(0,ji.Z)({listenTo:this.container,listenerSetter:this.listenerSetter})),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.ZP(this.container),this.lazyLoadQueue=new le.Z,this.superStickerRenderer=new Fn.vT(this.lazyLoadQueue,this.chat.animationGroup,this.managers)}}var Gn=i(2230);const Vn=()=>{const e=new Date;return e.setHours(0,0,0,0),e},Kn=()=>{const e=new Date;return e.setFullYear(e.getFullYear()+1),e.setDate(e.getDate()-1),e};class Wn extends I{constructor(e,t,i){var s;if(super((s=e).getTime()>Kn().getTime()?new Date:s,t,{noButtons:!0,noTitle:!0,closable:!0,withConfirm:!0,minDate:Vn(),maxDate:Kn(),withTime:!0,showOverflowMonths:!0,confirmShortcutIsSendShortcut:!0,title:!0}),this.element.classList.add("popup-schedule"),this.header.append(this.controlsDiv),this.title.replaceWith(this.monthTitle),this.body.append(this.btnConfirm),i){const e=(0,Ue.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Schedule.SendWhenOnline"});this.body.append(e),(0,C.fc)(e,(()=>{t(Te),this.hide()}))}}}var $n=i(8119),qn=i(8799),Yn=i(6760),Qn=i(6299),Xn=i(6039);class Jn extends zn{constructor(e,t,i,s){super({appendTo:e,controller:t,listType:"x",onSelect:e=>{i.onEmojiSelected((0,Xn.xG)(e),!0)}}),this.managers=s,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.v7(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=>{(0,Xn.IA)(e,this.list,!1,!0)}))),this.waitForKey=t?["ArrowUp","ArrowDown"]:void 0,this.toggle(!e.length)}checkQuery(e,t){const i=this.controller.getMiddleware();this.managers.appEmojiManager.getBothEmojiKeywords().then((()=>{return s=this,n=void 0,o=function*(){if(!i())return;const s=e.replace(/^:/,""),n=yield this.managers.appEmojiManager.searchEmojis(s);i()&&this.render(n,":"!==t)},new((a=void 0)||(a=Promise))((function(e,t){function i(e){try{d(o.next(e))}catch(e){t(e)}}function r(e){try{d(o.throw(e))}catch(e){t(e)}}function d(t){var s;t.done?e(t.value):(s=t.value,s instanceof a?s:new a((function(e){e(s)}))).then(i,r)}d((o=o.apply(s,n||[])).next())}));var s,n,a,o}))}}class ea extends zn{constructor(e,t,i,s){super({appendTo:e,controller:t,listType:"y",onSelect:s}),this.className=i,this.container.classList.add(ea.BASE_CLASS,i)}init(){this.list=document.createElement("div"),this.list.classList.add(ea.BASE_CLASS+"-list",this.className+"-list"),this.container.append(this.list),this.scrollable=new T.ZP(this.container),this.addEventListener("visible",(()=>{setTimeout((()=>{this.scrollable.container.scrollTop=0}),0)}))}render(e,t){if(this.init){if(!e.length)return;this.init(),this.init=null}e.length&&(this.list.innerHTML="",e.forEach((e=>{const t=ea.listElement({className:this.className,peerId:e.peerId,name:e.name,description:e.description});this.list.append(t)}))),t||this.toggle(!e.length)}static listElement(e){const t=ea.BASE_CLASS_LIST_ELEMENT;e.className+="-list-element";const i=document.createElement("div");i.classList.add(t,e.className),i.dataset.peerId=""+e.peerId;const s=new f.Z;s.classList.add("avatar-30",t+"-avatar",e.className+"-avatar"),s.updateWithOptions({isDialog:!1,peerId:e.peerId});const n=document.createElement("div");if(n.classList.add(t+"-name",e.className+"-name"),e.name?(0,F.Z)(n,(0,B.Z)(e.name)):n.append(new N.Z({peerId:e.peerId,dialog:!1,onlyFirstName:!1,plainText:!1}).element),i.append(s,n),e.description){const s=document.createElement("div");s.classList.add(t+"-description",e.className+"-description"),(0,F.Z)(s,(0,B.Z)(e.description)),i.append(s)}return i}}ea.BASE_CLASS="autocomplete-peer-helper",ea.BASE_CLASS_LIST_ELEMENT=ea.BASE_CLASS+"-list-element";var ta=i(7381);function ia(e,t,i){const s=[].concat(t.bot_info);let n;void 0!==i&&(n=new ta.Z({ignoreCase:!0}));const a=new Map;let o;if(s.forEach((t=>{t.commands&&t.commands.forEach((({command:i,description:s},o)=>{const r="/"+i;a.set(i,{peerId:t.user_id?t.user_id.toPeerId(!1):e,command:i,name:r,description:s,index:o}),n&&n.indexObject(i,r)}))})),n){const e=n.search(i);o=Array.from(e).map((e=>a.get(e)))}else o=[...a.values()];return o=o.sort(((e,t)=>a.get(e.command).index-a.get(t.command).index)),o}class sa extends ea{constructor(e,t,i,s){super(e,t,"commands-helper",(e=>{const t=e.querySelector(`.${ea.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;return i.getReadyToSend((()=>{i.messageInput.innerHTML=t,i.sendMessage(!0)}))})),this.managers=s}checkQuery(e,t){return i=this,s=void 0,a=function*(){if(!(yield this.managers.appUsersManager.isBot(t)))return!1;const i=this.controller.getMiddleware();return this.managers.appProfileManager.getProfileByPeerId(t).then((s=>{if(!i())return;const n=ia(t,s,e);this.render(n)})),!0},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}}class na{constructor(){this.helpers=new Set,this.middleware=(0,Se.k)()}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()}}var aa=i(5102),oa=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class ra extends ea{constructor(e,t,i,s){super(e,t,"mentions-helper",(e=>{const t=e.dataset.peerId.toUserId();Promise.resolve(s.appUsersManager.getUser(t)).then((e=>{let t,s="";const n=(0,aa.Z)(e);n[0]?s="@"+n[0]:(s=e.first_name||e.last_name,t={_:"messageEntityMentionName",length:s.length,offset:0,user_id:e.id}),s+=" ",i.insertAtCaret(s,t)}))})),this.managers=s}checkQuery(e,t,i){const s=e.trim();if(e.length!==s.length)return!1;const n=this.controller.getMiddleware();return this.managers.appProfileManager.getMentions(t&&t.toChatId(),s,i).then((e=>oa(this,void 0,void 0,(function*(){if(!n())return;e=e.filter((e=>e!==d.Z.myId));const t=e.map((e=>oa(this,void 0,void 0,(function*(){const t=yield this.managers.appUsersManager.getUser(e),i=(0,aa.Z)(t);return{peerId:e,description:i[0]?"@"+i[0]:void 0}}))));this.render((yield Promise.all(t)).filter(Boolean))})))),!0}}var da=i(5494),la=i(6339),ca=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class ha extends la.Z{constructor(e){super({element:document.createElement("div")}),this.onBodyTouchStart=e=>{const t=e.touches[0].target;(0,Be.Z)(t,this.element)||t===this.btnHover||((0,Ce.Z)(e),this.toggle(!1))},(0,Hn.Z)(this,e),this.element.classList.add(ha.BASE_CLASS),this.element.style.display="none",this.scrollable=new T.ZP,this.element.append(this.scrollable.container),this.attachButtonListener(this.btnHover,this.listenerSetter),this.listenerSetter.add(d.Z)("history_reply_markup",(({peerId:e})=>ca(this,void 0,void 0,(function*(){this.peerId===e&&(this.checkAvailability()&&this.isActive()&&(yield this.render()),(0,pe.e9)().then((()=>{this.checkForceReply()})))}))))}init(){return this.appendTo.append(this.element),this.listenerSetter.add(this)("open",(()=>ca(this,void 0,void 0,(function*(){yield this.render(),c.Z&&(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}))})))),(0,C.fc)(this.element,(e=>{const t=(0,be.Z)(e.target,"btn");if(!t)return;const i=t.dataset.type,{peerId:s}=this;"keyboardButtonRequestPhone"===i?(0,vi.Z)({titleLangKey:"ShareYouPhoneNumberTitle",button:{langKey:"OK"},descriptionLangKey:"AreYouSureShareMyContactInfoBot"}).then((()=>{this.managers.appMessagesManager.sendContact(s,d.Z.myId)})):this.managers.appMessagesManager.sendText(s,t.dataset.text),this.toggle(!1)}),{listenerSetter:this.listenerSetter}),super.init()}checkForceReply(){return ca(this,void 0,void 0,(function*(){const e=yield this.getReplyMarkup();"replyKeyboardForceReply"!==e._||e.pFlags.hidden||e.pFlags.used||(e.pFlags.used=!0,this.chatInput.initMessageReply(e.mid))}))}getReplyMarkup(){var e;return ca(this,void 0,void 0,(function*(){return null!==(e=(yield this.managers.appMessagesManager.getHistoryStorageTransferable(this.peerId)).replyMarkup)&&void 0!==e?e:{_:"replyKeyboardHide",pFlags:{}}}))}render(e){return ca(this,void 0,void 0,(function*(){void 0===e&&(e=yield this.getReplyMarkup()),this.scrollable.container.replaceChildren();for(const t of e.rows){const e=document.createElement("div");e.classList.add(ha.BASE_CLASS+"-row");for(const i of t.buttons){const t=document.createElement("button");t.classList.add(ha.BASE_CLASS+"-button","btn"),(0,F.Z)(t,(0,B.Z)(i.text)),t.dataset.text=i.text,t.dataset.type=i._,e.append(t)}this.scrollable.container.append(e)}}))}checkAvailability(e){var t;return ca(this,void 0,void 0,(function*(){void 0===e&&(e=yield this.getReplyMarkup());const i="replyKeyboardHide"===e._||!(null===(t=e.rows)||void 0===t?void 0:t.length);return this.btnHover.classList.toggle("hide",i),i&&this.toggle(!1),!i}))}setPeer(e){this.peerId=e,this.checkAvailability(),this.checkForceReply()}}ha.BASE_CLASS="reply-keyboard";var ua=i(1080),pa=i(8678),fa=i(2830),ma=i(515);const ga="INLINE-HELPER";class va extends zn{constructor(e,t,i,s){super({appendTo:e,controller:t,listType:"xy",waitForKey:["ArrowUp","ArrowDown"],onSelect:e=>{if(!e)return!1;const{peerId:t,botId:i,queryId:s}=this.list.dataset;return this.chat.input.getReadyToSend((()=>{const n=(0,ma.Z)(s,e.dataset.resultId);this.managers.appInlineBotsManager.sendInlineResult(t.toPeerId(),i,n,Object.assign(Object.assign({},this.chat.getMessageSendingParams()),{clearDraft:!0})),this.chat.input.onMessageSent(!0,!0)}))}}),this.chat=i,this.managers=s,this._checkQuery=(e,t,i)=>{return s=this,n=void 0,r=function*(){const s=this.controller.getMiddleware(),n=yield this.managers.appUsersManager.resolveUsername(t);if(!s())throw"PEER_CHANGED";if("user"!==n._||!n.pFlags.bot)throw"NOT_A_BOT";const a=this.managers.appInlineBotsManager.getInlineResults(e,n.id,i).then((t=>{if(!s())throw"PEER_CHANGED";this.init&&(this.init(),this.init=null);const i=this.list.cloneNode();i.dataset.peerId=""+e,i.dataset.botId=""+n.id,i.dataset.queryId=""+t.query_id;const a=new ua.Z(null,ga,this.scrollable,!1);this.lazyLoadQueue.clear(),this.superStickerRenderer.clear();const r=[],d=!!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=d?void 0:document.createElement("div");if(n&&(n.classList.add("inline-helper-result-preview"),t.append(n)),i.append(t),d)t.classList.add("grid-item");else{n.classList.add("empty"),(0,F.Z)(n,(0,B.Z)([...e.title.trim()][0]));const s=document.createElement("div");s.classList.add("inline-helper-result-title"),(0,F.Z)(s,(0,B.Z)(e.title));const a=document.createElement("div");a.classList.add("inline-helper-result-description"),(0,F.Z)(a,(0,ft.ZP)(e.description,{noCommands:!0,noLinks:!0})),t.append(s,a);const o=document.createElement("div");o.classList.add("inline-helper-separator"),i.append(o)}if("botInlineResult"===e._){if(e.thumb&&0===e.thumb.mime_type.indexOf("image/")){let i;n?(i=document.createElement("div"),n.append(i)):i=t,i.classList.add("media-container"),d&&i.classList.add("no-border-radius"),this.lazyLoadQueue.push({div:t,load:()=>Ds.Z.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"),(0,pa.Z)(e).then((e=>{(0,fa.Z)(i,t,e,!0)}))}))})}}else{const i=e.document||e.photo;if(["sticker","gif"].includes(null==i?void 0:i.type)&&d)(0,Pe.Z)(i),"gif"===i.type?a.add(i,t):"sticker"===i.type&&(t.classList.add("super-sticker"),this.superStickerRenderer.renderSticker(i,t,r),i.animated&&this.superStickerRenderer.observeAnimated(t));else if(i){const e=d?48:void 0;d&&t.classList.add("no-border-radius"),(0,K.Z)({photo:i,container:d?t:n,boxWidth:e,boxHeight:e,middleware:s,lazyLoadQueue:this.lazyLoadQueue,loadPromises:r})}}}return Promise.all(r).then((()=>{if(!s())return void a.clear();i.classList.toggle("is-gallery",d),i.classList.toggle("super-stickers",d),this.container.classList.toggle("is-gallery",d);const r=this.list.parentElement;if(r.textContent="",t.switch_pm){const i=(0,Ue.Z)("btn-primary btn-secondary btn-primary-transparent primary");(0,F.Z)(i,(0,B.Z)(t.switch_pm.text)),(0,C.fc)(i,(i=>{this.chat.appImManager.setInnerPeer({peerId:e}),this.managers.appInlineBotsManager.switchToPM(e,n.id,t.switch_pm.start_param)})),r.append(i)}r.append(this.list=i),this.gifsMasonry&&this.gifsMasonry.detach(),this.gifsMasonry=a,a.attach(),this.onChangeScreen||(this.onChangeScreen=()=>{if(this.list.classList.contains("is-gallery")){const e=this.list.childElementCount*o.Z.active.popupSticker.width+(this.list.childElementCount-1);this.list.style.width=e+"px"}else this.list.style.width=""},o.Z.addEventListener("changeScreen",this.onChangeScreen)),this.onChangeScreen(),this.toggle(!t.results.length&&!t.switch_pm),this.scrollable.scrollTop=0}))}));return{user:n,renderPromise:a}},new((a=void 0)||(a=Promise))((function(e,t){function i(e){try{d(r.next(e))}catch(e){t(e)}}function o(e){try{d(r.throw(e))}catch(e){t(e)}}function d(t){var s;t.done?e(t.value):(s=t.value,s instanceof a?s:new a((function(e){e(s)}))).then(i,o)}d((r=r.apply(s,n||[])).next())}));var s,n,a,r},this.container.classList.add("inline-helper"),this.addEventListener("visible",(()=>{setTimeout((()=>{this.scrollable.container.scrollTop=0}),0)})),this.checkQuery=(0,Ze.Z)(this._checkQuery,200,!0,!0),this.addEventListener("hidden",(()=>{this.onChangeScreen&&(o.Z.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.ZP(this.container),this.lazyLoadQueue=new le.Z,this.superStickerRenderer=new Fn.vT(this.lazyLoadQueue,ga,this.managers)}}var ba=i(8090),ya=i(3013),wa=i(5133);class Sa extends ea{constructor(e,t,i){super(e,void 0,"bot-commands",(e=>{const i=e.querySelector(`.${ea.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;return t.getReadyToSend((()=>{t.messageInput.innerHTML=i,t.sendMessage(!0),this.toggle(!0)}))})),this.managers=i}setUserId(e,t){var i;if(this.userId!==e||!(null===(i=this.list)||void 0===i?void 0:i.childElementCount))return this.userId=e,(0,Ke.Z)(this.managers.appProfileManager.getProfile(e),(i=>{if(!t())return;const s=ia(e.toPeerId(!1),i),n=50*s.length+8+24;this.container.style.setProperty("--height",n+"px"),this.render(s)}));this.toggle(!1)}}var Ca=i(8479),La=(i(1544),i(7197)),Ea=i(6241),Ia=i(6535),Ma=i(2821),Pa=i(3066);function Za(e){return t=this,i=void 0,n=function*(){return{cached:e.cached,result:e.cached?yield e.result:e.result}},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}function Ta(e){return e.then(Za)}var ka=i(177),xa=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Aa{constructor(e,t,i){this.managers=e,this.onReady=t,this.onChange=i,this.middleware=(0,Se.k)(),this.listenerSetter=new ce.Z,this.construct()}construct(){this.container=document.createElement("div"),this.container.classList.add("new-message-send-as-container"),this.closeBtn=document.createElement("div"),this.closeBtn.classList.add("new-message-send-as-close","new-message-send-as-avatar","tgico-close");const e=[{text:"SendMessageAsTitle",onClick:void 0}];let t;this.buttons=[];const i=e=>{e&&(t=this.avatar);const i=this.avatar!==t,s=!e&&i?2:0;(0,Fe.Z)({element:this.closeBtn,className:"is-visible",forwards:e,duration:300,useRafs:s}),i||(0,Fe.Z)({element:t,className:"is-visible",forwards:!e,duration:300,useRafs:s})};(0,In.Z)({buttonOptions:{noRipple:!0},listenerSetter:this.listenerSetter,container:this.container,direction:"top-right",buttons:e,onOpenBefore:()=>{i(!0)},onOpen:(t,i)=>{e[0].element.classList.add("btn-menu-item-header"),this.btnMenu=i,this.btnMenu.classList.add("scrollable","scrollable-y"),this.btnMenu.append(...this.buttons.map((e=>e.element)))},onClose:()=>{i(!1)},onCloseAfter:()=>{this.btnMenu=void 0}}),this.container.append(this.closeBtn)}updateButtons(e){var t;return xa(this,void 0,void 0,(function*(){const i=e.map(((e,t)=>xa(this,void 0,void 0,(function*(){const i=document.createElement("div"),s=document.createElement("div");return s.classList.add("btn-menu-item-subtitle"),e.isUser()?s.append((0,L.ag)("Chat.SendAs.PersonalAccount")):e===this.peerId?s.append((0,L.ag)("VoiceChat.DiscussionGroup")):s.append(yield(0,ka.Z)(e.toChatId())),i.append(new N.Z({peerId:e}).element,s),{onClick:t?()=>xa(this,void 0,void 0,(function*(){const t=this.peerId;this.changeSendAsPeerId(e);const i=this.middleware.get(),s=()=>{if(this.sendAsPeerId!==e||!i())return;const t=this.sendAsPeerIds.slice();(0,h.Z)(t,e),t.unshift(e),this.updateButtons(t)};d.Z.settings.animationsEnabled?setTimeout(s,250):s(),this.managers.appMessagesManager.saveDefaultSendAs(t,e)})):void 0,textElement:i}})))),s=yield Promise.all(i);(0,Ts.b)({buttons:s}),s.forEach(((t,i)=>{const s=e[i],n=new f.Z;n.classList.add("avatar-26","btn-menu-item-icon"),n.updateWithOptions({peerId:s}),i||n.classList.add("active"),t.element.prepend(n)})),this.buttons=s,null===(t=this.btnMenu)||void 0===t||t.append(...this.buttons.map((e=>e.element)))}))}updateAvatar(e,t){return xa(this,void 0,void 0,(function*(){const i=this.avatar;if(i&&i.peerId===e)return;i||(t=!0);const s=t?0:2,n=t?0:300,a=this.avatar=new f.Z;a.classList.add("new-message-send-as-avatar","avatar-30"),yield a.updateWithOptions({isDialog:!1,peerId:e}),(0,Fe.Z)({element:a,className:"is-visible",forwards:!0,duration:n,useRafs:s}),i&&(0,Fe.Z)({element:i,className:"is-visible",forwards:!1,duration:n,onTransitionEnd:()=>{i.remove()},useRafs:s}),this.container.append(a)}))}changeSendAsPeerId(e,t){return this.sendAsPeerId=e,this.onChange(e),this.updateAvatar(e,t)}getDefaultSendAs(){return this.managers.acknowledged.appProfileManager.getChannelFull(this.peerId.toChatId()).then((e=>({cached:e.cached,result:e.result.then((e=>e.default_send_as?(0,R.Z)(e.default_send_as):void 0))})))}updateManual(e){return xa(this,void 0,void 0,(function*(){const t=this.peerId;if(this.updatingPromise||!(yield this.managers.appPeersManager.isChannel(t)))return;const i=this.middleware.get((()=>!this.updatingPromise||this.updatingPromise===l)),{container:s}=this,n=t.toChatId(),a=(yield Ta(this.getDefaultSendAs())).result,o=e;a instanceof Promise&&(e=void 0);const r=o&&!e,l=this.updatingPromise=(0,Ke.Z)(a,(t=>xa(this,void 0,void 0,(function*(){if(!i()||void 0===t)return;if(yield this.changeSendAsPeerId(t,e),!i())return;this.managers.appChatsManager.getSendAs(n).then((e=>{if(!i())return;const s=e.filter((e=>!e.pFlags.premium_required)).map((e=>e.peer)).map((e=>(0,R.Z)(e)));this.sendAsPeerIds=s.slice(),(0,h.Z)(s,t),s.unshift(t),this.updateButtons(s)}));const a=()=>{this.onReady(s,e),this.addedListener||(this.listenerSetter.add(d.Z)("peer_full_update",(e=>{this.peerId===e&&this.update()})),this.addedListener=!0)};if(!r)return a;a()}))));return l.finally((()=>{this.updatingPromise===l&&(this.updatingPromise=void 0)})),r?void 0:l}))}update(e){return this.updateManual(e).then((e=>null==e?void 0:e()))}setPeerId(e){this.middleware.clean(),this.updatingPromise=void 0,this.peerId=e}destroy(){this.container.remove(),this.setPeerId(),this.listenerSetter.removeAll()}}var _a=i(9041);function Fa(e,t){const i={};e.forEach((e=>i[e]=0));const s=window.getSelection();let n=-1;if(!s.isCollapsed){const t=s.getRangeAt(0),a=t.commonAncestorContainer,o=a.nodeType===a.ELEMENT_NODE?a:a.parentElement,r=document.createTreeWalker(o.closest('[contenteditable="true"]'),NodeFilter.SHOW_ELEMENT|NodeFilter.SHOW_TEXT,{acceptNode:e=>t.intersectsNode(e)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT});let d;for(n=0;d=r.nextNode();){++n;for(const t of e){const e=_a.o8[t];(d.nodeType===d.ELEMENT_NODE?d:d.parentElement).closest(e.match)&&++i[t]}}}const a={};for(const s of e)a[s]=i[s]>=(t?n:1);return a}var Da=i(6034),Ra=i(8794),Ba=i(2423),Na=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Oa="Posting media content isn't allowed in this group.";class Ua{constructor(e,t,i){this.chat=e,this.appImManager=t,this.managers=i,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&&(0,Ce.Z)(e),this.recordCanceled=!0,this.recorder.stop(),dn.Z.setKeepAlive(!1)},this.onEmoticonsOpen=()=>{const e=c.Z?"flip-icon":"active";this.btnToggleEmoticons.classList.toggle(e,!0)},this.onEmoticonsClose=()=>{const e=c.Z?"flip-icon":"active";this.btnToggleEmoticons.classList.toggle(e,!1)},this.scheduleSending=(e=this.sendMessage.bind(this,!0),t=new Date)=>Na(this,void 0,void 0,(function*(){const{peerId:i}=this.chat,s=this.chat.bubbles.getMiddleware(),n=d.Z.myId!==i&&i.isUser()&&(yield this.managers.appUsersManager.isUserOnlineVisible(i));new Wn(t,(t=>{s()&&(t<=10+(Date.now()/1e3|0)&&(t=void 0),this.scheduleDate=t,e(),"scheduled"!==this.chat.type&&t&&setTimeout((()=>{s()&&(S.Z.getPopups(P.Z).forEach((e=>e.hide())),this.appImManager.openScheduled(i))}),0))}),n).show()})),this.prepareDocumentExecute=()=>(this.executedHistory.push(this.messageInput.innerHTML),()=>this.canUndoFromHTML=this.messageInput.innerHTML),this.undoRedo=(e,t,i)=>{(0,Ce.Z)(e);let s=this.messageInput.innerHTML;if(s&&s!==i){this.lockRedo=!0;let e=0;do{document.execCommand(t,!1,null);const i=this.messageInput.innerHTML;if(s===i){if(++e>2)break}else e=0;s=i}while(s!==i);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 i=e.code,s=t[i];if(!Fs(document.getSelection())&&s&&("KeyK"===i?this.appImManager.markupTooltip.showLinkEditor():this.applyMarkdown(s),(0,Ce.Z)(e)),"KeyZ"===i){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:i,entities:s,caretPos:n}=(0,hn.Z)(this.messageInputField.input),a=(0,Ma.Z)(i,s,!0),o=(0,Ea.Z)(s,(0,Ia.Z)(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)||"messageMediaWebPage"===this.editMessage.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=i.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=this.managers.appWebPagesManager.getWebPage(t).then((i=>{this.getWebPagePromise===e&&(this.getWebPagePromise=void 0),this.lastUrl===t&&("webPage"===i._?(this.setTopInfo("webpage",(()=>{}),i.site_name||i.title||"Webpage",i.description||i.url||""),delete this.noWebPage,this.willSendWebPage=i):this.willSendWebPage&&this.onHelperCancel())}))}break}else this.lastUrl&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null,this.helperType?this.helperFunc():this.clearHelper());if(i.trim()){const e=Date.now();e-this.lastTimeType>=6e3&&(this.lastTimeType=e,this.managers.appMessagesManager.setTyping(this.chat.peerId,{_:"sendMessageTypingAction"},void 0,this.chat.threadId)),this.botCommands&&this.botCommands.toggle(!0)}else this.lastTimeType&&this.managers.appMessagesManager.setTyping(this.chat.peerId,{_:"sendMessageCancelAction"},void 0,this.chat.threadId),this.appImManager.markupTooltip&&this.appImManager.markupTooltip.hide(),document.activeElement===this.messageInput&&setTimeout((()=>{document.activeElement===this.messageInput&&this.resetCurrentFontFormatting()}),0);this.botCommands&&this.updateBotCommandsToggle(),this.editMsgId||this.saveDraftDebounced(),this.checkAutocomplete(i,n,o),this.updateSendBtn()},this.onEmojiSelected=(e,t)=>{const i=e.docId?{_:"messageEntityCustomEmoji",document_id:e.docId,length:e.emoji.length,offset:0}:(0,La.Z)(e.emoji);this.insertAtCaret(e.emoji,i,t)},this.onBtnSendClick=e=>Na(this,void 0,void 0,(function*(){if((0,Ce.Z)(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{const e=this.chat.peerId.isAnyChat();if(e&&!(yield this.chat.canSend("send_media")))return void(0,we.Am)(Oa);this.chatInput.classList.add("is-locked"),(0,qn.Z)();let t=!1;if(!e){const e=yield this.managers.appProfileManager.getProfile(this.chat.peerId.toUserId());(null==e?void 0:e.pFlags.voice_messages_forbidden)&&((0,we.bC)({langPackKey:"Chat.SendVoice.PrivacyError",langPackArguments:[yield(0,Vt.Z)({peerId:this.chat.peerId})]}),t=!0)}if(t)return void this.chatInput.classList.remove("is-locked");this.recorder.start().then((()=>{this.releaseMediaPlayback=ya.Z.setSingleMedia(),this.recordCanceled=!1,this.setRecording(!0),dn.Z.setKeepAlive(!0);const e=()=>{new xs.Z("popup-cancel-record",{titleLangKey:"DiscardVoiceMessageTitle",descriptionLangKey:"DiscardVoiceMessageDescription",buttons:[{langKey:"DiscardVoiceMessageAction",callback:()=>{(0,C.tH)(this.btnCancelRecord)}},{langKey:"Continue",isCancel:!0}]}).show()};this.recordingOverlayListener=this.listenerSetter.add(document.body)("mousedown",(t=>{(0,be.Z)(t.target,"chat-input")||(0,be.Z)(t.target,"popup-cancel-record")||((0,Ce.Z)(t),e())}),{capture:!0,passive:!1}),Un.Z.pushItem(this.recordingNavigationItem={type:"voice",onPop:()=>(setTimeout((()=>{e()}),0),!1)}),this.recordStartTime=Date.now();const t=this.recorder.sourceNode,i=t.context.createAnalyser();t.connect(i),i.fftSize=32;const s=new Uint8Array(i.frequencyBinCount),n=255*s.length,a=()=>{if(!this.recording)return;i.getByteFrequencyData(s);let e=0;s.forEach((t=>{e+=t}));const t=Math.min(1,e/n+.36);this.recordRippleEl.style.transform=`scale(${t})`;const o=Date.now()-this.recordStartTime,r=o%1e3,d=(0,ts.Z)(o/1e3)+","+("00"+Math.round(r/10)).slice(-2);this.recordTimeEl.innerText=d,(0,fe.T2)(a)};a()})).catch((e=>{switch(e.name){case"NotAllowedError":(0,we.Am)("Please allow access to your microphone");break;case"NotReadableError":(0,we.Am)(e.message);break;default:console.error("Recorder start error:",e,e.name,e.message),(0,we.Am)(e.message)}this.setRecording(!1),this.chatInput.classList.remove("is-locked")}))}})),this.onHelperCancel=(e,t)=>Na(this,void 0,void 0,(function*(){var i;if(e&&(0,Ce.Z)(e),this.willSendWebPage){const e=this.lastUrl;let t=!1;if(this.helperType&&(yield 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=this.getCurrentInputAsDraft(!0);t&&delete t.pFlags.no_webpage;const s=Object.assign(Object.assign({},e),{_:"draftMessage"});if(null===(i=s.entities)||void 0===i?void 0:i.length){const e=new Set(Object.values(Ba.SC));s.entities=s.entities.slice(),(0,g.Z)(s.entities,((t,i,s)=>{e.has(t._)||s.splice(i,1)})),s.entities.length||delete s.entities}if(!(0,Da.Z)(t,s))return void new xs.Z("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((0,Ce.Z)(e),(0,be.Z)(e.target,"reply"))if("forward"===this.helperType){const{forwardElements:e}=this;e&&c.Z&&!e.container.classList.contains("active")&&Lt.Z.openBtnMenu(e.container)}else"reply"===this.helperType?this.chat.setMessageId(this.replyToMsgId):"edit"===this.helperType&&this.chat.setMessageId(this.editMsgId)},this.listenerSetter=new ce.Z}construct(){this.chatInput=document.createElement("div"),this.chatInput.classList.add("chat-input","hide"),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=Zs();this.rowsWrapper.append(e);const t=this.fakeRowsWrapper=document.createElement("div");t.classList.add("fake-wrapper","fake-rows-wrapper");const i=this.fakeSelectionWrapper=document.createElement("div");i.classList.add("fake-wrapper","fake-selection-wrapper"),this.inputContainer.append(this.rowsWrapperWrapper,t,i),this.chatInput.append(this.inputContainer),this.goDownBtn=(0,$n.Z)({icon:"arrow_down",className:"bubbles-corner-button chat-secondary-button bubbles-go-down hide"}),this.inputContainer.append(this.goDownBtn),(0,C.fc)(this.goDownBtn,(e=>{(0,Ce.Z)(e),this.chat.bubbles.onGoDownClick()}),{listenerSetter:this.listenerSetter});const s=this.controlContainer=document.createElement("div");s.classList.add("chat-input-control","chat-input-wrapper"),this.inputContainer.append(s)}constructPeerHelpers(){this.replyElements.container=document.createElement("div"),this.replyElements.container.classList.add("reply-wrapper"),this.replyElements.iconBtn=(0,Gn.Z)(""),this.replyElements.cancelBtn=(0,Gn.Z)("close reply-cancel",{noRipple:!0}),this.replyElements.container.append(this.replyElements.iconBtn,this.replyElements.cancelBtn);const e=()=>{s=!0},t=()=>{s=!1},i=this.forwardElements={};let s=!1;const n=[i.showSender={text:"Chat.Alert.Forward.Action.Show1",onClick:e,checkForClose:()=>this.canToggleHideAuthor(),checkboxField:new zt.Z({checked:!0})},i.hideSender={text:"Chat.Alert.Forward.Action.Hide1",onClick:e,checkForClose:()=>this.canToggleHideAuthor(),checkboxField:new zt.Z({checked:!1})},i.showCaption={text:"Chat.Alert.Forward.Action.ShowCaption",onClick:t,checkboxField:new zt.Z({checked:!0})},i.hideCaption={text:"Chat.Alert.Forward.Action.HideCaption",onClick:t,checkboxField:new zt.Z({checked:!1})},i.changePeer={text:"Chat.Alert.Forward.Action.Another",onClick:()=>{this.changeForwardRecipient()},icon:"replace"}],a=i.container=(0,Ts.b)({buttons:n,listenerSetter:this.listenerSetter}),o=Array.from(a.children);[{elements:o.slice(0,2),onChange:(e,t)=>{const n=!!+e;s&&(this.forwardWasDroppingAuthor=!n);const a=this.replyElements.container.querySelector(".reply-title");if(a){const e=a.firstElementChild,t=L.ZP.weakMap.get(e),s=i.showSender.checkboxField.checked?"Chat.Accessory.Forward":"Chat.Accessory.Hidden";t.key=s,t.update()}}},{elements:o.slice(2,4),onChange:e=>{const t=!!+e;let s;s=t&&void 0!==this.forwardWasDroppingAuthor?this.forwardWasDroppingAuthor?i.hideSender:i.showSender:t?i.showSender:i.hideSender,s.checkboxField.checked=!0}}].forEach((e=>{const t=(0,wa.Z)(e.elements.map((e=>({container:e,input:e.querySelector("input")}))),e.onChange),i=document.createElement("hr");t.append(i),a.append(t)})),a.append(i.changePeer.element),c.Z||(this.forwardHover=new la.Z({element:a})),i.modifyArgs=n.slice(0,-1),this.replyElements.container.append(a),i.modifyArgs.forEach(((e,t)=>{const{input:i}=e.checkboxField;i.type="radio",i.name=t<2?"author":"caption",i.value=""+ +!(t%2)})),this.newMessageWrapper=document.createElement("div"),this.newMessageWrapper.classList.add("new-message-wrapper"),this.replyInTopicOverlay=document.createElement("div"),this.replyInTopicOverlay.classList.add("reply-in-topic-overlay","hide"),this.replyInTopicOverlay.append((0,L.ag)("Chat.Input.ReplyToAnswer")),this.btnToggleEmoticons=(0,Gn.Z)("none toggle-emoticons",{noRipple:!0}),this.inputMessageContainer=document.createElement("div"),this.inputMessageContainer.classList.add("input-message-container"),this.goDownUnreadBadge=document.createElement("span"),this.goDownUnreadBadge.classList.add("badge","badge-24","badge-primary"),this.goDownBtn.append(this.goDownUnreadBadge),this.goMentionBtn=(0,$n.Z)({icon:"mention",className:"bubbles-corner-button chat-secondary-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),(0,C.fc)(this.goMentionBtn,(e=>{(0,Ce.Z)(e);const t=this.chat.bubbles.getMiddleware();this.managers.appMessagesManager.goToNextMention(this.chat.peerId,this.chat.threadId).then((e=>{t()&&e&&this.chat.setMessageId(e)}))}),{listenerSetter:this.listenerSetter}),this.btnScheduled=(0,Gn.Z)("scheduled btn-scheduled float hide",{noRipple:!0}),(0,C.fc)(this.btnScheduled,(e=>{this.appImManager.openScheduled(this.chat.peerId)}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(d.Z)("scheduled_new",(({peerId:e})=>{this.chat.peerId===e&&this.btnScheduled.classList.remove("hide")})),this.listenerSetter.add(d.Z)("scheduled_delete",(({peerId:e})=>{this.chat.peerId===e&&this.managers.appMessagesManager.getScheduledMessages(this.chat.peerId).then((e=>{this.btnScheduled.classList.toggle("hide",!e.length)}))})),this.btnToggleReplyMarkup=(0,Gn.Z)("botcom toggle-reply-markup float hide",{noRipple:!0}),this.replyKeyboard=new ha({appendTo:this.rowsWrapper,listenerSetter:this.listenerSetter,managers:this.managers,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.botCommands=new Sa(this.rowsWrapper,this,this.managers),this.botCommandsToggle=document.createElement("div"),this.botCommandsToggle.classList.add("new-message-bot-commands");const r=document.createElement("div");r.classList.add("new-message-bot-commands-icon-scale");const l=this.botCommandsIcon=document.createElement("div");l.classList.add("animated-menu-icon","animated-menu-close-icon"),r.append(l),this.botCommandsToggle.append(r),(0,C.fc)(this.botCommandsToggle,(e=>{(0,Ce.Z)(e),l.classList.contains("state-back")?(this.botCommands.toggle(!0),l.classList.remove("state-back")):(this.botCommands.setUserId(this.chat.peerId.toUserId(),this.chat.bubbles.getMiddleware()),l.classList.add("state-back"))}),{listenerSetter:this.listenerSetter}),this.botCommands.addEventListener("visible",(()=>{l.classList.add("state-back")})),this.botCommands.addEventListener("hiding",(()=>{l.classList.remove("state-back")})),this.attachMenuButtons=[{icon:"image",text:"Chat.Input.Attach.PhotoOrVideo",onClick:()=>{this.fileInput.value="";const e=[...vn.Z].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:()=>{S.Z.createPopup(pn,this.chat).show()},verify:()=>(this.chat.peerId.isAnyChat()||this.chat.isBot)&&this.chat.canSend("send_polls")}];const h=this.attachMenuButtons.slice();this.attachMenu=(0,In.Z)({buttonOptions:{noRipple:!0},listenerSetter:this.listenerSetter,direction:"top-left",buttons:this.attachMenuButtons,onOpenBefore:()=>Na(this,void 0,void 0,(function*(){const e=yield this.managers.appAttachMenuBotsManager.getAttachMenuBots(),t=h.slice(),i=e.filter((e=>!e.pFlags.inactive)).map((e=>{const t=(0,Ra.Z)(e);return{regularText:(0,B.Z)(e.short_name),onClick:()=>{this.managers.appAttachMenuBotsManager.requestWebView(Object.assign({botId:e.bot_id,peerId:this.chat.peerId},this.chat.getMessageSendingParams())).then((t=>{const i=["allow-scripts","allow-same-origin","allow-popups","allow-forms","allow-modals","allow-storage-access-by-user-activation"].join(" ");class s extends S.Z{constructor(t){super("popup-payment popup-payment-verification",{closable:!0,overlayClosable:!0,body:!0,titleRaw:e.short_name}),this.url=t,this.d()}destroy(){return this.telegramWebView.destroy(),super.destroy()}d(){const e=this.telegramWebView=new wi({url:this.url,sandbox:i});e.iframe.classList.add("payment-verification"),this.body.append(e.iframe),this.show(),e.onMount()}}new s(t.url)}))},iconDoc:null==t?void 0:t.icon,verify:()=>Na(this,void 0,void 0,(function*(){let t=!1;const i={attachMenuPeerTypeSameBotPM:()=>this.chat.peerId.toUserId()===e.bot_id,attachMenuPeerTypeBotPM:()=>this.chat.isBot,attachMenuPeerTypePM:()=>this.chat.peerId.isUser(),attachMenuPeerTypeChat:()=>this.chat.isAnyGroup,attachMenuPeerTypeBroadcast:()=>this.chat.isBroadcast};for(const s of e.peer_types){const e=i[s._];if(t=yield e(),t)break}return t}))}}));t.splice(t.length,0,...i),this.attachMenuButtons.splice(0,this.attachMenuButtons.length,...t)}))}),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.botCommandsToggle,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 na,this.stickersHelper=new jn(this.rowsWrapper,this.autocompleteHelperController,this.chat,this.managers),this.emojiHelper=new Jn(this.rowsWrapper,this.autocompleteHelperController,this,this.managers),this.commandsHelper=new sa(this.rowsWrapper,this.autocompleteHelperController,this,this.managers),this.mentionsHelper=new ra(this.rowsWrapper,this.autocompleteHelperController,this,this.managers),this.inlineHelper=new va(this.rowsWrapper,this.autocompleteHelperController,this.chat,this.managers),this.rowsWrapper.append(this.newMessageWrapper),this.btnCancelRecord=(0,Gn.Z)("binfilled btn-circle btn-record-cancel chat-secondary-button"),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=(0,Gn.Z)("none btn-circle btn-send animated-button-icon"),this.btnSend.insertAdjacentHTML("afterbegin",'\n \n \n \n \n '),this.btnSendContainer.append(this.recordRippleEl,this.btnSend),this.sendMenu=new ln({onSilentClick:()=>{this.sendSilent=!0,this.sendMessage()},onScheduleClick:()=>{this.scheduleSending(void 0)},listenerSetter:this.listenerSetter,openSide:"top-left",onContextElement:this.btnSend,onOpen:()=>!("scheduled"===this.chat.type||this.isInputEmpty()&&!Object.keys(this.forwarding).length)}),this.btnSendContainer.append(this.sendMenu.sendMenu),this.inputContainer.append(this.btnCancelRecord,this.btnSendContainer),It.ZP.attachButtonListener(this.btnToggleEmoticons,this.listenerSetter),this.listenerSetter.add(It.ZP)("open",this.onEmoticonsOpen),this.listenerSetter.add(It.ZP)("close",this.onEmoticonsClose),this.attachMessageInputField(),this.listenerSetter.add(d.Z)("settings_updated",(()=>{var e;(this.stickersHelper||this.emojiHelper)&&(this.previousQuery="",this.checkAutocomplete()),null===(e=this.messageInputField)||void 0===e||e.onFakeInput()})),this.listenerSetter.add(d.Z)("draft_updated",(({peerId:e,threadId:t,draft:i,force:s})=>{this.chat.threadId===t&&this.chat.peerId===e&&"scheduled"!==this.chat.type&&this.setDraft(i,!0,s)})),this.listenerSetter.add(this.appImManager)("peer_changing",(e=>{this.chat!==e||"chat"!==this.chat.type&&"discussion"!==this.chat.type||this.saveDraft()})),this.listenerSetter.add(this.appImManager)("chat_changing",(({from:e,to:t})=>{this.chat===e?this.autocompleteHelperController.toggleListNavigation(!1):this.chat===t&&this.autocompleteHelperController.toggleListNavigation(!0)})),this.listenerSetter.add(d.Z)("scheduled_delete",(({peerId:e,mids:t})=>{"scheduled"===this.chat.type&&this.chat.peerId===e&&t.includes(this.editMsgId)&&this.onMessageSent()})),this.listenerSetter.add(d.Z)("history_delete",(({peerId:e,msgs:t})=>{this.chat.peerId===e&&"scheduled"!==this.chat.type&&(t.has(this.editMsgId)&&this.onMessageSent(),this.replyToMsgId&&t.has(this.replyToMsgId)&&this.clearHelper("reply"))})),this.listenerSetter.add(d.Z)("dialogs_multiupdate",(e=>{!e.has(this.chat.peerId)||"chat"!==this.chat.type&&"discussion"!==this.chat.type||(this.startParam===m.gZ?this.setStartParam():this.center(!0))}));try{this.recorder=new(rn())({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=>{const t=e.target.files;t.length&&(S.Z.createPopup(_n,this.chat,Array.from(t).slice(),this.willAttachType),this.fileInput.value="")}),!1),(0,C.fc)(this.btnSend,this.onBtnSendClick,{listenerSetter:this.listenerSetter,touchMouseDown:!0}),this.recorder&&((0,C.fc)(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&&(Un.Z.removeItem(this.recordingNavigationItem),this.recordingNavigationItem=void 0),this.recordCanceled)return;const{peerId:t,threadId:i}=this.chat,s=this.replyToMsgId,n=(Date.now()-this.recordStartTime)/1e3|0,a=new Blob([e],{type:"audio/ogg"});dn.Z.decode(e,!0).then((e=>{dn.Z.setKeepAlive(!1),this.managers.appMessagesManager.sendFile(t,{file:a,isVoiceMessage:!0,isMedia:!0,duration:n,waveform:e.waveform,objectURL:e.url,replyToMsgId:s,threadId:i,clearDraft:!0}),this.onMessageSent(!1,!0)}))}),(0,C.fc)(this.replyElements.cancelBtn,this.onHelperCancel,{listenerSetter:this.listenerSetter}),(0,C.fc)(this.replyElements.container,this.onHelperClick,{listenerSetter:this.listenerSetter}),this.saveDraftDebounced=(0,Ze.Z)((()=>this.saveDraft()),2500,!1,!0),this.botStartBtn=(0,Ue.Z)("btn-primary btn-transparent text-bold chat-input-control-button"),this.botStartBtn.append((0,L.ag)("BotStart")),(0,C.fc)(this.botStartBtn,(()=>{const{startParam:e}=this;if(void 0===e)return;const t=this.toggleBotStartBtnDisability=(0,Ut.Z)([this.botStartBtn],!0),i=this.chat.peerId,s=this.chat.bubbles.getMiddleware((()=>this.chat.peerId===i&&this.startParam===e&&this.toggleBotStartBtnDisability===t));this.managers.appMessagesManager.startBot(i.toUserId(),void 0,e).then((()=>{s()&&(t(),this.toggleBotStartBtnDisability=void 0,this.setStartParam())}))}),{listenerSetter:this.listenerSetter}),this.controlContainer.append(this.botStartBtn,this.replyInTopicOverlay),this.pinnedControlBtn=(0,Ue.Z)("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 As(e,0,!0,(()=>{this.chat.appImManager.setPeer();const e=this.chat.appImManager.chat;e.topbar.pinnedMessage&&e.topbar.pinnedMessage.pinnedMessageContainer.toggle(!0)}))}))}_center(e,t){if(!e&&!this.inputContainer.classList.contains("is-centering"))return;if(e===this.fakeWrapperTo)return;const i=e||this.fakeWrapperTo,s=!!e,n=this.fakeWrapperTo;let a,o="",r="";const d=i.getBoundingClientRect(),l=this.fakeRowsWrapper.getBoundingClientRect(),c=l.width,h=d.width;if(c!==h){const e=h/c,t=(c-h)/2;if(a=d.left-l.left-t,s&&(o=`translateX(${a}px) scaleX(${e})`,e<1)){const t=16;r=t+t*(1-e)+"px"}}this.fakeWrapperTo=e;const u=t?200:0;return(0,Fe.Z)({element:this.inputContainer,className:"is-centering",forwards:s,duration:u}),(0,Fe.Z)({element:this.rowsWrapperWrapper,className:"is-centering-to-control",forwards:!!(s&&e&&e.classList.contains("chat-input-control")),duration:u}),this.rowsWrapper.style.transform=o,this.rowsWrapper.style.borderRadius=r,{transform:o,borderRadius:r,needTranslateX:n&&(e&&e.classList.contains("chat-input-control")&&n===this.fakeSelectionWrapper||n.classList.contains("chat-input-control"))?-.5*a:a,widthFrom:c,widthTo:h}}center(e=!1){return Na(this,void 0,void 0,(function*(){return this._center(yield this.getNeededFakeContainer(),e)}))}setStartParam(e){this.startParam!==e&&(this.startParam=e,this.center(!0))}isReplyInTopicOverlayNeeded(){return this.chat.isForum&&!this.chat.isForumTopic&&!this.replyToMsgId&&"chat"===this.chat.type}getNeededFakeContainer(e=this.startParam){return Na(this,void 0,void 0,(function*(){return this.chat.selection.isSelecting?this.fakeSelectionWrapper:void 0!==e||"pinned"===this.chat.type||(yield this.chat.isStartButtonNeeded())||this.isReplyInTopicOverlayNeeded()?this.controlContainer:void 0}))}getReadyToSend(e){return"scheduled"===this.chat.type?(this.scheduleSending(e),!0):(e(),!1)}setUnreadCount(){return Na(this,void 0,void 0,(function*(){if(!this.goDownUnreadBadge)return;const e=yield this.managers.dialogsStorage.getDialogOrTopic(this.chat.peerId,"discussion"===this.chat.type?void 0:this.chat.threadId),t=null==e?void 0:e.unread_count;if(this.goDownUnreadBadge.innerText=""+(t||""),this.goDownUnreadBadge.classList.toggle("badge-gray",yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.chat.peerId,respectType:!0,threadId:this.chat.threadId})),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)}}))}getCurrentInputAsDraft(e){const{value:t,entities:i}=(0,hn.Z)(this.messageInputField.input,!0,!1);let s;return(t.length||e||this.replyToMsgId)&&(s={_:"draftMessage",date:(0,Ht.Z)(!0),message:t,entities:i.length?i:void 0,pFlags:{no_webpage:this.noWebPage},reply_to_msg_id:this.replyToMsgId}),s}saveDraft(){if(!this.chat.peerId||this.editMsgId||"scheduled"===this.chat.type)return;const e=this.getCurrentInputAsDraft();this.managers.appDraftsManager.syncDraft(this.chat.peerId,this.chat.threadId,e)}destroy(){this.listenerSetter.removeAll()}cleanup(e=!0){this.chat.peerId||(this.chatInput.classList.add("hide"),this.goDownBtn.classList.add("hide")),(0,Yn.Z)(),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,i=!1){return Na(this,void 0,void 0,(function*(){if(!i&&!(0,cn.Z)(this.messageInput)||"scheduled"===this.chat.type)return!1;if(!e&&!(e=yield this.managers.appDraftsManager.getDraft(this.chat.peerId,this.chat.threadId)))return i&&(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((()=>{(0,fe.T2)((()=>{this.onMessageSent()}))}))),!1;const s=function(e,t,i){const s=(0,Ia.Z)(e.message),n=e.entities||[],a=(0,Ea.Z)(n.slice(),s);return(0,Pa.Z)(e.message,{entities:a,wrappingForPeerId:t,loadPromises:void 0})}(e,this.chat.peerId),n=this.getCurrentInputAsDraft();return!((0,Da.Z)(e,n)&&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(s,t,t),0))}))}createSendAs(){if(this.sendAsPeerId=void 0,"chat"===this.chat.type||"discussion"===this.chat.type){let e=!0;this.sendAs=new Aa(this.managers,((e,t)=>{let i=0;e.parentElement||(this.newMessageWrapper.prepend(e),i=2),this.updateOffset("as",!0,t,i)}),(t=>{this.sendAsPeerId=t,e?e=!1:this.getPlaceholderKey().then((e=>{this.updateMessageInputPlaceholder(e)}))}))}else this.sendAs=void 0;return this.sendAs}finishPeerChange(e){return Na(this,void 0,void 0,(function*(){const t=this.chat.peerId,{forwardElements:i,btnScheduled:s,replyKeyboard:n,sendMenu:a,goDownBtn:o,chatInput:r,botCommandsToggle:d}=this,l=this.sendAs,c=this.createSendAs(),[h,u,p,f,m,g,v,b,y]=yield Promise.all([this.managers.appPeersManager.isBroadcast(t),this.managers.appPeersManager.canPinMessage(t),this.managers.appPeersManager.isBot(t),this.chat.canSend(),this.getNeededFakeContainer(e),Ta(this.managers.acknowledged.appProfileManager.getProfileByPeerId(t)),s?Ta(this.managers.acknowledged.appMessagesManager.getScheduledMessages(t)):void 0,c?(c.setPeerId(this.chat.peerId),c.updateManual(!0)):void 0,this.filterAttachMenuButtons()]),w=this.messageInput?yield this.getPlaceholderKey():void 0;return()=>{var c;if(r.classList.remove("hide"),o.classList.toggle("is-broadcast",h),o.classList.remove("hide"),null===(c=this.messageInputField)||void 0===c||c.onFakeInput(),this.goDownUnreadBadge&&this.setUnreadCount(),"pinned"===this.chat.type&&r.classList.toggle("can-pin",u),i&&(this.forwardWasDroppingAuthor=!1,i.showCaption.checkboxField.setValueSilently(!0),i.showSender.checkboxField.setValueSilently(!0)),s&&v){s.classList.add("hide");const e=this.chat.bubbles.getMiddleware();(0,Ke.Z)(v.result,(t=>{e()&&t&&s.classList.toggle("hide",!t.length)}))}if(this.newMessageWrapper&&this.updateOffset(null,!1,!0),d&&(this.hasBotCommands=void 0,this.botCommands.toggle(!0,void 0,!0),this.updateBotCommandsToggle(!0),d.remove(),p)){const e=this.chat.bubbles.getMiddleware(),t=g.result;(0,Ke.Z)(t,(i=>{e()&&this.updateBotCommands(i,!(t instanceof Promise))}))}l&&l.destroy(),b&&b(),n&&n.setPeer(t),a&&a.setPeerId(t),this.messageInput&&(this.updateMessageInput(f,w,y),this.messageInput.dataset.peerId=""+t);let S=!1;if(this.pinnedControlBtn){const e="pinned"===this.chat.type;S||(S=e),this.pinnedControlBtn.classList.toggle("hide",!e),this.pinnedControlBtn.replaceChildren((0,L.ag)(u?"Chat.Input.UnpinAll":"Chat.Pinned.DontShow"))}{const e=this.chat.isForum&&!this.chat.isForumTopic&&"chat"===this.chat.type;S||(S=e),this.replyInTopicOverlay.classList.toggle("hide",!e)}this.botStartBtn.classList.toggle("hide",S),this.startParam=e,this._center(m,!1)}}))}updateOffset(e,t,i,s){e?this.newMessageWrapper.dataset.offset=e:delete this.newMessageWrapper.dataset.offset,(0,Fe.Z)({element:this.newMessageWrapper,className:"has-offset",forwards:t,duration:i?0:300,useRafs:s})}updateBotCommands(e,t){var i,s;this.hasBotCommands=!!(null===(s=null===(i=e.bot_info)||void 0===i?void 0:i.commands)||void 0===s?void 0:s.length),this.updateBotCommandsToggle(t)}updateBotCommandsToggle(e){const{botCommandsToggle:t,hasBotCommands:i}=this,s=!!i&&this.isInputEmpty();if(!i){if(!t.parentElement)return;t.remove()}const n=s,a=t.parentElement?0:2;t.parentElement||this.newMessageWrapper.prepend(t),this.updateOffset("commands",n,e,a)}getPlaceholderKey(){return Na(this,void 0,void 0,(function*(){const{peerId:e,threadId:t,isForum:i}=this.chat;let s;return s=t&&!i?"Comment":(yield this.managers.appPeersManager.isBroadcast(e))?"ChannelBroadcast":void 0!==this.sendAsPeerId&&this.sendAsPeerId!==d.Z.myId||(yield this.managers.appMessagesManager.isAnonymousSending(e))?"SendAnonymously":"Message",s}))}updateMessageInputPlaceholder(e){const t=L.ZP.weakMap.get(this.messageInput);t&&t.compareAndUpdate({key:e})}filterAttachMenuButtons(){if(this.attachMenuButtons)return(0,en.Z)(this.attachMenuButtons,(e=>e.verify()))}updateMessageInput(e,t,i){const{chatInput:s,attachMenu:n,messageInput:a}=this,{peerId:o,threadId:r}=this.chat;s.classList.contains("is-hidden")!==!e&&(s.classList.add("no-transition"),s.classList.toggle("is-hidden",!e),s.offsetLeft,s.classList.remove("no-transition")),this.updateMessageInputPlaceholder(t),e?(a.contentEditable="true",this.setDraft(void 0,!1),a.innerHTML||this.messageInputField.onFakeInput()):a.contentEditable="inherit",n&&(n.toggleAttribute("disabled",!i.length),n.classList.toggle("btn-disabled",!i.length)),this.updateSendBtn()}attachMessageInputField(){const e=this.messageInputField;this.messageInputField=new Tn({placeholder:"Message",name:"message",withLinebreaks:!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.attachMessageInputListeners(),ba.T&&(0,ba.Z)(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((0,Qn.Z)(e))(0,Ce.Z)(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(0,Nt.Z)(this.messageInput)})),c.Z&&(0,C.fc)(this.messageInput,(e=>{if(It.ZP.isActive())return It.ZP.toggle(!1),(0,qn.Z)(),void(0,Ce.Z)(e);this.appImManager.selectTab(Qr.CHAT)}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(this.messageInput)("input",this.onMessageInput),this.listenerSetter.add(this.messageInput)("keyup",(()=>{this.checkAutocomplete()})),this.listenerSetter.add(this.messageInput)("focusin",(()=>{"chat"!==this.chat.type&&"discussion"!==this.chat.type||!this.chat.bubbles.scrollable.loadedAll.bottom||this.managers.appMessagesManager.readAllHistory(this.chat.peerId,this.chat.threadId)}))}applyMarkdown(e,t){const i={link:t?()=>document.execCommand("createLink",!1,t):()=>document.execCommand("unlink",!1,null)},s=e=>{i[e]=()=>{const t=(n.includes(e)?n:[e]).filter((e=>l[e]));return(0,h.Z)(t,e)||t.push(e),t.length?document.execCommand("fontName",!1,"markup-"+t.join("-")):this.resetCurrentFontFormatting()}},n=["bold","italic","underline","strikethrough","spoiler"];if(n.forEach((e=>{s(e)})),s("monospace"),!i[e])return!1;const a=i[e],o=[],r=Mn.Z.getInstance().prepareApplyingMarkdown(),d=this.listenerSetter.add(this.messageInput)("input",Ce.Z,{capture:!0,passive:!1});o.push(document.execCommand("styleWithCSS",!1,"true"));const l=Fa(Object.keys(i));return l.monospace&&"link"===e&&o.push(this.resetCurrentFormatting()),o.push("function"==typeof a?a():document.execCommand(a,!1,null)),o.push(document.execCommand("styleWithCSS",!1,"false")),r(),this.appImManager.markupTooltip&&this.appImManager.markupTooltip.setActiveMarkupButton(),this.listenerSetter.remove(d),this.messageInputField.simulateInputEvent(),!0}resetCurrentFormatting(){return document.execCommand("removeFormat",!1,null)}resetCurrentFontFormatting(){return document.execCommand("fontName",!1,"Roboto")}insertAtCaret(e,t,i=!0){Mn.Z.getInstance().makeFocused(this.messageInput);const{value:s,caretPos:n,entities:a}=(0,hn.Z)(this.messageInput),o=n>=0?n:s.length,r=s.substr(0,o),d=(s.substr(o),i?r.match(Ua.AUTO_COMPLETE_REG_EXP):null),l=d?d.index+(d[0].length-d[2].length):r.length;if(r.slice(0,l),i&&-1!==n){const e=d[2],t=document.getSelection();let i=0;for(;t.toString()!==e;){if(++i>=1e4)throw new Error("lolwhat");t.modify("extend","backward","character")}}(0,E.rf)(this.messageInput,e,t?[t]:void 0,this.chat.peerId)}checkAutocomplete(e,t,i){return Na(this,void 0,void 0,(function*(){if(void 0===e){const s=(0,hn.Z)(this.messageInputField.input,!0,!0);e=s.value,t=s.caretPos,i=s.entities}if(-1===t&&(t=e.length),void 0===i){const t=(0,Ma.Z)(e,i,!0);i=(0,Ea.Z)(i,(0,Ia.Z)(t))}if(e=e.slice(0,t),this.previousQuery===e)return;this.previousQuery=e;const s=e.match(Ua.AUTO_COMPLETE_REG_EXP);let n;if(s){const t=i[0];let a=s[2];const o=a[0];if(this.stickersHelper&&d.Z.settings.stickers.suggest&&(yield 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("@"===o){const e=this.chat.threadId?(0,bt.Z)(this.chat.threadId):void 0;(yield this.mentionsHelper.checkQuery(a,this.chat.peerId.isUser()?m.NM:this.chat.peerId,e))&&(n=this.mentionsHelper)}else s[1]||"/"!==o?d.Z.settings.emoji.suggest&&(a=a.replace(/^\s*/,""),e.match(/^\s*:(.+):\s*$/)||e.match(/:[;!@#$%^&*()-=|]/)||!a||(n=this.emojiHelper,this.emojiHelper.checkQuery(a,o))):(yield this.commandsHelper.checkQuery(a,this.chat.peerId))&&(n=this.commandsHelper)}n=this.checkInlineAutocomplete(e,n),this.autocompleteHelperController.hideOtherHelpers(n)}))}checkInlineAutocomplete(e,t){let i=!1;const s=e=>{this.btnPreloader&&(0,Fe.Z)({element:this.btnPreloader,className:"show",forwards:e,duration:400})};if(!t){const n=e.match(/^@([a-zA-Z\\d_]{3,32})\s/);if(n){const a=n[1],o=e.slice(n[0].length);i=n[0].length===e.length,t=this.inlineHelper,this.btnPreloader?s(!0):(this.btnPreloader=(0,Gn.Z)("none btn-preloader float show disable-hover",{noRipple:!0}),(0,jt.y)(this.btnPreloader,!0),this.inputMessageContainer.parentElement.insertBefore(this.btnPreloader,this.inputMessageContainer.nextSibling)),this.inlineHelper.checkQuery(this.chat.peerId,a,o).then((({user:e,renderPromise:t})=>{i&&e.bot_inline_placeholder&&(this.messageInput.dataset.inlinePlaceholder=e.bot_inline_placeholder),t.then((()=>{s(!1)}))})).catch((e=>{s(!1)}))}}return i||delete this.messageInput.dataset.inlinePlaceholder,t!==this.inlineHelper&&s(!1),t}setRecording(e){this.recording!==e&&((0,Fe.Z)({element:this.chatInput,className:"is-recording",forwards:e,duration:200}),this.recording=e,this.updateSendBtn())}changeForwardRecipient(){if(this.helperWaitingForward)return;this.helperWaitingForward=!0;const e=(0,Ca.Z)(this.forwarding),t=this.helperFunc;this.clearHelper(),this.updateSendBtn();let i=!1;new M.Z(e,(()=>{i=!0})).addEventListener("close",(()=>{this.helperWaitingForward=!1,i||t()}))}clearInput(e=!0,t=!0,i=""){return Na(this,void 0,void 0,(function*(){if(document.activeElement===this.messageInput&&x.IS_MOBILE_SAFARI){const e=document.createElement("input");document.body.append(e),(0,da.Z)(e),this.messageInputField.setValueSilently(i),(0,da.Z)(this.messageInput),e.remove()}else this.messageInputField.setValueSilently(i);c.Z||(this.canRedoFromHTML="",this.undoHistory.length=0,this.executedHistory.length=0,this.canUndoFromHTML="");let s=!1;e&&(s=yield this.setDraft(void 0,!1)),!s&&t&&this.onMessageInput()}))}isInputEmpty(){return(0,cn.Z)(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&&"scheduled"!==this.chat.type),this.btnToggleReplyMarkup&&this.btnToggleReplyMarkup.classList.toggle("show",t&&"scheduled"!==this.chat.type)}getValueAndEntities(e){const{entities:t,value:i}=(0,hn.Z)(this.messageInput,!0,!1),s=(0,Ia.Z)(i);return{value:i,totalEntities:(0,Ea.Z)(t,s)}}onMessageSent(e=!0,t){"scheduled"!==this.chat.type&&this.managers.appMessagesManager.readAllHistory(this.chat.peerId,this.chat.threadId,!0),this.scheduleDate=void 0,this.sendSilent=void 0;const{totalEntities:i}=this.getValueAndEntities(this.messageInput);let s=0;i.filter((e=>{if("messageEntityEmoji"===e._||"messageEntityCustomEmoji"===e._){const t=e.offset+e.length;return!(t<=s||(s=t,0))}return!1})).forEach((e=>{const t="messageEntityEmoji"===e._?{emoji:(0,Bs.zu)(e.unicode)}:{docId:e.document_id,emoji:""};this.managers.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:i}=this;if("scheduled"===i.type&&!e&&!t)return void this.scheduleSending();const{peerId:s}=i,{noWebPage:n}=this,a=this.chat.getMessageSendingParams(),{value:o,entities:r}=(0,hn.Z)(this.messageInputField.input,!0,!1);if(t){const e=this.editMessage;if(!o.trim()&&!e.media)return void new ks.Z(s,[t],i.type);this.managers.appMessagesManager.editMessage(e,o,{entities:r,noWebPage:n}),this.onMessageSent()}else o.trim()&&(this.managers.appMessagesManager.sendText(s,o,Object.assign(Object.assign({entities:r},a),{noWebPage:n,webPage:this.getWebPagePromise?void 0:this.willSendWebPage,clearDraft:!0})),"scheduled"===this.chat.type?this.onMessageSent(!0):this.onMessageSent(!1,!1));if(this.forwarding){const e=(0,Ca.Z)(this.forwarding);for(const t in e)this.managers.appMessagesManager.forwardMessages(s,t.toPeerId(),e[t],Object.assign(Object.assign({},a),{dropAuthor:this.forwardElements&&this.forwardElements.hideSender.checkboxField.checked,dropCaptions:this.isDroppingCaptions()})).catch((e=>Na(this,void 0,void 0,(function*(){"VOICE_MESSAGES_FORBIDDEN"===e.type&&(0,we.bC)({langPackKey:"Chat.SendVoice.PrivacyError",langPackArguments:[yield(0,Vt.Z)({peerId:s})]})}))));o||this.onMessageSent()}}sendMessageWithDocument(e,t=!1,i=!1,s=!1){return Na(this,void 0,void 0,(function*(){const n="sticker"===(e=yield this.managers.appDocsManager.getDoc(e)).type?"send_stickers":"gif"===e.type?"send_gifs":"send_media";return this.chat.peerId.isAnyChat()&&!(yield this.chat.canSend(n))?((0,we.Am)(Oa),!1):"scheduled"!==this.chat.type||t?!(!e||e.sticker&&(0,zi.Z)(e)&&!d.Z.premium||(this.managers.appMessagesManager.sendFile(this.chat.peerId,Object.assign(Object.assign({},this.chat.getMessageSendingParams()),{file:e,isMedia:!0,clearDraft:i,silent:s})),this.onMessageSent(i,!0),"sticker"===e.type&&this.managers.appStickersManager.saveRecentSticker(e.id),0)):(this.scheduleSending((()=>this.sendMessageWithDocument(e,!0,i,s))),!1)}))}canToggleHideAuthor(){const{forwardElements:e}=this;if(!e)return!1;const t=e.hideCaption.checkboxField;return!t.checked||(0,ye.Z)(t.label,"FORM").classList.contains("hide")}isDroppingCaptions(){return!this.canToggleHideAuthor()}initMessageEditing(e){return Na(this,void 0,void 0,(function*(){const t=yield this.chat.getMessage(e);let i=(0,Pa.Z)(t.message,{entities:t.totalEntities,wrappingForPeerId:this.chat.peerId});const s=()=>Na(this,void 0,void 0,(function*(){const n=yield(0,V.Z)({message:t,usingMids:[t.mid]});this.setTopInfo("edit",s,(0,L.ag)("AccDescrEditing"),n,i,t),this.editMsgId=e,this.editMessage=t,i=void 0}));s()}))}initMessagesForward(e){const t=()=>Na(this,void 0,void 0,(function*(){const i=Object.keys(e).map((e=>e.toPeerId())),s=new Set;let n=0,a=0;const o=i.map((t=>Na(this,void 0,void 0,(function*(){const i=e[t],o=i.map((e=>Na(this,void 0,void 0,(function*(){var i;const n=yield this.managers.appMessagesManager.getMessageByPeer(t,e);!(null===(i=n.fwd_from)||void 0===i?void 0:i.from_name)||n.fromId||n.fwdFromId?s.add("P"+n.fromId):s.add("N"+n.fwd_from.from_name),n.media&&n.message&&++a}))));yield Promise.all(o),n+=i.length}))));yield Promise.all(o);const r=s.size>2,l=[...s].map((e=>{const t=e[0];if(e=e.slice(1),"P"===t){const t=e.toPeerId();return t===d.Z.myId?(0,L.ag)("Chat.Accessory.Forward.You"):new N.Z({peerId:t,dialog:!1,onlyFirstName:r}).element}return r?e.split(" ")[0]:e})),{forwardElements:c}=this;(0,ye.Z)(c.showCaption.checkboxField.label,"FORM").classList.toggle("hide",!a);const h=c.hideCaption.checkboxField.checked;a&&h?c.hideSender.checkboxField.setValueSilently(!0):void 0!==this.forwardWasDroppingAuthor&&(this.forwardWasDroppingAuthor?c.hideSender:c.showSender).checkboxField.setValueSilently(!0);const u=c.showSender.checkboxField.checked?"Chat.Accessory.Forward":"Chat.Accessory.Hidden",p=(0,L.ag)(u,[n]),f=document.createDocumentFragment();let m,g;if(l.length<3?f.append(...(0,L.v_)(l,!1)):f.append(l[0],(0,L.ag)("AndOther",[l.length-1])),1===i.length){const t=i[0],s=e[t];if(m=yield this.managers.appMessagesManager.getMessageByPeer(t,s[0]),g=!!m.grouped_id,g){const e=yield this.managers.appMessagesManager.getMidsByMessage(m);(e.length!==n||e.find((e=>!s.includes(e))))&&(g=!1)}}const v=document.createDocumentFragment();if(g||1===n){const t=e[i[0]],s=yield(0,V.Z)({message:m,usingMids:t});v.append(f,": ",s)}else v.append((0,L.ag)("Chat.Accessory.Forward.From"),": ",f);const b=this.setTopInfo("forward",t,p,v);c.modifyArgs.forEach(((e,t)=>{const s=e.textElement,n=L.ZP.weakMap.get(s);n.args=[t<2?i.length:a],n.update()})),this.forwardHover&&this.forwardHover.attachButtonListener(b,this.listenerSetter),this.forwarding=e}));t()}initMessageReply(e){return Na(this,void 0,void 0,(function*(){if(this.replyToMsgId===e)return;let t=yield this.chat.getMessage(e);const i=()=>{let s;t?s=new N.Z({peerId:t.fromId,dialog:!1}).element:(s=(0,L.ag)("Loading"),this.managers.appMessagesManager.reloadMessages(this.chat.peerId,e).then((s=>{this.replyToMsgId===e&&(t=s,t?i():this.clearHelper("reply"))}))),this.setTopInfo("reply",i,s,t&&t.message,void 0,t),this.setReplyToMsgId(e)};i()}))}setReplyToMsgId(e){this.replyToMsgId=e,this.center(!0)}clearHelper(e){"edit"===this.helperType&&"edit"!==e&&this.clearInput(),e&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null),"reply"!==e&&(this.setReplyToMsgId(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")&&(Un.Z.removeByType("input-helper"),this.chat.container.classList.remove("is-helper-active"),this.t())}t(){const e="is-toggling-helper";(0,Fe.Z)({element:this.chat.container,className:e,forwards:!0,duration:150,onTransitionEnd:()=>{this.chat.container.classList.remove(e)}})}setInputValue(e,t=!0,i=!0){e||(e=""),t?this.clearInput(!1,!1,e):this.messageInputField.setValueSilently(e),(0,fe.T2)((()=>{i&&(0,Nt.Z)(this.messageInput),this.onMessageInput(),this.messageInput.scrollTop=this.messageInput.scrollHeight}))}setTopInfo(e,t,i="",s="",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,d=r.classList.contains("reply");this.replyElements.iconBtn.replaceWith(this.replyElements.iconBtn=(0,Gn.Z)(("webpage"===e?"link":e)+" active reply-icon",{noRipple:!0}));const{container:l}=J(i,s,this.chat.animationGroup,a);return d?r.replaceWith(l):o.insertBefore(l,o.lastElementChild),"webpage"===e&&(l.style.cursor="default"),this.chat.container.classList.contains("is-helper-active")||(this.chat.container.classList.add("is-helper-active"),this.t()),x.IS_MOBILE||Un.Z.pushItem({type:"input-helper",onPop:()=>{this.onHelperCancel()}}),void 0!==n&&this.setInputValue(n),setTimeout((()=>{this.updateSendBtn()}),0),l}}Ua.AUTO_COMPLETE_REG_EXP=/(\s|^)((?:(?:@|^\/)\S*)|(?::|^[^:@\/])(?!.*[:@\/]).*)$/;var Ha=i(6054);const za="pinned-container";class ja{constructor(e){this.floating=!1,(0,Hn.Z)(this,e);const{divAndCaption:t,className:i}=this;t.container.classList.add(za,"hide"),t.title.classList.add(za+"-title"),t.subtitle.classList.add(za+"-subtitle"),t.content.classList.add(za+"-content"),this.btnClose=document.createElement("button"),this.btnClose.classList.add(za+"-close",`pinned-${i}-close`,"btn-icon","tgico-close"),this.wrapper=document.createElement("div"),this.wrapper.classList.add(za+"-wrapper"),(0,A.Z)(this.wrapper),this.wrapperUtils=document.createElement("div"),this.wrapperUtils.classList.add(za+"-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){(0,C.fc)(e,(e=>{(0,Ce.Z)(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 i=(this.floating||o.Z.isMobile)&&!e;this.divAndCaption.container.classList.toggle("is-floating",i),this.divAndCaption.container.classList.toggle("hide",e),this.topbar.container.classList.toggle("is-pinned-floating",i),this.topbar.container.classList.toggle(`is-pinned-${this.className}-shown`,!e),this.topbar.setFloating(),this.topbar.setUtilsWidth()}isVisible(){return!this.divAndCaption.container.classList.contains("hide")}isFloating(){return this.divAndCaption.container.classList.contains("is-floating")}fill(e,t,i){this.divAndCaption.container.dataset.peerId=""+i.peerId,this.divAndCaption.container.dataset.mid=""+i.mid,this.divAndCaption.fill(e,t,i),this.topbar.setUtilsWidth()}}var Ga,Va=i(7207),Ka=i(8427);class Wa extends ja{constructor(e,t,i){super({topbar:e,chat:t,listenerSetter:e.listenerSetter,className:"audio",divAndCaption:new G("pinned-audio",((e,t)=>{(0,H.Z)(this.divAndCaption.title,e),(0,H.Z)(this.divAndCaption.subtitle,t)})),onClose:()=>{ya.Z.stop()},floating:!0}),this.topbar=e,this.chat=t,this.managers=i,this.onPlaybackParams=e=>{this.fasterEl.classList.toggle("active",e.playbackRate>1),this.repeatEl.classList.remove("tgico-audio_repeat","tgico-audio_repeat_single"),this.repeatEl.classList.add(e.loop?"tgico-audio_repeat_single":"tgico-audio_repeat"),this.repeatEl.classList.toggle("active",e.loop||e.round)},this.onPause=()=>{this.toggleEl.classList.remove("flip-icon")},this.onStop=()=>{this.toggle(!0)},this.onMediaPlay=({doc:e,message:t,media:i,playbackParams:s})=>{var n,a;let o,r;const d="voice"!==e.type&&"round"!==e.type;if(d){const t=e.attributes.find((e=>"documentAttributeAudio"===e._));o=(0,B.Z)(null!==(a=null==t?void 0:t.title)&&void 0!==a?a:e.file_name),r=(null==t?void 0:t.performer)?(0,B.Z)(t.performer):(0,L.ag)("AudioUnknownArtist")}else o=new N.Z({peerId:t.fromId,fromName:null===(n=t.fwd_from)||void 0===n?void 0:n.from_name}).element,r=(0,_.OD)(t.date);this.fasterEl.classList.toggle("hide",d),this.repeatEl.classList.toggle("hide",!d),this.onPlaybackParams(s),this.volumeSelector.setVolume(),this.progressLine.setMedia(i),this.fill(o,r,t),this.toggleEl.classList.toggle("flip-icon",!i.paused),this.toggle(!1)},this.divAndCaption.border.remove();const s=(0,Gn.Z)("fast_rewind active",{noRipple:!0}),n=(0,Gn.Z)("fast_forward active",{noRipple:!0}),a=(e,t)=>{(0,C.fc)(e,(e=>{(0,Ce.Z)(e),t()}),{listenerSetter:this.topbar.listenerSetter})};a(s,(()=>{ya.Z.previous()})),a(n,(()=>{ya.Z.next()})),this.toggleEl=(0,Gn.Z)("",{noRipple:!0}),this.toggleEl.classList.add("active","pinned-audio-ico","tgico"),a(this.toggleEl,(()=>{ya.Z.toggle()})),this.wrapper.prepend(this.wrapper.firstElementChild,s,this.toggleEl,n),this.volumeSelector=new Ka.Z(this.listenerSetter,!0);const o=document.createElement("div");o.classList.add("progress-line-container"),o.append(this.volumeSelector.container);const r=document.createElement("div");r.classList.add("pinned-audio-volume-tunnel"),this.volumeSelector.btn.classList.add("pinned-audio-volume","active"),this.volumeSelector.btn.prepend(r),this.volumeSelector.btn.append(o),this.repeatEl=(0,Gn.Z)("audio_repeat",{noRipple:!0}),a(this.repeatEl,(()=>{const e=ya.Z.getPlaybackParams();e.round?e.loop?(ya.Z.round=!1,ya.Z.loop=!1):ya.Z.loop=!ya.Z.loop:ya.Z.round=!0}));const d=this.fasterEl=(0,Gn.Z)("playback_2x",{noRipple:!0});a(d,(()=>{ya.Z.playbackRate=d.classList.contains("active")?1:1.75})),this.wrapperUtils.prepend(this.volumeSelector.btn,d,this.repeatEl);const l=document.createElement("div");l.classList.add("pinned-audio-progress-wrapper"),this.progressLine=new Va.Z({media:void 0,streamable:void 0,withTransition:!0,useTransform:!0}),this.progressLine.container.classList.add("pinned-audio-progress"),l.append(this.progressLine.container),this.wrapper.insertBefore(l,this.wrapperUtils),this.topbar.listenerSetter.add(ya.Z)("play",this.onMediaPlay),this.topbar.listenerSetter.add(ya.Z)("pause",this.onPause),this.topbar.listenerSetter.add(ya.Z)("stop",this.onStop),this.topbar.listenerSetter.add(ya.Z)("playbackParams",this.onPlaybackParams);const c=ya.Z.getPlayingDetails();c&&(this.onMediaPlay(c),this.onPlaybackParams(c.playbackParams))}destroy(){this.progressLine&&this.progressLine.removeListeners()}}!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"}(Ga||(Ga={}));const $a="pinned-message-border";class qa{constructor(){this.drawRect=(e,t,i,s,n)=>`M${e},${t+n}a${n},${n},0,0,1,${i},0v${s-2*n}a${n},${n},0,0,1,${-i},0Z`,this.getClipPath=(e,t,i)=>{let s="";if(2===i)s=this.drawRect(0,0,2,t,1)+this.drawRect(0,t+2,2,t,1);else for(let e=0;e{let i;return e<=1?i=Ga.ONE:2===e?i=Ga.TWO:3===e?i=Ga.THREE:4===e?i=Ga.FOUR:e>3&&(i=Ga.MORE),i},this.getMarkHeight=(e,t)=>{let i;return e<=1?i=Ga.ONE:2===e?i=Ga.TWO:3===e?i=Ga.THREE:4===e?i=Ga.FOUR:e>3&&(i=Ga.MORE),i},this.getMarkTranslateY=(e,t,i)=>1===i?0:2===i?e?t+1:0:3===i?e?1===e?t+1:2*t+2+1:0:(t+1)*e,this.getTrackTranslateY=(e,t,i,s)=>t<=4||e<=1?0:e>=t-2?s-Ga.ONE-i:(e-2)*i+1*e,this.getTrackHeight=(e,t)=>e<=3?Ga.ONE:t*e+1*(e-1)}render(e,t){if(this.border||(this.border=document.createElement("div"),this.border.classList.add($a),this.wrapper=document.createElement("div"),this.border.append(this.wrapper)),1===e)return this.count!==e&&(this.wrapper.className=$a+"-wrapper-1",this.border.classList.remove($a+"-mask"),this.wrapper.innerHTML=this.wrapper.style.cssText=""),this.border;const i=this.getBarHeight(e,t),s=this.getMarkHeight(e,t),n=this.getTrackHeight(e,i),a=`clipPath_${e}`,o=this.getClipPath(a,i,e),r=this.getMarkTranslateY(t,i,e),d=this.getTrackTranslateY(t,e,i,n);return this.border.classList.toggle($a+"-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=$a+"-wrapper",this.wrapper.style.cssText=`clip-path: url(#${a}); width: 2px; height: ${n}px; transform: translateY(-${d}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($a+"-mark")),this.svg.parentElement||this.wrapper.append(this.svg,this.mark),this.mark.style.cssText=`height: ${s}px; transform: translateY(${r}px);`,this.count=e,this.index=t,this.border}}var Ya=i(6724),Qa=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Xa{constructor(){this.rows={},this.container=document.createElement("div"),this.container.className=Xa.BASE_CLASS}getRow(e,t=!1){if(this.rows[e])return this.rows[e].element;const i=document.createElement("div"),s=!Object.keys(this.rows).length&&!t;return i.className=Xa.BASE_CLASS+"-row"+(s?"":" is-hiding hide"),this.rows[e]={element:i,new:!0},this.container.append(i),i}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)}),Xa.DURATION)}setNewRow(e,t=!1){const i=this.rows[e];i.new&&(t?(i.element.classList.remove("hide"),i.element.offsetLeft):i.element.classList.remove("is-hiding","hide"),delete i.new),this.clearRows(e)}animate(e,t,i=e>t,s=!1){if(e===t)return this.setNewRow(e);const n=this.rows[e],a=this.rows[t];if(!a&&!s)return this.setNewRow(e);const o=["from-top","from-bottom"];i||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)}}Xa.DURATION=200,Xa.BASE_CLASS="animated-super";class Ja{constructor(e=!1){this.reverse=e,this.decimals=[],this.previousNumber=0,this.container=document.createElement("div"),this.container.className=Ja.BASE_CLASS}getDecimal(e){if(this.decimals[e])return this.decimals[e];const t=document.createElement("div");t.className=Ja.BASE_CLASS+"-decimal";const i=document.createElement("div");i.className=Ja.BASE_CLASS+"-decimal-placeholder";const s=new Xa;return s.container.className=Ja.BASE_CLASS+"-decimal-wrapper",t.append(i,s.container),this.container.append(t),this.decimals[e]={container:t,placeholder:i,animatedSuper:s}}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()}))}),Xa.DURATION))}hideLeft(e){const t=(""+e).length;this.decimals.slice(t).forEach((t=>{const i=+t.placeholder.innerText||0;t.animatedSuper.getRow(Ja.EMPTY_INDEX,!0),t.animatedSuper.animate(Ja.EMPTY_INDEX,i,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(((i,s)=>{var n;const a=this.getDecimal(s),o=a.animatedSuper.getRow(i,!0),r=null!==(n=t[s])&&void 0!==n?n:Ja.EMPTY_INDEX;o.innerText=a.placeholder.innerText=""+i,a.animatedSuper.animate(i,r,this.reverse?ethis.previousNumber,!0)})),this.hideLeft(e),this.previousNumber=e}}Ja.EMPTY_INDEX=-1,Ja.BASE_CLASS="animated-counter";class eo{constructor(e,t,i){this.topbar=e,this.chat=t,this.managers=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.listenerSetter=new ce.Z,this.log=(0,r.kg)("PM"),this.debug=!0,this.isStatic=!1;const s=new X("pinned-message",t.animationGroup);this.pinnedMessageContainer=new ja({topbar:e,chat:t,listenerSetter:this.listenerSetter,className:"message",divAndCaption:s,onClose:()=>Qa(this,void 0,void 0,(function*(){return(yield i.appPeersManager.canPinMessage(this.chat.peerId))?new As(this.chat.peerId,this.pinnedMid,!0):new As(this.chat.peerId,0,!0),!1}))}),this.pinnedMessageBorder=new qa,s.border.replaceWith(this.pinnedMessageBorder.render(1,0)),this.animatedSubtitle=new Xa,s.subtitle.append(this.animatedSubtitle.container),this.animatedMedia=new Xa,this.animatedMedia.container.classList.add("pinned-message-media-container"),s.content.prepend(this.animatedMedia.container),this.animatedCounter=new Ja(!0),s.title.append((0,L.ag)("PinnedMessage")," ",this.animatedCounter.container);const n=this.pinnedMessageContainer.btnClose.cloneNode(!0);this.pinnedMessageContainer.attachOnCloseEvent(n),s.container.prepend(n),this.btnOpen=(0,Gn.Z)("pinlist pinned-container-close pinned-message-pinlist",{noRipple:!0}),this.pinnedMessageContainer.wrapperUtils.prepend(this.btnOpen),(0,C.fc)(this.btnOpen,(e=>{(0,Ce.Z)(e),this.topbar.openPinned(!0)}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(d.Z)("peer_pinned_messages",(({peerId:e})=>{e===this.chat.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(d.Z)("peer_pinned_hidden",(({peerId:e})=>{e===this.chat.peerId&&this.pinnedMessageContainer.toggle(this.hidden=!0)})),this.setPinnedMessage=(0,Ze.Z)((()=>this._setPinnedMessage()),100,!0,!0),this.setCorrectIndexThrottled=(0,Ya.Z)(this.setCorrectIndex.bind(this),100,!1),this.isStatic=!this.chat.isPinnedMessagesNeeded()}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;const t=this.chat.bubbles.getBubbleByPoint("bottom");if(!t)return;const i=t.dataset.mid;t&&void 0!==i&&this.testMid(+i,e)}testMid(e,t){if(this.isStatic)return;if(this.hidden)return;let i=this.mids.findIndex((t=>t<=e));if(-1===i||this.isNeededMore(i)){if(!(this.loadedTop&&ei))return;this.pinnedIndex=i,this.pinnedMid=this.mids.find((t=>t<=e))||this.mids[this.mids.length-1],this.setPinnedMessage()}}isNeededMore(e){return this.count>eo.LOAD_COUNT&&(!this.loadedBottom&&e<=eo.LOAD_OFFSET||!this.loadedTop&&this.count-1-e<=eo.LOAD_OFFSET)}getCurrentIndex(e,t=!0){return Qa(this,void 0,void 0,(function*(){if(!this.loading){this.loading=!0;try{const i=this.debug?this.log.bindPrefix("getCurrentIndex"):void 0;i&&i("start",e,t);let s=!1;const n=[this.managers.appMessagesManager.getSearch({peerId:this.chat.peerId,inputFilter:{_:"inputMessagesFilterPinned"},maxId:e,limit:eo.LOAD_COUNT,backLimit:eo.LOAD_COUNT,threadId:this.chat.threadId}).then((e=>(s=!0,e)))];if(!this.pinnedMaxMid){const e=this.managers.appMessagesManager.getPinnedMessage(this.chat.peerId,this.chat.threadId).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()))}));n.push(e)}const a=(yield Promise.all(n))[0];let o=a.history.findIndex((t=>t.mid<=e));-1===o&&(o=a.history.length),this.offsetIndex=a.offset_id_offset?a.offset_id_offset-o:0,this.mids=a.history.map((e=>e.mid)).slice(),this.count=a.count,this.count||this.pinnedMessageContainer.toggle(!0),this.loadedTop=this.offsetIndex+this.mids.length===this.count,this.loadedBottom=!this.offsetIndex,i&&i("result",e,a,o,this.offsetIndex,this.loadedTop,this.loadedBottom)}catch(e){this.log.error("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 ce.Z,function(e,t,i,s){if(c.Z){let t;const n={passive:!0};s.add(e)("touchstart",(i=>{i.touches.length>1?o():(t=i.touches[0].clientY,s.add(e)("touchmove",a,n),s.add(e)("touchend",o,n))}),n);const a=e=>{const s=e.touches[0].clientY,n=s{s.removeManual(e,"touchmove",a,n),s.removeManual(e,"touchend",o,n)}}else s.add(e)("wheel",(e=>{const t=e.deltaY>0;!t||i()}),{passive:!0})}(this.chat.bubbles.scrollable.container,0,(()=>{this.unsetScrollDownListener()}),this.scrollDownListenerSetter))}unsetScrollDownListener(e=!0){this.waitForScrollBottom=!1,this.scrollDownListenerSetter&&(this.scrollDownListenerSetter.removeAll(),this.scrollDownListenerSetter=null),e&&this.setCorrectIndex(0)}handleFollowingPinnedMessage(){return Qa(this,void 0,void 0,(function*(){this.locked=!0,this.debug&&this.log("handleFollowingPinnedMessage");try{this.setScrollDownListener();const e=this.chat.setPeerPromise;e instanceof Promise&&(yield e),yield(0,pe.e9)(),this.getCurrentIndexPromise&&(yield this.getCurrentIndexPromise),this.debug&&this.log("handleFollowingPinnedMessage: unlock"),this.locked=!1}catch(e){this.log.error("handleFollowingPinnedMessage error:",e),this.locked=!1,this.waitForScrollBottom=!1,this.setCorrectIndex(0)}}))}followPinnedMessage(e){return Qa(this,void 0,void 0,(function*(){(yield this.chat.getMessage(e))&&(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 Qa(this,void 0,void 0,(function*(){const e=this.count;if(e){const t=this.pinnedIndex,i=yield this.chat.getMessage(this.pinnedMid),s=0===t;this.animatedCounter.container.classList.toggle("is-last",s),s||this.animatedCounter.setCount(e-t),this.pinnedMessageContainer.toggle(!1);const n=t>this.wasPinnedIndex;this.debug&&this.log("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=[],d=yield Q({title:void 0,titleEl:null,subtitle:i.message,subtitleEl:a,message:i,mediaEl:o,loadPromises:r,animationGroup:this.chat.animationGroup});yield Promise.all(r),this.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-media",d),this.animatedSubtitle.animate(t,this.wasPinnedIndex),d?(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=""+i.mid}else this.pinnedMessageContainer.toggle(!0),this.wasPinnedIndex=0;this.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-many",this.count>1)}))}}eo.LOAD_COUNT=50,eo.LOAD_OFFSET=5;var to=i(6194),io=i(2995),so=i(4240),no=i(6818),ao=i(3897),oo=i(7120),ro=i(2059),lo=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class co{constructor(e,t,i){this.chat=e,this.appSidebarRight=t,this.managers=i,this.verifyButtons=e=>{const t=!!e||!(!this.btnMore||!this.btnMore.classList.contains("menu-open"));e&&(0,Ce.Z)(e),(()=>{lo(this,void 0,void 0,(function*(){const e=this.buttonsToVerify.concat(t?this.menuButtons:[]);(yield Promise.all(e.map((e=>lo(this,void 0,void 0,(function*(){return{result:yield e.verify(),button:e}})))))).forEach((({button:e,result:t})=>{e.element.classList.toggle("hide",!t)}))}))})()},this.verifyVideoChatButton=e=>lo(this,void 0,void 0,(function*(){var t;if(!no.Z||this.peerId.isUser()||"chat"!==this.chat.type||this.chat.threadId)return!1;const i=ro.ZP.groupCall,s=this.peerId.toChatId();if((null==i?void 0:i.chatId)===s)return!1;if(e&&((yield this.managers.appPeersManager.isBroadcast(this.peerId))&&"group"===e||(yield this.managers.appPeersManager.isAnyGroup(this.peerId))&&"broadcast"===e))return!1;const n=yield this.managers.appChatsManager.getChat(s);return(null===(t=n.pFlags)||void 0===t?void 0:t.call_active)||(0,oo.Z)(n,"manage_call")})),this.verifyCallButton=e=>lo(this,void 0,void 0,(function*(){if(!Oe.Z||!this.peerId.isUser())return!1;const t=this.peerId.toUserId(),i=yield this.managers.appProfileManager.getCachedFullUser(t);return!!i&&!!("voice"===e?i.pFlags.phone_calls_available:i.pFlags.video_calls_available)})),this.onJoinGroupCallClick=()=>{this.chat.appImManager.joinGroupCall(this.peerId)},this.onMuteClick=()=>{new ao.Z(this.peerId)},this.onResize=()=>{this.setUtilsWidth(!0),this.setFloating()},this.onChangeScreen=(e,t)=>{this.container.classList.toggle("is-pinned-floating",o.Z.isMobile),this.pinnedMessage&&this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-floating",t===o._.mobile),this.onResize()},this.setUtilsWidth=(e=!1)=>{this.setUtilsRAF&&window.cancelAnimationFrame(this.setUtilsRAF),x.IS_SAFARI&&e&&this.chatUtils.classList.add("hide"),this.setUtilsRAF=window.requestAnimationFrame((()=>{x.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=()=>{var e;const t=[this.chatAudio,null===(e=this.pinnedMessage)||void 0===e?void 0:e.pinnedMessageContainer].filter(Boolean).reduce(((e,t)=>{const i=t.isFloating();return this.container.classList.toggle(`is-pinned-${t.className}-floating`,i),t.isVisible()?e+ +i:e}),0);this.container.dataset.floating=""+t},this.setPeerStatusManual=(e=!1)=>lo(this,void 0,void 0,(function*(){if(!this.subtitle||"chat"!==this.chat.type)return;if(this.chat.threadId){const e=yield(0,Vt.Z)({peerId:this.peerId,dialog:!0}),t=(0,L.ag)("TopicProfileStatus",[e]);return()=>(0,H.Z)(this.subtitle,t)}const t=this.peerId;return this.chat.appImManager.setPeerStatus({peerId:t,element:this.subtitle,needClear:e,useWhitespace:!1,middleware:()=>t===this.peerId})})),this.setPeerStatus=e=>this.setPeerStatusManual(e).then((e=>{null==e||e()})),this.listenerSetter=new ce.Z,this.menuButtons=[],this.buttonsToVerify=[]}construct(){this.container=document.createElement("div"),this.container.classList.add("sidebar-header","topbar","hide"),this.container.dataset.floating="0",this.btnBack=(0,Gn.Z)("left sidebar-close-button",{noRipple:!0}),this.btnBackBadge=document.createElement("span"),this.btnBackBadge.classList.add("badge","badge-20","badge-primary","back-unread-badge"),this.btnBack.append(this.btnBackBadge),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=this.person=document.createElement("div");e.classList.add("person");const t=document.createElement("div");t.classList.add("content");const i=document.createElement("div");i.classList.add("top"),this.title=document.createElement("div"),this.title.classList.add("user-title"),i.append(this.title);const s=document.createElement("div");s.classList.add("bottom"),this.subtitle&&s.append(this.subtitle),t.append(i,s),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 Wa(this,this.chat,this.managers),this.menuButtons.length&&(this.btnMore=(0,In.Z)({listenerSetter:this.listenerSetter,direction:"bottom-left",buttons:this.menuButtons,onOpen:(e,t)=>lo(this,void 0,void 0,(function*(){const e=this.menuButtons[this.menuButtons.length-1];if(null==e?void 0:e.element){const t=yield this.managers.appPeersManager.getDeleteButtonText(this.peerId);e.element.lastChild.replaceWith((0,L.ag)(t))}}))})),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(o.Z)("changeScreen",this.onChangeScreen),(0,C.fc)(this.container,(e=>{const t=(0,be.Z)(e.target,"pinned-container");if((0,qn.Z)(),t){if((0,Ce.Z)(e),(0,be.Z)(e.target,"progress-line")||(0,be.Z)(e.target,"pinned-container-wrapper-utils"))return;const i=+t.dataset.mid;if(t.classList.contains("pinned-message"))this.pinnedMessage.followPinnedMessage(i);else{const e=t.dataset.peerId.toPeerId(),s=ya.Z.getSearchContext();this.chat.appImManager.setInnerPeer({peerId:e,lastMsgId:i,type:s.isScheduled?"scheduled":s.threadId?"discussion":void 0,threadId:s.threadId})}}else o.Z.activeScreen===o._.medium&&document.body.classList.contains(n.ir)?r():(0,ye.Z)(e.target,"AVATAR-ELEMENT")?this.appSidebarRight.toggleSidebar(!document.body.classList.contains(a.HQ)):this.appSidebarRight.toggleSidebar(!0)}),{listenerSetter:this.listenerSetter});const r=e=>{if(e&&(0,Ce.Z)(e),o.Z.activeScreen===o._.medium&&document.body.classList.contains(n.ir))this.chat.appImManager.setPeer({peerId:this.peerId});else{const e=0===this.chat.appImManager.chats.indexOf(this.chat);Un.Z.back(e?"im":"chat")}};(0,C.fc)(this.btnBack,r,{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:()=>o.Z.isMobile},{icon:"mute",text:"ChatList.Context.Mute",onClick:this.onMuteClick,verify:()=>lo(this,void 0,void 0,(function*(){return"chat"===this.chat.type&&d.Z.myId!==this.peerId&&!(yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.peerId,respectType:!1,threadId:this.chat.threadId}))}))},{icon:"unmute",text:"ChatList.Context.Unmute",onClick:()=>{this.managers.appMessagesManager.togglePeerMute({peerId:this.peerId,threadId:this.chat.threadId})},verify:()=>lo(this,void 0,void 0,(function*(){return"chat"===this.chat.type&&d.Z.myId!==this.peerId&&(yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.peerId,respectType:!1,threadId:this.chat.threadId}))}))},{icon:"comments",text:"ViewDiscussion",onClick:()=>{const e=this.chat.bubbles.getMiddleware();Promise.resolve(this.managers.appProfileManager.getChannelFull(this.peerId.toChatId())).then((t=>{e()&&t.linked_chat_id&&this.chat.appImManager.setInnerPeer({peerId:t.linked_chat_id.toPeerId(!0)})}))},verify:()=>lo(this,void 0,void 0,(function*(){const e=yield this.managers.appProfileManager.getCachedFullChat(this.peerId.toChatId());return"chat"===this.chat.type&&!!(null==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),Sn.Z.getState().then((t=>{if(t.chatContextMenuHintWasShown)return;const i=e.toggleByElement.bind(e);e.toggleByElement=t=>lo(this,void 0,void 0,(function*(){this.managers.appStateManager.pushToState("chatContextMenuHintWasShown",!0),(0,we.Am)((0,L.ag)("Chat.Menu.Hint")),e.toggleByElement=i,e.toggleByElement(t)}))}))},verify:()=>!this.chat.selection.isSelecting&&!!this.chat.bubbles.getRenderedLength()},{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(so.Z)){const e=this.appSidebarRight.createTab(so.Z);e.peerId=this.peerId,e.open(),this.appSidebarRight.toggleSidebar(!0)}},verify:()=>lo(this,void 0,void 0,(function*(){return this.peerId.isUser()&&!(yield this.managers.appPeersManager.isContact(this.peerId))}))},{icon:"forward",text:"ShareContact",onClick:()=>{const e=this.peerId;new io.Z({peerTypes:["dialogs","contacts"],onSelect:t=>new Promise(((i,s)=>{new xs.Z("",{titleLangKey:"SendMessageTitle",descriptionLangKey:"SendContactToGroupText",descriptionLangArgs:[new N.Z({peerId:t,dialog:!0}).element],buttons:[{langKey:"Send",callback:()=>{i(),this.managers.appMessagesManager.sendContact(t,e),this.chat.appImManager.setInnerPeer({peerId:t})}},{langKey:"Cancel",callback:()=>{s()},isCancel:!0}],peerId:t,overlayClosable:!0}).show()})),placeholder:"ShareModal.Search.Placeholder",chatRightsAction:"send_messages",selfPresence:"ChatYourSelf"})},verify:()=>lo(this,void 0,void 0,(function*(){return d.Z.myId!==this.peerId&&this.peerId.isUser()&&(yield this.managers.appPeersManager.isContact(this.peerId))&&!!(yield this.managers.appUsersManager.getUser(this.peerId.toUserId())).phone}))},{icon:"bots",text:"Settings",onClick:()=>{this.managers.appMessagesManager.sendText(this.peerId,"/settings")},verify:()=>lo(this,void 0,void 0,(function*(){var e;try{const t=yield this.managers.appAttachMenuBotsManager.getAttachMenuBot(this.peerId.toUserId());return!!(null===(e=null==t?void 0:t.pFlags)||void 0===e?void 0:e.has_settings)}catch(e){return!1}}))},{icon:"lock",text:"BlockUser",onClick:()=>{new xs.Z("",{peerId:this.peerId,titleLangKey:"BlockUser",descriptionLangKey:"AreYouSureBlockContact2",descriptionLangArgs:[new N.Z({peerId:this.peerId}).element],buttons:[{langKey:"BlockUser",isDanger:!0,callback:()=>{this.managers.appUsersManager.toggleBlock(this.peerId,!0).then((e=>{e&&(0,we.bC)({langPackKey:"UserBlocked"})}))}}]}).show()},verify:()=>lo(this,void 0,void 0,(function*(){var e;if(!this.peerId.isUser())return!1;const t=yield this.managers.appProfileManager.getCachedFullUser(this.peerId.toUserId());return this.peerId!==d.Z.myId&&t&&!(null===(e=t.pFlags)||void 0===e?void 0:e.blocked)}))},{icon:"lockoff",text:"Unblock",onClick:()=>{this.managers.appUsersManager.toggleBlock(this.peerId,!1).then((e=>{e&&(0,we.bC)({langPackKey:"UserUnblocked"})}))},verify:()=>lo(this,void 0,void 0,(function*(){var e;const t=yield this.managers.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 to.Z(this.peerId)},verify:()=>lo(this,void 0,void 0,(function*(){return"chat"===this.chat.type&&!!(yield this.managers.appMessagesManager.getDialogOnly(this.peerId))}))}],this.btnSearch=(0,Gn.Z)("search"),this.attachClickEvent(this.btnSearch,(e=>{this.chat.initSearch()}),!0)}attachClickEvent(e,t,i){(0,C.fc)(e,(e=>{(0,Ce.Z)(e),!i&&(0,qn.Z)(),t(e)}),{listenerSetter:this.listenerSetter})}onCallClick(e){this.chat.appImManager.callUser(this.peerId.toUserId(),e)}constructAvatar(){const e=new f.Z;return e.isDialog=!0,e.classList.add("avatar-42","person-avatar"),e}get peerId(){return this.chat.peerId}constructPeerHelpers(){return this.avatarElement=this.constructAvatar(),this.subtitle=document.createElement("div"),this.subtitle.classList.add("info"),this.pinnedMessage=new eo(this,this.chat,this.managers),this.btnJoin=(0,Ue.Z)("btn-primary btn-color-primary chat-join hide"),this.btnCall=(0,Gn.Z)("phone"),this.btnGroupCall=(0,Gn.Z)("videochat"),this.btnPinned=(0,Gn.Z)("pinlist"),this.btnMute=(0,Gn.Z)("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.onMuteClick),this.attachClickEvent(this.btnJoin,(()=>lo(this,void 0,void 0,(function*(){const e=this.chat.bubbles.getMiddleware();this.btnJoin.setAttribute("disabled","true");const t=this.peerId.toChatId();let i;i=(yield this.managers.appChatsManager.isChannel(t))?this.managers.appChatsManager.joinChannel(t):this.managers.appChatsManager.addChatUser(t,d.Z.myId),i.finally((()=>{e()&&this.btnJoin.removeAttribute("disabled")}))})))),this.listenerSetter.add(d.Z)("folder_unread",(e=>{if(e.id!==m.J$)return;const t=e.unreadUnmutedPeerIds.size;this.btnBackBadge.textContent=t?""+(0,D.Z)(t,1):""})),this.listenerSetter.add(d.Z)("chat_update",(e=>lo(this,void 0,void 0,(function*(){var t;if(this.peerId===e.toPeerId(!0)){const i=yield this.managers.appChatsManager.getChat(e);this.btnJoin.classList.toggle("hide",!(null===(t=null==i?void 0:i.pFlags)||void 0===t?void 0:t.left)),this.setUtilsWidth(),this.verifyButtons()}})))),this.listenerSetter.add(d.Z)("dialog_notify_settings",(e=>{e.peerId===this.peerId&&this.setMutedState()})),this.listenerSetter.add(d.Z)("peer_typings",(({peerId:e})=>{this.peerId===e&&this.setPeerStatus()})),this.listenerSetter.add(d.Z)("user_update",(e=>{this.peerId===e.toPeerId()&&this.setPeerStatus()})),this.listenerSetter.add(d.Z)("peer_full_update",(e=>{this.peerId===e&&this.verifyButtons()})),this.chat.addEventListener("setPeer",((e,t)=>{const i=this.chat.bubbles.getMiddleware();Sn.Z.getState().then((s=>{i()&&this.pinnedMessage&&(this.pinnedMessage.hidden=!!s.hiddenPinnedMessages[this.chat.peerId],t?(this.pinnedMessage.unsetScrollDownListener(),this.pinnedMessage.testMid(e,0)):this.pinnedMessage.locked||(this.pinnedMessage.handleFollowingPinnedMessage(),this.pinnedMessage.testMid(e)))}))})),this.listenerSetter.add(d.Z)("peer_pinned_messages",(({peerId:e,mids:t})=>{"pinned"===this.chat.type&&e===this.peerId&&t&&this.setTitle()})),this.setPeerStatusInterval=window.setInterval(this.setPeerStatus,6e4),this}openPinned(e){this.chat.appImManager.setInnerPeer({peerId:this.peerId,lastMsgId:e?+this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.dataset.mid:0,type:"pinned"})}destroy(){var e,t;this.listenerSetter.removeAll(),window.clearInterval(this.setPeerStatusInterval),null===(e=this.pinnedMessage)||void 0===e||e.destroy(),null===(t=this.chatAudio)||void 0===t||t.destroy(),delete this.chatAudio,delete this.pinnedMessage}cleanup(){this.chat.peerId||this.container.classList.add("hide")}finishPeerChange(e){var t;return lo(this,void 0,void 0,(function*(){const{peerId:e,threadId:i}=this.chat;let s;"chat"===this.chat.type&&(s=(null===(t=this.avatarElement)||void 0===t?void 0:t.peerId)!==this.peerId||this.avatarElement.threadId!==this.chat.threadId?this.constructAvatar():this.avatarElement);const[n,a,o,r,d,l,c]=yield Promise.all([this.managers.appPeersManager.isBroadcast(e),this.managers.appPeersManager.isAnyChat(e),e.isAnyChat()?this.managers.appChatsManager.getChat(e.toChatId()):void 0,s?s.updateWithOptions({peerId:e,threadId:i,wrapOptions:{customEmojiSize:(0,qe.C)(32,32)}}):void 0,this.setTitleManual(),this.setPeerStatusManual(!0),Sn.Z.getState()]);return()=>{var t,i;const r=!("pinned"===this.chat.type||"scheduled"===this.chat.type);this.btnMute&&this.btnMute.classList.toggle("hide",!n||!r),this.btnJoin&&(a&&!this.chat.isRestricted&&r?((0,H.Z)(this.btnJoin,(0,L.ag)(n?"Chat.Subscribe":"ChannelJoin")),this.btnJoin.classList.toggle("hide",!(null===(t=null==o?void 0:o.pFlags)||void 0===t?void 0:t.left))):this.btnJoin.classList.add("hide")),this.btnSearch&&this.btnSearch.classList.toggle("hide",!r),this.btnPinned&&this.btnPinned.classList.toggle("hide",!r),this.avatarElement!==s&&(s&&(this.avatarElement?this.avatarElement.replaceWith(s):this.person.prepend(s)),null===(i=this.avatarElement)||void 0===i||i.remove(),this.avatarElement=s),this.setUtilsWidth(),this.verifyButtons(),this.btnMore&&this.btnMore.classList.toggle("hide",!r);const h=this.chat.isPinnedMessagesNeeded();if(h||"discussion"===this.chat.type){if(this.chat.wasAlreadyUsed||!this.pinnedMessage){const e=new eo(this,this.chat,this.managers);this.pinnedMessage?(this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.replaceWith(e.pinnedMessageContainer.divAndCaption.container),this.pinnedMessage.destroy()):this.chatUtils.prepend(this.pinnedMessage.pinnedMessageContainer.divAndCaption.container),this.pinnedMessage=e}h?this.pinnedMessage.hidden=!!c.hiddenPinnedMessages[e]:"discussion"===this.chat.type&&(this.pinnedMessage.pinnedMid=this.chat.threadId,this.pinnedMessage.count=1,this.pinnedMessage.pinnedIndex=0,this.pinnedMessage._setPinnedMessage())}else this.pinnedMessage&&(this.pinnedMessage.destroy(),this.pinnedMessage=void 0);d(),null==l||l(),this.subtitle.classList.toggle("hide",!l),this.setMutedState(),this.container.classList.remove("hide")}}))}setTitleManual(e){return lo(this,void 0,void 0,(function*(){const{peerId:t,threadId:i}=this.chat,s=()=>this.chat.bubbles.getMiddleware();let n;if("pinned"===this.chat.type)n=void 0===e?(0,L.ag)("Loading"):(0,L.ag)("PinnedMessagesCount",[e]),void 0===e&&this.managers.appMessagesManager.getSearchCounters(t,[{_:"inputMessagesFilterPinned"}],!1).then((e=>{if(!s())return;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)}}));else if("scheduled"===this.chat.type)n=(0,L.ag)(t===d.Z.myId?"Reminders":"ScheduledMessages");else if("discussion"===this.chat.type){if(void 0===e){const n=yield this.managers.acknowledged.appMessagesManager.getHistory(t,0,1,0,i);if(!s())return;if(n.cached){const t=yield n.result;if(!s())return;e=t.count}else n.result.then((e=>{s()&&this.setTitle(e.count)}))}n=void 0===e?(0,L.ag)("Loading"):(0,L.ag)("Chat.Title.Comments",[e])}else if("chat"===this.chat.type&&([n]=yield Promise.all([(0,Vt.Z)({peerId:t,dialog:!0,withIcons:!i,threadId:i})]),!s()))return;return()=>{(0,H.Z)(this.title,n)}}))}setTitle(e){this.setTitleManual(e).then((e=>e()))}setMutedState(){return lo(this,void 0,void 0,(function*(){if(!this.btnMute)return;const e=this.peerId,t=yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:e,respectType:!1,threadId:this.chat.threadId});(yield this.managers.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"}))}}var ho=i(5884),uo=i(3607);class po extends Xi._{constructor(){super(...arguments),this.threadId=0,this.query=""}onOpenAfterTimeout(){this.appSearch.beginSearch(this.peerId,this.threadId,this.query)}init(e,t,i,s){this.container.id="search-private-container",this.container.classList.add("chatlist-container"),this.inputSearch=new uo.Z("Search"),this.title.replaceWith(this.inputSearch.container),this.btnPickDate=(0,Gn.Z)("calendar sidebar-header-right"),this.header.append(this.btnPickDate);const n=document.createElement("div");n.classList.add("chatlist-container"),this.scrollable.container.replaceWith(n),this.appSearch=new ho.Z(n,this.inputSearch,{messages:new ho.z("Chat.Search.PrivateSearch","messages")}),this.peerId?this.appSearch.beginSearch(this.peerId,this.threadId,s):(this.query=s,this.peerId=e,this.threadId=t,this.onDatePick=i,this.btnPickDate.classList.toggle("hide",!this.onDatePick),this.onDatePick&&(0,C.fc)(this.btnPickDate,(()=>{S.Z.createPopup(I,new Date,this.onDatePick).show()})),s&&this.appSearch.searchInput.inputField.setValueSilently(s),a.ZP.toggleSidebar(!0))}}class fo{constructor(e,t,i){this.topbar=e,this.chat=t,this.foundCount=0,this.selectedIndex=0,this.onDateClick=e=>{(0,Ce.Z)(e),S.Z.createPopup(I,new Date,this.chat.bubbles.onDatePick).show()},this.onResultsClick=e=>{const t=(0,ye.Z)(e.target,Ji.DIALOG_LIST_ELEMENT_TAG);t&&this.selectResult(t)},this.onFooterClick=e=>{this.foundCount&&(this.chat.bubbles.container.classList.toggle("search-results-active"),this.results.classList.toggle("active"))},this.onUpClick=e=>{(0,Ce.Z)(e),this.selectResult(this.searchGroup.list.children[this.selectedIndex+1])},this.onDownClick=e=>{(0,Ce.Z)(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"),(0,A.Z)(this.backBtn);const s=this.listenerSetter=new ce.Z,n=(e,t)=>{(0,C.fc)(e,t,{listenerSetter:s})};n(this.backBtn,(()=>{this.destroy()})),this.inputSearch=new uo.Z("Search"),this.results=document.createElement("div"),this.results.classList.add("chat-search-results","chatlist-container"),this.searchGroup=new ho.z(!1,"messages",void 0,"",!1),n(this.searchGroup.list,this.onResultsClick),this.appSearch=new ho.Z(this.results,this.inputSearch,{messages:this.searchGroup},(e=>{this.foundCount=e,this.foundCount?this.selectResult(this.searchGroup.list.children[0]):((0,H.Z)(this.foundCountEl,this.inputSearch.value?(0,L.ag)("NoResult"):""),this.results.classList.remove("active"),this.chat.bubbles.container.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.container.append(this.results),this.footer=document.createElement("div"),this.footer.classList.add("chat-search-footer"),n(this.footer,this.onFooterClick),(0,A.Z)(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(),i&&this.setQuery(i),x.IS_MOBILE_SAFARI||(this.navigationItem={type:"mobile-search",onPop:()=>{this.destroy()}},Un.Z.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.container.classList.remove("search-results-active"),this.chat.search=void 0,Un.Z.removeItem(this.navigationItem)}setQuery(e){this.inputSearch.inputField.value=e}selectResult(e){if(this.setPeerPromise)return this.setPeerPromise;const t=e.dataset.peerId.toPeerId(),i=+e.dataset.mid||void 0,s=(0,Ie.Z)(e);s===this.foundCount-1?this.upBtn.setAttribute("disabled","true"):this.upBtn.removeAttribute("disabled"),s?this.downBtn.removeAttribute("disabled"):this.downBtn.setAttribute("disabled","true"),this.results.classList.remove("active"),this.chat.bubbles.container.classList.remove("search-results-active");const n=this.chat.setPeer({peerId:t,lastMsgId:i});this.setPeerPromise=(n instanceof Promise?n:Promise.resolve(n)).then((()=>{this.selectedIndex=s,(0,H.Z)(this.foundCountEl,(0,L.ag)("Of",[s+1,this.foundCount]));const e=this.searchGroup.list.childElementCount;this.selectedIndex>=e-6&&this.appSearch.searchMore()})).finally((()=>{this.setPeerPromise=null}))}}var mo=i(1571),go=i(6848),vo=i(356);class bo{constructor(){this.canvases=new Set}static getInstance(e){let t=this.INSTANCES.find((t=>(0,go.Z)(t.options,e)));return t||(t=new bo,t.init(e),this.INSTANCES.push(t)),t}init(e){this.options=e}renderToCanvas(e){return this.renderImageFromUrl(this.options.url).then((()=>this.fillCanvas(e)))}renderImageFromUrl(e){if(this.renderImageFromUrlPromise)return this.renderImageFromUrlPromise;const t=this.image=document.createElement("img");return t.crossOrigin="anonymous",this.renderImageFromUrlPromise=(0,Ot.cj)(t,e,!1).then((()=>vo.Z?createImageBitmap(t,{resizeWidth:1440,resizeHeight:2960}).then((e=>(this.imageBitmap=e,t))):t))}cleanup(e){var t;this.canvases.delete(e),this.canvases.size||((0,h.Z)(bo.INSTANCES,this),this.objectUrl&&(null===(t=this.imageBitmap)||void 0===t||t.close(),URL.revokeObjectURL(this.objectUrl)))}fillCanvas(e){const t=e.getContext("2d"),{width:i,height:s}=e,n=this.imageBitmap||this.image;let a=n.width,o=n.height;const r=(500+xe.Z.height/2.5)*e.dpr;a*=r/o,o=r,this.options.mask?(t.fillStyle="#000",t.fillRect(0,0,i,s),t.globalCompositeOperation="destination-out"):t.globalCompositeOperation="source-over";const d=e=>{for(let s=0;s0){let e=l;do{d(e-=o)}while(e>=0)}const c=s-1;for(let e=l+o;ei.resize(e,t))))}}bo.INSTANCES=[];var yo=i(6714),wo=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class So extends l.Z{constructor(e,t){super(),this.appImManager=e,this.managers=t,this.type="chat",this.animationGroup=`chat-${Math.round(65535*Math.random())}`,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=(0,r.kg)("CHAT",r.v9.Log|r.v9.Warn|r.v9.Debug|r.v9.Error),this.log.warn("constructor"),this.peerId=m.NM,this.container.append(this.backgroundEl),this.appImManager.chatsContainer.append(this.container),this.backgroundTempId=0,this.sharedMediaTabs=[]}setBackground(e,t){var i;const s=yo.Z.getTheme().settings.wallpaper,n=(0,O.EM)(s);let a;if(n&&!s.slug&&!s.settings.intensity&&"grabbing"===document.documentElement.style.cursor&&this.gradientRenderer&&!this.patternRenderer)return this.gradientCanvas.dataset.colors=n,this.gradientRenderer.init(this.gradientCanvas),Promise.resolve();const o=++this.backgroundTempId,r=this.gradientRenderer,l=this.patternRenderer,c=(this.gradientCanvas,this.patternCanvas);this.gradientRenderer=this.patternRenderer=this.gradientCanvas=this.patternCanvas=void 0;const h=(null===(i=s.settings)||void 0===i?void 0:i.intensity)&&s.settings.intensity/100,u=!!h&&h<0;let p,f,m,g=null==a?void 0:a.firstElementChild;if(!a)if(a=document.createElement("div"),a.classList.add("chat-background-item"),e)if(h){a.classList.add("is-pattern");const t=this.appImManager.chatsContainer.getBoundingClientRect();p=this.patternRenderer=bo.getInstance({url:e,width:t.width,height:t.height,mask:u}),g=this.patternCanvas=p.createCanvas(),g.classList.add("chat-background-item-canvas","chat-background-item-pattern-canvas"),u&&a.classList.add("is-dark")}else a.classList.add("is-image");else a.classList.add("is-color");if(n){const{canvas:e,gradientRenderer:t}=mo.Z.create(n);m=this.gradientRenderer=t,f=this.gradientCanvas=e,f.classList.add("chat-background-item-canvas","chat-background-item-color-canvas"),d.Z.settings.animationsEnabled&&m.scrollAnimate(!0)}if(p){const e=u?f:g;let t=Math.abs(h)*(u?.5:1);u&&(t=Math.max(.3,t)),e.style.setProperty("--opacity-max",""+t)}const v=new Promise((i=>{const s=()=>{if(this.backgroundTempId!==o)return p&&p.cleanup(g),void(m&&m.cleanup());const e=this.backgroundEl.lastElementChild;if(e===a)return void i();const s=[f,g].filter(Boolean);s.length&&a.append(...s),this.backgroundEl.append(a),(0,Fe.Z)({element:a,className:"is-visible",forwards:!0,duration:t?0:200,onTransitionEnd:e?()=>{null==l||l.cleanup(c),null==r||r.cleanup(),e.remove()}:null,useRafs:2}),i()};p?p.renderToCanvas(g).then((()=>{this.backgroundTempId===o&&s()})):e?(0,Ot.ZP)(a,e,s):s()}));return this.setBackgroundPromise=Promise.race([(0,nt.Z)(500),v])}setType(e){this.type=e}init(){this.topbar=new co(this,a.ZP,this.managers),this.bubbles=new Ps(this,this.managers),this.input=new Ua(this,this.appImManager,this.managers),this.contextMenu=new an(this,this.managers),this.selection=new Ha.Z(this,this.bubbles,this.input,this.managers),this.topbar.constructUtils(),this.topbar.constructPeerHelpers(),this.topbar.construct(),this.input.construct(),this.bubbles.constructPeerHelpers(),this.input.constructPeerHelpers(),c.Z||this.bubbles.setReactionsHoverListeners(),this.bubbles.attachContainerListeners(),this.container.append(this.topbar.container,this.bubbles.container,this.input.chatInput),this.bubbles.listenerSetter.add(d.Z)("dialog_migrate",(({migrateFrom:e,migrateTo:t})=>{this.peerId===e&&this.setPeer({peerId:t})})),this.bubbles.listenerSetter.add(d.Z)("dialog_drop",(e=>{e.peerId!==this.peerId||"dialog"!==e._&&this.threadId!==e.id||this.appImManager.setPeer()})),this.bubbles.listenerSetter.add(d.Z)("chat_update",(e=>wo(this,void 0,void 0,(function*(){const{peerId:t}=this;if(t.isAnyChat()&&t.toChatId()===e){const e=yield this.managers.appMessagesManager.isAnonymousSending(t);t===this.peerId&&(this.isAnonymousSending=e)}}))));const e=e=>{const t=()=>{var t;null===(t=this.bubbles.observer)||void 0===t||t.toggleObservingNew(e),s.Z.toggleIntersectionGroup(this.animationGroup,e),e&&s.Z.checkAnimations(e,this.animationGroup)};e?t():setTimeout((()=>{t()}),400)};this.bubbles.listenerSetter.add(this.appImManager)("chat_changing",(({to:t})=>{e(t!==this)})),this.bubbles.listenerSetter.add(this.appImManager)("tab_changing",(t=>{e(this.appImManager.chat!==this||t!==Qr.CHAT&&o.Z.activeScreen===o._.mobile)}))}beforeDestroy(){this.bubbles.cleanup()}cleanupBackground(){++this.backgroundTempId,this.patternRenderer&&(this.patternRenderer.cleanup(this.patternCanvas),this.patternRenderer=void 0),this.gradientRenderer&&(this.gradientRenderer.cleanup(),this.gradientRenderer=void 0)}destroy(){this.destroySharedMediaTab(),this.topbar.destroy(),this.bubbles.destroy(),this.input.destroy(),this.contextMenu&&this.contextMenu.destroy(),this.selection&&this.selection.attachListeners(void 0,void 0),this.cleanupBackground(),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.topbar.cleanup(),this.selection.cleanup()}get isForumTopic(){return!(!this.isForum||!this.threadId)}onChangePeer(e,t){var i;return wo(this,void 0,void 0,(function*(){const{peerId:s,threadId:n}=this,o=a.ZP.getTab(po);null==o||o.close();const[r,d,l,c,h,u,p,f,m,g]=yield t(Promise.all([this.managers.appPeersManager.noForwards(s),this.managers.appPeersManager.isPeerRestricted(s),this._isAnyGroup(s),this.setAutoDownloadMedia(),this.managers.appPeersManager.isMegagroup(s),this.managers.appPeersManager.isBroadcast(s),this.managers.appPeersManager.isChannel(s),this.managers.appPeersManager.isBot(s),this.managers.appPeersManager.isForum(s),this.managers.appMessagesManager.isAnonymousSending(s)]));m&&n&&(yield t(this.managers.dialogsStorage.getForumTopicOrReload(s,n))),this.noForwards=r,this.isRestricted=d,this.isAnyGroup=l,this.isMegagroup=h,this.isBroadcast=u,this.isChannel=p,this.isBot=f,this.isForum=m,this.isAllMessagesForum=m&&!n,this.isAnonymousSending=g,n&&!this.isForum&&(e.type="discussion");const v=null!==(i=e.type)&&void 0!==i?i:"chat";this.setType(v),this.messagesStorageKey=`${this.peerId}_${"scheduled"===this.type?"scheduled":"history"}`,this.container.classList.toggle("no-forwards",this.noForwards),this.sharedMediaTab=a.ZP.createSharedMediaTab(),this.sharedMediaTabs.push(this.sharedMediaTab),this.sharedMediaTab.setPeer(s,n),this.input.clearHelper(),this.selection.cleanup()}))}setPeer(e){const{peerId:t,threadId:i}=e;t?this.inited||(this.init&&(this.init(),this.init=null),this.inited=!0):this.inited=void 0;const s=this.appImManager.isSamePeer(this,e);if(s){if(this.setPeerPromise)return}else this.appImManager.dispatchEvent("peer_changing",this),this.peerId=t||m.NM,this.threadId=i;if(!t)return a.ZP.toggleSidebar(!1),this.cleanup(!0),this.bubbles.setPeer({samePeer:!1,peerId:t}),this.peerId=0,this.appImManager.dispatchEvent("peer_changed",this),a.ZP.replaceSharedMediaTab(),this.destroySharedMediaTab(),void(this.sharedMediaTab=void 0);this.peerChanged=s;const n=this.bubbles.setPeer(Object.assign(Object.assign({},e),{samePeer:s})),o=this.setPeerPromise=n.then((e=>e.promise)).catch(Ye.Z).finally((()=>{this.setPeerPromise===o&&(this.setPeerPromise=null)}));return n}destroySharedMediaTab(e=this.sharedMediaTab){e&&((0,h.Z)(this.sharedMediaTabs,e),e.destroy())}setAutoDownloadMedia(){return wo(this,void 0,void 0,(function*(){this.autoDownload=yield function(e){return t=this,i=void 0,n=function*(){let t,i=0,s=0,n=0;const a=d.Z.settings,o=d.Z.managers.appPeersManager;return!a.autoDownloadNew.pFlags.disabled&&e&&(t=e.isUser()?(yield o.isContact(e))?"contacts":"private":(yield o.isBroadcast(e))?"channels":"groups",a.autoDownload.photo[t]&&(i=a.autoDownloadNew.photo_size_max),a.autoDownload.video[t]&&(s=a.autoDownloadNew.video_size_max),a.autoDownload.file[t]&&(n=a.autoDownloadNew.file_size_max)),{photo:i,video:s,file:n}},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}(this.peerId)}))}setMessageId(e){return this.setPeer({peerId:this.peerId,threadId:this.threadId,lastMsgId:e})}finishPeerChange(e,t,i,s){return wo(this,void 0,void 0,(function*(){if(this.peerChanged)return;const t=this.peerId;this.peerChanged=!0,this.wasAlreadyUsed=!0;const i=this.bubbles.getMiddleware();this.cleanup(!1);const n=this.sharedMediaTab,o=Promise.all([this.topbar.finishPeerChange(e),this.bubbles.finishPeerChange(),this.input.finishPeerChange(s),n.fillProfileElements()]),r=yield o;n.loadSidebarMedia(!0),i()&&(r.forEach((e=>{null==e||e()})),a.ZP.replaceSharedMediaTab(n),this.sharedMediaTabs.filter((e=>e!==n)).forEach((e=>this.destroySharedMediaTab(e))),this.container.dataset.type=this.type,this.log.setPrefix("CHAT-"+t+"-"+this.type),this.appImManager.dispatchEvent("peer_changed",this))}))}getMessage(e){return this.managers.appMessagesManager.getMessageFromStorage(this.messagesStorageKey,e)}getMidsByMid(e){return wo(this,void 0,void 0,(function*(){return this.managers.appMessagesManager.getMidsByMessage(yield this.getMessage(e))}))}getHistoryStorage(e){return this.managers.appMessagesManager.getHistoryStorageTransferable(this.peerId,e?void 0:this.threadId).then((e=>Object.assign(Object.assign({},e),{history:ve.Z.fromJSON(e.historySerialized)})))}getDialogOrTopic(){return this.isForum&&this.threadId?this.managers.dialogsStorage.getForumTopic(this.peerId,this.threadId):this.managers.dialogsStorage.getDialogOnly(this.peerId)}getHistoryMaxId(){return this.getHistoryStorage().then((e=>e.maxId))}_isAnyGroup(e){return wo(this,void 0,void 0,(function*(){return e===d.Z.myId||e===m.hj||(yield this.managers.appPeersManager.isAnyGroup(e))}))}initSearch(e){if(this.peerId)if(o.Z.isMobile)this.search?this.search.setQuery(e):this.search=new fo(this.topbar,this,e);else{let t=a.ZP.getTab(po);t||(t=a.ZP.createTab(po)),t.open(this.peerId,this.threadId,this.bubbles.onDatePick,e)}}canSend(e){return this.managers.appMessagesManager.canSendToPeer(this.peerId,this.threadId,e)}isStartButtonNeeded(){return Promise.all([this.managers.appPeersManager.isBot(this.peerId),this.managers.appMessagesManager.getDialogOnly(this.peerId),this.getHistoryStorage(!0)]).then((([e,t,i])=>e&&!t&&!i.history.length))}getMessageSendingParams(){return{threadId:this.threadId,replyToMsgId:this.input.replyToMsgId,scheduleDate:this.input.scheduleDate,silent:this.input.sendSilent,sendAsPeerId:this.input.sendAsPeerId}}isOurMessage(e){return e.fromId===d.Z.myId||!!e.pFlags.out&&this.isMegagroup}isOutMessage(e){const t=e.fwd_from;return!(!this.isOurMessage(e)||t&&this.peerId===d.Z.myId)}isAvatarNeeded(e){return this.isAnyGroup&&!this.isOutMessage(e)}isPinnedMessagesNeeded(){return"chat"===this.type||this.isForum}}var Co=i(2342),Lo=i(6637);class Eo{constructor(e){this.appImManager=e,this.buttons={},this.addedListener=!1,this.waitingForMouseUp=!1,this.mouseUpCounter=0,this.onMouseUpSingle=e=>{if(this.waitingForMouseUp=!1,c.Z){if(e&&(0,Ce.Z)(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","spoiler","link"].forEach((t=>{const i=(0,Gn.Z)(t,{noRipple:!0});e.append(this.buttons[t]=i),"link"!==t?i.addEventListener("mousedown",(e=>{(0,Ce.Z)(e),this.appImManager.chat.input.applyMarkdown(t),this.cancelClosening()})):(0,C.fc)(i,(e=>{(0,Ce.Z)(e),this.showLinkEditor(),this.cancelClosening()}))})),this.linkBackButton=(0,Gn.Z)("left",{noRipple:!0}),this.linkInput=document.createElement("input"),(0,L.$d)(this.linkInput,"MarkupTooltip.LinkPlaceholder",void 0,"placeholder"),this.linkInput.classList.add("input-clear"),this.linkInput.addEventListener("keydown",(e=>{const t=!this.linkInput.value.length||!!(0,Co.Z)(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=>{(0,Ce.Z)(e),this.container.classList.remove("is-link"),this.resetSelection(),this.setTooltipPosition(),this.cancelClosening()})),this.linkApplyButton=(0,Gn.Z)("check markup-tooltip-link-apply",{noRipple:!0}),this.linkApplyButton.addEventListener("mousedown",(e=>{this.applyLink(e)}));const i=document.createElement("div");i.classList.add("markup-tooltip-link-apply-container");const s=document.createElement("span"),n=document.createElement("span"),a=document.createElement("span");s.classList.add("markup-tooltip-delimiter"),n.classList.add("markup-tooltip-delimiter"),a.classList.add("markup-tooltip-delimiter"),e.insertBefore(s,this.buttons.link),i.append(a,this.linkApplyButton),t.append(this.linkBackButton,n,this.linkInput,i),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){(0,Ce.Z)(e),this.resetSelection();let t=this.linkInput.value;t&&!(0,Lo.Z)(t)&&(t="https://"+t),this.appImManager.chat.input.applyMarkdown("link",t),setTimeout((()=>{this.hide()}),0)}isLinkValid(){return!this.linkInput.value.length||!!(0,Co.Z)(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,Un.Z.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=new Set,t=Object.keys(this.buttons),i=Fa(t);return t.forEach((t=>{i[t]&&e.add(this.buttons[t])})),[...e]}setActiveMarkupButton(){const e=this.getActiveMarkupButton();for(const t in this.buttons){const i=this.buttons[t];i.classList.toggle("active",e.includes(i))}}setTooltipPosition(e=!1){const t=document.getSelection().getRangeAt(0),i=document.body.getBoundingClientRect(),s=t.getBoundingClientRect(),n=this.appImManager.chat.input.rowsWrapper.getBoundingClientRect();this.container.style.maxWidth=n.width+"px";const a=(0,He.Z)(void 0,this.appImManager.chat.input.messageInput,!1,s).rect.top+-1*i.top,o=(this.container.classList.contains("is-link")?this.wrapper.lastElementChild:this.wrapper.firstElementChild).getBoundingClientRect(),r=a-o.height-8,d=n.left,l=n.left+n.width-Math.min(n.width,o.width);let c;if(e){const e=this.container.getBoundingClientRect();c=(0,Gi.Z)(e.left,d,l)}else{const e=s.left+(s.width-o.width)/2;c=(0,Gi.Z)(e,d,l)}this.container.style.transform=`translate3d(${c}px, ${r}px, 0)`}show(){if(this.init&&(this.init(),this.init=null),Fs())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"),x.IS_MOBILE||Un.Z.pushItem({type:"markup",onPop:()=>{this.hide()}})}setMouseUpEvent(){this.waitingForMouseUp||(this.waitingForMouseUp=!0,document.addEventListener("mouseup",this.onMouseUpSingle,{once:!0}))}cancelClosening(){c.Z&&!x.IS_APPLE&&(document.removeEventListener("mouseup",this.onMouseUpSingle),document.addEventListener("mouseup",(e=>{(0,Ce.Z)(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;const t=this.appImManager.chat.input.messageInput;if(document.activeElement!==t)return void this.hide();const i=document.getSelection();if(Fs(i))this.hide();else if(c.Z)if(x.IS_APPLE)this.show(),this.setTooltipPosition();else{if(2===this.mouseUpCounter)return void(this.mouseUpCounter=0);this.savedRange=i.getRangeAt(0),this.setMouseUpEvent()}else this.container&&this.container.classList.contains("is-visible")?(this.setActiveMarkupButton(),this.setTooltipPosition()):t.matches(":active")?this.setMouseUpEvent():this.show()})),document.addEventListener("beforeinput",(e=>{"historyRedo"!==e.inputType&&"historyUndo"!==e.inputType||e.target.addEventListener("input",(()=>this.setActiveMarkupButton()),{once:!0})})))}}var Io=i(9171);class Mo{constructor(e,t){let i;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&&(i=document.createElement("div"),i.classList.add("drop-icon","tgico-"+t.icon));const s=document.createElement("div");let n;s.classList.add("drop-header"),s.append((0,L.ag)(t.header,t.headerArgs)),t.subtitle&&(n=document.createElement("div"),n.classList.add("drop-subtitle"),n.append((0,L.ag)(t.subtitle))),this.svg.append(this.path),this.outlineWrapper.append(this.svg),this.container.append(...[this.outlineWrapper,i,s,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=10,i=e.width-t,s=e.height-t,n=(0,Io.Z)(5,5,i,s,t,t,t,t);this.path.setAttributeNS(null,"d",n)}}var Po=i(7922);function Zo(e){e.forEach((e=>e.classList.add("no-transition"))),(0,fe.d1)().then((()=>{e.forEach((e=>e.classList.remove("no-transition")))}))}var To=i(490),ko=i(2831),xo=i(2207);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:i,minRadius:s,speed:n}=this,a=i-s;e[t]=s+Math.random()*a,n[t]=.017+.003*Math.random()}generateNextBlob(){const{radius:e,radiusNext:t,progress:i,N:s}=this;for(let n=0;n=1&&(s[r]=0,a[r]=o[r],this.generateBlob(o,r))}draw(e,t,i,s,n,a,o,r){if(n.getContext){const d=n.getContext("2d");d.beginPath(),d.moveTo(i,s),d.lineTo(e,s);const{radius:l,radiusNext:c,N:h}=this;for(let n=0;n<=h;n++)if(0===n){const i=this.progress[n],s=(t-(l[n]*(1-i)+c[n]*i))*r+o*(1-r);d.lineTo(e,s)}else{const a=this.progress[n-1],u=l[n-1]*(1-a)+c[n-1]*a,p=this.progress[n],f=(i-e)/h*(n-1),m=(i-e)/h*n,g=f+(m-f)/2,v=(t-u)*r+o*(1-r),b=(t-(l[n]*(1-p)+c[n]*p))*r+o*(1-r);d.bezierCurveTo(g,v,g,b,m,b),n===h&&d.lineTo(i,s)}a(d),d.fill(),d.closePath()}}}class _o{constructor(e){this.stateId=e,this.createGradient(e)}createGradient(e){this.shader=(t,i,s,n,a)=>{t.fillStyle=_o.getGradientFromType(t,e,i,s,n,a)}}static getGradientFromType(e,t,i,s,n,a){const o=e.createLinearGradient(i,s,n,a);return t===xo.Z.MUTED_BY_ADMIN?(o.addColorStop(0,"#F05459"),o.addColorStop(.4,"#766EE9"),o.addColorStop(1,"#57A4FE")):t===xo.Z.UNMUTED?(o.addColorStop(0,"#52CE5D"),o.addColorStop(1,"#00B1C0")):t===xo.Z.MUTED?(o.addColorStop(0,"#0976E3"),o.addColorStop(1,"#2BCEFF")):t===xo.Z.CONNECTING&&(o.addColorStop(0,"#8599aa"),o.addColorStop(1,"#8599aa")),o}update(e,t,i,s){}}class Fo{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:i,lbd2:s,scale:n,left:a,top:o,right:r,bottom:d,currentState:l,previousState:c,focused:h,resizing:u,canvas:p}=this;if(!h&&!u&&this.progressToState>=1)return;let f=Date.now()-this.lastUpdateTime;f>20&&(f=17),this.animateToAmplitude!==this.amplitude&&(this.amplitude+=this.animateAmplitudeDiff*f,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:m,amplitude2:g,progressToState:v}=this,b=6*g*n,y=6*g*n;p.getContext("2d").clearRect(0,0,p.width,p.height),t.minRadius=0,t.maxRadius=(2+2*m)*n,i.minRadius=0,i.maxRadius=(3+9*m)*n,s.minRadius=0,s.maxRadius=(3+9*m)*n,t.update(m,.3),i.update(m,.7),s.update(m,.7);for(let e=0;e<2;e++){if(0===e&&!c)continue;let n=1,h=null;0===e?(n=1-v,h=c):(n=c?v:1,l.update(d-o,r-a,f,m),h=l);const u=e=>{e.globalAlpha=.3*n,h.shader(e,a,o,r,d)},g=t=>{t.globalAlpha=0===e?1:n,h.shader(t,a,o,r,d)};i.draw(a,o-b,r,d,p,u,o,1),s.draw(a,o-y,r,d,p,u,o,1),t.draw(a,o,r,d,p,g,o,1)}e||(this.raf=requestAnimationFrame((()=>this.draw())))},this.setCurrentState=(e,t)=>{const{currentState:i,states:s}=this;(null==i?void 0:i.stateId)!==e&&(this.previousState=t?i:null,this.currentState=s.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([[xo.Z.UNMUTED,new _o(xo.Z.UNMUTED)],[xo.Z.MUTED,new _o(xo.Z.MUTED)],[xo.Z.MUTED_BY_ADMIN,new _o(xo.Z.MUTED_BY_ADMIN)],[xo.Z.CONNECTING,new _o(xo.Z.CONNECTING)]]),this.previousState=null,this.currentState=this.states.get(xo.Z.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 i=this.canvas=document.createElement("canvas");return i.classList.add(e+"-canvas"),t.append(i),t}}var Do=i(8222);class Ro{constructor(e,t){this.item=e,(0,Hn.Z)(this,t)}play(e){return this.item.playPart(this,e)}}class Bo{constructor(e,t){this.icon=e,this.autoplay=!1,(0,Hn.Z)(this,t),this.parts=this.parts.map((e=>this.createPart(e)))}load(){var e;let t=this.loadPromise;if(t)return t;const{container:i,canvas:s,width:n,height:a}=this.icon;return t=Rs.Z.loadAnimationAsAsset({container:i,canvas:s,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=>Rs.Z.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 Ro(this,e)}getPart(e){return e instanceof Ro?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 No{constructor(e){(0,Hn.Z)(this,e),this.container||(this.container=document.createElement("div")),this.container.classList.add("rlottie-icon");const{width:t,height:i}=this;this.container.style.width=t+"px",this.container.style.height=i+"px";const s=this.canvas=document.createElement("canvas");s.classList.add("rlottie"),s.width=t,s.height=i,this.items=new Map,this.loadPromises=new Map}get loadPromise(){return Promise.all([...this.loadPromises.values()]).then(Ye.Z)}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,i){if(!e.player)return void(e.onLoadForPart=()=>{this.playPart(e,t,i)});const s=e.getPart(t);e.player.playPart({from:d.Z.settings.animationsEnabled&&!this.skipAnimation?s.startFrame:s.endFrame,to:s.endFrame,callback:i})}static generateEqualParts(e,t){return new Array(e).fill(0).map(((e,i)=>{const s=i*t;return{startFrame:s,endFrame:s+t-1}}))}}class Oo extends No{constructor(e){super({width:e.width,height:e.height}),(0,Hn.Z)(this,e)}load(e,t){if(this.loaded)return this.loadPromise;this.loaded=!0,this.partState=e,this.colorState=t;const i=this.getPart(e),s=void 0!==t&&this.getColor&&this.getColor(t),n=i.item;n.initFrame=i.endFrame,n.color=s;const a=[...this.items.values()].map((e=>e.load()));return Promise.all(a).then(Ye.Z)}setState(e,t,i){this.loaded||this.load(e,t);let s=!1,n=!1;return void 0!==e?s=this.setPartState(e,t,i):void 0!==t&&(n=this.setColorState(t)),s||n}setPartState(e,t,i){const{partState:s}=this;return s===e?void 0!==t&&this.setColorState(t):(void 0!==t&&this.setColorState(t,!1),this.partState=e,this.getPart(e,s).play(i),!0)}setColorState(e,t=!0){const{colorState:i}=this;if(i===e||!this.getColor)return!1;this.colorState=e;const s=this.getItem(),n=this.getColor(e,i),a=()=>{s.player.setColor(n,t)};return s.player?a():s.onLoadForColor=a,!0}destroy(){this.items.forEach((e=>{e.loadPromise.then((()=>{e.player.remove()}))}))}}class Uo extends Oo{constructor(){super({width:36,height:36,getPart:(e,t)=>{const i=fr;let s;switch(e){case i.HAND:s=t===i.MUTED?"muted-to-hand":"unmuted-to-hand";break;case i.MUTED:s=t===i.HAND?"hand-to-muted":"mute";break;case i.UNMUTED:s="unmute"}return this.getItem().getPart(s)}}),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"}]})}}var Ho=i(6733);class zo extends Oo{constructor(e){super({width:32,height:32,getPart:(e,t)=>{const i=pr;let s;switch(e){case i.HAND:s=3;break;case i.MUTED:s=t===i.HAND?0:2;break;case i.UNMUTED:s=1}return this.getItem().getPart(s)},getColor:e?(e,t)=>function(e){const t=pr;let 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 s=Do.Z.getProperty("gc-"+i+"-text-color");return(0,O.oo)(s)}(e):void 0}),this.colored=e,this.container.classList.add("group-call-participant-muted-icon-container");const t=No.generateEqualParts(4,21);this.add({name:"voice_outlined2",parts:t})}setState(e){return super.setState(function(e){const t=pr;switch(e){case t.MUTED_BY_ADMIN:case t.MUTED_FOR_ME:return t.MUTED;default:return e}}(e),e)}}const jo="group-call-participant-status";class Go{constructor(e){this.withIcons=e,this.container=document.createElement("div"),this.container.classList.add(jo+"-container")}setState(e,t){const i=pr,s=this.withIcons.filter((e=>!!t[e])).map((e=>{const t="tgico-"+("presentation"===e?"listscreenshare":"videocamera_filled"),i=document.createElement("i");return i.classList.add(jo+"-icon",jo+"-icon-"+e,t),i}));let n,a;if(e===i.MUTED_FOR_ME)n=(0,L.ag)("VoiceChat.Status.MutedForYou"),a="is-muted";else if(e===i.UNMUTED)n=(0,L.ag)("VoiceChat.Status.Speaking"),a="is-speaking";else if(e===i.HAND)n=(0,L.ag)("VoiceChat.Status.WantsSpeak"),a="is-waiting";else{if(t.about&&!s.length)return void(0,F.Z)(this.container,(0,B.Z)(t.about));n=(0,L.ag)("VoiceChat.Status.Listening"),a="is-listening"}const o=document.createElement("span");o.classList.add(jo,a),o.append(...s,n),(0,H.Z)(this.container,o)}}var Vo=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Ko extends ps.Z{constructor(e){super({getIndex:e=>Vo(this,void 0,void 0,(function*(){return(yield this.instance.getParticipantByPeerId(e.id)).date})),onDelete:e=>{e.dom.listEl.remove(),this.onElementDestroy(e)},onUpdate:e=>Vo(this,void 0,void 0,(function*(){const t=yield this.instance.getParticipantByPeerId(e.id),i=mr(t);e.mutedIcon.setState(i),e.status.setState(i,t)})),onSort:(e,t)=>{(0,p.Z)(e.dom.listEl,this.list,t)},onElementCreate:e=>{const{dom:t}=Ji.default.addDialogNew({peerId:e.id,container:!1,avatarSize:this.avatarSize,autonomous:this.autonomous,meAsSaved:!1,rippleEnabled:this.rippleEnabled,wrapOptions:{lazyLoadQueue:this.lazyLoadQueue}});t.listEl.classList.add("group-call-participant");const i=new zo(!0),s=new Go(["presentation","video"]);return(0,H.Z)(t.lastMessageSpan,s.container),t.listEl.append(i.container),e.mutedIcon=i,e.status=s,e.dom=t,e},updateElementWith:fe.T2}),this.instance=e,this.avatarSize="abitbigger",this.rippleEnabled=!0,this.autonomous=!0,this.createChatListOptions={dialogSize:72},this.list=Ji.default.createChatList(this.createChatListOptions)}destroy(){this.elements.forEach((e=>{this.onElementDestroy(e)}))}onElementDestroy(e){e.mutedIcon.destroy()}}var Wo=i(7529);function $o(e){const t=document.createElement("canvas");t.classList.add("call-video-blur"),t.width=16,t.height=16;const i=t.getContext("2d",{alpha:!1});i.filter="blur(2px)";const s=()=>{i.drawImage(e,0,0,e.videoWidth,e.videoHeight,0,0,t.width,t.height)};return(0,Me.jt)((()=>(s(),t.isConnected))),s(),t}const qo="group-call-participant-video";class Yo{constructor(e,t,i){this.managers=e,this.instance=t,this.source=i,this.container=document.createElement("div"),this.container.classList.add(qo+"-container"),this.info=document.createElement("div"),this.info.classList.add(qo+"-info"),this.left=document.createElement("div"),this.left.classList.add(qo+"-info-left"),this.right=document.createElement("div"),this.right.classList.add(qo+"-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(qo+"-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,i){let s;e.pFlags.self?(s=(0,L.ag)("VoiceChat.Status.You"),s.classList.add("peer-title")):(this.peerTitle=new N.Z({peerId:(0,R.Z)(e.peer)}),s=this.peerTitle.element),this.groupCallParticipantMutedIcon=new zo(!1),this.groupCallParticipantStatus=new Go([t]),this.left.append(s,this.groupCallParticipantStatus.container),this.right.append(this.groupCallParticipantMutedIcon.container),i.classList.add(qo,"call-video"),i.paused&&i.play();const n=$o(i);n.classList.add(qo+"-blur"),this.container.prepend(n,i),this.updateParticipant(e)}updateParticipant(e){const t=mr(e);this.groupCallParticipantMutedIcon.setState(t),this.groupCallParticipantStatus.setState(t,e)}destroy(){this.groupCallParticipantMutedIcon.destroy()}}class Qo extends Wo.Z{constructor(e){super(),(0,Hn.Z)(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:i}=this;i.add(d.Z)("group_call_participant",(({groupCallId:e,participant:t})=>{this.instance.id===e&&this.updateParticipant(t)})),i.add(this.instance)("pinned",(e=>{this.participantsElements.forEach((t=>{t.forEach((t=>{this.setElementDisplay(t,e)}))}))})),(0,C.fc)(this.container,(e=>{const t=(0,be.Z)(e.target,"group-call-participant-video-container");if(!t)return;const i=this.containers.get(t);this.instance.pinnedSource!==i.source?this.instance.pinSource(i.source):this.instance.unpinAll()}),{listenerSetter:i}),this.setInstance(this.instance),this.setup({element:t,listenerSetter:i,showOnLeaveToClassName:"group-call-buttons"})}shouldDisplayElement(e,t){return this.displayPinned?!t||e.source===t:t&&e.source!==t}setElementDisplay(e,t){const i=this.shouldDisplayElement(e,t);e.container.classList.toggle("video-hidden",!i);const s=e.source===t;e.setPinned(s)}updateParticipant(e){const t=(0,R.Z)(e.peer),i=["video","presentation"],s=i.some((t=>!!e[t]));let n=this.participantsElements.get(t);(s||n)&&(n||this.participantsElements.set(t,n=new Map),i.forEach((i=>{let s=n.get(i);const a=e[i];if(!!a!=!!s){if(a){const t=this.instance.getVideoElementFromParticipantByType(e,i);if(!t)return;const{video:a,source:o}=t;s=new Yo(this.managers,this.instance,o),this.containers.set(s.container,s),this.setElementDisplay(s,this.instance.pinnedSource),n.set(i,s),s.setParticipant(e,i,a),this.container.prepend(s.container)}else n.delete(i),s.container.remove(),n.size||(this.participantsElements.delete(t),this.containers.delete(s.container),s.destroy());this._onLengthChange()}else s&&s.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){return t=this,i=void 0,n=function*(){(yield e.participants).forEach((e=>{this.updateParticipant(e)}))},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}destroy(){this.containers.forEach((e=>{e.destroy()}))}}var Xo=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Jo{constructor(e){this.onOpenProfileClick=()=>{const e=S.Z.getPopups(br)[0];e&&e.hide(),id.setInnerPeer({peerId:this.targetPeerId})},this.toggleParticipantMuted=e=>{this.instance.editParticipant(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.managers.appChatsManager.hasRights(this.chatId,"ban_users"),onClick:()=>Xo(this,void 0,void 0,(function*(){(0,vi.Z)({peerId:this.targetPeerId,title:new N.Z({peerId:this.targetPeerId}).element,descriptionLangKey:(yield this.managers.appChatsManager.isBroadcast(this.chatId))?"VoiceChat.RemovePeer.Confirm.Channel":"VoiceChat.RemovePeer.Confirm",descriptionLangArgs:[new N.Z({peerId:this.targetPeerId}).element],button:{langKey:"VoiceChat.RemovePeer.Confirm.OK",isDanger:!0}}).then((()=>{this.managers.appChatsManager.kickFromChat(this.chatId,this.targetPeerId)}),Ye.Z)}))}];const{listenerSetter:t}=e;this.managers=e.managers,this.instance=e.instance,this.chatId=this.instance.chatId,this.element=(0,Ts.b)({buttons:this.buttons,listenerSetter:t}),this.element.classList.add("group-call-participant-menu","night"),(0,Ct.E)({element:e.onContextElement,callback:e=>Xo(this,void 0,void 0,(function*(){const t=(0,be.Z)(e.target,"group-call-participant");if(!t)return;this.element.parentElement!==i&&i.append(this.element),(0,Ce.Z)(e);const s=this.targetPeerId=t.dataset.peerId.toPeerId();this.participant=yield this.instance.getParticipantByPeerId(s),this.participant.pFlags.self||(this.canManageCall=yield this.managers.appChatsManager.hasRights(this.chatId,"manage_call"),yield(0,en.Z)(this.buttons,(e=>Xo(this,void 0,void 0,(function*(){const t=yield e.verify(s);return e.element.classList.toggle("hide",!t),t})))),(0,Js.Z)(e.touches?e.touches[0]:e,this.element,"right"),Lt.Z.openBtnMenu(this.element))})),listenerSetter:t}),t.add(d.Z)("group_call_participant",(({groupCallId:e,participant:t})=>{if(this.instance.id===e){const e=(0,R.Z)(t.peer);this.targetPeerId===e&&Lt.Z.close()}}));let i=document.body;(0,Ho.Ms)(document.body,(()=>{const e=(0,Ho.rB)();i=e?S.Z.getPopups(br)[0].getContainer():document.body,e||Lt.Z.close()}),t)}}class er{constructor(e){(0,Hn.Z)(this,e);const t="group-call-participants",i=new T.ZP(void 0);i.container.classList.add(t+"-scrollable");const s=this.container=document.createElement("div");s.classList.add(t);const n=this.sortedList=new Ko(this.instance),{instance:a,listenerSetter:o}=this;this.contextMenu=new Jo(Object.assign(Object.assign({},e),{onContextElement:n.list,listenerSetter:o,instance:a})),this.groupCallParticipantsVideo=new Qo(Object.assign(Object.assign({},e),{appendTo:i.container,displayPinned:!1})),i.append(n.list),s.append(i.container),e.appendTo.append(s),o.add(d.Z)("group_call_participant",(({groupCallId:e,participant:t})=>{this.instance.id===e&&this.updateParticipant(t)})),new Vs.Z({scrollable:i,getPromise:()=>this.managers.appGroupCallsManager.getGroupCallParticipants(this.instance.id).then((({participants:e,isEnd:t})=>(e.forEach((e=>{this.updateParticipant(e)})),t)))}),this.setInstance(a)}updateParticipant(e){const t=(0,R.Z)(e.peer),i=this.sortedList.has(t);e.pFlags.left?i&&this.sortedList.delete(t):i?this.sortedList.update(t):this.sortedList.add(t)}setInstance(e){return Xo(this,void 0,void 0,(function*(){(yield e.participants).forEach((e=>{this.updateParticipant(e)}))}))}destroy(){this.sortedList.destroy(),this.groupCallParticipantsVideo.destroy()}}class tr{constructor(e){this.appendTo=e,this.descriptionIntl=new L.ZP.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 i,s;t===xo.Z.CONNECTING?i="VoiceChat.Status.Connecting":(i="VoiceChat.Status.Members",s=[e.groupCall.participants_count]);const{descriptionIntl:n}=this;n.compareAndUpdate({key:i,args:s}),this.descriptionIntl.element.parentElement||this.appendTo.append(this.descriptionIntl.element)}}class ir{constructor(e){this.appendTo=e,this.peerTitle=new N.Z({peerId:0})}update(e){const{peerTitle:t,appendTo:i}=this,s=e.groupCall,n=e.chatId.toPeerId(!0);s.title?(0,F.Z)(i,(0,B.Z)(s.title)):(t.options.peerId!==n&&(t.options.peerId=n,t.update()),t.element.parentElement!==i&&i.append(t.element))}}var sr=i(2820);function nr(e,t,i){const s=e+"-button",n=document.createElement("div");n.classList.add(s,"call-button","rp-overflow"),i.icon&&n.classList.add("tgico-"+i.icon),i.noRipple||(0,A.Z)(n),i.isDanger&&n.classList.add(s+"-red"),i.isConfirm&&n.classList.add(s+"-green"),i.callback&&(0,C.fc)(n,i.callback,{listenerSetter:t});let a=n;if(i.text){const e=document.createElement("div");e.classList.add(s+"-container","call-button-container");const t="string"==typeof i.text?(0,L.ag)(i.text):i.text;t.classList.add(s+"-text","call-button-text"),e.append(n,t),a=e}return a}var ar=i(3757);const or="movable-element",rr=or+"-resize-handler";class dr extends l.Z{constructor(e){super(!0),this.onResize=()=>{this.fixDimensions(),this.fixPosition(),this.setPosition()},(0,Hn.Z)(this,e),this.top=this.left=this.width=this.height=0,this.element.classList.add(or),this.addResizeHandlers(),this.setSwipeHandler(),o.Z.addEventListener("resize",this.onResize)}destroyElements(){this.element.classList.remove(or),this.handlers&&this.handlers.forEach((e=>{e.remove()}))}destroy(){o.Z.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(rr,rr+"-side-"+e),this.element.append(t),t}))}setSwipeHandler(){let e,t,i,s,n;const a=this.swipeHandler=new ar.Z({element:this.element,onSwipe:(a,o,r)=>{if(n){if(n.includes("e")||n.includes("w")){const e=n.includes("e")&&a>0||n.includes("w")&&a<0,s=Math.abs(a)*(e?1:-1),o=n.includes("e")?xe.Z.width-t:i+t;this.width=Math.min(o,i+s)}if(n.includes("n")||n.includes("s")){const t=n.includes("s")&&o>0||n.includes("n")&&o<0,i=Math.abs(o)*(t?1:-1),a=n.includes("s")?xe.Z.height-e:s+e;this.height=Math.min(a,s+i)}this.fixDimensions(),n.includes("w")&&(this.left=Math.min(t+i-this.minWidth,t+a)),n.includes("n")&&(this.top=Math.min(e+s-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 i=(0,be.Z)(t,rr);return i?(n=i.dataset.side,a.setCursor("")):(n=void 0,a.setCursor("grabbing")),!0},onFirstSwipe:()=>{e=this.top,t=this.left,i=this.width,s=this.height}})}setPositionToCenter(){this.top=xe.Z.height/2-this.height/2,this.left=xe.Z.width/2-this.width/2,this.setPosition()}fixDimensions(){this.width=(0,Gi.Z)(this.width,this.minWidth,xe.Z.width),this.height=(0,Gi.Z)(this.height,this.minHeight,xe.Z.height)}fixPosition(){this.top=(0,Gi.Z)(this.top,0,xe.Z.height-this.height),this.left=(0,Gi.Z)(this.left,0,xe.Z.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:i,height:s}=this;return{top:e,left:t,width:i,height:s}}set state(e){const{top:t,left:i,width:s,height:n}=e;this.top=t,this.left=i,this.width=s,this.height=n,this.onResize()}}var lr,cr=function(e,t,i,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,i):n?n.value=i:t.set(e,i),i};class hr{constructor(e){lr.set(this,void 0),(0,Hn.Z)(this,e),this.toggleMovable(!c.Z),this.listenerSetter.add(o.Z)("changeScreen",((e,t)=>{t!==o._.mobile&&e!==o._.mobile||this.toggleMovable(!c.Z)}))}destroy(){const e=this.movable;e&&e.destroy()}get movable(){return function(e,t,i,s){if("a"===i&&!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"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)}(this,lr,"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=cr(this,lr,new dr(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(),cr(this,lr,void 0,"f")}}}function ur(e,t,i){return t.forEach((t=>{t.classList.toggle(e,i)})),()=>ur(e,t,!i)}lr=new WeakMap;var pr,fr;function mr(e){const t=pr;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}!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"}(pr||(pr={})),function(e){e[e.HAND=0]="HAND",e[e.MUTED=1]="MUTED",e[e.UNMUTED=2]="UNMUTED"}(fr||(fr={}));let gr={width:420,height:640};const vr="group-call";class br extends S.Z{constructor(){super("popup-group-call",{body:!0,withoutOverlay:!0,closable:!0,title:!0}),this.onFullScreenClick=()=>{(0,Ho.Dj)(this.container)},this.onToggleControls=e=>{this.container.classList.toggle("show-controls",e),this.buttonsContainer.classList.toggle("show-controls",e)},this.toggleDisability=ur.bind(null,"btn-disabled"),this.onVideoClick=()=>{const e=this.toggleDisability([this.btnVideo],!0);this.instance.toggleVideoSharing().finally((()=>{e()}))},this.onScreenClick=()=>{const e=this.toggleDisability([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=()=>{return e=this,t=void 0,s=function*(){const e=e=>{this.instance.hangUp(e)};(yield this.managers.appChatsManager.hasRights(this.instance.chatId,"manage_call"))?new xs.Z("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)},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s},this.onFullScreenChange=()=>{this.toggleBigLayout();const e=(0,Ho.rB)(),{btnFullScreen:t,btnExitFullScreen:i}=this,n=this.container.classList.contains("is-full-screen");this.container.classList.toggle("is-full-screen",e),t&&t.classList.toggle("hide",e),i&&i.classList.toggle("hide",!e),this.btnClose.classList.toggle("hide",e),e!==n&&(s.Z.checkAnimations2(e),yo.Z.setThemeColor(e?"#000000":void 0))},this.toggleBigLayout=()=>{var e;const t=(0,Ho.rB)(),i=null===(e=this.movablePanel)||void 0===e?void 0:e.movable,s=(t||!!(i&&i.width>=680))&&!!this.videosCount,n=this.container.classList.contains("is-big-layout");let a;s&&!n&&(a=Array.from(this.buttonsContainer.children),a.forEach((e=>{e.style.opacity="0"})),this.buttonsContainer.offsetLeft),this.container.classList.toggle("is-big-layout",s),this.btnInvite.classList.toggle("hide",s),this.btnShowColumn.classList.toggle("hide",!s),a&&a.forEach((e=>{e.style.opacity=""}))},this.toggleRightColumn=()=>{this.container.classList.toggle("is-right-column-shown")},this.videosCount=0,this.container.classList.add(vr,"night");const e=this.instance=ro.ZP.groupCall,{listenerSetter:t}=this;if(!x.IS_APPLE_MOBILE){const e=this.btnFullScreen=(0,Gn.Z)("fullscreen"),i=this.btnFullScreen2=(0,Gn.Z)("fullscreen "+vr+"-cfs"),s=this.btnExitFullScreen=(0,Gn.Z)("smallscreen");(0,C.fc)(e,this.onFullScreenClick,{listenerSetter:t}),(0,C.fc)(i,this.onFullScreenClick,{listenerSetter:t}),(0,C.fc)(s,(()=>{(0,Ho.C8)()}),{listenerSetter:t}),(0,Ho.Ms)(this.container,this.onFullScreenChange,t)}this.btnInvite=(0,Gn.Z)("adduser");const i=this.btnShowColumn=(0,Gn.Z)("rightpanel "+vr+"-only-big");(0,C.fc)(i,this.toggleRightColumn,{listenerSetter:t});const n=document.createElement("div");n.classList.add(vr+"-header-info"),this.title.classList.add(vr+"-header-title");const a=document.createElement("div");a.classList.add(vr+"-header-subtitle"),n.append(this.title,a),this.header.classList.add(vr+"-header"),this.header.append(...[this.btnExitFullScreen,n,this.btnFullScreen,i].filter(Boolean));const o=this.header.cloneNode(!1),r=n.cloneNode(!1),l=this.title.cloneNode(!1);r.append(l);const c=(0,Gn.Z)("rightpanel");o.append(...[c,r,this.btnFullScreen2].filter(Boolean)),(0,C.fc)(c,this.toggleRightColumn,{listenerSetter:t}),this.body.prepend(o);const h=new T.ZP(void 0);h.container.classList.add("group-call-big-video-container"),this.container.append(h.container),this.groupCallTitle=new ir(this.title),this.groupCallDescription=new tr(a),this.groupCallBodyHeaderDescription=new tr(l),this.constructButtons(),this.groupCallParticipantsVideo=new Qo({appendTo:h.container,instance:e,listenerSetter:t,displayPinned:!0,onLengthChange:e=>{this.videosCount=e,this.toggleBigLayout()},managers:this.managers}),this.groupCallParticipants=new er({appendTo:this.body,instance:e,listenerSetter:t,managers:this.managers}),this.movablePanel=new hr({listenerSetter:t,movableOptions:{minWidth:400,minHeight:480,element:this.element,verifyTouchTarget:e=>{const t=e.target;return!((0,be.Z)(t,"chatlist")||(0,be.Z)(t,"group-call-button")||(0,be.Z)(t,"btn-icon")||(0,be.Z)(t,"group-call-participants-video-container")||(0,Ho.rB)())}},onResize:()=>this.toggleBigLayout(),previousState:gr}),t.add(e)("state",(()=>{this.updateInstance()})),t.add(d.Z)("group_call_update",(e=>{var t;(null===(t=this.instance)||void 0===t?void 0:t.id)===e.id&&this.updateInstance()})),t.add(e)("pinned",(()=>{this.setHasPinned()})),t.add(this.groupCallParticipantsVideo)("toggleControls",this.onToggleControls),this.addEventListener("close",(()=>{const{movablePanel:e}=this;gr=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(vr+"-buttons");const t=nr.bind(null,vr,this.listenerSetter),i=this.btnVideo=t({callback:this.onVideoClick,icon:"videocamera_filled"}),s=this.btnScreen=t({callback:this.onScreenClick,icon:"sharescreen_filled"});s.classList.toggle("hide",!sr.Z);const n=t({noRipple:!0,callback:(0,Ya.Z)(this.onMuteClick,600,!0)});n.classList.add(vr+"-microphone-button");const a=this.groupCallMicrophoneIcon=new Uo;n.append(a.container);const o=t({icon:"settings_filled"});o.classList.add("btn-disabled"),o.classList.toggle("hide",!sr.Z);const r=t({isDanger:!0,callback:this.onLeaveClick,icon:"close"});e.append(i,s,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===xo.Z.CLOSED)return this.container.classList.contains("is-full-screen")&&(0,Ho.C8)(),void this.hide();const{participant:e,groupCall:t}=this.instance;if(!e)return;this.setTitle(),this.setDescription(),this.setHasPinned();const i=function(e,t){const i=fr;return t.pFlags.can_self_unmute?t.pFlags.muted?i.MUTED:i.UNMUTED:i.HAND}(0,e);this.container.dataset.micState=i===fr.HAND?"hand":i===fr.MUTED?"muted":"unmuted",this.groupCallMicrophoneIcon.setState(i)}setTitle(){this.groupCallTitle.update(this.instance)}setDescription(){this.groupCallDescription.update(this.instance),this.groupCallBodyHeaderDescription.update(this.instance)}}var yr=i(9078),wr=i(3335);class Sr{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 i;if(this.state=t,t===wr.Z.CONNECTED){i=document.createElement("span"),i.classList.add("call-description-duration");const t=()=>{i.innerText=(0,ts.Z)(e.duration,!0)};this.interval=window.setInterval(t,1e3),t()}else{let s;switch(t){case wr.Z.PENDING:s=e.isOutgoing?"Call.StatusRinging":"Call.StatusCalling";break;case wr.Z.REQUESTING:s="Call.StatusRequesting";break;case wr.Z.EXCHANGING_KEYS:s="VoipExchangingKeys";break;case wr.Z.CLOSED:s=void 0!==e.connectedAt?"Call.StatusEnded":"Call.StatusFailed";break;default:s="Call.StatusConnecting"}i=(0,L.ag)(s),void 0!==this.interval&&(clearInterval(this.interval),this.interval=void 0)}this.container.classList.toggle("has-duration",t===wr.Z.CONNECTED),(0,H.Z)(this.container,i),this.container.parentElement||this.appendTo.append(this.container)}}class Cr extends Oo{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"}]})}}const Lr="call",Er={width:400,height:580};let Ir=Object.assign({},Er);class Mr extends S.Z{constructor(e){super("popup-call",{withoutOverlay:!0,closable:!0}),this.instance=e,this.onFullScreenClick=()=>{(0,Ho.Dj)(this.container)},this.onFullScreenChange=()=>{const e=(0,Ho.rB)(),{btnFullScreen:t,btnExitFullScreen:i}=this,n=this.container.classList.contains("is-full-screen");this.container.classList.toggle("is-full-screen",e),t&&t.classList.toggle("hide",e),i&&i.classList.toggle("hide",!e),this.btnClose.classList.toggle("hide",e),e!==n&&(s.Z.checkAnimations(e),yo.Z.setThemeColor(e?"#000000":void 0),this.resizeVideoContainers())},this.videoContainers={};const{container:t,listenerSetter:i}=this;t.classList.add(Lr,"night");const n=document.createElement("div");n.classList.add(Lr+"-avatar");const a=this.peerId=this.instance.interlocutorUserId.toPeerId(),o=new f.Z;o.classList.add("avatar-full"),o.updateWithOptions({isBig:!0,peerId:a}),n.append(o);const r=new N.Z({peerId:a}).element;r.classList.add(Lr+"-title");const d=document.createElement("div");d.classList.add(Lr+"-subtitle"),this.description=new Sr(d);const l=this.emojisSubtitle=document.createElement("div");l.classList.add(Lr+"-emojis"),t.append(n,r,d),x.IS_MOBILE?this.header.append(l):(this.btnFullScreen=(0,Gn.Z)("fullscreen"),this.btnExitFullScreen=(0,Gn.Z)("smallscreen hide"),(0,C.fc)(this.btnFullScreen,this.onFullScreenClick,{listenerSetter:i}),(0,C.fc)(this.btnExitFullScreen,(()=>(0,Ho.C8)()),{listenerSetter:i}),(0,Ho.Ms)(this.container,this.onFullScreenChange,i),this.header.prepend(this.btnExitFullScreen),this.header.append(this.btnFullScreen),t.append(l)),this.partyStates=document.createElement("div"),this.partyStates.classList.add(Lr+"-party-states"),this.partyMutedState=document.createElement("div"),this.partyMutedState.classList.add(Lr+"-party-state");const c=(0,L.ag)("VoipUserMicrophoneIsOff",[new N.Z({peerId:a,onlyFirstName:!0,limitSymbols:18}).element]);c.classList.add(Lr+"-party-state-text");const h=new Cr(!1,!0);h.setState(!1,!1),this.partyMutedState.append(h.container,c),this.partyStates.append(this.partyMutedState),this.container.append(this.partyStates),this.makeButton=nr.bind(null,Lr,this.listenerSetter),this.constructFirstButtons(),this.constructSecondButtons(),i.add(e)("state",(()=>{this.updateInstance()})),i.add(e)("mediaState",(()=>{this.updateInstance()})),this.movablePanel=new hr({listenerSetter:i,movableOptions:{minWidth:400,minHeight:580,element:this.element,verifyTouchTarget:e=>{const t=e.target;return!((0,be.Z)(t,"call-button")||(0,be.Z)(t,"btn-icon")||(0,Ho.rB)())}},previousState:this.instance.wasTryingToJoin||this.instance.isOutgoing?Ir:Object.assign({},Er)});const u=this.movablePanel.movable;u&&this.listenerSetter.add(u)("resize",(()=>{this.resizeVideoContainers()}));const p=this.controlsHover=new Wo.Z;p.setup({element:this.container,listenerSetter:this.listenerSetter,showOnLeaveToClassName:"call-buttons"}),p.showControls(!1),this.addEventListener("close",(()=>{const{movablePanel:e}=this;Ir=e.state,this.microphoneIcon.destroy(),e.destroy()})),this.updateInstance()}getCallInstance(){return this.instance}constructFirstButtons(){const e=this.firstButtonsRow=document.createElement("div");e.classList.add(Lr+"-buttons","is-first");const t=ur.bind(null,"btn-disabled"),i=this.btnVideo=this.makeButton({text:"Call.Camera",icon:"videocamera_filled",callback:()=>{const e=t([i,s],!0);this.instance.toggleVideoSharing().finally(e)}}),s=this.btnScreen=this.makeButton({text:"Call.Screen",icon:"sharescreen_filled",callback:()=>{const e=t([i,s],!0);this.instance.toggleScreenSharing().finally(e)}});sr.Z||(s.classList.add("hide"),this.container.classList.add("no-screen")),this.muteI18nElement=new L.ZP.IntlElement({key:"Call.Mute"});const n=this.btnMute=this.makeButton({text:this.muteI18nElement.element,callback:()=>{this.instance.toggleMuted()}}),a=this.microphoneIcon=new Cr(!0,!0);n.firstElementChild.append(a.container),e.append(i,s,n),this.container.append(e)}constructSecondButtons(){const e=this.secondButtonsRow=document.createElement("div");e.classList.add(Lr+"-buttons","is-second"),this.declineI18nElement=new L.ZP.IntlElement({key:"Call.Decline"});const t=this.btnDecline=this.makeButton({text:this.declineI18nElement.element,icon:"endcall_filled",callback:()=>{this.instance.hangUp("phoneCallDiscardReasonHangup")},isDanger:!0}),i=this.btnAccept=this.makeButton({text:"Call.Accept",icon:"phone_filled",callback:()=>{this.instance.acceptCall()},isConfirm:!0});e.append(t,i),this.container.append(e)}createVideoContainer(e){const t=Lr+"-video",i=document.createElement("div");i.classList.add(t+"-container"),e.classList.add(t),e.paused&&e.play(),(0,C.fc)(i,(()=>{if(!i.classList.contains("small"))return;const e=Object.values(this.videoContainers).find((e=>!e.classList.contains("small")));e.classList.add("small"),e.style.cssText=i.style.cssText,i.classList.remove("small"),i.style.cssText="",this.resizeVideoContainers()}));const s=$o(e);return s.classList.add(t+"-blur"),i.append(s,e),i}updateInstance(){const{instance:e}=this,{connectionState:t}=e;if(t===wr.Z.CLOSED)return this.container.classList.contains("is-full-screen")&&(0,Ho.C8)(),this.btnVideo.classList.add("disabled"),void this.hide();const i=!e.isOutgoing&&t===wr.Z.PENDING;this.declineI18nElement.compareAndUpdate({key:t===wr.Z.PENDING?"Call.Decline":"Call.End"}),this.btnAccept.classList.toggle("disable",!i),this.btnAccept.classList.toggle("hide-me",!i),this.container.classList.toggle("two-button-rows",i);const s=e.isMuted,n=()=>{this.btnMute.firstElementChild.classList.toggle("active",s)},a=this.microphoneIcon.getItem().player;this.microphoneIcon.setState(!s,!s,n),a||n(),this.muteI18nElement.compareAndUpdate({key:s?"VoipUnmute":"Call.Mute"});const o=e.isSharingVideo;this.btnVideo.firstElementChild.classList.toggle("active",o);const r=e.isSharingScreen;this.btnScreen.firstElementChild.classList.toggle("active",r);const d=e.getMediaState("output");(0,Fe.Z)({element:this.partyMutedState,className:"is-visible",forwards:!!(null==d?void 0:d.muted),duration:300});const l=this.videoContainers,c=Object.assign({},l);["input","output"].forEach((t=>{const i=e.getMediaState(t),s=e.getVideoElement(t),n=!!(s&&s.videoWidth&&s.videoHeight);!s||n||s.dataset.hasPromise||(s.dataset.hasPromise="1",(0,wn.Z)(s).then((()=>{delete s.dataset.hasPromise,this.updateInstance()})));const a=!!s&&n&&!(!i||"active"!==i.videoState&&"active"!==i.screencastState);let o=l[t];a&&s&&!o&&(o=l[t]=this.createVideoContainer(s),this.container.append(o)),!a&&o&&(o.remove(),delete l[t])}));{const e=l.input,t=l.output;Object.keys(c).length!==Object.keys(l).length&&e&&e.classList.toggle("small",!!t),t&&!e&&t.classList.remove("small")}this.resizeVideoContainers(),this.container.classList.toggle("no-video",!Object.keys(l).length),!this.emojisSubtitle.textContent&&t{(0,H.Z)(this.emojisSubtitle,(0,B.Z)(e.join("")))})),this.setDescription()}resizeVideoContainers(){Object.values(this.videoContainers).forEach((e=>{if(e.classList.contains("small")){const t=e.querySelector("video"),i=this.movablePanel.state,s=240,n=240,a=t.videoHeight>t.videoWidth,o=a?n:s,r=1/3*((0,Ho.rB)()?65535:a?i.height:i.width),d=a?t.videoWidth/t.videoHeight:1,l=a?1:t.videoHeight/t.videoWidth;e.style.width=r*d+"px",e.style.height=r*l+"px",e.style.maxWidth=o*d+"px",e.style.maxHeight=o*l+"px"}else e.style.cssText=""}))}setDescription(){this.description.update(this.instance)}}var Pr=i(2069),Zr=i(9585),Tr=i(2493);const kr="topbar-call";class xr{constructor(e){this.managers=e,this.onState=()=>{this.updateInstance(this.instance)};const t=this.listenerSetter=new ce.Z;t.add(Tr.Z)("instance",(({instance:e})=>{this.instance||this.updateInstance(e)})),t.add(Tr.Z)("accepting",(e=>{this.instance!==e&&this.updateInstance(e)})),t.add(ro.ZP)("instance",(e=>{this.updateInstance(e)})),t.add(d.Z)("group_call_update",(e=>{const t=ro.ZP.groupCall;(null==t?void 0:t.id)===e.id&&this.updateInstance(t)})),t.add(Zr.Z.ANALYSER_LISTENER)("amplitude",(({amplitudes:e,type:t})=>{const{weave:i}=this;if(!e.length||!i)return;let s=0;for(let t=0;ts?n:s}i.setAmplitude(s)}))}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);const t=this.instance!==e;t&&(this.clearCurrentInstance(),this.instance=e,this.instanceListenerSetter=new ce.Z,this.instanceListenerSetter.add(e)("state",this.onState),e instanceof yr.Z?this.currentDescription=this.groupCallDescription:(this.currentDescription=this.callDescription,this.instanceListenerSetter.add(e)("muted",this.onState)),this.container.classList.toggle("is-call",!(e instanceof yr.Z)));const i=this.instance.isMuted,s=e instanceof yr.Z?e.state:function(e,t){switch(e){case wr.Z.CLOSING:case wr.Z.CLOSED:return xo.Z.CLOSED;case wr.Z.CONNECTED:return t?xo.Z.MUTED:xo.Z.UNMUTED;default:return xo.Z.CONNECTING}}(e.connectionState,i),{weave:n}=this;n.componentDidMount();const a=s===xo.Z.CLOSED;(!document.body.classList.contains("is-calling")||t||a)&&(a&&n.setAmplitude(0),(0,Fe.Z)({element:document.body,className:"is-calling",forwards:!a,duration:250,onTransitionEnd:a?()=>{n.componentWillUnmount(),this.clearCurrentInstance()}:void 0})),a||(n.setCurrentState(s,!0),this.setTitle(e),this.setDescription(e),this.groupCallMicrophoneIconMini.setState(!i))}setDescription(e){return this.currentDescription.update(e)}setTitle(e){if(e instanceof yr.Z)return this.groupCallTitle.update(e);(0,H.Z)(this.center,new N.Z({peerId:e.interlocutorUserId.toPeerId()}).element)}construct(){const{listenerSetter:e}=this,t=this.container=document.createElement("div");t.classList.add("sidebar-header",kr+"-container");const i=document.createElement("div");i.classList.add(kr+"-left");const s=this.groupCallMicrophoneIconMini=new Cr,n=(0,Gn.Z)();n.append(s.container),i.append(n);const a=(0,Ya.Z)((()=>{this.instance.toggleMuted()}),600,!0);(0,C.fc)(n,(e=>{(0,Ce.Z)(e),a()}),{listenerSetter:e});const o=this.center=document.createElement("div");o.classList.add(kr+"-center"),this.groupCallTitle=new ir(o),this.groupCallDescription=new tr(i),this.callDescription=new Sr(i);const r=document.createElement("div");r.classList.add(kr+"-right");const d=(0,Gn.Z)("endcall_filled");r.append(d),(0,C.fc)(d,(e=>{(0,Ce.Z)(e);const{instance:t}=this;t&&(t instanceof yr.Z?t.hangUp():t.hangUp("phoneCallDiscardReasonHangup"))}),{listenerSetter:e}),(0,C.fc)(t,(()=>{if(this.instance instanceof yr.Z){if(S.Z.getPopups(br).length)return;(new br).show()}else if(this.instance instanceof Pr.Z){if(S.Z.getPopups(Mr).find((e=>e.getCallInstance()===this.instance)))return;new Mr(this.instance).show()}}),{listenerSetter:e}),t.append(i,o,r);const l=this.weave=new Fo,c=l.render(kr+"-weave");t.prepend(c),document.getElementById("column-center").prepend(t),l.componentDidMount()}}var Ar=i(2614),_r=i(6009),Fr=i(493),Dr=i(2131),Rr=i(2890),Br=i(6702),Nr=i(7746),Or=i(3785),Ur=i(2491),Hr=i(1722),zr=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const jr=new class{constructor(){this.notificationsShown={},this.notificationIndex=0,this.notificationsCount=0,this.soundsPlayed={},this.vibrateSupport=Dr.Z,this.faviconElements=Array.from(document.head.querySelectorAll('link[rel="icon"], link[rel="alternate icon"]')),this.titleBackup=document.title,this.titleChanged=!1,this.stopped=!1,this.settings={},this.pushInited=!1,this.updateLocalSettings=()=>{const e=["notify_nodesktop","notify_volume","notify_novibrate","notify_nopreview","notify_nopush"].map((()=>{}));Promise.all(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&&Br.default.isAvailable||!1;e!==(!1!==this.registeredDevice)&&(e?Br.default.subscribe():Br.default.unsubscribe())}Br.default.setSettings(this.settings)})),Sn.Z.getState().then((e=>{this.settings.nosound=!e.settings.notifications.sound}))},this.requestPermission=()=>{Notification.requestPermission(),window.removeEventListener("click",this.requestPermission)}}construct(e){this.managers=e,this.log=(0,r.kg)("NOTIFICATIONS"),navigator.vibrate=navigator.vibrate||navigator.mozVibrate||navigator.webkitVibrate,this.setAppBadge=navigator.setAppBadge&&navigator.setAppBadge.bind(navigator),this.setAppBadge&&this.setAppBadge(0),this.notificationsUiSupport="Notification"in window||"mozNotification"in navigator,this.notifySoundEl=document.createElement("div"),this.notifySoundEl.id="notify-sound",document.body.append(this.notifySoundEl),this.topMessagesDeferred=(0,me.Z)(),To.Z.addEventListener("deactivated",(()=>{this.stop()})),To.Z.addEventListener("activated",(()=>{this.stopped&&this.start()})),wt.Z.addEventListener("change",(e=>{this.stopped||(e||this.clear(),this.toggleToggler())})),d.Z.addEventListener("notification_reset",(e=>{this.soundReset(e)})),d.Z.addEventListener("notification_cancel",(e=>{this.cancel(e)})),this.setAppBadge&&d.Z.addEventListener("folder_unread",(e=>{0===e.id&&this.setAppBadge(e.unreadUnmutedPeerIds.size)})),Br.default.addEventListener("push_init",(e=>{this.pushInited=!0,this.settings.nodesktop||this.settings.nopush?this.unregisterDevice(e):e?this.registerDevice(e):Br.default.subscribe()})),Br.default.addEventListener("push_subscribe",(e=>{this.registerDevice(e)})),Br.default.addEventListener("push_unsubscribe",(e=>{this.unregisterDevice(e)})),d.Z.addEventListener("dialogs_multiupdate",(()=>{this.topMessagesDeferred.resolve()}),{once:!0}),Br.default.addEventListener("push_notification_click",(e=>{if("push_settings"===e.action)return;if("mute1d"===e.action)return void this.managers.apiManager.invokeApi("account.updateDeviceLocked",{period:86400}).then((()=>{}));const t=e.custom&&e.custom.peerId.toPeerId();console.log("click",e,t),t&&this.topMessagesDeferred.then((()=>zr(this,void 0,void 0,(function*(){const i=t.isAnyChat()?t.toChatId():void 0;i&&!(yield this.managers.appChatsManager.hasChat(i))||t.isUser()&&!(yield this.managers.appUsersManager.hasUser(t.toUserId()))||id.setInnerPeer({peerId:t,lastMsgId:(0,yt.Z)(+e.custom.msg_id)})}))))}))}buildNotification({message:e,fwdCount:t,peerReaction:i,peerTypeNotifySettings:s}){return zr(this,void 0,void 0,(function*(){const n=e.peerId,a=n.isAnyChat(),o={},[r,d=!1]=yield Promise.all([this.managers.appPeersManager.getPeerString(n),a&&this.managers.appPeersManager.isForum(n)]);let l,c=!1;if(s.show_previews)if("message"===e._&&e.fwd_from&&t>1)l=L.ZP.format("Notifications.Forwarded",!0,[t]);else{l=yield(0,V.Z)({message:e,plain:!0});const t=null==i?void 0:i.reaction;if("reactionEmoji"===(null==t?void 0:t._)){const e="Notification.Contact.Reacted",i=[(0,Nr.Z)(t.emoticon),l];l=L.ZP.format(e,!0,i)}else c=!0}else l=L.ZP.format("Notifications.New",!0);i&&(o.noIncrement=!0,o.silent=!0);const h={plainText:!0,managers:this.managers},u=d?(0,b.Z)(e,d):void 0,p=i?(0,R.Z)(i.peer_id):e.fromId,f=o.title=yield(0,Fr.Z)(Object.assign(Object.assign({},h),{peerId:n,threadId:u}));if(d){const t=yield(0,Fr.Z)(Object.assign(Object.assign({},h),{peerId:n}));o.title+=` (${t})`,c&&p!==e.peerId&&(l=(yield(0,Fr.Z)(Object.assign(Object.assign({},h),{peerId:p})))+": "+l)}else a&&p!==e.peerId&&(o.title=(yield(0,Fr.Z)(Object.assign(Object.assign({},h),{peerId:p})))+" @ "+o.title);o.title=(0,Ur.Z)(o.title),o.onclick=()=>{id.setInnerPeer({peerId:n,lastMsgId:e.mid,threadId:u})},o.message=l,o.key="msg"+e.mid,o.tag=r,o.silent=!0;const m=yield this.managers.appPeersManager.getPeerPhoto(n);if(m){const t=yield this.managers.appAvatarsManager.loadAvatar(n,m,"photo_small");if(!(i||(e=yield this.managers.appMessagesManager.getMessageByPeer(e.peerId,e.mid))&&e.pFlags.unread))return;o.image=t}else{let{avatarCanvas:e,avatarContext:t}=this;if(this.avatarCanvas)t.clearRect(0,0,e.width,e.height);else{e=this.avatarCanvas=document.createElement("canvas"),t=this.avatarContext=e.getContext("2d");const i=54,s=1;e.dpr=s,e.width=e.height=i*s,this.avatarGradients={}}const i=(0,U.Z)(n,!0);let s=this.avatarGradients[i];if(!s){s=this.avatarGradients[i]=t.createLinearGradient(e.width/2,0,e.width/2,e.height);const n=Do.Z.getProperty(`peer-avatar-${i}-top`),a=Do.Z.getProperty(`peer-avatar-${i}-bottom`);s.addColorStop(0,n),s.addColorStop(1,a)}t.fillStyle=s,(0,Rr.Z)(t,e.width/2,e.height/2,e.width/2),t.fill();const a=20*e.dpr,r=(0,Or.Z)(f);t.font=`700 ${a}px ${Tt.bt}`,t.textBaseline="middle",t.textAlign="center",t.fillStyle="white",t.fillText(r.text,e.width/2,e.height*(window.devicePixelRatio>1?.5625:5)),o.image=e.toDataURL()}const g={custom:{msg_id:""+e.mid,peerId:""+n},description:"",loc_key:"",loc_args:[],mute:"",random_id:0,title:""};(yield this.notify(o,g))&&this.registeredDevice&&Br.default.ignorePushByMid(n,e.mid)}))}toggleToggler(e=wt.Z.isIdle){if(x.IS_MOBILE)return;const t=e=>{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=L.ZP.format("Notifications.Count",!0,[e]);const t=document.createElement("canvas");t.width=32*window.devicePixelRatio,t.height=t.width;const i=t.getContext("2d");i.beginPath(),i.arc(t.width/2,t.height/2,t.width/2,0,2*Math.PI,!1),i.fillStyle="#3390ec",i.fill();let s=24,n=""+e;e<10?s=22:e<100?s=20:(n="99+",s=16),s*=window.devicePixelRatio,i.font=`700 ${s}px ${Tt.bt}`,i.textBaseline="middle",i.textAlign="center",i.fillStyle="white",i.fillText(n,t.width/2,.5625*t.height),this.setFavicon(t.toDataURL())}else this.toggleToggler(!1)}),1e3):t()}setFavicon(e){this.prevFavicon!==e&&(this.prevFavicon=e,this.faviconElements.forEach(((t,i,s)=>{var n;const a=t.cloneNode();(n=a.dataset).href||(n.href=a.href),null!=e||(e=a.dataset.href),a.href=e,t.replaceWith(s[i]=a)})))}notify(e,t){var i;return zr(this,void 0,void 0,(function*(){if(this.log("notify",e,wt.Z.isIdle,this.notificationsUiSupport,this.stopped),this.stopped)return;e.image||(e.image="assets/img/logo_filled_rounded.png"),e.noIncrement||++this.notificationsCount,this.titleInterval||this.toggleToggler();const s=++this.notificationIndex,n=e.key||"k"+s;this.notificationsShown[n]=!0;const a=(0,Ht.Z)();if(this.settings.volume>0&&!this.settings.nosound&&(this.testSound(this.settings.volume),this.soundsPlayed[e.tag]=a),!this.notificationsUiSupport||"Notification"in window&&"granted"!==Notification.permission)return;if(this.settings.nodesktop)return this.vibrateSupport&&!this.settings.novibrate?void navigator.vibrate([200,100,200]):void 0;if(!("Notification"in window))return;let o;const r={badge:"assets/img/logo_plain.svg",icon:e.image||"",body:e.message||"",tag:e.tag||"",silent:e.silent||!1,data:t};try{if(e.tag)for(const t in this.notificationsShown){const i=this.notificationsShown[t];"boolean"!=typeof i&&i.tag===e.tag&&(i.hidden=!0)}o=new Notification(e.title,r)}catch(t){try{const t=yield navigator.serviceWorker.ready;yield t.showNotification(e.title,r);const i=yield t.getNotifications({tag:r.tag});o=i[i.length-1]}catch(t){this.log.error("creating push error",t,e,r)}if(!o)return this.notificationsUiSupport=!1,void Br.default.setLocalNotificationsDisabled()}return o.onclick=()=>{var t;this.log("notification onclick"),o.close(),Hr.Z.focus(),this.clear(),null===(t=e.onclick)||void 0===t||t.call(e)},o.onclose=()=>{this.log("notification onclose"),o.hidden||(delete this.notificationsShown[n],this.clear())},null===(i=o.show)||void 0===i||i.call(o),this.notificationsShown[n]=o,x.IS_MOBILE||setTimeout((()=>{this.hide(n)}),8e3),!0}))}getLocalSettings(){return this.settings}hide(e){const t=this.notificationsShown[e];t&&this.closeNotification(t)}soundReset(e){delete this.soundsPlayed[e]}testSound(e){const t=(0,Ht.Z)();if(this.nextSoundAt&&t\n \n `,this.notifySoundEl.append(s),s.addEventListener("ended",(()=>{s.remove()}),{once:!0})}cancel(e){const t=this.notificationsShown[e];this.log("cancel",e,t),t&&(this.notificationsCount>0&&--this.notificationsCount,this.closeNotification(t),delete this.notificationsShown[e])}closeNotification(e){try{"boolean"!=typeof e&&e.close&&(this.log("close notification",e),e.hidden=!0,e.close())}catch(e){}}clear(){this.log.warn("clear");for(const e in this.notificationsShown){const t=this.notificationsShown[e];this.closeNotification(t)}this.notificationsShown={},this.notificationsCount=0,Br.default.hidePushNotifications()}start(){if(this.log("start"),this.updateLocalSettings(),d.Z.addEventListener("settings_updated",this.updateLocalSettings),Br.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.log("stop"),this.clear(),window.clearInterval(this.titleInterval),this.titleInterval=0,this.setFavicon(),this.stopped=!0}registerDevice(e){if(this.registeredDevice&&(0,go.Z)(this.registeredDevice,e))return!1;this.managers.apiManager.invokeApi("account.registerDevice",{token_type:e.tokenType,token:e.tokenValue,other_uids:[],app_sandbox:!1,secret:new Uint8Array}).then((()=>{this.log("registered device"),this.registeredDevice=e}),(e=>{e.handled=!0}))}unregisterDevice(e){if(!this.registeredDevice)return!1;this.managers.apiManager.invokeApi("account.unregisterDevice",{token_type:e.tokenType,token:e.tokenValue,other_uids:[]}).then((()=>{this.registeredDevice=!1}),(e=>{e.handled=!0}))}};ge.GO&&(ge.GO.uiNotificationsManager=jr);const Gr=jr;var Vr=i(236),Kr=i(5936),Wr=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function $r(e,t=!1){return Wr(this,void 0,void 0,(function*(){const i=[],s=(e,n)=>Wr(this,void 0,void 0,(function*(){if(e.isDirectory){const t=e.createReader();yield new Promise(((e,i)=>{t.readEntries((t=>Wr(this,void 0,void 0,(function*(){for(const e of t)yield s(e,n);e()}))))}))}else if(e)if(t)i.push(e.type);else{const t=n.getAsFile(),s=e instanceof File?e:e instanceof DataTransferItem?e.getAsFile():yield new Promise(((i,s)=>e.file(i,(e=>i(t)))));if(!s)return;i.push(s)}}));if(e instanceof DragEvent&&e.dataTransfer.files&&!e.dataTransfer.items)for(let s=0;s{!e.noCancelEvent&&(0,Ce.Z)(null);let i,s,n=t.href;const a=new URL(n),o=a.host.match(/(.+?)\.t(?:elegram)?\.me/);o&&!m.BX.has(o[1])&&(a.pathname=o[1]+("/"===a.pathname?"":a.pathname),n=a.toString()),e.noPathnameParams||(i=new URL(n).pathname.split("/").slice(1)),e.noUriParams||(s=(0,qr.Z)(n));const r=e.callback({pathnameParams:i,uriParams:s},t);return void 0===r&&r}}var Qr,Xr=i(9439),Jr=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};!function(e){e[e.CHATLIST=0]="CHATLIST",e[e.CHAT=1]="CHAT",e[e.PROFILE=2]="PROFILE"}(Qr||(Qr={}));class ed extends l.Z{constructor(){super(...arguments),this.columnEl=document.getElementById("column-center"),this.offline=!1,this.updateStatusInterval=0,this.setPeerPromise=null,this.chats=[],this.cacheStorage=new Kr.Z("cachedFiles"),this.onHashChange=e=>{try{this.onHashChangeUnsafe(e)}catch(e){this.log.error("hash change error",e)}},this.onHashChangeUnsafe=e=>{const t=location.hash;e||Un.Z.replaceState();const i=t.split("?"),s=(0,qr.Z)(t,i);if(this.log("hashchange",t,i[0],s),t)if(s.tgaddr)this.openUrl(s.tgaddr);else switch(i[0]){default:s.p=i[0].slice(1);case"#/im":{if(!Object.keys(s).length)break;const e=s.p,t=void 0!==s.post?(0,yt.Z)(+s.post):void 0;"@"===e[0]?this.openUsername({userName:e,lastMsgId:t}):this.setInnerPeer({peerId:t?e.toPeerId(!0):e.toPeerId(),lastMsgId:t})}}},this.setSettings=()=>{const{messagesTextSize:e}=d.Z.settings;this.customEmojiSize=(0,qe.C)(e+4,e+4),document.documentElement.style.setProperty("--messages-text-size",e+"px"),this.customEmojiSize&&(document.querySelectorAll("middle-ellipsis-element").forEach((t=>{t.disconnectedCallback(),t.dataset.fontSize=""+e,t.title&&(t.textContent=t.title),t.connectedCallback()})),document.querySelectorAll(".chat custom-emoji-renderer-element").forEach((e=>{e.forceRenderAfterSize=!0}))),document.body.classList.toggle("animation-level-0",!d.Z.settings.animationsEnabled),document.body.classList.toggle("animation-level-1",!1),document.body.classList.toggle("animation-level-2",d.Z.settings.animationsEnabled),this.chatsSelectTabDebounced=(0,Ze.Z)((()=>{var e;null===(e=this.chat.topbar.pinnedMessage)||void 0===e||e.setCorrectIndex(0),this.managers.apiFileManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId)}),d.Z.settings.animationsEnabled?250:0,!1,!0),Rs.Z.setLoop(d.Z.settings.stickers.loop)&&s.Z.checkAnimations2(!1);for(const e of this.chats)e.setAutoDownloadMedia();L.ZP.setTimeFormat(d.Z.settings.timeFormat),this.toggleChatGradientAnimation(this.chat)},this.onDocumentPaste=(e,t)=>Jr(this,void 0,void 0,(function*(){const i=An();if(e instanceof DragEvent){const t=e.dataTransfer.types;(t.contains?t.contains("Files"):t.indexOf("Files")>=0)&&(0,Ce.Z)(e)}const s=yield $r(e);if(((yield this.canDrag())||i)&&s.length){if(i)return void i.addFiles(s);const e=this.chat.input;e.willAttachType=t||(vn.Z.has(s[0].type)?"media":"document"),S.Z.createPopup(_n,this.chat,s,e.willAttachType)}}))}get myId(){return d.Z.myId}get chat(){return this.chats[this.chats.length-1]}construct(e){this.managers=e;const{apiUpdatesManager:t}=e;t.attach(L.ZP.lastRequestedLangCode),ya.Z.construct(e),Gr.construct(e),Gr.start(),this.log=(0,r.kg)("IM",r.v9.Log|r.v9.Warn|r.v9.Debug|r.v9.Error),this.backgroundPromises={},Vr.h.settings.themes.forEach((e=>{const t=e.settings;if(!t)return;const{wallpaper:i}=t,s=i.slug;if(!s)return;const n="assets/img/"+s+".svg"+(x.IS_FIREFOX?"?1":"");this.backgroundPromises[s]=Promise.resolve(n)})),this.selectTab(Qr.CHATLIST),wt.Z.addEventListener("change",(e=>{this.offline=e,this.updateStatus(),e?clearInterval(this.updateStatusInterval):this.updateStatusInterval=window.setInterval((()=>this.updateStatus()),5e4)})),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(o.Z.activeScreen),this.columnEl.append(this.chatsContainer),this.createNewChat(),this.chatsSelectTab(this.chat.container),Un.Z.onHashChange=this.onHashChange,this.setSettings(),d.Z.addEventListener("settings_updated",this.setSettings);const i=e=>{document.body.classList.toggle("is-premium",e)};d.Z.addEventListener("premium_toggle",i),i(d.Z.premium),this.managers.rootScope.getPremium().then(i),(0,pe.ZP)((()=>{s.Z.setOnlyOnePlayableGroup("lock"),s.Z.checkAnimations2(!0)}),(()=>{s.Z.setOnlyOnePlayableGroup(),s.Z.checkAnimations2(!1)})),yo.Z.AppBackgroundTab=Xr.Z,x.IS_FIREFOX&&Sn.Z.oldVersion&&-1===(0,_r.Z)(Sn.Z.oldVersion,"1.4.3")?this.deleteFilesIterative((e=>"image/svg+xml"===e.headers.get("Content-Type"))).then((()=>{this.applyCurrentTheme()})):this.applyCurrentTheme(),o.Z.addEventListener("changeScreen",((e,t)=>{document.body.classList.contains(n.ir)&&document.body.classList.contains(a.HQ)&&a.ZP.toggleSidebar(!1),this.appendEmojiAnimationContainer(t)})),o.Z.addEventListener("resize",(()=>{const e=this.chatsContainer.getBoundingClientRect();bo.resizeInstances(e.width,e.height).then((()=>{}))})),this.addEventListener("peer_changing",(e=>{this.saveChatPosition(e)})),d.Z.addEventListener("theme_change",(()=>{this.applyCurrentTheme()})),d.Z.addEventListener("choosing_sticker",(e=>{this.setChoosingStickerTyping(!e)})),d.Z.addEventListener("peer_title_edit",(({peerId:e,threadId:t})=>{var i;(null===(i=this.chat)||void 0===i?void 0:i.peerId)!==e||t||void 0===this.tabId||this.overrideHash(e)})),d.Z.addEventListener("peer_typings",(({peerId:e,typings:t})=>{var i;const s=this.chat;if(!s||s.peerId!==e||St.Z.isOverlayActive||o.Z.activeScreen===o._.mobile&&this.tabId!==Qr.CHAT)return;const n=t.find((e=>"sendMessageEmojiInteraction"===e.action._));if("sendMessageEmojiInteraction"===(null===(i=null==n?void 0:n.action)||void 0===i?void 0:i._)){const t=n.action,i=s.bubbles.bubbles[(0,yt.Z)(n.action.msg_id)];if(i&&i.classList.contains("emoji-big")&&(0,He.Z)(i,s.bubbles.scrollable.container)){const s=i.querySelector(".media-sticker-wrapper:not(.bubble-hover-reaction-sticker):not(.reaction-sticker)");JSON.parse(t.interaction.data).a.forEach((e=>{setTimeout((()=>{(0,C.tH)(s)}),1e3*e.t)})),this.managers.appMessagesManager.setTyping(e,{_:"sendMessageEmojiInteractionSeen",emoticon:t.emoticon})}}}));const l=e=>{const t="version"===e,i=new S.Z("popup-instance-deactivated",{overlayClosable:!0}),s=document.createElement("div");s.classList.add("instance-deactivated-container"),i.container.replaceWith(s);const n=document.createElement("div");n.classList.add("header"),n.append((0,L.ag)(t?"Deactivated.Version.Title":"Deactivated.Title"));const a=document.createElement("div");a.classList.add("subtitle"),a.append((0,L.ag)(t?"Deactivated.Version.Subtitle":"Deactivated.Subtitle")),s.append(n,a),document.body.classList.add("deactivated");const o=t?()=>{Hr.Z.reload()}:()=>{document.body.classList.add("deactivated-backwards"),To.Z.activateInstance(),setTimeout((()=>{document.body.classList.remove("deactivated","deactivated-backwards")}),333)};i.addEventListener("close",o),i.show()};To.Z.addEventListener("deactivated",l),To.Z.deactivatedReason&&l(To.Z.deactivatedReason),this.addEventListener("chat_changing",(({to:e})=>{this.toggleChatGradientAnimation(e)})),d.Z.addEventListener("service_notification",(e=>{(0,vi.Z)({button:{langKey:"OK",isCancel:!0},description:(0,ft.ZP)(e.message)})})),d.Z.addEventListener("payment_sent",(({peerId:e,mid:t,receiptMessage:i})=>Jr(this,void 0,void 0,(function*(){const s=yield this.managers.appMessagesManager.getMessageByPeer(e,t);if(!s)return;const n=i.action;(0,we.bC)({langPackKey:"PaymentInfoHint",langPackArguments:[(0,Pt.Z)(n.total_amount,n.currency),(0,B.Z)(s.media.title)]})})))),window.onSpoilerClick=e=>{const t=(0,be.Z)(e.target,"spoiler"),i=(0,be.Z)(t,"spoilers-container")||t.parentElement,s="is-spoiler-visible",n=i.classList.contains(s);n||((0,Ce.Z)(e),"click"!==C.pf&&window.addEventListener("click",Ce.Z,{capture:!0,once:!0}));const a=n?0:2;a&&i.classList.add("will-change");const o=i.dataset.spoilerTimeout;null!==o&&(clearTimeout(+o),delete i.dataset.spoilerTimeout),(0,Fe.Z)({element:i,className:s,forwards:!0,duration:200,onTransitionEnd:()=>{i.dataset.spoilerTimeout=""+window.setTimeout((()=>{(0,Fe.Z)({element:i,className:s,forwards:!1,duration:200,onTransitionEnd:()=>{i.classList.remove("will-change"),delete i.dataset.spoilerTimeout}})}),5e3)},useRafs:a})},d.Z.addEventListener("sticker_updated",(({type:e,faved:t})=>{"faved"===e?(0,we.bC)({langPackKey:t?"AddedToFavorites":"RemovedFromFavorites"}):t||(0,we.bC)({langPackKey:"RemovedFromRecent"})})),Sn.Z.addEventListener("notificationBuild",(e=>Jr(this,void 0,void 0,(function*(){const t=yield this.managers.appPeersManager.isForum(e.message.peerId),i=(0,b.Z)(e.message,t);(this.chat.peerId!==e.message.peerId||this.chat.threadId!==i||wt.Z.isIdle)&&Gr.buildNotification(e)})))),this.addEventListener("peer_changed",(({peerId:e})=>Jr(this,void 0,void 0,(function*(){document.body.classList.toggle("has-chat",!!e),this.emojiAnimationContainer.textContent="",this.overrideHash(e),Sn.Z.updateTabState("chatPeerIds",this.chats.map((e=>e.peerId)).filter(Boolean))})))),Po.Z.setToCache("chatPositions",{}),(Oe.Z||no.Z)&&(this.topbarCall=new xr(e)),Oe.Z&&(Tr.Z.addEventListener("instance",(({instance:e})=>{const t=new Mr(e);e.addEventListener("acceptCallOverride",(()=>this.discardCurrentCall(e.interlocutorUserId.toPeerId(),void 0,e).then((()=>(Tr.Z.dispatchEvent("accepting",e),!0))).catch((()=>!1)))),t.addEventListener("close",(()=>{const t=Tr.Z.currentCall;t&&t!==e&&!e.wasTryingToJoin&&e.hangUp("phoneCallDiscardReasonBusy")}),{once:!0}),t.show()})),Tr.Z.addEventListener("incompatible",(e=>Jr(this,void 0,void 0,(function*(){(0,we.bC)({langPackKey:"VoipPeerIncompatible",langPackArguments:[yield(0,Vt.Z)({peerId:e.toPeerId()})]})}))))),To.Z.activateInstance();const c=()=>{ko.default.setAuthorized(!0)};setInterval(c,_.s2),c(),Yr({name:"showMaskedAlert",callback:(e,t)=>{const i=t.href,s=t.cloneNode(!0);s.className="anchor-url",s.innerText=i,s.removeAttribute("onclick"),new xs.Z("popup-masked-url",{titleLangKey:"OpenUrlTitle",descriptionLangKey:"OpenUrlAlert2",descriptionLangArgs:[s],buttons:[{langKey:"Open",callback:()=>{s.click()}}]}).show()}}),Yr({name:"execBotCommand",callback:({uriParams:e})=>{const{command:t,bot:i}=e;this.managers.appMessagesManager.sendText(this.chat.peerId,"/"+t+(i?"@"+i:""))}}),Yr({name:"searchByHashtag",callback:({uriParams:e})=>{const{hashtag:t}=e;t&&this.chat.initSearch("#"+t+" ")}}),[["addstickers",ke.STICKER_SET],["addemoji",ke.EMOJI_SET]].forEach((([e,t])=>{Yr({name:e,callback:({pathnameParams:e})=>{if(!e[1])return;const i={_:t,set:e[1]};this.processInternalLink(i)}}),Yr({name:e,protocol:"tg",callback:({uriParams:e})=>{const i=this.makeLink(t,e);this.processInternalLink(i)}})})),Yr({name:"invoice",callback:({pathnameParams:e})=>{const t={_:ke.INVOICE,slug:e.length>1?e[1]:e[0].slice(1)};this.processInternalLink(t)}}),Yr({name:"joinchat",callback:({pathnameParams:e})=>{const t={_:ke.JOIN_CHAT,invite:e[1]||decodeURIComponent(e[0]).slice(1)};this.processInternalLink(t)}}),no.Z&&Yr({name:"voicechat",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(ke.VOICE_CHAT,e);this.processInternalLink(t)}}),Yr({name:"im",callback:({pathnameParams:e,uriParams:t},i)=>Jr(this,void 0,void 0,(function*(){let s;if(Ba.kO.test(e[0]))s={_:ke.USER_PHONE_NUMBER,phone:e[0].slice(1)};else if("c"===e[0]){e.shift();const n="thread"in t?t.thread:e[2]&&e[1];s={_:ke.PRIVATE_POST,channel:e[0],post:e[2]||e[1],thread:n,comment:t.comment,stack:this.getStackFromElement(i)}}else{const n="thread"in t?t.thread:e[2]&&e[1];s={_:ke.MESSAGE,domain:e[0],post:e[2]||e[1],thread:n,comment:t.comment,start:"start"in t?t.start:void 0,stack:this.getStackFromElement(i)}}this.processInternalLink(s)}))}),Yr({name:"resolve",protocol:"tg",callback:({uriParams:e},t)=>{let i;e.phone?i=this.makeLink(ke.USER_PHONE_NUMBER,e):"telegrampassport"===e.domain||(i=this.makeLink(ke.MESSAGE,Object.assign(Object.assign({},e),{stack:this.getStackFromElement(t)}))),this.processInternalLink(i)}}),Yr({name:"privatepost",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(ke.PRIVATE_POST,e);this.processInternalLink(t)}}),Yr({name:"invoice",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(ke.INVOICE,e);this.processInternalLink(t)}}),["joinchat","join"].forEach((e=>{Yr({name:e,protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(ke.JOIN_CHAT,e);this.processInternalLink(t)}})})),this.onHashChange(!0),this.attachKeydownListener(),this.handleAutologinDomains(),this.checkForShare()}checkForShare(){const e=Sn.Z.share;e&&(Sn.Z.share=void 0,new M.Z(void 0,(t=>Jr(this,void 0,void 0,(function*(){var i;if(yield this.setPeer({peerId:t}),null===(i=e.files)||void 0===i?void 0:i.length){const t=e.files.some((e=>vn.Z.has(e.type)));new _n(this.chat,e.files,t?"media":"document")}else this.managers.appMessagesManager.sendText(t,e.text)})))))}handleUrlAuth(e){const{peerId:t,mid:i,buttonId:s,url:n}=e,a=e=>{window.open(e,"_blank")},o=e=>Jr(this,void 0,void 0,(function*(){if("urlAuthResultRequest"===e._){const r=document.createElement("b");r.append(e.domain);const l=yield(0,Vt.Z)({peerId:d.Z.myId}),c=yield(0,Vt.Z)({peerId:e.bot.id.toPeerId()}),h={text:"OpenUrlOption1",textArgs:[r.cloneNode(!0),l],checked:!0},u=e.pFlags.request_write_access?{text:"OpenUrlOption2",textArgs:[c],checked:!0}:void 0,p=[h,u],f=(0,vi.Z)({titleLangKey:"OpenUrlTitle",button:{langKey:"Open"},descriptionLangKey:"OpenUrlAlert2",descriptionLangArgs:[r],checkboxes:p.filter(Boolean)});u&&h.checkboxField.input.addEventListener("change",(()=>{const e=!h.checkboxField.checked;u.checkboxField.toggleDisability(e),e&&(u.checkboxField.checked=!1)}));const[m,g]=yield f;if(!m)return void a(n);const v=yield this.managers.appSeamlessLoginManager.acceptUrlAuth(n,t,i,s,g);return o(v)}"urlAuthResultAccepted"===e._?(e=>{a(e.url)})(e):a(n)}));return this.managers.appSeamlessLoginManager.requestUrlAuth(n,t,i,s).then((e=>{o(e)}))}handleAutologinDomains(){let e;d.Z.addEventListener("app_config",(t=>{e=t}));const t=t=>{var i,s;const n=new URL(t.href);if(e.url_auth_domains.includes(n.hostname))return this.handleUrlAuth({url:t.href}),void(0,Ce.Z)();if(!e.autologin_token||!e.autologin_domains)return;const a=null!==(i=(s=t.dataset).originalUrl)&&void 0!==i?i:s.originalUrl=t.href;e.autologin_domains.includes(n.hostname)&&(n.searchParams.set("autologin_token",e.autologin_token),t.href=n.toString(),setTimeout((()=>{t.href=a,delete t.dataset.originalUrl}),0))};document.addEventListener("click",(e=>{const i=(0,ye.Z)(e.target,"A");(null==i?void 0:i.href)&&t(i)}))}getStackFromElement(e){const t=(0,be.Z)(e,"bubble");return t?+t.dataset.mid:void 0}deleteFilesIterative(e){return this.cacheStorage.timeoutOperation((t=>{const i=performance.now();return t.keys().then((i=>{const s=i.map((i=>t.match(i).then((t=>e(t)))));return Promise.all(s).then((e=>(e.map(((e,s)=>{if(!e)return;const n=i[s];return t.delete(n)})),Promise.all(e.filter(Boolean)))))})).then((()=>{this.log("deleted files",performance.now()-i)}))}))}toggleChatGradientAnimation(e){this.chats.forEach((t=>{t.gradientRenderer&&t.gradientRenderer.scrollAnimate(d.Z.settings.animationsEnabled&&t===e)}))}appendEmojiAnimationContainer(e){const t=e===o._.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 i;const s=t.key,n=document.getSelection().isCollapsed;if(St.Z.isOverlayActive||e.has(s))return;const a=t.target,r=this.chat;if((!(s.startsWith("Arrow")||t.shiftKey&&"Shift"===s)||n)&&("KeyC"!==t.code||!t.ctrlKey&&!t.metaKey||"INPUT"===a.tagName)){if(!t.altKey||"ArrowUp"!==s&&"ArrowDown"!==s){if("ArrowUp"===s&&"scheduled"!==this.chat.type){if(r.input.editMsgId||!r.input.isInputEmpty())return;this.managers.appMessagesManager.getFirstMessageToEdit(r.peerId,r.threadId).then((e=>{e&&(r.input.initMessageEditing(e.mid),(0,Ce.Z)(t))}))}else if("ArrowDown"===s)return}else(0,Ce.Z)(t),this.managers.dialogsStorage.getNextDialog(this.chat.peerId,"ArrowDown"===s,Ji.default.filterId).then((e=>{e&&this.setPeer({peerId:e.peerId})}));if((null===(i=null==r?void 0:r.input)||void 0===i?void 0:i.messageInput)&&t.target!==r.input.messageInput&&"INPUT"!==a.tagName&&!a.isContentEditable&&!c.Z&&(!o.Z.isMobile||this.tabId===Qr.CHAT)&&!r.selection.isSelecting&&!r.input.recording){r.input.messageInput.focus(),(0,Nt.Z)(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 Jr(this,void 0,void 0,(function*(){switch(null==e?void 0:e._){case ke.MESSAGE:{const t=e.post?(0,yt.Z)(+e.post):void 0,i=e.comment?(0,yt.Z)(+e.comment):void 0,s=e.thread?(0,yt.Z)(+e.thread):void 0;this.openUsername({userName:e.domain,lastMsgId:t,commentId:i,startParam:e.start,stack:e.stack,threadId:s});break}case ke.PRIVATE_POST:{const t=e.channel.toChatId(),i=(t.toPeerId(!0),yield this.managers.appChatsManager.getChat(t));if(!i)try{yield this.managers.appChatsManager.resolveChannel(t)}catch(e){throw(0,we.bC)({langPackKey:"LinkNotFound"}),e}const s=(0,yt.Z)(+e.post),n=e.thread?(0,yt.Z)(+e.thread):void 0;this.op({peer:i,lastMsgId:s,threadId:n,stack:e.stack});break}case ke.EMOJI_SET:case ke.STICKER_SET:new P.Z({id:e.set},e._===ke.EMOJI_SET).show();break;case ke.JOIN_CHAT:this.managers.appChatsManager.checkChatInvite(e.invite).then((t=>{t.chat&&this.managers.appChatsManager.saveApiChat(t.chat,!0),"chatInviteAlready"!==t._&&"chatInvitePeek"!==t._?new Ge(e.invite,t):this.setInnerPeer({peerId:t.chat.id.toPeerId(!0)})}),(e=>{"INVITE_HASH_EXPIRED"===e.type&&(0,we.Am)((0,L.ag)("InviteExpired"))}));break;case ke.VOICE_CHAT:no.Z&&this.joinGroupCall(e.chat_id.toPeerId(!0),e.id);break;case ke.USER_PHONE_NUMBER:this.managers.appUsersManager.resolvePhone(e.phone).then((e=>{this.setInnerPeer({peerId:e.id.toPeerId(!1)})})).catch((e=>{"PHONE_NOT_OCCUPIED"===e.type&&(0,we.bC)({langPackKey:"Alert.UserDoesntExists"})}));break;case ke.INVOICE:this.managers.appPaymentsManager.getInputInvoiceBySlug(e.slug).then((e=>{this.managers.appPaymentsManager.getPaymentForm(e).then((t=>{new Ui(void 0,e,t)}))}));break;default:this.log.warn("Not supported internal link:",e)}}))}openUrl(e){const{url:t,onclick:i}=(0,fs.Z)(e);if(!i)return;const s=document.createElement("a");s.href=t,window[i](s)}op(e){return Jr(this,void 0,void 0,(function*(){let{peer:t,commentId:i,threadId:s,lastMsgId:n}=e;const a="user"===t._,o=t.id.toPeerId(!a),r="channel"===t._&&t.pFlags.forum;if(i||s||n||!r){if(r&&n&&!s){const t=yield this.managers.appMessagesManager.reloadMessages(o,n);t?s=e.threadId=(0,b.Z)(t,r):(s=e.threadId=n,n=e.lastMsgId=void 0)}return s?this.openThread(Object.assign(Object.assign({},e),{peerId:o})):i?this.openComment({peerId:o,msgId:n,commentId:i}):this.setInnerPeer(Object.assign(Object.assign({},e),{peerId:o}))}Ji.default.toggleForumTabByPeerId(o,!0)}))}openPremiumBot(){return this.managers.apiManager.getAppConfig().then((e=>this.openUsername({userName:e.premium_bot_username})))}openUsername(e){const{userName:t}=e;return this.managers.appUsersManager.resolveUsername(t).then((t=>this.op(Object.assign({peer:t},e))),(e=>{"USERNAME_NOT_OCCUPIED"===e.type?(0,we.bC)({langPackKey:"NoUsernameFound"}):"USERNAME_INVALID"===e.type&&(0,we.bC)({langPackKey:"Alert.UserDoesntExists"})}))}openThread(e){return Jr(this,void 0,void 0,(function*(){return(yield this.managers.appChatsManager.isForum(e.peerId.toChatId()))?(yield this.managers.dialogsStorage.getForumTopicOrReload(e.peerId,e.threadId),this.setInnerPeer(e)):this.managers.appMessagesManager.reloadMessages(e.peerId,e.threadId).then((t=>(t?this.managers.appMessagesManager.generateThreadServiceStartMessage(t):e.lastMsgId=void 0,this.setInnerPeer(Object.assign(Object.assign({},e),{type:"discussion"})))))}))}openComment(e){return this.managers.appMessagesManager.getDiscussionMessage(e.peerId,e.msgId).then((t=>this.openThread({peerId:t.peerId,lastMsgId:e.commentId,threadId:t.mid})))}callUser(e,t){return Jr(this,void 0,void 0,(function*(){Tr.Z.getCallByUserId(e)||((yield this.managers.appProfileManager.getProfile(e)).pFlags.phone_calls_private?(0,Vt.Z)({peerId:e.toPeerId()}).then((e=>(0,vi.Z)({descriptionLangKey:"Call.PrivacyErrorMessage",descriptionLangArgs:[e],button:{langKey:"OK",isCancel:!0}}))):(yield this.discardCurrentCall(e.toPeerId()),Tr.Z.startCallInternal(e,"video"===t)))}))}discardCurrentCall(e,t,i){return ro.ZP.groupCall&&ro.ZP.groupCall!==t?this.discardGroupCallConfirmation(e):Tr.Z.currentCall&&Tr.Z.currentCall!==i?this.discardCallConfirmation(e):Promise.resolve()}discardCallConfirmation(e){return Jr(this,void 0,void 0,(function*(){const t=Tr.Z.currentCall;t&&(yield Promise.all([(0,Vt.Z)({peerId:t.interlocutorUserId.toPeerId(!1)}),(0,Vt.Z)({peerId:e})]).then((([t,i])=>(0,vi.Z)({titleLangKey:"Call.Confirm.Discard.Call.Header",descriptionLangKey:e.isUser()?"Call.Confirm.Discard.Call.ToCall.Text":"Call.Confirm.Discard.Call.ToVoice.Text",descriptionLangArgs:[t,i],button:{langKey:"OK"}}))),t.isClosing||(yield t.hangUp("phoneCallDiscardReasonDisconnect")))}))}discardGroupCallConfirmation(e){return Jr(this,void 0,void 0,(function*(){const t=ro.ZP.groupCall;t&&(yield Promise.all([(0,Vt.Z)({peerId:t.chatId.toPeerId(!0)}),(0,Vt.Z)({peerId:e})]).then((([t,i])=>(0,vi.Z)({titleLangKey:"Call.Confirm.Discard.Voice.Header",descriptionLangKey:e.isUser()?"Call.Confirm.Discard.Voice.ToCall.Text":"Call.Confirm.Discard.Voice.ToVoice.Text",descriptionLangArgs:[t,i],button:{langKey:"OK"}}))),ro.ZP.groupCall===t&&(yield t.hangUp()))}))}joinGroupCall(e,t){return Jr(this,void 0,void 0,(function*(){const i=e.toChatId(),s=this.managers.appChatsManager.hasRights(i,"manage_call");if(t&&"groupCallDiscarded"===(yield this.managers.appGroupCallsManager.getGroupCallFull(t))._){if(!s)return void(0,we.bC)({langPackKey:"VoiceChat.Chat.Ended"});yield(0,vi.Z)({descriptionLangKey:"VoiceChat.Chat.StartNew",button:{langKey:"VoiceChat.Chat.StartNew.OK"}})}(()=>{Jr(this,void 0,void 0,(function*(){const e=yield this.managers.appProfileManager.getChatFull(i);let t;if(e.call)t=e.call;else{if(!s)return;t=yield this.managers.appGroupCallsManager.createGroupCall(i)}ro.ZP.joinGroupCall(i,t.id,!0,!1)}))})()}))}setCurrentBackground(e=!1){var t,i;const s=yo.Z.getTheme(),n=null===(i=null===(t=s.settings)||void 0===t?void 0:t.wallpaper)||void 0===i?void 0:i.slug;if(n){const t=Vr.h.settings.themes.find((e=>e.name===s.name));return this.getBackground(n).then((t=>this.setBackground(t,e)),(()=>(s.settings=(0,Ca.Z)(t.settings),this.setCurrentBackground(!0))))}return this.setBackground("",e)}getBackground(e){return this.backgroundPromises[e]?this.backgroundPromises[e]:this.backgroundPromises[e]=this.cacheStorage.getFile("backgrounds/"+e).then((e=>URL.createObjectURL(e)))}setBackground(e,t=!0){this.lastBackgroundUrl=e;const i=this.chats.map((t=>t.setBackground(e)));return i[i.length-1].then((()=>{t&&d.Z.dispatchEvent("background_change")}))}saveChatPosition(e){if(!["chat","discussion"].includes(e.type)||!e.peerId)return;const t=e.bubbles,i=e.peerId+(e.threadId?"_"+e.threadId:""),s=Po.Z.getFromCache("chatPositions");if(t.scrollable.getDistanceToEnd()<=16&&t.scrollable.loadedAll.bottom||!t.getRenderedLength())delete s[i],this.log("deleted chat position");else{t.sliceViewport(!0);const e=t.scrollable.scrollTop,n={mids:(0,ot.Z)(t.bubbles,"desc").filter((e=>e>0&&!t.skippedMids.has(e))),top:e};s[i]=n,this.log("saved chat position:",n)}Po.Z.set({chatPositions:s},!0)}getChatSavedPosition(e){if(!["chat","discussion"].includes(e.type)||!e.peerId)return;const t=e.peerId+(e.threadId?"_"+e.threadId:""),i=Po.Z.getFromCache("chatPositions");return i&&i[t]}applyCurrentTheme(e,t,i){return t&&(this.backgroundPromises[e]=Promise.resolve(t)),yo.Z.setTheme(),this.setCurrentBackground(void 0===i?!!e:i)}chatsSelectTab(e,t){if(this.prevTab!==e){if(!1===t&&this.prevTab&&Zo([e,this.prevTab].filter(Boolean)),this.prevTab){this.prevTab.classList.remove("active"),this.chatsSelectTabDebounced(),d.Z.settings.animationsEnabled&&!1!==t&&(0,pe.YW)((0,nt.Z)(400),400);const i=(0,Ie.Z)(this.prevTab);(0,Ie.Z)(e)>i&&Un.Z.pushItem({type:"chat",onPop:e=>{this.setPeer({},e),(0,qn.Z)()}})}e.classList.add("active"),this.prevTab=e}}init(){document.addEventListener("paste",this.onDocumentPaste,!0),c.Z||this.attachDragAndDropListeners(),this.markupTooltip=new Eo(this),this.markupTooltip.handleSelection()}attachDragAndDropListeners(){const e=[],t=[];let i=!1;const s=(r,d)=>Jr(this,void 0,void 0,(function*(){if(d===i)return;const l=r.dataTransfer.types,c=l.contains?l.contains("Files"):l.indexOf("Files")>=0,h=An(),u=yield $r(r,!0);if(!c||!(yield this.canDrag())&&!h)return void(n=0);const p=h?o:a,f=h?t:e;if(d&&!f.length){const e=c&&!u.length,t=u.filter((e=>vn.Z.has(e))).length;this.log("drag files",u),h?(h.appendDrops(p),(u.length||e)&&f.push(new Mo(p,{header:"Preview.Dragging.AddItems",headerArgs:[u.length],onDrop:e=>{s(e,!1),this.log("drop",e),this.onDocumentPaste(e,"document")}}))):((u.length||e)&&f.push(new Mo(p,{icon:"dragfiles",header:"Chat.DropTitle",subtitle:"Chat.DropAsFilesDesc",onDrop:e=>{s(e,!1),this.log("drop",e),this.onDocumentPaste(e,"document")}})),(t||e)&&f.push(new Mo(p,{icon:"dragmedia",header:"Chat.DropTitle",subtitle:"Chat.DropQuickDesc",onDrop:e=>{s(e,!1),this.log("drop",e),this.onDocumentPaste(e,"media")}})),this.chat.container.append(p))}(0,Fe.Z)({element:p,className:"is-visible",forwards:d,duration:200,onTransitionEnd:()=>{d||(f.forEach((e=>{e.destroy()})),f.length=0)}}),d?f.forEach((e=>{e.setPath()})):n=0,document.body.classList.toggle("is-dragging",d),i=d}));let n=0;document.body.addEventListener("dragenter",(e=>{n++})),document.body.addEventListener("dragover",(e=>{s(e,!0),(0,Ce.Z)(e)})),document.body.addEventListener("dragleave",(e=>{n--,0===n&&s(e,!1)}));const a=document.createElement("div");a.classList.add("drops-container");const o=a.cloneNode(!0)}canDrag(){return Jr(this,void 0,void 0,(function*(){const e=this.chat;return!(!(null==e?void 0:e.peerId)||St.Z.isOverlayActive||!(yield e.canSend("send_media")))}))}overrideHash(e){return Jr(this,void 0,void 0,(function*(){let t;if(e){const i=yield this.managers.appPeersManager.getPeerUsername(e);t=i?"@"+i:""+e}Un.Z.overrideHash(t)}))}selectTab(e,t){var i;!1===t&&Zo([n.ZP.sidebarEl,this.columnEl,a.ZP.sidebarEl]),document.body.classList.toggle(n.ir,e===Qr.CHATLIST);const s=this.tabId;void 0!==s&&(this.overrideHash(e>Qr.CHATLIST?null===(i=this.chat)||void 0===i?void 0:i.peerId:void 0),this.dispatchEvent("tab_changing",e)),this.log("selectTab",e,s);let r=d.Z.settings.animationsEnabled?(0,fe.d1)():Promise.resolve();if(void 0!==s&&s!==e&&d.Z.settings.animationsEnabled&&!1!==t){const e=100+(o.Z.isMobile?250:200);r=(0,nt.Z)(e),(0,pe.YW)(r,e)}this.tabId=e,(0,qn.Z)(),o.Z.isMobile&&s===Qr.PROFILE&&es&&(e{this.setPeer({},e)}});const l=window.onImTabChange;return l&&l(e),r}updateStatus(){return this.managers.appUsersManager.updateMyOnlineStatus(this.offline)}createNewChat(){const e=new So(this,this.managers);return this.chats.length&&e.setBackground(this.lastBackgroundUrl,!0),this.chats.push(e),e}spliceChats(e,t=!0,i,s){if(e>=this.chats.length)return;const n=this.chat;this.chats.length>1&&t&&this.dispatchEvent("peer_changing",this.chat),s||(s=this.chats.splice(e,this.chats.length-e));const o=this.chat;this.dispatchEvent("chat_changing",{from:n,to:o});for(let e=0;e1&&s.slice(0,-1).forEach((e=>{e.container.remove()})),this.chatsSelectTab(o.container,i),t){this.dispatchEvent("peer_changed",o);const e=a.ZP.getTab(po);null==e||e.close(),a.ZP.replaceSharedMediaTab(o.sharedMediaTab)}s.forEach((e=>{e.beforeDestroy()})),setTimeout((()=>{s.forEach((e=>{e.destroy()}))}),350)}setPeer(e={},t){var i;return Jr(this,void 0,void 0,(function*(){this.init&&(this.init(),this.init=null),null!==(i=e.peerId)&&void 0!==i||(e.peerId=m.NM);const{peerId:s,lastMsgId:a,threadId:r}=e,d=this.chat,l=this.chats.indexOf(d),c=this.isSamePeer(d,e);if(s){if(l>0&&d.peerId&&!c){const t=this.chats.splice(1,this.chats.length-1);if(this.chat.peerId===s)return void this.spliceChats(0,!0,!0,t);{const i=this.setPeer(e);return this.spliceChats(0,!1,!1,t),i}}}else{if(l>0)return void this.spliceChats(l,void 0,t);if(o.Z.activeScreen===o._.medium)return void this.selectTab(+!this.tabId,t)}if(c&&o.Z.activeScreen<=o._.medium&&document.body.classList.contains(n.ir))return this.selectTab(Qr.CHAT,t),!1;if(s||o.Z.activeScreen!==o._.mobile){const i=yield d.setPeer(e),n=(null==i?void 0:i.cached)?i.promise:Promise.resolve();s&&Promise.all([n,d.setBackgroundPromise]).then((()=>{setTimeout((()=>{setTimeout((()=>{this.chatsSelectTab(this.chat.container)}),0),this.selectTab(Qr.CHAT,t)}),0)}))}return s?void 0:(this.selectTab(Qr.CHATLIST,t),!1)}))}setInnerPeer(e){var t;return Jr(this,void 0,void 0,(function*(){const{peerId:i}=e;if(i===m.NM||!i)return;e.type||(e.threadId&&!(yield this.managers.appPeersManager.isForum(e.peerId))&&(e.type="discussion"),null!==(t=e.type)&&void 0!==t||(e.type="chat"));const s=this.chats.findIndex((t=>this.isSamePeer(t,e)||o.Z.activeScreen===o._.mobile&&0===this.tabId));if(-1!==s)return this.spliceChats(s+1),this.setPeer(e);const n=this.chat;let a=n;return n.inited&&(a=this.createNewChat()),this.dispatchEvent("chat_changing",{from:n,to:a}),this.setPeer(e)}))}openScheduled(e){this.setInnerPeer({peerId:e,type:"scheduled"})}getTypingElement(e){const t=document.createElement("span");let i="peer-typing";switch(t.classList.add(i),t.dataset.action=e._,e._){case"sendMessageTypingAction":i+="-text";for(let e=0;e<3;++e){const e=document.createElement("span");e.className=i+"-dot",t.append(e)}break;case"sendMessageUploadAudioAction":case"sendMessageUploadDocumentAction":case"sendMessageUploadRoundAction":case"sendMessageUploadVideoAction":case"sendMessageUploadPhotoAction":i+="-upload";break;case"sendMessageRecordAudioAction":case"sendMessageRecordRoundAction":case"sendMessageRecordVideoAction":i+="-record";break;case"sendMessageEmojiInteractionSeen":case"sendMessageChooseStickerAction":i+="-choosing-sticker";for(let e=0;e<2;++e){const e=document.createElement("div");e.className=i+"-eye",t.append(e)}}return t.classList.add(i),t}getPeerTyping(e,t,i){return Jr(this,void 0,void 0,(function*(){const s=e.isUser();if(s&&(yield this.managers.appUsersManager.isBot(e)))return;const n=yield this.managers.appProfileManager.getPeerTypings(e,i);if(!(null==n?void 0:n.length))return;const a=n[0],o={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"}},r=s?o.private:n.length>1?o.multi:o.chat;let d=a.action;if(n.length>1){const e={};n.forEach((t=>{const i=t.action._;void 0===e[i]&&(e[i]=0),++e[i]})),Object.keys(e).length>1&&(d={_:"sendMessageTypingAction"})}const l=r[d._];if(!l)return;let c,h;if(e.isAnyChat()){const e=new N.Z;c=e.update({peerId:a.userId.toPeerId(!1),onlyFirstName:!0}),h=[e.element,n.length-1],yield c}t||(t=document.createElement("span")).classList.add("online","peer-typing-container"),t.classList.toggle("peer-typing-flex","sendMessageChooseStickerAction"===d._||"sendMessageEmojiInteractionSeen"===d._);let u=t.firstElementChild;if(u?u.dataset.action!==d._&&u.replaceWith(this.getTypingElement(d)):(u=this.getTypingElement(d),t.prepend(u)),"sendMessageEmojiInteractionSeen"===d._){h?h.pop():h=[];const e=(0,Ar.Z)((0,B.Z)(d.emoticon));h.push(e)}const p=(0,L.ag)(l,h);return p.classList.add("peer-typing-description"),t.childElementCount>1?t.lastElementChild.replaceWith(p):t.append(p),t}))}getChatStatus(e,t){return Jr(this,void 0,void 0,(function*(){const i=t?void 0:yield this.getPeerTyping(e.toPeerId(!0));if(i)return{cached:!0,result:Promise.resolve(i)};const s=yield this.managers.acknowledged.appProfileManager.getChatFull(e),n=Promise.resolve(s.result).then((t=>Jr(this,void 0,void 0,(function*(){var i,s;const n=t.participants_count||(null===(s=null===(i=t.participants)||void 0===i?void 0:i.participants)||void 0===s?void 0:s.length)||1;let a=yield(0,ka.Z)(e);if(n<2)return a;const o=yield this.managers.appProfileManager.getOnlines(e);if(o>1){const e=document.createElement("span");e.append(...(0,L.v_)([a,(0,L.ag)("OnlineCount",[(0,ze.Z)(o)])],!1)),a=e}return a}))));return{cached:s.cached,result:n}}))}getUserStatus(e,t){var i;return Jr(this,void 0,void 0,(function*(){const s={cached:!0,result:Promise.resolve(void 0)},n=yield this.managers.appUsersManager.getUser(e);if(!n||n.pFlags.self&&!t)return s;const a=(0,Ks.Z)(n);if(!n.pFlags.bot&&!n.pFlags.support){let t=yield this.getPeerTyping(e.toPeerId());if(t||"userStatusOnline"!==(null===(i=n.status)||void 0===i?void 0:i._)||(t=document.createElement("span"),t.classList.add("online"),t.append(a)),t)return s.result=Promise.resolve(t),s}return s.result=Promise.resolve(a),s}))}getPeerStatus(e,t,i){return Jr(this,void 0,void 0,(function*(){if(!e)return;let s;return s=e.isAnyChat()?this.getChatStatus(e.toChatId(),i):this.getUserStatus(e.toUserId(),t),s}))}setPeerStatus(e){return Jr(this,void 0,void 0,(function*(){const{peerId:t,element:i,needClear:s,useWhitespace:n,middleware:a,ignoreSelf:o,noTyping:r}=e;if(!s){const e=i.querySelector(".peer-typing-container");if(e&&(yield this.getPeerTyping(t,e)))return}const d=yield this.getPeerStatus(t,o,r);if(!a())return;const l=()=>Jr(this,void 0,void 0,(function*(){const e=d&&(yield d.result);if(a())return()=>(0,H.Z)(i,e||c)})),c=n?"โ€Ž":"";return!d||d.cached||void 0===s?yield l():s?()=>(i.textContent=c,l().then((e=>null==e?void 0:e()))):void 0}))}setChoosingStickerTyping(e){this.managers.appMessagesManager.setTyping(this.chat.peerId,{_:e?"sendMessageCancelAction":"sendMessageChooseStickerAction"},void 0,this.chat.threadId)}isSamePeer(e,t){return e.peerId===t.peerId&&e.threadId===t.threadId&&(typeof e.type!=typeof t.type||e.type===t.type)}}const td=new ed;ge.GO&&(ge.GO.appImManager=td);const id=td},3709:(e,t,i)=>{"use strict";function s(e){var t;return e&&!e.pFlags.is_outgoing&&!e.pFlags.noforwards&&!(null===(t=e.media)||void 0===t?void 0:t.extended_media)}i.d(t,{Z:()=>s})},7530:(e,t,i)=>{"use strict";function s(e){var t;if(!e)return;let i;if(e.action)i=e.action.photo;else if(e.media){let s=e.media;s.webpage?s=s.webpage:"messageExtendedMedia"===(null===(t=s.extended_media)||void 0===t?void 0:t._)&&(s=s.extended_media.media),i=s.document||s.photo}return i}i.d(t,{Z:()=>s})},2291:(e,t,i)=>{"use strict";function s(e){var t;return e.fromId?{peerId:e.fromId}:{fromName:null===(t=e.fwd_from)||void 0===t?void 0:t.from_name}}i.d(t,{Z:()=>s})},5381:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(677);function n(e){return!(!e.restriction_reason||!(0,s.X)(e.restriction_reason))}},5990:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});const s=["#fc5c51","#0fb297","#d09306","#3d72ed","#895dd5","#cd4073","#00c1a6","#fa790f"],n=["red","green","yellow","blue","violet","pink","cyan","orange"],a=[0,7,4,1,6,3,5];function o(e,t=!0){if(!e)return"";const i=a[Math.abs(+e)%7];return(t?n:s)[i]}},6082:(e,t,i)=>{"use strict";function s(e){if(e.username)return e.username;const t=e.usernames,i=null==t?void 0:t.find((e=>e.pFlags.editable));return null==i?void 0:i.username}i.d(t,{Z:()=>s})},2946:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(5880),n=i(1507);function a(e){if(void 0!==e&&e.isPeerId&&e.isPeerId())return e;if((0,s.Z)(e)){const t=e.user_id;if(void 0!==t)return t.toPeerId(!1);const i=e.channel_id||e.chat_id;return void 0!==i?i.toPeerId(!0):n.NM}if(!e)return n.NM;const t="u"===e.charAt(0),i=e.substr(1).split("_");return t?i[0].toPeerId():(i[0]||"").toPeerId(!0)}},7030:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(9897),n=i(1507);function a(e,t=0,i=0,a=!1,o=!1){window.devicePixelRatio>1&&(t*=2,i*=2);let r=e.sizes||e.thumbs,d={_:"photoSizeEmpty",type:n.Pt};if(o&&r&&"photo"!==e._&&(r=r.concat({_:"photoSize",w:e.w,h:e.h,size:e.size,type:n.Pt})),null==r?void 0:r.length){for(let e=0,n=r.length;e=t||a.height>=i)break}a&&"photoSizeEmpty"===d._&&"photoStrippedSize"===r[0]._&&(d=r[0])}return d}},3075:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(5953),n=i(5003),a=i(6752);class o{constructor(e){var t;(0,s.Z)(this,e),this.log||(this.log=(null===(t=this.connection)||void 0===t?void 0:t.log)||(0,n.kg)("CALL-CONNECTION-BASE")),this.sources={}}createPeerConnection(e){return this.connection||(this.connection=function(e,t){t||(t=(0,n.kg)("RTCPeerConnection")),t("constructor");const i=new RTCPeerConnection(e);return i.addEventListener("track",(e=>{t("ontrack",e)})),i.addEventListener("signalingstatechange",(()=>{t("onsignalingstatechange",i.signalingState)})),i.addEventListener("connectionstatechange",(()=>{t("onconnectionstatechange",i.connectionState)})),i.addEventListener("negotiationneeded",(()=>{t("onnegotiationneeded",i.signalingState)})),i.addEventListener("icecandidate",(e=>{t("onicecandidate",e)})),i.addEventListener("iceconnectionstatechange",(()=>{t("oniceconnectionstatechange",i.iceConnectionState)})),i.addEventListener("datachannel",(()=>{t("ondatachannel")})),i.log=t,{connection:i}}(e,this.log.bindPrefix("connection")).connection)}createDataChannel(e){return this.dataChannel||(this.dataChannel=function(e,t,i){i||(i=(0,n.kg)("RTCDataChannel"));const s=e.createDataChannel("data",t);return s.addEventListener("message",(e=>{i("onmessage",e)})),s.addEventListener("open",(()=>{i("onopen")})),s.addEventListener("close",(()=>{i("onclose")})),s.log=i,s}(this.connection,e,this.log.bindPrefix("data")))}createDescription(){return this.description||(this.description=new a.ZP(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(){return this.negotiating||(this.negotiating=this.negotiateInternal().finally((()=>{this.negotiating=void 0})))}sendDataChannelData(e){"open"===this.dataChannel.readyState&&this.dataChannel.send(JSON.stringify(e))}}},2069:(e,t,i)=>{"use strict";i.d(t,{Z:()=>N});var s=i(6761),n=i(4762),a=i(5953),o=i(5701),r=i(671),d=i(5003),l=i(3855),c=i(3075),h=i(3773);function u(e){const t=(0,h.Z)(e,e.media[0]),i={"@type":"InitialSetup",fingerprints:[t.fingerprint],ufrag:t.ufrag,pwd:t.pwd,audio:void 0,video:void 0,screencast:void 0},s=e=>""+e;for(const t of e.media){const n=t.mediaType;if("application"===n||!t.isSending)continue;const a=i["video"===n&&i.video?"screencast":n]={},o=(0,h.Z)(e,t);a.ssrc=s(o.source),o.sourceGroups&&(a.ssrcGroups=o.sourceGroups.map((e=>({semantics:e.semantics,ssrcs:e.sources.map(s)}))));const r=a.rtpExtensions=[];t.attributes.get("extmap").forEach((e=>{r.push({id:+e.key,uri:e.value})}));const d=new Map,l=e=>{let t=d.get(e);return t||d.set(e,t={id:e}),t};t.attributes.get("rtpmap").forEach((e=>{const t=+e.key,i=l(t),s=e.value.split("/"),[n,a,o]=s;i.name=n,i.clockrate=+a,i.channels=o?+o:0})),t.attributes.get("rtcp-fb").forEach((e=>{const t=+e.key;l(t).feedbackTypes=e.lines.map((e=>{const t=e.split(" "),[i,s]=t;return{type:i,subtype:s||""}}))})),t.attributes.get("fmtp").forEach((e=>{const t=+e.key,i=l(t).parameters={},s=e.value.split(";");for(const e of s){const[t,s]=e.split("=");i[t]=s}})),a.payloadTypes=Array.from(d.values())}return i}var p=i(9124);class f extends c.Z{constructor(e){super(e)}negotiateInternal(){return e=this,t=void 0,s=function*(){const{connection:e,call:t}=this;if(!e.localDescription&&!e.remoteDescription&&!t.isOutgoing)return;let i;if(t.offerReceived){t.offerReceived=!1;const s=i=yield e.createAnswer();this.log("[sdp] local",s.type,s.sdp),yield e.setLocalDescription(s),this.log("[InitialSetup] send 2")}else{const s=i=yield e.createOffer();this.log("[sdp] local",s.sdp),yield e.setLocalDescription(s),t.offerSent=!0,this.log("[InitialSetup] send 0")}const s=u((0,p.DV)(i.sdp));t.sendCallSignalingData(s)},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var m=i(8500),g=i(2493),v=i(3335),b=i(1677),y=i(49),w=i(6752),S=i(4903);const C="undefined"!=typeof window&&"crypto"in window?window.crypto.subtle:self.crypto.subtle;var L=i(9818),E=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class I{constructor(e,t){this.isOutgoing=e,this.p2pKey=t,this.type="Signaling",this.counter=0,this.seqMap=new Map}concatSHA256(e){return t=(0,S.Z)(...e),C.digest("SHA-256",(0,L.Z)(t)).then((e=>new Uint8Array(e)));var t}encryptPrepared(e){return E(this,void 0,void 0,(function*(){const t={counter:0,bytes:new Uint8Array(16+e.length)},i=(this.isOutgoing?0:8)+("Signaling"===this.type?128:0),s=this.p2pKey,n=yield this.concatSHA256([s.subarray(i+88,i+88+32),e]),a=t.bytes;for(let e=0;e<16;++e)a[e]=n[e+8];const o=yield this.prepareAesKeyIv(s,a,i),r=yield this.aesProcessCtr(e,e.length,o,!0);return t.bytes=new Uint8Array([...t.bytes.subarray(0,16),...r]),t}))}encryptRawPacket(e){const t=++this.counter,i=new ArrayBuffer(4);new DataView(i).setUint32(0,t>>>0,!1);const s=new Uint8Array([...new Uint8Array(i),...e]);return this.encryptPrepared(s)}prepareAesKeyIv(e,t,i){return E(this,void 0,void 0,(function*(){const[s,n]=yield Promise.all([this.concatSHA256([t.subarray(0,16),e.subarray(i,i+36)]),this.concatSHA256([e.subarray(40+i,40+i+36),t.subarray(0,16)])]);return{key:new Uint8Array([...s.subarray(0,8),...n.subarray(8,24),...s.subarray(24,32)]),iv:new Uint8Array([...n.subarray(0,4),...s.subarray(8,16),...n.subarray(24,28)])}}))}aesProcessCtr(e,t,i,s=!0){return E(this,void 0,void 0,(function*(){const t=yield C.importKey("raw",i.key,{name:"AES-CTR"},!1,[s?"encrypt":"decrypt"]),n=yield C[s?"encrypt":"decrypt"]({name:"AES-CTR",counter:i.iv,length:8*i.iv.length},t,e);return new Uint8Array(n)}))}constTimeIsDifferent(e,t,i){let s=!0;for(let n=0;n134217728)return;const{isOutgoing:t,type:i}=this,s=(t?8:0)+("Signaling"===i?128:0),n=this.p2pKey,a=e.subarray(0,16),o=e.subarray(16),r=e.length-16,d=yield this.prepareAesKeyIv(n,a,s),l=yield this.aesProcessCtr(o,r,d,!1),c=yield this.concatSHA256([n.subarray(88+s,88+s+32),l]);if(this.constTimeIsDifferent(c.subarray(8),a,16))return;const h=new DataView(l.buffer).getUint32(0);return this.seqMap.has(h)?void 0:(this.seqMap.set(h,h),l.slice(4))}))}}var M=i(630);class P{static generateOffer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a],r=new M.Z;r.add("v=0","o=- 1 2 IN IP4 127.0.0.1","s=-","t=0 0"),t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r.add(`a=fingerprint:${t} ${i}`,`a=setup:${s}`)})),i&&s&&r.add(`a=ice-ufrag:${i}`,`a=ice-pwd:${s}`),r.add("a=group:BUNDLE 0 1 2","a=extmap-allow-mixed","a=msid-semantic: WMS *");const d="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}`,"c=IN IP4 0.0.0.0","a=rtcp:9 IN IP4 0.0.0.0","a=ice-options:trickle",`a=mid:${e}`,"a=sendrecv",A(l)),s&&r.add(`a=msid:${d} audio${s}`),r.add("a=rtcp-mux",_(a),F(i,s,n,d));break;case"video":r.add(`m=video 61986 UDP/TLS/RTP/SAVPF ${a.map((e=>e.id)).join(" ")}`,"c=IN IP4 0.0.0.0","a=rtcp:9 IN IP4 0.0.0.0","a=ice-options:trickle",`a=mid:${e}`,"a=sendrecv",A(l)),s&&r.add(`a=msid:${d} video${s}`),r.add("a=rtcp-mux","a=rtcp-rsize",_(a),F(i,s,n,d))}}return r.add("m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144"),r.finalize()}static generateAnswer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a],r=new M.Z;r.add("v=0","o=- 1 2 IN IP4 127.0.0.1","s=-","t=0 0"),t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r.add(`a=fingerprint:${t} ${i}`,`a=setup:${s}`)})),i&&s&&r.add(`a=ice-ufrag:${i}`,`a=ice-pwd:${s}`),r.add("a=group:BUNDLE 0 1 2","a=extmap-allow-mixed","a=msid-semantic: WMS *");const d="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}`,"c=IN IP4 0.0.0.0","a=rtcp:9 IN IP4 0.0.0.0","a=ice-options:trickle",`a=mid:${e}`,"a=sendrecv",A(l)),s&&r.add(`a=msid:${d} audio${s}`),r.add("a=rtcp-mux",_(a),F(i,s,n,d));break;case"video":r.add(`m=video 61986 UDP/TLS/RTP/SAVPF ${a.map((e=>e.id)).join(" ")}`,"c=IN IP4 0.0.0.0","a=rtcp:9 IN IP4 0.0.0.0","a=ice-options:trickle",`a=mid:${e}`,"a=sendrecv",A(l)),s&&r.add(`a=msid:${d} video${s}`),r.add("a=rtcp-mux","a=rtcp-rsize",_(a),F(i,s,n,d))}}return r.add("m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144"),r.finalize()}}class Z{static generateOffer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];let r="v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0";t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r+=`\na=fingerprint:${t} ${i}\na=setup:${s}`})),i&&s&&(r+=`\na=ice-ufrag:${i}\na=ice-pwd:${s}`),r+="\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *";const d="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=A(l),r+="\na=rtcp-mux",r+=_(a),r+=F(i,s,n,d);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${a.map((e=>e.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=A(l),r+="\na=rtcp-mux\na=rtcp-rsize",r+=_(a),r+=F(i,s,n,d)}}return r+="m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144",r+="\n",r}static generateAnswer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];let r="v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0";t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r+=`\na=fingerprint:${t} ${i}\na=setup:${s}`})),i&&s&&(r+=`\na=ice-ufrag:${i}\na=ice-pwd:${s}`),r+="\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *";const d="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=A(h),r+="\na=rtcp-mux",r+=_(l),r+=F(i,n,a,d);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${l.map((e=>e.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=A(h),r+="\na=rtcp-mux\na=rtcp-rsize",r+=_(l),r+=F(i,n,a,d)}}return r+="m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144",r+="\n",r}}class T{static generateOffer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];if(!o.length)return"v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n";let r="v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0";t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r+=`\na=fingerprint:${t} ${i}\na=setup:${s}`})),i&&s&&(r+=`\na=ice-ufrag:${i}\na=ice-pwd:${s}`),r+="\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *";const d="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${e}\na=sendrecv`,r+=A(l),s&&(r+=`\na=msid:${d} audio${s}`),r+="\na=rtcp-mux",r+=_(a),r+=F(i,s,n,d);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${a.map((e=>e.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${e}\na=sendrecv`,r+=A(l),s&&(r+=`\na=msid:${d} video${s}`),r+="\na=rtcp-mux\na=rtcp-rsize",r+=_(a),r+=F(i,s,n,d)}}return r+="m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144",r+="\n",r}static generateAnswer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];if(!o.length)return"v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n";let r="v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0";t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r+=`\na=fingerprint:${t} ${i}\na=setup:${s}`})),i&&s&&(r+=`\na=ice-ufrag:${i}\na=ice-pwd:${s}`),r+="\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *";const d="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${e}\na=sendrecv`,r+=A(l),s&&(r+=`\na=msid:${d} audio${s}`),r+="\na=rtcp-mux",r+=_(a),r+=F(i,s,n,d);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${a.map((e=>e.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${e}\na=sendrecv`,r+=A(l),s&&(r+=`\na=msid:${d} video${s}`),r+="\na=rtcp-mux\na=rtcp-rsize",r+=_(a),r+=F(i,s,n,d)}}return r+="m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144",r+="\n",r}}function k(){return navigator.userAgent.toLowerCase().indexOf("firefox")>-1}function x(){return navigator.userAgent.toLowerCase().indexOf("safari")>-1&&-1===navigator.userAgent.toLowerCase().indexOf("chrome")}function A(e){let t=[];for(let i=0;i{const{type:i,subtype:s}=e;t.push(`a=rtcp-fb:${n} ${[i,s].join(" ")}`)})),l){const e=[];Object.getOwnPropertyNames(l).forEach((t=>{e.push(`${t}=${l[t]}`)})),t.push(`a=fmtp:${n} ${e.join(";")}`)}}return t.join("\n")}function F(e,t,i,s){let n=[];return i&&i.length>0?i.forEach((t=>{t&&t.ssrcs.length>0&&(n.push(`a=ssrc-group:${t.semantics} ${t.ssrcs.join(" ")}`),t.ssrcs.forEach((t=>{n.push(`a=ssrc:${t} cname:stream${t}`,`a=ssrc:${t} msid:${s} ${e}${t}`,`a=ssrc:${t} mslabel:${e}${t}`,`a=ssrc:${t} label:${e}${t}`)})))})):t&&n.push(`a=ssrc:${t} cname:stream${t}`,`a=ssrc:${t} msid:${s} ${e}${t}`,`a=ssrc:${t} mslabel:${e}${t}`,`a=ssrc:${t} label:${e}${t}`),n.join("\n")}class D{static generateCandidate(e){if(!e)return null;const{sdpString:t,sdpMLineIndex:i,sdpMid:s,foundation:n,component:a,protocol:o,priority:r,address:d,type:l,relAddress:c,generation:h,tcpType:u,networkId:p,networkCost:f,username:m}=e;if(t)return{candidate:t,sdpMLineIndex:i,sdpMid:s};throw"no sdpString"}static generateOffer(e){return k()?Z.generateOffer(e):x()?T.generateOffer(e):P.generateOffer(e)}static generateAnswer(e){return k()?Z.generateAnswer(e):x()?T.generateAnswer(e):P.generateAnswer(e)}}var R=i(9585),B=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class N extends m.Z{constructor(e){super(),this.log=(0,d.kg)("CALL"),this.protocol||(this.protocol={_:"phoneCallProtocol",pFlags:{udp_p2p:!0,udp_reflector:!0},min_layer:92,max_layer:92,library_versions:["4.0.0"]}),(0,a.Z)(this,e),this.createdAt=Date.now(),this.offerReceived=!1,this.offerSent=!1,this.decryptQueue=[],this.candidates=[],this.addEventListener("state",(e=>{this.log("state",v.Z[e]),e===v.Z.CLOSED&&this.cleanup()}));const t=this.streamManager=new R.Z(b.iK);t.direction="sendrecv",t.types.push("screencast"),this.isOutgoing||(t.locked=!0,t.canCreateConferenceEntry=!1);let i={"@type":"MediaState",type:"input",lowBattery:!1,muted:!0,screencastState:"inactive",videoRotation:0,videoState:"inactive"};const s=this;i=new Proxy(i,{set:function(e,t,n){return e[t]=n,s.setMediaState(i),s.sendMediaState(),!0}}),this.mediaStates={input:i},this.sendMediaState=(0,o.Z)(this._sendMediaState.bind(this),0,!1,!0)}get connectionState(){const{_connectionState:e,connectionInstance:t}=this;if(void 0!==e)return e;if(t){const{iceConnectionState:e}=t.connection;return"closed"===e?v.Z.CLOSED:"connected"===e||n.IS_SAFARI&&"completed"===e?v.Z.CONNECTED:v.Z.CONNECTING}return v.Z.CONNECTING}get sortIndex(){const e=this.connectionState;let t=1e13*(v.Z.CLOSED-e+1);return t+=2147483647e3-(e===v.Z.PENDING&&this.isOutgoing?0:this.createdAt),t}getVideoElement(e){if("input"===e)return this.elements.get("main");{const e=this.getMediaState("output");if(!e)return;const t="active"===e.videoState?"video":"active"===e.screencastState?"screencast":void 0;if(!t)return;const i=this.description.findEntry((e=>e.type===t));if(!i)return;return this.elements.get(""+i.recvEntry.source)}}startScreenSharingInternal(){return B(this,void 0,void 0,(function*(){try{this.wasStartingScreen=!0,this.wasStartingVideo=!1,this.streamManager.types=["audio","screencast"],yield this.requestScreen()}catch(e){this.log.error("startScreenSharing error",e)}}))}toggleScreenSharing(){return B(this,void 0,void 0,(function*(){return this.isSharingVideo&&(yield this.stopVideoSharing()),this.isSharingScreen?this.stopVideoSharing():this.startScreenSharingInternal()}))}startVideoSharingInternal(){return B(this,void 0,void 0,(function*(){try{this.wasStartingScreen=!1,this.wasStartingVideo=!0,this.streamManager.types=["audio","video"],yield this.requestInputSource(!1,!0,!1)}catch(e){this.log.error("startVideoSharing error",e)}}))}stopVideoSharing(){return B(this,void 0,void 0,(function*(){const e=this.getMediaState("input");e.videoState=e.screencastState="inactive";const{streamManager:t,description:i}=this,s=t.inputStream.getVideoTracks()[0];s&&((0,y.Z)(s),t.appendToConference(i))}))}toggleVideoSharing(){return B(this,void 0,void 0,(function*(){return this.isSharingScreen&&(yield this.stopVideoSharing()),this.isSharingVideo?this.stopVideoSharing():this.startVideoSharingInternal()}))}getMediaState(e){return this.mediaStates[e]}setMediaState(e){this.mediaStates[e.type]=e,this.dispatchEvent("mediaState",e)}isSharingVideoType(e){try{return super.isSharingVideo&&!!(this.wasStartingScreen&&"screencast"===e||this.wasStartingVideo&&"video"===e)}catch(e){return!1}}get isSharingVideo(){return this.isSharingVideoType("video")}get isSharingScreen(){return this.isSharingVideoType("screencast")}get isMuted(){const e=this.streamManager.inputStream.getAudioTracks()[0];return!(null==e?void 0:e.enabled)}get isClosing(){const{connectionState:e}=this;return e===v.Z.CLOSING||e===v.Z.CLOSED}get description(){var e;return null===(e=this.connectionInstance)||void 0===e?void 0:e.description}setHangUpTimeout(e,t){this.clearHangUpTimeout(),this.hangUpTimeout=s.Z.setTimeout((()=>{this.hangUpTimeout=void 0,this.hangUp(t)}),e)}clearHangUpTimeout(){void 0!==this.hangUpTimeout&&(clearTimeout(this.hangUpTimeout),this.hangUpTimeout=void 0)}setPhoneCall(e){this.call=e;const{id:t}=e;if(this.id!==t){const e=this.id;this.id=t,this.dispatchEvent("id",t,e)}}acceptCall(){var e;return B(this,void 0,void 0,(function*(){const t=null===(e=(yield Promise.all(this.dispatchResultableEvent("acceptCallOverride")))[0])||void 0===e||e;if(this.isClosing||!t)return;this.overrideConnectionState(v.Z.EXCHANGING_KEYS);const i=this.call;this.requestInputSource(!0,!!i.pFlags.video,!1);const s=i.g_a_hash;this.managers.appCallsManager.generateDh().then((e=>B(this,void 0,void 0,(function*(){return this.dh={g_a_hash:s,b:e.a,g_b:e.g_a,g_b_hash:e.g_a_hash,p:e.p},this.managers.apiManager.invokeApi("phone.acceptCall",{peer:yield this.managers.appCallsManager.getCallInput(this.id),protocol:this.protocol,g_b:this.dh.g_b})})))).then((e=>B(this,void 0,void 0,(function*(){yield this.managers.appCallsManager.savePhonePhoneCall(e)})))).catch((e=>{this.log.error("accept call error",e),this.hangUp("phoneCallDiscardReasonHangup")}))}))}joinCall(){this.log("joinCall"),this.getEmojisFingerprint(),this.overrideConnectionState();const{isOutgoing:e,encryptionKey:t,streamManager:i}=this,s=function(e){const t=[];return e.connections.forEach((e=>{switch(e._){case"phoneConnectionWebrtc":{const{ip:i,ipv6:s,port:n,username:a,password:o}=e,r=[];e.pFlags.turn?(i&&r.push(`turn:${i}:${n}`),s&&r.push(`turn:[${s}]:${n}`)):e.pFlags.stun&&(i&&r.push(`stun:${i}:${n}`),s&&r.push(`stun:[${s}]:${n}`)),r.length>0&&t.push({urls:r,username:a,credential:o});break}}})),{iceServers:t,iceTransportPolicy:e.pFlags.p2p_allowed?"all":"relay"}}(this.call);if(this.log("joinCall configuration",s),!s)return;const n=this.connectionInstance=new f({call:this,streamManager:i,log:this.log.bindPrefix("connection")}),a=n.createPeerConnection(s);a.addEventListener("iceconnectionstatechange",(()=>{const e=this.connectionState;void 0===this.connectedAt&&e===v.Z.CONNECTED&&(this.connectedAt=Date.now()),this.dispatchEvent("state",e)})),a.addEventListener("negotiationneeded",(()=>{n.negotiate()})),a.addEventListener("icecandidate",(e=>{const{candidate:t}=e;a.log("onicecandidate",t),(null==t?void 0:t.candidate)&&this.sendIceCandidate(t)})),a.addEventListener("track",(e=>{const{track:t}=e;a.log("ontrack",t),this.onTrack(e)})),n.createDescription(),this.encryptor=new I(e,t),this.decryptor=new I(!e,t),this.log("currentCall",this),e&&n.appendStreamToConference(),this.createDataChannel(),this.processDecryptQueue()}createDataChannelEntry(){const e=this.description.createEntry("application");e.setDirection("sendrecv"),e.sendEntry=e.recvEntry=e}createDataChannel(){if(this.connectionInstance.dataChannel)return;const e=this.connectionInstance.createDataChannel({id:0,negotiated:!0});e.addEventListener("message",(e=>{this.applyDataChannelData(JSON.parse(e.data))})),e.addEventListener("open",(()=>{this.sendMediaState()}))}applyDataChannelData(e){"MediaState"===e["@type"]?(e.type="output",this.log("got output media state",e),this.setMediaState(e)):this.log.error("unknown data channel data:",e)}_sendMediaState(){const{connectionInstance:e}=this;if(!e)return;const t=Object.assign({},this.getMediaState("input"));delete t.type,this.log("sendMediaState",t),e.sendDataChannelData(t)}sendCallSignalingData(e){return B(this,void 0,void 0,(function*(){const t=JSON.stringify(e),i=(new TextEncoder).encode(t),{bytes:s}=yield this.encryptor.encryptRawPacket(i);this.log("sendCallSignalingData",this.id,t),yield this.managers.apiManager.invokeApi("phone.sendSignalingData",{peer:yield this.managers.appCallsManager.getCallInput(this.id),data:s})}))}sendIceCandidate(e){this.log("sendIceCandidate",e);const{candidate:t,sdpMLineIndex:i}=e;if(0!==i)return;const s=function(e){if(!e||!e.startsWith("candidate:"))return;const t=e;e=e.substr("candidate:".length);const[i,s,n,a,o,r,...d]=e.split(" "),l={sdpString:t,foundation:i,component:s,protocol:n,priority:a,address:{ip:o,port:r}};for(let e=0;e(this.getEmojisFingerprintPromise=void 0,this.emojisFingerprint=e.map((e=>(0,r.zu)(e))))))}unlockStreamManager(){this.connectionInstance.streamManager.locked=!1,this.connectionInstance.appendStreamToConference()}doTheMagic(){return B(this,void 0,void 0,(function*(){this.connectionInstance.appendStreamToConference();const e=this.connectionInstance.connection;let t=yield e.createAnswer();this.log("[sdp] local",t.type,t.sdp),yield e.setLocalDescription(t),e.getTransceivers().filter((e=>"recvonly"===e.direction)).forEach((e=>{const t=this.connectionInstance.description.getEntryByMid(e.mid);t.transceiver=t.recvEntry.transceiver=e,e.direction="sendrecv"}));const i=this.description,s=i.entries.map((e=>e.mid)),n={type:"offer",sdp:i.generateSdp({bundle:s,entries:i.entries.filter((e=>s.includes(e.mid))),isAnswer:!0})};yield e.setRemoteDescription(n),t=yield e.createAnswer(),yield e.setLocalDescription(t);const a=u((0,p.DV)(t.sdp));this.log("[InitialSetup] send 1"),this.sendCallSignalingData(a),this.unlockStreamManager()}))}overrideConnectionState(e){this._connectionState=e,this.dispatchEvent("state",this.connectionState)}get duration(){return void 0!==this.connectedAt?(Date.now()-this.connectedAt)/1e3|0:0}onInputStream(e){super.onInputStream(e);const t=e.getVideoTracks()[0];if(t){const e=this.getMediaState("input");this.wasStartingScreen||this.wasStartingVideo||(this.wasStartingVideo=!0),this.isSharingVideo?e.videoState="active":this.isSharingScreen&&(e.screencastState="active"),t.addEventListener("ended",(()=>{this.stopVideoSharing()}),{once:!0})}e.getAudioTracks().length&&this.onMutedChange()}onMutedChange(){const e=this.isMuted;this.dispatchEvent("muted",e),this.getMediaState("input").muted=e}toggleMuted(){return this.requestAudioSource(!0).then((()=>{this.setMuted(),this.onMutedChange()}))}hangUp(e,t){return B(this,void 0,void 0,(function*(){if(!this.isClosing&&(this.discardReason=e,this.log("hangUp",e),this.overrideConnectionState(v.Z.CLOSED),this.connectionInstance&&this.connectionInstance.closeConnectionAndStream(!0),e&&!t)){let t=!1;for(const e in this.mediaStates){const i=this.mediaStates[e];t="active"===i.videoState||"active"===i.screencastState||t}yield this.managers.appCallsManager.discardCall(this.id,this.duration,e,t)}}))}performCodec(e){const t=e.payloadTypes.map((e=>Object.assign(Object.assign({},e),{"rtcp-fbs":e.feedbackTypes})));return{"rtp-hdrexts":e.rtpExtensions,"payload-types":t}}setDataToDescription(e){this.description.setData({transport:{pwd:e.pwd,ufrag:e.ufrag,fingerprints:e.fingerprints,"rtcp-mux":!0},audio:this.performCodec(e.audio),video:e.video?this.performCodec(e.video):void 0,screencast:e.screencast?this.performCodec(e.screencast):void 0})}filterNotVP8(e){this.isOutgoing||[e.video,e.screencast].filter(Boolean).forEach((e=>{const t=e.payloadTypes,i=t.findIndex((e=>"VP8"===e.name)),s=t[i],n=t.findIndex((e=>{var t;return+(null===(t=e.parameters)||void 0===t?void 0:t.apt)===s.id}));e.payloadTypes=[t[i],t[n]]}))}applyCallSignalingData(e){return B(this,void 0,void 0,(function*(){this.log("applyCallSignalingData",this,e);const{connection:t,description:i}=this.connectionInstance;switch(e["@type"]){case"InitialSetup":{this.log("[sdp] InitialSetup",e),this.filterNotVP8(e),this.setDataToDescription(e);const s=e=>e.map((e=>({_:"groupCallParticipantVideoSourceGroup",semantics:e.semantics,sources:e.ssrcs.map((e=>+e))})));[(0,w.z_)("audio",+e.audio.ssrc),e.video?(0,w.z_)("video",s(e.video.ssrcGroups)):void 0,e.screencast?(0,w.z_)("screencast",s(e.screencast.ssrcGroups)):void 0].filter(Boolean).forEach((e=>{let t=i.getEntryBySource(e.source);if(t)return;const s=i.findFreeSendRecvEntry(e.type,!1);t=new w.Lp(s.mid,e.type),t.setDirection("sendrecv"),s.recvEntry=t,i.setEntrySource(t,e.sourceGroups||e.source)})),this.createDataChannelEntry();const n=this.offerSent;this.offerSent=!1;const a=i.entries.map((e=>e.mid)),o={type:n?"answer":"offer",sdp:i.generateSdp({bundle:a,entries:i.entries.filter((e=>a.includes(e.mid))),isAnswer:!n})};this.log("[sdp] remote",o.sdp),yield t.setRemoteDescription(o),yield this.tryToReleaseCandidates(),n||(yield this.doTheMagic());break}case"Candidates":for(const t of e.candidates){const e=D.generateCandidate(t);e.sdpMLineIndex=0;const i=new RTCIceCandidate(e);this.candidates.push(i)}yield this.tryToReleaseCandidates();break;default:this.log.error("unrecognized signaling data",e)}}))}tryToReleaseCandidates(){return B(this,void 0,void 0,(function*(){const{connectionInstance:e}=this;if(!e)return;const{connection:t}=e;if(t.remoteDescription){const e=this.candidates.map((e=>this.addIceCandidate(t,e)));this.candidates.length=0,yield Promise.all(e)}else this.log("[candidates] postpone")}))}addIceCandidate(e,t){return B(this,void 0,void 0,(function*(){this.log("[candidate] start",t);try{yield e.addIceCandidate(t),this.log("[candidate] add",t)}catch(e){this.log.error("[candidate] error",t,e)}}))}processDecryptQueue(){return B(this,void 0,void 0,(function*(){const{encryptor:e}=this;if(!e)return void this.log.warn("got encrypted signaling data before the encryption key");if(!this.decryptQueue.length)return;const t=this.decryptQueue.slice();this.decryptQueue.length=0;for(const i of t){const t=yield e.decryptRawPacket(i);if(!t)continue;const s=(new TextDecoder).decode(t);try{const e=JSON.parse(s);this.log("[update] updateNewCallSignalingData",e),this.applyCallSignalingData(e)}catch(e){this.log.error("wrong signaling data",s),this.hangUp("phoneCallDiscardReasonDisconnect"),g.Z.dispatchEvent("incompatible",this.interlocutorUserId)}}}))}onUpdatePhoneCallSignalingData(e){this.decryptQueue.push(e),this.processDecryptQueue()}}},8500:(e,t,i)=>{"use strict";i.d(t,{Z:()=>p});var s=i(3241),n=i(319),a=i(9125),o=i(9337),r=i(382),d=i(5424);function l(){const e={main:{},screen:{}};return t=>{return i=this,s=void 0,a=function*(){const{isScreen:i,constraints:s}=t,n=e[i?"screen":"main"];let a=n[s.audio?"audio":"video"];a||(a=(i?r.Z:d.Z)(s,t.muted),s.audio&&!n.audio&&(n.audio=a.finally((()=>n.audio=void 0))),s.video&&!n.video&&(n.video=a.finally((()=>n.video=void 0))));try{return yield a}catch(e){throw e}},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}}window.getStreamCached=l;var c=i(312),h=i(49),u=i(9585);class p extends s.Z{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=l()}get isSharingAudio(){return!!this.streamManager.hasInputTrackKind("audio")}get isSharingVideo(){return!!this.streamManager.hasInputTrackKind("video")}fixSafariAudio(){this.audio.play().catch(n.Z)}requestAudioSource(e){return this.requestInputSource(!0,!1,e)}requestInputSource(e,t,i){const{streamManager:s}=this;if(s){const i=!e||this.isSharingAudio,s=!t||this.isSharingVideo;if(i&&s)return Promise.resolve()}const n={audio:e&&(0,a.Z)(),video:t&&(0,c.Z)()};return this.getStream({constraints:n,muted:i}).then((e=>{this.onInputStream(e)}))}requestScreen(){return this.getStream({isScreen:!0,constraints:(0,o.Z)(!0)}).then((e=>{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 i=e.getVideoTracks()[0];this.tryAddTrack({stream:e,track:i,type:"input",source:t||"main"})}tryAddTrack({stream:e,track:t,type:i,source:s}){s||(s=u.Z.getSource(e,i)),this.log("tryAddTrack",e,t,i,s);const a="output"===i,{player:o,elements:r,streamManager:d}=this,l=t.kind,c="video"===l,h=c?s:l;let p=r.get(h);c&&t.addEventListener("ended",(()=>{this.log("[track] onended"),r.delete(h)}),{once:!0}),a&&d.addTrack(e,t,i);const f=c?e:d.outputStream;if(p)p.paused&&p.play().catch(n.Z),p.srcObject=f;else{if(p=document.createElement(l),p.autoplay=!0,p.srcObject=f,p.volume=1,"undefined"!==p.sinkId){const{outputDeviceId:e}=this;e&&p.setSinkId(e)}c?(p.setAttribute("playsinline","true"),p.muted=!0):o.appendChild(p),r.set(h,p)}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)e.getTracks().forEach((e=>{(0,h.Z)(e)}));else{e.getVideoTracks().length&&this.saveInputVideoStream(e,"main");const{streamManager:t,description:i}=this;t.addStream(e,"input"),i&&t.appendToConference(i)}}}},3335:(e,t,i)=>{"use strict";var s;i.d(t,{Z:()=>n}),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"}(s||(s={}));const n=s},2493:(e,t,i)=>{"use strict";i.d(t,{Z:()=>C});var s=i(5916);let n;var a=i(410),o=i(993),r=i(1655),d=i(6519),l=i(9895),c=i(3241),h=i(7298),u=i(5003),p=i(3855),f=i(1507),m=i(3512),g=i(2069),v=i(3335),b=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const y=45e3;class w extends c.Z{construct(e){this.managers=e,this.log=(0,u.kg)("CC"),o.Z&&(this.audioAsset=null!=n?n:n=new s.Z(["call_busy.mp3","call_connect.mp3","call_end.mp3","call_incoming.mp3","call_outgoing.mp3","voip_failed.mp3"]),this.tempId=0,this.instances=new Map,this.sortedInstances=[],m.Z.addEventListener("call_update",(e=>b(this,void 0,void 0,(function*(){var t;let i=this.instances.get(e.id);switch(i&&i.setPhoneCall(e),e._){case"phoneCallDiscarded":i&&i.hangUp(null===(t=e.reason)||void 0===t?void 0:t._,!0);break;case"phoneCallAccepted":i&&i.confirmCall();break;case"phoneCallRequested":i||(i=this.createCallInstance({isOutgoing:!1,interlocutorUserId:e.admin_id}),i.overrideConnectionState(v.Z.PENDING),i.setPhoneCall(e),i.setHangUpTimeout(y,"phoneCallDiscardReasonMissed"));break;case"phoneCall":{if(!i||i.encryptionKey)break;const t=i.dh.g_a=e.g_a_or_b,s=i.dh,n=yield p.Z.invokeCrypto("sha256",t);if(!(0,l.Z)(s.g_a_hash,n)){this.log.error("Incorrect g_a_hash",s.g_a_hash,n);break}const{key:a,key_fingerprint:o}=yield this.managers.appCallsManager.computeKey(t,s.b,s.p);if(e.key_fingerprint!==o){this.log.error("Incorrect key fingerprint",e.key_fingerprint,o,t,s),i.hangUp("phoneCallDiscardReasonDisconnect");break}i.encryptionKey=a,i.joinCall();break}}})))),m.Z.addEventListener("call_signaling",(({callId:e,data:t})=>{const i=this.instances.get(e);(null==i?void 0:i.id)===e&&i.onUpdatePhoneCallSignalingData(t)})))}get currentCall(){return this.sortedInstances[0]}getCallByUserId(e){for(const[t,i]of this.instances)if(i.interlocutorUserId===e)return i}createCallInstance(e){const t=new g.Z(Object.assign({managers:this.managers},e));return t.addEventListener("state",(e=>{const i=this.currentCall;e===v.Z.CLOSED?(this.instances.delete(t.id),(0,r.Z)(this.sortedInstances,t)):(0,d.Z)(this.sortedInstances,t,"sortIndex"),e===v.Z.EXCHANGING_KEYS&&(t.wasTryingToJoin=!0);const s=void 0!==t.connectedAt;e===v.Z.EXCHANGING_KEYS||e===v.Z.CONNECTING&&s?t.setHangUpTimeout(y,"phoneCallDiscardReasonDisconnect"):t.clearHangUpTimeout(),i!==t&&i||(e===v.Z.CLOSED?t.isOutgoing||t.wasTryingToJoin?t.wasTryingToJoin&&!s?this.audioAsset.playSound("voip_failed.mp3"):this.audioAsset.playSound("phoneCallDiscardReasonBusy"===t.discardReason?"call_busy.mp3":"call_end.mp3"):this.audioAsset.stopSound():e===v.Z.PENDING?this.audioAsset.playSound(t.isOutgoing?"call_outgoing.mp3":"call_incoming.mp3",!0):e===v.Z.EXCHANGING_KEYS?this.audioAsset.playSoundIfDifferent("call_connect.mp3"):e===v.Z.CONNECTING?t.duration&&this.audioAsset.playSound("voip_connecting.mp3",!0):this.audioAsset.stopSound())})),t.addEventListener("id",((e,i)=>{void 0!==i&&this.instances.delete(i);const s=!!this.currentCall;this.instances.set(e,t),void 0===i&&this.dispatchEvent("instance",{instance:t,hasCurrent:s})})),t}startCallInternal(e,t){return b(this,void 0,void 0,(function*(){this.log("p2pStartCallInternal",e,t);const i=yield this.managers.appProfileManager.getProfile(e);if(!i)return;const{video_calls_available:s}=i.pFlags,n=this.createCallInstance({isOutgoing:!0,interlocutorUserId:e});n.requestInputSource(!0,!(!t||!s),!1),n.overrideConnectionState(v.Z.REQUESTING),n.setPhoneCall({_:"phoneCallWaiting",access_hash:"",admin_id:f.NM,date:(0,h.Z)(!0),id:--this.tempId,participant_id:e,protocol:n.protocol,pFlags:{video:t||void 0}}),this.managers.appCallsManager.generateDh().then((i=>b(this,void 0,void 0,(function*(){return n.dh=i,this.managers.appCallsManager.requestCall(e,n.protocol,n.dh.g_a_hash,t&&s)})))).then((e=>{n.overrideConnectionState(v.Z.PENDING),n.setPhoneCall(e),n.setHangUpTimeout(y,"phoneCallDiscardReasonHangup")}))}))}}const S=new w;a.GO&&(a.GO.callsController=S);const C=S},1677:(e,t,i)=>{"use strict";i.d(t,{KM:()=>s,iK:()=>n});const s=50,n=100},9078:(e,t,i)=>{"use strict";i.d(t,{Z:()=>k});var s=i(4762),n=i(1655),a=i(5953),o=i(6724),r=i(5003),d=i(1507),l=i(3512),c=i(8500),h=i(7625),u=i(3075),p=i(8479),f=i(6752),m=i(9124),g=i(4373),v=i(3773),b=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class y extends u.Z{constructor(e){super(e),this.negotiateThrottled=(0,o.Z)(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(){return this.description?this.description:super.createDescription()}appendStreamToConference(){super.appendStreamToConference()}invokeJoinGroupCall(e,t,i){return b(this,void 0,void 0,(function*(){const{groupCall:s,description:n}=this,a=s.id,o=t.map((t=>{const i=function(e,t){const i=(0,v.Z)(e,t),s=t.mediaType,n={source:i.source,sourceGroups:i.sourceGroups,type:s};i.fingerprint.setup="active";const a={fingerprints:[i.fingerprint],pwd:i.pwd,ssrc:i.source,"ssrc-groups":i.sourceGroups||[],ufrag:i.ufrag};return{params:{_:"dataJSON",data:JSON.stringify(a)},source:i.source,media:t,sourceGroups:i.sourceGroups,entry:n}}(e,t);return this.sources[i.entry.type]=i.entry,i})),r=o.find((e=>"audio"===e.media.mediaType)),d=o.find((e=>"video"===e.media.mediaType));let{source:c,params:u}=r||{};const p=d||r,f={audio:r,video:d};if(n.entries.forEach((e=>{if("sendonly"===e.direction){const t=f[e.type];if(!t)return;n.setEntrySource(e,t.sourceGroups||t.source),n.setEntryPeerId(e,l.Z.myId)}})),u!==p.params){const e=JSON.parse(p.params.data);c?e.ssrc=c:delete e.ssrc,u={_:"dataJSON",data:JSON.stringify(e)}}const m=yield this.managers.appGroupCallsManager.joinGroupCall(a,u,i),g=JSON.parse(m.params.data);return g.audio=g.audio||s.connections.main.description.audio,n.setData(g),function(e,t){["audio","video"].filter((e=>t[e])).map((e=>[t[e],e])).forEach((([t,i])=>{const s=e.find((e=>e.mediaType===i));if(!s)return;const n=(e=>{const t={};return e.attributes.get("extmap").forEach((e=>{const i=e.key.split("/",1)[0];t[i]=e.value})),t})(s);(0,h.Z)(t["rtp-hdrexts"],((e,t,s)=>{n[e.id]!==e.uri&&(s.splice(t,1),console.log("[sdp] filtered extmap:",e,t,i))}))}))}(t,g),g}))}negotiateInternal(){return b(this,void 0,void 0,(function*(){const{connection:e,description:t}=this,i="new"===e.iceConnectionState&&!t.getEntryByMid("0").source,s=this.log.bindPrefix("startNegotiation");s("start");const n=yield e.createOffer({iceRestart:!1});i&&this.dataChannel&&t.createEntry("application").setDirection("sendrecv");const{sdp:a,offer:o}=function(e){const{offer:t,data:i}=e,s=(0,m.DV)(t.sdp);let n=!1;if(e.skipAddingMulticast||(n=(0,m.e6)(s)||n),(0,h.Z)(s.media,((e,t,a)=>{if(e.isSending)return;if("application"===e.mediaType)return;const o=e.mediaLine,r=o.mediaLineParts,d=(r.ids,o.toString()),l=i[e.mediaType]["payload-types"].map((e=>""+e.id));if(d!==(0,g.Px)(e.mediaType,void 0,l)){const o=(0,v.Z)(s,e),d=Object.assign({},i);d.transport=(0,p.Z)(d.transport),d.transport.ufrag=o.ufrag,d.transport.pwd=o.pwd,d.transport.fingerprints=[o.fingerprint],d.transport.candidates=[];const l=new f.Lp(o.mid,r.type);l.setPort(r.port),o.source&&l.setSource(o.sourceGroups||o.source),l.setDirection(e.direction);const c=(new g.DY).addSsrcEntry(l,d).finalize(),h=(0,m.DV)(c).media[0];a[t]=h,n=!0}})),n){const e=s.toString();t.sdp=e}return{offer:t,sdp:s}}({offer:n,data:t});s("[sdp] setLocalDescription",o.sdp),yield e.setLocalDescription(o);const r=a.media.filter((e=>"application"!==e.mediaType&&e.isSending));if(i)try{yield this.invokeJoinGroupCall(a,r,this.options)}catch(e){this.log.error("[tdweb] joinGroupCall error",e)}const d=[],l=a.bundle;(0,h.Z)(l,((e,i,s)=>{const n=t.getEntryByMid(e);n.shouldBeSkipped(!0)&&(s.splice(i,1),d.push(n))}));const c=a.media.map((e=>{const i=e.mid;let s=t.getEntryByMid(i);return s||(s=new f.Lp(i,e.mediaType),s.setDirection("inactive")),s})),u={type:"answer",sdp:t.generateSdp({bundle:l,entries:c,isAnswer:!0})};d.forEach((e=>{t.deleteEntry(e)})),s(`[sdp] setRemoteDescription signaling=${e.signalingState} ice=${e.iceConnectionState} gathering=${e.iceGatheringState} connection=${e.connectionState}`,u.sdp),yield e.setRemoteDescription(u),s("end")}))}negotiate(){let e=this.negotiating;return e||(e=super.negotiate(),this.updateConstraints&&e.then((()=>{this.maybeUpdateRemoteVideoConstraints(),this.updateConstraints=!1})),"presentation"===this.options.type&&e.then((()=>{this.connection.getTransceivers().find((e=>{var t,i;"video"===(null===(i=null===(t=e.sender)||void 0===t?void 0:t.track)||void 0===i?void 0:i.kind)&&e.sender.setParameters(Object.assign(Object.assign({},e.sender.getParameters()),{degradationPreference:"maintain-resolution"}))}))})),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:i}=t;e.onStageEndpoints.push(i),e.constraints[i]={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 w=i(2207),S=i(9337),C=i(382),L=i(5424),E=i(312),I=i(49),M=i(9585),P=i(2946),Z=i(2059),T=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class k extends c.Z{constructor(e){super(),(0,a.Z)(this,e),this.log||(this.log=(0,r.kg)("GROUP-CALL")),this.connections||(this.connections={}),this.isSpeakingMap||(this.isSpeakingMap=new Map),this.pinnedSources=[],this.participantsSsrcs=new Map,this.hadAutoPinnedSources=new Set,this.dispatchPinnedThrottled=(0,o.Z)((()=>{this.dispatchEvent("pinned",this.pinnedSource)}),0,!1),this.addEventListener("state",(e=>{e===w.Z.CLOSED&&this.cleanup()}))}get connectionState(){return this.connections.main.connection.iceConnectionState}get state(){const{connectionState:e}=this;if("closed"===e)return w.Z.CLOSED;if("connected"===e||s.IS_SAFARI&&"completed"===e){const{participant:e}=this;return e.pFlags.can_self_unmute?e.pFlags.muted?w.Z.MUTED:w.Z.UNMUTED:w.Z.MUTED_BY_ADMIN}return w.Z.CONNECTING}get participants(){return this.managers.appGroupCallsManager.getCachedParticipants(this.id)}get isSharingScreen(){return!!this.connections.presentation}get pinnedSource(){return this.pinnedSources[this.pinnedSources.length-1]}get isMuted(){return this.state!==w.Z.UNMUTED}get isClosing(){const{state:e}=this;return e===w.Z.CLOSED}get streamManager(){return this.connections.main.streamManager}get description(){return this.connections.main.description}pinSource(e){(0,n.Z)(this.pinnedSources,e),this.pinnedSources.push(e),this.dispatchPinnedThrottled()}unpinSource(e){this.hadAutoPinnedSources.delete(e),(0,n.Z)(this.pinnedSources,e),this.dispatchPinnedThrottled()}unpinAll(){this.pinnedSources.length=0,this.dispatchPinnedThrottled()}getParticipantByPeerId(e){return T(this,void 0,void 0,(function*(){return d.NM===e?this.participant:(yield this.participants).get(e)}))}toggleMuted(){return this.requestAudioSource(!0).then((()=>this.changeUserMuted(d.NM)))}changeUserMuted(e,t){return T(this,void 0,void 0,(function*(){const i=yield this.getParticipantByPeerId(e);return d.NM===e&&i.pFlags.can_self_unmute&&(t=void 0===t?!i.pFlags.muted:t),this.editParticipant(i,{muted:t})}))}getElement(e){return super.getElement(e)}getVideoElementFromParticipantByType(e,t){let i;i=e.pFlags.self?"video"===t?"main":"presentation":e[t].source_groups[0].sources[0];const s=this.getElement(i);if(!s)return;const n=s.cloneNode();return n.srcObject=s.srcObject,{video:n,source:i}}createConnectionInstance(e){return this.connections[e.type]=new y(Object.assign({groupCall:this,log:this.log.bindPrefix(e.type),managers:this.managers},e))}changeRaiseHand(e){return this.editParticipant(this.participant,{raiseHand:e})}startScreenSharingInternal(){return T(this,void 0,void 0,(function*(){try{const e="presentation",t=yield(0,C.Z)((0,S.Z)()),i=new M.Z,s=this.createConnectionInstance({streamManager:i,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(){var e;return null!==(e=this.startScreenSharingPromise)&&void 0!==e?e: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,this.managers.appGroupCallsManager.saveApiParticipant(this.id,this.participant),this.managers.appGroupCallsManager.leaveGroupCallPresentation(this.id)):Promise.resolve()}toggleScreenSharing(){return this.isSharingScreen?this.stopScreenSharing():this.startScreenSharing()}startVideoSharingInternal(){return T(this,void 0,void 0,(function*(){const e={video:(0,E.Z)()};try{const t=yield(0,L.Z)(e,!1);this.connections.main.addInputVideoStream(t),yield this.editParticipant(this.participant,{videoPaused:!1,videoStopped:!1})}catch(t){this.log.error("startVideoSharing error",t,e)}}))}startVideoSharing(){var e;return null!==(e=this.startVideoSharingPromise)&&void 0!==e?e:this.startVideoSharingPromise=this.startVideoSharingInternal().finally((()=>{this.startVideoSharingPromise=void 0}))}stopVideoSharing(){return T(this,void 0,void 0,(function*(){const e=this.connections.main,t=e.streamManager.inputStream.getVideoTracks()[0];t&&((0,I.Z)(t),e.streamManager.appendToConference(e.description),yield this.editParticipant(this.participant,{videoStopped:!0}))}))}toggleVideoSharing(){return this.isSharingVideo?this.stopVideoSharing():this.startVideoSharing()}hangUp(e=!1,t=!1,i=!1){return T(this,void 0,void 0,(function*(){for(const e in this.connections)this.connections[e].closeConnectionAndStream(!t);if(this.dispatchEvent("state",this.state),!i&&!t){const t=e||(this.joined?this.connections.main.sources.audio.source:void 0);this.managers.appGroupCallsManager.hangUp(this.id,t)}}))}tryAddTrack(e){const{description:t}=this,i=super.tryAddTrack(e);if("output"===e.type){const e=t.getEntryBySource(+i);this.getParticipantByPeerId(e.peerId).then((e=>{e&&l.Z.dispatchEvent("group_call_participant",{groupCallId:this.id,participant:e})}))}return i}editParticipant(e,t){return T(this,void 0,void 0,(function*(){if(Object.keys(t).length){if(e){const i=e.pFlags.self;if(i&&void 0!==t.muted&&!this.isSharingAudio&&(delete t.muted,!Object.keys(t).length))return;const s=t.muted;void 0!==s&&e.pFlags.self&&(s?e.pFlags.muted=!0:e.pFlags.can_self_unmute&&delete e.pFlags.muted),void 0!==t.raiseHand&&(t.raiseHand?e.raise_hand_rating="1":delete e.raise_hand_rating),i&&(void 0!==t.videoStopped&&(t.videoStopped?delete e.video:e.video=(0,Z.KR)(this.connections.main.sources.video)),!e.pFlags.muted&&e.pFlags.can_self_unmute&&this.setMuted(!1),this.dispatchEvent("state",this.state))}return this.managers.appGroupCallsManager.editParticipant(this.id,e,t)}}))}onParticipantUpdate(e,t){const i=this.connections.main,{connection:s,description:n}=i,a=(0,P.Z)(e.peer),o=!!e.pFlags.left,r=this.participantsSsrcs.get(a)||[];if(e.presentation&&!o){const{source:t}=(0,Z._f)(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,i.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!==a&&this.dispatchEvent("state",this.state))}const d=o?[]:(0,Z.s$)(e);o?this.participantsSsrcs.delete(a):this.participantsSsrcs.set(a,d);const l=new Set;r.forEach((e=>{const t=e.source;if(!d.find((e=>e.source===t))){this.unpinSource(t);const e=n.getEntryBySource(t);e&&"inactive"!==e.direction&&(e.setDirection("inactive"),l.add(e.type))}})),d.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,a),"video"===e.type&&t.setEndpoint(e.endpoint),t.createTransceiver(s,{direction:"recvonly"}),l.add(t.type))})),l.size&&(l.has("video")&&(i.updateConstraints=!0),i.negotiateThrottled())}}},2207:(e,t,i)=>{"use strict";var s;i.d(t,{Z:()=>n}),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={}));const n=s},2059:(e,t,i)=>{"use strict";i.d(t,{ZP:()=>L,KR:()=>w,_f:()=>y,s$:()=>b});var s=i(5916);let n;var a=i(410),o=i(3241),r=i(5003),d=i(3512),l=i(9078),c=i(2207),h=i(1677),u=i(9585),p=i(9125),f=i(5424),m=i(312),g=i(6752),v=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function b(e){var t,i;return[y(0,"audio",e.source),(null===(t=e.video)||void 0===t?void 0:t.audio_source)&&y(0,"audio",e.video.audio_source),e.video&&y(0,"video",e.video.source_groups,e.video.endpoint),(null===(i=e.presentation)||void 0===i?void 0:i.audio_source)&&y(0,"audio",e.presentation.audio_source),e.presentation&&y(0,"video",e.presentation.source_groups,e.presentation.endpoint)].filter(Boolean)}function y(e,t,i,s){return(0,g.z_)(t,i,s)}function w(e,t){return e&&{_:"groupCallParticipantVideo",pFlags:{},endpoint:"",source_groups:e.sourceGroups,audio_source:t}}class S extends o.Z{construct(e){this.managers=e,this.audioAsset=null!=n?n:n=new s.Z(["group_call_connect.mp3","group_call_end.mp3","group_call_start.mp3","voip_onallowtalk.mp3"]),this.log=(0,r.kg)("GCC"),d.Z.addEventListener("group_call_update",(e=>{const{currentGroupCall:t}=this;(null==t?void 0:t.id)===e.id&&(t.groupCall=e,"groupCallDiscarded"===e._&&t.hangUp(!1,!1,!0))})),d.Z.addEventListener("group_call_participant",(({groupCallId:e,participant:t})=>{const{currentGroupCall:i}=this;(null==i?void 0:i.id)===e&&i.onParticipantUpdate(t)}))}get groupCall(){return this.currentGroupCall}setCurrentGroupCall(e){this.currentGroupCall=e,e&&this.dispatchEvent("instance",e)}startConnectingSound(){this.stopConnectingSound(),this.audioAsset.playSoundWithTimeout("group_call_connect.mp3",!0,2500)}stopConnectingSound(){this.audioAsset.stopSound(),this.audioAsset.cancelDelayedPlay()}joinGroupCall(e,t,i=!0,s,n){return v(this,void 0,void 0,(function*(){let a;return this.audioAsset.createAudio(),this.log(`joinGroupCall chatId=${e} id=${t} muted=${i} rejoin=${s}`),a=s?this.currentGroupCall.connections.main.streamManager:yield function(e,t){return i=this,s=void 0,a=function*(){const i={audio:(0,p.Z)(),video:t&&(0,m.Z)()},s=new u.Z(h.iK);try{const t=yield(0,f.Z)(i,e);s.addStream(t,"input")}catch(e){console.error("joinGroupCall getStream error",e,i),s.inputStream=new MediaStream}return s},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}(i,n),this.joinGroupCallInternal(e,t,a,i,s,n).then((()=>{const{currentGroupCall:e}=this;e.participants.then((t=>{this.currentGroupCall===e&&e.state!==c.Z.CLOSED&&t.forEach((t=>{t.pFlags.self||e.onParticipantUpdate(t)}))}))}))}))}joinGroupCallInternal(e,t,i,s,n=!1,a){return v(this,void 0,void 0,(function*(){const o=this.log.bindPrefix("joinGroupCallInternal");o("start",t);const r="main";let{currentGroupCall:h}=this;if(!h||!n){h=new l.Z({chatId:e,id:t,managers:this.managers}),h.fixSafariAudio(),h.addEventListener("state",(e=>{this.currentGroupCall===h&&e===c.Z.CLOSED&&(this.setCurrentGroupCall(null),this.stopConnectingSound(),this.audioAsset.playSound("group_call_end.mp3"),d.Z.dispatchEvent("chat_update",h.chatId))})),h.groupCall=yield this.managers.appGroupCallsManager.getGroupCallFull(t);const u=h.createConnectionInstance({streamManager:i,type:r,options:{type:r,isMuted:s,joinVideo:a,rejoin:n}}),p=u.createPeerConnection();return p.addEventListener("negotiationneeded",(()=>{u.negotiate()})),p.addEventListener("track",(e=>{o("ontrack",e),h.onTrack(e)})),p.addEventListener("iceconnectionstatechange",(()=>{h.dispatchEvent("state",h.state);const{iceConnectionState:e}=p;switch("disconnected"===e||"checking"===e||"new"===e?this.startConnectingSound():this.stopConnectingSound(),e){case"checking":case"completed":case"disconnected":case"new":break;case"closed":case"failed":h.hangUp();break;case"connected":h.joined||(h.joined=!0,this.audioAsset.playSound("group_call_start.mp3"),this.managers.appGroupCallsManager.getGroupCallParticipants(t))}})),u.createDescription(),u.createDataChannel(),u.appendStreamToConference(),this.setCurrentGroupCall(h),o("set currentGroupCall",t,h),this.startConnectingSound(),u.negotiate()}h.handleUpdateGroupCallParticipants=!1,h.updatingSdp=!1,o("update currentGroupCall",t,h)}))}}const C=new S;a.GO&&(a.GO.groupCallController=C);const L=C},9125:(e,t,i)=>{"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}i.d(t,{Z:()=>s})},9337:(e,t,i)=>{"use strict";function s(e){const t={video:{width:{max:1920},height:{max:1080},frameRate:{max:30}}};return e||(t.audio=!0),t}i.d(t,{Z:()=>s})},382:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});function s(e){return t=this,i=void 0,n=function*(){const t=yield navigator.mediaDevices.getDisplayMedia(e);return t.getVideoTracks()[0].contentHint="text",t},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}},5424:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});function s(e,t){return i=this,s=void 0,a=function*(){const i=yield navigator.mediaDevices.getUserMedia(e);return i.getTracks().forEach((e=>{e.enabled=!t})),i},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}window.getStream=s},312:(e,t,i)=>{"use strict";function s(){return{width:{min:1280,max:1920},height:{min:720,max:1080},frameRate:{min:24,max:30}}}i.d(t,{Z:()=>s})},3773:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(8957);function n(e,t){const i=t.lookupAttributeKeys({"ice-ufrag":!0,"ice-pwd":!0,fingerprint:!0,setup:!0,ssrc:!0,mid:!0,"ssrc-group":!1});if(!i.fingerprint){const t=e.session.lines.find((e=>{var t;return"fingerprint"===(null===(t=e.parsed)||void 0===t?void 0:t.key)}));i.fingerprint=t.parsed.value}const n=function(e){const t=e.map((e=>{const[t,...i]=e.split(" ");return{_:"groupCallParticipantVideoSourceGroup",semantics:t,sources:i.map((e=>(0,s.Fk)(+e)))}}));return t.length?t:void 0}(i["ssrc-group"]),[a,o]=i.fingerprint.split(" ",2),r=i.ssrc&&(0,s.Fk)(+i.ssrc.split(" ",1)[0]);return{raw:i,ufrag:i["ice-ufrag"],pwd:i["ice-pwd"],fingerprint:{fingerprint:o,setup:i.setup,hash:a},source:r,sourceGroups:n,mid:i.mid}}},49:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(6669);function n(e){e.stop(),(0,s.Z)(e,"ended")}},6752:(e,t,i)=>{"use strict";i.d(t,{Lp:()=>o,ZP:()=>d,z_:()=>r});var s=i(1655),n=i(5953),a=i(4373);class o{constructor(e,t){this.mid=e,this.type=t,this.port=a._D}setDirection(e){return this.originalDirection||(this.originalDirection=e),this.direction=e}setPort(e){return this.port=e}setEndpoint(e){return this.endpoint=e}setPeerId(e){return this.peerId=e}createTransceiver(e,t){return(null==t?void 0:t.direction)&&this.setDirection(t.direction),this.transceiver=e.addTransceiver((0,a.pl)(this.type),t)}setSource(e){let t;if(Array.isArray(e)){if(!e[0])return;t=e,e=t[0].sources[0]}return this.sourceGroups=t,this.source=e}shouldBeSkipped(e){return e&&"inactive"===this.direction}}function r(e,t,i){let s;if(Array.isArray(t)){if(!t[0])return;s=t,t=s[0].sources[0]}return{endpoint:i,type:e,source:t,sourceGroups:s}}class d{constructor(e){this.connection=e,this.sessionId=""+Date.now(),this.maxSeenId=-1,this.entries=[],this.entriesByMid=new Map,this.entriesBySource=new Map,this.entriesByPeerId=new Map}setData(e){return(0,n.Z)(this,e)}createEntry(e){const t=""+ ++this.maxSeenId,i=new o(t,e);return this.entries.push(i),this.entriesByMid.set(t,i),i}deleteEntry(e){(0,s.Z)(this.entries,e),this.entriesByMid.delete(e.mid),this.entriesBySource.delete(e.source);const t=this.entriesByPeerId.get(e.peerId);t&&(t.delete(e),t.size||this.entriesByPeerId.delete(e.peerId))}setEntrySource(e,t){e.setSource(t),this.entriesBySource.set(e.source,e)}setEntryPeerId(e,t){e.setPeerId(t);let i=this.entriesByPeerId.get(t);i||this.entriesByPeerId.set(t,i=new Set),i.add(e)}findEntry(e){return this.entries.find(e)}findFreeSendRecvEntry(e,t){let i=this.entries.find((i=>"sendrecv"===i.direction&&i.type===e&&!(t?i.sendEntry:i.recvEntry)));return i||(i=this.createEntry(e),i.setDirection("sendrecv")),i}getEntryByMid(e){return this.entriesByMid.get(e)}getEntryBySource(e){return this.entriesBySource.get(e)}getEntriesByPeerId(e){return this.entriesByPeerId.get(e)}generateSdp(e){return a.DY.fromConference(Object.assign({conference:this},e))}}},9124:(e,t,i)=>{"use strict";i.d(t,{e6:()=>de,DV:()=>oe});var s,n,a=function(e,t,i,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,i):n?n.value=i:t.set(e,i),i},o=function(e,t,i,s){if("a"===i&&!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"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class r{constructor(e,t){s.set(this,void 0),n.set(this,void 0),a(this,s,e,"f"),a(this,n,t,"f")}get session(){return o(this,s,"f")}get media(){return o(this,n,"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 d(e,t,i){const s=e.split(t),n=[];for(;i>0&&s.length;)n.push(s.shift()),--i;return s.length&&n.push(s.join(t)),n}s=new WeakMap,n=new WeakMap;var l,c,h,u=function(e,t,i,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,i):n?n.value=i:t.set(e,i),i},p=function(e,t,i,s){if("a"===i&&!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"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class f{constructor(e,t){l.set(this,void 0),c.set(this,void 0),h.set(this,void 0),u(this,l,new Set,"f"),u(this,c,e,"f"),u(this,h,t,"f")}generate(){const e=p(this,c,"f"),t=p(this,h,"f"),i=p(this,l,"f"),s=t-e+1;let n=Math.floor(e+s*Math.random()),a=0;for(;i.has(n);)if(n=s)return null;return i.add(n),n}add(e){p(this,l,"f").add(e)}}l=new WeakMap,c=new WeakMap,h=new WeakMap;var m,g,v=function(e,t,i,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,i):n?n.value=i:t.set(e,i),i},b=function(e,t,i,s){if("a"===i&&!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"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class y{constructor(e,t){m.set(this,void 0),g.set(this,void 0),v(this,m,e,"f"),v(this,g,t,"f")}get key(){return b(this,m,"f")}get value(){return b(this,g,"f")}}m=new WeakMap,g=new WeakMap;var w,S,C,L,E=function(e,t,i,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,i):n?n.value=i:t.set(e,i),i},I=function(e,t,i,s){if("a"===i&&!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"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class M{constructor(e,t,i,s){w.set(this,void 0),S.set(this,void 0),C.set(this,void 0),L.set(this,void 0),E(this,w,e,"f"),E(this,S,t,"f"),E(this,C,i,"f"),E(this,L,s,"f")}get type(){return I(this,w,"f")}get port(){return I(this,S,"f")}get protocol(){return I(this,C,"f")}get ids(){return I(this,L,"f")}toString(){return this.type+" "+this.port+" "+this.protocol+" "+this.ids.join(" ")}}w=new WeakMap,S=new WeakMap,C=new WeakMap,L=new WeakMap;var P,Z,T,k,x=function(e,t,i,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,i):n?n.value=i:t.set(e,i),i},A=function(e,t,i,s){if("a"===i&&!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"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class _{constructor(e,t){if(P.set(this,void 0),Z.set(this,void 0),T.set(this,void 0),k.set(this,void 0),x(this,P,e,"f"),"string"==typeof t){if(x(this,Z,t,"f"),"m"===e){const e=t.split(" ");x(this,T,new M(e[0],e[1],e[2],e.slice(3)),"f")}else if("a"===e){const e=d(t,":",1);t=e[0],x(this,k,1===e.length?new y(t,null):new y(t,e[1]),"f")}}else t instanceof M?(x(this,T,t,"f"),x(this,Z,t.toString(),"f")):t instanceof y&&(x(this,k,t,"f"),x(this,Z,t.value?`${t.key}:${t.value}`:t.key,"f"))}get key(){return A(this,P,"f")}get value(){return A(this,Z,"f")}get parsed(){return A(this,k,"f")}get mediaLineParts(){return A(this,T,"f")}toString(){return`${this.key}=${this.value}`}}P=new WeakMap,Z=new WeakMap,T=new WeakMap,k=new WeakMap;var F,D,R,B,N,O,U=function(e,t,i,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,i):n?n.value=i:t.set(e,i),i},H=function(e,t,i,s){if("a"===i&&!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"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class z{constructor(e,t,i=":",s=!1){F.set(this,void 0),D.set(this,void 0),R.set(this,void 0),B.set(this,void 0),N.set(this,void 0),O.set(this,void 0),U(this,F,e,"f"),U(this,D,t,"f"),U(this,R,i,"f"),U(this,N,s,"f"),U(this,B,s?new Map:null,"f"),U(this,O,s?[]:null,"f")}get lines(){return H(this,D,"f")}get value(){return H(this,N,"f")||!this.lines.length?null:this.lines[0]}get exists(){return!H(this,N,"f")}get key(){return H(this,F,"f")}get keys(){return z.fill(this),H(this,O,"f")}forEach(e){z.fill(this),H(this,B,"f").forEach(e)}get(e){return z.fill(this),H(this,B,"f").get(e)||new z(e,[],":",!0)}static fill(e){if(null!==H(e,B,"f"))return;const t=new Map;e.lines.forEach((i=>{const[s,n]=d(i,H(e,R,"f"),1),a=t.get(s)||[];t.set(s,[...a,n||""])}));const i=U(e,B,z.makeAttributes(t),"f");U(e,O,Array.from(i.keys()),"f")}static makeAttributes(e){const t=new Map;return e.forEach(((e,i)=>{t.set(i,new z(i,e))})),t}}F=new WeakMap,D=new WeakMap,R=new WeakMap,B=new WeakMap,N=new WeakMap,O=new WeakMap;var j,G,V=function(e,t,i,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,i):n?n.value=i:t.set(e,i),i},K=function(e,t,i,s){if("a"===i&&!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"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class W{constructor(e){j.set(this,void 0),G.set(this,void 0),V(this,j,e,"f"),V(this,G,new Map,"f"),W.fillAttributes(this)}get(e){return K(this,G,"f").get(e)||new z(e,[]," ",!0)}static fillAttributes(e){const t=new Map;K(e,j,"f").forEach((e=>{if("a"===e.key){const{key:i,value:s}=e.parsed;let n=t.get(i);n||(n=[],t.set(i,n)),n.push(s||"")}})),t.forEach(((t,i)=>{K(e,G,"f").set(i,new z(i,t," ",!1))}))}}j=new WeakMap,G=new WeakMap;var $,q,Y,Q,X=function(e,t,i,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,i):n?n.value=i:t.set(e,i),i},J=function(e,t,i,s){if("a"===i&&!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"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class ee{constructor(e){$.set(this,void 0),q.set(this,void 0),Y.set(this,void 0),Q.set(this,void 0),X(this,$,e,"f"),X(this,q,e[0],"f"),X(this,Y,X(this,Q,null,"f"),"f")}get lines(){return J(this,$,"f")}get mediaLine(){return J(this,q,"f")}get mediaLineParts(){return J(this,q,"f").mediaLineParts}get mediaType(){return this.mediaLineParts.type}get direction(){if(!J(this,Q,"f")){const e=this.attributes;let t;t=e.get("sendonly").exists?"sendonly":e.get("recvonly").exists?"recvonly":e.get("inactive").exists?"inactive":"sendrecv",X(this,Q,t,"f")}return J(this,Q,"f")}get isSending(){return"sendrecv"===this.direction||"sendonly"===this.direction}get isReceiving(){return"sendrecv"===this.direction||"recvonly"===this.direction}get attributes(){return J(this,Y,"f")||X(this,Y,new W(this.lines),"f"),J(this,Y,"f")}get mid(){return this.attributes.get("mid").value}lookupAttributeKeys(e){const t={};for(const i in e){const s=this.attributes.get(i),n=!e[i];t[i]=s?n?s.lines:s.value:n?[]:void 0}return t}}$=new WeakMap,q=new WeakMap,Y=new WeakMap,Q=new WeakMap;var te,ie,se=function(e,t,i,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,i):n?n.value=i:t.set(e,i),i},ne=function(e,t,i,s){if("a"===i&&!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"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class ae{constructor(e){te.set(this,void 0),ie.set(this,void 0),se(this,te,e,"f"),se(this,ie,e.filter((e=>"o"===e.key)).map((e=>e.value.split(" ")[1]))[0],"f")}get lines(){return ne(this,te,"f")}get sessionId(){return ne(this,ie,"f")}}function oe(e){function t(){i?n.push(new ee(s)):i=new ae(s)}let i=null,s=[];const n=[];return e.split(/\r?\n/).forEach((e=>{if(!function(e){return/^[\s\xa0]*$/.test(e)}(e)){const i=re(e);"m"===i.key&&(t(),s=[]),s.push(i)}})),t(),new r(i,n)}function re(e){const t=d(e,"=",1);return new _(t[0],t[1])}function de(e){let t;return e.media.forEach(((i,s)=>{if("video"===i.mediaType&&i.isSending&&!i.attributes.get("ssrc-group").get("SIM").exists){t||(t=new f(2,4294967295));const n=i.attributes.get("ssrc-group").get("FID").value.split(" "),a=i.lines;n.forEach((e=>t.add(+e)));const o=[n[0],t.generate(),t.generate()],r=[n[1],t.generate(),t.generate()];a.push(re("a=ssrc-group:SIM "+o.join(" ")));const d=i.attributes.get("ssrc").get(n[0]).lines;o.forEach(((e,t)=>{const i=r[t];t>0&&(a.push(re("a=ssrc-group:FID "+e+" "+i)),d.forEach((t=>{a.push(re("a=ssrc:"+e+" "+t))})),d.forEach((e=>{a.push(re("a=ssrc:"+i+" "+e))})))})),e.media[s]=new ee(a)}})),!!t}te=new WeakMap,ie=new WeakMap},4373:(e,t,i)=>{"use strict";i.d(t,{DY:()=>c,Px:()=>l,_D:()=>o,pl:()=>r});var s=i(4762),n=i(630),a=i(8957);const o="9";function r(e){return"screencast"===e?"video":e}function d(e){return"application"===e?"DTLS/SCTP":"UDP/TLS/RTP/SAVPF"}function l(e,t=o,i){const s=d(e);return`m=${r(e)} ${t} ${s} ${i.join(" ")}`}class c extends n.Z{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 i=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 ${i}`,"a=ice-options:trickle","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:i,sourceGroups:s}=e;const n=(0,a.h)(e.source);t+=n,i+=n;const o=e=>{this.add(`a=ssrc:${e} cname:${t}`,`a=ssrc:${e} msid:${t} ${i}`,`a=ssrc:${e} mslabel:${t}`,`a=ssrc:${e} label:${i}`)};return(()=>{this.add(`a=msid:${t} ${i}`)})(),(null==s?void 0:s.length)?s.forEach((e=>{if(e.sources.length){const t=e.sources.map(a.h);this.add(`a=ssrc-group:${e.semantics} ${t.join(" ")}`),t.forEach(o)}})):o(n),this}addSsrcEntry(e,t,i){const s=(...e)=>this.add(...e),{type:n,mid:a,direction:o,port:c}=e,h=t.transport,u="application"===n,p=u?void 0:t[n],f="inactive"===o;if(e.shouldBeSkipped(i))return s(`m=${r(n)} 0 ${d(n)} 0`,"c=IN IP4 0.0.0.0","a=inactive",`a=mid:${a}`);const m=u?[{id:5e3}]:p["payload-types"],g=m.map((e=>e.id));s(l(n,c,g),"c=IN IP4 0.0.0.0",`a=rtcp:${c} IN IP4 0.0.0.0`),h["rtcp-mux"]&&s("a=rtcp-mux"),s(`a=mid:${a}`);let v=o;if("sendrecv"===o||!i||f||u||(v="sendonly"===o?"recvonly":"sendonly"),s(`a=${v}`),this.addTransport(h),u)s(`a=sctpmap:${m[0].id} webrtc-datachannel 256`);else{const e=p["rtp-hdrexts"];(null==e?void 0:e.length)&&e.forEach((e=>{s(`a=extmap:${e.id} ${e.uri}`)})),m.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 i=[];for(const e in t)i.push(`${e}=${t[e]}`);s(`a=fmtp:${e.id} ${i.join(";")}`)}const i=e["rtcp-fbs"];(null==i?void 0:i.length)&&i.forEach((t=>{s(`a=rtcp-fb:${e.id} ${t.type}${t.subtype?" "+t.subtype:""}`)}))}))}return!e.source||"sendonly"!==v&&"sendrecv"!==v||this.addSsrc(e),this}addConference(e){const{conference:t,entries:i,bundle:n,isAnswer:a}=e;this.addHeader(t.sessionId,n),s.IS_FIREFOX&&this.addTransport(t.transport);for(const e of i)this.addSsrcEntry((a?e.recvEntry||e.sendEntry:e.sendEntry||e.recvEntry)||e,t,a);return this}static fromConference(e){return(new c).addConference(e).finalize()}}},9585:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(3241),n=i(5003),a=i(1677),o=i(49),r=i(4373),d=i(8957);class l{constructor(e,t){const i=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,i.connect(s)}}class c{constructor(e){this.interval=e,this.getAmplitude=e=>{const{streamAnalyser:t,stream:i,track:s,source:n,type:a}=e,o=t.analyser;if(!o)return;const r=new Uint8Array(o.frequencyBinCount);return o.getByteFrequencyData(r),{type:a,source:n,stream:i,track:s,value:(0,d.UN)(r)}},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,a.KM).map(this.getAmplitude);++this.counter>=1e3&&(this.counter=0),c.ANALYSER_LISTENER.dispatchEvent("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=(0,n.kg)("SM"),this.direction="sendonly",this.canCreateConferenceEntry=!0,this.types=["audio","video"]}addStream(e,t){e.getTracks().forEach((i=>{this.addTrack(e,i,t)}))}addTrack(e,t,i){this.log("addTrack",i,t,e);const{context:s,items:n,inputStream:a,outputStream:o}=this,r=t.kind,d=c.getSource(e,i);switch(i){case"input":a?a.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:""+(0,d.Fk)(+e.id.substring(6))}removeTrack(e){this.log("removeTrack",e);const{items:t}=this;let i=!1;for(let s=0,n=t.length;!i&&s[e,n])),o=t.getTracks();for(const[t,n]of a){let a=e.findEntry((e=>e.direction===i&&e.type===t));if(!a){if(!s)continue;a=e.createEntry(t)}let{transceiver:d}=a;d||(d=a.createTransceiver(e.connection,n)),a.direction!==d.direction&&(d.direction=a.direction);const l=(0,r.pl)(t),c=o.findIndex((e=>e.kind===l)),h=-1!==c?o.splice(c,1)[0]:void 0,u=d.sender;u.track!==h&&u.replaceTrack(h).catch((e=>{this.log.error(e)}))}}stop(){try{this.inputStream.getTracks().concat(this.outputStream.getTracks()).forEach((e=>{(0,o.Z)(e)}))}catch(e){this.log.error(e)}}}c.ANALYSER_LISTENER=new s.Z},630:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});class s{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}}},8957:(e,t,i)=>{"use strict";function s(e){return e<<0}function n(e){return e>>>0}function a(e,t=3){if(!e)return 0;const{length:i}=e;let s=0;for(let t=0;ts,UN:()=>a,h:()=>n})},3785:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(7197),n=i(1229);const a=new RegExp(`(^${n.Z})`);function o(e,t=!1){const i=(e||"").trim().split(" ");if(!i[0])return{text:"",entities:[]};const n=[],o=i[0].match(a),r=(null==o?void 0:o[0])||i[0][0];o&&n.push((0,s.Z)(r));const d=i.length;if(t||1===d)return{text:r,entities:n};const l=i[d-1].match(a),c=(null==l?void 0:l[0])||i[d-1][0];return l&&n.push(Object.assign(Object.assign({},(0,s.Z)(c)),{offset:r.length})),{text:r+c,entities:n}}},7197:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(671);function n(e){return{_:"messageEntityEmoji",offset:0,length:e.length,unicode:(0,s.w1)(e).join("-").replace(/-?fe0f/g,"")}}},1171:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(2423);function n(e){return e?e.match(s.E):null}},2521:(e,t,i)=>{"use strict";function s(e){return e.target="_blank",e.rel="noopener noreferrer",e}i.d(t,{Z:()=>s})},5798:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(8115),n=i(3785);function a(e,t){const{text:i,entities:a}=(0,n.Z)(e,t);return(0,s.Z)(i,void 0,a)}},3066:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(3512),n=i(5400);function a(e,t={}){if(!e)return(0,n.ZP)("");let i=t.entities;return i&&!s.Z.premium&&t.wrappingForPeerId!==s.Z.myId&&(i=i.filter((e=>"messageEntityCustomEmoji"!==e._))),(0,n.ZP)(e,Object.assign(Object.assign({},t),{entities:i,noLinks:!0,wrappingDraft:!0,passEntities:{messageEntityTextUrl:!0,messageEntityMentionName:!0}}))}},8115:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(6535),n=i(5400);function a(e,t=!1,i){return e?(null!=i||(i=(0,s.Z)(e).filter((e=>"messageEntityEmoji"===e._))),(0,n.ZP)(e,{entities:i,wrappingDraft:t})):(0,n.ZP)("")}},5400:(e,t,i)=>{"use strict";i.d(t,{LD:()=>_,KZ:()=>F,SZ:()=>G,ZP:()=>j,Cx:()=>K,Hc:()=>V});var s=i(2423),n=i(3447),a=i(9976),o=i(8479),r=i(4056),d=i(1379),l=i(6535),c=i(2521),h=i(3591);const u={};a.Z&&(u[""]=!0,[["14","๐Ÿซฑ๐Ÿป"]].forEach((([e,t])=>{u[e]=function(e){const t=document.createElement("span");t.classList.add("emoji"),document.body.appendChild(t),t.innerText=e;const i=t.offsetWidth;t.innerText="โค๏ธ";const s=t.offsetWidth;return document.body.removeChild(t),Math.abs(i-s)<5}(t)})));const p=u;var f=i(2738),m=i(3512),g=i(4755),v=i(3541),b=i(3772),y=i(5814),w=i(2153),S=i(393),C=i(8938),L=i(319),E=i(8497),I=i(4881),M=i(3624),P=i(5565),Z=i(6854),T=i(645),k=i(4497);const x=new ResizeObserver((e=>{for(const t of e)t.target.parentElement.setDimensionsFromRect(t.contentRect)})),A=new w.Z;class _ extends HTMLElement{constructor(){super(),this.paused=!0,this.classList.add("custom-emoji")}get docId(){return this.dataset.docId}static create(e){const t=new _;return t.dataset.docId=""+e,t}get isConnected(){var e,t;return null!==(t=null===(e=this.placeholder)||void 0===e?void 0:e.isConnected)&&void 0!==t?t:super.isConnected}connectedCallback(){this.player&&y.Z.addAnimation(this,this.renderer.animationGroup,void 0,!0)}disconnectedCallback(){var e;!this.isConnected&&(null===(e=this.renderer)||void 0===e?void 0:e.isSelectable)&&this.clear()}destroy(){this.clear()}clear(e=!0){var t;if(this.clean)return;this.clean=!0,this.pause();const{syncedPlayer:i}=this;if(i&&i.pausedElements.delete(this),null===(t=this.middlewareHelper)||void 0===t||t.clean(),this.renderer){const t=this.renderer.customEmojis.get(this.docId);(null==t?void 0:t.delete(this))&&!t.size&&(this.renderer.customEmojis.delete(this.docId),this.renderer.playersSynced.delete(t)),e&&(this.renderer.isSelectable?this.replaceChildren(G(!0)):this.replaceChildren())}this.player&&y.Z.removeAnimationByPlayer(this),A&&A.delete({div:this}),this.elements=this.renderer=this.player=this.syncedPlayer=void 0}pause(){this.paused||(this.paused=!0,this.player instanceof HTMLVideoElement&&!this.syncedPlayer&&(this.renderer.lastPausedVideo=this.player,this.player.pause()),this.syncedPlayer&&!this.syncedPlayer.pausedElements.has(this)&&(this.syncedPlayer.pausedElements.add(this),this.syncedPlayer.player&&this.syncedPlayer.pausedElements.size===this.syncedPlayer.middlewares.size&&this.syncedPlayer.player.pause()))}play(){var e;this.paused&&(this.paused=!1,this.player instanceof HTMLVideoElement&&(this.player.currentTime=(null===(e=this.renderer.lastPausedVideo)||void 0===e?void 0:e.currentTime)||this.player.currentTime,this.player.play().catch(L.Z)),this.syncedPlayer&&this.syncedPlayer.pausedElements.has(this)&&(this.syncedPlayer.pausedElements.delete(this),this.syncedPlayer.pausedElements.size!==this.syncedPlayer.middlewares.size&&this.player.play()))}remove(){this.clear()}get autoplay(){return!0}}class F extends HTMLElement{constructor(){super(),this.classList.add("custom-emoji-renderer"),this.canvas=document.createElement("canvas"),this.canvas.classList.add("custom-emoji-canvas"),this.context=this.canvas.getContext("2d"),this.append(this.canvas),this.playersSynced=new Map,this.clearedElements=new WeakSet,this.customEmojis=new Map,this.animationGroup="EMOJI",this.isCanvasClean=!1}connectedCallback(){B.has(this)||(x.observe(this.canvas),B.add(this),this.connectedCallback=void 0)}disconnectedCallback(){var e;!this.isConnected&&this.auto&&(null===(e=this.destroy)||void 0===e||e.call(this),this.disconnectedCallback=void 0)}destroy(){var e;x.unobserve(this.canvas),this.customEmojis.forEach((e=>{e.forEach((e=>{e.clear()}))})),B.delete(this),this.playersSynced.clear(),null===(e=this.middlewareHelper)||void 0===e||e.clean(),this.customEmojis.clear(),this.destroy=this.lastPausedVideo=void 0}getOffsets(e=new Map){if(!this.playersSynced.size)return e;const t=(0,E.Z)(this,"scrollable")||this.offsetParent;if(!t)return e;const i=t.getBoundingClientRect(),s=this.getBoundingClientRect();for(const n of this.playersSynced.keys()){const a=Array.from(n),o=this.isSelectable?a.map((e=>e.placeholder)):a,{visible:r}=(0,I.Z)({overflowElement:t,overflowRect:i,elements:o,extraSize:2.5*this.size.height}),d=r.map((({rect:e})=>({top:e.top-s.top,left:e.left-s.left,width:e.width})));d.length&&e.set(n,d)}return e}clearCanvas(){if(this.isCanvasClean)return;const{context:e,canvas:t}=this;e.clearRect(0,0,t.width,t.height),this.isCanvasClean=!0}render(e){const{context:t,canvas:i,isDimensionsSet:s}=this;s||this.setDimensionsFromRect(void 0,!1),this.isCanvasClean=!1;const{width:n,height:a,dpr:o}=i;for(const[i,s]of e){const e=this.playersSynced.get(i),a=O.get(e)||(e instanceof HTMLVideoElement?e:void 0);if(!a)continue;const r=a instanceof ImageData;let d,l;e instanceof HTMLVideoElement?(d=this.size.width*o,l=this.size.height*o):(d=a.width,l=a.height);const c=Math.round(s[0].width*o);c!==d&&(d=c,l=c);const h=n-d;this.clearedElements.has(i)||this.isSelectable||(this.isSelectable?i.forEach((e=>{var t;null!==(t=e.lastChildWas)&&void 0!==t||(e.lastChildWas=e.lastChild),(0,P.Z)(e,e.firstChild)})):i.forEach((e=>{e.replaceChildren()})),this.clearedElements.add(i)),s.forEach((({top:e,left:i})=>{e=Math.round(e*o),(i=Math.round(i*o))<0||i>h||(r?t.putImageData(a,i,e):t.drawImage(a,i,e,d,l))}))}}checkForAnyFrame(){for(const e of this.playersSynced.values())if(O.has(e)||e instanceof HTMLVideoElement)return!0;return!1}remove(){super.remove()}setDimensionsFromRect(e=this.lastRect,t=!0){const{canvas:i}=this,{dpr:s}=i;if(this.lastRect!==e&&(this.lastRect=e),!e||!s||this.ignoreSettingDimensions)return;const{width:n,height:a}=e,o=Math.floor(Math.round(n*s)),r=Math.floor(Math.round(a*s));i.width===o&&i.height===r||(i.width=o,i.height=r,this.isDimensionsSet=!0,this.isCanvasClean=!0,(this.forceRenderAfterSize||this.isSelectable&&t)&&(this.forceRenderAfterSize=void 0,this.forceRender()))}forceRender(){this.isDimensionsSet&&(U(new Set([this]))||this.clearCanvas())}add(e,t,i,s){const n=this;if(e.forEach(((t,i)=>{let s=this.customEmojis.get(i);s?this.clearedElements.delete(s):this.customEmojis.set(i,s=new Set);for(const e of t)s.has(e)?t.delete(e):(e.clean=!1,e.renderer=n,e.elements=s,e.middlewareHelper=this.middlewareHelper.get().create(),s.add(e),e.lastChildWas&&!e.lastChildWas.parentNode&&e.append(e.lastChildWas));t.size||e.delete(i)})),!e.size)return;const a=!(t||!1===t||!A),o=Array.from(e.keys()),r=m.Z.managers,d=this.middlewareHelper.get(),l=this.size;return r.appEmojiManager.getCachedCustomEmojiDocuments(o).then((c=>{if(d&&!d())return;const h=[],u=(o,c)=>{const h=o.id,u=e.get(h),p=n.customEmojis.get(h),f=2===o.sticker,m="video/webm"===o.mime_type&&!S.Z,g=(f||3===o.sticker&&this.isSelectable)&&!i&&!m,w=[],E=Array.from(u),I=(0,v.ZP)({div:E,doc:o,width:l.width,height:l.height,loop:!0,play:D,managers:r,isCustomEmoji:!0,group:"none",loadPromises:w,middleware:d,exportLoad:a||!1===t?2:1,needFadeIn:!1,loadStickerMiddleware:g&&d?d.create().get((()=>!!P.middlewares.size)):void 0,static:m,onlyThumb:i,withThumb:null!=s?s:!n.clearedElements.has(p)&&void 0,syncedVideo:this.isSelectable});c&&I.then((()=>c.push(...w)));const M={elements:u};if(1===o.sticker||i||m)return this.isSelectable&&(M.onRender=()=>Promise.all(w).then((()=>{d&&!d()||E.forEach((e=>{const{placeholder:t}=e;t.src=e.firstElementChild.src}))}))),I.then((e=>Object.assign(Object.assign({},e),M)));let P;M.onRender=e=>Promise.all(w).then((()=>{var t;if(d&&!d()||!o.animated)return;const i=Array.isArray(e)?e:[e],s=Array.isArray(i)?i[0]:i;if((0,C.Z)(s),E.forEach(((e,t)=>{const s=i[t]||i[0];e.player=s,P&&(e.syncedPlayer=P,e.paused?e.syncedPlayer.pausedElements.add(e):s.paused&&s.play()),e.isConnected&&y.Z.addAnimation(e,e.renderer.animationGroup,void 0,!0)})),(s instanceof b.Z||s instanceof HTMLVideoElement&&this.isSelectable)&&(P.player=s,n.playersSynced.set(p,s)),s instanceof b.Z?(s.group=n.animationGroup,null!==(t=s.overrideRender)&&void 0!==t||(s.overrideRender=e=>{O.set(s,e)})):HTMLVideoElement,g){const e=(0,b.a)(this.size.width,this.size.height);n.canvas.dpr=e,H()}}));const Z=[h,l.width,l.height].join("-");if(g){P=N.get(Z),P||(P={player:void 0,middlewares:new Set,pausedElements:new Set,key:Z},N.set(Z,P));for(const e of u){const t=e.middlewareHelper.get();P.middlewares.add(t),t.onClean((()=>{var i,s;if(P.middlewares.delete(t),!P.middlewares.size){if(P.player){const t=O.get(P.player);if(t&&(null===(s=(i=t).close)||void 0===s||s.call(i),O.delete(P.player)),O.delete(P.player),P.player instanceof b.Z)P.player.overrideRender=L.Z,P.player.remove();else if(P.player instanceof HTMLVideoElement){const t=T.Z.generateName(""+e.docId,0,0,void 0,void 0);delete v._i[t]}P.player=void 0}N.get(P.key)===P&&N.delete(P.key)&&!N.size&&z()}}))}}return I.then((e=>Object.assign(Object.assign({},e),M)))},p=[],f=c.map(((e,t)=>{if(e)return u(e,h);p.push(o[t])})).filter(Boolean),m=p.length?r.appEmojiManager.getCustomEmojiDocuments(p).then((e=>d&&!d()?[]:e.filter(Boolean).map((e=>u(e))))):Promise.resolve([]),g=e=>Promise.all(e).then((e=>{const t=e.map((({load:e,onRender:t,elements:i})=>{if(!e)return;const s=()=>e().then(t);if(!a)return s();i.forEach((e=>{A.push({div:e,load:()=>(i.forEach((e=>{A.delete({div:e})})),s())})}))}));return Promise.all(t)})),w=()=>{if(d&&!d())return;const e=g(f),t=m.then((e=>g(e)));return Promise.all([e,t])};return t?t.push({div:n.canvas,load:w}):w(),Promise.all(f).then((()=>Promise.all(h))).then((()=>{}))}))}static create(e){const t=new F;t.animationGroup=e.animationGroup,t.size=e.customEmojiSize||g.Z.active.customEmoji,t.isSelectable=e.isSelectable,e.wrappingDraft&&(t.contentEditable="false",t.style.height="inherit");let i=e.middleware;return i?(t.middlewareHelper=i.create(),i=t.middlewareHelper.get(),i.onDestroy((()=>{var e;null===(e=t.destroy)||void 0===e||e.call(t)}))):(t.auto=!0,t.middlewareHelper=(0,M.k)()),t}}const D=!0;let R;const B=new Set,N=new Map,O=new Map,U=(e=B)=>{const t=Array.from(e).filter((e=>e.isConnected&&e.checkForAnyFrame()&&!e.ignoreSettingDimensions));if(!t.length)return!1;const i=t.map((e=>{const t=[...e.playersSynced.values()].reduce(((e,t)=>e+ +!!t.paused),0);if(e.playersSynced.size===t)return;const i=e.getOffsets();return i.size?[e,i]:void 0})).filter(Boolean);for(const[e]of i)e.clearCanvas();for(const[e,t]of i)e.render(t);return!0},H=()=>{R||(R=window.setInterval(U,16.666666666666668),U())},z=()=>{R&&(clearInterval(R),R=void 0)};function j(e,t={}){var i,u,m,g,v,b,y,w;const S=document.createDocumentFragment();if(!e)return S;const C=null!==(i=t.nasty)&&void 0!==i?i:t.nasty={i:0,usedLength:0,text:e},L=(e,i)=>{const s=document.createElement("span");return t.wrappingDraft&&(s.contentEditable="false"),s.classList.add("input-something"),s.append(e),(D||S).append(s),e.classList.add("input-selectable"),!i&&e.append(G(!0)),I.add(s),s};t.isSelectable||(t.isSelectable=t.wrappingDraft);const E=null!==(u=t.customEmojis)&&void 0!==u?u:t.customEmojis=new Map,I=null!==(m=t.customWraps)&&void 0!==m?m:t.customWraps=new Set,M=null!==(g=t.entities)&&void 0!==g?g:t.entities=(0,l.Z)(C.text),P=null!==(v=t.passEntities)&&void 0!==v?v:t.passEntities={},Z=null!==(b=t.contextSite)&&void 0!==b?b:t.contextSite="Telegram",T="Telegram"!==Z,x=C.text.length,A=M.length;let D;for(;C.i=x){if("messageEntityCaret"!==e._)continue}else e.offset+e.length>x&&(e=(0,o.Z)(e),e.length=x-e.offset);e.length&&(C.lastEntity=e);let i=M[C.i+1];const l=e.offset,u=l+e.length,m=Math.min(u,null!==(y=null==i?void 0:i.offset)&&void 0!==y?y:65535),g=C.text.slice(l,u);let v=C.text.slice(l,m);C.usedLengthv.length&&b?b:S,t.voodoo)return S}var R;if(C.lastEntity&&(C.usedLength=C.lastEntity.offset+C.lastEntity.length),C.usedLength{const t=document.createElement("span");return t.classList.add(e?"input-filler2":"input-filler"),t.textContent=Z.Z,t};function V(e){var t;if((null==e?void 0:e.textContent)!==Z.Z||"false"===(null===(t=null==e?void 0:e.getAttribute)||void 0===t?void 0:t.call(e,"contenteditable"))){if(!e||e.textContent!==Z.Z||e.firstElementChild)return 2;if(e.nodeType===e.ELEMENT_NODE)return 1}return 0}function K(e){const t=(e,t,i)=>{const s=V(t);2===s?e[i](G()):1===s&&t.appendChild(document.createTextNode(Z.Z))};for(const i of e){const{previousSibling:e,nextSibling:s}=i;t(i,e,"before"),t(i,s,"after")}}window.wrapRichText=j},4497:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(3591);function n(e){const{url:t,onclick:i}=(0,s.Z)(e),n=document.createElement("a");return n.href=t,i&&n.setAttribute("onclick",`${i}(this)`),n}},1447:(e,t,i)=>{"use strict";i.d(t,{Z:()=>v});var s=i(5814),n=i(410),a=i(5418),o=i(5003),r=i(3772),d=i(7328),l=i(3241);class c extends l.Z{constructor(e){super(),this.worker=e,this.worker.onerror=e=>{try{this.dispatchEvent("workerError",e),this.cleanup(),this.terminate()}catch(e){}},this.worker.onmessage=e=>{this.dispatchEvent(e.data.queryMethodListener,...e.data.queryMethodArguments)}}postMessage(e){this.worker.postMessage(e)}terminate(){this.worker.terminate()}sendQuery(e,t){this.worker.postMessage({queryMethod:e.shift(),queryMethodArguments:e},d.Z?t:void 0)}}var h=i(8975),u=i(3855);const p="undefined"!=typeof WebAssembly;var f=i(5471),m=i(4159);const g=new class{constructor(){this.loadPromise=p?void 0:Promise.reject(),this.loaded=!1,this.workersLimit=m.Z.threads,this.players={},this.playersByCacheName={},this.workers=[],this.curWorkerNum=0,this.log=(0,o.kg)("LOTTIE",o.v9.Error),this.onPlayerLoaded=(e,t,i)=>{const s=this.players[e];s?(this.log.debug("onPlayerLoaded"),s.onLoad(t,i)):this.log.warn("onPlayerLoaded on destroyed player:",e,t)},this.onFrame=(e,t,i)=>{const s=this.players[e];s?(void 0!==s.clamped&&i instanceof Uint8ClampedArray&&(s.clamped=i),s.renderFrame(i,t)):this.log.warn("onFrame on destroyed player:",e,t)},this.onPlayerError=(e,t)=>{const i=this.players[e];i&&s.Z.getAnimations(i.el[0]).forEach((e=>{s.Z.removeAnimation(e)}))}}getAnimation(e){for(const t in this.players)if(this.players[t].el.includes(e))return this.players[t];return null}setLoop(e){let t=!1;for(const i in this.players){const s=this.players[i];s._loop&&s.loop!==e&&(t=!0,s.loop=e,s.autoplay=s._autoplay)}return t}loadLottieWorkers(){return this.loadPromise?this.loadPromise:this.loadPromise=new Promise(((e,t)=>{let s=this.workersLimit;for(let n=0;n{this.log("worker #"+n+" ready"),o.addEventListener("frame",this.onFrame),o.addEventListener("loaded",this.onPlayerLoaded),o.addEventListener("error",this.onPlayerError),--s,s||(this.log("workers ready"),e(),this.loaded=!0)}),{once:!0}),o.addEventListener("workerError",(e=>{t("rlottie load error: "+e.message),this.loaded=!1}),{once:!0})}}))}makeAssetUrl(e){return"assets/tgs/"+e+".json"}loadAnimationAsAsset(e,t){return this.loadAnimationFromURL(e,this.makeAssetUrl(t))}loadAnimationDataFromURL(e){return p?(this.loadLottieWorkers(),fetch(e).then((e=>e.headers&&"application/octet-stream"!==e.headers.get("content-type")?e.blob():e.arrayBuffer().then((e=>u.Z.invokeCrypto("gzipUncompress",e))).then((e=>(0,h.Z)(e,"")))))):this.loadPromise}loadAnimationFromURLManually(e){const t=this.makeAssetUrl(e);return this.loadAnimationDataFromURL(t).then((e=>i=>this.loadAnimationFromURLNext(e,i,t)))}loadAnimationFromURL(e,t){return this.loadAnimationDataFromURL(t).then((i=>this.loadAnimationFromURLNext(i,e,t)))}loadAnimationFromURLNext(e,t,i){const s=Object.assign(t,{animationData:e,needUpscale:!0});return s.name||(s.name=i),this.loadAnimationWorker(s)}waitForFirstFrame(e){return Promise.race([new Promise((t=>{e.addEventListener("firstFrame",t,{once:!0})})),(0,a.Z)(2500)]).then((()=>e))}loadAnimationWorker(e){return t=this,i=void 0,a=function*(){if(!p)return this.loadPromise;this.loaded||(yield this.loadLottieWorkers());const{middleware:t,group:i=""}=e;if(t&&!t())throw(0,f.Z)("MIDDLEWARE");if(e.sync){const t=r.Z.CACHE.generateName(e.name,e.width,e.height,e.color,e.toneIndex),i=this.playersByCacheName[t];if(null==i?void 0:i.size)return Promise.resolve(i.entries().next().value[0])}const n=Array.isArray(e.container)?e.container:[e.container];if(e.width&&e.height||(e.width=parseInt(n[0].style.width),e.height=parseInt(n[0].style.height)),!e.width||!e.height)throw new Error("No size for sticker!");e.group=i;const a=this.initPlayer(n,e);return s.Z.addAnimation(a,i,void 0,t),a},new((n=void 0)||(n=Promise))((function(e,s){function o(e){try{d(a.next(e))}catch(e){s(e)}}function r(e){try{d(a.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(t,i||[])).next())}));var t,i,n,a}onDestroy(e){delete this.players[e]}destroyWorkers(){p&&(this.workers.forEach(((e,t)=>{e.terminate(),this.log("worker #"+t+" terminated")})),this.log("workers destroyed"),this.workers.length=0,this.curWorkerNum=0,this.loaded=!1,this.loadPromise=void 0)}initPlayer(e,t){var i,s;const n=new r.Z({el:e,worker:this.workers[this.curWorkerNum++],options:t}),{reqId:a,cacheName:o}=n;this.players[a]=n;const d=o?null!==(i=(s=this.playersByCacheName)[o])&&void 0!==i?i:s[o]=new Set:void 0;return o&&d.add(n),this.curWorkerNum>=this.workers.length&&(this.curWorkerNum=0),n.addEventListener("destroy",(()=>{this.onDestroy(a),d.delete(n)&&!d.size&&delete this.playersByCacheName[o]})),n.loadFromData(t.animationData),n}};n.GO.lottieLoader=g;const v=g},3772:(e,t,i)=>{"use strict";i.d(t,{Z:()=>u,a:()=>h});var s=i(7328),n=i(8189),a=i(4762),o=i(3241),r=i(4755),d=i(3228),l=i(356),c=i(645);function h(e,t,i){let s=(0,d.Z)(window.devicePixelRatio,1,2);return s>1&&!i&&(e>90&&t>90?!a.IS_APPLE&&r.Z.isMobile&&(s=1):(e>60&&t>60||a.IS_ANDROID)&&(s=Math.max(1.5,s-1.5))),s}class u extends o.Z{constructor({el:e,worker:t,options:i}){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.playedTimes=0,this.reqId=++u.reqId,this.el=e,this.worker=t;for(const e in i)this.hasOwnProperty(e)&&(this[e]=i[e]);let o;this._loop=this.loop,this._autoplay=this.autoplay,this.initFrame=i.initFrame,this.color=i.color,this.inverseColor=i.inverseColor,this.name=i.name,this.skipFirstFrameRendering=i.skipFirstFrameRendering,this.toneIndex=i.toneIndex,this.raw=void 0!==this.color,this.name&&(this.cacheName=u.CACHE.generateName(this.name,this.width,this.height,this.color,this.toneIndex)),void 0!==i.skipRatio?o=i.skipRatio:(a.IS_ANDROID||a.IS_APPLE_MOBILE||a.IS_APPLE&&!a.IS_SAFARI&&!n.Z)&&this.width<100&&this.height<100&&!i.needUpscale&&(o=.5),this.skipDelta=void 0!==o?1/o|0:1;const r=h(this.width,this.height,i.needUpscale);this.width=Math.round(this.width*r),this.height=Math.round(this.height*r),i.noCache||(a.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=this.el.map((()=>{const e=document.createElement("canvas");return e.classList.add("rlottie"),e.width=this.width,e.height=this.height,e.dpr=r,e}))),this.contexts=this.canvas.map((e=>e.getContext("2d"))),l.Z&&!this.raw||(this.imageData=new ImageData(this.width,this.height),s.Z&&(this.clamped=new Uint8ClampedArray(this.width*this.height*4))),this.name?this.cache=u.CACHE.getCache(this.cacheName):this.cache=c.M.createCache()}clearCache(){this.cachingDelta!==1/0&&(this.cacheName&&this.cache.counter>1||this.cache.clearCache())}sendQuery(e,t){this.worker.sendQuery([e.shift(),this.reqId,...e],t)}loadFromData(e){this.sendQuery(["loadFromData",e,this.width,this.height,this.toneIndex,void 0!==this.color])}play(){this.paused&&(this.paused=!1,this.setMainLoop())}pause(e=!0){this.paused||(this.paused=!0,e&&(clearTimeout(this.rafId),this.rafId=void 0))}resetCurrentFrame(){var e;return this.curFrame=null!==(e=this.initFrame)&&void 0!==e?e:1===this.direction?this.minFrame:this.maxFrame}stop(e=!0){this.pause();const t=this.resetCurrentFrame();e&&this.requestFrame(t)}restart(){this.stop(!1),this.play()}setSpeed(e){this.speed!==e&&(this.speed=e,this.paused||this.setMainLoop())}setDirection(e){this.direction!==e&&(this.direction=e,this.paused||this.setMainLoop())}remove(){this.pause(),this.sendQuery(["destroy"]),this.cacheName&&u.CACHE.releaseCache(this.cacheName),this.dispatchEvent("destroy"),this.cleanup()}applyColor(e){const[t,i,s]=this.color;for(let n=0,a=e.length;n{let n=this.cache.framesNew.get(t);if(e instanceof Uint8ClampedArray?s>0&&(n=this.canvas[0]):n=e,!n){const e=document.createElement("canvas");e.width=i.canvas.width,e.height=i.canvas.height,e.getContext("2d").putImageData(this.imageData,0,0),this.cache.framesNew.set(t,e),n=e}this.overrideRender&&this.renderedFirstFrame?this.overrideRender(n||this.imageData):n?(i.clearRect(0,0,n.width,n.height),i.drawImage(n,0,0)):i.putImageData(this.imageData,0,0),this.renderedFirstFrame||(this.renderedFirstFrame=!0)})),this.dispatchEvent("enterFrame",t)}catch(e){console.error("RLottiePlayer renderFrame error:",e,this.width,this.height),this.autoplay=!1,this.pause()}}renderFrame(e,t){if(this.cachingDelta&&(t%this.cachingDelta||!t)&&(e instanceof Uint8ClampedArray&&!this.cache.frames.has(t)?this.cache.frames.set(t,new Uint8ClampedArray(e)):l.Z&&e instanceof ImageBitmap&&!this.cache.framesNew.has(t)&&this.cache.framesNew.set(t,e)),this.frInterval){const i=Date.now()-this.frThen;if(i<0){const s=this.frInterval>-i?-i%this.frInterval:this.frInterval;return this.rafId&&clearTimeout(this.rafId),void(this.rafId=window.setTimeout((()=>{this.renderFrame2(e,t)}),s))}}this.renderFrame2(e,t)}requestFrame(e){const t=this.cache.frames.get(e),i=this.cache.framesNew.get(e);i?this.renderFrame(i,e):t?this.renderFrame(t,e):(this.clamped&&!this.clamped.length&&(this.clamped=new Uint8ClampedArray(this.width*this.height*4)),this.sendQuery(["renderFrame",e],this.clamped?[this.clamped.buffer]:void 0))}onLap(){return++this.playedTimes===this.loop&&(this.loop=!1),!!this.loop||(this.pause(!1),!1)}mainLoopForwards(){const{skipDelta:e,maxFrame:t}=this,i=this.curFrame+e>t?this.curFrame=this.loop?this.minFrame:this.maxFrame:this.curFrame+=e;return this.requestFrame(i),!(i+e>t)||this.onLap()}mainLoopBackwards(){const{skipDelta:e,minFrame:t}=this,i=this.curFrame-et?1:-1,callback:s})}playToFrame(e){this.pause();const{frame:t,speed:i,callback:s,direction:n}=e;this.setDirection(void 0===n?this.curFrame>t?-1:1:n),void 0!==i&&this.setSpeed(i);const a=[this.curFrame,t];-1===this.direction&&a.reverse(),this.loop=!1,this.setMinMax(a[0],a[1]),this.playToFrameOnFrameCallback&&this.removeEventListener("enterFrame",this.playToFrameOnFrameCallback),s&&(this.playToFrameOnFrameCallback=e=>{e===t&&(this.removeEventListener("enterFrame",this.playToFrameOnFrameCallback),s())},this.addEventListener("enterFrame",this.playToFrameOnFrameCallback)),this.play()}setColor(e,t){this.color=e,t&&this.paused&&this.renderFrame2(this.imageData.data,this.curFrame)}setInverseColor(e){this.inverseColor=e}setMinMax(e=0,t=this.frameCount-1){this.minFrame=e,this.maxFrame=t}onLoad(e,t){return i=this,s=void 0,a=function*(){this.frameCount=e,this.fps=t,this.setMinMax(),void 0!==this.initFrame&&(this.initFrame=(0,d.Z)(this.initFrame,this.minFrame,this.maxFrame));const i=this.resetCurrentFrame();if(this.fps<60&&1!==this.skipDelta){const e=60/t;this.skipDelta=this.skipDelta/e|0}this.frInterval=1e3/this.fps/this.speed*this.skipDelta,this.frThen=Date.now()-this.frInterval,!this.skipFirstFrameRendering&&this.requestFrame(i),this.dispatchEvent("ready"),this.addEventListener("enterFrame",(()=>{this.dispatchEvent("firstFrame"),this.canvas[0].parentNode||!this.el||this.overrideRender||this.el.forEach(((e,t)=>e.append(this.canvas[t]))),this.frameListener=()=>{if(this.paused||!this.currentMethod)return;const e=Date.now();this.frThen=e+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})},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}}u.CACHE=c.Z,u.reqId=0},4874:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(1447),n=i(6008),a=i(410),o=i(4789),r=i(2648);const d=new class{constructor(){this.pageId=-1,this.pagesDiv=document.getElementById("auth-pages"),this.scrollableDiv=this.pagesDiv.querySelector(".scrollable"),this.selectTab=(0,n.X)(null,this.scrollableDiv.querySelector(".tabs-container"),null,(()=>{var e;(null===(e=this.page)||void 0===e?void 0:e.onShown)&&this.page.onShown()}))}setPage(e){if(e.isAuthPage){this.pagesDiv.style.display="";const t=(0,r.Z)(e.pageEl);if(this.pageId===t)return;this.selectTab(t),-1!==this.pageId&&t>1&&s.Z.loadLottieWorkers(),this.pageId=t,this.scrollableDiv&&(0,o.Z)({container:this.scrollableDiv,element:this.scrollableDiv.firstElementChild,position:"start"})}else this.pagesDiv.style.display="none",e.pageEl.style.display="",this.pageId=-1;this.page=e}};a.GO.pagesManager=d;const l=d;class c{constructor(e,t,i,s,n){this.isAuthPage=t,this.onFirstMount=i,this.onMount=s,this.onShown=n,this.installed=!1,this.pageEl=document.body.querySelector("."+e)}mount(...e){return t=this,i=void 0,n=function*(){if(this.onMount){const t=this.onMount(...e);t instanceof Promise&&(yield t)}if(!this.installed){if(this.onFirstMount)try{const t=this.onFirstMount(...e);t instanceof Promise&&(yield t)}catch(e){console.error("PAGE MOUNT ERROR:",e)}this.installed=!0}l.setPage(this)},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}}},671:(e,t,i)=>{"use strict";function s(e){return r(o(e)).join("-")}i.d(t,{Ml:()=>c,N0:()=>s,tB:()=>d,w1:()=>r,zu:()=>h});const n=/\uFE0F/g,a=String.fromCharCode(8205),o=e=>e.indexOf(a)<0?e.replace(n,""):e;function r(e){const t=[];let i=0,s=0,n=0;for(;n55296&&i<=56319?s=i:t.push(i.toString(16));return t.length&&2===t[0].length&&(t[0]="00"+t[0]),t}function d(e){const t=e.match(/[\uDFFB-\uDFFF]/);return t?5-(57343-t[0].charCodeAt(0)):0}const l=new Map([["FT","๐Ÿดโ€โ˜ "]]);function c(e){var t;return null!==(t=l.get(e))&&void 0!==t?t:String.fromCharCode(55356,56741+e.charCodeAt(0),55356,56741+e.charCodeAt(1))}function h(e){return e.split("-").reduce(((e,t)=>e+String.fromCodePoint(parseInt(t,16))),"")}},4329:function(e){"undefined"!=typeof self&&self,e.exports=function(e){var t={};function i(s){if(t[s])return t[s].exports;var n=t[s]={i:s,l:!1,exports:{}};return e[s].call(n.exports,n,n.exports,i),n.l=!0,n.exports}return i.m=e,i.c=t,i.d=function(e,t,s){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:s})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var s=Object.create(null);if(i.r(s),Object.defineProperty(s,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)i.d(s,n,function(t){return e[t]}.bind(null,n));return s},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i(i.s=0)}([function(e,t,i){"use strict";(function(t){var i=t.AudioContext||t.webkitAudioContext,s=function(e){if(!s.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};s.isRecordingSupported=function(){return i&&t.navigator&&t.navigator.mediaDevices&&t.navigator.mediaDevices.getUserMedia&&t.WebAssembly},s.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)},s.prototype.encodeBuffers=function(e){if("recording"===this.state){for(var t=[],i=0;i{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)},s.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))))},s.prototype.loadWorker=function(){this.encoder||(this.encoder=new t.Worker(this.config.encoderPath))},s.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,i)=>{var s=i=>{switch(i.data.message){case"ready":t();break;case"page":this.encodedSamplePosition=i.data.samplePosition,e(i.data.page);break;case"done":this.encoder.removeEventListener("message",s),this.finish()}};this.encoder.addEventListener("message",s),this.encoder.postMessage(Object.assign({command:"init",originalSampleRate:this.audioContext.sampleRate,wavSampleRate:this.audioContext.sampleRate},this.config))}))},s.prototype.pause=function(e){if("recording"===this.state){if(this.state="paused",e&&this.config.streamPages){var t=this.encoder;return new Promise(((e,i)=>{var s=i=>{"flushed"===i.data.message&&(t.removeEventListener("message",s),this.onpause(),e())};t.addEventListener("message",s),t.postMessage({command:"flush"})}))}return this.onpause(),Promise.resolve()}},s.prototype.resume=function(){"paused"===this.state&&(this.state="recording",this.onresume())},s.prototype.setRecordingGain=function(e){this.config.recordingGain=e,this.recordingGainNode&&this.audioContext&&this.recordingGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},s.prototype.setMonitorGain=function(e){this.config.monitorGain=e,this.monitorGainNode&&this.audioContext&&this.monitorGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},s.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)}))},s.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 i=s=>{"done"===s.data.message&&(e.removeEventListener("message",i),t())};e.addEventListener("message",i),e.postMessage({command:"done"}),this.config.reuseWorker||e.postMessage({command:"close"})}))}return Promise.resolve()},s.prototype.destroyWorker=function(){"inactive"===this.state&&this.encoder&&(this.encoder.postMessage({command:"close"}),delete this.encoder)},s.prototype.storePage=function(e){this.recordedPages.push(e),this.totalLength+=e.length},s.prototype.streamPage=function(e){this.ondataavailable(e)},s.prototype.finish=function(){if(!this.config.streamPages){var e=new Uint8Array(this.totalLength);this.recordedPages.reduce((function(t,i){return e.set(i,t),t+i.length}),0),this.ondataavailable(e)}this.onstop(),this.config.reuseWorker||delete this.encoder},s.prototype.ondataavailable=function(){},s.prototype.onpause=function(){},s.prototype.onresume=function(){},s.prototype.onstart=function(){},s.prototype.onstop=function(){},e.exports=s}).call(this,i(1))},function(e,t){var i;i=function(){return this}();try{i=i||new Function("return this")()}catch(e){"object"==typeof window&&(i=window)}e.exports=i}])},6802:e=>{var t=.1,i="function"==typeof Float32Array;function s(e,t){return 1-3*t+3*e}function n(e,t){return 3*t-6*e}function a(e){return 3*e}function o(e,t,i){return((s(t,i)*e+n(t,i))*e+a(t))*e}function r(e,t,i){return 3*s(t,i)*e*e+2*n(t,i)*e+a(t)}function d(e){return e}e.exports=function(e,s,n,a){if(!(0<=e&&e<=1&&0<=n&&n<=1))throw new Error("bezier x values must be in [0, 1] range");if(e===s&&n===a)return d;for(var l=i?new Float32Array(11):new Array(11),c=0;c<11;++c)l[c]=o(c*t,e,n);return function(i){return 0===i||1===i?i:o(function(i){for(var s=0,a=1;10!==a&&l[a]<=i;++a)s+=t;--a;var d=s+(i-l[a])/(l[a+1]-l[a])*t,c=r(d,e,n);return c>=.001?function(e,t,i,s){for(var n=0;n<4;++n){var a=r(t,i,s);if(0===a)return t;t-=(o(t,i,s)-e)/a}return t}(i,d,e,n):0===c?d:function(e,t,i,s,n){var a,r,d=0;do{(a=o(r=t+(i-t)/2,s,n)-e)>0?i=r:t=r}while(Math.abs(a)>1e-7&&++d<10);return r}(i,s,s+t,e,n)}(i),s,a)}}}}]); +//# sourceMappingURL=684.c02f8f5d69deae872060.chunk.js.map \ No newline at end of file diff --git a/public/684.c02f8f5d69deae872060.chunk.js.map b/public/684.c02f8f5d69deae872060.chunk.js.map new file mode 100644 index 00000000..e9029b82 --- /dev/null +++ b/public/684.c02f8f5d69deae872060.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"684.c02f8f5d69deae872060.chunk.js","mappings":"6NA+UA,MAAMA,EAAuB,IAxStB,MAaLC,cACEC,KAAKC,SAAW,IAAIC,sBAAsBC,IAGxC,IAAI,MAAMC,KAASD,EAAS,CAC1B,MAAME,EAASD,EAAMC,OAErB,IAAI,MAAMC,KAASN,KAAKO,SAAU,CAChC,GAAGP,KAAKQ,yBAAyBF,GAC/B,SAGF,MAAMG,EAAYT,KAAKO,SAASD,GAA6BI,MAAMC,GAAMA,EAAEC,KAAOP,IAClF,GAAII,EAAJ,CAIA,GAAGL,EAAMS,eACPb,KAAKc,QAAQC,IAAIN,GACjBT,KAAKgB,eAAeP,GAAW,OAM1B,CACLT,KAAKc,QAAQG,OAAOR,GACpBT,KAAKgB,eAAeP,GAAW,GAE/B,MAAMS,EAAaT,EAAUA,UAC1BS,aAAsB,KAEvBA,EAAWC,Y,CAQf,K,OAKNnB,KAAKc,QAAU,IAAIM,IAEnBpB,KAAKqB,mBAAqB,IAAID,IAC9BpB,KAAKO,SAAW,CAAC,EACjBP,KAAKsB,SAAW,IAAIC,IACpBvB,KAAKwB,aAAe,CAAC,EACrBxB,KAAKyB,qBAAuB,GAE5BzB,KAAKQ,yBAA2B,CAAC,EACjCR,KAAK0B,cAAe,EAEpB,qBAA4C,QAAQ,EAAEC,UACpC,UAAbA,EAAIC,OACL5B,KAAK0B,cAAe,EACpB1B,KAAK6B,mB,IAIT,qBAA4C,SAAS,KAChD7B,KAAK0B,eACN1B,KAAK0B,cAAe,EACpB1B,KAAK6B,mB,IAIT,qBAAgC,UAAWC,IACzC9B,KAAK6B,iBAAiBC,EAAK,GAE/B,CAEOC,qBAAqBzB,EAAe0B,GACtCA,EAAUhC,KAAKqB,mBAAmBN,IAAIT,GACpCN,KAAKqB,mBAAmBJ,OAAOX,EACtC,CAEO2B,cAAcC,GACnB,MAAMC,EAAyB,GAC/B,IAAI,MAAM7B,KAASN,KAAKO,SACtB,IAAI,MAAM6B,KAAUpC,KAAKO,SAASD,GAC7B8B,EAAOxB,KAAOsB,GACfC,EAAME,KAAKD,GAKjB,OAAOD,CACT,CAEOG,gBAAgBF,GACrB,MAAM,GAACxB,EAAE,UAAEH,GAAa2B,EACnB3B,aAAqB8B,kBACxB9B,EAAU+B,SAGT/B,aAAqB8B,kBAAoB,EAAAE,WAC1CC,YAAW,KACTjC,EAAUkC,IAAM,GAChBlC,EAAUmC,MAAM,GACf,KAGL,MAAMtC,EAAQN,KAAKO,SAAS6B,EAAO9B,OAChCA,KACD,OAAiBA,EAAO8B,GACpB9B,EAAMuC,eACD7C,KAAKO,SAAS6B,EAAO9B,QAIhCN,KAAKC,SAAS6C,UAAUlC,GACxBZ,KAAKc,QAAQG,OAAOmB,GACpBpC,KAAKsB,SAASL,OAAOR,EACvB,CAEOsC,wBAAwBX,GAC7B,MAAMY,EAAOhD,KAAKsB,SAAS2B,IAAIb,GAC5BY,GACDhD,KAAKsC,gBAAgBU,EAEzB,CAEOE,aACLzC,EACAH,EAA4B,GAC5B6C,EACAC,G,YAEA,GAAa,SAAV9C,GAAoBN,KAAKsB,SAAS+B,IAAI5C,GACvC,OAGE0C,IACC1C,aAAqB,IACtB0C,EAAiB1C,EAAUG,GAAG,GACtBH,aAAqB,KAC7B0C,EAAiB1C,EAAU6C,OACnB7C,aAAqB,KAC7B0C,EAAsC,QAArB,EAAA1C,EAAU8C,mBAAW,QAAI9C,EAClCA,aAAqB+C,cAC7BL,EAAiB1C,IAIrB,MAAMuC,EAAsB,CAC1BpC,GAAIuC,EACJ1C,UAAWA,EACXH,QACA8C,cAGCA,GAAqC,kBAAjB,GACrBA,EAAWK,SAAQ,KACjBzD,KAAK+C,wBAAwBtC,EAAU,IAIxCA,aAAqB,MAClB,4BAAoCA,EAAUiD,OAChDjD,EAAUiD,KAAO,6BAIqB,QAA1C,KAAC1D,KAAKO,UAAQ,EAACD,UAA2B,aAAM,IAAI+B,KAAKW,GACzDhD,KAAKC,SAAS0D,QAAQX,EAAKpC,IAC3BZ,KAAKsB,SAASsC,IAAInD,EAAWuC,EAC/B,CAEOa,gBACLC,EACAxD,EACAyD,EACAC,GAIA,QAAaC,IAAV3D,IAAwBN,KAAKO,SAASD,GAEvC,OAGF,MAAM4D,OAAmBD,IAAV3D,EAAqC,CAACA,GAAS6D,OAAOC,KAAKpE,KAAKO,UAE/E,IAAI,MAAMD,KAAS4D,EAAQ,CACzB,GAAGF,GAAuBhE,KAAKQ,yBAAyBF,GACtD,SAGF,MAAM+D,EAAarE,KAAKO,SAASD,IAEjC,OAAe+D,GAAa5D,IAC1BT,KAAKgB,eAAeP,EAAWqD,EAASC,EAAQ,G,CAGtD,CAEOlC,iBAAiBiC,GACtB9D,KAAK6D,gBAAgBC,OAASG,OAAWA,GAAW,EACtD,CAEOjD,eAAeoB,EAAuB0B,EAAmBC,GAC9D,MAAM,GAACnD,EAAE,UAAEH,EAAS,MAAEH,GAAS8B,EAE5B2B,IAAa/D,KAAKwB,aAAalB,MAAW,OAAQM,GAC/CwB,EAAOgB,aAAcW,GACvB/D,KAAKsC,gBAAgBF,GAMtB0B,GACA9D,KAAKyB,sBAAwBzB,KAAKyB,uBAAyBnB,GAC3DG,aAAqB8B,kBAAoBvC,KAAK0B,aAE3CjB,EAAU6D,QAEZ7D,EAAU8D,UAEJ9D,EAAU6D,QAClBtE,KAAKc,QAAQuC,IAAIjB,IACjB3B,EAAU+D,WACRxE,KAAKyB,sBAAwBzB,KAAKyB,uBAAyBnB,GAC3D,aAAyBN,KAAKqB,mBAAmBgC,IAAIjB,EAAO9B,QAG9DG,EAAUgE,MAEd,CAEOC,0BACL,OAAO1E,KAAKyB,oBACd,CAEOkD,wBAAwBrE,EAA4B,IACzDN,KAAKyB,qBAAuBnB,CAC9B,CAEOsE,UAAUtE,GACfN,KAAKwB,aAAalB,IAAS,CAC7B,CAEOuE,YAAYvE,UACVN,KAAKwB,aAAalB,GACzBN,KAAK6D,qBAAgBI,EAAW3D,EAClC,CAEOwE,aAAaxE,GAClB,MAAM+D,EAAarE,KAAKO,SAASD,IAC7B+D,aAAU,EAAVA,EAAYxB,UAIhBwB,EAAWU,SAAStE,IAClBT,KAAKC,SAAS6C,UAAUrC,EAAUG,GAAG,KAGvC,SAAQ,KACNyD,EAAWU,SAAStE,IAClBT,KAAKC,SAAS0D,QAAQlD,EAAUG,GAAG,GACnC,IAEN,CAEOoE,sBAAsB1E,GAC3BN,KAAKQ,yBAAyBF,IAAS,CACzC,CAEO2E,wBAAwB3E,UACtBN,KAAKQ,yBAAyBF,GACrCN,KAAK8E,aAAaxE,EACpB,CAEO4E,wBAAwB5E,EAA2B6E,GACrDA,EAAMnF,KAAKgF,sBAAsB1E,GAC/BN,KAAKiF,wBAAwB3E,EACpC,GAIF,OAAmB,0BAAsCR,GACzD,S,sfC9SA,MAAMsF,EAAwB,MAC5B,IACE,OAAO,EAAA3C,YAAc4C,UAAUC,UAAUC,MAAM,mBAAmB,GAAK,E,CACvE,MAAMC,GACN,OAAO,C,CAEV,EAN6B,GA4BvB,MAAMC,UAAmC,IAAhD,c,oBAOU,KAAAC,MAAoD,IAAInE,IACxD,KAAAoE,UAAiD,IAAIpE,IACrD,KAAAqE,aAAoD,IAAIrE,IAIxD,KAAAsE,oBAA0E,IAAItE,IAC9E,KAAAuE,6BAAkF,IAAIvE,IACtF,KAAAwE,wBAAoE,CAAC,EAkBrE,KAAAC,cAAmD,CACzDC,MAAO,EACPC,MAAO,EACPC,MAAO,GAmHF,KAAAC,aAAe,CAACC,EAAoCX,EAAQ1F,KAAKsG,gBACnEZ,IACDA,EAAMa,YAAcC,KAAKC,IAAI,EAAGf,EAAMa,aAAeF,EAAQK,YA7K/C,K,EAiLX,KAAAC,YAAc,CAACN,EAAoCX,EAAQ1F,KAAKsG,gBAClEZ,IACDA,EAAMa,YAAcC,KAAKI,IAAIlB,EAAMmB,SAAUnB,EAAMa,aAAeF,EAAQK,YAnL5D,K,EAuLX,KAAAI,OAAS,CAACT,EAAoCX,EAAQ1F,KAAKsG,gBAC7DZ,IACDA,EAAMa,YAAcF,EAAQU,S,EA6GxB,KAAAC,oBAA4BtB,GAA4B,EAAD,gCAC7D,MAAMW,EAAUrG,KAAK4F,aAAa3C,IAAIyC,GAChC/D,QAAY3B,KAAKiH,SAASC,eAAeC,OAAOd,EAAQe,OAC9C,UAAbzF,EAAIC,MAAoBD,EAAI0F,mBAAqBjC,GAClDpF,KAAKsH,uBAAuB5B,GAI9B,MAAM6B,QAAqBvH,KAAKiH,SAASO,cAAcC,gBAAgB9F,GACvE+D,EAAM/C,IAAM4E,EAAaG,IAEtB1H,KAAKsG,eAAiBZ,IACvBA,EAAMiC,aAAe3H,KAAK2H,aAEV,UAAbhG,EAAIC,OACL8D,EAAMhC,KAAO1D,KAAK0D,OAKtB,MAAME,EAAM5D,KAAK+F,wBAAwBpE,EAAIiG,IAC1ChE,IACDA,EAAI3C,OAAOyE,GAEP9B,EAAIiE,aACC7H,KAAK+F,wBAAwBpE,EAAIiG,IAG9C,IAsMQ,KAAAE,OAAUC,IAChB,MAAMrC,EAAQqC,EAAE1H,OACVgG,EAAUrG,KAAK4F,aAAa3C,IAAIyC,IAChC,OAACsC,EAAM,IAAEC,GAAO5B,EAIhB6B,EAAMlI,KAAKkI,IACdA,GACDA,EAAI3D,QAGN,MAAM4D,EAAUnI,KAAKoI,kBAAkB1C,GAGvC,GADsB1F,KAAKsG,eACNZ,EAAO,CAC1B1F,KAAKqI,OACLrI,KAAKsI,SAAS5C,EAAOyC,GAErB,MAAMI,EAAUrG,GAAuBA,EAAQ+F,MAAQA,GAAO/F,EAAQ8F,SAAWA,EAC3EQ,EAAaxI,KAAKwI,WAClBC,EAAUD,EAAWE,aAC3B,IAAID,IAAYF,EAAOE,GAAU,CAC/B,IAAIE,EAEJ,IAAI,MAAMC,IAAiB,EAAC,GAAO,GAAO,CACxC,MAAMC,EAAWL,EAAWM,YAAYF,GAExC,IAAIG,EAAMF,EAASG,UAAUT,GAW7B,IAVY,IAATQ,EACDJ,IAAeE,EAAShG,OAASkG,IAGjCA,EADaP,EAAWS,QAAQL,GACrBI,UAAUT,IACT,IAATQ,IACDJ,EAAaI,EAAM,SAIL9E,IAAf0E,EACD,K,CAIDA,EACD3I,KAAKkJ,GAAGP,GAAY,GAEpB3I,KAAKmJ,WAAW,CAACnB,SAAQC,O,EAM/BvF,YAAW,KACN1C,KAAKsG,eAAiBZ,IAIzB1F,KAAKoJ,cAAc,OAAQpJ,KAAKqJ,qBAChCrJ,KAAKsJ,wBAAuB,GAC3B,EAAE,EAGC,KAAAC,QAAWxB,IAYjB/H,KAAKoJ,cAAc,QAAQ,EAGrB,KAAAI,QAAWzB,IACjB,IAAIA,EAAE0B,UACJ,OAGFzJ,KAAKuJ,QAAQxB,GAIb,MAAMS,EAAaxI,KAAKwI,YACrBxI,KAAK0J,kBACJ1J,KAAK2J,QAASnB,EAAWC,SAAYD,EAAWoB,KAAK/G,SACtD2F,EAAWS,SAAQ,GAAMpG,QACzB7C,KAAK4J,SACN5J,KAAKqI,OACLrI,KAAKoJ,cAAc,Q,EAmChB,KAAA3E,KAAO,IACLzE,KAAK6J,QAAO,GAGd,KAAAtF,MAAQ,IACNvE,KAAK6J,QAAO,GAGd,KAAAxB,KAAO,CAAC3C,EAAQ1F,KAAKsG,gBAC1B,IAAIZ,EACF,OAAO,EAUT,GAPIA,EAAMpB,QACRoB,EAAMnB,QAGRmB,EAAMa,YAAc,GACpB,OAAcb,EAAO,SAElBA,IAAU1F,KAAKsG,aAAc,CAC9B,MAAMD,EAAUrG,KAAK4F,aAAa3C,IAAIyC,GACtC,GAAGW,aAAO,EAAPA,EAASyD,MAAO,CACjBpE,EAAM/C,IAAM,GACZ,MAAMqF,EAAS3B,EAAQ2B,OACjB+B,EAAI1D,EAAQ2D,YAAchK,KAAK2F,UAAY3F,KAAK0F,MAChDuE,EAAUF,EAAE9G,IAAI+E,GACnBiC,IACDA,EAAQhJ,OAAOoF,EAAQ4B,KAEnBgC,EAAQpC,MACVkC,EAAE9I,OAAO+G,IAIbtC,EAAMlD,SAENxC,KAAK4F,aAAa3E,OAAOyE,E,CAG3B1F,KAAKsG,kBAAerC,EACpBjE,KAAKkK,sBAAmBjG,C,CAG1B,OAAO,CAAI,EAGN,KAAAkG,SAAYnH,IACjB,MAAM,OAACgF,EAAM,IAAEC,GAAOjF,EAChBgH,EAAchK,KAAKoK,cAAcJ,YACzBhK,KAAKqK,SAASrC,EAAQC,EAAK+B,GAMnCvF,OAEN/B,YAAW,KACT1C,KAAKsK,2BAA2BtC,EAAQC,EAAK+B,EAAY,GACxD,EAAE,EAGA,KAAAd,GAAK,CAACrG,EAAgB0H,KAC3B,MAAM/B,EAAaxI,KAAKwI,WACxB,IAAGxI,KAAK0J,iBAAoBlB,EAI5B,MAA6B,UAA1BxI,KAAKkK,iBACC1B,EAAWgC,QAAQ3H,EAAQ0H,GAE3B/B,EAAWU,GAAGrG,EAAQ0H,E,EAY1B,KAAAE,YAAczK,KAAK0K,qBAAqBxE,GAAUlG,KAAK6J,QAAO,EAAM3D,KACpE,KAAAyE,aAAe3K,KAAK0K,qBAAqBxE,GAAUlG,KAAK6J,QAAO,EAAO3D,KACtE,KAAA0E,YAAc5K,KAAK0K,qBAAqBxE,GAAUlG,KAAKqI,KAAKnC,KAC5D,KAAA2E,oBAAsB7K,KAAK0K,qBAAoB,CAACxE,EAAOG,IAAYrG,KAAKoG,aAAaC,EAASH,KAC9F,KAAA4E,mBAAqB9K,KAAK0K,qBAAoB,CAACxE,EAAOG,IAAYrG,KAAK2G,YAAYN,EAASH,KAC5F,KAAA6E,cAAgB/K,KAAK0K,qBAAoB,CAACxE,EAAOG,IAAYrG,KAAK8G,OAAOT,EAASH,KAClF,KAAA8E,YAAchL,KAAK0K,qBAAqBxE,GAAUA,GAASlG,KAAK4J,SAChE,KAAAqB,gBAAkBjL,KAAK0K,qBAAqBxE,GAAUA,EAAQlG,KAAKkL,YAAYhF,GAASlG,KAAK6I,aAE7F,KAAAe,KAAO,IACL5J,KAAKkJ,GAAG,GAGV,KAAAL,SAAW,KAChB,IAAG7I,KAAKkL,YAAYlL,KAAKsG,cAIzB,OAAOtG,KAAKkJ,IAAI,EAAE,CAsMtB,CAr3BEiC,UAAUlE,GAOR,GANAjH,KAAKiH,SAAWA,EAChBjH,KAAKoL,UAAYC,SAASC,cAAc,OAExCtL,KAAKoL,UAAUG,MAAMC,QAAU,iBAC/BH,SAASI,KAAKC,OAAO1L,KAAKoL,WAEvB/F,UAAUsG,aAAc,CACzB,MAAMC,EAAwE,CAC5EnH,KAAMzE,KAAKyK,YACXlG,MAAOvE,KAAK2K,aACZtC,KAAMrI,KAAK4K,YACXiB,aAAc7L,KAAK6K,oBACnBiB,YAAa9L,KAAK8K,mBAClBiB,OAAQ/L,KAAK+K,cACbiB,cAAehM,KAAKiL,gBACpBgB,UAAWjM,KAAKgL,aAGlB,IAAI,MAAMkB,KAAUN,EAClB,IACEvG,UAAUsG,aAAaQ,iBAAiBD,EAA8BN,EAAQM,G,CAC9E,MAAM1G,GACN4G,QAAQC,KAAK,wCAAyCH,E,EAK5D,qBAA2B,uBAAwB9E,IACjD,MAAMxD,EAAM5D,KAAK+F,wBAAwBqB,GACzC,GAAGxD,EACD,IAAI,MAAM8B,KAAS9B,EACjB5D,KAAKgH,oBAAoBtB,E,IAK/B,qBAA2B,cAAc,KACpC1F,KAAKsM,mBACNtM,KAAKsM,oBAAqB,GAIxBtM,KAAKuE,SAAWvE,KAAKkI,KACvBlI,KAAKkI,IAAI3D,O,IAIb,MAAMgI,EAAuD,CAAC,EACjD,CACX,SACA,QACA,eACA,OACA,SAEGxH,SAASyH,IACZ,MAAMC,EAAQ,IAAMD,EACpBD,EAAWC,GAAO,CAChBvJ,IAAK,IAAMjD,KAAKyM,GAChB7I,IAAM8I,IACD1M,KAAKyM,KAAUC,IAKlB1M,KAAKyM,GAAQC,GACV1M,KAAKsG,cAAyB,SAARkG,GAA4C,UAA1BxM,KAAKkK,kBAAyC,UAARsC,IAE/ExM,KAAKsG,aAAakG,GAAOE,GAGhB,iBAARF,QAAoDvI,IAA1BjE,KAAKkK,mBAChClK,KAAKgG,cAAchG,KAAKkK,kBAAoBwC,GAG9C1M,KAAK2M,yBAAwB,EAEhC,IAEHxI,OAAOyI,iBAAiB5M,KAAMuM,EAChC,CAEQI,yBACN3M,KAAKoJ,cAAc,iBAAkBpJ,KAAK6M,oBAC5C,CAEOA,oBACL,MAAM,OAACC,EAAM,MAAEC,EAAK,aAAEpF,EAAY,cAAE3B,EAAa,KAAEtC,EAAI,MAAEiG,GAAS3J,KAClE,MAAO,CACL8M,SACAC,QACApF,eACA3B,gBACAtC,OACAiG,QAEJ,CAEOqD,kBAAkBC,GACvBjN,KAAKgG,cAAgBiH,EAAOjH,cAC5BhG,KAAKkN,QAAUD,EAAOH,OACtB9M,KAAKmN,OAASF,EAAOF,MACrB/M,KAAKoN,cAAgBH,EAAOtF,aAC5B3H,KAAKqN,MAAQJ,EAAOvJ,KACpB1D,KAAKsN,OAASL,EAAOtD,KACvB,CAoBO4D,SAASpF,EAA0BqF,EAAmB1D,GAC3D,MAAM,OAAC9B,EAAM,IAAEC,GAAOE,EAGhB4B,EADgB5B,EAAQsF,OAAOC,aACb1N,KAAK2F,UAAY3F,KAAK0F,MAC9C,IAAIuE,EAAUF,EAAE9G,IAAIkF,EAAQH,QACxBiC,GACFF,EAAEnG,IAAIuE,EAAQH,OAAQiC,EAAU,IAAI1I,KAGtC,IAAImE,EAAQuE,EAAQhH,IAAIgF,GACxB,GAAGvC,EACD,OAAOA,EAGT,MAAM/D,GAAM,OAAoBwG,GAChC8B,EAAQrG,IAAIqE,EAAKvC,EAAQ2F,SAASC,cAA2B,UAAb3J,EAAIC,MAAiC,UAAbD,EAAIC,KAAmB,QAAU,UAIzF,UAAbD,EAAIC,MACL8D,EAAMiI,aAAa,cAAe,QAIpC,MAAMtH,EAAwB,CAC5B2B,SACAC,MACAb,MAAOzF,EAAIiG,GACXjG,MACAwG,UACA2B,QACAE,YAAa7B,EAAQsF,OAAOC,cAG9B1N,KAAK4F,aAAahC,IAAI8B,EAAOW,GAG7BX,EAAMoH,OAAS,EAGf9M,KAAKoL,UAAUM,OAAOhG,GAEtBA,EAAMkI,iBAAiB,OAAQ5N,KAAK8H,QACpCpC,EAAMkI,iBAAiB,QAAS5N,KAAKuJ,SACrC7D,EAAMkI,iBAAiB,QAAS5N,KAAKwJ,SAErB,UAAb7H,EAAIC,OAAoBuG,aAAO,EAAPA,EAASsF,OAAOI,eAAgB1F,EAAQ2F,SAAW,UAC5EpI,EAAMkI,iBAAiB,cAAc,KACnC5N,KAAKiH,SAAS8G,mBAAmBC,aAAahG,EAAQ,CAACC,GAAK,GAC3D,CAACgG,MAAM,IAiBZ,MAAMC,GAAW,SACjB,GAAGV,EACDU,EAASC,cACJ,CACL,MAAMC,EAAIjG,EAAQsF,OAAOC,aAAe1N,KAAK8F,6BAA+B9F,KAAK6F,oBACjF,IAAIwI,EAAiBD,EAAEnL,IAAI+E,GACvBqG,GACFD,EAAExK,IAAIoE,EAAQqG,EAAiB,IAAI9M,KAGrC8M,EAAezK,IAAIqE,EAAKiG,E,CAoB1B,OAjBAA,EAASI,MAAK,IAAW,EAAD,gCAItB,GAAG3M,EAAI0F,0BAA4BrH,KAAKiH,SAASO,cAAcC,gBAAgB9F,IAAM+F,IACnF1H,KAAKgH,oBAAoBtB,OACpB,CACL,IAAI9B,EAAM5D,KAAK+F,wBAAwBpE,EAAIiG,IACvChE,IACFA,EAAM5D,KAAK+F,wBAAwBpE,EAAIiG,IAAM,IAAIxG,KAGnDwC,EAAI7C,IAAI2E,GACR,qBAAoC,CAACA,MAAO/D,G,CAEhD,MAEO+D,CACT,CAEO2E,SAASrC,EAAgBC,EAAa+B,GAC3C,MAAMD,GAAKC,EAAchK,KAAK2F,UAAY3F,KAAK0F,OAAOzC,IAAI+E,GAC1D,OAAO+B,aAAC,EAADA,EAAG9G,IAAIgF,EAChB,CAkCQX,uBAAuB5B,GAC7BA,EAAMkI,iBAAiB,QAAQ,KAM7B,MAAMrH,EAAcb,EAAMa,YAG1Bb,EAAMkI,iBAAiB,YAAY,KACjClI,EAAMa,YAAcb,EAAMmB,SAAW,EAErCnB,EAAMkI,iBAAiB,YAAY,KACjClI,EAAMa,YAAcA,EAIhBb,EAAMpB,QACRoB,EAAMjB,M,GAEP,CAACwJ,MAAM,GAAM,GACf,CAACA,MAAM,GAAM,GAEpB,CAEO3D,2BAA2BtC,EAAgBC,EAAa+B,GAC7D,MAAMoE,EAAIpE,EAAchK,KAAK8F,6BAA+B9F,KAAK6F,oBAC3DoE,EAAUmE,EAAEnL,IAAI+E,GACtB,IAAIiC,EACF,OAGF,MAAMsE,EAAUtE,EAAQhH,IAAIgF,GACzBsG,IACDA,EAAQJ,UACRlE,EAAQhJ,OAAOgH,GAEXgC,EAAQpC,MACVuG,EAAEnN,OAAO+G,GAGf,CAKOwG,kBAAkB9I,GAEvB,QAASA,EAAM+I,eACjB,CAEQC,mBAAmBhJ,EAAyBgH,GAElDhH,EAAM+I,gBAAkB/B,CAC1B,CAEciC,gBAAgBxG,EAA0B7B,EAAetG,KAAKsG,c,iDAC1E,GAAG+E,SAASuD,wBACV,aAGI,OAAYtI,OAAcrC,GAAW,GAE3C,MAAMtC,GAAM,OAAoBwG,GAE1B0G,EAAwB,GAExBC,EAAuB,UAAbnN,EAAIC,MAAiC,UAAbD,EAAIC,KAC5C,IAAImN,EAAQ,GAAIC,EAAS,GAEzB,GAAa,QAAV,EAAArN,EAAIsN,cAAM,eAAEpM,OAAQ,CACrB,MAAMgF,EAAOlG,EAAIsN,OAAOtN,EAAIsN,OAAOpM,OAAS,GAC5C,IAAKgF,EAAqCqH,MAAO,CAC/C,MAAM3H,QAAqBvH,KAAKiH,SAASO,cAAcC,gBAAgB9F,EAAKkG,EAAKjG,MAE9E2F,EAAaG,IACdmH,EAAQxM,KAAK,CACXM,IAAK4E,EAAaG,IAClByH,MAAO,GAAItH,EAA6BuG,KAAMvG,EAA6BuH,IAC3ExN,KAAM,eAGS,qBAAoC,CAAC8D,MAAO/D,EAAK0N,MAAOxH,IAChEyG,MAAK,KACTtO,KAAKsG,eAAiBA,GAAiBiB,EAAaG,KAIvD1H,KAAK2O,gBAAgBxG,EAAQ,G,OAI9B,GAAG2G,EAAS,CACjB,MAAM9G,EAASG,EAAQ2F,QAAU3F,EAAQH,aACjBhI,KAAKiH,SAASqI,gBAAgBC,aAAavH,GAqBnE+G,QAAc,OAAa,CAAC/G,SAAQwH,WAAW,EAAMC,eAAe,IACpET,EAAS,YAAyB,UAAbrN,EAAIC,KAAmB,cAAgB,eAAe,E,CAG7E,IAAIkN,EAAS,CACX,MAAMY,EAAY/N,EAAIgO,WAAWjP,MAAMgP,GAA8B,2BAAhBA,EAAUE,IAC/Db,EAAwB,QAAhB,EAAAW,aAAS,EAATA,EAAWX,aAAK,QAAIpN,EAAIkO,UAChCb,EAASU,aAAS,EAATA,EAAWI,S,CAGlBjB,EAAQhM,SACP,EAAAkN,SACE,IACDlB,EAAQxM,KAAK,CACXM,IAAK,8CACLwM,MAAO,UACPvN,KAAM,cAGRiN,EAAQxM,KAAK,CACXM,IAAK,kCACLwM,MAAO,UACPvN,KAAM,cAIV,CAAC,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,KAAKmD,SAAS8C,IACzC,MAAMsH,EAAQ,GAAGtH,KAAQA,IACzBgH,EAAQxM,KAAK,CACXM,IAAK,6BAA6BwM,QAClCA,QACAvN,KAAM,aACN,KAKR,MAAMoO,EAAW,IAAIC,cAAc,CACjClB,QACAC,SACAH,YAGFxJ,UAAUsG,aAAaqE,SAAWA,C,IAG7BE,sBACL,MAAM,aAAC5J,GAAgBtG,KACvB,IAAIsG,EAAc,OAClB,MAAM6B,EAAUnI,KAAKoI,kBAAkB9B,GACvCtG,KAAK2O,gBAAgBxG,EAAS7B,EAChC,CAEQ8B,kBAAkB1C,GAExB,OADgB1F,KAAK4F,aAAa3C,IAAIyC,GACvByC,OAMjB,CAEOkB,oBACL,MAAM,aAAC/C,GAAgBtG,KACvB,IAAIsG,EACF,OAGF,MAAM6B,EAAUnI,KAAKoI,kBAAkB9B,GACvC,MAAO,CACL3E,KAAK,OAAoBwG,GACzBA,UACAzC,MAAOY,EACP6J,eAAgBnQ,KAAK6M,oBAEzB,CAmGOvD,wBACLtJ,KAAKsM,oBAAqB,EAC1B,kBAAwB,aAC1B,CAMOzC,OAAOpF,EAAgBiB,EAAQ1F,KAAKsG,cACzC,QAAIZ,SAIQzB,IAATQ,IACDA,EAAOiB,EAAMpB,QAGZoB,EAAMpB,SAAWG,IAIjBA,EACDiB,EAAMjB,OAENiB,EAAMnB,SAGD,GACT,CA8EQmG,oBAAoB0F,GAK1B,OAJ4C/J,IAC1C+J,EAAGpQ,KAAKkI,IAAK7B,EAAQ,CAIzB,CAuBO6E,YAAYxF,GACjB,OAAGA,aAAK,EAALA,EAAOa,aAAc,IACtBb,EAAMa,YAAc,EACpBvG,KAAK6J,QAAO,EAAMnE,IACX,EAIX,CAEO2K,aAAa3K,GAClB1F,KAAKsQ,kBAAoB5K,CAC3B,CAEO6K,iBAAiBC,GACtB,QAAG,OAAUxQ,KAAKoK,cAAeoG,KAIjCxQ,KAAKoK,eAAgB,OAAKoG,IACnB,EACT,CAEOC,mBACL,OAAOzQ,KAAKoK,aACd,CAEOjB,WAAWV,EAAoBiI,EAAoB9G,GACxD,IAAIpB,EAAaxI,KAAKwI,WAClBA,EAiBFA,EAAWmI,QAhBXnI,EAAaxI,KAAKwI,WAAa,IAAI,IAAiB,CAClDoI,UAAW,GACXC,aAAc,EACdC,YAAc3I,IACZnI,KAAKuN,SAASpF,GAAS,GAChB,CAACH,OAAQG,EAAQH,OAAQC,IAAKE,EAAQF,MAE/C8I,OAAQ,CAAC/N,EAAMgO,KACbhR,KAAKmK,SAASnH,EAAK,EAErBiO,UAAW,KACTjR,KAAKoJ,cAAc,QACnBpJ,KAAKqI,MAAM,IAOjB,MAAM6I,OAA0CjN,IAAhCjE,KAAKoK,cAAc+G,SAChCT,EACDlI,EAAWW,WAAWuH,EAAM9G,EAAMsH,GAElC1I,EAAW0I,QAAUA,EAGvB1I,EAAW+H,iBAAiBvQ,KAAKoK,eACjC5B,EAAWC,QAAUA,EAErBD,EAAW5F,MAAK,GAChB4F,EAAW5F,MAAK,EAClB,CAEQwO,gCAAgCjJ,GACtC,MAAMxG,GAAM,OAAoBwG,GAChC,IAAIkJ,EAA+B,QASnC,OARG1P,aAAG,EAAHA,EAAKC,QACU,UAAbD,EAAIC,MAAiC,UAAbD,EAAIC,KAC7ByP,EAAY,QACS,UAAb1P,EAAIC,OACZyP,EAAY,UAITA,CACT,CAEO/I,SAAS5C,EAAyByC,GACvC,MAAMkJ,EAAYrR,KAAKoR,gCAAgCjJ,GAEvDnI,KAAKoN,cAAgBpN,KAAKgG,cAAcqL,GAExCrR,KAAKsG,aAAeZ,EACpB1F,KAAKkK,iBAAmBmH,EACxBrR,KAAKsG,aAAawG,OAAS9M,KAAK8M,OAChC9M,KAAKsG,aAAayG,MAAQ/M,KAAK+M,MAC/B/M,KAAKsG,aAAaqB,aAAe3H,KAAK2H,aAErB,UAAd0J,IACDrR,KAAKsG,aAAa5C,KAAO1D,KAAK0D,MAG7B,iBAAkB2B,WACnBrF,KAAK2O,gBAAgBxG,EAEzB,CAEOmJ,eAAe5L,EAA0ByC,GAC9C,MAAM7B,EAAetG,KAAKsG,aAEpBiL,EAAavR,KAAKuE,QAExB,IAAIuD,EAyBJ,OAxBGpC,GACDoC,EAAS,KACP,MAAMI,EAAMlI,KAAKkI,IACdA,GACDA,EAAI3D,QAGNvE,KAAKsJ,uBAAuB,EAG1B5D,EAAMpB,QACRwD,IAGFpC,EAAMkI,iBAAiB,OAAQ9F,IAE/B9H,KAAKsJ,wBAGPtJ,KAAKqQ,kBAAapM,GACfyB,EAAO1F,KAAKsI,SAAS5C,EAAOyC,GAC1BnI,KAAKsG,kBAAerC,EACzBjE,KAAKwR,iBAAgB,GAEd,CAACC,EAAaF,KACnBvR,KAAKwR,iBAAgB,GAElBlL,IACEtG,KAAK4F,aAAa3C,IAAIqD,GACvBtG,KAAKsI,SAAShC,EAActG,KAAKoI,kBAAkB9B,IAEnDtG,KAAK4J,QAAU5J,KAAK6I,YAKrB7I,KAAKsG,eAAiBZ,IACvB1F,KAAKsG,kBAAerC,EACpBjE,KAAKkK,sBAAmBjG,GAGvByB,GACDA,EAAMgM,oBAAoB,OAAQ5J,GAQjC2J,GACDzR,KAAKyE,M,CAGX,CAEO+M,gBAAgBG,GACrB3R,KAAK0J,iBAAmBiI,CAC1B,CAEOC,oBAAoB1L,GACzBlG,KAAKkI,IAAMhC,EAIX,MAAM2L,EAAiB,IAAI,IAC3BA,EAAe9Q,IAAImF,EAAnB2L,CAA0B,yBAAyB,KAC9C7R,KAAKkI,MAAQhC,IAIhBlG,KAAKkI,SAAMjE,EAKX4N,EAAeC,YAAW,GACzB,CAAC7D,MAAM,IAEV4D,EAAe9Q,IAAImF,EAAnB2L,CAA0B,QAAS9J,IAC9B/H,KAAKsG,eAAiBJ,GACvBlG,KAAKuE,QAGPvE,KAAKsJ,uBAAuB,GAOhC,EAGF,MAAMyI,EAA6B,IAAItM,EACvC,gCAA4CsM,EAC5C,S,shBC77Be,MAAMC,UAAuB,IAMtC5H,oBACF,OAAOpK,KAAKwI,WAAW4B,aACzB,CAEArK,cA4BE,IAAIkS,EA3BJC,MAAM,IAAI,IAAiB,CACzBpB,YAAc9N,IACZ,MAAMmP,EAAqD,gCAArCnS,KAAKoK,cAAcgI,YAAYxC,GAC/C,IAAC3H,EAAG,OAAED,GAAUhF,EAChB0C,GAA8B,OAAoB1C,GAExD,GAAI0C,KAEDyM,GAAkBH,EAAeK,mCAAmC3M,IAIvE,MAAO,CAACxD,QAAS,KAAqB+F,MAAKD,SAAO,IAElD,CAAC,SAAU,YA8GjB,KAAAsK,YAAoBjS,GAAqC,EAAD,gCACtDL,KAAKuS,gBAAgBvS,KAAKwS,iBAAiBnS,EAAO2H,OAAQ3H,EAAO4H,KAAM5H,EAAO6B,SAAU,EAC1F,IAEA,KAAAuQ,YAAoBpS,GAAqC,EAAD,gCACtDL,KAAKuS,gBAAgBvS,KAAKwS,iBAAiBnS,EAAO2H,OAAQ3H,EAAO4H,KAAM5H,EAAO6B,QAAS,EACzF,IAEA,KAAAwQ,cAAgB,KACd,MAAMrS,EAASL,KAAKK,OACpB,IAAI,IAAoBA,EAAO2H,OAAQ,CAAC3H,EAAO4H,KAAM,QAAQ,KAC3DjI,KAAKK,OAAS,CAAC6B,QAASlC,KAAK2S,QAAQjN,OACrC1F,KAAK4S,OAAO,GACZ,EAGJ,KAAAC,eAAiB,KACf,MAAMxS,EAASL,KAAKK,OACjBA,EAAO4H,KAER,IAAI,IAAa,CACf,CAAC5H,EAAO2H,QAAS,CAAC3H,EAAO4H,OACxB,IACMjI,KAAK4S,S,EAKlB,KAAAE,cAAsB/K,GAAkB,EAAD,gCACrC,MAAM,IAACE,EAAG,OAAED,GAAUhI,KAAKK,OAC3B,GAAG4H,GAAOA,IAAQ8K,OAAOC,iBAAkB,CACzC,MAAMC,EAAWjT,KAAKoK,cAAc6I,SAC9B9K,QAAgBnI,KAAKwS,iBAAiBxK,EAAQC,GACpDjI,KAAK4S,MAAM7K,GAEVuG,MAAK,IAAW,EAAD,gCACd,GAAG,aAAqB,CACtB,MAAM4E,EAAM,YAAuB,KAChCA,GACDA,EAAIN,O,CAIR,kBAA0B,CACxB5K,OAAQG,EAAQH,OAChBmL,UAAWlL,EACXrG,KAAMqR,EAAW,kBAAehP,EAChCgP,YAEJ,K,CAEJ,IAEA,KAAAG,gBAAkB,KAChB,MAAM,QAACjL,GAAWnI,KAAKK,OACjBqF,GAAQ,OAAoByC,GAC9BzC,GACJ,mBAAkC,CAACA,QAAO2N,QAAS,yCAAiD,EArKpGrT,KAAKwI,WAAWyI,UAAY,KAC1BjR,KAAK4S,OAAO,EAOd5S,KAAK2S,QAAQW,QAAUjI,SAASC,cAAc,OAC9CtL,KAAK2S,QAAQW,QAAQC,UAAUxS,IAAI,IAAyB,WAAY,sBAGxE,MAAMyS,EAAoB,KACrBvB,GACDwB,aAAaxB,GAGfA,EAAiByB,OAAOhR,YAAW,KACjCuP,OAAiBhO,EACjBjE,KAAK2S,QAAQW,QAAQC,UAAU/Q,OAAO,aAAa,GAClD,IAAI,EAETxC,KAAK2S,QAAQW,QAAQ1F,iBAAiB,cAAc,KAC9C,eAEJ5N,KAAK2S,QAAQW,QAAQC,UAAUxS,IAAI,cAEhCkR,IACDwB,aAAaxB,GACbA,OAAiBhO,GAGnBoH,SAASuC,iBAAiB,WAAY4F,EAAmB,CAACvF,MAAM,IAAM,IAG9C,IAAI,KAAWjO,KAAK2S,QAAQW,SACpCK,mBAAqBH,EAGvCxT,KAAK4T,SAASlI,OAAO1L,KAAK2S,QAAQW,UAElC,QAAiBtT,KAAK6T,QAAQ5S,OAAQjB,KAAK0S,eAE3C,MAAMmB,EAA6C,CAAC7T,KAAK8T,eAAiB,CACxEC,KAAM,UACNC,KAAM,UACNC,QAASjU,KAAK6S,gBACb7S,KAAKkU,gBAAkB,CACxBH,KAAM,WACNC,KAAM,+BACNC,QAASjU,KAAKoT,iBACbpT,KAAKmU,cAAgB,CACtBJ,KAAM,gBACNC,KAAM,SACNC,QAASjU,KAAK0S,gBAGhB1S,KAAKoU,iBAAiBP,GAItB7T,KAAKqU,cACP,CAEUA,eACRnC,MAAMmC,gBACN,QAAiBrU,KAAK6T,QAAQS,QAAStU,KAAK6S,iBAC5C,QAAiB7S,KAAKuU,OAAOnJ,UAAWpL,KAAK8S,eAE7C,MAAM0B,EAAkBzM,IACtB,MAAM0M,GAAI,OAAU1M,EAAE1H,OAAQ,KACxBqU,GAAU,OAAgB3M,EAAE1H,OAAQ,WAC1C,GAAGoU,aAAaE,qBAAuBD,GAAW1U,KAAK2S,QAAQW,QAAQC,UAAUqB,SAAS,uBAAwB,CAChH,MAAMC,EAAUJ,EAAEK,aAAa,WAC/B,IAAID,GAAWA,EAAQE,SAAS,mBAC9B,OAUF,OAPA,OAAYhN,GAEZ/H,KAAK4S,QAAQtE,MAAK,KAChBtO,KAAK2S,QAAQW,QAAQ5B,oBAAoB,QAAS8C,EAAgB,CAACQ,SAAS,IAC5EP,EAAEQ,OAAO,KAGJ,C,GAIXjV,KAAK2S,QAAQW,QAAQ1F,iBAAiB,QAAS4G,EAAgB,CAACQ,SAAS,GAC3E,CAcUxC,iBAAiBxK,EAAgBC,GACzC,OAAOjI,KAAKoK,cAAcJ,YAAchK,KAAKiH,SAAS8G,mBAAmBmH,0BAA0BlN,EAAQC,GAAOjI,KAAKiH,SAAS8G,mBAAmByE,iBAAiBxK,EAAQC,EAC9K,CA8DQkN,WAAWhN,GACjB,MAAMmL,EAAWnL,EAA4BA,QAC7C,IAAIiN,EAA2C,GAC5C9B,IACD8B,GAAO,QAAa9B,EAAS,CAC3B+B,SAAWlN,EAA4BmN,kBAK3C,OAAatV,KAAK2S,QAAQW,QAAQiC,kBAAmBH,GACrDpV,KAAK2S,QAAQW,QAAQC,UAAU1J,OAAO,QAASyJ,EAEjD,CAEO/C,iBAAiBC,GAGtB,OAFAxQ,KAAKwI,WAAW+H,iBAAiBC,GAE1BxQ,IACT,CAEauS,UAAUpK,EAAoB9H,EAAsBmV,EAAY,EAAGtE,GAAU,EACxFuE,EAA0C,GAAIC,EAA0C,I,6GACxF,GAAG1V,KAAK2V,gBAAiB,OAAO3V,KAAK2V,gBAErC,MAAM1N,EAAME,EAAQF,IACd6F,EAAU3F,EAA4ByN,WAAazN,EAAQ2F,OAAU3F,EAA4ByN,SAASC,UAAY1N,EAAQ2F,OAC9HpI,GAAQ,OAAoByC,GAE5B2N,QAAmB9V,KAAKiH,SAASqI,gBAAgBwG,WAAW3N,EAAQH,QACpE+N,EAAiC,mBAAd5N,EAAQyH,EAC3BoG,EAAqBD,WAA4B/V,KAAKiH,SAAS8G,mBAAmBkI,WAAW9N,IAC7F+N,GAAuBH,EAAmBD,EAAaE,MAAwB,OAAoB7N,GAC/B,CACxE,CAAC,CAACnI,KAAK6T,QAAQS,QAAStU,KAAK8T,gBAAiBkC,GAC9C,CAAC,CAAChW,KAAK6T,QAAQsC,SAAUnW,KAAKkU,iBAAkBgC,GAChD,CAAC,CAAClW,KAAK6T,QAAQ5S,OAAQjB,KAAKmU,uBAAwBnU,KAAKiH,SAAS8G,mBAAmBqI,iBAAiBjO,MAGtGpD,SAAQ,EAAE8O,EAASwC,MACnBxC,EAAQ9O,SAASuR,IACZA,aAAkB9S,YACnB8S,EAAO/C,UAAU1J,OAAO,OAAQwM,GAEhCC,EAAO/N,OAAS,KAAO8N,C,GAEzB,IAGJrW,KAAK4T,SAASL,UAAU1J,OAAO,cAAeqM,GAE9ClW,KAAKmV,WAAWhN,GAChB,MAAMoG,EAAU,EAAMgI,WAAU,UAAC7Q,EAAOyC,EAAQqO,KAAM1I,EAAQ0H,EAAWnV,EAAQ6Q,EAASuE,EAAaC,EAAavN,GAKpH,OAJAnI,KAAKK,OAAO4H,IAAMA,EAClBjI,KAAKK,OAAO2H,OAASG,EAAQH,OAC7BhI,KAAKK,OAAO8H,QAAUA,EAEfoG,CACT,G,CAEOkI,0CAA0C/Q,GAC/C,MAAmB,UAAZA,EAAMkK,GAAiB,QAA+BlK,EAAMgR,UACrE,E,yPChRa,MAAMC,UAAoB,IAoBvC5W,aAAY,MAACmG,EAAK,KAAEzB,GAAO,EAAK,WAAEmS,GAAa,EAAK,SAAE/P,EAAQ,yBAAEgQ,EAAwB,MAAEC,EAAK,WAAEC,IAuC/F,GA9BA7E,QAEAlS,KAAKkG,MAAQA,EACblG,KAAKgX,QAAU3L,SAASC,cAAc,OACtCtL,KAAKgX,QAAQzD,UAAUxS,IAAI,gBAE3Bf,KAAK6W,yBAA2BA,EAChC7W,KAAK8W,MAAQA,EACb9W,KAAK+W,WAAaA,EAElB/W,KAAK6R,eAAiB,IAAI,IAE1B7R,KAAKiX,MAAM,CACT/U,QAASlC,KAAKgX,QACdnF,eAAgB7R,KAAK6R,eACrBqF,gBAAiB,MACPlX,KAAKkG,MAAM5B,QAAYtE,KAAKmX,oBAAuBnX,KAAKmX,mBAAmB5D,UAAUqB,SAAS,cAExGwC,uBAAwB,uBACxBC,qBAAsB,mBAGxBnR,EAAMoR,WAAWC,aAAavX,KAAKgX,QAAS9Q,GAC5ClG,KAAKgX,QAAQQ,YAAYtR,GAEzBlG,KAAKyX,KAAO,UAEZzX,KAAK0X,YAAY7Q,GACjB7G,KAAKoU,mBAEY,YAAdpU,KAAKyX,KAAoB,CAC1B,MAAME,EAAW3X,KAAKgX,QAAQY,cAAc,qCAC5C5X,KAAK6X,SAAW,IAAI,IAAkB,CACpCnS,MAAOQ,EACP0Q,aACAkB,YAAa,KACX9X,KAAKgX,QAAQzD,UAAUxS,IAAI,aAAa,EAE1CgX,UAAW,KACT/X,KAAKgX,QAAQzD,UAAU/Q,OAAO,aAAa,IAG/CmV,EAASK,QAAQhY,KAAK6X,SAASzM,U,CAG9B3G,GACeyB,EAAMzB,OACdwT,OAAOzS,IACG,oBAAbA,EAAI0S,OACLhS,EAAM6G,OAAQ,EACd7G,EAAM1B,UAAW,EACjB0B,EAAMzB,O,IAEP0T,SAAQ,KACTnY,KAAKgX,QAAQzD,UAAU1J,OAAO,cAAe7J,KAAKkG,MAAM5B,OAAO,GAGrE,CAEQoT,YAAYU,GAClB,MAAM,QAACpB,EAAO,MAAE9Q,EAAK,KAAEuR,EAAI,eAAE5F,GAAkB7R,KAE/CgX,EAAQzD,UAAUxS,IAAI0W,GAEtB,MAAMrC,EAAOpV,KAAKqY,gBAElB,IAAIC,EAEJ,GAHAtB,EAAQuB,mBAAmB,YAAanD,GAG5B,YAATqC,EAAoB,CACrBzX,KAAKmX,mBAAqBnX,KAAKgX,QAAQY,cAAc,kBACrD5X,KAAKwY,UAAYxY,KAAKgX,QAAQY,cAAc,QAE5C,MAAM/N,EAASmN,EAAQyB,iBAAiB,WAClCC,EAAmB1B,EAAQY,cAAc,eACzCe,EAAc3B,EAAQY,cAAc,iBAC1CU,EAAetB,EAAQY,cAAc,kBACrCU,EAAaM,aAAc,EAAAC,EAAA,GAA0B,EAAjB3S,EAAMW,UAE1C,MAAMiS,EAAiB,IAAI,IAAejH,GAEpCkH,EAAe/B,EAAQY,cAAc,kBAU3C,GATAkB,EAAeE,IAAIzF,UAAU/Q,OAAO,YACpCuW,EAAaxB,aAAauB,EAAeE,IAAKL,EAAYM,eAE1DC,MAAMC,KAAKtP,GAAQ9E,SAASuR,KAC1B,QAAiBA,GAAQ,KACvBtW,KAAKoZ,YAAY,GAChB,CAACvH,eAAgB7R,KAAK6R,gBAAgB,IAGxC7R,KAAKwY,UAAW,EACjB,QAAiBxY,KAAKwY,WAAW,KAC/BxY,KAAKkG,MAAMmT,yBAAyB,GACnC,CAACxH,eAAgB7R,KAAK6R,iBAEzB,MAAMiF,EAAS5O,IACblI,KAAKgX,QAAQzL,MAAM+N,WAAapR,EAAM,SAAU,GAC7ClI,KAAK8W,OACN9W,KAAK8W,MAAM5O,E,EAITqR,EAAe,GACfC,GAAe,EAAAC,EAAA,GAAS3C,EAAOyC,GAAc,GAAO,GAE1D1H,EAAe9Q,IAAImF,EAAnB2L,CAA0B,yBAAyB,KACjD2H,GAAa,GAEb3H,EAAe9Q,IAAImF,EAAnB2L,CAA0B,yBAAyB,KACjD,MAMM6H,EAAW7H,EAAe9Q,IAAImF,EAAnB2L,CAA0B,SAN3B,KACd4B,aAAakG,GACV3Z,KAAK+W,YACN/W,KAAK+W,Y,GAGoD,CAAC9I,MAAM,IAC9D0L,EAAUjX,YAAW,KACzBmP,EAAerP,OAAOkX,EAAS,GAC9BH,EAAa,GACf,CAACtL,MAAM,GAAM,IAGlB4D,EAAe9Q,IAAImF,EAAnB2L,CAA0B,yBAAyB,KACjD2H,GAAa,EAAM,G,CAInB,OACF,QAAiBtT,GAAO,KACtBlG,KAAKoZ,YAAY,GAChB,CAACvH,eAAgB7R,KAAK6R,iBAEzBA,EAAe9Q,IAAIsK,SAAnBwG,CAA6B,WAAY9J,IACvC,GAAG6R,EAAA,iBAAgC,GAAKvO,SAASuD,0BAA4B1I,EAC3E,OAGF,MAAM,IAACsG,EAAG,KAAEqN,GAAQ9R,EAEpB,IAAI+R,GAAO,EACX,GAAY,SAATD,EACD7Z,KAAK+Z,wBACA,GAAY,SAATF,EACR9H,EAAA,SAAoCA,EAAA,aAC/B,GAAY,UAAT8H,EACR7Z,KAAKoZ,kBACA,IAAGrR,EAAEiS,QAAoB,UAATH,GAA6B,UAATA,GAQjC7C,EAAQzD,UAAUqB,SAAS,qBAAgC,cAARpI,GAA+B,eAARA,EAIlFsN,GAAO,EAHI,cAARtN,EAAqBuF,EAAA,eAAwC,CAAC7F,OAAQ,iBACpE6F,EAAA,cAAuC,CAAC7F,OAAQ,oBAVO,CAC5D,MAAMnL,EAAe,UAAT8Y,EAAmB,GAAK,EAC9BlS,EAAeoK,EAAA,eAEfkI,EADMtD,EAAYuD,eAAeC,QAAQxS,GACzB5G,EACnBkZ,GAAW,GAAKA,EAAUtD,EAAYuD,eAAerX,SACtDkP,EAAA,eAA0C4E,EAAYuD,eAAeD,G,CASzE,OAAGH,IACD,EAAAM,EAAA,GAAYrS,IACL,QAFT,C,KAOJ8J,EAAe9Q,IAAImF,EAAnB2L,CAA0B,YAAY,KAChC,KACF7R,KAAK+Z,kB,KAIT,QAAiBrB,GAAkB,KACjC1Y,KAAK+Z,kBAAkB,GACtB,CAAClI,eAAgB7R,KAAK6R,kBAEzB,QAAsBmF,EAAShX,KAAKqa,aAAaC,KAAKta,KAAM0Y,GAAmB7G,GAE/EA,EAAe9Q,IAAImF,EAAnB2L,CAA0B,cAAc,KACtC8G,EAAYC,aAAc,EAAAC,EAAA,GAA6B,EAApB3S,EAAMK,YAAgB,IAG3DsL,EAAe9Q,IAAImF,EAAnB2L,CAA0B,QAAQ,KAChCmF,EAAQzD,UAAUxS,IAAI,UAElB,KACF8Q,EAAe9Q,IAAImF,EAAnB2L,CAA0B,QAAQ,KAChC7R,KAAKua,cAAa,EAAK,G,GAG1B,CAACtM,MAAM,IAEV4D,EAAe9Q,IAAImF,EAAnB2L,CAA0B,SAAS,KACjC7R,KAAKwa,cAAa,EAAM,IAG1B3I,EAAe9Q,IAAIgR,EAAA,EAAnBF,CAA+C,kBAAkB,KAC/D7R,KAAKya,qBAAqB,G,CAI9B5I,EAAe9Q,IAAImF,EAAnB2L,CAA0B,QAAQ,KAChCmF,EAAQzD,UAAUxS,IAAI,aAAa,IAGrC8Q,EAAe9Q,IAAImF,EAAnB2L,CAA0B,SAAS,KACjCmF,EAAQzD,UAAU/Q,OAAO,aAAa,IAGrC0D,EAAMW,UAAYuR,EACnBE,EAAaM,aAAc,EAAAC,EAAA,GAASrS,KAAKmD,MAAMzD,EAAMW,UAAYuR,KAEjE,EAAAsC,EAAA,GAAYxU,GAAOoI,MAAK,KACtBgK,EAAaM,aAAc,EAAAC,EAAA,GAASrS,KAAKmD,MAAMzD,EAAMW,UAAU,GAGrE,CAEUuS,aACR,MAAMuB,EAAW3a,KAAKkG,MAAM5B,OAC5BtE,KAAKkG,MAAMyU,EAAW,OAAS,UACjC,CAEQtC,gBACN,MAAMZ,EAAOzX,KAAKyX,KAClB,GAAY,YAATA,EACD,MAAO,0BACUA,iFACHA,gEACAA,mJAGkBA,oVAQAA,gGACvB,EAAAmD,WAAavP,SAASwP,wBAA0B,2BAA2BpD,gEAAqE,2CACzHA,sHAKpC,CAEUrD,mBACR,MAAMP,EAA2D8C,EAAYuD,eAAeY,KAAI,CAACC,EAAMhS,KAC9F,CAELiS,YAAaD,EAAO,IACpB9G,QAAS,KACPlC,EAAA,eAA0CgJ,CAAI,MAI9CE,GAAU,OAAe,CAACpH,YAChCoH,EAAQ1H,UAAUxS,IAAI,aACtB,OAAwB,CACtBH,GAAIZ,KAAKmX,mBACT+D,OAAQlb,KAAK6W,yBAA2B,KACtC7W,KAAK6W,0BAAyB,EAAK,OACjC5S,EACJkX,QAASnb,KAAK6W,yBAA2B,KACvC7W,KAAK6W,0BAAyB,EAAM,OAClC5S,IAENjE,KAAKmX,mBAAmBzL,OAAOuP,GAE/Bjb,KAAKya,qBACP,CAEUA,sBACR,MAAMtD,EAAqBnX,KAAKmX,mBAChCR,EAAYyE,qBAAqBrW,SAASsW,IACxCA,EAAY,SAAWA,EACvBlE,EAAmB5D,UAAU/Q,OAAO6Y,EAAU,IAGhD,IAAItS,EAAM4N,EAAYuD,eAAeC,QAAQpI,EAAA,iBACjC,IAAThJ,IAAYA,EAAM4N,EAAYuD,eAAeC,QAAQ,IAExDhD,EAAmB5D,UAAUxS,IAAI,SAAW4V,EAAYyE,qBAAqBrS,GAC/E,CAEUgR,mBACR,MAAM3X,EAASpC,KAAKgX,QAGpB,GAAG,EAAAsE,gBAAiB,CAClB,MAAMpV,EAAQlG,KAAKkG,MAGnB,OAFAA,EAAMqV,6BACNrV,EAAMsV,iB,EAIJ,WAyBF,WAdA,QAAkBpZ,EAgBtB,CAEUiY,aAAa3B,GACrB,MAAM+C,GAAS,UACfzb,KAAKgX,QAAQzD,UAAU1J,OAAO,mBAAoB4R,GAC9CA,GAKF/C,EAAiBnF,UAAU/Q,OAAO,oBAClCkW,EAAiBnF,UAAUxS,IAAI,qBAC/B2X,EAAiB/K,aAAa,QAAS,sBANvC+K,EAAiBnF,UAAU/Q,OAAO,qBAClCkW,EAAiBnF,UAAUxS,IAAI,oBAC/B2X,EAAiB/K,aAAa,QAAS,eAM3C,CAEO+N,UACLxJ,MAAMwJ,UACN1b,KAAK6R,eAAeC,YACpB9R,KAAK6X,SAAS8D,kBACd3b,KAAK6W,yBAA2B7W,KAAK8W,WAAQ7S,CAC/C,EAzXe,EAAAiW,eAAiB,CAAC,GAAK,EAAG,IAAK,GAC/B,EAAAkB,qBAAuB,CAAC,cAAe,cAAe,cAAe,e,8QCzBvE,SAASQ,EAAUC,EAAajV,EAAaH,GAC1D,OAAOoV,GAAOjV,GAAOiV,GAAOpV,CAC9B,C,0SC0DA,MAEMqV,EAAiB,GAGVC,EAAyB,eAQvB,MAAMC,WAIV,IA+DL3b,aACF,OAAOL,KAAKwI,WAAWC,OACzB,CAEIpI,WAAOqM,GACT1M,KAAKwI,WAAWC,QAAUiE,CAC5B,CAEA3M,YACYyI,EACVyT,GAEA/J,OAAM,GAHI,KAAA1J,WAAAA,EAlEF,KAAA+L,OAA6E,CAAC,EAC9E,KAAA5B,QAAgG,CAAC,EACjG,KAAAkB,QAAwH,CAAC,EAIzH,KAAAqI,OAAS,EACT,KAAAC,UAAkC,KAClC,KAAAC,oBAA4C,KAI5C,KAAAC,aAAc,EAEd,KAAAC,OAASjR,SAASkR,eAAe,cAejC,KAAAC,aAKN,CAAC,EACK,KAAAC,UAAuB,CAACC,EAAG,EAAGC,EAAG,EAAGC,MAzDrB,GAwEf,KAAAC,cAA2B7c,KAAKyc,UAChC,KAAAK,eAAyC9c,KAAKyc,UAC9C,KAAAM,eAAyC/c,KAAKyc,UAC9C,KAAAO,cAAwChd,KAAKyc,UAsR7C,KAAAQ,aAAe,KACvBjd,KAAK+c,eAAiB/c,KAAKgd,cAAgB,CAACN,EAAG,EAAGC,EAAG,GACrD3c,KAAK6c,cAAgB,OAAH,UAAO7c,KAAKyc,WAC9Bzc,KAAKkd,gBAAgB3J,UAAUxS,IAAI,iBACnCf,KAAKmd,gBAAiB,EACtBnd,KAAKod,gBAAkBC,KAAKC,MAC5Btd,KAAKud,mBAAmB9J,eAEpBzT,KAAK6c,cAAcH,GAAM1c,KAAK6c,cAAcF,GAAM3c,KAAKwd,YACzDxd,KAAKyd,mBAAqBzd,KAAK2S,QAAQjN,MAAMgY,wB,EAIvC,KAAAC,aAAe,KAEvB3d,KAAKkd,gBAAgB3J,UAAU/Q,OAAO,iBACtCxC,KAAKud,mBAAmB9J,eAExB,MAAM,aAACmK,GAAgB5d,KAKvB,GAJAA,KAAK6d,cAAe,EACpB7d,KAAKmd,gBAAiB,EACtBnd,KAAK4d,kBAAe3Z,GAEjBjE,KAAK8d,QAIR,GAAG9d,KAAKyc,UAAUG,MA5XK,EA4XuB,CAE5C,MAAMmB,EAAKvX,KAAKI,IAAI5G,KAAKyc,UAAUG,MA5XlB,GA6XXoB,EAAcD,EAAK/d,KAAKyc,UAAUG,MAIxC,IAAIqB,EAAKje,KAAKyc,UAAUC,EAAIsB,GAAehe,KAAK8c,eAAeJ,EAAIsB,EAAche,KAAK8c,eAAeJ,GACjGwB,EAAKle,KAAKyc,UAAUE,EAAIqB,GAAehe,KAAK8c,eAAeH,EAAIqB,EAAche,KAAK8c,eAAeH,GAGrG,GAAGiB,GAAiC,UAAjBA,GAA4B5d,KAAK6c,cAAcD,QAAU5c,KAAKyc,UAAUG,MAAO,CAEhG,MAAMuB,EAAI,GAGJC,EAAc5X,KAAKC,IAAI,EAAG4W,KAAKC,MAAQtd,KAAKod,iBAC5CiB,EAAK7X,KAAK8X,IAAIte,KAAK+c,eAAeL,GAAK0B,EACvCG,EAAK/X,KAAK8X,IAAIte,KAAK+c,eAAeJ,GAAKyB,EAG7CH,GAAMzX,KAAK8X,IAAIte,KAAK+c,eAAeL,GAAK2B,EAAKF,GAAKne,KAAKgd,cAAcN,EACrEwB,GAAM1X,KAAK8X,IAAIte,KAAK+c,eAAeJ,GAAK4B,EAAKJ,GAAKne,KAAKgd,cAAcL,C,CAGvE,MAAOF,GAAazc,KAAKwe,0BAA0B,CAAC9B,EAAGuB,EAAItB,EAAGuB,EAAItB,MAAOmB,IACzE/d,KAAK6c,cAAgBJ,EACrBzc,KAAKye,aAAahC,E,MACVzc,KAAKyc,UAAUG,MAxZF,GAyZrB5c,KAAK0e,W,EAIC,KAAAC,OAAS,EACjBC,iBACAC,iBACAC,OACAC,UACAC,iBACAC,iBACAC,cACAC,cACAC,iBAEAR,IAAAA,EAAmBS,EAAA,QAAmB,GACtCR,IAAAA,EAAmBQ,EAAA,SAAoB,GACvCL,IAAAA,EAAmBK,EAAA,QAAmB,GACtCJ,IAAAA,EAAmBI,EAAA,SAAoB,GAEvCrf,KAAK6d,cAAe,EAEpB,MACMjB,EAAQmC,GAAU,EAAAO,EAAA,GAAMtf,KAAK6c,cAAcD,MAAQmC,EAASjD,EADvCyD,IAC8ET,QAAAA,GAAQ,EAAAQ,EAAA,GAAMtf,KAAK6c,cAAcD,MAAQwC,EAAYtD,EADnIyD,IAErBvB,EAAcpB,EAAQ5c,KAAK6c,cAAcD,MACzC4C,EAAUhZ,KAAK8X,IAAI9X,KAAKI,IAAI5G,KAAK6c,cAAcH,EAAG,IAClD+C,EAAUjZ,KAAK8X,IAAI9X,KAAKI,IAAI5G,KAAK6c,cAAcF,EAAG,IAGxD3c,KAAK8c,eAAiB,CACpBJ,EAAGsC,EACHrC,EAAGsC,GAIL,MAAMS,EAAgBF,EAAUZ,EAC1Be,EAAgBF,EAAUZ,GAE1B,aAACe,EAAY,aAAEC,GAAgB7f,KAAK8f,qBAAqB,CAACpD,EAAGgD,EAAe/C,EAAGgD,EAAe/C,MAAOoB,KAEpGvB,GAAazc,KAAKwe,0BAA0B,CACjD9B,EAAG1c,KAAK6c,cAAcH,EAAIkD,EAAeV,EACzCvC,EAAG3c,KAAK6c,cAAcF,EAAIkD,EAAeV,EACzCvC,UAGF5c,KAAKye,aAAahC,EAAU,EAgGpB,KAAA+B,0BAA4B,EACnC9B,IAAGC,IAAGC,SACPmD,EAAY,KAEZ,IAAI/f,KAAKyd,mBAAoB,MAAO,CAAC,CAACf,IAAGC,IAAGC,UAAQ,GAAM,GAE1D,IAAIoD,GAAY,EACZC,GAAY,EAEhB,MAAM,KAACC,EAAI,KAAEC,EAAI,KAAEC,EAAI,KAAEC,GAAQrgB,KAAKsgB,kBAAkB1D,EAAOmD,GAQ/D,OANAC,EAAYpE,EAAUc,EAAGyD,EAAMD,GAC/BxD,GAAI,EAAA4C,EAAA,GAAM5C,EAAGyD,EAAMD,GAEnBD,EAAYrE,EAAUe,EAAG0D,EAAMD,GAGxB,CAAC,CAAC1D,IAAGC,EAFZA,GAAI,EAAA2C,EAAA,GAAM3C,EAAG0D,EAAMD,GAEJxD,SAAQoD,EAAWC,EAAU,EAsBpC,KAAAM,aAAe,CAAC7T,EAAQ1M,KAAKyc,UAAUG,S,MACxB,QAAvB,EAAA5c,KAAKyd,0BAAkB,QAAvBzd,KAAKyd,mBAAuBzd,KAAK2S,QAAQjN,MAAMgY,yBA/kBxB,IAklBpBhR,IACD1M,KAAKyc,UAAUC,EAAI,EACnB1c,KAAKyc,UAAUE,EAAI,GAGrB3c,KAAKkd,gBAAgB3R,MAAMkR,UAAY,eAAezc,KAAKyc,UAAUC,EAAE8D,QAAQ,SAASxgB,KAAKyc,UAAUE,EAAE6D,QAAQ,oBAAoB9T,EAAM8T,QAAQ,MAEnJxgB,KAAKwc,aAAaiE,OAAOlN,UAAU1J,OAAO,WAAY6C,IAAUoP,GAChE9b,KAAKwc,aAAakE,MAAMnN,UAAU1J,OAAO,WAxlBtB,IAwlBkC6C,GAErD1M,KAAK2gB,WA5lBkB,IA4lBPjU,EAA6B,EAsE/C,KAAAuH,QAAWlM,IACT,GAAG/H,KAAK4gB,yBAA0B,OAElC,MAAMvgB,EAAS0H,EAAE1H,OACjB,GAAsB,MAAnBA,EAAOwgB,QAAiB,OAG3B,IAFA,EAAAzG,EAAA,GAAYrS,GAET,IAYD,OAXG/H,KAAK8gB,0BACNrN,aAAazT,KAAK8gB,2BAElB9gB,KAAK4T,SAASL,UAAUxS,IAAI,4BAG9Bf,KAAK8gB,0BAA4BpN,OAAOhR,YAAW,KACjD1C,KAAK4T,SAASL,UAAU/Q,OAAO,uBAC/BxC,KAAK8gB,0BAA4B,CAAC,GACjC,MAKL,MAAMtD,EAAYxd,KAAKwd,UACvB,IAAIuD,EAAqB,KACzB,MAAMC,EAAa,CAAC,eAAgB,uBAAwB,sBAAuB,uBAAwB,kBACxGxD,GACDwD,EAAW3e,KAAK,uBAGlB2e,EAAWtgB,MAAMqJ,IACf,IAEE,GADAgX,GAAQ,EAAAE,EAAA,GAAgB5gB,EAAQ0J,GAC7BgX,EAAO,OAAO,C,CACjB,MAAMvb,GAAM,OAAO,C,KAGiBub,IAAWvD,GAAiC,QAAnBnd,EAAOwgB,SAAwC,UAAnBxgB,EAAOwgB,UAClG7gB,KAAK4S,O,EAID,KAAAsO,UAAanZ,IAEnB,GAAG6R,EAAA,iBAAgC,EACjC,OAGF,MAAMpN,EAAMzE,EAAEyE,IAEd,IAAIsN,GAAO,EACA,eAARtN,GACAxM,KAAKwd,WAAaxd,KAAK6T,QAAQjK,KAAKqL,QACrB,cAARzI,GACPxM,KAAKwd,WAAaxd,KAAK6T,QAAQnD,KAAKuE,QACrB,MAARzI,GAAuB,MAARA,EACpBxM,KAAKmhB,aACNnhB,KAAKohB,YAAoB,MAAR5U,GAGnBsN,GAAO,GAGN/R,EAAEsZ,SAAWtZ,EAAEuZ,WAChBthB,KAAKmhB,aAAc,GAGlBrH,IACD,EAAAM,EAAA,GAAYrS,E,EAIR,KAAAwZ,QAAWxZ,IACd6R,EAAA,iBAAgC,GAI9B7R,EAAEsZ,SAAWtZ,EAAEuZ,UAClBthB,KAAKmhB,aAAc,EAEhBnhB,KAAKwd,WACNxd,KAAKugB,e,EArpBTvgB,KAAKiH,SAAWua,EAAA,WAEhBxhB,KAAKyhB,KAAM,EAAAC,EAAA,IAAO,OAClB1hB,KAAKmc,UAAY,IAAI,IACrBnc,KAAKoc,oBAAsB,IAAI,IAAqB,CAClDuF,YAAY,EACZ/K,YAAY,IAEd5W,KAAKmc,UAAUhR,YACfnL,KAAKoc,oBAAoBjR,YACzBnL,KAAK4hB,cAAgB,IAAI,IAEzB5hB,KAAK4T,SAAWvI,SAASC,cAAc,OACvCtL,KAAK4T,SAASL,UAAUxS,IAAIgb,EAAyB,UAErD/b,KAAK6hB,YAAcxW,SAASC,cAAc,OAC1CtL,KAAK6hB,YAAYtO,UAAUxS,IAAI,YAE/B,MAAM+gB,EAAUzW,SAASC,cAAc,OACvCwW,EAAQvO,UAAUxS,IAAIgb,GAEtB,MAAMgG,EAAS/hB,KAAK+hB,OAAS1W,SAASC,cAAc,OACpDyW,EAAOxO,UAAUxS,IAAIgb,EAAyB,UAAWA,EAAyB,WAElF,MAAMiG,EAAa3W,SAASC,cAAc,OAC1C0W,EAAWzO,UAAUxS,IAAIgb,EAAyB,gBAElD/b,KAAK6T,QAAQ,iBAAkB,OAAW,QAAS,CAACoO,YAAY,IAGhEjiB,KAAKuU,OAAOnJ,UAAYC,SAASC,cAAc,OAC/CtL,KAAKuU,OAAOnJ,UAAUmI,UAAUxS,IAAIgb,EAAyB,UAAW,aACxE,MAAMmG,EAAc7W,SAASC,cAAc,OAE3CtL,KAAKuU,OAAO4N,SAAW,IAAI,IAC3BniB,KAAKuU,OAAO4N,SAAS5O,UAAUxS,IAAIgb,EAAyB,WAAY,aAExE/b,KAAKuU,OAAO6N,OAAS/W,SAASC,cAAc,OAC5CtL,KAAKuU,OAAO6N,OAAO7O,UAAUxS,IAAIgb,EAAyB,SAE1D/b,KAAKuU,OAAOiC,KAAOnL,SAASC,cAAc,OAC1CtL,KAAKuU,OAAOiC,KAAKjD,UAAUxS,IAAIgb,EAAyB,SAExDmG,EAAYxW,OAAO1L,KAAKuU,OAAO6N,OAAQpiB,KAAKuU,OAAOiC,MAEnDxW,KAAKuU,OAAOnJ,UAAUM,OAAO1L,KAAKuU,OAAO4N,SAAUD,GAGnD,MAAMG,EAAahX,SAASC,cAAc,OAC1C+W,EAAW9O,UAAUxS,IAAIgb,EAAyB,YAElDE,EAAWqG,OAAO,CAAC,WAAY,OAAQ,UAAUvd,SAASmT,IACxD,MAAM5B,GAAS,OAAW4B,EAAM,CAACqK,UAAU,IAC3CviB,KAAK6T,QAAQqE,GAAQ5B,EACrB+L,EAAW3W,OAAO4K,EAAO,IAG3BtW,KAAK6T,QAAQiL,KAAKvL,UAAUxS,IAAI,WAGhCf,KAAKwc,aAAapR,UAAYC,SAASC,cAAc,OACrDtL,KAAKwc,aAAapR,UAAUmI,UAAUxS,IAAI,kBAE1Cf,KAAKwc,aAAaiE,QAAS,OAAW,UAAW,CAAC8B,UAAU,KAC5D,QAAiBviB,KAAKwc,aAAaiE,QAAQ,IAAMzgB,KAAKohB,aAAY,KAClEphB,KAAKwc,aAAakE,OAAQ,OAAW,SAAU,CAAC6B,UAAU,KAC1D,QAAiBviB,KAAKwc,aAAakE,OAAO,IAAM1gB,KAAKohB,aAAY,KAEjEphB,KAAKwc,aAAagG,cAAgB,IAAI,IAAc,CAClDC,KAAM,IACN7b,IAAKkV,EACLrV,IAlKiB,EAmKjBic,gBAAgB,GArKK,GAuKvB1iB,KAAKwc,aAAagG,cAAcnO,eAChCrU,KAAKwc,aAAagG,cAAcG,YAAY,CAC1CC,QAAS5iB,KAAKugB,aACdsC,UAAW,IAAM7iB,KAAKugB,iBAGxBvgB,KAAKwc,aAAapR,UAAUM,OAAO1L,KAAKwc,aAAaiE,OAAQzgB,KAAKwc,aAAagG,cAAcpX,UAAWpL,KAAKwc,aAAakE,OAEtH,IAKJ1gB,KAAK2S,QAAQmQ,KAAOzX,SAASC,cAAc,OAC3CtL,KAAK2S,QAAQmQ,KAAKvP,UAAUxS,IAAIgb,EAAyB,YAEzD/b,KAAK2S,QAAQvH,UAAYC,SAASC,cAAc,OAChDtL,KAAK2S,QAAQvH,UAAUmI,UAAUxS,IAAIgb,EAAyB,cAE9D/b,KAAK2S,QAAQjN,MAAQ2F,SAASC,cAAc,OAC5CtL,KAAK2S,QAAQjN,MAAM6N,UAAUxS,IAAIgb,EAAyB,UAE1D/b,KAAK2S,QAAQvH,UAAUM,OAAO1L,KAAK2S,QAAQjN,OAE3C1F,KAAK2S,QAAQmQ,KAAKpX,OAAO1L,KAAK2S,QAAQvH,WACtC0W,EAAQpW,OAAO1L,KAAK2S,QAAQmQ,MAC5B9iB,KAAK6hB,YAAYnW,OAAOoW,GAGxBE,EAAWtW,OAAO1L,KAAK6T,QAAQ,gBAAiB7T,KAAKuU,OAAOnJ,WAC5D2W,EAAOrW,OAAOsW,EAAYK,GAE1BriB,KAAK6T,QAAQnD,KAAOrF,SAASC,cAAc,OAC3CtL,KAAK6T,QAAQnD,KAAK2K,UAAY,GAAGU,cAAmCA,kBACpE/b,KAAK6T,QAAQnD,KAAKqS,UAAY,2BAA2BhH,yBAEzD/b,KAAK6T,QAAQjK,KAAOyB,SAASC,cAAc,OAC3CtL,KAAK6T,QAAQjK,KAAKyR,UAAY,GAAGU,cAAmCA,mBACpE/b,KAAK6T,QAAQjK,KAAKmZ,UAAY,2BAA2BhH,yBAEzD/b,KAAKkd,gBAAkB7R,SAASC,cAAc,OAC9CtL,KAAKkd,gBAAgB3J,UAAUxS,IAAIgb,EAAyB,WAE5D/b,KAAKkd,gBAAgBxR,OAAO1L,KAAK6T,QAAQnD,KAAM1Q,KAAK6T,QAAQjK,MAE5D5J,KAAK4T,SAASlI,OAAO1L,KAAK6hB,YAAyD7hB,KAAK+hB,OAAQ/hB,KAAKkd,iBAIrGld,KAAKwI,WAAWwa,aAAe,KAC7BhjB,KAAK6T,QAAQnD,KAAK6C,UAAU1J,OAAO,QAAS7J,KAAKwI,WAAWK,SAAShG,QACrE7C,KAAK6T,QAAQjK,KAAK2J,UAAU1J,OAAO,QAAS7J,KAAKwI,WAAWoB,KAAK/G,OAAO,EAG1E7C,KAAKijB,aACP,CAEU5O,gBACR,QAAiBrU,KAAK6T,QAAQsC,SAAUnW,KAAKoT,iBAC7C,CAACpT,KAAK6T,QAAQjB,MAAO5S,KAAK6T,QAAQ,gBAAiB7T,KAAKoc,oBAAoBD,WAAWpX,SAASnE,KAC9F,QAAiBA,EAAIZ,KAAK4S,MAAM0H,KAAKta,MAAM,IAG5C,CAAC,EAAE,EAAGA,KAAK6T,QAAQnD,MAAO,CAAC,EAAG1Q,KAAK6T,QAAQjK,OAAmC7E,SAAQ,EAAEme,EAAY5M,MAEnGA,EAAO1I,iBAAiB,SAAU7F,KAChC,EAAAqS,EAAA,GAAYrS,GACT/H,KAAK2V,iBAER3V,KAAKwI,WAAWU,GAAGga,EAAW,GAC9B,KAGJ,QAAiBljB,KAAK6T,QAAQiL,MAAM,KAC/B9e,KAAKwd,UAAWxd,KAAK0e,YAEtB1e,KAAKohB,aAAY,E,IAMrBphB,KAAK4T,SAAShG,iBAAiB,QAAS5N,KAAKiU,SAE7CjU,KAAKwI,WAAWuI,OAAS,CAAC/N,EAAMgO,KAC3BA,EAAOhR,KAAKyS,YAAYzP,GACtBhD,KAAKsS,YAAYtP,EAAK,EAG7B,MAAMmgB,EAAiB,CAACC,EAAeC,KACrC,MAAO3G,EAAGC,GAAK,CAACyG,EAAQpjB,KAAK+c,eAAeL,EAAG2G,EAAQrjB,KAAK+c,eAAeJ,IACpEF,EAAWuD,EAAWC,GAAajgB,KAAKwe,0BAA0B,CACvE9B,EAAG1c,KAAKyc,UAAUC,EAAIA,EACtBC,EAAG3c,KAAKyc,UAAUE,EAAIA,EACtBC,MAAO5c,KAAKyc,UAAUG,QAexB,OAZA5c,KAAKgd,cAAgB,CACnBN,IACAC,KAGF3c,KAAK+c,eAAiB,CACpBL,EAAG0G,EACHzG,EAAG0G,GAGLrjB,KAAKye,aAAahC,GAEX,CAACuD,YAAWC,YAAU,EAGzBqD,GAAqB,EAAA7J,EAAA,IAAS,KAClCzZ,KAAKod,gBAAkBC,KAAKC,KAAK,GAChC,KAAK,GAAO,GAEftd,KAAKud,oBAAqB,EAAA9D,EAAA,IAAS,KACjCzZ,KAAK2d,cAAc,GAClB,KAAK,GAAO,GAEf3d,KAAKujB,aAAe,IAAI,IAAa,CACnCrhB,QAASlC,KAAK4T,SACd4P,QAASxjB,KAAK2d,aACd8F,aAAczjB,KAAKid,aACnByG,QAAS,CAACN,EAAOC,EAAOtb,EAAG4b,KACzB,KAAG,UAIH,IAAG3jB,KAAKwd,WAAcxd,KAAK6d,cAU3B,IAAG7d,KAAK6d,cAAiB,IAKzB,OADiBrX,KAAK8X,IAAI8E,GAAS/D,EAAA,QACrB,IAAM7Y,KAAK8X,IAAI8E,GAAS,KACjCA,EAAQ,EACTpjB,KAAK6T,QAAQnD,KAAKuE,QAElBjV,KAAK6T,QAAQjK,KAAKqL,SAGb,IAGSzO,KAAK8X,IAAI+E,GAAShE,EAAA,SACrB,IAAM7Y,KAAK8X,IAAI+E,GAAS,OACrCrjB,KAAK4S,SACE,OA5BT,CACE0Q,IAEAtjB,KAAK4d,aAAe7V,EAAEnG,KACtB,MAAM,UAACoe,EAAS,UAAEC,GAAakD,EAAeC,EAAOC,GACrDM,SAAAA,GAAc3D,GAAYC,E,CA0BhB,EAEdtB,OAAQ3e,KAAK2e,OACbiF,cAAe,EAAEC,UAASC,cACxB,GAAG9jB,KAAKwd,UACNxd,KAAK0e,gBACA,CACL,MAAM9B,EAAQmH,EACd/jB,KAAKgkB,qBAAqBH,EAASC,EAASlH,E,GAGhDqH,kBAAoBlc,MAEf,EAAAkZ,EAAA,GAAgBlZ,EAAE1H,OAAQ,oBAC3B,EAAA4gB,EAAA,GAAgBlZ,EAAE1H,OAAQ,0BACzB,EAAA4gB,EAAA,GAAgBlZ,EAAE1H,OAAQ,wBAAqC,UAAX0H,EAAEnG,MAM3DsiB,OAAQ,IAGZ,CA2GUF,qBAAqBtH,EAAWC,EAAWC,GACnD,MAAM,aAACgD,EAAY,aAAEC,GAAgB7f,KAAK8f,qBAAqB,CAACpD,IAAGC,IAAGC,UAChEH,EAAYzc,KAAKwe,0BAA0B,CAC/C9B,EAAGkD,EACHjD,EAAGkD,EACHjD,UACC,GAEH5c,KAAKye,aAAahC,EACpB,CAEUgC,aAAahC,GACrBzc,KAAKyc,UAAYA,EACjBzc,KAAKmkB,WAAW1H,EAAUG,MAC5B,CAGUkD,sBAAqB,EAACpD,EAAC,EAAEC,EAAC,MAAEC,IAKpC,MAAO,CACLgD,aAAclD,EAAIE,EAAQF,EAC1BmD,aAAclD,EAAIC,EAAQD,EAE9B,CAEUgE,WAAWyD,GACnB,MAAMC,EAAYrkB,KAAKwd,UACjB8G,OAAkBrgB,IAAXmgB,EAOb,IANGpkB,KAAKwc,aAAagG,cAAc+B,WAAavkB,KAAKmhB,eACnDiD,GAAS,GAGXA,UAAAA,GAAYC,GAETA,IAAcD,EAAjB,CAQA,GAJApkB,KAAK6T,QAAQiL,KAAKvL,UAAU1J,OAAO,WAAYua,GAC/CpkB,KAAKwc,aAAapR,UAAUmI,UAAU1J,OAAO,aAAc7J,KAAKwd,UAAY4G,GAC5EpkB,KAAK4T,SAASL,UAAU1J,OAAO,aAAcua,GAE1CE,IAASF,EAAQ,CAClB,MAAMI,EAAYJ,EAASpkB,KAAKyc,UAAUG,MAxfrB,EAyfrB5c,KAAKugB,aAAaiE,GAClBxkB,KAAKwc,aAAagG,cAAciC,YAAYD,E,CAG3CxkB,KAAK0kB,aACN1kB,KAAK0kB,YAAYC,cAAaP,QAAiBngB,E,CAEnD,CAEUmd,YAAYrgB,GACpBf,KAAK4kB,QApgBS,IAogBY7jB,EAAM,GAAK,GACvC,CAEU2d,YACR1e,KAAKye,aAAa,CAChB/B,EAAG,EACHC,EAAG,EACHC,MA1gBqB,GA4gBzB,CAEUuH,WAAWzX,EAAQ1M,KAAKyc,UAAUG,OAC1C5c,KAAKyc,UAAUG,MAAQlQ,EACvB1M,KAAKwc,aAAagG,cAAciC,YAAY/X,GAC5C1M,KAAKugB,aAAa7T,EACpB,CAEUkY,QAAQlY,GAChB1M,KAAK6c,cAAgB7c,KAAKyc,UAC1Bzc,KAAK2e,OAAO,CACVI,QAASrS,EACTsS,eAAgB,EAChBC,eAAgB,EAChBL,eAAgB,EAChBC,eAAgB,EAChBK,YAAa,EACbC,YAAa,IAEfnf,KAAK6c,cAAgB7c,KAAKyc,UAC1Bzc,KAAKud,oBACP,CAEUsH,gBACR,OAAO7kB,KAAKmd,gBAAkB,IAAqB,GAAK,CAC1D,CAsBUmD,kBAAkB1D,EAAQ5c,KAAKyc,UAAUG,MAAOmD,EAAY,GACpE,IAAI/f,KAAKyd,mBACP,MAAO,CAACyC,KAAM,EAAGC,KAAM,EAAGC,KAAM,EAAGC,KAAM,GAG3C,MAAMwD,GAAWxE,EAAA,QAAmBA,EAAA,QAAmBzC,GAAS,EAC1DkH,GAAWzE,EAAA,SAAoBA,EAAA,SAAoBzC,GAAS,EAUlE,MAAO,CAACsD,KANK1Z,KAAKC,KAAKzG,KAAKyd,mBAAmBqH,KAAOlI,EAAOiH,GAM/C1D,KALDd,EAAA,QAAmBrf,KAAKyd,mBAAmBsH,MAAQnI,EAK5CwD,KAHP5Z,KAAKC,KAAKzG,KAAKyd,mBAAmBuH,IAAMpI,EAAQmD,EAAW+D,GAG9CzD,KAFbhB,EAAA,SAAoBrf,KAAKyd,mBAAmBwH,OAASrI,EAGpE,CAmBUxI,iBAAiBP,GACzB,MAAMqR,GAAgB,OAAiB,CAACC,cAAe,CAAClD,YAAY,GAAOmD,UAAW,cAAevR,YACrG7T,KAAK+hB,OAAOrW,OAAOwZ,EACrB,CAEOtS,MAAM7K,G,QAKX,GAJGA,IACD,EAAAqS,EAAA,GAAYrS,GAGX/H,KAAK4gB,yBAA0B,OAAOyE,QAAQC,SAEjDtlB,KAAK8d,SAAU,EACE,QAAjB,EAAA9d,KAAKujB,oBAAY,SAAE5H,kBAEhB3b,KAAKulB,gBACNC,EAAA,aAAmCxlB,KAAKulB,gBAG1CvlB,KAAK4hB,cAAc6D,QAEnB,MAAMlX,EAAUvO,KAAK0lB,iBAA4B,QAAX,EAAA1lB,KAAKK,cAAM,eAAE6B,SAAS,GAAMoM,MAAK,EAAEqX,oBAAoBA,IAuB7F,OArBA3lB,KAAKwI,WAAWmI,QACf3Q,KAAKwI,WAAqCkT,SAAY1b,KAAKwI,WAAqCkT,UACjG1b,KAAK2V,gBAAkB,KACvB3V,KAAKkc,QAAU,EACXxI,OAAekS,iBAAmB5lB,OACnC0T,OAAekS,oBAAiB3hB,GASnCjE,KAAK6lB,wBAELtX,EAAQ4J,SAAQ,KACdnY,KAAK4T,SAASpR,SACdxC,KAAK8lB,eAAc,EAAM,IAGpBvX,CACT,CAEUuX,cAAcC,GACtBnM,EAAA,kBAAiCmM,EACjCjmB,EAAA,mBAAsCimB,EACxC,CAEUC,sBAAsBD,GAC3BA,EAAQ/lB,KAAKimB,qBACXjmB,KAAK6lB,uBACZ,CAEUA,wBACRnS,OAAOhC,oBAAoB,UAAW1R,KAAKkhB,WAC3CxN,OAAOhC,oBAAoB,QAAS1R,KAAKuhB,QAC3C,CAEU0E,qBACRvS,OAAO9F,iBAAiB,UAAW5N,KAAKkhB,WACxCxN,OAAO9F,iBAAiB,QAAS5N,KAAKuhB,QACxC,CAuFgBmE,iBAAiBrlB,EAAqByd,GAAU,EAAOtI,EAAY,G,yCACjFxV,KAAKoJ,cAAc,kBAEnB,MAAM2X,EAAQ/gB,KAAK2S,QAAQoO,MAEvBjD,IACFiD,EAAMgC,UAAY,IAIpB,MAAMyB,EAAYxkB,KAAKwd,WAAaM,EAAyB9d,KAAKyc,UAAUG,MAjwBrD,EAkwBe5c,KAAKkmB,sBAAsBnF,GAEjE,MAAMoF,EAA0B,IAAd3Q,EAEZ4Q,EAAQ5E,EAAA,6BAAwC2E,EAAY,IAAM,IAAO,EAY/E,IAAIE,EAEAC,EACDjmB,IACEA,aAAkB,KAAiBA,EAAOkT,UAAUqB,SAAS,cAC9DyR,EAAahmB,EACbimB,EAAOjmB,EAAOqd,yBACNrd,aAAkBkmB,iBAAmBlmB,EAAO4Y,yBAAyBuN,yBAC7EH,GAAa,EAAApF,EAAA,GAAgB5gB,EAAQ,cACrCimB,EAAOD,EAAW3I,yBACVrd,EAAOkT,UAAUqB,SAAS,4BAClCyR,GAAa,EAAApF,EAAA,GAAgB5gB,EAAQ,6BACrCimB,EAAOD,EAAW3I,wBAGfI,GAAWzd,EAAOqd,wBAAwBoH,OAASwB,EAAKxB,OACzDzkB,EAASgmB,EAAaC,OAAOriB,KAK/B5D,IACFA,EAASL,KAAK2S,QAAQjN,OAGpB4gB,IACFD,EAAahmB,EAAO4Y,cACpBqN,EAAOjmB,EAAOqd,yBAGhB,IAAI+I,GAAc,EAClB,GAAGpmB,IAAWL,KAAK2S,QAAQjN,QAAUrF,EAAOkT,UAAUqB,SAAS,0BAA2B,CACxF,MAAM8R,GAAkB,EAAAzF,EAAA,GAAgBoF,EAAY,cAC9CM,GAAc,EAAAC,EAAA,GAAeP,EAAYK,GAAiB,IAE7D5I,GAAa6I,GAAiD,IAAlCA,EAAYE,SAASC,UAAsD,IAApCH,EAAYE,SAASE,YAIjFJ,GAAkD,IAAlCA,EAAYE,SAASC,UAAsD,IAApCH,EAAYE,SAASE,aACpFN,GAAc,IAHdJ,GADAhmB,EAASL,KAAK2S,QAAQjN,OACFuT,cACpBqN,EAAOjmB,EAAOqd,wB,CAMlB,MAAMsJ,EAAgBhnB,KAAK2S,QAAQjN,MAAMgY,wBAEzC,IACIoH,EACAE,EA6BAiC,EA/BAxK,EAAY,GAgChB,GA5BG0J,GACDrB,EAAqB,IAAdtP,EAAkB6J,EAAA,SAAoB2H,EAAcE,MAC3DlC,EAAMgC,EAAchC,MAEpBF,EAAOwB,EAAKxB,KACZE,EAAMsB,EAAKtB,KAWbvI,GAAa,eAAeqI,OAAUE,UAYnC3kB,aAAkB8mB,kBAAoB9mB,aAAkBkC,kBAAuC,QAAnBlC,EAAOwgB,QAAmB,CACvG,GAAGE,EAAMxL,mBAAqBwL,EAAMxL,kBAAkBhC,UAAUqB,SAAS,yBAA0B,CACjGqS,EAAWlG,EAAMxL,kBAEjB,MAAMnT,EAAS6kB,EAASrP,cAAc,iBACtC,GAAGxV,EAAQ,CACT,MAAM8D,EAAQ9D,EAAOmT,kBACrB0R,EAASvb,OAAOxF,GAChB9D,EAAOI,Q,CAGLykB,EAAS1b,MAAMC,UACjBuV,EAAMxN,UAAU/Q,OAAO,UACvBxC,KAAKonB,cAAcH,EAAUD,EAAeV,GACvCvF,EAAMsG,WACXtG,EAAMxN,UAAUxS,IAAI,U,MAGtBkmB,EAAW5b,SAASC,cAAc,OAClC2b,EAAS1T,UAAUxS,IAAI,yBACvBggB,EAAM/I,QAAQiP,GAGhBA,EAAS1b,MAAMC,QAAU,UAAU8a,EAAKY,oBAAoBZ,EAAKgB,gCAAgCN,EAAcE,MAAQZ,EAAKY,UAAUF,EAAcM,OAAShB,EAAKgB,a,CAGpKvG,EAAMxV,MAAM2b,MAAQF,EAAcE,MAAQ,KAC1CnG,EAAMxV,MAAM+b,OAASN,EAAcM,OAAS,KAI5C,MAAMC,EAASjB,EAAKY,MAAQF,EAAcE,MACpCM,EAASlB,EAAKgB,OAASN,EAAcM,OACvCnB,IACF1J,GAAa,WAAW8K,KAAUC,SAGpC,IAAIC,EAAe/T,OAAOgU,iBAAiBrB,GAAYsB,iBAAiB,iBACxE,MAAMC,EC77BK,SAA2BC,GACxC,MAAMC,EAAWD,EAAIE,MAAM,KAC3B,GAAuB,IAApBD,EAASjlB,OAAc,CACpBilB,EAAS,KAAIA,EAAS,GAAK,OAC/B,IAAI,IAAIE,EAAIF,EAASjlB,OAAQmlB,EAAI,IAAKA,EACpCF,EAASE,GAAKF,EAASE,EAAI,IAAMF,EAAS,IAAM,K,CAIpD,OAAOA,CACT,CDm7BuBG,CAAkBR,GAOrC,GANAA,EAAeG,EAAW9M,KAAKoN,GAAOC,SAASD,GAAKX,EAAU,OAAMa,KAAK,KACrEjC,IACFpF,EAAMxV,MAAMkc,aAAeA,GAI1B3J,GAAyB,IAAd0G,EAAiB,CAC7B,MAAMM,EAAOwB,EAAKxB,MAAQzF,EAAA,QAAmBkI,EAASjB,EAAKY,OAAS,EAC9DlC,EAAMsB,EAAKtB,KAAO3F,EAAA,SAAoBmI,EAASlB,EAAKgB,QAAU,EACpEtnB,KAAKkd,gBAAgB3R,MAAMkR,UAAY,UAAU8K,YAAiBC,MAAW1C,MAASE,I,MAEtFjE,EAAMxV,MAAMkR,UAAYA,EAS1B,IAAI4L,EANJ5B,IAAgB1F,EAAMxV,MAAM+c,QAAU,KAOtC,MAAMC,EAAQloB,EAAOkT,UAAUqB,SAAS,UAElC1G,EAAWlO,KAAK4gB,0BAA2B,SAC3C4H,EAAM,CAAC7C,eAAgBzX,GAEvByL,EAAUjX,YAAW,KACrBwL,EAASua,aAAgBva,EAASwa,YACpCxa,EAASC,S,GAEV,KAYH,GAVAD,EAASiK,SAAQ,KACfnY,KAAKoJ,cAAc,iBAEhBpJ,KAAK4gB,2BAA6B1S,IACnClO,KAAK4gB,yBAA2B,MAGlCnN,aAAakG,EAAQ,IAGnBmE,EA+KF,OAlCGzd,aAAkBsoB,gBACnBN,EAAOtH,EAAMnJ,cAAc,QAExByQ,GACDroB,KAAK4oB,aAAaP,EAAMrB,EAAeO,EAAQnB,GAAO,EAAOmC,EAAOd,IAIrEpnB,EAAOkT,UAAUqB,SAAS,uBAC3BmM,EAAMxN,UAAUxS,IAAI,UAGtBf,KAAK6oB,mBAAkB,GAIvBnmB,YAAW,KACTqe,EAAMxV,MAAMkc,aAAeA,EAExB1G,EAAMxL,oBACNwL,EAAMxL,kBAAkChK,MAAMkc,aAAeA,E,GAE/DrB,EAAQ,GAEX1jB,YAAW,KACTqe,EAAMgC,UAAY,GAClBhC,EAAMxN,UAAU/Q,OAAO,SAAU,SAAU,UAC3Cue,EAAMxV,MAAMC,QAAU,iBAEtB0C,EAASC,SAAS,GACjBiY,GAEHrF,EAAMxN,UAAU/Q,OAAO,WAEhBgmB,EA/KI,CACX,IAAIM,EACAnmB,EAGJ,MAAMomB,EAAW,gCACXC,EAAY3oB,EAAO4oB,QAAQF,GAAY1oB,EAAO4Y,cAAgB5Y,EAC9D6oB,EAAWhQ,MAAMC,KAAK6P,EAAUvQ,iBAAiBsQ,IACvD,GAAGG,EAASrmB,OAAQ,CAClBxC,EAAS6oB,EAASC,MAClB,MAAM7lB,EAAS+H,SAASC,cAAc,UAChCkF,EAAUlN,EAAO8lB,WAAW,MAC/B/oB,aAAkB8mB,kBACnB7jB,EAAO4jB,MAAQ7mB,EAAOgpB,aACtB/lB,EAAOgkB,OAASjnB,EAAOipB,eACfjpB,aAAkBkC,kBAC1Be,EAAO4jB,MAAQ7mB,EAAOkpB,WACtBjmB,EAAOgkB,OAASjnB,EAAOmpB,aACfnpB,aAAkBopB,oBAC1BnmB,EAAO4jB,MAAQ7mB,EAAO6mB,MACtB5jB,EAAOgkB,OAASjnB,EAAOinB,QAGzBhkB,EAAO+X,UAAY,yCACnB7K,EAAQkZ,UAAUrpB,EAAgD,EAAG,GACrEA,EAASiD,C,CAIX,GAAsB,QAAnBjD,EAAOwgB,SAAwC,mBAAnBxgB,EAAOwgB,QAA8B,CAClE,MACM8I,EADSzQ,MAAMC,KAAK9Y,EAAOoY,iBAAiB,QAC7B0Q,MAClBQ,IACDb,EAAe,IAAIc,MACnBjnB,EAAMgnB,EAAMhnB,IACZoe,EAAMrV,OAAOod,G,MAIV,GAAGzoB,aAAkB8mB,iBAC1B2B,EAAe,IAAIc,MACnBjnB,EAAMtC,EAAOsC,SACR,GAAGtC,aAAkBkC,iBAC1BumB,GAAe,EAAAe,EAAA,KACff,EAAanmB,IAAMtC,EAAOsC,SACrB,GAAGtC,aAAkBsoB,cAAe,CACzC,MAAMmB,EAASzpB,EAAO0pB,QAAQD,OACxBE,EAAYF,EAAS,OAErB,MAAC5C,EAAK,OAAEI,GAAUN,EAElBiD,EAAS5e,SAAS6e,gBAAgB,6BAA8B,OACtED,EAAOE,eAAe,KAAM,QAAS,GAAKjD,GAC1C+C,EAAOE,eAAe,KAAM,SAAU,GAAK7C,GAG3C2C,EAAOE,eAAe,KAAM,UAAW,OAAOjD,KAASI,KACvD2C,EAAOE,eAAe,KAAM,sBAAuB,iBAEnDF,EAAO1R,mBAAmB,YAAalY,EAAOkV,kBAAkB6U,UAAUC,QAAQP,EAAQE,IAC1FC,EAAO1R,mBAAmB,YAAalY,EAAOiqB,iBAAiBF,UAAUC,QAAQP,EAAQE,IAGzF,MAAMO,EAAON,EAAO1U,kBACdiV,EAAMD,EAAKhV,kBAAkBA,kBACnC,GAAGiV,aAAeC,cAAe,CAC/B,IAmBIC,EAnBAjO,EAAY+N,EAAIG,eAAe,KAAM,aACzClO,EAAYA,EAAU4N,QAAQ,mDAAmD,CAAC9kB,EAAOmX,EAAGC,EAAGiO,EAAIC,IAU1F,aAPLnO,EADO,IADTA,GAAKA,GAECwK,EAAS,EAAIK,EAEb,EAAIA,MAGND,aAEmCsD,EAAKrD,OAAYsD,EAAKrD,OAE/DgD,EAAIL,eAAe,KAAM,YAAa1N,GAGtC4L,EAAOkC,EAAKhV,kBAAkB+U,iBAI9B,MAAMQ,EAAuCrD,EAAaM,MAAM,KAAKjN,KAAKiQ,GAAM5C,SAAS4C,KAC/EL,EAAPnC,GAAW,EAAAyC,EAAA,GAAiB,EAAG,EAAG9D,EAAQ,EAAIK,EAAQD,KAAWwD,IAC3D,EAAAE,EAAA,GAAiB,EAAIzD,EAAQ,EAAGL,EAAQ,EAAIK,EAAQD,KAAWwD,GACxEzC,EAAK8B,eAAe,KAAM,IAAKO,E,CAGjC,MAAMO,EAAgBhB,EAAOK,iBAC7BW,EAAcd,eAAe,KAAM,QAAS,GAAKnD,EAAcE,OAC/D+D,EAAcd,eAAe,KAAM,SAAU,GAAKnD,EAAcM,QAEhEvG,EAAM/I,QAAQiS,E,MACN5pB,aAAkBopB,oBAC1BX,EAAezoB,GAGd4mB,IACDA,EAAS1b,MAAMkc,aAAeA,EAE3BqB,GACD7B,EAASvb,OAAOod,IAIpBA,EAAe/H,EAAMnJ,cAAc,cAChCkR,aAAwB3B,mBACzB2B,EAAavV,UAAUxS,IAAI,aACvBkmB,IACF6B,EAAavd,MAAM2b,MAAQF,EAAcE,MAAQ,KACjD4B,EAAavd,MAAM+b,OAASN,EAAcM,OAAS,MAGlD3kB,UACK,EAAAuoB,EAAA,IAA0BpC,EAAcnmB,KAYlDoe,EAAMxV,MAAM4f,QAAU,IAEtB,SAAQ,KACNpK,EAAMxN,UAAUxS,IAAIolB,EAAY,SAAW,SAAS,G,CAyGxD,OA5DApF,EAAMxN,UAAUxS,IAAI,iBAKd,UAONggB,EAAMxV,MAAMkR,UAAY,eAAeuK,EAAclC,UAAUkC,EAAchC,0BAE7EyB,IAAgB1F,EAAMxV,MAAM+c,QAAU,IAEnCrB,GACDjnB,KAAKonB,cAAcH,EAAUD,EAAeV,GAK9C5jB,YAAW,KACTqe,EAAMxV,MAAMkc,aAAe,GAExB1G,EAAMxL,oBACNwL,EAAMxL,kBAAkChK,MAAMkc,aAAe,G,GAE/D,GAEH1G,EAAMgJ,QAAQpQ,QAAU,GAAKjX,YAAW,KACtCqe,EAAMxN,UAAU/Q,OAAO,SAAU,WAE9BykB,IACElG,EAAMnJ,cAAc,SACrBmJ,EAAMxN,UAAU/Q,OAAO,UACvBykB,EAAS1b,MAAMC,QAAU,GACpBuV,EAAMsG,YAOftG,EAAMxN,UAAUxS,IAAI,SAAU,iBAM9BggB,EAAMxN,UAAUxS,IAAI,iBACbggB,EAAMgJ,QAAQpQ,QAErBzL,EAASC,SAAS,GACjBiY,GAEAiC,GACDroB,KAAK4oB,aAAaP,EAAMrB,EAAeO,EAAQnB,GAAO,EAAMmC,EAAOd,GAG9De,CACT,G,CAEUK,kBAAkB9C,GACvBA,EACD/lB,KAAK4T,SAASL,UAAUxS,IAAI,WAE5Bf,KAAK4T,SAASL,UAAUxS,IAAI,aAC5B2B,YAAW,KACT1C,KAAK4T,SAASL,UAAU/Q,OAAO,SAAS,GACvC,GAEP,CAEU4kB,cAAcH,EAA0BD,EAAwBV,GAQxE,MAAM8E,EAAapE,EAAcE,MAAQF,EAAcM,OAEvD,IAAI,MAACJ,EAAK,OAAEI,GAAUhB,EAInB8E,EAAa,EACdlE,EAAQI,EAAS8D,EAEjB9D,EAASJ,EAAQkE,EAKnBnE,EAAS1b,MAAMC,QAAU,UAAU0b,gBAAoBI,2BAAgCN,EAAcE,MAAQA,MAAUF,EAAcM,OAASA,QAEhJ,CAEUsB,aAAaP,EAAsB/B,EAAeiB,EAAgBnB,EAAeiF,EAAkB9C,EAAgBd,GAC3H,MAAM6D,EAAQjO,KAAKC,OACb,MAAC4J,EAAK,OAAEI,GAAUhB,EACxBF,GAAgB,EAEhB,MAAM0E,EAAKrD,EAAaM,MAAM,KAAKjN,KAAKiQ,GAAM5C,SAAS4C,KAEjDtI,EAAO,KACX,MAAM8I,EAAOlO,KAAKC,MAAQgO,EAE1B,IAAIzT,EAAWuO,EAAQmF,EAAOnF,EAAQ,EACnCvO,EAAW,IAAGA,EAAW,GACzBwT,IAASxT,EAAW,EAAIA,GAE3B,MAAM2T,EAAwCV,EAAGhQ,KAAKiQ,GAAMA,EAAIlT,IAEhE,IAAI6S,EACMA,EAAPnC,GAAW,EAAAyC,EAAA,GAAiB,EAAG,EAAG9D,EAAS,EAAIK,EAAS1P,EAAWyP,KAAWkE,IACxE,EAAAR,EAAA,GAAiB,EAAIzD,EAAS1P,EAAU,EAAGqP,EAA4CI,KAAWkE,GAC3GnD,EAAK8B,eAAe,KAAM,IAAKO,GAE5Ba,EAAOnF,IAAO,QAAQ3D,EAAK,EAIhCA,GACF,CAEUyD,sBAAsBnF,GAC9B,GAAGA,EAAMxN,UAAUqB,SAAS,UAAW,CAErC,MAAM0R,EAAOtmB,KAAK2S,QAAQjN,MAAMgY,wBAChCqD,EAAMxV,MAAMkR,UAAY,eAAe6J,EAAKxB,UAAUwB,EAAKtB,WAC3DjE,EAAMxN,UAAU/Q,OAAO,UAClBue,EAAMsG,WACXtG,EAAMxN,UAAU/Q,OAAO,gB,CAE3B,CAEUipB,aAAa1K,EAAoB2K,GAAS,GAClD,MAAMC,EAAUtM,EAAA,QAEhBrf,KAAKkmB,sBAAsBnF,GAG3BA,EAAMxN,UAAUxS,IAAI,UAEjBggB,EAAMgJ,QAAQpQ,SACflG,cAAcsN,EAAMgJ,QAAQpQ,SAG9B,MAAM2M,EAAOvF,EAAMrD,wBAEbkO,EAAe7K,EAAMxV,MAAMkR,UAAU4N,QAAQ,uBAAuB,CAAC9kB,EAAOsmB,KAChF,MAAMnP,EAAIgP,GAAUpF,EAAKY,MAAQyE,EAGjC,OAAOpmB,EAAM8kB,QAAQwB,EAAInP,EAAI,KAAK,IAIpCqE,EAAMxV,MAAMkR,UAAYmP,EAExBlpB,YAAW,KACTqe,EAAMve,QAAQ,GACb,IACL,CAEUygB,cACR,MAAM6I,EAAWzgB,SAASC,cAAc,OAWxC,OAVAwgB,EAASvY,UAAUxS,IAAI,sBACvB+qB,EAASvgB,MAAM4f,QAAU,OAEtBnrB,KAAK2S,QAAQoO,MACG/gB,KAAK2S,QAAQoO,MACrB9H,cAAcvN,OAAOogB,GAE9B9rB,KAAKkd,gBAAgBxR,OAAOogB,GAGvB9rB,KAAK2S,QAAQoO,MAAQ+K,CAC9B,CAEUC,kBAAkB1rB,EAAqBqH,EAAamZ,GAE5D,MAAMjgB,EAAKP,EAAOwgB,QAAQmL,gBAAkBnL,EAAUxgB,EAASA,EAAOuX,cAAciJ,GACpF,GAAGjgB,KAAO,EAAAqgB,EAAA,GAAgB5gB,EAAQ,YAAa,CAC7C,IAAG,EAAA4gB,EAAA,GAAgB5gB,EAAQ,cAAe,CAExC,MAAM8b,EAAY9b,EAAO4Y,cAAcA,cAAcrB,cAAc,wBACnE,GAAGuE,EAAW,CACZ,GAAe,UAAZ0E,EAMD,YALG1E,EAAU5I,UAAUqB,SAAS,WAC9BuH,EAAUlH,SAOdkH,EAAU3Z,Q,EAIV5B,EAAwB+B,MAAQ+E,IAClC,EAAAwjB,EAAA,IAAmBtqB,EAAI8G,GAItB9G,EAAG2S,UAAUqB,SAAS,cAAgBhU,EAAGqY,cAAc1F,UAAUqB,SAAS,6BAC3EhU,EAAG2S,UAAU/Q,OAAO,Y,CAM1B,CAEUypB,cAAcne,EAAyBoe,GAC/C,MAAMC,EAAWre,EAAOqe,WACxB,IAAIC,EACJ,GAAGD,EACDC,GAAmB,OAAc,CAC/BpkB,OAAQ8F,EACRue,QAAQ,EACR5c,eAAe,EACfD,WAAW,QAER,CACL,MAAMT,EAAQqd,EAAmB/gB,SAASC,cAAc,QACxDyD,EAAMrD,QAAO,EAAA4gB,EAAA,GAAcxe,IAC3BiB,EAAMwE,UAAUxS,IAAI,a,CAGtB,MAAMwrB,EAAYvsB,KAAKuU,OAAO4N,SACxBqK,EAAYxsB,KAAKuU,OAAO4N,SAAYoK,EAAUE,YAEpD,OAAOpH,QAAQqH,IAAI,CAChB1sB,KAAKuU,OAAO4N,SAA2BwK,kBAAkB,CACxD3kB,OAAQ8F,GAAoB,KAC5B8e,UAAWT,OAAWloB,EAAY,GAAK6J,IAGzCse,IACC9d,MAAK,EAAEsB,EAAGb,MACR/O,KAAKuU,OAAO4N,WAAaqK,KAI5B,EAAAK,EAAA,GAAe7sB,KAAKuU,OAAOiC,MAAM,QAAmB0V,KACpD,EAAAW,EAAA,GAAe7sB,KAAKuU,OAAO6N,OAAQrT,GACnCwd,EAAUO,YAAY9sB,KAAKuU,OAAO4N,UAAS,GAE/C,CAEgB5L,WACd7Q,EACAwmB,EACApe,EACA0H,EACAnV,EACA6Q,GAAU,EACVuE,EAA4B,GAC5BC,EAA4B,GAC5BvN,G,yCAGA,GAAGnI,KAAK2V,gBAAiB,OAAO3V,KAAK2V,gBAMrC,MAAMoX,EAAmB/sB,KAAKisB,cAAcne,EAAQoe,GAE9Cc,EAAyB,aAAZtnB,EAAMkK,EACnBqd,EAAUD,GAActnB,EAAMgR,YAAe,CAAC,QAAS,OAAgC3B,SAASrP,EAAM9D,OAA+C,IAAtC8D,EAAMgR,UAAUyD,QAAQ,WAE1Ina,KAAKqc,cAGNrc,KAAKqc,aAAc,EACnBrc,KAAKwI,WAAWW,WAAWsM,EAAaC,EAAaxE,GACpDwC,OAAekS,eAAiB5lB,MAShCA,KAAKwI,WAAWoB,KAAK/G,OAAS,IAC/BH,YAAW,KACT1C,KAAKwI,WAAW5F,MAAK,EAAK,GACzB,GAML5C,KAAK6T,QAAQnD,KAAK6C,UAAU1J,OAAO,QAAS7J,KAAKwI,WAAWK,SAAShG,QACrE7C,KAAK6T,QAAQjK,KAAK2J,UAAU1J,OAAO,QAAS7J,KAAKwI,WAAWoB,KAAK/G,QAEjE,MAAMuI,EAAYpL,KAAK2S,QAAQjN,MACzBwnB,GAAwB7sB,GAAUA,IAAW+K,EAChD8hB,IAAsB7sB,EAAS+K,GAElCpL,KAAKK,OAAS,CAAC6B,QAAS7B,GACxB,MAAM6b,IAAWlc,KAAKkc,OAEnB9Q,EAAUmK,oBACXnK,EAAU2X,UAAY,IAKQ,IAAdvN,GAEhBxV,KAAKyrB,aAAazrB,KAAK2S,QAAQoO,MAAqB,IAAdvL,GACtCxV,KAAKijB,gBAELjjB,KAAKulB,eAAiB,CACpB3jB,KAAM,QACNurB,MAAQC,IACN,GAAGptB,KAAK4gB,yBACN,OAAO,GAGLwM,GAAc,EAAAC,kBAChBrtB,KAAK4T,SAASpR,SAGhBxC,KAAK4S,OAAO,GAIhB4S,EAAA,WAAiCxlB,KAAKulB,gBAEtCvlB,KAAK8lB,eAAc,GACnB9lB,KAAKimB,2BACC8G,EAEF/sB,KAAK4T,SAASqF,gBAChBjZ,KAAKsc,OAAO/E,aAAavX,KAAK4T,SAAUvI,SAASkR,eAAe,iBAC3Dvc,KAAK4T,SAASyT,YAGrBrnB,KAAK6oB,mBAAkB,IAKzB,MAAM9H,EAAQ/gB,KAAK2S,QAAQoO,MAErBuM,EAAWjO,EAAA,QAGjB,IAAIkO,EAAU,EACd,MAAMC,EAAUnO,EAAA,SACbmO,EAAU,MAAYC,EAAA,aACvBF,EAAU,KAEZ,MAAMG,EAAYF,EAAU,IAAMD,EAClC,IAAII,EAA6BtI,QAAQlX,UACzC,MAAMtG,GAAO,EAAA+lB,EAAA,GAAkBloB,EAAO0F,EAAWkiB,EAAUI,GAAWD,EAAA,gBAAoCxpB,KAAc+oB,GAActnB,EAAM0I,GAAK1I,EAAM0J,IAAIye,UAC3J,GAAGX,EAAsB,CACvB,MAAM3lB,QAAqBvH,KAAKiH,SAASO,cAAcC,gBAAgB/B,EAAOmC,EAAKjG,MACnF,IAAIksB,EACJ,GAAGvmB,EAAawmB,WACdD,EAAM,IAAIlE,MACVkE,EAAInrB,IAAM4E,EAAaG,QAClB,CACL,MAAMsmB,GAAW,EAAAC,EAAA,GAAyBvoB,EAAO6B,GAAc,GAC5DymB,IACDL,EAAeK,EAASE,YACxBJ,EAAME,EAASrE,M,CAIhBmE,IACDA,EAAIva,UAAUxS,IAAI,aAClBqK,EAAUM,OAAOoiB,G,CASrB,MAAMzmB,KAAgC2lB,IAActnB,EAAM2B,mBACpD8U,EAAY9U,EAAoBrH,KAAKoc,oBAAsBpc,KAAKmc,UAEhE1U,EAAkB,CAAC7F,GAAOiG,aAAI,EAAJA,EAAMjG,QAC7B5B,KAAKiH,SAASO,cAAcC,gBAAgB/B,EAAO9D,GAG5D,IAAI+T,EACJ,GAAGsX,EAAS,CAKV,MAAMkB,EAAgBhmB,GAA0B,QAAfzC,EAAM9D,KACjCsE,GAED,EAAA2jB,EAAA,GAAY,CAAC3hB,IAAKimB,IAEpBnuB,KAAK4T,SAASL,UAAUqB,SAAS,gBAClC1O,EAAM0H,iBAAiB,cAAewM,EAAA,GAGxC,MAAMxW,EAAM,IAAM5D,KAAK0lB,iBAAiBrlB,GAAQ,EAAOmV,GAAWlH,MAAK,EAAEqX,qBAKvE,MAAMyI,EAAMrN,EAAMxL,mBAAqBwL,EAAMxL,kBAAkBhC,UAAUqB,SAAS,yBAA2BmM,EAAMxL,kBAAoBwL,EAGjIsN,EAAatN,EAAMnJ,cAAc,SACpCyW,GACDA,EAAW7rB,SAKb0D,EAAMyH,aAAa,cAAe,QAGlCzH,EAAM0H,iBAAiB,cAAc,KAChC5N,KAAKkc,SAAWA,GACjBhW,EAAM3B,O,IAIVvE,KAAK4N,iBAAiB,iBAAiB,KACrC1H,EAAMvD,IAAM,GACZuD,EAAMtD,MAAM,GACX,CAACqL,MAAM,IAEP,EAAAxL,YAGDyD,EAAM1B,UAAW,GAGD,QAAfkB,EAAM9D,MACPsE,EAAM6G,OAAQ,EACd7G,EAAM1B,UAAW,EACjB0B,EAAMxC,MAAO,GACLgC,EAAMmB,SAAW,KACzBX,EAAMxC,MAAO,GAIf0qB,EAAI1iB,OAAOxF,GAGX,MAAMooB,EAAiB,IAAIjJ,SAASlX,IAClCjI,EAAM0H,iBAAiB,UAAWO,EAAS,CAACF,MAAM,GAAM,IAGpDsgB,EAAe,KACD,QAAf7oB,EAAM9D,OACPsE,EAAM6jB,QAAQyE,KAAO,UACrBtoB,EAAM6jB,QAAQ0E,QAAU,IAExBpJ,QAAQqH,IAAI,CAAC4B,EAAgB3I,IAAiBrX,MAAK,KAC9CtO,KAAKkc,SAAWA,KAMJlc,KAAK0kB,YAAc,IAAI/N,EAAY,CAChDzQ,QACAzB,MAHW,EAIXmS,WAAYvP,EACZwP,yBAA2B6X,IACzB1uB,KAAK4T,SAASL,UAAU1J,OAAO,iBAAkB6kB,EAAK,EAExD5X,MAAQ5O,IACN,MAAMymB,EAAoBjb,OAAekS,eACzC,IAAI1d,GAAOymB,GAAoBA,IAAqB3uB,KAGlD,OAFAA,KAAK4uB,wBAAqB3qB,OAC1BjE,KAAK4S,QAIO5S,KAAKkd,gBAAgBoN,iBAC7B/W,UAAU1J,OAAO,SAAU3B,GACjClI,KAAK6oB,mBAAmB3gB,GACxBlI,KAAK8lB,eAAe5d,GACpBlI,KAAKgmB,uBAAuB9d,GAEzBlI,KAAKulB,iBACHrd,EAAKsd,EAAA,aAAmCxlB,KAAKulB,gBAC3CC,EAAA,WAAiCxlB,KAAKulB,iBAG1C4I,IACEjmB,GAGDlI,KAAK4uB,oBAAmB,GACxB5uB,KAAK4uB,wBAAqB3qB,EAE1B8N,EAAA,sBAA+C7L,IAE/ClG,KAAK4uB,mBAAqB7c,EAAA,iBAA0C7L,EAAOiC,G,EAIjF4O,WAAY,KAIV/W,KAAK4S,OAAO,KAGThF,iBAAiB,kBAAmBihB,IACzC7uB,KAAK4T,SAASL,UAAU1J,OAAO,qBAAsBglB,EAAK,IAG5D7uB,KAAK4N,iBAAiB,kBAAkB,KACtC5N,KAAK4T,SAASL,UAAU/Q,OAAO,sBAC/BxC,KAAK0kB,YAAYhJ,UACjB1b,KAAK0kB,iBAAczgB,CAAS,GAC3B,CAACgK,MAAM,IAEPjO,KAAKwd,WACNxd,KAAK0kB,YAAYC,cAAa,G,MAQtC,GAAGtd,EAAmB,CACpBse,EAAerX,MAAK,KACfpI,EAAM4oB,WAAa5oB,EAAM6oB,kBAE1B5S,EAAU6S,OAAOjO,GAAO,E,IAQ5B,MAAMkO,EAAgB,KACpB/oB,EAAM0H,iBAAiB,WAAW,KAEhCuO,EAAU+S,SACVhpB,EAAM+S,cAAc1F,UAAU/Q,OAAO,eAAe,GACnD,CAACyL,MAAM,GAAM,EAGlB/H,EAAM0H,iBAAiB,WAAW,KAChC,MAAMuhB,EAAUjpB,EAAMkpB,eAAiBlpB,EAAMmpB,gBACvCC,EAAiBppB,EAAM4oB,WAAa5oB,EAAM6oB,iBAG7CI,GAAWG,IACZL,IAGA9S,EAAU6S,OAAOjO,GAAO,GAGxB7a,EAAM+S,cAAc1F,UAAUxS,IAAI,gB,IAInCf,KAAK4T,SAASL,UAAUqB,SAAS,gBAClC1O,EAAM0H,iBAAiB,eAAgB7F,KACrC,EAAAqS,EAAA,GAAYrS,EAAE,IAIlBknB,G,CAqEFjvB,KAAK4hB,cAAc2N,QAAQ,CAAC3sB,KAjEf,IAAW,EAAD,gCAKrB,MAAM2L,EAAwBlH,EAAoBge,QAAQlX,UAAYqhB,EAAA,mBAAoC,CAAC9pB,UAyD3G,OAvDI2B,GACFse,EAAerX,MAAK,IAAW,EAAD,uCACjB7G,KAAmBC,KAE5ByU,EAAU6S,OAAOjO,GAAO,EAAMxS,EAElC,MAGF8W,QAAQqH,IAAI,CAACne,EAASoX,IAAiBrX,MAAK,IAAW,EAAD,gCACpD,GAAGtO,KAAKkc,SAAWA,EAEjB,YADAlc,KAAKyhB,IAAIpV,KAAK,8BAIhB,MAAM3E,SAAaD,KAAmBC,IAEtCxB,EAAM0H,iBAAiB,SAAS,MAC9B,EAAA6hB,EAAA,IAAS,CACPC,YAAa,EAAA9U,UAAY,2BAA6B,8BAGhC,IAArB1U,EAAMypB,MAAM9V,MACb7Z,KAAKyhB,IAAIkO,MAAM,SAAWzpB,EAAMypB,MAAM9V,KAAO,cAAgB3T,EAAMypB,MAAMxnB,SAG3EgU,SAAAA,EAAW+S,QAAQ,GAClB,CAACjhB,MAAM,IAEP5N,aAAkBsoB,cAEnByF,EAAI7Y,kBAAkB+U,iBAAiB5e,OAAOxF,IAG9C,EAAAglB,EAAA,IAAmBhlB,EAAOwB,GAKzBymB,IACDnuB,KAAK4uB,mBAAqB7c,EAAA,iBAA0C7L,EAAOiC,GAE3EnI,KAAK4N,iBAAiB,kBAAkB,KACnC5N,KAAK4uB,qBACN5uB,KAAK4uB,qBACL5uB,KAAK4uB,wBAAqB3qB,E,GAE3B,CAACgK,MAAM,KAGZjO,KAAK+rB,kBAAkB1rB,EAAQqH,EAAK,SAEpC6mB,GACF,MAEOhgB,CACT,KAEkC,IAIpCoH,EAAkBgY,EAAarf,KAAK1K,E,KAC/B,CACL,MAAMA,EAAM,IAAM5D,KAAK0lB,iBAAiBrlB,GAAQ,EAAOmV,GAAWlH,MAAK,EAAEqX,qBAmFvE3lB,KAAK4hB,cAAc2N,QAAQ,CAAC3sB,KA9Ef,IAAW,EAAD,gCACrB,MAAMgtB,EAAqB5C,EAAawC,EAAA,mBAAoC,CAAC9pB,UAAU8pB,EAAA,mBAAoC,CAAC9pB,QAAO2J,MAAOxH,IAEpIgoB,GAAc7C,GAActnB,EAAMyJ,MAAM2gB,QAAQC,QAAQloB,GAAUA,EAA6BuG,IACrGyhB,SAAAA,EAAYG,MAAK,CAACvb,EAAGwb,IAAMA,EAAEpoB,KAAO4M,EAAE5M,OACtC,MAAMqoB,GAA0BlD,GAAcwC,EAAA,mBAAoC,CAAC9pB,QAAO2J,MAAOwgB,aAAU,EAAVA,EAAa,KAsE9G,OApEAlK,EAAerX,MAAK,IAAW,EAAD,uCACjB7G,KAAmBC,KAC5B1H,KAAKmc,UAAUgU,cAAcP,EAGjC,MAEAvK,QAAQqH,IAAI,CAAC/G,EAAgBiK,IAAqBthB,MAAK,IAAW,EAAD,gC,MAC/D,GAAGtO,KAAKkc,SAAWA,EAEjB,YADAlc,KAAKyhB,IAAIpV,KAAK,8BAMhB,MAAM3E,SAAaD,KAAmBC,IACtC,GAAGrH,aAAkBsoB,cACnB3oB,KAAK+rB,kBAAkB1rB,EAAQqH,EAAK,OACpC1H,KAAK+rB,kBAAkBhL,EAAOrZ,EAAK,OAEhC+lB,EAAA,YACY1M,EAAMtI,iBAAiB,OAC/B1T,SAAS+oB,IACZA,EAAIva,UAAU/Q,OAAO,YAAY,QAGhC,CACL,MAAM4rB,EAAMrN,EAAMxL,mBAAqBwL,EAAMxL,kBAAkBhC,UAAUqB,SAAS,yBAA2BmM,EAAMxL,kBAAoBwL,EACjIqP,EAAY,CAAC,SAAU,OAAOrb,SAA8B,QAArB,EAAAqZ,EAAI7Y,yBAAiB,eAAEsL,SAAWuN,EAAI7Y,kBAAmC,KACtH,IAAI6a,aAAS,EAATA,EAAgCztB,OAAQ+E,EAAM,CAChD,MAAMiiB,EAAQ,IAAIC,MAClBD,EAAMpW,UAAUxS,IAAI,cAIpB,EAAAmqB,EAAA,IAAmBvB,EAAOjiB,GAAK,MAC7B,SAAQ,KACN1H,KAAK+rB,kBAAkB1rB,EAAQqH,EAAK,OAEjC0oB,IACD,SAAQ,KACNA,EAAU5tB,QAAQ,IAItB4rB,EAAI1iB,OAAOie,EAAM,GACjB,IACD,GAEHuG,SAAAA,EAAwB5hB,MAAM5G,IAC5B,MAAM2oB,EAAY,IAAIzG,MACtByG,EAAU9c,UAAUxS,IAAI,cACxB,EAAAmqB,EAAA,IAAmBmF,EAAW3oB,GAAK,MACjC,SAAQ,KACNiiB,EAAMmD,YAAYuD,EAAU,GAC5B,IACD,EAAM,G,EAMjB,MAAGpY,OAAOzS,IACRxF,KAAKyhB,IAAIkO,MAAMnqB,GACfxF,KAAKmc,UAAU6S,OAAOjO,GACtB/gB,KAAKmc,UAAUmU,WAAW,IAGrBV,CACT,KAEkC,IAGpCja,EAAkBgY,EAAarf,KAAK1K,E,CAGtC,OAAO5D,KAAK2V,gBAAkBA,EAAgBsC,OAAM,KAClDjY,KAAK4gB,yBAA2B,IAAI,IACnCzI,SAAQ,KACTnY,KAAK2V,gBAAkB,IAAI,GAE/B,G,0HEloDF,MAAM6P,EAA0B,IArPzB,MAWLzlB,cAaE,GAUM,KAAAwwB,WAAcxoB,IACpB,MAAMyoB,EAAO9c,OAAO+c,SAASD,KACvB5oB,EAAaG,EAAE2oB,MAErB,GADA1wB,KAAK2wB,OAAS3wB,KAAKyhB,IAAI,WAAY1Z,EAAG/H,KAAK4wB,gBAAiBJ,GACzDA,IAASxwB,KAAK6wB,YAGf,GAFA7wB,KAAK2wB,OAAS3wB,KAAKyhB,IAAIpV,KAAK,qBAAqBmkB,cAAiBxwB,KAAK6wB,2BAA2B7wB,KAAK8wB,kBAEpGlpB,IAAO5H,KAAK4H,IAAM5H,KAAK8wB,gBAAkB9wB,KAAK8wB,iBAAmBN,EAClExwB,KAAK+wB,aAAa/wB,KAAK8wB,oBAClB,KAAGlpB,GAAyB5H,KAAK8wB,iBAAkBN,EAMxD,OAHAxwB,KAAK6wB,YAAcL,OACnBxwB,KAAKgxB,cAAgBhxB,KAAKgxB,gBAH1BhxB,KAAK+wB,c,CAST,GAAGnpB,IAAO5H,KAAK4H,KACb5H,KAAKixB,aAEDjxB,KAAKkxB,YAAYruB,QACnB,OAIJ,MAAMG,EAAOhD,KAAKkxB,YAAY/H,MAC1BnmB,GAKJhD,KAAKmxB,QAAUnxB,KAAK4wB,gBACpB5wB,KAAKoxB,WAAWpuB,IALdhD,KAAKixB,WAKc,EAIf,KAAA/P,UAAanZ,IACnB,MAAM/E,EAAOhD,KAAKkxB,YAAYlxB,KAAKkxB,YAAYruB,OAAS,GACpDG,IACS,WAAV+E,EAAEyE,KAAqBxJ,EAAKquB,WAAWruB,EAAKquB,cAC7C,OAAYtpB,GACZ/H,KAAKsxB,KAAKtuB,EAAKpB,O,EAIX,KAAA2vB,aAAgBxpB,IACnBA,EAAEypB,QAAQ3uB,OAAS,IACtB7C,KAAK2wB,OAAS3wB,KAAKyhB,IAAI,eAEpB,OAAoB1Z,KACrB/H,KAAK4wB,iBAAkB,EAEvBld,OAAO9F,iBAAiB,YAAY,KAClClL,YAAW,KACT1C,KAAK4wB,iBAAkB,CAAK,GAC3B,IAAI,GACN,CAACa,SAAS,EAAMxjB,MAAM,K,EAhF3BjO,KAAKkxB,YAAc,GACnBlxB,KAAK4H,GAAKyV,KAAKC,MACftd,KAAKmxB,QAAS,EACdnxB,KAAKyhB,KAAM,QAAO,MAClBzhB,KAAK2wB,OAAQ,EACb3wB,KAAK6wB,YAAcnd,OAAO+c,SAASD,KACnCxwB,KAAK8wB,eAAiB,GACtB9wB,KAAK4wB,iBAAkB,EAEvBld,OAAO9F,iBAAiB,WAAY5N,KAAKuwB,YACzC7c,OAAO9F,iBAAiB,UAAW5N,KAAKkhB,UAAW,CAAClM,SAAS,EAAMyc,SAAS,IAEzE,EAAApE,iBAAkB,CACnB,MAAMqE,EAAU,CAACD,SAAS,GAC1B/d,OAAO9F,iBAAiB,aAAc5N,KAAKuxB,aAAcG,E,CAG3DC,QAAQC,kBAAoB,SAE5B5xB,KAAKixB,WACP,CAkGOF,aAAaP,EAAe,IAC9BA,GAAoB,MAAZA,EAAK,GAAYA,EAAO,IAAMA,EACxB,MAATA,IAAcA,EAAO,IAE1BxwB,KAAK6wB,cAAgBL,IAIxBxwB,KAAK8wB,eAAiB9wB,KAAK6wB,YAAcL,EACzCxwB,KAAK6xB,eACL7xB,KAAKixB,YACP,CAEQG,WAAWpuB,GACjB,MAAM8W,EAAO9W,EAAKmqB,QAAOntB,KAAKmxB,aAAiBltB,GAC/CjE,KAAK2wB,OAAS3wB,KAAKyhB,IAAI,wBAAyBze,EAAMhD,KAAKkxB,cAC/C,IAATpX,EACD9Z,KAAK8xB,SAAS9uB,GACLA,EAAK+uB,cACd,SAGF/xB,KAAKmxB,QAAS,CAChB,CAEOa,eAAepwB,GACpB,IAAI,IAAIomB,EAAIhoB,KAAKkxB,YAAYruB,OAAS,EAAGmlB,GAAK,IAAKA,EAAG,CACpD,MAAMhlB,EAAOhD,KAAKkxB,YAAYlJ,GAC9B,GAAGhlB,EAAKpB,OAASA,EACf,MAAO,CAACoB,OAAMivB,MAAOjK,E,CAG3B,CAEOsJ,KAAK1vB,GACV,GAAGA,EAAM,CACP,MAAM4mB,EAAMxoB,KAAKgyB,eAAepwB,GAChC,GAAG4mB,EAED,YADAxoB,KAAKkyB,WAAW1J,EAAIxlB,KAAMwlB,EAAIyJ,M,CAKlCN,QAAQL,MACV,CAEOY,WAAWlvB,EAAsBivB,EAAQjyB,KAAKkxB,YAAY/W,QAAQnX,IACvEhD,KAAKmxB,QAAS,EAGdnxB,KAAKkxB,YAAYiB,OAAOF,EAAO,GAC/BjyB,KAAKoxB,WAAWpuB,EAElB,CAEQovB,YAAYpvB,GAClBhD,KAAK2wB,OAAS3wB,KAAKyhB,IAAI,cAAeze,EAAMhD,KAAKkxB,aAE7CluB,EAAKqvB,WACPryB,KAAKixB,WAET,CAEOa,SAAS9uB,GACdhD,KAAKkxB,YAAY7uB,KAAKW,GACtBhD,KAAKoyB,YAAYpvB,EACnB,CAEOsvB,YAAYtvB,GACjBhD,KAAKkxB,YAAY3B,QAAQvsB,GACzBhD,KAAKoyB,YAAYpvB,EACnB,CAEOuvB,YAAYN,EAAepvB,KAAmB2vB,GACnDxyB,KAAKkxB,YAAYiB,OAAOF,EAAOpvB,KAAW2vB,GAC1CA,EAAMztB,SAAS/B,IACbhD,KAAKoyB,YAAYpvB,EAAK,GAE1B,CAEQiuB,YACNjxB,KAAK2wB,OAAS3wB,KAAKyhB,IAAI,QACvBzhB,KAAKmxB,QAAS,EACdQ,QAAQV,UAAUjxB,KAAK4H,GAAI,GAC7B,CAEOiqB,eACL7xB,KAAK2wB,OAAS3wB,KAAKyhB,IAAIpV,KAAK,WAE5B,MAAM3E,EAAM+oB,SAASgC,OAAShC,SAASiC,SAAWjC,SAASkC,OAAS3yB,KAAK8wB,eACzEa,QAAQE,aAAa7xB,KAAK4H,GAAI,GAAIF,EACpC,CAEOkrB,WAAW5vB,GACZA,IAIJ,OAAiBhD,KAAKkxB,YAAaluB,EACrC,CAEO6vB,aAAajxB,EAA8BkxB,GAAS,GACzD,IAAI,IAAI9K,EAAIhoB,KAAKkxB,YAAYruB,OAAS,EAAGmlB,GAAK,IAC/BhoB,KAAKkxB,YAAYlJ,GACtBpmB,OAASA,IACf5B,KAAKkxB,YAAYiB,OAAOnK,EAAG,IAExB8K,MAL4C9K,GAUrD,GAIF,6BAAyCxC,EACzC,S,6GCnQO,MAAMuN,EAKXhzB,YACSmY,EACAtW,EACCoxB,GAAY,EACpB3X,EACA4X,GAAY,EACLC,GAAa,EACbC,EACAC,GAPA,KAAAlb,KAAAA,EACA,KAAAtW,KAAAA,EACC,KAAAoxB,UAAAA,EAGD,KAAAE,WAAAA,EACA,KAAAC,QAAAA,EACA,KAAAC,QAAAA,EAEPpzB,KAAKqzB,KAAO,2BACZrzB,KAAKoL,UAAYC,SAASC,cAAc,OACrC+P,IAAWrb,KAAKoL,UAAUiQ,UAAYA,GAEtCnD,IACDlY,KAAKoiB,OAAS/W,SAASC,cAAc,OACrCtL,KAAKoiB,OAAO7O,UAAUxS,IAAI,sBACN,iBAAX,GACPf,KAAKoiB,OAAO1W,QAAO,QAAKwM,IAE1BlY,KAAKoL,UAAUM,OAAO1L,KAAKoiB,SAG7BpiB,KAAKoL,UAAUmI,UAAUxS,IAAI,eAAgB,gBAAkBa,GAC/D5B,KAAKoL,UAAUM,OAAO1L,KAAKqzB,MAC3BrzB,KAAKoL,UAAUG,MAAM4f,QAAU,OAE5B8H,GACD,+BAAuCjzB,KAAKqzB,KAAMF,OAASlvB,EAAWivB,EAE1E,CAEAzN,QACEzlB,KAAKoL,UAAUG,MAAM4f,QAAU,OAE5BnrB,KAAKgzB,YACNhzB,KAAKqzB,KAAKtQ,UAAY,GAE1B,CAEAuQ,YACEtzB,KAAKoL,UAAUG,MAAM4f,QAAU,EACjC,CAEAthB,SACK7J,KAAKqzB,KAAKE,kBACXvzB,KAAKszB,YAELtzB,KAAKylB,OAET,EAKa,MAAM+N,EAiBnBzzB,YACSqL,EACAqoB,EACAC,EACAC,EACAP,GAJA,KAAAhoB,UAAAA,EACA,KAAAqoB,YAAAA,EACA,KAAAC,aAAAA,EACA,KAAAC,SAAAA,EACA,KAAAP,QAAAA,EArBD,KAAAQ,SAAW,EACX,KAAAC,aAAe,EACf,KAAAC,YAAc,EAEd,KAAAC,cAA+B,KAC/B,KAAAC,cAAwB,EAExB,KAAAC,MAAQ,GAER,KAAAC,eAAiC,KAGjC,KAAAjhB,SAAW,EAWjBjT,KAAKm0B,WAAa,IAAI,KAAWn0B,KAAKoL,WACtCpL,KAAKk0B,eAAiBl0B,KAAKm0B,WAAW/oB,UACtC,IAAI,MAAM4c,KAAKhoB,KAAK0zB,aAClB1zB,KAAKk0B,eAAexoB,OAAO1L,KAAK0zB,aAAa1L,GAAsB5c,WAGlEpL,KAAK0zB,aAAaU,UACnBp0B,KAAKm0B,WAAWE,oBAAoBr0B,KAAK0zB,aAAaU,SAASf,MAGjErzB,KAAKyzB,YAAYa,SAAY5nB,IAM3B1M,KAAKi0B,MAAQvnB,EACb1M,KAAK2Q,OAAM,GACX3Q,KAAKu0B,YAAY,EAGnBv0B,KAAKm0B,WAAWK,iBAAmB,KAC7Bx0B,KAAKi0B,MAAMQ,SAEXz0B,KAAKg0B,gBACPh0B,KAAKg0B,cAAgBtgB,OAAOhR,YAAW,KACrC1C,KAAKu0B,aACLv0B,KAAKg0B,cAAgB,CAAC,GACrB,I,CAGT,CAEOrjB,MAAM+b,GAAM,GACdA,IACD1sB,KAAKyzB,YAAY/mB,MAAQ,GACzB1M,KAAKi0B,MAAQ,GACbj0B,KAAKgI,YAAS/D,EACdjE,KAAKiT,SAAW,GAGlBjT,KAAK4zB,SAAW,EAChB5zB,KAAK6zB,aAAe,EACpB7zB,KAAK8zB,YAAc,EAEnB,IAAI,MAAM9L,KAAKhoB,KAAK0zB,aAClB1zB,KAAK0zB,aAAa1L,GAAsBvC,QAG1CzlB,KAAK+zB,cAAgB,IACvB,CAEOW,YAAY1sB,EAAiBiL,EAAW,EAAGghB,EAAQ,IACxDj0B,KAAKgI,OAASA,EACdhI,KAAKiT,SAAWA,EAEbjT,KAAKi0B,QAAUA,IAChBj0B,KAAKyzB,YAAYkB,WAAWjoB,MAAQunB,GAGtCj0B,KAAKyzB,YAAYmB,MAAMC,OACzB,CAEON,aACL,GAAGv0B,KAAK+zB,cAAe,OAAO/zB,KAAK+zB,cAEnC,MAAME,EAAQj0B,KAAKi0B,MAEnB,IAAIA,EAAMQ,OAER,YADAz0B,KAAK2zB,UAAY3zB,KAAK2zB,SAAS,IAIjC,IAAwB,IAArB3zB,KAAK8zB,YAAqB9zB,KAAK6zB,aAAe7zB,KAAK8zB,WACpD,OAAOzO,QAAQlX,UAGjB,MAAM2mB,EAAQ90B,KAAK4zB,UAAY,EAE/B,OAAO5zB,KAAK+zB,cAAgB,0CAAgD,CAC1E/rB,OAAQhI,KAAKgI,OACbisB,QACA7hB,YAAa,CAACxC,EAAG,4BACjBklB,QACAC,MAAO,GACP9hB,SAAUjT,KAAKiT,WACd3E,MAAM0mB,IAGP,GAFAh1B,KAAK+zB,cAAgB,KAElB/zB,KAAKyzB,YAAY/mB,QAAUunB,EAC5B,OAKF,MAAM,MAACgB,EAAK,QAAEtD,GAAWqD,EAEtBrD,EAAQ9uB,QAAU8uB,EAAQ,GAAG1pB,MAAQjI,KAAK4zB,UAC3CjC,EAAQuD,QAGV,MAAMC,EAAcn1B,KAAK0zB,aAAaU,SAEtCzC,EAAQ5sB,SAASoD,IACf,IACE,MAAMH,EAAShI,KAAKgI,OAASG,EAAQ2F,OAAS3F,EAAQH,OACtD,qCAA6C,CAC3CA,SACAoD,UAAWpL,KAAKm0B,WAChBiB,WAAY,SACZC,WAAW,EACXltB,UACA8rB,QACAb,QAASpzB,KAAKozB,S,CAEhB,MAAM5tB,GACN4G,QAAQujB,MAAM,mCAAoCnqB,E,KAItD2vB,EAAYtrB,SAEZ7J,KAAK4zB,SAAWjC,EAAQ9uB,QAAU8uB,EAAQA,EAAQ9uB,OAAS,GAAGoF,KAErC,IAAtBjI,KAAK6zB,cACN7zB,KAAK6zB,YAAc,GAErB7zB,KAAK6zB,aAAelC,EAAQ9uB,QAEJ,IAArB7C,KAAK8zB,aACN9zB,KAAK8zB,WAAamB,EAEfE,EAAY/S,SACb,OAAe+S,EAAY/S,QAAQ,QAAK6S,EAAQ,4BAA8B,8BAA+B,CAACA,KAGhHj1B,KAAK2zB,UAAY3zB,KAAK2zB,SAAS3zB,KAAK8zB,Y,IAErC7b,OAAOzS,IACR4G,QAAQujB,MAAM,eAAgBnqB,GAC9BxF,KAAK+zB,cAAgB,IAAI,GAE7B,E,s9BCvIF,MAAMuB,GASJv1B,YACUw1B,EACAC,EACA3jB,GAFA,KAAA0jB,SAAAA,EACA,KAAAC,YAAAA,EACA,KAAA3jB,eAAAA,EA6GF,KAAA4jB,YAAc,KACpBC,EAAA,gBAA0B,CACxB1tB,OAAQhI,KAAKgI,OACbmL,UAAWnT,KAAKiI,IAChBgL,SAAUjT,KAAKw1B,YAAYprB,cAAc6I,UACzC,EAGI,KAAAJ,eAAiB,KACpB7S,KAAKw1B,YAAYG,UAAUC,aAC5B,QAAmB51B,KAAKw1B,YAAYG,UAAUE,qBAE9C,IAAI,IAAa,CACf,CAAC71B,KAAKgI,QAAS,CAAChI,KAAKiI,M,EAKnB,KAAA6tB,cAAgB,KACtB91B,KAAKw1B,YAAYG,UAAUI,gBAAgB/1B,KAAKK,OAAO,EAGjD,KAAA21B,sBAAwB,KAC9Bh2B,KAAKw1B,YAAYG,UAAUM,iBAAiB,EAGtC,KAAAvjB,cAAgB,KACnB1S,KAAKw1B,YAAYG,UAAUC,aAC5B,QAAmB51B,KAAKw1B,YAAYG,UAAUO,oBAE9C,IAAI,IAAoBl2B,KAAKgI,OAAQ,CAAChI,KAAKiI,KAAM,O,EAzInDjI,KAAKiH,SAAWuuB,EAAYvuB,SAkDzB,MAGD,EAAAkvB,GAAA,GAA0B,CACxBj0B,QAASqzB,EACTa,SArDgFruB,IAMlF,IAAI/E,EALDhD,KAAKq2B,OACNr2B,KAAKq2B,OACLr2B,KAAKq2B,KAAO,MAId,IACErzB,GAAO,EAAAie,EAAA,GAAgBlZ,EAAE1H,OAAQ,oBACxB,CAAT,MAAM0H,GAAG,CAEX,GAAI/E,EAAJ,CAGA,GADG+E,aAAauuB,YAAYvuB,EAAEwuB,iBAC3Bv2B,KAAKkC,QAAQqR,UAAUqB,SAAS,UACjC,OAAO,EAEN7M,aAAauuB,aAAYvuB,EAAEyuB,cAAe,GAEnC,MAAW,GAAD,gCAClBx2B,KAAKK,OAAS2C,EACdhD,KAAKgI,OAAShF,EAAK+mB,QAAQ/hB,OAAOyuB,WAClCz2B,KAAKiI,KAAOjF,EAAK+mB,QAAQ9hB,IACzBjI,KAAK02B,WAAalB,EAAYG,UAAUgB,cAAc32B,KAAKgI,OAAQhI,KAAKiI,WAElEod,QAAQqH,IAAI1sB,KAAK6T,QAAQiH,KAAUxE,GAAW,GAAD,gCACjD,IAAIwD,EAGFA,IADC9Z,KAAK02B,aAAepgB,EAAOsgB,kBAGrBtgB,EAAO/N,eAAe+N,EAAO/N,WAGtC+N,EAAOpU,QAAQqR,UAAU1J,OAAO,QAASiQ,EAC3C,OAEA9W,EAAKuQ,UAAUxS,IAAI,cAEnB,EAAA81B,GAAA,GAAa9uB,EAAG/H,KAAKkC,SACrB40B,GAAA,cAAkC92B,KAAKkC,SAAS,KAC9Cc,EAAKuQ,UAAU/Q,OAAO,YAAY,GAEtC,GAAC,EAED0lB,EAlCgB,CAkCb,EASDrW,kBAGN,CAEQwkB,OACNr2B,KAAK6T,QAAU,CAAC,CACdE,KAAM,UACNC,KAAM,UACNC,QAASjU,KAAK6S,eACdtK,OAAQ,IAAW,GAAD,gCAAC,OAAAvI,KAAKiH,SAAS8G,mBAAmBkI,iBAAiBjW,KAAKiH,SAAS8G,mBAAmByE,iBAAiBxS,KAAKgI,OAAQhI,KAAKiI,KAAK,KAC7I,CACD8L,KAAM,UACNC,KAAM,oCACNC,QAASjU,KAAK6S,eACdtK,OAAQ,IAAMvI,KAAK02B,aAChB12B,KAAKw1B,YAAYG,UAAUE,oBAAoBtiB,UAAUqB,SAAS,QACrEgiB,eAAe,GACd,CACD7iB,KAAM,UACNC,KAAM,uBACNC,QAASjU,KAAKy1B,YACdmB,eAAe,GACd,CACD7iB,KAAM,SACNC,KAAM,yBACNC,QAASjU,KAAK81B,eACb,CACD/hB,KAAM,SACNC,KAAM,kCACNC,QAASjU,KAAKg2B,sBACdztB,OAAQ,IAAMvI,KAAK02B,WACnBE,eAAe,GACd,CACD7iB,KAAM,gBACNC,KAAM,SACNC,QAASjU,KAAK0S,cACdnK,OAAQ,IAAW,GAAD,gCAAC,OAAAvI,KAAKiH,SAAS8G,mBAAmBqI,uBAAuBpW,KAAKiH,SAAS8G,mBAAmByE,iBAAiBxS,KAAKgI,OAAQhI,KAAKiI,KAAK,KACnJ,CACD8L,KAAM,gBACNC,KAAM,mCACNC,QAASjU,KAAK0S,cACdnK,OAAQ,IAAMvI,KAAK02B,aAAe12B,KAAKw1B,YAAYG,UAAUO,mBAAmB3iB,UAAUqB,SAAS,QACnGgiB,eAAe,IAGjB52B,KAAKkC,SAAU,OAAe,CAAC2R,QAAS7T,KAAK6T,QAAShC,eAAgB7R,KAAK6R,iBAC3E7R,KAAKkC,QAAQqR,UAAUxS,IAAI,qBAAsB,eACjDsK,SAASkR,eAAe,cAAc7Q,OAAO1L,KAAKkC,QACpD,EA8Ca,MAAM60B,GAqEnBh3B,YAAY2xB,GApEL,KAAAsF,KAAiD,CAAC,EAUjD,KAAAC,WAAa,EAEb,KAAArV,cAAgB,IAAI,IACrB,KAAAsV,YAAa,SAEb,KAAAC,eAAwF,CAAC,EACzF,KAAAC,gBAAgE,CAAC,EAGjE,KAAAC,UAA0BhS,QAAQlX,UAEjC,KAAAmpB,UAA0D,CAAC,EAC3D,KAAAC,aAAoE,CAAC,EACrE,KAAAC,OAAwD,CAAC,EACzD,KAAAC,aAAc,EACd,KAAAC,WAAY,EAEZ,KAAAjW,KAAM,EAAAC,EAAA,IAAO,gBAGb,KAAAiW,gBAOH,CAAC,EAIC,KAAAC,aAA+D,IAAIr2B,IAUnE,KAAAs2B,YAAc,EACd,KAAAC,cAAgB,EAChB,KAAAC,eAAiB,EAEjB,KAAAC,YAAc,EAiSb,KAAAC,kBAAoB,KAC1Bj4B,KAAKoL,UAAUmI,UAAUxS,IAAI,UAAU,EAGjC,KAAAm3B,gBAAkB,KACxBl4B,KAAKoL,UAAUmI,UAAU/Q,OAAO,UAAU,GAxR1C,EAAA21B,EAAA,GAAWn4B,KAAM0xB,GAEjB1xB,KAAKoL,UAAYC,SAASC,cAAc,OACxCtL,KAAKoL,UAAUmI,UAAUxS,IAAI,gBAE7Bf,KAAK6R,eAAiB,IAAI,KAC1B7R,KAAKo4B,kBAAoB,IAAI9C,GAAkBt1B,KAAKoL,UAAWpL,KAAMA,KAAK6R,gBAC1E7R,KAAK21B,UAAY,IAAI,IAAgB31B,KAAMA,KAAKiH,SAAUjH,KAAK6R,gBAE/D,MAAMwmB,EAAyBr4B,KAAKq4B,uBAAyBhtB,SAASC,cAAc,OACpF+sB,EAAuB9kB,UAAUxS,IAAI,+BAAgC,6BAA8B,UAEnG,MAAMu3B,EAAgBt4B,KAAKs4B,cAAgB,IAAI,KAAYD,GAC3DC,EAAcltB,UAAUmI,UAAUxS,IAAI,+BAEtC,MAAMw3B,EAAMv4B,KAAKu4B,IAAMltB,SAASC,cAAc,OAC9CitB,EAAIhlB,UAAUxS,IAAI,oBAAqB,uBACvCf,KAAKw4B,SAAWD,EAEhBD,EAAcltB,UAAUM,OAAO6sB,GAE/B,IAAI,MAAME,KAAYz4B,KAAK04B,UAAW,CACpC,MAAMC,EAAUttB,SAASC,cAAc,OACvCqtB,EAAQplB,UAAUxS,IAAI,4BACtB,MAAM63B,EAAOvtB,SAASC,cAAc,QAC9B0c,EAAI3c,SAASC,cAAc,KAEjCstB,EAAKltB,QAAO,QAAK+sB,EAASvgB,OAC1B0gB,EAAKltB,OAAOsc,GAEZ2Q,EAAQjtB,OAAOktB,IAEf,EAAAC,EAAA,GAAOF,GAEP34B,KAAKw4B,SAAS9sB,OAAOitB,GAErB34B,KAAK43B,aAAah0B,IAAI60B,EAAS72B,KAAM62B,GAErCA,EAASE,QAAUA,C,CAMrB,IAAIG,EAHJ94B,KAAK+4B,cAAgB1tB,SAASC,cAAc,OAC5CtL,KAAK+4B,cAAcxlB,UAAUxS,IAAI,8BAA+B,kBAG7D,MACDf,KAAKujB,cAAe,EAAAyV,EAAA,GAAe,CACjC92B,QAASlC,KAAK+4B,cACdrV,QAAS,CAACN,EAAOC,EAAOtb,KACtBqb,IAAU,EAEV,MAAM6V,EAASj5B,KAAKk5B,UAAUD,SACxBE,EAAWjgB,MAAMC,KAAKnZ,KAAKw4B,SAASW,UAC1C,IAAIpwB,EACJ,GAAGqa,EAAQ,GACT,IAAI,IAAI4E,EAAIiR,EAAS,EAAGjR,EAAImR,EAASt2B,SAAUmlB,EAC7C,IAAImR,EAASnR,GAAGzU,UAAUqB,SAAS,QAAS,CAC1C7L,EAAMif,EACN,K,OAIJ,IAAI,IAAIA,EAAIiR,EAAS,EAAGjR,GAAK,IAAKA,EAChC,IAAImR,EAASnR,GAAGzU,UAAUqB,SAAS,QAAS,CAC1C7L,EAAMif,EACN,K,MAKK/jB,IAAR8E,IACD+vB,EClZG,SAAyB1tB,GACtC,MAAMguB,EAAerxB,KACnB,EAAAqS,EAAA,GAAYrS,EAAE,EAGhB,IAAIsxB,EAAU,EACd,MAAMjpB,EAAK,OACHipB,GACJjuB,EAAUsG,oBAAoB,YAAa0nB,EAAa,CAACpkB,SAAS,G,EAOtE,OAHA5J,EAAUwC,iBAAiB,YAAawrB,EAAa,CAACpkB,SAAS,EAAMyc,SAAS,IAC9ErmB,EAAUwC,iBAAiB,WAAYwC,EAAI,CAACnC,MAAM,IAE3CmC,CACT,CDkY2BkpB,CAAgBt5B,KAAK+4B,eACpC/4B,KAAKk5B,UAAUnwB,G,EAGnBkb,kBAAoBlc,KACV,EAAAkZ,EAAA,GAAgBlZ,EAAE1H,OAAQ,mBAKxC,IAAI,MAAMo4B,KAAYz4B,KAAK04B,UAAW,CACpC,MAAMttB,EAAYC,SAASC,cAAc,OACzCF,EAAUmI,UAAUxS,IAAI,0BAA4B03B,EAAS72B,KAAM,YAEnE,MAAM+Q,EAAUtH,SAASC,cAAc,OACvCqH,EAAQY,UAAUxS,IAAI,wBAA0B03B,EAAS72B,MAEzDwJ,EAAUM,OAAOiH,GAEjB3S,KAAK+4B,cAAcrtB,OAAON,GAE1BpL,KAAKg3B,KAAKyB,EAASrmB,aAAeO,EAElC8lB,EAASc,WAAa5mB,C,CAGxB3S,KAAKoL,UAAUM,OAAO2sB,EAAwBr4B,KAAK+4B,eAInD/4B,KAAKw5B,iBAAmB,IAAI,KAAY,EAAO,YAAY,GAE3Dx5B,KAAKm0B,WAAWK,iBAAmB,KAC9Bx0B,KAAKy4B,SAASc,YAAcv5B,KAAKy5B,gBAAgBz5B,KAAKy4B,WAEvDz4B,KAAK4C,MAAK,E,EAKd5C,KAAKk5B,WAAY,EAAAQ,EAAA,GAAe15B,KAAKw4B,SAAUx4B,KAAK+4B,eAAe,CAACnxB,EAAI+xB,EAAYC,KAClF,GAAG55B,KAAKi3B,YAAcrvB,IAAO5H,KAAK65B,WAMhC,YALA75B,KAAKm0B,WAAW2F,kBAAkB,CAChC53B,QAASlC,KAAKoL,UACd2uB,SAAU,QACVC,cAAeh6B,KAAKi6B,sBAKxB,MAAMC,EAAcl6B,KAAK04B,UAAU9wB,GAChC5H,KAAKm6B,aACNn6B,KAAKm6B,YAAYD,GAGnB,MAAME,EAAep6B,KAAKy4B,SAO1B,GANAz4B,KAAKy4B,SAAWyB,GAEO,IAApBl6B,KAAKi3B,WAAoB2C,GAC1B55B,KAAKi4B,oBAGJj4B,KAAK65B,WACN75B,KAAK65B,YAAa,MACb,CACL,MAAM9Z,EAAY/f,KAAKoL,UAAU2U,UACjC,IAAIsa,EAAYr6B,KAAKm0B,WAAWkG,UAYhC,GAXGA,EAAYta,IACb/f,KAAKm0B,WAAW2F,kBAAkB,CAChC53B,QAASlC,KAAKoL,UACd2uB,SAAU,QACVC,cAAeh6B,KAAKi6B,sBAEtBI,EAAYta,GAGdqa,EAAaE,OAAS,CAACD,UAAWA,EAAWE,aAAcv6B,KAAKm0B,WAAWoG,mBAEjDt2B,IAAvBi2B,EAAYI,OAAsB,CACnC,MAAMhU,EAAOtmB,KAAKoL,UAAUsS,wBACtB8c,EAAQx6B,KAAKoL,UAAU6N,cAAcyE,wBACrC6N,EAAOjF,EAAK3J,EAAI6d,EAAM7d,EAEzB0d,EAAY9O,IACb2O,EAAYI,OAAS,CAACD,UAAW9O,EAAMgP,aAAc,G,CAIzD,GAAGL,EAAYI,OAAQ,CACrB,MAAM/O,EAAO6O,EAAaE,OAAOD,UAAYH,EAAYI,OAAOD,UAI7D9O,IAKD2O,EAAYX,WAAWhuB,MAAMkR,UAAY,cAAc8O,O,GAatC,IAApBvrB,KAAKi3B,WAAqBiD,EAAYX,WAAWhG,mBAElDvzB,KAAK4C,MAAK,GAGZ5C,KAAKi3B,UAAYrvB,CAAE,IAClB,KACD5H,KAAKm0B,WAAWsG,gBAGYx2B,IAAzBjE,KAAKy4B,SAAS6B,SACft6B,KAAKy4B,SAASc,WAAWhuB,MAAMkR,UAAY,GAC3Czc,KAAKm0B,WAAWkG,UAAYr6B,KAAKy4B,SAAS6B,OAAOD,WAGhDvB,IACDA,IACAA,OAAe70B,GAGjBjE,KAAKk4B,iBAAiB,QACrBj0B,EAAWq0B,EAAet4B,KAAK6R,iBAElC,QAAiB7R,KAAK+4B,eAAgBhxB,IACjC/H,KAAK21B,UAAUC,eAChB,EAAAxb,EAAA,GAAYrS,GACZ/H,KAAK21B,UAAUI,iBAAgB,EAAA9U,EAAA,GAAgBlZ,EAAE1H,OAAQ,sB,GAE1D,CAAC2U,SAAS,EAAMyc,SAAS,EAAO5f,eAAgB7R,KAAK6R,iBAExD,MAAM6oB,EAAe,CAAMrf,EAAmBsf,EAAyBvoB,EAAoCrK,IAAkB,GAAD,gCAC1H,MAAM1H,GAAS,EAAA4gB,EAAA,GAAgBlZ,EAAE1H,OAA0Bgb,GAC3D,IAAIhb,EAAQ,OAEZ,MAAM4H,GAAO5H,EAAO0pB,QAAQ9hB,IAC5B,IAAIA,EAEF,YADAjI,KAAKyhB,IAAIpV,KAAK,mCAAoChM,GAIpD,MAAMu6B,EAA4Bv6B,EAAOuX,cAAc,4BACvD,GAAGgjB,EAKD,YAJA,SAAoB,CAClBC,MAAO9yB,EACP6yB,iBAKJ,MAAM5yB,EAAS3H,EAAO0pB,QAAQ/hB,OAAOyuB,WAE/BqE,EAAW5hB,MAAMC,KAAKnZ,KAAKg3B,KAAK5kB,GAAaqG,iBAAiB,IAAMkiB,IAAoC7f,KAAKla,IACjH,MAAMm6B,GAAc,EAAA9Z,EAAA,GAAgBrgB,EAAIya,GACxC,MAAO,CACLnZ,QAAStB,EACTqH,KAAM8yB,EAAYhR,QAAQ9hB,IAC1BD,OAAQ+yB,EAAYhR,QAAQ/hB,OAAOyuB,WACpC,IAIG1tB,EAAM+xB,EAAQ9xB,WAAWhG,GAASA,EAAKiF,MAAQA,GAAOjF,EAAKgF,SAAWA,IAEtEG,QAAgBnI,KAAKiH,SAAS8G,mBAAmByE,iBAAiBxK,EAAQC,IAChF,IAAI,KACHsI,iBAAiBvQ,KAAKg7B,kBAAkB5oB,IACxCG,UAAUpK,EAAS2yB,EAAQ/xB,GAAK7G,QAAS,GAAG,EAAO44B,EAAQhL,MAAM,EAAG/mB,GAAM+xB,EAAQhL,MAAM/mB,EAAM,GACjG,KAEA,QAAiB/I,KAAKg3B,KAAKiE,8BAA+BP,EAAapgB,KAAK,KAAM,YAAa,YAAa,iCAAkC,CAACzI,eAAgB7R,KAAK6R,kBACpK,QAAiB7R,KAAKg3B,KAAKkE,4BAA6BR,EAAapgB,KAAK,KAAM,sBAAuB,kBAAmB,+BAAgC,CAACzI,eAAgB7R,KAAK6R,iBAchL7R,KAAKy4B,SAAWz4B,KAAK04B,UAAU,IAE/B,EAAAyC,EAAA,KAAuB,KACrBn7B,KAAK4hB,cAAczc,MAAM,IACxB,KACDnF,KAAK4hB,cAAcwZ,kBAAkB,GACpCp7B,KAAK6R,eACV,CAUOwpB,qBAAqBjH,EAAiBxyB,GAC3C,OAAO,EAAA05B,EAAA,GAA4B15B,EAAMwyB,EAAUA,EAASvxB,OAC9D,CAEQ04B,oBAAmB,QAACpzB,EAAO,YAAEgtB,IACnC,MAAMoC,EAA+B,GAC/BiE,EAAgBC,EAAA,qBAA+B,CACnDzzB,OAAQG,EAAQH,OAChBoD,UAAW+pB,EAAY9B,KACvB+B,WAAY,SACZmC,iBAGImE,EAAwBD,EAAA,wBAAkC,CAC9DpP,OAAQ,CACNzc,EAAG,SACH5H,OAAQG,EAAQH,QAElB2zB,YAAaxzB,EACbqzB,gBACAI,cAAe57B,KAAKoK,cAAc6pB,QAIpC,OADAsD,EAAal1B,KAAKq5B,GACXrW,QAAQqH,IAAI6K,GAAcjpB,KAAKutB,GAAA,EACxC,CAEcC,yBAAwB,QAAC3zB,EAAO,SAAE4zB,EAAQ,WAAE7E,I,0CACxD,MAAMxxB,GAAQ,EAAAs2B,EAAA,GAAoB7zB,GAE5BimB,EAAM/iB,SAASC,cAAc,OAInC,IAAI2wB,EAHJ7N,EAAI7a,UAAUxS,IAAI,aAIlB,MAAM8G,GAAO,EAAAq0B,EAAA,GAAgBx2B,EAAO,IAAK,KA8BzC,GA5BEu2B,EADa,UAAZv2B,EAAMkK,cACgB,QAAU,CAC/BjO,IAAK+D,EACLyC,UACAiD,UAAWgjB,EACX+N,SAAU,EACVC,UAAW,EACXxa,cAAe5hB,KAAK4hB,cACpBsV,aACAmF,aAAa,EACbC,kBAAkB,EAClBC,cAAc,EACd1O,UAAWhmB,KACTwH,YAEY,QAAU,CACxBmtB,MAAO92B,EACPyC,UACAiD,UAAWgjB,EACX+N,SAAU,EACVC,UAAW,EACXxa,cAAe5hB,KAAK4hB,cACpBsV,aACAoF,kBAAkB,EAClBG,QAAQ,EACR50B,SAIAM,EAAQzC,MAAyC+H,OAAOiH,QAAS,CACnE,MAAMkmB,QAAqB,SAAiB,CAC1C8B,eAAgB,OAChBh3B,QACAwxB,aACAhQ,MAAO,IACPI,OAAQ,IACRqV,SAAU,KAGZvO,EAAI1iB,OAAOkvB,E,CAYb,MATA,CACEqB,EAAQW,OAAOvtB,MACf4sB,EAAQW,OAAOC,MACf9M,OAAO+M,SAAS/3B,SAAS4kB,IACzBA,EAAMpW,UAAUxS,IAAI,kBAAkB,IAGxCg7B,EAAS15B,KAAK45B,EAAQ1E,aAAaloB,OAE5B,CAACnN,QAASksB,EAAKjmB,UACxB,G,CAEc40B,uBAAsB,QAAC50B,EAAO,YAAEiK,I,0CAC5C,MAAM/G,GAAW,EAAA2wB,EAAA,GAAoB7zB,GAC/B6vB,EAAah4B,KAAKg4B,YAAe,CAAC,QAAS,SAAkCjjB,SAAS1J,EAASzJ,MAE/FwsB,QAAY,QAAa,CAC7BjmB,UACA60B,UAAWhF,EACXiF,WAAY,IACZC,cAAc,EACdlF,aACA5tB,cAAepK,KAAKg7B,kBAAkB5oB,GACtCwP,cAAe5hB,KAAK4hB,cACpBub,iBAAkB,EAClBC,QAAS,IAAM,MAOjB,MAJI,CAAC,QAAS,QAAS,SAAkCroB,SAAS1J,EAASzJ,OACzEwsB,EAAI7a,UAAUxS,IAAI,YAGb,CAACoH,UAASjG,QAASksB,EAC5B,G,CAEciP,kBAAiB,QAACl1B,EAAO,SAAE4zB,EAAQ,WAAE7E,I,gDACjD,IAAIoG,EAA6D,QAAlD,EAAAn1B,EAAQzC,aAA0C,eAAE63B,QAEnE,IAAID,EAAS,CACX,MAAME,EAASr1B,EAAQmN,cAAgBnN,EAAQmN,cAAc5U,MAAMqH,GAAmB,qBAARA,EAAE6H,GAAoC,yBAAR7H,EAAE6H,IAAgC,KAC9I,IAAIlI,EAAa+1B,EAAqBC,EAEtC,GAAIF,EAQFE,EAASv1B,EAAQA,QAAQ2nB,MAAM0N,EAAOG,OAAQH,EAAOG,OAASH,EAAO36B,YAR3D,CACV,MAAM0C,GAAQ,EAAAq4B,EAAA,GAASz1B,EAAQA,SAC/B,IAAI5C,EACF,OAGFmC,EAAMnC,EAAM,E,CAMZmC,EADe,0BAAd81B,aAAM,EAANA,EAAQ5tB,GACH4tB,EAAO91B,IAGPA,GAAOg2B,EAGfD,EAAc/1B,EAEd,MAAMm2B,EAAO11B,EAAQA,UAAYT,EAC7BA,EAAInC,MAAM,4BACZk4B,EAAc,WAAa/1B,EAC3BA,EAAMA,EAAIqN,SAAS,KAAOrN,EAAM,WAAaA,GAG/C+1B,EAAc,IAAIK,IAAIL,GAAaM,SAEnCT,EAAU,CACR1tB,EAAG,UACHlI,MACA+1B,cACA71B,GAAI,GACJ4oB,KAAM,GAGJqN,IACFP,EAAQU,YAAc71B,EAAQA,Q,CAIlC,GAAiB,iBAAdm1B,EAAQ1tB,EACT,OAGF,MAAMquB,EAAa5yB,SAASC,cAAc,OAC1C2yB,EAAW1qB,UAAUxS,IAAI,WAItBu8B,EAAQd,OACG,QAAU,CACpBpxB,UAAW6yB,EACX91B,QAAS,KACTq0B,MAAOc,EAAQd,MACfL,SAAU,EACVC,UAAW,EACXE,kBAAkB,EAClB1a,cAAe5hB,KAAK4hB,cACpBsV,aACArvB,MAAM,EAAAq0B,EAAA,GAAgBoB,EAAQd,MAAsB,GAAI,IAAI,GAC5DjF,aAAcwE,EACdU,QAAQ,KAGVwB,EAAW1qB,UAAUxS,IAAI,UACzB,EAAAm9B,EAAA,GAAaD,GAAY,EAAAE,EAAA,GAAiBb,EAAQvuB,OAASuuB,EAAQG,aAAeH,EAAQU,aAAeV,EAAQ51B,KAAK,KAGxH,MAAMqH,GAAQ,OAAiBuuB,GAEzBc,GAAmB,OAAuBd,GAE1C7oB,GADY,EAAA4pB,EAAA,IAAuB,EAAAC,EAAA,IAAahB,EAAQ51B,KAAO,KACjD6N,kBACpB,GAAGd,aAAaE,kBACd,IACEF,EAAE8pB,UAAYC,mBAAmB/pB,EAAEgqB,K,CACnC,MAAMj5B,G,CAKP44B,EAAiBM,YAClBN,EAAiB1yB,OAAO,MAG1B0yB,EAAiB1yB,OAAO+I,GAErBzU,KAAKg4B,YACNoG,EAAiB1yB,OAAO,WAAY,OAAiBvD,IAGnD4G,EAAM6J,aAER7J,EAAMrD,QAAO,EAAAizB,EAAA,GAAcrB,EAAQG,YAAY1V,MAAM,IAAK,GAAG,KAG/D,MAAM6W,EAAM,IAAI,KAAI,CAClB7vB,QACA8vB,YAAY,OAAa12B,GACzB22B,SAAUV,EACVW,aAAa,EACb9L,WAAW,EACX1Q,UAAU,IAKZ,OAFAqc,EAAII,kBAAkBf,EAAY,OAE/BW,EAAIxzB,UAAUmzB,UAAU9J,OAAO5xB,OACzB,CAACsF,UAASjG,QAAS08B,EAAIxzB,gBADhC,C,IAKW6zB,oBAAoB7K,EAAiBqE,EAA+B/sB,GAAS,G,0CACxF,MAAMwzB,EAAwD,GACxDC,EAA8B1G,EAASc,WACvCwC,EAA2B,GAC3B7E,EAAal3B,KAAKk3B,WAAWj0B,MACnC,IAIIkyB,EAJA/iB,EAAcqmB,EAASrmB,kBAErB,UAGa,kCAAhBA,GAAqDpS,KAAKoK,cAAc6pB,MAAMQ,QAC/EriB,EAAc,2BACd+iB,EAAcn1B,KAAKw5B,iBACnB2F,EAAezzB,OAAOypB,EAAY/pB,YACV,6BAAhBgH,IACR+iB,EAAcn1B,KAAK0zB,aAAaU,UAGlC,MAAM1C,EAAoC,CACxCwN,gBACA9sB,cACAjK,aAASlE,EACTizB,aACA6E,WACA5G,eAGF,IAAIiK,EAGJ,OAAOhtB,GACL,IAAK,2BACHgtB,EAAkBp/B,KAAKu7B,mBACvB,MAGF,IAAK,gCACH6D,EAAkBp/B,KAAK87B,wBACvB,MAGF,IAAK,2BACL,IAAK,gCACL,IAAK,2BACL,IAAK,8BACHsD,EAAkBp/B,KAAK+8B,sBACvB,MAGF,IAAK,yBACHqC,EAAkBp/B,KAAKq9B,iBAS3B,GAAG+B,EAAiB,CAClBA,EAAkBA,EAAgB9kB,KAAKta,MAGvC,MAAMq/B,EAA8BjL,EAAStZ,KAAU3S,GAAY,GAAD,gCAChE,IAEE,OADAupB,EAAQvpB,QAAUA,QACLi3B,EAAgB1N,E,CAC7B,MAAMlsB,GACNxF,KAAKyhB,IAAIkO,MAAM,yBAA0Bvd,EAAasf,EAASvpB,EAAS3C,E,CAE5E,MAEM85B,SAAiBja,QAAQqH,IAAI2S,IAAUtP,OAAO+M,SACpDoC,EAAc78B,QAAQi9B,E,CAWxB,GARGnK,GAAeA,EAAY9B,KAAKE,mBACjC4B,EAAY7B,YAGXtzB,KAAKq3B,WACN0E,EAAS15B,KAAKrC,KAAKq3B,YAGlB0E,EAASl5B,eACJwiB,QAAQqH,IAAIqP,GACd7E,KAFN,CAQA,GAAGgI,EAAcr8B,OAAQ,CACvB,MAAM08B,EAAS7zB,EAAS,SAAW,UACnCwzB,EAAcn6B,SAASsB,I,MACrB,MAAM,QAACnE,EAAO,QAAEiG,GAAW9B,EAKrBm5B,EAAiBx/B,KAAKy/B,6BAA6Bz/B,KAAK83B,aAAe3vB,EAAQqO,KAAO,EAAGpE,GAC/FlQ,EAAQqR,UAAUxS,IAAI,qBACtBmB,EAAQ6nB,QAAQ9hB,IAAM,GAAKE,EAAQF,IACnC/F,EAAQ6nB,QAAQ/hB,OAAS,GAAKG,EAAQH,OACtCw3B,EAAehN,MAAM+M,GAAQr9B,IAEZ,QAAd,EAAAlC,KAAK21B,iBAAS,eAAEC,cACjB51B,KAAK21B,UAAU+J,sBAAsBx9B,GAAS,E,IAMpDlC,KAAK2/B,gBAAgC,6BAAhBvtB,EAA6C,EAAI8sB,EAAcr8B,OAAQs8B,E,CAE9F,G,CAEQQ,gBAAgB98B,EAAgB02B,GACtC,GAAGA,EAAY,CACb,MAAMqG,EAASrG,EAAWtgB,cAO1B,GANAC,MAAMC,KAAKymB,EAAOzG,UAAUrJ,MAAM,GAAG/qB,SAAS86B,IAC5CA,EAAMr9B,QAAQ,KAKZK,IAAW02B,EAAWhG,kBAAmB,CAC3C,MAAMnF,EAAM/iB,SAASC,cAAc,OACnC8iB,EAAImQ,UAAY,kCAChBnQ,EAAI7a,UAAUxS,IAAI,kBAAmB,cAAe,gBAAiB,aAErE6+B,EAAOl0B,OAAO0iB,E,EAGpB,CAEQ0R,YACN,MAAMC,EAA+B,IAAI3+B,IACnC81B,EAAal3B,KAAKk3B,WAAWj0B,MAEnC,IAAI,MAAM+kB,KAAKhoB,KAAK0zB,aAAc,CAChC,MAAMpzB,EAAQN,KAAK0zB,aAAa1L,GAChChoB,KAAKg3B,KAAKgJ,yBAAyBt0B,OAAOpL,EAAM8K,WAChD9K,EAAMmlB,O,CAGR,MAAMwO,EAAQj0B,KAAKoK,cAAc6pB,MACjC,GAAGA,EAAO,CACR,MAAMgM,EAAa,CAACZ,EAAmB/+B,EAAoB4/B,GAAmB,KAC5Eb,EAAQvkB,KAAK9S,IACX,GAAG+3B,EAAgB18B,IAAI2E,GACrB,OAGF+3B,EAAgBh/B,IAAIiH,GAEpB,MAAM,IAACm4B,GAAO1E,EAAA,qBAA+B,CAC3CzzB,OAAQA,EACRoD,UAAW9K,EAAM+yB,KACjB+B,WAAY,aACZlC,WAAY5yB,EAAM4yB,aAGpB,MAAO,CAACiN,MAAKn4B,SAAO,IACnB+nB,OAAO+M,SAAS/3B,SAAQ,EAAOo7B,MAAKn4B,YAAY,GAAD,gCAChD,MAAMo4B,QAAapgC,KAAKiH,SAASqI,gBAAgB+wB,QAAQr4B,GACzD,GAAGk4B,IAAsBE,EAAsBE,oBAAuBF,EAAaG,cAAe,CAChG,MAAMC,EAAS,IAAIC,OAAO,KAAI,EAAAC,EAAA,GAAazM,OAAU,EAAAyM,EAAA,IAAa,EAAAC,EAAA,IAAgB1M,OAAY,MAC9FkM,EAAIS,UAAU7d,UAAYod,EAAIS,UAAU7d,UAAUsH,QAAQmW,EAAQ,aAClEL,EAAIU,gBAAgBn1B,aAAa,EAAAo1B,EAAA,GAAqB94B,EAAO+4B,Y,MACxD,GAAG/4B,IAAWwZ,EAAA,OACnB2e,EAAIU,gBAAgBn1B,QAAO,QAAK,0BAC3B,CACL,IAAIs1B,QAAiBhhC,KAAKiH,SAASqI,gBAAgB2xB,gBAAgBj5B,GACnE,GAAIg5B,EAMFA,EAAW,IAAMA,MANL,CACZ,MAAME,QAAalhC,KAAKiH,SAASk6B,gBAAgBC,QAAQp5B,GACtDk5B,GAAQA,EAAKG,QACdL,EAAW,KAAM,EAAAM,EAAA,GAAkBJ,EAAKG,OAAOE,U,CAMnDpB,EAAIU,gBAAgBjoB,YAAcooB,C,CAEtC,MAEA1gC,EAAMuJ,QAAQ,EAGV23B,EAAaC,IACjB,GAAIvK,IAMJ,OAAOuK,CAAG,EAGZ,OAAOpc,QAAQqH,IAAI,CACjB1sB,KAAKiH,SAASk6B,gBAAgBO,mBAAmBzN,GAAO,OAAMhwB,EAAW,IACxEqK,KAAKkzB,GACLlzB,MAAMqzB,IACFA,GACD1B,EAAW0B,EAAU3hC,KAAK0zB,aAAaiO,UAAU,E,IAIrD3hC,KAAKiH,SAASk6B,gBAAgBS,eAAe3N,EAAO,IACnD3lB,KAAKkzB,GACLlzB,MAAMqzB,IACL,GAAGA,IACD1B,EAAW0B,EAASE,WAAY7hC,KAAK0zB,aAAaiO,UAAU,GAC5D1B,EAAW0B,EAAStC,QAA4Er/B,KAAK0zB,aAAaoO,gBAElH9hC,KAAK0zB,aAAaoO,eAAe12B,UAAUmI,UAAUxS,IAAI,YAEtDf,KAAK0zB,aAAaoO,eAAe1f,OAAOkI,mBAAqBtqB,KAAK0zB,aAAaoO,eAAe1f,OAAO7M,mBACtGvV,KAAK0zB,aAAaoO,eAAe1f,OAAOkI,iBAAiB9nB,SAGxDxC,KAAK0zB,aAAaoO,eAAezO,KAAKE,kBAAoB,GAAG,CAC9D,MAAMwO,EAAW12B,SAASC,cAAc,OACxCy2B,EAASxuB,UAAUxS,IAAI,2BACvB,MAAMihC,EAAc,IAAI,iBAAiB,CACvCx1B,IAAK,uBAEPu1B,EAASr2B,OAAOs2B,EAAY9/B,SAC5BlC,KAAK0zB,aAAaoO,eAAe1f,OAAO1W,OAAOq2B,IAC/C,QAAiBA,GAAU,KACzB,MAAME,EAAUjiC,KAAK0zB,aAAaoO,eAAe12B,UAAUmI,UAAU1J,OAAO,YAC5Em4B,EAAYx1B,IAAMy1B,EAAU,qBAAuB,qBACnDD,EAAYE,QAAQ,G,KAM5BliC,KAAKiH,SAASk7B,eAAeC,WAAW,CAACnO,QAAOoO,YAAa,EAAGtN,MAAO,GAAIuN,SAAU,IACpFh0B,KAAKkzB,GACLlzB,MAAM5B,IACFA,GACDuzB,EAAWvzB,EAAM61B,QAAQznB,KAAK4P,GAAMA,EAAE1iB,SAAShI,KAAK0zB,aAAaiO,UAAU,E,MAI5E,GAAI3hC,KAAKoK,cAAcpC,QAAWhI,KAAKoK,cAAco4B,QA2DrD,OAAOnd,QAAQlX,UA3D+C,CACnE,MAAMs0B,EAAqB,CAACnP,GAAY,IAC/B,gBAA2BhlB,MAAMoiB,IAClCwG,MAIJl3B,KAAK0zB,aAAagP,OAAOrP,KAAKsP,kBAE9BjS,EAAMkS,aAAa9S,MAAM,EAAG,IAAI/qB,SAAciD,GAAW,GAAD,gCACtD,MAAM,IAACm4B,GAAO1E,EAAA,qBAA+B,CAC3CzzB,OAAQA,EACRoD,UAAWpL,KAAK0zB,aAAagP,OAAOrP,KACpCgC,WAAW,EACXD,WAAY,aACZlC,YAAY,IAGdiN,EAAIU,gBAAgBn1B,aAAc1D,EAAO66B,UACvC,EAAAC,GAAA,SAA0B9iC,KAAKiH,SAASk6B,gBAAgBC,QAAQp5B,EAAO+6B,cACvE,EAAAjC,EAAA,GAAqB94B,EAAO+4B,YAChC,MAEIrQ,EAAMkS,aAAa//B,OAEbywB,GACRtzB,KAAK0zB,aAAagP,OAAOpP,YAFzBtzB,KAAK0zB,aAAagP,OAAOjd,Q,IAO/B,OAAOJ,QAAQqH,IAAI,CACjB1sB,KAAKiH,SAASk6B,gBAAgB6B,YAAY,kBAAkB10B,MAAM20B,IAChE,IAAI/L,IAAc,OAElB,MAAMnuB,EAAMk6B,EAAMj6B,WAAWo3B,GAASA,EAAKx4B,KAAO4Z,EAAA,UACtC,IAATzY,IACDk6B,EAAQA,EAAMnT,SACRqC,OAAOppB,EAAK,GAGpBk6B,EAAMl+B,SAASq7B,IACb,MAAM,IAACD,GAAO1E,EAAA,qBAA+B,CAC3CzzB,OAAQo4B,EAAKx4B,GACbwD,UAAWpL,KAAK0zB,aAAawP,OAAO7P,KACpC5jB,eAAe,EACf2lB,WAAY,SACZlC,YAAY,EACZE,QAASpzB,KAAK0zB,aAAawP,OAAO9P,UAGpC+M,EAAIgD,WAAW3gC,QAAQ,IAGzBxC,KAAK0zB,aAAawP,OAAOr5B,QAAQ,IAGnC44B,K,CAGN,CAEcW,YAAY3K,G,0CACxB,MAAM7wB,EAAK5H,KAAKoK,cAAcpC,OAAO+4B,WAC/B7J,EAAal3B,KAAKk3B,WAAWj0B,MACnC,IAAIsL,EAEJ,MAAM80B,EAA2B9C,GAA2D,GAAD,gCACzF,GAAGvgC,KAAKq3B,kBACAr3B,KAAKq3B,WAEPH,KACF,OAIJ,IAAIoM,EAActjC,KAAKsjC,YACnBA,IACFA,EAAc,IAAI,IAAe,CAC/B1hB,cAAe5hB,KAAK4hB,cACpB2hB,eAAe,EACft8B,SAAUjH,KAAKiH,YAEjB,QAAiBq8B,EAAYjQ,MAAOtrB,IAClC,MAAMy7B,GAAK,EAAAC,EAAA,GAAU17B,EAAE1H,OAAQ,EAAAqjC,yBAC/B,IAAIF,EACF,OAGF,MAAMx7B,EAASw7B,EAAGzZ,QAAQ/hB,OAAOyuB,WACjC,IAAIloB,EAAwB8W,QAAQlX,UACjCsf,EAAA,aACDlf,EAAU,oBAA8B,IAG1CA,EAAQD,MAAK,KACXonB,EAAA,gBAA0B,CAAC1tB,UAAQ,GACnC,IAEJywB,EAASc,WAAW7tB,OAAO43B,EAAYjQ,MACvCrzB,KAAK2/B,gBAAgB,EAAGlH,EAASc,aAGnC,IAAI,MAAMoK,KAAepD,EAAc,CACrC,MAAMv4B,GAAS,EAAA47B,GAAA,GAAqBD,GACpC,GAAG37B,EAAO67B,YACR,SAGF,MAAM3C,QAAalhC,KAAKiH,SAASk6B,gBAAgBC,QAAQp5B,GACzD,IAAIkvB,IACF,OAGCgK,EAAKzzB,OAAOq2B,SAIfR,EAAYviC,IAAIiH,E,CAEpB,IAEA,SAAShI,KAAKiH,SAAS88B,gBAAgBC,UAAUp8B,GAAK,CACpD,MAAMq8B,EAAcjkC,KAAKsjC,YAAmB,IAAL,GACvC/0B,EAAUvO,KAAKiH,SAASi9B,kBAAkBC,uBAAuBv8B,OAAI3D,EAAWggC,EAAYjkC,KAAKs3B,UAAUmB,EAASrmB,cAAc9D,MAAMiyB,IACtI,IAAIrJ,IACF,OAGF,MAAM7D,EAAOoF,EAASc,WAAWhkB,kBAOjC,OANAvV,KAAKs3B,UAAUmB,EAASrmB,cAAgBihB,EAAOA,EAAKE,kBAAoB,GAAKgN,EAAaA,aAAa19B,OAEpG09B,EAAaA,aAAa19B,OAASohC,IACpCjkC,KAAKw3B,OAAOiB,EAASrmB,cAAe,GAG/BixB,EAAmB9C,EAAaA,aAAa,G,MAGtDhyB,EAAUvO,KAAKiH,SAASi9B,kBAAkBE,YAAYx8B,GAAI0G,MAAM+1B,IAC9D,IAAInN,IACF,OAIFl3B,KAAKw3B,OAAOiB,EAASrmB,cAAe,EACpC,MAAMmuB,EAAgB8D,EAA+B9D,aACrD,MAAsB,8BAAnBA,EAAa3wB,EAITyzB,EAAmB9C,EAAaA,mBAJvC,CAIoD,IAIxD,OAAOvgC,KAAKu3B,aAAakB,EAASrmB,aAAe7D,EAAQ4J,SAAQ,KAC3D+e,MAIJl3B,KAAKu3B,aAAakB,EAASrmB,aAAe,KAAI,GAElD,G,CAEQkyB,SAAS7L,EAA+B8L,EAAmB3zB,EAAmBsmB,G,QACpF,MAAMt1B,EAAO62B,EAASrmB,YAEtB,GAAGpS,KAAKu3B,aAAa31B,GACnB,OAAO5B,KAAKu3B,aAAa31B,GAG3B,GAAqB,YAAlB62B,EAAS72B,KACV,OAAO5B,KAAKojC,YAAY3K,GAG1B,MAAM9G,EAAkC,QAA3B,KAAG3xB,KAAKm3B,gBAAev1B,UAAI,UAAJA,GAAU,GAE9C,KAAY,6BAATA,GAAwC+vB,EAAQ9uB,SAC7C7C,KAAKy3B,cACPz3B,KAAK8/B,YACL9/B,KAAKy3B,aAAc,GAGjBz3B,KAAKoK,cAAc6pB,MAAMQ,QAAWz0B,KAAKoK,cAAcpC,QAAWhI,KAAKoK,cAAco4B,UAEvF,OADAxiC,KAAKw3B,OAAO51B,IAAQ,EACbyjB,QAAQlX,UAInB,MAAMI,EAAUvO,KAAKu3B,aAAa31B,GAAQyjB,QAAQlX,UAAUG,MAAK,IAAW,GAAD,gC,QAEzE,GAAGqjB,EAAQ9uB,QAAU7C,KAAKo3B,gBAAgBx1B,GAAQ+vB,EAAQ9uB,SAAW0hC,EAAU,CAC7E,MAAMnQ,EAAkB,GACxB,IAAIoQ,EAAOh+B,KAAKC,IAAI,EAAGzG,KAAKo3B,gBAAgBx1B,IACxC6iC,EAAe,EAEnB,EAAG,CACD,MAAMC,EAAM/S,EAAQ7B,MAAM0U,EAAMA,EAAO5zB,GACvC4zB,GAAQE,EAAI7hC,OACZ4hC,GAAgBC,EAAI7hC,OAEpB,MAAM8hC,QAA4Btf,QAAQqH,IAAIgY,EAAI5pB,KAAK8pB,GAAM5kC,KAAKiH,SAAS8G,mBAAmByE,iBAAiBoyB,EAAE58B,OAAQ48B,EAAE38B,QAE3HmsB,EAAS/xB,QAAQrC,KAAKq7B,qBAAqBsJ,EAAqB/iC,G,OAC1D6iC,EAAe7zB,GAAa4zB,EAAO7S,EAAQ9uB,QAWnD,OAFA7C,KAAKo3B,gBAAgBx1B,GAAQ4iC,EAEtBxkC,KAAKi/B,oBAAoB7K,EAAUqE,GAAUtgB,SAAQ,KAC1DzV,YAAW,KACT1C,KAAKm0B,WAAW0Q,kBAAkB,GACjC,EAAE,G,CAKT,MAAM/P,EAAQnD,EAAQ9uB,OAAS8uB,EAAQA,EAAQ9uB,OAAS,GAAGoF,IAAM,EAE3DyE,QAAc1M,KAAKiH,SAAS8G,mBAAmB+2B,UAAU,OAAD,wBACzD9kC,KAAKoK,eAAa,CACrBgI,YAAa,CAACxC,EAAGhO,GACjBkzB,QACAC,MAAOnkB,EACPm0B,SAA6B,QAArB,KAAE/kC,KAAKs3B,WAAU11B,UAAI,UAAJA,GAAU,KAKrC,GAFA+vB,EAAQtvB,QAAQqK,EAAMilB,QAAQ7W,KAAK8pB,IAAM,CAAE38B,IAAK28B,EAAE38B,IAAKD,OAAQ48B,EAAE58B,YAE7DkvB,OAMDxqB,EAAMilB,QAAQ9uB,OAAS+N,QAA8C3M,IAAhCjE,KAAKoK,cAAc+G,WAA2BzE,EAAMs4B,WAAct4B,EAAMilB,QAAQ9uB,SAAW6J,EAAMuoB,SAGvIj1B,KAAKw3B,OAAO51B,IAAQ,GAGtB5B,KAAKs3B,UAAU11B,GAAQ8K,EAAMs4B,WAE1BT,GA4BH,OAxBAvkC,KAAKo3B,gBAAgBx1B,GAAQ+vB,EAAQ9uB,OAEjC7C,KAAKw3B,OAAO51B,IACd2M,EAAQD,MAAK,KACX5L,YAAW,KACT,GAAIw0B,KAEDl3B,KAAKy4B,WAAaA,EAAU,CAC7B,MAAMlqB,EAAUvO,KAAK4C,MAAK,GAAM,GAC7B2L,GACDA,EAAQD,MAAK,KACP4oB,KAEJx0B,YAAW,KACT1C,KAAKm0B,WAAW0Q,kBAAkB,GACjC,EAAE,G,IAIV,EAAE,IAKF7kC,KAAKi/B,oBAAoBj/B,KAAKq7B,qBAAqB3uB,EAAMilB,QAAS/vB,GAAO62B,EAElF,MAAGxgB,OAAOzS,IACRxF,KAAKyhB,IAAIkO,MAAM,cAAenqB,EAAI,IACjC2S,SAAQ,KACTnY,KAAKu3B,aAAa31B,GAAQ,IAAI,IAGhC,OAAO2M,CACT,CAEQkrB,gBAAgBhB,GACtB,MAAMrmB,EAAcqmB,EAASrmB,YAC7B,OAAQpS,KAAKw3B,OAAOplB,IAAiBpS,KAAKm3B,eAAe/kB,IAAgBpS,KAAKo3B,gBAAgBhlB,GAAepS,KAAKm3B,eAAe/kB,GAAavP,MAChJ,CAEcoiC,gB,0CACZ,MAAM/N,EAAal3B,KAAKk3B,WAAWj0B,OAC7B,OAAC+E,EAAM,SAAEiL,GAAYjT,KAAKoK,cAChC,IAAIpK,KAAK+3B,cACP,OAGF,MAAMW,EAAY14B,KAAK04B,UAAU3I,QAAQ0I,GAAsC,6BAAzBA,EAASrmB,cACzD8yB,EAAUxM,EAAU5d,KAAK2d,IAAa,CAAE7oB,EAAG6oB,EAASrmB,iBAEnD+yB,EAAUC,SAAwB/f,QAAQqH,IAAI,CACnD1sB,KAAKiH,SAAS8G,mBAAmBs3B,kBAAkBr9B,EAAQk9B,OAASjhC,EAAWgP,GAC/EjT,KAAKolC,mBAGP,IAAIlO,IACF,OAGF,GAAGl3B,KAAKq3B,kBACAr3B,KAAKq3B,WAEPH,KACF,OAIJ,IAAIoO,EACArQ,EAAQ,EACZyD,EAAU3zB,SAAS0zB,IACjB,MAAM8M,EAAUJ,EAASzkC,MAAM8kC,GAAMA,EAAEzV,OAAOngB,IAAM6oB,EAASrmB,cAE7DqmB,EAASE,QAAQplB,UAAU1J,OAAO,QAAS07B,EAAQtQ,OACnDwD,EAASE,QAAQplB,UAAU/Q,OAAO,UAG/B+iC,EAAQtQ,aACYhxB,IAAlBqhC,IACDA,EAAgB7M,KAGhBxD,E,IAIN,MAAMwQ,EAAazlC,KAAK43B,aAAa30B,IAAI,WACzCwiC,EAAW9M,QAAQplB,UAAU1J,OAAO,QAASu7B,GAE1CA,IACDE,EAAgBG,IACdxQ,GAGJj1B,KAAKoL,UAAUmI,UAAU1J,OAAO,QAASy7B,GACzCtlC,KAAKoL,UAAU6N,cAAc1F,UAAU1J,OAAO,gBAAiBy7B,GAC5DA,IACDtlC,KAAK65B,YAAa,EAClB75B,KAAKk5B,UAAUl5B,KAAK04B,UAAUve,QAAQmrB,IAAgB,GAGtDtlC,KAAKq4B,uBAAuB9kB,UAAU1J,OAAO,OAAQorB,GAAS,GAElE,G,CAEaryB,KAAKkwB,GAAS,EAAOyR,GAAW,G,gDAC3C,MAAMv8B,EAAShI,KAAKoK,cAAcpC,OAClChI,KAAKyhB,IAAI,OAAQqR,EAAQ9qB,EAAQhI,KAAKu3B,cACtC,MAAML,EAAal3B,KAAKk3B,WAAWj0B,MAEnC,GAAGjD,KAAK03B,UAAW,CAEjB,SADgC,QAA1B,EAAC13B,KAAK0lC,4BAAoB,QAAzB1lC,KAAK0lC,qBAAyB1lC,KAAKilC,iBACtC/N,IACF,OAGFl3B,KAAK0lC,0BAAuBzhC,EAC5BjE,KAAK03B,WAAY,C,CAGnB,IAAIiO,EAAS7S,EAAS,CAAC9yB,KAAKy4B,UAAYz4B,KAAK04B,UAAU3I,QAAQ6V,GAAMA,IAAM5lC,KAAKy4B,WAShF,GARAkN,EAASA,EAAO5V,QAAQ0I,GACfz4B,KAAKy5B,gBAAgBhB,KAG3BzwB,EAAO66B,WACR,EAAAgD,EAAA,GAAcF,GAASlN,GAA+B,YAAlBA,EAAS72B,QAG3C+jC,EAAO9iC,OACT,OAGF,MAAM+N,EAAY2zB,EAAW,GAAK/9B,KAAKmD,MAAsC,GAA/B0V,EAAA,SAAoB,IAAM,GAAS,MAE3E0c,EAA2B4J,EAAO7qB,KAAK2d,GACpCz4B,KAAKskC,SAAS7L,EAAU8L,EAAU3zB,EAAWsmB,KAGtD,OAAO7R,QAAQqH,IAAIqP,GAAU9jB,OAAOzS,IAClCxF,KAAKyhB,IAAIkO,MAAM,2BAA4BnqB,EAAI,G,IAI3Ci6B,6BAA6BvT,EAAmBtqB,G,MACtD,MAAM4U,EAAO,IAAI6G,KAAiB,IAAZ6O,GACtB1V,EAAKsvB,SAAS,EAAG,EAAG,GACpBtvB,EAAKuvB,QAAQ,GACb,MAAMC,EAAgBxvB,EAAKyvB,UACrBC,EAAuC,QAA1B,EAAAlmC,KAAK23B,gBAAgB/1B,UAAK,QAAK5B,KAAK23B,gBAAgB/1B,GAAQ,CAAC,EAChF,KAAKokC,KAAiBE,GAAa,CACjC,MAAM96B,EAAYC,SAASC,cAAc,OACzCF,EAAUiQ,UAAY,qBAEtB,MAAMnD,EAAO7M,SAASC,cAAc,OACpC4M,EAAK3E,UAAUxS,IAAI,2BAEnB,MAAM2wB,EAAsC,CAC1CyU,MAAO,QAGN3vB,EAAK4vB,iBAAkB,IAAI/oB,MAAO+oB,gBACnC1U,EAAQ2U,KAAO,WAGjB,MAAMC,EAAc,IAAI,qBAAqB,CAC3C9vB,OACAkb,YACCxvB,QACHgW,EAAKxM,OAAO46B,GAEZl7B,EAAUM,OAAOwM,GAEjB,MAAMsa,EAAQnnB,SAASC,cAAc,OACrCknB,EAAMjf,UAAUxS,IAAI,4BAEpBqK,EAAUM,OAAOwM,EAAMsa,GAEvB,MAAM+T,GAAiB,EAAAC,EAAA,GAAqBN,EAAY,QACxD,IAAIle,EAAI,EACR,KAAMA,EAAIue,EAAe1jC,UAEpBmjC,EADOO,EAAeve,MADQA,GAOnCke,EAAWF,GAAiB,CAAC56B,YAAWonB,UACxC,EAAAiU,EAAA,GAAuBr7B,EAAWpL,KAAKg3B,KAAKp1B,GAAOomB,E,CAGrD,OAAOke,EAAWF,EACpB,CAEOZ,iBACL,MAAM,OAACp9B,GAAUhI,KAAKoK,cAEtB,IADkBpC,EAAO67B,YACV,OAAOxe,QAAQlX,SAAQ,GACtC,MAAMu4B,EAAS1+B,EAAO+4B,WACtB,OAAO1b,QAAQqH,IAAI,CACjB1sB,KAAKiH,SAAS88B,gBAAgB4C,YAAYD,GAC1C1mC,KAAKiH,SAAS88B,gBAAgB6C,UAAUF,EAAQ,qBAChD1mC,KAAKiH,SAAS88B,gBAAgB8C,QAAQH,KACrCp4B,MAAK,EAAEq4B,EAAaC,EAAWC,MACxBF,GAAeC,KAAe5mC,KAAKoK,cAAc6I,WAAa4zB,IAE1E,CAEOnrB,U,MACL1b,KAAKu3B,aAAe,CAAC,EACrBv3B,KAAKw3B,OAAS,CAAC,EACfx3B,KAAKy3B,aAAc,EACnBz3B,KAAKs3B,UAAY,CAAC,EAClBt3B,KAAK03B,WAAY,EACjB13B,KAAKi3B,WAAa,EAElBj3B,KAAK4hB,cAAc6D,QAEnBzlB,KAAK04B,UAAU3zB,SAAS0zB,IACtBz4B,KAAKo3B,gBAAgBqB,EAASrmB,cAAgB,CAAC,KAGhC,QAAd,EAAApS,KAAK21B,iBAAS,eAAEC,cACjB51B,KAAK21B,UAAUM,kBAUjBj2B,KAAKk3B,WAAWptB,QAChB9J,KAAK0lC,0BAAuBzhC,EAC5BjE,KAAK8mC,uBACL9mC,KAAKsjC,iBAAcr/B,CACrB,CAEO6iC,uBACL9mC,KAAK04B,UAAU3zB,SAAS0zB,IACtBA,EAAS6B,YAASr2B,CAAS,GAE/B,CAEO8iC,YAAYC,GAAU,GAC3BhnC,KAAK04B,UAAU3zB,SAASmO,IAStB,GARAA,EAAIqmB,WAAWoJ,kBAEZ3iC,KAAK+3B,gBAEN/3B,KAAKoL,UAAUmI,UAAUxS,IAAI,QAC7Bf,KAAKoL,UAAU6N,cAAc1F,UAAUxS,IAAI,iBAG7B,UAAbmS,EAAItR,OAIH5B,KAAKm3B,eAAejkB,EAAId,aAAc,CACxC,MAAMwtB,EAAS1sB,EAAIqmB,WAAWtgB,cAE1B2mB,EAAOhoB,cAAc,gBACvB,EAAAqvB,EAAA,GAAarH,GAAQ,GAIvB,MAAMsH,EAAQtH,EAAOhoB,cAAc,kBAChCsvB,GACDA,EAAM1kC,Q,KAiBZxC,KAAK23B,gBAAkB,CAAC,EACxB33B,KAAKw5B,iBAAiB/T,QACtBzlB,KAAKm0B,WAAWkG,UAAY,CAY9B,CAEQW,kBAAkBmM,GACxB,MAAM32B,GAAU,EAAA42B,EAAA,GAAKpnC,KAAKoK,eAG1B,OAFAoG,EAAQ4B,YAAc,CAACxC,EAAGu3B,GAC1B32B,EAAQu0B,SAAW/kC,KAAKs3B,UAAU6P,GAC3B32B,CACT,CAEO62B,UAAS,OAACr/B,EAAM,MAAEisB,EAAK,SAAEhhB,EAAQ,eAAEkkB,EAAc,SAAEhmB,EAAQ,QAAEqxB,EAAO,QAAE8E,IAS3EtnC,KAAKoK,cAAgB,CACnBpC,SACAisB,MAAOA,GAAS,GAChB7hB,YAAa,CAACxC,EAAG5P,KAAKy4B,SAASrmB,aAC/Ba,WACA9B,WACAqxB,UACA8E,WAGFtnC,KAAKm3B,eAAiBA,QAAAA,EAAkB,CAAC,EAEzCn3B,KAAK0b,SACP,CAEO3X,U,QACL/D,KAAK0b,UACL1b,KAAK6R,eAAeC,YACpB9R,KAAKm0B,WAAWpwB,UACC,QAAjB,EAAA/D,KAAKujB,oBAAY,SAAE5H,kBACL,QAAd,EAAA3b,KAAK21B,iBAAS,SAAEja,UAEhB1b,KAAKi6B,yBAAsBh2B,EAC3BjE,KAAKm6B,iBAAcl2B,EACnBjE,KAAKk5B,eAAYj1B,EACjBjE,KAAKo4B,uBAAoBn0B,EACzBjE,KAAKujB,kBAAetf,EACpBjE,KAAK21B,eAAY1xB,CACnB,E,6mBExnDa,MAAMsjC,EAuDnBxnC,YAAY2xB,GAtDL,KAAAtmB,UAAYC,SAASC,cAAc,OACnC,KAAA+nB,KAAO,2BAIN,KAAAmU,eAAiBn8B,SAASC,cAAc,OAQzC,KAAAm8B,SAAW,IAAIrmC,IAEf,KAAAsmC,SAAU,EAET,KAAAv2B,SAAW,EACX,KAAAkxB,YAAc,EAGd,KAAApO,MAAQ,GAGR,KAAA0T,WAAkG,CAAC,EAEnG,KAAA5H,gBAA+B,IAAI3+B,IAInC,KAAAwmC,SAAmC,CAAC,WAGpC,KAAAC,aAAc,EACd,KAAAtE,eAAgB,EAChB,KAAAnO,WAAgC,aAChC,KAAA0S,YAAa,EAGb,KAAAC,QAA+D,CAAC,EAKhE,KAAAC,aAA4B,oBAE5B,KAAAC,gBAAiB,EAMjB,KAAAC,OAA6B,QAoK7B,KAAAC,QAAU,KAChB,MAAMz7B,EAAQ1M,KAAK40B,MAAMloB,MACzB,GAAG1M,KAAKi0B,QAAUvnB,EAAO,EACpB1M,KAAK4nC,SAAS7yB,SAAS,aAAe/U,KAAK4nC,SAAS7yB,SAAS,cAC9D/U,KAAKooC,oBAAiBnkC,GAGrBjE,KAAK4nC,SAAS7yB,SAAS,aACxB/U,KAAKmR,SAAW,EAChBnR,KAAKqiC,YAAc,GAGrB,IAAI,MAAMra,KAAKhoB,KAAK+nC,UAEhB/nC,KAAK+nC,QAAQ/f,GAGjBhoB,KAAKqzB,KAAO,2BAEZrzB,KAAKuO,aAAUtK,EACfjE,KAAK2nC,WAAa,CAAC,EACnB3nC,KAAKi0B,MAAQvnB,EACb1M,KAAK+/B,gBAAgBta,QACrBzlB,KAAKioC,gBAAiB,EAGtBjoC,KAAKqoC,gB,GA+NT,KAAAxD,iBAAmB,KACjB7kC,KAAKm0B,WAAW0Q,kBAAkB,GAzYlC,OAAW7kC,KAAM0xB,GAEjB1xB,KAAKoL,UAAUmI,UAAUxS,IAAI,WAAY,YAAcf,KAAKkoC,QAE5D,MAAMI,GAAKtoC,KAAKuoC,mBAAqBvoC,KAAKwoC,eAAeluB,KAAKta,MA4C9D,GA3CAA,KAAKuoC,kBAA0BE,GAAY,EAAD,gCA8BxC,OA7BGzoC,KAAKioC,iBACNjoC,KAAKm0B,WAAWuU,QAAQ5b,YAAY9sB,KAAKqzB,MACzCrzB,KAAKm0B,WAAWE,oBAAoBr0B,KAAKqzB,MACzCrzB,KAAKioC,gBAAiB,GAGxBQ,EAAUA,EAAQ1Y,QAAQ/nB,IACxB,MAAM2gC,GAAe3oC,KAAK+/B,gBAAgB18B,IAAI2E,GAE9C,OADG2gC,GAAa3oC,KAAK+/B,gBAAgBh/B,IAAIiH,GAClC2gC,CAAW,IAGjB3oC,KAAK4oC,mBACNH,QAAgB,OAAYA,GAAezgC,GAAW,EAAD,gCACnD,GAAGA,EAAOmkB,mBACWnsB,KAAKiH,SAASqI,gBAAgB+wB,QAAQr4B,IAEvD,IAAI,MAAMu3B,KAAUv/B,KAAK4oC,iBACvB,SAAS5oC,KAAKiH,SAASqI,gBAAgBiwB,GAAQv3B,GAC7C,OAAO,EAMf,OAAO,CACT,OAGKsgC,EAAEG,EACX,IAEAzoC,KAAK40B,MAAQvpB,SAASC,cAAc,SACpCtL,KAAK40B,MAAMrhB,UAAUxS,IAAI,yBACtBf,KAAKuD,aACN,QAAMvD,KAAK40B,MAAO50B,KAAKuD,iBAAaU,EAAW,gBAE/C,QAAMjE,KAAK40B,MAAO,qBAAiB3wB,EAAW,eAGhDjE,KAAK40B,MAAMhzB,KAAO,OAEf5B,KAAK6nC,YAAa,CACnB,MAAMgB,EAAU,IAAI,IAAe,CAAC,GACpCA,EAAQC,eAAev1B,UAAUxS,IAAI,2BACrC,MAAMgoC,EAAe19B,SAASC,cAAc,OAC5Cy9B,EAAax1B,UAAUxS,IAAI,6BAE3Bf,KAAKgpC,kBAAoB39B,SAASC,cAAc,OAChDtL,KAAKgpC,kBAAkBz1B,UAAUxS,IAAI,mBAErCf,KAAKgpC,kBAAkBt9B,OAAO1L,KAAK40B,OACnCmU,EAAar9B,OAAO1L,KAAKgpC,mBACzBhpC,KAAKipC,mBAAqB,IAAI,KAAWF,IAIzC,QAAiB/oC,KAAKgpC,mBAAoBjhC,IACxC,GAAG/H,KAAK0nC,QAAS,OACjB,IAAIrnC,EAAS0H,EAAE1H,OAGf,GAFAA,GAAS,OAAgBA,EAAQ,kBAE7BA,EAAQ,OAEZ,MAAM2H,EAAS3H,EAAO0pB,QAAQvd,IACxBg3B,EAAKxjC,KAAKwnC,eAAe5vB,cAAc,kBAAoB5P,EAAS,MACtEw7B,GAGF,QAAmBA,GAFnBxjC,KAAKwC,OAAOwF,EAAOyuB,W,IAMvBoS,EAAQl2B,QAAQjH,OAAOq9B,GACvB/oC,KAAKoL,UAAUM,OAAOm9B,EAAQz9B,U,CAGhCpL,KAAKwnC,eAAej0B,UAAUxS,IAAI,sBAElC,MAAM8nC,EAAU,IAAI,IAAe,CACjC3wB,KAAMlY,KAAKkpC,uBACXC,UAAU,IAEZN,EAAQl2B,QAAQjH,OAAO1L,KAAKqzB,MAC5BrzB,KAAKwnC,eAAe97B,OAAOm9B,EAAQz9B,WACnCpL,KAAKm0B,WAAa,IAAI,KAAWn0B,KAAKwnC,gBACtCxnC,KAAKm0B,WAAWE,oBAAoBr0B,KAAKqzB,OAEzC,QAAiBrzB,KAAKwnC,gBAAiBz/B,IACrC,MAAM1H,GAAS,OAAgB0H,EAAE1H,OAAQ,gBAGzC,IAFA,OAAY0H,IAER1H,EAAQ,OACZ,GAAGL,KAAK0nC,QAAS,OAEjB,IAAIl7B,EAAuBnM,EAAO0pB,QAAQ/hB,OAG1C,GAFAwE,EAAMA,EAAI2f,WAAa3f,EAAIiqB,WAAajqB,GAEpCxM,KAAK6nC,YAEP,YADA7nC,KAAKe,IAAIyL,GAKRxM,KAAKynC,SAASpkC,IAAImJ,GACnBxM,KAAKwC,OAAOgK,GAEZxM,KAAKe,IAAIyL,GAGX,MAAM48B,EAAW/oC,EAAOuX,cAAc,SACtCwxB,EAASC,SAAWD,EAASC,OAAO,IAGtC,MAAMC,GAAiB,OAAStpC,KAAKmoC,QAAS,KAAK,GAAO,GAC1DnoC,KAAK40B,MAAMhnB,iBAAiB,QAAS07B,GAErCtpC,KAAKm0B,WAAWK,iBAAmB,KACjCx0B,KAAKqoC,gBAAgB,EAGvBroC,KAAKm0B,WAAW/oB,UAAU4M,SAAQ,UAElChY,KAAKoL,UAAUM,OAAO1L,KAAKwnC,gBAC3BxnC,KAAKupC,SAAS79B,OAAO1L,KAAKoL,WAG1B1I,YAAW,KACT,MAAM8mC,EAAoBxpC,KAAKqoC,iBAC5B3W,EAAQ+X,eACTD,EAAkBl7B,MAAK,KACrBojB,EAAQ+X,eAAe,G,GAG1B,EACL,CAgCcC,c,yCAET1pC,KAAK8nC,YACL9nC,KAAKqiC,aACY,IAAlBriC,KAAKmR,WACLnR,KAAK4nC,SAAS7yB,SAAS,YACrB/U,KAAKi0B,eAAej0B,KAAKiH,SAASk6B,gBAAgBwI,eAAe3pC,KAAKi0B,gBAElEj0B,KAAKuoC,kBAAkB,CAAC,WAElC,G,CAEQqB,UAAUhoC,G,QACC,QAAjB,KAAA5B,KAAK+nC,SAAQnmC,UAAI,UAAJA,GAAU,GACvB,MAAMsa,IAAWlc,KAAK+nC,QAAQnmC,GAC9B,MAAO,CACLsa,SACAgb,WAAY,IAAMl3B,KAAK+nC,QAAQnmC,KAAUsa,EAE7C,CAEc2tB,iB,yCACZ,GAAG7pC,KAAK2nC,WAAWpF,SAAWviC,KAAK2nC,WAAWmC,SAC5C,OAIF,MAAMC,EAAY,WAAoB,GAAK,KAAO,GAE5C,WAAC7S,GAAcl3B,KAAK4pC,UAAU,WAC9Br7B,EAAUvO,KAAKiH,SAASk7B,eAAeC,WAAW,CACtDnO,MAAOj0B,KAAKi0B,MACZoO,YAAariC,KAAKqiC,YAClBtN,MAAOgV,EACPzH,SAAUtiC,KAAKmR,SACf64B,cAAc,IAGhBz7B,EAAQ0J,OAAM,KACRif,MAIJl3B,KAAK2nC,WAAW3nC,KAAK2nC,WAAWpF,QAAU,WAAa,YAAa,EAAI,IAG1E,MAAM71B,QAAc6B,EACpB,IAAI2oB,IACF,OAGF,IAAIqL,EAAU71B,EAAM61B,QACpB,GAAGA,EAAQ1/B,OAAQ,CACjB,MAAMonC,GAAiB,OAAe1H,EAAQA,EAAQ1/B,OAAS,KAAO,EAKtE,GAHA0/B,EAAUA,EAAQzS,SAClB,OAAcyS,GAAS7X,GAAKA,EAAE1iB,SAAW,WAEtChI,KAAKkqC,mBACN3H,QAAgB,OAAYA,GAAU7X,GAAM1qB,KAAKmqC,eAAezf,EAAE1iB,WAC9DkvB,KACF,OAKJ,SADMl3B,KAAK0pC,eACPxS,IACF,OAGFl3B,KAAKqiC,YAAc4H,C,CAKrB,GAFAjqC,KAAKuoC,kBAAkBhG,EAAQznB,KAAKuR,GAAWA,EAAOrkB,UAEnD0E,EAAM09B,MAAO,CACd,IAAIpqC,KAAK2nC,WAAWpF,QAAS,CAE3B,SADMviC,KAAK0pC,eACPxS,IACF,OAOF,OAJAl3B,KAAK2nC,WAAWpF,SAAU,EAC1BviC,KAAKqiC,YAAc,EACnBriC,KAAKmR,SAAW,EAETnR,KAAK6pC,gB,CAIZ,GAFA7pC,KAAK2nC,WAAWmC,UAAW,GAEvB9pC,KAAK2nC,WAAWhG,SAClB,OAAO3hC,KAAKqqC,iB,CAIpB,G,CAEcF,eAAeniC,G,yCAC3B,MAAMo4B,QAA0BpgC,KAAKiH,SAASqI,gBAAgB+wB,QAAQr4B,GACtE,OAAGA,EAAO66B,SACyB,kBAA1B7iC,KAAKkqC,mBAAwC,OAAc9J,MAC1D,OAAUA,EAAmBpgC,KAAKkqC,wBAArC,CAGT,G,CAEcG,kB,yCACZ,GAAGrqC,KAAK2nC,WAAWhG,SACjB,OAGF,MAAM2I,EAAiBtqC,KAAK4nC,SAAS7yB,SAAS,YAE9C,IAAI/U,KAAKooC,eAAgB,CAQvB,MAAM,WAAClR,GAAcl3B,KAAK4pC,UAAU,YAC9Br7B,EAAU8W,QAAQqH,IAAI,CAC1B4d,EAAiBtqC,KAAKiH,SAASk6B,gBAAgBO,mBAAmB1hC,KAAKi0B,OAAS,GAChFj0B,KAAKi0B,MAAQj0B,KAAKiH,SAASk6B,gBAAgBS,eAAe5hC,KAAKi0B,YAAShwB,IAG1EsK,EAAQ0J,OAAM,KACRif,MAIJl3B,KAAK2nC,WAAWhG,UAAW,EAAI,IAGjC,MAAOyG,EAAgBmC,SAAsBh8B,EAC7C,IAAI2oB,IACF,OAGF,GAAGqT,EAAc,CAEf,IAAIC,EAAgBF,EAAiBC,EAAa1I,WAAWvf,OAAOioB,EAAalL,SAAWkL,EAAa1I,WAEzG,GAAG7hC,KAAKkqC,mBACNM,QAAsB,OAAYA,GAAgBxiC,GAAWhI,KAAKmqC,eAAeniC,MAC7EkvB,KACF,OAIAl3B,KAAK4nC,SAAS7yB,SAAS,aACzBy1B,EAAgBA,EAAcza,QAAQ/nB,GAAWA,EAAO66B,YAG1D7iC,KAAKooC,gBAAiB,OAAaA,EAAe9lB,OAAOkoB,G,MACpDxqC,KAAKooC,eAAiBA,EAAetY,SAE5C,OAAiB9vB,KAAKooC,eAAgB,S,CAIxC,MAAM2B,EAAY,WAAoB,GAAK,KAAO,EAC5CU,EAAMzqC,KAAKooC,eAAejW,OAAO,EAAG4X,GAC1C/pC,KAAKuoC,kBAAkBkC,GAGnBzqC,KAAKooC,eAAevlC,SACtB7C,KAAK2nC,WAAWhG,UAAW,EAO/B,G,CAEc+I,6B,yCACZ,GAAG1qC,KAAK2nC,WAAWgD,oBACjB,OAGF,MAEM,WAACzT,GAAcl3B,KAAK4pC,UAAU,uBAC9Br7B,EAAUvO,KAAKiH,SAASi9B,kBAAkBC,uBAC9CnkC,KAAKgI,OAAO+4B,WACZ,CACEnxB,EAAG,4BACHg7B,EAAG5qC,KAAKi0B,OAPM,GAUhBj0B,KAAKqzB,KAAKE,mBAGZhlB,EAAQ0J,OAAM,KACRif,MAIJl3B,KAAK2nC,WAAWgD,qBAAsB,EAAI,IAG5C,MAAMpK,QAAqBhyB,EAC3B,IAAI2oB,IACF,OAGF,MAAMuR,EAAUlI,EAAaA,aAAazlB,KAAK6oB,IACtC,OAAqBA,MAE9B,OAAiB8E,EAAS,UAC1BzoC,KAAKuoC,kBAAkBE,IAEpBzoC,KAAKqzB,KAAKE,mBAAqBgN,EAAatL,OAASsL,EAAaA,aAAa19B,OAhChE,MAiChB7C,KAAK2nC,WAAWgD,qBAAsB,EAE1C,G,CAMQtC,iBACN,GAAGroC,KAAKuO,QACN,OAAOvO,KAAKuO,QAGd,MAcM2f,EAdM,KACNluB,KAAK4nC,SAAS7yB,SAAS,aAAkD/U,KAAK2nC,WAAWmC,SACpF9pC,KAAK6qC,iBAAiB,YAG3B7qC,KAAK4nC,SAAS7yB,SAAS,cAAe/U,KAAK4nC,SAAS7yB,SAAS,YAAgB/U,KAAK2nC,WAAWhG,SAI9F3hC,KAAK4nC,SAAS7yB,SAAS,yBAA2B/U,KAAK2nC,WAAWgD,oBAC5D3qC,KAAK6qC,iBAAiB,4BAD/B,EAHS7qC,KAAK6qC,iBAAiB,YAQb5nC,GACpB,IAAIirB,EACF,OAAO7I,QAAQlX,UAGjB,MAAMI,EAAUvO,KAAKuO,QAAU2f,EAAYjW,OAAOzS,IAChD4G,QAAQujB,MAAM,wBAAyBnqB,EAAI,IAC1C2S,SAAQ,KACNnY,KAAKuO,UAAYA,IAClBvO,KAAKuO,aAAUtK,GAGjBjE,KAAK6kC,kBAAkB,IAGzB,OAAOt2B,CACT,CAEQs8B,iBAAiBjD,GAQvB,MAPkE,CAChErF,QAASviC,KAAK6pC,eACdlI,SAAU3hC,KAAKqqC,gBACfM,oBAAqB3qC,KAAK0qC,4BAGR9C,GAAUkD,KAAK9qC,KAErC,CAEcwoC,cAAcC,G,0CAItBzoC,KAAK4nC,SAAS7yB,SAAS,YAAc/U,KAAK2nC,WAAWhG,WACvD8G,QAAgB,OAAYA,GAAUzgC,GAC7BhI,KAAKiH,SAASk6B,gBAAgB4J,iBAAiB/iC,MAI1DygC,EAAQ1jC,SAAciD,GAAW,EAAD,gCAC9B,MAAM,IAACm4B,GAAO,uBAA+B,CAC3Cn4B,OAAQA,EACRoD,UAAWpL,KAAKm0B,WAChBoP,cAAevjC,KAAKujC,cACpBnO,WAAYp1B,KAAKo1B,aAGnB,GAAGp1B,KAAK6nC,YAAa,CACnB,MAAMJ,EAAWznC,KAAKynC,SAASpkC,IAAI2E,GAC7BgjC,EAAgB,IAAI,IAEvBvD,IAEDuD,EAAcpW,MAAMyU,SAAU,GAGhClJ,EAAIpF,YAAY/iB,QAAQgzB,EAAcC,M,CAGxC,IAAI9H,EAEFA,EADCn7B,EAAO67B,kBACW,OAAqB77B,EAAO+4B,YACvC/4B,IAAW,UACN,QAAKhI,KAAKgoC,eAEV,aAA0BhoC,KAAKiH,SAASk6B,gBAAgBC,QAAQp5B,EAAO+6B,aAGtF5C,EAAIU,gBAAgBn1B,OAAOy3B,EAC7B,KACF,G,CAEOpiC,IAAIyL,EAAsBuC,EAA8BurB,GAAS,G,MAItE,GAFAt6B,KAAKynC,SAAS1mC,IAAIyL,IAEdxM,KAAK6nC,YAEP,YADA7nC,KAAKs0B,SAASt0B,KAAKynC,SAAS5/B,MAI3B7H,KAAKi0B,MAAMQ,SACZz0B,KAAK40B,MAAMloB,MAAQ,GACnB1M,KAAKmoC,WAGP,MAAM/Z,EAAM/iB,SAASC,cAAc,OACnC8iB,EAAI7a,UAAUxS,IAAI,gBAAiB,YAEnC,MAAMohB,EAAW,IAAI,IAKrB,GAJAA,EAAS5O,UAAUxS,IAAI,uBAAwB,QAAS,aACxDohB,EAAS+oB,UAAW,EAEpB9c,EAAIrE,QAAQvd,IAAM,GAAKA,EACpBA,EAAI2f,WAAY,CACjB,QAAaloB,IAAV8K,EAAqB,CACtB,MAAM6d,EAAY,IAAI,IACtBA,EAAUsV,OAAO,CAACl6B,OAAQwE,EAAIiqB,WAAYpK,QAAQ,IAClDtd,EAAQ6d,EAAU1qB,O,CAGpBigB,EAASwK,kBAAkB,CACzB3kB,OAAQwE,G,CA0BZ,OAtBGuC,IACoB,iBAAZ,EACPqf,EAAIrL,UAAYhU,IAEhB,OAAeqf,EAAKrf,GACpBqf,EAAI1iB,OAAOqD,KAIfqf,EAAI+c,sBAAsB,aAAchpB,GAExCniB,KAAKgpC,kBAAkBzxB,aAAa6W,EAAKpuB,KAAK40B,OAEjC,QAAb,EAAA50B,KAAKs0B,gBAAQ,mBAAGt0B,KAAKynC,SAAS5/B,MAE3ByyB,GACDt6B,KAAKipC,mBAAmBnP,kBAAkB,CACxC53B,QAASlC,KAAK40B,MACdmF,SAAU,WAIP3L,CACT,CAEO5rB,OAAOgK,GACZ,IAAIxM,KAAK6nC,YAAa,OAEtB,MAAMzZ,EAAMpuB,KAAKgpC,kBAAkBpxB,cAAc,cAAcpL,OAC/D4hB,EAAI7a,UAAU/Q,OAAO,YAChB4rB,EAAIgd,YACThd,EAAI7a,UAAUxS,IAAI,aAElB,MAAM4kB,EAAiB,KACrB3lB,KAAKynC,SAASxmC,OAAOuL,GACrB4hB,EAAI5rB,SACJxC,KAAKs0B,UAAYt0B,KAAKs0B,SAASt0B,KAAKynC,SAAS5/B,KAAK,EAGjD,+BACDumB,EAAIxgB,iBAAiB,eAAgB+X,EAAgB,CAAC1X,MAAM,IAE5D0X,GAEJ,CAEO0lB,cACL,MAAO,IAAIrrC,KAAKynC,SAClB,CAEO6D,WAAWC,GAChBA,EAAOxmC,SAAS2H,IACd1M,KAAKe,IAAI2L,OAAOzI,GAAW,EAAM,IAGnCyP,OAAO83B,uBAAsB,KAC3BxrC,KAAKipC,mBAAmBnP,kBAAkB,CACxC53B,QAASlC,KAAK40B,MACdmF,SAAU,SACV0R,eAAgB,YAChB,GAEN,E,wnBClVF,SAASC,EAA2BC,GAAiB,GACnD,MAAMxvB,EAAY,IAAI,IAAqB,CAACwF,YAAY,EAAMgqB,mBAQ9D,OAPAxvB,EAAUhR,YAENwgC,IACFxvB,EAAUyvB,OAAOzhB,eAAe,KAAM,IAAK,MAC3ChO,EAAU0vB,YAAc,cAGnB1vB,CACT,CA9UA,qBAA2B,uBAAuB,EAAE2vB,OAAM9jC,aACxD8jC,EAAK/mC,SAASkD,IACZ,MAAM8jC,EAAO,cAAc9jC,qBAAuBD,MACjDkR,MAAMC,KAAK9N,SAASoN,iBAAiB,0BAA0BszB,4BAA+BA,MAA4BhnC,SAASinC,IAClIA,EAAKz4B,UAAU/Q,OAAO,YAAY,GAClC,GACF,IA0UG,MAAMypC,EAAmB,CAACC,EAAqBC,KACpD,IAAIz7B,EAAmB9G,EAEvB,MAAMwiC,GAAaF,EAAO34B,UAAUqB,SAAS,qBACvCxJ,GAAY,OAAgB8gC,EAASE,EAAyB,gBAAb,YACvD,GAAGhhC,EAAW,CACZ,MAAM2gC,EAAO,+BACPM,EAAoB,wBAAwBN,IAClD,IAAIO,EAOJ,GAHEA,EAHEJ,EAAOjjB,QAAQojB,GAGL,CAACA,GAFD,CAAC,kBAAkBN,IAAQ,eAAeA,KAKrDK,EAAW,CACZ,MAAMG,EAAS,yBACfD,EAAYA,EAAUxxB,KAAK/Q,GAAMwiC,EAASxiC,G,CAG5C,MAAMgf,EAAWujB,EAAUlkB,KAAK,MAE1Bc,EAAWhQ,MAAMC,KAAK/N,EAAUqN,iBAAiBsQ,IACjDhgB,EAAMmgB,EAAS/O,QAAQ+xB,GAEvBM,EAA0BtjB,EAASpO,KAAK5Y,IAAY,CAAE8F,OAAQ9F,EAAQ6nB,QAAQ/hB,OAAOyuB,WAAYxuB,KAAM/F,EAAQ6nB,QAAQ9hB,QAE7HyI,EAAO87B,EAAW1c,MAAM,EAAG/mB,GAC3Ba,EAAO4iC,EAAW1c,MAAM/mB,EAAM,E,CAUhC,OANIa,EAAK/G,QAAU+G,EAAK,GAAG3B,IAAMkkC,GAAez7B,EAAK7N,QAAU6N,EAAKA,EAAK7N,OAAS,GAAGoF,IAAMkkC,MACxFz7B,EAAM9G,GAAQ,CAACA,EAAKsH,UAAWR,EAAKQ,YAKhC,CAACR,EAAM9G,EAAK,EAGN,MAAM6iC,UAAqBjpC,YAA1C,c,oBAIS,KAAAw5B,UAAW,EACX,KAAAE,cAAe,EAEf,KAAAlF,YAAa,EAMZ,KAAAnmB,eAAiB,IAAI,GAsS/B,CAjSe66B,S,mDACX1sC,KAAKuT,UAAUxS,IAAI,SACnBf,KAAKiH,SAAW,aAEhBjH,KAAK+pB,QAAQ9hB,IAAM,GAAKjI,KAAKmI,QAAQF,IACrCjI,KAAK+pB,QAAQ/hB,OAAS,GAAKhI,KAAKmI,QAAQH,OAExC,MAAMrG,GAAM,OAAoB3B,KAAKmI,SAC/BwkC,EAA2B,UAAbhrC,EAAIC,KAClBkN,GAAW9O,KAAKk9B,cAAgByP,EAChCC,EAAa5sC,KAAKmI,QAAQsF,OAAOo/B,YACjCC,EAAgC,QAAZ,EAAA9sC,KAAKmI,eAAO,eAAE2kC,kBAElCC,GAAc,OAAwB,EAAfprC,EAAIkF,UAEjC7G,KAAK+iB,UAAY,wOAQjB,MAAMlZ,EAAS7J,KAAKuV,kBAEdy3B,EAAc3hC,SAASC,cAAc,OAC3C0hC,EAAYz5B,UAAUxS,IAAI,kBAEI,UAAbY,EAAIC,MAAoB5B,KAAKmI,SAAWnI,KAAKmI,QAAQsF,OAAOI,cAE3E7N,KAAKuT,UAAUxS,IAAI,aAGlB+rC,IACD9sC,KAAKuT,UAAUxS,IAAI,eACnBf,KAAK0L,OAAOshC,IAGd,MAAMC,QAAoBn+B,EAlU9B,SAAgCo+B,G,yCAC9BA,EAAQ35B,UAAUxS,IAAI,YAEtB,MAAMoH,EAAU+kC,EAAQ/kC,QAClBxG,GAAM,OAAoBwG,GAE7BA,EAAQsF,OAAO0/B,KAChBD,EAAQ35B,UAAUxS,IAAI,UAGxB,IAAIqsC,EAAYzrC,EAAIgO,WAAWjP,MAAMgP,GAA8B,2BAAhBA,EAAUE,IAA6Ew9B,UAAY,IAAIC,WAAW,IACrKD,EAhHK,SAAwBA,GACxBA,aAAoBC,aACvBD,EAAW,IAAIC,WAAWD,IAG5B,MACME,EAD6B,EAAlBF,EAASvqC,OACI,EAAI,EAClC,IAAIyqC,EACF,OAAO,IAAID,WAAW,IAGxB,IAAIE,EACJ,IACE,MAAMC,EAAW,IAAIC,SAASL,EAASM,QACvCH,EAAS,IAAIF,WAAWC,GACxB,IAAI,IAAItlB,EAAI,EAAGA,EAAIslB,EAAYtlB,IAAK,CAClC,MAAM2lB,EAAgB,EAAJ3lB,EAAQ,EAAI,EACxB4lB,EAAe,EAAJ5lB,EAAQ,EACnBtb,EAAQ8gC,EAASK,UAAUF,GAAW,GAC5CJ,EAAOvlB,GAAMtb,GAASkhC,EAAY,E,EAEpC,MAAMpoC,GACN+nC,EAAS,IAAIF,WAAW,G,CAY1B,OAAOE,CACT,CA6EaO,CAAeV,EAAStd,MAAM,EAAG,KAE5C,MAAM,IAACie,EAAK3iC,UAAW4iC,EAAY,OAAEC,GA7EvC,SAA4Bb,EAAsBvmC,GAChD,MAGMqnC,EAAe,aAAsB,GAAK,GAG1CC,EAAO,aAAsB,IAAM,IACnCC,EAAO,aAAsB,IAAM,IACnCH,GAAS,OAAMpnC,EAAW,GAAKunC,EAAMD,EAAMC,GAE3CL,EAAM1iC,SAAS6e,gBAAgB,6BAA8B,OACnE6jB,EAAIx6B,UAAUxS,IAAI,uBAClBgtC,EAAI5jB,eAAe,KAAM,QAAS,GAAK8jB,GACvCF,EAAI5jB,eAAe,KAAM,SAAU,GAAK+jB,GACxCH,EAAI5jB,eAAe,KAAM,UAAW,OAAO8jB,KAAUC,KAIrD,MAAMG,EAAY7nC,KAAKC,OAAO2mC,GACxBkB,EAASlB,EAASvqC,OAASuqC,EAASvqC,OAAS,IAC7C0rC,EAAW/nC,KAAKI,IAAKqnC,EAAS,EAA0B,EAAGK,GAEjE,IAAIE,EAAW,EACf,MAAMC,EAAWP,EArBI,EAuBrB,IAAI94B,EAAO,GACX,IAAI,IAAI4S,EAAI,EAAG0mB,EAAO,EAAGC,EAAO,EAAG3mB,EAAIsmB,IAAUtmB,EAAG,CAClD,MAAMtb,EAAQ0gC,EAASplB,IAAM,EAC7B,GAAI2mB,EAAOJ,GAAaD,EAAQ,CAC9BK,EAAOA,EAAOJ,EAAWD,EACtBK,GAAQJ,EAAW,GAAK,GACtBC,EAAW9hC,IAAO8hC,EAAW9hC,GAGlC,MAAMkiC,EAAYpoC,KAAKC,KAAM+nC,EAAWC,GAAcJ,EAAY,GAAK,IAAOA,EAAY,GAhCzE,GAqCjBj5B,GAHU,oBACCs5B,SAAYR,EAAeU,wBAA0CA,mCAIhFF,GAAQG,EAGNL,EADCG,GAAQJ,EAAW,GAAK,EACd,EAEA7hC,C,MAGV8hC,EAAW9hC,IAAO8hC,EAAW9hC,GAEhCiiC,GAAQJ,C,CAIZ,MAAMnjC,EAAYC,SAASC,cAAc,OAKzC,OAJAF,EAAUmI,UAAUxS,IAAI,kBACxBqK,EAAUM,OAAOqiC,GAEjBA,EAAIx1B,mBAAmB,YAAanD,GAC7B,CAAC24B,MAAK3iC,YAAW6iC,SAC1B,CAeiDa,CAAmB1B,EAAUzrC,EAAIkF,UAE1EkoC,EAAmBf,EAAavhB,WAAU,GAChDsiB,EAAiBx7B,UAAUxS,IAAI,uBAC/BitC,EAAaz6B,UAAUxS,IAAI,6BAE3B,MAAMiuC,EAAoB3jC,SAASC,cAAc,OACjD0jC,EAAkBz7B,UAAUxS,IAAI,4BAChCiuC,EAAkBtjC,OAAOsiC,EAAce,GAEvC,MAAME,EAAU5jC,SAASC,cAAc,OACvC2jC,EAAQ17B,UAAUxS,IAAI,cACtBmsC,EAAQxhC,OAAOsjC,EAAmBC,GAElC,IAAIp3B,EAAWk2B,EAiFf,MA/Ee,KACb,IAAI5nC,EAAQ+mC,EAAQ/mC,MAEpB,MAQM+oC,EAAe,KACnBH,EAAiBxjC,MAAM2b,MAAS/gB,EAAMI,YAAcJ,EAAMU,SAAW,IAAO,GAAG,IAG7EV,EAAM7B,QAAW6B,EAAMI,YAAc,GAAKJ,EAAMI,cAAgBJ,EAAMU,WACxEqoC,IAGF,MAAMC,GAAsB,OAAgBD,GAqD5C,OApDAhC,EAAQkC,iBAAiB,aAAcD,GACvCjC,EAAQkC,iBAAiB,QAASD,GAClCjC,EAAQkC,iBAAiB,QAnBJ,MACnB,SAAc,MACRjpC,IACJ+oC,KACQ/oC,EAAM7B,SACb4oC,EAAQ,IAgBbA,EAAQmC,aAAa/gC,MAAK,KACxB,IAAIiW,GAAY,EAAO+qB,GAAY,EAiCnC,SAASC,EAAMxnC,GACb,IAAIyX,EACJ,GAAGzX,aAAauuB,WACd9W,EAAUzX,EAAEyX,YACP,CACL,MAAM8G,EAAQve,EAAE1H,OAAuBqd,wBACvC8B,EAAUzX,EAAEynC,cAAc,GAAGC,MAAQnpB,EAAKxB,I,CAG5C,MAAM4qB,EAAYlwB,EAAUyuB,EAAqB9nC,EAAMU,SACvDV,EAAMI,YAAcmpC,CACtB,CA3CA73B,EAASjK,iBAAiB,cAAe7F,IACpCwc,IACDpe,EAAM1B,OACN8f,GAAY,GAEd+qB,GAAY,CAAK,IAEnBz3B,EAASjK,iBAAiB,aAAc7F,IACtCunC,GAAY,EACT/qB,GAAWgrB,EAAMxnC,EAAE,IAExB8P,EAASjK,iBAAiB,aAAc7F,IACtCA,EAAEwuB,iBACc,IAAbxuB,EAAEuO,SACDnQ,EAAM7B,QACR6B,EAAM5B,QAGRgrC,EAAMxnC,GACNwc,GAAY,EAAI,IAElB1M,EAASjK,iBAAiB,WAAY7F,IACjCunC,GAAa/qB,IACdpe,EAAM1B,OACN8f,GAAY,E,KAGhB,QAAiB1M,GAAW9P,KAC1B,OAAYA,GACR5B,EAAM7B,QAAQirC,EAAMxnC,EAAE,GAc5B,GACC,KAEI,KACL8P,EAASrV,SACTqV,EAAW,KACX1R,EAAQ,IAAI,CACb,CAIL,G,CAqNwCwpC,CAAiB3vC,MAnNzD,SAAyBktC,G,+CACvB,MAAMlQ,EAAWkQ,EAAQlQ,SAEnB70B,EAAU+kC,EAAQ/kC,QAClBxG,GAAM,OAAoBwG,GAE1B2G,EAAuB,UAAbnN,EAAIC,MAAiC,UAAbD,EAAIC,KACtCguC,EAAgBvkC,SAASC,cAAc,OAC7CskC,EAAcr8B,UAAUxS,IAAI,qBAE5B,MAAM8uC,EAAiBluC,EAAIgO,WAAWjP,MAAMqrC,GAAoB,2BAAXA,EAAKn8B,IAE1D,IAAId,EAAS,CACX,MAAMghC,EAA2B,IAC9BD,aAAc,EAAdA,EAAgB//B,YACjBggC,EAAMztC,MAAK,OAAcwtC,EAAe//B,YAGvCktB,EACD8S,EAAMztC,MAAK,QAAmB8F,EAAQqO,OAC7Bs5B,EAAMjtC,QACfitC,EAAMztC,MAAK,OAAYV,EAAIkG,OAG1BqlC,EAAQlV,YACT8X,EAAMztC,WAAW,OAAiB8F,IAGpCynC,EAAclkC,WAAU,QAAiBokC,EAAO,O,CAQlD5C,EAAQ30B,mBAAmB,YALd,wJAOb,MAAMw3B,EAAU7C,EAAQt1B,cAAc,gBAEhCo4B,EAAmB,IAAI,IAC7BA,EAAiBjmB,QAAQkT,WAAaiQ,EAAQnjB,QAAQkT,WACtD+S,EAAiBjmB,QAAQkmB,SAAW/C,EAAQnjB,QAAQkmB,SACpDD,EAAiBjmB,QAAQmmB,SAAWhD,EAAQnjB,QAAQmmB,SACnDF,EAAyB5S,QAAW8P,EAAgB9P,QAClDtuB,EACDkhC,EAAiBtkC,aAAa,OAAiBvD,KAE/C,OAAa6nC,GAAkB,OAAmC,QAArB,EAAAH,aAAc,EAAdA,EAAgB9gC,aAAK,QAAIpN,EAAIkO,YAG5EkgC,EAAQrkC,OAAOskC,GAEZ9C,EAAQlV,YACT+X,EAAQrkC,QAAO,OAAavD,IAG9B,MAAMgoC,EAAcjD,EAAQt1B,cAAc,mBA0C1C,OAzCAu4B,EAAYzkC,OAAOkkC,GAEJ,KACb,IAAIQ,GAAW,EAEXC,EAAe,IAAI,IAAkB,CACvC3qC,MAAOwnC,EAAQ/mC,MACfyQ,WAAYjV,EAAI0F,oBAGlB6lC,EAAQkC,iBAAiB,SAAS,KAChClC,EAAQ35B,UAAU/Q,OAAO,uBAEzB2tC,EAAYG,UAAUxjB,YAAY8iB,GAClCQ,GAAW,CAAK,IAGlB,MAAMtoC,EAAS,KACTsoC,IACFlD,EAAQ35B,UAAUxS,IAAI,uBACtBqvC,GAAW,EAERC,GACDF,EAAYG,UAAUxjB,YAAYujB,EAAajlC,W,EAWrD,OANA8hC,EAAQkC,iBAAiB,OAAQtnC,KAE7BolC,EAAQ/mC,MAAM7B,QAAU4oC,EAAQ/mC,MAAMI,YAAc,IACtDuB,IAGK,KACLuoC,EAAa10B,kBACb00B,EAAajlC,UAAU5I,SACvB6tC,EAAe,IAAI,CACpB,C,IAmH4DE,CAAUvwC,MAEjEwwC,EAAexwC,KAAK4X,cAAc,eACxC44B,EAAaztB,UAAYgqB,EAEzB,MAAMvL,EAASxhC,KAAKwhC,OAAUh0B,IAC5BxN,KAAKwhC,YAASv9B,EAEd,MAAMkC,EAAQnG,KAAKmG,MAAQ,aAAoCnG,KAAKmI,QAASqF,GAEvE6hC,EAAervC,KAAKqvC,cAAe,SACtCrvC,KAAKmG,MAAM2oB,YAAc9uB,KAAKmG,MAAMsqC,kBAAmBpB,EAAalhC,UAErEnO,KAAKovC,iBAAiB,WAAW,IAAMC,EAAalhC,WAAW,CAACF,MAAM,IAGxEjO,KAAK0wC,iBAAmBzD,IAExB,MAAM0D,EAAa,KAAM,OAA6B,EAApBxqC,EAAMI,cAAoBuI,EAAW,MAAQi+B,EAAe,IAExFjlC,EAAS,KACb0oC,EAAajS,UAAYoS,IACzB9mC,EAAO0J,UAAU1J,OAAO,WAAY1D,EAAM7B,OAAO,IAG/C6B,EAAM7B,QAAW6B,EAAMI,YAAc,GAAKJ,EAAMI,cAAgBJ,EAAMU,WACxEiB,IAGF,MAAMsR,EAAa,CAACrR,EAAWzD,EAAS6B,EAAM7B,UAG5C,GAFAyD,IAAK,OAAYA,GAEdzD,EAAQ,CACT,MAAMssC,IAAqB5wC,KAAKoK,cAChC,GAAG,qBAA4CpK,KAAKoK,eAAiB,CACnEpC,OAAQ,KACRoK,YAAa,CAACxC,EAAG,4BACjBihC,WAAW,IACT,CACF,MAAOngC,EAAM9G,GAASgnC,EAAwB3E,EAAiBjsC,KAAMA,KAAKmI,QAAQF,KAAzC,GACzC,eAAsC,CAACD,OAAQhI,KAAKmI,QAAQH,OAAQC,IAAKjI,KAAKmI,QAAQF,KAAMyI,EAAM9G,E,CAGpGzD,EAAM1B,OAAOwT,OAAM,Q,MAEnB9R,EAAM5B,O,EAsBV,OAlBA,QAAiBsF,GAAS9B,GAAMqR,EAAWrR,IAAI,CAAC8J,eAAgB7R,KAAK6R,iBAErE7R,KAAKovC,iBAAiB,SAAS,KAC7BvlC,EAAO0J,UAAU/Q,OAAO,WACxBguC,EAAajS,UAAYwO,CAAW,IAGtC/sC,KAAKovC,iBAAiB,cAAc,MAC7BjpC,EAAMI,aAAeJ,EAAM7B,QAAW,sBAA6C6B,KACxFqqC,EAAajS,UAAYoS,IAAY,IAGvC3wC,KAAKovC,iBAAiB,SAAS,KAC7BvlC,EAAO0J,UAAU/Q,OAAO,UAAU,IAGpCxC,KAAKovC,iBAAiB,OAAQtnC,GAEvBsR,CAAU,EAGnB,GAAa,QAAV,EAAAzX,EAAIsN,cAAM,eAAEpM,OAAQ,CACrB,MAAMiuC,EAAsB,GACtB7U,QAAgB,OAAU,CAC9BO,MAAO76B,EACPwG,QAAS,KACTiD,UAAWvB,EACXsyB,SAAU,GACVC,UAAW,GACX7E,aAAcv3B,KAAKu3B,aACnB+E,kBAAkB,EAClB1a,cAAe5hB,KAAK4hB,gBAEtB/X,EAAO0B,MAAM2b,MAAQrd,EAAO0B,MAAM+b,OAAS,GACxC2U,EAAQW,OAAOvtB,OAAOyhC,EAAKzuC,KAAK45B,EAAQW,OAAOvtB,OAC/C4sB,EAAQW,OAAOC,MAAMiU,EAAKzuC,KAAK45B,EAAQW,OAAOC,MAEjD78B,KAAKuT,UAAUxS,IAAI,oBACnB+vC,EAAK/rC,SAAS+oB,GAAQA,EAAIva,UAAUxS,IAAI,gB,CAG1C,GAAI6rC,EA2HME,IACR9sC,KAAKmc,UAAYuvB,GAA2B,GAC5C1rC,KAAKmc,UAAUgU,cAAc,cAA6B2c,IAC1D9sC,KAAK+pB,QAAQ6iB,WAAa,IAC1B5sC,KAAKmc,UAAU6S,OAAOge,GAAa,QA/HrB,CACd,IAAI7wB,EAAkCnc,KAAKmc,UAE3C,MAAM40B,EAA4B,UAAbpvC,EAAIC,KACzB4/B,EAAOuP,GAEP,MAAM7oB,EAAK8oB,IACT,GAAGhxC,KAAKmG,MAAMxD,IACZ,OAGF,+BAAsD3C,KAAKmI,QAAQH,OAAQhI,KAAKmI,QAAQF,IAAKjI,KAAKmI,QAAQsF,OAAOC,cAEjH,MAAMujC,EAAiB,KAClBD,IACD,iBAAwChxC,KAAKmG,OAE1C,EAAA1D,YAAczC,KAAKmG,MAAM3B,WAC1BxE,KAAKmG,MAAM3B,UAAW,G,EAO5B,GAFAysC,KAEI90B,EACF,GAAGxa,EAAI0F,kBAAmB,CAGxB,IAAI6pC,EAFJlxC,KAAKuT,UAAUxS,IAAI,mBAGnB,MAAM+G,EAAS,KACb,MAAMqU,EAAYuvB,GAA2B,GACvCx9B,GAAW,SACjBA,EAASijC,UAAU,CAACC,KAAM,GAAIC,MAAO,MACrCnjC,EAAS+J,OAAM,KACbjY,KAAKmG,MAAM5B,QACX,sBAAwCN,EAAU,IAEpDiK,EAASojC,OAAS,KAChBpjC,EAASojC,OAAS,IAClB,MAAM9rC,EAAM,IAAI+rC,MACf/rC,EAAY5D,KAAO,WACpBsM,EAASoX,OAAO9f,EAAI,EAEtB2W,EAAU6S,OAAOge,GAAa,EAAO9+B,GAErCgjC,EAAgBlxC,KAAKovC,iBAAiB,SAAS,KAC7ClhC,EAASojC,QAAQ,GAChB,CAACrjC,MAAM,IAEVgjC,GAAgB,EAOZO,EAAoBxxC,KAAKovC,iBAAiB,OAAQtnC,GACxD9H,KAAKqvC,aAAa/gC,MAAK,KACrBtO,KAAK6R,eAAerP,OAAOgvC,GAC3BxxC,KAAK6R,eAAerP,OAAO0uC,EAAc,G,KAEtC,CACL/0B,EAAYuvB,IAERsF,IACFhxC,KAAKqvC,cAAe,UAGtB,MAAMzsC,EAAO,KACXquC,IAEA,MAAM96B,EAAW,qBAAoC,CAACzQ,MAAO/D,IAS7D,OAPIqvC,GACF76B,EAAS7H,MAAK,KACZtO,KAAKqvC,aAAalhC,SAAS,IAI/BgO,EAAU6S,OAAOge,GAAa,EAAO72B,GAC9B,CAACA,WAAS,EAGnBgG,EAAUs1B,oBAAoB7uC,GAC9BA,G,CAID5C,KAAKuT,UAAUqB,SAAS,mBACzB/K,EAAO6B,OAAOshC,GAEdhtC,KAAK0L,OAAOshC,GAGdhtC,KAAKuT,UAAUxS,IAAI,eAEnBf,KAAKqvC,aAAa/gC,MAAK,KACrBtO,KAAKuT,UAAU/Q,OAAO,eACtBwqC,EAAYz5B,UAAUxS,IAAI,cAC1B2B,YAAW,KACTsqC,EAAYxqC,QAAQ,GACnB,KAIA,wBAAiDxC,KAAKmG,QACvDnG,KAAKmG,MAAM1B,OACX,sBAAwCR,G,GAG1C,GAGU,QAAV,EAAAjE,KAAKmG,aAAK,eAAExD,OACXouC,EACD7oB,GAAE,IAEF,QAAiBre,GAAQ,KACvBqe,GAAE,EAAK,GACN,CAACja,MAAM,EAAM+G,SAAS,EAAMyc,SAAS,EAAO5f,eAAgB7R,KAAK6R,iB,KAYxEu9B,uBACF,OAAOpvC,KAAK6R,eAAe9Q,IAAIf,KAAKmG,MACtC,CAEAurC,uBACEhvC,YAAW,KACN1C,KAAK2xC,cAIL3xC,KAAK0wC,mBACN1wC,KAAK0wC,mBACL1wC,KAAK0wC,iBAAmB,MAGvB1wC,KAAKqvC,cACNrvC,KAAKqvC,aAAa/pB,SAGjBtlB,KAAK6R,iBACN7R,KAAK6R,eAAeC,YACpB9R,KAAK6R,eAAiB,MAGrB7R,KAAKmc,YACNnc,KAAKmc,UAAY,M,GAElB,IACL,EAGFy1B,eAAeC,OAAO,gBAAiBpF,E,6GC3sBxB,MAAMqF,UAAoE,IAIvF/xC,YAAY2xB,GACVxf,MAAM,OAAD,wBACAwf,GAAO,CACVqgB,SAAU,CAAC7F,EAAQl7B,EAAOJ,KACxB,GAAG5Q,KAAKgI,OAAO67B,cAAgB7yB,EAAO,OAAOqU,QAAQlX,QAAQ,CAAC8mB,MAAO,EAAGzC,MAAO,KAE/E,MAAMsC,EAAQoX,aAAM,EAANA,EAAQ8F,QACtB,OAAOhyC,KAAKiH,SAASgrC,iBAAiBC,cAAclyC,KAAKgI,OAAQ8sB,EAAOlkB,GAAWtC,MAAM5B,IACvF,MAAM8lB,EAAQ9lB,EAAMylC,OAAOr3B,KAAKk3B,IACvB,CAAC9vC,QAAS,KAAqB8vC,cAGxC,MAAO,CAAC/c,MAAOvoB,EAAMuoB,MAAOzC,QAAM,GAClC,KAINxyB,KAAKoyC,aAAc,EACnBpyC,KAAKgI,OAAS0pB,EAAQ1pB,MACxB,E,kCCnBa,MAAMqqC,UAA6B,IAGhDtyC,YAAYiI,GACVkK,MAAM,IAAI4/B,EAAiB,CAAC9pC,SAAQf,SAAUua,EAAA,aAAsB,IAmBtE,KAAAlP,YAAejS,IACbL,KAAKuS,UAAUlS,EAAO2xC,QAAS3xC,EAAO6B,SAAU,EAAE,EAGpD,KAAAuQ,YAAepS,IACbL,KAAKuS,UAAUlS,EAAO2xC,QAAS3xC,EAAO6B,QAAS,EAAE,EAGnD,KAAAkR,gBAAkB,KAChBoc,EAAA,iBAAkC,CAChC9pB,MAAO1F,KAAKK,OAAOm8B,MACnBnpB,QAASqiB,EAAA,uCACT,EA7BF11B,KAAKgI,OAASA,EAEdhI,KAAKoU,iBAAiB,CAAC,CACrBL,KAAM,WACNC,KAAM,+BACNC,QAASjU,KAAKoT,mBAShBpT,KAAKqU,cACP,CAiBa9B,UAAUy/B,EAA4B3xC,EAAsBmV,EAAY,EAAGC,EAAgDC,G,yGACtI,GAAG1V,KAAK2V,gBAAiB,OAAO3V,KAAK2V,gBAErC,MAAM6mB,QAAcx8B,KAAKiH,SAASgrC,iBAAiBK,SAASN,GACtDxpB,EAAM,EAAMjS,WAAU,UAACimB,EAAOA,EAAMhmB,KAAMxW,KAAKgI,OAAQwN,EAAWnV,GAAQ,EAAOoV,EAAaC,GAIpG,OAHA1V,KAAKK,OAAO2xC,QAAUxV,EAAM50B,GAC5B5H,KAAKK,OAAOm8B,MAAQA,EAEbhU,CACT,E,wmBC1CF,MAAM+pB,EAAiB,EAAEvqC,SAAQiL,eAC/B,IAAIghB,EAAQ,gCAAkCjsB,EAAS,KACpDiL,IACDghB,GAAS,oBAAsBhhB,EAAW,MAG3CiG,MAAMC,KAAK9N,SAASoN,iBAAiBwb,IAA4BlvB,SAASinC,IAEzEA,EAAK9J,QAAQ,GACb,EAUG,SAAesQ,EACpBnyC,EACA2H,EACAkvB,EACA/uB,EACAsN,EACAC,G,yCAEA,IAAI8mB,QAAchb,EAAA,0CAAkDxZ,GACpE,IAAIkvB,MAAiBsF,EACnB,OAGF,MAAMiW,EAAY,IACHv5B,MAAMC,KAAK9Y,EAAOoY,iBAAiB,QAAQ/X,MAAMotB,IAASA,EAAIva,UAAUqB,SAAS,WAChFvU,EAAS,KAGzB,GAAG2H,EAAO67B,YAAa,CACrB,MAAM6O,IAAevqC,EACfiK,EAAc,gCACpB,IAAIjK,IACFA,QAAgBqZ,EAAA,wCAAgD,CAC9DxZ,SACAoK,YAAa,CAACxC,EAAGwC,GACjB0iB,MAAO,EACPC,MAAO,IACNzmB,MAAM5B,GAGAA,EAAMilB,QAAQ,MAGnBuF,KACF,OAIJ,GAAG/uB,EAAS,CAEWA,EAAQ+D,OAAOswB,MACpB50B,KAAO40B,EAAM50B,KACvB8qC,IACFvqC,EAAUqZ,EAAA,wDAAgExZ,EAAQw0B,KAMtF,MAAM8L,EAAKmC,GAA4BA,EAAI3vB,KAAKla,IAAO,CACrDsB,QAAStB,EAAGsB,QACZ+F,IAAMrH,EAAGoC,KAAgCiF,IACzCD,OAASpH,EAAGoC,KAAgCgF,WAU9C,YAPA,IAAI,KACHuI,iBAAiB,CAChBvI,SACAoK,YAAa,CAACxC,EAAGwC,KAElBG,UAAUpK,EAASsqC,SAAaxuC,OAAWA,EAAWwR,EAAc6yB,EAAE7yB,QAAexR,EAAWyR,EAAc4yB,EAAE5yB,QAAezR,E,EAMpI,GAAGu4B,EAAO,GACJ,EAAAmW,EAAA,GAASxqC,IAAYA,IACvBq0B,QAAchb,EAAA,qCAA6CrZ,IAG7D,MAAMmgC,EAAKmC,GAA4BA,EAAI3vB,KAAKla,IAAO,CACrDsB,QAAStB,EAAGsB,QACZ8vC,QAASpxC,EAAGoC,SAGd,IAAIqvC,EAAqBrqC,GAAQuK,UAC/BiqB,EAAM50B,GACN6qC,SACAxuC,EACAwR,EAAc6yB,EAAE7yB,QAAexR,EAC/ByR,EAAc4yB,EAAE5yB,QAAezR,E,CAGrC,G,CA3FAud,EAAA,mBAA2B,gBAAiB+wB,GAC5C/wB,EAAA,mBAA2B,mBAAyBoxB,GAAS,2CAChDpxB,EAAA,4CAAoDoxB,EAAK5qC,UAClEuqC,EAAeK,EAEnB,MAwFA,MAAMC,EAA6C,IAAItxC,IACjDuxC,EAAoB,IAAI1xC,IAE9B,SAAS2xC,EAAkB/qC,EAAgBiL,GACzC,OAAOjL,GAAUiL,EAAW,IAAMA,EAAW,GAC/C,CAEe,MAAM+/B,UAAsBxvC,YAazCzD,cACEmS,QANM,KAAA+gC,cAAe,EAOrBjzC,KAAKuT,UAAUxS,IAAI,eACnBf,KAAKkzC,kBAAmB,QAC1B,CAEAxB,uB,MAGE,MAAMllC,EAAMumC,EAAkB/yC,KAAKgI,OAAQhI,KAAKiT,UAC1CrP,EAAMivC,EAAU5vC,IAAIuJ,IACvB5I,aAAG,EAAHA,EAAKP,IAAIrD,SACV4D,EAAI3C,OAAOjB,MACP4D,EAAIiE,MACNgrC,EAAU5xC,OAAOuL,IAIH,QAAlB,EAAAxM,KAAK4hB,qBAAa,SAAE3gB,OAAO,CAACmtB,IAAKpuB,MACnC,CAEOmzC,mBACL,IAAIhkB,GAAU,GACd,QAAiBnvB,MAAY+H,GAAM,kCAEjC,IADA,EAAAqS,EAAA,GAAYrS,GACTonB,EAAS,OACZ,MAAMnnB,EAAShI,KAAKgI,OACpBmnB,GAAU,QACJqjB,EAAiBxyC,KAAMA,KAAKgI,QAAQ,IAAMhI,KAAKgI,SAAWA,IAChEmnB,GAAU,CACZ,KACF,CAEOikB,cAAc1hB,GACnB,IAAI,MAAM1J,KAAK0J,EAEb1xB,KAAKgoB,GAAK0J,EAAQ1J,EAEtB,CAEO2E,kBAAkB+E,G,MAUvB,MAAM2hB,EAAYrzC,KAAKgI,OACjBsrC,EAActzC,KAAKiT,SACzBjT,KAAKozC,cAAc1hB,GACnB,MAAM6hB,EAAYvzC,KAAKgI,OACjBiL,EAAWjT,KAAKiT,SAEtB,GAAGogC,IAAcE,GAAaD,IAAgBrgC,EAC5C,OAWF,GARAjT,KAAK+pB,QAAQ/hB,OAAS,GAAKurC,EAExBtgC,EACDjT,KAAK+pB,QAAQ9W,SAAW,GAAKA,EACrBqgC,UACDtzC,KAAK+pB,QAAQ9W,SAGnBogC,EAAW,CACZ,MAAM7mC,EAAMumC,EAAkBM,EAAWC,GACnC1vC,EAAMivC,EAAU5vC,IAAIuJ,GACvB5I,IACDA,EAAI3C,OAAOjB,MACP4D,EAAIiE,MACNgrC,EAAU5xC,OAAOuL,G,CAKvB,MAAM0qB,EAAgC,QAAnB,EAAAxF,EAAQ8hB,mBAAW,eAAEtc,WAQxC,OAPAl3B,KAAKkzC,iBAAiBnvC,UACnBmzB,EACDl3B,KAAKkzC,iBAAmBhc,EAAWuc,SAEnCzzC,KAAKkzC,iBAAiBnvC,UAGjB/D,KAAKkiC,QACd,CAEO1/B,SACLxC,KAAKkzC,iBAAiBnvC,UACtBmO,MAAM1P,QACR,CAEQ0lB,EAAEwrB,GAAY,GACpB,MAAMnlC,GAAU,EAAAolC,EAAA,GAAS,CACvBvlB,IAAKpuB,KACLgI,OAAQhI,KAAKgI,OACbkjC,SAAUlrC,KAAKkrC,SACfn8B,MAAO/O,KAAK4sB,UACZ8mB,YACAE,MAAO5zC,KAAK4zC,MACZ3gC,SAAUjT,KAAKiT,SACfugC,YAAa,OAAF,QACTtc,WAAYl3B,KAAKkzC,iBAAiBjwC,OAC9BjD,KAAKwzC,aAAe,CAAC,KAa7B,OARGxzC,KAAKu3B,eACNv3B,KAAKu3B,aAAal1B,KAAKkM,GAEvBA,EAAQ4J,SAAQ,KACdnY,KAAKu3B,kBAAetzB,CAAS,KAI1BsK,CACT,CAEO2zB,SACL,GAAGliC,KAAK4hB,cAAe,CACrB,IAAIkxB,EAAKzvC,IAAIrD,KAAKgI,QAAS,CACzB,GAAGhI,KAAKizC,aAAc,OACtBjzC,KAAKizC,cAAe,EAEpB,MAAMzmC,EAAMumC,EAAkB/yC,KAAKgI,OAAQhI,KAAKiT,UAChD,IAAIrP,EAAMivC,EAAU5vC,IAAIuJ,GAexB,OAdI5I,GACFivC,EAAUjvC,IAAI4I,EAAK5I,EAAM,IAAIxC,KAG/BwC,EAAI7C,IAAIf,MAERA,KAAK4hB,cAAcvf,KAAK,CACtB+rB,IAAKpuB,KACL4C,KAAM,KACJkwC,EAAK/xC,IAAIf,KAAKgI,QACPhI,KAAKkiC,YAITliC,KAAKkoB,GAAE,E,CACNloB,KAAKizC,cACbjzC,KAAK4hB,cAAc3gB,OAAO,CAACmtB,IAAKpuB,M,CAIpC8yC,EAAK/xC,IAAIf,KAAKgI,QAEd,MAAMuG,EAAUvO,KAAKkoB,IAElBloB,KAAKizC,cACN1kC,EAAQ4J,SAAQ,KACdnY,KAAKizC,cAAe,CAAK,IAI7B,MAAMzmC,EAAMumC,EAAkB/yC,KAAKgI,OAAQhI,KAAKiT,UAC1CrP,EAAMivC,EAAU5vC,IAAIuJ,GAC1B,GAAG5I,EAAK,CACNA,EAAI3C,OAAOjB,MACX,MAAMyqC,EAAMvxB,MAAMC,KAAKvV,GACvBivC,EAAU5xC,OAAOuL,GAEjB,IAAI,IAAIwb,EAAI,EAAGnlB,EAAS4nC,EAAI5nC,OAAQmlB,EAAInlB,IAAUmlB,EAChDyiB,EAAIziB,GAAGka,Q,CAIX,OAAO3zB,CACT,EAGFqjC,eAAeC,OAAO,iBAAkBmB,E,gFCpTzB,MAAMa,EAKnB9zC,YAAYu0B,EAAuE5C,GACjF1xB,KAAKoL,UAAYC,SAASC,cAAc,OACxCtL,KAAKoL,UAAUmI,UAAUxS,IAAI,eAE7Bf,KAAKsD,OAAS+H,SAASC,cAAc,UACrCtL,KAAKsD,OAAOiQ,UAAUxS,IAAI,sBAE1Bf,KAAK+T,KAAO1I,SAASC,cAAc,QACnCtL,KAAK+T,KAAKR,UAAUxS,IAAI,QAAS,mBAEjCf,KAAKoL,UAAUM,OAAO1L,KAAKsD,OAAQtD,KAAK+T,OAExC,QAAiB/T,KAAKoL,WAAW,KAC/B,gBAAyB,IAAasmB,GAAShD,KAAK1uB,KAAKsD,OAAQgxB,EAAS,GAE9E,CAEO7O,QACOzlB,KAAKsD,OAAO8lB,WAAW,MAC/B0qB,UAAU,EAAG,EAAG9zC,KAAKsD,OAAO4jB,MAAOlnB,KAAKsD,OAAOgkB,OACrD,E,uECjBa,SAASysB,EAAgC14B,EAAmBqW,EAAa,CAAC,GACvF,MAAMpb,EAASjL,SAASC,cAAcomB,EAAQsiB,OAAS,IAAOtiB,EAAQuiB,MAAQ,MAAQ,UAuBtF,OAtBA39B,EAAO+E,UAAYA,GAAaqW,EAAQ3d,KAAO,UAAY2d,EAAQ3d,KAAO,IAEtE2d,EAAQnP,WACPmP,EAAQwiB,cACT59B,EAAO/C,UAAUxS,IAAI,cAGvB,OAAOuV,IAGNob,EAAQzP,YACT3L,EAAO/C,UAAUxS,IAAI,kBAGpB2wB,EAAQyiB,UACT79B,EAAO3I,aAAa,WAAY,QAG/B+jB,EAAQ1d,MACTsC,EAAO5K,QAAO,QAAKgmB,EAAQ1d,OAGtBsC,CACT,C,6DCrCA,MAKA,EALqB,CAACob,EAAwG,CAAC,KAC9G,OAAO,mCAAqCA,EAAQrW,UAAY,IAAMqW,EAAQrW,UAAY,IAAKqW,E,6DCDhH,MASA,EATmB,CAACrW,EAAoBqW,EAAuE,CAAC,KAC/F,OAAO,WAAY,OAAF,QAC9B3d,KAAMsH,QAAapX,GAChBytB,G,kLCoCP,SAAS0iB,EAAe1iB,GACtB,GAAGA,EAAQxvB,QAAS,MAAO,CAACwvB,EAAQ2iB,UAA0B3iB,EAAQxvB,SAAS6tB,OAAO+M,SAEtF,MAAM,KAAC/oB,EAAI,QAAEugC,EAAO,KAAEtgC,EAAI,QAAEC,EAAO,cAAE+2B,EAAa,wBAAEuJ,GAA2B7iB,EACzE9wB,EAAKyK,SAASC,cAAc,OAClC1K,EAAGya,UAAY,6BAA+BtH,EAAO,UAAYA,EAAO,IAErE,EAAA6G,YACD,OAAOha,GAGT,IAAI4zC,EAAc9iB,EAAQ8iB,YAQ1B,GAPIA,IACFA,EAAc9iB,EAAQ8iB,YAAcxgC,GAAO,QAAKA,EAAM0d,EAAQ+iB,UAAYppC,SAASC,cAAc,QAC9FomB,EAAQ1W,cACT,OAAaw5B,EAAa9iB,EAAQ1W,cAInCs5B,EAAS,CACV,MAAMI,EAAcrpC,SAASC,cAAc,QAC3CopC,EAAYnhC,UAAUxS,IAAI,sBAC1BH,EAAG8K,OAAOgpC,GAEVhjB,EAAQxD,aAAc,OAAU,CAC9B9iB,UAAWspC,EACXlY,MAAO8X,EACPnY,SAAU,GACVC,UAAW,GACXE,kBAAkB,EAClBqY,UAAU,EACVlY,QAAQ,EACRmY,WAAaltC,GACJmtC,MAAMntC,GACZ4G,MAAMwmC,GAAaA,EAAS9gC,SAC5B1F,MAAM0F,IACL,MAAM+gC,EAAQ,gBAA6B,sBAErChH,GADM,IAAIiH,WAAYC,gBAAgBjhC,EAAM,iBAClCuB,kBAMhB,OALAw4B,EAAIt1B,iBAAiB,QAAQ1T,SAASsjB,IACpCA,EAAK8B,eAAe,KAAM,OAAQ4qB,GAClC1sB,EAAK9c,MAAM2pC,OAASH,EACpB1sB,EAAK9c,MAAM4pC,YAAc,OAAO,KAE3B,OAAapH,EAAI3jB,UAAU,MAGrC9b,MAAMka,GAAQA,EAAI+O,aAAaloB,O,CAGpCmlC,EAAYjhC,UAAUxS,IAAI,sBAC1BH,EAAG8K,OAAO8oC,GAEV,MAAMY,IAAapK,KAAmBtZ,EAAQ0jB,SAgD9C,OA7CAnhC,IAAW,QAAiBrT,GAAiEmH,I,OAC3F,OAAYA,GAEZ,MAAMstC,GAAO,OAAgBttC,EAAE1H,OAAQ,YACpCg1C,IAASA,EAAK9hC,UAAUqB,SAAS,YAepCX,EAAQlM,IACyB,KAAT,QAArB,EAAA2pB,EAAQ4jB,qBAAa,0BAIpBF,GACF,YAGCpK,IAAkBuJ,IACnBvJ,EAAc3B,QAAuC,UAA7B2B,EAAcpW,MAAMhzB,OAA2BopC,EAAc3B,U,GAEtE3X,EAAQA,SAExBsZ,GACDpqC,EAAG8K,OAAOs/B,EAAcC,QAGD,IAAtBvZ,EAAQ2iB,YACT3iB,EAAQ2iB,UAAYhpC,SAASC,cAAc,OAG1ComB,EAAQ6jB,WACT30C,EAAG2S,UAAUxS,IAAI,gBAGZ,CAAC2wB,EAAQ2iB,UAA0B3iB,EAAQxvB,QAAUtB,GAAImvB,OAAO+M,QACzE,CAEO,SAAS0Y,GAAe,eAAC3jC,EAAc,QAAEgC,IAI9C,MAAMjT,EAAkByK,SAASC,cAAc,OAC/C1K,EAAG2S,UAAUxS,IAAI,YAEd8Q,GACDgC,EAAQ9O,SAASkrB,IACZA,EAAEyB,QACHzB,EAAEyB,QAAQ7f,eAAiBA,EAE3Boe,EAAEyB,QAAU,CAAC7f,iB,IAKnB,MAAM2gB,EAAQ3e,EAAQiH,IAAIs5B,GAG1B,OAFAxzC,EAAG8K,WAAU,OAAQ8mB,IAEd5xB,CACT,CAEe,SAAe60C,EAAW/jB,G,qCACvC,MAAM9wB,EAAK40C,EAAe9jB,GAE1B,aADMrM,QAAQqH,IAAIgF,EAAQ7d,QAAQiH,KAAI,EAAEoT,iBAAiBA,KAClDttB,CACT,E,0aClKO,SAAS80C,GAAwB,GACtC90C,EAAE,OACFsa,EAAM,QACNwW,EAAO,QACPvW,MAOYuW,aAAO,EAAPA,EAAS7f,gBAAiB6f,EAAQ7f,eAAe9Q,IAAIH,GAAMA,EAAGgN,iBAAiB0M,KAAK1Z,IAE5F,MAAmBmH,IACrB,IAAInH,EAAG2S,UAAUqB,SAAS,mBAAoB,OAAO,EAIrD,IAFA,OAAY7M,GAETnH,EAAG2S,UAAUqB,SAAS,aACvB,gBACK,CACL,MAAM24B,EAASryB,aAAM,EAANA,EAASnT,GAClB2mB,EAAO,KACX,MAAMinB,EAAa/0C,EAAGgX,cAAc,aACpC,gBAAkC+9B,EAAYx6B,EAAQ,EAGrDoyB,aAAkBloB,QACnBkoB,EAAOj/B,KAAKogB,GAEZA,G,IAIR,CAEe,SAASknB,GAAiB,cACvCzwB,EACAtT,eAAgBgkC,EAAoB,UACpCzqC,EAAS,UACTga,EAAS,QACTvR,EAAO,aACPiiC,EAAY,OACZ56B,EAAM,QACNC,EAAO,aACP46B,IAYG5wB,IACDA,EAAc8uB,OAAQ,GAGxB,MAAM39B,EAASlL,QAAAA,GAAa,OAAW,OAAQ+Z,GAC/C7O,EAAO/C,UAAUxS,IAAI,mBAErB,MAAM8Q,EAAiB,IAAI,IAE3B,IAAI3P,EAAsB8zC,EA6C1B,OA5CAN,EAAwB,CACtB90C,GAAI0V,EACJ4E,OAAcnT,IAAM,O,EAAD,K,OAAA,E,EAAA,YAEjB,SADM+tC,aAAY,EAAZA,EAAe/tC,GAClBiuC,EAGD,OAFAviC,aAAauiC,QACbA,OAAe/xC,GAIjB,MAEMgyC,QAFKhmB,EAEqBpc,GAFQ,OAAYoc,GAAI3Z,IAAU,QAAC,OAAkB,QAAlB,EAAc,QAAd,EAAAA,aAAM,EAANA,EAAQ/N,cAAM,8BAAI,QAAQ,KAAnF,IAAC0nB,EAGX,IAAIgmB,EAAgBpzC,OAClB,OAGF,MAAMqzC,EAAWh0C,QAAgB,OAAW,CAC1C2R,QAASoiC,EACTpkC,mBAEFqkC,EAAS3iC,UAAUxS,IAAIqkB,SAEjBlK,aAAM,EAANA,EAASnT,EAAGmuC,GAElB5/B,EAAO5K,OAAOwqC,SACR,SACR,E,YAzBmB,K,6QAyBlB,EACDxkB,QAAS,CACP7f,eAAgBgkC,GAElB16B,QAAS,KACPA,SAAAA,IAEA66B,EAAetiC,OAAOhR,YAAW,KAC/BqzC,SAAAA,IACAC,OAAe/xC,EACf4N,EAAeC,YACf+B,EAAQ9O,SAASuR,GAAWA,EAAOpU,aAAU+B,IAC7C/B,EAAQM,QAAQ,GACf,IAAI,IAIJ8T,CACT,C,uECnHe,MAAM6/B,EA8CnBp2C,cA7CiB,KAAAq2C,OAJL,GAKK,KAAAC,QALL,GAQK,KAAAC,OAAS,GACT,KAAAC,aAAe,GAGf,KAAAC,OAAS,CACxB,EAAG,IAAM,GAAM,IAAM,EAAG,IAAK,EAAG,IAAK,EAAG,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,GAAI,GACvE,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,GAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,GAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,IAGzD,KAAAC,WAAa,CAC5B,CAAC/5B,EAAG,GAAMC,EAAG,IACb,CAACD,EAAG,GAAMC,EAAG,IACb,CAACD,EAAG,IAAMC,EAAG,KACb,CAACD,EAAG,IAAMC,EAAG,IACb,CAACD,EAAG,GAAMC,EAAG,IACb,CAACD,EAAG,GAAMC,EAAG,IACb,CAACD,EAAG,IAAMC,EAAG,KACb,CAACD,EAAG,IAAMC,EAAG,KAEE,KAAA+5B,QAAU12C,KAAKy2C,WAAW5zC,OAiGnC,KAAA8zC,QAAW5uC,IACd/H,KAAK42C,2BAIR52C,KAAK62C,cAAgB9uC,EAAE+uC,YACC7yC,IAArBjE,KAAK+2C,cACN/2C,KAAK+2C,YAAcvL,sBAAsBxrC,KAAKg3C,c,EAU1C,KAAAA,YAAc,KACpB,MAAMtqC,EAAQ1M,KAAK62C,aAAe72C,KAAKu2C,aACvCv2C,KAAK62C,cAAgB72C,KAAKu2C,aAC1B,MAAMhrB,EAAO7e,EAAQ,EAAIlG,KAAKywC,MAAMvqC,GAASlG,KAAK0wC,KAAKxqC,GACpD6e,GACDvrB,KAAKm3C,kBAAkB5rB,GAEzBvrB,KAAK+2C,iBAAc9yC,CAAS,EAGtB,KAAAmzC,yBAA4BC,I,MAClC,IAAIjG,EAAexpC,EACnB,GAAGyvC,EAAa,CACd,MAAM3qC,EAAQ2qC,IACdjG,EAAO1kC,GAAS,EAChB,MAAM4qC,GAA0C,GCpKrBvsB,EDoKcre,ICnK5Bqe,EAAI,GDoKXwsB,EAAyC,QAAtB,EAAAv3C,KAAKw3C,yBAAiB,QAAI,EAE7CjsB,GADOvrB,KAAKw3C,kBAAoBx3C,KAAKy3C,mBAAqBH,GAC5CC,EACjBhsB,IACDvrB,KAAK03C,mBAAqBnsB,EAC1BvrB,KAAKm3C,kBAAkB5rB,G,KAEpB,CACL,MAAMosB,EAAS33C,KAAK43C,QACpBhwC,EAAK+vC,EAAOziB,QACZkc,GAAQuG,EAAO90C,M,CC/Kd,IAA0BkoB,ED6L7B,OAXGnjB,GACD5H,KAAK63C,cAAcjwC,GAGlBwpC,IACDpxC,KAAK03C,uBAAoBzzC,EACzBjE,KAAKy3C,wBAAqBxzC,EAC1BjE,KAAKw3C,uBAAoBvzC,EACzBjE,KAAK42C,8BAA2B3yC,IAG1BmtC,CAAI,EArIZ,MAAM7lB,EAAOvrB,KAAKs2C,OAASt2C,KAAKw2C,OAAOx2C,KAAKw2C,OAAO3zC,OAAS,GAE5D,IAAI,IAAImlB,EAAI,EAAGnlB,EAAS7C,KAAKw2C,OAAO3zC,OAAQmlB,EAAInlB,IAAUmlB,EACxDhoB,KAAKw2C,OAAOxuB,GAAKhoB,KAAKw2C,OAAOxuB,GAAKuD,EAGpCvrB,KAAK83C,kBAAoB93C,KAAKw2C,OAAO17B,KAAI,CAACiQ,EAAG/C,EAAGyiB,K,MAC9C,OAAO1f,GAAe,QAAV,EAAA0f,EAAIziB,EAAI,UAAE,QAAI,EAAE,GAEhC,CAEQ+vB,SAASC,GACf,MAAMzK,GAAS,QAASyK,GACxB,MAAO,CAAC9vB,EAAGqlB,EAAO,GAAI0K,EAAG1K,EAAO,GAAItd,EAAGsd,EAAO,GAChD,CAEQ2K,aAAahjB,GACnB,MAAMijB,EAAYn4C,KAAKy2C,WAAW3mB,QAClCqoB,EAAU91C,QAAQ81C,EAAUhmB,OAAO,EAAG+C,IAEtC,MAAMqY,EAA2B,GACjC,IAAI,IAAIvlB,EAAI,EAAGA,EAAImwB,EAAUt1C,OAAQmlB,GAAK,EACxCulB,EAAOlrC,KAAK81C,EAAUnwB,IAExB,OAAOulB,CACT,CAEQ6K,iBAAiBC,EAAeC,EAAkBC,GACxD,MAAMC,EAAMx4C,KAAKk4C,aAAaG,GAC9B,IAAIE,EAAM,IAAuB,IAAjBA,EAAM11C,OACpB,MAAO,CAAC21C,GAGV,MACMC,EADUz4C,KAAKk4C,eAAeG,EAAQr4C,KAAK02C,SACvB57B,KAAI,CAAC49B,EAAS3vC,KAC/B,CACL2T,GAAIg8B,EAAQh8B,EAAI87B,EAAIzvC,GAAK2T,GAAK47B,EAC9B37B,GAAI+7B,EAAQ/7B,EAAI67B,EAAIzvC,GAAK4T,GAAK27B,MAalC,OATkBC,EAAMz9B,KAAKpO,GACpB+rC,EAAU39B,KAAI,CAAC69B,EAAU5vC,KACvB,CACL2T,EAAG87B,EAAIzvC,GAAK2T,EAAIi8B,EAASj8B,EAAIhQ,EAC7BiQ,EAAG67B,EAAIzvC,GAAK4T,EAAIg8B,EAASh8B,EAAIjQ,OAMrC,CAEQksC,YAAYP,EAAeQ,GAEjC,OADkB74C,KAAKo4C,iBAAiBC,EAAOr4C,KAAKs2C,OAAQ,CAACuC,IAC5C,EACnB,CAEQC,WAAWvtB,GAGjB,IAFAvrB,KAAK+4C,OAASxtB,EAERvrB,KAAK+4C,OAAS/4C,KAAKs2C,QACvBt2C,KAAK+4C,OAAS/4C,KAAKs2C,SACdt2C,KAAKg5C,QAAUh5C,KAAK02C,UACvB12C,KAAKg5C,QAAUh5C,KAAK02C,SAIxB,KAAM12C,KAAK+4C,MAAQ,GACjB/4C,KAAK+4C,OAAS/4C,KAAKs2C,SACdt2C,KAAKg5C,OAAS,IACjBh5C,KAAKg5C,QAAUh5C,KAAK02C,QAG1B,CAaQS,kBAAkB5rB,GACxBvrB,KAAK84C,WAAWvtB,GAChB,MAAM0tB,EAASj5C,KAAK44C,YAAY54C,KAAKg5C,OAAQh5C,KAAK+4C,OAClD/4C,KAAKk5C,aAAaD,EACpB,CA6CQE,qBAAqBhB,GAC3B,MAAMvwC,EAAK5H,KAAKo5C,MAAMC,gBAAgBr5C,KAAKo2C,OAAQp2C,KAAKq2C,SAClDiD,EAAS1xC,EAAGgrC,KAElB,IAAIjV,EAAS,EACb,IAAI,IAAIhhB,EAAI,EAAGA,EAAI3c,KAAKq2C,UAAW15B,EAAG,CACpC,MACM48B,EADe58B,EAAI3c,KAAKq2C,QACS,GACjCmD,EAAmBD,EAAkBA,EAE3C,IAAI,IAAI78B,EAAI,EAAGA,EAAI1c,KAAKo2C,SAAU15B,EAAG,CACnC,MAEM+8B,EAFe/8B,EAAI1c,KAAKo2C,OAES,GAGjCsD,EAAc,IAFGlzC,KAAKmzC,KAAKF,EAAkBA,EAAkBD,GAG/DI,EAAQF,EAAcA,EAAc,GAAM,EAC1CG,EAAWrzC,KAAKszC,IAAIF,GACpBG,EAAWvzC,KAAKwzC,IAAIJ,GAEpBK,EAASzzC,KAAKC,IAAI,EAAKD,KAAKI,IAAI,EAAK,GAAM6yC,EAAkBM,EAAWR,EAAkBM,IAC1FK,EAAS1zC,KAAKC,IAAI,EAAKD,KAAKI,IAAI,EAAK,GAAM6yC,EAAkBI,EAAWN,EAAkBQ,IAEhG,IAAII,EAAc,EAEdjyB,EAAI,EACJ+vB,EAAI,EACJhoB,EAAI,EAER,IAAI,IAAIjI,EAAI,EAAGA,EAAIhoB,KAAKo6C,QAAQv3C,OAAQmlB,IAAK,CAC3C,MAGMqyB,EAAYJ,EAHH9B,EAAUnwB,GAAGtL,EAItB49B,EAAYJ,EAHH/B,EAAUnwB,GAAGrL,EAK5B,IAAIg8B,EAAWnyC,KAAKC,IAAI,EAAK,GAAMD,KAAKmzC,KAAKU,EAAYA,EAAYC,EAAYA,IACjF3B,GAAWA,EAAWA,EAAWA,EACjCwB,GAAexB,EAEfzwB,GAAKywB,EAAW34C,KAAKo6C,QAAQpyB,GAAGE,EAAI,IACpC+vB,GAAKU,EAAW34C,KAAKo6C,QAAQpyB,GAAGiwB,EAAI,IACpChoB,GAAK0oB,EAAW34C,KAAKo6C,QAAQpyB,GAAGiI,EAAI,G,CAGtCqpB,EAAO3b,KAAYzV,EAAIiyB,EAAc,IACrCb,EAAO3b,KAAYsa,EAAIkC,EAAc,IACrCb,EAAO3b,KAAY1N,EAAIkqB,EAAc,IACrCb,EAAO3b,KAAY,G,EAGvB,OAAO/1B,CACT,CAEQiwC,cAAcjwC,GACpB5H,KAAKo5C,MAAMmB,aAAa3yC,EAAI,EAAG,GAC/B5H,KAAKw6C,KAAK9wB,UAAU1pB,KAAKy6C,IAAK,EAAG,EAAGz6C,KAAKo2C,OAAQp2C,KAAKq2C,QACxD,CAEQ6C,aAAaf,GACnBn4C,KAAK63C,cAAc73C,KAAKm5C,qBAAqBhB,GAC/C,CAwBO9hB,KAAKz1B,GACVZ,KAAK43C,QAAU,GACf53C,KAAKg5C,OAAS,EACdh5C,KAAK+4C,MAAQ,EACb/4C,KAAK62C,aAAe,OACI5yC,IAArBjE,KAAK+2C,cACN2D,qBAAqB16C,KAAK+2C,aAC1B/2C,KAAK+2C,iBAAc9yC,GAGrB,MAAM02C,EAAS/5C,EAAGkU,aAAa,eAAeiT,MAAM,KAAK7W,UACzDlR,KAAKo6C,QAAUO,EAAO7/B,KAAKi6B,GAClB/0C,KAAK+3C,SAAShD,KAGnB/0C,KAAKy6C,MACPz6C,KAAKy6C,IAAMpvC,SAASC,cAAc,UAClCtL,KAAKy6C,IAAIvzB,MAAQlnB,KAAKo2C,OACtBp2C,KAAKy6C,IAAInzB,OAAStnB,KAAKq2C,QACvBr2C,KAAKo5C,MAAQp5C,KAAKy6C,IAAIrxB,WAAW,KAAM,CAACwxB,OAAO,KAGjD56C,KAAK66C,QAAUj6C,EACfZ,KAAKw6C,KAAOx6C,KAAK66C,QAAQzxB,WAAW,KAAM,CAACwxB,OAAO,IAClD56C,KAAKkiC,QACP,CAEOA,SACL,GAAGliC,KAAKo6C,QAAQv3C,OAAS,EAAG,CAC1B,MAAMkyC,EAAQ/0C,KAAKo6C,QAAQ,GAG3B,OAFAp6C,KAAKw6C,KAAKM,UAAY,OAAO/F,EAAM7sB,MAAM6sB,EAAMkD,MAAMlD,EAAM9kB,UAC3DjwB,KAAKw6C,KAAKO,SAAS,EAAG,EAAG/6C,KAAKo2C,OAAQp2C,KAAKq2C,Q,CAI7C,MAAMmC,EAAMx4C,KAAK44C,YAAY54C,KAAKg5C,OAAQh5C,KAAK+4C,OAC/C/4C,KAAKk5C,aAAaV,EACpB,CAEOwC,eAAe3D,G,QACpB,GAAGr3C,KAAKo6C,QAAQv3C,OAAS,EACvB,OAGF,GAAGw0C,EAMD,OALAr3C,KAAK03C,kBAAoB13C,KAAKs2C,QAAgC,QAAtB,EAAAt2C,KAAK03C,yBAAiB,QAAI,GAClE13C,KAAKy3C,mBAAqBz3C,KAAK03C,kBAC/B13C,KAAKw3C,uBAAoBvzC,EACzBjE,KAAK42C,0BAA2B,OAChC,QAAc52C,KAAKo3C,yBAAyB98B,KAAKta,KAAMq3C,GAAcr3C,MAIvE,MAAM64C,EAAO74C,KAAK+4C,MACZkC,EAAQj7C,KAAKs2C,OAEnB,IAAI4E,EAEJ,MAAM3C,EAAkB,GACxB,IAAI,IAAIvwB,EAAI,EAAGnlB,EAAS7C,KAAK83C,kBAAkBj1C,OAAQmlB,EAAInlB,IAAUmlB,EAAG,CACtE,MAAMmzB,EAAMn7C,KAAK83C,kBAAkB9vB,GACnC,IAAItb,GAAqB,QAAZ,EAAA6rC,EAAMvwB,EAAI,UAAE,QAAI6wB,GAAQsC,GAEjCzuC,EAAM8T,QAAQ,GAAKy6B,QAA4Bh3C,IAAnBi3C,IAC9BA,EAAiBlzB,EACjBtb,GAASuuC,GAGX1C,EAAMl2C,KAAKqK,E,CAMb,CAH0B6rC,EAAMzoB,MAAM,EAAGorB,QACCj3C,IAAnBi3C,EAA+B3C,EAAMzoB,MAAMorB,GAAkB,IAEhDn2C,SAAQ,CAACwzC,EAAOxvC,EAAKqyC,KACvD,MAAMC,EAAO9C,EAAMA,EAAM11C,OAAS,GAOlC,QANYoB,IAATo3C,GAAsBA,EAAOJ,IAC9B1C,EAAMA,EAAM11C,OAAS,IAAMw4C,EAAK76B,QAAQ,IAG1CxgB,KAAK+4C,MAAQsC,QAAAA,EAAQ,GAEjB9C,EAAM11C,OACR,OAGF,MAAMs1C,EAAYn4C,KAAKo4C,iBAAiBp4C,KAAKg5C,OAAQiC,EAAO1C,GACzDxvC,IAASqyC,EAAOv4C,OAAS,KACrB7C,KAAKg5C,QAAUh5C,KAAK02C,UACvB12C,KAAKg5C,QAAUh5C,KAAK02C,SAIxB,MAAMhS,EAAMyT,EAAUr9B,KAAK09B,GAClBx4C,KAAKm5C,qBAAqBX,KAGnCx4C,KAAK43C,QAAQv1C,QAAQqiC,EAAI,IAG3B1kC,KAAK42C,0BAA2B,GAChC,QAAc52C,KAAKo3C,yBAA0Bp3C,KAC/C,CAIOs7C,cAAchwB,GAcrB,CAEO5P,UACL1b,KAAKs7C,eAAc,EAErB,CAEO7kC,oBAAoBkkC,GACzB,MAAMr3C,EAAS+H,SAASC,cAAc,UAOtC,OANAhI,EAAO4jB,MAjZG,GAkZV5jB,EAAOgkB,OAlZG,QAmZIrjB,IAAX02C,IACDr3C,EAAOymB,QAAQ4wB,OAASA,GAGnBr3C,CACT,CAEOmT,cAAckkC,GACnB,MAAMr3C,EAAStD,KAAKu7C,aAAaZ,GAC3Ba,EAAmB,IAAIrF,EAG7B,OAFAqF,EAAiBnlB,KAAK/yB,GAEf,CAACk4C,mBAAkBl4C,SAC5B,E,0lBElYF,MAAMm4C,EAAoB3gC,GACjB,IAAIA,EAAIywB,UAAUmQ,QAAO,CAACC,EAAK5wB,IAAM4wB,EAAM5wB,EAAEljB,MAAM,GAK5D,MAAM+zC,UAAqB,IA+BzB77C,YAAY2xB,GAWVxf,OAAM,GAvCD,KAAA2pC,aAAyC,IAAIt6C,IAC7C,KAAAq0B,aAAc,EA6Fb,KAAAkmB,YAAe/zC,IAErB,MAAM7F,GAAU,EAAA+e,EAAA,GAAgBlZ,EAAE1H,OAAQL,KAAK+7C,uBAC/C,GAAgB,IAAbh0C,EAAEuO,OACH,OAGF,GAAGtW,KAAKg8C,eAAiBh8C,KAAKg8C,aAAaj0C,EAAG7F,GAC5C,OAGF,MAAM4wC,EAAqC,IAAIvxC,IAC/C,IAAI06C,EAaAC,EAAch6C,EAElB,MAAMi6C,EAAiB,CAACj6C,EAAsBk6C,GAAe,KAC3D,MAAMn0C,GAAO/F,EAAQ6nB,QAAQ9hB,IAC7B,IAAIA,IAAQ/F,EAAQ6nB,QAAQ/hB,OAAQ,OACpC,MAAMA,EAAS9F,EAAQ6nB,QAAQ/hB,OAAOyuB,YAElC,EAAA4lB,EAAA,GAAQH,KACVA,EAAch6C,GAGhB,IAAIo6C,EAAUxJ,EAAK7vC,IAAI+E,GAKvB,GAJIs0C,GACFxJ,EAAKlvC,IAAIoE,EAAQs0C,EAAU,IAAIl7C,KAG9Bk7C,EAAQj5C,IAAI4E,GACb,OAGF,MAAMyuB,EAAa12B,KAAK22B,cAAc3uB,EAAQC,GAQ9C,QAPiBhE,IAAdg4C,IAEDA,GAAavlB,GAGf4lB,EAAQv7C,IAAIkH,GAERg0C,IAAcvlB,IAAiBulB,GAAavlB,EAAa,CAC3D,MAAM6lB,EAAad,EAAiB3I,GACpC,GAAG9yC,KAAK+1B,iBAAmBqmB,EAAc,CACpCG,EAAa,IACX,EAAAC,EAAA,GAAct6C,EAASg6C,KACxBA,EAAch6C,GAIlB,MAAMu6C,EAAkBz8C,KAAK08C,mBAAmBR,EAAah6C,GAE1Du6C,EAAgB55C,QACjB45C,EAAgB13C,SAAS7C,IACvBi6C,EAAej6C,GAAS,EAAM,G,CAKpC,GAAIlC,KAAK67C,aAAah0C,KAQZ7H,KAAK+1B,iBACb/1B,KAAK+1B,gBAAgB7zB,QARrB,GAAkB,IAAfq6C,GAAoBv8C,KAAK28C,YAC1B,IAAI,MAAO30C,EAAQ8jC,KAASgH,EAC1B,IAAI,MAAM7qC,KAAO6jC,EACf9rC,KAAK28C,YAAY30C,EAAQC,E,GAWrC,IAAI20C,GAAoB,EACxB,MAAMC,EAAe90C,IACf60C,KACF,EAAA3mB,EAAA,KACA2mB,GAAoB,GAYtB,MAAM16C,EAAUlC,KAAK88C,qBAAqB/0C,EAAE1H,QAC5C,GAAI6B,EAKJ,OAAGlC,KAAK+8C,wBAA0B/8C,KAAK+8C,sBAAsBh1C,EAAG7F,EAAS+5C,IACvEj8C,KAAK6R,eAAemrC,aAAah9C,KAAKi9C,cAAe,YAAaJ,QAClE78C,KAAK6R,eAAemrC,aAAa3xC,SAAU,UAAWwX,EAAWq6B,SAInEf,EAAej6C,EAAQ,EAGnB2gB,EAAa9a,IACd+qC,EAAKjrC,OACN,QAAiB6L,OAAQ0G,EAAA,EAAa,CAACpF,SAAS,EAAM/G,MAAM,EAAMwjB,SAAS,IAG7EzxB,KAAK6R,eAAemrC,aAAah9C,KAAKi9C,cAAe,YAAaJ,IAIlE,EAAA5mB,EAAA,IAAiB,EAGbinB,EAA0B,CAACjvC,MAAM,GACvCjO,KAAK6R,eAAe9Q,IAAIf,KAAKi9C,cAA7Bj9C,CAA4C,YAAa68C,GACzD78C,KAAK6R,eAAe9Q,IAAIsK,SAAxBrL,CAAkC,UAAW6iB,EAAWq6B,EAAwB,EAG1E,KAAAR,mBAAqB,CAACS,EAAoB9B,KAChD,GAAG8B,IAAU9B,EACX,MAAO,GAGT,MAAM+B,EAAYD,EAAMz/B,wBAClB2/B,EAAWhC,EAAK39B,wBAEhB4/B,GADcF,EAAUp4B,IAAMq4B,EAASr4B,KAASo4B,EAAUt4B,KAAOu4B,EAASv4B,MAClD,EAExB8a,GAAS,EAAA3e,EAAA,GAAgBk8B,EAAOn9C,KAAKu9C,8BAC3C,IAAI3d,EACF,MAAO,GAGT,MAAM1W,EAAWhQ,MAAMC,KAAKymB,EAAOnnB,iBAAiBzY,KAAKw9C,6BACzD,IAAIC,EAAav0B,EAAS/O,QAAQgjC,GAC9BO,EAAYx0B,EAAS/O,QAAQkhC,GAUjC,OARIiC,KACDI,EAAWD,GAAc,CAACA,EAAYC,IAG3Bx0B,EAAS4G,MAAM2tB,EAAa,EAAGC,EAIjC,EAmIP,KAAAznB,gBAAwB0nB,GAA2B,EAAD,gCACpDA,IAAc39C,KAAK29C,cAAe,GACrC39C,KAAK49C,0BAA2B59C,KAAK49C,qBACrC59C,KAAK67C,aAAap2B,QAClBzlB,KAAK69C,mBACL,EAAA5nB,EAAA,KACG0nB,IAAc39C,KAAK29C,kBAAe15C,EACvC,KAhWE,EAAAk0B,EAAA,GAAWn4B,KAAM0xB,GAEjB1xB,KAAK89C,eAAiB,gBAAiB,EAAAC,EAAA,IACzC,CAEOC,gBAAgBf,EAA4BprC,GAQjD,GAPG7R,KAAKi9C,eACNj9C,KAAK6R,eAAeC,YAGtB9R,KAAKi9C,cAAgBA,EACrBj9C,KAAK6R,eAAiBA,EAElBorC,EAIJ,OAAG,KACDprC,EAAe9Q,IAAIk8C,EAAnBprC,CAAkC,YAAY,KACxC7R,KAAK41B,cACT51B,KAAKi+C,aCvGRvqC,OAAOwqC,aACDxqC,OAAOwqC,eAAeC,WAErB9yC,SAASsqB,UAEVtqB,SAASsqB,UAAUyoB,cAAcpqC,KAGnC,GD+FoC,SAGvC,EAAAmiB,EAAA,GAA0B,CACxBj0B,QAAS+6C,EACT7mB,SAAWruB,IACT,GAAG/H,KAAK41B,aAAgB51B,KAAKq+C,uBAAyBr+C,KAAKq+C,uBAAyB,OAGpFhzC,SAASI,KAAK8H,UAAUxS,IAAI,aAC5Bk8C,EAAcrvC,iBAAiB,YAAa7F,KAC1C,EAAAqS,EAAA,GAAYrS,GACZsD,SAASI,KAAK8H,UAAU/Q,OAAO,YAAY,GAG1C,CAACyL,MAAM,EAAM+G,SAAS,KAEzB,EAAAihB,EAAA,KAEA,MAAM/zB,EAAUlC,KAAK88C,qBAAqB/0C,EAAE1H,QACzC6B,GACDlC,KAAK+1B,gBAAgB7zB,E,EAGzB2P,yBAMJA,EAAe9Q,IAAIk8C,EAAnBprC,CAAkC,YAAa7R,KAAK87C,YACtD,CAsKUwC,0BAA0Bp8C,GAClC,OAAOlC,KAAK22B,cAAcz0B,EAAQ6nB,QAAQ/hB,OAAOyuB,YAAav0B,EAAQ6nB,QAAQ9hB,IAChF,CAEUs2C,eAAer8C,EAAsB8oC,GAC7C9oC,EAAQ8V,QAAQgzB,EAAcC,MAChC,CAEOvL,sBAAsBx9B,EAAsB2sB,GACjD,MAAM2vB,IAAgBx+C,KAAKy+C,4BAA4Bv8C,GACvD,GAAG2sB,EAAM,CACP,GAAG2vB,EACD,OAAO,EAGT,MAAMxT,EAAgB,IAAI,IAAc,CACtC9yB,KAAMhW,EAAQ6nB,QAAQ9hB,IACtB0B,OAAO,IAIN3J,KAAK41B,aACH51B,KAAKs+C,0BAA0Bp8C,KAChC8oC,EAAcpW,MAAMyU,SAAU,EAC9BnnC,EAAQqR,UAAUxS,IAAI,gBAI1Bf,KAAKu+C,eAAer8C,EAAS8oC,E,MACrBwT,IACRx+C,KAAKy+C,4BAA4Bv8C,GAAS+W,cAAczW,UACxD,OAAc,CACZN,UACAmZ,UAAW,cACXqjC,UAAU,EACV73C,SAAU,OAId,OAAO,CACT,CAEU43C,4BAA4Bv8C,G,MACpC,MAA8C,WAAd,QAAzB,EAAAA,EAAQqT,yBAAiB,eAAEsL,UAChC3e,EAAQqT,kBAAkBA,iBAC9B,CAEgBopC,gBAAgBC,GAAiB,G,+CAC/C,MAAM/2C,EAAO7H,KAAK67C,aAAah0C,KAC/B,IAAIA,IAAS+2C,EAAgB,OAE7B,IAAIC,GAAeh3C,EACjBi3C,GAAcj3C,EAChB,MAAMk3C,GAAYl3C,EAClB,IAAI,MAAOG,EAAQ8jC,KAAS9rC,KAAK67C,aAAc,CAC7C,MAAMmD,EAAiC,GAAGh3C,KAAUhI,KAAKgK,YAAc,YAAc,YAC/Eke,QAAUloB,KAAKiH,SAAS8G,mBAAmBkxC,sBAAsBD,EAAY9lC,MAAMC,KAAK2yB,IAI9F,GAHA+S,EAAc32B,EAAE22B,YAChBC,EAAa52B,EAAE42B,WAEZD,GAAeC,EAAY,K,CAGV,QAAtB,EAAA9+C,KAAKk/C,yBAAiB,mBAAGL,EAAaC,EAAYC,E,IAG7ClB,gBAAgBsB,GAAmB,EAAMP,GAAiB,G,MAC/D,MAAMQ,EAAep/C,KAAK41B,YACpB/tB,EAAO7H,KAAK67C,aAAah0C,KAG/B,GAFA7H,KAAK41B,cAAgB/tB,GAAQ+2C,EAE1BQ,IAAiBp/C,KAAK41B,YAAa,OAAO,EAE7C51B,KAAKoJ,cAAc,SAAUpJ,KAAK41B,aAY9B,MACF51B,KAAKi9C,cAAc1pC,UAAU1J,OAAO,YAAa7J,KAAK41B,aAEnDwpB,IAED,EAAAnpB,EAAA,OAaJ,EAAAopB,EAAA,KAEA,MAAMX,IAAa72C,GAAQ+2C,EACrBU,EAAqC,QAAtB,EAAAt/C,KAAKu/C,yBAAiB,yBAAGb,GAAW1+C,KAAK29C,cAmB9D,OAjBI,EAAAtwB,mBACCqxB,EACDl5B,EAAA,WAAiC,CAC/B5jB,KAAM5B,KAAK89C,eACX3wB,MAAO,KACLntB,KAAKi2B,iBAAiB,IAI1BzQ,EAAA,eAAqCxlB,KAAK89C,iBAI3Cc,IACAU,GAAgBj6B,QAAQlX,WAAWG,MAAK,IAAMtO,KAAK2+C,gBAAgBC,MAG/D,CACT,CAWOljC,UACL1b,KAAK29C,cAAe,EACpB39C,KAAK67C,aAAap2B,QAClBzlB,KAAK69C,iBAAgB,GACrB79C,KAAK29C,kBAAe15C,CACtB,CAEUu7C,uBAAuBt9C,EAAsBw0B,GACrD12B,KAAK0/B,sBAAsBx9B,GAAS,GACtBlC,KAAKy+C,4BAA4Bv8C,GACzCmnC,QAAU3S,EAEhB12B,KAAK69C,kBACL79C,KAAK2+C,mBACL,OAAc,CACZz8C,UACAmZ,UAAW,cACXqjC,SAAUhoB,EACV7vB,SAAU,KAEd,CAEO8vB,cAAc3uB,EAAgBC,GACnC,MAAMrE,EAAM5D,KAAK67C,aAAa54C,IAAI+E,GAClC,OAAOpE,aAAG,EAAHA,EAAKP,IAAI4E,EAClB,CAEOpF,SACL,OAAO44C,EAAiBz7C,KAAK67C,aAC/B,CAEU4D,UAAUz3C,EAAgBC,EAAay3C,GAC/C,IAAI97C,EAAM5D,KAAK67C,aAAa54C,IAAI+E,GAqChC,OApCG03C,QAA0Bz7C,IAAby7C,IAA0B97C,aAAG,EAAHA,EAAKP,IAAI4E,IAC9CrE,IACDA,EAAI3C,OAAOgH,GAEPrE,EAAIiE,MACN7H,KAAK67C,aAAa56C,OAAO+G,KAuBzBpE,IACFA,EAAM,IAAIxC,IACVpB,KAAK67C,aAAaj4C,IAAIoE,EAAQpE,IAGhCA,EAAI7C,IAAIkH,KAGH,CACT,CAKO03C,mBAAmB33C,EAAgB8jC,GACxC,MAAMloC,EAAM5D,KAAK67C,aAAa54C,IAAI+E,GAC9BpE,IAIJkoC,EAAK/mC,SAASkD,IACZrE,EAAI3C,OAAOgH,EAAI,IAGbrE,EAAIiE,MACN7H,KAAK67C,aAAa56C,OAAO+G,GAG3BhI,KAAK2+C,kBACL3+C,KAAK69C,kBACP,EAGK,MAAM+B,UAAwBhE,EASnC77C,YAAoBy1B,EAA6BvuB,EAAuB4K,GACtEK,MAAM,CACJjL,WACA+0C,aAAc,CAACj0C,EAAG1H,MAAaA,GAAUL,KAAK41B,YAC9CknB,qBAAuBz8C,IAAW,EAAA4gB,EAAA,GAAgB5gB,EAAQ,qBAC1D07C,sBAAuB,oBACvBwB,6BAA8B,WAC9BC,2BAA4B,uBAPZ,KAAAhoB,YAAAA,EAqCb,KAAAO,gBAAmB7zB,IACxB,MAAM+F,GAAO/F,EAAQ6nB,QAAQ9hB,IACvBD,EAAS9F,EAAQ6nB,QAAQ/hB,OAAOyuB,WAElCz2B,KAAKy/C,UAAUz3C,EAAQC,IAI3BjI,KAAKw/C,uBAAuBt9C,EAASlC,KAAK22B,cAAc3uB,EAAQC,GAAK,EAGhE,KAAA00C,YAAc,CAAC30C,EAAgBC,KACpC,MAAM/F,EAAUlC,KAAKw1B,YAAYiD,SAASc,WAAW3hB,cAAc,oCAAoC5P,iBAAsBC,OAC7HjI,KAAK+1B,gBAAgB7zB,EAAQ,EAGrB,KAAAg9C,kBAAoB,CAACL,EAAsBC,EAAqBC,KACxE,MAAMl8C,EAAS7C,KAAK6C,UACpB,EAAAgqB,EAAA,GAAe7sB,KAAK6/C,kBAAkB,QAAK,WAAY,CAACh9C,KACxD7C,KAAK8/C,iBAAiBvsC,UAAU1J,OAAO,OAAmB,IAAXhH,GAC/C7C,KAAK61B,oBAAoBtiB,UAAU1J,OAAO,OAAQg1C,GAClD7+C,KAAKk2B,oBAAsBl2B,KAAKk2B,mBAAmB3iB,UAAU1J,OAAO,OAAQi1C,EAAW,EAG/E,KAAAS,kBAAoB,CAACb,EAAmB9kB,KAyBhD,IAxBA,OAAc,CACZ13B,QAASlC,KAAKw1B,YAAY6C,uBAC1Bhd,UAAW,eACXqjC,WACA73C,SAAU+yB,EAAU,IAAM,EAC1B1B,gBAAiB,KACXl4B,KAAK41B,cACP51B,KAAK+/C,mBAAmBv9C,SACxBxC,KAAK+/C,mBACH//C,KAAK61B,oBACL71B,KAAKk2B,mBACL,KACFl2B,KAAKi+C,kBAAeh6C,E,KAK1B,OAAc,CACZ/B,QAASlC,KAAKw1B,YAAYpqB,UAC1BiQ,UAAW,eACXqjC,WACA73C,SAAU,MAGT7G,KAAK41B,cACF51B,KAAK+/C,mBAAoB,CAC3B,MAAMC,EAAa,yBACnBhgD,KAAK+/C,mBAAqB10C,SAASC,cAAc,OACjDtL,KAAK+/C,mBAAmBxsC,UAAUxS,IAAIi/C,EAAa,cAEnD,MAAMC,GAAY,OAAW,SAASD,WAAqB,CAACz9B,UAAU,KACtE,QAAiB09B,GAAW,IAAMjgD,KAAKi2B,mBAAmB,CAACpkB,eAAgB7R,KAAK6R,eAAgB5D,MAAM,IAEtGjO,KAAK6/C,iBAAmBx0C,SAASC,cAAc,OAC/CtL,KAAK6/C,iBAAiBtsC,UAAUxS,IAAIi/C,EAAa,UAEjDhgD,KAAK8/C,kBAAmB,OAAW,WAAWE,UAE9C,MAAME,EAAyC,CAACruC,eAAgB7R,KAAK6R,iBACrE,QAAiB7R,KAAK8/C,kBAAkB,KACtC,MAAM93C,EAAS,IAAIhI,KAAK67C,aAAaz3C,QAAQ,GACvC6D,EAAM,IAAIjI,KAAK67C,aAAa54C,IAAI+E,IAAS,GAC/ChI,KAAKi2B,kBAELP,EAAA,gBAA0B,CAAC1tB,SAAQmL,UAAWlL,GAAK,GAClDi4C,GAEHlgD,KAAK61B,qBAAsB,OAAW,WAAWmqB,cACjD,QAAiBhgD,KAAK61B,qBAAqB,KACzC,MAAMsqB,EAAwC,CAAC,EAC/C,IAAI,MAAOC,EAAYtU,KAAS9rC,KAAK67C,aACnCsE,EAAIC,GAAclnC,MAAMC,KAAK2yB,GAAM9b,MAAK,CAACvb,EAAGwb,IAAMxb,EAAIwb,IAGxD,IAAI,IAAakwB,GAAK,KACpBngD,KAAKi2B,iBAAiB,GACtB,GACDiqB,GAEAlgD,KAAKqgD,YACNrgD,KAAKk2B,oBAAqB,OAAW,iBAAiB8pB,aACtD,QAAiBhgD,KAAKk2B,oBAAoB,KACxC,MAAMluB,EAAS,IAAIhI,KAAK67C,aAAaz3C,QAAQ,GAC7C,IAAI,IAAoB4D,EAAQ,IAAIhI,KAAK67C,aAAa54C,IAAI+E,IAAU,QAAQ,KAC1EhI,KAAKi2B,iBAAiB,GACtB,GACDiqB,IAGLlgD,KAAK+/C,mBAAmBr0C,UAAU,CAChCu0C,EACAjgD,KAAK6/C,iBACL7/C,KAAK8/C,iBACL9/C,KAAK61B,oBACL71B,KAAKk2B,oBACLnG,OAAO+M,UAET,MAAMwjB,EAAoBtgD,KAAK+/C,mBAC/BO,EAAkB/0C,MAAM+c,QAAU,IAClCtoB,KAAKw1B,YAAY6C,uBAAuB3sB,OAAO40C,GAE1CA,EAAkBj5B,WACvBi5B,EAAkB/0C,MAAM+c,QAAU,E,GAtItCtoB,KAAKqgD,WAAa7qB,EAAYwC,WAC9Bh4B,KAAKg+C,gBAAgBxoB,EAAYpqB,UAAWyG,EAC9C,CAYOgsC,gBAAgBsB,GAAmB,EAAMP,GAAiB,GAC/D,MAAMp2B,EAAMtW,MAAM2rC,gBAAgBsB,EAAkBP,GASpD,OAPGp2B,GAAO22B,GACSjmC,MAAMC,KAAKnZ,KAAKw1B,YAAYuD,cAActgB,iBAAiB,uBACnE1T,SAAS7C,IAChBlC,KAAK0/B,sBAAsBx9B,EAASlC,KAAK41B,YAAY,IAIlDpN,CACT,EAmHa,MAAM+3B,UAAsB3E,EAUzC77C,YACUygD,EACAC,EACA7rB,EACR3tB,GAEAiL,MAAM,CACJjL,WACA61C,qBAAuBz8C,IAAW,EAAA4gB,EAAA,GAAgB5gB,EAAQ,kBAAmB,EAAA4gB,EAAA,GAAgB5gB,EAAQ,UACrG27C,aAAc,CAACj0C,EAAG1H,OAGHL,KAAK67C,aAAah0C,OAC3BE,EAAE1H,OAAuBkT,UAAUqB,SAAS,YAC5C7M,EAAE1H,OAAuBkT,UAAUqB,SAAS,uBAC9CvU,GAIJ08C,sBAAuB,CAACh1C,EAAG7F,EAAS+5C,MACtBl0C,EAAE1H,SAAW6B,IACrB6F,EAAE1H,OAAuBkT,UAAUqB,SAAS,4BAChC3Q,IAAdg4C,IACCj8C,KAAK67C,aAAah0C,MAGvBw2C,qBAAsB,KAAOr+C,KAAKwgD,KAAK5rB,MAAM8rB,UAC7C3E,sBAAuB,SACvBwB,6BAA8B,gBAC9BC,2BAA4B,qDAC5BxzC,YAA2B,cAAdw2C,EAAK5+C,OA7BZ,KAAA4+C,KAAAA,EACA,KAAAC,QAAAA,EACA,KAAA7rB,MAAAA,EAwEH,KAAAmB,gBAAmB4qB,IACxB,IAAI3gD,KAAK4gD,gBAAgBD,GAAS,OAElC,MAAM14C,GAAO04C,EAAO52B,QAAQ9hB,IAG5B,GADkB04C,EAAOptC,UAAUqB,SAAS,cAC5C,CACE,IAAI5U,KAAK6gD,wBAAwBF,GAAS,CACxC,MAAM/8C,EAAM5D,KAAK67C,aAAa54C,IAAIjD,KAAKwgD,KAAKx4C,QACzCpE,GAEY5D,KAAK8gD,0BAA0BH,GACvC57C,SAASkD,GAAQrE,EAAI3C,OAAOgH,I,CAIdjI,KAAKygD,QAAQM,sBAAsBJ,GAAQ7lC,IAAI9a,KAAK+1B,gB,MAK7E,GAAI/1B,KAAKy/C,UAAUz/C,KAAKwgD,KAAKx4C,OAAQC,GAArC,CAKA,GADsB04C,EAAOptC,UAAUqB,SAAS,gBAC9B,CAChB,MAAMosC,GAAiB,EAAA//B,EAAA,GAAgB0/B,EAAQ,UACzCM,EAAoBjhD,KAAK6gD,wBAAwBG,GACjDE,EAAwBlhD,KAAKkhD,sBAAsBF,IAEtCE,GAAyBD,IAE1CjhD,KAAKw/C,uBAAuBwB,EAAgBE,E,CAIhDlhD,KAAKw/C,uBAAuBmB,EAAQ3gD,KAAK22B,cAAc32B,KAAKwgD,KAAKx4C,OAAQC,G,CAAK,EAGtE,KAAA00C,YAAc,CAAM30C,EAAgBC,IAAgB,EAAD,gCAC3D,MAAMk5C,QAAgBnhD,KAAKygD,QAAQW,iBAAiBn5C,GACjDk5C,GACDnhD,KAAK+1B,gBAAgBorB,EAAQR,OAEjC,IAwDU,KAAApB,kBAAoB,CAAMb,EAAmB9kB,IAAqB,EAAD,gCACzE,MAAM,eAACynB,EAAc,UAAEC,EAAS,QAAEC,SAAiBvhD,KAAKwgD,KAAK5rB,MAAM4sB,OAAO5nB,IAE1E,OAAc,CACZ13B,QAASlC,KAAKi9C,cACd5hC,UAAW,eACXqjC,WACA73C,SAAU+yB,EAAU,IAAM,EAC1B1B,gBAAiB,KACXl4B,KAAK41B,cACP51B,KAAKyhD,sBAAsBj/C,SAC3BxC,KAAKyhD,sBACHzhD,KAAK+/C,mBACL//C,KAAK0hD,oBACL1hD,KAAK61B,oBACL71B,KAAKk2B,mBACLl2B,KAAK2hD,cACL3hD,KAAK4hD,eACL,KACF5hD,KAAKi+C,kBAAeh6C,E,IAW1B,MAAM49C,EAAoBP,EAAYC,OAAUt9C,EAA6B,EAAjBo9C,EAC5D,GAAGrhD,KAAK41B,aACN,IAAI51B,KAAK+/C,mBAAoB,CAC3B//C,KAAKyhD,sBAAwBp2C,SAASC,cAAc,OACpDtL,KAAKyhD,sBAAsBluC,UAAUxS,IAAI,qBAAsB,qBAK/Df,KAAK+/C,mBAAqB10C,SAASC,cAAc,OACjDtL,KAAK+/C,mBAAmBxsC,UAAUxS,IAAI,uBAEtC,MAAMm/C,EAAyC,CAACruC,eAAgB7R,KAAK6R,gBAC/DouC,GAAY,OAAW,QAAS,CAAC19B,UAAU,KACjD,QAAiB09B,GAAW,IAAMjgD,KAAKi2B,mBAAmB,CAAChoB,MAAM,EAAM4D,eAAgB7R,KAAK6R,iBAE5F7R,KAAK6/C,iBAAmBx0C,SAASC,cAAc,OAC/CtL,KAAK6/C,iBAAiBtsC,UAAUxS,IAAI,6BAEd,cAAnBf,KAAKwgD,KAAK5+C,MACX5B,KAAK0hD,qBAAsB,OAAO,2EAA4E,CAAC3tC,KAAM,UACrH/T,KAAK0hD,oBAAoBh2C,QAAO,QAAK,yBACrC,QAAiB1L,KAAK0hD,qBAAqB,KACzC,IAAI,IAAa1hD,KAAKwgD,KAAKx4C,OAAQ,IAAIhI,KAAK67C,aAAa54C,IAAIjD,KAAKwgD,KAAKx4C,UAAU,KAC/EhI,KAAKi2B,iBAAiB,GACtB,GACDiqB,KAEHlgD,KAAK61B,qBAAsB,OAAO,oEAAqE,CAAC9hB,KAAM,YAC9G/T,KAAK61B,oBAAoBnqB,QAAO,QAAK,aACrC,QAAiB1L,KAAK61B,qBAAqB,KACzC,MAAMsqB,EAAwC,CAAC,EAC/C,IAAI,MAAOC,EAAYtU,KAAS9rC,KAAK67C,aACnCsE,EAAIC,GAAclnC,MAAMC,KAAK2yB,GAAM9b,MAAK,CAACvb,EAAGwb,IAAMxb,EAAIwb,IAGxD,IAAI,IAAakwB,GAAK,KACpBngD,KAAKi2B,iBAAiB,GACtB,GACDiqB,IAGLlgD,KAAKk2B,oBAAqB,OAAO,0EAA2E,CAACniB,KAAM,WACnH/T,KAAKk2B,mBAAmBxqB,QAAO,QAAK,YACpC,QAAiB1L,KAAKk2B,oBAAoB,KACxC,IAAI,IAAoBl2B,KAAKwgD,KAAKx4C,OAAQ,IAAIhI,KAAK67C,aAAa54C,IAAIjD,KAAKwgD,KAAKx4C,SAAUhI,KAAKwgD,KAAK5+C,MAAM,KACtG5B,KAAKi2B,iBAAiB,GACtB,GACDiqB,GAEH,MAAMp7B,EAAO9kB,KAAK2hD,cAAgBt2C,SAASC,cAAc,OACzDwZ,EAAKvR,UAAUxS,IAAI,4BACnB+jB,EAAKpZ,OAAOu0C,EAAWjgD,KAAK6/C,kBAE5B,MAAM96B,EAAQ/kB,KAAK4hD,eAAiBv2C,SAASC,cAAc,OAC3DyZ,EAAMxR,UAAUxS,IAAI,6BACpBgkB,EAAMrZ,UAAU,CACd1L,KAAK0hD,oBACL1hD,KAAK61B,oBACL71B,KAAKk2B,oBACLnG,OAAO+M,eAEgB74B,IAAtB49C,IACD/8B,EAAKvZ,MAAMkR,UAAY,eAAeolC,OACtC98B,EAAMxZ,MAAMkR,UAAY,cAAcolC,QAGxC7hD,KAAK+/C,mBAAmBr0C,OAAOoZ,EAAMC,GAGrC/kB,KAAKyhD,sBAAsBl2C,MAAM+c,QAAU,IAC3CtoB,KAAKyhD,sBAAsB/1C,OAAyB1L,KAAK+/C,oBACzD//C,KAAK40B,MAAMktB,eAAep2C,OAAO1L,KAAKyhD,uBAEjCzhD,KAAKyhD,sBAAsBp6B,WAEhCrnB,KAAKyhD,sBAAsBl2C,MAAM+c,QAAU,GAC3CxD,EAAKvZ,MAAMkR,UAAY,GACvBsI,EAAMxZ,MAAMkR,UAAY,E,OAElBzc,KAAK2hD,oBAAuC19C,IAAtB49C,IAC9B7hD,KAAK2hD,cAAcp2C,MAAMkR,UAAY,eAAeolC,OACpD7hD,KAAK4hD,eAAer2C,MAAMkR,UAAY,cAAcolC,OAExD,IAEU,KAAA3C,kBAAoB,CAACL,EAAsBC,EAAqBC,MACxE,EAAAlyB,EAAA,GAAe7sB,KAAK6/C,kBAAkB,QAAK,WAAY,CAAC7/C,KAAK6C,YAC7D7C,KAAK0hD,qBAAuB1hD,KAAK0hD,oBAAoBK,gBAAgB,WAAYhD,GACjF/+C,KAAK61B,qBAAuB71B,KAAK61B,oBAAoBksB,gBAAgB,WAAYlD,GACjF7+C,KAAKk2B,oBAAsBl2B,KAAKk2B,mBAAmB6rB,gBAAgB,WAAYjD,EAAW,EAGlF,KAAAlB,kBAAoB,IAAW,EAAD,gCAaxC,GAxRA,CAEOW,eAAeoC,EAAqB3V,GACzCA,EAAcC,MAAM13B,UAAUxS,IAAI,0BAE/B4/C,EAAOptC,UAAUqB,SAAS,sBAC3B+rC,EAAO/oC,cAAc,4BAA4BlM,OAAOs/B,EAAcC,OAEtE/4B,MAAMqsC,eAAeoC,EAAQ3V,EAEjC,CAEO6S,gBAAgBsB,GAAmB,EAAMP,GAAiB,GAC/D,MAAMp2B,EAAMtW,MAAM2rC,gBAAgBsB,EAAkBP,GAEpD,GAAGp2B,GAAO22B,EACR,IAAI,MAAMl3C,KAAOjI,KAAKygD,QAAQA,QAAS,CACrC,GAAGzgD,KAAKygD,QAAQuB,YAAY3+C,KAAK4E,GAC/B,SAGF,MAAM04C,EAAS3gD,KAAKygD,QAAQA,QAAQx4C,GACpCjI,KAAK0/B,sBAAsBihB,EAAQ3gD,KAAK41B,Y,CAI5C,OAAOpN,CACT,CAEOkX,sBAAsBihB,EAAqB9xB,GAChD,IAAI7uB,KAAK4gD,gBAAgBD,GAAS,OAElC,MAAMn4B,EAAMtW,MAAMwtB,sBAAsBihB,EAAQ9xB,GAQhD,OAPGrG,GACiBm4B,EAAOptC,UAAUqB,SAAS,eAE1C5U,KAAKygD,QAAQM,sBAAsBJ,GAAQ57C,SAAS/B,GAAShD,KAAK0/B,sBAAsB18B,EAAM6rB,KAI3FrG,CACT,CAiDO81B,0BAA0Bp8C,GAC/B,MAAM+/C,EAAY//C,EAAQqR,UAAUqB,SAAS,cAC7C,OAAO1C,MAAMosC,0BAA0Bp8C,MAAc+/C,GAAajiD,KAAKkhD,sBAAsBh/C,GAC/F,CAEU2+C,wBAAwBF,GAChC,MAAMuB,EAAuBliD,KAAKy+C,4BAA4BkC,GAC9D,OAAOuB,aAAoB,EAApBA,EAAsB7Y,OAC/B,CAEUyX,0BAA0BE,GAClC,MAAM93B,EAAWlpB,KAAKwgD,KAAKC,QAAQM,sBAAsBC,GAKzD,OAJI93B,EAASrmB,QACXqmB,EAAS7mB,KAAK2+C,GAGT93B,EAASpO,KAAK5Y,IAAaA,EAAQ6nB,QAAQ9hB,KACpD,CAEUi5C,sBAAsBF,GAC9B,MAAMlV,EAAO9rC,KAAK8gD,0BAA0BE,GACtCnF,EAAe/P,EAAK/b,QAAQ9nB,GAAQjI,KAAK22B,cAAc32B,KAAKwgD,KAAKx4C,OAAQC,KAC/E,OAAO6jC,EAAKjpC,SAAWg5C,EAAah5C,MACtC,CAEU47C,4BAA4BkC,GAgBpC,OAAOA,EAAOptC,UAAUqB,SAAS,sBAC/B+rC,EAAO/oC,cAAc,eACrB1F,MAAMusC,4BAA4BkC,EACtC,CAEOC,gBAAgBD,GACrB,QAAQA,EAAOptC,UAAUqB,SAAS,YAC/B+rC,EAAOptC,UAAUqB,SAAS,gBAC1B+rC,EAAOptC,UAAUqB,SAAS,aAC1B+rC,EAAOptC,UAAUqB,SAAS,iBAC1B+rC,EAAOptC,UAAUqB,SAAS,mBAC/B,E,qGEr1Ba,MAAMutC,EAMnBpiD,YAAY2xB,EAAgC,CAAC,GAC3C,MAAMuZ,EAAQjrC,KAAKirC,MAAQ5/B,SAASC,cAAc,SAClD2/B,EAAM13B,UAAUxS,IAAI,kBAEjB2wB,EAAQ0wB,aACTnX,EAAM13B,UAAUxS,IAAI,8BAGnB2wB,EAAQ/nB,OACTshC,EAAM13B,UAAUxS,IAAI,wBAGnB2wB,EAAQyiB,UACTn0C,KAAKqiD,kBAAiB,GAGxBriD,KAAK6R,eAAiB6f,EAAQ7f,eAE9B,MAAM+iB,EAAQ50B,KAAK40B,MAAQvpB,SAASC,cAAc,SAWlD,GAVAspB,EAAMrhB,UAAUxS,IAAI,wBACpB6zB,EAAMhzB,KAAO,WACV8vB,EAAQxZ,OACT0c,EAAMhtB,GAAK,SAAW8pB,EAAQxZ,MAG7BwZ,EAAQ2X,UACTzU,EAAMyU,SAAU,GAGf3X,EAAQ4wB,SAAU,CACnB,IAAI9qB,GAAS,EACb,MAAMlD,EAAW,KACf,IAAIkD,EACF,OAGF,IAAI9qB,EAEFA,EADCglB,EAAQ6wB,YACD7wB,EAAQ6wB,YAAY3tB,EAAMyU,QAAU,EAAI,GAExCzU,EAAMyU,QAGhB,sCAA4C3X,EAAQ4wB,SAAU51C,EAAM,EAGtE,eAA2B4B,MAAMoiB,IAC/B8G,GAAS,EACT,MAAMgrB,GAAa,OAAgB9xB,EAAOgB,EAAQ4wB,UAClD,IAAIjZ,EAEFA,EADC3X,EAAQ6wB,YAC6C,IAA5C7wB,EAAQ6wB,YAAYpoC,QAAQqoC,GAE5BA,EAGZxiD,KAAKyiD,iBAAiBpZ,EAAQ,IAG7B3X,EAAQ7f,eAAgB6f,EAAQ7f,eAAe9Q,IAAI6zB,EAA3BlD,CAAkC,SAAU4C,GAClEM,EAAMhnB,iBAAiB,SAAU0mB,E,CAGxC,IAAIsE,EAWJ,GAVGlH,EAAQ1d,MACT4kB,EAAO54B,KAAK44B,KAAOvtB,SAASC,cAAc,QAC1CstB,EAAKrlB,UAAUxS,IAAI,qBACnB,QAAM63B,EAAMlH,EAAQ1d,KAAM0d,EAAQ+iB,WAElCxJ,EAAM13B,UAAUxS,IAAI,4BAGtBkqC,EAAMv/B,OAAOkpB,GAEVlD,EAAQ7nB,OAAQ,CACjBohC,EAAM13B,UAAUxS,IAAI,yBAEpB,MAAM8I,EAASwB,SAASC,cAAc,OACtCzB,EAAO0J,UAAUxS,IAAI,mBACrBkqC,EAAMv/B,OAAO7B,E,KACR,CACL,MAAM64C,EAAMr3C,SAASC,cAAc,OACnCo3C,EAAInvC,UAAUxS,IAAI,gBAElB,MAAM4hD,EAAWt3C,SAAS6e,gBAAgB,6BAA8B,OACxEy4B,EAASpvC,UAAUxS,IAAI,sBACvB4hD,EAASx4B,eAAe,KAAM,UAAW,aACzC,MAAMK,EAAMnf,SAAS6e,gBAAgB,6BAA8B,OACnEM,EAAIL,eAAe,KAAM,OAAQ,UACjCK,EAAIL,eAAe,KAAM,IAAK,MAC9Bw4B,EAASj3C,OAAO8e,GAEhB,MAAMo4B,EAAKv3C,SAASC,cAAc,OAClCs3C,EAAGrvC,UAAUxS,IAAI,2BAEjB,MAAM8hD,EAASx3C,SAASC,cAAc,OACtCu3C,EAAOtvC,UAAUxS,IAAI,uBAErB2hD,EAAIh3C,OAAOm3C,EAAQD,EAAID,GAEvB1X,EAAMv/B,OAAOg3C,E,CAGZ9pB,GACDqS,EAAMv/B,OAAOktB,GAGZlH,EAAQoxB,YACT7X,EAAM13B,UAAUxS,IAAI,kBAAmB,iBACvC,OAAOkqC,OAAOhnC,OAAWA,GAAW,IAE5BytB,EAAQqxB,WAChB9X,EAAM13B,UAAUxS,IAAI,eAExB,CAEIsoC,cACF,OAAOrpC,KAAK40B,MAAMyU,OACpB,CAEIA,YAAQA,GAKVrpC,KAAKyiD,iBAAiBpZ,GAEtB,MAAMxO,EAAQ,IAAImoB,MAAM,SAAU,CAACvC,SAAS,EAAM9+B,YAAY,IAC9D3hB,KAAK40B,MAAMxrB,cAAcyxB,EAC3B,CAEO4nB,iBAAiBpZ,GACtBrpC,KAAK40B,MAAMyU,QAAUA,CACvB,CAEOgZ,iBAAiBY,GAEtB,OADAjjD,KAAKirC,MAAM13B,UAAU1J,OAAO,oBAAqBo5C,GAC1C,IAAMjjD,KAAKqiD,kBAAkBY,EACtC,E,4DCpKa,MAAMC,UAAuB,KAC1CnjD,YAAmB2xB,GAIjBxf,MAAM/N,OAAOg/C,OAAOzxB,EAAS,CAC3BliB,WAAW,KALI,KAAAkiB,QAAAA,EAQjB,MAAMkD,EAAQ50B,KAAK40B,MACnBA,EAAMhzB,KAAO,MACbgzB,EAAMjnB,aAAa,WAAY,IAC/BinB,EAAMwuB,aAAe,MAErB,IAAIC,EAAa,EACjBrjD,KAAK40B,MAAMhnB,iBAAiB,SAAU7F,IACpC/H,KAAK40B,MAAMrhB,UAAU/Q,OAAO,SAC5BxC,KAAKsjD,WAEL,MAAM52C,EAAQ1M,KAAK0M,MAAM2d,QAAQ,MAAO,IAAIyF,MAAM,EAAG4B,EAAQ7uB,QAC7D7C,KAAKyiD,iBAAiB/1C,GAEtB,MAAM7J,EAAS7C,KAAK0M,MAAM7J,OAC1B,GAAGA,IAAW6uB,EAAQ7uB,OACpB6uB,EAAQ6xB,OAAOvjD,KAAK0M,YACf,GAAG7J,IAAWwgD,EACnB,OAGFA,EAAaxgD,CAAM,GAEvB,E,uECxBa,SAAS2gD,EACtB9xB,GAEA,OAAO,IAAIrM,SAAa,CAAClX,EAASmX,K,MAChC,MAAM,OAAChP,EAAM,SAAE8yB,GAAY1X,EAC3Bpb,EAAO8f,SAAYxyB,IAEfuK,EADCi7B,IAAaxlC,EACNA,IAAQA,EAAIiE,UAAO5D,EAEnBytB,EAAQ+xB,WAAW3oC,KAAKsuB,GAAaxlC,EAAIP,IAAI+lC,EAASp1B,Q,EAIlE,MAAMH,GAAU,OAAgB6d,EAAQ7d,SAAW,CAACyC,IAC9CotC,EAAe7vC,EAAQnT,MAAM4V,GAAWA,EAAOqtC,WACrDD,EAAattB,SAAW,KACtB9Q,GAAQ,EAGVoM,EAAQ7d,QAAUA,EACA,QAAlB,EAAA6d,EAAQ+xB,kBAAU,QAAlB/xB,EAAQ+xB,WAAera,GAAY,CAACA,IAEpC,IAAI,IAAU,qBAAsB1X,GAAS7C,MAAM,GAEvD,C,2LCjBA,IAAI+0B,EACJ,MAAMC,EAAe,KACnBD,EAAY,2BACHE,IAAW,MAAC,QAAe,QAAd,EAAAA,EAAQr2C,cAAM,eAAEs2C,OAAO,IAC5C/zB,MAAK,CAACvb,EAAGwb,KAAOxb,EAAEyD,MAAQzD,EAAEuvC,cAAcC,cAAch0B,EAAE/X,MAAQ+X,EAAE+zB,eAAc,EAGrF,IAAI3tB,EAAO,KACTwtB,IACA,qBAA2B,mBAAmB,KAC5CA,GAAc,GACd,EAGJ,MAAMK,EAAoB,IAAI9iD,IAAI,CAAC,OAEpB,MAAM+iD,UAA0B,KAS7CpkD,YAAmB2xB,EAGf,CAAC,GACHxf,MAAM,OAAD,QACH+4B,MAAO,UACP/yB,MAAM,UACHwZ,IAPY,KAAAA,QAAAA,EA+NZ,KAAA0yB,WAAa,UACMngD,IAArBjE,KAAKqkD,cACRrkD,KAAKskD,cAAc/wC,UAAU/Q,OAAO,UACpCxC,KAAKqkD,YAAc3wC,OAAOhR,YAAW,KACnC1C,KAAKskD,cAAc/wC,UAAUxS,IAAI,QACjCf,KAAKqkD,iBAAcpgD,CAAS,GAC3B,KAAI,EAGF,KAAAsgD,sBAAyBlkD,I,QAC9B,MAAMmkD,EAAcnkD,EAAOuX,cAA2B,uBAAuBmS,QAAQy6B,YAC/EC,EAAcpkD,EAAOuX,cAA2B,eAChD8sC,EAAYD,aAAW,EAAXA,EAAalmB,UACzBomB,EAAcD,GAAaA,EAAUr6B,QAAQ,MAAO,KAE1D,OAAerqB,KAAK40B,OAAO,QAAK4vB,IAChCxkD,KAAK4kD,qBACL5kD,KAAK6kD,oBAAsBjB,EAAUljD,MAAM8kC,GAAMA,EAAEwe,eAAiBQ,IACpExkD,KAAK8kD,wBAA0BH,GAAe3kD,KAAK6kD,oBAAoBE,cAAcrkD,MAAMskD,GAAiBA,EAAaC,eAAiBN,IAE9G,QAA5B,KAAA3kD,KAAK0xB,SAAQwzB,uBAAe,gBAAGllD,KAAK6kD,oBAAqB7kD,KAAK8kD,yBAC9D9kD,KAAKokD,YAAY,EA1Od/tB,IACDA,IACAA,OAAOpyB,GAGTjE,KAAKmlD,MAAQ,IAAI5jD,IAEjBvB,KAAKoL,UAAUmI,UAAUxS,IAAI,gBAE7B,MAAMujD,EAAgBtkD,KAAKskD,cAAgBj5C,SAASC,cAAc,OAClEg5C,EAAc/wC,UAAUxS,IAAI,iBAAkB,YAAa,QAE3D,MAAMqkD,EAAY/5C,SAASC,cAAc,QACzC85C,EAAU7xC,UAAUxS,IAAI,QAAS,cACjCf,KAAKoL,UAAUM,OAAO05C,GAEtB,MAAMC,EAAah6C,SAASC,cAAc,MAC1Cg5C,EAAc9sC,YAAY6tC,GAEX,IAAI,KAAWf,GAE9B,IAAIgB,EAAa,KACfA,EAAa,KAEb1B,EAAU7+C,SAASygC,IACjB,GAAG9T,EAAQ6zB,cAAgBrB,EAAkB7gD,IAAImiC,EAAEggB,MACjD,OAGF,MAAMC,GAAQ,QAAgBjgB,EAAEggB,MAE1BE,EAA8B,GACpC,IAAI,IAAI19B,EAAI,EAAGnlB,EAAS2D,KAAKI,IAAI4+B,EAAEuf,cAAcliD,OAAQ6uB,EAAQ6zB,aAAe,EAAII,KAAW39B,EAAInlB,IAAUmlB,EAAG,CAC9G,MAAM28B,EAAcnf,EAAEuf,cAAc/8B,GAC9Bwb,EAAKn4B,SAASC,cAAc,MAE5B2wB,GAAU,OAAcwpB,GAC9B,GAAG,IAAoB,CACrB,MAAMG,EAAYv6C,SAASC,cAAc,SACzC,OAAas6C,EAAW3pB,GACxBuH,EAAG93B,OAAOk6C,E,MAEV,OAAapiB,EAAIvH,GAGnB,MAAMr7B,GAAK,QAAK4kC,EAAEwe,cAIlB,GAHApjD,EAAGmpB,QAAQy6B,YAAchf,EAAEwe,aAC3BxgB,EAAG93B,OAAO9K,IAEN8wB,EAAQ6zB,aAAc,CACxB,MAAM3sB,EAAOvtB,SAASC,cAAc,QACpCstB,EAAKrlB,UAAUxS,IAAI,cACnB63B,EAAK2F,UAAY,IAAMomB,EAAYM,aACnCzhB,EAAGhsB,YAAYohB,E,CAGjB8sB,EAAMrjD,KAAKmhC,GACX6hB,EAAW35C,OAAO83B,E,CAGpBxjC,KAAKmlD,MAAMvhD,IAAI4hC,EAAEggB,KAAME,EAAM,IAG/BL,EAAWz3C,iBAAiB,aAAc7F,IACxC,GAAgB,IAAbA,EAAEuO,OACH,OAGF,MAAMjW,GAAS,OAAU0H,EAAE1H,OAAQ,MACnCL,KAAKukD,sBAAsBlkD,EAAO,IAIpCL,KAAKoL,UAAUoM,YAAY8sC,EAAc,EAG3CgB,IAEAtlD,KAAK40B,MAAMhnB,iBAAiB,SAAU7F,IACjCu9C,EACDA,IAEA1B,EAAU7+C,SAASygC,IACjB,MAAMiF,EAAMzqC,KAAKmlD,MAAMliD,IAAIuiC,EAAEggB,MACzB/a,GACJA,EAAI1lC,SAASy+B,GAAOA,EAAGj4B,MAAM4f,QAAU,IAAG,IAI9C1X,aAAazT,KAAKqkD,aAClBrkD,KAAKqkD,iBAAcpgD,EAEnBqgD,EAAc/wC,UAAU/Q,OAAO,QAC1B8hD,EAAclZ,YACnBkZ,EAAc/wC,UAAUxS,IAAI,UAE5Bf,KAAK6lD,UAEL,OAAiB,CAEfz6C,WAAW,OAAgBpL,KAAKoL,UAAW,gBAC3ClJ,QAASlC,KAAK40B,MACdmF,SAAU,QACV+rB,OAAQ,IAGVpjD,YAAW,KACLqjD,IACF16C,SAASuC,iBAAiB,YAAakuC,EAAa,CAAC9mC,SAAS,IAC9D+wC,GAA2B,E,GAE5B,EAAE,IAGP,IAAIA,GAA2B,EAC/B,MAAMjK,EAAe/zC,KAChB,OAAgBA,EAAE1H,OAAQ,iBAG1B0H,EAAE1H,SAAWL,KAAK40B,QAIrB50B,KAAKokD,aACL/4C,SAASqG,oBAAoB,YAAaoqC,EAAa,CAAC9mC,SAAS,IACjE+wC,GAA2B,EAAK,EAS5BC,EAAcj+C,IAClB,MAAMyE,EAAMzE,EAAEyE,IACd,GAAGzE,EAAEsZ,SAAmB,YAAR7U,EAAmB,OAAO,EAG1C,MAAMy5C,EAASjmD,KAAK0M,MAAMsf,cACpB/C,EAAyB,GAC/B26B,EAAU7+C,SAASygC,IACjB,MAAMiF,EAAMzqC,KAAKmlD,MAAMliD,IAAIuiC,EAAEggB,MAC7B,IAAI/a,EACF,OAGF,MAAMyb,EAAQ,CACZ1gB,EAAEttB,KACFstB,EAAEwe,aACFxe,EAAEggB,MAGJU,EAAMn2B,OAAO+M,SAAS/3B,SAASmT,IAC7B,MAAMiuC,EAAOjuC,EAAK6P,MAAM,KAAKgI,QAAQq2B,GAAS,KAAKC,KAAKD,KAAOtrC,KAAKsrC,GAASA,EAAK,KAAIh+B,KAAK,IACxF+9B,EAAKtjD,OAAS,GACfqjD,EAAM7jD,KAAK8jD,E,IAIf,MAAMrsC,IAASosC,EAAMn2B,OAAO+M,SAASp8B,MAAMmnB,IAA+C,IAAvCA,EAAImE,cAAc7R,QAAQ8rC,KAE7Exb,EAAI1lC,SAASy+B,GAAOA,EAAGj4B,MAAM4f,QAAUrR,EAAO,GAAK,SAChDA,GAAMmP,EAAQ5mB,KAAKmjC,EAAE,IAYM,IAAnBvc,EAAQpmB,OACnB+gD,EAAU7+C,SAASygC,IACjB,MAAMiF,EAAMzqC,KAAKmlD,MAAMliD,IAAIuiC,EAAEggB,MACzB/a,GAIJA,EAAI1lC,SAASy+B,GAAOA,EAAGj4B,MAAM4f,QAAU,IAAG,IAEjB,IAAnBlC,EAAQpmB,QAAwB,UAAR2J,KAChC,OAAYzE,GACZ/H,KAAKukD,sBAAsBvkD,KAAKmlD,MAAMliD,IAAIgmB,EAAQ,GAAGu8B,MAAM,I,EAI/DxlD,KAAK40B,MAAMhnB,iBAAiB,QAASo4C,GACrChmD,KAAK40B,MAAMhnB,iBAAiB,WAAY7F,IACzB,UAAVA,EAAEyE,KACHw5C,EAAWj+C,E,IAIfq9C,EAAUx3C,iBAAiB,aAAc7F,IACpC/H,KAAK40B,MAAM3L,QAAQ,WACpBjpB,KAAKokD,aACLpkD,KAAK40B,MAAM0xB,SAEXv+C,EAAEyuB,cAAe,EACjBzuB,EAAEwuB,iBACFv2B,KAAK40B,MAAMC,Q,GAGjB,CAEOwW,cACL,MAAO,CAACyY,QAAS9jD,KAAK6kD,oBAAqBhrC,KAAM7Z,KAAK8kD,wBACxD,CA0BOyB,oBAAoBf,GACzBxlD,KAAKukD,sBAAsBvkD,KAAKmlD,MAAMliD,IAAIuiD,GAAM,GAClD,CAEOxjD,SAAS8hD,EAAsBjqC,EAAuB2sC,G,SAC3D,OAAexmD,KAAK40B,MAAOkvB,GAAU,QAAKA,EAAQE,cAAuBwC,GACzExmD,KAAK6kD,oBAAsBf,EAC3B9jD,KAAK8kD,wBAA0BjrC,EACH,QAA5B,KAAA7Z,KAAK0xB,SAAQwzB,uBAAe,gBAAGllD,KAAK6kD,oBAAqB7kD,KAAK8kD,wBAChE,E,2FCzRa,MAAM2B,EAWnB1mD,YACUmnB,EACAI,EACAqV,GAFA,KAAAzV,MAAAA,EACA,KAAAI,OAAAA,EACA,KAAAqV,SAAAA,EAER,MAAMr5B,EAAStD,KAAKsD,OAAS+H,SAASC,cAAc,UAC9Co7C,EAAM1mD,KAAK0mD,IAAMhzC,OAAOizC,iBAC9BrjD,EAAO4jB,MAAQA,EAAQw/B,EACvBpjD,EAAOgkB,OAASA,EAASo/B,EACzBpjD,EAAOiQ,UAAUxS,IAAI,mBAAoB,eAEzCf,KAAKsE,QAAS,EACdtE,KAAKwE,UAAW,EAChBxE,KAAKkc,OAAS,EACdlc,KAAKwQ,QAAUlN,EAAO8lB,WAAW,KACnC,CAEQw9B,UACN,IAAI3xB,EAAQzuB,KAAKmD,MAAM3J,KAAKknB,MAAQlnB,KAAKsnB,QAAU,IAAM,EAAA1M,UAAY,EAAI,KACzEqa,GAASj1B,KAAK28B,UAAY,EAC1B1H,EAAQzuB,KAAKI,IAAI,EAAAgU,UAAY,IAAO,KAAMqa,GAC1CA,EAAQzuB,KAAKmD,MAAMsrB,GACnB,MAAM4xB,EAAyB7mD,KAAK6mD,KAAO,IAAI3tC,MAAM+b,GAErD,IAAI,IAAIjN,EAAI,EAAGA,EAAIiN,IAASjN,EAC1B6+B,EAAK7+B,GAAKhoB,KAAK8mD,aAEnB,CAEQA,YAAYC,GAClB,MAAMrqC,EAAIlW,KAAKywC,MAAMzwC,KAAKu3C,SAAW/9C,KAAKsD,OAAO4jB,OAC3CvK,EAAInW,KAAKywC,MAAMzwC,KAAKu3C,SAAW/9C,KAAKsD,OAAOgkB,QAC3CgB,EAAUy+B,EAAS,EAAIvgD,KAAKu3C,SAC5BiJ,GAAUxgD,KAAKu3C,UAAY,GAAK,EAAI,IAAO/9C,KAAK0mD,IAChDr+B,EAAO,IAAI4+B,OAEjB,OADA5+B,EAAK6+B,IAAIxqC,EAAGC,EAAGqqC,EAAQ,EAAG,EAAIxgD,KAAK2gD,IAAI,GAChC,CACLzqC,IACAC,IACA2L,UACA0+B,SACAI,SAAU9+B,EACVy+B,OAAQA,QAAAA,EAAUvgD,KAAKu3C,UAAY,GACnCxY,QAAS,EACTld,OAEJ,CAEQg/B,OACN,MAAM,QAAC72C,EAAO,OAAElN,EAAM,KAAEujD,GAAQ7mD,KAChCwQ,EAAQsjC,UAAU,EAAG,EAAGxwC,EAAO4jB,MAAO5jB,EAAOgkB,QAC7C9W,EAAQsqC,UAAY,OAGpB,IAAI,IAAI9yB,EAAI,EAAGnlB,EAASgkD,EAAKhkD,OAAQmlB,EAAInlB,IAAUmlB,EAAG,CACpD,MAAMs/B,EAAMT,EAAK7+B,GACXu/B,EAAaD,EAAIP,OAHb,SAKVO,EAAIF,UAAYG,EAIhB,MAAMC,GAAe,OAAMF,EAAIF,SAAU,EAAG,GAC5C52C,EAAQi3C,YAAcD,EACtBh3C,EAAQk3C,KAAKJ,EAAIj/B,MAEdi/B,EAAIF,UAAY,GACjBE,EAAIP,QAAS,IAERO,EAAI/hB,SAAW,IAClBshB,EAAK7+B,GAAKhoB,KAAK8mD,YAAYQ,EAAIP,UAEzBO,EAAIF,UAAY,IACxBE,EAAIP,QAAS,E,CAGnB,CAEOvkD,SACLxC,KAAKuE,OACP,CAEOA,QACFvE,KAAKsE,SAIRtE,KAAKsE,QAAS,IACZtE,KAAKkc,OACT,CAEOyrC,mBACD3nD,KAAK6mD,MACP7mD,KAAK4mD,UAGP5mD,KAAKqnD,MACP,CAEO5iD,OACL,IAAIzE,KAAKsE,OACP,OAGFtE,KAAKsE,QAAS,EACd,MAAM4X,IAAWlc,KAAKkc,OAElBlc,KAAK6mD,MACP7mD,KAAK4mD,WAGP,SAAQ,IACH5mD,KAAKkc,SAAWA,IAAUlc,KAAKsE,SAIlCtE,KAAKqnD,QACE,IAEX,CAEO5wC,eAAc,MACnByQ,EAAK,OACLI,EAAM,WACN4P,EAAU,eACVwF,EAAc,SACdC,IAQA,MAAMirB,EAAc,IAAInB,EAAYv/B,EAAOI,EAAQqV,GAKnD,OAJAirB,EAAYD,mBAEZ,iBAAkCC,EAAalrB,EAAgBkrB,EAAYtkD,OAAQ4zB,GAE5E0wB,CACT,E,oGC9Ja,MAAMC,EAenB9nD,YAAY2xB,GAHJ,KAAAo2B,WAAY,EACZ,KAAA1yB,WAAa,IAoEd,KAAA2yB,UAAY,KACjB,GAAG/nD,KAAKgoD,aACN,OAAO,EAGT,IAAIC,EAAgB,EAAGC,EAAiB,EAAGC,EAAsB,EAiBjE,OAhBAnoD,KAAKooD,YAAYrjD,SAAS4vB,IACrBA,EAAW0zB,YACT1zB,EAAWozB,eACVE,EAGDtzB,EAAW2zB,YACVH,GAIHxzB,EAAW2zB,YACVJ,C,IAICA,IAAmBC,GAAuBF,EAAgB,CAAC,EAG7D,KAAAM,aAAe,KACpBvoD,KAAKwoD,QAAQj1C,UAAU1J,OAAO,aAAc7J,KAAK+nD,YAAY,GAlF7D,OAAW/nD,KAAM0xB,GAEjB1xB,KAAKgI,SAALhI,KAAKgI,OAAW,MAEZhI,KAAKwoD,QAEExoD,KAAKwoD,QAAQj1C,UAAUqB,SAAS,gBACzC5U,KAAKuoD,aAAe,KAClBvoD,KAAKwoD,QAAQzG,gBAAgB,YAAa/hD,KAAK+nD,aAAe/nD,KAAKm0C,SAAS,GAH9En0C,KAAKwoD,SAAU,OAAa,CAACz0C,KAAM,UAOjC2d,EAAQ+2B,gBACVzoD,KAAK0oD,WAAa,IAAI,IACtB1oD,KAAK0oD,WAAWn1C,UAAUxS,IAAI,qBAAsB,UAAYf,KAAKo1B,YACrEp1B,KAAK0oD,WAAW/7B,kBAAkB,CAAC3kB,OAAQhI,KAAKgI,SAE5C0pB,EAAQi3B,kBACV3oD,KAAK4oD,WAAa,IAAI,KAAYC,IAChC7oD,KAAKgoD,aAAea,EACpB7oD,KAAKuoD,eACLvoD,KAAK0oD,WAAWlmD,QAAQ,GACvBkvB,EAAQo3B,cAEX9oD,KAAK4oD,WAAWx9C,UAAUM,OAAO1L,KAAK0oD,cAI1C1oD,KAAKooD,YAAYrjD,SAAS4vB,IACxB30B,KAAK6R,eAAe9Q,IAAI4zB,EAAWC,MAAnC50B,CAA0C,QAASA,KAAKuoD,aAAa,IAGvEvoD,KAAKuoD,cACP,CAEWpU,eACT,OAAOn0C,KAAK8nD,SACd,CAEW3T,aAASznC,GAClB1M,KAAK8nD,UAAYp7C,EACjB1M,KAAKooD,YAAYrjD,SAAS4vB,GAAeA,EAAWC,MAAMmtB,gBAAgB,WAAYr1C,KACtF1M,KAAKuoD,cACP,CAEOQ,gBAAgBx6C,EAAuBy6C,GAAkB,GAC9DhpD,KAAKm0C,UAAW,EAChB5lC,EAAQD,MAAK,KACR06C,IACDhpD,KAAKm0C,UAAW,E,IAEjB,KACDn0C,KAAKm0C,UAAW,CAAK,GAEzB,E,wMCjFa,MAAM8U,EAKnBlpD,YAAoBkH,GAAA,KAAAA,SAAAA,CAEpB,CAEAovB,OACEr2B,KAAK2S,QAAUtH,SAASkR,eAAe,gBACvC,MAAM2sC,EAAgBlpD,KAAK2S,QAAQ4C,mBACnC,QAAiB2zC,EAAeC,EAAkBzuB,cAElD,MAAMJ,EAASt6B,KAAKm0B,WAAa,IAAI,KAAWn0B,KAAK2S,QAAS,QACxDy2C,EAAU,IAAI,IAAYF,EAAeG,EAAuB/uB,GAChEne,GAAY,EAAA8qB,EAAA,GAAajnC,KAAK2S,SAAS,GAE7C3S,KAAKiH,SAASC,eAAeoiD,UAAUh7C,MAAMi7C,IAC3CA,EAAKxkD,SAASpD,IACZynD,EAAQroD,IAAIY,EAAI,IAGlBwa,EAAU3Z,QAAQ,IAGpB,0BAAyC4mD,EAAQxnC,cAAewnC,EAAQI,qBAExExpD,KAAKq2B,KAAO,IACd,CAEAlb,UAEA,E,+WC3BF,MAAMsuC,EAAqC,cAE5B,MAAMC,UAAmB,IAAxC,c,oBAIU,KAAAC,WAAa,GACb,KAAAC,WAAY,EAmCZ,KAAAC,YAAoB9hD,GAA+B,EAAD,gCACxD,MAAM1H,GAAS,EAAA4gB,EAAA,GAAgBlZ,EAAE1H,OAAQ,OACzC,IAAIA,EAAQ,OAEZ,MAAMypD,EAASzpD,EAAO0pB,QAAQ3iB,aACrBsuB,EAAA,sCAAgDo0B,IACpDr8B,EAAA,YACD,uBAGFrhB,QAAQC,KAAK,oBAAqBy9C,EAEtC,GA2DF,CAnGSzzB,OACLr2B,KAAKoL,UAAUxD,GAAK,wBAEpB5H,KAAK+pD,YAAc,IAAI,IAAY,mBAAoBr9C,IACrD1M,KAAK2Q,QACL3Q,KAAK2yB,OAAOjmB,EAAM,IAGpB1M,KAAK+O,MAAM+d,YAAY9sB,KAAK+pD,YAAY3+C,WAExCpL,KAAKgqD,QAAU3+C,SAASC,cAAc,OACtCtL,KAAKgqD,QAAQz2C,UAAUxS,IAAI,iBAC3B,QAAiBf,KAAKgqD,QAAShqD,KAAK6pD,YAAa,CAACh4C,eAAgB7R,KAAK6R,iBAEvE7R,KAAKm0B,WAAWzoB,OAAO1L,KAAKgqD,SAE5BhqD,KAAKopD,QAAU,IAAI,IAAYppD,KAAKgqD,QAASP,EAAgBzpD,KAAKm0B,YAGlE,oBAA8B,GAAM7lB,MAAK,KACvCtO,KAAK2yB,OAAO,IAAI,GAEhB3yB,KAAKm0B,WAAWK,iBAAmB,KACjCx0B,KAAK2yB,OAAO3yB,KAAK+pD,YAAYr9C,OAAO,EAAM,CAC3C,GAEL,CAgBOyO,UACLnb,KAAKm0B,WAAWK,iBAAmB,MACrC,CAEOy1B,sBAKL,OAJAjqD,KAAK2Q,QACL3Q,KAAKgqD,QAAQjnC,UAAY,GACzBjjB,EAAA,uBAAqCmE,EAAWwlD,GAChDzpD,KAAK+pD,YAAYvnD,SACV0P,MAAM+3C,qBACf,CAEQt5C,QACN3Q,KAAK+zB,cAAgB,KACrB/zB,KAAK2pD,WAAa,GAClB3pD,KAAK4pD,WAAY,EACjB5pD,KAAKopD,QAAQ3jC,OACf,CAEakN,OAAOsB,EAAei2B,GAAY,G,yCAC7C,IAAGlqD,KAAK+zB,gBAAiB/zB,KAAK4pD,UAA9B,CAEI5pD,KAAKmqD,eACPnqD,KAAKmqD,oBAAsBnqD,KAAKiH,SAASk6B,gBAAgBipB,gBAAgB,QAAQxiD,GAAG6uB,UAAS,IAG/F,IACEz2B,KAAK+zB,cAAgB/zB,KAAKiH,SAASojD,qBAAqBC,iBAAiB,KAActqD,KAAKmqD,aAAcl2B,EAAOj0B,KAAK2pD,YACtH,MAAM,QAACtqB,EAAO,YAAEkrB,SAAqBvqD,KAAK+zB,cAE1C,GAAG/zB,KAAK+pD,YAAYr9C,QAAUunB,EAC5B,OAGFj0B,KAAK+zB,cAAgB,KACrB/zB,KAAK2pD,WAAaY,EACfL,IACDlqD,KAAKgqD,QAAQjnC,UAAY,IAGxBsc,EAAQx8B,OACTw8B,EAAQt6B,SAASwoC,IACC,yBAAbA,EAAO39B,GAAgC29B,EAAOliC,UAC/CrL,KAAKopD,QAAQroD,IAAIwsC,EAAOliC,S,IAI5BrL,KAAK4pD,WAAY,EAGnB5pD,KAAKm0B,WAAWsG,U,CAChB,MAAMj1B,GAGN,MAFAxF,KAAK+zB,cAAgB,KACrB3nB,QAAQujB,MAAM,sBAAuBnqB,GAC/BA,C,CAlCuC,CAoCjD,G,2EC5Ga,MAAMglD,UAAuB,IAKnCn0B,OACLr2B,KAAKoL,UAAUxD,GAAK,qBACpB5H,KAAKoL,UAAUmI,UAAUxS,IAAI,sBAE7Bf,KAAK4hB,cAAgB,IAAI,IAEzB5hB,KAAK+pD,YAAc,IAAI,IAAY,iCAAkCr9C,IACnE1M,KAAK2yB,OAAOjmB,EAAM,IAGpB1M,KAAK+O,MAAM+d,YAAY9sB,KAAK+pD,YAAY3+C,WAExCpL,KAAKyqD,QAAUp/C,SAASC,cAAc,OACtCtL,KAAKyqD,QAAQl3C,UAAUxS,IAAI,gBAC3Bf,KAAKm0B,WAAWzoB,OAAO1L,KAAKyqD,UAE5B,OAA6B,CAACC,SAAU1qD,KAAKyqD,QAAS54C,eAAgB7R,KAAK6R,kBAE3E,QAAiB7R,KAAKyqD,SAAU1iD,IAC9B,MAAM4iD,GAAU,EAAA1pC,EAAA,GAAgBlZ,EAAE1H,OAAQ,uBAC1C,GAAGsqD,EAAS,CACV,MAAMvjD,EAAQujD,EAAQ5gC,QAAQ3iB,MAE9B,YADAsuB,EAAA,sCAAgDtuB,E,CAIlD,MAAM/G,GAAS,EAAA4gB,EAAA,GAAgBlZ,EAAE1H,OAAQ,eACzC,IAAIA,EAAQ,OAEZ,MAAMuH,EAAKvH,EAAO0pB,QAAQ6gC,WACpBC,EAAcxqD,EAAO0pB,QAAQ8gC,YAE7Bv0C,GAAS,EAAA2K,EAAA,GAAgBlZ,EAAE1H,OAAQ,sBACtCiW,GACDvO,EAAEwuB,iBACFxuB,EAAEyuB,cAAe,EAEjBlgB,EAAO3I,aAAa,WAAY,QAEhC3N,KAAKiH,SAAS6jD,mBAAmBC,cAAc,CAACnjD,KAAIijD,gBAAcv8C,MAAMuuB,IACtE78B,KAAKiH,SAAS6jD,mBAAmBE,iBAAiBnuB,EAAKj5B,KAAK0K,MAAM28C,IAC7DA,IACD30C,EAAOsC,YAAc,GACrBtC,EAAO5K,QAAO,QAAKmxB,EAAKj5B,IAAIsnD,eAAiB,uBAAyB,uBACtE50C,EAAO/C,UAAU1J,OAAO,SAAUgzB,EAAKj5B,IAAIsnD,gB,IAE5C/yC,SAAQ,KAET7B,EAAO60C,gBAAgB,WAAW,GAClC,KAGJnrD,KAAKiH,SAAS6jD,mBAAmBC,cAAc,CAACnjD,KAAIijD,gBAAcv8C,MAAMuuB,IACtE,IAAI,IAAcA,EAAKj5B,KAAKirB,MAAM,G,GAGrC,CAAChd,eAAgB7R,KAAK6R,iBAEzB,oBAA8B,GAAMvD,MAAK,KACvCtO,KAAKorD,gBAAgB,GAEzB,CAEOnB,sBAGL,OAFAjqD,KAAKyqD,QAAQ1nC,UAAY,GACzBjjB,EAAA,uBAAqCmE,EAAW,mBACzCiO,MAAM+3C,qBACf,CAEOoB,UAAUznD,GAEf,MAAMwqB,EAAM/iB,SAASC,cAAc,OACnC8iB,EAAI7a,UAAUxS,IAAI,eAElB,MAAMuqD,EAASjgD,SAASC,cAAc,OACtCggD,EAAO/3C,UAAUxS,IAAI,sBAErB,MAAMsF,EAAUgF,SAASC,cAAc,OACvCjF,EAAQkN,UAAUxS,IAAI,uBACtBsF,EAAQ0c,UAAY,wCAEpB,EAAAmb,EAAA,GAAa73B,EAAQkP,mBAAmB,EAAA+W,EAAA,GAAc1oB,EAAImL,QAE1D,MAAMw8C,EAAWlgD,SAASC,cAAc,OACxCigD,EAASh4C,UAAUxS,IAAI,qBACvBwqD,EAAS7/C,QAAO,QAAK,WAAY,CAAC9H,EAAIqxB,SACtC5uB,EAAQqF,OAAO6/C,GAEf,MAAMj1C,EAASjL,SAASC,cAAc,UACtCgL,EAAO/C,UAAUxS,IAAI,cAAe,oBAAqB,sBACzDuV,EAAO5K,QAAO,QAAK9H,EAAIsnD,eAAiB,uBAAyB,uBAG9DtnD,EAAIsnD,gBACL50C,EAAO/C,UAAUxS,IAAI,QAKvBuqD,EAAO5/C,OAAOrF,EAASiQ,GAEvB,MAAMk1C,EAAcngD,SAASC,cAAc,OAC3CkgD,EAAYj4C,UAAUxS,IAAI,wBAE1B,MAAMk0B,EAAQzuB,KAAKI,IAAI,EAAGhD,EAAIqxB,OAC9B,IAAI,IAAIjN,EAAI,EAAGA,EAAIiN,IAASjN,EAAG,CAC7B,MAAMyjC,EAAapgD,SAASC,cAAc,OAC1CmgD,EAAWl4C,UAAUxS,IAAI,uBAEzByqD,EAAY9/C,OAAO+/C,E,CAGrBzrD,KAAKiH,SAAS6jD,mBAAmBC,cAAcnnD,GAAK0K,MAAM1K,IAGxD,IAAI,IAAIokB,EAAI,EAAGA,EAAIiN,IAASjN,EAAG,CAC7B,MAAMoG,EAAMo9B,EAAYryB,SAASnR,GAC3BrmB,EAAMiC,EAAI8nD,UAAU1jC,GACb,kBAAVrmB,EAAIiO,IAIP,QAAY,CACVjO,MACAysB,MACAxM,cAAe5hB,KAAK4hB,cACpBthB,MAAO,kBAGPmE,MAAM,EACNf,MAAM,EACNwjB,MAAO,GACPI,OAAQ,GACRqkC,UAAU,G,KA8BhBv9B,EAAIrE,QAAQ6gC,WAAa,GAAKhnD,EAAIgE,GAClCwmB,EAAIrE,QAAQ8gC,YAAc,GAAKjnD,EAAIinD,YACnCz8B,EAAIrE,QAAQhb,MAAQnL,EAAImL,MAExBqf,EAAI1iB,OAAO4/C,EAAQE,GAEnBxrD,KAAKyqD,QAAQ/+C,OAAO0iB,EACtB,CAEOg9B,iBACL,OAAOprD,KAAKiH,SAAS6jD,mBAAmBc,sBAAsBt9C,MAAMu9C,IAC/D7rD,KAAK+pD,YAAYr9C,QAIpBm/C,EAAc7rD,KAAK8rD,eAAe,GAAID,IAC1B9mD,SAASnB,IACnB5D,KAAKqrD,UAAUznD,EAAIA,IAAI,GACvB,GAEN,CAEQkoD,eAAe73B,EAAe43B,GACpCA,EAAcA,EAAY/7B,QAE1B,MAAMqJ,EAAWjgB,MAAMC,KAAKnZ,KAAKyqD,QAAQtxB,UAczC,OAbA,EAAA4yB,EAAA,GAAe5yB,GAAUv4B,IACvB,MAAMgH,EAAKhH,EAAGmpB,QAAQ6gC,WAChB34B,EAAQ45B,EAAY7iD,WAAWgjD,GAAYA,EAAQpoD,IAAIgE,KAAOA,KAEtD,IAAXqqB,EACD45B,EAAY15B,OAAOF,EAAO,GACjBgC,GAAUrzB,EAAGmpB,QAAQhb,MAAMid,cAAcjX,SAASkf,EAAMjI,gBACjEprB,EAAG4B,Q,IAIP1C,EAAA,uBAAqCmE,EAAW,mBAEzC4nD,CACT,CAEOl5B,OAAOsB,GACZ,OAAIA,EAIGj0B,KAAKiH,SAAS6jD,mBAAmBmB,kBAAkBh4B,GAAO,GAAO3lB,MAAMu9C,IACzE7rD,KAAK+pD,YAAYr9C,QAAUunB,IAM9B43B,EAAc7rD,KAAK8rD,eAAe73B,EAAO43B,IAC7B9mD,SAASnB,IACnB5D,KAAKqrD,UAAUznD,EAAIA,IAAI,GACvB,IAbK5D,KAAKorD,gBAehB,E,qbClNK,MAAM/B,EAA4C,qBAenD6C,EAAwC,CAC5CC,cAAe,IACfC,mBAHa,IAAa,IAAM,EAAK,IAAM,IAMtC,MAAMjD,UAA0B,IAqBrCppD,cACEmS,MAAM,CACJhQ,QAASmJ,SAASkR,eAAe,kBACjC8vC,wBAAyB,wBAfrB,KAAAC,OAAS,EAwPT,KAAAC,iBAAoB3kD,IAC1B,GAAG5H,KAAKssD,QAAU1kD,EAMlB9H,EAAA,mBAAqC,EAAMupD,GAE3CrpD,KAAKssD,MAAQ1kD,EACb5H,KAAKwsD,aAAaj5C,UAAU1J,OAAO,OAAQ7J,KAAKssD,QAAUtsD,KAAKysD,SAASH,OACxEtsD,KAAK0sD,UAAUn5C,UAAU1J,OAAO,OAAQ7J,KAAKssD,QAAUtsD,KAAKysD,SAASH,WAVrE,CACE,MAAM,IAACp5C,GAAOlT,KACdA,KAAK2sD,SAASz5C,EAAKA,EAAIihB,WAAW/oB,UAAUmK,kB,CAQ6B,EAGrE,KAAAq3C,YAAc,IAAW,kCAC/B,MAAM,OAAC5kD,EAAM,SAAEiL,GAAYyiB,EAAA,QACrByD,EAAWn5B,KAAK6sD,OAAO1zB,SACvB2zB,EAAe5zC,MAAMC,KAAKggB,IAEzB4zB,EAAiBC,SAAqB3nC,QAAQqH,IAAI,CACvD1sB,KAAKiH,SAAS8G,mBAAmBk/C,cAAcjlD,EAAQiL,EAAU,iBACjEjT,KAAKiH,SAAS8G,mBAAmBk/C,cAAcjlD,EAAQiL,EAAU,eAGnE65C,EAAa9sD,KAAKktD,YAAYZ,MAAQ,GAAGvK,gBAAgB,YAAagL,GACtED,EAAa9sD,KAAKmtD,QAAQb,MAAQ,GAAGvK,gBAAgB,YAAaiL,GAElE,MAAMjnC,EAAS/lB,KAAK6sD,OAAOj1C,cAAc,YACtCmO,IAAU,EAAAqnC,EAAA,GAAWrnC,KAAa/lB,KAAKysD,SAASH,MAAQ,GAAQS,GAAoBC,GACrFhtD,KAAKk5B,UAAUl5B,KAAKysD,SAASH,OAAO,EAExC,IArQEtsD,KAAK4N,iBAAiB,QAAQ,IAAW,kC,MACpC,MAEE,EAAAyxC,EAAA,aACK,EAAA96C,EAAA,GAAM,MAIbvE,KAAKkC,QAAQ+W,gBAAkByc,EAAA,yBAChCA,EAAA,+BAAyC11B,KAAKkC,SAGhDlC,KAAKqtD,WAAartD,KAAKstD,eAEvBnE,EAAkBvnC,cAAczc,OAEhCrF,EAAA,wBAA2CupD,GAE3C,MAAMn2C,EAAMlT,KAAKkT,IACP,QAAV,EAAAA,EAAIgI,cAAM,gBACZ,MAEAlb,KAAK4N,iBAAiB,UAAU,K,MAC9B9N,EAAA,0BAA6CupD,GAC7CF,EAAkBvnC,cAAcwZ,mBAIhC,MAAMloB,EAAMlT,KAAKkT,IACL,QAAZ,EAAAA,EAAIq6C,gBAAQ,gBAAI,IAGlBvtD,KAAK4N,iBAAiB,SAAS,K,MAC7Bu7C,EAAkBvnC,cAAczc,OAIhCrF,EAAA,wBAA2CupD,GAC3CvpD,EAAA,mBAAqC,EAAMupD,GAE3C,MAAMn2C,EAAMlT,KAAKkT,IACN,QAAX,EAAAA,EAAIiI,eAAO,gBAAI,IAGjBnb,KAAK4N,iBAAiB,UAAU,K,MAE9B9N,EAAA,0BAA6CupD,GAC7CF,EAAkBvnC,cAAc4rC,SAChCrE,EAAkBvnC,cAAc6rC,UAIhCztD,KAAKqtD,gBAAappD,EAElB,MAAMiP,EAAMlT,KAAKkT,IACL,QAAZ,EAAAA,EAAIw6C,gBAAQ,gBAAI,GAEpB,CAEWx6C,UACT,OAAOlT,KAAKg3B,KAAKh3B,KAAKssD,MACxB,CAEOj2B,OACLr2B,KAAKiH,SAAWua,EAAA,WAChBxhB,KAAKysD,SAAW,IAAI,KAAS,CAACxlD,SAAUjH,KAAKiH,WAC7CjH,KAAKktD,YAAc,IAAI,KAAYltD,KAAKiH,UACxCjH,KAAKmtD,QAAU,IAAIlE,EAAQjpD,KAAKiH,UAEhCjH,KAAKg3B,KAAO,CAAC,EACb,CAACh3B,KAAKysD,SAAUzsD,KAAKktD,YAAaltD,KAAKmtD,SAASpoD,SAAQ,CAACmO,EAAKnK,KAC5DmK,EAAIo5C,MAAQvjD,EACZ/I,KAAKg3B,KAAKjuB,GAAOmK,CAAG,IAGtBlT,KAAKoL,UAAYpL,KAAKkC,QAAQ0V,cAAc,oCAC5C5X,KAAKoL,UAAU4M,QAAQhY,KAAKysD,SAASrhD,UAAWpL,KAAKktD,YAAY9hD,WACjEpL,KAAK6sD,OAAS7sD,KAAKkC,QAAQ0V,cAAc,eACzC5X,KAAKk5B,WAAY,EAAAQ,EAAA,GAAe15B,KAAK6sD,OAAQ7sD,KAAKoL,UAAWpL,KAAKusD,kBAAkB,K,MAClF,MAAM,IAACr5C,GAAOlT,KACN,QAAR,EAAAkT,EAAImjB,YAAI,iBACRv2B,EAAA,mBAAqC,EAAOupD,EAAsB,IAGpErpD,KAAKwsD,aAAexsD,KAAKkC,QAAQ0V,cAAc,sBAC/C5X,KAAKwsD,aAAa5+C,iBAAiB,SAAS,KACvC5N,KAAKssD,QAAUtsD,KAAKktD,YAAYZ,MAC7B,iBAA4B9B,IAC9B,eAA0BA,GAAgB97B,OAGxC,iBAA4Bg7B,IAC9B,eAA0BA,GAAYh7B,M,IAK5C1uB,KAAK0sD,UAAY1sD,KAAKkC,QAAQ0V,cAAc,uBAC5C,QAAiB5X,KAAK0sD,WAAY3kD,KAChC,EAAAqS,EAAA,GAAYrS,GACZ,MAAM6sB,EAAQc,EAAA,2BAEd,IAAIi4B,EAAQ,kBAA+BC,cAAch5B,GACrD+4B,IACFA,EAAQtiD,SAAS+yC,cACjBuP,EAAME,cAAcj5B,EAAM0b,YAG5B,MAAMwd,EAAWH,EAAMI,aAEvB,GAAGJ,EAAMK,UAAW,CAClB,MAAM,KAACC,EAAI,OAAEtwB,IAAU,OAAa/I,EAAO+4B,EAAMO,aAAcP,EAAMQ,WACrE,IAAIC,EACJ,GAAGzwB,EACDywB,EAAeH,MACV,CAEL,GADAG,EAAeH,EAAKI,iBAChBD,EACF,OAGF,KAAMA,EAAaE,WAAaF,EAAaG,YAAcH,EAAaI,YAAcJ,EAAeA,EAAaC,mBAIlH,GAAGD,EAAaE,WAAaF,EAAaK,eAAkBL,EAA6BM,kBACvF,M,CAIJ,GAAGN,EAAaE,WAAaF,EAAaK,cAAkD,QAAjCL,EAAqBvtC,QAC9EitC,EAASa,WAAWP,OACf,CACL,MAAMp6C,EAAO,IAAIo6C,EAAax1C,aAC9B,IAAIgtB,EACJ,GAAGjI,EAAQ,CACT,IAAI96B,EAAS,EACb+iC,EAAI5xB,EAAKtT,MAAMsT,IAAUnR,GAAUmR,EAAKnR,OAAQA,GAAU86B,I,MAE1DiI,EAAI5xB,EAAKmV,OAAS,GAGpB,MAAMylC,EAAYjxB,EAASA,EAASiI,EAAE/iC,OAASurD,EAAax1C,YAAY/V,OAAS+iC,EAAE/iC,OACnFirD,EAASe,SAAST,EAAcQ,E,EAIpCd,EAASgB,iBAETp5B,EAAA,oDAA8D,IA0BhE,MAAMq5B,EAAiB,EAAAzzC,kBAAmB,EAEpC0zC,EAAcD,EAAiB/uD,KAAKktD,YAAYZ,MAAQtsD,KAAKysD,SAASH,MAW5E,GATGyC,GACA/uD,KAAK6sD,OAAO1zB,SAAS,GAAmB5lB,UAAUxS,IAAI,SAGzD,QAAmBf,KAAK6sD,OAAO1zB,SAAS61B,EAAc,IACnDhvD,KAAKg3B,KAAKg4B,GAAa34B,MACxBr2B,KAAKg3B,KAAKg4B,GAAa34B,QAGrB,IAAoB,CACtB,IAAI44B,EAAgCC,GAAyB,EAC7D,MAAMrS,EAAe90C,IACnBknD,EAAqBlnD,CAAC,EAExB6R,EAAA,mBAAgC,UAAWu1C,IACtCA,EACGD,IACF7jD,SAASI,KAAKmC,iBAAiB,YAAaivC,GAC5CqS,GAAyB,GAEnBA,IACR7jD,SAASI,KAAKiG,oBAAoB,YAAamrC,GAC5CoS,GACDjvD,KAAKovD,WAAWH,G,IAYxB,OANAv5B,EAAA,oBAA8B,iBAAiB,KAC7C11B,KAAK6J,QAAO,EAAM,IAEpB6rB,EAAA,oBAA8B,eAAgB11B,KAAK4sD,aACnD5sD,KAAK4sD,cAEE16C,MAAMmkB,MACf,CAEOg5B,aACL,OAAOrvD,KAAKkC,OACd,CAEOyqD,SAASz5C,EAAmBhR,GACjCgR,EAAIihB,WAAW2F,kBAAkB,OAAD,QAC9B53B,QAASA,EACTotD,KAAM,IACNv1B,SAAU,SACPmyB,GAEP,CA2MOz1C,iBAAuBrP,EAAcmoD,EAAsBC,G,yCAChE,aAAS95B,EAAA,sCAAgDtuB,OAAOnD,EAAWsrD,EAAYC,KAGlFC,GAAkBrkD,YACnBqkD,GAAkBC,YAAa,EAE/BD,GAAkB5lD,QAAO,KAGpB,IAEPuC,QAAQC,KAAK,oBAAqBjF,IAC3B,EAEX,G,CAEOuoD,uBAAuB/tC,EAAyC4nC,GACrExpD,KAAK4N,iBAAiB,SAAS,KAC7BgU,EAAczc,MAAM,IAGtBnF,KAAK4N,iBAAiB,UAAU,KAC9B,MAAMgiD,EAAOhuC,EAAciuC,YAAYC,aAEvC,IAAI,MAAM1hC,KAAOwhC,EACfpG,EAAoBp7B,GAGtBxM,EAAciuC,YAAYE,cAAc,IAG1C/vD,KAAK4N,iBAAiB,UAAU,KAC9BgU,EAAcwZ,kBAAkB,GAEpC,CAEOwyB,gBACL,OAAO5tD,KAAKstD,gBAAkBttD,KAAKqtD,UACrC,CAEQC,eACN,MAAM0C,EAAM3kD,SAAS6yC,eACrB,GAAG8R,EAAIC,YAAc5kD,SAAS6kD,gBAAkBx6B,EAAA,2BAC9C,OAAOs6B,EAAIG,WAAW,EAE1B,E,IAvfc,EAAAvuC,cAAgB,IAAI,IAAc,GAiSlC,EAAAwuC,YAAc,CAC1BC,EACAhb,EACAlhB,EACAm8B,EACAC,EACA1+C,KAEA,IAAI2+C,GAAY,EAEhB,MAeMl9B,EAAY,CAACpgB,EAAqBonB,GAAS,KAC/C,GAAGpnB,IAAQq9C,EACT,OAAO,EAGT,IAAIjoB,GAAI,EAmCR,OAlCGioB,IACDA,EAAQrnC,SAASyP,QAAQplB,UAAU/Q,OAAO,UACvC+tD,EAAQD,YAAcC,EAAQD,aAAep9C,EAAIo9C,aAClDhoB,GAAI,EAEJioB,EAAQD,WAAWllD,UAAU6N,cAAc1F,UAAU/Q,OAAO,UAC5D+tD,EAAQD,WAAWx2B,kBAAkB,OAAD,QAClC53B,QAASquD,EAAQD,WAAWllD,UAAUmK,kBACtCk2B,eAAgBnR,OAASr2B,EAAY,WACrC81B,SAAU,SACVu1B,KAAM,KACHpD,MAKTh5C,EAAIgW,SAASyP,QAAQplB,UAAUxS,IAAI,UAEhCmS,EAAIo9C,aACLp9C,EAAIo9C,WAAWllD,UAAU6N,cAAc1F,UAAUxS,IAAI,UACrDu5B,GAAUg2B,EAAWx2B,kBAAkB,OAAD,QACpC53B,QAASgR,EAAIo9C,WAAWllD,UAAU6N,cAClC8gB,SAAU,SACVu1B,KAAM,KACHpD,KAIJqE,GAjDe,EAACr9C,EAAqBo1B,KACxC,MAAM1D,EAAI1xB,EAAIo9C,YAAcA,EACzB1rB,GACDA,EAAE9K,kBAAkB,OAAD,QACjB53B,QAASgR,EAAIgW,SAASyP,QACtBoB,SAAU,SACVu1B,KAAM,IACNmB,mBAAoBnoB,EAAI,EAAEooB,qBACjBA,EAAkB,SACvBzsD,GACDioD,G,EAwCLyE,CAAYz9C,EAAKo1B,GAGnBioB,EAAUr9C,GAEH,CAAI,EAeb,IAAI09C,GAAqB,EACzB,MAAMC,EAAoB,IAAI,IAAkB18B,EAAW/oB,WAAW,CAAC0lD,EAAOzwD,KAC5E,GAAGuwD,EACD,OAKF,GAAGpqD,KAAK8X,IAAIkyC,EAAWr8B,EAAW/oB,UAAUivB,YAAc,EACxD,OAEAm2B,GAAY,EAGd,MAAMt9C,EAAMm9C,EAAUU,uBAAuB1wD,GACvC2wD,GAAQ,EAAA5D,EAAA,GAAW/sD,IACrBywD,IAAUE,IAAS99C,EAAIo9C,aAI3Bh9B,EAAUpgB,EAAI,KAGhB,QAAiBmiC,GAAOttC,IACtB,IAAI1H,GAAS,EAAA4gB,EAAA,GAAgBlZ,EAAE1H,OAAuB,4BACtD,IAAIA,EAAQ,CAEV,GADAA,GAAS,EAAA4gB,EAAA,GAAgBlZ,EAAE1H,OAAuB,0BAC9CA,GAAUA,EAAOkT,UAAUqB,SAAS,UACtC,OAGFvU,EAASA,EAAOkV,kBAAkBA,iB,CAGpC,MAAMy7C,GAAQ,EAAA5D,EAAA,GAAW/sD,GAEnB6S,EAAMm9C,EAAUY,qBAAqB5wD,GAMxCizB,EAAUpgB,GAKb,IAAI6M,EAAY,EAAGmxC,EAAmB,EACtC,GAAGF,EAAQ,GAAK99C,EAAIo9C,WAAY,CAC9B,MAAMpuD,EAAUgR,EAAIgW,SAAS9d,UAC7B8lD,EAAmB,EACnBnxC,EAAY7d,EAAQ6d,UAAYmxC,C,CAGlCV,EAAWzwC,EAEX6wC,GAAqB,EACrBz8B,EAAW2F,kBAAkB,OAAD,QAC1B53B,QAAS6d,EAAY7M,EAAIgW,SAAS9d,UAAY+oB,EAAW/oB,UAAUmK,kBACnEwkB,SAAU,QACVu1B,KAAM,IACNmB,mBAAoB1wC,EAAY,EAAE2wC,qBAAqBA,EAAkBQ,OAAmBjtD,GACzFioD,IACF/zC,SAAQ,KACTmb,EAAUpgB,GACV09C,GAAqB,CAAK,GAC1B,GACD,CAAC/+C,mBAEJ,MAAM4C,EAAI0f,EAAWxgB,mBAAqBwgB,EAAWxgB,mBAAmB2G,KAAK6Z,GAAc0H,EAAA,EAM3F,OALA1H,EAAWxgB,mBAAqB,KAC9B08C,EAAU19C,QAAQsG,cAAc1F,UAAU1J,OAAO,gBAAiBsqB,EAAWkG,WAC7E5lB,GAAG,EAGE,CAACo8C,oBAAmBv9B,YAAW69B,gBAvFbj+C,IACvB,GAAGq9C,aAAO,EAAPA,EAASa,MACV,OAGFf,EAAUl8B,WAAWkG,UAAYnnB,EAAIgW,SAAS9d,UAAU2U,UAAY,EACpE,MAAMhW,EAAIsmD,EAAUC,WAAWllD,UACzBrD,EAAImL,EAAIgW,SAASyP,QACvB5uB,EAAEsnD,WAAatpD,EAAEsf,WAAatd,EAAEunD,YAAc,EAAIvpD,EAAEqjC,YAAc,EAClE9X,EAAUpgB,GAAK,EAAM,EA8E+B,EAG1C,EAAAwnB,aAAe,CAAM3yB,EAAoCwnD,GAAa,EAAOC,IAAqB,oCAC9G,MAAMnvD,GAAS,EAAAojC,EAAA,GAAU17B,EAAE1H,OAAuB,OAClD,IAAIA,EAAQ,OAAO,EAEnB,MAAM+G,EAAQ/G,EAAO0pB,QAAQ3iB,MAC7B,QAAIA,GAEG,EAAKmqD,UAAUnqD,EAAOmoD,EAAYC,EAC3C,IAmDF,MAAMC,GAAoB,IAAItG,EAC9B,uBAAmCsG,GACnC,W,gXC/gBA,MAAM+B,EAA0B,IAAIpwD,IAC7B,SAASqwD,EAAYhM,EAAer6C,EAAyB4M,GAAU,EAAO05C,GAAQ,G,MAK3F,MAAM9L,EAAYv6C,SAASC,cAAc,QAGzC,IAAIqmD,EAiBJ,GAnBA/L,EAAUryC,UAAUxS,IAAI,eAGrB2wD,IAAU,IACXC,EC5CW,SAAyBlM,GACtC,OAAO,EAAAnnB,EAAA,IAAamnB,EAAO,CACzBpwC,SAAU,EAAC,EAAAu8C,EAAA,GAAwBnM,KAEvC,CDwCUoM,CAAgBpM,IAEtBA,GAAQ,EAAAqM,EAAA,GAASrM,GACjBkM,GAAM,EAAArlC,EAAA,GAAcm5B,IAUtBG,EAAUl6C,OAAOimD,GAEd/L,EAAUzsB,SAASt2B,OAAS,EAAG,CAChC,MAAMs6C,EAAQyI,EAAUrwC,kBACxBqwC,EAAU7iC,UAAY,GACtB6iC,EAAUl6C,OAAOyxC,E,CAGnB,GAA4C,SAAd,QAA3B,EAAAyI,EAAUrwC,yBAAiB,eAAEsL,SAAmB,CACjD,MAAM8I,EAAQi8B,EAAUrwC,kBAElB7N,EAAMiiB,EAAMhnB,IAClB,IAAI6uD,EAAWnuD,IAAIqE,GAAM,CACvBiiB,EAAMhc,aAAa,UAAW,QAC9B,MAAMpK,EAAc8H,SAASC,cAAc,QAC3C/H,EAAYgQ,UAAUxS,IAAI,qBAEvBygB,EAAA,+BACDmI,EAAMpe,MAAM+c,QAAU,IACtB/kB,EAAYgI,MAAM+c,QAAU,KAG9BqB,EAAM/b,iBAAiB,QAAQ,MAC7B,SAAQ,KACH4T,EAAA,+BACDmI,EAAMpe,MAAM+c,QAAU,GACtB/kB,EAAYgI,MAAM+c,QAAU,IAG9Bs9B,EAAUryC,UAAU/Q,OAAO,SAE3BgvD,EAAWzwD,IAAI2G,EAAI,GACnB,GACD,CAACuG,MAAM,IAEV23C,EAAUl6C,OAAOnI,E,EAWrB,OALG6H,IACE4M,EAAS5M,EAAU4M,QAAQ4tC,GACzBx6C,EAAUoM,YAAYouC,IAGtBA,CACT,CAEO,SAASmM,EAAoB7vD,GAClC,MAAM8vD,GAAa,EAAA/wC,EAAA,GAAgB/e,EAAS,eAC5C,IAAI8vD,EAAY,OAEhB,MAAMz8C,EAAoBy8C,EAAWz8C,kBACrC,OAAGA,GAAqBA,EAAkBhC,UAAUqB,SAAS,gBACpD,CAAC6wC,MAAOlwC,EAAkBwU,QAAQkoC,aAAc7qD,MAAOmO,EAAkBwU,QAAQ3iB,OAErFlF,EAAQosD,WAAapsD,EAAQqsD,UAAkB,CAAC9I,MAAOvjD,EAAQssD,YAC3C,SAApBtsD,EAAQ2e,UAAuB3e,EAAQqR,UAAUqB,SAAS,UAAY1S,EAAQqT,oBAC/ErT,EAAUA,EAAQqT,mBAGb,CAACkwC,MAAOvjD,EAAQ4S,aAAa,QAAU5S,EAAQq8B,WAE1D,CAEA,MAAM2zB,EAAmD,eACnDC,EAAsD,CAACD,EAAiB,UAExEE,EAA6D,CADH,GAC4B,IACtFC,EAAiD,CACrD,CAAC,wBAAyB,SAC1B,CAAC,yBAA0B,WAC3B,CAAC,qBAAsB,QACvB,CAAC,wBAAyB,OAC1B,CAAC,yBAA0B,SAC3B,CAAC,gBAAiB,QAElB,CAAC,cAAe,QAChB,CAAC,aAAqB,KAGxB,IAAIC,EACJ,SAAS1L,IACP,GAAG0L,EACD,OAAOA,EAQTA,EAAS,IAAI/wD,IAL8C,CACzD,CAAC6wD,EAA8B,IAC/B,CAACD,EAAuB,MAI1B,IAAI,MAAM1M,KAAS,IAAO,CACxB,MACMz9B,EAAI,GADM,IAAMy9B,GAEhB8M,EAAWF,GAAkBrqC,EAAE,GAAK,GAC1C,IAAIuqC,EAAU,SAEd,IAAIxoD,EAAIuoD,EAAOrvD,IAAIsvD,GACfxoD,IACFA,EAAI,GACJuoD,EAAO1uD,IAAI2uD,EAAUxoD,IAGvBA,GAAGie,EAAE8H,MAAM,IAAM,GAAK21B,C,CAGxB6M,EAAOrxD,OAAOoxD,EAAiBlpC,OAC/BkpC,EAAiB9iC,QAAQ6iC,EAA8BD,GACvD,MAAMK,EAAQH,EAAiBv3C,KAAI,EAAElT,KAAQA,IACvCzH,EAAU,IAAImyD,EAAOnyD,WAAW6vB,MAAK,CAACvb,EAAGwb,IAAMuiC,EAAMr4C,QAAQ1F,EAAE,GAAG,IAAM+9C,EAAMr4C,QAAQ8V,EAAE,GAAG,MAGjG,OAFAqiC,EAAS,IAAI/wD,IAAIpB,GAEVmyD,CACT,CAEA,MAAMG,GAAqB,OAAc,GAAI,IAK9B,MAAMC,UAAiB,KAUpC3yD,YAAY2xB,GAOVxf,MACEwf,EAAQzqB,SACR,gBACA,IAAMwrD,GACN,GACA,EACA,GASI,KAAAE,qBAAuB,EAAEtyD,SAAQS,cACvC,MAAMyxD,EAAWvyD,KAAK4yD,cAAc3vD,IAAI5C,GAIlCwyD,EAAWN,EAASrpC,SAAS2pC,SAC7BC,EAA6B,GACnC,GAAGD,EAAU,CACXC,EAAYzwD,KAAKwwD,GACjB,MAAME,EAAiE,IAAIxxD,IACxET,GACDgyD,EAAYzwD,QAAQkwD,EAAS//B,MAAM1X,KAAI,EAAE1T,QAAOlF,cAC9C,IAAIkF,EACF,OAAOlF,EAST,MAAM8wD,EAAqB9wD,EAAQqT,kBAKnC,OAJAy9C,EAAmBvtC,OAAM,GAEzBstC,EAAanvD,IAAIovD,EAAmB5rD,MAAO,IAAIhG,IAAI,CAAC4xD,KAE7C9wD,CAAO,KAGhB2wD,EAAS9xD,IAAIgyD,OAAqD9uD,OAAWA,GAAW,KAExF4uD,EAASI,cACTJ,EAAS3f,iBAAiBppC,Q,MAEpBhJ,GACRgyD,EAAYzwD,QAAQkwD,EAAS//B,MAAM1X,KAAI,EAAE5Y,aAAaA,KAMxD,GAFAqwD,EAASrpC,SAASsJ,MAAMmQ,mBAAmBmwB,GAExCD,IAAa/xD,EAAS,CACvB,MAAMiyD,EAAiE,IAAIxxD,IAC3EgxD,EAAS//B,MAAMztB,SAAQ,EAAEqC,QAAOlF,cAC9B,IAAIkF,EACF,OAGF,MAAM4rD,EAAqB9wD,EAAQqT,kBACnCy9C,EAAmBvtC,QACnBstC,EAAanvD,IAAIovD,EAAmB5rD,MAAO,IAAIhG,IAAI,CAAC4xD,IAAqB,IAGrDH,EAAS9xD,IAAIgyD,OAAqD9uD,GAAW,E,GAia/F,KAAAivD,eAAkBnrD,KACxB,EAAAqS,EAAA,GAAYrS,GAEZ,MAAM,OAAC1H,GAAU0H,EAEXqD,GAAY,EAAA6V,EAAA,GAAgB5gB,EAAQ,kBACpCkyD,EAAWvyD,KAAK4yD,cAAc3vD,IAAImI,GACxC,IAAG,EAAA6V,EAAA,GAAgB5gB,EAAQ,kBAAmB,CAC5C,GAAGkyD,EAASnB,MACV,OAIF,YADA,IAAI,IAAc,CAACxpD,GAAI2qD,EAAS3uD,IAAIgE,GAAIijD,YAAa0H,EAAS3uD,IAAIinD,cAAc,GAAMh8B,M,CAIxF,MAAM42B,EAAQsM,EAAoB1xD,GAClC,GAAIolD,EAAJ,CAIA,GACEA,EAAMr+C,QACLoa,EAAA,YACCxhB,KAAKmzD,aAtkBmD,KAskBpCZ,EAAS3qD,GAAgC5H,KAAKgI,SAAWwZ,EAAA,QAE/E,CACA,MAAM/M,EAAIpJ,SAASC,cAAc,KASjC,OARAmJ,EAAEI,QAAU,KACV6gB,EAAA,qBACA,SAAW,OAEb,EAAAjG,EAAA,IAAS,CACPC,YAAa,2BACb0jC,kBAAmB,CAAC3+C,I,CAKrBzU,KAAKiU,QACNjU,KAAKiU,QAAQ,OAAD,wBACPwxC,GAAK,CACRvjD,SAAS,EAAA+e,EAAA,GAAgB5gB,EAAQ,eAAekV,qBAGlDmgB,EAAA,8BAAwC+vB,GAAO,GAG9C,MACD,EAAApG,EAAA,I,IA9gBF,EAAAlnB,EAAA,GAAWn4B,KAAM0xB,GACjB1xB,KAAKoL,UAAUmI,UAAUxS,IAAI,iBAC7Bf,KAAK2S,QAAQ/K,GAAK,gBAClB5H,KAAKqzD,eAAiB,EACxB,CAyFOtvD,U,MACLmO,MAAMnO,UACc,QAApB,EAAA/D,KAAKszD,uBAAe,SAAEvvD,SACxB,CAEOsyB,OACLnkB,MAAMmkB,OACNr2B,KAAKq2B,UAAOpyB,EAEZ,MAAMsvD,EAAgD,CACpDC,KAAMxzD,KAAKmzD,aAAenzD,KAAK2S,QAAU88C,EAAA,iBAG3CzvD,KAAKyzD,sBAAwB,IAAI,IAAsBzzD,KAAK2yD,qBAAsBY,GAElFvzD,KAAK0zD,kBAAoB,iBAA8B1zD,KAAMA,KAAKq1C,KAAMr1C,KAAKm0B,WAAYn0B,KAAKswD,gBAAYrsD,EAAWjE,KAAK6R,gBAE1H,MAAMsK,GAAY,EAAA8qB,EAAA,GAAajnC,KAAK2S,SAAS,GAE7C,IAAIghD,EAWAC,EATJ,IAAI5zD,KAAKmzD,aAAc,CACrB,MAAMz2C,EAAI1c,KAAKszD,gBAAkB,IAAI,UAAYrvD,GACjDyY,EAAEtR,UAAUmI,UAAUxS,IAAI,gCAE1B4yD,EAAqBtoD,SAASC,cAAc,OAC5CqoD,EAAmBpgD,UAAUxS,IAAI,yBACjC4yD,EAAmBjoD,OAAOgR,EAAEtR,U,CAI9Bw7C,IAIEgN,EAHE5zD,KAAK6zD,eAGO,IAAItyD,IAAI,CACpB,CAAC,CAAC6wD,EAA6B,GAAI,UAAW,MAHlCxL,IAQhBgN,EAAY7uD,SAAQ,CAAC+uD,GAASC,EAAkBhgD,MAC9C,MAAMw+C,EAAWvyD,KAAKg0D,oBAAoBD,EAAkBA,EAAkBhgD,GAAOA,GACrFw+C,EAASrpC,SAAS9d,UAAUmI,UAAU/Q,OAAO,QAC7C+vD,EAASrpC,SAASsJ,MAAMjf,UAAUxS,IAAIgT,IAAS/T,KAAKmzD,aAAe,WAAa,aAEhFW,EAAO/uD,SAASkvD,IAKd,MAAMxO,GAAQ,QAAoBwO,GAiBlCj0D,KAAKk0D,mBAAmB,CACtB3B,WACA9M,MAAO,CAACA,SACR0O,OAAO,GACP,GAKF,IAGJ,MAAM5lD,EAAU8W,QAAQqH,IAAI,CAC1B1sB,KAAKmzD,kBAAelvD,GAAY,EAAAM,EAAA,GAAM,MACrCvE,KAAK6zD,gBAAkB7zD,KAAKiH,SAASmtD,gBAAgBC,gBAAgB,WACrEr0D,KAAKmzD,cAAgBnzD,KAAKiH,SAASmtD,gBAAgBC,gBAAgB,UACpEr0D,KAAKs0D,cAAgBt0D,KAAKiH,SAAS6jD,mBAAmByJ,mBAAmBv0D,KAAKs0D,cAC9Et0D,KAAKiH,SAASmtD,gBAAgBI,oBAC7BlmD,MAAK,EAAEsB,EAAG8yB,EAAQ+xB,EAAcC,EAASC,MAC1Cx4C,EAAU3Z,SAEPkyD,IACDD,EAAeC,EAAQhJ,UAAU5wC,KAAKnZ,GAAQA,EAAIiG,MAGpD,MAAMgtD,EAAiB50D,KAAK60D,WAAW3C,GACjC4C,EAAuB90D,KAAK60D,WAAWE,IAc7C,GAZI/0D,KAAKmzD,cACG,CACRyB,GAAkB,CAACA,EAAgBlyB,GACnCoyB,GAAwB,CAACA,EAAsBL,IAG/C1kC,OAAO+M,SAAS/3B,SAAQ,EAAEwtD,EAAU7vB,MACpC6vB,EAASx9B,MAlOO,GAmOhB2N,EAAOvQ,OAnOS,GAmOiBuQ,EAAO7/B,OAnOxB,GAmOmD,IAIpE+xD,GAAkBlyB,EAAQ,IAAI,MAAM+iB,KAAS/iB,EAC9C1iC,KAAKk0D,mBAAmB,CACtB3B,SAAUqC,EACVnP,MAAO,CAACA,SACR0O,OAAO,IAIX,GAAGW,EAAsB,CAEvB,GADA90D,KAAKg1D,0BAA0BF,GAC5BL,EAAc,IAAI,MAAMrtD,KAASqtD,EAClCz0D,KAAKk0D,mBAAmB,CACtB3B,SAAUuC,EACVrP,MAAO,CAACA,MAAO,GAAIr+C,SACnB+sD,OAAO,IAGXW,EAAqB5rC,SAAS9d,UAAUG,MAAM0pD,WAAa,O,CAG7D5C,EAAiBttD,SAAQ,EAAE6C,MACzB,MAAM2qD,EAAWvyD,KAAK60D,WAAWjtD,GAC7B2qD,IAIJvyD,KAAKk1D,oBAAoB3C,GAAU,GAEhC3qD,IAAOsqD,GAtT8C,KAsT3BtqD,IAC3B2qD,EAASjC,WAAatwD,KAAKszD,gBAC3BtzD,KAAKszD,gBAAgBloD,UAAUM,OAAO6mD,EAASrpC,SAASyP,U,IAI5D34B,KAAKm1D,mBAELP,GAAkBjB,GAAsBiB,EAAe1rC,SAASyP,QAAQy8B,MAAMzB,GAE9EgB,EAAKA,KAAK5vD,SAASnB,IACjB5D,KAAKq1D,iBAAiBzxD,EAAI,IAG5B5D,KAAK6R,eAAe9Q,IAAIygB,EAAA,EAAxBxhB,CAAmC,kBAAkB,KACnDA,KAAKs1D,sBAAsB,IAG7Bt1D,KAAK6R,eAAe9Q,IAAIygB,EAAA,EAAxBxhB,CAAmC,eAAgBA,KAAKu1D,gBAAgB3tD,IACtE,MAAM2qD,EAAWvyD,KAAK60D,WAAWjtD,GAC7B2qD,IAIJvyD,KAAKw1D,iBAAiBjD,GAAU,GAEhCvyD,KAAK6R,eAAe9Q,IAAI0uD,EAAA,GAAxBzvD,CAA2C,mBAAmB,KAC5DA,KAAK0zD,kBAAkBvC,gBAAgBoB,EAAS,GAC/C,CAACtkD,MAAM,IAAM,KAGlB,MAAMwnD,EAAmBC,IACvB,IAAI,MAAM9tD,KAAM5H,KAAK60D,WAAY,CAC/B,MACMhC,EADW7yD,KAAK60D,WAAWjtD,GACPshB,SAAS2pC,SAChCA,IACDA,EAAS8C,wBAA0BD,EAC/BA,GACF7C,EAAS+C,2BAAsB3xD,GAAW,G,IAMjDjE,KAAKmzD,cAAgBnzD,KAAK6R,eAAe9Q,IAAI0uD,EAAA,GAAxBzvD,CAA2C,UAAU,KACzEy1D,GAAgB,EAAM,KAGvBz1D,KAAKmzD,cAAgBnzD,KAAK6R,eAAe9Q,IAAI0uD,EAAA,GAAxBzvD,CAA2C,SAAS,KACxEy1D,GAAgB,EAAK,IAGvBz1D,KAAK6R,eAAe9Q,IAAIygB,EAAA,EAAxBxhB,CAAmC,sBAAuB4D,KACpD5D,KAAK60D,WAAWjxD,EAAIgE,KAAOhE,EAAI6J,OAAOqmD,QACxC9zD,KAAKq1D,iBAAiBzxD,GAAK,E,IAI/B5D,KAAK6R,eAAe9Q,IAAIygB,EAAA,EAAxBxhB,CAAmC,oBAAqB4D,IACtD,MAAM2uD,EAAWvyD,KAAK60D,WAAWjxD,EAAIgE,IACrC,GAAG5H,KAAK61D,eAAetD,GAAW,CAChC,MAAM,SAACM,GAAYN,EAASrpC,SACzB2pC,GACDA,EAAS3f,iBAAiBppC,O,MAK/B9J,KAAKmzD,cAAgBnzD,KAAK6R,eAAe9Q,IAAIygB,EAAA,EAAxBxhB,CAAmC,eAAgBA,KAAKu1D,gBAAgB9P,IAC5F,MAAM8M,EAAWvyD,KAAK60D,WAAWpP,EAAMr+C,MA3XiB,GA2XgB8qD,GACxE,IAAIK,EACF,OAGF,MAAMhqD,EAA0Ck9C,EAAMr+C,MACnDpE,GAASA,EAAKoE,QAAUq+C,EAAMr+C,MAC9BpE,GAASA,EAAKyiD,QAAUA,EAAMA,MAC3BtjD,GAAQ,EAAA0jC,EAAA,GAAc0sB,EAAS//B,MAAOjqB,GAC5C,GAAGpG,GAED,GADAowD,EAAS//B,MAAMjD,QAAQptB,GACpBnC,KAAK81D,kBAAkBvD,GAAW,CACnC,MAAM,SAACM,GAAYN,EAASrpC,UAC5B,EAAAud,EAAA,GAAuBtkC,EAAMD,QAASqwD,EAASrpC,SAASsJ,MAAOqgC,EAAW,EAAI,GAAI,GAClFA,SAAAA,EAAUkD,a,OAGZ/1D,KAAKk0D,mBAAmB,CACtB3B,WACA9M,QACA0O,OAAO,EACPn8C,SAAS,IAIc,IAAxBhY,KAAKg2D,gBACNh2D,KAAK0zD,kBAAkBpgC,UAAUmyB,EAAMr+C,MAAQpH,KAAK60D,WAAW3C,GAAmBK,E,MAIrFvyD,KAAKmzD,cAAgBnzD,KAAK6R,eAAe9Q,IAAI20B,EAAA,GAAxB11B,CAAsC,gBAAgB,KAC1EA,KAAKs1D,sBAAsB,IAG7Bt1D,KAAKs1D,uBAELt1D,KAAK0zD,kBAAkBpgC,UAAUshC,QAAAA,EAAkBE,EAAqB,IAM1E,OAHA,QAAiB90D,KAAK2S,QAAS3S,KAAKkzD,eAAgB,CAACrhD,eAAgB7R,KAAK6R,kBAC1E,OAA6B,CAAC64C,SAAU1qD,KAAK2S,QAASd,eAAgB7R,KAAK6R,iBAEpEtD,CACT,CAEQ8mD,iBAAiBzxD,EAA4BoU,GACnD,MAAMu6C,EAAWvyD,KAAKi2D,eAAeryD,GAAK,EAAA0oB,EAAA,GAAc1oB,EAAImL,QAC5D/O,KAAKw1D,iBAAiBjD,EAAUv6C,GAChC,MAAM,UAAC5M,EAAS,eAAE8qD,GAAkB3D,EAASrpC,SAC7CqpC,EAASrpC,SAASsJ,MAAMjf,UAAUxS,IAAI,aACtCwxD,EAASrpC,SAAS9d,UAAUmI,UAAUxS,IAAI,kBAC1CwxD,EAASrpC,SAASna,MAAMwE,UAAUxS,IAAI,SAEtCf,KAAKg1D,0BAA0BzC,GAEfvyD,KAAKiH,SAAS6jD,mBAAmBC,cAAcnnD,GACvD0K,MAAK,EAAEo9C,gBACbA,EAAU3mD,SAASsG,IACjBrL,KAAKk0D,mBAAmB,CACtB3B,WACA9M,MAAO,CAACr+C,MAAOiE,EAASzD,GAAI69C,MAAQp6C,EAA+B8qD,iBACnEhC,OAAO,GACP,IAOJn0D,KAAK2yD,qBAAqB,CAACtyD,OAAQkyD,EAASrpC,SAAS9d,UAAWtK,QAASd,KAAK81D,kBAAkBvD,KAEhGA,EAAS6D,yBACThrD,EAAUmI,UAAU/Q,OAAO,OAAO,KAGpC,OAAoB,CAClBoB,MACAwH,UAAW8qD,EACX51D,MAAO,KACPshB,cAAe,mBACfsF,MAAO,GACPI,OAAQ,GACR9iB,UAAU,GAEd,CAEYwD,aACV,OAAO0tB,EAAA,cACT,CAEO2gC,oBACL,OAAOr2D,KAAK60D,WAAWE,GACzB,CAEQO,uBACN,MAAM/C,EAAWvyD,KAAK60D,WAAWE,IAC3BuB,EAAa90C,EAAA,WAAqBxhB,KAAKgI,SAAWwZ,EAAA,OAClD+0C,EAAuBD,GAAct2D,KAAKmzD,aAChDjhD,MAAMgjD,oBAAoB3C,IAAYA,EAAS//B,MAAM3vB,QAAU0zD,GAC/Dv2D,KAAK2S,QAAQY,UAAU1J,OAAO,cAAeysD,EAC/C,CAEUpB,oBAAoB3C,EAA4BzxD,GAjeI,KAkezDyxD,EAAS3qD,GAKZsK,MAAMgjD,oBAAoB3C,EAAUzxD,GAJlCd,KAAKs1D,sBAKT,CAEQN,0BAA0BzC,GAChC,MAAMM,EAAW,YAAkC,CACjDn2B,eAAgB,KAChB85B,gBAAiB/oC,EAAA,0BAGnB8kC,EAASrpC,SAAS2pC,SAAWA,EAC7BN,EAASrpC,SAASsJ,MAAM9mB,OAAOmnD,EACjC,CAEOqB,mBAAmBxiC,GAQxB,MAAM,SAAC6gC,EAAQ,MAAE9M,EAAK,MAAE0O,EAAK,QAAEn8C,GAAW0Z,EAC1C,IAAIxvB,EAAUwvB,EAAQxvB,QACtB,GAAGA,EAAS,CACV,MAAM0jD,EAAYv6C,SAASC,cAAc,QACzCs6C,EAAUryC,UAAUxS,IAAI,eACxB6kD,EAAUl6C,OAAOxJ,GACjBA,EAAU0jD,C,MACL,GAAGH,EAAMr+C,MAAO,CACrB,MAAM4rD,EAAqB,YAA0BvN,EAAMr+C,OACrDwxB,EAAOvtB,SAASC,cAAc,QACpCstB,EAAKrlB,UAAUxS,IAAmB,eAClC63B,EAAKltB,OAAOsnD,GACZ9wD,EAAU02B,C,MAEV12B,EAAUuvD,EAAYhM,EAAMA,WAAwDxhD,GAAW,GAGjG,MAAMjB,EAAI,+BACJyiD,GAAS,CAACA,WAAOxhD,IAAW,CAChC/B,aAIAwvB,EAAQ3L,QACN/lB,KAAKy2D,cACHzzD,EAAKoE,MACHpH,KAAKy2D,YAAYrvD,QAAUpE,EAAKoE,MAChCpH,KAAKy2D,YAAYhR,QAAUziD,EAAKyiD,UAItCzlD,KAAKy2D,YACLz2D,KAAKqzD,eAAehxD,KAAKW,GACzBd,EAAQqR,UAAUxS,IAAI,WAGxBwxD,EAAS//B,MAAMxa,EAAU,UAAY,QAAQhV,GACzCmxD,GAAUn0D,KAAK02D,aAAanE,IAC9BvyD,KAAK22D,sBAAsBpE,EAE/B,CA+DOj/B,UAAUmyB,G,SAEbA,IAAUzlD,KAAKy2D,cACfhR,aAAK,EAALA,EAAOr+C,OAAQq+C,EAAMr+C,SAA0B,QAAhB,EAAApH,KAAKy2D,mBAAW,eAAErvD,QAAQq+C,aAAK,EAALA,EAAOA,UAA0B,QAAhB,EAAAzlD,KAAKy2D,mBAAW,eAAEhR,UAK9FzlD,KAAKy2D,YAAchR,EAEnBzlD,KAAKqzD,eAAetuD,SAAS/B,IAC3BA,EAAKd,QAAQqR,UAAU/Q,OAAO,SAAS,IAGzCxC,KAAKqzD,eAAexwD,OAAS,EAE7B7C,KAAK4yD,cAAc7tD,SAASwtD,IAC1BA,EAAS//B,MAAMztB,SAAS/B,KACnByiD,EAAMr+C,MAAQpE,EAAKoE,QAAUq+C,EAAMr+C,MAAQpE,EAAKyiD,QAAUA,EAAMA,SACjEziD,EAAKd,QAAQqR,UAAUxS,IAAI,UAC3Bf,KAAKqzD,eAAehxD,KAAKW,G,GAE3B,IAEN,CAEOmY,UACLnb,KAAKg2D,eAAiBh2D,KAAKm0B,WAAWkG,SACxC,E,0KE3vBa,MAAMu8B,UAA4B,IAG/C72D,YACE82D,EACUC,EACVplC,GAEAxf,MAAM2kD,GAHI,KAAAC,mBAAAA,EAJJ,KAAAC,YAAiD,IAAIx1D,IAS3DvB,KAAK6vD,YAAc,IAAI,KAAuB7sD,I,MAC5C,MAAM,OAAC3C,EAAM,QAAES,GAAWkC,EAEpBg0D,EAAYh3D,KAAK+2D,YAAY9zD,IAAI5C,GACvC22D,EAAUl2D,QAAUA,EAEjBA,GACDk2D,EAAUC,SAAU,EAChBj3D,KAAKk3D,MAAMniD,SAASiiD,IACtBh3D,KAAKk3D,MAAM70D,KAAK20D,KAGlB,EAAAG,EAAA,GAAiBn3D,KAAKk3D,MAAOF,GAGR,QAAvB,EAAAh3D,KAAK82D,0BAAkB,mBAAG9zD,GAC1BhD,KAAKo3D,wBAAwB,GAC5B1lC,EACL,CAEOjM,QACLvT,MAAMuT,QACNzlB,KAAK+2D,YAAYtxC,OACnB,CAWO9hB,QAAQ/C,GACbZ,KAAK+2D,YAAYnzD,IAAIhD,EAAGwtB,IAAKxtB,GAC7BsR,MAAMvO,QAAQ/C,EAChB,CAEOkC,UAAUlC,GACfZ,KAAK+2D,YAAY91D,OAAOL,EAAGwtB,KAC3Blc,MAAMpP,UAAUlC,EAClB,E,2dCrBK,MAAMy2D,EAIXt3D,YACUu3D,EACAh3D,EACA2G,EACAyqB,GAHA,KAAA4lC,qBAAAA,EACA,KAAAh3D,MAAAA,EACA,KAAA2G,SAAAA,EACA,KAAAyqB,QAAAA,EANF,KAAA6lC,SAA6B,IAAIn2D,IAwDjC,KAAAo2D,wBAA0B,CAACt1D,EAAsBpB,KAEvChB,EAAA,gBAAmCoC,GAC3C6C,SAAS3C,IACXtB,EAGFhB,EAAA,iBAAoCsC,GAAQ,GAF5CtC,EAAA,kBAAqCsC,E,GAIvC,EAGI,KAAAq1D,eAAuBv1D,GAAyB,EAAD,gCACrD,MAAMkF,EAAQlF,EAAQ6nB,QAAQ3iB,MACxBzF,QAAY3B,KAAKiH,SAASC,eAAeC,OAAOC,GAEhDS,EAAO4lB,EAAA,0BAIPlf,GAAU,QAAY,CAC1B5M,MACAysB,IAAKlsB,EACLglB,MAAOrf,EACPyf,OAAQzf,EACR+Z,cAAe,KACfthB,MAAON,KAAKM,MACZozC,WAAW,EACXjvC,MAAM,EACNf,MAAM,EACNioD,UAAU,IACTr9C,MAAK,EAAEo+B,YAAYA,IAWtB,OATAn+B,EAAQD,MAAK,KAEXtO,KAAKw3D,wBAAwBt1D,EAASlC,KAAK4hB,cAAciuC,YAAYxrC,UAAUniB,GAAS,IAOnFqM,CACT,IAEO,KAAAmpD,iBAAyBx1D,GAAyB,EAAD,gCACtD,MAAMkF,EAAQlF,EAAQ6nB,QAAQ3iB,MACxBzF,QAAY3B,KAAKiH,SAASC,eAAeC,OAAOC,GAItDpH,KAAKw3D,wBAAwBt1D,GAAS,GAEtCA,EAAQ0W,YAAc,GACtB5Y,KAAK23D,cAAch2D,EAAKO,EAC1B,IAvGElC,KAAK4hB,cAAgB,IAAIg1C,OAAoB3yD,GAAW,EAAE5D,SAAQS,cAC5DA,GACFd,KAAK03D,iBAAiBr3D,E,GAEvBqxB,EACL,CAEOjM,QACLzlB,KAAK4hB,cAAc6D,OACrB,CAEOkyC,cAAch2D,EAAiBO,EAAuBq1B,GAqB3D,OApBIr1B,KACFA,EAAUmJ,SAASC,cAAc,QACzBiI,UAAUxS,IAAI,YAAa,iBACnCmB,EAAQ6nB,QAAQ3iB,MAAQ,GAAKzF,EAAIiG,GAE9BjG,EAAI41D,UACLv3D,KAAK43D,gBAAgB11D,KAKF,QAAY,CACjCP,MACAysB,IAAKlsB,EACL0f,cAAe5hB,KAAKs3D,qBACpBh3D,MAAON,KAAKM,MACZozC,UAAW/xC,EAAI41D,SACfhgC,iBAGKr1B,CACT,CAEO01D,gBAAgB11D,GACrBlC,KAAKu3D,SAASx2D,IAAImB,GAClBlC,KAAK4hB,cAAcje,QAAQ,CACzByqB,IAAKlsB,EACLU,KAAM5C,KAAKy3D,gBAEf,CAEOI,kBAAkB31D,GACvBlC,KAAKu3D,SAASt2D,OAAOiB,GACrBlC,KAAK4hB,cAAc3gB,OAAO,CAACmtB,IAAKlsB,GAClC,EA8DK,MAAM41D,EAuBX/3D,YAAY2xB,G,QAUV,MAAMtmB,EAAYC,SAASC,cAAc,OACzCF,EAAUmI,UAAUxS,IAAI,kBAExB,MAAMyxB,EAAQnnB,SAASC,cAAc,OAGrC,IAAIyD,EAOA4pB,EAAsBu9B,EAT1B1jC,EAAMjf,UAAUxS,IAAI,kBAGjB2wB,EAAQ3iB,QACTA,EAAQ1D,SAASC,cAAc,OAC/ByD,EAAMwE,UAAUxS,IAAI,kBACpBgO,EAAMrD,OAAOgmB,EAAQ3iB,QAInB2iB,EAAQqmC,YACVp/B,GAAU,YAAW10B,EAAW,CAACse,UAAU,IAC3CoW,EAAQplB,UAAUxS,IAAI,4BAEtBm1D,EAAiB7qD,SAASC,cAAc,OACxC4qD,EAAe3iD,UAAUxS,IAAI,oCAE7B43B,EAAQjtB,OAAOwqD,IAGdnnD,GAAO3D,EAAUM,OAAOqD,GAC3B3D,EAAUM,OAAO8mB,GAEjBxyB,KAAKkpB,SAAW,CACd9d,YACA2D,QACAyjB,QACAmG,UACAu9B,kBAEFl2D,KAAK4H,GAAK8pB,EAAQ9pB,GAClB5H,KAAKwyB,MAAQ,GAEbxyB,KAAKg4D,iBAAmBtmC,EAAQsmC,iBAChCh4D,KAAKi4D,oBAAsBvmC,EAAQumC,oBACnCj4D,KAAKk4D,KAAmB,QAAZ,EAAAxmC,EAAQwmC,YAAI,QAAI,EAC5Bl4D,KAAKm4D,KAAmB,QAAZ,EAAAzmC,EAAQymC,YAAI,QAAI,CAC9B,CAEO/B,yBACL,MAAOlvC,MAAOkxC,GAAkBp4D,KAAKg4D,mBAC/BK,EAAcr4D,KAAKi4D,sBAAsB/wC,MAE/C,IAAIoxC,EAAcF,EAAiBC,EAChCr4D,KAAKk4D,OAAMI,GAAe9xD,KAAKywC,MAAMqhB,EAAc,GAAKt4D,KAAKk4D,KAAOG,GACvEC,EAAc9xD,KAAKywC,MAAMqhB,GAEzB,MAAMC,EAAO/xD,KAAK0wC,KAAKl3C,KAAKwyB,MAAM3vB,OAASy1D,GAC3C,IAAIhxC,EAASixC,EAAOF,EACjBr4D,KAAKm4D,OAAM7wC,IAAWixC,EAAO,GAAKv4D,KAAKm4D,MAE1Cn4D,KAAKkpB,SAASsJ,MAAMjnB,MAAMitD,UAAYlxC,EAAS,IACjD,EAGK,MAAMmxC,EAyBX14D,YACYkH,EACAyxD,EACAT,EACA1qC,EACA2qC,EACAC,GALA,KAAAlxD,SAAAA,EACA,KAAAyxD,uBAAAA,EACA,KAAAT,oBAAAA,EACA,KAAA1qC,QAAAA,EACA,KAAA2qC,KAAAA,EACA,KAAAC,KAAAA,EAfF,KAAAhX,SAAU,EAyKV,KAAAgU,iBAAmB,KAC3B,IAAI,MAAO/pD,EAAWmnD,KAAavyD,KAAK4yD,cACtCL,EAAS6D,wB,EAsDH,KAAAb,eAAqBnlD,GACtB,IAAIuoD,KACNlJ,EAAA,cACDzvD,KAAK44D,gBAAgBv2D,KAAK,CAAC+N,KAAIuoD,SAE/BvoD,KAAMuoD,E,EArNV34D,KAAK60D,WAAa,CAAC,EACnB70D,KAAK4yD,cAAgB,IAAIrxD,IACzBvB,KAAK64D,uBAAyB,IAAIt3D,IAClCvB,KAAK84D,gBAAkB,GACvB94D,KAAK44D,gBAAkB,GAEvB54D,KAAK6R,eAAiB,IAAI,IAE1B7R,KAAKoL,UAAYC,SAASC,cAAc,OACxCtL,KAAKoL,UAAUmI,UAAUxS,IAAI,WAAY,uBAEzCf,KAAK+4D,YAAc1tD,SAASC,cAAc,OAC1CtL,KAAK+4D,YAAYxlD,UAAUxS,IAAI,eAAgB,0BAE/Cf,KAAKq1C,KAAOhqC,SAASC,cAAc,OACnCtL,KAAKq1C,KAAKh6B,UAAY,6DAEtBrb,KAAK+4D,YAAYrtD,OAAO1L,KAAKq1C,MAC7Br1C,KAAKswD,WAAa,IAAI,KAAYtwD,KAAK+4D,aAEvC/4D,KAAK2S,QAAUtH,SAASC,cAAc,OACtCtL,KAAK2S,QAAQY,UAAUxS,IAAI,qBAE3Bf,KAAKoL,UAAUM,OAAO1L,KAAK+4D,YAAa/4D,KAAK2S,SAE7C3S,KAAKm0B,WAAa,IAAI,KAAWn0B,KAAK2S,QAAS,WACjD,CAEOo+C,uBAAuB3lD,GAC5B,OAAOpL,KAAK4yD,cAAc3vD,IAAImI,EAChC,CAEO6lD,qBAAqBt4B,GAC1B,OAAO34B,KAAK64D,uBAAuB51D,IAAI01B,EACzC,CAEUs9B,eAAerL,EAAwB77C,EAAuCiqD,EAAmBjB,GACzG,MAAMxF,EAAqB,IAAIuF,EAAoB,CACjDlwD,GAAI,GAAKgjD,EAAWhjD,GACpBmH,QACA2X,gBAAiB1mB,KAAK2S,QACtBqlD,iBAAkB,KAChB,IAAI9wC,EAAeI,EACnB,GAAGtnB,KAAKg4D,iBAAkB,CACxB,MAAMnwD,EAAO7H,KAAKg4D,mBAClB9wC,EAAQrf,EAAKqf,MACbI,EAASzf,EAAKyf,M,KACT,CACL,MAAM2xC,EAAWC,EAAA,oBAAmC,aACpDhyC,OAAqBjjB,IAAbg1D,EAAyB55C,EAAA,QAAmB45C,C,CAGtD,MAAO,CAAC/xC,MAAOA,EAAQlnB,KAAKutB,QAASjG,SAAO,EAE9C2wC,oBAAqBj4D,KAAKi4D,oBAC1BC,KAAMl4D,KAAKk4D,KACXC,KAAMn4D,KAAKm4D,KACXJ,cAGC/3D,KAAK04D,wBACNnG,EAASrpC,SAASsJ,MAAMjf,UAAUxS,IAAIf,KAAK04D,wBAG7C,MAAMttD,EAAYmnD,EAASrpC,SAAS9d,UAepC,OAdAA,EAAUmI,UAAUxS,IAAI,QAExBwxD,EAAS3uD,IAAMgnD,EACf5qD,KAAK60D,WAAWjK,EAAWhjD,IAAM2qD,EACjCvyD,KAAK4yD,cAAchvD,IAAIwH,EAAWmnD,IACjCwF,GAAa/3D,KAAK64D,uBAAuBj1D,IAAI2uD,EAASrpC,SAASyP,QAAS45B,GAEzEvyD,KAAKyzD,sBAAsB9vD,QAAQyH,IAClC2sD,GAAa/3D,KAAK0zD,kBAAkB7C,kBAAkBsI,2BAA2B/tD,GAE9E4tD,IACDjB,GAAaxF,EAASrpC,SAASyP,QAAQplB,UAAUxS,IAAI,aAGjDwxD,CACT,CAEUiD,iBAAiBjD,EAAoBv6C,GAC7C,MAAM,QAAC2gB,EAAO,UAAEvtB,GAAamnD,EAASrpC,SAChCkwC,EAAWphD,EAAUhY,KAAK84D,gBAAgB/oC,QAAQwiC,GAAaA,EAASpR,UAASt+C,OAAS,MAChG,IAAIw2D,GAAkB,EACtB,MAAMC,EAAUthD,EAAUhY,KAAK84D,gBAAgB/oC,QAAQwiC,GAClDA,EAASjC,aAAe+I,GACzBA,GAAkB,GACX,GAGF9G,EAASpR,UAAYoR,EAASjC,YAAciC,EAASrpC,SAASyP,UACpE91B,OAAS,OACZ,EAAA4jC,EAAA,GAAuBr7B,EAAWpL,KAAKm0B,WAAW/oB,UAAWguD,IAC7D,EAAA3yB,EAAA,GAAuB9N,EAAS34B,KAAKq1C,KAAMikB,EAC7C,CAEUxD,kBAAkBvD,GAC1B,OAAOvyD,KAAKyzD,sBAAsB3D,aAAa/6C,SAASw9C,EAASrpC,SAAS9d,UAC5E,CAEU8pD,oBAAoB3C,EAAoBzxD,G,MAChD,GAAIA,EAGG,CACL,MAAMiI,EAAM/I,KAAK84D,gBAAgB3+C,QAAQo4C,GACnC70B,EAAS19B,KAAK84D,gBAAgBhpC,MAAM,EAAG/mB,GAC7C,IAAIwwD,EAAkB,EAAGC,EAAkB,EAC3C97B,EAAO34B,SAASwtD,IACVA,EAASpR,QAGFoR,EAASrpC,SAASyP,UAAW45B,EAASjC,cAC7CkJ,KAHAD,IACAC,E,IAKN,MAAMC,EAAW1wD,EAAMwwD,EAAiBG,EAAU3wD,EAAMywD,EACxDjH,EAASrpC,SAASyP,UAAW,EAAA8N,EAAA,GAAuB8rB,EAASrpC,SAASyP,QAAS34B,KAAKq1C,KAAMqkB,IAC1F,EAAAjzB,EAAA,GAAuB8rB,EAASrpC,SAAS9d,UAAWpL,KAAKm0B,WAAW/oB,UAAWquD,E,MAhBtD,QAAzB,EAAAlH,EAASrpC,SAASyP,eAAO,SAAEn2B,SAC3B+vD,EAASrpC,SAAS9d,UAAU5I,SAkB9B+vD,EAASpR,QAAUrgD,CAErB,CAEUkzD,oBAAoBpsD,EAAYmH,EAAyBgF,EAAegkD,GAChF,MAAMxF,EAAWvyD,KAAKi2D,eAAe,CAACruD,MAAYmH,IAAS,QAAKA,IAAQ,EAAMgpD,GAgB9E,OAfAxF,EAASnB,OAAQ,EACjBpxD,KAAK84D,gBAAgBz2D,KAAKkwD,GACvBA,EAASrpC,SAASna,OACnBwjD,EAASrpC,SAASna,MAAMwE,UAAUxS,IAAI,iBAGpCg3D,IACChkD,GACDw+C,EAASrpC,SAASyP,QAAQplB,UAAUxS,IAAI,QAAS,SAAWgT,GAG9Dw+C,EAASrpC,SAASgtC,eAAe1zD,UAGnCxC,KAAKk1D,oBAAoB3C,GAAU,GAC5BA,CACT,CAEUoE,sBAAsBpE,GAC9BA,EAAS6D,yBACTp2D,KAAKk1D,oBAAoB3C,IAAYA,EAAS//B,MAAM3vB,OACtD,CAQUgzD,eAAetD,GACvB,QAAGA,IACDA,EAASrpC,SAAS9d,UAAU5I,SAC5B+vD,EAASrpC,SAASyP,QAAQn2B,SAC1BxC,KAAKyzD,sBAAsB3wD,UAAUyvD,EAASrpC,SAAS9d,kBAChDpL,KAAK60D,WAAWtC,EAAS3qD,IAChC5H,KAAK4yD,cAAc3xD,OAAOsxD,EAASrpC,SAAS9d,WAC5CpL,KAAK64D,uBAAuB53D,OAAOsxD,EAASrpC,SAASyP,UAE9C,EAIX,CAEU+9B,aAAanE,GACrB,QAAsBtuD,IAAnBsuD,EAASx9B,MACV,OAAO,EAGT,MAAM,MAACvC,EAAK,MAAEuC,GAASw9B,EAOvB,OANA//B,EAAML,OAAO4C,EAAOvC,EAAM3vB,OAASkyB,GAAOhwB,SAAQ,EAAE7C,cAClDA,EAAQM,QAAQ,IAGlBxC,KAAK22D,sBAAsBpE,IAEpB,CACT,CAEOl8B,OACLr2B,KAAK6R,eAAe9Q,IAAI0uD,EAAA,GAAxBzvD,CAA2C,UAAU,KACnDA,KAAK44D,gBAAgB7zD,SAAQ,EAAEqL,KAAIuoD,WACjCvoD,KAAMuoD,EAAK,IAGb34D,KAAK44D,gBAAgB/1D,OAAS,CAAC,GAEnC,CAEOkB,U,YACL/D,KAAKg4D,sBAAmB/zD,EACxBjE,KAAK44D,gBAAgB/1D,OAAS,EACJ,QAA1B,EAAA7C,KAAKyzD,6BAAqB,SAAEkG,aAC5B35D,KAAK6R,eAAeC,YACpB9R,KAAKm0B,WAAWpwB,UACD,QAAf,EAAA/D,KAAKswD,kBAAU,SAAEvsD,UACwB,QAAzC,EAAsB,QAAtB,EAAA/D,KAAK0zD,yBAAiB,eAAE7C,yBAAiB,SAAE8I,YAC7C,EAca,MAAMC,UAAoBnB,EAGvC14D,YAAYkH,GACViL,MACEjL,EACA,kBACA,IAAMwmB,EAAA,qBACN,EACA,EACA,GA0DI,KAAAklC,qBAAuB,EAAEtyD,SAAQS,UAASV,YAChD,MAAMmyD,EAAWvyD,KAAK4yD,cAAc3vD,IAAI5C,GACxCkyD,EAASrpC,SAASsJ,MAAMmQ,mBAAqB7hC,EAAeyxD,EAAS//B,MAAM1X,KAAI,EAAE5Y,aAAaA,IAAvC,GAAiD,EAoSnG,KAAA23D,UAAY,CAACvoB,GAAS,MACvBA,GAAYme,EAAA,eAAgCA,EAAA,SAA0BzvD,OAI1EwhB,EAAA,gBAAwB,oBAAqB8vB,EAAO,EAlWpDtxC,KAAKoL,UAAUmI,UAAUxS,IAAI,oBAC7Bf,KAAK2S,QAAQ/K,GAAK,kBACpB,CAEQkyD,cAAc/kC,GACH/0B,KAAK60D,WAAkB,MAC/B9/B,MAAQA,CACnB,CAEQglC,uBACNxH,EACAhkD,GAEA,MAAM,UAACnD,GAAamnD,EAASrpC,SAE7B3a,EAAQD,MAAMo9C,IACZ,MAAMrnC,EAAYrkB,KAAK81D,kBAAkBvD,GAEzC7G,EAAU3mD,SAASsG,IACjB,MAAMnJ,EAAUlC,KAAKg6D,qBAAqBrC,cAActsD,GACxDknD,EAAS//B,MAAMnwB,KAAK,CAACgJ,WAAUnJ,YAE5BmiB,GACDkuC,EAASrpC,SAASsJ,MAAM9mB,OAAOxJ,E,IAInCqwD,EAAS6D,yBACThrD,EAAUmI,UAAU/Q,OAAO,OAAO,GAEtC,CAEc6yD,iBAAiBzxD,EAA4BoU,GAAU,G,yCACnE,MAAMu6C,EAAWvyD,KAAKi2D,eAAeryD,GAAK,EAAA0oB,EAAA,GAAc1oB,EAAImL,SACtD,eAACmnD,GAAkB3D,EAASrpC,SAE5B3a,EAAUvO,KAAKiH,SAAS6jD,mBAAmBC,cAAcnnD,GAC/D5D,KAAK+5D,uBACHxH,EACAhkD,EAAQD,MAAMs8C,GAAeA,EAAWc,aAG1C1rD,KAAKw1D,iBAAiBjD,EAAUv6C,IAEhC,OAAoB,CAClBpU,MACAwH,UAAW8qD,EACX51D,MAAO,KACPshB,cAAe,mBACfsF,MAAO,GACPI,OAAQ,GACR9iB,UAAU,GAEd,G,CAOO6xB,OACLnkB,MAAMmkB,OAENr2B,KAAKm0B,WAAWxgB,mBAAqB,KACnC3T,KAAK65D,WAAW,EAoBlB,MAAMtG,EAAgD,CAACC,KAAM/D,EAAA,iBAC7DzvD,KAAKyzD,sBAAwB,IAAI,IAAsBzzD,KAAK2yD,qBAAsBY,GAElF,MAAM0G,EAAsB1H,IAC1BA,EAASrpC,SAASsJ,MAAMmQ,kBACxB4vB,EAAS//B,MAAMztB,SAAQ,EAAE7C,aAAalC,KAAKg6D,qBAAqBnC,kBAAkB31D,KAClFqwD,EAAS//B,MAAM3vB,OAAS,CAAC,EAG3B7C,KAAKm0B,WAAW/oB,UAAUwC,iBAAiB,SAAU7F,IACnD,MAAM1H,EAAS0H,EAAE1H,OACjB,IAAG,EAAA4gB,EAAA,GAAgB5gB,EAAQ,kBAA3B,CACE,MAAM+K,GAAY,EAAA6V,EAAA,GAAgB5gB,EAAQ,kBACpCkyD,EAAWvyD,KAAK4yD,cAAc3vD,IAAImI,GACxC,GAAGmnD,EAASnB,MACV,OAGF,IAAI,IAAc,CAACxpD,GAAI2qD,EAAS3uD,IAAIgE,GAAIijD,YAAa0H,EAAS3uD,IAAIinD,cAAch8B,M,MAIlF,kBAA+B9mB,EAAE,IAGnC/H,KAAK0zD,kBAAoB,iBAA8B1zD,KAAMA,KAAKq1C,KAAMr1C,KAAKm0B,WAAYn0B,KAAKswD,YAE9F,MAAMn0C,GAAY,EAAA8qB,EAAA,GAAajnC,KAAK2S,SAAS,GAEvCunD,EAAqB,CAAC3H,EAAgD4H,KAKvE5H,EAASx9B,QACVolC,EAAWA,EAASrqC,MAAM,EAAGyiC,EAASx9B,QAGxC,MAAM2P,EAAM,IAAItjC,IAAI+4D,EAASr/C,KAAKnZ,GAAQA,EAAIiG,OAC9C,EAAAmkD,EAAA,GAAewG,EAAS//B,OAAQxvB,IAC1B0hC,EAAIrhC,IAAIL,EAAKqI,SAASzD,KACxB5H,KAAKo6D,cAAc7H,EAAUvvD,EAAKqI,UAAU,E,IAIhDrL,KAAKk1D,oBAAoB3C,IAAY4H,EAASt3D,SAC9C,EAAAkpD,EAAA,GAAeoO,GAAU,CAACx4D,EAAKoH,KAC7B/I,KAAKq6D,eAAe9H,EAAU5wD,GAAK,EAAMoH,EAAI,IAE/C/I,KAAK02D,aAAanE,GAClBA,EAASrpC,SAAS9d,UAAUmI,UAAU/Q,OAAO,OAAO,EAGhD83D,EAAgBt6D,KAAKg0D,oBAAoB,QAAS,mBAAoB,iBAGtEY,EAAiB50D,KAAKg0D,oBAAoB,SAAU,kBAAmB,UAC7EY,EAAe7/B,MAAQ,GAEvB,MAAMwlC,GAAc,OAAW,QAAS,CAACh4C,UAAU,IACnDqyC,EAAe1rC,SAASna,MAAMrD,OAAO6uD,IACrC,QAAiBA,GAAa,MAC5B,EAAA/W,EAAA,GAAkB,CAChBgX,aAAc,gCACdC,mBAAoB,kCACpBnkD,OAAQ,CACNokD,QAAS,WAEVpsD,MAAK,KACNtO,KAAKiH,SAAS6jD,mBAAmB6P,qBAAqB,GACrD9+B,EAAA,EAAK,IAGV,MAAM++B,EAAkB56D,KAAKg0D,oBAAoB,UAAW,wBACtDjqD,EAAIsB,SAASC,cAAc,QACjCvB,EAAEwJ,UAAUxS,IAAI,aAAc,iBAC9B65D,EAAgB1xC,SAASyP,QAAQjtB,OAAO3B,GAExC,MAAMgyB,EAAW,CACf1W,QAAQqH,IAAI,CACV1sB,KAAKiH,SAAS4zD,WAAWC,SAAS,iBAClC96D,KAAKiH,SAAS6jD,mBAAmBiQ,6BAChCzsD,MAAK,EAAEymB,EAAOolC,MACfn6D,KAAK85D,cAAc/kC,GACnBmlC,EAAmBI,EAAeH,EAAS,IAG7Cn6D,KAAKiH,SAAS6jD,mBAAmBkQ,4BAA4B1sD,MAAM6rD,IACjED,EAAmBtF,EAAgBuF,EAAS,IAG9Cn6D,KAAKiH,SAAS6jD,mBAAmBmQ,iBAAiB3sD,MAAM0mB,IACtD,IAAI,MAAMpxB,KAAQoxB,EAAgD2/B,KAChE30D,KAAKq1D,iBAAiBzxD,E,IAI1B5D,KAAKiH,SAAS6jD,mBAAmBoQ,qBAAqB5sD,MAAM6rD,IAC1D,MAAMt3D,EAASs3D,EAASt3D,OACxB7C,KAAKk1D,oBAAoB0F,EAAiBp5C,EAAA,aAAuB3e,GACjE7C,KAAK+5D,uBAAuBa,EAAiBv1C,QAAQlX,QAAQgsD,IAE7D34C,EAAA,mBAA2B,kBAAmB25C,IAC5Cn7D,KAAKk1D,oBAAoBl1D,KAAK60D,WAAoB,QAAGsG,KAAet4D,EAAO,GAC3E,KAINwiB,QAAQ+1C,KAAKr/B,GAAU5jB,SAAQ,KAC7BgE,EAAU3Z,QAAQ,IAGpB6iB,QAAQqH,IAAIqP,GAAU5jB,SAAQ,KAC5BnY,KAAKmhD,SAAU,EACfnhD,KAAK65D,YAEL,MAAMS,EAAgBt6D,KAAK60D,WAAkB,MACvCD,EAAiB50D,KAAK60D,WAAmB,OAC/C70D,KAAK0zD,kBAAkBpgC,UAAUgnC,EAAc9nC,MAAM3vB,OAASy3D,EAAgB1F,GAE9EpzC,EAAA,mBAA2B,sBAAuB5d,IAC5C5D,KAAK60D,WAAWjxD,EAAIgE,KACtB5H,KAAKq1D,iBAAiBzxD,GAAK,E,GAE7B,IAGJ5D,KAAKg6D,qBAAuB,IAAI3C,EAAqB,mBAAiC,KAAuBr3D,KAAKiH,SAAUssD,GAE5H,MAAM8H,EAAwBr7D,KAAKg6D,qBAAqBp4C,cACxD6tC,EAAA,0BAAyC4L,EAAuBr7D,KAAKg6D,qBAAqBtC,kBA4B1Fl2C,EAAA,mBAA2B,mBAAmB,EAAE5f,OAAMyJ,WAAUiwD,YAK9D,MAAM/I,EAAWvyD,KAAK60D,WAAoB,UAATjzD,EAAmB,QAAU,UAC3D2wD,IACE+I,EACDt7D,KAAKq6D,eAAe9H,EAAUlnD,GAE9BrL,KAAKo6D,cAAc7H,EAAUlnD,G,IAKnCmW,EAAA,mBAA2B,oBAAoB,EAAE5Z,SAC/C,MAAM2qD,EAAWvyD,KAAK60D,WAAWjtD,GAC9B5H,KAAK61D,eAAetD,IACrB0H,EAAmB1H,E,IAIvB/wC,EAAA,mBAA2B,eAAgBxhB,KAAKu1D,gBAAgB3tD,IAC9D,MAAM2qD,EAAWvyD,KAAK60D,WAAWjtD,GAC9B2qD,IACDvyD,KAAKw1D,iBAAiBjD,GAAU,GAChC9C,EAAA,oBAAmC,mBAAmB,KACpDzvD,KAAK0zD,kBAAkBvC,gBAAgBoB,EAAS,GAC/C,CAACtkD,MAAM,I,KAIduT,EAAA,mBAA2B,oBAAoB,EAAE5f,OAAMu4D,eACrD,MAAM5H,EAAWvyD,KAAK60D,WAAoB,UAATjzD,EAAmB,QAAU,UAC3D2wD,GACD2H,EAAmB3H,EAAU4H,E,IAIjC34C,EAAA,mBAA2B,cAAc,KACvCxhB,KAAKiH,SAAS4zD,WAAWC,SAAS,iBAAiBxsD,MAAMymB,IACvD/0B,KAAK85D,cAAc/kC,EAAM,GACzB,IAGJtH,EAAA,mBAA4B,SAAUztB,KAAKm1D,mBAE3C,OAA6B,CAACzK,SAAU1qD,KAAK2S,QAASd,eAAgB,IAAI,MAE1E,MAAMjQ,EAA2B,QACjC,EAAA25D,EAAA,GAA0B,CACxB7Q,SAAU1qD,KAAK2S,QACf6oD,aAAen7D,MAAa,EAAAm8C,EAAA,GAAcn8C,EAAQL,KAAK60D,WAAmB,OAAE3rC,SAASsJ,OACrFtX,OAAQ,KACNu0C,EAAA,qBAAoC7tD,GAAM,EAAK,EAEjDuZ,QAAS,KACPs0C,EAAA,qBAAoC7tD,GAAM,EAAM,IAIpD5B,KAAKq2B,KAAO,IACd,CAEO+jC,cAAc7H,EAAgD5wD,EAAiBwyD,GACpF,MAAMnxD,GAAO,EAAA6iC,EAAA,GAAc0sB,EAAS//B,OAAQxvB,GAASA,EAAKqI,SAASzD,KAAOjG,EAAIiG,KAC3E5E,IACDA,EAAKd,QAAQM,SAET2xD,GACFn0D,KAAK22D,sBAAsBpE,GAGjC,CAEO8H,eAAe9H,EAAgD5wD,EAAiBwyD,EAAiBprD,GACtG,QAAW9E,IAAR8E,EAAmB,CACpB,MAAMif,EAAIuqC,EAAS//B,MAAMzpB,GACzB,GAAGif,GAAKA,EAAE3c,SAASzD,KAAOjG,EAAIiG,GAC5B,M,CAIJ,IAAI5E,GAAO,EAAA6iC,EAAA,GAAc0sB,EAAS//B,OAAQxvB,GAASA,EAAKqI,SAASzD,KAAOjG,EAAIiG,KACxE5E,IACFA,EAAO,CACLd,QAASlC,KAAKg6D,qBAAqBrC,cAAch2D,GACjD0J,SAAU1J,IAId4wD,EAAS//B,MAAMjD,QAAQvsB,GACvBuvD,EAASrpC,SAASsJ,MAAMxa,QAAQhV,EAAKd,SAEjCiyD,GACFn0D,KAAK02D,aAAanE,EAEtB,CAEOkJ,qBAAqB95D,GAC1B3B,KAAKiH,SAAS6jD,mBAAmB4Q,kBAAkB/5D,EAAIiG,GACzD,CAEO+zD,oBAAoBh6D,GACzB3B,KAAKiH,SAAS6jD,mBAAmB4Q,kBAAkB/5D,EAAIiG,IAAI,EAC7D,CAUO8lD,WACL1tD,KAAK65D,WAAU,EACjB,CAEOtM,WACLvtD,KAAK65D,YACL75D,KAAKm1D,kBACP,E,6CCj3BK,MAAMyG,EAAoB,KAC/B,MAAMC,EAAYxwD,SAASC,cAAc,OAEzC,OADAuwD,EAAUtoD,UAAUxS,IAAI,sBACjB86D,CAAS,C,6DCDH,SAASC,EAAiBC,GACvC,MAAMnjC,EAAOvtB,SAASC,cAAc,QAGpC,OAFAstB,EAAKrlB,UAAUxS,IAAI,eACnB,QAAM63B,EAAMmjC,EAAS,cAAgB,eAC9BnjC,CACT,C,yHCGe,MAAMojC,UAA6B,IAChDj8D,YAAY82D,EAAkCC,GAC5C5kD,MAAM2kD,GADsC,KAAAC,mBAAAA,EAG5C92D,KAAK6vD,YAAc,IAAI,KAAuB7sD,IAC5C,MAAM,OAAC3C,EAAM,QAAES,GAAWkC,EACpBi5D,GAAU,EAAAC,EAAA,GAAiBl8D,KAAKk3D,OAAQlvC,GAAMA,EAAEoG,MAAQ/tB,IAC3DS,GAAWm7D,EAAQp5D,QACpBo5D,EAAQl3D,SAAS/B,IACfhD,KAAKk3D,MAAM3nC,QAAQvsB,EAAK,IAI5BhD,KAAK82D,oBAAsB92D,KAAK82D,mBAAmB9zD,GACnDhD,KAAKo3D,wBAAwB,GAEjC,CAEOzzD,QAAQ/C,GACbsR,MAAMvO,QAAQ/C,EAChB,E,6TCRa,MAAMu7D,EAMnBp8D,YACUmC,EACA5B,EACA6zB,EACRnF,GAAS,GAHD,KAAA9sB,QAAAA,EACA,KAAA5B,MAAAA,EACA,KAAA6zB,WAAAA,EAPF,KAAAioC,cAA0C/2C,QAAQlX,UAClD,KAAAwL,QAAkB,EAiClB,KAAA8gB,SAAW,KACdz6B,KAAK2Z,QACNlG,aAAazT,KAAK2Z,SAElB3Z,KAAKo8D,eAAgB,SAIvBp8D,KAAK2Z,QAAUjG,OAAOhR,YAAW,KAC/B1C,KAAK2Z,QAAU,EACf3Z,KAAKo8D,cAAcjuD,SAAS,GAE3B,IAAI,EA2EF,KAAAq7C,oBAAuBp7B,GACrBpuB,KAAKo8D,cAAc9tD,MAAK,IAAW,EAAD,gCAGvC,GAAGtO,KAAK4hB,cAAciuC,YAAYxrC,UAAU+J,GAC1C,OAGF,MAAMloB,EAAQkoB,EAAIxW,cAAc,SAC1BvI,EAAQ+e,EAAIxW,cAAc,eAE7BvI,IACDA,EAAMkE,UAAU/Q,OAAO,cAEjB,YAGLxC,KAAK4hB,cAAciuC,YAAYxrC,UAAU+J,IAIzCloB,IACDA,EAAM1D,SACN0D,EAAMvD,IAAM,GACZuD,EAAMtD,OACa9C,EAAA,gBAAmCoG,GAC3CnB,SAAS/B,IAClBlD,EAAA,kBAAqCkD,EAAK,IAGhD,MA7IAhD,KAAKiH,SAAWua,EAAA,WAEhBxhB,KAAK4hB,cAAgB,IAAIo6C,OAAqB/3D,GAAW,EAAE5D,SAAQS,cAC9DA,EACDd,KAAKq8D,kBAAkBh8D,GAEvBL,KAAKwpD,oBAAoBnpD,E,IAa1B2uB,GACDhvB,KAAKgvB,QAET,CAiBOA,SACLhvB,KAAKm0B,WAAW/oB,UAAUwC,iBAAiB,SAAU5N,KAAKy6B,SAC5D,CAEOvL,SACLlvB,KAAKylB,QACLzlB,KAAKm0B,WAAW/oB,UAAUsG,oBAAoB,SAAU1R,KAAKy6B,SAC/D,CAEOhV,QACLzlB,KAAK4hB,cAAc6D,OACrB,CAEQ42C,kBAAkBjuC,GACVA,EAAIxW,cAAc,UAuDhC5X,KAAK4hB,cAAcvf,KAAK,CAAC+rB,MAAKxrB,KAlDjB,KACX,MAAMwE,EAAQgnB,EAAIrE,QAAQ3iB,MA4C1B,OA3CgBie,QAAQqH,IAAI,CAAC1sB,KAAKiH,SAASC,eAAeC,OAAOC,GAAQpH,KAAKo8D,gBAAgB9tD,MAAK,EAAO3M,KAAS,EAAD,gCAChH,MAUM4M,SAVY,OAAU,CAC1B5M,MACAyJ,UAAWgjB,EACXxM,cAAe,KAEfthB,MAAON,KAAKM,MACZg8D,QAAQ,EACRC,WAAW,KAGOruC,YAyBpB,OAxBA3f,EAAQ4J,SAAQ,KACd,MAAMjS,EAAQkoB,EAAIxW,cAAc,SAC1BvI,EAAQ+e,EAAIxW,cAAc,eAGhCvI,GAASA,EAAMkE,UAAUxS,IAAI,QAE1BmF,IAAUA,EAAM+S,eACjBvW,YAAW,KACTwD,EAAMvD,IAAM,GACZuD,EAAMtD,OACa9C,EAAA,gBAAmCoG,GAC3CnB,SAAS/B,IAClBlD,EAAA,kBAAqCkD,EAAK,GAC1C,GACD,GAIDhD,KAAK4hB,cAAciuC,YAAYxrC,UAAU+J,IAC3CpuB,KAAKwpD,oBAAoBp7B,E,IAItB7f,CACT,KAMc,GAMlB,CAmCOxN,IAAIY,EAAiB4nC,EAAWvpC,KAAKkC,SAW1C,MAAMksB,EAAM/iB,SAASC,cAAc,OACnC8iB,EAAI7a,UAAUxS,IAAI,MAAO,aAIzBqtB,EAAIrE,QAAQ3iB,MAAQ,GAAKzF,EAAIiG,GAE7B2hC,EAAS79B,OAAO0iB,GAEhBpuB,KAAK4hB,cAAcje,QAAQ,CAACyqB,MAAKxrB,KAAMi5B,EAAA,KAIvC,OAAU,CACRl6B,MACAyJ,UAAWgjB,EACXxM,cAAe,KACf06C,QAAQ,EACRjgC,aAAa,GAEjB,E,wHCjMK,SAAS3C,EACd1C,EACArkB,EACAsB,EACAikB,EACAskC,EAAiB,IACjBC,EACA5qD,GAEA,MAAMqnB,GAAY,OAAiB,CACjCvmB,UACA/Q,KAAMo1B,GAAsC,SAA9BrkB,EAAQoX,QAAQtpB,UAAuB,OAAS,aAC9D+7D,iBACAtkC,kBACArmB,mBAGF,IAAImlB,EACF,OAAOkC,EAGT,MAAMwjC,EAAQ,IAAIC,MAAMzjC,EAAW,CACjC0jC,MAAO,CAACv8D,EAAQw8D,EAAMlE,KACpB,MAAM/wD,GAAM+wD,EAAK,GACX/+B,OAAsB31B,IAAZ00D,EAAK,IAAmBA,EAAK,GAEvC/3D,EAAMo2B,EAAKpf,cAAc,cAAchQ,QAAWovB,EAAKmC,SAASvxB,GACtEk1D,EAAal8D,EAAIgH,EAAIgyB,EAAQ,IAI3BkjC,EAAe,CAAMz8D,EAAqBuH,EAAYgyB,GAAU,KAAS,O,EAAD,K,OAAA,E,EAAA,YAC5E,MAAMD,EAAahnB,EAAQwmB,SAASvxB,GAEpC,GAAGqM,EAAS,CACV,MAAM8oD,EAAU9oD,EAAQrM,EAAI+xB,EAAYC,GAClCojC,EAAYD,aAAmB13C,cAAgB03C,EAAUA,EAC/D,QAAiB94D,IAAd+4D,IAA4BA,EAC7B,M,CAIDP,GACDA,EAAY3iC,kBAAkB,CAC5B53B,QAAS7B,EAAO4Y,cAAckgB,SAASvxB,GACvCmyB,SAAU,SACV0R,eAAgB7R,OAAU31B,EAAY,WACtCkoD,cAAeqQ,EACflN,KAAM,MAIN,iCACF11B,GAAU,GAGZ,MAAMX,EAASC,EAAUD,SACzB,GAAG54B,EAAOkT,UAAUqB,SAAS,WAAahN,IAAOqxB,EAC/C,OAAO,EAGT,MAAMgkC,EAAiBrjC,EAAU,KAAWxpB,GAAmBA,IAEzDM,EAAOsmB,EAAKpf,cAAciJ,EAAQmL,cAAgB,WACrDtb,GACDusD,GAAe,KACbvsD,EAAK6C,UAAU/Q,OAAO,SAAS,IAKhC06D,IAAyB,IAAZjkC,GAAiBW,GAC/BqjC,GAAe,KACb,MAAME,EAAY98D,EAAOuX,cAAc,KACjCwlD,EAAmB/8D,EAAO4Y,cAAckgB,SAASF,GAAQrhB,cAAc,KAE7EwlD,EAAiB7pD,UAAU/Q,OAAO,WAClC26D,EAAU5pD,UAAU/Q,OAAO,WAG3B,MAAM66D,EAAYD,EAAiBnkD,cAAcA,cAAcoO,WAAa81C,EAAUlkD,cAAcA,cAAcoO,WAC5GrJ,EAAco/C,EAAiB9L,YAAc6L,EAAU7L,YAC7D6L,EAAU5xD,MAAMkR,UAAY,eAAe4gD,sBAA8Br/C,YAIzE,SAAQ,KAENm/C,EAAU5pD,UAAUxS,IAAI,WACxBo8D,EAAU5xD,MAAMkR,UAAY,MAAM,GAClC,IAINwgD,GAAe,KACb58D,EAAOkT,UAAUxS,IAAI,SAAS,IAGhCm4B,EAAUtxB,EAAIgyB,EAChB,E,YApE8E,K,6QAoE7E,EAEKsjC,GAAalmC,EAAKzjB,UAAUqB,SAAS,aAGrCiM,EAAUmW,EAAKzhB,kBAAkBsL,QAuBvC,OAtBA,QAAiBmW,GAAOjvB,IACtB,IAQIH,EARAvH,EAAS0H,EAAE1H,OAMf,GAJAA,GAAS,OAAcA,EAAQ22B,IAI3B32B,EAAQ,OAAO,EAGnB,GAAGA,EAAO0pB,QAAQ7W,KAEhB,GADAtL,GAAMvH,EAAO0pB,QAAQ7W,KACV,IAARtL,EACD,OAAO,OAGTA,GAAK,OAAWvH,GAGlBy8D,EAAaz8D,EAAQuH,EAAG,GACvB,CAACiK,mBAEG6qD,CACT,C,6OCtHO,SAAeY,EAAqB1oC,EAAoB5gB,EAAcqB,EAA2BkoD,G,qCACtG,MAAMhmC,EAA+B,GAE/Bs7B,GADsBx9C,aAAQ,EAARA,EAAUmoD,MAAMhgC,GAAwB,6BAAbA,EAAO5tB,KACvB6tD,SAAsCx5D,EACvEy5D,GAAW,EAAAC,EAAA,GAAc3pD,EAAM,CAACqB,WAAUkoD,oBAAmBhmC,eAAcqmC,oBAAqB/K,IACpF6K,EAASjlD,iBAA8B,6BAC/C1T,SAASnE,IACjBA,EAAGi9D,gBAAkB,UACrBj9D,EAAG2S,UAAUxS,IAAI,KAAK,IAGxBw2B,EAAa10B,eAAgBwiB,QAAQqH,IAAI6K,IAEzCmmC,EAASjlD,iBAA8B,qBAAqB1T,SAASnE,IACnEA,EAAGoX,SAAQ,SAAmB,GAAM,IAGtC,MAAM8lD,EAAmB,IAAa,uBAAiC75D,EAUjE85D,EAAsB7kD,MAAMC,KAAKukD,EAASjlD,iBAAmC,8BAA8BqC,KAAKla,IACpHA,EAAGmpB,QAAQi0C,IAAM,IACTp9D,EAAWoyD,sBAGf59C,GAAO,EAAA6oD,EAAA,GAAuBP,GACpC7K,SAAAA,EAAU9uD,UAIV,MAAMm6D,GAAM,EAAAC,EAAA,GAAevpC,GAG3B,GAAGspC,EAAIjQ,UAOA,CACL,MAAMN,EAAQtiD,SAAS+yC,cACvB,IAAI6P,EAAOr5B,EAAM0b,UACb2d,GACFr5B,EAAMlpB,OAAOuiD,EAAwB5iD,SAAS+yD,eAAe,KAG/DzQ,EAAME,cAAcI,GACpBN,EAAM0Q,UAAS,GACfH,EAAIvoC,UAAU2oC,kBACdJ,EAAIvoC,UAAU4oC,SAAS5Q,E,CAQzB/4B,EAAMhnB,iBAAiB,QAASwM,EAAA,EAAa,CAACpF,SAAS,EAAM/G,MAAM,EAAMwjB,SAAS,IAClFqsC,SAAAA,EAAkBU,cAAc,CAACC,UAAW,kBAC5C/qD,OAAOrI,SAASqzD,YAAY,cAAc,EAAOtpD,GACjD8D,MAAMC,KAAKyb,EAAMnc,iBAAmC,eAAe1T,SAAQ,CAACnE,EAAImI,YACvEnI,EAAGmpB,QAAQi0C,IAClB,MAAMhL,EAAqB+K,EAAoBh1D,GAC9CnI,EAAWoyD,mBAAqBA,EACjCA,EAAmBzvD,YAAc3C,CAAE,IAKrCg0B,EAAMnc,iBAA8B,OAAO1T,SAASnE,IAClDA,EAAGi9D,gBAAkB,OAAO,IAW9BC,SAAAA,EAAkBa,gBAAgB/pC,IAClC,OAAcA,EAAO,QAkCvB,E,+RAEA,IAAIyB,EAAO,KACThrB,SAASuC,iBAAiB,SAAU7F,IAClC,MAAM6sB,GAAQ,EAAAgqC,EAAA,GAAgB72D,EAAE1H,OAAQ,0BACxC,IAAIu0B,EACF,OAGF,MAAMiqC,IAAiBjqC,EAAM7K,QAAQ80C,aAErC,IAAI7qD,EAAcqB,EADlBtN,EAAEwuB,iBAIF,IAAI/mB,GAAqBzH,EAAE+2D,eAAiB/2D,GAAGg3D,cAAcC,QAAQ,cACjEC,GAAe,EAGf7pD,GAAgBrN,EAAE+2D,eAAiB/2D,GAAGg3D,cAAcC,QAAQ,aAEhE,MAAME,EAAgBn3D,GAA6B,uBAARA,EAAE6H,GAAuC,2BAAR7H,EAAE6H,IAAmCivD,EACjH,GAAGA,EAAc,CACf,MAAMr+B,EAAS,UACfhxB,EAAYA,EAAU6a,QAAQmW,EAAQ,IACtCprB,EAAOA,EAAKiV,QAAQmW,EAAQ,G,CAG9B,MAAMx4B,GAAU4sB,EAAM7K,QAAQ/hB,QAAU,MAAcyuB,WACtD,GAAGrhB,EAAKqf,OAAQ,CACdroB,QAAQqV,IAAIrM,EAAKiV,QAAQ,2BAA4B,KAErDjV,EAAOA,EAAKiV,QAAQ,2BAA4B,IAChDjV,EAAOA,EAAKiV,QAAQ,mBAAoB,IACxCjV,EAAOA,EAAKiV,QAAQ,yCAA0C,IAE9D,MAAM9kB,EAAQ6P,EAAK7P,MAAM,2BACtBA,IACD6P,EAAO7P,EAAM,GAAGkvB,QAMlB,MAEMmE,GAFS,IAAIoc,WACAC,gBAAgB7/B,EAAM,aACxB3J,MAAQJ,SAASC,cAAc,QAMhD,IAAI6zD,EAAWvmC,EAAK8F,WACpB,KAAMygC,GAAU,CACd,MAAMC,EAAcD,EAASC,YAC1BD,EAAS7Q,WAAa6Q,EAAS5Q,YAC5B4Q,EAAS3Q,UAAU/5B,QACrB0qC,EAAS38D,UAIb28D,EAAWC,C,CAGb,MAAMC,GAAY,EAAAC,EAAA,GAAsB1mC,GAAM,GAAM,GAEtB5wB,IAE5Bq3D,EAAUhqD,SAAWgqD,EAAUhqD,SAAS0a,QAAQyN,GAAwB,6BAAbA,EAAO5tB,KAGpD,CACd,MAAM2vD,EAAQF,EAAU3yD,MAAMqb,MAAM,MACpC,IAAIy3C,EAAa,EACjB,IAAI,IAAIC,EAAY,EAAGA,EAAYF,EAAM18D,SAAU48D,EAAW,CAC5D,MAAMC,EAAOH,EAAME,GACnBD,GAAcE,EAAK78D,OAEnB,MAAMovB,EAAQutC,EACd,GAAwB,OAArBhwD,EAAUyiB,IAAmBwtC,IAAeF,EAAM18D,OAAS,EAAI,CAChE,MAAM88D,EAAWJ,EAAMptC,OAAOstC,EAAY,EAAG,GAAG,GAChDF,EAAME,GAAaC,EAAOC,EAG1BN,EAAUhqD,SAAStQ,SAASy4B,IACvBA,EAAOG,QAAU1L,IAClBuL,EAAOG,QAAU,E,IAIrB6hC,GAAcG,EAAS98D,M,CAGzB28D,GAAc,C,CAGhB,MAAMI,EAAgBL,EAAMn3C,KAAK,MACjCi3C,EAAU3yD,MAAQkzD,C,CAKpB,GAFuBP,EAAU3yD,MAAM2d,QAAQ,MAAO,IAAIxnB,SAClC2M,EAAU6a,QAAQ,MAAO,IAAIxnB,QAEnDw8D,EAAUhqD,SAAS3U,MAAM88B,GAAwB,6BAAbA,EAAO5tB,IAAmC,CAC9EoE,EAAOqrD,EAAU3yD,MACjB2I,EAAWgqD,EAAUhqD,SACrB4pD,GAAe,EAEf,IAAIY,GAAY,EAAAC,EAAA,GAAc9rD,GAC9B6rD,EAAYA,EAAU9vC,OAAOmvC,IAC7B,EAAAa,EAAA,GAAc1qD,EAAUwqD,E,CAG1BzzD,QAAQqV,IAAI,eAAgBw9C,E,CAG3BA,IACDjrD,EAAOxE,EACP6F,GAAW,EAAAyqD,EAAA,GAAc9rD,GACzBqB,EAAWA,EAAS0a,OAAOmvC,IAG7B5B,EAAqB1oC,EAAO5gB,EAAMqB,EAAUrN,EAAO,IAGrDquB,EAAO,IAAI,EAoBb,IAAY2pC,EAuBZ,SAASvC,IAKP,OAJiB,YAAkC,CACjDwC,eAAe,EACfC,cAAc,GAGlB,CAEA,SAASC,EAA2BvrC,GAClC,MAAMmpC,EAAsB7kD,MAAMC,KAAKyb,EAAMnc,iBAAmD,6CAChG,IAAIo6C,EAAWj+B,EAAMhd,cAA0C,0BAC/D,IAAIi7C,GAAYkL,EAAoBl7D,OAClCgwD,EAAW4K,IACX7oC,EAAM5c,QAAQ66C,QACT,GAAGA,IAAakL,EAAoBl7D,OAEzC,YADAgwD,EAASrwD,SAIX,IAAIqwD,EACF,OAGF,MAAME,EAAiE,IAAIxxD,IAC3Ew8D,EAAoBh5D,SAAS7C,IAC3B,MAAM8wD,EAAqB9wD,aAAmB,KAAqBA,EAAWA,EAAgB8wD,oBACxF,MAAC5rD,GAAS4rD,EAChB,IAAIpvD,EAAMmvD,EAAa9vD,IAAImE,GACvBxD,GACFmvD,EAAanvD,IAAIwD,EAAOxD,EAAM,IAAIxC,KAGpCwC,EAAI7C,IAAIiyD,EAAmB,IAG7B,IAAI,MAAO5rD,EAAO22D,KAAwBhL,EAAc,CACtD,IAAIqN,EAASvN,EAASE,aAAa9vD,IAAImE,GACvC,GAAGg5D,EACD,IAAI,MAAMpN,KAAsBoN,EAC1BrC,EAAoB16D,IAAI2vD,IAC1BA,EAAmBjvD,eAIvBq8D,EAAS,IAAIh/D,IAGf,IAAI,MAAM4xD,KAAsB+K,EAC1BqC,EAAO/8D,IAAI2vD,IACbA,EAAmBqN,mB,CAKzBxN,EAAS9xD,IAAIgyD,GAAc,GAC3BF,EAASkD,aACX,EA/EA,SAAYiK,GACV,yBACA,qBACA,oBACD,CAJD,CAAYA,IAAAA,EAAU,KAiFP,MAAMM,EAUnBvgE,YAAmB2xB,EAA6B,CAAC,GAA9B,KAAAA,QAAAA,EACjB1xB,KAAKoL,UAAYC,SAASC,cAAc,OACxCtL,KAAKoL,UAAUmI,UAAUxS,IAAI,eAE7Bf,KAAKsoD,SAAW52B,EAAQ42B,SACxBtoD,KAAKugE,SAAW7uC,EAAQ6uC,cAECt8D,IAAtBytB,EAAQ8uC,gBAAoDv8D,IAAzBytB,EAAQ+uC,eAC5C/uC,EAAQ+uC,aAAej6D,KAAKI,IAAI,GAAIJ,KAAKmD,MAAM+nB,EAAQ8uC,UAAY,KAGrE,MAAM,YAACj9D,EAAW,UAAEi9D,EAAS,aAAEC,EAAY,KAAEvoD,EAAI,UAAE1I,EAAS,YAAEkxD,GAAc,EAAI,aAAEtd,GAAgB1xB,EAC5FuZ,EAAQvZ,EAAQuZ,OAASvZ,EAAQivC,UAEjCC,EAAsC,GAC5C,IAAIhsC,EA8GJ,GA7GIplB,GA2FFxP,KAAKoL,UAAU2X,UAAY,8BACN7K,EAAO,SAASA,KAAU,oBAAoBkrC,QAAAA,EAAgB,UAAUnY,EAAQ,cAAgB,wCAGrHrW,EAAQ50B,KAAKoL,UAAUmK,oBA9FpB8gB,GACDA,IAGFr2B,KAAKoL,UAAU2X,UAAY,wCAE3B6R,EAAQ50B,KAAKoL,UAAUmK,kBACvBqf,EAAMipC,gBAAkB,KAAO6C,EAS/B,kBAEA9rC,EAAMhnB,iBAAiB,aAAc7F,I,MACnC,MAAM4tB,EAAYtqB,SAAS6yC,eAC3B,IAAIvoB,EAAUkrC,YACZ,OAGF,MAAMt9D,GAAc,EAAAkgC,EAAA,GAAU17B,EAAE1H,OAAQ,OACxC,IAAIkD,EACF,OAGF,MAAM+iB,EAAO/iB,EAAYma,wBACnBmG,EAAUyC,EAAKxB,KAAOwB,EAAKY,MAAQ,EACnC45C,EAAc/4D,EAAEg5D,SAAWl9C,EAE3B8pC,EAAQtiD,SAAS+yC,cACvBuP,EAAME,cAAciT,EAAcv9D,EAAyC,QAA3B,EAAAA,EAAY8qD,uBAAe,QAAI9qD,GAC/EoyB,EAAU2oC,kBACV3oC,EAAU4oC,SAAS5Q,EAAM,IAG3BiT,EAAiBv+D,MAAK,MAIjB,EAAA2+D,EAAA,GAAapsC,IAEdA,EAAM+N,kBA2BR,KAAczpB,MAAMC,KAAKyb,EAAMnc,iBAAiB,uBAAuB1T,SAASnE,IAE9EA,EAAG4B,QAAQ,KAMb,QAAoB0W,MAAMC,KAAKyb,EAAMnc,iBAAiB,sBAEtD0nD,EAA2BvrC,EAAM,MAgBrC,OAAaA,GAEVlD,EAAQuvC,YACTrsC,EAAMqsC,UAAYvvC,EAAQuvC,WAGzB19D,IACD,QAAMqxB,EAAOrxB,OAAaU,EAAW,eAGpCgnC,GAAS1nC,EAAa,CACvB,MAAMs/C,EAASx3C,SAASC,cAAc,OACtCu3C,EAAOtvC,UAAUxS,IAAI,sBACrBf,KAAKoL,UAAUM,OAAOm3C,E,CASxB,GANG5X,IACDjrC,KAAKirC,MAAQ5/B,SAASC,cAAc,SACpCtL,KAAKsjD,WACLtjD,KAAKoL,UAAUM,OAAO1L,KAAKirC,QAG1Bu1B,EAAW,CACZ,MAAMU,EAAUlhE,KAAKoL,UAAUkf,iBAC/B,IAAI62C,GAAgB,EAEpB,MAAMh5B,EAAU,KACd,MAAMi5B,EAAWxsC,EAAMrhB,UAAUqB,SAAS,SAEpCysD,EAAc7xD,EAAaolB,EAA2BloB,MAAM7J,OAAS,KAAI,EAAAy8D,EAAA,GAAsB1qC,GAAO,GAAO,GAAOloB,OAAO7J,OAC3H0oB,EAAOi1C,EAAYa,EACnBC,EAAU/1C,EAAO,EACvBqJ,EAAMrhB,UAAU1J,OAAO,QAASy3D,GAI7BA,GAAW/1C,GAAQk1C,GACpBzgE,KAAKsjD,WACL4d,EAAQx1D,OAAO,KAAK80D,EAAYa,MAC5BF,IAAeA,GAAgB,KAC1BC,IAAaE,GAAYH,KAClCnhE,KAAKsjD,WACL6d,GAAgB,E,EAIpBP,EAAiBv+D,KAAK8lC,E,EAGFzW,EAAQ6vC,iBACV/xD,IAClBolB,EAAM7K,QAAQ80C,aAAe,IAC7BjqC,EAAMhnB,iBAAiB,YAAa7F,IAClC,GAAa,UAAVA,EAAEyE,IAEH,OADAzE,EAAEwuB,kBACK,C,KAKVqqC,EAAiB/9D,QAClB+xB,EAAMhnB,iBAAiB,SAAS,KAC9BgzD,EAAiB77D,SAASqxB,GAAaA,KAAW,IAItDp2B,KAAK40B,MAAQA,CACf,CAEOixB,SACD7lD,KAAK0M,QAIN1M,KAAK0xB,QAAQliB,UACbxP,KAAK40B,MAA2BixB,SC9jBxB,SAA+BjlD,GAC5C,MAAM+sD,EAAQtiD,SAAS+yC,cACvBuP,EAAM6T,mBAAmB5gE,GACzB,MAAMovD,EAAMt8C,OAAOwqC,eACnB8R,EAAIsO,kBACJtO,EAAIuO,SAAS5Q,EACf,CD0jBM8T,CAAsBzhE,KAAK40B,OAE/B,CAEO0uB,WACLtjD,KAAKirC,MAAMryB,YAAc,GACtB5Y,KAAK0xB,QAAQivC,WACd,EAAAziC,EAAA,GAAal+B,KAAKirC,MAAOjrC,KAAK0xB,QAAQivC,WAEtC3gE,KAAKirC,MAAMv/B,QAAO,QAAK1L,KAAK0xB,QAAQuZ,MAAOjrC,KAAK0xB,QAAQgwC,cAE5D,CAEIh1D,YACF,OAAO1M,KAAK0xB,QAAQliB,UAAaxP,KAAK40B,MAA2BloB,OAAQ,EAAA4yD,EAAA,GAAsBt/D,KAAK40B,OAAO,GAAO,GAAOloB,KAE3H,CAEIA,UAAMA,GACR1M,KAAKyiD,iBAAiB/1C,GAAO,GAC7B1M,KAAK4kD,oBACP,CAEOA,sBACL,OAAc5kD,KAAK40B,MAAO,QAC5B,CAEO6tB,iBAAiB/1C,EAA6Ci1D,GAChE3hE,KAAK0xB,QAAQliB,UACbxP,KAAK40B,MAA2BloB,MAAQA,IAEzC,EAAAmgB,EAAA,GAAe7sB,KAAK40B,MAAOloB,GAC3ByzD,EAA2BngE,KAAK40B,OAEpC,CAEOmzB,YACL,OAAO/nD,KAAK0M,QAAU1M,KAAK4hE,aAC7B,CAEOvZ,UACL,OAAQroD,KAAK40B,MAAMrhB,UAAUqB,SAAS,YAClC5U,KAAKugE,UAAYvgE,KAAKugE,eACtBvgE,KAAKsoD,YAAa,EAAA0Y,EAAA,GAAahhE,KAAK40B,OAC1C,CAEOitC,kBACL,OAAO7hE,KAAKqoD,WAAaroD,KAAK+nD,WAChC,CAEO+Z,cAAcp1D,EAAQ,GAAI8iD,GAC3BxvD,KAAK0xB,QAAQliB,YACf9C,GAAQ,EAAAuxD,EAAA,IAAuB,EAAAN,EAAA,GAAcjxD,KAG5C8iD,EACDxvD,KAAKyiD,iBAAiB/1C,GAAO,GAE7B1M,KAAK0M,MAAQA,CAEjB,CAEOq1D,iBAAiBr1D,EAAqC,GAAI8iD,GAC/DxvD,KAAK4hE,cAAgBl1D,EACrB1M,KAAK8hE,cAAcp1D,EAAO8iD,EAC5B,CAEOwS,SAAStxC,EAAmBua,GAC9BA,GACDjrC,KAAKirC,MAAMryB,YAAc,GACzB5Y,KAAKirC,MAAMv/B,QAAO,QAAKu/B,EAAOjrC,KAAK0xB,QAAQgwC,gBAE3C1hE,KAAKsjD,WAGPtjD,KAAK40B,MAAMrhB,UAAU1J,OAAO,WAAY6mB,EAAQsvC,EAAWzuB,QAC3DvxC,KAAK40B,MAAMrhB,UAAU1J,OAAO,WAAY6mB,EAAQsvC,EAAWiC,OAC7D,CAEOC,SAASj3B,GACdjrC,KAAKgiE,SAAShC,EAAWzuB,MAAOtG,EAClC,E,4DExoBa,MAAMk3B,EAWnBpiE,YAAYwD,EAA0B+wB,GAL/B,KAAA8tC,UAAY,GACZ,KAAAzoD,QAAU,EA+BjB,KAAAwuB,QAAU,KACR,IAAInoC,KAAKs0B,SAAU,OAEnB,MAAM5nB,EAAQ1M,KAAK0M,MAIhBA,IAAU1M,KAAKoiE,YAChBpiE,KAAKoiE,UAAY11D,EACjB+G,aAAazT,KAAK2Z,SAClB3Z,KAAK2Z,QAAUjG,OAAOhR,YAAW,KAC/B1C,KAAKs0B,SAAS5nB,EAAM,GACnB,K,EAIP,KAAA21D,aAAe,KACbriE,KAAK0M,MAAQ,GACb1M,KAAKs0B,UAAYt0B,KAAKs0B,SAAS,IAC/Bt0B,KAAKsiE,SAAWtiE,KAAKsiE,SAAS,EA7C9BtiE,KAAK20B,WAAa,IAAI,KAAW,CAC/BpxB,cACAiM,WAAW,IAGbxP,KAAKoL,UAAYpL,KAAK20B,WAAWvpB,UACjCpL,KAAKoL,UAAUmI,UAAU/Q,OAAO,eAChCxC,KAAKoL,UAAUmI,UAAUxS,IAAI,gBAE7Bf,KAAKs0B,SAAWA,EAEhBt0B,KAAK40B,MAAQ50B,KAAK20B,WAAWC,MAC7B50B,KAAK40B,MAAMrhB,UAAUxS,IAAI,sBAEzB,MAAMwhE,EAAal3D,SAASC,cAAc,KAC1Ci3D,EAAWhvD,UAAUxS,IAAI,QAAS,gBAElCf,KAAKwiE,SAAWn3D,SAASC,cAAc,KACvCtL,KAAKwiE,SAASjvD,UAAUxS,IAAI,QAAS,WAAY,eAEjDf,KAAK40B,MAAMhnB,iBAAiB,QAAS5N,KAAKmoC,SAC1CnoC,KAAKwiE,SAAS50D,iBAAiB,QAAS5N,KAAKqiE,cAE7CriE,KAAKoL,UAAUM,OAAO62D,EAAYviE,KAAKwiE,SACzC,CAwBI91D,YACF,OAAO1M,KAAK20B,WAAWjoB,KACzB,CAEIA,UAAMA,GACR1M,KAAKoiE,UAAY11D,EACjB+G,aAAazT,KAAK2Z,SAClB3Z,KAAK20B,WAAWjoB,MAAQA,CAC1B,CAEOlK,SACLiR,aAAazT,KAAK2Z,SAClB3Z,KAAK40B,MAAMljB,oBAAoB,QAAS1R,KAAKmoC,SAC7CnoC,KAAKwiE,SAAS9wD,oBAAoB,QAAS1R,KAAKqiE,aAClD,E,qGCxEa,MAAMI,UAAsB,IACzC1iE,YAAY82D,EAAwB6L,GAClCxwD,MAAM2kD,GAWA,KAAAC,mBAAqB,EAAEz2D,SAAQS,eAMrC,OAAiBd,KAAKk3D,OAAQlvC,GAAMA,EAAEoG,MAAQ/tB,IAAQ0E,SAAS/B,IAC1DlC,IACDkC,EAAKi0D,SAAU,GAGjBj0D,EAAKlC,QAAUA,EACf,MAAMmxB,EAAQjyB,KAAKk3D,MAAMluD,WAAWhG,IAAUA,EAAKlC,UACnDd,KAAKk3D,MAAM/kC,OAAO3rB,KAAKC,IAAI,EAAGwrB,GAAQ,EAAGjvB,EAAK,IAGhDhD,KAAKo3D,wBAAwB,EAzB7Bp3D,KAAK6vD,YAAc,IAAI,IAAsB7vD,KAAK82D,qBAEjD4L,IAAwB,SAAuB,KAC9C1iE,KAAKmF,MAAM,IACV,KACDnF,KAAKo7B,kBAAkB,GAE3B,CAqBUunC,UACR,OAAO,OAAc3iE,KAAKk3D,OAAQl0D,GAASA,EAAKi0D,SAClD,CAEanmD,YAAY9N,G,iHACjB,EAAM8N,YAAW,UAAC9N,GACxBhD,KAAK6vD,YAAY/sD,UAAUE,EAAKorB,IAClC,E,+RAEUw0C,WAAWrjC,EAA4B3+B,G,MAG/C,QAFiBsR,MAAM0wD,WAAWrjC,EAAQ3+B,KAI1CZ,KAAK2D,QAAQ/C,GAIH,QAAV,EAAAA,EAAGq2D,eAAO,QAAVr2D,EAAGq2D,SAAY,IAER,EACT,E,uEChDa,MAAM4L,UAAiC,IAOpD9iE,YAAY82D,GACV3kD,MAAM2kD,GAPE,KAAAK,MAAgC,GAChC,KAAA4L,UAAkC,IAAI1hE,GAOhD,CAEO+D,OACL+M,MAAM/M,OACNnF,KAAK6vD,YAAY1qD,MACnB,CAEOqoD,SACLt7C,MAAMs7C,SACNxtD,KAAK6vD,YAAYrC,QACnB,CAEOpyB,mBACLlpB,MAAMs7C,SACNxtD,KAAK6vD,YAAYz0B,kBACnB,CAEO3V,QACLvT,MAAMuT,QACNzlB,KAAK6vD,YAAY8J,YACnB,CAEOlM,UACLztD,KAAK6vD,YAAYpC,SACnB,CAEUsV,SAAS//D,GACjB,OAAOA,EAAKJ,KAAKI,EAAKorB,IACxB,CAEUw0C,WAAWrjC,EAA4B3+B,GAE/C,GADaZ,KAAKk3D,MAAMx2D,MAAMsnB,GAAMA,EAAEoG,MAAQxtB,EAAGwtB,KAAOpG,EAAEplB,OAAShC,EAAGgC,OAEpE,OAAO,EAEP,IAAI,MAAMI,KAAQhD,KAAK8iE,UACrB,GAAG9/D,EAAKorB,MAAQxtB,EAAGwtB,KAAOprB,EAAKJ,OAAShC,EAAGgC,KACzC,OAAO,EAMb,OADA5C,KAAKk3D,MAAM33B,GAAQ3+B,IACZ,CACT,CAEUw2D,yB,MACe,QAAvB,EAAAp3D,KAAKgjE,0BAAkB,QAAvBhjE,KAAKgjE,mBAAuBtvD,OAAOhR,YAAW,KAC5C1C,KAAKgjE,wBAAqB/+D,EAC1BjE,KAAKijE,cAAc,GAClB,GACL,CAEO5gE,KAAKzB,GACVsR,MAAM7P,KAAKzB,EACb,CAEO2uB,QAAQ3uB,GACbsR,MAAMqd,QAAQ3uB,EAChB,CAEOK,OAAOL,IACZ,OAAiBZ,KAAKk3D,OAAQlvC,GAAMA,EAAEoG,MAAQxtB,EAAGwtB,MACjDpuB,KAAK8C,UAAUlC,EACjB,CAEO+C,QAAQ/C,GACbZ,KAAK6vD,YAAYlsD,QAAQ/C,EAAGwtB,IAC9B,CAEOtrB,UAAUlC,GACfZ,KAAK6vD,YAAY/sD,UAAUlC,EAAGwtB,IAChC,E,qECxFa,MAAM80C,UAA0B,IAW7CnjE,YAAsB2xB,GAQpBxf,MAAM,CACJuQ,KAAM,IAAO,GAAK,IAClB7b,IAAK,EACLH,IAAK,EACLic,eAAgBgP,EAAQhP,eACxBygD,aAAczxC,EAAQyxC,cACrB,GAdiB,KAAAzxC,QAAAA,EA2DZ,KAAA0xC,aAAe,KACvBpjE,KAAKyG,IAAMzG,KAAK0F,MAAMmB,SACtB7G,KAAKqjE,KAAK11D,aAAa,MAAO,GAAK3N,KAAKyG,IAAI,EAGpC,KAAA+C,QAAU,KAClBxJ,KAAKykB,aAAa,EAGV,KAAA3c,OAAS,KACjB,MAAMogB,EAAI,KACRloB,KAAKykB,cAELzkB,KAAKsjE,YAActjE,KAAK0F,MAAMpB,YAASL,EAAYyP,OAAO83B,sBAAsBtjB,EAAE,EAGjFloB,KAAKsjE,cACN5vD,OAAOgnC,qBAAqB16C,KAAKsjE,aACjCtjE,KAAKsjE,iBAAcr/D,GAGlBjE,KAAK4W,YACN5W,KAAKujE,kBAKPr7C,GAAG,EAIK,KAAAgnB,aAAe,KACpBlvC,KAAK0F,MAAMpB,SACZtE,KAAKykB,cAEFzkB,KAAK4W,YACN5W,KAAKujE,kB,EAKD,KAAAC,WAAcz7D,IACtB/H,KAAKujE,iBAAiB,EArFnB7xC,EAAQhsB,OACT1F,KAAKsI,SAASopB,EAAQhsB,MAAOgsB,EAAQ9a,WAEzC,CAEOtO,SAAS5C,EAAyBkR,GAAa,GACjD5W,KAAK0F,OACN1F,KAAK2b,kBAGJ/E,IAAe5W,KAAKyjE,YACrBzjE,KAAKyjE,WAAap4D,SAASC,cAAc,OACzCtL,KAAKyjE,WAAWlwD,UAAUxS,IAAI,wBAAyB,yBACvDf,KAAKoL,UAAU4M,QAAQhY,KAAKyjE,aAEpBzjE,KAAKyjE,YACbzjE,KAAKyjE,WAAWlwD,UAAU1J,OAAO,QAAS+M,GAG5C5W,KAAK0F,MAAQA,EACb1F,KAAK4W,WAAaA,IACdlR,EAAMpB,QAAUoB,EAAMa,YAAc,IACtCvG,KAAK8H,SAGP,IAAIyJ,GAAa,EACjBvR,KAAK0jE,aACL1jE,KAAKqU,eACLrU,KAAK2iB,YAAY,CACfm5B,YAAa,K,QACXvqC,GAAcvR,KAAK0F,MAAMpB,OACzBiN,GAAcvR,KAAK0F,MAAMnB,QACA,QAAzB,EAAY,QAAZ,EAAAvE,KAAK0xB,eAAO,eAAE5Z,mBAAW,gBAAI,EAG/B+K,UAAY9a,I,QAEVwJ,GAAcvR,KAAK0F,MAAMjB,OACF,QAAvB,EAAY,QAAZ,EAAAzE,KAAK0xB,eAAO,eAAE3Z,iBAAS,gBAAI,GAGjC,CA+CUw3B,MAAMxnC,GACd,MAAM2nC,EAAYx9B,MAAMq9B,MAAMxnC,GAE9B,OADA/H,KAAK0F,MAAMa,YAAcmpC,EAClBA,CACT,CAEU6zB,kBACR,GAAG,sBAA6CvjE,KAAK0F,OAAQ,OAC7D,MAAMi+D,EAAM3jE,KAAK0F,MAAMk+D,SACjBC,EAAYF,EAAI9gE,OAEhB0D,EAAcvG,KAAK0F,MAAMa,YAC/B,IAAIu9D,EAAe,EAAGC,EAAM,EAC5B,IAAI,IAAI/7C,EAAI,EAAGA,EAAI67C,IAAa77C,EAAG,CACjC,MAAMsD,EAAQq4C,EAAIr4C,MAAMtD,GACrBzhB,GAAe+kB,GAASA,GAASw4C,IAClCA,EAAex4C,EACfy4C,EAAMJ,EAAII,IAAI/7C,G,CAQlB,MAAMg8C,EAAWhkE,KAAK0F,MAAMmB,SAAWk9D,EAAM/jE,KAAK0F,MAAMmB,SAAW,EACnE7G,KAAKyjE,WAAWl4D,MAAM2b,MAAoB,IAAX88C,EAAkB,GAEnD,CAEUN,aACR1jE,KAAKyG,IAAMzG,KAAK0F,MAAMmB,UAAY,EAC/B7G,KAAKyG,IAAM,EACZzG,KAAKojE,eAELpjE,KAAK0F,MAAMkI,iBAAiB,aAAc5N,KAAKojE,aAEnD,CAEO3+C,cACL,GAAG,sBAA6CzkB,KAAK0F,OAAQ,OAW7D,MAAMa,EAAcvG,KAAK0F,MAAMa,YAC/B2L,MAAMuS,YAAYle,EACpB,CAEO8N,eACLnC,MAAMmC,eACNrU,KAAK0F,MAAMkI,iBAAiB,QAAS5N,KAAKwJ,SAC1CxJ,KAAK0F,MAAMkI,iBAAiB,OAAQ5N,KAAK8H,QACzC9H,KAAK0F,MAAMkI,iBAAiB,QAAS5N,KAAKkvC,cAC1ClvC,KAAK0F,MAAMkI,iBAAiB,aAAc5N,KAAKkvC,cAC/ClvC,KAAK4W,YAAc5W,KAAK0F,MAAMkI,iBAAiB,WAAY5N,KAAKwjE,WAClE,CAEO7nD,kBACLzJ,MAAMyJ,kBAEH3b,KAAK0F,QACN1F,KAAK0F,MAAMgM,oBAAoB,aAAc1R,KAAKojE,cAClDpjE,KAAK0F,MAAMgM,oBAAoB,QAAS1R,KAAKwJ,SAC7CxJ,KAAK0F,MAAMgM,oBAAoB,OAAQ1R,KAAK8H,QAC5C9H,KAAK0F,MAAMgM,oBAAoB,QAAS1R,KAAKkvC,cAC7ClvC,KAAK0F,MAAMgM,oBAAoB,aAAc1R,KAAKkvC,cAClDlvC,KAAK4W,YAAc5W,KAAK0F,MAAMgM,oBAAoB,WAAY1R,KAAKwjE,aAGlExjE,KAAKsjE,cACN5vD,OAAOgnC,qBAAqB16C,KAAKsjE,aACjCtjE,KAAKsjE,iBAAcr/D,EAEvB,E,qGCrLF,MACM6W,EAQD,IAAIvZ,IAEH0iE,EAA8B,IAAI7iE,IAExC,IAAI8iE,GAAc,EAElB,SAASC,IACJD,IAIHA,GAAc,GACd,SAAQ,KACNA,GAAc,EAMhBD,EAAUl/D,QAAQq/D,GAClBH,EAAUx+C,OANW,IAEvB,CAeA,SAAS4+C,EAAgBniE,GACvB,MAAMk7B,EAAWl7B,EAAgBk7B,QACjC,GAAGA,EACD,OAAOA,IAGT,MAAMx7B,EAAOM,EAAQ6nB,QAAQmmB,SAC7B,OAAGtuC,EACiB,WAEgBA,GACtBslB,MAGPhlB,EAAQwb,wBAAwBwJ,KACzC,CAEA,SAASk9C,EAAYliE,GAGnB,IAAIoiE,EAASxpD,EAAI7X,IAAIf,GACrB,MAAMqiE,GAAaD,EAEnB,IAAI,KAACtwD,EAAI,WAAEwrD,EAAU,KAAErmD,EAAI,WAAEqrD,EAAU,KAAEC,EAAI,UAAEC,EAAS,aAAEC,GAAgBL,GAAU,CAAC,EAGrF,GAAGC,EAAW,CACZvwD,EAAO9R,EAAQ0W,YACf4mD,EAAaxrD,EAAKnR,OAClBsW,EAAgE,GAChEqrD,EAAarrD,EAAO,GAAKA,EAAO,IAEhC,IAAI82B,EAAW/tC,EAAQ6nB,QAAQkmB,SAC5BA,IAAaA,IAAUA,GAAY,MAEtCw0B,EAAO,GAAGviE,EAAQ6nB,QAAQkT,YAAc,QAAcgT,GAAY,QAAY,OAK9Ey0B,GAAY,OAAa1wD,EAAMywD,GAE/BE,EAAeN,EAAgBniE,GAE/BoiE,EAAS,CAACtwD,OAAMwrD,aAAYrmD,OAAMqrD,aAAYC,OAAMC,YAAWC,gBAC/D7pD,EAAIlX,IAAI1B,EAASoiE,E,CAKnB,MAAMM,EAAkBP,EAAgBniE,GAClC2iE,EAAeN,GAAaI,IAAiBC,EAGnD,IAFCL,GAAaM,IAAiBP,EAAOK,aAAeA,EAAeC,GAEjEC,EACD,GAAGH,EAAYC,EAAc,CAC3BziE,EAAQyL,aAAa,QAASqG,GAC9B,IAAI8wD,EAAc9wD,EACd+wD,EAAeJ,EACnB,KAAMG,EAAYjiE,OAAS,GAAG,CAC5B,MAAMmiE,EAAoBF,EAAYjiE,OAChCoiE,EAAOT,IACX,OAAMA,EAAaQ,GAAqB,EAAG,EAAGA,EAAoB,IAClEx+D,KAAKC,IAAIu+D,EAAoB7rD,EAAO,EAAG,GACnC+rD,EAAQJ,EAAYK,OAAO,EAAGF,GAAM56C,QAAQ,OAAQ,IACpD+6C,EAAQN,EAAYK,OAAOF,EAAO,GAAG56C,QAAQ,OAAQ,IAG3D,GAFAy6C,EAAcI,EAAQE,EACtBL,GAAe,OAAaD,EA3GnB,IA2G2CL,GACjDM,EAAeJ,EAAc,CAC9BziE,EAAQ0W,YAAcssD,EA7Gf,IA6GkCE,EACzC,K,EAKJd,EAAOK,aAAeN,EAAgBniE,E,MAGtCA,EAAQipD,gBAAgB,QAK9B,CA3FAz3C,OAAO9F,iBAAiB,UAAU,KAChC,IAAI,MAAOpB,KAAQsO,EACjBmpD,EAAUljE,IAAIyL,GAGhB23D,GAAc,GACb,CAACnvD,SAAS,EAAMyc,SAAS,IAuFrB,MAAM4zC,UAA8B7hE,YACzC68D,oBAGEvlD,EAAIlX,IAAI5D,KAAM,MACXA,KAAK+pB,QAAQmmB,UAAalwC,KAAao9B,QACxCgnC,EAAYpkE,OAEZikE,EAAUljE,IAAIf,MACdmkE,IAKJ,CAEAzyB,uBACkB52B,EAAI7Z,OAAOjB,MAC3BikE,EAAUhjE,OAAOjB,KAEnB,EAGF4xC,eAAeC,OAAO,0BAA2BwzB,E,6DClKlC,MAAMC,EAMnBvlE,YAAsBwlE,EAAkD19D,GAAlD,KAAA09D,mBAAAA,EAAkD,KAAA19D,KAAAA,EAHjE,KAAA29D,UAAY,EAIjBxlE,KAAKoL,UAAYC,SAASC,cAAc,OACxCtL,KAAKoL,UAAUmI,UAAUxS,IAAI,wBAC/B,CAEO6B,OACL,OAAG5C,KAAKkuB,YAAoBluB,KAAKkuB,YAC1BluB,KAAKkuB,YAAc,yBAAkC,CAC1D9iB,UAAWpL,KAAKoL,UAChB1H,MAAM,EACNc,UAAU,EACV0iB,MAAOlnB,KAAK6H,KACZyf,OAAQtnB,KAAK6H,KACb49D,SAAS,GAER,4BAA4Bn3D,MAAMpN,IAEnClB,KAAKS,UAAYS,EACjBlB,KAAKS,UAAUmN,iBAAiB,cAAc83D,KAGX,IAA7B1lE,KAAKS,UAAU2kB,WAAmBsgD,GAAgB1lE,KAAKwlE,YAC1B,IAA9BxlE,KAAKS,UAAU2kB,WAAoBsgD,GAAgB1lE,KAAKwlE,aACzDxlE,KAAKS,UAAUklE,SAAS,GACxB3lE,KAAKS,UAAU8D,Q,IAInBvE,KAAKulE,mBAAmBK,QAAQC,4BAA8B,KACzD7lE,KAAKulE,mBAAmBK,QAAQE,iBACjC9lE,KAAKS,UAAUslE,aAAa,GAC5B/lE,KAAKS,UAAUulE,SAAW,EAC1BhmE,KAAKwlE,UAAY,GACjBxlE,KAAKS,UAAUgE,SAEfzE,KAAKS,UAAUslE,cAAc,GAC7B/lE,KAAKS,UAAUulE,SAAW,GAC1BhmE,KAAKwlE,UAAY,EACjBxlE,KAAKS,UAAUgE,O,EAIZ,sBAA+BvD,KAE1C,CAEOsB,SACFxC,KAAKS,WACNT,KAAKS,UAAU+B,QAEnB,E,6DCxDa,MAAMyjE,EAWnBlmE,YAAsB40B,EAAkC9sB,GAAlC,KAAA8sB,WAAAA,EAAkC,KAAA9sB,KAAAA,EAR9C,KAAApB,IAAM,GACN,KAAA++D,UAAY,EAQpBxlE,KAAKoL,UAAYC,SAASC,cAAc,OACxCtL,KAAKoL,UAAUmI,UAAUxS,IAAI,yBAE7B,MAAM6zB,EAAQD,EAAWC,MAEzBA,EAAMhnB,iBAAiB,QAAQ,KAC7B5N,KAAKkmE,cAAc,EAAE,IAGvBtxC,EAAMhnB,iBAAiB,SAAU7F,IAC/B/H,KAAKkmE,cAAcvxC,EAAWjoB,MAAM7J,OAAO,GAM/C,CAIOqjE,cAAcrjE,GACnB,IAAI7C,KAAKS,UAAW,OAGpB,IAAI0lE,GADJtjE,EAAS2D,KAAKI,IAAI/D,EAAQ,MAGxBsjE,EAAQ3/D,KAAKmD,MAAMnD,KAAKI,IAAI5G,KAAKyG,IAAK5D,IAAW,IAAM7C,KAAKyG,KAAO,OAEhEzG,KAAKomE,gBACNpmE,KAAKomE,cAAc/9D,MAAK,GACxBrI,KAAKomE,cAAc9iE,OAAO,GAAGiI,MAAM4f,QAAU,QAG/CnrB,KAAKS,UAAU6C,OAAO,GAAGiI,MAAM4f,QAAU,IAYzCg7C,EAAQ,EAIV,MAAM/gD,EAAYplB,KAAKwlE,UAAYW,GAAS,EAAI,EAGhDnmE,KAAKS,UAAUslE,aAAa3gD,GACN,IAAnBplB,KAAKwlE,WAA6B,IAAVW,GACzBnmE,KAAKS,UAAUklE,SAAS,GAI1B3lE,KAAKwlE,UAAYW,EAEjBnmE,KAAKS,UAAUgE,MAIjB,CAEO7B,OACL,OAAG5C,KAAKkuB,YAAoBluB,KAAKkuB,YAC1BluB,KAAKkuB,YAAc7I,QAAQqH,IAAI,CACpC,yBAAkC,CAChCthB,UAAWpL,KAAKoL,UAChB1H,MAAM,EACNc,UAAU,EACV0iB,MAAOlnB,KAAK6H,KACZyf,OAAQtnB,KAAK6H,MACZ,4BAA4ByG,MAAM7N,IACnCT,KAAKomE,cAAgB3lE,EAGjBT,KAAK20B,WAAWjoB,MAAM7J,QACxBpC,EAAUgE,OAGL,sBAA+BhE,MAGxC,yBAAkC,CAChC2K,UAAWpL,KAAKoL,UAChB1H,MAAM,EACNc,UAAU,EACV0iB,MAAOlnB,KAAK6H,KACZyf,OAAQtnB,KAAK6H,MACZ,gCAAgCyG,MAAMpN,IACvClB,KAAKS,UAAYS,EAEblB,KAAK20B,WAAWjoB,MAAM7J,SACxB7C,KAAKS,UAAU6C,OAAO,GAAGiI,MAAM4f,QAAU,QAG3CnrB,KAAKS,UAAUmN,iBAAiB,cAAc83D,KAIX,IAA7B1lE,KAAKS,UAAU2kB,WAAmBsgD,GAAgB1lE,KAAKwlE,YAC1B,IAA9BxlE,KAAKS,UAAU2kB,WAAoBsgD,GAAgB1lE,KAAKwlE,aACzDxlE,KAAKS,UAAUklE,SAAS,GACxB3lE,KAAKS,UAAU8D,SAGG,IAAjBmhE,GAAyC,IAAnB1lE,KAAKwlE,WAGzBxlE,KAAKomE,gBACNpmE,KAAKomE,cAAc9iE,OAAO,GAAGiI,MAAM4f,QAAU,GAC7CnrB,KAAKomE,cAAc3hE,OACnBzE,KAAKS,UAAU6C,OAAO,GAAGiI,MAAM4f,QAAU,O,IAMxC,sBAA+BjqB,OAG5C,CAEOsB,SACFxC,KAAKS,WAAWT,KAAKS,UAAU+B,SAC/BxC,KAAKomE,eAAepmE,KAAKomE,cAAc5jE,QAC5C,E,8EC9IK,MAAM6jE,EAKXtmE,YAAmBqL,EAA+BwpB,GAA/B,KAAAxpB,UAAAA,EAA+B,KAAAwpB,MAAAA,EAJ3C,KAAAkxC,iBAAkB,EAmClB,KAAAQ,kBAAqBv+D,KAC1B,OAAYA,GACZ/H,KAAK8lE,iBAAmB9lE,KAAK8lE,gBAE7B9lE,KAAKumE,cAAchzD,UAAU1J,OAAO,aAAc7J,KAAK8lE,iBACtD9lE,KAAK40B,MAA2BhzB,KAAO5B,KAAK8lE,gBAAkB,OAAS,WACxE9lE,KAAK6lE,6BAA+B7lE,KAAK6lE,6BAA6B,EApCtEjxC,EAAMhzB,KAAO,WACbgzB,EAAMjnB,aAAa,WAAY,IAC/BinB,EAAM1c,KAAO,qBACb0c,EAAMwuB,aAAe,MAGrB,MAAMojB,EAAWn7D,SAASC,cAAc,SACxCk7D,EAASjzD,UAAUxS,IAAI,YACvBylE,EAASC,UAAY,EACrBD,EAAS5kE,KAAO,WAChBgzB,EAAM3b,cAAcjB,QAAQwuD,GAC5B5xC,EAAM3b,cAAc1B,aAAaivD,EAAS/5C,YAAamI,EAAMwqC,aAS7D,MAAMmH,EAAgBvmE,KAAKumE,cAAgBl7D,SAASC,cAAc,QAClEi7D,EAAchzD,UAAUxS,IAAI,iBAAkB,SAE9CqK,EAAUmI,UAAUxS,IAAI,wBACxBqK,EAAUM,OAAO66D,GAEjBA,EAAc34D,iBAAiB,QAAS5N,KAAKsmE,mBAC7CC,EAAc34D,iBAAiB,WAAY5N,KAAKsmE,kBAClD,EAYa,MAAMI,UAA2B,KAG9C3mE,YAAY2xB,EAA6B,CAAC,GACxCxf,MAAM,OAAD,QACH1C,WAAW,GACRkiB,IAGL1xB,KAAK4lE,QAAU,IAAIS,EAAqBrmE,KAAKoL,UAAWpL,KAAK40B,MAC/D,E,4oBCtCa,MAAM+xC,EAkBnB5mE,YACSo0B,EACCltB,GADD,KAAAktB,WAAAA,EACC,KAAAltB,SAAAA,EA4SH,KAAA6J,YAAoBkhC,GAAwD,EAAD,gCAChF,MAAM40B,EAASv7D,SAASC,cAAc,OAKtC,IAAIkxB,EAJJoqC,EAAOrzD,UAAUxS,IAAI4lE,EAAmB3mB,WAAa,UAAW,kBAAmB,QAEnFhgD,KAAK6mE,QAAQn7D,OAAOk7D,GAGjB50B,IACDxV,EAA4B,iBAAd,QACNx8B,KAAKiH,SAASgrC,iBAAiBK,SAASN,GAC7CA,EAAQ9lC,OAAuDswB,OAGpE,MAAM1O,EAAM,IAAIlE,MAChBkE,EAAIva,UAAUxS,IAAI,gBAClB+sB,EAAIg5C,WAAY,EAEhB,MAAMC,EAAe,IAAW,EAAD,gCAC7B,GAAGvqC,EAAO,CACR,MAAMxH,QAAY,OAAU,CAC1B5pB,UAAWw7D,EACXpqC,QACA30B,MAAM,EAAAq0B,EAAA,GAAgBM,EAAO,IAAK,KAAK,GACvCF,kBAAkB,IAGpB,CAACtH,EAAI4H,OAAOvtB,MAAO2lB,EAAI4H,OAAOC,MAAM9M,OAAO+M,SAAS/3B,SAAS+oB,IAC3DA,EAAIva,UAAUxS,IAAI,eAAe,G,KAE9B,CACL,MAAMy7B,QAAcx8B,KAAKiH,SAASqI,gBAAgBC,aAAavP,KAAKgI,cAC9D,OAAU4+D,EAAQ5mE,KAAKgI,OAAQw0B,EAAO,YAAa1O,E,CAG3D84C,EAAOrzD,UAAU/Q,OAAO,OAC1B,IAWA,OATGxC,KAAK6mE,QAAQtzC,mBAvWC,QAwWTwzC,KAEN/mE,KAAKgnE,qBAAqBrjE,QAAQijE,GAClC5mE,KAAKinE,cAAcrjE,IAAIgjE,EAAQG,IAGjC/mE,KAAKknE,SAEEl1B,CACT,IAzVEhyC,KAAKoL,UAAYC,SAASC,cAAc,OACxCtL,KAAKoL,UAAUmI,UAAUxS,IAAI4lE,EAAmB3mB,WAAa,cAE7DhgD,KAAK6mE,QAAUx7D,SAASC,cAAc,OACtCtL,KAAK6mE,QAAQtzD,UAAUxS,IAAI4lE,EAAmB3mB,WAAa,YAE3DhgD,KAAKmnE,SAAW97D,SAASC,cAAc,OACvCtL,KAAKmnE,SAAS5zD,UAAUxS,IAAI4lE,EAAmB3mB,WAAa,aAE5DhgD,KAAKonE,KAAO/7D,SAASC,cAAc,OACnCtL,KAAKonE,KAAK7zD,UAAUxS,IAAI4lE,EAAmB3mB,WAAa,SAExDhgD,KAAKg3B,KAAO3rB,SAASC,cAAc,OACnCtL,KAAKg3B,KAAKzjB,UAAUxS,IAAI4lE,EAAmB3mB,WAAa,SAExDhgD,KAAKqnE,cAAgBh8D,SAASC,cAAc,OAC5CtL,KAAKqnE,cAAc9zD,UAAUxS,IAAI4lE,EAAmB3mB,WAAa,SAAU,wBAM3EhgD,KAAKsnE,UAAYj8D,SAASC,cAAc,OACxCtL,KAAKsnE,UAAU/zD,UAAUxS,IAAI4lE,EAAmB3mB,WAAa,SAAU2mB,EAAmB3mB,WAAa,cAAe,oBAMtHhgD,KAAKoL,UAAUM,OAAO1L,KAAK6mE,QAAS7mE,KAAKmnE,SAAUnnE,KAAKonE,KAAMpnE,KAAKg3B,KAAMh3B,KAAKqnE,cAAernE,KAAKsnE,WAElGtnE,KAAKinE,cAAgB,IAAI1lE,IACzBvB,KAAK6R,eAAiB,IAAI,IAE1B,MAAM01D,EAAiB,IACY,IAA9BvnE,KAAKm0B,WAAWkG,YACjBr6B,KAAKm0B,WAAW2F,kBAAkB,CAChC53B,QAASlC,KAAKm0B,WAAW/oB,UAAUmK,kBACnCwkB,SAAU,WAEL,GAMLytC,EAAc,EAAI,EACxB,IAAIl2B,GAAS,EACTm2B,GAAS,GACb,QAAiBznE,KAAKoL,WAAiBs8D,GAAO,EAAD,gCAC3C,GAAGD,EAED,YADA,EAAArtD,EAAA,GAAYstD,GAId,GAAGp2B,EAED,YADAA,GAAS,GAIX,IAAIi2B,IACF,OAGF,MAAMjhD,EAAOtmB,KAAKoL,UAAUsS,wBAItBhB,EADIgrD,EACEj4B,MAENk4B,EAASjrD,EAAI4J,EAAKxB,KACxB,IAAK9kB,KAAKwI,WAAWK,SAAShG,SAAW7C,KAAKwI,WAAWoB,KAAK/G,QAC3D8kE,EAAUrhD,EAAKY,MAAQsgD,GAAgBG,EAAUrhD,EAAKY,MAAQZ,EAAKY,MAAQsgD,EAAe,CAC3F,MAAMx/D,EAAShI,KAAKgI,OAEd8yB,EAAsF,GAC5F96B,KAAKwI,WAAWK,SAASyZ,OAAOtiB,KAAKwI,WAAWC,QAASzI,KAAKwI,WAAWoB,MAAM7E,SAAQ,CAAC/B,EAAM+F,KAC5F+xB,EAAQz4B,KAAK,CACXH,QAAmBlC,KAAK6mE,QAAQ1tC,SAASpwB,GACzC/F,QACA,IAGJ,MAAMyS,EAAcqlB,EAAQhL,MAAM,EAAG9vB,KAAKwI,WAAWK,SAAShG,QACxD6S,EAAcolB,EAAQhL,MAAM9vB,KAAKwI,WAAWK,SAAShG,OAAS,GAE9DxC,EAASL,KAAK6mE,QAAQ1tC,SAASn5B,KAAKwI,WAAWK,SAAShG,QAC9D4kE,GAAS,GACT,OAAiBpnE,EAAQ2H,GAAQ,IAAMA,IAAWhI,KAAKgI,QAAQhI,KAAKwI,WAAWC,QAASgN,EAAaC,GACrG+xD,GAAS,C,KACJ,CACL,MACMG,EAAUlrD,EADA4J,EAAKvB,MAASuB,EAAKY,MAAQ,EAQ3C,IAAIyxB,EAHJ34C,KAAK6mE,QAAQtzD,UAAUxS,IAAI,iBACtBf,KAAK6mE,QAAQx/C,WAIwDsxB,EAD7C,IAA1B34C,KAAKwI,WAAWypB,OAAgB21C,EAC3B5nE,KAAKwI,WAAWypB,QAAWjyB,KAAKwI,WAAWysB,MAAQ,GAAM2yC,IAAsB5nE,KAAKwI,WAAWysB,MAAQ,GAC/F2yC,EAAU,GAAK,EAFwB5nE,KAAKwI,WAAWysB,MAAQ,EAG/Ej1B,KAAKwI,WAAWU,GAAGyvC,IAEnB,SAAQ,KACN34C,KAAK6mE,QAAQtzD,UAAU/Q,OAAO,gBAAgB,G,CAIpD,KAAG,CAACqP,eAAgB7R,KAAK6R,iBAEzB,MAAMg2D,EAAkB,KACtBv2B,GAAS,EACTjmC,SAASI,KAAKmC,iBAAiB,IAAqB,WAAa,SAAU7F,IACzEupC,GAAS,CAAK,GACb,CAACrjC,MAAM,GAAM,EAGlB,IAAIiZ,EAAQ,EAAGxK,EAAI,EAAGorD,EAAY,EAAwB5nD,EAAO,EAC5ClgB,KAAKujB,aAAe,IAAI,IAAa,CACxDrhB,QAASlC,KAAK6mE,QACdnjD,QAAS,CAACN,EAAOC,KAIfykD,EAHA1kD,IAAU,EAIV,IAAI2kD,EAAQrrD,EAAI0G,GAASujD,EAAmBqB,MAM5C,OALGD,EAAQ,EAAGA,EAAQ,EACdA,EAAQ7nD,IAAM6nD,EAAQ7nD,GAE9BlgB,KAAK6mE,QAAQt7D,MAAMkR,UAAYkqD,EAAmBsB,mBAAmB59C,QAAQ,MAAO09C,EAAQ,OAErF,CAAK,EAEd9jD,kBAAoBlc,GACdw/D,KAIMvnE,KAAKoL,UAAUmI,UAAUqB,SAAS,eAAgB6yD,GAH1DI,KACA,EAAAztD,EAAA,GAAYrS,IACL,GAOX0b,aAAc,KACZ,MAAM6C,EAAOtmB,KAAK6mE,QAAQnpD,wBAC1BwJ,EAAQZ,EAAKY,MACbhH,GAAQgH,GAASlnB,KAAKg3B,KAAKzD,kBAAoB,GAI/C7W,EAAI4J,EAAKxB,KAAO9kB,KAAKoL,UAAUsS,wBAAwBoH,KAEvD9kB,KAAK6mE,QAAQt7D,MAAMkR,UAAYkqD,EAAmBsB,mBAAmB59C,QAAQ,MAAO3N,EAAI,MAExF1c,KAAKoL,UAAUmI,UAAUxS,IAAI,cAC7Bf,KAAK6mE,QAAQtzD,UAAUxS,IAAI,iBACtBf,KAAK6mE,QAAQx/C,UAAU,EAE9B7D,QAAS,KACP,MAAM0kD,EAAW1hE,KAAK0wC,KAAK1wC,KAAK8X,IAAIwpD,IAAc5gD,EAAQy/C,EAAmBqB,SAAWF,GAAa,EAAI,GAAK,GAC9GD,IAIA7nE,KAAK6mE,QAAQtzD,UAAU/Q,OAAO,kBAC9B,SAAQ,KACNxC,KAAKwI,WAAWU,GAAGg/D,GACnBloE,KAAKoL,UAAUmI,UAAU/Q,OAAO,aAAa,GAC7C,IAINxC,KAAKgnE,qBAAuB,IAAI9mE,sBAAsBC,IACpDA,EAAQ4E,SAAS3E,IACXA,EAAMS,gBAIVb,KAAKmoE,oBAAoB/nE,EAAMC,OAAO,GACtC,GAgBN,CAEa+nE,QAAQpgE,G,yCACnBhI,KAAKgI,OAASA,EAEd,MAAMw0B,QAAcx8B,KAAKiH,SAASqI,gBAAgBC,aAAavH,GAC/D,IAAIw0B,EACF,OAGF,MAAMh0B,EAA+CxI,KAAKwI,WAAa,IAAI,IAAW,CACpFoI,UAAW,GACXmhC,SAAU,CAAC7F,EAAQl7B,EAAOJ,KACxB,IAAII,EAAO,OAAOqU,QAAQlX,QAAQ,CAAC8mB,WAAOhxB,EAAWuuB,MAAO,KAE5D,GAAGxqB,EAAO66B,SAAU,CAClB,MAAM/N,EAA2BoX,EACjC,OAAOlsC,KAAKiH,SAASgrC,iBAAiBC,cAAclqC,EAAQ8sB,EAAOlkB,GAAWtC,MAAM5B,IAC3E,CACLuoB,MAAOvoB,EAAMuoB,MACbzC,MAAO9lB,EAAMylC,U,CAGZ,CACL,MAAMpW,EAAwF,GAe9F,OAdIvzB,EAAWC,SACbszB,EAAS15B,KAAKrC,KAAKiH,SAASi9B,kBAAkBE,YAAYp8B,EAAO+4B,aAGnEhF,EAAS15B,KAAKrC,KAAKiH,SAAS8G,mBAAmB+2B,UAAU,CACvD98B,SACA8sB,MAAO/hB,OAAOC,iBACdZ,YAAa,CACXxC,EAAG,iCAELmlB,MAAOnkB,EACPy3D,UAAW,KAGNhjD,QAAQqH,IAAIqP,GAAUztB,MAAWi/B,GAAW,EAAD,gCAChD,MAAM7gC,EAAQ6gC,EAAOpkB,MAIrB,IAFA,EAAAm/C,EAAA,GAAyB57D,IAErBlE,EAAWC,QAAS,CACtB,MAAM47B,EAAWkJ,EAAO,GAClBplC,GAAU,EAAA09B,EAAA,GAAcn5B,EAAMilB,SAAUxpB,GACnCA,EAAmC+D,OAAuDswB,MAAM50B,KAAOy8B,EAASkkC,WAAW3gE,KAGtIY,EAAWC,QAAUN,UAAiBnI,KAAKiH,SAAS8G,mBAAmBy6D,0BAA0BxoE,KAAKgI,OAAQq8B,EAASkkC,Y,CAIzH,MAAO,CACLtzC,MAAOvoB,EAAMuoB,MACbzC,MAAO9lB,EAAMilB,QAEjB,K,GAGJ7gB,YAAa9Q,KAAK8Q,YAClBC,OAAQ,CAAC/N,EAAMgO,KACb,MAAMpJ,EAAK5H,KAAKwI,WAAWypB,MAErBvV,EAAI,IAAMiqD,EAAmBqB,MAAQpgE,EAC3C5H,KAAK6mE,QAAQt7D,MAAMkR,UAAYkqD,EAAmBsB,mBAAmB59C,QAAQ,MAAO,IAAI3N,MAExF,MAAM+rD,EAAYzoE,KAAKg3B,KAAKpf,cAAc,WACvC6wD,GAAWA,EAAUl1D,UAAU/Q,OAAO,UAE7BxC,KAAKg3B,KAAKmC,SAASvxB,GAC3B2L,UAAUxS,IAAI,UAElBf,KAAKmoE,oBAAoBnoE,KAAK6mE,QAAQ1tC,SAASvxB,GAAI,IAIxC,qBAAZ40B,EAAM5sB,IACPpH,EAAWC,QAAU+zB,EAAMksC,gBAGvB1oE,KAAK8Q,YAAYtI,EAAWC,SAGlCD,EAAW5F,MAAK,EAClB,G,CAEOskE,SACL,MAAMh0D,EAAM7H,SAASC,cAAc,OACnC4H,EAAIK,UAAUxS,IAAI4lE,EAAmB3mB,WAAa,QAClDhgD,KAAKg3B,KAAKtrB,OAAOwH,GAEkB,IAAhClT,KAAKg3B,KAAKzD,mBACXrgB,EAAIK,UAAUxS,IAAI,UAGpBf,KAAKoL,UAAUmI,UAAU1J,OAAO,YAAa7J,KAAKg3B,KAAKzD,mBAAqB,EAC9E,CAmDQ40C,oBAAoB9nE,GAC1B,MAAM84B,EAAWjgB,MAAMC,KAAK9Y,EAAO4Y,cAAckgB,UAC3CpwB,EAAMowB,EAAShf,QAAQ9Z,GACf84B,EAASrJ,MAAMtpB,KAAKC,IAAI,EAAGsC,EAtXxB,GAsX6CvC,KAAKI,IAAIuyB,EAASt2B,OAAQkG,EAtXvE,IAwXXhE,SAAS1E,IACb,MAAM+1B,EAAWp2B,KAAKinE,cAAchkE,IAAI5C,GACrC+1B,IACDA,IACAp2B,KAAKinE,cAAchmE,OAAOZ,GAC1BL,KAAKgnE,qBAAqBlkE,UAAUzC,G,GAG1C,CAEOqb,U,MACL1b,KAAK6R,eAAeC,YACpB9R,KAAKujB,aAAa5H,kBACO,QAAzB,EAAA3b,KAAKgnE,4BAAoB,SAAErN,YAC7B,EAnYe,EAAA3Z,WAAa,kBACb,EAAAgoB,MAAQ,IAAwB,EAAI,EACpC,EAAAC,mBAAqB,IAAwB,mCAAmCtB,EAAmBqB,SAAW,oB,sWCQ/H,MAAMW,EAAU,CAAC30D,EAA0C4qB,MAEzD,EAAAV,EAAA,GAAaU,EAAI7vB,MAAOiF,GAAQ,IAChC4qB,EAAIxzB,UAAUG,MAAM4f,QAAUnX,EAAO,GAAK,MAAM,EAInC,MAAM40D,EAuBnB7oE,YACUkH,EACDktB,EACCtiB,EACAq5B,GAAW,GAHX,KAAAjkC,SAAAA,EACD,KAAAktB,WAAAA,EACC,KAAAtiB,eAAAA,EACA,KAAAq5B,SAAAA,EAEJ,KACFlrC,KAAKm0B,WAAW/oB,UAAUmI,UAAUxS,IAAI,eAGtC8Q,IACF7R,KAAK6R,eAAiB,IAAI,KAG5B7R,KAAKkzC,kBAAmB,QAC1B,CAEO7c,OACLr2B,KAAKq2B,KAAO,KAGZr2B,KAAKkC,QAAUmJ,SAASC,cAAc,OACtCtL,KAAKkC,QAAQqR,UAAUxS,IAAI,mBAE3Bf,KAAK6oC,QAAU,IAAI,IAAe,CAChCggC,aAAa,IAGf7oE,KAAKkY,KAAO7M,SAASC,cAAc,OACnCtL,KAAKkY,KAAK3E,UAAUxS,IAAI,gBAExBf,KAAK8+B,SAAWzzB,SAASC,cAAc,OACvCtL,KAAK8+B,SAASvrB,UAAUxS,IAAI,oBAE5Bf,KAAK8oE,IAAM,IAAI,KAAI,CACjB/5D,MAAO,IACP+vB,UAAU,EACV/qB,KAAM,OACNkf,UAAYlrB,IAC+B,MAArCA,EAAE1H,OAAuBwgB,WAI7B,OAAoB7gB,KAAK8oE,IAAI/5D,MAAM6J,cACnC,EAAA6W,EAAA,IAAM,YAAY,aAAa,IAAM,EAEvC5d,eAAgB7R,KAAK6R,eACrBk3D,YAAa,CACXl1D,QAAS,CAAC,CACRE,KAAM,OACNC,KAAM,uBACNC,QAAS,MACP,QAAmBjU,KAAK8oE,IAAI19D,UAAU,EAExC7C,OAAQ,KAAOvI,KAAKgI,OAAO66B,UAC1B,CACD9uB,KAAM,OACNC,KAAM,qBACNC,QAAS,MACP,QAAmBjU,KAAK8oE,IAAI19D,UAAU,EAExC7C,OAAQ,IAAMvI,KAAKgI,OAAO66B,cAKhC7iC,KAAK8oE,IAAI/5D,MAAMwE,UAAUxS,IAAI,YAE7Bf,KAAKghC,SAAW,IAAI,KAAI,CACtBjyB,MAAO,IACPi6D,gBAAiB,WACjBj1D,KAAM,WACNkf,UAAW,MAET,OAAoB,IAAMjzB,KAAKghC,SAASjyB,MAAM6J,cAC9C,EAAA6W,EAAA,IAAM,YAAY,kBAAkB,GAAM,EAE5C5d,eAAgB7R,KAAK6R,eACrBk3D,YAAa,CACXl1D,QAAS,CAAC,CACRE,KAAM,OACNC,KAAM,0BACNC,QAAS,MACP,QAAmBjU,KAAKghC,SAAS51B,UAAU,OAMnDpL,KAAKqhC,MAAQ,IAAI,KAAI,CACnBtyB,MAAO,IACP+vB,UAAU,EACV/qB,KAAM,QACNkf,UAAW,MACT,OAAoBjzB,KAAKqhC,MAAMtyB,MAAM6J,YAAYyR,QAAQ,MAAO,MAChE,EAAAoF,EAAA,IAAM,YAAY,eAAe,GAAM,EAEzC5d,eAAgB7R,KAAK6R,eACrBk3D,YAAa,CACXl1D,QAAS,CAAC,CACRE,KAAM,OACNC,KAAM,6BACNC,QAAS,MACP,QAAmBjU,KAAKqhC,MAAMj2B,UAAU,GAEzC,CACD2I,KAAM,OACNC,KAAM,+BACNygC,SAAU,CACEppC,SAASC,cAAc,MAGnC2I,QAAS,KACPP,OAAOgb,KAAK,+BAAgC,SAAS,EAEvD2lB,WAAW,EACXkB,WAAW,EACXhtC,OAAQ,IAAW,kCACjB,MAAM,YAAC0gE,UAAqBjpE,KAAKiH,SAASk6B,gBAAgB+nC,aAAalpE,KAAKgI,OAAO+6B,cAAe,CAAC,EACnG,OAAOkmC,CACT,SAKNjpE,KAAKmpE,KAAO,IAAI,KAAI,CAClBp6D,MAAO,IACPi6D,gBAAiB,oBACjBj1D,KAAM,OACNkf,UAAW,KACT,MAAMvrB,EAAM1H,KAAKmpE,KAAKp6D,MAAM6J,aAC5B,OAAoBlR,GAGpB,MAAM24C,EAAY34C,EAAIqN,SAAS,QAC/B,EAAA0a,EAAA,IAAM,YAAY4wB,EAAY,wBAA0B,cAAc,GAAM,EAG9ExuC,eAAgB7R,KAAK6R,eACrBk3D,YAAa,CACXl1D,QAAS,CAAC,CACRE,KAAM,OACNC,KAAM,2BACNC,QAAS,MACP,QAAmBjU,KAAKmpE,KAAK/9D,UAAU,OAM/CpL,KAAKywB,SAAW,IAAI,KAAI,CACtB1hB,MAAO,IACPi6D,gBAAiB,eACjBj1D,KAAM,aAGR/T,KAAK6oC,QAAQl2B,QAAQjH,OACnB1L,KAAKqhC,MAAMj2B,UACXpL,KAAKghC,SAAS51B,UACdpL,KAAKywB,SAASrlB,UACdpL,KAAK8oE,IAAI19D,UACTpL,KAAKmpE,KAAK/9D,WAGZ,MAAM,eAACyG,GAAkB7R,KACtBA,KAAKkrC,WACNlrC,KAAKopE,cAAgB,IAAI,KAAI,CAC3Bp+B,cAAe,IAAI,IAAc,CAACnhC,QAAQ,IAC1C2wD,aAAc,gBACdzmD,KAAM,SACNlC,eAAgB7R,KAAK6R,iBAGvBA,EAAe9Q,IAAIf,KAAKopE,cAAcp+B,cAAcpW,MAApD/iB,CAA2D,UAAW9J,IAChEA,EAAE0B,WAKNzJ,KAAKiH,SAAS8G,mBAAmBs7D,eAAe,CAACrhE,OAAQhI,KAAKgI,OAAQiL,SAAUjT,KAAKiT,UAAU,IAGjGpB,EAAe9Q,IAAIygB,EAAA,EAAnB3P,CAA8B,0BAAgCwa,GAAW,kCACvE,GAAGrsB,KAAKgI,SAAWqkB,EAAOrkB,OAAQ,CAChC,MAAM+E,QAAc/M,KAAKiH,SAASqiE,wBAAwBC,iBAAiB,CAACvhE,OAAQhI,KAAKgI,OAAQwhE,aAAa,EAAOv2D,SAAUjT,KAAKiT,WACpIjT,KAAKopE,cAAcp+B,cAAc3B,SAAWt8B,C,CAEhD,MAEA/M,KAAK6oC,QAAQl2B,QAAQjH,OAAO1L,KAAKopE,cAAch+D,YAGjDpL,KAAKkC,QAAQwJ,OAAO1L,KAAK6oC,QAAQz9B,WAE9B,KACDpL,KAAKkC,QAAQwJ,QAAO,EAAAkwD,EAAA,MAGtB/pD,EAAe9Q,IAAIygB,EAAA,EAAnB3P,CAA8B,gBAAgB,EAAE7J,aAC3ChI,KAAKgI,SAAWA,GACjBhI,KAAKypE,e,IAIT53D,EAAe9Q,IAAIygB,EAAA,EAAnB3P,CAA8B,iBAAkB7J,IAC3CA,IAAWhI,KAAKgI,QACjBhI,KAAK0pE,gBAAe,E,IAIxB,MAAMC,EAAI,EAAO3hE,SAAQiL,cAAmD,kCAC1E,OAAGjT,KAAKgI,SAAWA,YAIGhI,KAAKiH,SAASqI,gBAAgBu3B,QAAQ7mC,KAAKgI,WACnDhI,KAAKiT,UAAWjT,KAAKiT,WAAaA,EAKlD,IAEApB,EAAe9Q,IAAIygB,EAAA,EAAnB3P,CAA8B,mBAAyB+gC,GAAS,yCACrD+2B,EAAE/2B,MACT5yC,KAAK4pE,eACL5pE,KAAK0pE,gBAAe,GAExB,MAEA73D,EAAe9Q,IAAIygB,EAAA,EAAnB3P,CAA8B,eAAgBg4D,IACzC7pE,KAAKgI,SAAW6hE,EAAOpzC,YACxBz2B,KAAKypE,e,IAIT53D,EAAe9Q,IAAIygB,EAAA,EAAnB3P,CAA8B,mBAAyBg4D,GAAW,kCAC7D7pE,KAAKgI,SAAW6hE,EAAOpzC,oBACLz2B,KAAKiH,SAASk6B,gBAAgBC,QAAQyoC,IAChDp8D,OAAOq8D,MAAS9pE,KAAKkrC,UAC5BlrC,KAAK+pE,gBAGX,MAEAl4D,EAAe9Q,IAAIygB,EAAA,EAAnB3P,CAA8B,iBAAuB+gC,GAAS,yCACnD+2B,EAAE/2B,KACT5yC,KAAKgqE,WAET,MAEAhqE,KAAKiqE,sBAAwBv2D,OAAOw2D,aAAY,IAAMlqE,KAAKypE,iBAAiB,IAC9E,CAEcA,cACZU,GAAY,EACZh5C,G,yCAEA,MAAMnpB,EAAShI,KAAKgI,OAEdoiE,EAA+B,GACrCA,EAAU/nE,MAAK,KACbrC,KAAKkC,QAAQqR,UAAU1J,OAAO,QAAS7B,IAAWwZ,EAAA,OAAe,IAGnE,IAAIjT,EAAwC8W,QAAQlX,UACpD,GAAMnG,IAAWwZ,EAAA,SAAmBxZ,IAAUhI,KAAKkrC,UAAY,CAC7D,MAAMrE,QAAgB7mC,KAAKiH,SAASqI,gBAAgBu3B,QAAQ7mC,KAAKgI,QAC3DkvB,EAAal3B,KAAKkzC,iBAAiBjwC,MAEvCsL,EADCs4B,GAAW7mC,KAAKiT,UACP,OAAoB,CAC5BjL,SACAwrC,YAAa,CACXtc,gBAED5oB,MAAK,EAAEpM,cACRlC,KAAK8+B,SAAS6D,gBAAgBzgC,EAAQ,IAG9BwzB,EAAA,iBAA2B,CACnC1tB,SACA9F,QAASlC,KAAK8+B,SACdqrC,YACAE,eAAe,EACfnzC,aACAozC,YAAatqE,KAAKkrC,WAItB38B,EAAQD,MAAM8nB,GAAaA,GAAYg0C,EAAU/nE,KAAK+zB,I,CAGxD,MAAMA,EAAW,IAAMg0C,EAAUrlE,SAASqxB,GAAaA,MAEvD,OAAO7nB,EAAQD,MAAK,KAClB,GAAG6iB,EACD,OAAOiF,EAGTA,GAAU,GAEd,G,CAEO2Q,cACL,CACE/mC,KAAK8oE,IACL9oE,KAAKqhC,MACLrhC,KAAKghC,SACLhhC,KAAKywB,SACLzwB,KAAKmpE,MACLpkE,SAAS65B,IACTA,EAAIxzB,UAAUG,MAAM4f,QAAU,MAAM,IAGnCnrB,KAAKopE,gBACNppE,KAAKopE,cAAch+D,UAAUG,MAAM4f,QAAU,GAC7CnrB,KAAKopE,cAAcp+B,cAAc3B,SAAU,GAG7CrpC,KAAKuqE,4BACP,CAEQC,gBACN,OAAOxqE,KAAKgI,SAAWwZ,EAAA,SAAmBxhB,KAAKkrC,QACjD,CAEQu/B,eACN,MAAM7D,EAAS,IAAI,IAInB,OAHAA,EAAOrzD,UAAUxS,IAAI,iBAAkB,cACvC6lE,EAAO17B,SAAWlrC,KAAKkrC,SACvB07B,EAAOzzB,mBACAyzB,CACT,CAEc8D,a,yCACZ,MAAM,OAAC1iE,GAAUhI,KACX2qE,KAAa3qE,KAAKiT,kBAAkBjT,KAAKiH,SAASqI,gBAAgBu3B,QAAQ7+B,KAChF,GAAGhI,KAAKwqE,kBAAoBG,UACN3qE,KAAKiH,SAASqI,gBAAgBC,aAAavH,IAErD,CACR,MAAM4iE,EAAa5qE,KAAK6mE,QAIxB,OAHA7mE,KAAK6mE,QAAU,IAAIF,EAAmB3mE,KAAKm0B,WAAYn0B,KAAKiH,gBACtDjH,KAAK6mE,QAAQuB,QAAQpgE,GAEpB,K,MACLhI,KAAK6mE,QAAQO,KAAK17D,OAAO1L,KAAKkY,KAAMlY,KAAK8+B,UAE9B,QAAX,EAAA9+B,KAAK4mE,cAAM,SAAEpkE,SACbxC,KAAK4mE,YAAS3iE,EAEX2mE,EAAYA,EAAWx/D,UAAU0hB,YAAY9sB,KAAK6mE,QAAQz7D,WACxDpL,KAAKkC,QAAQ8V,QAAQhY,KAAK6mE,QAAQz7D,WAEpC,KACDpL,KAAKm0B,WAAW/oB,UAAUmI,UAAUxS,IAAI,W,EAMhD,MAAM6lE,EAAS5mE,KAAKyqE,eAUpB,aATM7D,EAAOj6C,kBAAkB,CAC7B3kB,SACAiL,SAAU03D,EAAU3qE,KAAKiT,cAAWhP,EACpCuvC,YAAa,CACXgjB,iBAAiB,OAAc,IAAK,KACpCt/B,WAAYl3B,KAAKkzC,iBAAiBjwC,SAI/B,K,MACF,KACDjD,KAAKm0B,WAAW/oB,UAAUmI,UAAU/Q,OAAO,YAG1CxC,KAAK6mE,UACN7mE,KAAK6mE,QAAQz7D,UAAU5I,SACvBxC,KAAK6mE,QAAQnrD,UACb1b,KAAK6mE,aAAU5iE,GAGN,QAAX,EAAAjE,KAAK4mE,cAAM,SAAEpkE,SACbxC,KAAK4mE,OAASA,EAEd5mE,KAAK6oC,QAAQl2B,QAAQqF,QAAQhY,KAAK4mE,OAAQ5mE,KAAKkY,KAAMlY,KAAK8+B,SAAS,CAEvE,G,CAEQkrC,UAA6B74C,GACnC,MAAM5iB,EAAUvO,KAAK0qE,aACrB,OAAOv5C,EAAS5iB,EAAUA,EAAQD,MAAM8nB,GAAaA,KACvD,CAEQy0C,iBAAiBC,GACvB,MAAMC,EAAOD,EAAUh7C,MAAM,GAC7B,GAAGi7C,EAAKloE,OAAQ,CACd,MAAM4R,EAAIs2D,EAAKjwD,KAAKkmB,IAAa,EAAAgqC,EAAA,GAAW,CAAChqC,eAE7C,OADU,QAAK,eAAgB,EAAC,QAAKvsB,GAAG,I,CAG5C,CAEcm1D,e,yCACZ,MAAM,OAAC5hE,GAAUhI,KACjB,GAAGgI,EAAO66B,UAAY7iC,KAAKwqE,gBAAiB,CAC1C,MAAMM,QAAkB9qE,KAAKiH,SAASqI,gBAAgB27D,uBAAuBjjE,GACvE+iE,EAAO/qE,KAAK6qE,iBAAiBC,GAEnC,MAAO,KACL9qE,KAAKghC,SAASlC,SAAS6D,gBAAgBooC,IAAQ,QAAK,aACpDpC,EAAQmC,EAAU,GAAI9qE,KAAKghC,SAAS,C,CAG1C,G,CAEc+oC,gB,yCACZ,MAAM,OAAC/hE,GAAUhI,KACjB,GAAGgI,EAAO66B,UAAY7iC,KAAKwqE,gBAAiB,CAC1C,MAAM,MAACnpC,EAAK,YAAE4nC,UAAqBjpE,KAAKiH,SAASk6B,gBAAgB+nC,aAAalhE,EAAO+6B,cAAe,CAAC,EAErG,MAAO,KACL/iC,KAAKqhC,MAAMvC,SAAS6D,iBAAgB,QAAKsmC,EAAc,kBAAoB,UAC3EN,EAAQtnC,GAAQ,EAAA6pC,EAAA,GAAgB7pC,QAASp9B,EAAWjE,KAAKqhC,MAAM,C,CAGrE,G,CAEc8pC,oB,yCACZ,MAAMC,EAAmBprE,KAAKopE,cAC9B,GAAIgC,EAAJ,CAIA,GAAGprE,KAAKwqE,gBAAiB,CACvB,MAAMz9D,QAAc/M,KAAKiH,SAASqiE,wBAAwBC,iBAAiB,CAACvhE,OAAQhI,KAAKgI,OAAQwhE,aAAa,EAAOv2D,SAAUjT,KAAKiT,WACpI,MAAO,KACLm4D,EAAiBpgC,cAAc3B,SAAWt8B,CAAK,C,CAGjD,MAAO,KAELq+D,EAAiBhgE,UAAUG,MAAM4f,QAAU,MAAM,C,CAIvD,G,CAEckgD,W,yCACZ,MAAM,OAACrjE,GAAUhI,MACVkC,SAA8BmjB,QAAQqH,IAAI,EAC/C,OAAc,CACZ1kB,SACAqkB,OAAQrsB,KAAKkrC,SACbogC,WAAYtrE,KAAKiT,SACjBA,SAAUjT,KAAKiT,aAMnB,MAAO,MACL,EAAA4Z,EAAA,GAAe7sB,KAAKkY,KAAMhW,EAAQ,CAGtC,G,CAEcqpE,SAASp6C,G,yCACrB,OAAO9L,QAAQqH,IAAI,CACjB1sB,KAAKqrE,WACLrrE,KAAK4pE,eACL5pE,KAAK+pE,gBACL/pE,KAAKmrE,oBACLnrE,KAAK0pE,oBAAezlE,EAAWktB,GAC/BnxB,KAAKypE,eAAc,GAAM,KACxBn7D,MAAM87D,GACA,KACLA,EAAUrlE,SAASqxB,GAAaA,aAAQ,EAARA,KAAa,GAGnD,G,CAEao1C,sB,yCACX,IAAIxrE,KAAKyrE,QAAS,OAClBzrE,KAAKyrE,SAAU,EAEfzrE,KAAK+mC,cACL,MAAM74B,GAAW,SACElO,KAAKkzC,iBAAiBjwC,MAC9BQ,SAAQ,KACjByK,EAASoX,QAAQ,IAGnB,MAAM8kD,QAAkB/kD,QAAQqH,IAAI,CAClC1sB,KAAKgqE,WAAU,GACfhqE,KAAKurE,SAASr9D,KAGhB,MAAO,KACLA,EAASC,UACTi8D,EAAUrlE,SAASqxB,GAAaA,aAAQ,EAARA,KAAa,CAEjD,G,CAEcs1C,gBAAgB1jE,EAAgB2jE,G,yCAC5C,MAAM/mC,EAAI5kC,KAAK4rE,uBAEf,GADmB5rE,KAAKiT,iBAAkB2xB,EAAE5kC,KAAKiH,SAASqI,gBAAgBu3B,QAAQ7+B,KACtE,CACV,IAAIN,EAAM,gBACV,MAAMuL,GAAW,EAAA44D,EAAA,GAAmB7rE,KAAKiT,UACnC+tB,QAAiB4D,EAAE5kC,KAAKiH,SAASqI,gBAAgB2xB,gBAAgBj5B,IAOvE,OALEN,GADCs5B,EACM,GAAGA,KAAY/tB,IAEf,KAAKjL,EAAO+4B,cAAc9tB,IAG5B,KACL01D,EAAQjhE,EAAK1H,KAAKmpE,KAAK,C,CAI3B,MAAMiB,EAA4B,GAQlC,GANAA,EAAU/nE,MAAK,KACbrC,KAAK8oE,IAAIhqC,SAAS6D,iBAAgB,QAAK36B,EAAO66B,SAAW,UAAY,SACrE8lC,EAAQgD,EAASG,OAAQ,EAAAxtC,EAAA,IAAaqtC,EAASG,YAAS7nE,EAAWjE,KAAK8oE,IAAI,KAI1E9gE,EAAO66B,SAAU,CACnB,MAAM2d,QAAa5b,EAAE5kC,KAAKiH,SAAS88B,gBAAgBgoC,QAAQ/jE,EAAO+4B,aAC5D+pC,GAAY,EAAAG,EAAA,GAAuBzqB,GACzC,IAAIuqB,EACJ,GAAGD,EAAUjoE,OACXkoE,EAAO/qE,KAAK6qE,iBAAiBC,GAC7BV,EAAU/nE,MAAK,IAAMsmE,EAAQ,gBAAkBmC,EAAU,GAAI9qE,KAAKmpE,YAC7D,CACL,MAAM6C,EAAkBL,EAAkCM,gBACjC,wBAAtBD,aAAc,EAAdA,EAAgBp8D,IACjBw6D,EAAU/nE,MAAK,IAAMsmE,EAAQqD,EAAe7C,KAAMnpE,KAAKmpE,O,CAI3DiB,EAAU/nE,MAAK,IAAMrC,KAAKmpE,KAAKrqC,SAAS6D,gBAAgBooC,IAAQ,QAAK,uB,CAGvE,MAAMt6C,EAAYk7C,EAAkCl7C,SAOpD,MANkB,oBAAfA,aAAQ,EAARA,EAAU7gB,IACXw6D,EAAU/nE,MAAK,IAAMsmE,EAAQl4C,EAASy7C,QAASlsE,KAAKywB,YAGtDzwB,KAAKmsE,sBAAwBz4D,OAAOhR,YAAW,IAAM1C,KAAK0pE,gBAAe,IAAO,KAEzE,KACLU,EAAUrlE,SAASqxB,GAAaA,KAAW,CAE/C,G,CAEcszC,eAAe1nE,EAAiBmvB,G,yCAC5CnxB,KAAKuqE,6BAEL,MAAM,OAACviE,GAAUhI,KACX4kC,EAAI5kC,KAAK4rE,uBAEf,IAAI5jE,IAAWhI,KAAKwqE,wBAAyB5lC,EAAE5kC,KAAKiH,SAASqI,gBAAgB88D,iBAAiBpkE,KAC5F,OAGF,MAAMulC,QAAe3I,EAAE5kC,KAAKiH,SAASolE,aAAanoC,kBAAkBooC,mBAAmBtkE,EAAQhG,IACzFuqE,EAAa3nC,EAAE2I,EAAOA,QAAQj/B,MAAWq9D,GAAa,kCAC1D,WAAS/mC,EAAE5kC,KAAKiH,SAASqI,gBAAgB88D,iBAAiBpkE,KAK1D,aAAa48B,EAAE5kC,KAAK0rE,gBAAgB1jE,EAAQ2jE,GAC9C,MAEA,GAAGp+B,EAAOi/B,QAAUr7C,EAClB,OAAOo7C,GAENp7C,GAAU9L,QAAQlX,WAClBG,MAAK,IAAMi+D,IACXj+D,MAAM8nB,IACLA,SAAAA,GAAY,GAGlB,G,CAEQw1C,uBACN,OAAO,EAAAa,EAAA,GAAkBzsE,KAAKkzC,iBAAiBjwC,OAAO,EAAAypE,EAAA,GAAU,cAClE,CAEOtE,QAAQpgE,EAAgBiL,G,MAC1BjT,KAAKgI,SAAWA,GAAUhI,KAAKiT,WAAaA,IAEtC,QAAT,EAAAjT,KAAKq2B,YAAI,oBAETr2B,KAAKgI,OAASA,EACdhI,KAAKiT,SAAWA,EAEhBjT,KAAKkzC,iBAAiBppC,QACtB9J,KAAKyrE,SAAU,EACjB,CAEOlB,kCAC6BtmE,IAA/BjE,KAAKmsE,wBACN14D,aAAazT,KAAKmsE,uBAClBnsE,KAAKmsE,2BAAwBloE,EAEjC,CAEOF,U,MACL/D,KAAKgI,OAAShI,KAAKiT,cAAWhP,EAC9BjE,KAAKuqE,6BACLoC,cAAc3sE,KAAKiqE,uBACP,QAAZ,EAAAjqE,KAAK6mE,eAAO,SAAEnrD,UACd1b,KAAKkzC,iBAAiBnvC,SACxB,E,uKChqBa,SAAe6oE,EAC5B5kE,EACAkvB,EACA21C,EACAC,EACAC,G,qCAEA,MAAM7jD,EAA0B,GAC1BkX,QAA0B5e,EAAA,mCAA2CxZ,GAS3E,GARIo4B,EAAsB3yB,OAAOu/D,WAAaH,GAC5C3jD,EAAS7mB,KCzBE,WACb,MAAMu2B,EAAOvtB,SAASC,cAAc,QACpCstB,EAAKrlB,UAAUxS,IAAI,gBAAiB,SAEpC,MACMgtC,EAAM1iC,SAAS6e,gBAAgB,6BAA8B,OACnE6jB,EAAI5jB,eAAe,KAAM,UAAW,aACpC4jB,EAAI5jB,eAAe,KAAM,QAAS,MAClC4jB,EAAI5jB,eAAe,KAAM,SAAU,MACnC4jB,EAAIx6B,UAAUxS,IAAI,qBAElB,MAAMypB,EAAMnf,SAAS6e,gBAAgB,6BAA8B,OACnEM,EAAIL,eAAe,KAAM,OAAQ,6BACjCK,EAAIjX,UAAUxS,IAAI,4BAElB,MAAMksE,EAAO5hE,SAAS6e,gBAAgB,6BAA8B,OASpE,OARA+iD,EAAK9iD,eAAe,KAAM,OAAQ,wBAClC8iD,EAAK15D,UAAUxS,IAAI,uBAGnBgtC,EAAIriC,OAAOuhE,EAAMziD,GAEjBoO,EAAKltB,OAAOqiC,GAELnV,CAIT,CDHkBs0C,KAGX9sC,EAAsB3yB,OAAO0/D,OAAS/sC,EAAmB3yB,OAAO2/D,MAAUN,GAC7E5jD,EAAS7mB,MAAK,EAAAy5D,EAAA,GAAkB17B,EAAmB3yB,OAAO2/D,OAGxDhtC,EAAmB3yB,OAAO4/D,UAAYN,EAAe,CACvD,MAAMO,EAAeltC,EAAmBmtC,aACrCD,GAAeA,EAAY19D,EA8B5BsZ,EAAS7mB,KEhEA,WACb,MAAMu2B,EAAOvtB,SAASC,cAAc,QAEpC,OADAstB,EAAKrlB,UAAUxS,IAAI,eAAgB,cAC5B63B,CACT,CF4DoB40C,G,CAIlB,OAAOtkD,CACT,E,6SGtCA,MAAMukD,EAA2C,IAAIC,QAErDlsD,EAAA,mBAA2B,mBAAmB,EAAExZ,SAAQiL,eACtD,IAAIghB,EAAQ,6BAA6BjsB,MACtCiL,IACDghB,GAAS,oBAAoBhhB,OAGdiG,MAAMC,KAAK9N,SAASoN,iBAAiBwb,IAC7ClvB,SAAS7C,IAChB,MAAM0qB,EAAY6gD,EAAQxqE,IAAIf,GAC9B0qB,SAAAA,EAAWsV,QAAQ,GACnB,IAGW,MAAMyrC,EAKnB5tE,YAAY2xB,GACV1xB,KAAKkC,QAAUmJ,SAASC,cAAc,QACtCtL,KAAKkC,QAAQqR,UAAUxS,IAAI,eAC3B,OAAaf,KAAKkC,SAElBlC,KAAK0xB,QAAU,CAAC,EAEbA,GACD1xB,KAAKkiC,OAAOxQ,GAGd+7C,EAAQ7pE,IAAI5D,KAAKkC,QAASlC,KAC5B,CAEO4tE,WAAWl8C,GAChB,GAAIA,EAAJ,EAIA,EAAAyG,EAAA,GAAWn4B,KAAK0xB,QAASA,GACzB,IAAI,MAAM1J,KAAK0J,EAAS,CAEtB,MAAMhlB,EAAQglB,EAAQ1J,GAED,iBAAZ,GAA0C,mBAAZ,IAErChoB,KAAKkC,QAAQ6nB,QAAQ/B,GAAKtb,EAAQ,IAAwB,kBAAZ,GAAyBA,EAAQA,GAAS,I,EAG9F,CAEQmhE,YAAYC,GACf9tE,KAAK8tE,WAAaA,IACnB9tE,KAAK8tE,SAAWA,EAChB9tE,KAAKkC,QAAQqR,UAAU1J,OAAO,aAAcikE,GAEhD,CAEa5rC,OAAOxQ,G,yDAClB1xB,KAAK4tE,WAAWl8C,GAEhB,IAYIo8C,EAZAC,EAAW/tE,KAAK0xB,QAAQq8C,SAC5B,QAAgB9pE,IAAb8pE,EAMD,YALiC9pE,IAA9BjE,KAAK0xB,QAAQs8C,eACdD,GAAW,EAAAC,EAAA,GAAaD,EAAU/tE,KAAK0xB,QAAQs8C,aAAchuE,KAAK0xB,QAAQs8C,oBAG5E,EAAA9vC,EAAA,GAAal+B,KAAKkC,SAAS,EAAAoqB,EAAA,GAAcyhD,IAIxB,QAAnB,KAAA/tE,KAAK0xB,SAAQ1pB,cAAM,UAANA,OAAW,MAGxB,MAAM,OAACA,EAAM,SAAEiL,GAAYjT,KAAK0xB,QAChC,GAAG1pB,IAAWwZ,EAAA,QAAmBxhB,KAAK0xB,QAAQrF,QAoD5C,EAAAQ,EAAA,GAAe7sB,KAAKkC,SAAS,QAAKlC,KAAK0xB,QAAQjiB,cAAgB,QAAU,sBApDrB,CACpD,GAAGwD,EAAU,CACX,MAAOg7D,EAAOpnC,SAAiBxhB,QAAQqH,IAAI,CACzClL,EAAA,wCAAgDxZ,EAAQiL,GACxDuO,EAAA,mCAA2CxZ,KAG7C,IAAIimE,GAASpnC,EAkBX,OAjBArlB,EAAA,4CAAoDxZ,EAAQiL,GAAU3E,MAAM4/D,IAC1E,IAAIA,GAAcluE,KAAK0xB,QAAQze,WAAaA,EAG1C,OAFAjT,KAAK0xB,QAAQze,cAAWhP,OACxBjE,KAAKkiC,OAAO,CAACjvB,cAAUhP,IAIzBjE,KAAKkiC,QAAQ,IACZ,KACEliC,KAAK0xB,QAAQze,WAAaA,IAC3BjT,KAAK0xB,QAAQze,cAAWhP,EACxBjE,KAAKkiC,OAAO,CAACjvB,cAAUhP,I,KAI3B,EAAAi6B,EAAA,GAAal+B,KAAKkC,SAAS,QAAK,iBAChClC,KAAK6tE,aAAY,E,CAKrB,MAAMM,EAAsBl7D,GAAYjT,KAAK0xB,QAAQ45C,UACnD9pD,EAAA,wCAAgDxZ,EAAQiL,GAAU3E,MAAM2/D,IAAS,MAAC,cAAc,OAAD,wBAA8B,QAAxB,EAAAjuE,KAAK0xB,QAAQ8hB,mBAAW,QAAI,CAAC,GAAE,CAAEy6B,UAAO,SAC7IhqE,GAEK8K,EAAOq/D,EAAOC,SAAmBhpD,QAAQqH,IAAI,EAClD,EAAA4hD,EAAA,GAAatuE,KAAK0xB,SACjB1xB,KAAK0xB,QAAQ45C,WAAasB,EAAmB5kE,EAAgC,QAAxB,EAAAhI,KAAK0xB,QAAQ8hB,mBAAW,SAAEtc,aAAiBl3B,KAAK0xB,QAAQ68C,iBAAmB3B,EAAmB5kE,EAAgC,QAAxB,EAAAhI,KAAK0xB,QAAQ8hB,mBAAW,SAAEtc,YAAY,GAAM,GACxMi3C,IAGF,IAAGC,aAAK,EAALA,EAAOvrE,SAAUwrE,EAAW,CAC7B,MAAMG,EAAQnjE,SAASC,cAAc,QACrCkjE,EAAMj7D,UAAUxS,IAAI,oBACpB+sE,GAAW,GACX,EAAA5vC,EAAA,GAAaswC,EAAOz/D,GAEpB,MAAM2uD,EAAWryD,SAASojE,yBAC1B/Q,EAAShyD,UAAU,CAAC2iE,EAAWG,KAAWJ,QAAAA,EAAS,IAAKr+C,OAAO+M,WAC/D,EAAAoB,EAAA,GAAal+B,KAAKkC,QAASw7D,E,MAE3B,EAAAx/B,EAAA,GAAal+B,KAAKkC,QAAS6M,E,CAM/B/O,KAAK6tE,YAAYC,E,2XClJN,MAAMY,UAAoB,IAgBvC3uE,YAAY2xB,EAEP,CAAC,GACJxf,MAAM,eAAgB,CAACy8D,UAAU,EAAMC,aAAa,IAd9C,KAAAjlD,MAAQ,IAAIC,MAIZ,KAAAilD,QAAU,CAChBC,KAAM,OACNC,eAAgB,QAUhB/uE,KAAKgvE,GAAK3jE,SAASC,cAAc,OACjC,QAAMtL,KAAKgvE,GAAI,sBAEfhvE,KAAKivE,SAAS17D,UAAU/Q,OAAO,YAE/BxC,KAAKsrD,OAAO5/C,OAAO1L,KAAKgvE,IAExBhvE,KAAKkvE,cAAgB7jE,SAASC,cAAc,OAC5CtL,KAAKkvE,cAAc37D,UAAUxS,IAAI,QACjCf,KAAKkvE,cAAcxjE,OAAO1L,KAAK2pB,OAE5B+H,EAAQmV,SACT7mC,KAAKkvE,cAAc37D,UAAUxS,IAAI,YAGnCf,KAAK40B,MAAQvpB,SAASC,cAAc,SACpCtL,KAAK40B,MAAMhzB,KAAO,OAClB5B,KAAK40B,MAAMrpB,MAAM4f,QAAU,OAC3BnrB,KAAK6R,eAAe9Q,IAAIf,KAAK40B,MAA7B50B,CAAoC,UAAW+H,IAC7C,MAAMonE,EAAOpnE,EAAE1H,OAAO+uE,MAAM,GACxBD,IAIJ,EAAAE,EAAA,GAAkBF,GAAM7gE,MAAMghE,IAC5BtvE,KAAK2pB,MAAQ,IAAIC,MACjB5pB,KAAKkvE,cAAcxjE,OAAO1L,KAAK2pB,OAC/B3pB,KAAK2pB,MAAMhnB,IAAM2sE,EAEjBtvE,KAAK2pB,MAAM4lD,OAAS,KAIlBvvE,KAAK6uB,OAEL7uB,KAAK6uE,QCjEf,SAAyBW,EAAiClsE,GACxD,IAAImsE,EACFrkE,EACAskE,EACAC,EAOK,CAAC,EAMNC,EAAW,EACXC,EAAU,EACVC,EAAY,EACZC,EAAa,EACbC,EAAc,EA8BhB,SAAS35C,IACPm5C,EAAcj8D,UAAUxS,IAAI,aAC5ByuE,EAAc1I,WAAY,EAE1B4I,EAAY,IAAI9lD,MAChB8lD,EAAU/sE,IAAM6sE,EAAc7sE,IAC9B+sE,EAAU5I,WAAY,EACtB4I,EAAUn8D,UAAUxS,IAAI,sBAEpBuC,IACFA,EAAS+H,SAASC,cAAc,WAGlCmkE,EAAgBpkE,SAASC,cAAc,OACvCmkE,EAAcl8D,UAAUxS,IAAI,kBAE5BqK,EAAYC,SAASC,cAAc,OACnCF,EAAUmI,UAAUxS,IAAI,gBAExB,MAAMkvE,EAAe5kE,SAASC,cAAc,OAC5C2kE,EAAa18D,UAAUxS,IAAI,sBAE3B0uE,EAAcj4D,YAAYpM,GACVokE,EAAcl4D,WACtBE,YAAYi4D,GACpBA,EAAcj4D,YAAYk4D,GAC1BD,EAAcj4D,YAAYg4D,GAC1BC,EAAcj4D,YAAYy4D,GAC1B7kE,EAAUoM,YAAYk4D,GAEtBA,EAAUnkE,MAAM+hB,SAAWkiD,EAActoD,MAAQ,KAEjD8oD,EAAcR,EAAcnmD,aAAemmD,EAAcpkC,YAEzD,MAAMtmB,EAAO0qD,EAAcpkC,YAAc,EAAI8kC,IACvClrD,EAAMwqD,EAAcW,aAAe,EAAIC,IAE7CC,EAzEY,IACC,KAyEbC,EAAgBxrD,EAAME,GACtB25B,EAAgB75B,EAAME,GA/CtB5Z,EAAUwC,iBAAiB,YAAa2iE,GAAa,GACrDnlE,EAAUwC,iBAAiB,aAAc2iE,GAAa,GACtDnlE,EAAUwC,iBAAiB,QAAS4iE,GAAU,GAE9CnlE,SAASuC,iBAAiB,WAAY6iE,GAAY,EA8CpD,CAEA,SAASJ,EAAenpD,EAAeI,GACrCwoD,EAAY5oD,EAAQ8oD,EACpBD,EAAazoD,EAAS0oD,EAEtB5kE,EAAUG,MAAM2b,MAAQA,EAAQ,KAChC9b,EAAUG,MAAM+b,OAASA,EAAS,IACpC,CAEA,SAASgpD,EAAgBxrD,EAAcE,GACrC6qD,EAAU7qD,EAAMgrD,EAChBJ,EAAW9qD,EAAOkrD,EAElBN,EAAUnkE,MAAMyZ,KAAOA,EAAM,KAC7B0qD,EAAUnkE,MAAMuZ,MAAQA,EAAO,IACjC,CAEA,SAAS65B,EAAgB75B,EAAcE,GACrC5Z,EAAUG,MAAMyZ,IAAMA,EAAM,KAC5B5Z,EAAUG,MAAMuZ,KAAOA,EAAO,IAChC,CAcA,SAAS4rD,EAAQ5xD,GACfA,EAAOA,EAAOtY,KAAK2gD,GAAK,EACxB,IAIEriC,EACAE,EACAD,EACAE,EAPE0rD,EAAWnqE,KAAKywC,MAAM7rC,EAAUkmD,YAAcxyC,GAChD8xD,EAAYpqE,KAAKywC,MAAM7rC,EAAUylE,aAAe/xD,GAChD1Q,EAAIshE,EAAUpe,YACdliD,EAAIsgE,EAAUmB,aAMbF,EA9HQ,IAgIDA,EAAWviE,IAIrB0W,EAAO1Z,EAAUic,WAAcvI,EAAO,EACtCkG,EAAM5Z,EAAU2U,UAAajB,EAAO,EACpCiG,EAAQD,EAAO6rD,EACf1rD,EAASD,EAAM4rD,EAEZ9rD,EAAO,IAAGA,EAAO,GACjBE,EAAM,IAAGA,EAAM,GAEfD,EAAQ3W,GACR6W,EAAS7V,IAEZihE,EAAeM,EAAUA,GACzBL,EAAgBxrD,EAAME,GACtB25B,EAAgB75B,EAAME,IAExB,CAEA,SAASyrD,EAAW1oE,GAGlB,OAFAA,EAAEwuB,iBAEKu6C,OAAOC,aAAahpE,EAAEipE,WAC3B,IAAK,IACHN,EA3JW,GA4JX,MACF,IAAK,IACHA,GA9JW,GAiKjB,CAEA,SAASF,EAASzoE,GAChBA,EAAEwuB,iBACFm6C,EAAQ3oE,EAAE+uC,OAAS,EAAI,GAAK,EAC9B,CAEA,SAASy5B,EAAYxoE,GACnBA,EAAEwuB,iBACFxuB,EAAEkpE,kBAjEJ,SAAwBlpE,GACtB4nE,EAAYuB,gBAAkB9lE,EAAUggC,YACxCukC,EAAYwB,iBAAmB/lE,EAAU+kE,aAEzCR,EAAYyB,eAAiBhmE,EAAUic,WACvCsoD,EAAY0B,cAAgBjmE,EAAU2U,UAEtC4vD,EAAY2B,SAAWvpE,EAAEg5D,SAAWh5D,EAAE0nC,OAAS1nC,EAAEypB,SAAWzpB,EAAEypB,QAAQ,GAAGuvC,SAAWrtD,OAAO69D,QAC3F5B,EAAY6B,SAAWzpE,EAAE0pE,SAAW1pE,EAAE2pE,OAAS3pE,EAAEypB,SAAWzpB,EAAEypB,QAAQ,GAAGigD,SAAW/9D,OAAOi+D,OAC7F,CA0DEC,CAAe7pE,GAEfsD,SAASuC,iBAAiB,YAAaikE,GACvCxmE,SAASuC,iBAAiB,YAAaikE,GACvCxmE,SAASuC,iBAAiB,UAAWkkE,GACrCzmE,SAASuC,iBAAiB,WAAYkkE,EACxC,CAEA,SAASA,EAAU/pE,GACjBA,EAAEwuB,iBAEFlrB,SAASqG,oBAAoB,UAAWogE,GACxCzmE,SAASqG,oBAAoB,WAAYogE,GACzCzmE,SAASqG,oBAAoB,YAAamgE,GAC1CxmE,SAASqG,oBAAoB,YAAamgE,EAC5C,CAEA,SAASA,EAAO9pE,GACd,IACE+c,EACAE,EACA5W,EACAgB,EAJE2iE,EAAe,CAACr1D,EAAG,EAAGC,EAAG,GAM7B5U,EAAEwuB,iBACFxuB,EAAEkpE,kBAEFc,EAAar1D,EAAI3U,EAAE0nC,OAAS1nC,EAAEypB,SAAWzpB,EAAEypB,QAAQ,GAAGie,MACtDsiC,EAAap1D,EAAI5U,EAAE2pE,OAAS3pE,EAAEypB,SAAWzpB,EAAEypB,QAAQ,GAAGkgD,MAEtD5sD,EAAOitD,EAAar1D,GAAKizD,EAAY2B,QAAU3B,EAAYyB,gBAC3DpsD,EAAM+sD,EAAap1D,GAAKgzD,EAAY6B,QAAU7B,EAAY0B,eAC1DjjE,EAAIhD,EAAUggC,YACdh8B,EAAIhE,EAAU+kE,aAEXrrD,EAAO,EAAGA,EAAO,EACZA,EAAO4qD,EAAUtkC,YAAch9B,IAAG0W,EAAO4qD,EAAUtkC,YAAch9B,GAEtE4W,EAAM,EAAGA,EAAM,EACVA,EAAM0qD,EAAUS,aAAe/gE,IAAG4V,EAAM0qD,EAAUS,aAAe/gE,GAEzEkhE,EAAgBxrD,EAAME,GACtB25B,EAAgB75B,EAAME,EAExB,CAeA,OA5NGwqD,EAAcwC,SAAU37C,IACtBm5C,EAAcD,OAASl5C,EA2NrB,CAACy4C,KAbR,WACExrE,EAAO4jB,MAAQ4oD,EACfxsE,EAAOgkB,OAASyoD,EAEJzsE,EAAO8lB,WAAW,MAC1BM,UAAU8lD,EACZI,EAAUC,EACVC,EAAWC,EACX,EAAG,EACHD,EAAWC,EAEf,EAEchB,eAzNd,WACE3jE,EAAUsG,oBAAoB,YAAa6+D,GAC3CnlE,EAAUsG,oBAAoB,aAAc6+D,GAC5CnlE,EAAUsG,oBAAoB,QAAS8+D,GAEvCnlE,SAASqG,oBAAoB,UAAWogE,GACxCzmE,SAASqG,oBAAoB,WAAYogE,GACzCzmE,SAASqG,oBAAoB,YAAamgE,GAC1CxmE,SAASqG,oBAAoB,YAAamgE,GAC1CxmE,SAASqG,oBAAoB,WAAY++D,GAEzChB,EAAcjtE,SACd4I,EAAU5I,SACVktE,EAAUltE,QACZ,EA4MF,CDnLyB,CAAgBxC,KAAK2pB,MAAO3pB,KAAKsD,QAChDtD,KAAK40B,MAAMloB,MAAQ,EAAE,CACtB,GACD,IACD,GAEH1M,KAAKiyE,WAAW52D,UAAY,oFAC5B,QAAiBrb,KAAKiyE,YAAY,KAChCjyE,KAAK6uE,QAAQC,OACb9uE,KAAKqW,OAELrW,KAAKsD,OAAO4uE,QAAQC,IAClBnyE,KAAKmyE,KAAOA,EACZnyE,KAAKoyE,eACLpyE,KAAKmO,SAAS,GACb,aAAc,EAAE,GAClB,CAAC0D,eAAgB7R,KAAK6R,iBAEzB7R,KAAKoL,UAAUM,OAAO1L,KAAKkvE,cAAelvE,KAAKiyE,WAAYjyE,KAAK40B,OAEhE50B,KAAK4N,iBAAiB,qBAAqB,KACzC5N,KAAK6uE,QAAQE,iBACV/uE,KAAK2pB,OACN3pB,KAAK2pB,MAAMnnB,Q,GAGjB,CAEQ2L,UACNnO,KAAKqyE,QAAO,IACH7iD,EAAA,SAA0BxvB,KAAKmyE,OAE1C,CAEOzjD,KAAK4jD,EAA+BD,GACzCryE,KAAKsD,OAASgvE,EACdtyE,KAAKqyE,OAASA,EAEdryE,KAAK40B,MAAM3f,OACb,CAEOm9D,eACL,MAAMG,EAAMvyE,KAAKsD,OAAO8lB,WAAW,MACnCmpD,EAAIz3B,UAAY,qBAChBy3B,EAAIx3B,SAAS,EAAG,EAAG/6C,KAAKsD,OAAO4jB,MAAOlnB,KAAKsD,OAAOgkB,OACpD,E,iFExGa,MAAMkrD,EACnBzyE,YACUiI,EAEA4/B,EACA6qC,EACAx/D,GAJA,KAAAjL,OAAAA,EAEA,KAAA4/B,SAAAA,EACA,KAAA6qC,SAAAA,EACA,KAAAx/D,SAAAA,EAERjT,KAAKmL,WACP,CAEcA,Y,qCACZ,IAAI,OAACnD,EAAM,SAAE4/B,EAAQ,SAAE6qC,EAAQ,SAAEx/D,GAAYjT,KAC7C,MAAM0yE,QAAyB,OAAc,CAAC1qE,SAAQiL,SAAUA,IAE1DhM,EAAW,kBACDhD,IAAb2jC,IACDA,QAAiB3gC,EAASqI,gBAAgBqjE,cAAc3qE,IAQ1D,MAAM4qE,EAAgB,CAACvpC,EAA4CwpC,EAAQpvB,KAAgBpa,EAAQxhC,QACjG,IAAI0G,EAAUtH,EAAS88B,gBAAgB+uC,MAAM9qE,EAAO+4B,YAEjD8xC,IACDtkE,EAAUA,EAAQD,MAAK,IACdrH,EAAS8G,mBAAmBglE,aAAa/qE,MAIpDyqE,SAAAA,EAAWlkE,EAAQ,EAGfykE,EAAkB3pC,IACtB,IAAI96B,EAEJ,GAAG0E,EACD1E,EAAUtH,EAAS8G,mBAAmBglE,aAAa/qE,GAAQ,GAAO,EAAMiL,QACnE,GAAGjL,EAAO66B,SACft0B,EAAUtH,EAAS8G,mBAAmBglE,aAAa/qE,GAAQ,EAAOy7C,IAAepa,EAAQxhC,UAAO5D,OAC3F,CACL,IAAGolC,EAAQxhC,KAGT,OAAO+qE,EAAcvpC,GAFrB96B,EAAUtH,EAAS88B,gBAAgB9iC,OAAO+G,EAAO+4B,W,CAMrD0xC,SAAAA,EAAWlkE,EAAQ,EAGrB,IAAIQ,EACFkkE,EACAj1C,EACAk1C,EACAr/D,EACA4vC,EACF,OAAO7b,GACL,IAAK,iBACuC3gC,EAAS88B,gBAAgB6C,UAAU5+B,EAAO+4B,WAAY,iBAC9FhyB,EAAQ,oBACRivB,EAAc,iCACdnqB,EAAU,CAAC,CACT6mD,QAAS,oBACTyY,UAAU,EACV/8C,SAAU48C,IAGZvvB,EAAa,CAAC,CACZzvC,KAAM,0BAGRjF,EAAQ,mBACRivB,EAAc,4BACdk1C,EAAkB,CAACR,GACnB7+D,EAAU,CAAC,CACT6mD,QAAS,eACTyY,UAAU,EACV/8C,SAAUw8C,KAId,MAeF,IAAK,OACH7jE,EAAQ,iBACRivB,EAAc,mCACdk1C,EAAkB,CAACR,GAEnB7+D,EAAU,CAAC,CACT6mD,QAAS,iBACTyY,UAAU,EACV/8C,SAAU48C,IAGZvvB,EAAa,CAAC,CACZzvC,KAAM,2BACNygC,SAAU,OACF,OAAc,CAACzsC,cAIzB,MAGF,IAAK,QACH+G,EAAQ,iBACRivB,EAAc,wCACdnqB,EAAU,CAAC,CACT6mD,QAAS,iBACTyY,UAAU,EACV/8C,SAAU48C,IAGZ,MAGF,IAAK,YACL,IAAK,QACA//D,GACDlE,EAAQ,eACRkkE,EAAY,CAAC,GACbj1C,EAAc,sBACdk1C,EAAkB,CAACR,GACnB7+D,EAAU,CAAC,CACT6mD,QAAS,SACTyY,UAAU,EACV/8C,SAAU48C,YAEmC/rE,EAAS88B,gBAAgB6C,UAAU5+B,EAAO+4B,WAAY,iBACrGhyB,EAAQ,iBACRivB,EAAc,0BACdnqB,EAAU,CAAC,CACT6mD,QAAS,iBACTyY,UAAU,EACV/8C,SAAU48C,IAGZvvB,EAAa,CAAC,CACZzvC,KAAM,mCAGRjF,EAAQ,gBACRivB,EAAc,8BACdk1C,EAAkB,CAACR,GACnB7+D,EAAU,CAAC,CACT6mD,QAAS,iBACTyY,UAAU,EACV/8C,SAAWqtB,GAAemvB,EAAcnvB,GAAY,MAQ5D,IAAI,IAAU,oBAAqB,CACjCz7C,SACAiL,WACAunD,aAAczrD,EACdqkE,cAAeH,EACfxY,mBAAoBz8B,EACpBq1C,oBAAqBH,EACrBr/D,UACA4vC,eACC50B,MACL,E,+rBCpLa,MAAMykD,EACnBvzE,YACUiI,EACA8jC,EACAlqC,EACA2xE,EACAtgE,GAJA,KAAAjL,OAAAA,EACA,KAAA8jC,KAAAA,EACA,KAAAlqC,KAAAA,EACA,KAAA2xE,UAAAA,EACA,KAAAtgE,SAAAA,EAERjT,KAAKmL,WACP,CAEcA,Y,yCACZ,IAAI,OAACnD,EAAM,KAAE8jC,EAAI,KAAElqC,EAAI,UAAE2xE,EAAS,SAAEtgE,GAAYjT,KAEhD,MAAM0yE,QAAyB,OAAc,CAAC1qE,SAAQiL,aAEhDhM,EAAW,aAEjB6kC,EAAOA,EAAKhc,QACZ,MAAMsG,EAAW,CAACiT,EAA4CmqC,KAC5DD,GAAaA,IACD,cAAT3xE,EACDqF,EAAS8G,mBAAmB0lE,wBAAwBzrE,EAAQ8jC,GAE5D7kC,EAAS8G,mBAAmB2lE,eAAe1rE,EAAQ8jC,IAAQzC,EAAQxhC,MAAQ2rE,E,EAIzE3/D,EAAuC,CAAC,CAC5C6mD,QAAS,SACTyY,UAAU,EACV/8C,aAEIqtB,EAA6C,GACnD,IAAI10C,EAAoBkkE,EAAkBj1C,EAA0Bk1C,EAcpE,GAbmB,IAAhBpnC,EAAKjpC,OACNkM,EAAQ,6BAERA,EAAQ,sBACRkkE,EAAY,EAAC,QAAK,WAAY,CAACnnC,EAAKjpC,WAIpCm7B,SADO/2B,EAASqI,gBAAgBqkE,YAAY3rE,IACd,IAAhB8jC,EAAKjpC,OAAe,oCAAsC,kCAE1C,IAAhBipC,EAAKjpC,OAAe,gCAAkC,8BAGnEmF,IAAW,UAA2B,cAATpG,QAG9B,GAAGoG,EAAO66B,SACR4gB,EAAWphD,KAAK,CACd2R,KAAM,2BACNygC,SAAU,CAACi+B,SAER,CACL,MAAMlyB,QAAav5C,EAAS88B,gBAAgBgoC,QAAQ/jE,EAAO+4B,YAErD6yC,GAAa,OAAUpzB,EAAM,mBACnC,GAAc,SAAXA,EAAK5wC,EAAc,CACpB,MAAMikE,EAAYD,EAAa9nC,EAAKhc,cAAgB,OAAYgc,GAAY7jC,GAAQ,EAAD,gCAEjF,aADsBhB,EAAS8G,mBAAmByE,iBAAiBxK,EAAQC,IAC5D6F,SAAW,QAC5B,MAEG+lE,EAAUhxE,SACRgxE,EAAUhxE,SAAWipC,EAAKjpC,OAC3B4gD,EAAWphD,KAAK,CACd2R,KAAM,kBAGRyvC,EAAWphD,KAAK,CACd2R,KAAM,yBAGRgqB,EAAc,0BACdk1C,EAAkB,EAAC,QAAK,WAAY,CAACW,EAAUhxE,W,MAKnDgR,EAAQ,GAAGuiB,SAAYiT,GAAYjT,EAASiT,GAAS,E,EAK3D,OAAgBx1B,GAEF,IAAI,IAAU,oBAAqB,CAC/C7L,SACAiL,WACAunD,aAAczrD,EACdqkE,cAAeH,EACfxY,mBAAoBz8B,EACpBq1C,oBAAqBH,EACrBr/D,UACA4vC,eAGI50B,MACR,G,6FCzGa,MAAMilD,UAAqB,IACxC/zE,YACEg0E,EACAtB,GAEAvgE,MAAM,CACJ8hE,UAAW,CAAC,UAAW,YACvBvB,UAAWsB,GAActB,EAAWA,EAAiBzqE,IAAW,O,EAAD,K,OAAA,E,EAAA,YAC7D,GAAGyqE,EAAU,CACX,MAAMz9C,EAAMy9C,EAASzqE,GAClBgtB,aAAe3P,gBACV2P,E,CAIV,GAAGhtB,IAAW,SAed,kBAA0B,CAACA,WAC3B,oCAA4C+rE,OAhB5C,CACE,IAAI9+C,EAAQ,EACZ,IAAI,MAAMmrB,KAAc2zB,EAAY,CAClC,MAAMjoC,EAAOioC,EAAW3zB,GACxBnrB,GAAS6W,EAAKjpC,OACd7C,KAAKiH,SAAS8G,mBAAmBkmE,gBAAgBjsE,EAAQo4C,EAAW3pB,WAAYqV,E,EAGlF,QAAS,CACPpc,YAAauF,EAAQ,EAAI,6BAA+B,6B,CAQ9D,E,YAzB+D,K,6QAyB9D,EACD1xB,YAAa,uCACb2mC,iBAAkB,gBAClBlC,aAAc,gBAElB,E,qOCKF,MAAMksC,EAAoB7oE,SAASI,KACnC,IAAI0oE,EAAgBD,EAEpB,MAAME,EAAqB,KACzBD,GAAgB,WAA0BD,EAC1CG,EAAaC,UAAU,GAGzB,QAAsBJ,EAAmBE,GAO1B,MAAMC,UAA4D,IAgC/Et0E,YAAYsb,EAAmBqW,EAAwB,CAAC,GAgEtD,GA/DAxf,OAAM,GA7BE,KAAAhQ,QAAUmJ,SAASC,cAAc,OACjC,KAAAF,UAAYC,SAASC,cAAc,OACnC,KAAAggD,OAASjgD,SAASC,cAAc,OAChC,KAAAyD,MAAQ1D,SAASC,cAAc,OAM/B,KAAA+lB,SAA0B,KAAM,EA8LnC,KAAAhb,KAAO,KACZ,eAAmCrW,KAAKulB,eAAe,EA1KvDvlB,KAAKkC,QAAQqR,UAAUxS,IAAI,SAC3Bf,KAAKkC,QAAQmZ,UAAY,SAAWA,EAAY,IAAMA,EAAY,IAClErb,KAAKoL,UAAUmI,UAAUxS,IAAI,kBAAmB,aAEhDf,KAAKsrD,OAAO/3C,UAAUxS,IAAI,iBAEvB2wB,EAAQ3iB,OAAS2iB,EAAQ6iD,YAC1Bv0E,KAAK+O,MAAMwE,UAAUxS,IAAI,eACI,iBAAnB2wB,EAAa,OACrB,QAAM1xB,KAAK+O,MAAO2iB,EAAQ3iB,OAClB2iB,EAAQ6iD,UAChBv0E,KAAK+O,MAAMrD,QAAO,OAAcgmB,EAAQ6iD,WAG1Cv0E,KAAKsrD,OAAO5/C,OAAO1L,KAAK+O,QAG1B/O,KAAKkzC,kBAAmB,SACxBlzC,KAAK6R,eAAiB,IAAI,IAC1B7R,KAAKiH,SAAWotE,EAAaG,SAE7Bx0E,KAAKy0E,8BAAgC/iD,EAAQ+iD,8BAE1C/iD,EAAQi9C,WACT3uE,KAAKivE,SAAW5jE,SAASC,cAAc,QACvCtL,KAAKivE,SAAS17D,UAAUxS,IAAI,WAAY,cAAe,eAEvDf,KAAKsrD,OAAOtzC,QAAQhY,KAAKivE,WAEzB,QAAiBjvE,KAAKivE,SAAUjvE,KAAKqW,KAAM,CAACxE,eAAgB7R,KAAK6R,eAAgB5D,MAAM,KAGzFjO,KAAK00E,eAAiBhjD,EAAQgjD,eAC3B10E,KAAK00E,gBACN10E,KAAKkC,QAAQqR,UAAUxS,IAAI,cAG1B2wB,EAAQijD,kBACT,QAAiB30E,KAAKkC,SAAU6F,KAC1B,OAAgBA,EAAE1H,OAAQ,oBAC5BL,KAAKqW,M,GAEN,CAACxE,eAAgB7R,KAAK6R,iBAGxB6f,EAAQk9C,cACT5uE,KAAKiyE,WAAa5mE,SAASC,cAAc,UACzCtL,KAAKiyE,WAAW1+D,UAAUxS,IAAI,cAAe,sBAClB,IAAxB2wB,EAAQk9C,aACT5uE,KAAKiyE,WAAWvmE,QAAO,QAAKgmB,EAAQk9C,cAEtC5uE,KAAKsrD,OAAO5/C,OAAO1L,KAAKiyE,aACxB,OAAOjyE,KAAKiyE,aAGdjyE,KAAKoL,UAAUM,OAAO1L,KAAKsrD,QACxB55B,EAAQjmB,OACTzL,KAAKyL,KAAOJ,SAASC,cAAc,OACnCtL,KAAKyL,KAAK8H,UAAUxS,IAAI,cACxBf,KAAKoL,UAAUM,OAAO1L,KAAKyL,OAG1BimB,EAAQyC,WAAY,CACrB,MAAMA,EAAan0B,KAAKm0B,WAAa,IAAI,KAAWn0B,KAAKyL,MACzDzL,KAAK40E,4BAED50E,KAAKyL,MACPzL,KAAKoL,UAAUmM,aAAa4c,EAAW/oB,UAAWpL,KAAKsrD,OAAO8T,Y,CAIlE,IAAIyV,EAAoB70E,KAAKiyE,WAC7B,MAAMp+D,EAAU7T,KAAK6T,QAAU6d,EAAQ7d,QACvC,GAAGA,aAAO,EAAPA,EAAShR,OAAQ,CAClB,MAAMwf,EAAariB,KAAK80E,UAAYzpE,SAASC,cAAc,OAC3D+W,EAAW9O,UAAUxS,IAAI,iBAEzB,MAAMg0E,EAAkBlhE,EAAQiH,KAAKmV,IACnC,MAAM3Z,EAASjL,SAASC,cAAc,UAkBtC,OAjBAgL,EAAO+E,UAAY,OAAS4U,EAAEkjD,SAAW,UAAY,YAEjDljD,EAAE1N,WACJ,OAAOjM,GAGN2Z,EAAEjc,KACHsC,EAAOsC,YAAeqX,EAAEjc,KAExBsC,EAAO5K,QAAO,QAAKukB,EAAEyqC,QAASzqC,EAAE+kD,YAGlC,QAAiB1+D,GAAQ,K,MACb,QAAV,EAAA2Z,EAAEmG,gBAAQ,iBACVp2B,KAAK+D,SAAS,GACb,CAAC8N,eAAgB7R,KAAK6R,eAAgB5D,MAAM,IAExCgiB,EAAE/tB,QAAUoU,CAAM,IAG3B,IAAIu+D,GAAwC,IAAnBhhE,EAAQhR,OAAc,CAC7C,MAAMyT,EAASzC,EAAQnT,MAAM4V,IAAYA,EAAOqtC,WAC7CrtC,IACDu+D,EAAoBv+D,EAAOpU,Q,CAI/BmgB,EAAW3W,UAAUqpE,GACrB/0E,KAAKoL,UAAUM,OAAO2W,E,CAGxBriB,KAAK60E,kBAAoBA,EAEzB70E,KAAKkC,QAAQwJ,OAAO1L,KAAKoL,WAEzBipE,EAAaY,OAAO5yE,KAAKrC,KAC3B,CAEU40E,0BAA0BM,GAClC,OAAOl1E,KAAKm0B,WAAWghD,sBAAsBD,EAC/C,CAEUE,kBACLp1E,KAAKm0B,YACNn0B,KAAKm0B,WAAWxgB,oBAEpB,CAEOkb,OACL7uB,KAAKulB,eAAiB,CACpB3jB,KAAM,QACNurB,MAAO,IAAMntB,KAAK+D,UAClBstB,SAAUrxB,KAAKqxB,UAGjB,aAAiCrxB,KAAKulB,iBAEtC,SACA4uD,EAAczoE,OAAO1L,KAAKkC,SACrBlC,KAAKkC,QAAQkpC,YAClBprC,KAAKkC,QAAQqR,UAAUxS,IAAI,UAE3Bf,KAAKo1E,kBAEDp1E,KAAK00E,iBACP,qBAAiC,EACjC,sBAAsC,IAKxChyE,YAAW,KACL1C,KAAKkC,QAAQqR,UAAUqB,SAAS,WAIpC5U,KAAK6R,eAAe9Q,IAAIsK,SAASI,KAAjCzL,CAAuC,WAAY+H,IAC9CssE,EAAaY,OAAOZ,EAAaY,OAAOpyE,OAAS,KAAO7C,OAIxDA,KAAKy0E,+BAAgC,OAAsB1sE,GAAe,UAAVA,EAAEyE,QACnE,QAAmBxM,KAAK60E,oBACxB,OAAY9sE,G,GAEd,GACD,EAEL,CAMUhE,UACR/D,KAAKoJ,cAA8B,SACnCpJ,KAAKkC,QAAQqR,UAAUxS,IAAI,UAC3Bf,KAAKkC,QAAQqR,UAAU/Q,OAAO,UAC9BxC,KAAK6R,eAAeC,YACpB9R,KAAKkzC,iBAAiBnvC,UAElB/D,KAAK00E,iBACP,qBAAiC,GAGnC,eAAmC10E,KAAKulB,gBACxCvlB,KAAKulB,oBAAiBthB,GAEtB,OAAiBowE,EAAaY,OAAQj1E,MAGtCo0E,IAEA1xE,YAAW,K,MACT1C,KAAKkC,QAAQM,SACbxC,KAAKoJ,cAA8B,qBACnCpJ,KAAK0b,UACU,QAAf,EAAA1b,KAAKm0B,kBAAU,SAAEpwB,UAEb/D,KAAK00E,gBACP,sBAAsC,E,GAEvC,IACL,CAEOj+D,kBACLzW,KAAKi1E,OAAOlwE,SAASswE,IACnB,MAAM,QAACnzE,EAAO,UAAEkJ,GAAaiqE,EACvBp8D,EAAgB/W,EAAQ+W,cAC3BA,GAAiBA,IAAkBk7D,GAAiBA,IAAkB/oE,GACvE+oE,EAAczoE,OAAOxJ,E,GAG3B,CAEOuU,iBAAyC6+D,GAC9C,OAAOt1E,KAAKi1E,OAAOllD,QAAQ7tB,GAAYA,aAAmBozE,GAC5D,CAEO7+D,mBAAiE8+D,KAA+B5c,GAErG,OADc,IAAI4c,KAAQ5c,EAE5B,EA9Pe,EAAAsc,OAA8B,GAiQxC,MAAMO,EAAmB3hE,IACfA,EAAQnT,MAAMuvB,GAAMA,EAAE0zB,YAEnC9vC,EAAQxR,KAAK,CACXq4D,QAAS,SACT/W,UAAU,IAIP9vC,E,qGClUT,MAAMY,EAMD,CACHghE,IAAK,CACH1mE,MAAO,eACPivB,YAAa,yBACb03C,mBAAoB,gCACpBC,kBAAmB,+BACnB5hE,KAAM,aAER6hE,QAAS,CACP7mE,MAAO,eACPivB,YAAa,sBACb03C,mBAAoB,6BACpBC,kBAAmB,4BACnB5hE,KAAM,kBAIV,MAAM8hE,UAAU,IACd91E,YAAY2xB,EAITokD,GACD5jE,MAAM,cAAe,CACnB2B,aAA+B5P,IAAtBytB,EAAQypC,UAA0B,CAAC,CAC1CT,QAAS,kBACT/W,UAAU,IACNjyB,EAAQypC,UAAY,CAAC,CACzBT,QAAS,KACT/W,UAAU,IACP,CAAC,CACJ+W,QAAS,gBACTtkC,SAAU,KACR,qBAA6B,EAE/B7T,UAAU,GACT,CACDm4C,QAAS,SACT/W,UAAU,IAEZ8W,wBAA0Cx2D,IAAtBytB,EAAQypC,UAA0B2a,EAAGH,kBAAqBjkD,EAAQypC,UAAY2a,EAAGJ,mBAAqBI,EAAG93C,YAC7Hq1C,oBAAqB3hD,EAAQypC,UAAY,CAACzpC,EAAQqkD,cAAgB,CAACrkD,EAAQqD,MAAOrD,EAAQqkD,cAC1Fvb,aAAcsb,EAAG/mE,QAGnB,MAAMinE,OAAiC/xE,IAAtBytB,EAAQypC,UACzB,GAAG6a,EACDh2E,KAAKkC,QAAQqR,UAAUxS,IAAI,kBACtB,GAAG2wB,EAAQypC,UAChBn7D,KAAKkC,QAAQqR,UAAUxS,IAAI,kBACtB,CACL,MAAMuV,EAAStW,KAAK6T,QAAQnT,MAAMuvB,IAAOA,EAAE0zB,WAC3CrtC,EAAOpU,QAAQqR,UAAUxS,IAAI,sBAC7B,MAAMinB,EAAI3c,SAASC,cAAc,KACjC0c,EAAEzU,UAAUxS,IAAI,0BAA2B,wBAC3CuV,EAAOpU,QAAQwJ,OAAOsc,E,CAGxB,MAAMiuD,EAAiB5qE,SAASC,cAAc,OAC9C2qE,EAAe1iE,UAAUxS,IAAI,oBAE7B,MAAMm1E,EAAO7qE,SAASC,cAAc,OACpC4qE,EAAK3iE,UAAUxS,IAAI,oBACnB,MAAMinB,EAAI3c,SAASC,cAAc,QAMjC,GALA0c,EAAEzU,UAAUxS,IAAI,wBAAyB,SAAW+0E,EAAG/hE,MACvDmiE,EAAKxqE,OAAOsc,EAAG,IAAM0J,EAAQypC,UAAYzpC,EAAQqkD,aAAerkD,EAAQqD,QAExEkhD,EAAevqE,OAAOwqE,IAElBF,EAAU,CACZ,MAAMjhD,EAAQ1pB,SAASC,cAAc,OACrCypB,EAAMxhB,UAAUxS,IAAI,cAEpB,MAAMo1E,EAAO9qE,SAASC,cAAc,OACpC6qE,EAAK5iE,UAAUxS,IAAI,mBAEnB,MAAMssE,EAAUhiE,SAASC,cAAc,OACvC+hE,EAAQ95D,UAAUxS,IAAI,sBAEtBg0B,EAAMrpB,OAAOyqE,EAAM9I,IAEnB,QAAM8I,EAAM,aACZ9I,EAAQ3hE,QAAO,QAAK,gBAAiB,GAAKgmB,EAAQqkD,cAElDE,EAAevqE,OAAOqpB,E,CAGxB/0B,KAAKoL,UAAUmM,aAAa0+D,EAAgBj2E,KAAKg+B,aAMjD,MAAMo4C,EAAgB,KACpBF,EAAK3iE,UAAUxS,IAAI,SAAS,EAG3B,gCACD,UAAYuN,KAAK8nE,GAEjBA,GAEJ,EAGa,SAAeC,EAAez0E,G,2UAC3C,MAAMk0E,EAAKrhE,EAAE7S,IACN00E,EAAWvhD,EAAOghD,SAAsB1wD,QAAQqH,IAAI,CACzD,0CACG,EAAC,GAAO,GAAM5R,KAAKiQ,GAAM,iCAAuCnpB,EAAMmpB,OAErEirD,EAAWM,EAAUC,yBAC3B,IAAIV,EAAE,CACJ1a,UAAW6a,OAAW/xE,EAAY,YAClC8wB,QACAghD,gBACCD,GAAIjnD,MACT,G,4FC5HA,MACM2nD,EAAiF,CAAC,CACtF9pE,MAFe,KAGfgjB,YAAa,uBACZ,CACDhjB,MAAO+pE,MACP/mD,YAAa,wBACZ,CACDhjB,MAAO+pE,MACP/mD,YAAa,wBACZ,CACDhjB,MAAO+pE,MACP/mD,YAAa,sBACZ,CACDhjB,MAAO+pE,OACP/mD,YAAa,uBACZ,CACDhjB,OAAQ,EACRgjB,YAAa,wBACb2Z,SAAS,IAGI,MAAMqtC,UAAkB,IACrC32E,YAAYiI,EAAgBiL,GAa1B,IAAI0jE,EAZJzkE,MAAM,aAAc,CAClBlK,SACAwyD,aAAc,gBACd3mD,QAAS,CAAC,CACR6mD,QAAS,wBACTtkC,SAAU,KACRp2B,KAAKiH,SAAS8G,mBAAmB6oE,SAAS,CAAC5uE,SAAQ6uE,WAAqB,IAAVF,EAAc,MAAa,QAAM,GAAQA,EAAM1jE,YAAU,IAG3HxH,MAAM,IAIR,MAAMqrE,GAAY,QAAoBN,GAAQ9pE,IAC5CiqE,GAAQjqE,CAAK,IAGf1M,KAAKyL,KAAKC,OAAOorE,GAEjB92E,KAAK6uB,MACP,E,oGC1Ba,MAAMkoD,UAAkB,IAGrCh3E,YAAoBsb,EAAmBqW,EAA4B,CAAC,GAQlE,GAPAxf,MAAM,cAAgBmJ,EAAY,IAAMA,EAAY,IAAK,OAAF,sBACrDs5D,iBAAiB,GACdjjD,GAAO,CACV3iB,OAAO,EACP8E,QAAS6d,EAAQ7d,UAAW,OAAgB6d,EAAQ7d,YALpC,KAAAwH,UAAAA,EAQfqW,EAAQ1pB,OAAQ,CACjB,MAAMma,EAAW,IAAI,IACrBA,EAAS5O,UAAUxS,IAAI,aACvBohB,EAASwK,kBAAkB,CACzBue,UAAU,EACVljC,OAAQ0pB,EAAQ1pB,OAChBiL,SAAUye,EAAQze,SAClBugC,YAAa,CACXtc,WAAYl3B,KAAKkzC,iBAAiBjwC,SAGtCjD,KAAKsrD,OAAOtzC,QAAQmK,E,CAGlBuP,EAAQslD,UACPtlD,EAAQ8oC,eAAiB9oC,EAAQ3iB,MAAO/O,KAAK+O,MAAMrD,QAAO,QAAKgmB,EAAQ8oC,cAAgB,UAAW9oC,EAAQ0hD,gBACrG1hD,EAAQ3iB,iBAAiBvL,YAC/BxD,KAAK+O,MAAMrD,OAAOgmB,EAAQ3iB,OACrB/O,KAAK+O,MAAMwvB,UAAY7M,EAAQ3iB,OAAS,IAGjD,MAAM2uD,EAAWryD,SAASojE,yBAE1B,GAAG/8C,EAAQ+oC,oBAAsB/oC,EAAQsM,YAAa,CACpD,MAAMr9B,EAAIX,KAAKg+B,YAAc3yB,SAASC,cAAc,KACpD3K,EAAE4S,UAAUxS,IAAI,qBACb2wB,EAAQ+oC,mBAAoB95D,EAAE+K,QAAO,QAAKgmB,EAAQ+oC,mBAAoB/oC,EAAQ2hD,sBACzE3hD,EAAQsM,cAAa,OAAar9B,EAAG+wB,EAAQsM,aAErD0/B,EAAShyD,OAAO/K,E,CAGf+wB,EAAQ+xB,aACTzjD,KAAKoL,UAAUmI,UAAUxS,IAAI,iBAE7B2wB,EAAQ+xB,WAAW1+C,SAASkyE,IAC1BA,EAAEn0B,YAAa,EACf,MAAM9X,EAAgB,IAAI,IAAcisC,GACxCA,EAAEjsC,cAAgBA,EAClB0yB,EAAShyD,OAAOs/B,EAAcC,MAAM,IAGtCvZ,EAAQ7d,QAAQ9O,SAASuR,IACvB,GAAGA,EAAO8f,SAAU,CAClB,MAAM8gD,EAAW5gE,EAAO8f,SACxB9f,EAAO8f,SAAW,KAChB,MAAMoP,EAAsB,IAAIpkC,IAChCswB,EAAQ+xB,WAAW1+C,SAASkyE,IACvBA,EAAEjsC,cAAc3B,SACjB7D,EAAEzkC,IAAIk2E,EAAEjjE,K,IAGZkjE,EAAS1xC,EAAE,C,MAMnBxlC,KAAKoL,UAAUmM,aAAammD,EAAU19D,KAAKsrD,OAAO6rB,mBACpD,E,iFCzFa,MAAMC,UAAsB,IAGzCr3E,YAAY2xB,GAQVxf,MAAM,gBAAiB,CAACy8D,UAAU,EAAMgG,iBAAiB,EAAMlpE,MAAM,EAAMsD,OAAO,IAElF/O,KAAK+oB,SAAW,IAAI,IAAe,CACjCwgB,SAAUvpC,KAAKyL,KACf6oB,SAAU,KAAW,O,EAAD,K,OAAA,E,EAAA,YAClB,MAAMmT,EAAWznC,KAAK+oB,SAASsiB,cACzBrjC,EAASy/B,EAASA,EAAS5kC,OAAS,GAAG4zB,WAE7C,GAAG/E,EAAQ+gD,SAAU,CACnB,MAAMz9C,EAAMtD,EAAQ+gD,SAASzqE,GAC7B,GAAGgtB,aAAe3P,QAChB,UACQ2P,C,CACN,MAAMxvB,GACN,M,EAKNxF,KAAK+oB,SAAW,KAChB/oB,KAAKqW,MACP,E,YAjBoB,K,6QAiBnB,EACDuxB,SAAUlW,EAAQsiD,UAClBvqC,cAAe,KACbzpC,KAAK6uB,OACL7uB,KAAK+oB,SAAS8b,mBAEV,KACF7kC,KAAK+oB,SAAS6L,MAAMC,O,EAGxBqV,iBAAkBxY,EAAQwY,iBAC1BrC,aAAa,EACbtE,eAAe,EACfnO,WAAY,aACZptB,OAAQ0pB,EAAQ1pB,OAChBzE,YAAamuB,EAAQnuB,YACrBykC,aAActW,EAAQsW,aACtB/gC,SAAUjH,KAAKiH,WAGjBjH,KAAKm0B,WAAan0B,KAAK+oB,SAASoL,WAChCn0B,KAAK40E,4BAIL50E,KAAK+O,MAAMrD,OAAO1L,KAAK+oB,SAAS6L,MAClC,E,6DC7Da,MAAMyiD,UAAqB,IACxCt3E,YAAYiI,EAAgB8jC,EAAgBynC,GAC1CrhE,MAAM,oBAAqB,CACzBnD,MAAO,eAAe+8B,EAAKjpC,OAAS,EAAI,IAAM,SAC9Cm7B,YAAa8N,EAAKjpC,OAAS,EAAI,QAAUipC,EAAKjpC,OAAS,iBAAmB,oBAC1EgR,QAAS,CAAC,CACR6mD,QAAS,OACTtkC,SAAU,KACRm9C,GAAaA,IACbvzE,KAAKiH,SAAS8G,mBAAmBupE,sBAAsBtvE,EAAQ8jC,EAAK,MAK1E9rC,KAAK6uB,MACP,E,mjBCQF,MAAM0oD,EAAsC,iBAE7B,MAAMC,UAAsB,IAOzCz3E,YACU03E,EACAC,GAERxlE,MAAM,iBAAkB,CAACy8D,UAAU,EAAMgG,iBAAiB,EAAMlpE,MAAM,EAAM0oB,YAAY,EAAMplB,OAAO,IAH7F,KAAA0oE,gBAAAA,EACA,KAAAC,SAAAA,EA4EF,KAAAC,gBAAwB5vE,GAAkB,EAAD,gCAC/C,MAAM1H,GAAS,OAAgB0H,EAAE1H,OAAQ,uBACzC,IAAIA,EAAQ,OAEZ,MAAM+G,EAAQ/G,EAAO0pB,QAAQ3iB,aACpB,wCAAgDA,KACvDpH,KAAKqW,MAET,IAhFErW,KAAK+O,MAAMrD,QAAO,QAAK,YACvB1L,KAAK43E,YAAc,CAAC,EAEpB,uBAAoC,SAAS,GAC7C53E,KAAK4N,iBAAiB,SAAS,KAC7B,uBAAoC,SAAS,GAC7C,6BAA8C,IAGhD5N,KAAKupC,SAAWvpC,KAAKm0B,WAAW/oB,UAEhCpL,KAAKupC,SAASh2B,UAAUxS,IAAI,eAC5B,OAAaf,KAAKupC,UAAU,GAE5BvpC,KAAK63E,eAAiBxsE,SAASC,cAAc,OAC7CtL,KAAK63E,eAAetkE,UAAUxS,IAAI,sBAElC,MAAMiY,GAAM,OAAO,oDAAqD,CAACuJ,UAAU,EAAMvO,KAAM,YAC/FhU,KAAK63E,eAAensE,OAAOsN,GAE3BhZ,KAAKyL,KAAKC,OAAO1L,KAAK63E,iBAEtB,OAA6B,CAACntB,SAAU1qD,KAAKupC,SAAU13B,eAAgB7R,KAAK6R,iBAE5E,MAAMimE,EAAsBl0E,IAC1B,MAAMmF,EAAM/I,KAAK20D,KAAK3rD,WAAW+uE,GAASA,EAAKnwE,KAAOhE,EAAIgE,KAC1D,IAAY,IAATmB,EACD,OAGF/I,KAAK20D,KAAK5rD,GAAOnF,EACjB,MAAMg0E,EAAc53E,KAAK43E,YAAYh0E,EAAIgE,IACzCgwE,SAAAA,IAAgBh0E,EAAIsnD,gBACpBlrD,KAAKg4E,cAAc,EAGrBh4E,KAAK6R,eAAe9Q,IAAI,IAAxBf,CAAmC,qBAAsB83E,GACzD93E,KAAK6R,eAAe9Q,IAAI,IAAxBf,CAAmC,mBAAoB83E,GAEvD93E,KAAKi4E,gBACP,CAEQC,yBAAyBt0E,GAC/B,MAAMwH,EAAYC,SAASC,cAAc,OAGzC,IAAI6sE,EAAgBP,EAFpBxsE,EAAUmI,UAAUxS,IAAI,eAGrB6C,IACDu0E,EAAY,IAAI,KAAI,CAClBppE,OAAO,OAAcnL,EAAImL,OACzB+vB,UAAU,QAAKl7B,EAAI6J,OAAOqmD,OAAS,aAAe,WAAY,CAAClwD,EAAIqxB,QACnEmjD,aAAa,IAGfR,EAAeS,KACb,OAAeF,EAAUC,aAAa,QAAKC,EAAQ,uBAAyB,uBAC5EF,EAAUC,YAAY7kE,UAAU1J,OAAO,SAAUwuE,EAAM,EAGzDT,IAAch0E,EAAIsnD,gBAElB9/C,EAAUM,OAAOysE,EAAU/sE,YAG7B,MAAMktE,EAAiBjtE,SAASC,cAAc,OAK9C,OAJAgtE,EAAe/kE,UAAUxS,IAAI,wBAE7BqK,EAAUM,OAAO4sE,GAEV,CAACltE,YAAW+sE,YAAWP,cAAaU,iBAC7C,CAYcL,iB,+CACZ,MAAM/gD,EAAal3B,KAAKkzC,iBAAiBjwC,MAEnCs1E,GADSr/D,MAAMs/D,QAAQx4E,KAAKy3E,iBAAmBz3E,KAAKy3E,gBAAkB,CAACz3E,KAAKy3E,kBACtD38D,KAAK8Z,GAAU50B,KAAKiH,SAAS6jD,mBAAmBC,cAAcn2B,KAC1F,IAAI+/B,QAAatvC,QAAQqH,IAAI6rD,GAC7B,IAAIrhD,IAAc,OAClB,IAAIuhD,EAAW9jB,EAAK,GACpB,GAAmB,IAAhBA,EAAK9xD,SAAiB41E,EAGvB,OAFA,QAAS,CAAC/oD,YAAa1vB,KAAK03E,SAAW,mBAAqB,8BAC5D13E,KAAKqW,OAIPs+C,EAAOA,EAAK5kC,OAAO+M,SACnB27C,EAAW9jB,EAAK,GAEhB30D,KAAK20D,KAAOA,EAAK75C,KAAKlX,GAAQA,EAAIA,MAElC,MAAM8zE,EAAwB,QAAhB,EAAG13E,KAAK03E,gBAAQ,QAAb13E,KAAK03E,WAAee,EAAS70E,IAAI6J,OAAOqmD,OAEzD,IAAI4jB,EAAU,EACZ,QAAiB13E,KAAKupC,SAAUvpC,KAAK23E,gBAAiB,CAAC9lE,eAAgB7R,KAAK6R,iBAE5E,MAAM,QAAC9N,IAAW,OAA0B,CAC1C2mD,SAAU1qD,KAAKupC,SACfmvC,eAAe,EACfC,OAAQ,IAAM34E,KAAKqW,SAGrBrW,KAAK4N,iBAAiB,QAAS7J,E,CAGjC,4BAA6CwzE,GAE7C,MAAM31D,EAAgB,IAAI,IACpB2V,EAA+B,GAE/BqhD,EAAqBjkB,EAAK75C,KAAUlX,GAAQ,EAAD,gCAC/C,MAAM,UAACwH,EAAS,eAAEktE,EAAc,UAAEH,EAAS,YAAEP,GAAe53E,KAAKk4E,yBAAyBvjB,EAAK9xD,OAAS,EAAIe,EAAIA,SAAMK,GAUtH,IAAI2rD,EARDuoB,IACD,QAAiBA,EAAUC,aAAa,KACtCp4E,KAAKiH,SAAS6jD,mBAAmBE,iBAAiBpnD,EAAIA,IAAI,GACzD,CAACiO,eAAgB7R,KAAK6R,iBAG3B7R,KAAK43E,YAAYh0E,EAAIA,IAAIgE,IAAMgwE,EAI/B,MAAMruB,EAAO3lD,EAAI8nD,UAAU37B,QAAQpuB,GAAmB,cAAXA,aAAG,EAAHA,EAAKiO,KAChD,GAAG8nE,EAAU,CACX,MAAMha,GAAW,OAAgB,CAC/Bmb,OAAQtvB,EAAKzuC,KAAKnZ,GAAQA,EAAIiG,KAC9B2vB,eACAmF,eAAgB66C,EAChB/gB,gBAAiB,0BACjBt/B,eAIDhe,MAAMC,KAAKukD,EAASvkC,UAA4BrJ,MAAM,GAAG/qB,SAAS7C,IACjE,MAAM02B,EAAOvtB,SAASC,cAAc,QACpCstB,EAAKrlB,UAAUxS,IAAI,eACnBmB,EAAQ4qB,YAAY8L,GACpBA,EAAKltB,OAAOxJ,EAAQ,IAGtB0tD,EAAO,CAAC8N,GAER4a,EAAe/kE,UAAU8W,QAAQ,uBAAwB,gBACzDiuD,EAAe/kE,UAAUxS,IAAI,YAAa,Y,MAE1C6uD,QAAavqC,QAAQqH,IAAI68B,EAAKzuC,KAAUnZ,GAAQ,EAAD,gCAC7C,MAAMysB,EAAM/iB,SAASC,cAAc,OACnC8iB,EAAI7a,UAAUxS,IAAI,uBAElB,MAAM8G,EAAO,8BAgBb,aAdM,QAAY,CAChBlG,MACAysB,MACAxM,gBACAthB,MAAOi3E,EACP9yE,MAAM,EACNf,MAAM,EACNwjB,MAAOrf,EACPyf,OAAQzf,EACR8jD,UAAU,EACVp0B,eACAL,eAGK9I,CACT,OAKF,OAFAkqD,EAAe5sE,UAAUkkD,EAAK7/B,OAAO+M,UAE9B1xB,CACT,MAEM86B,QAAmB7gB,QAAQqH,IAAIksD,SAC/BvzD,QAAQqH,IAAI6K,GAElB,MAAMjhB,EAAStW,KAAKsW,QAAS,OAAO,GAAI,CAACiM,UAAU,IAEnDviB,KAAKg4E,gBAEL,QAAiB1hE,GAAQ,KACvB,MAAMzM,GAAS,OAAiB,CAACyM,IAAS,GAE1CtW,KAAKiH,SAAS6jD,mBAAmBguB,kBAAkBnkB,EAAK75C,KAAKlX,GAAQA,EAAIA,OAAM0K,MAAK,KAClFtO,KAAKqW,MAAM,IACV4B,OAAM,KACPpO,GAAQ,GACR,GACD,CAACgI,eAAgB7R,KAAK6R,iBAEN,IAAhB8iD,EAAK9xD,QACN,OAAa7C,KAAK+O,OAAO,OAAc0pE,EAAS70E,IAAImL,SAEpD,OAAa/O,KAAK+O,OAAO,QAAK,UAGhC/O,KAAK63E,eAAej/D,YAAc,GAClC5Y,KAAK63E,eAAensE,OAAO4K,GAE3BtW,KAAKupC,SAASh2B,UAAU/Q,OAAO,cAC/BxC,KAAKupC,SAAS3wB,YAAc,GAC5B5Y,KAAKupC,SAAS79B,UAAUw6B,GAExBlmC,KAAKm0B,WAAWxgB,oB,IAGVqkE,eACN,MAAM,KAACrjB,EAAI,SAAE+iB,GAAY13E,KACzB,IAAI+4E,EAAgBC,EACpB,GAAmB,IAAhBrkB,EAAK9xD,OAAc,CACpB,MAAM41E,EAAW9jB,EAAK,GACtBqkB,GAAe,QAAKtB,EAAW,aAAe,WAAY,CAACe,EAASxjD,QACpE8jD,GAASN,EAASvtB,c,KACb,CACL,MAAM+tB,EAAYtkB,EAAK5kC,QAAQnsB,GAAQA,EAAIsnD,iBAC3C,IAAIj2B,EACD0/B,EAAK9xD,SAAWo2E,EAAUp2E,QAC3Bk2E,GAAQ,EACR9jD,EAAQ0/B,EAAK9xD,SAEbk2E,GAAQ,EACR9jD,EAAQ0/B,EAAK9xD,OAASo2E,EAAUp2E,QAGlCm2E,GAAe,QAAK,iBAAkB,CAAC/jD,G,CAGzCj1B,KAAKsW,OAAO+E,UAAY09D,EAAQ,gCAAkC,8CAClE,OAAe/4E,KAAKsW,QAAQ,QAAKyiE,EAAQ,mBAAqB,sBAAuB,CAACC,IACxF,E,+GC9Qa,MAAME,EAqBnBn5E,YAAY2xB,GAfJ,KAAAxV,OAAS,EACV,KAAAi9D,UAAW,EAEX,KAAA5qE,QAAmC,KAEnC,KAAA6qE,UAAW,EACV,KAAAz3D,YAAa,EACb,KAAA/K,YAAa,EACb,KAAA+0B,gBAAiB,EACjB,KAAA0tC,aAAqC,SA8FtC,KAAAplE,QAAWlM,I,UACbA,IACD,OAAYA,GAGX/H,KAAKmc,UAAU5I,UAAUqB,SAAS,UACtB,QAAb,EAAA5U,KAAKs5E,gBAAQ,mBAAGvxE,GAEI,QAApB,EAAY,QAAZ,EAAA/H,KAAKuO,eAAO,eAAE+iC,cAAM,gB,EAzFnB5f,IACD,OAAW1xB,KAAM0xB,GAGhB1xB,KAAKo5E,WACNp5E,KAAK2rC,gBAAiB,EAE1B,CAEO4tC,mBAAmB7nD,EAGrB,CAAC,GACA1xB,KAAKmc,YACPnc,KAAKmc,UAAY9Q,SAASC,cAAc,OACxCtL,KAAKmc,UAAU5I,UAAUxS,IAAI,uBAE1B2wB,EAAQqjB,OACT/0C,KAAKmc,UAAU5I,UAAUxS,IAAI,aAAe2wB,EAAQqjB,OAGnDrjB,EAAQ8nD,MACTx5E,KAAKmc,UAAU5I,UAAUxS,IAAI,kBAG5Bf,KAAK4W,YACN5W,KAAKmc,UAAU5I,UAAUxS,IAAI,wBAGnC,CAEO04E,wBACLz5E,KAAKu5E,oBACP,CAEOpuE,YACLnL,KAAKmL,UAAY,KAEjBnL,KAAKu5E,qBAELv5E,KAAKmc,UAAU4G,UAAY,0HAEmD/iB,KAAK4W,WAAa,cAAgB,+DACvE5W,KAAK4W,WAAa,KAAO,aAAa5W,KAAK4W,WAAa,KAAO,YAAY5W,KAAK4W,WAAa,GAAK,mEAIxI5W,KAAK4W,WACN5W,KAAK6rC,YAAc,mBAEnB7rC,KAAK6rC,YAAc,mBAGlB7rC,KAAK2hB,YACN3hB,KAAKmc,UAAU4G,WAAa,kxEAc5B/iB,KAAK05E,YAAc15E,KAAKmc,UAAUmO,iBAClCtqB,KAAK25E,UAAY35E,KAAK05E,YAAYE,wBAElC55E,KAAKmc,UAAU5I,UAAUxS,IAAI,mBAG/Bf,KAAK4rC,OAAS5rC,KAAKmc,UAAU5G,kBAAkBA,kBAAkBA,kBAE9DvV,KAAK2hB,aACN,QAAiB3hB,KAAKmc,UAAWnc,KAAKiU,QAE1C,CAcOw9B,oBAAoBooC,GACzB75E,KAAKs5E,SAAWO,CAClB,CAEOvpD,YACLtwB,KAAKmc,UAAU5I,UAAUxS,IAAI,UAC7Bf,KAAKykB,YAAY,EACnB,CAEO0L,cAAc5hB,GACnB,GAAGvO,KAAKo5E,UAAYp5E,KAAKuO,QAAS,OAElCvO,KAAKuO,QAAUA,EAEf,MAAM2N,IAAWlc,KAAKkc,OAChB49D,EAAYz8D,KAAKC,MAEjBy8D,EAASv0E,IAGb,GAFA+I,EAAQyrE,OAASzrE,EAAQ4iC,UAAY,KAElCj1B,IAAWlc,KAAKkc,OACjB,OAGF,MAAMkC,EAAcf,KAAKC,MAAQw8D,EAIjC,IAAIt0E,GAAOxF,KAAK2hB,WAAY,CAC1B3hB,KAAKykB,YAAY,KAEjB,MAAM2B,EAAQ6zD,IAEX77D,EAAcgI,EACfpmB,KAAKkvB,SAELxsB,YAAW,KACNwZ,IAAWlc,KAAKkc,QACjBlc,KAAKkvB,Q,GAEN9I,E,MAGFpmB,KAAK2rC,gBACN3rC,KAAKgvB,OAAOhvB,KAAKmc,UAAUlD,gBAC3B,SAAQ,KACNjZ,KAAKswB,WAAW,KAGlBtwB,KAAKkvB,SAITlvB,KAAKuO,QAAUA,EAAU,IAAI,EAG/BA,EACCD,MAAK,IAAMyrE,EAAM,QACjB9hE,OAAOzS,GAAQu0E,EAAMv0E,KAEnB+I,EAAQ2rE,mBACT3rE,EAAQ2rE,mBAAmB7zE,IAKzB,GAAG6V,IAAWlc,KAAKkc,OAAQ,OAG3B,MAAM8nD,EAAW39D,EAAQ+qC,KAAO/qC,EAAQgrC,MAAQ,IAChDrxC,KAAKykB,YAAYu/C,EAAS,GAGhC,CAEOh1C,OAAOgd,EAAer7B,GAAQ,EAAOpC,G,MAC5B,QAAd,EAAAvO,KAAKmL,iBAAS,oBAEXnL,KAAKmc,UAAUlD,eAChBjZ,KAAKmc,UAAU5I,UAAU/Q,OAAO,UAGlCxC,KAAKm5E,UAAW,EAEb5qE,GACDvO,KAAKmwB,cAAc5hB,GAGrB,IAAI4rE,EAAU,GACXn6E,KAAKm5E,UAAYn5E,KAAKmc,UAAUlD,gBAAkB+yB,KACnDmuC,GAAU,OAAQn6E,KAAKmc,WAAa,EAAI,EACrCnc,KAAKmc,UAAUlD,gBAAkB+yB,GAClCA,EAAKhsC,KAAKq5E,cAAcr5E,KAAKmc,aAIjC,OAAc,CACZja,QAASlC,KAAKmc,UACdd,UAAW,aACXqjC,UAAU,EACV73C,SA/NkB,IAgOlBszE,YAGCn6E,KAAK2hB,YAAchR,GACpB3Q,KAAKykB,YAAY,EAErB,CAEOyK,S,MACFlvB,KAAKm5E,WAKRn5E,KAAKm5E,UAAW,GAIC,QAAd,EAAAn5E,KAAKmc,iBAAS,eAAElD,iBAYjB,OAAc,CACZ/W,QAASlC,KAAKmc,UACdd,UAAW,aACXqjC,UAAU,EACV73C,SAlQgB,IAmQhBqxB,gBAAiB,KACfl4B,KAAKmc,UAAU3Z,QAAQ,EAEzB23E,QAAS,IAKf,CAEO11D,YAAYu/C,GACjB,GAAIhkE,KAAK6rC,cAAgB,OAAQ7rC,KAAK4rC,QAItC,GAAgB,IAAbo4B,EAKH,IACEhkE,KAAK6rC,cAAL7rC,KAAK6rC,YAAgB7rC,KAAK4rC,OAAOwuC,kBAGjCp6E,KAAK4rC,OAAOrgC,MAAM8uE,gBAAuB7zE,KAAKC,IAAI,EAAGu9D,EAAW,IAAMhkE,KAAK6rC,aAAe,KAAO7rC,KAAK6rC,WAC3F,CAAX,MAAMrmC,GAAK,MATXxF,KAAK4rC,OAAOrgC,MAAM8uE,gBAAkB,EAUxC,E,udCnRK,SAAeC,EACpBlsD,EACApmB,EACAw0B,EACA30B,EACAimB,EAAM,IAAIlE,MACV8pB,GAAY,G,yCAEZ,MAAMxrB,QAAU1G,EAAA,qDAA6DxZ,EAAQw0B,EAAO30B,GACtFqmB,EAAchG,EAAEqlB,OAChBi/B,EAAStkD,EAAEskD,OAIjB,IAAI+N,EACAnkD,EACAokD,EACJ,GALA1sD,EAAIva,UAAUxS,IAAI,gBAKfyrE,EAEDp2C,EAAW,MACT,EAAAvJ,EAAA,GAAeuB,EAAKN,GACpBM,EAAIrE,QAAQgrB,MAAQ,EAAE,MAEnB,CACL,MAAMnb,EAAUpY,EAAA,6BACboY,GACD9L,EAAIva,UAAUxS,IAAI,WAGpB,IAAI05E,GAAe,EACnB,GAAY,cAAT5yE,EAAsB,CACvB,MAAMmtB,QAAYslD,EAAUlsD,EAAKpmB,EAAQw0B,EAAO,eAChD+9C,EAAqBvlD,EAAI0lD,kBAAoB1lD,EAAI9G,YACjDssD,EAAaxlD,EAAIwlD,U,MACZ,GAAGh+C,EAAMm+C,eAAgB,CAC9BH,EAAa,IAAI5wD,MACjBwE,EAAI7a,UAAUxS,IAAI,mBAClBy5E,EAAWjnE,UAAUxS,IAAI,eAAgB,0BACzC,MAAM2G,GAAM,EAAAkzE,EAAA,GAAuBp+C,EAAMm+C,gBACzCJ,GAAqB,EAAArvD,EAAA,IAA0BsvD,EAAY9yE,GAAK4G,MAAK,KAChEmsE,IAIH,EAAA5tD,EAAA,GAAeuB,EAAKosD,EAAW,G,CAInCpkD,EAAW,KACTqkD,GAAe,EAEZD,EACDpsD,EAAI1iB,OAAOoiB,IAEX,EAAAjB,EAAA,GAAeuB,EAAKN,GAGtBprB,YAAW,KACN0rB,EAAImF,mBACLsnD,EAAA,gBAA4B/sD,GAAK,KAC/BM,EAAIrE,QAAQgrB,MAAQ,GAEjBnb,GACD9L,EAAIva,UAAU/Q,OAAO,WAGvBg4E,SAAAA,EAAYh4E,QAAQ,G,GAGvBo3B,EAAU,IAAM,EAAE,C,CAIzB,MAAMkhD,EAAgB5sD,EACrB5f,MAAM5G,IAAQ,EAAAwjB,EAAA,IAA0B4C,EAAKpmB,KAC7C4G,KAAK8nB,GAIN,OAFAmkD,UAA4BA,EAAmBtiE,MAAM4jB,EAAA,IAE9C,CACL2wC,SACAt+C,YAAa4sD,EACbJ,iBAAkBlO,EAASsO,EAAgBP,GAAsBl1D,QAAQlX,UACzEqsE,aAEJ,G,CAEA,SAAS52E,EACPwqB,EACArL,EACAgyB,EACAhhC,EACA8yB,EACA8jC,IAEA,EAAAzsC,EAAA,GAAa9P,EAAKrL,GAClBqL,EAAIrE,QAAQgrB,MAAQA,EACpB3mB,EAAI7a,UAAU/Q,OAAO,cAAe,uBAAwB,qBAAsB,WAAY,YAC9FuR,GAAQqa,EAAI7a,UAAUxS,IAAIgT,GAC1B8yB,GAAWzY,EAAI7a,UAAUxS,IAAI,YAC7B4pE,GAAWv8C,EAAI7a,UAAUxS,IAAI,WAC/B,CAGe,SAAe4yC,GAAS,IACrCvlB,EAAG,OACHpmB,EAAM,SACNkjC,GAAW,EAAK,MAChBn8B,EAAQ,GAAE,UACV2kC,GAAY,EAAK,MACjBE,EAAK,SACL3gC,EAAQ,YACRugC,EAAc,CAAC,I,iDAWf,MAAMunC,EAAOv5D,EAAA,OAEb,GAAGxZ,IAAW+yE,GAAQ7vC,EAEpB,YADAtnC,EAAIwqB,EAAK,GAAI,GAAI,eAInB,MAAMnnB,EAAWua,EAAA,WAEjB,GAAGvO,EAAU,CACX,MAAMg7D,QAAchnE,EAASk7B,eAAe64C,cAAchzE,EAAQiL,GAOlE,OANArP,EAAIwqB,EAAK,GAAI,QAAInqB,OAAWA,GAAW,GAEpCuvC,EAAYgjB,iBACbpoC,EAAI7iB,MAAM0vE,YAAY,SAAUznC,EAAYgjB,gBAAgBtvC,MAAQ,OAG/D,OAAc,OAAD,wBACfssB,GAAW,CACdy6B,QACArsD,eAAe,KACdtT,MAAMyF,IACPqa,EAAIuU,gBAAgB5uB,EAAK,G,CAI7B,MAAMqsB,QAAan5B,EAASqI,gBAAgB+wB,QAAQr4B,GACpD,GAAGA,IAAW,MAAgBA,EAAO66B,WAAuC,QAA1B,EAAAzC,aAAI,EAAJA,EAAoB3yB,cAAM,eAAEq2B,SAE5E,YADAlgC,EAAIwqB,EAAK,IAAI,EAAA8sD,EAAA,GAAiBlzE,GAAS,wBAIzC,MAAM6+B,KAA0C,QAA9B,EAACzG,aAAI,EAAJA,EAAuB3yB,cAAM,eAAE0tE,OAC5CtzE,EAAsB+rC,EAAQ,YAAc,cAC5CpX,GAAQ,EAAAjtB,EAAA,GAAa6wB,GACrBg7C,IAAoB5+C,EACpB6+C,IAAmBjtD,EAAI7Y,oBAAuB6Y,EAAI7Y,kBAAkChC,UAAUqB,SAAS,SAC7G,IAAIwmE,IAAoBC,WAA0Bp0E,EAASq0E,kBAAkBC,eAAevzE,EAAQH,IAAQ,CAC1G,IAAIktC,EAAQ,GAKZ,IAJG/sC,GAAWA,IAAW+yE,GAAS7vC,IAChC6J,GAAQ,EAAAmmC,EAAA,GAAiBlzE,IAGxBA,IAAW,KAEZ,YADApE,EAAIwqB,EAAK,GAAI2mB,EAAO,sBAItB,MAAMoR,EAAOp3C,GAAQ,EAAAovB,EAAA,GAAiBpvB,GC1L3B,SAAyBqxB,G,MACtC,IAAIvY,EAAM,GAQV,OAPGuY,IACDvY,EAA+B,QAAxB,EAAAuY,EAAmBrxB,aAAK,QAAI,CAChCqxB,EAAmBo7C,WACnBp7C,EAAmBq7C,WACpB1rD,OAAO+M,SAAS1U,KAAK,OAGlB,EAAA+V,EAAA,GAAiBtW,EAC1B,CDgLmD6zD,CAAgBt7C,GAC/Dx8B,EAAIwqB,EAAK+3B,EAAMpR,EAAO,GAAIlO,E,CAI5B,OAAGu0C,EACed,EAAUlsD,EAAKpmB,EAAQw0B,EAAO30B,OAAM5D,EAAWyvC,QADjE,C,iCEhMK,SAASzM,EAAa+E,EAAe2vC,GAAY,GACtD,MAAMvmE,EAAO,wMAKb,GAAGumE,EAAW,CACZ,MAAMvtD,EAAM/iB,SAASC,cAAc,OAQnC,OAPA8iB,EAAI7a,UAAUxS,IAAI,aAClBqtB,EAAIrL,UAAY3N,EAEb42B,GACDA,EAAKx0B,YAAY4W,GAGZA,C,CAIT,OADA4d,EAAKzzB,mBAAmB,YAAanD,GAC9B42B,EAAK1hB,gBACd,CAIO,SAASsxD,EAAgB5vC,EAAyBj4B,EAAO,SAK9D,OAJAi4B,EAAKz4B,UAAU/Q,OAAO,SAAWuR,GACjCi4B,EAAKmI,UAAW,EAChBlN,EAAa+E,GAEN,KACLA,EAAKjpB,UAAY,GACjBipB,EAAKz4B,UAAUxS,IAAI,SAAWgT,GAC9Bi4B,EAAKmf,gBAAgB,WAAW,CAEpC,C,gCAZA,gBAA8BlkB,C,2FCnBf,MAAM40C,EAKnB97E,YAAY2xB,GAQV,MAAMuZ,EAAQjrC,KAAKirC,MAAQ5/B,SAASC,cAAc,SAClD2/B,EAAM13B,UAAUxS,IAAI,eAEjB2wB,EAAQoqD,YACT7wC,EAAM13B,UAAUxS,IAAI,qBAGtB,MAAM6zB,EAAQ50B,KAAK40B,MAAQvpB,SAASC,cAAc,SAClDspB,EAAMhzB,KAAO,QACIgzB,EAAM1c,KAAO,eAAiBwZ,EAAQxZ,KAEpDwZ,EAAQhlB,QACTkoB,EAAMloB,MAAQglB,EAAQhlB,MAEnBglB,EAAQ4wB,WACT,eAA2Bh0C,MAAMoiB,IAC/BkE,EAAMyU,SAAU,OAAgB3Y,EAAOgB,EAAQ4wB,YAAc5wB,EAAQhlB,KAAK,IAG5EkoB,EAAMhnB,iBAAiB,UAAU,KAC/B,sCAA4C8jB,EAAQ4wB,SAAU5wB,EAAQhlB,MAAM,MAKlF,MAAMoW,EAAO9iB,KAAK8iB,KAAOzX,SAASC,cAAc,OAChDwX,EAAKvP,UAAUxS,IAAI,oBAEhB2wB,EAAQ1d,KACT8O,EAAKC,UAAY2O,EAAQ1d,KAWjB0d,EAAQgpC,UAChB,QAAM53C,EAAM4O,EAAQgpC,SAGtBzvB,EAAMv/B,OAAOkpB,EAAO9R,EACtB,CAEIumB,cACF,OAAOrpC,KAAK40B,MAAMyU,OACpB,CAEIA,YAAQA,GACVrpC,KAAKyiD,iBAAiBpZ,GAEtB,MAAMxO,EAAQ,IAAImoB,MAAM,SAAU,CAACvC,SAAS,EAAM9+B,YAAY,IAC9D3hB,KAAK40B,MAAMxrB,cAAcyxB,EAC3B,CAEO4nB,iBAAiBpZ,GACtBrpC,KAAK40B,MAAMyU,QAAUA,CACvB,E,8BC9Ea,SAAS0yC,EAAUC,EAA6D1nD,GAC7F,MAAM2nD,EAAO5wE,SAASC,cAAc,QAYpC,OAVA0wE,EAAOj3E,SAASmjB,IACd,MAAM,UAAC9c,EAAS,MAAEwpB,GAAS1M,EAC3B+zD,EAAKvwE,OAAON,GACZwpB,EAAMhnB,iBAAiB,UAAW7F,IAC7B6sB,EAAMyU,SACP/U,EAASM,EAAMloB,MAAO3E,E,GAExB,IAGGk0E,CACT,C,+FCVe,MAAMC,EAyBnBn8E,YACE2xB,EAQAhlB,EAAQ,GA7BH,KAAA6X,WAAY,EAIX,KAAA43D,OAKH,CAAC,EAOI,KAAAz5D,gBAAiB,EACjB,KAAAygD,cAAe,EACf,KAAAr8C,UAAW,EA0DX,KAAA+1B,YAAehiB,IACvB76B,KAAKuvC,MAAM1U,EAAM,EAGT,KAAAihB,YAAejhB,I,MACvB76B,KAAKsmB,KAAOtmB,KAAKoL,UAAUsS,wBAC3B1d,KAAKukB,WAAY,EACjBvkB,KAAKuvC,MAAM1U,GACX76B,KAAKoL,UAAUmI,UAAUxS,IAAI,eAClB,QAAX,EAAAf,KAAKm8E,cAAM,eAAErgC,cAAe97C,KAAKm8E,OAAOrgC,YAAYjhB,EAAM,EAGlD,KAAAhY,UAAagY,I,MACrB76B,KAAKukB,WAAY,EACjBvkB,KAAKoL,UAAUmI,UAAU/Q,OAAO,eACrB,QAAX,EAAAxC,KAAKm8E,cAAM,eAAEt5D,YAAa7iB,KAAKm8E,OAAOt5D,UAAUgY,EAAM,EAQjD,KAAAsN,QAAU,K,MACf,MAAMz7B,GAAS1M,KAAKqjE,KAAK32D,MACzB1M,KAAKo8E,UAAU1vE,IACJ,QAAX,EAAA1M,KAAKm8E,cAAM,eAAEv5D,UAAW5iB,KAAKm8E,OAAOv5D,QAAQlW,EAAM,GAvElD,OAAW1M,KAAM0xB,GAEjB1xB,KAAKoL,UAAYC,SAASC,cAAc,OACxCtL,KAAKoL,UAAUmI,UAAUxS,IAAI,iBAG1Bf,KAAKmjE,aACNnjE,KAAKoL,UAAUmI,UAAUxS,IAAI,iBACrBf,KAAK0iB,gBACb1iB,KAAKoL,UAAUmI,UAAUxS,IAAI,mBAG/Bf,KAAKq8E,OAAShxE,SAASC,cAAc,OACrCtL,KAAKq8E,OAAO9oE,UAAUxS,IAAI,yBAE1B,MAAMsiE,EAAOrjE,KAAKqjE,KAAOh4D,SAASC,cAAc,SAChD+3D,EAAK9vD,UAAUxS,IAAI,uBAEnBsiE,EAAKzhE,KAAO,QACZyhE,EAAK5gD,KAAO,GAAKziB,KAAKyiB,KACtB4gD,EAAKz8D,IAAM,GAAK5G,KAAK4G,IACrBy8D,EAAK58D,IAAM,GAAKzG,KAAKyG,IACrB48D,EAAK32D,MAAQ,GAAKA,EAEfA,GACD1M,KAAKykB,YAAY/X,GAGnB,MAAM4vE,EAAU,GAAKt8E,KAAKyiB,KACpBwP,EAAQqqD,EAAQniE,QAAQ,KAC9Bna,KAAKu8E,UAAsB,IAAXtqD,EAAe,EAAIqqD,EAAQz5E,OAASovB,EAAQ,EAI5DjyB,KAAKoL,UAAUM,OAAO1L,KAAKq8E,OAAQhZ,EACrC,CAEI32D,YACF,OAAQ1M,KAAKqjE,KAAK32D,KACpB,CAEOiW,YAAYw5D,GACjBn8E,KAAKm8E,OAASA,CAChB,CAoBO9nE,eACLrU,KAAKqjE,KAAKz1D,iBAAiB,QAAS5N,KAAKmoC,SACzCnoC,KAAKw8E,kBAAmB,OAAoBx8E,KAAKoL,UAAWpL,KAAK87C,YAAa97C,KAAK68C,YAAa78C,KAAK6iB,UACvG,CAQO4B,YAAY/X,GACjB1M,KAAKqjE,KAAK32D,MAAQ,GAAKA,EACvB1M,KAAKo8E,WAAWp8E,KAAKqjE,KAAK32D,MAC5B,CAEO+vE,YAAY/vE,GACjB1M,KAAKqjE,KAAK32D,MAAQ,KAAO1M,KAAKqjE,KAAK32D,MAAQA,GAC3C1M,KAAKo8E,WAAWp8E,KAAKqjE,KAAK32D,MAC5B,CAEO0vE,UAAU1vE,GACf,IAAIs3D,GAAYt3D,EAAQ1M,KAAK4G,MAAQ5G,KAAKyG,IAAMzG,KAAK4G,KACrDo9D,GAAW,OAAMA,EAAU,EAAG,GAG3BhkE,KAAKmjE,aACNnjE,KAAKq8E,OAAO9wE,MAAMkR,UAAY,UAAUunD,KAExChkE,KAAKq8E,OAAO9wE,MAAM2b,MAAoB,IAAX88C,EAAkB,GAEjD,CAEUz0B,MAAM1U,G,MACd,MAAM6hD,EAAU18E,KAAK8mB,SAAW9mB,KAAKsmB,KAAKgB,OAAStnB,KAAKsmB,KAAKY,MACvDy1D,GAAkB,OAAM38E,KAAK8mB,WAAa+T,EAAMle,EAAI3c,KAAKsmB,KAAKrB,QAAU4V,EAAMne,EAAI1c,KAAKsmB,KAAKxB,KAAM,EAAG43D,GAE3G,IAAIhwE,EAAQ1M,KAAK4G,IAAO+1E,EAAkBD,GAAW18E,KAAKyG,IAAMzG,KAAK4G,KAerE,OAbI8F,EAAQ1M,KAAK4G,KAAS5G,KAAKyG,IAAMzG,KAAK4G,KAAO,IAC/C8F,GAAS1M,KAAKyiB,KAAO,IAGvB/V,GAASA,EAAM8T,QAAQxgB,KAAKu8E,UAC5B7vE,GAAQ,OAAMA,EAAO1M,KAAK4G,IAAK5G,KAAKyG,KAKpCzG,KAAKykB,YAAY/X,IACN,QAAX,EAAA1M,KAAKm8E,cAAM,eAAEv5D,UAAW5iB,KAAKm8E,OAAOv5D,QAAQlW,GAErCA,CACT,CAEOiP,kBACF3b,KAAKw8E,mBACNx8E,KAAKw8E,mBACLx8E,KAAKw8E,iBAAmB,MAG1Bx8E,KAAKqjE,KAAK3xD,oBAAoB,QAAS1R,KAAKmoC,SAE5CnoC,KAAKm8E,OAAS,CAAC,CACjB,E,+GChKF,IAAIS,EAAgB,EACL,SAAS/jD,EACtBmT,EACA5V,EAAoD,KAAM/Q,QAAQlX,WAClE4rE,EAA8B,KAC9B/hE,GAAU,EACV6kE,EAAmB7wC,GAGnB,GAAGA,EAAKp0B,cAAc,aAAc,OACpCo0B,EAAKz4B,UAAUxS,IAAI,MAEnB,MAAMmnB,EAAI7c,SAASC,cAAc,OAUjC,IAAIwxE,EATJ50D,EAAE3U,UAAUxS,IAAI,YAECirC,EAAKz4B,UAAUqB,SAAS,cAEvCsT,EAAE3U,UAAUxS,IAAI,aAGlBirC,EAAKh0B,EAAU,UAAY,UAAUkQ,GAIrC,MAAM60D,EAAa,CAAChc,EAAiB0Q,KACnC,MAAMqI,EAAYz8D,KAAKC,MACjBsuB,EAASvgC,SAASC,cAAc,OAEhC0xE,EAAUJ,IAMV/1E,EAA8G,KAArF6M,OAAOgU,iBAAiBQ,GAAGP,iBAAiB,qBAAqB0C,QAAQ,IAAK,IAGvG4yD,EAAWH,EAAU,KAMzB,MAAM1+D,EAAcf,KAAKC,MAAQw8D,EAC3B1pE,EAAK,KAET,YAAqB,KACnBw7B,EAAOppC,QAAQ,IAGjBu3E,SAAAA,EAAQiD,EAAQ,EAElB,GAAG5+D,EAAcvX,EAAU,CACzB,MAAMuf,EAAQ5f,KAAKC,IAAII,EAAWuX,EAAavX,EAAW,GAC1DnE,YAAW,IAAMkpC,EAAOr4B,UAAUxS,IAAI,WAAWyF,KAAKC,IAAI2f,EAAQvf,EAAW,EAAG,IAEhFnE,WAAW0N,EAAIgW,E,MAEfwlB,EAAOr4B,UAAUxS,IAAI,UACrB2B,WAAW0N,EAAIvJ,EAAW,GAGxB,MACF6M,OAAOhC,oBAAoB,cAAeorE,GAC1CppE,OAAOhC,oBAAoB,YAAaorE,IAG1CA,EAAU,KACVI,GAAkB,CAAK,EAIzB9mD,SAAAA,EAAW4mD,IAeX,SAAQ,KACN,GAAGC,IAAaH,EACd,OAGF,MAAMx2D,EAAO4B,EAAExK,wBACfkuB,EAAOr4B,UAAUxS,IAAI,oBAErB,MAAM4mE,EAAS5G,EAAUz6C,EAAKxB,KACxBq4D,EAAS1L,EAAUnrD,EAAKtB,IAGxBnd,EADSrB,KAAKmzC,KAAK,SAACnzC,KAAK8X,IAAI6+D,EAAS72D,EAAKgB,OAAS,GAAKhB,EAAKgB,OAAS,EAAM,GAAI,SAAC9gB,KAAK8X,IAAIqpD,EAASrhD,EAAKY,MAAQ,GAAKZ,EAAKY,MAAQ,EAAM,IAIzIxK,EAAIirD,EAAS9/D,EAAO,EACpB8U,EAAIwgE,EAASt1E,EAAO,EAI1B+jC,EAAOrgC,MAAM2b,MAAQ0kB,EAAOrgC,MAAM+b,OAASzf,EAAO,KAClD+jC,EAAOrgC,MAAMuZ,KAAOpI,EAAI,KACxBkvB,EAAOrgC,MAAMyZ,IAAMrI,EAAI,KAgBvBuL,EAAExc,OAAOkgC,E,GAST,EAIEwxC,EAAoBr1E,GAAaA,EAAE1H,SAAW2rC,IAClD,CAAC,SAAU,KAAKj3B,SAAUhN,EAAE1H,OAAuBwgB,WACjD,OAAgB9Y,EAAE1H,OAAuB,cAAgB6nB,KAE3D20D,IAAqB7wC,KAClB,OAAcjkC,EAAE1H,OAAuBw8E,IAI5C,IAAIK,GAAkB,EACtB,GAAG,IAAoB,CACrB,MAAMG,EAAW,KACfP,SAAAA,GAAW,EAGbD,EAAiBjvE,iBAAiB,cAAe7F,IAC/C,IAAI,+BACF,OAIF,GAAGA,EAAEypB,QAAQ3uB,OAAS,GAAKq6E,GAAmBE,EAAiBr1E,GAC7D,OAIFm1E,GAAkB,EAElB,MAAM,QAACnc,EAAO,QAAE0Q,GAAW1pE,EAAEypB,QAAQ,GACrCurD,EAAWhc,EAAS0Q,GACpBoL,EAAiBjvE,iBAAiB,WAAYyvE,EAAU,CAACpvE,MAAM,IAE/DyF,OAAO9F,iBAAiB,aAAc7F,IACpCA,EAAEyuB,cAAe,EACjBzuB,EAAEkpE,kBACFoM,IACAR,EAAiBnrE,oBAAoB,WAAY2rE,EAAS,GACzD,CAACpvE,MAAM,GAAM,GACf,CAACwjB,SAAS,G,MAEborD,EAAiBjvE,iBAAiB,aAAc7F,IAC9C,IAAI,CAAC,EAAG,GAAGgN,SAAShN,EAAEuO,QACpB,OAGF,IAAI,+BACF,OAIF,GAAuC,MAApCumE,EAAiB9yD,QAAQ8O,QAAkBukD,EAAiBr1E,GAC7D,OACK,GAAGm1E,EAER,YADAA,GAAkB,GAIpB,MAAM,QAACnc,EAAO,QAAE0Q,GAAW1pE,EAC3Bg1E,EAAWhc,EAAS0Q,GACpB/9D,OAAO9F,iBAAiB,UAAWkvE,EAAS,CAAC7uE,MAAM,EAAMwjB,SAAS,IAClE/d,OAAO9F,iBAAiB,cAAekvE,EAAS,CAAC7uE,MAAM,EAAMwjB,SAAS,GAAM,GAC3E,CAACA,SAAS,GAEjB,C,kLCjMA,MAAM6rD,EAAa,CAACp7E,EAAsByQ,MACzB,IAAZA,IAE2B,iBAAd,GACd,OAAazQ,EAASyQ,GAEtBzQ,EAAQwJ,OAAOiH,G,EAMJ,MAAM4qE,EAoBnBx9E,YAAY2xB,EAwBP,CAAC,GA/BC,KAAAgW,SAAU,EAgCZhW,EAAQ8rD,uBACT9rD,EAAQsZ,cAAgB,IAAI,IAAc,OAAD,QACvCn5B,eAAgB6f,EAAQ7f,gBACrB6f,EAAQ8rD,wBAIf,MAAM38D,EAAU6Q,EAAQsiB,OAAS,IAAOtiB,EAAQ+rD,YAAc/rD,EAAQsZ,cAAgB,QAAU,MAQhG,GAPAhrC,KAAKoL,UAAYC,SAASC,cAAcuV,GACxC7gB,KAAKoL,UAAUmI,UAAUxS,IAAI,MAAO,eAEjC2wB,EAAQgsD,QACT19E,KAAKoL,UAAUmI,UAAUxS,IAAI,WAG5B2wB,EAAQoN,SAAU,CACnB,MAAMA,EAAW9+B,KAAK8+B,SAKtB,GAJAw+C,EAAWx+C,EAAUpN,EAAQoN,UAE1BpN,EAAQgsD,QAAQ5+C,EAASvrB,UAAUxS,IAAI,WAEvC2wB,EAAQisD,cAAe,CACxB39E,KAAKoL,UAAUM,OAAO1L,KAAK49E,YAAc59E,KAAK69E,aAC9C79E,KAAK49E,YAAYrqE,UAAUxS,IAAI,oBAC/B,MAAM48E,EAAgB39E,KAAK29E,cAAgBtyE,SAASC,cAAc,OAClEqyE,EAAcpqE,UAAUxS,IAAI,eAAgB,sBAE5Cu8E,EAAWK,EAAejsD,EAAQisD,eAClC39E,KAAK49E,YAAYlyE,OAAOozB,EAAU6+C,E,OAE5BjsD,EAAQs3C,iBAChBhpE,KAAK8+B,SAASpzB,QAAO,QAAKgmB,EAAQs3C,gBAAiBt3C,EAAQosD,mBAG7D,IAAI/+C,IAAgBrN,EAAQqN,YAC5B,GAAGrN,EAAQ+rD,YAAc/rD,EAAQsZ,cAAe,CAO9C,GANGtZ,EAAQ+rD,aACTz9E,KAAKy9E,WAAa/rD,EAAQ+rD,WAC1Bz9E,KAAKoL,UAAUM,OAAO1L,KAAKy9E,WAAWxyC,OACtClM,GAAc,GAGbrN,EAAQsZ,cAAe,CACxBhrC,KAAKgrC,cAAgBtZ,EAAQsZ,cAE7B,MAAM+yC,EAAWrsD,EAAQsZ,cAAcC,MAAM13B,UAAUqB,SAAS,yBAShE,GARGmpE,GACD/9E,KAAKoL,UAAUmI,UAAUxS,IAAI,mBAC7B2wB,EAAQmN,WAAa7+B,KAAKgrC,cAAcC,QAExClM,GAAc,EACd/+B,KAAKoL,UAAUM,OAAO1L,KAAKgrC,cAAcC,QAGxCvZ,EAAQssD,uBAAyBD,EAAU,CAC5C,MAAMzpD,EAAW,MACf,OAAet0B,KAAK8+B,UAAU,QAAK9+B,KAAKgrC,cAAcpW,MAAMyU,QAAU,mBAAqB,qBAAqB,EAG/G3X,EAAQ7f,eAAgB6f,EAAQ7f,eAAe9Q,IAAIf,KAAKgrC,cAAcpW,MAA9ClD,CAAqD,SAAU4C,GACrFt0B,KAAKgrC,cAAcpW,MAAMhnB,iBAAiB,SAAU0mB,E,GAInD5C,EAAQ+rD,YAAc/rD,EAAQsZ,eACtCC,MAAM13B,UAAUxS,IAAI,gB,CAGxB,GAAG2wB,EAAQ3iB,OAAS2iB,EAAQ8oC,aAAc,CACxC,IAAIh1B,EACJ,MAAMy4C,EAAoBvsD,EAAQmN,YAAcnN,EAAQwsD,oBAkBxD,GAjBGD,GACDj+E,KAAKoL,UAAUM,OAAO85B,EAAIxlC,KAAKm+E,SAAWn+E,KAAK69E,aAC/C79E,KAAKm+E,SAAS5qE,UAAUxS,IAAI,kBAE5BykC,EAAIxlC,KAAKoL,UAGXpL,KAAK+O,MAAQ/O,KAAKo+E,cACf1sD,EAAQgsD,QAAQ19E,KAAK+O,MAAMwE,UAAUxS,IAAI,WACzC2wB,EAAQ3iB,MACTuuE,EAAWt9E,KAAK+O,MAAO2iB,EAAQ3iB,OACvB2iB,EAAQ8oC,cAChBx6D,KAAK+O,MAAMrD,QAAO,QAAKgmB,EAAQ8oC,eAGjCh1B,EAAE95B,OAAO1L,KAAK+O,OAEXkvE,EAAmB,CACpB,MAAMp/C,EAAa7+B,KAAK6+B,WAAaxzB,SAASC,cAAc,OAC5DuzB,EAAWtrB,UAAUxS,IAAI,YAAa,mBAEnC2wB,EAAQwsD,qBACTr/C,EAAWtrB,UAAUxS,IAAI,6BAG3Bu8E,EAAWz+C,EAAYo/C,GACvBz4C,EAAE95B,OAAOmzB,E,EAIVnN,EAAQ3d,OACTgrB,GAAc,EAEd/+B,KAAKoL,UAAUmI,UAAUxS,IAAI,QAAS,SAAW2wB,EAAQ3d,MACzD/T,KAAKoL,UAAUmI,UAAUxS,IAAI,kBAG5Bg+B,GACD/+B,KAAKoL,UAAUmI,UAAUxS,IAAI,oBAG5B2wB,EAAQ2sD,gBACT3sD,EAAQuB,UAAY,IAAMvB,EAAQ2sD,cAAc3vD,SAG/CgD,EAAQuB,WAAavB,EAAQ+rD,YAAc/rD,EAAQsZ,iBACnB,mBAAvBtZ,EAAiB,YACzB,QAAiB1xB,KAAKoL,WAAYrD,IAC7B/H,KAAK0nC,SACPhW,EAAQuB,UAAkBlrB,EAAE,GAC5B,CAAC8J,eAAgB6f,EAAQ7f,iBAG9B7R,KAAKoL,UAAUmI,UAAUxS,IAAI,gBAAiB,gBAE1C2wB,EAAQnP,WACV,OAAOviB,KAAKoL,eAAWnH,OAAWA,GAAW,KAQ9CytB,EAAQ0mD,aAAe1mD,EAAQ4sD,sBAChCt+E,KAAKo4E,YAAc1mD,EAAQ0mD,uBAAuB50E,YAChDkuB,EAAQ0mD,aACR,OAAO,gCAAiC,CAACpkE,KAAM0d,EAAQ4sD,qBACzDt+E,KAAKoL,UAAUM,OAAO1L,KAAKo4E,cAG1B1mD,EAAQq3C,cACT,OAAkB,OAAD,wBACZr3C,EAAQq3C,aAAW,CACtBre,SAAU1qD,KAAKoL,UACfyG,eAAgB6f,EAAQ7f,iBAG9B,CAEWitB,e,MACT,OAAqB,QAArB,EAAO9+B,KAAKu+E,iBAAS,QAAdv+E,KAAKu+E,UAAcv+E,KAAKw+E,gBACjC,CAEWC,e,MACT,OAAqB,QAArB,EAAOz+E,KAAK0+E,iBAAS,QAAd1+E,KAAK0+E,UAAc1+E,KAAK2+E,gBACjC,CAEQd,YACN,MAAMr4C,EAAIn6B,SAASC,cAAc,OAEjC,OADAk6B,EAAEjyB,UAAUxS,IAAI,WACTykC,CACT,CAEQ44C,cACN,MAAMrvE,EAAQ1D,SAASC,cAAc,OAGrC,OAFAyD,EAAMwE,UAAUxS,IAAI,cACpB,OAAagO,GACNA,CACT,CAEQyvE,iBACN,MAAM1/C,EAAWzzB,SAASC,cAAc,OAMxC,OALAwzB,EAASvrB,UAAUxS,IAAI,iBACvB,OAAa+9B,GACV9+B,KAAK+O,MAAO/O,KAAK+O,MAAMqmD,MAAMt2B,GAC3B9+B,KAAKoL,UAAU4M,QAAQ8mB,GAC5B9+B,KAAKoL,UAAUmI,UAAU/Q,OAAO,eACzBs8B,CACT,CAEQ6/C,iBACN,MAAMF,EAAWpzE,SAASC,cAAc,OAGxC,OAFAmzE,EAASlrE,UAAUxS,IAAI,gBACvBf,KAAK8+B,SAAS7lB,cAAc1B,aAAaknE,EAAUz+E,KAAK8+B,UACjD2/C,CACT,CAEOG,YAAY/2E,GACjB,MAAMnC,EAAQ2F,SAASC,cAAc,OACrC,OAAOtL,KAAKg/B,kBAAkBt5B,EAAOmC,EACvC,CAEOm3B,kBAAkBt5B,EAAoBmC,GAY3C,OAXA7H,KAAKoL,UAAUmI,UAAUxS,IAAI,oBAE7Bf,KAAK0F,MAAQA,EACbA,EAAM6N,UAAUxS,IAAI,aAEjB8G,GACDnC,EAAM6N,UAAUxS,IAAI,aAAe8G,GAGrC7H,KAAKoL,UAAUM,OAAOhG,GAEfA,CACT,CAEOm5E,mBAAmBtwE,GACxBvO,KAAKoL,UAAUmI,UAAUxS,IAAI,eAC7BwN,EAAQ4J,SAAQ,KACdnY,KAAKoL,UAAUmI,UAAU/Q,OAAO,cAAc,GAElD,CAEOs8E,eACL,MAAMC,EAAW1zE,SAASC,cAAc,QACxCtL,KAAKoL,UAAUmI,UAAUxS,IAAI,eAAgB,SAC7Cg+E,EAASxrE,UAAUxS,IAAI,oBAAqB,cAC5Cf,KAAKoL,UAAUM,OAAOqzE,EACxB,CAEOC,cAAcrtE,GACnB3R,KAAKoL,UAAUmI,UAAU1J,OAAO,aAAc8H,EAChD,EAGK,MAAMstE,EAA8Bj0C,GAClC,IAAIuyC,EAAI,CAACvyC,gBAAen5B,eAAgBm5B,EAAcn5B,iBAGlDqtE,EAAoB,CAAC3mB,EAAajkC,KACtC,OAAUikC,EAAKz9C,KAAKoN,IAAM,CAAE9c,UAAW8c,EAAE9c,UAAWwpB,MAAO1M,EAAEu1D,WAAW7oD,UAAUN,GAG9E6qD,EAAsB,CAAC5zC,EAAiFjX,KACnH,MAAMpc,EAAO,SAA2B,QAAhB1R,KAAKu3C,SAAsB,GACnD,IAAIqhC,EACJ,MAAM7mB,EAAOhtB,EAAOzwB,KAAI,EAAE4U,cAAahjB,QAAO28B,cAC5C,MAAMzK,EAAM,IAAI2+C,EAAI,CAClBE,WAAY,IAAI,IAAW,CACzB/iB,QAAShrC,EACTxX,OACAxL,MAAO,GAAKA,MAQhB,OAJG28B,IACD+1C,EAAoBxgD,EAAI6+C,YAGnB7+C,CAAG,IAGNq9C,EAAOiD,EAAkB3mB,EAAMjkC,GAIrC,OAHG8qD,IACDA,EAAkB/1C,SAAU,GAEvB4yC,CAAI,C,+GCxRN,MAAMoD,EAuBXt/E,YAAmBa,EAAkB0+E,EAAY,GAAWl0E,EAAyBC,SAASC,cAAc,QAAzF,KAAA1K,GAAAA,EAAyC,KAAAwK,UAAAA,EAnBrD,KAAAm0E,gBAA0B,EAE1B,KAAAC,mBAA6B,EAC7B,KAAAC,oBAA8B,EAM9B,KAAAC,4BAA6B,EAC1B,KAAAC,yBAA0B,EAmG7B,KAAAllD,SAAW,KAOhB,GAAGz6B,KAAK0/E,2BAGN,OAFA1/E,KAAK4/E,qBACL5/E,KAAK2/E,yBAA0B,IAK5B3/E,KAAK6/E,eAAkB7/E,KAAKw0B,kBAAsBx0B,KAAK0oC,SAAY1oC,KAAK2T,sBAC1E3T,KAAKu/E,kBAGRv/E,KAAKu/E,gBAAkB7rE,OAAOhR,YAAW,KACvC1C,KAAKu/E,gBAAkB,EAEvB,MAAMO,EAAiB9/E,KAAKoL,UAAUpL,KAAK+/E,gBAC3C//E,KAAKy/E,oBAAsBz/E,KAAKw/E,qBAAuBM,EAAiB,EAAK9/E,KAAKw/E,mBAAqBM,EAAiB,GAAK,EAC7H9/E,KAAKw/E,mBAAqBM,EAGvB9/E,KAAK2T,oBACN3T,KAAK2T,qBAGJ3T,KAAK6kC,kBACN7kC,KAAK6kC,kB,GAlJoC,KAqJ1B,EA3HnB7kC,KAAKoL,UAAUmI,UAAUxS,IAAI,cAE7Bf,KAAKyhB,KAAM,QAAO,UAAY69D,EAAY,IAAMA,EAAY,IAAK,YAE9D1+E,IACDsY,MAAMC,KAAKvY,EAAGu4B,UAAUp0B,SAASygC,GAAMxlC,KAAKoL,UAAUM,OAAO85B,KAE7D5kC,EAAG8K,OAAO1L,KAAKoL,WAGnB,CAEO40E,oBACFhgF,KAAKigF,sBAIRjgF,KAAKigF,qBAAsB,EAC3BjgF,KAAKoL,UAAUwC,iBAAiB,SAAU5N,KAAKy6B,SAAU,CAAChJ,SAAS,EAAMzc,SAAS,IACpF,CAEOkrE,uBACDlgF,KAAKigF,sBAITjgF,KAAKigF,qBAAsB,EAC3BjgF,KAAKoL,UAAUsG,oBAAoB,SAAU1R,KAAKy6B,SAAU,CAACzlB,SAAS,IACxE,CAEOX,eACFrU,KAAKmgF,+BAIRzsE,OAAO9F,iBAAiB,SAAU5N,KAAKy6B,SAAU,CAAChJ,SAAS,IAC3DzxB,KAAKggF,oBAELhgF,KAAKmgF,8BAA+B,SAAuB,KACzDngF,KAAK0/E,4BAA6B,EAE/B1/E,KAAKu/E,kBACNv/E,KAAK4/E,gBACL5/E,KAAK2/E,yBAA0B,E,IAEhC,KACD3/E,KAAK0/E,4BAA6B,EAE/B1/E,KAAK2/E,0BACN3/E,KAAKy6B,WACLz6B,KAAK2/E,yBAA0B,E,IAGrC,CAEOhkE,kBACD3b,KAAKmgF,+BAITzsE,OAAOhC,oBAAoB,SAAU1R,KAAKy6B,UAC1Cz6B,KAAKkgF,uBAELlgF,KAAKmgF,+BACLngF,KAAKmgF,kCAA+Bl8E,EACtC,CAEOF,UACL/D,KAAK2b,kBACL3b,KAAK2T,wBAAqB1P,EAC1BjE,KAAK6/E,mBAAgB57E,EACrBjE,KAAKw0B,sBAAmBvwB,CAC1B,CAEOyH,UAAUitD,GACf34D,KAAKoL,UAAUM,UAAUitD,EAC3B,CAEO7+B,kBAAkBpI,GAGvB,OAAO,OAAiB,OAAD,wBAClBA,GAAO,CACVtmB,UAAWpL,KAAKoL,YAIpB,CAuCOw0E,gBACF5/E,KAAKu/E,kBAEN9rE,aAAazT,KAAKu/E,iBAClBv/E,KAAKu/E,gBAAkB,EAE3B,EAMa,MAAMa,UAAmBf,EAKtCt/E,YAAYa,EAAkB0+E,EAAY,GAAWe,EAAiB,IAAKC,GACzEpuE,MAAMtR,EAAI0+E,GADyC,KAAAe,eAAAA,EAF9C,KAAAz2B,UAAiC,CAAC5kC,KAAK,EAAMC,QAAQ,GAiCrD,KAAA4f,iBAAmB,KACxB,IAAK7kC,KAAK6/E,gBAAkB7/E,KAAKw0B,iBAAmB,OAEpD,GAAGx0B,KAAK0/E,2BAEN,YADA1/E,KAAKy6B,WAIP,MAAMF,EAAev6B,KAAKoL,UAAUmvB,aACpC,IAAIA,EACF,OAGF,MACMgmD,EAAehmD,EADAv6B,KAAKoL,UAAUylE,aAE9Bx2C,EAAYr6B,KAAKw/E,mBAIpBx/E,KAAK6/E,eAAiBxlD,GAAar6B,KAAKqgF,gBAAkBrgF,KAAKy/E,qBAAuB,GACvFz/E,KAAK6/E,gBAGJ7/E,KAAKw0B,kBAAqB+rD,EAAelmD,GAAcr6B,KAAKqgF,gBAAkBrgF,KAAKy/E,qBAAuB,GAC3Gz/E,KAAKw0B,kB,EA7CPx0B,KAAKoL,UAAUmI,UAAUxS,IAAI,gBAC7Bf,KAAKqU,eACLrU,KAAK+/E,eAAiB,WACxB,CAEO5K,sBAAsBD,EAAal1E,KAAKoL,WAC7C,MAAMgF,EAAKpQ,KAAK2T,mBAChB3T,KAAK2T,mBAAqB,KACxBvD,SAAAA,IACA8kE,EAAW3hE,UAAU1J,OAAO,gBAAiB7J,KAAKq6B,WAClD66C,EAAW3hE,UAAU1J,OAAO,kBAAmB7J,KAAKwgF,eAAe,EAGrEtL,EAAW3hE,UAAUxS,IAAI,eAAgB,kBAAmB,wBAC9D,CAEOszB,oBAAoBzzB,GACzBZ,KAAK0oC,QAAU9nC,EACfZ,KAAKyhB,IAAI,uBAAwB7gB,EAAIZ,KACvC,CA8BOgY,WAAWkR,IACflpB,KAAK0oC,SAAW1oC,KAAKutB,SAAWvtB,KAAKoL,WAAW4M,WAAWkR,EAC9D,CAEOxd,UAAUwd,IACdlpB,KAAK0oC,SAAW1oC,KAAKutB,SAAWvtB,KAAKoL,WAAWM,UAAUwd,EAC7D,CAEOu3D,mBACL,OAAOzgF,KAAKu6B,aAAe/zB,KAAKmD,MAAM3J,KAAKq6B,UAAYr6B,KAAKoL,UAAU+kE,aACxE,CAEIqQ,qBACF,OAAOxgF,KAAKygF,oBAAsB,CACpC,CAEIpmD,cAAU1d,GACZ3c,KAAKoL,UAAUivB,UAAY1d,CAC7B,CAEI0d,gBAEF,OAAOr6B,KAAKoL,UAAUivB,SACxB,CAEOqmD,qBAAqBh0E,GAC1B1M,KAAKw/E,mBAAqB9yE,EAC1B1M,KAAK2gF,wBAEL3gF,KAAKq6B,UAAY3tB,CACnB,CAEOi0E,wBACF3gF,KAAKmgF,+BACNngF,KAAKkgF,uBACLlgF,KAAKoL,UAAUwC,iBAAiB,UAAW7F,KACzC,OAAYA,GACZ/H,KAAKggF,mBAAmB,GACvB,CAAChrE,SAAS,EAAMyc,SAAS,EAAOxjB,MAAM,IAE7C,CAEIssB,mBACF,OAAOv6B,KAAKoL,UAAUmvB,YACxB,EAGK,MAAMqmD,UAAoBvB,EAC/Bt/E,YAAYa,EAAiB0+E,EAAY,GAAWe,EAAiB,IAAYQ,EAAa,GAAWz1E,EAAyBC,SAASC,cAAc,QAKvJ,GAJA4G,MAAMtR,EAAI0+E,EAAWl0E,GAD6B,KAAAi1E,eAAAA,EAA6B,KAAAQ,WAAAA,EAAwB,KAAAz1E,UAAAA,EAGvGpL,KAAKoL,UAAUmI,UAAUxS,IAAI,iBAEzB,IAAoB,CACtB,MAAM+/E,EAAsB/4E,KACtBA,EAAEg5E,QAAU/gF,KAAKoL,UAAU41E,YAAchhF,KAAKoL,UAAUkmD,cAC1DtxD,KAAKoL,UAAUimD,YAActpD,EAAE+uC,OAAS,GACxC,OAAY/uC,G,EAIhB/H,KAAKoL,UAAUwC,iBAAiB,QAASkzE,EAAoB,CAACrvD,SAAS,G,CAGzEzxB,KAAK+/E,eAAiB,YACxB,E,6ECrUF,MAAM1kE,EAAY,uBACH,MAAM4lE,EASnBlhF,YAAY2xB,EAAiC,CAAC,G,MAC5C,MAAMtmB,EAAYpL,KAAKoL,UAAYC,SAASC,cAAc,OAC1DF,EAAUmI,UAAUxS,IAAIsa,EAAY,cAEpC,MAAMytB,EAAiB9oC,KAAK8oC,eAAiBz9B,SAASC,cAAc,OAOpE,GANAw9B,EAAev1B,UAAUxS,IAAIsa,GAE1BqW,EAAQyX,UACTL,EAAev1B,UAAUxS,IAAI,aAG5B2wB,EAAQwvD,sBACTp4C,EAAep9B,QAAO,UACtBo9B,EAAev1B,UAAUxS,IAAI,4BACxB,GAAI2wB,EAAQm3C,YAIjB//B,EAAev1B,UAAUxS,IAAI,oBAJC,CAC9B,MAAMogF,EAAK91E,SAASC,cAAc,MAClCw9B,EAAep9B,OAAOy1E,E,CAaxB,MAAMxuE,EAAU3S,KAAK2S,QAAU3S,KAAKohF,yBAEpC,GAAG1vD,EAAQxZ,KAAM,CACf,MAAMnJ,EAAQ/O,KAAK+O,MAAQ1D,SAASC,cAAc,OAClDyD,EAAMwE,UAAUxS,IAAI,kBAAmBsa,EAAY,UACnD,QAAM,CAACnZ,QAAS6M,EAAOvC,IAAKklB,EAAQxZ,KAAMygD,KAAMjnC,EAAQ2vD,WACxD1uE,EAAQjH,OAAOqD,E,CAGjB3D,EAAUM,OAAOo9B,GAEjB,MAAMx1B,EAAyB,QAAf,EAAAoe,EAAQpe,eAAO,QAAIoe,EAAQ4vD,WAC3C,GAAGhuE,EAAS,CACV,MAAM1S,EAAKZ,KAAKsT,QAAUtT,KAAKohF,yBAC/BxgF,EAAG2S,UAAUxS,IAAIsa,EAAY,YAEzBqW,EAAQ4vD,YACVl2E,EAAUM,OAAO9K,IAGJ,IAAZ0S,IACD,QAAM,CAACpR,QAAStB,EAAI4L,IAAK8G,EAASqlD,KAAMjnC,EAAQ6vD,a,CAGtD,CAEOH,yBACL,MAAMzuE,EAAUtH,SAASC,cAAc,OAQvC,OAPAqH,EAAQY,UAAUxS,IAAIsa,EAAY,YAMlCrb,KAAK8oC,eAAep9B,OAAOiH,GACpBA,CACT,EAGK,MAAM6uE,EAAkB,CAACj4C,EAAsBrxB,EAAoB5E,KACxE,MAAMu1B,EAAU,IAAIo4C,EAAe,CAAC/oE,OAAM5E,YAE1C,OADAi2B,EAAS79B,OAAOm9B,EAAQz9B,WACjBy9B,EAAQl2B,OAAO,C,2NC1ET,MAAM8uE,UAAuB,IAA5C,c,oBAEU,KAAAz5B,aAAyC,KAEzC,KAAA05B,WAAqB,CAgL/B,CAxKSrrD,KACLoS,EACAi5C,GAAqB,GAErB1hF,KAAK0hF,UAAYA,EACjB1hF,KAAKyoC,QAAUA,EAEfzoC,KAAKoL,UAAUmI,UAAUxS,IAAI,uBAC7Bf,KAAK2hF,SAAS,YAEd3hF,KAAK4oD,WAAa,IAAI,KAAYC,IAChC7oD,KAAKgoD,aAAea,CAAO,IAG7B,MAAMhgB,EAAU,IAAI,IAAe,CAAC,GAE9B+4C,EAAev2E,SAASC,cAAc,OAC5Cs2E,EAAaruE,UAAUxS,IAAI,iBAE3Bf,KAAK6hF,oBAAsB,IAAI,KAAW,CACxC52C,MAAO,yBACPu1B,UAAW,MAGbxgE,KAAK8hF,wBAA0B,IAAI,KAAW,CAC5C72C,MAAO,eACP/yB,KAAM,WACNwoD,aAAa,IAGfkhB,EAAal2E,OACX1L,KAAK6hF,oBAAoBz2E,UACzBpL,KAAK8hF,wBAAwB12E,WAG/BpL,KAAK6R,eAAe9Q,IAAIf,KAAK6hF,oBAAoBjtD,MAAjD50B,CAAwD,SAAS,KAE/D,IAAI+hF,IADU/hF,KAAK6hF,oBAAoBn1E,MACd7J,SAAW7C,KAAK6hF,oBAAoBjtD,MAAMrhB,UAAUqB,SAAS,SACnF5U,KAAK0hF,YAAWK,EAAaA,KAAgB/hF,KAAKgiF,sBAAwBhiF,KAAKiiF,qBAClFjiF,KAAKwoD,QAAQj1C,UAAU1J,OAAO,eAAgBk4E,EAAW,IAG3D/hF,KAAKwoD,SAAU,OAAa,CAACz0C,KAAM,gBAEnC,QAAiB/T,KAAKwoD,SAAS,KAC7B,MAAMz5C,EAAQ/O,KAAK6hF,oBAAoBn1E,MAEvC,IAAI6B,EACJ,GAAGvO,KAAK0hF,UAAW,CACjB,IAAI1hF,KAAKiiF,sBAAwBjiF,KAAKgiF,mBAAoB,OAC1DzzE,EAAUvO,KAAKiH,SAAS88B,gBAAgBm+C,cAAc,CACpDnzE,QACA+8D,MAAO,GACPqW,UAAW,OAAF,QACPvyE,EAAG,iBACA5P,KAAKgiF,oBAEV9V,QAASlsE,KAAKiiF,oBACdG,WAAW,IACV9zE,MAAMo4B,IACJ1mC,KAAKgoD,cACNhoD,KAAKgoD,eAAe15C,MAAM+zE,IACxBriF,KAAKiH,SAAS88B,gBAAgBu+C,UAAU57C,EAAQ27C,EAAU,IAI3DriF,KAAKyoC,QAAQ5lC,QACd7C,KAAKiH,SAAS88B,gBAAgBw+C,gBAAgB77C,EAAQ1mC,KAAKyoC,SAGtD/B,I,MAGT1mC,KAAKwoD,QAAQrU,UAAW,EACxB5lC,EAAUvO,KAAKiH,SAAS88B,gBAAgBy+C,WAAWzzE,EAAO/O,KAAKyoC,QAAQ3tB,KAAK9S,GAAWA,EAAO+6B,cAAaz0B,MAAMo4B,IAC5G1mC,KAAKgoD,cACNhoD,KAAKgoD,eAAe15C,MAAM+zE,IACxBriF,KAAKiH,SAAS88B,gBAAgBu+C,UAAU57C,EAAQ27C,EAAU,IAIvD37C,KAIPn4B,GAIJA,EAAQD,MAAMo4B,IACZ1mC,KAAK4S,QAEL8iB,EAAA,gBAA0B,CAAC1tB,OAAQ0+B,EAAOjQ,UAAS,IAAO,GAC1D,GACD,CAAC5kB,eAAgB7R,KAAK6R,iBAEzB,MAAM4wE,EAAe,IAAI,IAAe,CACtCvqE,KAAM,UACNmpE,SAAU,CAACrhF,KAAKyoC,QAAQ5lC,UAGpBwwB,EAAOrzB,KAAKqzB,KAAOoI,EAAA,uBAAiC,CACxDinD,KAAK,IAmBP,OAhBAD,EAAa9vE,QAAQjH,OAAO2nB,GAE5BwV,EAAQl2B,QAAQjH,OAAO1L,KAAK4oD,WAAWx9C,UAAWw2E,GAElD5hF,KAAK2S,QAAQjH,OAAO1L,KAAKwoD,SACzBxoD,KAAKm0B,WAAWzoB,OAAOm9B,EAAQz9B,UAAWq3E,EAAar3E,WAEpDs2E,GACD1hF,KAAK2hF,SAAS,qBACd3hF,KAAK8hF,wBAAwB12E,UAAUmI,UAAU/Q,OAAO,QACxDxC,KAAK8hF,wBAAwBr/B,iBAAiB,YAAY,WAAW,IACrEziD,KAAK2iF,iBAEL3iF,KAAK8hF,wBAAwB12E,UAAUmI,UAAUxS,IAAI,QAGhDskB,QAAQqH,IAAI1sB,KAAKyoC,QAAQ3tB,KAAU+uD,IAAW,O,EAAD,K,OAAA,E,EAAA,YAClD,MAAM,IAAC1pC,GAAO1E,EAAA,qBAA+B,CAC3CzzB,OAAQ6hE,EACRz+D,UAAWpL,KAAKqzB,KAChBkQ,eAAe,EACfnO,WAAY,eAGd+K,EAAIU,gBAAgBn1B,QAAO,EAAAo3B,EAAA,SAA0B9iC,KAAKiH,SAASk6B,gBAAgBC,QAAQyoC,IAC7F,E,YAToD,K,6QASlD,IACJ,CAEO5f,sBACLjqD,KAAK4oD,WAAWnjC,QAChBzlB,KAAKgoD,aAAe,KACpBhoD,KAAK6hF,oBAAoBn1E,MAAQ,GACjC1M,KAAK8hF,wBAAwB12E,UAAUmI,UAAUxS,IAAI,QACrDf,KAAKwoD,QAAQrU,UAAW,CAC1B,CAEQwuC,gBACNt9E,UAAUu9E,YAAYC,oBAAoBpyD,IACxCzwB,KAAKgiF,mBAAqB,CACxBc,IAAKryD,EAASsyD,OAAOC,SACrBC,KAAMxyD,EAASsyD,OAAOG,WAGxB,IAAIC,EAAM,8CACVA,GAAO,QAAQ1yD,EAASsyD,OAAOC,SAC/BG,GAAO,QAAQ1yD,EAASsyD,OAAOG,UAC/BC,GAAO,eACPA,GAAO,oBACPA,GAAO,sBACPtuC,MAAMsuC,GACL70E,MAAMwmC,GAAaA,EAASsuC,SAC5B90E,MAAMwmC,IACL90C,KAAKiiF,oBAAsBntC,EAASuuC,aACpCrjF,KAAK8hF,wBAAwBr/B,iBAAiB3N,EAASuuC,aAAa,GACpE,IACA1zD,IACCA,aAAiB2zD,yBAClBtjF,KAAK8hF,wBAAwBr/B,iBAAiB,mDAE9CziD,KAAK8hF,wBAAwBr/B,iBAAiB,6C,GAGpD,E,ICjNG8gC,E,uFCSU,SAASC,EAAuBC,GAC7C,MAAMC,EAAuB,GAGvBC,EAAoB,CAACC,MAAO,GAAIC,MAAO,IAAKC,EAAuB,CAACF,MAAO,GAAIC,MAAO,IA8B5F,OA7BAJ,EAAM1+E,SAASg/E,IACb,OAAOA,EAAKn0E,GACV,IAAK,uBACH8zE,EAAMrhF,KAAK,GACX,MACF,IAAK,0BACHqhF,EAAMrhF,KAAK,GACX,MACF,IAAK,4BACHqhF,EAAMrhF,KAAK,GACX,MAIF,IAAK,oCACHshF,EAAWE,MAAMxhF,QAAQ0hF,EAAKF,OAC9B,MACF,IAAK,yBACHF,EAAWC,MAAMvhF,QAAQ0hF,EAAKH,OAC9B,MACF,IAAK,uCACHE,EAAcD,MAAMxhF,QAAQ0hF,EAAKF,OACjC,MACF,IAAK,4BACHC,EAAcF,MAAMvhF,QAAQ0hF,EAAKH,O,IAKhC,CAAChiF,KAAM8hF,EAAM,GAAII,gBAAeH,aACzC,ED5CA,SAAKJ,GACH,6BACA,2BACA,sBACD,CAJD,CAAKA,IAAAA,EAAW,KAMhB,U,wBEee,MAAMS,EAiBnBjkF,YAAmB2xB,GAAA,KAAAA,QAAAA,EAqLX,KAAAuyD,cAAiBv3E,IACvBA,GAASA,EACT1M,KAAK4B,KAAO8K,EAEZ,MAAM4G,EAAUtT,KAAK0xB,QAAQwyD,SAASlkF,KAAK4B,MACrCuiF,EAAiBnkF,KAAKokF,aAAa9wE,QACrCA,EAEMA,aAAmB9P,aAC3B,EAAAqpB,EAAA,GAAes3D,EAAgB7wE,IAE/B,QAAM6wE,EAAgB7wE,GAJtB6wE,EAAephE,UAAY,GAM7BohE,EAAe5wE,UAAU1J,OAAO,QAASyJ,GAEtCtT,KAAKqkF,aACNrkF,KAAKqkF,WAAWphF,IAAI,SAAS27B,IAAIxzB,UAAUmI,UAAU1J,OAAO,OAAQ7J,KAAK4B,OAAS,aAClF5B,KAAKqkF,WAAWphF,IAAI,YAAY27B,IAAIxzB,UAAUmI,UAAU1J,OAAO,OAAQ7J,KAAK4B,OAAS,WAGvF5B,KAAK0xB,QAAQuyD,eAAiBjkF,KAAK0xB,QAAQuyD,cAAcv3E,EAAM,EA7L5DglB,EAAQwyD,UACTxyD,EAAQwyD,SAAShzE,UAGnB,MAAMjK,EAAWyqB,EAAQzqB,SAEzBjH,KAAKokF,aAAe,IAAI,IAAe,CAAClsE,KAAMwZ,EAAQ3iB,MAAOuE,SAAS,IAEtEtT,KAAKskF,UAAY,IAAI/iF,IAErB,IAAI2mB,EAAsD,CAAC,CACzDtmB,KAAM,YACN84D,QAAS,sCACR,CACD94D,KAAM,WACN84D,QAAS,wCACR,CACD94D,KAAM,SACN84D,QAAS,qCAGRhpC,EAAQ6yD,YACTr8D,EAAIA,EAAE6H,QAAQ7H,IAAOwJ,EAAQ6yD,UAAUxvE,SAASmT,EAAEtmB,SAGpD,MAAMm8C,GAAS,SACf71B,EAAEnjB,SAAQ,EAAEnD,OAAM84D,cAChB,MAAM97B,EAAM,IAAI,KAAI,CAClB6+C,WAAY,IAAI,IAAW,CACzB/iB,UACAxiD,KAAM6lC,EACNrxC,MAAO,GAAK9K,MAIhB5B,KAAKskF,UAAU1gF,IAAIhC,EAAMg9B,EAAI,IAG/B,MAAMq9C,GAAO,QAAkB,IAAIj8E,KAAKskF,UAAU/4C,UAAWvrC,KAAKikF,eAOlE,GALAjkF,KAAKokF,aAAazxE,QAAQjH,OAAOuwE,GAC9BvqD,EAAQ6X,UACT7X,EAAQ6X,SAAS79B,OAAO1L,KAAKokF,aAAah5E,YAGxCsmB,EAAQ8yD,aAAc,CACxB,MAAMp5E,GAAY,OAAgBsmB,EAAQ6X,SAAU,oBAAqB,sCAEzEvpC,KAAKqkF,WAAa,IAAI9iF,IAAI,CAAC,CACzB,WACA,CACEi5D,aAAc9oC,EAAQ+yD,eAAe,GACrCj4E,IAAK,WACLoyB,IAAK,KACL7qB,KAAM,aACNi1D,gBAAiB,qCACjB/1C,WAAW,IAEZ,CACD,QACA,CACEunC,aAAc9oC,EAAQ+yD,eAAe,GACrCj4E,IAAK,QACLoyB,IAAK,KACL7qB,KAAM,UACNi1D,gBAAiB,qCACjB/1C,WAAW,MAIfjzB,KAAKqkF,WAAWt/E,SAAS2/E,IACvBA,EAAU9lD,IAAM,IAAI,KAAI8lD,GAExBA,EAAU9lD,IAAIxzB,UAAUwC,iBAAiB,SAAS,KAChDW,EAAQD,MAAK,KACX,MAAMq2E,EAAW3kF,KAAKyoC,QAAQi8C,EAAUl4E,KACxCklB,EAAQxe,IAAI0xE,OAAOC,UAAU,KAAkBn2D,KAAK,CAClD9sB,KAAM,UACNkjF,WAAW,EACX/1E,MAAO21E,EAAUlqB,aACjBj3D,YAAa,kCACbwhF,QAAUC,IACRL,EAAS9hF,OAAS,EAClB8hF,EAAStiF,QAAQ2iF,GACjBN,EAAU9lD,IAAIE,SAAS/b,UAAY,GACnC2hE,EAAU9lD,IAAIE,SAASpzB,UAAU1L,KAAKilF,YAAYjlF,KAAKklF,iBAAiBF,IAAa,EAEvFG,gBAAiBR,GACjB,GACF,IAGJv5E,EAAUM,OAAOg5E,EAAU9lD,IAAIxzB,UAAU,G,CAQ7C,MAAMmD,EAAUtH,EAASm+E,kBAAkBC,WAAW3zD,EAAQ4zD,UAAUh3E,MAAMm1E,IAC5E,MAAMp9E,EAAUm9E,EAAuBC,GACvCzjF,KAAKulF,SAASl/E,EAAQzE,MAEnB5B,KAAKqkF,aACNrkF,KAAKyoC,QAAU,CAAC,EAChB,CAAC,QAAkB,YAAqB1jC,SAASoZ,IAC/C,MAAMssB,EAAM,GACNtxB,EAAa,UAANgF,EAAgB9X,EAAQs9E,WAAat9E,EAAQy9E,cAC1Dr5C,EAAIpoC,QAAQ8W,EAAKyqE,MAAM9oE,KAAKlT,GAAOA,EAAG6uB,cACtCgU,EAAIpoC,QAAQ8W,EAAK0qE,MAAM/oE,KAAKlT,GAAOA,EAAG6uB,UAAS,MAC/Cz2B,KAAKyoC,QAAQtqB,GAAKssB,EAClB,MAAM1gC,EAAI/J,KAAKqkF,WAAWphF,IAAIkb,GAAGygB,IAAIE,SACrC/0B,EAAEgZ,UAAY,GACdhZ,EAAE2B,UAAU1L,KAAKilF,YAAY9rE,GAAM,KAIvCuY,EAAQxe,IAAIsyE,cAAc53E,iBAAiB,WAAW,KAAW,O,EAAA,K,OAAA,E,EAAA,YAC/D,MAAM61E,EAA4B,GAElC,OAAOzjF,KAAK4B,MACV,KAAK,YACH6hF,EAAMphF,KAAK,CAACuN,EAAG,8BACf,MACF,KAAK,WACH6zE,EAAMphF,KAAK,CAACuN,EAAG,mCACf,MACF,KAAK,SACH6zE,EAAMphF,KAAK,CAACuN,EAAG,iCAInB,GAAG5P,KAAKqkF,WAAY,CAClB,MAAM5vE,EAAK,CACT,CAAC,QAAa,yCAA8C,+BAC5D,CAAC,WAAa,4CAA8C,mCAM9D,IAAI,MAAO0J,EAAGsnE,EAASC,KAAajxE,EAAG,CACrC,GAAGzU,KAAKqkF,WAAWphF,IAAIkb,GAAGygB,IAAIxzB,UAAUmI,UAAUqB,SAAS,QACzD,SAGF,MAAM+vE,EAAW3kF,KAAKyoC,QAAQtqB,GAC9B,GAAGwmE,EAAU,CACX,MAAM78D,EAAW9nB,KAAKklF,iBAAiBP,GACpC78D,EAAS+7D,MAAMhhF,QAChB4gF,EAAMphF,KAAK,CAACuN,EAAG61E,EAAS5B,MAAO/7D,EAAS+7D,QAGvC/7D,EAAS87D,MAAM/gF,QAChB4gF,EAAMphF,KAAK,CACTuN,EAAG81E,EACH9B,YAAav+D,QAAQqH,IAAI5E,EAAS87D,MAAM9oE,KAAKlT,GAAOX,EAASk6B,gBAAgBwkD,aAAa/9E,O,GAOpGX,EAASm+E,kBAAkBQ,WAAWl0D,EAAQ4zD,SAAU7B,EAC1D,E,YA/CiE,K,6QA+ChE,GAAE,CAACx1E,MAAM,GAAM,GAEpB,CAyBOs3E,SAAS3jF,GACd,MAAMg9B,EAAM5+B,KAAKskF,UAAUrhF,IAAIrB,GAC/B5B,KAAKikF,cAAcriF,GACnBg9B,EAAI6+C,WAAW7oD,MAAMyU,SAAU,CACjC,CAEQ67C,iBAAiBz8C,GACvB,MAAMxF,EAAQ,CAAC2gD,MAAO,GAAgBC,MAAO,IAK7C,OAJAp7C,EAAQ1jC,SAASiD,IACfi7B,EAAMj7B,EAAO67B,YAAc,QAAU,SAASxhC,KAAK2F,EAAO67B,YAAc77B,EAAO+4B,WAAa/4B,EAAO,IAG9Fi7B,CACT,CAEQgiD,YAAYhiD,GAClB,OAAIA,EAAM2gD,MAAM/gF,QAAWogC,EAAM4gD,MAAMhhF,QAIhC,QAAK,CACVogC,EAAM2gD,MAAM/gF,QAAS,QAAK,QAAS,CAACogC,EAAM2gD,MAAM/gF,SAAW,KAC3DogC,EAAM4gD,MAAMhhF,QAAS,QAAK,QAAS,CAACogC,EAAM4gD,MAAMhhF,SAAW,MAC3DktB,OAAO+M,UAAU,GANV,EAAC,QAAK,sCAOjB,E,cC9Pa,MAAM+oD,UAAiC,IACvCxvD,O,qCACXr2B,KAAKoL,UAAUmI,UAAUxS,IAAI,cAAe,wBAC5Cf,KAAK2hF,SAAS,gBAEd,MAAMpgD,EAAY,WAAavhC,KAAKiH,SAASk6B,gBAAgB2kD,WAAWzkD,MAClE0kD,EAAY16E,SAASC,cAAc,OACzCy6E,EAAUr6E,QACR,QAAK,oBACLL,SAASC,cAAc,MACvBD,SAASC,cAAc,OACvB,QAAK,qBACLD,SAASC,cAAc,OACvB,EAAA0/D,EAAA,GAAW,CACTgb,OAAQzkD,KAIZ,MAAM0kD,EAAe,IAAIjC,EAAe,CACtC9wE,IAAKlT,KACL+O,MAAO,oBACPu2E,SAAU,6BACVpB,SAAU,CAAC6B,EAAWA,EAAW,IACjCtB,eAAgB,CAAC,uCAAwC,yCACzDl7C,SAAUvpC,KAAKm0B,WACf8vD,cAAgBriF,IACdmI,EAAEw7E,SAAS,aACXx7E,EAAEq6E,aAAah5E,UAAUmI,UAAU1J,OAAO,OAAQjI,IAAS,SAAmB,EAEhFqF,SAAUjH,KAAKiH,WAGXi/E,EAAwB,oBACxBn8E,EAAI,IAAIi6E,EAAe,CAC3B9wE,IAAKlT,KACL+O,MAAO,qBACPu2E,SAAU,8BACVpB,SAAU,CAACgC,EAAUA,EAAU,IAC/B1B,cAAc,EACdD,UAAW,CAAC,UACZt9E,SAAUjH,KAAKiH,WAGjBjH,KAAKm0B,WAAW/oB,UAAUmM,aAAaxN,EAAEq6E,aAAah5E,UAAW66E,EAAa7B,aAAah5E,UAAUg0D,YACvG,E,iUC3Ca,MAAM+mB,UAAqC,IACjD9vD,OACLr2B,KAAKoL,UAAUmI,UAAUxS,IAAI,wBAAyB,6BACtDf,KAAK2hF,SAAS,kCAEd,MAAM94C,EAAU,IAAI,IAAe,CACjCy4C,WAAY,qCACZzY,aAAa,IAITud,EAAmB/6E,SAASC,cAAc,QAEhD,OAAiB,CACfm6C,MAJY,KAKZr3B,IAAKg4D,EACLl/D,MAAO,IACPI,OAAQ,MAGVuhB,EAAQl2B,QAAQjH,OAAO06E,GAEvB,MAAMC,EAAex9C,EAAQu4C,yBAEvBQ,EAAev2E,SAASC,cAAc,OAC5Cs2E,EAAaruE,UAAUxS,IAAI,iBAE3B,MAAMulF,GAAY,OAAO,gCAAiC,CAACtyE,KAAM,+CAEjE,QAAiBsyE,GAAYv+E,IAC3B/H,KAAK4S,OAAO,IAGd5S,KAAK4kF,OAAO2B,kBAAkBC,GAAgBxmF,MAE9C4hF,EAAal2E,OAAO46E,GAEpBD,EAAa36E,OAAOk2E,GAEpB5hF,KAAKm0B,WAAW/oB,UAAUM,OAAOm9B,EAAQz9B,UAC3C,E,wBC7CK,SAASq7E,EAASC,GACvB,OAAQ,EAAAr5D,mBAAqBq5D,CAC/B,C,cCWe,MAAMC,UAAmD,IAAxE,c,oBAKS,KAAAC,SAAU,CA4GnB,CA1GSvwD,OACLr2B,KAAKoL,UAAUmI,UAAUxS,IAAI,wBAAyB,4CACtDf,KAAK2hF,SAAS,6BAEd,MAAM94C,EAAU,IAAI,IAAe,CACjCy4C,YAAY,EACZzY,aAAa,KAGf,QAAMhgC,EAAQv1B,QAAS,mCAAoC,CAACtT,KAAK6mF,QAEjE,MACMT,EAAmB/6E,SAASC,cAAc,QAEhD,OAAiB,CACf8iB,IAAKg4D,EACLl/D,MAAO,IACPI,OAAQ,IACRm+B,MAPY,OAUd5c,EAAQl2B,QAAQjH,OAAO06E,GAEvB,MAAMC,EAAex9C,EAAQu4C,yBAEvBQ,EAAev2E,SAASC,cAAc,OAC5Cs2E,EAAaruE,UAAUxS,IAAI,iBAE3B,MAAM4zB,EAAa30B,KAAK8mF,eAAiB,IAAI,IAAe,CAC1D5uE,KAAM,sBACN+yB,MAAO,2BACPpoC,OAAQ7C,KAAK6C,OACb0gD,OAAS1pC,IACP4tD,GAAO,GAEPznE,KAAKiH,SAAS8/E,gBAAgBC,qBAAqB,GAAKntE,GACvDvL,MAAM5B,IAKLu6E,GAAQ,IAEThvE,OAAOzS,IACN,OAAOA,EAAI5D,MACT,IAAK,eACH+yB,EAAWC,MAAMrhB,UAAUxS,IAAI,UAC/B,EAAA8rB,EAAA,GAAe8H,EAAWsW,OAAO,QAAK,oCACtC,MAEF,IAAK,qBACHtW,EAAWC,MAAMrhB,UAAUxS,IAAI,UAC/B,EAAA8rB,EAAA,GAAe8H,EAAWsW,OAAO,QAAK,oCACtC,MAEF,QACE7+B,QAAQujB,MAAM,gBAAiBnqB,GAInCiiE,GAAO,EAAM,GACb,IAIAyf,GAAY,OAAO,8CAA+C,CAAClzE,KAAM,qCACzEmzE,GAAY,OAAO,4DAA6D,CAACnzE,KAAM,eAEvFizE,EAAS,KACbjnF,KAAK4kF,OAAOC,UAAUsB,GAA8Bz3D,MAAM,EAGtD+4C,EAAUxkB,KACd,EAAAZ,EAAA,GAAiB,CAAC1tB,EAAWC,MAAOsyD,EAAWC,GAAYlkC,EAAQ,GAGrE,QAAiBikC,GAAYn/E,IAC3B0/D,GAAO,GACPznE,KAAKiH,SAAS8/E,gBAAgBK,sBAAsB94E,MAAM5B,IACxD1M,KAAK4kF,OAAO2B,kBAAkBc,EAAgCrnF,MAC9DA,KAAK4S,OAAO,IACX,KACD60D,GAAO,EAAM,GACb,KAGJ,QAAiB0f,GAAYp/E,IAC3B0/D,GAAO,GACP,MAAM/8C,GAAI,EAAAuc,EAAA,GAAakgD,GACvBnnF,KAAKiH,SAAS8/E,gBAAgBO,sBAAsBh5E,MAAM5B,IACxDge,EAAEloB,SACFilE,GAAO,EAAM,GACb,IAGJma,EAAal2E,OAAOipB,EAAWvpB,UAAW87E,EAAWC,GAErDd,EAAa36E,OAAOk2E,GAEpB5hF,KAAKm0B,WAAW/oB,UAAUM,OAAOm9B,EAAQz9B,UAC3C,CAEAm8E,qBACMd,EAASzmF,KAAK4mF,UAClB5mF,KAAK8mF,eAAelyD,MAAMC,OAC5B,E,wBChHa,MAAMwyD,UAAuC,IAA5D,c,oBAMS,KAAAT,SAAU,CA6InB,CA3ISvwD,OACLr2B,KAAKoL,UAAUmI,UAAUxS,IAAI,wBAAyB,+BACtDf,KAAK2hF,SAAS,sBAEd,MAAM94C,EAAU,IAAI,IAAe,CACjCy4C,YAAY,EACZzY,aAAa,IAITud,EAAmB/6E,SAASC,cAAc,QAEhD,OAAiB,CACf8iB,IAAKg4D,EACLl/D,MAAO,IACPI,OAAQ,IACRm+B,MAPY,OAUd5c,EAAQl2B,QAAQjH,OAAO06E,GAEvB,MAAMC,EAAex9C,EAAQu4C,yBAEvBQ,EAAev2E,SAASC,cAAc,OAC5Cs2E,EAAaruE,UAAUxS,IAAI,iBAE3B,MAAM4zB,EAAa30B,KAAK20B,WAAa,IAAI,KAAW,CAClDzc,KAAM,iBACN+yB,MAAO,gBACPz7B,WAAW,IAGbmlB,EAAWC,MAAMhnB,iBAAiB,YAAa7F,IAC7C,GAAa,UAAVA,EAAEyE,IAEH,OADA,EAAA4N,EAAA,GAAYrS,GACLy/E,G,IAIX7yD,EAAWC,MAAMhnB,iBAAiB,SAAU7F,IAC1C4sB,EAAWC,MAAMrhB,UAAU/Q,OAAO,QAAQ,IAG5C,MAAMilF,GAAc,OAAO,gCAAiC,CAACzzE,KAAM,aAC7D0zE,GAAU,OAAO,4DAA6D,CAAC1zE,KAAM,kBAErFizE,EAAS,KACbjnF,KAAK4kF,OAAOC,UAAUsB,GAA8Bz3D,MAAM,EAGtD84D,EAAkB,KACtB,MAAMX,EAAQlyD,EAAWjoB,MAAM+nB,OACzBlvB,GAAQ,EAAAoiF,EAAA,GAAWd,GACzB,IAAIthF,GAASA,EAAM,GAAG1C,SAAWgkF,EAAMhkF,OAErC,YADA8xB,EAAWC,MAAMrhB,UAAUxS,IAAI,SAIjC6mF,GAAc,GACd,MAAMl9D,GAAI,EAAAuc,EAAA,GAAawgD,GAEvBznF,KAAKiH,SAAS8/E,gBAAgBc,eAAe,CAC3C3R,KAAMl2E,KAAKk2E,KACX4R,gBAAiB9nF,KAAK+nF,cACtBC,YAAahoF,KAAKgoF,YAClBnB,UACCv4E,MAAM5B,IACPu6E,GAAQ,IACNzhF,IACF,GAAGA,EAAI5D,KAAKmT,SAAS,qBAAsB,CACzC,MAAMkzE,GAAWziF,EAAI5D,KAAK2D,MAAM,4BAA4B,GAEtD2N,EAAMlT,KAAK4kF,OAAOC,UAAU8B,GAClCzzE,EAAIwd,MAAQ1wB,KAAK0wB,MACjBxd,EAAI2zE,MAAQA,EACZ3zE,EAAIrQ,OAASolF,EACb/0E,EAAIwb,M,MAEJtiB,QAAQqV,IAAI,qBAAsBjc,GAGpCoiF,GAAc,GACdl9D,EAAEloB,QAAQ,GACV,GAEJ,QAAiBilF,EAAaD,GAE9B,MAAMI,EAAiBngB,IAClBA,GACDggB,EAAY95E,aAAa,WAAY,QACrC+5E,EAAQ/5E,aAAa,WAAY,UAEjC85E,EAAYt8B,gBAAgB,YAC5Bu8B,EAAQv8B,gBAAgB,Y,GAI5B,QAAiBu8B,GAAU3/E,IACX,IAAI,IAAU,mBAAoB,CAC9C8L,QAAS,CAAC,CACR6mD,QAAS,SACT/W,UAAU,GACT,CACD+W,QAAS,gBACTtkC,SAAU,KAERwxD,GAAc,IACd,EAAA3gD,EAAA,GAAaygD,GACb1nF,KAAKiH,SAAS8/E,gBAAgBc,eAAe,CAC3C3R,KAAMl2E,KAAKk2E,KACX4R,gBAAiB9nF,KAAK+nF,cACtBC,YAAahoF,KAAKgoF,YAClBnB,MAAO,KACNv4E,MAAK,KACN24E,GAAQ,IACNzhF,IACFoiF,GAAc,EAAM,GACpB,EAEJzU,UAAU,IAEZ3Y,aAAc,uBACdC,mBAAoB,6BAGhB5rC,MAAM,IAGd+yD,EAAal2E,OAAOipB,EAAWvpB,UAAWq8E,EAAaC,GAEvDrB,EAAa36E,OAAOk2E,GAEpB5hF,KAAKm0B,WAAW/oB,UAAUM,OAAOm9B,EAAQz9B,UAC3C,CAEAm8E,qBACMd,EAASzmF,KAAK4mF,UAClB5mF,KAAK20B,WAAWC,MAAMC,OACxB,E,gECrJa,MAAMqzD,WAAsC,IAMlD7xD,OACLr2B,KAAKoL,UAAUmI,UAAUxS,IAAI,wBAAyB,8BACtDf,KAAK2hF,SAAS,8BAEd,MAAM94C,EAAU,IAAI,IAAe,CACjCggC,aAAa,IAITud,EAAmB/6E,SAASC,cAAc,QAChD,OAAiB,CACf8iB,IAAKg4D,EACLl/D,MAAO,IACPI,OAAQ,IACRm+B,MANY,OASd5c,EAAQl2B,QAAQjH,OAAO06E,GAEvB,MAAMxE,EAAev2E,SAASC,cAAc,OAC5Cs2E,EAAaruE,UAAUxS,IAAI,iBAE3B,MAAM4zB,EAAa30B,KAAK20B,WAAa,IAAI,KAAW,CAClDzc,KAAM,OACN+yB,MAAO,qCAGTtW,EAAWC,MAAMhnB,iBAAiB,YAAa7F,IAC7C,GAAa,UAAVA,EAAEyE,IAEH,OADA,EAAA4N,EAAA,GAAYrS,GACL4sB,EAAWjoB,MAAQ86E,IAAoBW,G,IAIlD,MAAMlB,EAAS,CAACl/E,EAAWqgF,KACtBrgF,IACD,EAAAqS,EAAA,GAAYrS,GAGd,MAAMmuE,EAAOkS,EAAWzzD,EAAWjoB,WAAQzI,EAC3C,GAAGiyE,GAAQl2E,KAAKgoF,cAAgB9R,EAE9B,YADA,EAAAzmD,GAAA,IAAM,YAAY,uBAAuB,IAI3C,MAAMvc,EAAMlT,KAAK4kF,OAAOC,UAAUwC,GAClCn0E,EAAIwd,MAAQ1wB,KAAK0wB,MACjBxd,EAAI60E,cAAgB/nF,KAAK+nF,cACzB70E,EAAI80E,YAAchoF,KAAKgoF,YACvB90E,EAAIgjE,KAAOA,EAEXhjE,EAAIwb,MAAM,EAGN+4D,GAAc,OAAO,gCAAiC,CAACzzE,KAAM,aAC7D0zE,GAAU,OAAO,4DAA6D,CAAC1zE,KAAM,kBAErFwzE,EAAmBz/E,GAAck/E,EAAOl/E,GAAG,GAC3CogF,EAAepgF,GAAck/E,EAAOl/E,GAAG,IAC7C,QAAiB0/E,EAAaD,IAC9B,QAAiBE,EAASS,GAE1BvG,EAAal2E,OAAOipB,EAAWvpB,UAAWq8E,EAAaC,GAEvD7+C,EAAQl2B,QAAQjH,OAAOk2E,GAEvB5hF,KAAKm0B,WAAW/oB,UAAUM,OAAOm9B,EAAQz9B,UAC3C,CAEAm8E,qBACEvnF,KAAK20B,WAAWC,MAAMC,OACxB,EC9Ea,MAAMwzD,WAAiD,IAM7DhyD,OACLr2B,KAAKoL,UAAUmI,UAAUxS,IAAI,wBAAyB,uCAAwC,2CAC9Ff,KAAK2hF,SAAS,yBAEd,MAAM94C,EAAU,IAAI,IAAe,CACjCggC,aAAa,IAGT+Y,EAAev2E,SAASC,cAAc,OAC5Cs2E,EAAaruE,UAAUxS,IAAI,iBAE3B,MAAMwkE,EAAqBvlE,KAAKulE,mBAAqB,IAAI,IAAmB,CAC1ErtD,KAAM,oBACN+yB,MAAO,0BAGHq9C,EAAS,IAAI,IAAe/iB,EAAoB,KAEhDkiB,GAAc,OAAO,gCAAiC,CAACzzE,KAAM,aAEnE4tE,EAAal2E,OAAO65D,EAAmBn6D,UAAWq8E,GAClD5+C,EAAQl2B,QAAQjH,OAAO48E,EAAOl9E,UAAWw2E,GAEzC5hF,KAAKm0B,WAAW/oB,UAAUM,OAAOm9B,EAAQz9B,WAEzCm6D,EAAmB3wC,MAAMhnB,iBAAiB,YAAa7F,IAKrD,GAJGw9D,EAAmB3wC,MAAMrhB,UAAUqB,SAAS,UAC7C2wD,EAAmBvD,SAAS,cAGjB,UAAVj6D,EAAEyE,IACH,OAAOg7E,G,IAIX,MAAMe,EAAc,IACfvoF,KAAKgoF,cAAgBziB,EAAmB74D,QACzC64D,EAAmBrD,YACZ,GAMLslB,EAAmBz/E,IAKvB,GAJGA,IACD,EAAAqS,EAAA,GAAYrS,IAGVwgF,IAAe,OAEnB,MAAMr1E,EAAMlT,KAAK4kF,OAAOC,UAAUqD,IAClCh1E,EAAIwd,MAAQ1wB,KAAK0wB,MACjBxd,EAAI60E,cAAgB/nF,KAAK+nF,cACzB70E,EAAI80E,YAAchoF,KAAKgoF,YACvB90E,EAAIwb,MAAM,EAIZ,OAFA,QAAiB+4D,EAAaD,GAEvBc,EAAO1lF,MAChB,CAEA2kF,qBACEvnF,KAAKulE,mBAAmB3wC,MAAMC,OAChC,EChEa,MAAM2zD,WAA+C,IAApE,c,oBAIS,KAAA5B,SAAU,CAgJnB,CA9ISvwD,OACL,MAAMoyD,GAASzoF,KAAK0wB,MAAMjjB,OAAOi7E,cAAgB1oF,KAAK+nF,cACtD/nF,KAAKoL,UAAUmI,UAAUxS,IAAI,wBAAyB,wCACtDf,KAAK2hF,SAAS8G,EAAQ,2BAA6B,8BAEnD,MAAM5/C,EAAU,IAAI,IAAe,CACjCggC,aAAa,IAGT+Y,EAAev2E,SAASC,cAAc,OAC5Cs2E,EAAaruE,UAAUxS,IAAI,iBAE3B,MAAMwkE,EAAqBvlE,KAAKulE,mBAAqB,IAAI,IAAmB,CAC1ErtD,KAAM,iBACN+yB,MAAOw9C,EAAQ,2BAA8BzoF,KAAK0wB,MAAMwlD,UAAOjyE,EAAY,gBAC3E08D,WAAY8nB,GAASzoF,KAAK0wB,MAAMwlD,MAAO,EAAA5pD,EAAA,GAActsB,KAAK0wB,MAAMwlD,WAAQjyE,IAGpEqkF,EAAS,IAAI,IAAe/iB,EAAoB,KAEhDkiB,GAAc,OAAO,iCACrBkB,EAAS,IAAI,iBAAiB,CAACn8E,IAAK,aAE1Ci7E,EAAY/7E,OAAOi9E,EAAOzmF,SAE1B0/E,EAAal2E,OAAO65D,EAAmBn6D,UAAWq8E,GAClD5+C,EAAQl2B,QAAQjH,OAAO48E,EAAOl9E,UAAWw2E,GAEzC5hF,KAAKm0B,WAAW/oB,UAAUM,OAAOm9B,EAAQz9B,WAEzCm6D,EAAmB3wC,MAAMhnB,iBAAiB,YAAa7F,IAOrD,GANGw9D,EAAmB3wC,MAAMrhB,UAAUqB,SAAS,WAC7C2wD,EAAmB3wC,MAAMrhB,UAAU/Q,OAAO,SAC1CmmF,EAAOn8E,IAAM,WACbm8E,EAAOzmD,UAGI,UAAVn6B,EAAEyE,IACH,OAAOg7E,G,IAIX,MAAMe,EAAc,MACdhjB,EAAmB74D,MAAM7J,SAC3B0iE,EAAmB3wC,MAAMrhB,UAAUxS,IAAI,UAChC,GAMX,IAAIymF,EACJ,GAAIiB,EAkEFjB,EAAmBz/E,IAKjB,GAJGA,IACD,EAAAqS,EAAA,GAAYrS,IAGVwgF,IAAe,OAEnB,MAAMr1E,EAAMlT,KAAK4kF,OAAOC,UAAUwD,IAClCn1E,EAAIwd,MAAQ1wB,KAAK0wB,MACjBxd,EAAI80E,YAAcziB,EAAmB74D,MACrCwG,EAAI60E,cAAgB/nF,KAAK+nF,cACzB70E,EAAIwb,MAAM,MA7EH,CACT,IAAIk6D,EAEJ,MAAMC,EAAW,KAEXD,IACFA,EAAmBl1E,OAAOw2D,YAAY2e,EAAU,MAG3C7oF,KAAKiH,SAAS8/E,gBAAgB8B,WAAWv6E,MAAMw6E,IACpD9oF,KAAK0wB,MAAQo4D,EAEV9oF,KAAK0wB,MAAMwlD,MACZ,EAAAh4C,EAAA,GAAaqnC,EAAmBt6B,OAAO,EAAA3e,EAAA,GAActsB,KAAK0wB,MAAMwlD,QAEhE,EAAArpD,EAAA,GAAe04C,EAAmBt6B,OAAO,QAAK,iB,KA+CpDu8C,EA1CgBz/E,IACd,IAAIwgF,IAEF,YADA,EAAAnuE,EAAA,GAAYrS,GAId0/E,EAAY95E,aAAa,WAAY,QACrCg7E,EAAOn8E,IAAM,aACbm8E,EAAOzmD,SACP,MAAM/lB,GAAY,EAAA8qB,EAAA,GAAawgD,GAEzBM,EAAgBxiB,EAAmB74D,MACzC1M,KAAKiH,SAAS8/E,gBAAgBgC,MAAMxjB,EAAmB74D,MAAO1M,KAAK0wB,OAAOpiB,MAAM06E,IAG9E,GAFA58E,QAAQqV,IAAIunE,GAEE,uBAAXA,EAAKp5E,EAA4B,CAClC+8D,cAAcic,GACXN,GAAQA,EAAO9lF,SAClB,MAAM0Q,EAAMlT,KAAK4kF,OAAOC,UAAUoE,IAClC/1E,EAAIwd,MAAQ1wB,KAAK0wB,MACjBxd,EAAI60E,cAAgBA,EACpB70E,EAAIwb,OACJ1uB,KAAK4kF,OAAOsE,qBAAqBlpF,K,KAEjCwF,IACFiiF,EAAYt8B,gBAAgB,YAC5Boa,EAAmB3wC,MAAMrhB,UAAUxS,IAAI,SAEhCyE,EAAI5D,KAGP+mF,EAAOn8E,IAAM,wBACbm8E,EAAOzmD,SACP/lB,EAAU3Z,SACV+iE,EAAmB1f,SAIvBgjC,GAAU,GACV,EAKJA,G,CAmBF,OAFA,QAAiBpB,EAAaD,GAEvBc,EAAO1lF,MAChB,CAEA2kF,qBACMd,EAASzmF,KAAK4mF,UAClB5mF,KAAKulE,mBAAmB3wC,MAAMC,OAChC,ECxJa,MAAMo0D,WAAkC,IAI9C5yD,OACLr2B,KAAKoL,UAAUmI,UAAUxS,IAAI,wBAAyB,8BACtDf,KAAK2hF,SAAS,4BAEd,MAAM94C,EAAU,IAAI,IAAe,CACjCy4C,YAAY,EACZzY,aAAa,IAITud,EAAmB/6E,SAASC,cAAc,QAEhD,OAAiB,CACf8iB,IAAKg4D,EACLl/D,MAAO,IACPI,OAAQ,IACRm+B,MAPY,OAUd5c,EAAQl2B,QAAQjH,OAAO06E,GAEvB,MAAM5gD,EAAIqD,EAAQu4C,yBAClB,GAAGphF,KAAK0wB,MAAMjjB,OAAOi7E,aAAc,EACjC,QAAM7/C,EAAQv1B,QAAS,2BAEvB,MAAM61E,GAAoB,OAAO,8BAA+B,CAACp1E,KAAM,OAAQC,KAAM,+BAC/Eo1E,GAAqB,OAAO,8BAA+B,CAACr1E,KAAM,cAAeC,KAAM,+BACvFq1E,GAAsB,OAAO,8BAA+B,CAACt1E,KAAM,QAASC,KAAMhU,KAAK0wB,MAAMjjB,OAAO67E,aAAe,0BAA4B,4BAErJ,QAAiBH,GAAmB,KAClC,MAAMj2E,EAAMlT,KAAK4kF,OAAOC,UAAU2D,IAClCt1E,EAAIwd,MAAQ1wB,KAAK0wB,MACjBxd,EAAI60E,cAAgB/nF,KAAK+nF,cACzB70E,EAAIwb,MAAM,KAGZ,QAAiB06D,GAAoB,KACrB,IAAI,IAAU,yBAA0B,CACpDv1E,QAAS,CAAC,CACR6mD,QAAS,UACTtkC,SAAU,KACRp2B,KAAKiH,SAAS8/E,gBAAgBc,eAAe,CAACC,gBAAiB9nF,KAAK+nF,gBAAgBz5E,MAAK,KACvFtO,KAAK4kF,OAAO2B,kBAAkBC,GAAgBxmF,MAC9CA,KAAK4S,OAAO,GACZ,EAEJugE,UAAU,IAEZ3Y,aAAc,+BACdC,mBAAoB,4BAGhB5rC,MAAM,KAGd,QAAiBw6D,GAAqB,KACpC,MAAMn2E,EAAMlT,KAAK4kF,OAAOC,UAAUwC,GAClCn0E,EAAIwd,MAAQ1wB,KAAK0wB,MACjBxd,EAAIgjE,KAAOl2E,KAAK0wB,MAAMwlD,KACtBhjE,EAAI60E,cAAgB/nF,KAAK+nF,cACzB70E,EAAI80E,YAAchoF,KAAK+nF,cACvB70E,EAAI0zE,SAAU,EACd1zE,EAAIwb,MAAM,IAGZ8W,EAAE95B,OAAOy9E,EAAmBC,EAAoBC,E,KAC3C,EACL,QAAMxgD,EAAQv1B,QAAS,+BAEvB,MAAMsuE,EAAev2E,SAASC,cAAc,OAC5Cs2E,EAAaruE,UAAUxS,IAAI,iBAE3B,MAAMwoF,GAAiB,OAAO,gCAAiC,CAACv1E,KAAM,mCAEtE4tE,EAAal2E,OAAO69E,GACpB/jD,EAAE95B,OAAOk2E,IAET,QAAiB2H,GAAiBxhF,IAChC,MAAMmL,EAAMlT,KAAK4kF,OAAOC,UAAU2D,IAClCt1E,EAAIwd,MAAQ1wB,KAAK0wB,MACjBxd,EAAIwb,MAAM,G,CAId1uB,KAAKm0B,WAAW/oB,UAAUM,OAAOm9B,EAAQz9B,UAC3C,ECjGa,MAAMo+E,WAA8B,IAC1CnzD,OACLr2B,KAAKoL,UAAUmI,UAAUxS,IAAI,cAAe,qBAC5Cf,KAAK2hF,SAAS,mBAEd,MAAMruE,EAAuB,gDAC7B,IAAI0wE,EAAe,CACjB9wE,IAAKlT,KACL+O,MAAO,gBACPu2E,SAAU,iCACVpB,SAAU,CAAC5wE,EAASA,EAASA,GAC7BmxE,eAAgB,CAAC,uCAAwC,yCACzDl7C,SAAUvpC,KAAKm0B,WACfltB,SAAUjH,KAAKiH,UAEnB,ECda,MAAMwiF,WAAkC,IAC9CpzD,OACLr2B,KAAKoL,UAAUmI,UAAUxS,IAAI,cAAe,yBAC5Cf,KAAK2hF,SAAS,uBAEd,MAAMruE,EAAuB,oDAC7B,IAAI0wE,EAAe,CACjB9wE,IAAKlT,KACL+O,MAAO,2BACPu2E,SAAU,8BACVpB,SAAU,CAAC5wE,EAASA,EAASA,GAC7BmxE,eAAgB,CAAC,uCAAwC,yCACzDl7C,SAAUvpC,KAAKm0B,WACfowD,UAAW,CAAC,UACZt9E,SAAUjH,KAAKiH,UAEnB,ECjBa,MAAMyiF,WAAqC,IACjDrzD,OACLr2B,KAAKoL,UAAUmI,UAAUxS,IAAI,cAAe,4BAC5Cf,KAAK2hF,SAAS,4BAEd,MAAMruE,EAAuB,gDAC7B,IAAI0wE,EAAe,CACjB9wE,IAAKlT,KACL+O,MAAO,uBACPu2E,SAAU,0BACVpB,SAAU,CAAC5wE,EAASA,EAASA,GAC7BmxE,eAAgB,CAAC,uCAAwC,yCACzDl7C,SAAUvpC,KAAKm0B,WACfltB,SAAUjH,KAAKiH,UAEnB,ECda,MAAM0iF,WAAiC,IAC7CtzD,OACLr2B,KAAKoL,UAAUmI,UAAUxS,IAAI,cAAe,yBAC5Cf,KAAK2hF,SAAS,0BAEd,MAAMruE,EAAuB,6CAC7B,IAAI0wE,EAAe,CACjB9wE,IAAKlT,KACL+O,MAAO,cACPu2E,SAAU,4BACVpB,SAAU,CAAC5wE,EAASA,EAASA,GAC7BmxE,eAAgB,CAAC,uCAAwC,yCACzDl7C,SAAUvpC,KAAKm0B,WACfowD,UAAW,CAAC,UACZt9E,SAAUjH,KAAKiH,UAEnB,ECjBa,MAAM2iF,WAA2B,IACvCvzD,OACLr2B,KAAKoL,UAAUmI,UAAUxS,IAAI,cAAe,iBAC5Cf,KAAK2hF,SAAS,8BAEd,MAAMruE,EAAuB,iDAC7B,IAAI0wE,EAAe,CACjB9wE,IAAKlT,KACL+O,MAAO,eACPu2E,SAAU,2BACVpB,SAAU,CAAC5wE,EAASA,EAASA,GAC7BmxE,eAAgB,CAAC,uCAAwC,yCACzDl7C,SAAUvpC,KAAKm0B,WACfltB,SAAUjH,KAAKiH,WAGjB,CACE,MAAMqM,EAAuB,qCAC7B,IAAI0wE,EAAe,CACjB9wE,IAAKlT,KACL+O,MAAO,mBACPu2E,SAAU,0BACVpB,SAAU,CAAC5wE,EAASA,EAASA,GAC7BmxE,eAAgB,CAAC,uCAAwC,yCACzDl7C,SAAUvpC,KAAKm0B,WACfltB,SAAUjH,KAAKiH,U,CAGrB,E,sECda,MAAM4iF,WAA6B,IAIzCxzD,OACLr2B,KAAKoL,UAAUmI,UAAUxS,IAAI,6BAC7Bf,KAAK2hF,SAAS,iBAEd,MAAMmI,EAAWd,IACf,MAAMpqD,EAAM,IAAI,KAAI,CAClB7vB,MAAO,CAACi6E,EAAKe,SAAUf,EAAKgB,aAAa5hE,KAAK,KAC9C0W,SAAU,CAACkqD,EAAKiB,GAAIjB,EAAKllC,SAAS17B,KAAK,OACvC6K,WAAW,EACX4L,WAAYmqD,EAAKv7E,OAAOhF,aAAUxE,GAAY,QAA8B,IAAIoZ,KAAqD,IAAhD7W,KAAKC,IAAIuiF,EAAKkB,YAAalB,EAAKmB,kBAOvH,OAJAvrD,EAAIxzB,UAAU2e,QAAQyG,KAAO,GAAKw4D,EAAKx4D,KAEvCoO,EAAI6/C,SAAS7lE,YAAc,CAACowE,EAAKoB,aAAcpB,EAAKqB,gBAAkBrB,EAAKsB,UAAUv6D,OAAO+M,SAAS1U,KAAK,MAEnGwW,CAAG,EAGN2rD,EAAiBvqF,KAAKuqF,eAAez6D,QAE3C,CACE,MAAM+Y,EAAU,IAAI,IAAe,CACjC3wB,KAAM,iBACN5E,QAAS,2BAGL01E,GAAO,EAAAnjD,GAAA,GAAc0kD,GAAgBvB,GAAQA,EAAKv7E,OAAOhF,UACzD+hF,EAAUV,EAAQd,GAIxB,GAFAngD,EAAQl2B,QAAQjH,OAAO8+E,EAAQp/E,WAE5Bm/E,EAAe1nF,OAAQ,CACxB,MAAM4nF,GAAe,OAAO,qCAAsC,CAAC12E,KAAM,OAAQC,KAAM,0BACvF,QAAiBy2E,GAAe1iF,IAC9B,IAAI,IAAU,iBAAkB,CAC9B8L,QAAS,CAAC,CACR6mD,QAAS,YACTyY,UAAU,EACV/8C,SAAU,KACR,MAAMvsB,GAAS,EAAAw4C,EAAA,GAAiB,CAACooC,IAAe,GAChDzqF,KAAKiH,SAAS4zD,WAAW6vB,UAAU,4BAA4Bp8E,MAAM5B,IAEnE+9E,EAAajoF,SACbmoF,EAAav/E,UAAU5I,QAAQ,GAC9BooF,GAASzyE,SAAQ,KAClBtO,GAAQ,GACR,IAGN2wD,aAAc,0BACdC,mBAAoB,uBACnB5rC,MAAM,GACR,CAAChd,eAAgB7R,KAAK6R,iBAEzBg3B,EAAQl2B,QAAQjH,OAAO++E,E,CAGzBzqF,KAAKm0B,WAAWzoB,OAAOm9B,EAAQz9B,U,CAGjC,IAAIm/E,EAAe1nF,OACjB,OAGF,MAAM8nF,EAAe,IAAI,IAAe,CACtCzyE,KAAM,gBACN5E,QAAS,qBAGXi3E,EAAexlF,SAASikF,IACtB2B,EAAah4E,QAAQjH,OAAOo+E,EAAQd,GAAM59E,UAAU,IAGtDpL,KAAKm0B,WAAWzoB,OAAOi/E,EAAav/E,WAEpC,MAAMw/E,EAAWplF,IACC,wCAAbA,EAAI5D,OACL,EAAA6tB,GAAA,IAAM,YAAY,mCAAmC,G,EAIzD,IAAIpvB,EACJ,MAAMwqF,EAAmB,KACvB,MAAMr6D,EAAOnwB,EAAO0pB,QAAQyG,KAE5B,IAAI,IAAU,iBAAkB,CAC9B3c,QAAS,CAAC,CACR6mD,QAAS,YACTyY,UAAU,EACV/8C,SAAU,KACRp2B,KAAKiH,SAAS4zD,WAAW6vB,UAAU,6BAA8B,CAACl6D,SACjEliB,MAAM5B,IACFA,GACDrM,EAAOmC,Q,GAERooF,EAAQ,IAGfpwB,aAAc,yBACdC,mBAAoB,yBACnB5rC,MAAM,EAGL3sB,EAAUlC,KAAK8qF,aAAc,QAAe,CAChDj3E,QAAS,CAAC,CACRE,KAAM,OACNC,KAAM,YACNC,QAAS42E,MAGb3oF,EAAQ0F,GAAK,8BACb1F,EAAQqR,UAAUxS,IAAI,eAEtBsK,SAASkR,eAAe,cAAc7Q,OAAOxJ,IAE7C,EAAAi0B,GAAA,GAA0B,CACxBj0B,QAASlC,KAAKm0B,WAAW/oB,UACzBgrB,SAAWruB,IACT1H,GAAS,EAAA4gB,GAAA,GAAgBlZ,EAAE1H,OAAQ,OAC/BA,GAAkC,MAAxBA,EAAO0pB,QAAQyG,OAI1BzoB,aAAauuB,YAAYvuB,EAAEwuB,iBAE3BxuB,aAAauuB,aAAYvuB,EAAEyuB,cAAe,IAE7C,EAAAK,GAAA,GAAa9uB,EAAG7F,GAChB40B,GAAA,cAAkC50B,GAAQ,EAE5C2P,eAAgB7R,KAAK6R,kBAGvB,QAAiB7R,KAAKm0B,WAAW/oB,WAAYrD,IAC3C1H,GAAS,EAAA4gB,GAAA,GAAgBlZ,EAAE1H,OAAQ,OAC/BA,GAAkC,MAAxBA,EAAO0pB,QAAQyG,MAI7Bq6D,GAAkB,GACjB,CAACh5E,eAAgB7R,KAAK6R,gBAC3B,CAEAo4C,sB,MAEE,OADgB,QAAhB,EAAAjqD,KAAK8qF,mBAAW,SAAEtoF,SACX0P,MAAM+3C,qBACf,E,gDCzJa,MAAM8gC,WAA2B,IAIvC10D,OACLr2B,KAAKoL,UAAUmI,UAAUxS,IAAI,2BAC7Bf,KAAK2hF,SAAS,gBAEd,MAAM94C,EAAU,IAAI,IAAe,CACjCv1B,QAAS,qBAGXu1B,EAAQv1B,QAAQ2F,cAAcjB,QAAQ6wB,EAAQv1B,SAE9CtT,KAAKm0B,WAAWzoB,OAAOm9B,EAAQz9B,WAE/B,MAAM4/E,GAAS,OAAa,CAACj3E,KAAM,MAAOsH,UAAW,eACrDrb,KAAK2S,QAAQjH,OAAOs/E,IAEpB,QAAiBA,GAASjjF,IACxB,IAAI,KAAc,CAChBisE,UAAW,CAAC,YACZzwE,YAAa,gCACbkvE,SAAWzqE,IAEThI,KAAKiH,SAASk6B,gBAAgB8pD,YAAYjjF,GAAQ,EAAK,GAEzD,GACD,CAAC6J,eAAgB7R,KAAK6R,iBAEzB,MAAMwhB,EAAOoI,EAAA,yBACbz7B,KAAKm0B,WAAW/oB,UAAUmI,UAAUxS,IAAI,sBACxC8nC,EAAQl2B,QAAQjH,OAAO2nB,GAEvB,MAAMtyB,EAAM,CAAMiH,EAAgB0D,KAAoB,O,EAAA,K,OAAA,E,EAAA,YACpD,MAAM,IAACy0B,GAAO1E,EAAA,qBAA+B,CAC3CzzB,OAAQA,EACRoD,UAAWioB,EACXkQ,eAAe,EACfnO,WAAY,aACZ1pB,WAGIw1B,QAAalhC,KAAKiH,SAASk6B,gBAAgBC,QAAQp5B,EAAO+6B,YAChE,IAAI7B,EACF,OAGF,MACMF,GADY,EAAAiqC,GAAA,GAAuB/pC,GACd,GACxBA,EAAKzzB,OAAOy9E,IACb/qD,EAAIU,gBAAgBn1B,OAAO,IAAMs1B,GAE9BE,EAAKG,MAAOlB,EAAIU,gBAAgB9d,WAAY,EAAAmoD,GAAA,GAAgBhqC,EAAKG,OAC/DlB,EAAIU,gBAAgBn1B,OAAOs1B,EAAW,IAAMA,GAAW,EAAA8B,EAAA,GAAoB5B,GAKpF,E,YAzBsD,K,6QAyBrD,EAED,IAAI,MAAMl5B,KAAUhI,KAAKyoC,QACvB1nC,EAAIiH,GAAQ,GAGd,IAAI3H,EACJ,MAKM6B,EAAUlC,KAAK8qF,aAAc,QAAe,CAChDj3E,QAAS,CAAC,CACRE,KAAM,UACNC,KAAM,UACNC,QATc,KAChB,MAAMjM,EAAS3H,EAAO0pB,QAAQ/hB,OAAOyuB,WACrCz2B,KAAKiH,SAASk6B,gBAAgB8pD,YAAYjjF,GAAQ,EAAM,EAQtD0pB,QAAS,CAAC7f,eAAgB7R,KAAK6R,oBAGnC3P,EAAQ0F,GAAK,4BACb1F,EAAQqR,UAAUxS,IAAI,eAEtBsK,SAASkR,eAAe,cAAc7Q,OAAOxJ,IAE7C,EAAAi0B,GAAA,GAA0B,CACxBj0B,QAASlC,KAAKm0B,WAAW/oB,UACzBgrB,SAAWruB,IACT1H,GAAS,EAAAojC,GAAA,GAAU17B,EAAE1H,OAAQ,EAAAqjC,yBACzBrjC,IAID0H,aAAauuB,YAAYvuB,EAAEwuB,iBAE3BxuB,aAAauuB,aAAYvuB,EAAEyuB,cAAe,IAE7C,EAAAK,GAAA,GAAa9uB,EAAG7F,GAChB40B,GAAA,cAAkC50B,GAAQ,EAE5C2P,eAAgB7R,KAAK6R,iBAGvB7R,KAAK6R,eAAe9Q,IAAIygB,EAAA,EAAxBxhB,CAAmC,cAAekiC,IAChD,MAAM,OAACl6B,EAAM,QAAEmjF,GAAWjpD,EACpBsB,EAAKnQ,EAAKzb,cAAc,kBAAkB5P,OAC7CmjF,EACG3nD,GACFziC,EAAIiH,GAAQ,GAGXw7B,GACDA,EAAGhhC,Q,IAMT,IAAI2sB,GAAU,EACdnvB,KAAKm0B,WAAWK,iBAAmB,KAC9BrF,IAIHA,GAAU,EACVnvB,KAAKiH,SAASk6B,gBAAgBiqD,WAAW/3D,EAAKE,kBAR7B,IAQ4DjlB,MAAM0mB,IACjF,IAAI,MAAMhtB,KAAUgtB,EAAIyT,QACtB1nC,EAAIiH,GAAQ,IAGXgtB,EAAIyT,QAAQ5lC,OAbA,IAauBwwB,EAAKE,oBAAsByB,EAAIC,SACnEj1B,KAAKm0B,WAAWK,iBAAmB,MAGrCx0B,KAAKm0B,WAAW0Q,kBAAkB,IACjC1sB,SAAQ,KACTgX,GAAU,CAAK,IACf,CAEN,CAEAo4D,qBACEvnF,KAAKm0B,WAAWsG,UAClB,CAEAwvB,sBAKE,OAJGjqD,KAAK8qF,aACN9qF,KAAK8qF,YAAYtoF,SAGZ0P,MAAM+3C,qBACf,E,eC5Ka,SAASohC,GAAqB7+E,GAG3C,MADM,SADAA,EAAI,GAAG8+E,cAAgB9+E,EAAIsjB,MAAM,GAGzC,C,yBCMe,MAAMy7D,WAA4B,IACxCl1D,OACLr2B,KAAKoL,UAAUmI,UAAUxS,IAAI,cAAe,kBAC5Cf,KAAK2hF,SAAS,wBAEd,MAAMruE,EAAuB,2BAC7B,IAAI0wE,EAAe,CACjB9wE,IAAKlT,KACL+O,MAAO,4BACPu2E,SAAU,+BACVpB,SAAU,CAAC5wE,EAASA,EAASA,GAC7BmxE,eAAgB,CAAC,uCAAwC,yCACzDl7C,SAAUvpC,KAAKm0B,WACfltB,SAAUjH,KAAKiH,UAEnB,E,sTCNa,MAAMukF,WAAgC,IACtCn1D,KAAKo1D,G,0CAChBzrF,KAAKoL,UAAUmI,UAAUxS,IAAI,6BAC7Bf,KAAK2hF,SAAS,oBAEd,MAAMmI,EAAgBd,GAA2B,mCAC/C,MAAMhhF,EAASghF,EAAK0C,OAAOj1D,WACrBmI,EAAM,IAAI,KAAI,CAClB7vB,YAAa,QAAc,CAAC/G,WAC5B82B,SAAU,CAACkqD,EAAKiB,GAAIjB,EAAK2C,QAAQvjE,KAAK,OACtC6K,WAAW,EACX4L,YAAY,QAA8B,IAAIxhB,KAAqD,IAAhD7W,KAAKC,IAAIuiF,EAAKkB,YAAalB,EAAKmB,kBAG/EzkF,EAAQk5B,EAAIggD,YAAY,OACxBhY,EAAS,IAAI,IAUnB,OATAA,EAAOrzD,UAAUxS,IAAI,mBACf6lE,EAAOj6C,kBAAkB,CAAC3kB,WAChCtC,EAAMgG,OAAOk7D,GAEbhoC,EAAIxzB,UAAU2e,QAAQyG,KAAO,GAAKw4D,EAAKx4D,KACvCoO,EAAIxzB,UAAU2e,QAAQ/hB,OAAS,GAAKA,EAEpC42B,EAAI6/C,SAAS7lE,YAAc,CAACowE,EAAK4C,OAAQ5C,EAAK6C,QAAS7C,EAAKsB,UAAUv6D,OAAO+M,SAAS1U,KAAK,MAEpFwW,CACT,IAEA,CACE,MAAMiK,EAAU,IAAI,IAAe,CACjCv1B,QAAS,8BAGLm3E,GAAe,OAAO,qCAAsC,CAAC12E,KAAM,OAAQC,KAAM,6BAEvF,QAAiBy2E,GAAc,IAAW,yCAClC,EAAAjnC,GAAA,GAAkB,CACtBiX,mBAAoB,wBACpBnkD,OAAQ,CACNokD,QAAS,aACTyY,UAAU,MAIC,EAAA9wB,EAAA,GAAiB,CAACooC,IAAe,GAChDzqF,KAAKiH,SAAS6kF,wBAAwBC,yBAAyBz9E,MAAK,KAClEtO,KAAK4S,OAAO,GAEhB,KAAG,CAACf,eAAgB7R,KAAK6R,iBAEzBg3B,EAAQl2B,QAAQjH,OAAO++E,GAEvBzqF,KAAKm0B,WAAWzoB,OAAOm9B,EAAQz9B,U,CAGjC,CACE,MAAMy9B,EAAU,IAAI,IAAe,CACjC3wB,KAAM,mBACN5E,QAAS,4BAGLilD,QAAalzC,QAAQqH,IAAI++D,EAAS3wE,IAAIgvE,IAC5CjhD,EAAQl2B,QAAQjH,UAAU6sD,EAAKz9C,KAAK8jB,GAAQA,EAAIxzB,aAEhD,IAAI4gF,EAAazzB,EAAK11D,QACtB,QAAiBgmC,EAAQl2B,SAAe5K,GAAM,mCAC5C,MAAM62B,GAAM,EAAA3d,GAAA,GAAgBlZ,EAAE1H,OAAQ,OACtC,IAAIu+B,EACF,aAGI,EAAA4kB,GAAA,GAAkB,CACtBiX,mBAAoB,0BACpB4Y,oBAAqB,OAAO,QAAc,CAACrrE,OAAQ42B,EAAI7U,QAAQ/hB,OAAOyuB,cACtEngB,OAAQ,CACNokD,QAAS,aACTyY,UAAU,KAId,MAAM3iD,EAAOoO,EAAI7U,QAAQyG,KACzBoO,EAAIrrB,UAAUxS,IAAI,eAClBf,KAAKiH,SAAS6kF,wBAAwBG,sBAAsBz7D,GAAMliB,MAAK,OAC/D09E,EAGJptD,EAAIp8B,SAFJxC,KAAK4S,O,GAKX,KAAG,CAACf,eAAgB7R,KAAK6R,iBAEzB7R,KAAKm0B,WAAWzoB,OAAOm9B,EAAQz9B,U,CAEnC,G,EC3Ea,MAAM8gF,WAAiC,IAO7Cz1E,mBAAmB01E,GACxB,MAAO,CACL7V,UAAW6V,EAAQllF,SAAS4zD,WAAWuxB,eACvCC,cAAeF,EAAQllF,SAASm+E,kBAAkBkH,2BAClDC,gBAAiBJ,EAAQllF,SAAS4zD,WAAW6vB,UAAU,8BACvD8B,kBAAmBL,EAAQllF,SAAS6kF,wBAAwBW,uBAEhE,CAEOp2D,KAAK11B,GACVX,KAAKoL,UAAUmI,UAAUxS,IAAI,wBAC7Bf,KAAK2hF,SAAS,mBAEd,MAAM+K,EAAwB,UACxB3wD,EAA2B,GAEjC,CACE,MAAM8M,EAAU,IAAI,IAAe,CAACggC,aAAa,EAAMv1D,QAAS,iBAEhE,IAAIq5E,EACJ,MAAMC,EAAkB,IAAI,KAAI,CAC9B74E,KAAM,aACNymD,aAAc,eACdwO,gBAAiB0jB,EACjBz5D,UAAW,KACT,MAAM/f,EAAMlT,KAAK4kF,OAAOC,UAAUkG,IAClC73E,EAAIu1B,QAAUkkD,EACdz5E,EAAIwb,MAAM,EAEZ7c,eAAgB7R,KAAK6R,iBAIvB,IAAIg7E,EAFJD,EAAgBllD,SAAU,EAG1B,MAAMolD,EAAsB,CAC1B/4E,KAAM,OACNymD,aAAc,sBACdwO,gBAAiB0jB,EACjBz5D,UAAYlrB,IACV,IAAImL,EACD25E,EAAcp/E,OAAOi7E,aACtBx1E,EAAMlT,KAAK4kF,OAAOC,UAAU2D,IACpBqE,EAAcE,2BACtB75E,EAAMlT,KAAK4kF,OAAOC,UAAU8B,GAC5BzzE,EAAI2zE,MAAQgG,EAAcE,0BAC1B75E,EAAIrQ,OAAS,EACbqQ,EAAI0zE,SAAU,EACd5mF,KAAKiH,SAAS8/E,gBAAgBO,uBAE9Bp0E,EAAMlT,KAAK4kF,OAAOC,UAAUoE,IAG9B/1E,EAAIwd,MAAQm8D,EACZ35E,EAAIwb,MAAM,EAEZ7c,eAAgB7R,KAAK6R,gBAGjBm7E,EAAe,IAAI,KAAIF,GAC7BE,EAAatlD,SAAU,EAEvB,MAAMulD,EAAoBjtF,KAAKitF,kBAAoB,IAAI,KAAI,CACzDl5E,KAAM,iBACNymD,aAAc,gBACdwO,gBAAiB0jB,EACjBz5D,UAAW,KACT,MAAM/f,EAAMlT,KAAK4kF,OAAOC,UAAUgF,IAClC32E,EAAIq3E,eAAiBvqF,KAAKuqF,eAC1Br3E,EAAIsyE,cAAc53E,iBAAiB,WAAW,KAC5C5N,KAAKktF,sBAAsB,GAC1B,CAACj/E,MAAM,IACViF,EAAIwb,MAAM,EAEZ7c,eAAgB7R,KAAK6R,iBAEvBo7E,EAAkBvlD,SAAU,EAE5B,MAAMylD,EAAcntF,KAAKmtF,YAAc,IAAI,KAAI,CAC7Cp5E,KAAM,UACNymD,aAAc,mBACdwO,gBAAiB0jB,EACjBz5D,UAAW,KACT,MAAM/f,EAAMlT,KAAK4kF,OAAOC,UAAU2G,IAClCt4E,EAAIsyE,cAAc53E,iBAAiB,WAAW,KAC5C5N,KAAKotF,sBAAsB,IAE7Bl6E,EAAIwb,KAAK1uB,KAAKqtF,SAAS,EAEzBx7E,eAAgB7R,KAAK6R,iBAEvBs7E,EAAYzlD,SAAU,EAEtBmB,EAAQl2B,QAAQjH,OAAOkhF,EAAgBxhF,UAAW4hF,EAAa5hF,UAAW6hF,EAAkB7hF,UAAW+hF,EAAY/hF,WACnHpL,KAAKm0B,WAAWzoB,OAAOm9B,EAAQz9B,WAE/B,MAAMkiF,EAAmBr4D,IACpBA,GACD,EAAApI,EAAA,GAAe+/D,EAAgB9tD,UAAU,QAAK,sCAAuC,CAAC7J,MAEtF,EAAApI,EAAA,GAAe+/D,EAAgB9tD,UAAU,QAAK,eAAgB,CAAC7J,I,EAInEj1B,KAAK6R,eAAe9Q,IAAIygB,EAAA,EAAxBxhB,CAAmC,cAAc,KAM/CutF,GAAe,IAGjB,MAAMA,EAAgB,KACpBvtF,KAAKiH,SAASk6B,gBAAgBiqD,aAAa98E,MAAM0mB,IAC/C43D,EAAgBllD,SAAU,EAC1B4lD,EAAgBt4D,EAAIC,OACpB03D,EAAiB33D,EAAIyT,OAAO,GAC5B,EAGJ8kD,IAEAvtF,KAAKiH,SAAS8/E,gBAAgB8B,WAAWv6E,MAAMoiB,IAC7Cm8D,EAAgBn8D,GAChB,EAAA7D,EAAA,GAAemgE,EAAaluD,UAAU,QAAKpO,EAAMjjB,OAAOi7E,aAAe,6BAA+B,gCACtGsE,EAAatlD,SAAU,CAAK,IAK9B1nC,KAAKktF,uBACLnxD,EAAS15B,KAAKrC,KAAKotF,qBAAqBzsF,EAAE6rF,mB,CAG5C,CACE,MAAM3jD,EAAU,IAAI,IAAe,CAAC3wB,KAAM,eAAgB5E,QAAS,0BAEnEu1B,EAAQl2B,QAAQY,UAAUxS,IAAI,gCAE9B,MAAMysF,EAED,CAAC,EAEAC,EAAsBD,EAAuC,2BAAI,IAAI,KAAI,CAC7EhzB,aAAc,oBACdwO,gBAAiB0jB,EACjBz5D,UAAW,KACTjzB,KAAK4kF,OAAOC,UAAUgB,GAA0Bn3D,MAAM,EAExD7c,eAAgB7R,KAAK6R,iBAGjB67E,EAAkBF,EAA2C,+BAAI,IAAI,KAAI,CAC7EhzB,aAAc,gBACdwO,gBAAiB0jB,EACjBz5D,UAAW,KACTjzB,KAAK4kF,OAAOC,UAAU2E,IAAuB96D,MAAM,EAErD7c,eAAgB7R,KAAK6R,iBAGjB87E,EAAqBH,EAAwC,4BAAI,IAAI,KAAI,CAC7EhzB,aAAc,2BACdwO,gBAAiB0jB,EACjBz5D,UAAW,KACTjzB,KAAK4kF,OAAOC,UAAU4E,IAA2B/6D,MAAM,EAEzD7c,eAAgB7R,KAAK6R,iBAGjB+7E,EAAUJ,EAAqC,yBAAI,IAAI,KAAI,CAC/DhzB,aAAc,eACdwO,gBAAiB0jB,EACjBz5D,UAAW,KACTjzB,KAAK4kF,OAAOC,UAAU+E,IAAoBl7D,MAAM,EAElD7c,eAAgB7R,KAAK6R,iBAGjBg8E,EAAiBL,EAAoC,wBAAI,IAAI,KAAI,CACrEhzB,aAAc,uBACdwO,gBAAiB0jB,EACjBz5D,UAAW,KACTjzB,KAAK4kF,OAAOC,UAAU6E,IAA8Bh7D,MAAM,EAE5D7c,eAAgB7R,KAAK6R,iBAGjBi8E,EAAmBN,EAAsC,0BAAI,IAAI,KAAI,CACzEhzB,aAAc,cACdwO,gBAAiB0jB,EACjBz5D,UAAW,KACTjzB,KAAK4kF,OAAOC,UAAU8E,IAA0Bj7D,MAAM,EAExD7c,eAAgB7R,KAAK6R,iBAGjBk8E,EAAYP,EAAyC,6BAAI,IAAI,KAAI,CACrEhzB,aAAc,4BACdwO,gBAAiB0jB,EACjBz5D,UAAW,KACLzR,EAAA,UAGFxhB,KAAK4kF,OAAOC,UAAU0G,IAAqB78D,QAF3C,EAAAe,GAAA,IAAS,CAACC,YAAa,mC,EAK3B7d,eAAgB7R,KAAK6R,iBAGjBm8E,EAAoBxhF,IACxB,MAAMoyB,EAAM4uD,EAAWhhF,GACnBoyB,GAIJ5+B,KAAKiH,SAASm+E,kBAAkBC,WAAW74E,GAAK8B,MAAMm1E,IACpD,MAAMp9E,EAAUm9E,EAAuBC,GACjC/oB,EAAUr0D,EAAQzE,OAAS,YAAwB,qCAAwCyE,EAAQzE,OAAS,WAAuB,uCAAyC,mCAC5KqsF,EAAiB5nF,EAAQy9E,cAAcF,MAAM/gF,OAASwD,EAAQy9E,cAAcD,MAAMhhF,OAClFqrF,EAAc7nF,EAAQs9E,WAAWC,MAAM/gF,OAASwD,EAAQs9E,WAAWE,MAAMhhF,OAE/E+7B,EAAIE,SAAS/b,UAAY,GACzB,MAAMhZ,GAAI,QAAK2wD,GACf97B,EAAIE,SAASpzB,OAAO3B,IACjBkkF,GAAkBC,IACnBtvD,EAAIE,SAASpzB,OAAO,KAAK,EAAEuiF,EAAgBC,EAAc,IAAMA,EAAc,GAAGn+D,OAAO+M,SAAS1U,KAAK,S,GAEvG,EAGJygB,EAAQl2B,QAAQjH,OACd+hF,EAAoBriF,UACpBsiF,EAAgBtiF,UAChBuiF,EAAmBviF,UACnBwiF,EAAQxiF,UACRyiF,EAAeziF,UACf0iF,EAAiB1iF,UACjB2iF,EAAU3iF,WAEZpL,KAAKm0B,WAAWzoB,OAAOm9B,EAAQz9B,WAE/B,IAAI,MAAMoB,KAAOghF,EACfQ,EAAiBxhF,GAGnBgV,EAAA,mBAA2B,kBAAmB0gB,IAC5C8rD,EAAiB3C,GAAqBnpD,EAAO11B,IAAIoD,GAAU,G,CAI/D,CACE,MAAMi5B,EAAU,IAAI,IAAe,CAAC3wB,KAAM,0BAA2B5E,QAAS,uBAExE03B,EAAgB,IAAI,KAAc,CAACh3B,KAAM,mBACzC4qB,EAAM,IAAI,KAAI,CAClBoM,kBAKF,IAAIr5B,EAAkBw8E,EAFtBtlD,EAAQl2B,QAAQjH,OAAOkzB,EAAIxzB,WAG3BpL,KAAKwlF,cAAc53E,iBAAiB,WAAW,KAE7C,GADAugF,GAAY,OACGlqF,IAAZ0N,GAAyBA,IAAYq5B,EAAc3B,QACtD,OAAOrpC,KAAKiH,SAASm+E,kBAAkBgJ,yBAAyB,CAC9Dx+E,EAAG,wBACHy+E,sCAAuCrjD,EAAc3B,SACrD,GACD,CAACp7B,MAAM,IAEV,MAAMM,EAAU8W,QAAQqH,IAAI,CAC1B/rB,EAAE21E,UACF31E,EAAE0rF,gBACD/9E,MAAK,EAAEgoE,EAAWgY,MACnB,GAAGH,EACD,OAGF,MAAMI,EAAmBpzB,IACvBtyB,EAAQz9B,UAAUmI,UAAU1J,OAAO,QAASsxD,IAAcmb,EAAUkY,8BAA8B,EAGpGxuF,KAAK6R,eAAe9Q,IAAIygB,EAAA,EAAxBxhB,CAAmC,iBAAkBuuF,GACrDA,EAAgB/sE,EAAA,WAEhB7P,IAAY28E,EAASD,sCAErBrjD,EAAcyX,iBAAiB9wC,EAAQ,IAGzCoqB,EAAS15B,KAAKkM,GAEdvO,KAAKm0B,WAAWzoB,OAAOm9B,EAAQz9B,U,CAGjC,CACE,MAAMy9B,EAAU,IAAI,IAAe,CAAC3wB,KAAM,2BAA4B5E,QAAS,qCAC/Eu1B,EAAQz9B,UAAUmI,UAAUxS,IAAI,QAEhC,MAAMiqC,EAAgB,IAAI,KAAc,CAACh3B,KAAM,qCACzC4qB,EAAM,IAAI,KAAI,CAClBoM,kBAKF,IAAIr5B,EAFJk3B,EAAQl2B,QAAQjH,OAAOkzB,EAAIxzB,WAG3BpL,KAAKwlF,cAAc53E,iBAAiB,WAAW,KAC7C,QAAe3J,IAAZ0N,EAAuB,OAC1B,MAAM88E,EAAW7vD,EAAIoM,cAAc3B,QAEnC,OADkBolD,IAAa98E,EAKxB3R,KAAKiH,SAAS4zD,WAAW6vB,UAAU,6BAA8B,CACtEgE,kBAAmBD,SALrB,CAME,GACD,CAACxgF,MAAM,IAEV,MAAMM,EAAU5N,EAAE4rF,gBAAgBj+E,MAAMggF,IAClCA,EAAS7gF,OAAOkhF,uBAIpBh9E,IAAY28E,EAAS7gF,OAAOihF,kBAC5B1jD,EAAcyX,iBAAiB9wC,GAC/Bk3B,EAAQz9B,UAAUmI,UAAU/Q,OAAO,QAAO,IAG5Cu5B,EAAS15B,KAAKkM,GAEdvO,KAAKm0B,WAAWzoB,OAAOm9B,EAAQz9B,U,CAGjC,CACE,MAAMy9B,EAAU,IAAI,IAAe,CAAC3wB,KAAM,kBAAmB5E,QAAS,6BAEhE+uD,EAAe,KACnB,MAAM3wC,EAAoC,CACxC8oC,aAAc,iCACdC,mBAAoB,gCACpBnkD,OAAQ,CACNokD,QAAS,SAEXjX,WAAY,CAAC,CACXzvC,KAAM,uBACNq1B,SAAS,GACR,CACDr1B,KAAM,sBACNq1B,SAAS,MAIb,EAAAma,GAAA,GAAkB9xB,GAASpjB,MAAK,KAC9B,MAAO84D,EAAMwnB,GAAWl9D,EAAQ+xB,WAAW3oC,KAAK0qB,GAAMA,EAAEwF,cAAc3B,UAChEx/B,GAAS,EAAAw4C,EAAA,GAAiB,CAACkY,IAAc,GAC/Cv6D,KAAKiH,SAAS4nF,mBAAmBC,eAAe1nB,EAAMwnB,GAAStgF,MAAK,MAC9D84D,GAASwnB,KAIb/kF,KACA,EAAA4lB,GAAA,IAAS,CACPC,YAAa03C,GAAQwnB,EAAU,wCAA2CxnB,EAAO,qCAAuC,sCACxH,GACF,GACDvrC,GAAA,EAAK,EAGJ0+B,GAAc,OAAO,8BAA+B,CAACxmD,KAAM,SAAUC,KAAM,yBACjFhU,KAAK6R,eAAe9Q,IAAIw5D,EAAxBv6D,CAAqC,QAASqiE,GAC9Cx5B,EAAQl2B,QAAQjH,OAAO6uD,GAEvBv6D,KAAKm0B,WAAWzoB,OAAOm9B,EAAQz9B,U,CAGjC,CACE,MAAMy9B,EAAU,IAAI,IAAe,CAAC3wB,KAAM,gBAEpCxF,EAAgB,KACN,IAAI,IAAU,sBAAuB,CACjDmB,QAAS,CAAC,CACR6mD,QAAS,SACTtkC,SAAU,KACR,MAAMvsB,GAAS,EAAAw4C,EAAA,GAAiB,CAAC0sC,IAAe,GAChD/uF,KAAKiH,SAAS+nF,iBAAiBC,iBAAiB3gF,MAAK,KACnDzE,GAAQ,GACR,EAEJspE,UAAU,IAEZ3Y,aAAc,6BACdC,mBAAoB,0BAGhB5rC,MAAM,EAGRkgE,GAAe,OAAO,8BAA+B,CAACh7E,KAAM,SAAUC,KAAM,6BAClFhU,KAAK6R,eAAe9Q,IAAIguF,EAAxB/uF,CAAsC,QAAS0S,GAC/Cm2B,EAAQl2B,QAAQjH,OAAOqjF,GAcvB/uF,KAAKm0B,WAAWzoB,OAAOm9B,EAAQz9B,U,CAejC,OAAOia,QAAQqH,IAAIqP,EACrB,CAEOmxD,uBACL,OAAOltF,KAAKiH,SAAS4zD,WAAW6vB,UAAU,6BAA6Bp8E,MAAM4gF,IAC3ElvF,KAAKitF,kBAAkBvlD,SAAU,EACjC1nC,KAAKuqF,eAAiB2E,EAAM3E,gBAC5B,QAAMvqF,KAAKitF,kBAAkBnuD,SAAU,kBAAmB,CAAC9+B,KAAKuqF,eAAe1nF,QAAQ,GAE3F,CAEOuqF,qBAAqB7+E,EAAUvO,KAAKiH,SAAS6kF,wBAAwBW,wBAC1E,OAAOl+E,EAAQD,MAAMi8E,IACnBvqF,KAAKmtF,YAAYzlD,SAAU,EAC3B1nC,KAAKqtF,SAAW9C,GAChB,QAAMvqF,KAAKmtF,YAAYruD,SAAU,mBAAoB,CAAC9+B,KAAKqtF,SAASxqF,SACpE7C,KAAKmtF,YAAY/hF,UAAUmI,UAAU1J,OAAO,QAAS7J,KAAKqtF,SAASxqF,OAAO,GAE9E,E,4FChea,MAAMssF,WAA4B,IACxC94D,OAIL,OAHAr2B,KAAK2hF,SAAS,oBACd3hF,KAAKoL,UAAUmI,UAAUxS,IAAI,4BAEtBskB,QAAQqH,IAAI,CACjB1sB,KAAKiH,SAASmoF,oBAAoBC,mBAClCrvF,KAAKiH,SAASmoF,oBAAoBE,0BACjChhF,MAAK,EAAEihF,EAAeC,MACvBA,EAAqBA,EAAmBz/D,QAAQ0/D,IAAcA,EAAShiF,OAAOiiF,WAE9E,MAAM7mD,EAAU,IAAI,IAGd0vB,EAAOi3B,EAAmB10E,KAAK60E,IACnC,MAAMlS,EAAa,IAAI,IAAW,CAChCvlE,KAHS,iBAITlE,KAAM27E,EAAkB5gF,MACxBrC,MAAOijF,EAAkBF,SACzB3T,YAAY,IAGRl9C,EAAM,IAAI,KAAI,CAClB6+C,aACA1+C,aAAa,IAef,OAZA0+C,EAAW36D,KAAKvP,UAAUxS,IAAI,yBAE9B,QAAiB,CACf69B,MACAj9B,IAAKguF,EAAkBC,YACvB/nF,KAAM,UAGL8nF,EAAkBF,WAAcF,EAAoCE,UACrEhS,EAAWh7B,kBAAiB,GAGvB7jB,CAAG,IAGNq9C,GAAO,QAAkB1jB,GAAO7rD,IACpC1M,KAAKiH,SAASmoF,oBAAoBS,mBAAmB,CAACjgF,EAAG,gBAAiBkgF,SAAUpjF,GAAO,IAG7Fm8B,EAAQl2B,QAAQjH,OAAOuwE,GACvBj8E,KAAKm0B,WAAWzoB,OAAOm9B,EAAQz9B,UAAU,GAE7C,E,2UC1BK,MAAM2kF,GAOXhwF,YACEmY,EACAuK,EACAutE,EACAC,EACAzhD,EACA0hD,GAAa,GAEb,MAAMlwC,EAAa,yBACnBhgD,KAAKoL,UAAYC,SAASC,cAAc,OACxCtL,KAAKoL,UAAUmI,UAAUxS,IAAIi/C,GAE7B,MAAM35C,EAAUgF,SAASC,cAAc,OACvCjF,EAAQkN,UAAUxS,IAAIi/C,EAAa,YAEnC,MAAMmwC,EAAU9kF,SAASC,cAAc,OACvC6kF,EAAQ58E,UAAUxS,IAAIi/C,EAAa,UACnC,QAAMmwC,EAASj4E,GAEf,MAAMk4E,EAAWpwF,KAAKqwF,eAAiBhlF,SAASC,cAAc,OAC9D8kF,EAAS78E,UAAUxS,IAAIi/C,EAAa,UAEjCkwC,IACDE,EAASrtE,UAAY,GAAKitE,GAG5B3pF,EAAQqF,OAAOykF,EAASC,GAExBpwF,KAAK2tD,MAAQ,IAAI,KAAc,CAC7BlrC,OACA7b,IAAKqpF,EACLxpF,IAAK+nC,GACJwhD,GACHhwF,KAAK2tD,MAAMt5C,eACXrU,KAAK2tD,MAAMhrC,YAAY,CACrBC,QAASlW,IACJ1M,KAAKs0B,UACNt0B,KAAKs0B,SAAS5nB,GAGbwjF,IAEDE,EAAS7xD,UAAY,GAAK7xB,E,IAKhC1M,KAAKoL,UAAUM,OAAOrF,EAASrG,KAAK2tD,MAAMviD,UAC5C,EAGa,MAAMklF,WAA8B,IAC1C75E,qBACL,MAAO,CACL85E,OAAQ/uE,EAAA,wCACRgvE,YAAahvE,EAAA,+CACb+tE,cAAe/tE,EAAA,kDAEnB,CAEO6U,KAAK11B,GACVX,KAAKoL,UAAUmI,UAAUxS,IAAI,8BAC7Bf,KAAK2hF,SAAS,WAEd,MAAM94C,EAAU,SAAqB,KAAM7oC,KAAKm0B,YAC1C4H,EAA2B,GAEjC,CACE,MAAM3wB,EAAYy9B,EAAQ,YAEpB8kB,EAAQ,IAAIoiC,GAAqB,WAAY,EAAGvuE,EAAA,4BAAqC,GAAI,IAC/FmsC,EAAMr5B,SAAY5nB,IAChB8U,EAAA,oCAA4C,4BAA6B9U,EAAM,EAGjF,MAAM+jF,GAAuB,OAAO,8BAA+B,CAAC18E,KAAM,QAASC,KAAM,mBAEnF08E,EAAW,oBACjB,QAAiBD,GAAsB,KACrCzwF,KAAK4kF,OAAOC,UAAU,MAAkBn2D,KAAKgiE,EAAS,IAGxD,MAAMC,EAA0B,IAAI,KAAc,CAChD38E,KAAM,mBACNkE,KAAM,aACNoqC,SAAU,6BACVzwC,eAAgB7R,KAAK6R,iBAGvBzG,EAAUM,OACRiiD,EAAMviD,UACNqlF,GACA,QAA2BE,GAAyBvlF,U,CAIxD,CACE,MAAMA,EAAYy9B,EAAQ,cAEpB1U,EAAa,IAAI,KAAY,MAC7By8D,EAAkBz8D,EAAW/oB,UACnCwlF,EAAgBr9E,UAAUxS,IAAI,oBAQ9B,MAAM8vF,EAAY,IAAItvF,IACtB,IAAIuvF,EAAeC,GAAA,aACfC,EAAUD,GAAA,YAEd,MAAME,EAAoBjuF,IACxB+tF,GAAA,aAA2B/tF,EAAKkuF,MAAOluF,EAAKoI,WAE5C,MAAMvC,EAAW7F,EAAKoI,UAAUwM,cAAc,oBAC9C/O,SAAAA,EAAUrG,SAEV,MAAM2uF,EAAqBnuF,EAAKouF,oBAAoBJ,EAAU,iBAAmB,oBAC9EG,GACDnuF,EAAKoI,UAAU4M,QAAQm5E,E,EAI3B,IAAIE,GAEJ,QAAiBT,GAAuB7oF,GAAM,mCAC5C,MAAMqD,GAAY,EAAA6V,GAAA,GAAgBlZ,EAAE1H,OAAQ,mBAC5C,IAAI+K,EACF,OAGF,MAAMkmF,EAAaV,EAAgBh5E,cAAc,WAC9C05E,GACDA,EAAW/9E,UAAU/Q,OAAO,UAG9B,MAAMQ,EAAO6tF,EAAU5tF,IAAImI,GAO3B,GANAA,EAAUmI,UAAUxS,IAAI,gBAElBgwF,GAAA,gBAA8B/tF,EAAKkuF,OAEzCG,SAAAA,GAAiB,GAEdruF,EAAKZ,QAAUof,EAAA,6BAChB,GAAG,EAAA/e,UACEO,EAAKZ,OAAOkC,QACbtB,EAAKZ,OAAOmvF,cAET,CACFvuF,EAAKZ,OAAOkC,QACbtB,EAAKZ,OAAOiG,MAAK,GAGnBrF,EAAKZ,OAAOxB,GAAG,GAAG2K,MAAMkR,UAAY,WAEpC,MAAM+0E,EAAYH,EAAiBI,IAC9BzuF,EAAKZ,OAAOsvF,WAAaD,IAAwB,IAAbA,IACrCzuF,EAAKZ,OAAOxB,GAAG,GAAG2K,MAAMkR,UAAY,GACpCzZ,EAAKZ,OAAOsP,oBAAoB,aAAc8/E,GAE3CH,IAAkBG,IACnBH,OAAgBptF,G,EAKtBvB,YAAW,KACN2uF,IAAkBG,IAIrBxuF,EAAKZ,OAAOqC,OACZzB,EAAKZ,OAAOwL,iBAAiB,aAAc4jF,GAAU,GACpD,I,CAGT,KAAG,CAAC3/E,eAAgB7R,KAAK6R,iBAEzB,MAAM8/E,EAA2C,IAAIvwF,IAAI,CAAC,mBAAoB,mBAExEmN,EAAU5N,EAAE4vF,OAAOjiF,MAAWiiF,GAAW,mCAC7C,MAAMqB,EAAgBrB,EAAOxgE,QAAQmhE,GAAUA,EAAMzjF,OAAOokF,UAC5DD,EAAcriE,QAAQ,MAEtB,MAAMwM,EAAW61D,EAAc92E,KAAUo2E,GAAU,mCACjD,MAAM9lF,EAAYC,SAASC,cAAc,OACnC6S,EAAO,CACX/S,YACA8lF,QACAE,oBAAqB,CAAC,GAGlB/xD,EAAU6xD,EAAM5C,SACrBv+D,QAAQ+hE,GAAkBH,EAAoBtuF,IAAIyuF,EAAcC,WAAWniF,KAC3EkL,KAAKg3E,IACJ,MAAME,EAAYF,EAAcG,UAC1B1kD,EAAS,kBAA8BykD,GAE7C,OADA7zE,EAAEizE,oBAAoBU,EAAcC,WAAWniF,GAAK29B,EAAOniC,UACpDmiC,CAAM,IAGfsjD,EAAUjtF,IAAIwH,EAAW+S,GAEzB8yE,EAAiB9yE,GAEd+yE,EAAMtpF,KAAOkpF,EAAalpF,IAC3BwD,EAAUmI,UAAUxS,IAAI,UAG1B,MACMw2B,EAA+B,GACrC,IAAI26D,EACJ,GAHiBhB,EAAMpB,SAGV,CACXoC,EAAoB7mF,SAASC,cAAc,OAC3C4mF,EAAkB3+E,UAAUxS,IAAI,kBAChC,MAAM8G,EAAO,IACb,OAAiB,CACfumB,IAAK8jE,EACLhrE,MAAOrf,EACPyf,OAAQzf,EACR49C,MAAOyrC,EAAMpB,SACb7oF,SAAUjH,KAAKiH,SACfswB,eACAL,WAAYl3B,KAAKkzC,iBAAiBjwC,MAClCwB,MAAM,IACL6J,MAAK,EAAEo+B,YAAYA,IAAQp+B,MAAMlM,IAClC+b,EAAE/b,OAASA,CAAuB,G,CAItC,MAAMu+C,EAASt1C,SAASC,cAAc,OACtCq1C,EAAOptC,UAAUxS,IAAI,gBAErB,MAAMoxF,EAAWxxC,EAAOl0B,YAiBxB,OAfA0lE,EAAS5+E,UAAUxS,IAAI,SACvB4/C,EAAOptC,UAAUxS,IAAI,UAErBw2B,EAAal1B,QAAQg9B,EAAQvkB,KAAKyyB,GAAWA,EAAOrf,eAEpD9iB,EAAUmI,UAAUxS,IAAI,yBAElBskB,QAAQqH,IAAI6K,GAEf26D,GACD9mF,EAAUM,OAAOwmF,GAGnB9mF,EAAUM,OAAOymF,EAAUxxC,GAEpBv1C,CACT,MAEM86B,QAAmB7gB,QAAQqH,IAAIqP,GAErC5H,EAAWzoB,UAAUw6B,EACvB,MAEAnK,EAAS15B,KAAKkM,GAEd,MAAM0tE,EAAO5wE,SAASC,cAAc,QACpC2wE,EAAK1wE,MAAM6mF,UAAY,QAEvB,MAAMl6E,EAAO,QACPoqC,EAAW,iBAEX+vC,EAAS,IAAI,KAAI,CACrB5U,WAAY,IAAI,IAAW,CACzB/iB,QAAS,WACTxiD,OACAxL,MAAO,MACP41C,eAIEgwC,EAAW,IAAI,KAAI,CACvB7U,WAAY,IAAI,IAAW,CACzB/iB,QAAS,aACTxiD,OACAxL,MAAO,QACP41C,eAIEiwC,EAAY,IAAI,KAAI,CACxB9U,WAAY,IAAI,IAAW,CACzB/iB,QAAS,yBACTxiD,OACAxL,MAAO,SACP41C,eAIJtiD,KAAK6R,eAAe9Q,IAAIygB,EAAA,EAAxBxhB,CAAmC,oBAAoB,EAAEwM,MAAKE,QAAO4hF,eAChE9hF,IAAQ81C,GACT9gC,EAAA,gBAAwB,e,IAI5BxhB,KAAK6R,eAAe9Q,IAAIygB,EAAA,EAAxBxhB,CAAmC,gBAAgB,KACjD8wF,EAAeC,GAAA,aACf,MAAMyB,EAAazB,GAAA,YACnB,GAAGC,IAAYwB,EACb,OAGFxB,EAAUwB,EAEV,MAAMlB,EAAaV,EAAgBh5E,cAAc,WAKjD,IAAImO,EAJDurE,GACDA,EAAW/9E,UAAU/Q,OAAO,UAI9BquF,EAAU9rF,SAAS/B,IACjBiuF,EAAiBjuF,GAEdA,EAAKkuF,MAAMtpF,KAAOkpF,EAAalpF,KAChC5E,EAAKoI,UAAUmI,UAAUxS,IAAI,UAC7BglB,EAAS/iB,EAAKoI,U,IAIf2a,GACDoO,EAAW2F,kBAAkB,CAC3B53B,QAAS6jB,EACTgU,SAAU,SACVu1B,KAAM,K,IAKZ2sB,EAAKvwE,OAAO2mF,EAAOjnF,UAAWknF,EAASlnF,UAAWmnF,EAAUnnF,WAE5DA,EAAUM,OACRklF,EACA3U,E,CAIJ,CACE,MAAM7wE,EAAYy9B,EAAQ,oBAEpBozC,EAAO5wE,SAASC,cAAc,QAE9B4M,EAAO,gBACPoqC,EAAW,wBAEXmwC,EAAW,IAAI,KAAI,CACvBhV,WAAY,IAAI,IAAW,CACzB/iB,QAAS,6BACTxiD,OACAxL,MAAO,QACP41C,aAEF0mB,gBAAiB,4CAGb0pB,EAAe,IAAI,KAAI,CAC3BjV,WAAY,IAAI,IAAW,CACzBvlE,OACAxL,MAAO,YACP41C,aAEF0mB,gBAAiB,wCAEnB,QAAM0pB,EAAajV,WAAW36D,KAAM,iCAAkC,CAAC,EAAA/S,SAAW,IAAM,SAExFksE,EAAKvwE,OAAO+mF,EAASrnF,UAAWsnF,EAAatnF,WAC7CA,EAAUM,OAAOuwE,E,CAGnB,GAAG,KAA0B,CAC3B,MAAM7wE,EAAYy9B,EAAQ,sBAEpBozC,EAAO5wE,SAASC,cAAc,QAE9B4M,EAAO,gBACPoqC,EAAW,wBAEXqwC,EAAgB,IAAI,KAAI,CAC5BlV,WAAY,IAAI,IAAW,CACzB/iB,QAAS,0BACTxiD,OACAxL,MAAO,aACP41C,eAIEswC,EAAW,IAAI,KAAI,CACvBnV,WAAY,IAAI,IAAW,CACzB/iB,QAAS,qBACTxiD,OACAxL,MAAO,QACP41C,eAIJ25B,EAAKvwE,OAAOinF,EAAcvnF,UAAWwnF,EAASxnF,WAC9CA,EAAUM,OAAOuwE,E,CAGnB,CACE,MAAM7wE,EAAYy9B,EAAQ,sBAEpBozC,EAAO5wE,SAASC,cAAc,QAE9B4M,EAAO,cACPoqC,EAAW,sBAEXuwC,EAA4D,CAChE,CAAC,MAAO,0BACR,CAAC,MAAO,2BAGJt6B,EAAOs6B,EAAQ/3E,KAAI,EAAEg4E,EAAQpjE,KACrB,IAAI,KAAI,CAClB+tD,WAAY,IAAI,IAAW,CACzB/iB,QAAShrC,EACTxX,OACAxL,MAAOomF,EACPxwC,iBAOAhR,EChdG,SAAoBlb,EAAqB28D,GAAW,GACjE,OCAa,SAAqB38D,EAAqB48D,EAA8BD,GAAW,GAChG,MAKME,EAAY78D,EAKlB,IAAIzc,EAQJ,OAZIo5E,IACF38D,EAAWyF,GAAA,GAIb,SAAUq3D,IACR98D,IACAzc,EAAU44D,GAAA,aAAe2gB,EAAKF,IAC/B,CAHD,GAKA58D,EAAW68D,EAhBI,KACbx/E,aAAakG,EAAQ,CAkBzB,CDpBSw5E,CAAY/8D,GAAU,IAAuC,KAAhC,IAAK,IAAI/Y,MAAO+1E,eAAsBL,EAC5E,CD8cqBM,EAAW,KACxB,MAAM78E,EAAO,IAAI6G,KAEjBw1E,EAAQ9tF,SAAQ,EAAE+tF,GAAS/pF,KACzB,MAAM8e,EAAMrR,EAAK88E,mBAAmB,cAAgBR,EAAQ,CAC1DS,KAAM,UACNC,OAAQ,YAGVj7B,EAAKxvD,GAAK+1B,SAASlmB,YAAciP,CAAG,GACpC,IAGJ7nB,KAAKwlF,cAAc53E,iBAAiB,UAAW0jC,GAE/C2qC,EAAKvwE,UAAU6sD,EAAKz9C,KAAK8jB,GAAQA,EAAIxzB,aACrCA,EAAUM,OAAOuwE,E,CAGnB,CACE,MAAM7wE,EAAYy9B,EAAQ,SAEpB4qD,EAAuB,IAAI,KAAc,CAC7Cz/E,KAAM,kCACNkE,KAAM,gBACNoqC,SAAU,yBACVzwC,eAAgB7R,KAAK6R,iBAEjB6hF,EAAmB,IAAI,KAAc,CACzC1/E,KAAM,2BACNkE,KAAM,YACNoqC,SAAU,qBACVzwC,eAAgB7R,KAAK6R,iBAGvBzG,EAAUM,QACR,QAA2B+nF,GAAsBroF,WACjD,QAA2BsoF,GAAkBtoF,U,CAIjD,CACE,MAAMy9B,EAAU,IAAI,IAAe,CAAC3wB,KAAM,2CAA4C5E,QAAS,oBAEzFqgF,EAAe,IAAI,KAAI,CAC3Bn5B,aAAc,mBACdz7B,aAAa,EACb9L,UAAW,KACTjzB,KAAK4kF,OAAOC,UAAUsK,IAAqBzgE,MAAM,EAEnD7c,eAAgB7R,KAAK6R,iBAGjB+hF,EAAsB,KAC1BjzF,EAAE4uF,cAAcjhF,MAAMmhF,GACF,sBAAfA,EAAS7/E,EACH6/E,EAASG,YAET5vF,KAAKiH,SAASmtD,gBAAgBy/B,uBAAuBpE,EAASqE,eAEtExlF,MAAM3M,KACP,QAAiB,CACfi9B,IAAK+0D,EACLhyF,MACAkG,KAAM,SACN,GACF,EAGJ+rF,IAEA5zF,KAAK6R,eAAe9Q,IAAIygB,EAAA,EAAxBxhB,CAAmC,iBAAkB4zF,GAErD,MAAMH,EAAuB,IAAI,KAAc,CAC7Cz/E,KAAM,2BACNkE,KAAM,UACNoqC,SAAU,4BACVzwC,eAAgB7R,KAAK6R,iBAEjBkiF,EAAoB,IAAI,KAAc,CAC1C//E,KAAM,iCACNkE,KAAM,OACNoqC,SAAU,yBACVzwC,eAAgB7R,KAAK6R,iBAGjBmiF,EAAmC,CAAC,EAEpCC,EAAkBprD,EAAQu4C,yBAE1Bx/D,EAAgB,IAAI,KACpByzC,EAAmB,CAACzK,EAAmCrrB,EAA+B,YAC1F,MAAMX,EAAM,IAAI,KAAI,CAClB7vB,OAAO,EAAAud,EAAA,GAAcs+B,EAAW77C,OAChCi6D,gBAAiB,WACjB8U,iBAAkB,CAAClzB,EAAW31B,OAC9B8J,aAAa,EACb9L,UAAW,KACT,IAAI,KAAc,CAACrrB,GAAIgjD,EAAWhjD,GAAIijD,YAAaD,EAAWC,cAAch8B,MAAM,EAEpFhd,eAAgB7R,KAAK6R,iBAGvBmiF,EAAYppC,EAAWhjD,IAAMg3B,EAE7B,MAAMxQ,EAAM/iB,SAASC,cAAc,OACnC8iB,EAAI7a,UAAUxS,IAAI,cAElB,QAAoB,CAClB6C,IAAKgnD,EACLx/C,UAAWgjB,EACX9tB,MAAO,mBACPshB,gBACAsF,MAAO,GACPI,OAAQ,GACR9iB,UAAU,EACV0yB,WAAYl3B,KAAKkzC,iBAAiBjwC,QAGpC27B,EAAIxzB,UAAUM,OAAO0iB,GAErB6lE,EAAgB10D,GAAQX,EAAIxzB,UAAU,EAGlCmD,EAAU5N,EAAE6vF,YAAYliF,MAAMkiF,KAClC,EAAA0D,GAAA,GAAoD1D,GACpD,MAAMz0D,EAAWy0D,EAAY77B,KAAK75C,KAAK8vC,GAAeyK,EAAiBzK,KACvE,OAAOvlC,QAAQqH,IAAIqP,EAAS,IAG9BA,EAAS15B,KAAKkM,GAEdvO,KAAK6R,eAAe9Q,IAAIygB,EAAA,EAAxBxhB,CAAmC,sBAAuB4D,IACpDowF,EAAYpwF,EAAIgE,KAClBytD,EAAiBzxD,EAAK,U,IAI1B5D,KAAK6R,eAAe9Q,IAAIygB,EAAA,EAAxBxhB,CAAmC,oBAAqB4D,IACnDowF,EAAYpwF,EAAIgE,MACjBosF,EAAYpwF,EAAIgE,IAAIwD,UAAU5I,gBACvBwxF,EAAYpwF,EAAIgE,I,IAI3BihC,EAAQl2B,QAAQjH,OACdioF,EAAavoF,WACb,QAA2BqoF,GAAsBroF,WACjD,QAA2B2oF,GAAmB3oF,WAEhDpL,KAAKm0B,WAAWzoB,OAAOm9B,EAAQz9B,U,CAGjC,OAAOia,QAAQqH,IAAIqP,EACrB,E,6YGtlBa,MAAMo4D,WAA0B,IAA/C,c,oBAQU,KAAAC,gBAA6C,CAAC,CAsUxD,CAnUS39E,qBACL,MAAO,CACL49E,cAAeC,GAAA,+BAA0C,aACzDpvD,QAAS1jB,EAAA,6CAEb,CAEc+yE,aACZC,EACAppF,EACAwzB,EACAlzB,G,0CAEA,IAAIqkB,EACAiO,EAAc,GAClB,MAAMtT,EAAmB,GACzB,GAAsB,0BAAnB8pE,EAAa5kF,EACdmgB,EAASykE,EAAazkE,OACtBiO,EAAcw2D,EAAax2D,gBACtB,CAQL,GAPAjO,EAASykE,EAOa,IALCrwF,OAAOC,KAAK2rB,EAAOtiB,QAAQ5K,OAKzB,CACvB,MAAM4K,EAASsiB,EAAOtiB,OACtB,IAAI0Q,EACD1Q,EAAOk0B,SAAUxjB,EAAI,oBAChB1Q,EAAOgnF,aAAct2E,EAAI,uBACzB1Q,EAAOvJ,OAAQia,EAAI,kBACnB1Q,EAAOinF,WAAYv2E,EAAI,oBACvB1Q,EAAOknF,OAAMx2E,EAAI,iBAEtBA,GACDuM,EAAEroB,MAAK,QAAK8b,G,CAIhB,IAAIuM,EAAE7nB,OAAQ,CACZ,MAAM+xF,QAAe50F,KAAKiH,SAASk7B,eAAe0yD,iBAAiB9kE,EAAOnoB,IAC1E,IAAIi8E,EAAQ,EAAGiR,EAAW,EAAG5wF,EAAS,QAChCmhB,QAAQqH,IAAIkoE,EAAO95E,KAAUuR,GAAW,0CACnCrsB,KAAKiH,SAASqI,gBAAgBylF,WAAW1oE,EAAOrkB,SAAS9D,WACpDlE,KAAKiH,SAASqI,gBAAgBq3B,YAAYta,EAAOrkB,SAAS8sF,IACnEjR,GACP,OAEGA,GAAOn5D,EAAEroB,MAAK,QAAK,QAAS,CAACwhF,KAC7BiR,GAAUpqE,EAAEroB,MAAK,QAAK,WAAY,CAACyyF,KACnC5wF,GAAQwmB,EAAEroB,MAAK,QAAK,SAAU,CAAC6B,I,EAItC,GAAI06B,EA6BC7O,EAAOnoB,KAAO,QACf,EAAAilB,EAAA,GAAe+R,EAAI7vB,OAAO,EAAAud,EAAA,GAAcyD,EAAOhhB,QAGjD6vB,EAAIE,SAASlmB,YAAc,GAC3BgmB,EAAIE,SAASpzB,WAAU,QAAKgf,SAtB5B,GAXAkU,EAAM,IAAI,KAAI,CACZ7vB,MAAOghB,EAAOnoB,KAAO,OAAgB,QAAK,mBAAoB,EAAA0kB,EAAA,GAAcyD,EAAOhhB,OACnF+vB,SAAUd,EACV/K,WAAW,EACXqrD,mBAAuC,0BAAnBkW,EAAa5kF,EAAgC,WAAQ3L,IAGxEymB,EAAE7nB,QACH+7B,EAAIE,SAASpzB,WAAU,QAAKgf,IAGR,iBAAnB8pE,EAAa5kF,EAAsB,CACpC,MAAM0yB,EAAWvS,EAAOnoB,GACxB,IAAI5H,KAAKo0F,gBAAgBrkE,EAAOnoB,KAAOmoB,EAAOnoB,KAAO,MAAe,CAClE,MAAM8oF,EAAW,oBACjB,QAAiB9xD,EAAIxzB,WAAW,IAAW,mCACzC,MAAM2kB,QAAe/vB,KAAKiH,SAAS+tF,eAAeC,UAAU3yD,GACtDpvB,EAAMlT,KAAK4kF,OAAOC,UAAU,MAClC3xE,EAAIgiF,cAAcnlE,GAClB7c,EAAIwb,KAAKgiE,EACX,KAAG,CAAC7+E,eAAgB7R,KAAK6R,gB,CAG3B7R,KAAKo0F,gBAAgBrkE,EAAOnoB,IAAMg3B,EAElCA,EAAIkgD,c,CAWR,MAAM1wD,EAAMwQ,EAAIxzB,UAEhB,GAAGM,EAAQ,CACT,MAAMypF,EAAWplE,EAA0BolE,aAC5BlxF,IAAZkxF,GAED,EAAA1uD,GAAA,GAAuBrY,EAAKA,EAAInV,eAAiB7N,EAAW+pF,GACpD/pF,GACRA,EAAUM,OAAO0iB,E,CAIrB,OAAOwQ,CACT,G,CAEOvI,KAAK11B,EAAyDwzF,GAAkBiB,eACrFp1F,KAAKoL,UAAUmI,UAAUxS,IAAI,0BAC7Bf,KAAK2hF,SAAS,8BAEd3hF,KAAKm0B,WAAW/oB,UAAUmI,UAAUxS,IAAI,gBAExCf,KAAKomF,iBAAmB/6E,SAASC,cAAc,OAC/CtL,KAAKomF,iBAAiB7yE,UAAUxS,IAAI,qBAEpC,MAAMuS,EAAUjI,SAASC,cAAc,OACvCgI,EAAQC,UAAUxS,IAAI,YACtB,QAAM,CAACmB,QAASoR,EAAS9G,IAAK,2BAE9BxM,KAAKq1F,iBAAkB,OAAO,kDAAmD,CAC/ErhF,KAAM,2BACND,KAAM,QAGR/T,KAAKs1F,eAAiB,IAAI,IAAe,CACvCp9E,KAAM,YAERlY,KAAKs1F,eAAelqF,UAAUmI,UAAUxS,IAAI,QAE5Cf,KAAKqzB,KAAOhoB,SAASC,cAAc,OACnCtL,KAAKs1F,eAAe3iF,QAAQjH,OAAO1L,KAAKqzB,MAExCrzB,KAAKu1F,iBAAmB,IAAI,IAAe,CACzCr9E,KAAM,sBAERlY,KAAKu1F,iBAAiBnqF,UAAUmI,UAAUxS,IAAI,QAE9Cf,KAAKm0B,WAAWzoB,OACd1L,KAAKomF,iBACL9yE,EACAtT,KAAKq1F,gBACLr1F,KAAKs1F,eAAelqF,UACpBpL,KAAKu1F,iBAAiBnqF,YAGxB,QAAiBpL,KAAKq1F,iBAAiB,IAAW,0CACrCr1F,KAAKw1F,mBAGdx1F,KAAK4kF,OAAOC,UAAU,MAAkBn2D,QAFxC,QAAe,UAInB,KAAG,CAAC7c,eAAgB7R,KAAK6R,iBAEzB,MAAM4jF,EAA2B,KAC/Bz1F,KAAKs1F,eAAelqF,UAAUmI,UAAU1J,OAAO,QAAS1F,OAAOC,KAAKpE,KAAKo0F,iBAAiBvxF,OAAO,EAG7F00B,EAA+B,GAC/Bm+D,EAAuB/0F,EAAEukC,QAAQ52B,MAAW42B,GAAY,mCAC5D,IAAI,MAAMnV,KAAUmV,EACfnV,EAAOnoB,KAAO,cAIX5H,KAAKu0F,aAAaxkE,EAAQ/vB,KAAKqzB,UAAMpvB,GAAW,IAGxDjE,KAAK21F,iBAELF,GACF,MAyFA,OAvFAl+D,EAAal1B,KAAKqzF,GAElB11F,KAAK6R,eAAe9Q,IAAIygB,EAAA,EAAxBxhB,CAAmC,iBAAuB+vB,GAAW,mCACnE,MAAM+7B,EAAiB9rD,KAAKo0F,gBAAgBrkE,EAAOnoB,IAChDkkD,QACK9rD,KAAKu0F,aAAaxkE,EAAQ,KAAM+7B,GAC9B/7B,EAAOnoB,KAAO,cAChB5H,KAAKu0F,aAAaxkE,EAAQ/vB,KAAKqzB,UAAMpvB,GAAW,IAGxDwxF,IAEAz1F,KAAK41F,qBACP,MAEA51F,KAAK6R,eAAe9Q,IAAIygB,EAAA,EAAxBxhB,CAAmC,iBAAkB+vB,IACnD,MAAM+7B,EAAiB9rD,KAAKo0F,gBAAgBrkE,EAAOnoB,IAChDkkD,IAMD9rD,KAAK41F,sBAEL9pC,EAAe1gD,UAAU5I,gBAClBxC,KAAKo0F,gBAAgBrkE,EAAOnoB,KAGrC6tF,GAA0B,IAG5Bz1F,KAAK6R,eAAe9Q,IAAIygB,EAAA,EAAxBxhB,CAAmC,gBAAiBwyD,IAClDA,EAAMziC,QAAQuS,KAAetiC,KAAKo0F,gBAAgB9xD,KAAWv9B,SAAQ,CAACu9B,EAAUv5B,KAC9E,MACMqC,EADiBpL,KAAKo0F,gBAAgB9xD,GACXl3B,WACjC,EAAAq7B,GAAA,GAAuBr7B,EAAWA,EAAU6N,cAAelQ,EAAM,EAAE,GACnE,IAGJ/I,KAAK6R,eAAe9Q,IAAIygB,EAAA,EAAxBxhB,CAAmC,kBAAkB,KACnDA,KAAK21F,gBAAgB,IAGvB31F,KAAK61F,qBAAuBl1F,EAAE0zF,cAAc/lF,MAAW8B,GAAO,mCAC5D,MAAMhO,QAAegO,EAAG,CACtBhF,UAAWpL,KAAKomF,iBAChB1iF,MAAM,EACNc,UAAU,EACV0iB,MAAO,GACPI,OAAQ,KAKV,OAFAtnB,KAAKS,UAAY2B,EAEVkyF,GAAA,oBAA+BlyF,EACxC,MAEAm1B,EAAal1B,KAAKrC,KAAK61F,sBAEvB,IAAI,KAAS,CACXxiE,KAAMrzB,KAAKqzB,KACX6D,WAAYl3B,KAAKkzC,iBAAiBjwC,MAClC6yF,OAAQ,CAACC,EAASC,KAChB,IAAIxjC,EAAkB,GACtB,IAAI,MAAMlwB,KAAYtiC,KAAKo0F,gBAAiB,CAC1C,MAAMx1D,EAAM5+B,KAAKo0F,gBAAgB9xD,GAEjCkwB,GADY,EAAApF,GAAA,GAAWxuB,EAAIxzB,aACbk3B,C,CAGhBkwB,EAAQA,EAAMziC,QAAQuS,QAA0Br+B,IAAbq+B,IAC/B9gB,EAAA,YACF,EAAA21C,GAAA,GAAiB3E,EAAO,OAI1BxyD,KAAKiH,SAAS+tF,eAAeiB,yBAAyBzjC,EAAM,EAE9Dr+B,WAAYn0B,KAAKm0B,aAGnBn0B,KAAK41F,sBAKEvwE,QAAQqH,IAAI6K,EACrB,CAEAgwD,qBAME,OALAvnF,KAAK61F,qBAAqBvnF,MAAK,KAC7BtO,KAAKS,UAAU+D,UAAW,EAC1BxE,KAAKS,UAAUgE,MAAM,IAGhByN,MAAMq1E,oBACf,CAEQoO,iBACiB31F,KAAKo0F,gBAAgB,OAC7BhpF,UAAUmI,UAAU1J,OAAO,QAAS2X,EAAA,UACrD,CAEcg0E,kB,0CACZ,MAAOzgE,EAAOmQ,SAAiB7f,QAAQqH,IAAI,CACzC1sB,KAAKiH,SAAS4zD,WAAWC,SAAS,WAClC96D,KAAKiH,SAAS+tF,eAAekB,qBAI/B,OADsBhxD,EAAQnV,QAAQA,IAAY,UAAiBA,EAAOnoB,MAAK/E,OACxDkyB,CACzB,G,CAEQ6gE,sBACN,OAAO51F,KAAKiH,SAAS+tF,eAAemB,6BAA6B7nF,MAAW8nF,GAAqB,mCAC/Fp2F,KAAKu1F,iBAAiBnqF,UAAUmI,UAAU1J,OAAO,QAASusF,EAAiBvzF,QAC3EqW,MAAMC,KAAKnZ,KAAKu1F,iBAAiB5iF,QAAQwmB,UAAUrJ,MAAM,GAAG/qB,SAASnE,GAAOA,EAAG4B,WAE/E,IAAI,MAAMutB,KAAUqmE,EAAkB,CACpC,MAAMx3D,QAAY5+B,KAAKu0F,aAAaxkE,GACpC/vB,KAAKu1F,iBAAiB5iF,QAAQjH,OAAOkzB,EAAIxzB,WAEzC,MAAMkL,EAASsoB,EAAIw5C,aACnB,QAAiB9hE,GAAcvO,GAAM,mCAGnC,IAFA,EAAAqS,EAAA,GAAYrS,WAED/H,KAAKw1F,mBAEd,YADA,QAAe,WAIjBl/E,EAAO3I,aAAa,WAAY,QAEhC,MAAM26B,EAAIvY,EAAOA,OACjBuY,EAAE+tD,eAAiB,GACnB/tD,EAAEguD,eAAiB,GACnBhuD,EAAEiuD,cAAgB,GAElBv2F,KAAKiH,SAAS+tF,eAAewB,mBAAmBluD,GAAG,GAAMh6B,MAAK,KAC5DswB,EAAIxzB,UAAU5I,SACdxC,KAAKu1F,iBAAiBnqF,UAAUmI,UAAU1J,OAAO,OAA4D,IAApD7J,KAAKu1F,iBAAiB5iF,QAAQ4gB,kBAAwB,IAC9Gpb,SAAQ,KACT7B,EAAO60C,gBAAgB,WAAW,GAEtC,KAAG,CAACt5C,eAAgB7R,KAAK6R,gB,CAE7B,KACF,E,iUCtVa,MAAM4kF,WAA4B,IACxCpgE,OACLr2B,KAAKoL,UAAUmI,UAAUxS,IAAI,2BAC7Bf,KAAK2hF,SAAS,+CAEd,MAAM+U,EAAiBhlE,IAKrB,MAAMmX,EAAU,IAAI,IAAe,CACjC3wB,KAAMwZ,EAAQxZ,OAGVy+E,EAAa,IAAI,KAAI,CACzB3rD,cAAe,IAAI,KAAc,CAACh3B,KAAM0d,EAAQklE,SAAUvtD,SAAS,IACnE2/B,gBAAiB,UACjBn3D,eAAgB7R,KAAK6R,eACrBmsE,sBAAsB,IAGlB6Y,EAAoB,IAAI,KAAI,CAChC7rD,cAAe,IAAI,KAAc,CAACh3B,KAAM,iBAAkBq1B,SAAS,IACnE2/B,gBAAiB,UACjBn3D,eAAgB7R,KAAK6R,eACrBmsE,sBAAsB,IAGxBn1C,EAAQl2B,QAAQjH,OAAOirF,EAAWvrF,UAAWyrF,EAAkBzrF,WAE/DpL,KAAKm0B,WAAWzoB,OAAOm9B,EAAQz9B,WAE/B,MAAM0rF,EAAkB,CAAClnF,EAAG8hB,EAAQ4zD,UAC9B98D,EAAMxoB,KAAKiH,SAASqiE,wBAAwBytB,kBAAkBD,IACnEtuE,aAAenD,QAAUmD,EAAMnD,QAAQlX,QAAQqa,IAAMla,MAAM0oF,IAC1D,MAAMC,EAAgB,IAAW,mCAC/B,MAAMlqF,QAAc/M,KAAKiH,SAASqiE,wBAAwB4tB,QAAQF,GAIlE,OAHAL,EAAW3rD,cAAc3B,SAAWt8B,EACpC8pF,EAAkB7rD,cAAc3B,QAAU2tD,EAAeG,cAElDpqF,CACT,IAEAkqF,IAEAj3F,KAAKwlF,cAAc53E,iBAAiB,WAAW,IAAW,mCACxD,MAAMwpF,GAAQT,EAAW3rD,cAAc3B,QACjCguD,EAAeR,EAAkB7rD,cAAc3B,QAErD,GAAG+tD,WAAgBp3F,KAAKiH,SAASqiE,wBAAwB4tB,QAAQF,KAAoBK,IAAiBL,EAAeG,cACnH,OAGF,MAAMG,GAAyC,EAAAlwD,GAAA,GAAK4vD,GACpDM,EAAc1nF,EAAI,0BAClB0nF,EAAcC,WAAaH,EAAO,MAAa,EAC/CE,EAAcH,cAAgBE,SACvBC,EAAcE,MAErBx3F,KAAKiH,SAASqiE,wBAAwBmuB,qBAAqBX,EAAiBQ,EAC9E,KAAG,CAACrpF,MAAM,IAEVjO,KAAK6R,eAAe9Q,IAAIygB,EAAA,EAAxBxhB,CAAmC,mBAAoBkiC,IACrD,MAAMojD,EAAW+F,GAAqBnpD,EAAO9B,KAAKxwB,GAC/C8hB,EAAQ4zD,WAAaA,IACtB0R,EAAiB90D,EAAOw1D,gBACxBT,I,GAEF,GACF,EAGJP,EAAc,CACZx+E,KAAM,4BACN0+E,SAAU,+BACVtR,SAAU,qBAGZoR,EAAc,CACZx+E,KAAM,sBACN0+E,SAAU,yBACVtR,SAAU,qBAGZoR,EAAc,CACZx+E,KAAM,wBACN0+E,SAAU,2BACVtR,SAAU,0BAGZ,CACE,MAAMz8C,EAAU,IAAI,IAAe,CACjC3wB,KAAM,uBAGFy/E,EAAoB,IAAI,KAAI,CAChC3sD,cAAe,IAAI,KAAc,CAACh3B,KAAM,gBAAiBq1B,SAAS,IAClE2/B,gBAAiB,UACjBn3D,eAAgB7R,KAAK6R,eACrBmsE,sBAAsB,IAGlB4Z,EAAW,IAAI,KAAI,CACvB5sD,cAAe,IAAI,KAAc,CAACh3B,KAAM,sBAAuBq1B,SAAS,EAAMiZ,SAAU,+BAAgCzwC,eAAgB7R,KAAK6R,iBAC7Im3D,gBAAiB,UACjBn3D,eAAgB7R,KAAK6R,eACrBmsE,sBAAsB,IAGxB,gBAA2B1vE,MAAMoiB,IAC/BknE,EAAS5sD,cAAc3B,QAAU3Y,EAAM49D,SAASllB,cAAcyuB,KAAK,IAGrEhvD,EAAQl2B,QAAQjH,OAAOisF,EAAkBvsF,UAAWwsF,EAASxsF,WAE7DpL,KAAKm0B,WAAWzoB,OAAOm9B,EAAQz9B,WAE/BpL,KAAKiH,SAASqiE,wBAAwBwuB,+BAA+BxpF,MAAMqD,IACzEgmF,EAAkB3sD,cAAc3B,QAAU13B,EAE1C3R,KAAKwlF,cAAc53E,iBAAiB,WAAW,KAC7C,MAAM6gF,EAAWkJ,EAAkB3sD,cAAc3B,QAC9C13B,IAAY88E,GACbzuF,KAAKiH,SAASqiE,wBAAwByuB,8BAA8BtJ,E,GAErE,CAACxgF,MAAM,GAAM,G,CAGtB,ECrIa,MAAM+pF,WAAuB,IACnCvhF,qBACL,MAAO,CACLwhF,WAAYz2E,EAAA,yCAAiD,wBAAyB,CACpF02E,UAAW,QAKbC,WAAY9yE,QAAQlX,QAAQ,IAEhC,CAEOkoB,KAAK11B,GACVX,KAAKsrD,OAAO/3C,UAAUxS,IAAI,eAC1Bf,KAAKoL,UAAUmI,UAAUxS,IAAI,sBAC7Bf,KAAK2hF,SAAS,mCAEd,MAAM94C,EAAU,IAAI,IAAe,CAAC,GAE9By7C,EAA8B,IAAI/iF,IAElCgN,EAAU8W,QAAQqH,IAAI,CAC1B/rB,EAAEs3F,WACFt3F,EAAEw3F,aACD7pF,MAAK,EAAE2pF,EAAYE,MACpB,MAAMC,EAAwB,IAAIh3F,IAC5Bi3F,EAAeJ,EAAWn9E,KAAKw9E,GAAaA,EAASC,YAErDx6C,GAAS,SACfk6C,EAAW31E,OAAO61E,GAAYpzF,SAASuzF,IACrC,GAAGF,EAAS/0F,IAAIi1F,EAASC,WAAY,OACrCH,EAASr3F,IAAIu3F,EAASC,WAEtB,MAAM35D,EAAM,IAAI,KAAI,CAClB6+C,WAAY,IAAI,IAAW,CACzBzpE,KAAMskF,EAASpgF,KACfA,KAAM6lC,EACNrxC,MAAO4rF,EAASC,YAElBz5D,SAAUw5D,EAASE,cAGrBlU,EAAU1gF,IAAI00F,EAASC,UAAW35D,EAAI,IAGxC,MAAMq9C,GAAO,QAAkB,IAAIqI,EAAU/4C,WAAY7+B,IACvD,iBAAiBA,EAAO2rF,EAAatjF,SAASrI,GAAO,IAGvD,wBAAwB4B,MAAMmqF,IAC5B,MAAM75D,EAAM0lD,EAAUrhF,IAAIw1F,EAASF,WAC/B35D,EAKJA,EAAI6+C,WAAWh7B,kBAAiB,GAJ9Br2C,QAAQujB,MAAM,SAAUiP,EAAK65D,EAIM,IAGvC5vD,EAAQl2B,QAAQjH,OAAOuwE,EAAK,IAK9B,OAFAj8E,KAAKm0B,WAAWzoB,OAAOm9B,EAAQz9B,WAExBmD,CACT,E,qCCpEK,SAASmqF,GAA4B92F,EAAkCmN,EAAoB8C,GAChG,MAAMg3B,EAAU,IAAI,IAAe,CAAC3wB,KAAMnJ,IAEpCvC,EAAM,yBAA2B5K,EAAO,IACxC+2F,EAAwB,IAAI,KAAc,CAC9C3kF,KAAM,uBACNkE,KAAM,WACNoqC,SAAU91C,EAAM,WAChBqF,mBAEI+mF,EAAuB,IAAI,KAAc,CAC7C5kF,KAAM,2BACNkE,KAAM,UACNoqC,SAAU91C,EAAM,UAChBqF,mBAEIgnF,EAAsB,IAAI,KAAc,CAC5C7kF,KAAM,yBACNkE,KAAM,SACNoqC,SAAU91C,EAAM,SAChBqF,mBAEIinF,EAAwB,IAAI,KAAc,CAC9C9kF,KAAM,uBACNkE,KAAM,WACNoqC,SAAU91C,EAAM,WAChBqF,mBAUF,OAPAg3B,EAAQl2B,QAAQjH,QACd,QAA2BitF,GAAuBvtF,WAClD,QAA2BwtF,GAAsBxtF,WACjD,QAA2BytF,GAAqBztF,WAChD,QAA2B0tF,GAAuB1tF,WAG7Cy9B,CACT,CAEe,MAAMkwD,WAAgC,IAC5C1iE,OACLr2B,KAAK2hF,SAAS,sBAEd,MAAM94C,EAAU6vD,GAA4B,QAAS,0BAA2B14F,KAAK6R,gBACrF7R,KAAKm0B,WAAWzoB,OAAOm9B,EAAQz9B,UACjC,EC5Ca,MAAM4tF,WAA+B,IAC3C3iE,OACLr2B,KAAK2hF,SAAS,qBAEd,MAAMsX,GAAgB,EAAAx/E,GAAA,IAAUy/E,IAC9Bl5F,KAAKiH,SAASkyF,gBAAgBC,SAAS,yCAA0CF,EAAQ,GACxF,KAAK,GAAO,GAETrwD,EAAU6vD,GAA4B,OAAQ,yBAA0B14F,KAAK6R,gBAE7EwnF,EAAM,OAGNC,EAAYC,SAEZL,EAAU13E,EAAA,yCACV9U,EAAQlG,KAAKmzC,KAAKnzC,KAAKmzC,MAAMu/C,EAAUG,GAAOC,IAC9CE,EAAO,IAAI,iBAAiB,CAChChtF,IAAK,4BACLmsD,KAAM,EAAC,EAAA8gC,GAAA,GAAYP,MAEfvrC,EAAQ,IAAIoiC,GAAqB,0BAA2B,IAAMrjF,EAAO,EAAG,GAAG,GACrFihD,EAAMr5B,SAAY5nB,IAChB,MAAMwsF,EAAW,SAAAxsF,EAAS,GAAI4sF,EAAYD,EAAO,EAEjDG,EAAKE,iBAAiB,CAAC/gC,KAAM,EAAC,EAAA8gC,GAAA,GAAYP,MAE1CD,EAAcC,EAAQ,EAGxBvrC,EAAM0iC,eAAe3kF,OAAO8tF,EAAKt3F,SAEjC2mC,EAAQl2B,QAAQjH,OAAOiiD,EAAMviD,WAE7BpL,KAAKm0B,WAAWzoB,OAAOm9B,EAAQz9B,UACjC,ECxCa,MAAMuuF,WAAgC,IAC5CtjE,OACLr2B,KAAK2hF,SAAS,sBAEd,MAAM94C,EAAU6vD,GAA4B,QAAS,0BAA2B14F,KAAK6R,gBACrF7R,KAAKm0B,WAAWzoB,OAAOm9B,EAAQz9B,UACjC,ECWF,MAAMwuF,GAAmF,CACvFj4D,SAAU,uBACVk4D,QAAS,iBACT31F,OAAQ,qBACR4wF,SAAU,wBAGG,MAAMgF,WAA6B,IACnCzjE,O,qCACXr2B,KAAK2hF,SAAS,gBAEd,CACE,MAAM94C,EAAU,IAAI,IAAe,CAAC3wB,KAAM,yBAA0B5E,QAAS,0BAEvEod,QAAc,gBAEdqpE,EAAoB,IAAI,KAAc,CAC1C/lF,KAAM,oBACNkE,KAAM,OACNmxB,SAAU3Y,EAAM49D,SAAS0L,gBAAgBvsF,OAAO0mC,SAChDtiC,eAAgB7R,KAAK6R,iBAGjBooF,EAAU,IAAI,KAAI,CACtBjvD,cAAe+uD,EACfloF,eAAgB7R,KAAK6R,iBAGjByiB,EAAW,MACf,EAAA+tB,EAAA,GAAiB,CAAC63C,IAChB,EAAAC,GAAA,GAAUzpE,EAAM49D,SAASv9C,aAAc,8BACvC,EAAAopD,GAAA,GAAUzpE,EAAM49D,SAAS0L,gBAAiB,+BAAqC,EAG7EI,EAAe,KACnBp6F,KAAKq6F,wBAAwBC,EAAU5pE,EAAM49D,SAASv9C,aAAavU,OACnEx8B,KAAKq6F,wBAAwBE,EAAU7pE,EAAM49D,SAASv9C,aAAa7qC,OACnElG,KAAKq6F,wBAAwBG,EAAS9pE,EAAM49D,SAASv9C,aAAao+B,KAAMz+C,EAAM49D,SAAS0L,gBAAgBS,cAAc,EAGjHC,EAAWC,IACf,MAAMznF,EAAMlT,KAAK4kF,OAAOC,UAAU8V,GAClCznF,EAAIwb,OAEJ1uB,KAAK6R,eAAe9Q,IAAImS,EAAIsyE,cAA5BxlF,CAA2C,WAAW,KACpDo6F,IACA9lE,GAAU,GACT,CAACrmB,MAAM,GAAM,EAGZqsF,EAAW,IAAI,KAAI,CACvB9/B,aAAc,qBACd17B,SAAU,GACV7L,UAAW,KACTynE,EAAQ3B,GAAwB,EAElClnF,eAAgB7R,KAAK6R,iBAGjB0oF,EAAW,IAAI,KAAI,CACvB//B,aAAc,qBACd17B,SAAU,GACV7L,UAAW,KACTynE,EAAQf,GAAwB,EAElC9nF,eAAgB7R,KAAK6R,iBAGjB2oF,EAAU,IAAI,KAAI,CACtBhgC,aAAc,oBACd17B,SAAU,GACV7L,UAAW,KACTynE,EAAQ1B,GAAuB,EAEjCnnF,eAAgB7R,KAAK6R,iBAGjBqoF,GAAc,OAAO,sCAAuC,CAACnmF,KAAM,SAAUC,KAAM,iCACzF,QAAiBkmF,GAAa,MAC5B,EAAA12C,GAAA,GAAkB,CAChBgX,aAAc,wCACdC,mBAAoB,mCACpBnkD,OAAQ,CACNokD,QAAS,WAEVpsD,MAAK,KACN,MAAMggF,EAAW9sE,EAAA,WACjB8sE,EAAS0L,iBAAkB,EAAA5yD,GAAA,GAAK,+BAChCknD,EAASv9C,cAAe,EAAA3J,GAAA,GAAK,4BAC7B1W,EAAM49D,SAAWA,EACjBtuF,KAAKiH,SAASkyF,gBAAgBC,SAAS,WAAY9K,GAEnD8L,IACAL,EAAkB1wD,SAAW3Y,EAAM49D,SAAS0L,gBAAgBvsF,OAAO0mC,QAAQ,GAC3E,IAGJ,MAAMymD,EAAmB,KACvB,MAAMzmD,GAAY4lD,EAAkB1wD,QAE9BilD,EAAW9sE,EAAA,WACd2yB,EACDm6C,EAAS0L,gBAAgBvsF,OAAO0mC,UAAW,SAEpCm6C,EAAS0L,gBAAgBvsF,OAAO0mC,SAGzC,CAACmmD,EAAUC,EAAUC,GAASz1F,SAAS65B,IACrCA,EAAIxzB,UAAUmI,UAAU1J,OAAO,cAAesqC,EAAS,IAGzDn0C,KAAKiH,SAASkyF,gBAAgBC,SAAS,WAAY9K,GAEnDh6D,GAAU,EAGZylE,EAAkBnlE,MAAMhnB,iBAAiB,SAAUgtF,GACnDA,IACAR,IAEAvxD,EAAQl2B,QAAQjH,OACduuF,EAAQ7uF,UACRkvF,EAASlvF,UACTmvF,EAASnvF,UACTovF,EAAQpvF,UACR8uF,GAGFl6F,KAAKm0B,WAAWzoB,OAAOm9B,EAAQz9B,U,CAGjC,CACE,MAAMy9B,EAAU,IAAI,IAAe,CAAC3wB,KAAM,kBAE1C2wB,EAAQl2B,QAAQjH,OAAO,IAAI,KAAI,CAC7Bs/B,cAAe,IAAI,KAAc,CAC/Bh3B,KAAM,cACNkE,KAAM,OACNoqC,SAAU,yBACVzwC,eAAgB7R,KAAK6R,iBAEvBA,eAAgB7R,KAAK6R,iBACpBzG,UAAW,IAAI,KAAI,CACpB4/B,cAAe,IAAI,KAAc,CAC/Bh3B,KAAM,gBACNkE,KAAM,SACNoqC,SAAU,2BACVzwC,eAAgB7R,KAAK6R,iBAEvBA,eAAgB7R,KAAK6R,iBACpBzG,WAEHpL,KAAKm0B,WAAWzoB,OAAOm9B,EAAQz9B,U,CAEnC,E,+RAEQivF,wBAAwBz7D,EAAU0vD,EAAwC4K,GAChF,IAAI1sF,EACJ,MAAMmsD,EAA2B,GAE3BkiC,EAAW12F,OAAOC,KAAKkqF,GACvBwM,EAAcD,EAAS//E,KAAKtO,GAAQ8hF,EAAS9hF,GAAOotF,GAAuBptF,QAAOvI,IAAW8rB,OAAO+M,SAC1G,GAAIg+D,EAAYj4F,QAAsB,IAAZq2F,EAEnB,CACL,MAAM6B,EAAQD,EAAYj4F,SAAWg4F,EAASh4F,OAQ9C,QAPeoB,IAAZi1F,GACD1sF,EAAMuuF,EAAQ,6BAA+B,wBAC7CpiC,EAAKt2D,MAAK,EAAAo3F,GAAA,GAAYP,KAEtB1sF,EAAMuuF,EAAQ,yBAA2B,qBAGvCA,EAAO,CACT,MAAMr9B,EAAWryD,SAASC,cAAc,QACxCoyD,EAAShyD,WAAU,QAAKovF,EAAYhgF,KAAKtO,IAAQ,QAAKA,MAAO,GAAM,IACnEmsD,EAAKt2D,KAAKq7D,E,OAbZlxD,EAAM,mBAiBR,EAAAqgB,EAAA,GAAe+R,EAAIE,UAAU,QAAKtyB,EAAKmsD,GACzC,E,uVC/Ka,MAAM6tB,WAAuB,IAA5C,c,oBACU,KAAA3yE,QAOJ,CAAC,CAgRP,CAvQewiB,O,0CACXr2B,KAAKoL,UAAUmI,UAAUxS,IAAI,sBAC7Bf,KAAK2hF,SAAS,YAEd,MAAM1mE,GAAU,OAAiB,CAC/BpJ,eAAgB7R,KAAK6R,eACrBuT,UAAW,cACXvR,QAAS,CAAC,CACRE,KAAM,SACNC,KAAM,qBACNC,QAAS,KACP,IAAI,IAAU,SAAU,CACtBumD,aAAc,SACdC,mBAAoB,qBACpB5mD,QAAS,CAAC,CACR6mD,QAAS,SACTtkC,SAAU,KACRp2B,KAAKiH,SAAS4zD,WAAWmgC,QAAQ,EAEnC7nB,UAAU,MAEXtkD,MAAM,MAKf7uB,KAAK6T,QAAQonF,MAAO,QAAW,QAE/Bj7F,KAAKsrD,OAAO5/C,OAAO1L,KAAK6T,QAAQonF,KAAMhgF,GAEtCjb,KAAKk7F,QAAU,IAAI,KAAYl7F,KAAKiH,SAAUjH,KAAKm0B,WAAYn0B,KAAK6R,gBAAgB,GACpF7R,KAAKk7F,QAAQ7kE,OACbr2B,KAAKk7F,QAAQ9yB,QAAQ5mD,EAAA,QACrB,MAAM25E,EAAcn7F,KAAKk7F,QAAQ1vB,sBAE3B4vB,GAAkB,OAAO,wDAAyD,CAACrnF,KAAM,eAC/F,QAAiBqnF,GAAiB,KAChC,MAAM93F,EAAS+H,SAASC,cAAc,UACtC,iBAAyB,MAAaojB,KAAKprB,GAAS+3F,IAClDA,IAAS/sF,MAAM+zE,GACNriF,KAAKiH,SAASi9B,kBAAkBo3D,mBAAmBjZ,IAC1D,GACF,GACD,CAACxwE,eAAgB7R,KAAK6R,iBACzB7R,KAAKk7F,QAAQh5F,QAAQooB,iBAAiB/U,kBAAkB7J,OAAO0vF,GAE/D,MAAMG,EAAwB,IAAW,mC,MACvC,MAAMr6D,QAAalhC,KAAKiH,SAASk6B,gBAAgB2kD,UACjDsV,EAAgB7nF,UAAU1J,OAAO,OAA0B,sBAAR,QAAV,EAAAq3B,EAAK1E,aAAK,eAAE5sB,GACvD,IAEA2rF,IACAv7F,KAAK6R,eAAe9Q,IAAIygB,EAAA,EAAxBxhB,CAAmC,iBAAiB,EAAEgI,aACjDwZ,EAAA,SAAmBxZ,GACpBuzF,G,IA8CJ,MAAMl5E,EAAahX,SAASC,cAAc,OAC1C+W,EAAW9O,UAAUxS,IAAI,mBAMzB,MAAM6jC,EAAI,CACR7wB,EACAC,EACAwxB,EACA4vD,KASA,IAAIA,EAAa,CACf,MAAMn9C,EAAKzS,EAAmC4vD,YAC3Cn9C,IAEDm9C,EAAc,IAAM,CAACn9C,EAAEj4C,O,CAI3B,MAAO,CACL+T,OACAC,OACA2mF,eAAgBn1D,EAChB4vD,cACAz8B,KAAMy8B,aAAW,EAAXA,IACP,EAeG78B,EARI,CACR3zB,EAAE,SAAU,gCAAiC6xD,IAC7C7xD,EAAE,OAAQ,eAAgBk1D,IAC1Bl1D,EAAE,OAAQ,qCAAsCsnD,IAChDtnD,EAAE,WAAY,yCAA0C0rD,IACxD1rD,EAAE,SAAU,0BAA2BuvD,KAG1Br5E,KAAK9X,IAClB,MAAM,KAAC+Q,EAAMC,KAAM0b,EAAW,eAAEirE,EAAc,YAAEvF,GAAepyF,EAC/D,OAAO,IAAI,KAAI,CACbw3D,aAAc9qC,EACd3b,OACAkf,UAAW,IAAW,mCACpB,MAAM0lC,EAAO31D,EAAK21D,WAAa31D,EAAK21D,KAAO,GACrCzlD,EAAMlT,KAAK4kF,OAAOC,UAAU8V,GAClCznF,EAAIwb,QAAQiqC,GAETzlD,aAAe,KAA2BkiF,GAC3CliF,EAAIsyE,cAAc53E,iBAAiB,gBAAiBW,IAClDvL,EAAK21D,KAAOpqD,EAAQD,MAAK,IAAM8mF,KAAqB,GAG1D,IACAvjF,eAAgB7R,KAAK6R,gBACrB,IAGE2pF,EAAexD,GAAe5C,cACpC78B,EAAKl2D,KACHrC,KAAKy7F,WAAa,IAAI,KAAI,CACxBjhC,aAAc,UACd0jB,oBAAqB,IACrBnqE,KAAM,iBACNkf,UAAW,IAAW,mCAChBjzB,KAAKuqF,uBACDvqF,KAAKktF,wBAGb,MAAMh6E,EAAMlT,KAAK4kF,OAAOC,UAAUgF,IAClC32E,EAAIq3E,eAAiBvqF,KAAKuqF,eAC1Br3E,EAAIsyE,cAAc53E,iBAAiB,WAAW,KAC5C5N,KAAKuqF,oBAAiBtmF,EACtBjE,KAAKktF,sBAAqB,EAAK,GAC9B,CAACj/E,MAAM,IACViF,EAAIwb,MACN,IACA7c,eAAgB7R,KAAK6R,iBAGvB7R,KAAK07F,YAAc,IAAI,KAAI,CACzBlhC,aAAc,2BACd0jB,qBAAqB,QAAK,gBAC1BnqE,KAAM,WACNkf,UAAW,KACTjzB,KAAK4kF,OAAOC,UAAUmT,IAAgBtpE,KAAK8sE,EAAa,EAE1D3pF,eAAgB7R,KAAK6R,kBAIzBwQ,EAAW3W,UAAU6sD,EAAKz9C,KAAK8jB,GAAQA,EAAIxzB,aAK3C,MAAMuwF,EAAiB,IAAI,IAC3BA,EAAehpF,QAAQjH,OAAO2W,GAE9BriB,KAAKm0B,WAAWzoB,OAAO1L,KAAKk7F,QAAQh5F,QAAuCy5F,EAAevwF,WAE1F,MAAMwwF,EAAqB,KACzBC,EAAkB,kBAA+B,EAEnD,IAAIA,GACJ,QAAiB77F,KAAK6T,QAAQonF,MAAM,KACtBj7F,KAAK4kF,OAAOC,UAAU,MAC9Bn2D,KAAKmtE,EAAgB,GACxB,CAAChqF,eAAgB7R,KAAK6R,iBACzB+pF,IAMA57F,KAAK6R,eAAe9Q,IAAIygB,EAAA,EAAxBxhB,CAAmC,eAAgB6pE,IAC9CroD,EAAA,oBAA8BqoD,GAC/B+xB,G,IAIJtH,GAAA,sBAEAt0F,KAAKktF,8BAEEiO,IACT,G,CAEQW,kBAAkBC,GACxB,GAAG/7F,KAAKg8F,2BAA6BD,EAAW,OAAO/7F,KAAKg8F,yBAE5D,MAAMztF,EAAUvO,KAAKg8F,yBAA2Bh8F,KAAKiH,SAAS4zD,WAAW6vB,UAAU,6BAClFvyE,SAAQ,KACJnY,KAAKg8F,2BAA6BztF,IACnCvO,KAAKg8F,8BAA2B/3F,E,IAIpC,OAAOsK,CACT,CAEO2+E,qBAAqB6O,GAC1B,OAAO/7F,KAAK87F,kBAAkBC,GAAWztF,MAAM4gF,IAC7ClvF,KAAKuqF,eAAiB2E,EAAM3E,eAC5BvqF,KAAKy7F,WAAW58D,WAAWjmB,YAAc,GAAK5Y,KAAKuqF,eAAe1nF,MAAM,GAE5E,CAEOonD,sBAEL,OADAjqD,KAAKk7F,QAAQn3F,UACNmO,MAAM+3C,qBACf,ECrSa,MAAMgyC,WAAyB,IAA9C,c,oBACU,KAAAj0C,aAAyC,IAyFnD,CAlFS3xB,OACLr2B,KAAKoL,UAAUmI,UAAUxS,IAAI,yBAC7Bf,KAAK2hF,SAAS,cAEd3hF,KAAK4oD,WAAa,IAAI,KAAYC,IAChC7oD,KAAKgoD,aAAea,CAAO,IAG7B,MAAMhgB,EAAU,IAAI,IAAe,CACjCv1B,QAAS,wCAGLsuE,EAAev2E,SAASC,cAAc,OAC5Cs2E,EAAaruE,UAAUxS,IAAI,iBAE3Bf,KAAKk8F,sBAAwB,IAAI,KAAW,CAC1CjxD,MAAO,mBACPu1B,UAAW,MAGbxgE,KAAKm8F,6BAA+B,IAAI,KAAW,CACjDlxD,MAAO,iCACPu1B,UAAW,MAGbohB,EAAal2E,OAAO1L,KAAKk8F,sBAAsB9wF,UAAWpL,KAAKm8F,6BAA6B/wF,WAE5F,MAAMgxF,EAAiB,KACrBp8F,KAAKwoD,QAAQj1C,UAAU1J,OAAO,eAAgB7J,KAAKk8F,sBAAsBxvF,MAAM7J,SAC5E7C,KAAKk8F,sBAAsBtnE,MAAMrhB,UAAUqB,SAAS,WACpD5U,KAAKm8F,6BAA6BvnE,MAAMrhB,UAAUqB,SAAS,SAAS,EAGzE5U,KAAKk8F,sBAAsBtnE,MAAMhnB,iBAAiB,QAASwuF,GAC3Dp8F,KAAKm8F,6BAA6BvnE,MAAMhnB,iBAAiB,QAASwuF,GAElEp8F,KAAKwoD,SAAU,OAAa,CAACz0C,KAAM,gBAEnC,QAAiB/T,KAAKwoD,SAAS,KAC7B,MAAMz5C,EAAQ/O,KAAKk8F,sBAAsBxvF,MACnCo/D,EAAQ9rE,KAAKm8F,6BAA6BzvF,MAEhD1M,KAAKwoD,QAAQrU,UAAW,EACxBn0C,KAAKiH,SAAS88B,gBAAgBm+C,cAAc,CAC1CnzE,QACA+8D,QACAuwB,WAAW,IACV/tF,MAAMguF,IACJt8F,KAAKgoD,cACNhoD,KAAKgoD,eAAe15C,MAAM+zE,IACxBriF,KAAKiH,SAAS88B,gBAAgBu+C,UAAUga,EAAWja,EAAU,IAIjE3sD,EAAA,gBAA0B,CAAC1tB,OAAQs0F,EAAU7lE,UAAS,KAEtD,wBAAoCz2B,MACpCA,KAAK4kF,OAAOC,UAAU,KAAkBn2D,KAAK,CAC3C9sB,KAAM,UACNkjF,WAAW,EACX/1E,MAAO,kBACPxL,YAAa,gBACbwhF,QAAUt8C,GACDzoC,KAAKiH,SAAS88B,gBAAgBw+C,gBAAgB+Z,EAAW7zD,IAElE,GACF,GACD,CAAC52B,eAAgB7R,KAAK6R,iBAEzB7R,KAAK2S,QAAQjH,OAAO1L,KAAKwoD,SACzB3f,EAAQl2B,QAAQjH,OAAO1L,KAAK4oD,WAAWx9C,UAAWw2E,GAClD5hF,KAAKm0B,WAAWzoB,OAAOm9B,EAAQz9B,UACjC,CAEO6+C,sBAML,OALAjqD,KAAK4oD,WAAWnjC,QAChBzlB,KAAKgoD,aAAe,KACpBhoD,KAAKk8F,sBAAsBxvF,MAAQ,GACnC1M,KAAKm8F,6BAA6BzvF,MAAQ,GAC1C1M,KAAKwoD,QAAQrU,UAAW,EACjBjiC,MAAM+3C,qBACf,E,8CC5Fa,MAAMsyC,WAA2B,KAC9Cx8F,cACEmS,MAAM,wDAAyD,CAACy8D,UAAU,EAAMC,YAAa,MAAO7/D,MAAO,oBAC3G/O,KAAKmL,WACP,CAEcA,Y,sCACZ,QAAiBnL,KAAKiyE,YAAY,KAChC,MAAM1jE,EAAUvO,KAAKiH,SAASk6B,gBAAgBq7D,cAAcC,EAAe/vF,MAAOgwF,EAAmBhwF,MAAOiwF,EAAcjwF,OAE1H6B,EAAQD,MAAK,KACXtO,KAAKqW,MAAM,IACT7Q,IACc,YAAbA,EAAI5D,QACL,EAAA6tB,GAAA,IAAS,CAACC,YAAa,sCACvBktE,EAASzoD,UAAW,E,IAIxByoD,EAAS7zC,gBAAgBx6C,EAAQ,GAChC,CAACsD,eAAgB7R,KAAK6R,iBAEzB,MAAMu2C,EAA4B,GAC5Bh6B,EAAM/iB,SAASC,cAAc,OACnC8iB,EAAI7a,UAAUxS,IAAI,eAClB,MAAM07F,EAAiB,IAAI,KAAW,CACpCxxD,MAAO,YACP/yB,KAAM,sBACNsoD,UAAW,GACXlY,UAAU,IAENo0C,EAAqB,IAAI,KAAW,CACxCzxD,MAAO,WACP/yB,KAAM,0BACNsoD,UAAW,KAEPm8B,EAAgB,IAAI,KAAc,CAACr0C,UAAU,IACnDF,EAAY/lD,KAAKo6F,EAAgBC,EAAoBC,GAErD,MAAMx0D,EAAU,KACd,MAAMjwB,EAAOukF,EAAe/vF,MAAQ,IAAMgwF,EAAmBhwF,MAE7DkwF,EAASl0C,WAAW97B,UAAY1U,EAChC0kF,EAASl0C,WAAWxmB,QAAQ,EAG9BliC,KAAK6R,eAAe9Q,IAAI07F,EAAe7nE,MAAvC50B,CAA8C,QAASmoC,GACvDnoC,KAAK6R,eAAe9Q,IAAI27F,EAAmB9nE,MAA3C50B,CAAkD,QAASmoC,GAE3Dw0D,EAAcp8B,SAAW,MACdo8B,EAAcjwF,MAAMnH,MAAM,MAGrC,MAAM27B,QAAalhC,KAAKiH,SAASk6B,gBAAgB2kD,UAC3CvkD,GAAY,EAAAD,GAAA,GAAkBJ,EAAKG,OACtCE,EAAU1nB,OACX8iF,EAAcjwF,MAAQ,IAAM60B,EAAU1nB,KAAKorC,cAG7C,MAAM23C,EAAW,IAAI,KAAS,CAC5Bx0C,cACAv2C,eAAgB7R,KAAK6R,eACrB82C,iBAAiB,EACjBH,QAASxoD,KAAKiyE,WACd78C,WAAY,MAGdhH,EAAI1iB,OAAO+wF,EAAerxF,UAAWsxF,EAAmBtxF,UAAWwxF,EAASl0C,YAC5E1oD,KAAKoL,UAAUM,OAAO0iB,EAAKuuE,EAAcvxF,WAEzCpL,KAAK6uB,MACP,E,0TC/Da,MAAMguE,WAAuB,IAKnCxmE,OACLr2B,KAAKoL,UAAUxD,GAAK,qBAIpB,MAAMojF,GAAS,OAAa,CAACj3E,KAAM,MAAOsH,UAAW,eACrDrb,KAAK2S,QAAQjH,OAAOs/E,IAEpB,QAAiBA,GAAQ,KACvB,iBAAyBuR,GAAmB,GAC3C,CAAC1qF,eAAgB7R,KAAK6R,iBAEzB7R,KAAK+pD,YAAc,IAAI,IAAY,UAAWr9C,IAC5C1M,KAAK88F,aAAapwF,EAAM,IAG1B1M,KAAK6R,eAAe9Q,IAAIygB,EAAA,EAAxBxhB,CAAmC,mBAAyB6pE,IAAW,O,EAAA,K,OAAA,E,EAAA,YACrE,MAAMkzB,QAAkB/8F,KAAKiH,SAASk6B,gBAAgB47D,UAAUlzB,GAC1D7hE,EAAS6hE,EAAOpzC,WACnBsmE,EAAW/8F,KAAKg9F,eAAej8F,IAAIiH,GACjChI,KAAKg9F,eAAe/7F,OAAO+G,EAClC,E,YALuE,K,6QAKrE,IAEFhI,KAAK+O,MAAM+d,YAAY9sB,KAAK+pD,YAAY3+C,WAExCpL,KAAKk3B,YAAa,UAElBl3B,KAAK88F,cAIP,CAEUG,aACR,MAAMD,EAAiB,IAAI,KAAe,CACxC/1F,SAAUjH,KAAKiH,WAEXosB,EAAO2pE,EAAe3pE,KAM5B,OALAA,EAAKzrB,GAAK,WACVyrB,EAAK9f,UAAUxS,IAAI,sBACnB06B,EAAA,6BAAuCpI,GAAM,KAC3CrzB,KAAK4S,OAAO,QACX3O,GAAW,GACP+4F,CACT,CAEU7hF,UACRnb,KAAKk3B,WAAWptB,OAIlB,CAEUy9E,sBACL,EAAA3sE,WAAc6rE,GAAS,IAC1BzmF,KAAK+pD,YAAYn1B,MAAMC,OACzB,CAEOioE,aAAa7oE,GAClBj0B,KAAKk3B,WAAWptB,QAChB,MAAMotB,EAAal3B,KAAKk3B,WAAWj0B,MACnCjD,KAAKm0B,WAAWK,iBAAmB,KACnCx0B,KAAKm0B,WAAW/oB,UAAUwN,YAAc,GAExC5Y,KAAKiH,SAASk6B,gBAAgBO,mBAAmBzN,OAAOhwB,EAAW,UAAUqK,MAAMqzB,IACjF,IAAIzK,IACF,OAGF,MAAM8lE,EAAiBh9F,KAAKg9F,eAAiBh9F,KAAKi9F,aAElD,IAAIC,EAAa,KACf,MAAMnzD,EAAY1qB,GAAA,SAAoB,GAAK,KAAO,EACtCsiB,EAASxP,OAAO,EAAG4X,GAE3BhlC,SAASiD,IACXg1F,EAAej8F,IAAIiH,EAAO,IAGxB25B,EAAS9+B,SACXq6F,OAAaj5F,EACbjE,KAAKm0B,WAAWK,iBAAmB,K,EAIvC0oE,IACAl9F,KAAKm0B,WAAWK,iBAAmB,KAC9B0oE,EACDA,IAEAl9F,KAAKm0B,WAAWK,iBAAmB,I,GAIvC,EAAA3H,EAAA,GAAe7sB,KAAKm0B,WAAW/oB,UAAW4xF,EAAe3pE,KAAK,GAElE,EClHa,MAAM8pE,WAAuB,IAInC9mE,OASL,GARAr2B,KAAKo9F,YAAc3hE,EAAA,iBAEnBz7B,KAAKoL,UAAUxD,GAAK,2BACpB5H,KAAK2hF,SAAS,iBAEd3hF,KAAKsrD,OAAO/3C,UAAUxS,IAAI,kBAC1Bf,KAAK2S,QAAQY,UAAUxS,IAAI,mBAEvB06B,EAAA,YAAsB0hE,GAAe76D,UAAW,CAClD,MAAM,GAAC+6D,EAAE,WAAElpE,GAAcsH,EAAA,UAAoB,CAC3C1sB,WAAO9K,EACP2D,GAAIu1F,GAAe76D,SACnB6yD,QAAS,QAEXhhE,EAAW/oB,UAAUM,OAAO2xF,E,CAG9B,MAAMlpE,EAAasH,EAAA,YAAsB0hE,GAAe76D,UAAUnO,WAKlE,OAJAn0B,KAAKm0B,WAAW/oB,UAAU0hB,YAAYqH,EAAW/oB,WACjD+oB,EAAWghD,sBAAsBn1E,KAAKoL,WAG/BqwB,EAAA,gCAA0C0hE,GAAe76D,UAAUh0B,MAAK,EAAEk+D,SAAQsO,oBACvF,GAAGtO,EACD,OAAOsO,C,GAGb,CAGAyM,qBACE9rD,EAAA,YAAsBz7B,KAAKo9F,aAAa33E,OAC1C,CAEAtK,UACEnb,KAAKm0B,WAAWxgB,wBAAqB1P,EACrCw3B,EAAA,gCAA0Cz7B,KAAKo9F,YACjD,CAEAnzC,sBAEE,OADAxuB,EAAA,YAAsB0hE,GAAe76D,UAAU7c,QACxCvT,MAAM+3C,qBACf,EA9Ce,GAAA3nB,SAA2B,MCY7B,MAAMg7D,WAA2B,IAAhD,c,oBAEU,KAAAC,mBAA6B,CA+QvC,CAlIUC,cAAc7kD,GACpB,MAAuC,UAApCn3B,EAAA,wBACEm3B,EAAW,SACL,QAAK,YAAa,CAACnyC,KAAKmD,MAAMgvC,EAAW,SAEzC,QAAK,YAAa,CAACnyC,KAAKmD,MAAiB,MAAXgvC,KAGpCA,GAAY,KACN,QAAK,eAAgB,CAACA,EAAW,OAEjC,QAAK,cAAe,CAACA,GAGlC,CAkDQ8kD,gBACFz9F,KAAK09F,sBAAuB19F,KAAKu9F,oBACrCv9F,KAAKu9F,mBAAoB,GAEzB,EAAA9tE,GAAA,IAAM,qFAENzvB,KAAKiH,SAASk6B,gBAAgBw8D,WAC5B39F,KAAK09F,oBAAoB1a,SACzBhjF,KAAK09F,oBAAoBxa,UACzBljF,KAAK09F,oBAAoBE,UACzB,EACA,YAGFv4F,UAAUu9E,YAAYib,eAAetwD,IACnC,MAAMuwD,EAAuBvwD,EAAOw1C,OAAOG,YAAcljF,KAAK09F,oBAAoBxa,UAC5E6a,EAAsBxwD,EAAOw1C,OAAOC,WAAahjF,KAAK09F,oBAAoB1a,SAC1Egb,EAAgBh+F,KAAKi+F,kBACzB1wD,EAAOw1C,OAAOC,SAAUz1C,EAAOw1C,OAAOG,UACtCljF,KAAK09F,oBAAoB1a,SAAUhjF,KAAK09F,oBAAoBxa,WAC1D,KAEA6a,GAAuBD,IAAyBE,IAClDh+F,KAAKiH,SAASk6B,gBAAgBw8D,WAC5BpwD,EAAOw1C,OAAOC,SACdz1C,EAAOw1C,OAAOG,UACd31C,EAAOw1C,OAAO6a,UACd,EACA,YAEF59F,KAAK09F,oBAAsB,CACzB1a,SAAUz1C,EAAOw1C,OAAOC,SACxBE,UAAW31C,EAAOw1C,OAAOG,UACzB0a,SAAUrwD,EAAOw1C,OAAO6a,U,IAIhC,CAEQM,eACFl+F,KAAKu9F,oBACTv9F,KAAKu9F,mBAAoB,GACzB,EAAA9tE,GAAA,IAAM,gGACNzvB,KAAKiH,SAASk6B,gBAAgBw8D,WAC5B,EACA,EACA,GACA,EACA,GAEJ,CAEQM,kBAAkBE,EAAcC,EAAeC,EAAcC,GACnE,MAAM39F,EAAI,oBACV,OACE,MAAQ6F,KAAK+3F,KACX/3F,KAAKmzC,KACF,GAAMnzC,KAAKwzC,KAAKqkD,EAAOF,GAAQx9F,GAE9B6F,KAAKwzC,IAAImkD,EAAOx9F,GAAK6F,KAAKwzC,IAAIqkD,EAAO19F,IACpC,EAAI6F,KAAKwzC,KAAKskD,EAAQF,GAASz9F,GAAG,IAK7C,E,8YC7OK,MAAM69F,GAA+B,uBAErC,MAAMC,WAAuB,IAmBlC1+F,cACEmS,MAAM,CACJwsF,UAAWrzF,SAASkR,eAAe,eACnCuhC,eAAgB,SATZ,KAAApqB,aAAuG,CAAC,CAWhH,CAEAvoB,UAAUlE,GACRjH,KAAKiH,SAAWA,EAGhBjH,KAAK+pD,YAAc,IAAI,IAAY,UACnC,MAAM40C,EAAgB3+F,KAAK0+F,UAAU9mF,cAAc,8BACnD+mF,EAAcjzF,OAAO1L,KAAK+pD,YAAY3+C,WAEtC,MAUMwzF,EAAkB,KACtB5+F,KAAK6kF,UAAUgY,IAAgBnuE,MAAM,EAIvC1uB,KAAK6+F,QAAU7+F,KAAK0+F,UAAU9mF,cAAc,wBAE5C,MAAMknF,EAAoC,CACxC/qF,KAAM,UACNC,KAAM,gBACNC,QAAS,KACPjU,KAAK6kF,UAAUsY,IAAgBzuE,MAAM,EAEvCnmB,OAAQ,IAAW,mCAEjB,eADqBvI,KAAKiH,SAASk7B,eAAe0yD,iBAAiB,OAAmB,IACtEhyF,gBAAkB7C,KAAKiH,SAASk7B,eAAe48D,gBAAgB,OACjF,KAGIC,EAAqB,IAAI,KAAc,CAC3Cn1F,QAAQ,EACRw/B,QAA6C,UAApC0nD,GAAA,aAA2B74E,OAEtC8mF,EAAmBpqE,MAAMhnB,iBAAiB,UAAU,IAAW,mCAC7DmjF,GAAA,cAA4BiO,EAAmBpqE,MAAMyU,QAAU,QAAU,MAC3E,MAEA7nB,EAAA,mBAA2B,gBAAgB,KACzCw9E,EAAmBv8C,iBAAqD,UAApCsuC,GAAA,aAA2B74E,KAAiB,IAGlF,MA+FM+9B,EA/FuF,CAAC,CAC5FliC,KAAM,gBACNC,KAAM,gBACNC,QAAS,KACPvR,YAAW,KACTgzB,EAAA,WAAqB,CACnB1tB,OAAQ0tB,EAAA,SACR,GACD,EAAE,GAENopE,EAAY,CACb/qF,KAAM,OACNC,KAAM,WACNC,QAAS2qF,GACR,KAA2B,CAC5B7qF,KAAM,QACNC,KAAM,eACNC,QAAS,KACPjU,KAAK6kF,UAAUyY,IAAoB5uE,MAAM,QAEzCzqB,EAAW,CACb8P,KAAM,WACNC,KAAM,WACNC,QAAS,KACPjU,KAAK6kF,UAAU2B,IAAgB93D,MAAM,GAEtC,CACD3a,KAAM,WACNC,KAAM,WACNC,QAAS,OAGT+2B,cAAeg0D,GACd,CACDjrF,KAAM,aACNC,KAAM,aACNC,QAAS,OAGT+2B,cAAe,IAAI,KAAc,CAC/BnhC,QAAQ,EACRw/B,SAAS,EACTiZ,SAAU,gCAEX,CACDvuC,KAAM,OACNC,KAAM,mBACNC,QAAS,KACP,MAAMvM,EAAM,YAAY,uBAAuB,GAC/CguB,EAAA,WAAqBhuB,EAAI,GAE1B,CACDqM,KAAM,MACNC,KAAM,YACNC,QAAS,KACP,MAAMQ,EAAIpJ,SAASC,cAAc,KACjCmJ,EAAEpU,OAAS,SACXoU,EAAEgqB,KAAO,kDACTpzB,SAASI,KAAKC,OAAO+I,GACrBA,EAAEQ,QACFvS,YAAW,KACT+R,EAAEjS,QAAQ,GACT,EAAE,GAEN,CACDuR,KAAM,SACNC,KAAM,2BACNC,QAAS,KACPoR,QAAQqH,IAAI,CACVuyE,GAAA,MAAmB,CAACC,WAAY,MAChCD,GAAA,SAAsB,eACrB3wF,MAAK,KACNmiB,SAASgO,KAAO,6BAA6B,GAC7C,EAEJl2B,OAAQ,IAAM,mBACb,CACDwL,KAAM,SACNC,KAAM,kCACNC,QAAS,KACPgrF,GAAA,SAAsB,aAAa3wF,MAAK,KACtCmiB,SAASgO,KAAO,oCAAoC,GACpD,EAEJl2B,OAAQ,IAAM,mBACb,CACDwL,KAAM,WACNC,KAAM,cACNC,QAAS,KACP,MAAMkrF,GAAgB,UACtBA,SAAAA,GAAiB,EAEnB52F,OAAQ,OAAQ,YAGkBwnB,OAAO+M,SAE3C98B,KAAKo/F,UAAW,OAAiB,CAC/Bh6E,UAAW,eACXvR,QAASoiC,EACT/6B,OAAQ,CAACnT,EAAGkT,K,MACV,MAAMokF,EAAgBh0F,SAASC,cAAc,KAC7C+zF,EAAc5gE,KAAO,iEACrB4gE,EAAch/F,OAAS,SACvBg/F,EAAcC,IAAM,sBACpBD,EAAc9rF,UAAUxS,IAAI,mBAC5Bs+F,EAAczxF,iBAAiB,MAAmB7F,IAChDA,EAAEkpE,kBACFn6C,GAAA,SAA6B,IAE/B,MAAM8O,EAAIv6B,SAASC,cAAc,QACjCs6B,EAAEryB,UAAUxS,IAAI,wBAChB6kC,EAAE7iB,UAAY,eAAiB,YAAa,IAAqB,iBACjEs8E,EAAc3zF,OAAOk6B,GACrB3qB,EAAQ1H,UAAUxS,IAAI,cACtBka,EAAQvP,OAAO2zF,GAEG,QAAlB,EAAAP,EAAW58F,eAAO,SAAEwJ,OAAO1L,KAAKu/F,cAAc,IAGlDv/F,KAAKo/F,SAAS7rF,UAAU/Q,OAAO,cAC/BxC,KAAKo/F,SAAS7rF,UAAUxS,IAAI,uBAAwB,cAEpDf,KAAK6+F,QAAQ5lF,cAAc1B,aAAavX,KAAKo/F,SAAUp/F,KAAK6+F,SAE5D7+F,KAAKw/F,YAAa,OAAiB,CACjCp6E,UAAW,WACXvR,QAAS,CAAC,CACRE,KAAM,aACNC,KAAM,aACNC,QAAS,KACPjU,KAAK6kF,UAAUoX,IAAkBvtE,MAAM,GAExC,CACD3a,KAAM,WACNC,KAAM,WACNC,QAjLoB,KACtBjU,KAAK6kF,UAAU,KAAkBn2D,KAAK,CACpC9sB,KAAM,OACNkjF,WAAW,EACXC,QAAUt8C,GAAYzoC,KAAK6kF,UAAUpD,GAAgB/yD,KAAK+Z,GAC1D15B,MAAO,kBACPxL,YAAa,iBACb,GA2KC,CACDwQ,KAAM,aACNC,KAAM,iBACNC,QAAS2qF,MAGb5+F,KAAKw/F,WAAWnkF,UAAY,0EAC5Brb,KAAKw/F,WAAWjnF,mBAAmB,aAAc,6GAIjDvY,KAAKw/F,WAAW53F,GAAK,WACrB+2F,EAAcxnB,mBAAmBzrE,OAAO1L,KAAKw/F,YAE7Cx/F,KAAKy/F,UAAYp0F,SAASC,cAAc,OACxCtL,KAAKy/F,UAAUpkF,UAAY,2DAC3B,EAAAwd,GAAA,GAAO74B,KAAKy/F,WACZz/F,KAAKy/F,UAAU/zF,QAAO,QAAK,YAE3B,QAAiB1L,KAAKy/F,WAAW,KAC5Bz/F,KAAKy/F,UAAUlsF,UAAUqB,SAAS,cAIrC6b,SAASivE,QAAQ,IAGnBf,EAAcxnB,mBAAmBzrE,OAAO1L,KAAKy/F,WAE7Cz/F,KAAK+pD,YAAYn1B,MAAMhnB,iBAAiB,SAAS,IAAM5N,KAAK2/F,cAAc,CAAC1xF,MAAM,IAEjFjO,KAAKu/F,cAAgBl0F,SAASC,cAAc,QAC5CtL,KAAKu/F,cAAclkF,UAAY,2CAE/BmG,EAAA,mBAA2B,iBAAkBozE,IAC3C,GAAGA,EAAOhtF,KAAO,MAAmB,CAElC,MAAMqtB,EAAQ2/D,EAAOgL,cAAc/3F,KACnC7H,KAAKu/F,cAAc3mF,YAAc,IAAK,EAAAinF,GAAA,GAAa5qE,EAAO,GAC1Dj1B,KAAKu/F,cAAchsF,UAAU1J,OAAO,QAASorB,E,KAIjDj1B,KAAKiH,SAASk6B,gBAAgB6B,YAAY,kBAG1C,MAAMzd,EAAiC,CACrC3jB,KAAM,sBACNurB,MAAO,KACLzqB,YAAW,KACT1C,KAAK+pD,YAAYn1B,MAAMC,OAAO,GAC7B,IAEI,GAETxC,WAAW,GAEb7M,GAAA,WAAiCD,GAEjC,gBAA2BjX,MAAK,KAC9B,MACMwxF,EAAsB51B,aAAY,KACtCr1B,MAAM,UAAW,CAACkrD,MAAO,aACxBzxF,MAAM0mB,GAAwB,MAAfA,EAAIgrE,QAAkBhrE,EAAIirE,IAAMjrE,EAAIhhB,QAAWqR,QAAQC,WACtEhX,MAAM0F,IACFA,IAAS,mBACVhU,KAAKkgG,WAAY,EACjBvzB,cAAcmzB,GAEV9/F,KAAKw/F,WAAWjsF,UAAUqB,SAAS,cACrC5U,KAAKy/F,UAAUlsF,UAAU/Q,OAAO,a,IAIrCyV,MAAM4jB,GAAA,EAAK,GAdgB,KAeL,IAG3B,MAAMskE,EAAW,KACf,MAAM75E,EAAOtmB,KAAKsmB,KAAOtmB,KAAK+4B,cAAcrb,wBAC5CrS,SAAS+0F,gBAAgB70F,MAAM0vE,YAAY,sBAAuB30D,EAAKY,MAAQ,KAAK,GAGtF,SAAQi5E,GACR1yE,GAAA,mBAA4B,SAAU0yE,EACxC,CAEQR,aACN,MAAMU,EAAkBrgG,KAAK0+F,UAAU9mF,cAAc,qBAE/Cuc,EAAa,IAAI,KAAWksE,GAE5BztF,EAAQ,MAEZ,QAAmB5S,KAAK6+F,QAAQ,EAIlC7+F,KAAK0zB,aAAe,CAClBiO,SAAU,IAAI,IAAY,sBAAuB,gBAAY19B,OAAWA,OAAWA,OAAWA,EAAW2O,GACzGkvB,eAAgB,IAAI,IAAY,eAAgB,gBAAY79B,OAAWA,OAAWA,OAAWA,EAAW2O,GACxGwhB,SAAU,IAAI,IAAY,iBAAkB,YAC5C8O,OAAQ,IAAI,KAAY,EAAO,YAAY,EAAM,uBAAuB,GAAM,EAAOtwB,GAAO,GAC5F8vB,OAAQ,IAAI,IAAY,SAAU,YAAY,EAAM,uBAAuB,GAAM,EAAM9vB,IAGzF,MAAM4iB,EAAcx1B,KAAKw1B,YAAc,IAAI,IAAe,CACxDkD,UAAW,CAAC,CACVtmB,YAAa,2BACb8F,KAAM,cACNtW,KAAM,SACL,CACDwQ,YAAa,gCACb8F,KAAM,kBACNtW,KAAM,SACL,CACDwQ,YAAa,yBACb8F,KAAM,kBACNtW,KAAM,SACL,CACDwQ,YAAa,8BACb8F,KAAM,kBACNtW,KAAM,SACL,CACDwQ,YAAa,2BACb8F,KAAM,kBACNtW,KAAM,SACL,CACDwQ,YAAa,gCACb8F,KAAM,kBACNtW,KAAM,UAERuyB,aACAT,aAAc1zB,KAAK0zB,aACnBmE,YAAY,EACZE,eAAe,EACfC,YAAY,EACZ/wB,SAAUjH,KAAKiH,WAGjBo5F,EAAgBroF,QAAQwd,EAAY+C,IAAItf,cAAcA,eACtDkb,EAAW/oB,UAAUM,OAAO8pB,EAAYpqB,WAGtCoqB,EAAY6R,SAAS,CACnBr/B,OAAQ,GAAGyuB,WACXtlB,SAAU,IAEZqkB,EAAY0D,UAAU,GACtB1D,EAAY5yB,MAAK,GAKnB,MAAM09F,EAAgC,GACtC,IAAIC,EAAyB,GAAG9pE,WAC5B+pE,EAAkB,EAClBC,EAAkB,EACtB,MAAMC,EAAe,KAEnB1gG,KAAK+pD,YAAY3+C,UAAUmI,UAAU1J,OAAO,kBAA6C,IAA1By2F,EAAez9F,QAC9E7C,KAAK+pD,YAAY3+C,UAAUmI,UAAU1J,OAAO,cAAey2F,EAAez9F,QAEvEy9F,EAAez9F,OAChB7C,KAAK+pD,YAAYn1B,MAAMrpB,MAAM0vE,YAAY,gBAAkBqlB,EAAeA,EAAez9F,OAAS,GAAG6a,wBAAwBqH,MAAQ/kB,KAAK+pD,YAAYn1B,MAAMlX,wBAAwBoH,KAAQ,MAE5L9kB,KAAK+pD,YAAYn1B,MAAMrpB,MAAMo1F,eAAe,gB,EAI1CC,EAASv1F,SAASC,cAAc,OACtCs1F,EAAOrtF,UAAUxS,IAAI,iBACrB6/F,EAAOhzF,iBAAiB,SAAU7F,IAChC,MAAM1H,GAAS,EAAA4gB,GAAA,GAAgBlZ,EAAE1H,OAAQ,iBACzC,IAAIA,EACF,OAGF,MAAMmM,EAAMnM,EAAO0pB,QAAQvd,IAC3B,GAA4B,IAAzBA,EAAI2N,QAAQ,SAAgB,CAC7B,MAAOvK,EAAG4yB,EAAS8E,GAAW96B,EAAIub,MAAM,KACxCy4E,GAAmBh+D,EACnBi+D,GAAmBn5D,C,MAEnBi5D,EAAiB/zF,EAAIiqB,WAGvBp2B,EAAOuN,iBAAiB,SAAS,KAC/BizF,EAAexgG,EAAO,IAGxBL,KAAK+pD,YAAY3+C,UAAUM,OAAOrL,GAClCL,KAAK+pD,YAAYz1B,SAASt0B,KAAK+pD,YAAYr9C,MAAQ,IACnD4zF,EAAej+F,KAAKhC,GACpBqgG,GAAc,IAGhBlrE,EAAY+C,IAAItf,cAAcvN,OAAOk1F,GAErC,MAAME,EAAe,CAACt0F,EAAsBuC,KAC1C,MAAMqf,EAAM/iB,SAASC,cAAc,OACnC8iB,EAAI7a,UAAUxS,IAAI,iBAElB,MAAMohB,EAAW,IAAI,IA0BrB,OAzBAA,EAAS5O,UAAUxS,IAAI,uBAAwB,QAAS,aACxDohB,EAAS+oB,UAAW,EAEpB9c,EAAIrE,QAAQvd,IAAM,GAAKA,EACpBA,EAAI2f,iBACQloB,IAAV8K,IACDA,EAAQ,IAAI,KAAU,CAAC/G,OAAQwE,EAAIiqB,aAAav0B,SAGlDigB,EAASwK,kBAAkB,CAAC3kB,OAAQwE,KAEpC2V,EAAS5O,UAAUxS,IAAI,wBAGtBgO,IACoB,iBAAZ,EACPqf,EAAIrL,UAAYhU,IAEhB,EAAA8d,EAAA,GAAeuB,EAAKrf,GACpBqf,EAAI1iB,OAAOqD,KAIfqf,EAAI+c,sBAAsB,aAAchpB,GAEjCiM,CAAG,EAGNyyE,EAAkBxgG,IAEM,IADhBA,EAAO0pB,QAAQvd,IACpB2N,QAAQ,SACbqmF,EAAkBC,EAAkB,EAEpCF,EAAiB,GAAG9pE,WAGtBp2B,EAAOmC,UACP,EAAA20D,GAAA,GAAiBmpC,EAAgBjgG,GAEjCqC,YAAW,KACTg+F,IACA1gG,KAAK+pD,YAAYz1B,SAASt0B,KAAK+pD,YAAYr9C,MAAM,GAChD,EAAE,EAGP1M,KAAK+pD,YAAYuY,QAAU,KACzBg+B,EAAev7F,SAASnE,IACtBigG,EAAejgG,EAAG,GAClB,EAGJZ,KAAK+pD,YAAYz1B,SAAY5nB,IAgB3B,GAfA8oB,EAAYuR,cACZvR,EAAY6R,SAAS,CACnBr/B,OAAQu4F,EACRpvF,SAAUovF,OAAiBt8F,EAAY,EACvCgwB,MAAOvnB,EACP81B,QAASg+D,EACTl5D,QAASm5D,IAEXjrE,EAAY5yB,MAAK,GAEjBg+F,EAAO79E,UAAY,GACnByS,EAAY+C,IAAIhlB,UAAU/Q,OAAO,SAI7B+9F,GAAkB7zF,EAAM+nB,OAAQ,CAClC,MAAMyC,EAAa1B,EAAY0B,WAAWj0B,MAC1CoiB,QAAQqH,IAAI,CAEV1sB,KAAKiH,SAASk7B,eAAeC,WAAW,CAACnO,MAAOvnB,IAAQ4B,MAAK,EAAEi0B,aAAaA,EAAQznB,KAAK4P,GAAMA,EAAE1iB,WACjGhI,KAAKiH,SAASk6B,gBAAgBO,mBAAmBh1B,GAAO,KACvD4B,MAAM+wB,IACHnI,MACY,IAAI91B,IAAIi+B,EAAQ,GAAG/c,OAAO+c,EAAQ,KAE1Ct6B,SAASiD,IACf44F,EAAOl1F,OAAOo1F,EAAa94F,GAAQ,IAGrCwtB,EAAY+C,IAAIhlB,UAAU1J,OAAO,SAAU+2F,EAAO79E,WAAU,G,CAKhE,IAAIy9E,GAAmB9zF,EAAM+nB,OAAQ,CACnC,MAAMssE,EAAoB,IAC1B,QAAar0F,EAAOq0F,GACpBA,EAAMh8F,SAASi8F,IACbJ,EAAOl1F,OAAOo1F,EAAa,QAAUE,EAASx+D,QAAU,IAAMw+D,EAAS15D,QAAS05D,EAASjyF,OAAO,IAGlGymB,EAAY+C,IAAIhlB,UAAU1J,OAAO,SAAU+2F,EAAO79E,U,GAItDyS,EAAYwB,KAAKgJ,yBAAyBpyB,iBAAiB,aAAc7F,IACvE,MAAM1H,GAAS,EAAAojC,GAAA,GAAU17B,EAAE1H,OAAQ,EAAAqjC,yBACnC,IAAIrjC,EACF,OAGF,MAAM80B,GAAc,EAAAlU,GAAA,GAAgB5gB,EAAQ,gBAC5C,IAAI80B,GAAeA,EAAY5hB,UAAUqB,SAAS,wBAA0BugB,EAAY5hB,UAAUqB,SAAS,uBACzG,OAGF,MAAM5M,EAAS3H,EAAOyU,aAAa,gBAAgB2hB,WACnDz2B,KAAKiH,SAASk6B,gBAAgB8/D,iBAAiBj5F,EAAO,GACrD,CAACgN,SAAS,IAEb,MAAMksF,EAAkB71F,SAASC,cAAc,OAC/C41F,EAAgB3tF,UAAUxS,IAAI,2BAC9BmgG,EAAgBx1F,OAAO1L,KAAK0zB,aAAawP,OAAO7P,MAChDrzB,KAAK0zB,aAAawP,OAAO93B,UAAUM,OAAOw1F,GACjB,IAAI,KAAYA,GAEzC,IACIC,EADAhkD,GAAQ,EAGZ,MAAMikD,GAAa,OAAiB,CAClCzuF,QAAS0tF,EAAgBpnF,cACzBrX,KAAM,YACN46D,eAAgB,IAChBtkC,gBAAkBtwB,IACbu5F,GAAuB1tF,aAAa0tF,GAE7B,IAAPv5F,GAAau1C,IACd3nB,EAAY0D,UAAU,GAAG,GACzBl5B,KAAK+pD,YAAYsY,eACjB8+B,EAAwBztF,OAAOhR,YAAW,KACxCy+F,EAAwB,EACxBnhG,KAAKw/F,WAAWjsF,UAAU/Q,OAAO,aACjCxC,KAAKkgG,WAAalgG,KAAKy/F,UAAUlsF,UAAU/Q,OAAO,YAAY,GAC7D,MAGL26C,GAAQ,CAAK,IAIjBikD,EAAW,GAEX,MAAMC,EAAkB,aAClBC,EAAU,KACdthG,KAAKo/F,SAAS7rF,UAAU/Q,OAAO6+F,GAC/BrhG,KAAK6+F,QAAQtrF,UAAUxS,IAAIsgG,GAC3BrhG,KAAKw/F,WAAWjsF,UAAUxS,IAAI,aAC9Bf,KAAKy/F,UAAUlsF,UAAUxS,IAAI,aAC7Bf,KAAKo/F,SAASnmF,cAAc1D,kBAAkBhC,UAAU1J,OAAO,cAAc,GAE7E,MAAMi0C,EAAyC,gBAC3C,EAAAzwB,kBAAqB7H,GAAA,iBAAuCs4B,IAC9Dt4B,GAAA,WAAiC,CAC/B2H,MAAO,KACLva,GAAO,EAEThR,KAAMk8C,IAIVsjD,EAAW,EAAE,EAGfphG,KAAK+pD,YAAYn1B,MAAMhnB,iBAAiB,QAAS0zF,GACjDA,KAEA,QAAiBthG,KAAK6+F,SAAU92F,IAC9B/H,KAAKo/F,SAAS7rF,UAAUxS,IAAIsgG,GAC5BrhG,KAAK6+F,QAAQtrF,UAAU/Q,OAAO6+F,GAC9BrhG,KAAKo/F,SAASnmF,cAAc1D,kBAAkBhC,UAAU1J,OAAO,cAAc,GAE7E2b,GAAA,eAAqC,iBAErC47E,EAAW,EAAE,IAGf,MAAMG,GAAuB,QAAW,SACxCvhG,KAAK0zB,aAAagP,OAAOtgB,OAAO1W,OAAO61F,GACvCA,EAAqB3zF,iBAAiB,SAAS,MAC7C,EAAA41C,GAAA,GAAkB,CAChBiX,mBAAoB,8BACpBnkD,OAAQ,CACNokD,QAAS,cACTyY,UAAU,KAEX7kE,MAAK,IACCtO,KAAKiH,SAASk6B,gBAAgBqgE,oBAAoBlzF,MAAK,KAC5DtO,KAAK0zB,aAAagP,OAAOjd,OAAO,KAElC,GAEN,EAsBF,MAAMg8E,GAAiB,IAAIhD,GAC3B,oBAAgCgD,GAChC,W,0FCzqBe,MAAMC,UAAyB,IAOrCrrE,KAAK3E,GAQV1xB,KAAKoL,UAAUmI,UAAUxS,IAAI,yBAC7Bf,KAAKwoD,SAAU,OAAa,CAACz0C,KAAM,eACnC/T,KAAK2S,QAAQjH,OAAO1L,KAAKwoD,SACzBxoD,KAAKm0B,WAAW/oB,UAAU5I,SAE1BxC,KAAKwoD,QAAQ56C,iBAAiB,SAAS,KACrC,MAAM66B,EAAUzoC,KAAK+oB,SAASsiB,cAAcvwB,KAAKk1C,GAAQA,EAAIv5B,aACvD8W,EAASvtC,KAAK+kF,QAAQt8C,GAEzBzoC,KAAK8kF,UACN9kF,KAAK4S,QACG26B,aAAkBloB,QAC1BrlB,KAAK2hG,gBAAgBp0D,QACFtpC,IAAXspC,GACRvtC,KAAK4S,O,IAKT5S,KAAK2hF,SAASjwD,EAAQ3iB,OACtB/O,KAAK4nC,SAAWlW,EAAQ9vB,KACxB5B,KAAK+kF,QAAUrzD,EAAQqzD,QACvB/kF,KAAK8kF,UAAYpzD,EAAQozD,UAEzB,MAAM8c,EAA8B,YAAlB5hG,KAAK4nC,SACvB5nC,KAAK+oB,SAAW,IAAI,IAAe,CACjCwgB,SAAUvpC,KAAK2S,QACf2hB,SAAUt0B,KAAK8kF,UAAY,KAAQjiF,IACjC7C,KAAKwoD,QAAQj1C,UAAU1J,OAAO,eAAgBhH,EAAO,EAEvD+kC,SAAU,CAACg6D,EAAY,UAAY,YACnCr+F,YAAamuB,EAAQnuB,YACrBukC,WAAY85D,EACZh5D,iBAAkBg5D,EAAY,CAAC,aAAc,eAAY39F,EACzDgD,SAAUjH,KAAKiH,SACfihC,OAAQ,WAGPxW,EAAQyzD,iBACTnlF,KAAK+oB,SAASuiB,WAAW5Z,EAAQyzD,iBAGnCnlF,KAAKwoD,QAAQj1C,UAAUxS,IAAI,oBAC3Bf,KAAKwoD,QAAQzlC,UAAY,GACzB/iB,KAAKwoD,QAAQrU,UAAW,EACxBn0C,KAAKwoD,QAAQj1C,UAAU1J,OAAO,aAAc7J,KAAK8kF,UACnD,CAEO6c,gBAAgBpzF,GACrB,MAAMszF,GAAe,OAAgB7hG,KAAKwoD,QAAS,cAEnDj6C,EAAQD,MAAK,KACXtO,KAAK4S,OAAO,IACX,KACDivF,GAAc,GAElB,E,6DC3EK,SAASC,EAAuBx+F,GACrC,MAAMkN,EAAUlN,EAAO8lB,WAAW,MAE5B24E,EAAQ,IAAI7oF,MAAM,GAAGwuC,KAAK,GAC1BpO,EAAS9oC,EAAQwxF,aAAa,EAAG,EAAG1+F,EAAO4jB,MAAO5jB,EAAOgkB,QAAQsrB,KACjEqvD,EAAe3oD,EAAOz2C,OAAS,EACrC,IAAI,IAAImlB,EAAI,EAAGA,EAAIsxB,EAAOz2C,OAAQmlB,GAAK,EAErC+5E,EAAM,IAAMzoD,EAAOtxB,GACnB+5E,EAAM,IAAMzoD,EAAOtxB,EAAI,GACvB+5E,EAAM,IAAMzoD,EAAOtxB,EAAI,GACvB+5E,EAAM,IAAMzoD,EAAOtxB,EAAI,GAGzB,MAAMk6E,EAAW,IAAIC,kBAAkB,GAMvC,OALAD,EAAS,GAAKH,EAAM,GAAKE,EACzBC,EAAS,GAAKH,EAAM,GAAKE,EACzBC,EAAS,GAAKH,EAAM,GAAKE,EACzBC,EAAS,GAAKH,EAAM,GAAKE,EAElBC,CACT,C,sDC1Be,SAASE,EAAmBC,GACzC,IAAI,EAACjzF,EAAC,EAAErF,EAAC,EAAEu4F,IAAK,QAAWD,EAAK,GAAIA,EAAK,GAAIA,EAAK,IAOlD,OANGt4F,EAAI,IACLA,EAAIvD,KAAKI,IAAI,IAAKmD,EAAI,EAAI,IAAO,IAAMA,KAEzCu4F,EAAI97F,KAAKC,IAAI,EAAO,IAAJ67F,GAEH,QAAQlzF,MAAMrF,OAAOu4F,SAEpC,C,yJCGe,MAAMC,EAyBnBxiG,cAhBQ,KAAAyiG,IAAM,EACN,KAAAC,WAAa,IACb,KAAAC,UAAY,GACZ,KAAA9nD,MAAQ,EACR,KAAA1xB,SAOJ,CAAC,EAoGG,KAAAy5E,YAAc,KACpBt3F,SAAS+0F,gBAAgB70F,MAAM2Y,OAASlkB,KAAKkpB,SAAS05E,WAAWr3F,MAAM2Y,OAAS,UAAU,EAGpF,KAAA2+E,UAAY,KAClBx3F,SAAS+0F,gBAAgB70F,MAAM2Y,OAASlkB,KAAKkpB,SAAS05E,WAAWr3F,MAAM2Y,OAAS,EAAE,EAnGlFlkB,KAAKoL,UAAYC,SAASC,cAAc,OACxCtL,KAAKoL,UAAUmI,UAAUxS,IAAIwhG,EAAYviD,YAEzC,MAAM5qC,EAAO,uBACGmtF,EAAYviD,WAAa,g+BAgBvBuiD,EAAYviD,WAAa,cAAcuiD,EAAYviD,WAAa,mKAIlEuiD,EAAYviD,WAAa,qCACvBuiD,EAAYviD,WAAa,6tBAavBuiD,EAAYviD,WAAa,cAAcuiD,EAAYviD,WAAa,mLAOpFhgD,KAAKoL,UAAU2X,UAAY3N,EAE3BpV,KAAKkpB,SAASw5B,IAAM1iD,KAAKoL,UAAUmK,kBACnCvV,KAAKkpB,SAAS05E,WAAa5iG,KAAKkpB,SAASw5B,IAAIp4B,iBAC7CtqB,KAAKkpB,SAASu5E,WAAaziG,KAAKkpB,SAASw5B,IAAIntC,kBAAkBA,kBAE/DvV,KAAKkpB,SAAS45E,QAAU9iG,KAAKkpB,SAASw5B,IAAIy0B,mBAE1Cn3E,KAAKkpB,SAASs5E,IAAMxiG,KAAKkpB,SAAS45E,QAAQvtF,kBAC1CvV,KAAKkpB,SAAS65E,WAAa/iG,KAAKkpB,SAASs5E,IAAIl4E,iBAE7CtqB,KAAKgjG,cAAgB,IAAI,KAAW,CAACxzF,WAAW,EAAMy7B,MAAO,yBAC7DjrC,KAAKijG,cAAgB,IAAI,KAAW,CAACzzF,WAAW,EAAMy7B,MAAO,yBAE7D,MAAMi4D,EAAS73F,SAASC,cAAc,OACtC43F,EAAO7nF,UAAYknF,EAAYviD,WAAa,UAC5CkjD,EAAOx3F,OAAO1L,KAAKgjG,cAAc53F,UAAWpL,KAAKijG,cAAc73F,WAC/DpL,KAAKoL,UAAUM,OAAOw3F,GAEtBljG,KAAKgjG,cAAcpuE,MAAMhnB,iBAAiB,SAAS,KACjD,IAAIlB,EAAQ1M,KAAKgjG,cAAct2F,MAAM2d,QAAQ,KAAM,IAAIyF,MAAM,EAAG,GAEhE,MAAMvqB,EAAQmH,EAAMnH,MAAM,iBACpB49F,EAAQ59F,GAASA,EAAM,GAAG1C,SAAW6J,EAAM7J,QAAU,CAAa,GAAGkS,SAASrI,EAAM7J,QAC1F7C,KAAKgjG,cAAchhC,SAASmhC,EAAQ,aAAqB,YAEzDz2F,EAAQ,IAAMA,EACd1M,KAAKgjG,cAAcvgD,iBAAiB/1C,GAEjCy2F,GACDnjG,KAAKojG,SAAS12F,GAAO,GAAO,E,IAKhC,MAAM22F,EAAY,wHAClBrjG,KAAKijG,cAAcruE,MAAMhnB,iBAAiB,SAAS,KACjD,MAAMrI,EAAQvF,KAAKijG,cAAcv2F,MAAMnH,MAAM89F,GAC7CrjG,KAAKijG,cAAcjhC,SAASz8D,EAAQ,aAAqB,YAEtDA,GACDvF,KAAKojG,UAAS,SAAY79F,EAAM,IAAKA,EAAM,IAAKA,EAAM,KAAK,GAAM,E,IAIrEvF,KAAKsjG,qBACLtjG,KAAKujG,oBACP,CAUQD,sBACN,EAAAE,EAAA,GAAoBxjG,KAAKkpB,SAASw5B,KAAY,KAC5C1iD,KAAK2iG,cACL3iG,KAAKyjG,QAAUzjG,KAAKkpB,SAASw5B,IAAIhlC,uBAAuB,IAEtD86B,IACFx4C,KAAK0jG,kBAAkBlrD,EAAI97B,EAAG87B,EAAI77B,EAAE,IACnC,KACD3c,KAAK6iG,WAAW,GAEpB,CAEQU,sBACN,EAAAC,EAAA,GAAoBxjG,KAAKkpB,SAASs5E,KAAY,KAC5CxiG,KAAK2iG,cACL3iG,KAAK2jG,QAAU3jG,KAAKkpB,SAASs5E,IAAI9kF,uBAAuB,IAEtD86B,IACFx4C,KAAK4jG,WAAWprD,EAAI97B,EAAE,IACrB,KACD1c,KAAK6iG,WAAW,GAEpB,CAEOO,SAASruD,EAA2B8uD,GAAiB,EAAMC,GAAiB,GACjF,QAAa7/F,IAAV8wC,EACDA,EAAQ,CACN3lC,EAAG,EACHrF,EAAG,IACHu4F,EAAG,GACH7tF,EAAG,QAEA,GAAqB,iBAAZ,EACd,GAAgB,MAAbsgC,EAAM,GACPA,GAAQ,QAAWA,OACd,CACL,MAAMgvD,EAAMhvD,EAAMxvC,MAAM,YACxBwvC,GAAQ,SAAYgvD,EAAI,IAAKA,EAAI,IAAKA,EAAI,QAAe9/F,IAAX8/F,EAAI,GAAmB,GAAKA,EAAI,G,CAKlF/jG,KAAKyjG,QAAUzjG,KAAKkpB,SAASw5B,IAAIhlC,wBAEjC,MAAMsmF,EAAOhkG,KAAKyjG,QAAQv8E,MAAQ,IAAM6tB,EAAMhrC,EACxCk6F,EAAW,IAAOlvD,EAAMutD,GAAK,IAAMvtD,EAAMhrC,EAAI,GAAM,IACnDm6F,EAAOlkG,KAAKyjG,QAAQn8E,OAAS,IAAM28E,EAEzCjkG,KAAK0jG,kBAAkB1jG,KAAKyjG,QAAQ3+E,KAAOk/E,EAAMhkG,KAAKyjG,QAAQz+E,IAAMk/E,GAAM,GAG1ElkG,KAAK2jG,QAAU3jG,KAAKkpB,SAASs5E,IAAI9kF,wBAEjC,MAAMymF,EAAapvD,EAAM3lC,EAAI,IACvBg1F,EAAOpkG,KAAK2jG,QAAQ7+E,KAAO9kB,KAAK2jG,QAAQz8E,MAAQi9E,EAEtDnkG,KAAK4jG,WAAWQ,GAAM,GAGtBpkG,KAAKwiG,IAAMztD,EAAM3lC,EACjBpP,KAAKyiG,WAAa1tD,EAAMhrC,EACxB/J,KAAK0iG,UAAY3tD,EAAMutD,EACvBtiG,KAAK46C,MAAQ7F,EAAMtgC,EAEnBzU,KAAKqkG,aAAaR,EAAgBC,EACpC,CAEOQ,kBACL,MAAMC,GAAY,QAAWvkG,KAAKwiG,IAAKxiG,KAAKyiG,WAAYziG,KAAK0iG,UAAW1iG,KAAK46C,OACvE4pD,GAAO,QAAWD,GAClBvsD,EAAMwsD,EAAK10E,MAAM,GAAI,GAE3B,MAAO,CACL20E,IAAK,OAAOzkG,KAAKwiG,QAAQxiG,KAAKyiG,gBAAgBziG,KAAK0iG,cACnDqB,IAAK,OAAOQ,EAAU,OAAOA,EAAU,OAAOA,EAAU,MACxDvsD,IAAKA,EACL0sD,KAAM,QAAQ1kG,KAAKwiG,QAAQxiG,KAAKyiG,gBAAgBziG,KAAK0iG,eAAe1iG,KAAK46C,SACzEynD,KAAM,QAAQkC,EAAU,OAAOA,EAAU,OAAOA,EAAU,OAAOA,EAAU,MAC3EC,KAAMA,EACND,UAAWA,EAEf,CAEOF,aAAaR,GAAiB,EAAMC,GAAiB,GAC1D,MAAM/uD,EAAQ/0C,KAAKskG,kBACnBtkG,KAAKkpB,SAAS05E,WAAWz4E,eAAe,KAAM,OAAQ4qB,EAAMiD,KAEzD6rD,IACD7jG,KAAKgjG,cAAcvgD,iBAAiB1N,EAAMiD,KAC1Ch4C,KAAKgjG,cAAchhC,SAAS,eAG3B8hC,IACD9jG,KAAKijG,cAAcxgD,iBAAiB1N,EAAMwvD,UAAUz0E,MAAM,GAAI,GAAG1H,KAAK,OACtEpoB,KAAKijG,cAAcjhC,SAAS,eAG3BhiE,KAAKs0B,UACNt0B,KAAKs0B,SAASygB,EAElB,CAEQ6uD,WAAWn0D,EAAevN,GAAS,GACzC,MAEM8hC,GAFS,EAAA1kD,EAAA,GAAMmwB,EAAQzvC,KAAK2jG,QAAQ7+E,KAAM,EAAG9kB,KAAK2jG,QAAQz8E,OAEtClnB,KAAK2jG,QAAQz8E,MACvClnB,KAAKwiG,IAAMh8F,KAAKmD,MAAM,IAAMq6D,GAE5B,MAAM0gC,EAAO,QAAQ1kG,KAAKwiG,mBAAmBxiG,KAAK46C,SAElD56C,KAAKkpB,SAAS65E,WAAW54E,eAAe,KAAM,IAAiB,IAAX65C,EAAkB,KACtEhkE,KAAKkpB,SAAS65E,WAAW54E,eAAe,KAAM,OAAQu6E,GAEtD1kG,KAAKkpB,SAASu5E,WAAWn4E,iBAAiBH,eAAe,KAAM,aAAcu6E,GAE1ExiE,GACDliC,KAAKqkG,cAET,CAEQX,kBAAkBj0D,EAAeiiC,EAAexvC,GAAS,GAC/D,MAAM/hB,EAAOngB,KAAKyjG,QAAQv8E,MACpB7G,EAAOrgB,KAAKyjG,QAAQn8E,OAKpBq9E,GAHS,EAAArlF,EAAA,GAAMmwB,EAAQzvC,KAAKyjG,QAAQ3+E,KAAM,EAAG3E,GAG7BA,EAAO,IACvBykF,GAHS,EAAAtlF,EAAA,GAAMoyD,EAAQ1xE,KAAKyjG,QAAQz+E,IAAK,EAAG3E,GAG5BA,EAAO,IAEvBuiF,EAAa5iG,KAAKkpB,SAAS05E,WACjCA,EAAWz4E,eAAe,KAAM,IAAKw6E,EAAO,KAC5C/B,EAAWz4E,eAAe,KAAM,IAAKy6E,EAAO,KAE5C,MAAMnC,GAAa,EAAAnjF,EAAA,GAAMqlF,EAAM,EAAG,KAE5BE,EAAa,IAAMpC,EAAa,EAChCqC,EAAa,KAAM,EAAAxlF,EAAA,GAAMslF,EAAM,EAAG,KAElClC,GAAY,EAAApjF,EAAA,GAAMwlF,EAAa,IAAMD,EAAY,EAAG,KAE1D7kG,KAAKyiG,WAAaA,EAClBziG,KAAK0iG,UAAYA,EAEdxgE,GACDliC,KAAKqkG,cAET,EAlRe,EAAArkD,WAAa,e,cCIf,MAAM+kD,UAA8B,IAAnD,c,oBA4FU,KAAAC,YAAc,CAAChtD,EAAaitD,GAAoB,KACtD,GAAGA,EACDjlG,KAAKklG,YAAY9B,SAASprD,OACrB,CACL,MAAMqqD,GAAO,QAAWrqD,GAClBs2C,EAAWtuF,KAAKkxF,MAAM5C,SACtBoW,EAAOtC,EAAmBC,GAE1BrQ,EAAuC,CAC3CpiF,EAAG,kBACHhI,GAAI,EACJ6F,OAAQ,CAAC,EACT6gF,SAAU,CACR1+E,EAAG,oBACHu1F,iBAAkBh9E,SAAS6vB,EAAIloB,MAAM,GAAI,IACzCriB,OAAQ,CAAC,IAIb6gF,EAAS2D,UAAYD,EACrB1D,EAAS8T,mBAAqBsC,EAE9B1kG,KAAKiH,SAASkyF,gBAAgBiM,YAAY,WAAY5jF,EAAA,YAEtDkU,EAAA,0BAA+BzxB,OAAWA,GAAW,GACrDjE,KAAKszB,W,GAID,KAAA+xE,cAAiBtwD,IACvB/0C,KAAKslG,WAAWvwD,EAAMiD,KAAK,EAAM,CA6BrC,CAjJE3hB,OACEr2B,KAAKoL,UAAUmI,UAAUxS,IAAI,uBAAwB,8BACrDf,KAAK2hF,SAAS,YAEd3hF,KAAKkxF,MAAQH,EAAA,aAEb,MAAMloD,EAAU,IAAI,IAAe,CAAC,GACpC7oC,KAAKklG,YAAc,IAAI3C,EAEvB15D,EAAQl2B,QAAQjH,OAAO1L,KAAKklG,YAAY95F,WAExCpL,KAAKm0B,WAAWzoB,OAAOm9B,EAAQz9B,WAE/B,MAAMm6F,EAAc,IAAI,IAAe,CAAC,GAElCC,EAAOxlG,KAAKwlG,KAAOn6F,SAASC,cAAc,OAChDk6F,EAAKjyF,UAAUxS,IAAI,QAEJ,CACb,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAGKgE,SAASgwC,IACd,MAAM/xC,EAAOqI,SAASC,cAAc,OACpCtI,EAAKuQ,UAAUxS,IAAI,aACnBiC,EAAK+mB,QAAQgrB,MAAQA,EAAM/oB,cAG3B,MAAMtmB,EAAQ2F,SAASC,cAAc,OACrC5F,EAAM6N,UAAUxS,IAAI,mBACpB2E,EAAM6F,MAAMk6F,gBAAkB1wD,EAE9B/xC,EAAK0I,OAAOhG,GACZ8/F,EAAK95F,OAAO1I,EAAK,KAGnB,QAAiBwiG,GAAOz9F,IACtB,MAAM1H,GAAS,EAAA4gB,EAAA,GAAgBlZ,EAAE1H,OAAQ,aACzC,IAAIA,GAAUA,EAAOkT,UAAUqB,SAAS,UACtC,OAGF,MAAMmgC,EAAQ10C,EAAO0pB,QAAQgrB,MACzBA,GAIJ/0C,KAAKslG,WAAWvwD,EAAM,GACrB,CAACljC,eAAgB7R,KAAK6R,iBAEzB0zF,EAAY5yF,QAAQjH,OAAO85F,GAC3BxlG,KAAKm0B,WAAWzoB,OAAO65F,EAAYn6F,WAEnCpL,KAAKslG,YAAa,EAAAI,EAAA,GAAS1lG,KAAKglG,YAAa,IAAI,EACnD,CAEQ1xE,YACN,MAAMvN,EAAS/lB,KAAKwlG,KAAK5tF,cAAc,WAGjCm9B,EAFa/0C,KAAKkxF,MAAM5C,SACD2D,UACL3D,SAAS6W,iBAC3B9kG,EAAS00C,EAAQ/0C,KAAKwlG,KAAK5tF,cAAc,0BAA0Bm9B,OAAa,KACnFhvB,IAAW1lB,IAIX0lB,GACDA,EAAOxS,UAAU/Q,OAAO,UAGvBnC,GACDA,EAAOkT,UAAUxS,IAAI,UAEzB,CAmCAma,SACExY,YAAW,K,QACT,MAAM4rF,EAAWtuF,KAAKkxF,MAAM5C,SACtBv5C,EAAqC,QAA7B,EAAmB,QAAnB,EAAAu5C,aAAQ,EAARA,EAAU2D,iBAAS,eAAE3D,gBAAQ,eAAE6W,iBAEvCQ,IAAc5wD,GAAkC,oBAAzBu5C,EAAS2D,UAAUriF,EAG7C+1F,IACD3lG,KAAKklG,YAAY5wE,SAAWt0B,KAAKqlG,eAGnCrlG,KAAKklG,YAAY9B,SAAUruD,GAAS,IAAMA,EAAMoJ,SAAS,KAAQ,WAE7DwnD,IACF3lG,KAAKklG,YAAY5wE,SAAWt0B,KAAKqlG,c,GAElC,EACL,CAEAp7C,sBAIE,OAHAjqD,KAAKklG,YAAY5wE,cAAWrwB,EAC5BjE,KAAKklG,iBAAcjhG,EAEZiO,MAAM+3C,qBACf,E,uWCrIa,MAAM27C,UAAyB,IAA9C,c,oBAGU,KAAAC,QAAsB,IAAIzkG,IAG1B,KAAA0kG,oBAAmD,IAAIvkG,IACvD,KAAAwkG,cAA0C,IAAIxkG,IAmF9C,KAAAykG,cAAgB,MC/HX,SAAqBC,GAClC,MAAMrxE,EAAQvpB,SAASC,cAAc,SACrCspB,EAAMhzB,KAAO,OACbgzB,EAAMrpB,MAAM4f,QAAU,OAEnB86E,IACDrxE,EAAMqxE,OAASA,GAGjB56F,SAASI,KAAKC,OAAOkpB,GAErB,MAAMrmB,EAAU,IAAI8W,SAAc,CAAClX,EAASmX,KAC1CsP,EAAMhnB,iBAAiB,UAAW7F,IAChC,MAAMonE,EAAapnE,EAAE1H,OAAO+uE,MAAM,GAC9BD,EAKJhhE,EAAQghE,GAJN7pD,EAAO,mBAII,GACZ,CAACrX,MAAM,GAAM,IACfkK,SAAQ,KACTyc,EAAMpyB,QAAQ,IAKhB,OAFAoyB,EAAM3f,QAEC1G,CACT,EDoGI23F,CAAY,oCAAoC53F,MAAW6gE,GAAS,EAAD,gCACjE,GAAGA,EAAKj3D,KAAKiuF,SAAS,QAAS,CAC7B,MAAMr4E,EAAMziB,SAASC,cAAc,OAC7B5D,EAAMo2B,IAAIsoE,gBAAgBj3B,SAC1B,EAAAjkD,EAAA,IAA0B4C,EAAKpmB,GAAK,GAC1C,MAAM2+F,EAAW,cACX,KAACl0B,SAAc,EAAAm0B,EAAA,GAAkB,CAAC5gG,MAAOooB,EAAKjmB,KAAM,IAAI,IAAUimB,EAAIzE,aAAcyE,EAAIxE,eAAgB+8E,aAC9Gl3B,EAAO,IAAIo3B,KAAK,CAACp0B,GAAOhD,EAAKj3D,KAAKmS,QAAQ,SAAU,QAAS,CAACzoB,KAAMykG,G,CAGtE,MAAMrU,QAAkBhyF,KAAKiH,SAASC,eAAes/F,uBAAuBr3B,GACtEs3B,EAAgBzmG,KAAKiH,SAASC,eAAew/F,gBAAgB1U,EAAUpqF,IACvE++F,EAA0Cn3E,EAAA,0BAA2C2/C,EAAKj3D,KAAMuuF,GAEhGv4F,GAAW,SACjBA,EAASgsE,kBAAoBysB,EAAezsB,kBAC5ChsE,EAASojC,OAASq1D,EAAer1D,OAEjCq1D,EAAer4F,MAAM0jF,IACnBhyF,KAAK6lG,QAAQ5kG,OAAOuL,GACpBxM,KAAK+lG,cAAc9kG,OAAOuL,GAC1BxM,KAAK8lG,oBAAoBliG,IAAIwH,EAAW4mF,GACxC,MAAM4U,EAAS5mG,KAAK6mG,gBAAgB7U,GACpChyF,KAAK+lG,cAAcniG,IAAIgjG,EAAQx7F,GAE/Bw6F,EAAiBkB,sBAAsB9U,GAAW1jF,KAAKJ,EAASC,QAASD,EAASoX,OAAO,GACxFpX,EAASoX,QAEZ,MAAM9Y,EAAMxM,KAAK6mG,gBAAgB7U,GACjC9jF,EAAS+J,OAAM,KACb7M,EAAU5I,QAAQ,IAGpB,MAAM2Z,EAAY,IAAI,IAAqB,CACzCi9D,UAAU,EACVz3D,YAAY,EACZgqB,gBAAgB,KAGZ,UAACvgC,SAAmBpL,KAAK+mG,aAAa/U,GAAW,GACvDhyF,KAAK6lG,QAAQ9kG,IAAIyL,GAEjB2P,EAAU6S,OAAO5jB,GAAW,EAAO8C,EACrC,KAAE,EAGI,KAAA84F,aAAe,K,YACrB,MAAMC,EAAe,0BAAiCrhE,GAAMA,EAAE1tB,OAASlY,KAAKkxF,MAAMh5E,OAC/E+uF,MACCrB,EAAiB1pF,OACnBlc,KAAKkxF,MAAM5C,UAAW,EAAAlnD,EAAA,GAAK6/D,EAAa3Y,UACxCtuF,KAAKiH,SAASkyF,gBAAgBiM,YAAY,WAAY5jF,EAAA,YACtDkU,EAAA,0BAA+BzxB,OAAWA,GAAW,GACrDjE,KAAKknG,kBAAkBzkD,iBAAiE,QAAhD,EAAwC,QAAxC,EAA8B,QAA9B,EAAmB,QAAnB,EAAAziD,KAAKkxF,MAAM5C,gBAAQ,eAAE2D,iBAAS,eAAE3D,gBAAQ,eAAE7gF,cAAM,eAAE64C,M,EAsItF,KAAA6gD,YAAep/F,IACrB,MAAM1H,GAAS,EAAA4gB,EAAA,GAAgBlZ,EAAE1H,OAAQ,aACzC,IAAIA,EAAQ,OAEZ,MAAM4xF,EAAYjyF,KAAK8lG,oBAAoB7iG,IAAI5C,GAC/C,GAAmB,oBAAhB4xF,EAAUriF,EAEX,YADAg2F,EAAiBkB,sBAAsB7U,GAIzC,MAAMzlF,EAAMxM,KAAK6mG,gBAAgB5U,GACjC,GAAGjyF,KAAK6lG,QAAQxiG,IAAImJ,GAAM,OAC1BxM,KAAK6lG,QAAQ9kG,IAAIyL,GAEjB,MAAM7K,EAAMswF,EAAU5mF,SAChB8Q,EAAY,IAAI,IAAqB,CACzCwF,YAAY,EACZgqB,gBAAgB,IAGZ/oC,EAAO,IAAW,EAAD,gC,YACrB,MAAM2L,EAAUq3F,EAAiBkB,sBAAsB7U,UAC5BjyF,KAAKiH,SAASO,cAAcC,gBAAgB9F,IACtD+F,OAAuD,QAAhD,EAAwC,QAAxC,EAA8B,QAA9B,EAAmB,QAAnB,EAAA1H,KAAKkxF,MAAM5C,gBAAQ,eAAE2D,iBAAS,eAAE3D,gBAAQ,eAAE7gF,cAAM,eAAE64C,OACxEnqC,EAAU6S,OAAO3uB,GAAQ,EAAMkO,EAEnC,IAEA4N,EAAUhR,aAEV,QAAiB9K,GAAS0H,IACrBoU,EAAUA,UAAUlD,eACrBkD,EAAUlI,QAAQlM,GAClBoU,EAAU+S,UAEVtsB,G,GAED,CAACiP,eAAgB7R,KAAK6R,iBAEzBjP,GAAM,EAgGA,KAAA0wB,UAAY,KAClB,MAAMvN,EAAS/lB,KAAKwlG,KAAK5tF,cAAc,WACjCvX,EAASL,KAAK+lG,cAAc9iG,IAAIjD,KAAKonG,yBAAyBpnG,KAAKkxF,QACtEnrE,IAAW1lB,IAIX0lB,GACDA,EAAOxS,UAAU/Q,OAAO,UAGvBnC,GACDA,EAAOkT,UAAUxS,IAAI,U,CAG3B,CAnaS0V,qBACL,MAAO,CACL4wF,YAAa7lF,EAAA,4CAEjB,CAEY0vE,YACV,OAAOH,EAAA,YACT,CAEO16D,KAAK11B,EAAwDilG,EAAiBxQ,e,UACnFp1F,KAAKoL,UAAUmI,UAAUxS,IAAI,uBAAwB,8BACrDf,KAAK2hF,SAAS,kBAEd,CACE,MAAMv2E,GAAY,OAAgBpL,KAAKm0B,YAEjCmzE,GAAe,OAAO,8BAA+B,CAACvzF,KAAM,YAAaC,KAAM,mCAC/EuzF,GAAc,OAAO,8BAA+B,CAACxzF,KAAM,WAAYC,KAAM,aAC7EkmF,GAAc,OAAO,8BAA+B,CAACnmF,KAAM,aAAcC,KAAM,sBAErF,QAAiBszF,EAActnG,KAAKgmG,cAAe,CAACn0F,eAAgB7R,KAAK6R,kBAEzE,QAAiB01F,GAAa,KAC5BvnG,KAAK4kF,OAAOC,UAAUkgB,GAAuBr2E,MAAM,GAClD,CAAC7c,eAAgB7R,KAAK6R,kBAEzB,QAAiBqoF,EAAal6F,KAAKgnG,aAAc,CAACn1F,eAAgB7R,KAAK6R,iBAEvE,MAAMmgF,EAA+B,QAAnB,EAAAhyF,KAAKkxF,MAAM5C,gBAAQ,eAAE2D,UACjCiV,EAAoBlnG,KAAKknG,kBAAoB,IAAI,IAAc,CACnElzF,KAAM,sBACNkE,KAAM,OACNmxB,QAA6D,QAAnD,EAA2C,QAA5C,EAAC2oD,aAAS,EAATA,EAAmC1D,gBAAQ,eAAE7gF,cAAM,eAAE64C,OAGjEtmD,KAAK6R,eAAe9Q,IAAImmG,EAAkBtyE,MAA1C50B,CAAiD,UAAU,IAAW,EAAD,gCACnEA,KAAKkxF,MAAM5C,SAAS2D,UAAU3D,SAAS7gF,OAAO64C,KAAO4gD,EAAkBtyE,MAAMyU,cAAWplC,QAClFjE,KAAKiH,SAASkyF,gBAAgBiM,YAAY,WAAY5jF,EAAA,YAG5D9e,YAAW,KACT,MAAMqjB,EAASy/E,EAAK5tF,cAAc,WAClC,IAAImO,EAAQ,OAEZ,MAAMksE,EAAYjyF,KAAK8lG,oBAAoB7iG,IAAI8iB,GAC3CksE,EAAkCxkF,OAAO+5F,SAA2B,oBAAhBvV,EAAUriF,GAIlEg2F,EAAiBkB,sBAAsB7U,EAAU,GAChD,IACL,MAEA7mF,EAAUM,OACR47F,EACAC,EACArN,GACA,QAA2BgN,GAAmB97F,U,CAIlDoW,EAAA,mBAA2B,oBAAqBxhB,KAAKszB,WAErD,MAAM/kB,EAAU5N,EAAE0mG,YAAY/4F,MAAMm5F,IAClC,MAAM1rE,EAAW0rE,EAAW3sF,KAAKk3E,GACxBhyF,KAAK+mG,aAAa/U,KAG3B,OAAO3sE,QAAQqH,IAAIqP,EAAS,IAGxB2rE,GAAgB,OAAgB1nG,KAAKm0B,YACrCqxE,EAAOxlG,KAAKwlG,KAAOn6F,SAASC,cAAc,OAKhD,OAJAk6F,EAAKjyF,UAAUxS,IAAI,SACnB,QAAiBykG,EAAMxlG,KAAKmnG,YAAa,CAACt1F,eAAgB7R,KAAK6R,iBAC/D61F,EAAch8F,OAAO85F,GAEdj3F,CACT,CA4DQs4F,gBAAgB7U,GACtB,MAAO,GAAKA,EAAUpqF,EACxB,CAEQw/F,yBAAyBlW,G,MAC/B,MAAO,IAAMlxF,KAAK6mG,gBAA8B,QAAd,EAAA3V,EAAM5C,gBAAQ,eAAE2D,YAAc,GAClE,CAEOx7E,oBACLu7E,EACA5mF,EAAYC,SAASC,cAAc,Q,MAEnC,MAAMqvC,GAAS,QAAuBq3C,GAChC2V,EAA0B,cAAhB3V,EAAUpiF,EAC1B,GAAI+3F,GAAW3V,EAAUvkF,OAAO+5F,UAAY7sD,EAE1C,OAGF,MAAMitD,IAAW5V,EAAUvkF,OAAOo6F,KAElC,IAAIlmG,EAA0DgmG,EAAU3V,EAAU3mF,cAAgCpH,EAC/G0jG,IAAYhmG,IACbA,EAAM,CACJiO,EAAG,qBACHD,WAAY,GACZ9H,KAAM,IACNH,IAAK,yBACL0G,EAAG,KACHgB,EAAG,KACHsH,UAAW,kBAIftL,EAAUmI,UAAUxS,IAAI,mBACxBqK,EAAU2e,QAAQniB,GAAK,GAAKoqF,EAAUpqF,GAEtC,MAAMlC,EAAQ2F,SAASC,cAAc,OACrC5F,EAAM6N,UAAUxS,IAAI,yBAEpB,MAAMw2B,EAA+B,GACrC,IAAI0E,EAAuCp0B,EAC3C,GAAG8/F,EAAS,CACV9/F,GAAO,EAAAq0B,EAAA,GAAgBv6B,EAAK,IAAK,KACjCs6B,GAAU,OAAU,CAClBO,MAAO76B,EACPwG,QAAS,KACTiD,UAAW1F,EACX42B,kBAAkB,EAClBz0B,OACA8sC,SAAUq9C,EAAUvkF,OAAO+5F,UAG1BxV,EAAUvkF,OAAO+5F,SAClB9hG,EAAM6N,UAAUxS,IAAI,cAGtB,MAAMwN,EAAU0tB,EAAQ3tB,MAAK,EAAOipB,eAAcqF,YAAY,EAAD,gCAE3D,aADMrF,EAAaloB,QAASkoB,EAAasF,KAClCD,CACT,MAAGtuB,MAAMsuB,I,MAYP,OAXGo1D,EAAUvkF,OAAO+5F,UACfI,GACDhrE,EAAOC,KAAKtxB,MAAM4f,QAAU,OACzByR,EAAOvtB,QACRutB,EAAOvtB,MAAM9D,MAAM4f,QAAU,UAEL,QAAlB,EAAA6mE,EAAU1D,gBAAQ,eAAEwZ,aAC5BlrE,EAAOC,KAAKtxB,MAAM+c,QAAU,GAAK9hB,KAAK8X,IAAI0zE,EAAU1D,SAASwZ,WAAa,MAIvEjtB,EAAA,UAAqB,KAC1BzvE,EAAUM,OAAOhG,EAAM,GACvB,IAGJ6xB,EAAal1B,KAAKkM,E,MAElBnD,EAAUM,OAAOhG,GAGnB,GAAqB,QAAlB,EAAAssF,EAAU1D,gBAAQ,eAAE6W,iBAAkB,CACvC,MAAM,OAAC7hG,GAAU,WAAsCq3C,GAGvD,GAFAr3C,EAAOiQ,UAAUxS,IAAI,4BAElB6mG,GAAUD,EAAS,CACpB,MAAMp5F,EAAU0tB,EAAQ3tB,MAAK,EAAEipB,kBACtBA,EAAasF,KAAKvuB,MAAK,IAAW,EAAD,gCACtC,MAAM/G,QAAqBia,EAAA,yCAAiD7f,EAAKkG,EAAKjG,MACtF0B,EAAOiI,MAAMw8F,gBAAkB,OAAOxgG,EAAaG,OACnDpE,EAAOiI,MAAM+c,QAAU,IAAM0pE,EAAUvkF,OAAOo6F,KAAO,IAAM7V,EAAU1D,SAASwZ,UAAY9V,EAAU1D,SAASwZ,WAAa,IAC1HpiG,EAAMgG,OAAOpI,EACf,QAGFi0B,EAAal1B,KAAKkM,E,MAElB7I,EAAMgG,OAAOpI,E,CAIjB,MAAO,CACL8H,YACA1F,QACAwoB,YAAa7I,QAAQqH,IAAI6K,GAE7B,CAEQwvE,aAAa/U,EAAsBtmF,GAAS,GAClD,MAAM6hC,EAASq4D,EAAiBmB,aAAa/U,GAC7C,GAAGzkD,EAAQ,CACT,MAAM,UAACniC,EAAS,MAAE1F,GAAS6nC,EAC3BniC,EAAUmI,UAAUxS,IAAI,aACxB2E,EAAM6N,UAAUxS,IAAI,mBAEpB,MAAMyL,EAAMxM,KAAK6mG,gBAAgB7U,GACjChyF,KAAK8lG,oBAAoBliG,IAAIwH,EAAW4mF,GACxChyF,KAAK+lG,cAAcniG,IAAI4I,EAAKpB,GAEzBpL,KAAKonG,yBAAyBpnG,KAAKkxF,SAAW1kF,GAC/CpB,EAAUmI,UAAUxS,IAAI,UAG1Bf,KAAKwlG,KAAK95F,EAAS,SAAW,WAAWN,E,CAG3C,OAAOmiC,GAAUA,EAAOrf,YAAY5f,MAAK,IAAMi/B,GACjD,E,IAnRc,EAAArxB,OAAS,EAiUT,EAAA4qF,sBAAwB,CAAC9U,EAAsBF,KAC3D,MAAMkW,IAAY,EAAK9rF,OACjBgb,EAAa,IAAM8wE,IAAY,EAAK9rF,OAEpCva,EAAOqwF,EAAkC3mF,SACzC6C,GAAW,SACjB,IAAIiI,EACDxU,GACDwU,EAAWqZ,EAAA,mBAAoC,CAC7C9pB,MAAO/D,EACP0R,QAASqiB,EAAA,gBAA4BA,EAAA,sCAAkD,IAEzFxnB,EAASgsE,kBAAoB/jE,EAAS+jE,kBACtChsE,EAASojC,OAASn7B,EAASm7B,QAE3Bn7B,EAAWkP,QAAQlX,UAGrB,MAAM85F,EAAc,CAACC,EAAcxgG,KACjCmtC,MAAMntC,GAAK4G,MAAMwmC,IACfpf,EAAA,qBAA+B,eAAiBwyE,EAAMpzD,EAAS,GAC/D,EAmEJ,OAhEA3+B,EAAS7H,MAAK,IAAW,OAAD,6B,UACtB,IAAI4oB,IAEF,YADAhpB,EAASC,UAIX,MAAMg6F,IAAgBrW,EACtBA,UAAAA,EAAkBf,EAAA,aAA2BzC,UAC7C,MAAM8Z,EAAW1gG,I,MACf,IAAI2gG,EACJ,MAAM5C,GAAkB,QAAuBzT,GAC/C,GAAGtqF,IAAQ+9F,EACT4C,EJzVH,SAAsBC,GAC3B,MAAMx6E,EAAMziB,SAASC,cAAc,OACnC,OAAO,EAAA4f,EAAA,IAA0B4C,EAAKw6E,GAAU,GAAOh6F,MAAK,IArBvD,SAAqCi6F,EAAgCrhF,EAAeI,GACzF,MAAMhkB,EAAS+H,SAASC,cAAc,UAChCk9F,EAAQthF,EAAQI,EActB,OAZa,IAAVkhF,GACDllG,EAAO4jB,MAFU,GAGjB5jB,EAAOgkB,OAAShkB,EAAO4jB,MAAQshF,GACvBA,EAAQ,GAChBllG,EAAOgkB,OALU,GAMjBhkB,EAAO4jB,MAAQ5jB,EAAOgkB,OAASkhF,GAE/BllG,EAAO4jB,MAAQ5jB,EAAOgkB,OARL,GAWHhkB,EAAO8lB,WAAW,MAC1BM,UAAU6+E,EAAa,EAAG,EAAGrhF,EAAOI,EAAQ,EAAG,EAAGhkB,EAAO4jB,MAAO5jB,EAAOgkB,QACxEw6E,EAAuBx+F,EAChC,CAKWmlG,CAA4B36E,EAAKA,EAAIzE,aAAcyE,EAAIxE,gBAElE,CIoV4Bo/E,CAAahhG,OAC1B,CACL,MAAM,OAACpE,GAAU,WAAsCmiG,GACvD4C,EAAkBhjF,QAAQlX,QAAQ2zF,EAAuBx+F,G,CAG3D,MAAM4kG,EAA8C,QAAtC,EAAAlW,EAAkCkW,YAAI,QAAI,GACxD7iF,QAAQqH,IAAI,CACV27E,EACAH,GAAQD,EAAYC,EAAMxgG,KACzB4G,MAAK,EAAEyzF,MACR,IAAI7qE,IAEF,YADAhpB,EAASC,UAIX,MAAMu2F,EAAOtC,EAAmBlpF,MAAMC,KAAK4oF,IAE3CjQ,EAAcG,UAAYD,EAC1BF,EAAcsQ,mBAAqBsC,EAE/ByD,GACF3mF,EAAA,uCAA+C,WAAYA,EAAA,YAG7DkU,EAAA,qBAA+BwyE,EAAMxgG,GAAK,GAAM4G,KAAKJ,EAASC,QAAQ,GACtE,EAGJ,IAAIxM,EAEF,YADAymG,IAIF,MAAM7gG,QAAqBia,EAAA,yCAAiD7f,IAChC,QAAzC,EAAiC,QAAjC,EAAuB,QAAvB,EAAAmwF,EAAcG,iBAAS,eAAE3D,gBAAQ,eAAE7gF,cAAM,eAAE64C,MAC5C5jD,YAAW,KACT,MAAM,OAACY,EAAM,QAAEiL,IAAW,OAAKhH,EAAaG,IAAK,GAAI,GACrD6G,EAAQD,MAAK,KACP4oB,IAKJkxE,EAAQ9kG,EAAOqlG,aAJbz6F,EAASC,SAIgB,GAC3B,GACD,KACK+oB,KACRkxE,EAAQ7gG,EAAaG,IAEzB,MAEOwG,CAAQ,C,ohBEraJ,MAAM06F,UAA4B,IAAjD,c,oBAgIE,KAAApgE,cAAsBC,GAAsB,EAAD,sCAGnCzoC,KAAKiH,SAASk6B,gBAAgB0nE,cACpCpgE,EAAQ1jC,SAASiD,IAGf,MAAM,IAACm4B,GAAO1E,EAAA,qBAA+B,CAC3CzzB,OAAQA,EACRoD,UAAWpL,KAAK+oB,SAASoL,WACzBoP,eAAe,EACfnO,WAAY,eAGRqS,EAAWznC,KAAK+oB,SAAS0e,SAASpkC,IAAI2E,GAC5Cm4B,EAAIpF,YAAYrvB,OAAO1L,KAAKopC,SAAS3B,IAGrC,MAAMqhE,EAAgC,GACtC9oG,KAAK+oG,iBAAiBhkG,SAAQ,CAACw9B,EAASxS,KACtC,GAAGwS,EAAQl/B,IAAI2E,GAAS,CACtB,MAAM4wB,EAAOvtB,SAASC,cAAc,SACpC,EAAA4yB,EAAA,GAAatF,GAAM,EAAAtM,EAAA,GAAcyD,EAAOhhB,QACxC+5F,EAAezmG,KAAKu2B,E,MAIT,QAAKkwE,GAAgB,GAC7B/jG,SAASnE,IACdu/B,EAAIU,gBAAgBn1B,OAAO9K,EAAG,GAC9B,GAEN,IA4FA,KAAAooG,eAAkBnmG,IAEC,aAAd7C,KAAK4B,OACN5B,KAAKipG,WAAW19F,MAAM4f,QAAUtoB,EAAS,GAAK,O,CAYpD,CA/PSwzB,KACLtG,EACAnuB,EACAsnG,GAEAlpG,KAAKmpG,eAAiBp5E,EACtB/vB,KAAK+vB,QAAS,EAAAqX,EAAA,GAAKpnC,KAAKmpG,gBACxBnpG,KAAK4B,KAAOA,EACZ5B,KAAKkpG,cAAgBA,EAErBlpG,KAAK2S,QAAQnQ,SACbxC,KAAKoL,UAAUmI,UAAUxS,IAAI,+BAC7Bf,KAAKipG,YAAa,OAAW,yBAA0B,CAAC1mF,UAAU,IAClEviB,KAAKipG,WAAW19F,MAAM4f,QAAU,OAEhCnrB,KAAKsrD,OAAO5/C,OAAO1L,KAAKipG,aAExB,QAAiBjpG,KAAKipG,YAAY,IAAW,EAAD,gCAC1C,MAAMxhE,EAAWznC,KAAK+oB,SAASsiB,cAI/B,GAAiB,aAAdrrC,KAAK4B,KACN,IAAI,MAAM4K,KAAOxM,KAAK+vB,OAAOtiB,OACI,IAA5BjB,EAAI2N,QAAQ,oBAKRna,KAAK+vB,OAAOtiB,OAAOjB,QAG5B,IAAI,MAAMA,KAAOxM,KAAK+vB,OAAOtiB,OACI,IAA5BjB,EAAI2N,QAAQ,oBAKRna,KAAK+vB,OAAOtiB,OAAOjB,GAI9B,MAAMi8B,EAAoB,GAC1B,IAAI,MAAMj8B,KAAOi7B,EACZj7B,EAAI2f,WACLsc,EAAQpmC,KAAKmK,EAAIiqB,YAGjBz2B,KAAK+vB,OAAOtiB,OAAOjB,IAAO,EAI9B,IAAI48F,EAEFA,EADe,aAAdppG,KAAK4B,KACCoG,GAAWygC,EAAQ1zB,SAAS/M,GAE5BA,IAAYygC,EAAQ1zB,SAAS/M,IAGtC,EAAA+jD,EAAA,GAAe/rD,KAAK+vB,OAAOwmE,eAAe,CAACvuF,EAAQe,KAC7CqgG,EAAIphG,KACNhI,KAAK+vB,OAAOwmE,cAAcpkE,OAAOppB,EAAK,GACtC/I,KAAK+vB,OAAOs5E,aAAal3E,OAAOppB,EAAK,G,IAIzC,MAAMugG,EAAsB,aAAdtpG,KAAK4B,KAAsB,iBAAmB,iBACtD2nG,EAA4B,aAAdvpG,KAAK4B,KAAsB,gBAAkB,iBACjE,EAAAmqD,EAAA,GAAe/rD,KAAK+vB,OAAOu5E,IAAQ,CAACthG,EAAQe,KACvC0/B,EAAQ1zB,SAAS/M,KAClBhI,KAAK+vB,OAAOu5E,GAAOn3E,OAAOppB,EAAK,GAC/B/I,KAAK+vB,OAAOw5E,GAAap3E,OAAOppB,EAAK,G,IAIzC/I,KAAK+vB,OAAqB,aAAd/vB,KAAK4B,KAAsB,iBAAmB,kBAAoB6mC,EAC9EzoC,KAAK+vB,OAAqB,aAAd/vB,KAAK4B,KAAsB,gBAAkB,uBAAyByjB,QAAQqH,IAAI+b,EAAQ3tB,KAAK9S,GAAWhI,KAAKiH,SAASqI,gBAAgBk6F,iBAAiBxhG,MAGrKhI,KAAKkpG,cAAcO,UAAUzpG,KAAK+vB,QAAQ,GAC1C/vB,KAAK4S,OACP,KAAG,CAACf,eAAgB7R,KAAK6R,iBAEzB,MAAM63F,EAAepzB,IACnBt2E,KAAK+0B,MAAQvT,EAAA,UAAoB80D,EAAUqzB,mCAAqCrzB,EAAUszB,kCAAkC,EAM9H,OAHA5pG,KAAK6R,eAAe9Q,IAAIygB,EAAA,EAAxBxhB,CAAmC,aAAc0pG,GAEjD1pG,KAAK+oG,iBAAmB,IAAIxnG,IACrB8jB,QAAQqH,IAAI,CACjB1sB,KAAKiH,SAAS+tF,eAAekB,mBAAmB5nF,MAAW42B,GAAY,EAAD,sCAC9D7f,QAAQqH,IAAIwY,EAAQnV,QAAQA,IAAY,SAAiBA,EAAOnoB,MAAKkT,KAAUiV,GAAW,EAAD,gCAC7F,MACM0Y,SADgBzoC,KAAKiH,SAASk7B,eAAe0yD,iBAAiB9kE,EAAOnoB,KACnDkT,KAAK4P,GAAMA,EAAE1iB,SACrChI,KAAK+oG,iBAAiBnlG,IAAImsB,EAAQ,IAAI3uB,IAAIqnC,GAC5C,MACF,MAEAzoC,KAAKiH,SAAS4zD,WAAWuxB,eAAe99E,MAAMgoE,IAC5CozB,EAAYpzB,EAAU,KAG5B,CAEAltC,SAAS3B,GACP,MAAMuD,EAAgB,IAAI,IAAc,CACtCrhC,OAAO,IAMT,OAJG89B,IACDuD,EAAcpW,MAAMyU,QAAU5B,GAGzBuD,EAAcC,KACvB,CAoCA/vB,SACElb,KAAKipG,WAAW19F,MAAM4f,QAAwB,aAAdnrB,KAAK4B,KAAsB,GAAK,OAChE5B,KAAK2hF,SAAuB,aAAd3hF,KAAK4B,KAAsB,mBAAqB,mBAE9D,MAAMmuB,EAAS/vB,KAAK+vB,OAEd85E,EAAoB,IAAI,IAAe,CAC3ChhC,aAAa,EACb3wD,KAAM,oBAKR,IAAI7R,EAFJwjG,EAAkBz+F,UAAUmI,UAAUxS,IAAI,qBAIxCsF,EADe,aAAdrG,KAAK4B,KACI,CACRkoG,cAAe,CAACC,IAAK,OAAQ/1F,KAAM,8BACnCg2F,iBAAkB,CAACD,IAAK,UAAW/1F,KAAM,2BACzCi2F,aAAc,CAACF,IAAK,YAAa/1F,KAAM,8BAG/B,CACR2tB,SAAU,CAACooE,IAAK,aAAc/1F,KAAM,4BACpCygF,aAAc,CAACsV,IAAK,cAAe/1F,KAAM,+BACzC9P,OAAQ,CAAC6lG,IAAK,QAAS/1F,KAAM,0BAC7B0gF,WAAY,CAACqV,IAAK,aAAc/1F,KAAM,4BACtC2gF,KAAM,CAACoV,IAAK,OAAQ/1F,KAAM,yBAI9B,MAAMs0B,EAAIj9B,SAASojE,yBACnB,IAAI,MAAMjiE,KAAOnG,EAAS,CACxB,MAAMiQ,GAAS,OAAO,qDAAsD,CAACvC,KAAM1N,EAAQmG,GAAKu9F,IAAK/1F,KAAM3N,EAAQmG,GAAKwH,OACxHsC,EAAOyT,QAAQ/hB,OAASwE,EACxB8J,EAAO5K,OAAO1L,KAAKopC,YACnBd,EAAE58B,OAAO4K,E,CAEXuzF,EAAkBl3F,QAAQjH,OAAO48B,GAIjC,MAAM4hE,GAA+B,aAAdlqG,KAAK4B,KAAsBmuB,EAAOsmE,eAAiBtmE,EAAOumE,gBAAgBxmE,QAEjG9vB,KAAK+oB,SAAW,IAAI,IAAe,CACjCwgB,SAAUvpC,KAAKoL,UACfkpB,SAAUt0B,KAAKgpG,eACfphE,SAAU,CAAC,WACXW,kBAAmBvoC,KAAKwoC,cACxBjlC,YAAa,SACb2lC,uBAAwB,cACxBjiC,SAAUjH,KAAKiH,WAEjBjH,KAAK+oB,SAAS0e,SAAW,IAAIrmC,IAAI8oG,GAEjC,IAAIC,GAAe,EACnB,MAAMC,EAAOpqG,KAAK+oB,SAAShoB,IAAIuZ,KAAKta,KAAK+oB,UACzC/oB,KAAK+oB,SAAShoB,IAAM,CAACiH,EAAQ+G,EAAOurB,KAClC,GAAGt6B,KAAK+oB,SAAS0e,SAAS5/B,MAAQ7H,KAAK+0B,OAASo1E,IAAiB9jG,EAAQ2B,GAAS,CAChF,MAAMpH,EAAuBZ,KAAK+oB,SAASsK,KAAKzb,cAAc,kBAAkB5P,yBAC7EpH,GACD8B,YAAW,KACT9B,EAAGyoC,SAAU,CAAK,GACjB,GAGL,MAAMxhB,EAAM,YAA0B,aAAd7nB,KAAK4B,KAAsB,uCAAwC,wCAAwC,GAEnI,YADA,EAAA6tB,EAAA,IAAM5H,E,CAIR,MAAMuG,EAAMg8E,EAAKpiG,EAAQ3B,EAAQ2B,IAAU,QAAK3B,EAAQ2B,GAAQgM,WAAQ/P,EAAWq2B,GAInF,OAHGj0B,EAAQ2B,IACTomB,EAAIxW,cAAc,kBAAkBrE,UAAUxS,IAAI,SAAWsF,EAAQ2B,GAAQ+hG,KAExE37E,CAAG,EAGZpuB,KAAK+oB,SAASoL,WAAW/oB,UAAUM,OAAOm+F,EAAkBz+F,UAAWpL,KAAK+oB,SAASoL,WAAW/oB,UAAUkf,kBAE1GtqB,KAAK+oB,SAASuiB,WAAW4+D,GACzBC,GAAe,EAEf,IAAI,MAAME,KAAQt6E,EAAOtiB,OAEpBpH,EAAQikG,eAAeD,IAAWt6E,EAAOtiB,OAAO48F,KACjD,QAAmBR,EAAkBl3F,QAAQiF,cAAc,kBAAkByyF,OAGnF,CASApgD,sBAME,OALGjqD,KAAK+oB,WACN/oB,KAAK+oB,SAAS3d,UAAU5I,SACxBxC,KAAK+oB,SAAW,MAGX7W,MAAM+3C,qBACf,E,kVCvQa,MAAMsgD,UAAyB,IAA9C,c,oBAUU,KAAA/S,MAAsJ,CAAC,CAsXjK,CA7WS/gF,qBACL,MAAO,CACL49E,cAAeC,EAAA,+BAA0C,aAE7D,CAEOj+D,KAAK11B,EAAwD4pG,EAAiBnV,eACnFp1F,KAAKoL,UAAUmI,UAAUxS,IAAI,yBAC7Bf,KAAKsT,QAAUjI,SAASC,cAAc,OACtCtL,KAAKsT,QAAQC,UAAUxS,IAAI,WAC3Bf,KAAKsT,QAAQ5H,QAAO,QAAK,6BACzB1L,KAAKomF,iBAAmB/6E,SAASC,cAAc,OAC/CtL,KAAKomF,iBAAiB7yE,UAAUxS,IAAI,qBAEpCf,KAAKipG,YAAa,OAAW,+BAC7B,IAAIuB,GAAW,EACf,MAAMC,EAA4C,CAChD12F,KAAM,gBACNC,KAAM,mBACNC,QAAS,KACP,IAAI,IAAU,gBAAiB,CAC7BumD,aAAc,wCACdC,mBAAoB,sCACpB5mD,QAAS,CAAC,CACR6mD,QAAS,SACTtkC,SAAU,KACLo0E,IAIHA,GAAW,EAEXxqG,KAAKiH,SAAS+tF,eAAe0V,mBAAmB1qG,KAAK+vB,QAAQ,GAAMzhB,MAAMq8F,IACvE3qG,KAAK4S,OAAO,IACXuF,SAAQ,KACTqyF,GAAW,CAAK,IAChB,EAEJr3B,UAAU,MAEXtkD,MAAM,GAGb7uB,KAAK4qG,SAAU,OAAiB,CAC9B/4F,eAAgB7R,KAAK6R,eACrBuT,UAAW,cACXvR,QAAS,CAAC42F,KAEZzqG,KAAK4qG,QAAQr3F,UAAUxS,IAAI,QAE3Bf,KAAKsrD,OAAO5/C,OAAO1L,KAAKipG,WAAYjpG,KAAK4qG,SAEzC,MAAMC,EAAe,IAAI,IAAe,CAAC,GAEnCjpB,EAAev2E,SAASC,cAAc,OAC5Cs2E,EAAaruE,UAAUxS,IAAI,iBAE3Bf,KAAKy8F,eAAiB,IAAI,KAAW,CACnCxxD,MAAO,iBACPu1B,UAhFyB,KAmF3BohB,EAAal2E,OAAO1L,KAAKy8F,eAAerxF,WACxCy/F,EAAal4F,QAAQjH,OAAOk2E,GAE5B,MAAMkpB,EAAe,CAACzvF,EAAmB0vF,EAAqBl3F,EAAgFm3F,KAC5I,MAAMniE,EAAU,IAAI,IAAe,CACjC3wB,KAAM6yF,EACNliC,aAAa,IAGfhgC,EAAQz9B,UAAUmI,UAAUxS,IAAI,cAAesa,GAE/C,MAAMw5C,EAAahsB,EAAQu4C,yBAiB3B,OAhBAvsB,EAAWthD,UAAUxS,IAAI,qBAEzB8S,EAAQ9O,SAASkyE,IACf,MAAM3gE,GAAS,OAAO,yDAA0D,CAC9EvC,KAAMkjE,EAAEljE,KACRC,KAAMijE,EAAEjjE,KACRuO,UAAU00D,EAAEn0B,iBAAa7+C,IAGxBgzE,EAAE/+D,OACH8yF,EAAG/zB,EAAE/+D,MAAQ5B,GAGfu+C,EAAWnpD,OAAO4K,EAAO,IAGpBuyB,CAAO,EAGhB7oC,KAAKq2F,eAAiByU,EAAa,uBAAwB,gBAAiB,CAAC,CAC3E/2F,KAAM,cACNC,KAAM,kCACN8uC,YAAY,GACX,CACD9uC,KAAM,2BACND,KAAM,aACNmE,KAAM,YACL,CACDlE,KAAM,8BACND,KAAM,cACNmE,KAAM,gBACL,CACDlE,KAAM,yBACND,KAAM,QACNmE,KAAM,UACL,CACDlE,KAAM,2BACND,KAAM,UACNmE,KAAM,cACL,CACDlE,KAAM,uBACND,KAAM,OACNmE,KAAM,SACJlY,KAAKw3F,OAETx3F,KAAKs2F,eAAiBwU,EAAa,uBAAwB,gBAAiB,CAAC,CAC3E/2F,KAAM,gBACNC,KAAM,kCACN8uC,YAAY,GACX,CACD9uC,KAAM,6BACND,KAAM,OACNmE,KAAM,iBACL,CACDlE,KAAM,0BACND,KAAM,UACNmE,KAAM,oBACL,CACDlE,KAAM,4BACND,KAAM,YACNmE,KAAM,iBACJlY,KAAKw3F,OAETx3F,KAAKm0B,WAAWzoB,OAAO1L,KAAKomF,iBAAkBpmF,KAAKsT,QAASu3F,EAAaz/F,UAAWpL,KAAKq2F,eAAejrF,UAAWpL,KAAKs2F,eAAelrF,WAEvI,MAAM6/F,EAAyBjrG,KAAKq2F,eAAejrF,UAAUwM,cAAc,sBACrEszF,EAAyBlrG,KAAKs2F,eAAelrF,UAAUwM,cAAc,uBAE3E,QAAiBqzF,EAAuBrzF,cAAc,SAAwB,KAC5E5X,KAAK4kF,OAAOC,UAAU+jB,GAAqBl6E,KAAK1uB,KAAK+vB,OAAQ,WAAY/vB,KAAK,GAC7E,CAAC6R,eAAgB7R,KAAK6R,kBAEzB,QAAiBq5F,EAAuBtzF,cAAc,SAAwB,KAC5E5X,KAAK4kF,OAAOC,UAAU+jB,GAAqBl6E,KAAK1uB,KAAK+vB,OAAQ,WAAY/vB,KAAK,GAC7E,CAAC6R,eAAgB7R,KAAK6R,kBAEzB,QAAiB7R,KAAKipG,YAAY,KAChC,GAAGjpG,KAAKy8F,eAAe7nE,MAAMrhB,UAAUqB,SAAS,SAC9C,OAGF,IAAI5U,KAAKy8F,eAAe/vF,MAAM+nB,OAE5B,YADAz0B,KAAKy8F,eAAe7nE,MAAMrhB,UAAUxS,IAAI,SAI1C,IAUIwN,EAVA48F,EAAWjyF,MAAMC,KAAK8xF,EAAuB9xE,UAA4BrJ,MAAM,GAAG4rB,QAAO,CAACC,EAAK/6C,IAAO+6C,KAAQ/6C,EAAG2K,MAAM4f,SAAS,GACpIggF,GAAWnrG,KAAK+vB,OAAOq7E,cAAcvoG,OAEjCsoG,GAKJnrG,KAAKipG,WAAWt7F,aAAa,WAAY,QAMvCY,EAHEvO,KAAK+vB,OAAOnoB,GAGJ5H,KAAKiH,SAAS+tF,eAAe0V,mBAAmB1qG,KAAK+vB,QAFrD/vB,KAAKiH,SAAS+tF,eAAewB,mBAAmBx2F,KAAK+vB,QAKjExhB,EAAQD,MAAMq8F,IACZ3qG,KAAK4S,OAAO,IACXqF,OAAOzS,IACQ,4BAAbA,EAAI5D,MACL,EAAA6tB,EAAA,IAAM,yCAENrjB,QAAQujB,MAAM,4BAA6BnqB,E,IAE5C2S,SAAQ,KACTnY,KAAKipG,WAAW99C,gBAAgB,WAAW,MAtB3C,EAAA17B,EAAA,IAAM,mDAuBN,GACD,CAAC5d,eAAgB7R,KAAK6R,iBAEzB7R,KAAK6R,eAAe9Q,IAAIf,KAAKy8F,eAAe7nE,MAA5C50B,CAAmD,SAAS,KAC1DA,KAAK+vB,OAAOhhB,MAAQ/O,KAAKy8F,eAAe/vF,MACxC1M,KAAKqrG,oBAAoB,IAG3B,MAAMC,EAAsD,SAAdtrG,KAAK4B,KAAkB,CACnE5B,KAAKiH,SAAS+tF,eAAeuW,qBAAqBvrG,KAAK+vB,OAAOnoB,GAAI,gBAClE5H,KAAKiH,SAAS+tF,eAAeuW,qBAAqBvrG,KAAK+vB,OAAOnoB,GAAI,iBAClE5H,KAAKiH,SAAS+tF,eAAeuW,qBAAqBvrG,KAAK+vB,OAAOnoB,GAAI,kBAChE,GAEJ,OAAOyd,QAAQqH,IAAI,CACjB1sB,KAAK61F,qBAAuBl1F,EAAE0zF,cAAc/lF,MAAW8B,GAAO,kCAC5D,MAAMhO,QAAegO,EAAG,CACtBhF,UAAWpL,KAAKomF,iBAChB1iF,MAAM,EACNc,UAAU,EACV0iB,MAAO,GACPI,OAAQ,KAKV,OAFAtnB,KAAKS,UAAY2B,EAEVkyF,EAAA,oBAA+BlyF,EACxC,SAEGkpG,IACFh9F,MAAK,KACW,SAAdtO,KAAK4B,MACN5B,KAAKypG,UAAUzpG,KAAKmpG,gBAAgB,GACpCnpG,KAAKwrG,eAELxrG,KAAKk1F,gBACLl1F,KAAKyrG,e,GAGX,CAEAlkB,qBACEvnF,KAAK61F,qBAAqBvnF,MAAK,KAC7BtO,KAAKS,UAAU+D,UAAW,EAC1BxE,KAAKS,UAAUgE,MAAM,GAEzB,CAEQgnG,eAENzrG,KAAK2hF,SAAS,aACd3hF,KAAK4qG,QAAQr3F,UAAUxS,IAAI,QAC3Bf,KAAKipG,WAAW11F,UAAU/Q,OAAO,QAEjC,IAAI,MAAM6nG,KAAQrqG,KAAKw3F,MAErBx3F,KAAKw3F,MAAM6S,GAAM9+F,MAAM4f,QAAU,MAErC,CAEQqgF,aAENxrG,KAAK2hF,SAAuB,WAAd3hF,KAAK4B,KAAoB,YAAc,oBAEpC,SAAd5B,KAAK4B,OACN5B,KAAK4qG,QAAQr3F,UAAU/Q,OAAO,QAC9BxC,KAAKipG,WAAW11F,UAAUxS,IAAI,SAGhC,MAAMgvB,EAAS/vB,KAAK+vB,OACpB/vB,KAAKy8F,eAAe/vF,OAAQ,EAAAixD,EAAA,GAAc5tC,EAAOhhB,OAEjD,IAAI,MAAMs7F,KAAQrqG,KAAKw3F,MACrBx3F,KAAKw3F,MAAM6S,GAAyC9+F,MAAM4f,QAAY4E,EAAOtiB,OAAO48F,GAA2C,GAAK,OAGtI,CAAE,iBAA2B,kBAA4BtlG,SAAcyH,GAAQ,kCAC7E,MAAMq8B,EAAU7oC,KAAKwM,GACf6wF,EAAK5hE,EAAA,uBAAiC,CAACiwE,aAAa,IAE1D,IAAIzoE,EAAQlT,EAAOvjB,GAGnB,MAAMm/F,EAAgB3jG,GAAmB,kCACvC,eAAgBhI,KAAKiH,SAAS8G,mBAAmB69F,cAAc5jG,OAAaA,EAAO66B,UAAkF,gBAAhE7iC,KAAKiH,SAASk6B,gBAAgBC,QAAQp5B,EAAO+6B,aAAanzB,CACjK,IAEMi8F,QAAiB,EAAAC,EAAA,GAAY7oE,GAAQj7B,GAAW2jG,EAAQ3jG,KAC9Di7B,EAAMpgC,OAAS,EACfogC,EAAM5gC,QAAQwpG,GAEd5oE,EAAQA,EAAMnT,QAEd,MAAMi8E,EAAmBC,GAAoB,kCAC3C,IAAI,IAAIhkF,EAAI,EAAGnlB,EAAS2D,KAAKI,IAAIq8B,EAAMpgC,OAAQmpG,GAAUhkF,EAAInlB,IAAUmlB,EAAG,CACxE,MAAMhgB,EAASi7B,EAAM/N,QACrB,IAAGltB,EAAO66B,kBAA2B7iC,KAAKiH,SAAS8G,mBAAmB69F,cAAc5jG,IAClF,SAGF,MAAM,IAACm4B,GAAO1E,EAAA,qBAA+B,CAC3CzzB,OAAQA,EACRoD,UAAWiyF,EACX95D,eAAe,EACflO,WAAW,EACXD,WAAY,UAEd+K,EAAIU,gBAAgB5nB,cAAczW,Q,CAGjCygC,EAAMpgC,OACPk/B,EAASzX,iBAAiBwC,aAAY,QAAK,sBAAuB,CAACmW,EAAMpgC,UACjEk/B,GACRA,EAASv/B,QAEb,IAIA,IAAIu/B,EACJ,GAHA8G,EAAQu4C,yBAAyB11E,OAAO2xF,GAGrCp6D,EAAMpgC,OAAQ,CACf,MAAM8P,EAAUk2B,EAAQu4C,yBACxBr/C,GAAW,OAAO,yDAA0D,CAAChuB,KAAM,SACnFguB,EAASxuB,UAAUxS,IAAI,YAAa,gBACpC,QAAiBghC,GAAU,IAAMgqE,EAAW,KAAK,CAACl6F,eAAgB7R,KAAK6R,iBACvEkwB,EAASr2B,QAAO,QAAK,sBAAuB,CAACu3B,EAAMpgC,UAEnD8P,EAAQjH,OAAOq2B,E,CAGjBgqE,EAAW,EACb,KACF,CAEAV,qBACE,GAAiB,SAAdrrG,KAAK4B,KAAiB,CACvB,MAAMqpD,IAAW,EAAAkvC,EAAA,GAAUn6F,KAAKmpG,eAAgBnpG,KAAK+vB,QACrD/vB,KAAKipG,WAAW11F,UAAU1J,OAAO,QAASohD,GAC1CjrD,KAAK4qG,QAAQr3F,UAAU1J,OAAO,OAAQohD,E,CAE1C,CAEAw+C,UAAU15E,EAAsBw0C,GAC3BvkE,KAAKoL,WAEN8N,MAAMC,KAAKnZ,KAAKoL,UAAUqN,iBAAiB,mBAAmB1T,SAASnE,GAAOA,EAAG4B,WAGhF+hE,GACDvkE,KAAKmpG,eAAiBp5E,EACtB/vB,KAAK+vB,QAAS,EAAAqX,EAAA,GAAKrX,KAEnB/vB,KAAK+vB,OAASA,EACd/vB,KAAKwrG,aACLxrG,KAAKqrG,qBAET,CAEOnW,cAAcnlE,QACL9rB,IAAX8rB,GACD/vB,KAAKypG,UAAU,CACb75F,EAAG,eACHhI,GAAI,EACJmH,MAAO,GACPtB,OAAQ,CAAC,EACT47F,aAAc,GACd+B,cAAe,GACfa,cAAe,GACf1V,cAAe,GACfF,eAAgB,GAChBC,eAAgB,KACf,GACHt2F,KAAK4B,KAAO,WAEZ5B,KAAKypG,UAAU15E,GAAQ,GACvB/vB,KAAK4B,KAAO,OAEhB,E,wKCxYK,SAASsqG,IACd,MAAMvrG,EAAI0K,SAASC,cAAc,OAE3BmJ,GAAI,OAAiBpJ,SAASC,cAAc,MAC5C6gG,GAAe,QAAK,oBAAqB,CAAC13F,IAShD,OARA03F,EAAa54F,UAAUxS,IAAI,0BAC3BJ,EAAE+K,OACAygG,EACA9gG,SAASC,cAAc,MACvBD,SAASC,cAAc,OAEzB3K,EAAE4S,UAAUxS,IAAI,QAET,CACLmB,QAASvB,EACTyrG,YAAcprE,IACTA,IACDvsB,EAAEgqB,KAfsB,iCAeSuC,GAGnCrgC,EAAE4S,UAAU1J,OAAO,QAASm3B,EAAS,EAG3C,CAEe,MAAMqrE,UAA0B,IAWtC51F,qBACL,MAAO,CACL61F,aAAc,iCAAuC,OACrDprE,KAAM,uCACNqrE,SAAU,0CAAgD,qBAE9D,CAEal2E,KAAK11B,G,qCAChBX,KAAKoL,UAAUmI,UAAUxS,IAAI,0BAC7Bf,KAAK2hF,SAAS,qBAEd,MAAMv5B,EAA4B,IAE3BkkD,EAAcprE,EAAMqrE,SAAkBlnF,QAAQqH,IAAI,CAAC/rB,EAAE2rG,aAAc3rG,EAAEugC,KAAMvgC,EAAE4rG,WAEpF,CACE,MAAM1jE,GAAU,OAAgB7oC,KAAKm0B,gBAAYlwB,EAAW,mBACtD29E,EAAev2E,SAASC,cAAc,OAC5Cs2E,EAAaruE,UAAUxS,IAAI,iBAE3Bf,KAAKwsG,oBAAsB,IAAI,KAAW,CACxCvhE,MAAO,6BACP/yB,KAAM,aACNsoD,UAAW,KAEbxgE,KAAK08F,mBAAqB,IAAI,KAAW,CACvCzxD,MAAO,sCACP/yB,KAAM,YACNsoD,UAAW,KAEbxgE,KAAKysG,cAAgB,IAAI,KAAW,CAClCxhE,MAAO,uBACP/yB,KAAM,MACNsoD,UAAW8rC,IAGb1qB,EAAal2E,OAAO1L,KAAKwsG,oBAAoBphG,UAAWpL,KAAK08F,mBAAmBtxF,UAAWpL,KAAKysG,cAAcrhG,WAE9G,MAAMkI,EAAUjI,SAASC,cAAc,OACvCgI,EAAQC,UAAUxS,IAAI,YACtB,QAAM,CAACmB,QAASoR,EAAS9G,IAAK,oBAE9B47C,EAAY/lD,KAAKrC,KAAKwsG,oBAAqBxsG,KAAK08F,mBAAoB18F,KAAKysG,eAEzEzsG,KAAK48F,SAAW,IAAI,IAAS,CAC3B50F,OAAQ,SACRogD,cACAv2C,eAAgB7R,KAAK6R,iBAGvB7R,KAAK2S,QAAQjH,OAAO1L,KAAK48F,SAASp0C,SAElC3f,EAAQn9B,OAAO1L,KAAK48F,SAASh0C,WAAWx9C,UAAWw2E,E,CAGrD,CACE,MAAM/4C,EAAU,IAAI,IAAe,CACjC3wB,KAAM,uBACN5E,SAAS,IAGLsuE,EAAev2E,SAASC,cAAc,OAC5Cs2E,EAAaruE,UAAUxS,IAAI,iBAE3Bf,KAAK0sG,mBAAqB,IAAI,IAAmB,CAC/CzhE,MAAO,6BACP/yB,KAAM,WACN1I,WAAW,EACXqC,eAAgB7R,KAAK6R,eACrByiB,SAAU,KACRt0B,KAAK48F,SAASr0C,eAGd,MAAM,MAAC54B,GAAS3vB,KAAK0sG,mBACfC,EAA6B,iCAAhBh9E,aAAK,EAALA,EAAO/tB,MAC1BwqG,EAAYO,EAAa3sG,KAAK0sG,mBAAmBhgG,WAAQzI,EAAU,EAErE2oG,cAAe,iCACfC,UAAW,6BACXC,YAAa,gCACZ9sG,KAAKiH,UAER26E,EAAal2E,OAAO1L,KAAK0sG,mBAAmBthG,WAE5C,MAAMkI,EAAUu1B,EAAQv1B,SAElB,YAAC84F,EAAalqG,QAASvB,GAAKurG,IAElC54F,EAAQ5H,OACN/K,GACA,QAAK,iBAWPynD,EAAY/lD,KAAKrC,KAAK0sG,oBACtB7jE,EAAQl2B,QAAQjH,OAAOk2E,GACvB5hF,KAAKm0B,WAAWzoB,OAAOm9B,EAAQz9B,U,CAGjC,CACE,MAAMy9B,EAAU,IAAI,IAAiB,CACnC7gC,OAAQ,SACRo4B,KAAMc,EACNrvB,eAAgB7R,KAAK6R,eACrB66F,mBAAoB1sG,KAAK0sG,mBACzBx1E,WAAYl3B,KAAKkzC,iBAAiBjwC,QAGpCjD,KAAKm0B,WAAWzoB,OAAOm9B,EAAQz9B,U,EAGjC,QAAiBpL,KAAK48F,SAASp0C,SAAS,KACtCxoD,KAAK48F,SAASp0C,QAAQrU,UAAW,EAEjC,MAAMpY,EAA2B,GAE3BgxE,EAAiB/sG,KAAKiH,SAASi9B,kBAAkB8oE,cACrDhtG,KAAKwsG,oBAAoB9/F,MACzB1M,KAAK08F,mBAAmBhwF,MACxB1M,KAAKysG,cAAc//F,OAErBqvB,EAAS15B,KAAK0qG,EAAez+F,MAAK,KAChCtO,KAAK4S,OAAO,IACVpN,IACF4G,QAAQujB,MAAM,uBAAwBnqB,EAAI,KAGzCxF,KAAK48F,SAAS50C,cACfjsB,EAAS15B,KAAKrC,KAAK48F,SAAS50C,eAAe15C,MAAM+zE,GACxCriF,KAAKiH,SAASi9B,kBAAkBo3D,mBAAmBjZ,MAI3DriF,KAAK0sG,mBAAmB7qC,mBACzB9lC,EAAS15B,KAAKrC,KAAKiH,SAASk6B,gBAAgB8rE,eAAejtG,KAAK0sG,mBAAmBhgG,QAGrF2Y,QAAQ+1C,KAAKr/B,GAAU5jB,SAAQ,KAC7BnY,KAAK48F,SAASp0C,QAAQ2C,gBAAgB,WAAW,GACjD,GACD,CAACt5C,eAAgB7R,KAAK6R,iBAEzB7R,KAAKwsG,oBAAoBzqC,iBAAiB7gC,EAAKs6C,YAAY,GAC3Dx7E,KAAK08F,mBAAmB36B,iBAAiB7gC,EAAKu6C,WAAW,GACzDz7E,KAAKysG,cAAc1qC,iBAAiBwqC,EAASzgC,OAAO,GACpD9rE,KAAK0sG,mBAAmB3qC,kBAAiB,OAAwB7gC,IAAO,GAGxElhC,KAAK48F,SAASr0C,cAChB,E,8YCxMK,MAAM2kD,EAAgC,wBAEtC,MAAMC,UAAwB,IAKnCptG,cACEmS,MAAM,CACJwsF,UAAWrzF,SAASkR,eAAe,gBACnC6wF,cAAc,EACdtvD,eAAgB,UARZ,KAAAuvD,uBAAwB,CAUhC,CAEAliG,UAAUlE,GACRjH,KAAKiH,SAAWA,EAEhB,qBAA4B,gBAAgB,CAACkS,EAAM6xF,KAC9CA,IAAO,YAAqB7xF,IAAS,YACtCnZ,KAAKstG,eAAc,E,IAIvB,qBAA4B,UAAU,KACpCttG,KAAKutG,qBAAqB,GAE9B,CAEOC,uBACL,MAAMt6F,EAAMlT,KAAK6kF,UAAU,KAAmB,GAAO,GAGrD,OAFA3xE,EAAI0xE,OAAS5kF,KAENkT,CACT,CAEOu6F,sBAAsBv6F,GAC3B,MAAMw6F,EAAc1tG,KAAK2tG,eACzB,GAAGD,EAAa,CACd,MAAM3kG,EAAM/I,KAAK4tG,cAAczzF,QAAQuzF,GAEpC1tG,KAAK6tG,WAAWC,YAAcJ,EAAYtiG,WAC3CpL,KAAK6tG,WAAWE,QAAQ76F,aAAG,EAAHA,EAAK9H,WAG5B8H,IACW,IAATnK,IACD/I,KAAK4tG,cAAc7kG,GAAOmK,GAGVw6F,EAAYtiG,UAAUmI,UAAUqB,SAAS,WAEzD1B,EAAI9H,UAAUmI,UAAUxS,IAAI,UAG9B2sG,EAAYtiG,UAAU0hB,YAAY5Z,EAAI9H,cAE1B,IAATrC,GACD/I,KAAK4tG,cAAcz7E,OAAOppB,EAAK,GAGjC2kG,EAAYtiG,UAAU5I,S,MAGxBxC,KAAK+4B,cAAc/gB,QAAQ9E,EAAI9H,WAGjCpL,KAAK2tG,eAAiBz6F,CACxB,CAEO86F,WAAWpmG,EAAYgyB,EAAkBq0E,GAC1CjuG,KAAK4tG,cAAc/qG,QACrB7C,KAAKstG,eAAc,EAAO1zE,GAG5B1nB,MAAM87F,WAAWpmG,EAAIgyB,EAASq0E,EAChC,CAEQV,sBACN,MAAMniF,EAAaprB,KAAK0+F,UAAU1d,YAAchhF,KAAK0+F,UAAU9kB,uBAAuBoH,YACtF31E,SAAS+0F,gBAAgB70F,MAAM0vE,YAAY,4BAA6B,GAAK7vD,EAE/E,CAEOkiF,cAAclpF,EAAkBwV,GACrC,MAAM7T,EAAS1a,SAASI,KAAK8H,UAAUqB,SAASs4F,GAChD,IAAIgB,EAaJ,QAZcjqG,IAAXmgB,EACEA,EACG2B,IACFmoF,GAAa,GAEPnoF,IACRmoF,GAAa,GAGfA,GAAa,GAGXA,EAAY,OAAO7oF,QAAQlX,UAE3B4X,GAAW/lB,KAAK4tG,cAAc/qG,QAChC7C,KAAK2tG,eAAej/E,OAGlB1uB,KAAKqtG,wBACPrtG,KAAKutG,sBACLvtG,KAAKqtG,uBAAwB,GAG/B,MAAMc,EAAmB,eAAuBpoF,EAAS,UAAgB,aAAkB6T,GAE3F,OADAvuB,SAASI,KAAK8H,UAAU1J,OAAOqjG,EAA+B9oF,GACvD+pF,CA4CT,EAGF,MAAMC,EAAkB,IAAIjB,EAC5B,qBAAiCiB,EACjC,S,kgBCtJe,MAAMC,UAA0B,IAOhCh4E,O,yCACX,MAAM,OAACruB,GAAUhI,KACX6pE,EAAS7hE,EAAO+6B,WACtB/iC,KAAKoL,UAAUmI,UAAUxS,IAAI,sBAAuB,0BACpD,MAAOg8F,EAAWuR,SAAiBjpF,QAAQqH,IAAI,CAC7C1sB,KAAKiH,SAASk6B,gBAAgB47D,UAAUlzB,GACxC7pE,KAAKiH,SAASm+E,kBAAkBC,WAAW,gCAEvCoD,GAASsU,EACf/8F,KAAK2hF,SAAS8G,EAAQ,kBAAoB,QAE1C,CACE,MAAM5/C,EAAU,IAAI,IAAe,CAACggC,aAAa,IAC3CzgB,EAA4B,GAE5Bw5B,EAAev2E,SAASC,cAAc,OAe5C,GAdAs2E,EAAaruE,UAAUxS,IAAI,iBAE3Bf,KAAKy8F,eAAiB,IAAI,KAAW,CACnCxxD,MAAO,YACP/yB,KAAM,eACNsoD,UAAW,GACXlY,UAAU,IAEZtoD,KAAK08F,mBAAqB,IAAI,KAAW,CACvCzxD,MAAO,WACP/yB,KAAM,mBACNsoD,UAAW,KAGVqJ,EAAQ,CACT,MAAM3oC,QAAalhC,KAAKiH,SAASk6B,gBAAgBC,QAAQyoC,GAEtD4e,GACDzoF,KAAKy8F,eAAe36B,cAAc5gC,EAAKs6C,YACvCx7E,KAAK08F,mBAAmB56B,cAAc5gC,EAAKu6C,aAE3Cz7E,KAAKy8F,eAAe16B,iBAAiB7gC,EAAKs6C,YAC1Cx7E,KAAK08F,mBAAmB36B,iBAAiB7gC,EAAKu6C,W,CAelD,GAXAmG,EAAal2E,OAAO1L,KAAKy8F,eAAerxF,UAAWpL,KAAK08F,mBAAmBtxF,WAC3Eg9C,EAAY/lD,KAAKrC,KAAKy8F,eAAgBz8F,KAAK08F,oBAE3C18F,KAAK48F,SAAW,IAAI,IAAS,CAC3B50F,OAAQA,EACRogD,cACAv2C,eAAgB7R,KAAK6R,eACrB82C,iBAAiB,IAEnB3oD,KAAK2S,QAAQjH,OAAO1L,KAAK48F,SAASp0C,SAE/BxgD,EAAQ,CACT,MAAMomB,EAAM/iB,SAASC,cAAc,OACnC8iB,EAAI7a,UAAUxS,IAAI,eAClBqtB,EAAI1iB,OAAO1L,KAAK48F,SAASl0C,YAEzB,MAAM6lD,EAA6B,IAAI,IAAc,CACnDv6F,KAAM,kBAGRu6F,EAA2B35E,MAAMhnB,iBAAiB,UAAW7F,IACvDA,EAAE0B,WAINzJ,KAAKiH,SAAS8G,mBAAmBs7D,eAAe,CAACrhE,UAAQ,IAG3DhI,KAAK6R,eAAe9Q,IAAI,IAAxBf,CAAmC,mBAAyBkiC,GAAW,EAAD,gCACpE,GAAqB,eAAlBA,EAAO9B,KAAKxwB,EAAoB,OACnC,MAAM5H,GAAS,OAAUk6B,EAAO9B,KAAKA,MACrC,GAAGp4B,GAAWA,EAAQ,CACpB,MAAM2J,UAAkB3R,KAAKiH,SAASqiE,wBAAwB4tB,QAAQh1D,EAAOw1D,kBAC1E/lF,IAAY48F,EAA2BllE,UACxCklE,EAA2BllE,QAAU13B,E,CAG3C,MAEA,MAAM68F,EAAiBnjG,SAASC,cAAc,OAC9CkjG,EAAej7F,UAAUxS,IAAI,gBAC7BytG,EAAe9iG,OAAO,IAAI,IAAU,CAClC1D,OAAQA,IACP9F,SAGH,MAAMusG,EAAqBpjG,SAASC,cAAc,OAMlD,GALAmjG,EAAmBl7F,UAAUxS,IAAI,oBACjC0tG,EAAmB/iG,QAAO,QAAK,6BAE/Bm9B,EAAQl2B,QAAQjH,OAAO0iB,EAAKogF,EAAgBC,EAAoB7sB,GAE5D6G,EAWG,CACL,MAAMvnD,QAAalhC,KAAKiH,SAASk6B,gBAAgBC,QAAQyoC,GAEnD6kC,EAAW,IAAI,KAAI,CACvB36F,KAAM,QACNymD,aAAct5B,EAAKG,WAAQp9B,EAAY,eACvC8K,MAAOmyB,EAAKG,OAAQ,OAAgBH,EAAKG,YAAUp9B,EACnD+kE,gBAAiB9nC,EAAKG,MAAQ,QAAU,4BACxCy8C,iBAAkB58C,EAAKG,WAAQp9B,EAAY,CAAC,IAAI,IAAU,CAAC+D,OAAQA,IAAS9F,WAG9E2mC,EAAQl2B,QAAQjH,OAAOgjG,EAAStjG,U,KAtBvB,CACT,MAAMggE,EAAmB,IAAI,KAAI,CAC/BpgC,cAAeujE,EACfvwB,sBAAsB,EACtBnsE,eAAgB7R,KAAK6R,iBAGjBF,UAAkB3R,KAAKiH,SAASqiE,wBAAwBC,iBAAiB,CAACvhE,SAAQwhE,aAAa,KACrG+kC,EAA2BllE,QAAU13B,EAErCk3B,EAAQl2B,QAAQjH,OAAO0/D,EAAiBhgE,U,OAe1Cy9B,EAAQl2B,QAAQjH,OAAOk2E,GAGzB5hF,KAAKm0B,WAAWzoB,OAAOm9B,EAAQz9B,U,CAGjC,GAAIq9E,GA6BG,GACL6lB,EAAQ9wC,MAAMmxC,GAAkC,4BAAlBA,EAAY/+F,MACzC0+F,EAAQ9wC,MAAMmxC,GAAkC,2BAAlBA,EAAY/+F,GAAkC++F,EAAY/qB,MAAM7uE,SAAS80D,KACxG,CACA,MAAMhhC,EAAU,IAAI,IAAe,CACjCv1B,QAAS,+CACTiuE,YAAa,OAAO,OAAc,CAACv5E,OAAQhI,KAAKgI,YAE5CgjC,EAAgBhrC,KAAK4uG,wBAA0B,IAAI,IAAc,CACrE56F,KAAM,0CACNq1B,SAAS,IAELzK,GAAM,QAA2BoM,GAEvCnC,EAAQl2B,QAAQjH,OAAOkzB,EAAIxzB,WAE3BpL,KAAKm0B,WAAWzoB,OAAOm9B,EAAQz9B,U,MA7CtB,CACT,MAAMy9B,EAAU,IAAI,IAEdgmE,GAAY,OAAO,qCAAsC,CAAC96F,KAAM,SAAUC,KAAM,4BAEtF,QAAiB66F,GAAW,KAC1B,IAAI,IAAU,uBAAwB,CACpC7mG,OAAQA,EACRwyD,aAAc,gBACdC,mBAAoB,0BACpB5mD,SAAS,OAAgB,CAAC,CACxB6mD,QAAS,SACTtkC,SAAU,KACR,MAAMvsB,GAAS,OAAiB,CAACglG,IAAY,GAE7C7uG,KAAKiH,SAASk6B,gBAAgB2tE,eAAe,CAACjlC,IAASv7D,MAAK,KAC1DtO,KAAK4S,OAAO,IACX,KACD/I,GAAQ,GACR,EAEJspE,UAAU,OAEXtkD,MAAM,GACR,CAAChd,eAAgB7R,KAAK6R,iBAEzBg3B,EAAQl2B,QAAQjH,OAAOmjG,GAEvB7uG,KAAKm0B,WAAWzoB,OAAOm9B,EAAQz9B,U,EAoBjC,QAAiBpL,KAAK48F,SAASp0C,SAAS,IAAW,EAAD,gC,MAChDxoD,KAAK48F,SAASp0C,QAAQrU,UAAW,EAEjCn0C,KAAKiH,SAASk6B,gBAAgB4tE,WAC5BllC,EACA7pE,KAAKy8F,eAAe/vF,MACpB1M,KAAK08F,mBAAmBhwF,aACjB1M,KAAKiH,SAASk6B,gBAAgBC,QAAQyoC,IAASxoC,MAC1B,QAA5B,EAAArhC,KAAK4uG,+BAAuB,eAAEvlE,SAC9BlxB,SAAQ,KACRnY,KAAK48F,SAASp0C,QAAQ2C,gBAAgB,YACtCnrD,KAAK4S,OAAO,GAEhB,KAAG,CAACf,eAAgB7R,KAAK6R,gBAC3B,G,kgBCjMF,MACMm9F,GAAY,OADL,OAGE,MAAMC,UAAwB,IAS9B54E,KAAKruB,EAAgBiL,G,yCAChCjT,KAAKkvG,WAAa,EAClB,MAAMzmB,GAASx1E,EACTk8F,EAAYl8F,IAAa,KAC/BjT,KAAKoL,UAAUmI,UAAUxS,IAAI,wBAC7Bf,KAAK2hF,SAAS8G,EAAQ,WAAa,yBACnC,MAAM/hD,EAAS1+B,EAAO+4B,WAEnB9tB,IACDjT,KAAKiuE,MAAQjuE,KAAKovG,eAAgB,aAAWpvG,KAAKiH,SAASk7B,eAAe64C,cAAchzE,EAAQiL,KAGlG,CACE,MAAM41B,EAAU,IAAI,IAAe,CACjC3wB,KAAMi3F,EAAY,0BAA4B,qBAG1CE,EAAUrvG,KAAKqvG,QAAUhkG,SAASC,cAAc,OACtD+jG,EAAQ97F,UAAUxS,IAAI,8BAErBkS,IAAY,QAAiBo8F,GAAS,KAClCrvG,KAAKiuE,MAAMqhC,gBAIdtvG,KAAKkvG,YAAclvG,KAAKkvG,WAAa,GAAK,YAC1ClvG,KAAKuvG,UAAS,GACb,CAAC19F,eAAgB7R,KAAK6R,iBAEtBoB,GACDo8F,EAAQ97F,UAAUxS,IAAI,iBAGxB,MAAM6gF,EAAev2E,SAASC,cAAc,OAC5Cs2E,EAAaruE,UAAUxS,IAAI,iBAE3B,MAAM07F,EAAiBz8F,KAAKy8F,eAAiB,IAAI,KAAW,CAC1DxxD,MAAO,8BACPs2B,gBAAgB,EAChBrpD,KAAM,aACNsoD,UAAW,GACXlY,UAAU,IAGTtoD,KAAKiuE,OACNwuB,EAAe16B,iBAAiB/hE,KAAKiuE,MAAMl/D,OAAO,GAGpD,MAAMk6F,EAAajpG,KAAKipG,YAAa,OAAW,8BAA+B,CAAC1mF,UAAU,IAC1FviB,KAAKsrD,OAAO5/C,OAAOu9F,IAEnB,QAAiBA,GAAY,KAC3B,MAAMp/F,GAAS,OAAiB,CAACo/F,IAAa,GAC3Ch2F,EACDjT,KAAKiH,SAAS88B,gBAAgByrE,eAAe,CAC3C9oE,SACA+oE,QAASx8F,EACTlE,MAAO0tF,EAAe/vF,MACtBgjG,YAAa1vG,KAAKiuE,MAAMqhC,eAAiB,IACxChhG,MAAK,KACNtO,KAAK4S,OAAO,IACXqF,OAAOzS,IACR4G,QAAQujB,MAAM,mBAAoBnqB,GAClCqE,GAAQ,IAGV7J,KAAKiH,SAAS88B,gBAAgB4rE,iBAAiB,CAC7CjpE,SACAkpE,UAAW,KAAa5vG,KAAKkvG,YAC7BQ,YAAa1vG,KAAKiuE,MAAMqhC,cACxBvgG,MAAO0tF,EAAe/vF,QACrB4B,MAAM2E,IACPjT,KAAK4S,QACL,kBAA0B,CACxB5K,SACAiL,YACA,IACDgF,OAAOzS,IACR4G,QAAQujB,MAAM,qBAAsBnqB,GACpCqE,GAAQ,G,GAGX,CAACgI,eAAgB7R,KAAK6R,iBAEzB7R,KAAK6R,eAAe9Q,IAAI07F,EAAe7nE,MAAvC50B,CAA8C,SAAS,K,MACrDA,KAAKugE,WACLvgE,KAAKuvG,QAAkB,QAAV,EAAAvvG,KAAKiuE,aAAK,eAAEqhC,cAAc,IAGzC1tB,EAAal2E,OAAO+wF,EAAerxF,WAEnCy9B,EAAQl2B,QAAQjH,OAAO2jG,EAASztB,GAEhC5hF,KAAKm0B,WAAWzoB,OAAOm9B,EAAQz9B,U,CAGjC,MAAM2wB,EAA2B,GAEjC,GAAIozE,EAgDG,CACL,MAAMtmE,EAAU,IAAI,IAAe,CAACv1B,QAAS,sBAEvC03B,EAAgB,IAAI,IAAc,CAEtC3B,SAAWrpC,KAAKiuE,MAAgCxgE,OAAOs2C,OACvD/vC,KAAM,kBAGRhU,KAAK6R,eAAe9Q,IAAIiqC,EAAcpW,MAAtC50B,CAA6C,UAAU,KACrD,MAAMuO,EAAUvO,KAAKiH,SAAS88B,gBAAgByrE,eAAe,CAC3D9oE,SACA+oE,QAASx8F,EACT8wC,QAAS/Y,EAAc3B,UAGzBzK,EAAIigD,mBAAmBtwE,EAAQ,IAGjC,MAAMqwB,EAAM,IAAI,KAAI,CAClBoM,kBAGFnC,EAAQl2B,QAAQjH,OAAOkzB,EAAIxzB,WAE3BpL,KAAKm0B,WAAWzoB,OAAOm9B,EAAQz9B,U,KAzElB,CACb,MAAMy9B,EAAU,IAAI,IAAe,CAAC,GACpCA,EAAQz9B,UAAUmI,UAAUxS,IAAI,kCAChC,MAAM0rD,EAAW,IAAI,KAAS,CAC5BxlD,SAAUjH,KAAKiH,SACfksD,cAAc,EACdU,gBAAgB,EAChBS,aAAc,wCACdrgD,QAAUwxC,IACRgH,EAASn5B,UAAWmyB,EAAMr+C,MAA+Cq+C,EAAvC,CAACA,WAAOxhD,EAAWmD,WAAOnD,IAC5DjE,KAAKuvG,QAAQ9pD,EAAMr+C,MAAM,IAG7BqlD,EAASuL,iBAAmB,KAAM,CAChC9wC,MAAO,gBACPI,OAAQ,MAGVtnB,KAAKkzC,iBAAiB28D,WAAU,KAC9BpjD,EAAS1oD,SAAS,IAGpB0oD,EAASrhD,UAAUmI,UAAU/Q,OAAO,YAEpCxC,KAAK8vG,aAAezkG,SAASC,cAAc,QAC3CtL,KAAK8vG,aAAav8F,UAAUxS,IAAI,0BAEhC,MAAMwN,EAAUk+C,EAASp2B,OAAO/nB,MAAK,IAAW,EAAD,gC,MAC7C,MAAMikD,EAAW9F,EAAS4J,oBAEpBq5C,EAAwB,QAAV,EAAA1vG,KAAKiuE,aAAK,eAAEqhC,cAChC7iD,EAASyH,mBAAmB,CAC1B3B,WACArwD,QAASlC,KAAK8vG,aACd37C,OAAO,EACPn8C,SAAS,EACT+N,QAAS2pF,IAGRA,GACDjjD,EAASn5B,UAAU,CAAClsB,MAAOsoG,EAAajqD,MAAO,IAEnD,MAEA1pB,EAAS15B,KAAKkM,GAEds6B,EAAQl2B,QAAQma,YAAY2/B,EAASrhD,WACrCpL,KAAKm0B,WAAWzoB,OAAOm9B,EAAQz9B,U,CA6BjC,OAAOia,QAAQqH,IAAIqP,GAAUztB,MAAK,IACzBtO,KAAK+J,KAEhB,G,CAEQw2D,WACN,IAAIxY,EAAY/nD,KAAKy8F,eAAe56B,mBAChC9Z,GAAa/nD,KAAKovG,gBACpBrnD,EAAY/nD,KAAKiuE,MAAMqhC,gBAAkBtvG,KAAKovG,cAAcE,eAG9DtvG,KAAKipG,WAAW11F,UAAU1J,OAAO,QAASk+C,EAC5C,CAEQh+C,I,QAKN,OAJa,QAAV,EAAA/J,KAAKiuE,aAAK,eAAE8hC,cACb/vG,KAAKkvG,WAAa,aAAqBlvG,KAAKiuE,MAAM8hC,aAG7C/vG,KAAKuvG,QAAkB,QAAV,EAAAvvG,KAAKiuE,aAAK,eAAEqhC,mBAAerrG,GAAW,EAC5D,CAEcsrG,QAAQG,EAAoBnmE,EAAWvpC,KAAKqvG,QAASW,G,+CACjE,MAAMjhG,EAAQ/O,KAAKy8F,eAAe/vF,MAE5BujG,EAAa1mE,IAAavpC,KAAKqvG,QAErC,GAAGY,EAAY,CACb,MAAMC,EAAqC,CACzCtoG,GAAc,QAAV,EAAA5H,KAAKiuE,aAAK,eAAErmE,GAChBmoG,WAAY,KAAa/vG,KAAKkvG,YAC9BngG,OAAO,OAAgBA,GAAO,GAAMiF,MAAQ,IAC5Cs7F,cAAeI,GAGXS,EAAWnwG,KAAKiuE,MAYtB,GAXAjuE,KAAKiuE,MAAQiiC,GAGXF,GACCG,GACDA,EAASJ,aAAeG,EAASH,YACjCI,EAASphG,QAAUmhG,EAASnhG,OAE5B/O,KAAKuvG,aAAQtrG,EAAWjE,KAAK8vG,eAG5B,OAAUK,EAAUD,KAAcF,EACnC,OAGFhwG,KAAKugE,U,CAGP,MAAM3/D,QAAW,OAAc,CAC7BqtE,MAAOgiC,EAAajwG,KAAKiuE,MAAQ,OAAD,wBAAKjuE,KAAKiuE,OAAK,CAAEqhC,mBAAerrG,IAChEuyD,gBAAiBw4C,EACjB93E,WAAYl3B,KAAKkzC,iBAAiBjwC,QAG9B21B,EAAOvtB,SAASC,cAAc,OACpCstB,EAAKrlB,UAAUxS,IAAI,mBACnB63B,EAAKltB,OAAO9K,GAEZ,MAAMwvG,EAAQ7mE,EAASjf,iBACvBif,EAAS79B,OAAOktB,GAEhB,MAAMy3E,EAAqB,CAACzvG,EAAiB0vG,KAC3C,MAKM7vG,EAAYG,EAAGg5B,QALM,CACzB,CAACtR,QAAS,IAAK7L,UAAW,cAC1B,CAAC6L,QAAS,IAAK7L,UAAW,aAGS,CACnC5V,SAAU,IACV0pG,WAAY,EACZC,OAAQ,cACR9oD,KAAM,WACNtiC,UAAWkrF,EAAS,SAAW,YAGjC,OAAO,IAAIjrF,SAAelX,IACxB1N,EAAUmN,iBAAiB,UAAU,KACnCO,GAAS,GACR,CAACF,MAAM,GAAM,GAChB,EAGDmiG,GACDC,EAAmBD,GAAO,GAAO9hG,MAAK,IAAM8hG,EAAM5tG,WAGpD6tG,EAAmBz3E,GAAM,E,ymBCjRd,MAAM63E,UAAuB,IAI7Bp6E,O,yCACXr2B,KAAKoL,UAAUmI,UAAUxS,IAAI,sBAAuB,wBAEpD,MAAM4lC,QAAoB3mC,KAAKiH,SAAS88B,gBAAgB4C,YAAY3mC,KAAK0mC,QAEzE1mC,KAAK2hF,SAASh7C,EAAc,cAAgB,aAE5C,MAAMkC,EAAU,IAAI,IAAe,CACjC3wB,KAAMyuB,EAAc,cAAgB,cAGhCoX,GAAS,SACT2yD,EAAa,IAAI,KAAI,CACzBjzB,WAAY,IAAI,IAAW,CACzB/iB,QAAS/zB,EAAc,iBAAmB,cAC1CzuB,KAAM6lC,EACNrxC,MAAO,YAETs8D,gBAAiBriC,EAAc,qBAAuB,oBAElDgqE,EAAY,IAAI,KAAI,CACxBlzB,WAAY,IAAI,IAAW,CACzB/iB,QAAS/zB,EAAc,gBAAkB,aACzCzuB,KAAM6lC,EACNrxC,MAAO,WAETs8D,gBAAiBriC,EAAc,oBAAsB,mBAEjDs1C,GAAO,QAAkB,CAACy0B,EAAYC,IAAajkG,IACvD,MAAM+H,EAAqB,CAAC,CAACm8F,EAAexlG,WAAY,CAACylG,IAC5C,WAAVnkG,GAAoB+H,EAAEvD,UAEzBuD,EAAE,GAAG1P,SAASqG,GAAcA,EAAUmI,UAAU/Q,OAAO,UACvDiS,EAAE,GAAG1P,SAASqG,GAAcA,EAAUmI,UAAUxS,IAAI,UAEpDuzB,GAAU,IAGZ,IAAIksB,QAAmBxgD,KAAKiH,SAAS88B,gBAAgBgoC,QAAQ/rE,KAAK0mC,QAElE,MAAMoqE,EAA2D,CAACC,MAAO,IAKzE/wG,KAAK6R,eAAe9Q,IAAIygB,EAAA,EAAxBxhB,CAAmC,eAAqB0mC,GAAW,EAAD,gCAC7D1mC,KAAK0mC,SAAWA,IACjB8Z,QAAaxgD,KAAKiH,SAAS88B,gBAAgBgoC,QAAQ/rE,KAAK0mC,QACxDoqE,EAA2B,MAAE/rG,SAASqxB,GAAaA,MAEvD,MAEAyS,EAAQl2B,QAAQjH,OAAOuwE,GAEvB,MAAM20B,EAAiB,IAAI,IAAe,CAAC,GAGrCI,EAAU,IAAI,KAAI,CACtBjiG,MAAQ/O,KAAKqkC,SAAS4nC,gBAA0D9C,KAChFH,gBAAiBriC,EAAc,yBAA2B,sBAC1D1T,UAAW,MACT,OAAqBjzB,KAAKqkC,SAAS4nC,gBAA0D9C,OAC7F,EAAA15C,EAAA,IAAM,YAAY,cAAc,GAAM,EAExC5d,eAAgB7R,KAAK6R,iBAGjBo/F,GAAY,OAAO,qCAAsC,CAACl9F,KAAM,SAAUC,KAAM,gBAEtF,QAAiBi9F,GAAW,KAC1B,IAAI,IAAU,cAAe,CAC3Bp9F,QAAS,CAAC,CACR6mD,QAAS,eACTtkC,SAAU,KACR,MAAMvsB,GAAS,EAAAw4C,EAAA,GAAiB,CAAC4uD,IAAY,GAE7CjxG,KAAKiH,SAASi9B,kBAAkBgtE,kBAAkBlxG,KAAK0mC,QAAQ,GAAMp4B,MAAM66D,IACzEt/D,IACAmnG,EAAQjiG,MAAMgU,UAAYomD,CAAI,GAG9B,IAGN3O,aAAc,aACdC,mBAAoB,gBACnB5rC,MAAM,GACR,CAAChd,eAAgB7R,KAAK6R,iBAEzB++F,EAAej+F,QAAQjH,OAAOslG,EAAQ5lG,UAAW6lG,GAEjD,MAAME,EAAgB,IAAI,IAAe,CACvC79F,SAAS,EACTu1D,aAAa,IAGT+Y,EAAev2E,SAASC,cAAc,OAC5Cs2E,EAAaruE,UAAUxS,IAAI,iBAE3B,MAAMwC,EAAc,QAEd+wB,EAAW,KACf,MAAM22B,EAAWylD,EAAWjzB,WAAWp0C,SAAYu4B,IAAkBr+D,GAClE6tG,EAAevvC,mBAAqBuvC,EAAex8E,MAAMrhB,UAAUqB,SAAS,SAC/Ey8F,EAAS99F,UAAU1J,OAAO,aAAcohD,GAExC,MAAM,MAACt7B,GAASyhF,EACVzE,EAA6B,iCAAhBh9E,aAAK,EAALA,EAAO/tB,MAC1BwqG,EAAYO,EAAayE,EAAeE,gBAAartG,EAAU,EAG3DmtG,EAAiB,IAAI,IAAmB,CAC5CnmE,MAAO,oBACP/yB,KAAM,oBACN1I,WAAW,EACXqC,eAAgB7R,KAAK6R,eACrB+6F,cAAe,iBACfE,YAAa,eACbD,UAAW,aACXv4E,SAAUA,EACVtsB,OAAQhI,KAAK0mC,OAAOjQ,UAAS,GAC7B86E,KAAMhuG,GACLvD,KAAKiH,WAEF,YAACmlG,EAAalqG,QAASvB,IAAK,SAElCwwG,EAAc79F,QAAQ5H,OACpB/K,GACA,QAAKgmC,EAAc,+BAAiC,+BAGtD,MAAM6qE,EAAmB,IAAI,IAAiB,CAC5CxpG,OAAQhI,KAAK0mC,OAAOjQ,UAAS,GAC7B2J,KAAMogB,EACN3uC,eAAgB7R,KAAK6R,eACrB66F,mBAAoB0E,EACpBl6E,WAAYl3B,KAAKkzC,iBAAiBjwC,QAG9B4tG,EAAkBxlG,SAASC,cAAc,OAC/CulG,EAAgBnlG,OAAOylG,EAAc/lG,UAAWomG,EAAiBpmG,WAEjE,MAAMw2D,EAAgBr+D,IAAe,EAAAkuG,EAAA,GAAwBjxD,IAAyB,IAEtFohC,EAAal2E,OAAO0lG,EAAehmG,WACnC+lG,EAAcx+F,QAAQjH,OAAOk2E,GAE7B,MAAMyvB,GAAW,OAAa,CAACt9F,KAAM,QAASsH,UAAW,eACzDrb,KAAK2S,QAAQjH,OAAO2lG,IAEpB,QAAiBA,GAAU,IAAW,EAAD,gCACnC,MAAMrwE,EAAW2vE,EAAUlzB,WAAWp0C,QAAU+nE,EAAeE,WAAa,GAC5E,IAAItwE,EAAU,CACZ,MAAMwf,QAAaxgD,KAAKiH,SAAS88B,gBAAgBgoC,QAAQ/rE,KAAK0mC,QACxDgrE,GAAc,EAAAD,EAAA,GAAwBjxD,GACzCkxD,UACK,EAAAluD,EAAA,GAAkB,CACtBiX,mBAAoB9zB,EAAc,gDAAkD,8CACpF0sC,oBAAqB,CAACq+B,GACtBp7F,OAAQ,CACNokD,QAAS,Q,EAMS,OAAgB22C,GAC1CrxG,KAAKiH,SAAS88B,gBAAgB4tE,YAAY3xG,KAAK0mC,QAAQp4B,MAAMguF,GACvDt7D,EAGKhhC,KAAKiH,SAAS88B,gBAAgBkpE,eAAe3Q,EAAWt7D,GAFxDhhC,KAAKiH,SAAS88B,gBAAgB6tE,mBAAmBtV,KAIzDhuF,MAAK,KAENtO,KAAK4S,OAAO,GAEhB,KAAG,CAACf,eAAgB7R,KAAK6R,kBAExB+vD,IAAkBr+D,IAAe,EAAA0nE,EAAA,GAAuBzqB,GAAsB39C,OAAS8tG,EAAYD,GAAYjzB,WAAWp0C,SAAU,EACrI+nE,EAAervC,iBAAiBH,GAAe,GAE/C5hE,KAAKm0B,WAAWzoB,OAAOm9B,EAAQz9B,UAAWwlG,EAAexlG,UAAWylG,GAEpE,CACE,MAAMhoE,EAAU,IAAI,IAAe,CACjC3wB,KAAM,qBACN5E,QAASqzB,EAAc,mCAAqC,mCAGxDqE,EAAgB,IAAI,IAAc,CACtCh3B,KAAM,wBACN8uC,YAAY,IAGd9iD,KAAK6R,eAAe9Q,IAAIiqC,EAAcpW,MAAtC50B,CAA6C,UAAU,KACrD,MAAM6J,EAASmhC,EAAcqX,kBAAiB,GAC9CriD,KAAKiH,SAAS88B,gBAAgB8tE,iBAAiB7xG,KAAK0mC,OAAQsE,EAAc3B,SAAS/6B,MAAK,KACtFzE,GAAQ,GACR,IAGJ,MAAMioG,EAAe,KACnB9mE,EAAcyX,mBAAoBjC,EAAsB/yC,OAAOskG,WAAW,EAlKhD,EAAC37E,EAAsBx0B,EAAgB,WACnEkvG,EAAoBlvG,GAAMS,KAAK+zB,EAAS,EAoKxC47E,CAAsBF,GAEtBA,IAEAjpE,EAAQl2B,QAAQjH,OAAOs/B,EAAcC,OAErCjrC,KAAKm0B,WAAWzoB,OAAOm9B,EAAQz9B,U,CAEnC,G,0GCvOa,MAAM6mG,UAA8B,IAKpC57E,O,qCAIX,IAAI67E,EAHJlyG,KAAKoL,UAAUmI,UAAUxS,IAAI,sBAAuB,8BACpDf,KAAK2hF,SAAS,oBAId,CACE,MAAM94C,EAAU,IAAI,IAAe,CACjC3wB,KAAM,0BAGFkW,EAAM/iB,SAASC,cAAc,OACnC8iB,EAAI7a,UAAUxS,IAAI,sBAClB8nC,EAAQl2B,QAAQ4E,aAAa6W,EAAKya,EAAQ95B,OAE1C,MAAMskB,EAAOoI,EAAA,uBAAiC,CAACinD,KAAK,IACpDt0D,EAAI1iB,OAAO2nB,GAEX,MAAM,IAAC8M,GAAO1E,EAAA,qBAA+B,CAC3CzzB,OAAQhI,KAAK6pE,OAAOpzC,UAAS,GAC7BrrB,UAAWioB,EACXkQ,eAAe,EACfnO,WAAY,eAGd+K,EAAIU,gBAAgBn1B,QAAO,EAAAo3B,EAAA,SAA0B9iC,KAAKiH,SAASk6B,gBAAgBC,QAAQphC,KAAK6pE,UAEhG,MAAMlpE,EAAI,IAAIwxG,EAAgB,CAC5BzrE,OAAQ1mC,KAAK0mC,OACb70B,eAAgB7R,KAAK6R,eACrB03B,SAAUV,EAAQl2B,QAClBgxB,YAAoC,6BAAvB3jC,KAAK2jC,YAAY/zB,EAAmC5P,KAAK2jC,iBAAc1/B,GACnFjE,KAAKiH,UAERirG,EAAkB,KAEhB,MAAME,EAASzxG,EAAEokF,UACS,6BAAvB/kF,KAAK2jC,YAAY/zB,IAAoC,EAAAuqF,EAAA,GAAUn6F,KAAK2jC,YAAY0uE,cAAc5kG,OAAQ2kG,EAAO3kG,SAIhHzN,KAAKiH,SAAS88B,gBAAgBuuE,WAAWtyG,KAAK0mC,OAAQ1mC,KAAK2jC,YAAayuE,EAAO,EAGjFpyG,KAAKwlF,cAAc53E,iBAAiB,UAAWskG,EAAiB,CAACjkG,MAAM,IAEvEjO,KAAKm0B,WAAWzoB,OAAOm9B,EAAQz9B,U,CAGjC,CACE,MAAMy9B,EAAU,IAAI,IAAe,CAAC,GAEpC,GAA0B,6BAAvB7oC,KAAK2jC,YAAY/zB,EAAkC,CACpD,MAAM2iG,GAAqB,OAAO,qCAAsC,CAACx+F,KAAM,SAAUC,KAAM,4BAE/F,QAAiBu+F,GAAoB,KACnC,MAAM1oG,GAAS,EAAAw4C,EAAA,GAAiB,CAACkwD,IAAqB,GACtDvyG,KAAKiH,SAAS88B,gBAAgByuE,oCAAoCxyG,KAAK0mC,OAAQ1mC,KAAK2jC,aAAar1B,MAAK,KACpGtO,KAAKwlF,cAAc9zE,oBAAoB,UAAWwgG,GAClDlyG,KAAK4S,OAAO,IACX,KACD/I,GAAQ,GACR,GACD,CAACgI,eAAgB7R,KAAK6R,iBAEzBg3B,EAAQl2B,QAAQjH,OAAO6mG,E,CAGzB,MAAM1D,GAAY,OAAO,qCAAsC,CAAC96F,KAAM,aAAcC,KAAM,2BAE1F,QAAiB66F,GAAW,MACX,EAAAxsD,EAAA,GAAiB,CAACwsD,IAAY,GAC7C7uG,KAAKiH,SAAS88B,gBAAgB0uE,gBAAgBzyG,KAAK0mC,OAAQ1mC,KAAK2jC,aAAar1B,MAAK,KAChFtO,KAAKwlF,cAAc9zE,oBAAoB,UAAWwgG,GAClDlyG,KAAK4S,OAAO,GACZ,GAoBD,CAACf,eAAgB7R,KAAK6R,iBAEzBg3B,EAAQl2B,QAAQjH,OAAOmjG,GAEvB7uG,KAAKm0B,WAAWzoB,OAAOm9B,EAAQz9B,U,CAEnC,E,0kBC9FK,MAAM+mG,EASXpyG,YAAoB2xB,EAKTzqB,GALS,KAAAyqB,QAAAA,EAKT,KAAAzqB,SAAAA,EACTjH,KAAKmL,WACP,CAEaA,Y,yCACXnL,KAAK+qB,EAAI,CACP,CAACysE,MAAO,CAAC,iBAAkBxjF,KAAM,uBAAwB0+F,cAAe,0BACxE,CAAClb,MAAO,CAAC,cAAexjF,KAAM,4BAA6B0+F,cAAe,+BAC1E,CAAClb,MAAO,CAAC,gBAAiB,aAAcxjF,KAAM,+BAAgC0+F,cAAe,kCAC7F,CAAClb,MAAO,CAAC,cAAexjF,KAAM,4BAA6B0+F,cAAe,+BAC1E,CAAClb,MAAO,CAAC,eAAgBxjF,KAAM,6BAA8B0+F,cAAe,gCAC5E,CAAClb,MAAO,CAAC,gBAAiBxjF,KAAM,8BAA+B0+F,cAAe,iCAC9E,CAAClb,MAAO,CAAC,gBAAiBxjF,KAAM,8BAA+B0+F,cAAe,iCAC9E,CAAClb,MAAO,CAAC,eAAgBxjF,KAAM,6BAA8B0+F,cAAe,iCAG9E1yG,KAAK2yG,WAAa,CAChB,cAAiB,CAAC,aAAc,gBAAiB,aAAc,gBAGjE,MAAMjhF,EAAU1xB,KAAK0xB,QACf8uB,QAAaxgD,KAAKiH,SAAS88B,gBAAgBgoC,QAAQr6C,EAAQgV,QAC3DksE,EAAsBpyD,EAAKqyD,sBAC3BT,EAAS1gF,EAAQiS,YCzDZ,SAAwC6c,EAAoB4xD,GACzE,GAAG5xD,EAAKqyD,sBAAuB,CAC7BT,GAAS,EAAAhrE,EAAA,GAAKgrE,GACd,MAAMU,EAAgBtyD,EAAKqyD,sBAAsBplG,OACjD,IAAI,MAAMua,KAAK8qF,EAEbV,EAAO3kG,OAAOua,GAAK8qF,EAAc9qF,E,CAIrC,OAAOoqF,CACT,CD8CyCW,CAA+BvyD,EAAsB9uB,EAAQiS,YAAY0uE,eAAiBO,EAEzHI,EAA+BthF,EAAQiS,YAAc,2BAA6B,gCACxF,IAAI,MAAMyjC,KAAQpnE,KAAK+qB,EAAG,CACxB,MAAMkoF,EAAW7rC,EAAKowB,MAAM,GACtB54D,GAAM,QACVwoC,EAAKp8B,cAAgB,IAAI,IAAc,CACrCh3B,KAAMozD,EAAKpzD,KACXq1B,SAAS,EAAAzC,EAAA,GAAU4Z,EAAMyyD,EAAUb,GACnChwD,aAAa,EACbvwC,eAAgB6f,EAAQ7f,mBAK1B6f,EAAQiS,aACNivE,EAAoBnlG,OAAOwlG,KAE7B,EAAAhoC,EAAA,GAAuBzqB,GAAsB,KAEzC4mB,EAAKowB,MAAMziF,SAAS,iBACpBqyD,EAAKowB,MAAMziF,SAAS,mBAIxBqyD,EAAKp8B,cAAcpW,MAAMuf,UAAW,GAYpC,QAAiBizB,EAAKp8B,cAAcC,OAAQljC,KAC1C,EAAA0nB,EAAA,IAAM,YAAYujF,GAAiB,GAAM,GACxC,CAACnhG,eAAgB6f,EAAQ7f,kBAG3B7R,KAAK2yG,WAAWM,IACjBvhF,EAAQ7f,eAAe9Q,IAAIqmE,EAAKp8B,cAAcpW,MAA9ClD,CAAqD,UAAU,KACzD01C,EAAKp8B,cAAc3B,SACPrpC,KAAK+qB,EAAEgF,QAAQ/H,GAAMhoB,KAAK2yG,WAAWM,GAAUl+F,SAASiT,EAAEwvE,MAAM,MACxEzyF,SAASqiE,IACbA,EAAKp8B,cAAc3B,SAAU,CAAK,G,IAM1C3X,EAAQ6X,SAAS79B,OAAOkzB,EAAIxzB,U,CAEhC,G,CAEO25E,UACL,MAAMqtB,EAA2B,CAC/BxiG,EAAG,mBACHsjG,WAAY,WACZzlG,OAAQ,CAAC,GAGX,IAAI,MAAM25D,KAAQpnE,KAAK+qB,GACLq8C,EAAKp8B,cAAc3B,SAEjC+9B,EAAKowB,MAAMzyF,SAASslG,IAElB+H,EAAO3kG,OAAO48F,IAAQ,CAAI,IAKhC,OAAO+H,CACT,EAGa,MAAMe,UAA+B,IAGrC98E,O,yCAIX,IAAI+8E,EAHJpzG,KAAKoL,UAAUmI,UAAUxS,IAAI,sBAAuB,+BACpDf,KAAK2hF,SAAS,sBAGd,CACE,MAAM94C,EAAU,IAAI,IAAe,CACjC3wB,KAAM,6BAGRk7F,EAAkB,IAAIjB,EAAgB,CACpCzrE,OAAQ1mC,KAAK0mC,OACb70B,eAAgB7R,KAAK6R,eACrB03B,SAAUV,EAAQl2B,SACjB3S,KAAKiH,UAERjH,KAAKwlF,cAAc53E,iBAAiB,WAAW,KAC7C5N,KAAKiH,SAAS88B,gBAAgBsvE,4BAA4BrzG,KAAK0mC,OAAQ0sE,EAAgBruB,UAAU,GAChG,CAAC92E,MAAM,IAEVjO,KAAKm0B,WAAWzoB,OAAOm9B,EAAQz9B,U,CAGjC,CACE,MAAMy9B,EAAU,IAAI,IAAe,CACjC3wB,KAAM,sBAGFo7F,EAAkB,IAAI,KAAI,CAC9B94C,aAAc,sBACdwO,gBAAiB,UACjBj1D,KAAM,UACNkf,UAAW,KACT,IAAI,IAAc,CAChB+gD,UAAW,CAAC,uBACZvB,SAAWzqE,IACTtF,YAAW,KACT6wG,EAAgBvrG,EAAO,GACtB,EAAE,EAEPzE,YAAa,oCACbyE,QAAShI,KAAK0mC,QACd,EAEJ70B,eAAgB7R,KAAK6R,iBAGjB0hG,EAAwBvrG,GAAmB,kCAC/C,IAAI27B,EACJ,IACEA,QAAoB3jC,KAAKiH,SAASi9B,kBAAkBsvE,sBAAsBxzG,KAAK0mC,OAAQ1+B,E,CACvF,MAAMxC,GAEN,YADA,EAAAiqB,EAAA,IAAM,gC,CAIR,MAAMvc,EAAMlT,KAAK4kF,OAAOC,UAAUotB,GAClC/+F,EAAIywB,YAAcA,EAClBzwB,EAAIwzB,OAAS1mC,KAAK0mC,OAClBxzB,EAAI22D,OAAS7hE,EACbkL,EAAIwb,MACN,IAEAma,EAAQl2B,QAAQjH,OAAO4nG,EAAgBloG,WAWvC,MAAMo6B,EAAIqD,EAAQu4C,yBAClB57C,EAAEjyB,UAAUxS,IAAI,sBAEhB,MAAMsyB,EAAOoI,EAAA,uBAAiC,CAACinD,KAAK,IACpDl9C,EAAE95B,OAAO2nB,IAET,QAAiBA,GAAOtrB,IACtB,MAAM1H,GAAS,EAAAojC,EAAA,GAAU17B,EAAE1H,OAAQ,EAAAqjC,yBACnC,IAAIrjC,EAAQ,OAEZ,MAAM2H,EAAS3H,EAAO0pB,QAAQ/hB,OAAOyuB,WACrC88E,EAAgBvrG,EAAO,GACtB,CAAC6J,eAAgB7R,KAAK6R,iBAEzB,MAAM4hG,EAAc,CAAMtzE,EAAgBwD,IAA6D,kCACrG,MAAM+vE,EAAe/vE,EAAY0uE,cAC3BO,SAA8B5yG,KAAKiH,SAAS88B,gBAAgBgoC,QAAQ/rE,KAAK0mC,SAA0BmsE,sBAGnGc,EAA0B,GAChCP,EAAgBroF,EAAEhmB,SAASqiE,IACzB,MAAM6rC,EAAW7rC,EAAKowB,MAAM,GAEzBkc,EAAajmG,OAAOwlG,KAAcL,EAAoBnlG,OAAOwlG,IAC9DU,EAAStxG,KAAK+kE,EAAKsrC,c,IAOvB,MAAM9xG,EAAKu/B,EAAIU,gBAEZ8yE,EAAS9wG,QACVjC,EAAG+hC,oBAAmB,QAAKgxE,EAAS74F,KAAK8qB,IAAM,QAAKA,MAAK,IAK3DhlC,EAAG2S,UAAU1J,OAAO,QAAS8pG,EAAS9wG,OACxC,IAEM9B,EAAM,CAAC4iC,EAA0Dj4B,KACrE,MAAM,IAACy0B,GAAO1E,EAAA,qBAA+B,CAC3CzzB,QAAQ,EAAA4rG,EAAA,GAAUjwE,EAAYvD,MAC9Bh1B,UAAWioB,EACXkQ,eAAe,EACfnO,WAAY,aACZ1pB,WAGF+nG,EAAYtzE,EAAKwD,EAAY,EAgCzBkwE,EAAY,MAChB,EAAAhnF,EAAA,GAAeymF,EAAgBx0E,UAAU,QAAKg1E,EAAkB,8BAAgC,2BAA4B,CAACA,IAAkB,EAGjJ,IACIC,EADAD,EAAkB,EAEtB,MAAME,EAAY,KAEhBD,EAAS,IAAI,IAAiB,CAC5B5/E,WAAYn0B,KAAKm0B,WACjB8/E,WAAY,IACHj0G,KAAKiH,SAASi9B,kBAAkBC,uBAAuBnkC,KAAK0mC,OAAQ,CAAC92B,EAAG,4BAA6Bg7B,EAAG,IAJhG,GAIiHvX,EAAKE,mBAAmBjlB,MAAM0mB,IAC5J,IAAI,MAAM2O,KAAe3O,EAAIuL,aAC3Bx/B,EAAI4iC,GAA4D,GAMlE,OAHAmwE,EAAkB9+E,EAAIC,MACtB4+E,IAEO7+E,EAAIuL,aAAa19B,OAZX,IAYkCmyB,EAAIC,QAAU5B,EAAKE,iBAAiB,MAKlFwgF,EAAOnxG,QAGhB5C,KAAKm0B,WAAWzoB,OAAOm9B,EAAQz9B,kBAEtBpL,KAAKiH,SAAS88B,gBAAgBC,UAAUhkC,KAAK0mC,eAC9CstE,KAENH,IAEA7zG,KAAK6R,eAAe9Q,IAAIygB,EAAA,EAAxBxhB,CAAmC,kBAAkB,EAAEk0G,cAAaC,gBAC/Dn0G,KAAK0mC,SAAWwtE,IACjBl0G,KAAK0mC,OAASytE,EACdH,I,KAKV,G,CAEAzsB,qBACEvnF,KAAKm0B,WAAWsG,UAClB,E,sUE9Ua,MAAM25E,UAA4B,IAGlC/9E,O,+CACXr2B,KAAK2hF,SAAS,aAEd,MAAM6N,QAA2BxvF,KAAKiH,SAASmoF,oBAAoBilB,8BAC7DhwE,QAAiBrkC,KAAKiH,SAASi9B,kBAAkBE,YAAYpkC,KAAK0mC,QAClEC,QAAoB3mC,KAAKiH,SAAS88B,gBAAgB4C,YAAY3mC,KAAK0mC,QAEzE,IAAI4tE,EAA6C,QAA5B,EAAAjwE,EAASkwE,2BAAmB,QAAI,CAAC3kG,EAAG,qBACrD4kG,EAAgBF,EAChBjkD,EAAY,IAAIjvD,IAAyB,sBAArBkzG,EAAe1kG,EAA4B0kG,EAAeG,UAAU35F,KAAK20E,GAAcA,EAAoCK,WAAY,IAE/J,MAAM4kB,EAA6BrkD,GAAyCA,EAAUv1C,KAAKg1E,IAAa,CAAElgF,EAAG,gBAAiBkgF,eAExH6kB,EAAwB,IACzBhuE,EACM,6BAGkB,qBAApB6tE,EAAc5kG,EAA2B,yBAAgD,sBAApB4kG,EAAc5kG,EAA4B,uBAAyB,0BAG3IglG,EAAgB,IAAI,IAAe,CACvC18F,KAAMyuB,OAAc1iC,EAAY,qBAChCqP,QAASqhG,MAGLE,EAAmB,IAAI,IAAe,CAC1C38F,KAAM,2BAGF48F,EAAkC,K,MACtC,MAAM5sF,EAAiG,QAAlE,EAAAssF,EAAkDC,iBAAgB,QAAI,GAC3GpkD,EAAY,IAAIjvD,IAAI8mB,EAAEpN,KAAI,EAAEg1E,cAAcA,KAC1CilB,EAAyBhwG,SAAQ,CAACimC,EAAe8kD,KAC/C9kD,EAAcyX,iBAAiB4N,EAAUhtD,IAAIysF,GAAU,GACvD,EAGJ,IAAIklB,EACJ,GAAGruE,EAAa,CACdquE,EAAsB,IAAI,IAAc,CAACnrG,QAAQ,EAAMw/B,QAA8B,sBAArBirE,EAAe1kG,IAC/E,MAAMqlG,EAAY,IAAI,KAAI,CACxBjqE,cAAegqE,EACfx6C,aAAc,kBACd3oD,eAAgB7R,KAAK6R,iBAGvB+iG,EAAcjiG,QAAQjH,OAAOupG,EAAU7pG,WAEvCpL,KAAK6R,eAAe9Q,IAAIi0G,EAAoBpgF,MAA5C50B,CAAmD,UAAU,KAC3D,IAAIk1G,GAAO,EACPF,EAAoB3rE,QAEd8rE,EAAeC,OAAOpqE,IAAmBA,EAAc3B,UAC/DmrE,EAAgB,CAAC5kG,EAAG,oBAAqB6kG,UAAWC,EAA0BllB,EAAmB10E,KAAI,EAAE20E,cAAcA,MACzF,sBAApB+kB,EAAc5kG,EACtB4kG,EAAgB,CAAC5kG,EAAG,oBAAqB6kG,UAAWC,EAA0Bx7F,MAAMC,KAAKk3C,KAEzF6kD,GAAO,EANPV,EAAgB,CAAC5kG,EAAG,qBASnBslG,IACDJ,IACAO,I,QAGC,CACL,MAAM5gG,EAAyC,CAC7C,CAAC,mBAAoB,gBACrB,CAAC,oBAAqB,iBACtB,CAAC,oBAAqB,gBAGlB6f,EAAW,KACfugF,EAAiBzpG,UAAUmI,UAAU1J,OAAO,OAA4B,sBAApB2qG,EAAc5kG,EAA0B,EAG9F,IAAIlD,EAAQ4nG,EAAe1kG,EAC3B,MAAMqsE,GAAO,QAAoBxnE,EAAEqG,KAAI,EAAEpO,EAAOgjB,MACvC,CACLA,cACAhjB,QACA28B,QAASirE,EAAe1kG,IAAMlD,OAE7Bu5C,IACHv5C,EAAQu5C,EAGNuuD,EADW,qBAAV9nG,EACe,CACdkD,EAAGlD,EACHe,OAAQ,CACN6nG,cAAc,IAGA,sBAAV5oG,EACQ,CACdkD,EAAGlD,GAGW,CACdkD,EAAGlD,EACH+nG,UAAWC,EAA0B,CAAC,KAAM,SAIhD,EAAA7nF,EAAA,GAAe+nF,EAActhG,SAAS,QAAKqhG,MAC3CG,IACAO,IACA/gF,GAAU,IAGZsgF,EAAcjiG,QAAQjH,OAAOuwE,GAC7B3nD,G,CAGF,MAAMygF,EAAuD,IAAIxzG,IAC3D4zG,EAAiB3lB,EAAmB10E,KAAK60E,IAC7C,MAAMG,EAAWH,EAAkBF,SAC7BzkD,EAAgB,IAAI,IAAc,CACtCnhC,QAAQ,EACRw/B,QAASgnB,EAAUhtD,IAAIysF,KAGzBilB,EAAyBnxG,IAAIksF,EAAU9kD,GAEvChrC,KAAK6R,eAAe9Q,IAAIiqC,EAAcpW,MAAtC50B,CAA6C,UAAU,KAClDgrC,EAAc3B,SACfgnB,EAAUtvD,IAAI+uF,GAEXklB,IAAwBA,EAAoB3rE,UAC7C2rE,EAAoB3rE,SAAU,KAGhCgnB,EAAUpvD,OAAO6uF,IAEdklB,aAAmB,EAAnBA,EAAqB3rE,WAAYgnB,EAAUxoD,OAC5CmtG,EAAoB3rE,SAAU,IAIlCgsE,GAAwB,IAG1B,MAAMz2E,EAAM,IAAI,KAAI,CAClBoM,gBACAj8B,MAAO4gF,EAAkB5gF,MACzBgwB,aAAa,EACbltB,eAAgB7R,KAAK6R,iBAWvB,OARA,OAAiB,CACf+sB,MACAj9B,IAAKguF,EAAkBC,YACvB/nF,KAAM,UAGRgtG,EAAiBliG,QAAQjH,OAAOkzB,EAAIxzB,WAE7B4/B,CAAa,IAGhBuqE,EAAgB,IAAW,kCAC/BF,EAAuB5hG,eAMA,sBAApB+gG,EAAc5kG,IACf4kG,EAAcC,UAAYC,EAA0Bx7F,MAAMC,KAAKk3C,KAQjErwD,KAAKiH,SAAS88B,gBAAgByxE,0BAA0Bx1G,KAAK0mC,OAAQ8tE,GACrEF,EAAiBE,CACnB,IAEMa,GAAyB,EAAA57F,EAAA,GAAS87F,EAAe,KAAM,GAAO,GAEpEv1G,KAAKwlF,cAAc53E,iBAAiB,WAAW,KAC1CynG,EAAuBI,eACxBF,G,GAED,CAACtnG,MAAM,IAEVjO,KAAKm0B,WAAWzoB,OAAOkpG,EAAcxpG,UAAWypG,EAAiBzpG,U,+SCrLtD,MAAMsqG,UAAuB,IAM1BC,Q,yCAEd31G,KAAK6R,eAAeC,YACpB9R,KAAKm0B,WAAW/oB,UAAUu3B,kBAE1B3iC,KAAKoL,UAAUmI,UAAUxS,IAAI,sBAAuB,wBACpDf,KAAK2hF,SAAS,QAEd,IACEt9C,EACAmc,EACA7Z,EACA3C,EACA4xE,EACAC,EACAC,EACAx/B,SACQjxD,QAAQqH,IAAI,CACpB1sB,KAAKiH,SAASi9B,kBAAkBE,YAAYpkC,KAAK0mC,QAAQ,GACzD1mC,KAAKiH,SAAS88B,gBAAgBgoC,QAAQ/rE,KAAK0mC,QAC3C1mC,KAAKiH,SAAS88B,gBAAgB4C,YAAY3mC,KAAK0mC,QAC/C1mC,KAAKiH,SAAS88B,gBAAgBC,UAAUhkC,KAAK0mC,QAC7C1mC,KAAKiH,SAAS88B,gBAAgB6C,UAAU5mC,KAAK0mC,OAAQ,eACrD1mC,KAAKiH,SAAS88B,gBAAgB6C,UAAU5mC,KAAK0mC,OAAQ,sBACrD1mC,KAAKiH,SAAS88B,gBAAgB6C,UAAU5mC,KAAK0mC,OAAQ,iBACrD1mC,KAAKiH,SAAS4zD,WAAWuxB,iBAG3B,MAAM0kB,EAAoE,CAACj0E,KAAM,GAAIk0E,MAAO,IACtFiB,EAAwB,CAAC57E,EAAsBx0B,EAAyB,WAC5EkvG,EAAoBlvG,GAAMS,KAAK+zB,EAAS,EAG1Cp2B,KAAK6R,eAAe9Q,IAAIygB,EAAA,EAAxBxhB,CAAmC,eAAqB0mC,GAAW,kCAC9D1mC,KAAK0mC,SAAWA,IACjB8Z,QAAaxgD,KAAKiH,SAAS88B,gBAAgBgoC,QAAQ/rE,KAAK0mC,QACxDoqE,EAA2B,MAAE/rG,SAASqxB,GAAaA,MAEvD,MAEAp2B,KAAK6R,eAAe9Q,IAAIygB,EAAA,EAAxBxhB,CAAmC,oBAA0B0mC,GAAW,kCACnE1mC,KAAK0mC,SAAWA,IACjBrC,SAAiBrkC,KAAKiH,SAASi9B,kBAAkB6xE,kBAAkBrvE,KAAWrC,EAC9EysE,EAA0B,KAAE/rG,SAASqxB,GAAaA,MAEtD,MAEA,MAAMpuB,EAAShI,KAAK0mC,OAAOjQ,UAAS,GAEpC,CACE,MAAMoS,EAAU,IAAI,IAAe,CAACggC,aAAa,EAAMv1D,SAAS,IAC1D80C,EAA4B,GAE5Bw5B,EAAev2E,SAASC,cAAc,OAgC5C,GA/BAs2E,EAAaruE,UAAUxS,IAAI,iBAE3Bf,KAAKg2G,mBAAqB,IAAI,KAAW,CACvC/qE,MAAOtE,EAAc,mBAAqB,yBAC1CzuB,KAAM,YACNsoD,UAAW,IACXlY,UAAU,IAEZtoD,KAAKi2G,sBAAwB,IAAI,KAAW,CAC1ChrE,MAAO,yBACP/yB,KAAM,mBACNsoD,UAAW,MAGbxgE,KAAKg2G,mBAAmBj0C,iBAAiBvhB,EAAKzxC,OAC9C/O,KAAKi2G,sBAAsBl0C,iBAAiB19B,EAASynC,OAErD8V,EAAal2E,OAAO1L,KAAKg2G,mBAAmB5qG,UAAWpL,KAAKi2G,sBAAsB7qG,WAElFg9C,EAAY/lD,KAAKrC,KAAKg2G,mBAAoBh2G,KAAKi2G,uBAE/Cj2G,KAAK48F,SAAW,IAAI,IAAS,CAC3B50F,SACAogD,cACAv2C,eAAgB7R,KAAK6R,eACrBi3C,aAAc,CAACjiB,QAAU2Z,EAAsB/yC,OAAO0tE,SAExDn7E,KAAK2S,QAAQjH,OAAO1L,KAAK48F,SAASp0C,SAElC3f,EAAQl2B,QAAQjH,OAAO1L,KAAK48F,SAASh0C,WAAWx9C,UAAWw2E,GAExDg0B,EAAe,CAChB,MAAMM,EAAc,IAAI,KAAI,CAC1B17C,aAAc7zB,EAAc,cAAgB,YAC5C1T,UAAW,KACT,MAAM/f,EAAMlT,KAAK4kF,OAAOC,UAAU4rB,GAClCv9F,EAAIwzB,OAAS1mC,KAAK0mC,OAClBxzB,EAAImxB,SAAWA,EACfnxB,EAAIwb,MAAM,EAEZ3a,KAAM,OACNlC,eAAgB7R,KAAK6R,iBAGjBskG,EAAsB,KAC1B,IAAI3pG,EACJ,MAAMw0B,GAAW,EAAAiqC,EAAA,GAAuBzqB,GAAsB,GAE5Dh0C,EADCm6B,EACK3F,EAAW,aAAe,cAE1BA,EAAW,kBAAoB,mBAGvCk1E,EAAYp3E,SAAS6D,iBAAgB,QAAKn2B,GAAK,EAGjD2pG,IACAnE,EAAsBmE,GACtBttE,EAAQl2B,QAAQjH,OAAOwqG,EAAY9qG,U,CAGrC,GAAGwqG,GAAiBC,EAAsB,CACxC,MAAMliB,EAAe,IAAI,KAAI,CAC3Bn5B,aAAc,YACdzmD,KAAM,YACNkf,UAAW,KACT,MAAM/f,EAAMlT,KAAK4kF,OAAOC,UAAUuvB,GAClClhG,EAAIwzB,OAAS1mC,KAAK0mC,OAClBxzB,EAAIwb,MAAM,EAEZ7c,eAAgB7R,KAAK6R,iBAIjBukG,SAD2Bp2G,KAAKiH,SAASmoF,oBAAoBE,yBACfv/D,QAAQ4/D,IAAuBA,EAAkBliF,OAAOiiF,WAAU7sF,OAChHwzG,EAAqB,K,MACzB,MAAMC,EAAqD,QAA5B,EAAAjyE,EAASkwE,2BAAmB,QAAI,CAAC3kG,EAAG,qBACnE,GAAgC,sBAA7B0mG,EAAuB1mG,EAA2B,CACnD,MAAM/M,EAASyzG,EAAuB7B,UAAU5xG,OAC7CA,IAAWuzG,GACZ,EAAAvpF,EAAA,GAAe8mE,EAAa70D,UAAU,QAAK,iBAE3C60D,EAAa70D,SAASlmB,YAAc/V,EAAS,IAAMuzG,C,MAGrD,EAAAvpF,EAAA,GAAe8mE,EAAa70D,UAAU,QAAkC,qBAA7Bw3E,EAAuB1mG,EAA2B,eAAiB,qB,EAIlHymG,IACArE,EAAsBqE,EAAoB,QAC1CxtE,EAAQl2B,QAAQjH,OAAOioF,EAAavoF,U,CAGtC,GAAGyqG,IAAyBlvE,EAAa,CACvC,MAAM6wD,EAAQ,CACZ,gBACA,aACA,gBACA,aACA,cACA,eACA,eACA,eAGI+e,EAAiB,IAAI,KAAI,CAC7B/7C,aAAc,qBACdvnC,UAAW,KACT,MAAM/f,EAAMlT,KAAK4kF,OAAOC,UAAUsuB,GAClCjgG,EAAIwzB,OAAS1mC,KAAK0mC,OAClBxzB,EAAIwb,MAAM,EAEZ3a,KAAM,cACNlC,eAAgB7R,KAAK6R,iBAGjB2kG,EAAuB,KAC3BD,EAAez3E,SAASlmB,YAAc4+E,EAAM97C,QAAO,CAACC,EAAKrT,IAAMqT,KAAO,EAAA/U,EAAA,GAAU4Z,EAAMlY,EAAIkY,EAAmBqyD,wBAAwB,GAAK,IAAMrb,EAAM30F,MAAM,EAG9J2zG,IACAxE,EAAsBwE,GACtB3tE,EAAQl2B,QAAQjH,OAAO6qG,EAAenrG,U,CAGxC,GAAG0qG,IAAoBt1D,EAAKlgB,oBAAsBg2C,EAAUmgC,gCAAmCj2D,EAAsB/yC,OAAO0tE,SAAWx0C,EAAa,CAClJ,MAAM+vE,EAAY,IAAI,KAAI,CACxB1rE,cAAe,IAAI,IAAc,CAACnhC,QAAQ,IAC1C2wD,aAAc,SACdvnC,UAAW,OACXlf,KAAM,SACNlC,eAAgB7R,KAAK6R,iBAGjB8kG,EAAY,KAChB,MAAM9vE,IAAa2Z,EAAsB/yC,OAAO0tE,MAChDn7E,KAAK48F,SAASl0C,WAAWzvC,cAAc1F,UAAU1J,OAAO,WAAYg9B,GACpE6vE,EAAU1rE,cAAcyX,iBAAiB5b,EAAQ,EAGnD7mC,KAAK6R,eAAe9Q,IAAI21G,EAAU1rE,cAAcpW,MAAhD50B,CAAuD,UAAW+H,IAChE,IAAIA,EAAE0B,UACJ,OAGF,MAAM8E,EAAUvO,KAAKiH,SAAS88B,gBAAgB6yE,YAAY52G,KAAK0mC,OAAQgwE,EAAU1rE,cAAc3B,SAC/FqtE,EAAU73B,mBAAmBtwE,EAAQ,IAGvCooG,IACA3E,EAAsB2E,GAEtB9tE,EAAQv1B,QAAQqvB,iBAAgB,QAAK,2BACrCkG,EAAQl2B,QAAQjH,OAAOgrG,EAAUtrG,U,CA+DnC,GA5DAy9B,EAAQv1B,QAAQC,UAAU1J,OAAO,QAASg/B,EAAQv1B,QAAQigB,mBAW1DvzB,KAAKm0B,WAAWzoB,OAAOm9B,EAAQz9B,YAE/B,QAAiBpL,KAAK48F,SAASp0C,SAAS,KACtCxoD,KAAK48F,SAASp0C,QAAQrU,UAAW,EAEjC,MAAMpY,EAA2B,GAE3Bn0B,EAAK5H,KAAK0mC,OACb1mC,KAAKg2G,mBAAmBn0C,mBACzB9lC,EAAS15B,KAAKrC,KAAKiH,SAAS88B,gBAAgB8yE,UAAUjvG,EAAI5H,KAAKg2G,mBAAmBtpG,QAGjF1M,KAAKi2G,sBAAsBp0C,mBAC5B9lC,EAAS15B,KAAKrC,KAAKiH,SAAS88B,gBAAgB+yE,UAAUlvG,EAAI5H,KAAKi2G,sBAAsBvpG,QAGpF1M,KAAK48F,SAAS50C,cACfjsB,EAAS15B,KAAKrC,KAAK48F,SAAS50C,eAAe15C,MAAM+zE,GACxCriF,KAAKiH,SAAS88B,gBAAgBu+C,UAAU16E,EAAIy6E,MAIvDh9D,QAAQ+1C,KAAKr/B,GAAU5jB,SAAQ,KAC7BnY,KAAK48F,SAASp0C,QAAQ2C,gBAAgB,YACtCnrD,KAAK4S,OAAO,GACZ,GACD,CAACf,eAAgB7R,KAAK6R,iBAuBtB80B,UAAqB3mC,KAAKiH,SAAS88B,gBAAgB6C,UAAU5mC,KAAK0mC,OAAQ,gBAAgB,CAC3F,MAAMqwE,EAA4B,IAAI,IAAc,CAClD/iG,KAAM,sBACNq1B,UAAYmX,EAAsB/yC,OAAOupG,aAG3Ch3G,KAAK6R,eAAe9Q,IAAIg2G,EAA0BniF,MAAlD50B,CAAyD,UAAU,KACjE,MAAM6J,EAASktG,EAA0B10D,kBAAiB,GAC1DriD,KAAKiH,SAAS88B,gBAAgBkzE,iBAAiBj3G,KAAK0mC,OAAQqwE,EAA0B1tE,SAAS/6B,MAAK,KAClGzE,GAAQ,GACR,IAGJmoG,GAAsB,KACpB+E,EAA0Bt0D,mBAAoBjC,EAAsB/yC,OAAOupG,WAAW,IAGxFnuE,EAAQl2B,QAAQjH,QAAO,QAA2BqrG,GAA2B3rG,U,EAIjF,IAAIu7B,EAAa,CACf,MAAMkC,EAAU,IAAI,IAAe,CAAC,GAcpC,IAAIlC,GAAeivE,EAAe,CAChC,MAAMsB,EAA+B,IAAI,IAAc,CACrDljG,KAAM,gBAGRhU,KAAK6R,eAAe9Q,IAAIm2G,EAA6BtiF,MAArD50B,CAA4D,UAAU,KACpE,MAAM6J,EAASqtG,EAA6B70D,kBAAiB,GAC7DriD,KAAKiH,SAAS88B,gBAAgBozE,uBAAuBn3G,KAAK0mC,QAASwwE,EAA6B7tE,SAAS/6B,MAAK,KAC5GzE,GAAQ,GACR,IAIJ,MAAMioG,EAAe,KACnBoF,EAA6Bz0D,iBAAiBze,IAAeK,EAAkC52B,OAAO2pG,kBAAkB,EAG1HtF,IACAE,EAAsBF,GAEtBjpE,EAAQl2B,QAAQjH,QAAO,QAA2BwrG,GAA8B9rG,U,CAG/Ey9B,EAAQl2B,QAAQ4gB,mBACjBvzB,KAAKm0B,WAAWzoB,OAAOm9B,EAAQz9B,U,CAInC,SAASpL,KAAKiH,SAAS88B,gBAAgB6C,UAAU5mC,KAAK0mC,OAAQ,eAAgB,CAC5E,MAAMmC,EAAU,IAAI,IAAe,CAAC,GAE9BgmE,GAAY,OAAO,qCAAsC,CAAC96F,KAAM,SAAUC,KAAM2yB,EAAc,yBAA2B,yBAE/H,QAAiBkoE,GAAW,KAC1B,IAAI,IAAkB7mG,OAAwB/D,GAAYsK,IACxD,MAAM1E,GAAS,EAAAw4C,EAAA,GAAiB,CAACwsD,IAAY,GAC7CtgG,EAAQD,MAAK,KACXtO,KAAK4S,OAAO,IACX,KACD/I,GAAQ,GACR,GACF,GACD,CAACgI,eAAgB7R,KAAK6R,iBAEzBg3B,EAAQl2B,QAAQjH,OAAOmjG,GAEvB7uG,KAAKm0B,WAAWzoB,OAAOm9B,EAAQz9B,U,CAG7B44B,GAEFhkC,KAAK6R,eAAe9Q,IAAIygB,EAAA,EAAxBxhB,CAAmC,kBAAkB,EAAEk0G,cAAaC,gBAC/DnsG,IAAWksG,IACZl0G,KAAK0mC,OAASytE,EAAUpzE,WACxB/gC,KAAK21G,Q,GAIb,G,CAEOt/E,OACL,OAAOr2B,KAAK21G,OACd,E,sXCnXF,MAAM0B,GAIF,CAAC,EAGU,MAAMC,WAA0B,IAetCjhF,OAGLr2B,KAAKoL,UAAUmI,UAAUxS,IAAI,yBAA0B,qBAGvD,MAAMw2G,GAAc,OAAO,gCAAiC,CAACh1F,UAAU,IACvEviB,KAAKw3G,SAAS1qF,YAAYyqF,GAC1Bv3G,KAAKw3G,SAAWD,EAEhB,MAAME,EAAoBpsG,SAASC,cAAc,OACjDmsG,EAAkBlkG,UAAUxS,IAAI,uBAChCw2G,EAAY7rG,OAAO+rG,GAEhBz3G,KAAK4mF,SACN6wB,EAAkBlkG,UAAUxS,IAAI,cAGlC,MAAM22G,EAAsBrsG,SAASC,cAAc,OACnDosG,EAAoBr8F,UAAY,wBAEhC,MAAMs8F,EAAsBtsG,SAASC,cAAc,OACnDqsG,EAAoBpkG,UAAUxS,IAAI,mBAElCf,KAAK43G,UAAY,IAAI,iBACrB53G,KAAK+O,MAAMrD,OAAO1L,KAAK43G,UAAU11G,SACjClC,KAAK63G,SAAU,QAAW,QAG1BF,EAAoBjsG,OAAO1L,KAAK+O,MAAO/O,KAAK63G,SAE5C,MAAMC,EAAqBzsG,SAASC,cAAc,OAClDwsG,EAAmBvkG,UAAUxS,IAAI,mBAEjC,MAAMg3G,EAA2B/3G,KAAK+O,MAAM0d,YAC5CsrF,EAAYrsG,QAAO,QAAK,yBAExBosG,EAAmBpsG,OAAOqsG,GAE1BL,EAAoBhsG,OAAOisG,EAAqBG,GAEhD93G,KAAKsrD,OAAO5/C,OAAOgsG,GAInB13G,KAAKk7F,QAAU,IAAI,KAAYl7F,KAAKiH,SAAUjH,KAAKm0B,WAAYn0B,KAAK6R,gBACpE7R,KAAKk7F,QAAQ7kE,OAEbr2B,KAAKm0B,WAAWzoB,OAAO1L,KAAKk7F,QAAQh5F,SAGpClC,KAAKm0B,WAAWxgB,mBAAqB,KACnC,MAAM2S,EAAOtmB,KAAKw1B,YAAY+C,IAAI7a,wBAClC,IAAI4I,EAAKY,MAAO,OAEhB,MAAMlC,EAAMsB,EAAKtB,IAAM,EACvBgzF,EAAiBhzF,GANG,GAMkB,EAGxC,MAAMgzF,EAAoBC,IACxBR,EAAkBlkG,UAAU1J,OAAO,aAAc7J,KAAK4mF,SAAWqxB,GACjEj4G,KAAKw1B,YAAYpqB,UAAUmI,UAAU1J,OAAO,mBAAoBouG,GAChE7W,GAAY6W,GAERA,GACFj4G,KAAKw1B,YAAYsR,sB,EAIfs6D,GAAa,OAAiB,CAClCzuF,QAAS+kG,EACT91G,KAAM,aACN46D,eAAgB,IAChB07C,SAAS,IAGX9W,EAAW,IAEX,QAAiBphG,KAAKw3G,UAAWzvG,IAC5Bq5F,EAAWnoE,UACZj5B,KAAKm0B,WAAW2F,kBAAkB,CAChC53B,QAASlC,KAAKm0B,WAAW/oB,UAAUmK,kBACnCwkB,SAAU,UAEZqnE,EAAW,GAEPphG,KAAK4mF,SACP6wB,EAAkBlkG,UAAU/Q,OAAO,eAE5BxC,KAAKm0B,WAAWurD,4BACzB1/E,KAAK4kF,OAAOuzB,iB,GAEb,CAACtmG,eAAgB7R,KAAK6R,kBAEzB,QAAiB7R,KAAK63G,SAAS,IAAW,mCACxC,IAAI3kG,EACJ,MAAM,OAAClL,EAAM,SAAEiL,GAAYjT,KAEzBkT,EADCD,UAAkBjT,KAAKiH,SAASqI,gBAAgBu3B,QAAQ7+B,IACnDhI,KAAK4kF,OAAOC,UAAU,MACpB78E,EAAO67B,YACT7jC,KAAK4kF,OAAOC,UAAU6wB,GAEtB11G,KAAK4kF,OAAOC,UAAU,MAG3B3xE,IACEA,aAAe,KAChBA,EAAIwb,KAAK1mB,EAAQhI,KAAKiT,WAEnBC,aAAewiG,EAChBxiG,EAAIwzB,OAAS1+B,EAAO+4B,WAEpB7tB,EAAIlL,OAASA,EAGfkL,EAAIwb,QAGV,KAAG,CAAC7c,eAAgB7R,KAAK6R,iBAEzB7R,KAAK6R,eAAe9Q,IAAIygB,EAAA,EAAxBxhB,CAAmC,mBAAoB6pE,IAClD7pE,KAAKgI,SAAW6hE,GACjB7pE,KAAKo4G,e,IAITp4G,KAAK6R,eAAe9Q,IAAIygB,EAAA,EAAxBxhB,CAAmC,eAAgB0mC,IAC9C1mC,KAAKgI,SAAW0+B,EAAOjQ,UAAS,IACjCz2B,KAAKo4G,e,IAITp4G,KAAK6R,eAAe9Q,IAAIygB,EAAA,EAAxBxhB,CAAmC,uBAAwBmI,IACzDnI,KAAKq4G,iBAAiBlwG,EAAQ,IAGhCnI,KAAK6R,eAAe9Q,IAAIygB,EAAA,EAAxBxhB,CAAmC,kBAAkB,EAAEgI,SAAQswG,WAC7Dt4G,KAAKu4G,sBAAsBvwG,EAAQkR,MAAMC,KAAKm/F,GAAM,IAItDt4G,KAAK6R,eAAe9Q,IAAIygB,EAAA,EAAxBxhB,CAAmC,gBAAgB,EAAEmI,cACnDnI,KAAKq4G,iBAAiBlwG,EAAQ,IAKhCnI,KAAKw1B,YAAc,IAAI,IAAe,CACpCkD,UAAW,CAAC,CACVtmB,YAAa,2BACb8F,KAAM,oBACNtW,KAAM,WACL,CACDwQ,YAAa,gCACb8F,KAAM,kBACNtW,KAAM,SACL,CACDwQ,YAAa,8BACb8F,KAAM,kBACNtW,KAAM,SACL,CACDwQ,YAAa,yBACb8F,KAAM,kBACNtW,KAAM,SACL,CACDwQ,YAAa,2BACb8F,KAAM,kBACNtW,KAAM,SACL,CACDwQ,YAAa,gCACb8F,KAAM,kBACNtW,KAAM,UAERuyB,WAAYn0B,KAAKm0B,WACjBgG,YAAc1B,IACZ,MAAM9e,EAA4B,YAAlB8e,EAAS72B,MAAsB4f,EAAA,6BAAuC,IAAM,EAC5F9e,YAAW,KACT81G,EAAcjlG,UAAU1J,OAAO,YAA+B,YAAlB4uB,EAAS72B,KAAmB,GACvE+X,EAAQ,EAEb1S,SAAUjH,KAAKiH,WAGjBjH,KAAKw1B,YAAYyE,oBAAsB,KACrC+9E,GAAiB,EAAK,EAGxBh4G,KAAKk7F,QAAQh5F,QAAQwJ,OAAO1L,KAAKw1B,YAAYpqB,WAE7C,MAAMotG,GAAgB,OAAa,CAACzkG,KAAM,qBAC1C/T,KAAK2S,QAAQjH,OAAO8sG,IAEpB,QAAiBA,GAAe,IAAW,mCACzC,MAAMxwG,EAAShI,KAAKgI,OACdJ,EAAK5H,KAAKgI,OAAO+4B,WACjBiD,QAAkBhkC,KAAKiH,SAAS88B,gBAAgBC,UAAUp8B,GAE1D6wG,EAAmB,CAAChwE,EAAmBrS,KAC3C,IAAIokC,EAA2B4Y,EAC7B3Y,EAAiC4Y,EACjC5vB,EAEF,GAAGhb,EAAQ5lC,OAAS,EAClB23D,EAAe,uBACf4Y,EAAgB,EAAC,QAAK,UAAW,CAAC3qC,EAAQ5lC,UAC1C43D,EAAqB,2BACrB4Y,EAAsB5qC,EAAQ3tB,KAAK9S,IACjC,MAAMioB,EAAI5kB,SAASC,cAAc,KAEjC,OADA2kB,EAAEvkB,OAAO,IAAI,IAAU,CAAC1D,WAAS9F,SAC1B+tB,CAAC,IAGN+T,IACFyf,EAAa,CAAC,CACZzvC,KAAM,4BACNq1B,SAAS,SAGR,CACLmxB,EAAe,yBACfC,EAAqB,2BACrB,MAAMxqC,EAAI5kB,SAASC,cAAc,KACjC2kB,EAAEvkB,OAAO,IAAI,IAAU,CACrB1D,OAAQygC,EAAQ,KACfvmC,SACHmxE,EAAsB,CAACpjD,GAEnB+T,IACFyf,EAAa,CAAC,CACZzvC,KAAM,8BACNygC,SAAU,CAAC,IAAI,IAAU,CAACzsC,OAAQygC,EAAQ,KAAKvmC,SAC/CmnC,SAAS,I,CAKfgqC,EAAoBhxE,KAAK,IAAI,IAAU,CACrC2F,WACC9F,SAEH,IAAI,IAAU,oBAAqB,CACjC8F,SACAwyD,eACAC,qBACA4Y,sBACAx/D,QAAS,CAAC,CACR6mD,QAAS,MACTtkC,aAEFqtB,eACC50B,MAAM,EAGL+7D,EAAWplF,IACC,4BAAbA,EAAI5D,OACL,EAAA6tB,EAAA,IAAS,CAACC,YAAa,sB,EAI3B,GAAGsU,EAAW,CACZ,MAAM9wB,EAAMlT,KAAK4kF,OAAOC,UAAU,MAClC3xE,EAAIwb,KAAK,CACP9sB,KAAM,UACNkjF,WAAW,EACXC,QAAUt8C,IACRgwE,EAAiBhwE,GAAS,KACxB,MAAMl6B,EAAUvO,KAAKiH,SAAS88B,gBAAgBw+C,gBAAgB36E,EAAI6gC,GAClEl6B,EAAQ0J,MAAM2yE,GACd13E,EAAIyuF,gBAAgBpzF,EAAQ,KAGvB,GAETQ,MAAO,kBACPxL,YAAa,iB,MAGf,IAAI,IAAc,CAChBywE,UAAW,CAAC,YACZzwE,YAAa,SACbkvE,SAAWzqE,IACTtF,YAAW,KACT+1G,EAAiB,CAACzwG,IAAUqhC,IAC1BrpC,KAAKiH,SAAS88B,gBAAgB20E,YAAY9wG,EAAII,EAAQqhC,EAAQxhC,UAAO5D,EAAY,GAChFgU,MAAM2yE,EAAQ,GACf,GACD,EAAE,GAIb,KAAG,CAAC/4E,eAAgB7R,KAAK6R,gBAG3B,CAEQ8mG,kBAAkBxwG,EAAmD8K,G,MAC3E,MAAMkkB,EAAiD,QAAhC,EAAAkgF,GAAiBlvG,EAAQH,eAAO,eAAGiL,GAC1D,GAAIkkB,EAEJ,IAAI,MAAMsB,KAAYz4B,KAAKw1B,YAAYkD,UAAW,CAChD,MAAMtmB,EAAcqmB,EAASrmB,YACvBuf,EAAUwF,EAAe/kB,GAC/B,IAAIuf,EACF,SAGF,MAAMk6E,EAAW7rG,KAAKw1B,YAAY6F,qBAAqB,CAAClzB,GAAUiK,GACjE2d,QAAQ5nB,IAAawpB,EAAQjxB,MAAMkkC,GAAMA,EAAE38B,MAAQE,EAAQF,KAAO28B,EAAE58B,SAAWG,EAAQH,WACrF6jG,EAAShpG,SACV8uB,EAAQpC,WAAWs8E,EAAS/wF,KAAK3S,IAAY,CAAEF,IAAKE,EAAQF,IAAKD,OAAQG,EAAQH,YAE9EhI,KAAKgI,SAAWG,EAAQH,SAA6D,IAAnDhI,KAAKw1B,YAAY4B,gBAAgBhlB,KACpEpS,KAAKw1B,YAAY4B,gBAAgBhlB,IAAgBy5F,EAAShpG,OAC1D7C,KAAKw1B,YAAYyJ,oBAAoB4sE,EAAUpzE,GAAU,I,CAIjE,CAEc4/E,iBAAiBlwG,G,0CAC7B,GAAGnI,KAAKq2B,KAAM,OAEd,MAAM,OAACruB,GAAUG,EACX0+B,QAAgB7mC,KAAKiH,SAASqI,gBAAgBu3B,QAAQ7+B,GACtDiL,GAAW,EAAA2lG,GAAA,GAAmBzwG,EAAS0+B,GAE7C7mC,KAAK24G,kBAAkBxwG,GACpB8K,GACDjT,KAAK24G,kBAAkBxwG,EAAS8K,EAEpC,G,CAEO4lG,uBAAuB1hF,EAA2CnvB,EAAgB8jC,GACvF,IAAI,MAAM7jC,KAAO6jC,EACf,IAAI,MAAMlqC,KAAQ5B,KAAKw1B,YAAYkD,UAAW,CAC5C,MAAMtmB,EAAcxQ,EAAKwQ,YAEnBuf,EAAUwF,EAAe/kB,GAC/B,IAAIuf,EAAS,SAEb,MAAM5oB,EAAM4oB,EAAQ3oB,WAAW47B,GAAMA,EAAE38B,MAAQA,IAC/C,IAAY,IAATc,IAIH4oB,EAAQQ,OAAOppB,EAAK,GAEjB/I,KAAKgI,SAAWA,GAAQ,CACzB,MACMomB,EADYpuB,KAAKw1B,YAAYwB,KAAK5kB,GAClBwF,cAAc,cAAc3P,qBAAuBD,OACtEomB,IACEpuB,KAAKw1B,YAAYG,UAAUC,aAC5B51B,KAAKw1B,YAAYG,UAAUI,gBAAgB3H,GAG7CA,EAAI5rB,UAGHxC,KAAKw1B,YAAY4B,gBAAgBhlB,IAAiBrJ,EAAM,KACvD/I,KAAKw1B,YAAY4B,gBAAgBhlB,E,EAQ7C,CAEOmmG,sBAAsBvwG,EAAgB8jC,GAC3C,GAAG9rC,KAAKq2B,KAAM,OAEd,MAAMjnB,EAAIioG,GAAiBrvG,GAC3B,GAAIoH,EAAJ,CAEA,IAAI,MAAM6D,KAAY7D,EACpBpP,KAAK64G,uBAAuBzpG,EAAE6D,GAAWjL,EAAQ8jC,GAGnD9rC,KAAKm0B,WAAWsG,UANH,CAOf,CAEcsM,c,0CAEZ,MAAMlD,EAAY7jC,KAAKgI,OAAO67B,aACvBuB,EAAgBwB,SAAmBvhB,QAAQqH,IAAI,GACpDmX,GAAY7jC,KAAKw1B,YAAY4P,mBAC7BvB,GAAY7jC,KAAKiH,SAAS88B,gBAAgB6C,UAAU5mC,KAAKgI,OAAO+4B,WAAY,kBAG9E,MAAO,KACL/gC,KAAKk7F,QAAQn0D,cACb/mC,KAAK63G,QAAQtkG,UAAUxS,IAAI,QAC3Bf,KAAKw1B,YAAYuR,aAAY,GAC7B/mC,KAAKoL,UAAUmI,UAAU1J,OAAO,kBAAmBu7B,GAAkBwB,EAAU,CAGnF,G,CAEOkyE,aAAavqG,GAClBvO,KAAKw1B,YAAY6B,UAAY9oB,CAC/B,CAEO65D,QAAQpgE,EAAgBiL,G,UAC7B,OAAGjT,KAAKgI,SAAWA,GAAUhI,KAAKiT,WAAaA,KAE/CjT,KAAKgI,OAASA,EACdhI,KAAKiT,SAAWA,EAChBjT,KAAK+4G,aAAc,EAEhB/4G,KAAKq2B,OACNr2B,KAAKq2B,OACLr2B,KAAKq2B,KAAO,MAGdr2B,KAAKw1B,YAAY6R,SAAS,CACxBr/B,SACAiL,WACAkkB,eAA0D,QAAzC,GAAH,EAA0B,QAAxB,EAACkgF,GAAiBrvG,UAAM,QAAvBqvG,GAAiBrvG,GAAY,CAAC,GAAGiL,UAAQ,UAARA,GAAc,CAAC,IAGnEjT,KAAKk7F,QAAQ9yB,QAAQpgE,EAAQiL,IAEtB,EACT,CAEc+lG,iB,0CACZ,MAAMnyE,EAAU7mC,KAAKiH,SAASqI,gBAAgBu3B,QAAQ7mC,KAAKgI,QAE3D,MAAO,KACLhI,KAAK43G,UAAUle,iBAAiB,CAACltF,IAAKxM,KAAKiT,UAAY4zB,EAAU,gBAAkB,WAAW,CAElG,G,CAEa2kC,sB,0CACX,IAAIxrE,KAAK+4G,YACP,OAGF/4G,KAAK+4G,aAAc,EACnB,MAAM3uC,QAAkB/kD,QAAQqH,IAAI,CAClC1sB,KAAK+mC,cACL/mC,KAAKo4G,eAAc,GACnBp4G,KAAKk7F,QAAQ1vB,sBACbxrE,KAAKg5G,mBAGP,MAAO,KACL5uC,EAAUrlE,SAASqxB,IACjBA,SAAAA,GAAY,GACZ,CAEN,G,CAEcgiF,cAAiCjnF,G,0CAC7C,IAAItC,EACJ,GAAG7uB,KAAKgI,OAAO66B,SACbhU,EAAO7uB,KAAKgI,SAAWwZ,EAAA,eAAwBxhB,KAAKiH,SAASk6B,gBAAgB47D,UAAU/8F,KAAKgI,OAAO+6B,iBAC9F,CACL,MAAM2D,EAAS1mC,KAAKgI,OAAO+4B,WACrB4pC,EAAU3qE,KAAKiT,iBAAkBjT,KAAKiH,SAAS88B,gBAAgB8C,QAAQH,IAC7E7X,QAAa7uB,KAAKiH,SAAS88B,gBAAgB6C,UAAUF,EAAQikC,EAAU,gBAAkB,c,CAG3F,MAAMv0C,EAAW,KACfp2B,KAAK63G,QAAQtkG,UAAU1J,OAAO,QAASglB,EAAK,EAG9C,OAAOsC,EAASiF,EAAWA,GAC7B,G,CAEO6iF,iBAAiBnmF,EAAiByR,GACvCvkC,KAAKw1B,YAAY5yB,KAAKkwB,EAAQyR,EAChC,CAEAgjD,qBACEr1E,MAAMq1E,qBAENvnF,KAAKm0B,WAAWsG,UAClB,CAEAwvB,sBACE/3C,MAAM+3C,sBAEHjqD,KAAKk5G,cACNl5G,KAAKk7F,QAAQn3F,UACb/D,KAAKw1B,YAAYzxB,UAErB,CAEOA,UACL/D,KAAKk5G,aAAc,EACnBl5G,KAAKiqD,qBACP,E,6DCjhBF,MAAMkvD,EAAiBznF,IACrB,MAAM,QAACxvB,EAAO,UAAEmZ,EAAS,SAAEqjC,EAAQ,SAAE73C,EAAQ,gBAAEqxB,EAAe,kBAAED,EAAiB,QAAEkiD,GAAWzoD,GACxF,QAAC/X,EAAO,IAAEy/F,GAAOl3G,EAAQ6nB,QAmB/B,QAlBe9lB,IAAZ0V,GACDlG,cAAckG,QAML1V,IAARm1G,IACD1lG,OAAOgnC,sBAAsB0+D,GACzBj/B,UACKj4E,EAAQ6nB,QAAQqvF,KAQxBj/B,GAAW,gCAAwCtzE,EASpD,YARA3E,EAAQ6nB,QAAQqvF,IAAM,GAAK1lG,OAAO83B,uBAAsB,YAC/CtpC,EAAQ6nB,QAAQqvF,IACvBD,EAAc,OAAD,wBACRznF,GAAO,CACVyoD,QAASA,EAAU,IACnB,KAMHz7B,GAAYrjC,GACbnZ,EAAQqR,UAAUxS,IAAIsa,GAGxB,MAAMg+F,EAAe,YACZn3G,EAAQ6nB,QAAQpQ,SACnB+kC,GAAYrjC,GACdnZ,EAAQqR,UAAU/Q,OAAO,YAAa6Y,GAGxCnZ,EAAQqR,UAAU/Q,OAAO,aAEzB01B,SAAAA,GAAmB,EAIrB,GADAD,SAAAA,KACI,iCAAyCpxB,EAG3C,OAFA3E,EAAQqR,UAAU/Q,OAAO,YAAa,kBACtC62G,IAIFn3G,EAAQqR,UAAUxS,IAAI,aAEtBmB,EAAQqR,UAAU1J,OAAO,aAAc60C,GACvCx8C,EAAQ6nB,QAAQpQ,QAAU,GAAKjX,WAAW22G,EAAcxyG,EAAS,EAGnE,G,wHC1De,MAAMyyG,EAYnBv5G,YAAY2xB,G,MAVF,KAAAk8E,cAA6C,GAI/C,KAAAR,cAAe,EAqChB,KAAA+K,gBAAkB,KACV,mBAAuCn4G,KAAK89C,gBAEvD,SAA6B99C,KAAK89C,gBAC1B99C,KAAK4tG,cAAc/qG,QAC3B7C,KAAKu5G,SAASv5G,KAAK4tG,cAAc5tG,KAAK4tG,cAAc/qG,OAAS,G,EAK1D,KAAA02G,SAAW,CAAC3xG,EAA8BgyB,EAAmBq0E,KAClE,QAAUhqG,IAAP2D,GAAoB5H,KAAK4tG,cAAc5tG,KAAK4tG,cAAc/qG,OAAS,KAAO+E,EAE3E,OADA5H,KAAKkpF,qBAAqBthF,IACnB,EAIT,MAAM4xG,EAAYx5G,KAAK4tG,cAAczkF,MACrCnpB,KAAKguG,WAAWwL,EAAW5/E,EAASq0E,GAEpC,MAAM/6F,EAAMlT,KAAK4tG,cAAc5tG,KAAK4tG,cAAc/qG,OAAS,GAE3D,OADA7C,KAAK6tG,gBAAmB5pG,IAARiP,EAAqBA,aAAe,IAAiBA,EAAI9H,UAAY8H,EAAQlT,KAAKotG,cAAgB,EAAI,EAAIxzE,IACnH,CAAI,GA/CX,OAAW55B,KAAM0xB,GAER,QAAT,EAAA1xB,KAAKg3B,YAAI,QAATh3B,KAAKg3B,KAAS,IAAIz1B,KAElBvB,KAAK+4B,cAAgB/4B,KAAK0+F,UAAU9mF,cAAc,mBAClD5X,KAAK6tG,YAAa,OAAiB,CACjCl7F,QAAS3S,KAAK+4B,cACdn3B,KAAM,aACN46D,eA9BkB,MAgChBx8D,KAAKotG,cACPptG,KAAK6tG,WAAW,GAGlB7tG,KAAKkzC,kBAAmB,QAK1B,CAEOumE,gBACL,OAAOz5G,KAAKkzC,iBAAiBjwC,KAC/B,CA2Bai2B,UAAUtxB,G,mDAKrB,GAAG5H,KAAK4tG,cAAc5tG,KAAK4tG,cAAc/qG,OAAS,KAAO+E,EACvD,OAAO,EAGT,MAAMsL,EAAsBtL,aAAc,IAAiBA,EAAK5H,KAAKg3B,KAAK/zB,IAAI2E,GA4B9E,OA3BA5H,KAAK05G,kBAAmB15G,KAAK05G,aAE1BxmG,IAES,QAAV,EAAAA,EAAIgI,cAAM,iBAGPhI,EAAIq0E,oBACL7kF,YAAW,KAETwQ,EAAIq0E,oBAAoB,GA5FV,MAkGpB,aAAiC,CAC/B3lF,KAAM5B,KAAK89C,eACX3wB,MAAQC,IACNptB,KAAKu5G,cAASt1G,EAAWmpB,GAAY,IAC9B,KAKXptB,KAAK4tG,cAAcvrG,KAAKuF,GACxB5H,KAAK6tG,WAAWjmG,aAAc,IAAiBA,EAAGwD,UAAYxD,IACvD,C,qRAGFshF,qBAAqBthF,IAC1B,OAAiB5H,KAAK4tG,cAAehmG,GACrC5H,KAAKguG,WAAWpmG,OAAI3D,EACtB,CAEOsiF,kBAAkBoU,EAA6Cgf,GACpE,IAAI,IAAI3xF,EAAIhoB,KAAK4tG,cAAc/qG,OAAS,EAAGmlB,GAAK,IAAKA,EAAG,CACtD,MAAM9U,EAAMlT,KAAK4tG,cAAc5lF,GAC/B,GAAG9U,IAAQymG,EAAX,CACK,GAAGzmG,aAAeynF,EACrB,MAGF36F,KAAKkpF,qBAAqBh2E,E,EAG9B,CAEO0mG,OAAiCjf,GACtC,OAAO36F,KAAK4tG,cAAcltG,MAAMklC,GAAMA,aAAa+0D,GACrD,CAEOkf,aACL,OAAO75G,KAAK4tG,aACd,CAEOkM,YAAYnf,GACjB,QAAS36F,KAAK45G,OAAOjf,EACvB,CAEUqT,WAAWpmG,EAA6BgyB,EAAkBq0E,G,MAC9DA,GACF,iBAAqCjuG,KAAK89C,gBAAgB,GAG5D,MAAM5qC,EAAsBtL,aAAc,IAAiBA,EAAK5H,KAAKg3B,KAAK/zB,IAAI2E,GAC9E,GAAGsL,EAAK,CACN,IAEa,QAAX,EAAAA,EAAIiI,eAAO,gB,CACX,MAAM3V,GACN4G,QAAQujB,MAAM,oBAAqBzc,E,CAIlCA,EAAI+2C,qBACLvnD,YAAW,KAETwQ,EAAI+2C,qBAAqB,GACxBgwB,I,CAGT,CAEO/S,OAAOh0D,GACRA,EAAI9H,UAAU6N,gBAChBjZ,KAAK+4B,cAAcrtB,OAAOwH,EAAI9H,WAE3B8H,EAAIskG,UACLtkG,EAAIskG,SAAS5pG,iBAAiB,QAAS5N,KAAKm4G,iBAGlD,CAEO4B,UAAU7mG,GACflT,KAAKg3B,KAAK/1B,OAAOiS,EACnB,CAEO2xE,UACLtP,EACA2jC,GAAc,EACdc,GAEA,MAAM9mG,EAAM,IAAIqiE,EAAKykC,OAAc/1G,EAAYjE,KAAMk5G,GAErD,OADAhmG,EAAIjM,SAAWjH,KAAKiH,SACbiM,CACT,E,gICpLa,MAAM+mG,EAmBnBl6G,YAAY6kF,EAAuBs0B,GACjCl5G,KAAKk6G,aAAat1B,EAAQs0B,EAC5B,CAEOgB,aAAat1B,EAAuBs0B,GAAc,G,MACvDl5G,KAAK4kF,OAASA,EACd5kF,KAAKkzC,iBAAmB0xC,EAASA,EAAO60B,gBAAgBhmE,UAAW,SACnEzzC,KAAKk5G,YAAcA,EAEnBl5G,KAAKoL,UAAYC,SAASC,cAAc,OACxCtL,KAAKoL,UAAUmI,UAAUxS,IAAI,WAAY,uBAGzCf,KAAKsrD,OAASjgD,SAASC,cAAc,OACrCtL,KAAKsrD,OAAO/3C,UAAUxS,IAAI,kBAE1Bf,KAAKw3G,UAAW,OAAW,4BAA6B,CAACj1F,UAAU,IACnEviB,KAAK+O,MAAQ1D,SAASC,cAAc,OACpCtL,KAAK+O,MAAMwE,UAAUxS,IAAI,yBACzBf,KAAKsrD,OAAO5/C,OAAO1L,KAAKw3G,SAAUx3G,KAAK+O,OAGvC/O,KAAK2S,QAAUtH,SAASC,cAAc,OACtCtL,KAAK2S,QAAQY,UAAUxS,IAAI,mBAE3Bf,KAAKm0B,WAAa,IAAI,KAAWn0B,KAAK2S,aAAS1O,OAAWA,GAAW,GACrEjE,KAAKm0B,WAAWghD,sBAAsBn1E,KAAKoL,WAE3CpL,KAAKoL,UAAUM,OAAO1L,KAAKsrD,OAAQtrD,KAAK2S,SAE7B,QAAX,EAAA3S,KAAK4kF,cAAM,SAAE1d,OAAOlnE,MAEpBA,KAAK6R,eAAiB,IAAI,GAC5B,CAEOe,QACL,OAAO5S,KAAK4kF,OAAO20B,SAASv5G,KAC9B,CAEa0uB,QAAQiqC,G,qCACnB,GAAG34D,KAAKq2B,KACN,IACE,MAAMkX,EAASvtC,KAAKq2B,QAAQsiC,GAC5B34D,KAAKq2B,KAAO,KAETkX,aAAkBloB,gBACbkoB,E,CAER,MAAM/nC,GACN4G,QAAQujB,MAAM,iBAAkBnqB,E,CAIpCxF,KAAK4kF,OAAO1rD,UAAUl5B,KACxB,E,+RAEOq2B,QAAQsiC,GAEf,CAEUz9C,SAAU,CACVqsE,qBAAsB,CACtBpsE,UAAW,CAEX8uC,sB,UACLjqD,KAAKk5G,cACK,QAAX,EAAAl5G,KAAK4kF,cAAM,SAAEm1B,UAAU/5G,MACvBA,KAAKoL,UAAU5I,SACfxC,KAAKm0B,WAAWpwB,UACG,QAAnB,EAAA/D,KAAK6R,sBAAc,SAAEC,YACA,QAArB,EAAA9R,KAAKkzC,wBAAgB,SAAEnvC,UAE3B,CAEU49E,SAASn1E,GACjBxM,KAAK+O,MAAM4zB,iBAAgB,QAAKn2B,GAClC,EAGK,MAAM2tG,UAAgCF,EAO3Cl6G,YAAY6kF,GACV1yE,MAAM0yE,GACN5kF,KAAKwlF,cAAgB,IAAI,GAC3B,CAEArqE,UACEnb,KAAKwlF,cAAcp8E,cAAc,QACnC,CAEA6gD,sBACE,MAAM5qB,EAAUr/B,KAAKwlF,cAAc40B,wBAAwB,WAG3D,OAFAp6G,KAAKwlF,cAAcp8E,cAAc,eAAgBic,QAAQqH,IAAI2S,GAAS/wB,KAAK,IAAM,MACjFtO,KAAKwlF,cAAc9pE,UACZxJ,MAAM+3C,qBACf,E,mbCzHa,MAAMowD,UAAuB,IAc1Ct6G,YAAY2xB,GAkEV,IAAI/X,EAtDJzH,MAAM,CACJooG,SAAU5oF,EAAQ4oF,UAAY,CAAEp4G,GAAYlC,KAAKiH,SAASk6B,gBAAgBo5E,qBAAqBr4G,EAAQ0F,KACvG4yG,SAAWt4G,IACTA,EAAQi+B,IAAIs6E,OAAOj4G,SACnBxC,KAAK06G,oBAAsB16G,KAAK06G,oBAAoB,EAEtDC,SAAUjpF,EAAQipF,UAAY,CAAOz4G,GAAY,EAAD,gCAC9C,MAAM89F,GAAS,aAA0BhgG,KAAKiH,SAASk6B,gBAAgBC,QAAQl/B,EAAQ0F,MACvF,OAAe1F,EAAQi+B,IAAIU,gBAAiBm/D,EAC9C,KACAlK,OAAQ,CAAC5zF,EAAS6G,KAChB,MAAM6xG,EAAmB14G,EAAQi+B,IAAIs6E,OAAOxhG,gBAAkBjZ,KAAKqzB,MACnE,OAAuBnxB,EAAQi+B,IAAIs6E,OAAQz6G,KAAKqzB,KAAMtqB,GAEnD6xG,GAAoB56G,KAAK06G,oBAC1B16G,KAAK06G,oB,EAGTG,gBAAkBC,IAChB,MAAM,IAAC36E,GAAO,uBAA+B,CAC3Cn4B,OAAQ8yG,EAAKlzG,GACbwD,WAAW,EACXgqB,WAAYp1B,KAAKo1B,WACjBlC,WAAYlzB,KAAKkzB,WACjBmC,WAAW,EACXkO,cAAevjC,KAAKujC,cACpBiQ,YAAa,CACX5xB,cAAe5hB,KAAK4hB,iBAKxB,OADCk5F,EAAoB36E,IAAMA,EACpB26E,CAAkB,EAE3BC,kBAAmB,KACnBC,eAAsB5kF,GAAa,EAAD,gCAChC,OAAI,OAAQp2B,KAAKqzB,aAIX,WAEF,OAAQrzB,KAAKqzB,WAIjB+C,GAAS,GAHAA,GAAS,IANTA,GAAS,EAUpB,MApEM,KAAAhB,WAAgC,aAChC,KAAAmO,eAAgB,EAChB,KAAArQ,YAAa,GAqErB,OAAWlzB,KAAM0xB,GAEjB1xB,KAAKqzB,KAAO,yBAAiCrzB,KAAKi7G,uBAGlD,MAAMC,EAAY,KAChBvhG,EAAUjG,OAAOhR,YAAW,KAC1B1C,KAAKm7G,YAAYrhG,IACZA,GACDohG,G,GAEF,GACDb,EAAee,cAAc,EAGlCF,GACF,EA3FiB,EAAAE,cAAgB,G,8hBCOnC,IAAIC,GAAY,EACD,SAASC,GAA6B,SAAC5wD,EAAQ,eAAE74C,EAAc,SAAEkX,EAAUwyF,WAAYC,IAMpG,GAAG,IACD,OAGF,MAAMD,EAAa,CAACxzG,EAAe0zG,KACjC,IAAI76G,EACJ,GAAG46G,EAAoB56G,EAAK46G,EAAmBzzG,OAC1C,CACH,MAAMgC,EAAIgf,GAAY,yBACtBnoB,EAAMmH,EAAE1H,OAAuBq7G,QAAQ3xG,E,CAGzC,OAAOnJ,GAAQ66G,KAAkB,OAAc76G,EAAI8pD,QAAkBzmD,EAALrD,CAAc,EAG1EqG,EAAW,aAEjB4K,EAAe9Q,IAAI2pD,EAAnB74C,CAA6B,aAAc9J,IACzC,GAAGszG,GAAatzG,EAAE8L,QAAU,GAAkB,IAAb9L,EAAEuO,OAAc,OACjD,IAAIqlG,EAAiBJ,EAAWxzG,GAChC,IAAI4zG,EACF,OAKF,MAAMv0G,EAAQu0G,EAAe5xF,QAAQ3iB,MACrC,IAAIA,EACF,OAGF,MAAMiU,EAAY,iBACZ/a,EAA4B,iBAG5Bs7G,EAAgB,8BAChBC,GAAc,SACpB,IAAIzwG,EAAwB0wG,EAE5B,MAAMC,EAAgB,EAAOJ,iBAAgBh6G,MAAKu1B,aAAY8kF,aAAYC,iBAMpE,EAAD,gCACH,MAAMC,GAAc,OAAsBv6G,GACpCw6G,EAAqBR,EAAej+F,wBACpC3T,GAAI,OAAcpI,EAAIyM,EAAGzM,EAAIyN,GAC7BvH,EAAOq0G,EAAc,IAAM,IAC3BE,GAAU,OAAcv0G,EAAMA,GAC9Bw0G,EAASF,EAAUj1F,QAAUi1F,EAAU70F,OAAS80F,EAAUryG,EAAEuyG,aAAaF,GAEzEz7D,GAAS,OAAgBg7D,EAAgB,UACzCpzF,GAAQo4B,GAASA,EAAOptC,UAAUqB,SAAS,UAE3C2nG,EAAclxG,SAASC,cAAc,OAC3CixG,EAAYhpG,UAAUxS,IAAIsa,EAAY,gBAEtC,MAAM+qE,EAAmB/6E,SAASC,cAAc,OAChD86E,EAAiB7yE,UAAUxS,IAAIsa,EAAY,YACX+qE,EAAiB76E,MAAM2b,MAAQm1F,EAAOn1F,MAAQ,KAC7Ck/D,EAAiB76E,MAAM+b,OAAS+0F,EAAO/0F,OAAS,KAEjF,MAAM2qC,EAAe5mD,SAASC,cAAc,OAI5C,GAHA2mD,EAAa1+C,UAAUxS,IAAIsa,EAAY,UACvC42C,EAAavmD,QAAO,OAAc/J,EAAIw0D,kBAEnC+lD,EAAa,CACd,MAAMp2D,GAAUj+C,EAAO,KAA4BA,GAAQ,GAAK0gB,EAAQ,GAAK,GAC7Eg0F,EAAYhpG,UAAUxS,IAAI,cAG1Bw7G,EAAYhxG,MAAM0vE,YAAY,eAAgB,GAAGn1B,OACjDmM,EAAa1mD,MAAM0vE,YAAY,gBAAoBn1B,EAAJ,K,CAGjD,MAAMp/B,GAAkB,OAAgBi1F,EAAgB,cAClDh1F,GAAc,OAAeg1F,EAAgBj1F,GAAiB,EAAMy1F,IACvEx1F,EAAYE,SAASC,UAAYH,EAAYE,SAASE,aACvDq/D,EAAiB7yE,UAAUxS,IAAI,eAWjC,MAAMulB,EAAOq1F,EAAej+F,wBACtB6J,EAASjB,EAAKY,MAAQm1F,EAAOn1F,MAC7BM,EAASlB,EAAKgB,OAAS+0F,EAAO/0F,OAC9Bk1F,EAAal2F,EAAKxB,MAAQ,UAAmBwB,EAAKY,OAAS,EAC3Du1F,EAAan2F,EAAKtB,KAAO,WAAoBsB,EAAKgB,QAAU,EAClEi1F,EAAYhxG,MAAMkR,UAAY,aAAa+/F,QAAiBC,cAAuBl1F,MAAWC,KAC3Fy0F,GAAaM,EAAYhpG,UAAUxS,IAAI,gBAC1Cw7G,EAAY7wG,OAAO06E,EAAkBn0B,GACrC7mD,EAAUM,OAAO6wG,GAEjB,MAAMtlC,QAAU,QAAY,CAC1Bt1E,MACAysB,IAAKg4D,EACL9lF,QACA4mB,MAAOm1F,EAAOn1F,MACdI,OAAQ+0F,EAAO/0F,OACf7iB,MAAM,EACNf,MAAM,EACNwzB,aACAjwB,WACAy1G,YAAY,EACZn0F,QACAo0F,WAAW,EACXC,gBAAgB,EAChBC,YAAY,IACXvuG,MAAK,EAAEo+B,YAAYA,IACtB,IAAIxV,IAAc,OAEd9rB,EAAU6N,eACZ5N,SAASI,KAAKC,OAAON,GAGvB,MAAMhJ,EAAS8W,MAAMs/D,QAAQvB,GAAKA,EAAE,GAAKA,EAEnC6lC,EAAoB16G,aAAkB,IAC1C,IAAIijB,SAAelX,GAAY/L,EAAOwL,iBAAiB,aAAcO,EAAS,CAACF,MAAM,MACrFoX,QAAQlX,UAGV,SAFMkX,QAAQqH,IAAI,CAACowF,GAAmB,kBAChC,OAAM,GACR5lF,IAAJ,CAOA,GALG8kF,IACD,4BAA6C17G,GAC7C,sBAAsC,IAGrC8B,aAAkB,IAAe,CAClC,MAAM26G,EAAapB,aAA0B,KAC3CA,EAAev5G,OACf,iBAA0Bu5G,GAC5B,GAAGoB,EAAY,CAcb,GAbA36G,EAAO4jE,SAAW+2C,EAAW/2C,SAC7B5jE,EAAOqC,aACD,IAAI4gB,SAAelX,IACvB,IAAI6Z,EAAI,EACR,MAAMwd,EAAI,KACG,KAANxd,IACH7Z,IACA/L,EAAOsP,oBAAoB,aAAc8zB,G,EAI7CpjC,EAAOwL,iBAAiB,aAAc43B,EAAE,KAEtCtO,IAAc,OAClB90B,EAAOmC,O,OAEJ,GAAGnC,aAAkBG,iBAAkB,CAC5C,MAAMw6G,EAAapB,EAAe/jG,cAAgC,SAC/DmlG,IACD36G,EAAOmE,YAAcw2G,EAAWx2G,Y,CAIpC,MAAO,CACLy2G,MAAO,MACF56G,aAAkB,KAAiBA,aAAkBG,mBACtDH,EAAOqC,OAGNy3G,IACD,QAAmB91B,E,EAGvBm2B,cA7CsB,CA+C1B,IAEM5iG,EAAUjG,OAAOhR,YAAW,IAAW,EAAD,gCAC1C2I,SAASqG,oBAAoB,YAAaurG,GAE1C7xG,EAAYC,SAASC,cAAc,OACnCF,EAAUmI,UAAUxS,IAAIsa,GACxBggG,GAAY,EAEZ,MAAMnkF,EAAa2kF,EAAY54G,MACzBtB,QAAYsF,EAASC,eAAeC,OAAOC,GACjD,IAAI8vB,IAAc,OAElB,IAAIqW,EACJ,IAOE,GANAA,QAAewuE,EAAc,CAC3Bp6G,MACAg6G,iBACAzkF,aACA8kF,YAAY,KAEVzuE,EAAQ,M,CACZ,MAAM/nC,GACN,M,CAGF,MAAM,MAACw3G,EAAK,YAAET,GAAehvE,EAE7BuuE,EAAsBS,GAEtB,OAAc,CACZr6G,QAASkJ,EACTiQ,UAAW,aACXqjC,UAAU,EACV73C,SAlLiB,IAmLjBqxB,gBAAiB,KACXhB,KACJ8lF,GAAO,IAIX3xG,SAASuC,iBAAiB,YAAaivC,EACzC,KAAG,KAEGA,EAAoB90C,GAAkB,EAAD,gCACzC,MAAMm1G,EAAoB3B,EAAWxzG,GAAG,GACxC,IAAIm1G,GAAqBvB,IAAmBuB,EAC1C,OAGF,MAAM91G,EAAQ81G,EAAkBnzF,QAAQ3iB,MACxC,IAAIA,EACF,OAGFu0G,EAAiBuB,EACjBrB,EAAY/xG,QACZ,MAAMotB,EAAa2kF,EAAY54G,MAEzBtB,QAAYsF,EAASC,eAAeC,OAAOC,GACjD,IAAI8vB,IAAc,OAElB,IAAIhP,EACJ,IAOE,GANAA,QAAU6zF,EAAc,CACtBp6G,MACAg6G,iBACAzkF,aACA+kF,aAAa,KAEX/zF,EAAG,M,CACP,MAAM1iB,GAEN,YADA4G,QAAQujB,MAAM,uBAAwBnqB,E,CAIxC,MAAM,MAACw3G,EAAK,YAAET,GAAer0F,EAEvBi1F,EAAuBrB,GAC7B,OAAc,CACZ55G,QAASi7G,EACT9hG,UAAW,eACXqjC,UAAU,EACV73C,SAlOmB,IAmOnBqxB,gBAAiB,KACfilF,EAAqB36G,QAAQ,IAIjCs5G,EAAsBS,GAEtB,OAAc,CACZr6G,QAASq6G,EACTlhG,UAAW,eACXqjC,UAAU,EACV73C,SA9OmB,IA+OnBqxB,gBAAiB,KACXhB,KACJ8lF,GAAO,GAGb,IAEMC,EAAkBl1G,KAClB,OAAcA,EAAE1H,OAAuBs7G,IACzC94F,G,EAIEA,EAAY,KAChBpP,aAAakG,GACbkiG,EAAY/xG,QAETsB,KACD,OAAc,CACZlJ,QAASkJ,EACTiQ,UAAW,aACXqjC,UAAU,EACV73C,SAtQe,IAuQfqxB,gBAAiB,KACf9sB,EAAU5I,SACV,4BAA6Co5G,GAC7C,sBAAsC,GACtCP,GAAY,CAAK,KAIrB,QAAiBhwG,SAASI,KAAM,IAAa,CAACuJ,SAAS,EAAM/G,MAAM,KAGrE5C,SAASqG,oBAAoB,YAAaurG,GAC1C5xG,SAASqG,oBAAoB,YAAamrC,GAC1CxxC,SAASqG,oBAAoB,UAAWmR,EAAW,CAAC7N,SAAS,GAAM,EAGrE3J,SAASuC,iBAAiB,YAAaqvG,GACvC5xG,SAASuC,iBAAiB,UAAWiV,EAAW,CAAC5U,MAAM,EAAM+G,SAAS,GAAM,GAEhF,C,+CC1Ve,MAAMooG,EAInBr9G,YAAoBqL,EAAgC0xE,GAAhC,KAAA1xE,UAAAA,EAAgC,KAAA0xE,QAAAA,EAClD98E,KAAKq9G,iBACLr9G,KAAKs9G,iBACP,CAOQD,iBACNr9G,KAAKu9G,gBAAkB,IAAIr9G,sBAAsBC,IAC/C,IAAI,MAAMC,KAASD,EAAS,CAC1B,MAAMq9G,EAAap9G,EAAMq9G,mBACnBC,EAAet9G,EAAMC,OAAO4Y,cAC5B0kG,EAAiBv9G,EAAMw9G,WAG1BJ,EAAWv4F,OAAS04F,EAAe34F,KACpChlB,KAAK88E,SAAQ,EAAM4gC,GAIlBF,EAAWv4F,QAAU04F,EAAe34F,KACnCw4F,EAAWv4F,OAAS04F,EAAe14F,QACrCjlB,KAAK88E,SAAQ,EAAO4gC,E,IAGvB,CAACG,UAAW,EAAGrqD,KAAMxzD,KAAKoL,WAC/B,CAEQkyG,kBACNt9G,KAAK89G,iBAAmB,IAAI59G,sBAAsBC,IAChD,MAAMC,EAAQD,EACb4vB,QAAQ3vB,GAAUA,EAAMq9G,mBAAmBz4F,IAAM5kB,EAAMw9G,WAAW54F,MAClEgL,MAAK,CAACvb,EAAGwb,IAAMxb,EAAEgpG,mBAAmBz4F,IAAMiL,EAAEwtF,mBAAmBz4F,MAAK,GACrE,IAAI5kB,EAAO,OAEX,MAAMgL,EAAYhL,EAAMS,eAAiBT,EAAMC,OAASD,EAAMC,OAAO82E,mBACrEn3E,KAAK88E,SAAQ,EAAM1xE,EAAyB,GAC3C,CAACooD,KAAMxzD,KAAKoL,WACjB,CAMQ2yG,YAAY3yG,EAAwBiQ,GAC1C,MAAM2iG,EAAW3yG,SAASC,cAAc,OAExC,OADA0yG,EAASzqG,UAAUxS,IAAI,kBAAmBsa,GACnCjQ,EAAUoM,YAAYwmG,EAC/B,CAOO7kD,2BAA2Bj3D,GAChC,MAAM+7G,EAAiBj+G,KAAK+9G,YAAY77G,EAAS,wBACjDlC,KAAKu9G,gBAAgB55G,QAAQs6G,GAE7Bj+G,KAAK89G,iBAAiBn6G,QAAQzB,EAChC,CAEOy3D,aACL35D,KAAKu9G,gBAAgB5jD,aACrB35D,KAAK89G,iBAAiBnkD,YACxB,CAEO72D,UAAUZ,EAAsB+7G,GACrCj+G,KAAK89G,iBAAiBh7G,UAAUZ,GAChClC,KAAKu9G,gBAAgBz6G,UAAUm7G,EACjC,E,oLC/CF,MAAMC,EAAYn2G,GACT,YAAaA,EAAIA,EAAEypB,QAAQ,GAAKzpB,EAGzC,SAASo2G,EAAY1pG,EAAUwb,GAC7B,OAAIA,EACGzpB,KAAK43G,MAAOnuF,EAAEwf,MAAQh7B,EAAEg7B,MAASxf,EAAEyhD,MAAQj9D,EAAEi9D,OADtC,CAEhB,CAEA,SAAS2sC,EAAe5pG,EAAUwb,GAChC,MAAO,CACLvT,GAAIjI,EAAEg7B,MAAQxf,EAAEwf,OAAS,EACzB9yB,GAAIlI,EAAEi9D,MAAQzhD,EAAEyhD,OAAS,EAE7B,CAEA,MAAM4sC,EAAyBjzG,SAE/B,IAAIkzG,GAAe,EACnB,qBAAuC,UAAWz9G,IAChDy9G,EAAez9G,CAAO,IAuBxB,MAAM09G,EAAsC,CAAC/sF,SAAS,GAChDgtF,GAAsC,EACtCC,EAAiC,CAAC1pG,SAAS,EAAMyc,SAAS,GAcjD,MAAMktF,EAsCnB5+G,YAAY2xB,G,cA2GF,KAAA/gB,MAAS5I,I,UACjB/H,KAAKyhB,IAAI,SAKN,IACDzhB,KAAK6R,eAAemrC,aAAashE,EAAwB,YAAat+G,KAAK4+G,WAAYJ,IAEvFx+G,KAAK6R,eAAemrC,aAAashE,EAAwB,YAAat+G,KAAK4+G,WAAYH,GACvFz+G,KAAK6+G,YAAYtzG,MAAM2Y,OAAS,IAG/BlkB,KAAK8+G,UACM,QAAZ,EAAA9+G,KAAKwjB,eAAO,qBAGO,QAArB,EAAAxjB,KAAK++G,wBAAgB,SAAEtrG,eACF,QAArB,EAAAzT,KAAKg/G,wBAAgB,SAAEvrG,eAEvBzT,KAAKi/G,aAAa,EAmBV,KAAAC,YAAoBx3C,IAAW,O,EAAD,K,OAAA,E,EAAA,Y,QAGtC,GAFA1nE,KAAKyhB,IAAI,SAENzhB,KAAKm/G,YAAa,CACnB,MAAM3tF,EAAWk2C,EAAyBl2C,QAM1C,YALuB,KAApBA,aAAO,EAAPA,EAAS3uB,UACV7C,KAAKo/G,gBAAkBjB,EAAY3sF,EAAQ,GAAIA,EAAQ,IACvDxxB,KAAKq/G,mBAAqBhB,EAAe7sF,EAAQ,GAAIA,EAAQ,K,CAMjE,MAAMzpB,EAAIm2G,EAASx2C,GACnB,GAAkC,IAA/BlhE,KAAKC,IAAI,EAAW,QAAR,EAAAsB,EAAEuO,cAAM,QAAI,GACzB,OAGF,IAAG,OAAoBoxD,GACrB,OAGF,MAAMxrD,IAAWlc,KAAKkc,OAEhBojG,EAAqC,QAAtB,EAAAt/G,KAAKikB,yBAAiB,yBAAGyjD,GAC9C,QAAoBzjE,IAAjBq7G,EAA4B,CAC7B,IAAI/xE,EACJ,GAAG+xE,aAAwBj6F,SAIzB,GAFAkoB,QAAe+xE,EAEZt/G,KAAKkc,SAAWA,EACjB,YAGFqxB,EAAS+xE,EAGX,IAAI/xE,EACF,OAAOvtC,KAAK2Q,O,CAMhB,GAFA3Q,KAAKm/G,aAAc,EAEhBn/G,KAAKu/G,YAAc,IAAoB,CACxC,MAAM7tF,EAAU,OAAH,wBAAO+sF,GAAkB,CAAExwG,MAAM,IACxCC,GAAW,SACXkC,EAAK,IAAMlC,EAASC,UACpBuL,EAAW1Z,KAAK6R,eAAe9Q,IAAIu9G,EAAxBt+G,CAAgD,YAAaoQ,EAAIshB,GAUlF,SARMrM,QAAQ+1C,KAAK,EACjB,OAAM,KACNltD,IAGFA,EAASC,UACTnO,KAAK6R,eAAerP,OAAOkX,GAExB1Z,KAAKkc,SAAWA,EACjB,M,CAIJlc,KAAKw/G,MAAQz3G,EAAEg5D,QACf/gE,KAAKy/G,MAAQ13G,EAAE0pE,QACfzxE,KAAK0/G,QAAU33G,EAEZ,IAED/H,KAAK6R,eAAe9Q,IAAIu9G,EAAxBt+G,CAAgD,YAAaA,KAAK4+G,WAAYJ,GAG9Ex+G,KAAK6R,eAAe9Q,IAAIu9G,EAAxBt+G,CAAgD,YAAaA,KAAK4+G,WAAYH,GAG7Ez+G,KAAK2/G,UACN3/G,KAAK2/G,UAGL3/G,KAAK8+G,SAAU,EACf9+G,KAAK4+G,WAAW72G,GAEpB,E,YAnFwC,K,6QAmFvC,EAES,KAAA62G,WAAcl3C,I,QACtB,QAAkBzjE,IAAfjE,KAAKw/G,YAAsCv7G,IAAfjE,KAAKy/G,OAAuBlB,EAEzD,YADAv+G,KAAK2Q,QAQP,GAJG3Q,KAAKoa,cACN,OAAYstD,IAGU,QAArB,EAAA1nE,KAAK++G,wBAAgB,eAAEtJ,iBAAsC,QAArB,EAAAz1G,KAAKg/G,wBAAgB,eAAEvJ,eAChE,OAGFz1G,KAAKyhB,IAAI,QAET,MAAM1Z,EAAI/H,KAAK0/G,QAAUxB,EAASx2C,GAC5Bk4C,EAAM73G,EAAEg5D,QACR8+C,EAAM93G,EAAE0pE,QAERruD,EAAQw8F,EAAM5/G,KAAKw/G,MAAQx/G,KAAK8/G,OAChCz8F,EAAQw8F,EAAM7/G,KAAKy/G,MAAQz/G,KAAK+/G,OAEtC,IAAI//G,KAAK8+G,QAAS,CAChB,IAAI17F,IAAUC,EACZ,OAGFrjB,KAAKggH,WAAWt4C,E,CAGlB,MAAMl2C,EAAWk2C,EAAyBl2C,QAC1C,GAAGxxB,KAAK2e,QAAU3e,KAAKo/G,gBAAkB,GAAwB,IAAnB5tF,EAAQ3uB,OAAc,CAClE,MAAMo9G,EAAc9B,EAAY3sF,EAAQ,GAAIA,EAAQ,IAC9C0uF,EAAc7B,EAAe7sF,EAAQ,GAAIA,EAAQ,IACjDtS,EAAcghG,EAAYxjG,EAAI1c,KAAKq/G,mBAAmB3iG,EACtDyC,EAAc+gG,EAAYvjG,EAAI3c,KAAKq/G,mBAAmB1iG,EAEtDtW,EAAuB,CAC3B+Y,WAFiB6gG,EAAcjgH,KAAKo/G,gBAGpCxgG,eAAgB5e,KAAKq/G,mBAAmB3iG,EACxCmC,eAAgB7e,KAAKq/G,mBAAmB1iG,EACxCuC,cACAC,cACAH,eAAgBkhG,EAAYxjG,EAC5BuC,eAAgBihG,EAAYvjG,GAG9B3c,KAAK2e,OAAOtY,E,CAGdrG,KAAKmgH,gBAAgB/8F,EAAOC,EAAOqkD,EAAG,EAG9B,KAAA04C,YAAer4G,I,MACvB,IAAI/H,KAAK8+G,SAAW9+G,KAAKikB,kBAAmB,CAC1C,MAAMspB,EAASvtC,KAAKikB,kBAAkBlc,GACtC,QAAc9D,IAAXspC,IAAyBA,EAE1B,YADAvtC,KAAK2Q,MAAM5I,E,CASf,IAJA,OAAYA,GAEZ/H,KAAKyhB,IAAI,SAENzhB,KAAK4jB,eAAiBzf,OAAOk8G,GAAGt4G,EAAEg5E,QAAS,IAAM58E,OAAOk8G,GAAGt4G,EAAE+uC,QAAS,IAAM/uC,EAAEsZ,QAI/E,OAHArhB,KAAKsgH,eAAev4G,GACpB/H,KAAK4jB,cAAc,CAACC,QAAS9b,EAAE0nC,MAAO3rB,QAAS/b,EAAE2pE,aACjD1xE,KAAK2Q,QAIgB5I,EAAEuZ,SAAWvZ,EAAEsZ,SAAWtZ,EAAEw4G,WAGzB,QAArB,EAAAvgH,KAAK++G,wBAAgB,eAAEtJ,gBACxBz1G,KAAK2Q,QAGP3Q,KAAKwgH,YAAYz4G,IAEjB/H,KAAKygH,gBAAgB14G,E,EAIf,KAAA04G,gBAAmB14G,IAC3B/H,KAAKyhB,IAAI,cAETzhB,KAAKsgH,eAAev4G,GAEhB/H,KAAK0gH,eAAehkG,GAAKlW,KAAKm6G,KAAK3gH,KAAK4gH,kBAAkBlkG,KAAOlW,KAAKm6G,KAAK54G,EAAEg5E,UAC/E/gF,KAAK4gH,kBAAkBlkG,GAAK3U,EAAEg5E,QAE5B/gF,KAAK0gH,eAAe/jG,GAAKnW,KAAKm6G,KAAK3gH,KAAK4gH,kBAAkBjkG,KAAOnW,KAAKm6G,KAAK54G,EAAE+uC,UAC/E92C,KAAK4gH,kBAAkBjkG,GAAK5U,EAAE+uC,QAEhC,MAAM,EAACp6B,EAAC,EAAEC,GAAK3c,KAAK4gH,kBACpB5gH,KAAK++G,iBAAiBh3G,GACtB/H,KAAKmgH,gBAAgBzjG,EAAGC,EAAG5U,GAAG,CAAC84G,EAAIC,KACjC9gH,KAAK0gH,eAAiB,CAAChkG,EAAGmkG,EAAIlkG,EAAGmkG,EAAG,GACpC,EAGM,KAAAR,eAAkBv4G,IACvB/H,KAAK8+G,UACR9+G,KAAKyhB,IAAI,iBACTzhB,KAAKk/G,YAAYn3G,GACjB/H,KAAKggH,WAAWj4G,GAChB/H,KAAKq/G,mBAAqB,CAAC3iG,EAAG3U,EAAE2U,EAAGC,EAAG5U,EAAE4U,GAAE,EAGlC,KAAA6jG,YAAez4G,IACvB,IAAI/H,KAAK2e,OAAQ,OACjB3e,KAAKyhB,IAAI,cACTzhB,KAAKsgH,eAAev4G,GACpB,MAAMmX,EAAcnX,EAAE2U,EAAI1c,KAAKq/G,mBAAmB3iG,EAC5CyC,EAAcpX,EAAE4U,EAAI3c,KAAKq/G,mBAAmB1iG,EAC5CokG,GAAQ,OAAMh5G,EAAE+uC,QAAS,GAAI,IACnC92C,KAAKghH,WAAqB,IAARD,EAClB,MAAM16G,EAAuB,CAC3B0Y,QAAS/e,KAAKghH,UAAY,EAC1BpiG,eAAgB5e,KAAKq/G,mBAAmB3iG,EACxCmC,eAAgB7e,KAAKq/G,mBAAmB1iG,EACxCuC,cACAC,cACAH,eAAgBjX,EAAE2U,EAClBuC,eAAgBlX,EAAE4U,GAEpB3c,KAAK2e,OAAOtY,GACZrG,KAAKg/G,iBAAiBj3G,EAAE,GAzWxB,OAAW/H,KAAM0xB,GAEjB1xB,KAAKyhB,KAAM,QAAO,iBACP,QAAX,EAAAzhB,KAAKkkB,cAAM,QAAXlkB,KAAKkkB,OAAW,YACA,QAAhB,EAAAlkB,KAAKoa,mBAAW,QAAhBpa,KAAKoa,aAAgB,GAED,QAApB,EAAApa,KAAKihH,uBAAe,QAApBjhH,KAAKihH,gBAAoBzC,GAET,QAAhB,EAAAx+G,KAAK6+G,mBAAW,QAAhB7+G,KAAK6+G,YAAgB7+G,KAAKkC,SAC1BlC,KAAK6R,eAAiB,IAAI,IAC1B7R,KAAKqU,eAELrU,KAAKi/G,cACLj/G,KAAKkc,OAAS,EAEI,QAAlB,EAAAwV,EAAQwF,kBAAU,SAAE24E,WAAU,KAC5B7vG,KAAK2Q,QACL3Q,KAAK2b,iBAAiB,IAGxB3b,KAAK++G,kBAAmB,OAAS/+G,KAAK2Q,MAAO,KAAK,GAClD3Q,KAAKg/G,kBAAmB,OAASh/G,KAAK2Q,MAAO,KAAK,EACpD,CAEO0D,eACD,KASCrU,KAAKu/G,WACN,OAA0B,CACxBr9G,QAASlC,KAAKkC,QACdk0B,SAAWruB,KACT,OAAYA,GAEZ/H,KAAKk/G,YAAYn3G,EAAE,EAErB8J,eAAgB7R,KAAK6R,eACrBovG,gBAAiBjhH,KAAKihH,kBAIxBjhH,KAAK6R,eAAe9Q,IAAIf,KAAKkC,QAA7BlC,CAAsC,aAAcA,KAAKk/G,YAAal/G,KAAKihH,iBAG1EjhH,KAAK4jB,eACN5jB,KAAK6R,eAAe9Q,IAAIf,KAAKkC,QAA7BlC,CAAsC,YAAa+H,IACjD/H,KAAK4jB,cAAc,CAACC,QAAS9b,EAAE0nC,MAAO3rB,QAAS/b,EAAE2pE,OAAO,IAI5D1xE,KAAK6R,eAAe9Q,IAAIu9G,EAAxBt+G,CAAgD,WAAYA,KAAK2Q,SA7BjE3Q,KAAK6R,eAAe9Q,IAAIf,KAAKkC,QAA7BlC,CAAsC,YAAaA,KAAKk/G,YAAal/G,KAAKihH,iBAC1EjhH,KAAK6R,eAAe9Q,IAAIu9G,EAAxBt+G,CAAgD,UAAWA,KAAK2Q,QAE7D3Q,KAAK2e,QAAU3e,KAAK4jB,gBACrB5jB,KAAK6R,eAAe9Q,IAAIf,KAAKkC,QAA7BlC,CAAsC,QAASA,KAAKogH,YAAa1B,GA2BvE,CAEO/iG,kBACL3b,KAAKyhB,IAAI,oBACTzhB,KAAK2Q,QACL3Q,KAAK6R,eAAeC,WACtB,CAEOovG,UAAUh9F,EAAiC,IAChDlkB,KAAKkkB,OAASA,GAEV,KAAsBlkB,KAAK8+G,SAC7B9+G,KAAK6+G,YAAYtzG,MAAM0vE,YAAY,SAAUj7E,KAAKkkB,OAAQ,YAE9D,CAEOnjB,IAAI2b,EAAWC,GACpB3c,KAAK8/G,OAASpjG,EACd1c,KAAK+/G,OAASpjG,EACd3c,KAAK4+G,WAAW,CACd79C,QAAS/gE,KAAK0/G,QAAQ3+C,QACtB0Q,QAASzxE,KAAK0/G,QAAQjuC,QACtBpxE,OAAQL,KAAK0/G,QAAQr/G,QAEzB,CAEU4+G,gBACNj/G,KAAKkc,OACPlc,KAAK8+G,SAAU,EACf9+G,KAAK8/G,OAAS9/G,KAAK+/G,OAAS,EAC5B//G,KAAKw/G,MACHx/G,KAAKy/G,MACLz/G,KAAK0/G,QACL1/G,KAAKm/G,iBACLl7G,EAECjE,KAAK2e,SACN3e,KAAKo/G,gBAAkB,EACvBp/G,KAAKq/G,mBAAqB,CACxB3iG,EAAG,UAAmB,EACtBC,EAAG,WAAoB,GAEzB3c,KAAK4gH,kBAAoB,CAAClkG,EAAG,EAAGC,EAAG,GACnC3c,KAAK0gH,eAAiB,CAAChkG,GAAG,EAAOC,GAAG,GACpC3c,KAAKghH,UAAY,EAErB,CAyBUhB,WAAWt4C,G,MACf1nE,KAAK8+G,UACP9+G,KAAKyhB,IAAI,YACTzhB,KAAK8+G,SAAU,EACf9+G,KAAK6+G,YAAYtzG,MAAM0vE,YAAY,SAAUj7E,KAAKkkB,OAAQ,aACzC,QAAjB,EAAAlkB,KAAKyjB,oBAAY,mBAAGikD,GAExB,CAEUy4C,mBAAmBxnD,GAC3B,MAAMwoD,EAAgBnhH,KAAK0jB,WAAWi1C,QACjB10D,IAAlBk9G,GAA+BA,GAChCnhH,KAAK2Q,OAET,E,yFCzQa,MAAMywG,UAAsB,KAIzCrhH,YAAY2xB,EAER,CAAC,GACHxf,MAAM,OAAD,QACH+4B,MAAO,mCAEP/yB,KAAM,SACHwZ,IAVC,KAAA2vF,QAAS,EACV,KAAAC,UAAY,GAYjBthH,KAAKoL,UAAUmI,UAAUxS,IAAI,qBAE7B,MAAMwgH,EAAQvhH,KAAK40B,MACnB,GAAG2sF,aAAiBC,iBAClBD,EAAM3/G,KAAO,MACb2/G,EAAMn+D,aAAe,qBAChB,CACLm+D,EAAMtgD,UAAY,UAElB,MAAMwgD,EAAa/tG,OAAOizC,iBAC1B,GAAG86D,EAAa,EAAG,CACjB,IAAIC,EACD,EAAA3xG,SACD2xG,GAA8B,IAAdD,EACR,EAAAE,aACRD,EAAgB,GAGlBH,EAAMh2G,MAAM0vE,YAAY,mBAAoBymC,EAAgB,K,CAG9D,MAAME,EAAe5hH,KAAKyiD,iBAAiBnoC,KAAKta,MAChDA,KAAKyiD,iBAAoB/1C,IACvBk1G,EAAal1G,IACb,OAAgB1M,KAAK40B,OAAO,EAAK,C,CAIrC2sF,EAAM3zG,iBAAiB,SAAS,KAE9B2zG,EAAMhuG,UAAU/Q,OAAO,SAEvB,MAAMkK,EAAQ1M,KAAK0M,MAUnB,IAAIm1G,EATSr7G,KAAK8X,IAAI5R,EAAM7J,OAAS7C,KAAKshH,UAAUz+G,QAC1C,IAAM7C,KAAKqhH,QAAU,EAAA/lG,iBAC7Btb,KAAKyiD,iBAAiBziD,KAAKshH,UAAY50G,GAGzC1M,KAAKqhH,QAAS,EAEdrhH,KAAKsjD,WAGL,IAAI/hB,EAAmBuiB,EAAsBa,EAA8Bm9D,EAAc,GACnD,MAAnC9hH,KAAK0M,MAAM2d,QAAQ,MAAO,KAC3BrqB,KAAKyiD,iBAAiB,MAEtBo/D,GAAuB,OAAkB7hH,KAAK0M,OAC9C60B,EAAYsgF,EAAqBtgF,UACjCuiB,EAAU+9D,EAAqB/9D,QAC/Bg+D,EAAcD,EAAqBC,YACnCn9D,EAAck9D,EAAqBhoG,KACnC7Z,KAAKyiD,iBAAiBziD,KAAKshH,UAAY//E,EAAY,IAAMA,EAAY,KAGvEggF,EAAMx3F,QAAQ+3F,YAAcA,EAI5BpwF,EAAQyW,SAAWzW,EAAQyW,QAAQ05E,EAAqB,IAG1DN,EAAM3zG,iBAAiB,SAAS,KAC9B5N,KAAKqhH,QAAS,CAAI,IAQpBE,EAAM3zG,iBAAiB,YAAa7F,IAElC,MAAMyE,EAAMzE,EAAEyE,IACd,GAAG,KAAK65C,KAAK75C,KAAUzE,EAAEuZ,UAAWvZ,EAAEsZ,SAAoB,cAAR7U,IAAiC,MAARA,IAAezE,EAAEw4G,UAE1F,OADAx4G,EAAEwuB,kBACK,C,GAOb,E,oGCnGF,MAAMwrF,EAAU12G,SAASC,cAAc,OAEvC,IAAIqO,EADJooG,EAAQxuG,UAAUxS,IAAI,SAGtB,MAAM2b,EAAI,IAAI,IAAoB,SAO3B,SAASslG,IACdtlG,EAAE9J,QAEFmvG,EAAQxuG,UAAU/Q,OAAO,cACzBmX,GAAWlG,cAAckG,GAEzBA,EAAUjG,OAAOhR,YAAW,KAC1Bq/G,EAAQv/G,SACRmX,OAAU1V,CAAS,GAClB,IACL,CAEO,SAASwrB,EAAM9c,EAAwBwI,GAC5CuB,EAAE9J,SAEF,OAAemvG,EAASpvG,GAEpBovG,EAAQ9oG,gBACV5N,SAASI,KAAKC,OAAOq2G,GAChBA,EAAQ16F,YAGf06F,EAAQxuG,UAAUxS,IAAI,cAEtB4Y,GAAWlG,cAAckG,GACzB+C,EAAEgS,KAAKqzF,GAEPpoG,EAAUjG,OAAOhR,WAAWs/G,EAAW,KAEpC7mG,GACDuB,EAAE9O,iBAAiB,SAAUuN,EAAS,CAAClN,MAAM,GAEjD,CAEO,SAASg0G,EAASvwF,GAKvBjC,GAAM,QAAKiC,EAAQhC,YAAagC,EAAQ0hC,mBAAoB1hC,EAAQvW,QACtE,CA9CAuB,EAAE9O,iBAAiB,UAAW8gB,IACxBA,GACFszF,G,uGCAJ,MA4FME,EAAqE,CACzEC,WA7F6C,CAC7C/rF,SAAU,CAACuD,EAAYyoF,EAAgBx6C,KACrC,MAAM1gD,EAAQk7F,EAAe1kG,wBAAwBwJ,MAC/CgC,EAAW,CAACyQ,EAAYyoF,GAY9B,OAXGx6C,GAAS1+C,EAAShY,UACrBgY,EAAS,GAAG3d,MAAMwkB,OAAS,kBAC3B7G,EAAS,GAAG3d,MAAMkR,UAAY,eAAwB,KAARyK,aAC9CgC,EAAS,GAAG3d,MAAMkR,UAAY,eAAeyK,aAE7CyS,EAAWpmB,UAAUxS,IAAI,UACpB44B,EAAWyR,YAEhBzR,EAAWpuB,MAAMkR,UAAY,GAC7Bkd,EAAWpuB,MAAMwkB,OAAS,GAEnB,KACLqyF,EAAe72G,MAAMkR,UAAY2lG,EAAe72G,MAAMwkB,OAAS,EAAE,CAClE,EAEHsyF,cAAc,GA2EdrrF,KAxEuC,CACvCZ,SAAU,CAACuD,EAAYyoF,EAAgBx6C,KAWrC,MAAM1gD,EAAQk7F,EAAe1kG,wBAAwBwJ,MAM/CgC,EAAW,CAACyQ,EAAYyoF,GAW9B,OAVGx6C,GAAS1+C,EAAShY,UACrBgY,EAAS,GAAG3d,MAAMkR,UAAY,gBAAgByK,aAC9CgC,EAAS,GAAG3d,MAAMkR,UAAY,eAAeyK,aAE7CyS,EAAWpmB,UAAUxS,IAAI,UACpB44B,EAAWyR,YAEhBzR,EAAWpuB,MAAMkR,UAAY,GAGtB,KACL2lG,EAAe72G,MAAMkR,UAAY,EAAE,CAkBpC,EAEH4lG,cAAc,IA4PhB,EA/M0B3wF,IACxB,IAAI,QACF/e,EAAO,KACP/Q,EAAI,eACJ46D,EAAc,gBACdtkC,EAAe,QACfggF,GAAU,EAAI,KACdjqG,GAAO,EAAK,sBACZq0G,GAAwB,EAAI,eAC5BzwG,EAAc,aACdwwG,GAAe,GACb3wF,EAEJ,MAAO0E,SAAUmsF,EAAmBF,aAAcG,GAAiBN,EAAYtgH,IAAS,CAAC,EACzF+Q,EAAQoX,QAAQtpB,UAAYmB,OAEPqC,IAAlBu+G,IACDH,EAAeG,GAGjB,MAAMC,EAAuD,IAAIlhH,IACjE,IAAImhH,EAEAvpG,EAAoB,KAExB,GAAGmpG,EAAuB,CACxB,MAAMK,EAAeJ,EAAoB,gBAAkB,eAErDK,EAAc76G,IAGlB,IAFA,OAAYA,GAERA,EAAE1H,OAAuB4Y,gBAAkBtG,EAC7C,OAKF,MAAMyjB,EAAWqsF,EAAyBx/G,IAAI8E,EAAE1H,QAChD+1B,SAAAA,IAEGruB,EAAE1H,SAAW8Y,KAIZupG,GAAqBxK,IAEtBwK,IACDA,EAAkBv0G,UAClBu0G,OAAoBz+G,GAGtBi0B,SAAAA,EAAkBgB,EAAUD,UAE5BtmB,EAAQY,UAAU/Q,OAAO,YAAa,YAAa,iBAEhDyL,IACE4D,EAAgBA,EAAemrC,aAAarqC,EAASgwG,EAAcC,GACjEjwG,EAAQjB,oBAAoBixG,EAAcC,GAC/CzpG,EAAOupG,OAAoBz+G,EAC3Bw+G,EAAyBh9F,U,EAK1B5T,EAAgBA,EAAe9Q,IAAI4R,EAAnBd,CAA4B8wG,EAAcC,GACxDjwG,EAAQ/E,iBAAiB+0G,EAAcC,E,CAG9C,SAAS1pF,EAAUtxB,EAA0BgyB,GAAU,EAAMipF,GACxDA,IACD1pG,EAAO0pG,GAGNj7G,aAAcpE,cACfoE,GAAK,OAAWA,IAGlB,MAAMqxB,EAASC,EAAUD,SACzB,GAAGrxB,IAAOqxB,EAAQ,OAAO,EAIzB,MAAM+xE,EAAKr4F,EAAQwmB,SAASvxB,GAM5B,GAJI,kCAAqD,IAAZqxB,GAAkBopF,KAC7DzoF,GAAU,IAGR0oF,EAAuB,CACzB,MAAM3oG,EAAUhH,EAAQoX,QAAQpQ,aACjB1V,IAAZ0V,GACDlG,cAAckG,UAGThH,EAAQoX,QAAQpQ,O,CAGzB,IAAIigB,EAAS,CACX,GAAGzgB,EAAMA,EAAK5F,UAAU/Q,OAAO,SAAU,KAAM,aAC1C,GAAGwoG,EAAI,CACV,MAAM50E,EAAWqsF,EAAyBx/G,IAAI+nG,GAC9C50E,SAAAA,G,CAaF,OAVG40E,IACDA,EAAGz3F,UAAU/Q,OAAO,KAAM,QAC1BwoG,EAAGz3F,UAAUxS,IAAI,WAGnB4R,EAAQY,UAAU/Q,OAAO,YAAa,YAAa,iBAEnD2W,EAAO6xF,OAEP9yE,SAAAA,EAAkBtwB,G,CAIhB06G,IACF3vG,EAAQoX,QAAQpQ,QAAU,GAAKjG,OAAOhR,YAAW,KAC/CsoG,EAAGz3F,UAAU/Q,OAAO,MACpB2W,GAAQA,EAAK5F,UAAU/Q,OAAO,QAC9BmQ,EAAQY,UAAU/Q,OAAO,YAAa,YAAa,wBAC5CmQ,EAAQoX,QAAQpQ,OAAO,GAC7B6iD,IAGFrjD,IACDA,EAAK5F,UAAU/Q,OAAO,MACtB2W,EAAK5F,UAAUxS,IAAI,SAGrB4R,EAAQY,UAAUxS,IAAI,aACtB,MAAM6mE,EAAU3uC,EAASrxB,EAGzB,IAAIk7G,EAcJ,GAhBAnwG,EAAQY,UAAU1J,OAAO,aAAc+9D,GAGnCojC,IAGCuX,EACDO,EAA0BP,EAAkBvX,EAAI7xF,EAAMyuD,GAEtDojC,EAAGz3F,UAAUxS,IAAI,UAGnBiqG,EAAGz3F,UAAU/Q,OAAO,QACpBwoG,EAAGz3F,UAAUxS,IAAI,OAGhBiqG,EAAI,CACL,MAAM+X,EAAoB/X,EAAGjhF,QAAQg5F,kBAClCA,GACDtvG,cAAcsvG,GAGhBN,EAAyB7+G,IAAIonG,GAAI,KAC/BA,EAAGz3F,UAAU/Q,OAAO,MACpBigH,EAAyBxhH,OAAO+pG,EAAG,G,CAIvC,GAAG7xF,EAAqB,CACtB,IAAIQ,EACJ,MAAMqpG,EAAQ7pG,EACRid,EAAW,KACf3iB,aAAakG,GACbqpG,EAAMzvG,UAAU/Q,OAAO,SAAU,QAEjCsgH,SAAAA,IAEAL,EAAyBxhH,OAAO+hH,EAAM,EAGrChY,GACDrxF,EAAUjG,OAAOhR,WAAW0zB,EAAUomC,EAAiB,KACvDimD,EAAyB7+G,IAAIo/G,EAAO5sF,KAEpCzc,EAAUjG,OAAOhR,WAAW0zB,EAAUomC,GACtCimD,EAAyB7+G,IAAIo/G,GAAO,KAClCvvG,aAAakG,GACb8oG,EAAyBxhH,OAAO+hH,EAAM,KAI1CA,EAAMj5F,QAAQg5F,kBAAoB,GAAKppG,EAEpCu+F,IACGwK,IACFA,GAAoB,WAItB,QAA4BA,EAAoC,EAAjBlmD,G,CAInDrjD,EAAO6xF,CACT,CAOA,OAJA9xE,EAAUD,OAAS,IAAM9f,GAAO,OAAWA,IAAS,EACpD+f,EAAU40E,QAAU,IAAM30F,EAC1B+f,EAAU60E,QAAWiV,GAAuB7pG,EAAO6pG,EAE5C9pF,CAAS,C,sEClVH,SAAS+pF,EAAgBjiF,GACtC,OAASA,EAASn+B,QAAU,GAAKm+B,EAASn+B,QAAU,KAAQm+B,EAASn+B,SAAW,kBAAkBwjD,KAAKrlB,EACzG,CCWO,MAAMkiF,UAA2B,KActCnjH,YACE2xB,EACQzqB,GAERiL,MAAMwf,GAFE,KAAAzqB,SAAAA,EAIRjH,KAAKmjH,wBAAyB,EAAA1pG,EAAA,GAASzZ,KAAKojH,cAAc9oG,KAAKta,MAAO,KAAK,GAAO,GAElF0xB,EAAQ7f,eAAe9Q,IAAIf,KAAK40B,MAAhClD,CAAuC,SAAS,K,YAC9C,MAAMhlB,EAAQ1M,KAAKsxG,WAGnB,GADAtxG,KAAK2vB,WAAQ1rB,EACVyI,IAAU1M,KAAK4hE,gBAAkBl1D,EAAM7J,OAGxC,OAFA7C,KAAKgiE,SAAS,mBACO,QAArB,KAAAhiE,KAAK0xB,SAAQ4C,gBAAQ,kBAEZ2uF,EAAgBv2G,GAGzB1M,KAAKgiE,SAAS,cAFdhiE,KAAKkiE,SAASliE,KAAK0xB,QAAQo7E,aAK1B9sG,KAAK40B,MAAMrhB,UAAUqB,SAAS,SACV,QAArB,KAAA5U,KAAK0xB,SAAQ4C,gBAAQ,iBAIvBt0B,KAAKmjH,uBAAuBz2G,EAAM,GAEtC,CAEO4kG,WACL,IAAI5kG,EAAQ1M,KAAK0M,MAMjB,OALG1M,KAAK0xB,QAAQ6/E,OACd7kG,EAAQA,EAAMojB,MAAM9vB,KAAK0xB,QAAQ6/E,KAAK1uG,QACtC7C,KAAKyiD,iBAAiBziD,KAAK0xB,QAAQ6/E,KAAO7kG,IAGrCA,CACT,CAEQ02G,cAAcpiF,GACpB,GAAGhhC,KAAKqjH,qBAAsB,OAG9B,IAAIC,EADJtjH,KAAK2vB,WAAQ1rB,EAGXq/G,EADCtjH,KAAK0xB,QAAQ1pB,OACChI,KAAKiH,SAAS88B,gBAAgBq/E,cAAcpjH,KAAK0xB,QAAQ1pB,OAAO+4B,WAAYC,GAE5EhhC,KAAKiH,SAASk6B,gBAAgBiiF,cAAcpiF,GAG7D,MAAMzyB,EAAUvO,KAAKqjH,qBAAuBC,EAAah1G,MAAMi1G,IAC1DvjH,KAAKsxG,aAAetwE,IAEpBuiF,EACDvjH,KAAKgiE,SAAS,WAAkBhiE,KAAK0xB,QAAQk7E,eAE7C5sG,KAAKkiE,SAASliE,KAAK0xB,QAAQm7E,W,IAE3BrnG,IACCxF,KAAKsxG,aAAetwE,IAEvBhhC,KAAK2vB,MAAQnqB,EAEN,gCADCA,EAAiB5D,KAErB5B,KAAKkiE,SAASliE,KAAK0xB,QAAQm7E,WAM3B7sG,KAAKkiE,SAASliE,KAAK0xB,QAAQo7E,a,IAI9Bx+F,MAAK,K,QACHtO,KAAKqjH,uBAAyB90G,IAC/BvO,KAAKqjH,0BAAuBp/G,GAGT,QAArB,KAAAjE,KAAK0xB,SAAQ4C,gBAAQ,iBAErB,MAAM5nB,EAAQ1M,KAAKsxG,WAChB5kG,IAAUs0B,GAAYhhC,KAAK6hE,mBAAqBohD,EAAgBv2G,IACjE1M,KAAKojH,cAAc12G,E,GAGzB,E,gdC5Fa,MAAM82G,UAAyB,IAG5CzjH,YAAY2xB,GAO6Cxf,MAAM,CAC3DgG,KAAM,yBACN5E,QAAUoe,EAAQ1pB,OAAO66B,SAAoC,uBAAzB,yBAGtC,MAAM,OAAC76B,EAAM,KAAEo4B,EAAI,mBAAEssE,EAAkB,eAAE76F,EAAc,WAAEqlB,GAAcxF,EACjEzqB,EAAW,aACXq1F,EAAYt0F,EAAO66B,cAAW5+B,EAAY+D,EAAO+4B,WAEjD8H,EAAU7oC,KAEVyjH,EAAa,YACbpwF,EAAOhoB,SAASC,cAAc,OAGpC,IAAIo4G,EAFJrwF,EAAK9f,UAAUxS,IAAI0iH,GAQnB,MAAME,EAAa,IAAI,IAA2B,CAChDrJ,SAAWp4G,GAAYwhH,EAAW7gH,OAAS6gH,EAAW16G,WAAWg4B,GAAaA,EAASA,WAAa9+B,EAAQ0F,KAC5G4yG,SAAWt4G,IACTA,EAAQ08B,IAAIxzB,UAAU5I,QAAQ,EAEhCszF,OAAQ,CAAC5zF,EAAS6G,MAChB,OAAuB7G,EAAQ08B,IAAIxzB,UAAWioB,EAAMtqB,EAAI,EAE1D8xG,gBAAkBC,IAChB,MAAM95E,EAAW0iF,EAAWhjH,MAAMsgC,GAAaA,EAASA,WAAa85E,EAAKlzG,KACpEg3B,EAAM,IAAI,KAAI,CAClB7vB,MAAO,IAAMiyB,EAASA,SACtBlC,UAAU,EACV7L,WAAW,IAGP2wF,IAAa5iF,EAASvzB,OAAOm2G,SAC7B79F,IAAWib,EAASvzB,OAAOsY,OAejC,OAbG69F,IAAUhlF,EAAIxzB,UAAU2e,QAAQ65F,SAAW,KAC9ChlF,EAAIxzB,UAAU2e,QAAQiX,SAAWA,EAASA,SAC1CpC,EAAIxzB,UAAUmI,UAAUxS,IAAI0iH,EAAa,aACzC7kF,EAAIE,SAASvrB,UAAUxS,IAAI0iH,EAAa,oBAC1B7kF,EAAIggD,YAAY,UACxBrrE,UAAUxS,IAAI0iH,EAAa,iBAAkB,SAEnD7kF,EAAIkgD,eAEJ+kC,EAAajlF,EAAK7Y,GAEjB+0F,EAAwBl8E,IAAMA,EAExBk8E,CAAsB,IAI3B+I,EAAe,CAACjlF,EAAU7Y,KAC9B6Y,EAAIE,SAAS6D,iBAAgB,QAAK/D,EAAIxzB,UAAU2e,QAAQ65F,SAAW,uBAA0B79F,EAAS,qBAAuB,yBAC7H6Y,EAAIxzB,UAAUmI,UAAU1J,OAAO,SAAUkc,GACzC6Y,EAAIogD,cAAcj5D,EAAO,EAGrB+9F,EAAiB,CAACh5C,EAAwB,MAC9C44C,EAAa54C,EAEb64C,EAAWI,SAASh/G,SAAS7C,IACvB4oE,EAAUtN,MAAMx8B,GAAaA,EAASA,WAAa9+B,EAAQ0F,MAC7D+7G,EAAW1iH,OAAOiB,EAAQ0F,G,IAI9BkjE,EAAU/lE,SAASi8B,IACjB,GAAI2iF,EAAWtgH,IAAI29B,EAASA,UAErB,CACL,MAAM9+B,EAAUyhH,EAAW1gH,IAAI+9B,EAASA,UACxC2iF,EAAWzhF,OAAOlB,EAASA,SAAU9+B,GACrC2hH,EAAa3hH,EAAQ08B,MAAOoC,EAASvzB,OAAOsY,O,MAJ5C49F,EAAW5iH,IAAIigC,EAASA,S,IAQ5B6H,EAAQz9B,UAAUmI,UAAU1J,OAAO,QAAS85G,EAAWI,SAASl8G,KAAK,EAGvEi8G,EAAe1jF,EAAK0qC,WAEpBj5D,EAAe9Q,IAAI,IAAnB8Q,CAA8B,mBAAmB,EAAO7J,OAAQg8G,KAAa,EAAD,gCAC1E,GAAGA,IAAYh8G,EACb,OAGF,MAAMo4B,QAAan5B,EAASqI,gBAAgB+wB,QAAQr4B,GACpD87G,EAAgB1jF,EAAmB0qC,UACrC,MAEA,IAAIm5C,GAAc,GAClB,QAAiB5wF,GAAYtrB,GAAM,EAAD,gCAChC,GAAGk8G,EAED,YADAA,GAAc,GAIhB,MAAM74G,GAAY,OAAcrD,EAAE1H,OAAuBgzB,GACzD,IAAIjoB,EACF,OAGF,GAAGA,EAAU2e,QAAQ65F,SAEnB,YADA,OAAgBlX,EAAmB93E,OAAO,GAAM,GAIlD,MAAMoM,EAAW51B,EAAU2e,QAAQiX,SAE7Bjb,EAAS3a,EAAUmI,UAAUqB,SAAS,UAC5C,IAAI4lD,EAA2BC,EAC5B10C,GACDy0C,EAAe,yBACfC,EAAqB6hC,EAAY,uCAAyC,yCAE1E9hC,EAAe,uBACfC,EAAqB6hC,EAAY,qCAAuC,sCAG1E,UACQ,OAAkB,CACtB9hC,eACAC,qBACAnkD,OAAQ,CACNokD,QAAS30C,EAAS,OAAS,S,CAG/B,MAAMvgB,GACN,M,CAGF,MAAM0+G,GAAan+F,EACnB,IAAIxX,EAEFA,EADC+tF,EACSr1F,EAAS88B,gBAAgBogF,eAAe7nB,EAAWt7D,EAAUkjF,GAE7Dj9G,EAASk6B,gBAAgBgjF,eAAenjF,EAAUkjF,GAG9D31G,EAAQ0J,OAAOzS,IACG,8BAAbA,EAAI5D,MACL,OAAkB,CAChB44D,aAAc,6BACdC,mBAAoB,+BACpBnkD,OAAQ,CAACokD,QAAS,KAAM/W,UAAU,KACjC1rC,MAAM,KAET7L,QAAQujB,MAAM,sBAAuBnqB,E,GAG3C,MAEA,IAAI,IAAS,CACX6tB,OACA6D,aACA4+D,OAAQ,CAAC/sF,EAAKitF,KACZ,MAAMh1D,EAAW0iF,EAAWvxF,OAAOppB,EAAK,GAAG,GAC3C26G,EAAWvxF,OAAO6jE,EAAQ,EAAGh1D,GAC7B2iF,EAAWxI,aAIX,MAAMrwC,EAAY44C,EAAW3zF,QAAQiR,GAAaA,EAASvzB,OAAOsY,SAAQjL,KAAKkmB,GAAaA,EAASA,WAClGs7D,EACDr1F,EAAS88B,gBAAgBqgF,iBAAiB9nB,EAAWxxB,GAErD7jE,EAASk6B,gBAAgBijF,iBAAiBt5C,E,IAKhDjiC,EAAQl2B,QAAQjH,OAAO2nB,EACzB,E,+CCzMa,MAAMgxF,EAKnBtkH,YAAY+2D,EAAwCplC,GAH5C,KAAAc,MAAkC,IAAIjxB,IACtC,KAAA+iH,QAAS,EAGftkH,KAAKC,SAAW,IAAIC,sBAAsBC,IACxC,GAAGH,KAAKskH,OACN,OAGF,MAAMr5D,EAAoC,GAE1C9qD,EAAQ4E,SAAQ,CAAC3E,EAAO6xB,KACtB,MAAM5xB,EAASD,EAAMC,OAErB,GAAGL,KAAKwyB,MAAMvvB,IAAI5C,KAAYD,EAAMS,eAClC,OAEAb,KAAKwyB,MAAM5uB,IAAIvD,EAAQD,EAAMS,gBAW/B,MAAM0jH,EAA4B,CAAClkH,SAAQS,QAASV,EAAMS,eAAgBT,QAAO6xB,SAIjFg5B,EAAQ5oD,KAAKkiH,EAAO,IAKtBt5D,EAAQlmD,SAAS/B,IACf8zD,EAAmB9zD,EAAK,GACxB,GACD0uB,EACL,CAEOo+B,aACL,MAAMt9B,EAAsB,GAO5B,OANAxyB,KAAKwyB,MAAMztB,SAAQ,CAAC2H,EAAOF,KACtBE,GACD8lB,EAAMnwB,KAAKmK,E,IAIRgmB,CACT,CAEOu9B,eACL,MAAMjvD,EAAUd,KAAK8vD,aACrB,IAAI,MAAMzvD,KAAUS,EAClBd,KAAKwyB,MAAM5uB,IAAIvD,GAAQ,EAE3B,CAEOgkB,UAAUhkB,GACf,OAAOL,KAAKwyB,MAAMvvB,IAAI5C,EACxB,CAEOs5D,aACL35D,KAAKC,SAAS05D,aACd35D,KAAKwyB,MAAM/M,OACb,CAEOgoC,UACLztD,KAAKC,SAAS05D,aAGd,MAAM7+B,EAAU,IAAI96B,KAAKwyB,MAAMpuB,QAC/B,IAAI,MAAM/D,KAAUy6B,EAElB96B,KAAKC,SAAS0D,QAAQtD,EAG1B,CAEOmkH,iBACL,MAAM1jH,EAAUd,KAAK8vD,aACrB,IAAI,MAAMzvD,KAAUS,EAClBd,KAAKC,SAAS6C,UAAUzC,GAG1B,IAAI,MAAMA,KAAUS,EAClBd,KAAKC,SAAS0D,QAAQtD,EAE1B,CAEOsD,QAAQtD,GACbL,KAAKwyB,MAAM5uB,IAAIvD,GAAQ,GACvBL,KAAKC,SAAS0D,QAAQtD,EACxB,CAEOyC,UAAUzC,GACfL,KAAKC,SAAS6C,UAAUzC,GACxBL,KAAKwyB,MAAMvxB,OAAOZ,EACpB,CAEOmtD,SACLxtD,KAAKskH,QAAS,CAChB,CAEOlpF,mBACLp7B,KAAKwtD,SACLxtD,KAAKytD,SACP,CAEOtoD,OACLnF,KAAKskH,QAAS,CAChB,E,yFCjHa,MAAMG,UAAuB,IAK1C1kH,YAAsB8R,EAA0CiV,GAAW,GACzE5U,MAAM,CACJuQ,KAAM,IACN7b,IAAK,EACLH,IAAK,EACLqgB,YACC,GANiB,KAAAjV,eAAAA,EAA0C,KAAAiV,SAAAA,EAsCxD,KAAA49F,YAAe38G,IACrBA,IAAK,OAAYA,GACjB,WAAoC,SAAgC,EAG/D,KAAA48G,UAAY,KAEjB,MAAM,OAAC73G,EAAM,MAAEC,GAAS,IACxB,IACI63G,EAEFA,GADE93G,GAAUC,EACA,EACJD,EAAS,GACL,EACJA,EAAS,GAAKA,EAAS,IACnB,EAEA,EAGd23G,EAAeI,MAAM9/G,SAASgP,GAAS/T,KAAK+T,KAAKR,UAAU/Q,OAAO,SAAWuR,KAC7E/T,KAAK+T,KAAKR,UAAUxS,IAAI,SAAW0jH,EAAeI,MAAMD,IAEpD5kH,KAAKukB,WACPvkB,KAAKykB,YAAY1X,EAAQ,EAAID,E,EAtD/B9M,KAAKqU,eACLrU,KAAK2iB,YAAY,CACfC,QAASrc,IACP,MAAMmG,EAAQlG,KAAKC,IAAID,KAAKI,IAAIL,EAAa,GAAI,GAIjD,WAAmC,EACnC,WAAoCmG,CAAK,IAQ7C,MAAM2O,EAAY,gBACZrC,EAAMhZ,KAAKgZ,IAAM3N,SAASC,cAAc,OAC9C0N,EAAIzF,UAAUxS,IAAI,WAAYsa,GAC9B,MAAMtH,EAAO/T,KAAK+T,KAAO1I,SAASC,cAAc,QAChDyI,EAAKR,UAAUxS,IAAIsa,EAAY,UAE/BrC,EAAItN,OAAOqI,EAAM/T,KAAKoL,YAEtB,QAAiB2I,EAAM/T,KAAK0kH,YAAa,CAAC7yG,eAAgB7R,KAAK6R,iBAC/D7R,KAAK6R,eAAe9Q,IAAI,IAAxBf,CAAoD,iBAAkBA,KAAK2kH,WAE3E3kH,KAAK2kH,WACP,EAxCe,EAAAE,MAAQ,CAAC,aAAc,cAAe,cAAe,Y,qECLvD,SAASC,GAAgB,OACtCjsC,EAAM,aACNthD,EAAY,WACZL,EAAU,cACVtV,EAAa,gBACb40C,EAAe,eACf95B,IAKA,MAAM1oB,EAAO,IAAI+wG,OAAOlsC,EAAOh2E,QACzBwS,EAA4B,GAmBlC,OAlBAwjE,EAAO9zE,SAAQ,CAACqC,EAAO2B,KACrBsM,EAAShT,KAAK,CACZuN,EAAG,2BACH+tB,OAAQ50B,EACRlG,OAAQ,EACRixF,YAAa1sF,GACb,KAGY,QAAa4M,EAAM,CACjCqB,WACAkiB,eACAmF,iBACA85B,kBACAt/B,aACAtV,iBAIJ,CAEO,SAASojG,EAAuBtzF,G,MACrC,MAAM6F,EAAmD,QAAvC,EAAmB7F,EAAQ6F,oBAAY,QAApB7F,EAAQ6F,aAAiB,GACxD0E,EAAU6oF,EAAgBpzF,GAChC,OAAOrM,QAAQqH,IAAI6K,GAAcjpB,MAAK,IAAM2tB,GAC9C,C,uiBCFe,SAAegpF,GAAa,QAAC98G,EAAO,SAAE60B,EAAQ,WAAEC,EAAU,aAAEC,EAAY,WAAElF,EAAU,cAAE5tB,EAAa,aAAEmtB,EAAY,iBAAE4F,EAAgB,cAAEvb,EAAa,SAAEsuB,EAAQ,SAAEjpC,EAAW,aAAkB,aAAEM,EAAY,SAAE0oC,EAAQ,QAAE7S,I,+CAgBlOH,UAAAA,EAAe,KACfiT,UAAAA,EAAa,IACbD,UAAAA,EAAa,IACb,MAAMi1E,EAAsC,IAArB/nF,EAEjBx7B,EAAQwG,EAAQzC,MAA4C2F,UAAclD,EAAQzC,MAA2C63B,QAA4BlyB,SACzJ85G,EAAiBh9G,aAAO,EAAPA,EAAS2kC,kBAChC,GAAgB,UAAbnrC,EAAIC,MAAiC,UAAbD,EAAIC,MAAiC,UAAbD,EAAIC,KAAkB,CACvE,MAAMwjH,EAAe,IAAI,KAgBzB,OAfAA,EAAapoF,SAAWA,EACxBooF,EAAaj9G,QAAUA,EACvBi9G,EAAaF,eAAiBA,EAC9BE,EAAaxjG,cAAgBA,EAC7BwjG,EAAa7tF,aAAeA,EAC3B6tF,EAAqBhoF,QAAUA,EAE7BF,IAAckoF,EAAaloF,aAAeA,GAC1C9yB,IAAeg7G,EAAah7G,cAAgBA,GAC5C4tB,IAAYotF,EAAaptF,WAAaA,GAEzCotF,EAAar7F,QAAQkT,WAAa,GAAKA,EACvCmoF,EAAar7F,QAAQkmB,SAAW,GAAKA,EACrCm1E,EAAar7F,QAAQmmB,SAAWA,QAC1Bk1E,EAAa14E,SACZ04E,C,CAGT,MAAMC,EAAc1jH,EAAIkO,UAAYlO,EAAIkO,UAAUkY,MAAM,KAAO,GAC/D,IAAIu9F,EAAM,GACVA,EAAMD,EAAYxiH,OAAS,GAAKqW,MAAMs/D,QAAQ6sC,IAC5C,QAAqBA,EAAYl8F,MAAMpB,MAAM,IAAK,GAAG,GAAGiE,eACxD,OAEF,MAAMu5F,EAASl6G,SAASC,cAAc,OACtCi6G,EAAOhyG,UAAUxS,IAAI,WAAY,OAAOukH,KACxCC,EAAOx7F,QAAQ3iB,MAAQ,GAAKzF,EAAIiG,GAC/B29G,EAAe5jH,IAAMA,EAItB,MAAM6jH,EAASn6G,SAASC,cAAc,OAEtC,IAAIm6G,EADJD,EAAOjyG,UAAUxS,IAAI,gBAGrB,MAAM2kH,IAAen+G,EACfE,EAAkB,IACfi+G,EAAan+G,EAAeN,EAASO,cAAcC,gBAAgB9F,GAG5E4F,QAAqBE,IACrB,IAAIk+G,GAAW,EACf,IAAc,QAAV,EAAAhkH,EAAIsN,cAAM,eAAEpM,SAAWsF,EAAQsF,OAAOo/B,aAAetlC,EAAaG,KAAoB,UAAb/F,EAAIC,KAA2D,CAC1I2jH,EAAOhyG,UAAUxS,IAAI,uBACrB4kH,GAAW,EAEX,MAAM70E,EAAoE,GAE1E,GAAG3oC,EAAQsF,OAAOo/B,aAAe,CAAC,QAAS,SAAS93B,SAASpT,EAAIC,OAAS2F,EAAaG,IACrF89G,EAAOziG,UAAY,aAAaxb,EAAaG,QAC7CopC,EAAKzuC,KAAKmjH,EAAOjwG,uBACZ,CACQqwG,YAAYtoG,MAAzB,MACM2e,QAAgB,OAAU,CAC9BO,MAAO76B,EACPwG,QAAS,KACTiD,UAAWo6G,EACXrpF,SAAU,GACVC,UAAW,GACX7E,eACA+E,kBAAkB,EAClB1a,gBACA/Z,MAAM,OAAgBlG,EAAK,GAAI,IAAI,GACnCsF,aAGFu+G,EAAOj6G,MAAM2b,MAAQs+F,EAAOj6G,MAAM+b,OAAS,GACxC2U,EAAQW,OAAOvtB,OAAOyhC,EAAKzuC,KAAK45B,EAAQW,OAAOvtB,OAC/C4sB,EAAQW,OAAOC,MAAMiU,EAAKzuC,KAAK45B,EAAQW,OAAOC,K,CAGnDiU,EAAK/rC,SAAS+oB,GAAQA,EAAIva,UAAUxS,IAAI,mB,MAExC0kH,EAAYp6G,SAASC,cAAc,QACnCm6G,EAAUlyG,UAAUxS,IAAI,qBACxB0kH,EAAUlnF,UAAY+mF,EACtBE,EAAO95G,OAAO+5G,GAIhB,MAAMI,EAAWlkH,EAAIkO,WAAY,OAAclO,EAAIkO,WAAa,eAC1CxE,SAASC,cAAc,OAC/BiI,UAAUxS,IAAI,wBAC5B,MAAM+kH,EAAiBz6G,SAASC,cAAc,QAIxCy6G,EAAgE,EAHtD,OAAYpkH,EAAIkG,OAahC,GARGm1B,GACD+oF,EAAiB1jH,MAAK,QAAmB8F,EAAQqO,OAGhDwhB,GACD+tF,EAAiB1jH,WAAW,OAAiB8F,KAG3C60B,IAAahF,EAAY,CAC3B,MAAM/H,EAAI5kB,SAASC,cAAc,QAC3B06G,GAAa,OAAYrkH,EAAIkG,MACnCooB,EAAEvkB,OAfgB,MAeIs6G,GACtB/1F,EAAE1kB,MAAM+N,WAAa,SACrBysG,EAAiB1jH,KAAK4tB,E,CAGxBs1F,EAAOxiG,UAAY,OAChBxb,EAAawmB,aAAeo3F,IAAoBh9G,EAAQF,MAAQ09G,EAAW,GAAK,wHAKnF,MAAMx1B,EAAUo1B,EAAO3tG,cAAc,kBAC/Bo4B,EAAmB,IAAI,IAC7BA,EAAiBjmB,QAAQkT,WAAa,GAAKA,EAC3C+S,EAAiBjmB,QAAQkmB,SAAW,GAAKA,EACzCD,EAAiBjmB,QAAQmmB,SAAWA,EACnCF,EAAyB5S,QAAUA,EACpC4S,EAAiBp3B,YAAcitG,EAI3B19G,EAAQF,KACVs9G,EAAOhyG,UAAUxS,IAAI,cAGvBovF,EAAQzkF,OAAOskC,GAEZhY,GACDm4D,EAAQzkF,QAAO,OAAavD,IAG9B,MAAM89G,EAAUV,EAAO3tG,cAAc,kBAMrC,GALAkuG,EAAep6G,WAAU,QAAiBq6G,EAAkB,QAC5DE,EAAQv6G,OAAOo6G,GAEfP,EAAOvtG,QAAQwtG,IAEXL,GAAkBh9G,EAAQsF,OAAOo/B,cAAgB1kC,EAAQF,IAC3D,OAAOs9G,EAGT,IAAIv4E,GAA0B7wB,GAAkC,KAChE,MAAMqlB,GAAS,KAGb,GAFA+jF,EAAOhyG,UAAU/Q,OAAO,eAEDb,EAAIkG,KAAO,OAAuBs9G,EAKvD,OAJAhpG,GAAUmU,YACVnU,GAAU6S,OAAOge,IACjB7wB,GAAUA,UAAU5I,UAAUxS,IAAI,eAClCob,GAAUs1B,oBAAoB7uC,IAQhC,GAJGjB,EAAIkG,MAAQ,MACb09G,EAAOhyG,UAAUxS,IAAI,cAGpBisC,GAAa,CACd,GAAGA,KAAgBw4E,EAAQ,CACzB,MAAMU,EAAel5E,GACrBtqC,YAAW,KACTwjH,EAAa1jH,QAAQ,GACpB,I,CAGLwqC,GAAc,I,CAGb7wB,KACDA,GAAY,K,EAIVgqG,GAAmB53G,IACvBg3G,EAAOhyG,UAAUxS,IAAI,eAErB,MAAMqlH,EAAgB/6G,SAASC,cAAc,QACvC+6G,GAAkB,OAAY1kH,EAAIkG,MACxCu+G,EAAc76G,MAAMwuB,SAAW,WAC/BqsF,EAAc76G,MAAMuZ,KAAO,IAC3BvW,EAAQD,KAAKkzB,GAAQ,KAAMrpB,SAAQ,KAEjC2tG,EAAev6G,MAAM+N,WAAa,GAClC8sG,EAAc5jH,QAAQ,IAMxB,MAAMswF,EAAU5jF,IAAkB,OAAYA,GAC9C,IAAIwb,EAAIooE,EAAO,GACfgzB,EAAev6G,MAAM+N,WAAa,SAElC8sG,EAAc16G,OAAOgf,EA5GH,MA4GmB27F,GACrCP,EAAe7sG,cAAcvN,OAAO06G,GACpC73G,EAAQ2rE,mBAAmBriE,IACzB,MAAMyuG,EAAKxzB,EAAOj7E,EAASu5B,MAC3B1mB,EAAEoC,YAAYw5F,GACd57F,EAAI47F,CAAE,GACN,EAIE1jH,GAAQmF,I,MACZ,MAAMmtG,GAAQntG,GAAKA,EAAE0B,UACf9H,EAAO4jH,EAAe5jH,IAE5B,IAAIwU,EACJ,MAAM9C,EAAU,kBAA4B,6CAAkDpP,EAC9F,GAAIixG,EAEG,GAAgB,QAAbvzG,EAAIC,KAAgB,CAC5B,MAAM2kH,GAAyEpqG,IAAaA,GAAUg9D,SACtGhjE,EAAW,qBAAoC,CAACzQ,MAAO/D,EAAK0R,YACzDkzG,GACDpwG,EAAS7H,MAAK,KACZ5L,YAAW,IAAW,EAAD,gCACnB,MAAMgF,SAAaD,KAAmBC,IACtCgM,OAAOgb,KAAKhnB,EACd,KAAG,+BAAuC,IAAM,EAAE,G,MAItDyO,EADQ,QAA+BxU,EAAI+U,aAAwB,QAAV,EAAA/U,EAAIsN,cAAM,eAAEpM,QAC1D,qBAAoC,CAAC6C,MAAO/D,EAAK0R,YAEjD,mBAAkC,CAAC3N,MAAO/D,EAAK0R,iBAf1D8C,EAAW,mBAAkC,CAACzQ,MAAO/D,EAAK0R,YAAU,GAkBtE8C,EAAS8B,OAAM,KACbstG,EAAOhyG,UAAU/Q,OAAO,cAAc,IAGrCwqC,KACD7wB,GAAU6S,OAAOge,IAAa,EAAM72B,GACpCgwG,GAAgBhwG,G,GAIb0vG,SAAUW,KAAoB,OAAwB,CAAC9gH,MAAO/D,EAAK8kH,WAAY,MACtF,SAASx/G,EAASy/G,eAAeC,cAAcH,IAAmB,CAChEx5E,GAAcu4E,EAAO3tG,cAAc,uBAAyB4tG,EAC5D,MAAMj3G,EAAU,mBAAkC,CAAC7I,MAAO/D,IAAM,GAEhEwa,GAAY,IAAI,IAChBA,GAAU6S,OAAOge,IAAa,EAAOz+B,GACrC4N,GAAUs1B,oBAAoB7uC,IAC9BujH,GAAgB53G,E,MACX,IAAIhH,EAAawmB,YAAco3F,EAMpC,GALAn4E,GAAcu4E,EAAO3tG,cAAc,uBAAyB4tG,EAC5DrpG,GAAY,IAAI,IAAqB,CACnCi9D,WAAY+rC,IAGVA,EASG,CACL,MAAM1e,EAAgB,cAA6B0e,GACnDhpG,GAAUgU,cAAcs2E,GACxBtqF,GAAU6S,OAAOge,IACjBm5E,GAAgB1f,E,MAZhBtqF,GAAUhR,YACVgR,GAAUmU,YACVnU,GAAU6S,OAAOge,IACjB7wB,GAAUs1B,oBAAoB7uC,SAENqB,IAArBk5B,GAAkCA,GAAoBx7B,EAAIkG,OAC3D,QAAmBsU,GAAUA,WAsBnC,OAZA,QAAiBopG,GAASx9G,KACrB,OAAgBA,EAAE1H,OAAQ,UAI1B8b,GACDA,GAAUlI,QAAQlM,GAElBnF,GAAKmF,G,IAIFw9G,C,IA5TT,qBAA2B,wBAAyBn+G,IACjC8R,MAAMC,KAAK9N,SAASoN,iBAAiB,0BAA0BrR,QACvErC,SAAS7C,IACbA,EAAQ0V,cAAc,iCACvB,QAAmB1V,E,GAErB,G,6DClCW,SAASgpE,EAAgB7pC,GACtC,MAAO,KAAM,OAAkBA,GAAOE,SACxC,C,gFCCe,SAAeT,EAAqB4F,EAAgBz/B,EAAW,c,qDAC5E,MAAMu5C,QAAmBv5C,EAAS88B,gBAAgBgoC,QAAQrlC,GAC1D,GAAc,kBAAX8Z,EAAK5wC,EACN,OAAO,QAAK,iBAGd,MAAMy0B,QAAiBp9B,EAASi9B,kBAAkB6xE,kBAAkBrvE,GACpE,IAAIzR,EAGAA,EAFDoP,EACiB,gBAAfA,EAASz0B,EACFy0B,EAAS/D,mBAEgE,QAAxE,EAAA+D,EAAS9D,aAAmDA,oBAAY,eAAE19B,OAG5E29C,EAAmBlgB,qBAAgD,QAAzB,EAAAkgB,EAAajgB,oBAAY,eAAEA,aAAa19B,QAI7FoyB,EAAQA,GAAS,EAEjB,MAAMzoB,EAHeg0C,EAAsB/yC,OAAO4uF,UAGX,0BAA4B,qBACnE,OAAO,QAAK7vF,EAAK,EAAC,OAAuByoB,I,yXCZ5B,SAAeq5C,EAC5B58C,G,qCAEA,MAAM,OACJ1pB,EAAS,SAAc,UACvBwH,EAAS,cACTC,EAAa,aACbu+D,EAAY,SACZ/mE,EAAW,aAAkB,SAC7BgM,GACEye,EAEJ,IAAI3iB,EAAQ,GACZ,GAAG/G,EAAO66B,SAAU,CAClB,MAAM3B,QAAaj6B,EAASk6B,gBAAgBC,QAAQp5B,EAAO+6B,YACxD7B,IACEA,EAAKs6C,aAAYzsE,GAASmyB,EAAKs6C,aAC/Bt6C,EAAKu6C,WAAehsE,GAAkBV,IAAQA,GAAS,IAAMmyB,EAAKu6C,YAIlE1sE,EADDA,EACSA,EAAM0lB,QADCyM,GAAQA,EAAKzzB,OAAOq2B,QAAU,YAAYr0B,EAAgB,UAAY,cAAc,IAAQ,OAAuByxB,GAAM,IAAM,E,KAE9I,CACL,GAAGjuB,EAAU,CACX,MAAMg7D,QAAchnE,EAASk7B,eAAe64C,cAAchzE,EAAQiL,GAClElE,GAAQk/D,aAAK,EAALA,EAAOl/D,QAAS,E,CAG1B,IAAIA,EAAO,CACT,MAAMyxC,QAAav5C,EAAS88B,gBAAgBgoC,QAAQ/jE,EAAO+4B,YAC3DhyB,GAAQyxC,aAAI,EAAJA,EAAMzxC,QAAS,E,CAGtBU,IACDV,EAAQA,EAAMgZ,MAAM,KAAK,G,CAQ7B,YAJoB9jB,IAAjB+pE,IACDj/D,GAAQ,OAAcA,EAAOi/D,EAAcA,IAGtCx+D,EAAYT,GAAQ,OAAcA,EAC3C,E,+WCrDe,SAAS+zB,EAAoB5B,G,MAC1C,IAAIA,EACF,OAAO71B,SAASC,cAAc,QAGhC,IAAIkB,EACAmsD,EAEJ,OAAOz3B,EAAKt5B,IACV,KAAK,gBACH4E,EAAM,4BACN,MACF,KAAK,gBACHA,EAAM,4BACN,MACF,QACE,GAAG00B,EAAKzzB,OAAOy9E,IAAK,CAClB1+E,EAAM,MACN,K,CAGF,GAAG00B,EAAKzzB,OAAOm5G,QAAS,CACtBp6G,EAAM,gBACN,K,CAGF,OAAkB,QAAX,EAAA00B,EAAK8+D,cAAM,eAAEpwF,GAClB,IAAK,qBACHpD,EAAM,SACN,MAGF,IAAK,qBACHA,EAAM,cACN,MAGF,IAAK,sBACHA,EAAM,eACN,MAGF,IAAK,oBAAqB,CACxB,MAAMgK,EAAO0qB,EAAK8+D,OAAO6mB,WACnBC,EAAQ,IAAIzpG,KAGZkO,GAFMu7F,EAAM7gF,UAAY,IAAO,GAElBzvB,EACnB,GAAG+U,EAAO,GACR/e,EAAM,2BACD,GAAG+e,EAAO,KACf/e,EAAM,qBAENmsD,EAAO,CADGptC,EAAO,GAAK,QAEjB,GAAGA,EAAO,OAASu7F,EAAMC,YAAc,IAAI1pG,KAAY,IAAP7G,GAAauwG,UAClEv6G,EAAM,oBAENmsD,EAAO,CADGptC,EAAO,KAAO,OAEnB,CACL/e,EAAM,yBACN,MAAM,OAACw6G,EAAM,OAAEC,IAAU,QAAsBzwG,GAC/CmiD,EAAO,CAACquD,EAAQC,E,CAGlB,K,CAGF,IAAK,mBACHz6G,EAAM,SACN,MAGF,QACEA,EAAM,gBASd,OAAO,QAAKA,EAAKmsD,EACnB,C,uHCjFO,SAASuuD,EAAmBx1F,GAKjC,MAAM,aAACkJ,EAAY,OAAEusF,EAAM,aAAEC,GAAgB11F,GAC7C,OAAc,CACZxvB,QAAS04B,EACT8jB,SAAUyoE,EACV9rG,UAAW,eACXxU,SAAU,IACVqxB,gBAAiB,KACZivF,GAAUC,IACXxsF,EAAap4B,SACbo4B,EAAasY,iBAAiBnvC,U,GAItC,CAEO,SAASsjH,EAAoB31F,GAIlC,MAAM,aAACkJ,EAAY,MAAEC,GAASnJ,EAG9B,IAFA,OAAYmJ,GAETD,EAAarnB,UAAUqB,SAAS,gBACjC,OAGF,MAAM1O,EAAQ00B,EAAa3hB,cAAcrB,cAAc,SACpD1R,IAAU00B,EAAa3hB,cAAcrB,cAAc,iBACpD1R,EAAM1B,UAAW,EACjB0B,EAAMzB,OAAOwT,MAAM,MAGrBivG,EAAmB,CACjBtsF,eACAusF,QAAQ,EACRC,cAAc,GAElB,CA0Be,SAAeE,EAC5B51F,G,qCAIA,MAAM,MAAChsB,GAASgsB,EAEVriB,GADS3J,EAAsByJ,OAAUzJ,EAA4BuJ,QACvDvO,MAAMmH,GAAoB,sBAAXA,EAAK+H,IACxC,IAAIP,EACF,OAGF,MAAM,MAACsa,EAAK,YAAEuE,IAAe,OAA0BxoB,EAAO2J,GAAO,GAGrE,aAFM6e,EArCD,SAAmCwD,GAGxC,MAAM,WAACwF,EAAU,MAAEvN,GAAS+H,EAC5B,IAAIwF,IACF,OAGFvN,EAAMpW,UAAUxS,IAAI,2BAEpB,MAAMqK,EAAYC,SAASC,cAAc,OACzCF,EAAUmI,UAAUxS,IAAI,2BACxBqK,EAAU8nC,iBAAmBhc,EAAWuc,SAExC,MAAMmU,EAAc,WAAmB,OAAD,wBACjCl2B,GAAO,CACVwF,WAAY9rB,EAAU8nC,iBAAiBjwC,SAKzC,OAFAmI,EAAUM,OAAOie,EAAOi+B,EAAYtkD,QAE7B8H,CACT,CAiBSm8G,CAA0B,OAAD,wBAC3B71F,GAAO,CACV/H,UAEJ,E,4VCtFe,SAAe69F,EAC5B91F,G,qCAEA,IACE,aAAa,OAA+BA,E,CAC5C,MAAMlsB,GAEN,OADA4G,QAAQujB,MAAM,wCAAyCnqB,GAChDksB,EAAQ+1F,MAAQ,GAAKp8G,SAASC,cAAc,O,CAEvD,E,8eCbA,IAAIyiC,EAAoBnV,EAAmBrO,EAC3C,MAAMm9F,EAAiC,IAAInmH,I,iCCF5B,SAASomH,EAAwBx/G,GAC9C,MAAM+D,EAAS/D,EAAQ+D,QACjB,QAAC2I,EAAO,IAAEnN,IAAO,EAAAkgH,EAAA,GAAQ,0BAA0Bz/G,EAAQH,OAAO+4B,iBAAiB70B,EAAO4+B,KAAKljC,kBAAkBsE,EAAO4+B,KAAK+f,eACnI,IAAIh2C,EACF,OAAOxJ,SAASC,cAAc,QAGhC,MAAMmJ,EAAIpJ,SAASC,cAAc,KAIjC,OAHAmJ,EAAEgqB,KAAO/2B,EACT+M,EAAE9G,aAAa,UAAWkH,EAAU,UAE7BJ,CACT,C,6TCOA,SAAeozG,EAAkBn2F,G,yCAC/B,MAAMuK,QAAgB,OAAoBvK,GAE1C,GAAGA,EAAQ+1F,MACT,OAAOxrF,EAGT,MAAMxnB,EAAIpJ,SAASC,cAAc,KAIjC,OAHAmJ,EAAEsV,QAAQ+9F,UAAap2F,EAAQvpB,QAA4BH,OAAS,IAAO0pB,EAAQvpB,QAA4BF,IAC/GwM,EAAEszG,IAAM,OACRtzG,EAAE/I,OAAOuwB,GACFxnB,CACT,G,CAEA,SAASuzG,EAAah0G,EAAcyzG,GAClC,OAAOA,EAAQzzG,GAAO,EAAAi0G,EAAA,IAAW,EAAA37F,EAAA,GAActY,GACjD,CAMO,SAAek0G,EAA8Cx2F,G,yCAClE,MAAMu8C,EAAQv8C,EAAQu8C,MAEtB,IAAIyhC,EAAczhC,aAAK,EAALA,EAAOqhC,cAKzB,OAJGrhC,aAAK,EAALA,EAAOrmE,MAAO,OACf8nG,EAAc,uBAGZA,EAmBGh+E,EAAQ+1F,MACbjmG,EAAA,kDAA0DkuF,GAAaphG,MAAM3M,GAAQA,EAAIw0D,mBACzF,OAAuB,OAAD,wBACjBzkC,GAAO,CACVmnD,OAAQ,CAAC62B,MACRphG,MAAMovD,IACPA,EAASpzC,iBAAiB/W,UAAUxS,IAAI,cACjC28D,KAzBNhsC,EAAQ+1F,MAAc,GF/Cd,SAAqB1yE,EAAepiC,GACjD,IAAIo7B,EAAK,CACPxjB,EAAOlf,SAASkR,eAAe,YAE/B,MAAM4rG,EAAK,6BAEXp6E,EAAM1iC,SAAS6e,gBAAgBi+F,EAAI,OACnCp6E,EAAI5jB,eAAe,KAAM,QAAS,MAClC4jB,EAAI5jB,eAAe,KAAM,SAAU,MACnC4jB,EAAI5jB,eAAe,KAAM,UAAW,aACpC4jB,EAAIx6B,UAAUxS,IAAI,kBAElB,MAAMypB,EAAMnf,SAAS6e,gBAAgBi+F,EAAI,OACzC39F,EAAIL,eAAe,KAAM,OAAQ,eACjC4jB,EAAIriC,OAAO8e,GAEXoO,EAAOvtB,SAASC,cAAc,QAC9BstB,EAAKrlB,UAAUxS,IAAI,aAAc,eAEjC,MAAMqnH,EAAc/8G,SAASC,cAAc,QAC3C88G,EAAY70G,UAAUxS,IAAI,sBAC1B63B,EAAKltB,OAAOqiC,EAAKq6E,E,CAGfrzE,IACF3oC,QAAQujB,MAAM,wBACdolB,EAAQ,SAGNpiC,IACFvG,QAAQujB,MAAM,kBACdhd,EAAU,IAGZ,MAAMqlC,EAAMjD,EAAMoJ,SAAS,IAErBkqE,EAAa,uBAAuBtzE,IAC1C,IAAIuzE,EAAcZ,EAAUzkH,IAAI8xC,GAChC,IAAIuzE,EAAa,CACf,MAAM,EAACl5G,EAAC,EAAErF,EAAC,EAAEu4F,EAAC,EAAE7tF,IAAK,QAAW,IAAMujC,GACtCztB,EAAKhS,mBAAmB,YAAa,+BACb8vG,sEACQrwE,6DACI5oC,MAAMrF,OAAOvD,KAAKC,IAAI,EAAG67F,EAAI,SAAS7tF,wDAI1EizG,EAAU9jH,IAAImxC,EAAOuzE,EAAc,QAAQl5G,MAAMrF,OAAOvD,KAAKC,IAAI,EAAG67F,EAAI,SAAS7tF,K,CAGnF,MAAM8zG,EAAQ3vF,EAAKnM,WAAU,GAK7B,OAJC87F,EAAMhzG,kBAAkChK,MAAMm8C,KAAO,QAAQ2gE,KAE7DE,EAAMhzG,kBAAkChK,MAAM2pC,OAASozE,EACxDC,EAAMj+F,iBAAiB5e,QAAO,EAAAyyB,EAAA,GAAiBxrB,GAAS,IACjD41G,CACT,CEMWC,CAAYv6C,aAAK,EAALA,EAAO8hC,WAAY9hC,aAAK,EAALA,EAAOl/D,MAYjD,G,CAEA,SAAS05G,EAA2B/2F,GAClC,MAAMxlB,EAAWwlB,EAAQvpB,QAAmC+D,OAC5D,OAAOg8G,EAAc,OAAD,wBACfx2F,GAAO,CACVu8C,MAAO/hE,IAEX,CAEA,SAAew8G,EAAkCh3F,G,yCAC/C,MAAMxlB,EAAWwlB,EAAQvpB,QAAmC+D,OACtD0sB,EAAOvtB,SAASC,cAAc,QAGpC,OAFAstB,EAAKrlB,UAAUxS,IAAI,cACnB63B,EAAKltB,aAAa+8G,EAA2B/2F,GAAUs2F,EAAa97G,EAAO6C,MAAO2iB,EAAQ+1F,QACnF7uF,CACT,G,CAEe,SAAe+vF,EAA+Bj3F,G,+CAC3D,MAAM,MAAC+1F,EAAK,QAAEt/G,EAAO,WAAE+uB,EAAU,cAAEtV,EAAa,gBAAE40C,EAAe,eAAE95B,GAAkBhL,EAC/ExvB,EAAuBulH,OAAQxjH,EAAYoH,SAASC,cAAc,QAClEY,EAAS,WAAY/D,GAAWA,EAAQ+D,OAI9C,GAAIA,EAAmD/D,QAAS,CAC9D,MAAMygH,EAAiB18G,EAAmD/D,QAC1E,OAAGs/G,GACM,EAAA9oF,EAAA,GAAciqF,KAErB,EAAA1qF,EAAA,GAAah8B,GAAS,EAAAo8B,EAAA,IAAasqF,EAAe,CAAC/pD,cAAc,KAC1D38D,E,CAEJ,CACL,IAEIwtB,EACAipC,EAHA/oD,EAAI1D,EAAO0D,EAKf,MAAM3I,EAAWua,EAAA,WAEXqnG,EAAiB,CAAC7gH,EAAgBy/G,IAC/BA,GAAQ,EAAAn5C,EAAA,GAAa,CAACtmE,SAAQwH,UAAWi4G,KAAU,OAAc,CAACz/G,WAG3E,OAAOkE,EAAO0D,GACZ,IAAK,yBACHA,GAAK,IAAO1D,EAAetK,KAE3B+2D,EAAO,EAAC,EAAAmwD,EAAA,GAAmB58G,EAAOrF,SAAU4gH,IAC5C,MAGF,IAAK,yBACH73G,GAAK,IAAO1D,EAAetK,KAE3B+2D,EAAO,GACH/oD,EAAEu2F,SAAS,QAAWh+F,EAAQsF,OAAOs7G,MACvCpwD,EAAKt2D,KAAKwmH,EAAe1gH,EAAQ2F,OAAQ25G,SAGpBxjH,IAApBiI,EAAOrF,SACR8xD,EAAKt2D,MAAK,EAAAymH,EAAA,GAAmB58G,EAAOrF,SAAU4gH,IAE9C9uD,EAAKt2D,KAAKslH,EAAwBx/G,IAGpC,MAGF,IAAK,iCAAkC,CACrC,MAAMsgC,EAAU,CAACtgC,EAAQ2F,OAAQ5B,EAAO03E,MAAM,GAAGntD,YACjD,IAAIhiB,EAAI,mCACR,MAAMsmE,EAAOv5D,EAAA,OACVinB,EAAQ,KAAOsyC,EAAMtmE,GAAK,QACrBg0B,EAAQ,KAAOsyC,IAAMtmE,GAAK,WAClC,EAAA0iD,EAAA,GAAiB1uB,EAASsyC,GAE1BrrD,EAAcjb,EACdkkD,EAAOlwB,EAAQ3tB,KAAK9S,GAAW6gH,EAAe7gH,EAAQy/G,KACtD9uD,EAAKt2D,KAAKslH,EAAwBx/G,IAClC,K,CAGF,IAAK,kCAAmC,CACtC,MAAM2+G,EAAQ,IAAIzpG,KACZ7G,EAAO,IAAI6G,KAA4B,IAAvBnR,EAAO88G,eACvBC,GAAezyG,EAAKyvB,UAAY6gF,EAAM7gF,WAAa,MACnDijF,EAAe,IAAI7rG,KAAKypG,GAC9BoC,EAAanjF,QAAQmjF,EAAanC,UAAY,GAE9C,MAAMpgF,QAAoB1/B,EAASqI,gBAAgBq3B,YAAYx+B,EAAQH,QACvE0nB,EAAciX,EAAc,8CAAgD,sCAC5EgyB,EAAO,GACP,MAAMoiB,EAAOv5D,EAAA,OAOb,IAAIrD,EANDhW,EAAQ2F,SAAWitE,EACpBrrD,GAAe,MACNiX,GACTgyB,EAAKt2D,KAAKwmH,EAAe1gH,EAAQ2F,OAAQ25G,IAI3C,MAAM0B,EAA4B,GAC/BF,EAAc,GAAKzyG,EAAKuwG,YAAcD,EAAMC,UAC7C5oG,EAAI,4BACI8qG,EAAc,GAAKzyG,EAAKuwG,YAAcmC,EAAanC,UAC3D5oG,EAAI,mBAEJA,EAAI,mBACJgrG,EAAM9mH,KAAK,IAAI,qBAAqB,CAClCmU,OACAkb,QAAS,CACP03F,IAAK,UACLjjF,MAAO,UACPE,KAAM,aAEPnkC,UAGLinH,EAAM9mH,MAAK,QAAWmU,IACtB,MAAMovB,GAAI,QAAKznB,EAAGgrG,GAClBxwD,EAAKt2D,KAAKujC,GAEV,K,CAGF,IAAK,0BAA2B,CAC9B,MAAMm1C,EAAOv5D,EAAA,OACVrZ,EAAQ2F,SAAWitE,EACpBnrE,GAAK,MAEL+oD,EAAO,CAACkwD,EAAe1gH,EAAQ2F,OAAQ25G,IAGzC,K,CAGF,IAAK,0BAA2B,CAC9B,MAAMz/G,EAASG,EAAQH,OACjBqhH,QAAsBpiH,EAAS8G,mBAAmByE,iBAAiBxK,EAAQG,EAAQmhH,cAEzF3wD,EAAO,CACLkwD,EAAe1gH,EAAQ2F,OAAQ25G,IAG7B4B,EAOF1wD,EAAKt2D,KAAKwlH,EAAkB,OAAD,wBACtBn2F,GAAO,CACVvpB,QAASkhH,OARX35F,EAAc,qBAEXvnB,EAAQmhH,cACTriH,EAAS8G,mBAAmBw7G,oBAAoBphH,IASpD,K,CAGF,IAAK,mCAAoC,CACvC,MAAMw+B,QAAoB1/B,EAASqI,gBAAgBq3B,YAAYx+B,EAAQH,QACpEG,EAAQsF,OAAO0/B,IAChBzd,EAAciX,EAAc,+BAAiC,8BAE7DjX,EAAciX,EAAc,yCAA2C,uCACvEgyB,EAAO,CAACkwD,EAAe1gH,EAAQ2F,OAAQ25G,KAEzC,K,CAGF,IAAK,6BACL,IAAK,0BACL,IAAK,yBACL,IAAK,0BACL,IAAK,6BACL,IAAK,+BACL,IAAK,6BACL,IAAK,gCACL,IAAK,gCACL,IAAK,kCACH9uD,EAAO,CAACkwD,EAAe1gH,EAAQ2F,OAAQ25G,IACvC,MAGF,IAAK,gCACL,IAAK,6BACH9uD,EAAO,GACS,+BAAbzsD,EAAO0D,GACR+oD,EAAKt2D,KAAKwmH,EAAe1gH,EAAQ2F,OAAQ25G,IAG3C9uD,EAAKt2D,KAAK2lH,EAAa97G,EAAO6C,QAC9B,MAGF,IAAK,8BACL,IAAK,4BACL,IAAK,2BAA4B,CAC/B,MAAM60E,EAAS13E,EAAkD03E,OAC/D,CAAE13E,EAAqDs9G,SAIzD,GAFA7wD,EAAO,CAACkwD,EAAe1gH,EAAQ2F,OAAQ25G,IAEpC7jC,EAAM/gF,OAAS,EAAG,CACnB,MAAM4mH,GAAS,cACPpkG,QAAQqH,IAAIk3D,EAAM9oE,KAAK+uD,GAAmBg/C,EAAeh/C,EAAOpzC,WAAYgxF,OAClF,EACAA,GAGF,GAAGA,EACD9uD,EAAKt2D,QAAQonH,OACR,CACL,MAAM/rD,EAAWryD,SAASC,cAAc,QACxCoyD,EAAShyD,UAAU+9G,GACnB9wD,EAAKt2D,KAAKq7D,E,OAGZ/E,EAAKt2D,KAAKwmH,EAAejlC,EAAM,GAAGntD,WAAYgxF,IAGhD,K,CAGF,IAAK,0BAA2B,CAC9B,MAAMiC,GAAa,EAAAprF,EAAA,IAAapyB,EAAO0/E,OAAQ,CAC7Cv2E,SAAU,CAAC,CACTzF,EAAG,mBACH/M,OAAQqJ,EAAO0/E,OAAO/oF,OACtB86B,OAAQ,MAMZg7B,EAAO,EAFM,EAAAsvD,EAAA,GAAWyB,IAGxB,K,CAGF,IAAK,2BAA4B,CAC/B,MAAMC,EAAkBz9G,EAAOuB,OAAOm8G,eAChCC,EAAkB39G,EAAOuB,OAAOq8G,eAKtC,GAJAp6F,EAAcm6F,EAAkB,+CAAkDF,EAAkB,+CAAiD,mCAErJhxD,EAAO,EADO,EAAAoxD,EAAA,GAA2B79G,EAAO89G,aAAc99G,EAAO+9G,UACtDpB,EAAe1gH,EAAQH,OAAQy/G,IAE3Ct/G,EAAQmhH,aAAc,CACvB,MAAMY,QAAuBjjH,EAAS8G,mBAAmByE,kBACvC,QAAhB,EAAArK,EAAQgiH,gBAAQ,eAAEC,mBAAmB,EAAAxW,EAAA,GAAUzrG,EAAQgiH,SAASC,kBAAoBjiH,EAAQH,OAC5FG,EAAQmhH,cAGNY,GAGFx6F,EAAcm6F,EAAkB,wCAA2CF,EAAkB,wCAA0C,4BACvIhxD,EAAKt2D,KAAKwlH,EAAkB,OAAD,wBACtBn2F,GAAO,CACVvpB,QAAS+hH,KACR57G,MAAM1N,IACJA,aAAc4C,aACf5C,EAAG2S,UAAUxS,IAAI,mBAGZH,OAXTqG,EAAS8G,mBAAmBw7G,oBAAoBphH,E,CAgBpD,K,CAGF,IAAK,8BAA+B,CAClCwwD,EAAO,GAEP,MAAMhyB,QAAoB1/B,EAASqI,gBAAgBq3B,YAAYx+B,EAAQH,QACvE,GAAGkE,EAAOm+G,OAAQ,CAUhB,IAAIxjH,EACJ,GAVG8/B,EACDjX,EAAc,0BACNvnB,EAAQ2F,SAAW0T,EAAA,OAC3BkO,EAAc,uBAEdA,EAAc,mBACdipC,EAAKt2D,KAAKwmH,EAAe1gH,EAAQ2F,OAAQ25G,KAIxCv7G,EAAOm+G,OAAS,QAAS,CAC1B,IAAI79G,EACJ,MAAMmsD,EAA2B,GAC3BtyB,EAAO,QACVn6B,EAAOm+G,QAAUhkF,GAClB75B,EAAM,QACNmsD,EAAKt2D,KAAK6J,EAAOm+G,OAAShkF,EAAO,KAEjC75B,EAAM,SACNmsD,EAAKt2D,KAAK6J,EAAOm+G,QAAoB,GAAV,MAAgB,IAG7CxjH,EAAW4gH,EAAQ,YAAYj7G,GAAK,EAAMmsD,IAAQ,QAAKnsD,EAAKmsD,E,MAE5D9xD,GAAW,EAAAiiH,EAAA,GAAmB58G,EAAOm+G,OAAQ5C,GAG/C9uD,EAAKt2D,KAAKwE,E,MAEP8/B,EACDjX,EAAc,2BACNvnB,EAAQ2F,SAAW0T,EAAA,OAC3BkO,EAAc,wBAEdA,EAAc,oBACdipC,EAAKt2D,KAAKwmH,EAAe1gH,EAAQ2F,OAAQ25G,KAG7C,K,CAGF,IAAK,yBAA0B,CAC7B,IAAI/yE,EACA41E,EACAC,EACJ,MAAMC,IAASriH,EAAQsF,OAAO0/B,IACxBs9E,OAAyCxmH,IAAzBiI,EAAOojG,cACvBob,EAAgBD,KAAmBv+G,EAAOojG,cAC1Cqb,OAAkC1mH,IAAjBiI,EAAO6C,MACxB67G,OAAoC3mH,IAAlBiI,EAAO63C,OAE3BymE,IACFD,EAAgB1B,EAAe1gH,EAAQ2F,OAAQ25G,IAG9CkD,IACDL,EAAetC,EAAa97G,EAAO6C,QAGlC07G,IAAkBC,IACnBh2E,EAAc+zE,EAA2B/2F,IAG3CinC,EAAO4xD,EAAgB,CAACA,GAAiB,GAEtCr+G,EAAO2+G,OACRn7F,EAAc86F,EAAO,4CAA8C,yCACzC,IAAlBt+G,EAAO2+G,OACfn7F,EAAc86F,EAAO,6CAA+C,yCAC5DE,GAAiBC,GACzBj7F,EAAc86F,EAAO,iDAAmD,6CACxE7xD,EAAKt2D,KAAKioH,IACFG,GAAiBE,GACzBj7F,EAAc86F,EAAO,qCAAuC,iCAC5D7xD,EAAKt2D,KAAKqmH,EAAkCh3F,KACpCg5F,EACRh7F,EAAc86F,EAAO,kDAAoD,8CACjEG,GACRj7F,EAAc86F,EAAO,2CAA6C,uCAClE7xD,EAAKt2D,KAAKioH,IACFG,GACR/6F,EAAc86F,EAAO,0CAA4C,sCACjE7xD,EAAKt2D,KAAKqyC,IACFk2E,IACRl7F,EAAc86F,EACXt+G,EAAO63C,OAAS,2CAA6C,6CAC7D73C,EAAO63C,OAAS,uCAAyC,0CAG9D,K,CAGF,IAAK,2BACH4U,EAAO,CAAC+vD,EAAkCh3F,IAC1ChC,EAAc,wBACd,MAGF,IAAK,4BAA6B,CAChC,MAAM86F,IAASriH,EAAQsF,OAAO0/B,IAC9B,IAAIo9E,EACAC,IACFD,EAAgB1B,EAAe1gH,EAAQ2F,OAAQ25G,IAGjD9uD,EAAO4xD,EAAgB,CAACA,GAAiB,GAEtCr+G,EAAO4jF,UACRn3B,EAAKt2D,MAAK,EAAAiqB,EAAA,GAAcpgB,EAAO4jF,WAC/BpgE,EAAc86F,EAAO,sBAAwB,sBAE7C96F,EAAc86F,EAAO,uBAAyB,oBAEhD,K,CAGF,QACE96F,EAAe+oE,EAAA,GAAS7oF,IAAM,IAAI1D,EAAO0D,KAIzC8f,IACFA,EAAc+oE,EAAA,GAAS7oF,QACJ3L,IAAhByrB,IACDA,EAAc,IAAM9f,EAAI,MAI5B,MAAMk7G,EAASnyD,UAActzC,QAAQqH,IAAIisC,IAEzC,OAAG8uD,EACM,YAAY/3F,GAAa,EAAMo7F,IAE/B,QAAM5oH,EAASwtB,EAAao7F,E,kMC5c1B,SAAeC,EAC5Br5F,G,qDAEA,IAAI,QAACvpB,EAAO,KAAE6L,EAAI,UAAEg3G,EAAS,MAAEvD,EAAK,cAAE7rF,EAAa,iBAAEqvF,GAAoBv5F,EACzE1d,UAAAA,EAAU7L,EAA4BA,SAEtC,MAAM2nC,EAA2B,GAEjC,IAAIo7E,GAAc,EAClB,MAAMC,EAAU,CAACzwD,EAAsB0wD,KACrC,GAAG1wD,EAAS,CACV,QAAYz2D,IAATmnH,GAAsBF,EACvB,OAGFE,EAAO3D,EAAQ,YAAY/sD,GAAS,IAAQ,QAAKA,E,CAGnD,GAAG+sD,EACD33E,EAAMztC,KAAK+oH,OACN,CACL,MAAMxqH,EAAKyK,SAASC,cAAc,QACd,iBAAX,EAAqB1K,EAAGmiB,UAAYqoG,EACxCxqH,EAAG8K,OAAO0/G,GACft7E,EAAMztC,KAAKzB,E,GAKTmN,EADW,aACmBA,mBAE9Bs9G,GAAe,OAAoBljH,GAEzC,IAAIkN,EAAqD,QAAzC,EAAAlN,EAA4BmN,qBAAa,QAAKnN,EAAsCkN,SACpG,GAAIlN,EAA4BzC,QAAU2lH,EAAc,EACtD,OAA4BljH,GAC5B,IAAImjH,GAAiB,EACrB,GAAGnjH,EAAQojH,WAAY,CACrB,GAAGP,EAAW,CACZ,MAAMl/E,QAAa/9B,EAAmBy9G,iBAAiBrjH,GACvD,GAAG6iH,EAAUnoH,SAAWipC,EAAKjpC,QAC3B,IAAI,MAAMoF,KAAO6jC,EACf,IAAIk/E,EAAUj2G,SAAS9M,GAAM,CAC3BqjH,GAAiB,EACjB,K,OAIJA,GAAiB,C,CAIrB,GAAGA,EAAgB,CACjB,MAAMG,QAAkB19G,EAAmB29G,aAAavjH,EAAQojH,YAChEv3G,GAAOy3G,aAAS,EAATA,EAAWtjH,UAAW,GAC7BkN,GAAWo2G,aAAS,EAATA,EAAWn2G,gBAAiB,GAEnC21G,IACFE,EAAQ,eACRD,GAAc,E,OAIlBI,GAAiB,EAGnB,IAAKA,IAAmBL,IAAsBj3G,EAAM,CAClD,MAAMtO,EAAQyC,EAAQzC,MACtB,OAAOA,EAAMkK,GACX,IAAK,oBACHu7G,EAAQ,eACR,MACF,IAAK,mBACHA,OAAQlnH,EAAWwjH,EAAQ/hH,EAAMoqF,UAAW,OAAcpqF,EAAMoqF,WAChE,MACF,IAAK,oBACH97E,EAAOtO,EAAMqJ,MACbo8G,EAAQ,kBACR,MAEF,IAAK,kBACHA,EAAQ,kBACR,MACF,IAAK,sBACHA,EAAQ,sBACR,MACF,IAAK,mBACH,MAAM7iF,EAAI,OAAc5iC,EAAMimH,KAAKC,UAAY,QAC/CT,OAAQlnH,EAAWwjH,EAAQn/E,GAAI,OAAcA,IAC7C,MACF,IAAK,sBACH6iF,EAAQ,iBACR,MACF,IAAK,mBAAoB,CACvB,MAAM7iF,EAAI,MAAa5iC,EAAMmmH,KAAK98G,MAClCo8G,OAAQlnH,EAAWwjH,EAAQn/E,GAAI,OAAcA,IAC7C,K,CAEF,IAAK,uBAAwB,CAC3B,MAAMj9B,EAAW3F,EAAM2F,SAEvB,GAAqB,UAAlBA,EAASzJ,KACVupH,EAAQ,oBACH,GAAqB,UAAlB9/G,EAASzJ,KACjBupH,EAAQ,oBACH,GAAqB,QAAlB9/G,EAASzJ,KACjBupH,EAAQ,kBACH,GAAqB,UAAlB9/G,EAASzJ,KACjBupH,EAAQ,oBACH,GAAqB,YAAlB9/G,EAASzJ,KAAoB,CACrC,MAAMomB,EAAI8nB,EAAMjtC,OAChB,GAAGwI,EAAS8qD,gBAAiB,CAC3B,MAAM7tB,EAAIj9B,EAAS8qD,gBAAkB,IACrCg1D,OAAQlnH,EAAWwjH,EAAQn/E,GAAI,OAAcA,G,CAG/C6iF,EAAQ,iBAGR,MAAMxqH,EAAImvC,EAAM3d,OAAOnK,EAAG,GAC1B,GAAGy/F,EAAO33E,EAAMztC,KAAM1B,EAAE,IAAiBA,EAAE,GAAKA,EAAE,GAAe,SAC5D,CACH,MAAMi4B,EAAOllB,OAAOrI,SAASC,cAAc,QAC3CstB,EAAKltB,UAAU/K,GACfmvC,EAAMztC,KAAKu2B,E,CAGb5kB,EAAO,E,MACF,GAAqB,UAAlB3I,EAASzJ,KAAkB,CACnC,MAAM8N,EAAYrE,EAASsE,WAAWjP,MAAMgP,GAA8B,2BAAhBA,EAAUE,IAAmCF,EAAUX,OAASW,EAAUI,aAC9Hw4B,EAAI,OAAc54B,EAAY,CAACA,EAAUX,MAAOW,EAAUI,WAAWigB,OAAO+M,SAAS1U,KAAK,OAAS/c,EAASwE,WAClHs7G,OAAQlnH,EAAWwjH,EAAQn/E,GAAI,OAAcA,G,MAE7C6iF,OAAQlnH,EAAWwjH,EAAQp8G,EAASwE,WAAY,OAAcxE,EAASwE,YAGzE,K,CAGF,IAAK,sBAC4B,iCAAR,QAApB,EAAAnK,EAAMomH,sBAAc,eAAEl8G,GACvBu7G,OAAQlnH,EAAWwjH,EAAQ/hH,EAAMs4B,aAAc,OAAct4B,EAAMs4B,cAEnEmtF,OAAQlnH,EAAWwjH,EAAQ/hH,EAAMqJ,OAAQ,OAAcrJ,EAAMqJ,QAG/D,MAGF,IAAK,0BACHo8G,EAAQ,M,CAWd,MAAMtoH,EAASitC,EAAMjtC,OACrB,IAAI,IAAImlB,EAAI,EAAGA,EAAInlB,EAAQmlB,GAAK,EAC9B8nB,EAAM3d,OAAOnK,EAAG,EAAG,MAGlBhU,GAAQnR,GACTitC,EAAMztC,KAAK,K,CAIf,GAAI8F,EAAmC+D,OAAQ,CAC7C,MAAM6/G,QAAsB,OAAyB,CAAC5jH,QAAUA,EAAoCs/G,UACjGsE,GACDZ,OAAQlnH,EAAW8nH,E,CASvB,GALGV,IACDr3G,GAAO,QAAsB7L,EAA4B6jH,oBAAoBh4G,KAC7EqB,EAAW,IAGVrB,EAKD,GAJAA,GAAO,OAAaA,EAAM,KAE1BqB,UAAAA,GAAa,OAAcrB,IAExByzG,EACD33E,EAAMztC,MAAK,OAAc2R,EAAMqB,QAC1B,CAGL,GAAGumB,EAAe,CAChBA,EAAgBA,EAAcnH,OAC9B,IACIlvB,EADApD,GAAQ,EAEZ,MAAMq+B,EAAS,IAAIC,QAAO,OAAa7E,GAAgB,MAEvD,IADAvmB,EAAWA,EAASya,QACkB,QAA/BvqB,EAAQi7B,EAAOyrF,KAAKj4G,KACzBqB,EAAShT,KAAK,CAACuN,EAAG,yBAA0B/M,OAAQ+4B,EAAc/4B,OAAQ86B,OAAQp4B,EAAM0sB,QACxF9vB,GAAQ,EAGPA,IACD,OAAakT,E,CAIjB,MAAM62G,GAAiB,QAAal4G,EAAM,CACxC6qD,cAAc,EACdxpD,WACA82G,SAAS,EACTC,cAAc,IAGhBt8E,EAAMztC,MAAK,OAAuB6pH,G,CAItC,GAAGzE,EACD,OAAO33E,EAAM1nB,KAAK,IACb,CACL,MAAMs1C,EAAWryD,SAASojE,yBAE1B,OADA/Q,EAAShyD,UAAUokC,GACZ4tB,C,mVC/PI,SAAe2uD,EAAc36F,G,qCAC1C,MAAM9E,EAAY,IAAI,IAEtB,aADMA,EAAUsV,OAAOxQ,GAChB9E,EAAU1qB,OACnB,E,yvBCee,SAAeoqH,GAAU,MAAC9vF,EAAK,QAAEr0B,EAAO,UAAEiD,EAAS,SAAE+wB,EAAQ,UAAEC,EAAS,SAAEmwF,EAAQ,MAAEhkG,EAAK,cAAE3G,EAAa,WAAEsV,EAAU,KAAErvB,EAAI,iBAAEy0B,EAAgB,aAAE/E,EAAY,iBAAE4F,EAAgB,OAAEV,EAAM,QAAE+vF,EAAO,SAAE73E,EAAQ,UAAE83E,EAAS,SAAExlH,EAAW,aAAkB,WAAE2tC,I,yCAqBhQ,MAAMpsB,EAAM,CACV+O,aAAc,CACZloB,MAAOgW,QAAQlX,UACf0uB,KAAMxX,QAAQlX,WAEhByuB,OAAQ,CACNvtB,MAAO,KACPwtB,KAAM,MAER1gB,UAAW,KACX8K,SAAU,MAGN+F,EAAyB,aAAZwP,EAAM5sB,EACnB88G,EAAsB1/F,GAAcwP,EAAM9lB,UAAUi2G,WAAW,YAAc9kH,EAC7E+kH,GAAW,OAAcpwF,GAC/B,KAAMA,EAAkBrtB,OAAUqtB,EAAqBvtB,QAAY29G,GAAaF,GAK9E,OAJGvwF,GAAYC,IAAcv0B,GAAQmlB,IACnC,OAAkBwP,EAAOpxB,EAAW+wB,EAAUC,OAAWn4B,EAAWkE,GAG/DqgB,EAGT,IAAI08F,EAAsC,IAArB/nF,EAEjBt1B,SACc5D,IAAbk4B,IAAwBA,EAAW,+BACrBl4B,IAAdm4B,IAAyBA,EAAY,4BAG1ChxB,EAAUmI,UAAUxS,IAAI,mBACxB,IAIIy5E,EAEAjzE,EA6FA7B,EAnGAuhB,EAAW7b,EAEXyhH,GAAQ,EACRnyC,EAAiCr1D,QAAQlX,UAQ7C,GAAGguB,GAAYC,IAAcv0B,EAAM,CACjC,MAAMjE,GAAM,OACV44B,EACApxB,EACA+wB,EACAC,OACAn4B,EACAkE,OACAlE,EACAyoH,EAAsB,CACpB98G,EAAG,YACHxB,EAAGouB,EAAMpuB,EACTgB,EAAGotB,EAAMptB,EACTvH,KAAM20B,EAAM30B,KACZjG,KAAM,WACJqC,GAMN,GAJA4D,EAAOjE,EAAIiqB,UACXg/F,EAAQjpH,EAAIipH,MACZtlH,QAAqBN,EAASO,cAAcC,gBAAgB+0B,EAAO30B,EAAKjG,OAEpEirH,IAAUD,EAAU,CACtB3lG,EAAW5b,SAASC,cAAc,OAClC2b,EAAS1T,UAAUxS,IAAI,4BACvBkmB,EAAS1b,MAAM2b,MAAQtjB,EAAIiE,KAAKqf,MAAQ,KACxCD,EAAS1b,MAAM+b,OAAS1jB,EAAIiE,KAAKyf,OAAS,KAE1C,MAAM0G,GAAW,OAAyBwO,EAAOj1B,GAAek1B,GAAQ,GACxE,GAAGzO,EAAU,CACX0sD,EAAmB1sD,EAASE,YAC5B,MAAMssD,EAAaxsD,EAASrE,MAC5B6wD,EAAWjnE,UAAUxS,IAAI,eACzBqK,EAAUM,OAAO8uE,E,YAEC8xC,EAAU,CAC1BlhH,YACAjD,UACAq0B,QACAL,SAAU,EACVC,UAAW,EACXv0B,OACA+Z,gBACA2G,QACAgP,eACAL,aACAoF,mBACAiwF,WACApvF,mBACAV,SACA+vF,SAAS,EACTC,WAAW,EACXxlH,cAGqB21B,OAAOC,KACnBtpB,UAAUxS,IAAI,cAAe,aAI1CqK,EAAUmI,UAAUxS,IAAI,0BACxBqK,EAAUM,OAAOub,E,OAGfpf,IACFA,GAAO,OAAgB20B,EAAOL,EAAUC,GAAW,IAGrD70B,QAAqBN,EAASO,cAAcC,gBAAgB+0B,EAAO30B,aAAI,EAAJA,EAAMjG,MAG3E,IAAI4qH,IAAYI,EAAU,CACxB,MAAM5+F,GAAW,OAAyBwO,EAAOj1B,GAAek1B,GAC7DzO,IACD0sD,EAAmBr1D,QAAQqH,IAAI,CAACguD,EAAkB1sD,EAASE,cAC3D1F,EAAI+O,aAAaloB,MAAQmZ,EAAI+O,aAAasF,KAAO69C,EACjDF,EAAahyD,EAAIoU,OAAOvtB,MAAQ2e,EAASrE,MACzC6wD,EAAWjnE,UAAUxS,IAAI,eACzBkmB,EAASvb,OAAO8uE,G,CAOpB,GAFAhyD,EAAIvB,SAAWA,EAEC,oBAAZpf,aAAI,EAAJA,EAAM+H,IAA0Bod,IAAgBnlB,aAAI,EAAJA,EAAsCqH,OACxF,OAAOsZ,EAIM,eAAZ3gB,aAAI,EAAJA,EAAM+H,IACPlK,EAAQ8iB,EAAIoU,OAAOC,MAAO,SAC1Bn3B,EAAMlB,UAAW,EACjBkB,EAAMhC,MAAO,EACbgC,EAAMqH,OAAQ,EACdrH,EAAM6N,UAAUxS,IAAI,iBAEpB2E,EAAQ8iB,EAAIoU,OAAOC,KAAO,IAAIjT,MAC9BlkB,EAAM6N,UAAUxS,IAAI,gBAKtB,MAAM27G,GAAcliC,IAAejzE,EAAawmB,aAAe,iCAAyC4mB,EAExG,IAAIx4B,EACJ,MAAM2wB,EAAqB3kC,aAAO,EAAPA,EAA6B2kC,kBACpDxQ,IACE/0B,EAAawmB,aAAc+e,IAC7B3wB,EAAY,IAAI,IAAqB,CACnCk9D,aAAc,UACdD,WAAYtsC,KAIbA,IACD3wB,EAAUgU,cAAc,cAA6B2c,IACrD3wB,EAAU6S,OAAO5jB,GACjB85G,OAAiBjhH,IAKrB,MAeM6oH,EAAgBplH,IACb,OAAsB0D,EAAW1F,EAAOgC,EAAKg1G,EAAYz1F,EAAUuzD,GAGtEh5C,EAAe95B,GAAgB,EAAD,gCAClC,IAAGwvB,GAAeA,IAAlB,CAMA,GAJG0d,IACDltC,QAAYktC,EAAWltC,IAGtB+kH,EAAW,CACZ,MAAMl/E,GAAS,OAAK7lC,EAAK,IACzB,OAAO6lC,EAAOh/B,QAAQD,MAAK,IAElBw+G,EAAav/E,EAAOjqC,OAAOqlG,c,CAItC,OAAOmkB,EAAaplH,EAdkB,CAexC,IAEA,IAAIwmB,EACJ,MAAM6+F,EACHllH,EAA6BuG,GAAK,KAClCvG,EAA6BuH,GAAK,KAChC81G,EACCtiH,EAAO,IAAW,EAAD,gCAClBsiH,IAAmB5oF,GAAoBngB,IACxCA,EAAUhR,YACVgR,EAAUmU,aAGZ,MAAM/hB,EAhDmB,MAIzB,MAAMy+G,EAAiBN,IAAwB7kH,EAQ/C,OAPgB,qBAAoC,CAClDnC,MAAO82B,EACPntB,MAAOxH,EACPwL,QAASuO,aAAa,EAAbA,EAAevO,QACxB45G,UAAWD,OAAiB/oH,EAAYihH,GAG5B,EAoCEgI,GACV3lH,QAAqBN,EAASO,cAAcC,gBAAgB+0B,EAAO30B,aAAI,EAAJA,EAAMjG,MAE7Eua,IACC5U,EAAawmB,aACbuO,GACDywF,GAEA5wG,EAAU6S,OAAO5jB,GAAW,EAAOmD,GAGrC22G,OAAiBjhH,EAEjB,MAAM62E,EAAgBvsE,EAAQD,KAAKkzB,GAEnC,OADAs5C,EAAc7iE,MAAM,KACb,CAAC9B,SAAU5H,EAASm+B,OAAQouC,EACrC,IAgCA,OA9BG3+D,GACDA,EAAUs1B,oBAAoB7uC,GAG7B2E,EAAawmB,WACd2sD,EAAmBxsD,SAAqBtrB,KAAQ8pC,OAE5C9qB,EAKMA,EAAcvf,KAAK,CAAC+rB,IAAKhjB,EAAWxI,KAAM,IAAMA,IAAO0L,MAAK,EAAE6H,cAAcA,MALnE+X,SAAqBtrB,KAAQ8pC,OAQ/CnV,GAAgBmjD,GACjBnjD,EAAal1B,KAAKq4E,SAIdA,EACNlyD,EAAI+O,aAAaloB,MAAQqrE,EACzBlyD,EAAI+O,aAAasF,KAAO3O,GAAe7I,QAAQlX,UAC/Cqa,EAAIrM,UAAYA,EAOTqM,CACT,G,4FC1Se,SAAe2kG,EAAiBhlH,G,qCAC7C,MAAMilH,EAA2B/hH,SAASC,cAAc,QACxD8hH,EAAY75G,UAAUxS,IAAI,gBAE1B,MAAMssH,EAASllH,EAAQ2F,SAAW,UAAkB3F,EAAQH,SAAW,SAUvE,GATAolH,EAAY1hH,OACV2hH,GACE,QAAK,iBACC,OAAc,OAAD,yBACd,OAA6BllH,IAAQ,CACxCkkB,OAAQlkB,EAAQH,SAAW,oBAIxB,wCAA8CG,EAAQH,UAAWqlH,EAAQ,CAChF,MAAMzgG,QAAkB,OAAc,CAAC5kB,OAAQG,EAAQH,SACvDolH,EAAY1hH,OAAO,MAAOkhB,E,CAG5B,OAAOwgG,CACT,E,2VCvBe,SAASE,EAAanlH,GACnC,MAAMvH,EAAkByK,SAASC,cAAc,QAI/C,OAHA1K,EAAG2S,UAAUxS,IAAI,aACjBH,EAAG8K,QAAO,QAA8B,IAAI2R,KAAoB,IAAflV,EAAQqO,QAElD5V,CACT,C,4pBCkCO,MAAM2sH,EAA4B,KAGnCC,EAAuC,CAAC,EAEjCC,EAA6C,CAAC,EAErD9nG,EAAiB,CAACzjB,EAAsByjB,EAA4BhM,KACxE,MAAMogE,EAAQ,KACZ73E,EAAQwP,oBAAoB,eAAgBqoE,GAC5Cp0D,IACAlS,aAAai6G,EAAS,EAExBxrH,EAAQ0L,iBAAiB,eAAgBmsE,GACzC,MAAM2zC,EAAWhrH,WAAWq3E,EAAOpgE,EAAQ,EAG9B,SAAeg0G,GAAY,IAAChsH,EAAG,IAAEysB,EAAG,WAAE8I,EAAU,sBAAE02F,EAAqB,cAAEhsG,EAAa,WAAEisG,EAAU,MAAEvtH,EAAK,KAAEmE,EAAI,UAAEivC,EAAS,MAAE+R,EAAK,MAAEv+B,EAAK,OAAEI,EAAM,UAAEq1F,EAAS,KAAEj5G,EAAI,aAAE6zB,EAAY,WAAEmlF,EAAU,YAAEoR,EAAW,UAAEC,EAAWt3G,OAAQu3G,EAAQ,SAAE/mH,EAAWua,EAAA,WAAkB,UAAEysG,EAAS,MAAE1lG,EAAK,UAAE2lG,EAAS,SAAEviE,EAAQ,eAAEixD,GAAc,WAAEC,GAAU,cAAEsR,GAAa,YAAEC,K,gDA8BrWhgG,EAAMlV,MAAMs/D,QAAQpqD,GAAOA,EAAM,CAACA,GAE/B+/F,KACD1oE,EAAQ9jD,EAAIw0D,iBAGd,MAAMk4D,GAAc1sH,EAAIgpD,QAKxB,GAJmB,IAAhB0jE,KACDL,GAAW,IAGT9mG,IAAUI,EAAQ,CACpB,MAAMnY,EAAQse,EAAA,SACR2uF,EAAU32D,EAAQt2C,EAAMm/G,aAAgB3sH,EAAI41D,SAAWpoD,EAAMo/G,gBAAkBp/G,EAAMq/G,cACrF3mH,GAAO,OAAclG,EAAIyM,EAAGzM,EAAIyN,GAAGktG,aAAaF,GACtDl1F,EAAQrf,EAAKqf,MACbI,EAASzf,EAAKyf,M,CA+ChB,IAAI/f,GA5Ce,IAAhB8mH,IAED/5B,EAAA,sBAGFlmE,EAAIrpB,SAASqpB,IACXA,EAAIrE,QAAQ3iB,MAAQ,GAAKzF,EAAIiG,GAC1B69C,IACDr3B,EAAIrE,QAAQkoC,aAAexM,GAG7Br3B,EAAI7a,UAAUxS,IAAI,wBAAwB,IAkC5C,MAAM0G,GAAkB,CAAM7F,GAAe2F,cAAY,EAAZA,GAAc3F,QAAS,EAAD,gCACjE,OAAO2F,SAAqBN,EAASO,cAAcC,gBAAgB9F,EAAKC,EAC1E,IAEM6sH,IAAcT,IAA6B,IAAhBK,IAAqC,IAAhBA,IAEhDnS,IAAc,EAAAwS,EAAA,GAAsB/sH,QAC7BsC,IAAVskB,GAAuB2zF,KAAgB3zF,GACxC6F,EAAIrpB,SAASqpB,GAAQA,EAAI7a,UAAUxS,IAAI,eAGzC,MAAM4tH,GAAezS,IAAevwD,EACpC,GAAGgjE,GAAc,CACf,MAAMC,EAAUpB,EAAU7rH,EAAIiG,IAC9BwmB,EAAIrpB,SAASqpB,IACXA,EAAI7a,UAAUxS,IAAI,qBAAsB,sBACxC6tH,GAAWxgG,EAAI7iB,MAAM0vE,YAAY,aAAc,OAAO2zC,KAAW,G,CAIrE,GAAGZ,GAA4B,IAAhBK,GAAmB,CAChC,MAAMh/G,GAAQ,EAAA6sB,EAAA,GAAgBv6B,EAAKulB,EAAOI,GAAQ,SAC5C7f,GAAgB4H,EAAMzN,K,YAEtB6F,GAAgBwmH,aAAS,EAATA,EAAWrsH,MAGnC,MAAMitH,GAAYppE,IAAU0oE,IAAgB,QAAkB1oE,IAAU,EAClE13B,GAAaxmB,GAAawmB,aAAe2uF,EAEzCoS,GAAuBL,GACvBM,GAAoC,IAAhBV,IAAqC,IAAhBA,SAA0BpnH,EAASC,eAAe8nH,qBAAqBrtH,EAAIiG,GAAIinH,SAAa5qH,EAErIukB,GAAM,CAACkkB,YAAQzoC,EAAiCrB,UAAMqB,GAC5D,IAAIy2E,IAAmB,SACnBu0C,IAAkB,EACtB,KACY,QAAV,GAAAttH,EAAIsN,cAAM,iBAAEpM,SACVksH,MAED3gG,EAAI,GAAG7Y,qBACPwY,IACC+gG,IACAp7E,KACe,IAAdipE,EACH,CACA,IAAIttG,EAAQ0/G,IAAqBptH,EAAIsN,OAAO,GAI5C,MAAMigH,EAAc,CAAC9gG,EAAkBosD,KACjCpsD,EAAImF,kBAUNmnD,GAAiBvsE,UATjB0sE,EAAA,gBAA4BzsD,GAAK,KAC3BA,EAAImF,oBACNinD,EAAWjnE,UAAUxS,IAAI,gBAAiB,aAC1CqtB,EAAI1iB,OAAO8uE,IAGbE,GAAiBvsE,SAAS,G,EAOhC,GAAG,QAASkB,EACV4/G,IAAkB,EAClB7gG,EAAIrpB,SAASqpB,IACX,MAAMosD,EAAa,IAAI5wD,OACvB,EAAAsB,EAAA,IAAmBsvD,EAAanrE,EAAc3H,KAAK,IAAMwnH,EAAY9gG,EAAKosD,IAAY,SAEnF,GAAG,UAAWnrE,GACnB,GAAe,kBAAZA,EAAMO,EAAuB,CAC1BP,EAAMH,MAAMrM,SACdwM,EAAQ1N,EAAIsN,OAAOvO,MAAMklC,IAAK,MAAC,OAAwC,QAAxC,EAACA,EAAkC12B,aAAK,eAAErM,MAAM,KAAKwM,GAGtF,MAAMqb,ECpOC,SAA0Bxb,GAGvC,IAAImZ,EAAO,IACX,IAAI,IAAIL,EAAI,EAAGnlB,EAASqM,EAAMrM,OAAQmlB,EAAInlB,IAAUmlB,EAAG,CACrD,MAAMnM,EAAM3M,EAAM8Y,GAEfnM,GAAO,IACRwM,GAPW,mEAOIxM,EAAM,IAAM,KAExBA,GAAO,IACRwM,GAAQ,IACAxM,GAAO,KACfwM,GAAQ,KAEVA,GAAQ,IAAY,GAANxM,G,CAKlB,OAFAwM,GAAQ,IAEDA,CACT,CD+MkB8mG,CAAkB9/G,EAAsCH,OAC5Di5G,EAAK,6BACLp6E,EAAM1iC,SAAS6e,gBAAgBi+F,EAAI,OACzCp6E,EAAIx6B,UAAUxS,IAAI,iBAAkB,gBAAiB,aACrDgtC,EAAI5jB,eAAe,KAAM,UAAW,OAAOxoB,EAAIyM,GAAK,OAAOzM,EAAIyN,GAAK,OAoCpE,MAAMiZ,EAAOhd,SAAS6e,gBAAgBi+F,EAAI,QAC1C9/F,EAAK8B,eAAe,KAAM,IAAKO,GAC5BlJ,EAAA,+BAAyC2sG,IAAe9lG,EAAK8B,eAAe,KAAM,OAAQ,WAC7F4jB,EAAIriC,OAAO2c,GACX+F,EAAIrpB,SAAQ,CAACqpB,EAAKrlB,IAAQqlB,EAAI1iB,OAAO3C,EAAM,EAAIglC,EAAIthB,WAAU,GAAQshB,KACrEkhF,IAAkB,EAClBv0C,GAAiBvsE,S,MACZ,GAAG0gH,IAAa,EAAG,CACxB,MAAM3mG,EAAI,KACPkG,EAAsBrpB,SAASqpB,IAC9B,MAAMosD,EAAa,IAAI5wD,MACjBliB,GAAM,EAAA0nH,EAAA,GAAuBztH,EAAK0N,GAAsC,IAC9E,EAAA6b,EAAA,IAAmBsvD,EAAY9yE,GAAK,IAAMwnH,EAAY9gG,EAAKosD,IAAY,GACvE,EAGA,KAAqB74E,EAAI8L,OAAO4hH,uBAAyB9nH,GAAaG,KACxEunH,IAAkB,EAClB/mG,MAEA+mG,IAAkB,EAClBK,EAAA,UAA6B,QAAU3tH,EAAIiG,GAAIyH,EAAMH,OAAOZ,MAAMY,IAChEjI,EAASC,eAAeqoH,+BAA+B5tH,EAAIiG,GAAIsH,GAC9DG,EAAsCH,MAAQA,EAC/CvN,EAAI8L,OAAO4hH,uBAAwB,EAE/Bn4F,IAAeA,KAAkB9I,EAAsB,GAAGmF,kBAC5DmnD,GAAiBvsE,UAInB+Z,GAAG,IACFjQ,OAAM,IAAMyiE,GAAiBvsE,Y,OAG/B,IAAqB,IAAhBkgH,IAAqBQ,IAAa,GAAsB,IAAhBR,MAAuB1R,GAAajpE,GAAY,CAClG,MAAM9wC,EAAO,IAAW,EAAD,gCACrB,GAAIwrB,EAAsB,GAAGmF,mBAAsB2D,IAAeA,IAEhE,YADAwjD,GAAiBvsE,UAInB,MAAM+Z,EAAI,CAACkG,EAAkBosD,EAAyB9yE,KACjD0mB,EAAImF,mBAAsB2D,IAAeA,IAC1CwjD,GAAiBvsE,UAIfzG,GACC,EAAAwjB,EAAA,IAAmBsvD,EAAY9yE,GAAK,IAAMwnH,EAAY9gG,EAAKosD,KADvD00C,EAAY9gG,EAAKosD,EACkD,QAGxE/yE,KACL2mB,EAAsBrpB,SAASqpB,IAC9B,GAAG7mB,GAAaG,IACdwgB,EAAEkG,EAAK,IAAIxE,MAASriB,GAAaG,UAC5B,GAAG,UAAW2H,EAAO,CAC1B,MAAM2lB,GAAM,EAAAw6F,EAAA,GAA0B7tH,EAAK0N,GAAsC,GACjF2lB,EAAI9G,YAAY5f,MAAK,IAAM4Z,EAAEkG,EAAK4G,EAAIrL,MAAO,K,MAI7C6F,EAAA,mBAAoC,CAClC9pB,MAAO/D,EACP0N,MAAOA,IACNf,MAAW5G,GAAQ,EAAD,gCACnB,OAAOwgB,EAAEkG,EAAK,IAAIxE,MAASliB,EAC7B,K,GAGN,IAEA,GAAGka,GAAiB8xB,EAGlB,OAFA9xB,EAAcvf,KAAK,CAAC+rB,IAAKA,EAAI,GAAIxrB,SACjC83E,GAAiBvsE,UACVqa,GAEP5lB,IAEIyM,EAAc3H,MAChBunH,IAAkB,E,EAU1B,GAJG13F,GAAgB03F,IACjB13F,EAAal1B,KAAKq4E,IAGjBhnC,EACD,OAAOlrB,GAGT,MAAMinG,IAAkB,EAAA/iD,EAAA,GAAU,cAC5B9pE,GAAO,IAAW,EAAD,gCACrB,GAAGs0B,IAAeA,IAChB,MAAMu4F,GAGR,GAAmB,IAAhBpB,KAAsBL,EAAU,CACjC,MAAM77C,QAAa3iD,EAAA,gBAAiC,CAAC9pB,MAAO/D,EAAK0R,QAASuO,aAAa,EAAbA,EAAevO,QAAShE,MAAO4+G,IACzG,GAAG/2F,IAAeA,IAChB,MAAMu4F,GAGR,MAAMhvH,QAAkB6zF,EAAA,sBAAiC,CACvDlpF,UAAYgjB,EAAsB,GAClC1qB,OAAU+hD,IAAS0oE,KAAkBzqH,EACrCc,SAAUC,EACV4vF,cAAeliB,EACfjrD,QACAI,SACApP,KAAM,MAAQvW,EAAIiG,GAClBkmH,cACAC,YACAc,aACAa,KAAMvB,GACNj3F,WAAY02F,QAAAA,EAAyB12F,EACrC52B,UAKIqvH,EAAehB,GAAe,K,QAClC,MAAMC,EAA0B,QAAnB,EAAGpB,EAAU,EAAA7rH,EAAIiG,WAAE,QAAhB4lH,EAAU,GEjZnB,SAA0BlqH,G,MACvC,MAAMkN,EAAUlN,EAAO8lB,WAAW,MAC5BvhB,EAAO,IAAgB,QAAV,EAAAvE,EAAOojD,WAAG,QAAI,GAC3Bx/B,EAAQrf,EACRyf,EAASzf,EACT+nH,GAAStsH,EAAO4jB,MAAQA,GAAS,EAEjC2oG,EAAQvsH,EAAOgkB,OAASA,EADf,EAETwoG,EAAYt/G,EAAQwxF,aAAa4tB,EAAOC,EAAO3oG,EAAOI,GAAQsrB,KACpE,IAAIm9E,EAAK,EAAGC,EAAK,EAAGC,EAAK,EAAGC,EAAK,EACjC,IAAI,IAAIloG,EAAI,EAAGA,EAAI8nG,EAAUjtH,OAAQmlB,GAAK,EACxC+nG,GAAMD,EAAU9nG,GAChBgoG,GAAMF,EAAU9nG,EAAI,GACpBioG,GAAMH,EAAU9nG,EAAI,GACpBkoG,GAAMJ,EAAU9nG,EAAI,GAGtB,MAAMmoG,EAAY9kH,SAASC,cAAc,UACzC6kH,EAAUjpG,MAAQrf,EAClBsoH,EAAU7oG,OAASzf,EACnB,MAAMuoH,EAAaD,EAAU/mG,WAAW,MAClC2rB,EAAQ,IAAIotD,kBAAkB,CAAM,IAAL4tB,EAAWG,EAAS,IAALF,EAAWE,EAAS,IAALD,EAAWC,EAAI,MAC5E7tB,EAAO,QAAQttD,EAAM,OAAOA,EAAM,OAAOA,EAAM,OAAOA,EAAM,MAMlE,OALAq7E,EAAWt1E,UAAYunD,EACvB+tB,EAAWr1E,SAAS,EAAG,EAAGo1E,EAAUjpG,MAAOipG,EAAU7oG,QACrD8oG,EAAWt1E,UAAY,2BACvBs1E,EAAWr1E,SAAS,EAAG,EAAGo1E,EAAUjpG,MAAOipG,EAAU7oG,QAE9C6oG,EAAUxnB,UAAU,aAC7B,CFoX8C0nB,CAAiB5vH,EAAU6C,OAAO,IACvE8qB,EAAsBrpB,SAASqpB,GAAQA,EAAI7iB,MAAM0vE,YAAY,aAAc,OAAO2zC,OAAY,OAC7F3qH,EAEEqsH,EAAe,CAACllH,EAAwB9H,KAC5C,MAAMpB,EAAUkJ,EAAUmK,oBAAsBjS,GAAU8H,EAAUmK,mBAClD,IAAfmnG,IACDA,GAAcA,IAAex6G,GAA+B,QAApBA,EAAQ2e,UAAsBW,EAAA,8BAGxE,MAAMpR,EAAK,KACNlO,GAAWA,IAAYoB,GAA8B,QAApBpB,EAAQ2e,SAC1C3e,EAAQM,Q,EAIRk6G,EAKF7hC,EAAA,UAAqB,KACnBv3E,GAAUA,EAAOiQ,UAAUxS,IAAI,WAC5BmB,GACDA,EAAQqR,UAAUxS,IAAI,YAGxB4kB,EAAeriB,GAAUpB,GAAS,KAChC24E,EAAA,UAAqB,KACnBv3E,GAAUA,EAAOiQ,UAAU/Q,OAAO,WAClC4N,GAAI,GACJ,GACD,IAAI,IAfNlO,GACD24E,EAAA,SAAqBzqE,E,EAwC3B,OArBA3P,EAAUmN,iBAAiB,cAAc,KACvC,MAAMtK,EAAS7C,EAAU6C,OAAO,KACf,IAAdq5G,GAAuBwR,MACxB,EAAAoC,EAAA,GAAkB5uH,EAAK2B,EAAQurH,IAG9BF,IACDgB,IAGExB,IACD//F,EAAsBrpB,SAAQ,CAACqG,EAAWrC,KACzCunH,EAAallH,EAAW3K,EAAU6C,OAAOyF,GAAK,G,GAGjD,CAACkF,MAAM,IAEPw3C,GACDx+C,EAAS6jD,mBAAmB0lE,qCAAqC/qE,GAG5DhlD,C,CAIF,GAAGutH,GAA4B,IAAhBK,GAAmB,CACvC,MAAMoC,EAAgBhC,IAAcL,GAC9BsC,EAAYD,EAAgBE,EAAA,eAAyB,GAAKhvH,EAAIiG,GAAI,EAAG,OAAG3D,OAAWA,QAAaA,EAEhG2sH,EAAenD,EAAYiD,GACjC,GAAGE,EACD,OAAOA,EAGT,MACMlrH,GADI+qH,EAAiBriG,EAAsB0B,MAAM,EAAG,GAAK1B,GAChCtT,KAAI,KACjC,IAAIpV,EACJ,GAAGsoH,EACDtoH,EAAQ,IAAIkkB,UACP,CACL,MAAM1jB,EAAQR,GAAQ,EAAAmkB,EAAA,KAKtB,GAJA3jB,EAAM6G,OAAQ,EACXtI,IAAMyB,EAAM1B,UAAW,GACvBd,IAAMwC,EAAMxC,MAAO,GAEnBA,GAAyB,iBAAX,EAAqB,CACpC,IAAImtH,EAAe,EAAGC,EAAc,EACpC,SAASC,IACJF,EAAe7wH,KAAKuG,eAAiBuqH,IAAgBptH,IACtD1D,KAAKwE,UAAW,EAChBxE,KAAK0D,MAAO,EACZ1D,KAAKuE,QACL2B,EAAMwL,oBAAoB,aAAcq/G,IAG1CF,EAAe7wH,KAAKuG,WACtB,CAEAL,EAAM0H,iBAAiB,aAAcmjH,E,EAKzC,OADArrH,EAAM6N,UAAUxS,IAAI,iBACb2E,CAAK,IAGR80E,EAAcpsD,EAAsBtT,KAAI,CAACsT,EAAKrlB,IAASqlB,EAAI7Y,oBAAsC7P,EAAMqD,IAAQqlB,EAAI7Y,qBACvG,IAAfmnG,IACDA,GAAcA,IAAe3uF,KAAeigG,EAAWxzC,EAAW,IAAOA,EAAW,IAAgC,QAA1BA,EAAW,GAAG35D,WAAwBW,EAAA,8BAG/Hk7F,GACDh3G,EAAMX,SAASW,GAAUA,EAAM6N,UAAUxS,IAAI,aAG/C,MAAMwN,EAAU,IAAI8W,SAAiD,CAAMlX,EAASmX,IAAW,EAAD,gCAC5F,MAAM4C,EAAI,IAAW,EAAD,gCAClB,GAAGgP,IAAeA,IAEhB,YADA5R,EAAOmqG,IAIT,MAAMuB,EAActrH,EAAM7C,OACpB20B,EAAwB,GA2D9B,IAAIy5F,QADExpH,KAEL2mB,EAAsBrpB,SAAQ,CAACqpB,EAAKrlB,KACnC,MAAMmoH,EAASxrH,EAAMqD,GAElBmoH,IAAQD,GAAc,EAAA/lG,EAAA,IAA0BgmG,EAAQ3pH,GAAaG,MACxEupH,EAAY3iH,MAFD,IA7DE,EAAC8f,EAAkB1oB,EAAoB80E,KACpDK,EAAA,gBAA4BzsD,GAAK,KAC/B,IAAG8I,GAAeA,IAKlB,GAAIxxB,EAAJ,CAQA,GAAGA,EAA2B,CAC5B,MAAM0I,EAAI8Y,EAAQxT,OAAOizC,iBACnBv3C,EAAIkY,EAAS5T,OAAOizC,iBAC1B,KAAI,OAAsBhlD,EAAKktH,GAAWzgH,EAAGgB,GAAI,CAE/C,MAAM9L,EAAS+H,SAASC,cAAc,UACtChI,EAAO4jB,MAAQ9Y,EACf9K,EAAOgkB,OAASlY,EACJ9L,EAAO8lB,WAAW,MAC1BM,UAAUhkB,EAA2B,EAAG,EAAGpC,EAAO4jB,MAAO5jB,EAAOgkB,SACpE,EAAAipG,EAAA,GAAkB5uH,EAAK2B,EAAQurH,G,EAKhC4B,EACDtiH,EAAQzI,IAIV0oB,EAAI1iB,OAAOhG,GAERg3G,GACDliC,GAAcA,EAAWjnE,UAAUxS,IAAI,YACvC4kB,EAAejgB,GAAO,KACpBA,EAAM6N,UAAU/Q,OAAO,WACvBg4E,SAAAA,EAAYh4E,QAAQ,GACnB,MAEHg4E,SAAAA,EAAYh4E,SAGXisH,IACD3uH,EAAA,eAAkC4F,EAA2BpF,OAAO2D,EAAWizB,GAG9EM,EAAOn1B,KAAKqD,KAAWsrH,GACxB7iH,EAAQqpB,G,MA5CJi5F,GAAkBhC,IACpBj0C,SAAAA,EAAYh4E,cANd8iB,EAAOmqG,G,GAmDT,EAOejuF,CAAOpT,EAAK8iG,EAAQ12C,EAAWzxE,KAE5B,GAExB,IAGA,SADMtB,KACHF,GAAaG,IAAKwgB,QAChB,CACH,IAAI3Z,EACJ,GAAmB,IAAhB8/G,IAAqBL,EAAU,CAChC,MAAM3+G,GAAQ,EAAA6sB,EAAA,GAAgBv6B,EAAKulB,EAAOI,GAAQ,GAElD/Y,EAAUihB,EAAA,mBAAoC,CAAC9pB,MAAO/D,EAAK0N,QAAOgE,QAASuO,aAAa,EAAbA,EAAevO,S,MAE1F9E,EAAUihB,EAAA,mBAAoC,CAAC9pB,MAAO/D,EAAK0R,QAASuO,aAAa,EAAbA,EAAevO,UAGrF9E,EAAQD,KAAK4Z,EAAG5C,E,CAEpB,MAWA,OATGorG,IACDjD,EAAYiD,GAAaniH,EACzBq/G,GAAyBr/G,EAAQ4J,SAAQ,KACnCy1G,YACKH,EAAYiD,E,KAKlBniH,C,CAEX,IAEA,GAAGs/G,IAA+B,IAAfA,KAAsB9/F,IAAc0gG,KAA+B,IAAfZ,GAErE,OADArlG,GAAI5lB,KAAOA,GACJ4lB,GAGT,MAAM0F,IAAgEtM,GAAmBmM,KAAc0gG,GAErG7rH,MADCgf,EAAcvf,KAAK,CAAC+rB,IAAKA,EAAI,GAAIxrB,UAAQyiB,QAAQlX,WAyBpD,OAtBG4f,IAAc,IACf2sD,GAAmBxsD,GAChBqJ,GACDA,EAAal1B,KAAKq4E,KAIH,IAAhB2zC,IAAqBnS,SAAyBj4G,IAAVskB,IAAwB2lG,GAkBjE,UAAoC,UAAC9iH,EAAS,IAAEzJ,EAAG,SAAEsF,EAAQ,WAAEiwB,EAAU,MAAE3O,EAAK,MAAErB,EAAK,YAAEgH,EAAW,eAAE0uF,EAAc,WAAEC,IAWpH51G,EAAS6jD,mBAAmBqmE,eAAexvH,EAAIiG,IAAI,GAEnD,IAAIwpH,GAAU,GACd,QAAiBhmH,GAAiBrD,GAAM,EAAD,gCAErC,IADA,EAAAqS,EAAA,GAAYrS,GACTqpH,EAAS,CACV,MAAM38G,EAAIpJ,SAASC,cAAc,KAWjC,OAVAmJ,EAAEI,QAAU,MACV,UACA,IAAI,IAAclT,EAAI81E,iBAAiB5oD,MAAM,OAG/C,EAAAY,EAAA,IAAS,CACPC,YAAa,6BACb0jC,kBAAmB,CAAC3+C,I,CAMxB28G,GAAU,QAEJljG,EACN,MAAM,aAACmjG,EAAY,eAAEC,IAAkB,OAAqB,CAC1D3vH,MACAu1B,aACAq6F,KAAMhpG,EAAQ,QAAU,OACxB1gB,KAAMqf,EAAQqmG,EACdltH,OAAQ+K,EACR3G,MAAM,EACNwpH,WAAW,EAAAS,EAAA,GAAsB/sH,GACjCi7G,iBACAC,oBAGW54G,IAAVskB,GAAwBA,GACzB8oG,EAAa99G,UAAUxS,IAAI,aAG7BuwH,EAAehjH,MAAMlM,IACnBA,EAAOwL,iBAAiB,WAAW,KACjCwjH,GAAU,CAAK,GACf,GAEN,KACF,CAzEII,CAA2B,CACzBpmH,UAAWgjB,EAAI,GACfzsB,MACAsF,WACAiwB,aACA3O,QACArB,QACAgH,eACA0uF,kBACAC,gBAIJr0F,GAAIkkB,OAASxe,GACN1F,E,IA6DF,SAAeipG,GAAoB,MAAC52F,EAAK,UAAEzvB,EAAS,SAAEnE,EAAQ,OAAEe,EAAM,WAAEkvB,I,kDAO7E,EAAA9c,EAAA,GAAYygB,GAEZ,MAAM8lB,GAAS,EAAA1/B,EAAA,GAAgB7V,EAAW,UACpCq6C,EAAQr6C,EAAU2e,QAAQkoC,aAE1BxxD,EAAa2K,EAAUmI,UAAUqB,SAAS,qBAAyD3Q,EAAvCqwF,EAAA,eAA0BlpF,GAC5F,GAAG3K,aAAS,EAATA,EAAW6D,OAAQ,CACpB,MAAM3C,QAAYsF,EAAS6jD,mBAAmB4mE,8BAA8BjsE,GAC5E,GAAG9jD,EAAK,CACN,MAAMwE,EAAQkF,SAASC,cAAc,SACrCnF,EAAMoF,MAAM4f,QAAU,OACtB/f,EAAU6N,cAAcvN,OAAOvF,GAE/B,IACE,MAAMuB,QAAY8nB,EAAA,mBAAoC,CAAC9pB,MAAO/D,IAE9DwE,EAAMxD,IAAM+E,EACZvB,EAAM1B,aACA,EAAAiW,EAAA,GAAYvU,OAAOlC,GAAW,GAEpCkC,EAAMyH,iBAAiB,SAAS,KAC9BzH,EAAMxD,IAAM,GACZwD,EAAM3D,QAAQ,GACb,CAACyL,MAAM,G,CACV,MAAMzI,G,EAKV/E,EAAU+D,UAAW,EACrB/D,EAAU8wF,S,CAGZ,IAAIvpF,EAAO66B,SACT,OAGF,MAAMlhC,QAAYsF,EAAS6jD,mBAAmB6mE,wBAAwBlsE,GAAO,GAC7E,IAAI9jD,EACF,OAGF,MAAMixC,EAAoE,QAAhE,KAAqCxnC,GAAkBwmH,iBAAS,UAATA,UAAc,CAC7En9G,EAAG,GACHsW,EAAG,GAGC8mG,EAAwCzmH,EAAkBymH,0BAA2B,EAAAnsB,EAAA,IAAS,KAElG,IADe9yD,EAAKn+B,EAAE5R,OAEpB,OAGF,MAAM0hE,EAAY3xB,EAAKn+B,EAAE,GAAGmxB,EAE5BgN,EAAKn+B,EAAE1P,SAAS0P,IACdA,EAAEmxB,GAAKnxB,EAAEmxB,EAAI2+B,GAAa,GAAI,IAGhC,MAAM5jB,GAAS,EAAA1/B,EAAA,GAAgB7V,EAAW,UAC1CnE,EAAS8G,mBAAmB8rD,UAAUnkC,EAAA,eAA0B,CAC9D9lB,EAAG,8BACHkiH,QAAQ,EAAAjmD,EAAA,IAAoBlrB,EAAO52B,QAAQ9hB,KAC3C6nF,SAAUrqC,EACVssE,YAAa,CACXniH,EAAG,WACHgjC,KAAMo/E,KAAKC,UAAUr/E,MAEtB,EAAMld,EAAA,kBAETkd,EAAKn+B,EAAE5R,OAAS,CAAC,GAChB,KAAM,GAEH0lB,EAAQo4B,EAASA,EAAOptC,UAAUqB,SAAS,eAAY3Q,GACvD,aAACotH,IAAgB,OAAqB,CAC1C1vH,MACAu1B,aACAq6F,KAAMhpG,EAAQ,QAAU,OACxB1gB,KAAM,IACNxH,OAAQ+K,EACR3G,MAAM,EACNytH,kBAAkB,SAGPjuH,IAAVskB,GAAwBA,GACzB8oG,EAAa99G,UAAUxS,IAAI,aAI1B85B,EAAMpxB,YACPmpC,EAAKn+B,EAAEpS,KAAK,CACV2lB,EAAG,EACH4d,EAAGvoB,KAAKC,QAGVu0G,I,gJGzxBW,SAASM,GAAqB,KAC3CtqH,EAAI,IACJlG,EAAG,WACHu1B,EAAU,OACV72B,EAAM,KACNkxH,EAAI,UACJxD,EAAS,KACTtpH,EAAI,SACJwC,EAAQ,UACRgnH,EAAS,iBACTiE,EAAgB,eAChBtV,EAAc,WACdC,I,MAeA,MAAMwU,EAAehmH,SAASC,cAAc,OAO5C,IAAI7K,EANJ4wH,EAAa99G,UAAUxS,IAAI,mBAG3BswH,EAAa9lH,MAAM2b,MAAQrf,EAAO,KAClCwpH,EAAa9lH,MAAM+b,OAASzf,EAAO,KAGnC,MAAMuqH,EAAmB,KACvBl/E,EAAiBppC,QACjBrJ,SAAAA,EAAW+B,SACX6uH,EAAa7uH,SACb,2DAAmE,SAAUi4B,EAAS,EAGlFyY,EAAuC,QAApB,EAAAhc,aAAU,EAAVA,EAAYuc,gBAAQ,SAAI,SACjDvc,EAAagc,EAAiBjwC,MAE9B,MAAMquH,GAAiB,QAAY,CACjCljG,IAAKijG,EACL1vH,MACAu1B,aACAylF,WAAW,EACXD,YAAY,EACZh5G,OAAQm5G,EACR31F,MAAOrf,EACPyf,OAAQzf,EACRpD,OACAnE,MAAO,OACPytH,YACA9mH,WACAgnH,cACC3/G,MAAK,EAAEo+B,YAAYA,IAAQp+B,MAAMpN,IAElC,IADA,OAA0BA,IACtBg2B,IAEF,MADAh2B,EAAWsB,UACL,OAAU,cAgBlB,OAbA/B,EAAYS,EACZT,EAAUmN,iBAAiB,cAAe6jF,KACnCorB,GAAcprB,IAAYhxF,EAAUixF,YAAc,OAAQrxF,IAC7D+xH,G,IAID,KACD3xH,EAAUmN,iBAAiB,cAAc,KACvCvI,UAAUgtH,QAAQ,IAAI,GACrB,CAACpkH,MAAM,IAGLxN,CAAS,IAGZ6xH,EAAwB7rH,IAC5B,MAAMyhB,EAAI1hB,KAAKu3C,SAAWt3C,EAAM,EAChC,OAAOyhB,EAAIzhB,GAAOyhB,EAAIzhB,EAAMyhB,CAAC,EAGzBqqG,EAAgBL,EAAmBI,EAAqB,IAAM,EAC9DE,EAAgBN,EAAmBI,EAAqB,GAAK,EAC7DG,EAAc,KAClB,KAAI,OAAQpyH,GAEV,YADA+xH,IAIF,MAAM9rG,EAAOjmB,EAAOqd,wBAEdg1G,EAASpsG,EAAKY,MAAQ,IACtByrG,EAAyB,WAATpB,EAAoB,EAAI,IAAe,UAATA,EAAmB,GAAK,GAAKmB,EAE3EE,EAAyB,WAATrB,EAAoB,EAAI,EAAImB,EAE5CG,EAAiB,UAATtB,EAAmBjrG,EAAKvB,MAAQuB,EAAKxB,KAC7CguG,EAAQxsG,EAAKtB,IAEb+tG,GAAuB,WAATxB,GAAqBjrG,EAAKY,MAAQrf,GAAQ,EAAc,UAAT0pH,GAAoB1pH,EAAO,GAAM8qH,EAAgBJ,EAC9GS,GAA2C1sG,EAAKgB,OAASzf,GAAQ,EAAS+qH,EAAgBJ,EAC1F91G,EAAIm2G,EAAQE,EACZp2G,EAAIm2G,EAAQE,EAEfr2G,IAAM9U,GAAQ8U,GAAK,WACpBy1G,IAICxV,GACW,WAAT2U,EAAmBF,EAAa9lH,MAAMgmH,IAAmC,EAA3B/qH,KAAK8X,IAAIq0G,GAAsB,KAC3EtB,EAAa9lH,MAAMuZ,KAAOiuG,EAAa,KAC5C1B,EAAa9lH,MAAMyZ,IAAMguG,EAAa,OAEtC3B,EAAa9lH,MAAMyZ,IAAMrI,EAAI,KAC7B00G,EAAa9lH,MAAMuZ,KAAOpI,EAAI,K,EAI5B+d,GAAW,OAAgBg4F,GAYjC,OAXA,wDAAgE,SAAUh4F,GAE1Eg4F,IAEG7V,GACDyU,EAAa99G,UAAUxS,IAAI,eAC3BV,EAAO4Y,cAAcvN,OAAO2lH,IAE5B,oCAA4CA,GAGvC,CAACA,eAAcC,iBACxB,C,uECpJe,SAAe2B,EAAiBvhG,G,qCAK7C,MAAM,MACJ+zB,EAAK,IACLr3B,EAAG,SACHnnB,EAAW,cACTyqB,EACE/vB,QAAYsF,EAAS6jD,mBAAmB6mE,wBAAwBlsE,GACtE,IAAI9jD,EAEF,MADAysB,EAAI7a,UAAUxS,IAAI,yBACZ,IAAIwwC,MAAM,cAGlB,OAAO,QAAY,OAAD,QAChB5vC,MACA8C,MAAM,EACNf,MAAM,GACHguB,GAEP,E,8rBCde,SAAewhG,GAAoB,IAACtvH,EAAG,cAAEge,EAAa,UAAExW,EAAS,MAAE9K,EAAK,SAAEkE,EAAQ,MAAE0iB,EAAK,OAAEI,EAAM,SAAErgB,EAAW,aAAkB,WAAEiwB,I,+CAW/I,GAAa,QAAV,EAAAtzB,EAAIqL,cAAM,eAAEpM,OAkDb,OAjDAuI,EAAUmI,UAAUxS,IAAI,8BACxB6gB,EAAcvf,KAAK,CACjB+rB,IAAKhjB,EACLxI,KAAM,IAAW,EAAD,gCACd,MAAMuwH,QAAwBlsH,EAAS6jD,mBAAmBsoE,kCAAkCxvH,GACtF2K,EAAU,aAA4B4kH,GAE5C,GAAGvvH,EAAI6J,OAAO8pD,WAAa3zD,EAAI6J,OAAO4lH,OACpC,OAAO9kH,EACND,MAAM6jE,IACL,wBAAiC,CAC/B/mE,YACA1H,MAAM,EACNc,WACA6vF,cAAeliB,EACfjrD,QACAI,SACAwmG,aAAa,EACb51G,KAAM,WAAatU,EAAIgE,GACvBtH,QACA42B,cACA,IAEC,CACL,IAAIxxB,EAYJ,OAXG9B,EAAI6J,OAAO4lH,QACZ3tH,GAAQ,SACPA,EAA2BlB,UAAW,EACtCkB,EAA2BqH,OAAQ,EACnCrH,EAA2BhC,MAAO,GAEnCgC,EAAQ,IAAIkkB,MAGdlkB,EAAM6N,UAAUxS,IAAI,iBAEbwN,EAAQD,MAAM6jE,KACnB,QAAmBzsE,EAAOo4B,IAAIsoE,gBAAgBj0B,IAAO,KACnD/mE,EAAUM,OAAOhG,GAEd9B,EAAI6J,OAAO4lH,QACZ,iBAAkC3tH,EAA2BpF,E,GAE/D,G,CAGR,MAMJ,IAAIgzH,EAGFA,EADC1vH,EAAI2vH,kBACWtsH,EAASmtD,gBAAgBy/B,uBAAuBjwF,EAAI2vH,mBAEpDtsH,EAAS6jD,mBAAmBC,cAAcnnD,GAAK0K,MAAMs8C,GAAeA,EAAWc,UAAU,KAG3G,MAAM/pD,QAAY2xH,EACL,kBAAV3xH,EAAIiO,IACL,QAAY,CACVjO,MACAysB,IAAKhjB,EACL9K,MAAOA,EACPshB,gBACA3a,WACAigB,QACAI,SACA4P,c,+DCzFS,SAASs8F,GAAiB,IAAC7xH,EAAG,IAAEi9B,EAAG,KAAE/2B,EAAI,SAAEZ,IAMxD,MAAMwsH,EAAgB70F,EAAIl5B,MACpBA,EAAQk5B,EAAIggD,YAAY,SAE3B60C,GACD/tH,EAAM6N,UAAUxS,IAAI,QAGtB,MAAMw2B,EAA+Bk8F,EAAgB,QAAKxvH,EAEpDyvH,EAAiB,UAAT7rH,EAAmB,GAAK,GAChC0lC,GAAS,QAAY,CACzBnf,IAAK1oB,EACL/D,IAAKA,EACLulB,MAAOwsG,EACPpsG,OAAQosG,EACRn8F,eACAtwB,aACCqH,MAAK,EAAEo+B,YAAYA,IAOtB,OALAnV,GAAgBlS,QAAQqH,IAAI6K,GAAcjpB,MAAK,KAC7C5I,EAAM6N,UAAU/Q,OAAO,QACvBixH,EAAcjxH,QAAQ,IAGjB+qC,CACT,C,iFC9Be,SAAeomF,EAC5BjiG,G,qCAIA,MAAM,OAAC1pB,EAAM,SAAEiL,EAAQ,UAAEE,GAAaue,EAEhCxD,EAA4B7I,QAAQlX,UACpCsG,GAAI,OAAwB,UAAYzM,EAAO+4B,YAAc9tB,EAAW,KAAM,OAAmBA,GAAY,KAAOE,EAAY,KAAM,OAAmBA,GAAa,KAY5K,OAXAsB,EAAElB,UAAUxS,IAAI,aAAc,qBAQ9B0T,EAAE/I,aAAa,OAAcgmB,IAGtB,CACL86C,QAAQ,EACRtqE,QAASuS,EACTyZ,cAEJ,E,03BCKA,IAAI0lG,EAA0B,EAuBf,SAAeC,GAAU,IAAClyH,EAAG,UAAEyJ,EAAS,QAAEjD,EAAO,SAAEg0B,EAAQ,UAAEC,EAAS,SAAEmwF,EAAQ,MAAEhkG,EAAK,WAAE2O,EAAU,cAAEtV,EAAa,OAAE06C,EAAM,MAAEh8D,EAAK,YAAE+7B,EAAW,UAAEkgC,EAAS,iBAAEjgC,EAAgB,aAAE/E,EAAY,aAAEgF,EAAY,UAAE1O,EAAS,UAAEimG,EAAS,cAAE1pH,EAAa,aAAE2mC,EAAY,SAAE9pC,EAAW,aAAkB,oBAAE8sH,I,+CAwBxS,MAAM52F,EAAmB4T,aAAY,EAAZA,EAAc7qC,MACvC,IAAIg/G,EAAsC,IAArB/nF,EACrB,MAAM62F,IAAgB73F,GAAYC,GAC5B63F,IAEW,UAAbtyH,EAAIC,MACFD,EAAIkG,MAvDoB,WAwDvBmsH,KAEc,QAAbryH,EAAIC,KAAiB,2BAAmC,8BAEhE,IAAIsyH,GAAuBC,GAE3B,IAAI73D,EAAQ,CACV43D,GAAW7oH,SAASC,cAAc,QAClC4oH,GAAS3gH,UAAUxS,IAAI,cACvBqK,EAAUM,OAAOwoH,IAEjB,IAAIE,GAAiB,EACL,QAAbzyH,EAAIC,MACLsyH,GAAS31F,WAAY,OAAS58B,EAAIkF,UAAU,GAExC01B,GAA6B,UAAb56B,EAAIC,OACnBqyH,KAAgB/O,EACjBgP,GAAS3gH,UAAUxS,IAAI,QAAS,gBAEhCqzH,GAAiB,KAIrBF,GAAS31F,UAAY,MAEjB01F,IAAgB13F,IAClB63F,GAAiB,EACjBlP,OAAiBjhH,IAIlBmwH,IACDD,GAAW9oH,SAASC,cAAc,QAClC6oH,GAAS5gH,UAAUxS,IAAI,aAAc,kBAAmB,aAAc,mBACtEqK,EAAUM,OAAOyoH,I,CAIrB,MAAMn/F,GAGF,CAAC,EAEL,GAAqB,cAAlBrzB,EAAI+U,UAA2B,CAChC,MAAM29G,QAAiB,OAAU,CAC/B73F,MAAO76B,EACPwG,UACAiD,YACA+wB,WACAC,YACAmwF,WACAhkG,QACA3G,gBACAsV,aACAoF,mBACA/E,eACA4F,mBACAt1B,KAAMgmB,EACN5mB,aAKF,OAFA+tB,GAAI3lB,MAAQglH,EACZr/F,GAAI9G,YAAcmmG,EAAS98F,aAAasF,KACjC7H,E,CAQT,IAAI7Y,GAEJ,MAAMjW,IAAQ,SAGd,GAFAA,GAAMqN,UAAUxS,IAAI,eACpBmF,GAAM6G,OAAQ,EACE,UAAbpL,EAAIC,KAAkB,CACvB,MAAM0yH,EAAWjpH,SAASC,cAAc,OACxCgpH,EAAS/gH,UAAUxS,IAAI,cAAe,aACtCuzH,EAASvqG,QAAQ9hB,IAAM,GAAKE,EAAQF,IACpCqsH,EAASvqG,QAAQ/hB,OAAS,GAAKG,EAAQH,OACtCssH,EAAiBnsH,QAAUA,EAE5B,MAAMN,EAAO,iBACP0sH,EAAW1sH,EAAKqf,MAAQ,EACxBiuB,EAAc,IACd6R,EAASutE,EAA0B,EAAdp/E,EAC3Bm/E,EAASvxG,UAAY,qCAAqClb,EAAKqf,kBAAkBrf,EAAKqf,6IACMiuB,UAAoBo/E,UAAiBA,SAAgBvtE,sCAGjJ,MAAMpb,EAAS0oF,EAAS/+G,kBAAkBA,kBACtCq+G,IACFA,EAA0B,EAAIptH,KAAK2gD,GAAKH,GAE1Cpb,EAAOrgC,MAAM8uE,gBAAkBu5C,EAA0B,IAAMA,EAC/DhoF,EAAOrgC,MAAMipH,iBAAmB,GAAKZ,EAErCM,GAAS3gH,UAAUxS,IAAI,SAENoH,EAAQsF,OAAOI,cAE9BymH,EAAS/gH,UAAUxS,IAAI,aAGzB,MAAMuC,EAAS+H,SAASC,cAAc,UACtChI,EAAO4jB,MAAQ5jB,EAAOgkB,OAAS3lB,EAAIyM,EAEnCkmH,EAASt8G,QAAQ1U,EAAQ4wH,IACzBI,EAAS5oH,OAAOxF,IAChBkF,EAAUM,OAAO4oH,GAEjB,MAAM/hD,EAAMjvE,EAAO8lB,WAAW,MAKxBoY,EAAS,KACb,MAAMr5B,EAA4BmsH,EAAiBnsH,QAC7CssH,EAAc,aAAoCtsH,GAAU+8G,GAC5Dz/F,EAAQ,MACX,0BAAoCJ,QAAQlX,WAAWgK,SAAQ,MAC3D,OAAQs8G,KAIXA,EAAY/iH,oBAAoB,OAAQ5J,GACxC2sH,EAAY/iH,oBAAoB,aAAcy9B,GAC9CslF,EAAY/iH,oBAAoB,QAASgjH,GACzCD,EAAY/iH,oBAAoB,QAASlI,GAAQ,GACjD,EAGEmrH,EAAU,KACdpiD,EAAI7oD,UAAU+qG,EAAa,EAAG,GAE9B,MAAM92F,EAASi2F,EAA0Ba,EAAYluH,YAAckuH,EAAY5tH,SAAW+sH,EAG1F,OAFAhoF,EAAOrgC,MAAMipH,iBAAmB,GAAK72F,GAE7B82F,EAAYnwH,MAAM,EAGtB4qC,EAAe,KACfulF,EAAY5tH,YAIZ,OAAQ4tH,IAKTA,EAAYnwH,QACbqwH,IAGFT,GAAS31F,WAAY,OAASk2F,EAAY5tH,SAAW4tH,EAAYluH,aAAa,IAR5Ekf,IAQkF,EAGhF0pB,GAAsB,QAAS,MACnC,QAAQD,EAAa,GACpB,KAAM,GAEHpnC,EAAS,KACb5B,GAAMqN,UAAUxS,IAAI,QACpBuzH,EAAS/gH,UAAU/Q,OAAO,cAC1B,QAAcmyH,EAASrxH,GAEpB6Y,IAAaA,GAAUA,WAAaA,GAAUA,UAAU5I,UAAUqB,SAAS,WAC5EuH,GAAUlI,S,EAIRygH,EAAW,MACX,OAAQD,GAKZH,EAAS/gH,UAAUxS,IAAI,aAJrB0kB,GAIiC,EAG/Bjc,EAAU,KACdtD,GAAMqN,UAAU/Q,OAAO,QACvB8xH,EAAS/gH,UAAUxS,IAAI,aAEvBmF,GAAMK,YAAc,EACpB2tH,GAAS31F,WAAY,OAASk2F,EAAY5tH,UAAU,GAEjD4tH,EAAYluH,cACbkuH,EAAYluH,YAAc,E,EAI9BkuH,EAAY7mH,iBAAiB,OAAQ9F,GACrC2sH,EAAY7mH,iBAAiB,aAAcuhC,GAC3CslF,EAAY7mH,iBAAiB,QAAS8mH,GACtCD,EAAY7mH,iBAAiB,QAASpE,IAEtC,QAAiBlG,GAASyE,IAaxB,IAZA,OAAYA,GAGToU,KAAcA,GAAUg9D,UACzBh9D,GAAUlI,UAQTwgH,EAAYnwH,OAAQ,CACrB,MAAMssC,IAAqBxmC,EAC3B,GAAG,qBAA4CA,GAAiB,CAC9DpC,OAAQ,KACRoK,YAAa,CAACxC,EAAG,4BACjBihC,WAAW,IACT,CACF,MAAOngC,EAAM9G,GAASgnC,GAAwB,QAAiB0jF,EAAUnsH,EAAQF,KAAxC,GACzC,eAAsC,CAACD,OAAQG,EAAQH,OAAQC,IAAKE,EAAQF,KAAMyI,EAAM9G,E,CAG1F6qH,EAAYhwH,M,MAEZgwH,EAAYlwH,O,IAIbkwH,EAAYnwH,OACVmwH,EAAY5tH,UAAY4tH,EAAYluH,cAAgBkuH,EAAY5tH,UAAY4tH,EAAYluH,YAAc,GACvGouH,IACAzlF,IACAhpC,GAAMqN,UAAUxS,IAAI,SAEpB2zH,IAGF5sH,G,EAIDK,EAAQsF,OAAOo/B,aACfynF,EAAiB9yF,OAASA,EAC3B8yF,EAASvqG,QAAQ6iB,WAAa,KAE9BpL,G,MAEOuyF,IACT7tH,GAAM1B,UAAW,GAGnB,IAAI6vH,GAgEA9sH,GA/DJ,GAAGY,EAAS,CAoBV,GAnBAksH,SAAiB,OAAU,CACzB73F,MAAO76B,EACPwG,UACAiD,YACA+wB,WACAC,YACAmwF,WACAhkG,QACA3G,gBACAsV,aACAoF,kBAAkB,EAClB/E,eACA4F,iBAAkB4T,aAAY,EAAZA,EAAcvU,MAChC30B,KAAMgmB,EACN5mB,aAGF+tB,GAAI3lB,MAAQglH,IAEPJ,IAA4B,QAAbtyH,EAAIC,MAAmBy6B,EAEzC,OADArH,GAAI9G,YAAcmmG,GAAS98F,aAAasF,KACjC7H,GAGT,GAAGu3F,EAAU,CACX,MAAMthG,GAAiBopG,GAASz3F,OAAOvtB,OAASglH,GAASz3F,OAAOC,MAAM5jB,cACtE/S,GAAMghB,OAAS+D,EAAcN,eAAe,KAAM,SAClDzkB,GAAMohB,QAAU2D,EAAcN,eAAe,KAAM,UACnDM,EAAcvf,OAAOxF,G,OAElB,IAAIq2D,EAAW,CACpB,MAAMvuC,GAAW,OAAyBrsB,EAAK,CAAC,GAAiB,GACjE,GAAGqsB,EAAU,CACX,MAAMwsD,EAAaxsD,EAASrE,MAC5B6wD,EAAWjnE,UAAUxS,IAAI,gBACzBqK,EAAUM,OAAO8uE,GACjBxlD,GAAI3lB,MAAQ,CACVkoB,aAAc,CACZloB,MAAO2e,EAASE,YAChB2O,KAAMxX,QAAQlX,WAEhByuB,OAAQ,CACNvtB,MAAOmrE,EACP39C,KAAM,MAER1gB,UAAW,KACX8K,SAAU,MAGZsQ,SAAAA,EAAcl1B,KAAK2rB,EAASE,aAC5B8G,GAAI9G,YAAcF,EAASE,W,EAI/B,GAAGmO,EACD,OAAOrH,IAGL9uB,GAAM+S,eAAiB7N,KACxBipH,cAAQ,EAARA,GAAUptG,WAAY7b,GAAWM,OAAOxF,IAI3C,MAAMuB,GAAkB,IAAW,EAAD,gCAChC,OAAOF,SAAqBN,EAASO,cAAcC,gBAAgB9F,EAAKmyH,aAAS,EAATA,EAAWlyH,KACrF,UAEM6F,KAEN,MAAM09G,GAAiBh9G,aAAO,EAAPA,EAAS2kC,kBAC7Bq4E,IACDhpG,GAAY,IAAI,IAAqB,CACnCk9D,aAAc,UACdD,UAAU,IAEZj9D,GAAUgU,cAAc,cAA6Bg1F,KACrDhpG,GAAU6S,OAAO5jB,GAAW,GAC5B85G,OAAiBjhH,GACRsD,GAAawmB,YAAepsB,EAAI0F,mBAAsBi1B,EAIvD36B,EAAI0F,oBACZ8U,GAAY,IAAI,IAAqB,CACnCwF,YAAY,EACZ03D,aAAc,aANhBl9D,GAAY,IAAI,IAAqB,CACnCk9D,aAAc,YASlB,MAAMu7C,IAAiB,SAevB,GAdA1uH,GAAM0H,iBAAiB,SAAU7F,IACP,IAArB7B,GAAMypB,MAAM9V,MACbzN,QAAQujB,MAAM,SAAWzpB,GAAMypB,MAAM9V,KAAO,cAAgB3T,GAAMypB,MAAMxnB,SAGvEgU,KAAcgpG,IACfhpG,GAAU+S,SAGR0lG,GAAensG,aACjBmsG,GAAezmH,S,GAEhB,CAACF,MAAM,IAEM,UAAbtM,EAAIC,KAAkB,CACvB,MAAMstC,EAAe,KACfhpC,GAAMW,WAIVqtH,GAAS31F,WAAY,OAASr4B,GAAMW,SAAWX,GAAMK,aAAa,GAAM,EAGpE4oC,GAAsB,QAAS,MACnC,QAAQD,EAAa,GACpB,KAAK,GAERhpC,GAAM0H,iBAAiB,aAAcuhC,GAElCglF,IACDjuH,GAAM0H,iBAAiB,cAAc,KACnC,kBAA4BumH,IAAU,KACpCA,GAAS3xH,QAAQ,GACjB,GACD,CAACyL,MAAM,G,CAId/H,GAAM6G,OAAQ,EACd7G,GAAMxC,MAAO,EAETqwH,IACF7tH,GAAM1B,UAAW,GAGnB,IAAIqwH,GAAqB3P,IAAqC,QAAnB,EAAAmP,cAAQ,EAARA,GAAUl4G,iBAAS,eAAEm9D,UAChE,MAAM12E,GAAO,IAAW,EAAD,gCAClBuZ,IAAa+oG,IAAmB5oF,IACjCngB,GAAUhR,YACVgR,GAAUmU,mBAGN7oB,KACN,IAAIymB,EAA4B7I,QAAQlX,UACxC,GAAIgO,KAAcgpG,IAAmB7oF,EACnC,GAAI/0B,GAAawmB,YAAepsB,EAAI0F,kBAW1B1F,EAAI0F,oBACT69G,EACDh3F,EAAc7I,QAAQC,QAAO,OAAU,sBAC9B/d,GAAawmB,YAAc5R,KACpCA,GAAU6S,OAAO5jB,GAAW,EAAO,MACnClF,GAAM0H,iBAAiB,EAAAnL,UAAY,aAAe,WAAW,KAC3D0Z,GAAU+S,QAAQ,GACjB,CAACjhB,MAAM,UAlByC,CACrD,MAAMM,EAAU2f,EAAc,qBAAoC,CAChExoB,MAAO/D,EACP0R,QAASuO,aAAa,EAAbA,EAAevO,QACxB45G,UAAW/H,EACX71G,MAAOykH,IAGN33G,IACDA,GAAU6S,OAAO5jB,GAAW,EAAOmD,E,CAsDzC,OAxCI22G,GAAkB2P,KACpBA,KACAA,GAAqB,MAGvB3P,OAAiBjhH,EAEjBiqB,EAAY5f,MAAK,IAAW,EAAD,iCACtB4oB,GAAeA,KAKF,UAAbv1B,EAAIC,MACL,+BAAsDuG,EAAQH,OAAQG,EAAQF,IAAKE,EAAQsF,OAAOC,oBAG9FjG,MAEN,OAAYvB,IAAOoI,MAAK,KACnBhO,GACD,iBAAkC4F,GAAO5F,GAGxC6b,KAAcgpG,IACfhpG,GAAU+S,SAGZ0lG,GAAezmH,SAAS,IACtB3I,IACF4G,QAAQujB,MAAM,mBAAoBnqB,GAC/B0uH,IACDA,GAAS3gH,UAAUxS,IAAI,YAEzB6zH,GAAetvG,OAAO9f,EAAI,KAG5B,QAAmBU,GAAOqB,GAAaG,MA5BrCktH,GAAezmH,SA6BnB,KAAG,KAEI,CAACgI,SAAU+X,EAAawe,OAAQrnB,QAAQqH,IAAI,CAACwB,EAAa0mG,KACnE,IAwCA,OAtCGz4G,KAAcgpG,IACfhpG,GAAUs1B,oBAAoB7uC,IAqBhB,QAAbjB,EAAIC,MAAmBqyH,GAOxBj/F,GAAI9G,YAAetM,GAEhBA,EAAcvf,KAAK,CAAC+rB,IAAKhjB,EAAWxI,KAAM,IAAMA,KAAO0L,MAAK,EAAEo+B,YAAYA,MAAWrnB,QAAQlX,kBADvFvL,MAAQ8pC,QAPjB,QAAiBthC,GAAYrD,KAC3B,OAAYA,GACZosH,GAAS3xH,SACTI,IAAM,GACL,CAACoS,SAAS,EAAM/G,MAAM,IAOxB+mB,GAAI3lB,cACC2lB,GAAI3lB,MAAMkoB,aAAaloB,OAGxB2lB,E,IA5iBT,qBAA4B,gBAAgB,CAAC7b,EAAM6xF,KACjD,GAAGA,IAAO,YAAqB7xF,IAAS,WAAmB,CACzD,MAAM+P,EAAWhQ,MAAMC,KAAK9N,SAASoN,iBAAiB,gCAChDyO,EAAQ,uBACRqtG,EAAWrtG,EAAQ,EACnB8/B,EAASutE,EAAW,EAC1BX,EAA0B,EAAIptH,KAAK2gD,GAAKH,EACxC99B,EAASnkB,SAAS7C,IAChBA,EAAQioB,eAAe,KAAM,QAAS,GAAKjD,GAC3ChlB,EAAQioB,eAAe,KAAM,SAAU,GAAKjD,GAE5C,MAAM0kB,EAAS1pC,EAAQqT,kBACvBq2B,EAAOzhB,eAAe,KAAM,KAAM,GAAKoqG,GACvC3oF,EAAOzhB,eAAe,KAAM,KAAM,GAAKoqG,GACvC3oF,EAAOzhB,eAAe,KAAM,IAAK,GAAK68B,GAEtCpb,EAAOrgC,MAAM8uE,gBAAkBu5C,EAA0B,IAAMA,EAC/DhoF,EAAOrgC,MAAMipH,iBAAmB,GAAKZ,CAAuB,G,2EClDnD,SAASkB,EAAuBx3F,GAC7C,MAAMy3F,GAAuB,OAAaz3F,EAAQU,aAAe,GAAI,IAAK,KAS1E,OAAO,QAAa+2F,EAItB,C,uECde,SAASC,EAAiB13F,GACvC,IAAI23F,EAAa33F,EAAQvuB,OAASuuB,EAAQ/oB,QAAU+oB,EAAQ43F,WAAa,GAEzE,OADAD,GAAa,OAAaA,EAAY,GAAI,MACnC,QAAaA,EAAY,CAAC9I,SAAS,EAAMttD,cAAc,GAChE,C,+CCEA,MAEA,EAFmD,CAAC,IAAM,CAAC,KAAO,MAAM,MAAQ,8BAA8B,OAAS,MAAM,OAAS,QAAQ,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,iBAAiB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,eAAe,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAM,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,gBAAgB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,iBAAiB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,oBAAoB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,oBAAoB,OAAS,MAAM,OAAS,OAAO,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,wCAAwC,OAAS,MAAM,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,mBAAmB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,gBAAgB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,gBAAgB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,qBAAqB,OAAS,MAAM,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,iBAAiB,OAAS,KAAK,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,mBAAmB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,kBAAkB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,cAAc,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,KAAK,WAAa,UAAU,IAAM,CAAC,KAAO,MAAM,MAAQ,eAAe,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,wBAAwB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,iBAAiB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,SAAS,WAAa,cAAc,IAAM,CAAC,KAAO,MAAM,MAAQ,oBAAoB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,eAAe,OAAS,MAAM,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,eAAe,OAAS,MAAM,OAAS,KAAK,cAAgB,GAAG,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,iBAAiB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,iBAAiB,OAAS,MAAM,OAAS,QAAQ,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,iBAAiB,OAAS,MAAM,OAAS,QAAQ,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,iBAAiB,OAAS,MAAM,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,OAAO,OAAS,IAAI,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,gBAAgB,OAAS,IAAI,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,KAAK,WAAa,UAAU,IAAM,CAAC,KAAO,MAAM,MAAQ,gBAAgB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,qBAAqB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,mBAAmB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,mBAAmB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,gBAAgB,OAAS,MAAM,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,mBAAmB,OAAS,MAAM,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,oBAAoB,OAAS,MAAM,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,UAAU,WAAa,eAAe,IAAM,CAAC,KAAO,MAAM,MAAQ,qBAAqB,OAAS,IAAI,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,eAAe,OAAS,IAAI,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,kBAAkB,OAAS,MAAM,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,kBAAkB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,eAAe,OAAS,IAAI,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,kBAAkB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,kBAAkB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,mBAAmB,OAAS,IAAI,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,oBAAoB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,iBAAiB,OAAS,MAAM,OAAS,QAAQ,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,SAAS,WAAa,cAAc,IAAM,CAAC,KAAO,MAAM,MAAQ,mBAAmB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,kBAAkB,OAAS,MAAM,OAAS,QAAQ,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,eAAe,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,mBAAmB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,SAAS,WAAa,cAAc,IAAM,CAAC,KAAO,MAAM,MAAQ,kBAAkB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,oBAAoB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,eAAe,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,oBAAoB,OAAS,MAAM,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,qBAAqB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,iBAAiB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,qBAAqB,OAAS,MAAM,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,kBAAkB,OAAS,MAAM,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,iBAAiB,OAAS,MAAM,OAAS,OAAO,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,qBAAqB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,oBAAoB,OAAS,MAAM,OAAS,MAAO,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,KAAK,WAAa,UAAU,IAAM,CAAC,KAAO,MAAM,MAAQ,qBAAqB,OAAS,MAAM,OAAS,MAAO,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,kBAAkB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,kBAAkB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,eAAe,OAAS,MAAM,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,qBAAqB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,eAAe,OAAS,MAAM,OAAS,QAAQ,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,eAAe,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,gBAAgB,OAAS,MAAM,OAAS,OAAO,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,gBAAgB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,cAAc,OAAS,MAAM,OAAS,QAAQ,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,gBAAgB,OAAS,MAAM,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,mBAAmB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,YAAY,OAAS,IAAI,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,qBAAqB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,eAAe,OAAS,MAAM,OAAS,KAAK,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,6BAA6B,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,MAAM,WAAa,WAAW,IAAM,CAAC,KAAO,MAAM,MAAQ,oBAAoB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,qBAAqB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,SAAS,WAAa,cAAc,IAAM,CAAC,KAAO,MAAM,MAAQ,oBAAoB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAM,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,mBAAmB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,uBAAuB,OAAS,IAAI,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAM,IAAM,EAAE,WAAa,MAAM,WAAa,KAAS,IAAM,CAAC,KAAO,MAAM,MAAQ,iBAAiB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,YAAY,IAAM,CAAC,KAAO,MAAM,MAAQ,kBAAkB,OAAS,MAAM,OAAS,MAAM,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,UAAU,WAAa,eAAe,IAAM,CAAC,KAAO,MAAM,MAAQ,kBAAkB,OAAS,IAAI,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAM,eAAgB,EAAK,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,cAAc,OAAS,MAAM,OAAS,QAAQ,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,QAAQ,WAAa,aAAa,IAAM,CAAC,KAAO,MAAM,MAAQ,qBAAqB,OAAS,MAAM,OAAS,IAAI,cAAgB,IAAI,YAAc,IAAI,aAAc,EAAK,eAAgB,EAAK,IAAM,EAAE,WAAa,OAAO,WAAa,Y,uDCR55iB,MAAMs2D,EAAyE,CAAC,GAAK,CAAC,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,IAAK,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,+BAA+B,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,GAAI,GAAG,CAAC,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,KAAM,KAAO,KAAM,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,KAAM,KAAO,KAAM,KAAO,KAAM,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,IAAK,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,KAAM,KAAO,MAAO,KAAO,KAAM,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,KAAM,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,KAAM,KAAO,KAAM,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,OAAO,MAAO,OAAO,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,MAAO,kBAAkB,MAAO,QAAQ,MAAO,kBAAkB,MAAO,4CAA4C,MAAO,4CAA4C,MAAO,4CAA4C,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,6BAA6B,KAAM,wCAAwC,KAAM,QAAQ,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,6BAA6B,KAAM,6BAA6B,KAAM,wCAAwC,KAAM,wCAAwC,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,GAAI,QAAQ,IAAK,QAAQ,IAAK,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,GAAI,QAAQ,IAAK,QAAQ,IAAK,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,IAAK,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,IAAK,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,iBAAiB,KAAM,iBAAiB,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aA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","sources":["webpack://tweb/./src/components/animationIntersector.ts","webpack://tweb/./src/components/appMediaPlaybackController.ts","webpack://tweb/./src/components/appMediaViewer.ts","webpack://tweb/./src/lib/mediaPlayer.ts","webpack://tweb/./src/helpers/number/isBetween.ts","webpack://tweb/./src/components/appMediaViewerBase.ts","webpack://tweb/./src/helpers/fillPropertyValue.ts","webpack://tweb/./src/components/appNavigationController.ts","webpack://tweb/./src/components/appSearch.ts","webpack://tweb/./src/components/appSearchSuper..ts","webpack://tweb/./src/helpers/dom/lockTouchScroll.ts","webpack://tweb/./src/components/appSelectPeers.ts","webpack://tweb/./src/components/audio.ts","webpack://tweb/./src/helpers/avatarListLoader.ts","webpack://tweb/./src/components/appMediaViewerAvatar.ts","webpack://tweb/./src/components/avatar.ts","webpack://tweb/./src/components/avatarEdit.ts","webpack://tweb/./src/components/button.ts","webpack://tweb/./src/components/buttonCorner.ts","webpack://tweb/./src/components/buttonIcon.ts","webpack://tweb/./src/components/buttonMenu.ts","webpack://tweb/./src/components/buttonMenuToggle.ts","webpack://tweb/./src/components/chat/gradientRenderer.ts","webpack://tweb/./src/helpers/easing/easeOutQuad.ts","webpack://tweb/./src/components/chat/selection.ts","webpack://tweb/./src/helpers/dom/getSelectedText.ts","webpack://tweb/./src/components/checkboxField.ts","webpack://tweb/./src/components/codeInputField.ts","webpack://tweb/./src/components/confirmationPopup.ts","webpack://tweb/./src/components/countryInputField.ts","webpack://tweb/./src/components/dotRenderer.ts","webpack://tweb/./src/components/editPeer.ts","webpack://tweb/./src/components/emoticonsDropdown/tabs/gifs.ts","webpack://tweb/./src/components/sidebarRight/tabs/gifs.ts","webpack://tweb/./src/components/sidebarRight/tabs/stickers.ts","webpack://tweb/./src/components/emoticonsDropdown/index.ts","webpack://tweb/./src/components/emoticonsDropdown/tabs/emoji.ts","webpack://tweb/./src/lib/richTextProcessor/wrapSingleEmoji.ts","webpack://tweb/./src/components/lazyLoadQueueRepeat.ts","webpack://tweb/./src/components/emoticonsDropdown/tabs/stickers.ts","webpack://tweb/./src/components/generateDelimiter.ts","webpack://tweb/./src/components/generateFakeIcon.ts","webpack://tweb/./src/components/lazyLoadQueueRepeat2.ts","webpack://tweb/./src/components/gifsMasonry.ts","webpack://tweb/./src/components/horizontalMenu.ts","webpack://tweb/./src/components/inputField.ts","webpack://tweb/./src/helpers/dom/selectElementContents.ts","webpack://tweb/./src/components/inputSearch.ts","webpack://tweb/./src/components/lazyLoadQueue.ts","webpack://tweb/./src/components/lazyLoadQueueIntersector.ts","webpack://tweb/./src/components/mediaProgressLine.ts","webpack://tweb/./src/components/middleEllipsis.ts","webpack://tweb/./src/components/monkeys/password.ts","webpack://tweb/./src/components/monkeys/tracking.ts","webpack://tweb/./src/components/passwordInputField.ts","webpack://tweb/./src/components/peerProfileAvatars.ts","webpack://tweb/./src/components/peerProfile.ts","webpack://tweb/./src/components/generateTitleIcons.ts","webpack://tweb/./src/components/generateVerifiedIcon.ts","webpack://tweb/./src/components/generatePremiumIcon.ts","webpack://tweb/./src/components/peerTitle.ts","webpack://tweb/./src/components/popups/avatar.ts","webpack://tweb/./src/lib/cropper.ts","webpack://tweb/./src/components/popups/deleteDialog.ts","webpack://tweb/./src/components/popups/deleteMessages.ts","webpack://tweb/./src/components/popups/forward.ts","webpack://tweb/./src/components/popups/index.ts","webpack://tweb/./src/components/popups/limit.ts","webpack://tweb/./src/components/popups/mute.ts","webpack://tweb/./src/components/popups/peer.ts","webpack://tweb/./src/components/popups/pickUser.ts","webpack://tweb/./src/components/popups/sendNow.ts","webpack://tweb/./src/components/popups/stickers.ts","webpack://tweb/./src/components/preloader.ts","webpack://tweb/./src/components/putPhoto.ts","webpack://tweb/./src/components/wrappers/getPeerInitials.ts","webpack://tweb/./src/components/putPreloader.ts","webpack://tweb/./src/components/radioField.ts","webpack://tweb/./src/components/radioForm.ts","webpack://tweb/./src/components/rangeSelector.ts","webpack://tweb/./src/components/ripple.ts","webpack://tweb/./src/components/row.ts","webpack://tweb/./src/components/scrollable.ts","webpack://tweb/./src/components/settingSection.ts","webpack://tweb/./src/components/sidebarLeft/tabs/newGroup.ts","webpack://tweb/./src/lib/appManagers/utils/privacy/privacyType.ts","webpack://tweb/./src/lib/appManagers/utils/privacy/getPrivacyRulesDetails.ts","webpack://tweb/./src/components/privacySection.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/phoneNumber.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/passwordSet.ts","webpack://tweb/./src/helpers/dom/canFocus.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/emailConfirmation.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/email.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/hint.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/reEnterPassword.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/enterPassword.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/index.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/lastSeen.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/profilePhoto.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/forwardMessages.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/addToGroups.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/calls.ts","webpack://tweb/./src/components/sidebarLeft/tabs/activeSessions.ts","webpack://tweb/./src/components/sidebarLeft/tabs/blockedUsers.ts","webpack://tweb/./src/helpers/string/convertKeyToInputKey.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/voices.ts","webpack://tweb/./src/components/sidebarLeft/tabs/activeWebSessions.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacyAndSecurity.ts","webpack://tweb/./src/components/sidebarLeft/tabs/quickReaction.ts","webpack://tweb/./src/components/sidebarLeft/tabs/generalSettings.ts","webpack://tweb/./src/helpers/eachMinute.ts","webpack://tweb/./src/helpers/eachTimeout.ts","webpack://tweb/./src/components/sidebarLeft/tabs/chatFolders.ts","webpack://tweb/./src/components/sidebarLeft/tabs/notifications.ts","webpack://tweb/./src/components/sidebarLeft/tabs/language.ts","webpack://tweb/./src/components/sidebarLeft/tabs/autoDownload/photo.ts","webpack://tweb/./src/components/sidebarLeft/tabs/autoDownload/file.ts","webpack://tweb/./src/components/sidebarLeft/tabs/autoDownload/video.ts","webpack://tweb/./src/components/sidebarLeft/tabs/dataAndStorage.ts","webpack://tweb/./src/components/sidebarLeft/tabs/settings.ts","webpack://tweb/./src/components/sidebarLeft/tabs/newChannel.ts","webpack://tweb/./src/components/popups/createContact.ts","webpack://tweb/./src/components/sidebarLeft/tabs/contacts.ts","webpack://tweb/./src/components/sidebarLeft/tabs/archivedTab.ts","webpack://tweb/./src/components/sidebarLeft/tabs/peopleNearby.ts","webpack://tweb/./src/components/sidebarLeft/index.ts","webpack://tweb/./src/components/sidebarLeft/tabs/addMembers.ts","webpack://tweb/./src/helpers/averageColor.ts","webpack://tweb/./src/helpers/highlightningColor.ts","webpack://tweb/./src/components/colorPicker.ts","webpack://tweb/./src/components/sidebarLeft/tabs/backgroundColor.ts","webpack://tweb/./src/components/sidebarLeft/tabs/background.ts","webpack://tweb/./src/helpers/files/requestFile.ts","webpack://tweb/./src/components/sidebarLeft/tabs/includedChats.ts","webpack://tweb/./src/components/sidebarLeft/tabs/editFolder.ts","webpack://tweb/./src/components/sidebarLeft/tabs/editProfile.ts","webpack://tweb/./src/components/sidebarRight/index.ts","webpack://tweb/./src/components/sidebarRight/tabs/editContact.ts","webpack://tweb/./src/components/sidebarRight/tabs/editTopic.ts","webpack://tweb/./src/components/sidebarRight/tabs/chatType.ts","webpack://tweb/./src/components/sidebarRight/tabs/userPermissions.ts","webpack://tweb/./src/components/sidebarRight/tabs/groupPermissions.ts","webpack://tweb/./src/lib/appManagers/utils/chats/combineParticipantBannedRights.ts","webpack://tweb/./src/components/sidebarRight/tabs/chatReactions.ts","webpack://tweb/./src/components/sidebarRight/tabs/editChat.ts","webpack://tweb/./src/components/sidebarRight/tabs/sharedMedia.ts","webpack://tweb/./src/components/singleTransition.ts","webpack://tweb/./src/components/slider.ts","webpack://tweb/./src/components/sliderTab.ts","webpack://tweb/./src/components/sortedUserList.ts","webpack://tweb/./src/components/stickerViewer.ts","webpack://tweb/./src/components/stickyIntersector.ts","webpack://tweb/./src/components/swipeHandler.ts","webpack://tweb/./src/components/telInputField.ts","webpack://tweb/./src/components/toast.ts","webpack://tweb/./src/components/transition.ts","webpack://tweb/./src/lib/richTextProcessor/isUsernameValid.ts","webpack://tweb/./src/components/usernameInputField.ts","webpack://tweb/./src/components/usernamesSection.ts","webpack://tweb/./src/components/visibilityIntersector.ts","webpack://tweb/./src/components/volumeSelector.ts","webpack://tweb/./src/components/wrappers/customEmoji.ts","webpack://tweb/./src/components/wrappers/document.ts","webpack://tweb/./src/components/wrappers/formatUserPhone.ts","webpack://tweb/./src/components/wrappers/getChatMembersString.ts","webpack://tweb/./src/components/wrappers/getPeerTitle.ts","webpack://tweb/./src/components/wrappers/getUserStatusString.ts","webpack://tweb/./src/components/wrappers/mediaSpoiler.ts","webpack://tweb/./src/components/wrappers/messageActionTextNew.ts","webpack://tweb/./src/components/topicAvatar.ts","webpack://tweb/./src/components/wrappers/joinVoiceChatAnchor.ts","webpack://tweb/./src/components/wrappers/messageActionTextNewUnsafe.ts","webpack://tweb/./src/components/wrappers/messageForReply.ts","webpack://tweb/./src/components/wrappers/peerTitle.ts","webpack://tweb/./src/components/wrappers/photo.ts","webpack://tweb/./src/components/wrappers/senderToPeer.ts","webpack://tweb/./src/components/wrappers/sentTime.ts","webpack://tweb/./src/components/wrappers/sticker.ts","webpack://tweb/./src/helpers/bytes/getPathFromBytes.ts","webpack://tweb/./src/helpers/computeLockColor.ts","webpack://tweb/./src/components/wrappers/stickerAnimation.ts","webpack://tweb/./src/components/wrappers/stickerEmoji.ts","webpack://tweb/./src/components/wrappers/stickerSetThumb.ts","webpack://tweb/./src/components/wrappers/stickerToRow.ts","webpack://tweb/./src/components/wrappers/topicNameButton.ts","webpack://tweb/./src/components/wrappers/video.ts","webpack://tweb/./src/components/wrappers/webPageDescription.ts","webpack://tweb/./src/components/wrappers/webPageTitle.ts","webpack://tweb/./src/config/currencies.ts","webpack://tweb/./src/config/emoji.ts","webpack://tweb/./src/config/font.ts","webpack://tweb/./src/environment/imageBitmapSupport.ts","webpack://tweb/./src/helpers/animation.ts","webpack://tweb/./src/helpers/array/filterAsync.ts","webpack://tweb/./src/helpers/array/findAndSpliceAll.ts","webpack://tweb/./src/helpers/audioAssetPlayer.ts","webpack://tweb/./src/helpers/blob/readBlobAsDataURL.ts","webpack://tweb/./src/helpers/heavyQueue.ts","webpack://tweb/./src/helpers/blur.ts","webpack://tweb/./src/helpers/bytes/getPreviewURLFromBytes.ts","webpack://tweb/./src/helpers/bytes/bytesToDataURL.ts","webpack://tweb/./src/helpers/calcImageInBox.ts","webpack://tweb/./src/helpers/canvas/drawCircle.ts","webpack://tweb/./src/helpers/canvas/getTextWidth.ts","webpack://tweb/./src/helpers/canvas/scaleMediaElement.ts","webpack://tweb/./src/helpers/cleanSearchText.ts","webpack://tweb/./src/helpers/clipboard.ts","webpack://tweb/./src/helpers/contextMenuController.ts","webpack://tweb/./src/helpers/date.ts","webpack://tweb/./src/helpers/dom/anchorCopy.ts","webpack://tweb/./src/helpers/dom/attachContextMenuListener.ts","webpack://tweb/./src/helpers/dom/attachGrabListeners.ts","webpack://tweb/./src/helpers/dom/cancelSelection.ts","webpack://tweb/./src/helpers/dom/clickEvent.ts","webpack://tweb/./src/helpers/dom/controlsHover.ts","webpack://tweb/./src/helpers/dom/createContextMenu.ts","webpack://tweb/./src/helpers/dom/createStickersContextMenu.ts","webpack://tweb/./src/helpers/dom/createVideo.ts","webpack://tweb/./src/helpers/dom/customProperties.ts","webpack://tweb/./src/helpers/dom/dispatchEvent.ts","webpack://tweb/./src/helpers/dom/documentFragmentToHTML.ts","webpack://tweb/./src/helpers/dom/findUpAsChild.ts","webpack://tweb/./src/helpers/dom/findUpAttribute.ts","webpack://tweb/./src/helpers/dom/findUpTag.ts","webpack://tweb/./src/helpers/dom/fullScreen.ts","webpack://tweb/./src/helpers/dom/getCaretPosNew.ts","webpack://tweb/./src/helpers/dom/getRichElementValue.ts","webpack://tweb/./src/helpers/dom/getRichValueWithCaret.ts","webpack://tweb/./src/helpers/dom/getViewportSlice.ts","webpack://tweb/./src/helpers/dom/getVisibleRect.ts","webpack://tweb/./src/helpers/dom/handleHorizontalSwipe.ts","webpack://tweb/./src/helpers/dom/handleTabSwipe.ts","webpack://tweb/./src/helpers/dom/htmlToDocumentFragment.ts","webpack://tweb/./src/helpers/dom/htmlToSpan.ts","webpack://tweb/./src/helpers/dom/isInDOM.ts","webpack://tweb/./src/helpers/dom/isInputEmpty.ts","webpack://tweb/./src/helpers/dom/isSendShortcutPressed.ts","webpack://tweb/./src/helpers/dom/isSwipingBackSafari.ts","webpack://tweb/./src/helpers/dom/placeCaretAtEnd.ts","webpack://tweb/./src/helpers/dom/positionElementByIndex.ts","webpack://tweb/./src/helpers/dom/renderImageFromUrl.ts","webpack://tweb/./src/helpers/dom/renderMediaWithFadeIn.ts","webpack://tweb/./src/helpers/dom/replaceContent.ts","webpack://tweb/./src/helpers/dom/compareNodes.ts","webpack://tweb/./src/helpers/dom/richInputHandler.ts","webpack://tweb/./src/helpers/dom/sortable.ts","webpack://tweb/./src/helpers/dom/toggleDisability.ts","webpack://tweb/./src/helpers/dom/whichChild.ts","webpack://tweb/./src/helpers/dropdownHover.ts","webpack://tweb/./src/helpers/fastSmoothScroll.ts","webpack://tweb/./src/helpers/fileName.ts","webpack://tweb/./src/helpers/filterChatPhotosMessages.ts","webpack://tweb/./src/helpers/formatBytes.ts","webpack://tweb/./src/helpers/formatCallDuration.ts","webpack://tweb/./src/helpers/formatDuration.ts","webpack://tweb/./src/helpers/formatPhoneNumber.ts","webpack://tweb/./src/helpers/framesCache.ts","webpack://tweb/./src/helpers/generatePathData.ts","webpack://tweb/./src/helpers/getImageFromStrippedThumb.ts","webpack://tweb/./src/helpers/getPreviewURLFromThumb.ts","webpack://tweb/./src/helpers/getStrippedThumbIfNeeded.ts","webpack://tweb/./src/helpers/listLoader.ts","webpack://tweb/./src/helpers/listenerSetter.ts","webpack://tweb/./src/helpers/mediaSize.ts","webpack://tweb/./src/helpers/mediaSizes.ts","webpack://tweb/./src/helpers/middlewarePromise.ts","webpack://tweb/./src/helpers/number/formatNumber.ts","webpack://tweb/./src/helpers/number/numberThousandSplitter.ts","webpack://tweb/./src/helpers/onMediaLoad.ts","webpack://tweb/./src/helpers/overlayClickHandler.ts","webpack://tweb/./src/helpers/paymentsWrapCurrencyAmount.ts","webpack://tweb/./src/helpers/positionMenu.ts","webpack://tweb/./src/helpers/restrictions.ts","webpack://tweb/./src/helpers/saveLottiePreview.ts","webpack://tweb/./src/helpers/schedulers/throttleWithRaf.ts","webpack://tweb/./src/helpers/schedulers/throttleWith.ts","webpack://tweb/./src/helpers/scrollableLoader.ts","webpack://tweb/./src/helpers/searchListLoader.ts","webpack://tweb/./src/lib/appManagers/utils/messageId/incrementMessageId.ts","webpack://tweb/./src/helpers/sequentialDom.ts","webpack://tweb/./src/helpers/setAttachmentSize.ts","webpack://tweb/./src/helpers/sortedList.ts","webpack://tweb/./src/helpers/string/bom.ts","webpack://tweb/./src/helpers/string/encodeEntities.ts","webpack://tweb/./src/helpers/string/escapeRegExp.ts","webpack://tweb/./src/helpers/string/limitSymbols.ts","webpack://tweb/./src/helpers/string/toHHMMSS.ts","webpack://tweb/./src/helpers/textToSvgURL.ts","webpack://tweb/./src/helpers/windowSize.ts","webpack://tweb/./src/hooks/useHeavyAnimationCheck.ts","webpack://tweb/./src/components/dialogsContextMenu.ts","webpack://tweb/./src/components/connectionStatus.ts","webpack://tweb/./src/components/sendingStatus.ts","webpack://tweb/./src/helpers/easing/easeInOutSine.ts","webpack://tweb/./src/helpers/canvas/roundRect.ts","webpack://tweb/./src/components/groupCallActiveIcon.ts","webpack://tweb/./src/helpers/canvas/shimmer.ts","webpack://tweb/./src/helpers/dialogsPlaceholder.ts","webpack://tweb/./src/helpers/dom/shake.ts","webpack://tweb/./src/lib/appManagers/appDialogsManager.ts","webpack://tweb/./src/helpers/number/getUnsafeRandomInt.ts","webpack://tweb/./src/lib/appManagers/appDownloadManager.ts","webpack://tweb/./src/helpers/dom/createDownloadAnchor.ts","webpack://tweb/./src/helpers/array/partition.ts","webpack://tweb/./src/components/chat/bubbleGroups.ts","webpack://tweb/./src/components/popups/datePicker.ts","webpack://tweb/./src/components/divAndCaption.ts","webpack://tweb/./src/components/chat/replyContainer.ts","webpack://tweb/./src/components/wrappers/reply.ts","webpack://tweb/./src/components/stackedAvatars.ts","webpack://tweb/./src/components/chat/replies.ts","webpack://tweb/./src/components/chat/messageRender.ts","webpack://tweb/./src/helpers/dom/reflowScrollableElement.ts","webpack://tweb/./src/lib/mtproto/constants.ts","webpack://tweb/./src/lib/appManagers/internalLink.ts","webpack://tweb/./src/components/popups/joinChatInvite.ts","webpack://tweb/./src/components/chat/reaction.ts","webpack://tweb/./src/components/chat/reactions.ts","webpack://tweb/./src/helpers/scrollSaver.ts","webpack://tweb/./src/helpers/dom/superIntersectionObserver.ts","webpack://tweb/./src/lib/appManagers/utils/messages/isMentionUnread.ts","webpack://tweb/./src/helpers/array/accumulate.ts","webpack://tweb/./src/helpers/cacheCallback.ts","webpack://tweb/./src/helpers/string/replaceNonNumber.ts","webpack://tweb/./src/helpers/cards/cardBrands.ts","webpack://tweb/./src/helpers/array/createArray.ts","webpack://tweb/./src/helpers/string/buggedNumbers.ts","webpack://tweb/./src/helpers/cards/patternCharacters.ts","webpack://tweb/./src/helpers/cards/cardFormattingPatterns.ts","webpack://tweb/./src/helpers/cards/formatValueByPattern.ts","webpack://tweb/./src/helpers/cards/validateCard.ts","webpack://tweb/./src/helpers/string/nbsp.ts","webpack://tweb/./src/components/telegramWebView.ts","webpack://tweb/./src/components/popups/paymentVerification.ts","webpack://tweb/./src/components/popups/paymentCard.ts","webpack://tweb/./src/helpers/cards/formatInputValueByPattern.ts","webpack://tweb/./src/components/popups/paymentCardConfirmation.ts","webpack://tweb/./src/components/popups/paymentShipping.ts","webpack://tweb/./src/components/popups/paymentShippingMethods.ts","webpack://tweb/./src/components/popups/payment.ts","webpack://tweb/./src/components/groupedLayout.ts","webpack://tweb/./src/components/prepareAlbum.ts","webpack://tweb/./src/components/wrappers/album.ts","webpack://tweb/./src/components/sidebarRight/tabs/pollResults.ts","webpack://tweb/./src/components/poll.ts","webpack://tweb/./src/helpers/string/isRTL.ts","webpack://tweb/./src/components/chat/bubbles.ts","webpack://tweb/./src/helpers/dom/copyFromElement.ts","webpack://tweb/./src/components/wrappers/groupedDocuments.ts","webpack://tweb/./src/components/wrappers/poll.ts","webpack://tweb/./src/components/popups/unpinMessage.ts","webpack://tweb/./src/helpers/dom/isSelectionEmpty.ts","webpack://tweb/./src/helpers/preloadAnimatedEmojiSticker.ts","webpack://tweb/./src/components/popups/reportMessagesConfirm.ts","webpack://tweb/./src/components/popups/reportMessages.ts","webpack://tweb/./src/components/popups/sponsored.ts","webpack://tweb/./src/components/popups/reactedList.ts","webpack://tweb/./src/components/chat/reactionsMenu.ts","webpack://tweb/./src/components/chat/contextMenu.ts","webpack://tweb/./src/components/chat/sendContextMenu.ts","webpack://tweb/./src/components/popups/createPoll.ts","webpack://tweb/./src/helpers/createPoster.ts","webpack://tweb/./src/helpers/getGifDuration.ts","webpack://tweb/./src/components/inputFieldAnimated.ts","webpack://tweb/./src/components/popups/newMedia.ts","webpack://tweb/./src/helpers/dom/attachListNavigation.ts","webpack://tweb/./src/components/chat/autocompleteHelper.ts","webpack://tweb/./src/components/chat/stickersHelper.ts","webpack://tweb/./src/components/popups/schedule.ts","webpack://tweb/./src/components/chat/emojiHelper.ts","webpack://tweb/./src/components/chat/autocompletePeerHelper.ts","webpack://tweb/./src/components/chat/commandsHelper.ts","webpack://tweb/./src/components/chat/autocompleteHelperController.ts","webpack://tweb/./src/components/chat/mentionsHelper.ts","webpack://tweb/./src/components/chat/replyKeyboard.ts","webpack://tweb/./src/components/chat/inlineHelper.ts","webpack://tweb/./src/components/chat/botCommands.ts","webpack://tweb/./src/helpers/modifyAckedResult.ts","webpack://tweb/./src/components/chat/sendAs.ts","webpack://tweb/./src/helpers/dom/hasMarkupInSelection.ts","webpack://tweb/./src/components/chat/input.ts","webpack://tweb/./src/components/wrappers/draft.ts","webpack://tweb/./src/components/chat/pinnedContainer.ts","webpack://tweb/./src/components/chat/pinnedMessageBorder.ts","webpack://tweb/./src/components/chat/audio.ts","webpack://tweb/./src/components/chat/pinnedMessage.ts","webpack://tweb/./src/helpers/dom/handleScrollSideEvent.ts","webpack://tweb/./src/components/chat/topbar.ts","webpack://tweb/./src/components/sidebarRight/tabs/search.ts","webpack://tweb/./src/components/chat/search.ts","webpack://tweb/./src/components/chat/patternRenderer.ts","webpack://tweb/./src/components/chat/chat.ts","webpack://tweb/./src/helpers/autoDownload.ts","webpack://tweb/./src/components/chat/markupTooltip.ts","webpack://tweb/./src/components/chat/dragAndDrop.ts","webpack://tweb/./src/helpers/dom/disableTransition.ts","webpack://tweb/./src/components/lineBlobDrawable.ts","webpack://tweb/./src/components/topbarWeave.ts","webpack://tweb/./src/lib/rlottie/rlottieIcon.ts","webpack://tweb/./src/components/superIcon.ts","webpack://tweb/./src/components/groupCall/microphoneIcon.ts","webpack://tweb/./src/components/groupCall/participantMutedIcon.ts","webpack://tweb/./src/components/groupCall/index.ts","webpack://tweb/./src/components/groupCall/participantStatus.ts","webpack://tweb/./src/components/groupCall/participantsList.ts","webpack://tweb/./src/components/call/videoCanvasBlur.ts","webpack://tweb/./src/components/groupCall/participantVideo.ts","webpack://tweb/./src/components/groupCall/participantVideos.ts","webpack://tweb/./src/components/groupCall/participants.ts","webpack://tweb/./src/components/groupCall/description.ts","webpack://tweb/./src/components/groupCall/title.ts","webpack://tweb/./src/components/call/button.ts","webpack://tweb/./src/components/movableElement.ts","webpack://tweb/./src/helpers/movablePanel.ts","webpack://tweb/./src/helpers/toggleClassName.ts","webpack://tweb/./src/components/call/description.ts","webpack://tweb/./src/components/groupCall/microphoneIconMini.ts","webpack://tweb/./src/components/call/index.ts","webpack://tweb/./src/components/topbarCall.ts","webpack://tweb/./src/lib/appManagers/uiNotificationsManager.ts","webpack://tweb/./src/config/notifications.ts","webpack://tweb/./src/helpers/files/getFilesFromEvent.ts","webpack://tweb/./src/helpers/addAnchorListener.ts","webpack://tweb/./src/lib/appManagers/appImManager.ts","webpack://tweb/./src/lib/appManagers/utils/messages/canSaveMessageMedia.ts","webpack://tweb/./src/lib/appManagers/utils/messages/getMediaFromMessage.ts","webpack://tweb/./src/lib/appManagers/utils/messages/getMessageSenderPeerIdOrName.ts","webpack://tweb/./src/lib/appManagers/utils/messages/isMessageRestricted.ts","webpack://tweb/./src/lib/appManagers/utils/peers/getPeerColorById.ts","webpack://tweb/./src/lib/appManagers/utils/peers/getPeerEditableUsername.ts","webpack://tweb/./src/lib/appManagers/utils/peers/getPeerId.ts","webpack://tweb/./src/lib/appManagers/utils/photos/choosePhotoSize.ts","webpack://tweb/./src/lib/calls/callConnectionInstanceBase.ts","webpack://tweb/./src/lib/calls/helpers/createPeerConnection.ts","webpack://tweb/./src/lib/calls/helpers/createDataChannel.ts","webpack://tweb/./src/lib/calls/helpers/parseSignalingData.ts","webpack://tweb/./src/lib/calls/callConnectionInstance.ts","webpack://tweb/./src/lib/crypto/subtle.ts","webpack://tweb/./src/lib/calls/p2P/p2PEncryptor.ts","webpack://tweb/./src/lib/crypto/utils/sha256.ts","webpack://tweb/./src/lib/calls/p2P/chromeP2PSdpBuilder.ts","webpack://tweb/./src/lib/calls/p2P/p2PSdpBuilder.js","webpack://tweb/./src/lib/calls/p2P/firefoxP2PSdpBuilder.js","webpack://tweb/./src/lib/calls/p2P/safariP2PSdpBuilder.js","webpack://tweb/./src/lib/calls/callInstance.ts","webpack://tweb/./src/lib/calls/p2P/getCallProtocol.ts","webpack://tweb/./src/lib/calls/p2P/getRtcConfiguration.ts","webpack://tweb/./src/lib/calls/helpers/getStreamCached.ts","webpack://tweb/./src/lib/calls/callInstanceBase.ts","webpack://tweb/./src/lib/calls/callState.ts","webpack://tweb/./src/components/call/getAudioAsset.ts","webpack://tweb/./src/lib/calls/callsController.ts","webpack://tweb/./src/lib/calls/constants.ts","webpack://tweb/./src/lib/calls/groupCallConnectionInstance.ts","webpack://tweb/./src/lib/calls/helpers/processMediaSection.ts","webpack://tweb/./src/lib/calls/helpers/filterServerCodecs.ts","webpack://tweb/./src/lib/calls/helpers/fixLocalOffer.ts","webpack://tweb/./src/lib/calls/groupCallInstance.ts","webpack://tweb/./src/lib/calls/groupCallState.ts","webpack://tweb/./src/components/groupCall/getAudioAsset.ts","webpack://tweb/./src/lib/calls/groupCallsController.ts","webpack://tweb/./src/lib/calls/helpers/createMainStreamManager.ts","webpack://tweb/./src/lib/calls/helpers/getAudioConstraints.ts","webpack://tweb/./src/environment/constraintSupport.ts","webpack://tweb/./src/lib/calls/helpers/getScreenConstraints.ts","webpack://tweb/./src/lib/calls/helpers/getScreenStream.ts","webpack://tweb/./src/lib/calls/helpers/getStream.ts","webpack://tweb/./src/lib/calls/helpers/getVideoConstraints.ts","webpack://tweb/./src/lib/calls/helpers/parseMediaSectionInfo.ts","webpack://tweb/./src/lib/calls/helpers/parseSourceGroups.ts","webpack://tweb/./src/lib/calls/helpers/stopTrack.ts","webpack://tweb/./src/lib/calls/localConferenceDescription.ts","webpack://tweb/./src/lib/calls/sdp/index.ts","webpack://tweb/./src/helpers/string/splitStringByLimitWithRest.ts","webpack://tweb/./src/helpers/uniqueNumberGenerator.ts","webpack://tweb/./src/lib/calls/sdp/attributeSplitted.ts","webpack://tweb/./src/lib/calls/sdp/mediaLineParts.ts","webpack://tweb/./src/lib/calls/sdp/line.ts","webpack://tweb/./src/lib/calls/sdp/attributeInner.ts","webpack://tweb/./src/lib/calls/sdp/attributes.ts","webpack://tweb/./src/lib/calls/sdp/mediaSection.ts","webpack://tweb/./src/lib/calls/sdp/sessionSection.ts","webpack://tweb/./src/lib/calls/sdp/utils.ts","webpack://tweb/./src/lib/calls/sdpBuilder.ts","webpack://tweb/./src/lib/calls/streamManager.ts","webpack://tweb/./src/lib/calls/stringFromLineBuilder.ts","webpack://tweb/./src/lib/calls/utils.ts","webpack://tweb/./src/lib/richTextProcessor/getAbbreviation.ts","webpack://tweb/./src/lib/richTextProcessor/getEmojiEntityFromEmoji.ts","webpack://tweb/./src/lib/richTextProcessor/matchEmail.ts","webpack://tweb/./src/lib/richTextProcessor/setBlankToAnchor.ts","webpack://tweb/./src/lib/richTextProcessor/wrapAbbreviation.ts","webpack://tweb/./src/lib/richTextProcessor/wrapDraftText.ts","webpack://tweb/./src/lib/richTextProcessor/wrapEmojiText.ts","webpack://tweb/./src/environment/emojiVersionsSupport.ts","webpack://tweb/./src/lib/richTextProcessor/wrapRichText.ts","webpack://tweb/./src/helpers/buildURLHash.ts","webpack://tweb/./src/lib/richTextProcessor/wrapTelegramUrlToAnchor.ts","webpack://tweb/./src/lib/rlottie/queryableWorker.ts","webpack://tweb/./src/environment/webAssemblySupport.ts","webpack://tweb/./src/lib/rlottie/lottieLoader.ts","webpack://tweb/./src/lib/rlottie/rlottiePlayer.ts","webpack://tweb/./src/pages/pagesManager.ts","webpack://tweb/./src/pages/page.ts","webpack://tweb/./src/vendor/emoji/index.ts","webpack://tweb/./public/recorder.min.js","webpack://tweb/./src/vendor/bezier-easing/index.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 {CustomEmojiElement, CustomEmojiRendererElement} from '../lib/richTextProcessor/wrapRichText';\nimport rootScope from '../lib/rootScope';\nimport {IS_SAFARI} from '../environment/userAgent';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport isInDOM from '../helpers/dom/isInDOM';\nimport RLottiePlayer from '../lib/rlottie/rlottiePlayer';\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\nimport forEachReverse from '../helpers/array/forEachReverse';\nimport idleController from '../helpers/idleController';\nimport appMediaPlaybackController from './appMediaPlaybackController';\nimport {fastRaf} from '../helpers/schedulers';\nimport {Middleware} from '../helpers/middleware';\n\nexport type AnimationItemGroup = '' | 'none' | 'chat' | 'lock' |\n 'STICKERS-POPUP' | 'emoticons-dropdown' | 'STICKERS-SEARCH' | 'GIFS-SEARCH' |\n `CHAT-MENU-REACTIONS-${number}` | 'INLINE-HELPER' | 'GENERAL-SETTINGS' | 'STICKER-VIEWER' | 'EMOJI' |\n 'EMOJI-STATUS' | `chat-${number}`;\nexport interface AnimationItem {\n el: HTMLElement,\n group: AnimationItemGroup,\n animation: AnimationItemWrapper,\n controlled?: boolean | Middleware\n};\n\nexport interface AnimationItemWrapper {\n remove: () => void;\n paused: boolean;\n pause: () => any;\n play: () => any;\n autoplay: boolean;\n // onVisibilityChange?: (visible: boolean) => boolean;\n};\n\nexport class AnimationIntersector {\n private observer: IntersectionObserver;\n private visible: Set;\n\n private overrideIdleGroups: Set;\n private byGroups: {[group in AnimationItemGroup]?: AnimationItem[]};\n private byPlayer: Map;\n private lockedGroups: {[group in AnimationItemGroup]?: true};\n private onlyOnePlayableGroup: AnimationItemGroup;\n\n private intersectionLockedGroups: {[group in AnimationItemGroup]?: true};\n private videosLocked: boolean;\n\n constructor() {\n this.observer = new IntersectionObserver((entries) => {\n // if(rootScope.idle.isIDLE) return;\n\n for(const entry of entries) {\n const target = entry.target;\n\n for(const group in this.byGroups) {\n if(this.intersectionLockedGroups[group as AnimationItemGroup]) {\n continue;\n }\n\n const animation = this.byGroups[group as AnimationItemGroup].find((p) => p.el === target);\n if(!animation) {\n continue;\n }\n\n if(entry.isIntersecting) {\n this.visible.add(animation);\n this.checkAnimation(animation, false);\n\n /* if(animation instanceof HTMLVideoElement && animation.dataset.src) {\n animation.src = animation.dataset.src;\n animation.load();\n } */\n } else {\n this.visible.delete(animation);\n this.checkAnimation(animation, true);\n\n const _animation = animation.animation;\n if(_animation instanceof RLottiePlayer/* && animation.cachingDelta === 2 */) {\n // console.warn('will clear cache', player);\n _animation.clearCache();\n }/* else if(animation instanceof HTMLVideoElement && animation.src) {\n animation.dataset.src = animation.src;\n animation.src = '';\n animation.load();\n } */\n }\n\n break;\n }\n }\n });\n\n this.visible = new Set();\n\n this.overrideIdleGroups = new Set();\n this.byGroups = {};\n this.byPlayer = new Map();\n this.lockedGroups = {};\n this.onlyOnePlayableGroup = '';\n\n this.intersectionLockedGroups = {};\n this.videosLocked = false;\n\n appMediaPlaybackController.addEventListener('play', ({doc}) => {\n if(doc.type === 'round') {\n this.videosLocked = true;\n this.checkAnimations2();\n }\n });\n\n appMediaPlaybackController.addEventListener('pause', () => {\n if(this.videosLocked) {\n this.videosLocked = false;\n this.checkAnimations2();\n }\n });\n\n idleController.addEventListener('change', (idle) => {\n this.checkAnimations2(idle);\n });\n }\n\n public setOverrideIdleGroup(group: string, override: boolean) {\n if(override) this.overrideIdleGroups.add(group);\n else this.overrideIdleGroups.delete(group);\n }\n\n public getAnimations(element: HTMLElement) {\n const found: AnimationItem[] = [];\n for(const group in this.byGroups) {\n for(const player of this.byGroups[group as AnimationItemGroup]) {\n if(player.el === element) {\n found.push(player);\n }\n }\n }\n\n return found;\n }\n\n public removeAnimation(player: AnimationItem) {\n const {el, animation} = player;\n if(!(animation instanceof HTMLVideoElement)) {\n animation.remove();\n }\n\n if(animation instanceof HTMLVideoElement && IS_SAFARI) {\n setTimeout(() => { // TODO: ะพั‡ะธัั‚ะบะฐ ะฟะพ ะพั‡ะตั€ะตะดะธ, ะฐ ะฝะต ะฒัะต ะฒะผะตัั‚ะต ั ัั‚ะธะผ ั‚ะฐะนะผะฐัƒั‚ะพะผ\n animation.src = '';\n animation.load();\n }, 1e3);\n }\n\n const group = this.byGroups[player.group];\n if(group) {\n indexOfAndSplice(group, player);\n if(!group.length) {\n delete this.byGroups[player.group];\n }\n }\n\n this.observer.unobserve(el);\n this.visible.delete(player);\n this.byPlayer.delete(animation);\n }\n\n public removeAnimationByPlayer(player: AnimationItemWrapper) {\n const item = this.byPlayer.get(player);\n if(item) {\n this.removeAnimation(item);\n }\n }\n\n public addAnimation(\n animation: AnimationItem['animation'],\n group: AnimationItemGroup = '',\n observeElement?: HTMLElement,\n controlled?: AnimationItem['controlled']\n ) {\n if(group === 'none' || this.byPlayer.has(animation)) {\n return;\n }\n\n if(!observeElement) {\n if(animation instanceof RLottiePlayer) {\n observeElement = animation.el[0];\n } else if(animation instanceof CustomEmojiRendererElement) {\n observeElement = animation.canvas;\n } else if(animation instanceof CustomEmojiElement) {\n observeElement = animation.placeholder ?? animation;\n } else if(animation instanceof HTMLElement) {\n observeElement = animation;\n }\n }\n\n const item: AnimationItem = {\n el: observeElement,\n animation: animation,\n group,\n controlled\n };\n\n if(controlled && typeof(controlled) !== 'boolean') {\n controlled.onClean(() => {\n this.removeAnimationByPlayer(animation);\n });\n }\n\n if(animation instanceof RLottiePlayer) {\n if(!rootScope.settings.stickers.loop && animation.loop) {\n animation.loop = rootScope.settings.stickers.loop;\n }\n }\n\n (this.byGroups[group as AnimationItemGroup] ??= []).push(item);\n this.observer.observe(item.el);\n this.byPlayer.set(animation, item);\n }\n\n public checkAnimations(\n blurred?: boolean,\n group?: AnimationItemGroup,\n destroy?: boolean,\n imitateIntersection?: boolean\n ) {\n // if(rootScope.idle.isIDLE) return;\n\n if(group !== undefined && !this.byGroups[group]) {\n // console.warn('no animation group:', group);\n return;\n }\n\n const groups = group !== undefined /* && false */ ? [group] : Object.keys(this.byGroups) as AnimationItemGroup[];\n\n for(const group of groups) {\n if(imitateIntersection && this.intersectionLockedGroups[group]) {\n continue;\n }\n\n const animations = this.byGroups[group];\n\n forEachReverse(animations, (animation) => {\n this.checkAnimation(animation, blurred, destroy);\n });\n }\n }\n\n public checkAnimations2(blurred?: boolean) {\n this.checkAnimations(blurred, undefined, undefined, true);\n }\n\n public checkAnimation(player: AnimationItem, blurred?: boolean, destroy?: boolean) {\n const {el, animation, group} = player;\n // return;\n if(destroy || (!this.lockedGroups[group] && !isInDOM(el))) {\n if(!player.controlled || destroy) {\n this.removeAnimation(player);\n }\n\n return;\n }\n\n if(blurred ||\n (this.onlyOnePlayableGroup && this.onlyOnePlayableGroup !== group) ||\n (animation instanceof HTMLVideoElement && this.videosLocked)\n ) {\n if(!animation.paused) {\n // console.warn('pause animation:', animation);\n animation.pause();\n }\n } else if(animation.paused &&\n this.visible.has(player) &&\n animation.autoplay &&\n (!this.onlyOnePlayableGroup || this.onlyOnePlayableGroup === group) &&\n (!idleController.isIdle || this.overrideIdleGroups.has(player.group))\n ) {\n // console.warn('play animation:', animation);\n animation.play();\n }\n }\n\n public getOnlyOnePlayableGroup() {\n return this.onlyOnePlayableGroup;\n }\n\n public setOnlyOnePlayableGroup(group: AnimationItemGroup = '') {\n this.onlyOnePlayableGroup = group;\n }\n\n public lockGroup(group: AnimationItemGroup) {\n this.lockedGroups[group] = true;\n }\n\n public unlockGroup(group: AnimationItemGroup) {\n delete this.lockedGroups[group];\n this.checkAnimations(undefined, group);\n }\n\n public refreshGroup(group: AnimationItemGroup) {\n const animations = this.byGroups[group];\n if(!animations?.length) {\n return;\n }\n\n animations.forEach((animation) => {\n this.observer.unobserve(animation.el);\n });\n\n fastRaf(() => {\n animations.forEach((animation) => {\n this.observer.observe(animation.el);\n });\n });\n }\n\n public lockIntersectionGroup(group: AnimationItemGroup) {\n this.intersectionLockedGroups[group] = true;\n }\n\n public unlockIntersectionGroup(group: AnimationItemGroup) {\n delete this.intersectionLockedGroups[group];\n this.refreshGroup(group);\n }\n\n public toggleIntersectionGroup(group: AnimationItemGroup, lock: boolean) {\n if(lock) this.lockIntersectionGroup(group);\n else this.unlockIntersectionGroup(group);\n }\n}\n\nconst animationIntersector = new AnimationIntersector();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.animationIntersector = animationIntersector);\nexport default animationIntersector;\n","/*\n * 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';\nimport {MyDocument} from '../lib/appManagers/appDocsManager';\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport {IS_APPLE, IS_SAFARI} from '../environment/userAgent';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport simulateEvent from '../helpers/dom/dispatchEvent';\nimport type {SearchSuperContext} from './appSearchSuper.';\nimport {Document, DocumentAttribute, Message, PhotoSize} from '../layer';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport I18n from '../lib/langPack';\nimport SearchListLoader from '../helpers/searchListLoader';\nimport copy from '../helpers/object/copy';\nimport deepEqual from '../helpers/object/deepEqual';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport getMediaFromMessage from '../lib/appManagers/utils/messages/getMediaFromMessage';\nimport getPeerTitle from './wrappers/getPeerTitle';\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport onMediaLoad from '../helpers/onMediaLoad';\nimport EventListenerBase from '../helpers/eventListenerBase';\n\n// TODO: Safari: ะฟั€ะพะฒะตั€ะธั‚ัŒ ัั‚ั€ะธะผ, ะฒะบะปัŽั‡ะธั‚ัŒ ะตะณะพ ะธ ัั€ะฐะทัƒ ะฟะพะฟั€ะพะฑะพะฒะฐั‚ัŒ ะฒะบะปัŽั‡ะธั‚ัŒ ะฒะธะดะตะพ ะธะปะธ ะดั€ัƒะณัƒัŽ ะฟะตัะฝัŽ\n// TODO: Safari: ะฟะพะฟั€ะพะฑะพะฒะฐั‚ัŒ ะทะฐะผะฐัะบะธั€ะพะฒะฐั‚ัŒ ะฟะพะดะณั€ัƒะทะบัƒ ะฟะพัะปะตะดะฝะตะณะพ ั‡ะฐะฝะบะฐ\n// TODO: Safari: ะฟะพั„ะธะบัะธั‚ัŒ ะผะพะผะตะฝั‚, ะบะพะณะดะฐ ะทะฐะบะฐะฝั‡ะธะฒะฐะตั‚ัั ะฟะตัะฝั ะธ ะฟั‹ั‚ะฐะตัˆัŒัั ะฒะบะปัŽั‡ะธั‚ัŒ ะตั‘ ะทะฐะฝะพะฒะพ - ะฟั€ะพะณั€ะตัั ัั€ะฐะทัƒ ะฒ ะบะพะฝั†ะต\n\nexport type MediaItem = {mid: number, peerId: PeerId};\n\ntype HTMLMediaElement = HTMLAudioElement | HTMLVideoElement;\n\nconst SHOULD_USE_SAFARI_FIX = (() => {\n try {\n return IS_SAFARI && +navigator.userAgent.match(/ Version\\/(\\d+)/)[1] < 14;\n } catch(err) {\n return false;\n }\n})();\n\nconst SEEK_OFFSET = 10;\n\nexport type MediaSearchContext = SearchSuperContext & Partial<{\n isScheduled: boolean,\n useSearch: boolean\n}>;\n\ntype MediaDetails = {\n peerId: PeerId,\n mid: number,\n docId: DocId,\n doc: MyDocument,\n message: Message.message,\n clean?: boolean,\n isScheduled?: boolean,\n isSingle?: boolean\n};\n\nexport type PlaybackMediaType = 'voice' | 'video' | 'audio';\n\nexport class AppMediaPlaybackController extends EventListenerBase<{\n play: (details: ReturnType) => void,\n pause: () => void,\n playbackParams: (params: ReturnType) => void,\n stop: () => void,\n}> {\n private container: HTMLElement;\n private media: Map> = new Map();\n private scheduled: AppMediaPlaybackController['media'] = new Map();\n private mediaDetails: Map = new Map();\n private playingMedia: HTMLMediaElement;\n private playingMediaType: PlaybackMediaType;\n\n private waitingMediaForLoad: Map>> = new Map();\n private waitingScheduledMediaForLoad: AppMediaPlaybackController['waitingMediaForLoad'] = new Map();\n private waitingDocumentsForLoad: {[docId: string]: Set} = {};\n\n public willBePlayedMedia: HTMLMediaElement;\n private searchContext: MediaSearchContext;\n\n private listLoader: SearchListLoader;\n\n public volume: number;\n public muted: boolean;\n public playbackRate: number;\n public loop: boolean;\n public round: boolean;\n private _volume: number;\n private _muted: boolean;\n private _playbackRate: number;\n private _loop: boolean;\n private _round: boolean;\n private lockedSwitchers: boolean;\n private playbackRates: Record = {\n voice: 1,\n video: 1,\n audio: 1\n };\n\n private pip: HTMLVideoElement;\n private managers: AppManagers;\n private skipMediaPlayEvent: boolean;\n\n construct(managers: AppManagers) {\n this.managers = managers;\n this.container = document.createElement('div');\n // this.container.style.cssText = 'position: absolute; top: -10000px; left: -10000px;';\n this.container.style.cssText = 'display: none;';\n document.body.append(this.container);\n\n if(navigator.mediaSession) {\n const actions: {[action in MediaSessionAction]?: MediaSessionActionHandler} = {\n play: this.browserPlay,\n pause: this.browserPause,\n stop: this.browserStop,\n seekbackward: this.browserSeekBackward,\n seekforward: this.browserSeekForward,\n seekto: this.browserSeekTo,\n previoustrack: this.browserPrevious,\n nexttrack: this.browserNext\n };\n\n for(const action in actions) {\n try {\n navigator.mediaSession.setActionHandler(action as MediaSessionAction, actions[action as MediaSessionAction]);\n } catch(err) {\n console.warn('MediaSession action is not supported:', action);\n }\n }\n }\n\n rootScope.addEventListener('document_downloaded', (docId) => {\n const set = this.waitingDocumentsForLoad[docId];\n if(set) {\n for(const media of set) {\n this.onMediaDocumentLoad(media);\n }\n }\n });\n\n rootScope.addEventListener('media_play', () => {\n if(this.skipMediaPlayEvent) {\n this.skipMediaPlayEvent = false;\n return;\n }\n\n if(!this.pause() && this.pip) {\n this.pip.pause();\n }\n });\n\n const properties: {[key: PropertyKey]: PropertyDescriptor} = {};\n const keys = [\n 'volume' as const,\n 'muted' as const,\n 'playbackRate' as const,\n 'loop' as const,\n 'round' as const\n ];\n keys.forEach((key) => {\n const _key = ('_' + key) as `_${typeof key}`;\n properties[key] = {\n get: () => this[_key],\n set: (value: number | boolean) => {\n if(this[_key] === value) {\n return;\n }\n\n // @ts-ignore\n this[_key] = value;\n if(this.playingMedia && (key !== 'loop' || this.playingMediaType === 'audio') && key !== 'round') {\n // @ts-ignore\n this.playingMedia[key] = value;\n }\n\n if(key === 'playbackRate' && this.playingMediaType !== undefined) {\n this.playbackRates[this.playingMediaType] = value as number;\n }\n\n this.dispatchPlaybackParams();\n }\n };\n });\n Object.defineProperties(this, properties);\n }\n\n private dispatchPlaybackParams() {\n this.dispatchEvent('playbackParams', this.getPlaybackParams());\n }\n\n public getPlaybackParams() {\n const {volume, muted, playbackRate, playbackRates, loop, round} = this;\n return {\n volume,\n muted,\n playbackRate,\n playbackRates,\n loop,\n round\n };\n }\n\n public setPlaybackParams(params: ReturnType) {\n this.playbackRates = params.playbackRates;\n this._volume = params.volume;\n this._muted = params.muted;\n this._playbackRate = params.playbackRate;\n this._loop = params.loop;\n this._round = params.round;\n }\n\n public seekBackward = (details: MediaSessionActionDetails, media = this.playingMedia) => {\n if(media) {\n media.currentTime = Math.max(0, media.currentTime - (details.seekOffset || SEEK_OFFSET));\n }\n };\n\n public seekForward = (details: MediaSessionActionDetails, media = this.playingMedia) => {\n if(media) {\n media.currentTime = Math.min(media.duration, media.currentTime + (details.seekOffset || SEEK_OFFSET));\n }\n };\n\n public seekTo = (details: MediaSessionActionDetails, media = this.playingMedia) => {\n if(media) {\n media.currentTime = details.seekTime;\n }\n };\n\n public addMedia(message: Message.message, autoload: boolean, clean?: boolean): HTMLMediaElement {\n const {peerId, mid} = message;\n\n const isScheduled = !!message.pFlags.is_scheduled;\n const s = isScheduled ? this.scheduled : this.media;\n let storage = s.get(message.peerId);\n if(!storage) {\n s.set(message.peerId, storage = new Map());\n }\n\n let media = storage.get(mid);\n if(media) {\n return media;\n }\n\n const doc = getMediaFromMessage(message) as Document.document;\n storage.set(mid, media = document.createElement(doc.type === 'round' || doc.type === 'video' ? 'video' : 'audio'));\n // const source = document.createElement('source');\n // source.type = doc.type === 'voice' && !opusDecodeController.isPlaySupported() ? 'audio/wav' : doc.mime_type;\n\n if(doc.type === 'round') {\n media.setAttribute('playsinline', 'true');\n // media.muted = true;\n }\n\n const details: MediaDetails = {\n peerId,\n mid,\n docId: doc.id,\n doc,\n message,\n clean,\n isScheduled: message.pFlags.is_scheduled\n };\n\n this.mediaDetails.set(media, details);\n\n // media.autoplay = true;\n media.volume = 1;\n // media.append(source);\n\n this.container.append(media);\n\n media.addEventListener('play', this.onPlay);\n media.addEventListener('pause', this.onPause);\n media.addEventListener('ended', this.onEnded);\n\n if(doc.type !== 'audio' && message?.pFlags.media_unread && message.fromId !== rootScope.myId) {\n media.addEventListener('timeupdate', () => {\n this.managers.appMessagesManager.readMessages(peerId, [mid]);\n }, {once: true});\n }\n\n /* const onError = (e: Event) => {\n //console.log('appMediaPlaybackController: video onError', e);\n\n if(this.nextMid === mid) {\n this.loadSiblingsMedia(peerId, doc.type as MediaType, mid).then(() => {\n if(this.nextMid && storage[this.nextMid]) {\n storage[this.nextMid].play();\n }\n });\n }\n };\n\n media.addEventListener('error', onError); */\n\n const deferred = deferredPromise();\n if(autoload) {\n deferred.resolve();\n } else {\n const w = message.pFlags.is_scheduled ? this.waitingScheduledMediaForLoad : this.waitingMediaForLoad;\n let waitingStorage = w.get(peerId);\n if(!waitingStorage) {\n w.set(peerId, waitingStorage = new Map());\n }\n\n waitingStorage.set(mid, deferred);\n }\n\n deferred.then(async() => {\n // media.autoplay = true;\n // console.log('will set media url:', media, doc, doc.type, doc.url);\n\n if(doc.supportsStreaming || (await this.managers.thumbsStorage.getCacheContext(doc)).url) {\n this.onMediaDocumentLoad(media);\n } else {\n let set = this.waitingDocumentsForLoad[doc.id];\n if(!set) {\n set = this.waitingDocumentsForLoad[doc.id] = new Set();\n }\n\n set.add(media);\n appDownloadManager.downloadMediaURL({media: doc});\n }\n }/* , onError */);\n\n return media;\n }\n\n public getMedia(peerId: PeerId, mid: number, isScheduled?: boolean) {\n const s = (isScheduled ? this.scheduled : this.media).get(peerId);\n return s?.get(mid);\n }\n\n private onMediaDocumentLoad = async(media: HTMLMediaElement) => {\n const details = this.mediaDetails.get(media);\n const doc = await this.managers.appDocsManager.getDoc(details.docId);\n if(doc.type === 'audio' && doc.supportsStreaming && SHOULD_USE_SAFARI_FIX) {\n this.handleSafariStreamable(media);\n }\n\n // setTimeout(() => {\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc);\n media.src = cacheContext.url;\n\n if(this.playingMedia === media) {\n media.playbackRate = this.playbackRate;\n\n if(doc.type === 'audio') {\n media.loop = this.loop;\n }\n }\n // }, doc.supportsStreaming ? 500e3 : 0);\n\n const set = this.waitingDocumentsForLoad[doc.id];\n if(set) {\n set.delete(media);\n\n if(!set.size) {\n delete this.waitingDocumentsForLoad[doc.id];\n }\n }\n };\n\n // safari ะฟะพะดะณั€ัƒะทะธั‚ ะฟะพัะปะตะดะฝะธะน ั‡ะฐะฝะบ ะธ ะฟะตัะฝั ะฒะบะปัŽั‡ะธั‚ัั,\n // ะฟั€ะธ ัั‚ะพะผ ัั‚ะพั‚ ั‡ะฐะฝะบ ะฝะตะปัŒะทั ั€ัƒะบะฐะผะธ ะพั‚ะดะฐั‚ัŒ ะธะท SW, ะฟะพั‚ะพะผัƒ ั‡ั‚ะพ ะฑั€ะฐัƒะทะตั€ ั‚ะพะณะดะฐ ั‚ะตั€ัะตั‚ัั\n private handleSafariStreamable(media: HTMLMediaElement) {\n media.addEventListener('play', () => {\n /* if(media.readyState === 4) { // https://developer.mozilla.org/ru/docs/Web/API/XMLHttpRequest/readyState\n return;\n } */\n\n // media.volume = 0;\n const currentTime = media.currentTime;\n // this.setSafariBuffering(media, true);\n\n media.addEventListener('progress', () => {\n media.currentTime = media.duration - 1;\n\n media.addEventListener('progress', () => {\n media.currentTime = currentTime;\n // media.volume = 1;\n // this.setSafariBuffering(media, false);\n\n if(!media.paused) {\n media.play()/* .catch(() => {}) */;\n }\n }, {once: true});\n }, {once: true});\n }/* , {once: true} */);\n }\n\n public resolveWaitingForLoadMedia(peerId: PeerId, mid: number, isScheduled?: boolean) {\n const w = isScheduled ? this.waitingScheduledMediaForLoad : this.waitingMediaForLoad;\n const storage = w.get(peerId);\n if(!storage) {\n return;\n }\n\n const promise = storage.get(mid);\n if(promise) {\n promise.resolve();\n storage.delete(mid);\n\n if(!storage.size) {\n w.delete(peerId);\n }\n }\n }\n\n /**\n * Only for audio\n */\n public isSafariBuffering(media: HTMLMediaElement) {\n // @ts-ignore\n return !!media.safariBuffering;\n }\n\n private setSafariBuffering(media: HTMLMediaElement, value: boolean) {\n // @ts-ignore\n media.safariBuffering = value;\n }\n\n private async setNewMediadata(message: Message.message, playingMedia = this.playingMedia) {\n if(document.pictureInPictureElement) {\n return;\n }\n\n await onMediaLoad(playingMedia, undefined, false); // have to wait for load, otherwise on macOS won't set\n\n const doc = getMediaFromMessage(message) as MyDocument;\n\n const artwork: MediaImage[] = [];\n\n const isVoice = doc.type === 'voice' || doc.type === 'round';\n let title = '', artist = '';\n\n if(doc.thumbs?.length) {\n const size = doc.thumbs[doc.thumbs.length - 1];\n if(!(size as PhotoSize.photoStrippedSize).bytes) {\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc, size.type);\n\n if(cacheContext.url) {\n artwork.push({\n src: cacheContext.url,\n sizes: `${(size as PhotoSize.photoSize).w}x${(size as PhotoSize.photoSize).h}`,\n type: 'image/jpeg'\n });\n } else {\n const download = appDownloadManager.downloadMediaURL({media: doc, thumb: size});\n download.then(() => {\n if(this.playingMedia !== playingMedia || !cacheContext.url) {\n return;\n }\n\n this.setNewMediadata(message);\n });\n }\n }\n } else if(isVoice) {\n const peerId = message.fromId || message.peerId;\n const peerPhoto = await this.managers.appPeersManager.getPeerPhoto(peerId);\n if(peerPhoto) {\n // const result = this.managers.appAvatarsManager.loadAvatar(peerId, peerPhoto, 'photo_small');\n // if(result.cached) {\n // const url = await result.loadPromise;\n // artwork.push({\n // src: url,\n // sizes: '160x160',\n // type: 'image/jpeg'\n // });\n // } else {\n // result.loadPromise.then((url) => {\n // if(this.playingMedia !== playingMedia || !url) {\n // return;\n // }\n\n // this.setNewMediadata(message);\n // });\n // }\n }\n\n title = await getPeerTitle({peerId, plainText: true, onlyFirstName: false});\n artist = I18n.format(doc.type === 'voice' ? 'AttachAudio' : 'AttachRound', true);\n }\n\n if(!isVoice) {\n const attribute = doc.attributes.find((attribute) => attribute._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio;\n title = attribute?.title ?? doc.file_name;\n artist = attribute?.performer;\n }\n\n if(!artwork.length) {\n if(IS_APPLE) {\n if(IS_TOUCH_SUPPORTED) {\n artwork.push({\n src: `assets/img/apple-touch-icon-precomposed.png`,\n sizes: '180x180',\n type: 'image/png'\n });\n } else {\n artwork.push({\n src: `assets/img/apple-touch-icon.png`,\n sizes: '180x180',\n type: 'image/png'\n });\n }\n } else {\n [72, 96, 144, 192, 256, 384, 512].forEach((size) => {\n const sizes = `${size}x${size}`;\n artwork.push({\n src: `assets/img/android-chrome-${sizes}.png`,\n sizes,\n type: 'image/png'\n });\n });\n }\n }\n\n const metadata = new MediaMetadata({\n title,\n artist,\n artwork\n });\n\n navigator.mediaSession.metadata = metadata;\n }\n\n public setCurrentMediadata() {\n const {playingMedia} = this;\n if(!playingMedia) return;\n const message = this.getMessageByMedia(playingMedia);\n this.setNewMediadata(message, playingMedia);\n }\n\n private getMessageByMedia(media: HTMLMediaElement): Message.message {\n const details = this.mediaDetails.get(media);\n return details.message;\n // const {peerId, mid} = details;\n // const message = details.isScheduled ?\n // this.managers.appMessagesManager.getScheduledMessageByPeer(peerId, mid) :\n // this.managers.appMessagesManager.getMessageByPeer(peerId, mid);\n // return message;\n }\n\n public getPlayingDetails() {\n const {playingMedia} = this;\n if(!playingMedia) {\n return;\n }\n\n const message = this.getMessageByMedia(playingMedia);\n return {\n doc: getMediaFromMessage(message) as MyDocument,\n message,\n media: playingMedia,\n playbackParams: this.getPlaybackParams()\n };\n }\n\n private onPlay = (e?: Event) => {\n const media = e.target as HTMLMediaElement;\n const details = this.mediaDetails.get(media);\n const {peerId, mid} = details;\n\n // console.log('appMediaPlaybackController: video playing', this.currentPeerId, this.playingMedia, media);\n\n const pip = this.pip;\n if(pip) {\n pip.pause();\n }\n\n const message = this.getMessageByMedia(media);\n\n const previousMedia = this.playingMedia;\n if(previousMedia !== media) {\n this.stop();\n this.setMedia(media, message);\n\n const verify = (element: MediaItem) => element.mid === mid && element.peerId === peerId;\n const listLoader = this.listLoader;\n const current = listLoader.getCurrent();\n if(!current || !verify(current)) {\n let jumpLength: number;\n\n for(const withOtherSide of [false, true]) {\n const previous = listLoader.getPrevious(withOtherSide);\n\n let idx = previous.findIndex(verify);\n if(idx !== -1) {\n jumpLength = -(previous.length - idx);\n } else {\n const next = listLoader.getNext(withOtherSide);\n idx = next.findIndex(verify);\n if(idx !== -1) {\n jumpLength = idx + 1;\n }\n }\n\n if(jumpLength !== undefined) {\n break;\n }\n }\n\n if(jumpLength) {\n this.go(jumpLength, false);\n } else {\n this.setTargets({peerId, mid});\n }\n }\n }\n\n // audio_pause ะฝะต ัƒัะฟะตะตั‚ ัั€ะฐะฑะพั‚ะฐั‚ัŒ ะฑะตะท ั‚ะฐะนะผะฐัƒั‚ะฐ\n setTimeout(() => {\n if(this.playingMedia !== media) {\n return;\n }\n\n this.dispatchEvent('play', this.getPlayingDetails());\n this.pauseMediaInOtherTabs();\n }, 0);\n };\n\n private onPause = (e?: Event) => {\n /* const target = e.target as HTMLMediaElement;\n if(!isInDOM(target)) {\n this.container.append(target);\n target.play();\n return;\n } */\n\n // if(this.pip) {\n // this.pip.play();\n // }\n\n this.dispatchEvent('pause');\n };\n\n private onEnded = (e?: Event) => {\n if(!e.isTrusted) {\n return;\n }\n\n this.onPause(e);\n\n // console.log('on media end');\n\n const listLoader = this.listLoader;\n if(this.lockedSwitchers ||\n (!this.round && listLoader.current && !listLoader.next.length) ||\n !listLoader.getNext(true).length ||\n !this.next()) {\n this.stop();\n this.dispatchEvent('stop');\n }\n };\n\n public pauseMediaInOtherTabs() {\n this.skipMediaPlayEvent = true;\n rootScope.dispatchEvent('media_play');\n }\n\n // public get pip() {\n // return document.pictureInPictureElement as HTMLVideoElement;\n // }\n\n public toggle(play?: boolean, media = this.playingMedia) {\n if(!media) {\n return false;\n }\n\n if(play === undefined) {\n play = media.paused;\n }\n\n if(media.paused !== play) {\n return false;\n }\n\n if(play) {\n media.play();\n } else {\n media.pause();\n }\n\n return true;\n }\n\n public play = () => {\n return this.toggle(true);\n };\n\n public pause = () => {\n return this.toggle(false);\n };\n\n public stop = (media = this.playingMedia) => {\n if(!media) {\n return false;\n }\n\n if(!media.paused) {\n media.pause();\n }\n\n media.currentTime = 0;\n simulateEvent(media, 'ended');\n\n if(media === this.playingMedia) {\n const details = this.mediaDetails.get(media);\n if(details?.clean) {\n media.src = '';\n const peerId = details.peerId;\n const s = details.isScheduled ? this.scheduled : this.media;\n const storage = s.get(peerId);\n if(storage) {\n storage.delete(details.mid);\n\n if(!storage.size) {\n s.delete(peerId);\n }\n }\n\n media.remove();\n\n this.mediaDetails.delete(media);\n }\n\n this.playingMedia = undefined;\n this.playingMediaType = undefined;\n }\n\n return true;\n };\n\n public playItem = (item: MediaItem) => {\n const {peerId, mid} = item;\n const isScheduled = this.searchContext.isScheduled;\n const media = this.getMedia(peerId, mid, isScheduled);\n\n /* if(isSafari) {\n media.autoplay = true;\n } */\n\n media.play();\n\n setTimeout(() => {\n this.resolveWaitingForLoadMedia(peerId, mid, isScheduled);\n }, 0);\n };\n\n public go = (length: number, dispatchJump?: boolean) => {\n const listLoader = this.listLoader;\n if(this.lockedSwitchers || !listLoader) {\n return;\n }\n\n if(this.playingMediaType === 'audio') {\n return listLoader.goRound(length, dispatchJump);\n } else {\n return listLoader.go(length, dispatchJump);\n }\n };\n\n private bindBrowserCallback(cb: (video: HTMLVideoElement, details: MediaSessionActionDetails) => void) {\n const handler: MediaSessionActionHandler = (details) => {\n cb(this.pip, details);\n };\n\n return handler;\n }\n\n public browserPlay = this.bindBrowserCallback((video) => this.toggle(true, video));\n public browserPause = this.bindBrowserCallback((video) => this.toggle(false, video));\n public browserStop = this.bindBrowserCallback((video) => this.stop(video));\n public browserSeekBackward = this.bindBrowserCallback((video, details) => this.seekBackward(details, video));\n public browserSeekForward = this.bindBrowserCallback((video, details) => this.seekForward(details, video));\n public browserSeekTo = this.bindBrowserCallback((video, details) => this.seekTo(details, video));\n public browserNext = this.bindBrowserCallback((video) => video || this.next());\n public browserPrevious = this.bindBrowserCallback((video) => video ? this.seekToStart(video) : this.previous());\n\n public next = () => {\n return this.go(1);\n };\n\n public previous = () => {\n if(this.seekToStart(this.playingMedia)) {\n return;\n }\n\n return this.go(-1);\n };\n\n public seekToStart(media: HTMLMediaElement) {\n if(media?.currentTime > 5) {\n media.currentTime = 0;\n this.toggle(true, media);\n return true;\n }\n\n return false;\n }\n\n public willBePlayed(media: HTMLMediaElement) {\n this.willBePlayedMedia = media;\n }\n\n public setSearchContext(context: MediaSearchContext) {\n if(deepEqual(this.searchContext, context)) {\n return false;\n }\n\n this.searchContext = copy(context); // {_: type === 'audio' ? 'inputMessagesFilterMusic' : 'inputMessagesFilterRoundVoice'}\n return true;\n }\n\n public getSearchContext() {\n return this.searchContext;\n }\n\n public setTargets(current: MediaItem, prev?: MediaItem[], next?: MediaItem[]) {\n let listLoader = this.listLoader;\n if(!listLoader) {\n listLoader = this.listLoader = new SearchListLoader({\n loadCount: 10,\n loadWhenLeft: 5,\n processItem: (message: Message.message) => {\n this.addMedia(message, false);\n return {peerId: message.peerId, mid: message.mid};\n },\n onJump: (item, older) => {\n this.playItem(item);\n },\n onEmptied: () => {\n this.dispatchEvent('stop');\n this.stop();\n }\n });\n } else {\n listLoader.reset();\n }\n\n const reverse = this.searchContext.folderId !== undefined ? false : true;\n if(prev) {\n listLoader.setTargets(prev, next, reverse);\n } else {\n listLoader.reverse = reverse;\n }\n\n listLoader.setSearchContext(this.searchContext);\n listLoader.current = current;\n\n listLoader.load(true);\n listLoader.load(false);\n }\n\n private getPlaybackMediaTypeFromMessage(message: Message.message) {\n const doc = getMediaFromMessage(message) as MyDocument;\n let mediaType: PlaybackMediaType = 'audio';\n if(doc?.type) {\n if(doc.type === 'voice' || doc.type === 'round') {\n mediaType = 'voice';\n } else if(doc.type === 'video') {\n mediaType = 'video';\n }\n }\n\n return mediaType;\n }\n\n public setMedia(media: HTMLMediaElement, message: Message.message) {\n const mediaType = this.getPlaybackMediaTypeFromMessage(message);\n\n this._playbackRate = this.playbackRates[mediaType];\n\n this.playingMedia = media;\n this.playingMediaType = mediaType;\n this.playingMedia.volume = this.volume;\n this.playingMedia.muted = this.muted;\n this.playingMedia.playbackRate = this.playbackRate;\n\n if(mediaType === 'audio') {\n this.playingMedia.loop = this.loop;\n }\n\n if('mediaSession' in navigator) {\n this.setNewMediadata(message);\n }\n }\n\n public setSingleMedia(media?: HTMLMediaElement, message?: Message.message) {\n const playingMedia = this.playingMedia;\n\n const wasPlaying = this.pause();\n\n let onPlay: () => void;\n if(media) {\n onPlay = () => {\n const pip = this.pip;\n if(pip) {\n pip.pause();\n }\n\n this.pauseMediaInOtherTabs();\n };\n\n if(!media.paused) {\n onPlay();\n }\n\n media.addEventListener('play', onPlay);\n } else { // maybe it's voice recording\n this.pauseMediaInOtherTabs();\n }\n\n this.willBePlayed(undefined);\n if(media) this.setMedia(media, message);\n else this.playingMedia = undefined;\n this.toggleSwitchers(false);\n\n return (playPaused = wasPlaying) => {\n this.toggleSwitchers(true);\n\n if(playingMedia) {\n if(this.mediaDetails.get(playingMedia)) {\n this.setMedia(playingMedia, this.getMessageByMedia(playingMedia));\n } else {\n this.next() || this.previous();\n }\n }\n\n // If it's still not cleaned\n if(this.playingMedia === media) {\n this.playingMedia = undefined;\n this.playingMediaType = undefined;\n }\n\n if(media) {\n media.removeEventListener('play', onPlay);\n }\n\n // I don't remember what it was for\n // if(media && this.playingMedia === media) {\n // this.stop();\n // }\n\n if(playPaused) {\n this.play();\n }\n };\n }\n\n public toggleSwitchers(enabled: boolean) {\n this.lockedSwitchers = !enabled;\n }\n\n public setPictureInPicture(video: HTMLVideoElement) {\n this.pip = video;\n\n // let wasPlaying = this.pause();\n\n const listenerSetter = new ListenerSetter();\n listenerSetter.add(video)('leavepictureinpicture', () => {\n if(this.pip !== video) {\n return;\n }\n\n this.pip = undefined;\n // if(wasPlaying) {\n // this.play();\n // }\n\n listenerSetter.removeAll();\n }, {once: true});\n\n listenerSetter.add(video)('play', (e) => {\n if(this.playingMedia !== video) {\n this.pause();\n }\n\n this.pauseMediaInOtherTabs();\n // if(this.pause()) {\n // listenerSetter.add(video)('pause', () => {\n // this.play();\n // }, {once: true});\n // }\n });\n }\n}\n\nconst appMediaPlaybackController = new AppMediaPlaybackController();\nMOUNT_CLASS_TO.appMediaPlaybackController = appMediaPlaybackController;\nexport default appMediaPlaybackController;\n","/*\n * 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 {MyDocument} from '../lib/appManagers/appDocsManager';\nimport MEDIA_MIME_TYPES_SUPPORTED from '../environment/mediaMimeTypesSupport';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport findUpTag from '../helpers/dom/findUpTag';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport mediaSizes from '../helpers/mediaSizes';\nimport SearchListLoader from '../helpers/searchListLoader';\nimport {Message} from '../layer';\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport appImManager from '../lib/appManagers/appImManager';\nimport {MyMessage} from '../lib/appManagers/appMessagesManager';\nimport {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport canSaveMessageMedia from '../lib/appManagers/utils/messages/canSaveMessageMedia';\nimport getMediaFromMessage from '../lib/appManagers/utils/messages/getMediaFromMessage';\nimport wrapRichText from '../lib/richTextProcessor/wrapRichText';\nimport {MediaSearchContext} from './appMediaPlaybackController';\nimport AppMediaViewerBase, {MEDIA_VIEWER_CLASSNAME} from './appMediaViewerBase';\nimport {ButtonMenuItemOptionsVerifiable} 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 message?: MyMessage\n};\nexport default class AppMediaViewer extends AppMediaViewerBase<'caption', 'delete' | 'forward', AppMediaViewerTargetType> {\n protected listLoader: SearchListLoader;\n protected btnMenuForward: ButtonMenuItemOptionsVerifiable;\n protected btnMenuDownload: ButtonMenuItemOptionsVerifiable;\n protected btnMenuDelete: ButtonMenuItemOptionsVerifiable;\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 = 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', 'spoilers-container'/* , '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: ButtonMenuItemOptionsVerifiable[] = [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 attachClickEvent(this.buttons.forward, this.onForwardClick);\n attachClickEvent(this.author.container, this.onAuthorClick);\n\n const onCaptionClick = (e: MouseEvent) => {\n const a = findUpTag(e.target, 'A');\n const spoiler = findUpClassName(e.target, 'spoiler');\n if(a instanceof HTMLAnchorElement && (!spoiler || this.content.caption.classList.contains('is-spoiler-visible'))) { // close viewer if it's t.me/ redirect\n const onclick = a.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 a.click();\n });\n\n return false;\n }\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 ? this.managers.appMessagesManager.getScheduledMessageByPeer(peerId, mid) : this.managers.appMessagesManager.getMessageByPeer(peerId, mid);\n }\n\n onPrevClick = async(target: AppMediaViewerTargetType) => {\n this.openMedia(await this.getMessageByPeer(target.peerId, target.mid), target.element, -1);\n };\n\n onNextClick = async(target: AppMediaViewerTargetType) => {\n this.openMedia(await 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 = async(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 = await this.getMessageByPeer(peerId, mid);\n this.close(e)\n // .then(() => mediaSizes.isMobile ? appSidebarRight.sharedMediaTab.closeBtn.click() : Promise.resolve())\n .then(async() => {\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 {message} = this.target;\n const media = getMediaFromMessage(message);\n if(!media) return;\n appDownloadManager.downloadToDisc({media, queueId: appImManager.chat.bubbles.lazyLoadQueue.queueId});\n };\n\n private setCaption(message: MyMessage) {\n const caption = (message as Message.message).message;\n let html: Parameters[1] = '';\n if(caption) {\n html = 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 = getMediaFromMessage(message);\n\n const noForwards = await this.managers.appPeersManager.noForwards(message.peerId);\n const isServiceMessage = message._ === 'messageService';\n const cantForwardMessage = isServiceMessage || !(await this.managers.appMessagesManager.canForward(message));\n const cantDownloadMessage = (isServiceMessage ? noForwards : cantForwardMessage) || !canSaveMessageMedia(message);\n const a: [(HTMLElement | ButtonMenuItemOptionsVerifiable)[], boolean][] = [\n [[this.buttons.forward, this.btnMenuForward], cantForwardMessage],\n [[this.buttons.download, this.btnMenuDownload], cantDownloadMessage],\n [[this.buttons.delete, this.btnMenuDelete], !(await this.managers.appMessagesManager.canDeleteMessage(message))]\n ];\n\n a.forEach(([buttons, hide]) => {\n buttons.forEach((button) => {\n if(button instanceof HTMLElement) {\n button.classList.toggle('hide', hide);\n } else {\n button.verify = () => !hide;\n }\n });\n });\n\n this.wholeDiv.classList.toggle('no-forwards', cantDownloadMessage);\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 this.target.message = message;\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 appMediaPlaybackController from '../components/appMediaPlaybackController';\nimport {IS_APPLE_MOBILE, IS_MOBILE} from '../environment/userAgent';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport ListenerSetter, {Listener} from '../helpers/listenerSetter';\nimport {ButtonMenuSync} from '../components/buttonMenu';\nimport {ButtonMenuToggleHandler} from '../components/buttonMenuToggle';\nimport ControlsHover from '../helpers/dom/controlsHover';\nimport {addFullScreenListener, cancelFullScreen, isFullScreen, requestFullScreen} from '../helpers/dom/fullScreen';\nimport toHHMMSS from '../helpers/string/toHHMMSS';\nimport MediaProgressLine from '../components/mediaProgressLine';\nimport VolumeSelector from '../components/volumeSelector';\nimport debounce from '../helpers/schedulers/debounce';\nimport overlayCounter from '../helpers/overlayCounter';\nimport onMediaLoad from '../helpers/onMediaLoad';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\n\nexport default class VideoPlayer extends ControlsHover {\n private static PLAYBACK_RATES = [0.5, 1, 1.5, 2];\n private static PLAYBACK_RATES_ICONS = ['playback_05', 'playback_1x', 'playback_15', 'playback_2x'];\n\n protected video: HTMLVideoElement;\n protected wrapper: HTMLDivElement;\n protected progress: MediaProgressLine;\n protected skin: 'default';\n\n protected listenerSetter: ListenerSetter;\n protected playbackRateButton: HTMLElement;\n protected pipButton: HTMLElement;\n\n /* protected videoParent: HTMLElement;\n protected videoWhichChild: number; */\n\n protected onPlaybackRackMenuToggle?: (open: boolean) => void;\n protected onPip?: (pip: boolean) => void;\n protected onPipClose?: () => void;\n\n constructor({video, play = false, streamable = false, duration, onPlaybackRackMenuToggle, onPip, onPipClose}: {\n video: HTMLVideoElement,\n play?: boolean,\n streamable?: boolean,\n duration?: number,\n onPlaybackRackMenuToggle?: VideoPlayer['onPlaybackRackMenuToggle'],\n onPip?: VideoPlayer['onPip'],\n onPipClose?: VideoPlayer['onPipClose']\n }) {\n super();\n\n this.video = video;\n this.wrapper = document.createElement('div');\n this.wrapper.classList.add('ckin__player');\n\n this.onPlaybackRackMenuToggle = onPlaybackRackMenuToggle;\n this.onPip = onPip;\n this.onPipClose = onPipClose;\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 && (!this.playbackRateButton || !this.playbackRateButton.classList.contains('menu-open'));\n },\n showOnLeaveToClassName: 'media-viewer-caption',\n ignoreClickClassName: 'ckin__controls'\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({\n media: video,\n streamable,\n onSeekStart: () => {\n this.wrapper.classList.add('is-seeking');\n },\n onSeekEnd: () => {\n this.wrapper.classList.remove('is-seeking');\n }\n });\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 }\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 this.playbackRateButton = this.wrapper.querySelector('.playback-rate') as HTMLElement;\n this.pipButton = this.wrapper.querySelector('.pip') as HTMLElement;\n\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.textContent = toHHMMSS(video.duration | 0);\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 attachClickEvent(button, () => {\n this.togglePlay();\n }, {listenerSetter: this.listenerSetter});\n });\n\n if(this.pipButton) {\n attachClickEvent(this.pipButton, () => {\n this.video.requestPictureInPicture();\n }, {listenerSetter: this.listenerSetter});\n\n const onPip = (pip: boolean) => {\n this.wrapper.style.visibility = pip ? 'hidden': '';\n if(this.onPip) {\n this.onPip(pip);\n }\n };\n\n const debounceTime = 20;\n const debouncedPip = debounce(onPip, debounceTime, false, true);\n\n listenerSetter.add(video)('enterpictureinpicture', () => {\n debouncedPip(true);\n\n listenerSetter.add(video)('leavepictureinpicture', () => {\n const onPause = () => {\n clearTimeout(timeout);\n if(this.onPipClose) {\n this.onPipClose();\n }\n };\n const listener = listenerSetter.add(video)('pause', onPause, {once: true}) as any as Listener;\n const timeout = setTimeout(() => {\n listenerSetter.remove(listener);\n }, debounceTime);\n }, {once: true});\n });\n\n listenerSetter.add(video)('leavepictureinpicture', () => {\n debouncedPip(false);\n });\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n attachClickEvent(video, () => {\n this.togglePlay();\n }, {listenerSetter: this.listenerSetter});\n\n listenerSetter.add(document)('keydown', (e: KeyboardEvent) => {\n if(overlayCounter.overlaysActive > 1 || document.pictureInPictureElement === video) { // 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' || code === 'Minus')) {\n const add = code === 'Equal' ? 1 : -1;\n const playbackRate = appMediaPlaybackController.playbackRate;\n const idx = VideoPlayer.PLAYBACK_RATES.indexOf(playbackRate);\n const nextIdx = idx + add;\n if(nextIdx >= 0 && nextIdx < VideoPlayer.PLAYBACK_RATES.length) {\n appMediaPlaybackController.playbackRate = VideoPlayer.PLAYBACK_RATES[nextIdx];\n }\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 listenerSetter.add(video)('dblclick', () => {\n if(!IS_TOUCH_SUPPORTED) {\n this.toggleFullScreen();\n }\n });\n\n attachClickEvent(fullScreenButton, () => {\n this.toggleFullScreen();\n }, {listenerSetter: this.listenerSetter});\n\n addFullScreenListener(wrapper, this.onFullScreen.bind(this, fullScreenButton), listenerSetter);\n\n listenerSetter.add(video)('timeupdate', () => {\n timeElapsed.textContent = toHHMMSS(video.currentTime | 0);\n });\n\n listenerSetter.add(video)('play', () => {\n wrapper.classList.add('played');\n\n if(!IS_TOUCH_SUPPORTED) {\n listenerSetter.add(video)('play', () => {\n this.hideControls(true);\n });\n }\n }, {once: true});\n\n listenerSetter.add(video)('pause', () => {\n this.showControls(false);\n });\n\n listenerSetter.add(appMediaPlaybackController)('playbackParams', () => {\n this.setPlaybackRateIcon();\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.textContent = toHHMMSS(Math.round(video.duration || initDuration));\n } else {\n onMediaLoad(video).then(() => {\n timeDuration.textContent = toHHMMSS(Math.round(video.duration));\n });\n }\n }\n\n protected togglePlay() {\n const isPaused = this.video.paused;\n this.video[isPaused ? '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 ${!IS_MOBILE && document.pictureInPictureEnabled ? `` : ''}\n \n
\n
\n
`;\n }\n }\n\n protected setBtnMenuToggle() {\n const buttons: Parameters[0]['buttons'] = VideoPlayer.PLAYBACK_RATES.map((rate, idx) => {\n return {\n // icon: VideoPlayer.PLAYBACK_RATES_ICONS[idx],\n regularText: rate + 'x',\n onClick: () => {\n appMediaPlaybackController.playbackRate = rate;\n }\n };\n });\n const btnMenu = ButtonMenuSync({buttons});\n btnMenu.classList.add('top-left');\n ButtonMenuToggleHandler({\n el: this.playbackRateButton,\n onOpen: this.onPlaybackRackMenuToggle ? () => {\n this.onPlaybackRackMenuToggle(true);\n } : undefined,\n onClose: this.onPlaybackRackMenuToggle ? () => {\n this.onPlaybackRackMenuToggle(false);\n } : undefined\n });\n this.playbackRateButton.append(btnMenu);\n\n this.setPlaybackRateIcon();\n }\n\n protected setPlaybackRateIcon() {\n const playbackRateButton = this.playbackRateButton;\n VideoPlayer.PLAYBACK_RATES_ICONS.forEach((className) => {\n className = 'tgico-' + className;\n playbackRateButton.classList.remove(className);\n });\n\n let idx = VideoPlayer.PLAYBACK_RATES.indexOf(appMediaPlaybackController.playbackRate);\n if(idx === -1) idx = VideoPlayer.PLAYBACK_RATES.indexOf(1);\n\n playbackRateButton.classList.add('tgico-' + VideoPlayer.PLAYBACK_RATES_ICONS[idx]);\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 cleanup() {\n super.cleanup();\n this.listenerSetter.removeAll();\n this.progress.removeListeners();\n this.onPlaybackRackMenuToggle = this.onPip = undefined;\n }\n}\n","export default function isBetween(num: number, min: number, max: number) {\n return num >= min && num <= max;\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// * zoom part from WebZ\n// * https://github.com/Ajaxy/telegram-tt/blob/069f4f5b2f2c7c22529ccced876842e7f9cb81f4/src/components/mediaViewer/MediaViewerSlides.tsx\n\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport type {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport deferredPromise from '../helpers/cancellablePromise';\nimport mediaSizes from '../helpers/mediaSizes';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport {IS_MOBILE, IS_MOBILE_SAFARI, IS_SAFARI} from '../environment/userAgent';\nimport {logger} from '../lib/logger';\nimport VideoPlayer from '../lib/mediaPlayer';\nimport rootScope from '../lib/rootScope';\nimport animationIntersector from './animationIntersector';\nimport appMediaPlaybackController, {AppMediaPlaybackController} from './appMediaPlaybackController';\nimport AvatarElement from './avatar';\nimport ButtonIcon from './buttonIcon';\nimport {ButtonMenuItemOptions} from './buttonMenu';\nimport ButtonMenuToggle from './buttonMenuToggle';\nimport ProgressivePreloader from './preloader';\nimport SwipeHandler, {ZoomDetails} from './swipeHandler';\nimport {formatFullSentTime} from '../helpers/date';\nimport appNavigationController, {NavigationItem} from './appNavigationController';\nimport {Message, PhotoSize} from '../layer';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport renderImageFromUrl, {renderImageFromUrlPromise} from '../helpers/dom/renderImageFromUrl';\nimport getVisibleRect from '../helpers/dom/getVisibleRect';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport fillPropertyValue from '../helpers/fillPropertyValue';\nimport generatePathData from '../helpers/generatePathData';\nimport replaceContent from '../helpers/dom/replaceContent';\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 {NULL_PEER_ID} from '../lib/mtproto/mtproto_config';\nimport {isFullScreen} from '../helpers/dom/fullScreen';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport SearchListLoader from '../helpers/searchListLoader';\nimport createVideo from '../helpers/dom/createVideo';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport getStrippedThumbIfNeeded from '../helpers/getStrippedThumbIfNeeded';\nimport setAttachmentSize from '../helpers/setAttachmentSize';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport LazyLoadQueueBase from './lazyLoadQueueBase';\nimport overlayCounter from '../helpers/overlayCounter';\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport wrapPeerTitle from './wrappers/peerTitle';\nimport {toastNew} from './toast';\nimport clamp from '../helpers/number/clamp';\nimport debounce from '../helpers/schedulers/debounce';\nimport isBetween from '../helpers/number/isBetween';\n\nconst ZOOM_STEP = 0.5;\nconst ZOOM_INITIAL_VALUE = 1;\nconst ZOOM_MIN_VALUE = 0.5;\nconst ZOOM_MAX_VALUE = 4;\n\nexport const MEDIA_VIEWER_CLASSNAME = 'media-viewer';\n\ntype Transform = {\n x: number;\n y: number;\n scale: number;\n};\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 log: ReturnType;\n\n protected isFirstOpen = 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 transform: Transform = {x: 0, y: 0, scale: ZOOM_INITIAL_VALUE};\n protected isZooming: boolean;\n protected isGesturingNow: boolean;\n protected isZoomingNow: boolean;\n protected draggingType: 'wheel' | 'touchmove' | 'mousemove';\n protected initialContentRect: DOMRect;\n\n protected ctrlKeyDown: boolean;\n protected releaseSingleMedia: ReturnType;\n protected navigationItem: NavigationItem;\n\n protected managers: AppManagers;\n protected swipeHandler: SwipeHandler;\n protected closing: boolean;\n\n protected lastTransform: Transform = this.transform;\n protected lastZoomCenter: {x: number, y: number} = this.transform;\n protected lastDragOffset: {x: number, y: number} = this.transform;\n protected lastDragDelta: {x: number, y: number} = this.transform;\n protected lastGestureTime: number;\n protected clampZoomDebounced: ReturnType void>>;\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.managers = rootScope.managers;\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 attachClickEvent(this.zoomElements.btnOut, () => this.addZoomStep(false));\n this.zoomElements.btnIn = ButtonIcon('zoomin', {noRipple: true});\n attachClickEvent(this.zoomElements.btnIn, () => this.addZoomStep(true));\n\n this.zoomElements.rangeSelector = new RangeSelector({\n step: 0.01,\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 if(!IS_TOUCH_SUPPORTED && false) {\n this.wholeDiv.append(this.zoomElements.container);\n }\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.moversContainer.append(this.buttons.prev, this.buttons.next);\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 attachClickEvent(this.buttons.download, this.onDownloadClick);\n [this.buttons.close, this.buttons['mobile-close'], this.preloaderStreamable.preloader].forEach((el) => {\n attachClickEvent(el, this.close.bind(this));\n });\n\n ([[-1, this.buttons.prev], [1, this.buttons.next]] as [number, HTMLElement][]).forEach(([moveLength, button]) => {\n // attachClickEvent(button, (e) => {\n button.addEventListener('click', (e) => {\n cancelEvent(e);\n if(this.setMoverPromise) return;\n\n this.listLoader.go(moveLength);\n });\n });\n\n attachClickEvent(this.buttons.zoom, () => {\n if(this.isZooming) this.resetZoom();\n else {\n this.addZoomStep(true);\n }\n });\n\n // ! cannot use the function because it'll cancel slide event on touch devices\n // attachClickEvent(this.wholeDiv, this.onClick);\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 const adjustPosition = (xDiff: number, yDiff: number) => {\n const [x, y] = [xDiff - this.lastDragOffset.x, yDiff - this.lastDragOffset.y];\n const [transform, inBoundsX, inBoundsY] = this.calculateOffsetBoundaries({\n x: this.transform.x + x,\n y: this.transform.y + y,\n scale: this.transform.scale\n });\n\n this.lastDragDelta = {\n x,\n y\n };\n\n this.lastDragOffset = {\n x: xDiff,\n y: yDiff\n };\n\n this.setTransform(transform);\n\n return {inBoundsX, inBoundsY};\n };\n\n const setLastGestureTime = debounce(() => {\n this.lastGestureTime = Date.now();\n }, 500, false, true);\n\n this.clampZoomDebounced = debounce(() => {\n this.onSwipeReset();\n }, 300, false, true);\n\n this.swipeHandler = new SwipeHandler({\n element: this.wholeDiv,\n onReset: this.onSwipeReset,\n onFirstSwipe: this.onSwipeFirst,\n onSwipe: (xDiff, yDiff, e, cancelDrag) => {\n if(isFullScreen()) {\n return;\n }\n\n if(this.isZooming && !this.isZoomingNow) {\n setLastGestureTime();\n\n this.draggingType = e.type as any;\n const {inBoundsX, inBoundsY} = adjustPosition(xDiff, yDiff);\n cancelDrag?.(!inBoundsX, !inBoundsY);\n\n return;\n }\n\n if(this.isZoomingNow || !IS_TOUCH_SUPPORTED) {\n return;\n }\n\n const percents = Math.abs(xDiff) / windowSize.width;\n if(percents > .2 || Math.abs(xDiff) > 125) {\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 || Math.abs(yDiff) > 125) {\n this.close();\n return true;\n }\n\n return false;\n },\n onZoom: this.onZoom,\n onDoubleClick: ({centerX, centerY}) => {\n if(this.isZooming) {\n this.resetZoom();\n } else {\n const scale = ZOOM_INITIAL_VALUE + 2;\n this.changeZoomByPosition(centerX, centerY, scale);\n }\n },\n verifyTouchTarget: (e) => {\n // * Fix for seek input\n if(findUpClassName(e.target, 'ckin__controls') ||\n findUpClassName(e.target, 'media-viewer-caption') ||\n (findUpClassName(e.target, 'media-viewer-topbar') && e.type !== 'wheel')) {\n return false;\n }\n\n return true;\n },\n cursor: ''\n // cursor: 'move'\n });\n }\n\n protected onSwipeFirst = () => {\n this.lastDragOffset = this.lastDragDelta = {x: 0, y: 0};\n this.lastTransform = {...this.transform};\n this.moversContainer.classList.add('no-transition');\n this.isGesturingNow = true;\n this.lastGestureTime = Date.now();\n this.clampZoomDebounced.clearTimeout();\n\n if(!this.lastTransform.x && !this.lastTransform.y && !this.isZooming) {\n this.initialContentRect = this.content.media.getBoundingClientRect();\n }\n };\n\n protected onSwipeReset = () => {\n // move\n this.moversContainer.classList.remove('no-transition');\n this.clampZoomDebounced.clearTimeout();\n\n const {draggingType} = this;\n this.isZoomingNow = false;\n this.isGesturingNow = false;\n this.draggingType = undefined;\n\n if(this.closing) {\n return;\n }\n\n if(this.transform.scale > ZOOM_INITIAL_VALUE) {\n // Get current content boundaries\n const s1 = Math.min(this.transform.scale, ZOOM_MAX_VALUE);\n const scaleFactor = s1 / this.transform.scale;\n\n // Calculate new position based on the last zoom center to keep the zoom center\n // at the same position when bouncing back from max zoom\n let x1 = this.transform.x * scaleFactor + (this.lastZoomCenter.x - scaleFactor * this.lastZoomCenter.x);\n let y1 = this.transform.y * scaleFactor + (this.lastZoomCenter.y - scaleFactor * this.lastZoomCenter.y);\n\n // If scale didn't change, we need to add inertia to pan gesture\n if(draggingType && draggingType !== 'wheel' && this.lastTransform.scale === this.transform.scale) {\n // Arbitrary pan velocity coefficient\n const k = 0.1;\n\n // Calculate user gesture velocity\n const elapsedTime = Math.max(1, Date.now() - this.lastGestureTime);\n const Vx = Math.abs(this.lastDragOffset.x) / elapsedTime;\n const Vy = Math.abs(this.lastDragOffset.y) / elapsedTime;\n\n // Add extra distance based on gesture velocity and last pan delta\n x1 -= Math.abs(this.lastDragOffset.x) * Vx * k * -this.lastDragDelta.x;\n y1 -= Math.abs(this.lastDragOffset.y) * Vy * k * -this.lastDragDelta.y;\n }\n\n const [transform] = this.calculateOffsetBoundaries({x: x1, y: y1, scale: s1});\n this.lastTransform = transform;\n this.setTransform(transform);\n } else if(this.transform.scale < ZOOM_INITIAL_VALUE) {\n this.resetZoom();\n }\n };\n\n protected onZoom = ({\n initialCenterX,\n initialCenterY,\n zoom,\n zoomAdd,\n currentCenterX,\n currentCenterY,\n dragOffsetX,\n dragOffsetY,\n zoomFactor\n }: ZoomDetails) => {\n initialCenterX ||= windowSize.width / 2;\n initialCenterY ||= windowSize.height / 2;\n currentCenterX ||= windowSize.width / 2;\n currentCenterY ||= windowSize.height / 2;\n\n this.isZoomingNow = true;\n\n const zoomMaxBounceValue = ZOOM_MAX_VALUE * 3;\n const scale = zoomAdd ? clamp(this.lastTransform.scale + zoomAdd, ZOOM_MIN_VALUE, zoomMaxBounceValue) : (zoom ?? clamp(this.lastTransform.scale * zoomFactor, ZOOM_MIN_VALUE, zoomMaxBounceValue));\n const scaleFactor = scale / this.lastTransform.scale;\n const offsetX = Math.abs(Math.min(this.lastTransform.x, 0));\n const offsetY = Math.abs(Math.min(this.lastTransform.y, 0));\n\n // Save last zoom center for bounce back effect\n this.lastZoomCenter = {\n x: currentCenterX,\n y: currentCenterY\n };\n\n // Calculate new center relative to the shifted image\n const scaledCenterX = offsetX + initialCenterX;\n const scaledCenterY = offsetY + initialCenterY;\n\n const {scaleOffsetX, scaleOffsetY} = this.calculateScaleOffset({x: scaledCenterX, y: scaledCenterY, scale: scaleFactor});\n\n const [transform] = this.calculateOffsetBoundaries({\n x: this.lastTransform.x + scaleOffsetX + dragOffsetX,\n y: this.lastTransform.y + scaleOffsetY + dragOffsetY,\n scale\n });\n\n this.setTransform(transform);\n };\n\n protected changeZoomByPosition(x: number, y: number, scale: number) {\n const {scaleOffsetX, scaleOffsetY} = this.calculateScaleOffset({x, y, scale});\n const transform = this.calculateOffsetBoundaries({\n x: scaleOffsetX,\n y: scaleOffsetY,\n scale\n })[0];\n\n this.setTransform(transform);\n }\n\n protected setTransform(transform: Transform) {\n this.transform = transform;\n this.changeZoom(transform.scale);\n }\n\n // Calculate how much we need to shift the image to keep the zoom center at the same position\n protected calculateScaleOffset({x, y, scale}: {\n x: number,\n y: number,\n scale: number\n }) {\n return {\n scaleOffsetX: x - scale * x,\n scaleOffsetY: y - scale * y\n };\n }\n\n protected toggleZoom(enable?: boolean) {\n const isVisible = this.isZooming;\n const auto = enable === undefined;\n if(this.zoomElements.rangeSelector.mousedown || this.ctrlKeyDown) {\n enable = true;\n }\n\n enable ??= !isVisible;\n\n if(isVisible === enable) {\n return;\n }\n\n this.buttons.zoom.classList.toggle('zoom-in', !enable);\n this.zoomElements.container.classList.toggle('is-visible', this.isZooming = enable);\n this.wholeDiv.classList.toggle('is-zooming', enable);\n\n if(auto || !enable) {\n const zoomValue = enable ? this.transform.scale : ZOOM_INITIAL_VALUE;\n this.setZoomValue(zoomValue);\n this.zoomElements.rangeSelector.setProgress(zoomValue);\n }\n\n if(this.videoPlayer) {\n this.videoPlayer.lockControls(enable ? false : undefined);\n }\n }\n\n protected addZoomStep(add: boolean) {\n this.addZoom(ZOOM_STEP * (add ? 1 : -1));\n }\n\n protected resetZoom() {\n this.setTransform({\n x: 0,\n y: 0,\n scale: ZOOM_INITIAL_VALUE\n });\n }\n\n protected changeZoom(value = this.transform.scale) {\n this.transform.scale = value;\n this.zoomElements.rangeSelector.setProgress(value);\n this.setZoomValue(value);\n }\n\n protected addZoom(value: number) {\n this.lastTransform = this.transform;\n this.onZoom({\n zoomAdd: value,\n currentCenterX: 0,\n currentCenterY: 0,\n initialCenterX: 0,\n initialCenterY: 0,\n dragOffsetX: 0,\n dragOffsetY: 0\n });\n this.lastTransform = this.transform;\n this.clampZoomDebounced();\n }\n\n protected getZoomBounce() {\n return this.isGesturingNow && IS_TOUCH_SUPPORTED ? 50 : 0;\n }\n\n protected calculateOffsetBoundaries = (\n {x, y, scale}: Transform,\n offsetTop = 0\n ): [Transform, boolean, boolean] => {\n if(!this.initialContentRect) return [{x, y, scale}, true, true];\n // Get current content boundaries\n let inBoundsX = true;\n let inBoundsY = true;\n\n const {minX, maxX, minY, maxY} = this.getZoomBoundaries(scale, offsetTop);\n\n inBoundsX = isBetween(x, maxX, minX);\n x = clamp(x, maxX, minX);\n\n inBoundsY = isBetween(y, maxY, minY);\n y = clamp(y, maxY, minY);\n\n return [{x, y, scale}, inBoundsX, inBoundsY];\n };\n\n protected getZoomBoundaries(scale = this.transform.scale, offsetTop = 0) {\n if(!this.initialContentRect) {\n return {minX: 0, maxX: 0, minY: 0, maxY: 0};\n }\n\n const centerX = (windowSize.width - windowSize.width * scale) / 2;\n const centerY = (windowSize.height - windowSize.height * scale) / 2;\n\n // If content is outside window we calculate offset boundaries\n // based on initial content rect and current scale\n const minX = Math.max(-this.initialContentRect.left * scale, centerX);\n const maxX = windowSize.width - this.initialContentRect.right * scale;\n\n const minY = Math.max(-this.initialContentRect.top * scale + offsetTop, centerY);\n const maxY = windowSize.height - this.initialContentRect.bottom * scale;\n\n return {minX, maxX, minY, maxY};\n }\n\n protected setZoomValue = (value = this.transform.scale) => {\n this.initialContentRect ??= this.content.media.getBoundingClientRect();\n\n // this.zoomValue = value;\n if(value === ZOOM_INITIAL_VALUE) {\n this.transform.x = 0;\n this.transform.y = 0;\n }\n\n this.moversContainer.style.transform = `translate3d(${this.transform.x.toFixed(3)}px, ${this.transform.y.toFixed(3)}px, 0px) scale(${value.toFixed(3)})`;\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 setBtnMenuToggle(buttons: ButtonMenuItemOptions[]) {\n const btnMenuToggle = ButtonMenuToggle({buttonOptions: {onlyMobile: true}, direction: '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 this.closing = true;\n this.swipeHandler?.removeListeners();\n\n if(this.navigationItem) {\n appNavigationController.removeItem(this.navigationItem);\n }\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 SearchListLoader).cleanup && (this.listLoader as SearchListLoader).cleanup();\n this.setMoverPromise = null;\n this.tempId = -1;\n if((window as any).appMediaViewer === this) {\n (window as any).appMediaViewer = 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 this.removeGlobalListeners();\n\n promise.finally(() => {\n this.wholeDiv.remove();\n this.toggleOverlay(false);\n });\n\n return promise;\n }\n\n protected toggleOverlay(active: boolean) {\n overlayCounter.isOverlayActive = active;\n animationIntersector.checkAnimations2(active);\n }\n\n protected toggleGlobalListeners(active: boolean) {\n if(active) this.setGlobalListeners();\n else this.removeGlobalListeners();\n }\n\n protected removeGlobalListeners() {\n window.removeEventListener('keydown', this.onKeyDown);\n window.removeEventListener('keyup', this.onKeyUp);\n }\n\n protected setGlobalListeners() {\n window.addEventListener('keydown', this.onKeyDown);\n window.addEventListener('keyup', this.onKeyUp);\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.close();\n }\n };\n\n private onKeyDown = (e: KeyboardEvent) => {\n // this.log('onKeyDown', e);\n if(overlayCounter.overlaysActive > 1) {\n return;\n }\n\n const key = e.key;\n\n let good = true;\n if(key === 'ArrowRight') {\n !this.isZooming && this.buttons.next.click();\n } else if(key === 'ArrowLeft') {\n !this.isZooming && this.buttons.prev.click();\n } else if(key === '-' || key === '=') {\n if(this.ctrlKeyDown) {\n this.addZoomStep(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(overlayCounter.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 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.transform.scale : 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 left = rect.left - (windowSize.width * scaleX - rect.width) / 2;\n const top = rect.top - (windowSize.height * scaleY - 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 | HTMLCanvasElement;\n let src: string;\n\n // if(target instanceof HTMLVideoElement) {\n const selector = 'video, img, .canvas-thumbnail';\n const queryFrom = target.matches(selector) ? target.parentElement : target;\n const elements = Array.from(queryFrom.querySelectorAll(selector)) as HTMLImageElement[];\n if(elements.length) {\n target = elements.pop();\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n if(target instanceof HTMLImageElement) {\n canvas.width = target.naturalWidth;\n canvas.height = target.naturalHeight;\n } else if(target instanceof HTMLVideoElement) {\n canvas.width = target.videoWidth;\n canvas.height = target.videoHeight;\n } else if(target instanceof HTMLCanvasElement) {\n canvas.width = target.width;\n canvas.height = target.height;\n }\n\n canvas.className = 'canvas-thumbnail thumbnail media-photo';\n context.drawImage(target as HTMLImageElement | HTMLCanvasElement, 0, 0);\n target = canvas;\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 } else if(target instanceof HTMLImageElement) {\n mediaElement = new Image();\n src = target.src;\n } else if(target instanceof HTMLVideoElement) {\n mediaElement = createVideo();\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 } else if(target instanceof HTMLCanvasElement) {\n mediaElement = target;\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.toggleWholeActive(false);\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 toggleWholeActive(active: boolean) {\n if(active) {\n this.wholeDiv.classList.add('active');\n } else {\n this.wholeDiv.classList.add('backwards');\n setTimeout(() => {\n this.wholeDiv.classList.remove('active');\n }, 0);\n }\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 if((el as HTMLImageElement).src !== url) {\n renderImageFromUrl(el, url);\n }\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 const isPeerId = fromId.isPeerId();\n let wrapTitlePromise: Promise | HTMLElement;\n if(isPeerId) {\n wrapTitlePromise = wrapPeerTitle({\n peerId: fromId as PeerId,\n dialog: false,\n onlyFirstName: false,\n plainText: false\n })\n } else {\n const title = wrapTitlePromise = document.createElement('span');\n title.append(wrapEmojiText(fromId));\n title.classList.add('peer-title');\n }\n\n const oldAvatar = this.author.avatarEl;\n const newAvatar = this.author.avatarEl = (oldAvatar.cloneNode() as AvatarElement);\n\n return Promise.all([\n (this.author.avatarEl as AvatarElement).updateWithOptions({\n peerId: fromId as PeerId || NULL_PEER_ID,\n peerTitle: isPeerId ? undefined : '' + fromId\n }),\n\n wrapTitlePromise\n ]).then(([_, title]) => {\n if(this.author.avatarEl !== newAvatar) {\n return;\n }\n\n replaceContent(this.author.date, formatFullSentTime(timestamp));\n replaceContent(this.author.nameEl, title);\n oldAvatar.replaceWith(this.author.avatarEl);\n });\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 const setAuthorPromise = 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 this.navigationItem = {\n type: 'media',\n onPop: (canAnimate) => {\n if(this.setMoverAnimationPromise) {\n return false;\n }\n\n if(!canAnimate && IS_MOBILE_SAFARI) {\n this.wholeDiv.remove();\n }\n\n this.close();\n }\n };\n\n appNavigationController.pushItem(this.navigationItem);\n\n this.toggleOverlay(true);\n this.setGlobalListeners();\n await setAuthorPromise;\n\n if(!this.wholeDiv.parentElement) {\n this.pageEl.insertBefore(this.wholeDiv, document.getElementById('main-columns'));\n void this.wholeDiv.offsetLeft; // reflow\n }\n\n this.toggleWholeActive(true);\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 = setAttachmentSize(media, container, maxWidth, maxHeight, mediaSizes.isMobile ? false : true, undefined, !!(isDocument && media.w && media.h)).photoSize;\n if(useContainerAsTarget) {\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(media, size.type);\n let img: HTMLImageElement | HTMLCanvasElement;\n if(cacheContext.downloaded) {\n img = new Image();\n img.src = cacheContext.url;\n } else {\n const gotThumb = 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 const getCacheContext = (type = size?.type) => {\n return this.managers.thumbsStorage.getCacheContext(media, type);\n };\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 */createVideo({pip: useController});\n\n if(this.wholeDiv.classList.contains('no-forwards')) {\n video.addEventListener('contextmenu', cancelEvent);\n }\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 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 } else if(media.duration < 60) {\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({\n video,\n play,\n streamable: supportsStreaming,\n onPlaybackRackMenuToggle: (open) => {\n this.wholeDiv.classList.toggle('hide-caption', !!open);\n },\n onPip: (pip) => {\n const otherMediaViewer = (window as any).appMediaViewer;\n if(!pip && otherMediaViewer && otherMediaViewer !== this) {\n this.releaseSingleMedia = undefined;\n this.close();\n return;\n }\n\n const mover = this.moversContainer.lastElementChild as HTMLElement;\n mover.classList.toggle('hiding', pip);\n this.toggleWholeActive(!pip);\n this.toggleOverlay(!pip);\n this.toggleGlobalListeners(!pip);\n\n if(this.navigationItem) {\n if(pip) appNavigationController.removeItem(this.navigationItem);\n else appNavigationController.pushItem(this.navigationItem);\n }\n\n if(useController) {\n if(pip) {\n // appMediaPlaybackController.toggleSwitchers(true);\n\n this.releaseSingleMedia(false);\n this.releaseSingleMedia = undefined;\n\n appMediaPlaybackController.setPictureInPicture(video);\n } else {\n this.releaseSingleMedia = appMediaPlaybackController.setSingleMedia(video, message as Message.message);\n }\n }\n },\n onPipClose: () => {\n // this.target = undefined;\n // this.toggleWholeActive(false);\n // this.toggleOverlay(false);\n this.close();\n }\n });\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.cleanup();\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 // console.log('ppp 1');\n preloader.attach(mover, true);\n }\n\n /* canPlayThrough.then(() => {\n preloader.detach();\n }); */\n });\n\n const attachCanPlay = () => {\n video.addEventListener('canplay', () => {\n // console.log('ppp 2');\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 // console.log('ppp 3');\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 = async() => {\n /* if(useController) {\n appMediaPlaybackController.resolveWaitingForLoadMedia(message.peerId, message.mid, message.pFlags.is_scheduled);\n } */\n\n const promise: Promise = supportsStreaming ? Promise.resolve() : appDownloadManager.downloadMediaURL({media});\n\n if(!supportsStreaming) {\n onAnimationEnd.then(async() => {\n if(!(await getCacheContext()).url) {\n // console.log('ppp 4');\n preloader.attach(mover, true, promise);\n }\n });\n }\n\n Promise.all([promise, onAnimationEnd]).then(async() => {\n if(this.tempId !== tempId) {\n this.log.warn('media viewer changed video');\n return;\n }\n\n const url = (await getCacheContext()).url;\n\n video.addEventListener('error', () => {\n toastNew({\n langPackKey: IS_MOBILE ? 'Video.Unsupported.Mobile' : 'Video.Unsupported.Desktop'\n });\n\n if(video.error.code !== 4) {\n this.log.error('Error ' + video.error.code + '; details: ' + video.error.message);\n }\n\n preloader?.detach();\n }, {once: true});\n\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 // * have to set options (especially playbackRate) after src\n // * https://github.com/videojs/video.js/issues/2516\n if(useController) {\n this.releaseSingleMedia = appMediaPlaybackController.setSingleMedia(video, message as Message.message);\n\n this.addEventListener('setMoverBefore', () => {\n if(this.releaseSingleMedia) {\n this.releaseSingleMedia();\n this.releaseSingleMedia = undefined;\n }\n }, {once: true});\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 = async() => {\n const cancellablePromise = isDocument ? appDownloadManager.downloadMediaURL({media}) : appDownloadManager.downloadMediaURL({media, thumb: size});\n\n const photoSizes = !isDocument && media.sizes.slice().filter((size) => (size as PhotoSize.photoSize).w) as PhotoSize.photoSize[];\n photoSizes?.sort((a, b) => b.size - a.size);\n const cancellableFullPromise = !isDocument && appDownloadManager.downloadMediaURL({media, thumb: photoSizes?.[0]});\n\n onAnimationEnd.then(async() => {\n if(!(await getCacheContext()).url) {\n this.preloader.attachPromise(cancellablePromise);\n // this.preloader.attach(mover, true, cancellablePromise);\n }\n });\n\n Promise.all([onAnimationEnd, cancellablePromise]).then(async() => {\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 = (await getCacheContext()).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 imgs.forEach((img) => {\n img.classList.remove('thumbnail'); // ะผะพะถะตั‚ ะทะดะตััŒ ัั‚ะพ ะฒะพะพะฑั‰ะต ะฝะต ะฝัƒะถะฝะพ\n });\n }\n } else {\n const div = mover.firstElementChild && mover.firstElementChild.classList.contains('media-viewer-aspecter') ? mover.firstElementChild : mover;\n const haveImage = ['CANVAS', 'IMG'].includes(div.firstElementChild?.tagName) ? div.firstElementChild as HTMLElement : null;\n if((haveImage as HTMLImageElement)?.src !== url) {\n const image = new Image();\n image.classList.add('thumbnail');\n\n // this.log('will renderImageFromUrl:', image, div, target);\n\n renderImageFromUrl(image, url, () => {\n fastRaf(() => {\n this.updateMediaSource(target, url, 'img');\n\n if(haveImage) {\n fastRaf(() => {\n haveImage.remove();\n });\n }\n\n div.append(image);\n });\n }, false);\n\n cancellableFullPromise?.then((url) => {\n const fullImage = new Image();\n fullImage.classList.add('thumbnail');\n renderImageFromUrl(fullImage, url, () => {\n fastRaf(() => {\n image.replaceWith(fullImage);\n });\n }, false);\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","/*\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 fillPropertyValue(str: string) {\n const splitted = str.split(' ');\n if(splitted.length !== 4) {\n if(!splitted[0]) splitted[0] = '0px';\n for(let i = splitted.length; i < 4; ++i) {\n splitted[i] = splitted[i % 2] || splitted[0] || '0px';\n }\n }\n\n return splitted;\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 {MOUNT_CLASS_TO} from '../config/debug';\nimport {IS_MOBILE_SAFARI} from '../environment/userAgent';\nimport {logger} from '../lib/logger';\nimport blurActiveElement from '../helpers/dom/blurActiveElement';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport isSwipingBackSafari from '../helpers/dom/isSwipingBackSafari';\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\n\nexport type NavigationItem = {\n type: 'left' | 'right' | 'im' | 'chat' | 'popup' | 'media' | 'menu' |\n 'esg' | 'multiselect' | 'input-helper' | 'autocomplete-helper' | 'markup' |\n 'global-search' | 'voice' | 'mobile-search' | 'filters' | 'global-search-focus' |\n 'toast' | 'dropdown' | 'forum',\n onPop: (canAnimate: boolean) => boolean | void,\n onEscape?: () => boolean,\n noHistory?: boolean,\n noBlurOnPop?: boolean,\n};\n\nexport class AppNavigationController {\n private navigations: Array;\n private id: number;\n private manual: boolean;\n private log: ReturnType;\n private debug: boolean;\n private currentHash: string; // have to start with # if not empty\n private overriddenHash: string; // have to start with # if not empty\n private isPossibleSwipe: boolean;\n public onHashChange: () => void;\n\n constructor() {\n this.navigations = [];\n this.id = Date.now();\n this.manual = false;\n this.log = logger('NC');\n this.debug = true;\n this.currentHash = window.location.hash;\n this.overriddenHash = '';\n this.isPossibleSwipe = false;\n\n window.addEventListener('popstate', this.onPopState);\n window.addEventListener('keydown', this.onKeyDown, {capture: true, passive: false});\n\n if(IS_MOBILE_SAFARI) {\n const options = {passive: true};\n window.addEventListener('touchstart', this.onTouchStart, options);\n }\n\n history.scrollRestoration = 'manual';\n\n this.pushState(); // * push init state\n }\n\n private onPopState = (e: PopStateEvent) => {\n const hash = window.location.hash;\n const id: number = e.state;\n this.debug && this.log('popstate', e, this.isPossibleSwipe, hash);\n if(hash !== this.currentHash) {\n this.debug && this.log.warn(`hash changed, new=${hash}, current=${this.currentHash}, overridden=${this.overriddenHash}`);\n // fix for returning to wrong hash (e.g. chat -> archive -> chat -> 3x back)\n if(id === this.id && this.overriddenHash && this.overriddenHash !== hash) {\n this.overrideHash(this.overriddenHash);\n } else if(id/* === this.id */ && !this.overriddenHash && hash) {\n this.overrideHash();\n } else {\n this.currentHash = hash;\n this.onHashChange && this.onHashChange();\n // this.replaceState();\n return;\n }\n }\n\n if(id !== this.id/* && !this.navigations.length */) {\n this.pushState();\n\n if(!this.navigations.length) {\n return;\n }\n }\n\n const item = this.navigations.pop();\n if(!item) {\n this.pushState();\n return;\n }\n\n this.manual = !this.isPossibleSwipe;\n this.handleItem(item);\n // this.pushState(); // * prevent adding forward arrow\n };\n\n private onKeyDown = (e: KeyboardEvent) => {\n const item = this.navigations[this.navigations.length - 1];\n if(!item) return;\n if(e.key === 'Escape' && (item.onEscape ? item.onEscape() : true)) {\n cancelEvent(e);\n this.back(item.type);\n }\n };\n\n private onTouchStart = (e: TouchEvent) => {\n if(e.touches.length > 1) return;\n this.debug && this.log('touchstart');\n\n if(isSwipingBackSafari(e)) {\n this.isPossibleSwipe = true;\n\n window.addEventListener('touchend', () => {\n setTimeout(() => {\n this.isPossibleSwipe = false;\n }, 100);\n }, {passive: true, once: true});\n }\n\n /* const detach = () => {\n window.removeEventListener('touchend', onTouchEnd);\n window.removeEventListener('touchmove', onTouchMove);\n };\n\n let moved = false;\n const onTouchMove = (e: TouchEvent) => {\n this.debug && this.log('touchmove');\n if(e.touches.length > 1) {\n detach();\n return;\n }\n\n moved = true;\n };\n\n const onTouchEnd = (e: TouchEvent) => {\n this.debug && this.log('touchend');\n if(e.touches.length > 1 || !moved) {\n detach();\n return;\n }\n\n isPossibleSwipe = true;\n doubleRaf().then(() => {\n isPossibleSwipe = false;\n });\n\n detach();\n };\n\n window.addEventListener('touchend', onTouchEnd, options);\n window.addEventListener('touchmove', onTouchMove, options); */\n };\n\n public overrideHash(hash: string = '') {\n if(hash && hash[0] !== '#') hash = '#' + hash;\n else if(hash === '#') hash = '';\n\n if(this.currentHash === hash) {\n return;\n }\n\n this.overriddenHash = this.currentHash = hash;\n this.replaceState();\n this.pushState();\n }\n\n private handleItem(item: NavigationItem) {\n const good = item.onPop(!this.manual ? false : undefined);\n this.debug && this.log('popstate, navigation:', item, this.navigations);\n if(good === false) {\n this.pushItem(item);\n } else if(!item.noBlurOnPop) {\n blurActiveElement(); // no better place for it\n }\n\n this.manual = false;\n }\n\n public findItemByType(type: NavigationItem['type']) {\n for(let i = this.navigations.length - 1; i >= 0; --i) {\n const item = this.navigations[i];\n if(item.type === type) {\n return {item, index: i};\n }\n }\n }\n\n public back(type?: NavigationItem['type']) {\n if(type) {\n const ret = this.findItemByType(type);\n if(ret) {\n this.backByItem(ret.item, ret.index);\n return;\n }\n }\n\n history.back();\n }\n\n public backByItem(item: NavigationItem, index = this.navigations.indexOf(item)) {\n this.manual = true;\n // ! commented because 'popstate' event will be fired with delay\n // if(index !== (this.navigations.length - 1)) {\n this.navigations.splice(index, 1);\n this.handleItem(item);\n // }\n }\n\n private onItemAdded(item: NavigationItem) {\n this.debug && this.log('onItemAdded', item, this.navigations);\n\n if(!item.noHistory) {\n this.pushState();\n }\n }\n\n public pushItem(item: NavigationItem) {\n this.navigations.push(item);\n this.onItemAdded(item);\n }\n\n public unshiftItem(item: NavigationItem) {\n this.navigations.unshift(item);\n this.onItemAdded(item);\n }\n\n public spliceItems(index: number, length: number, ...items: NavigationItem[]) {\n this.navigations.splice(index, length, ...items);\n items.forEach((item) => {\n this.onItemAdded(item);\n });\n }\n\n private pushState() {\n this.debug && this.log('push');\n this.manual = false;\n history.pushState(this.id, '');\n }\n\n public replaceState() {\n this.debug && this.log.warn('replace');\n\n const url = location.origin + location.pathname + location.search + this.overriddenHash;\n history.replaceState(this.id, '', url);\n }\n\n public removeItem(item: NavigationItem) {\n if(!item) {\n return;\n }\n\n indexOfAndSplice(this.navigations, item);\n }\n\n public removeByType(type: NavigationItem['type'], single = false) {\n for(let i = this.navigations.length - 1; i >= 0; --i) {\n const item = this.navigations[i];\n if(item.type === type) {\n this.navigations.splice(i, 1);\n\n if(single) {\n break;\n }\n }\n }\n }\n}\n\nconst appNavigationController = new AppNavigationController();\nMOUNT_CLASS_TO.appNavigationController = appNavigationController;\nexport default appNavigationController;\n","/*\n * 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 Scrollable from './scrollable';\nimport InputSearch from './inputSearch';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport {i18n, LangPackKey} from '../lib/langPack';\nimport rootScope from '../lib/rootScope';\n\nexport class SearchGroup {\n container: HTMLDivElement;\n nameEl: HTMLDivElement;\n list: HTMLUListElement;\n\n constructor(\n public name: LangPackKey | boolean,\n public type: string,\n private clearable = true,\n className?: string,\n clickable = true,\n public autonomous = true,\n public onFound?: () => void,\n public noIcons?: boolean\n ) {\n this.list = appDialogsManager.createChatList();\n this.container = document.createElement('div');\n if(className) this.container.className = className;\n\n if(name) {\n this.nameEl = document.createElement('div');\n this.nameEl.classList.add('search-group__name');\n if(typeof(name) === 'string') {\n this.nameEl.append(i18n(name));\n }\n this.container.append(this.nameEl);\n }\n\n this.container.classList.add('search-group', 'search-group-' + type);\n this.container.append(this.list);\n this.container.style.display = 'none';\n\n if(clickable) {\n appDialogsManager.setListClickListener(this.list, onFound, undefined, autonomous);\n }\n }\n\n clear() {\n this.container.style.display = 'none';\n\n if(this.clearable) {\n this.list.innerHTML = '';\n }\n }\n\n setActive() {\n this.container.style.display = '';\n }\n\n toggle() {\n if(this.list.childElementCount) {\n this.setActive();\n } else {\n this.clear();\n }\n }\n}\n\nexport type SearchGroupType = 'contacts' | 'globalContacts' | 'messages' | string;\n\nexport default class AppSearch {\n private minMsgId = 0;\n private loadedCount = -1;\n private foundCount = -1;\n\n private searchPromise: Promise = null;\n private searchTimeout: number = 0;\n\n private query = '';\n\n private listsContainer: HTMLDivElement = null;\n\n private peerId: PeerId; // 0 - means global\n private threadId = 0;\n\n private scrollable: Scrollable;\n\n constructor(\n public container: HTMLElement,\n public searchInput: InputSearch,\n public searchGroups: {[group in SearchGroupType]: SearchGroup},\n public onSearch?: (count: number) => void,\n public noIcons?: boolean\n ) {\n this.scrollable = new Scrollable(this.container);\n this.listsContainer = this.scrollable.container as HTMLDivElement;\n for(const i in this.searchGroups) {\n this.listsContainer.append(this.searchGroups[i as SearchGroupType].container);\n }\n\n if(this.searchGroups.messages) {\n this.scrollable.setVirtualContainer(this.searchGroups.messages.list);\n }\n\n this.searchInput.onChange = (value) => {\n /* if(!value.trim()) {\n //this.peerId = 0;\n return;\n } */\n\n this.query = value;\n this.reset(false);\n this.searchMore();\n };\n\n this.scrollable.onScrolledBottom = () => {\n if(!this.query.trim()) return;\n\n if(!this.searchTimeout) {\n this.searchTimeout = window.setTimeout(() => {\n this.searchMore();\n this.searchTimeout = 0;\n }, 0);\n }\n };\n }\n\n public reset(all = true) {\n if(all) {\n this.searchInput.value = '';\n this.query = '';\n this.peerId = undefined;\n this.threadId = 0;\n }\n\n this.minMsgId = 0;\n this.loadedCount = -1;\n this.foundCount = -1;\n\n for(const i in this.searchGroups) {\n this.searchGroups[i as SearchGroupType].clear();\n }\n\n this.searchPromise = null;\n }\n\n public beginSearch(peerId?: PeerId, threadId = 0, query = '') {\n this.peerId = peerId;\n this.threadId = threadId;\n\n if(this.query !== query) {\n this.searchInput.inputField.value = query;\n }\n\n this.searchInput.input.focus();\n }\n\n public searchMore() {\n if(this.searchPromise) return this.searchPromise;\n\n const query = this.query;\n\n if(!query.trim()) {\n this.onSearch && this.onSearch(0);\n return;\n }\n\n if(this.foundCount !== -1 && this.loadedCount >= this.foundCount) {\n return Promise.resolve();\n }\n\n const maxId = this.minMsgId || 0;\n\n return this.searchPromise = rootScope.managers.appMessagesManager.getSearch({\n peerId: this.peerId,\n query,\n inputFilter: {_: 'inputMessagesFilterEmpty'},\n maxId,\n limit: 20,\n threadId: this.threadId\n }).then((res) => {\n this.searchPromise = null;\n\n if(this.searchInput.value !== query) {\n return;\n }\n\n // console.log('input search result:', this.peerId, query, null, maxId, 20, res);\n\n const {count, history} = res;\n\n if(history.length && history[0].mid === this.minMsgId) {\n history.shift();\n }\n\n const searchGroup = this.searchGroups.messages;\n\n history.forEach((message) => {\n try {\n const peerId = this.peerId ? message.fromId : message.peerId;\n appDialogsManager.addDialogAndSetLastMessage({\n peerId,\n container: this.scrollable/* searchGroup.list */,\n avatarSize: 'bigger',\n meAsSaved: false,\n message,\n query,\n noIcons: this.noIcons\n });\n } catch(err) {\n console.error('[appSearch] render search result', err);\n }\n });\n\n searchGroup.toggle();\n\n this.minMsgId = history.length && history[history.length - 1].mid;\n\n if(this.loadedCount === -1) {\n this.loadedCount = 0;\n }\n this.loadedCount += history.length;\n\n if(this.foundCount === -1) {\n this.foundCount = count;\n\n if(searchGroup.nameEl) {\n replaceContent(searchGroup.nameEl, i18n(count ? 'Chat.Search.MessagesFound' : 'Chat.Search.NoMessagesFound', [count]));\n }\n\n this.onSearch && this.onSearch(this.foundCount);\n }\n }).catch((err) => {\n console.error('search error', err);\n this.searchPromise = null;\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 {MyInputMessagesFilter, MyMessage} from '../lib/appManagers/appMessagesManager';\nimport appDialogsManager, {DIALOG_LIST_ELEMENT_TAG} from '../lib/appManagers/appDialogsManager';\nimport {logger} from '../lib/logger';\nimport rootScope from '../lib/rootScope';\nimport {SearchGroup, SearchGroupType} from './appSearch';\nimport {horizontalMenu} from './horizontalMenu';\nimport LazyLoadQueue from './lazyLoadQueue';\nimport {putPreloader} from './putPreloader';\nimport ripple from './ripple';\nimport Scrollable, {ScrollableX} from './scrollable';\nimport useHeavyAnimationCheck, {getHeavyAnimationPromise} from '../hooks/useHeavyAnimationCheck';\nimport I18n, {LangPackKey, i18n} from '../lib/langPack';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport {getMiddleware, Middleware} from '../helpers/middleware';\nimport {ChannelParticipant, Chat, ChatFull, ChatParticipant, ChatParticipants, Document, 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 {ButtonMenuItemOptions, ButtonMenuSync} 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';\nimport copy from '../helpers/object/copy';\nimport getObjectKeysAndSort from '../helpers/object/getObjectKeysAndSort';\nimport safeAssign from '../helpers/object/safeAssign';\nimport escapeRegExp from '../helpers/string/escapeRegExp';\nimport findAndSplice from '../helpers/array/findAndSplice';\nimport {ScrollStartCallbackDimensions} from '../helpers/fastSmoothScroll';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport choosePhotoSize from '../lib/appManagers/utils/photos/choosePhotoSize';\nimport wrapWebPageDescription from './wrappers/webPageDescription';\nimport wrapWebPageTitle from './wrappers/webPageTitle';\nimport wrapAbbreviation from '../lib/richTextProcessor/wrapAbbreviation';\nimport matchUrl from '../lib/richTextProcessor/matchUrl';\nimport wrapPlainText from '../lib/richTextProcessor/wrapPlainText';\nimport wrapRichText from '../lib/richTextProcessor/wrapRichText';\nimport wrapSenderToPeer from './wrappers/senderToPeer';\nimport wrapSentTime from './wrappers/sentTime';\nimport getMediaFromMessage from '../lib/appManagers/utils/messages/getMediaFromMessage';\nimport filterMessagesByInputFilter from '../lib/appManagers/utils/messages/filterMessagesByInputFilter';\nimport getChatMembersString from './wrappers/getChatMembersString';\nimport getUserStatusString from './wrappers/getUserStatusString';\nimport getParticipantPeerId from '../lib/appManagers/utils/chats/getParticipantPeerId';\nimport {Awaited} from '../types';\nimport {attachContextMenuListener} from '../helpers/dom/attachContextMenuListener';\nimport contextMenuController from '../helpers/contextMenuController';\nimport positionMenu from '../helpers/positionMenu';\nimport apiManagerProxy from '../lib/mtproto/mtprotoworker';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport SwipeHandler from './swipeHandler';\nimport wrapDocument from './wrappers/document';\nimport wrapPhoto from './wrappers/photo';\nimport wrapVideo from './wrappers/video';\nimport noop from '../helpers/noop';\nimport wrapMediaSpoiler, {onMediaSpoilerClick} from './wrappers/mediaSpoiler';\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 | Promise, withSelection?: true})[];\n private element: HTMLElement;\n private target: HTMLElement;\n private peerId: PeerId;\n private mid: number;\n private isSelected: boolean;\n private managers: AppManagers;\n\n constructor(\n private attachTo: HTMLElement,\n private searchSuper: AppSearchSuper,\n private listenerSetter: ListenerSetter\n ) {\n this.managers = searchSuper.managers;\n\n const onContextMenu: Parameters[0]['callback'] = (e) => {\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 const r = async() => {\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 await Promise.all(this.buttons.map(async(button) => {\n let good: boolean;\n\n if(this.isSelected && !button.withSelection) {\n good = false;\n } else {\n good = button.verify ? await 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 contextMenuController.openBtnMenu(this.element, () => {\n item.classList.remove('menu-open');\n });\n };\n\n r();\n };\n\n if(IS_TOUCH_SUPPORTED) {\n\n } else {\n attachContextMenuListener({\n element: attachTo,\n callback: onContextMenu as any,\n listenerSetter\n });\n }\n }\n\n private init() {\n this.buttons = [{\n icon: 'forward',\n text: 'Forward',\n onClick: this.onForwardClick,\n verify: async() => this.managers.appMessagesManager.canForward(await this.managers.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: async() => this.managers.appMessagesManager.canDeleteMessage(await this.managers.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 = ButtonMenuSync({buttons: this.buttons, listenerSetter: this.listenerSetter});\n this.element.classList.add('search-contextmenu', 'contextmenu');\n document.getElementById('page-chats').append(this.element);\n }\n\n private onGotoClick = () => {\n appImManager.setInnerPeer({\n peerId: this.peerId,\n lastMsgId: 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: Middleware,\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\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 public scrollStartCallback: (dimensions: ScrollStartCallbackDimensions) => void;\n\n public managers: AppManagers;\n private loadFirstTimePromise: Promise;\n\n private listenerSetter: ListenerSetter;\n private swipeHandler: SwipeHandler;\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.listenerSetter = new ListenerSetter();\n this.searchContextMenu = new SearchContextMenu(this.container, this, this.listenerSetter);\n this.selection = new SearchSelection(this, this.managers, this.listenerSetter);\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 this.swipeHandler = handleTabSwipe({\n element: this.tabsContainer,\n onSwipe: (xDiff, yDiff, e) => {\n xDiff *= -1;\n yDiff *= -1;\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 verifyTouchTarget: (e) => {\n return !findUpClassName(e.target, 'scrollable-x');\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.canLoadMediaTab(this.mediaTab)/* && 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 startCallback: this.scrollStartCallback\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 startCallback: this.scrollStartCallback\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, this.listenerSetter);\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, listenerSetter: this.listenerSetter});\n\n const onMediaClick = async(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 mediaSpoiler: HTMLElement = target.querySelector('.media-spoiler-container');\n if(mediaSpoiler) {\n onMediaSpoilerClick({\n event: e,\n mediaSpoiler\n })\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 = await this.managers.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'), {listenerSetter: this.listenerSetter});\n attachClickEvent(this.tabs.inputMessagesFilterDocument, onMediaClick.bind(null, 'document-with-thumb', 'media-container', 'inputMessagesFilterDocument'), {listenerSetter: this.listenerSetter});\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 }, this.listenerSetter);\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 return filterMessagesByInputFilter(type, messages, messages.length);\n }\n\n private processEmptyFilter({message, searchGroup}: ProcessSearchSuperResult) {\n const loadPromises: Promise[] = [];\n const dialogElement = appDialogsManager.addDialogNew({\n peerId: message.peerId,\n container: searchGroup.list,\n avatarSize: 'bigger',\n loadPromises\n });\n\n const setLastMessagePromise = appDialogsManager.setLastMessageN({\n dialog: {\n _: 'dialog',\n peerId: message.peerId\n } as any,\n lastMessage: message,\n dialogElement,\n highlightWord: this.searchContext.query\n });\n\n loadPromises.push(setLastMessagePromise);\n return Promise.all(loadPromises).then(noop);\n }\n\n private async processPhotoVideoFilter({message, promises, middleware}: ProcessSearchSuperResult) {\n const media = getMediaFromMessage(message);\n\n const div = document.createElement('div');\n div.classList.add('grid-item');\n // this.log(message, photo);\n\n let wrapped: Awaited>;\n const size = choosePhotoSize(media, 200, 200);\n if(media._ !== 'photo') {\n wrapped = await (await 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 photoSize: size\n })).thumb;\n } else {\n wrapped = await 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 if((message.media as MessageMedia.messageMediaPhoto).pFlags.spoiler) {\n const mediaSpoiler = await wrapMediaSpoiler({\n animationGroup: 'chat',\n media,\n middleware,\n width: 140,\n height: 140,\n multiply: 0.3\n });\n\n div.append(mediaSpoiler);\n }\n\n [\n wrapped.images.thumb,\n wrapped.images.full\n ].filter(Boolean).forEach((image) => {\n image.classList.add('grid-item-media');\n });\n\n promises.push(wrapped.loadPromises.thumb);\n\n return {element: div, message};\n }\n\n private async processDocumentFilter({message, inputFilter}: ProcessSearchSuperResult) {\n const document = getMediaFromMessage(message) as Document.document;\n const showSender = this.showSender || (['voice', 'round'] as MyDocument['type'][]).includes(document.type);\n\n const div = await wrapDocument({\n message,\n withTime: !showSender,\n fontWeight: 400,\n voiceAsMusic: true,\n showSender,\n searchContext: this.copySearchContext(inputFilter),\n lazyLoadQueue: this.lazyLoadQueue,\n autoDownloadSize: 0,\n getSize: () => 320\n });\n\n if((['audio', 'voice', 'round'] as MyDocument['type'][]).includes(document.type)) {\n div.classList.add('audio-48');\n }\n\n return {message, element: div};\n }\n\n private async processUrlFilter({message, promises, middleware}: ProcessSearchSuperResult) {\n let webPage = (message.media as MessageMedia.messageMediaWebPage)?.webpage as WebPage.webPage | WebPage.webPageEmpty;\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 const match = matchUrl(message.message);\n if(!match) {\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 }\n }\n\n if(webPage._ === 'webPageEmpty') {\n return;\n }\n\n const previewDiv = document.createElement('div');\n previewDiv.classList.add('preview');\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: choosePhotoSize(webPage.photo as Photo.photo, 60, 60, false),\n loadPromises: promises,\n noBlur: true\n });\n } else {\n previewDiv.classList.add('empty');\n setInnerHTML(previewDiv, wrapAbbreviation(webPage.title || webPage.display_url || webPage.description || webPage.url, true));\n }\n\n const title = wrapWebPageTitle(webPage);\n\n const subtitleFragment = wrapWebPageDescription(webPage);\n const aFragment = htmlToDocumentFragment(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', await wrapSenderToPeer(message));\n }\n\n if(!title.textContent) {\n // title = new URL(webpage.url).hostname;\n title.append(wrapPlainText(webPage.display_url.split('/', 1)[0]));\n }\n\n const row = new Row({\n title,\n titleRight: wrapSentTime(message),\n subtitle: subtitleFragment,\n havePadding: true,\n clickable: true,\n noRipple: true\n });\n\n row.applyMediaElement(previewDiv, 'big');\n\n if(row.container.innerText.trim().length) {\n return {message, element: row.container};\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 type K = {element: HTMLElement, message: Message.message | Message.messageService};\n const results: (Promise | K)[] = messages.map(async(message) => {\n try {\n options.message = message;\n return await processCallback(options);\n } catch(err) {\n this.log.error('error rendering filter', inputFilter, options, message, err);\n }\n });\n\n const awaited = (await Promise.all(results)).filter(Boolean);\n elemsToAppend.push(...awaited);\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 if(!message) {\n debugger;\n }\n\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 : elemsToAppend.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(const 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.map((peerId) => {\n if(renderedPeerIds.has(peerId)) {\n return;\n }\n\n renderedPeerIds.add(peerId);\n\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: group.list,\n avatarSize: 'abitbigger',\n autonomous: group.autonomous\n });\n\n return {dom, peerId};\n }).filter(Boolean).forEach(async({dom, peerId}) => {\n const peer = await this.managers.appPeersManager.getPeer(peerId);\n if(showMembersCount && ((peer as Chat.channel).participants_count || (peer as any).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(await getChatMembersString(peerId.toChatId()));\n } else if(peerId === rootScope.myId) {\n dom.lastMessageSpan.append(i18n('Presence.YourChat'));\n } else {\n let username = await this.managers.appPeersManager.getPeerUsername(peerId);\n if(!username) {\n const user = await this.managers.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.textContent = 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 this.managers.appUsersManager.getContactsPeerIds(query, true, undefined, 10)\n .then(onLoad)\n .then((contacts) => {\n if(contacts) {\n setResults(contacts, this.searchGroups.contacts, true);\n }\n }),\n\n this.managers.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 attachClickEvent(showMore, () => {\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 this.managers.dialogsStorage.getDialogs({query, offsetIndex: 0, limit: 20, filterId: 0})\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 apiManagerProxy.getState().then((state) => {\n if(!middleware()) {\n return;\n }\n\n this.searchGroups.recent.list.replaceChildren();\n\n state.recentSearch.slice(0, 20).forEach(async(peerId) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: this.searchGroups.recent.list,\n meAsSaved: true,\n avatarSize: 'abitbigger',\n autonomous: true\n });\n\n dom.lastMessageSpan.append(await (peerId.isUser() ?\n getUserStatusString(await this.managers.appUsersManager.getUser(peerId.toUserId())) :\n 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 this.managers.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\n peers.forEach((peer) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peer.id,\n container: this.searchGroups.people.list,\n onlyFirstName: true,\n avatarSize: 'bigger',\n autonomous: false,\n noIcons: this.searchGroups.people.noIcons\n });\n\n dom.subtitleEl.remove();\n });\n\n this.searchGroups.people.toggle();\n }),\n\n renderRecentSearch()\n ]);\n } else return Promise.resolve();\n }\n\n private async 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 let membersList = this.membersList;\n if(!membersList) {\n membersList = new SortedUserList({\n lazyLoadQueue: this.lazyLoadQueue,\n rippleEnabled: false,\n managers: this.managers\n });\n attachClickEvent(membersList.list, (e) => {\n const li = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\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(membersList.list);\n this.afterPerforming(1, mediaTab.contentTab);\n }\n\n for(const participant of participants) {\n const peerId = getParticipantPeerId(participant);\n if(peerId.isAnyChat()) {\n continue;\n }\n\n const user = await this.managers.appUsersManager.getUser(peerId);\n if(!middleware()) {\n return;\n }\n\n if(user.pFlags.deleted) {\n continue;\n }\n\n membersList.add(peerId);\n }\n };\n\n if(await this.managers.appChatsManager.isChannel(id)) {\n const LOAD_COUNT = !this.membersList ? 50 : 200;\n promise = this.managers.appProfileManager.getChannelParticipants(id, undefined, LOAD_COUNT, this.nextRates[mediaTab.inputFilter]).then((participants) => {\n if(!middleware()) {\n return;\n }\n\n const 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 = this.managers.appProfileManager.getChatFull(id).then((chatFull) => {\n if(!middleware()) {\n return;\n }\n\n // console.log('anymore', chatFull);\n this.loaded[mediaTab.inputFilter] = true;\n const participants = (chatFull as ChatFull.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] ??= [];\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 promise = this.loadPromises[type] = Promise.resolve().then(async() => {\n // render from cache\n if(history.length && this.usedFromHistory[type] < history.length && !justLoad) {\n const messages: any[] = [];\n let used = Math.max(0, this.usedFromHistory[type]);\n let slicedLength = 0;\n\n do {\n const ids = history.slice(used, used + loadCount);\n used += ids.length;\n slicedLength += ids.length;\n\n const notFilteredMessages = await Promise.all(ids.map((m) => this.managers.appMessagesManager.getMessageByPeer(m.peerId, m.mid)));\n\n messages.push(...this.filterMessagesByType(notFilteredMessages, 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\n const maxId = history.length ? history[history.length - 1].mid : 0;\n\n const value = await this.managers.appMessagesManager.getSearch({\n ...this.searchContext,\n inputFilter: {_: type},\n maxId,\n limit: loadCount,\n nextRate: this.nextRates[type] ??= 0\n });\n\n history.push(...value.history.map((m) => ({mid: m.mid, peerId: m.peerId})));\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;\n }\n\n this.usedFromHistory[type] = history.length;\n\n if(!this.loaded[type]) {\n promise.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 return promise;\n }\n\n private canLoadMediaTab(mediaTab: SearchSuperMediaTab) {\n const inputFilter = mediaTab.inputFilter;\n return !this.loaded[inputFilter] || (this.historyStorage[inputFilter] && this.usedFromHistory[inputFilter] < this.historyStorage[inputFilter].length);\n }\n\n private async loadFirstTime() {\n const middleware = this.middleware.get();\n const {peerId, threadId} = this.searchContext;\n if(!this.hideEmptyTabs) {\n return;\n }\n\n const mediaTabs = this.mediaTabs.filter((mediaTab) => mediaTab.inputFilter !== 'inputMessagesFilterEmpty');\n const filters = mediaTabs.map((mediaTab) => ({_: mediaTab.inputFilter}));\n\n const [counters, canViewMembers] = await Promise.all([\n this.managers.appMessagesManager.getSearchCounters(peerId, filters, undefined, threadId),\n this.canViewMembers()\n ]);\n\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) {\n if(firstMediaTab === undefined) {\n firstMediaTab = mediaTab;\n }\n\n ++count;\n }\n });\n\n const membersTab = this.mediaTabsMap.get('members');\n membersTab.menuTab.classList.toggle('hide', !canViewMembers);\n\n if(canViewMembers) {\n firstMediaTab = membersTab;\n ++count;\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 public async load(single = false, justLoad = false) {\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 await (this.loadFirstTimePromise ??= this.loadFirstTime());\n if(!middleware()) {\n return;\n }\n\n this.loadFirstTimePromise = undefined;\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 return this.canLoadMediaTab(mediaTab);\n });\n\n if(peerId.isUser()) {\n findAndSplice(toLoad, (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 private 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 const {peerId} = this.searchContext;\n const isAnyChat = peerId.isAnyChat();\n if(!isAnyChat) return Promise.resolve(false);\n const chatId = peerId.toChatId();\n return Promise.all([\n this.managers.appChatsManager.isBroadcast(chatId),\n this.managers.appChatsManager.hasRights(chatId, 'view_participants'),\n this.managers.appChatsManager.isForum(chatId)\n ]).then(([isBroadcast, hasRights, isForum]) => {\n return !isBroadcast && hasRights && (!this.searchContext.threadId || !isForum);\n });\n }\n\n public cleanup() {\n this.loadPromises = {};\n this.loaded = {};\n this.loadedChats = false;\n this.nextRates = {};\n this.firstLoad = true;\n this.prevTabId = -1;\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.loadFirstTimePromise = undefined;\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 this.mediaTabs.forEach((tab) => {\n tab.contentTab.replaceChildren();\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 public destroy() {\n this.cleanup();\n this.listenerSetter.removeAll();\n this.scrollable.destroy();\n this.swipeHandler?.removeListeners();\n this.selection?.cleanup();\n\n this.scrollStartCallback = undefined;\n this.onChangeTab = undefined;\n this.selectTab = undefined;\n this.searchContextMenu = undefined;\n this.swipeHandler = undefined;\n this.selection = undefined;\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","/*\n * 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 {ChatRights} from '../lib/appManagers/appChatsManager';\nimport type {Dialog} from '../lib/appManagers/appMessagesManager';\nimport appDialogsManager, {DialogElementSize as DialogElementSize} from '../lib/appManagers/appDialogsManager';\nimport rootScope from '../lib/rootScope';\nimport Scrollable from './scrollable';\nimport {FocusDirection} from '../helpers/fastSmoothScroll';\nimport CheckboxField from './checkboxField';\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 debounce from '../helpers/schedulers/debounce';\nimport windowSize from '../helpers/windowSize';\nimport type {IsPeerType} from '../lib/appManagers/appPeersManager';\nimport {attachClickEvent, simulateClickEvent} from '../helpers/dom/clickEvent';\nimport filterUnique from '../helpers/array/filterUnique';\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\nimport safeAssign from '../helpers/object/safeAssign';\nimport findAndSplice from '../helpers/array/findAndSplice';\nimport AvatarElement from './avatar';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport filterAsync from '../helpers/array/filterAsync';\nimport getParticipantPeerId from '../lib/appManagers/utils/chats/getParticipantPeerId';\nimport getChatMembersString from './wrappers/getChatMembersString';\nimport getUserStatusString from './wrappers/getUserStatusString';\nimport {Chat, User} from '../layer';\nimport canSendToUser from '../lib/appManagers/utils/users/canSendToUser';\nimport hasRights from '../lib/appManagers/utils/chats/hasRights';\nimport getDialogIndex from '../lib/appManagers/utils/dialogs/getDialogIndex';\nimport {generateDelimiter} from './generateDelimiter';\nimport SettingSection from './settingSection';\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 | Promise;\n private chatRightsAction: ChatRights;\n private multiSelect = true;\n private rippleEnabled = true;\n private avatarSize: DialogElementSize = 'abitbigger';\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 private managers: AppManagers;\n\n private design: 'round' | 'square' = 'round';\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 managers: AppSelectPeers['managers'],\n design?: AppSelectPeers['design']\n }) {\n safeAssign(this, options);\n\n this.container.classList.add('selector', 'selector-' + this.design);\n\n const f = (this.renderResultsFunc || this.renderResults).bind(this);\n this.renderResultsFunc = async(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 = await filterAsync(peerIds, async(peerId) => {\n if(peerId.isPeerId()) {\n const peer = await this.managers.appPeersManager.getPeer(peerId);\n if(peer) {\n for(const method of this.filterPeerTypeBy) {\n if(await this.managers.appPeersManager[method](peerId)) {\n return true;\n }\n }\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 const 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 attachClickEvent(this.selectedContainer, (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 simulateClickEvent(li);\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 attachClickEvent(this.chatsContainer, (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 const 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 = undefined;\n }\n\n if(this.peerType.includes('dialogs')) {\n this.folderId = 0;\n this.offsetIndex = 0;\n }\n\n for(const i in this.tempIds) {\n // @ts-ignore\n ++this.tempIds[i];\n }\n\n this.list = appDialogsManager.createChatList();\n\n this.promise = undefined;\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 async renderSaved() {\n if(\n !this.exceptSelf &&\n !this.offsetIndex &&\n this.folderId === 0 &&\n this.peerType.includes('dialogs') &&\n (!this.query || await this.managers.appUsersManager.testSelfSearch(this.query))\n ) {\n await this.renderResultsFunc([rootScope.myId]);\n }\n }\n\n private getTempId(type: keyof AppSelectPeers['tempIds']) {\n this.tempIds[type] ??= 0;\n const tempId = ++this.tempIds[type];\n return {\n tempId,\n middleware: () => this.tempIds[type] === tempId\n };\n }\n\n private async getMoreDialogs(): Promise {\n if(this.loadedWhat.dialogs && this.loadedWhat.archived) {\n return;\n }\n\n // ะฒ ะดะตัะบั‚ะพะฟะต - ัะฝะฐั‡ะฐะปะฐ ะฑะตะท ะณั€ัƒะฟะฟั‹, ะฟะพั‚ะพะผ ะฐั€ั…ะธะฒะฝั‹ะต, ะฟะพั‚ะพะผ ะบะพะฝั‚ะฐะบั‚ั‹ ะฑะตะท ัะพะพะฑั‰ะตะฝะธะน\n const pageCount = windowSize.height / 56 * 1.25 | 0;\n\n const {middleware} = this.getTempId('dialogs');\n const promise = this.managers.dialogsStorage.getDialogs({\n query: this.query,\n offsetIndex: this.offsetIndex,\n limit: pageCount,\n filterId: this.folderId,\n skipMigrated: true\n });\n\n promise.catch(() => {\n if(!middleware()) {\n return;\n }\n\n this.loadedWhat[this.loadedWhat.dialogs ? 'archived' : 'dialogs'] = true;\n });\n\n const value = await promise;\n if(!middleware()) {\n return;\n }\n\n let dialogs = value.dialogs as Dialog[];\n if(dialogs.length) {\n const newOffsetIndex = getDialogIndex(dialogs[dialogs.length - 1]) || 0;\n\n dialogs = dialogs.slice();\n findAndSplice(dialogs, d => d.peerId === rootScope.myId); // no my account\n\n if(this.chatRightsAction) {\n dialogs = await filterAsync(dialogs, (d) => this.filterByRights(d.peerId));\n if(!middleware()) {\n return;\n }\n }\n\n await this.renderSaved();\n if(!middleware()) {\n return;\n }\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 await this.renderSaved();\n if(!middleware()) {\n return;\n }\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 async filterByRights(peerId: PeerId) {\n const peer: User | Chat = await this.managers.appPeersManager.getPeer(peerId);\n if(peerId.isUser()) {\n return this.chatRightsAction !== 'send_messages' || canSendToUser(peer as User.user);\n } else if(hasRights(peer as Chat.chat, this.chatRightsAction)) {\n return true;\n }\n }\n\n private async getMoreContacts() {\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 {middleware} = this.getTempId('contacts');\n const promise = Promise.all([\n isGlobalSearch ? this.managers.appUsersManager.getContactsPeerIds(this.query) : [],\n this.query ? this.managers.appUsersManager.searchContacts(this.query) : undefined\n ]);\n\n promise.catch(() => {\n if(!middleware()) {\n return;\n }\n\n this.loadedWhat.contacts = true;\n });\n\n const [cachedContacts, searchResult] = await promise;\n if(!middleware()) {\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 = await filterAsync(resultPeerIds, (peerId) => this.filterByRights(peerId));\n if(!middleware()) {\n return;\n }\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 }\n\n // if(this.cachedContacts.length) {\n const pageCount = windowSize.height / 56 * 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.loadedWhat.channelParticipants) {\n return;\n }\n\n const pageCount = 50; // same as in group permissions to use cache\n\n const {middleware} = this.getTempId('channelParticipants');\n const promise = this.managers.appProfileManager.getChannelParticipants(\n this.peerId.toChatId(),\n {\n _: 'channelParticipantsSearch',\n q: this.query\n },\n pageCount,\n this.list.childElementCount\n );\n\n promise.catch(() => {\n if(!middleware()) {\n return;\n }\n\n this.loadedWhat.channelParticipants = true;\n });\n\n const participants = await promise;\n if(!middleware()) {\n return;\n }\n\n const peerIds = participants.participants.map((participant) => {\n return 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 if(this.promise) {\n return this.promise;\n }\n\n const get = () => {\n if((this.peerType.includes('dialogs')/* || this.loadedWhat.contacts */) && !this.loadedWhat.archived) { // to load non-contacts\n return this.getMoreSomething('dialogs');\n }\n\n if((this.peerType.includes('contacts') || this.peerType.includes('dialogs')) && !this.loadedWhat.contacts) {\n return this.getMoreSomething('contacts');\n }\n\n if(this.peerType.includes('channelParticipants') && !this.loadedWhat.channelParticipants) {\n return this.getMoreSomething('channelParticipants');\n }\n };\n\n const loadPromise = get();\n if(!loadPromise) {\n return Promise.resolve();\n }\n\n const promise = this.promise = loadPromise.catch((err) => {\n console.error('get more result error', err);\n }).finally(() => {\n if(this.promise === promise) {\n this.promise = undefined;\n }\n\n this.checkForTriggers();\n });\n\n return promise;\n }\n\n private getMoreSomething(peerType: SelectSearchPeerType) {\n const map: {[type in SelectSearchPeerType]: () => Promise} = {\n dialogs: this.getMoreDialogs,\n contacts: this.getMoreContacts,\n channelParticipants: this.getMoreChannelParticipants\n };\n\n const promise = map[peerType].call(this);\n return promise;\n }\n\n private async renderResults(peerIds: PeerId[]) {\n // console.log('will renderResults:', peerIds);\n\n // ะพัั‚ะฐะฒะธะผ ั‚ะพะปัŒะบะพ ะฝะตะบะพะฝั‚ะฐะบั‚ั‹ ั ะดะธะฐะปะพะณะพะฒ\n if(!this.peerType.includes('dialogs') && this.loadedWhat.contacts) {\n peerIds = await filterAsync(peerIds, (peerId) => {\n return this.managers.appUsersManager.isNonContactUser(peerId);\n });\n }\n\n peerIds.forEach(async(peerId) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: this.scrollable,\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 = await getChatMembersString(peerId.toChatId());\n } else if(peerId === rootScope.myId) {\n subtitleEl = i18n(this.selfPresence);\n } else {\n subtitleEl = getUserStatusString(await this.managers.appUsersManager.getUser(peerId.toUserId()));\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 = new AvatarElement();\n avatarEl.classList.add('selector-user-avatar', 'tgico', 'avatar-32');\n avatarEl.isDialog = true;\n\n div.dataset.key = '' + key;\n if(key.isPeerId()) {\n if(title === undefined) {\n const peerTitle = new PeerTitle();\n peerTitle.update({peerId: key.toPeerId(), dialog: true});\n title = peerTitle.element;\n }\n\n avatarEl.updateWithOptions({\n peerId: key as PeerId\n });\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.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","/*\n * 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 {MyDocument} from '../lib/appManagers/appDocsManager';\nimport ProgressivePreloader from './preloader';\nimport appMediaPlaybackController, {MediaItem, MediaSearchContext} from './appMediaPlaybackController';\nimport {DocumentAttribute, Message} from '../layer';\nimport mediaSizes from '../helpers/mediaSizes';\nimport {IS_SAFARI} from '../environment/userAgent';\nimport rootScope from '../lib/rootScope';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport LazyLoadQueue from './lazyLoadQueue';\nimport deferredPromise, {CancellablePromise} 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 {formatFullSentTime} from '../helpers/date';\nimport throttleWithRaf from '../helpers/schedulers/throttleWithRaf';\nimport {NULL_PEER_ID} from '../lib/mtproto/mtproto_config';\nimport formatBytes from '../helpers/formatBytes';\nimport {animateSingle} from '../helpers/animation';\nimport clamp from '../helpers/number/clamp';\nimport toHHMMSS from '../helpers/string/toHHMMSS';\nimport MediaProgressLine from './mediaProgressLine';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport wrapSenderToPeer from './wrappers/senderToPeer';\nimport wrapSentTime from './wrappers/sentTime';\nimport getMediaFromMessage from '../lib/appManagers/utils/messages/getMediaFromMessage';\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport wrapPhoto from './wrappers/photo';\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 createWaveformBars(waveform: Uint8Array, duration: number) {\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 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-bars');\n svg.setAttributeNS(null, 'width', '' + availW);\n svg.setAttributeNS(null, 'height', '' + barHeightMax);\n svg.setAttributeNS(null, 'viewBox', `0 0 ${availW} ${barHeightMax}`);\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 if(sumI < (barCount + 1) / 2) {\n if(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 const container = document.createElement('div');\n container.classList.add('audio-waveform');\n container.append(svg);\n\n svg.insertAdjacentHTML('beforeend', html);\n return {svg, container, availW};\n}\n\nasync function wrapVoiceMessage(audioEl: AudioElement) {\n audioEl.classList.add('is-voice');\n\n const message = audioEl.message;\n const doc = getMediaFromMessage(message) as MyDocument;\n\n if(message.pFlags.out) {\n audioEl.classList.add('is-out');\n }\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 const {svg, container: svgContainer, availW} = createWaveformBars(waveform, doc.duration);\n\n const fakeSvgContainer = svgContainer.cloneNode(true) as HTMLElement;\n fakeSvgContainer.classList.add('audio-waveform-fake');\n svgContainer.classList.add('audio-waveform-background');\n\n const waveformContainer = document.createElement('div');\n waveformContainer.classList.add('audio-waveform-container');\n waveformContainer.append(svgContainer, fakeSvgContainer);\n\n const timeDiv = document.createElement('div');\n timeDiv.classList.add('audio-time');\n audioEl.append(waveformContainer, timeDiv);\n\n let progress = svg as any as HTMLElement;\n\n const onLoad = () => {\n let audio = audioEl.audio;\n\n const setAnimation = () => {\n animateSingle(() => {\n if(!audio) return false;\n onTimeUpdate();\n return !audio.paused;\n }, audioEl);\n };\n\n const onTimeUpdate = () => {\n fakeSvgContainer.style.width = (audio.currentTime / audio.duration * 100) + '%';\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 audioEl.addAudioListener('play', setAnimation);\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\nasync function wrapAudio(audioEl: AudioElement) {\n const withTime = audioEl.withTime;\n\n const message = audioEl.message;\n const doc = getMediaFromMessage(message) as MyDocument;\n\n const isVoice = doc.type === 'voice' || doc.type === 'round';\n const descriptionEl = document.createElement('div');\n descriptionEl.classList.add('audio-description');\n\n const audioAttribute = doc.attributes.find((attr) => attr._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio;\n\n if(!isVoice) {\n const parts: (Node | string)[] = [];\n if(audioAttribute?.performer) {\n parts.push(wrapEmojiText(audioAttribute.performer));\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(await 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 middleEllipsisEl.dataset.fontSize = audioEl.dataset.fontSize;\n middleEllipsisEl.dataset.sizeType = audioEl.dataset.sizeType;\n (middleEllipsisEl as any).getSize = (audioEl as any).getSize;\n if(isVoice) {\n middleEllipsisEl.append(await wrapSenderToPeer(message));\n } else {\n setInnerHTML(middleEllipsisEl, wrapEmojiText(audioAttribute?.title ?? doc.file_name));\n }\n\n titleEl.append(middleEllipsisEl);\n\n if(audioEl.showSender) {\n titleEl.append(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({\n media: audioEl.audio,\n streamable: doc.supportsStreaming\n });\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, anchorMid: number/* , 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 if((next.length && next[0].mid < anchorMid) || (prev.length && prev[prev.length - 1].mid > anchorMid)) {\n [prev, next] = [next.reverse(), prev.reverse()];\n }\n\n // prev = next = undefined;\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 public managers: AppManagers;\n\n private listenerSetter = new ListenerSetter();\n private onTypeDisconnect: () => void;\n public onLoad: (autoload?: boolean) => void;\n public readyPromise: CancellablePromise;\n\n public async render() {\n this.classList.add('audio');\n this.managers = rootScope.managers;\n\n this.dataset.mid = '' + this.message.mid;\n this.dataset.peerId = '' + this.message.peerId;\n\n const doc = getMediaFromMessage(this.message) as MyDocument;\n const isRealVoice = doc.type === 'voice';\n const isVoice = !this.voiceAsMusic && isRealVoice;\n const isOutgoing = this.message.pFlags.is_outgoing;\n const uploadingFileName = this.message?.uploadingFileName;\n\n const durationStr = toHHMMSS(doc.duration | 0);\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(uploadingFileName) {\n this.classList.add('is-outgoing');\n this.append(downloadDiv);\n }\n\n const onTypeLoad = await (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 = () => toHHMMSS(audio.currentTime | 0) + (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.message.mid/* , 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: HTMLElement[] = [];\n const wrapped = await 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 const autoDownload = doc.type !== 'audio'/* || !this.noAutoDownload */;\n onLoad(autoDownload);\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 = appDownloadManager.downloadMediaURL({media: 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 if(this.classList.contains('corner-download')) {\n toggle.append(downloadDiv);\n } else {\n this.append(downloadDiv);\n }\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(autoDownload) {\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(uploadingFileName) {\n this.preloader = constructDownloadPreloader(false);\n this.preloader.attachPromise(appDownloadManager.getUpload(uploadingFileName));\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 setTimeout(() => {\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 if(this.listenerSetter) {\n this.listenerSetter.removeAll();\n this.listenerSetter = null;\n }\n\n if(this.preloader) {\n this.preloader = null;\n }\n }, 100);\n }\n}\n\ncustomElements.define('audio-element', AudioElement);\n","/*\n * 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 {AppManagers} from '../lib/appManagers/managers';\nimport ListLoader, {ListLoaderOptions} from './listLoader';\n\nexport default class AvatarListLoader extends ListLoader {\n private peerId: PeerId;\n private managers: AppManagers;\n\n constructor(options: Omit, 'loadMore'> & {peerId: PeerId, managers: AppManagers}) {\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;\n return this.managers.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 appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport appImManager from '../lib/appManagers/appImManager';\nimport rootScope from '../lib/rootScope';\nimport AppMediaViewerBase from './appMediaViewerBase';\n\ntype AppMediaViewerAvatarTargetType = {element: HTMLElement, photoId: Photo.photo['id'], photo?: Photo.photo};\nexport default class AppMediaViewerAvatar extends AppMediaViewerBase<'', 'delete', AppMediaViewerAvatarTargetType> {\n public peerId: PeerId;\n\n constructor(peerId: PeerId) {\n super(new AvatarListLoader({peerId, managers: rootScope.managers}), [/* '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 appDownloadManager.downloadToDisc({\n media: this.target.photo,\n queueId: appImManager.chat.bubbles.lazyLoadQueue.queueId\n });\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 = await this.managers.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 this.target.photo = photo;\n\n return ret;\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';\nimport {Message, Photo} from '../layer';\nimport type LazyLoadQueue from './lazyLoadQueue';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport AppMediaViewer from './appMediaViewer';\nimport AppMediaViewerAvatar from './appMediaViewerAvatar';\nimport isObject from '../helpers/object/isObject';\nimport {ArgumentTypes} from '../types';\nimport putPhoto from './putPhoto';\nimport {recordPromise} from '../helpers/recordPromise';\nimport {getMiddleware, MiddlewareHelper} from '../helpers/middleware';\n\nconst onAvatarUpdate = ({peerId, threadId}: {peerId: PeerId, threadId?: number}) => {\n let query = 'avatar-element[data-peer-id=\"' + peerId + '\"]';\n if(threadId) {\n query += '[data-thread-id=\"' + threadId + '\"]';\n }\n\n (Array.from(document.querySelectorAll(query)) as AvatarElement[]).forEach((elem) => {\n // console.log('updating avatar:', elem);\n elem.update();\n });\n};\n\nrootScope.addEventListener('avatar_update', onAvatarUpdate);\nrootScope.addEventListener('peer_title_edit', async(data) => {\n if(!(await rootScope.managers.appAvatarsManager.isAvatarCached(data.peerId))) {\n onAvatarUpdate(data);\n }\n});\n\nexport async function openAvatarViewer(\n target: HTMLElement,\n peerId: PeerId,\n middleware: () => boolean,\n message?: any,\n prevTargets?: {element: HTMLElement, item: Photo.photo['id'] | Message.messageService}[],\n nextTargets?: typeof prevTargets\n) {\n let photo = await rootScope.managers.appProfileManager.getFullPhoto(peerId);\n if(!middleware() || !photo) {\n return;\n }\n\n const getTarget = () => {\n const good = Array.from(target.querySelectorAll('img')).find((img) => !img.classList.contains('emoji'));\n return good ? target : null;\n };\n\n if(peerId.isAnyChat()) {\n const hadMessage = !!message;\n const inputFilter = 'inputMessagesFilterChatPhotos';\n if(!message) {\n message = await rootScope.managers.appMessagesManager.getSearch({\n peerId,\n inputFilter: {_: inputFilter},\n maxId: 0,\n limit: 1\n }).then((value) => {\n // console.log(lol);\n // ! by descend\n return value.history[0];\n });\n\n if(!middleware()) {\n return;\n }\n }\n\n if(message) {\n // ! ะณะตะฝะธะน ะฒ ะดะตะปะต, ะบะพัั‚ั‹ะปะธั€ัƒะตะผ (ะฝะพ ัั‚ะพ ะณะตะฝะธะฐะปัŒะฝะพ)\n const messagePhoto = message.action.photo;\n if(messagePhoto.id !== photo.id) {\n if(!hadMessage) {\n message = rootScope.managers.appMessagesManager.generateFakeAvatarMessage(peerId, photo);\n } else {\n\n }\n }\n\n const f = (arr: typeof prevTargets) => arr.map((el) => ({\n element: el.element,\n mid: (el.item as Message.messageService).mid,\n peerId: (el.item as Message.messageService).peerId\n }));\n\n new AppMediaViewer()\n .setSearchContext({\n peerId,\n inputFilter: {_: inputFilter}\n })\n .openMedia(message, getTarget(), undefined, undefined, prevTargets ? f(prevTargets) : undefined, nextTargets ? f(nextTargets) : undefined);\n\n return;\n }\n }\n\n if(photo) {\n if(!isObject(message) && message) {\n photo = await rootScope.managers.appPhotosManager.getPhoto(message);\n }\n\n const f = (arr: typeof prevTargets) => arr.map((el) => ({\n element: el.element,\n photoId: el.item as string\n }));\n\n new AppMediaViewerAvatar(peerId).openMedia(\n photo.id,\n getTarget(),\n undefined,\n prevTargets ? f(prevTargets) : undefined,\n nextTargets ? f(nextTargets) : undefined\n );\n }\n}\n\nconst believeMe: Map> = new Map();\nconst seen: Set = new Set();\n\nfunction getAvatarQueueKey(peerId: PeerId, threadId?: number) {\n return peerId + (threadId ? '_' + threadId : '');\n}\n\nexport default class AvatarElement extends HTMLElement {\n public peerId: PeerId;\n public isDialog: boolean;\n public peerTitle: string;\n public loadPromises: Promise[];\n public lazyLoadQueue: LazyLoadQueue;\n public isBig: boolean;\n public threadId: number;\n private addedToQueue = false;\n public wrapOptions: WrapSomethingOptions;\n\n public middlewareHelper: MiddlewareHelper;\n\n constructor() {\n super();\n this.classList.add('avatar-like');\n this.middlewareHelper = getMiddleware();\n }\n\n disconnectedCallback() {\n // ะฑั€ะฐัƒะทะตั€ ะฒั‹ะทั‹ะฒะฐะตั‚ ัั‚ะพั‚ ะผะตั‚ะพะด ะฟั€ะธ ัƒะดะฐะปะตะฝะธะธ ัะปะตะผะตะฝั‚ะฐ ะธะท ะดะพะบัƒะผะตะฝั‚ะฐ\n // (ะผะพะถะตั‚ ะฒั‹ะทั‹ะฒะฐั‚ัŒัั ะผะฝะพะณะพ ั€ะฐะท, ะตัะปะธ ัะปะตะผะตะฝั‚ ะผะฝะพะณะพะบั€ะฐั‚ะฝะพ ะดะพะฑะฐะฒะปัะตั‚ัั/ัƒะดะฐะปัะตั‚ัั)\n const key = getAvatarQueueKey(this.peerId, this.threadId);\n const set = believeMe.get(key);\n if(set?.has(this)) {\n set.delete(this);\n if(!set.size) {\n believeMe.delete(key);\n }\n }\n\n this.lazyLoadQueue?.delete({div: this});\n }\n\n public attachClickEvent() {\n let loading = false;\n attachClickEvent(this, async(e) => {\n cancelEvent(e);\n if(loading) return;\n const peerId = this.peerId;\n loading = true;\n await openAvatarViewer(this, this.peerId, () => this.peerId === peerId);\n loading = false;\n });\n }\n\n public updateOptions(options: Partial[0]>) {\n for(const i in options) {\n // @ts-ignore\n this[i] = options[i];\n }\n }\n\n public updateWithOptions(options: {\n peerId: PeerId,\n threadId?: number,\n isDialog?: boolean,\n isBig?: boolean,\n peerTitle?: string,\n lazyLoadQueue?: LazyLoadQueue | false,\n loadPromises?: Promise[],\n wrapOptions?: WrapSomethingOptions\n }) {\n const wasPeerId = this.peerId;\n const wasThreadId = this.threadId;\n this.updateOptions(options);\n const newPeerId = this.peerId;\n const threadId = this.threadId;\n\n if(wasPeerId === newPeerId && wasThreadId === threadId) {\n return;\n }\n\n this.dataset.peerId = '' + newPeerId;\n\n if(threadId) {\n this.dataset.threadId = '' + threadId;\n } else if(wasThreadId) {\n delete this.dataset.threadId;\n }\n\n if(wasPeerId) {\n const key = getAvatarQueueKey(wasPeerId, wasThreadId);\n const set = believeMe.get(key);\n if(set) {\n set.delete(this);\n if(!set.size) {\n believeMe.delete(key);\n }\n }\n }\n\n const middleware = options.wrapOptions?.middleware;\n this.middlewareHelper.destroy();\n if(middleware) {\n this.middlewareHelper = middleware.create();\n } else {\n this.middlewareHelper.destroy();\n }\n\n return this.update();\n }\n\n public remove() {\n this.middlewareHelper.destroy();\n super.remove();\n }\n\n private r(onlyThumb = false) {\n const promise = putPhoto({\n div: this,\n peerId: this.peerId,\n isDialog: this.isDialog,\n title: this.peerTitle,\n onlyThumb,\n isBig: this.isBig,\n threadId: this.threadId,\n wrapOptions: {\n middleware: this.middlewareHelper.get(),\n ...(this.wrapOptions || {})\n }\n });\n // recordPromise(promise, 'avatar putPhoto-' + this.peerId);\n\n if(this.loadPromises) {\n this.loadPromises.push(promise);\n\n promise.finally(() => {\n this.loadPromises = undefined;\n });\n }\n\n return promise;\n }\n\n public update() {\n if(this.lazyLoadQueue) {\n if(!seen.has(this.peerId)) {\n if(this.addedToQueue) return;\n this.addedToQueue = true;\n\n const key = getAvatarQueueKey(this.peerId, this.threadId);\n let set = believeMe.get(key);\n if(!set) {\n believeMe.set(key, set = new Set());\n }\n\n set.add(this);\n\n this.lazyLoadQueue.push({\n div: this,\n load: () => {\n seen.add(this.peerId);\n return this.update();\n }\n });\n\n return this.r(true);\n } else if(this.addedToQueue) {\n this.lazyLoadQueue.delete({div: this});\n }\n }\n\n seen.add(this.peerId);\n\n const promise = this.r();\n\n if(this.addedToQueue) {\n promise.finally(() => {\n this.addedToQueue = false;\n });\n }\n\n const key = getAvatarQueueKey(this.peerId, this.threadId);\n const set = believeMe.get(key);\n if(set) {\n set.delete(this);\n const arr = Array.from(set);\n believeMe.delete(key);\n\n for(let i = 0, length = arr.length; i < length; ++i) {\n arr[i].update();\n }\n }\n\n return promise;\n }\n}\n\ncustomElements.define('avatar-element', AvatarElement);\n","/*\n * 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 {CancellablePromise} from '../helpers/cancellablePromise';\nimport type {InputFile} from '../layer';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport PopupElement from './popups';\nimport PopupAvatar from './popups/avatar';\n\nexport default class AvatarEdit {\n public container: HTMLElement;\n private canvas: HTMLCanvasElement;\n private icon: HTMLSpanElement;\n\n constructor(onChange: (uploadAvatar: () => CancellablePromise) => void, options?: ConstructorParameters[0]) {\n this.container = document.createElement('div');\n this.container.classList.add('avatar-edit');\n\n this.canvas = document.createElement('canvas');\n this.canvas.classList.add('avatar-edit-canvas');\n\n this.icon = document.createElement('span');\n this.icon.classList.add('tgico', 'tgico-cameraadd');\n\n this.container.append(this.canvas, this.icon);\n\n attachClickEvent(this.container, () => {\n PopupElement.createPopup(PopupAvatar, options).open(this.canvas, onChange);\n });\n }\n\n public clear() {\n const ctx = this.canvas.getContext('2d');\n ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\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, LangPackKey} from '../lib/langPack';\nimport ripple from './ripple';\n\nexport type ButtonOptions = Partial<{\n noRipple: true,\n onlyMobile: true,\n icon: string,\n rippleSquare: true,\n text: LangPackKey,\n disabled: boolean,\n asDiv: boolean,\n asLink: boolean\n}>;\n\nexport default function Button(className: string, options: T = {} as T): T['asLink'] extends true ? HTMLAnchorElement : HTMLButtonElement {\n const button = document.createElement(options.asLink ? 'a' : (options.asDiv ? 'div' : 'button'));\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\n\n if(!options.noRipple) {\n if(options.rippleSquare) {\n button.classList.add('rp-square');\n }\n\n ripple(button);\n }\n\n if(options.onlyMobile) {\n button.classList.add('only-handhelds');\n }\n\n if(options.disabled) {\n button.setAttribute('disabled', 'true');\n }\n\n if(options.text) {\n button.append(i18n(options.text));\n }\n\n return button as any;\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 Button from './button';\n\nconst ButtonCorner = (options: Partial<{className: string, icon: string, noRipple: true, onlyMobile: true, asDiv: boolean}> = {}) => {\n const button = Button('btn-circle btn-corner z-depth-1' + (options.className ? ' ' + options.className : ''), options);\n return button;\n};\n\nexport default ButtonCorner;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Button from './button';\n\nconst ButtonIcon = (className?: string, options: Partial<{noRipple: true, onlyMobile: true, asDiv: boolean}> = {}) => {\n const button = Button('btn-icon', {\n icon: className || undefined,\n ...options\n });\n\n return button;\n};\n\nexport default ButtonIcon;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport flatten from '../helpers/array/flatten';\nimport contextMenuController from '../helpers/contextMenuController';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {AttachClickOptions, attachClickEvent} from '../helpers/dom/clickEvent';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {FormatterArguments, i18n, LangPackKey} from '../lib/langPack';\nimport CheckboxField from './checkboxField';\nimport {Document} from '../layer';\nimport wrapPhoto from './wrappers/photo';\nimport textToSvgURL from '../helpers/textToSvgURL';\nimport customProperties from '../helpers/dom/customProperties';\nimport {IS_MOBILE} from '../environment/userAgent';\nimport ripple from './ripple';\n\nexport type ButtonMenuItemOptions = {\n icon?: string,\n iconDoc?: Document.document,\n text?: LangPackKey,\n textArgs?: FormatterArguments,\n regularText?: Parameters[1],\n onClick: (e: MouseEvent | TouchEvent) => any,\n checkForClose?: () => boolean,\n element?: HTMLElement,\n textElement?: HTMLElement,\n options?: AttachClickOptions,\n checkboxField?: CheckboxField,\n noCheckboxClickListener?: boolean,\n keepOpen?: boolean,\n separator?: boolean | HTMLElement,\n multiline?: boolean,\n loadPromise?: Promise,\n waitForAnimation?: boolean\n /* , cancelEvent?: true */\n};\n\nexport type ButtonMenuItemOptionsVerifiable = ButtonMenuItemOptions & {\n verify?: () => boolean | Promise\n};\n\nfunction ButtonMenuItem(options: ButtonMenuItemOptions) {\n if(options.element) return [options.separator as HTMLElement, options.element].filter(Boolean);\n\n const {icon, iconDoc, text, onClick, checkboxField, noCheckboxClickListener} = options;\n const el = document.createElement('div');\n el.className = 'btn-menu-item rp-overflow' + (icon ? ' tgico-' + icon : '');\n\n if(IS_MOBILE) {\n ripple(el);\n }\n\n let textElement = options.textElement;\n if(!textElement) {\n textElement = options.textElement = text ? i18n(text, options.textArgs) : document.createElement('span');\n if(options.regularText) {\n setInnerHTML(textElement, options.regularText);\n }\n }\n\n if(iconDoc) {\n const iconElement = document.createElement('span');\n iconElement.classList.add('btn-menu-item-icon');\n el.append(iconElement);\n\n options.loadPromise = wrapPhoto({\n container: iconElement,\n photo: iconDoc,\n boxWidth: 24,\n boxHeight: 24,\n withoutPreloader: true,\n noFadeIn: true,\n noBlur: true,\n processUrl: (url) => {\n return fetch(url)\n .then((response) => response.text())\n .then((text) => {\n const color = customProperties.getProperty('primary-text-color');\n const doc = new DOMParser().parseFromString(text, 'image/svg+xml');\n const svg = doc.firstElementChild as HTMLElement;\n svg.querySelectorAll('path').forEach((path) => {\n path.setAttributeNS(null, 'fill', color);\n path.style.stroke = color;\n path.style.strokeWidth = '.25px';\n });\n return textToSvgURL(svg.outerHTML);\n });\n }\n }).then((ret) => ret.loadPromises.thumb);\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 onClick && attachClickEvent(el, /* CLICK_EVENT_NAME !== 'click' || keepOpen ? */ /* async */(e) => {\n cancelEvent(e);\n\n const menu = findUpClassName(e.target, 'btn-menu');\n if(menu && !menu.classList.contains('active')) {\n return;\n }\n\n // let closed = false;\n // if(!keepOpen && !options.checkForClose) {\n // closed = true;\n // contextMenuController.close();\n // }\n\n // wait for closing animation\n // if(options.waitForAnimation && rootScope.settings.animationsEnabled && !options.checkForClose) {\n // await pause(125);\n // }\n\n onClick(e);\n if(options.checkForClose?.() === false) {\n return;\n }\n\n if(!keepOpen/* && !closed */) {\n contextMenuController.close();\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 if(options.separator === true) {\n options.separator = document.createElement('hr');\n }\n\n if(options.multiline) {\n el.classList.add('is-multiline');\n }\n\n return [options.separator as HTMLElement, options.element = el].filter(Boolean);\n}\n\nexport function ButtonMenuSync({listenerSetter, buttons}: {\n buttons: ButtonMenuItemOptions[],\n listenerSetter?: ListenerSetter\n}) {\n const el: HTMLElement = 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 el.append(...flatten(items));\n\n return el;\n}\n\nexport default async function ButtonMenu(options: Parameters[0]) {\n const el = ButtonMenuSync(options);\n await Promise.all(options.buttons.map(({loadPromise}) => loadPromise));\n return el;\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 contextMenuController from '../helpers/contextMenuController';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {AttachClickOptions, CLICK_EVENT_NAME} from '../helpers/dom/clickEvent';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport ButtonIcon from './buttonIcon';\nimport ButtonMenu, {ButtonMenuItemOptionsVerifiable} from './buttonMenu';\nimport filterAsync from '../helpers/array/filterAsync';\nimport {doubleRaf} from '../helpers/schedulers';\n\n// TODO: refactor for attachClickEvent, because if move finger after touchstart, it will start anyway\nexport function ButtonMenuToggleHandler({\n el,\n onOpen,\n options,\n onClose\n}: {\n el: HTMLElement,\n onOpen?: (e: Event) => any,\n options?: AttachClickOptions,\n onClose?: () => void\n}) {\n const add = options?.listenerSetter ? options.listenerSetter.add(el) : el.addEventListener.bind(el);\n\n add(CLICK_EVENT_NAME, (e: Event) => {\n if(!el.classList.contains('btn-menu-toggle')) return false;\n\n cancelEvent(e);\n\n if(el.classList.contains('menu-open')) {\n contextMenuController.close();\n } else {\n const result = onOpen?.(e);\n const open = () => {\n const openedMenu = el.querySelector('.btn-menu') as HTMLDivElement;\n contextMenuController.openBtnMenu(openedMenu, onClose);\n };\n\n if(result instanceof Promise) {\n result.then(open);\n } else {\n open();\n }\n }\n });\n}\n\nexport default function ButtonMenuToggle({\n buttonOptions,\n listenerSetter: attachListenerSetter,\n container,\n direction,\n buttons,\n onOpenBefore,\n onOpen,\n onClose,\n onCloseAfter\n}: {\n buttonOptions?: Parameters[1],\n listenerSetter?: ListenerSetter,\n container?: HTMLElement\n direction: 'bottom-left' | 'bottom-right' | 'top-left' | 'top-right',\n buttons: ButtonMenuItemOptionsVerifiable[],\n onOpenBefore?: (e: Event) => any,\n onOpen?: (e: Event, element: HTMLElement) => any,\n onClose?: () => void,\n onCloseAfter?: () => void\n}) {\n if(buttonOptions) {\n buttonOptions.asDiv = true;\n }\n\n const button = container ?? ButtonIcon('more', buttonOptions);\n button.classList.add('btn-menu-toggle');\n\n const listenerSetter = new ListenerSetter();\n\n let element: HTMLElement, closeTimeout: number;\n ButtonMenuToggleHandler({\n el: button,\n onOpen: async(e) => {\n await onOpenBefore?.(e);\n if(closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n return;\n }\n\n const f = (b: (typeof buttons[0])[]) => filterAsync(b, (button) => button?.verify?.() ?? true);\n\n const filteredButtons = await f(buttons);\n if(!filteredButtons.length) {\n return;\n }\n\n const _element = element = await ButtonMenu({\n buttons: filteredButtons,\n listenerSetter\n });\n _element.classList.add(direction);\n\n await onOpen?.(e, _element);\n\n button.append(_element);\n await doubleRaf();\n },\n options: {\n listenerSetter: attachListenerSetter\n },\n onClose: () => {\n onClose?.();\n\n closeTimeout = window.setTimeout(() => {\n onCloseAfter?.();\n closeTimeout = undefined;\n listenerSetter.removeAll();\n buttons.forEach((button) => button.element = undefined);\n element.remove();\n }, 300);\n }\n });\n\n return button;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko, Artem Kolnogorov and unknown creator of the script taken from http://useless.altervista.org/gradient.html\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {animateSingle} from '../../helpers/animation';\nimport {hexToRgb} from '../../helpers/color';\nimport {easeOutQuadApply} from '../../helpers/easing/easeOutQuad';\n\nconst WIDTH = 50;\nconst HEIGHT = WIDTH;\n\nexport default class ChatBackgroundGradientRenderer {\n private readonly _width = WIDTH;\n private readonly _height = HEIGHT;\n private _phase: number;\n private _tail: number;\n private readonly _tails = 90;\n private readonly _scrollTails = 50;\n private _frames: ImageData[];\n private _colors: {r: number, g: number, b: number}[];\n private readonly _curve = [\n 0, 0.25, 0.50, 0.75, 1, 1.5, 2, 2.5, 3, 3.5, 4, 5, 6, 7, 8, 9, 10, 11, 12,\n 13, 14, 15, 16, 17, 18, 18.3, 18.6, 18.9, 19.2, 19.5, 19.8, 20.1, 20.4, 20.7,\n 21.0, 21.3, 21.6, 21.9, 22.2, 22.5, 22.8, 23.1, 23.4, 23.7, 24.0, 24.3, 24.6,\n 24.9, 25.2, 25.5, 25.8, 26.1, 26.3, 26.4, 26.5, 26.6, 26.7, 26.8, 26.9, 27\n ];\n private readonly _incrementalCurve: number[];\n private readonly _positions = [\n {x: 0.80, y: 0.10},\n {x: 0.60, y: 0.20},\n {x: 0.35, y: 0.25},\n {x: 0.25, y: 0.60},\n {x: 0.20, y: 0.90},\n {x: 0.40, y: 0.80},\n {x: 0.65, y: 0.75},\n {x: 0.75, y: 0.40}\n ];\n private readonly _phases = this._positions.length;\n private _onWheelRAF: number;\n private _scrollDelta: number;\n\n // private _ts = 0;\n // private _fps = 15;\n // private _frametime = 1000 / this._fps;\n // private _raf: number;\n\n private _canvas: HTMLCanvasElement;\n private _ctx: CanvasRenderingContext2D;\n private _hc: HTMLCanvasElement;\n private _hctx: CanvasRenderingContext2D;\n\n private _addedScrollListener: boolean;\n private _animatingToNextPosition: boolean;\n private _nextPositionTail: number;\n private _nextPositionTails: number;\n private _nextPositionLeft: number;\n\n constructor() {\n const diff = this._tails / this._curve[this._curve.length - 1];\n\n for(let i = 0, length = this._curve.length; i < length; ++i) {\n this._curve[i] = this._curve[i] * diff;\n }\n\n this._incrementalCurve = this._curve.map((v, i, arr) => {\n return v - (arr[i - 1] ?? 0);\n });\n }\n\n private hexToRgb(hex: string) {\n const result = hexToRgb(hex);\n return {r: result[0], g: result[1], b: result[2]};\n }\n\n private getPositions(shift: number) {\n const positions = this._positions.slice();\n positions.push(...positions.splice(0, shift));\n\n const result: typeof positions = [];\n for(let i = 0; i < positions.length; i += 2) {\n result.push(positions[i]);\n }\n return result;\n }\n\n private getNextPositions(phase: number, curveMax: number, curve: number[]) {\n const pos = this.getPositions(phase);\n if(!curve[0] && curve.length === 1) {\n return [pos];\n }\n\n const nextPos = this.getPositions(++phase % this._phases);\n const distances = nextPos.map((nextPos, idx) => {\n return {\n x: (nextPos.x - pos[idx].x) / curveMax,\n y: (nextPos.y - pos[idx].y) / curveMax\n };\n });\n\n const positions = curve.map((value) => {\n return distances.map((distance, idx) => {\n return {\n x: pos[idx].x + distance.x * value,\n y: pos[idx].y + distance.y * value\n };\n });\n });\n\n return positions;\n }\n\n private curPosition(phase: number, tail: number) {\n const positions = this.getNextPositions(phase, this._tails, [tail]);\n return positions[0];\n }\n\n private changeTail(diff: number) {\n this._tail += diff;\n\n while(this._tail >= this._tails) {\n this._tail -= this._tails;\n if(++this._phase >= this._phases) {\n this._phase -= this._phases;\n }\n }\n\n while(this._tail < 0) {\n this._tail += this._tails;\n if(--this._phase < 0) {\n this._phase += this._phases;\n }\n }\n }\n\n private onWheel = (e: {deltaY: number}) => {\n if(this._animatingToNextPosition) {\n return;\n }\n\n this._scrollDelta += e.deltaY;\n if(this._onWheelRAF === undefined) {\n this._onWheelRAF = requestAnimationFrame(this.drawOnWheel);\n }\n };\n\n private changeTailAndDraw(diff: number) {\n this.changeTail(diff);\n const curPos = this.curPosition(this._phase, this._tail);\n this.drawGradient(curPos);\n }\n\n private drawOnWheel = () => {\n const value = this._scrollDelta / this._scrollTails;\n this._scrollDelta %= this._scrollTails;\n const diff = value > 0 ? Math.floor(value) : Math.ceil(value);\n if(diff) {\n this.changeTailAndDraw(diff);\n }\n this._onWheelRAF = undefined;\n };\n\n private drawNextPositionAnimated = (getProgress?: () => number) => {\n let done: boolean, id: ImageData;\n if(getProgress) {\n const value = getProgress();\n done = value >= 1;\n const transitionValue = easeOutQuadApply(value, 1);\n const nextPositionTail = this._nextPositionTail ?? 0;\n const tail = this._nextPositionTail = this._nextPositionTails * transitionValue;\n const diff = tail - nextPositionTail;\n if(diff) {\n this._nextPositionLeft -= diff;\n this.changeTailAndDraw(diff);\n }\n } else {\n const frames = this._frames;\n id = frames.shift();\n done = !frames.length;\n }\n\n if(id) {\n this.drawImageData(id);\n }\n\n if(done) {\n this._nextPositionLeft = undefined;\n this._nextPositionTails = undefined;\n this._nextPositionTail = undefined;\n this._animatingToNextPosition = undefined;\n }\n\n return !done;\n };\n\n private getGradientImageData(positions: {x: number, y: number}[]) {\n const id = this._hctx.createImageData(this._width, this._height);\n const pixels = id.data;\n\n let offset = 0;\n for(let y = 0; y < this._height; ++y) {\n const directPixelY = y / this._height;\n const centerDistanceY = directPixelY - 0.5;\n const centerDistanceY2 = centerDistanceY * centerDistanceY;\n\n for(let x = 0; x < this._width; ++x) {\n const directPixelX = x / this._width;\n\n const centerDistanceX = directPixelX - 0.5;\n const centerDistance = Math.sqrt(centerDistanceX * centerDistanceX + centerDistanceY2);\n\n const swirlFactor = 0.35 * centerDistance;\n const theta = swirlFactor * swirlFactor * 0.8 * 8.0;\n const sinTheta = Math.sin(theta);\n const cosTheta = Math.cos(theta);\n\n const pixelX = Math.max(0.0, Math.min(1.0, 0.5 + centerDistanceX * cosTheta - centerDistanceY * sinTheta));\n const pixelY = Math.max(0.0, Math.min(1.0, 0.5 + centerDistanceX * sinTheta + centerDistanceY * cosTheta));\n\n let distanceSum = 0.0;\n\n let r = 0.0;\n let g = 0.0;\n let b = 0.0;\n\n for(let i = 0; i < this._colors.length; i++) {\n const colorX = positions[i].x;\n const colorY = positions[i].y;\n\n const distanceX = pixelX - colorX;\n const distanceY = pixelY - colorY;\n\n let distance = Math.max(0.0, 0.9 - Math.sqrt(distanceX * distanceX + distanceY * distanceY));\n distance = distance * distance * distance * distance;\n distanceSum += distance;\n\n r += distance * this._colors[i].r / 255;\n g += distance * this._colors[i].g / 255;\n b += distance * this._colors[i].b / 255;\n }\n\n pixels[offset++] = r / distanceSum * 255.0;\n pixels[offset++] = g / distanceSum * 255.0;\n pixels[offset++] = b / distanceSum * 255.0;\n pixels[offset++] = 0xFF;\n }\n }\n return id;\n }\n\n private drawImageData(id: ImageData) {\n this._hctx.putImageData(id, 0, 0);\n this._ctx.drawImage(this._hc, 0, 0, this._width, this._height);\n }\n\n private drawGradient(positions: {x: number, y: number}[]) {\n this.drawImageData(this.getGradientImageData(positions));\n }\n\n // private doAnimate = () => {\n // const now = +Date.now();\n // if(!document.hasFocus() || (now - this._ts) < this._frametime) {\n // this._raf = requestAnimationFrame(this.doAnimate);\n // return;\n // }\n\n // this._ts = now;\n // this.changeTail(1);\n // const cur_pos = this.curPosition(this._phase, this._tail);\n // this.drawGradient(cur_pos);\n // this._raf = requestAnimationFrame(this.doAnimate);\n // };\n\n // public animate(start?: boolean) {\n // if(!start) {\n // cancelAnimationFrame(this._raf);\n // return;\n // }\n // this.doAnimate();\n // }\n\n public init(el: HTMLCanvasElement) {\n this._frames = [];\n this._phase = 0;\n this._tail = 0;\n this._scrollDelta = 0;\n if(this._onWheelRAF !== undefined) {\n cancelAnimationFrame(this._onWheelRAF);\n this._onWheelRAF = undefined;\n }\n\n const colors = el.getAttribute('data-colors').split(',').reverse();\n this._colors = colors.map((color) => {\n return this.hexToRgb(color);\n });\n\n if(!this._hc) {\n this._hc = document.createElement('canvas');\n this._hc.width = this._width;\n this._hc.height = this._height;\n this._hctx = this._hc.getContext('2d', {alpha: false});\n }\n\n this._canvas = el;\n this._ctx = this._canvas.getContext('2d', {alpha: false});\n this.update();\n }\n\n public update() {\n if(this._colors.length < 2) {\n const color = this._colors[0];\n this._ctx.fillStyle = `rgb(${color.r}, ${color.g}, ${color.b})`;\n this._ctx.fillRect(0, 0, this._width, this._height);\n return;\n }\n\n const pos = this.curPosition(this._phase, this._tail);\n this.drawGradient(pos);\n }\n\n public toNextPosition(getProgress?: () => number) {\n if(this._colors.length < 2) {\n return;\n }\n\n if(getProgress) {\n this._nextPositionLeft = this._tails + (this._nextPositionLeft ?? 0);\n this._nextPositionTails = this._nextPositionLeft;\n this._nextPositionTail = undefined;\n this._animatingToNextPosition = true;\n animateSingle(this.drawNextPositionAnimated.bind(this, getProgress), this);\n return;\n }\n\n const tail = this._tail;\n const tails = this._tails;\n\n let nextPhaseOnIdx: number;\n\n const curve: number[] = [];\n for(let i = 0, length = this._incrementalCurve.length; i < length; ++i) {\n const inc = this._incrementalCurve[i];\n let value = (curve[i - 1] ?? tail) + inc;\n\n if(+value.toFixed(2) > tails && nextPhaseOnIdx === undefined) {\n nextPhaseOnIdx = i;\n value %= tails;\n }\n\n curve.push(value);\n }\n\n const currentPhaseCurve = curve.slice(0, nextPhaseOnIdx);\n const nextPhaseCurve = nextPhaseOnIdx !== undefined ? curve.slice(nextPhaseOnIdx) : [];\n\n [currentPhaseCurve, nextPhaseCurve].forEach((curve, idx, curves) => {\n const last = curve[curve.length - 1];\n if(last !== undefined && last > tails) {\n curve[curve.length - 1] = +last.toFixed(2);\n }\n\n this._tail = last ?? 0;\n\n if(!curve.length) {\n return;\n }\n\n const positions = this.getNextPositions(this._phase, tails, curve);\n if(idx !== (curves.length - 1)) {\n if(++this._phase >= this._phases) {\n this._phase -= this._phases;\n }\n }\n\n const ids = positions.map((pos) => {\n return this.getGradientImageData(pos);\n });\n\n this._frames.push(...ids);\n });\n\n this._animatingToNextPosition = true;\n animateSingle(this.drawNextPositionAnimated, this);\n }\n\n // public toNextPositionThrottled = throttle(this.toNextPosition.bind(this), 100, true);\n\n public scrollAnimate(start?: boolean) {\n return;\n\n if(this._colors.length < 2 && start) {\n return;\n }\n\n if(start && !this._addedScrollListener) {\n document.addEventListener('wheel', this.onWheel);\n this._addedScrollListener = true;\n } else if(!start && this._addedScrollListener) {\n document.removeEventListener('wheel', this.onWheel);\n this._addedScrollListener = false;\n }\n }\n\n public cleanup() {\n this.scrollAnimate(false);\n // this.animate(false);\n }\n\n public static createCanvas(colors?: string) {\n const canvas = document.createElement('canvas');\n canvas.width = WIDTH;\n canvas.height = HEIGHT;\n if(colors !== undefined) {\n canvas.dataset.colors = colors;\n }\n\n return canvas;\n }\n\n public static create(colors?: string) {\n const canvas = this.createCanvas(colors);\n const gradientRenderer = new ChatBackgroundGradientRenderer();\n gradientRenderer.init(canvas);\n\n return {gradientRenderer, canvas};\n }\n}\n","export default function easeOutQuad(t: number, b: number, c: number, d: number) {\n return t >= d ? b + c : easeOutQuadApply(t / d, c) + b;\n}\n\nexport function easeOutQuadApply(v: number, c: number) {\n return -c * v * (v - 2);\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 {AppMessagesManager, MessagesStorageKey} 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 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 replaceContent from '../../helpers/dom/replaceContent';\nimport AppSearchSuper from '../appSearchSuper.';\nimport isInDOM from '../../helpers/dom/isInDOM';\nimport {randomLong} from '../../helpers/random';\nimport {attachClickEvent, AttachClickOptions} from '../../helpers/dom/clickEvent';\nimport findUpAsChild from '../../helpers/dom/findUpAsChild';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {attachContextMenuListener} from '../../helpers/dom/attachContextMenuListener';\nimport filterUnique from '../../helpers/array/filterUnique';\nimport appImManager from '../../lib/appManagers/appImManager';\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 extends EventListenerBase<{\n toggle: (isSelecting: boolean) => void\n}> {\n public selectedMids: Map> = new Map();\n public isSelecting = false;\n\n public selectedText: string;\n\n protected listenerSetter: ListenerSetter;\n protected isScheduled: boolean;\n protected listenElement: HTMLElement;\n\n protected onToggleSelection: (forwards: boolean, animate: boolean) => void | Promise;\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 protected managers: AppManagers;\n\n constructor(options: {\n managers: AppManagers,\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 super(false);\n\n safeAssign(this, options);\n\n this.navigationType = 'multiselect-' + randomLong() as any;\n }\n\n public attachListeners(listenElement: HTMLElement, listenerSetter: ListenerSetter) {\n if(this.listenElement) {\n this.listenerSetter.removeAll();\n }\n\n this.listenElement = listenElement;\n this.listenerSetter = listenerSetter;\n\n if(!listenElement) {\n return;\n }\n\n if(IS_TOUCH_SUPPORTED) {\n listenerSetter.add(listenElement)('touchend', () => {\n if(!this.isSelecting) return;\n this.selectedText = getSelectedText();\n });\n\n attachContextMenuListener({\n element: listenElement,\n callback: (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 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 },\n listenerSetter\n });\n\n return;\n }\n\n listenerSetter.add(listenElement)('mousedown', this.onMouseDown);\n }\n\n private onMouseDown = (e: MouseEvent) => {\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 return;\n }\n\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 = this.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 // 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 private 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 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 SetTransition({\n element,\n className: 'is-selected',\n forwards: false,\n duration: 200\n });\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 async updateContainer(forceSelection = false) {\n const size = this.selectedMids.size;\n if(!size && !forceSelection) return;\n\n let cantForward = !size,\n cantDelete = !size;\n const cantSend = !size;\n for(const [peerId, mids] of this.selectedMids) {\n const storageKey: MessagesStorageKey = `${peerId}_${this.isScheduled ? 'scheduled' : 'history'}`;\n const r = await this.managers.appMessagesManager.cantForwardDeleteMids(storageKey, Array.from(mids));\n cantForward = r.cantForward;\n cantDelete = r.cantDelete;\n\n if(cantForward && cantDelete) break;\n }\n\n 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 this.dispatchEvent('toggle', this.isSelecting);\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 const toggleResult = 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 (toggleResult || Promise.resolve()).then(() => this.updateContainer(forceSelection));\n }\n\n return true;\n }\n\n public cancelSelection = async(doNotAnimate?: boolean) => {\n if(doNotAnimate) this.doNotAnimate = true;\n this.onCancelSelection && await 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({\n element,\n className: 'is-selected',\n forwards: isSelected,\n duration: 200\n });\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, managers: AppManagers, listenerSetter: ListenerSetter) {\n super({\n managers,\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 this.attachListeners(searchSuper.container, listenerSetter);\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({\n element: this.searchSuper.navScrollableContainer,\n className: 'is-selecting',\n forwards,\n duration: animate ? 200 : 0,\n onTransitionEnd: () => {\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\n SetTransition({\n element: this.searchSuper.container,\n className: 'is-selecting',\n forwards,\n duration: 200\n });\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 attachClickEvent(btnCancel, () => this.cancelSelection(), {listenerSetter: this.listenerSetter, 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 appImManager.setInnerPeer({peerId, lastMsgId: mid});\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 private selectionLeft: HTMLDivElement;\n private selectionRight: HTMLDivElement;\n\n constructor(\n private chat: Chat,\n private bubbles: ChatBubbles,\n private input: ChatInput,\n managers: AppManagers\n ) {\n super({\n managers,\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 if(this.bubbles.skippedMids.has(+mid)) {\n continue;\n }\n\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): Promise => {\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.chat.peerId);\n if(set) {\n // const mids = await this.chat.getMidsByMid(mid);\n const mids = this.getMidsFromGroupContainer(bubble);\n mids.forEach((mid) => set.delete(mid));\n }\n }\n\n /* const promises = */this.bubbles.getBubbleGroupedItems(bubble).map(this.toggleByElement);\n // await Promise.all(promises);\n return;\n }\n\n if(!this.toggleMid(this.chat.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(groupContainer);\n\n const willChange = isGroupedMidsSelected || isGroupedSelected;\n if(willChange) {\n this.updateElementSelection(groupContainer, isGroupedMidsSelected);\n }\n }\n\n this.updateElementSelection(bubble, this.isMidSelected(this.chat.peerId, mid));\n };\n\n protected toggleByMid = async(peerId: PeerId, mid: number) => {\n const mounted = await 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));\n }\n\n protected isGroupedBubbleSelected(bubble: HTMLElement) {\n const groupedCheckboxInput = this.getCheckboxInputFromElement(bubble);\n return groupedCheckboxInput?.checked;\n }\n\n protected getMidsFromGroupContainer(groupContainer: HTMLElement) {\n const elements = this.chat.bubbles.getBubbleGroupedItems(groupContainer);\n if(!elements.length) {\n elements.push(groupContainer);\n }\n\n return elements.map((element) => +element.dataset.mid);\n }\n\n protected isGroupedMidsSelected(groupContainer: HTMLElement) {\n const mids = this.getMidsFromGroupContainer(groupContainer);\n const selectedMids = mids.filter((mid) => this.isMidSelected(this.chat.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-outgoing') &&\n !bubble.classList.contains('is-error') &&\n !bubble.classList.contains('bubble-first') &&\n !bubble.classList.contains('avoid-selection');\n }\n\n protected onToggleSelection = async(forwards: boolean, animate: boolean) => {\n const {needTranslateX, widthFrom, widthTo} = await this.chat.input.center(animate);\n\n SetTransition({\n element: this.listenElement,\n className: 'is-selecting',\n forwards,\n duration: animate ? 200 : 0,\n onTransitionEnd: () => {\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\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.chat.peerId, [...this.selectedMids.get(this.chat.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.chat.peerId, [...this.selectedMids.get(this.chat.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 && this.selectionDeleteBtn.toggleAttribute('disabled', cantDelete);\n };\n\n protected onCancelSelection = async() => {\n return;\n const promises: Promise[] = [];\n for(const [peerId, mids] of this.selectedMids) {\n for(const mid of mids) {\n promises.push(this.bubbles.getMountedBubble(mid).then((m) => m?.bubble));\n }\n }\n\n const bubbles = filterUnique((await Promise.all(promises)).filter(Boolean));\n bubbles.forEach((bubble) => {\n this.toggleByElement(bubble);\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 getSelectedText(): string {\n if(window.getSelection) {\n return window.getSelection().toString();\n // @ts-ignore\n } else if(document.selection) {\n // @ts-ignore\n return document.selection.createRange().text;\n }\n\n return '';\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 ListenerSetter from '../helpers/listenerSetter';\nimport ripple from './ripple';\nimport {LangPackKey, _i18n} from '../lib/langPack';\nimport getDeepProperty from '../helpers/object/getDeepProperty';\nimport rootScope from '../lib/rootScope';\nimport apiManagerProxy from '../lib/mtproto/mtprotoworker';\n\nexport type CheckboxFieldOptions = {\n text?: LangPackKey,\n textArgs?: any[],\n name?: string,\n round?: boolean,\n toggle?: boolean,\n stateKey?: string,\n stateValues?: any[],\n disabled?: boolean,\n checked?: boolean,\n restriction?: boolean,\n withRipple?: boolean,\n withHover?: boolean,\n listenerSetter?: ListenerSetter\n};\nexport default class CheckboxField {\n public input: HTMLInputElement;\n public label: HTMLLabelElement;\n public span: HTMLSpanElement;\n public listenerSetter: ListenerSetter;\n\n constructor(options: CheckboxFieldOptions = {}) {\n const label = this.label = document.createElement('label');\n label.classList.add('checkbox-field');\n\n if(options.restriction) {\n label.classList.add('checkbox-field-restriction');\n }\n\n if(options.round) {\n label.classList.add('checkbox-field-round');\n }\n\n if(options.disabled) {\n this.toggleDisability(true);\n }\n\n this.listenerSetter = options.listenerSetter;\n\n const input = this.input = document.createElement('input');\n input.classList.add('checkbox-field-input');\n input.type = 'checkbox';\n if(options.name) {\n input.id = 'input-' + options.name;\n }\n\n if(options.checked) {\n input.checked = true;\n }\n\n if(options.stateKey) {\n let loaded = false;\n const onChange = () => {\n if(!loaded) {\n return;\n }\n\n let value: any;\n if(options.stateValues) {\n value = options.stateValues[input.checked ? 1 : 0];\n } else {\n value = input.checked;\n }\n\n rootScope.managers.appStateManager.setByKey(options.stateKey, value);\n };\n\n apiManagerProxy.getState().then((state) => {\n loaded = true;\n const stateValue = getDeepProperty(state, options.stateKey);\n let checked: boolean;\n if(options.stateValues) {\n checked = options.stateValues.indexOf(stateValue) === 1;\n } else {\n checked = stateValue;\n }\n\n this.setValueSilently(checked);\n });\n\n if(options.listenerSetter) options.listenerSetter.add(input)('change', onChange);\n else input.addEventListener('change', onChange);\n }\n\n let span: HTMLSpanElement;\n if(options.text) {\n span = this.span = document.createElement('span');\n span.classList.add('checkbox-caption');\n _i18n(span, options.text, options.textArgs);\n } else {\n label.classList.add('checkbox-without-caption');\n }\n\n label.append(input);\n\n if(options.toggle) {\n label.classList.add('checkbox-field-toggle');\n\n const toggle = document.createElement('div');\n toggle.classList.add('checkbox-toggle');\n label.append(toggle);\n } else {\n const box = document.createElement('div');\n box.classList.add('checkbox-box');\n\n const checkSvg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n checkSvg.classList.add('checkbox-box-check');\n checkSvg.setAttributeNS(null, 'viewBox', '0 0 24 24');\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use.setAttributeNS(null, 'href', '#check');\n use.setAttributeNS(null, 'x', '-1');\n checkSvg.append(use);\n\n const bg = document.createElement('div');\n bg.classList.add('checkbox-box-background');\n\n const border = document.createElement('div');\n border.classList.add('checkbox-box-border');\n\n box.append(border, bg, checkSvg);\n\n label.append(box);\n }\n\n if(span) {\n label.append(span);\n }\n\n if(options.withRipple) {\n label.classList.add('checkbox-ripple', 'hover-effect');\n ripple(label, undefined, undefined, true);\n // label.prepend(input);\n } else if(options.withHover) {\n label.classList.add('hover-effect');\n }\n }\n\n get checked() {\n return this.input.checked;\n }\n\n set checked(checked: boolean) {\n /* if(this.checked === checked) {\n return;\n } */\n\n this.setValueSilently(checked);\n\n const event = new Event('change', {bubbles: true, cancelable: true});\n this.input.dispatchEvent(event);\n }\n\n public setValueSilently(checked: boolean) {\n this.input.checked = checked;\n }\n\n public toggleDisability(disable: boolean) {\n this.label.classList.toggle('checkbox-disabled', disable);\n return () => this.toggleDisability(!disable);\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 InputField, {InputFieldOptions} from './inputField';\n\nexport default class CodeInputField extends InputField {\n constructor(public options: InputFieldOptions & {\n length: number,\n onFill: (code: string) => void\n }) {\n super(Object.assign(options, {\n plainText: true\n }));\n\n const input = this.input as HTMLInputElement;\n input.type = 'tel';\n input.setAttribute('required', '');\n input.autocomplete = 'off';\n\n let lastLength = 0;\n this.input.addEventListener('input', (e) => {\n this.input.classList.remove('error');\n this.setLabel();\n\n const value = this.value.replace(/\\D/g, '').slice(0, options.length);\n this.setValueSilently(value);\n\n const length = this.value.length;\n if(length === options.length) { // submit code\n options.onFill(this.value);\n } else if(length === lastLength) {\n return;\n }\n\n lastLength = length;\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 {addCancelButton} from './popups';\nimport PopupPeer, {PopupPeerCheckboxOptions, PopupPeerOptions} from './popups/peer';\n\n// type PopupConfirmationOptions = Pick;\nexport type PopupConfirmationOptions = PopupPeerOptions & {\n button: PopupPeerOptions['buttons'][0],\n checkbox?: PopupPeerOptions['checkboxes'][0]\n};\n\nexport default function confirmationPopup(\n options: T\n): Promise : (T['checkbox'] extends PopupPeerCheckboxOptions ? boolean : void)> {\n return new Promise((resolve, reject) => {\n const {button, checkbox} = options;\n button.callback = (set) => {\n if(checkbox || !set) {\n resolve(set ? !!set.size : undefined);\n } else {\n resolve(options.checkboxes.map((checkbox) => set.has(checkbox.text)));\n }\n };\n\n const buttons = addCancelButton(options.buttons || [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","/*\n * 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_EMOJI_SUPPORTED from '../environment/emojiSupport';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport findUpTag from '../helpers/dom/findUpTag';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport fastSmoothScroll from '../helpers/fastSmoothScroll';\nimport {randomLong} from '../helpers/random';\nimport {HelpCountry, HelpCountryCode} from '../layer';\nimport I18n, {i18n} from '../lib/langPack';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport rootScope from '../lib/rootScope';\nimport {getCountryEmoji} from '../vendor/emoji';\nimport InputField, {InputFieldOptions} from './inputField';\nimport Scrollable from './scrollable';\n\nlet countries: HelpCountry.helpCountry[];\nconst setCountries = () => {\n countries = I18n.countriesList\n .filter((country) => !country.pFlags?.hidden)\n .sort((a, b) => (a.name || a.default_name).localeCompare(b.name || b.default_name));\n};\n\nlet init = () => {\n setCountries();\n rootScope.addEventListener('language_change', () => {\n setCountries();\n });\n};\n\nconst VIRTUAL_COUNTRIES = new Set(['FT']);\n\nexport default class CountryInputField extends InputField {\n private lastCountrySelected: HelpCountry;\n private lastCountryCodeSelected: HelpCountryCode;\n\n private hideTimeout: number;\n private selectWrapper: HTMLElement;\n\n private liMap: Map;\n\n constructor(public options: InputFieldOptions & {\n onCountryChange?: (country: HelpCountry.helpCountry, code: HelpCountryCode.helpCountryCode) => void,\n noPhoneCodes?: boolean\n } = {}) {\n super({\n label: 'Country',\n name: randomLong(),\n ...options\n });\n\n if(init) {\n init();\n init = undefined;\n }\n\n this.liMap = new Map();\n\n this.container.classList.add('input-select');\n\n const selectWrapper = this.selectWrapper = document.createElement('div');\n selectWrapper.classList.add('select-wrapper', 'z-depth-3', 'hide');\n\n const arrowDown = document.createElement('span');\n arrowDown.classList.add('arrow', 'arrow-down');\n this.container.append(arrowDown);\n\n const selectList = document.createElement('ul');\n selectWrapper.appendChild(selectList);\n\n const scroll = new Scrollable(selectWrapper);\n\n let initSelect = () => {\n initSelect = null;\n\n countries.forEach((c) => {\n if(options.noPhoneCodes && VIRTUAL_COUNTRIES.has(c.iso2)) {\n return;\n }\n\n const emoji = getCountryEmoji(c.iso2);\n\n const liArr: Array = [];\n for(let i = 0, length = Math.min(c.country_codes.length, options.noPhoneCodes ? 1 : Infinity); i < length; ++i) {\n const countryCode = c.country_codes[i];\n const li = document.createElement('li');\n\n const wrapped = wrapEmojiText(emoji);\n if(IS_EMOJI_SUPPORTED) {\n const spanEmoji = document.createElement('span');\n setInnerHTML(spanEmoji, wrapped);\n li.append(spanEmoji);\n } else {\n setInnerHTML(li, wrapped);\n }\n\n const el = i18n(c.default_name as any);\n el.dataset.defaultName = c.default_name;\n li.append(el);\n\n if(!options.noPhoneCodes) {\n const span = document.createElement('span');\n span.classList.add('phone-code');\n span.innerText = '+' + countryCode.country_code;\n li.appendChild(span);\n }\n\n liArr.push(li);\n selectList.append(li);\n }\n\n this.liMap.set(c.iso2, liArr);\n });\n\n selectList.addEventListener('mousedown', (e) => {\n if(e.button !== 0) { // other buttons but left shall not pass\n return;\n }\n\n const target = findUpTag(e.target, 'LI')\n this.selectCountryByTarget(target);\n // console.log('clicked', e, countryName, phoneCode);\n });\n\n this.container.appendChild(selectWrapper);\n };\n\n initSelect();\n\n this.input.addEventListener('focus', (e) => {\n if(initSelect) {\n initSelect();\n } else {\n countries.forEach((c) => {\n const arr = this.liMap.get(c.iso2);\n if(!arr) return;\n arr.forEach((li) => li.style.display = '');\n });\n }\n\n clearTimeout(this.hideTimeout);\n this.hideTimeout = undefined;\n\n selectWrapper.classList.remove('hide');\n void selectWrapper.offsetWidth; // reflow\n selectWrapper.classList.add('active');\n\n this.select();\n\n fastSmoothScroll({\n // container: page.pageEl.parentElement.parentElement,\n container: findUpClassName(this.container, 'scrollable-y'),\n element: this.input,\n position: 'start',\n margin: 4\n });\n\n setTimeout(() => {\n if(!mouseDownHandlerAttached) {\n document.addEventListener('mousedown', onMouseDown, {capture: true});\n mouseDownHandlerAttached = true;\n }\n }, 0);\n });\n\n let mouseDownHandlerAttached = false;\n const onMouseDown = (e: MouseEvent) => {\n if(findUpClassName(e.target, 'input-select')) {\n return;\n }\n if(e.target === this.input) {\n return;\n }\n\n this.hidePicker();\n document.removeEventListener('mousedown', onMouseDown, {capture: true});\n mouseDownHandlerAttached = false;\n };\n\n /* false && this.input.addEventListener('blur', function(this: typeof this.input, e) {\n hidePicker();\n\n e.cancelBubble = true;\n }, {capture: true}); */\n\n const onKeyPress = (e: KeyboardEvent) => {\n const key = e.key;\n if(e.ctrlKey || key === 'Control') return false;\n\n // let i = new RegExp('^' + this.value, 'i');\n const _value = this.value.toLowerCase();\n const matches: HelpCountry[] = [];\n countries.forEach((c) => {\n const arr = this.liMap.get(c.iso2);\n if(!arr) {\n return;\n }\n\n const names = [\n c.name,\n c.default_name,\n c.iso2\n ];\n\n names.filter(Boolean).forEach((name) => {\n const abbr = name.split(' ').filter((word) => /\\w/.test(word)).map((word) => word[0]).join('');\n if(abbr.length > 1) {\n names.push(abbr);\n }\n });\n\n const good = !!names.filter(Boolean).find((str) => str.toLowerCase().indexOf(_value) !== -1)/* === 0 */;// i.test(c.name);\n\n arr.forEach((li) => li.style.display = good ? '' : 'none');\n if(good) matches.push(c);\n });\n\n // ะšะพะด ะฝะธะถะต ะฐะฒั‚ะพะผะฐั‚ะธั‡ะตัะบะธ ะฒั‹ะฑะตั€ะตั‚ ัั‚ั€ะฐะฝัƒ ะตัะปะธ ะพะฝะฐ ะพัั‚ะฐะปะฐััŒ ะพะดะฝะฐ ะฟั€ะธ ะฟะพะธัะบะต\n /* if(matches.length === 1 && matches[0].li.length === 1) {\n if(matches[0].name === lastCountrySelected) return false;\n //console.log('clicking', matches[0]);\n\n var clickEvent = document.createEvent('MouseEvents');\n clickEvent.initEvent('mousedown', true, true);\n matches[0].li[0].dispatchEvent(clickEvent);\n return false;\n } else */if(matches.length === 0) {\n countries.forEach((c) => {\n const arr = this.liMap.get(c.iso2);\n if(!arr) {\n return;\n }\n\n arr.forEach((li) => li.style.display = '');\n });\n } else if(matches.length === 1 && key === 'Enter') {\n cancelEvent(e);\n this.selectCountryByTarget(this.liMap.get(matches[0].iso2)[0]);\n }\n };\n\n this.input.addEventListener('keyup', onKeyPress);\n this.input.addEventListener('keydown', (e) => {\n if(e.key === 'Enter') {\n onKeyPress(e);\n }\n });\n\n arrowDown.addEventListener('mousedown', (e) => {\n if(this.input.matches(':focus')) {\n this.hidePicker();\n this.input.blur();\n } else {\n e.cancelBubble = true;\n e.preventDefault();\n this.input.focus();\n }\n });\n }\n\n public getSelected() {\n return {country: this.lastCountrySelected, code: this.lastCountryCodeSelected};\n }\n\n public hidePicker = () => {\n if(this.hideTimeout !== undefined) return;\n this.selectWrapper.classList.remove('active');\n this.hideTimeout = window.setTimeout(() => {\n this.selectWrapper.classList.add('hide');\n this.hideTimeout = undefined;\n }, 200);\n }\n\n public selectCountryByTarget = (target: HTMLElement) => {\n const defaultName = target.querySelector('[data-default-name]').dataset.defaultName;\n const phoneCodeEl = target.querySelector('.phone-code');\n const phoneCode = phoneCodeEl?.innerText;\n const countryCode = phoneCode && phoneCode.replace(/\\D/g, '');\n\n replaceContent(this.input, i18n(defaultName as any));\n this.simulateInputEvent();\n this.lastCountrySelected = countries.find((c) => c.default_name === defaultName);\n this.lastCountryCodeSelected = countryCode && this.lastCountrySelected.country_codes.find((_countryCode) => _countryCode.country_code === countryCode);\n\n this.options.onCountryChange?.(this.lastCountrySelected, this.lastCountryCodeSelected);\n this.hidePicker();\n }\n\n public selectCountryByIso2(iso2: string) {\n this.selectCountryByTarget(this.liMap.get(iso2)[0]);\n }\n\n public override(country: HelpCountry, code: HelpCountryCode, countryName?: string) {\n replaceContent(this.input, country ? i18n(country.default_name as any) : countryName);\n this.lastCountrySelected = country;\n this.lastCountryCodeSelected = code;\n this.options.onCountryChange?.(this.lastCountrySelected, this.lastCountryCodeSelected);\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_MOBILE} from '../environment/userAgent';\nimport {animate} from '../helpers/animation';\nimport {Middleware} from '../helpers/middleware';\nimport clamp from '../helpers/number/clamp';\nimport animationIntersector, {AnimationItemGroup, AnimationItemWrapper} from './animationIntersector';\n\ntype DotRendererDot = {\n x: number,\n y: number,\n opacity: number,\n radius: number\n mOpacity: number,\n adding: boolean,\n counter: number,\n path: Path2D\n};\nexport default class DotRenderer implements AnimationItemWrapper {\n public canvas: HTMLCanvasElement;\n private context: CanvasRenderingContext2D;\n private dots: DotRendererDot[];\n\n public paused: boolean;\n public autoplay: boolean;\n public tempId: number;\n\n private dpr: number;\n\n constructor(\n private width: number,\n private height: number,\n private multiply?: number\n ) {\n const canvas = this.canvas = document.createElement('canvas');\n const dpr = this.dpr = window.devicePixelRatio;\n canvas.width = width * dpr;\n canvas.height = height * dpr;\n canvas.classList.add('canvas-thumbnail', 'canvas-dots');\n\n this.paused = true;\n this.autoplay = true;\n this.tempId = 0;\n this.context = canvas.getContext('2d');\n }\n\n private prepare() {\n let count = Math.round(this.width * this.height / (35 * (IS_MOBILE ? 2 : 1)));\n count *= this.multiply || 1;\n count = Math.min(IS_MOBILE ? 1000 : 2200, count);\n count = Math.round(count);\n const dots: DotRendererDot[] = this.dots = new Array(count);\n\n for(let i = 0; i < count; ++i) {\n dots[i] = this.generateDot();\n }\n }\n\n private generateDot(adding?: boolean): DotRendererDot {\n const x = Math.floor(Math.random() * this.canvas.width);\n const y = Math.floor(Math.random() * this.canvas.height);\n const opacity = adding ? 0 : Math.random();\n const radius = (Math.random() >= .8 ? 1 : 0.5) * this.dpr;\n const path = new Path2D();\n path.arc(x, y, radius, 0, 2 * Math.PI, false);\n return {\n x,\n y,\n opacity,\n radius,\n mOpacity: opacity,\n adding: adding ?? Math.random() >= .5,\n counter: 0,\n path\n };\n }\n\n private draw() {\n const {context, canvas, dots} = this;\n context.clearRect(0, 0, canvas.width, canvas.height);\n context.fillStyle = '#fff';\n\n const add = 0.02;\n for(let i = 0, length = dots.length; i < length; ++i) {\n const dot = dots[i];\n const addOpacity = dot.adding ? add : -add;\n\n dot.mOpacity += addOpacity;\n // if(dot.mOpacity <= 0) dot.mOpacity = dot.opacity;\n\n // const easedOpacity = easing(dot.mOpacity);\n const easedOpacity = clamp(dot.mOpacity, 0, 1);\n context.globalAlpha = easedOpacity;\n context.fill(dot.path);\n\n if(dot.mOpacity <= 0) {\n dot.adding = true;\n\n if(++dot.counter >= 1) {\n dots[i] = this.generateDot(dot.adding);\n }\n } else if(dot.mOpacity >= 1) {\n dot.adding = false;\n }\n }\n }\n\n public remove() {\n this.pause();\n }\n\n public pause() {\n if(this.paused) {\n return;\n }\n\n this.paused = true;\n ++this.tempId;\n }\n\n public renderFirstFrame() {\n if(!this.dots) {\n this.prepare();\n }\n\n this.draw();\n }\n\n public play() {\n if(!this.paused) {\n return;\n }\n\n this.paused = false;\n const tempId = ++this.tempId;\n\n if(!this.dots) {\n this.prepare();\n }\n\n animate(() => {\n if(this.tempId !== tempId || this.paused) {\n return false;\n }\n\n this.draw();\n return true;\n });\n }\n\n public static create({\n width,\n height,\n middleware,\n animationGroup,\n multiply\n }: {\n width: number,\n height: number,\n middleware: Middleware,\n animationGroup: AnimationItemGroup,\n multiply?: number\n }) {\n const dotRenderer = new DotRenderer(width, height, multiply);\n dotRenderer.renderFirstFrame();\n\n animationIntersector.addAnimation(dotRenderer, animationGroup, dotRenderer.canvas, middleware);\n\n return dotRenderer;\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 {InputFile} from '../layer';\nimport AvatarEdit from './avatarEdit';\nimport AvatarElement from './avatar';\nimport InputField from './inputField';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport ButtonCorner from './buttonCorner';\nimport safeAssign from '../helpers/object/safeAssign';\nimport {NULL_PEER_ID} from '../lib/mtproto/mtproto_config';\n\nexport default class EditPeer {\n public nextBtn: HTMLButtonElement;\n\n public uploadAvatar: () => Promise;\n public avatarEdit: AvatarEdit;\n public avatarElem: AvatarElement;\n\n private inputFields: InputField[];\n private listenerSetter: ListenerSetter;\n\n private peerId: PeerId;\n\n private _disabled = false;\n private avatarSize = 120;\n\n constructor(options: {\n peerId?: EditPeer['peerId'],\n inputFields: EditPeer['inputFields'],\n listenerSetter: ListenerSetter,\n doNotEditAvatar?: boolean,\n withoutAvatar?: boolean,\n nextBtn?: HTMLButtonElement,\n avatarSize?: number,\n popupOptions?: ConstructorParameters[1]\n }) {\n safeAssign(this, options);\n\n this.peerId ||= NULL_PEER_ID;\n\n if(!this.nextBtn) {\n this.nextBtn = ButtonCorner({icon: 'check'});\n } else if(!this.nextBtn.classList.contains('btn-corner')) {\n this.handleChange = () => {\n this.nextBtn.toggleAttribute('disabled', !this.isChanged() || this.disabled);\n };\n }\n\n if(!options.withoutAvatar) {\n this.avatarElem = new AvatarElement();\n this.avatarElem.classList.add('avatar-placeholder', 'avatar-' + this.avatarSize);\n this.avatarElem.updateWithOptions({peerId: this.peerId});\n\n if(!options.doNotEditAvatar) {\n this.avatarEdit = new AvatarEdit((_upload) => {\n this.uploadAvatar = _upload;\n this.handleChange();\n this.avatarElem.remove();\n }, options.popupOptions);\n\n this.avatarEdit.container.append(this.avatarElem);\n }\n }\n\n this.inputFields.forEach((inputField) => {\n this.listenerSetter.add(inputField.input)('input', this.handleChange);\n });\n\n this.handleChange();\n }\n\n public get disabled() {\n return this._disabled;\n }\n\n public set disabled(value) {\n this._disabled = value;\n this.inputFields.forEach((inputField) => inputField.input.toggleAttribute('disabled', value));\n this.handleChange();\n }\n\n public lockWithPromise(promise: Promise, unlockOnSuccess = false) {\n this.disabled = true;\n promise.then(() => {\n if(unlockOnSuccess) {\n this.disabled = false;\n }\n }, () => {\n this.disabled = false;\n });\n }\n\n public isChanged = () => {\n if(this.uploadAvatar) {\n return true;\n }\n\n let changedLength = 0, requiredLength = 0, requiredValidLength = 0;\n this.inputFields.forEach((inputField) => {\n if(inputField.isValid()) {\n if(inputField.isChanged()) {\n ++changedLength;\n }\n\n if(inputField.required) {\n ++requiredValidLength;\n }\n }\n\n if(inputField.required) {\n ++requiredLength;\n }\n });\n\n return requiredLength === requiredValidLength && changedLength > 0;\n };\n\n public handleChange = () => {\n this.nextBtn.classList.toggle('is-visible', this.isChanged());\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 emoticonsDropdown, {EmoticonsDropdown, EmoticonsTab, EMOTICONSSTICKERGROUP} from '..';\nimport GifsMasonry from '../../gifsMasonry';\nimport Scrollable from '../../scrollable';\nimport {putPreloader} from '../../putPreloader';\nimport {AppManagers} from '../../../lib/appManagers/managers';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\n\nexport default class GifsTab implements EmoticonsTab {\n public content: HTMLElement;\n public scrollable: Scrollable;\n public tabId: number;\n\n constructor(private managers: AppManagers) {\n\n }\n\n init() {\n this.content = document.getElementById('content-gifs');\n const gifsContainer = this.content.firstElementChild as HTMLDivElement;\n attachClickEvent(gifsContainer, EmoticonsDropdown.onMediaClick);\n\n const scroll = this.scrollable = new Scrollable(this.content, 'GIFS');\n const masonry = new GifsMasonry(gifsContainer, EMOTICONSSTICKERGROUP, scroll);\n const preloader = putPreloader(this.content, true);\n\n this.managers.appDocsManager.getGifs().then((docs) => {\n docs.forEach((doc) => {\n masonry.add(doc);\n });\n\n preloader.remove();\n });\n\n emoticonsDropdown.addLazyLoadQueueRepeat(masonry.lazyLoadQueue, masonry.processInvisibleDiv);\n\n this.init = null;\n }\n\n onClose() {\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 {MyDocument} from '../../../lib/appManagers/appDocsManager';\nimport {SliderSuperTab} from '../../slider';\nimport InputSearch from '../../inputSearch';\nimport animationIntersector, {AnimationItemGroup} from '../../animationIntersector';\nimport appSidebarRight from '..';\nimport {AppInlineBotsManager} from '../../../lib/appManagers/appInlineBotsManager';\nimport GifsMasonry from '../../gifsMasonry';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport mediaSizes from '../../../helpers/mediaSizes';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport {NULL_PEER_ID} from '../../../lib/mtproto/mtproto_config';\n\nconst ANIMATIONGROUP: AnimationItemGroup = 'GIFS-SEARCH';\n\nexport default class AppGifsTab extends SliderSuperTab {\n private inputSearch: InputSearch;\n private gifsDiv: HTMLDivElement;\n\n private nextOffset = '';\n private loadedAll = false;\n\n private gifBotPeerId: PeerId;\n private masonry: GifsMasonry;\n\n private searchPromise: ReturnType;\n\n public init() {\n this.container.id = 'search-gifs-container';\n\n this.inputSearch = new InputSearch('SearchGifsTitle', (value) => {\n this.reset();\n this.search(value);\n });\n\n this.title.replaceWith(this.inputSearch.container);\n\n this.gifsDiv = document.createElement('div');\n this.gifsDiv.classList.add('gifs-masonry');\n attachClickEvent(this.gifsDiv, this.onGifsClick, {listenerSetter: this.listenerSetter});\n\n this.scrollable.append(this.gifsDiv);\n\n this.masonry = new GifsMasonry(this.gifsDiv, ANIMATIONGROUP, this.scrollable);\n // this.backBtn.parentElement.append(this.inputSearch.container);\n\n appSidebarRight.toggleSidebar(true).then(() => {\n this.search('', true);\n\n this.scrollable.onScrolledBottom = () => {\n this.search(this.inputSearch.value, false);\n };\n });\n }\n\n private onGifsClick = async(e: MouseEvent | TouchEvent) => {\n const target = findUpClassName(e.target, 'gif');\n if(!target) return;\n\n const fileId = target.dataset.docId;\n if(await appImManager.chat.input.sendMessageWithDocument(fileId)) {\n if(mediaSizes.isMobile) {\n appSidebarRight.onCloseBtnClick();\n }\n } else {\n console.warn('got no doc by id:', fileId);\n }\n };\n\n public onClose() {\n this.scrollable.onScrolledBottom = () => {};\n }\n\n public onCloseAfterTimeout() {\n this.reset();\n this.gifsDiv.innerHTML = '';\n animationIntersector.checkAnimations(undefined, ANIMATIONGROUP);\n this.inputSearch.remove();\n return super.onCloseAfterTimeout();\n }\n\n private reset() {\n this.searchPromise = null;\n this.nextOffset = '';\n this.loadedAll = false;\n this.masonry.clear();\n }\n\n public async search(query: string, newSearch = true) {\n if(this.searchPromise || this.loadedAll) return;\n\n if(!this.gifBotPeerId) {\n this.gifBotPeerId = (await this.managers.appUsersManager.resolveUsername('gif')).id.toPeerId(false);\n }\n\n try {\n this.searchPromise = this.managers.appInlineBotsManager.getInlineResults(NULL_PEER_ID, this.gifBotPeerId, query, this.nextOffset);\n const {results, next_offset} = await this.searchPromise;\n\n if(this.inputSearch.value !== query) {\n return;\n }\n\n this.searchPromise = null;\n this.nextOffset = next_offset;\n if(newSearch) {\n this.gifsDiv.innerHTML = '';\n }\n\n if(results.length) {\n results.forEach((result) => {\n if(result._ === 'botInlineMediaResult' && result.document) {\n this.masonry.add(result.document as MyDocument);\n }\n });\n } else {\n this.loadedAll = true;\n }\n\n this.scrollable.onScroll();\n } catch(err) {\n this.searchPromise = null;\n console.error('gifs loading error:', err);\n throw err;\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 {SliderSuperTab} from '../../slider';\nimport InputSearch from '../../inputSearch';\nimport LazyLoadQueue from '../../lazyLoadQueue';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport PopupStickers from '../../popups/stickers';\nimport animationIntersector from '../../animationIntersector';\nimport appSidebarRight from '..';\nimport {StickerSet, StickerSetCovered} from '../../../layer';\nimport {i18n} from '../../../lib/langPack';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport forEachReverse from '../../../helpers/array/forEachReverse';\nimport setInnerHTML from '../../../helpers/dom/setInnerHTML';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport attachStickerViewerListeners from '../../stickerViewer';\nimport wrapSticker from '../../wrappers/sticker';\n\nexport default class AppStickersTab extends SliderSuperTab {\n private inputSearch: InputSearch;\n private setsDiv: HTMLDivElement;\n private lazyLoadQueue: LazyLoadQueue;\n\n public init() {\n this.container.id = 'stickers-container';\n this.container.classList.add('chatlist-container');\n\n this.lazyLoadQueue = new LazyLoadQueue();\n\n this.inputSearch = new InputSearch('StickersTab.SearchPlaceholder', (value) => {\n this.search(value);\n });\n\n this.title.replaceWith(this.inputSearch.container);\n\n this.setsDiv = document.createElement('div');\n this.setsDiv.classList.add('sticker-sets');\n this.scrollable.append(this.setsDiv);\n\n attachStickerViewerListeners({listenTo: this.setsDiv, listenerSetter: this.listenerSetter});\n\n attachClickEvent(this.setsDiv, (e) => {\n const sticker = findUpClassName(e.target, 'sticker-set-sticker');\n if(sticker) {\n const docId = sticker.dataset.docId;\n appImManager.chat.input.sendMessageWithDocument(docId);\n return;\n }\n\n const target = findUpClassName(e.target, 'sticker-set');\n if(!target) return;\n\n const id = target.dataset.stickerSet as string;\n const access_hash = target.dataset.access_hash as string;\n\n const button = findUpClassName(e.target, 'sticker-set-button') as HTMLElement;\n if(button) {\n e.preventDefault();\n e.cancelBubble = true;\n\n button.setAttribute('disabled', 'true');\n\n this.managers.appStickersManager.getStickerSet({id, access_hash}).then((full) => {\n this.managers.appStickersManager.toggleStickerSet(full.set).then((changed) => {\n if(changed) {\n button.textContent = '';\n button.append(i18n(full.set.installed_date ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\n button.classList.toggle('gray', !!full.set.installed_date);\n }\n }).finally(() => {\n // button.style.width = set.installed_date ? '68px' : '52px';\n button.removeAttribute('disabled');\n });\n });\n } else {\n this.managers.appStickersManager.getStickerSet({id, access_hash}).then((full) => {\n new PopupStickers(full.set).show();\n });\n }\n }, {listenerSetter: this.listenerSetter});\n\n appSidebarRight.toggleSidebar(true).then(() => {\n this.renderFeatured();\n });\n }\n\n public onCloseAfterTimeout() {\n this.setsDiv.innerHTML = '';\n animationIntersector.checkAnimations(undefined, 'STICKERS-SEARCH');\n return super.onCloseAfterTimeout();\n }\n\n public renderSet(set: StickerSet.stickerSet) {\n // console.log('renderSet:', set);\n const div = document.createElement('div');\n div.classList.add('sticker-set');\n\n const header = document.createElement('div');\n header.classList.add('sticker-set-header');\n\n const details = document.createElement('div');\n details.classList.add('sticker-set-details');\n details.innerHTML = `
`;\n\n setInnerHTML(details.firstElementChild, wrapEmojiText(set.title));\n\n const countDiv = document.createElement('div');\n countDiv.classList.add('sticker-set-count');\n countDiv.append(i18n('Stickers', [set.count]));\n details.append(countDiv);\n\n const button = document.createElement('button');\n button.classList.add('btn-primary', 'btn-color-primary', 'sticker-set-button');\n button.append(i18n(set.installed_date ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\n // button.style.width = set.installed_date ? '68px' : '52px';\n\n if(set.installed_date) {\n button.classList.add('gray');\n }\n\n // ripple(button);\n\n header.append(details, button);\n\n const stickersDiv = document.createElement('div');\n stickersDiv.classList.add('sticker-set-stickers');\n\n const count = Math.min(5, set.count);\n for(let i = 0; i < count; ++i) {\n const stickerDiv = document.createElement('div');\n stickerDiv.classList.add('sticker-set-sticker');\n\n stickersDiv.append(stickerDiv);\n }\n\n this.managers.appStickersManager.getStickerSet(set).then((set) => {\n // console.log('renderSet got set:', set);\n\n for(let i = 0; i < count; ++i) {\n const div = stickersDiv.children[i] as HTMLDivElement;\n const doc = set.documents[i];\n if(doc._ === 'documentEmpty') {\n continue;\n }\n\n wrapSticker({\n doc,\n div,\n lazyLoadQueue: this.lazyLoadQueue,\n group: 'STICKERS-SEARCH',\n /* play: false,\n loop: false, */\n play: true,\n loop: true,\n width: 68,\n height: 68,\n withLock: true\n });\n }\n });\n\n /* const onMouseOver = () => {\n const animations: AnimationItem['animation'][] = [];\n for(let i = 0; i < count; ++i) {\n const stickerDiv = stickersDiv.children[i] as HTMLElement;\n const animationItem = animationIntersector.getAnimation(stickerDiv);\n if(!animationItem) continue;\n\n const animation = animationItem.animation;\n\n animations.push(animation);\n animation.loop = true;\n animation.play();\n }\n\n div.addEventListener('mouseout', () => {\n animations.forEach((animation) => {\n animation.loop = false;\n });\n\n div.addEventListener('mouseover', onMouseOver, {once: true});\n }, {once: true});\n };\n\n div.addEventListener('mouseover', onMouseOver, {once: true}); */\n\n div.dataset.stickerSet = '' + set.id;\n div.dataset.access_hash = '' + set.access_hash;\n div.dataset.title = set.title;\n\n div.append(header, stickersDiv);\n\n this.setsDiv.append(div);\n }\n\n public renderFeatured() {\n return this.managers.appStickersManager.getFeaturedStickers().then((coveredSets) => {\n if(this.inputSearch.value) {\n return;\n }\n\n coveredSets = this.filterRendered('', coveredSets);\n coveredSets.forEach((set) => {\n this.renderSet(set.set);\n });\n });\n }\n\n private filterRendered(query: string, coveredSets: StickerSetCovered[]) {\n coveredSets = coveredSets.slice();\n\n const children = Array.from(this.setsDiv.children) as HTMLElement[];\n forEachReverse(children, el => {\n const id = el.dataset.stickerSet;\n const index = coveredSets.findIndex((covered) => covered.set.id === id);\n\n if(index !== -1) {\n coveredSets.splice(index, 1);\n } else if(!query || !el.dataset.title.toLowerCase().includes(query.toLowerCase())) {\n el.remove();\n }\n });\n\n animationIntersector.checkAnimations(undefined, 'STICKERS-SEARCH');\n\n return coveredSets;\n }\n\n public search(query: string) {\n if(!query) {\n return this.renderFeatured();\n }\n\n return this.managers.appStickersManager.searchStickerSets(query, false).then((coveredSets) => {\n if(this.inputSearch.value !== query) {\n return;\n }\n\n // console.log('search result:', coveredSets);\n\n coveredSets = this.filterRendered(query, coveredSets);\n coveredSets.forEach((set) => {\n this.renderSet(set.set);\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_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport rootScope from '../../lib/rootScope';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport {horizontalMenu} from '../horizontalMenu';\nimport LazyLoadQueue 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, {EmoticonsTabC, StickersTabCategory} 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 {IS_APPLE_MOBILE} from '../../environment/userAgent';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport type LazyLoadQueueIntersector from '../lazyLoadQueueIntersector';\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport overlayCounter from '../../helpers/overlayCounter';\nimport noop from '../../helpers/noop';\nimport {FocusDirection, ScrollOptions} from '../../helpers/fastSmoothScroll';\nimport BezierEasing from '../../vendor/bezier-easing';\nimport RichInputHandler from '../../helpers/dom/richInputHandler';\nimport {getCaretPosF} from '../../helpers/dom/getCaretPosNew';\nimport ListenerSetter from '../../helpers/listenerSetter';\n\nexport const EMOTICONSSTICKERGROUP: AnimationItemGroup = 'emoticons-dropdown';\n\nexport interface EmoticonsTab {\n content: HTMLElement;\n scrollable: Scrollable;\n menuScroll?: ScrollableX;\n tabId: number;\n init: () => void;\n onOpen?: () => void;\n onOpened?: () => void;\n onClose?: () => void;\n onClosed?: () => void;\n}\n\nconst easing = BezierEasing(0.42, 0.0, 0.58, 1.0);\nconst scrollOptions: Partial = {\n forceDuration: 200,\n transitionFunction: easing\n};\n\nexport class EmoticonsDropdown extends DropdownHover {\n public static lazyLoadQueue = new LazyLoadQueue(1);\n\n private emojiTab: EmojiTab;\n private 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 private managers: AppManagers;\n\n constructor() {\n super({\n element: document.getElementById('emoji-dropdown') as HTMLDivElement,\n ignoreOutClickClassName: 'input-message-input'\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 const tab = this.tab;\n tab.onOpen?.();\n });\n\n this.addEventListener('opened', () => {\n animationIntersector.unlockIntersectionGroup(EMOTICONSSTICKERGROUP);\n EmoticonsDropdown.lazyLoadQueue.unlockAndRefresh();\n\n // this.container.classList.remove('disable-hover');\n\n const tab = this.tab;\n tab.onOpened?.();\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 const tab = this.tab;\n tab.onClose?.();\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 const tab = this.tab;\n tab.onClosed?.();\n });\n }\n\n public get tab() {\n return this.tabs[this.tabId];\n }\n\n public init() {\n this.managers = rootScope.managers;\n this.emojiTab = new EmojiTab({managers: this.managers});\n this.stickersTab = new StickersTab(this.managers);\n this.gifsTab = new GifsTab(this.managers);\n\n this.tabs = {};\n [this.emojiTab, this.stickersTab, this.gifsTab].forEach((tab, idx) => {\n tab.tabId = idx;\n this.tabs[idx] = tab;\n });\n\n this.container = this.element.querySelector('.emoji-container .tabs-container') as HTMLDivElement;\n this.container.prepend(this.emojiTab.container, this.stickersTab.container);\n this.tabsEl = this.element.querySelector('.emoji-tabs') as HTMLUListElement;\n this.selectTab = horizontalMenu(this.tabsEl, this.container, this.onSelectTabClick, () => {\n const {tab} = this;\n tab.init?.();\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 === this.stickersTab.tabId) {\n if(!appSidebarRight.isTabExists(AppStickersTab)) {\n appSidebarRight.createTab(AppStickersTab).open();\n }\n } else {\n if(!appSidebarRight.isTabExists(AppGifsTab)) {\n appSidebarRight.createTab(AppGifsTab).open();\n }\n }\n });\n\n this.deleteBtn = this.element.querySelector('.emoji-tabs-delete');\n attachClickEvent(this.deleteBtn, (e) => {\n cancelEvent(e);\n const input = appImManager.chat.input.messageInput;\n // RichInputHandler.getInstance().makeFocused(appImManager.chat.input.messageInput);\n let range = RichInputHandler.getInstance().getSavedRange(input);\n if(!range) {\n range = document.createRange();\n range.setStartAfter(input.lastChild);\n }\n\n const newRange = range.cloneRange();\n // if(range.endOffset === range.startOffset && range.endContainer === range.startContainer) {\n if(range.collapsed) {\n const {node, offset} = getCaretPosF(input, range.endContainer, range.endOffset);\n let newStartNode: Node;\n if(offset) {\n newStartNode = node;\n } else {\n newStartNode = node.previousSibling;\n if(!newStartNode) {\n return;\n }\n\n while(newStartNode.nodeType === newStartNode.TEXT_NODE && !newStartNode.nodeValue && (newStartNode = newStartNode.previousSibling)) {\n\n }\n\n if(newStartNode.nodeType === newStartNode.ELEMENT_NODE && !(newStartNode as HTMLElement).isContentEditable) {\n return;\n }\n }\n\n if(newStartNode.nodeType === newStartNode.ELEMENT_NODE && (newStartNode as any).tagName === 'IMG') {\n newRange.selectNode(newStartNode);\n } else {\n const text = [...newStartNode.textContent];\n let t: string;\n if(offset) {\n let length = 0;\n t = text.find((text) => (length += text.length, length >= offset));\n } else {\n t = text.pop() || '';\n }\n\n const newOffset = offset ? offset - t.length : newStartNode.textContent.length - t.length;\n newRange.setStart(newStartNode, newOffset);\n }\n }\n\n newRange.deleteContents();\n\n appImManager.chat.input.messageInputField.simulateInputEvent();\n // const selection = document.getSelection();\n // if(selection.isCollapsed) {\n // selection.modify('extend', 'backward', 'character');\n // }\n\n // selection.deleteFromDocument();\n // (document.activeElement as HTMLElement).blur();\n\n // document.execCommand('undo', false, null);\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\n const HIDE_EMOJI_TAB = IS_APPLE_MOBILE && false;\n\n const INIT_TAB_ID = HIDE_EMOJI_TAB ? this.stickersTab.tabId : this.emojiTab.tabId;\n\n if(HIDE_EMOJI_TAB) {\n (this.tabsEl.children[1] as HTMLElement).classList.add('hide');\n }\n\n simulateClickEvent(this.tabsEl.children[INIT_TAB_ID + 1] as HTMLElement);\n if(this.tabs[INIT_TAB_ID].init) {\n this.tabs[INIT_TAB_ID].init(); // onTransitionEnd ะฝะต ะฒั‹ะทะพะฒะตั‚ัั, ั‚.ะบ. ัั‚ะพ ะฟะตั€ะฒะฐั ะพั‚ะบั€ั‹ั‚ะฐั ะฒะบะปะฐะดะบะฐ\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n let lastMouseMoveEvent: MouseEvent, mouseMoveEventAttached = false;\n const onMouseMove = (e: MouseEvent) => {\n lastMouseMoveEvent = e;\n };\n overlayCounter.addEventListener('change', (isActive) => {\n if(isActive) {\n if(!mouseMoveEventAttached) {\n document.body.addEventListener('mousemove', onMouseMove);\n mouseMoveEventAttached = true;\n }\n } else if(mouseMoveEventAttached) {\n document.body.removeEventListener('mousemove', onMouseMove);\n if(lastMouseMoveEvent) {\n this.onMouseOut(lastMouseMoveEvent);\n }\n }\n });\n }\n\n appImManager.addEventListener('peer_changing', () => {\n this.toggle(false);\n });\n appImManager.addEventListener('peer_changed', this.checkRights);\n this.checkRights();\n\n return super.init();\n }\n\n public getElement() {\n return this.element;\n }\n\n public scrollTo(tab: EmoticonsTab, element: HTMLElement) {\n tab.scrollable.scrollIntoViewNew({\n element: element as HTMLElement,\n axis: 'y',\n position: 'start',\n ...scrollOptions\n });\n }\n\n private onSelectTabClick = (id: number) => {\n if(this.tabId === id) {\n const {tab} = this;\n this.scrollTo(tab, tab.scrollable.container.firstElementChild as HTMLElement);\n return;\n }\n\n animationIntersector.checkAnimations(true, EMOTICONSSTICKERGROUP);\n\n this.tabId = id;\n this.searchButton.classList.toggle('hide', this.tabId === this.emojiTab.tabId);\n this.deleteBtn.classList.toggle('hide', this.tabId !== this.emojiTab.tabId);\n };\n\n private checkRights = async() => {\n const {peerId, threadId} = appImManager.chat;\n const children = this.tabsEl.children;\n const tabsElements = Array.from(children) as HTMLElement[];\n\n const [canSendStickers, canSendGifs] = await Promise.all([\n this.managers.appMessagesManager.canSendToPeer(peerId, threadId, 'send_stickers'),\n this.managers.appMessagesManager.canSendToPeer(peerId, threadId, 'send_gifs')\n ]);\n\n tabsElements[this.stickersTab.tabId + 1].toggleAttribute('disabled', !canSendStickers);\n tabsElements[this.gifsTab.tabId + 1].toggleAttribute('disabled', !canSendGifs);\n\n const active = this.tabsEl.querySelector('.active');\n if(active && whichChild(active) !== (this.emojiTab.tabId + 1) && (!canSendStickers || !canSendGifs)) {\n this.selectTab(this.emojiTab.tabId, false);\n }\n };\n\n public static menuOnClick = (\n emoticons: EmoticonsTabC,\n menu: HTMLElement,\n scrollable: Scrollable,\n menuScroll?: ScrollableX,\n prevTab?: StickersTabCategory,\n listenerSetter?: ListenerSetter\n ) => {\n let jumpedTo = -1;\n\n const scrollToTab = (tab: typeof prevTab, f?: boolean) => {\n const m = tab.menuScroll || menuScroll;\n if(m) {\n m.scrollIntoViewNew({\n element: tab.elements.menuTab,\n position: 'center',\n axis: 'x',\n getElementPosition: f ? ({elementPosition}) => {\n return elementPosition - 106;\n } : undefined,\n ...scrollOptions\n });\n }\n };\n\n const setActive = (tab: typeof prevTab, scroll = true) => {\n if(tab === prevTab) {\n return false;\n }\n\n let f = false;\n if(prevTab) {\n prevTab.elements.menuTab.classList.remove('active');\n if(prevTab.menuScroll && prevTab.menuScroll !== tab.menuScroll) {\n f = true;\n // scroll to first\n prevTab.menuScroll.container.parentElement.classList.remove('active');\n prevTab.menuScroll.scrollIntoViewNew({\n element: prevTab.menuScroll.container.firstElementChild as HTMLElement,\n forceDirection: scroll ? undefined : FocusDirection.Static,\n position: 'center',\n axis: 'x',\n ...scrollOptions\n });\n }\n }\n\n tab.elements.menuTab.classList.add('active');\n\n if(tab.menuScroll) {\n tab.menuScroll.container.parentElement.classList.add('active');\n scroll && menuScroll.scrollIntoViewNew({\n element: tab.menuScroll.container.parentElement,\n position: 'center',\n axis: 'x',\n ...scrollOptions\n });\n }\n\n if(prevTab) {\n scrollToTab(tab, f);\n }\n\n prevTab = tab;\n\n return true;\n };\n\n const setActiveStatic = (tab: typeof prevTab) => {\n if(prevTab?.local) {\n return;\n }\n\n emoticons.scrollable.scrollTop = tab.elements.container.offsetTop + 1;\n const s = emoticons.menuScroll.container;\n const e = tab.elements.menuTab;\n s.scrollLeft = e.offsetLeft - s.clientWidth / 2 + e.offsetWidth / 2;\n setActive(tab, false);\n };\n\n let scrollingToContent = false;\n const stickyIntersector = new StickyIntersector(scrollable.container, (stuck, target) => {\n if(scrollingToContent) {\n return;\n }\n\n // console.log('sticky scrollTop', stuck, target, scrollable.container.scrollTop, jumpedTo);\n\n if(Math.abs(jumpedTo - scrollable.container.scrollTop) <= 1) {\n return;\n } else {\n jumpedTo = -1;\n }\n\n const tab = emoticons.getCategoryByContainer(target);\n const which = whichChild(target);\n if(!stuck && (which || tab.menuScroll)) {\n return;\n }\n\n setActive(tab);\n });\n\n attachClickEvent(menu, (e) => {\n let target = findUpClassName(e.target as HTMLElement, 'menu-horizontal-div-item');\n if(!target) {\n target = findUpClassName(e.target as HTMLElement, 'menu-horizontal-inner');\n if(!target || target.classList.contains('active')) {\n return;\n }\n\n target = target.firstElementChild.firstElementChild as HTMLElement;\n }\n\n const which = whichChild(target);\n\n const tab = emoticons.getCategoryByMenuTab(target);\n\n /* if(menuScroll) {\n menuScroll.scrollIntoView(target, false, 0);\n } */\n\n if(setActive(tab)) {\n // scrollToTab(tab);\n // return;\n }\n\n let offsetTop = 0, additionalOffset = 0;\n if(which > 0 || tab.menuScroll) {\n const element = tab.elements.container;\n additionalOffset = 1;\n offsetTop = element.offsetTop + additionalOffset; // * due to stickyIntersector\n }\n\n jumpedTo = offsetTop;\n\n scrollingToContent = true;\n scrollable.scrollIntoViewNew({\n element: offsetTop ? tab.elements.container : scrollable.container.firstElementChild,\n position: 'start',\n axis: 'y',\n getElementPosition: offsetTop ? ({elementPosition}) => elementPosition + additionalOffset : undefined,\n ...scrollOptions\n }).finally(() => {\n setActive(tab);\n scrollingToContent = false;\n });\n }, {listenerSetter});\n\n const a = scrollable.onAdditionalScroll ? scrollable.onAdditionalScroll.bind(scrollable) : noop;\n scrollable.onAdditionalScroll = () => {\n emoticons.content.parentElement.classList.toggle('scrolled-top', !scrollable.scrollTop);\n a();\n };\n\n return {stickyIntersector, setActive, setActiveStatic};\n };\n\n public static onMediaClick = async(e: {target: EventTarget | Element}, clearDraft = false, silent?: boolean) => {\n const target = findUpTag(e.target as HTMLElement, 'DIV');\n if(!target) return false;\n\n const docId = target.dataset.docId;\n if(!docId) return false;\n\n return this.sendDocId(docId, clearDraft, silent);\n };\n\n public static async sendDocId(docId: DocId, clearDraft?: boolean, silent?: boolean) {\n if(await appImManager.chat.input.sendMessageWithDocument(docId, undefined, clearDraft, silent)) {\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:', docId);\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","/*\n * 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, EMOTICONSSTICKERGROUP} 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 appImManager from '../../../lib/appManagers/appImManager';\nimport {LangPackKey} from '../../../lib/langPack';\nimport rootScope from '../../../lib/rootScope';\nimport {emojiFromCodePoints} from '../../../vendor/emoji';\nimport {putPreloader} from '../../putPreloader';\nimport Scrollable, {ScrollableX} from '../../scrollable';\nimport IS_EMOJI_SUPPORTED from '../../../environment/emojiSupport';\nimport IS_TOUCH_SUPPORTED from '../../../environment/touchSupport';\nimport blurActiveElement from '../../../helpers/dom/blurActiveElement';\nimport Emoji from '../../../config/emoji';\nimport fixEmoji from '../../../lib/richTextProcessor/fixEmoji';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport wrapSingleEmoji from '../../../lib/richTextProcessor/wrapSingleEmoji';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport {EmoticonsTabC, StickersTabCategory} from './stickers';\nimport {makeMediaSize} from '../../../helpers/mediaSize';\nimport {AppManagers} from '../../../lib/appManagers/managers';\nimport VisibilityIntersector, {OnVisibilityChangeItem} from '../../visibilityIntersector';\nimport mediaSizes from '../../../helpers/mediaSizes';\nimport wrapStickerSetThumb from '../../wrappers/stickerSetThumb';\nimport attachStickerViewerListeners from '../../stickerViewer';\nimport ListenerSetter from '../../../helpers/listenerSetter';\nimport {Document, StickerSet} from '../../../layer';\nimport {CustomEmojiElement, CustomEmojiRendererElement} from '../../../lib/richTextProcessor/wrapRichText';\nimport findAndSplice from '../../../helpers/array/findAndSplice';\nimport positionElementByIndex from '../../../helpers/dom/positionElementByIndex';\nimport PopupStickers from '../../popups/stickers';\nimport {hideToast, toastNew} from '../../toast';\nimport safeAssign from '../../../helpers/object/safeAssign';\nimport type {AppStickersManager} from '../../../lib/appManagers/appStickersManager';\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: DocumentFragment;\n if(unify && !IS_EMOJI_SUPPORTED) {\n kek = wrapSingleEmoji(emoji);\n } else {\n emoji = fixEmoji(emoji);\n kek = 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.append(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?.tagName === 'IMG') {\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(container) {\n if(prepend) container.prepend(spanEmoji);\n else container.appendChild(spanEmoji);\n }\n\n return spanEmoji;\n}\n\nexport function getEmojiFromElement(element: HTMLElement): {docId?: DocId, emoji: string} {\n const superEmoji = findUpClassName(element, 'super-emoji');\n if(!superEmoji) return;\n\n const firstElementChild = superEmoji.firstElementChild as HTMLElement;\n if(firstElementChild && firstElementChild.classList.contains('custom-emoji')) {\n return {emoji: firstElementChild.dataset.stickerEmoji, docId: firstElementChild.dataset.docId} as const;\n } else {\n if(element.nodeType === element.TEXT_NODE) return {emoji: element.nodeValue};\n if(element.tagName === 'SPAN' && !element.classList.contains('emoji') && element.firstElementChild) {\n element = element.firstElementChild as HTMLElement;\n }\n\n return {emoji: element.getAttribute('alt') || element.innerText} as const;\n }\n}\n\nconst EMOJI_RECENT_ID: (typeof EMOJI_CATEGORIES)[0][0] = 'Emoji.Recent';\nconst EMOJI_RECENT_CATEGORY: (typeof EMOJI_CATEGORIES)[0] = [EMOJI_RECENT_ID, 'recent'];\nconst CUSTOM_EMOJI_RECENT_ID: (typeof EMOJI_CATEGORIES)[0][0] = '';\nconst CUSTOM_EMOJI_RECENT_CATEGORY: (typeof EMOJI_CATEGORIES)[0] = [CUSTOM_EMOJI_RECENT_ID, ''];\nconst EMOJI_CATEGORIES: [LangPackKey | '', string][] = [\n ['Emoji.SmilesAndPeople', 'smile'],\n ['Emoji.AnimalsAndNature', 'animals'],\n ['Emoji.FoodAndDrink', 'eats'],\n ['Emoji.TravelAndPlaces', 'car'],\n ['Emoji.ActivityAndSport', 'sport'],\n ['Emoji.Objects', 'lamp'],\n // ['Emoji.Symbols', 'info'],\n ['Emoji.Flags', 'flag'],\n ['Skin Tones' as any, '']\n];\n\nlet sorted: Map<(typeof EMOJI_CATEGORIES)[0], string[]>;\nfunction prepare() {\n if(sorted) {\n return sorted;\n }\n\n const a: Array<[(typeof EMOJI_CATEGORIES)[0], string[]]> = [\n [CUSTOM_EMOJI_RECENT_CATEGORY, []],\n [EMOJI_RECENT_CATEGORY, []]\n ];\n\n sorted = new Map(a);\n for(const emoji in Emoji) {\n const details = Emoji[emoji];\n const i = '' + details;\n const category = EMOJI_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 sorted.delete(EMOJI_CATEGORIES.pop());\n EMOJI_CATEGORIES.unshift(CUSTOM_EMOJI_RECENT_CATEGORY, EMOJI_RECENT_CATEGORY);\n const order = EMOJI_CATEGORIES.map(([id]) => id);\n const entries = [...sorted.entries()].sort((a, b) => order.indexOf(a[0][0]) - order.indexOf(b[0][0]));\n sorted = new Map(entries);\n\n return sorted;\n}\n\nconst EMOJI_ELEMENT_SIZE = makeMediaSize(42, 42);\nconst RECENT_MAX_LENGTH = 32;\n\ntype EmojiTabItem = {element: HTMLElement} & ReturnType;\ntype EmojiTabCategory = StickersTabCategory;\nexport default class EmojiTab extends EmoticonsTabC {\n private closeScrollTop: number;\n private menuInnerScroll: ScrollableX;\n private isStandalone?: boolean;\n private noRegularEmoji?: boolean;\n private stickerSetId?: Parameters[0];\n private onClick: (emoji: EmojiTabItem) => void;\n private activeEmoji: ReturnType;\n private activeElements: EmojiTabItem[];\n\n constructor(options: {\n managers: AppManagers,\n isStandalone?: boolean,\n noRegularEmoji?: boolean,\n stickerSetId?: EmojiTab['stickerSetId'],\n onClick?: EmojiTab['onClick']\n }) {\n super(\n options.managers,\n 'super-emojis',\n () => EMOJI_ELEMENT_SIZE,\n 16,\n 4,\n 0\n );\n\n safeAssign(this, options);\n this.container.classList.add('emoji-padding');\n this.content.id = 'content-emoji';\n this.activeElements = [];\n }\n\n private onCategoryVisibility = ({target, visible}: Pick) => {\n const category = this.categoriesMap.get(target);\n // console.log(target, visible, category);\n // if(category.local) return;\n\n const renderer = category.elements.renderer;\n const newChildren: HTMLElement[] = [];\n if(renderer) {\n newChildren.push(renderer);\n const customEmojis: Parameters[0] = new Map();\n if(visible) {\n newChildren.push(...category.items.map(({docId, element}) => {\n if(!docId) {\n return element;\n }\n\n // return element;\n\n // if(element.firstElementChild) {\n // return element;\n // }\n\n const customEmojiElement = element.firstElementChild as CustomEmojiElement;\n customEmojiElement.clear(false);\n // const customEmojiElement = CustomEmojiElement.create(document.id);\n customEmojis.set(customEmojiElement.docId, new Set([customEmojiElement]));\n // element.append(customEmojiElement);\n return element;\n }));\n\n renderer.add(customEmojis/* , EmoticonsDropdown.lazyLoadQueue */, undefined, undefined, false);\n } else {\n renderer.clearCanvas();\n renderer.middlewareHelper.clean();\n }\n } else if(visible) {\n newChildren.push(...category.items.map(({element}) => element));\n }\n\n // if(visible)\n category.elements.items.replaceChildren(...newChildren);\n\n if(renderer && !visible) {\n const customEmojis: Parameters[0] = new Map();\n category.items.forEach(({docId, element}) => {\n if(!docId) {\n return;\n }\n\n const customEmojiElement = element.firstElementChild as CustomEmojiElement;\n customEmojiElement.clear();\n customEmojis.set(customEmojiElement.docId, new Set([customEmojiElement]));\n });\n\n /* const promise = */renderer.add(customEmojis/* , EmoticonsDropdown.lazyLoadQueue */, undefined, true);\n // promise.then(() => {\n // customEmojis.forEach((elements) => {\n // elements.forEach((element) => {\n // if(!element.innerHTML) {\n // console.log('no thumb', element);\n // // debugger;\n // }\n // });\n // });\n\n // const set = customEmojis.get('5766933926429854499');\n // console.log(`wrapped ${customEmojis.size} thumbs`, set && set.values().next().value.innerHTML);\n // });\n }\n\n // if(!visible) {\n // const customEmojis: Parameters[0] = {};\n // category.items.forEach((item) => {\n // const {element, document} = item;\n // if(!element.firstElementChild) {\n // return;\n // }\n\n // const customEmojiElement = CustomEmojiElement.create(document.id);\n // customEmojis[customEmojiElement.docId] = new Set([customEmojiElement]);\n // element.firstElementChild.replaceWith(customEmojiElement);\n // });\n\n // renderer.add(customEmojis, EmoticonsDropdown.lazyLoadQueue);\n // }\n };\n\n public destroy() {\n super.destroy();\n this.menuInnerScroll?.destroy();\n }\n\n public init() {\n super.init();\n this.init = undefined;\n\n const intersectionOptions: IntersectionObserverInit = {\n root: this.isStandalone ? this.content : emoticonsDropdown.getElement()\n };\n\n this.categoriesIntersector = new VisibilityIntersector(this.onCategoryVisibility, intersectionOptions);\n\n this.menuOnClickResult = EmoticonsDropdown.menuOnClick(this, this.menu, this.scrollable, this.menuScroll, undefined, this.listenerSetter);\n\n const preloader = putPreloader(this.content, true);\n\n let innerScrollWrapper: HTMLElement;\n\n if(!this.isStandalone) {\n const x = this.menuInnerScroll = new ScrollableX(undefined);\n x.container.classList.add('menu-horizontal-inner-scroll');\n\n innerScrollWrapper = document.createElement('div');\n innerScrollWrapper.classList.add('menu-horizontal-inner');\n innerScrollWrapper.append(x.container);\n }\n\n let preparedMap: ReturnType;\n prepare();\n if(!this.noRegularEmoji) {\n preparedMap = prepare();\n } else {\n preparedMap = new Map([\n [[CUSTOM_EMOJI_RECENT_CATEGORY[0], 'recent'], []]\n // [EMOJI_RECENT_CATEGORY, []]\n ]);\n }\n\n preparedMap.forEach((emojis, [titleLangPackKey, icon]) => {\n const category = this.createLocalCategory(titleLangPackKey, titleLangPackKey, icon, !icon);\n category.elements.container.classList.remove('hide');\n category.elements.items.classList.add(icon && !this.isStandalone ? 'is-local' : 'not-local');\n\n emojis.forEach((unified) => {\n /* if(emojiUnicode(emoji) === '1f481-200d-2642') {\n console.log('append emoji', emoji, emojiUnicode(emoji));\n } */\n\n const 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 this.addEmojiToCategory({\n category,\n emoji: {emoji},\n batch: true\n });\n\n /* if(category === 'Smileys & Emotion') {\n console.log('appended emoji', emoji, itemsDiv.children[itemsDiv.childElementCount - 1].innerHTML, emojiUnicode(emoji));\n } */\n });\n });\n\n const promise = Promise.all([\n this.isStandalone ? undefined : pause(200),\n !this.noRegularEmoji && this.managers.appEmojiManager.getRecentEmojis('native'),\n !this.isStandalone && this.managers.appEmojiManager.getRecentEmojis('custom'),\n this.stickerSetId && this.managers.appStickersManager.getLocalStickerSet(this.stickerSetId),\n this.managers.appEmojiManager.getCustomEmojis()\n ]).then(([_, recent, recentCustom, mainSet, sets]) => {\n preloader.remove();\n\n if(mainSet) {\n recentCustom = mainSet.documents.map((doc) => doc.id);\n }\n\n const recentCategory = this.categories[EMOJI_RECENT_ID];\n const recentCustomCategory = this.categories[CUSTOM_EMOJI_RECENT_ID];\n\n if(!this.isStandalone) {\n const a = [\n recentCategory && [recentCategory, recent] as const,\n recentCustomCategory && [recentCustomCategory, recentCustom] as const\n ];\n\n a.filter(Boolean).forEach(([category, recent]) => {\n category.limit = RECENT_MAX_LENGTH;\n recent.splice(RECENT_MAX_LENGTH, recent.length - RECENT_MAX_LENGTH);\n });\n }\n\n if(recentCategory && recent) for(const emoji of recent) {\n this.addEmojiToCategory({\n category: recentCategory,\n emoji: {emoji},\n batch: true\n });\n }\n\n if(recentCustomCategory) {\n this.createRendererForCategory(recentCustomCategory);\n if(recentCustom) for(const docId of recentCustom) {\n this.addEmojiToCategory({\n category: recentCustomCategory,\n emoji: {emoji: '', docId},\n batch: true\n });\n }\n recentCustomCategory.elements.container.style.paddingTop = '.5rem';\n }\n\n EMOJI_CATEGORIES.forEach(([id]) => {\n const category = this.categories[id];\n if(!category) {\n return;\n }\n\n this.toggleLocalCategory(category, true);\n\n if(id !== EMOJI_RECENT_ID && id !== CUSTOM_EMOJI_RECENT_ID) {\n category.menuScroll = this.menuInnerScroll;\n this.menuInnerScroll.container.append(category.elements.menuTab);\n }\n });\n\n this.resizeCategories();\n\n recentCategory && innerScrollWrapper && recentCategory.elements.menuTab.after(innerScrollWrapper);\n\n sets.sets.forEach((set) => {\n this.renderStickerSet(set);\n });\n\n this.listenerSetter.add(rootScope)('premium_toggle', () => {\n this.toggleCustomCategory();\n });\n\n this.listenerSetter.add(rootScope)('stickers_top', this.postponedEvent((id) => {\n const category = this.categories[id];\n if(!category) {\n return;\n }\n\n this.positionCategory(category, true);\n\n this.listenerSetter.add(emoticonsDropdown)('openAfterLayout', () => {\n this.menuOnClickResult.setActiveStatic(category);\n }, {once: true});\n }));\n\n const toggleRenderers = (ignore: boolean) => {\n for(const id in this.categories) {\n const category = this.categories[id];\n const renderer = category.elements.renderer;\n if(renderer) {\n renderer.ignoreSettingDimensions = ignore;\n if(!ignore) {\n renderer.setDimensionsFromRect(undefined, true);\n }\n }\n }\n };\n\n !this.isStandalone && this.listenerSetter.add(emoticonsDropdown)('opened', () => {\n toggleRenderers(false);\n });\n\n !this.isStandalone && this.listenerSetter.add(emoticonsDropdown)('close', () => {\n toggleRenderers(true);\n });\n\n this.listenerSetter.add(rootScope)('stickers_installed', (set) => {\n if(!this.categories[set.id] && set.pFlags.emojis) {\n this.renderStickerSet(set, true);\n }\n });\n\n this.listenerSetter.add(rootScope)('stickers_deleted', (set) => {\n const category = this.categories[set.id];\n if(this.deleteCategory(category)) {\n const {renderer} = category.elements;\n if(renderer) {\n renderer.middlewareHelper.clean();\n }\n }\n });\n\n !this.isStandalone && this.listenerSetter.add(rootScope)('emoji_recent', this.postponedEvent((emoji) => {\n const category = this.categories[emoji.docId ? CUSTOM_EMOJI_RECENT_ID : EMOJI_RECENT_ID];\n if(!category) {\n return;\n }\n\n const verify: (item: EmojiTabItem) => boolean = emoji.docId ?\n (item) => item.docId === emoji.docId :\n (item) => item.emoji === emoji.emoji;\n const found = findAndSplice(category.items, verify);\n if(found) {\n category.items.unshift(found);\n if(this.isCategoryVisible(category)) {\n const {renderer} = category.elements;\n positionElementByIndex(found.element, category.elements.items, renderer ? 1 : 0, -1);\n renderer?.forceRender();\n }\n } else {\n this.addEmojiToCategory({\n category,\n emoji,\n batch: false,\n prepend: true\n });\n }\n\n if(this.closeScrollTop === 0) {\n this.menuOnClickResult.setActive(emoji.docId ? this.categories[EMOJI_RECENT_ID] : category);\n }\n }));\n\n !this.isStandalone && this.listenerSetter.add(appImManager)('peer_changed', () => {\n this.toggleCustomCategory();\n });\n\n this.toggleCustomCategory();\n\n this.menuOnClickResult.setActive(recentCategory ?? recentCustomCategory);\n });\n\n attachClickEvent(this.content, this.onContentClick, {listenerSetter: this.listenerSetter});\n attachStickerViewerListeners({listenTo: this.content, listenerSetter: this.listenerSetter});\n\n return promise;\n }\n\n private renderStickerSet(set: StickerSet.stickerSet, prepend?: boolean) {\n const category = this.createCategory(set, wrapEmojiText(set.title));\n this.positionCategory(category, prepend);\n const {container, menuTabPadding} = category.elements;\n category.elements.items.classList.add('not-local');\n category.elements.container.classList.add('is-premium-set');\n category.elements.title.classList.add('tgico');\n\n this.createRendererForCategory(category);\n\n const promise = this.managers.appStickersManager.getStickerSet(set);\n promise.then(({documents}) => {\n documents.forEach((document) => {\n this.addEmojiToCategory({\n category,\n emoji: {docId: document.id, emoji: (document as Document.document).stickerEmojiRaw},\n batch: true\n });\n });\n\n // if(this.isCategoryVisible(category)) {\n // category.elements.items.append(...category.items.map(({element}) => element));\n // }\n\n this.onCategoryVisibility({target: category.elements.container, visible: this.isCategoryVisible(category)});\n\n category.setCategoryItemsHeight();\n container.classList.remove('hide');\n });\n\n wrapStickerSetThumb({\n set,\n container: menuTabPadding,\n group: EMOTICONSSTICKERGROUP,\n lazyLoadQueue: EmoticonsDropdown.lazyLoadQueue,\n width: 32,\n height: 32,\n autoplay: false\n });\n }\n\n private get peerId() {\n return appImManager.chat.peerId;\n }\n\n public getCustomCategory() {\n return this.categories[CUSTOM_EMOJI_RECENT_ID];\n }\n\n private toggleCustomCategory() {\n const category = this.categories[CUSTOM_EMOJI_RECENT_ID];\n const hasPremium = rootScope.premium || this.peerId === rootScope.myId;\n const canSeeCustomCategory = hasPremium || this.isStandalone;\n super.toggleLocalCategory(category, !!category.items.length && canSeeCustomCategory);\n this.content.classList.toggle('has-premium', hasPremium);\n }\n\n protected toggleLocalCategory(category: EmojiTabCategory, visible: boolean) {\n if(category.id === CUSTOM_EMOJI_RECENT_ID) {\n this.toggleCustomCategory();\n return;\n }\n\n super.toggleLocalCategory(category, visible);\n }\n\n private createRendererForCategory(category: EmojiTabCategory) {\n const renderer = CustomEmojiRendererElement.create({\n animationGroup: EMOTICONSSTICKERGROUP,\n customEmojiSize: mediaSizes.active.esgCustomEmoji\n });\n\n category.elements.renderer = renderer;\n category.elements.items.append(renderer);\n }\n\n public addEmojiToCategory(options: {\n category: EmojiTabCategory,\n emoji?: ReturnType,\n element?: HTMLElement,\n batch?: boolean,\n prepend?: boolean,\n active?: boolean\n }) {\n const {category, emoji, batch, prepend} = options;\n let element = options.element;\n if(element) {\n const spanEmoji = document.createElement('span');\n spanEmoji.classList.add('super-emoji');\n spanEmoji.append(element);\n element = spanEmoji;\n } else if(emoji.docId) {\n const customEmojiElement = CustomEmojiElement.create(emoji.docId);\n const span = document.createElement('span');\n span.classList.add(/* 'emoji', */'super-emoji');\n span.append(customEmojiElement);\n element = span;\n } else {\n element = appendEmoji(emoji.emoji/* .replace(/[\\ufe0f\\u2640\\u2642\\u2695]/g, '') */, undefined, false/* , false */);\n }\n\n const item: typeof category['items'][0] = {\n ...(emoji || {emoji: undefined}),\n element\n };\n\n if(\n options.active || (\n this.activeEmoji && (\n item.docId ?\n this.activeEmoji.docId === item.docId :\n this.activeEmoji.emoji === item.emoji\n )\n )\n ) {\n this.activeEmoji === emoji;\n this.activeElements.push(item);\n element.classList.add('active');\n }\n\n category.items[prepend ? 'unshift' : 'push'](item);\n if(!batch && !this.spliceExceed(category)) {\n this.onLocalCategoryUpdate(category);\n }\n }\n\n // private addEmojisToCategory(category: EmojiTabCategory, emojis: string[], prepend?: boolean) {\n // emojis.forEach((emoji) => {\n // this.addEmojiToCategory(category, emoji, true, prepend);\n // });\n\n // this.onLocalCategoryUpdate(category);\n // }\n\n private onContentClick = (e: MouseEvent) => {\n cancelEvent(e);\n\n const {target} = e;\n\n const container = findUpClassName(target, 'emoji-category');\n const category = this.categoriesMap.get(container);\n if(findUpClassName(target, 'category-title')) {\n if(category.local) {\n return;\n }\n\n new PopupStickers({id: category.set.id, access_hash: category.set.access_hash}, true).show();\n return;\n }\n\n const emoji = getEmojiFromElement(target as HTMLElement);\n if(!emoji) {\n return;\n }\n\n if(\n emoji.docId &&\n !rootScope.premium && (\n this.isStandalone ? category.id !== CUSTOM_EMOJI_RECENT_ID : this.peerId !== rootScope.myId\n )\n ) {\n const a = document.createElement('a');\n a.onclick = () => {\n appImManager.openPremiumBot();\n hideToast();\n };\n toastNew({\n langPackKey: 'CustomEmoji.PremiumAlert',\n langPackArguments: [a]\n });\n return;\n }\n\n if(this.onClick) {\n this.onClick({\n ...emoji,\n element: findUpClassName(target, 'super-emoji').firstElementChild as HTMLElement\n });\n } else {\n appImManager.chat.input.onEmojiSelected(emoji, false);\n }\n\n if(IS_TOUCH_SUPPORTED) {\n blurActiveElement();\n }\n };\n\n public setActive(emoji: ReturnType) {\n if(\n emoji === this.activeEmoji ||\n emoji?.docId ? emoji.docId === this.activeEmoji?.docId : emoji?.emoji === this.activeEmoji?.emoji\n ) {\n return;\n }\n\n this.activeEmoji = emoji;\n\n this.activeElements.forEach((item) => {\n item.element.classList.remove('active');\n });\n\n this.activeElements.length = 0;\n\n this.categoriesMap.forEach((category) => {\n category.items.forEach((item) => {\n if(emoji.docId ? item.docId === emoji.docId : item.emoji === emoji.emoji) {\n item.element.classList.add('active');\n this.activeElements.push(item);\n }\n });\n });\n }\n\n public onClose() {\n this.closeScrollTop = this.scrollable.scrollTop;\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 getEmojiEntityFromEmoji from './getEmojiEntityFromEmoji';\nimport wrapRichText from './wrapRichText';\n\nexport default function wrapSingleEmoji(emoji: string) {\n return wrapRichText(emoji, {\n entities: [getEmojiEntityFromEmoji(emoji)]\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 indexOfAndSplice from '../helpers/array/indexOfAndSplice';\nimport LazyLoadQueueIntersector, {LazyLoadElement} from './lazyLoadQueueIntersector';\nimport VisibilityIntersector, {OnVisibilityChange} from './visibilityIntersector';\n\nexport default class LazyLoadQueueRepeat extends LazyLoadQueueIntersector {\n private elementsMap: Map = new Map();\n\n constructor(\n parallelLimit?: number,\n protected onVisibilityChange?: OnVisibilityChange,\n options?: IntersectionObserverInit\n ) {\n super(parallelLimit);\n\n this.intersector = new VisibilityIntersector((item) => {\n const {target, visible} = item;\n\n const queueItem = this.elementsMap.get(target);\n queueItem.visible = visible;\n\n if(visible) {\n queueItem.wasSeen = true;\n if(!this.queue.includes(queueItem)) {\n this.queue.push(queueItem);\n }\n } else {\n indexOfAndSplice(this.queue, queueItem);\n }\n\n this.onVisibilityChange?.(item);\n this.setProcessQueueTimeout();\n }, options);\n }\n\n public clear() {\n super.clear();\n this.elementsMap.clear();\n }\n\n /* public async processItem(item: LazyLoadElement) {\n //await super.processItem(item);\n await LazyLoadQueueBase.prototype.processItem.call(this, item);\n\n if(this.lazyLoadMedia.length) {\n this.processQueue();\n }\n } */\n\n public observe(el: LazyLoadElement) {\n this.elementsMap.set(el.div, el);\n super.observe(el);\n }\n\n public unobserve(el: LazyLoadElement) {\n this.elementsMap.delete(el.div);\n super.unobserve(el);\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 emoticonsDropdown, {EmoticonsDropdown, EMOTICONSSTICKERGROUP, EmoticonsTab} from '..';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport mediaSizes from '../../../helpers/mediaSizes';\nimport {Document, MessagesAllStickers, StickerSet} from '../../../layer';\nimport {MyDocument} from '../../../lib/appManagers/appDocsManager';\nimport {AppManagers} from '../../../lib/appManagers/managers';\nimport {i18n, LangPackKey} from '../../../lib/langPack';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport rootScope from '../../../lib/rootScope';\nimport animationIntersector, {AnimationItemGroup} from '../../animationIntersector';\nimport LazyLoadQueue from '../../lazyLoadQueue';\nimport LazyLoadQueueRepeat from '../../lazyLoadQueueRepeat';\nimport {putPreloader} from '../../putPreloader';\nimport PopupStickers from '../../popups/stickers';\nimport Scrollable, {ScrollableX} from '../../scrollable';\nimport findAndSplice from '../../../helpers/array/findAndSplice';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport positionElementByIndex from '../../../helpers/dom/positionElementByIndex';\nimport noop from '../../../helpers/noop';\nimport ButtonIcon from '../../buttonIcon';\nimport confirmationPopup from '../../confirmationPopup';\nimport VisibilityIntersector, {OnVisibilityChangeItem} from '../../visibilityIntersector';\nimport createStickersContextMenu from '../../../helpers/dom/createStickersContextMenu';\nimport findUpAsChild from '../../../helpers/dom/findUpAsChild';\nimport forEachReverse from '../../../helpers/array/forEachReverse';\nimport attachStickerViewerListeners from '../../stickerViewer';\nimport ListenerSetter from '../../../helpers/listenerSetter';\nimport wrapSticker from '../../wrappers/sticker';\nimport wrapStickerSetThumb from '../../wrappers/stickerSetThumb';\nimport {MediaSize} from '../../../helpers/mediaSize';\nimport {AnyFunction} from '../../../types';\nimport {IgnoreMouseOutType} from '../../../helpers/dropdownHover';\nimport customProperties from '../../../helpers/dom/customProperties';\nimport windowSize from '../../../helpers/windowSize';\n\nexport class SuperStickerRenderer {\n public lazyLoadQueue: LazyLoadQueueRepeat;\n private animated: Set = new Set();\n\n constructor(\n private regularLazyLoadQueue: LazyLoadQueue,\n private group: AnimationItemGroup,\n private managers: AppManagers,\n private options?: IntersectionObserverInit\n ) {\n this.lazyLoadQueue = new LazyLoadQueueRepeat(undefined, ({target, visible}) => {\n if(!visible) {\n this.processInvisible(target);\n }\n }, options);\n }\n\n public clear() {\n this.lazyLoadQueue.clear();\n }\n\n public renderSticker(doc: MyDocument, element?: HTMLElement, loadPromises?: Promise[]) {\n if(!element) {\n element = document.createElement('div');\n element.classList.add('grid-item', 'super-sticker');\n element.dataset.docId = '' + doc.id;\n\n if(doc.animated) {\n this.observeAnimated(element);\n }\n }\n\n // * This will wrap only a thumb\n /* !doc.animated && */wrapSticker({\n doc,\n div: element,\n lazyLoadQueue: this.regularLazyLoadQueue,\n group: this.group,\n onlyThumb: doc.animated,\n loadPromises\n });\n\n return element;\n }\n\n public observeAnimated(element: HTMLElement) {\n this.animated.add(element);\n this.lazyLoadQueue.observe({\n div: element,\n load: this.processVisible\n });\n }\n\n public unobserveAnimated(element: HTMLElement) {\n this.animated.delete(element);\n this.lazyLoadQueue.delete({div: element});\n }\n\n private checkAnimationContainer = (element: HTMLElement, visible: boolean) => {\n // console.error('checkAnimationContainer', div, visible);\n const players = animationIntersector.getAnimations(element);\n players.forEach((player) => {\n if(!visible) {\n animationIntersector.removeAnimation(player);\n } else {\n animationIntersector.checkAnimation(player, false);\n }\n });\n };\n\n private processVisible = async(element: HTMLElement) => {\n const docId = element.dataset.docId;\n const doc = await this.managers.appDocsManager.getDoc(docId);\n\n const size = mediaSizes.active.esgSticker.width;\n\n // console.log('processVisibleDiv:', element);\n\n const promise = wrapSticker({\n doc,\n div: element,\n width: size,\n height: size,\n lazyLoadQueue: null,\n group: this.group,\n onlyThumb: false,\n play: true,\n loop: true,\n withLock: true\n }).then(({render}) => render);\n\n promise.then(() => {\n // clearTimeout(timeout);\n this.checkAnimationContainer(element, this.lazyLoadQueue.intersector.isVisible(element));\n });\n\n /* let timeout = window.setTimeout(() => {\n console.error('processVisibleDiv timeout', div, doc);\n }, 1e3); */\n\n return promise;\n };\n\n public processInvisible = async(element: HTMLElement) => {\n const docId = element.dataset.docId;\n const doc = await this.managers.appDocsManager.getDoc(docId);\n\n // console.log('STICKER INvisible:', /* div, */docId);\n\n this.checkAnimationContainer(element, false);\n\n element.textContent = '';\n this.renderSticker(doc, element as HTMLDivElement);\n };\n}\n\nexport type StickersTabCategoryItem = {element: HTMLElement};\n\nexport class StickersTabCategory = {}> {\n public elements: {\n container: HTMLElement,\n title: HTMLElement,\n items: HTMLElement,\n menuTab: HTMLElement,\n menuTabPadding: HTMLElement\n } & AdditionalElements;\n public items: Item[];\n public mounted: boolean;\n public id: string;\n public limit: number;\n\n public getContainerSize: () => {width: number, height: number};\n private getElementMediaSize: () => MediaSize;\n\n private gapX: number;\n private gapY: number;\n\n public set?: StickerSet;\n public local?: boolean;\n public menuScroll?: ScrollableX;\n\n constructor(options: {\n id: string,\n title: HTMLElement | DocumentFragment,\n overflowElement: HTMLElement,\n getContainerSize: StickersTabCategory['getContainerSize'],\n getElementMediaSize: StickersTabCategory['getElementMediaSize'],\n gapX: number,\n gapY: number,\n noMenuTab?: boolean\n }) {\n const container = document.createElement('div');\n container.classList.add('emoji-category');\n\n const items = document.createElement('div');\n items.classList.add('category-items');\n\n let title: HTMLElement;\n if(options.title) {\n title = document.createElement('div');\n title.classList.add('category-title');\n title.append(options.title);\n }\n\n let menuTab: HTMLElement, menuTabPadding: HTMLElement;\n if(!options.noMenuTab) {\n menuTab = ButtonIcon(undefined, {noRipple: true});\n menuTab.classList.add('menu-horizontal-div-item');\n\n menuTabPadding = document.createElement('div');\n menuTabPadding.classList.add('menu-horizontal-div-item-padding');\n\n menuTab.append(menuTabPadding);\n }\n\n if(title) container.append(title);\n container.append(items);\n\n this.elements = {\n container,\n title,\n items,\n menuTab,\n menuTabPadding\n } as any;\n this.id = options.id;\n this.items = [];\n\n this.getContainerSize = options.getContainerSize;\n this.getElementMediaSize = options.getElementMediaSize;\n this.gapX = options.gapX ?? 0;\n this.gapY = options.gapY ?? 0;\n }\n\n public setCategoryItemsHeight() {\n const {width: containerWidth} = this.getContainerSize();\n const elementSize = this.getElementMediaSize().width;\n\n let itemsPerRow = containerWidth / elementSize;\n if(this.gapX) itemsPerRow -= Math.floor(itemsPerRow - 1) * this.gapX / elementSize;\n itemsPerRow = Math.floor(itemsPerRow);\n\n const rows = Math.ceil(this.items.length / itemsPerRow);\n let height = rows * elementSize;\n if(this.gapY) height += (rows - 1) * this.gapY;\n\n this.elements.items.style.minHeight = height + 'px';\n }\n}\n\nexport class EmoticonsTabC> implements EmoticonsTab {\n public content: HTMLElement;\n public menuScroll: ScrollableX;\n public container: HTMLElement;\n public menuWrapper: HTMLElement;\n public menu: HTMLElement;\n\n protected categories: {[id: string]: Category};\n protected categoriesMap: Map;\n protected categoriesByMenuTabMap: Map;\n protected categoriesIntersector: VisibilityIntersector;\n protected localCategories: Category[];\n\n protected listenerSetter: ListenerSetter;\n\n public scrollable: Scrollable;\n protected mounted = false;\n protected menuOnClickResult: ReturnType;\n\n public tabId: number;\n\n protected postponedEvents: {cb: AnyFunction, args: any[]}[];\n\n public getContainerSize: Category['getContainerSize'];\n\n constructor(\n protected managers: AppManagers,\n protected categoryItemsClassName: string,\n protected getElementMediaSize: () => MediaSize,\n protected padding: number,\n protected gapX: number,\n protected gapY: number\n ) {\n this.categories = {};\n this.categoriesMap = new Map();\n this.categoriesByMenuTabMap = new Map();\n this.localCategories = [];\n this.postponedEvents = [];\n\n this.listenerSetter = new ListenerSetter();\n\n this.container = document.createElement('div');\n this.container.classList.add('tabs-tab', 'emoticons-container');\n\n this.menuWrapper = document.createElement('div');\n this.menuWrapper.classList.add('menu-wrapper', 'emoticons-menu-wrapper');\n\n this.menu = document.createElement('nav');\n this.menu.className = 'menu-horizontal-div no-stripe justify-start emoticons-menu';\n\n this.menuWrapper.append(this.menu);\n this.menuScroll = new ScrollableX(this.menuWrapper);\n\n this.content = document.createElement('div');\n this.content.classList.add('emoticons-content');\n\n this.container.append(this.menuWrapper, this.content);\n\n this.scrollable = new Scrollable(this.content, 'STICKERS');\n }\n\n public getCategoryByContainer(container: HTMLElement) {\n return this.categoriesMap.get(container);\n }\n\n public getCategoryByMenuTab(menuTab: HTMLElement) {\n return this.categoriesByMenuTabMap.get(menuTab);\n }\n\n protected createCategory(stickerSet: StickerSet, title: HTMLElement | DocumentFragment, isLocal?: boolean, noMenuTab?: boolean) {\n const category: Category = new StickersTabCategory({\n id: '' + stickerSet.id,\n title,\n overflowElement: this.content,\n getContainerSize: () => {\n let width: number, height: number;\n if(this.getContainerSize) {\n const size = this.getContainerSize();\n width = size.width;\n height = size.height;\n } else {\n const esgWidth = customProperties.getPropertyAsSize('esg-width');\n width = esgWidth === undefined ? windowSize.width : esgWidth;\n }\n\n return {width: width - this.padding, height};\n },\n getElementMediaSize: this.getElementMediaSize,\n gapX: this.gapX,\n gapY: this.gapY,\n noMenuTab\n }) as any;\n\n if(this.categoryItemsClassName) {\n category.elements.items.classList.add(this.categoryItemsClassName);\n }\n\n const container = category.elements.container;\n container.classList.add('hide');\n\n category.set = stickerSet;\n this.categories[stickerSet.id] = category;\n this.categoriesMap.set(container, category);\n !noMenuTab && this.categoriesByMenuTabMap.set(category.elements.menuTab, category);\n\n this.categoriesIntersector.observe(container);\n !noMenuTab && this.menuOnClickResult.stickyIntersector.observeStickyHeaderChanges(container);\n\n if(!isLocal) {\n !noMenuTab && category.elements.menuTab.classList.add('not-local');\n }\n\n return category;\n }\n\n protected positionCategory(category: Category, prepend?: boolean) {\n const {menuTab, container} = category.elements;\n const posItems = prepend ? this.localCategories.filter((category) => category.mounted).length : 0xFFFF;\n let foundMenuScroll = false;\n const posMenu = prepend ? this.localCategories.filter((category) => {\n if(category.menuScroll && !foundMenuScroll) {\n foundMenuScroll = true;\n return true;\n }\n\n return category.mounted && !category.menuScroll && category.elements.menuTab;\n }).length : 0xFFFF;\n positionElementByIndex(container, this.scrollable.container, posItems);\n positionElementByIndex(menuTab, this.menu, posMenu);\n }\n\n protected isCategoryVisible(category: Category) {\n return this.categoriesIntersector.getVisible().includes(category.elements.container);\n }\n\n protected toggleLocalCategory(category: Category, visible: boolean) {\n if(!visible) {\n category.elements.menuTab?.remove();\n category.elements.container.remove();\n } else {\n const idx = this.localCategories.indexOf(category);\n const sliced = this.localCategories.slice(0, idx);\n let notMountedItems = 0, notMountedMenus = 0;\n sliced.forEach((category) => {\n if(!category.mounted) {\n ++notMountedItems;\n ++notMountedMenus;\n } else if(!category.elements.menuTab || category.menuScroll) {\n ++notMountedMenus;\n }\n });\n const itemsIdx = idx - notMountedItems, menuIdx = idx - notMountedMenus;\n category.elements.menuTab && positionElementByIndex(category.elements.menuTab, this.menu, menuIdx);\n positionElementByIndex(category.elements.container, this.scrollable.container, itemsIdx);\n }\n\n category.mounted = visible;\n // category.elements.container.classList.toggle('hide', !visible);\n }\n\n protected createLocalCategory(id: string, title: LangPackKey | '', icon?: string, noMenuTab?: boolean) {\n const category = this.createCategory({id} as any, title && i18n(title), true, noMenuTab);\n category.local = true;\n this.localCategories.push(category);\n if(category.elements.title) {\n category.elements.title.classList.add('disable-hover');\n }\n\n if(!noMenuTab) {\n if(icon) {\n category.elements.menuTab.classList.add('tgico', 'tgico-' + icon);\n }\n\n category.elements.menuTabPadding.remove();\n }\n\n this.toggleLocalCategory(category, false);\n return category;\n }\n\n protected onLocalCategoryUpdate(category: Category) {\n category.setCategoryItemsHeight();\n this.toggleLocalCategory(category, !!category.items.length);\n }\n\n protected resizeCategories = () => {\n for(const [container, category] of this.categoriesMap) {\n category.setCategoryItemsHeight();\n }\n };\n\n protected deleteCategory(category: Category) {\n if(category) {\n category.elements.container.remove();\n category.elements.menuTab.remove();\n this.categoriesIntersector.unobserve(category.elements.container);\n delete this.categories[category.id];\n this.categoriesMap.delete(category.elements.container);\n this.categoriesByMenuTabMap.delete(category.elements.menuTab);\n\n return true;\n }\n\n return false;\n }\n\n protected spliceExceed(category: Category) {\n if(category.limit === undefined) {\n return false;\n }\n\n const {items, limit} = category;\n items.splice(limit, items.length - limit).forEach(({element}) => {\n element.remove();\n });\n\n this.onLocalCategoryUpdate(category);\n\n return true;\n }\n\n public init() {\n this.listenerSetter.add(emoticonsDropdown)('closed', () => {\n this.postponedEvents.forEach(({cb, args}) => {\n cb(...args);\n });\n\n this.postponedEvents.length = 0;\n });\n }\n\n public destroy() {\n this.getContainerSize = undefined;\n this.postponedEvents.length = 0;\n this.categoriesIntersector?.disconnect();\n this.listenerSetter.removeAll();\n this.scrollable.destroy();\n this.menuScroll?.destroy();\n this.menuOnClickResult?.stickyIntersector?.disconnect();\n }\n\n protected postponedEvent = (cb: (...args: K[]) => void) => {\n return (...args: K[]) => {\n if(emoticonsDropdown.isActive()) {\n this.postponedEvents.push({cb, args});\n } else {\n cb(...args);\n }\n };\n };\n}\n\ntype StickersTabItem = {element: HTMLElement, document: Document.document};\nexport default class StickersTab extends EmoticonsTabC> {\n private superStickerRenderer: SuperStickerRenderer;\n\n constructor(managers: AppManagers) {\n super(\n managers,\n 'super-stickers',\n () => mediaSizes.active.esgSticker,\n 3 * 2,\n 4,\n 4\n );\n\n this.container.classList.add('stickers-padding');\n this.content.id = 'content-stickers';\n }\n\n private setFavedLimit(limit: number) {\n const category = this.categories['faved'];\n category.limit = limit;\n }\n\n private categoryAppendStickers(\n category: StickersTabCategory,\n promise: Promise\n ) {\n const {container} = category.elements;\n\n promise.then((documents) => {\n const isVisible = this.isCategoryVisible(category);\n\n documents.forEach((document) => {\n const element = this.superStickerRenderer.renderSticker(document);\n category.items.push({document, element});\n\n if(isVisible) {\n category.elements.items.append(element);\n }\n });\n\n category.setCategoryItemsHeight();\n container.classList.remove('hide');\n });\n }\n\n private async renderStickerSet(set: StickerSet.stickerSet, prepend = false) {\n const category = this.createCategory(set, wrapEmojiText(set.title));\n const {menuTabPadding} = category.elements;\n\n const promise = this.managers.appStickersManager.getStickerSet(set);\n this.categoryAppendStickers(\n category,\n promise.then((stickerSet) => stickerSet.documents as MyDocument[])\n );\n\n this.positionCategory(category, prepend);\n\n wrapStickerSetThumb({\n set,\n container: menuTabPadding,\n group: EMOTICONSSTICKERGROUP,\n lazyLoadQueue: EmoticonsDropdown.lazyLoadQueue,\n width: 32,\n height: 32,\n autoplay: false\n });\n }\n\n private onCategoryVisibility = ({target, visible, entry}: OnVisibilityChangeItem) => {\n const category = this.categoriesMap.get(target);\n category.elements.items.replaceChildren(...(!visible ? [] : category.items.map(({element}) => element)));\n };\n\n public init() {\n super.init();\n\n this.scrollable.onAdditionalScroll = () => {\n this.setTyping();\n };\n\n /* stickersDiv.addEventListener('mouseover', (e) => {\n let target = e.target as HTMLElement;\n\n if(target.tagName === 'CANVAS') { // turn on sticker\n let animation = lottieLoader.getAnimation(target.parentElement, EMOTICONSSTICKERGROUP);\n\n if(animation) {\n // @ts-ignore\n if(animation.currentFrame === animation.totalFrames - 1) {\n animation.goToAndPlay(0, true);\n } else {\n animation.play();\n }\n }\n }\n }); */\n\n const intersectionOptions: IntersectionObserverInit = {root: emoticonsDropdown.getElement()};\n this.categoriesIntersector = new VisibilityIntersector(this.onCategoryVisibility, intersectionOptions);\n\n const clearCategoryItems = (category: StickersTabCategory) => {\n category.elements.items.replaceChildren();\n category.items.forEach(({element}) => this.superStickerRenderer.unobserveAnimated(element));\n category.items.length = 0;\n };\n\n this.scrollable.container.addEventListener('click', (e) => {\n const target = e.target as HTMLElement;\n if(findUpClassName(target, 'category-title')) {\n const container = findUpClassName(target, 'emoji-category');\n const category = this.categoriesMap.get(container);\n if(category.local) {\n return;\n }\n\n new PopupStickers({id: category.set.id, access_hash: category.set.access_hash}).show();\n return;\n }\n\n EmoticonsDropdown.onMediaClick(e);\n });\n\n this.menuOnClickResult = EmoticonsDropdown.menuOnClick(this, this.menu, this.scrollable, this.menuScroll);\n\n const preloader = putPreloader(this.content, true);\n\n const onCategoryStickers = (category: StickersTabCategory, stickers: MyDocument[]) => {\n // if(category.id === 'faved' && category.limit && category.limit < stickers.length) {\n // category.limit = stickers.length;\n // }\n\n if(category.limit) {\n stickers = stickers.slice(0, category.limit);\n }\n\n const ids = new Set(stickers.map((doc) => doc.id));\n forEachReverse(category.items, (item) => {\n if(!ids.has(item.document.id)) {\n this.deleteSticker(category, item.document, true);\n }\n });\n\n this.toggleLocalCategory(category, !!stickers.length);\n forEachReverse(stickers, (doc, idx) => {\n this.unshiftSticker(category, doc, true, idx);\n });\n this.spliceExceed(category);\n category.elements.container.classList.remove('hide');\n };\n\n const favedCategory = this.createLocalCategory('faved', 'FavoriteStickers', 'savedmessages');\n // favedCategory.elements.menuTab.classList.add('active');\n\n const recentCategory = this.createLocalCategory('recent', 'Stickers.Recent', 'recent');\n recentCategory.limit = 20;\n\n const clearButton = ButtonIcon('close', {noRipple: true});\n recentCategory.elements.title.append(clearButton);\n attachClickEvent(clearButton, () => {\n confirmationPopup({\n titleLangKey: 'ClearRecentStickersAlertTitle',\n descriptionLangKey: 'ClearRecentStickersAlertMessage',\n button: {\n langKey: 'Clear'\n }\n }).then(() => {\n this.managers.appStickersManager.clearRecentStickers();\n }, noop);\n });\n\n const premiumCategory = this.createLocalCategory('premium', 'PremiumStickersShort');\n const s = document.createElement('span');\n s.classList.add('tgico-star', 'color-premium');\n premiumCategory.elements.menuTab.append(s);\n\n const promises = [\n Promise.all([\n this.managers.apiManager.getLimit('favedStickers'),\n this.managers.appStickersManager.getFavedStickersStickers()\n ]).then(([limit, stickers]) => {\n this.setFavedLimit(limit);\n onCategoryStickers(favedCategory, stickers);\n }),\n\n this.managers.appStickersManager.getRecentStickersStickers().then((stickers) => {\n onCategoryStickers(recentCategory, stickers);\n }),\n\n this.managers.appStickersManager.getAllStickers().then((res) => {\n for(const set of (res as MessagesAllStickers.messagesAllStickers).sets) {\n this.renderStickerSet(set);\n }\n }),\n\n this.managers.appStickersManager.getPremiumStickers().then((stickers) => {\n const length = stickers.length;\n this.toggleLocalCategory(premiumCategory, rootScope.premium && !!length);\n this.categoryAppendStickers(premiumCategory, Promise.resolve(stickers));\n\n rootScope.addEventListener('premium_toggle', (isPremium) => {\n this.toggleLocalCategory(this.categories['premium'], isPremium && !!length);\n });\n })\n ];\n\n Promise.race(promises).finally(() => {\n preloader.remove();\n });\n\n Promise.all(promises).finally(() => {\n this.mounted = true;\n this.setTyping();\n\n const favedCategory = this.categories['faved'];\n const recentCategory = this.categories['recent'];\n this.menuOnClickResult.setActive(favedCategory.items.length ? favedCategory : recentCategory);\n\n rootScope.addEventListener('stickers_installed', (set) => {\n if(!this.categories[set.id]) {\n this.renderStickerSet(set, true);\n }\n });\n });\n\n this.superStickerRenderer = new SuperStickerRenderer(EmoticonsDropdown.lazyLoadQueue, EMOTICONSSTICKERGROUP, this.managers, intersectionOptions);\n\n const rendererLazyLoadQueue = this.superStickerRenderer.lazyLoadQueue;\n emoticonsDropdown.addLazyLoadQueueRepeat(rendererLazyLoadQueue, this.superStickerRenderer.processInvisible);\n\n // emoticonsDropdown.addEventListener('close', () => {\n // this.categoriesIntersector.lock();\n // });\n\n // emoticonsDropdown.addEventListener('closed', () => {\n // for(const [container] of this.categoriesMap) {\n // onCategoryVisibility(container, false);\n // }\n // });\n\n // emoticonsDropdown.addEventListener('opened', () => {\n // this.categoriesIntersector.unlockAndRefresh();\n // });\n\n // setInterval(() => {\n // // @ts-ignore\n // const players = Object.values(lottieLoader.players).filter((p) => p.width >= 80);\n\n // console.log(\n // 'STICKERS RENDERED IN PANEL:',\n // players.length,\n // players.filter((p) => !p.paused).length,\n // rendererLazyLoadQueue.intersector.getVisible().length\n // );\n // }, .25e3);\n\n rootScope.addEventListener('sticker_updated', ({type, document, faved}) => {\n // if(type === 'faved') {\n // return;\n // }\n\n const category = this.categories[type === 'faved' ? 'faved' : 'recent'];\n if(category) {\n if(faved) {\n this.unshiftSticker(category, document);\n } else {\n this.deleteSticker(category, document);\n }\n }\n });\n\n rootScope.addEventListener('stickers_deleted', ({id}) => {\n const category = this.categories[id];\n if(this.deleteCategory(category)) {\n clearCategoryItems(category);\n }\n });\n\n rootScope.addEventListener('stickers_top', this.postponedEvent((id) => {\n const category = this.categories[id];\n if(category) {\n this.positionCategory(category, true);\n emoticonsDropdown.addEventListener('openAfterLayout', () => {\n this.menuOnClickResult.setActiveStatic(category);\n }, {once: true});\n }\n }));\n\n rootScope.addEventListener('stickers_updated', ({type, stickers}) => {\n const category = this.categories[type === 'faved' ? 'faved' : 'recent'];\n if(category) {\n onCategoryStickers(category, stickers);\n }\n });\n\n rootScope.addEventListener('app_config', () => {\n this.managers.apiManager.getLimit('favedStickers').then((limit) => {\n this.setFavedLimit(limit);\n });\n });\n\n mediaSizes.addEventListener('resize', this.resizeCategories);\n\n attachStickerViewerListeners({listenTo: this.content, listenerSetter: new ListenerSetter()});\n\n const type: IgnoreMouseOutType = 'menu';\n createStickersContextMenu({\n listenTo: this.content,\n verifyRecent: (target) => !!findUpAsChild(target, this.categories['recent'].elements.items),\n onOpen: () => {\n emoticonsDropdown.setIgnoreMouseOut(type, true);\n },\n onClose: () => {\n emoticonsDropdown.setIgnoreMouseOut(type, false);\n }\n });\n\n this.init = null;\n }\n\n public deleteSticker(category: StickersTabCategory, doc: MyDocument, batch?: boolean) {\n const item = findAndSplice(category.items, (item) => item.document.id === doc.id);\n if(item) {\n item.element.remove();\n\n if(!batch) {\n this.onLocalCategoryUpdate(category);\n }\n }\n }\n\n public unshiftSticker(category: StickersTabCategory, doc: MyDocument, batch?: boolean, idx?: number) {\n if(idx !== undefined) {\n const i = category.items[idx];\n if(i && i.document.id === doc.id) {\n return;\n }\n }\n\n let item = findAndSplice(category.items, (item) => item.document.id === doc.id);\n if(!item) {\n item = {\n element: this.superStickerRenderer.renderSticker(doc),\n document: doc\n };\n }\n\n category.items.unshift(item);\n category.elements.items.prepend(item.element);\n\n if(!batch) {\n this.spliceExceed(category);\n }\n }\n\n public unshiftRecentSticker(doc: MyDocument) {\n this.managers.appStickersManager.saveRecentSticker(doc.id);\n }\n\n public deleteRecentSticker(doc: MyDocument) {\n this.managers.appStickersManager.saveRecentSticker(doc.id, true);\n }\n\n public setTyping = (cancel = false) => {\n if(!cancel && (!emoticonsDropdown.isActive() || emoticonsDropdown.tab !== this)) {\n return;\n }\n\n rootScope.dispatchEvent('choosing_sticker', !cancel);\n };\n\n public onClosed() {\n this.setTyping(true);\n }\n\n public onOpened() {\n this.setTyping();\n this.resizeCategories();\n }\n}\n","export const generateDelimiter = () => {\n const delimiter = document.createElement('div');\n delimiter.classList.add('gradient-delimiter');\n return delimiter;\n};\n","import {_i18n} from '../lib/langPack';\n\nexport default function generateFakeIcon(isScam?: boolean) {\n const span = document.createElement('span');\n span.classList.add('badge-fake');\n _i18n(span, isScam ? 'ScamMessage' : 'FakeMessage');\n return span;\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 findAndSpliceAll from '../helpers/array/findAndSpliceAll';\nimport LazyLoadQueueIntersector, {LazyLoadElement} from './lazyLoadQueueIntersector';\nimport VisibilityIntersector, {OnVisibilityChange} from './visibilityIntersector';\n\nexport default class LazyLoadQueueRepeat2 extends LazyLoadQueueIntersector {\n constructor(parallelLimit?: number, protected onVisibilityChange?: OnVisibilityChange) {\n super(parallelLimit);\n\n this.intersector = new VisibilityIntersector((item) => {\n const {target, visible} = item;\n const spliced = findAndSpliceAll(this.queue, (i) => i.div === target);\n if(visible && spliced.length) {\n spliced.forEach((item) => {\n this.queue.unshift(item);\n });\n }\n\n this.onVisibilityChange && this.onVisibilityChange(item);\n this.setProcessQueueTimeout();\n });\n }\n\n public observe(el: LazyLoadElement) {\n super.observe(el);\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 {MyDocument} from '../lib/appManagers/appDocsManager';\nimport animationIntersector, {AnimationItemGroup} from './animationIntersector';\nimport Scrollable from './scrollable';\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport calcImageInBox from '../helpers/calcImageInBox';\nimport {doubleRaf} from '../helpers/schedulers';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport rootScope from '../lib/rootScope';\nimport LazyLoadQueueRepeat2 from './lazyLoadQueueRepeat2';\nimport wrapVideo from './wrappers/video';\nimport noop from '../helpers/noop';\n\nconst width = 400;\nconst maxSingleWidth = width - 100;\nconst height = 100;\n\nexport default class GifsMasonry {\n public lazyLoadQueue: LazyLoadQueueRepeat2;\n private scrollPromise: CancellablePromise = Promise.resolve();\n private timeout: number = 0;\n private managers: AppManagers;\n\n constructor(\n private element: HTMLElement,\n private group: AnimationItemGroup,\n private scrollable: Scrollable,\n attach = true\n ) {\n this.managers = rootScope.managers;\n\n this.lazyLoadQueue = new LazyLoadQueueRepeat2(undefined, ({target, visible}) => {\n if(visible) {\n this.processVisibleDiv(target);\n } else {\n this.processInvisibleDiv(target);\n }\n });\n\n /* setInterval(() => {\n // @ts-ignore\n const players = animationIntersector.byGroups[group];\n\n if(players) {\n console.log(`GIFS RENDERED IN ${group}:`, players.length, players.filter((p) => !p.animation.paused).length, this.lazyLoadQueue.intersector.getVisible().length);\n }\n }, .25e3); */\n\n if(attach) {\n this.attach();\n }\n }\n\n private onScroll = () => {\n if(this.timeout) {\n clearTimeout(this.timeout);\n } else {\n this.scrollPromise = deferredPromise();\n // animationIntersector.checkAnimations(true, group);\n }\n\n this.timeout = window.setTimeout(() => {\n this.timeout = 0;\n this.scrollPromise.resolve();\n // animationIntersector.checkAnimations(false, group);\n }, 150);\n };\n\n public attach() {\n this.scrollable.container.addEventListener('scroll', this.onScroll);\n }\n\n public detach() {\n this.clear();\n this.scrollable.container.removeEventListener('scroll', this.onScroll);\n }\n\n public clear() {\n this.lazyLoadQueue.clear();\n }\n\n private processVisibleDiv(div: HTMLElement) {\n const video = div.querySelector('video');\n if(video) {\n return;\n }\n\n const load = () => {\n const docId = div.dataset.docId;\n const promise = Promise.all([this.managers.appDocsManager.getDoc(docId), this.scrollPromise]).then(async([doc]) => {\n const res = await wrapVideo({\n doc,\n container: div as HTMLDivElement,\n lazyLoadQueue: null,\n // lazyLoadQueue: EmoticonsDropdown.lazyLoadQueue,\n group: this.group,\n noInfo: true,\n noPreview: true\n });\n\n const promise = res.loadPromise;\n promise.finally(() => {\n const video = div.querySelector('video');\n const thumb = div.querySelector('img, canvas');\n\n // div.style.opacity = '';\n thumb && thumb.classList.add('hide');\n\n if(video && !video.parentElement) {\n setTimeout(() => {\n video.src = '';\n video.load();\n const animations = animationIntersector.getAnimations(video);\n animations.forEach((item) => {\n animationIntersector.removeAnimation(item);\n });\n }, 0);\n }\n\n // clearTimeout(timeout);\n if(!this.lazyLoadQueue.intersector.isVisible(div)) {\n this.processInvisibleDiv(div);\n }\n });\n\n return promise;\n });\n\n /* let timeout = window.setTimeout(() => {\n console.error('processVisibleDiv timeout', div, doc);\n }, 1e3); */\n\n return promise;\n };\n\n // return load();\n\n this.lazyLoadQueue.push({div, load});\n }\n\n public processInvisibleDiv = (div: HTMLElement) => {\n return this.scrollPromise.then(async() => {\n // return;\n\n if(this.lazyLoadQueue.intersector.isVisible(div)) {\n return;\n }\n\n const video = div.querySelector('video');\n const thumb = div.querySelector('img, canvas');\n\n if(thumb) {\n thumb.classList.remove('hide');\n\n await doubleRaf();\n }\n\n if(this.lazyLoadQueue.intersector.isVisible(div)) {\n return;\n }\n\n if(video) {\n video.remove();\n video.src = '';\n video.load();\n const animations = animationIntersector.getAnimations(video);\n animations.forEach((item) => {\n animationIntersector.removeAnimation(item);\n });\n }\n });\n };\n\n public add(doc: MyDocument, appendTo = this.element) {\n // let gifWidth = doc.w;\n // let gifHeight = doc.h;\n // if(gifHeight < height) {\n // gifWidth = height / gifHeight * gifWidth;\n // gifHeight = height;\n // }\n\n // const willUseWidth = Math.min(maxSingleWidth, width, gifWidth);\n // const size = calcImageInBox(gifWidth, gifHeight, willUseWidth, height);\n\n const div = document.createElement('div');\n div.classList.add('gif', 'grid-item'/* , 'fade-in-transition' */);\n // div.style.width = size.width + 'px';\n // div.style.opacity = '0';\n // div.style.height = h + 'px';\n div.dataset.docId = '' + doc.id;\n\n appendTo.append(div);\n\n this.lazyLoadQueue.observe({div, load: noop as any});\n\n // let preloader = new ProgressivePreloader(div);\n\n wrapVideo({\n doc,\n container: div as HTMLDivElement,\n lazyLoadQueue: null,\n noInfo: true,\n onlyPreview: true\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 TransitionSlider from './transition';\nimport {ScrollableX} from './scrollable';\nimport rootScope from '../lib/rootScope';\nimport {fastRaf} from '../helpers/schedulers';\nimport {FocusDirection} from '../helpers/fastSmoothScroll';\nimport findUpAsChild from '../helpers/dom/findUpAsChild';\nimport whichChild from '../helpers/dom/whichChild';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\n\nexport function horizontalMenu(\n tabs: HTMLElement,\n content: HTMLElement,\n onClick?: (id: number, tabContent: HTMLDivElement, animate: boolean) => void | boolean | Promise,\n onTransitionEnd?: () => void,\n transitionTime = 200,\n scrollableX?: ScrollableX,\n listenerSetter?: ListenerSetter\n) {\n const selectTab = TransitionSlider({\n content,\n type: tabs || content.dataset.animation === 'tabs' ? 'tabs' : 'navigation',\n transitionTime,\n onTransitionEnd,\n listenerSetter\n });\n\n if(!tabs) {\n return selectTab;\n }\n\n const proxy = new Proxy(selectTab, {\n apply: (target, that, args) => {\n const id = +args[0];\n const animate = args[1] !== undefined ? args[1] : true;\n\n const el = (tabs.querySelector(`[data-tab=\"${id}\"]`) || tabs.children[id]) as HTMLElement;\n selectTarget(el, id, animate);\n }\n });\n\n const selectTarget = async(target: HTMLElement, id: number, animate = true) => {\n const tabContent = content.children[id] as HTMLDivElement;\n\n if(onClick) {\n const result1 = onClick(id, tabContent, animate);\n const canChange = result1 instanceof Promise ? await result1 : result1;\n if(canChange !== undefined && !canChange) {\n return;\n }\n }\n\n if(scrollableX) {\n scrollableX.scrollIntoViewNew({\n element: target.parentElement.children[id] as HTMLElement,\n position: 'center',\n forceDirection: animate ? undefined : FocusDirection.Static,\n forceDuration: transitionTime,\n axis: 'x'\n });\n }\n\n if(!rootScope.settings.animationsEnabled) {\n animate = false;\n }\n\n const prevId = selectTab.prevId();\n if(target.classList.contains('active') || id === prevId) {\n return false;\n }\n\n const mutateCallback = animate ? fastRaf : (cb: () => void) => cb();\n\n const prev = tabs.querySelector(tagName.toLowerCase() + '.active') as HTMLElement;\n if(prev) {\n mutateCallback(() => {\n prev.classList.remove('active');\n });\n }\n\n // a great stripe from Jolly Cobra\n if(useStripe && prevId !== -1 && animate) {\n mutateCallback(() => {\n const indicator = target.querySelector('i')!;\n const currentIndicator = target.parentElement.children[prevId].querySelector('i')!;\n\n currentIndicator.classList.remove('animate');\n indicator.classList.remove('animate');\n\n // We move and resize our indicator so it repeats the position and size of the previous one.\n const shiftLeft = currentIndicator.parentElement.parentElement.offsetLeft - indicator.parentElement.parentElement.offsetLeft;\n const scaleFactor = currentIndicator.clientWidth / indicator.clientWidth;\n indicator.style.transform = `translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`;\n\n // console.log(`translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`);\n\n fastRaf(() => {\n // Now we remove the transform to let it animate to its own position and size.\n indicator.classList.add('animate');\n indicator.style.transform = 'none';\n });\n });\n }\n\n mutateCallback(() => {\n target.classList.add('active');\n });\n\n selectTab(id, animate);\n };\n\n const useStripe = !tabs.classList.contains('no-stripe');\n\n // const tagName = tabs.classList.contains('menu-horizontal-div') ? 'BUTTON' : 'LI';\n const tagName = tabs.firstElementChild.tagName;\n attachClickEvent(tabs, (e) => {\n let target = e.target as HTMLElement;\n\n target = findUpAsChild(target, tabs);\n\n // console.log('tabs click:', target);\n\n if(!target) return false;\n\n let id: number;\n if(target.dataset.tab) {\n id = +target.dataset.tab;\n if(id === -1) {\n return false;\n }\n } else {\n id = whichChild(target);\n }\n\n selectTarget(target, id);\n }, {listenerSetter});\n\n return proxy;\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 simulateEvent from '../helpers/dom/dispatchEvent';\nimport documentFragmentToHTML from '../helpers/dom/documentFragmentToHTML';\nimport findUpAttribute from '../helpers/dom/findUpAttribute';\nimport findUpTag from '../helpers/dom/findUpTag';\nimport getCaretPosNew from '../helpers/dom/getCaretPosNew';\nimport getRichValueWithCaret from '../helpers/dom/getRichValueWithCaret';\nimport isInputEmpty from '../helpers/dom/isInputEmpty';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport RichInputHandler, {USING_BOMS} from '../helpers/dom/richInputHandler';\nimport selectElementContents from '../helpers/dom/selectElementContents';\nimport setInnerHTML, {setDirection} from '../helpers/dom/setInnerHTML';\nimport {MessageEntity} from '../layer';\nimport {i18n, LangPackKey, _i18n} from '../lib/langPack';\nimport {NULL_PEER_ID} from '../lib/mtproto/mtproto_config';\nimport mergeEntities from '../lib/richTextProcessor/mergeEntities';\nimport parseEntities from '../lib/richTextProcessor/parseEntities';\nimport wrapDraftText from '../lib/richTextProcessor/wrapDraftText';\nimport {createCustomFiller, CustomEmojiElement, CustomEmojiRendererElement, insertCustomFillers, renderEmojis} from '../lib/richTextProcessor/wrapRichText';\n\nexport async function insertRichTextAsHTML(input: HTMLElement, text: string, entities: MessageEntity[], wrappingForPeerId: PeerId) {\n const loadPromises: Promise[] = [];\n const wrappingCustomEmoji = entities?.some((entity) => entity._ === 'messageEntityCustomEmoji');\n const renderer = wrappingCustomEmoji ? createCustomEmojiRendererForInput() : undefined;\n const fragment = wrapDraftText(text, {entities, wrappingForPeerId, loadPromises, customEmojiRenderer: renderer});\n const something = fragment.querySelectorAll('[contenteditable=\"false\"]');\n something.forEach((el) => {\n el.contentEditable = 'inherit';\n el.classList.add('pc');\n });\n\n loadPromises.length && await Promise.all(loadPromises);\n\n fragment.querySelectorAll('.input-selectable').forEach((el) => {\n el.prepend(createCustomFiller(true));\n });\n\n const richInputHandler = USING_BOMS ? RichInputHandler.getInstance() : undefined;\n // const restore = richInputHandler.prepareApplyingMarkdown();\n\n // fragment.querySelectorAll('.input-filler').forEach((el) => el.remove());\n\n // const fillers = Array.from(input.querySelectorAll('.input-filler')).map((el) => {\n // el.contentEditable = 'false';\n // return el;\n // });\n\n const customEmojiElements = Array.from(fragment.querySelectorAll('.custom-emoji-placeholder')).map((el) => {\n el.dataset.ces = '1';\n return (el as any).customEmojiElement as CustomEmojiElement;\n });\n\n const html = documentFragmentToHTML(fragment);\n renderer?.destroy();\n\n // console.log(html);\n\n const pre = getCaretPosNew(input);\n // console.log('pre', pre);\n let textNode: ChildNode, textNodeValue: string;\n if(pre.node) {\n // if(pre.node?.nodeValue === BOM && false) {\n // textNode = document.createTextNode(textNodeValue = BOM);\n // (pre.node.parentNode as any as ChildNode).after(textNode);\n // pre.selection.modify('extend', 'forward', 'character');\n // pre.selection.collapseToEnd();\n // }\n } else {\n const range = document.createRange();\n let node = input.lastChild;\n if(!node) {\n input.append(node /* = textNode */ = document.createTextNode(''));\n }\n\n range.setStartAfter(node);\n range.collapse(true);\n pre.selection.removeAllRanges();\n pre.selection.addRange(range);\n }\n\n // const fragmentLastChild = fragment.lastChild;\n\n // const s = document.createElement('span');\n // (node as ChildNode).replaceWith(s);\n // s.append(node);\n input.addEventListener('input', cancelEvent, {capture: true, once: true, passive: false});\n richInputHandler?.onBeforeInput({inputType: 'insertContent'});\n window.document.execCommand('insertHTML', false, html);\n Array.from(input.querySelectorAll('[data-ces]')).forEach((el, idx) => {\n delete el.dataset.ces;\n const customEmojiElement = customEmojiElements[idx];\n (el as any).customEmojiElement = customEmojiElement;\n customEmojiElement.placeholder = el;\n });\n // fillers.forEach((el) => {\n // el.contentEditable = 'inherit';\n // });\n input.querySelectorAll('.pc').forEach((el) => {\n el.contentEditable = 'false';\n });\n if(textNode) {\n const {nodeValue} = textNode;\n if(nodeValue === textNodeValue) {\n textNode.remove();\n } else {\n (textNode as CharacterData).replaceData(nodeValue.indexOf(textNodeValue), textNodeValue.length, '');\n }\n }\n // restore();\n richInputHandler?.removeExtraBOMs(input);\n simulateEvent(input, 'input');\n\n // if(textNode) {\n // const selection = document.getSelection();\n // const node = fragmentLastChild.nextSibling || fragmentLastChild;\n // const range = document.createRange();\n // range.setStartAfter(node);\n // range.collapse(true);\n // selection.removeAllRanges();\n // selection.addRange(range);\n // }\n\n // const after = getCaretPosNew(input);\n // console.log('after', after);\n // if(after.node?.nodeValue === BOM) {\n // const smth = findUpClassName(after.node.parentElement, 'input-something');\n // if(smth) {\n // const selection = document.getSelection();\n // const node = smth.nextSibling;\n // const range = document.createRange();\n // range.setStartAfter(node);\n // range.collapse(true);\n // selection.removeAllRanges();\n // selection.addRange(range);\n\n // // if(after.offset === 0) after.selection.modify('extend', 'forward', 'character');\n // // after.selection.modify('extend', 'forward', 'character');\n // // after.selection.collapseToEnd();\n // }\n // }\n\n // setCaretAt(fragmentLastChild.nextSibling);\n\n // console.log('ASD');\n}\n\nlet init = () => {\n document.addEventListener('paste', (e) => {\n const input = findUpAttribute(e.target, 'contenteditable=\"true\"');\n if(!input) {\n return;\n }\n\n const noLinebreaks = !!input.dataset.noLinebreaks;\n e.preventDefault();\n let text: string, entities: MessageEntity[];\n\n // @ts-ignore\n let plainText: string = (e.originalEvent || e).clipboardData.getData('text/plain');\n let usePlainText = true;\n\n // @ts-ignore\n let html: string = (e.originalEvent || e).clipboardData.getData('text/html');\n\n const filterEntity = (e: MessageEntity) => e._ === 'messageEntityEmoji' || (e._ === 'messageEntityLinebreak' && !noLinebreaks);\n if(noLinebreaks) {\n const regExp = /[\\r\\n]/g;\n plainText = plainText.replace(regExp, '');\n html = html.replace(regExp, '');\n }\n\n const peerId = (input.dataset.peerId || NULL_PEER_ID).toPeerId();\n if(html.trim()) {\n console.log(html.replace(/ (style|class|id)=\".+?\"/g, ''));\n\n html = html.replace(//, '');\n html = html.replace(//, '');\n html = html.replace('
', '');\n\n const match = html.match(/([\\s\\S]*)<\\/body>/);\n if(match) {\n html = match[1].trim();\n }\n\n // const s = cleanHTML(html, true) as NodeList;\n // console.log(s);\n\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n const span = doc.body || document.createElement('body');\n\n // const span: HTMLElement = document.createElement('span');\n // span.innerHTML = html;\n // span.append(...Array.from(s));\n\n let curChild = span.firstChild;\n while(curChild) { // * fix whitespace between elements like

asd

\\n

zxc

\n const nextSibling = curChild.nextSibling;\n if(curChild.nodeType === curChild.TEXT_NODE) {\n if(!curChild.nodeValue.trim()) {\n curChild.remove();\n }\n }\n\n curChild = nextSibling;\n }\n\n const richValue = getRichValueWithCaret(span, true, false);\n\n const canWrapCustomEmojis = !!peerId;\n if(!canWrapCustomEmojis) {\n richValue.entities = richValue.entities.filter((entity) => entity._ !== 'messageEntityCustomEmoji');\n }\n\n /* if(false) */ { // * fix extra new lines appearing from

(can have them from some sources, like macOS Terminal)\n const lines = richValue.value.split('\\n');\n let textLength = 0;\n for(let lineIndex = 0; lineIndex < lines.length; ++lineIndex) {\n const line = lines[lineIndex];\n textLength += line.length;\n\n const index = textLength;\n if(plainText[index] !== '\\n' && lineIndex !== (lines.length - 1)) {\n const nextLine = lines.splice(lineIndex + 1, 1)[0];\n lines[lineIndex] = line + nextLine;\n\n // fix entities\n richValue.entities.forEach((entity) => {\n if(entity.offset >= index) {\n entity.offset -= 1;\n }\n });\n\n textLength += nextLine.length;\n }\n\n textLength += 1;\n }\n\n const correctedText = lines.join('\\n');\n richValue.value = correctedText;\n }\n\n const richTextLength = richValue.value.replace(/\\s/g, '').length;\n const plainTextLength = plainText.replace(/\\s/g, '').length;\n if(richTextLength === plainTextLength ||\n richValue.entities.find((entity) => entity._ === 'messageEntityCustomEmoji')) {\n text = richValue.value;\n entities = richValue.entities;\n usePlainText = false;\n\n let entities2 = parseEntities(text);\n entities2 = entities2.filter(filterEntity);\n mergeEntities(entities, entities2);\n }\n\n console.log('usePlainText', usePlainText);\n }\n\n if(usePlainText) {\n text = plainText;\n entities = parseEntities(text);\n entities = entities.filter(filterEntity);\n }\n\n insertRichTextAsHTML(input, text, entities, peerId);\n });\n\n init = null;\n};\n\n// ! it doesn't respect symbols other than strongs\n/* const checkAndSetRTL = (input: HTMLElement) => {\n //const isEmpty = isInputEmpty(input);\n //console.log('input', isEmpty);\n\n //const char = [...getRichValue(input)][0];\n const char = (input instanceof HTMLInputElement ? input.value : input.innerText)[0];\n let direction = 'ltr';\n if(char && checkRTL(char)) {\n direction = 'rtl';\n }\n\n //console.log('RTL', direction, char);\n\n input.style.direction = direction;\n}; */\n\nexport enum InputState {\n Neutral = 0,\n Valid = 1,\n Error = 2\n};\n\nexport type InputFieldOptions = {\n placeholder?: LangPackKey,\n label?: LangPackKey,\n labelOptions?: any[],\n labelText?: string | DocumentFragment,\n name?: string,\n maxLength?: number,\n showLengthOn?: number,\n plainText?: true,\n required?: boolean,\n canBeEdited?: boolean,\n validate?: () => boolean,\n inputMode?: 'tel' | 'numeric',\n withLinebreaks?: boolean,\n autocomplete?: string\n};\n\nfunction createCustomEmojiRendererForInput() {\n const renderer = CustomEmojiRendererElement.create({\n wrappingDraft: true,\n isSelectable: true\n });\n return renderer;\n}\n\nfunction processCustomEmojisInInput(input: HTMLElement) {\n const customEmojiElements = Array.from(input.querySelectorAll('.custom-emoji, .custom-emoji-placeholder'));\n let renderer = input.querySelector('.custom-emoji-renderer');\n if(!renderer && customEmojiElements.length) {\n renderer = createCustomEmojiRendererForInput();\n input.prepend(renderer);\n } else if(renderer && !customEmojiElements.length) {\n renderer.remove();\n return;\n }\n\n if(!renderer) {\n return;\n }\n\n const customEmojis: Parameters[0] = new Map();\n customEmojiElements.forEach((element) => {\n const customEmojiElement = element instanceof CustomEmojiElement ? element : (element as any).customEmojiElement as CustomEmojiElement;\n const {docId} = customEmojiElement;\n let set = customEmojis.get(docId);\n if(!set) {\n customEmojis.set(docId, set = new Set());\n }\n\n set.add(customEmojiElement);\n });\n\n for(const [docId, customEmojiElements] of customEmojis) {\n let hasSet = renderer.customEmojis.get(docId);\n if(hasSet) {\n for(const customEmojiElement of hasSet) {\n if(!customEmojiElements.has(customEmojiElement)) {\n customEmojiElement.destroy();\n }\n }\n } else {\n hasSet = new Set();\n }\n\n for(const customEmojiElement of customEmojiElements) {\n if(!hasSet.has(customEmojiElement)) {\n customEmojiElement.connectedCallback();\n }\n }\n }\n\n renderer.add(customEmojis, false);\n renderer.forceRender();\n}\n\nexport default class InputField {\n public container: HTMLElement;\n public input: HTMLElement;\n public label: HTMLLabelElement;\n\n public originalValue: string;\n\n public required: boolean;\n public validate: () => boolean;\n\n constructor(public options: InputFieldOptions = {}) {\n this.container = document.createElement('div');\n this.container.classList.add('input-field');\n\n this.required = options.required;\n this.validate = options.validate;\n\n if(options.maxLength !== undefined && options.showLengthOn === undefined) {\n options.showLengthOn = Math.min(40, Math.round(options.maxLength / 3));\n }\n\n const {placeholder, maxLength, showLengthOn, name, plainText, canBeEdited = true, autocomplete} = options;\n const label = options.label || options.labelText;\n\n const onInputCallbacks: Array<() => void> = [];\n let input: HTMLElement;\n if(!plainText) {\n if(init) {\n init();\n }\n\n this.container.innerHTML = `

`;\n\n input = this.container.firstElementChild as HTMLElement;\n input.contentEditable = '' + !!canBeEdited;\n // const observer = new MutationObserver(() => {\n // //checkAndSetRTL(input);\n\n // if(processInput) {\n // processInput();\n // }\n // });\n\n RichInputHandler.getInstance();\n\n input.addEventListener('mousedown', (e) => {\n const selection = document.getSelection();\n if(!selection.isCollapsed) {\n return;\n }\n\n const placeholder = findUpTag(e.target, 'IMG');\n if(!placeholder) {\n return;\n }\n\n const rect = placeholder.getBoundingClientRect();\n const centerX = rect.left + rect.width / 2;\n const focusOnNext = e.clientX >= centerX;\n\n const range = document.createRange();\n range.setStartAfter(focusOnNext ? placeholder : placeholder.previousSibling ?? placeholder);\n selection.removeAllRanges();\n selection.addRange(range);\n });\n\n onInputCallbacks.push(() => {\n // console.log('input');\n // return;\n // * because if delete all characters there will br left\n if(isInputEmpty(input)) {\n // const textNode = Array.from(input.childNodes).find((node) => node.nodeType === node.TEXT_NODE) || document.createTextNode('');\n input.replaceChildren();\n // input.append(document.createTextNode('')); // need first text node to support history stack\n }\n\n // const fillers = Array.from(input.querySelectorAll('.emoji-filler')) as HTMLElement[];\n // fillers.forEach((filler) => {\n // const textContent = filler.textContent;\n // if(textContent === BOM) {\n // return;\n // }\n\n // if(textContent) {\n\n // } else {\n // let curChild = filler.firstChild;\n // while(curChild) {\n // curChild = curChild.nextSibling;\n // }\n // }\n\n // filler.classList.remove('emoji-filler');\n // });\n\n // Array.from(input.querySelectorAll('br, span:empty')).forEach((el) => {\n // const parentElement = el.parentElement;\n // (parentElement === input ? el : parentElement).remove();\n // });\n USING_BOMS && Array.from(input.querySelectorAll('br:not(.br-not-br)')).forEach((el) => {\n // const parentElement = el.parentElement;\n el.remove();\n // if(!parentElement.children.length && !parentElement.textContent) {\n // parentElement.textContent = '';\n // }\n });\n\n insertCustomFillers(Array.from(input.querySelectorAll('.input-something')));\n\n processCustomEmojisInInput(input);\n\n // .forEach((el) => el.remove());\n });\n\n // ! childList for paste first symbol\n // observer.observe(input, {characterData: true, childList: true, subtree: true});\n } else {\n this.container.innerHTML = `\n \n `;\n\n input = this.container.firstElementChild as HTMLElement;\n // input.addEventListener('input', () => checkAndSetRTL(input));\n }\n\n setDirection(input);\n\n if(options.inputMode) {\n input.inputMode = options.inputMode;\n }\n\n if(placeholder) {\n _i18n(input, placeholder, undefined, 'placeholder');\n }\n\n if(label || placeholder) {\n const border = document.createElement('div');\n border.classList.add('input-field-border');\n this.container.append(border);\n }\n\n if(label) {\n this.label = document.createElement('label');\n this.setLabel();\n this.container.append(this.label);\n }\n\n if(maxLength) {\n const labelEl = this.container.lastElementChild as HTMLLabelElement;\n let showingLength = false;\n\n const onInput = () => {\n const wasError = input.classList.contains('error');\n // * https://stackoverflow.com/a/54369605 #2 to count emoji as 1 symbol\n const inputLength = plainText ? (input as HTMLInputElement).value.length : [...getRichValueWithCaret(input, false, false).value].length;\n const diff = maxLength - inputLength;\n const isError = diff < 0;\n input.classList.toggle('error', isError);\n\n // this.onLengthChange && this.onLengthChange(inputLength, isError);\n\n if(isError || diff <= showLengthOn) {\n this.setLabel();\n labelEl.append(` (${maxLength - inputLength})`);\n if(!showingLength) showingLength = true;\n } else if((wasError && !isError) || showingLength) {\n this.setLabel();\n showingLength = false;\n }\n };\n\n onInputCallbacks.push(onInput);\n }\n\n const noLinebreaks = !options.withLinebreaks;\n if(noLinebreaks && !plainText) {\n input.dataset.noLinebreaks = '1';\n input.addEventListener('keypress', (e) => {\n if(e.key === 'Enter') {\n e.preventDefault();\n return false;\n }\n });\n }\n\n if(onInputCallbacks.length) {\n input.addEventListener('input', () => {\n onInputCallbacks.forEach((callback) => callback());\n });\n }\n\n this.input = input;\n }\n\n public select() {\n if(!this.value) { // * avoid selecting whole empty field on iOS devices\n return;\n }\n\n if(this.options.plainText) {\n (this.input as HTMLInputElement).select(); // * select text\n } else {\n selectElementContents(this.input);\n }\n }\n\n public setLabel() {\n this.label.textContent = '';\n if(this.options.labelText) {\n setInnerHTML(this.label, this.options.labelText);\n } else {\n this.label.append(i18n(this.options.label, this.options.labelOptions));\n }\n }\n\n get value(): string {\n return this.options.plainText ? (this.input as HTMLInputElement).value : getRichValueWithCaret(this.input, false, false).value;\n // return getRichValue(this.input);\n }\n\n set value(value: Parameters[1]) {\n this.setValueSilently(value, true);\n this.simulateInputEvent();\n }\n\n public simulateInputEvent() {\n simulateEvent(this.input, 'input');\n }\n\n public setValueSilently(value: Parameters[1], fromSet?: boolean) {\n if(this.options.plainText) {\n (this.input as HTMLInputElement).value = value as string;\n } else {\n replaceContent(this.input, value);\n processCustomEmojisInInput(this.input);\n }\n }\n\n public isChanged() {\n return this.value !== this.originalValue;\n }\n\n public isValid() {\n return !this.input.classList.contains('error') &&\n (!this.validate || this.validate()) &&\n (!this.required || !isInputEmpty(this.input));\n }\n\n public isValidToChange() {\n return this.isValid() && this.isChanged();\n }\n\n public setDraftValue(value = '', silent?: boolean) {\n if(!this.options.plainText) {\n value = documentFragmentToHTML(wrapDraftText(value));\n }\n\n if(silent) {\n this.setValueSilently(value, false);\n } else {\n this.value = value;\n }\n }\n\n public setOriginalValue(value: InputField['originalValue'] = '', silent?: boolean) {\n this.originalValue = value;\n this.setDraftValue(value, silent);\n }\n\n public setState(state: InputState, label?: LangPackKey) {\n if(label) {\n this.label.textContent = '';\n this.label.append(i18n(label, this.options.labelOptions));\n } else {\n this.setLabel();\n }\n\n this.input.classList.toggle('error', !!(state & InputState.Error));\n this.input.classList.toggle('valid', !!(state & InputState.Valid));\n }\n\n public setError(label?: LangPackKey) {\n this.setState(InputState.Error, label);\n }\n}\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","/*\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 { getRichValue } from \"../helpers/dom\";\nimport {LangPackKey} from '../lib/langPack';\nimport InputField from './inputField';\n\nexport default class InputSearch {\n public container: HTMLElement;\n public input: HTMLElement;\n public inputField: InputField;\n public clearBtn: HTMLElement;\n\n public prevValue = '';\n public timeout = 0;\n public onChange: (value: string) => void;\n public onClear: () => void;\n\n constructor(placeholder: LangPackKey, onChange?: (value: string) => void) {\n this.inputField = new InputField({\n placeholder,\n plainText: true\n });\n\n this.container = this.inputField.container;\n this.container.classList.remove('input-field');\n this.container.classList.add('input-search');\n\n this.onChange = onChange;\n\n this.input = this.inputField.input;\n this.input.classList.add('input-search-input');\n\n const searchIcon = document.createElement('i');\n searchIcon.classList.add('tgico', 'tgico-search');\n\n this.clearBtn = document.createElement('i');\n this.clearBtn.classList.add('tgico', 'btn-icon', 'tgico-close');\n\n this.input.addEventListener('input', this.onInput);\n this.clearBtn.addEventListener('click', this.onClearClick);\n\n this.container.append(searchIcon, this.clearBtn);\n }\n\n onInput = () => {\n if(!this.onChange) return;\n\n const value = this.value;\n\n // this.input.classList.toggle('is-empty', !value.trim());\n\n if(value !== this.prevValue) {\n this.prevValue = value;\n clearTimeout(this.timeout);\n this.timeout = window.setTimeout(() => {\n this.onChange(value);\n }, 200);\n }\n };\n\n onClearClick = () => {\n this.value = '';\n this.onChange && this.onChange('');\n this.onClear && this.onClear();\n };\n\n get value() {\n return this.inputField.value;\n }\n\n set value(value: string) {\n this.prevValue = value;\n clearTimeout(this.timeout);\n this.inputField.value = value;\n }\n\n public remove() {\n clearTimeout(this.timeout);\n this.input.removeEventListener('input', this.onInput);\n this.clearBtn.removeEventListener('click', this.onClearClick);\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 VisibilityIntersector, {OnVisibilityChangeItem} from './visibilityIntersector';\nimport findAndSpliceAll from '../helpers/array/findAndSpliceAll';\nimport findAndSplice from '../helpers/array/findAndSplice';\nimport LazyLoadQueueIntersector, {LazyLoadElement} from './lazyLoadQueueIntersector';\nimport useHeavyAnimationCheck from '../hooks/useHeavyAnimationCheck';\n\nexport default class LazyLoadQueue extends LazyLoadQueueIntersector {\n constructor(parallelLimit?: number, ignoreHeavyAnimation?: boolean) {\n super(parallelLimit);\n\n this.intersector = new VisibilityIntersector(this.onVisibilityChange);\n\n !ignoreHeavyAnimation && useHeavyAnimationCheck(() => {\n this.lock();\n }, () => {\n this.unlockAndRefresh();\n });\n }\n\n private onVisibilityChange = ({target, visible}: OnVisibilityChangeItem) => {\n // if(DEBUG) {\n // this.log('isIntersecting', target, visible);\n // }\n\n // if visible - will move to the end of visible arary\n findAndSpliceAll(this.queue, (i) => i.div === target).forEach((item) => {\n if(visible) {\n item.wasSeen = true;\n }\n\n item.visible = visible;\n const index = this.queue.findIndex((item) => !item.visible);\n this.queue.splice(Math.max(0, index), 0, item);\n });\n\n this.setProcessQueueTimeout();\n };\n\n protected getItem() {\n return findAndSplice(this.queue, (item) => item.wasSeen);\n }\n\n public async processItem(item: LazyLoadElement) {\n await super.processItem(item);\n this.intersector.unobserve(item.div);\n }\n\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElement) {\n const inserted = super.addElement(method, el);\n\n if(!inserted) return false;\n\n this.observe(el);\n /* if(el.wasSeen) {\n this.processQueue(el);\n } else */\n el.wasSeen ??= false;\n\n return 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 findAndSpliceAll from '../helpers/array/findAndSpliceAll';\nimport LazyLoadQueueBase, {LazyLoadElementBase} from './lazyLoadQueueBase';\nimport VisibilityIntersector from './visibilityIntersector';\n\nexport type LazyLoadElement = Omit & {\n load: (target?: HTMLElement) => Promise,\n div: HTMLElement\n wasSeen?: boolean,\n visible?: boolean\n};\n\nexport default class LazyLoadQueueIntersector extends LazyLoadQueueBase {\n protected queue: Array = [];\n protected inProcess: Set = new Set();\n\n public intersector: VisibilityIntersector;\n protected intersectorTimeout: number;\n\n constructor(parallelLimit?: number) {\n super(parallelLimit);\n }\n\n public lock() {\n super.lock();\n this.intersector.lock();\n }\n\n public unlock() {\n super.unlock();\n this.intersector.unlock();\n }\n\n public unlockAndRefresh() {\n super.unlock();\n this.intersector.unlockAndRefresh();\n }\n\n public clear() {\n super.clear();\n this.intersector.disconnect();\n }\n\n public refresh() {\n this.intersector.refresh();\n }\n\n protected loadItem(item: LazyLoadElement) {\n return item.load(item.div);\n }\n\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElement) {\n const item = this.queue.find((i) => i.div === el.div && i.load === el.load);\n if(item) {\n return false;\n } else {\n for(const item of this.inProcess) {\n if(item.div === el.div && item.load === el.load) {\n return false;\n }\n }\n }\n\n this.queue[method](el);\n return true;\n }\n\n protected setProcessQueueTimeout() {\n this.intersectorTimeout ??= window.setTimeout(() => {\n this.intersectorTimeout = undefined;\n this.processQueue();\n }, 0);\n }\n\n public push(el: LazyLoadElement) {\n super.push(el);\n }\n\n public unshift(el: LazyLoadElement) {\n super.unshift(el);\n }\n\n public delete(el: Omit) {\n findAndSpliceAll(this.queue, (i) => i.div === el.div);\n this.unobserve(el);\n }\n\n public observe(el: LazyLoadElement) {\n this.intersector.observe(el.div);\n }\n\n public unobserve(el: Omit) {\n this.intersector.unobserve(el.div);\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 {GrabEvent} from '../helpers/dom/attachGrabListeners';\nimport appMediaPlaybackController from './appMediaPlaybackController';\nimport RangeSelector from './rangeSelector';\n\nexport default class MediaProgressLine extends RangeSelector {\n protected filledLoad: HTMLDivElement;\n\n protected progressRAF: number;\n\n protected media: HTMLMediaElement;\n protected streamable: boolean;\n\n // protected lastOnPlayTime: number;\n // protected lastOnPlayCurrentTime: number;\n\n constructor(protected options: {\n media?: HTMLAudioElement | HTMLVideoElement,\n streamable?: boolean,\n withTransition?: boolean,\n useTransform?: boolean,\n onSeekStart?: () => void,\n onSeekEnd?: () => void\n }) {\n super({\n step: 1000 / 60 / 1000,\n min: 0,\n max: 1,\n withTransition: options.withTransition,\n useTransform: options.useTransform\n }, 0);\n\n if(options.media) {\n this.setMedia(options.media, options.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 this.options?.onSeekStart?.();\n },\n\n onMouseUp: (e) => {\n // cancelEvent(e.event);\n wasPlaying && this.media.play();\n this.options?.onSeekEnd?.();\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 const r = () => {\n this.setProgress();\n\n this.progressRAF = this.media.paused ? undefined : window.requestAnimationFrame(r);\n };\n\n if(this.progressRAF) {\n window.cancelAnimationFrame(this.progressRAF);\n this.progressRAF = undefined;\n }\n\n if(this.streamable) {\n this.setLoadProgress();\n }\n\n // this.lastOnPlayTime = Date.now();\n // this.lastOnPlayCurrentTime = this.media.currentTime;\n r();\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\n // fix jumping progress on play\n // let currentTime: number;\n // const diff = (Date.now() - this.lastOnPlayTime) / 1000;\n // if(!this.media.paused && this.lastOnPlayTime && diff <= 1) {\n // currentTime = this.lastOnPlayCurrentTime + diff;\n // } else {\n // currentTime = this.media.currentTime;\n // }\n\n const currentTime = this.media.currentTime;\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('pause', this.onTimeUpdate);\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 if(this.media) {\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('pause', this.onTimeUpdate);\n this.media.removeEventListener('timeupdate', this.onTimeUpdate);\n this.streamable && this.media.removeEventListener('progress', this.onProgress);\n }\n\n if(this.progressRAF) {\n window.cancelAnimationFrame(this.progressRAF);\n this.progressRAF = 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 {FontFamily, FontSize, FontWeight} from '../config/font';\nimport getTextWidth from '../helpers/canvas/getTextWidth';\nimport mediaSizes from '../helpers/mediaSizes';\nimport clamp from '../helpers/number/clamp';\nimport {fastRaf} from '../helpers/schedulers';\n\n// Thanks to https://stackoverflow.com/a/49349813\n\n/**\n * Attibute modifier to create middle ellipsis\n * When the attribute value is left blank the ellipsis will be in the middle\n * When positive the attribute value will be used as a percentage\n * When negative the attribute value will be used as character index counted from the end\n * @example\n *
A Javascript solution to middle ellipsis
\n *
A Javascript solution to middle ellipsis
\n *
A Javascript solution to middle ellipsis
\n */\nconst ellipsis = 'โ€ฆ';\nconst map: Map = new Map();\n\nconst testQueue: Set = new Set();\nconst fontSize = '16px';\nlet pendingTest = false;\n\nfunction setTestQueue() {\n if(pendingTest) {\n return;\n }\n\n pendingTest = true;\n fastRaf(() => {\n pendingTest = false;\n testQueueElements();\n });\n}\n\nfunction testQueueElements() {\n testQueue.forEach(testElement);\n testQueue.clear();\n}\n\nwindow.addEventListener('resize', () => {\n for(const [key] of map) {\n testQueue.add(key);\n }\n\n setTestQueue();\n}, {capture: true, passive: true});\n\nfunction getElementWidth(element: HTMLElement) {\n const getSize = (element as any).getSize;\n if(getSize) {\n return getSize();\n }\n\n const type = element.dataset.sizeType;\n if(type) {\n const mediaSize = mediaSizes.active;\n // @ts-ignore\n const size: MediaSize = mediaSize[type];\n return size.width;\n }\n\n return element.getBoundingClientRect().width;\n}\n\nfunction testElement(element: HTMLElement) {\n // const perf = performance.now();\n // do not recalculate variables a second time\n let mapped = map.get(element);\n const firstTime = !mapped;\n\n let {text, textLength, from, multiplier, font, textWidth, elementWidth} = mapped || {};\n // console.log('[MEE] testElement got mapped', mapped);\n\n if(firstTime) {\n text = element.textContent;\n textLength = text.length;\n from = /* parseFloat(element.getAttribute(attributeName)) || */50;\n multiplier = from > 0 && from / 100;\n\n let fontSize = element.dataset.fontSize;\n if(fontSize && +fontSize) fontSize += 'px';\n // const perf = performance.now();\n font = `${element.dataset.fontWeight || FontWeight} ${fontSize || FontSize} ${FontFamily}`;\n /* const computedStyle = window.getComputedStyle(elm, null);\n font = `${computedStyle.getPropertyValue('font-weight')} ${computedStyle.getPropertyValue('font-size')} ${computedStyle.getPropertyValue('font-family')}`; */\n // console.log('testMiddleEllipsis get computed style:', performance.now() - perf, font);\n\n textWidth = getTextWidth(text, font);\n // const perf = performance.now();\n elementWidth = getElementWidth(element);\n // console.log('testMiddleEllipsis get offsetWidth:', performance.now() - perf, font);\n mapped = {text, textLength, from, multiplier, font, textWidth, elementWidth};\n map.set(element, mapped);\n\n // console.log('[MEE] testElement map set', element);\n }\n\n const newElementWidth = getElementWidth(element);\n const widthChanged = firstTime || elementWidth !== newElementWidth;\n !firstTime && widthChanged && (mapped.elementWidth = elementWidth = newElementWidth);\n\n if(widthChanged) {\n if(textWidth > elementWidth) {\n element.setAttribute('title', text);\n let smallerText = text;\n let smallerWidth = elementWidth;\n while(smallerText.length > 3) {\n const smallerTextLength = smallerText.length;\n const half = multiplier &&\n clamp(multiplier * smallerTextLength << 0, 1, smallerTextLength - 2) ||\n Math.max(smallerTextLength + from - 1, 1);\n const half1 = smallerText.substr(0, half).replace(/\\s*$/, '');\n const half2 = smallerText.substr(half + 1).replace(/^\\s*/, '');\n smallerText = half1 + half2;\n smallerWidth = getTextWidth(smallerText + ellipsis, font);\n if(smallerWidth < elementWidth) {\n element.textContent = half1 + ellipsis + half2;\n break;\n }\n }\n\n // * set new width after cutting text\n mapped.elementWidth = getElementWidth(element);\n // mapped.textWidth = smallerWidth;\n } else {\n element.removeAttribute('title');\n }\n }\n\n // console.log('testMiddleEllipsis for element:', elm, performance.now() - perf);\n}\n\nexport class MiddleEllipsisElement extends HTMLElement {\n connectedCallback() {\n // console.log('[MEE]: connectedCallback before', map.has(this), testQueue.has(this), map.size, this.textContent, map);\n\n map.set(this, null);\n if(this.dataset.sizeType || (this as any).getSize) {\n testElement(this);\n } else {\n testQueue.add(this);\n setTestQueue();\n }\n // testElement(this);\n\n // console.log('[MEE]: connectedCallback after', map.has(this), map.size, testQueue.has(this), testQueue.size);\n }\n\n disconnectedCallback() {\n const deleted = map.delete(this);\n testQueue.delete(this);\n // console.log('[MEE]: disconnectedCallback', deleted, map.has(this), map.size, this.textContent, map);\n }\n}\n\ncustomElements.define('middle-ellipsis-element', MiddleEllipsisElement);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport lottieLoader, {LottieLoader} from '../../lib/rlottie/lottieLoader';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport PasswordInputField from '../passwordInputField';\n\nexport default class PasswordMonkey {\n public container: HTMLElement;\n public animation: RLottiePlayer;\n public needFrame = 0;\n protected loadPromise: ReturnType;\n\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\n this.container = document.createElement('div');\n this.container.classList.add('media-sticker-wrapper');\n }\n\n public load() {\n if(this.loadPromise) return this.loadPromise;\n return this.loadPromise = lottieLoader.loadAnimationAsAsset({\n container: this.container,\n loop: false,\n autoplay: false,\n width: this.size,\n height: this.size,\n noCache: true\n // }, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then((_animation) => {\n }, 'TwoFactorSetupMonkeyPeek').then((_animation) => {\n // return;\n this.animation = _animation;\n this.animation.addEventListener('enterFrame', currentFrame => {\n // console.log('enterFrame', currentFrame, this.needFrame);\n\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\n this.animation.setSpeed(1);\n this.animation.pause();\n }\n });\n\n this.passwordInputField.helpers.onVisibilityClickAdditional = () => {\n if(this.passwordInputField.helpers.passwordVisible) {\n this.animation.setDirection(1);\n this.animation.curFrame = 0;\n this.needFrame = 16;\n this.animation.play();\n } else {\n this.animation.setDirection(-1);\n this.animation.curFrame = 16;\n this.needFrame = 0;\n this.animation.play();\n }\n };\n\n return lottieLoader.waitForFirstFrame(_animation);\n });\n }\n\n public remove() {\n if(this.animation) {\n this.animation.remove();\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 InputField from '../inputField';\nimport lottieLoader from '../../lib/rlottie/lottieLoader';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\n\nexport default class TrackingMonkey {\n public container: HTMLElement;\n\n protected max = 45;\n protected needFrame = 0;\n\n protected animation: RLottiePlayer;\n protected idleAnimation: RLottiePlayer;\n\n protected loadPromise: Promise;\n\n constructor(protected inputField: InputField, protected size: number) {\n this.container = document.createElement('div');\n this.container.classList.add('media-sticker-wrapper');\n\n const input = inputField.input;\n\n input.addEventListener('blur', () => {\n this.playAnimation(0);\n });\n\n input.addEventListener('input', (e) => {\n this.playAnimation(inputField.value.length);\n });\n\n /* codeInput.addEventListener('focus', () => {\n playAnimation(Math.max(codeInput.value.length, 1));\n }); */\n }\n\n // 1st symbol = frame 15\n // end symbol = frame 165\n public playAnimation(length: number) {\n if(!this.animation) return;\n\n length = Math.min(length, 30);\n let frame: number;\n if(length) {\n frame = Math.round(Math.min(this.max, length) * (165 / this.max) + 11.33);\n\n if(this.idleAnimation) {\n this.idleAnimation.stop(true);\n this.idleAnimation.canvas[0].style.display = 'none';\n }\n\n this.animation.canvas[0].style.display = '';\n } else {\n /* const cb = (frameNo: number) => {\n if(frameNo <= 1) { */\n /* idleAnimation.play();\n idleAnimation.canvas.style.display = '';\n animation.canvas.style.display = 'none'; */\n /* animation.removeListener('enterFrame', cb);\n }\n };\n animation.addListener('enterFrame', cb); */\n\n frame = 0;\n }\n // animation.playSegments([1, 2]);\n\n const direction = this.needFrame > frame ? -1 : 1;\n // console.log('keydown', length, frame, direction);\n\n this.animation.setDirection(direction);\n if(this.needFrame !== 0 && frame === 0) {\n this.animation.setSpeed(7);\n }\n /* let diff = Math.abs(needFrame - frame * direction);\n if((diff / 20) > 1) animation.setSpeed(diff / 20 | 0); */\n this.needFrame = frame;\n\n this.animation.play();\n\n /* animation.goToAndStop(15, true); */\n // animation.goToAndStop(length / max * );\n }\n\n public load() {\n if(this.loadPromise) return this.loadPromise;\n return this.loadPromise = Promise.all([\n lottieLoader.loadAnimationAsAsset({\n container: this.container,\n loop: true,\n autoplay: true,\n width: this.size,\n height: this.size\n }, 'TwoFactorSetupMonkeyIdle').then((animation) => {\n this.idleAnimation = animation;\n\n // ! animationIntersector will stop animation instantly\n if(!this.inputField.value.length) {\n animation.play();\n }\n\n return lottieLoader.waitForFirstFrame(animation);\n }),\n\n lottieLoader.loadAnimationAsAsset({\n container: this.container,\n loop: false,\n autoplay: false,\n width: this.size,\n height: this.size\n }, 'TwoFactorSetupMonkeyTracking').then((_animation) => {\n this.animation = _animation;\n\n if(!this.inputField.value.length) {\n this.animation.canvas[0].style.display = 'none';\n }\n\n this.animation.addEventListener('enterFrame', currentFrame => {\n // console.log('enterFrame', currentFrame, needFrame);\n // let currentFrame = Math.round(e.currentTime);\n\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\n this.animation.setSpeed(1);\n this.animation.pause();\n }\n\n if(currentFrame === 0 && this.needFrame === 0) {\n // animation.curFrame = 0;\n\n if(this.idleAnimation) {\n this.idleAnimation.canvas[0].style.display = '';\n this.idleAnimation.play();\n this.animation.canvas[0].style.display = 'none';\n }\n }\n });\n // console.log(animation.getDuration(), animation.getDuration(true));\n\n return lottieLoader.waitForFirstFrame(_animation);\n })\n ]);\n }\n\n public remove() {\n if(this.animation) this.animation.remove();\n if(this.idleAnimation) this.idleAnimation.remove();\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 InputField, {InputFieldOptions} from './inputField';\n\nexport class PasswordInputHelpers {\n public passwordVisible = false;\n public toggleVisible: HTMLElement;\n public onVisibilityClickAdditional: () => void;\n\n constructor(public container: HTMLElement, public input: HTMLInputElement) {\n input.type = 'password';\n input.setAttribute('required', '');\n input.name = 'notsearch_password';\n input.autocomplete = 'off';\n\n // * https://stackoverflow.com/a/35949954/6758968\n const stealthy = document.createElement('input');\n stealthy.classList.add('stealthy');\n stealthy.tabIndex = -1;\n stealthy.type = 'password';\n input.parentElement.prepend(stealthy);\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\n\n /* if(IS_SAFARI && !IS_MOBILE_SAFARI) {\n input.setAttribute('readonly', '');\n input.addEventListener('focus', () => {\n input.removeAttribute('readonly');\n }, {once: true});\n } */\n\n const toggleVisible = this.toggleVisible = document.createElement('span');\n toggleVisible.classList.add('toggle-visible', 'tgico');\n\n container.classList.add('input-field-password');\n container.append(toggleVisible);\n\n toggleVisible.addEventListener('click', this.onVisibilityClick);\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\n }\n\n public onVisibilityClick = (e: Event) => {\n cancelEvent(e);\n this.passwordVisible = !this.passwordVisible;\n\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\n };\n}\n\nexport default class PasswordInputField extends InputField {\n public helpers: PasswordInputHelpers;\n\n constructor(options: InputFieldOptions = {}) {\n super({\n plainText: true,\n ...options\n });\n\n this.helpers = new PasswordInputHelpers(this.container, this.input as HTMLInputElement);\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 IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport findAndSplice from '../helpers/array/findAndSplice';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport filterChatPhotosMessages from '../helpers/filterChatPhotosMessages';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport ListLoader from '../helpers/listLoader';\nimport {fastRaf} from '../helpers/schedulers';\nimport {Message, ChatFull, MessageAction, Photo} from '../layer';\nimport type {AppMessagesManager} from '../lib/appManagers/appMessagesManager';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport choosePhotoSize from '../lib/appManagers/utils/photos/choosePhotoSize';\nimport {openAvatarViewer} from './avatar';\nimport {putAvatar} from './putPhoto';\nimport Scrollable from './scrollable';\nimport SwipeHandler from './swipeHandler';\nimport wrapPhoto from './wrappers/photo';\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>;\n private listenerSetter: ListenerSetter;\n private swipeHandler: SwipeHandler;\n\n constructor(\n public scrollable: Scrollable,\n private managers: AppManagers\n ) {\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 this.loadCallbacks = new Map();\n this.listenerSetter = new ListenerSetter();\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 }, {listenerSetter: this.listenerSetter});\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 = this.swipeHandler = new SwipeHandler({\n element: this.avatars,\n onSwipe: (xDiff, yDiff) => {\n xDiff *= -1;\n yDiff *= -1;\n\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 as any as Event);\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 /* this.listenerSetter.add(rootScope)('avatar_update', (peerId) => {\n if(this.peerId === peerId) {\n const photo = appPeersManager.getPeerPhoto(peerId);\n if(photo) {\n const id = photo.photo_id;\n const previous = this.listLoader.previous;\n for(let i = 0; i < previous.length; ++i) {\n if(previous[i] === id)\n }\n this.listLoader.previous.forEach((_id, idx, arr) => {});\n }\n }\n }); */\n }\n\n public async setPeer(peerId: PeerId) {\n this.peerId = peerId;\n\n const photo = await this.managers.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 as any;\n return this.managers.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 | ChatFull, ReturnType] = [] as any;\n if(!listLoader.current) {\n promises.push(this.managers.appProfileManager.getChatFull(peerId.toChatId()));\n }\n\n promises.push(this.managers.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(async(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 = findAndSplice(value.history, (message) => {\n return ((message as Message.messageService).action as MessageAction.messageActionChannelEditPhoto).photo.id === chatFull.chat_photo.id;\n }) as Message.messageService;\n\n listLoader.current = message || await this.managers.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 await 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 = async(photoId: Photo.photo['id'] | Message.messageService) => {\n const avatar = document.createElement('div');\n avatar.classList.add(PeerProfileAvatars.BASE_CLASS + '-avatar', 'media-container', 'hide');\n\n this.avatars.append(avatar);\n\n let photo: Photo.photo;\n if(photoId) {\n photo = typeof(photoId) !== 'object' ?\n await this.managers.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 = async() => {\n if(photo) {\n const res = await wrapPhoto({\n container: avatar,\n photo,\n size: 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 = await this.managers.appPeersManager.getPeerPhoto(this.peerId);\n await putAvatar(avatar, this.peerId, photo, 'photo_big', img);\n }\n\n avatar.classList.remove('hide');\n };\n\n if(this.avatars.childElementCount <= LOAD_NEAREST) {\n await loadCallback();\n } else {\n this.intersectionObserver.observe(avatar);\n this.loadCallbacks.set(avatar, loadCallback);\n }\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 public cleanup() {\n this.listenerSetter.removeAll();\n this.swipeHandler.removeListeners();\n this.intersectionObserver?.disconnect();\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 deferredPromise from '../helpers/cancellablePromise';\nimport {copyTextToClipboard} from '../helpers/clipboard';\nimport anchorCopy from '../helpers/dom/anchorCopy';\nimport {simulateClickEvent} from '../helpers/dom/clickEvent';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport makeError from '../helpers/makeError';\nimport {makeMediaSize} from '../helpers/mediaSize';\nimport {getMiddleware, MiddlewareHelper} from '../helpers/middleware';\nimport middlewarePromise from '../helpers/middlewarePromise';\nimport {Chat, ChatFull, User, UserFull} from '../layer';\nimport appImManager from '../lib/appManagers/appImManager';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport getServerMessageId from '../lib/appManagers/utils/messageId/getServerMessageId';\nimport getPeerActiveUsernames from '../lib/appManagers/utils/peers/getPeerActiveUsernames';\nimport I18n, {i18n, join} from '../lib/langPack';\nimport wrapRichText from '../lib/richTextProcessor/wrapRichText';\nimport rootScope from '../lib/rootScope';\nimport AvatarElement from './avatar';\nimport CheckboxField from './checkboxField';\nimport {generateDelimiter} from './generateDelimiter';\nimport PeerProfileAvatars from './peerProfileAvatars';\nimport Row from './row';\nimport Scrollable from './scrollable';\nimport SettingSection from './settingSection';\nimport {toast} from './toast';\nimport formatUserPhone from './wrappers/formatUserPhone';\nimport wrapPeerTitle from './wrappers/peerTitle';\nimport wrapTopicNameButton from './wrappers/topicNameButton';\n\nconst setText = (text: Parameters[1], row: Row) => {\n // fastRaf(() => {\n setInnerHTML(row.title, text || '');\n row.container.style.display = text ? '' : 'none';\n // });\n};\n\nexport default class PeerProfile {\n public element: HTMLElement;\n private 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 private link: 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 private middlewareHelper: MiddlewareHelper;\n\n constructor(\n private managers: AppManagers,\n public scrollable: Scrollable,\n private listenerSetter?: ListenerSetter,\n private isDialog = true\n ) {\n if(!IS_PARALLAX_SUPPORTED) {\n this.scrollable.container.classList.add('no-parallax');\n }\n\n if(!listenerSetter) {\n this.listenerSetter = new ListenerSetter();\n }\n\n this.middlewareHelper = getMiddleware();\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.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 subtitle: true,\n icon: 'info',\n clickable: (e) => {\n if((e.target as HTMLElement).tagName === 'A') {\n return;\n }\n\n copyTextToClipboard(this.bio.title.textContent);\n toast(I18n.format('BioCopied', true));\n },\n listenerSetter: this.listenerSetter,\n contextMenu: {\n buttons: [{\n icon: 'copy',\n text: 'Text.CopyLabel_About',\n onClick: () => {\n simulateClickEvent(this.bio.container);\n },\n verify: () => !this.peerId.isUser()\n }, {\n icon: 'copy',\n text: 'Text.CopyLabel_Bio',\n onClick: () => {\n simulateClickEvent(this.bio.container);\n },\n verify: () => this.peerId.isUser()\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 username = await this.managers.appPeersManager.getPeerUsername(this.peerId);\n copyTextToClipboard('@' + this.username.title.textContent);\n toast(I18n.format('UsernameCopied', true));\n },\n listenerSetter: this.listenerSetter,\n contextMenu: {\n buttons: [{\n icon: 'copy',\n text: 'Text.CopyLabel_Username',\n onClick: () => {\n simulateClickEvent(this.username.container);\n }\n }]\n }\n });\n\n this.phone = new Row({\n title: ' ',\n subtitle: true,\n icon: 'phone',\n clickable: () => {\n copyTextToClipboard(this.phone.title.textContent.replace(/\\s/g, ''));\n toast(I18n.format('PhoneCopied', true));\n },\n listenerSetter: this.listenerSetter,\n contextMenu: {\n buttons: [{\n icon: 'copy',\n text: 'Text.CopyLabel_PhoneNumber',\n onClick: () => {\n simulateClickEvent(this.phone.container);\n }\n }, {\n icon: 'info',\n text: 'PeerInfo.Phone.AnonymousInfo',\n textArgs: [(() => {\n const a = document.createElement('a');\n return a;\n })()],\n onClick: () => {\n window.open('https://fragment.com/numbers', '_blank');\n },\n separator: true,\n multiline: true,\n verify: async() => {\n const {isAnonymous} = await this.managers.appUsersManager.getUserPhone(this.peerId.toUserId()) || {};\n return isAnonymous;\n }\n }]\n }\n });\n\n this.link = new Row({\n title: ' ',\n subtitleLangKey: 'SetUrlPlaceholder',\n icon: 'link',\n clickable: () => {\n const url = this.link.title.textContent;\n copyTextToClipboard(url);\n // Promise.resolve(appProfileManager.getChatFull(this.peerId.toChatId())).then((chatFull) => {\n // copyTextToClipboard(chatFull.exported_invite.link);\n const isPrivate = url.includes('/c/');\n toast(I18n.format(isPrivate ? 'LinkCopiedPrivateInfo' : 'LinkCopied', true));\n // });\n },\n listenerSetter: this.listenerSetter,\n contextMenu: {\n buttons: [{\n icon: 'copy',\n text: 'Text.CopyLabel_ShareLink',\n onClick: () => {\n simulateClickEvent(this.link.container);\n }\n }]\n }\n });\n\n this.location = new Row({\n title: ' ',\n subtitleLangKey: 'ChatLocation',\n icon: 'location'\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.link.container\n );\n\n const {listenerSetter} = this;\n if(this.isDialog) {\n this.notifications = new Row({\n checkboxField: new CheckboxField({toggle: true}),\n titleLangKey: 'Notifications',\n icon: 'unmute',\n listenerSetter: this.listenerSetter\n });\n\n listenerSetter.add(this.notifications.checkboxField.input)('change', (e) => {\n if(!e.isTrusted) {\n return;\n }\n\n // let checked = this.notificationsCheckbox.checked;\n this.managers.appMessagesManager.togglePeerMute({peerId: this.peerId, threadId: this.threadId});\n });\n\n listenerSetter.add(rootScope)('dialog_notify_settings', async(dialog) => {\n if(this.peerId === dialog.peerId) {\n const muted = await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.peerId, respectType: false, threadId: this.threadId});\n this.notifications.checkboxField.checked = !muted;\n }\n });\n\n this.section.content.append(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 listenerSetter.add(rootScope)('peer_typings', ({peerId}) => {\n if(this.peerId === peerId) {\n this.setPeerStatus();\n }\n });\n\n listenerSetter.add(rootScope)('peer_bio_edit', (peerId) => {\n if(peerId === this.peerId) {\n this.setMoreDetails(true);\n }\n });\n\n const n = async({peerId, threadId}: {peerId: PeerId, threadId?: number}) => {\n if(this.peerId !== peerId) {\n return false;\n }\n\n const isForum = await this.managers.appPeersManager.isForum(this.peerId);\n if(isForum && this.threadId ? this.threadId === threadId : true) {\n return true;\n }\n\n return false;\n };\n\n listenerSetter.add(rootScope)('peer_title_edit', async(data) => {\n if(await n(data)) {\n this.fillUsername();\n this.setMoreDetails(true);\n }\n });\n\n listenerSetter.add(rootScope)('user_update', (userId) => {\n if(this.peerId === userId.toPeerId()) {\n this.setPeerStatus();\n }\n });\n\n listenerSetter.add(rootScope)('contacts_update', async(userId) => {\n if(this.peerId === userId.toPeerId()) {\n const user = await this.managers.appUsersManager.getUser(userId);\n if(!user.pFlags.self || !this.isDialog) {\n this.fillUserPhone();\n }\n }\n });\n\n listenerSetter.add(rootScope)('avatar_update', async(data) => {\n if(await n(data)) {\n this.setAvatar();\n }\n });\n\n this.setPeerStatusInterval = window.setInterval(() => this.setPeerStatus(), 60e3);\n }\n\n private async setPeerStatus(\n needClear = false,\n manual?: T\n ): Promise void : void> {\n const peerId = this.peerId;\n\n const callbacks: Array<() => void> = [];\n callbacks.push(() => {\n this.element.classList.toggle('is-me', peerId === rootScope.myId);\n });\n\n let promise: Promise<(() => void) | void> = Promise.resolve();\n if(!(!peerId || (rootScope.myId === peerId && this.isDialog))) {\n const isForum = await this.managers.appPeersManager.isForum(this.peerId);\n const middleware = this.middlewareHelper.get();\n if(isForum && this.threadId) {\n promise = wrapTopicNameButton({\n peerId,\n wrapOptions: {\n middleware\n }\n }).then(({element}) => {\n this.subtitle.replaceChildren(element);\n });\n } else {\n promise = appImManager.setPeerStatus({\n peerId,\n element: this.subtitle,\n needClear,\n useWhitespace: true,\n middleware,\n ignoreSelf: !this.isDialog\n });\n }\n\n promise.then((callback) => callback && callbacks.push(callback));\n }\n\n const callback = () => callbacks.forEach((callback) => callback());\n\n return promise.then(() => {\n if(manual) {\n return callback;\n }\n\n callback();\n }) as any;\n }\n\n public cleanupHTML() {\n [\n this.bio,\n this.phone,\n this.username,\n this.location,\n this.link\n ].forEach((row) => {\n row.container.style.display = 'none';\n });\n\n if(this.notifications) {\n this.notifications.container.style.display = '';\n this.notifications.checkboxField.checked = true;\n }\n\n this.clearSetMoreDetailsTimeout();\n }\n\n private canBeDetailed() {\n return this.peerId !== rootScope.myId || !this.isDialog;\n }\n\n private createAvatar() {\n const avatar = new AvatarElement();\n avatar.classList.add('profile-avatar', 'avatar-120');\n avatar.isDialog = this.isDialog;\n avatar.attachClickEvent();\n return avatar;\n }\n\n private async _setAvatar() {\n const {peerId} = this;\n const isTopic = !!(this.threadId && await this.managers.appPeersManager.isForum(peerId));\n if(this.canBeDetailed() && !isTopic) {\n const photo = await this.managers.appPeersManager.getPeerPhoto(peerId);\n\n if(photo) {\n const oldAvatars = this.avatars;\n this.avatars = new PeerProfileAvatars(this.scrollable, this.managers);\n await this.avatars.setPeer(peerId);\n\n return () => {\n this.avatars.info.append(this.name, this.subtitle);\n\n this.avatar?.remove();\n this.avatar = undefined;\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 }\n }\n\n const avatar = this.createAvatar();\n await avatar.updateWithOptions({\n peerId,\n threadId: isTopic ? this.threadId : undefined,\n wrapOptions: {\n customEmojiSize: makeMediaSize(120, 120),\n middleware: this.middlewareHelper.get()\n }\n });\n\n return () => {\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.cleanup();\n this.avatars = undefined;\n }\n\n this.avatar?.remove();\n this.avatar = avatar;\n\n this.section.content.prepend(this.avatar, this.name, this.subtitle);\n };\n }\n\n private setAvatar(manual?: T): T extends true ? Promise<() => void> : Promise {\n const promise = this._setAvatar();\n return manual ? promise : promise.then((callback) => callback()) as any;\n }\n\n private getUsernamesAlso(usernames: string[]) {\n const also = usernames.slice(1);\n if(also.length) {\n const a = also.map((username) => anchorCopy({username}));\n const i = i18n('UsernameAlso', [join(a, false)]);\n return i;\n }\n }\n\n private async fillUsername() {\n const {peerId} = this;\n if(peerId.isUser() && this.canBeDetailed()) {\n const usernames = await this.managers.appPeersManager.getPeerActiveUsernames(peerId);\n const also = this.getUsernamesAlso(usernames);\n\n return () => {\n this.username.subtitle.replaceChildren(also || i18n('Username'));\n setText(usernames[0], this.username);\n };\n }\n }\n\n private async fillUserPhone() {\n const {peerId} = this;\n if(peerId.isUser() && this.canBeDetailed()) {\n const {phone, isAnonymous} = await this.managers.appUsersManager.getUserPhone(peerId.toUserId()) || {};\n\n return () => {\n this.phone.subtitle.replaceChildren(i18n(isAnonymous ? 'AnonymousNumber' : 'Phone'));\n setText(phone ? formatUserPhone(phone) : undefined, this.phone);\n };\n }\n }\n\n private async fillNotifications() {\n const notificationsRow = this.notifications;\n if(!notificationsRow) {\n return;\n }\n\n if(this.canBeDetailed()) {\n const muted = await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.peerId, respectType: false, threadId: this.threadId});\n return () => {\n notificationsRow.checkboxField.checked = !muted;\n };\n } else {\n return () => {\n // fastRaf(() => {\n notificationsRow.container.style.display = 'none';\n // });\n };\n }\n }\n\n private async fillName() {\n const {peerId} = this;\n const [element/* , icons */] = await Promise.all([\n wrapPeerTitle({\n peerId,\n dialog: this.isDialog,\n withIcons: !this.threadId,\n threadId: this.threadId\n })\n\n // generateTitleIcons(peerId)\n ]);\n\n return () => {\n replaceContent(this.name, element);\n // this.name.append(...icons);\n };\n }\n\n private async fillRows(manual: Promise) {\n return Promise.all([\n this.fillName(),\n this.fillUsername(),\n this.fillUserPhone(),\n this.fillNotifications(),\n this.setMoreDetails(undefined, manual),\n this.setPeerStatus(true, true)\n ]).then((callbacks) => {\n return () => {\n callbacks.forEach((callback) => callback?.());\n };\n });\n }\n\n public async fillProfileElements() {\n if(!this.cleaned) return;\n this.cleaned = false;\n\n this.cleanupHTML();\n const deferred = deferredPromise();\n const middleware = this.middlewareHelper.get();\n middleware.onClean(() => {\n deferred.reject();\n });\n\n const callbacks = await Promise.all([\n this.setAvatar(true),\n this.fillRows(deferred)\n ]);\n\n return () => {\n deferred.resolve();\n callbacks.forEach((callback) => callback?.());\n };\n }\n\n private async _setMoreDetails(peerId: PeerId, peerFull?: ChatFull | UserFull) {\n const m = this.getMiddlewarePromise();\n const isTopic = !!(this.threadId && await m(this.managers.appPeersManager.isForum(peerId)));\n if(isTopic) {\n let url = 'https://t.me/';\n const threadId = getServerMessageId(this.threadId);\n const username = await m(this.managers.appPeersManager.getPeerUsername(peerId));\n if(username) {\n url += `${username}/${threadId}`;\n } else {\n url += `c/${peerId.toChatId()}/${threadId}`;\n }\n\n return () => {\n setText(url, this.link);\n };\n }\n\n const callbacks: (() => void)[] = [];\n // if(peerFull.about) {\n callbacks.push(() => {\n this.bio.subtitle.replaceChildren(i18n(peerId.isUser() ? 'UserBio' : 'Info'));\n setText(peerFull.about ? wrapRichText(peerFull.about) : undefined, this.bio);\n });\n // }\n\n if(!peerId.isUser()) {\n const chat = await m(this.managers.appChatsManager.getChat(peerId.toChatId())) as Chat.channel;\n const usernames = getPeerActiveUsernames(chat);\n let also: HTMLElement;\n if(usernames.length) {\n also = this.getUsernamesAlso(usernames);\n callbacks.push(() => setText('https://t.me/' + usernames[0], this.link));\n } else {\n const exportedInvite = (peerFull as ChatFull.channelFull).exported_invite;\n if(exportedInvite?._ === 'chatInviteExported') {\n callbacks.push(() => setText(exportedInvite.link, this.link));\n }\n }\n\n callbacks.push(() => this.link.subtitle.replaceChildren(also || i18n('SetUrlPlaceholder')));\n }\n\n const location = (peerFull as ChatFull.channelFull).location;\n if(location?._ == 'channelLocation') {\n callbacks.push(() => setText(location.address, this.location));\n }\n\n this.setMoreDetailsTimeout = window.setTimeout(() => this.setMoreDetails(true), 60e3);\n\n return () => {\n callbacks.forEach((callback) => callback());\n };\n }\n\n private async setMoreDetails(override?: true, manual?: Promise) {\n this.clearSetMoreDetailsTimeout();\n\n const {peerId} = this;\n const m = this.getMiddlewarePromise();\n\n if(!peerId || !this.canBeDetailed() || await m(this.managers.appPeersManager.isPeerRestricted(peerId))) {\n return;\n }\n\n const result = await m(this.managers.acknowledged.appProfileManager.getProfileByPeerId(peerId, override));\n const setPromise = m(result.result).then(async(peerFull) => {\n if(await m(this.managers.appPeersManager.isPeerRestricted(peerId))) {\n // this.log.warn('peer changed');\n return;\n }\n\n return await m(this._setMoreDetails(peerId, peerFull));\n });\n\n if(result.cached && manual) {\n return setPromise;\n } else {\n (manual || Promise.resolve())\n .then(() => setPromise)\n .then((callback) => {\n callback?.();\n });\n }\n }\n\n private getMiddlewarePromise() {\n return middlewarePromise(this.middlewareHelper.get(), makeError('MIDDLEWARE'));\n }\n\n public setPeer(peerId: PeerId, threadId?: number) {\n if(this.peerId === peerId && this.threadId === threadId) return;\n\n this.init?.();\n\n this.peerId = peerId;\n this.threadId = threadId;\n\n this.middlewareHelper.clean();\n this.cleaned = true;\n }\n\n public clearSetMoreDetailsTimeout() {\n if(this.setMoreDetailsTimeout !== undefined) {\n clearTimeout(this.setMoreDetailsTimeout);\n this.setMoreDetailsTimeout = undefined;\n }\n }\n\n public destroy() {\n this.peerId = this.threadId = undefined;\n this.clearSetMoreDetailsTimeout();\n clearInterval(this.setPeerStatusInterval);\n this.avatars?.cleanup();\n this.middlewareHelper.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 mediaSizes from '../helpers/mediaSizes';\nimport {Middleware} from '../helpers/middleware';\nimport {Chat, Document, EmojiStatus, User} from '../layer';\nimport rootScope from '../lib/rootScope';\nimport generateFakeIcon from './generateFakeIcon';\nimport generatePremiumIcon from './generatePremiumIcon';\nimport generateVerifiedIcon from './generateVerifiedIcon';\nimport wrapSticker from './wrappers/sticker';\n\nexport default async function generateTitleIcons(\n peerId: PeerId,\n middleware?: Middleware,\n noVerifiedIcon?: boolean,\n noFakeIcon?: boolean,\n noPremiumIcon?: boolean\n) {\n const elements: HTMLElement[] = [];\n const peer: Chat | User = await rootScope.managers.appPeersManager.getPeer(peerId);\n if((peer as Chat.channel).pFlags.verified && !noVerifiedIcon) {\n elements.push(generateVerifiedIcon());\n }\n\n if(((peer as Chat.channel).pFlags.fake || (peer as User.user).pFlags.scam) && !noFakeIcon) {\n elements.push(generateFakeIcon((peer as User.user).pFlags.scam));\n }\n\n if((peer as User.user).pFlags.premium && !noPremiumIcon) {\n const emojiStatus = (peer as User.user).emoji_status;\n if(emojiStatus && emojiStatus._ !== 'emojiStatusEmpty' && false) {\n const container = document.createElement('span');\n container.classList.add('emoji-status');\n const result = await rootScope.managers.acknowledged.appEmojiManager.getCustomEmojiDocument((emojiStatus as EmojiStatus.emojiStatus).document_id);\n const wrap = async(doc: Document.document) => {\n const size = mediaSizes.active.emojiStatus\n const loadPromises: Promise[] = [];\n await wrapSticker({\n doc,\n div: container,\n width: size.width,\n height: size.height,\n loop: 2,\n play: true,\n group: 'EMOJI-STATUS',\n loadPromises,\n middleware\n // group: 'none'\n });\n\n await Promise.all(loadPromises);\n };\n\n const p = result.result.then(wrap);\n if(result.cached) {\n await p;\n }\n\n elements.push(container);\n } else {\n elements.push(generatePremiumIcon());\n }\n }\n\n return elements;\n}\n","export default function generateVerifiedIcon() {\n const span = document.createElement('span');\n span.classList.add('verified-icon', 'tgico');\n\n const size = 26; // 24\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttributeNS(null, 'viewBox', `0 0 ${size} ${size}`);\n svg.setAttributeNS(null, 'width', `${size}`);\n svg.setAttributeNS(null, 'height', `${size}`);\n svg.classList.add('verified-icon-svg');\n\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use.setAttributeNS(null, 'href', '#verified-icon-background');\n use.classList.add('verified-icon-background');\n\n const use2 = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use2.setAttributeNS(null, 'href', '#verified-icon-check');\n use2.classList.add('verified-icon-check');\n\n // svg.append(use, use2);\n svg.append(use2, use);\n\n span.append(svg);\n\n return span;\n // const span = document.createElement('span');\n // span.classList.add('verified-icon', 'tgico-verified_filled');\n // return span;\n}\n","export default function generatePremiumIcon() {\n const span = document.createElement('span');\n span.classList.add('premium-icon', 'tgico-star');\n return span;\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';\nimport {i18n} from '../lib/langPack';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport {NULL_PEER_ID} from '../lib/mtproto/mtproto_config';\nimport limitSymbols from '../helpers/string/limitSymbols';\nimport setInnerHTML, {setDirection} from '../helpers/dom/setInnerHTML';\nimport safeAssign from '../helpers/object/safeAssign';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport getPeerTitle from './wrappers/getPeerTitle';\nimport generateTitleIcons from './generateTitleIcons';\nimport {wrapTopicIcon} from './wrappers/messageActionTextNewUnsafe';\n\nexport type PeerTitleOptions = {\n peerId?: PeerId,\n fromName?: string,\n plainText?: boolean,\n onlyFirstName?: boolean,\n dialog?: boolean,\n limitSymbols?: number,\n withIcons?: boolean,\n withPremiumIcon?: boolean,\n threadId?: number,\n wrapOptions?: WrapSomethingOptions\n};\n\nconst weakMap: WeakMap = new WeakMap();\n\nrootScope.addEventListener('peer_title_edit', ({peerId, threadId}) => {\n let query = `.peer-title[data-peer-id=\"${peerId}\"]`;\n if(threadId) {\n query += `[data-thread-id=\"${threadId}\"]`;\n }\n\n const elements = Array.from(document.querySelectorAll(query)) as HTMLElement[];\n elements.forEach((element) => {\n const peerTitle = weakMap.get(element);\n peerTitle?.update();\n });\n});\n\nexport default class PeerTitle {\n public element: HTMLElement;\n public options: PeerTitleOptions;\n private hasInner: boolean;\n\n constructor(options?: PeerTitleOptions) {\n this.element = document.createElement('span');\n this.element.classList.add('peer-title');\n setDirection(this.element);\n\n this.options = {};\n\n if(options) {\n this.update(options);\n }\n\n weakMap.set(this.element, this);\n }\n\n public setOptions(options?: PeerTitleOptions) {\n if(!options) {\n return;\n }\n\n safeAssign(this.options, options);\n for(const i in options) {\n // @ts-ignore\n const value = options[i];\n\n if(typeof(value) !== 'object' && typeof(value) !== 'function') {\n // @ts-ignore\n this.element.dataset[i] = value ? '' + (typeof(value) === 'boolean' ? +value : value) : '0';\n }\n }\n }\n\n private setHasInner(hasInner: boolean) {\n if(this.hasInner !== hasInner) {\n this.hasInner = hasInner;\n this.element.classList.toggle('with-icons', hasInner);\n }\n }\n\n public async update(options?: PeerTitleOptions) {\n this.setOptions(options);\n\n let fromName = this.options.fromName;\n if(fromName !== undefined) {\n if(this.options.limitSymbols !== undefined) {\n fromName = limitSymbols(fromName, this.options.limitSymbols, this.options.limitSymbols);\n }\n\n setInnerHTML(this.element, wrapEmojiText(fromName));\n return;\n }\n\n this.options.peerId ??= NULL_PEER_ID;\n\n let hasInner: boolean;\n const {peerId, threadId} = this.options;\n if(peerId !== rootScope.myId || !this.options.dialog) {\n if(threadId) {\n const [topic, isForum] = await Promise.all([\n rootScope.managers.dialogsStorage.getForumTopic(peerId, threadId),\n rootScope.managers.appPeersManager.isForum(peerId)\n ]);\n\n if(!topic && isForum) {\n rootScope.managers.dialogsStorage.getForumTopicById(peerId, threadId).then((forumTopic) => {\n if(!forumTopic && this.options.threadId === threadId) {\n this.options.threadId = undefined;\n this.update({threadId: undefined});\n return;\n }\n\n this.update();\n }, () => {\n if(this.options.threadId === threadId) {\n this.options.threadId = undefined;\n this.update({threadId: undefined});\n }\n });\n\n setInnerHTML(this.element, i18n('Loading'));\n this.setHasInner(false);\n return;\n }\n }\n\n const getTopicIconPromise = threadId && this.options.withIcons ?\n rootScope.managers.dialogsStorage.getForumTopic(peerId, threadId).then((topic) => wrapTopicIcon({...(this.options.wrapOptions ?? {}), topic})) :\n undefined;\n\n const [title, icons, topicIcon] = await Promise.all([\n getPeerTitle(this.options as Required),\n (this.options.withIcons && generateTitleIcons(peerId, this.options.wrapOptions?.middleware)) || (this.options.withPremiumIcon && generateTitleIcons(peerId, this.options.wrapOptions?.middleware, true, true)),\n getTopicIconPromise\n ]);\n\n if(icons?.length || topicIcon) {\n const inner = document.createElement('span');\n inner.classList.add('peer-title-inner');\n hasInner = true;\n setInnerHTML(inner, title);\n\n const fragment = document.createDocumentFragment();\n fragment.append(...[topicIcon, inner, ...(icons ?? [])].filter(Boolean));\n setInnerHTML(this.element, fragment);\n } else {\n setInnerHTML(this.element, title);\n }\n } else {\n replaceContent(this.element, i18n(this.options.onlyFirstName ? 'Saved' : 'SavedMessages'));\n }\n\n this.setHasInner(hasInner);\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 {AppDownloadManager} from '../../lib/appManagers/appDownloadManager';\nimport resizeableImage from '../../lib/cropper';\nimport PopupElement from '.';\nimport {_i18n} from '../../lib/langPack';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport readBlobAsDataURL from '../../helpers/blob/readBlobAsDataURL';\nimport rootScope from '../../lib/rootScope';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\n\nexport default class PopupAvatar extends PopupElement {\n private cropContainer: HTMLElement;\n private input: HTMLInputElement;\n private h6: HTMLElement;\n\n private image = new Image();\n\n private canvas: HTMLCanvasElement;\n private blob: Blob;\n private cropper = {\n crop: () => {},\n removeHandlers: () => {}\n };\n\n private onCrop: (upload: () => ReturnType) => void;\n\n constructor(options: Partial<{\n isForum: boolean\n }> = {}) {\n super('popup-avatar', {closable: true, withConfirm: true});\n\n this.h6 = document.createElement('h6');\n _i18n(this.h6, 'Popup.Avatar.Title');\n\n this.btnClose.classList.remove('btn-icon');\n\n this.header.append(this.h6);\n\n this.cropContainer = document.createElement('div');\n this.cropContainer.classList.add('crop');\n this.cropContainer.append(this.image);\n\n if(options.isForum) {\n this.cropContainer.classList.add('is-forum');\n }\n\n this.input = document.createElement('input');\n this.input.type = 'file';\n this.input.style.display = 'none';\n this.listenerSetter.add(this.input)('change', (e: any) => {\n const file = e.target.files[0];\n if(!file) {\n return;\n }\n\n readBlobAsDataURL(file).then((contents) => {\n this.image = new Image();\n this.cropContainer.append(this.image);\n this.image.src = contents;\n\n this.image.onload = () => {\n /* let {w, h} = calcImageInBox(this.image.naturalWidth, this.image.naturalHeight, 460, 554);\n cropContainer.style.width = w + 'px';\n cropContainer.style.height = h + 'px'; */\n this.show();\n\n this.cropper = resizeableImage(this.image, this.canvas);\n this.input.value = '';\n };\n });\n }, false);\n\n this.btnConfirm.className = 'btn-primary btn-color-primary btn-circle btn-crop btn-icon tgico-check z-depth-1';\n attachClickEvent(this.btnConfirm, () => {\n this.cropper.crop();\n this.hide();\n\n this.canvas.toBlob((blob) => {\n this.blob = blob; // save blob to send after reg\n this.darkenCanvas();\n this.resolve();\n }, 'image/jpeg', 1);\n }, {listenerSetter: this.listenerSetter});\n\n this.container.append(this.cropContainer, this.btnConfirm, this.input);\n\n this.addEventListener('closeAfterTimeout', () => {\n this.cropper.removeHandlers();\n if(this.image) {\n this.image.remove();\n }\n });\n }\n\n private resolve() {\n this.onCrop(() => {\n return appDownloadManager.upload(this.blob);\n });\n }\n\n public open(postCanvas: HTMLCanvasElement, onCrop: PopupAvatar['onCrop']) {\n this.canvas = postCanvas;\n this.onCrop = onCrop;\n\n this.input.click();\n }\n\n public darkenCanvas() {\n const ctx = this.canvas.getContext('2d');\n ctx.fillStyle = 'rgba(0, 0, 0, 0.3)';\n ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);\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\nfunction resizeableImage(originalImage: HTMLImageElement, canvas?: HTMLCanvasElement) {\n let cropComponent: HTMLDivElement,\n container: HTMLDivElement,\n cropImage: HTMLImageElement,\n event_state: Partial<{\n mouse_x: number,\n mouse_y: number,\n container_width: number,\n container_height: number,\n container_left: number,\n container_top: number\n }> = {},\n keyZoomValue = 4.0,\n MINWIDTH = 50,\n MINHEIGHT = 50,\n CROPWIDTH = 200,\n CROPHEIGHT = 200,\n cropLeft = 0,\n cropTop = 0,\n cropWidth = 0,\n cropHeight = 0,\n scaledRatio = 0;\n\n if(originalImage.complete) init();\n else originalImage.onload = init;\n\n function removeHandlers() {\n container.removeEventListener('mousedown', startMoving);\n container.removeEventListener('touchstart', startMoving);\n container.removeEventListener('wheel', resizing);\n\n document.removeEventListener('mouseup', endMoving);\n document.removeEventListener('touchend', endMoving);\n document.removeEventListener('mousemove', moving);\n document.removeEventListener('touchmove', moving);\n document.removeEventListener('keypress', keyHandler);\n\n cropComponent.remove();\n container.remove();\n cropImage.remove();\n }\n\n function addHandlers() {\n container.addEventListener('mousedown', startMoving, false);\n container.addEventListener('touchstart', startMoving, false);\n container.addEventListener('wheel', resizing, false);\n\n document.addEventListener('keypress', keyHandler, false);\n // document.querySelector('.btn-crop').addEventListener('click', openCropCanvasImg);\n }\n\n function init() {\n originalImage.classList.add('crop-blur');\n originalImage.draggable = false;\n\n cropImage = new Image();\n cropImage.src = originalImage.src;\n cropImage.draggable = false;\n cropImage.classList.add('crop-overlay-image');\n\n if(!canvas) {\n canvas = document.createElement('canvas');\n }\n\n cropComponent = document.createElement('div');\n cropComponent.classList.add('crop-component');\n\n container = document.createElement('div');\n container.classList.add('crop-overlay');\n\n const overlayColor = document.createElement('div');\n overlayColor.classList.add('crop-overlay-color');\n\n cropComponent.appendChild(container);\n const wrapper = originalImage.parentNode as HTMLElement;\n wrapper.appendChild(cropComponent);\n cropComponent.appendChild(cropImage);\n cropComponent.appendChild(originalImage);\n cropComponent.appendChild(overlayColor);\n container.appendChild(cropImage);\n\n cropImage.style.maxWidth = originalImage.width + 'px';\n\n scaledRatio = originalImage.naturalWidth / originalImage.offsetWidth;\n\n const left = originalImage.offsetWidth / 2 - CROPWIDTH / 2;\n const top = originalImage.offsetHeight / 2 - CROPHEIGHT / 2;\n\n updateCropSize(CROPWIDTH, CROPHEIGHT);\n updateCropImage(left, top);\n updateContainer(left, top);\n addHandlers();\n // crop();\n }\n\n function updateCropSize(width: number, height: number) {\n cropWidth = width * scaledRatio;\n cropHeight = height * scaledRatio;\n\n container.style.width = width + 'px';\n container.style.height = height + 'px';\n }\n\n function updateCropImage(left: number, top: number) {\n cropTop = top * scaledRatio;\n cropLeft = left * scaledRatio;\n\n cropImage.style.top = -top + 'px';\n cropImage.style.left = -left + 'px';\n }\n\n function updateContainer(left: number, top: number) {\n container.style.top = top + 'px';\n container.style.left = left + 'px';\n }\n\n // Save the initial event details and container state\n function saveEventState(e: any) {\n event_state.container_width = container.offsetWidth;\n event_state.container_height = container.offsetHeight;\n\n event_state.container_left = container.offsetLeft;\n event_state.container_top = container.offsetTop;\n\n event_state.mouse_x = (e.clientX || e.pageX || e.touches && e.touches[0].clientX) + window.scrollX;\n event_state.mouse_y = (e.clientY || e.pageY || e.touches && e.touches[0].clientY) + window.scrollY;\n }\n\n function imgZoom(zoom: number) {\n zoom = zoom * Math.PI * 2\n let newWidth = Math.floor(container.clientWidth + zoom),\n newHeight = Math.floor(container.clientHeight + zoom),\n w = cropImage.clientWidth,\n h = cropImage.clientHeight,\n left: number,\n top: number,\n right: number,\n bottom: number;\n\n if(newWidth < MINWIDTH) {\n return;\n } else if(newWidth > w) {\n return;\n }\n\n left = container.offsetLeft - (zoom / 2);\n top = container.offsetTop - (zoom / 2);\n right = left + newWidth;\n bottom = top + newHeight;\n\n if(left < 0) left = 0;\n if(top < 0) top = 0;\n\n if(right > w) return;\n if(bottom > h) return;\n\n updateCropSize(newWidth, newWidth);\n updateCropImage(left, top);\n updateContainer(left, top);\n // crop();\n }\n\n function keyHandler(e: KeyboardEvent) {\n e.preventDefault();\n\n switch(String.fromCharCode(e.charCode)) {\n case '+':\n imgZoom(keyZoomValue);\n break;\n case '-':\n imgZoom(-keyZoomValue);\n break;\n }\n }\n\n function resizing(e: any) {\n e.preventDefault();\n imgZoom(e.deltaY > 0 ? 1 : -1);\n }\n\n function startMoving(e: MouseEvent | TouchEvent) {\n e.preventDefault();\n e.stopPropagation();\n\n saveEventState(e);\n\n document.addEventListener('mousemove', moving);\n document.addEventListener('touchmove', moving);\n document.addEventListener('mouseup', endMoving);\n document.addEventListener('touchend', endMoving);\n }\n\n function endMoving(e: MouseEvent | TouchEvent) {\n e.preventDefault();\n\n document.removeEventListener('mouseup', endMoving);\n document.removeEventListener('touchend', endMoving);\n document.removeEventListener('mousemove', moving);\n document.removeEventListener('touchmove', moving);\n }\n\n function moving(e: any) {\n let currentTouch = {x: 0, y: 0},\n left: number,\n top: number,\n w: number,\n h: number;\n\n e.preventDefault();\n e.stopPropagation();\n\n currentTouch.x = e.pageX || e.touches && e.touches[0].pageX;\n currentTouch.y = e.pageY || e.touches && e.touches[0].pageY;\n\n left = currentTouch.x - (event_state.mouse_x - event_state.container_left);\n top = currentTouch.y - (event_state.mouse_y - event_state.container_top);\n w = container.offsetWidth;\n h = container.offsetHeight;\n\n if(left < 0) left = 0;\n else if(left > cropImage.offsetWidth - w) left = cropImage.offsetWidth - w;\n\n if(top < 0) top = 0;\n else if(top > cropImage.offsetHeight - h) top = cropImage.offsetHeight - h;\n\n updateCropImage(left, top);\n updateContainer(left, top);\n // crop();\n }\n\n function crop() {\n canvas.width = cropWidth;\n canvas.height = cropHeight;\n\n const ctx = canvas.getContext('2d');\n ctx.drawImage(originalImage,\n cropLeft, cropTop,\n cropWidth, cropHeight,\n 0, 0,\n cropWidth, cropHeight\n );\n }\n\n return {crop, removeHandlers};\n}\n\nexport default resizeableImage;\n","/*\n * 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 '.';\nimport type {PeerType} from '../../lib/appManagers/appPeersManager';\nimport {FormatterArguments, LangPackKey} from '../../lib/langPack';\nimport wrapPeerTitle from '../wrappers/peerTitle';\nimport PopupPeer, {PopupPeerButtonCallbackCheckboxes, PopupPeerOptions} from './peer';\n\nexport default class PopupDeleteDialog {\n constructor(\n private peerId: PeerId,\n // actionType: 'leave' | 'delete',\n private peerType?: PeerType,\n private onSelect?: (promise: Promise) => void,\n private threadId?: number\n ) {\n this.construct();\n }\n\n private async construct() {\n let {peerId, peerType, onSelect, threadId} = this;\n const peerTitleElement = await wrapPeerTitle({peerId, threadId: threadId});\n\n const managers = PopupElement.MANAGERS;\n if(peerType === undefined) {\n peerType = await managers.appPeersManager.getDialogType(peerId);\n }\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 = managers.appChatsManager.leave(peerId.toChatId());\n\n if(flush) {\n promise = promise.then(() => {\n return managers.appMessagesManager.flushHistory(peerId);\n }) as any;\n }\n\n onSelect?.(promise);\n };\n\n const callbackDelete = (checked: PopupPeerButtonCallbackCheckboxes) => {\n let promise: Promise;\n\n if(threadId) {\n promise = managers.appMessagesManager.flushHistory(peerId, false, true, threadId);\n } else if(peerId.isUser()) {\n promise = managers.appMessagesManager.flushHistory(peerId, false, checkboxes ? !!checked.size : undefined);\n } else {\n if(checked.size) {\n promise = managers.appChatsManager.delete(peerId.toChatId());\n } else {\n return callbackLeave(checked);\n }\n }\n\n onSelect?.(promise);\n };\n\n let title: LangPackKey,\n titleArgs: FormatterArguments,\n description: LangPackKey,\n descriptionArgs: FormatterArguments,\n buttons: PopupPeerOptions['buttons'],\n checkboxes: PopupPeerOptions['checkboxes'];\n switch(peerType) {\n case 'channel': {\n if(/* actionType === 'delete' && */await managers.appChatsManager.hasRights(peerId.toChatId(), 'delete_chat')) {\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 await wrapPeerTitle({peerId})\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(threadId) {\n title = 'DeleteTopics';\n titleArgs = [1];\n description = 'DeleteSelectedTopic';\n descriptionArgs = [peerTitleElement];\n buttons = [{\n langKey: 'Delete',\n isDanger: true,\n callback: callbackDelete\n }];\n } else if(/* actionType === 'delete' && */await managers.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 threadId,\n titleLangKey: title,\n titleLangArgs: titleArgs,\n descriptionLangKey: description,\n descriptionLangArgs: descriptionArgs,\n buttons,\n checkboxes\n }).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 rootScope from '../../lib/rootScope';\nimport PopupElement, {addCancelButton} from '.';\nimport PopupPeer, {PopupPeerButtonCallbackCheckboxes, PopupPeerOptions} from './peer';\nimport {ChatType} from '../chat/chat';\nimport {i18n, LangPackKey} from '../../lib/langPack';\nimport hasRights from '../../lib/appManagers/utils/chats/hasRights';\nimport filterAsync from '../../helpers/array/filterAsync';\nimport wrapPeerTitle from '../wrappers/peerTitle';\n\nexport default class PopupDeleteMessages {\n constructor(\n private peerId: PeerId,\n private mids: number[],\n private type: ChatType,\n private onConfirm?: () => void,\n private threadId?: number\n ) {\n this.construct();\n }\n\n private async construct() {\n let {peerId, mids, type, onConfirm, threadId} = this;\n\n const peerTitleElement = await wrapPeerTitle({peerId, threadId});\n\n const managers = PopupElement.MANAGERS;\n\n mids = mids.slice();\n const callback = (checked: PopupPeerButtonCallbackCheckboxes, revoke?: boolean) => {\n onConfirm && onConfirm();\n if(type === 'scheduled') {\n managers.appMessagesManager.deleteScheduledMessages(peerId, mids);\n } else {\n managers.appMessagesManager.deleteMessages(peerId, mids, !!checked.size || revoke);\n }\n };\n\n const buttons: PopupPeerOptions['buttons'] = [{\n langKey: 'Delete',\n isDanger: true,\n callback\n }];\n const checkboxes: PopupPeerOptions['checkboxes'] = [];\n let title: LangPackKey, titleArgs: any[], description: LangPackKey, descriptionArgs: any[];\n if(mids.length === 1) {\n title = 'DeleteSingleMessagesTitle';\n } else {\n title = 'DeleteMessagesTitle';\n titleArgs = [i18n('messages', [mids.length])];\n }\n\n if(await managers.appPeersManager.isMegagroup(peerId)) {\n description = mids.length === 1 ? 'AreYouSureDeleteSingleMessageMega' : 'AreYouSureDeleteFewMessagesMega';\n } else {\n description = mids.length === 1 ? 'AreYouSureDeleteSingleMessage' : 'AreYouSureDeleteFewMessages';\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 = await managers.appChatsManager.getChat(peerId.toChatId());\n\n const _hasRights = hasRights(chat, 'delete_messages');\n if(chat._ === 'chat') {\n const canRevoke = _hasRights ? mids.slice() : await filterAsync(mids, async(mid) => {\n const message = await managers.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 threadId,\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 appImManager from '../../lib/appManagers/appImManager';\nimport rootScope from '../../lib/rootScope';\nimport {toastNew} from '../toast';\nimport PopupPickUser from './pickUser';\n\nexport default class PopupForward extends PopupPickUser {\n constructor(\n peerIdMids?: {[fromPeerId: PeerId]: number[]},\n onSelect?: (peerId: PeerId) => Promise | void\n ) {\n super({\n peerTypes: ['dialogs', 'contacts'],\n onSelect: !peerIdMids && onSelect ? onSelect : async(peerId) => {\n if(onSelect) {\n const res = onSelect(peerId);\n if(res instanceof Promise) {\n await res;\n }\n }\n\n if(peerId === rootScope.myId) {\n let count = 0;\n for(const fromPeerId in peerIdMids) {\n const mids = peerIdMids[fromPeerId];\n count += mids.length;\n this.managers.appMessagesManager.forwardMessages(peerId, fromPeerId.toPeerId(), mids);\n }\n\n toastNew({\n langPackKey: count > 0 ? 'FwdMessagesToSavedMessages' : 'FwdMessageToSavedMessages'\n });\n\n return;\n }\n\n appImManager.setInnerPeer({peerId});\n appImManager.chat.input.initMessagesForward(peerIdMids);\n },\n placeholder: 'ShareModal.Search.ForwardPlaceholder',\n chatRightsAction: 'send_messages',\n selfPresence: 'ChatYourSelf'\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 ripple from '../ripple';\nimport animationIntersector from '../animationIntersector';\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\nimport {i18n, LangPackKey, _i18n} from '../../lib/langPack';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport isSendShortcutPressed from '../../helpers/dom/isSendShortcutPressed';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport EventListenerBase, {EventListenerListeners} from '../../helpers/eventListenerBase';\nimport {addFullScreenListener, getFullScreenElement} from '../../helpers/dom/fullScreen';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport overlayCounter from '../../helpers/overlayCounter';\nimport Scrollable from '../scrollable';\nimport {getMiddleware, MiddlewareHelper} from '../../helpers/middleware';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\n\nexport type PopupButton = {\n text?: string,\n callback?: () => void,\n langKey?: LangPackKey,\n langArgs?: any[],\n isDanger?: boolean,\n isCancel?: boolean,\n element?: HTMLButtonElement,\n noRipple?: boolean\n};\n\nexport type PopupOptions = Partial<{\n closable: boolean,\n overlayClosable: boolean,\n withConfirm: LangPackKey | boolean,\n body: boolean,\n confirmShortcutIsSendShortcut: boolean,\n withoutOverlay: boolean,\n scrollable: boolean,\n buttons: Array,\n title: boolean | LangPackKey,\n titleRaw: string\n}>;\n\nexport interface PopupElementConstructable {\n new(...args: any[]): T;\n}\n\nconst DEFAULT_APPEND_TO = document.body;\nlet appendPopupTo = DEFAULT_APPEND_TO;\n\nconst onFullScreenChange = () => {\n appendPopupTo = getFullScreenElement() || DEFAULT_APPEND_TO;\n PopupElement.reAppend();\n};\n\naddFullScreenListener(DEFAULT_APPEND_TO, onFullScreenChange);\n\ntype PopupListeners = {\n close: () => void,\n closeAfterTimeout: () => void\n};\n\nexport default class PopupElement extends EventListenerBase {\n private static POPUPS: PopupElement[] = [];\n public static MANAGERS: AppManagers;\n\n protected element = document.createElement('div');\n protected container = document.createElement('div');\n protected header = document.createElement('div');\n protected title = document.createElement('div');\n protected btnClose: HTMLElement;\n protected btnConfirm: HTMLButtonElement;\n protected body: HTMLElement;\n protected buttonsEl: HTMLElement;\n\n protected onEscape: () => boolean = () => true;\n\n protected navigationItem: NavigationItem;\n\n protected listenerSetter: ListenerSetter;\n\n protected confirmShortcutIsSendShortcut: boolean;\n protected btnConfirmOnEnter: HTMLElement;\n\n protected withoutOverlay: boolean;\n\n protected managers: AppManagers;\n\n protected scrollable: Scrollable;\n\n protected buttons: Array;\n\n protected middlewareHelper: MiddlewareHelper;\n\n constructor(className: string, options: PopupOptions = {}) {\n super(false);\n this.element.classList.add('popup');\n this.element.className = 'popup' + (className ? ' ' + className : '');\n this.container.classList.add('popup-container', 'z-depth-1');\n\n this.header.classList.add('popup-header');\n\n if(options.title || options.titleRaw) {\n this.title.classList.add('popup-title');\n if(typeof(options.title) === 'string') {\n _i18n(this.title, options.title);\n } else if(options.titleRaw) {\n this.title.append(wrapEmojiText(options.titleRaw));\n }\n\n this.header.append(this.title);\n }\n\n this.middlewareHelper = getMiddleware();\n this.listenerSetter = new ListenerSetter();\n this.managers = PopupElement.MANAGERS;\n\n this.confirmShortcutIsSendShortcut = options.confirmShortcutIsSendShortcut;\n\n if(options.closable) {\n this.btnClose = document.createElement('span');\n this.btnClose.classList.add('btn-icon', 'popup-close', 'tgico-close');\n // ripple(this.closeBtn);\n this.header.prepend(this.btnClose);\n\n attachClickEvent(this.btnClose, this.hide, {listenerSetter: this.listenerSetter, once: true});\n }\n\n this.withoutOverlay = options.withoutOverlay;\n if(this.withoutOverlay) {\n this.element.classList.add('no-overlay');\n }\n\n if(options.overlayClosable) {\n attachClickEvent(this.element, (e: MouseEvent) => {\n if(!findUpClassName(e.target, 'popup-container')) {\n this.hide();\n }\n }, {listenerSetter: this.listenerSetter});\n }\n\n if(options.withConfirm) {\n this.btnConfirm = document.createElement('button');\n this.btnConfirm.classList.add('btn-primary', 'btn-color-primary');\n if(options.withConfirm !== true) {\n this.btnConfirm.append(i18n(options.withConfirm));\n }\n this.header.append(this.btnConfirm);\n ripple(this.btnConfirm);\n }\n\n this.container.append(this.header);\n if(options.body) {\n this.body = document.createElement('div');\n this.body.classList.add('popup-body');\n this.container.append(this.body);\n }\n\n if(options.scrollable) {\n const scrollable = this.scrollable = new Scrollable(this.body);\n this.attachScrollableListeners();\n\n if(!this.body) {\n this.container.insertBefore(scrollable.container, this.header.nextSibling);\n }\n }\n\n let btnConfirmOnEnter = this.btnConfirm;\n const buttons = this.buttons = options.buttons;\n if(buttons?.length) {\n const buttonsDiv = this.buttonsEl = document.createElement('div');\n buttonsDiv.classList.add('popup-buttons');\n\n const buttonsElements = buttons.map((b) => {\n const button = document.createElement('button');\n button.className = 'btn' + (b.isDanger ? ' danger' : ' primary');\n\n if(!b.noRipple) {\n ripple(button);\n }\n\n if(b.text) {\n button.textContent = b.text;\n } else {\n button.append(i18n(b.langKey, b.langArgs));\n }\n\n attachClickEvent(button, () => {\n b.callback?.();\n this.destroy();\n }, {listenerSetter: this.listenerSetter, once: true});\n\n return b.element = button;\n });\n\n if(!btnConfirmOnEnter && buttons.length === 2) {\n const button = buttons.find((button) => !button.isCancel);\n if(button) {\n btnConfirmOnEnter = button.element;\n }\n }\n\n buttonsDiv.append(...buttonsElements);\n this.container.append(buttonsDiv);\n }\n\n this.btnConfirmOnEnter = btnConfirmOnEnter;\n\n this.element.append(this.container);\n\n PopupElement.POPUPS.push(this);\n }\n\n protected attachScrollableListeners(setClassOn?: HTMLElement) {\n return this.scrollable.attachBorderListeners(setClassOn);\n }\n\n protected onContentUpdate() {\n if(this.scrollable) {\n this.scrollable.onAdditionalScroll();\n }\n }\n\n public show() {\n this.navigationItem = {\n type: 'popup',\n onPop: () => this.destroy(),\n onEscape: this.onEscape\n };\n\n appNavigationController.pushItem(this.navigationItem);\n\n blurActiveElement(); // * hide mobile keyboard\n appendPopupTo.append(this.element);\n void this.element.offsetWidth; // reflow\n this.element.classList.add('active');\n\n this.onContentUpdate();\n\n if(!this.withoutOverlay) {\n overlayCounter.isOverlayActive = true;\n animationIntersector.checkAnimations2(true);\n }\n\n // cannot add event instantly because keydown propagation will fire it\n // if(this.btnConfirmOnEnter) {\n setTimeout(() => {\n if(!this.element.classList.contains('active')) {\n return;\n }\n\n this.listenerSetter.add(document.body)('keydown', (e) => {\n if(PopupElement.POPUPS[PopupElement.POPUPS.length - 1] !== this) {\n return;\n }\n\n if(this.confirmShortcutIsSendShortcut ? isSendShortcutPressed(e) : e.key === 'Enter') {\n simulateClickEvent(this.btnConfirmOnEnter);\n cancelEvent(e);\n }\n });\n }, 0);\n // }\n }\n\n public hide = () => {\n appNavigationController.backByItem(this.navigationItem);\n };\n\n protected destroy() {\n this.dispatchEvent('close');\n this.element.classList.add('hiding');\n this.element.classList.remove('active');\n this.listenerSetter.removeAll();\n this.middlewareHelper.destroy();\n\n if(!this.withoutOverlay) {\n overlayCounter.isOverlayActive = false;\n }\n\n appNavigationController.removeItem(this.navigationItem);\n this.navigationItem = undefined;\n\n indexOfAndSplice(PopupElement.POPUPS, this);\n\n // ! calm\n onFullScreenChange();\n\n setTimeout(() => {\n this.element.remove();\n this.dispatchEvent('closeAfterTimeout');\n this.cleanup();\n this.scrollable?.destroy();\n\n if(!this.withoutOverlay) {\n animationIntersector.checkAnimations2(false);\n }\n }, 150);\n }\n\n public static reAppend() {\n this.POPUPS.forEach((popup) => {\n const {element, container} = popup;\n const parentElement = element.parentElement;\n if(parentElement && parentElement !== appendPopupTo && appendPopupTo !== container) {\n appendPopupTo.append(element);\n }\n });\n }\n\n public static getPopups(popupConstructor: PopupElementConstructable) {\n return this.POPUPS.filter((element) => element instanceof popupConstructor) as T[];\n }\n\n public static createPopup>(ctor: {new(...args: A): T}, ...args: A) {\n const popup = new ctor(...args);\n return popup;\n }\n}\n\nexport const addCancelButton = (buttons: PopupButton[]) => {\n const button = buttons.find((b) => b.isCancel);\n if(!button) {\n buttons.push({\n langKey: 'Cancel',\n isCancel: true\n });\n }\n\n return buttons;\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 {doubleRaf} from '../../helpers/schedulers';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {LangPackKey, _i18n, i18n} from '../../lib/langPack';\nimport {ApiLimitType} from '../../lib/mtproto/api_methods';\nimport rootScope from '../../lib/rootScope';\nimport PopupPeer from './peer';\n\nconst a: {[type in ApiLimitType]?: {\n title: LangPackKey,\n description: LangPackKey,\n descriptionPremium: LangPackKey,\n descriptionLocked: LangPackKey,\n icon: string\n}} = {\n pin: {\n title: 'LimitReached',\n description: 'LimitReachedPinDialogs',\n descriptionPremium: 'LimitReachedPinDialogsPremium',\n descriptionLocked: 'LimitReachedPinDialogsLocked',\n icon: 'limit_pin'\n },\n folders: {\n title: 'LimitReached',\n description: 'LimitReachedFolders',\n descriptionPremium: 'LimitReachedFoldersPremium',\n descriptionLocked: 'LimitReachedFoldersLocked',\n icon: 'limit_folders'\n }\n};\n\nclass P extends PopupPeer {\n constructor(options: {\n isPremium: boolean,\n limit: number,\n limitPremium: number\n }, _a: typeof a[keyof typeof a]) {\n super('popup-limit', {\n buttons: options.isPremium === undefined ? [{\n langKey: 'LimitReached.Ok',\n isCancel: true\n }] : (options.isPremium ? [{\n langKey: 'OK',\n isCancel: true\n }] : [{\n langKey: 'IncreaseLimit',\n callback: () => {\n appImManager.openPremiumBot();\n },\n noRipple: true\n }, {\n langKey: 'Cancel',\n isCancel: true\n }]),\n descriptionLangKey: options.isPremium === undefined ? _a.descriptionLocked : (options.isPremium ? _a.descriptionPremium : _a.description),\n descriptionLangArgs: options.isPremium ? [options.limitPremium] : [options.limit, options.limitPremium],\n titleLangKey: _a.title\n });\n\n const isLocked = options.isPremium === undefined;\n if(isLocked) {\n this.element.classList.add('is-locked');\n } else if(options.isPremium) {\n this.element.classList.add('is-premium');\n } else {\n const button = this.buttons.find((b) => !b.isCancel);\n button.element.classList.add('popup-limit-button');\n const i = document.createElement('i');\n i.classList.add('popup-limit-button-icon', 'tgico-premium_double');\n button.element.append(i);\n }\n\n const limitContainer = document.createElement('div');\n limitContainer.classList.add('popup-limit-line');\n\n const hint = document.createElement('div');\n hint.classList.add('popup-limit-hint');\n const i = document.createElement('span');\n i.classList.add('popup-limit-hint-icon', 'tgico-' + _a.icon);\n hint.append(i, '' + (options.isPremium ? options.limitPremium : options.limit));\n\n limitContainer.append(hint);\n\n if(!isLocked) {\n const limit = document.createElement('div');\n limit.classList.add('limit-line');\n\n const free = document.createElement('div');\n free.classList.add('limit-line-free');\n\n const premium = document.createElement('div');\n premium.classList.add('limit-line-premium');\n\n limit.append(free, premium);\n\n _i18n(free, 'LimitFree');\n premium.append(i18n('LimitPremium'), '' + options.limitPremium);\n\n limitContainer.append(limit);\n }\n\n this.container.insertBefore(limitContainer, this.description);\n\n // if(options.isPremium === false) {\n // this.buttons.pop().element.remove();\n // }\n\n const setHintActive = () => {\n hint.classList.add('active');\n };\n\n if(rootScope.settings.animationsEnabled) {\n doubleRaf().then(setHintActive);\n } else {\n setHintActive();\n }\n }\n}\n\nexport default async function showLimitPopup(type: keyof typeof a) {\n const _a = a[type];\n const [appConfig, limit, limitPremium] = await Promise.all([\n rootScope.managers.apiManager.getAppConfig(),\n ...[false, true].map((v) => rootScope.managers.apiManager.getLimit(type, v))\n ]);\n const isLocked = appConfig.premium_purchase_blocked;\n new P({\n isPremium: isLocked ? undefined : rootScope.premium,\n limit,\n limitPremium\n }, _a).show();\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 tsNow from '../../helpers/tsNow';\nimport {LangPackKey} from '../../lib/langPack';\nimport {MUTE_UNTIL} from '../../lib/mtproto/mtproto_config';\nimport {RadioFormFromValues} from '../row';\nimport PopupPeer from './peer';\n\nconst ONE_HOUR = 3600;\nconst times: {value: number | string, langPackKey: LangPackKey, checked?: boolean}[] = [{\n value: ONE_HOUR,\n langPackKey: 'ChatList.Mute.1Hour'\n}, {\n value: ONE_HOUR * 4,\n langPackKey: 'ChatList.Mute.4Hours'\n}, {\n value: ONE_HOUR * 8,\n langPackKey: 'ChatList.Mute.8Hours'\n}, {\n value: ONE_HOUR * 24,\n langPackKey: 'ChatList.Mute.1Day'\n}, {\n value: ONE_HOUR * 24 * 3,\n langPackKey: 'ChatList.Mute.3Days'\n}, {\n value: -1,\n langPackKey: 'ChatList.Mute.Forever',\n checked: true\n}];\n\nexport default class PopupMute extends PopupPeer {\n constructor(peerId: PeerId, threadId?: number) {\n super('popup-mute', {\n peerId,\n titleLangKey: 'Notifications',\n buttons: [{\n langKey: 'ChatList.Context.Mute',\n callback: () => {\n this.managers.appMessagesManager.mutePeer({peerId, muteUntil: time === -1 ? MUTE_UNTIL : tsNow(true) + time, threadId});\n }\n }],\n body: true\n });\n\n let time: number;\n const radioForm = RadioFormFromValues(times, (value) => {\n time = +value;\n });\n\n this.body.append(radioForm);\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 AvatarElement from '../avatar';\nimport PopupElement, {addCancelButton, PopupButton, PopupOptions} from '.';\nimport {i18n, LangPackKey} from '../../lib/langPack';\nimport CheckboxField, {CheckboxFieldOptions} from '../checkboxField';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\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 = Omit & Partial<{\n peerId: PeerId,\n threadId: number,\n title: string | HTMLElement,\n titleLangKey: LangPackKey,\n titleLangArgs: any[],\n noTitle: boolean,\n description: string | DocumentFragment,\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 : ''), {\n overlayClosable: true,\n ...options,\n title: true,\n buttons: options.buttons && addCancelButton(options.buttons)\n });\n\n if(options.peerId) {\n const avatarEl = new AvatarElement();\n avatarEl.classList.add('avatar-32');\n avatarEl.updateWithOptions({\n isDialog: true,\n peerId: options.peerId,\n threadId: options.threadId,\n wrapOptions: {\n middleware: this.middlewareHelper.get()\n }\n });\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) setInnerHTML(p, 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 = true;\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","/*\n * 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 AppSelectPeers from '../appSelectPeers';\nimport PopupElement from '.';\nimport {LangPackKey, _i18n} from '../../lib/langPack';\n\nexport default class PopupPickUser extends PopupElement {\n protected selector: AppSelectPeers;\n\n constructor(options: {\n peerTypes: AppSelectPeers['peerType'],\n onSelect?: (peerId: PeerId) => Promise | void,\n placeholder: LangPackKey,\n chatRightsAction?: AppSelectPeers['chatRightsAction'],\n peerId?: number,\n selfPresence?: LangPackKey\n }) {\n super('popup-forward', {closable: true, overlayClosable: true, body: true, title: true});\n\n this.selector = new AppSelectPeers({\n appendTo: this.body,\n onChange: async() => {\n const selected = this.selector.getSelected();\n const peerId = selected[selected.length - 1].toPeerId();\n\n if(options.onSelect) {\n const res = options.onSelect(peerId);\n if(res instanceof Promise) {\n try {\n await res;\n } catch(err) {\n return;\n }\n }\n }\n\n this.selector = null;\n this.hide();\n },\n peerType: options.peerTypes,\n onFirstRender: () => {\n this.show();\n this.selector.checkForTriggers(); // ! due to zero height before mounting\n\n if(!IS_TOUCH_SUPPORTED) {\n this.selector.input.focus();\n }\n },\n chatRightsAction: options.chatRightsAction,\n multiSelect: false,\n rippleEnabled: false,\n avatarSize: 'abitbigger',\n peerId: options.peerId,\n placeholder: options.placeholder,\n selfPresence: options.selfPresence,\n managers: this.managers\n });\n\n this.scrollable = this.selector.scrollable;\n this.attachScrollableListeners();\n\n // this.scrollable = new Scrollable(this.body);\n\n this.title.append(this.selector.input);\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 PopupPeer from './peer';\n\nexport default class PopupSendNow extends PopupPeer {\n constructor(peerId: PeerId, mids: number[], onConfirm?: () => void) {\n super('popup-delete-chat', {\n title: `Send Message${mids.length > 1 ? 's' : ''} Now`,\n description: mids.length > 1 ? 'Send ' + mids.length + ' messages now?' : 'Send message now?',\n buttons: [{\n langKey: 'Send',\n callback: () => {\n onConfirm && onConfirm();\n this.managers.appMessagesManager.sendScheduledMessages(peerId, mids);\n }\n }]\n });\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 type {AppStickersManager} from '../../lib/appManagers/appStickersManager';\nimport PopupElement from '.';\nimport wrapSticker from '../wrappers/sticker';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport {putPreloader} from '../putPreloader';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {i18n} from '../../lib/langPack';\nimport Button from '../button';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport toggleDisability from '../../helpers/dom/toggleDisability';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport {toastNew} from '../toast';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport createStickersContextMenu from '../../helpers/dom/createStickersContextMenu';\nimport attachStickerViewerListeners from '../stickerViewer';\nimport {Document, StickerSet} from '../../layer';\nimport Row from '../row';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport rootScope from '../../lib/rootScope';\nimport wrapCustomEmoji from '../wrappers/customEmoji';\nimport emoticonsDropdown from '../emoticonsDropdown';\n\nconst ANIMATION_GROUP: AnimationItemGroup = 'STICKERS-POPUP';\n\nexport default class PopupStickers extends PopupElement {\n private stickersFooter: HTMLElement;\n private appendTo: HTMLElement;\n private updateAdded: {[setId: Long]: (added: boolean) => void};\n private sets: StickerSet.stickerSet[];\n private button: HTMLElement;\n\n constructor(\n private stickerSetInput: Parameters[0] | Parameters[0][],\n private isEmojis?: boolean\n ) {\n super('popup-stickers', {closable: true, overlayClosable: true, body: true, scrollable: true, title: true});\n\n this.title.append(i18n('Loading'));\n this.updateAdded = {};\n\n emoticonsDropdown.setIgnoreMouseOut('popup', true);\n this.addEventListener('close', () => {\n emoticonsDropdown.setIgnoreMouseOut('popup', false);\n animationIntersector.setOnlyOnePlayableGroup();\n });\n\n this.appendTo = this.scrollable.container;\n\n this.appendTo.classList.add('is-loading');\n putPreloader(this.appendTo, true);\n\n this.stickersFooter = document.createElement('div');\n this.stickersFooter.classList.add('sticker-set-footer');\n\n const btn = Button('btn-primary btn-primary-transparent disable-hover', {noRipple: true, text: 'Loading'});\n this.stickersFooter.append(btn);\n\n this.body.append(this.stickersFooter);\n\n attachStickerViewerListeners({listenTo: this.appendTo, listenerSetter: this.listenerSetter});\n\n const onStickerSetUpdate = (set: StickerSet.stickerSet) => {\n const idx = this.sets.findIndex((_set) => _set.id === set.id);\n if(idx === -1) {\n return;\n }\n\n this.sets[idx] = set;\n const updateAdded = this.updateAdded[set.id];\n updateAdded?.(!!set.installed_date);\n this.updateButton();\n };\n\n this.listenerSetter.add(rootScope)('stickers_installed', onStickerSetUpdate);\n this.listenerSetter.add(rootScope)('stickers_deleted', onStickerSetUpdate);\n\n this.loadStickerSet();\n }\n\n private createStickerSetElements(set?: StickerSet.stickerSet) {\n const container = document.createElement('div');\n container.classList.add('sticker-set');\n\n let headerRow: Row, updateAdded: (added: boolean) => void;\n if(set) {\n headerRow = new Row({\n title: wrapEmojiText(set.title),\n subtitle: i18n(set.pFlags.emojis ? 'EmojiCount' : 'Stickers', [set.count]),\n buttonRight: true\n });\n\n updateAdded = (added) => {\n replaceContent(headerRow.buttonRight, i18n(added ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\n headerRow.buttonRight.classList.toggle('active', added);\n };\n\n updateAdded(!!set.installed_date);\n\n container.append(headerRow.container);\n }\n\n const itemsContainer = document.createElement('div');\n itemsContainer.classList.add('sticker-set-stickers');\n\n container.append(itemsContainer);\n\n return {container, headerRow, updateAdded, itemsContainer};\n }\n\n private onStickersClick = async(e: MouseEvent) => {\n const target = findUpClassName(e.target, 'sticker-set-sticker');\n if(!target) return;\n\n const docId = target.dataset.docId;\n if(await appImManager.chat.input.sendMessageWithDocument(docId)) {\n this.hide();\n }\n };\n\n private async loadStickerSet() {\n const middleware = this.middlewareHelper.get();\n const inputs = Array.isArray(this.stickerSetInput) ? this.stickerSetInput : [this.stickerSetInput];\n const setsPromises = inputs.map((input) => this.managers.appStickersManager.getStickerSet(input));\n let sets = await Promise.all(setsPromises);\n if(!middleware()) return;\n let firstSet = sets[0];\n if(sets.length === 1 && !firstSet) {\n toastNew({langPackKey: this.isEmojis ? 'AddEmojiNotFound' : 'StickerSet.DontExist'});\n this.hide();\n return;\n }\n\n sets = sets.filter(Boolean);\n firstSet = sets[0];\n\n this.sets = sets.map((set) => set.set);\n\n const isEmojis = this.isEmojis ??= !!firstSet.set.pFlags.emojis;\n\n if(!isEmojis) {\n attachClickEvent(this.appendTo, this.onStickersClick, {listenerSetter: this.listenerSetter});\n\n const {destroy} = createStickersContextMenu({\n listenTo: this.appendTo,\n isStickerPack: true,\n onSend: () => this.hide()\n });\n\n this.addEventListener('close', destroy);\n }\n\n animationIntersector.setOnlyOnePlayableGroup(ANIMATION_GROUP);\n\n const lazyLoadQueue = new LazyLoadQueue();\n const loadPromises: Promise[] = [];\n\n const containersPromises = sets.map(async(set) => {\n const {container, itemsContainer, headerRow, updateAdded} = this.createStickerSetElements(sets.length > 1 ? set.set : undefined);\n\n if(headerRow) {\n attachClickEvent(headerRow.buttonRight, () => {\n this.managers.appStickersManager.toggleStickerSet(set.set);\n }, {listenerSetter: this.listenerSetter});\n }\n\n this.updateAdded[set.set.id] = updateAdded;\n\n let divs: (HTMLElement | DocumentFragment)[];\n\n const docs = set.documents.filter((doc) => doc?._ === 'document') as Document.document[];\n if(isEmojis) {\n const fragment = wrapCustomEmoji({\n docIds: docs.map((doc) => doc.id),\n loadPromises,\n animationGroup: ANIMATION_GROUP,\n customEmojiSize: mediaSizes.active.esgCustomEmoji,\n middleware\n // lazyLoadQueue\n });\n\n (Array.from(fragment.children) as HTMLElement[]).slice(1).forEach((element) => {\n const span = document.createElement('span');\n span.classList.add('super-emoji');\n element.replaceWith(span);\n span.append(element);\n });\n\n divs = [fragment];\n\n itemsContainer.classList.replace('sticker-set-stickers', 'super-emojis');\n itemsContainer.classList.add('is-emojis', 'not-local');\n } else {\n divs = await Promise.all(docs.map(async(doc) => {\n const div = document.createElement('div');\n div.classList.add('sticker-set-sticker');\n\n const size = mediaSizes.active.popupSticker.width;\n\n await wrapSticker({\n doc,\n div,\n lazyLoadQueue,\n group: ANIMATION_GROUP,\n play: true,\n loop: true,\n width: size,\n height: size,\n withLock: true,\n loadPromises,\n middleware\n });\n\n return div;\n }));\n }\n\n itemsContainer.append(...divs.filter(Boolean));\n\n return container;\n });\n\n const containers = await Promise.all(containersPromises);\n await Promise.all(loadPromises);\n\n const button = this.button = Button('', {noRipple: true});\n\n this.updateButton();\n\n attachClickEvent(button, () => {\n const toggle = toggleDisability([button], true);\n\n this.managers.appStickersManager.toggleStickerSets(sets.map((set) => set.set)).then(() => {\n this.hide();\n }).catch(() => {\n toggle();\n });\n }, {listenerSetter: this.listenerSetter});\n\n if(sets.length === 1) {\n setInnerHTML(this.title, wrapEmojiText(firstSet.set.title));\n } else {\n setInnerHTML(this.title, i18n('Emoji'));\n }\n\n this.stickersFooter.textContent = '';\n this.stickersFooter.append(button);\n\n this.appendTo.classList.remove('is-loading');\n this.appendTo.textContent = '';\n this.appendTo.append(...containers);\n\n this.scrollable.onAdditionalScroll();\n }\n\n private updateButton() {\n const {sets, isEmojis} = this;\n let isAdd: boolean, buttonAppend: HTMLElement;\n if(sets.length === 1) {\n const firstSet = sets[0];\n buttonAppend = i18n(isEmojis ? 'EmojiCount' : 'Stickers', [firstSet.count]);\n isAdd = !firstSet.installed_date;\n } else {\n const installed = sets.filter((set) => set.installed_date);\n let count: number;\n if(sets.length === installed.length) {\n isAdd = false;\n count = sets.length;\n } else {\n isAdd = true;\n count = sets.length - installed.length;\n }\n\n buttonAppend = i18n('EmojiPackCount', [count]);\n }\n\n this.button.className = isAdd ? 'btn-primary btn-color-primary' : 'btn-primary btn-primary-transparent danger';\n replaceContent(this.button, i18n(isAdd ? 'AddStickersCount' : 'RemoveStickersCount', [buttonAppend]));\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 {CancellablePromise} from '../helpers/cancellablePromise';\nimport SetTransition from './singleTransition';\nimport {fastRaf} from '../helpers/schedulers';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport isInDOM from '../helpers/dom/isInDOM';\nimport safeAssign from '../helpers/object/safeAssign';\n\nconst TRANSITION_TIME = 200;\n\nexport default class ProgressivePreloader {\n public preloader: HTMLDivElement;\n public circle: SVGCircleElement;\n private cancelSvg: SVGSVGElement;\n private downloadSvg: HTMLElement;\n\n private tempId = 0;\n public detached = true;\n\n public promise: CancellablePromise = null;\n\n public isUpload = false;\n private cancelable = true;\n private streamable = false;\n private tryAgainOnFail = true;\n private attachMethod: 'append' | 'prepend' = 'append';\n\n public loadFunc: (e?: Event) => any;\n\n public totalLength: number;\n\n constructor(options?: Partial<{\n isUpload: ProgressivePreloader['isUpload'],\n cancelable: ProgressivePreloader['cancelable'],\n streamable: ProgressivePreloader['streamable'],\n tryAgainOnFail: ProgressivePreloader['tryAgainOnFail'],\n attachMethod: ProgressivePreloader['attachMethod']\n }>) {\n if(options) {\n safeAssign(this, options);\n }\n\n if(this.isUpload) {\n this.tryAgainOnFail = false;\n }\n }\n\n public constructContainer(options: Partial<{\n color: 'transparent',\n bold: boolean\n }> = {}) {\n if(!this.preloader) {\n this.preloader = document.createElement('div');\n this.preloader.classList.add('preloader-container');\n\n if(options.color) {\n this.preloader.classList.add('preloader-' + options.color);\n }\n\n if(options.bold) {\n this.preloader.classList.add('preloader-bold');\n }\n\n if(this.streamable) {\n this.preloader.classList.add('preloader-streamable');\n }\n }\n }\n\n public constructDownloadIcon() {\n this.constructContainer();\n }\n\n public construct() {\n this.construct = null;\n\n this.constructContainer();\n\n this.preloader.innerHTML = `\n
\n \n \n \n
`;\n\n if(this.streamable) {\n this.totalLength = 118.61124420166016;\n } else {\n this.totalLength = 149.82473754882812;\n }\n\n if(this.cancelable) {\n this.preloader.innerHTML += `\n \n \n \n \n \n \n \n \n \n \n \n `;\n\n this.downloadSvg = this.preloader.lastElementChild as HTMLElement;\n this.cancelSvg = this.downloadSvg.previousElementSibling as any;\n } else {\n this.preloader.classList.add('preloader-swing');\n }\n\n this.circle = this.preloader.firstElementChild.firstElementChild.firstElementChild as SVGCircleElement;\n\n if(this.cancelable) {\n attachClickEvent(this.preloader, this.onClick);\n }\n }\n\n public onClick = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n if(this.preloader.classList.contains('manual')) {\n this.loadFunc?.(e);\n } else {\n this.promise?.cancel?.();\n }\n };\n\n public setDownloadFunction(func: ProgressivePreloader['loadFunc']) {\n this.loadFunc = func;\n }\n\n public setManual() {\n this.preloader.classList.add('manual');\n this.setProgress(0);\n }\n\n public attachPromise(promise: CancellablePromise) {\n if(this.isUpload && this.promise) return;\n\n this.promise = promise;\n\n const tempId = --this.tempId;\n const startTime = Date.now();\n\n const onEnd = (err: Error) => {\n promise.notify = promise.notifyAll = null;\n\n if(tempId !== this.tempId) {\n return;\n }\n\n const elapsedTime = Date.now() - startTime;\n\n // console.log('[PP]: end', this.detached, performance.now());\n\n if(!err && this.cancelable) {\n this.setProgress(100);\n\n const delay = TRANSITION_TIME * 0.75;\n\n if(elapsedTime < delay) {\n this.detach();\n } else {\n setTimeout(() => { // * wait for transition complete\n if(tempId === this.tempId) {\n this.detach();\n }\n }, delay);\n }\n } else {\n if(this.tryAgainOnFail) {\n this.attach(this.preloader.parentElement);\n fastRaf(() => {\n this.setManual();\n });\n } else {\n this.detach();\n }\n }\n\n this.promise = promise = null;\n };\n\n promise\n .then(() => onEnd(null))\n .catch((err) => onEnd(err));\n\n if(promise.addNotifyListener) {\n promise.addNotifyListener((details: {done: number, total: number}) => {\n /* if(details.done >= details.total) {\n onEnd();\n } */\n\n if(tempId !== this.tempId) return;\n\n // console.log('preloader download', promise, details);\n const percents = details.done / details.total * 100;\n this.setProgress(percents);\n });\n }\n }\n\n public attach(elem: Element, reset = false, promise?: CancellablePromise) {\n this.construct?.();\n\n if(this.preloader.parentElement) {\n this.preloader.classList.remove('manual');\n }\n\n this.detached = false;\n\n if(promise/* && false */) {\n this.attachPromise(promise);\n }\n\n let useRafs = 0;\n if(this.detached || this.preloader.parentElement !== elem) {\n useRafs = isInDOM(this.preloader) ? 1 : 2;\n if(this.preloader.parentElement !== elem) {\n elem[this.attachMethod](this.preloader);\n }\n }\n\n SetTransition({\n element: this.preloader,\n className: 'is-visible',\n forwards: true,\n duration: TRANSITION_TIME,\n useRafs\n });\n\n if(this.cancelable && reset) {\n this.setProgress(0);\n }\n }\n\n public detach() {\n if(this.detached) {\n return;\n }\n // return;\n\n this.detached = true;\n\n // return;\n\n if(this.preloader?.parentElement) {\n /* setTimeout(() => */// fastRaf(() => {\n /* if(!this.detached) return;\n this.detached = true; */\n\n // fastRaf(() => {\n // console.log('[PP]: detach after rAF', this.detached, performance.now());\n\n // if(!this.detached || !this.preloader.parentElement) {\n // return;\n // }\n\n SetTransition({\n element: this.preloader,\n className: 'is-visible',\n forwards: false,\n duration: TRANSITION_TIME,\n onTransitionEnd: () => {\n this.preloader.remove();\n },\n useRafs: 1\n });\n // });\n // })/* , 5e3) */;\n }\n }\n\n public setProgress(percents: number) {\n if(!this.totalLength && !isInDOM(this.circle)) {\n return;\n }\n\n if(percents === 0) {\n this.circle.style.strokeDasharray = '';\n return;\n }\n\n try {\n this.totalLength ||= this.circle.getTotalLength();\n\n // console.log('setProgress', (percents / 100 * totalLength));\n this.circle.style.strokeDasharray = '' + Math.max(5, percents / 100 * this.totalLength) + ', ' + this.totalLength;\n } catch(err) {}\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 {PeerPhotoSize} from '../lib/appManagers/appAvatarsManager';\nimport getPreviewURLFromBytes from '../helpers/bytes/getPreviewURLFromBytes';\nimport {renderImageFromUrlPromise} from '../helpers/dom/renderImageFromUrl';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport {recordPromise} from '../helpers/recordPromise';\nimport sequentialDom from '../helpers/sequentialDom';\nimport {UserProfilePhoto, ChatPhoto, User, Chat} from '../layer';\nimport getPeerColorById from '../lib/appManagers/utils/peers/getPeerColorById';\nimport getPeerPhoto from '../lib/appManagers/utils/peers/getPeerPhoto';\nimport {NULL_PEER_ID, REPLIES_PEER_ID} from '../lib/mtproto/mtproto_config';\nimport wrapAbbreviation from '../lib/richTextProcessor/wrapAbbreviation';\nimport rootScope from '../lib/rootScope';\nimport getPeerInitials from './wrappers/getPeerInitials';\nimport {wrapTopicIcon} from './wrappers/messageActionTextNewUnsafe';\nimport makeError from '../helpers/makeError';\nimport noop from '../helpers/noop';\n\nexport async function 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 const r = await rootScope.managers.acknowledged.appAvatarsManager.loadAvatar(peerId, photo, size);\n const loadPromise = r.result;\n const cached = r.cached;\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 let isFullLoaded = false;\n if(size === 'photo_big') { // let's load small photo first\n const res = await putAvatar(div, peerId, photo, 'photo_small');\n renderThumbPromise = res.loadThumbPromise || 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 = getPreviewURLFromBytes(photo.stripped_thumb);\n renderThumbPromise = renderImageFromUrlPromise(thumbImage, url).then(() => {\n if(isFullLoaded) {\n return;\n }\n\n replaceContent(div, thumbImage);\n });\n }\n\n callback = () => {\n isFullLoaded = true;\n\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 thumbImage?.remove();\n });\n }\n }, animate ? 200 : 0);\n };\n }\n\n const renderPromise = loadPromise\n .then((url) => renderImageFromUrlPromise(img, url/* , !cached */))\n .then(callback);\n\n renderThumbPromise && await renderThumbPromise.catch(noop);\n\n return {\n cached,\n loadPromise: renderPromise,\n loadThumbPromise: cached ? renderPromise : renderThumbPromise || Promise.resolve(),\n thumbImage\n };\n}\n\nfunction set(\n div: HTMLElement,\n innerHTML: Parameters[1],\n color: string,\n icon?: string,\n isForum?: boolean,\n isTopic?: boolean\n) {\n setInnerHTML(div, innerHTML);\n div.dataset.color = color;\n div.classList.remove('tgico-saved', 'tgico-deletedaccount', 'tgico-reply_filled', 'is-forum', 'is-topic');\n icon && div.classList.add(icon);\n isForum && div.classList.add('is-forum');\n isTopic && div.classList.add('is-topic');\n}\n\n// peerId === peerId || title\nexport default async function putPhoto({\n div,\n peerId,\n isDialog = false,\n title = '',\n onlyThumb = false,\n isBig,\n threadId,\n wrapOptions = {}\n}: {\n div: HTMLElement,\n peerId: PeerId,\n isDialog?: boolean,\n title?: string,\n onlyThumb?: boolean,\n isBig?: boolean,\n threadId?: number,\n wrapOptions?: WrapSomethingOptions\n}) {\n const myId = rootScope.myId;\n\n if(peerId === myId && isDialog) {\n set(div, '', '', 'tgico-saved');\n return;\n }\n\n const managers = rootScope.managers;\n\n if(threadId) {\n const topic = await managers.dialogsStorage.getForumTopic(peerId, threadId);\n set(div, '', '', undefined, undefined, true);\n\n if(wrapOptions.customEmojiSize) {\n div.style.setProperty('--size', wrapOptions.customEmojiSize.width + 'px');\n }\n\n return wrapTopicIcon({\n ...wrapOptions,\n topic,\n lazyLoadQueue: false\n }).then((icon) => {\n div.replaceChildren(icon);\n });\n }\n\n const peer = await managers.appPeersManager.getPeer(peerId);\n if(peerId !== NULL_PEER_ID && peerId.isUser() && (peer as User.user)?.pFlags?.deleted) {\n set(div, '', getPeerColorById(peerId), 'tgico-deletedaccount');\n return;\n }\n\n const isForum = !!(peer as Chat.channel)?.pFlags?.forum;\n const size: PeerPhotoSize = isBig ? 'photo_big' : 'photo_small';\n const photo = getPeerPhoto(peer);\n const avatarAvailable = !!photo;\n const avatarRendered = !!div.firstElementChild && !(div.firstElementChild as HTMLElement).classList.contains('emoji');\n if(!avatarAvailable || !avatarRendered || !(await managers.appAvatarsManager.isAvatarCached(peerId, size))) {\n let color = '';\n if(peerId && (peerId !== myId || !isDialog)) {\n color = getPeerColorById(peerId);\n }\n\n if(peerId === REPLIES_PEER_ID) {\n set(div, '', color, 'tgico-reply_filled');\n return;\n }\n\n const abbr = title ? wrapAbbreviation(title) : getPeerInitials(peer);\n set(div, abbr, color, '', isForum);\n // return Promise.resolve(true);\n }\n\n if(avatarAvailable/* && false */) {\n const promise = putAvatar(div, peerId, photo, size, undefined, onlyThumb);\n // recordPromise(promise, 'putAvatar-' + peerId);\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 {Chat, User} from '../../layer';\nimport wrapAbbreviation from '../../lib/richTextProcessor/wrapAbbreviation';\n\nexport default function getPeerInitials(peer: Chat | User) {\n let str = '';\n if(peer) {\n str = (peer as Chat.chat).title ?? [\n (peer as User.user).first_name,\n (peer as User.user).last_name\n ].filter(Boolean).join(' ');\n }\n\n return wrapAbbreviation(str);\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 {MOUNT_CLASS_TO} from '../config/debug';\n\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\n const html = `\n \n \n `;\n\n if(returnDiv) {\n const div = document.createElement('div');\n div.classList.add('preloader');\n div.innerHTML = html;\n\n if(elem) {\n elem.appendChild(div);\n }\n\n return div;\n }\n\n elem.insertAdjacentHTML('beforeend', html);\n return elem.lastElementChild as HTMLElement;\n}\n\nMOUNT_CLASS_TO.putPreloader = putPreloader;\n\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\n elem.classList.remove('tgico-' + icon);\n elem.disabled = true;\n putPreloader(elem);\n\n return () => {\n elem.innerHTML = '';\n elem.classList.add('tgico-' + icon);\n elem.removeAttribute('disabled');\n };\n}\n\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\n Array.from(elements).forEach((el) => {\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\n if(!match) return;\n to[match[1]] = el as HTMLElement;\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 getDeepProperty from '../helpers/object/getDeepProperty';\nimport {LangPackKey, _i18n} from '../lib/langPack';\nimport apiManagerProxy from '../lib/mtproto/mtprotoworker';\nimport rootScope from '../lib/rootScope';\n\nexport default class RadioField {\n public input: HTMLInputElement;\n public label: HTMLLabelElement;\n public main: HTMLElement;\n\n constructor(options: {\n text?: string,\n langKey?: LangPackKey,\n name: string,\n value?: string,\n stateKey?: string,\n alignRight?: boolean\n }) {\n const label = this.label = document.createElement('label');\n label.classList.add('radio-field');\n\n if(options.alignRight) {\n label.classList.add('radio-field-right');\n }\n\n const input = this.input = document.createElement('input');\n input.type = 'radio';\n /* input.id = */input.name = 'input-radio-' + options.name;\n\n if(options.value) {\n input.value = options.value;\n\n if(options.stateKey) {\n apiManagerProxy.getState().then((state) => {\n input.checked = getDeepProperty(state, options.stateKey) === options.value;\n });\n\n input.addEventListener('change', () => {\n rootScope.managers.appStateManager.setByKey(options.stateKey, options.value);\n });\n }\n }\n\n const main = this.main = document.createElement('div');\n main.classList.add('radio-field-main');\n\n if(options.text) {\n main.innerHTML = options.text;\n /* const caption = document.createElement('div');\n caption.classList.add('radio-field-main-caption');\n caption.innerHTML = text;\n\n if(subtitle) {\n label.classList.add('radio-field-with-subtitle');\n caption.insertAdjacentHTML('beforeend', `
${subtitle}
`);\n }\n\n main.append(caption); */\n } else if(options.langKey) {\n _i18n(main, options.langKey);\n }\n\n label.append(input, main);\n }\n\n get checked() {\n return this.input.checked;\n }\n\n set checked(checked: boolean) {\n this.setValueSilently(checked);\n\n const event = new Event('change', {bubbles: true, cancelable: true});\n this.input.dispatchEvent(event);\n }\n\n public setValueSilently(checked: boolean) {\n this.input.checked = checked;\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 RadioForm(radios: {container: HTMLElement, input: HTMLInputElement}[], onChange: (value: string, event: Event) => void) {\n const form = document.createElement('form');\n\n radios.forEach((r) => {\n const {container, input} = r;\n form.append(container);\n input.addEventListener('change', (e) => {\n if(input.checked) {\n onChange(input.value, e);\n }\n });\n });\n\n return form;\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 attachGrabListeners, {GrabEvent} from '../helpers/dom/attachGrabListeners';\nimport clamp from '../helpers/number/clamp';\nimport safeAssign from '../helpers/object/safeAssign';\n\nexport default class RangeSelector {\n public container: HTMLDivElement;\n protected filled: HTMLDivElement;\n protected seek: HTMLInputElement;\n\n public mousedown = false;\n protected rect: DOMRect;\n protected _removeListeners: () => void;\n\n private events: Partial<{\n // onMouseMove: ProgressLine['onMouseMove'],\n onMouseDown: RangeSelector['onMouseDown'],\n onMouseUp: RangeSelector['onMouseUp'],\n onScrub: (value: number) => void\n }> = {};\n\n protected decimals: number;\n\n protected step: number;\n protected min: number;\n protected max: number;\n protected withTransition = false;\n protected useTransform = false;\n protected vertical = false;\n\n constructor(\n options: {\n step: RangeSelector['step'],\n min: RangeSelector['min'],\n max: RangeSelector['max'],\n withTransition?: RangeSelector['withTransition'],\n useTransform?: RangeSelector['useTransform'],\n vertical?: RangeSelector['vertical']\n },\n value = 0\n ) {\n safeAssign(this, options);\n\n this.container = document.createElement('div');\n this.container.classList.add('progress-line');\n\n // there is no sense in using transition with transform, because it is updating every frame\n if(this.useTransform) {\n this.container.classList.add('use-transform');\n } else if(this.withTransition) {\n this.container.classList.add('with-transition');\n }\n\n this.filled = document.createElement('div');\n this.filled.classList.add('progress-line__filled');\n\n const seek = this.seek = document.createElement('input');\n seek.classList.add('progress-line__seek');\n // seek.setAttribute('max', '0');\n seek.type = 'range';\n seek.step = '' + this.step;\n seek.min = '' + this.min;\n seek.max = '' + this.max;\n seek.value = '' + value;\n\n if(value) {\n this.setProgress(value);\n }\n\n const stepStr = '' + this.step;\n const index = stepStr.indexOf('.');\n this.decimals = index === -1 ? 0 : stepStr.length - index - 1;\n\n // this.setListeners();\n\n this.container.append(this.filled, seek);\n }\n\n get value() {\n return +this.seek.value;\n }\n\n public setHandlers(events: RangeSelector['events']) {\n this.events = events;\n }\n\n protected onMouseMove = (event: GrabEvent) => {\n this.scrub(event);\n };\n\n protected onMouseDown = (event: GrabEvent) => {\n this.rect = this.container.getBoundingClientRect();\n this.mousedown = true;\n this.scrub(event);\n this.container.classList.add('is-focused');\n this.events?.onMouseDown && this.events.onMouseDown(event);\n };\n\n protected onMouseUp = (event: GrabEvent) => {\n this.mousedown = false;\n this.container.classList.remove('is-focused');\n this.events?.onMouseUp && this.events.onMouseUp(event);\n };\n\n public setListeners() {\n this.seek.addEventListener('input', this.onInput);\n this._removeListeners = attachGrabListeners(this.container, this.onMouseDown, this.onMouseMove, this.onMouseUp);\n }\n\n public onInput = () => {\n const value = +this.seek.value;\n this.setFilled(value);\n this.events?.onScrub && this.events.onScrub(value);\n };\n\n public setProgress(value: number) {\n this.seek.value = '' + value;\n this.setFilled(+this.seek.value); // clamp\n }\n\n public addProgress(value: number) {\n this.seek.value = '' + (+this.seek.value + value);\n this.setFilled(+this.seek.value); // clamp\n }\n\n public setFilled(value: number) {\n let percents = (value - this.min) / (this.max - this.min);\n percents = clamp(percents, 0, 1);\n\n // using scaleX and width even with vertical because it will be rotated\n if(this.useTransform) {\n this.filled.style.transform = `scaleX(${percents})`;\n } else {\n this.filled.style.width = (percents * 100) + '%';\n }\n }\n\n protected scrub(event: GrabEvent) {\n const rectMax = this.vertical ? this.rect.height : this.rect.width;\n const offsetAxisValue = clamp(this.vertical ? -(event.y - this.rect.bottom) : event.x - this.rect.left, 0, rectMax);\n\n let value = this.min + (offsetAxisValue / rectMax * (this.max - this.min));\n\n if((value - this.min) < ((this.max - this.min) / 2)) {\n value -= this.step / 10;\n }\n\n value = +value.toFixed(this.decimals);\n value = clamp(value, this.min, this.max);\n\n // this.seek.value = '' + value;\n // this.onInput();\n\n this.setProgress(value);\n this.events?.onScrub && this.events.onScrub(value);\n\n return value;\n }\n\n public removeListeners() {\n if(this._removeListeners) {\n this._removeListeners();\n this._removeListeners = null;\n }\n\n this.seek.removeEventListener('input', this.onInput);\n\n this.events = {};\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 findUpClassName from '../helpers/dom/findUpClassName';\nimport sequentialDom from '../helpers/sequentialDom';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport rootScope from '../lib/rootScope';\nimport findUpAsChild from '../helpers/dom/findUpAsChild';\nimport {fastRaf} from '../helpers/schedulers';\n\nlet rippleClickId = 0;\nexport default function ripple(\n elem: HTMLElement,\n callback: (id: number) => Promise = () => Promise.resolve(),\n onEnd: (id: number) => void = null,\n prepend = false,\n attachListenerTo = elem\n) {\n // return;\n if(elem.querySelector('.c-ripple')) return;\n elem.classList.add('rp');\n\n const r = document.createElement('div');\n r.classList.add('c-ripple');\n\n const isSquare = elem.classList.contains('rp-square');\n if(isSquare) {\n r.classList.add('is-square');\n }\n\n elem[prepend ? 'prepend' : 'append'](r);\n\n let handler: () => void;\n // let animationEndPromise: Promise;\n const drawRipple = (clientX: number, clientY: number) => {\n const startTime = Date.now();\n const circle = document.createElement('div');\n\n const clickId = rippleClickId++;\n\n // console.log('ripple drawRipple');\n\n // const auto = elem.classList.contains('row-sortable') && !elem.classList.contains('cant-sort');\n const auto = false;\n const duration = (auto ? .3 : +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '')) * 1000;\n // console.log('ripple duration', duration);\n\n const _handler = handler = () => {\n // handler = () => animationEndPromise.then((duration) => {\n // console.log('ripple animation was:', duration);\n\n // const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\n // return;\n const elapsedTime = Date.now() - startTime;\n const cb = () => {\n // console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\n sequentialDom.mutate(() => {\n circle.remove();\n });\n\n onEnd?.(clickId);\n };\n if(elapsedTime < duration) {\n const delay = Math.max(duration - elapsedTime, duration / 2);\n setTimeout(() => circle.classList.add('hiding'), Math.max(delay - duration / 2, 0));\n\n setTimeout(cb, delay);\n } else {\n circle.classList.add('hiding');\n setTimeout(cb, duration / 2);\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n window.removeEventListener('contextmenu', handler);\n window.removeEventListener('mousemove', handler);\n }\n\n handler = null;\n touchStartFired = false;\n };\n // });\n\n callback?.(clickId);\n\n /* callback().then((bad) => {\n if(bad) {\n span.remove();\n return;\n } */\n\n // console.log('ripple after promise', Date.now() - startTime);\n // console.log('ripple tooSlow:', tooSlow);\n /* if(tooSlow) {\n span.remove();\n return;\n } */\n\n fastRaf(() => {\n if(_handler !== handler) {\n return;\n }\n\n const rect = r.getBoundingClientRect();\n circle.classList.add('c-ripple__circle');\n\n const clickX = clientX - rect.left;\n const clickY = clientY - rect.top;\n\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);\n const size = radius;\n\n // center of circle\n const x = clickX - size / 2;\n const y = clickY - size / 2;\n\n // console.log('ripple click', offsetFromCenter, size, clickX, clickY);\n\n circle.style.width = circle.style.height = size + 'px';\n circle.style.left = x + 'px';\n circle.style.top = y + 'px';\n\n // ะฝะธะถะฝะธะน ะบะพะด ะฒั‹ะฟะพะปะฝัะตั‚ัั ั ะทะฐะดะตั€ะถะบะพะน\n /* animationEndPromise = new Promise((resolve) => {\n span.addEventListener('animationend', () => {\n // 713 -> 700\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\n }, {once: true});\n }); */\n\n // ะฝะธะถะฝะธะน ะบะพะด ะฝะต ะฒัะตะณะดะฐ ะฒะบะปัŽั‡ะฐะตั‚ ะฐะฝะธะผะฐั†ะธัŽ ะŸะ ะ˜ ะšะ›ะ˜ะšะ• ะะ ะขะะงะŸะะ” ะ‘ะ•ะ— ะขะะŸะขะ˜ะš ะญะะ–ะ˜ะะ\n /* span.style.display = 'none';\n r.append(span);\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\n span.style.display = ''; */\n\n r.append(circle);\n\n if(auto) {\n // window.addEventListener('mousemove', handler, {once: true, passive: true});\n handler();\n }\n\n // r.classList.add('active');\n // handler();\n });\n // });\n };\n\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) ||\n findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\n ) && (\n attachListenerTo === elem ||\n !findUpAsChild(e.target as HTMLElement, attachListenerTo)\n );\n\n // TODO: rename this variable\n let touchStartFired = false;\n if(IS_TOUCH_SUPPORTED) {\n const touchEnd = () => {\n handler?.();\n };\n\n attachListenerTo.addEventListener('touchstart', (e) => {\n if(!rootScope.settings.animationsEnabled) {\n return;\n }\n\n // console.log('ripple touchstart', e);\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\n return;\n }\n\n // console.log('touchstart', e);\n touchStartFired = true;\n\n const {clientX, clientY} = e.touches[0];\n drawRipple(clientX, clientY);\n attachListenerTo.addEventListener('touchend', touchEnd, {once: true});\n\n window.addEventListener('touchmove', (e) => {\n e.cancelBubble = true;\n e.stopPropagation();\n touchEnd();\n attachListenerTo.removeEventListener('touchend', touchEnd);\n }, {once: true});\n }, {passive: true});\n } else {\n attachListenerTo.addEventListener('mousedown', (e) => {\n if(![0, 2].includes(e.button)) { // only left and right buttons\n return;\n }\n\n if(!rootScope.settings.animationsEnabled) {\n return;\n }\n // console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\n\n if(attachListenerTo.dataset.ripple === '0' || isRippleUnneeded(e)) {\n return;\n } else if(touchStartFired) {\n touchStartFired = false;\n return;\n }\n\n const {clientX, clientY} = e;\n drawRipple(clientX, clientY);\n window.addEventListener('mouseup', handler, {once: true, passive: true});\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\n }, {passive: 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 CheckboxField, {CheckboxFieldOptions} from './checkboxField';\nimport RadioField from './radioField';\nimport ripple from './ripple';\nimport {SliderSuperTab} from './slider';\nimport RadioForm from './radioForm';\nimport {i18n, LangPackKey} from '../lib/langPack';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport setInnerHTML, {setDirection} from '../helpers/dom/setInnerHTML';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport Button from './button';\nimport createContextMenu from '../helpers/dom/createContextMenu';\n\ntype K = string | HTMLElement | DocumentFragment | true;\n\nconst setContent = (element: HTMLElement, content: K) => {\n if(content === true) {\n\n } else if(typeof(content) === 'string') {\n setInnerHTML(element, content);\n } else {\n element.append(content);\n }\n};\n\nexport type RowMediaSizeType = 'small' | 'medium' | 'big' | 'abitbigger' | 'bigger';\n\nexport default class Row {\n public container: HTMLElement;\n public title: HTMLElement;\n public titleRow: HTMLElement;\n public titleRight: HTMLElement;\n public media: HTMLElement;\n\n public subtitleRow: HTMLElement;\n public subtitleRight: HTMLElement;\n\n public checkboxField: CheckboxField;\n public radioField: RadioField;\n\n public freezed = false;\n\n public buttonRight: HTMLElement;\n\n private _subtitle: HTMLElement;\n private _midtitle: HTMLElement;\n\n constructor(options: Partial<{\n icon: string,\n subtitle: K,\n subtitleLangKey: LangPackKey,\n subtitleLangArgs: any[],\n subtitleRight: K,\n radioField: Row['radioField'],\n checkboxField: Row['checkboxField'],\n checkboxFieldOptions: CheckboxFieldOptions,\n withCheckboxSubtitle: boolean,\n title: K,\n titleLangKey: LangPackKey,\n titleRight: K,\n titleRightSecondary: K,\n clickable: boolean | ((e: Event) => void),\n navigationTab: SliderSuperTab,\n havePadding: boolean,\n noRipple: boolean,\n noWrap: boolean,\n listenerSetter: ListenerSetter,\n buttonRight?: HTMLElement | boolean,\n buttonRightLangKey: LangPackKey,\n asLink: boolean,\n contextMenu: Omit[0], 'findElement' | 'listenTo' | 'listenerSetter'>\n }> = {}) {\n if(options.checkboxFieldOptions) {\n options.checkboxField = new CheckboxField({\n listenerSetter: options.listenerSetter,\n ...options.checkboxFieldOptions\n });\n }\n\n const tagName = options.asLink ? 'a' : (options.radioField || options.checkboxField ? 'label' : 'div');\n this.container = document.createElement(tagName);\n this.container.classList.add('row', 'no-subtitle');\n\n if(options.noWrap) {\n this.container.classList.add('no-wrap');\n }\n\n if(options.subtitle) {\n const subtitle = this.subtitle;\n setContent(subtitle, options.subtitle);\n\n if(options.noWrap) subtitle.classList.add('no-wrap');\n\n if(options.subtitleRight) {\n this.container.append(this.subtitleRow = this.createRow());\n this.subtitleRow.classList.add('row-subtitle-row');\n const subtitleRight = this.subtitleRight = document.createElement('div');\n subtitleRight.classList.add('row-subtitle', 'row-subtitle-right');\n\n setContent(subtitleRight, options.subtitleRight);\n this.subtitleRow.append(subtitle, subtitleRight);\n }\n } else if(options.subtitleLangKey) {\n this.subtitle.append(i18n(options.subtitleLangKey, options.subtitleLangArgs));\n }\n\n let havePadding = !!options.havePadding;\n if(options.radioField || options.checkboxField) {\n if(options.radioField) {\n this.radioField = options.radioField;\n this.container.append(this.radioField.label);\n havePadding = true;\n }\n\n if(options.checkboxField) {\n this.checkboxField = options.checkboxField;\n\n const isToggle = options.checkboxField.label.classList.contains('checkbox-field-toggle');\n if(isToggle) {\n this.container.classList.add('row-with-toggle');\n options.titleRight = this.checkboxField.label;\n } else {\n havePadding = true;\n this.container.append(this.checkboxField.label);\n }\n\n if(options.withCheckboxSubtitle && !isToggle) {\n const onChange = () => {\n replaceContent(this.subtitle, i18n(this.checkboxField.input.checked ? 'Checkbox.Enabled' : 'Checkbox.Disabled'));\n };\n\n if(options.listenerSetter) options.listenerSetter.add(this.checkboxField.input)('change', onChange);\n else this.checkboxField.input.addEventListener('change', onChange);\n }\n }\n\n const i = options.radioField || options.checkboxField;\n i.label.classList.add('disable-hover');\n }\n\n if(options.title || options.titleLangKey) {\n let c: HTMLElement;\n const titleRightContent = options.titleRight || options.titleRightSecondary;\n if(titleRightContent) {\n this.container.append(c = this.titleRow = this.createRow());\n this.titleRow.classList.add('row-title-row');\n } else {\n c = this.container;\n }\n\n this.title = this.createTitle();\n if(options.noWrap) this.title.classList.add('no-wrap');\n if(options.title) {\n setContent(this.title, options.title);\n } else if(options.titleLangKey) {\n this.title.append(i18n(options.titleLangKey));\n }\n\n c.append(this.title);\n\n if(titleRightContent) {\n const titleRight = this.titleRight = document.createElement('div');\n titleRight.classList.add('row-title', 'row-title-right');\n\n if(options.titleRightSecondary) {\n titleRight.classList.add('row-title-right-secondary');\n }\n\n setContent(titleRight, titleRightContent);\n c.append(titleRight);\n }\n }\n\n if(options.icon) {\n havePadding = true;\n // this.title.classList.add('tgico', 'tgico-' + options.icon);\n this.container.classList.add('tgico', 'tgico-' + options.icon);\n this.container.classList.add('row-with-icon');\n }\n\n if(havePadding) {\n this.container.classList.add('row-with-padding');\n }\n\n if(options.navigationTab) {\n options.clickable = () => options.navigationTab.open();\n }\n\n if(options.clickable || options.radioField || options.checkboxField) {\n if(typeof(options.clickable) === 'function') {\n attachClickEvent(this.container, (e) => {\n if(this.freezed) return;\n (options.clickable as any)(e);\n }, {listenerSetter: options.listenerSetter});\n }\n\n this.container.classList.add('row-clickable', 'hover-effect');\n\n if(!options.noRipple) {\n ripple(this.container, undefined, undefined, true);\n }\n\n /* if(options.radioField || options.checkboxField) {\n this.container.prepend(this.container.lastElementChild);\n } */\n }\n\n if(options.buttonRight || options.buttonRightLangKey) {\n this.buttonRight = options.buttonRight instanceof HTMLElement ?\n options.buttonRight :\n Button('btn-primary btn-color-primary', {text: options.buttonRightLangKey});\n this.container.append(this.buttonRight);\n }\n\n if(options.contextMenu) {\n createContextMenu({\n ...options.contextMenu,\n listenTo: this.container,\n listenerSetter: options.listenerSetter\n });\n }\n }\n\n public get subtitle() {\n return this._subtitle ??= this.createSubtitle();\n }\n\n public get midtitle() {\n return this._midtitle ??= this.createMidtitle();\n }\n\n private createRow() {\n const c = document.createElement('div');\n c.classList.add('row-row');\n return c;\n }\n\n private createTitle() {\n const title = document.createElement('div');\n title.classList.add('row-title');\n setDirection(title);\n return title;\n }\n\n private createSubtitle() {\n const subtitle = document.createElement('div');\n subtitle.classList.add('row-subtitle');\n setDirection(subtitle);\n if(this.title) this.title.after(subtitle);\n else this.container.prepend(subtitle);\n this.container.classList.remove('no-subtitle');\n return subtitle;\n }\n\n private createMidtitle() {\n const midtitle = document.createElement('div');\n midtitle.classList.add('row-midtitle');\n this.subtitle.parentElement.insertBefore(midtitle, this.subtitle);\n return midtitle;\n }\n\n public createMedia(size?: RowMediaSizeType) {\n const media = document.createElement('div');\n return this.applyMediaElement(media, size);\n }\n\n public applyMediaElement(media: HTMLElement, size?: RowMediaSizeType) {\n this.container.classList.add('row-with-padding');\n\n this.media = media;\n media.classList.add('row-media');\n\n if(size) {\n media.classList.add('row-media-' + size);\n }\n\n this.container.append(media);\n\n return media;\n }\n\n public disableWithPromise(promise: Promise) {\n this.container.classList.add('is-disabled');\n promise.finally(() => {\n this.container.classList.remove('is-disabled');\n });\n }\n\n public makeSortable() {\n const sortIcon = document.createElement('span');\n this.container.classList.add('row-sortable', 'tgico');\n sortIcon.classList.add('row-sortable-icon', 'tgico-menu');\n this.container.append(sortIcon);\n }\n\n public toggleSorting(enabled?: boolean) {\n this.container.classList.toggle('cant-sort', !enabled);\n }\n}\n\nexport const CreateRowFromCheckboxField = (checkboxField: CheckboxField) => {\n return new Row({checkboxField, listenerSetter: checkboxField.listenerSetter});\n};\n\nexport const RadioFormFromRows = (rows: Row[], onChange: (value: string) => void) => {\n return RadioForm(rows.map((r) => ({container: r.container, input: r.radioField.input})), onChange);\n};\n\nexport const RadioFormFromValues = (values: {langPackKey: LangPackKey, value: number | string, checked?: boolean}[], onChange: Parameters[1]) => {\n const name = 'name-' + (Math.random() * 0x7FFFFF | 0);\n let checkedRadioField: RadioField;\n const rows = values.map(({langPackKey, value, checked}) => {\n const row = new Row({\n radioField: new RadioField({\n langKey: langPackKey,\n name,\n value: '' + value\n })\n });\n\n if(checked) {\n checkedRadioField = row.radioField;\n }\n\n return row;\n });\n\n const form = RadioFormFromRows(rows, onChange);\n if(checkedRadioField) {\n checkedRadioField.checked = true;\n }\n return form;\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_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport {logger, LogTypes} from '../lib/logger';\nimport fastSmoothScroll, {ScrollOptions} from '../helpers/fastSmoothScroll';\nimport useHeavyAnimationCheck from '../hooks/useHeavyAnimationCheck';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {IS_ANDROID} from '../environment/userAgent';\n/*\nvar el = $0;\nvar height = 0;\nvar checkUp = false;\n\ndo {\n height += el.scrollHeight;\n} while(el = (checkUp ? el.previousElementSibling : el.nextElementSibling));\nconsole.log(height);\n*/\n\n/*\nArray.from($0.querySelectorAll('.bubble-content')).forEach((_el) => {\n //_el.style.display = '';\n //return;\n\n let el = _el.parentElement;\n let height = el.scrollHeight;\n let width = el.scrollWidth;\n el.style.width = width + 'px';\n el.style.height = height + 'px';\n _el.style.display = 'none';\n});\n*/\n\n/* const scrollables: Map = new Map();\nconst scrollsIntersector = new IntersectionObserver((entries) => {\n for(let entry of entries) {\n const scrollable = scrollables.get(entry.target as HTMLElement);\n\n if(entry.isIntersecting) {\n scrollable.isVisible = true;\n } else {\n scrollable.isVisible = false;\n\n if(!isInDOM(entry.target)) {\n scrollsIntersector.unobserve(scrollable.container);\n scrollables.delete(scrollable.container);\n }\n }\n }\n}); */\n\nconst SCROLL_THROTTLE = /* IS_ANDROID ? 200 : */24;\n\nexport class ScrollableBase {\n protected log: ReturnType;\n\n public splitUp: HTMLElement;\n public onScrollMeasure: number = 0;\n\n public lastScrollPosition: number = 0;\n public lastScrollDirection: number = 0;\n\n public onAdditionalScroll: () => void;\n public onScrolledTop: () => void;\n public onScrolledBottom: () => void;\n\n public isHeavyAnimationInProgress = false;\n protected needCheckAfterAnimation = false;\n\n public checkForTriggers?: () => void;\n\n public scrollProperty: 'scrollTop' | 'scrollLeft';\n\n protected removeHeavyAnimationListener: () => void;\n protected addedScrollListener: boolean;\n\n constructor(public el?: HTMLElement, logPrefix = '', public container: HTMLElement = document.createElement('div')) {\n this.container.classList.add('scrollable');\n\n this.log = logger('SCROLL' + (logPrefix ? '-' + logPrefix : ''), LogTypes.Error);\n\n if(el) {\n Array.from(el.children).forEach((c) => this.container.append(c));\n\n el.append(this.container);\n }\n // this.onScroll();\n }\n\n public addScrollListener() {\n if(this.addedScrollListener) {\n return;\n }\n\n this.addedScrollListener = true;\n this.container.addEventListener('scroll', this.onScroll, {passive: true, capture: true});\n }\n\n public removeScrollListener() {\n if(!this.addedScrollListener) {\n return;\n }\n\n this.addedScrollListener = false;\n this.container.removeEventListener('scroll', this.onScroll, {capture: true});\n }\n\n public setListeners() {\n if(this.removeHeavyAnimationListener) {\n return;\n }\n\n window.addEventListener('resize', this.onScroll, {passive: true});\n this.addScrollListener();\n\n this.removeHeavyAnimationListener = useHeavyAnimationCheck(() => {\n this.isHeavyAnimationInProgress = true;\n\n if(this.onScrollMeasure) {\n this.cancelMeasure();\n this.needCheckAfterAnimation = true;\n }\n }, () => {\n this.isHeavyAnimationInProgress = false;\n\n if(this.needCheckAfterAnimation) {\n this.onScroll();\n this.needCheckAfterAnimation = false;\n }\n });\n }\n\n public removeListeners() {\n if(!this.removeHeavyAnimationListener) {\n return;\n }\n\n window.removeEventListener('resize', this.onScroll);\n this.removeScrollListener();\n\n this.removeHeavyAnimationListener();\n this.removeHeavyAnimationListener = undefined;\n }\n\n public destroy() {\n this.removeListeners();\n this.onAdditionalScroll = undefined;\n this.onScrolledTop = undefined;\n this.onScrolledBottom = undefined;\n }\n\n public append(...args: Parameters) {\n this.container.append(...args);\n }\n\n public scrollIntoViewNew(options: Omit) {\n // return Promise.resolve();\n // this.removeListeners();\n return fastSmoothScroll({\n ...options,\n container: this.container\n });/* .finally(() => {\n this.setListeners();\n }); */\n }\n\n public onScroll = () => {\n // if(this.debug) {\n // this.log('onScroll call', this.onScrollMeasure);\n // }\n\n // return;\n\n if(this.isHeavyAnimationInProgress) {\n this.cancelMeasure();\n this.needCheckAfterAnimation = true;\n return;\n }\n\n // if(this.onScrollMeasure || ((this.scrollLocked || (!this.onScrolledTop && !this.onScrolledBottom)) && !this.splitUp && !this.onAdditionalScroll)) return;\n if((!this.onScrolledTop && !this.onScrolledBottom) && !this.splitUp && !this.onAdditionalScroll) return;\n if(this.onScrollMeasure) return;\n // if(this.onScrollMeasure) window.cancelAnimationFrame(this.onScrollMeasure);\n // this.onScrollMeasure = window.requestAnimationFrame(() => {\n this.onScrollMeasure = window.setTimeout(() => {\n this.onScrollMeasure = 0;\n\n const scrollPosition = this.container[this.scrollProperty];\n this.lastScrollDirection = this.lastScrollPosition === scrollPosition ? 0 : (this.lastScrollPosition < scrollPosition ? 1 : -1); // * 1 - bottom, -1 - top\n this.lastScrollPosition = scrollPosition;\n\n // lastScrollDirection check is useless here, every callback should decide on its own\n if(this.onAdditionalScroll/* && this.lastScrollDirection !== 0 */) {\n this.onAdditionalScroll();\n }\n\n if(this.checkForTriggers) {\n this.checkForTriggers();\n }\n // });\n }, SCROLL_THROTTLE);\n };\n\n public cancelMeasure() {\n if(this.onScrollMeasure) {\n // window.cancelAnimationFrame(this.onScrollMeasure);\n clearTimeout(this.onScrollMeasure);\n this.onScrollMeasure = 0;\n }\n }\n}\n\nexport type SliceSides = 'top' | 'bottom';\nexport type SliceSidesContainer = {[k in SliceSides]: boolean};\n\nexport default class Scrollable extends ScrollableBase {\n public padding: HTMLElement;\n\n public loadedAll: SliceSidesContainer = {top: true, bottom: false};\n\n constructor(el?: HTMLElement, logPrefix = '', public onScrollOffset = 300, withPaddingContainer?: boolean) {\n super(el, logPrefix);\n\n /* if(withPaddingContainer) {\n this.padding = document.createElement('div');\n this.padding.classList.add('scrollable-padding');\n Array.from(this.container.children).forEach((c) => this.padding.append(c));\n this.container.append(this.padding);\n } */\n\n this.container.classList.add('scrollable-y');\n this.setListeners();\n this.scrollProperty = 'scrollTop';\n }\n\n public attachBorderListeners(setClassOn = this.container) {\n const cb = this.onAdditionalScroll;\n this.onAdditionalScroll = () => {\n cb?.();\n setClassOn.classList.toggle('scrolled-top', !this.scrollTop);\n setClassOn.classList.toggle('scrolled-bottom', this.isScrolledDown);\n };\n\n setClassOn.classList.add('scrolled-top', 'scrolled-bottom', 'scrollable-y-bordered');\n }\n\n public setVirtualContainer(el?: HTMLElement) {\n this.splitUp = el;\n this.log('setVirtualContainer:', el, this);\n }\n\n public checkForTriggers = () => {\n if((!this.onScrolledTop && !this.onScrolledBottom)) return;\n\n if(this.isHeavyAnimationInProgress) {\n this.onScroll();\n return;\n }\n\n const scrollHeight = this.container.scrollHeight;\n if(!scrollHeight) { // ะฝะตะทะฐั‡ะตะผ ะฒั‹ะทั‹ะฒะฐั‚ัŒ ั‚ั€ะธะณะณะตั€ั‹ ะตัะปะธ ะฑะปะพะบ ะฟัƒัั‚ะพะน ะธะปะธ ะฝะต ะฒะธะดะตะฝ\n return;\n }\n\n const clientHeight = this.container.clientHeight;\n const maxScrollTop = scrollHeight - clientHeight;\n const scrollTop = this.lastScrollPosition;\n\n // this.log('checkForTriggers:', scrollTop, maxScrollTop);\n\n if(this.onScrolledTop && scrollTop <= this.onScrollOffset && this.lastScrollDirection <= 0/* && direction === -1 */) {\n this.onScrolledTop();\n }\n\n if(this.onScrolledBottom && (maxScrollTop - scrollTop) <= this.onScrollOffset && this.lastScrollDirection >= 0/* && direction === 1 */) {\n this.onScrolledBottom();\n }\n };\n\n public prepend(...elements: (HTMLElement | DocumentFragment)[]) {\n (this.splitUp || this.padding || this.container).prepend(...elements);\n }\n\n public append(...elements: (HTMLElement | DocumentFragment)[]) {\n (this.splitUp || this.padding || this.container).append(...elements);\n }\n\n public getDistanceToEnd() {\n return this.scrollHeight - Math.round(this.scrollTop + this.container.offsetHeight);\n }\n\n get isScrolledDown() {\n return this.getDistanceToEnd() <= 1;\n }\n\n set scrollTop(y: number) {\n this.container.scrollTop = y;\n }\n\n get scrollTop() {\n // this.log.trace('get scrollTop');\n return this.container.scrollTop;\n }\n\n public setScrollTopSilently(value: number) {\n this.lastScrollPosition = value;\n this.ignoreNextScrollEvent();\n\n this.scrollTop = value;\n }\n\n public ignoreNextScrollEvent() {\n if(this.removeHeavyAnimationListener) {\n this.removeScrollListener();\n this.container.addEventListener('scroll', (e) => {\n cancelEvent(e);\n this.addScrollListener();\n }, {capture: true, passive: false, once: true});\n }\n }\n\n get scrollHeight() {\n return this.container.scrollHeight;\n }\n}\n\nexport class ScrollableX extends ScrollableBase {\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, public splitCount = 15, public container: HTMLElement = document.createElement('div')) {\n super(el, logPrefix, container);\n\n this.container.classList.add('scrollable-x');\n\n if(!IS_TOUCH_SUPPORTED) {\n const scrollHorizontally = (e: any) => {\n if(!e.deltaX && this.container.scrollWidth > this.container.clientWidth) {\n this.container.scrollLeft += e.deltaY / 4;\n cancelEvent(e);\n }\n };\n\n this.container.addEventListener('wheel', scrollHorizontally, {passive: false});\n }\n\n this.scrollProperty = 'scrollLeft';\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 {LangPackKey, FormatterArguments, i18n_} from '../lib/langPack';\nimport {generateDelimiter} from './generateDelimiter';\nimport Scrollable from './scrollable';\n\nexport type SettingSectionOptions = {\n name?: LangPackKey,\n nameArgs?: FormatterArguments,\n caption?: LangPackKey | true,\n captionArgs?: FormatterArguments,\n captionOld?: SettingSectionOptions['caption'],\n noDelimiter?: boolean,\n fakeGradientDelimiter?: boolean,\n noShadow?: boolean,\n // fullWidth?: boolean,\n // noPaddingTop?: boolean\n};\n\nconst className = 'sidebar-left-section';\nexport default class SettingSection {\n public container: HTMLElement;\n public innerContainer: HTMLElement;\n public content: HTMLElement;\n public title: HTMLElement;\n public caption: HTMLElement;\n\n private fullWidth: boolean;\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 // if(options.fullWidth) {\n // this.fullWidth = true;\n // }\n\n // if(options.noPaddingTop) {\n // innerContainer.classList.add('no-padding-top');\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 const caption = options.caption ?? options.captionOld;\n if(caption) {\n const el = this.caption = this.generateContentElement();\n el.classList.add(className + '-caption');\n\n if(!options.captionOld) {\n container.append(el);\n }\n\n if(caption !== true) {\n i18n_({element: el, key: caption, args: options.captionArgs});\n }\n }\n }\n\n public generateContentElement() {\n const content = document.createElement('div');\n content.classList.add(className + '-content');\n\n // if(this.fullWidth) {\n // content.classList.add('full-width');\n // }\n\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","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {InputFile} from '../../../layer';\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport InputField from '../../inputField';\nimport {SliderSuperTab} from '../../slider';\nimport AvatarEdit from '../../avatarEdit';\nimport I18n from '../../../lib/langPack';\nimport ButtonCorner from '../../buttonCorner';\nimport getUserStatusString from '../../wrappers/getUserStatusString';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport SettingSection from '../../settingSection';\n\ninterface OpenStreetMapInterface {\n place_id?: number;\n license?: string;\n osm_type?: string;\n osm_id?: number;\n lat?: string;\n lon?: string;\n display_name: string;\n address?: object;\n boundingbox?: object;\n}\n\nexport default class AppNewGroupTab extends SliderSuperTab {\n private avatarEdit: AvatarEdit;\n private uploadAvatar: () => Promise = null;\n private peerIds: PeerId[];\n private isGeoChat: boolean = false;\n private nextBtn: HTMLButtonElement;\n private groupNameInputField: InputField;\n private list: HTMLUListElement;\n private groupLocationInputField: InputField;\n private userLocationCoords: {lat: number, long: number};\n private userLocationAddress: string;\n\n public init(\n peerIds: PeerId[],\n isGeoChat: boolean = false\n ) {\n this.isGeoChat = isGeoChat;\n this.peerIds = peerIds;\n\n this.container.classList.add('new-group-container');\n this.setTitle('NewGroup');\n\n this.avatarEdit = new AvatarEdit((_upload) => {\n this.uploadAvatar = _upload;\n });\n\n const section = new SettingSection({});\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.groupNameInputField = new InputField({\n label: 'CreateGroup.NameHolder',\n maxLength: 128\n });\n\n this.groupLocationInputField = new InputField({\n label: 'ChatLocation',\n name: 'location',\n canBeEdited: false\n });\n\n inputWrapper.append(\n this.groupNameInputField.container,\n this.groupLocationInputField.container\n );\n\n this.listenerSetter.add(this.groupNameInputField.input)('input', () => {\n const value = this.groupNameInputField.value;\n let valueCheck = !!value.length && !this.groupNameInputField.input.classList.contains('error');\n if(this.isGeoChat) valueCheck = valueCheck && !!this.userLocationCoords && !!this.userLocationAddress;\n this.nextBtn.classList.toggle('is-visible', !!valueCheck);\n });\n\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\n\n attachClickEvent(this.nextBtn, () => {\n const title = this.groupNameInputField.value;\n\n let promise: Promise;\n if(this.isGeoChat) {\n if(!this.userLocationAddress || !this.userLocationCoords) return;\n promise = this.managers.appChatsManager.createChannel({\n title,\n about: '',\n geo_point: {\n _: 'inputGeoPoint',\n ...this.userLocationCoords\n },\n address: this.userLocationAddress,\n megagroup: true\n }).then((chatId) => {\n if(this.uploadAvatar) {\n this.uploadAvatar().then((inputFile) => {\n this.managers.appChatsManager.editPhoto(chatId, inputFile);\n });\n }\n\n if(this.peerIds.length) {\n this.managers.appChatsManager.inviteToChannel(chatId, this.peerIds);\n }\n\n return chatId;\n });\n } else {\n this.nextBtn.disabled = true;\n promise = this.managers.appChatsManager.createChat(title, this.peerIds.map((peerId) => peerId.toUserId())).then((chatId) => {\n if(this.uploadAvatar) {\n this.uploadAvatar().then((inputFile) => {\n this.managers.appChatsManager.editPhoto(chatId, inputFile);\n });\n }\n\n return chatId;\n });\n }\n\n if(!promise) {\n return;\n }\n\n promise.then((chatId) => {\n this.close();\n\n appImManager.setInnerPeer({peerId: chatId.toPeerId(true)});\n });\n }, {listenerSetter: this.listenerSetter});\n\n const chatsSection = new SettingSection({\n name: 'Members',\n nameArgs: [this.peerIds.length]\n });\n\n const list = this.list = appDialogsManager.createChatList({\n new: true\n });\n\n chatsSection.content.append(list);\n\n section.content.append(this.avatarEdit.container, inputWrapper);\n\n this.content.append(this.nextBtn);\n this.scrollable.append(section.container, chatsSection.container);\n\n if(isGeoChat) {\n this.setTitle('NearbyCreateGroup');\n this.groupLocationInputField.container.classList.remove('hide');\n this.groupLocationInputField.setValueSilently(I18n.format('Loading', true));\n this.startLocating();\n } else {\n this.groupLocationInputField.container.classList.add('hide');\n }\n\n return Promise.all(this.peerIds.map(async(userId) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: userId,\n container: this.list,\n rippleEnabled: false,\n avatarSize: 'abitbigger'\n });\n\n dom.lastMessageSpan.append(getUserStatusString(await this.managers.appUsersManager.getUser(userId)));\n }));\n }\n\n public onCloseAfterTimeout() {\n this.avatarEdit.clear();\n this.uploadAvatar = null;\n this.groupNameInputField.value = '';\n this.groupLocationInputField.container.classList.add('hide');\n this.nextBtn.disabled = false;\n }\n\n private startLocating() {\n navigator.geolocation.getCurrentPosition((location) => {\n this.userLocationCoords = {\n lat: location.coords.latitude,\n long: location.coords.longitude\n };\n\n let uri = 'https://nominatim.openstreetmap.org/reverse';\n uri += '?lat='+location.coords.latitude;\n uri += '&lon='+location.coords.longitude;\n uri += '&format=json';\n uri += '&addressdetails=1';\n uri += '&accept-language=en';\n fetch(uri)\n .then((response) => response.json())\n .then((response: OpenStreetMapInterface) => {\n this.userLocationAddress = response.display_name;\n this.groupLocationInputField.setValueSilently(response.display_name);\n });\n }, (error) => {\n if(error instanceof GeolocationPositionError) {\n this.groupLocationInputField.setValueSilently('Location permission denied. Please retry later.');\n } else {\n this.groupLocationInputField.setValueSilently('An error has occurred. Please retry later.');\n }\n });\n }\n}\n","enum PrivacyType {\n Everybody = 2,\n Contacts = 1,\n Nobody = 0\n}\n\nexport default PrivacyType;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {PrivacyRule} from '../../../../layer';\nimport PrivacyType from './privacyType';\n\nexport default function getPrivacyRulesDetails(rules: PrivacyRule[]) {\n const types: PrivacyType[] = [];\n\n type peers = {users: UserId[], chats: ChatId[]};\n const allowPeers: peers = {users: [], chats: []}, disallowPeers: peers = {users: [], chats: []};\n rules.forEach((rule) => {\n switch(rule._) {\n case 'privacyValueAllowAll':\n types.push(2);\n break;\n case 'privacyValueDisallowAll':\n types.push(0);\n break;\n case 'privacyValueAllowContacts':\n types.push(1);\n break;\n /* case 'privacyValueDisallowContacts':\n types.push('Except My Contacts');\n break; */\n case 'privacyValueAllowChatParticipants':\n allowPeers.chats.push(...rule.chats);\n break;\n case 'privacyValueAllowUsers':\n allowPeers.users.push(...rule.users);\n break;\n case 'privacyValueDisallowChatParticipants':\n disallowPeers.chats.push(...rule.chats);\n break;\n case 'privacyValueDisallowUsers':\n disallowPeers.users.push(...rule.users);\n break;\n }\n });\n\n return {type: types[0], disallowPeers, allowPeers};\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 {randomLong} from '../helpers/random';\nimport {InputPrivacyKey, InputPrivacyRule} from '../layer';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport getPrivacyRulesDetails from '../lib/appManagers/utils/privacy/getPrivacyRulesDetails';\nimport PrivacyType from '../lib/appManagers/utils/privacy/privacyType';\nimport {i18n, join, LangPackKey, _i18n} from '../lib/langPack';\nimport RadioField from './radioField';\nimport Row, {RadioFormFromRows} from './row';\nimport Scrollable from './scrollable';\nimport SettingSection, {generateSection} from './settingSection';\nimport AppAddMembersTab from './sidebarLeft/tabs/addMembers';\nimport {SliderSuperTabEventable} from './sliderTab';\n\nexport type PrivacySectionStr = LangPackKey | '' | HTMLElement;\nexport default class PrivacySection {\n public radioRows: Map;\n public radioSection: SettingSection;\n public exceptions: Map;\n public peerIds: {\n disallow?: PeerId[],\n allow?: PeerId[]\n };\n public type: PrivacyType;\n\n constructor(public options: {\n tab: SliderSuperTabEventable,\n title: LangPackKey,\n inputKey: InputPrivacyKey['_'],\n captions?: [PrivacySectionStr, PrivacySectionStr, PrivacySectionStr],\n appendTo?: Scrollable,\n noExceptions?: boolean,\n onRadioChange?: (value: number) => any,\n skipTypes?: PrivacyType[],\n exceptionTexts?: [LangPackKey, LangPackKey],\n managers: AppManagers\n }) {\n if(options.captions) {\n options.captions.reverse();\n }\n\n const managers = options.managers;\n\n this.radioSection = new SettingSection({name: options.title, caption: true});\n\n this.radioRows = new Map();\n\n let r: Array<{type: PrivacyType, langKey: LangPackKey}> = [{\n type: PrivacyType.Everybody,\n langKey: 'PrivacySettingsController.Everbody'\n }, {\n type: PrivacyType.Contacts,\n langKey: 'PrivacySettingsController.MyContacts'\n }, {\n type: PrivacyType.Nobody,\n langKey: 'PrivacySettingsController.Nobody'\n }];\n\n if(options.skipTypes) {\n r = r.filter((r) => !options.skipTypes.includes(r.type));\n }\n\n const random = randomLong();\n r.forEach(({type, langKey}) => {\n const row = new Row({\n radioField: new RadioField({\n langKey,\n name: random,\n value: '' + type\n })\n });\n\n this.radioRows.set(type, row);\n });\n\n const form = RadioFormFromRows([...this.radioRows.values()], this.onRadioChange);\n\n this.radioSection.content.append(form);\n if(options.appendTo) {\n options.appendTo.append(this.radioSection.container);\n }\n\n if(!options.noExceptions) {\n const container = generateSection(options.appendTo, 'PrivacyExceptions', 'PrivacySettingsController.PeerInfo');\n\n this.exceptions = new Map([[\n 'disallow',\n {\n titleLangKey: options.exceptionTexts[0],\n key: 'disallow',\n row: null,\n icon: 'deleteuser',\n subtitleLangKey: 'PrivacySettingsController.AddUsers',\n clickable: true\n }\n ], [\n 'allow',\n {\n titleLangKey: options.exceptionTexts[1],\n key: 'allow',\n row: null,\n icon: 'adduser',\n subtitleLangKey: 'PrivacySettingsController.AddUsers',\n clickable: true\n }\n ]]);\n\n this.exceptions.forEach((exception) => {\n exception.row = new Row(exception);\n\n exception.row.container.addEventListener('click', () => {\n promise.then(() => {\n const _peerIds = this.peerIds[exception.key];\n options.tab.slider.createTab(AppAddMembersTab).open({\n type: 'privacy',\n skippable: true,\n title: exception.titleLangKey,\n placeholder: 'PrivacyModal.Search.Placeholder',\n takeOut: (newPeerIds) => {\n _peerIds.length = 0;\n _peerIds.push(...newPeerIds);\n exception.row.subtitle.innerHTML = '';\n exception.row.subtitle.append(...this.generateStr(this.splitPeersByType(newPeerIds)));\n },\n selectedPeerIds: _peerIds\n });\n });\n });\n\n container.append(exception.row.container);\n });\n }\n\n /* setTimeout(() => {\n this.setRadio(PrivacyType.Contacts);\n }, 0); */\n\n const promise = managers.appPrivacyManager.getPrivacy(options.inputKey).then((rules) => {\n const details = getPrivacyRulesDetails(rules);\n this.setRadio(details.type);\n\n if(this.exceptions) {\n this.peerIds = {};\n ['allow' as const, 'disallow' as const].forEach((k) => {\n const arr = [];\n const from = k === 'allow' ? details.allowPeers : details.disallowPeers;\n arr.push(...from.users.map((id) => id.toPeerId()));\n arr.push(...from.chats.map((id) => id.toPeerId(true)));\n this.peerIds[k] = arr;\n const s = this.exceptions.get(k).row.subtitle;\n s.innerHTML = '';\n s.append(...this.generateStr(from));\n });\n }\n\n options.tab.eventListener.addEventListener('destroy', async() => {\n const rules: InputPrivacyRule[] = [];\n\n switch(this.type) {\n case PrivacyType.Everybody:\n rules.push({_: 'inputPrivacyValueAllowAll'});\n break;\n case PrivacyType.Contacts:\n rules.push({_: 'inputPrivacyValueAllowContacts'});\n break;\n case PrivacyType.Nobody:\n rules.push({_: 'inputPrivacyValueDisallowAll'});\n break;\n }\n\n if(this.exceptions) {\n const a = ([\n ['allow', 'inputPrivacyValueAllowChatParticipants', 'inputPrivacyValueAllowUsers'],\n ['disallow', 'inputPrivacyValueDisallowChatParticipants', 'inputPrivacyValueDisallowUsers']\n ] as Array<[\n 'allow' | 'disallow',\n 'inputPrivacyValueAllowChatParticipants' | 'inputPrivacyValueDisallowChatParticipants',\n 'inputPrivacyValueAllowUsers' | 'inputPrivacyValueDisallowUsers'\n ]>);\n for(const [k, chatKey, usersKey] of a) {\n if(this.exceptions.get(k).row.container.classList.contains('hide')) {\n continue;\n }\n\n const _peerIds = this.peerIds[k];\n if(_peerIds) {\n const splitted = this.splitPeersByType(_peerIds);\n if(splitted.chats.length) {\n rules.push({_: chatKey, chats: splitted.chats});\n }\n\n if(splitted.users.length) {\n rules.push({\n _: usersKey,\n users: await Promise.all(splitted.users.map((id) => managers.appUsersManager.getUserInput(id)))\n });\n }\n }\n }\n }\n\n managers.appPrivacyManager.setPrivacy(options.inputKey, rules);\n }, {once: true});\n });\n }\n\n private onRadioChange = (value: string | PrivacySection['type']) => {\n value = +value as PrivacySection['type'];\n this.type = value;\n\n const caption = this.options.captions[this.type];\n const captionElement = this.radioSection.caption;\n if(!caption) {\n captionElement.innerHTML = '';\n } else if(caption instanceof HTMLElement) {\n replaceContent(captionElement, caption);\n } else {\n _i18n(captionElement, caption);\n }\n captionElement.classList.toggle('hide', !caption);\n\n if(this.exceptions) {\n this.exceptions.get('allow').row.container.classList.toggle('hide', this.type === PrivacyType.Everybody);\n this.exceptions.get('disallow').row.container.classList.toggle('hide', this.type === PrivacyType.Nobody);\n }\n\n this.options.onRadioChange && this.options.onRadioChange(value);\n };\n\n public setRadio(type: PrivacySection['type']) {\n const row = this.radioRows.get(type);\n this.onRadioChange(type);\n row.radioField.input.checked = true;\n }\n\n private splitPeersByType(peerIds: PeerId[]) {\n const peers = {users: [] as UserId[], chats: [] as ChatId[]};\n peerIds.forEach((peerId) => {\n peers[peerId.isAnyChat() ? 'chats' : 'users'].push(peerId.isAnyChat() ? peerId.toChatId() : peerId);\n });\n\n return peers;\n }\n\n private generateStr(peers: {users: UserId[], chats: ChatId[]}) {\n if(!peers.users.length && !peers.chats.length) {\n return [i18n('PrivacySettingsController.AddUsers')];\n }\n\n return join([\n peers.users.length ? i18n('Users', [peers.users.length]) : null,\n peers.chats.length ? i18n('Chats', [peers.chats.length]) : null\n ].filter(Boolean), false);\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 {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {i18n, LangPackKey} from '../../../../lib/langPack';\nimport anchorCopy from '../../../../helpers/dom/anchorCopy';\nimport PrivacyType from '../../../../lib/appManagers/utils/privacy/privacyType';\n\nexport default class AppPrivacyPhoneNumberTab extends SliderSuperTabEventable {\n public async init() {\n this.container.classList.add('privacy-tab', 'privacy-phone-number');\n this.setTitle('PrivacyPhone');\n\n const formatted = '+' + (await this.managers.appUsersManager.getSelf()).phone;\n const captionEl = document.createElement('div');\n captionEl.append(\n i18n('PrivacyPhoneInfo'),\n document.createElement('br'),\n document.createElement('br'),\n i18n('PrivacyPhoneInfo4'),\n document.createElement('br'),\n anchorCopy({\n mePath: formatted\n })\n );\n\n const phoneSection = new PrivacySection({\n tab: this,\n title: 'PrivacyPhoneTitle',\n inputKey: 'inputPrivacyKeyPhoneNumber',\n captions: [captionEl, captionEl, ''],\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\n appendTo: this.scrollable,\n onRadioChange: (type) => {\n s.setRadio(PrivacyType.Everybody);\n s.radioSection.container.classList.toggle('hide', type !== PrivacyType.Nobody);\n },\n managers: this.managers\n });\n\n const sCaption: LangPackKey = 'PrivacyPhoneInfo3';\n const s = new PrivacySection({\n tab: this,\n title: 'PrivacyPhoneTitle2',\n inputKey: 'inputPrivacyKeyAddedByPhone',\n captions: [sCaption, sCaption, ''],\n noExceptions: true,\n skipTypes: [PrivacyType.Nobody],\n managers: this.managers\n });\n\n this.scrollable.container.insertBefore(s.radioSection.container, phoneSection.radioSection.container.nextSibling);\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 Button from '../../../button';\nimport SettingSection from '../../../settingSection';\nimport {SliderSuperTab} from '../../../slider';\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\nimport AppSettingsTab from '../settings';\n\nexport default class AppTwoStepVerificationSetTab extends SliderSuperTab {\n public init() {\n this.container.classList.add('two-step-verification', 'two-step-verification-set');\n this.setTitle('TwoStepVerificationPasswordSet');\n\n const section = new SettingSection({\n captionOld: 'TwoStepVerificationPasswordSetInfo',\n noDelimiter: true\n });\n\n const emoji = '๐Ÿฅณ';\n const stickerContainer = document.createElement('div');\n\n wrapStickerEmoji({\n emoji,\n div: stickerContainer,\n width: 160,\n height: 160\n });\n\n section.content.append(stickerContainer);\n\n const inputContent = section.generateContentElement();\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const btnReturn = Button('btn-primary btn-color-primary', {text: 'TwoStepVerificationPasswordReturnSettings'});\n\n attachClickEvent(btnReturn, (e) => {\n this.close();\n });\n\n this.slider.sliceTabsUntilTab(AppSettingsTab, this);\n\n inputWrapper.append(btnReturn);\n\n inputContent.append(inputWrapper);\n\n this.scrollable.container.append(section.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 {IS_MOBILE_SAFARI} from '../../environment/userAgent';\n\nexport function canFocus(isFirstInput: boolean) {\n return !IS_MOBILE_SAFARI || !isFirstInput;\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 {AccountPassword} from '../../../../layer';\nimport Button from '../../../button';\nimport {SliderSuperTab} from '../../../slider';\nimport AppTwoStepVerificationSetTab from './passwordSet';\nimport CodeInputField from '../../../codeInputField';\nimport AppTwoStepVerificationEmailTab from './email';\nimport {putPreloader} from '../../../putPreloader';\nimport {i18n, _i18n} from '../../../../lib/langPack';\nimport {canFocus} from '../../../../helpers/dom/canFocus';\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\nimport replaceContent from '../../../../helpers/dom/replaceContent';\nimport toggleDisability from '../../../../helpers/dom/toggleDisability';\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\nimport SettingSection from '../../../settingSection';\n\nexport default class AppTwoStepVerificationEmailConfirmationTab extends SliderSuperTab {\n public codeInputField: CodeInputField;\n public state: AccountPassword;\n public email: string;\n public length: number;\n public isFirst = false;\n\n public init() {\n this.container.classList.add('two-step-verification', 'two-step-verification-email-confirmation');\n this.setTitle('TwoStepAuth.RecoveryTitle');\n\n const section = new SettingSection({\n captionOld: true,\n noDelimiter: true\n });\n\n _i18n(section.caption, 'TwoStepAuth.ConfirmEmailCodeDesc', [this.email]);\n\n const emoji = '๐Ÿ“ฌ';\n const stickerContainer = document.createElement('div');\n\n wrapStickerEmoji({\n div: stickerContainer,\n width: 160,\n height: 160,\n emoji\n });\n\n section.content.append(stickerContainer);\n\n const inputContent = section.generateContentElement();\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const inputField = this.codeInputField = new CodeInputField({\n name: 'recovery-email-code',\n label: 'TwoStepAuth.RecoveryCode',\n length: this.length,\n onFill: (code) => {\n freeze(true);\n\n this.managers.passwordManager.confirmPasswordEmail('' + code)\n .then((value) => {\n if(!value) {\n\n }\n\n goNext();\n })\n .catch((err) => {\n switch(err.type) {\n case 'CODE_INVALID':\n inputField.input.classList.add('error');\n replaceContent(inputField.label, i18n('TwoStepAuth.RecoveryCodeInvalid'));\n break;\n\n case 'EMAIL_HASH_EXPIRED':\n inputField.input.classList.add('error');\n replaceContent(inputField.label, i18n('TwoStepAuth.RecoveryCodeExpired'));\n break;\n\n default:\n console.error('confirm error', err);\n break;\n }\n\n freeze(false);\n });\n }\n });\n\n const btnChange = Button('btn-primary btn-primary-transparent primary', {text: 'TwoStepAuth.EmailCodeChangeEmail'});\n const btnResend = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'ResendCode'});\n\n const goNext = () => {\n this.slider.createTab(AppTwoStepVerificationSetTab).open();\n };\n\n const freeze = (disable: boolean) => {\n toggleDisability([inputField.input, btnChange, btnResend], disable);\n };\n\n attachClickEvent(btnChange, (e) => {\n freeze(true);\n this.managers.passwordManager.cancelPasswordEmail().then((value) => {\n this.slider.sliceTabsUntilTab(AppTwoStepVerificationEmailTab, this);\n this.close();\n }, () => {\n freeze(false);\n });\n });\n\n attachClickEvent(btnResend, (e) => {\n freeze(true);\n const d = putPreloader(btnResend);\n this.managers.passwordManager.resendPasswordEmail().then((value) => {\n d.remove();\n freeze(false);\n });\n });\n\n inputWrapper.append(inputField.container, btnChange, btnResend);\n\n inputContent.append(inputWrapper);\n\n this.scrollable.container.append(section.container);\n }\n\n onOpenAfterTimeout() {\n if(!canFocus(this.isFirst)) return;\n this.codeInputField.input.focus();\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 {AccountPassword} from '../../../../layer';\nimport Button from '../../../button';\nimport {SliderSuperTab} from '../../../slider';\nimport InputField from '../../../inputField';\nimport {putPreloader} from '../../../putPreloader';\nimport AppTwoStepVerificationSetTab from './passwordSet';\nimport AppTwoStepVerificationEmailConfirmationTab from './emailConfirmation';\nimport PopupPeer from '../../../popups/peer';\nimport cancelEvent from '../../../../helpers/dom/cancelEvent';\nimport {canFocus} from '../../../../helpers/dom/canFocus';\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\nimport matchEmail from '../../../../lib/richTextProcessor/matchEmail';\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\nimport SettingSection from '../../../settingSection';\n\nexport default class AppTwoStepVerificationEmailTab extends SliderSuperTab {\n public inputField: InputField;\n public state: AccountPassword;\n public plainPassword: string;\n public newPassword: string;\n public hint: string;\n public isFirst = false;\n\n public init() {\n this.container.classList.add('two-step-verification', 'two-step-verification-email');\n this.setTitle('RecoveryEmailTitle');\n\n const section = new SettingSection({\n captionOld: true,\n noDelimiter: true\n });\n\n const emoji = '๐Ÿ’Œ';\n const stickerContainer = document.createElement('div');\n\n wrapStickerEmoji({\n div: stickerContainer,\n width: 160,\n height: 160,\n emoji\n });\n\n section.content.append(stickerContainer);\n\n const inputContent = section.generateContentElement();\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const inputField = this.inputField = new InputField({\n name: 'recovery-email',\n label: 'RecoveryEmail',\n plainText: true\n });\n\n inputField.input.addEventListener('keypress', (e) => {\n if(e.key === 'Enter') {\n cancelEvent(e);\n return onContinueClick();\n }\n });\n\n inputField.input.addEventListener('input', (e) => {\n inputField.input.classList.remove('error');\n });\n\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\n const btnSkip = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'YourEmailSkip'});\n\n const goNext = () => {\n this.slider.createTab(AppTwoStepVerificationSetTab).open();\n };\n\n const onContinueClick = () => {\n const email = inputField.value.trim();\n const match = matchEmail(email);\n if(!match || match[0].length !== email.length) {\n inputField.input.classList.add('error');\n return;\n }\n\n toggleButtons(true);\n const d = putPreloader(btnContinue);\n\n this.managers.passwordManager.updateSettings({\n hint: this.hint,\n currentPassword: this.plainPassword,\n newPassword: this.newPassword,\n email\n }).then((value) => {\n goNext();\n }, (err) => {\n if(err.type.includes('EMAIL_UNCONFIRMED')) {\n const symbols = +err.type.match(/^EMAIL_UNCONFIRMED_(\\d+)/)[1];\n\n const tab = this.slider.createTab(AppTwoStepVerificationEmailConfirmationTab);\n tab.state = this.state;\n tab.email = email;\n tab.length = symbols;\n tab.open();\n } else {\n console.log('password set error', err);\n }\n\n toggleButtons(false);\n d.remove();\n });\n };\n attachClickEvent(btnContinue, onContinueClick);\n\n const toggleButtons = (freeze: boolean) => {\n if(freeze) {\n btnContinue.setAttribute('disabled', 'true');\n btnSkip.setAttribute('disabled', 'true');\n } else {\n btnContinue.removeAttribute('disabled');\n btnSkip.removeAttribute('disabled');\n }\n };\n\n attachClickEvent(btnSkip, (e) => {\n const popup = new PopupPeer('popup-skip-email', {\n buttons: [{\n langKey: 'Cancel',\n isCancel: true\n }, {\n langKey: 'YourEmailSkip',\n callback: () => {\n // inputContent.classList.add('sidebar-left-section-disabled');\n toggleButtons(true);\n putPreloader(btnSkip);\n this.managers.passwordManager.updateSettings({\n hint: this.hint,\n currentPassword: this.plainPassword,\n newPassword: this.newPassword,\n email: ''\n }).then(() => {\n goNext();\n }, (err) => {\n toggleButtons(false);\n });\n },\n isDanger: true\n }],\n titleLangKey: 'YourEmailSkipWarning',\n descriptionLangKey: 'YourEmailSkipWarningText'\n });\n\n popup.show();\n });\n\n inputWrapper.append(inputField.container, btnContinue, btnSkip);\n\n inputContent.append(inputWrapper);\n\n this.scrollable.container.append(section.container);\n }\n\n onOpenAfterTimeout() {\n if(!canFocus(this.isFirst)) return;\n this.inputField.input.focus();\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 {AccountPassword} from '../../../../layer';\nimport Button from '../../../button';\nimport {SliderSuperTab} from '../../../slider';\nimport InputField from '../../../inputField';\nimport AppTwoStepVerificationEmailTab from './email';\nimport {toast} from '../../../toast';\nimport I18n from '../../../../lib/langPack';\nimport cancelEvent from '../../../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\nimport SettingSection from '../../../settingSection';\n\nexport default class AppTwoStepVerificationHintTab extends SliderSuperTab {\n public inputField: InputField;\n public state: AccountPassword;\n public plainPassword: string;\n public newPassword: string;\n\n public init() {\n this.container.classList.add('two-step-verification', 'two-step-verification-hint');\n this.setTitle('TwoStepAuth.SetupHintTitle');\n\n const section = new SettingSection({\n noDelimiter: true\n });\n\n const emoji = '๐Ÿ’ก';\n const stickerContainer = document.createElement('div');\n wrapStickerEmoji({\n div: stickerContainer,\n width: 160,\n height: 160,\n emoji\n });\n\n section.content.append(stickerContainer);\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const inputField = this.inputField = new InputField({\n name: 'hint',\n label: 'TwoStepAuth.SetupHintPlaceholder'\n });\n\n inputField.input.addEventListener('keypress', (e) => {\n if(e.key === 'Enter') {\n cancelEvent(e);\n return inputField.value ? onContinueClick() : onSkipClick();\n }\n });\n\n const goNext = (e?: Event, saveHint?: boolean) => {\n if(e) {\n cancelEvent(e);\n }\n\n const hint = saveHint ? inputField.value : undefined;\n if(hint && this.newPassword === hint) {\n toast(I18n.format('PasswordAsHintError', true));\n return;\n }\n\n const tab = this.slider.createTab(AppTwoStepVerificationEmailTab);\n tab.state = this.state;\n tab.plainPassword = this.plainPassword;\n tab.newPassword = this.newPassword;\n tab.hint = hint;\n\n tab.open();\n };\n\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\n const btnSkip = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'YourEmailSkip'});\n\n const onContinueClick = (e?: Event) => goNext(e, true);\n const onSkipClick = (e?: Event) => goNext(e, false);\n attachClickEvent(btnContinue, onContinueClick);\n attachClickEvent(btnSkip, onSkipClick);\n\n inputWrapper.append(inputField.container, btnContinue, btnSkip);\n\n section.content.append(inputWrapper);\n\n this.scrollable.container.append(section.container);\n }\n\n onOpenAfterTimeout() {\n this.inputField.input.focus();\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 {AccountPassword} from '../../../../layer';\nimport Button from '../../../button';\nimport PasswordInputField from '../../../passwordInputField';\nimport {SliderSuperTab} from '../../../slider';\nimport TrackingMonkey from '../../../monkeys/tracking';\nimport AppTwoStepVerificationHintTab from './hint';\nimport {InputState} from '../../../inputField';\nimport cancelEvent from '../../../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\nimport SettingSection from '../../../settingSection';\n\nexport default class AppTwoStepVerificationReEnterPasswordTab extends SliderSuperTab {\n public state: AccountPassword;\n public passwordInputField: PasswordInputField;\n public plainPassword: string;\n public newPassword: string;\n\n public init() {\n this.container.classList.add('two-step-verification', 'two-step-verification-enter-password', 'two-step-verification-re-enter-password');\n this.setTitle('PleaseReEnterPassword');\n\n const section = new SettingSection({\n noDelimiter: true\n });\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const passwordInputField = this.passwordInputField = new PasswordInputField({\n name: 're-enter-password',\n label: 'PleaseReEnterPassword'\n });\n\n const monkey = new TrackingMonkey(passwordInputField, 157);\n\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\n\n inputWrapper.append(passwordInputField.container, btnContinue);\n section.content.append(monkey.container, inputWrapper);\n\n this.scrollable.container.append(section.container);\n\n passwordInputField.input.addEventListener('keypress', (e) => {\n if(passwordInputField.input.classList.contains('error')) {\n passwordInputField.setState(InputState.Neutral);\n }\n\n if(e.key === 'Enter') {\n return onContinueClick();\n }\n });\n\n const verifyInput = () => {\n if(this.newPassword !== passwordInputField.value) {\n passwordInputField.setError();\n return false;\n }\n\n return true;\n };\n\n const onContinueClick = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n if(!verifyInput()) return;\n\n const tab = this.slider.createTab(AppTwoStepVerificationHintTab);\n tab.state = this.state;\n tab.plainPassword = this.plainPassword;\n tab.newPassword = this.newPassword;\n tab.open();\n };\n attachClickEvent(btnContinue, onContinueClick);\n\n return monkey.load();\n }\n\n onOpenAfterTimeout() {\n this.passwordInputField.input.focus();\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 AppTwoStepVerificationTab from '.';\nimport cancelEvent from '../../../../helpers/dom/cancelEvent';\nimport {canFocus} from '../../../../helpers/dom/canFocus';\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\nimport replaceContent from '../../../../helpers/dom/replaceContent';\nimport setInnerHTML from '../../../../helpers/dom/setInnerHTML';\nimport {AccountPassword} from '../../../../layer';\nimport I18n, {i18n} from '../../../../lib/langPack';\nimport wrapEmojiText from '../../../../lib/richTextProcessor/wrapEmojiText';\nimport Button from '../../../button';\nimport {putPreloader} from '../../../putPreloader';\nimport PasswordMonkey from '../../../monkeys/password';\nimport PasswordInputField from '../../../passwordInputField';\nimport {SliderSuperTab} from '../../../slider';\nimport AppTwoStepVerificationReEnterPasswordTab from './reEnterPassword';\nimport SettingSection from '../../../settingSection';\n\nexport default class AppTwoStepVerificationEnterPasswordTab extends SliderSuperTab {\n public state: AccountPassword;\n public passwordInputField: PasswordInputField;\n public plainPassword: string;\n public isFirst = true;\n\n public init() {\n const isNew = !this.state.pFlags.has_password || this.plainPassword;\n this.container.classList.add('two-step-verification', 'two-step-verification-enter-password');\n this.setTitle(isNew ? 'PleaseEnterFirstPassword' : 'PleaseEnterCurrentPassword');\n\n const section = new SettingSection({\n noDelimiter: true\n });\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const passwordInputField = this.passwordInputField = new PasswordInputField({\n name: 'enter-password',\n label: isNew ? 'PleaseEnterFirstPassword' : (this.state.hint ? undefined : 'LoginPassword'),\n labelText: !isNew && this.state.hint ? wrapEmojiText(this.state.hint) : undefined\n });\n\n const monkey = new PasswordMonkey(passwordInputField, 157);\n\n const btnContinue = Button('btn-primary btn-color-primary');\n const textEl = new I18n.IntlElement({key: 'Continue'});\n\n btnContinue.append(textEl.element);\n\n inputWrapper.append(passwordInputField.container, btnContinue);\n section.content.append(monkey.container, inputWrapper);\n\n this.scrollable.container.append(section.container);\n\n passwordInputField.input.addEventListener('keypress', (e) => {\n if(passwordInputField.input.classList.contains('error')) {\n passwordInputField.input.classList.remove('error');\n textEl.key = 'Continue';\n textEl.update();\n }\n\n if(e.key === 'Enter') {\n return onContinueClick();\n }\n });\n\n const verifyInput = () => {\n if(!passwordInputField.value.length) {\n passwordInputField.input.classList.add('error');\n return false;\n }\n\n return true;\n };\n\n let onContinueClick: (e?: Event) => void;\n if(!isNew) {\n let getStateInterval: number;\n\n const getState = () => {\n // * just to check session relevance\n if(!getStateInterval) {\n getStateInterval = window.setInterval(getState, 10e3);\n }\n\n return this.managers.passwordManager.getState().then((_state) => {\n this.state = _state;\n\n if(this.state.hint) {\n setInnerHTML(passwordInputField.label, wrapEmojiText(this.state.hint));\n } else {\n replaceContent(passwordInputField.label, i18n('LoginPassword'));\n }\n });\n };\n\n const submit = (e?: Event) => {\n if(!verifyInput()) {\n cancelEvent(e);\n return;\n }\n\n btnContinue.setAttribute('disabled', 'true');\n textEl.key = 'PleaseWait';\n textEl.update();\n const preloader = putPreloader(btnContinue);\n\n const plainPassword = passwordInputField.value;\n this.managers.passwordManager.check(passwordInputField.value, this.state).then((auth) => {\n console.log(auth);\n\n if(auth._ === 'auth.authorization') {\n clearInterval(getStateInterval);\n if(monkey) monkey.remove();\n const tab = this.slider.createTab(AppTwoStepVerificationTab);\n tab.state = this.state;\n tab.plainPassword = plainPassword;\n tab.open();\n this.slider.removeTabFromHistory(this);\n }\n }, (err) => {\n btnContinue.removeAttribute('disabled');\n passwordInputField.input.classList.add('error');\n\n switch(err.type) {\n default:\n // btnContinue.innerText = err.type;\n textEl.key = 'PASSWORD_HASH_INVALID';\n textEl.update();\n preloader.remove();\n passwordInputField.select();\n break;\n }\n\n getState();\n });\n };\n\n onContinueClick = submit;\n\n getState();\n } else {\n onContinueClick = (e) => {\n if(e) {\n cancelEvent(e);\n }\n\n if(!verifyInput()) return;\n\n const tab = this.slider.createTab(AppTwoStepVerificationReEnterPasswordTab);\n tab.state = this.state;\n tab.newPassword = passwordInputField.value;\n tab.plainPassword = this.plainPassword;\n tab.open();\n };\n }\n\n attachClickEvent(btnContinue, onContinueClick);\n\n return monkey.load();\n }\n\n onOpenAfterTimeout() {\n if(!canFocus(this.isFirst)) return;\n this.passwordInputField.input.focus();\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 {AccountPassword} from '../../../../layer';\nimport {_i18n} from '../../../../lib/langPack';\nimport Button from '../../../button';\nimport PopupPeer from '../../../popups/peer';\nimport SettingSection from '../../../settingSection';\nimport {SliderSuperTab} from '../../../slider';\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\nimport AppSettingsTab from '../settings';\nimport AppTwoStepVerificationEmailTab from './email';\nimport AppTwoStepVerificationEnterPasswordTab from './enterPassword';\n\nexport default class AppTwoStepVerificationTab extends SliderSuperTab {\n public state: AccountPassword;\n public plainPassword: string;\n\n public init() {\n this.container.classList.add('two-step-verification', 'two-step-verification-main');\n this.setTitle('TwoStepVerificationTitle');\n\n const section = new SettingSection({\n captionOld: true,\n noDelimiter: true\n });\n\n const emoji = '๐Ÿ”';\n const stickerContainer = document.createElement('div');\n\n wrapStickerEmoji({\n div: stickerContainer,\n width: 168,\n height: 168,\n emoji\n });\n\n section.content.append(stickerContainer);\n\n const c = section.generateContentElement();\n if(this.state.pFlags.has_password) {\n _i18n(section.caption, 'TwoStepAuth.GenericHelp');\n\n const btnChangePassword = Button('btn-primary btn-transparent', {icon: 'edit', text: 'TwoStepAuth.ChangePassword'});\n const btnDisablePassword = Button('btn-primary btn-transparent', {icon: 'passwordoff', text: 'TwoStepAuth.RemovePassword'});\n const btnSetRecoveryEmail = Button('btn-primary btn-transparent', {icon: 'email', text: this.state.pFlags.has_recovery ? 'TwoStepAuth.ChangeEmail' : 'TwoStepAuth.SetupEmail'});\n\n attachClickEvent(btnChangePassword, () => {\n const tab = this.slider.createTab(AppTwoStepVerificationEnterPasswordTab);\n tab.state = this.state;\n tab.plainPassword = this.plainPassword;\n tab.open();\n });\n\n attachClickEvent(btnDisablePassword, () => {\n const popup = new PopupPeer('popup-disable-password', {\n buttons: [{\n langKey: 'Disable',\n callback: () => {\n this.managers.passwordManager.updateSettings({currentPassword: this.plainPassword}).then(() => {\n this.slider.sliceTabsUntilTab(AppSettingsTab, this);\n this.close();\n });\n },\n isDanger: true\n }],\n titleLangKey: 'TurnPasswordOffQuestionTitle',\n descriptionLangKey: 'TurnPasswordOffQuestion'\n });\n\n popup.show();\n });\n\n attachClickEvent(btnSetRecoveryEmail, () => {\n const tab = this.slider.createTab(AppTwoStepVerificationEmailTab);\n tab.state = this.state;\n tab.hint = this.state.hint;\n tab.plainPassword = this.plainPassword;\n tab.newPassword = this.plainPassword;\n tab.isFirst = true;\n tab.open();\n });\n\n c.append(btnChangePassword, btnDisablePassword, btnSetRecoveryEmail);\n } else {\n _i18n(section.caption, 'TwoStepAuth.SetPasswordHelp');\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const btnSetPassword = Button('btn-primary btn-color-primary', {text: 'TwoStepVerificationSetPassword'});\n\n inputWrapper.append(btnSetPassword);\n c.append(inputWrapper);\n\n attachClickEvent(btnSetPassword, (e) => {\n const tab = this.slider.createTab(AppTwoStepVerificationEnterPasswordTab);\n tab.state = this.state;\n tab.open();\n });\n }\n\n this.scrollable.container.append(section.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 {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {LangPackKey} from '../../../../lib/langPack';\n\nexport default class AppPrivacyLastSeenTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('privacy-tab', 'privacy-last-seen');\n this.setTitle('PrivacyLastSeen');\n\n const caption: LangPackKey = 'PrivacySettingsController.LastSeenDescription';\n new PrivacySection({\n tab: this,\n title: 'LastSeenTitle',\n inputKey: 'inputPrivacyKeyStatusTimestamp',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\n appendTo: this.scrollable,\n managers: this.managers\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 {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {LangPackKey} from '../../../../lib/langPack';\nimport PrivacyType from '../../../../lib/appManagers/utils/privacy/privacyType';\n\nexport default class AppPrivacyProfilePhotoTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('privacy-tab', 'privacy-profile-photo');\n this.setTitle('PrivacyProfilePhoto');\n\n const caption: LangPackKey = 'PrivacySettingsController.ProfilePhoto.CustomHelp';\n new PrivacySection({\n tab: this,\n title: 'PrivacyProfilePhotoTitle',\n inputKey: 'inputPrivacyKeyProfilePhoto',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\n appendTo: this.scrollable,\n skipTypes: [PrivacyType.Nobody],\n managers: this.managers\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 {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {LangPackKey} from '../../../../lib/langPack';\n\nexport default class AppPrivacyForwardMessagesTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('privacy-tab', 'privacy-forward-messages');\n this.setTitle('PrivacySettings.Forwards');\n\n const caption: LangPackKey = 'PrivacySettingsController.Forwards.CustomHelp';\n new PrivacySection({\n tab: this,\n title: 'PrivacyForwardsTitle',\n inputKey: 'inputPrivacyKeyForwards',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\n appendTo: this.scrollable,\n managers: this.managers\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 {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {LangPackKey} from '../../../../lib/langPack';\nimport PrivacyType from '../../../../lib/appManagers/utils/privacy/privacyType';\n\nexport default class AppPrivacyAddToGroupsTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('privacy-tab', 'privacy-add-to-groups');\n this.setTitle('PrivacySettings.Groups');\n\n const caption: LangPackKey = 'PrivacySettingsController.GroupDescription';\n new PrivacySection({\n tab: this,\n title: 'WhoCanAddMe',\n inputKey: 'inputPrivacyKeyChatInvite',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\n appendTo: this.scrollable,\n skipTypes: [PrivacyType.Nobody],\n managers: this.managers\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 {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {LangPackKey} from '../../../../lib/langPack';\n\nexport default class AppPrivacyCallsTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('privacy-tab', 'privacy-calls');\n this.setTitle('PrivacySettings.VoiceCalls');\n\n const caption: LangPackKey = 'PrivacySettingsController.PhoneCallDescription';\n new PrivacySection({\n tab: this,\n title: 'WhoCanCallMe',\n inputKey: 'inputPrivacyKeyPhoneCall',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\n appendTo: this.scrollable,\n managers: this.managers\n });\n\n {\n const caption: LangPackKey = 'PrivacySettingsController.P2p.Desc';\n new PrivacySection({\n tab: this,\n title: 'PrivacyP2PHeader',\n inputKey: 'inputPrivacyKeyPhoneP2P',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\n appendTo: this.scrollable,\n managers: this.managers\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 Button from '../../button';\nimport Row from '../../row';\nimport {Authorization} from '../../../layer';\nimport {formatDateAccordingToTodayNew} from '../../../helpers/date';\nimport {ButtonMenuSync} from '../../buttonMenu';\nimport {toast} from '../../toast';\nimport I18n from '../../../lib/langPack';\nimport PopupPeer from '../../popups/peer';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport findAndSplice from '../../../helpers/array/findAndSplice';\nimport {attachContextMenuListener} from '../../../helpers/dom/attachContextMenuListener';\nimport positionMenu from '../../../helpers/positionMenu';\nimport contextMenuController from '../../../helpers/contextMenuController';\nimport SettingSection from '../../settingSection';\n\nexport default class AppActiveSessionsTab extends SliderSuperTabEventable {\n public authorizations: Authorization.authorization[];\n private menuElement: HTMLElement;\n\n public init() {\n this.container.classList.add('active-sessions-container');\n this.setTitle('SessionsTitle');\n\n const Session = (auth: Authorization.authorization) => {\n const row = new Row({\n title: [auth.app_name, auth.app_version].join(' '),\n subtitle: [auth.ip, auth.country].join(' - '),\n clickable: true,\n titleRight: auth.pFlags.current ? undefined : formatDateAccordingToTodayNew(new Date(Math.max(auth.date_active, auth.date_created) * 1000))\n });\n\n row.container.dataset.hash = '' + auth.hash;\n\n row.midtitle.textContent = [auth.device_model, auth.system_version || auth.platform].filter(Boolean).join(', ');\n\n return row;\n };\n\n const authorizations = this.authorizations.slice();\n\n {\n const section = new SettingSection({\n name: 'CurrentSession',\n caption: 'ClearOtherSessionsHelp'\n });\n\n const auth = findAndSplice(authorizations, auth => auth.pFlags.current);\n const session = Session(auth);\n\n section.content.append(session.container);\n\n if(authorizations.length) {\n const btnTerminate = Button('btn-primary btn-transparent danger', {icon: 'stop', text: 'TerminateAllSessions'});\n attachClickEvent(btnTerminate, (e) => {\n new PopupPeer('revoke-session', {\n buttons: [{\n langKey: 'Terminate',\n isDanger: true,\n callback: () => {\n const toggle = toggleDisability([btnTerminate], true);\n this.managers.apiManager.invokeApi('auth.resetAuthorizations').then((value) => {\n // toggleDisability([btnTerminate], false);\n btnTerminate.remove();\n otherSection.container.remove();\n }, onError).finally(() => {\n toggle();\n });\n }\n }],\n titleLangKey: 'AreYouSureSessionsTitle',\n descriptionLangKey: 'AreYouSureSessions'\n }).show();\n }, {listenerSetter: this.listenerSetter});\n\n section.content.append(btnTerminate);\n }\n\n this.scrollable.append(section.container);\n }\n\n if(!authorizations.length) {\n return;\n }\n\n const otherSection = new SettingSection({\n name: 'OtherSessions',\n caption: 'SessionsListInfo'\n });\n\n authorizations.forEach((auth) => {\n otherSection.content.append(Session(auth).container);\n });\n\n this.scrollable.append(otherSection.container);\n\n const onError = (err: any) => {\n if(err.type === 'FRESH_RESET_AUTHORISATION_FORBIDDEN') {\n toast(I18n.format('RecentSessions.Error.FreshReset', true));\n }\n };\n\n let target: HTMLElement;\n const onTerminateClick = () => {\n const hash = target.dataset.hash;\n\n new PopupPeer('revoke-session', {\n buttons: [{\n langKey: 'Terminate',\n isDanger: true,\n callback: () => {\n this.managers.apiManager.invokeApi('account.resetAuthorization', {hash})\n .then((value) => {\n if(value) {\n target.remove();\n }\n }, onError);\n }\n }],\n titleLangKey: 'AreYouSureSessionTitle',\n descriptionLangKey: 'TerminateSessionText'\n }).show();\n };\n\n const element = this.menuElement = ButtonMenuSync({\n buttons: [{\n icon: 'stop',\n text: 'Terminate',\n onClick: onTerminateClick\n }]\n });\n element.id = 'active-sessions-contextmenu';\n element.classList.add('contextmenu');\n\n document.getElementById('page-chats').append(element);\n\n attachContextMenuListener({\n element: this.scrollable.container,\n callback: (e) => {\n target = findUpClassName(e.target, 'row');\n if(!target || target.dataset.hash === '0') {\n return;\n }\n\n if(e instanceof MouseEvent) e.preventDefault();\n // smth\n if(e instanceof MouseEvent) e.cancelBubble = true;\n\n positionMenu(e, element);\n contextMenuController.openBtnMenu(element);\n },\n listenerSetter: this.listenerSetter\n });\n\n attachClickEvent(this.scrollable.container, (e) => {\n target = findUpClassName(e.target, 'row');\n if(!target || target.dataset.hash === '0') {\n return;\n }\n\n onTerminateClick();\n }, {listenerSetter: this.listenerSetter});\n }\n\n onCloseAfterTimeout() {\n this.menuElement?.remove();\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 {SliderSuperTab} from '../../slider';\nimport {ButtonMenuSync} from '../../buttonMenu';\nimport appDialogsManager, {DIALOG_LIST_ELEMENT_TAG} from '../../../lib/appManagers/appDialogsManager';\nimport PopupPickUser from '../../popups/pickUser';\nimport rootScope from '../../../lib/rootScope';\nimport findUpTag from '../../../helpers/dom/findUpTag';\nimport ButtonCorner from '../../buttonCorner';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport formatUserPhone from '../../wrappers/formatUserPhone';\nimport getUserStatusString from '../../wrappers/getUserStatusString';\nimport {attachContextMenuListener} from '../../../helpers/dom/attachContextMenuListener';\nimport positionMenu from '../../../helpers/positionMenu';\nimport contextMenuController from '../../../helpers/contextMenuController';\nimport getPeerActiveUsernames from '../../../lib/appManagers/utils/peers/getPeerActiveUsernames';\nimport SettingSection from '../../settingSection';\n\nexport default class AppBlockedUsersTab extends SliderSuperTab {\n public peerIds: PeerId[];\n private menuElement: HTMLElement;\n\n public init() {\n this.container.classList.add('blocked-users-container');\n this.setTitle('BlockedUsers');\n\n const section = new SettingSection({\n caption: 'BlockedUsersInfo'\n });\n\n section.caption.parentElement.prepend(section.caption);\n\n this.scrollable.append(section.container);\n\n const btnAdd = ButtonCorner({icon: 'add', className: 'is-visible'});\n this.content.append(btnAdd);\n\n attachClickEvent(btnAdd, (e) => {\n new PopupPickUser({\n peerTypes: ['contacts'],\n placeholder: 'BlockModal.Search.Placeholder',\n onSelect: (peerId) => {\n // console.log('block', peerId);\n this.managers.appUsersManager.toggleBlock(peerId, true);\n }\n });\n }, {listenerSetter: this.listenerSetter});\n\n const list = appDialogsManager.createChatList();\n this.scrollable.container.classList.add('chatlist-container');\n section.content.append(list);\n\n const add = async(peerId: PeerId, append: boolean) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: list,\n rippleEnabled: true,\n avatarSize: 'abitbigger',\n append\n });\n\n const user = await this.managers.appUsersManager.getUser(peerId.toUserId());\n if(!user) {\n return;\n }\n\n const usernames = getPeerActiveUsernames(user);\n const username = usernames[0];\n if(user.pFlags.bot) {\n dom.lastMessageSpan.append('@' + username);\n } else {\n if(user.phone) dom.lastMessageSpan.innerHTML = formatUserPhone(user.phone);\n else dom.lastMessageSpan.append(username ? '@' + username : getUserStatusString(user));\n }\n\n // dom.titleSpan.innerHTML = 'Raaid El Syed';\n // dom.lastMessageSpan.innerHTML = '+1 234 567891';\n };\n\n for(const peerId of this.peerIds) {\n add(peerId, true);\n }\n\n let target: HTMLElement;\n const onUnblock = () => {\n const peerId = target.dataset.peerId.toPeerId();\n this.managers.appUsersManager.toggleBlock(peerId, false);\n };\n\n const element = this.menuElement = ButtonMenuSync({\n buttons: [{\n icon: 'lockoff',\n text: 'Unblock',\n onClick: onUnblock,\n options: {listenerSetter: this.listenerSetter}\n }]\n });\n element.id = 'blocked-users-contextmenu';\n element.classList.add('contextmenu');\n\n document.getElementById('page-chats').append(element);\n\n attachContextMenuListener({\n element: this.scrollable.container,\n callback: (e) => {\n target = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\n if(!target) {\n return;\n }\n\n if(e instanceof MouseEvent) e.preventDefault();\n // smth\n if(e instanceof MouseEvent) e.cancelBubble = true;\n\n positionMenu(e, element);\n contextMenuController.openBtnMenu(element);\n },\n listenerSetter: this.listenerSetter\n });\n\n this.listenerSetter.add(rootScope)('peer_block', (update) => {\n const {peerId, blocked} = update;\n const li = list.querySelector(`[data-peer-id=\"${peerId}\"]`);\n if(blocked) {\n if(!li) {\n add(peerId, false);\n }\n } else {\n if(li) {\n li.remove();\n }\n }\n });\n\n const LOAD_COUNT = 50;\n let loading = false;\n this.scrollable.onScrolledBottom = () => {\n if(loading) {\n return;\n }\n\n loading = true;\n this.managers.appUsersManager.getBlocked(list.childElementCount, LOAD_COUNT).then((res) => {\n for(const peerId of res.peerIds) {\n add(peerId, true);\n }\n\n if(res.peerIds.length < LOAD_COUNT || list.childElementCount === res.count) {\n this.scrollable.onScrolledBottom = null;\n }\n\n this.scrollable.checkForTriggers();\n }).finally(() => {\n loading = false;\n });\n };\n }\n\n onOpenAfterTimeout() {\n this.scrollable.onScroll();\n }\n\n onCloseAfterTimeout() {\n if(this.menuElement) {\n this.menuElement.remove();\n }\n\n return super.onCloseAfterTimeout();\n }\n}\n","export default function convertKeyToInputKey(key: string) {\n key = key[0].toUpperCase() + key.slice(1);\n key = 'input' + key;\n return key;\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 {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {LangPackKey} from '../../../../lib/langPack';\n\nexport default class AppPrivacyVoicesTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('privacy-tab', 'privacy-voices');\n this.setTitle('PrivacyVoiceMessages');\n\n const caption: LangPackKey = 'PrivacyVoiceMessagesInfo';\n new PrivacySection({\n tab: this,\n title: 'PrivacyVoiceMessagesTitle',\n inputKey: 'inputPrivacyKeyVoiceMessages',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\n appendTo: this.scrollable,\n managers: this.managers\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 {formatDateAccordingToTodayNew} from '../../../helpers/date';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport {WebAuthorization} from '../../../layer';\nimport AvatarElement from '../../avatar';\nimport Button from '../../button';\nimport confirmationPopup from '../../confirmationPopup';\nimport Row from '../../row';\nimport SettingSection from '../../settingSection';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport wrapPeerTitle from '../../wrappers/peerTitle';\n\nexport default class AppActiveWebSessionsTab extends SliderSuperTabEventable {\n public async init(sessions: WebAuthorization[]) {\n this.container.classList.add('active-sessions-container');\n this.setTitle('WebSessionsTitle');\n\n const Session = async(auth: WebAuthorization) => {\n const peerId = auth.bot_id.toPeerId();\n const row = new Row({\n title: await wrapPeerTitle({peerId}),\n subtitle: [auth.ip, auth.region].join(' - '),\n clickable: true,\n titleRight: formatDateAccordingToTodayNew(new Date(Math.max(auth.date_active, auth.date_created) * 1000))\n });\n\n const media = row.createMedia('big');\n const avatar = new AvatarElement();\n avatar.classList.add('avatar-48');\n await avatar.updateWithOptions({peerId});\n media.append(avatar);\n\n row.container.dataset.hash = '' + auth.hash;\n row.container.dataset.peerId = '' + peerId;\n\n row.midtitle.textContent = [auth.domain, auth.browser, auth.platform].filter(Boolean).join(', ');\n\n return row;\n };\n\n {\n const section = new SettingSection({\n caption: 'ClearOtherWebSessionsHelp'\n });\n\n const btnTerminate = Button('btn-primary btn-transparent danger', {icon: 'stop', text: 'TerminateAllWebSessions'});\n\n attachClickEvent(btnTerminate, async() => {\n await confirmationPopup({\n descriptionLangKey: 'AreYouSureWebSessions',\n button: {\n langKey: 'Disconnect',\n isDanger: true\n }\n });\n\n const toggle = toggleDisability([btnTerminate], true);\n this.managers.appSeamlessLoginManager.resetWebAuthorizations().then(() => {\n this.close();\n });\n }, {listenerSetter: this.listenerSetter});\n\n section.content.append(btnTerminate);\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({\n name: 'OtherWebSessions',\n caption: 'TerminateWebSessionInfo'\n });\n\n const rows = await Promise.all(sessions.map(Session));\n section.content.append(...rows.map((row) => row.container));\n\n let leftLength = rows.length;\n attachClickEvent(section.content, async(e) => {\n const row = findUpClassName(e.target, 'row');\n if(!row) {\n return;\n }\n\n await confirmationPopup({\n descriptionLangKey: 'TerminateWebSessionText',\n descriptionLangArgs: [await wrapPeerTitle({peerId: row.dataset.peerId.toPeerId()})],\n button: {\n langKey: 'Disconnect',\n isDanger: true\n }\n });\n\n const hash = row.dataset.hash;\n row.classList.add('is-disabled');\n this.managers.appSeamlessLoginManager.resetWebAuthorization(hash).then(() => {\n if(!--leftLength) {\n this.close();\n } else {\n row.remove();\n }\n });\n }, {listenerSetter: this.listenerSetter});\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 SliderSuperTab, {SliderSuperTabEventable} from '../../sliderTab';\nimport Row from '../../row';\nimport {AccountPassword, Authorization, InputPrivacyKey, Updates, WebAuthorization} from '../../../layer';\nimport AppPrivacyPhoneNumberTab from './privacy/phoneNumber';\nimport AppTwoStepVerificationTab from './2fa';\nimport AppTwoStepVerificationEnterPasswordTab from './2fa/enterPassword';\nimport AppTwoStepVerificationEmailConfirmationTab from './2fa/emailConfirmation';\nimport AppPrivacyLastSeenTab from './privacy/lastSeen';\nimport AppPrivacyProfilePhotoTab from './privacy/profilePhoto';\nimport AppPrivacyForwardMessagesTab from './privacy/forwardMessages';\nimport AppPrivacyAddToGroupsTab from './privacy/addToGroups';\nimport AppPrivacyCallsTab from './privacy/calls';\nimport AppActiveSessionsTab from './activeSessions';\nimport AppBlockedUsersTab from './blockedUsers';\nimport rootScope from '../../../lib/rootScope';\nimport {i18n, LangPackKey, _i18n} from '../../../lib/langPack';\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport CheckboxField from '../../checkboxField';\nimport PopupPeer from '../../popups/peer';\nimport Button from '../../button';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport convertKeyToInputKey from '../../../helpers/string/convertKeyToInputKey';\nimport getPrivacyRulesDetails from '../../../lib/appManagers/utils/privacy/getPrivacyRulesDetails';\nimport PrivacyType from '../../../lib/appManagers/utils/privacy/privacyType';\nimport confirmationPopup, {PopupConfirmationOptions} from '../../confirmationPopup';\nimport noop from '../../../helpers/noop';\nimport {toastNew} from '../../toast';\nimport AppPrivacyVoicesTab from './privacy/voices';\nimport SettingSection from '../../settingSection';\nimport AppActiveWebSessionsTab from './activeWebSessions';\n\nexport default class AppPrivacyAndSecurityTab extends SliderSuperTabEventable {\n private activeSessionsRow: Row;\n private authorizations: Authorization.authorization[];\n\n private websitesRow: Row;\n private websites: WebAuthorization[];\n\n public static getInitArgs(fromTab: SliderSuperTab) {\n return {\n appConfig: fromTab.managers.apiManager.getAppConfig(),\n globalPrivacy: fromTab.managers.appPrivacyManager.getGlobalPrivacySettings(),\n contentSettings: fromTab.managers.apiManager.invokeApi('account.getContentSettings'),\n webAuthorizations: fromTab.managers.appSeamlessLoginManager.getWebAuthorizations()\n };\n }\n\n public init(p: ReturnType) {\n this.container.classList.add('dont-u-dare-block-me');\n this.setTitle('PrivacySettings');\n\n const SUBTITLE: LangPackKey = 'Loading';\n const promises: Promise[] = [];\n\n {\n const section = new SettingSection({noDelimiter: true, caption: 'SessionsInfo'});\n\n let blockedPeerIds: PeerId[];\n const blockedUsersRow = new Row({\n icon: 'deleteuser',\n titleLangKey: 'BlockedUsers',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n const tab = this.slider.createTab(AppBlockedUsersTab);\n tab.peerIds = blockedPeerIds;\n tab.open();\n },\n listenerSetter: this.listenerSetter\n });\n blockedUsersRow.freezed = true;\n\n let passwordState: AccountPassword;\n const twoFactorRowOptions = {\n icon: 'lock',\n titleLangKey: 'TwoStepVerification' as LangPackKey,\n subtitleLangKey: SUBTITLE,\n clickable: (e: Event) => {\n let tab: AppTwoStepVerificationTab | AppTwoStepVerificationEnterPasswordTab | AppTwoStepVerificationEmailConfirmationTab;\n if(passwordState.pFlags.has_password) {\n tab = this.slider.createTab(AppTwoStepVerificationEnterPasswordTab);\n } else if(passwordState.email_unconfirmed_pattern) {\n tab = this.slider.createTab(AppTwoStepVerificationEmailConfirmationTab);\n tab.email = passwordState.email_unconfirmed_pattern;\n tab.length = 6;\n tab.isFirst = true;\n this.managers.passwordManager.resendPasswordEmail();\n } else {\n tab = this.slider.createTab(AppTwoStepVerificationTab);\n }\n\n tab.state = passwordState;\n tab.open();\n },\n listenerSetter: this.listenerSetter\n };\n\n const twoFactorRow = new Row(twoFactorRowOptions);\n twoFactorRow.freezed = true;\n\n const activeSessionsRow = this.activeSessionsRow = new Row({\n icon: 'activesessions',\n titleLangKey: 'SessionsTitle',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n const tab = this.slider.createTab(AppActiveSessionsTab);\n tab.authorizations = this.authorizations;\n tab.eventListener.addEventListener('destroy', () => {\n this.updateActiveSessions();\n }, {once: true});\n tab.open();\n },\n listenerSetter: this.listenerSetter\n });\n activeSessionsRow.freezed = true;\n\n const websitesRow = this.websitesRow = new Row({\n icon: 'mention',\n titleLangKey: 'OtherWebSessions',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n const tab = this.slider.createTab(AppActiveWebSessionsTab);\n tab.eventListener.addEventListener('destroy', () => {\n this.updateActiveWebsites();\n });\n tab.open(this.websites);\n },\n listenerSetter: this.listenerSetter\n });\n websitesRow.freezed = true;\n\n section.content.append(blockedUsersRow.container, twoFactorRow.container, activeSessionsRow.container, websitesRow.container);\n this.scrollable.append(section.container);\n\n const setBlockedCount = (count: number) => {\n if(count) {\n replaceContent(blockedUsersRow.subtitle, i18n('PrivacySettingsController.UserCount', [count]));\n } else {\n replaceContent(blockedUsersRow.subtitle, i18n('BlockedEmpty', [count]));\n }\n };\n\n this.listenerSetter.add(rootScope)('peer_block', () => {\n /* const {blocked, peerId} = update;\n if(!blocked) blockedPeerIds.findAndSplice((p) => p === peerId);\n else blockedPeerIds.unshift(peerId);\n blockedCount += blocked ? 1 : -1;\n setBlockedCount(blockedCount); */\n updateBlocked();\n });\n\n const updateBlocked = () => {\n this.managers.appUsersManager.getBlocked().then((res) => {\n blockedUsersRow.freezed = false;\n setBlockedCount(res.count);\n blockedPeerIds = res.peerIds;\n });\n };\n\n updateBlocked();\n\n this.managers.passwordManager.getState().then((state) => {\n passwordState = state;\n replaceContent(twoFactorRow.subtitle, i18n(state.pFlags.has_password ? 'PrivacyAndSecurity.Item.On' : 'PrivacyAndSecurity.Item.Off'));\n twoFactorRow.freezed = false;\n\n // console.log('password state', state);\n });\n\n this.updateActiveSessions();\n promises.push(this.updateActiveWebsites(p.webAuthorizations));\n }\n\n {\n const section = new SettingSection({name: 'PrivacyTitle', caption: 'GroupsAndChannelsHelp'});\n\n section.content.classList.add('privacy-navigation-container');\n\n const rowsByKeys: Partial<{\n [key in InputPrivacyKey['_']]: Row\n }> = {};\n\n const numberVisibilityRow = rowsByKeys['inputPrivacyKeyPhoneNumber'] = new Row({\n titleLangKey: 'PrivacyPhoneTitle',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n this.slider.createTab(AppPrivacyPhoneNumberTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const lastSeenTimeRow = rowsByKeys['inputPrivacyKeyStatusTimestamp'] = new Row({\n titleLangKey: 'LastSeenTitle',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n this.slider.createTab(AppPrivacyLastSeenTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const photoVisibilityRow = rowsByKeys['inputPrivacyKeyProfilePhoto'] = new Row({\n titleLangKey: 'PrivacyProfilePhotoTitle',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n this.slider.createTab(AppPrivacyProfilePhotoTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const callRow = rowsByKeys['inputPrivacyKeyPhoneCall'] = new Row({\n titleLangKey: 'WhoCanCallMe',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n this.slider.createTab(AppPrivacyCallsTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const linkAccountRow = rowsByKeys['inputPrivacyKeyForwards'] = new Row({\n titleLangKey: 'PrivacyForwardsTitle',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n this.slider.createTab(AppPrivacyForwardMessagesTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const groupChatsAddRow = rowsByKeys['inputPrivacyKeyChatInvite'] = new Row({\n titleLangKey: 'WhoCanAddMe',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n this.slider.createTab(AppPrivacyAddToGroupsTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const voicesRow = rowsByKeys['inputPrivacyKeyVoiceMessages'] = new Row({\n titleLangKey: 'PrivacyVoiceMessagesTitle',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n if(!rootScope.premium) {\n toastNew({langPackKey: 'PrivacyVoiceMessagesPremiumOnly'});\n } else {\n this.slider.createTab(AppPrivacyVoicesTab).open();\n }\n },\n listenerSetter: this.listenerSetter\n });\n\n const updatePrivacyRow = (key: InputPrivacyKey['_']) => {\n const row = rowsByKeys[key];\n if(!row) {\n return;\n }\n\n this.managers.appPrivacyManager.getPrivacy(key).then((rules) => {\n const details = getPrivacyRulesDetails(rules);\n const langKey = details.type === PrivacyType.Everybody ? 'PrivacySettingsController.Everbody' : (details.type === PrivacyType.Contacts ? 'PrivacySettingsController.MyContacts' : 'PrivacySettingsController.Nobody');\n const disallowLength = details.disallowPeers.users.length + details.disallowPeers.chats.length;\n const allowLength = details.allowPeers.users.length + details.allowPeers.chats.length;\n\n row.subtitle.innerHTML = '';\n const s = i18n(langKey);\n row.subtitle.append(s);\n if(disallowLength || allowLength) {\n row.subtitle.append(` (${[-disallowLength, allowLength ? '+' + allowLength : 0].filter(Boolean).join(', ')})`);\n }\n });\n };\n\n section.content.append(\n numberVisibilityRow.container,\n lastSeenTimeRow.container,\n photoVisibilityRow.container,\n callRow.container,\n linkAccountRow.container,\n groupChatsAddRow.container,\n voicesRow.container\n );\n this.scrollable.append(section.container);\n\n for(const key in rowsByKeys) {\n updatePrivacyRow(key as keyof typeof rowsByKeys);\n }\n\n rootScope.addEventListener('privacy_update', (update) => {\n updatePrivacyRow(convertKeyToInputKey(update.key._) as any);\n });\n }\n\n {\n const section = new SettingSection({name: 'NewChatsFromNonContacts', caption: 'ArchiveAndMuteInfo'});\n\n const checkboxField = new CheckboxField({text: 'ArchiveAndMute'});\n const row = new Row({\n checkboxField\n });\n\n section.content.append(row.container);\n\n let enabled: boolean, destroyed: boolean;\n this.eventListener.addEventListener('destroy', () => {\n destroyed = true;\n if(enabled === undefined || enabled === checkboxField.checked) return;\n return this.managers.appPrivacyManager.setGlobalPrivacySettings({\n _: 'globalPrivacySettings',\n archive_and_mute_new_noncontact_peers: checkboxField.checked\n });\n }, {once: true});\n\n const promise = Promise.all([\n p.appConfig,\n p.globalPrivacy\n ]).then(([appConfig, settings]) => {\n if(destroyed) {\n return;\n }\n\n const onPremiumToggle = (isPremium: boolean) => {\n section.container.classList.toggle('hide', !isPremium && !appConfig.autoarchive_setting_available);\n };\n\n this.listenerSetter.add(rootScope)('premium_toggle', onPremiumToggle);\n onPremiumToggle(rootScope.premium);\n\n enabled = !!settings.archive_and_mute_new_noncontact_peers;\n\n checkboxField.setValueSilently(enabled);\n });\n\n promises.push(promise);\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({name: 'Privacy.SensitiveContent', caption: 'PrivacyAndSecurity.SensitiveDesc'});\n section.container.classList.add('hide');\n\n const checkboxField = new CheckboxField({text: 'PrivacyAndSecurity.SensitiveText'});\n const row = new Row({\n checkboxField\n });\n\n section.content.append(row.container);\n\n let enabled: boolean;\n this.eventListener.addEventListener('destroy', () => {\n if(enabled === undefined) return;\n const _enabled = row.checkboxField.checked;\n const isChanged = _enabled !== enabled;\n if(!isChanged) {\n return;\n }\n\n return this.managers.apiManager.invokeApi('account.setContentSettings', {\n sensitive_enabled: _enabled\n });\n }, {once: true});\n\n const promise = p.contentSettings.then((settings) => {\n if(!settings.pFlags.sensitive_can_change) {\n return;\n }\n\n enabled = !!settings.pFlags.sensitive_enabled;\n checkboxField.setValueSilently(enabled);\n section.container.classList.remove('hide');\n });\n\n promises.push(promise);\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({name: 'PrivacyPayments', caption: 'PrivacyPaymentsClearInfo'});\n\n const onClearClick = () => {\n const options: PopupConfirmationOptions = {\n titleLangKey: 'PrivacyPaymentsClearAlertTitle',\n descriptionLangKey: 'PrivacyPaymentsClearAlertText',\n button: {\n langKey: 'Clear'\n },\n checkboxes: [{\n text: 'PrivacyClearShipping',\n checked: true\n }, {\n text: 'PrivacyClearPayment',\n checked: true\n }]\n };\n\n confirmationPopup(options).then(() => {\n const [info, payment] = options.checkboxes.map((c) => c.checkboxField.checked);\n const toggle = toggleDisability([clearButton], true);\n this.managers.appPaymentsManager.clearSavedInfo(info, payment).then(() => {\n if(!info && !payment) {\n return;\n }\n\n toggle();\n toastNew({\n langPackKey: info && payment ? 'PrivacyPaymentsPaymentShippingCleared' : (info ? 'PrivacyPaymentsShippingInfoCleared' : 'PrivacyPaymentsPaymentInfoCleared')\n });\n });\n }, noop);\n };\n\n const clearButton = Button('btn-primary btn-transparent', {icon: 'delete', text: 'PrivacyPaymentsClear'});\n this.listenerSetter.add(clearButton)('click', onClearClick);\n section.content.append(clearButton);\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({name: 'FilterChats'});\n\n const onDeleteClick = () => {\n const popup = new PopupPeer('popup-delete-drafts', {\n buttons: [{\n langKey: 'Delete',\n callback: () => {\n const toggle = toggleDisability([deleteButton], true);\n this.managers.appDraftsManager.clearAllDrafts().then(() => {\n toggle();\n });\n },\n isDanger: true\n }],\n titleLangKey: 'AreYouSureClearDraftsTitle',\n descriptionLangKey: 'AreYouSureClearDrafts'\n });\n\n popup.show();\n };\n\n const deleteButton = Button('btn-primary btn-transparent', {icon: 'delete', text: 'PrivacyDeleteCloudDrafts'});\n this.listenerSetter.add(deleteButton)('click', onDeleteClick);\n section.content.append(deleteButton);\n\n /* promises.push(apiManager.invokeApi('messages.getAllDrafts').then((drafts) => {\n const draftsRow = new Row({\n titleLangKey: 'PrivacyDeleteCloudDrafts',\n subtitleLangKey: 'Drafts',\n subtitleLangArgs: [(drafts as Updates.updates).updates.length],\n icon: 'delete',\n clickable: onDeleteClick\n });\n\n section.content.append(draftsRow.container);\n })); */\n\n this.scrollable.append(section.container);\n }\n\n // {\n // const section = new SettingSection({\n // name: 'OtherWebSessions'\n // });\n\n // const row = new Row({\n\n // });\n\n // this.scrollable.append(section.container);\n // }\n\n return Promise.all(promises);\n }\n\n public updateActiveSessions() {\n return this.managers.apiManager.invokeApi('account.getAuthorizations').then((auths) => {\n this.activeSessionsRow.freezed = false;\n this.authorizations = auths.authorizations;\n _i18n(this.activeSessionsRow.subtitle, 'Privacy.Devices', [this.authorizations.length]);\n });\n }\n\n public updateActiveWebsites(promise = this.managers.appSeamlessLoginManager.getWebAuthorizations()) {\n return promise.then((authorizations) => {\n this.websitesRow.freezed = false;\n this.websites = authorizations;\n _i18n(this.websitesRow.subtitle, 'Privacy.Websites', [this.websites.length]);\n this.websitesRow.container.classList.toggle('hide', !this.websites.length);\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 {AvailableReaction} from '../../../layer';\nimport RadioField from '../../radioField';\nimport Row, {RadioFormFromRows} from '../../row';\nimport SettingSection from '../../settingSection';\nimport SliderSuperTab from '../../sliderTab';\nimport wrapStickerToRow from '../../wrappers/stickerToRow';\n\nexport default class AppQuickReactionTab extends SliderSuperTab {\n public init() {\n this.setTitle('DoubleTapSetting');\n this.container.classList.add('quick-reaction-container');\n\n return Promise.all([\n this.managers.appReactionsManager.getQuickReaction(),\n this.managers.appReactionsManager.getAvailableReactions()\n ]).then(([quickReaction, availableReactions]) => {\n availableReactions = availableReactions.filter((reaction) => !reaction.pFlags.inactive);\n\n const section = new SettingSection();\n\n const name = 'quick-reaction';\n const rows = availableReactions.map((availableReaction) => {\n const radioField = new RadioField({\n name,\n text: availableReaction.title,\n value: availableReaction.reaction,\n alignRight: true\n });\n\n const row = new Row({\n radioField,\n havePadding: true\n });\n\n radioField.main.classList.add('quick-reaction-title');\n\n wrapStickerToRow({\n row,\n doc: availableReaction.static_icon,\n size: 'small'\n });\n\n if(availableReaction.reaction === (quickReaction as AvailableReaction).reaction) {\n radioField.setValueSilently(true);\n }\n\n return row;\n });\n\n const form = RadioFormFromRows(rows, (value) => {\n this.managers.appReactionsManager.setDefaultReaction({_: 'reactionEmoji', emoticon: value});\n });\n\n section.content.append(form);\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 RangeSelector from '../../rangeSelector';\nimport Button from '../../button';\nimport CheckboxField from '../../checkboxField';\nimport RadioField from '../../radioField';\nimport rootScope from '../../../lib/rootScope';\nimport {IS_APPLE, IS_SAFARI} from '../../../environment/userAgent';\nimport Row, {CreateRowFromCheckboxField} from '../../row';\nimport AppBackgroundTab from './background';\nimport {LangPackKey, _i18n} from '../../../lib/langPack';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport assumeType from '../../../helpers/assumeType';\nimport {BaseTheme, MessagesAllStickers, StickerSet} from '../../../layer';\nimport LazyLoadQueue from '../../lazyLoadQueue';\nimport PopupStickers from '../../popups/stickers';\nimport eachMinute from '../../../helpers/eachMinute';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport IS_GEOLOCATION_SUPPORTED from '../../../environment/geolocationSupport';\nimport AppQuickReactionTab from './quickReaction';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport {DEFAULT_THEME, State} from '../../../config/state';\nimport wrapStickerSetThumb from '../../wrappers/stickerSetThumb';\nimport wrapStickerToRow from '../../wrappers/stickerToRow';\nimport SettingSection, {generateSection} from '../../settingSection';\nimport {ScrollableX} from '../../scrollable';\nimport wrapStickerEmoji from '../../wrappers/stickerEmoji';\nimport {Theme} from '../../../layer';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport RLottiePlayer from '../../../lib/rlottie/rlottiePlayer';\nimport themeController from '../../../helpers/themeController';\n\nexport class RangeSettingSelector {\n public container: HTMLDivElement;\n public valueContainer: HTMLElement;\n private range: RangeSelector;\n\n public onChange: (value: number) => void;\n\n constructor(\n name: LangPackKey,\n step: number,\n initialValue: number,\n minValue: number,\n maxValue: number,\n writeValue = true\n ) {\n const BASE_CLASS = 'range-setting-selector';\n this.container = document.createElement('div');\n this.container.classList.add(BASE_CLASS);\n\n const details = document.createElement('div');\n details.classList.add(BASE_CLASS + '-details');\n\n const nameDiv = document.createElement('div');\n nameDiv.classList.add(BASE_CLASS + '-name');\n _i18n(nameDiv, name);\n\n const valueDiv = this.valueContainer = document.createElement('div');\n valueDiv.classList.add(BASE_CLASS + '-value');\n\n if(writeValue) {\n valueDiv.innerHTML = '' + initialValue;\n }\n\n details.append(nameDiv, valueDiv);\n\n this.range = new RangeSelector({\n step,\n min: minValue,\n max: maxValue\n }, initialValue);\n this.range.setListeners();\n this.range.setHandlers({\n onScrub: value => {\n if(this.onChange) {\n this.onChange(value);\n }\n\n if(writeValue) {\n // console.log('font size scrub:', value);\n valueDiv.innerText = '' + value;\n }\n }\n });\n\n this.container.append(details, this.range.container);\n }\n}\n\nexport default class AppGeneralSettingsTab extends SliderSuperTabEventable {\n public static getInitArgs() {\n return {\n themes: rootScope.managers.appThemesManager.getThemes(),\n allStickers: rootScope.managers.appStickersManager.getAllStickers(),\n quickReaction: rootScope.managers.appReactionsManager.getQuickReaction()\n };\n }\n\n public init(p: ReturnType) {\n this.container.classList.add('general-settings-container');\n this.setTitle('General');\n\n const section = generateSection.bind(null, this.scrollable);\n const promises: Promise[] = [];\n\n {\n const container = section('Settings');\n\n const range = new RangeSettingSelector('TextSize', 1, rootScope.settings.messagesTextSize, 12, 20);\n range.onChange = (value) => {\n rootScope.managers.appStateManager.setByKey('settings.messagesTextSize', value);\n };\n\n const chatBackgroundButton = Button('btn-primary btn-transparent', {icon: 'image', text: 'ChatBackground'});\n\n const initArgs = AppBackgroundTab.getInitArgs();\n attachClickEvent(chatBackgroundButton, () => {\n this.slider.createTab(AppBackgroundTab).open(initArgs);\n });\n\n const animationsCheckboxField = new CheckboxField({\n text: 'EnableAnimations',\n name: 'animations',\n stateKey: 'settings.animationsEnabled',\n listenerSetter: this.listenerSetter\n });\n\n container.append(\n range.container,\n chatBackgroundButton,\n CreateRowFromCheckboxField(animationsCheckboxField).container\n );\n }\n\n {\n const container = section('ColorTheme');\n\n const scrollable = new ScrollableX(null);\n const themesContainer = scrollable.container;\n themesContainer.classList.add('themes-container');\n\n type K = {\n container: HTMLElement,\n theme: Theme,\n player?: RLottiePlayer,\n wallPaperContainers?: {[key in BaseTheme['_']]?: HTMLElement}\n };\n const themesMap = new Map();\n let currentTheme = themeController.getTheme();\n let isNight = themeController.isNight();\n\n const applyThemeOnItem = (item: K) => {\n themeController.applyTheme(item.theme, item.container);\n\n const previous = item.container.querySelector('.background-item');\n previous?.remove();\n\n const wallPaperContainer = item.wallPaperContainers[isNight ? 'baseThemeNight' : 'baseThemeClassic']\n if(wallPaperContainer) {\n item.container.prepend(wallPaperContainer);\n }\n };\n\n let lastOnFrameNo: (frameNo: number) => void;\n\n attachClickEvent(themesContainer, async(e) => {\n const container = findUpClassName(e.target, 'theme-container');\n if(!container) {\n return;\n }\n\n const lastActive = themesContainer.querySelector('.active');\n if(lastActive) {\n lastActive.classList.remove('active');\n }\n\n const item = themesMap.get(container);\n container.classList.add('active');\n\n await themeController.applyNewTheme(item.theme);\n\n lastOnFrameNo?.(-1);\n\n if(item.player && rootScope.settings.animationsEnabled) {\n if(IS_SAFARI) {\n if(item.player.paused) {\n item.player.restart();\n }\n } else {\n if(item.player.paused) {\n item.player.stop(true);\n }\n\n item.player.el[0].style.transform = 'scale(2)';\n\n const onFrameNo = lastOnFrameNo = (frameNo) => {\n if(item.player.maxFrame === frameNo || frameNo === -1) {\n item.player.el[0].style.transform = '';\n item.player.removeEventListener('enterFrame', onFrameNo);\n\n if(lastOnFrameNo === onFrameNo) {\n lastOnFrameNo = undefined;\n }\n }\n };\n\n setTimeout(() => {\n if(lastOnFrameNo !== onFrameNo) {\n return;\n }\n\n item.player.play();\n item.player.addEventListener('enterFrame', onFrameNo);\n }, 250);\n }\n }\n }, {listenerSetter: this.listenerSetter});\n\n const availableBaseThemes: Set = new Set(['baseThemeClassic', 'baseThemeNight']);\n\n const promise = p.themes.then(async(themes) => {\n const defaultThemes = themes.filter((theme) => theme.pFlags.default/* && theme.settings[0].message_colors.length === 1 */);\n defaultThemes.unshift(DEFAULT_THEME);\n\n const promises = defaultThemes.map(async(theme) => {\n const container = document.createElement('div');\n const k: K = {\n container,\n theme,\n wallPaperContainers: {}\n };\n\n const results = theme.settings\n .filter((themeSettings) => availableBaseThemes.has(themeSettings.base_theme._))\n .map((themeSettings) => {\n const wallPaper = themeSettings.wallpaper;\n const result = AppBackgroundTab.addWallPaper(wallPaper);\n k.wallPaperContainers[themeSettings.base_theme._] = result.container;\n return result;\n });\n\n themesMap.set(container, k);\n\n applyThemeOnItem(k);\n\n if(theme.id === currentTheme.id) {\n container.classList.add('active');\n }\n\n const emoticon = theme.emoticon;\n const loadPromises: Promise[] = [];\n let emoticonContainer: HTMLElement;\n if(emoticon) {\n emoticonContainer = document.createElement('div');\n emoticonContainer.classList.add('theme-emoticon');\n const size = 28 * 1.75;\n wrapStickerEmoji({\n div: emoticonContainer,\n width: size,\n height: size,\n emoji: theme.emoticon,\n managers: this.managers,\n loadPromises,\n middleware: this.middlewareHelper.get(),\n play: false\n }).then(({render}) => render).then((player) => {\n k.player = player as RLottiePlayer;\n });\n }\n\n const bubble = document.createElement('div');\n bubble.classList.add('theme-bubble');\n\n const bubbleIn = bubble.cloneNode() as HTMLElement;\n\n bubbleIn.classList.add('is-in');\n bubble.classList.add('is-out');\n\n loadPromises.push(...results.map((result) => result.loadPromise));\n\n container.classList.add('theme-container');\n\n await Promise.all(loadPromises);\n\n if(emoticonContainer) {\n container.append(emoticonContainer);\n }\n\n container.append(bubbleIn, bubble);\n\n return container;\n });\n\n const containers = await Promise.all(promises);\n\n scrollable.append(...containers);\n });\n\n promises.push(promise);\n\n const form = document.createElement('form');\n form.style.marginTop = '.5rem';\n\n const name = 'theme';\n const stateKey = 'settings.theme';\n\n const dayRow = new Row({\n radioField: new RadioField({\n langKey: 'ThemeDay',\n name,\n value: 'day',\n stateKey\n })\n });\n\n const nightRow = new Row({\n radioField: new RadioField({\n langKey: 'ThemeNight',\n name,\n value: 'night',\n stateKey\n })\n });\n\n const systemRow = new Row({\n radioField: new RadioField({\n langKey: 'AutoNightSystemDefault',\n name,\n value: 'system',\n stateKey\n })\n });\n\n this.listenerSetter.add(rootScope)('settings_updated', ({key, value, settings}) => {\n if(key === stateKey) {\n rootScope.dispatchEvent('theme_change');\n }\n });\n\n this.listenerSetter.add(rootScope)('theme_change', () => {\n currentTheme = themeController.getTheme();\n const newIsNight = themeController.isNight();\n if(isNight === newIsNight) {\n return;\n }\n\n isNight = newIsNight;\n\n const lastActive = themesContainer.querySelector('.active');\n if(lastActive) {\n lastActive.classList.remove('active');\n }\n\n let active: HTMLElement;\n themesMap.forEach((item) => {\n applyThemeOnItem(item);\n\n if(item.theme.id === currentTheme.id) {\n item.container.classList.add('active');\n active = item.container;\n }\n });\n\n if(active) {\n scrollable.scrollIntoViewNew({\n element: active,\n position: 'center',\n axis: 'x'\n });\n }\n });\n\n form.append(dayRow.container, nightRow.container, systemRow.container);\n\n container.append(\n themesContainer,\n form\n );\n }\n\n {\n const container = section('General.Keyboard');\n\n const form = document.createElement('form');\n\n const name = 'send-shortcut';\n const stateKey = 'settings.sendShortcut';\n\n const enterRow = new Row({\n radioField: new RadioField({\n langKey: 'General.SendShortcut.Enter',\n name,\n value: 'enter',\n stateKey\n }),\n subtitleLangKey: 'General.SendShortcut.NewLine.ShiftEnter'\n });\n\n const ctrlEnterRow = new Row({\n radioField: new RadioField({\n name,\n value: 'ctrlEnter',\n stateKey\n }),\n subtitleLangKey: 'General.SendShortcut.NewLine.Enter'\n });\n _i18n(ctrlEnterRow.radioField.main, 'General.SendShortcut.CtrlEnter', [IS_APPLE ? 'โŒ˜' : 'Ctrl']);\n\n form.append(enterRow.container, ctrlEnterRow.container);\n container.append(form);\n }\n\n if(IS_GEOLOCATION_SUPPORTED) {\n const container = section('DistanceUnitsTitle');\n\n const form = document.createElement('form');\n\n const name = 'distance-unit';\n const stateKey = 'settings.distanceUnit';\n\n const kilometersRow = new Row({\n radioField: new RadioField({\n langKey: 'DistanceUnitsKilometers',\n name,\n value: 'kilometers',\n stateKey\n })\n });\n\n const milesRow = new Row({\n radioField: new RadioField({\n langKey: 'DistanceUnitsMiles',\n name,\n value: 'miles',\n stateKey\n })\n });\n\n form.append(kilometersRow.container, milesRow.container);\n container.append(form);\n }\n\n {\n const container = section('General.TimeFormat');\n\n const form = document.createElement('form');\n\n const name = 'time-format';\n const stateKey = 'settings.timeFormat';\n\n const formats: [State['settings']['timeFormat'], LangPackKey][] = [\n ['h12', 'General.TimeFormat.h12'],\n ['h23', 'General.TimeFormat.h23']\n ];\n\n const rows = formats.map(([format, langPackKey]) => {\n const row = new Row({\n radioField: new RadioField({\n langKey: langPackKey,\n name,\n value: format,\n stateKey\n })\n });\n\n return row;\n });\n\n const cancel = eachMinute(() => {\n const date = new Date();\n\n formats.forEach(([format], idx) => {\n const str = date.toLocaleTimeString('en-us-u-hc-' + format, {\n hour: '2-digit',\n minute: '2-digit'\n });\n\n rows[idx].subtitle.textContent = str;\n });\n });\n\n this.eventListener.addEventListener('destroy', cancel);\n\n form.append(...rows.map((row) => row.container));\n container.append(form);\n }\n\n {\n const container = section('Emoji');\n\n const suggestCheckboxField = new CheckboxField({\n text: 'GeneralSettings.EmojiPrediction',\n name: 'suggest-emoji',\n stateKey: 'settings.emoji.suggest',\n listenerSetter: this.listenerSetter\n });\n const bigCheckboxField = new CheckboxField({\n text: 'GeneralSettings.BigEmoji',\n name: 'emoji-big',\n stateKey: 'settings.emoji.big',\n listenerSetter: this.listenerSetter\n });\n\n container.append(\n CreateRowFromCheckboxField(suggestCheckboxField).container,\n CreateRowFromCheckboxField(bigCheckboxField).container\n );\n }\n\n {\n const section = new SettingSection({name: 'Telegram.InstalledStickerPacksController', caption: 'StickersBotInfo'});\n\n const reactionsRow = new Row({\n titleLangKey: 'DoubleTapSetting',\n havePadding: true,\n clickable: () => {\n this.slider.createTab(AppQuickReactionTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const renderQuickReaction = () => {\n p.quickReaction.then((reaction) => {\n if(reaction._ === 'availableReaction') {\n return reaction.static_icon;\n } else {\n return this.managers.appEmojiManager.getCustomEmojiDocument(reaction.document_id);\n }\n }).then((doc) => {\n wrapStickerToRow({\n row: reactionsRow,\n doc,\n size: 'small'\n });\n });\n };\n\n renderQuickReaction();\n\n this.listenerSetter.add(rootScope)('quick_reaction', renderQuickReaction);\n\n const suggestCheckboxField = new CheckboxField({\n text: 'Stickers.SuggestStickers',\n name: 'suggest',\n stateKey: 'settings.stickers.suggest',\n listenerSetter: this.listenerSetter\n });\n const loopCheckboxField = new CheckboxField({\n text: 'InstalledStickers.LoopAnimated',\n name: 'loop',\n stateKey: 'settings.stickers.loop',\n listenerSetter: this.listenerSetter\n });\n\n const stickerSets: {[id: string]: Row} = {};\n\n const stickersContent = section.generateContentElement();\n\n const lazyLoadQueue = new LazyLoadQueue();\n const renderStickerSet = (stickerSet: StickerSet.stickerSet, method: 'append' | 'prepend' = 'append') => {\n const row = new Row({\n title: wrapEmojiText(stickerSet.title),\n subtitleLangKey: 'Stickers',\n subtitleLangArgs: [stickerSet.count],\n havePadding: true,\n clickable: () => {\n new PopupStickers({id: stickerSet.id, access_hash: stickerSet.access_hash}).show();\n },\n listenerSetter: this.listenerSetter\n });\n\n stickerSets[stickerSet.id] = row;\n\n const div = document.createElement('div');\n div.classList.add('row-media');\n\n wrapStickerSetThumb({\n set: stickerSet,\n container: div,\n group: 'GENERAL-SETTINGS',\n lazyLoadQueue,\n width: 36,\n height: 36,\n autoplay: true,\n middleware: this.middlewareHelper.get()\n });\n\n row.container.append(div);\n\n stickersContent[method](row.container);\n };\n\n const promise = p.allStickers.then((allStickers) => {\n assumeType(allStickers);\n const promises = allStickers.sets.map((stickerSet) => renderStickerSet(stickerSet));\n return Promise.all(promises);\n });\n\n promises.push(promise);\n\n this.listenerSetter.add(rootScope)('stickers_installed', (set) => {\n if(!stickerSets[set.id]) {\n renderStickerSet(set, 'prepend');\n }\n });\n\n this.listenerSetter.add(rootScope)('stickers_deleted', (set) => {\n if(stickerSets[set.id]) {\n stickerSets[set.id].container.remove();\n delete stickerSets[set.id];\n }\n });\n\n section.content.append(\n reactionsRow.container,\n CreateRowFromCheckboxField(suggestCheckboxField).container,\n CreateRowFromCheckboxField(loopCheckboxField).container\n );\n this.scrollable.append(section.container);\n }\n\n return Promise.all(promises);\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 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","/*\n * 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 {MyDialogFilter} from '../../../lib/storages/filters';\nimport type {DialogFilterSuggested} from '../../../layer';\nimport type _rootScope from '../../../lib/rootScope';\nimport {SliderSuperTab} from '../../slider';\nimport lottieLoader, {LottieLoader} from '../../../lib/rlottie/lottieLoader';\nimport Button from '../../button';\nimport rootScope from '../../../lib/rootScope';\nimport AppEditFolderTab from './editFolder';\nimport Row from '../../row';\nimport {i18n, i18n_, LangPackKey, join} from '../../../lib/langPack';\nimport cancelEvent from '../../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport positionElementByIndex from '../../../helpers/dom/positionElementByIndex';\nimport RLottiePlayer from '../../../lib/rlottie/rlottiePlayer';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport {FOLDER_ID_ALL, FOLDER_ID_ARCHIVE, REAL_FOLDERS} from '../../../lib/mtproto/mtproto_config';\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport SettingSection from '../../settingSection';\nimport Sortable from '../../../helpers/dom/sortable';\nimport whichChild from '../../../helpers/dom/whichChild';\nimport indexOfAndSplice from '../../../helpers/array/indexOfAndSplice';\nimport showLimitPopup from '../../popups/limit';\n\nexport default class AppChatFoldersTab extends SliderSuperTab {\n private createFolderBtn: HTMLElement;\n private foldersSection: SettingSection;\n private suggestedSection: SettingSection;\n private stickerContainer: HTMLElement;\n private animation: RLottiePlayer;\n private list: HTMLElement;\n\n private filtersRendered: {[filterId: number]: Row} = {};\n private loadAnimationPromise: ReturnType;\n\n public static getInitArgs() {\n return {\n animationData: lottieLoader.loadAnimationFromURLManually('Folders_1'),\n filters: rootScope.managers.filtersStorage.getDialogFilters()\n };\n }\n\n private async renderFolder(\n dialogFilter: DialogFilterSuggested | MyDialogFilter,\n container?: HTMLElement,\n row?: Row,\n append?: boolean\n ) {\n let filter: MyDialogFilter;\n let description = '';\n const d: HTMLElement[] = [];\n if(dialogFilter._ === 'dialogFilterSuggested') {\n filter = dialogFilter.filter as MyDialogFilter;\n description = dialogFilter.description;\n } else {\n filter = dialogFilter;\n\n const enabledFilters = Object.keys(filter.pFlags).length;\n /* (['include_peers', 'exclude_peers'] as ['include_peers', 'exclude_peers']).forEach((key) => {\n enabledFilters += +!!filter[key].length;\n }); */\n\n if(enabledFilters === 1) {\n const pFlags = filter.pFlags;\n let k: LangPackKey;\n if(pFlags.contacts) k = 'FilterAllContacts';\n else if(pFlags.non_contacts) k = 'FilterAllNonContacts';\n else if(pFlags.groups) k = 'FilterAllGroups';\n else if(pFlags.broadcasts) k = 'FilterAllChannels';\n else if(pFlags.bots) k = 'FilterAllBots';\n\n if(k) {\n d.push(i18n(k));\n }\n }\n\n if(!d.length) {\n const folder = await this.managers.dialogsStorage.getFolderDialogs(filter.id);\n let chats = 0, channels = 0, groups = 0;\n await Promise.all(folder.map(async(dialog) => {\n if(await this.managers.appPeersManager.isAnyGroup(dialog.peerId)) groups++;\n else if(await this.managers.appPeersManager.isBroadcast(dialog.peerId)) channels++;\n else chats++;\n }));\n\n if(chats) d.push(i18n('Chats', [chats]));\n if(channels) d.push(i18n('Channels', [channels]));\n if(groups) d.push(i18n('Groups', [groups]));\n }\n }\n\n if(!row) {\n row = new Row({\n title: filter.id === FOLDER_ID_ALL ? i18n('FilterAllChats') : wrapEmojiText(filter.title),\n subtitle: description,\n clickable: true,\n buttonRightLangKey: dialogFilter._ === 'dialogFilterSuggested' ? 'Add' : undefined\n });\n\n if(d.length) {\n row.subtitle.append(...join(d));\n }\n\n if(dialogFilter._ === 'dialogFilter') {\n const filterId = filter.id;\n if(!this.filtersRendered[filter.id] && filter.id !== FOLDER_ID_ALL) {\n const initArgs = AppEditFolderTab.getInitArgs();\n attachClickEvent(row.container, async() => {\n const filter = await this.managers.filtersStorage.getFilter(filterId);\n const tab = this.slider.createTab(AppEditFolderTab);\n tab.setInitFilter(filter);\n tab.open(initArgs);\n }, {listenerSetter: this.listenerSetter});\n }\n\n this.filtersRendered[filter.id] = row;\n\n row.makeSortable();\n }\n } else {\n if(filter.id !== FOLDER_ID_ALL) {\n replaceContent(row.title, wrapEmojiText(filter.title));\n }\n\n row.subtitle.textContent = '';\n row.subtitle.append(...join(d));\n }\n\n const div = row.container;\n\n if(append) {\n const localId = (filter as MyDialogFilter).localId;\n if(localId !== undefined) {\n // ! header will be at 0 index\n positionElementByIndex(div, div.parentElement || container, localId);\n } else if(container) {\n container.append(div);\n }\n }\n\n return row;\n }\n\n public init(p: ReturnType = AppChatFoldersTab.getInitArgs()) {\n this.container.classList.add('chat-folders-container');\n this.setTitle('ChatList.Filter.List.Title');\n\n this.scrollable.container.classList.add('chat-folders');\n\n this.stickerContainer = document.createElement('div');\n this.stickerContainer.classList.add('sticker-container');\n\n const caption = document.createElement('div');\n caption.classList.add('caption');\n i18n_({element: caption, key: 'ChatList.Filter.Header'});\n\n this.createFolderBtn = Button('btn-primary btn-color-primary btn-control tgico', {\n text: 'ChatList.Filter.NewTitle',\n icon: 'add'\n });\n\n this.foldersSection = new SettingSection({\n name: 'Filters'\n });\n this.foldersSection.container.classList.add('hide');\n\n this.list = document.createElement('div');\n this.foldersSection.content.append(this.list);\n\n this.suggestedSection = new SettingSection({\n name: 'FilterRecommended'\n });\n this.suggestedSection.container.classList.add('hide');\n\n this.scrollable.append(\n this.stickerContainer,\n caption,\n this.createFolderBtn,\n this.foldersSection.container,\n this.suggestedSection.container\n );\n\n attachClickEvent(this.createFolderBtn, async() => {\n if(!(await this.canCreateFolder())) {\n showLimitPopup('folders');\n } else {\n this.slider.createTab(AppEditFolderTab).open();\n }\n }, {listenerSetter: this.listenerSetter});\n\n const onFiltersContainerUpdate = () => {\n this.foldersSection.container.classList.toggle('hide', !Object.keys(this.filtersRendered).length);\n };\n\n const loadPromises: Promise[] = [];\n const renderFiltersPromise = p.filters.then(async(filters) => {\n for(const filter of filters) {\n if(filter.id === FOLDER_ID_ARCHIVE) {\n continue;\n }\n\n await this.renderFolder(filter, this.list, undefined, true);\n }\n\n this.toggleAllChats();\n\n onFiltersContainerUpdate();\n });\n\n loadPromises.push(renderFiltersPromise);\n\n this.listenerSetter.add(rootScope)('filter_update', async(filter) => {\n const filterRendered = this.filtersRendered[filter.id];\n if(filterRendered) {\n await this.renderFolder(filter, null, filterRendered);\n } else if(filter.id !== FOLDER_ID_ARCHIVE) {\n await this.renderFolder(filter, this.list, undefined, true);\n }\n\n onFiltersContainerUpdate();\n\n this.getSuggestedFilters();\n });\n\n this.listenerSetter.add(rootScope)('filter_delete', (filter) => {\n const filterRendered = this.filtersRendered[filter.id];\n if(filterRendered) {\n /* for(const suggested of this.suggestedFilters) {\n if(deepEqual(suggested.filter, filter)) {\n\n }\n } */\n this.getSuggestedFilters();\n\n filterRendered.container.remove();\n delete this.filtersRendered[filter.id];\n }\n\n onFiltersContainerUpdate();\n });\n\n this.listenerSetter.add(rootScope)('filter_order', (order) => {\n order.filter((filterId) => !!this.filtersRendered[filterId]).forEach((filterId, idx) => {\n const filterRendered = this.filtersRendered[filterId];\n const container = filterRendered.container;\n positionElementByIndex(container, container.parentElement, idx + 1); // ! + 1 due to header\n });\n });\n\n this.listenerSetter.add(rootScope)('premium_toggle', () => {\n this.toggleAllChats();\n });\n\n this.loadAnimationPromise = p.animationData.then(async(cb) => {\n const player = await cb({\n container: this.stickerContainer,\n loop: false,\n autoplay: false,\n width: 86,\n height: 86\n });\n\n this.animation = player;\n\n return lottieLoader.waitForFirstFrame(player);\n });\n\n loadPromises.push(this.loadAnimationPromise);\n\n new Sortable({\n list: this.list,\n middleware: this.middlewareHelper.get(),\n onSort: (prevIdx, newIdx) => {\n let order: number[] = [];\n for(const filterId in this.filtersRendered) {\n const row = this.filtersRendered[filterId];\n const idx = whichChild(row.container);\n order[idx] = +filterId;\n }\n\n order = order.filter((filterId) => filterId !== undefined);\n if(!rootScope.premium) {\n indexOfAndSplice(order, FOLDER_ID_ALL);\n // order.unshift(FOLDER_ID_ALL);\n }\n\n this.managers.filtersStorage.updateDialogFiltersOrder(order);\n },\n scrollable: this.scrollable\n });\n\n this.getSuggestedFilters();\n\n /* return Promise.all([\n this.loadAnimationPromise\n ]); */\n return Promise.all(loadPromises);\n }\n\n onOpenAfterTimeout() {\n this.loadAnimationPromise.then(() => {\n this.animation.autoplay = true;\n this.animation.play();\n });\n\n return super.onOpenAfterTimeout();\n }\n\n private toggleAllChats() {\n const filterRendered = this.filtersRendered[FOLDER_ID_ALL];\n filterRendered.container.classList.toggle('hide', !rootScope.premium);\n }\n\n private async canCreateFolder() {\n const [limit, filters] = await Promise.all([\n this.managers.apiManager.getLimit('folders'),\n this.managers.filtersStorage.getDialogFilters()\n ]);\n\n const filtersLength = filters.filter((filter) => !REAL_FOLDERS.has(filter.id)).length;\n return filtersLength < limit;\n }\n\n private getSuggestedFilters() {\n return this.managers.filtersStorage.getSuggestedDialogsFilters().then(async(suggestedFilters) => {\n this.suggestedSection.container.classList.toggle('hide', !suggestedFilters.length);\n Array.from(this.suggestedSection.content.children).slice(1).forEach((el) => el.remove());\n\n for(const filter of suggestedFilters) {\n const row = await this.renderFolder(filter);\n this.suggestedSection.content.append(row.container);\n\n const button = row.buttonRight;\n attachClickEvent(button, async(e) => {\n cancelEvent(e);\n\n if(!(await this.canCreateFolder())) {\n showLimitPopup('folders');\n return;\n }\n\n button.setAttribute('disabled', 'true');\n\n const f = filter.filter as MyDialogFilter;\n f.includePeerIds = [];\n f.excludePeerIds = [];\n f.pinnedPeerIds = [];\n\n this.managers.filtersStorage.createDialogFilter(f, true).then(() => {\n row.container.remove();\n this.suggestedSection.container.classList.toggle('hide', this.suggestedSection.content.childElementCount === 1);\n }).finally(() => {\n button.removeAttribute('disabled');\n });\n }, {listenerSetter: this.listenerSetter});\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 Row from '../../row';\nimport CheckboxField from '../../checkboxField';\nimport {InputNotifyPeer, InputPeerNotifySettings, Update} from '../../../layer';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport rootScope from '../../../lib/rootScope';\nimport {LangPackKey} from '../../../lib/langPack';\nimport copy from '../../../helpers/object/copy';\nimport convertKeyToInputKey from '../../../helpers/string/convertKeyToInputKey';\nimport {MUTE_UNTIL} from '../../../lib/mtproto/mtproto_config';\nimport apiManagerProxy from '../../../lib/mtproto/mtprotoworker';\nimport SettingSection from '../../settingSection';\n\ntype InputNotifyKey = Exclude;\n\nexport default class AppNotificationsTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('notifications-container');\n this.setTitle('Telegram.NotificationSettingsViewController');\n\n const NotifySection = (options: {\n name: LangPackKey,\n typeText: LangPackKey,\n inputKey: InputNotifyKey,\n }) => {\n const section = new SettingSection({\n name: options.name\n });\n\n const enabledRow = new Row({\n checkboxField: new CheckboxField({text: options.typeText, checked: true}),\n subtitleLangKey: 'Loading',\n listenerSetter: this.listenerSetter,\n withCheckboxSubtitle: true\n });\n\n const previewEnabledRow = new Row({\n checkboxField: new CheckboxField({text: 'MessagePreview', checked: true}),\n subtitleLangKey: 'Loading',\n listenerSetter: this.listenerSetter,\n withCheckboxSubtitle: true\n });\n\n section.content.append(enabledRow.container, previewEnabledRow.container);\n\n this.scrollable.append(section.container);\n\n const inputNotifyPeer = {_: options.inputKey};\n const ret = this.managers.appNotificationsManager.getNotifySettings(inputNotifyPeer);\n (ret instanceof Promise ? ret : Promise.resolve(ret)).then((notifySettings) => {\n const applySettings = async() => {\n const muted = await this.managers.appNotificationsManager.isMuted(notifySettings);\n enabledRow.checkboxField.checked = !muted;\n previewEnabledRow.checkboxField.checked = notifySettings.show_previews;\n\n return muted;\n };\n\n applySettings();\n\n this.eventListener.addEventListener('destroy', async() => {\n const mute = !enabledRow.checkboxField.checked;\n const showPreviews = previewEnabledRow.checkboxField.checked;\n\n if(mute === (await this.managers.appNotificationsManager.isMuted(notifySettings)) && showPreviews === notifySettings.show_previews) {\n return;\n }\n\n const inputSettings: InputPeerNotifySettings = copy(notifySettings) as any;\n inputSettings._ = 'inputPeerNotifySettings';\n inputSettings.mute_until = mute ? MUTE_UNTIL : 0;\n inputSettings.show_previews = showPreviews;\n delete inputSettings.flags;\n\n this.managers.appNotificationsManager.updateNotifySettings(inputNotifyPeer, inputSettings);\n }, {once: true});\n\n this.listenerSetter.add(rootScope)('notify_settings', (update: Update.updateNotifySettings) => {\n const inputKey = convertKeyToInputKey(update.peer._) as any;\n if(options.inputKey === inputKey) {\n notifySettings = update.notify_settings;\n applySettings();\n }\n });\n });\n };\n\n NotifySection({\n name: 'NotificationsPrivateChats',\n typeText: 'NotificationsForPrivateChats',\n inputKey: 'inputNotifyUsers'\n });\n\n NotifySection({\n name: 'NotificationsGroups',\n typeText: 'NotificationsForGroups',\n inputKey: 'inputNotifyChats'\n });\n\n NotifySection({\n name: 'NotificationsChannels',\n typeText: 'NotificationsForChannels',\n inputKey: 'inputNotifyBroadcasts'\n });\n\n {\n const section = new SettingSection({\n name: 'NotificationsOther'\n });\n\n const contactsSignUpRow = new Row({\n checkboxField: new CheckboxField({text: 'ContactJoined', checked: true}),\n subtitleLangKey: 'Loading',\n listenerSetter: this.listenerSetter,\n withCheckboxSubtitle: true\n });\n\n const soundRow = new Row({\n checkboxField: new CheckboxField({text: 'Notifications.Sound', checked: true, stateKey: 'settings.notifications.sound', listenerSetter: this.listenerSetter}),\n subtitleLangKey: 'Loading',\n listenerSetter: this.listenerSetter,\n withCheckboxSubtitle: true\n });\n\n apiManagerProxy.getState().then((state) => {\n soundRow.checkboxField.checked = state.settings.notifications.sound;\n });\n\n section.content.append(contactsSignUpRow.container, soundRow.container);\n\n this.scrollable.append(section.container);\n\n this.managers.appNotificationsManager.getContactSignUpNotification().then((enabled) => {\n contactsSignUpRow.checkboxField.checked = enabled;\n\n this.eventListener.addEventListener('destroy', () => {\n const _enabled = contactsSignUpRow.checkboxField.checked;\n if(enabled !== _enabled) {\n this.managers.appNotificationsManager.setContactSignUpNotification(!_enabled);\n }\n }, {once: true});\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 {randomLong} from '../../../helpers/random';\nimport {LangPackLanguage} from '../../../layer';\nimport I18n from '../../../lib/langPack';\nimport rootScope from '../../../lib/rootScope';\nimport RadioField from '../../radioField';\nimport Row, {RadioFormFromRows} from '../../row';\nimport SettingSection from '../../settingSection';\nimport {SliderSuperTab} from '../../slider'\n\nexport default class AppLanguageTab extends SliderSuperTab {\n public static getInitArgs() {\n return {\n languages1: rootScope.managers.apiManager.invokeApiCacheable('langpack.getLanguages', {\n lang_pack: 'web'\n }),\n // languages2: rootScope.managers.apiManager.invokeApiCacheable('langpack.getLanguages', {\n // lang_pack: 'macos'\n // })\n languages2: Promise.resolve([] as LangPackLanguage[])\n };\n }\n\n public init(p: ReturnType) {\n this.header.classList.add('with-border');\n this.container.classList.add('language-container');\n this.setTitle('Telegram.LanguageViewController');\n\n const section = new SettingSection({});\n\n const radioRows: Map = new Map();\n\n const promise = Promise.all([\n p.languages1,\n p.languages2\n ]).then(([languages1, languages2]) => {\n const rendered: Set = new Set();\n const webLangCodes = languages1.map((language) => language.lang_code);\n\n const random = randomLong();\n languages1.concat(languages2).forEach((language) => {\n if(rendered.has(language.lang_code)) return;\n rendered.add(language.lang_code);\n\n const row = new Row({\n radioField: new RadioField({\n text: language.name,\n name: random,\n value: language.lang_code\n }),\n subtitle: language.native_name\n });\n\n radioRows.set(language.lang_code, row);\n });\n\n const form = RadioFormFromRows([...radioRows.values()], (value) => {\n I18n.getLangPack(value, webLangCodes.includes(value));\n });\n\n I18n.getCacheLangPack().then((langPack) => {\n const row = radioRows.get(langPack.lang_code);\n if(!row) {\n console.error('no row', row, langPack);\n return;\n }\n\n row.radioField.setValueSilently(true);\n });\n\n section.content.append(form);\n });\n\n this.scrollable.append(section.container);\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 ListenerSetter from '../../../../helpers/listenerSetter';\nimport {LangPackKey} from '../../../../lib/langPack';\nimport CheckboxField from '../../../checkboxField';\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport Row, {CreateRowFromCheckboxField} from '../../../row';\nimport SettingSection from '../../../settingSection';\n\nexport function autoDownloadPeerTypeSection(type: 'photo' | 'video' | 'file', title: LangPackKey, listenerSetter: ListenerSetter) {\n const section = new SettingSection({name: title});\n\n const key = 'settings.autoDownload.' + type + '.';\n const contactsCheckboxField = new CheckboxField({\n text: 'AutodownloadContacts',\n name: 'contacts',\n stateKey: key + 'contacts',\n listenerSetter\n });\n const privateCheckboxField = new CheckboxField({\n text: 'AutodownloadPrivateChats',\n name: 'private',\n stateKey: key + 'private',\n listenerSetter\n });\n const groupsCheckboxField = new CheckboxField({\n text: 'AutodownloadGroupChats',\n name: 'groups',\n stateKey: key + 'groups',\n listenerSetter\n });\n const channelsCheckboxField = new CheckboxField({\n text: 'AutodownloadChannels',\n name: 'channels',\n stateKey: key + 'channels',\n listenerSetter\n });\n\n section.content.append(\n CreateRowFromCheckboxField(contactsCheckboxField).container,\n CreateRowFromCheckboxField(privateCheckboxField).container,\n CreateRowFromCheckboxField(groupsCheckboxField).container,\n CreateRowFromCheckboxField(channelsCheckboxField).container\n );\n\n return section;\n}\n\nexport default class AppAutoDownloadPhotoTab extends SliderSuperTabEventable {\n public init() {\n this.setTitle('AutoDownloadPhotos');\n\n const section = autoDownloadPeerTypeSection('photo', 'AutoDownloadPhotosTitle', this.listenerSetter);\n this.scrollable.append(section.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 formatBytes from '../../../../helpers/formatBytes';\nimport debounce from '../../../../helpers/schedulers/debounce';\nimport I18n from '../../../../lib/langPack';\nimport rootScope from '../../../../lib/rootScope';\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport {RangeSettingSelector} from '../generalSettings';\nimport {autoDownloadPeerTypeSection} from './photo';\n\nexport default class AppAutoDownloadFileTab extends SliderSuperTabEventable {\n public init() {\n this.setTitle('AutoDownloadFiles');\n\n const debouncedSave = debounce((sizeMax: number) => {\n this.managers.appStateManager.setByKey('settings.autoDownloadNew.file_size_max', sizeMax);\n }, 200, false, true);\n\n const section = autoDownloadPeerTypeSection('file', 'AutoDownloadFilesTitle', this.listenerSetter);\n\n const MIN = 512 * 1024;\n // const MAX = 2 * 1024 * 1024 * 1024;\n const MAX = 20 * 1024 * 1024;\n const MAX_RANGE = MAX - MIN;\n\n const sizeMax = rootScope.settings.autoDownloadNew.file_size_max;\n const value = Math.sqrt(Math.sqrt((sizeMax - MIN) / MAX_RANGE));\n const upTo = new I18n.IntlElement({\n key: 'AutodownloadSizeLimitUpTo',\n args: [formatBytes(sizeMax)]\n });\n const range = new RangeSettingSelector('AutoDownloadMaxFileSize', 0.01, value, 0, 1, false);\n range.onChange = (value) => {\n const sizeMax = (value ** 4 * MAX_RANGE + MIN) | 0;\n\n upTo.compareAndUpdate({args: [formatBytes(sizeMax)]});\n\n debouncedSave(sizeMax);\n };\n\n range.valueContainer.append(upTo.element);\n\n section.content.append(range.container);\n\n this.scrollable.append(section.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 {SliderSuperTabEventable} from '../../../sliderTab';\nimport {autoDownloadPeerTypeSection} from './photo';\n\nexport default class AppAutoDownloadVideoTab extends SliderSuperTabEventable {\n public init() {\n this.setTitle('AutoDownloadVideos');\n\n const section = autoDownloadPeerTypeSection('video', 'AutoDownloadVideosTitle', this.listenerSetter);\n this.scrollable.append(section.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 {AutoDownloadPeerTypeSettings, STATE_INIT} from '../../../config/state';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport formatBytes from '../../../helpers/formatBytes';\nimport copy from '../../../helpers/object/copy';\nimport deepEqual from '../../../helpers/object/deepEqual';\nimport {FormatterArguments, i18n, join, LangPackKey} from '../../../lib/langPack';\nimport rootScope from '../../../lib/rootScope';\nimport Button from '../../button';\nimport CheckboxField from '../../checkboxField';\nimport confirmationPopup from '../../confirmationPopup';\nimport Row from '../../row';\nimport {SliderSuperTabEventable, SliderSuperTabEventableConstructable} from '../../sliderTab';\nimport AppAutoDownloadFileTab from './autoDownload/file';\nimport AppAutoDownloadPhotoTab from './autoDownload/photo';\nimport AppAutoDownloadVideoTab from './autoDownload/video';\nimport apiManagerProxy from '../../../lib/mtproto/mtprotoworker';\nimport SettingSection from '../../settingSection';\n\nconst AUTO_DOWNLOAD_FOR_KEYS: {[k in keyof AutoDownloadPeerTypeSettings]: LangPackKey} = {\n contacts: 'AutoDownloadContacts',\n private: 'AutoDownloadPm',\n groups: 'AutoDownloadGroups',\n channels: 'AutoDownloadChannels'\n};\n\nexport default class AppDataAndStorageTab extends SliderSuperTabEventable {\n public async init() {\n this.setTitle('DataSettings');\n\n {\n const section = new SettingSection({name: 'AutomaticMediaDownload', caption: 'AutoDownloadAudioInfo'});\n\n const state = await apiManagerProxy.getState();\n\n const autoCheckboxField = new CheckboxField({\n text: 'AutoDownloadMedia',\n name: 'auto',\n checked: !state.settings.autoDownloadNew.pFlags.disabled,\n listenerSetter: this.listenerSetter\n });\n\n const autoRow = new Row({\n checkboxField: autoCheckboxField,\n listenerSetter: this.listenerSetter\n });\n\n const onChange = () => {\n toggleDisability([resetButton],\n deepEqual(state.settings.autoDownload, STATE_INIT.settings.autoDownload) &&\n deepEqual(state.settings.autoDownloadNew, STATE_INIT.settings.autoDownloadNew));\n };\n\n const setSubtitles = () => {\n this.setAutoDownloadSubtitle(photoRow, state.settings.autoDownload.photo /* state.settings.autoDownloadNew.photo_size_max */);\n this.setAutoDownloadSubtitle(videoRow, state.settings.autoDownload.video/* , state.settings.autoDownloadNew.video_size_max */);\n this.setAutoDownloadSubtitle(fileRow, state.settings.autoDownload.file, state.settings.autoDownloadNew.file_size_max);\n };\n\n const openTab = (tabConstructor: SliderSuperTabEventableConstructable) => {\n const tab = this.slider.createTab(tabConstructor);\n tab.open();\n\n this.listenerSetter.add(tab.eventListener)('destroy', () => {\n setSubtitles();\n onChange();\n }, {once: true});\n };\n\n const photoRow = new Row({\n titleLangKey: 'AutoDownloadPhotos',\n subtitle: '',\n clickable: () => {\n openTab(AppAutoDownloadPhotoTab);\n },\n listenerSetter: this.listenerSetter\n });\n\n const videoRow = new Row({\n titleLangKey: 'AutoDownloadVideos',\n subtitle: '',\n clickable: () => {\n openTab(AppAutoDownloadVideoTab);\n },\n listenerSetter: this.listenerSetter\n });\n\n const fileRow = new Row({\n titleLangKey: 'AutoDownloadFiles',\n subtitle: '',\n clickable: () => {\n openTab(AppAutoDownloadFileTab);\n },\n listenerSetter: this.listenerSetter\n });\n\n const resetButton = Button('btn-primary btn-transparent primary', {icon: 'delete', text: 'ResetAutomaticMediaDownload'});\n attachClickEvent(resetButton, () => {\n confirmationPopup({\n titleLangKey: 'ResetAutomaticMediaDownloadAlertTitle',\n descriptionLangKey: 'ResetAutomaticMediaDownloadAlert',\n button: {\n langKey: 'Reset'\n }\n }).then(() => {\n const settings = rootScope.settings;\n settings.autoDownloadNew = copy(STATE_INIT.settings.autoDownloadNew);\n settings.autoDownload = copy(STATE_INIT.settings.autoDownload);\n state.settings = settings;\n this.managers.appStateManager.setByKey('settings', settings);\n\n setSubtitles();\n autoCheckboxField.checked = !state.settings.autoDownloadNew.pFlags.disabled;\n });\n });\n\n const onDisabledChange = () => {\n const disabled = !autoCheckboxField.checked;\n\n const settings = rootScope.settings;\n if(disabled) {\n settings.autoDownloadNew.pFlags.disabled = true;\n } else {\n delete settings.autoDownloadNew.pFlags.disabled;\n }\n\n [photoRow, videoRow, fileRow].forEach((row) => {\n row.container.classList.toggle('is-disabled', disabled);\n });\n\n this.managers.appStateManager.setByKey('settings', settings);\n\n onChange();\n };\n\n autoCheckboxField.input.addEventListener('change', onDisabledChange);\n onDisabledChange();\n setSubtitles();\n\n section.content.append(\n autoRow.container,\n photoRow.container,\n videoRow.container,\n fileRow.container,\n resetButton\n );\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({name: 'AutoplayMedia'});\n\n section.content.append(new Row({\n checkboxField: new CheckboxField({\n text: 'AutoplayGIF',\n name: 'gifs',\n stateKey: 'settings.autoPlay.gifs',\n listenerSetter: this.listenerSetter\n }),\n listenerSetter: this.listenerSetter\n }).container, new Row({\n checkboxField: new CheckboxField({\n text: 'AutoplayVideo',\n name: 'videos',\n stateKey: 'settings.autoPlay.videos',\n listenerSetter: this.listenerSetter\n }),\n listenerSetter: this.listenerSetter\n }).container);\n\n this.scrollable.append(section.container);\n }\n }\n\n private setAutoDownloadSubtitle(row: Row, settings: AutoDownloadPeerTypeSettings, sizeMax?: number) {\n let key: LangPackKey;\n const args: FormatterArguments = [];\n\n const peerKeys = Object.keys(settings) as (keyof typeof AUTO_DOWNLOAD_FOR_KEYS)[];\n const enabledKeys = peerKeys.map((key) => settings[key] ? AUTO_DOWNLOAD_FOR_KEYS[key] : undefined).filter(Boolean);\n if(!enabledKeys.length || sizeMax === 0) {\n key = 'AutoDownloadOff';\n } else {\n const isAll = enabledKeys.length === peerKeys.length;\n if(sizeMax !== undefined) {\n key = isAll ? 'AutoDownloadUpToOnAllChats' : 'AutoDownloadOnUpToFor';\n args.push(formatBytes(sizeMax));\n } else {\n key = isAll ? 'AutoDownloadOnAllChats' : 'AutoDownloadOnFor';\n }\n\n if(!isAll) {\n const fragment = document.createElement('span');\n fragment.append(...join(enabledKeys.map((key) => i18n(key)), true, false));\n args.push(fragment);\n }\n }\n\n replaceContent(row.subtitle, i18n(key, args));\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 ButtonMenuToggle from '../../buttonMenuToggle';\nimport Button from '../../button';\nimport AppPrivacyAndSecurityTab from './privacyAndSecurity';\nimport AppGeneralSettingsTab from './generalSettings';\nimport AppEditProfileTab from './editProfile';\nimport AppChatFoldersTab from './chatFolders';\nimport AppNotificationsTab from './notifications';\nimport AppLanguageTab from './language';\nimport lottieLoader from '../../../lib/rlottie/lottieLoader';\nimport PopupPeer from '../../popups/peer';\nimport AppDataAndStorageTab from './dataAndStorage';\nimport ButtonIcon from '../../buttonIcon';\nimport PeerProfile from '../../peerProfile';\nimport rootScope from '../../../lib/rootScope';\nimport Row from '../../row';\nimport AppActiveSessionsTab from './activeSessions';\nimport {i18n, LangPackKey} from '../../../lib/langPack';\nimport {SliderSuperTabConstructable, SliderSuperTabEventable} from '../../sliderTab';\nimport PopupAvatar from '../../popups/avatar';\nimport {AccountAuthorizations, Authorization} from '../../../layer';\nimport PopupElement from '../../popups';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport SettingSection from '../../settingSection';\n// import AppMediaViewer from \"../../appMediaViewerNew\";\n\nexport default class AppSettingsTab extends SliderSuperTab {\n private buttons: {\n edit: HTMLButtonElement,\n folders: HTMLButtonElement,\n general: HTMLButtonElement,\n notifications: HTMLButtonElement,\n storage: HTMLButtonElement,\n privacy: HTMLButtonElement,\n } = {} as any;\n private profile: PeerProfile;\n\n private languageRow: Row;\n private devicesRow: Row;\n\n private authorizations: Authorization.authorization[];\n private getAuthorizationsPromise: Promise;\n\n public async init() {\n this.container.classList.add('settings-container');\n this.setTitle('Settings');\n\n const btnMenu = ButtonMenuToggle({\n listenerSetter: this.listenerSetter,\n direction: 'bottom-left',\n buttons: [{\n icon: 'logout',\n text: 'EditAccount.Logout',\n onClick: () => {\n new PopupPeer('logout', {\n titleLangKey: 'LogOut',\n descriptionLangKey: 'LogOut.Description',\n buttons: [{\n langKey: 'LogOut',\n callback: () => {\n this.managers.apiManager.logOut();\n },\n isDanger: true\n }]\n }).show();\n }\n }]\n });\n\n this.buttons.edit = ButtonIcon('edit');\n\n this.header.append(this.buttons.edit, btnMenu);\n\n this.profile = new PeerProfile(this.managers, this.scrollable, this.listenerSetter, false);\n this.profile.init();\n this.profile.setPeer(rootScope.myId);\n const fillPromise = this.profile.fillProfileElements();\n\n const changeAvatarBtn = Button('btn-circle btn-corner z-depth-1 profile-change-avatar', {icon: 'cameraadd'});\n attachClickEvent(changeAvatarBtn, () => {\n const canvas = document.createElement('canvas');\n PopupElement.createPopup(PopupAvatar).open(canvas, (upload) => {\n upload().then((inputFile) => {\n return this.managers.appProfileManager.uploadProfilePhoto(inputFile);\n });\n });\n }, {listenerSetter: this.listenerSetter});\n this.profile.element.lastElementChild.firstElementChild.append(changeAvatarBtn);\n\n const updateChangeAvatarBtn = async() => {\n const user = await this.managers.appUsersManager.getSelf();\n changeAvatarBtn.classList.toggle('hide', user.photo?._ !== 'userProfilePhoto');\n };\n\n updateChangeAvatarBtn();\n this.listenerSetter.add(rootScope)('avatar_update', ({peerId}) => {\n if(rootScope.myId === peerId) {\n updateChangeAvatarBtn();\n }\n });\n\n /* const div = document.createElement('div');\n //div.style.cssText = 'border-radius: 8px; overflow: hidden; width: 396px; height: 264px; flex: 0 0 auto; position: relative; margin: 10rem 0 10rem auto;';\n //div.style.width = '135px';\n //div.style.height = '100px';\n div.style.cssText = 'border-radius: 8px; overflow: hidden; width: 396px; height: 264px; flex: 0 0 auto; position: relative; margin: 10rem auto 10rem 0;';\n div.style.width = '135px';\n div.style.height = '100px';\n\n const img = document.createElement('img');\n img.src = 'assets/img/pepe.jpg';\n img.classList.add('media-photo');\n img.style.cssText = 'max-width: 100%;max-height: 100%;';\n\n div.append(img);\n\n div.addEventListener('click', () => {\n new AppMediaViewer().setSearchContext({peerId: 61004386, inputFilter: 'inputMessagesFilterPhotos'}).openMedia({\n _: 'message',\n mid: 1,\n peerId: 61004386,\n fromId: 61004386,\n message: '',\n media: {\n _: 'messageMediaPhoto',\n photo: {\n _: 'photo',\n url: img.src,\n downloaded: 111,\n sizes: [{\n _: 'photoSize',\n type: 'x',\n w: 618,\n h: 412\n }]\n }\n },\n date: Date.now() / 1000 | 0\n }, img);\n });\n\n this.scrollable.append(div); */\n\n const buttonsDiv = document.createElement('div');\n buttonsDiv.classList.add('profile-buttons');\n\n type ConstructorP = T extends {\n new (...args: any[]): infer U;\n } ? U : never;\n\n const m = (\n icon: string,\n text: LangPackKey,\n c: T,\n getInitArgs?: () => Promise['init']>>\n ): {\n icon: string,\n text: LangPackKey,\n tabConstructor: T,\n getInitArgs?: typeof getInitArgs,\n // args?: ReturnType\n args?: any\n } => {\n if(!getInitArgs) {\n const g = (c as any as typeof SliderSuperTab).getInitArgs;\n if(g) {\n // @ts-ignore\n getInitArgs = () => [g(this)];\n }\n }\n\n return {\n icon,\n text,\n tabConstructor: c,\n getInitArgs,\n args: getInitArgs?.()\n };\n };\n\n // const k = (c: T): () => [ReturnType['getInitArgs']>] => {\n // return () => (c as any).getInitArgs(this);\n // };\n\n const b = [\n m('unmute', 'AccountSettings.Notifications', AppNotificationsTab),\n m('data', 'DataSettings', AppDataAndStorageTab),\n m('lock', 'AccountSettings.PrivacyAndSecurity', AppPrivacyAndSecurityTab),\n m('settings', 'Telegram.GeneralSettingsViewController', AppGeneralSettingsTab),\n m('folder', 'AccountSettings.Filters', AppChatFoldersTab)\n ];\n\n const rows = b.map((item) => {\n const {icon, text: langPackKey, tabConstructor, getInitArgs} = item;\n return new Row({\n titleLangKey: langPackKey,\n icon,\n clickable: async() => {\n const args = item.args ? await item.args : [];\n const tab = this.slider.createTab(tabConstructor as any);\n tab.open(...args);\n\n if(tab instanceof SliderSuperTabEventable && getInitArgs) {\n tab.eventListener.addEventListener('destroyAfter', (promise) => {\n item.args = promise.then(() => getInitArgs() as any);\n });\n }\n },\n listenerSetter: this.listenerSetter\n });\n });\n\n const languageArgs = AppLanguageTab.getInitArgs();\n rows.push(\n this.devicesRow = new Row({\n titleLangKey: 'Devices',\n titleRightSecondary: ' ',\n icon: 'activesessions',\n clickable: async() => {\n if(!this.authorizations) {\n await this.updateActiveSessions();\n }\n\n const tab = this.slider.createTab(AppActiveSessionsTab);\n tab.authorizations = this.authorizations;\n tab.eventListener.addEventListener('destroy', () => {\n this.authorizations = undefined;\n this.updateActiveSessions(true);\n }, {once: true});\n tab.open();\n },\n listenerSetter: this.listenerSetter\n }),\n\n this.languageRow = new Row({\n titleLangKey: 'AccountSettings.Language',\n titleRightSecondary: i18n('LanguageName'),\n icon: 'language',\n clickable: () => {\n this.slider.createTab(AppLanguageTab).open(languageArgs);\n },\n listenerSetter: this.listenerSetter\n })\n );\n\n buttonsDiv.append(...rows.map((row) => row.container));\n\n // const profileSection = new SettingSection({fullWidth: true, noPaddingTop: true});\n // profileSection.content.append(this.profile.element);\n\n const buttonsSection = new SettingSection();\n buttonsSection.content.append(buttonsDiv);\n\n this.scrollable.append(this.profile.element/* profileSection.container */, buttonsSection.container);\n\n const getEditProfileArgs = () => {\n editProfileArgs = AppEditProfileTab.getInitArgs();\n };\n let editProfileArgs: ReturnType;\n attachClickEvent(this.buttons.edit, () => {\n const tab = this.slider.createTab(AppEditProfileTab);\n tab.open(editProfileArgs);\n }, {listenerSetter: this.listenerSetter});\n getEditProfileArgs();\n // this.listenerSetter.add(rootScope)('user_full_update', (userId) => {\n // if(rootScope.myId.toUserId() === userId) {\n // getEditProfileArgs();\n // }\n // });\n this.listenerSetter.add(rootScope)('user_update', (userId) => {\n if(rootScope.myId.toUserId() === userId) {\n getEditProfileArgs();\n }\n });\n\n lottieLoader.loadLottieWorkers();\n\n this.updateActiveSessions();\n\n (await fillPromise)();\n }\n\n private getAuthorizations(overwrite?: boolean) {\n if(this.getAuthorizationsPromise && !overwrite) return this.getAuthorizationsPromise;\n\n const promise = this.getAuthorizationsPromise = this.managers.apiManager.invokeApi('account.getAuthorizations')\n .finally(() => {\n if(this.getAuthorizationsPromise === promise) {\n this.getAuthorizationsPromise = undefined;\n }\n });\n\n return promise;\n }\n\n public updateActiveSessions(overwrite?: boolean) {\n return this.getAuthorizations(overwrite).then((auths) => {\n this.authorizations = auths.authorizations;\n this.devicesRow.titleRight.textContent = '' + this.authorizations.length;\n });\n }\n\n public onCloseAfterTimeout() {\n this.profile.destroy();\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 appSidebarLeft from '..';\nimport {InputFile} from '../../../layer';\nimport InputField from '../../inputField';\nimport {SliderSuperTab} from '../../slider';\nimport AvatarEdit from '../../avatarEdit';\nimport AppAddMembersTab from './addMembers';\nimport {_i18n} from '../../../lib/langPack';\nimport ButtonCorner from '../../buttonCorner';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport SettingSection from '../../settingSection';\n\nexport default class AppNewChannelTab extends SliderSuperTab {\n private uploadAvatar: () => Promise = null;\n\n private channelNameInputField: InputField;\n private channelDescriptionInputField: InputField;\n private nextBtn: HTMLButtonElement;\n private avatarEdit: AvatarEdit;\n\n public init() {\n this.container.classList.add('new-channel-container');\n this.setTitle('NewChannel');\n\n this.avatarEdit = new AvatarEdit((_upload) => {\n this.uploadAvatar = _upload;\n });\n\n const section = new SettingSection({\n caption: 'Channel.DescriptionHolderDescrpiton'\n });\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.channelNameInputField = new InputField({\n label: 'EnterChannelName',\n maxLength: 128\n });\n\n this.channelDescriptionInputField = new InputField({\n label: 'DescriptionOptionalPlaceholder',\n maxLength: 255\n });\n\n inputWrapper.append(this.channelNameInputField.container, this.channelDescriptionInputField.container);\n\n const onLengthChange = () => {\n this.nextBtn.classList.toggle('is-visible', !!this.channelNameInputField.value.length &&\n !this.channelNameInputField.input.classList.contains('error') &&\n !this.channelDescriptionInputField.input.classList.contains('error'));\n };\n\n this.channelNameInputField.input.addEventListener('input', onLengthChange);\n this.channelDescriptionInputField.input.addEventListener('input', onLengthChange);\n\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\n\n attachClickEvent(this.nextBtn, () => {\n const title = this.channelNameInputField.value;\n const about = this.channelDescriptionInputField.value;\n\n this.nextBtn.disabled = true;\n this.managers.appChatsManager.createChannel({\n title,\n about,\n broadcast: true\n }).then((channelId) => {\n if(this.uploadAvatar) {\n this.uploadAvatar().then((inputFile) => {\n this.managers.appChatsManager.editPhoto(channelId, inputFile);\n });\n }\n\n appImManager.setInnerPeer({peerId: channelId.toPeerId(true)});\n\n appSidebarLeft.removeTabFromHistory(this);\n this.slider.createTab(AppAddMembersTab).open({\n type: 'channel',\n skippable: true,\n title: 'GroupAddMembers',\n placeholder: 'SendMessageTo',\n takeOut: (peerIds) => {\n return this.managers.appChatsManager.inviteToChannel(channelId, peerIds);\n }\n });\n });\n }, {listenerSetter: this.listenerSetter});\n\n this.content.append(this.nextBtn);\n section.content.append(this.avatarEdit.container, inputWrapper);\n this.scrollable.append(section.container);\n }\n\n public onCloseAfterTimeout() {\n this.avatarEdit.clear();\n this.uploadAvatar = null;\n this.channelNameInputField.value = '';\n this.channelDescriptionInputField.value = '';\n this.nextBtn.disabled = false;\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 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 {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', {closable: true, withConfirm: 'Add', title: 'AddContactTitle'});\n this.construct();\n }\n\n private async construct() {\n attachClickEvent(this.btnConfirm, () => {\n const promise = this.managers.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 = getAbbreviation(name);\n editPeer.avatarElem.peerTitle = 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 = await this.managers.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 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';\nimport PopupElement from '../../popups';\n\n// TODO: ะฟะพะธัะบ ะฟะพ ะปัŽะดัะผ ะณะปะพะฑะฐะปัŒะฝั‹ะน, ะตัะปะธ ะฝะต ะฝะฐัˆะปะพ ะฒ ะบะพะฝั‚ะฐะบั‚ะฐั… ะฝะธะบะพะณะพ\n\nexport default class AppContactsTab extends SliderSuperTab {\n private inputSearch: InputSearch;\n private middleware: ReturnType;\n private sortedUserList: SortedUserList;\n\n public 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 PopupElement.createPopup(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', async(userId) => {\n const isContact = await this.managers.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 this.openContacts();\n\n // preload contacts\n // appUsersManager.getContacts();\n }\n\n protected createList() {\n const sortedUserList = new SortedUserList({\n managers: this.managers\n });\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 / 56 * 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 this.middleware.clean();\n const middleware = this.middleware.get();\n this.scrollable.onScrolledBottom = null;\n this.scrollable.container.textContent = '';\n\n this.managers.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 / 56 * 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","/*\n * 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';\nimport {FOLDER_ID_ARCHIVE, REAL_FOLDER_ID} from '../../../lib/mtproto/mtproto_config';\n\nexport default class AppArchivedTab extends SliderSuperTab {\n private static filterId: REAL_FOLDER_ID = FOLDER_ID_ARCHIVE;\n private wasFilterId: number;\n\n public init() {\n this.wasFilterId = appDialogsManager.filterId;\n\n this.container.id = 'chats-archived-container';\n this.setTitle('ArchivedChats');\n\n this.header.classList.add('can-have-forum');\n this.content.classList.add('can-have-forum');\n\n if(!appDialogsManager.xds[AppArchivedTab.filterId]) {\n const {ul, scrollable} = appDialogsManager.l({\n title: undefined,\n id: AppArchivedTab.filterId,\n localId: FOLDER_ID_ARCHIVE\n });\n scrollable.container.append(ul);\n }\n\n const scrollable = appDialogsManager.xds[AppArchivedTab.filterId].scrollable;\n this.scrollable.container.replaceWith(scrollable.container);\n scrollable.attachBorderListeners(this.container);\n // ! DO NOT UNCOMMENT NEXT LINE - chats will stop loading on scroll after closing the tab\n // this.scrollable = scrollable;\n return appDialogsManager.setFilterIdAndChangeTab(AppArchivedTab.filterId).then(({cached, renderPromise}) => {\n if(cached) {\n return renderPromise;\n }\n });\n }\n\n // ะฒะพะพะฑั‰ะต, ั‚ะฐะบ ะดะตะปะฐั‚ัŒ ะฝะตะปัŒะทั, ะฝะพ ะฝะตั‚ ะฒั€ะตะผะตะฝะธ ั‡ั‚ะพะฑั‹ ะฟะตั€ะตะดะตะปะฐั‚ัŒ ะณะปะฐะฒะฝั‹ะน ั‡ะฐั‚ะปะธัั‚ ะฝะฐ ัะปะฐะนะด...\n onOpenAfterTimeout() {\n appDialogsManager.xds[this.wasFilterId].clear();\n }\n\n onClose() {\n this.scrollable.onAdditionalScroll = undefined;\n appDialogsManager.setFilterIdAndChangeTab(this.wasFilterId);\n }\n\n onCloseAfterTimeout() {\n appDialogsManager.xds[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 {SliderSuperTab} from '../../slider';\nimport ButtonCorner from '../../buttonCorner';\nimport AppNewGroupTab from './newGroup';\nimport {toast} from '../../toast';\nimport {ButtonMenuItemOptions} from '../../buttonMenu';\nimport {i18n, join, _i18n} from '../../../lib/langPack';\nimport rootScope from '../../../lib/rootScope';\nimport wrapSticker from '../../wrappers/sticker';\nimport SortedUserList from '../../sortedUserList';\nimport {PeerLocated, Update, Updates} from '../../../layer';\nimport {SettingChatListSection} from '..';\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport confirmationPopup from '../../confirmationPopup';\nimport getPeerId from '../../../lib/appManagers/utils/peers/getPeerId';\nimport type LazyLoadQueue from '../../lazyLoadQueue';\n\nexport default class AppPeopleNearbyTab extends SliderSuperTab {\n private latestLocationSaved: {latitude: number, longitude: number, accuracy: number};\n private isLocationWatched: boolean = false;\n private errorCategory: HTMLElement;\n private retryBtn: HTMLButtonElement;\n private btnOptions: HTMLButtonElement;\n private menuButtons: (ButtonMenuItemOptions & {verify?: () => boolean})[];\n\n protected lazyLoadQueue: LazyLoadQueue;\n protected peopleSection: SettingChatListSection;\n protected chatsSection: SettingChatListSection;\n\n protected locatedPeers: Map;\n\n // public async init() {\n // this.container.classList.add('people-nearby-container');\n // this.setTitle('PeopleNearby');\n\n // this.errorCategory = document.createElement('div');\n // this.errorCategory.classList.add('text', 'hide', 'nearby-error');\n\n // this.retryBtn = ButtonCorner({icon: 'check'});\n\n // const emoji = '๐Ÿงญ';\n // const doc = await this.managers.appStickersManager.getAnimatedEmojiSticker(emoji);\n // const stickerContainer = document.createElement('div');\n // stickerContainer.classList.add('sticker-container');\n\n // if(doc) {\n // wrapSticker({\n // doc,\n // div: stickerContainer,\n // loop: false,\n // play: true,\n // width: 86,\n // height: 86,\n // emoji,\n // needUpscale: true\n // }).then(() => {\n // // this.animation = player;\n // });\n // } else {\n // stickerContainer.classList.add('media-sticker-wrapper');\n // }\n\n // const caption = document.createElement('div');\n // caption.classList.add('caption');\n // _i18n(caption, 'PeopleNearbyInfo2');\n\n // this.locatedPeers = new Map();\n\n // const m = () => {\n // const sortedUserList = new SortedUserList({\n // avatarSize: 42,\n // createChatListOptions: {\n // dialogSize: 48,\n // new: true\n // },\n // autonomous: false,\n // onUpdate: (element) => {\n // const peer = this.locatedPeers.get(element.id);\n // const elements: HTMLElement[] = [\n // this.parseDistance(peer.distance)\n // ];\n\n // if(!element.id.isUser()) {\n // elements.push(this.managers.appProfileManager.getChatMembersString(element.id.toChatId()));\n // }\n\n // element.dom.lastMessageSpan.textContent = '';\n // element.dom.lastMessageSpan.append(...join(elements, false));\n // },\n // getIndex: (element) => {\n // const peer = this.locatedPeers.get(element.id);\n // return 0x7FFFFFFF - peer.distance;\n // },\n // appUsersManager: this.managers.appUsersManager\n // });\n\n // appDialogsManager.setListClickListener(sortedUserList.list, undefined, undefined, false);\n\n // return sortedUserList;\n // };\n\n // const peopleSection = this.peopleSection = new SettingChatListSection({\n // name: 'PeopleNearbyHeader',\n // sortedList: m()\n // });\n\n // const chatsSection = this.chatsSection = new SettingChatListSection({\n // name: 'ChatsNearbyHeader',\n // sortedList: m()\n // });\n\n // const btnMakeVisible = peopleSection.makeButton({\n // text: 'MakeMyselfVisible',\n // icon: 'location'\n // });\n\n // const btnMakeInvisible = peopleSection.makeButton({\n // text: 'StopShowingMe',\n // icon: 'location'\n // });\n\n // const btnCreateGroup = chatsSection.makeButton({\n // text: 'NearbyCreateGroup',\n // icon: 'newgroup'\n // });\n\n // attachClickEvent(btnMakeVisible, () => {\n // confirmationPopup({\n // titleLangKey: 'MakeMyselfVisibleTitle',\n // descriptionLangKey: 'MakeMyselfVisibleInfo',\n // button: {\n // langKey: 'OK'\n // }\n // }).then(() => {\n // this.startWatching();\n // });\n // }, {listenerSetter: this.listenerSetter});\n\n // attachClickEvent(btnMakeInvisible, () => {\n // this.stopWatching();\n // }, {listenerSetter: this.listenerSetter});\n\n // attachClickEvent(btnCreateGroup, () => {\n // this.slider.createTab(AppNewGroupTab).open([], true);\n // }, {listenerSetter: this.listenerSetter});\n\n // btnMakeVisible.classList.add('primary');\n // btnMakeInvisible.classList.add('danger');\n // btnCreateGroup.classList.add('primary');\n\n // this.content.append(this.retryBtn);\n // this.scrollable.append(\n // stickerContainer,\n // caption,\n // peopleSection.container,\n // chatsSection.container,\n // this.errorCategory\n // );\n // }\n\n private parseDistance(distance: number) {\n if(rootScope.settings.distanceUnit === 'miles') {\n if(distance > 1609.34) {\n return i18n('MilesAway', [Math.round(distance / 1609)]);\n } else {\n return i18n('FootsAway', [Math.round(distance * 3.281)]);\n }\n } else {\n if(distance >= 1000) {\n return i18n('KMetersAway2', [distance / 1000]);\n } else {\n return i18n('MetersAway2', [distance]);\n }\n }\n }\n\n // public open() {\n // const result = super.open();\n // result.then(() => {\n // this.retryBtn.classList.remove('is-visible');\n // navigator.geolocation.getCurrentPosition((location) => {\n // this.latestLocationSaved = {\n // latitude: location.coords.latitude,\n // longitude: location.coords.longitude,\n // accuracy: location.coords.accuracy\n // };\n\n // console.log(this.latestLocationSaved);\n\n // this.managers.appUsersManager.getLocated(\n // location.coords.latitude,\n // location.coords.longitude,\n // location.coords.accuracy\n // ).then((response) => {\n // const update = (response as Updates.updates).updates[0] as Update.updatePeerLocated;\n // const peers = update.peers as PeerLocated.peerLocated[];\n // const orderedPeers = peers.sort((a, b) => a.distance - b.distance);\n // const groupsCounter = peers.filter((e) => e.peer._ == 'peerChannel').length;\n // const usersCounter = peers.filter((e) => e.peer._ != 'peerChannel').length;\n // orderedPeers?.forEach((peer) => {\n // const peerId = getPeerId(peer.peer);\n // const section = peerId.isUser() ? this.peopleSection : this.chatsSection;\n // this.locatedPeers.set(peerId, peer);\n // section.sortedList.add(peerId);\n // });\n\n // this.errorCategory.classList.toggle('hide', !!(usersCounter || groupsCounter));\n // this.errorCategory.innerHTML = 'No groups or channels found around you.';\n // });\n // }, (error) => {\n // this.errorCategory.classList.remove('hide');\n // this.retryBtn.classList.add('is-visible');\n // this.retryBtn.addEventListener('click', this.open);\n // if(error instanceof GeolocationPositionError) {\n // this.errorCategory.innerHTML = 'Location permission denied. Click below to retry.';\n // } else {\n // this.errorCategory.innerHTML = 'An error has occurred. Please retry later clicking the button below.';\n // }\n // });\n // });\n\n // return result;\n // }\n\n private startWatching() {\n if(!this.latestLocationSaved || this.isLocationWatched) return;\n this.isLocationWatched = true;\n\n toast('Your position is now being shared. Do not close the page or it will be suspended.');\n\n this.managers.appUsersManager.getLocated(\n this.latestLocationSaved.latitude,\n this.latestLocationSaved.longitude,\n this.latestLocationSaved.accuracy,\n true, // background parameter\n 0x7fffffff // self_expires parameter\n );\n\n navigator.geolocation.watchPosition((result) => {\n const isLongitudeDifferent = result.coords.longitude !== this.latestLocationSaved.longitude;\n const isLatitudeDifferent = result.coords.latitude !== this.latestLocationSaved.latitude;\n const distanceCheck = this.calculateDistance(\n result.coords.latitude, result.coords.longitude,\n this.latestLocationSaved.latitude, this.latestLocationSaved.longitude\n ) > 100;\n\n if((isLatitudeDifferent || isLongitudeDifferent) && distanceCheck) {\n this.managers.appUsersManager.getLocated(\n result.coords.latitude,\n result.coords.longitude,\n result.coords.accuracy,\n true, // background parameter\n 0x7fffffff // self_expires parameter\n );\n this.latestLocationSaved = {\n latitude: result.coords.latitude,\n longitude: result.coords.longitude,\n accuracy: result.coords.accuracy\n }\n }\n });\n }\n\n private stopWatching() {\n if(!this.isLocationWatched) return;\n this.isLocationWatched = false;\n toast('The sharing of your position has been stopped. You will no longer be visible to other users.');\n this.managers.appUsersManager.getLocated(\n 0, // latitude parameter\n 0, // longitude parameter\n 0, // accuracy parameter\n false, // background parameter\n 0 // self_expires parameter\n );\n }\n\n private calculateDistance(lat1: number, long1: number, lat2: number, long2: number) {\n const p = 0.017453292519943295; // Math.PI/180\n return (\n 12742 * Math.asin(\n Math.sqrt(\n (0.5 - Math.cos((lat2 - lat1) * p)) +\n (\n Math.cos(lat1 * p) * Math.cos(lat2 * p) *\n (1 - Math.cos((long2 - long1) * p)/2)\n )\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 appImManager from '../../lib/appManagers/appImManager';\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 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 I18n, {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, {NavigationItem} 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, simulateClickEvent} from '../../helpers/dom/clickEvent';\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';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport AvatarElement from '../avatar';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport themeController from '../../helpers/themeController';\nimport contextMenuController from '../../helpers/contextMenuController';\nimport {DIALOG_LIST_ELEMENT_TAG} from '../../lib/appManagers/appDialogsManager';\nimport apiManagerProxy from '../../lib/mtproto/mtprotoworker';\nimport SettingSection, {SettingSectionOptions} from '../settingSection';\nimport {FOLDER_ID_ARCHIVE} from '../../lib/mtproto/mtproto_config';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {fastRaf} from '../../helpers/schedulers';\nimport {getInstallPrompt} from '../../helpers/dom/installPrompt';\n\nexport const LEFT_COLUMN_ACTIVE_CLASSNAME = 'is-left-column-shown';\n\nexport class AppSidebarLeft extends SidebarSlider {\n private toolsBtn: HTMLElement;\n private backBtn: HTMLButtonElement;\n // private searchInput = document.getElementById('global-search') as HTMLInputElement;\n private inputSearch: InputSearch;\n\n public archivedCount: HTMLSpanElement;\n public rect: DOMRect;\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\n construct(managers: AppManagers) {\n this.managers = managers;\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 this.createTab(AppAddMembersTab).open({\n type: 'chat',\n skippable: false,\n takeOut: (peerIds) => this.createTab(AppNewGroupTab).open(peerIds),\n title: 'GroupAddMembers',\n placeholder: 'SendMessageTo'\n });\n };\n\n const onContactsClick = () => {\n this.createTab(AppContactsTab).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: typeof menuButtons[0] = {\n icon: 'archive',\n text: 'ArchivedChats',\n onClick: () => {\n this.createTab(AppArchivedTab).open();\n },\n verify: async() => {\n const folder = await this.managers.dialogsStorage.getFolderDialogs(FOLDER_ID_ARCHIVE, false);\n return !!folder.length || !(await this.managers.dialogsStorage.isDialogsLoaded(FOLDER_ID_ARCHIVE));\n }\n };\n\n const themeCheckboxField = new CheckboxField({\n toggle: true,\n checked: themeController.getTheme().name === 'night'\n });\n themeCheckboxField.input.addEventListener('change', async() => {\n themeController.switchTheme(themeCheckboxField.input.checked ? 'night' : 'day');\n });\n\n rootScope.addEventListener('theme_change', () => {\n themeCheckboxField.setValueSilently(themeController.getTheme().name === 'night');\n });\n\n const menuButtons: (ButtonMenuItemOptions & {verify?: () => boolean | Promise})[] = [{\n icon: 'savedmessages',\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 this.createTab(AppPeopleNearbyTab).open();\n }\n } : undefined, {\n icon: 'settings',\n text: 'Settings',\n onClick: () => {\n this.createTab(AppSettingsTab).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 const url = I18n.format('TelegramFeaturesUrl', true);\n appImManager.openUrl(url);\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 icon: 'download',\n text: 'PWA.Install',\n onClick: () => {\n const installPrompt = getInstallPrompt();\n installPrompt?.();\n },\n verify: () => !!getInstallPrompt()\n }];\n\n const filteredButtons = menuButtons.filter(Boolean);\n\n this.toolsBtn = ButtonMenuToggle({\n direction: 'bottom-right',\n buttons: filteredButtons,\n onOpen: (e, btnMenu) => {\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 contextMenuController.close();\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 btnArchive.element?.append(this.archivedCount);\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 this.newBtnMenu = ButtonMenuToggle({\n direction: 'top-left',\n buttons: [{\n icon: 'newchannel',\n text: 'NewChannel',\n onClick: () => {\n this.createTab(AppNewChannelTab).open();\n }\n }, {\n icon: 'newgroup',\n text: 'NewGroup',\n onClick: onNewGroupClick\n }, {\n icon: 'newprivate',\n text: 'NewPrivateChat',\n onClick: onContactsClick\n }]\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.className = 'btn-circle rp btn-corner z-depth-1 btn-update is-hidden';\n ripple(this.updateBtn);\n this.updateBtn.append(i18n('Update'));\n\n attachClickEvent(this.updateBtn, () => {\n if(this.updateBtn.classList.contains('is-hidden')) {\n return;\n }\n\n location.reload();\n });\n\n sidebarHeader.nextElementSibling.append(this.updateBtn);\n\n this.inputSearch.input.addEventListener('focus', () => this.initSearch(), {once: true});\n\n this.archivedCount = document.createElement('span');\n this.archivedCount.className = 'archived-count badge badge-24 badge-gray';\n\n rootScope.addEventListener('folder_unread', (folder) => {\n if(folder.id === FOLDER_ID_ARCHIVE) {\n // const count = folder.unreadMessagesCount;\n const count = folder.unreadPeerIds.size;\n this.archivedCount.textContent = '' + formatNumber(count, 1);\n this.archivedCount.classList.toggle('hide', !count);\n }\n });\n\n this.managers.appUsersManager.getTopPeers('correspondents');\n\n // Focus search input by pressing Escape\n const navigationItem: NavigationItem = {\n type: 'global-search-focus',\n onPop: () => {\n setTimeout(() => {\n this.inputSearch.input.focus();\n }, 0);\n\n return false;\n },\n noHistory: true\n };\n appNavigationController.pushItem(navigationItem);\n\n apiManagerProxy.getState().then(() => {\n const CHECK_UPDATE_INTERVAL = 1800e3;\n const checkUpdateInterval = setInterval(() => {\n fetch('version', {cache: 'no-cache'})\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 const onResize = () => {\n const rect = this.rect = this.tabsContainer.getBoundingClientRect();\n document.documentElement.style.setProperty('--left-column-width', rect.width + 'px');\n };\n\n fastRaf(onResize);\n mediaSizes.addEventListener('resize', onResize);\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 simulateClickEvent(this.backBtn);\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, true),\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 managers: this.managers\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 const 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 = new AvatarElement();\n avatarEl.classList.add('selector-user-avatar', 'tgico', 'avatar-32');\n avatarEl.isDialog = true;\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.updateWithOptions({peerId: key as PeerId});\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 this.managers.dialogsStorage.getDialogs({query: value}).then(({dialogs}) => dialogs.map((d) => d.peerId)),\n this.managers.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, DIALOG_LIST_ELEMENT_TAG) 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 this.managers.appUsersManager.pushRecentSearch(peerId);\n }, {capture: true});\n\n const 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 const 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({\n content: searchContainer.parentElement,\n type: 'zoom-fade',\n transitionTime: 150,\n onTransitionEnd: (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\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 const navigationType: NavigationItem['type'] = 'global-search';\n if(!IS_MOBILE_SAFARI && !appNavigationController.findItemByType(navigationType)) {\n appNavigationController.pushItem({\n onPop: () => {\n close();\n },\n type: navigationType\n });\n }\n\n transition(1);\n };\n\n this.inputSearch.input.addEventListener('focus', onFocus);\n onFocus();\n\n attachClickEvent(this.backBtn, (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 return this.managers.appUsersManager.clearRecentSearch().then(() => {\n this.searchGroups.recent.clear();\n });\n });\n });\n }\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","/*\n * 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 AppSelectPeers from '../../appSelectPeers';\nimport {setButtonLoader} from '../../putPreloader';\nimport {LangPackKey, _i18n} from '../../../lib/langPack';\nimport ButtonCorner from '../../buttonCorner';\n\nexport default class AppAddMembersTab extends SliderSuperTab {\n private nextBtn: HTMLButtonElement;\n private selector: AppSelectPeers;\n private peerType: 'channel' | 'chat' | 'privacy';\n private takeOut: (peerIds: PeerId[]) => Promise | false | void;\n private skippable: boolean;\n\n public init(options: {\n title: LangPackKey,\n placeholder: LangPackKey,\n type: AppAddMembersTab['peerType'],\n takeOut?: AppAddMembersTab['takeOut'],\n skippable: boolean,\n selectedPeerIds?: PeerId[]\n }) {\n this.container.classList.add('add-members-container');\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\n this.content.append(this.nextBtn);\n this.scrollable.container.remove();\n\n this.nextBtn.addEventListener('click', () => {\n const peerIds = this.selector.getSelected().map((sel) => sel.toPeerId());\n const result = this.takeOut(peerIds);\n\n if(this.skippable) {\n this.close();\n } else if(result instanceof Promise) {\n this.attachToPromise(result);\n } else if(result === undefined) {\n this.close();\n }\n });\n\n //\n this.setTitle(options.title);\n this.peerType = options.type;\n this.takeOut = options.takeOut;\n this.skippable = options.skippable;\n\n const isPrivacy = this.peerType === 'privacy';\n this.selector = new AppSelectPeers({\n appendTo: this.content,\n onChange: this.skippable ? null : (length) => {\n this.nextBtn.classList.toggle('is-visible', !!length);\n },\n peerType: [isPrivacy ? 'dialogs' : 'contacts'],\n placeholder: options.placeholder,\n exceptSelf: isPrivacy,\n filterPeerTypeBy: isPrivacy ? ['isAnyGroup', 'isUser'] : undefined,\n managers: this.managers,\n design: 'square'\n });\n\n if(options.selectedPeerIds) {\n this.selector.addInitial(options.selectedPeerIds);\n }\n\n this.nextBtn.classList.add('tgico-arrow_next');\n this.nextBtn.innerHTML = '';\n this.nextBtn.disabled = false;\n this.nextBtn.classList.toggle('is-visible', this.skippable);\n }\n\n public attachToPromise(promise: Promise) {\n const removeLoader = setButtonLoader(this.nextBtn, 'arrow_next');\n\n promise.then(() => {\n this.close();\n }, () => {\n removeLoader();\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 {renderImageFromUrlPromise} from './dom/renderImageFromUrl';\n\nexport function averageColorFromCanvas(canvas: HTMLCanvasElement) {\n const context = canvas.getContext('2d');\n\n const pixel = new Array(4).fill(0);\n const pixels = context.getImageData(0, 0, canvas.width, canvas.height).data;\n const pixelsLength = pixels.length / 4;\n for(let i = 0; i < pixels.length; i += 4) {\n // const alphaPixel = pixels[i + 3];\n pixel[0] += pixels[i]/* * (alphaPixel / 255) */;\n pixel[1] += pixels[i + 1]/* * (alphaPixel / 255) */;\n pixel[2] += pixels[i + 2]/* * (alphaPixel / 255) */;\n pixel[3] += pixels[i + 3];\n }\n\n const outPixel = new Uint8ClampedArray(4);\n outPixel[0] = pixel[0] / pixelsLength;\n outPixel[1] = pixel[1] / pixelsLength;\n outPixel[2] = pixel[2] / pixelsLength;\n outPixel[3] = pixel[3] / pixelsLength;\n // outPixel[3] = 255;\n return outPixel;\n}\n\nexport function averageColorFromImageSource(imageSource: CanvasImageSource, width: number, height: number) {\n const canvas = document.createElement('canvas');\n const ratio = width / height;\n const DIMENSIONS = 50;\n if(ratio === 1) {\n canvas.width = DIMENSIONS;\n canvas.height = canvas.width / ratio;\n } else if(ratio > 1) {\n canvas.height = DIMENSIONS;\n canvas.width = canvas.height / ratio;\n } else {\n canvas.width = canvas.height = DIMENSIONS;\n }\n\n const context = canvas.getContext('2d');\n context.drawImage(imageSource, 0, 0, width, height, 0, 0, canvas.width, canvas.height);\n return averageColorFromCanvas(canvas);\n}\n\nexport function averageColor(imageUrl: string) {\n const img = document.createElement('img');\n return renderImageFromUrlPromise(img, imageUrl, false).then(() => {\n return averageColorFromImageSource(img, img.naturalWidth, img.naturalHeight);\n });\n};\n","import {rgbaToHsla} from './color';\n\n// * https://github.com/TelegramMessenger/Telegram-iOS/blob/3d062fff78cc6b287c74e6171f855a3500c0156d/submodules/TelegramPresentationData/Sources/PresentationData.swift#L453\nexport default function highlightningColor(rgba: [number, number, number, number?]) {\n let {h, s, l} = rgbaToHsla(rgba[0], rgba[1], rgba[2]);\n if(s > 0) {\n s = Math.min(100, s + 5 + 0.1 * (100 - s));\n }\n l = Math.max(0, l * .65);\n\n const hsla = `hsla(${h}, ${s}%, ${l}%, .4)`;\n return hsla;\n}\n","import {ColorHsla, ColorRgba, hexaToHsla, hslaToRgba, rgbaToHexa as rgbaToHexa, rgbaToHsla} from '../helpers/color';\nimport attachGrabListeners from '../helpers/dom/attachGrabListeners';\nimport clamp from '../helpers/number/clamp';\nimport InputField, {InputState} from './inputField';\n\nexport type ColorPickerColor = {\n hsl: string;\n rgb: string;\n hex: string;\n hsla: string;\n rgba: string;\n hexa: string;\n rgbaArray: ColorRgba;\n};\n\nexport default class ColorPicker {\n private static BASE_CLASS = 'color-picker';\n public container: HTMLElement;\n\n private boxRect: DOMRect;\n // private boxDraggerRect: DOMRect;\n private hueRect: DOMRect;\n // private hueDraggerRect: DOMRect;\n\n private hue = 0;\n private saturation = 100;\n private lightness = 50;\n private alpha = 1;\n private elements: {\n box: SVGSVGElement,\n boxDragger: SVGSVGElement,\n sliders: HTMLElement,\n hue: SVGSVGElement,\n hueDragger: SVGSVGElement,\n saturation: SVGLinearGradientElement,\n } = {} as any;\n private hexInputField: InputField;\n private rgbInputField: InputField;\n public onChange: (color: ReturnType) => void;\n\n constructor() {\n this.container = document.createElement('div');\n this.container.classList.add(ColorPicker.BASE_CLASS);\n\n const html = `\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 `;\n\n this.container.innerHTML = html;\n\n this.elements.box = this.container.firstElementChild as any;\n this.elements.boxDragger = this.elements.box.lastElementChild as any;\n this.elements.saturation = this.elements.box.firstElementChild.firstElementChild as any;\n\n this.elements.sliders = this.elements.box.nextElementSibling as any;\n\n this.elements.hue = this.elements.sliders.firstElementChild as any;\n this.elements.hueDragger = this.elements.hue.lastElementChild as any;\n\n this.hexInputField = new InputField({plainText: true, label: 'Appearance.Color.Hex'});\n this.rgbInputField = new InputField({plainText: true, label: 'Appearance.Color.RGB'});\n\n const inputs = document.createElement('div');\n inputs.className = ColorPicker.BASE_CLASS + '-inputs';\n inputs.append(this.hexInputField.container, this.rgbInputField.container);\n this.container.append(inputs);\n\n this.hexInputField.input.addEventListener('input', () => {\n let value = this.hexInputField.value.replace(/#/g, '').slice(0, 6);\n\n const match = value.match(/([a-fA-F\\d]+)/);\n const valid = match && match[0].length === value.length && [/* 3, 4, */6].includes(value.length);\n this.hexInputField.setState(valid ? InputState.Neutral : InputState.Error);\n\n value = '#' + value;\n this.hexInputField.setValueSilently(value);\n\n if(valid) {\n this.setColor(value, false, true);\n }\n });\n\n // patched https://stackoverflow.com/a/34029238/6758968\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])\\)?)$/;\n this.rgbInputField.input.addEventListener('input', () => {\n const match = this.rgbInputField.value.match(rgbRegExp);\n this.rgbInputField.setState(match ? InputState.Neutral : InputState.Error);\n\n if(match) {\n this.setColor(rgbaToHsla(+match[1], +match[2], +match[3]), true, false);\n }\n });\n\n this.attachBoxListeners();\n this.attachHueListeners();\n }\n\n private onGrabStart = () => {\n document.documentElement.style.cursor = this.elements.boxDragger.style.cursor = 'grabbing';\n };\n\n private onGrabEnd = () => {\n document.documentElement.style.cursor = this.elements.boxDragger.style.cursor = '';\n };\n\n private attachBoxListeners() {\n attachGrabListeners(this.elements.box as any, () => {\n this.onGrabStart();\n this.boxRect = this.elements.box.getBoundingClientRect();\n // this.boxDraggerRect = this.elements.boxDragger.getBoundingClientRect();\n }, (pos) => {\n this.saturationHandler(pos.x, pos.y);\n }, () => {\n this.onGrabEnd();\n });\n }\n\n private attachHueListeners() {\n attachGrabListeners(this.elements.hue as any, () => {\n this.onGrabStart();\n this.hueRect = this.elements.hue.getBoundingClientRect();\n // this.hueDraggerRect = this.elements.hueDragger.getBoundingClientRect();\n }, (pos) => {\n this.hueHandler(pos.x);\n }, () => {\n this.onGrabEnd();\n });\n }\n\n public setColor(color: ColorHsla | string, updateHexInput = true, updateRgbInput = true) {\n if(color === undefined) { // * set to red\n color = {\n h: 0,\n s: 100,\n l: 50,\n a: 1\n };\n } else if(typeof(color) === 'string') {\n if(color[0] === '#') {\n color = hexaToHsla(color);\n } else {\n const rgb = color.match(/[.?\\d]+/g);\n color = rgbaToHsla(+rgb[0], +rgb[1], +rgb[2], rgb[3] === undefined ? 1 : +rgb[3]);\n }\n }\n\n // Set box\n this.boxRect = this.elements.box.getBoundingClientRect();\n\n const boxX = this.boxRect.width / 100 * color.s;\n const percentY = 100 - (color.l / (100 - color.s / 2)) * 100;\n const boxY = this.boxRect.height / 100 * percentY;\n\n this.saturationHandler(this.boxRect.left + boxX, this.boxRect.top + boxY, false);\n\n // Set hue\n this.hueRect = this.elements.hue.getBoundingClientRect();\n\n const percentHue = color.h / 360;\n const hueX = this.hueRect.left + this.hueRect.width * percentHue;\n\n this.hueHandler(hueX, false);\n\n // Set values\n this.hue = color.h;\n this.saturation = color.s;\n this.lightness = color.l;\n this.alpha = color.a;\n\n this.updatePicker(updateHexInput, updateRgbInput);\n };\n\n public getCurrentColor(): ColorPickerColor {\n const rgbaArray = hslaToRgba(this.hue, this.saturation, this.lightness, this.alpha);\n const hexa = rgbaToHexa(rgbaArray);\n const hex = hexa.slice(0, -2);\n\n return {\n hsl: `hsl(${this.hue}, ${this.saturation}%, ${this.lightness}%)`,\n rgb: `rgb(${rgbaArray[0]}, ${rgbaArray[1]}, ${rgbaArray[2]})`,\n hex: hex,\n hsla: `hsla(${this.hue}, ${this.saturation}%, ${this.lightness}%, ${this.alpha})`,\n rgba: `rgba(${rgbaArray[0]}, ${rgbaArray[1]}, ${rgbaArray[2]}, ${rgbaArray[3]})`,\n hexa: hexa,\n rgbaArray: rgbaArray\n };\n }\n\n public updatePicker(updateHexInput = true, updateRgbInput = true) {\n const color = this.getCurrentColor();\n this.elements.boxDragger.setAttributeNS(null, 'fill', color.hex);\n\n if(updateHexInput) {\n this.hexInputField.setValueSilently(color.hex);\n this.hexInputField.setState(InputState.Neutral);\n }\n\n if(updateRgbInput) {\n this.rgbInputField.setValueSilently(color.rgbaArray.slice(0, -1).join(', '));\n this.rgbInputField.setState(InputState.Neutral);\n }\n\n if(this.onChange) {\n this.onChange(color);\n }\n }\n\n private hueHandler(pageX: number, update = true) {\n const eventX = clamp(pageX - this.hueRect.left, 0, this.hueRect.width);\n\n const percents = eventX / this.hueRect.width;\n this.hue = Math.round(360 * percents);\n\n const hsla = `hsla(${this.hue}, 100%, 50%, ${this.alpha})`;\n\n this.elements.hueDragger.setAttributeNS(null, 'x', (percents * 100) + '%');\n this.elements.hueDragger.setAttributeNS(null, 'fill', hsla);\n\n this.elements.saturation.lastElementChild.setAttributeNS(null, 'stop-color', hsla);\n\n if(update) {\n this.updatePicker();\n }\n }\n\n private saturationHandler(pageX: number, pageY: number, update = true) {\n const maxX = this.boxRect.width;\n const maxY = this.boxRect.height;\n\n const eventX = clamp(pageX - this.boxRect.left, 0, maxX);\n const eventY = clamp(pageY - this.boxRect.top, 0, maxY);\n\n const posX = eventX / maxX * 100;\n const posY = eventY / maxY * 100;\n\n const boxDragger = this.elements.boxDragger;\n boxDragger.setAttributeNS(null, 'x', posX + '%');\n boxDragger.setAttributeNS(null, 'y', posY + '%');\n\n const saturation = clamp(posX, 0, 100);\n\n const lightnessX = 100 - saturation / 2;\n const lightnessY = 100 - clamp(posY, 0, 100);\n\n const lightness = clamp(lightnessY / 100 * lightnessX, 0, 100);\n\n this.saturation = saturation;\n this.lightness = lightness;\n\n if(update) {\n this.updatePicker();\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 {AppTheme} from '../../../config/state';\nimport {hexaToRgba} from '../../../helpers/color';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport highlightningColor from '../../../helpers/highlightningColor';\nimport throttle from '../../../helpers/schedulers/throttle';\nimport themeController from '../../../helpers/themeController';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport rootScope from '../../../lib/rootScope';\nimport ColorPicker, {ColorPickerColor} from '../../colorPicker';\nimport SettingSection from '../../settingSection';\nimport {SliderSuperTab} from '../../slider';\nimport {WallPaper} from '../../../layer';\n\nexport default class AppBackgroundColorTab extends SliderSuperTab {\n private colorPicker: ColorPicker;\n private grid: HTMLElement;\n private applyColor: (hex: string, updateColorPicker?: boolean) => void;\n private theme: AppTheme;\n\n init() {\n this.container.classList.add('background-container', 'background-color-container');\n this.setTitle('SetColor');\n\n this.theme = themeController.getTheme();\n\n const section = new SettingSection({});\n this.colorPicker = new ColorPicker();\n\n section.content.append(this.colorPicker.container);\n\n this.scrollable.append(section.container);\n\n const gridSection = new SettingSection({});\n\n const grid = this.grid = document.createElement('div');\n grid.classList.add('grid');\n\n const colors = [\n '#E6EBEE',\n '#B2CEE1',\n '#008DD0',\n '#C6E7CB',\n '#C4E1A6',\n '#60B16E',\n '#CCD0AF',\n '#A6A997',\n '#7A7072',\n '#FDD7AF',\n '#FDB76E',\n '#DD8851'\n ];\n\n colors.forEach((color) => {\n const item = document.createElement('div');\n item.classList.add('grid-item');\n item.dataset.color = color.toLowerCase();\n\n // * need for transform scale\n const media = document.createElement('div');\n media.classList.add('grid-item-media');\n media.style.backgroundColor = color;\n\n item.append(media);\n grid.append(item);\n });\n\n attachClickEvent(grid, (e) => {\n const target = findUpClassName(e.target, 'grid-item');\n if(!target || target.classList.contains('active')) {\n return;\n }\n\n const color = target.dataset.color;\n if(!color) {\n return;\n }\n\n this.applyColor(color);\n }, {listenerSetter: this.listenerSetter});\n\n gridSection.content.append(grid);\n this.scrollable.append(gridSection.container);\n\n this.applyColor = throttle(this._applyColor, 16, true);\n }\n\n private setActive() {\n const active = this.grid.querySelector('.active');\n const background = this.theme.settings;\n const wallPaper = background.wallpaper;\n const color = wallPaper.settings.background_color;\n const target = color ? this.grid.querySelector(`.grid-item[data-color=\"${color}\"]`) : null;\n if(active === target) {\n return;\n }\n\n if(active) {\n active.classList.remove('active');\n }\n\n if(target) {\n target.classList.add('active');\n }\n }\n\n private _applyColor = (hex: string, updateColorPicker = true) => {\n if(updateColorPicker) {\n this.colorPicker.setColor(hex);\n } else {\n const rgba = hexaToRgba(hex);\n const settings = this.theme.settings;\n const hsla = highlightningColor(rgba);\n\n const wallPaper: WallPaper.wallPaperNoFile = {\n _: 'wallPaperNoFile',\n id: 0,\n pFlags: {},\n settings: {\n _: 'wallPaperSettings',\n background_color: parseInt(hex.slice(1), 16),\n pFlags: {}\n }\n };\n\n settings.wallpaper = wallPaper;\n settings.highlightningColor = hsla;\n\n this.managers.appStateManager.pushToState('settings', rootScope.settings);\n\n appImManager.applyCurrentTheme(undefined, undefined, true);\n this.setActive();\n }\n };\n\n private onColorChange = (color: ColorPickerColor) => {\n this.applyColor(color.hex, false);\n };\n\n onOpen() {\n setTimeout(() => {\n const settings = this.theme.settings;\n const color = settings?.wallpaper?.settings?.background_color;\n\n const isColored = !!color && settings.wallpaper._ === 'wallPaperNoFile';\n\n // * set active if type is color\n if(isColored) {\n this.colorPicker.onChange = this.onColorChange;\n }\n\n this.colorPicker.setColor((color && '#' + color.toString(16)) || '#cccccc');\n\n if(!isColored) {\n this.colorPicker.onChange = this.onColorChange;\n }\n }, 0);\n }\n\n onCloseAfterTimeout() {\n this.colorPicker.onChange = undefined;\n this.colorPicker = undefined;\n\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 {averageColor, averageColorFromCanvas} from '../../../helpers/averageColor';\nimport blur from '../../../helpers/blur';\nimport deferredPromise, {CancellablePromise} from '../../../helpers/cancellablePromise';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport highlightningColor from '../../../helpers/highlightningColor';\nimport copy from '../../../helpers/object/copy';\nimport sequentialDom from '../../../helpers/sequentialDom';\nimport ChatBackgroundGradientRenderer from '../../chat/gradientRenderer';\nimport {Document, PhotoSize, WallPaper, WebDocument} from '../../../layer';\nimport {MyDocument} from '../../../lib/appManagers/appDocsManager';\nimport appDownloadManager, {AppDownloadManager, DownloadBlob} from '../../../lib/appManagers/appDownloadManager';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport rootScope from '../../../lib/rootScope';\nimport Button from '../../button';\nimport CheckboxField from '../../checkboxField';\nimport ProgressivePreloader from '../../preloader';\nimport {SliderSuperTab} from '../../slider';\nimport AppBackgroundColorTab from './backgroundColor';\nimport choosePhotoSize from '../../../lib/appManagers/utils/photos/choosePhotoSize';\nimport {STATE_INIT, AppTheme} from '../../../config/state';\nimport themeController from '../../../helpers/themeController';\nimport requestFile from '../../../helpers/files/requestFile';\nimport {renderImageFromUrlPromise} from '../../../helpers/dom/renderImageFromUrl';\nimport scaleMediaElement from '../../../helpers/canvas/scaleMediaElement';\nimport {MediaSize} from '../../../helpers/mediaSize';\nimport wrapPhoto from '../../wrappers/photo';\nimport {CreateRowFromCheckboxField} from '../../row';\nimport {generateSection} from '../../settingSection';\nimport {getColorsFromWallPaper} from '../../../helpers/color';\n\nexport default class AppBackgroundTab extends SliderSuperTab {\n public static tempId = 0;\n private grid: HTMLElement;\n private clicked: Set = new Set();\n private blurCheckboxField: CheckboxField;\n\n private wallPapersByElement: Map = new Map();\n private elementsByKey: Map = new Map();\n\n public static getInitArgs() {\n return {\n backgrounds: rootScope.managers.appThemesManager.getWallPapers()\n };\n }\n\n private get theme() {\n return themeController.getTheme();\n }\n\n public init(p: ReturnType = AppBackgroundTab.getInitArgs()) {\n this.container.classList.add('background-container', 'background-image-container');\n this.setTitle('ChatBackground');\n\n {\n const container = generateSection(this.scrollable);\n\n const uploadButton = Button('btn-primary btn-transparent', {icon: 'cameraadd', text: 'ChatBackground.UploadWallpaper'});\n const colorButton = Button('btn-primary btn-transparent', {icon: 'colorize', text: 'SetColor'});\n const resetButton = Button('btn-primary btn-transparent', {icon: 'favourites', text: 'Appearance.Reset'});\n\n attachClickEvent(uploadButton, this.onUploadClick, {listenerSetter: this.listenerSetter});\n\n attachClickEvent(colorButton, () => {\n this.slider.createTab(AppBackgroundColorTab).open();\n }, {listenerSetter: this.listenerSetter});\n\n attachClickEvent(resetButton, this.onResetClick, {listenerSetter: this.listenerSetter});\n\n const wallPaper = this.theme.settings?.wallpaper;\n const blurCheckboxField = this.blurCheckboxField = new CheckboxField({\n text: 'ChatBackground.Blur',\n name: 'blur',\n checked: (wallPaper as WallPaper.wallPaper)?.settings?.pFlags?.blur\n });\n\n this.listenerSetter.add(blurCheckboxField.input)('change', async() => {\n this.theme.settings.wallpaper.settings.pFlags.blur = blurCheckboxField.input.checked || undefined;\n await this.managers.appStateManager.pushToState('settings', rootScope.settings);\n\n // * wait for animation end\n setTimeout(() => {\n const active = grid.querySelector('.active') as HTMLElement;\n if(!active) return;\n\n const wallpaper = this.wallPapersByElement.get(active);\n if((wallpaper as WallPaper.wallPaper).pFlags.pattern || wallpaper._ === 'wallPaperNoFile') {\n return;\n }\n\n AppBackgroundTab.setBackgroundDocument(wallpaper);\n }, 100);\n });\n\n container.append(\n uploadButton,\n colorButton,\n resetButton,\n CreateRowFromCheckboxField(blurCheckboxField).container\n );\n }\n\n rootScope.addEventListener('background_change', this.setActive);\n\n const promise = p.backgrounds.then((wallPapers) => {\n const promises = wallPapers.map((wallPaper) => {\n return this.addWallPaper(wallPaper);\n });\n\n return Promise.all(promises);\n });\n\n const gridContainer = generateSection(this.scrollable);\n const grid = this.grid = document.createElement('div');\n grid.classList.add('grid');\n attachClickEvent(grid, this.onGridClick, {listenerSetter: this.listenerSetter});\n gridContainer.append(grid);\n\n return promise;\n }\n\n private onUploadClick = () => {\n requestFile('image/x-png,image/png,image/jpeg').then(async(file) => {\n if(file.name.endsWith('.png')) {\n const img = document.createElement('img');\n const url = URL.createObjectURL(file);\n await renderImageFromUrlPromise(img, url, false);\n const mimeType = 'image/jpeg';\n const {blob} = await scaleMediaElement({media: img, size: new MediaSize(img.naturalWidth, img.naturalHeight), mimeType});\n file = new File([blob], file.name.replace(/\\.png$/, '.jpg'), {type: mimeType});\n }\n\n const wallPaper = await this.managers.appDocsManager.prepareWallPaperUpload(file);\n const uploadPromise = this.managers.appDocsManager.uploadWallPaper(wallPaper.id);\n const uploadDeferred: CancellablePromise = appDownloadManager.getNewDeferredForUpload(file.name, uploadPromise);\n\n const deferred = deferredPromise();\n deferred.addNotifyListener = uploadDeferred.addNotifyListener;\n deferred.cancel = uploadDeferred.cancel;\n\n uploadDeferred.then((wallPaper) => {\n this.clicked.delete(key);\n this.elementsByKey.delete(key);\n this.wallPapersByElement.set(container, wallPaper);\n const newKey = this.getWallPaperKey(wallPaper);\n this.elementsByKey.set(newKey, container);\n\n AppBackgroundTab.setBackgroundDocument(wallPaper).then(deferred.resolve, deferred.reject);\n }, deferred.reject);\n\n const key = this.getWallPaperKey(wallPaper);\n deferred.catch(() => {\n container.remove();\n });\n\n const preloader = new ProgressivePreloader({\n isUpload: true,\n cancelable: true,\n tryAgainOnFail: false\n });\n\n const {container} = await this.addWallPaper(wallPaper, false);\n this.clicked.add(key);\n\n preloader.attach(container, false, deferred);\n });\n };\n\n private onResetClick = () => {\n const defaultTheme = STATE_INIT.settings.themes.find((t) => t.name === this.theme.name);\n if(defaultTheme) {\n ++AppBackgroundTab.tempId;\n this.theme.settings = copy(defaultTheme.settings);\n this.managers.appStateManager.pushToState('settings', rootScope.settings);\n appImManager.applyCurrentTheme(undefined, undefined, true);\n this.blurCheckboxField.setValueSilently(this.theme.settings?.wallpaper?.settings?.pFlags?.blur);\n }\n };\n\n private getWallPaperKey(wallPaper: WallPaper) {\n return '' + wallPaper.id;\n }\n\n private getWallPaperKeyFromTheme(theme: AppTheme) {\n return '' + (this.getWallPaperKey(theme.settings?.wallpaper) || '');\n }\n\n public static addWallPaper(\n wallPaper: WallPaper,\n container = document.createElement('div')\n ) {\n const colors = getColorsFromWallPaper(wallPaper);\n const hasFile = wallPaper._ === 'wallPaper';\n if((hasFile && wallPaper.pFlags.pattern && !colors)/* ||\n (wallpaper.document as MyDocument).mime_type.indexOf('application/') === 0 */) {\n return;\n }\n\n const isDark = !!wallPaper.pFlags.dark;\n\n let doc: WebDocument.webDocumentNoProxy | Document.document = hasFile ? wallPaper.document as Document.document : undefined;\n if(hasFile && !doc) {\n doc = {\n _: 'webDocumentNoProxy',\n attributes: [],\n size: 100000,\n url: 'assets/img/pattern.svg',\n w: 1440,\n h: 2960,\n mime_type: 'image/svg+xml'\n };\n }\n\n container.classList.add('background-item');\n container.dataset.id = '' + wallPaper.id;\n\n const media = document.createElement('div');\n media.classList.add('background-item-media');\n\n const loadPromises: Promise[] = [];\n let wrapped: ReturnType, size: ReturnType;\n if(hasFile) {\n size = choosePhotoSize(doc, 200, 200);\n wrapped = wrapPhoto({\n photo: doc,\n message: null,\n container: media,\n withoutPreloader: true,\n size,\n noFadeIn: wallPaper.pFlags.pattern\n });\n\n if(wallPaper.pFlags.pattern) {\n media.classList.add('is-pattern');\n }\n\n const promise = wrapped.then(async({loadPromises, images}) => {\n await loadPromises.thumb || loadPromises.full;\n return images;\n }).then((images) => {\n if(wallPaper.pFlags.pattern) {\n if(isDark) {\n images.full.style.display = 'none';\n if(images.thumb) {\n images.thumb.style.display = 'none';\n }\n } else if(wallPaper.settings?.intensity) {\n images.full.style.opacity = '' + Math.abs(wallPaper.settings.intensity) / 100;\n }\n }\n\n return sequentialDom.mutate(() => {\n container.append(media);\n });\n });\n\n loadPromises.push(promise);\n } else {\n container.append(media);\n }\n\n if(wallPaper.settings?.background_color) {\n const {canvas} = ChatBackgroundGradientRenderer.create(colors);\n canvas.classList.add('background-colors-canvas');\n\n if(isDark && hasFile) {\n const promise = wrapped.then(({loadPromises}) => {\n return loadPromises.full.then(async() => {\n const cacheContext = await rootScope.managers.thumbsStorage.getCacheContext(doc, size.type);\n canvas.style.webkitMaskImage = `url(${cacheContext.url})`;\n canvas.style.opacity = '' + (wallPaper.pFlags.dark ? 100 + wallPaper.settings.intensity : wallPaper.settings.intensity) / 100;\n media.append(canvas);\n });\n });\n\n loadPromises.push(promise);\n } else {\n media.append(canvas);\n }\n }\n\n return {\n container,\n media,\n loadPromise: Promise.all(loadPromises)\n };\n }\n\n private addWallPaper(wallPaper: WallPaper, append = true) {\n const result = AppBackgroundTab.addWallPaper(wallPaper);\n if(result) {\n const {container, media} = result;\n container.classList.add('grid-item');\n media.classList.add('grid-item-media');\n\n const key = this.getWallPaperKey(wallPaper);\n this.wallPapersByElement.set(container, wallPaper);\n this.elementsByKey.set(key, container);\n\n if(this.getWallPaperKeyFromTheme(this.theme) === key) {\n container.classList.add('active');\n }\n\n this.grid[append ? 'append' : 'prepend'](container);\n }\n\n return result && result.loadPromise.then(() => result);\n }\n\n private onGridClick = (e: MouseEvent | TouchEvent) => {\n const target = findUpClassName(e.target, 'grid-item') as HTMLElement;\n if(!target) return;\n\n const wallpaper = this.wallPapersByElement.get(target);\n if(wallpaper._ === 'wallPaperNoFile') {\n AppBackgroundTab.setBackgroundDocument(wallpaper);\n return;\n }\n\n const key = this.getWallPaperKey(wallpaper);\n if(this.clicked.has(key)) return;\n this.clicked.add(key);\n\n const doc = wallpaper.document as MyDocument;\n const preloader = new ProgressivePreloader({\n cancelable: true,\n tryAgainOnFail: false\n });\n\n const load = async() => {\n const promise = AppBackgroundTab.setBackgroundDocument(wallpaper);\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc);\n if(!cacheContext.url || this.theme.settings?.wallpaper?.settings?.pFlags?.blur) {\n preloader.attach(target, true, promise);\n }\n };\n\n preloader.construct();\n\n attachClickEvent(target, (e) => {\n if(preloader.preloader.parentElement) {\n preloader.onClick(e);\n preloader.detach();\n } else {\n load();\n }\n }, {listenerSetter: this.listenerSetter});\n\n load();\n\n // console.log(doc);\n };\n\n public static setBackgroundDocument = (wallPaper: WallPaper, themeSettings?: AppTheme['settings']) => {\n const _tempId = ++this.tempId;\n const middleware = () => _tempId === this.tempId;\n\n const doc = (wallPaper as WallPaper.wallPaper).document as MyDocument;\n const deferred = deferredPromise();\n let download: Promise | ReturnType;\n if(doc) {\n download = appDownloadManager.downloadMediaURL({\n media: doc,\n queueId: appImManager.chat.bubbles ? appImManager.chat.bubbles.lazyLoadQueue.queueId : 0\n });\n deferred.addNotifyListener = download.addNotifyListener;\n deferred.cancel = download.cancel;\n } else {\n download = Promise.resolve();\n }\n\n const saveToCache = (slug: string, url: string) => {\n fetch(url).then((response) => {\n appImManager.cacheStorage.save('backgrounds/' + slug, response);\n });\n };\n\n download.then(async() => {\n if(!middleware()) {\n deferred.resolve();\n return;\n }\n\n const hadSettings = !!themeSettings;\n themeSettings ??= themeController.getTheme().settings;\n const onReady = (url?: string) => {\n let getPixelPromise: Promise;\n const backgroundColor = getColorsFromWallPaper(wallPaper);\n if(url && !backgroundColor) {\n getPixelPromise = averageColor(url);\n } else {\n const {canvas} = ChatBackgroundGradientRenderer.create(backgroundColor);\n getPixelPromise = Promise.resolve(averageColorFromCanvas(canvas));\n }\n\n const slug = (wallPaper as WallPaper.wallPaper).slug ?? '';\n Promise.all([\n getPixelPromise,\n slug && saveToCache(slug, url)\n ]).then(([pixel]) => {\n if(!middleware()) {\n deferred.resolve();\n return;\n }\n\n const hsla = highlightningColor(Array.from(pixel) as any);\n\n themeSettings.wallpaper = wallPaper;\n themeSettings.highlightningColor = hsla;\n\n if(!hadSettings) {\n rootScope.managers.appStateManager.pushToState('settings', rootScope.settings);\n }\n\n appImManager.applyCurrentTheme(slug, url, true).then(deferred.resolve);\n });\n };\n\n if(!doc) {\n onReady();\n return;\n }\n\n const cacheContext = await rootScope.managers.thumbsStorage.getCacheContext(doc);\n if(themeSettings.wallpaper?.settings?.pFlags?.blur) {\n setTimeout(() => {\n const {canvas, promise} = blur(cacheContext.url, 12, 4);\n promise.then(() => {\n if(!middleware()) {\n deferred.resolve();\n return;\n }\n\n onReady(canvas.toDataURL());\n });\n }, 200);\n } else if(middleware()) {\n onReady(cacheContext.url);\n }\n });\n\n return deferred;\n };\n\n private setActive = () => {\n const active = this.grid.querySelector('.active');\n const target = this.elementsByKey.get(this.getWallPaperKeyFromTheme(this.theme));\n if(active === target) {\n return;\n }\n\n if(active) {\n active.classList.remove('active');\n }\n\n if(target) {\n target.classList.add('active');\n }\n };\n}\n","export default function requestFile(accept?: string) {\n const input = document.createElement('input');\n input.type = 'file';\n input.style.display = 'none';\n\n if(accept) {\n input.accept = accept;\n }\n\n document.body.append(input);\n\n const promise = new Promise((resolve, reject) => {\n input.addEventListener('change', (e: any) => {\n const file: File = e.target.files[0];\n if(!file) {\n reject('NO_FILE_SELECTED');\n return;\n }\n\n resolve(file);\n }, {once: true});\n }).finally(() => {\n input.remove();\n });\n\n input.click();\n\n return promise;\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 AppSelectPeers from '../../appSelectPeers';\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport {MyDialogFilter as DialogFilter} from '../../../lib/storages/filters';\nimport ButtonIcon from '../../buttonIcon';\nimport CheckboxField from '../../checkboxField';\nimport Button from '../../button';\nimport AppEditFolderTab from './editFolder';\nimport I18n, {i18n, LangPackKey, _i18n, join} from '../../../lib/langPack';\nimport {toast} from '../../toast';\nimport copy from '../../../helpers/object/copy';\nimport forEachReverse from '../../../helpers/array/forEachReverse';\nimport setInnerHTML from '../../../helpers/dom/setInnerHTML';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport {REAL_FOLDERS} from '../../../lib/mtproto/mtproto_config';\nimport rootScope from '../../../lib/rootScope';\nimport {MTAppConfig} from '../../../lib/mtproto/appConfig';\nimport {attachClickEvent, simulateClickEvent} from '../../../helpers/dom/clickEvent';\nimport SettingSection from '../../settingSection';\n\nexport default class AppIncludedChatsTab extends SliderSuperTab {\n private editFolderTab: AppEditFolderTab;\n private confirmBtn: HTMLElement;\n\n private selector: AppSelectPeers;\n private type: 'included' | 'excluded';\n private filter: DialogFilter;\n private originalFilter: DialogFilter;\n\n private dialogsByFilters: Map>;\n private limit: number;\n\n public init(\n filter: DialogFilter,\n type: 'included' | 'excluded',\n editFolderTab: AppIncludedChatsTab['editFolderTab']\n ) {\n this.originalFilter = filter;\n this.filter = copy(this.originalFilter);\n this.type = type;\n this.editFolderTab = editFolderTab;\n\n this.content.remove();\n this.container.classList.add('included-chatlist-container');\n this.confirmBtn = ButtonIcon('check btn-confirm blue', {noRipple: true});\n this.confirmBtn.style.display = 'none';\n\n this.header.append(this.confirmBtn);\n\n attachClickEvent(this.confirmBtn, async() => {\n const selected = this.selector.getSelected();\n\n // this.filter.pFlags = {};\n\n if(this.type === 'included') {\n for(const key in this.filter.pFlags) {\n if(key.indexOf('exclude_') === 0) {\n continue;\n }\n\n // @ts-ignore\n delete this.filter.pFlags[key];\n }\n } else {\n for(const key in this.filter.pFlags) {\n if(key.indexOf('exclude_') !== 0) {\n continue;\n }\n\n // @ts-ignore\n delete this.filter.pFlags[key];\n }\n }\n\n const peerIds: PeerId[] = [];\n for(const key of selected) {\n if(key.isPeerId()) {\n peerIds.push(key.toPeerId());\n } else {\n // @ts-ignore\n this.filter.pFlags[key] = true;\n }\n }\n\n let cmp: (peerId: PeerId) => boolean;\n if(this.type === 'included') {\n cmp = (peerId) => peerIds.includes(peerId);\n } else {\n cmp = (peerId) => !peerIds.includes(peerId);\n }\n\n forEachReverse(this.filter.pinnedPeerIds, (peerId, idx) => {\n if(!cmp(peerId)) {\n this.filter.pinnedPeerIds.splice(idx, 1);\n this.filter.pinned_peers.splice(idx, 1);\n }\n });\n\n const other = this.type === 'included' ? 'excludePeerIds' : 'includePeerIds';\n const otherLegacy = this.type === 'included' ? 'exclude_peers' : 'include_peers';\n forEachReverse(this.filter[other], (peerId, idx) => {\n if(peerIds.includes(peerId)) {\n this.filter[other].splice(idx, 1);\n this.filter[otherLegacy].splice(idx, 1);\n }\n });\n\n this.filter[this.type === 'included' ? 'includePeerIds' : 'excludePeerIds'] = peerIds;\n this.filter[this.type === 'included' ? 'include_peers' : 'exclude_peers'] = await Promise.all(peerIds.map((peerId) => this.managers.appPeersManager.getInputPeerById(peerId)));\n // this.filter.pinned_peers = this.filter.pinned_peers.filter((peerId) => this.filter.include_peers.includes(peerId));\n\n this.editFolderTab.setFilter(this.filter, false);\n this.close();\n }, {listenerSetter: this.listenerSetter});\n\n const onAppConfig = (appConfig: MTAppConfig) => {\n this.limit = rootScope.premium ? appConfig.dialog_filters_chats_limit_premium : appConfig.dialog_filters_chats_limit_default;\n };\n\n this.listenerSetter.add(rootScope)('app_config', onAppConfig);\n\n this.dialogsByFilters = new Map();\n return Promise.all([\n this.managers.filtersStorage.getDialogFilters().then(async(filters) => {\n await Promise.all(filters.filter((filter) => !REAL_FOLDERS.has(filter.id)).map(async(filter) => {\n const dialogs = await this.managers.dialogsStorage.getFolderDialogs(filter.id);\n const peerIds = dialogs.map((d) => d.peerId);\n this.dialogsByFilters.set(filter, new Set(peerIds));\n }));\n }),\n\n this.managers.apiManager.getAppConfig().then((appConfig) => {\n onAppConfig(appConfig);\n })\n ]);\n }\n\n checkbox(selected?: boolean) {\n const checkboxField = new CheckboxField({\n round: true\n });\n if(selected) {\n checkboxField.input.checked = selected;\n }\n\n return checkboxField.label;\n }\n\n renderResults = async(peerIds: PeerId[]) => {\n // const other = this.type === 'included' ? this.filter.exclude_peers : this.filter.include_peers;\n\n await this.managers.appUsersManager.getContacts();\n peerIds.forEach((peerId) => {\n // if(other.includes(peerId)) return;\n\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: this.selector.scrollable,\n rippleEnabled: true,\n avatarSize: 'abitbigger'\n });\n\n const selected = this.selector.selected.has(peerId);\n dom.containerEl.append(this.checkbox(selected));\n // if(selected) dom.listEl.classList.add('active');\n\n const foundInFilters: HTMLElement[] = [];\n this.dialogsByFilters.forEach((dialogs, filter) => {\n if(dialogs.has(peerId)) {\n const span = document.createElement('span');\n setInnerHTML(span, wrapEmojiText(filter.title));\n foundInFilters.push(span);\n }\n });\n\n const joined = join(foundInFilters, false);\n joined.forEach((el) => {\n dom.lastMessageSpan.append(el);\n });\n });\n };\n\n onOpen() {\n this.confirmBtn.style.display = this.type === 'excluded' ? '' : 'none';\n this.setTitle(this.type === 'included' ? 'FilterAlwaysShow' : 'FilterNeverShow');\n\n const filter = this.filter;\n\n const categoriesSection = new SettingSection({\n noDelimiter: true,\n name: 'FilterChatTypes'\n });\n\n categoriesSection.container.classList.add('folder-categories');\n\n let details: {[flag: string]: {ico: string, text: LangPackKey}};\n if(this.type === 'excluded') {\n details = {\n exclude_muted: {ico: 'mute', text: 'ChatList.Filter.MutedChats'},\n exclude_archived: {ico: 'archive', text: 'ChatList.Filter.Archive'},\n exclude_read: {ico: 'readchats', text: 'ChatList.Filter.ReadChats'}\n };\n } else {\n details = {\n contacts: {ico: 'newprivate', text: 'ChatList.Filter.Contacts'},\n non_contacts: {ico: 'noncontacts', text: 'ChatList.Filter.NonContacts'},\n groups: {ico: 'group', text: 'ChatList.Filter.Groups'},\n broadcasts: {ico: 'newchannel', text: 'ChatList.Filter.Channels'},\n bots: {ico: 'bots', text: 'ChatList.Filter.Bots'}\n };\n }\n\n const f = document.createDocumentFragment();\n for(const key in details) {\n const button = Button('btn-primary btn-transparent folder-category-button', {icon: details[key].ico, text: details[key].text});\n button.dataset.peerId = key;\n button.append(this.checkbox());\n f.append(button);\n }\n categoriesSection.content.append(f);\n\n // ///////////////\n\n const selectedPeers = (this.type === 'included' ? filter.includePeerIds : filter.excludePeerIds).slice();\n\n this.selector = new AppSelectPeers({\n appendTo: this.container,\n onChange: this.onSelectChange,\n peerType: ['dialogs'],\n renderResultsFunc: this.renderResults,\n placeholder: 'Search',\n sectionNameLangPackKey: 'FilterChats',\n managers: this.managers\n });\n this.selector.selected = new Set(selectedPeers);\n\n let addedInitial = false;\n const _add = this.selector.add.bind(this.selector);\n this.selector.add = (peerId, title, scroll) => {\n if(this.selector.selected.size >= this.limit && addedInitial && !details[peerId]) {\n const el: HTMLInputElement = this.selector.list.querySelector(`[data-peer-id=\"${peerId}\"] [type=\"checkbox\"]`);\n if(el) {\n setTimeout(() => {\n el.checked = false;\n }, 0);\n }\n\n const str = I18n.format(this.type === 'excluded' ? 'ChatList.Filter.Exclude.LimitReached': 'ChatList.Filter.Include.LimitReached', true);\n toast(str);\n return;\n }\n\n const div = _add(peerId, details[peerId] ? i18n(details[peerId].text) : undefined, scroll);\n if(details[peerId]) {\n div.querySelector('avatar-element').classList.add('tgico-' + details[peerId].ico);\n }\n return div;\n };\n\n this.selector.scrollable.container.append(categoriesSection.container, this.selector.scrollable.container.lastElementChild);\n\n this.selector.addInitial(selectedPeers);\n addedInitial = true;\n\n for(const flag in filter.pFlags) {\n // @ts-ignore\n if(details.hasOwnProperty(flag) && !!filter.pFlags[flag]) {\n simulateClickEvent(categoriesSection.content.querySelector(`[data-peer-id=\"${flag}\"]`) as HTMLElement);\n }\n }\n }\n\n onSelectChange = (length: number) => {\n // const changed = !deepEqual(this.filter, this.originalFilter);\n if(this.type === 'included') {\n this.confirmBtn.style.display = length ? '' : 'none';\n }\n };\n\n onCloseAfterTimeout() {\n if(this.selector) {\n this.selector.container.remove();\n this.selector = null;\n }\n\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 appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport {MyDialogFilter as DialogFilter} from '../../../lib/storages/filters';\nimport lottieLoader, {LottieLoader} from '../../../lib/rlottie/lottieLoader';\nimport {SliderSuperTab} from '../../slider';\nimport {toast} from '../../toast';\nimport InputField from '../../inputField';\nimport ButtonIcon from '../../buttonIcon';\nimport ButtonMenuToggle from '../../buttonMenuToggle';\nimport {ButtonMenuItemOptions} from '../../buttonMenu';\nimport Button from '../../button';\nimport AppIncludedChatsTab from './includedChats';\nimport {i18n, LangPackKey} from '../../../lib/langPack';\nimport PopupPeer from '../../popups/peer';\nimport RLottiePlayer from '../../../lib/rlottie/rlottiePlayer';\nimport copy from '../../../helpers/object/copy';\nimport deepEqual from '../../../helpers/object/deepEqual';\nimport wrapDraftText from '../../../lib/richTextProcessor/wrapDraftText';\nimport filterAsync from '../../../helpers/array/filterAsync';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport SettingSection from '../../settingSection';\n\nconst MAX_FOLDER_NAME_LENGTH = 12;\n\nexport default class AppEditFolderTab extends SliderSuperTab {\n private caption: HTMLElement;\n private stickerContainer: HTMLElement;\n\n private confirmBtn: HTMLElement;\n private menuBtn: HTMLElement;\n private nameInputField: InputField;\n\n private includePeerIds: SettingSection;\n private excludePeerIds: SettingSection;\n private flags: {[k in 'contacts' | 'non_contacts' | 'groups' | 'broadcasts' | 'bots' | 'exclude_muted' | 'exclude_archived' | 'exclude_read']: HTMLElement} = {} as any;\n\n private animation: RLottiePlayer;\n private filter: DialogFilter;\n private originalFilter: DialogFilter;\n\n private type: 'edit' | 'create';\n private loadAnimationPromise: ReturnType;\n\n public static getInitArgs() {\n return {\n animationData: lottieLoader.loadAnimationFromURLManually('Folders_2')\n };\n }\n\n public init(p: ReturnType = AppEditFolderTab.getInitArgs()) {\n this.container.classList.add('edit-folder-container');\n this.caption = document.createElement('div');\n this.caption.classList.add('caption');\n this.caption.append(i18n('FilterIncludeExcludeInfo'));\n this.stickerContainer = document.createElement('div');\n this.stickerContainer.classList.add('sticker-container');\n\n this.confirmBtn = ButtonIcon('check btn-confirm hide blue');\n let deleting = false;\n const deleteFolderButton: ButtonMenuItemOptions = {\n icon: 'delete danger',\n text: 'FilterMenuDelete',\n onClick: () => {\n new PopupPeer('filter-delete', {\n titleLangKey: 'ChatList.Filter.Confirm.Remove.Header',\n descriptionLangKey: 'ChatList.Filter.Confirm.Remove.Text',\n buttons: [{\n langKey: 'Delete',\n callback: () => {\n if(deleting) {\n return;\n }\n\n deleting = true;\n\n this.managers.filtersStorage.updateDialogFilter(this.filter, true).then((bool) => {\n this.close();\n }).finally(() => {\n deleting = false;\n });\n },\n isDanger: true\n }]\n }).show();\n }\n };\n this.menuBtn = ButtonMenuToggle({\n listenerSetter: this.listenerSetter,\n direction: 'bottom-left',\n buttons: [deleteFolderButton]\n });\n this.menuBtn.classList.add('hide');\n\n this.header.append(this.confirmBtn, this.menuBtn);\n\n const inputSection = new SettingSection({});\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.nameInputField = new InputField({\n label: 'FilterNameHint',\n maxLength: MAX_FOLDER_NAME_LENGTH\n });\n\n inputWrapper.append(this.nameInputField.container);\n inputSection.content.append(inputWrapper);\n\n const generateList = (className: string, h2Text: LangPackKey, buttons: {icon: string, name?: string, withRipple?: true, text: LangPackKey}[], to: any) => {\n const section = new SettingSection({\n name: h2Text,\n noDelimiter: true\n });\n\n section.container.classList.add('folder-list', className);\n\n const categories = section.generateContentElement();\n categories.classList.add('folder-categories');\n\n buttons.forEach((o) => {\n const button = Button('folder-category-button btn btn-primary btn-transparent', {\n icon: o.icon,\n text: o.text,\n noRipple: o.withRipple ? undefined : true\n });\n\n if(o.name) {\n to[o.name] = button;\n }\n\n categories.append(button);\n });\n\n return section;\n };\n\n this.includePeerIds = generateList('folder-list-included', 'FilterInclude', [{\n icon: 'add primary',\n text: 'ChatList.Filter.Include.AddChat',\n withRipple: true\n }, {\n text: 'ChatList.Filter.Contacts',\n icon: 'newprivate',\n name: 'contacts'\n }, {\n text: 'ChatList.Filter.NonContacts',\n icon: 'noncontacts',\n name: 'non_contacts'\n }, {\n text: 'ChatList.Filter.Groups',\n icon: 'group',\n name: 'groups'\n }, {\n text: 'ChatList.Filter.Channels',\n icon: 'channel',\n name: 'broadcasts'\n }, {\n text: 'ChatList.Filter.Bots',\n icon: 'bots',\n name: 'bots'\n }], this.flags);\n\n this.excludePeerIds = generateList('folder-list-excluded', 'FilterExclude', [{\n icon: 'minus primary',\n text: 'ChatList.Filter.Exclude.AddChat',\n withRipple: true\n }, {\n text: 'ChatList.Filter.MutedChats',\n icon: 'mute',\n name: 'exclude_muted'\n }, {\n text: 'ChatList.Filter.Archive',\n icon: 'archive',\n name: 'exclude_archived'\n }, {\n text: 'ChatList.Filter.ReadChats',\n icon: 'readchats',\n name: 'exclude_read'\n }], this.flags);\n\n this.scrollable.append(this.stickerContainer, this.caption, inputSection.container, this.includePeerIds.container, this.excludePeerIds.container);\n\n const includedFlagsContainer = this.includePeerIds.container.querySelector('.folder-categories');\n const excludedFlagsContainer = this.excludePeerIds.container.querySelector('.folder-categories');\n\n attachClickEvent(includedFlagsContainer.querySelector('.btn') as HTMLElement, () => {\n this.slider.createTab(AppIncludedChatsTab).open(this.filter, 'included', this);\n }, {listenerSetter: this.listenerSetter});\n\n attachClickEvent(excludedFlagsContainer.querySelector('.btn') as HTMLElement, () => {\n this.slider.createTab(AppIncludedChatsTab).open(this.filter, 'excluded', this);\n }, {listenerSetter: this.listenerSetter});\n\n attachClickEvent(this.confirmBtn, () => {\n if(this.nameInputField.input.classList.contains('error')) {\n return;\n }\n\n if(!this.nameInputField.value.trim()) {\n this.nameInputField.input.classList.add('error');\n return;\n }\n\n let include = (Array.from(includedFlagsContainer.children) as HTMLElement[]).slice(1).reduce((acc, el) => acc + +!el.style.display, 0);\n include += this.filter.include_peers.length;\n\n if(!include) {\n toast('Please choose at least one chat for this folder.');\n return;\n }\n\n this.confirmBtn.setAttribute('disabled', 'true');\n\n let promise: Promise;\n if(!this.filter.id) {\n promise = this.managers.filtersStorage.createDialogFilter(this.filter);\n } else {\n promise = this.managers.filtersStorage.updateDialogFilter(this.filter);\n }\n\n promise.then((bool) => {\n this.close();\n }).catch((err) => {\n if(err.type === 'DIALOG_FILTERS_TOO_MUCH') {\n toast('Sorry, you can\\'t create more folders.');\n } else {\n console.error('updateDialogFilter error:', err);\n }\n }).finally(() => {\n this.confirmBtn.removeAttribute('disabled');\n });\n }, {listenerSetter: this.listenerSetter});\n\n this.listenerSetter.add(this.nameInputField.input)('input', () => {\n this.filter.title = this.nameInputField.value;\n this.editCheckForChange();\n });\n\n const reloadMissingPromises: Promise[] = this.type === 'edit' ? [\n this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id, 'pinned_peers'),\n this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id, 'include_peers'),\n this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id, 'exclude_peers')\n ] : [];\n\n return Promise.all([\n this.loadAnimationPromise = p.animationData.then(async(cb) => {\n const player = await cb({\n container: this.stickerContainer,\n loop: false,\n autoplay: false,\n width: 86,\n height: 86\n });\n\n this.animation = player;\n\n return lottieLoader.waitForFirstFrame(player);\n }),\n\n ...reloadMissingPromises\n ]).then(() => {\n if(this.type === 'edit') {\n this.setFilter(this.originalFilter, true);\n this.onEditOpen();\n } else {\n this.setInitFilter();\n this.onCreateOpen();\n }\n });\n }\n\n onOpenAfterTimeout() {\n this.loadAnimationPromise.then(() => {\n this.animation.autoplay = true;\n this.animation.play();\n });\n }\n\n private onCreateOpen() {\n // this.caption.style.display = '';\n this.setTitle('FilterNew');\n this.menuBtn.classList.add('hide');\n this.confirmBtn.classList.remove('hide');\n\n for(const flag in this.flags) {\n // @ts-ignore\n this.flags[flag].style.display = 'none';\n }\n }\n\n private onEditOpen() {\n // this.caption.style.display = 'none';\n this.setTitle(this.type === 'create' ? 'FilterNew' : 'FilterHeaderEdit');\n\n if(this.type === 'edit') {\n this.menuBtn.classList.remove('hide');\n this.confirmBtn.classList.add('hide');\n }\n\n const filter = this.filter;\n this.nameInputField.value = wrapDraftText(filter.title);\n\n for(const flag in this.flags) {\n this.flags[flag as keyof AppEditFolderTab['flags']].style.display = !!filter.pFlags[flag as keyof AppEditFolderTab['flags']] ? '' : 'none';\n }\n\n (['includePeerIds' as const, 'excludePeerIds' as const]).forEach(async(key) => {\n const section = this[key];\n const ul = appDialogsManager.createChatList({ignoreClick: true});\n\n let peers = filter[key];\n\n // filter peers where we're kicked\n const hasPeer = async(peerId: PeerId) => {\n return !!(await this.managers.appMessagesManager.getDialogOnly(peerId)) || (peerId.isUser() ? (await this.managers.appUsersManager.getUser(peerId.toUserId()))._ === 'user' : false);\n };\n\n const filtered = await filterAsync(peers, (peerId) => hasPeer(peerId));\n peers.length = 0;\n peers.push(...filtered);\n\n peers = peers.slice();\n\n const renderMore = async(_length: number) => {\n for(let i = 0, length = Math.min(peers.length, _length); i < length; ++i) {\n const peerId = peers.shift();\n if(peerId.isUser() ? false : !(await this.managers.appMessagesManager.getDialogOnly(peerId))) {\n continue;\n }\n\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: ul,\n rippleEnabled: false,\n meAsSaved: true,\n avatarSize: 'small'\n });\n dom.lastMessageSpan.parentElement.remove();\n }\n\n if(peers.length) {\n showMore.lastElementChild.replaceWith(i18n('FilterShowMoreChats', [peers.length]));\n } else if(showMore) {\n showMore.remove();\n }\n };\n\n section.generateContentElement().append(ul);\n\n let showMore: HTMLElement;\n if(peers.length) {\n const content = section.generateContentElement();\n showMore = Button('folder-category-button btn btn-primary btn-transparent', {icon: 'down'});\n showMore.classList.add('load-more', 'rp-overflow');\n attachClickEvent(showMore, () => renderMore(20), {listenerSetter: this.listenerSetter});\n showMore.append(i18n('FilterShowMoreChats', [peers.length]));\n\n content.append(showMore);\n }\n\n renderMore(4);\n });\n }\n\n editCheckForChange() {\n if(this.type === 'edit') {\n const changed = !deepEqual(this.originalFilter, this.filter);\n this.confirmBtn.classList.toggle('hide', !changed);\n this.menuBtn.classList.toggle('hide', changed);\n }\n };\n\n setFilter(filter: DialogFilter, firstTime: boolean) {\n if(this.container) {\n // cleanup\n Array.from(this.container.querySelectorAll('ul, .load-more')).forEach((el) => el.remove());\n }\n\n if(firstTime) {\n this.originalFilter = filter;\n this.filter = copy(filter);\n } else {\n this.filter = filter;\n this.onEditOpen();\n this.editCheckForChange();\n }\n }\n\n public setInitFilter(filter?: DialogFilter) {\n if(filter === undefined) {\n this.setFilter({\n _: 'dialogFilter',\n id: 0,\n title: '',\n pFlags: {},\n pinned_peers: [],\n include_peers: [],\n exclude_peers: [],\n pinnedPeerIds: [],\n includePeerIds: [],\n excludePeerIds: []\n }, true);\n this.type = 'create';\n } else {\n this.setFilter(filter, true);\n this.type = 'edit';\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 InputField from '../../inputField';\nimport {SliderSuperTab} from '../../slider';\nimport EditPeer from '../../editPeer';\nimport {UsernameInputField} from '../../usernameInputField';\nimport {i18n, i18n_, LangPackKey} from '../../../lib/langPack';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport rootScope from '../../../lib/rootScope';\nimport setBlankToAnchor from '../../../lib/richTextProcessor/setBlankToAnchor';\nimport getPeerEditableUsername from '../../../lib/appManagers/utils/peers/getPeerEditableUsername';\nimport SettingSection, {generateSection} from '../../settingSection';\nimport UsernamesSection from '../../usernamesSection';\n\n// TODO: ะฐะฒะฐั‚ะฐั€ะบะฐ ะฝะต ะฟะพะผะตะฝัะตั‚ัั ะฒ ัั‚ะพะน ะฒะบะปะฐะดะบะต ะฟะพัะปะต ะธะทะผะตะฝะตะฝะธั ะฟะพั‡ะตะผัƒ-ั‚ะพ (ะตัะปะธ ะฟะพัั‚ะฐะฒะธั‚ัŒ ะฒ ะดั€ัƒะณะพะผ ะบะปะธะตะฝั‚ะต, ะธ ะฟะพั‚ะพะผ ั‚ัƒั‚ ะฟั€ะพะฒะตั€ะธั‚ัŒ, ะดะปั ัั‚ะพะณะพ ะตั‰ั‘ ะฒั‹ัˆะตะป ะฒ ั‡ะฐั‚ะปะธัั‚)\n\nexport function purchaseUsernameCaption() {\n const p = document.createElement('div');\n const FRAGMENT_USERNAME_URL = 'https://fragment.com/username/';\n const a = setBlankToAnchor(document.createElement('a'));\n const purchaseText = i18n('Username.Purchase', [a]);\n purchaseText.classList.add('username-purchase-help');\n p.append(\n purchaseText,\n document.createElement('br'),\n document.createElement('br')\n );\n p.classList.add('hide');\n\n return {\n element: p,\n setUsername: (username: string) => {\n if(username) {\n a.href = FRAGMENT_USERNAME_URL + username;\n }\n\n p.classList.toggle('hide', !username);\n }\n };\n}\n\nexport default class AppEditProfileTab extends SliderSuperTab {\n private firstNameInputField: InputField;\n private lastNameInputField: InputField;\n private bioInputField: InputField;\n private usernameInputField: UsernameInputField;\n\n private profileUrlContainer: HTMLDivElement;\n private profileUrlAnchor: HTMLAnchorElement;\n\n private editPeer: EditPeer;\n\n public static getInitArgs() {\n return {\n bioMaxLength: rootScope.managers.apiManager.getLimit('bio'),\n user: rootScope.managers.appUsersManager.getSelf(),\n userFull: rootScope.managers.appProfileManager.getProfile(rootScope.myId.toUserId())\n };\n }\n\n public async init(p: ReturnType) {\n this.container.classList.add('edit-profile-container');\n this.setTitle('EditAccount.Title');\n\n const inputFields: InputField[] = [];\n\n const [bioMaxLength, user, userFull] = await Promise.all([p.bioMaxLength, p.user, p.userFull]);\n\n {\n const section = generateSection(this.scrollable, undefined, 'Bio.Description');\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.firstNameInputField = new InputField({\n label: 'EditProfile.FirstNameLabel',\n name: 'first-name',\n maxLength: 70\n });\n this.lastNameInputField = new InputField({\n label: 'Login.Register.LastName.Placeholder',\n name: 'last-name',\n maxLength: 64\n });\n this.bioInputField = new InputField({\n label: 'EditProfile.BioLabel',\n name: 'bio',\n maxLength: bioMaxLength\n });\n\n inputWrapper.append(this.firstNameInputField.container, this.lastNameInputField.container, this.bioInputField.container);\n\n const caption = document.createElement('div');\n caption.classList.add('caption');\n i18n_({element: caption, key: 'Bio.Description'});\n\n inputFields.push(this.firstNameInputField, this.lastNameInputField, this.bioInputField);\n\n this.editPeer = new EditPeer({\n peerId: rootScope.myId,\n inputFields,\n listenerSetter: this.listenerSetter\n });\n\n this.content.append(this.editPeer.nextBtn);\n\n section.append(this.editPeer.avatarEdit.container, inputWrapper);\n }\n\n {\n const section = new SettingSection({\n name: 'EditAccount.Username',\n caption: true\n });\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.usernameInputField = new UsernameInputField({\n label: 'EditProfile.Username.Label',\n name: 'username',\n plainText: true,\n listenerSetter: this.listenerSetter,\n onChange: () => {\n this.editPeer.handleChange();\n // this.setProfileUrl();\n\n const {error} = this.usernameInputField;\n const isPurchase = error?.type === 'USERNAME_PURCHASE_AVAILABLE';\n setUsername(isPurchase ? this.usernameInputField.value : undefined);\n },\n availableText: 'EditProfile.Username.Available',\n takenText: 'EditProfile.Username.Taken',\n invalidText: 'EditProfile.Username.Invalid'\n }, this.managers);\n\n inputWrapper.append(this.usernameInputField.container);\n\n const caption = section.caption;\n\n const {setUsername, element: p} = purchaseUsernameCaption();\n\n caption.append(\n p,\n i18n('UsernameHelp')\n // document.createElement('br'),\n // document.createElement('br')\n );\n\n // const profileUrlContainer = this.profileUrlContainer = document.createElement('div');\n // profileUrlContainer.classList.add('profile-url-container');\n // const profileUrlAnchor = this.profileUrlAnchor = anchorCopy();\n // profileUrlContainer.append(i18n('UsernameHelpLink', [profileUrlAnchor]));\n // caption.append(profileUrlContainer);\n\n inputFields.push(this.usernameInputField);\n section.content.append(inputWrapper);\n this.scrollable.append(section.container);\n }\n\n {\n const section = new UsernamesSection({\n peerId: rootScope.myId,\n peer: user,\n listenerSetter: this.listenerSetter,\n usernameInputField: this.usernameInputField,\n middleware: this.middlewareHelper.get()\n });\n\n this.scrollable.append(section.container);\n }\n\n attachClickEvent(this.editPeer.nextBtn, () => {\n this.editPeer.nextBtn.disabled = true;\n\n const promises: Promise[] = [];\n\n const profilePromise = this.managers.appProfileManager.updateProfile(\n this.firstNameInputField.value,\n this.lastNameInputField.value,\n this.bioInputField.value\n );\n promises.push(profilePromise.then(() => {\n this.close();\n }, (err) => {\n console.error('updateProfile error:', err);\n }));\n\n if(this.editPeer.uploadAvatar) {\n promises.push(this.editPeer.uploadAvatar().then((inputFile) => {\n return this.managers.appProfileManager.uploadProfilePhoto(inputFile);\n }));\n }\n\n if(this.usernameInputField.isValidToChange()) {\n promises.push(this.managers.appUsersManager.updateUsername(this.usernameInputField.value));\n }\n\n Promise.race(promises).finally(() => {\n this.editPeer.nextBtn.removeAttribute('disabled');\n });\n }, {listenerSetter: this.listenerSetter});\n\n this.firstNameInputField.setOriginalValue(user.first_name, true);\n this.lastNameInputField.setOriginalValue(user.last_name, true);\n this.bioInputField.setOriginalValue(userFull.about, true);\n this.usernameInputField.setOriginalValue(getPeerEditableUsername(user), true);\n\n // this.setProfileUrl();\n this.editPeer.handleChange();\n }\n\n // private setProfileUrl() {\n // if(this.usernameInputField.input.classList.contains('error') || !this.usernameInputField.value.length) {\n // this.profileUrlContainer.style.display = 'none';\n // } else {\n // this.profileUrlContainer.style.display = '';\n // this.profileUrlAnchor.replaceWith(this.profileUrlAnchor = anchorCopy({mePath: this.usernameInputField.value}));\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 appImManager, {APP_TABS} from '../../lib/appManagers/appImManager';\nimport SidebarSlider from '../slider';\nimport mediaSizes, {ScreenSize} from '../../helpers/mediaSizes';\nimport AppSharedMediaTab from './tabs/sharedMedia';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nexport const RIGHT_COLUMN_ACTIVE_CLASSNAME = 'is-right-column-shown';\n\nexport class AppSidebarRight extends SidebarSlider {\n private isColumnProportionSet = false;\n private sharedMediaTab: AppSharedMediaTab;\n // public rect: DOMRect;\n\n constructor() {\n super({\n sidebarEl: document.getElementById('column-right') as HTMLElement,\n canHideFirst: true,\n navigationType: 'right'\n });\n }\n\n construct(managers: AppManagers) {\n this.managers = managers;\n\n mediaSizes.addEventListener('changeScreen', (from, to) => {\n if(to === ScreenSize.medium && from !== ScreenSize.mobile) {\n this.toggleSidebar(false);\n }\n });\n\n mediaSizes.addEventListener('resize', () => {\n this.setColumnProportion();\n });\n }\n\n public createSharedMediaTab() {\n const tab = this.createTab(AppSharedMediaTab, false, true);\n tab.slider = this;\n // this.tabsContainer.prepend(tab.container);\n return tab;\n }\n\n public replaceSharedMediaTab(tab?: AppSharedMediaTab) {\n const previousTab = this.sharedMediaTab;\n if(previousTab) {\n const idx = this.historyTabIds.indexOf(previousTab);\n\n if(this._selectTab.getFrom() === previousTab.container) {\n this._selectTab.setFrom(tab?.container);\n }\n\n if(tab) {\n if(idx !== -1) {\n this.historyTabIds[idx] = tab;\n }\n\n const wasActive = previousTab.container.classList.contains('active');\n if(wasActive) {\n tab.container.classList.add('active');\n }\n\n previousTab.container.replaceWith(tab.container);\n } else {\n if(idx !== -1) {\n this.historyTabIds.splice(idx, 1);\n }\n\n previousTab.container.remove();\n }\n } else {\n this.tabsContainer.prepend(tab.container);\n }\n\n this.sharedMediaTab = tab;\n }\n\n public onCloseTab(id: number, animate: boolean, isNavigation?: boolean) {\n if(!this.historyTabIds.length) {\n this.toggleSidebar(false, animate);\n }\n\n super.onCloseTab(id, animate, isNavigation);\n }\n\n private setColumnProportion() {\n const proportion = this.sidebarEl.scrollWidth / this.sidebarEl.previousElementSibling.scrollWidth;\n document.documentElement.style.setProperty('--right-column-proportion', '' + proportion);\n // this.rect = this.sidebarEl.getBoundingClientRect();\n }\n\n public toggleSidebar(enable?: boolean, animate?: boolean) {\n const active = document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME);\n let willChange: boolean;\n if(enable !== undefined) {\n if(enable) {\n if(!active) {\n willChange = true;\n }\n } else if(active) {\n willChange = true;\n }\n } else {\n willChange = true;\n }\n\n if(!willChange) return Promise.resolve();\n\n if(!active && !this.historyTabIds.length) {\n this.sharedMediaTab.open();\n }\n\n if(!this.isColumnProportionSet) {\n this.setColumnProportion();\n this.isColumnProportionSet = true;\n }\n\n const animationPromise = appImManager.selectTab(active ? APP_TABS.CHAT : APP_TABS.PROFILE, animate);\n document.body.classList.toggle(RIGHT_COLUMN_ACTIVE_CLASSNAME, enable);\n return animationPromise;\n\n /* return new Promise((resolve, reject) => {\n const hidden: {element: HTMLDivElement, height: number}[] = [];\n const observer = new IntersectionObserver((entries) => {\n for(const entry of entries) {\n const bubble = entry.target as HTMLDivElement;\n if(!entry.isIntersecting) {\n hidden.push({element: bubble, height: bubble.scrollHeight});\n }\n }\n\n for(const item of hidden) {\n item.element.style.minHeight = item.height + 'px';\n (item.element.firstElementChild as HTMLElement).style.display = 'none';\n item.element.style.width = '1px';\n }\n\n //console.log('hidden', hidden);\n observer.disconnect();\n\n set();\n\n setTimeout(() => {\n for(const item of hidden) {\n item.element.style.minHeight = '';\n item.element.style.width = '';\n (item.element.firstElementChild as HTMLElement).style.display = '';\n }\n\n resolve();\n }, 200);\n });\n\n const length = Object.keys(appImManager.bubbles).length;\n if(length) {\n for(const i in appImManager.bubbles) {\n observer.observe(appImManager.bubbles[i]);\n }\n } else {\n set();\n setTimeout(resolve, 200);\n }\n }); */\n }\n}\n\nconst appSidebarRight = new AppSidebarRight();\nMOUNT_CLASS_TO.appSidebarRight = appSidebarRight;\nexport default appSidebarRight;\n","/*\n * 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 InputField from '../../inputField';\nimport EditPeer from '../../editPeer';\nimport Row, {CreateRowFromCheckboxField} from '../../row';\nimport CheckboxField from '../../checkboxField';\nimport Button from '../../button';\nimport PeerTitle from '../../peerTitle';\nimport rootScope from '../../../lib/rootScope';\nimport PopupPeer from '../../popups/peer';\nimport {addCancelButton} from '../../popups';\nimport {i18n} from '../../../lib/langPack';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport getPeerId from '../../../lib/appManagers/utils/peers/getPeerId';\nimport formatUserPhone from '../../wrappers/formatUserPhone';\nimport SettingSection from '../../settingSection';\nimport wrapPeerTitle from '../../wrappers/peerTitle';\n\nexport default class AppEditContactTab extends SliderSuperTab {\n private nameInputField: InputField;\n private lastNameInputField: InputField;\n private editPeer: EditPeer;\n private sharePhoneCheckboxField: CheckboxField;\n public peerId: PeerId;\n\n public async init() {\n const {peerId} = this;\n const userId = peerId.toUserId();\n this.container.classList.add('edit-peer-container', 'edit-contact-container');\n const [isContact, privacy] = await Promise.all([\n this.managers.appUsersManager.isContact(userId),\n this.managers.appPrivacyManager.getPrivacy('inputPrivacyKeyPhoneNumber')\n ]);\n const isNew = !isContact;\n this.setTitle(isNew ? 'AddContactTitle' : 'Edit');\n\n {\n const section = new SettingSection({noDelimiter: true});\n const inputFields: InputField[] = [];\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.nameInputField = new InputField({\n label: 'FirstName',\n name: 'contact-name',\n maxLength: 70,\n required: true\n });\n this.lastNameInputField = new InputField({\n label: 'LastName',\n name: 'contact-lastname',\n maxLength: 70\n });\n\n if(userId) {\n const user = await this.managers.appUsersManager.getUser(userId);\n\n if(isNew) {\n this.nameInputField.setDraftValue(user.first_name);\n this.lastNameInputField.setDraftValue(user.last_name);\n } else {\n this.nameInputField.setOriginalValue(user.first_name);\n this.lastNameInputField.setOriginalValue(user.last_name);\n }\n }\n\n inputWrapper.append(this.nameInputField.container, this.lastNameInputField.container);\n inputFields.push(this.nameInputField, this.lastNameInputField);\n\n this.editPeer = new EditPeer({\n peerId: peerId,\n inputFields,\n listenerSetter: this.listenerSetter,\n doNotEditAvatar: true\n });\n this.content.append(this.editPeer.nextBtn);\n\n if(peerId) {\n const div = document.createElement('div');\n div.classList.add('avatar-edit');\n div.append(this.editPeer.avatarElem);\n\n const notificationsCheckboxField = new CheckboxField({\n text: 'Notifications'\n });\n\n notificationsCheckboxField.input.addEventListener('change', (e) => {\n if(!e.isTrusted) {\n return;\n }\n\n this.managers.appMessagesManager.togglePeerMute({peerId});\n });\n\n this.listenerSetter.add(rootScope)('notify_settings', async(update) => {\n if(update.peer._ !== 'notifyPeer') return;\n const peerId = getPeerId(update.peer.peer);\n if(peerId === peerId) {\n const enabled = !(await this.managers.appNotificationsManager.isMuted(update.notify_settings));\n if(enabled !== notificationsCheckboxField.checked) {\n notificationsCheckboxField.checked = enabled;\n }\n }\n });\n\n const profileNameDiv = document.createElement('div');\n profileNameDiv.classList.add('profile-name');\n profileNameDiv.append(new PeerTitle({\n peerId: peerId\n }).element);\n // profileNameDiv.innerHTML = 'Karen Stanford';\n\n const profileSubtitleDiv = document.createElement('div');\n profileSubtitleDiv.classList.add('profile-subtitle');\n profileSubtitleDiv.append(i18n('EditContact.OriginalName'));\n\n section.content.append(div, profileNameDiv, profileSubtitleDiv, inputWrapper);\n\n if(!isNew) {\n const notificationsRow = new Row({\n checkboxField: notificationsCheckboxField,\n withCheckboxSubtitle: true,\n listenerSetter: this.listenerSetter\n });\n\n const enabled = !(await this.managers.appNotificationsManager.isPeerLocalMuted({peerId, respectType: false}));\n notificationsCheckboxField.checked = enabled;\n\n section.content.append(notificationsRow.container);\n } else {\n const user = await this.managers.appUsersManager.getUser(userId);\n\n const phoneRow = new Row({\n icon: 'phone',\n titleLangKey: user.phone ? undefined : 'MobileHidden',\n title: user.phone ? formatUserPhone(user.phone) : undefined,\n subtitleLangKey: user.phone ? 'Phone' : 'MobileHiddenExceptionInfo',\n subtitleLangArgs: user.phone ? undefined : [new PeerTitle({peerId: peerId}).element]\n });\n\n section.content.append(phoneRow.container);\n }\n } else {\n section.content.append(inputWrapper);\n }\n\n this.scrollable.append(section.container);\n }\n\n if(!isNew) {\n const section = new SettingSection();\n\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'PeerInfo.DeleteContact'});\n\n attachClickEvent(btnDelete, () => {\n new PopupPeer('popup-delete-contact', {\n peerId: peerId,\n titleLangKey: 'DeleteContact',\n descriptionLangKey: 'AreYouSureDeleteContact',\n buttons: addCancelButton([{\n langKey: 'Delete',\n callback: () => {\n const toggle = toggleDisability([btnDelete], true);\n\n this.managers.appUsersManager.deleteContacts([userId]).then(() => {\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 } else if(\n privacy.some((privacyRule) => privacyRule._ === 'privacyValueDisallowAll') &&\n !privacy.some((privacyRule) => privacyRule._ === 'privacyValueAllowUsers' && privacyRule.users.includes(userId))\n ) {\n const section = new SettingSection({\n caption: 'NewContact.Exception.ShareMyPhoneNumber.Desc',\n captionArgs: [await wrapPeerTitle({peerId: this.peerId})]\n });\n const checkboxField = this.sharePhoneCheckboxField = new CheckboxField({\n text: 'NewContact.Exception.ShareMyPhoneNumber',\n checked: true\n });\n const row = CreateRowFromCheckboxField(checkboxField);\n\n section.content.append(row.container);\n\n this.scrollable.append(section.container);\n }\n\n attachClickEvent(this.editPeer.nextBtn, async() => {\n this.editPeer.nextBtn.disabled = true;\n\n this.managers.appUsersManager.addContact(\n userId,\n this.nameInputField.value,\n this.lastNameInputField.value,\n (await this.managers.appUsersManager.getUser(userId)).phone,\n this.sharePhoneCheckboxField?.checked\n ).finally(() => {\n this.editPeer.nextBtn.removeAttribute('disabled');\n this.close();\n });\n }, {listenerSetter: this.listenerSetter});\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 toggleDisability from '../../../helpers/dom/toggleDisability';\nimport {makeMediaSize} from '../../../helpers/mediaSize';\nimport copy from '../../../helpers/object/copy';\nimport deepEqual from '../../../helpers/object/deepEqual';\nimport {ForumTopic} from '../../../layer';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport {GENERAL_TOPIC_ID, TOPIC_COLORS} from '../../../lib/mtproto/mtproto_config';\nimport getAbbreviation from '../../../lib/richTextProcessor/getAbbreviation';\nimport ButtonIcon from '../../buttonIcon';\nimport CheckboxField from '../../checkboxField';\nimport EmojiTab from '../../emoticonsDropdown/tabs/emoji';\nimport InputField from '../../inputField';\nimport Row from '../../row';\nimport SettingSection from '../../settingSection';\nimport appSidebarLeft from '../../sidebarLeft';\nimport SliderSuperTab from '../../sliderTab';\nimport {wrapTopicIcon} from '../../wrappers/messageActionTextNewUnsafe';\n\nconst size = 64;\nconst mediaSize = makeMediaSize(size, size);\n\nexport default class AppEditTopicTab extends SliderSuperTab {\n private iconDiv: HTMLElement;\n private colorIndex: number;\n private nameInputField: InputField;\n private topic: Parameters[0]['topic'];\n private emojiElement: HTMLElement;\n private confirmBtn: HTMLButtonElement;\n private originalTopic: ForumTopic.forumTopic;\n\n public async init(peerId: PeerId, threadId?: number) {\n this.colorIndex = 0;\n const isNew = !threadId;\n const isGeneral = threadId === GENERAL_TOPIC_ID;\n this.container.classList.add('edit-topic-container');\n this.setTitle(isNew ? 'NewTopic' : 'ForumTopic.Title.Edit');\n const chatId = peerId.toChatId();\n\n if(threadId) {\n this.topic = this.originalTopic = copy(await this.managers.dialogsStorage.getForumTopic(peerId, threadId));\n }\n\n {\n const section = new SettingSection({\n name: isGeneral ? 'CreateGeneralTopicTitle' : 'CreateTopicTitle'\n });\n\n const iconDiv = this.iconDiv = document.createElement('div');\n iconDiv.classList.add('edit-topic-icon-container');\n\n !threadId && attachClickEvent(iconDiv, () => {\n if(this.topic.icon_emoji_id) {\n return;\n }\n\n this.colorIndex = (this.colorIndex + 1) % TOPIC_COLORS.length;\n this.setIcon();\n }, {listenerSetter: this.listenerSetter});\n\n if(threadId) {\n iconDiv.classList.add('disable-hover');\n }\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const nameInputField = this.nameInputField = new InputField({\n label: 'ForumTopic.Name.Placeholder',\n withLinebreaks: false,\n name: 'topic-name',\n maxLength: 70,\n required: true\n });\n\n if(this.topic) {\n nameInputField.setOriginalValue(this.topic.title, true);\n }\n\n const confirmBtn = this.confirmBtn = ButtonIcon('check btn-confirm blue hide', {noRipple: true});\n this.header.append(confirmBtn);\n\n attachClickEvent(confirmBtn, () => {\n const toggle = toggleDisability([confirmBtn], true);\n if(threadId) {\n this.managers.appChatsManager.editForumTopic({\n chatId,\n topicId: threadId,\n title: nameInputField.value,\n iconEmojiId: this.topic.icon_emoji_id || 0\n }).then(() => {\n this.close();\n }).catch((err) => {\n console.error('edit topic error', err);\n toggle();\n });\n } else {\n this.managers.appChatsManager.createForumTopic({\n chatId,\n iconColor: TOPIC_COLORS[this.colorIndex],\n iconEmojiId: this.topic.icon_emoji_id,\n title: nameInputField.value\n }).then((threadId) => {\n this.close();\n appImManager.setInnerPeer({\n peerId,\n threadId\n });\n }).catch((err) => {\n console.error('create topic error', err);\n toggle();\n });\n }\n }, {listenerSetter: this.listenerSetter});\n\n this.listenerSetter.add(nameInputField.input)('input', () => {\n this.validate();\n this.setIcon(this.topic?.icon_emoji_id);\n });\n\n inputWrapper.append(nameInputField.container);\n\n section.content.append(iconDiv, inputWrapper);\n\n this.scrollable.append(section.container);\n }\n\n const promises: Promise[] = [];\n\n if(!isGeneral) {\n const section = new SettingSection({});\n section.container.classList.add('edit-topic-emoticons-container');\n const emojiTab = new EmojiTab({\n managers: this.managers,\n isStandalone: true,\n noRegularEmoji: true,\n stickerSetId: 'inputStickerSetEmojiDefaultTopicIcons',\n onClick: (emoji) => {\n emojiTab.setActive(!emoji.docId ? {emoji: undefined, docId: undefined} : emoji);\n this.setIcon(emoji.docId);\n }\n });\n emojiTab.getContainerSize = () => ({\n width: appSidebarLeft.rect.width,\n height: 400\n });\n\n this.middlewareHelper.onDestroy(() => {\n emojiTab.destroy();\n });\n\n emojiTab.container.classList.remove('tabs-tab');\n\n this.emojiElement = document.createElement('span');\n this.emojiElement.classList.add('super-emoji-topic-icon');\n\n const promise = emojiTab.init().then(async() => {\n const category = emojiTab.getCustomCategory();\n\n const iconEmojiId = this.topic?.icon_emoji_id;\n emojiTab.addEmojiToCategory({\n category,\n element: this.emojiElement,\n batch: false,\n prepend: true,\n active: !iconEmojiId\n });\n\n if(iconEmojiId) {\n emojiTab.setActive({docId: iconEmojiId, emoji: ''});\n }\n });\n\n promises.push(promise);\n\n section.content.replaceWith(emojiTab.container);\n this.scrollable.append(section.container);\n } else {\n const section = new SettingSection({caption: 'EditTopicHideInfo'});\n\n const checkboxField = new CheckboxField({\n // toggle: true,\n checked: !(this.topic as ForumTopic.forumTopic).pFlags.hidden,\n text: 'EditTopicHide'\n });\n\n this.listenerSetter.add(checkboxField.input)('change', () => {\n const promise = this.managers.appChatsManager.editForumTopic({\n chatId,\n topicId: threadId,\n hidden: !checkboxField.checked\n });\n\n row.disableWithPromise(promise);\n });\n\n const row = new Row({\n checkboxField\n });\n\n section.content.append(row.container);\n\n this.scrollable.append(section.container);\n }\n\n return Promise.all(promises).then(() => {\n return this.s();\n });\n }\n\n private validate() {\n let isChanged = this.nameInputField.isValidToChange();\n if(!isChanged && this.originalTopic) {\n isChanged = this.topic.icon_emoji_id !== this.originalTopic.icon_emoji_id;\n }\n\n this.confirmBtn.classList.toggle('hide', !isChanged);\n }\n\n private s() {\n if(this.topic?.icon_color) {\n this.colorIndex = TOPIC_COLORS.indexOf(this.topic.icon_color);\n }\n\n return this.setIcon(this.topic?.icon_emoji_id, undefined, true);\n }\n\n private async setIcon(iconEmojiId?: Long, appendTo = this.iconDiv, force?: boolean) {\n const title = this.nameInputField.value;\n\n const isMainIcon = appendTo === this.iconDiv;\n\n if(isMainIcon) {\n const newTopic: AppEditTopicTab['topic'] = {\n id: this.topic?.id,\n icon_color: TOPIC_COLORS[this.colorIndex],\n title: getAbbreviation(title, true).text || 'A',\n icon_emoji_id: iconEmojiId\n };\n\n const oldTopic = this.topic;\n this.topic = newTopic;\n\n if(\n force ||\n !oldTopic ||\n oldTopic.icon_color !== newTopic.icon_color ||\n oldTopic.title !== newTopic.title\n ) {\n this.setIcon(undefined, this.emojiElement);\n }\n\n if(deepEqual(oldTopic, newTopic) && !force) {\n return;\n }\n\n this.validate();\n }\n\n const el = await wrapTopicIcon({\n topic: isMainIcon ? this.topic : {...this.topic, icon_emoji_id: undefined},\n customEmojiSize: mediaSize,\n middleware: this.middlewareHelper.get()\n });\n\n const span = document.createElement('div');\n span.classList.add('edit-topic-icon');\n span.append(el);\n\n const oldEl = appendTo.lastElementChild as HTMLElement;\n appendTo.append(span);\n\n const applyFadeAnimation = (el: HTMLElement, fadeIn: boolean) => {\n const frames: Keyframe[] = [\n {opacity: '0', transform: 'scale(0.8)'},\n {opacity: '1', transform: 'scale(1)'}\n ];\n\n const animation = el.animate(frames, {\n duration: 200,\n iterations: 1,\n easing: 'ease-in-out',\n fill: 'forwards',\n direction: fadeIn ? 'normal' : 'reverse'\n });\n\n return new Promise((resolve) => {\n animation.addEventListener('finish', () => {\n resolve();\n }, {once: true});\n });\n };\n\n if(oldEl) {\n applyFadeAnimation(oldEl, false).then(() => oldEl.remove());\n }\n\n applyFadeAnimation(span, 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 {copyTextToClipboard} from '../../../helpers/clipboard';\nimport {randomLong} from '../../../helpers/random';\nimport {Chat, ChatFull, ExportedChatInvite} from '../../../layer';\nimport Button from '../../button';\nimport {setButtonLoader} from '../../putPreloader';\nimport RadioField from '../../radioField';\nimport Row, {RadioFormFromRows} from '../../row';\nimport {toast} from '../../toast';\nimport {UsernameInputField} from '../../usernameInputField';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport I18n, {i18n} from '../../../lib/langPack';\nimport PopupPeer from '../../popups/peer';\nimport ButtonCorner from '../../buttonCorner';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport CheckboxField from '../../checkboxField';\nimport rootScope from '../../../lib/rootScope';\nimport SettingSection from '../../settingSection';\nimport UsernamesSection from '../../usernamesSection';\nimport getPeerEditableUsername from '../../../lib/appManagers/utils/peers/getPeerEditableUsername';\nimport getPeerActiveUsernames from '../../../lib/appManagers/utils/peers/getPeerActiveUsernames';\nimport {purchaseUsernameCaption} from '../../sidebarLeft/tabs/editProfile';\nimport confirmationPopup from '../../confirmationPopup';\n\nexport default class AppChatTypeTab extends SliderSuperTabEventable {\n public chatId: ChatId;\n public chatFull: ChatFull;\n\n public async init() {\n this.container.classList.add('edit-peer-container', 'group-type-container');\n\n const isBroadcast = await this.managers.appChatsManager.isBroadcast(this.chatId);\n\n this.setTitle(isBroadcast ? 'ChannelType' : 'GroupType');\n\n const section = new SettingSection({\n name: isBroadcast ? 'ChannelType' : 'GroupType'\n });\n\n const random = randomLong();\n const privateRow = new Row({\n radioField: new RadioField({\n langKey: isBroadcast ? 'ChannelPrivate' : 'MegaPrivate',\n name: random,\n value: 'private'\n }),\n subtitleLangKey: isBroadcast ? 'ChannelPrivateInfo' : 'MegaPrivateInfo'\n });\n const publicRow = new Row({\n radioField: new RadioField({\n langKey: isBroadcast ? 'ChannelPublic' : 'MegaPublic',\n name: random,\n value: 'public'\n }),\n subtitleLangKey: isBroadcast ? 'ChannelPublicInfo' : 'MegaPublicInfo'\n });\n const form = RadioFormFromRows([privateRow, publicRow], (value) => {\n const a: HTMLElement[][] = [[privateSection.container], [publicContainer]];\n if(value === 'public') a.reverse();\n\n a[0].forEach((container) => container.classList.remove('hide'));\n a[1].forEach((container) => container.classList.add('hide'));\n\n onChange();\n });\n\n let chat: Chat = await this.managers.appChatsManager.getChat(this.chatId);\n\n const chatUpdateListeners: {[type in 'basic']: (() => void)[]} = {basic: []};\n const addChatUpdateListener = (callback: () => void, type: 'basic' = 'basic') => {\n chatUpdateListeners[type].push(callback);\n };\n\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n if(this.chatId === chatId) {\n chat = await this.managers.appChatsManager.getChat(this.chatId) as typeof chat;\n chatUpdateListeners['basic'].forEach((callback) => callback());\n }\n });\n\n section.content.append(form);\n\n const privateSection = new SettingSection({});\n\n // let revoked = false;\n const linkRow = new Row({\n title: (this.chatFull.exported_invite as ExportedChatInvite.chatInviteExported).link,\n subtitleLangKey: isBroadcast ? 'ChannelPrivateLinkHelp' : 'MegaPrivateLinkHelp',\n clickable: () => {\n copyTextToClipboard((this.chatFull.exported_invite as ExportedChatInvite.chatInviteExported).link);\n toast(I18n.format('LinkCopied', true));\n },\n listenerSetter: this.listenerSetter\n });\n\n const btnRevoke = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'RevokeLink'});\n\n attachClickEvent(btnRevoke, () => {\n new PopupPeer('revoke-link', {\n buttons: [{\n langKey: 'RevokeButton',\n callback: () => {\n const toggle = toggleDisability([btnRevoke], true);\n\n this.managers.appProfileManager.getChatInviteLink(this.chatId, true).then((link) => {\n toggle();\n linkRow.title.innerHTML = link;\n // revoked = true;\n // onChange();\n });\n }\n }],\n titleLangKey: 'RevokeLink',\n descriptionLangKey: 'RevokeAlert'\n }).show();\n }, {listenerSetter: this.listenerSetter});\n\n privateSection.content.append(linkRow.container, btnRevoke);\n\n const publicSection = new SettingSection({\n caption: true,\n noDelimiter: true\n });\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const placeholder = 't.me/';\n\n const onChange = () => {\n const changed = (privateRow.radioField.checked && (originalValue !== placeholder/* || revoked */)) ||\n (linkInputField.isValidToChange() && linkInputField.input.classList.contains('valid'));\n applyBtn.classList.toggle('is-visible', changed);\n\n const {error} = linkInputField;\n const isPurchase = error?.type === 'USERNAME_PURCHASE_AVAILABLE';\n setUsername(isPurchase ? linkInputField.getValue() : undefined);\n };\n\n const linkInputField = new UsernameInputField({\n label: 'SetUrlPlaceholder',\n name: 'group-public-link',\n plainText: true,\n listenerSetter: this.listenerSetter,\n availableText: 'Link.Available',\n invalidText: 'Link.Invalid',\n takenText: 'Link.Taken',\n onChange: onChange,\n peerId: this.chatId.toPeerId(true),\n head: placeholder\n }, this.managers);\n\n const {setUsername, element: p} = purchaseUsernameCaption();\n\n publicSection.caption.append(\n p,\n i18n(isBroadcast ? 'Channel.UsernameAboutChannel' : 'Channel.UsernameAboutGroup')\n );\n\n const usernamesSection = new UsernamesSection({\n peerId: this.chatId.toPeerId(true),\n peer: chat as Chat.channel,\n listenerSetter: this.listenerSetter,\n usernameInputField: linkInputField,\n middleware: this.middlewareHelper.get()\n });\n\n const publicContainer = document.createElement('div');\n publicContainer.append(publicSection.container, usernamesSection.container);\n\n const originalValue = placeholder + (getPeerEditableUsername(chat as Chat.channel) || '');\n\n inputWrapper.append(linkInputField.container)\n publicSection.content.append(inputWrapper);\n\n const applyBtn = ButtonCorner({icon: 'check', className: 'is-visible'});\n this.content.append(applyBtn);\n\n attachClickEvent(applyBtn, async() => {\n const username = publicRow.radioField.checked ? linkInputField.getValue() : '';\n if(!username) {\n const chat = await this.managers.appChatsManager.getChat(this.chatId);\n const wasUsername = getPeerEditableUsername(chat as Chat.channel);\n if(wasUsername) {\n await confirmationPopup({\n descriptionLangKey: isBroadcast ? 'ChannelVisibility.Confirm.MakePrivate.Channel' : 'ChannelVisibility.Confirm.MakePrivate.Group',\n descriptionLangArgs: [wasUsername],\n button: {\n langKey: 'OK'\n }\n });\n }\n }\n\n /* const unsetLoader = */setButtonLoader(applyBtn);\n this.managers.appChatsManager.migrateChat(this.chatId).then((channelId) => {\n if(!username) {\n return this.managers.appChatsManager.makeChannelPrivate(channelId);\n } else {\n return this.managers.appChatsManager.updateUsername(channelId, username);\n }\n }).then(() => {\n // unsetLoader();\n this.close();\n });\n }, {listenerSetter: this.listenerSetter});\n\n (originalValue !== placeholder || getPeerActiveUsernames(chat as Chat.channel).length ? publicRow : privateRow).radioField.checked = true;\n linkInputField.setOriginalValue(originalValue, true);\n\n this.scrollable.append(section.container, privateSection.container, publicContainer);\n\n {\n const section = new SettingSection({\n name: 'SavingContentTitle',\n caption: isBroadcast ? 'RestrictSavingContentInfoChannel' : 'RestrictSavingContentInfoGroup'\n });\n\n const checkboxField = new CheckboxField({\n text: 'RestrictSavingContent',\n withRipple: true\n });\n\n this.listenerSetter.add(checkboxField.input)('change', () => {\n const toggle = checkboxField.toggleDisability(true);\n this.managers.appChatsManager.toggleNoForwards(this.chatId, checkboxField.checked).then(() => {\n toggle();\n });\n });\n\n const onChatUpdate = () => {\n checkboxField.setValueSilently(!!(chat as Chat.channel).pFlags.noforwards);\n };\n\n addChatUpdateListener(onChatUpdate);\n\n onChatUpdate();\n\n section.content.append(checkboxField.label);\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 toggleDisability from '../../../helpers/dom/toggleDisability';\nimport deepEqual from '../../../helpers/object/deepEqual';\nimport {ChannelParticipant} from '../../../layer';\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport Button from '../../button';\nimport SettingSection from '../../settingSection';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport getUserStatusString from '../../wrappers/getUserStatusString';\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 public async 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 peerId: this.userId.toPeerId(false),\n container: list,\n rippleEnabled: true,\n avatarSize: 'abitbigger'\n });\n\n dom.lastMessageSpan.append(getUserStatusString(await this.managers.appUsersManager.getUser(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 }, this.managers);\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 this.managers.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 this.managers.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 this.managers.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 {ChatRights} from '../../../lib/appManagers/appChatsManager';\nimport appDialogsManager, {DialogDom, DIALOG_LIST_ELEMENT_TAG} from '../../../lib/appManagers/appDialogsManager';\nimport {AppManagers} from '../../../lib/appManagers/managers';\nimport combineParticipantBannedRights from '../../../lib/appManagers/utils/chats/combineParticipantBannedRights';\nimport hasRights from '../../../lib/appManagers/utils/chats/hasRights';\nimport getPeerActiveUsernames from '../../../lib/appManagers/utils/peers/getPeerActiveUsernames';\nimport getPeerId from '../../../lib/appManagers/utils/peers/getPeerId';\nimport I18n, {i18n, join, LangPackKey} from '../../../lib/langPack';\nimport rootScope from '../../../lib/rootScope';\nimport CheckboxField from '../../checkboxField';\nimport PopupPickUser from '../../popups/pickUser';\nimport Row, {CreateRowFromCheckboxField} from '../../row';\nimport SettingSection from '../../settingSection';\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(private options: {\n chatId: ChatId,\n listenerSetter: ListenerSetter,\n appendTo: HTMLElement,\n participant?: ChannelParticipant.channelParticipantBanned\n }, private managers: AppManagers) {\n this.construct();\n }\n\n public async construct() {\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 options = this.options;\n const chat = await this.managers.appChatsManager.getChat(options.chatId) as Chat.chat | Chat.channel;\n const defaultBannedRights = chat.default_banned_rights;\n const rights = options.participant ? combineParticipantBannedRights(chat as Chat.channel, options.participant.banned_rights) : defaultBannedRights;\n\n const restrictionText: LangPackKey = options.participant ? 'UserRestrictionsDisabled' : 'EditCantEditPermissionsPublic';\n for(const info of this.v) {\n const mainFlag = info.flags[0];\n const row = CreateRowFromCheckboxField(\n info.checkboxField = new CheckboxField({\n text: info.text,\n checked: hasRights(chat, mainFlag, rights),\n restriction: true,\n listenerSetter: options.listenerSetter\n })\n );\n\n if((\n options.participant &&\n defaultBannedRights.pFlags[mainFlag as keyof typeof defaultBannedRights['pFlags']]\n ) || (\n getPeerActiveUsernames(chat as Chat.channel)[0] &&\n (\n info.flags.includes('pin_messages') ||\n info.flags.includes('change_info')\n )\n )\n ) {\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(restrictionText, 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(row.container);\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 public 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 }, this.managers);\n\n this.eventListener.addEventListener('destroy', () => {\n this.managers.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 listenerSetter: this.listenerSetter\n });\n\n const openPermissions = async(peerId: PeerId) => {\n let participant: AppUserPermissionsTab['participant'];\n try {\n participant = await this.managers.appProfileManager.getChannelParticipant(this.chatId, peerId) as any;\n } catch(err) {\n toast('User is no longer participant');\n return;\n }\n\n const tab = this.slider.createTab(AppUserPermissionsTab);\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, DIALOG_LIST_ELEMENT_TAG);\n if(!target) return;\n\n const peerId = target.dataset.peerId.toPeerId();\n openPermissions(peerId);\n }, {listenerSetter: this.listenerSetter});\n\n const setSubtitle = async(dom: DialogDom, participant: ChannelParticipant.channelParticipantBanned) => {\n const bannedRights = participant.banned_rights;// appChatsManager.combineParticipantBannedRights(this.chatId, participant.banned_rights);\n const defaultBannedRights = ((await this.managers.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 = dom.lastMessageSpan as HTMLElement;\n\n if(cantWhat.length) {\n el.replaceChildren(...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 peerId: getPeerId(participant.peer),\n container: list,\n rippleEnabled: true,\n avatarSize: 'abitbigger',\n append\n });\n\n setSubtitle(dom, 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 this.managers.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(await this.managers.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 copy from '../../../../helpers/object/copy';\nimport {ChatBannedRights, Chat} from '../../../../layer';\n\nexport default function combineParticipantBannedRights(chat: Chat.channel, rights: ChatBannedRights) {\n if(chat.default_banned_rights) {\n rights = copy(rights);\n const defaultRights = chat.default_banned_rights.pFlags;\n for(const i in defaultRights) {\n // @ts-ignore\n rights.pFlags[i] = defaultRights[i];\n }\n }\n\n return rights;\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 debounce from '../../../helpers/schedulers/debounce';\nimport {ChatReactions, Reaction} from '../../../layer';\nimport {i18n, LangPackKey} from '../../../lib/langPack';\nimport CheckboxField from '../../checkboxField';\nimport Row, {RadioFormFromValues} from '../../row';\nimport SettingSection from '../../settingSection';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport wrapStickerToRow from '../../wrappers/stickerToRow';\n\nexport default class AppChatReactionsTab extends SliderSuperTabEventable {\n public chatId: ChatId;\n\n public async init() {\n this.setTitle('Reactions');\n\n const availableReactions = await this.managers.appReactionsManager.getActiveAvailableReactions();\n const chatFull = await this.managers.appProfileManager.getChatFull(this.chatId);\n const isBroadcast = await this.managers.appChatsManager.isBroadcast(this.chatId);\n\n let _chatReactions = chatFull.available_reactions ?? {_: 'chatReactionsNone'};\n let chatReactions = _chatReactions;\n let emoticons = new Set(_chatReactions._ === 'chatReactionsSome' ? _chatReactions.reactions.map((reaction) => (reaction as Reaction.reactionEmoji).emoticon) : []);\n\n const makeReactionFromEmoticons = (emoticons: Array): Reaction[] => emoticons.map((emoticon) => ({_: 'reactionEmoji', emoticon}));\n\n const getCaptionLangPackKey = (): LangPackKey => {\n if(isBroadcast) {\n return 'EnableReactionsChannelInfo';\n }\n\n return chatReactions._ === 'chatReactionsAll' ? 'EnableAllReactionsInfo' : (chatReactions._ === 'chatReactionsNone' ? 'DisableReactionsInfo' : 'EnableSomeReactionsInfo');\n };\n\n const toggleSection = new SettingSection({\n name: isBroadcast ? undefined : 'AvailableReactions',\n caption: getCaptionLangPackKey()\n });\n\n const reactionsSection = new SettingSection({\n name: 'OnlyAllowThisReactions'\n });\n\n const toggleCheckboxFieldsByEmoticons = () => {\n const r: Reaction.reactionEmoji[] = (chatReactions as ChatReactions.chatReactionsSome).reactions as any ?? [];\n emoticons = new Set(r.map(({emoticon}) => emoticon));\n checkboxFieldsByEmoticon.forEach((checkboxField, emoticon) => {\n checkboxField.setValueSilently(emoticons.has(emoticon));\n });\n };\n\n let toggleCheckboxField: CheckboxField;\n if(isBroadcast) {\n toggleCheckboxField = new CheckboxField({toggle: true, checked: _chatReactions._ === 'chatReactionsSome'});\n const toggleRow = new Row({\n checkboxField: toggleCheckboxField,\n titleLangKey: 'EnableReactions',\n listenerSetter: this.listenerSetter\n });\n\n toggleSection.content.append(toggleRow.container);\n\n this.listenerSetter.add(toggleCheckboxField.input)('change', () => {\n let save = true;\n if(!toggleCheckboxField.checked) {\n chatReactions = {_: 'chatReactionsNone'};\n } else if(checkboxFields.every((checkboxField) => !checkboxField.checked)) {\n chatReactions = {_: 'chatReactionsSome', reactions: makeReactionFromEmoticons(availableReactions.map(({reaction}) => reaction))};\n } else if(chatReactions._ !== 'chatReactionsSome') {\n chatReactions = {_: 'chatReactionsSome', reactions: makeReactionFromEmoticons(Array.from(emoticons))};\n } else {\n save = false;\n }\n\n if(save) {\n toggleCheckboxFieldsByEmoticons();\n saveReactionsDebounced();\n }\n });\n } else {\n const a: [ChatReactions['_'], LangPackKey][] = [\n ['chatReactionsAll', 'AllReactions'],\n ['chatReactionsSome', 'SomeReactions'],\n ['chatReactionsNone', 'NoReactions']\n ];\n\n const onChange = () => {\n reactionsSection.container.classList.toggle('hide', chatReactions._ !== 'chatReactionsSome');\n };\n\n let value = _chatReactions._;\n const form = RadioFormFromValues(a.map(([value, langPackKey]) => {\n return {\n langPackKey,\n value,\n checked: _chatReactions._ === value\n };\n }), (_value) => {\n value = _value as any;\n\n if(value === 'chatReactionsAll') {\n chatReactions = {\n _: value,\n pFlags: {\n allow_custom: true\n }\n };\n } else if(value === 'chatReactionsNone') {\n chatReactions = {\n _: value\n };\n } else {\n chatReactions = {\n _: value,\n reactions: makeReactionFromEmoticons(['๐Ÿ‘', '๐Ÿ‘Ž'])\n };\n }\n\n replaceContent(toggleSection.caption, i18n(getCaptionLangPackKey()));\n toggleCheckboxFieldsByEmoticons();\n saveReactionsDebounced();\n onChange();\n });\n\n toggleSection.content.append(form);\n onChange();\n }\n\n const checkboxFieldsByEmoticon: Map = new Map();\n const checkboxFields = availableReactions.map((availableReaction) => {\n const emoticon = availableReaction.reaction;\n const checkboxField = new CheckboxField({\n toggle: true,\n checked: emoticons.has(emoticon)\n });\n\n checkboxFieldsByEmoticon.set(emoticon, checkboxField);\n\n this.listenerSetter.add(checkboxField.input)('change', () => {\n if(checkboxField.checked) {\n emoticons.add(emoticon);\n\n if(toggleCheckboxField && !toggleCheckboxField.checked) {\n toggleCheckboxField.checked = true;\n }\n } else {\n emoticons.delete(emoticon);\n\n if(toggleCheckboxField?.checked && !emoticons.size) {\n toggleCheckboxField.checked = false;\n }\n }\n\n saveReactionsDebounced();\n });\n\n const row = new Row({\n checkboxField,\n title: availableReaction.title,\n havePadding: true,\n listenerSetter: this.listenerSetter\n });\n\n wrapStickerToRow({\n row,\n doc: availableReaction.static_icon,\n size: 'small'\n });\n\n reactionsSection.content.append(row.container);\n\n return checkboxField;\n });\n\n const saveReactions = async() => {\n saveReactionsDebounced.clearTimeout();\n // const newReactions = Array.from(enabledReactions);\n // if([...newReactions].sort().join() === [...originalReactions].sort().join()) {\n // return;\n // }\n\n if(chatReactions._ === 'chatReactionsSome') {\n chatReactions.reactions = makeReactionFromEmoticons(Array.from(emoticons));\n }\n\n // const r = (chatReactions as ChatReactions.chatReactionsSome).reactions;\n // if(r?.length === availableReactions.length) {\n // chatReactions = {_: 'chatReactionsAll'};\n // }\n\n this.managers.appChatsManager.setChatAvailableReactions(this.chatId, chatReactions);\n _chatReactions = chatReactions;\n };\n\n const saveReactionsDebounced = debounce(saveReactions, 3000, false, true);\n\n this.eventListener.addEventListener('destroy', () => {\n if(saveReactionsDebounced.isDebounced()) {\n saveReactions();\n }\n }, {once: true});\n\n this.scrollable.append(toggleSection.container, reactionsSection.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 {SliderSuperTab} from '../../slider'\nimport InputField from '../../inputField';\nimport EditPeer from '../../editPeer';\nimport Row, {CreateRowFromCheckboxField} from '../../row';\nimport Button from '../../button';\nimport {ChatRights} from '../../../lib/appManagers/appChatsManager';\nimport {Chat, ChatFull} from '../../../layer';\nimport AppChatTypeTab from './chatType';\nimport rootScope from '../../../lib/rootScope';\nimport AppGroupPermissionsTab from './groupPermissions';\nimport {i18n, LangPackKey} from '../../../lib/langPack';\nimport PopupDeleteDialog from '../../popups/deleteDialog';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport CheckboxField from '../../checkboxField';\nimport AppChatReactionsTab from './chatReactions';\nimport hasRights from '../../../lib/appManagers/utils/chats/hasRights';\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport SettingSection from '../../settingSection';\nimport getPeerActiveUsernames from '../../../lib/appManagers/utils/peers/getPeerActiveUsernames';\n\nexport default class AppEditChatTab extends SliderSuperTab {\n private chatNameInputField: InputField;\n private descriptionInputField: InputField;\n private editPeer: EditPeer;\n public chatId: ChatId;\n\n protected async _init() {\n // * cleanup prev\n this.listenerSetter.removeAll();\n this.scrollable.container.replaceChildren();\n\n this.container.classList.add('edit-peer-container', 'edit-group-container');\n this.setTitle('Edit');\n\n let [\n chatFull,\n chat,\n isBroadcast,\n isChannel,\n canChangeType,\n canChangePermissions,\n canManageTopics,\n appConfig\n ] = await Promise.all([\n this.managers.appProfileManager.getChatFull(this.chatId, true),\n this.managers.appChatsManager.getChat(this.chatId) as Promise,\n this.managers.appChatsManager.isBroadcast(this.chatId),\n this.managers.appChatsManager.isChannel(this.chatId),\n this.managers.appChatsManager.hasRights(this.chatId, 'change_type'),\n this.managers.appChatsManager.hasRights(this.chatId, 'change_permissions'),\n this.managers.appChatsManager.hasRights(this.chatId, 'manage_topics'),\n this.managers.apiManager.getAppConfig()\n ]);\n\n const chatUpdateListeners: {[type in 'full' | 'basic']: (() => void)[]} = {full: [], basic: []};\n const addChatUpdateListener = (callback: () => void, type: 'full' | 'basic' = 'basic') => {\n chatUpdateListeners[type].push(callback);\n };\n\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n if(this.chatId === chatId) {\n chat = await this.managers.appChatsManager.getChat(this.chatId) as typeof chat;\n chatUpdateListeners['basic'].forEach((callback) => callback());\n }\n });\n\n this.listenerSetter.add(rootScope)('chat_full_update', async(chatId) => {\n if(this.chatId === chatId) {\n chatFull = await this.managers.appProfileManager.getCachedFullChat(chatId) || chatFull;\n chatUpdateListeners['full'].forEach((callback) => callback());\n }\n });\n\n const peerId = this.chatId.toPeerId(true);\n\n {\n const section = new SettingSection({noDelimiter: true, caption: true});\n const inputFields: InputField[] = [];\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.chatNameInputField = new InputField({\n label: isBroadcast ? 'EnterChannelName' : 'CreateGroup.NameHolder',\n name: 'chat-name',\n maxLength: 255,\n required: true\n });\n this.descriptionInputField = new InputField({\n label: 'DescriptionPlaceholder',\n name: 'chat-description',\n maxLength: 255\n });\n\n this.chatNameInputField.setOriginalValue(chat.title);\n this.descriptionInputField.setOriginalValue(chatFull.about);\n\n inputWrapper.append(this.chatNameInputField.container, this.descriptionInputField.container);\n\n inputFields.push(this.chatNameInputField, this.descriptionInputField);\n\n this.editPeer = new EditPeer({\n peerId,\n inputFields,\n listenerSetter: this.listenerSetter,\n popupOptions: {isForum: (chat as Chat.channel).pFlags.forum}\n });\n this.content.append(this.editPeer.nextBtn);\n\n section.content.append(this.editPeer.avatarEdit.container, inputWrapper);\n\n if(canChangeType) {\n const chatTypeRow = new Row({\n titleLangKey: isBroadcast ? 'ChannelType' : 'GroupType',\n clickable: () => {\n const tab = this.slider.createTab(AppChatTypeTab);\n tab.chatId = this.chatId;\n tab.chatFull = chatFull;\n tab.open();\n },\n icon: 'lock',\n listenerSetter: this.listenerSetter\n });\n\n const setChatTypeSubtitle = () => {\n let key: LangPackKey;\n const username = getPeerActiveUsernames(chat as Chat.channel)[0];\n if(isBroadcast) {\n key = username ? 'TypePublic' : 'TypePrivate';\n } else {\n key = username ? 'TypePublicGroup' : 'TypePrivateGroup';\n }\n\n chatTypeRow.subtitle.replaceChildren(i18n(key));\n };\n\n setChatTypeSubtitle();\n addChatUpdateListener(setChatTypeSubtitle);\n section.content.append(chatTypeRow.container);\n }\n\n if(canChangeType || canChangePermissions) {\n const reactionsRow = new Row({\n titleLangKey: 'Reactions',\n icon: 'reactions',\n clickable: () => {\n const tab = this.slider.createTab(AppChatReactionsTab);\n tab.chatId = this.chatId;\n tab.open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const availableReactions = await this.managers.appReactionsManager.getAvailableReactions();\n const availableReactionsLength = availableReactions.filter((availableReaction) => !availableReaction.pFlags.inactive).length;\n const setReactionsLength = () => {\n const chatAvailableReactions = chatFull.available_reactions ?? {_: 'chatReactionsNone'};\n if(chatAvailableReactions._ === 'chatReactionsSome') {\n const length = chatAvailableReactions.reactions.length;\n if(length === availableReactionsLength) {\n replaceContent(reactionsRow.subtitle, i18n('ReactionsAll'));\n } else {\n reactionsRow.subtitle.textContent = length + '/' + availableReactionsLength;\n }\n } else {\n replaceContent(reactionsRow.subtitle, i18n(chatAvailableReactions._ === 'chatReactionsAll' ? 'ReactionsAll' : 'Checkbox.Disabled'));\n }\n };\n\n setReactionsLength();\n addChatUpdateListener(setReactionsLength, 'full');\n section.content.append(reactionsRow.container);\n }\n\n if(canChangePermissions && !isBroadcast) {\n const flags = [\n 'send_messages',\n 'send_media',\n 'send_stickers',\n 'send_polls',\n 'embed_links',\n 'invite_users',\n 'pin_messages',\n 'change_info'\n ] as ChatRights[];\n\n const permissionsRow = new Row({\n titleLangKey: 'ChannelPermissions',\n clickable: () => {\n const tab = this.slider.createTab(AppGroupPermissionsTab);\n tab.chatId = this.chatId;\n tab.open();\n },\n icon: 'permissions',\n listenerSetter: this.listenerSetter\n });\n\n const setPermissionsLength = () => {\n permissionsRow.subtitle.textContent = flags.reduce((acc, f) => acc + +hasRights(chat, f, (chat as Chat.chat).default_banned_rights), 0) + '/' + flags.length;\n };\n\n setPermissionsLength();\n addChatUpdateListener(setPermissionsLength);\n section.content.append(permissionsRow.container);\n }\n\n if(canManageTopics && (chat.participants_count >= appConfig.forum_upgrade_participants_min || (chat as Chat.channel).pFlags.forum) && !isBroadcast) {\n const topicsRow = new Row({\n checkboxField: new CheckboxField({toggle: true}),\n titleLangKey: 'Topics',\n clickable: () => {},\n icon: 'topics',\n listenerSetter: this.listenerSetter\n });\n\n const setTopics = () => {\n const isForum = !!(chat as Chat.channel).pFlags.forum;\n this.editPeer.avatarElem.parentElement.classList.toggle('is-forum', isForum);\n topicsRow.checkboxField.setValueSilently(isForum);\n };\n\n this.listenerSetter.add(topicsRow.checkboxField.input)('change', (e) => {\n if(!e.isTrusted) {\n return;\n }\n\n const promise = this.managers.appChatsManager.toggleForum(this.chatId, topicsRow.checkboxField.checked);\n topicsRow.disableWithPromise(promise);\n });\n\n setTopics();\n addChatUpdateListener(setTopics);\n\n section.caption.replaceChildren(i18n('ForumToggleDescription'));\n section.content.append(topicsRow.container);\n }\n\n section.caption.classList.toggle('hide', !section.caption.childElementCount);\n\n /* const administratorsRow = new Row({\n titleLangKey: 'PeerInfo.Administrators',\n subtitle: '' + ((chatFull as ChatFull.channelFull).admins_count || 1),\n icon: 'admin',\n clickable: true\n });\n\n section.content.append(administratorsRow.container); */\n\n this.scrollable.append(section.container);\n\n attachClickEvent(this.editPeer.nextBtn, () => {\n this.editPeer.nextBtn.disabled = true;\n\n const promises: Promise[] = [];\n\n const id = this.chatId;\n if(this.chatNameInputField.isValidToChange()) {\n promises.push(this.managers.appChatsManager.editTitle(id, this.chatNameInputField.value));\n }\n\n if(this.descriptionInputField.isValidToChange()) {\n promises.push(this.managers.appChatsManager.editAbout(id, this.descriptionInputField.value));\n }\n\n if(this.editPeer.uploadAvatar) {\n promises.push(this.editPeer.uploadAvatar().then((inputFile) => {\n return this.managers.appChatsManager.editPhoto(id, inputFile);\n }));\n }\n\n Promise.race(promises).finally(() => {\n this.editPeer.nextBtn.removeAttribute('disabled');\n this.close();\n });\n }, {listenerSetter: this.listenerSetter});\n\n\n /* if(appChatsManager.hasRights(-this.peerId, 'change_info')) {\n const discussionRow = new Row({\n titleLangKey: 'PeerInfo.Discussion',\n subtitleLangKey: 'PeerInfo.Discussion.Add',\n clickable: true,\n icon: 'message'\n });\n\n section.content.append(discussionRow.container);\n }\n\n const administratorsRow = new Row({\n titleLangKey: 'PeerInfo.Administrators',\n subtitle: '' + chatFull.admins_count,\n icon: 'admin',\n clickable: true\n });\n\n section.content.append(administratorsRow.container); */\n\n if(isBroadcast && await this.managers.appChatsManager.hasRights(this.chatId, 'change_info')) {\n const signMessagesCheckboxField = new CheckboxField({\n text: 'ChannelSignMessages',\n checked: !!(chat as Chat.channel).pFlags.signatures\n });\n\n this.listenerSetter.add(signMessagesCheckboxField.input)('change', () => {\n const toggle = signMessagesCheckboxField.toggleDisability(true);\n this.managers.appChatsManager.toggleSignatures(this.chatId, signMessagesCheckboxField.checked).then(() => {\n toggle();\n });\n });\n\n addChatUpdateListener(() => {\n signMessagesCheckboxField.setValueSilently(!!(chat as Chat.channel).pFlags.signatures);\n });\n\n section.content.append(CreateRowFromCheckboxField(signMessagesCheckboxField).container);\n }\n }\n\n if(!isBroadcast) {\n const section = new SettingSection({\n\n });\n\n /* const membersRow = new Row({\n titleLangKey: isBroadcast ? 'PeerInfo.Subscribers' : 'GroupMembers',\n icon: 'newgroup',\n clickable: true\n });\n\n membersRow.subtitle.append(i18n('Subscribers', [numberThousandSplitter(335356)]));\n\n section.content.append(membersRow.container); */\n\n if(!isBroadcast && canChangeType) {\n const showChatHistoryCheckboxField = new CheckboxField({\n text: 'ChatHistory'\n });\n\n this.listenerSetter.add(showChatHistoryCheckboxField.input)('change', () => {\n const toggle = showChatHistoryCheckboxField.toggleDisability(true);\n this.managers.appChatsManager.togglePreHistoryHidden(this.chatId, !showChatHistoryCheckboxField.checked).then(() => {\n toggle();\n });\n });\n\n // ! it won't be updated because chatFull will be old\n const onChatUpdate = () => {\n showChatHistoryCheckboxField.setValueSilently(isChannel && !(chatFull as ChatFull.channelFull).pFlags.hidden_prehistory);\n };\n\n onChatUpdate();\n addChatUpdateListener(onChatUpdate);\n\n section.content.append(CreateRowFromCheckboxField(showChatHistoryCheckboxField).container);\n }\n\n if(section.content.childElementCount) {\n this.scrollable.append(section.container);\n }\n }\n\n if(await this.managers.appChatsManager.hasRights(this.chatId, 'delete_chat')) {\n const section = new SettingSection({});\n\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'delete', text: isBroadcast ? 'PeerInfo.DeleteChannel' : 'DeleteAndExitButton'});\n\n attachClickEvent(btnDelete, () => {\n new PopupDeleteDialog(peerId/* , 'delete' */, undefined, (promise) => {\n const toggle = toggleDisability([btnDelete], true);\n promise.then(() => {\n this.close();\n }, () => {\n toggle();\n });\n });\n }, {listenerSetter: this.listenerSetter});\n\n section.content.append(btnDelete);\n\n this.scrollable.append(section.container);\n }\n\n if(!isChannel) {\n // ! this one will fire earlier than tab's closeAfterTimeout (destroy) event and listeners will be erased, so destroy won't fire\n this.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\n if(peerId === migrateFrom) {\n this.chatId = migrateTo.toChatId();\n this._init();\n }\n });\n }\n }\n\n public init() {\n return this._init();\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';\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 Button from '../../button';\nimport ButtonIcon from '../../buttonIcon';\nimport I18n, {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';\nimport {Message} from '../../../layer';\nimport getMessageThreadId from '../../../lib/appManagers/utils/messages/getMessageThreadId';\nimport AppEditTopicTab from './editTopic';\n\ntype SharedMediaHistoryStorage = Partial<{\n [type in SearchSuperType]: {mid: number, peerId: PeerId}[]\n}>;\n\nconst historiesStorage: {\n [peerId: PeerId]: {\n [threadId: number]: SharedMediaHistoryStorage\n }\n} = {};\n\n// TODO: ะพั‚ั€ะตะดะฐะบั‚ะธั€ะพะฒะฐะฝะฝะพะต ัะพะพะฑั‰ะตะฝะธะต ะฝะต ะธะทะผะตะฝะธั‚ัั\nexport default class AppSharedMediaTab extends SliderSuperTab {\n private editBtn: HTMLElement;\n\n private peerId: PeerId;\n private threadId: number;\n\n private searchSuper: AppSearchSuper;\n\n private profile: PeerProfile;\n private peerChanged: boolean;\n\n private titleI18n: I18n.IntlElement;\n\n public isFirst: boolean;\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 if(this.isFirst) {\n animatedCloseIcon.classList.add('state-back');\n }\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.titleI18n = new I18n.IntlElement();\n this.title.append(this.titleI18n.element);\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.managers, this.scrollable, this.listenerSetter);\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 setIsSharedMedia(top <= HEADER_HEIGHT);\n };\n\n const setIsSharedMedia = (isSharedMedia: boolean) => {\n animatedCloseIcon.classList.toggle('state-back', this.isFirst || 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({\n content: transitionContainer,\n type: 'slide-fade',\n transitionTime: 400,\n isHeavy: false\n });\n\n transition(0);\n\n attachClickEvent(this.closeBtn, (e) => {\n if(transition.prevId()) {\n this.scrollable.scrollIntoViewNew({\n element: this.scrollable.container.firstElementChild as HTMLElement,\n position: 'start'\n });\n transition(0);\n\n if(!this.isFirst) {\n animatedCloseIcon.classList.remove('state-back');\n }\n } else if(!this.scrollable.isHeavyAnimationInProgress) {\n this.slider.onCloseBtnClick();\n }\n }, {listenerSetter: this.listenerSetter});\n\n attachClickEvent(this.editBtn, async() => {\n let tab: AppEditChatTab | AppEditContactTab | AppEditTopicTab;\n const {peerId, threadId} = this;\n if(threadId && await this.managers.appPeersManager.isForum(peerId)) {\n tab = this.slider.createTab(AppEditTopicTab)\n } else if(peerId.isAnyChat()) {\n tab = this.slider.createTab(AppEditChatTab);\n } else {\n tab = this.slider.createTab(AppEditContactTab);\n }\n\n if(tab) {\n if(tab instanceof AppEditTopicTab) {\n tab.open(peerId, this.threadId);\n } else {\n if(tab instanceof AppEditChatTab) {\n tab.chatId = peerId.toChatId();\n } else {\n tab.peerId = peerId;\n }\n\n tab.open();\n }\n }\n }, {listenerSetter: this.listenerSetter});\n\n this.listenerSetter.add(rootScope)('contacts_update', (userId) => {\n if(this.peerId === userId) {\n this.toggleEditBtn();\n }\n });\n\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\n if(this.peerId === chatId.toPeerId(true)) {\n this.toggleEditBtn();\n }\n });\n\n this.listenerSetter.add(rootScope)('history_multiappend', (message) => {\n this.renderNewMessage(message);\n });\n\n this.listenerSetter.add(rootScope)('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 this.listenerSetter.add(rootScope)('message_sent', ({message}) => {\n this.renderNewMessage(message);\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 const timeout = mediaTab.type === 'members' && rootScope.settings.animationsEnabled ? 250 : 0;\n setTimeout(() => {\n btnAddMembers.classList.toggle('is-hidden', mediaTab.type !== 'members');\n }, timeout);\n },\n managers: this.managers\n });\n\n this.searchSuper.scrollStartCallback = () => {\n setIsSharedMedia(true);\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 attachClickEvent(btnAddMembers, async() => {\n const peerId = this.peerId;\n const id = this.peerId.toChatId();\n const isChannel = await this.managers.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 = this.slider.createTab(AppAddMembersTab);\n tab.open({\n type: 'channel',\n skippable: false,\n takeOut: (peerIds) => {\n showConfirmation(peerIds, () => {\n const promise = this.managers.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 this.managers.appChatsManager.addChatUser(id, peerId, checked.size ? undefined : 0)\n .catch(onError);\n });\n }, 0);\n }\n });\n }\n }, {listenerSetter: this.listenerSetter});\n\n // console.log('construct shared media time:', performance.now() - perf);\n }\n\n private _renderNewMessage(message: Message.message | Message.messageService, threadId?: number) {\n const historyStorage = historiesStorage[message.peerId]?.[threadId];\n if(!historyStorage) return;\n\n for(const mediaTab of this.searchSuper.mediaTabs) {\n const inputFilter = mediaTab.inputFilter;\n const history = historyStorage[inputFilter];\n if(!history) {\n continue;\n }\n\n const filtered = this.searchSuper.filterMessagesByType([message], inputFilter)\n .filter((message) => !history.find((m) => m.mid === message.mid && m.peerId === message.peerId));\n if(filtered.length) {\n history.unshift(...filtered.map((message) => ({mid: message.mid, peerId: message.peerId})));\n\n if(this.peerId === message.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 private async renderNewMessage(message: Message.message | Message.messageService) {\n if(this.init) return; // * not inited yet\n\n const {peerId} = message;\n const isForum = await this.managers.appPeersManager.isForum(peerId);\n const threadId = getMessageThreadId(message, isForum);\n\n this._renderNewMessage(message);\n if(threadId) {\n this._renderNewMessage(message, threadId);\n }\n }\n\n public _deleteDeletedMessages(historyStorage: SharedMediaHistoryStorage, peerId: PeerId, mids: number[]) {\n for(const mid of mids) {\n for(const type of this.searchSuper.mediaTabs) {\n const inputFilter = type.inputFilter;\n\n const history = historyStorage[inputFilter];\n if(!history) continue;\n\n const idx = history.findIndex((m) => m.mid === mid);\n if(idx === -1) {\n continue;\n }\n\n history.splice(idx, 1);\n\n if(this.peerId === peerId) {\n const container = this.searchSuper.tabs[inputFilter];\n const div = container.querySelector(`[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 // can have element in different tabs somehow\n // break;\n }\n }\n }\n\n public deleteDeletedMessages(peerId: PeerId, mids: number[]) {\n if(this.init) return; // * not inited yet\n\n const h = historiesStorage[peerId];\n if(!h) return;\n\n for(const threadId in h) {\n this._deleteDeletedMessages(h[threadId], peerId, mids);\n }\n\n this.scrollable.onScroll();\n }\n\n private async cleanupHTML() {\n // const perf = performance.now();\n const isAnyChat = this.peerId.isAnyChat();\n const [canViewMembers, hasRights] = await Promise.all([\n isAnyChat ? this.searchSuper.canViewMembers() : false,\n isAnyChat ? this.managers.appChatsManager.hasRights(this.peerId.toChatId(), 'invite_users') : false\n ]);\n\n return () => {\n this.profile.cleanupHTML();\n this.editBtn.classList.add('hide');\n this.searchSuper.cleanupHTML(true);\n this.container.classList.toggle('can-add-members', canViewMembers && hasRights);\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?: number) {\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: (historiesStorage[peerId] ??= {})[threadId] ??= {}\n });\n\n this.profile.setPeer(peerId, threadId);\n\n return true;\n }\n\n private async changeTitleKey() {\n const isForum = this.managers.appPeersManager.isForum(this.peerId);\n\n return () => {\n this.titleI18n.compareAndUpdate({key: this.threadId && isForum ? 'AccDescrTopic' : 'Profile'});\n };\n }\n\n public async fillProfileElements() {\n if(!this.peerChanged) {\n return;\n }\n\n this.peerChanged = false;\n const callbacks = await Promise.all([\n this.cleanupHTML(),\n this.toggleEditBtn(true),\n this.profile.fillProfileElements(),\n this.changeTitleKey()\n ]);\n\n return () => {\n callbacks.forEach((callback) => {\n callback?.();\n });\n };\n }\n\n private async toggleEditBtn(manual?: T): Promise void : void> {\n let show: boolean;\n if(this.peerId.isUser()) {\n show = this.peerId !== rootScope.myId && await this.managers.appUsersManager.isContact(this.peerId.toUserId());\n } else {\n const chatId = this.peerId.toChatId();\n const isTopic = this.threadId && await this.managers.appChatsManager.isForum(chatId);\n show = await this.managers.appChatsManager.hasRights(chatId, isTopic ? 'manage_topics' : 'change_info');\n }\n\n const callback = () => {\n this.editBtn.classList.toggle('hide', !show);\n };\n\n return manual ? callback : callback() as any;\n }\n\n public loadSidebarMedia(single: boolean, justLoad?: boolean) {\n this.searchSuper.load(single, justLoad);\n }\n\n onOpenAfterTimeout() {\n super.onOpenAfterTimeout();\n\n this.scrollable.onScroll();\n }\n\n onCloseAfterTimeout() {\n super.onCloseAfterTimeout();\n\n if(this.destroyable) {\n this.profile.destroy();\n this.searchSuper.destroy();\n }\n }\n\n public destroy() {\n this.destroyable = true;\n this.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 rootScope from '../lib/rootScope';\n\ntype SetTransitionOptions = {\n element: HTMLElement,\n className: string,\n forwards: boolean,\n duration: number,\n onTransitionEnd?: () => void,\n useRafs?: number,\n onTransitionStart?: () => void\n};\nconst SetTransition = (options: SetTransitionOptions) => {\n const {element, className, forwards, duration, onTransitionEnd, onTransitionStart, useRafs} = options;\n const {timeout, raf} = element.dataset;\n if(timeout !== undefined) {\n clearTimeout(+timeout);\n }\n\n // useRafs = undefined;\n // duration = 0;\n\n if(raf !== undefined) {\n window.cancelAnimationFrame(+raf);\n if(!useRafs) {\n delete element.dataset.raf;\n }\n }\n\n // if(forwards && className && element.classList.contains(className) && !element.classList.contains('animating')) {\n // return;\n // }\n\n if(useRafs && rootScope.settings.animationsEnabled && duration) {\n element.dataset.raf = '' + window.requestAnimationFrame(() => {\n delete element.dataset.raf;\n SetTransition({\n ...options,\n useRafs: useRafs - 1\n });\n });\n\n return;\n }\n\n if(forwards && className) {\n element.classList.add(className);\n }\n\n const afterTimeout = () => {\n delete element.dataset.timeout;\n if(!forwards && className) {\n element.classList.remove('backwards', className);\n }\n\n element.classList.remove('animating');\n\n onTransitionEnd?.();\n };\n\n onTransitionStart?.();\n if(!rootScope.settings.animationsEnabled || !duration) {\n element.classList.remove('animating', 'backwards');\n afterTimeout();\n return;\n }\n\n element.classList.add('animating');\n\n element.classList.toggle('backwards', !forwards);\n element.dataset.timeout = '' + setTimeout(afterTimeout, duration);\n};\n\nexport default SetTransition;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {horizontalMenu} from './horizontalMenu';\nimport TransitionSlider from './transition';\nimport appNavigationController, {NavigationItem} from './appNavigationController';\nimport SliderSuperTab, {SliderSuperTabConstructable} from './sliderTab';\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\nimport safeAssign from '../helpers/object/safeAssign';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport {getMiddleware, MiddlewareHelper} from '../helpers/middleware';\nimport {MaybePromise} from '../types';\n\nconst TRANSITION_TIME = 250;\n\nexport {SliderSuperTab};\n\nexport default class SidebarSlider {\n protected _selectTab: ReturnType;\n protected historyTabIds: (number | SliderSuperTab)[] = []; // * key is any, since right sidebar is ugly nowz\n protected tabsContainer: HTMLElement;\n public sidebarEl: HTMLElement;\n protected tabs: Map; // * key is any, since right sidebar is ugly now\n private canHideFirst = false;\n private navigationType: NavigationItem['type'];\n protected managers: AppManagers;\n protected middlewareHelper: MiddlewareHelper;\n public onOpenTab: () => MaybePromise;\n\n constructor(options: {\n sidebarEl: SidebarSlider['sidebarEl'],\n tabs?: SidebarSlider['tabs'],\n canHideFirst?: SidebarSlider['canHideFirst'],\n navigationType: SidebarSlider['navigationType']\n }) {\n safeAssign(this, options);\n\n this.tabs ??= new Map();\n\n this.tabsContainer = this.sidebarEl.querySelector('.sidebar-slider');\n this._selectTab = TransitionSlider({\n content: this.tabsContainer,\n type: 'navigation',\n transitionTime: TRANSITION_TIME\n });\n if(!this.canHideFirst) {\n this._selectTab(0);\n }\n\n this.middlewareHelper = getMiddleware();\n\n // Array.from(this.sidebarEl.querySelectorAll('.sidebar-close-button') as any as HTMLElement[]).forEach((el) => {\n // attachClickEvent(el, this.onCloseBtnClick);\n // });\n }\n\n public getMiddleware() {\n return this.middlewareHelper.get();\n }\n\n public onCloseBtnClick = () => {\n const item = appNavigationController.findItemByType(this.navigationType);\n if(item) {\n appNavigationController.back(this.navigationType);\n } else if(this.historyTabIds.length) {\n this.closeTab(this.historyTabIds[this.historyTabIds.length - 1]);\n }\n // this.closeTab();\n };\n\n public closeTab = (id?: number | SliderSuperTab, animate?: boolean, isNavigation?: boolean) => {\n if(id !== undefined && this.historyTabIds[this.historyTabIds.length - 1] !== id) {\n this.removeTabFromHistory(id);\n return false;\n }\n\n // console.log('sidebar-close-button click:', this.historyTabIDs);\n const closingId = this.historyTabIds.pop(); // pop current\n this.onCloseTab(closingId, animate, isNavigation);\n\n const tab = this.historyTabIds[this.historyTabIds.length - 1];\n this._selectTab(tab !== undefined ? (tab instanceof SliderSuperTab ? tab.container : tab) : (this.canHideFirst ? -1 : 0), animate);\n return true;\n };\n\n public async selectTab(id: number | SliderSuperTab) {\n /* if(id instanceof SliderSuperTab) {\n id = id.id;\n } */\n\n if(this.historyTabIds[this.historyTabIds.length - 1] === id) {\n return false;\n }\n\n const tab: SliderSuperTab = id instanceof SliderSuperTab ? id : this.tabs.get(id);\n this.onOpenTab && await this.onOpenTab();\n\n if(tab) {\n // @ts-ignore\n tab.onOpen?.();\n\n // @ts-ignore\n if(tab.onOpenAfterTimeout) {\n setTimeout(() => {\n // @ts-ignore\n tab.onOpenAfterTimeout();\n }, TRANSITION_TIME);\n }\n }\n\n // if(!this.canHideFirst || this.historyTabIds.length) {\n appNavigationController.pushItem({\n type: this.navigationType,\n onPop: (canAnimate) => {\n this.closeTab(undefined, canAnimate, true);\n return true;\n }\n });\n // }\n\n this.historyTabIds.push(id);\n this._selectTab(id instanceof SliderSuperTab ? id.container : id);\n return true;\n }\n\n public removeTabFromHistory(id: number | SliderSuperTab) {\n indexOfAndSplice(this.historyTabIds, id);\n this.onCloseTab(id, undefined);\n }\n\n public sliceTabsUntilTab(tabConstructor: SliderSuperTabConstructable, preserveTab: SliderSuperTab) {\n for(let i = this.historyTabIds.length - 1; i >= 0; --i) {\n const tab = this.historyTabIds[i];\n if(tab === preserveTab) continue;\n else if(tab instanceof tabConstructor) {\n break;\n }\n\n this.removeTabFromHistory(tab);\n // appNavigationController.removeByType(this.navigationType, true);\n }\n }\n\n public getTab(tabConstructor: SliderSuperTabConstructable) {\n return this.historyTabIds.find((t) => t instanceof tabConstructor) as T;\n }\n\n public getHistory() {\n return this.historyTabIds;\n }\n\n public isTabExists(tabConstructor: SliderSuperTabConstructable) {\n return !!this.getTab(tabConstructor);\n }\n\n protected onCloseTab(id: number | SliderSuperTab, animate: boolean, isNavigation?: boolean) {\n if(!isNavigation) {\n appNavigationController.removeByType(this.navigationType, true);\n }\n\n const tab: SliderSuperTab = id instanceof SliderSuperTab ? id : this.tabs.get(id);\n if(tab) {\n try {\n // @ts-ignore\n tab.onClose?.();\n } catch(err) {\n console.error('tab onClose error', tab);\n }\n\n // @ts-ignore\n if(tab.onCloseAfterTimeout) {\n setTimeout(() => {\n // @ts-ignore\n tab.onCloseAfterTimeout();\n }, TRANSITION_TIME + 30);\n }\n }\n }\n\n public addTab(tab: SliderSuperTab) {\n if(!tab.container.parentElement) {\n this.tabsContainer.append(tab.container);\n\n if(tab.closeBtn) {\n tab.closeBtn.addEventListener('click', this.onCloseBtnClick);\n }\n }\n }\n\n public deleteTab(tab: SliderSuperTab) {\n this.tabs.delete(tab);\n }\n\n public createTab(\n ctor: SliderSuperTabConstructable,\n destroyable = true,\n doNotAppend?: boolean\n ) {\n const tab = new ctor(doNotAppend ? undefined : this, destroyable);\n tab.managers = this.managers;\n return tab;\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 EventListenerBase from '../helpers/eventListenerBase';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {getMiddleware, MiddlewareHelper} from '../helpers/middleware';\nimport noop from '../helpers/noop';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport {i18n, LangPackKey} from '../lib/langPack';\nimport ButtonIcon from './buttonIcon';\nimport Scrollable from './scrollable';\nimport SidebarSlider from './slider';\n\nexport interface SliderSuperTabConstructable {\n new(slider: SidebarSlider, destroyable: boolean): T;\n}\n\nexport interface SliderSuperTabEventableConstructable {\n new(slider: SidebarSlider, destroyable: boolean): SliderSuperTabEventable;\n}\n\nexport default class SliderSuperTab {\n public static getInitArgs?(fromTab: SliderSuperTab): any;\n\n public container: HTMLElement;\n\n public header: HTMLElement;\n public closeBtn: HTMLElement;\n public title: HTMLElement;\n\n public content: HTMLElement;\n public scrollable: Scrollable;\n\n public slider: SidebarSlider;\n public destroyable: boolean;\n public listenerSetter: ListenerSetter;\n\n public managers: AppManagers;\n public middlewareHelper: MiddlewareHelper;\n\n constructor(slider: SidebarSlider, destroyable?: boolean) {\n this._constructor(slider, destroyable);\n }\n\n public _constructor(slider: SidebarSlider, destroyable = true): any {\n this.slider = slider;\n this.middlewareHelper = slider ? slider.getMiddleware().create() : getMiddleware();\n this.destroyable = destroyable;\n\n this.container = document.createElement('div');\n this.container.classList.add('tabs-tab', 'sidebar-slider-item');\n\n // * Header\n this.header = document.createElement('div');\n this.header.classList.add('sidebar-header');\n\n this.closeBtn = ButtonIcon('left sidebar-close-button', {noRipple: true});\n this.title = document.createElement('div');\n this.title.classList.add('sidebar-header__title');\n this.header.append(this.closeBtn, this.title);\n\n // * Content\n this.content = document.createElement('div');\n this.content.classList.add('sidebar-content');\n\n this.scrollable = new Scrollable(this.content, undefined, undefined, true);\n this.scrollable.attachBorderListeners(this.container);\n\n this.container.append(this.header, this.content);\n\n this.slider?.addTab(this);\n\n this.listenerSetter = new ListenerSetter();\n }\n\n public close() {\n return this.slider.closeTab(this);\n }\n\n public async open(...args: Parameters) {\n if(this.init) {\n try {\n const result = this.init(...args);\n this.init = null;\n\n if(result instanceof Promise) {\n await result;\n }\n } catch(err) {\n console.error('open tab error', err);\n }\n }\n\n this.slider.selectTab(this);\n }\n\n public init(...args: any[]): Promise | any {\n\n }\n\n protected onOpen() {}\n protected onOpenAfterTimeout() {}\n protected onClose() {}\n\n protected onCloseAfterTimeout() {\n if(this.destroyable) { // ! WARNING, ะฟะพะบะฐ ั‡ั‚ะพ ัั‚ะพ ะฑัƒะดะตั‚ ั€ะฐะฑะพั‚ะฐั‚ัŒ ั‚ะพะปัŒะบะพ ั ัะฐะผะพะน ะฟะพัะปะตะดะฝะตะน ะฒะฝัƒั‚ั€ะตะฝะฝะตะน ะฒะบะปะฐะดะบะพะน !\n this.slider?.deleteTab(this);\n this.container.remove();\n this.scrollable.destroy();\n this.listenerSetter?.removeAll();\n this.middlewareHelper?.destroy();\n }\n }\n\n protected setTitle(key: LangPackKey) {\n this.title.replaceChildren(i18n(key));\n }\n}\n\nexport class SliderSuperTabEventable extends SliderSuperTab {\n public eventListener: EventListenerBase<{\n destroy: () => void | Promise,\n destroyAfter: (promise: Promise) => void,\n close: () => void\n }>;\n\n constructor(slider: SidebarSlider) {\n super(slider);\n this.eventListener = new EventListenerBase();\n }\n\n onClose() {\n this.eventListener.dispatchEvent('close');\n }\n\n onCloseAfterTimeout() {\n const results = this.eventListener.dispatchResultableEvent('destroy');\n this.eventListener.dispatchEvent('destroyAfter', Promise.all(results).then(noop, noop));\n this.eventListener.cleanup();\n return super.onCloseAfterTimeout();\n }\n}\n\n/* // @ts-ignore\ninterface SliderSuperEventsTab extends SliderSuperTab, EventListenerBase<{}> {\n superConstructor: (...args: any[]) => any;\n}\nclass SliderSuperEventsTab implements SliderSuperEventsTab {\n constructor(slider: SidebarSlider) {\n this.superConstructor([slider, true]);\n }\n}\napplyMixins(SliderSuperEventsTab, [SliderSuperTab, EventListenerBase]);\n\n(window as any).lol = SliderSuperEventsTab\n\nexport {SliderSuperEventsTab}; */\n","/*\n * 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, {AppDialogsManager, DialogDom, DialogElementSize} from '../lib/appManagers/appDialogsManager';\nimport {getHeavyAnimationPromise} from '../hooks/useHeavyAnimationCheck';\nimport isInDOM from '../helpers/dom/isInDOM';\nimport positionElementByIndex from '../helpers/dom/positionElementByIndex';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport {fastRaf} from '../helpers/schedulers';\nimport SortedList, {SortedElementBase} from '../helpers/sortedList';\nimport safeAssign from '../helpers/object/safeAssign';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport getUserStatusString from './wrappers/getUserStatusString';\nimport type LazyLoadQueue from './lazyLoadQueue';\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: LazyLoadQueue;\n protected avatarSize: DialogElementSize = 'abitbigger';\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 protected managers: AppManagers;\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 managers: SortedUserList['managers']\n }) {\n super({\n getIndex: options.getIndex || ((element) => this.managers.appUsersManager.getUserStatusForSort(element.id)),\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onListLengthChange && this.onListLengthChange();\n },\n onUpdate: options.onUpdate || (async(element) => {\n const status = getUserStatusString(await this.managers.appUsersManager.getUser(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 peerId: base.id,\n container: false,\n avatarSize: this.avatarSize,\n autonomous: this.autonomous,\n meAsSaved: false,\n rippleEnabled: this.rippleEnabled,\n wrapOptions: {\n lazyLoadQueue: this.lazyLoadQueue\n }\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 IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {simulateClickEvent, attachClickEvent} from '../helpers/dom/clickEvent';\nimport findUpAsChild from '../helpers/dom/findUpAsChild';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport getVisibleRect from '../helpers/dom/getVisibleRect';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {makeMediaSize} from '../helpers/mediaSize';\nimport {getMiddleware, Middleware} from '../helpers/middleware';\nimport {doubleRaf} from '../helpers/schedulers';\nimport pause from '../helpers/schedulers/pause';\nimport windowSize from '../helpers/windowSize';\nimport {MyDocument} from '../lib/appManagers/appDocsManager';\nimport getStickerEffectThumb from '../lib/appManagers/utils/stickers/getStickerEffectThumb';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport {CustomEmojiElement} from '../lib/richTextProcessor/wrapRichText';\nimport lottieLoader from '../lib/rlottie/lottieLoader';\nimport RLottiePlayer from '../lib/rlottie/rlottiePlayer';\nimport rootScope from '../lib/rootScope';\nimport animationIntersector, {AnimationItemGroup} from './animationIntersector';\nimport SetTransition from './singleTransition';\nimport wrapSticker from './wrappers/sticker';\nimport {STICKER_EFFECT_MULTIPLIER} from './wrappers/sticker';\n\nlet hasViewer = false;\nexport default function attachStickerViewerListeners({listenTo, listenerSetter, selector, findTarget: originalFindTarget}: {\n listenerSetter: ListenerSetter,\n listenTo: HTMLElement,\n selector?: string,\n findTarget?: (e: MouseEvent) => HTMLElement\n}) {\n if(IS_TOUCH_SUPPORTED) {\n return;\n }\n\n const findTarget = (e: MouseEvent, checkForParent?: boolean) => {\n let el: HTMLElement;\n if(originalFindTarget) el = originalFindTarget(e);\n else {\n const s = selector || `.media-sticker-wrapper`;\n el = (e.target as HTMLElement).closest(s) as HTMLElement;\n }\n\n return el && (!checkForParent || findUpAsChild(el, listenTo)) ? el : undefined;\n };\n\n const managers = rootScope.managers;\n\n listenerSetter.add(listenTo)('mousedown', (e) => {\n if(hasViewer || e.buttons > 1 || e.button !== 0) return;\n let mediaContainer = findTarget(e);\n if(!mediaContainer) {\n return;\n }\n\n // const img: HTMLImageElement = mediaContainer.querySelector('img.media-sticker');\n\n const docId = mediaContainer.dataset.docId;\n if(!docId) {\n return;\n }\n\n const className = 'sticker-viewer';\n const group: AnimationItemGroup = 'STICKER-VIEWER';\n const openDuration = 200;\n const switchDuration = 200;\n const previousGroup = animationIntersector.getOnlyOnePlayableGroup();\n const _middleware = getMiddleware();\n let container: HTMLElement, previousTransformer: HTMLElement;\n\n const doThatSticker = async({mediaContainer, doc, middleware, lockGroups, isSwitching}: {\n mediaContainer: HTMLElement,\n doc: MyDocument,\n middleware: Middleware,\n lockGroups?: boolean,\n isSwitching?: boolean\n }) => {\n const effectThumb = getStickerEffectThumb(doc);\n const mediaRect: DOMRect = mediaContainer.getBoundingClientRect();\n const s = makeMediaSize(doc.w, doc.h);\n const size = effectThumb ? 280 : 360;\n const boxSize = makeMediaSize(size, size);\n const fitted = mediaRect.width === mediaRect.height ? boxSize : s.aspectFitted(boxSize);\n\n const bubble = findUpClassName(mediaContainer, 'bubble');\n const isOut = bubble ? bubble.classList.contains('is-out') : true;\n\n const transformer = document.createElement('div');\n transformer.classList.add(className + '-transformer');\n\n const stickerContainer = document.createElement('div');\n stickerContainer.classList.add(className + '-sticker');\n /* transformer.style.width = */stickerContainer.style.width = fitted.width + 'px';\n /* transformer.style.height = */stickerContainer.style.height = fitted.height + 'px';\n\n const stickerEmoji = document.createElement('div');\n stickerEmoji.classList.add(className + '-emoji');\n stickerEmoji.append(wrapEmojiText(doc.stickerEmojiRaw));\n\n if(effectThumb) {\n const margin = (size * STICKER_EFFECT_MULTIPLIER - size) / 3 * (isOut ? 1 : -1);\n transformer.classList.add('has-effect');\n // const property = `--margin-${isOut ? 'right' : 'left'}`;\n // stickerContainer.style.setProperty(property, `${margin * 2}px`);\n transformer.style.setProperty('--translateX', `${margin}px`);\n stickerEmoji.style.setProperty('--translateX', `${-margin}px`);\n }\n\n const overflowElement = findUpClassName(mediaContainer, 'scrollable');\n const visibleRect = getVisibleRect(mediaContainer, overflowElement, true, mediaRect);\n if(visibleRect.overflow.vertical || visibleRect.overflow.horizontal) {\n stickerContainer.classList.add('is-overflow');\n }\n\n // if(img) {\n // const ratio = img.naturalWidth / img.naturalHeight;\n // if((mediaRect.width / mediaRect.height).toFixed(1) !== ratio.toFixed(1)) {\n\n // mediaRect = mediaRect.toJSON();\n // }\n // }\n\n const rect = mediaContainer.getBoundingClientRect();\n const scaleX = rect.width / fitted.width;\n const scaleY = rect.height / fitted.height;\n const transformX = rect.left - (windowSize.width - rect.width) / 2;\n const transformY = rect.top - (windowSize.height - rect.height) / 2;\n transformer.style.transform = `translate(${transformX}px, ${transformY}px) scale(${scaleX}, ${scaleY})`;\n if(isSwitching) transformer.classList.add('is-switching');\n transformer.append(stickerContainer, stickerEmoji);\n container.append(transformer);\n\n const o = await wrapSticker({\n doc,\n div: stickerContainer,\n group,\n width: fitted.width,\n height: fitted.height,\n play: false,\n loop: true,\n middleware,\n managers,\n needFadeIn: false,\n isOut,\n withThumb: false,\n relativeEffect: true,\n loopEffect: true\n }).then(({render}) => render);\n if(!middleware()) return;\n\n if(!container.parentElement) {\n document.body.append(container);\n }\n\n const player = Array.isArray(o) ? o[0] : o;\n\n const firstFramePromise = player instanceof RLottiePlayer ?\n new Promise((resolve) => player.addEventListener('firstFrame', resolve, {once: true})) :\n Promise.resolve();\n await Promise.all([firstFramePromise, doubleRaf()]);\n await pause(0); // ! need it because firstFrame will be called just from the loop\n if(!middleware()) return;\n\n if(lockGroups) {\n animationIntersector.setOnlyOnePlayableGroup(group);\n animationIntersector.checkAnimations2(true);\n }\n\n if(player instanceof RLottiePlayer) {\n const prevPlayer = mediaContainer instanceof CustomEmojiElement ?\n mediaContainer.player as RLottiePlayer :\n lottieLoader.getAnimation(mediaContainer);\n if(prevPlayer) {\n player.curFrame = prevPlayer.curFrame;\n player.play();\n await new Promise((resolve) => {\n let i = 0;\n const c = () => {\n if(++i === 2) {\n resolve();\n player.removeEventListener('enterFrame', c);\n }\n };\n\n player.addEventListener('enterFrame', c);\n });\n if(!middleware()) return;\n player.pause();\n }\n } else if(player instanceof HTMLVideoElement) {\n const prevPlayer = mediaContainer.querySelector('video');\n if(prevPlayer) {\n player.currentTime = prevPlayer.currentTime;\n }\n }\n\n return {\n ready: () => {\n if(player instanceof RLottiePlayer || player instanceof HTMLVideoElement) {\n player.play();\n }\n\n if(effectThumb) {\n simulateClickEvent(stickerContainer);\n }\n },\n transformer\n };\n };\n\n const timeout = window.setTimeout(async() => {\n document.removeEventListener('mousemove', onMousePreMove);\n\n container = document.createElement('div');\n container.classList.add(className);\n hasViewer = true;\n\n const middleware = _middleware.get();\n const doc = await managers.appDocsManager.getDoc(docId);\n if(!middleware()) return;\n\n let result: Awaited>;\n try {\n result = await doThatSticker({\n doc,\n mediaContainer,\n middleware,\n lockGroups: true\n });\n if(!result) return;\n } catch(err) {\n return;\n }\n\n const {ready, transformer} = result;\n\n previousTransformer = transformer;\n\n SetTransition({\n element: container,\n className: 'is-visible',\n forwards: true,\n duration: openDuration,\n onTransitionEnd: () => {\n if(!middleware()) return;\n ready();\n }\n });\n\n document.addEventListener('mousemove', onMouseMove);\n }, 125);\n\n const onMouseMove = async(e: MouseEvent) => {\n const newMediaContainer = findTarget(e, true);\n if(!newMediaContainer || mediaContainer === newMediaContainer) {\n return;\n }\n\n const docId = newMediaContainer.dataset.docId;\n if(!docId) {\n return;\n }\n\n mediaContainer = newMediaContainer;\n _middleware.clean();\n const middleware = _middleware.get();\n\n const doc = await managers.appDocsManager.getDoc(docId);\n if(!middleware()) return;\n\n let r: Awaited>;\n try {\n r = await doThatSticker({\n doc,\n mediaContainer,\n middleware,\n isSwitching: true\n });\n if(!r) return;\n } catch(err) {\n console.error('sticker viewer error', err);\n return;\n }\n\n const {ready, transformer} = r;\n\n const _previousTransformer = previousTransformer;\n SetTransition({\n element: _previousTransformer,\n className: 'is-switching',\n forwards: true,\n duration: switchDuration,\n onTransitionEnd: () => {\n _previousTransformer.remove();\n }\n });\n\n previousTransformer = transformer;\n\n SetTransition({\n element: transformer,\n className: 'is-switching',\n forwards: false,\n duration: switchDuration,\n onTransitionEnd: () => {\n if(!middleware()) return;\n ready();\n }\n });\n };\n\n const onMousePreMove = (e: MouseEvent) => {\n if(!findUpAsChild(e.target as HTMLElement, mediaContainer)) {\n onMouseUp();\n }\n };\n\n const onMouseUp = () => {\n clearTimeout(timeout);\n _middleware.clean();\n\n if(container) {\n SetTransition({\n element: container,\n className: 'is-visible',\n forwards: false,\n duration: openDuration,\n onTransitionEnd: () => {\n container.remove();\n animationIntersector.setOnlyOnePlayableGroup(previousGroup);\n animationIntersector.checkAnimations2(false);\n hasViewer = false;\n }\n });\n\n attachClickEvent(document.body, cancelEvent, {capture: true, once: true});\n }\n\n document.removeEventListener('mousemove', onMousePreMove);\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp, {capture: true});\n };\n\n document.addEventListener('mousemove', onMousePreMove);\n document.addEventListener('mouseup', onMouseUp, {once: true, capture: 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\nexport default class StickyIntersector {\n private headersObserver: IntersectionObserver;\n private elementsObserver: IntersectionObserver;\n\n constructor(private container: HTMLElement, private handler: (stuck: boolean, target: HTMLElement) => void) {\n this.observeHeaders();\n this.observeElements();\n }\n\n /**\n * Sets up an intersection observer to notify when elements with the class\n * `.sticky_sentinel--top` become visible/invisible at the top of the container.\n * @param {!Element} container\n */\n private observeHeaders() {\n this.headersObserver = new IntersectionObserver((entries) => {\n for(const entry of entries) {\n const targetInfo = entry.boundingClientRect;\n const stickyTarget = entry.target.parentElement;\n const rootBoundsInfo = entry.rootBounds;\n\n // Started sticking.\n if(targetInfo.bottom < rootBoundsInfo.top) {\n this.handler(true, stickyTarget);\n }\n\n // Stopped sticking.\n if(targetInfo.bottom >= rootBoundsInfo.top &&\n targetInfo.bottom < rootBoundsInfo.bottom) {\n this.handler(false, stickyTarget);\n }\n }\n }, {threshold: 0, root: this.container});\n }\n\n private observeElements() {\n this.elementsObserver = new IntersectionObserver((entries) => {\n const entry = entries\n .filter((entry) => entry.boundingClientRect.top < entry.rootBounds.top)\n .sort((a, b) => a.boundingClientRect.top - b.boundingClientRect.top)[0];\n if(!entry) return;\n\n const container = entry.isIntersecting ? entry.target : entry.target.nextElementSibling;\n this.handler(true, container as HTMLElement);\n }, {root: this.container});\n }\n\n /**\n * @param {!Element} container\n * @param {string} className\n */\n private addSentinel(container: HTMLElement, className: string) {\n const sentinel = document.createElement('div');\n sentinel.classList.add('sticky_sentinel', className);\n return container.appendChild(sentinel);\n }\n\n /**\n * Notifies when elements w/ the `sticky` class begin to stick or stop sticking.\n * Note: the elements should be children of `container`.\n * @param {!Element} container\n */\n public observeStickyHeaderChanges(element: HTMLElement) {\n const headerSentinel = this.addSentinel(element, 'sticky_sentinel--top');\n this.headersObserver.observe(headerSentinel);\n\n this.elementsObserver.observe(element);\n }\n\n public disconnect() {\n this.headersObserver.disconnect();\n this.elementsObserver.disconnect();\n }\n\n public unobserve(element: HTMLElement, headerSentinel: HTMLElement) {\n this.elementsObserver.unobserve(element);\n this.headersObserver.unobserve(headerSentinel);\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// * zoom part from WebZ\n// * https://github.com/Ajaxy/telegram-tt/blob/069f4f5b2f2c7c22529ccced876842e7f9cb81f4/src/util/captureEvents.ts\n\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport safeAssign from '../helpers/object/safeAssign';\nimport contextMenuController from '../helpers/contextMenuController';\nimport {Middleware} from '../helpers/middleware';\nimport ListenerSetter, {Listener, ListenerOptions} from '../helpers/listenerSetter';\nimport {attachContextMenuListener} from '../helpers/dom/attachContextMenuListener';\nimport pause from '../helpers/schedulers/pause';\nimport deferredPromise from '../helpers/cancellablePromise';\nimport clamp from '../helpers/number/clamp';\nimport debounce from '../helpers/schedulers/debounce';\nimport {logger} from '../lib/logger';\nimport isSwipingBackSafari from '../helpers/dom/isSwipingBackSafari';\nimport windowSize from '../helpers/windowSize';\n\ntype E = {\n clientX: number,\n clientY: number,\n target: EventTarget,\n button?: number,\n type?: string\n};\n\ntype EE = E | (Exclude & {\n touches: E[]\n});\n\nconst getEvent = (e: EE) => {\n return 'touches' in e ? e.touches[0] : e;\n};\n\nfunction getDistance(a: Touch, b?: Touch) {\n if(!b) return 0;\n return Math.hypot((b.pageX - a.pageX), (b.pageY - a.pageY));\n}\n\nfunction getTouchCenter(a: Touch, b: Touch) {\n return {\n x: (a.pageX + b.pageX) / 2,\n y: (a.pageY + b.pageY) / 2\n };\n}\n\nconst attachGlobalListenerTo = document;\n\nlet RESET_GLOBAL = false;\ncontextMenuController.addEventListener('toggle', (visible) => {\n RESET_GLOBAL = visible;\n});\n\nexport type SwipeHandlerOptions = {\n element: SwipeHandler['element'],\n onSwipe: SwipeHandler['onSwipe'],\n verifyTouchTarget?: SwipeHandler['verifyTouchTarget'],\n onFirstSwipe?: SwipeHandler['onFirstSwipe'],\n onReset?: SwipeHandler['onReset'],\n onStart?: SwipeHandler['onStart'],\n onZoom?: SwipeHandler['onZoom'],\n onDrag?: SwipeHandler['onDrag'],\n onDoubleClick?: SwipeHandler['onDoubleClick'],\n cursor?: SwipeHandler['cursor'],\n cancelEvent?: SwipeHandler['cancelEvent'],\n listenerOptions?: SwipeHandler['listenerOptions'],\n setCursorTo?: HTMLElement,\n middleware?: Middleware,\n withDelay?: boolean,\n minZoom?: number,\n maxZoom?: number\n};\n\nconst TOUCH_MOVE_OPTIONS: ListenerOptions = {passive: false};\nconst MOUSE_MOVE_OPTIONS: ListenerOptions = false as any;\nconst WHEEL_OPTIONS: ListenerOptions = {capture: true, passive: false};\n\nexport type ZoomDetails = {\n zoom?: number;\n zoomFactor?: number;\n zoomAdd?: number;\n initialCenterX: number;\n initialCenterY: number;\n dragOffsetX: number;\n dragOffsetY: number;\n currentCenterX: number;\n currentCenterY: number;\n};\n\nexport default class SwipeHandler {\n private element: HTMLElement;\n private onSwipe: (xDiff: number, yDiff: number, e: EE, cancelDrag?: (x: boolean, y: boolean) => void) => boolean | void;\n private verifyTouchTarget: (evt: EE) => boolean | Promise;\n private onFirstSwipe: (e: EE) => void;\n private onReset: () => void;\n private onStart: () => void;\n private onZoom: (details: ZoomDetails) => void;\n private onDrag: (e: EE, captureEvent: E, details: {dragOffsetX: number, dragOffsetY: number}, cancelDrag: (x: boolean, y: boolean) => void) => void;\n private onDoubleClick: (details: {centerX: number, centerY: number}) => void;\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' | '';\n private cancelEvent: boolean;\n private listenerOptions: ListenerOptions;\n private setCursorTo: HTMLElement;\n\n private isMouseDown: boolean;\n private tempId: number;\n\n private hadMove: boolean;\n private eventUp: E;\n private xDown: number;\n private yDown: number;\n private xAdded: number;\n private yAdded: number;\n\n private withDelay: boolean;\n private listenerSetter: ListenerSetter;\n\n private initialDistance: number;\n private initialTouchCenter: ReturnType;\n private initialDragOffset: {x: number, y: number};\n private isDragCanceled: {x: boolean, y: boolean};\n private wheelZoom: number;\n private releaseWheelDrag: ReturnType void>>;\n private releaseWheelZoom: ReturnType void>>;\n\n private log: ReturnType;\n\n constructor(options: SwipeHandlerOptions) {\n safeAssign(this, options);\n\n this.log = logger('SWIPE-HANDLER');\n this.cursor ??= 'grabbing';\n this.cancelEvent ??= true;\n // this.listenerOptions ??= false as any;\n this.listenerOptions ??= TOUCH_MOVE_OPTIONS;\n\n this.setCursorTo ??= this.element;\n this.listenerSetter = new ListenerSetter();\n this.setListeners();\n\n this.resetValues();\n this.tempId = 0;\n\n options.middleware?.onDestroy(() => {\n this.reset();\n this.removeListeners();\n });\n\n this.releaseWheelDrag = debounce(this.reset, 150, false);\n this.releaseWheelZoom = debounce(this.reset, 150, false);\n }\n\n public setListeners() {\n if(!IS_TOUCH_SUPPORTED) {\n // @ts-ignore\n this.listenerSetter.add(this.element)('mousedown', this.handleStart, this.listenerOptions);\n this.listenerSetter.add(attachGlobalListenerTo)('mouseup', this.reset);\n\n if(this.onZoom || this.onDoubleClick) {\n this.listenerSetter.add(this.element)('wheel', this.handleWheel, WHEEL_OPTIONS);\n }\n } else {\n if(this.withDelay) {\n attachContextMenuListener({\n element: this.element,\n callback: (e) => {\n cancelEvent(e);\n // @ts-ignore\n this.handleStart(e);\n },\n listenerSetter: this.listenerSetter,\n listenerOptions: this.listenerOptions\n });\n } else {\n // @ts-ignore\n this.listenerSetter.add(this.element)('touchstart', this.handleStart, this.listenerOptions);\n }\n\n if(this.onDoubleClick) {\n this.listenerSetter.add(this.element)('dblclick', (e) => {\n this.onDoubleClick({centerX: e.pageX, centerY: e.pageY});\n });\n }\n\n this.listenerSetter.add(attachGlobalListenerTo)('touchend', this.reset);\n }\n }\n\n public removeListeners() {\n this.log('remove listeners');\n this.reset();\n this.listenerSetter.removeAll();\n }\n\n public setCursor(cursor: SwipeHandler['cursor'] = '') {\n this.cursor = cursor;\n\n if(!IS_TOUCH_SUPPORTED && this.hadMove) {\n this.setCursorTo.style.setProperty('cursor', this.cursor, 'important');\n }\n }\n\n public add(x: number, y: number) {\n this.xAdded = x;\n this.yAdded = y;\n this.handleMove({\n clientX: this.eventUp.clientX,\n clientY: this.eventUp.clientY,\n target: this.eventUp.target\n });\n }\n\n protected resetValues() {\n ++this.tempId;\n this.hadMove = false;\n this.xAdded = this.yAdded = 0;\n this.xDown =\n this.yDown =\n this.eventUp =\n this.isMouseDown =\n undefined;\n\n if(this.onZoom) {\n this.initialDistance = 0;\n this.initialTouchCenter = {\n x: windowSize.width / 2,\n y: windowSize.height / 2\n };\n this.initialDragOffset = {x: 0, y: 0};\n this.isDragCanceled = {x: false, y: false};\n this.wheelZoom = 1;\n }\n }\n\n protected reset = (e?: Event) => {\n this.log('reset');\n /* if(e) {\n cancelEvent(e);\n } */\n\n if(IS_TOUCH_SUPPORTED) {\n this.listenerSetter.removeManual(attachGlobalListenerTo, 'touchmove', this.handleMove, TOUCH_MOVE_OPTIONS);\n } else {\n this.listenerSetter.removeManual(attachGlobalListenerTo, 'mousemove', this.handleMove, MOUSE_MOVE_OPTIONS);\n this.setCursorTo.style.cursor = '';\n }\n\n if(this.hadMove) {\n this.onReset?.();\n }\n\n this.releaseWheelDrag?.clearTimeout();\n this.releaseWheelZoom?.clearTimeout();\n\n this.resetValues();\n };\n\n protected setHadMove(_e: EE) {\n if(!this.hadMove) {\n this.log('had move');\n this.hadMove = true;\n this.setCursorTo.style.setProperty('cursor', this.cursor, 'important');\n this.onFirstSwipe?.(_e);\n }\n }\n\n protected dispatchOnSwipe(...args: Parameters) {\n const onSwipeResult = this.onSwipe(...args);\n if(onSwipeResult !== undefined && onSwipeResult) {\n this.reset();\n }\n }\n\n protected handleStart = async(_e: EE) => {\n this.log('start');\n\n if(this.isMouseDown) {\n const touches = (_e as any as TouchEvent).touches;\n if(touches?.length === 2) {\n this.initialDistance = getDistance(touches[0], touches[1]);\n this.initialTouchCenter = getTouchCenter(touches[0], touches[1]);\n }\n\n return;\n }\n\n const e = getEvent(_e);\n if(Math.max(0, e.button ?? 0) !== 0) {\n return;\n }\n\n if(isSwipingBackSafari(_e as any)) {\n return;\n }\n\n const tempId = ++this.tempId;\n\n const verifyResult = this.verifyTouchTarget?.(_e);\n if(verifyResult !== undefined) {\n let result: any;\n if(verifyResult instanceof Promise) {\n // const tempId = this.tempId;\n result = await verifyResult;\n\n if(this.tempId !== tempId) {\n return;\n }\n } else {\n result = verifyResult;\n }\n\n if(!result) {\n return this.reset();\n }\n }\n\n this.isMouseDown = true;\n\n if(this.withDelay && !IS_TOUCH_SUPPORTED) {\n const options = {...MOUSE_MOVE_OPTIONS, once: true};\n const deferred = deferredPromise();\n const cb = () => deferred.resolve();\n const listener = this.listenerSetter.add(attachGlobalListenerTo)('mousemove', cb, options) as any as Listener;\n\n await Promise.race([\n pause(300),\n deferred\n ]);\n\n deferred.resolve();\n this.listenerSetter.remove(listener);\n\n if(this.tempId !== tempId) {\n return;\n }\n }\n\n this.xDown = e.clientX;\n this.yDown = e.clientY;\n this.eventUp = e;\n\n if(IS_TOUCH_SUPPORTED) {\n // @ts-ignore\n this.listenerSetter.add(attachGlobalListenerTo)('touchmove', this.handleMove, TOUCH_MOVE_OPTIONS);\n } else {\n // @ts-ignore\n this.listenerSetter.add(attachGlobalListenerTo)('mousemove', this.handleMove, MOUSE_MOVE_OPTIONS);\n }\n\n if(this.onStart) {\n this.onStart();\n\n // have to initiate move instantly\n this.hadMove = true;\n this.handleMove(e);\n }\n };\n\n protected handleMove = (_e: EE) => {\n if(this.xDown === undefined || this.yDown === undefined || RESET_GLOBAL) {\n this.reset();\n return;\n }\n\n if(this.cancelEvent) {\n cancelEvent(_e as any);\n }\n\n if(this.releaseWheelDrag?.isDebounced() || this.releaseWheelZoom?.isDebounced()) {\n return;\n }\n\n this.log('move');\n\n const e = this.eventUp = getEvent(_e);\n const xUp = e.clientX;\n const yUp = e.clientY;\n\n const xDiff = xUp - this.xDown + this.xAdded;\n const yDiff = yUp - this.yDown + this.yAdded;\n\n if(!this.hadMove) {\n if(!xDiff && !yDiff) {\n return;\n }\n\n this.setHadMove(_e);\n }\n\n const touches = (_e as any as TouchEvent).touches;\n if(this.onZoom && this.initialDistance > 0 && touches.length === 2) {\n const endDistance = getDistance(touches[0], touches[1]);\n const touchCenter = getTouchCenter(touches[0], touches[1]);\n const dragOffsetX = touchCenter.x - this.initialTouchCenter.x;\n const dragOffsetY = touchCenter.y - this.initialTouchCenter.y;\n const zoomFactor = endDistance / this.initialDistance;\n const details: ZoomDetails = {\n zoomFactor,\n initialCenterX: this.initialTouchCenter.x,\n initialCenterY: this.initialTouchCenter.y,\n dragOffsetX,\n dragOffsetY,\n currentCenterX: touchCenter.x,\n currentCenterY: touchCenter.y\n };\n\n this.onZoom(details);\n }\n\n this.dispatchOnSwipe(xDiff, yDiff, _e);\n };\n\n protected handleWheel = (e: WheelEvent) => {\n if(!this.hadMove && this.verifyTouchTarget) {\n const result = this.verifyTouchTarget(e);\n if(result !== undefined && !result) {\n this.reset(e);\n return;\n }\n }\n\n cancelEvent(e);\n\n this.log('wheel');\n\n if(this.onDoubleClick && Object.is(e.deltaX, -0) && Object.is(e.deltaY, -0) && e.ctrlKey) {\n this.onWheelCapture(e);\n this.onDoubleClick({centerX: e.pageX, centerY: e.pageY});\n this.reset();\n return;\n }\n\n const metaKeyPressed = e.metaKey || e.ctrlKey || e.shiftKey;\n if(metaKeyPressed) {\n // * fix zooming while dragging is in inertia\n if(this.releaseWheelDrag?.isDebounced()) {\n this.reset();\n }\n\n this.onWheelZoom(e);\n } else {\n this.handleWheelDrag(e);\n }\n };\n\n protected handleWheelDrag = (e: WheelEvent) => {\n this.log('wheel drag');\n\n this.onWheelCapture(e);\n // Ignore wheel inertia if drag is canceled in this direction\n if(!this.isDragCanceled.x || Math.sign(this.initialDragOffset.x) === Math.sign(e.deltaX)) {\n this.initialDragOffset.x -= e.deltaX;\n }\n if(!this.isDragCanceled.y || Math.sign(this.initialDragOffset.y) === Math.sign(e.deltaY)) {\n this.initialDragOffset.y -= e.deltaY;\n }\n const {x, y} = this.initialDragOffset;\n this.releaseWheelDrag(e);\n this.dispatchOnSwipe(x, y, e, (dx, dy) => {\n this.isDragCanceled = {x: dx, y: dy};\n });\n };\n\n protected onWheelCapture = (e: WheelEvent) => {\n if(this.hadMove) return;\n this.log('wheel capture');\n this.handleStart(e);\n this.setHadMove(e);\n this.initialTouchCenter = {x: e.x, y: e.y};\n };\n\n protected onWheelZoom = (e: WheelEvent) => {\n if(!this.onZoom) return;\n this.log('wheel zoom');\n this.onWheelCapture(e);\n const dragOffsetX = e.x - this.initialTouchCenter.x;\n const dragOffsetY = e.y - this.initialTouchCenter.y;\n const delta = clamp(e.deltaY, -25, 25);\n this.wheelZoom -= delta * 0.01;\n const details: ZoomDetails = {\n zoomAdd: this.wheelZoom - 1,\n initialCenterX: this.initialTouchCenter.x,\n initialCenterY: this.initialTouchCenter.y,\n dragOffsetX,\n dragOffsetY,\n currentCenterX: e.x,\n currentCenterY: e.y\n };\n this.onZoom(details);\n this.releaseWheelZoom(e);\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 const 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","/*\n * 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 OverlayClickHandler from '../helpers/overlayClickHandler';\nimport {FormatterArguments, i18n, LangPackKey} from '../lib/langPack';\n\nconst toastEl = document.createElement('div');\ntoastEl.classList.add('toast');\nlet timeout: number;\n\nconst x = new OverlayClickHandler('toast');\nx.addEventListener('toggle', (open) => {\n if(!open) {\n hideToast();\n }\n});\n\nexport function hideToast() {\n x.close();\n\n toastEl.classList.remove('is-visible');\n timeout && clearTimeout(+timeout);\n\n timeout = window.setTimeout(() => {\n toastEl.remove();\n timeout = undefined;\n }, 200);\n}\n\nexport function toast(content: string | Node, onClose?: () => void) {\n x.close();\n\n replaceContent(toastEl, content);\n\n if(!toastEl.parentElement) {\n document.body.append(toastEl);\n void toastEl.offsetLeft; // reflow\n }\n\n toastEl.classList.add('is-visible');\n\n timeout && clearTimeout(+timeout);\n x.open(toastEl);\n\n timeout = window.setTimeout(hideToast, 3000);\n\n if(onClose) {\n x.addEventListener('toggle', onClose, {once: true});\n }\n}\n\nexport function toastNew(options: Partial<{\n langPackKey: LangPackKey,\n langPackArguments: FormatterArguments,\n onClose: () => void\n}>) {\n toast(i18n(options.langPackKey, options.langPackArguments), options.onClose);\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';\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport {dispatchHeavyAnimationEvent} from '../hooks/useHeavyAnimationCheck';\nimport whichChild from '../helpers/dom/whichChild';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport ListenerSetter from '../helpers/listenerSetter';\n\nfunction makeTransitionFunction(options: TransitionFunction) {\n return options;\n}\n\nconst slideNavigation = makeTransitionFunction({\n callback: (tabContent, prevTabContent, toRight) => {\n const width = prevTabContent.getBoundingClientRect().width;\n const elements = [tabContent, prevTabContent];\n if(toRight) elements.reverse();\n elements[0].style.filter = `brightness(80%)`;\n elements[0].style.transform = `translate3d(${-width * .25}px, 0, 0)`;\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\n\n tabContent.classList.add('active');\n void tabContent.offsetWidth; // reflow\n\n tabContent.style.transform = '';\n tabContent.style.filter = '';\n\n return () => {\n prevTabContent.style.transform = prevTabContent.style.filter = '';\n };\n },\n animateFirst: false\n});\n\nconst slideTabs = makeTransitionFunction({\n callback: (tabContent, prevTabContent, toRight) => {\n // Jolly Cobra's // Workaround for scrollable content flickering during animation.\n // const scrollableContainer = findUpClassName(tabContent, 'scrollable-y');\n // if(scrollableContainer && scrollableContainer.style.overflowY !== 'hidden') {\n // // const scrollBarWidth = scrollableContainer.offsetWidth - scrollableContainer.clientWidth;\n // scrollableContainer.style.overflowY = 'hidden';\n // // scrollableContainer.style.paddingRight = `${scrollBarWidth}px`;\n // // this.container.classList.add('sliding');\n // }\n\n // window.requestAnimationFrame(() => {\n const width = prevTabContent.getBoundingClientRect().width;\n /* tabContent.style.setProperty('--width', width + 'px');\n prevTabContent.style.setProperty('--width', width + 'px');\n\n tabContent.classList.add('active'); */\n // void tabContent.offsetWidth; // reflow\n const elements = [tabContent, prevTabContent];\n if(toRight) elements.reverse();\n elements[0].style.transform = `translate3d(${-width}px, 0, 0)`;\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\n\n tabContent.classList.add('active');\n void tabContent.offsetWidth; // reflow\n\n tabContent.style.transform = '';\n // });\n\n return () => {\n prevTabContent.style.transform = '';\n\n // if(scrollableContainer) {\n // // Jolly Cobra's // Workaround for scrollable content flickering during animation.\n // if(isSafari) { // ! safari doesn't respect sticky header, so it flicks when overflow is changing\n // scrollableContainer.style.display = 'none';\n // }\n\n // scrollableContainer.style.overflowY = '';\n\n // if(isSafari) {\n // void scrollableContainer.offsetLeft; // reflow\n // scrollableContainer.style.display = '';\n // }\n\n // // scrollableContainer.style.paddingRight = '0';\n // // this.container.classList.remove('sliding');\n // }\n };\n },\n animateFirst: false\n});\n\nconst slideTopics = makeTransitionFunction({\n callback: (tabContent, prevTabContent) => {\n const rect = tabContent.getBoundingClientRect();\n const offsetX = rect.width - 80;\n\n tabContent.style.transform = `transformX(${offsetX}px)`;\n\n tabContent.classList.add('active');\n void tabContent.offsetWidth; // reflow\n\n tabContent.style.transform = '';\n\n return () => {};\n },\n animateFirst: true\n});\n\nconst transitions: {[type in TransitionSliderType]?: TransitionFunction} = {\n navigation: slideNavigation,\n tabs: slideTabs\n // topics: slideTopics\n};\n\ntype TransitionSliderType = 'tabs' | 'navigation' | 'zoom-fade' | 'slide-fade' | 'topics' | 'none'/* | 'counter' */;\n\ntype TransitionSliderOptions = {\n content: HTMLElement,\n type: TransitionSliderType,\n transitionTime: number,\n onTransitionEnd?: (id: number) => void,\n isHeavy?: boolean,\n once?: boolean,\n withAnimationListener?: boolean,\n listenerSetter?: ListenerSetter,\n animateFirst?: boolean\n};\n\ntype TransitionFunction = {\n callback: (tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) => () => void,\n animateFirst: boolean\n};\n\nconst TransitionSlider = (options: TransitionSliderOptions) => {\n let {\n content,\n type,\n transitionTime,\n onTransitionEnd,\n isHeavy = true,\n once = false,\n withAnimationListener = true,\n listenerSetter,\n animateFirst = false\n } = options;\n\n const {callback: animationFunction, animateFirst: _animateFirst} = transitions[type] || {};\n content.dataset.animation = type;\n\n if(_animateFirst !== undefined) {\n animateFirst = _animateFirst;\n }\n\n const onTransitionEndCallbacks: Map = new Map();\n let animationDeferred: CancellablePromise;\n // let animationStarted = 0;\n let from: HTMLElement = null;\n\n if(withAnimationListener) {\n const listenerName = animationFunction ? 'transitionend' : 'animationend';\n\n const onEndEvent = (e: TransitionEvent | AnimationEvent) => {\n cancelEvent(e);\n\n if((e.target as HTMLElement).parentElement !== content) {\n return;\n }\n\n // console.log('Transition: transitionend', /* content, */ e, selectTab.prevId, performance.now() - animationStarted);\n\n const callback = onTransitionEndCallbacks.get(e.target as HTMLElement);\n callback?.();\n\n if(e.target !== from) {\n return;\n }\n\n if(!animationDeferred && isHeavy) return;\n\n if(animationDeferred) {\n animationDeferred.resolve();\n animationDeferred = undefined;\n }\n\n onTransitionEnd?.(selectTab.prevId());\n\n content.classList.remove('animating', 'backwards', 'disable-hover');\n\n if(once) {\n if(listenerSetter) listenerSetter.removeManual(content, listenerName, onEndEvent);\n else content.removeEventListener(listenerName, onEndEvent/* , {capture: false} */);\n from = animationDeferred = undefined;\n onTransitionEndCallbacks.clear();\n }\n };\n\n // TODO: check for transition type (transform, etc) using by animationFunction\n if(listenerSetter) listenerSetter.add(content)(listenerName, onEndEvent);\n else content.addEventListener(listenerName, onEndEvent/* , {passive: true, capture: false} */);\n }\n\n function selectTab(id: number | HTMLElement, animate = true, overrideFrom?: typeof from) {\n if(overrideFrom) {\n from = overrideFrom;\n }\n\n if(id instanceof HTMLElement) {\n id = whichChild(id);\n }\n\n const prevId = selectTab.prevId();\n if(id === prevId) return false;\n\n // console.log('selectTab id:', id);\n\n const to = content.children[id] as HTMLElement;\n\n if(!rootScope.settings.animationsEnabled || (prevId === -1 && !animateFirst)) {\n animate = false;\n }\n\n if(!withAnimationListener) {\n const timeout = content.dataset.timeout;\n if(timeout !== undefined) {\n clearTimeout(+timeout);\n }\n\n delete content.dataset.timeout;\n }\n\n if(!animate) {\n if(from) from.classList.remove('active', 'to', 'from');\n else if(to) { // fix instant opening back from closed slider (e.g. instant closening and opening right sidebar)\n const callback = onTransitionEndCallbacks.get(to);\n callback?.();\n }\n\n if(to) {\n to.classList.remove('to', 'from');\n to.classList.add('active');\n }\n\n content.classList.remove('animating', 'backwards', 'disable-hover');\n\n from = to;\n\n onTransitionEnd?.(id);\n return;\n }\n\n if(!withAnimationListener) {\n content.dataset.timeout = '' + window.setTimeout(() => {\n to.classList.remove('to');\n from && from.classList.remove('from');\n content.classList.remove('animating', 'backwards', 'disable-hover');\n delete content.dataset.timeout;\n }, transitionTime);\n }\n\n if(from) {\n from.classList.remove('to');\n from.classList.add('from');\n }\n\n content.classList.add('animating'/* , 'disable-hover' */);\n const toRight = prevId < id;\n content.classList.toggle('backwards', !toRight);\n\n let onTransitionEndCallback: ReturnType;\n if(!to) {\n // prevTabContent.classList.remove('active');\n } else {\n if(animationFunction) {\n onTransitionEndCallback = animationFunction(to, from, toRight);\n } else {\n to.classList.add('active');\n }\n\n to.classList.remove('from');\n to.classList.add('to');\n }\n\n if(to) {\n const transitionTimeout = to.dataset.transitionTimeout;\n if(transitionTimeout) {\n clearTimeout(+transitionTimeout);\n }\n\n onTransitionEndCallbacks.set(to, () => {\n to.classList.remove('to');\n onTransitionEndCallbacks.delete(to);\n });\n }\n\n if(from/* && false */) {\n let timeout: number;\n const _from = from;\n const callback = () => {\n clearTimeout(timeout);\n _from.classList.remove('active', 'from');\n\n onTransitionEndCallback?.();\n\n onTransitionEndCallbacks.delete(_from);\n };\n\n if(to) {\n timeout = window.setTimeout(callback, transitionTime + 100); // something happened to container\n onTransitionEndCallbacks.set(_from, callback);\n } else {\n timeout = window.setTimeout(callback, transitionTime);\n onTransitionEndCallbacks.set(_from, () => {\n clearTimeout(timeout);\n onTransitionEndCallbacks.delete(_from);\n });\n }\n\n _from.dataset.transitionTimeout = '' + timeout;\n\n if(isHeavy) {\n if(!animationDeferred) {\n animationDeferred = deferredPromise();\n // animationStarted = performance.now();\n }\n\n dispatchHeavyAnimationEvent(animationDeferred, transitionTime * 2);\n }\n }\n\n from = to;\n }\n\n // selectTab.prevId = -1;\n selectTab.prevId = () => from ? whichChild(from) : -1;\n selectTab.getFrom = () => from;\n selectTab.setFrom = (_from: HTMLElement) => from = _from;\n\n return selectTab;\n};\n\nexport default TransitionSlider;\n","export default function isUsernameValid(username: string) {\n return ((username.length >= 3 && username.length <= 32) || !username.length) && /^[a-zA-Z0-9_]*$/.test(username);\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 ListenerSetter from '../helpers/listenerSetter';\nimport debounce from '../helpers/schedulers/debounce';\nimport {LangPackKey} from '../lib/langPack';\nimport InputField, {InputFieldOptions, InputState} from './inputField';\nimport isUsernameValid from '../lib/richTextProcessor/isUsernameValid';\nimport {AppManagers} from '../lib/appManagers/managers';\n\nexport class UsernameInputField extends InputField {\n private checkUsernamePromise: Promise;\n private checkUsernameDebounced: (username: string) => void;\n public options: InputFieldOptions & {\n peerId?: PeerId,\n listenerSetter: ListenerSetter,\n onChange?: () => void,\n invalidText: LangPackKey,\n takenText: LangPackKey,\n availableText: LangPackKey,\n head?: string\n };\n public error: ApiError;\n\n constructor(\n options: UsernameInputField['options'],\n private managers: AppManagers\n ) {\n super(options);\n\n this.checkUsernameDebounced = debounce(this.checkUsername.bind(this), 150, false, true);\n\n options.listenerSetter.add(this.input)('input', () => {\n const value = this.getValue();\n\n this.error = undefined;\n if(value === this.originalValue || !value.length) {\n this.setState(InputState.Neutral);\n this.options.onChange?.();\n return;\n } else if(!isUsernameValid(value)) { // does not check the last underscore\n this.setError(this.options.invalidText);\n } else {\n this.setState(InputState.Neutral);\n }\n\n if(this.input.classList.contains('error')) {\n this.options.onChange?.();\n return;\n }\n\n this.checkUsernameDebounced(value);\n });\n }\n\n public getValue() {\n let value = this.value;\n if(this.options.head) {\n value = value.slice(this.options.head.length);\n this.setValueSilently(this.options.head + value);\n }\n\n return value;\n }\n\n private checkUsername(username: string) {\n if(this.checkUsernamePromise) return;\n\n this.error = undefined;\n let checkPromise: Promise\n if(this.options.peerId) {\n checkPromise = this.managers.appChatsManager.checkUsername(this.options.peerId.toChatId(), username);\n } else {\n checkPromise = this.managers.appUsersManager.checkUsername(username);\n }\n\n const promise = this.checkUsernamePromise = checkPromise.then((available) => {\n if(this.getValue() !== username) return;\n\n if(available) {\n this.setState(InputState.Valid, this.options.availableText);\n } else {\n this.setError(this.options.takenText);\n }\n }, (err) => {\n if(this.getValue() !== username) return;\n\n this.error = err;\n switch((err as ApiError).type) {\n case 'USERNAME_PURCHASE_AVAILABLE': {\n this.setError(this.options.takenText);\n break;\n }\n\n case 'USERNAME_INVALID':\n default: {\n this.setError(this.options.invalidText);\n break;\n }\n }\n }).then(() => {\n if(this.checkUsernamePromise === promise) {\n this.checkUsernamePromise = undefined;\n }\n\n this.options.onChange?.();\n\n const value = this.getValue();\n if(value !== username && this.isValidToChange() && isUsernameValid(value)) {\n this.checkUsername(value);\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 {attachClickEvent} from '../helpers/dom/clickEvent';\nimport findUpAsChild from '../helpers/dom/findUpAsChild';\nimport placeCaretAtEnd from '../helpers/dom/placeCaretAtEnd';\nimport positionElementByIndex from '../helpers/dom/positionElementByIndex';\nimport Sortable from '../helpers/dom/sortable';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {Middleware} from '../helpers/middleware';\nimport noop from '../helpers/noop';\nimport SortedList, {SortedElementBase} from '../helpers/sortedList';\nimport {Chat, User, Username} from '../layer';\nimport {i18n, LangPackKey} from '../lib/langPack';\nimport rootScope from '../lib/rootScope';\nimport confirmationPopup from './confirmationPopup';\nimport Row from './row';\nimport SettingSection from './settingSection';\nimport {UsernameInputField} from './usernameInputField';\n\nexport default class UsernamesSection extends SettingSection {\n // public section: SettingSection;\n\n constructor(options: {\n peerId: PeerId,\n peer: Chat.channel | User.user,\n listenerSetter: ListenerSetter,\n usernameInputField: UsernameInputField,\n middleware: Middleware\n }) {\n /* const section = this.section = new SettingSection */super({\n name: 'UsernamesProfileHeader',\n caption: !options.peerId.isUser() ? 'UsernamesChannelHelp' : 'UsernamesProfileHelp'\n });\n\n const {peerId, peer, usernameInputField, listenerSetter, middleware} = options;\n const managers = rootScope.managers;\n const channelId = peerId.isUser() ? undefined : peerId.toChatId();\n\n const section = this;\n\n const CLASS_NAME = 'usernames';\n const list = document.createElement('div');\n list.classList.add(CLASS_NAME);\n\n let _usernames: Username[];\n\n interface SortedUsername extends SortedElementBase {\n row: Row\n }\n\n const sortedList = new SortedList({\n getIndex: (element) => _usernames.length - _usernames.findIndex((username) => username.username === element.id),\n onDelete: (element) => {\n element.row.container.remove();\n },\n onSort: (element, idx) => {\n positionElementByIndex(element.row.container, list, idx);\n },\n onElementCreate: (base) => {\n const username = _usernames.find((username) => username.username === base.id);\n const row = new Row({\n title: '@' + username.username,\n subtitle: true,\n clickable: true\n });\n\n const editable = !!username.pFlags.editable;\n const active = !!username.pFlags.active;\n\n if(editable) row.container.dataset.editable = '1';\n row.container.dataset.username = username.username;\n row.container.classList.add(CLASS_NAME + '-username');\n row.subtitle.classList.add(CLASS_NAME + '-username-status');\n const media = row.createMedia('medium');\n media.classList.add(CLASS_NAME + '-username-icon', 'tgico');\n\n row.makeSortable();\n\n changeActive(row, active);\n\n (base as SortedUsername).row = row;\n\n return base as SortedUsername;\n }\n });\n\n const changeActive = (row: Row, active: boolean) => {\n row.subtitle.replaceChildren(i18n(row.container.dataset.editable ? 'UsernameLinkEditable' : (active ? 'UsernameLinkActive' : 'UsernameLinkInactive')));\n row.container.classList.toggle('active', active);\n row.toggleSorting(active);\n };\n\n const applyUsernames = (usernames: Username[] = []) => {\n _usernames = usernames;\n\n sortedList.getAll().forEach((element) => {\n if(!usernames.some((username) => username.username === element.id)) {\n sortedList.delete(element.id);\n }\n });\n\n usernames.forEach((username) => {\n if(!sortedList.has(username.username)) {\n sortedList.add(username.username);\n } else {\n const element = sortedList.get(username.username);\n sortedList.update(username.username, element);\n changeActive(element.row, !!username.pFlags.active);\n }\n });\n\n section.container.classList.toggle('hide', !sortedList.getAll().size);\n };\n\n applyUsernames(peer.usernames);\n\n listenerSetter.add(rootScope)('peer_title_edit', async({peerId: _peerId}) => {\n if(_peerId !== peerId) {\n return;\n }\n\n const peer = await managers.appPeersManager.getPeer(peerId);\n applyUsernames((peer as User.user).usernames);\n });\n\n let cancelClick = false;\n attachClickEvent(list, async(e) => {\n if(cancelClick) {\n cancelClick = false;\n return;\n }\n\n const container = findUpAsChild(e.target as HTMLElement, list);\n if(!container) {\n return;\n }\n\n if(container.dataset.editable) {\n placeCaretAtEnd(usernameInputField.input, true, true);\n return;\n }\n\n const username = container.dataset.username;\n\n const active = container.classList.contains('active');\n let titleLangKey: LangPackKey, descriptionLangKey: LangPackKey;\n if(active) {\n titleLangKey = 'UsernameDeactivateLink';\n descriptionLangKey = channelId ? 'UsernameDeactivateLinkChannelMessage' : 'UsernameDeactivateLinkProfileMessage';\n } else {\n titleLangKey = 'UsernameActivateLink';\n descriptionLangKey = channelId ? 'UsernameActivateLinkChannelMessage' : 'UsernameActivateLinkProfileMessage';\n }\n\n try {\n await confirmationPopup({\n titleLangKey,\n descriptionLangKey,\n button: {\n langKey: active ? 'Hide' : 'Show'\n }\n });\n } catch(err) {\n return;\n }\n\n const newActive = !active;\n let promise: Promise;\n if(channelId) {\n promise = managers.appChatsManager.toggleUsername(channelId, username, newActive);\n } else {\n promise = managers.appUsersManager.toggleUsername(username, newActive);\n }\n\n promise.catch((err: ApiError) => {\n if(err.type === 'USERNAMES_ACTIVE_TOO_MUCH') {\n confirmationPopup({\n titleLangKey: 'UsernameActivateErrorTitle',\n descriptionLangKey: 'UsernameActivateErrorMessage',\n button: {langKey: 'OK', isCancel: true}\n }).catch(noop);\n } else {\n console.error('turn username error', err);\n }\n });\n });\n\n new Sortable({\n list,\n middleware,\n onSort: (idx, newIdx) => {\n const username = _usernames.splice(idx, 1)[0];\n _usernames.splice(newIdx, 0, username);\n sortedList.updateList();\n // can't just update particular element, have to change indexes\n // sortedList.update(username.username);\n\n const usernames = _usernames.filter((username) => username.pFlags.active).map((username) => username.username);\n if(channelId) {\n managers.appChatsManager.reorderUsernames(channelId, usernames);\n } else {\n managers.appUsersManager.reorderUsernames(usernames);\n }\n }\n });\n\n section.content.append(list);\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\ntype TargetType = HTMLElement;\nexport type OnVisibilityChangeItem = {target: TargetType, visible: boolean, entry: IntersectionObserverEntry, index: number};\nexport type OnVisibilityChange = (item: OnVisibilityChangeItem) => void;\n\nexport default class VisibilityIntersector {\n private observer: IntersectionObserver;\n private items: Map = new Map();\n private locked = false;\n\n constructor(onVisibilityChange: OnVisibilityChange, options?: IntersectionObserverInit) {\n this.observer = new IntersectionObserver((entries) => {\n if(this.locked) {\n return;\n }\n\n const changed: OnVisibilityChangeItem[] = [];\n\n entries.forEach((entry, index) => {\n const target = entry.target as TargetType;\n\n if(this.items.get(target) === entry.isIntersecting) {\n return;\n } else {\n this.items.set(target, entry.isIntersecting);\n }\n\n /* if(entry.isIntersecting) {\n console.log('ooo', entry);\n } */\n\n /* if(this.locked) {\n return;\n } */\n\n const change: typeof changed[0] = {target, visible: entry.isIntersecting, entry, index};\n\n // ! order will be incorrect so can't use it\n // changed[entry.isIntersecting ? 'unshift' : 'push'](change);\n changed.push(change);\n\n // onVisibilityChange(target, entry.isIntersecting);\n });\n\n changed.forEach((item) => {\n onVisibilityChange(item);\n });\n }, options);\n }\n\n public getVisible() {\n const items: TargetType[] = [];\n this.items.forEach((value, key) => {\n if(value) {\n items.push(key);\n }\n });\n\n return items;\n }\n\n public clearVisible() {\n const visible = this.getVisible();\n for(const target of visible) {\n this.items.set(target, false);\n }\n }\n\n public isVisible(target: TargetType) {\n return this.items.get(target);\n }\n\n public disconnect() {\n this.observer.disconnect();\n this.items.clear();\n }\n\n public refresh() {\n this.observer.disconnect();\n\n // window.requestAnimationFrame(() => {\n const targets = [...this.items.keys()];\n for(const target of targets) {\n // this.items.set(target, false);\n this.observer.observe(target);\n }\n // });\n }\n\n public refreshVisible() {\n const visible = this.getVisible();\n for(const target of visible) {\n this.observer.unobserve(target);\n }\n\n for(const target of visible) {\n this.observer.observe(target);\n }\n }\n\n public observe(target: TargetType) {\n this.items.set(target, false);\n this.observer.observe(target);\n }\n\n public unobserve(target: TargetType) {\n this.observer.unobserve(target);\n this.items.delete(target);\n }\n\n public unlock() {\n this.locked = false;\n }\n\n public unlockAndRefresh() {\n this.unlock();\n this.refresh();\n }\n\n public lock() {\n this.locked = 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 cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport rootScope from '../lib/rootScope';\nimport appMediaPlaybackController from './appMediaPlaybackController';\nimport RangeSelector from './rangeSelector';\n\nexport default class VolumeSelector extends RangeSelector {\n private static ICONS = ['volume_off', 'volume_mute', 'volume_down', 'volume_up'];\n public btn: HTMLElement;\n protected icon: HTMLSpanElement;\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 const className = 'player-volume';\n const btn = this.btn = document.createElement('div');\n btn.classList.add('btn-icon', className);\n const icon = this.icon = document.createElement('span');\n icon.classList.add(className + '__icon');\n\n btn.append(icon, this.container);\n\n attachClickEvent(icon, this.onMuteClick, {listenerSetter: this.listenerSetter});\n this.listenerSetter.add(appMediaPlaybackController)('playbackParams', 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 public setVolume = () => {\n // const volume = video.volume;\n const {volume, muted} = appMediaPlaybackController;\n let d: string;\n let iconIndex: number;\n if(!volume || muted) {\n iconIndex = 0;\n } else if(volume > .5) {\n iconIndex = 3;\n } else if(volume > 0 && volume < .25) {\n iconIndex = 1;\n } else {\n iconIndex = 2;\n }\n\n VolumeSelector.ICONS.forEach((icon) => this.icon.classList.remove('tgico-' + icon));\n this.icon.classList.add('tgico-' + VolumeSelector.ICONS[iconIndex]);\n\n if(!this.mousedown) {\n this.setProgress(muted ? 0 : volume);\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 {MessageEntity} from '../../layer';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\n\nexport default function wrapCustomEmoji({\n docIds,\n loadPromises,\n middleware,\n lazyLoadQueue,\n customEmojiSize,\n animationGroup\n}: {\n docIds: DocId[],\n loadPromises?: Promise[]\n} & WrapSomethingOptions) {\n const text = ' '.repeat(docIds.length);\n const entities: MessageEntity[] = [];\n docIds.forEach((docId, idx) => {\n entities.push({\n _: 'messageEntityCustomEmoji',\n offset: idx,\n length: 1,\n document_id: docId\n });\n });\n\n const wrapped = wrapRichText(text, {\n entities,\n loadPromises,\n animationGroup,\n customEmojiSize,\n middleware,\n lazyLoadQueue\n });\n\n return wrapped;\n}\n\nexport function wrapCustomEmojiAwaited(options: Parameters[0]) {\n const loadPromises: Promise[] = options.loadPromises ??= [];\n const wrapped = wrapCustomEmoji(options);\n return Promise.all(loadPromises).then(() => wrapped);\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 MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\nimport {CancellablePromise} from '../../helpers/cancellablePromise';\nimport {clearBadCharsAndTrim} from '../../helpers/cleanSearchText';\nimport {formatFullSentTime} from '../../helpers/date';\nimport {simulateClickEvent, attachClickEvent} from '../../helpers/dom/clickEvent';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport formatBytes from '../../helpers/formatBytes';\nimport {MediaSizeType} from '../../helpers/mediaSizes';\nimport noop from '../../helpers/noop';\nimport {Message, MessageMedia, WebPage} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport appDownloadManager, {Progress} from '../../lib/appManagers/appDownloadManager';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getDownloadMediaDetails from '../../lib/appManagers/utils/download/getDownloadMediaDetails';\nimport choosePhotoSize from '../../lib/appManagers/utils/photos/choosePhotoSize';\nimport {joinElementsWith} from '../../lib/langPack';\nimport {MAX_FILE_SAVE_SIZE} from '../../lib/mtproto/mtproto_config';\nimport wrapPlainText from '../../lib/richTextProcessor/wrapPlainText';\nimport rootScope from '../../lib/rootScope';\nimport type {ThumbCache} from '../../lib/storages/thumbs';\nimport {MediaSearchContext} from '../appMediaPlaybackController';\nimport AudioElement from '../audio';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport {MiddleEllipsisElement} from '../middleEllipsis';\nimport ProgressivePreloader from '../preloader';\nimport wrapPhoto from './photo';\nimport wrapSenderToPeer from './senderToPeer';\nimport wrapSentTime from './sentTime';\n\nrootScope.addEventListener('document_downloading', (docId) => {\n const elements = Array.from(document.querySelectorAll(`.document[data-doc-id=\"${docId}\"]`)) as HTMLElement[];\n elements.forEach((element) => {\n if(element.querySelector('.preloader-container.manual')) {\n simulateClickEvent(element);\n }\n });\n});\n\nexport default async function wrapDocument({message, withTime, fontWeight, voiceAsMusic, showSender, searchContext, loadPromises, autoDownloadSize, lazyLoadQueue, sizeType, managers = rootScope.managers, cacheContext, fontSize, getSize}: {\n message: Message.message,\n withTime?: boolean,\n fontWeight?: number,\n voiceAsMusic?: boolean,\n showSender?: boolean,\n searchContext?: MediaSearchContext,\n loadPromises?: Promise[],\n autoDownloadSize?: number,\n lazyLoadQueue?: LazyLoadQueue,\n sizeType?: MediaSizeType,\n managers?: AppManagers,\n cacheContext?: ThumbCache,\n fontSize?: number,\n getSize?: () => number\n}): Promise {\n fontWeight ??= 500;\n sizeType ??= '' as any;\n fontSize ??= 16;\n const noAutoDownload = autoDownloadSize === 0;\n\n const doc = ((message.media as MessageMedia.messageMediaDocument).document || ((message.media as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage).document) as MyDocument;\n const uploadFileName = message?.uploadingFileName;\n if(doc.type === 'audio' || doc.type === 'voice' || doc.type === 'round') {\n const audioElement = new AudioElement();\n audioElement.withTime = withTime;\n audioElement.message = message;\n audioElement.noAutoDownload = noAutoDownload;\n audioElement.lazyLoadQueue = lazyLoadQueue;\n audioElement.loadPromises = loadPromises;\n (audioElement as any).getSize = getSize;\n\n if(voiceAsMusic) audioElement.voiceAsMusic = voiceAsMusic;\n if(searchContext) audioElement.searchContext = searchContext;\n if(showSender) audioElement.showSender = showSender;\n\n audioElement.dataset.fontWeight = '' + fontWeight;\n audioElement.dataset.fontSize = '' + fontSize;\n audioElement.dataset.sizeType = sizeType;\n await audioElement.render();\n return audioElement;\n }\n\n const extSplitted = doc.file_name ? doc.file_name.split('.') : '';\n let ext = '';\n ext = extSplitted.length > 1 && Array.isArray(extSplitted) ?\n clearBadCharsAndTrim(extSplitted.pop().split(' ', 1)[0].toLowerCase()) :\n 'file';\n\n const docDiv = document.createElement('div');\n docDiv.classList.add('document', `ext-${ext}`);\n docDiv.dataset.docId = '' + doc.id;\n (docDiv as any).doc = doc;\n\n // return docDiv;\n\n const icoDiv = document.createElement('div');\n icoDiv.classList.add('document-ico');\n let icoTextEl: HTMLElement;\n\n const hadContext = !!cacheContext;\n const getCacheContext = () => {\n return hadContext ? cacheContext : managers.thumbsStorage.getCacheContext(doc);\n };\n\n cacheContext = await getCacheContext();\n let hasThumb = false;\n if((doc.thumbs?.length || (message.pFlags.is_outgoing && cacheContext.url && doc.type === 'photo'))/* && doc.mime_type !== 'image/gif' */) {\n docDiv.classList.add('document-with-thumb');\n hasThumb = true;\n\n const imgs: (HTMLImageElement | HTMLCanvasElement | HTMLVideoElement)[] = [];\n // ! WARNING, use thumbs for check when thumb will be generated for media\n if(message.pFlags.is_outgoing && ['photo', 'video'].includes(doc.type) && cacheContext.url) {\n icoDiv.innerHTML = ``;\n imgs.push(icoDiv.firstElementChild as HTMLImageElement);\n } else {\n const perf = performance.now();\n const wrapped = await wrapPhoto({\n photo: doc,\n message: null,\n container: icoDiv,\n boxWidth: 54,\n boxHeight: 54,\n loadPromises,\n withoutPreloader: true,\n lazyLoadQueue,\n size: choosePhotoSize(doc, 54, 54, true),\n managers\n });\n // console.log('was wrapping photo', performance.now() - perf);\n icoDiv.style.width = icoDiv.style.height = '';\n if(wrapped.images.thumb) imgs.push(wrapped.images.thumb);\n if(wrapped.images.full) imgs.push(wrapped.images.full);\n }\n\n imgs.forEach((img) => img.classList.add('document-thumb'));\n } else {\n icoTextEl = document.createElement('span');\n icoTextEl.classList.add('document-ico-text');\n icoTextEl.innerText = ext;\n icoDiv.append(icoTextEl);\n }\n\n // let fileName = stringMiddleOverflow(doc.file_name || 'Unknown.file', 26);\n const fileName = doc.file_name ? wrapPlainText(doc.file_name) : 'Unknown.file';\n const descriptionEl = document.createElement('div');\n descriptionEl.classList.add('document-description');\n const bytesContainer = document.createElement('span');\n const bytesEl = formatBytes(doc.size);\n const bytesJoiner = ' / ';\n\n const descriptionParts: (HTMLElement | string | DocumentFragment)[] = [bytesEl];\n\n if(withTime) {\n descriptionParts.push(formatFullSentTime(message.date));\n }\n\n if(showSender) {\n descriptionParts.push(await wrapSenderToPeer(message));\n }\n\n if(!withTime && !showSender) {\n const b = document.createElement('span');\n const bytesMaxEl = formatBytes(doc.size);\n b.append(bytesJoiner, bytesMaxEl);\n b.style.visibility = 'hidden';\n descriptionParts.push(b);\n }\n\n docDiv.innerHTML = `\n ${(cacheContext.downloaded && !uploadFileName) || !message.mid || !hasThumb ? '' : `
`}\n
\n
\n `;\n\n const nameDiv = docDiv.querySelector('.document-name') as HTMLElement;\n const middleEllipsisEl = new MiddleEllipsisElement();\n middleEllipsisEl.dataset.fontWeight = '' + fontWeight;\n middleEllipsisEl.dataset.fontSize = '' + fontSize;\n middleEllipsisEl.dataset.sizeType = sizeType;\n (middleEllipsisEl as any).getSize = getSize;\n middleEllipsisEl.textContent = fileName;\n // setInnerHTML(middleEllipsisEl, fileName);\n\n // * new media popup\n if(!message.mid) {\n docDiv.classList.add('downloaded');\n }\n\n nameDiv.append(middleEllipsisEl);\n\n if(showSender) {\n nameDiv.append(wrapSentTime(message));\n }\n\n const sizeDiv = docDiv.querySelector('.document-size') as HTMLElement;\n bytesContainer.append(...joinElementsWith(descriptionParts, ' ยท '));\n sizeDiv.append(bytesContainer);\n\n docDiv.prepend(icoDiv);\n\n if(!uploadFileName && message.pFlags.is_outgoing && !message.mid) {\n return docDiv;\n }\n\n let downloadDiv: HTMLElement, preloader: ProgressivePreloader = null;\n const onLoad = () => {\n docDiv.classList.remove('downloading');\n\n if(/* !hasThumb || */(doc.size > MAX_FILE_SAVE_SIZE && !uploadFileName)) {\n preloader.setManual();\n preloader.attach(downloadDiv);\n preloader.preloader.classList.add('manual');\n preloader.setDownloadFunction(load);\n return;\n }\n\n if(doc.size <= MAX_FILE_SAVE_SIZE) {\n docDiv.classList.add('downloaded');\n }\n\n if(downloadDiv) {\n if(downloadDiv !== icoDiv) {\n const _downloadDiv = downloadDiv;\n setTimeout(() => {\n _downloadDiv.remove();\n }, 200);\n }\n\n downloadDiv = null;\n }\n\n if(preloader) {\n preloader = null;\n }\n };\n\n const addByteProgress = (promise: CancellablePromise) => {\n docDiv.classList.add('downloading');\n\n const sizeContainer = document.createElement('span');\n const _bytesContainer = formatBytes(doc.size);\n sizeContainer.style.position = 'absolute';\n sizeContainer.style.left = '0';\n promise.then(onLoad, noop).finally(() => {\n // sizeContainer.replaceWith(bytesContainer);\n bytesContainer.style.visibility = '';\n sizeContainer.remove();\n // b && b.classList.remove('hide');\n });\n\n // b && b.classList.add('hide');\n\n const format = (bytes: number) => formatBytes(bytes);\n let d = format(0);\n bytesContainer.style.visibility = 'hidden';\n // bytesContainer.replaceWith(sizeContainer);\n sizeContainer.append(d, bytesJoiner, _bytesContainer);\n bytesContainer.parentElement.append(sizeContainer);\n promise.addNotifyListener((progress: Progress) => {\n const _d = format(progress.done);\n d.replaceWith(_d);\n d = _d;\n });\n };\n\n // ! DO NOT USE ASYNC/AWAIT HERE ! SAFARI WON'T LET DOWNLOAD THE FILE BECAUSE OF ASYNC\n const load = (e?: Event) => {\n const save = !e || e.isTrusted;\n const doc = (docDiv as any).doc;\n // const doc = await managers.appDocsManager.getDoc(docDiv.dataset.docId);\n let download: CancellablePromise;\n const queueId = appImManager.chat.bubbles ? appImManager.chat.bubbles.lazyLoadQueue.queueId : undefined;\n if(!save) {\n download = appDownloadManager.downloadToDisc({media: doc, queueId}, true);\n } else if(doc.type === 'pdf') {\n const canOpenAfter = /* managers.appDocsManager.downloading.has(doc.id) || */!preloader || preloader.detached;\n download = appDownloadManager.downloadMediaURL({media: doc, queueId});\n if(canOpenAfter) {\n download.then(() => {\n setTimeout(async() => { // wait for preloader animation end\n const url = (await getCacheContext()).url;\n window.open(url);\n }, rootScope.settings.animationsEnabled ? 250 : 0);\n });\n }\n } else if(MEDIA_MIME_TYPES_SUPPORTED.has(doc.mime_type) && doc.thumbs?.length) {\n download = appDownloadManager.downloadMediaURL({media: doc, queueId});\n } else {\n download = appDownloadManager.downloadToDisc({media: doc, queueId});\n }\n\n download.catch(() => {\n docDiv.classList.remove('downloading');\n });\n\n if(downloadDiv) {\n preloader.attach(downloadDiv, true, download);\n addByteProgress(download);\n }\n };\n\n const {fileName: downloadFileName} = getDownloadMediaDetails({media: doc, downloadId: '1'});\n if(await managers.apiFileManager.isDownloading(downloadFileName)) {\n downloadDiv = docDiv.querySelector('.document-download') || icoDiv;\n const promise = appDownloadManager.downloadToDisc({media: doc}, true);\n\n preloader = new ProgressivePreloader();\n preloader.attach(downloadDiv, false, promise);\n preloader.setDownloadFunction(load);\n addByteProgress(promise);\n } else if(!cacheContext.downloaded || uploadFileName) {\n downloadDiv = docDiv.querySelector('.document-download') || icoDiv;\n preloader = new ProgressivePreloader({\n isUpload: !!uploadFileName\n });\n\n if(!uploadFileName) {\n preloader.construct();\n preloader.setManual();\n preloader.attach(downloadDiv);\n preloader.setDownloadFunction(load);\n\n if(autoDownloadSize !== undefined && autoDownloadSize >= doc.size) {\n simulateClickEvent(preloader.preloader);\n }\n } else {\n const uploadPromise = appDownloadManager.getUpload(uploadFileName);\n preloader.attachPromise(uploadPromise);\n preloader.attach(downloadDiv);\n addByteProgress(uploadPromise);\n }\n }\n\n attachClickEvent(docDiv, (e) => {\n if(findUpClassName(e.target, 'time')) { // prevent downloading by clicking on time\n return;\n }\n\n if(preloader) {\n preloader.onClick(e);\n } else {\n load(e);\n }\n });\n\n return docDiv;\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 {formatPhoneNumber} from '../../helpers/formatPhoneNumber';\n\nexport default function formatUserPhone(phone: string) {\n return '+' + formatPhoneNumber(phone).formatted;\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 numberThousandSplitter from '../../helpers/number/numberThousandSplitter';\nimport {Chat, ChatParticipants} from '../../layer';\nimport {i18n, LangPackKey} from '../../lib/langPack';\nimport rootScope from '../../lib/rootScope';\n\nexport default async function getChatMembersString(chatId: ChatId, managers = rootScope.managers) {\n const chat: Chat = await managers.appChatsManager.getChat(chatId);\n if(chat._ === 'chatForbidden') {\n return i18n('YouWereKicked');\n }\n\n const chatFull = await managers.appProfileManager.getCachedFullChat(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 isBroadcast = (chat as Chat.channel).pFlags.broadcast;\n count = count || 1;\n\n const key: LangPackKey = isBroadcast ? 'Peer.Status.Subscribers' : 'Peer.Status.Member';\n return i18n(key, [numberThousandSplitter(count)]);\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 _limitSymbols from '../../helpers/string/limitSymbols';\nimport {Chat} from '../../layer';\nimport getPeerActiveUsernames from '../../lib/appManagers/utils/peers/getPeerActiveUsernames';\nimport I18n from '../../lib/langPack';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport rootScope from '../../lib/rootScope';\n\ntype GetPeerTitleOptions = {\n peerId: PeerId,\n plainText?: boolean,\n onlyFirstName?: boolean,\n limitSymbols?: number,\n threadId?: number\n} & Pick;\n\nexport default async function getPeerTitle(\n options: T\n): Promise {\n const {\n peerId = rootScope.myId,\n plainText,\n onlyFirstName,\n limitSymbols,\n managers = rootScope.managers,\n threadId\n } = options;\n\n let title = '';\n if(peerId.isUser()) {\n const user = await managers.appUsersManager.getUser(peerId.toUserId());\n if(user) {\n if(user.first_name) title += user.first_name;\n if(user.last_name && (!onlyFirstName || !title)) title += ' ' + user.last_name;\n }\n\n if(!title) title = !user || user.pFlags.deleted ? I18n.format(onlyFirstName ? 'Deleted' : 'HiddenName', true) : getPeerActiveUsernames(user)[0] || '';\n else title = title.trim();\n } else {\n if(threadId) {\n const topic = await managers.dialogsStorage.getForumTopic(peerId, threadId);\n title = topic?.title || '';\n }\n\n if(!title) {\n const chat = await managers.appChatsManager.getChat(peerId.toChatId()) as Chat.chat;\n title = chat?.title || '';\n }\n\n if(onlyFirstName) {\n title = title.split(' ')[0];\n }\n }\n\n if(limitSymbols !== undefined) {\n title = _limitSymbols(title, limitSymbols, limitSymbols);\n }\n\n return plainText ? title : wrapEmojiText(title) as any;\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 {formatFullSentTimeRaw} from '../../helpers/date';\nimport {User} from '../../layer';\nimport {LangPackKey, i18n} from '../../lib/langPack';\nimport {REPLIES_PEER_ID, SERVICE_PEER_ID} from '../../lib/mtproto/mtproto_config';\n\nexport default function getUserStatusString(user: User.user): HTMLElement {\n if(!user) {\n return document.createElement('span');\n }\n\n let key: LangPackKey;\n let args: any[];\n\n switch(user.id) {\n case REPLIES_PEER_ID.toUserId():\n key = 'Peer.RepliesNotifications';\n break;\n case SERVICE_PEER_ID.toUserId():\n key = 'Peer.ServiceNotifications';\n break;\n default: {\n if(user.pFlags.bot) {\n key = 'Bot';\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 * 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 getImageFromStrippedThumb from '../../helpers/getImageFromStrippedThumb';\nimport noop from '../../helpers/noop';\nimport {Document, Photo, PhotoSize} from '../../layer';\nimport DotRenderer from '../dotRenderer';\nimport SetTransition from '../singleTransition';\n\nexport function toggleMediaSpoiler(options: {\n mediaSpoiler: HTMLElement,\n reveal: boolean,\n destroyAfter?: boolean\n}) {\n const {mediaSpoiler, reveal, destroyAfter} = options;\n SetTransition({\n element: mediaSpoiler,\n forwards: reveal,\n className: 'is-revealing',\n duration: 250,\n onTransitionEnd: () => {\n if(reveal && destroyAfter) {\n mediaSpoiler.remove();\n mediaSpoiler.middlewareHelper.destroy();\n }\n }\n });\n}\n\nexport function onMediaSpoilerClick(options: {\n mediaSpoiler: HTMLElement,\n event: Event\n}) {\n const {mediaSpoiler, event} = options;\n cancelEvent(event);\n\n if(mediaSpoiler.classList.contains('is-revealing')) {\n return;\n }\n\n const video = mediaSpoiler.parentElement.querySelector('video');\n if(video && !mediaSpoiler.parentElement.querySelector('.video-play')) {\n video.autoplay = true;\n video.play().catch(noop);\n }\n\n toggleMediaSpoiler({\n mediaSpoiler,\n reveal: true,\n destroyAfter: true\n });\n}\n\nexport function wrapMediaSpoilerWithImage(options: {\n image: Awaited>['image']\n} & Parameters[0]) {\n const {middleware, image} = options;\n if(!middleware()) {\n return;\n }\n\n image.classList.add('media-spoiler-thumbnail');\n\n const container = document.createElement('div');\n container.classList.add('media-spoiler-container');\n container.middlewareHelper = middleware.create();\n\n const dotRenderer = DotRenderer.create({\n ...options,\n middleware: container.middlewareHelper.get()\n });\n\n container.append(image, dotRenderer.canvas);\n\n return container;\n}\n\nexport default async function wrapMediaSpoiler(\n options: Omit[0], 'image'> & {\n media: Document.document | Photo.photo\n }\n) {\n const {media} = options;\n const sizes = (media as Photo.photo).sizes || (media as Document.document).thumbs;\n const thumb = sizes.find((size) => size._ === 'photoStrippedSize') as PhotoSize.photoStrippedSize;\n if(!thumb) {\n return;\n }\n\n const {image, loadPromise} = getImageFromStrippedThumb(media, thumb, true);\n await loadPromise;\n\n return wrapMediaSpoilerWithImage({\n ...options,\n image\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 {MyMessage} from '../../lib/appManagers/appMessagesManager';\nimport wrapMessageActionTextNewUnsafe from './messageActionTextNewUnsafe';\n\nexport type WrapMessageActionTextOptions = {\n message: MyMessage,\n plain?: boolean\n} & WrapSomethingOptions;\n\nexport default async function wrapMessageActionTextNew(\n options: T\n): Promise {\n try {\n return await wrapMessageActionTextNewUnsafe(options) as any;\n } catch(err) {\n console.error('wrapMessageActionTextNewUnsafe error:', err);\n return options.plain ? '' : document.createElement('span') as any;\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 {hexaToHsla} from '../helpers/color';\nimport {TOPIC_COLORS} from '../lib/mtproto/mtproto_config';\nimport wrapAbbreviation from '../lib/richTextProcessor/wrapAbbreviation';\n\nlet svg: SVGSVGElement, span: HTMLElement, defs: HTMLElement;\nconst hadColors: Map = new Map();\nexport default function topicAvatar(color: number, content: string) {\n if(!svg) {\n defs = document.getElementById('svg-defs') as HTMLElement;\n\n const ns = 'http://www.w3.org/2000/svg';\n\n svg = document.createElementNS(ns, 'svg');\n svg.setAttributeNS(null, 'width', '26');\n svg.setAttributeNS(null, 'height', '26');\n svg.setAttributeNS(null, 'viewBox', '0 0 26 26');\n svg.classList.add('topic-icon-svg');\n\n const use = document.createElementNS(ns, 'use');\n use.setAttributeNS(null, 'href', '#topic-icon');\n svg.append(use);\n\n span = document.createElement('span');\n span.classList.add('topic-icon', 'avatar-like');\n\n const contentSpan = document.createElement('span');\n contentSpan.classList.add('topic-icon-content');\n span.append(svg, contentSpan);\n }\n\n if(!color) {\n console.error('NO TOPIC ICON COLOR!');\n color = TOPIC_COLORS[0];\n }\n\n if(!content) {\n console.error('NO TOPIC NAME!');\n content = '';\n }\n\n const hex = color.toString(16);\n\n const gradientId = `topic-icon-gradient-${color}`;\n let strokeColor = hadColors.get(color);\n if(!strokeColor) {\n const {h, s, l, a} = hexaToHsla('#' + hex);\n defs.insertAdjacentHTML('beforeend', `\n \n \n \n \n `);\n\n hadColors.set(color, strokeColor = `hsla(${h}, ${s}%, ${Math.max(0, l - 40)}%, ${a})`);\n }\n\n const clone = span.cloneNode(true) as typeof span;\n (clone.firstElementChild as HTMLElement).style.fill = `url(#${gradientId})`;\n // (clone.firstElementChild as HTMLElement).style.stroke = `var(--peer-avatar-${color}-filled)`;\n (clone.firstElementChild as HTMLElement).style.stroke = strokeColor;\n clone.lastElementChild.append(wrapAbbreviation(content, true));\n return clone;\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, MessageAction} from '../../layer';\nimport wrapUrl from '../../lib/richTextProcessor/wrapUrl';\n\nexport default function wrapJoinVoiceChatAnchor(message: Message.messageService) {\n const action = message.action as MessageAction.messageActionInviteToGroupCall;\n const {onclick, url} = 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 * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport {formatTime, ONE_DAY} from '../../helpers/date';\nimport htmlToSpan from '../../helpers/dom/htmlToSpan';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport formatCallDuration from '../../helpers/formatCallDuration';\nimport paymentsWrapCurrencyAmount from '../../helpers/paymentsWrapCurrencyAmount';\nimport {ForumTopic, Message, MessageAction} from '../../layer';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport I18n, {FormatterArgument, FormatterArguments, i18n, join, langPack, LangPackKey, _i18n} from '../../lib/langPack';\nimport {GENERAL_TOPIC_ID} from '../../lib/mtproto/mtproto_config';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport wrapPlainText from '../../lib/richTextProcessor/wrapPlainText';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\nimport rootScope from '../../lib/rootScope';\nimport topicAvatar from '../topicAvatar';\nimport {wrapCustomEmojiAwaited} from './customEmoji';\nimport getPeerTitle from './getPeerTitle';\nimport wrapJoinVoiceChatAnchor from './joinVoiceChatAnchor';\nimport {WrapMessageActionTextOptions} from './messageActionTextNew';\nimport wrapMessageForReply, {WrapMessageForReplyOptions} from './messageForReply';\nimport wrapPeerTitle from './peerTitle';\n\nasync function wrapLinkToMessage(options: WrapMessageForReplyOptions) {\n const wrapped = await wrapMessageForReply(options);\n\n if(options.plain) {\n return wrapped;\n }\n\n const a = document.createElement('i');\n a.dataset.savedFrom = (options.message as Message.message).peerId + '_' + (options.message as Message.message).mid;\n a.dir = 'auto';\n a.append(wrapped);\n return a;\n}\n\nfunction wrapSomeText(text: string, plain?: boolean) {\n return plain ? text : htmlToSpan(wrapEmojiText(text));\n}\n\ntype WrapTopicIconOptions = {\n topic: Pick,\n plain?: boolean\n} & WrapSomethingOptions;\nexport async function wrapTopicIcon(options: T): Promise {\n const topic = options.topic;\n\n let iconEmojiId = topic?.icon_emoji_id;\n if(topic?.id === GENERAL_TOPIC_ID) {\n iconEmojiId = '5390854796011906616';\n }\n\n if(!iconEmojiId) {\n if(options.plain) return '' as any;\n\n // if(topic?.id === GENERAL_TOPIC_ID) {\n // const span = document.createElement('span');\n // span.innerHTML = `\n // \n // \n // \n // `;\n\n // span.classList.add('topic-icon');\n\n // return span as any;\n // }\n\n return topicAvatar(topic?.icon_color, topic?.title) as any;\n }\n\n return options.plain ?\n rootScope.managers.appEmojiManager.getCustomEmojiDocument(iconEmojiId).then((doc) => doc.stickerEmojiRaw) :\n wrapCustomEmojiAwaited({\n ...options,\n docIds: [iconEmojiId]\n }).then((fragment) => {\n fragment.lastElementChild.classList.add('topic-icon');\n return fragment;\n }) as any;\n}\n\nfunction wrapMessageActionTopicIcon(options: WrapMessageActionTextOptions) {\n const action = ((options.message as Message.messageService).action as MessageAction.messageActionTopicCreate);\n return wrapTopicIcon({\n ...options,\n topic: action as any as ForumTopic.forumTopic\n });\n}\n\nasync function wrapMessageActionTopicIconAndName(options: WrapMessageActionTextOptions) {\n const action = ((options.message as Message.messageService).action as MessageAction.messageActionTopicCreate);\n const span = document.createElement('span');\n span.classList.add('topic-name');\n span.append(await wrapMessageActionTopicIcon(options), wrapSomeText(action.title, options.plain));\n return span;\n}\n\nexport default async function wrapMessageActionTextNewUnsafe(options: WrapMessageActionTextOptions) {\n const {plain, message, middleware, lazyLoadQueue, customEmojiSize, animationGroup} = options;\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 wrapPlainText(unsafeMessage);\n } else {\n setInnerHTML(element, wrapRichText(unsafeMessage, {noLinebreaks: true}));\n return element;\n }\n } else {\n let _ = action._;\n // let suffix = '';\n let langPackKey: LangPackKey;\n let args: Array>;\n\n const managers = rootScope.managers;\n\n const getNameDivHTML = (peerId: PeerId, plain: boolean) => {\n return plain ? getPeerTitle({peerId, plainText: plain}) : wrapPeerTitle({peerId});\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(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 = rootScope.myId;\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(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 = await managers.appPeersManager.isBroadcast(message.peerId);\n langPackKey = isBroadcast ? 'ChatList.Service.VoiceChatScheduled.Channel' : 'ChatList.Service.VoiceChatScheduled';\n args = [];\n const myId = rootScope.myId;\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;\n const _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 = rootScope.myId;\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 = await managers.appMessagesManager.getMessageByPeer(peerId, message.reply_to_mid);\n\n args = [\n getNameDivHTML(message.fromId, plain)\n ];\n\n if(!pinnedMessage/* || true */) {\n langPackKey = 'ActionPinnedNoText';\n\n if(message.reply_to_mid) { // refresh original message\n managers.appMessagesManager.fetchMessageReplyTo(message);\n }\n } else {\n args.push(wrapLinkToMessage({\n ...options,\n message: pinnedMessage\n }));\n }\n\n break;\n }\n\n case 'messageActionChatJoinedByRequest': {\n const isBroadcast = await managers.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(wrapSomeText(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 await Promise.all(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 = 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 case 'messageActionPaymentSent': {\n const isRecurringInit = action.pFlags.recurring_init;\n const isRecurringUsed = action.pFlags.recurring_used;\n langPackKey = isRecurringUsed ? 'Chat.Service.PaymentSentRecurringUsedNoTitle' : (isRecurringInit ? 'Chat.Service.PaymentSentRecurringInitNoTitle' : 'Chat.Service.PaymentSent1NoTitle');\n const price = paymentsWrapCurrencyAmount(action.total_amount, action.currency);\n args = [price, getNameDivHTML(message.peerId, plain)];\n\n if(message.reply_to_mid) {\n const invoiceMessage = await managers.appMessagesManager.getMessageByPeer(\n message.reply_to?.reply_to_peer_id ? getPeerId(message.reply_to.reply_to_peer_id) : message.peerId,\n message.reply_to_mid\n );\n\n if(!invoiceMessage) {\n managers.appMessagesManager.fetchMessageReplyTo(message);\n } else {\n langPackKey = isRecurringUsed ? 'Chat.Service.PaymentSentRecurringUsed' : (isRecurringInit ? 'Chat.Service.PaymentSentRecurringInit' : 'Chat.Service.PaymentSent1');\n args.push(wrapLinkToMessage({\n ...options,\n message: invoiceMessage\n }).then((el) => {\n if(el instanceof HTMLElement) {\n el.classList.add('is-receipt-link');\n }\n\n return el;\n }));\n }\n }\n\n break;\n }\n\n case 'messageActionSetMessagesTTL': {\n args = [];\n\n const isBroadcast = await managers.appPeersManager.isBroadcast(message.peerId);\n if(action.period) {\n if(isBroadcast) {\n langPackKey = 'ActionTTLChannelChanged';\n } else if(message.fromId === rootScope.myId) {\n langPackKey = 'ActionTTLYouChanged';\n } else {\n langPackKey = 'ActionTTLChanged';\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n let duration: ReturnType;\n if(action.period > 1814400) {\n let key: LangPackKey;\n const args: FormatterArguments = [];\n const year = 31536000;\n if(action.period >= year) {\n key = 'Years';\n args.push(action.period / year | 0);\n } else {\n key = 'Months';\n args.push(action.period / (ONE_DAY * 30) | 0);\n }\n\n duration = plain ? I18n.format(key, true, args) : i18n(key, args);\n } else {\n duration = formatCallDuration(action.period, plain);\n }\n\n args.push(duration);\n } else {\n if(isBroadcast) {\n langPackKey = 'ActionTTLChannelDisabled';\n } else if(message.fromId === rootScope.myId) {\n langPackKey = 'ActionTTLYouDisabled';\n } else {\n langPackKey = 'ActionTTLDisabled';\n args.push(getNameDivHTML(message.fromId, plain));\n }\n }\n break;\n }\n\n case 'messageActionTopicEdit': {\n let iconElement: (typeof args)[0];\n let titleElement: typeof iconElement;\n let authorElement: ReturnType;\n const isMe = !!message.pFlags.out;\n const isIconChanged = action.icon_emoji_id !== undefined;\n const isIconRemoved = isIconChanged && !+action.icon_emoji_id;\n const isTitleChanged = action.title !== undefined;\n const isHiddenChanged = action.hidden !== undefined;\n\n if(!isMe) {\n authorElement = getNameDivHTML(message.fromId, plain);\n }\n\n if(isTitleChanged) {\n titleElement = wrapSomeText(action.title);\n }\n\n if(isIconChanged && !isIconRemoved) {\n iconElement = wrapMessageActionTopicIcon(options);\n }\n\n args = authorElement ? [authorElement] : [];\n\n if(action.closed) {\n langPackKey = isMe ? 'Chat.Service.Group.TopicEdited.You.Paused' : 'Chat.Service.Group.TopicEdited.Paused';\n } else if(action.closed === false) {\n langPackKey = isMe ? 'Chat.Service.Group.TopicEdited.You.Resumed' : 'Chat.Service.Group.TopicEdited.Resumed';\n } else if(isIconRemoved && isTitleChanged) {\n langPackKey = isMe ? 'Chat.Service.TopicEdited.You.Mixed.IconRemoved' : 'Chat.Service.TopicEdited.Mixed.IconRemoved';\n args.push(titleElement);\n } else if(isIconChanged && isTitleChanged) {\n langPackKey = isMe ? 'Chat.Service.TopicEdited.You.Mixed' : 'Chat.Service.TopicEdited.Mixed';\n args.push(wrapMessageActionTopicIconAndName(options));\n } else if(isIconRemoved) {\n langPackKey = isMe ? 'Chat.Service.Group.TopicEdited.You.Icon.Removed' : 'Chat.Service.Group.TopicEdited.Icon.Removed';\n } else if(isTitleChanged) {\n langPackKey = isMe ? 'Chat.Service.Group.TopicEdited.You.Title' : 'Chat.Service.Group.TopicEdited.Title';\n args.push(titleElement);\n } else if(isIconChanged) {\n langPackKey = isMe ? 'Chat.Service.Group.TopicEdited.You.Icon' : 'Chat.Service.Group.TopicEdited.Icon';\n args.push(iconElement);\n } else if(isHiddenChanged) {\n langPackKey = isMe ?\n (action.hidden ? 'Chat.Service.Group.TopicEdited.You.Hided' : 'Chat.Service.Group.TopicEdited.You.Unhided') :\n (action.hidden ? 'Chat.Service.Group.TopicEdited.Hided' : 'Chat.Service.Group.TopicEdited.Unhided');\n }\n\n break;\n }\n\n case 'messageActionTopicCreate': {\n args = [wrapMessageActionTopicIconAndName(options)];\n langPackKey = 'TopicWasCreatedAction';\n break;\n }\n\n case 'messageActionSetChatTheme': {\n const isMe = !!message.pFlags.out;\n let authorElement: ReturnType;\n if(!isMe) {\n authorElement = getNameDivHTML(message.fromId, plain);\n }\n\n args = authorElement ? [authorElement] : [];\n\n if(action.emoticon) {\n args.push(wrapEmojiText(action.emoticon));\n langPackKey = isMe ? 'ChatThemeChangedYou' : 'ChatThemeChangedTo';\n } else {\n langPackKey = isMe ? 'ChatThemeDisabledYou' : 'ChatThemeDisabled';\n }\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 const waited = args && await Promise.all(args);\n\n if(plain) {\n return I18n.format(langPackKey, true, waited);\n } else {\n return _i18n(element, langPackKey, waited);\n }\n\n // str = !langPackKey || langPackKey[0].toUpperCase() === langPackKey[0] ? langPackKey : getNameDivHTML(message.fromId) + langPackKey + (suffix ? ' ' : '');\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 assumeType from '../../helpers/assumeType';\nimport htmlToDocumentFragment from '../../helpers/dom/htmlToDocumentFragment';\nimport {getRestrictionReason} from '../../helpers/restrictions';\nimport escapeRegExp from '../../helpers/string/escapeRegExp';\nimport limitSymbols from '../../helpers/string/limitSymbols';\nimport {Message, DocumentAttribute, DraftMessage} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport {MyDraftMessage} from '../../lib/appManagers/appDraftsManager';\nimport {MyMessage} from '../../lib/appManagers/appMessagesManager';\nimport isMessageRestricted from '../../lib/appManagers/utils/messages/isMessageRestricted';\nimport I18n, {LangPackKey, i18n, UNSUPPORTED_LANG_PACK_KEY} from '../../lib/langPack';\nimport parseEntities from '../../lib/richTextProcessor/parseEntities';\nimport sortEntities from '../../lib/richTextProcessor/sortEntities';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport wrapPlainText from '../../lib/richTextProcessor/wrapPlainText';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\nimport rootScope from '../../lib/rootScope';\nimport {Modify} from '../../types';\nimport wrapMessageActionTextNew, {WrapMessageActionTextOptions} from './messageActionTextNew';\n\nexport type WrapMessageForReplyOptions = Modify & {\n text?: string,\n usingMids?: number[],\n highlightWord?: string,\n withoutMediaType?: boolean\n};\n\n// export default async function wrapMessageForReply(message: MyMessage | MyDraftMessage, text: string, usingMids: number[], plain: true, highlightWord?: string, withoutMediaType?: boolean): Promise;\n// export default async function wrapMessageForReply(message: MyMessage | MyDraftMessage, text?: string, usingMids?: number[], plain?: false, highlightWord?: string, withoutMediaType?: boolean): Promise;\n// export default async function wrapMessageForReply(message: MyMessage | MyDraftMessage, text: string = (message as Message.message).message, usingMids?: number[], plain?: boolean, highlightWord?: string, withoutMediaType?: boolean): Promise {\nexport default async function wrapMessageForReply(\n options: T\n): Promise {\n let {message, text, usingMids, plain, highlightWord, withoutMediaType} = options;\n text ??= (message as Message.message).message;\n\n const parts: (Node | string)[] = [];\n\n let hasAlbumKey = false;\n const addPart = (langKey: LangPackKey, part?: string | HTMLElement | DocumentFragment) => {\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('span');\n if(typeof(part) === 'string') el.innerHTML = part;\n else el.append(part);\n parts.push(el);\n }\n };\n\n const managers = rootScope.managers;\n const appMessagesManager = managers.appMessagesManager;\n\n const isRestricted = isMessageRestricted(message as any);\n\n let entities = (message as Message.message).totalEntities ?? (message as DraftMessage.draftMessage).entities;\n if((message as Message.message).media && !isRestricted) {\n assumeType(message);\n let usingFullAlbum = true;\n if(message.grouped_id) {\n if(usingMids) {\n const mids = await appMessagesManager.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 = await appMessagesManager.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 : 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 const f = '๐Ÿ“Š' + ' ' + (media.poll.question || 'poll');\n addPart(undefined, plain ? f : wrapEmojiText(f));\n break;\n case 'messageMediaContact':\n addPart('AttachContact');\n break;\n case 'messageMediaGame': {\n const f = '๐ŸŽฎ' + ' ' + media.game.title;\n addPart(undefined, plain ? f : 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 const i = parts.length;\n if(document.stickerEmojiRaw) {\n const f = document.stickerEmojiRaw + ' ';\n addPart(undefined, plain ? f : wrapEmojiText(f));\n }\n\n addPart('AttachSticker');\n\n // will combine two parts into one\n const p = parts.splice(i, 2);\n if(plain) parts.push((p[0] as string) + (p[1] ? p[1] as string : ''));\n else {\n const span = window.document.createElement('span');\n span.append(...p);\n parts.push(span);\n }\n\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 : wrapEmojiText(f));\n } else {\n addPart(undefined, plain ? document.file_name : wrapEmojiText(document.file_name));\n }\n\n break;\n }\n\n case 'messageMediaInvoice': {\n if(media.extended_media?._ === 'messageExtendedMediaPreview') {\n addPart(undefined, plain ? media.description : wrapEmojiText(media.description));\n } else {\n addPart(undefined, plain ? media.title : wrapEmojiText(media.title));\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 // /////appMessagesManager.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 = await wrapMessageActionTextNew({message: (message as Message.messageService), plain});\n if(actionWrapped) {\n addPart(undefined, actionWrapped);\n }\n }\n\n if(isRestricted) {\n text = getRestrictionReason((message as Message.message).restriction_reason).text;\n entities = [];\n }\n\n if(text) {\n text = limitSymbols(text, 100);\n\n entities ??= parseEntities(text);\n\n if(plain) {\n parts.push(wrapPlainText(text, entities));\n } else {\n // let entities = parseEntities(text.replace(/\\n/g, ' '));\n\n if(highlightWord) {\n highlightWord = highlightWord.trim();\n let found = false;\n let match: any;\n const regExp = new RegExp(escapeRegExp(highlightWord), 'gi');\n entities = entities.slice(); // fix leaving highlight entity\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 sortEntities(entities);\n }\n }\n\n const messageWrapped = wrapRichText(text, {\n noLinebreaks: true,\n entities,\n noLinks: true,\n noTextFormat: true\n });\n\n parts.push(htmlToDocumentFragment(messageWrapped));\n }\n }\n\n if(plain) {\n return parts.join('') as any;\n } else {\n const fragment = document.createDocumentFragment();\n fragment.append(...parts);\n return fragment as any;\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 PeerTitle, {PeerTitleOptions} from '../peerTitle';\n\nexport default async function wrapPeerTitle(options: PeerTitleOptions) {\n const peerTitle = new PeerTitle();\n await peerTitle.update(options);\n return peerTitle.element;\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 renderMediaWithFadeIn from '../../helpers/dom/renderMediaWithFadeIn';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {Message, PhotoSize, VideoSize, WebDocument} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport {MyPhoto} from '../../lib/appManagers/appPhotosManager';\nimport rootScope from '../../lib/rootScope';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport ProgressivePreloader from '../preloader';\nimport blur from '../../helpers/blur';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getStrippedThumbIfNeeded from '../../helpers/getStrippedThumbIfNeeded';\nimport setAttachmentSize from '../../helpers/setAttachmentSize';\nimport choosePhotoSize from '../../lib/appManagers/utils/photos/choosePhotoSize';\nimport type {ThumbCache} from '../../lib/storages/thumbs';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport isWebDocument from '../../lib/appManagers/utils/webDocs/isWebDocument';\nimport createVideo from '../../helpers/dom/createVideo';\nimport noop from '../../helpers/noop';\nimport {THUMB_TYPE_FULL} from '../../lib/mtproto/mtproto_config';\nimport {Middleware} from '../../helpers/middleware';\n\nexport default async function wrapPhoto({photo, message, container, boxWidth, boxHeight, withTail, isOut, lazyLoadQueue, middleware, size, withoutPreloader, loadPromises, autoDownloadSize, noBlur, noThumb, noFadeIn, blurAfter, managers = rootScope.managers, processUrl}: {\n photo: MyPhoto | MyDocument | WebDocument,\n message?: Message.message | Message.messageService,\n container: HTMLElement,\n boxWidth?: number,\n boxHeight?: number,\n withTail?: boolean,\n isOut?: boolean,\n lazyLoadQueue?: LazyLoadQueue,\n middleware?: Middleware,\n size?: PhotoSize | VideoSize,\n withoutPreloader?: boolean,\n loadPromises?: Promise[],\n autoDownloadSize?: number,\n noBlur?: boolean,\n noThumb?: boolean,\n noFadeIn?: boolean,\n blurAfter?: boolean,\n managers?: AppManagers,\n processUrl?: (url: string) => Promise\n}) {\n const ret = {\n loadPromises: {\n thumb: Promise.resolve() as Promise,\n full: Promise.resolve() as Promise\n },\n images: {\n thumb: null as HTMLImageElement | HTMLCanvasElement,\n full: null as HTMLVideoElement | HTMLImageElement\n },\n preloader: null as ProgressivePreloader,\n aspecter: null as HTMLElement\n };\n\n const isDocument = photo._ === 'document';\n const isImageFromDocument = isDocument && photo.mime_type.startsWith('image/') && !size;\n const isWebDoc = isWebDocument(photo);\n if(!((photo as MyPhoto).sizes || (photo as MyDocument).thumbs) && !isWebDoc && !isImageFromDocument) {\n if(boxWidth && boxHeight && !size && isDocument) {\n setAttachmentSize(photo, container, boxWidth, boxHeight, undefined, message);\n }\n\n return ret;\n }\n\n let noAutoDownload = autoDownloadSize === 0;\n\n if(!size) {\n if(boxWidth === undefined) boxWidth = mediaSizes.active.regular.width;\n if(boxHeight === undefined) boxHeight = mediaSizes.active.regular.height;\n }\n\n container.classList.add('media-container');\n let aspecter = container;\n\n let isFit = true;\n let loadThumbPromise: Promise = Promise.resolve();\n let thumbImage: HTMLImageElement | HTMLCanvasElement;\n // let image: HTMLImageElement;\n let cacheContext: ThumbCache;\n // if(withTail) {\n // image = wrapMediaWithTail(photo, message, container, boxWidth, boxHeight, isOut);\n // } else {\n\n if(boxWidth && boxHeight && !size) { // !album\n const set = setAttachmentSize(\n photo,\n container,\n boxWidth,\n boxHeight,\n undefined,\n message,\n undefined,\n isImageFromDocument ? {\n _: 'photoSize',\n w: photo.w,\n h: photo.h,\n size: photo.size,\n type: THUMB_TYPE_FULL\n } : undefined\n );\n size = set.photoSize;\n isFit = set.isFit;\n cacheContext = await managers.thumbsStorage.getCacheContext(photo, size.type);\n\n if(!isFit && !isWebDoc) {\n aspecter = document.createElement('div');\n aspecter.classList.add('media-container-aspecter');\n aspecter.style.width = set.size.width + 'px';\n aspecter.style.height = set.size.height + 'px';\n\n const gotThumb = getStrippedThumbIfNeeded(photo, cacheContext, !noBlur, true);\n if(gotThumb) {\n loadThumbPromise = gotThumb.loadPromise;\n const thumbImage = gotThumb.image; // local scope\n thumbImage.classList.add('media-photo');\n container.append(thumbImage);\n } else {\n const res = await wrapPhoto({\n container,\n message,\n photo,\n boxWidth: 0,\n boxHeight: 0,\n size,\n lazyLoadQueue,\n isOut,\n loadPromises,\n middleware,\n withoutPreloader,\n withTail,\n autoDownloadSize,\n noBlur,\n noThumb: true,\n blurAfter: true,\n managers\n // noFadeIn: true\n });\n const thumbImage = res.images.full;\n thumbImage.classList.add('media-photo', 'thumbnail');\n // container.append(thumbImage);\n }\n\n container.classList.add('media-container-fitted');\n container.append(aspecter);\n }\n } else {\n if(!size) {\n size = choosePhotoSize(photo, boxWidth, boxHeight, true);\n }\n\n cacheContext = await managers.thumbsStorage.getCacheContext(photo, size?.type);\n }\n\n if(!noThumb && !isWebDoc) {\n const gotThumb = getStrippedThumbIfNeeded(photo, cacheContext, !noBlur);\n if(gotThumb) {\n loadThumbPromise = Promise.all([loadThumbPromise, gotThumb.loadPromise]);\n ret.loadPromises.thumb = ret.loadPromises.full = loadThumbPromise;\n thumbImage = ret.images.thumb = gotThumb.image;\n thumbImage.classList.add('media-photo');\n aspecter.append(thumbImage);\n }\n }\n // }\n\n ret.aspecter = aspecter;\n\n if((size?._ === 'photoSizeEmpty' && isDocument) || (size as PhotoSize.photoStrippedSize)?.bytes) {\n return ret;\n }\n\n let media: HTMLVideoElement | HTMLImageElement;\n if(size?._ === 'videoSize') {\n media = ret.images.full = createVideo();\n media.autoplay = true;\n media.loop = true;\n media.muted = true;\n media.classList.add('media-photo');\n } else {\n media = ret.images.full = new Image();\n media.classList.add('media-photo');\n }\n\n // console.log('wrapPhoto downloaded:', photo, photo.downloaded, container);\n\n const needFadeIn = (thumbImage || !cacheContext.downloaded) && rootScope.settings.animationsEnabled && !noFadeIn;\n\n let preloader: ProgressivePreloader;\n const uploadingFileName = (message as Message.message)?.uploadingFileName;\n if(!withoutPreloader) {\n if(!cacheContext.downloaded || uploadingFileName) {\n preloader = new ProgressivePreloader({\n attachMethod: 'prepend',\n isUpload: !!uploadingFileName\n });\n }\n\n if(uploadingFileName) { // means upload\n preloader.attachPromise(appDownloadManager.getUpload(uploadingFileName));\n preloader.attach(container);\n noAutoDownload = undefined;\n }\n }\n\n\n const getDownloadPromise = () => {\n // const promise = isGif && !size ?\n // managers.appDocsManager.downloadDoc(photo, /* undefined, */lazyLoadQueue?.queueId) :\n // managers.appPhotosManager.preloadPhoto(photo, size, lazyLoadQueue?.queueId, noAutoDownload);\n const haveToDownload = isImageFromDocument && !size;\n const promise = appDownloadManager.downloadMediaURL({\n media: photo,\n thumb: size,\n queueId: lazyLoadQueue?.queueId,\n onlyCache: haveToDownload ? undefined : noAutoDownload\n });\n\n return promise;\n };\n\n const renderOnLoad = (url: string) => {\n return renderMediaWithFadeIn(container, media, url, needFadeIn, aspecter, thumbImage);\n };\n\n const onLoad = async(url: string) => {\n if(middleware && !middleware()) return;\n\n if(processUrl) {\n url = await processUrl(url);\n }\n\n if(blurAfter) {\n const result = blur(url, 12);\n return result.promise.then(() => {\n // image = result.canvas;\n return renderOnLoad(result.canvas.toDataURL());\n });\n }\n\n return renderOnLoad(url);\n };\n\n let loadPromise: Promise;\n const canAttachPreloader = (\n (size as PhotoSize.photoSize).w >= 150 &&\n (size as PhotoSize.photoSize).h >= 150\n ) || noAutoDownload;\n const load = async() => {\n if(noAutoDownload && !withoutPreloader && preloader) {\n preloader.construct();\n preloader.setManual();\n }\n\n const promise = getDownloadPromise();\n const cacheContext = await managers.thumbsStorage.getCacheContext(photo, size?.type);\n if(\n preloader &&\n !cacheContext.downloaded &&\n !withoutPreloader &&\n canAttachPreloader\n ) {\n preloader.attach(container, false, promise);\n }\n\n noAutoDownload = undefined;\n\n const renderPromise = promise.then(onLoad);\n renderPromise.catch(noop);\n return {download: promise, render: renderPromise};\n };\n\n if(preloader) {\n preloader.setDownloadFunction(load);\n }\n\n if(cacheContext.downloaded) {\n loadThumbPromise = loadPromise = (await load()).render;\n } else {\n if(!lazyLoadQueue) loadPromise = (await load()).render;\n /* else if(noAutoDownload) {\n preloader.construct();\n preloader.setManual();\n preloader.attach(container);\n } */ else lazyLoadQueue.push({div: container, load: () => load().then(({download}) => download)});\n }\n\n if(loadPromises && loadThumbPromise) {\n loadPromises.push(loadThumbPromise);\n }\n\n // const perf = performance.now();\n await loadThumbPromise;\n ret.loadPromises.thumb = loadThumbPromise;\n ret.loadPromises.full = loadPromise || Promise.resolve();\n ret.preloader = preloader;\n\n // const elapsedTime = performance.now() - perf;\n // if(elapsedTime > 4) {\n // console.log('wrapping photo thumb time', elapsedTime, photo, size);\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 {MyMessage} from '../../lib/appManagers/appMessagesManager';\nimport getMessageSenderPeerIdOrName from '../../lib/appManagers/utils/messages/getMessageSenderPeerIdOrName';\nimport {i18n} from '../../lib/langPack';\nimport rootScope from '../../lib/rootScope';\nimport wrapPeerTitle from './peerTitle';\n\nexport default async function 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 await wrapPeerTitle({\n ...getMessageSenderPeerIdOrName(message),\n dialog: message.peerId === rootScope.myId\n })\n );\n\n if(await rootScope.managers.appPeersManager.isAnyGroup(message.peerId) || fromMe) {\n const peerTitle = await wrapPeerTitle({peerId: message.peerId});\n senderTitle.append(' โž ', peerTitle);\n }\n\n return senderTitle;\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 {formatDateAccordingToTodayNew} from '../../helpers/date';\nimport {MyMessage} from '../../lib/appManagers/appMessagesManager';\n\nexport default function 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 * 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_WEBP_SUPPORTED from '../../environment/webpSupport';\nimport assumeType from '../../helpers/assumeType';\nimport getPathFromBytes from '../../helpers/bytes/getPathFromBytes';\nimport deferredPromise from '../../helpers/cancellablePromise';\nimport computeLockColor from '../../helpers/computeLockColor';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport createVideo from '../../helpers/dom/createVideo';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport renderImageFromUrl, {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\nimport getImageFromStrippedThumb from '../../helpers/getImageFromStrippedThumb';\nimport getPreviewURLFromThumb from '../../helpers/getPreviewURLFromThumb';\nimport makeError from '../../helpers/makeError';\nimport {makeMediaSize} from '../../helpers/mediaSize';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {Middleware} from '../../helpers/middleware';\nimport onMediaLoad from '../../helpers/onMediaLoad';\nimport {isSavingLottiePreview, saveLottiePreview} from '../../helpers/saveLottiePreview';\nimport throttle from '../../helpers/schedulers/throttle';\nimport sequentialDom from '../../helpers/sequentialDom';\nimport {PhotoSize, VideoSize} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\nimport choosePhotoSize from '../../lib/appManagers/utils/photos/choosePhotoSize';\nimport getStickerEffectThumb from '../../lib/appManagers/utils/stickers/getStickerEffectThumb';\nimport lottieLoader from '../../lib/rlottie/lottieLoader';\nimport type RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport rootScope from '../../lib/rootScope';\nimport type {ThumbCache} from '../../lib/storages/thumbs';\nimport webpWorkerController from '../../lib/webp/webpWorkerController';\nimport {Awaited, SendMessageEmojiInteractionData} from '../../types';\nimport {getEmojiToneIndex} from '../../vendor/emoji';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport PopupStickers from '../popups/stickers';\nimport {hideToast, toastNew} from '../toast';\nimport wrapStickerAnimation from './stickerAnimation';\nimport framesCache from '../../helpers/framesCache';\n\n// https://github.com/telegramdesktop/tdesktop/blob/master/Telegram/SourceFiles/history/view/media/history_view_sticker.cpp#L40\nexport const STICKER_EFFECT_MULTIPLIER = 1 + 0.245 * 2;\nconst EMOJI_EFFECT_MULTIPLIER = 3;\n\nconst locksUrls: {[docId: string]: string} = {};\n\nexport const videosCache: {[key: string]: Promise} = {};\n\nconst onAnimationEnd = (element: HTMLElement, onAnimationEnd: () => void, timeout: number) => {\n const onEnd = () => {\n element.removeEventListener('animationend', onEnd);\n onAnimationEnd();\n clearTimeout(_timeout);\n };\n element.addEventListener('animationend', onEnd);\n const _timeout = setTimeout(onEnd, timeout);\n};\n\nexport default async function wrapSticker({doc, div, middleware, loadStickerMiddleware, lazyLoadQueue, exportLoad, group, play, onlyThumb, emoji, width, height, withThumb, loop, loadPromises, needFadeIn, needUpscale, skipRatio, static: asStatic, managers = rootScope.managers, fullThumb, isOut, noPremium, withLock, relativeEffect, loopEffect, isCustomEmoji, syncedVideo}: {\n doc: MyDocument,\n div: HTMLElement | HTMLElement[],\n middleware?: Middleware,\n loadStickerMiddleware?: Middleware,\n lazyLoadQueue?: LazyLoadQueue,\n exportLoad?: number,\n group?: AnimationItemGroup,\n play?: boolean,\n onlyThumb?: boolean,\n emoji?: string,\n width?: number,\n height?: number,\n withThumb?: boolean,\n loop?: RLottiePlayer['loop'],\n loadPromises?: Promise[],\n needFadeIn?: boolean,\n needUpscale?: boolean,\n skipRatio?: number,\n static?: boolean,\n managers?: AppManagers,\n fullThumb?: PhotoSize | VideoSize,\n isOut?: boolean,\n noPremium?: boolean,\n withLock?: boolean,\n relativeEffect?: boolean,\n loopEffect?: boolean,\n isCustomEmoji?: boolean,\n syncedVideo?: boolean\n}) {\n div = Array.isArray(div) ? div : [div];\n\n if(isCustomEmoji) {\n emoji = doc.stickerEmojiRaw;\n }\n\n const stickerType = doc.sticker;\n if(stickerType === 1) {\n asStatic = true;\n }\n\n if(!width && !height) {\n const sizes = mediaSizes.active;\n const boxSize = emoji ? sizes.emojiSticker : (doc.animated ? sizes.animatedSticker : sizes.staticSticker);\n const size = makeMediaSize(doc.w, doc.h).aspectFitted(boxSize);\n width = size.width;\n height = size.height;\n }\n\n if(stickerType === 2) {\n // LottieLoader.loadLottie();\n lottieLoader.loadLottieWorkers();\n }\n\n div.forEach((div) => {\n div.dataset.docId = '' + doc.id;\n if(emoji) {\n div.dataset.stickerEmoji = emoji;\n }\n\n div.classList.add('media-sticker-wrapper');\n });\n\n /* if(stickerType === 3) {\n const videoRes = wrapVideo({\n doc,\n boxWidth: width,\n boxHeight: height,\n container: div,\n group,\n lazyLoadQueue,\n middleware,\n withoutPreloader: true,\n loadPromises,\n noPlayButton: true,\n noInfo: true\n });\n\n if(videoRes.thumb) {\n if(videoRes.thumb.images.thumb) {\n videoRes.thumb.images.thumb.classList.add('media-sticker', 'thumbnail');\n }\n\n if(videoRes.thumb.images.full) {\n videoRes.thumb.images.full.classList.add('media-sticker');\n }\n }\n\n return videoRes.loadPromise;\n } */\n\n // console.log('wrap sticker', doc, div, onlyThumb);\n\n let cacheContext: ThumbCache;\n const getCacheContext = async(type: string = cacheContext?.type) => {\n return cacheContext = await managers.thumbsStorage.getCacheContext(doc, type);\n };\n\n const isAnimated = !asStatic && (stickerType === 2 || stickerType === 3);\n\n const effectThumb = getStickerEffectThumb(doc);\n if(isOut !== undefined && effectThumb && !isOut) {\n div.forEach((div) => div.classList.add('reflect-x'));\n }\n\n const willHaveLock = effectThumb && withLock;\n if(willHaveLock) {\n const lockUrl = locksUrls[doc.id];\n div.forEach((div) => {\n div.classList.add('is-premium-sticker', 'tgico-premium_lock');\n lockUrl && div.style.setProperty('--lock-url', `url(${lockUrl})`);\n });\n }\n\n if(asStatic && stickerType !== 1) {\n const thumb = choosePhotoSize(doc, width, height, false) as PhotoSize.photoSize;\n await getCacheContext(thumb.type);\n } else {\n await getCacheContext(fullThumb?.type);\n }\n\n const toneIndex = emoji && !isCustomEmoji ? getEmojiToneIndex(emoji) : -1;\n const downloaded = cacheContext.downloaded && !needFadeIn;\n\n const isThumbNeededForType = isAnimated;\n const lottieCachedThumb = stickerType === 2 || stickerType === 3 ? await managers.appDocsManager.getLottieCachedThumb(doc.id, toneIndex) : undefined;\n\n const ret = {render: undefined as typeof loadPromise, load: undefined as typeof load};\n let loadThumbPromise = deferredPromise();\n let haveThumbCached = false;\n if((\n doc.thumbs?.length ||\n lottieCachedThumb\n ) &&\n !div[0].firstElementChild && (\n !downloaded ||\n isThumbNeededForType ||\n onlyThumb\n ) && withThumb !== false/* && doc.thumbs[0]._ !== 'photoSizeEmpty' */\n ) {\n let thumb = lottieCachedThumb || doc.thumbs[0];\n\n // console.log('wrap sticker', thumb, div);\n\n const afterRender = (div: HTMLElement, thumbImage: HTMLElement) => {\n if(!div.childElementCount) {\n sequentialDom.mutateElement(div, () => {\n if(!div.childElementCount) {\n thumbImage.classList.add('media-sticker', 'thumbnail');\n div.append(thumbImage);\n }\n\n loadThumbPromise.resolve();\n });\n } else {\n loadThumbPromise.resolve();\n }\n };\n\n if('url' in thumb) {\n haveThumbCached = true;\n div.forEach((div) => {\n const thumbImage = new Image();\n renderImageFromUrl(thumbImage, (thumb as any).url, () => afterRender(div, thumbImage));\n });\n } else if('bytes' in thumb) {\n if(thumb._ === 'photoPathSize') {\n if(!thumb.bytes.length) {\n thumb = doc.thumbs.find((t) => (t as PhotoSize.photoStrippedSize).bytes?.length) || thumb;\n }\n\n const d = getPathFromBytes((thumb as PhotoSize.photoStrippedSize).bytes);\n const ns = 'http://www.w3.org/2000/svg';\n const svg = document.createElementNS(ns, 'svg');\n svg.classList.add('rlottie-vector', 'media-sticker', 'thumbnail');\n svg.setAttributeNS(null, 'viewBox', `0 0 ${doc.w || 512} ${doc.h || 512}`);\n\n // const defs = document.createElementNS(ns, 'defs');\n // const linearGradient = document.createElementNS(ns, 'linearGradient');\n // linearGradient.setAttributeNS(null, 'id', 'g');\n // linearGradient.setAttributeNS(null, 'x1', '-300%');\n // linearGradient.setAttributeNS(null, 'x2', '-200%');\n // linearGradient.setAttributeNS(null, 'y1', '0');\n // linearGradient.setAttributeNS(null, 'y2', '0');\n // const stops = [\n // ['-10%', '.1'],\n // ['30%', '.07'],\n // ['70%', '.07'],\n // ['110%', '.1']\n // ].map(([offset, stopOpacity]) => {\n // const stop = document.createElementNS(ns, 'stop');\n // stop.setAttributeNS(null, 'offset', offset);\n // stop.setAttributeNS(null, 'stop-opacity', stopOpacity);\n // return stop;\n // });\n // const animates = [\n // ['-300%', '1200%'],\n // ['-200%', '1300%']\n // ].map(([from, to], idx) => {\n // const animate = document.createElementNS(ns, 'animate');\n // animate.setAttributeNS(null, 'attributeName', 'x' + (idx + 1));\n // animate.setAttributeNS(null, 'from', from);\n // animate.setAttributeNS(null, 'to', to);\n // animate.setAttributeNS(null, 'dur', '3s');\n // animate.setAttributeNS(null, 'repeatCount', 'indefinite');\n // return animate;\n // });\n // linearGradient.append(...stops, ...animates);\n // defs.append(linearGradient);\n // svg.append(defs);\n\n const path = document.createElementNS(ns, 'path');\n path.setAttributeNS(null, 'd', d);\n if(rootScope.settings.animationsEnabled && !isCustomEmoji) path.setAttributeNS(null, 'fill', 'url(#g)');\n svg.append(path);\n div.forEach((div, idx) => div.append(idx > 0 ? svg.cloneNode(true) : svg));\n haveThumbCached = true;\n loadThumbPromise.resolve();\n } else if(toneIndex <= 0) {\n const r = () => {\n (div as HTMLElement[]).forEach((div) => {\n const thumbImage = new Image();\n const url = getPreviewURLFromThumb(doc, thumb as PhotoSize.photoStrippedSize, true);\n renderImageFromUrl(thumbImage, url, () => afterRender(div, thumbImage));\n });\n };\n\n if((IS_WEBP_SUPPORTED || doc.pFlags.stickerThumbConverted || cacheContext.url)/* && false */) {\n haveThumbCached = true;\n r();\n } else {\n haveThumbCached = true;\n webpWorkerController.convert('main-' + doc.id, thumb.bytes).then((bytes) => {\n managers.appDocsManager.saveWebPConvertedStrippedThumb(doc.id, bytes);\n (thumb as PhotoSize.photoStrippedSize).bytes = bytes;\n doc.pFlags.stickerThumbConverted = true;\n\n if((middleware && !middleware()) || (div as HTMLElement[])[0].childElementCount) {\n loadThumbPromise.resolve();\n return;\n }\n\n r();\n }).catch(() => loadThumbPromise.resolve());\n }\n }\n } else if(((stickerType === 2 && toneIndex <= 0) || stickerType === 3) && (withThumb || onlyThumb)) {\n const load = async() => {\n if((div as HTMLElement[])[0].childElementCount || (middleware && !middleware())) {\n loadThumbPromise.resolve();\n return;\n }\n\n const r = (div: HTMLElement, thumbImage: HTMLElement, url: string) => {\n if(div.childElementCount || (middleware && !middleware())) {\n loadThumbPromise.resolve();\n return;\n }\n\n if(!url) afterRender(div, thumbImage);\n else renderImageFromUrl(thumbImage, url, () => afterRender(div, thumbImage));\n };\n\n await getCacheContext();\n (div as HTMLElement[]).forEach((div) => {\n if(cacheContext.url) {\n r(div, new Image(), cacheContext.url);\n } else if('bytes' in thumb) {\n const res = getImageFromStrippedThumb(doc, thumb as PhotoSize.photoStrippedSize, true);\n res.loadPromise.then(() => r(div, res.image, ''));\n\n // return managers.appDocsManager.getThumbURL(doc, thumb as PhotoSize.photoStrippedSize).promise.then(r);\n } else {\n appDownloadManager.downloadMediaURL({\n media: doc,\n thumb: thumb as PhotoSize\n }).then(async(url) => {\n return r(div, new Image(), url);\n });\n }\n });\n };\n\n if(lazyLoadQueue && onlyThumb) {\n lazyLoadQueue.push({div: div[0], load});\n loadThumbPromise.resolve();\n return ret;\n } else {\n load();\n\n if((thumb as any).url) {\n haveThumbCached = true;\n }\n }\n }\n }\n\n if(loadPromises && haveThumbCached) {\n loadPromises.push(loadThumbPromise);\n }\n\n if(onlyThumb/* || true */) { // for sticker panel\n return ret;\n }\n\n const middlewareError = makeError('MIDDLEWARE');\n const load = async() => {\n if(middleware && !middleware()) {\n throw middlewareError;\n }\n\n if(stickerType === 2 && !asStatic) {\n const blob = await appDownloadManager.downloadMedia({media: doc, queueId: lazyLoadQueue?.queueId, thumb: fullThumb});\n if(middleware && !middleware()) {\n throw middlewareError;\n }\n\n const animation = await lottieLoader.loadAnimationWorker({\n container: (div as HTMLElement[])[0],\n loop: !!(!emoji || isCustomEmoji) && loop,\n autoplay: play,\n animationData: blob,\n width,\n height,\n name: 'doc' + doc.id,\n needUpscale,\n skipRatio,\n toneIndex,\n sync: isCustomEmoji,\n middleware: loadStickerMiddleware ?? middleware,\n group\n });\n\n // const deferred = deferredPromise();\n\n const setLockColor = willHaveLock ? () => {\n const lockUrl = locksUrls[doc.id] ??= computeLockColor(animation.canvas[0]);\n (div as HTMLElement[]).forEach((div) => div.style.setProperty('--lock-url', `url(${lockUrl})`));\n } : undefined;\n\n const onFirstFrame = (container: HTMLElement, canvas: HTMLCanvasElement) => {\n const element = container.firstElementChild !== canvas && container.firstElementChild as HTMLElement;\n if(needFadeIn !== false) {\n needFadeIn = (needFadeIn || !element || element.tagName === 'svg') && rootScope.settings.animationsEnabled;\n }\n\n const cb = () => {\n if(element && element !== canvas && element.tagName !== 'DIV') {\n element.remove();\n }\n };\n\n if(!needFadeIn) {\n if(element) {\n sequentialDom.mutate(cb);\n }\n } else {\n sequentialDom.mutate(() => {\n canvas && canvas.classList.add('fade-in');\n if(element) {\n element.classList.add('fade-out');\n }\n\n onAnimationEnd(canvas || element, () => {\n sequentialDom.mutate(() => {\n canvas && canvas.classList.remove('fade-in');\n cb();\n });\n }, 400);\n });\n }\n };\n\n animation.addEventListener('firstFrame', () => {\n const canvas = animation.canvas[0];\n if(withThumb !== false || isCustomEmoji) {\n saveLottiePreview(doc, canvas, toneIndex);\n }\n\n if(willHaveLock) {\n setLockColor();\n }\n\n if(!isCustomEmoji) {\n (div as HTMLElement[]).forEach((container, idx) => {\n onFirstFrame(container, animation.canvas[idx]);\n });\n }\n }, {once: true});\n\n if(emoji) {\n managers.appStickersManager.preloadAnimatedEmojiStickerAnimation(emoji);\n }\n\n return animation;\n\n // return deferred;\n // await new Promise((resolve) => setTimeout(resolve, 5e3));\n } else if(asStatic || stickerType === 3) {\n const isSingleVideo = isAnimated && syncedVideo;\n const cacheName = isSingleVideo ? framesCache.generateName('' + doc.id, 0, 0, undefined, undefined) : undefined;\n\n const cachePromise = videosCache[cacheName];\n if(cachePromise) {\n return cachePromise as typeof promise;\n }\n\n const d = isSingleVideo ? (div as HTMLElement[]).slice(0, 1) : div as HTMLElement[];\n const media: HTMLElement[] = d.map(() => {\n let media: HTMLElement;\n if(asStatic) {\n media = new Image();\n } else {\n const video = media = createVideo();\n video.muted = true;\n if(play) video.autoplay = true;\n if(loop) video.loop = true;\n\n if(loop && typeof(loop) === 'number') {\n let previousTime = 0, playedTimes = 0;\n function onTimeupdate(this: HTMLVideoElement) {\n if(previousTime > this.currentTime && ++playedTimes === loop as number) {\n this.autoplay = false;\n this.loop = false;\n this.pause();\n video.removeEventListener('timeupdate', onTimeupdate);\n }\n\n previousTime = this.currentTime;\n }\n\n video.addEventListener('timeupdate', onTimeupdate);\n }\n }\n\n media.classList.add('media-sticker');\n return media;\n });\n\n const thumbImage = (div as HTMLElement[]).map((div, idx) => (div.firstElementChild as HTMLElement) !== media[idx] && div.firstElementChild) as HTMLElement[];\n if(needFadeIn !== false) {\n needFadeIn = (needFadeIn || !downloaded || (asStatic ? thumbImage[0] : (!thumbImage[0] || thumbImage[0].tagName === 'svg'))) && rootScope.settings.animationsEnabled;\n }\n\n if(needFadeIn) {\n media.forEach((media) => media.classList.add('fade-in'));\n }\n\n const promise = new Promise(async(resolve, reject) => {\n const r = async() => {\n if(middleware && !middleware()) {\n reject(middlewareError);\n return;\n }\n\n const mediaLength = media.length;\n const loaded: HTMLElement[] = [];\n const onLoad = (div: HTMLElement, media: HTMLElement, thumbImage: HTMLElement) => {\n sequentialDom.mutateElement(div, () => {\n if(middleware && !middleware()) {\n reject(middlewareError);\n return;\n }\n\n if(!media) {\n if(!isSingleVideo || !isAnimated) {\n thumbImage?.remove();\n }\n\n return;\n }\n\n if(media as HTMLVideoElement) {\n const w = width * window.devicePixelRatio;\n const h = height * window.devicePixelRatio;\n if(!isSavingLottiePreview(doc, toneIndex, w, h)) {\n // const perf = performance.now();\n const canvas = document.createElement('canvas');\n canvas.width = w;\n canvas.height = h;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(media as HTMLVideoElement, 0, 0, canvas.width, canvas.height);\n saveLottiePreview(doc, canvas, toneIndex);\n // console.log('perf', performance.now() - perf);\n }\n }\n\n if(isSingleVideo) {\n resolve(media as any);\n return;\n }\n\n div.append(media);\n\n if(needFadeIn) {\n thumbImage && thumbImage.classList.add('fade-out');\n onAnimationEnd(media, () => {\n media.classList.remove('fade-in');\n thumbImage?.remove();\n }, 400);\n } else {\n thumbImage?.remove();\n }\n\n if(isAnimated) {\n animationIntersector.addAnimation(media as HTMLVideoElement, group, undefined, middleware);\n }\n\n if(loaded.push(media) === mediaLength) {\n resolve(loaded as any);\n }\n });\n };\n\n await getCacheContext();\n let lastPromise: Promise;\n (div as HTMLElement[]).forEach((div, idx) => {\n const _media = media[idx];\n const cb = () => onLoad(div, _media, thumbImage[idx]);\n if(_media) lastPromise = renderImageFromUrlPromise(_media, cacheContext.url);\n lastPromise.then(cb);\n });\n };\n\n await getCacheContext();\n if(cacheContext.url) r();\n else {\n let promise: Promise;\n if(stickerType !== 1 && asStatic) {\n const thumb = choosePhotoSize(doc, width, height, false) as PhotoSize.photoSize;\n // promise = managers.appDocsManager.getThumbURL(doc, thumb).promise\n promise = appDownloadManager.downloadMediaURL({media: doc, thumb, queueId: lazyLoadQueue?.queueId});\n } else {\n promise = appDownloadManager.downloadMediaURL({media: doc, queueId: lazyLoadQueue?.queueId});\n }\n\n promise.then(r, reject);\n }\n });\n\n if(cacheName) {\n videosCache[cacheName] = promise as any;\n loadStickerMiddleware && promise.finally(() => {\n if(!loadStickerMiddleware()) {\n delete videosCache[cacheName];\n }\n });\n }\n\n return promise;\n }\n };\n\n if(exportLoad && ((exportLoad === 1 && (!downloaded || isAnimated)) || exportLoad === 2)) {\n ret.load = load;\n return ret;\n }\n\n const loadPromise: Promise> | void> = lazyLoadQueue && (!downloaded || isAnimated) ?\n (lazyLoadQueue.push({div: div[0], load}), Promise.resolve()) :\n load();\n\n if(downloaded && (asStatic/* || stickerType === 3 */)) {\n loadThumbPromise = loadPromise as any;\n if(loadPromises) {\n loadPromises.push(loadThumbPromise);\n }\n }\n\n if(stickerType === 2 && effectThumb && isOut !== undefined && !noPremium) {\n attachStickerEffectHandler({\n container: div[0],\n doc,\n managers,\n middleware,\n isOut,\n width,\n loadPromise,\n relativeEffect,\n loopEffect\n });\n }\n\n ret.render = loadPromise as any;\n return ret;\n}\n\nfunction attachStickerEffectHandler({container, doc, managers, middleware, isOut, width, loadPromise, relativeEffect, loopEffect}: {\n container: HTMLElement,\n doc: MyDocument,\n managers: AppManagers,\n middleware: Middleware,\n isOut: boolean,\n width: number,\n loadPromise: Promise,\n relativeEffect?: boolean,\n loopEffect?: boolean\n}) {\n managers.appStickersManager.preloadSticker(doc.id, true);\n\n let playing = false;\n attachClickEvent(container, async(e) => {\n cancelEvent(e);\n if(playing) {\n const a = document.createElement('a');\n a.onclick = () => {\n hideToast();\n new PopupStickers(doc.stickerSetInput).show();\n };\n\n toastNew({\n langPackKey: 'Sticker.Premium.Click.Info',\n langPackArguments: [a]\n });\n\n return;\n }\n\n playing = true;\n\n await loadPromise;\n const {animationDiv, stickerPromise} = wrapStickerAnimation({\n doc,\n middleware,\n side: isOut ? 'right' : 'left',\n size: width * STICKER_EFFECT_MULTIPLIER,\n target: container,\n play: true,\n fullThumb: getStickerEffectThumb(doc),\n relativeEffect,\n loopEffect\n });\n\n if(isOut !== undefined && !isOut/* && !relativeEffect */) {\n animationDiv.classList.add('reflect-x');\n }\n\n stickerPromise.then((player) => {\n player.addEventListener('destroy', () => {\n playing = false;\n });\n });\n });\n}\n\nexport async function onEmojiStickerClick({event, container, managers, peerId, middleware}: {\n event: Event,\n container: HTMLElement,\n managers: AppManagers,\n peerId: PeerId,\n middleware: Middleware\n}) {\n cancelEvent(event);\n\n const bubble = findUpClassName(container, 'bubble');\n const emoji = container.dataset.stickerEmoji;\n\n const animation = !container.classList.contains('custom-emoji') ? lottieLoader.getAnimation(container) : undefined;\n if(animation?.paused) {\n const doc = await managers.appStickersManager.getAnimatedEmojiSoundDocument(emoji);\n if(doc) {\n const audio = document.createElement('audio');\n audio.style.display = 'none';\n container.parentElement.append(audio);\n\n try {\n const url = await appDownloadManager.downloadMediaURL({media: doc});\n\n audio.src = url;\n audio.play();\n await onMediaLoad(audio, undefined, true);\n\n audio.addEventListener('ended', () => {\n audio.src = '';\n audio.remove();\n }, {once: true});\n } catch(err) {\n\n }\n }\n\n animation.autoplay = true;\n animation.restart();\n }\n\n if(!peerId.isUser()) {\n return;\n }\n\n const doc = await managers.appStickersManager.getAnimatedEmojiSticker(emoji, true);\n if(!doc) {\n return;\n }\n\n const data: SendMessageEmojiInteractionData = (container as any).emojiData ??= {\n a: [],\n v: 1\n };\n\n const sendInteractionThrottled: () => void = (container as any).sendInteractionThrottled = throttle(() => {\n const length = data.a.length;\n if(!length) {\n return;\n }\n\n const firstTime = data.a[0].t;\n\n data.a.forEach((a) => {\n a.t = (a.t - firstTime) / 1000;\n });\n\n const bubble = findUpClassName(container, 'bubble');\n managers.appMessagesManager.setTyping(appImManager.chat.peerId, {\n _: 'sendMessageEmojiInteraction',\n msg_id: getServerMessageId(+bubble.dataset.mid),\n emoticon: emoji,\n interaction: {\n _: 'dataJSON',\n data: JSON.stringify(data)\n }\n }, true, appImManager.chat.threadId);\n\n data.a.length = 0;\n }, 1000, false);\n\n const isOut = bubble ? bubble.classList.contains('is-out') : undefined;\n const {animationDiv} = wrapStickerAnimation({\n doc,\n middleware,\n side: isOut ? 'right' : 'left',\n size: 360,\n target: container,\n play: true,\n withRandomOffset: true\n });\n\n if(isOut !== undefined && !isOut) {\n animationDiv.classList.add('reflect-x');\n }\n\n // using a trick here: simulated event from interlocutor's interaction won't fire ours\n if(event.isTrusted) {\n data.a.push({\n i: 1,\n t: Date.now()\n });\n\n sendInteractionThrottled();\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/**\n * https://core.telegram.org/api/files#vector-thumbnails\n */\nexport default function getPathFromBytes(bytes: Uint8Array) {\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","// https://github.com/telegramdesktop/tdesktop/blob/543bfab24a76402992421063f1e6444f347d31fe/Telegram/SourceFiles/boxes/sticker_set_box.cpp#L75\nexport default function computeLockColor(canvas: HTMLCanvasElement) {\n const context = canvas.getContext('2d');\n const size = 20 * (canvas.dpr ?? 1);\n const width = size;\n const height = size;\n const skipx = (canvas.width - width) / 2;\n const margin = 0/* * (canvas.dpr ?? 1) */;\n const skipy = canvas.height - height - margin;\n const imageData = context.getImageData(skipx, skipy, width, height).data;\n let sr = 0, sg = 0, sb = 0, sa = 0;\n for(let i = 0; i < imageData.length; i += 4) {\n sr += imageData[i];\n sg += imageData[i + 1];\n sb += imageData[i + 2];\n sa += imageData[i + 3];\n }\n\n const outCanvas = document.createElement('canvas');\n outCanvas.width = size;\n outCanvas.height = size;\n const outContext = outCanvas.getContext('2d');\n const color = new Uint8ClampedArray([sr * 255 / sa, sg * 255 / sa, sb * 255 / sa, 255]);\n const rgba = `rgba(${color[0]}, ${color[1]}, ${color[2]}, ${color[3]})`;\n outContext.fillStyle = rgba;\n outContext.fillRect(0, 0, outCanvas.width, outCanvas.height);\n outContext.fillStyle = `rgba(112, 117, 121, 0.3)`;\n outContext.fillRect(0, 0, outCanvas.width, outCanvas.height);\n // document.querySelector('.popup-title').append(c);\n return outCanvas.toDataURL('image/jpeg');\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_VIBRATE_SUPPORTED from '../../environment/vibrateSupport';\nimport assumeType from '../../helpers/assumeType';\nimport isInDOM from '../../helpers/dom/isInDOM';\nimport makeError from '../../helpers/makeError';\nimport {getMiddleware, Middleware} from '../../helpers/middleware';\nimport throttleWithRaf from '../../helpers/schedulers/throttleWithRaf';\nimport windowSize from '../../helpers/windowSize';\nimport {PhotoSize, VideoSize} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport wrapSticker from './sticker';\n\nexport default function wrapStickerAnimation({\n size,\n doc,\n middleware,\n target,\n side,\n skipRatio,\n play,\n managers,\n fullThumb,\n withRandomOffset,\n relativeEffect,\n loopEffect\n}: {\n size: number,\n doc: MyDocument,\n middleware?: Middleware,\n target: HTMLElement,\n side: 'left' | 'center' | 'right',\n skipRatio?: number,\n play: boolean,\n managers?: AppManagers,\n fullThumb?: PhotoSize | VideoSize,\n withRandomOffset?: boolean,\n relativeEffect?: boolean,\n loopEffect?: boolean\n}) {\n const animationDiv = document.createElement('div');\n animationDiv.classList.add('emoji-animation');\n\n // const size = 280;\n animationDiv.style.width = size + 'px';\n animationDiv.style.height = size + 'px';\n\n let animation: RLottiePlayer;\n const unmountAnimation = () => {\n middlewareHelper.clean();\n animation?.remove();\n animationDiv.remove();\n appImManager.chat.bubbles.scrollable.container.removeEventListener('scroll', onScroll);\n };\n\n const middlewareHelper = middleware?.create() ?? getMiddleware();\n middleware = middlewareHelper.get();\n\n const stickerPromise = wrapSticker({\n div: animationDiv,\n doc,\n middleware,\n withThumb: false,\n needFadeIn: false,\n loop: !!loopEffect,\n width: size,\n height: size,\n play,\n group: 'none',\n skipRatio,\n managers,\n fullThumb\n }).then(({render}) => render).then((_animation) => {\n assumeType(_animation);\n if(!middleware()) {\n _animation.remove();\n throw makeError('MIDDLEWARE');\n }\n\n animation = _animation;\n animation.addEventListener('enterFrame', (frameNo) => {\n if((!loopEffect && frameNo === animation.maxFrame) || !isInDOM(target)) {\n unmountAnimation();\n }\n });\n\n if(IS_VIBRATE_SUPPORTED) {\n animation.addEventListener('firstFrame', () => {\n navigator.vibrate(100);\n }, {once: true});\n }\n\n return animation;\n });\n\n const generateRandomSigned = (max: number) => {\n const r = Math.random() * max * 2;\n return r > max ? -r % max : r;\n };\n\n const randomOffsetX = withRandomOffset ? generateRandomSigned(16) : 0;\n const randomOffsetY = withRandomOffset ? generateRandomSigned(4) : 0;\n const setPosition = () => {\n if(!isInDOM(target)) {\n unmountAnimation();\n return;\n }\n\n const rect = target.getBoundingClientRect();\n\n const factor = rect.width / 200;\n const stableOffsetX = side === 'center' ? 0 : 16 * (side === 'right' ? 1 : -1) * factor;\n // const stableOffsetY = side === 'center' ? 0 : -50 * factor;\n const stableOffsetY = side === 'center' ? 0 : 0 * factor;\n\n const rectX = side === 'right' ? rect.right : rect.left;\n const rectY = rect.top;\n\n const addOffsetX = (side === 'center' ? (rect.width - size) / 2 : (side === 'right' ? -size : 0)) + stableOffsetX + randomOffsetX;\n const addOffsetY = (side === 'center' || true ? (rect.height - size) / 2 : 0) + stableOffsetY + randomOffsetY;\n const x = rectX + addOffsetX;\n const y = rectY + addOffsetY;\n\n if(y <= -size || y >= windowSize.height) {\n unmountAnimation();\n return;\n }\n\n if(relativeEffect) {\n if(side !== 'center') animationDiv.style[side] = Math.abs(stableOffsetX) * -1 + 'px';\n else animationDiv.style.left = addOffsetX + 'px';\n animationDiv.style.top = addOffsetY + 'px';\n } else {\n animationDiv.style.top = y + 'px';\n animationDiv.style.left = x + 'px';\n }\n };\n\n const onScroll = throttleWithRaf(setPosition);\n appImManager.chat.bubbles.scrollable.container.addEventListener('scroll', onScroll);\n\n setPosition();\n\n if(relativeEffect) {\n animationDiv.classList.add('is-relative');\n target.parentElement.append(animationDiv);\n } else {\n appImManager.emojiAnimationContainer.append(animationDiv);\n }\n\n return {animationDiv, stickerPromise};\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';\nimport wrapSticker from './sticker'\nimport {Modify} from '../../types';\n\nexport default async function wrapStickerEmoji(options: Modify[0], {\n div: HTMLElement,\n doc?: never,\n loop?: never\n}>) {\n const {\n emoji,\n div,\n managers = rootScope.managers\n } = options;\n const doc = await managers.appStickersManager.getAnimatedEmojiSticker(emoji);\n if(!doc) {\n div.classList.add('media-sticker-wrapper');\n throw new Error('no sticker');\n }\n\n return wrapSticker({\n doc,\n play: true,\n loop: false,\n ...options\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 createVideo from '../../helpers/dom/createVideo';\nimport renderImageFromUrl from '../../helpers/dom/renderImageFromUrl';\nimport {Document, StickerSet} from '../../layer';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport lottieLoader from '../../lib/rlottie/lottieLoader';\nimport rootScope from '../../lib/rootScope';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport wrapSticker from './sticker';\nimport {Middleware} from '../../helpers/middleware';\n\nexport default async function wrapStickerSetThumb({set, lazyLoadQueue, container, group, autoplay, width, height, managers = rootScope.managers, middleware}: {\n set: StickerSet.stickerSet,\n lazyLoadQueue: LazyLoadQueue,\n container: HTMLElement,\n group: AnimationItemGroup,\n autoplay: boolean,\n width: number,\n height: number,\n managers?: AppManagers\n middleware?: Middleware\n}) {\n if(set.thumbs?.length) {\n container.classList.add('media-sticker-wrapper');\n lazyLoadQueue.push({\n div: container,\n load: async() => {\n const downloadOptions = await managers.appStickersManager.getStickerSetThumbDownloadOptions(set);\n const promise = appDownloadManager.download(downloadOptions);\n\n if(set.pFlags.animated && !set.pFlags.videos) {\n return promise\n .then((blob) => {\n lottieLoader.loadAnimationWorker({\n container,\n loop: true,\n autoplay,\n animationData: blob,\n width,\n height,\n needUpscale: true,\n name: 'setThumb' + set.id,\n group,\n middleware\n });\n });\n } else {\n let media: HTMLElement;\n if(set.pFlags.videos) {\n media = createVideo();\n (media as HTMLVideoElement).autoplay = true;\n (media as HTMLVideoElement).muted = true;\n (media as HTMLVideoElement).loop = true;\n } else {\n media = new Image();\n }\n\n media.classList.add('media-sticker');\n\n return promise.then((blob) => {\n renderImageFromUrl(media, URL.createObjectURL(blob), () => {\n container.append(media);\n\n if(set.pFlags.videos) {\n animationIntersector.addAnimation(media as HTMLVideoElement, group);\n }\n });\n });\n }\n }\n });\n\n return;\n }\n\n let getDocPromise: Promise;\n\n if(set.thumb_document_id) {\n getDocPromise = managers.appEmojiManager.getCustomEmojiDocument(set.thumb_document_id);\n } else {\n getDocPromise = managers.appStickersManager.getStickerSet(set).then((stickerSet) => stickerSet.documents[0]);\n }\n\n const doc = await getDocPromise;\n if(doc._ !== 'documentEmpty') { // as thumb will be used first sticker\n wrapSticker({\n doc,\n div: container,\n group: group,\n lazyLoadQueue,\n managers,\n width,\n height,\n middleware\n }); // kostil\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 {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport Row from '../row';\nimport wrapSticker from './sticker';\n\nexport default function wrapStickerToRow({doc, row, size, managers}: {\n doc: MyDocument,\n row: Row,\n size?: 'small' | 'large',\n managers?: AppManagers\n}) {\n const previousMedia = row.media;\n const media = row.createMedia('small');\n\n if(previousMedia) {\n media.classList.add('hide');\n }\n\n const loadPromises: Promise[] = previousMedia ? [] : undefined;\n\n const _size = size === 'small' ? 32 : 48;\n const result = wrapSticker({\n div: media,\n doc: doc,\n width: _size,\n height: _size,\n loadPromises,\n managers\n }).then(({render}) => render);\n\n loadPromises && Promise.all(loadPromises).then(() => {\n media.classList.remove('hide');\n previousMedia.remove();\n });\n\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\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\nimport {i18n} from '../../lib/langPack';\nimport wrapTelegramUrlToAnchor from '../../lib/richTextProcessor/wrapTelegramUrlToAnchor';\nimport rootScope from '../../lib/rootScope';\nimport wrapPeerTitle from './peerTitle';\n\nexport default async function wrapTopicNameButton(\n options: {\n lastMsgId?: number\n } & Pick[0], 'peerId' | 'threadId' | 'wrapOptions' | 'withIcons'>\n) {\n const {peerId, threadId, lastMsgId} = options;\n\n const loadPromise: Promise = Promise.resolve();\n const a = wrapTelegramUrlToAnchor('t.me/c/' + peerId.toChatId() + (threadId ? '/' + getServerMessageId(threadId) : '') + (lastMsgId ? '/' + getServerMessageId(lastMsgId) : ''));\n a.classList.add('topic-name', 'topic-name-button');\n // if(threadId) {\n // const topic = await rootScope.managers.dialogsStorage.getForumTopic(peerId, threadId);\n // if(!topic) {\n // a.append(i18n('Loading'));\n // loadPromise = rootScope.managers.dialogsStorage.getForumTopicById(peerId, threadId)\n // }\n // } else {\n a.append(await wrapPeerTitle(options));\n // }\n\n return {\n cached: true,\n element: a,\n loadPromise\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 {animateSingle} from '../../helpers/animation';\nimport {ChatAutoDownloadSettings} from '../../helpers/autoDownload';\nimport deferredPromise from '../../helpers/cancellablePromise';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport createVideo from '../../helpers/dom/createVideo';\nimport isInDOM from '../../helpers/dom/isInDOM';\nimport renderImageFromUrl from '../../helpers/dom/renderImageFromUrl';\nimport getStrippedThumbIfNeeded from '../../helpers/getStrippedThumbIfNeeded';\nimport makeError from '../../helpers/makeError';\nimport mediaSizes, {ScreenSize} from '../../helpers/mediaSizes';\nimport {Middleware} from '../../helpers/middleware';\nimport noop from '../../helpers/noop';\nimport onMediaLoad from '../../helpers/onMediaLoad';\nimport {fastRaf} from '../../helpers/schedulers';\nimport throttle from '../../helpers/schedulers/throttle';\nimport sequentialDom from '../../helpers/sequentialDom';\nimport toHHMMSS from '../../helpers/string/toHHMMSS';\nimport {Message, PhotoSize, VideoSize} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {NULL_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport rootScope from '../../lib/rootScope';\nimport {ThumbCache} from '../../lib/storages/thumbs';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport appMediaPlaybackController, {MediaSearchContext} from '../appMediaPlaybackController';\nimport {findMediaTargets} from '../audio';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport ProgressivePreloader from '../preloader';\nimport wrapPhoto from './photo';\n\nconst MAX_VIDEO_AUTOPLAY_SIZE = 50 * 1024 * 1024; // 50 MB\n\nlet roundVideoCircumference = 0;\nmediaSizes.addEventListener('changeScreen', (from, to) => {\n if(to === ScreenSize.mobile || from === ScreenSize.mobile) {\n const elements = Array.from(document.querySelectorAll('.media-round .progress-ring')) as SVGSVGElement[];\n const width = mediaSizes.active.round.width;\n const halfSize = width / 2;\n const radius = halfSize - 7;\n roundVideoCircumference = 2 * Math.PI * radius;\n elements.forEach((element) => {\n element.setAttributeNS(null, 'width', '' + width);\n element.setAttributeNS(null, 'height', '' + width);\n\n const circle = element.firstElementChild as SVGCircleElement;\n circle.setAttributeNS(null, 'cx', '' + halfSize);\n circle.setAttributeNS(null, 'cy', '' + halfSize);\n circle.setAttributeNS(null, 'r', '' + radius);\n\n circle.style.strokeDasharray = roundVideoCircumference + ' ' + roundVideoCircumference;\n circle.style.strokeDashoffset = '' + roundVideoCircumference;\n });\n }\n});\n\nexport default async function wrapVideo({doc, container, message, boxWidth, boxHeight, withTail, isOut, middleware, lazyLoadQueue, noInfo, group, onlyPreview, noPreview, withoutPreloader, loadPromises, noPlayButton, photoSize, videoSize, searchContext, autoDownload, managers = rootScope.managers, noAutoplayAttribute}: {\n doc: MyDocument,\n container?: HTMLElement,\n message?: Message.message,\n boxWidth?: number,\n boxHeight?: number,\n withTail?: boolean,\n isOut?: boolean,\n middleware?: Middleware,\n lazyLoadQueue?: LazyLoadQueue,\n noInfo?: boolean,\n noPlayButton?: boolean,\n group?: AnimationItemGroup,\n onlyPreview?: boolean,\n noPreview?: boolean,\n withoutPreloader?: boolean,\n loadPromises?: Promise[],\n autoDownload?: ChatAutoDownloadSettings,\n photoSize?: PhotoSize,\n videoSize?: VideoSize,\n searchContext?: MediaSearchContext,\n managers?: AppManagers,\n noAutoplayAttribute?: boolean\n}) {\n const autoDownloadSize = autoDownload?.video;\n let noAutoDownload = autoDownloadSize === 0;\n const isAlbumItem = !(boxWidth && boxHeight);\n const canAutoplay = /* doc.sticker || */(\n (\n doc.type !== 'video' || (\n doc.size <= MAX_VIDEO_AUTOPLAY_SIZE &&\n !isAlbumItem\n )\n ) && (doc.type === 'gif' ? rootScope.settings.autoPlay.gifs : rootScope.settings.autoPlay.videos)\n );\n let spanTime: HTMLElement, spanPlay: HTMLElement;\n\n if(!noInfo) {\n spanTime = document.createElement('span');\n spanTime.classList.add('video-time');\n container.append(spanTime);\n\n let needPlayButton = false;\n if(doc.type !== 'gif') {\n spanTime.innerText = toHHMMSS(doc.duration, false);\n\n if(!noPlayButton && doc.type !== 'round') {\n if(canAutoplay && !noAutoDownload) {\n spanTime.classList.add('tgico', 'can-autoplay');\n } else {\n needPlayButton = true;\n }\n }\n } else {\n spanTime.innerText = 'GIF';\n\n if(!canAutoplay && !noPlayButton) {\n needPlayButton = true;\n noAutoDownload = undefined;\n }\n }\n\n if(needPlayButton) {\n spanPlay = document.createElement('span');\n spanPlay.classList.add('video-play', 'tgico-largeplay', 'btn-circle', 'position-center');\n container.append(spanPlay);\n }\n }\n\n const res: {\n thumb?: typeof photoRes,\n loadPromise: Promise\n } = {} as any;\n\n if(doc.mime_type === 'image/gif') {\n const photoRes = await wrapPhoto({\n photo: doc,\n message,\n container,\n boxWidth,\n boxHeight,\n withTail,\n isOut,\n lazyLoadQueue,\n middleware,\n withoutPreloader,\n loadPromises,\n autoDownloadSize,\n size: photoSize,\n managers\n });\n\n res.thumb = photoRes;\n res.loadPromise = photoRes.loadPromises.full;\n return res;\n }\n\n /* const video = doc.type === 'round' ? appMediaPlaybackController.addMedia(doc, message.mid) as HTMLVideoElement : document.createElement('video');\n if(video.parentElement) {\n video.remove();\n } */\n\n let preloader: ProgressivePreloader; // it must be here, otherwise will get error before initialization in round onPlay\n\n const video = createVideo();\n video.classList.add('media-video');\n video.muted = true;\n if(doc.type === 'round') {\n const divRound = document.createElement('div');\n divRound.classList.add('media-round', 'z-depth-1');\n divRound.dataset.mid = '' + message.mid;\n divRound.dataset.peerId = '' + message.peerId;\n (divRound as any).message = message;\n\n const size = mediaSizes.active.round;\n const halfSize = size.width / 2;\n const strokeWidth = 3.5;\n const radius = halfSize - (strokeWidth * 2);\n divRound.innerHTML = `\n \n `;\n\n const circle = divRound.firstElementChild.firstElementChild as SVGCircleElement;\n if(!roundVideoCircumference) {\n roundVideoCircumference = 2 * Math.PI * radius;\n }\n circle.style.strokeDasharray = roundVideoCircumference + ' ' + roundVideoCircumference;\n circle.style.strokeDashoffset = '' + roundVideoCircumference;\n\n spanTime.classList.add('tgico');\n\n const isUnread = message.pFlags.media_unread;\n if(isUnread) {\n divRound.classList.add('is-unread');\n }\n\n const canvas = document.createElement('canvas');\n canvas.width = canvas.height = doc.w/* * window.devicePixelRatio */;\n\n divRound.prepend(canvas, spanTime);\n divRound.append(video);\n container.append(divRound);\n\n const ctx = canvas.getContext('2d');\n /* ctx.beginPath();\n ctx.arc(canvas.width / 2, canvas.height / 2, canvas.width / 2, 0, Math.PI * 2);\n ctx.clip(); */\n\n const onLoad = () => {\n const message: Message.message = (divRound as any).message;\n const globalVideo = appMediaPlaybackController.addMedia(message, !noAutoDownload) as HTMLVideoElement;\n const clear = () => {\n (appImManager.chat.setPeerPromise || Promise.resolve()).finally(() => {\n if(isInDOM(globalVideo)) {\n return;\n }\n\n globalVideo.removeEventListener('play', onPlay);\n globalVideo.removeEventListener('timeupdate', throttledTimeUpdate);\n globalVideo.removeEventListener('pause', onPaused);\n globalVideo.removeEventListener('ended', onEnded);\n });\n };\n\n const onFrame = () => {\n ctx.drawImage(globalVideo, 0, 0);\n\n const offset = roundVideoCircumference - globalVideo.currentTime / globalVideo.duration * roundVideoCircumference;\n circle.style.strokeDashoffset = '' + offset;\n\n return !globalVideo.paused;\n };\n\n const onTimeUpdate = () => {\n if(!globalVideo.duration) {\n return;\n }\n\n if(!isInDOM(globalVideo)) {\n clear();\n return;\n }\n\n if(globalVideo.paused) {\n onFrame();\n }\n\n spanTime.innerText = toHHMMSS(globalVideo.duration - globalVideo.currentTime, false);\n };\n\n const throttledTimeUpdate = throttle(() => {\n fastRaf(onTimeUpdate);\n }, 1000, false);\n\n const onPlay = () => {\n video.classList.add('hide');\n divRound.classList.remove('is-paused');\n animateSingle(onFrame, canvas);\n\n if(preloader && preloader.preloader && preloader.preloader.classList.contains('manual')) {\n preloader.onClick();\n }\n };\n\n const onPaused = () => {\n if(!isInDOM(globalVideo)) {\n clear();\n return;\n }\n\n divRound.classList.add('is-paused');\n };\n\n const onEnded = () => {\n video.classList.remove('hide');\n divRound.classList.add('is-paused');\n\n video.currentTime = 0;\n spanTime.innerText = toHHMMSS(globalVideo.duration, false);\n\n if(globalVideo.currentTime) {\n globalVideo.currentTime = 0;\n }\n };\n\n globalVideo.addEventListener('play', onPlay);\n globalVideo.addEventListener('timeupdate', throttledTimeUpdate);\n globalVideo.addEventListener('pause', onPaused);\n globalVideo.addEventListener('ended', onEnded);\n\n attachClickEvent(canvas, (e) => {\n cancelEvent(e);\n\n // ! ะบะพัั‚ั‹ะปัŒ\n if(preloader && !preloader.detached) {\n preloader.onClick();\n }\n\n // ! can't use it here. on Safari iOS video won't start.\n /* if(globalVideo.readyState < 2) {\n return;\n } */\n\n if(globalVideo.paused) {\n const hadSearchContext = !!searchContext;\n if(appMediaPlaybackController.setSearchContext(searchContext || {\n peerId: NULL_PEER_ID,\n inputFilter: {_: 'inputMessagesFilterEmpty'},\n useSearch: false\n })) {\n const [prev, next] = !hadSearchContext ? [] : findMediaTargets(divRound, message.mid/* , searchContext.useSearch */);\n appMediaPlaybackController.setTargets({peerId: message.peerId, mid: message.mid}, prev, next);\n }\n\n globalVideo.play();\n } else {\n globalVideo.pause();\n }\n });\n\n if(globalVideo.paused) {\n if(globalVideo.duration && globalVideo.currentTime !== globalVideo.duration && globalVideo.currentTime > 0) {\n onFrame();\n onTimeUpdate();\n video.classList.add('hide');\n } else {\n onPaused();\n }\n } else {\n onPlay();\n }\n };\n\n if(message.pFlags.is_outgoing) {\n (divRound as any).onLoad = onLoad;\n divRound.dataset.isOutgoing = '1';\n } else {\n onLoad();\n }\n } else if(!noAutoplayAttribute) {\n video.autoplay = true; // ะดะปั safari\n }\n\n let photoRes: Awaited>;\n if(message) {\n photoRes = await wrapPhoto({\n photo: doc,\n message,\n container,\n boxWidth,\n boxHeight,\n withTail,\n isOut,\n lazyLoadQueue,\n middleware,\n withoutPreloader: true,\n loadPromises,\n autoDownloadSize: autoDownload?.photo,\n size: photoSize,\n managers\n });\n\n res.thumb = photoRes;\n\n if((!canAutoplay && doc.type !== 'gif') || onlyPreview) {\n res.loadPromise = photoRes.loadPromises.full;\n return res;\n }\n\n if(withTail) {\n const foreignObject = (photoRes.images.thumb || photoRes.images.full).parentElement;\n video.width = +foreignObject.getAttributeNS(null, 'width');\n video.height = +foreignObject.getAttributeNS(null, 'height');\n foreignObject.append(video);\n }\n } else if(!noPreview) { // * gifs masonry\n const gotThumb = getStrippedThumbIfNeeded(doc, {} as ThumbCache, true);\n if(gotThumb) {\n const thumbImage = gotThumb.image;\n thumbImage.classList.add('media-poster');\n container.append(thumbImage);\n res.thumb = {\n loadPromises: {\n thumb: gotThumb.loadPromise,\n full: Promise.resolve()\n },\n images: {\n thumb: thumbImage,\n full: null\n },\n preloader: null,\n aspecter: null\n };\n\n loadPromises?.push(gotThumb.loadPromise);\n res.loadPromise = gotThumb.loadPromise;\n }\n }\n\n if(onlyPreview) {\n return res;\n }\n\n if(!video.parentElement && container) {\n (photoRes?.aspecter || container).append(video);\n }\n\n let cacheContext: ThumbCache;\n const getCacheContext = async() => {\n return cacheContext = await managers.thumbsStorage.getCacheContext(doc, videoSize?.type);\n };\n\n await getCacheContext();\n\n const uploadFileName = message?.uploadingFileName;\n if(uploadFileName) { // means upload\n preloader = new ProgressivePreloader({\n attachMethod: 'prepend',\n isUpload: true\n });\n preloader.attachPromise(appDownloadManager.getUpload(uploadFileName));\n preloader.attach(container, false);\n noAutoDownload = undefined;\n } else if(!cacheContext.downloaded && !doc.supportsStreaming && !withoutPreloader) {\n preloader = new ProgressivePreloader({\n attachMethod: 'prepend'\n });\n } else if(doc.supportsStreaming) {\n preloader = new ProgressivePreloader({\n cancelable: false,\n attachMethod: 'prepend'\n });\n }\n\n const renderDeferred = deferredPromise();\n video.addEventListener('error', (e) => {\n if(video.error.code !== 4) {\n console.error('Error ' + video.error.code + '; details: ' + video.error.message);\n }\n\n if(preloader && !uploadFileName) {\n preloader.detach();\n }\n\n if(!renderDeferred.isFulfilled) {\n renderDeferred.resolve();\n }\n }, {once: true});\n\n if(doc.type === 'video') {\n const onTimeUpdate = () => {\n if(!video.duration) {\n return;\n }\n\n spanTime.innerText = toHHMMSS(video.duration - video.currentTime, false);\n };\n\n const throttledTimeUpdate = throttle(() => {\n fastRaf(onTimeUpdate);\n }, 1e3, false);\n\n video.addEventListener('timeupdate', throttledTimeUpdate);\n\n if(spanPlay) {\n video.addEventListener('timeupdate', () => {\n sequentialDom.mutateElement(spanPlay, () => {\n spanPlay.remove();\n });\n }, {once: true});\n }\n }\n\n video.muted = true;\n video.loop = true;\n // video.play();\n if(!noAutoplayAttribute) {\n video.autoplay = true;\n }\n\n let loadPhotoThumbFunc = noAutoDownload && photoRes?.preloader?.loadFunc;\n const load = async() => {\n if(preloader && noAutoDownload && !withoutPreloader) {\n preloader.construct();\n preloader.setManual();\n }\n\n await getCacheContext();\n let loadPromise: Promise = Promise.resolve();\n if((preloader && !uploadFileName) || withoutPreloader) {\n if(!cacheContext.downloaded && !doc.supportsStreaming) {\n const promise = loadPromise = appDownloadManager.downloadMediaURL({\n media: doc,\n queueId: lazyLoadQueue?.queueId,\n onlyCache: noAutoDownload,\n thumb: videoSize\n });\n\n if(preloader) {\n preloader.attach(container, false, promise);\n }\n } else if(doc.supportsStreaming) {\n if(noAutoDownload) {\n loadPromise = Promise.reject(makeError('NO_AUTO_DOWNLOAD'));\n } else if(!cacheContext.downloaded && preloader) { // * check for uploading video\n preloader.attach(container, false, null);\n video.addEventListener(IS_SAFARI ? 'timeupdate' : 'canplay', () => {\n preloader.detach();\n }, {once: true});\n }\n }\n }\n\n if(!noAutoDownload && loadPhotoThumbFunc) {\n loadPhotoThumbFunc();\n loadPhotoThumbFunc = null;\n }\n\n noAutoDownload = undefined;\n\n loadPromise.then(async() => {\n if(middleware && !middleware()) {\n renderDeferred.resolve();\n return;\n }\n\n if(doc.type === 'round') {\n appMediaPlaybackController.resolveWaitingForLoadMedia(message.peerId, message.mid, message.pFlags.is_scheduled);\n }\n\n await getCacheContext();\n\n onMediaLoad(video).then(() => {\n if(group) {\n animationIntersector.addAnimation(video, group);\n }\n\n if(preloader && !uploadFileName) {\n preloader.detach();\n }\n\n renderDeferred.resolve();\n }, (err) => {\n console.error('video load error', err);\n if(spanTime) {\n spanTime.classList.add('is-error');\n }\n renderDeferred.reject(err);\n });\n\n renderImageFromUrl(video, cacheContext.url);\n }, noop);\n\n return {download: loadPromise, render: Promise.all([loadPromise, renderDeferred])};\n };\n\n if(preloader && !uploadFileName) {\n preloader.setDownloadFunction(load);\n }\n\n /* if(doc.size >= 20e6 && !doc.downloaded) {\n let downloadDiv = document.createElement('div');\n downloadDiv.classList.add('download');\n\n let span = document.createElement('span');\n span.classList.add('btn-circle', 'tgico-download');\n downloadDiv.append(span);\n\n downloadDiv.addEventListener('click', () => {\n downloadDiv.remove();\n loadVideo();\n });\n\n container.prepend(downloadDiv);\n\n return;\n } */\n\n if(doc.type === 'gif' && !canAutoplay) {\n attachClickEvent(container, (e) => {\n cancelEvent(e);\n spanPlay.remove();\n load();\n }, {capture: true, once: true});\n } else {\n res.loadPromise = !lazyLoadQueue ?\n (await load()).render :\n (lazyLoadQueue.push({div: container, load: () => load().then(({render}) => render)}), Promise.resolve());\n }\n\n if(res.thumb) {\n await res.thumb.loadPromises.thumb;\n }\n\n return res;\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 limitSymbols from '../../helpers/string/limitSymbols';\nimport {WebPage} from '../../layer';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\n\nexport default function wrapWebPageDescription(webPage: WebPage.webPage) {\n const shortDescriptionText = limitSymbols(webPage.description || '', 150, 180);\n // const siteName = webPage.site_name;\n // let contextHashtag = '';\n // if(siteName === 'GitHub') {\n // const matches = apiWebPage.url.match(/(https?:\\/\\/github\\.com\\/[^\\/]+\\/[^\\/]+)/);\n // if(matches) {\n // contextHashtag = matches[0] + '/issues/{1}';\n // }\n // }\n return wrapRichText(shortDescriptionText/* , {\n contextSite: siteName || 'external',\n contextHashtag: contextHashtag\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 limitSymbols from '../../helpers/string/limitSymbols';\nimport {WebPage} from '../../layer';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\n\nexport default function wrapWebPageTitle(webPage: WebPage.webPage) {\n let shortTitle = webPage.title || webPage.author || webPage.site_name || '';\n shortTitle = limitSymbols(shortTitle, 80, 100);\n return wrapRichText(shortTitle, {noLinks: true, noLinebreaks: true});\n}\n","// Taken from https://core.telegram.org/bots/payments/currencies.json\nexport type Currency = {\n code: string,\n title: string,\n symbol: string,\n native: string,\n thousands_sep: string,\n decimal_sep: string,\n symbol_left: boolean,\n space_between: boolean,\n exp: number,\n min_amount: string | number,\n max_amount: string | number\n};\n\n// eslint-disable-next-line quotes, comma-spacing\nconst Currencies: {[currency: string]: Currency} = {\"AED\":{\"code\":\"AED\",\"title\":\"United Arab Emirates Dirham\",\"symbol\":\"AED\",\"native\":\"ุฏ.ุฅ.โ€\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"367\",\"max_amount\":\"3673030\"},\"AFN\":{\"code\":\"AFN\",\"title\":\"Afghan Afghani\",\"symbol\":\"AFN\",\"native\":\"ุ‹\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"8729\",\"max_amount\":\"87299487\"},\"ALL\":{\"code\":\"ALL\",\"title\":\"Albanian Lek\",\"symbol\":\"ALL\",\"native\":\"Lek\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":false,\"exp\":2,\"min_amount\":\"11842\",\"max_amount\":\"118421187\"},\"AMD\":{\"code\":\"AMD\",\"title\":\"Armenian Dram\",\"symbol\":\"AMD\",\"native\":\"ีคึ€.\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"40943\",\"max_amount\":\"409436718\"},\"ARS\":{\"code\":\"ARS\",\"title\":\"Argentine Peso\",\"symbol\":\"ARS\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"14705\",\"max_amount\":\"147059002\"},\"AUD\":{\"code\":\"AUD\",\"title\":\"Australian Dollar\",\"symbol\":\"AU$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"153\",\"max_amount\":\"1536825\"},\"AZN\":{\"code\":\"AZN\",\"title\":\"Azerbaijani Manat\",\"symbol\":\"AZN\",\"native\":\"ะผะฐะฝ.\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"169\",\"max_amount\":\"1699858\"},\"BAM\":{\"code\":\"BAM\",\"title\":\"Bosnia & Herzegovina Convertible Mark\",\"symbol\":\"BAM\",\"native\":\"KM\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"199\",\"max_amount\":\"1990677\"},\"BDT\":{\"code\":\"BDT\",\"title\":\"Bangladeshi Taka\",\"symbol\":\"BDT\",\"native\":\"เงณ\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"10009\",\"max_amount\":\"100094046\"},\"BGN\":{\"code\":\"BGN\",\"title\":\"Bulgarian Lev\",\"symbol\":\"BGN\",\"native\":\"ะปะฒ.\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"199\",\"max_amount\":\"1993315\"},\"BND\":{\"code\":\"BND\",\"title\":\"Brunei Dollar\",\"symbol\":\"BND\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"142\",\"max_amount\":\"1421883\"},\"BOB\":{\"code\":\"BOB\",\"title\":\"Bolivian Boliviano\",\"symbol\":\"BOB\",\"native\":\"Bs\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"683\",\"max_amount\":\"6832607\"},\"BRL\":{\"code\":\"BRL\",\"title\":\"Brazilian Real\",\"symbol\":\"R$\",\"native\":\"R$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"539\",\"max_amount\":\"5397799\"},\"BYN\":{\"code\":\"BYN\",\"title\":\"Belarusian ruble\",\"symbol\":\"BYN\",\"native\":\"BYN\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"249\",\"max_amount\":\"2495801\"},\"CAD\":{\"code\":\"CAD\",\"title\":\"Canadian Dollar\",\"symbol\":\"CA$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"136\",\"max_amount\":\"1366860\"},\"CHF\":{\"code\":\"CHF\",\"title\":\"Swiss Franc\",\"symbol\":\"CHF\",\"native\":\"CHF\",\"thousands_sep\":\"'\",\"decimal_sep\":\".\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"97\",\"max_amount\":\"976705\"},\"CLP\":{\"code\":\"CLP\",\"title\":\"Chilean Peso\",\"symbol\":\"CLP\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":0,\"min_amount\":\"963\",\"max_amount\":\"9637495\"},\"CNY\":{\"code\":\"CNY\",\"title\":\"Chinese Renminbi Yuan\",\"symbol\":\"CNยฅ\",\"native\":\"CNยฅ\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"709\",\"max_amount\":\"7094102\"},\"COP\":{\"code\":\"COP\",\"title\":\"Colombian Peso\",\"symbol\":\"COP\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"452870\",\"max_amount\":\"4528700000\"},\"CRC\":{\"code\":\"CRC\",\"title\":\"Costa Rican Colรณn\",\"symbol\":\"CRC\",\"native\":\"โ‚ก\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"62506\",\"max_amount\":\"625061070\"},\"CZK\":{\"code\":\"CZK\",\"title\":\"Czech Koruna\",\"symbol\":\"CZK\",\"native\":\"Kฤ\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"2497\",\"max_amount\":\"24975029\"},\"DKK\":{\"code\":\"DKK\",\"title\":\"Danish Krone\",\"symbol\":\"DKK\",\"native\":\"kr\",\"thousands_sep\":\"\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"755\",\"max_amount\":\"7555990\"},\"DOP\":{\"code\":\"DOP\",\"title\":\"Dominican Peso\",\"symbol\":\"DOP\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"5275\",\"max_amount\":\"52757308\"},\"DZD\":{\"code\":\"DZD\",\"title\":\"Algerian Dinar\",\"symbol\":\"DZD\",\"native\":\"ุฏ.ุฌ.โ€\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"14035\",\"max_amount\":\"140353307\"},\"EGP\":{\"code\":\"EGP\",\"title\":\"Egyptian Pound\",\"symbol\":\"EGP\",\"native\":\"ุฌ.ู….โ€\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"1953\",\"max_amount\":\"19537405\"},\"ETB\":{\"code\":\"ETB\",\"title\":\"Ethiopian Birr\",\"symbol\":\"ETB\",\"native\":\"แ‰ฅแˆญ\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"5224\",\"max_amount\":\"52247069\"},\"EUR\":{\"code\":\"EUR\",\"title\":\"Euro\",\"symbol\":\"โ‚ฌ\",\"native\":\"โ‚ฌ\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"101\",\"max_amount\":\"1016045\"},\"GBP\":{\"code\":\"GBP\",\"title\":\"British Pound\",\"symbol\":\"ยฃ\",\"native\":\"ยฃ\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"89\",\"max_amount\":\"894445\"},\"GEL\":{\"code\":\"GEL\",\"title\":\"Georgian Lari\",\"symbol\":\"GEL\",\"native\":\"GEL\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"283\",\"max_amount\":\"2830234\"},\"GTQ\":{\"code\":\"GTQ\",\"title\":\"Guatemalan Quetzal\",\"symbol\":\"GTQ\",\"native\":\"Q\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"778\",\"max_amount\":\"7781323\"},\"HKD\":{\"code\":\"HKD\",\"title\":\"Hong Kong Dollar\",\"symbol\":\"HK$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"784\",\"max_amount\":\"7849750\"},\"HNL\":{\"code\":\"HNL\",\"title\":\"Honduran Lempira\",\"symbol\":\"HNL\",\"native\":\"L\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"2441\",\"max_amount\":\"24413729\"},\"HRK\":{\"code\":\"HRK\",\"title\":\"Croatian Kuna\",\"symbol\":\"HRK\",\"native\":\"kn\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"764\",\"max_amount\":\"7648805\"},\"HUF\":{\"code\":\"HUF\",\"title\":\"Hungarian Forint\",\"symbol\":\"HUF\",\"native\":\"Ft\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"42685\",\"max_amount\":\"426850229\"},\"IDR\":{\"code\":\"IDR\",\"title\":\"Indonesian Rupiah\",\"symbol\":\"IDR\",\"native\":\"Rp\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"1523370\",\"max_amount\":\"15233700000\"},\"ILS\":{\"code\":\"ILS\",\"title\":\"Israeli New Sheqel\",\"symbol\":\"โ‚ช\",\"native\":\"โ‚ช\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"354\",\"max_amount\":\"3543350\"},\"INR\":{\"code\":\"INR\",\"title\":\"Indian Rupee\",\"symbol\":\"โ‚น\",\"native\":\"โ‚น\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"8155\",\"max_amount\":\"81555550\"},\"ISK\":{\"code\":\"ISK\",\"title\":\"Icelandic Krรณna\",\"symbol\":\"ISK\",\"native\":\"kr\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":0,\"min_amount\":\"142\",\"max_amount\":\"1425603\"},\"JMD\":{\"code\":\"JMD\",\"title\":\"Jamaican Dollar\",\"symbol\":\"JMD\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"15013\",\"max_amount\":\"150131044\"},\"JPY\":{\"code\":\"JPY\",\"title\":\"Japanese Yen\",\"symbol\":\"ยฅ\",\"native\":\"๏ฟฅ\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":0,\"min_amount\":\"144\",\"max_amount\":\"1443065\"},\"KES\":{\"code\":\"KES\",\"title\":\"Kenyan Shilling\",\"symbol\":\"KES\",\"native\":\"Ksh\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"12075\",\"max_amount\":\"120750271\"},\"KGS\":{\"code\":\"KGS\",\"title\":\"Kyrgyzstani Som\",\"symbol\":\"KGS\",\"native\":\"KGS\",\"thousands_sep\":\" \",\"decimal_sep\":\"-\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"8018\",\"max_amount\":\"80182898\"},\"KRW\":{\"code\":\"KRW\",\"title\":\"South Korean Won\",\"symbol\":\"โ‚ฉ\",\"native\":\"โ‚ฉ\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":0,\"min_amount\":\"1431\",\"max_amount\":\"14315201\"},\"KZT\":{\"code\":\"KZT\",\"title\":\"Kazakhstani Tenge\",\"symbol\":\"KZT\",\"native\":\"โ‚ธ\",\"thousands_sep\":\" \",\"decimal_sep\":\"-\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"47186\",\"max_amount\":\"471867112\"},\"LBP\":{\"code\":\"LBP\",\"title\":\"Lebanese Pound\",\"symbol\":\"LBP\",\"native\":\"ู„.ู„.โ€\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"150999\",\"max_amount\":\"1509998778\"},\"LKR\":{\"code\":\"LKR\",\"title\":\"Sri Lankan Rupee\",\"symbol\":\"LKR\",\"native\":\"เถปเท”.\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"35546\",\"max_amount\":\"355469651\"},\"MAD\":{\"code\":\"MAD\",\"title\":\"Moroccan Dirham\",\"symbol\":\"MAD\",\"native\":\"ุฏ.ู….โ€\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"1093\",\"max_amount\":\"10938136\"},\"MDL\":{\"code\":\"MDL\",\"title\":\"Moldovan Leu\",\"symbol\":\"MDL\",\"native\":\"MDL\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1926\",\"max_amount\":\"19264439\"},\"MNT\":{\"code\":\"MNT\",\"title\":\"Mongolian Tรถgrรถg\",\"symbol\":\"MNT\",\"native\":\"MNT\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"322444\",\"max_amount\":\"3224442056\"},\"MUR\":{\"code\":\"MUR\",\"title\":\"Mauritian Rupee\",\"symbol\":\"MUR\",\"native\":\"MUR\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"4453\",\"max_amount\":\"44535174\"},\"MVR\":{\"code\":\"MVR\",\"title\":\"Maldivian Rufiyaa\",\"symbol\":\"MVR\",\"native\":\"MVR\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1546\",\"max_amount\":\"15460397\"},\"MXN\":{\"code\":\"MXN\",\"title\":\"Mexican Peso\",\"symbol\":\"MX$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"2012\",\"max_amount\":\"20122860\"},\"MYR\":{\"code\":\"MYR\",\"title\":\"Malaysian Ringgit\",\"symbol\":\"MYR\",\"native\":\"RM\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"463\",\"max_amount\":\"4632502\"},\"MZN\":{\"code\":\"MZN\",\"title\":\"Mozambican Metical\",\"symbol\":\"MZN\",\"native\":\"MTn\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"6382\",\"max_amount\":\"63829729\"},\"NGN\":{\"code\":\"NGN\",\"title\":\"Nigerian Naira\",\"symbol\":\"NGN\",\"native\":\"โ‚ฆ\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"43203\",\"max_amount\":\"432039828\"},\"NIO\":{\"code\":\"NIO\",\"title\":\"Nicaraguan Cรณrdoba\",\"symbol\":\"NIO\",\"native\":\"C$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"3556\",\"max_amount\":\"35566412\"},\"NOK\":{\"code\":\"NOK\",\"title\":\"Norwegian Krone\",\"symbol\":\"NOK\",\"native\":\"kr\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"1069\",\"max_amount\":\"10690975\"},\"NPR\":{\"code\":\"NPR\",\"title\":\"Nepalese Rupee\",\"symbol\":\"NPR\",\"native\":\"เคจเฅ‡เคฐเฅ‚\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"12954\",\"max_amount\":\"129546657\"},\"NZD\":{\"code\":\"NZD\",\"title\":\"New Zealand Dollar\",\"symbol\":\"NZ$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"174\",\"max_amount\":\"1746220\"},\"PAB\":{\"code\":\"PAB\",\"title\":\"Panamanian Balboa\",\"symbol\":\"PAB\",\"native\":\"B\\/.\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"98\",\"max_amount\":\"988722\"},\"PEN\":{\"code\":\"PEN\",\"title\":\"Peruvian Nuevo Sol\",\"symbol\":\"PEN\",\"native\":\"S\\/.\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"390\",\"max_amount\":\"3902208\"},\"PHP\":{\"code\":\"PHP\",\"title\":\"Philippine Peso\",\"symbol\":\"PHP\",\"native\":\"โ‚ฑ\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"5862\",\"max_amount\":\"58627496\"},\"PKR\":{\"code\":\"PKR\",\"title\":\"Pakistani Rupee\",\"symbol\":\"PKR\",\"native\":\"โ‚จ\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"22642\",\"max_amount\":\"226426805\"},\"PLN\":{\"code\":\"PLN\",\"title\":\"Polish Zล‚oty\",\"symbol\":\"PLN\",\"native\":\"zล‚\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"493\",\"max_amount\":\"4932350\"},\"PYG\":{\"code\":\"PYG\",\"title\":\"Paraguayan Guaranรญ\",\"symbol\":\"PYG\",\"native\":\"โ‚ฒ\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":0,\"min_amount\":\"6977\",\"max_amount\":\"69772317\"},\"QAR\":{\"code\":\"QAR\",\"title\":\"Qatari Riyal\",\"symbol\":\"QAR\",\"native\":\"ุฑ.ู‚.โ€\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"364\",\"max_amount\":\"3640989\"},\"RON\":{\"code\":\"RON\",\"title\":\"Romanian Leu\",\"symbol\":\"RON\",\"native\":\"RON\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"502\",\"max_amount\":\"5028645\"},\"RSD\":{\"code\":\"RSD\",\"title\":\"Serbian Dinar\",\"symbol\":\"RSD\",\"native\":\"ะดะธะฝ.\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"11918\",\"max_amount\":\"119184990\"},\"RUB\":{\"code\":\"RUB\",\"title\":\"Russian Ruble\",\"symbol\":\"RUB\",\"native\":\"โ‚ฝ\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"7128\",\"max_amount\":\"71281218\"},\"SAR\":{\"code\":\"SAR\",\"title\":\"Saudi Riyal\",\"symbol\":\"SAR\",\"native\":\"ุฑ.ุณ.โ€\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"375\",\"max_amount\":\"3756546\"},\"SEK\":{\"code\":\"SEK\",\"title\":\"Swedish Krona\",\"symbol\":\"SEK\",\"native\":\"kr\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1109\",\"max_amount\":\"11094972\"},\"SGD\":{\"code\":\"SGD\",\"title\":\"Singapore Dollar\",\"symbol\":\"SGD\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"143\",\"max_amount\":\"1430495\"},\"THB\":{\"code\":\"THB\",\"title\":\"Thai Baht\",\"symbol\":\"เธฟ\",\"native\":\"เธฟ\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"3780\",\"max_amount\":\"37800497\"},\"TJS\":{\"code\":\"TJS\",\"title\":\"Tajikistani Somoni\",\"symbol\":\"TJS\",\"native\":\"TJS\",\"thousands_sep\":\" \",\"decimal_sep\":\";\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"975\",\"max_amount\":\"9753854\"},\"TRY\":{\"code\":\"TRY\",\"title\":\"Turkish Lira\",\"symbol\":\"TRY\",\"native\":\"TL\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1854\",\"max_amount\":\"18543598\"},\"TTD\":{\"code\":\"TTD\",\"title\":\"Trinidad and Tobago Dollar\",\"symbol\":\"TTD\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"672\",\"max_amount\":\"6722681\"},\"TWD\":{\"code\":\"TWD\",\"title\":\"New Taiwan Dollar\",\"symbol\":\"NT$\",\"native\":\"NT$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"3173\",\"max_amount\":\"31738502\"},\"TZS\":{\"code\":\"TZS\",\"title\":\"Tanzanian Shilling\",\"symbol\":\"TZS\",\"native\":\"TSh\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"233199\",\"max_amount\":\"2331999890\"},\"UAH\":{\"code\":\"UAH\",\"title\":\"Ukrainian Hryvnia\",\"symbol\":\"UAH\",\"native\":\"โ‚ด\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":false,\"exp\":2,\"min_amount\":\"3633\",\"max_amount\":\"36338830\"},\"UGX\":{\"code\":\"UGX\",\"title\":\"Ugandan Shilling\",\"symbol\":\"UGX\",\"native\":\"USh\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":0,\"min_amount\":\"3816\",\"max_amount\":\"38166726\"},\"USD\":{\"code\":\"USD\",\"title\":\"United States Dollar\",\"symbol\":\"$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"100\",\"max_amount\":1000000},\"UYU\":{\"code\":\"UYU\",\"title\":\"Uruguayan Peso\",\"symbol\":\"UYU\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"4080\",\"max_amount\":\"40801205\"},\"UZS\":{\"code\":\"UZS\",\"title\":\"Uzbekistani Som\",\"symbol\":\"UZS\",\"native\":\"UZS\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1089058\",\"max_amount\":\"10890583014\"},\"VND\":{\"code\":\"VND\",\"title\":\"Vietnamese ฤแป“ng\",\"symbol\":\"โ‚ซ\",\"native\":\"โ‚ซ\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":0,\"min_amount\":\"23862\",\"max_amount\":\"238625000\"},\"YER\":{\"code\":\"YER\",\"title\":\"Yemeni Rial\",\"symbol\":\"YER\",\"native\":\"ุฑ.ูŠ.โ€\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"25030\",\"max_amount\":\"250300677\"},\"ZAR\":{\"code\":\"ZAR\",\"title\":\"South African Rand\",\"symbol\":\"ZAR\",\"native\":\"R\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"1789\",\"max_amount\":\"17894299\"}};\n\nexport default Currencies;\n","/*\n * 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 {EMOJI_VERSION} from '../environment/emojiVersionsSupport';\n\nexport const EmojiVersions: {[version in EMOJI_VERSION]: {[emoji: string]: number}} = {'14':{'1f6dd':4867, '1f6de':4916, '1f6df':4923, '1f7f0':62832, '1f979':183, '1f9cc':1557, '1fa7b':61332, '1fa7c':61330, '1faa9':51093, '1faaa':61364, '1faab':61189, '1faac':51085, '1fab7':2651, '1fab8':2631, '1fab9':2672, '1faba':2673, '1fac3':1520, '1fac4':1521, '1fac5':1505, '1fad7':3793, '1fad8':3707, '1fad9':3804, '1fae0':111, '1fae1':136, '1fae2':132, '1fae3':133, '1fae4':174, '1fae5':142, '1fae6':1385, '1fae7':61353, '1faf0':1341, '1faf1':1332, '1faf2':1333, '1faf3':1334, '1faf4':1335, '1faf5':1351, '1faf6':1360, '1faf1-1f3fb-200d-1faf2-1f3fc':0, '1faf1-1f3fb-200d-1faf2-1f3fd':0, '1faf1-1f3fb-200d-1faf2-1f3fe':0, '1faf1-1f3fb-200d-1faf2-1f3ff':0, '1faf1-1f3fc-200d-1faf2-1f3fb':0, '1faf1-1f3fc-200d-1faf2-1f3fd':0, '1faf1-1f3fc-200d-1faf2-1f3fe':0, '1faf1-1f3fc-200d-1faf2-1f3ff':0, '1faf1-1f3fd-200d-1faf2-1f3fb':0, '1faf1-1f3fd-200d-1faf2-1f3fc':0, '1faf1-1f3fd-200d-1faf2-1f3fe':0, '1faf1-1f3fd-200d-1faf2-1f3ff':0, '1faf1-1f3fe-200d-1faf2-1f3fb':0, '1faf1-1f3fe-200d-1faf2-1f3fc':0, '1faf1-1f3fe-200d-1faf2-1f3fd':0, '1faf1-1f3fe-200d-1faf2-1f3ff':0, '1faf1-1f3ff-200d-1faf2-1f3fb':0, '1faf1-1f3ff-200d-1faf2-1f3fc':0, '1faf1-1f3ff-200d-1faf2-1f3fd':0, '1faf1-1f3ff-200d-1faf2-1f3fe':0, '1fac3-1f3fb':0, '1fac3-1f3fc':0, '1fac3-1f3fd':0, '1fac3-1f3fe':0, '1fac3-1f3ff':0, '1fac4-1f3fb':0, '1fac4-1f3fc':0, '1fac4-1f3fd':0, '1fac4-1f3fe':0, '1fac4-1f3ff':0, '1fac5-1f3fb':0, '1fac5-1f3fc':0, '1fac5-1f3fd':0, '1fac5-1f3fe':0, '1fac5-1f3ff':0, '1faf0-1f3fb':0, '1faf0-1f3fc':0, '1faf0-1f3fd':0, '1faf0-1f3fe':0, '1faf0-1f3ff':0, '1faf1-1f3fb':0, '1faf1-1f3fc':0, '1faf1-1f3fd':0, '1faf1-1f3fe':0, '1faf1-1f3ff':0, '1faf2-1f3fb':0, '1faf2-1f3fc':0, '1faf2-1f3fd':0, '1faf2-1f3fe':0, '1faf2-1f3ff':0, '1faf3-1f3fb':0, '1faf3-1f3fc':0, '1faf3-1f3fd':0, '1faf3-1f3fe':0, '1faf3-1f3ff':0, '1faf4-1f3fb':0, '1faf4-1f3fc':0, '1faf4-1f3fd':0, '1faf4-1f3fe':0, '1faf4-1f3ff':0, '1faf5-1f3fb':0, '1faf5-1f3fc':0, '1faf5-1f3fd':0, '1faf5-1f3fe':0, '1faf5-1f3ff':0, '1faf6-1f3fb':0, '1faf6-1f3fc':0, '1faf6-1f3fd':0, '1faf6-1f3fe':0, '1faf6-1f3ff':0}, '':{'2049':62835, '2122':62863, '2139':62888, '2194':62764, '2195':62763, '2196':62762, '2197':62756, '2198':62758, '2199':62760, '2328':61194, '2600':4990, '2601':4998, '2602':41013, '2603':41018, '2604':41020, '2611':62851, '2614':41014, '2615':3781, '2618':2667, '2620':1106, '2622':62753, '2623':62754, '2626':62783, '2638':62780, '2639':177, '2648':62788, '2649':62789, '2650':62796, '2651':62797, '2652':62798, '2653':62799, '2660':51095, '2663':51098, '2665':51096, '2666':51097, '2668':4865, '2692':61297, '2693':4922, '2694':61300, '2696':61311, '2697':61319, '2699':61309, '2702':61284, '2705':62850, '2708':4931, '2709':61245, '2712':61259, '2714':62852, '2716':62828, '2721':62779, '2728':51029, '2733':62858, '2734':62859, '2744':41017, '2747':62860, '2753':62836, '2754':62837, '2755':62838, '2757':62839, '2763':1137, '2764':1141, '2795':62829, '2796':62830, '2797':62831, '2934':62767, '2935':62768, '3030':62840, '3297':62912, '3299':62913, '0023-20e3':62864, '002a-20e3':62865, '0030-20e3':62866, '0031-20e3':62867, '0032-20e3':62868, '0033-20e3':62869, '0034-20e3':62870, '0035-20e3':62871, '0036-20e3':62872, '0037-20e3':62873, '0038-20e3':62874, '0039-20e3':62875, '00a9':62861, '00ae':62862, '1f004':51101, '1f0cf':51100, '1f170':62882, '1f171':62884, '1f17e':62893, '1f17f':62895, '1f18e':62883, '1f191':62885, '1f192':62886, '1f193':62887, '1f194':62889, '1f195':62891, '1f196':62892, '1f197':62894, '1f198':62896, '1f199':62897, '1f19a':62898, '1f1e6-1f1e8':71594, '1f1e6-1f1e9':71595, '1f1e6-1f1ea':71596, '1f1e6-1f1eb':71597, '1f1e6-1f1ec':71598, '1f1e6-1f1ee':71599, '1f1e6-1f1f1':71600, '1f1e6-1f1f2':71601, '1f1e6-1f1f4':71602, '1f1e6-1f1f6':71603, '1f1e6-1f1f7':71604, '1f1e6-1f1f8':71605, '1f1e6-1f1f9':71606, '1f1e6-1f1fa':71607, '1f1e6-1f1fc':71608, '1f1e6-1f1fd':71609, '1f1e6-1f1ff':71610, '1f1e7-1f1e6':71611, '1f1e7-1f1e7':71612, '1f1e7-1f1e9':71613, '1f1e7-1f1ea':71614, '1f1e7-1f1eb':71615, '1f1e7-1f1ec':71616, '1f1e7-1f1ed':71617, '1f1e7-1f1ee':71618, '1f1e7-1f1ef':71619, '1f1e7-1f1f1':71620, '1f1e7-1f1f2':71621, '1f1e7-1f1f3':71622, '1f1e7-1f1f4':71623, '1f1e7-1f1f6':71624, '1f1e7-1f1f7':71625, '1f1e7-1f1f8':71626, '1f1e7-1f1f9':71627, '1f1e7-1f1fb':71628, '1f1e7-1f1fc':71629, '1f1e7-1f1fe':71630, '1f1e7-1f1ff':71631, '1f1e8-1f1e6':71632, '1f1e8-1f1e8':71633, '1f1e8-1f1e9':71634, '1f1e8-1f1eb':71635, '1f1e8-1f1ec':71636, '1f1e8-1f1ed':71637, '1f1e8-1f1ee':71638, '1f1e8-1f1f0':71639, '1f1e8-1f1f1':71640, '1f1e8-1f1f2':71641, '1f1e8-1f1f3':71642, '1f1e8-1f1f4':71643, '1f1e8-1f1f5':71644, '1f1e8-1f1f7':71645, '1f1e8-1f1fa':71646, '1f1e8-1f1fb':71647, '1f1e8-1f1fc':71648, '1f1e8-1f1fd':71649, '1f1e8-1f1fe':71650, '1f1e8-1f1ff':71651, '1f1e9-1f1ea':71652, '1f1e9-1f1ec':71653, '1f1e9-1f1ef':71654, '1f1e9-1f1f0':71655, '1f1e9-1f1f2':71656, '1f1e9-1f1f4':71657, '1f1e9-1f1ff':71658, '1f1ea-1f1e6':71659, '1f1ea-1f1e8':71660, '1f1ea-1f1ea':71661, '1f1ea-1f1ec':71662, '1f1ea-1f1ed':71663, '1f1ea-1f1f7':71664, '1f1ea-1f1f8':71665, '1f1ea-1f1f9':71666, '1f1ea-1f1fa':71667, '1f1eb-1f1ee':71668, '1f1eb-1f1ef':71669, '1f1eb-1f1f0':71670, '1f1eb-1f1f2':71671, '1f1eb-1f1f4':71672, '1f1eb-1f1f7':71673, '1f1ec-1f1e6':71674, '1f1ec-1f1e7':71675, '1f1ec-1f1e9':71676, '1f1ec-1f1ea':71677, '1f1ec-1f1eb':71678, '1f1ec-1f1ec':71679, '1f1ec-1f1ed':71680, '1f1ec-1f1ee':71681, '1f1ec-1f1f1':71682, '1f1ec-1f1f2':71683, '1f1ec-1f1f3':71684, '1f1ec-1f1f5':71685, '1f1ec-1f1f6':71686, '1f1ec-1f1f7':71687, '1f1ec-1f1f8':71688, '1f1ec-1f1f9':71689, '1f1ec-1f1fa':71690, '1f1ec-1f1fc':71691, '1f1ec-1f1fe':71692, '1f1ed-1f1f0':71693, '1f1ed-1f1f2':71694, '1f1ed-1f1f3':71695, '1f1ed-1f1f7':71696, '1f1ed-1f1f9':71697, '1f1ed-1f1fa':71698, '1f1ee-1f1e8':71699, '1f1ee-1f1e9':71700, '1f1ee-1f1ea':71701, '1f1ee-1f1f1':71702, '1f1ee-1f1f2':71703, '1f1ee-1f1f3':71704, '1f1ee-1f1f4':71705, '1f1ee-1f1f6':71706, '1f1ee-1f1f7':71707, '1f1ee-1f1f8':71708, '1f1ee-1f1f9':71709, '1f1ef-1f1ea':71710, '1f1ef-1f1f2':71711, '1f1ef-1f1f4':71712, '1f1ef-1f1f5':71713, '1f1f0-1f1ea':71714, '1f1f0-1f1ec':71715, '1f1f0-1f1ed':71716, '1f1f0-1f1ee':71717, '1f1f0-1f1f2':71718, '1f1f0-1f1f3':71719, '1f1f0-1f1f5':71720, '1f1f0-1f1f7':71721, '1f1f0-1f1fc':71722, '1f1f0-1f1fe':71723, '1f1f0-1f1ff':71724, '1f1f1-1f1e6':71725, '1f1f1-1f1e7':71726, '1f1f1-1f1e8':71727, '1f1f1-1f1ee':71728, '1f1f1-1f1f0':71729, '1f1f1-1f1f7':71730, '1f1f1-1f1f8':71731, '1f1f1-1f1f9':71732, '1f1f1-1f1fa':71733, '1f1f1-1f1fb':71734, '1f1f1-1f1fe':71735, '1f1f2-1f1e6':71736, '1f1f2-1f1e8':71737, '1f1f2-1f1e9':71738, '1f1f2-1f1ea':71739, '1f1f2-1f1eb':71740, '1f1f2-1f1ec':71741, '1f1f2-1f1ed':71742, '1f1f2-1f1f0':71743, '1f1f2-1f1f1':71744, '1f1f2-1f1f2':71745, '1f1f2-1f1f3':71746, '1f1f2-1f1f4':71747, '1f1f2-1f1f5':71748, '1f1f2-1f1f6':71749, '1f1f2-1f1f7':71750, '1f1f2-1f1f8':71751, '1f1f2-1f1f9':71752, '1f1f2-1f1fa':71753, '1f1f2-1f1fb':71754, '1f1f2-1f1fc':71755, '1f1f2-1f1fd':71756, '1f1f2-1f1fe':71757, '1f1f2-1f1ff':71758, '1f1f3-1f1e6':71759, '1f1f3-1f1e8':71760, '1f1f3-1f1ea':71761, '1f1f3-1f1eb':71762, '1f1f3-1f1ec':71763, '1f1f3-1f1ee':71764, '1f1f3-1f1f1':71765, '1f1f3-1f1f4':71766, '1f1f3-1f1f5':71767, '1f1f3-1f1f7':71768, '1f1f3-1f1fa':71769, '1f1f3-1f1ff':71770, '1f1f4-1f1f2':71771, '1f1f5-1f1e6':71772, '1f1f5-1f1ea':71773, '1f1f5-1f1eb':71774, '1f1f5-1f1ec':71775, '1f1f5-1f1ed':71776, '1f1f5-1f1f0':71777, '1f1f5-1f1f1':71778, '1f1f5-1f1f2':71779, '1f1f5-1f1f3':71780, '1f1f5-1f1f7':71781, '1f1f5-1f1f8':71782, '1f1f5-1f1f9':71783, '1f1f5-1f1fc':71784, '1f1f5-1f1fe':71785, '1f1f6-1f1e6':71786, '1f1f7-1f1ea':71787, '1f1f7-1f1f4':71788, '1f1f7-1f1f8':71789, '1f1f7-1f1fa':71790, '1f1f7-1f1fc':71791, '1f1f8-1f1e6':71792, '1f1f8-1f1e7':71793, '1f1f8-1f1e8':71794, '1f1f8-1f1e9':71795, '1f1f8-1f1ea':71796, '1f1f8-1f1ec':71797, '1f1f8-1f1ed':71798, '1f1f8-1f1ee':71799, '1f1f8-1f1ef':71800, '1f1f8-1f1f0':71801, '1f1f8-1f1f1':71802, '1f1f8-1f1f2':71803, '1f1f8-1f1f3':71804, '1f1f8-1f1f4':71805, '1f1f8-1f1f7':71806, '1f1f8-1f1f8':71807, '1f1f8-1f1f9':71808, '1f1f8-1f1fb':71809, '1f1f8-1f1fd':71810, '1f1f8-1f1fe':71811, '1f1f8-1f1ff':71812, '1f1f9-1f1e6':71813, '1f1f9-1f1e8':71814, '1f1f9-1f1e9':71815, '1f1f9-1f1eb':71816, '1f1f9-1f1ec':71817, '1f1f9-1f1ed':71818, '1f1f9-1f1ef':71819, '1f1f9-1f1f0':71820, '1f1f9-1f1f1':71821, '1f1f9-1f1f2':71822, '1f1f9-1f1f3':71823, '1f1f9-1f1f4':71824, '1f1f9-1f1f7':71825, '1f1f9-1f1f9':71826, '1f1f9-1f1fb':71827, '1f1f9-1f1fc':71828, '1f1f9-1f1ff':71829, '1f1fa-1f1e6':71830, '1f1fa-1f1ec':71831, '1f1fa-1f1f2':71832, '1f1fa-1f1f3':71833, '1f1fa-1f1f8':71834, '1f1fa-1f1fe':71835, '1f1fa-1f1ff':71836, '1f1fb-1f1e6':71837, '1f1fb-1f1e8':71838, '1f1fb-1f1ea':71839, '1f1fb-1f1ec':71840, '1f1fb-1f1ee':71841, '1f1fb-1f1f3':71842, '1f1fb-1f1fa':71843, '1f1fc-1f1eb':71844, '1f1fc-1f1f8':71845, '1f1fd-1f1f0':71846, '1f1fe-1f1ea':71847, '1f1fe-1f1f9':71848, '1f1ff-1f1e6':71849, '1f1ff-1f1f2':71850, '1f1ff-1f1fc':71851, '1f201':62899, '1f202':62900, '1f21a':62906, '1f22f':62903, '1f232':62907, '1f233':62911, '1f234':62910, '1f235':62915, '1f236':62902, '1f237':62901, '1f238':62909, '1f239':62905, '1f23a':62914, '1f250':62904, '1f251':62908, '1f300':41010, '1f301':4857, '1f302':41012, '1f303':4858, '1f304':4860, '1f305':4861, '1f306':4862, '1f307':4863, '1f308':41011, '1f309':4864, '1f30a':41023, '1f30b':4815, '1f30c':4997, '1f30d':4806, '1f30e':4807, '1f30f':4808, '1f310':4809, '1f311':4977, '1f312':4978, '1f313':4979, '1f314':4980, '1f315':4981, '1f316':4982, '1f317':4983, '1f318':4984, '1f319':4985, '1f31a':4986, '1f31b':4987, '1f31c':4988, '1f31d':4991, '1f31e':4992, '1f31f':4995, '1f320':4996, '1f321':4989, '1f324':41001, '1f325':41002, '1f326':41003, '1f327':41004, '1f328':41005, '1f329':41006, '1f32a':41007, '1f32b':41008, '1f32c':41009, '1f32d':3725, '1f32e':3727, '1f32f':3728, '1f330':3708, '1f331':2659, '1f332':2661, '1f333':2662, '1f334':2663, '1f335':2664, '1f336':3698, '1f337':2658, '1f338':2649, '1f339':2653, '1f33a':2655, '1f33b':2656, '1f33c':2657, '1f33d':3697, '1f33e':2665, '1f33f':2666, '1f340':2668, '1f341':2669, '1f342':2670, '1f343':2671, '1f344':3705, '1f345':3690, '1f346':3694, '1f347':3674, '1f348':3675, '1f349':3676, '1f34a':3677, '1f34b':3678, '1f34c':3679, '1f34d':3680, '1f34e':3682, '1f34f':3683, '1f350':3684, '1f351':3685, '1f352':3686, '1f353':3687, '1f354':3722, '1f355':3724, '1f356':3718, '1f357':3719, '1f358':3744, '1f359':3745, '1f35a':3746, '1f35b':3747, '1f35c':3748, '1f35d':3749, '1f35e':3709, '1f35f':3723, '1f360':3750, '1f361':3756, '1f362':3751, '1f363':3752, '1f364':3753, '1f365':3754, '1f366':3765, '1f367':3766, '1f368':3767, '1f369':3768, '1f36a':3769, '1f36b':3774, '1f36c':3775, '1f36d':3776, '1f36e':3777, '1f36f':3778, '1f370':3771, '1f371':3743, '1f372':3735, '1f373':3733, '1f374':3801, '1f375':3783, '1f376':3784, '1f377':3786, '1f378':3787, '1f379':3788, '1f37a':3789, '1f37b':3790, '1f37c':3779, '1f37d':3800, '1f37e':3785, '1f37f':3739, '1f380':51040, '1f381':51041, '1f382':3770, '1f383':51024, '1f384':51025, '1f385':1527, '1f386':51026, '1f387':51027, '1f388':51030, '1f389':51031, '1f38a':51032, '1f38b':51033, '1f38c':71588, '1f38d':51034, '1f38e':51035, '1f38f':51036, '1f390':51037, '1f391':51038, '1f392':61134, '1f393':61147, '1f396':51045, '1f397':51042, '1f399':61167, '1f39a':61168, '1f39b':61169, '1f39e':61203, '1f39f':51043, '1f3a0':4866, '1f3a1':4868, '1f3a2':4869, '1f3a3':51072, '1f3a4':61170, '1f3a5':61202, '1f3a6':62819, '1f3a7':61171, '1f3a8':51105, '1f3a9':61146, '1f3aa':4871, '1f3ab':51044, '1f3ac':61205, '1f3ad':51103, '1f3ae':51086, '1f3af':51078, '1f3b0':51088, '1f3b1':51081, '1f3b2':51089, '1f3b3':51060, '1f3b4':51102, '1f3b5':61165, '1f3b6':61166, '1f3b7':61173, '1f3b8':61175, '1f3b9':61176, '1f3ba':61177, '1f3bb':61178, '1f3bc':61164, '1f3bd':51074, '1f3be':51058, '1f3bf':51075, '1f3c0':51054, '1f3c1':71586, '1f3c2':1600, '1f3c3-200d-2640':1584, '1f3c3-200d-2642':1583, '1f3c3':1582, '1f3c4-200d-2640':1606, '1f3c4-200d-2642':1605, '1f3c4':1604, '1f3c5':51047, '1f3c6':51046, '1f3c7':1598, '1f3c8':51056, '1f3c9':51057, '1f3ca-200d-2640':1612, '1f3ca-200d-2642':1611, '1f3ca':1610, '1f3cb-200d-2640':1618, '1f3cb-200d-2642':1617, '1f3cb':1616, '1f3cc-200d-2640':1603, '1f3cc-200d-2642':1602, '1f3cc':1601, '1f3cd':4902, '1f3ce':4901, '1f3cf':51061, '1f3d0':51055, '1f3d1':51062, '1f3d2':51063, '1f3d3':51065, '1f3d4':4813, '1f3d5':4817, '1f3d6':4818, '1f3d7':4824, '1f3d8':4829, '1f3d9':4859, '1f3da':4830, '1f3db':4823, '1f3dc':4819, '1f3dd':4820, '1f3de':4821, '1f3df':4822, '1f3e0':4831, '1f3e1':4832, '1f3e2':4833, '1f3e3':4834, '1f3e4':4835, '1f3e5':4836, '1f3e6':4837, '1f3e7':62729, '1f3e8':4838, '1f3e9':4839, '1f3ea':4840, '1f3eb':4841, '1f3ec':4842, '1f3ed':4843, '1f3ee':61216, '1f3ef':4844, '1f3f0':4845, '1f3f3-200d-1f308':71591, '1f3f3-200d-26a7':71592, '1f3f3':71590, '1f3f4-200d-2620':71593, '1f3f4-e0067-e0062-e0065-e006e-e0067-e007f':71852, '1f3f4-e0067-e0062-e0073-e0063-e0074-e007f':71853, '1f3f4-e0067-e0062-e0077-e006c-e0073-e007f':71854, '1f3f4':71589, '1f3f5':2652, '1f3f7':61234, '1f3f8':51066, '1f3f9':61303, '1f3fa':3805, '1f3fb':9525, '1f3fc':9526, '1f3fd':9527, '1f3fe':9528, '1f3ff':9529, '1f400':2576, '1f401':2575, '1f402':2556, '1f403':2557, '1f404':2558, '1f405':2547, '1f406':2548, '1f407':2579, '1f408-200d-2b1b':2544, '1f408':2543, '1f409':2618, '1f40a':2613, '1f40b':2622, '1f40c':2632, '1f40d':2616, '1f40e':2550, '1f40f':2563, '1f410':2565, '1f411':2564, '1f412':2531, '1f413':2596, '1f414':2595, '1f415-200d-1f9ba':2537, '1f415':2535, '1f416':2560, '1f417':2561, '1f418':2570, '1f419':2629, '1f41a':2630, '1f41b':2634, '1f41c':2635, '1f41d':2636, '1f41e':2638, '1f41f':2625, '1f420':2626, '1f421':2627, '1f422':2614, '1f423':2597, '1f424':2598, '1f425':2599, '1f426':2600, '1f427':2601, '1f428':2586, '1f429':2538, '1f42a':2566, '1f42b':2567, '1f42c':2623, '1f42d':2574, '1f42e':2555, '1f42f':2546, '1f430':2578, '1f431':2542, '1f432':2617, '1f433':2621, '1f434':2549, '1f435':2530, '1f436':2534, '1f437':2559, '1f438':2612, '1f439':2577, '1f43a':2539, '1f43b-200d-2744':2585, '1f43b':2584, '1f43c':2587, '1f43d':2562, '1f43e':2593, '1f43f':2580, '1f440':1381, '1f441-200d-1f5e8':1159, '1f441':1382, '1f442':1373, '1f443':1375, '1f444':1384, '1f445':1383, '1f446':1347, '1f447':1349, '1f448':1345, '1f449':1346, '1f44a':1355, '1f44b':1327, '1f44c':1336, '1f44d':1352, '1f44e':1353, '1f44f':1358, '1f450':1361, '1f451':61144, '1f452':61145, '1f453':61110, '1f454':61115, '1f455':61116, '1f456':61117, '1f457':61122, '1f458':61123, '1f459':61128, '1f45a':61129, '1f45b':61130, '1f45c':61131, '1f45d':61132, '1f45e':61136, '1f45f':61137, '1f460':61140, '1f461':61141, '1f462':61143, '1f463':1687, '1f464':1684, '1f465':1685, '1f466':1388, '1f467':1389, '1f468-200d-1f33e':1457, '1f468-200d-1f373':1460, '1f468-200d-1f37c':1524, '1f468-200d-1f393':1448, '1f468-200d-1f3a4':1478, '1f468-200d-1f3a8':1481, '1f468-200d-1f3eb':1451, '1f468-200d-1f3ed':1466, '1f468-200d-1f466-200d-1f466':1674, '1f468-200d-1f466':1673, '1f468-200d-1f467-200d-1f466':1676, '1f468-200d-1f467-200d-1f467':1677, '1f468-200d-1f467':1675, '1f468-200d-1f468-200d-1f466':1663, '1f468-200d-1f468-200d-1f466-200d-1f466':1666, '1f468-200d-1f468-200d-1f467':1664, '1f468-200d-1f468-200d-1f467-200d-1f466':1665, '1f468-200d-1f468-200d-1f467-200d-1f467':1667, '1f468-200d-1f469-200d-1f466':1658, '1f468-200d-1f469-200d-1f466-200d-1f466':1661, '1f468-200d-1f469-200d-1f467':1659, '1f468-200d-1f469-200d-1f467-200d-1f466':1660, '1f468-200d-1f469-200d-1f467-200d-1f467':1662, '1f468-200d-1f4bb':1475, '1f468-200d-1f4bc':1469, '1f468-200d-1f527':1463, '1f468-200d-1f52c':1472, '1f468-200d-1f680':1487, '1f468-200d-1f692':1490, '1f468-200d-1f9af':1574, '1f468-200d-1f9b0':1396, '1f468-200d-1f9b1':1397, '1f468-200d-1f9b2':1399, '1f468-200d-1f9b3':1398, '1f468-200d-1f9bc':1577, '1f468-200d-1f9bd':1580, '1f468-200d-2695':1445, '1f468-200d-2696':1454, '1f468-200d-2708':1484, '1f468-200d-2764-200d-1f468':1655, '1f468-200d-2764-200d-1f48b-200d-1f468':1651, '1f468':1392, '1f469-200d-1f33e':1458, '1f469-200d-1f373':1461, '1f469-200d-1f37c':1523, '1f469-200d-1f393':1449, '1f469-200d-1f3a4':1479, '1f469-200d-1f3a8':1482, '1f469-200d-1f3eb':1452, '1f469-200d-1f3ed':1467, '1f469-200d-1f466-200d-1f466':1679, '1f469-200d-1f466':1678, '1f469-200d-1f467-200d-1f466':1681, '1f469-200d-1f467-200d-1f467':1682, '1f469-200d-1f467':1680, '1f469-200d-1f469-200d-1f466':1668, '1f469-200d-1f469-200d-1f466-200d-1f466':1671, '1f469-200d-1f469-200d-1f467':1669, '1f469-200d-1f469-200d-1f467-200d-1f466':1670, '1f469-200d-1f469-200d-1f467-200d-1f467':1672, '1f469-200d-1f4bb':1476, '1f469-200d-1f4bc':1470, '1f469-200d-1f527':1464, '1f469-200d-1f52c':1473, '1f469-200d-1f680':1488, '1f469-200d-1f692':1491, '1f469-200d-1f9af':1575, '1f469-200d-1f9b0':1401, '1f469-200d-1f9b1':1403, '1f469-200d-1f9b2':1407, '1f469-200d-1f9b3':1405, '1f469-200d-1f9bc':1578, '1f469-200d-1f9bd':1581, '1f469-200d-2695':1446, '1f469-200d-2696':1455, '1f469-200d-2708':1485, '1f469-200d-2764-200d-1f468':1654, '1f469-200d-2764-200d-1f469':1656, '1f469-200d-2764-200d-1f48b-200d-1f468':1650, '1f469-200d-2764-200d-1f48b-200d-1f469':1652, '1f469':1400, '1f46a':1657, '1f46b':1647, '1f46c':1648, '1f46d':1646, '1f46e-200d-2640':1494, '1f46e-200d-2642':1493, '1f46e':1492, '1f46f-200d-2640':1590, '1f46f-200d-2642':1589, '1f46f':1588, '1f470-200d-2640':1518, '1f470-200d-2642':1517, '1f470':1516, '1f471-200d-2640':1409, '1f471-200d-2642':1410, '1f471':1391, '1f472':1511, '1f473-200d-2640':1510, '1f473-200d-2642':1509, '1f473':1508, '1f474':1412, '1f475':1413, '1f476':1386, '1f477-200d-2640':1504, '1f477-200d-2642':1503, '1f477':1502, '1f478':1507, '1f479':1109, '1f47a':1110, '1f47b':1111, '1f47c':1526, '1f47d':1112, '1f47e':1113, '1f47f':1104, '1f480':1105, '1f481-200d-2640':1428, '1f481-200d-2642':1427, '1f481':1426, '1f482-200d-2640':1500, '1f482-200d-2642':1499, '1f482':1498, '1f483':1585, '1f484':61152, '1f485':1366, '1f486-200d-2640':1560, '1f486-200d-2642':1559, '1f486':1558, '1f487-200d-2640':1563, '1f487-200d-2642':1562, '1f487':1561, '1f488':4870, '1f489':61326, '1f48a':61328, '1f48b':1127, '1f48c':1128, '1f48d':61153, '1f48e':61154, '1f48f':1649, '1f490':2648, '1f491':1653, '1f492':4846, '1f493':1133, '1f494':1138, '1f495':1135, '1f496':1131, '1f497':1132, '1f498':1129, '1f499':1145, '1f49a':1144, '1f49b':1143, '1f49c':1146, '1f49d':1130, '1f49e':1134, '1f49f':1136, '1f4a0':62946, '1f4a1':61214, '1f4a2':1151, '1f4a3':1157, '1f4a4':1163, '1f4a5':1152, '1f4a6':1154, '1f4a7':41022, '1f4a8':1155, '1f4a9':1107, '1f4aa':1368, '1f4ab':1153, '1f4ac':1158, '1f4ad':1162, '1f4ae':2650, '1f4af':1150, '1f4b0':61235, '1f4b1':62841, '1f4b2':62842, '1f4b3':61242, '1f4b4':61237, '1f4b5':61238, '1f4b6':61239, '1f4b7':61240, '1f4b8':61241, '1f4b9':61244, '1f4ba':4936, '1f4bb':61191, '1f4bc':61265, '1f4bd':61197, '1f4be':61198, '1f4bf':61199, '1f4c0':61200, '1f4c1':61266, '1f4c2':61267, '1f4c3':61227, '1f4c4':61229, '1f4c5':61269, '1f4c6':61270, '1f4c7':61273, '1f4c8':61274, '1f4c9':61275, '1f4ca':61276, '1f4cb':61277, '1f4cc':61278, '1f4cd':61279, '1f4ce':61280, '1f4cf':61282, '1f4d0':61283, '1f4d1':61232, '1f4d2':61226, '1f4d3':61225, '1f4d4':61218, '1f4d5':61219, '1f4d6':61220, '1f4d7':61221, '1f4d8':61222, '1f4d9':61223, '1f4da':61224, '1f4db':62847, '1f4dc':61228, '1f4dd':61264, '1f4de':61185, '1f4df':61186, '1f4e0':61187, '1f4e1':61325, '1f4e2':61159, '1f4e3':61160, '1f4e4':61249, '1f4e5':61250, '1f4e6':61251, '1f4e7':61246, '1f4e8':61247, '1f4e9':61248, '1f4ea':61253, '1f4eb':61252, '1f4ec':61254, '1f4ed':61255, '1f4ee':61256, '1f4ef':61161, '1f4f0':61230, '1f4f1':61182, '1f4f2':61183, '1f4f3':62823, '1f4f4':62824, '1f4f5':62751, '1f4f6':62822, '1f4f7':61207, '1f4f8':61208, '1f4f9':61209, '1f4fa':61206, '1f4fb':61172, '1f4fc':61210, '1f4fd':61204, '1f4ff':61151, '1f500':62801, '1f501':62802, '1f502':62803, '1f503':62769, '1f504':62770, '1f505':62820, '1f506':62821, '1f507':61155, '1f508':61156, '1f509':61157, '1f50a':61158, '1f50b':61188, '1f50c':61190, '1f50d':61211, '1f50e':61212, '1f50f':61290, '1f510':61291, '1f511':61292, '1f512':61288, '1f513':61289, '1f514':61162, '1f515':61163, '1f516':61233, '1f517':61313, '1f518':62947, '1f519':62771, '1f51a':62772, '1f51b':62773, '1f51c':62774, '1f51d':62775, '1f51e':62752, '1f51f':62876, '1f520':62877, '1f521':62878, '1f522':62879, '1f523':62880, '1f524':62881, '1f525':41021, '1f526':61215, '1f527':61306, '1f528':61294, '1f529':61308, '1f52a':3803, '1f52b':61301, '1f52c':61323, '1f52d':61324, '1f52e':51082, '1f52f':62787, '1f530':62848, '1f531':62846, '1f532':62949, '1f533':62948, '1f534':62916, '1f535':62920, '1f536':62940, '1f537':62941, '1f538':62942, '1f539':62943, '1f53a':62944, '1f53b':62945, '1f53c':62811, '1f53d':62813, '1f549':62778, '1f54a':2602, '1f54b':4854, '1f54c':4850, '1f54d':4852, '1f54e':62786, '1f550':4955, '1f551':4957, '1f552':4959, '1f553':4961, '1f554':4963, '1f555':4965, '1f556':4967, '1f557':4969, '1f558':4971, '1f559':4973, '1f55a':4975, '1f55b':4953, '1f55c':4956, '1f55d':4958, '1f55e':4960, '1f55f':4962, '1f560':4964, '1f561':4966, '1f562':4968, '1f563':4970, '1f564':4972, '1f565':4974, '1f566':4976, '1f567':4954, '1f56f':61213, '1f570':4952, '1f573':1156, '1f574':1587, '1f575-200d-2640':1497, '1f575-200d-2642':1496, '1f575':1495, '1f576':61111, '1f577':2641, '1f578':2642, '1f579':51087, '1f57a':1586, '1f587':61281, '1f58a':61261, '1f58b':61260, '1f58c':61262, '1f58d':61263, '1f590':1329, '1f595':1348, '1f596':1331, '1f5a4':1148, '1f5a5':61192, '1f5a8':61193, '1f5b1':61195, '1f5b2':61196, '1f5bc':51104, '1f5c2':61268, '1f5c3':61285, '1f5c4':61286, '1f5d1':61287, '1f5d2':61271, '1f5d3':61272, '1f5dc':61310, '1f5dd':61293, '1f5de':61231, '1f5e1':61299, '1f5e3':1683, '1f5e8':1160, '1f5ef':1161, '1f5f3':61257, '1f5fa':4810, '1f5fb':4816, '1f5fc':4847, '1f5fd':4848, '1f5fe':4811, '1f5ff':61362, '1f600':11, '1f601':14, '1f602':18, '1f603':12, '1f604':13, '1f605':16, '1f606':15, '1f607':114, '1f608':1103, '1f609':112, '1f60a':113, '1f60b':124, '1f60c':150, '1f60d':116, '1f60e':170, '1f60f':144, '1f610':139, '1f611':140, '1f612':145, '1f613':195, '1f614':151, '1f615':173, '1f616':192, '1f617':119, '1f618':118, '1f619':122, '1f61a':121, '1f61b':125, '1f61c':126, '1f61d':128, '1f61e':194, '1f61f':175, '1f620':1101, '1f621':1100, '1f622':189, '1f623':193, '1f624':199, '1f625':188, '1f626':184, '1f627':185, '1f628':186, '1f629':196, '1f62a':152, '1f62b':197, '1f62c':147, '1f62d':190, '1f62e-200d-1f4a8':148, '1f62e':178, '1f62f':179, '1f630':187, '1f631':191, '1f632':180, '1f633':181, '1f634':154, '1f635-200d-1f4ab':165, '1f635':164, '1f636-200d-1f32b':143, '1f636':141, '1f637':155, '1f638':1116, '1f639':1117, '1f63a':1115, '1f63b':1118, '1f63c':1119, '1f63d':1120, '1f63e':1123, '1f63f':1122, '1f640':1121, '1f641':176, '1f642':19, '1f643':110, '1f644':146, '1f645-200d-2640':1422, '1f645-200d-2642':1421, '1f645':1420, '1f646-200d-2640':1425, '1f646-200d-2642':1424, '1f646':1423, '1f647-200d-2640':1437, '1f647-200d-2642':1436, '1f647':1435, '1f648':1124, '1f649':1125, '1f64a':1126, '1f64b-200d-2640':1431, '1f64b-200d-2642':1430, '1f64b':1429, '1f64c':1359, '1f64d-200d-2640':1416, '1f64d-200d-2642':1415, '1f64d':1414, '1f64e-200d-2640':1419, '1f64e-200d-2642':1418, '1f64e':1417, '1f64f':1364, '1f680':4942, '1f681':4937, '1f682':4872, '1f683':4873, '1f684':4874, '1f685':4875, '1f686':4876, '1f687':4877, '1f688':4878, '1f689':4879, '1f68a':4880, '1f68b':4883, '1f68c':4884, '1f68d':4885, '1f68e':4886, '1f68f':4911, '1f690':4887, '1f691':4888, '1f692':4889, '1f693':4890, '1f694':4891, '1f695':4892, '1f696':4893, '1f697':4894, '1f698':4895, '1f699':4896, '1f69a':4898, '1f69b':4899, '1f69c':4900, '1f69d':4881, '1f69e':4882, '1f69f':4938, '1f6a0':4939, '1f6a1':4940, '1f6a2':4930, '1f6a3-200d-2640':1609, '1f6a3-200d-2642':1608, '1f6a3':1607, '1f6a4':4926, '1f6a5':4918, '1f6a6':4919, '1f6a7':4921, '1f6a8':4917, '1f6a9':71587, '1f6aa':61333, '1f6ab':62745, '1f6ac':61358, '1f6ad':62747, '1f6ae':62730, '1f6af':62748, '1f6b0':62731, '1f6b1':62749, '1f6b2':4907, '1f6b3':62746, '1f6b4-200d-2640':1621, '1f6b4-200d-2642':1620, '1f6b4':1619, '1f6b5-200d-2640':1624, '1f6b5-200d-2642':1623, '1f6b5':1622, '1f6b6-200d-2640':1566, '1f6b6-200d-2642':1565, '1f6b6':1564, '1f6b7':62750, '1f6b8':62743, '1f6b9':62733, '1f6ba':62734, '1f6bb':62735, '1f6bc':62736, '1f6bd':61340, '1f6be':62737, '1f6bf':61342, '1f6c0':1643, '1f6c1':61343, '1f6c2':62738, '1f6c3':62739, '1f6c4':62740, '1f6c5':62741, '1f6cb':61338, '1f6cc':1644, '1f6cd':61133, '1f6ce':4944, '1f6cf':61337, '1f6d0':62776, '1f6d1':4920, '1f6d2':61357, '1f6d5':4851, '1f6d6':4828, '1f6d7':61334, '1f6e0':61298, '1f6e1':61304, '1f6e2':4914, '1f6e3':4912, '1f6e4':4913, '1f6e5':4929, '1f6e9':4932, '1f6eb':4933, '1f6ec':4934, '1f6f0':4941, '1f6f3':4927, '1f6f4':4908, '1f6f5':4903, '1f6f6':4925, '1f6f7':51076, '1f6f8':4943, '1f6f9':4909, '1f6fa':4906, '1f6fb':4897, '1f6fc':4910, '1f7e0':62917, '1f7e1':62918, '1f7e2':62919, '1f7e3':62921, '1f7e4':62922, '1f7e5':62925, '1f7e6':62929, '1f7e7':62926, '1f7e8':62927, '1f7e9':62928, '1f7ea':62930, '1f7eb':62931, '1f90c':1337, '1f90d':1149, '1f90e':1147, '1f90f':1338, '1f910':137, '1f911':129, '1f912':156, '1f913':171, '1f914':135, '1f915':157, '1f916':1114, '1f917':130, '1f918':1343, '1f919':1344, '1f91a':1328, '1f91b':1356, '1f91c':1357, '1f91d':1363, '1f91e':1340, '1f91f':1342, '1f920':167, '1f921':1108, '1f922':158, '1f923':17, '1f924':153, '1f925':149, '1f926-200d-2640':1440, '1f926-200d-2642':1439, '1f926':1438, '1f927':160, '1f928':138, '1f929':117, '1f92a':127, '1f92b':134, '1f92c':1102, '1f92d':131, '1f92e':159, '1f92f':166, '1f930':1519, '1f931':1522, '1f932':1362, '1f933':1367, '1f934':1506, '1f935-200d-2640':1515, '1f935-200d-2642':1514, '1f935':1513, '1f936':1528, '1f937-200d-2640':1443, '1f937-200d-2642':1442, '1f937':1441, '1f938-200d-2640':1627, '1f938-200d-2642':1626, '1f938':1625, '1f939-200d-2640':1639, '1f939-200d-2642':1638, '1f939':1637, '1f93a':1597, '1f93c-200d-2640':1630, '1f93c-200d-2642':1629, '1f93c':1628, '1f93d-200d-2640':1633, '1f93d-200d-2642':1632, '1f93d':1631, '1f93e-200d-2640':1636, '1f93e-200d-2642':1635, '1f93e':1634, '1f93f':51073, '1f940':2654, '1f941':61180, '1f942':3791, '1f943':3792, '1f944':3802, '1f945':51069, '1f947':51048, '1f948':51049, '1f949':51050, '1f94a':51067, '1f94b':51068, '1f94c':51077, '1f94d':51064, '1f94e':51053, '1f94f':51059, '1f950':3710, '1f951':3693, '1f952':3700, '1f953':3721, '1f954':3695, '1f955':3696, '1f956':3711, '1f957':3738, '1f958':3734, '1f959':3730, '1f95a':3732, '1f95b':3780, '1f95c':3706, '1f95d':3689, '1f95e':3715, '1f95f':3757, '1f960':3758, '1f961':3759, '1f962':3799, '1f963':3737, '1f964':3794, '1f965':3692, '1f966':3702, '1f967':3773, '1f968':3713, '1f969':3720, '1f96a':3726, '1f96b':3742, '1f96c':3701, '1f96d':3681, '1f96e':3755, '1f96f':3714, '1f970':115, '1f971':198, '1f972':123, '1f973':168, '1f974':163, '1f975':161, '1f976':162, '1f977':1501, '1f978':169, '1f97a':182, '1f97b':61124, '1f97c':61113, '1f97d':61112, '1f97e':61138, '1f97f':61139, '1f980':3760, '1f981':2545, '1f982':2643, '1f983':2594, '1f984':2551, '1f985':2603, '1f986':2604, '1f987':2583, '1f988':2628, '1f989':2606, '1f98a':2540, '1f98b':2633, '1f98c':2553, '1f98d':2532, '1f98e':2615, '1f98f':2572, '1f990':3762, '1f991':3763, '1f992':2569, '1f993':2552, '1f994':2582, '1f995':2619, '1f996':2620, '1f997':2639, '1f998':2591, '1f999':2568, '1f99a':2610, '1f99b':2573, '1f99c':2611, '1f99d':2541, '1f99e':3761, '1f99f':2644, '1f9a0':2647, '1f9a1':2592, '1f9a2':2605, '1f9a3':2571, '1f9a4':2607, '1f9a5':2588, '1f9a6':2589, '1f9a7':2533, '1f9a8':2590, '1f9a9':2609, '1f9aa':3764, '1f9ab':2581, '1f9ac':2554, '1f9ad':2624, '1f9ae':2536, '1f9af':61312, '1f9b4':1380, '1f9b5':1371, '1f9b6':1372, '1f9b7':1379, '1f9b8-200d-2640':1532, '1f9b8-200d-2642':1531, '1f9b8':1530, '1f9b9-200d-2640':1535, '1f9b9-200d-2642':1534, '1f9b9':1533, '1f9ba':61114, '1f9bb':1374, '1f9bc':4905, '1f9bd':4904, '1f9be':1369, '1f9bf':1370, '1f9c0':3717, '1f9c1':3772, '1f9c2':3741, '1f9c3':3796, '1f9c4':3703, '1f9c5':3704, '1f9c6':3731, '1f9c7':3716, '1f9c8':3740, '1f9c9':3797, '1f9ca':3798, '1f9cb':3795, '1f9cd-200d-2640':1569, '1f9cd-200d-2642':1568, '1f9cd':1567, '1f9ce-200d-2640':1572, '1f9ce-200d-2642':1571, '1f9ce':1570, '1f9cf-200d-2640':1434, '1f9cf-200d-2642':1433, '1f9cf':1432, '1f9d0':172, '1f9d1-200d-1f33e':1456, '1f9d1-200d-1f373':1459, '1f9d1-200d-1f37c':1525, '1f9d1-200d-1f384':1529, '1f9d1-200d-1f393':1447, '1f9d1-200d-1f3a4':1477, '1f9d1-200d-1f3a8':1480, '1f9d1-200d-1f3eb':1450, '1f9d1-200d-1f3ed':1465, '1f9d1-200d-1f4bb':1474, '1f9d1-200d-1f4bc':1468, '1f9d1-200d-1f527':1462, '1f9d1-200d-1f52c':1471, '1f9d1-200d-1f680':1486, '1f9d1-200d-1f692':1489, '1f9d1-200d-1f91d-200d-1f9d1':1645, '1f9d1-200d-1f9af':1573, '1f9d1-200d-1f9b0':1402, '1f9d1-200d-1f9b1':1404, '1f9d1-200d-1f9b2':1408, '1f9d1-200d-1f9b3':1406, '1f9d1-200d-1f9bc':1576, '1f9d1-200d-1f9bd':1579, '1f9d1-200d-2695':1444, '1f9d1-200d-2696':1453, '1f9d1-200d-2708':1483, '1f9d1':1390, '1f9d2':1387, '1f9d3':1411, '1f9d4-200d-2640':1395, '1f9d4-200d-2642':1394, '1f9d4':1393, '1f9d5':1512, '1f9d6-200d-2640':1593, '1f9d6-200d-2642':1592, '1f9d6':1591, '1f9d7-200d-2640':1596, '1f9d7-200d-2642':1595, '1f9d7':1594, '1f9d8-200d-2640':1642, '1f9d8-200d-2642':1641, '1f9d8':1640, '1f9d9-200d-2640':1538, '1f9d9-200d-2642':1537, '1f9d9':1536, '1f9da-200d-2640':1541, '1f9da-200d-2642':1540, '1f9da':1539, '1f9db-200d-2640':1544, '1f9db-200d-2642':1543, '1f9db':1542, '1f9dc-200d-2640':1547, '1f9dc-200d-2642':1546, '1f9dc':1545, '1f9dd-200d-2640':1550, '1f9dd-200d-2642':1549, '1f9dd':1548, '1f9de-200d-2640':1553, '1f9de-200d-2642':1552, '1f9de':1551, '1f9df-200d-2640':1556, '1f9df-200d-2642':1555, '1f9df':1554, '1f9e0':1376, '1f9e1':1142, '1f9e2':61148, '1f9e3':61118, '1f9e4':61119, '1f9e5':61120, '1f9e6':61121, '1f9e7':51039, '1f9e8':51028, '1f9e9':51090, '1f9ea':61320, '1f9eb':61321, '1f9ec':61322, '1f9ed':4812, '1f9ee':61201, '1f9ef':61356, '1f9f0':61316, '1f9f1':4825, '1f9f2':61317, '1f9f3':4945, '1f9f4':61346, '1f9f5':51106, '1f9f6':51108, '1f9f7':61347, '1f9f8':51091, '1f9f9':61348, '1f9fa':61349, '1f9fb':61350, '1f9fc':61352, '1f9fd':61355, '1f9fe':61243, '1f9ff':51084, '1fa70':61142, '1fa71':61125, '1fa72':61126, '1fa73':61127, '1fa74':61135, '1fa78':61327, '1fa79':61329, '1fa7a':61331, '1fa80':51079, '1fa81':51080, '1fa82':4935, '1fa83':61302, '1fa84':51083, '1fa85':51092, '1fa86':51094, '1fa90':4993, '1fa91':61339, '1fa92':61345, '1fa93':61295, '1fa94':61217, '1fa95':61179, '1fa96':61149, '1fa97':61174, '1fa98':61181, '1fa99':61236, '1fa9a':61305, '1fa9b':61307, '1fa9c':61318, '1fa9d':61315, '1fa9e':61335, '1fa9f':61336, '1faa0':61341, '1faa1':51107, '1faa2':51109, '1faa3':61351, '1faa4':61344, '1faa5':61354, '1faa6':61360, '1faa7':61363, '1faa8':4826, '1fab0':2645, '1fab1':2646, '1fab2':2637, '1fab3':2640, '1fab4':2660, '1fab5':4827, '1fab6':2608, '1fac0':1377, '1fac1':1378, '1fac2':1686, '1fad0':3688, '1fad1':3699, '1fad2':3691, '1fad3':3712, '1fad4':3729, '1fad5':3736, '1fad6':3782, '203c':62834, '21a9':62765, '21aa':62766, '231a':4948, '231b':4946, '23cf':62818, '23e9':62805, '23ea':62809, '23eb':62812, '23ec':62814, '23ed':62806, '23ee':62810, '23ef':62807, '23f0':4949, '23f1':4950, '23f2':4951, '23f3':4947, '23f8':62815, '23f9':62816, '23fa':62817, '24c2':62890, '25aa':62938, '25ab':62939, '25b6':62804, '25c0':62808, '25fb':62935, '25fc':62934, '25fd':62937, '25fe':62936, '260e':61184, '261d':1350, '262a':62784, '262e':62785, '262f':62781, '263a':120, '264a':62790, '264b':62791, '264c':62792, '264d':62793, '264e':62794, '264f':62795, '265f':51099, '267b':62844, '267e':62833, '267f':62732, '269b':62777, '269c':62845, '26a0':62742, '26a1':41016, '26a7':62827, '26aa':62924, '26ab':62923, '26b0':61359, '26b1':61361, '26bd':51051, '26be':51052, '26c4':41019, '26c5':4999, '26c8':41000, '26ce':62800, '26cf':61296, '26d1':61150, '26d3':61314, '26d4':62744, '26e9':4853, '26ea':4849, '26f0':4814, '26f1':41015, '26f2':4855, '26f3':51070, '26f4':4928, '26f5':4924, '26f7':1599, '26f8':51071, '26f9-200d-2640':1615, '26f9-200d-2642':1614, '26f9':1613, '26fa':4856, '26fd':4915, '270a':1354, '270b':1330, '270c':1339, '270d':1365, '270f':61258, '271d':62782, '274c':62853, '274e':62854, '2764-200d-1f525':1139, '2764-200d-1fa79':1140, '27a1':62757, '27b0':62855, '27bf':62856, '2b05':62761, '2b06':62755, '2b07':62759, '2b1b':62932, '2b1c':62933, '2b50':4994, '2b55':62849, '303d':62857, '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-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff':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-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3ff':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, '1f48f-1f3fb':0, '1f48f-1f3fc':0, '1f48f-1f3fd':0, '1f48f-1f3fe':0, '1f48f-1f3ff':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f491-1f3fb':0, '1f491-1f3fc':0, '1f491-1f3fd':0, '1f491-1f3fe':0, '1f491-1f3ff':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fe':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fe':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fe':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fe':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, '1f91d-1f3fb':0, '1f91d-1f3fc':0, '1f91d-1f3fd':0, '1f91d-1f3fe':0, '1f91d-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-200d-2640':0, '1f9d4-1f3fc-200d-2640':0, '1f9d4-1f3fd-200d-2640':0, '1f9d4-1f3fe-200d-2640':0, '1f9d4-1f3ff-200d-2640':0, '1f9d4-1f3fb-200d-2642':0, '1f9d4-1f3fc-200d-2642':0, '1f9d4-1f3fd-200d-2642':0, '1f9d4-1f3fe-200d-2642':0, '1f9d4-1f3ff-200d-2642':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}};\n\nconst Emoji: {[emoji: string]: number} = EmojiVersions[''];\nfor(const version in EmojiVersions) {\n if(version) {\n Object.assign(Emoji, EmojiVersions[version as EMOJI_VERSION]);\n }\n}\n\nexport default Emoji;\n\n/* Emoji[\"00a9-fe0f\"] = 6362;\nEmoji[\"00ae-fe0f\"] = 6363;\nEmoji[\"2122-fe0f\"] = 6364; */\n","/*\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 const FontFamily = 'Roboto, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif';\nexport const FontSize = '16px';\nexport const FontWeight = '400';\n","const IS_IMAGE_BITMAP_SUPPORTED = typeof(ImageBitmap) !== 'undefined';\n\nexport default IS_IMAGE_BITMAP_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\n// * Jolly Cobra's animation.ts\n\nimport {fastRaf} from './schedulers';\nimport deferredPromise, {CancellablePromise} from './cancellablePromise';\n\ninterface AnimationInstance {\n isCancelled: boolean;\n deferred: CancellablePromise\n}\n\ntype AnimationInstanceKey = any;\nconst instances: Map = new Map();\n\nexport function createAnimationInstance(key: AnimationInstanceKey) {\n cancelAnimationByKey(key);\n\n const instance: AnimationInstance = {\n isCancelled: false,\n deferred: deferredPromise()\n };\n\n instances.set(key, instance);\n instance.deferred.then(() => {\n if(getAnimationInstance(key) === instance) {\n instances.delete(key);\n }\n });\n\n return instance;\n}\n\nexport function getAnimationInstance(key: AnimationInstanceKey) {\n return instances.get(key);\n}\n\nexport function cancelAnimationByKey(key: AnimationInstanceKey) {\n const instance = getAnimationInstance(key);\n if(instance) {\n instance.isCancelled = true;\n instance.deferred.resolve();\n }\n}\n\nexport function animateSingle(tick: Function, key: AnimationInstanceKey, instance?: AnimationInstance) {\n if(!instance) {\n instance = createAnimationInstance(key);\n }\n\n fastRaf(() => {\n if(instance.isCancelled) {\n return;\n }\n\n if(tick()) {\n animateSingle(tick, key, instance);\n } else {\n instance.deferred.resolve();\n }\n });\n\n return instance.deferred;\n}\n\nexport function animate(tick: Function) {\n fastRaf(() => {\n if(tick()) {\n animate(tick);\n }\n });\n}\n","type K = boolean;\nexport default async function filterAsync(arr: T[], callback: (item: T, idx: number, arr: T[]) => Promise | K) {\n const promises = arr.map(async(item, idx, arr) => {\n if(await callback(item, idx, arr)) {\n return item;\n }\n });\n\n return (await Promise.all(promises)).filter(Boolean);\n}\n","export default function findAndSpliceAll(array: Array, verify: (value: T, index: number, arr: typeof array) => boolean) {\n const out: typeof array = [];\n let idx = -1;\n while((idx = array.findIndex(verify)) !== -1) {\n out.push(array.splice(idx, 1)[0]);\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\nconst ASSETS_PATH = 'assets/audio/';\n\nexport default class AudioAssetPlayer {\n private audio: HTMLAudioElement;\n private tempId: number;\n private assetName: AssetName;\n\n constructor(private assets: AssetName[]) {\n this.tempId = 0;\n }\n\n public playSound(name: AssetName, loop = false) {\n ++this.tempId;\n this.assetName = name;\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 playSoundIfDifferent(name: AssetName, loop?: boolean) {\n if(this.assetName !== name) {\n this.playSound(name, loop);\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 if(!this.audio) {\n return;\n }\n\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\nimport readBlobAs from './readBlobAs';\n\nexport default function readBlobAsDataURL(blob: Blob) {\n return readBlobAs(blob, 'readAsDataURL');\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 deferredPromise, {CancellablePromise} from './cancellablePromise';\nimport {getHeavyAnimationPromise} from '../hooks/useHeavyAnimationCheck';\nimport {fastRaf} from './schedulers';\nimport {ArgumentTypes} from '../types';\n\ntype HeavyQueue> = {\n items: ArgumentTypes[],\n process: (...args: any[]) => ReturnType,\n context: any,\n promise?: CancellablePromise[]>\n};\nconst heavyQueue: HeavyQueue[] = [];\nlet processingQueue = false;\n\nexport default function addHeavyTask>(queue: T, method: 'push' | 'unshift' = 'push') {\n if(!queue.items.length) {\n return Promise.resolve([]) as typeof promise;\n }\n\n const promise = queue.promise = deferredPromise();\n heavyQueue[method](queue);\n processHeavyQueue();\n\n return promise;\n}\n\nfunction processHeavyQueue() {\n if(!processingQueue) {\n const queue = heavyQueue.shift();\n timedChunk(queue).finally(() => {\n processingQueue = false;\n if(heavyQueue.length) {\n processHeavyQueue();\n }\n });\n }\n}\n\nfunction timedChunk>(queue: HeavyQueue) {\n if(!queue.items.length) {\n queue.promise.resolve([] as any);\n return Promise.resolve([]);\n }\n\n const todo = queue.items.slice();\n const results: ReturnType[] = [];\n\n return new Promise((resolve, reject) => {\n const f = async() => {\n const start = performance.now();\n\n do {\n await getHeavyAnimationPromise();\n const possiblePromise = queue.process.apply(queue.context, todo.shift());\n let realResult: typeof results[0];\n // @ts-ignore\n if(possiblePromise instanceof Promise) {\n try {\n realResult = await possiblePromise;\n } catch(err) {\n reject(err);\n return;\n }\n } else {\n realResult = possiblePromise;\n }\n\n results.push(realResult);\n } while(todo.length > 0 && (performance.now() - start) < 6);\n\n if(todo.length > 0) {\n fastRaf(f);\n // setTimeout(f, 25);\n } else {\n resolve(results);\n }\n };\n\n fastRaf(f);\n // setTimeout(f, 25);\n }).then(queue.promise.resolve, queue.promise.reject);\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 fastBlur from '../vendor/fastBlur';\nimport addHeavyTask from './heavyQueue';\nimport IS_CANVAS_FILTER_SUPPORTED from '../environment/canvasFilterSupport';\n\nconst RADIUS = 2;\nconst ITERATIONS = 2;\n\nlet requireBlurPromise: Promise;\nlet fastBlurFunc: typeof fastBlur;\nif(!IS_CANVAS_FILTER_SUPPORTED) {\n requireBlurPromise = import('../vendor/fastBlur').then((m) => {\n fastBlurFunc = m.default;\n });\n} else {\n requireBlurPromise = Promise.resolve();\n}\n\nfunction processBlurNext(\n img: HTMLImageElement,\n radius: number,\n iterations: number,\n canvas: HTMLCanvasElement = document.createElement('canvas')\n) {\n canvas.width = img.width;\n canvas.height = img.height;\n\n const ctx = canvas.getContext('2d', {alpha: false});\n if(IS_CANVAS_FILTER_SUPPORTED) {\n ctx.filter = `blur(${radius}px)`;\n ctx.drawImage(img, -radius * 2, -radius * 2, canvas.width + radius * 4, canvas.height + radius * 4);\n } else {\n ctx.drawImage(img, 0, 0);\n fastBlurFunc(ctx, 0, 0, canvas.width, canvas.height, radius, iterations);\n }\n\n return canvas;\n}\n\ntype CacheValue = {canvas: HTMLCanvasElement, promise: Promise};\nconst cache: Map = new Map();\nconst CACHE_SIZE = 150;\n\nexport default function blur(dataUri: string, radius: number = RADIUS, iterations: number = ITERATIONS) {\n if(!dataUri) {\n throw 'no dataUri for blur: ' + dataUri;\n }\n\n if(cache.size > CACHE_SIZE) {\n cache.clear();\n }\n\n const canvas = document.createElement('canvas');\n canvas.className = 'canvas-thumbnail';\n\n let cached = cache.get(dataUri);\n if(!cached) {\n const promise: CacheValue['promise'] = new Promise((resolve) => {\n // return resolve(dataUri);\n requireBlurPromise.then(() => {\n const img = new Image();\n img.onload = () => {\n // if(IS_CANVAS_FILTER_SUPPORTED) {\n // resolve(processBlurNext(img, radius, iterations));\n // } else {\n const promise = addHeavyTask({\n items: [[img, radius, iterations, canvas]],\n context: null,\n process: processBlurNext\n }, 'unshift');\n\n promise.then(() => {\n resolve();\n });\n // }\n };\n img.src = dataUri;\n });\n });\n\n cache.set(dataUri, cached = {\n canvas,\n promise\n });\n } else {\n canvas.width = cached.canvas.width;\n canvas.height = cached.canvas.height;\n cached.promise.then(() => {\n canvas.getContext('2d').drawImage(cached.canvas, 0, 0, canvas.width, canvas.height);\n });\n }\n\n return {\n ...cached,\n canvas\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 bytesFromHex from './bytesFromHex';\nimport bytesToDataURL from './bytesToDataURL';\nimport convertToUint8Array from './convertToUint8Array';\n\nconst JPEG_HEADER_HEX = 'ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e19282321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aadaad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c353c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc00011080000000003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00';\n\nconst JPEG_HEADER = bytesFromHex(JPEG_HEADER_HEX);\nconst JPEG_TAIL = bytesFromHex('ffd9');\n\nexport function getPreviewBytesFromURL(url: string) {\n const needle = 'base64,';\n const sliced = url.slice(url.indexOf(needle) + needle.length);\n const jpegBytes = [...atob(sliced)].map((char) => char.charCodeAt(0));\n\n return new Uint8Array(jpegBytes);\n // console.log('getPreviewBytesFromURL', bytesToHex(jpegBytes));\n\n // const n = JPEG_HEADER_HEX.slice(-10);\n // const one = jpegBytes[164];\n // const two = jpegBytes[166];\n\n // const body = jpegBytes.slice(bytesToHex(jpegBytes).indexOf(n) / 2 + n.length / 2/* JPEG_HEADER.length */, jpegBytes.length - JPEG_TAIL.length);\n // const original = new Uint8Array([\n // 0xFF,\n // one,\n // two,\n // ...body\n // ]);\n\n // console.log(bytesToHex(body));\n\n // return original;\n}\n\nexport default function getPreviewURLFromBytes(bytes: Uint8Array | number[], isSticker = false) {\n let arr: Uint8Array;\n if(!isSticker && bytes[0] === 0x1) {\n arr = new Uint8Array(JPEG_HEADER.concat(Array.from(bytes.slice(3)), JPEG_TAIL));\n arr[164] = bytes[1];\n arr[166] = bytes[2];\n } else {\n arr = convertToUint8Array(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 dataURL = bytesToDataURL(arr, mimeType);\n return dataURL;\n}\n","export default function bytesToDataURL(bytes: Uint8Array, mimeType: string = 'image/jpeg') {\n return `data:${mimeType};base64,${btoa(String.fromCharCode(...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 * 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 {makeMediaSize} from './mediaSize';\n\nexport default function calcImageInBox(imageW: number, imageH: number, boxW: number, boxH: number, noZoom = true) {\n if(imageW < boxW && imageH < boxH && noZoom) {\n return makeMediaSize(imageW, imageH);\n }\n\n let boxedImageW = boxW;\n let boxedImageH = boxH;\n\n if((imageW / imageH) > (boxW / boxH)) {\n boxedImageH = (imageH * boxW / imageW) | 0;\n } else {\n boxedImageW = (imageW * boxH / imageH) | 0;\n if(boxedImageW > boxW) {\n boxedImageH = (boxedImageH * boxW / boxedImageW) | 0;\n boxedImageW = boxW;\n }\n }\n\n // if (Config.Navigator.retina) {\n // imageW = Math.floor(imageW / 2)\n // imageH = Math.floor(imageH / 2)\n // }\n\n if(noZoom && boxedImageW >= imageW && boxedImageH >= imageH) {\n boxedImageW = imageW;\n boxedImageH = imageH;\n }\n\n return makeMediaSize(boxedImageW, boxedImageH);\n}\n\nMOUNT_CLASS_TO.calcImageInBox = calcImageInBox;\n","export default function drawCircle(ctx: CanvasRenderingContext2D, x: number, y: number, radius: number, fill?: boolean, stroke?: boolean) {\n const dpr = ctx.canvas.dpr;\n if(dpr) {\n x *= dpr;\n y *= dpr;\n radius *= dpr;\n }\n\n ctx.beginPath();\n ctx.arc(x, y, radius, 0, 2 * Math.PI, false);\n ctx.closePath();\n\n if(fill) {\n ctx.fill();\n }\n\n if(stroke) {\n ctx.stroke();\n }\n}\n\nexport function drawCircleFromStart(ctx: CanvasRenderingContext2D, x: number, y: number, radius: number, fill?: boolean, stroke?: boolean) {\n return drawCircle(ctx, x + radius, y + radius, radius, fill, stroke);\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 { MOUNT_CLASS_TO } from \"../../config/debug\";\n\nlet context: CanvasRenderingContext2D;\n/**\n * Get the text width\n * @param {string} text\n * @param {string} font\n */\nexport default function getTextWidth(text: string, font: string) {\n // const perf = performance.now();\n if(!context) {\n const canvas = document.createElement('canvas');\n context = canvas.getContext('2d', {alpha: false});\n }\n\n if(context.font !== font) {\n context.font = font;\n }\n\n // context.font = font;\n const metrics = context.measureText(text);\n // console.log('getTextWidth perf:', performance.now() - perf);\n return metrics.width;\n // return Math.round(metrics.width);\n}\n\n// MOUNT_CLASS_TO && (MOUNT_CLASS_TO.getTextWidth = getTextWidth);\n","import type {MediaSize} from '../mediaSize';\nimport IS_IMAGE_BITMAP_SUPPORTED from '../../environment/imageBitmapSupport';\n\nexport default function scaleMediaElement(options: T): Promise {\n return new Promise(async(resolve) => {\n const canvas = document.createElement('canvas');\n const size = options.size ?? options.mediaSize.aspectFitted(options.boxSize);\n const dpr = window.devicePixelRatio && 1;\n canvas.width = size.width * dpr;\n canvas.height = size.height * dpr;\n const ctx = canvas.getContext('2d');\n\n let source: CanvasImageSource;\n if(IS_IMAGE_BITMAP_SUPPORTED) {\n source = await createImageBitmap(options.media, {resizeWidth: size.width, resizeHeight: size.height});\n } else {\n source = options.media;\n }\n\n ctx.drawImage(source, 0, 0, canvas.width, canvas.height);\n\n if(IS_IMAGE_BITMAP_SUPPORTED) {\n (source as ImageBitmap)?.close();\n }\n\n const mimeType = options.mimeType ?? 'image/jpeg';\n const quality = options.quality ?? 1;\n if(options.toDataURL) {\n const url = canvas.toDataURL(mimeType, quality);\n resolve({url, size} as any);\n } else {\n canvas.toBlob((blob) => {\n resolve({blob, size} as any);\n }, mimeType, quality);\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/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport LatinizeMap from '../config/latinizeMap';\n\nexport const badCharsRe = /[`~!@#$%^&*()\\-_=+\\[\\]\\\\|{}'\";:\\/?.>,<]+/g;\nconst trimRe = /^\\s+|\\s$/g;\n\nconst C2L: {[k: string]: string} = {\n 'ะน': 'q',\n 'ั†': 'w',\n 'ัƒ': 'e',\n 'ะบ': 'r',\n 'ะต': 't',\n 'ะฝ': 'y',\n 'ะณ': 'u',\n 'ัˆ': 'i',\n 'ั‰': 'o',\n 'ะท': 'p',\n 'ั…': '[',\n 'ัŠ': ']',\n 'ั„': 'a',\n 'ั‹': 's',\n 'ะฒ': 'd',\n 'ะฐ': 'f',\n 'ะฟ': 'g',\n 'ั€': 'h',\n 'ะพ': 'j',\n 'ะป': 'k',\n 'ะด': 'l',\n 'ะถ': ';',\n 'ั': '\\'',\n 'ั': 'z',\n 'ั‡': 'x',\n 'ั': 'c',\n 'ะผ': 'v',\n 'ะธ': 'b',\n 'ั‚': 'n',\n 'ัŒ': 'm',\n 'ะฑ': ',',\n 'ัŽ': '.',\n '.': '/'\n};\n\nexport function clearBadCharsAndTrim(text: string) {\n return text.replace(badCharsRe, '').replace(trimRe, '');\n}\n\nexport function fixCyrillic(text: string) {\n return text.toLowerCase().replace(/[\\wะฐ-ั]/g, (ch) => {\n const latinizeCh = C2L[ch];\n return latinizeCh ?? ch;\n });\n}\n\nexport function latinizeString(text: string) {\n return text.replace(/[^A-Za-z0-9]/g, (ch) => {\n const latinizeCh = LatinizeMap[ch];\n return latinizeCh ?? ch;\n });\n}\n\nexport default function cleanSearchText(text: string, latinize = true) {\n return processSearchText(text, {\n clearBadChars: true,\n latinize,\n ignoreCase: true\n });\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 const originalText = text;\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 if(options.latinize) text += '\\x01' + fixCyrillic(originalText);\n return text;\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://stackoverflow.com/a/30810322\nfunction fallbackCopyTextToClipboard(text: string) {\n var textArea = document.createElement('textarea');\n textArea.value = text;\n\n // Avoid scrolling to bottom\n textArea.style.top = '0';\n textArea.style.left = '0';\n textArea.style.position = 'fixed';\n\n document.body.appendChild(textArea);\n textArea.focus();\n textArea.select();\n\n try {\n document.execCommand('copy');\n // const successful = document.execCommand('copy');\n // const msg = successful ? 'successful' : 'unsuccessful';\n // console.log('Fallback: Copying text command was ' + msg);\n } catch(err) {\n // console.error('Fallback: Oops, unable to copy', err);\n }\n\n document.body.removeChild(textArea);\n}\n\nexport function copyTextToClipboard(text: string) {\n if(!navigator.clipboard) {\n fallbackCopyTextToClipboard(text);\n return;\n }\n\n navigator.clipboard.writeText(text).catch((err) => {\n console.error('clipboard error', err);\n fallbackCopyTextToClipboard(text);\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_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport mediaSizes from './mediaSizes';\nimport OverlayClickHandler from './overlayClickHandler';\n\nclass ContextMenuController extends OverlayClickHandler {\n constructor() {\n super('menu', true);\n\n mediaSizes.addEventListener('resize', () => {\n if(this.element) {\n this.close();\n }\n\n /* if(openedMenu && (openedMenu.style.top || openedMenu.style.left)) {\n const rect = openedMenu.getBoundingClientRect();\n const {innerWidth, innerHeight} = window;\n\n console.log(innerWidth, innerHeight, rect);\n } */\n });\n }\n\n public isOpened() {\n return !!this.element;\n }\n\n private onMouseMove = (e: MouseEvent) => {\n const rect = this.element.getBoundingClientRect();\n const {clientX, clientY} = e;\n\n const diffX = clientX >= rect.right ? clientX - rect.right : rect.left - clientX;\n const diffY = clientY >= rect.bottom ? clientY - rect.bottom : rect.top - clientY;\n\n if(diffX >= 100 || diffY >= 100) {\n this.close();\n // openedMenu.parentElement.click();\n }\n // console.log('mousemove', diffX, diffY);\n };\n\n public close() {\n if(this.element) {\n this.element.classList.remove('active');\n this.element.parentElement.classList.remove('menu-open');\n }\n\n super.close();\n\n if(!IS_TOUCH_SUPPORTED) {\n window.removeEventListener('mousemove', this.onMouseMove);\n }\n }\n\n public openBtnMenu(element: HTMLElement, onClose?: () => void) {\n super.open(element);\n\n this.element.classList.add('active', 'was-open');\n this.element.parentElement.classList.add('menu-open');\n\n if(onClose) {\n this.addEventListener('toggle', onClose, {once: true});\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n window.addEventListener('mousemove', this.onMouseMove);\n }\n }\n}\n\nconst contextMenuController = new ContextMenuController();\nexport default contextMenuController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport I18n, {i18n} from '../lib/langPack';\n\nexport const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\nexport const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n\nexport const ONE_DAY = 86400;\n\n// https://stackoverflow.com/a/6117889\nexport const getWeekNumber = (date: Date) => {\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\n const dayNum = d.getUTCDay() || 7;\n d.setUTCDate(d.getUTCDate() + 4 - dayNum);\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\n return Math.ceil((((d.getTime() - yearStart.getTime()) / ONE_DAY) + 1) / 7);\n};\n\nexport function formatDateAccordingToTodayNew(time: Date) {\n const today = new Date();\n const now = today.getTime() / 1000 | 0;\n const timestamp = time.getTime() / 1000 | 0;\n\n const options: Intl.DateTimeFormatOptions = {};\n if((now - timestamp) < ONE_DAY && today.getDate() === time.getDate()) { // if the same day\n options.hour = options.minute = '2-digit';\n } else if(today.getFullYear() !== time.getFullYear()) { // different year\n options.year = options.day = 'numeric';\n options.month = '2-digit';\n } else if((now - timestamp) < (ONE_DAY * 7) && getWeekNumber(today) === getWeekNumber(time)) { // current week\n options.weekday = 'short';\n } else { // same year\n options.month = 'short';\n options.day = 'numeric';\n }\n\n return new I18n.IntlDateElement({\n date: time,\n options\n }).element;\n}\n\nexport function formatFullSentTimeRaw(timestamp: number, options: {\n capitalize?: boolean\n} = {}) {\n const date = new Date();\n const time = new Date(timestamp * 1000);\n const now = date.getTime() / 1000;\n\n const timeEl = formatTime(time);\n\n let dateEl: Node | string;\n if((now - timestamp) < ONE_DAY && date.getDate() === time.getDate()) { // if the same day\n dateEl = i18n(options.capitalize ? 'Date.Today' : 'Peer.Status.Today');\n } else if((now - timestamp) < (ONE_DAY * 2) && (date.getDate() - 1) === time.getDate()) { // yesterday\n dateEl = i18n(options.capitalize ? 'Yesterday' : 'Peer.Status.Yesterday');\n\n if(options.capitalize) {\n (dateEl as HTMLElement).style.textTransform = 'capitalize';\n }\n } else if(date.getFullYear() !== time.getFullYear()) { // different year\n dateEl = new I18n.IntlDateElement({\n date: time,\n options: {\n month: 'short',\n day: 'numeric',\n year: 'numeric'\n }\n }).element;\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate() + ', ' + time.getFullYear();\n } else {\n dateEl = new I18n.IntlDateElement({\n date: time,\n options: {\n month: 'short',\n day: 'numeric'\n }\n }).element;\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate();\n }\n\n return {dateEl, timeEl};\n}\n\nexport function formatFullSentTime(timestamp: number) {\n const {dateEl, timeEl} = formatFullSentTimeRaw(timestamp, {\n capitalize: true\n });\n\n const fragment = document.createDocumentFragment();\n fragment.append(dateEl, ' ', i18n('ScheduleController.at'), ' ', timeEl);\n return fragment;\n}\n\nexport function formatTime(date: Date) {\n return new I18n.IntlDateElement({\n date,\n options: {\n hour: '2-digit',\n minute: '2-digit'\n }\n }).element;\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.formatDateAccordingToTodayNew = formatDateAccordingToTodayNew);\n\nexport const getFullDate = (date: Date, options: Partial<{\n noTime: true,\n noSeconds: true,\n monthAsNumber: true,\n leadingZero: true\n}> = {}) => {\n const joiner = options.monthAsNumber ? '.' : ' ';\n const time = ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2) + (options.noSeconds ? '' : ':' + ('0' + date.getSeconds()).slice(-2));\n\n return (options.leadingZero ? ('0' + date.getDate()).slice(-2) : date.getDate()) +\n joiner + (options.monthAsNumber ? ('0' + (date.getMonth() + 1)).slice(-2) : months[date.getMonth()]) +\n joiner + date.getFullYear() +\n (options.noTime ? '' : ', ' + time);\n};\n\n// https://github.com/DrKLO/Telegram/blob/d52b2c921abd3c1e8d6368858313ad0cb0468c07/TMessagesProj/src/main/java/org/telegram/ui/Adapters/FiltersView.java\nconst minYear = 2013;\nconst yearPattern = new RegExp('20[0-9]{1,2}');\nconst monthYearOrDayPattern = new RegExp('(\\\\w{3,}) ([0-9]{0,4})', 'i');\nconst yearOrDayAndMonthPattern = new RegExp('([0-9]{0,4}) (\\\\w{2,})', 'i');\nconst shortDate = new RegExp('^([0-9]{1,4})(\\\\.| |/|\\\\-)([0-9]{1,4})$', 'i');\nconst longDate = new RegExp('^([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,4})$', 'i');\nconst numberOfDaysEachMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\nexport type DateData = {\n title: string,\n minDate: number,\n maxDate: number,\n};\nexport function fillTipDates(query: string, dates: DateData[]) {\n const q = query.trim().toLowerCase();\n\n if(q.length < 3) {\n return;\n }\n\n if('today'.indexOf(q) === 0) {\n const date = new Date();\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: 'Today',\n minDate,\n maxDate\n });\n return;\n }\n\n if('yesterday'.indexOf(q) === 0) {\n const date = new Date();\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime() - 86400000;\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 86400001;\n dates.push({\n title: 'Yesterday',\n minDate,\n maxDate\n });\n return;\n }\n\n const dayOfWeek = getDayOfWeek(q);\n if(dayOfWeek >= 0) {\n const date = new Date();\n const now = date.getTime();\n const currentDay = date.getDay();\n const distance = dayOfWeek - currentDay;\n date.setDate(date.getDate() + distance);\n if(date.getTime() > now) {\n date.setTime(date.getTime() - 604800000);\n }\n const year = date.getFullYear()\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: formatWeekLong(minDate),\n minDate,\n maxDate\n });\n return;\n }\n\n let matches: any[];\n if((matches = shortDate.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[3];\n const k = parseInt(g1);\n const k1 = parseInt(g2);\n if(k > 0 && k <= 31) {\n if(k1 >= minYear && k <= 12) {\n const selectedYear = k1;\n const month = k - 1;\n createForMonthYear(dates, month, selectedYear);\n return;\n } else if(k1 <= 12) {\n const day = k - 1;\n const month = k1 - 1;\n createForDayMonth(dates, day, month);\n }\n } else if(k >= minYear && k1 <= 12) {\n const selectedYear = k;\n const month = k1 - 1;\n createForMonthYear(dates, month, selectedYear);\n }\n\n return;\n }\n\n if((matches = longDate.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[3];\n const g3 = matches[5];\n if(!matches[2] === matches[4]) {\n return;\n }\n\n const day = parseInt(g1);\n const month = parseInt(g2) - 1;\n let year = parseInt(g3);\n if(year >= 10 && year <= 99) {\n year += 2000;\n }\n\n const currentYear = new Date().getFullYear();\n if(validDateForMonth(day - 1, month) && year >= minYear && year <= currentYear) {\n const date = new Date();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: formatterYearMax(minDate),\n minDate,\n maxDate\n });\n return;\n }\n\n return;\n }\n\n if((matches = yearPattern.exec(q)) !== null) {\n let selectedYear = +q;\n const currentYear = new Date().getFullYear();\n if(selectedYear < minYear) {\n selectedYear = minYear;\n for(let i = currentYear; i >= selectedYear; i--) {\n const date = new Date();\n date.setFullYear(i, 0, 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(i + 1, 0, 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: '' + i,\n minDate,\n maxDate\n });\n }\n } else if(selectedYear <= currentYear) {\n const date = new Date();\n date.setFullYear(selectedYear, 0, 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(selectedYear + 1, 0, 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: '' + selectedYear,\n minDate,\n maxDate\n });\n }\n\n return;\n }\n\n if((matches = monthYearOrDayPattern.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[2];\n const month = getMonth(g1);\n if(month >= 0) {\n const k = +g2;\n if(k > 0 && k <= 31) {\n const day = k - 1;\n createForDayMonth(dates, day, month);\n return;\n } else if(k >= minYear) {\n const selectedYear = k;\n createForMonthYear(dates, month, selectedYear);\n return;\n }\n }\n }\n\n if((matches = yearOrDayAndMonthPattern.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[2];\n const month = getMonth(g2);\n if(month >= 0) {\n const k = +g1;\n if(k > 0 && k <= 31) {\n const day = k - 1;\n createForDayMonth(dates, day, month);\n return;\n } else if(k >= minYear) {\n const selectedYear = k;\n createForMonthYear(dates, month, selectedYear);\n }\n }\n }\n}\n\nfunction createForMonthYear(dates: DateData[], month: number, selectedYear: number) {\n const currentYear = new Date().getFullYear();\n const today = Date.now();\n if(selectedYear >= minYear && selectedYear <= currentYear) {\n const date = new Date();\n date.setFullYear(selectedYear, month, 1);\n date.setHours(0, 0, 0);\n const minDate = date.getTime();\n if(minDate > today) {\n return;\n }\n date.setMonth(date.getMonth() + 1);\n const maxDate = date.getTime() - 1;\n\n dates.push({\n title: formatterMonthYear(minDate),\n minDate,\n maxDate\n });\n }\n}\n\nfunction createForDayMonth(dates: DateData[], day: number, month: number) {\n if(validDateForMonth(day, month)) {\n const currentYear = new Date().getFullYear();\n const today = Date.now();\n\n for(let i = currentYear; i >= minYear; i--) {\n if(month === 1 && day === 28 && !isLeapYear(i)) {\n continue;\n }\n\n const date = new Date();\n date.setFullYear(i, month, day + 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n if(minDate > today) {\n continue;\n }\n\n date.setFullYear(i, month, day + 2);\n date.setHours(0, 0, 0);\n const maxDate = date.getTime() - 1;\n if(i === currentYear) {\n dates.push({\n title: formatterDayMonth(minDate),\n minDate,\n maxDate\n });\n } else {\n dates.push({\n title: formatterYearMax(minDate),\n minDate,\n maxDate\n });\n }\n }\n }\n}\n\nfunction formatterMonthYear(timestamp: number) {\n const date = new Date(timestamp);\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getFullYear();\n}\n\nfunction formatterDayMonth(timestamp: number) {\n const date = new Date(timestamp);\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getDate();\n}\n\nfunction formatterYearMax(timestamp: number) {\n const date = new Date(timestamp);\n return ('0' + date.getDate()).slice(-2) + '.' + ('0' + (date.getMonth() + 1)).slice(-2) + '.' + date.getFullYear();\n}\n\nfunction formatWeekLong(timestamp: number) {\n const date = new Date(timestamp);\n return days[date.getDay()];\n}\n\nfunction validDateForMonth(day: number, month: number) {\n if(month >= 0 && month < 12) {\n if(day >= 0 && day < numberOfDaysEachMonth[month]) {\n return true;\n }\n }\n return false;\n}\n\nfunction isLeapYear(year: number) {\n return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);\n}\n\nfunction getMonth(q: string) {\n /* String[] months = new String[]{\n LocaleController.getString(\"January\", R.string.January).toLowerCase(),\n LocaleController.getString(\"February\", R.string.February).toLowerCase(),\n LocaleController.getString(\"March\", R.string.March).toLowerCase(),\n LocaleController.getString(\"April\", R.string.April).toLowerCase(),\n LocaleController.getString(\"May\", R.string.May).toLowerCase(),\n LocaleController.getString(\"June\", R.string.June).toLowerCase(),\n LocaleController.getString(\"July\", R.string.July).toLowerCase(),\n LocaleController.getString(\"August\", R.string.August).toLowerCase(),\n LocaleController.getString(\"September\", R.string.September).toLowerCase(),\n LocaleController.getString(\"October\", R.string.October).toLowerCase(),\n LocaleController.getString(\"November\", R.string.November).toLowerCase(),\n LocaleController.getString(\"December\", R.string.December).toLowerCase()\n }; */\n\n /* String[] monthsEng = new String[12];\n Calendar c = Calendar.getInstance();\n for (int i = 1; i <= 12; i++) {\n c.set(0, 0, 0, 0, 0, 0);\n c.set(Calendar.MONTH, i);\n monthsEng[i - 1] = c.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH).toLowerCase();\n } */\n\n q = q.toLowerCase();\n for(let i = 0; i < 12; i++) {\n const month = months[i].toLowerCase();\n if(month.indexOf(q) === 0) {\n return i;\n }\n }\n return -1;\n}\n\nfunction getDayOfWeek(q: string) {\n const c = new Date();\n if(q.length <= 3) {\n return -1;\n }\n\n for(let i = 0; i < 7; i++) {\n c.setDate(c.getDate() + 1);\n\n if(formatWeekLong(c.getTime()).toLowerCase().indexOf(q) === 0) {\n return c.getDay();\n }\n }\n return -1;\n}\n\nMOUNT_CLASS_TO.fillTipDates = fillTipDates;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {toastNew} from '../../components/toast';\nimport {LangPackKey} from '../../lib/langPack';\nimport {copyTextToClipboard} from '../clipboard';\nimport cancelEvent from './cancelEvent';\nimport {attachClickEvent} from './clickEvent';\n\nconst T_ME = 'https://t.me/';\nexport default function anchorCopy(options: Partial<{\n // href: string,\n mePath: string,\n username: string\n}> = {}) {\n const anchor = document.createElement('a');\n anchor.classList.add('anchor-copy');\n\n let copyWhat: string, copyText: LangPackKey = 'LinkCopied';\n if(options.mePath) {\n const href = T_ME + options.mePath;\n copyWhat = anchor.href = anchor.innerText = href;\n }\n\n if(options.username) {\n const href = T_ME + options.username;\n anchor.href = href;\n copyWhat = anchor.innerText = '@' + options.username;\n copyText = 'UsernameCopied';\n }\n\n attachClickEvent(anchor, (e) => {\n cancelEvent(e);\n copyTextToClipboard(copyWhat ?? anchor.href);\n toastNew({langPackKey: copyText});\n });\n\n return anchor;\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_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport {IS_APPLE} from '../../environment/userAgent';\nimport contextMenuController from '../contextMenuController';\nimport ListenerSetter, {ListenerOptions} from '../listenerSetter';\nimport cancelEvent from './cancelEvent';\n\nlet _cancelContextMenuOpening = false, _cancelContextMenuOpeningTimeout = 0;\nexport function cancelContextMenuOpening() {\n if(_cancelContextMenuOpeningTimeout) {\n clearTimeout(_cancelContextMenuOpeningTimeout);\n }\n\n _cancelContextMenuOpeningTimeout = window.setTimeout(() => {\n _cancelContextMenuOpeningTimeout = 0;\n _cancelContextMenuOpening = false;\n }, .4e3);\n\n _cancelContextMenuOpening = true;\n}\n\nexport function attachContextMenuListener({\n element,\n callback,\n listenerSetter,\n listenerOptions\n}: {\n element: HTMLElement,\n callback: (e: TouchEvent | MouseEvent) => void,\n listenerSetter?: ListenerSetter,\n listenerOptions?: ListenerOptions\n}) {\n const add = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, element) : element.removeEventListener.bind(element);\n\n // can't cancel further events coming after 'contextmenu' event\n if((IS_APPLE && IS_TOUCH_SUPPORTED) || listenerOptions) {\n let timeout: number;\n\n const options: EventListenerOptions = {\n ...(listenerOptions || {}),\n capture: true\n };\n\n const onCancel = () => {\n clearTimeout(timeout);\n // @ts-ignore\n remove('touchmove', onCancel, options);\n // @ts-ignore\n remove('touchend', onCancel, options);\n // @ts-ignore\n remove('touchcancel', onCancel, options);\n };\n\n add('touchstart', (e: TouchEvent) => {\n if(e.touches.length > 1) {\n onCancel();\n return;\n }\n\n add('touchmove', onCancel, options);\n add('touchend', onCancel, options);\n add('touchcancel', onCancel, options);\n\n timeout = window.setTimeout(() => {\n if(_cancelContextMenuOpening) {\n onCancel();\n return;\n }\n\n callback(e);\n onCancel();\n\n if(contextMenuController.isOpened()) {\n add('touchend', cancelEvent, {once: true}); // * fix instant closing\n }\n }, .4e3);\n }, listenerOptions);\n\n /* if(!isSafari) {\n add('contextmenu', (e: any) => {\n cancelEvent(e);\n }, {passive: false, capture: true});\n } */\n } else {\n add('contextmenu', IS_TOUCH_SUPPORTED ? (e: any) => {\n callback(e);\n\n if(contextMenuController.isOpened()) {\n add('touchend', cancelEvent, {once: true}); // * fix instant closing\n }\n } : callback, listenerOptions);\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 type GrabEvent = {x: number, y: number, isTouch?: boolean, event: TouchEvent | MouseEvent};\n\nexport default function attachGrabListeners(element: HTMLElement,\n onStart: (position: GrabEvent) => void,\n onMove: (position: GrabEvent) => void,\n onEnd?: (position: GrabEvent) => void) {\n // * Mouse\n const onMouseMove = (event: MouseEvent) => {\n onMove({x: event.pageX, y: event.pageY, event});\n };\n\n const onMouseUp = (event: MouseEvent) => {\n document.removeEventListener('mousemove', onMouseMove);\n element.addEventListener('mousedown', onMouseDown, {once: true});\n onEnd?.({x: event.pageX, y: event.pageY, event});\n };\n\n const onMouseDown = (event: MouseEvent) => {\n if(event.button !== 0) {\n element.addEventListener('mousedown', onMouseDown, {once: true});\n return;\n }\n\n onStart({x: event.pageX, y: event.pageY, event});\n onMouseMove(event);\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp, {once: true});\n };\n\n element.addEventListener('mousedown', onMouseDown, {once: true});\n\n // * Touch\n const onTouchMove = (event: TouchEvent) => {\n event.preventDefault();\n onMove({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\n };\n\n const onTouchEnd = (event: TouchEvent) => {\n document.removeEventListener('touchmove', onTouchMove);\n element.addEventListener('touchstart', onTouchStart, {passive: false, once: true});\n const touch = event.touches[0] || event.changedTouches[0];\n onEnd?.({x: touch.clientX, y: touch.clientY, isTouch: true, event});\n };\n\n const onTouchStart = (event: TouchEvent) => {\n onStart({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\n onTouchMove(event);\n\n document.addEventListener('touchmove', onTouchMove, {passive: false});\n document.addEventListener('touchend', onTouchEnd, {passive: false, once: true});\n };\n\n element.addEventListener('touchstart', onTouchStart, {passive: false, once: true});\n\n return () => {\n element.removeEventListener('mousedown', onMouseDown);\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n\n element.removeEventListener('touchstart', onTouchStart);\n document.removeEventListener('touchmove', onTouchMove);\n document.removeEventListener('touchend', onTouchEnd);\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 cancelSelection() {\n if(window.getSelection) {\n if(window.getSelection().empty) { // Chrome\n window.getSelection().empty();\n } else if(window.getSelection().removeAllRanges) { // Firefox\n window.getSelection().removeAllRanges();\n }\n // @ts-ignore\n } else if(document.selection) { // IE?\n // @ts-ignore\n document.selection.empty();\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 ListenerSetter from '../listenerSetter';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport simulateEvent from './dispatchEvent';\n\nexport const CLICK_EVENT_NAME: 'mousedown' /* | 'touchend' */ | 'click' = (IS_TOUCH_SUPPORTED ? 'mousedown' : 'click') as any;\nexport type AttachClickOptions = AddEventListenerOptions & Partial<{listenerSetter: ListenerSetter, touchMouseDown: true}>;\nexport function attachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options: AttachClickOptions = {}) {\n const add = options.listenerSetter ? options.listenerSetter.add(elem) : elem.addEventListener.bind(elem);\n const remove = options.listenerSetter ? options.listenerSetter.removeManual.bind(options.listenerSetter, elem) : elem.removeEventListener.bind(elem);\n\n options.touchMouseDown = true;\n /* if(options.touchMouseDown && CLICK_EVENT_NAME === 'touchend') {\n add('mousedown', callback, options);\n } else if(CLICK_EVENT_NAME === 'touchend') {\n const o = {...options, once: true};\n\n const onTouchStart = (e: TouchEvent) => {\n const onTouchMove = (e: TouchEvent) => {\n remove('touchmove', onTouchMove, o);\n remove('touchend', onTouchEnd, o);\n };\n\n const onTouchEnd = (e: TouchEvent) => {\n remove('touchmove', onTouchMove, o);\n callback(e);\n if(options.once) {\n remove('touchstart', onTouchStart);\n }\n };\n\n add('touchend', onTouchEnd, o);\n add('touchmove', onTouchMove, o);\n };\n\n add('touchstart', onTouchStart);\n } else {\n add(CLICK_EVENT_NAME, callback, options);\n } */\n add(CLICK_EVENT_NAME, callback, options);\n\n // @ts-ignore\n return () => remove(CLICK_EVENT_NAME, callback, options);\n}\n\nexport function detachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options?: AddEventListenerOptions) {\n // if(CLICK_EVENT_NAME === 'touchend') {\n // elem.removeEventListener('touchstart', callback, options);\n // } else {\n elem.removeEventListener(CLICK_EVENT_NAME, callback as any, options);\n // }\n}\n\nexport function simulateClickEvent(elem: HTMLElement) {\n simulateEvent(elem, CLICK_EVENT_NAME);\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_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport EventListenerBase from '../eventListenerBase';\nimport ListenerSetter from '../listenerSetter';\nimport safeAssign from '../object/safeAssign';\nimport findUpClassName from './findUpClassName';\n\nexport default class ControlsHover extends EventListenerBase<{\n toggleControls: (show: boolean) => void\n}> {\n protected hideControlsTimeout: number;\n protected controlsLocked: boolean;\n\n protected canHideControls: () => boolean;\n protected element: HTMLElement;\n protected listenerSetter: ListenerSetter;\n protected showOnLeaveToClassName: string;\n protected ignoreClickClassName: string;\n\n constructor() {\n super(false);\n this.hideControlsTimeout = 0;\n }\n\n public setup(options: {\n element: HTMLElement,\n listenerSetter: ListenerSetter,\n canHideControls?: () => boolean,\n showOnLeaveToClassName?: string,\n ignoreClickClassName?: string\n }) {\n safeAssign(this, options);\n\n const {listenerSetter, element} = this;\n\n if(IS_TOUCH_SUPPORTED) {\n listenerSetter.add(element)('click', (e) => {\n if(this.ignoreClickClassName && findUpClassName(e.target, this.ignoreClickClassName)) {\n return;\n }\n\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 = (setHideTimeout = false) => {\n if(setHideTimeout) {\n if(!this.hideControlsTimeout) {\n this.hideControlsTimeout = window.setTimeout(this.hideControls, 3e3);\n }\n\n return;\n }\n\n clearTimeout(this.hideControlsTimeout);\n this.hideControlsTimeout = 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.hideControlsTimeout) {\n clearTimeout(this.hideControlsTimeout);\n this.hideControlsTimeout = 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.hideControlsTimeout = 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 ButtonMenu, {ButtonMenuItemOptionsVerifiable} from '../../components/buttonMenu';\nimport filterAsync from '../array/filterAsync';\nimport contextMenuController from '../contextMenuController';\nimport ListenerSetter from '../listenerSetter';\nimport {getMiddleware} from '../middleware';\nimport positionMenu from '../positionMenu';\nimport {attachContextMenuListener} from './attachContextMenuListener';\n\nexport default function createContextMenu({\n buttons,\n findElement,\n listenTo,\n appendTo,\n filterButtons,\n onOpen,\n onClose,\n onBeforeOpen,\n listenerSetter: attachListenerSetter\n}: {\n buttons: T[],\n findElement?: (e: MouseEvent | TouchEvent) => HTMLElement,\n listenTo: HTMLElement,\n appendTo?: HTMLElement,\n filterButtons?: (buttons: T[]) => Promise,\n onOpen?: (target: HTMLElement) => any,\n onClose?: () => any,\n onBeforeOpen?: () => any,\n listenerSetter?: ListenerSetter\n}) {\n appendTo ??= document.body;\n\n attachListenerSetter ??= new ListenerSetter();\n const listenerSetter = new ListenerSetter();\n const middleware = getMiddleware();\n let element: HTMLElement;\n\n attachContextMenuListener({\n element: listenTo,\n callback: (e) => {\n const target = findElement ? findElement(e as any) : listenTo;\n if(!target) {\n return;\n }\n\n let _element = element;\n if(e instanceof MouseEvent || e.hasOwnProperty('preventDefault')) (e as any).preventDefault();\n if(_element && _element.classList.contains('active')) {\n return false;\n }\n if(e instanceof MouseEvent || e.hasOwnProperty('cancelBubble')) (e as any).cancelBubble = true;\n\n const r = async() => {\n await onOpen?.(target);\n\n const initResult = await init();\n if(!initResult) {\n return;\n }\n\n _element = initResult.element;\n const {cleanup, destroy} = initResult;\n\n positionMenu(e, _element);\n contextMenuController.openBtnMenu(_element, () => {\n onClose?.();\n cleanup();\n\n setTimeout(() => {\n destroy();\n }, 300);\n });\n };\n\n r();\n },\n listenerSetter: attachListenerSetter\n });\n\n const cleanup = () => {\n listenerSetter.removeAll();\n middleware.clean();\n };\n\n const destroy = () => {\n cleanup();\n attachListenerSetter.removeAll();\n };\n\n const init = async() => {\n cleanup();\n\n buttons.forEach((button) => button.element = undefined);\n const f = filterButtons || ((buttons: T[]) => filterAsync(buttons, (button) => button?.verify ? button.verify() : true));\n\n const filteredButtons = await f(buttons);\n if(!filteredButtons.length) {\n return;\n }\n\n const _element = element = await ButtonMenu({\n buttons: filteredButtons,\n listenerSetter\n });\n _element.classList.add('contextmenu');\n\n await onBeforeOpen?.();\n\n appendTo.append(_element);\n\n return {\n element: _element,\n cleanup,\n destroy: () => {\n _element.remove();\n }\n };\n };\n\n return {element, destroy};\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 {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport PopupStickers from '../../components/popups/stickers';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport rootScope from '../../lib/rootScope';\nimport createContextMenu from './createContextMenu';\nimport findUpClassName from './findUpClassName';\nimport emoticonsDropdown, {EmoticonsDropdown} from '../../components/emoticonsDropdown';\n\nexport default function createStickersContextMenu(options: {\n listenTo: HTMLElement,\n isStickerPack?: boolean,\n verifyRecent?: (target: HTMLElement) => boolean,\n appendTo?: HTMLElement,\n onOpen?: () => any,\n onClose?: () => any,\n onSend?: () => any\n}) {\n const {listenTo, isStickerPack, verifyRecent, appendTo, onOpen, onClose, onSend} = options;\n let target: HTMLElement, doc: MyDocument;\n const verifyFavoriteSticker = async(toAdd: boolean) => {\n const favedStickers = await rootScope.managers.acknowledged.appStickersManager.getFavedStickersStickers();\n if(!favedStickers.cached) {\n return false;\n }\n\n const found = (await favedStickers.result).some((_doc) => _doc.id === doc.id);\n return toAdd ? !found : found;\n };\n\n return createContextMenu({\n listenTo: listenTo,\n appendTo,\n findElement: (e) => target = findUpClassName(e.target, 'media-sticker-wrapper'),\n onOpen: async() => {\n doc = await rootScope.managers.appDocsManager.getDoc(target.dataset.docId);\n return onOpen?.();\n },\n onClose,\n buttons: [{\n icon: 'stickers',\n text: 'Context.ViewStickerSet',\n onClick: () => new PopupStickers(doc.stickerSetInput).show(),\n verify: () => !isStickerPack\n }, {\n icon: 'favourites',\n text: 'AddToFavorites',\n onClick: () => rootScope.managers.appStickersManager.faveSticker(doc.id, false),\n verify: () => verifyFavoriteSticker(true)\n }, {\n icon: 'favourites',\n text: 'DeleteFromFavorites',\n onClick: () => rootScope.managers.appStickersManager.faveSticker(doc.id, true),\n verify: () => verifyFavoriteSticker(false)\n }, {\n icon: 'delete',\n text: 'DeleteFromRecent',\n onClick: () => rootScope.managers.appStickersManager.saveRecentSticker(doc.id, true),\n verify: () => verifyRecent?.(target) ?? false\n }, {\n icon: 'mute',\n text: 'Chat.Send.WithoutSound',\n onClick: () => {\n onSend?.();\n return EmoticonsDropdown.sendDocId(doc.id, false, true);\n },\n verify: () => !!(appImManager.chat.peerId && appImManager.chat.peerId !== rootScope.myId)\n }, {\n icon: 'schedule',\n text: 'Chat.Send.ScheduledMessage',\n onClick: () => appImManager.chat.input.scheduleSending(() => appImManager.chat.input.sendMessageWithDocument(doc)),\n verify: () => !!appImManager.chat.peerId\n }]\n });\n}\n","export default function createVideo(options: {\n pip?: boolean\n} = {}) {\n const video = document.createElement('video');\n if(!options.pip) video.disablePictureInPicture = true;\n video.setAttribute('playsinline', 'true');\n return video;\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 {MOUNT_CLASS_TO} from '../../config/debug';\nimport rootScope from '../../lib/rootScope';\nimport mediaSizes from '../mediaSizes';\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', this.resetCache);\n mediaSizes.addEventListener('resize', this.resetCache);\n }\n\n protected resetCache = () => {\n this.computedStyle = undefined;\n const cache = this.cache;\n this.cache = {};\n\n for(const i in cache) {\n this.getProperty(i);\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 public getPropertyAsSize(name: CustomProperty) {\n const value = this.getProperty(name);\n let size: number;\n\n if(value[value.length - 1] === '%') {\n\n } else if(value.indexOf('rem')) {\n size = +value.replace('rem', '') * 16;\n } else {\n size = +value.replace('px', '');\n }\n\n return size;\n }\n}\n\nconst customProperties = new CustomProperties();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.customProperties = customProperties);\nexport default customProperties;\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","import encodeEntities from '../string/encodeEntities';\n\nexport default function documentFragmentToHTML(fragment: DocumentFragment) {\n return Array.from(fragment.childNodes).map((node) => {\n return node.nodeType === node.TEXT_NODE ? encodeEntities(node.textContent) : (node as Element).outerHTML;\n }).join('');\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 findUpAsChild(el: T, parent: HTMLElement): T {\n if(!el) return null;\n if(el.parentElement === parent) return el;\n\n while(el.parentElement) {\n el = el.parentElement as any;\n if(el.parentElement === parent) {\n return el;\n }\n }\n\n return null;\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 findUpAttribute(el: any, attribute: string): HTMLElement {\n return el.closest(`[${attribute}]`);\n /* if(el.getAttribute(attribute) !== null) return el; // 03.02.2020\n\n while(el.parentElement) {\n el = el.parentElement;\n if(el.getAttribute(attribute) !== null)\n return el;\n }\n return null; */\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 findUpTag(el: any, tag: string): HTMLElement {\n return el.closest(tag);\n /* if(el.tagName === tag) return el; // 03.02.2020\n\n while(el.parentElement) {\n el = el.parentElement;\n if(el.tagName === tag)\n return el;\n }\n return null; */\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 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","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findUpAsChild from './findUpAsChild';\n\nexport default function getCaretPosNew(input: HTMLElement, anchor?: boolean): ReturnType & {selection: Selection} {\n const selection = document.getSelection();\n // let {focusNode: node, focusOffset: offset} = selection;\n const node = selection[anchor ? 'anchorNode' : 'focusNode'];\n const offset = selection[anchor ? 'anchorOffset' : 'focusOffset'];\n if(!findUpAsChild(node, input) && node !== input) {\n return {selection} as any;\n }\n\n return {...getCaretPosF(input, node, offset), selection};\n}\n\nexport function getCaretPosF(input: HTMLElement, node: Node, offset: number) {\n if(node === input) {\n const childNodes = input.childNodes;\n const childNodesLength = childNodes.length;\n if(childNodesLength && offset >= childNodesLength) {\n node = childNodes[childNodesLength - 1];\n offset = (node.textContent || (node as HTMLImageElement).alt || '').length;\n } else {\n node = childNodes[offset];\n offset = 0;\n }\n }\n\n return {node: node as ChildNode, offset};\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 {MessageEntity} from '../../layer';\nimport BOM from '../string/bom';\n\nexport type MarkdownType = 'bold' | 'italic' | 'underline' | 'strikethrough' | 'monospace' | 'link' | 'mentionName' | 'spoiler'/* | 'customEmoji' */;\nexport type MarkdownTag = {\n match: string,\n entityName: Extract;\n};\n\n// https://core.telegram.org/bots/api#html-style\nexport const markdownTags: {[type in MarkdownType]: MarkdownTag} = {\n bold: {\n match: '[style*=\"bold\"], [style*=\"font-weight: 700\"], [style*=\"font-weight: 600\"], [style*=\"font-weight:700\"], [style*=\"font-weight:600\"], b, strong',\n entityName: 'messageEntityBold'\n },\n underline: {\n match: '[style*=\"underline\"], u, ins',\n entityName: 'messageEntityUnderline'\n },\n italic: {\n match: '[style*=\"italic\"], i, em',\n entityName: 'messageEntityItalic'\n },\n monospace: {\n match: '[style*=\"monospace\"], [face*=\"monospace\"], pre',\n entityName: 'messageEntityCode'\n },\n strikethrough: {\n match: '[style*=\"line-through\"], [style*=\"strikethrough\"], strike, del, s',\n entityName: 'messageEntityStrike'\n },\n link: {\n match: 'A:not(.follow)',\n entityName: 'messageEntityTextUrl'\n },\n mentionName: {\n match: 'A.follow',\n entityName: 'messageEntityMentionName'\n },\n spoiler: {\n match: '[style*=\"spoiler\"]',\n entityName: 'messageEntitySpoiler'\n }\n // customEmoji: {\n // match: '.custom-emoji',\n // entityName: 'messageEntityCustomEmoji'\n // }\n};\n\nconst tabulationMatch = '[style*=\"table-cell\"], th, td';\n\n/* export function getDepth(child: Node, container?: Node) {\n let depth = 0;\n\n do {\n if(child === container) {\n return depth;\n }\n\n ++depth;\n } while((child = child.parentNode) !== null);\n\n return depth;\n} */\n\nconst BLOCK_TAGS = new Set([\n 'DIV',\n 'P',\n 'BR',\n 'LI',\n 'SECTION',\n 'H6',\n 'H5',\n 'H4',\n 'H3',\n 'H2',\n 'H1',\n 'TR',\n 'OL',\n 'UL'\n]);\n\n// const INSERT_NEW_LINE_TAGS = new Set([\n// 'OL',\n// 'UL'\n// ]);\n\nconst BOM_REG_EXP = new RegExp(BOM, 'g');\nexport const SELECTION_SEPARATOR = '\\x01';\n\nfunction checkNodeForEntity(node: Node, value: string, entities: MessageEntity[], offset: {offset: number}) {\n const parentElement = node.parentElement;\n\n // let closestTag: MarkdownTag, closestElementByTag: Element, closestDepth = Infinity;\n for(const type in markdownTags) {\n const tag = markdownTags[type as MarkdownType];\n const closest: HTMLElement = parentElement.closest(tag.match + ', [contenteditable=\"true\"]');\n if(closest?.getAttribute('contenteditable') !== null) {\n /* const depth = getDepth(closest, parentElement.closest('[contenteditable]'));\n if(closestDepth > depth) {\n closestDepth = depth;\n closestTag = tag;\n closestElementByTag = closest;\n } */\n continue;\n }\n\n if(tag.entityName === 'messageEntityTextUrl') {\n entities.push({\n _: tag.entityName,\n url: (closest as HTMLAnchorElement).href,\n offset: offset.offset,\n length: value.length\n });\n } else if(tag.entityName === 'messageEntityMentionName') {\n entities.push({\n _: tag.entityName,\n offset: offset.offset,\n length: value.length,\n user_id: (closest as HTMLElement).dataset.follow.toUserId()\n });\n }/* else if(tag.entityName === 'messageEntityCustomEmoji') {\n entities.push({\n _: tag.entityName,\n document_id: (closest as HTMLElement).dataset.docId,\n offset: offset.offset,\n length: emoji.length\n });\n } */ else {\n entities.push({\n _: tag.entityName,\n offset: offset.offset,\n length: value.length\n });\n }\n }\n}\n\nfunction isLineEmpty(line: string[]) {\n const {length} = line;\n if(!length) {\n return true;\n }\n\n if(line[length - 1] === SELECTION_SEPARATOR && length === SELECTION_SEPARATOR.length) {\n return true;\n }\n\n return false;\n}\n\nexport default function getRichElementValue(\n node: HTMLElement,\n lines: string[],\n line: string[],\n selNode?: Node,\n selOffset?: number,\n entities?: MessageEntity[],\n offset = {offset: 0}\n) {\n if(node.nodeType === node.TEXT_NODE) { // TEXT\n let nodeValue = node.nodeValue;\n // if(nodeValue[0] === BOM) {\n nodeValue = nodeValue.replace(BOM_REG_EXP, '');\n // }\n\n /* const tabulation = node.parentElement?.closest(tabulationMatch + ', [contenteditable]');\n if(tabulation?.getAttribute('contenteditable') === null) {\n nodeValue += ' ';\n // line.push('\\t');\n // ++offset.offset;\n } */\n\n if(nodeValue) {\n if(selNode === node) {\n line.push(nodeValue.substr(0, selOffset) + SELECTION_SEPARATOR + nodeValue.substr(selOffset));\n } else {\n line.push(nodeValue);\n }\n } else if(selNode === node) {\n line.push(SELECTION_SEPARATOR);\n }\n\n if(entities && nodeValue.length && node.parentNode) {\n checkNodeForEntity(node, nodeValue, entities, offset);\n }\n\n offset.offset += nodeValue.length;\n return;\n }\n\n if(node.nodeType !== node.ELEMENT_NODE) { // NON-ELEMENT\n return;\n }\n\n const pushLine = () => {\n lines.push(line.join(''));\n line.length = 0;\n ++offset.offset;\n };\n\n const isSelected = selNode === node;\n const isBlock = BLOCK_TAGS.has(node.tagName);\n if(isBlock && (line.length || node.tagName === 'BR'/* || (BLOCK_TAGS.has(node.tagName) && lines.length) */)) {\n pushLine();\n } else {\n const alt = node.dataset.stickerEmoji || (node as HTMLImageElement).alt;\n const stickerEmoji = node.dataset.stickerEmoji;\n\n if(alt && entities) {\n checkNodeForEntity(node, alt, entities, offset);\n }\n\n if(stickerEmoji && entities) {\n entities.push({\n _: 'messageEntityCustomEmoji',\n document_id: node.dataset.docId,\n offset: offset.offset,\n length: alt.length\n });\n }\n\n if(alt) {\n line.push(alt);\n offset.offset += alt.length;\n }\n }\n\n if(isSelected && !selOffset) {\n line.push(SELECTION_SEPARATOR);\n }\n\n const isTableCell = node.matches(tabulationMatch);\n const wasEntitiesLength = entities?.length;\n const wasLinesLength = lines.length;\n let wasNodeEmpty = true;\n\n let curChild = node.firstChild as HTMLElement;\n while(curChild) {\n getRichElementValue(curChild, lines, line, selNode, selOffset, entities, offset);\n curChild = curChild.nextSibling as any;\n\n if(!isLineEmpty(line)) {\n wasNodeEmpty = false;\n }\n }\n\n // can test on text with list (https://www.who.int/initiatives/sports-and-health)\n if(wasNodeEmpty && node.textContent?.replace(/[\\r\\n]/g, '')) {\n wasNodeEmpty = false;\n }\n\n if(isSelected && selOffset) {\n line.push(SELECTION_SEPARATOR);\n }\n\n if(isTableCell && node.nextSibling && !isLineEmpty(line)) {\n line.push(' ');\n ++offset.offset;\n\n // * combine entities such as url after adding space\n if(wasEntitiesLength !== undefined) {\n for(let i = wasEntitiesLength, length = entities.length; i < length; ++i) {\n ++entities[i].length;\n }\n }\n }\n\n if(isBlock && !wasNodeEmpty) {\n pushLine();\n }\n\n if(!wasNodeEmpty && node.tagName === 'P' && node.nextSibling) {\n lines.push('');\n ++offset.offset;\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 {MOUNT_CLASS_TO} from '../../config/debug';\nimport {MessageEntity} from '../../layer';\nimport combineSameEntities from '../../lib/richTextProcessor/combineSameEntities';\nimport sortEntities from '../../lib/richTextProcessor/sortEntities';\nimport getRichElementValue, {SELECTION_SEPARATOR} from './getRichElementValue';\n\nexport function getCaretPos(field: HTMLElement) {\n const sel = window.getSelection();\n let selNode: Node;\n let selOffset: number;\n if(sel?.rangeCount) {\n const range = sel.getRangeAt(0);\n const startOffset = range.startOffset;\n if(\n range.startContainer &&\n range.startContainer == range.endContainer &&\n startOffset == range.endOffset\n ) {\n // * if focused on img, or caret has been set via placeCaretAtEnd\n const possibleChildrenFocusOffset = startOffset - 1;\n const childNodes = field.childNodes;\n if(range.startContainer === field && childNodes[possibleChildrenFocusOffset]) {\n selNode = childNodes[possibleChildrenFocusOffset];\n selOffset = 0;\n\n for(let i = 0; i < range.endOffset; ++i) {\n const node = childNodes[i];\n const value = node.nodeValue || (node as HTMLImageElement).alt;\n\n if(value) {\n selOffset += value.length;\n }\n }\n } else {\n selNode = range.startContainer;\n selOffset = startOffset;\n }\n }\n }\n\n return {node: selNode, offset: selOffset};\n}\n\nexport default function getRichValueWithCaret(\n field: HTMLElement | DocumentFragment,\n withEntities = true,\n withCaret = true\n) {\n const lines: string[] = [];\n const line: string[] = [];\n\n const {node: selNode, offset: selOffset} = !(field instanceof DocumentFragment) && withCaret && getCaretPos(field);\n\n const entities: MessageEntity[] = withEntities ? [] : undefined;\n const offset = {offset: 0};\n if(field instanceof DocumentFragment) {\n let curChild = field.firstChild as HTMLElement;\n while(curChild) {\n getRichElementValue(curChild, lines, line, selNode, selOffset, entities, offset);\n curChild = curChild.nextSibling as any;\n }\n } else {\n getRichElementValue(field, lines, line, selNode, selOffset, entities, offset);\n }\n\n if(line.length) {\n lines.push(line.join(''));\n }\n\n let value = lines.join('\\n');\n const caretPos = value.indexOf(SELECTION_SEPARATOR);\n if(caretPos !== -1) {\n value = value.substr(0, caretPos) + value.substr(caretPos + 1);\n }\n value = value.replace(/\\u00A0/g, ' ');\n\n if(entities?.length) {\n // ! cannot do that here because have the same check before the sending in RichTextProcessor.parseMarkdown\n /* const entity = entities[entities.length - 1];\n const length = value.length;\n const trimmedLength = value.trimRight().length;\n if(length !== trimmedLength) {\n entity.length -= length - trimmedLength;\n } */\n\n combineSameEntities(entities);\n sortEntities(entities);\n }\n\n return {value, entities, caretPos};\n}\n\nMOUNT_CLASS_TO.getRichValueWithCaret = getRichValueWithCaret;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getVisibleRect from './getVisibleRect';\n\nexport type ViewportSlicePart = {element: HTMLElement, rect: DOMRect, visibleRect: ReturnType}[];\n\nexport default function getViewportSlice({overflowElement, overflowRect, selector, extraSize, elements}: {\n overflowElement: HTMLElement,\n overflowRect?: DOMRectMinified,\n extraSize?: number,\n selector?: string,\n elements?: HTMLElement[]\n}) {\n // const perf = performance.now();\n overflowRect ??= overflowElement.getBoundingClientRect();\n elements ??= Array.from(overflowElement.querySelectorAll(selector));\n\n if(extraSize) {\n overflowRect = {\n top: overflowRect.top - extraSize,\n right: overflowRect.right + extraSize,\n bottom: overflowRect.bottom + extraSize,\n left: overflowRect.left - extraSize\n };\n }\n\n const invisibleTop: ViewportSlicePart = [],\n visible: typeof invisibleTop = [],\n invisibleBottom: typeof invisibleTop = [];\n let foundVisible = false;\n for(const element of elements) {\n const rect = element.getBoundingClientRect();\n const visibleRect = getVisibleRect(element, overflowElement, false, rect, overflowRect);\n\n const isVisible = !!visibleRect;\n let array: typeof invisibleTop;\n if(isVisible) {\n foundVisible = true;\n array = visible;\n } else if(foundVisible) {\n array = invisibleBottom;\n } else {\n array = invisibleTop;\n }\n\n array.push({\n element,\n rect,\n visibleRect\n });\n }\n\n // if(extraSize && visible.length) {\n // const maxTop = visible[0].rect.top;\n // const minTop = maxTop - extraSize;\n // const minBottom = visible[visible.length - 1].rect.bottom;\n // const maxBottom = minBottom + extraSize;\n\n // for(let length = invisibleTop.length, i = length - 1; i >= 0; --i) {\n // const element = invisibleTop[i];\n // if(element.rect.top >= minTop) {\n // invisibleTop.splice(i, 1);\n // visible.unshift(element);\n // }\n // }\n\n // for(let i = 0, length = invisibleBottom.length; i < length; ++i) {\n // const element = invisibleBottom[i];\n // if(element.rect.bottom <= maxBottom) {\n // invisibleBottom.splice(i--, 1);\n // --length;\n // visible.push(element);\n // }\n // }\n // }\n\n // console.log('getViewportSlice time:', performance.now() - perf);\n\n return {invisibleTop, visible, invisibleBottom};\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 windowSize from '../windowSize';\n\nexport default function getVisibleRect(\n element: HTMLElement,\n overflowElement: HTMLElement,\n lookForSticky?: boolean,\n rect: DOMRectMinified = element.getBoundingClientRect(),\n overflowRect: DOMRectMinified = overflowElement.getBoundingClientRect()\n) {\n let {top: overflowTop, right: overflowRight, bottom: overflowBottom, left: overflowLeft} = overflowRect;\n\n // * respect sticky headers\n if(lookForSticky) {\n const sticky = overflowElement.querySelector('.sticky');\n if(sticky) {\n const stickyRect = sticky.getBoundingClientRect();\n overflowTop = stickyRect.bottom;\n }\n }\n\n if(rect.top >= overflowBottom ||\n rect.bottom <= overflowTop ||\n rect.right <= overflowLeft ||\n rect.left >= overflowRight) {\n return null;\n }\n\n const overflow = {\n top: false,\n right: false,\n bottom: false,\n left: false,\n vertical: 0 as 0 | 1 | 2,\n horizontal: 0 as 0 | 1 | 2\n };\n\n const windowWidth = windowSize.width;\n const windowHeight = windowSize.height;\n\n return {\n rect: {\n top: rect.top < overflowTop && overflowTop !== 0 ? (overflow.top = true, ++overflow.vertical, overflowTop) : rect.top,\n right: rect.right > overflowRight && overflowRight !== windowWidth ? (overflow.right = true, ++overflow.horizontal, overflowRight) : rect.right,\n bottom: rect.bottom > overflowBottom && overflowBottom !== windowHeight ? (overflow.bottom = true, ++overflow.vertical, overflowBottom) : rect.bottom,\n left: rect.left < overflowLeft && overflowLeft !== 0 ? (overflow.left = true, ++overflow.horizontal, overflowLeft) : rect.left\n },\n overflow\n };\n}\n\n(window as any).getVisibleRect = getVisibleRect;\n","/*\n * 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 as any as TouchEvent) &&\n (options.verifyTouchTarget ? options.verifyTouchTarget(e) : true);\n },\n onSwipe: (xDiff, yDiff, e) => {\n xDiff *= -1;\n yDiff *= -1;\n\n if(!cancelY && Math.abs(yDiff) > 20) {\n return true;\n }\n\n if(Math.abs(xDiff) > Math.abs(yDiff)) {\n cancelEvent(e as any as Event);\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 './attachContextMenuListener';\nimport handleHorizontalSwipe, {SwipeHandlerHorizontalOptions} from './handleHorizontalSwipe';\n\nexport default function handleTabSwipe(options: SwipeHandlerHorizontalOptions) {\n return handleHorizontalSwipe({\n ...options,\n onSwipe: (xDiff, yDiff, e) => {\n xDiff *= -1;\n yDiff *= -1;\n\n if(Math.abs(xDiff) > 50) {\n options.onSwipe(xDiff, yDiff, e);\n cancelContextMenuOpening();\n\n return true;\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\nexport default function htmlToDocumentFragment(html: string | DocumentFragment) {\n if(html instanceof DocumentFragment) return html;\n const template = document.createElement('template');\n html = html.trim(); // Never return a text node of whitespace as the result\n template.innerHTML = html;\n return template.content;\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 htmlToSpan(html: string | DocumentFragment) {\n const span = document.createElement('span');\n if(typeof(html) === 'string') span.innerHTML = html;\n else span.append(html);\n return span;\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/* export function isInDOM(element: Element, parentNode?: HTMLElement): boolean {\n if(!element) {\n return false;\n }\n\n parentNode = parentNode || document.body;\n if(element === parentNode) {\n return true;\n }\n return isInDOM(element.parentNode as HTMLElement, parentNode);\n} */\nexport default function isInDOM(element: Element): boolean {\n return element?.isConnected;\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 isInputEmpty(element: HTMLElement) {\n if(element.isContentEditable || element.tagName !== 'INPUT') {\n /* const value = element.innerText;\n\n return !value.trim() && !serializeNodes(Array.from(element.childNodes)).trim(); */\n // return !getRichValueWithCaret(element, false, false).value.trim();\n return !element.textContent.trim() && !element.querySelector('.emoji, .custom-emoji, .custom-emoji-placeholder');\n } else {\n return !(element as HTMLInputElement).value.trim();\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';\nimport {IS_MOBILE, IS_APPLE} from '../../environment/userAgent';\n\nexport default function isSendShortcutPressed(e: KeyboardEvent) {\n if(e.key === 'Enter' && !IS_MOBILE && !e.isComposing) {\n /* if(e.ctrlKey || e.metaKey) {\n this.messageInput.innerHTML += '
';\n placeCaretAtEnd(this.message)\n return;\n } */\n\n if(rootScope.settings.sendShortcut === 'enter') {\n if(e.shiftKey || e.ctrlKey || e.metaKey) {\n return;\n }\n\n return true;\n } else {\n const secondaryKey = IS_APPLE ? e.metaKey : e.ctrlKey;\n if(e.shiftKey || (IS_APPLE ? e.ctrlKey : e.metaKey)) {\n return;\n }\n\n if(secondaryKey) {\n return true;\n }\n }\n }\n\n return false;\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_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 * 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 IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\n\nexport default function placeCaretAtEnd(el: HTMLElement, ignoreTouchCheck = false, focus = true) {\n if(IS_TOUCH_SUPPORTED && (!ignoreTouchCheck || (document.activeElement.tagName !== 'INPUT' && !(document.activeElement as HTMLElement).isContentEditable))) {\n return;\n }\n\n focus && el.focus();\n if(el instanceof HTMLInputElement) {\n const length = el.value.length;\n el.selectionStart = length;\n el.selectionEnd = length;\n } else {\n const range = document.createRange();\n range.selectNodeContents(el);\n range.collapse(false);\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n }\n}\n\n(window as any).placeCaretAtEnd = placeCaretAtEnd;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport whichChild from './whichChild';\n\nexport default function positionElementByIndex(element: HTMLElement, container: HTMLElement, pos: number, prevPos?: number) {\n if(prevPos === undefined) {\n prevPos = element.parentElement === container ? whichChild(element) : -1;\n }\n\n if(prevPos === pos) {\n return false;\n } else if(prevPos !== -1 && prevPos < pos) { // was higher\n pos += 1;\n }\n\n if(!pos) {\n container.prepend(element);\n } else if(container.childElementCount > pos) {\n container.insertBefore(element, container.children[pos]);\n } else {\n container.append(element);\n }\n\n return true;\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 onMediaLoad from '../onMediaLoad';\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?: () => void,\n useCache = true\n) {\n if(!url) {\n console.error('renderImageFromUrl: no url?', elem, url);\n callback?.();\n return;\n }\n\n const isVideo = elem instanceof HTMLVideoElement;\n if(((loadedURLs[url]/* && false */) && useCache) || isVideo) {\n if(elem) {\n set(elem, url);\n }\n\n if(callback) {\n if(isVideo) {\n onMediaLoad(elem).then(callback);\n } else {\n callback?.();\n }\n // callback && getHeavyAnimationPromise().then(() => callback());\n }\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\n const onLoad = () => {\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?.();\n\n loader.removeEventListener('error', onError);\n };\n\n const onError = (err: ErrorEvent) => {\n console.error('Render image from url failed:', err, url, loader);\n loader.removeEventListener('load', onLoad);\n callback?.();\n };\n\n loader.addEventListener('load', onLoad, {once: true});\n loader.addEventListener('error', onError, {once: true});\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","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport sequentialDom from '../sequentialDom';\nimport {renderImageFromUrlPromise} from './renderImageFromUrl';\n\nexport default function renderMediaWithFadeIn(\n container: HTMLElement,\n media: Parameters[0],\n url: string,\n needFadeIn: boolean,\n aspecter = container,\n thumbImage?: HTMLElement\n) {\n if(needFadeIn) {\n media.classList.add('fade-in');\n }\n\n const promise = renderImageFromUrlPromise(media, url).then(() => {\n return sequentialDom.mutateElement(container, () => {\n aspecter.append(media);\n\n if(needFadeIn) {\n media.addEventListener('animationend', () => {\n sequentialDom.mutate(() => {\n media.classList.remove('fade-in');\n thumbImage?.remove();\n });\n }, {once: true});\n } else {\n thumbImage?.remove();\n }\n });\n });\n\n // recordPromise(promise, 'renderImageWithFadeIn');\n\n return promise;\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 replaceContent(elem: HTMLElement, node: string | Node) {\n if(typeof(node) === 'string') {\n elem.innerHTML = node;\n return;\n }\n\n // * children.length doesn't count text nodes\n const firstChild = elem.firstChild;\n if(firstChild) {\n if(elem.lastChild === firstChild) {\n firstChild.replaceWith(node);\n } else {\n elem.textContent = '';\n elem.append(node);\n }\n } else {\n elem.append(node);\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 clamp from '../number/clamp';\nimport findUpAsChild from './findUpAsChild';\nimport whichChild from './whichChild';\n\nexport default function compareNodes(node1: ChildNode, node1Offset: number, node2: ChildNode, node2Offset: number) {\n let diff: number;\n if(node1 === node2) {\n diff = node1Offset - node2Offset;\n } else if(node1.parentElement === node2.parentElement) {\n diff = whichChild(node1, true) - whichChild(node2, true);\n } else {\n const parents: HTMLElement[] = [];\n let parentElement = node1.parentElement;\n do {\n parents.push(parentElement);\n } while(parentElement = parentElement.parentElement);\n\n parentElement = node2.parentElement;\n do {\n if(parents.includes(parentElement)) {\n break;\n }\n } while(parentElement = parentElement.parentElement);\n\n const commonAncestorContainer = parentElement;\n // const range = document.createRange();\n // range.setStart(node1, 0);\n // range.setEnd(node2, node2.textContent.length);\n // const {commonAncestorContainer} = range;\n node1 = findUpAsChild(node1 as HTMLElement, commonAncestorContainer as HTMLElement);\n node2 = findUpAsChild(node2 as HTMLElement, commonAncestorContainer as HTMLElement);\n diff = whichChild(node1, true) - whichChild(node2, true);\n }\n\n return clamp(diff, -1, 1);\n}\n\n(window as any).compareNodes = compareNodes;\n","/*\n * 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_FIREFOX} from '../../environment/userAgent';\nimport {logger} from '../../lib/logger';\nimport {isCustomFillerNeededBySiblingNode} from '../../lib/richTextProcessor/wrapRichText';\nimport ListenerSetter from '../listenerSetter';\nimport BOM from '../string/bom';\nimport compareNodes from './compareNodes';\nimport getCaretPosNew from './getCaretPosNew';\nimport placeCaretAtEnd from './placeCaretAtEnd';\nimport whichChild from './whichChild';\n\nconst NOT_ONLY_BOMS_REG_EXP = new RegExp(`[^${BOM}]`);\n\nexport const USING_BOMS = false;\n\nexport default class RichInputHandler {\n private static INSTANCE: RichInputHandler;\n\n private listenerSetter: ListenerSetter;\n\n private lastNode: Node;\n private lastOffset: number;\n private savedRanges: WeakMap;\n\n private log: ReturnType;\n\n private inputCaptureCallbacks: Function[];\n\n constructor() {\n this.log = logger('RICH-INPUT');\n this.listenerSetter = new ListenerSetter();\n this.savedRanges = new WeakMap();\n\n this.listenerSetter.add(document)('selectionchange', this.saveSelectionOnChange);\n if(USING_BOMS) {\n this.listenerSetter.add(document)('focusout', this.onFocusOut);\n this.listenerSetter.add(document)('selectionchange', this.onSelectionChange);\n this.listenerSetter.add(document)('beforeinput', this.onBeforeInput);\n this.listenerSetter.add(document)('keydown', this.onKeyDown, {capture: true});\n\n if(IS_FIREFOX) {\n this.inputCaptureCallbacks = [];\n this.listenerSetter.add(document)('input', () => {\n this.inputCaptureCallbacks.forEach((callback) => callback());\n this.inputCaptureCallbacks.length = 0;\n }, {capture: true});\n }\n }\n }\n\n private get input() {\n const selection = document.getSelection();\n const {anchorNode: node} = selection;\n if(!node) return;\n return ((node as HTMLElement).closest ? node as HTMLElement : node.parentElement).closest('[contenteditable=\"true\"]');\n }\n\n private saveRangeForElement(element: HTMLElement) {\n if(element && (element.isContentEditable || element.tagName === 'INPUT')) {\n const selection = document.getSelection();\n if(selection.rangeCount) {\n this.savedRanges.set(element as HTMLElement, document.getSelection().getRangeAt(0));\n }\n }\n }\n\n private saveSelectionOnChange = (e: Event) => {\n const element = document.activeElement as HTMLElement; // e.target as HTMLElement;\n this.saveRangeForElement(element);\n };\n\n private onFocusOut = (e: FocusEvent) => {\n this.lastNode = this.lastOffset = undefined;\n };\n\n private findPreviousSmthIndex(input: HTMLElement, node: ChildNode, something?: NodeListOf) {\n // node = this.getFiller(node);\n // const childNodes = Array.from(node.parentElement.childNodes);\n // fillerIndex = childNodes.indexOf(node);\n // let smthIndex = -1;\n // for(let i = fillerIndex; i >= 0; --i) {\n // const node = childNodes[i];\n // if((node as HTMLElement)?.classList?.contains('input-something')) {\n // smthIndex = i;\n // break;\n // }\n // }\n // return smthIndex;\n\n const elements = Array.from(something ?? input.querySelectorAll('.input-something'));\n const index = elements.findIndex((element) => compareNodes(element, 0, node, 0) >= 0);\n return index === -1 ? elements.length - 1 : Math.max(0, index - 1);\n }\n\n private superMove(\n input: HTMLElement,\n caret: ReturnType,\n toLeft: boolean,\n fromSelectionChange: boolean\n ) {\n const {node, offset, move} = caret;\n const something = input.querySelectorAll('.input-something');\n const smthIndex = this.findPreviousSmthIndex(input, node, something);\n const r = document.createRange();\n r[toLeft ? 'setEnd' : 'setStart'](node, offset);\n\n if(fromSelectionChange) {\n move(toLeft);\n }\n\n const c = this.getCaretPosN();\n if(c.node?.nodeValue === BOM && (!fromSelectionChange || node === this.lastNode)) {\n const idx = this.findPreviousSmthIndex(input, c.node, something);\n\n let moved = !fromSelectionChange;\n\n do {\n const c = this.getCaretPosN();\n const idxidx = this.findPreviousSmthIndex(input, c.node, something);\n r[toLeft ? 'setStart' : 'setEnd'](c.node, c.offset);\n const rangeString = r.toString();\n const onlyBOMs = !NOT_ONLY_BOMS_REG_EXP.test(rangeString);\n this.log('test cursor', rangeString, onlyBOMs, idx, idxidx);\n if(\n onlyBOMs &&\n c.node?.nodeValue === BOM &&\n idxidx === idx &&\n // (idxidx > 1 || c.offset) &&\n // (idxidx < (getFiller(c.node).parentElement.childNodes.length - 2) || c.offset < BOM.length)\n (idxidx || c.offset) &&\n (idxidx < (something.length - 1) || c.offset < BOM.length)\n ) {\n move(toLeft);\n moved = true;\n } else if(!moved) {\n break;\n } else {\n if((!this.getFiller(node as HTMLElement).classList.contains('input-filler-text') && idx !== smthIndex) || c.offset === BOM.length) {\n move(!toLeft);\n }\n\n break;\n }\n } while(true);\n }\n }\n\n private onSelectionChange = (e: Event) => {\n const {input} = this;\n if(!input) {\n this.setSelectionClassName(document.getSelection());\n return;\n }\n\n // return;\n\n // this.log('selectionchange', document.getSelection(), document.getSelection().rangeCount && document.getSelection().getRangeAt(0), getCaretPosN());\n // let {node, offset} = getCaretPos(this.messageInput);\n\n let caret = this.getCaretPosN();\n do {\n const {node, offset, selection, move} = caret;\n\n const nodeValue = node?.nodeValue;\n // if(!nodeValue?.includes(BOM)) {\n if(nodeValue !== BOM || !this.lastNode) {\n break;\n }\n\n // node = getFiller(node);\n\n // const childIndex = whichChild(getFiller(node), true);\n // let toLeft: boolean;\n // // if(node === lastNode) toLeft = lastOffset >= offset;\n // if(node === lastNode) toLeft = lastOffset > offset;\n // else {\n // // toLeft = whichChild(getFiller(lastNode)) > childIndex;\n // toLeft = (lastNode.nodeValue === BOM ? whichChild(getFiller(lastNode), true) : whichChild(findUpAsChild(lastNode as any, getFiller(node).parentElement), true)) > childIndex;\n // }\n\n const toLeft = compareNodes(node, offset, this.lastNode as ChildNode, this.lastOffset) < 0;\n\n // const childNodes = Array.from(node.parentElement.childNodes);\n // if(toLeft) {\n // for(let i = childIndex; i >= 0; --i) {\n // const sibling = childNodes[i];\n // const {textContent} = sibling;\n // for()\n // }\n // }\n\n // {\n // if(toLeft === undefined) {\n // return;\n // }\n\n // const selection = window.getSelection();\n // selection.modify(selection.isCollapsed ? 'move' : 'extend', toLeft ? 'backward' : 'forward', 'character');\n // return;\n // }\n\n // const parent = getFiller(node);\n if(toLeft !== undefined) {\n // let newNode = toLeft ? parent.previousSibling : parent.nextSibling;\n if(selection.isCollapsed) {\n this.superMove(input, caret, toLeft, true);\n\n // if(offset === BOM.length) {\n // newNode = toLeft ? newNode.nextSibling.nextSibling : parent.previousSibling.previousSibling;\n // }\n\n // setCaretAt(newNode);\n } else {\n selection.modify(selection.isCollapsed ? 'move' : 'extend', toLeft ? 'backward' : 'forward', 'character');\n // const range = selection.getRangeAt(0);\n\n // if(toLeft) {\n // newNode = parent.previousSibling.previousSibling.firstChild;\n // const value = newNode.nodeValue;\n // range.setStart(newNode, value?.length);\n // } else {\n // newNode = parent.nextSibling.nextSibling.firstChild;\n // range.setEnd(newNode, 0);\n // }\n }\n }\n\n this.log('selectionchange',\n node,\n offset,\n this.lastNode,\n this.lastOffset,\n node === this.lastNode,\n whichChild(this.getFiller(node)),\n whichChild(this.getFiller(this.lastNode)),\n toLeft,\n selection,\n document.getSelection(),\n document.getSelection().getRangeAt(0),\n node?.parentNode,\n this.lastNode?.parentNode\n );\n\n caret = this.getCaretPosN();\n this.lastNode = node;\n this.lastOffset = offset;\n\n break;\n\n // if(findPreviousSmthIndex(caret.node) !== smthIndex) {\n // break;\n // }\n } while(true);\n\n this.lastNode = this.lastOffset = undefined;\n\n // if(offset === BOM.length) {\n // setCaretAt(parent);\n // } else {\n // setCaretAt(parent.nextSibling);\n // }\n\n this.setSelectionClassName(caret.selection, input);\n };\n\n public restoreSavedRange(input: HTMLElement) {\n const range = this.getSavedRange(input);\n if(!range) {\n return false;\n }\n\n const selection = window.getSelection();\n selection.removeAllRanges();\n selection.addRange(range);\n\n return true;\n }\n\n public getSavedRange(input: HTMLElement) {\n return this.savedRanges.get(input);\n }\n\n public makeFocused(input: HTMLElement) {\n if(document.activeElement !== input && !this.restoreSavedRange(input)) {\n placeCaretAtEnd(input, false, false);\n }\n }\n\n private fixInsertedLineBreaks(input: HTMLElement) {\n input.querySelectorAll('br').forEach((br) => {\n br.classList.add('br-not-br');\n });\n }\n\n private fixBuggedCaret() {\n const selection = document.getSelection();\n const range = selection.getRangeAt(0);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n\n public onBeforeInput = (e: Pick) => {\n const {input, log} = this;\n if(!input) {\n return;\n }\n\n const addInputCallback = this.addInputCallback.bind(this, input);\n\n const caretPos = this.getCaretPosN();\n let {node, offset, selection, move} = caretPos;\n log('beforeinput', e, node, offset, selection, caretPos);\n this.lastNode = this.lastOffset = undefined;\n\n if(e.inputType.startsWith('delete')) { // delete current BOM\n addInputCallback(() => {\n this.processEmptiedFillers(input);\n this.removeExtraBOMs(input);\n this.fixInsertedLineBreaks(input);\n });\n\n if(node?.nodeValue === BOM && selection.isCollapsed && e.inputType.includes('deleteContent')) {\n const toLeft = e.inputType.includes('Backward');\n const moveFirst = (offset === BOM.length && toLeft) || (!offset && !toLeft);\n this.superMove(input, caretPos, toLeft, moveFirst);\n // if((offset === BOM.length && toLeft) || (!offset && !toLeft)) {\n // move(toLeft);\n // }\n\n // addInputCallback(() => {\n // removePossibleBOMSiblingsByNode(getFiller(node));\n // });\n\n // if(node.parentNode.childNodes.length === 1) {\n // (node.parentNode as HTMLElement).remove();\n // move(e.inputType.includes('Backward') ? false : true);\n // } else {\n // move(e.inputType.includes('Backward') ? true : false);\n // addInputCallback(() => {\n // move(e.inputType.includes('Backward') ? false : true);\n // });\n // }\n\n // for(let i = 0, length = BOM.length + (direction === 'backward' ? offset : BOM.length - offset); i < length; ++i) {\n // selection.modify('extend', direction, 'character');\n // }\n\n // selection.modify('extend', direction, 'character');\n // selection.modify('extend', direction, 'character');\n\n // selection.deleteFromDocument();\n // e.preventDefault();\n } else {\n // const filler = getFiller(node);\n // if(filler?.classList?.contains('input-filler-text')) {\n // const {previousSibling, nextSibling} = filler;\n // addInputCallback(() => {\n // if(!filler.isConnected) {\n // removePossibleBOMSiblings(previousSibling, nextSibling);\n // }\n // // removeExtraBOMs();\n // // processEmptiedFillers();\n // });\n // }\n // addInputCallback(() => {\n // this.fixInsertedLineBreaks(input);\n // });\n }\n } else if(e.inputType.startsWith('insert')) { // clear current BOM\n if((node as HTMLElement)?.classList?.contains('input-something')/* || (node.textContent === BOM && offset === BOM.length) */) {\n node = node.previousSibling.firstChild;\n const range = selection.getRangeAt(0);\n range.setStart(node, 0);\n range.setEnd(node, 0);\n range.collapse(true);\n // selection.modify('move', 'backward', 'character');\n\n const c = this.getCaretPosN();\n node = c.node;\n selection = c.selection;\n offset = c.offset;\n }\n if(node && node.textContent === BOM && offset === BOM.length) {\n // const range = selection.getRangeAt(0);\n // range.setStart(node, 0);\n // range.setEnd(node, 0);\n // range.collapse(true);\n selection.modify('move', 'backward', 'character');\n\n const c = this.getCaretPosN();\n node = c.node;\n selection = c.selection;\n offset = c.offset;\n }\n // if(node && node.textContent === BOM && offset === 0) {\n // selection.modify('move', 'forward', 'character');\n // offset = BOM.length;\n // }\n\n if(e.inputType === 'insertLineBreak' || true) {\n // const appendix = 'X';\n // const textNode = document.createTextNode(appendix);\n // if(node.parentElement !== this.messageInput) node.parentElement.after(textNode);\n // else node.after(textNode);\n // selection.modify('move', 'forward', 'character');\n // selection.modify('move', 'forward', 'character');\n // addInputCallback(() => {\n // textNode.remove();\n // });\n\n /* if(node?.nodeValue === BOM) */ {\n // const parent = node.parentElement;\n // parent.contentEditable = 'false';\n // addInputCallback(() => {\n // parent.contentEditable = 'inherit';\n // });\n // node.parentElement.remove();\n\n // const textNode = document.createTextNode(appendix);\n // if(node.parentElement !== this.messageInput) node.parentElement.after(textNode);\n // else node.after(textNode);\n // // selection.modify('move', 'forward', 'character');\n // // selection.modify('move', 'forward', 'character');\n // addInputCallback(() => {\n // textNode.remove();\n // });\n\n // fix case when focused somehow on span instead of text node\n if(node && node.nodeType === node.ELEMENT_NODE) {\n node = node.firstChild;\n log.warn('fixing focus on span');\n }\n\n const isBOM = node?.nodeValue === BOM;\n log('inserting line break', isBOM, node, `\"${node?.nodeValue}\"`, node?.parentElement ? Array.from(node.parentElement.childNodes).slice() : []);\n if(isBOM) {\n // (node as ChildNode).replaceWith(this.messageInput.querySelector('.lol'));\n\n const parentElement = node.parentElement;\n parentElement.classList.replace('input-filler', 'input-filler-text');\n const childNodesLength = parentElement.childNodes.length;\n addInputCallback(() => {\n const newChildNodesLength = parentElement.childNodes.length;\n if(newChildNodesLength > 1/* && newChildNodesLength !== childNodesLength */) {\n log('inserting line break, remove');\n node = Array.from(parentElement.childNodes).find((node) => node.nodeValue === BOM);\n (parentElement as any).t = node;\n // node?.remove();\n\n // const n = parentElement.firstChild;\n // const range = selection.getRangeAt(0);\n // range.setStart(n, n.nodeValue.length);\n // range.setEnd(n, n.nodeValue.length);\n } else if(node.nodeValue !== BOM) {\n log('inserting line break, deleteData');\n (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // node = document.createTextNode(BOM);\n }\n\n this.fixInsertedLineBreaks(input);\n // (parentElement as any).t = node;\n // node.remove();\n });\n // addInputCallback(() => {\n // node.parentElement.classList.replace('input-filler', 'input-filler3');\n // const s = document.createElement('span');\n // s.style.display = 'none';\n // node.replaceWith(s);\n // s.prepend(node);\n // });\n } else if(e.inputType === 'insertLineBreak') {\n addInputCallback(() => {\n this.fixInsertedLineBreaks(input);\n });\n // const range = selection.getRangeAt(0);\n // this.messageInput.querySelectorAll('.input-something').forEach((el) => {\n // el.contentEditable = 'inherit';\n // });\n\n // addInputCallback(() => {\n // this.messageInput.querySelectorAll('.input-something').forEach((el) => {\n // el.contentEditable = 'false';\n // });\n\n // selection.removeAllRanges();\n // selection.addRange(range);\n // }, false);\n }/* else if(node &&\n node.nodeType === node.TEXT_NODE &&\n node.nodeValue.length === offset) {\n\n } */\n\n // if(e.inputType === 'insertLineBreak') {\n // e.preventDefault();\n // document.execCommand('insertHTML', false, '\\n');\n\n // this.messageInputField.simulateInputEvent();\n // }\n\n // node.parentElement.replaceWith(node);\n // selection.removeAllRanges();\n // const range = new Range();\n // range.setStart(node, 0);\n // range.setEnd(node, node.nodeValue.length);\n // selection.addRange(range);\n // node.parentElement.classList.remove('input-filler');\n // node.parentElement\n }\n\n // document.execCommand('insertHTML', false, '\\n');\n // e.preventDefault();\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // if(node?.nodeValue === BOM) {\n // addInputCallback(() => {\n // node.remove();\n // });\n // }\n // this.messageInputField.simulateInputEvent();\n\n // this.messageInput.querySelectorAll('.input-something').forEach((el) => {\n // el.contentEditable = 'inherit';\n // });\n // addInputCallback(() => {\n // this.messageInput.querySelectorAll('.input-something').forEach((el) => {\n // el.contentEditable = 'false';\n // });\n // });\n return;\n }\n\n if(node?.nodeValue === BOM) {\n // node.nodeValue = ''; // ! will move cursor forward\n // addInputCallback(() => {\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // });\n\n if(e.inputType === 'insertLineBreak') {\n if(offset === BOM.length) {\n selection.modify('move', 'backward', 'character');\n }\n\n // if(offset !== BOM.length) {\n // selection.modify('move', 'forward', 'character');\n // }\n\n addInputCallback(() => {\n node.remove();\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // selection.modify('move', 'forward', 'character');\n\n setTimeout(() => {\n selection.modify('move', 'forward', 'character');\n }, 0);\n });\n }\n\n // node.parentElement.replaceWith(node);\n\n // node.parentElement.replaceWith(node);\n if(e.inputType === 'insertLineBreak') {\n // const previousParentSibling = node.parentNode.previousSibling;\n // addInputCallback(() => {\n // if(previousParentSibling.nextSibling.nodeValue === '\\n') {\n // previousParentSibling.nextSibling.remove();\n\n // setTimeout(() => {\n // // selection.modify('move', 'forward', 'character');\n // // selection.modify('move', 'forward', 'character');\n // }, 0);\n // } else {\n // previousParentSibling.nextSibling.nodeValue = previousParentSibling.nextSibling.nodeValue.replace('\\n\\n', '\\n');\n // }\n // });\n } else {\n // if(node.parentElement !== this.messageInput) {\n // node.parentElement.replaceWith(node);\n // }\n\n // setTimeout(() => {\n // this.log(JSON.stringify(node.parentElement.innerHTML));\n // node.nodeValue = node.nodeValue.replace(BOM, '');\n // // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // this.log(JSON.stringify(node.parentElement.innerHTML));\n // }, 1000);\n\n addInputCallback(() => {\n (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n if(!node.nodeValue) {\n node.remove();\n }\n\n // selection.modify('move', 'forward', 'character');\n });\n }\n\n if(selection.isCollapsed && false) {\n node.parentElement.replaceWith(node);\n // const textNode = document.createTextNode(BOM);\n // (node.parentNode as any as ChildNode).after(textNode);\n // setCaretAt(textNode.nextSibling);\n // selection.modify('move', 'forward', 'character');\n node.remove();\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // selection.modify('move', 'forward', 'character');\n // selection.collapseToEnd();\n\n // addInputCallback(() => {\n // (textNode as CharacterData).deleteData(textNode.nodeValue.indexOf(BOM), BOM.length);\n // node.parentElement.remove();\n // });\n }\n } else if(e.inputType === 'insertLineBreak' &&\n node &&\n node.nodeType === node.TEXT_NODE &&\n node.nodeValue.length === offset) {\n log('inserting line break');\n // const appendix = '\\x01';\n\n input.querySelectorAll('.input-something').forEach((el) => {\n el.contentEditable = 'inherit';\n });\n addInputCallback(() => {\n input.querySelectorAll('.input-something').forEach((el) => {\n el.contentEditable = 'false';\n });\n });\n\n // const textNode = document.createTextNode(appendix);\n // if(node.parentElement !== this.messageInput) node.parentElement.after(textNode);\n // else node.after(textNode);\n // // selection.modify('move', 'forward', 'character');\n // addInputCallback(() => {\n // textNode.remove();\n // });\n\n // const offset = node.nodeValue.length;\n // (node as CharacterData).insertData(offset, appendix);\n // addInputCallback(() => {\n // selection.modify('move', 'forward', 'character');\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(appendix), appendix.length);\n // if(!node.nodeValue) {\n // node.remove();\n // }\n // });\n }\n } else if(e.inputType === 'historyUndo') { // have to remove extra BOMs\n addInputCallback(() => {\n this.processFilledFillers(input);\n this.processEmptiedFillers(input);\n this.removeExtraBOMs(input);\n this.removeEmptyTextNodes(input);\n\n // ! lol what, caret will be at the wrong position, have to set it to the same\n this.fixBuggedCaret();\n\n // lol\n // this.messageInput.querySelectorAll('.has-text').forEach((el) => {\n // if(el.textContent === BOM) {\n // el.firstElementChild.replaceWith(el.firstElementChild.firstChild);\n // el.classList.replace('input-filler3', 'input-filler');\n // }\n // });\n });\n } else if(e.inputType === 'historyRedo') {\n // if(node?.nodeValue === BOM && offset === BOM.length) {\n // selection.modify('move', 'backward', 'character');\n // }\n\n addInputCallback(() => {\n this.processFilledFillers(input);\n this.processEmptiedFillers(input);\n\n // fix contenteditable attribute\n input.querySelectorAll('.input-something:not([contenteditable])').forEach((el) => {\n el.contentEditable = 'false';\n });\n\n this.removeExtraBOMs(input);\n\n // ! lol what, caret will be at the wrong position, have to set it to the same\n this.fixBuggedCaret();\n });\n }\n };\n\n private onKeyDown = (e: KeyboardEvent) => {\n const key = e.key;\n\n // // have to ignore line up and down\n if(key === 'ArrowDown' || key === 'ArrowUp') {\n this.lastNode = this.lastOffset = undefined;\n } else {\n const {node, offset} = this.getCaretPosN();\n this.lastNode = node/* getFiller(node) */, this.lastOffset = offset;\n if(this.lastNode === this.input) {\n this.lastNode = this.lastOffset = undefined;\n }\n }\n\n this.log('keydown', this.lastNode, this.lastNode?.parentNode, this.lastOffset, this.getCaretPosN(), e);\n };\n\n private addInputCallback(input: HTMLElement, callback: () => void, capture = true) {\n const newCallback = () => {\n this.log('input modify callback');\n callback();\n };\n\n if(capture && IS_FIREFOX) this.inputCaptureCallbacks.push(newCallback);\n else this.listenerSetter.add(input)('input', newCallback, {once: true, capture});\n }\n\n public removeExtraBOMs(input: HTMLElement) {\n const c = (sibling: ChildNode) => {\n return (sibling as HTMLElement)?.classList?.contains('input-something');\n };\n\n input.querySelectorAll('.input-filler').forEach((el) => {\n const {previousSibling, nextSibling} = el;\n let needed = false;\n\n // if(!(previousSibling as HTMLElement)?.classList?.contains('input-filler') && isCustomFillerNeededBySiblingNode(previousSibling)) {\n if(!(nextSibling as HTMLElement)?.classList?.contains('input-filler') && isCustomFillerNeededBySiblingNode(nextSibling)) {\n needed = c(previousSibling) || c(nextSibling);\n }\n\n if(!needed) {\n this.log.warn('removing empty bom node', el);\n el.remove();\n }\n });\n }\n\n private getFiller(node: Node) {\n return node && node.nodeType === node.TEXT_NODE && node.parentElement !== this.input ? node.parentElement : node as HTMLElement;\n }\n\n private getCaretPosN() {\n const ret = getCaretPosNew(this.input);\n // const {node} = ret;\n // if((node as HTMLElement)?.classList?.contains('input-something')) {\n // ret.node = node.previousSibling;\n // ret.offset = ret.node.textContent.length;\n // }\n\n return {...ret, move: this.move.bind(this, ret.selection)};\n }\n\n private removeEmptyTextNodes(input: HTMLElement) {\n const {log} = this;\n // let i = -1;\n // remove empty text nodes\n const treeWalker = document.createTreeWalker(\n input,\n NodeFilter.SHOW_TEXT,\n {acceptNode: (node) => node.parentElement === input && !node.nodeValue/* && !++i */ ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT}\n );\n\n let textNode: Text;\n while(textNode = treeWalker.nextNode() as Text) {\n log.warn('removing empty text node', textNode);\n textNode.remove();\n }\n }\n\n private removePossibleBOMSiblings(previousSibling: ChildNode, nextSibling: ChildNode) {\n [previousSibling, nextSibling].forEach((sibling) => {\n if((sibling as HTMLElement)?.classList?.contains('input-filler')) {\n sibling.remove();\n }\n });\n }\n\n private removePossibleBOMSiblingsByNode(node: ChildNode) {\n const {previousSibling, nextSibling} = node;\n this.removePossibleBOMSiblings(previousSibling, nextSibling);\n };\n\n private processEmptiedFillers(input: HTMLElement) {\n input.querySelectorAll('.input-filler-text').forEach((el) => {\n this.removeExtraBOMs(el);\n\n let cleanSiblings = true;\n if(!el.textContent) {\n el.classList.replace('input-filler-text', 'input-filler');\n\n const textNode = Array.from(el.childNodes).find((node) => node.nodeType === node.TEXT_NODE);\n if(textNode) {\n (textNode as CharacterData).insertData(0, BOM);\n } else if(((el as any).t as ChildNode)?.nodeValue) {\n el.append((el as any).t);\n } else {\n el.append(document.createTextNode(BOM));\n }\n } else if(!NOT_ONLY_BOMS_REG_EXP.test(el.textContent) && !el.querySelector('.input-something')) {\n el.classList.replace('input-filler-text', 'input-filler');\n } else {\n cleanSiblings = false;\n }\n\n if(cleanSiblings) {\n this.removePossibleBOMSiblingsByNode(el);\n }\n });\n }\n\n private processFilledFillers(input: HTMLElement) {\n // remove the BOM when changing to text\n input.querySelectorAll('.input-filler').forEach((el) => {\n if(el.textContent !== BOM) {\n el.classList.replace('input-filler', 'input-filler-text');\n const t = (el as any).t as ChildNode;\n const bomNode = Array.from(el.childNodes).find((node) => node.nodeType === node.TEXT_NODE && node.nodeValue.includes(BOM));\n if(bomNode && !t?.nodeValue) {\n const idx = bomNode.nodeValue.indexOf(BOM);\n if(idx !== -1) {\n (bomNode as CharacterData).deleteData(idx, BOM.length);\n }\n }\n\n // t?.remove();\n }\n });\n }\n\n private setSelectionClassName(selection: Selection, input?: HTMLElement) {\n // Array.from(this.messageInput.querySelectorAll('.selection')).forEach((element) => {\n // element.classList.remove('selection');\n // });\n\n if(selection.rangeCount) {\n const range = selection.getRangeAt(0);\n\n if(input) {\n Array.from(input.querySelectorAll('.input-selectable')).forEach((element) => {\n element.classList.toggle('selection', !range.collapsed && range.intersectsNode(element));\n });\n } else {\n Array.from(document.querySelectorAll('.input-selectable.selection')).forEach((element) => element.classList.remove('selection'));\n }\n }\n }\n\n private move(selection: Selection, left: boolean) {\n const {focusNode: focusNodeBefore, focusOffset: focusOffsetBefore} = selection;\n selection.modify('extend', left ? 'backward' : 'forward', 'character');\n // if(offset === nodeValue.length) {\n // selection.modify('extend', !left ? 'backward' : 'forward', 'character');\n // }\n if(left) selection.collapseToStart();\n else selection.collapseToEnd();\n const {focusNode: focusNodeAfter, focusOffset: focusOffsetAfter} = selection;\n this.log(\n 'moving cursor',\n left,\n focusNodeBefore,\n focusNodeBefore.nodeType === focusNodeBefore.ELEMENT_NODE ? focusNodeBefore : focusNodeBefore.parentElement,\n focusOffsetBefore,\n focusNodeAfter,\n focusNodeAfter.nodeType === focusNodeAfter.ELEMENT_NODE ? focusNodeAfter : focusNodeAfter.parentElement,\n focusOffsetAfter\n );\n }\n\n public prepareApplyingMarkdown() {\n const {input} = this;\n\n // do not wrap fillers into spans\n const fillers = input.querySelectorAll('.input-filler');\n // fillers.forEach((el) => {\n // el.contentEditable = 'false';\n // });\n\n const smths = input.querySelectorAll('.input-something');\n smths.forEach((el) => {\n el.contentEditable = 'inherit';\n });\n\n return () => {\n fillers.forEach((el) => {\n el.contentEditable = 'inherit';\n });\n\n smths.forEach((el) => {\n el.contentEditable = 'false';\n });\n\n this.removeExtraBOMs(input);\n };\n }\n\n public static getInstance() {\n return this.INSTANCE ??= new RichInputHandler();\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 {ScrollableBase} from '../../components/scrollable';\nimport SwipeHandler from '../../components/swipeHandler';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport rootScope from '../../lib/rootScope';\nimport {Middleware} from '../middleware';\nimport clamp from '../number/clamp';\nimport safeAssign from '../object/safeAssign';\nimport pause from '../schedulers/pause';\nimport cancelEvent from './cancelEvent';\nimport {attachClickEvent} from './clickEvent';\nimport findUpAsChild from './findUpAsChild';\nimport positionElementByIndex from './positionElementByIndex';\nimport whichChild from './whichChild';\n\nexport default class Sortable {\n private element: HTMLElement;\n private elementRect: DOMRect;\n private containerRect: DOMRect;\n private scrollableRect: DOMRect;\n private minY: number;\n private maxY: number;\n private siblings: HTMLElement[];\n private swipeHandler: SwipeHandler;\n private startScrollPos: number;\n private addScrollPos: number;\n\n private list: HTMLElement;\n private middleware: Middleware;\n private onSort: (prevIdx: number, newIdx: number) => void;\n private scrollable: ScrollableBase;\n\n constructor(options: {\n list: HTMLElement,\n middleware: Middleware,\n onSort: Sortable['onSort'],\n scrollable?: Sortable['scrollable']\n }) {\n safeAssign(this, options);\n\n this.swipeHandler = new SwipeHandler({\n element: this.list,\n onSwipe: this.onSwipe,\n verifyTouchTarget: this.verifyTouchTarget,\n onStart: this.onStart,\n onReset: this.onReset,\n setCursorTo: document.body,\n middleware: this.middleware,\n withDelay: true\n });\n }\n\n private onSwipe = (xDiff: number, yDiff: number) => {\n yDiff = clamp(yDiff, this.minY, this.maxY);\n this.element.style.transform = `translateY(${yDiff}px)`;\n const count = Math.round(Math.abs(yDiff) / this.elementRect.height);\n const lastSiblings = this.siblings;\n this.siblings = [];\n const property = yDiff < 0 ? 'previousElementSibling' : 'nextElementSibling';\n let sibling = this.element[property] as HTMLElement;\n for(let i = 0; i < count; ++i) {\n if(this.getSortableTarget(sibling)) {\n this.siblings.push(sibling);\n sibling = sibling[property] as HTMLElement;\n } else {\n break;\n }\n }\n\n (lastSiblings || []).forEach((sibling) => {\n if(!this.siblings.includes(sibling)) {\n sibling.style.transform = '';\n }\n });\n\n this.siblings.forEach((sibling) => {\n const y = this.elementRect.height * (yDiff < 0 ? 1 : -1);\n sibling.style.transform = `translateY(${y}px)`;\n });\n\n if(this.scrollableRect) {\n const diff = yDiff;\n const toEnd = diff > 0;\n const elementEndPos = toEnd ? this.elementRect.bottom : this.elementRect.top;\n const clientY = elementEndPos + diff - this.addScrollPos;\n // console.log(clientY, this.scrollableRect.top, elementEndPos, diff, this.addScrollPos, toEnd);\n let change = 2;\n if((clientY + (toEnd ? 0 : this.elementRect.height)) >= this.scrollableRect.bottom/* && diff < this.maxY */) {\n\n } else if((clientY - (toEnd ? this.elementRect.height : 0)) <= this.scrollableRect.top/* && diff > this.minY */) {\n change *= -1;\n } else {\n change = undefined;\n }\n\n if(change !== undefined) {\n this.scrollable.container[this.scrollable.scrollProperty] += change;\n }\n }\n };\n\n private verifyTouchTarget = (e: {target: EventTarget}) => {\n if(this.list.classList.contains('is-reordering')) {\n return false;\n }\n\n this.element = this.getSortableTarget(e.target as HTMLElement);\n return !!this.element/* && pause(150).then(() => true) */;\n };\n\n private onScroll = () => {\n const scrollPos = this.scrollable.container[this.scrollable.scrollProperty];\n const diff = this.addScrollPos = scrollPos - this.startScrollPos;\n const isVertical = this.scrollable.scrollProperty === 'scrollTop';\n this.swipeHandler.add(isVertical ? 0 : diff, isVertical ? diff : 0);\n };\n\n private onStart = () => {\n this.list.classList.add('is-reordering');\n this.element.classList.add('is-dragging', 'no-transition');\n this.swipeHandler.setCursor('grabbing');\n this.elementRect = this.element.getBoundingClientRect();\n this.containerRect = this.list.getBoundingClientRect();\n\n this.minY = this.containerRect.top - this.elementRect.top;\n this.maxY = this.containerRect.bottom - this.elementRect.bottom;\n this.addScrollPos = 0;\n\n if(this.scrollable) {\n this.startScrollPos = this.scrollable.container[this.scrollable.scrollProperty];\n this.scrollableRect = this.scrollable.container.getBoundingClientRect();\n this.scrollable.container.addEventListener('scroll', this.onScroll);\n }\n };\n\n private onReset = async() => {\n const length = this.siblings.length;\n const move = length && length * (this.siblings[0].previousElementSibling === this.element ? 1 : -1);\n const idx = whichChild(this.element);\n const newIdx = idx + move;\n\n this.element.classList.remove('no-transition');\n this.element.style.transform = move ? `translateY(${move * this.elementRect.height}px)` : '';\n this.swipeHandler.setCursor('');\n\n if(this.scrollable) {\n this.scrollable.container.removeEventListener('scroll', this.onScroll);\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n attachClickEvent(document.body, cancelEvent, {capture: true, once: true});\n }\n\n if(rootScope.settings.animationsEnabled) {\n await pause(250);\n }\n\n this.list.classList.remove('is-reordering');\n this.element.classList.remove('is-dragging');\n positionElementByIndex(this.element, this.list, newIdx, idx);\n [this.element, ...this.siblings].forEach((element) => {\n element.style.transform = '';\n });\n\n this.element =\n this.siblings =\n this.elementRect =\n this.containerRect =\n this.minY =\n this.maxY =\n this.startScrollPos =\n this.addScrollPos =\n undefined;\n\n // cancelClick = true;\n\n if(!move) {\n return;\n }\n\n this.onSort(idx, newIdx);\n };\n\n private getSortableTarget(target: HTMLElement) {\n if(!target) {\n return;\n }\n\n let child = findUpAsChild(target as HTMLElement, this.list);\n if(child && child.classList.contains('cant-sort')) {\n child = undefined;\n }\n\n return child;\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 toggleDisability(elements: HTMLElement[], disable: boolean): () => void {\n if(disable) {\n elements.forEach((el) => el.setAttribute('disabled', 'true'));\n } else {\n elements.forEach((el) => el.removeAttribute('disabled'));\n }\n\n return () => toggleDisability(elements, !disable);\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 whichChild(elem: Node, countNonElements?: boolean) {\n if(!elem.parentNode) {\n return -1;\n }\n\n if(countNonElements) {\n return Array.from(elem.parentNode.childNodes).indexOf(elem as ChildNode);\n }\n\n let i = 0;\n // @ts-ignore\n while((elem = elem.previousElementSibling) !== null) ++i;\n return i;\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, detachClickEvent} from './dom/clickEvent';\nimport findUpAsChild from './dom/findUpAsChild';\nimport EventListenerBase from './eventListenerBase';\nimport ListenerSetter from './listenerSetter';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport safeAssign from './object/safeAssign';\nimport appNavigationController, {NavigationItem} from '../components/appNavigationController';\nimport findUpClassName from './dom/findUpClassName';\nimport rootScope from '../lib/rootScope';\n\nconst KEEP_OPEN = false;\nconst TOGGLE_TIMEOUT = 200;\nconst ANIMATION_DURATION = 200;\n\nexport type IgnoreMouseOutType = 'click' | 'menu' | 'popup';\ntype DropdownHoverTimeoutType = 'toggle' | 'done';\n\nexport default class DropdownHover extends EventListenerBase<{\n open: () => Promise | void,\n openAfterLayout: () => void,\n opened: () => any,\n close: () => any,\n closed: () => any\n}> {\n protected element: HTMLElement;\n protected forceClose: boolean;\n protected inited: boolean;\n protected ignoreMouseOut: Set;\n protected ignoreButtons: Set;\n protected navigationItem: NavigationItem;\n protected ignoreOutClickClassName: string;\n protected timeouts: {[type in DropdownHoverTimeoutType]?: number};\n\n constructor(options: {\n element: DropdownHover['element'],\n ignoreOutClickClassName?: string\n }) {\n super(false);\n safeAssign(this, options);\n this.forceClose = false;\n this.inited = false;\n this.ignoreMouseOut = new Set();\n this.ignoreButtons = new Set();\n this.timeouts = {};\n }\n\n public attachButtonListener(\n button: HTMLElement,\n listenerSetter: ListenerSetter\n ) {\n let firstTime = true;\n if(IS_TOUCH_SUPPORTED) {\n attachClickEvent(button, () => {\n if(firstTime) {\n firstTime = false;\n this.toggle(true);\n } else {\n this.toggle();\n }\n }, {listenerSetter});\n } else {\n listenerSetter.add(button)('mouseover', (e) => {\n if(firstTime) {\n listenerSetter.add(button)('mouseout', (e) => {\n this.clearTimeout('toggle');\n this.onMouseOut(e);\n });\n firstTime = false;\n }\n\n this.setTimeout('toggle', () => {\n this.toggle(true);\n }, TOGGLE_TIMEOUT);\n });\n\n attachClickEvent(button, () => {\n const type: IgnoreMouseOutType = 'click';\n const ignore = !this.ignoreMouseOut.has(type);\n\n if(ignore && !this.ignoreMouseOut.size) {\n this.ignoreButtons.add(button);\n setTimeout(() => {\n attachClickEvent(window, this.onClickOut, {capture: true});\n }, 0);\n }\n\n this.setIgnoreMouseOut(type, ignore);\n this.toggle(ignore);\n }, {listenerSetter});\n }\n }\n\n protected onClickOut = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n if(\n !findUpAsChild(target, this.element) &&\n !Array.from(this.ignoreButtons).some((button) => findUpAsChild(target, button) || target === button) &&\n this.ignoreMouseOut.size <= 1 &&\n (!this.ignoreOutClickClassName || !findUpClassName(target, this.ignoreOutClickClassName))\n ) {\n this.toggle(false);\n }\n };\n\n protected onMouseOut = (e: MouseEvent) => {\n if(KEEP_OPEN || !this.isActive()) return;\n this.clearTimeout('toggle');\n\n if(this.ignoreMouseOut.size) {\n return;\n }\n\n const toElement = (e as any).toElement as HTMLElement;\n if(toElement && findUpAsChild(toElement, this.element)) {\n return;\n }\n\n this.setTimeout('toggle', () => {\n this.toggle(false);\n }, TOGGLE_TIMEOUT);\n };\n\n protected clearTimeout(type: DropdownHoverTimeoutType) {\n if(this.timeouts[type] !== undefined) {\n clearTimeout(this.timeouts[type]);\n delete this.timeouts[type];\n }\n }\n\n protected setTimeout(type: DropdownHoverTimeoutType, cb: () => void, timeout: number) {\n this.clearTimeout(type);\n this.timeouts[type] = window.setTimeout(() => {\n this.clearTimeout(type);\n cb();\n }, timeout);\n }\n\n public init() {\n if(!IS_TOUCH_SUPPORTED) {\n this.element.onmouseout = this.onMouseOut;\n this.element.onmouseover = (e) => {\n if(this.forceClose) {\n return;\n }\n\n // console.log('onmouseover element');\n this.clearTimeout('toggle');\n };\n }\n }\n\n public toggle = async(enable?: boolean) => {\n // if(!this.element) return;\n const willBeActive = (!!this.element.style.display && enable === undefined) || enable;\n if(this.init) {\n if(willBeActive) {\n this.init();\n this.init = null;\n } else {\n return;\n }\n }\n\n if(willBeActive === this.isActive()) {\n return;\n }\n\n const delay = IS_TOUCH_SUPPORTED || !rootScope.settings.animationsEnabled ? 0 : ANIMATION_DURATION;\n if((this.element.style.display && enable === undefined) || enable) {\n const res = this.dispatchResultableEvent('open');\n await Promise.all(res);\n\n this.element.style.display = '';\n void this.element.offsetLeft; // reflow\n this.element.classList.add('active');\n\n this.dispatchEvent('openAfterLayout');\n\n appNavigationController.pushItem(this.navigationItem = {\n type: 'dropdown',\n onPop: () => {\n this.toggle(false);\n }\n });\n\n this.clearTimeout('toggle');\n this.setTimeout('done', () => {\n this.forceClose = false;\n this.dispatchEvent('opened');\n }, delay);\n\n // ! can't use together with resizeObserver\n /* if(isTouchSupported) {\n const height = this.element.scrollHeight + appImManager.chat.input.inputContainer.scrollHeight - 10;\n console.log('[ESG]: toggle: enable height', height);\n appImManager.chat.bubbles.scrollable.scrollTop += height;\n } */\n\n /* if(touchSupport) {\n this.restoreScroll();\n } */\n } else {\n this.dispatchEvent('close');\n this.ignoreMouseOut.clear();\n this.ignoreButtons.clear();\n\n this.element.classList.remove('active');\n\n appNavigationController.removeItem(this.navigationItem);\n detachClickEvent(window, this.onClickOut, {capture: true});\n\n this.clearTimeout('toggle');\n this.setTimeout('done', () => {\n this.element.style.display = 'none';\n this.forceClose = false;\n this.dispatchEvent('closed');\n }, delay);\n\n /* if(isTouchSupported) {\n const scrollHeight = this.container.scrollHeight;\n if(scrollHeight) {\n const height = this.container.scrollHeight + appImManager.chat.input.inputContainer.scrollHeight - 10;\n appImManager.chat.bubbles.scrollable.scrollTop -= height;\n }\n } */\n\n /* if(touchSupport) {\n this.restoreScroll();\n } */\n }\n\n // animationIntersector.checkAnimations(false, EMOTICONSSTICKERGROUP);\n };\n\n public isActive() {\n return this.element.classList.contains('active');\n }\n\n public setIgnoreMouseOut(type: IgnoreMouseOutType, ignore: boolean) {\n ignore ? this.ignoreMouseOut.add(type) : this.ignoreMouseOut.delete(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\n// * Jolly Cobra's fastSmoothScroll slightly patched\n\nimport {dispatchHeavyAnimationEvent} from '../hooks/useHeavyAnimationCheck';\nimport {fastRafPromise} from './schedulers';\nimport {animateSingle, cancelAnimationByKey} from './animation';\nimport rootScope from '../lib/rootScope';\nimport isInDOM from './dom/isInDOM';\n\nconst MIN_JS_DURATION = 250;\nconst MAX_JS_DURATION = 600;\nconst LONG_TRANSITION_MAX_DISTANCE = 1500;\nconst SHORT_TRANSITION_MAX_DISTANCE = 500;\n\nexport enum FocusDirection {\n Up,\n Down,\n Static,\n};\n\nexport type ScrollGetNormalSizeCallback = (options: {rect: DOMRect}) => number;\nexport type ScrollGetElementPositionCallback = (options: {elementRect: DOMRect, containerRect: DOMRect, elementPosition: number}) => number;\nexport type ScrollStartCallbackDimensions = {\n scrollSize: number,\n scrollPosition: number,\n distanceToEnd: number,\n path: number,\n duration: number,\n containerRect: DOMRect,\n elementRect: DOMRect,\n getProgress: () => number\n};\n\nexport type ScrollOptions = {\n container: HTMLElement,\n element: HTMLElement,\n position: ScrollLogicalPosition,\n margin?: number,\n maxDistance?: number,\n forceDirection?: FocusDirection,\n forceDuration?: number,\n axis?: 'x' | 'y',\n getNormalSize?: ScrollGetNormalSizeCallback,\n getElementPosition?: ScrollGetElementPositionCallback,\n fallbackToElementStartWhenCentering?: HTMLElement,\n startCallback?: (dimensions: ScrollStartCallbackDimensions) => void,\n transitionFunction?: (value: number) => number\n};\n\nexport default function fastSmoothScroll(options: ScrollOptions) {\n options.margin ??= 0;\n options.maxDistance ??= LONG_TRANSITION_MAX_DISTANCE;\n options.axis ??= 'y';\n // return;\n\n if(!rootScope.settings.animationsEnabled || options.forceDuration === 0) {\n options.forceDirection = FocusDirection.Static;\n }\n\n if(options.forceDirection === FocusDirection.Static) {\n options.forceDuration = 0;\n return scrollWithJs(options);\n /* return Promise.resolve();\n\n element.scrollIntoView({ block: position });\n\n cancelAnimationByKey(container);\n return Promise.resolve(); */\n }\n\n const promise = fastRafPromise().then(() => scrollWithJs(options));\n\n return options.axis === 'y' ? dispatchHeavyAnimationEvent(promise) : promise;\n}\n\nfunction scrollWithJs(options: ScrollOptions): Promise {\n const {element, container, getNormalSize, getElementPosition, transitionFunction, axis, margin, position, forceDirection, maxDistance, forceDuration} = options;\n if(!isInDOM(element)) {\n cancelAnimationByKey(container);\n return Promise.resolve();\n }\n\n const rectStartKey = axis === 'y' ? 'top' : 'left';\n const rectEndKey = axis === 'y' ? 'bottom' : 'right';\n const sizeKey = axis === 'y' ? 'height' : 'width';\n const scrollSizeKey = axis === 'y' ? 'scrollHeight' : 'scrollWidth';\n const elementScrollSizeKey = axis === 'y' ? 'scrollHeight' : 'offsetWidth'; // can use offsetWidth for X, since it's almost same as scrollWidth\n const scrollPositionKey = axis === 'y' ? 'scrollTop' : 'scrollLeft';\n\n // const { offsetTop: elementTop, offsetHeight: elementHeight } = element;\n const elementRect = element.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect ? container.getBoundingClientRect() : document.body.getBoundingClientRect();\n\n // const transformable = container.firstElementChild as HTMLElement;\n\n const possibleElementPosition = elementRect[rectStartKey] - containerRect[rectStartKey];\n const elementPosition = getElementPosition ? getElementPosition({elementRect, containerRect, elementPosition: possibleElementPosition}) : possibleElementPosition;\n const elementSize = element[elementScrollSizeKey]; // margin is exclusive in DOMRect\n\n const containerSize = getNormalSize ? getNormalSize({rect: containerRect}) : containerRect[sizeKey];\n\n let scrollPosition = container[scrollPositionKey];\n const scrollSize = container[scrollSizeKey];\n /* const elementPosition = element.offsetTop;\n const elementSize = element.offsetHeight;\n\n const scrollPosition = container[scrollPositionKey];\n const scrollSize = container[scrollSizeKey];\n const containerSize = container.offsetHeight; */\n\n let path!: number;\n\n switch(position) {\n case 'start':\n path = elementPosition - margin;\n break;\n case 'end':\n path = elementRect[rectEndKey] /* + (elementSize - elementRect[sizeKey]) */ - containerRect[rectEndKey] + margin;\n break;\n // 'nearest' is not supported yet\n case 'nearest':\n case 'center':\n if(elementSize < containerSize) {\n path = (elementPosition + elementSize / 2) - (containerSize / 2);\n } else {\n if(options.fallbackToElementStartWhenCentering && options.fallbackToElementStartWhenCentering !== element) {\n options.element = options.fallbackToElementStartWhenCentering;\n options.position = 'start';\n return scrollWithJs(options);\n }\n\n path = elementPosition - margin;\n }\n\n break;\n }\n /* switch (position) {\n case 'start':\n path = (elementPosition - margin) - scrollPosition;\n break;\n case 'end':\n path = (elementPosition + elementSize + margin) - (scrollPosition + containerSize);\n break;\n // 'nearest' is not supported yet\n case 'nearest':\n case 'center':\n path = elementSize < containerSize\n ? (elementPosition + elementSize / 2) - (scrollPosition + containerSize / 2)\n : (elementPosition - margin) - scrollPosition;\n break;\n } */\n\n if(Math.abs(path - (margin || 0)) < 1) {\n cancelAnimationByKey(container);\n return Promise.resolve();\n }\n\n if(axis === 'y') {\n if(forceDirection === undefined) {\n if(path > maxDistance) {\n scrollPosition = container.scrollTop += path - maxDistance;\n path = maxDistance;\n } else if(path < -maxDistance) {\n scrollPosition = container.scrollTop += path + maxDistance;\n path = -maxDistance;\n }\n }/* else if(forceDirection === FocusDirection.Up) { // * not tested yet\n container.scrollTop = offsetTop + container.scrollTop + maxDistance;\n } else if(forceDirection === FocusDirection.Down) { // * not tested yet\n container.scrollTop = Math.max(0, offsetTop + container.scrollTop - maxDistance);\n } */\n }\n\n // console.log('scrollWithJs: will scroll path:', path, element);\n\n /* let existsTransform = 0;\n const currentTransform = transformable.style.transform;\n if(currentTransform) {\n existsTransform = parseInt(currentTransform.match(/\\((.+?), (.+?), .+\\)/)[2]);\n //path += existsTransform;\n } */\n\n if(path < 0) {\n const remainingPath = -scrollPosition;\n path = Math.max(path, remainingPath);\n } else if(path > 0) {\n const remainingPath = scrollSize - (scrollPosition + containerSize);\n path = Math.min(path, remainingPath);\n }\n\n const target = container[scrollPositionKey] + path;\n const absPath = Math.abs(path);\n const duration = forceDuration ?? (\n MIN_JS_DURATION + (absPath / LONG_TRANSITION_MAX_DISTANCE) * (MAX_JS_DURATION - MIN_JS_DURATION)\n );\n const startAt = Date.now();\n\n /* transformable.classList.add('no-transition');\n\n const tickTransform = () => {\n const t = duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\n const currentPath = path * transition(t);\n\n transformable.style.transform = `translate3d(0, ${-currentPath}px, 0)`;\n container.dataset.translate = '' + -currentPath;\n\n const willContinue = t < 1;\n if(!willContinue) {\n fastRaf(() => {\n delete container.dataset.transform;\n container.dataset.transform = '';\n transformable.style.transform = '';\n void transformable.offsetLeft; // reflow\n transformable.classList.remove('no-transition');\n void transformable.offsetLeft; // reflow\n container[scrollPositionKey] = Math.round(target);\n });\n }\n\n return willContinue;\n };\n\n return animateSingle(tickTransform, container); */\n\n /* return new Promise((resolve) => {\n fastRaf(() => {\n transformable.style.transform = '';\n transformable.style.transition = '';\n\n setTimeout(resolve, duration);\n });\n });\n\n const transformableHeight = transformable.scrollHeight;\n //transformable.style.minHeight = `${transformableHeight}px`;\n */\n\n const transition = transitionFunction ?? (absPath < SHORT_TRANSITION_MAX_DISTANCE ? shortTransition : longTransition);\n const getProgress = () => duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\n const tick = () => {\n const t = getProgress();\n const value = transition(t);\n const currentPath = path * (1 - value);\n container[scrollPositionKey] = Math.round(target - currentPath);\n\n return t < 1;\n };\n\n if(!duration || !path) {\n cancelAnimationByKey(container);\n tick();\n return Promise.resolve();\n }\n\n /* return new Promise((resolve) => {\n setTimeout(resolve, duration);\n }).then(() => {\n transformable.classList.add('no-transition');\n void transformable.offsetLeft; // reflow\n transformable.style.transform = '';\n transformable.style.transition = '';\n void transformable.offsetLeft; // reflow\n transformable.classList.remove('no-transition');\n void transformable.offsetLeft; // reflow\n fastRaf(() => {\n\n container[scrollPositionKey] = Math.round(target);\n //transformable.style.minHeight = ``;\n });\n\n }); */\n\n if(options.startCallback) {\n const distanceToEnd = scrollSize - Math.round(target + container[axis === 'y' ? 'offsetHeight' : 'offsetWidth']);\n options.startCallback({\n scrollSize,\n scrollPosition,\n distanceToEnd,\n path,\n duration,\n containerRect,\n elementRect,\n getProgress\n });\n }\n\n return animateSingle(tick, container);\n}\n\nfunction longTransition(t: number) {\n return 1 - ((1 - t) ** 5);\n}\n\nfunction shortTransition(t: number) {\n return 1 - ((1 - t) ** 3.5);\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 {InputFileLocation, InputStickerSet, InputWebFileLocation} from '../layer';\nimport type {DownloadOptions} from '../lib/mtproto/apiFileManager';\n\nconst FILENAME_JOINER = '_';\n\nexport function getFileNameByLocation(location: InputFileLocation | InputWebFileLocation, options?: Partial<{\n fileName: string,\n downloadId: string\n}>) {\n const fileName = '';// (options?.fileName || '').split('.');\n const ext = fileName[fileName.length - 1] || '';\n\n let str: string;\n switch(location._) {\n case 'inputPhotoFileLocation': {\n str = ['photo', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\n break;\n }\n\n case 'inputDocumentFileLocation': {\n str = ['document', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\n break;\n }\n\n case 'inputPeerPhotoFileLocation':\n str = ['peerPhoto', location.photo_id, location.pFlags.big ? 'big' : 'small'].join(FILENAME_JOINER);\n break;\n\n case 'inputStickerSetThumb': {\n const id = (location.stickerset as InputStickerSet.inputStickerSetID).id ||\n (location.stickerset as InputStickerSet.inputStickerSetShortName).short_name ||\n (location.stickerset as InputStickerSet.inputStickerSetDice).emoticon ||\n location.stickerset._;\n str = ['stickerSetThumb', id, location.thumb_version].join(FILENAME_JOINER);\n break;\n }\n\n case 'inputFileLocation': {\n str = [location.volume_id, location.local_id].join(FILENAME_JOINER);\n break;\n }\n\n case 'inputWebFileLocation': {\n str = ['webFile', location.url].join(FILENAME_JOINER);\n break;\n }\n\n default: {\n console.error('Unrecognized location:', location);\n str = '';\n break;\n }\n }\n\n return str + (options?.downloadId ? '_download' : '') + (ext ? '.' + ext : ext);\n}\n\nexport type FileURLType = 'photo' | 'thumb' | 'document' | 'stream' | 'download';\nexport function getFileURL(type: FileURLType, options: DownloadOptions) {\n // console.log('getFileURL', location);\n // const perf = performance.now();\n const encoded = encodeURIComponent(JSON.stringify(options));\n // console.log('getFileURL encode:', performance.now() - perf, encoded);\n\n return /* '/' + */type + '/' + encoded;\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 {Message, MessageAction} from '../layer';\nimport type {MyMessage} from '../lib/appManagers/appMessagesManager';\nimport forEachReverse from './array/forEachReverse';\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 {i18n, LangPackKey} from '../lib/langPack';\n\nexport default function formatBytes(bytes: number, decimals: number | 'auto' = 'auto') {\n if(bytes === 0) return i18n('FileSize.B', [0]);\n\n const strictDecimals = decimals === 'auto';\n\n const k = 1024;\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n const _decimals = decimals === 'auto' ? Math.max(0, i - 1) : decimals;\n\n const dm = Math.max(0, _decimals);\n const sizes: LangPackKey[] = ['FileSize.B', 'FileSize.KB', 'FileSize.MB', 'FileSize.GB'];\n\n const fixed = (bytes / Math.pow(k, i)).toFixed(dm);\n return i18n(sizes[i], [strictDecimals ? fixed : parseFloat(fixed)]);\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, join, LangPackKey} from '../lib/langPack';\nimport formatDuration, {DurationType} from './formatDuration';\n\nconst CALL_DURATION_LANG_KEYS: {[type in DurationType]: LangPackKey} = {\n s: 'Seconds',\n m: 'Minutes',\n h: 'Hours',\n d: 'Days',\n w: 'Weeks',\n mm: 'Months',\n y: 'Years'\n};\nexport default function formatCallDuration(duration: number, plain?: boolean) {\n const a = formatDuration(duration, 2);\n if(plain) {\n const strings = a.map((d) => I18n.format(CALL_DURATION_LANG_KEYS[d.type], true, [d.duration]));\n return join(strings, false, plain);\n }\n\n const elements = a.map((d) => i18n(CALL_DURATION_LANG_KEYS[d.type], [d.duration]));\n\n const fragment = document.createElement('span');\n fragment.append(...join(elements, false));\n\n return fragment;\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 type DurationType = 's' | 'm' | 'h' | 'd' | 'w' | 'mm' | 'y';\nexport default function formatDuration(duration: number, showLast = 2) {\n if(!duration) {\n duration = 1;\n }\n\n const d: {duration: number, type: DurationType}[] = [];\n const p = [\n {m: 1, t: 's'},\n {m: 60, t: 'm'},\n {m: 60, t: 'h'},\n {m: 24, t: 'd'},\n {m: 7, t: 'w'}\n ] as Array<{m?: number, t: DurationType}>\n const s = 1;\n let t = s;\n p.forEach((o, idx) => {\n t = Math.round(t * o.m);\n\n if(duration < t) {\n return;\n }\n\n let dd = duration / t;\n if(idx !== (p.length - 1)) {\n const modulus = p[idx === (p.length - 1) ? idx : idx + 1].m;\n dd %= modulus;\n }\n\n d.push({\n duration: dd | 0,\n type: o.t\n });\n });\n\n const out = d.slice(-showLast).reverse();\n for(let i = out.length - 1; i >= 0; --i) {\n if(out[i].duration === 0) {\n out.splice(i, 1);\n }\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\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 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 const 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]) {\n patternMatches += 1.01;\n } else if(_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","/*\n * 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 {RLottieColor} from '../lib/rlottie/rlottiePlayer';\n\nexport type FramesCacheMap = Map;\nexport type FramesCacheMapNew = Map;\nexport type FramesCacheMapURLs = Map;\nexport type FramesCacheItem = {\n frames: FramesCacheMap,\n framesNew: FramesCacheMapNew,\n framesURLs: FramesCacheMapURLs,\n clearCache: () => void,\n counter: number\n};\n\nexport class FramesCache {\n private cache: Map;\n\n constructor() {\n this.cache = new Map();\n }\n\n public static createCache(): FramesCacheItem {\n const cache: FramesCacheItem = {\n frames: new Map(),\n framesNew: new Map(),\n framesURLs: new Map(),\n clearCache: () => {\n cache.framesNew.forEach((value) => {\n (value as ImageBitmap).close?.();\n });\n\n cache.frames.clear();\n cache.framesNew.clear();\n cache.framesURLs.clear();\n },\n counter: 0\n };\n\n return cache;\n }\n\n public getCache(name: string) {\n let cache = this.cache.get(name);\n if(!cache) {\n this.cache.set(name, cache = FramesCache.createCache());\n } else {\n // console.warn('[RLottieCache] cache will be reused', cache);\n }\n\n ++cache.counter;\n return cache;\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 framesCache = new FramesCache();\n\nexport default framesCache;\n","/*\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// generate a path's arc data parameter\n\nimport {MOUNT_CLASS_TO} from '../config/debug';\n\n// http://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands\nfunction arcParameter(rx: number, ry: number, xAxisRotation: number, largeArcFlag: number, sweepFlag: number, x: number, y: number) {\n return [rx, ',', ry, ' ',\n xAxisRotation, ' ',\n largeArcFlag, ',',\n sweepFlag, ' ',\n x, ',', y].join('');\n}\n\nexport default function generatePathData(x: number, y: number, width: number, height: number, tl: number, tr: number, br: number, bl: number) {\n const data: string[] = [];\n\n // start point in top-middle of the rectangle\n data.push('M' + (x + width / 2) + ',' + y);\n\n // next we go to the right\n data.push('H' + (x + width - tr));\n\n if(tr > 0) {\n // now we draw the arc in the top-right corner\n data.push('A' + arcParameter(tr, tr, 0, 0, 1, (x + width), (y + tr)));\n }\n\n // next we go down\n data.push('V' + (y + height - br));\n\n if(br > 0) {\n // now we draw the arc in the lower-right corner\n data.push('A' + arcParameter(br, br, 0, 0, 1, (x + width - br), (y + height)));\n }\n\n // now we go to the left\n data.push('H' + (x + bl));\n\n if(bl > 0) {\n // now we draw the arc in the lower-left corner\n data.push('A' + arcParameter(bl, bl, 0, 0, 1, (x + 0), (y + height - bl)));\n }\n\n // next we go up\n data.push('V' + (y + tl));\n\n if(tl > 0) {\n // now we draw the arc in the top-left corner\n data.push('A' + arcParameter(tl, tl, 0, 0, 1, (x + tl), (y + 0)));\n }\n\n // and we close the path\n data.push('Z');\n\n return data.join(' ');\n}\n\nMOUNT_CLASS_TO.generatePathData = generatePathData;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {PhotoSize} from '../layer';\nimport {MyDocument} from '../lib/appManagers/appDocsManager';\nimport {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport {renderImageFromUrlPromise} from './dom/renderImageFromUrl';\nimport getPreviewURLFromThumb from './getPreviewURLFromThumb';\nimport blur from './blur';\n\nexport default function getImageFromStrippedThumb(\n photo: MyPhoto | MyDocument,\n thumb: PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize,\n useBlur: boolean\n) {\n const url = getPreviewURLFromThumb(photo, thumb, false);\n\n let element: HTMLImageElement | HTMLCanvasElement, loadPromise: Promise;\n if(!useBlur) {\n element = new Image();\n loadPromise = renderImageFromUrlPromise(element, url);\n } else {\n const result = blur(url);\n element = result.canvas;\n loadPromise = result.promise;\n }\n\n element.classList.add('thumbnail');\n\n return {image: element, loadPromise};\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 {MyDocument} from '../lib/appManagers/appDocsManager';\nimport type {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport {PhotoSize} from '../layer';\n// import appDownloadManager from \"../lib/appManagers/appDownloadManager\";\nimport getPreviewURLFromBytes from './bytes/getPreviewURLFromBytes';\n\nexport default function 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 = getPreviewURLFromBytes(thumb.bytes, isSticker));\n return getPreviewURLFromBytes(thumb.bytes, isSticker);\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 {MyDocument} from '../lib/appManagers/appDocsManager';\nimport type {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport {THUMB_TYPE_FULL} from '../lib/mtproto/mtproto_config';\nimport type {ThumbCache} from '../lib/storages/thumbs';\nimport getImageFromStrippedThumb from './getImageFromStrippedThumb';\n\nexport default function getStrippedThumbIfNeeded(photo: MyPhoto | MyDocument, cacheContext: ThumbCache, useBlur: boolean, ignoreCache = false) {\n const isVideo = (['video', 'gif'] as MyDocument['type'][]).includes((photo as MyDocument).type);\n if(!cacheContext.downloaded || isVideo || ignoreCache) {\n if(\n photo._ === 'document' &&\n cacheContext.downloaded &&\n !ignoreCache &&\n (!isVideo || cacheContext.type !== THUMB_TYPE_FULL)\n ) {\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 getImageFromStrippedThumb(photo, thumb as any, useBlur);\n }\n }\n\n return null;\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/forEachReverse';\nimport safeAssign from './object/safeAssign';\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 | Promise;\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 filter(callback: (item: T, idx: number, arr: T[]) => boolean) {\n const filter = (item: T, idx: number, arr: T[]) => {\n if(!callback(item, idx, arr)) {\n arr.splice(idx, 1);\n }\n };\n\n forEachReverse(this.previous, filter);\n forEachReverse(this.next, filter);\n } */\n\n public reset(loadedAll = false) {\n this.current = undefined;\n this.previous = [];\n this.next = [];\n this.setLoaded(true, loadedAll);\n this.setLoaded(false, loadedAll);\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 if(this.current !== undefined) items.unshift(this.current);\n this.previous.push(...items);\n } else {\n items = this.previous.splice(Math.max(0, this.previous.length + length), -length);\n item = items.shift();\n if(!item) {\n return;\n }\n\n if(this.current !== undefined) items.push(this.current);\n this.next.unshift(...items);\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 protected unsetCurrent(toPrevious: boolean) {\n if(toPrevious) this.previous.push(this.current);\n else this.next.unshift(this.current);\n\n this.current = undefined;\n }\n\n public goUnsafe(length: number, dispatchJump?: boolean) {\n const leftLength = length > 0 ? Math.max(0, length - this.next.length) : Math.min(0, length + this.previous.length);\n const item = this.go(length, leftLength ? false : dispatchJump);\n\n /* if(length > 0 ? this.loadedAllUp : this.loadedAllDown) {\n this.unsetCurrent(length > 0);\n } */\n\n return {\n item: !leftLength ? item : undefined,\n leftLength\n };\n }\n\n protected setLoaded(down: boolean, value: boolean) {\n const isChanged = (down ? this.loadedAllDown : this.loadedAllUp) !== value;\n if(!isChanged) {\n return false;\n }\n\n if(down) this.loadedAllDown = value;\n else this.loadedAllUp = value;\n\n if(!value) {\n if(down) this.loadPromiseDown = null;\n else this.loadPromiseUp = null;\n }\n\n return true;\n }\n\n // ะฝะตั‚ ัะผั‹ัะปะฐ ะดะตะปะฐั‚ัŒ ะฟั€ะพะฒะตั€ะบัƒ ะดะปั reverse ะธ loadMediaPromise\n public load(older: boolean) {\n if(older ? this.loadedAllDown : this.loadedAllUp) return Promise.resolve();\n\n let promise = older ? this.loadPromiseDown : this.loadPromiseUp;\n if(promise) return promise;\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 anchor ??= this.current;\n promise = this.loadMore(anchor, older, this.loadCount).then(async(result) => {\n if((older ? this.loadPromiseDown : this.loadPromiseUp) !== promise) {\n return;\n }\n\n if(result.items.length < this.loadCount) {\n this.setLoaded(older, true);\n }\n\n if(this.count === undefined) {\n this.count = result.count || result.items.length;\n }\n\n const processedArr: (Promise | any)[] = [];\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 processedArr.push(processed);\n });\n\n const results = await Promise.all(processedArr);\n if(older) {\n if(this.reverse) this.previous.unshift(...results);\n else this.next.push(...results);\n } else {\n if(this.reverse) this.next.push(...results);\n else this.previous.unshift(...results);\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 EventListenerBase from './eventListenerBase';\n\nexport type Listener = {\n element: ListenerElement,\n event: ListenerEvent,\n callback: ListenerCallback,\n options?: ListenerOptions,\n\n onceFired?: true, // will be set only when options.once is set\n onceCallback?: () => void,\n};\n\nexport type ListenerElement = Window | Document | HTMLElement | Element | EventListenerBase;\nexport type ListenerEvent = string;\nexport type ListenerCallback = Function;\nexport type ListenerOptions = AddEventListenerOptions;\n\n/* const originalAddEventListener = HTMLElement.prototype.addEventListener;\nHTMLElement.prototype.addEventListener = function(this, name: string, callback: EventListenerOrEventListenerObject, options: AddEventListenerOptions) {\n console.log('nu zdarova', name);\n originalAddEventListener.call(this, name, callback, options);\n\n if(options?.ls) {\n return options.ls.addFromElement(this, name, callback as any, options);\n }\n}; */\n\nexport default class ListenerSetter {\n private listeners: Set = new Set();\n\n public add(element: T): T['addEventListener'] {\n return ((event: string, callback: Function, options: ListenerOptions) => {\n const listener: Listener = {element, event, callback, options};\n this.addManual(listener);\n return listener;\n }) as any;\n }\n\n /* public addFromElement(element: T, event: ListenerEvent, callback: ListenerCallback, options: ListenerOptions) {\n const listener: Listener = {element, event, callback, options};\n this.addManual(listener);\n return listener;\n } */\n\n public addManual(listener: Listener) {\n // @ts-ignore\n listener.element.addEventListener(listener.event, listener.callback, listener.options);\n\n if(listener.options?.once) { // remove listener when its called\n listener.onceCallback = () => {\n this.remove(listener);\n listener.onceFired = true;\n };\n\n // @ts-ignore\n listener.element.addEventListener(listener.event, listener.onceCallback, listener.options);\n }\n\n this.listeners.add(listener);\n }\n\n public remove(listener: Listener) {\n if(!listener.onceFired) {\n // @ts-ignore\n listener.element.removeEventListener(listener.event, listener.callback, listener.options);\n\n if(listener.onceCallback) {\n // @ts-ignore\n listener.element.removeEventListener(listener.event, listener.onceCallback, listener.options);\n }\n }\n\n this.listeners.delete(listener);\n }\n\n public removeManual(\n element: T,\n event: ListenerEvent,\n callback: ListenerCallback,\n options?: ListenerOptions\n ) {\n let listener: Listener;\n for(const _listener of this.listeners) {\n if(_listener.element === element &&\n _listener.event === event &&\n _listener.callback === callback &&\n _listener.options === options) {\n listener = _listener;\n break;\n }\n }\n\n if(listener) {\n this.remove(listener);\n }\n }\n\n public removeAll() {\n this.listeners.forEach((listener) => {\n this.remove(listener);\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 calcImageInBox from './calcImageInBox';\n\nexport class MediaSize {\n constructor(public width = 0, public height = width) {\n\n }\n\n public aspect(boxSize: MediaSize, fitted: boolean) {\n return calcImageInBox(this.width, this.height, boxSize.width, boxSize.height, fitted);\n }\n\n public aspectFitted(boxSize: MediaSize) {\n return this.aspect(boxSize, true);\n }\n\n public aspectCovered(boxSize: MediaSize) {\n return this.aspect(boxSize, false);\n }\n}\n\nexport function makeMediaSize(width?: number, height?: number): MediaSize {\n return new MediaSize(width, height);\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 {MOUNT_CLASS_TO} from '../config/debug';\nimport EventListenerBase from './eventListenerBase';\nimport {makeMediaSize, MediaSize} from './mediaSize';\n\ntype MediaTypeSizes = {\n regular: MediaSize,\n webpage: MediaSize,\n album: MediaSize,\n esgSticker: MediaSize,\n animatedSticker: MediaSize,\n staticSticker: MediaSize,\n emojiSticker: MediaSize,\n poll: MediaSize,\n round: MediaSize,\n documentName: MediaSize,\n invoice: MediaSize,\n extendedInvoice: MediaSize,\n customEmoji: MediaSize,\n esgCustomEmoji: MediaSize,\n emojiStatus: MediaSize,\n popupSticker: MediaSize\n};\n\nexport type MediaSizeType = keyof MediaTypeSizes;\n\nexport enum ScreenSize {\n mobile,\n medium,\n large\n}\n\nconst MOBILE_SIZE = 600;\nconst MEDIUM_SIZE = 1275;\nconst LARGE_SIZE = 1680;\n\nconst CUSTOM_EMOJI_SIZE = makeMediaSize(20, 20);\nconst ESG_CUSTOM_EMOJI_SIZE = makeMediaSize(36, 36);\nconst EMOJI_STATUS_SIZE = makeMediaSize(18, 18);\n\nclass MediaSizes extends EventListenerBase<{\n changeScreen: (from: ScreenSize, to: ScreenSize) => void,\n resize: () => void\n}> {\n private screenSizes: {key: ScreenSize, value: number}[] = [\n {key: ScreenSize.mobile, value: MOBILE_SIZE},\n {key: ScreenSize.medium, value: MEDIUM_SIZE},\n {key: ScreenSize.large, value: LARGE_SIZE}\n ];\n\n private sizes: {[k in 'desktop' | 'handhelds']: MediaTypeSizes} = {\n handhelds: {\n regular: makeMediaSize(270, 270),\n webpage: makeMediaSize(270, 200),\n album: makeMediaSize(270, 0),\n esgSticker: makeMediaSize(68, 68),\n animatedSticker: makeMediaSize(180, 180),\n staticSticker: makeMediaSize(180, 180),\n emojiSticker: makeMediaSize(112, 112),\n poll: makeMediaSize(240, 0),\n round: makeMediaSize(200, 200),\n documentName: makeMediaSize(200, 0),\n invoice: makeMediaSize(270, 270),\n extendedInvoice: makeMediaSize(270, 270),\n customEmoji: CUSTOM_EMOJI_SIZE,\n esgCustomEmoji: ESG_CUSTOM_EMOJI_SIZE,\n emojiStatus: EMOJI_STATUS_SIZE,\n popupSticker: makeMediaSize(68, 68)\n },\n desktop: {\n regular: makeMediaSize(420, 340),\n webpage: makeMediaSize(420, 340),\n album: makeMediaSize(420, 0),\n esgSticker: makeMediaSize(72, 72),\n animatedSticker: makeMediaSize(200, 200),\n staticSticker: makeMediaSize(200, 200),\n emojiSticker: makeMediaSize(112, 112),\n poll: makeMediaSize(330, 0),\n round: makeMediaSize(280, 280),\n documentName: makeMediaSize(240, 0),\n invoice: makeMediaSize(320, 320),\n extendedInvoice: makeMediaSize(420, 340),\n customEmoji: CUSTOM_EMOJI_SIZE,\n esgCustomEmoji: ESG_CUSTOM_EMOJI_SIZE,\n emojiStatus: EMOJI_STATUS_SIZE,\n popupSticker: makeMediaSize(80, 80)\n }\n };\n\n public isMobile = false;\n public active: MediaTypeSizes;\n public activeScreen: ScreenSize;\n private rAF: number;\n\n constructor() {\n super();\n\n window.addEventListener('resize', () => {\n if(this.rAF) window.cancelAnimationFrame(this.rAF);\n this.rAF = window.requestAnimationFrame(() => {\n this.handleResize();\n this.rAF = 0;\n });\n });\n this.handleResize();\n }\n\n private handleResize = () => {\n const innerWidth = window.innerWidth;\n // this.isMobile = innerWidth <= 720;\n\n let activeScreen = this.screenSizes[0].key;\n for(let i = this.screenSizes.length - 1; i >= 0; --i) {\n if(this.screenSizes[i].value < innerWidth) {\n activeScreen = (this.screenSizes[i + 1] || this.screenSizes[i]).key;\n break;\n }\n }\n\n const wasScreen = this.activeScreen;\n this.activeScreen = activeScreen;\n this.isMobile = this.activeScreen === ScreenSize.mobile;\n this.active = this.isMobile ? this.sizes.handhelds : this.sizes.desktop;\n\n // console.time('esg');\n // const computedStyle = window.getComputedStyle(document.documentElement);\n // this.active.esgSticker.width = parseFloat(computedStyle.getPropertyValue('--esg-sticker-size'));\n // console.timeEnd('esg');\n\n if(wasScreen !== activeScreen) {\n // console.log('changeScreen', this.activeScreen, activeScreen);\n\n if(wasScreen !== undefined) {\n this.dispatchEvent('changeScreen', wasScreen, activeScreen);\n }\n }\n\n if(wasScreen !== undefined) {\n this.dispatchEvent('resize');\n }\n\n /* if(this.isMobile) {\n for(let i in this.active) {\n // @ts-ignore\n let size = this.active[i];\n size.width = innerWidth\n }\n } */\n };\n}\n\nconst mediaSizes = new MediaSizes();\nMOUNT_CLASS_TO.mediaSizes = mediaSizes;\nexport default mediaSizes;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport makeError from './makeError';\n\nconst error = makeError('MIDDLEWARE');\nexport default function middlewarePromise(middleware: () => boolean, throwWhat: any = error) {\n return (promise: T): T => {\n if(!(promise instanceof Promise)) {\n if(promise instanceof Error) {\n throw promise;\n } else {\n return promise;\n }\n }\n\n return (promise as any as Promise).then((result) => {\n if(!middleware()) {\n throw throwWhat;\n }\n\n return result;\n }) as any;\n };\n}\n","export default function formatNumber(bytes: number, decimals = 2) {\n if(bytes === 0) return '0';\n\n const k = 1000;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['', 'K', 'M', 'B', 'T'];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + sizes[i];\n}\n","export default function numberThousandSplitter(x: number, joiner = ' ') {\n const parts = x.toString().split('.');\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, joiner);\n return parts.join('.');\n}\n","import {IS_APPLE_MOBILE} from '../environment/userAgent';\n\nexport default function onMediaLoad(media: HTMLMediaElement, readyState = media.HAVE_METADATA, useCanplayOnIos?: boolean) {\n return new Promise((resolve, reject) => {\n if(media.readyState >= readyState) {\n resolve();\n return;\n }\n\n const loadEventName = IS_APPLE_MOBILE && !useCanplayOnIos ? 'loadeddata' : 'canplay';\n const errorEventName = 'error';\n const onLoad = () => {\n media.removeEventListener(errorEventName, onError);\n resolve();\n };\n const onError = (e: ErrorEvent) => {\n media.removeEventListener(loadEventName, onLoad);\n reject(media.error);\n };\n media.addEventListener(loadEventName, onLoad, {once: true});\n media.addEventListener(errorEventName, onError, {once: 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 appNavigationController, {NavigationItem} from '../components/appNavigationController';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport {IS_MOBILE_SAFARI} from '../environment/userAgent';\nimport cancelEvent from './dom/cancelEvent';\nimport {CLICK_EVENT_NAME} from './dom/clickEvent';\nimport findUpAsChild from './dom/findUpAsChild';\nimport EventListenerBase from './eventListenerBase';\n\nexport default class OverlayClickHandler extends EventListenerBase<{\n toggle: (open: boolean) => void\n}> {\n protected element: HTMLElement;\n protected overlay: HTMLElement;\n protected listenerOptions: AddEventListenerOptions;\n\n constructor(\n protected navigationType: NavigationItem['type'],\n protected withOverlay?: boolean\n ) {\n super(false);\n this.listenerOptions = withOverlay ? {} : {capture: true};\n }\n\n protected onClick = (e: MouseEvent | TouchEvent) => {\n if(this.element && findUpAsChild(e.target as HTMLElement, this.element)) {\n return;\n }\n\n if(this.listenerOptions?.capture) {\n cancelEvent(e);\n }\n\n this.close();\n };\n\n public close() {\n if(this.element) {\n this.overlay?.remove();\n this.element = undefined;\n this.dispatchEvent('toggle', false);\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n // window.removeEventListener('keydown', onKeyDown, {capture: true});\n window.removeEventListener('contextmenu', this.onClick, this.listenerOptions);\n }\n\n document.removeEventListener(CLICK_EVENT_NAME, this.onClick, this.listenerOptions);\n\n if(!IS_MOBILE_SAFARI) {\n appNavigationController.removeByType(this.navigationType);\n }\n }\n\n public open(element: HTMLElement) {\n this.close();\n\n if(!IS_MOBILE_SAFARI) {\n appNavigationController.pushItem({\n type: this.navigationType,\n onPop: (canAnimate) => {\n this.close();\n }\n });\n }\n\n this.element = element;\n\n if(!this.overlay && this.withOverlay) {\n this.overlay = document.createElement('div');\n this.overlay.classList.add('btn-menu-overlay');\n\n // ! because this event must be canceled, and can't cancel on menu click (below)\n this.overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\n cancelEvent(e);\n this.onClick(e);\n });\n }\n\n this.overlay && this.element.parentElement.insertBefore(this.overlay, this.element);\n\n // document.body.classList.add('disable-hover');\n\n if(!IS_TOUCH_SUPPORTED) {\n // window.addEventListener('keydown', onKeyDown, {capture: true});\n window.addEventListener('contextmenu', this.onClick, {...this.listenerOptions, once: true});\n }\n\n /* // ! because this event must be canceled, and can't cancel on menu click (below)\n overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\n cancelEvent(e);\n onClick(e);\n }); */\n\n // ! safari iOS doesn't handle window click event on overlay, idk why\n document.addEventListener(CLICK_EVENT_NAME, this.onClick, this.listenerOptions);\n\n this.dispatchEvent('toggle', true);\n }\n}\n","import Currencies from '../config/currencies';\n\n// https://stackoverflow.com/a/34141813\nfunction number_format(number: any, decimals: any, dec_point: any, thousands_sep: any): string {\n // Strip all characters but numerical ones.\n number = (number + '').replace(/[^0-9+\\-Ee.]/g, '');\n var n = !isFinite(+number) ? 0 : +number,\n prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),\n sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep,\n dec = (typeof dec_point === 'undefined') ? '.' : dec_point,\n s: any = '',\n toFixedFix = function(n: number, prec: number) {\n var k = Math.pow(10, prec);\n return '' + Math.round(n * k) / k;\n };\n // Fix for IE parseFloat(0.55).toFixed(0) = 0;\n s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.');\n if(s[0].length > 3) {\n s[0] = s[0].replace(/\\B(?=(?:\\d{3})+(?!\\d))/g, sep);\n }\n if((s[1] || '').length < prec) {\n s[1] = s[1] || '';\n s[1] += new Array(prec - s[1].length + 1).join('0');\n }\n return s.join(dec);\n}\n\nexport default function paymentsWrapCurrencyAmount(amount: number | string, currency: string, skipSymbol?: boolean) {\n amount = +amount;\n\n const isNegative = amount < 0;\n\n const currencyData = Currencies[currency];\n if(!currencyData) {\n throw new Error('CURRENCY_WRAP_INVALID');\n }\n\n const amountExp = amount / Math.pow(10, currencyData.exp);\n\n let decimals = currencyData.exp;\n if(currency == 'IRR' && Math.floor(amountExp) == amountExp) {\n decimals = 0; // ัƒ ะธั€ะฐะฝั†ะตะฒ ะบะพะฟะตะนะบะธ ะฟะพั‡ั‚ะธ ะฒัะตะณะดะฐ = 0 ะธ ะฝะต ะฟะพะบะฐะทั‹ะฒะฐัŽั‚ัั ะฒ UI\n }\n\n let formatted = number_format(amountExp, decimals, currencyData.decimal_sep, currencyData.thousands_sep);\n if(skipSymbol) {\n return formatted;\n }\n\n let symbol = currencyData.symbol;\n if(isNegative && !currencyData.space_between && currencyData.symbol_left) {\n symbol = '-' + symbol;\n formatted = formatted.replace('-', '');\n }\n\n let out: string;\n const splitter = currencyData.space_between ? ' ' : '';\n if(currencyData.symbol_left) {\n out = symbol + splitter + formatted;\n } else {\n out = formatted + splitter + symbol;\n }\n return out;\n}\n\n(window as any).p = paymentsWrapCurrencyAmount;\n\n// function paymentsGetCurrencyExp($currency: string) {\n// if($currency == 'CLF') {\n// return 4;\n// }\n// if(['BHD','IQD','JOD','KWD','LYD','OMR','TND'].includes($currency)) {\n// return 3;\n// }\n// if(['BIF','BYR','CLP','CVE','DJF','GNF','ISK','JPY','KMF','KRW','MGA', 'PYG','RWF','UGX','UYI','VND','VUV','XAF','XOF','XPF'].includes($currency)) {\n// return 0;\n// }\n// if($currency == 'MRO') {\n// return 1;\n// }\n// return 2;\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 mediaSizes from './mediaSizes';\n\nexport type MenuPositionPadding = {\n top?: number,\n right?: number,\n bottom?: number,\n left?: number\n};\n\nconst PADDING_TOP = 8;\nconst PADDING_BOTTOM = PADDING_TOP;\nconst PADDING_LEFT = 8;\nconst PADDING_RIGHT = PADDING_LEFT;\nexport default function positionMenu(e: MouseEvent | Touch | TouchEvent, elem: HTMLElement, side?: 'left' | 'right' | 'center', additionalPadding?: MenuPositionPadding) {\n if((e as TouchEvent).touches) {\n e = (e as TouchEvent).touches[0];\n }\n\n const {pageX, pageY} = e as Touch;\n // let {clientX, clientY} = e;\n\n // * side mean the OPEN side\n\n const getScrollWidthFromElement = (Array.from(elem.children) as HTMLElement[]).find((element) => element.classList.contains('btn-menu-item') && !element.classList.contains('hide')) || elem;\n\n let {scrollWidth: menuWidth} = getScrollWidthFromElement;\n const {scrollHeight: menuHeight} = elem;\n // let {innerWidth: windowWidth, innerHeight: windowHeight} = window;\n const rect = document.body.getBoundingClientRect();\n const windowWidth = rect.width;\n const windowHeight = rect.height;\n\n menuWidth += getScrollWidthFromElement.offsetLeft * 2;\n\n let paddingTop = PADDING_TOP, paddingRight = PADDING_RIGHT, paddingBottom = PADDING_BOTTOM, paddingLeft = PADDING_LEFT;\n if(additionalPadding) {\n if(additionalPadding.top) paddingTop += additionalPadding.top;\n if(additionalPadding.right) paddingRight += additionalPadding.right;\n if(additionalPadding.bottom) paddingBottom += additionalPadding.bottom;\n if(additionalPadding.left) paddingLeft += additionalPadding.left;\n }\n\n side = mediaSizes.isMobile ? 'right' : 'left';\n let verticalSide: 'top' /* | 'bottom' */ | 'center' = 'top';\n\n const maxTop = windowHeight - menuHeight - paddingBottom;\n const maxLeft = windowWidth - menuWidth - paddingRight;\n const minTop = paddingTop;\n const minLeft = paddingLeft;\n\n const getSides = () => {\n return {\n x: {\n left: pageX,\n right: Math.min(maxLeft, pageX - menuWidth)\n },\n intermediateX: side === 'right' ? minLeft : maxLeft,\n // intermediateX: clientX < windowWidth / 2 ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\n y: {\n top: pageY,\n bottom: pageY - menuHeight\n },\n // intermediateY: verticalSide === 'top' ? paddingTop : windowHeight - menuHeight - paddingTop,\n // intermediateY: pageY < (windowHeight / 2) ? paddingTop : windowHeight - menuHeight - paddingBottom,\n intermediateY: maxTop\n };\n };\n\n const sides = getSides();\n\n const possibleSides = {\n x: {\n left: (sides.x.left + menuWidth + paddingRight) <= windowWidth,\n right: sides.x.right >= paddingLeft\n },\n y: {\n top: (sides.y.top + menuHeight + paddingBottom) <= windowHeight,\n bottom: (sides.y.bottom - paddingBottom) >= paddingBottom\n }\n };\n\n /* if(side === undefined) {\n if((clientX + menuWidth + PADDING_LEFT) > windowWidth) {\n side = 'right';\n }\n } */\n\n {\n /* const x = sides.x;\n\n const s = Object.keys(x) as (keyof typeof possibleSides.x)[];\n if(side) {\n s.findAndSplice((s) => s === side);\n s.unshift(side);\n }\n\n const possibleSide = s.find((s) => possibleSides.x[s]); */\n // let left: number;\n /* if(possibleSide) {\n left = x[possibleSide];\n side = possibleSide;\n } else {\n left = sides.intermediateX;\n side = undefined;\n } */\n const left = possibleSides.x[side] ? sides.x[side] : (side = 'center', sides.intermediateX);\n\n elem.style.left = left + 'px';\n }\n\n /* if((clientY + menuHeight + PADDING_TOP) > windowHeight) {\n elem.style.top = clamp(clientY - menuHeight, PADDING_TOP, windowHeight - menuHeight - PADDING_TOP) + 'px';\n // elem.style.top = (innerHeight - scrollHeight - PADDING_TOP) + 'px';\n verticalSide = 'bottom';\n } else {\n elem.style.top = Math.max(PADDING_TOP, clientY) + 'px';\n verticalSide = 'top';\n } */\n\n {\n const top = possibleSides.y[verticalSide] ? sides.y[verticalSide] : (verticalSide = 'center', sides.intermediateY);\n\n elem.style.top = top + 'px';\n }\n\n elem.className = elem.className.replace(/(top|center|bottom)-(left|center|right)/g, '');\n elem.classList.add(\n // (verticalSide === 'center' ? verticalSide : (verticalSide === 'bottom' ? 'top' : 'bottom')) +\n (verticalSide === 'center' ? verticalSide : 'bottom') +\n '-' +\n (side === 'center' ? side : (side === 'left' ? 'right' : 'left')));\n\n return {\n width: menuWidth,\n height: menuHeight\n };\n}\n","import {RestrictionReason} from '../layer';\n\nconst platforms = new Set([\n 'all',\n 'web',\n 'webk'\n]);\n\nconst ignore = new Set();\n\nexport function getRestrictionReason(reasons: RestrictionReason[]) {\n // return reasons[0];\n return reasons.find((reason) => platforms.has(reason.platform) && !ignore.has(reason.reason));\n}\n\nexport function isRestricted(reasons: RestrictionReason[]) {\n return !!getRestrictionReason(reasons);\n}\n\nexport function ignoreRestrictionReasons(reasons: string[]) {\n ignore.clear();\n reasons.forEach((reason) => {\n ignore.add(reason);\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 {MyDocument} from '../lib/appManagers/appDocsManager';\nimport rootScope from '../lib/rootScope';\n\nconst savingLottiePreview: {[docId: DocId]: {width: number, height: number}} = {};\n\nexport function isSavingLottiePreview(doc: MyDocument, toneIndex: number, width: number, height: number) {\n const key = doc.id + '-' + toneIndex;\n const saving = savingLottiePreview[key];\n return saving && saving.width >= width && saving.height >= height;\n}\n\nexport async function saveLottiePreview(doc: MyDocument, canvas: HTMLCanvasElement, toneIndex: number) {\n const key = doc.id + '-' + toneIndex;\n const {width, height} = canvas;\n if(isSavingLottiePreview(doc, toneIndex, width, height)) {\n return;\n }\n\n const saving = savingLottiePreview[key] = {\n width,\n height\n };\n\n const thumb = await rootScope.managers.appDocsManager.getLottieCachedThumb(doc.id, toneIndex);\n if(savingLottiePreview[key] !== saving) {\n return;\n }\n\n if(thumb && thumb.w >= width && thumb.h >= height) {\n return;\n }\n\n const promise = new Promise((resolve) => {\n canvas.toBlob((blob) => resolve(blob));\n });\n\n const blob = await promise;\n if(savingLottiePreview[key] !== saving) {\n return;\n }\n\n // console.log('got lottie preview', doc, blob, URL.createObjectURL(blob));\n\n rootScope.managers.appDocsManager.saveLottiePreview(doc.id, blob, width, height, toneIndex);\n\n // delete 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","// * 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 Scrollable from '../components/scrollable';\nimport safeAssign from './object/safeAssign';\n\nexport default class ScrollableLoader {\n public loading = false;\n private scrollable: Scrollable;\n private getPromise: () => Promise;\n private promise: Promise;\n private loaded = false;\n\n constructor(options: {\n scrollable: ScrollableLoader['scrollable'],\n getPromise: ScrollableLoader['getPromise']\n }) {\n safeAssign(this, options);\n\n options.scrollable.onScrolledBottom = () => {\n this.load();\n };\n }\n\n public load() {\n if(this.loaded) {\n return Promise.resolve();\n }\n\n if(this.loading) {\n return this.promise;\n }\n\n this.loading = true;\n this.promise = this.getPromise().then((done) => {\n this.loading = false;\n this.promise = undefined;\n\n if(done) {\n this.loaded = true;\n this.scrollable.onScrolledBottom = null;\n } else {\n this.scrollable.checkForTriggers();\n }\n }, () => {\n this.promise = undefined;\n this.loading = 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 type {MediaSearchContext} from '../components/appMediaPlaybackController';\nimport type {SearchSuperContext} from '../components/appSearchSuper.';\nimport type {Message} from '../layer';\nimport type {MessagesStorageKey, MyMessage} from '../lib/appManagers/appMessagesManager';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport incrementMessageId from '../lib/appManagers/utils/messageId/incrementMessageId';\nimport rootScope from '../lib/rootScope';\nimport forEachReverse from './array/forEachReverse';\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 private otherSideLoader: SearchListLoader;\n private managers: AppManagers;\n\n constructor(options: Omit, 'loadMore'> & {\n onEmptied?: () => void,\n isInner?: boolean,\n managers?: AppManagers\n } = {}) {\n super({\n ...options,\n loadMore: (anchor, older, loadCount) => {\n const backLimit = older ? 0 : loadCount;\n let maxId = anchor?.mid;\n\n if(maxId === undefined) maxId = this.searchContext.maxId;\n if(!older) maxId = incrementMessageId(maxId, 1);\n\n return this.managers.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: async(message) => {\n const filtered = await this.filterMids([message.mid]);\n if(!filtered.length) {\n return;\n }\n\n return options.processItem(message);\n }\n });\n\n this.managers ??= rootScope.managers;\n rootScope.addEventListener('history_delete', this.onHistoryDelete);\n rootScope.addEventListener('history_multiappend', this.onHistoryMultiappend);\n rootScope.addEventListener('message_sent', this.onMessageSent);\n\n if(!options.isInner) {\n this.otherSideLoader = new SearchListLoader({\n ...options,\n isInner: true\n });\n\n // this.otherSideLoader.onLoadedMore = () => {\n\n // };\n }\n }\n\n protected async filterMids(mids: number[]) {\n const storageKey: MessagesStorageKey = `${this.searchContext.peerId}_${this.searchContext.isScheduled ? 'scheduled' : 'history'}`;\n const filtered = (await this.managers.appMessagesManager.filterMessagesByInputFilterFromStorage(this.searchContext.inputFilter._, mids, storageKey, 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 this.current = undefined;\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 = async(message: Message.message | Message.messageService) => {\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 if(message.peerId !== this.searchContext.peerId) {\n return;\n }\n\n const filtered = await this.filterMids([message.mid]);\n const targets = (await Promise.all(filtered.map((message) => this.processItem(message)))).filter(Boolean);\n if(targets.length) {\n /* const {previous, current, next} = this;\n const targets = previous.concat(current, next);\n const currentIdx = targets.length;\n const mid = targets[0].mid;\n let i = 0, length = targets.length;\n for(; i < length; ++i) {\n const target = targets[i];\n if(!target || mid < target.mid) {\n break;\n }\n }\n\n if(i < currentIdx) previous.push(...targets);\n else next. */\n\n if(!this.current) {\n this.previous.push(...targets);\n } else {\n this.next.push(...targets);\n }\n }\n };\n\n protected onMessageSent = ({message}: {message: MyMessage}) => {\n this.onHistoryMultiappend(message);\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 === false) {\n this.loadedAllDown = this.loadedAllUp = true;\n }\n\n if(this.otherSideLoader) {\n this.otherSideLoader.setSearchContext(context);\n }\n }\n\n public reset() {\n super.reset();\n this.searchContext = undefined;\n\n if(this.otherSideLoader) {\n this.otherSideLoader.reset();\n }\n }\n\n public getPrevious(withOtherSide?: boolean) {\n let previous = this.previous;\n\n if(this.otherSideLoader && withOtherSide) {\n previous = previous.concat(this.otherSideLoader.previous);\n }\n\n return previous;\n }\n\n public getNext(withOtherSide?: boolean) {\n let next = this.next;\n\n if(this.otherSideLoader && withOtherSide) {\n next = next.concat(this.otherSideLoader.next);\n }\n\n return next;\n }\n\n public getCurrent() {\n return this.current || this.otherSideLoader?.current;\n }\n\n private goToOtherEnd(length: number) {\n if(length > 0) return this.go(-this.previous.length);\n else return this.go(this.next.length);\n }\n\n public goRound(length: number, dispatchJump?: boolean) {\n let ret: ReturnType['goUnsafe']>;\n\n if(this.otherSideLoader?.current) {\n ret = this.otherSideLoader.goUnsafe(length, dispatchJump);\n if(ret.item) {\n return ret.item;\n }\n\n length = ret.leftLength;\n if(!(length > 0 ? this.otherSideLoader.next : this.otherSideLoader.previous).length) {\n const loaded = length > 0 ? this.otherSideLoader.loadedAllUp : this.otherSideLoader.loadedAllDown;\n if(!loaded) { // do not reset anything until it's loaded\n return;\n }\n\n // if other side is loaded too will start from its begin\n if((length > 0 && (this.otherSideLoader.searchContext.maxId === 1 || this.otherSideLoader.loadedAllDown)) ||\n (length < 0 && (this.otherSideLoader.searchContext.maxId === 0 || this.otherSideLoader.loadedAllUp))) {\n return this.otherSideLoader.goToOtherEnd(length);\n }\n\n this.otherSideLoader.unsetCurrent(length > 0);\n }\n }\n\n ret = this.goUnsafe(length, dispatchJump);\n if(!ret.item) {\n if(this.loadedAllUp && this.loadedAllDown) { // just use the same loader if the list is too short\n return this.goToOtherEnd(length);\n } else if(this.otherSideLoader) {\n length = ret.leftLength;\n ret = this.otherSideLoader.goUnsafe(length, dispatchJump);\n\n if(ret.item) {\n this.unsetCurrent(length > 0);\n }\n }\n }\n\n return ret?.item;\n }\n\n // public setTargets(previous: Item[], next: Item[], reverse: boolean) {\n // super.setTargets(previous, next, reverse);\n // }\n\n protected setLoaded(down: boolean, value: boolean) {\n const changed = super.setLoaded(down, value);\n\n if(changed &&\n this.otherSideLoader &&\n value &&\n this.searchContext?.useSearch !== false/* &&\n (this.reverse ? this.loadedAllUp : this.loadedAllDown) */) {\n const reverse = this.loadedAllUp;\n this.otherSideLoader.setSearchContext({\n ...this.searchContext,\n maxId: reverse ? 1 : 0\n });\n\n // these 'reverse' are different, not a mistake here.\n this.otherSideLoader.reverse = this.reverse;\n this.otherSideLoader.setLoaded(reverse, true);\n this.otherSideLoader.load(!reverse);\n }\n\n return changed;\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 if(this.otherSideLoader) {\n this.otherSideLoader.cleanup();\n this.otherSideLoader = 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 generateMessageId from './generateMessageId';\nimport getServerMessageId from './getServerMessageId';\n\nexport default function incrementMessageId(messageId: number, increment: number) {\n return generateMessageId(getServerMessageId(messageId) + increment);\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 {fastRaf} from './schedulers';\nimport deferredPromise, {CancellablePromise} from './cancellablePromise';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport isInDOM from './dom/isInDOM';\n\nclass SequentialDom {\n private promises: Partial<{\n read: CancellablePromise,\n write: CancellablePromise\n }> = {};\n private raf = fastRaf.bind(null);\n private scheduled = false;\n\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\n let promise = this.promises[kind];\n if(!promise) {\n this.scheduleFlush();\n promise = this.promises[kind] = deferredPromise();\n }\n\n if(callback !== undefined) {\n promise.then(() => callback());\n }\n\n return promise;\n }\n\n public measure(callback?: VoidFunction) {\n return this.do('read', callback);\n }\n\n public mutate(callback?: VoidFunction) {\n return this.do('write', callback);\n }\n\n /**\n * Will fire instantly if element is not connected\n * @param element\n * @param callback\n */\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\n const isConnected = isInDOM(element);\n const promise = isConnected ? this.mutate() : Promise.resolve();\n\n if(callback !== undefined) {\n if(!isConnected) {\n callback();\n } else {\n promise.then(() => callback());\n }\n }\n\n return promise;\n }\n\n private scheduleFlush() {\n if(!this.scheduled) {\n this.scheduled = true;\n\n this.raf(() => {\n this.promises.read && this.promises.read.resolve();\n this.promises.write && this.promises.write.resolve();\n\n this.scheduled = false;\n this.promises = {};\n });\n }\n }\n}\n\nconst sequentialDom = new SequentialDom();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\nexport default sequentialDom;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {PhotoSize, WebDocument} from '../layer';\nimport {REPLIES_HIDDEN_CHANNEL_ID} from '../lib/mtproto/mtproto_config';\nimport {MyDocument} from '../lib/appManagers/appDocsManager';\nimport {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport choosePhotoSize from '../lib/appManagers/utils/photos/choosePhotoSize';\nimport {MediaSize, makeMediaSize} from './mediaSize';\nimport isWebDocument from '../lib/appManagers/utils/webDocs/isWebDocument';\n\nexport default function setAttachmentSize(\n photo: MyPhoto | MyDocument | WebDocument,\n element: HTMLElement | SVGForeignObjectElement,\n boxWidth: number,\n boxHeight: number,\n noZoom = true,\n message?: any,\n pushDocumentSize?: boolean,\n photoSize?: ReturnType\n) {\n const _isWebDocument = isWebDocument(photo);\n // if(_isWebDocument && pushDocumentSize === undefined) {\n // pushDocumentSize = true;\n // }\n\n if(!photoSize) {\n photoSize = 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 || _isWebDocument) {\n size = makeMediaSize(photo.w || (photoSize as PhotoSize.photoSize).w || 512, photo.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.type) || _isWebDocument) {\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.toChatId() !== REPLIES_HIDDEN_CHANNEL_ID)\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 * 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} from '../lib/logger';\nimport insertInDescendSortedArray from './array/insertInDescendSortedArray';\nimport {getMiddleware, MiddlewareHelper} from './middleware';\nimport middlewarePromise from './middlewarePromise';\nimport safeAssign from './object/safeAssign';\nimport pause from './schedulers/pause';\n\nexport type SortedElementBase = {\n id: T,\n index: number\n};\n\nlet id = 0;\n\nexport class BatchProcessor {\n protected queue: Promise[];\n protected promise: Promise;\n\n protected middlewareHelper: MiddlewareHelper;\n protected log: ReturnType;\n\n protected process: (batch: Item[], m: ReturnType, log: BatchProcessor['log']) => Promise;\n protected possibleError: any;\n\n constructor(options: {\n log?: BatchProcessor['log'],\n // middleware: MiddlewareHelper,\n process: BatchProcessor['process'],\n possibleError?: BatchProcessor['possibleError']\n }) {\n safeAssign(this, options);\n\n this.queue = [];\n this.middlewareHelper ??= getMiddleware();\n\n const prefix = 'BATCH-PROCESSOR-' + ++id;\n if(this.log) {\n this.log = this.log.bindPrefix(prefix);\n } else {\n this.log = logger(prefix);\n }\n }\n\n public get queuePromise() {\n return this.promise;\n }\n\n public clear() {\n this.log('clear');\n this.queue.length = 0;\n this.promise = undefined;\n this.middlewareHelper.clean();\n }\n\n public addToQueue(item: BatchProcessor['queue'][0]) {\n this.queue.push(item);\n return this.setQueue();\n }\n\n protected setQueue() {\n if(!this.queue.length) {\n return Promise.resolve();\n }\n\n if(this.promise) {\n return this.promise;\n }\n\n const middleware = this.middlewareHelper.get();\n const log = this.log.bindPrefix('queue');\n const m = middlewarePromise(middleware, this.possibleError);\n\n const processQueue = async(): Promise => {\n log('start', this.queue.length);\n\n const queue = this.queue.splice(0, this.queue.length);\n\n const perf = performance.now();\n const promises = queue.map((promise) => {\n promise.then((details) => {\n log('render item time', performance.now() - perf, details);\n });\n\n return promise;\n });\n\n const renderedQueue = await m(Promise.all(promises));\n await m(this.process(renderedQueue, m, log));\n\n log('queue rendered');\n\n if(this.queue.length) {\n log('have new items to render');\n return processQueue();\n } else {\n log('end');\n }\n };\n\n log('setting pause');\n const promise = this.promise = m(pause(0))\n .then(\n () => processQueue().catch((err: ApiError) => {\n if(err !== this.possibleError) {\n log.error('process queue error', err);\n }\n\n throw err;\n }),\n (err) => {\n log('pause has been cleared');\n throw err;\n }\n )\n .finally(() => {\n if(this.promise === promise) {\n this.promise = undefined;\n }\n });\n\n return promise;\n }\n}\n\nexport default class SortedList {\n protected elements: Map;\n protected sorted: Array;\n\n protected getIndex: (element: SortedElement) => PromiseLike | 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) => PromiseLike | SortedElement;\n\n protected updateElementWith = (callback: () => void) => callback();\n protected updateListWith = (callback: (canUpdate: boolean | undefined) => void) => callback(true);\n\n protected middleware: MiddlewareHelper;\n\n protected batchProcessor: BatchProcessor;\n\n protected log: ReturnType;\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 log?: SortedList['log']\n }) {\n safeAssign(this, options);\n\n this.elements = new Map();\n this.sorted = [];\n this.middleware = getMiddleware();\n\n this.batchProcessor = new BatchProcessor({\n log: this.log,\n process: async(batch, m, log) => {\n // const elements = await Promise.all(batch.map((element) => this.onElementCreate(element)));\n const elements = batch;\n const promises = elements.map((element) => this.update(element.id, element));\n await m(Promise.all(promises));\n }\n });\n }\n\n public clear() {\n this.batchProcessor.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);\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 callback?.(false);\n return;\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 async add(id: SortedElementId) {\n const element = this.get(id);\n if(element) {\n return;\n // return element;\n }\n\n const base: SortedElementBase = {\n id,\n index: 0\n };\n\n this.elements.set(id, base as SortedElement);\n const createPromise = Promise.resolve(this.onElementCreate(base));\n return this.batchProcessor.addToQueue(createPromise);\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 async update(id: SortedElementId, element = this.get(id)) {\n if(!element) {\n return;\n }\n\n element.index = await this.getIndex(element);\n if(this.get(id) !== element) {\n return;\n }\n\n this.onUpdate?.(element);\n\n const idx = insertInDescendSortedArray(this.sorted, element, 'index');\n this.onSort(element, idx);\n }\n}\n","const BOM = '๏ปฟ';\n// const BOM = 'K';\nexport default BOM;\n","export default function encodeEntities(value: string) {\n return value.replace(/&/g, '&').replace(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g, (value) => {\n const hi = value.charCodeAt(0);\n const low = value.charCodeAt(1);\n return '&#' + (((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000) + ';';\n }).replace(/([^\\#-~| |!])/g, (value) => { // non-alphanumeric\n return '&#' + value.charCodeAt(0) + ';';\n }).replace(//g, '>');\n}\n","// credits to https://github.com/sindresorhus/escape-string-regexp/blob/master/index.js\nexport default function escapeRegExp(str: string) {\n return str\n .replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&')\n .replace(/-/g, '\\\\x2d');\n}\n","export default function limitSymbols(str: string, length: number, limitFrom = length + 10) {\n str = str.trim();\n if(str.length > limitFrom) {\n str = str.slice(0, length)/* .replace(/\\s*$/, '') */ + '...';\n }\n\n return str;\n}\n","export default function toHHMMSS(str: string | number, leadZero = false) {\n const sec_num = parseInt(str + '', 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","export default function textToSvgURL(text: string) {\n const blob = new Blob([text], {type: 'image/svg+xml;charset=utf-8'});\n\n // * because iOS Safari doesn't want to eat objectURL\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.onload = (e) => {\n resolve(e.target.result as string);\n };\n reader.readAsDataURL(blob);\n });\n // return URL.createObjectURL(blob);\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 {MOUNT_CLASS_TO} from '../config/debug';\nimport {IS_WORKER} from './context';\n\nexport class WindowSize {\n public width: number;\n public height: number;\n\n constructor() {\n if(IS_WORKER) {\n return;\n }\n\n const w = 'visualViewport' in window ? window.visualViewport : window;\n const set = () => {\n this.width = w.width || (w as any as Window).innerWidth;\n this.height = w.height || (w as any as Window).innerHeight;\n };\n w.addEventListener('resize', set);\n set();\n }\n}\n\nconst windowSize = new WindowSize();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.windowSize = windowSize);\nexport default windowSize;\n","/*\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// * Jolly Cobra's useHeavyAnimationCheck.ts, patched\n\nimport {AnyToVoidFunction} from '../types';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport DEBUG from '../config/debug';\nimport pause from '../helpers/schedulers/pause';\nimport EventListenerBase from '../helpers/eventListenerBase';\n\nconst eventListener = new EventListenerBase<{\n start: () => void,\n end: () => void\n}>();\nconst ANIMATION_START_EVENT = 'start';\nconst ANIMATION_END_EVENT = 'end';\n\nlet isAnimating = false;\nlet heavyAnimationPromise: CancellablePromise = deferredPromise();\nlet promisesInQueue = 0;\n\nheavyAnimationPromise.resolve();\n\nconst log = console.log.bind(console.log, '[HEAVY-ANIMATION]:');\n\nexport function dispatchHeavyAnimationEvent(promise: Promise, timeout?: number) {\n if(!isAnimating) {\n heavyAnimationPromise = deferredPromise();\n eventListener.dispatchEvent(ANIMATION_START_EVENT);\n isAnimating = true;\n DEBUG && log('start');\n }\n\n ++promisesInQueue;\n DEBUG && log('attach promise, length:', promisesInQueue, timeout);\n\n const promises = [\n timeout !== undefined ? pause(timeout) : undefined,\n promise.finally(() => {})\n ].filter(Boolean);\n\n const perf = performance.now();\n const _heavyAnimationPromise = heavyAnimationPromise;\n Promise.race(promises).then(() => {\n if(heavyAnimationPromise !== _heavyAnimationPromise || heavyAnimationPromise.isFulfilled) { // interrupted\n return;\n }\n\n --promisesInQueue;\n DEBUG && log('promise end, length:', promisesInQueue, performance.now() - perf);\n if(promisesInQueue <= 0) {\n onHeavyAnimationEnd();\n }\n });\n\n return heavyAnimationPromise;\n}\n\n(window as any).dispatchHeavyAnimationEvent = dispatchHeavyAnimationEvent;\n\nfunction onHeavyAnimationEnd() {\n if(heavyAnimationPromise.isFulfilled) {\n return;\n }\n\n isAnimating = false;\n promisesInQueue = 0;\n eventListener.dispatchEvent(ANIMATION_END_EVENT);\n heavyAnimationPromise.resolve();\n\n DEBUG && log('end');\n}\n\nexport function interruptHeavyAnimation() {\n onHeavyAnimationEnd();\n}\n\nexport function getHeavyAnimationPromise() {\n return heavyAnimationPromise;\n}\n\nexport default function(\n handleAnimationStart: AnyToVoidFunction,\n handleAnimationEnd: AnyToVoidFunction,\n listenerSetter?: ListenerSetter\n) {\n // useEffect(() => {\n if(isAnimating) {\n handleAnimationStart();\n }\n\n const add = listenerSetter ? listenerSetter.add(eventListener) : eventListener.addEventListener.bind(eventListener);\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, eventListener) : eventListener.removeEventListener.bind(eventListener);\n add(ANIMATION_START_EVENT, handleAnimationStart);\n add(ANIMATION_END_EVENT, handleAnimationEnd);\n\n return () => {\n remove(ANIMATION_END_EVENT, handleAnimationEnd);\n remove(ANIMATION_START_EVENT, handleAnimationStart);\n };\n // }, [handleAnimationEnd, handleAnimationStart]);\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 '../lib/appManagers/appMessagesManager';\nimport type {ForumTopic} from '../layer';\nimport appDialogsManager, {DIALOG_LIST_ELEMENT_TAG} from '../lib/appManagers/appDialogsManager';\nimport rootScope from '../lib/rootScope';\nimport {ButtonMenuItemOptionsVerifiable, ButtonMenuSync} from './buttonMenu';\nimport PopupDeleteDialog from './popups/deleteDialog';\nimport {i18n, LangPackKey, _i18n} from '../lib/langPack';\nimport findUpTag from '../helpers/dom/findUpTag';\nimport {toastNew} from './toast';\nimport PopupMute from './popups/mute';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport {GENERAL_TOPIC_ID} from '../lib/mtproto/mtproto_config';\nimport showLimitPopup from './popups/limit';\nimport createContextMenu from '../helpers/dom/createContextMenu';\n\nexport default class DialogsContextMenu {\n private buttons: ButtonMenuItemOptionsVerifiable[];\n\n private peerId: PeerId;\n private filterId: number;\n private threadId: number;\n private dialog: Dialog | ForumTopic.forumTopic;\n private canManageTopics: boolean;\n private li: HTMLElement;\n\n constructor(private managers: AppManagers) {\n\n }\n\n public attach(element: HTMLElement) {\n createContextMenu({\n listenTo: element,\n buttons: this.getButtons(),\n appendTo: document.getElementById('page-chats'),\n onOpen: async(li) => {\n this.li = li;\n li.classList.add('menu-open');\n this.peerId = li.dataset.peerId.toPeerId();\n this.threadId = +li.dataset.threadId || undefined;\n this.dialog = await this.managers.dialogsStorage.getDialogOrTopic(this.peerId, this.threadId);\n this.filterId = this.threadId ? undefined : appDialogsManager.filterId;\n this.canManageTopics = this.threadId ? await this.managers.appChatsManager.hasRights(this.peerId.toChatId(), 'manage_topics') : undefined;\n },\n onBeforeOpen: async() => {\n // delete button\n const langPackKey: LangPackKey = this.threadId ? 'Delete' : await this.managers.appPeersManager.getDeleteButtonText(this.peerId);\n const lastButton = this.buttons[this.buttons.length - 1];\n if(lastButton?.element) {\n lastButton.element.lastChild.replaceWith(i18n(langPackKey));\n }\n },\n onClose: () => {\n this.li.classList.remove('menu-open');\n this.li = this.peerId = this.dialog = this.filterId = this.threadId = this.canManageTopics = undefined;\n },\n findElement: (e) => {\n return findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\n }\n });\n }\n\n private getButtons() {\n return this.buttons ??= [{\n icon: 'unread',\n text: 'MarkAsUnread',\n onClick: this.onUnreadClick,\n verify: async() => !this.threadId && !(await this.managers.appMessagesManager.isDialogUnread(this.dialog))\n }, {\n icon: 'readchats',\n text: 'MarkAsRead',\n onClick: this.onUnreadClick,\n verify: () => this.managers.appMessagesManager.isDialogUnread(this.dialog)\n }, {\n icon: 'pin',\n text: 'ChatList.Context.Pin',\n onClick: this.onPinClick,\n verify: async() => {\n if(this.threadId && !this.canManageTopics) {\n return false;\n }\n\n const isPinned = this.filterId !== undefined && this.filterId > 1 ?\n (await this.managers.appMessagesManager.getFilter(this.filterId)).pinnedPeerIds.includes(this.dialog.peerId) :\n !!this.dialog.pFlags?.pinned;\n return !isPinned;\n }\n }, {\n icon: 'unpin',\n text: 'ChatList.Context.Unpin',\n onClick: this.onPinClick,\n verify: async() => {\n if(this.threadId && !this.canManageTopics) {\n return false;\n }\n\n const isPinned = this.filterId !== undefined && this.filterId > 1 ?\n (await this.managers.appMessagesManager.getFilter(this.filterId)).pinnedPeerIds.includes(this.dialog.peerId) :\n !!this.dialog.pFlags?.pinned;\n return isPinned;\n }\n }, {\n icon: 'mute',\n text: 'ChatList.Context.Mute',\n onClick: this.onMuteClick,\n verify: async() => {\n return this.peerId !== rootScope.myId && !(await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.dialog.peerId, threadId: this.threadId}));\n }\n }, {\n icon: 'unmute',\n text: 'ChatList.Context.Unmute',\n onClick: this.onUnmuteClick,\n verify: async() => {\n return this.peerId !== rootScope.myId && (await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.dialog.peerId, threadId: this.threadId}));\n }\n }, {\n icon: 'archive',\n text: 'Archive',\n onClick: this.onArchiveClick,\n verify: () => this.filterId === 0 && this.peerId !== rootScope.myId\n }, {\n icon: 'unarchive',\n text: 'Unarchive',\n onClick: this.onArchiveClick,\n verify: () => this.filterId === 1 && this.peerId !== rootScope.myId\n }, {\n icon: 'hide',\n text: 'Hide',\n onClick: this.onHideTopicClick,\n verify: () => {\n return this.canManageTopics && (this.dialog as ForumTopic.forumTopic).id === GENERAL_TOPIC_ID;\n }\n }, {\n icon: 'lock',\n text: 'CloseTopic',\n onClick: this.onToggleTopicClick,\n verify: () => {\n return this.canManageTopics && !(this.dialog as ForumTopic.forumTopic).pFlags.closed;\n }\n }, {\n icon: 'lockoff',\n text: 'RestartTopic',\n onClick: this.onToggleTopicClick,\n verify: () => {\n return this.canManageTopics && !!(this.dialog as ForumTopic.forumTopic).pFlags.closed;\n }\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick,\n verify: () => {\n if(this.threadId) {\n if(!this.canManageTopics) {\n return false;\n }\n\n return (this.dialog as ForumTopic.forumTopic).id !== GENERAL_TOPIC_ID;\n }\n\n return true;\n }\n }];\n }\n\n private onArchiveClick = async() => {\n const dialog = await this.managers.appMessagesManager.getDialogOnly(this.peerId);\n if(dialog) {\n this.managers.appMessagesManager.editPeerFolders([dialog.peerId], +!dialog.folder_id);\n }\n };\n\n private onHideTopicClick = () => {\n this.managers.appChatsManager.editForumTopic({\n chatId: this.peerId.toChatId(),\n topicId: this.threadId,\n hidden: true\n });\n };\n\n private onToggleTopicClick = () => {\n this.managers.appChatsManager.editForumTopic({\n chatId: this.peerId.toChatId(),\n topicId: this.threadId,\n closed: !(this.dialog as ForumTopic.forumTopic).pFlags.closed\n });\n };\n\n private onPinClick = () => {\n const {peerId, filterId, threadId} = this;\n this.managers.appMessagesManager.toggleDialogPin({\n peerId,\n filterId,\n topicId: threadId\n }).catch(async(err: ApiError) => {\n if(err.type === 'PINNED_DIALOGS_TOO_MUCH' || err.type === 'PINNED_TOO_MUCH') {\n if(threadId) {\n this.managers.apiManager.getLimit('topicPin').then((limit) => {\n toastNew({langPackKey: 'LimitReachedPinnedTopics', langPackArguments: [limit]});\n });\n } else if(filterId >= 1) {\n toastNew({langPackKey: 'PinFolderLimitReached'});\n } else {\n showLimitPopup('pin');\n }\n }\n });\n };\n\n private onUnmuteClick = () => {\n this.managers.appMessagesManager.togglePeerMute({peerId: this.peerId, mute: false, threadId: this.threadId});\n };\n\n private onMuteClick = () => {\n new PopupMute(this.peerId, this.threadId);\n };\n\n private onUnreadClick = async() => {\n const {peerId, dialog} = this;\n if(dialog.unread_count) {\n this.managers.appMessagesManager.readHistory(peerId, dialog.top_message, this.threadId);\n\n if(!this.threadId) {\n this.managers.appMessagesManager.markDialogUnread(peerId, true);\n }\n } else if(!this.threadId) {\n this.managers.appMessagesManager.markDialogUnread(peerId);\n }\n };\n\n private onDeleteClick = () => {\n new PopupDeleteDialog(this.peerId, undefined, undefined, this.threadId);\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 App from '../config/app';\nimport DEBUG from '../config/debug';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport {LangPackKey, i18n} from '../lib/langPack';\nimport {logger} from '../lib/logger';\nimport rootScope from '../lib/rootScope';\nimport Button from './button';\nimport ProgressivePreloader from './preloader';\nimport SetTransition from './singleTransition';\nimport sessionStorage from '../lib/sessionStorage';\nimport {ConnectionStatus} from '../lib/mtproto/connectionStatus';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport singleInstance from '../lib/mtproto/singleInstance';\n\nexport default class ConnectionStatusComponent {\n public static CHANGE_STATE_DELAY = 1000;\n\n private statusContainer: HTMLElement;\n private statusEl: HTMLElement;\n private statusPreloader: ProgressivePreloader;\n\n private currentLangPackKey: LangPackKey;\n\n private hadConnect = false;\n private retryAt: number;\n private connecting = false;\n private timedOut = false;\n private updating = false;\n\n private log: ReturnType;\n\n private setFirstConnectionTimeout: number;\n private setStateTimeout: number;\n\n constructor(private managers: AppManagers, chatsContainer: HTMLElement) {\n this.log = logger('CS', undefined, undefined);\n\n this.statusContainer = document.createElement('div');\n this.statusContainer.classList.add('connection-status'/* , 'hide' */);\n\n this.statusEl = Button('btn-primary bg-warning connection-status-button', {noRipple: true});\n this.statusPreloader = new ProgressivePreloader({cancelable: false});\n this.statusPreloader.constructContainer({color: 'transparent', bold: true});\n this.statusContainer.append(this.statusEl);\n\n chatsContainer.prepend(this.statusContainer);\n\n rootScope.addEventListener('connection_status_change', (status) => {\n // console.log(status);\n\n this.setConnectionStatus();\n });\n\n rootScope.addEventListener('state_synchronizing', (channelId) => {\n if(!channelId) {\n this.updating = true;\n DEBUG && this.log('updating', this.updating);\n this.setState();\n }\n });\n\n rootScope.addEventListener('state_synchronized', (channelId) => {\n DEBUG && this.log('state_synchronized', channelId);\n if(!channelId) {\n this.updating = false;\n DEBUG && this.log('updating', this.updating);\n this.setState();\n }\n });\n\n this.setFirstConnectionTimeout = window.setTimeout(this.setConnectionStatus, ConnectionStatusComponent.CHANGE_STATE_DELAY + 1e3);\n\n // let bool = true;\n // document.addEventListener('dblclick', () => {\n // this.setConnectionStatus(bool ? (bool = false, ConnectionStatus.Closed) : (bool = true, ConnectionStatus.Connected));\n // });\n }\n\n private setConnectionStatus = (overrideStatus?: ConnectionStatus) => {\n Promise.all([\n sessionStorage.get('dc'),\n rootScope.managers.rootScope.getConnectionStatus()\n ]).then(([baseDcId, connectionStatus]) => {\n if(!baseDcId) {\n baseDcId = App.baseDcId;\n }\n\n if(this.setFirstConnectionTimeout) {\n clearTimeout(this.setFirstConnectionTimeout);\n this.setFirstConnectionTimeout = 0;\n }\n\n const status = connectionStatus['NET-' + baseDcId];\n const online = status && (overrideStatus || status.status) === ConnectionStatus.Connected;\n\n if(this.connecting && online) {\n this.managers.apiUpdatesManager.forceGetDifference();\n }\n\n if(online && !this.hadConnect) {\n this.hadConnect = true;\n }\n\n this.timedOut = status && (overrideStatus || status.status) === ConnectionStatus.TimedOut;\n this.connecting = !online;\n this.retryAt = status && status.retryAt;\n DEBUG && this.log('connecting', this.connecting);\n this.setState();\n });\n };\n\n private setStatusText = (langPackKey: LangPackKey, args?: any[]) => {\n if(this.currentLangPackKey === langPackKey) return;\n this.currentLangPackKey = langPackKey;\n replaceContent(this.statusEl, i18n(langPackKey, args));\n this.statusPreloader.attach(this.statusEl);\n };\n\n private getA(langPackKey: LangPackKey, callback: () => void) {\n const a = document.createElement('a');\n a.classList.add('force-reconnect');\n a.append(i18n(langPackKey));\n attachClickEvent(a, (e) => {\n cancelEvent(e);\n callback();\n });\n\n return a;\n }\n\n private setState = () => {\n if(singleInstance.deactivatedReason) {\n return;\n }\n\n const timeout = ConnectionStatusComponent.CHANGE_STATE_DELAY;\n if(this.connecting) {\n if(this.timedOut) {\n const a = this.getA('ConnectionStatus.ForceReconnect', () => this.managers.networkerFactory.forceReconnect());\n this.setStatusText('ConnectionStatus.TimedOut', [a]);\n } else if(this.hadConnect) {\n if(this.retryAt !== undefined) {\n const timerSpan = document.createElement('span');\n const retryAt = this.retryAt;\n const setTime = () => {\n const now = Date.now();\n timerSpan.innerText = '' + Math.max(0, Math.round((retryAt - now) / 1000));\n if(now > retryAt) {\n clearInterval(interval);\n }\n };\n const interval = setInterval(setTime, 1e3);\n setTime();\n\n const a = this.getA('ConnectionStatus.Reconnect', () => this.managers.networkerFactory.forceReconnectTimeout());\n this.setStatusText('ConnectionStatus.ReconnectIn', [timerSpan, a]);\n } else {\n this.setStatusText('ConnectionStatus.Reconnecting');\n }\n } else {\n this.setStatusText('ConnectionStatus.Waiting');\n }\n } else if(this.updating) {\n this.setStatusText('Updating');\n }\n\n DEBUG && this.log('setState', this.connecting || this.updating);\n window.requestAnimationFrame(() => {\n if(this.setStateTimeout) clearTimeout(this.setStateTimeout);\n\n const cb = () => {\n SetTransition({\n element: this.statusContainer,\n className: 'is-shown',\n forwards: this.connecting || this.updating,\n duration: 200\n });\n this.setStateTimeout = 0;\n DEBUG && this.log('setState: isShown:', this.connecting || this.updating);\n };\n\n this.setStateTimeout = window.setTimeout(cb, timeout);\n // cb();\n /* if(timeout) this.setStateTimeout = window.setTimeout(cb, timeout);\n else cb(); */\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\ntype C = 'check' | 'checks' | 'sending' | 'sendingerror' | 'premium_lock';\nexport function setSendingStatus(\n container: HTMLElement,\n message?: C | Message.message | Message.messageService,\n disableAnimationIfRippleFound?: boolean\n) {\n let className: C;\n if(typeof(message) === 'string') {\n className = message;\n } else if(message?.pFlags.out) {\n if(message.error) {\n className = 'sendingerror';\n } else 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","// https://spicyyoghurt.com/tools/easing-functions\nexport default function easeInOutSine(t: number, b: number, c: number, d: number) {\n return t >= d ? b + c : easeInOutSineApply(t / d, c) + b;\n}\n\nexport function easeInOutSineApply(v: number, c: number) {\n return -c / 2 * (Math.cos(Math.PI * v) - 1);\n}\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 const dpr = ctx.canvas.dpr;\n if(dpr) {\n x *= dpr;\n y *= dpr;\n width *= dpr;\n height *= dpr;\n }\n\n if(typeof(radius) === 'number') {\n if(dpr) radius *= dpr;\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] ? (dpr ? radius[side] * dpr : 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/canvas/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","import customProperties from '../dom/customProperties';\nimport clamp from '../number/clamp';\n\nexport default class Shimmer {\n private canvas: HTMLCanvasElement;\n private ctx: CanvasRenderingContext2D;\n private font = '30pt Helvetica';\n private currTime = Date.now();\n private diffTime = 0;\n private spread = 0;\n private paused = false;\n private pausedTime = 0;\n private pauseInterval = 850;\n private lightSource = 0;\n private inc = 0.032;\n private lightSpread = 0.55;\n private animations = ['slide', 'slide', 'slide', 'slide'];\n private currentAnimationIndex = 0;\n private text: string;\n private fillStyle: CanvasRenderingContext2D['fillStyle'];\n\n private keepTime() {\n this.diffTime = Date.now() - this.currTime;\n this.currTime = Date.now();\n }\n\n private cycleAnimation() {\n ++this.currentAnimationIndex;\n if(this.currentAnimationIndex >= this.animations.length) {\n this.currentAnimationIndex = 0;\n }\n }\n\n private animate() {\n const currentAnimation = this.animations[this.currentAnimationIndex];\n if(currentAnimation === 'glow') {\n return this.animateGlow(); // return glow style\n } else if(currentAnimation === 'slide') {\n return this.animateSlide(); // return slide gradient\n } else {\n console.log('unknown animation type: ' + String(currentAnimation));\n }\n }\n\n private animateGlow() {\n var glowEnd = 255,\n rgbStart = 68,\n r = rgbStart,\n g = r,\n b = r,\n increment = 10,\n interval = 800;\n\n return () => {\n var smartInc = increment * (this.diffTime / (1000 / 60));\n if(this.paused) {\n if((Date.now() - this.pausedTime) > interval) {\n r = rgbStart;\n this.cycleAnimation()\n this.paused = false;\n }\n } else {\n r = parseInt('' + (r + smartInc));\n if(r >= glowEnd) {\n this.paused = true;\n this.pausedTime = Date.now()\n }\n }\n return 'rgb('+ r + ',' + r + ',' + r + ')';\n };\n }\n\n private animateSlide(): CanvasGradient {\n var gradient = this.ctx.createLinearGradient(0, 0, this.canvas.width, 0),\n smartInc = this.inc * (this.diffTime / (1000 / 60)),\n lightLeft,\n lightRight,\n lightCenter;\n if(this.paused) {\n if((Date.now() - this.pausedTime) > this.pauseInterval) {\n this.lightSource = -0.6;\n this.cycleAnimation()\n this.paused = false;\n return this.animateSlide();\n }\n } else {\n this.lightSource += smartInc;\n if(this.lightSource > (1 + this.lightSpread)) {\n this.paused = true;\n this.pausedTime = Date.now();\n }\n }\n // lighting positions:\n lightCenter = clamp(this.lightSource, 0, 1);\n lightLeft = clamp(this.lightSource - this.lightSpread, 0, 1);\n lightRight = clamp(this.lightSource + this.lightSpread, 0, 1);\n\n const backgroundColor = customProperties.getProperty('background-color-true');\n const shimmerColor = customProperties.getProperty('surface-color');\n gradient.addColorStop(lightLeft, backgroundColor);\n gradient.addColorStop(lightCenter, shimmerColor);\n gradient.addColorStop(lightRight, backgroundColor);\n\n return gradient;\n }\n\n public settings(dict: Partial<{\n canvas: Shimmer['canvas'],\n fillStyle: Shimmer['fillStyle'],\n font: Shimmer['font'],\n lightSpread: Shimmer['lightSpread'],\n inc: Shimmer['inc'],\n animations: Shimmer['animations'],\n text: Shimmer['text']\n }> = {}) {\n this.canvas = dict.canvas ?? document.createElement('canvas');\n this.ctx = this.canvas.getContext('2d');\n this.font = dict.font ?? this.font;\n this.lightSpread = dict.lightSpread ?? this.lightSpread;\n this.inc = dict.inc ?? this.inc;\n this.animations = dict.animations ?? this.animations;\n this.text = dict.text ?? this.text;\n this.fillStyle = dict.fillStyle;\n\n this.canvas.classList.add('shimmer-canvas');\n }\n\n public on() {\n const {width, height} = this.canvas;\n // record the time we ran:\n this.keepTime();\n // clear and fill the canvas:\n this.ctx.clearRect(0, 0, width, height);\n\n if(this.font) {\n this.ctx.font = this.font;\n }\n\n this.ctx.fillStyle = this.animate() as any;\n this.ctx.fillRect(0, 0, width, height);\n\n if(this.fillStyle) {\n this.ctx.fillStyle = this.fillStyle;\n this.ctx.fillRect(0, 0, width, height);\n }\n\n if(this.text) {\n this.ctx.fillText(this.text, 50, 50);\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 Scrollable from '../components/scrollable';\nimport rootScope from '../lib/rootScope';\nimport {animate} from './animation';\nimport {drawCircleFromStart} from './canvas/drawCircle';\nimport roundRect from './canvas/roundRect';\nimport Shimmer from './canvas/shimmer';\nimport customProperties from './dom/customProperties';\nimport easeInOutSine from './easing/easeInOutSine';\nimport mediaSizes from './mediaSizes';\n\nexport default class DialogsPlaceholder {\n private canvas: HTMLCanvasElement;\n private ctx: CanvasRenderingContext2D;\n private shimmer: Shimmer;\n private tempId: number;\n private detachTime: number;\n\n private length: number;\n private dialogHeight: number;\n private availableLength: number;\n\n private avatarSize: number;\n private marginVertical: number;\n private totalHeight: number;\n private lineHeight: number;\n private lineBorderRadius: number;\n private lineMarginVertical: number;\n private statusWidth: number;\n private generatedValues: {\n firstLineWidth: number,\n secondLineWidth: number,\n statusWidth: number\n }[];\n\n private getRectFrom: () => DOMRectEditable;\n private onRemove: () => void;\n private blockScrollable: Scrollable;\n\n constructor(sizes: Partial<{\n avatarSize: number,\n marginVertical: number,\n totalHeight: number\n }> = {}) {\n this.shimmer = new Shimmer();\n this.tempId = 0;\n this.canvas = document.createElement('canvas');\n this.canvas.classList.add('dialogs-placeholder-canvas');\n this.ctx = this.canvas.getContext('2d');\n\n this.generatedValues = [];\n this.avatarSize = sizes.avatarSize ?? 54;\n this.marginVertical = sizes.marginVertical ?? 9;\n this.totalHeight = sizes.totalHeight ?? (this.avatarSize + this.marginVertical * 2);\n this.lineHeight = 10;\n this.lineBorderRadius = 6;\n this.lineMarginVertical = 8;\n this.statusWidth = 24;\n }\n\n public attach({container, rect, getRectFrom, onRemove, blockScrollable}: {\n container: HTMLElement,\n rect?: ReturnType,\n getRectFrom?: HTMLElement | DialogsPlaceholder['getRectFrom'],\n onRemove?: DialogsPlaceholder['onRemove'],\n blockScrollable?: DialogsPlaceholder['blockScrollable']\n }) {\n const {canvas} = this;\n\n this.onRemove = onRemove;\n this.getRectFrom = typeof(getRectFrom) === 'function' ? getRectFrom : (getRectFrom || container).getBoundingClientRect.bind(getRectFrom || container);\n if(this.blockScrollable = blockScrollable) {\n blockScrollable.container.style.overflowY = 'hidden';\n }\n\n this.updateCanvasSize(rect);\n this.startAnimation();\n container.append(canvas);\n }\n\n public detach(availableLength: number) {\n if(this.detachTime) {\n return;\n }\n\n this.availableLength = availableLength;\n this.detachTime = Date.now();\n\n if(!rootScope.settings.animationsEnabled) {\n this.remove();\n }\n }\n\n public remove() {\n this.stopAnimation();\n\n if(this.canvas.parentElement) {\n this.canvas.remove();\n\n if(this.blockScrollable) {\n this.blockScrollable.container.style.overflowY = '';\n this.blockScrollable = undefined;\n }\n }\n\n this.onRemove?.();\n this.onRemove = undefined;\n }\n\n private updateCanvasSize(rect = this.getRectFrom()) {\n const {canvas} = this;\n const dpr = canvas.dpr = window.devicePixelRatio;\n canvas.width = rect.width * dpr;\n canvas.height = rect.height * dpr;\n canvas.style.width = rect.width + 'px';\n canvas.style.height = rect.height + 'px';\n }\n\n private renderDetachAnimationFrame() {\n const {\n canvas,\n ctx,\n detachTime,\n length,\n availableLength\n } = this;\n\n if(!detachTime) {\n return;\n } else if(!rootScope.settings.animationsEnabled) {\n this.remove();\n return;\n }\n\n const {width} = canvas;\n\n ctx.globalCompositeOperation = 'destination-out';\n\n // ctx.fillStyle = 'rgba(0, 0, 0, 0)';\n // ctx.fillRect(0, 0, width, height);\n\n // const DURATION = 500;\n // const DELAY = DURATION;\n const DURATION = 150;\n const DELAY = 15;\n const elapsedTime = Date.now() - detachTime;\n let completed = true;\n for(let i = 0; i < length; ++i) {\n const delay = availableLength < length && i >= availableLength ? DELAY * (availableLength - 1) : DELAY * i;\n const elapsedRowTime = elapsedTime - delay;\n if(elapsedRowTime <= 0) {\n completed = false;\n continue;\n }\n\n const progress = easeInOutSine(elapsedRowTime, 0, 1, DURATION);\n\n ctx.beginPath();\n ctx.rect(0, this.dialogHeight * i, width, this.dialogHeight);\n ctx.fillStyle = `rgba(0, 0, 0, ${progress})`;\n ctx.fill();\n\n if(progress < 1) {\n completed = false;\n }\n }\n\n // const totalRadius = Math.sqrt(width ** 2 + height ** 2);\n // const gradient = ctx.createRadialGradient(\n // 0, 0, 0,\n // 0, 0, totalRadius);\n // gradient.addColorStop(0, 'rgba(0, 0, 0, 1)');\n // gradient.addColorStop(progress, 'rgba(0, 0, 0, 0)');\n // gradient.addColorStop(1, 'rgba(0, 0, 0, 0)');\n\n // const gradient = ctx.createLinearGradient(0, 0, 0, height);\n // gradient.addColorStop(0, 'rgba(0, 0, 0, 1)');\n // gradient.addColorStop(progress, 'rgba(0, 0, 0, 0)');\n // gradient.addColorStop(1, 'rgba(0, 0, 0, 0)');\n\n // ctx.fillStyle = gradient;\n // ctx.fillRect(0, 0, width, height);\n\n ctx.globalCompositeOperation = 'source-over';\n\n if(completed) {\n this.remove();\n }\n }\n\n private renderFrame() {\n this.shimmer.on();\n this.renderDetachAnimationFrame();\n }\n\n private startAnimation() {\n const {canvas, shimmer} = this;\n const tempId = ++this.tempId;\n const pattern = this.createPattern();\n\n shimmer.settings({\n canvas,\n fillStyle: pattern\n });\n\n const middleware = () => {\n return this.tempId === tempId;\n };\n\n this.renderFrame();\n animate(() => {\n if(!middleware()) {\n return false;\n }\n\n // ! should've removed the loop if animations are disabled\n if(rootScope.settings.animationsEnabled) {\n this.renderFrame();\n }\n\n // ! tempId can be changed during renderFrame\n return middleware();\n });\n\n rootScope.addEventListener('theme_change', this.onThemeChange);\n mediaSizes.addEventListener('resize', this.onResize);\n }\n\n private stopAnimation() {\n ++this.tempId;\n rootScope.removeEventListener('theme_change', this.onThemeChange);\n mediaSizes.removeEventListener('resize', this.onResize);\n }\n\n private onThemeChange = () => {\n this.stopAnimation();\n this.startAnimation();\n };\n\n private onResize = () => {\n const {canvas} = this;\n const {width, height, dpr} = canvas;\n this.updateCanvasSize();\n if(canvas.width === width && canvas.height === height && canvas.dpr === dpr) {\n return;\n }\n\n this.stopAnimation();\n this.startAnimation();\n };\n\n private createPattern() {\n const {canvas, ctx} = this;\n\n const patternCanvas = document.createElement('canvas');\n const patternContext = patternCanvas.getContext('2d');\n const dpr = canvas.dpr;\n patternCanvas.dpr = dpr;\n patternCanvas.width = canvas.width;\n patternCanvas.height = canvas.height;\n\n patternContext.fillStyle = customProperties.getProperty('surface-color');\n patternContext.fillRect(0, 0, patternCanvas.width, patternCanvas.height);\n\n patternContext.fillStyle = '#000';\n patternContext.globalCompositeOperation = 'destination-out';\n\n const dialogHeight = this.dialogHeight = this.totalHeight * dpr;\n const length = this.length = Math.ceil(canvas.height / dialogHeight);\n for(let i = 0; i < length; ++i) {\n this.drawChat(patternContext, i, i * dialogHeight);\n }\n\n return ctx.createPattern(patternCanvas, 'no-repeat');\n }\n\n private drawChat(ctx: CanvasRenderingContext2D, i: number, y: number) {\n let generatedValues = this.generatedValues[i];\n if(!generatedValues) {\n generatedValues = this.generatedValues[i] = {\n firstLineWidth: 40 + Math.random() * 100, // 120\n secondLineWidth: 120 + Math.random() * 130, // 240\n statusWidth: 24 + Math.random() * 16\n };\n }\n\n const {\n firstLineWidth,\n secondLineWidth,\n statusWidth\n } = generatedValues;\n\n const {canvas} = ctx;\n const {dpr} = canvas;\n y /= dpr;\n\n const {\n avatarSize,\n marginVertical,\n lineHeight,\n lineBorderRadius,\n lineMarginVertical\n } = this;\n\n let marginLeft = 17;\n\n if(avatarSize) {\n drawCircleFromStart(ctx, marginLeft, y + marginVertical, avatarSize / 2, true);\n marginLeft += avatarSize + 10;\n }\n\n // 9 + 54 - 10 - 8 = 45 ........ 72 - 9 - 10 - 8\n roundRect(ctx, marginLeft, y + marginVertical + lineMarginVertical, firstLineWidth, lineHeight, lineBorderRadius, true);\n // roundRect(ctx, marginLeft, y + marginVertical + avatarSize - lineHeight - lineMarginVertical, secondLineWidth, lineHeight, lineBorderRadius, true);\n roundRect(ctx, marginLeft, y + this.totalHeight - marginVertical - lineHeight - lineMarginVertical, secondLineWidth, lineHeight, lineBorderRadius, true);\n\n roundRect(ctx, canvas.width / dpr - 24 - statusWidth, y + marginVertical + lineMarginVertical, statusWidth, lineHeight, lineBorderRadius, true);\n }\n}\n","import rootScope from '../../lib/rootScope';\n\nexport default function shake(element: HTMLElement) {\n if(!rootScope.settings.animationsEnabled) {\n return;\n }\n\n const keyframes: Keyframe[] = [\n {transform: 'translateX(0)'},\n {transform: 'translateX(.25rem)'},\n {transform: 'translateX(-.25rem)'},\n {transform: 'translateX(0)'}\n ];\n\n element.animate([...keyframes, ...keyframes, ...keyframes], {\n duration: 300,\n iterations: 1,\n easing: 'ease-in-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 type {MyDialogFilter as DialogFilter, MyDialogFilter} from '../storages/filters';\nimport type LazyLoadQueue from '../../components/lazyLoadQueue';\nimport type {Dialog, ForumTopic, MyMessage} from './appMessagesManager';\nimport type {MyPhoto} from './appPhotosManager';\nimport type {MyDocument} from './appDocsManager';\nimport type {State} from '../../config/state';\nimport AvatarElement from '../../components/avatar';\nimport DialogsContextMenu from '../../components/dialogsContextMenu';\nimport {horizontalMenu} from '../../components/horizontalMenu';\nimport ripple from '../../components/ripple';\nimport Scrollable, {ScrollableX, SliceSides} from '../../components/scrollable';\nimport {formatDateAccordingToTodayNew} from '../../helpers/date';\nimport {IS_MOBILE_SAFARI, IS_SAFARI} from '../../environment/userAgent';\nimport {logger, LogTypes} from '../logger';\nimport rootScope from '../rootScope';\nimport appImManager, {AppImManager, APP_TABS} from './appImManager';\nimport Button from '../../components/button';\nimport SetTransition from '../../components/singleTransition';\nimport {MyDraftMessage} from './appDraftsManager';\nimport DEBUG, {MOUNT_CLASS_TO} from '../../config/debug';\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 wrapPhoto from '../../components/wrappers/photo';\nimport AppEditFolderTab from '../../components/sidebarLeft/tabs/editFolder';\nimport appSidebarLeft 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 {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 {setSendingStatus} from '../../components/sendingStatus';\nimport SortedList, {SortedElementBase} from '../../helpers/sortedList';\nimport debounce from '../../helpers/schedulers/debounce';\nimport {FOLDER_ID_ALL, FOLDER_ID_ARCHIVE, NULL_PEER_ID, REAL_FOLDERS, REAL_FOLDER_ID} from '../mtproto/mtproto_config';\nimport groupCallActiveIcon from '../../components/groupCallActiveIcon';\nimport {Chat, Message, NotifyPeer} from '../../layer';\nimport IS_GROUP_CALL_SUPPORTED from '../../environment/groupCallSupport';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport appNavigationController, {NavigationItem} from '../../components/appNavigationController';\nimport appMediaPlaybackController from '../../components/appMediaPlaybackController';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport {AppManagers} from './managers';\nimport appSidebarRight from '../../components/sidebarRight';\nimport PopupElement from '../../components/popups';\nimport choosePhotoSize from './utils/photos/choosePhotoSize';\nimport wrapEmojiText from '../richTextProcessor/wrapEmojiText';\nimport wrapMessageForReply from '../../components/wrappers/messageForReply';\nimport isMessageRestricted from './utils/messages/isMessageRestricted';\nimport getMediaFromMessage from './utils/messages/getMediaFromMessage';\nimport getMessageSenderPeerIdOrName from './utils/messages/getMessageSenderPeerIdOrName';\nimport wrapStickerEmoji from '../../components/wrappers/stickerEmoji';\nimport getDialogIndexKey from './utils/dialogs/getDialogIndexKey';\nimport getProxiedManagers from './getProxiedManagers';\nimport getDialogIndex from './utils/dialogs/getDialogIndex';\nimport {attachContextMenuListener} from '../../helpers/dom/attachContextMenuListener';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport wrapPeerTitle from '../../components/wrappers/peerTitle';\nimport middlewarePromise from '../../helpers/middlewarePromise';\nimport appDownloadManager from './appDownloadManager';\nimport groupCallsController from '../calls/groupCallsController';\nimport callsController from '../calls/callsController';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport noop from '../../helpers/noop';\nimport DialogsPlaceholder from '../../helpers/dialogsPlaceholder';\nimport pause from '../../helpers/schedulers/pause';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport filterAsync from '../../helpers/array/filterAsync';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport whichChild from '../../helpers/dom/whichChild';\nimport {getMiddleware, MiddlewareHelper} from '../../helpers/middleware';\nimport makeError from '../../helpers/makeError';\nimport getUnsafeRandomInt from '../../helpers/number/getUnsafeRandomInt';\nimport Row, {RowMediaSizeType} from '../../components/row'\nimport SettingSection from '../../components/settingSection';\nimport {SliderSuperTabEventable} from '../../components/sliderTab';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport {AckedResult} from '../mtproto/superMessagePort';\nimport ButtonMenuToggle from '../../components/buttonMenuToggle';\nimport getMessageThreadId from './utils/messages/getMessageThreadId';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport AppSharedMediaTab from '../../components/sidebarRight/tabs/sharedMedia';\nimport {dispatchHeavyAnimationEvent} from '../../hooks/useHeavyAnimationCheck';\nimport AppArchivedTab from '../../components/sidebarLeft/tabs/archivedTab';\nimport shake from '../../helpers/dom/shake';\nimport AppEditTopicTab from '../../components/sidebarRight/tabs/editTopic';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\n\nexport const DIALOG_LIST_ELEMENT_TAG = 'A';\n\nexport type DialogDom = {\n avatarEl: AvatarElement,\n captionDiv: HTMLElement,\n titleSpan: HTMLSpanElement,\n titleSpanContainer: HTMLSpanElement,\n statusSpan: HTMLSpanElement,\n lastTimeSpan: HTMLSpanElement,\n unreadBadge?: HTMLElement,\n unreadAvatarBadge?: HTMLElement,\n callIcon?: ReturnType,\n mentionsBadge?: HTMLElement,\n lastMessageSpan: HTMLSpanElement,\n containerEl: HTMLElement,\n listEl: HTMLElement,\n subtitleEl: HTMLElement,\n\n setLastMessagePromise?: CancellablePromise,\n setUnreadMessagePromise?: CancellablePromise\n};\n\ninterface SortedDialog extends SortedElementBase {\n dom: DialogDom,\n dialogElement: DialogElement\n}\n\nfunction setPromiseMiddleware}, K extends keyof T>(obj: T, key: K) {\n const oldPromise: CancellablePromise = obj[key] as any;\n oldPromise?.reject();\n\n // @ts-ignore\n const deferred = obj[key] = deferredPromise();\n deferred.catch(() => {}).finally(() => {\n if((obj[key] as any) === deferred) {\n delete obj[key];\n }\n });\n\n const middleware = middlewarePromise(() => (obj[key] as any) === deferred);\n return {deferred, middleware};\n}\n\nconst BADGE_SIZE = 22;\nconst BADGE_TRANSITION_TIME = 250;\n\nclass SortedDialogList extends SortedList {\n public managers: AppManagers;\n public log: ReturnType;\n public list: HTMLElement;\n public indexKey: ReturnType;\n public onListLengthChange: () => void;\n public forumPeerId: PeerId;\n\n constructor(options: {\n managers: SortedDialogList['managers'],\n log?: SortedDialogList['log'],\n list: SortedDialogList['list'],\n indexKey: SortedDialogList['indexKey'],\n onListLengthChange?: SortedDialogList['onListLengthChange'],\n forumPeerId?: SortedDialogList['forumPeerId']\n }) {\n super({\n getIndex: (element) => this.managers.dialogsStorage.getDialogIndex(this.forumPeerId ?? element.id, this.indexKey, this.forumPeerId ? element.id : undefined),\n onDelete: (element) => {\n element.dom.listEl.remove();\n 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?.();\n }\n },\n onElementCreate: async(base) => {\n const loadPromises: Promise[] = [];\n\n const dialogElement = appDialogsManager.addListDialog({\n peerId: this.forumPeerId ?? base.id,\n loadPromises,\n isBatch: true,\n threadId: this.forumPeerId ? base.id : undefined,\n isMainList: this.indexKey === 'index_0'\n });\n (base as SortedDialog).dom = dialogElement.dom;\n (base as SortedDialog).dialogElement = dialogElement;\n\n await Promise.all(loadPromises);\n return base as SortedDialog;\n },\n updateElementWith: fastRafConventional,\n log: options.log\n });\n\n safeAssign(this, options);\n }\n\n public clear() {\n this.list.replaceChildren();\n super.clear();\n }\n}\n\nexport type DialogElementSize = RowMediaSizeType;\ntype DialogElementOptions = {\n peerId: PeerId,\n rippleEnabled?: boolean,\n onlyFirstName?: boolean,\n meAsSaved?: boolean,\n avatarSize?: RowMediaSizeType,\n autonomous?: boolean,\n loadPromises?: Promise[],\n fromName?: string,\n noIcons?: boolean,\n threadId?: number,\n wrapOptions?: WrapSomethingOptions,\n isMainList?: boolean\n};\nclass DialogElement extends Row {\n public dom: DialogDom;\n\n constructor({\n peerId,\n rippleEnabled = true,\n onlyFirstName = false,\n meAsSaved = true,\n avatarSize = 'bigger',\n autonomous,\n loadPromises,\n fromName,\n noIcons,\n threadId,\n wrapOptions = {},\n isMainList\n }: DialogElementOptions) {\n super({\n clickable: true,\n noRipple: !rippleEnabled,\n havePadding: !threadId,\n title: true,\n titleRightSecondary: true,\n subtitle: true,\n subtitleRight: true,\n noWrap: true,\n asLink: true\n });\n\n this.subtitleRight.remove();\n\n const avatarEl = threadId ? undefined : new AvatarElement();\n if(avatarEl) {\n const avatarSizeMap: {[k in DialogElementSize]?: number} = {\n bigger: 54,\n abitbigger: 42,\n small: 32\n };\n const s = avatarSizeMap[avatarSize];\n avatarEl.classList.add('dialog-avatar', 'avatar-' + s);\n avatarEl.updateWithOptions({\n loadPromises,\n lazyLoadQueue: wrapOptions.lazyLoadQueue,\n isDialog: !!meAsSaved,\n peerId,\n peerTitle: fromName\n });\n\n this.applyMediaElement(avatarEl, avatarSize);\n }\n\n const captionDiv = this.container;\n\n const titleSpanContainer = this.title;\n titleSpanContainer.classList.add('user-title');\n\n this.titleRow.classList.add('dialog-title');\n\n const peerTitle = new PeerTitle();\n const peerTitlePromise = peerTitle.update({\n peerId,\n fromName,\n dialog: meAsSaved,\n onlyFirstName,\n withIcons: !noIcons,\n threadId: threadId\n });\n\n loadPromises?.push(peerTitlePromise);\n titleSpanContainer.append(peerTitle.element);\n\n // for muted icon\n titleSpanContainer.classList.add('tgico'); // * ัั‚ะฐ ัั‚ั€ะพะบะฐ ะฑัƒะดะตั‚ ะฐะบั‚ัƒะฐะปัŒะฝะฐ ั‚ะพะปัŒะบะพ ะดะปั !container, ะฝะพ ะปะฐะดะฝะพ\n\n // const titleIconsPromise = generateTitleIcons(peerId).then((elements) => {\n // titleSpanContainer.append(...elements);\n // });\n\n // if(loadPromises) {\n // loadPromises.push(titleIconsPromise);\n // }\n // }\n\n const span = this.subtitle;\n // span.classList.add('user-last-message');\n\n const li = this.container;\n li.classList.add('chatlist-chat', 'chatlist-chat-' + avatarSize);\n if(!autonomous) {\n (li as HTMLAnchorElement).href = '#' + peerId;\n }\n // if(rippleEnabled) {\n // ripple(li);\n // }\n\n if(avatarSize === 'bigger') {\n this.container.classList.add('row-big');\n } else if(avatarSize === 'small') {\n this.container.classList.add('row-small');\n }\n\n li.dataset.peerId = '' + peerId;\n if(threadId) {\n li.dataset.threadId = '' + threadId;\n }\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 rightSpan = this.titleRight;\n rightSpan.classList.add('dialog-title-details');\n rightSpan.append(statusSpan, lastTimeSpan);\n\n this.subtitleRow.classList.add('dialog-subtitle');\n\n const dom: DialogDom = this.dom = {\n avatarEl,\n captionDiv,\n titleSpan: peerTitle.element,\n titleSpanContainer,\n statusSpan,\n lastTimeSpan,\n lastMessageSpan: span,\n containerEl: li,\n listEl: li,\n subtitleEl: this.subtitleRow\n };\n\n if(!autonomous) {\n (li as any).dialogDom = dom;\n\n const chat = appImManager.chat;\n if(chat && appImManager.isSamePeer(chat, {peerId, threadId: threadId, type: 'chat'})) {\n appDialogsManager.setDialogActive(li, true);\n }\n\n if(isMainList && appDialogsManager.forumTab?.peerId === peerId && !threadId) {\n li.classList.add('is-forum-open');\n }\n }\n }\n\n public createUnreadBadge() {\n if(this.dom.unreadBadge) return;\n const badge = this.dom.unreadBadge = document.createElement('div');\n badge.className = `dialog-subtitle-badge badge badge-${BADGE_SIZE}`;\n this.dom.subtitleEl.append(badge);\n }\n\n public createUnreadAvatarBadge() {\n if(this.dom.unreadAvatarBadge) return;\n const badge = this.dom.unreadAvatarBadge = document.createElement('div');\n badge.className = `dialog-subtitle-badge badge badge-${BADGE_SIZE} avatar-badge`;\n this.dom.listEl.append(badge);\n }\n\n public createMentionsBadge() {\n if(this.dom.mentionsBadge) return;\n const badge = this.dom.mentionsBadge = document.createElement('div');\n badge.className = `dialog-subtitle-badge badge badge-${BADGE_SIZE} mention mention-badge`;\n badge.innerText = '@';\n this.dom.lastMessageSpan.after(badge);\n }\n\n public toggleBadgeByKey(\n key: Extract,\n hasBadge: boolean,\n justCreated: boolean,\n batch?: boolean\n ) {\n SetTransition({\n element: this.dom[key],\n className: 'is-visible',\n forwards: hasBadge,\n duration: batch ? 0 : BADGE_TRANSITION_TIME,\n onTransitionEnd: hasBadge ? undefined : () => {\n this.dom[key].remove();\n delete this.dom[key];\n },\n useRafs: !justCreated || !isInDOM(this.dom[key]) ? 2 : 0\n });\n }\n}\n\nclass ForumTab extends SliderSuperTabEventable {\n private rows: HTMLElement;\n private subtitle: HTMLElement;\n\n public peerId: PeerId;\n private firstTime: boolean;\n\n private log: ReturnType;\n\n private xd: Some3;\n\n public async toggle(value: boolean) {\n if(this.init2) {\n await this.init2();\n }\n\n SetTransition({\n element: this.container,\n className: 'is-visible',\n forwards: value,\n duration: 300,\n onTransitionEnd: !value ? () => {\n this.onCloseAfterTimeout();\n } : undefined,\n useRafs: this.firstTime ? (this.firstTime = undefined, 2) : undefined\n });\n }\n\n public init(options: {\n peerId: PeerId,\n managers: AppManagers\n }) {\n safeAssign(this, options);\n\n this.log = logger('FORUM');\n this.firstTime = true;\n this.container.classList.add('topics-container');\n\n const isFloating = !this.slider;\n if(isFloating) {\n this.closeBtn.classList.replace('tgico-left', 'tgico-close');\n this.container.classList.add('active', 'is-floating');\n\n attachClickEvent(this.closeBtn, () => {\n appDialogsManager.toggleForumTab(undefined, this);\n }, {listenerSetter: this.listenerSetter});\n }\n\n this.rows = document.createElement('div');\n this.rows.classList.add('sidebar-header__rows');\n\n this.subtitle = document.createElement('div');\n this.subtitle.classList.add('sidebar-header__subtitle');\n\n this.title.replaceWith(this.rows);\n this.rows.append(this.title, this.subtitle);\n\n const list = appDialogsManager.createChatList();\n appDialogsManager.setListClickListener(list, null, true);\n this.scrollable.append(list);\n\n this.xd = new Some3(this.peerId, isFloating ? 80 : 0);\n this.xd.scrollable = this.scrollable;\n this.xd.sortedList = new SortedDialogList({\n managers: this.managers,\n log: this.log,\n list,\n indexKey: 'index_0',\n forumPeerId: this.peerId\n });\n this.xd.bindScrollable();\n\n const getOptionsForMessages = (): Parameters[0] => {\n return {\n peerId: this.peerId,\n type: 'chat'\n };\n };\n\n const btnMenu = ButtonMenuToggle({\n listenerSetter: this.listenerSetter,\n direction: 'bottom-left',\n buttons: [{\n icon: 'info',\n text: 'ForumTopic.Context.Info',\n onClick: async() => {\n const tab = appSidebarLeft.createTab(AppSharedMediaTab, true);\n tab.isFirst = true;\n tab.setPeer(this.peerId);\n (await tab.fillProfileElements())();\n tab.loadSidebarMedia(true);\n tab.open();\n }\n }, {\n icon: 'message',\n text: 'ForumTopic.Context.ShowAsMessages',\n onClick: () => {\n const chat = appImManager.chat;\n appImManager[chat?.peerId === this.peerId ? 'setPeer' : 'setInnerPeer'](getOptionsForMessages());\n },\n verify: () => {\n const chat = appImManager.chat;\n return !chat || !appImManager.isSamePeer(chat, getOptionsForMessages());\n }\n }, {\n icon: 'adduser',\n text: 'ForumTopic.Context.AddMember',\n onClick: () => {},\n verify: () => false && this.managers.appChatsManager.hasRights(this.peerId.toChatId(), 'invite_users')\n }, {\n icon: 'add',\n text: 'ForumTopic.Context.New',\n onClick: () => {\n appSidebarLeft.createTab(AppEditTopicTab).open(this.peerId);\n },\n separator: true,\n verify: () => this.managers.appChatsManager.hasRights(this.peerId.toChatId(), 'manage_topics')\n }]\n });\n\n this.listenerSetter.add(rootScope)('history_reload', (peerId) => {\n if(this.peerId !== peerId) {\n return;\n }\n\n this.xd.fullReset();\n });\n\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n if(this.peerId !== chatId.toPeerId(true)) {\n return;\n }\n\n const chat = await this.managers.appChatsManager.getChat(chatId);\n if(!(chat as Chat.channel).pFlags.forum) {\n appDialogsManager.toggleForumTab(undefined, this);\n }\n });\n\n if(IS_TOUCH_SUPPORTED) {\n handleTabSwipe({\n element: this.container,\n onSwipe: () => {\n appDialogsManager.toggleForumTab(undefined, this);\n },\n middleware: this.middlewareHelper.get()\n });\n }\n\n this.header.append(btnMenu);\n\n if(!isFloating) {\n return this.init2();\n }\n }\n\n public async init2() {\n this.init2 = undefined;\n\n const middleware = this.middlewareHelper.get();\n const peerId = this.peerId;\n\n this.managers.apiUpdatesManager.subscribeToChannelUpdates(this.peerId.toChatId());\n middleware.onDestroy(() => {\n this.managers.apiUpdatesManager.unsubscribeFromChannelUpdates(this.peerId.toChatId());\n });\n\n const peerTitlePromise = wrapPeerTitle({\n peerId,\n dialog: true,\n wrapOptions: {middleware}\n });\n\n const setStatusPromise = appImManager.setPeerStatus({\n peerId,\n element: this.subtitle,\n needClear: true,\n useWhitespace: false,\n middleware,\n noTyping: true\n });\n\n // this.managers.dialogsStorage.getForumTopics(this.peerId).then((messagesForumTopics) => {\n // console.log(messagesForumTopics);\n\n // const promises = messagesForumTopics.topics.map((forumTopic) => {\n // return this.sortedDialogList.add(forumTopic.id);\n // });\n\n // return Promise.all(promises);\n // }).then(() => {\n // this.dialogsPlaceholder.detach(this.sortedDialogList.getAll().size);\n // });\n\n return Promise.all([\n peerTitlePromise,\n setStatusPromise,\n this.xd.onChatsScroll().then((loadResult) => {\n return loadResult.cached ? loadResult.renderPromise : undefined\n })\n ]).then(([\n peerTitle,\n setStatus,\n _\n ]) => {\n if(!middleware()) {\n return;\n }\n\n this.title.append(peerTitle);\n setStatus?.();\n });\n }\n\n public onCloseAfterTimeout() {\n super.onCloseAfterTimeout();\n this.xd.destroy();\n }\n}\n\nconst NOT_IMPLEMENTED_ERROR = new Error('not implemented');\n\ntype DialogKey = Parameters[0];\nclass Some {\n public sortedList: SortedDialogList;\n public scrollable: Scrollable;\n public loadedDialogsAtLeastOnce: boolean;\n public needPlaceholderAtFirstTime: boolean;\n protected offsets: {top: number, bottom: number};\n protected indexKey: ReturnType;\n protected sliceTimeout: number;\n protected managers: AppManagers;\n protected listenerSetter: ListenerSetter;\n protected loadDialogsPromise: Promise<{cached: boolean, renderPromise: Some2['loadDialogsRenderPromise']}>;\n protected loadDialogsRenderPromise: Promise;\n protected placeholder: DialogsPlaceholder;\n protected log: ReturnType;\n protected placeholderOptions: ConstructorParameters[0];\n\n constructor() {\n this.log = logger('CL');\n this.offsets = {top: 0, bottom: 0};\n this.managers = rootScope.managers;\n this.listenerSetter = new ListenerSetter();\n }\n\n public getOffsetIndex(side: 'top' | 'bottom') {\n return {index: this.scrollable.loadedAll[side] ? 0 : this.offsets[side]};\n }\n\n protected isDialogMustBeInViewport(dialog: T) {\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 = getDialogIndex(dialog, this.indexKey);\n return (!topOffset.index || index <= topOffset.index) &&\n (!bottomOffset.index || index >= bottomOffset.index);\n }\n\n public setIndexKey(indexKey: Some['indexKey']) {\n this.indexKey = indexKey;\n this.sortedList.indexKey = indexKey;\n }\n\n protected deleteDialogByKey(key: DialogKey) {\n this.sortedList.delete(key);\n }\n\n public deleteDialog(dialog: T) {\n return this.deleteDialogByKey(this.getDialogKey(dialog));\n }\n\n public updateDialog(dialog: T) {\n const key = this.getDialogKey(dialog);\n if(this.isDialogMustBeInViewport(dialog)) {\n if(!this.sortedList.has(key) && this.loadedDialogsAtLeastOnce) {\n this.sortedList.add(key);\n return;\n }\n } else {\n this.deleteDialog(dialog);\n return;\n }\n\n const dialogElement = this.getDialogElement(key);\n if(dialogElement) {\n appDialogsManager.setLastMessageN({\n dialog,\n dialogElement,\n setUnread: true\n });\n this.sortedList.update(key);\n }\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.sortedList.list.childElementCount || appDialogsManager.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 const perf = performance.now();\n\n const scrollTopWas = this.scrollable.scrollTop;\n\n const firstElementChild = this.sortedList.list.firstElementChild;\n const rectContainer = this.scrollable.container.getBoundingClientRect();\n const rectTarget = firstElementChild.getBoundingClientRect();\n const children = Array.from(this.scrollable.splitUp.children) as HTMLElement[];\n\n // const padding = 8;\n // const offsetTop = this.folders.container.offsetTop;\n let offsetTop = this.scrollable.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.scrollable.loadedAll.top = false;\n }\n\n if(sliceFromEnd.length) {\n this.scrollable.loadedAll.bottom = false;\n }\n\n sliced.push(...sliceFromStart);\n sliced.push(...sliceFromEnd);\n\n sliced.forEach((el) => {\n this.deleteDialogByKey(this.getDialogKeyFromElement(el));\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 const scrollTop = firstElement.offsetTop - elementOverflow;\n this.scrollable.scrollTop = this.scrollable.lastScrollPosition = scrollTop;\n\n this.log('slice time', performance.now() - perf, this.indexKey, scrollTop);\n /* const firstElementRect = firstElement.getBoundingClientRect();\n const scrollTop = */\n\n // this.scroll.scrollIntoView(firstElement, false);\n });\n }, 200);\n };\n\n public onChatsScrollTop() {\n return this.onChatsScroll('top');\n };\n\n public onChatsScroll(side: SliceSides = 'bottom') {\n return this.loadDialogs(side);\n };\n\n public createPlaceholder(): DialogsPlaceholder {\n const placeholder = this.placeholder = new DialogsPlaceholder(this.placeholderOptions);\n const getRectFrom = this.getRectFromForPlaceholder();\n placeholder.attach({\n container: this.sortedList.list.parentElement,\n getRectFrom,\n onRemove: () => {\n if(this.placeholder === placeholder) {\n this.placeholder = undefined;\n }\n },\n blockScrollable: this.scrollable\n });\n\n return placeholder;\n }\n\n public loadDialogs(side: SliceSides) {\n /* if(testScroll) {\n return;\n } */\n\n const log = this.log.bindPrefix('load-' + getUnsafeRandomInt(1000, 9999));\n log('try', side);\n\n if(this.loadDialogsPromise || this.loadDialogsRenderPromise/* || 1 === 1 */) return this.loadDialogsPromise;\n else if(this.scrollable.loadedAll[side]) {\n return Promise.resolve({\n cached: true,\n renderPromise: Promise.resolve()\n });\n }\n\n log.warn('start', side);\n const middlewareError = makeError('MIDDLEWARE');\n\n const cachedInfoPromise = deferredPromise();\n const renderPromise = new Promise(async(resolve, reject) => {\n const chatList = this.sortedList.list;\n\n let placeholder = this.placeholder;\n try {\n const getConversationsResult = this.loadDialogsInner(side);\n const a = await getConversationsResult;\n\n if(\n !chatList.childElementCount &&\n !placeholder &&\n (\n (!this.loadedDialogsAtLeastOnce && this.needPlaceholderAtFirstTime) ||\n !a.cached\n )\n ) {\n if(this.loadDialogsRenderPromise !== renderPromise) {\n throw middlewareError;\n }\n\n placeholder = this.createPlaceholder();\n\n cachedInfoPromise.resolve(false);\n }\n\n const result = await a.result;\n // await pause(5000);\n if(this.loadDialogsRenderPromise !== renderPromise) {\n throw middlewareError;\n }\n\n cachedInfoPromise.resolve(a.cached);\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.scrollable.loadedAll[side] = true;\n }\n } else if(result.isTopEnd) {\n this.scrollable.loadedAll[side] = true;\n }\n\n const length = result.dialogs.length;\n log(`will render ${length} dialogs`);\n if(length) {\n const dialogs = side === 'top' ? result.dialogs.slice().reverse() : result.dialogs;\n\n const loadPromises = dialogs.map((dialog) => {\n return this.sortedList.add(this.getDialogKey(dialog as T));\n });\n\n await Promise.all(loadPromises).catch();\n if(this.loadDialogsRenderPromise !== renderPromise) {\n throw middlewareError;\n }\n }\n\n const offsetDialog = result.dialogs[side === 'top' ? 0 : length - 1];\n if(offsetDialog) {\n this.offsets[side] = getDialogIndex(offsetDialog, this.indexKey);\n }\n\n // don't set it before - no need to fire length change with every dialog\n this.loadedDialogsAtLeastOnce = true;\n appDialogsManager.onListLengthChange();\n\n log('getDialogs', result, chatList.childElementCount);\n\n setTimeout(() => {\n this.scrollable.onScroll();\n }, 0);\n\n if(placeholder) {\n // await pause(500);\n placeholder.detach(chatList.childElementCount);\n }\n } catch(err) {\n if((err as ApiError)?.type !== 'MIDDLEWARE') {\n log.error(err);\n }\n\n reject(err);\n cachedInfoPromise.reject(err);\n return;\n }\n\n resolve();\n }).finally(() => {\n if(this.loadDialogsRenderPromise === renderPromise) {\n log('end');\n this.loadDialogsRenderPromise = undefined;\n } else {\n log('has been cleared');\n }\n });\n\n this.loadDialogsRenderPromise = renderPromise;\n const loadDialogsPromise = this.loadDialogsPromise = cachedInfoPromise.then((cached) => {\n return {\n cached,\n renderPromise\n };\n }).finally(() => {\n if(this.loadDialogsPromise === loadDialogsPromise) {\n this.loadDialogsPromise = undefined;\n }\n });\n\n return loadDialogsPromise;\n }\n\n public async setOffsets() {\n const chatList = this.sortedList.list;\n const [firstDialog, lastDialog] = await Promise.all([\n this.getDialogFromElement(chatList.firstElementChild as HTMLElement),\n this.getDialogFromElement(chatList.lastElementChild as HTMLElement)\n ]);\n\n const {indexKey} = this;\n this.offsets.top = getDialogIndex(firstDialog, indexKey);\n this.offsets.bottom = getDialogIndex(lastDialog, indexKey);\n }\n\n public getDialogKey(dialog: T): DialogKey {\n throw NOT_IMPLEMENTED_ERROR;\n }\n\n public getDialogKeyFromElement(element: HTMLElement): DialogKey {\n throw NOT_IMPLEMENTED_ERROR;\n }\n\n public getRectFromForPlaceholder(): Parameters[0]['getRectFrom'] {\n throw NOT_IMPLEMENTED_ERROR;\n }\n\n public getDialogFromElement(element: HTMLElement): Promise {\n throw NOT_IMPLEMENTED_ERROR;\n }\n\n public loadDialogsInner(side: SliceSides): ReturnType {\n throw NOT_IMPLEMENTED_ERROR;\n }\n\n public async setTyping(dialog: T) {\n const key = this.getDialogKey(dialog);\n const dom = this.getDialogDom(key);\n if(!dom) {\n return;\n }\n\n const oldTypingElement = dom.lastMessageSpan.querySelector('.peer-typing-container') as HTMLElement;\n const newTypingElement = await appImManager.getPeerTyping(\n dialog.peerId,\n oldTypingElement,\n dialog._ === 'forumTopic' ? dialog.id : undefined\n );\n if(!oldTypingElement && newTypingElement) {\n replaceContent(dom.lastMessageSpan, newTypingElement);\n dom.lastMessageSpan.classList.add('user-typing');\n }\n }\n\n public unsetTyping(dialog: T) {\n const key = this.getDialogKey(dialog);\n const dialogElement = this.getDialogElement(key);\n if(!dialogElement) {\n return;\n }\n\n dialogElement.dom.lastMessageSpan.classList.remove('user-typing');\n appDialogsManager.setLastMessageN({\n dialog,\n lastMessage: null,\n dialogElement,\n setUnread: null\n });\n }\n\n public getDialogDom(key: DialogKey) {\n // return this.doms[peerId];\n const element = this.sortedList.get(key);\n return element?.dom;\n }\n\n public getDialogElement(key: DialogKey) {\n const element = this.sortedList.get(key);\n return element?.dialogElement;\n }\n\n public bindScrollable() {\n this.scrollable.container.addEventListener('scroll', this.onChatsRegularScroll);\n this.scrollable.onScrolledTop = this.onChatsScrollTop.bind(this);\n this.scrollable.onScrolledBottom = this.onChatsScroll.bind(this);\n this.scrollable.setVirtualContainer(this.sortedList.list);\n }\n\n public clear() {\n this.sortedList.clear();\n this.placeholder?.remove();\n }\n\n public reset() {\n this.scrollable.loadedAll.top = true;\n this.scrollable.loadedAll.bottom = false;\n this.offsets.top = this.offsets.bottom = 0;\n this.loadDialogsRenderPromise = undefined;\n this.loadDialogsPromise = undefined;\n }\n\n public fullReset() {\n this.reset();\n this.clear();\n return this.onChatsScroll();\n }\n\n public destroy() {\n this.clear();\n this.scrollable.destroy();\n this.listenerSetter.removeAll();\n }\n}\n\nclass Some3 extends Some {\n constructor(public peerId: PeerId, public paddingX: number) {\n super();\n\n this.placeholderOptions = {\n avatarSize: 0,\n marginVertical: 5,\n totalHeight: 64\n };\n\n this.listenerSetter.add(rootScope)('peer_typings', async({peerId, threadId, typings}) => {\n if(!threadId || this.peerId !== peerId) {\n return;\n }\n\n const dialog = await this.managers.dialogsStorage.getForumTopic(peerId, threadId);\n\n if(!dialog) return;\n\n if(typings.length) {\n this.setTyping(dialog);\n } else {\n this.unsetTyping(dialog);\n }\n });\n\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\n for(const [peerId, {dialog, topics}] of dialogs) {\n if(peerId !== this.peerId || !topics?.size) {\n continue;\n }\n\n topics.forEach((forumTopic) => {\n this.updateDialog(forumTopic);\n });\n }\n });\n\n this.listenerSetter.add(rootScope)('dialog_unread', ({dialog}) => {\n if(dialog?._ !== 'forumTopic' || dialog.peerId !== this.peerId) {\n return;\n }\n\n appDialogsManager.setUnreadMessagesN({dialog, dialogElement: this.getDialogElement(this.getDialogKey(dialog))});\n });\n\n this.listenerSetter.add(rootScope)('dialog_notify_settings', async(dialog) => {\n if(dialog.peerId !== this.peerId) {\n return;\n }\n\n if(dialog._ === 'dialog') {\n const all = this.sortedList.getAll();\n const entries = [...all.entries()];\n const promises = entries.map(([id]) => this.managers.dialogsStorage.getForumTopic(this.peerId, id));\n const topics = await Promise.all(promises);\n entries.forEach(([id, element], idx) => {\n appDialogsManager.setUnreadMessagesN({dialog: topics[idx], dialogElement: element.dialogElement}); // ะฒะพะทะผะพะถะฝะพ ัั‚ะพ ะฝะต ะฝัƒะถะฝะพ, ะฝะพ ะฝัƒะถะฝะพ ะผะตะฝัั‚ัŒ is-muted\n });\n\n return;\n }\n\n appDialogsManager.setUnreadMessagesN({dialog, dialogElement: this.getDialogElement(this.getDialogKey(dialog))}); // ะฒะพะทะผะพะถะฝะพ ัั‚ะพ ะฝะต ะฝัƒะถะฝะพ, ะฝะพ ะฝัƒะถะฝะพ ะผะตะฝัั‚ัŒ is-muted\n });\n\n this.listenerSetter.add(rootScope)('dialog_drop', (dialog) => {\n if(dialog._ !== 'forumTopic' || dialog.peerId !== this.peerId) {\n return;\n }\n\n this.deleteDialogByKey(this.getDialogKey(dialog));\n });\n\n this.listenerSetter.add(rootScope)('dialog_draft', ({dialog, drop, peerId}) => {\n if(dialog._ !== 'forumTopic' || dialog.peerId !== this.peerId) {\n return;\n }\n\n if(drop) {\n this.deleteDialog(dialog);\n } else {\n this.updateDialog(dialog);\n }\n });\n }\n\n protected isDialogMustBeInViewport(dialog: ForumTopic) {\n if(dialog.pFlags.hidden) return false;\n return super.isDialogMustBeInViewport(dialog);\n }\n\n public getDialogKey(dialog: ForumTopic) {\n return dialog.id;\n }\n\n public getDialogKeyFromElement(element: HTMLElement) {\n return +element.dataset.threadId;\n }\n\n public getRectFromForPlaceholder() {\n return (): DOMRectEditable => {\n const sidebarRect = appSidebarLeft.rect;\n const paddingY = 56;\n return {\n top: paddingY,\n right: sidebarRect.right,\n bottom: 0,\n left: this.paddingX,\n width: sidebarRect.width - this.paddingX,\n height: sidebarRect.height - paddingY\n };\n };\n }\n\n public getDialogFromElement(element: HTMLElement) {\n return this.managers.dialogsStorage.getForumTopic(+element.dataset.peerId, +element.dataset.threadId);\n }\n\n public async loadDialogsInner(side: SliceSides) {\n const {indexKey} = this;\n let loadCount = windowSize.height / 64 * 1.25 | 0;\n let offsetIndex = 0;\n\n const filterId = this.peerId;\n const {index: currentOffsetIndex} = this.getOffsetIndex(side);\n offsetIndex = currentOffsetIndex;\n if(currentOffsetIndex) {\n if(side === 'top') {\n const storage = await this.managers.dialogsStorage.getFolderDialogs(filterId, true);\n const index = storage.findIndex((dialog) => getDialogIndex(dialog, indexKey) <= currentOffsetIndex);\n const needIndex = Math.max(0, index - loadCount);\n loadCount = index - needIndex;\n offsetIndex = getDialogIndex(storage[needIndex], indexKey) + 1;\n } else {\n offsetIndex = currentOffsetIndex;\n }\n }\n\n return this.managers.acknowledged.dialogsStorage.getDialogs({\n offsetIndex,\n limit: loadCount,\n filterId,\n skipMigrated: true\n });\n }\n}\n\nclass Some2 extends Some {\n constructor(protected filterId: number) {\n super();\n\n this.needPlaceholderAtFirstTime = true;\n\n this.listenerSetter.add(rootScope)('peer_typings', async({peerId, typings}) => {\n const [dialog, isForum] = await Promise.all([\n this.managers.appMessagesManager.getDialogOnly(peerId),\n this.managers.appPeersManager.isForum(peerId)\n ]);\n\n if(!dialog || isForum) return;\n\n if(typings.length) {\n this.setTyping(dialog);\n } else {\n this.unsetTyping(dialog);\n }\n });\n\n this.listenerSetter.add(rootScope)('user_update', async(userId) => {\n if(!this.isActive) {\n return;\n }\n\n const peerId = userId.toPeerId();\n const dom = this.getDialogDom(peerId);\n if(!dom) {\n return;\n }\n\n const status = await this.managers.appUsersManager.getUserStatus(userId);\n const online = status?._ === 'userStatusOnline';\n this.setOnlineStatus(dom.avatarEl, online);\n });\n\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n const peerId = chatId.toPeerId(true);\n this.processDialogForCallStatus(peerId);\n });\n\n this.listenerSetter.add(rootScope)('dialog_flush', ({dialog}) => {\n if(!this.isActive || !dialog) {\n return;\n }\n\n appDialogsManager.setLastMessageN({\n dialog,\n setUnread: true\n });\n this.validateDialogForFilter(dialog);\n });\n\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\n if(!this.isActive) {\n return;\n }\n\n for(const [peerId, {dialog, topics}] of dialogs) {\n if(dialog?._ !== 'dialog') {\n continue;\n }\n\n this.updateDialog(dialog);\n\n appDialogsManager.processContact?.(peerId.toPeerId());\n\n this.validateDialogForFilter(dialog);\n }\n });\n\n this.listenerSetter.add(rootScope)('dialog_drop', (dialog) => {\n if(!this.isActive || dialog._ !== 'dialog') {\n return;\n }\n\n this.deleteDialogByKey(dialog.peerId);\n appDialogsManager.processContact?.(dialog.peerId);\n });\n\n this.listenerSetter.add(rootScope)('dialog_unread', ({dialog}) => {\n if(!this.isActive || dialog?._ !== 'dialog') {\n return;\n }\n\n appDialogsManager.setUnreadMessagesN({dialog, dialogElement: this.getDialogElement(this.getDialogKey(dialog))});\n this.validateDialogForFilter(dialog);\n });\n\n this.listenerSetter.add(rootScope)('dialog_notify_settings', (dialog) => {\n if(!this.isActive || dialog._ === 'forumTopic') {\n return;\n }\n\n this.validateDialogForFilter(dialog);\n appDialogsManager.setUnreadMessagesN({dialog, dialogElement: this.getDialogElement(this.getDialogKey(dialog))}); // ะฒะพะทะผะพะถะฝะพ ัั‚ะพ ะฝะต ะฝัƒะถะฝะพ, ะฝะพ ะฝัƒะถะฝะพ ะผะตะฝัั‚ัŒ is-muted\n });\n\n this.listenerSetter.add(rootScope)('dialog_draft', ({dialog, drop, peerId}) => {\n if(!this.isActive || dialog._ === 'forumTopic') {\n return;\n }\n\n if(drop) {\n this.deleteDialog(dialog);\n } else {\n this.updateDialog(dialog);\n }\n\n appDialogsManager.processContact?.(peerId);\n });\n\n this.listenerSetter.add(rootScope)('filter_update', async(filter) => {\n if(this.isActive && filter.id === this.filterId && !REAL_FOLDERS.has(filter.id)) {\n const dialogs = await this.managers.dialogsStorage.getCachedDialogs(true);\n await 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 }\n\n private get isActive() {\n return appDialogsManager.xd === this;\n }\n\n public getRectFromForPlaceholder() {\n return this.filterId === FOLDER_ID_ARCHIVE ? appDialogsManager.chatsContainer : appDialogsManager.folders.container;\n }\n\n public async loadDialogsInner(side: SliceSides) {\n const {filterId, indexKey} = this;\n let loadCount = windowSize.height / 72 * 1.25 | 0;\n let offsetIndex = 0;\n\n const doNotRenderChatList = appDialogsManager.doNotRenderChatList; // cache before awaits\n\n const {index: currentOffsetIndex} = this.getOffsetIndex(side);\n if(currentOffsetIndex) {\n if(side === 'top') {\n const storage = await this.managers.dialogsStorage.getFolderDialogs(filterId, true);\n const index = storage.findIndex((dialog) => getDialogIndex(dialog, indexKey) <= currentOffsetIndex);\n const needIndex = Math.max(0, index - loadCount);\n loadCount = index - needIndex;\n offsetIndex = getDialogIndex(storage[needIndex], indexKey) + 1;\n } else {\n offsetIndex = currentOffsetIndex;\n }\n }\n\n const promise = this.managers.acknowledged.dialogsStorage.getDialogs({\n offsetIndex,\n limit: loadCount,\n filterId,\n skipMigrated: true\n });\n\n const a = await promise;\n if(doNotRenderChatList) {\n a.result = Promise.reject(makeError('MIDDLEWARE'));\n }\n\n return a;\n }\n\n public 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({\n element: element,\n className: 'is-visible',\n forwards: online,\n duration: 250,\n onTransitionEnd: online ? undefined : () => {\n element.classList.remove(className);\n },\n useRafs: online && !hasClassName ? 2 : 0\n });\n }\n\n public generateScrollable(list: HTMLUListElement, filter: Parameters[0]) {\n const filterId = filter.id;\n const scrollable = new Scrollable(null, 'CL', 500);\n scrollable.container.dataset.filterId = '' + filterId;\n\n const indexKey = getDialogIndexKey(filter.localId);\n const sortedDialogList = new SortedDialogList({\n managers: rootScope.managers,\n log: this.log,\n list: list,\n indexKey,\n onListLengthChange: appDialogsManager.onListLengthChange\n });\n\n this.scrollable = scrollable;\n this.sortedList = sortedDialogList;\n this.setIndexKey(indexKey);\n this.bindScrollable();\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 public testDialogForFilter(dialog: Dialog) {\n if(!REAL_FOLDERS.has(this.filterId) ? getDialogIndex(dialog, this.indexKey) === undefined : this.filterId !== dialog.folder_id) {\n return false;\n }\n\n return true;\n }\n\n protected isDialogMustBeInViewport(dialog: Dialog) {\n if(dialog.migratedTo !== undefined || !this.testDialogForFilter(dialog)) return false;\n return super.isDialogMustBeInViewport(dialog);\n }\n\n /**\n * ะฃะดะฐะปะธั‚ ะฝะตะฟะพะดั…ะพะดัั‰ะธะต ั‡ะฐั‚ั‹ ะธะท ัะฟะธัะบะฐ, ะฝะพ ะฝะต ะดะพะฑะฐะฒะธั‚ ะธั…(!)\n */\n public async validateListForFilter() {\n this.sortedList.getAll().forEach(async(element) => {\n const dialog = await rootScope.managers.appMessagesManager.getDialogOnly(element.id);\n if(!this.testDialogForFilter(dialog)) {\n this.deleteDialog(dialog);\n }\n });\n }\n\n /**\n * ะฃะดะฐะปะธั‚ ะฝะตะฟะพะดั…ะพะดัั‰ะธะน ั‡ะฐั‚ ะธะท ัะฟะธัะบะฐ, ะฝะพ ะฝะต ะดะพะฑะฐะฒะธั‚ ะตะณะพ(!)\n */\n public validateDialogForFilter(dialog: Dialog) {\n if(!this.getDialogElement(dialog.peerId)) {\n return;\n }\n\n if(!this.testDialogForFilter(dialog)) {\n this.deleteDialog(dialog);\n }\n }\n\n public 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({\n element: dom.callIcon.canvas,\n className: 'is-visible',\n forwards: visible,\n duration: BADGE_TRANSITION_TIME,\n onTransitionEnd: visible ? undefined : () => {\n dom.callIcon.canvas.remove();\n dom.callIcon = undefined;\n },\n useRafs: visible ? 2 : 0\n });\n }\n\n public async processDialogForCallStatus(peerId: PeerId, dom?: DialogDom) {\n if(!IS_GROUP_CALL_SUPPORTED) {\n return;\n }\n\n if(!dom) dom = this.getDialogDom(peerId);\n if(!dom) return;\n\n const chat = await rootScope.managers.appChatsManager.getChat(peerId.toChatId()) as Chat.chat | Chat.channel;\n this.setCallStatus(dom, !!(chat.pFlags.call_active && chat.pFlags.call_not_empty));\n }\n\n public onChatsScroll(side: SliceSides = 'bottom') {\n if(this.scrollable.loadedAll[side]) {\n appDialogsManager.loadContacts?.();\n }\n\n this.log('onChatsScroll', side);\n return super.onChatsScroll(side);\n }\n\n public toggleAvatarUnreadBadges(value: boolean, useRafs: number) {\n if(!value) {\n this.sortedList.getAll().forEach((sortedDialog) => {\n const {dom, dialogElement} = sortedDialog;\n if(!dom.unreadAvatarBadge) {\n return;\n }\n\n dialogElement.toggleBadgeByKey('unreadAvatarBadge', false, false, false);\n });\n\n return;\n }\n\n const reuseClassNames = ['unread', 'mention'];\n this.sortedList.getAll().forEach((sortedDialog) => {\n const {dom, dialogElement} = sortedDialog;\n const unreadContent = dom.unreadBadge?.textContent;\n if(!unreadContent || dom.unreadBadge.classList.contains('backwards')) {\n return;\n }\n\n const isUnreadAvatarBadgeMounted = !!dom.unreadAvatarBadge;\n dialogElement.createUnreadAvatarBadge();\n dialogElement.toggleBadgeByKey('unreadAvatarBadge', true, isUnreadAvatarBadgeMounted);\n dom.unreadAvatarBadge.textContent = unreadContent;\n const unreadAvatarBadgeClassList = dom.unreadAvatarBadge.classList;\n const unreadBadgeClassList = dom.unreadBadge.classList;\n reuseClassNames.forEach((className) => {\n unreadAvatarBadgeClassList.toggle(className, unreadBadgeClassList.contains(className));\n });\n });\n }\n\n public getDialogKey(dialog: Dialog) {\n return dialog.peerId;\n }\n\n public getDialogKeyFromElement(element: HTMLElement) {\n return +element.dataset.peerId;\n }\n\n public getDialogFromElement(element: HTMLElement) {\n return rootScope.managers.appMessagesManager.getDialogOnly(element.dataset.peerId.toPeerId());\n }\n}\n\n// const testScroll = false;\n// let testTopSlice = 1;\n\nexport class AppDialogsManager {\n public chatsContainer = document.getElementById('chatlist-container') as HTMLDivElement;\n\n private log = logger('DIALOGS', LogTypes.Log | LogTypes.Error | LogTypes.Warn | LogTypes.Debug);\n\n private contextMenu: DialogsContextMenu;\n\n public filterId: number;\n public 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\n private lastActiveElements: Set = new Set();\n\n public loadContacts: () => void;\n public processContact: (peerId: PeerId) => void;\n\n private initedListeners = false;\n\n public onListLengthChange: () => Promise;\n private allChatsIntlElement: I18n.IntlElement;\n\n private emptyDialogsPlaceholderSubtitle: I18n.IntlElement;\n private updateContactsLengthPromise: Promise;\n\n private filtersNavigationItem: NavigationItem;\n\n private managers: AppManagers;\n private selectTab: ReturnType;\n\n public doNotRenderChatList: boolean;\n\n private stateMiddlewareHelper: MiddlewareHelper;\n\n private forumsTabs: Map;\n private forumsSlider: HTMLElement;\n public forumTab: ForumTab;\n private forumNavigationItem: NavigationItem;\n\n public xd: Some2;\n public xds: {[filterId: number]: Some2} = {};\n\n public start() {\n const managers = this.managers = getProxiedManagers();\n\n this.contextMenu = new DialogsContextMenu(managers);\n this.stateMiddlewareHelper = getMiddleware();\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 this.forumsTabs = new Map();\n this.forumsSlider = document.createElement('div');\n this.forumsSlider.classList.add('topics-slider');\n this.chatsContainer.parentElement.parentElement.append(this.forumsSlider);\n // findUpClassName(this.chatsContainer, 'chatlist-container').append(this.forumsSlider);\n\n // appSidebarLeft.onOpenTab = () => {\n // return this.toggleForumTab();\n // };\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 verifyTouchTarget: () => {\n return !this.forumTab;\n }\n });\n }\n\n this.allChatsIntlElement = new I18n.IntlElement({\n key: 'FilterAllChatsShort'\n });\n\n rootScope.addEventListener('premium_toggle', async(isPremium) => {\n if(isPremium) {\n return;\n }\n\n const isFolderAvailable = await this.managers.filtersStorage.isFilterIdAvailable(this.filterId);\n if(!isFolderAvailable) {\n selectTab(whichChild(this.filtersRendered[FOLDER_ID_ALL].menu), false);\n }\n });\n\n rootScope.addEventListener('state_cleared', () => {\n const clearCurrent = REAL_FOLDERS.has(this.filterId);\n // setTimeout(() =>\n apiManagerProxy.getState().then(async(state) => {\n this.xd.loadedDialogsAtLeastOnce = false;\n this.showFiltersPromise = undefined;\n\n /* const clearPromises: Promise[] = [];\n for(const name in this.managers.appStateManager.storagesResults) {\n const results = this.managers.appStateManager.storagesResults[name as keyof AppStateManager['storages']];\n const storage = this.managers.appStateManager.storages[name as keyof AppStateManager['storages']];\n results.length = 0;\n clearPromises.push(storage.clear());\n } */\n\n if(clearCurrent) {\n this.xd.clear();\n this.onTabChange();\n }\n\n this.onStateLoaded(state);\n })// , 5000);\n });\n\n this.setFilterId(FOLDER_ID_ALL, FOLDER_ID_ALL);\n this.addFilter({\n id: FOLDER_ID_ALL,\n title: '',\n localId: FOLDER_ID_ALL\n });\n\n const foldersScrollable = new ScrollableX(this.folders.menuScrollContainer);\n bottomPart.prepend(this.folders.menuScrollContainer);\n const selectTab = this.selectTab = horizontalMenu(this.folders.menu, this.folders.container, async(id, tabContent) => {\n /* if(id !== 0) {\n id += 1;\n } */\n\n const _id = id;\n id = +tabContent.dataset.filterId || FOLDER_ID_ALL;\n\n const isFilterAvailable = this.filterId === -1 || REAL_FOLDERS.has(id) || await this.managers.filtersStorage.isFilterIdAvailable(id);\n if(!isFilterAvailable) {\n return false;\n }\n\n const wasFilterId = this.filterId;\n if(!IS_MOBILE_SAFARI) {\n if(_id) {\n if(!this.filtersNavigationItem) {\n this.filtersNavigationItem = {\n type: 'filters',\n onPop: () => {\n selectTab(0);\n this.filtersNavigationItem = undefined;\n }\n };\n\n appNavigationController.spliceItems(1, 0, this.filtersNavigationItem);\n }\n } else if(this.filtersNavigationItem) {\n appNavigationController.removeItem(this.filtersNavigationItem);\n this.filtersNavigationItem = undefined;\n }\n }\n\n if(wasFilterId === id) return;\n\n this.xds[id].clear();\n const promise = this.setFilterIdAndChangeTab(id).then(({cached, renderPromise}) => {\n if(cached) {\n return renderPromise;\n }\n });\n\n if(wasFilterId !== -1) {\n return promise;\n }\n }, () => {\n for(const folderId in this.xds) {\n if(+folderId !== this.filterId) {\n this.xds[folderId].clear();\n }\n }\n }, undefined, foldersScrollable);\n\n apiManagerProxy.getState().then((state) => {\n // * it should've had a better place :(\n appMediaPlaybackController.setPlaybackParams(state.playbackParams);\n appMediaPlaybackController.addEventListener('playbackParams', (params) => {\n this.managers.appStateManager.pushToState('playbackParams', params);\n });\n\n return this.onStateLoaded(state);\n })/* .then(() => {\n const isLoadedMain = this.managers.appMessagesManager.dialogsStorage.isDialogsLoaded(0);\n const isLoadedArchive = this.managers.appMessagesManager.dialogsStorage.isDialogsLoaded(1);\n const wasLoaded = isLoadedMain || isLoadedArchive;\n const a: Promise = isLoadedMain ? Promise.resolve() : this.managers.appMessagesManager.getConversationsAll('', 0);\n const b: Promise = isLoadedArchive ? Promise.resolve() : this.managers.appMessagesManager.getConversationsAll('', 1);\n a.finally(() => {\n b.then(() => {\n if(wasLoaded) {\n (apiUpdatesManager.updatesState.syncLoading || Promise.resolve()).then(() => {\n this.managers.appMessagesManager.refreshConversations();\n });\n }\n });\n });\n }) */;\n\n mediaSizes.addEventListener('resize', () => {\n this.changeFiltersAllChatsKey();\n });\n\n new ConnectionStatusComponent(this.managers, this.chatsContainer);\n this.chatsContainer.append(bottomPart);\n\n setTimeout(() => {\n lottieLoader.loadLottieWorkers();\n }, 200);\n\n PopupElement.MANAGERS = rootScope.managers = managers;\n appDownloadManager.construct(managers);\n appSidebarLeft.construct(managers);\n appSidebarRight.construct(managers);\n groupCallsController.construct(managers);\n callsController.construct(managers);\n appImManager.construct(managers);\n\n // start\n\n this.xd = this.xds[this.filterId];\n\n // selectTab(0, false);\n }\n\n public get chatList() {\n return this.xd.sortedList.list;\n }\n\n public setFilterId(filterId: number, localId: MyDialogFilter['localId']) {\n this.filterId = filterId;\n }\n\n public async setFilterIdAndChangeTab(filterId: number) {\n this.filterId = filterId;\n return this.onTabChange();\n }\n\n private initListeners() {\n rootScope.addEventListener('dialog_flush', ({dialog}) => {\n if(!dialog) {\n return;\n }\n\n this.setFiltersUnreadCount();\n });\n\n rootScope.addEventListener('folder_unread', async(folder) => {\n if(folder.id < 0) {\n const dialogElement = this.xd.getDialogElement(folder.id);\n if(!dialogElement) {\n return;\n }\n\n this.setUnreadMessagesN({\n dialog: await this.managers.dialogsStorage.getDialogOnly(folder.id),\n dialogElement\n });\n } else {\n this.setFilterUnreadCount(folder.id);\n }\n });\n\n rootScope.addEventListener('contacts_update', (userId) => {\n this.processContact?.(userId.toPeerId());\n });\n\n appImManager.addEventListener('peer_changed', ({peerId, threadId, isForum}) => {\n const options: Parameters[0] = {peerId, threadId: isForum ? threadId : undefined};\n // const perf = performance.now();\n for(const element of this.lastActiveElements) {\n const elementThreadId = +element.dataset.threadId || undefined;\n const elementPeerId = element.dataset.peerId.toPeerId();\n if(!appImManager.isSamePeer({peerId: elementPeerId, threadId: elementThreadId}, options)) {\n this.setDialogActive(element, false);\n }\n }\n\n const elements = Array.from(document.querySelectorAll(`[data-autonomous=\"0\"] .chatlist-chat[data-peer-id=\"${peerId}\"]`)) as HTMLElement[];\n elements.forEach((element) => {\n const elementThreadId = +element.dataset.threadId || undefined;\n if(appImManager.isSamePeer({peerId, threadId: elementThreadId}, options)) {\n this.setDialogActive(element, true);\n }\n });\n // this.log('peer_changed total time:', performance.now() - perf);\n });\n\n rootScope.addEventListener('filter_update', async(filter) => {\n if(REAL_FOLDERS.has(filter.id)) {\n return;\n }\n\n if(!this.filtersRendered[filter.id]) {\n this.addFilter(filter);\n return;\n }\n\n const elements = this.filtersRendered[filter.id];\n setInnerHTML(elements.title, 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 elements.container.remove();\n elements.menu.remove();\n\n this.xds[filter.id].destroy();\n delete this.xds[filter.id];\n delete this.filtersRendered[filter.id];\n\n this.onFiltersLengthChange();\n\n if(this.filterId === filter.id) {\n this.selectTab(0, false);\n }\n });\n\n rootScope.addEventListener('filter_order', async(order) => {\n order = order.slice();\n indexOfAndSplice(order, FOLDER_ID_ARCHIVE);\n\n const containerToAppend = this.folders.menu as HTMLElement;\n const r = await Promise.all(order.map(async(filterId) => {\n const [indexKey, filter] = await Promise.all([\n this.managers.dialogsStorage.getDialogIndexKeyByFilterId(filterId),\n this.managers.filtersStorage.getFilter(filterId)\n ]);\n\n return {indexKey, filter};\n }));\n\n order.forEach((filterId, idx) => {\n const {indexKey, filter} = r[idx];\n const renderedFilter = this.filtersRendered[filterId];\n\n this.xds[filterId].setIndexKey(indexKey);\n\n positionElementByIndex(renderedFilter.menu, containerToAppend, filter.localId);\n positionElementByIndex(renderedFilter.container, this.folders.container, filter.localId);\n });\n\n /* if(this.filterId) {\n const tabIndex = order.indexOf(this.filterId) + 1;\n selectTab.prevId = tabIndex;\n } */\n });\n }\n\n public setDialogActive(listEl: HTMLElement, active: boolean) {\n const dom = (listEl as any).dialogDom as DialogDom;\n listEl.classList.toggle('active', active);\n listEl.classList.toggle('is-forum-open', this.forumTab?.peerId === listEl.dataset.peerId.toPeerId() && !listEl.dataset.threadId);\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 this.stateMiddlewareHelper.clean();\n const middleware = this.stateMiddlewareHelper.get();\n const filtersArr = state.filtersArr;\n const haveFilters = filtersArr.length > REAL_FOLDERS.size;\n // const filter = filtersArr.find((filter) => filter.id !== FOLDER_ID_ARCHIVE);\n\n const addFilters = (filters: MyDialogFilter[]) => {\n for(const filter of filters) {\n this.addFilter(filter);\n }\n };\n\n let addFiltersPromise: Promise;\n if(haveFilters) {\n addFilters(filtersArr);\n } else {\n addFiltersPromise = this.managers.filtersStorage.getDialogFilters().then(addFilters);\n }\n\n this.doNotRenderChatList = true;\n const loadDialogsPromise = this.xd.onChatsScroll();\n const m = middlewarePromise(middleware);\n try {\n await m(loadDialogsPromise);\n } catch(err) {\n\n }\n\n // show the placeholder before the filters, and then will reset to the default tab again\n if(!haveFilters) {\n this.selectTab(0, false);\n }\n\n addFiltersPromise && await m(addFiltersPromise);\n // this.folders.menu.children[0].classList.add('active');\n\n this.doNotRenderChatList = undefined;\n\n this.filterId = -1;\n this.selectTab(0, false);\n\n if(!this.initedListeners) {\n this.initListeners();\n this.initedListeners = true;\n }\n\n haveFilters && this.showFiltersPromise && await m(this.showFiltersPromise);\n\n this.managers.appNotificationsManager.getNotifyPeerTypeSettings();\n\n await (await m(loadDialogsPromise)).renderPromise.catch(noop);\n this.managers.appMessagesManager.fillConversations();\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 = this.managers.appMessagesManager.getDialogByPeerId(peerId);\n return {index: dialog[0].index, pos: dialog[1]};\n }\n }\n\n return {index: 0, pos: -1};\n } */\n\n public onTabChange = () => {\n this.xd = this.xds[this.filterId];\n this.xd.reset();\n return this.xd.onChatsScroll();\n };\n\n private async setFilterUnreadCount(filterId: number) {\n // if(filterId === FOLDER_ID_ALL) {\n // return;\n // }\n\n const unreadSpan = this.filtersRendered[filterId]?.unread;\n if(!unreadSpan) {\n return;\n }\n\n const {unreadUnmutedCount, unreadCount} = await this.managers.dialogsStorage.getFolderUnreadCount(filterId);\n\n unreadSpan.classList.toggle('badge-gray', !unreadUnmutedCount);\n const count = filterId === FOLDER_ID_ALL ? unreadUnmutedCount : unreadCount;\n unreadSpan.innerText = count ? '' + count : '';\n }\n\n private setFiltersUnreadCount() {\n for(const filterId in this.filtersRendered) {\n this.setFilterUnreadCount(+filterId);\n }\n }\n\n public l(filter: Parameters[0]) {\n const ul = this.createChatList();\n const xd = this.xds[filter.id] = new Some2(filter.id);\n const scrollable = xd.generateScrollable(ul, filter);\n this.setListClickListener(ul, null, true);\n\n return {ul, xd, scrollable};\n }\n\n private addFilter(filter: Pick) {\n if(filter.id === FOLDER_ID_ARCHIVE) {\n return;\n }\n\n const containerToAppend = this.folders.menu as HTMLElement;\n const renderedFilter = this.filtersRendered[filter.id];\n if(renderedFilter) {\n positionElementByIndex(renderedFilter.menu, containerToAppend, filter.localId);\n positionElementByIndex(renderedFilter.container, this.folders.container, filter.localId);\n return;\n }\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.id === FOLDER_ID_ALL) titleSpan.append(this.allChatsIntlElement.element);\n else setInnerHTML(titleSpan, 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 ripple(menuTab);\n menuTab.append(span);\n\n menuTab.dataset.filterId = '' + filter.id;\n\n positionElementByIndex(menuTab, containerToAppend, filter.localId);\n // containerToAppend.append(li);\n\n const {ul, scrollable} = this.l(filter);\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.localId);\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 let promise = this.showFiltersPromise;\n return promise ??= this.showFiltersPromise = pause(0).then(() => {\n if(this.showFiltersPromise !== promise) {\n return;\n }\n\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 });\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 === FOLDER_ID_ARCHIVE) {\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.xd.scrollable.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 const div = document.createElement('div');\n const emoji = '๐Ÿ“‚';\n const size = 128;\n wrapStickerEmoji({\n div,\n emoji: emoji,\n width: size,\n height: size\n });\n\n placeholderContainer.prepend(div);\n\n const button = Button('btn-primary btn-color-primary btn-control tgico', {\n text: 'FilterHeaderEdit',\n icon: 'settings'\n });\n\n attachClickEvent(button, async() => {\n const tab = appSidebarLeft.createTab(AppEditFolderTab);\n tab.setInitFilter(await this.managers.filtersStorage.getFilter(this.filterId));\n tab.open();\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 return this.updateContactsLengthPromise ??= this.managers.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.replaceChildren();\n this.loadContacts = undefined;\n this.processContact = undefined;\n }\n\n private _onListLengthChange = () => {\n if(!this.xd.loadedDialogsAtLeastOnce) {\n return;\n }\n\n this.checkIfPlaceholderNeeded();\n\n if(this.filterId !== FOLDER_ID_ALL) 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 this.managers.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: 'abitbigger',\n createChatListOptions: {\n dialogSize: 48,\n new: true\n },\n autonomous: false,\n onListLengthChange,\n managers: this.managers\n });\n\n this.loadContacts = () => {\n const pageCount = windowSize.height / 60 | 0;\n const promise = filterAsync(contacts.splice(0, pageCount), this.verifyPeerIdForContacts);\n\n promise.then((arr) => {\n arr.forEach((peerId) => {\n sortedUserList.add(peerId);\n });\n });\n\n if(!contacts.length) {\n this.loadContacts = undefined;\n }\n };\n\n this.loadContacts();\n\n this.processContact = async(peerId) => {\n if(peerId.isAnyChat()) {\n return;\n }\n\n const good = await 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 = async(peerId: PeerId) => {\n const [isContact, dialog] = await Promise.all([\n this.managers.appPeersManager.isContact(peerId),\n this.managers.appMessagesManager.getDialogOnly(peerId)\n ]);\n\n return isContact && !dialog;\n };\n\n public async toggleForumTab(newTab?: ForumTab, hideTab = this.forumTab) {\n if(!hideTab && !newTab) {\n return;\n }\n\n if(hideTab) {\n const dialogElement = this.xd.getDialogElement(hideTab.peerId);\n if(dialogElement) {\n dialogElement.dom.listEl.classList.remove('is-forum-open');\n }\n }\n\n if(hideTab === newTab) {\n newTab = undefined;\n }\n\n hideTab?.toggle(false);\n const promise = newTab?.toggle(true);\n if(hideTab === this.forumTab) {\n this.forumTab = newTab;\n }\n\n if(newTab) {\n const dialogElement = this.xd.getDialogElement(newTab.peerId);\n if(dialogElement) {\n dialogElement.dom.listEl.classList.add('is-forum-open');\n }\n\n appImManager.selectTab(APP_TABS.CHATLIST);\n }\n\n if(promise) {\n await promise;\n }\n\n if(newTab && !this.forumNavigationItem) {\n this.forumNavigationItem = {\n type: 'forum',\n onPop: () => {\n this.forumNavigationItem = undefined;\n this.toggleForumTab();\n }\n };\n\n appNavigationController.pushItem(this.forumNavigationItem);\n } else if(!newTab && this.forumNavigationItem) {\n appNavigationController.removeItem(this.forumNavigationItem);\n this.forumNavigationItem = undefined;\n }\n\n const forwards = !!newTab;\n const useRafs = promise ? 2 : undefined;\n this.xd.toggleAvatarUnreadBadges(forwards, useRafs);\n\n const deferred = deferredPromise();\n const duration = 300;\n SetTransition({\n element: this.forumsSlider.parentElement,\n className: 'is-forum-visible',\n duration,\n forwards,\n useRafs,\n onTransitionEnd: () => {\n deferred.resolve();\n }\n });\n\n dispatchHeavyAnimationEvent(deferred, duration).then(() => deferred.resolve());\n }\n\n public toggleForumTabByPeerId(peerId: PeerId, show?: boolean) {\n const {managers} = this;\n const history = appSidebarLeft.getHistory();\n const lastTab = history[history.length - 1];\n let forumTab: ForumTab;\n if(lastTab/* && !(lastTab instanceof AppArchivedTab) */) {\n if(lastTab instanceof ForumTab && lastTab.peerId === peerId && show) {\n shake(lastTab.container);\n return;\n }\n\n forumTab = appSidebarLeft.createTab(ForumTab);\n forumTab.open({peerId, managers});\n return;\n }\n\n forumTab = this.forumsTabs.get(peerId);\n const isSameTab = this.forumTab && this.forumTab === forumTab;\n show ??= !isSameTab;\n if(show === isSameTab) {\n if(show) {\n shake(forumTab.container);\n }\n\n return;\n }\n\n if(show && !forumTab) {\n forumTab = new ForumTab(undefined);\n forumTab.init({peerId, managers});\n\n this.forumsTabs.set(peerId, forumTab);\n this.forumsSlider.append(forumTab.container);\n\n forumTab.managers = this.managers;\n forumTab.eventListener.addEventListener('destroy', () => {\n this.forumsTabs.delete(peerId);\n });\n }\n\n return this.toggleForumTab(forumTab);\n }\n\n public setListClickListener(\n list: HTMLUListElement,\n onFound?: () => void,\n withContext = false,\n autonomous = false,\n openInner = false\n ) {\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\n this.log('dialogs click list');\n const target = e.target as HTMLElement;\n const elem = findUpTag(target, DIALOG_LIST_ELEMENT_TAG);\n\n if(!elem) {\n return;\n }\n\n const peerId = elem.dataset.peerId.toPeerId();\n const lastMsgId = +elem.dataset.mid || undefined;\n const threadId = +elem.dataset.threadId || undefined;\n\n onFound?.();\n\n const isForum = !!elem.querySelector('.is-forum');\n if(isForum && !e.shiftKey && !lastMsgId) {\n this.toggleForumTabByPeerId(peerId);\n return;\n }\n\n if(e.ctrlKey || e.metaKey) {\n window.open((elem as HTMLAnchorElement).href || ('#' + peerId), '_blank');\n cancelEvent(e);\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(\n (!threadId || lastMsgId) &&\n this.xd.sortedList.list === list &&\n this.xd !== this.xds[FOLDER_ID_ARCHIVE]\n ) {\n this.toggleForumTab();\n }\n\n setPeerFunc({\n peerId,\n lastMsgId,\n threadId: threadId\n });\n }, {capture: true});\n\n // cancel link click\n // ! do not change it to attachClickEvent\n list.addEventListener('click', (e) => {\n if(e.button === 0) {\n cancelEvent(e);\n }\n }, {capture: true});\n\n if(withContext) {\n this.contextMenu.attach(list);\n }\n }\n\n public createChatList(options: {\n // avatarSize?: number,\n // handheldsSize?: number,\n // size?: number,\n new?: boolean,\n dialogSize?: number,\n ignoreClick?: boolean\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.ignoreClick) {\n // list.classList.add('disable-hover');\n // }\n\n /* if(options.handheldsSize) {\n list.classList.add('chatlist-handhelds-' + options.handheldsSize);\n } */\n\n return list;\n }\n\n public setLastMessageN(options: Parameters[0]) {\n const promise = this.setLastMessage(options);\n return promise.catch((err: ApiError) => {\n if(err?.type !== 'MIDDLEWARE') {\n this.log.error('set last message error', err);\n }\n });\n }\n\n private async setLastMessage({\n dialog,\n lastMessage,\n dialogElement,\n highlightWord,\n isBatch = false,\n setUnread = false\n }: {\n dialog: Dialog | ForumTopic,\n lastMessage?: Message.message | Message.messageService,\n dialogElement?: DialogElement,\n highlightWord?: string,\n isBatch?: boolean,\n setUnread?: boolean\n }) {\n if(!dialogElement) {\n dialogElement = this.xd.getDialogElement(dialog.peerId);\n\n if(!dialogElement) {\n return;\n }\n }\n\n const {dom} = dialogElement;\n const {peerId} = dialog;\n\n const {deferred: promise, middleware} = setPromiseMiddleware(dom, 'setLastMessagePromise');\n\n let draftMessage: MyDraftMessage;\n if(!lastMessage) {\n if(\n dialog.draft?._ === 'draftMessage' && (\n !peerId.isAnyChat() ||\n dialog._ === 'forumTopic' ||\n !(await this.managers.appPeersManager.isForum(peerId))\n )\n ) {\n draftMessage = dialog.draft;\n }\n\n lastMessage = (dialog as Dialog).topMessage;\n if(lastMessage?.mid !== dialog.top_message) {\n const promise = this.managers.appMessagesManager.getMessageByPeer(peerId, dialog.top_message);\n lastMessage = await middleware(promise);\n }\n }\n\n const isSearch = setUnread !== null && !setUnread;\n // * do not uncomment `setUnread` - unsetTyping right after this call will interrupt setting unread badges\n if(/* setUnread */!isSearch) {\n this.setUnreadMessagesN({dialog, dialogElement, isBatch, setLastMessagePromise: promise});\n }\n\n if(!lastMessage/* || (lastMessage._ === 'messageService' && !lastMessage.rReply) */) {\n dom.lastMessageSpan.replaceChildren();\n dom.lastTimeSpan.replaceChildren();\n delete dom.listEl.dataset.mid;\n\n promise.resolve();\n return;\n }\n\n const isRestricted = lastMessage && isMessageRestricted(lastMessage as Message.message);\n\n /* if(!dom.lastMessageSpan.classList.contains('user-typing')) */ {\n let mediaContainer: HTMLElement;\n const willPrepend: (Promise | HTMLElement)[] = [];\n if(lastMessage && !draftMessage && !isRestricted) {\n const media: MyDocument | MyPhoto = getMediaFromMessage(lastMessage);\n const videoTypes: Set = new Set(['video', 'gif', 'round']);\n if(media && (media._ === 'photo' || videoTypes.has(media.type))) {\n const size = choosePhotoSize(media, 20, 20);\n\n if(size._ !== 'photoSizeEmpty') {\n mediaContainer = document.createElement('div');\n mediaContainer.classList.add('dialog-subtitle-media');\n\n if((media as MyDocument).type === 'round') {\n mediaContainer.classList.add('is-round');\n }\n\n willPrepend.push(wrapPhoto({\n photo: media,\n message: lastMessage,\n container: mediaContainer,\n withoutPreloader: true,\n size\n }).then(() => mediaContainer));\n\n if(videoTypes.has((media as MyDocument).type)) {\n const playIcon = document.createElement('span');\n playIcon.classList.add('tgico-play');\n\n mediaContainer.append(playIcon);\n }\n }\n }\n }\n\n /* if(lastMessage.from_id === auth.id) { // You: */\n if(draftMessage) {\n const span = document.createElement('span');\n span.classList.add('danger');\n span.append(i18n('Draft'), ': ');\n willPrepend.unshift(span);\n } else if(peerId.isAnyChat() && peerId !== lastMessage.fromId && !(lastMessage as Message.messageService).action) {\n const span = document.createElement('span');\n span.classList.add('primary-text');\n\n if(lastMessage.fromId === rootScope.myId) {\n span.append(i18n('FromYou'));\n willPrepend.unshift(span);\n } else {\n // str = sender.first_name || sender.last_name || sender.username;\n const p = middleware(wrapPeerTitle({\n peerId: lastMessage.fromId,\n onlyFirstName: true\n })).then((element) => {\n span.prepend(element);\n return span;\n }, noop);\n\n willPrepend.unshift(p);\n }\n\n span.append(': ');\n // console.log(sender, senderBold.innerText);\n }\n\n const withoutMediaType = !!mediaContainer && !!(lastMessage as Message.message)?.message;\n\n let fragment: DocumentFragment;\n if(highlightWord && (lastMessage as Message.message).message) {\n fragment = await middleware(wrapMessageForReply({message: lastMessage, highlightWord, withoutMediaType}));\n } else if(draftMessage) {\n fragment = await middleware(wrapMessageForReply({message: draftMessage}));\n } else if(lastMessage) {\n fragment = await middleware(wrapMessageForReply({message: lastMessage, withoutMediaType}));\n } else { // rare case\n fragment = document.createDocumentFragment();\n }\n\n if(willPrepend.length) {\n const elements = await middleware(Promise.all(willPrepend));\n fragment.prepend(...elements);\n }\n\n replaceContent(dom.lastMessageSpan, fragment);\n }\n\n if(lastMessage || 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(isSearch) {\n dom.listEl.dataset.mid = '' + lastMessage.mid;\n\n const replyTo = lastMessage.reply_to;\n if(replyTo?.pFlags?.forum_topic) {\n dom.listEl.dataset.threadId = '' + getMessageThreadId(lastMessage);\n }\n }\n\n promise.resolve();\n }\n\n public setUnreadMessagesN(options: Parameters[0]) {\n return this.setUnreadMessages(options).catch(() => {});\n }\n\n private async setUnreadMessages({\n dialog,\n dialogElement,\n isBatch = false,\n setLastMessagePromise\n }: {\n dialog: Dialog | ForumTopic,\n dialogElement: DialogElement,\n isBatch?: boolean,\n setLastMessagePromise?: Promise\n }) {\n const {dom} = dialogElement;\n if(!dom) {\n // this.log.error('setUnreadMessages no dom!', dialog);\n return;\n }\n\n const isTopic = dialog._ === 'forumTopic';\n\n const {deferred, middleware} = setPromiseMiddleware(dom, 'setUnreadMessagePromise');\n\n const {peerId} = dialog;\n const promises = Promise.all([\n this.managers.appNotificationsManager.isPeerLocalMuted({peerId: peerId, respectType: true, threadId: isTopic ? dialog.id : undefined}),\n dialog.draft?._ !== 'draftMessage' ? this.managers.appMessagesManager.getMessageByPeer(peerId, dialog.top_message) : undefined,\n isTopic ? !!dialog.pFlags.pinned : this.managers.dialogsStorage.isDialogPinned(peerId, this.filterId),\n this.managers.appMessagesManager.isDialogUnread(dialog),\n peerId.isAnyChat() && !isTopic ? this.managers.acknowledged.dialogsStorage.getForumUnreadCount(peerId).then((result) => {\n if(result.cached) {\n return result.result;\n } else {\n result.result.then(() => {\n this.setUnreadMessagesN({dialog, dialogElement});\n });\n\n return {count: 0, hasUnmuted: false};\n }\n }).catch(() => undefined as {count: number, hasUnmuted: boolean}) : undefined\n ]);\n\n let [isMuted, lastMessage, isPinned, isDialogUnread, forumUnreadCount] = await middleware(promises);\n const wasMuted = dom.listEl.classList.contains('is-muted');\n\n const {count: unreadTopicsCount, hasUnmuted: hasUnmutedTopic} = forumUnreadCount || {};\n\n let setStatusMessage: MyMessage;\n if(lastMessage && lastMessage.pFlags.out && lastMessage.peerId !== rootScope.myId) {\n setStatusMessage = lastMessage;\n }\n\n const unreadCount = unreadTopicsCount ?? dialog.unread_count;\n if(unreadTopicsCount !== undefined) {\n isDialogUnread = !!unreadCount;\n }\n\n if(isTopic && !isDialogUnread) {\n isDialogUnread = !getServerMessageId(dialog.read_inbox_max_id);\n }\n\n const hasUnreadBadge = isPinned || isDialogUnread;\n const hasUnreadAvatarBadge = this.xd !== this.xds[FOLDER_ID_ARCHIVE] && !isTopic && !!this.forumTab && this.xd.getDialogElement(peerId) === dialogElement && isDialogUnread;\n // dom.messageEl.classList.toggle('has-badge', hasBadge);\n\n // * have to await all promises before modifying something\n\n if(setLastMessagePromise) {\n try {\n await middleware(setLastMessagePromise);\n } catch(err) {\n return;\n }\n }\n\n const transitionDuration = isBatch ? 0 : BADGE_TRANSITION_TIME;\n\n dom.listEl.classList.toggle('no-unmuted-topic', !isMuted && hasUnmutedTopic !== undefined && !hasUnmutedTopic);\n\n if(isMuted !== wasMuted) {\n SetTransition({\n element: dom.listEl,\n className: 'is-muted',\n forwards: isMuted,\n duration: transitionDuration\n });\n }\n\n setSendingStatus(dom.statusSpan, isTopic && dialog.pFlags.closed ? 'premium_lock' : setStatusMessage, true);\n\n // if(isTopic) {\n // dom.statusSpan.parentElement.classList.toggle('is-closed', !!dialog.pFlags.closed);\n // }\n\n const isUnreadBadgeMounted = !!dom.unreadBadge;\n if(hasUnreadBadge) {\n dialogElement.createUnreadBadge();\n }\n\n const isUnreadAvatarBadgeMounted = !!dom.unreadAvatarBadge;\n if(hasUnreadAvatarBadge) {\n dialogElement.createUnreadAvatarBadge();\n }\n\n const hasMentionsBadge = dialog.unread_mentions_count && (dialog.unread_mentions_count > 1 || dialog.unread_count > 1);\n const isMentionsBadgeMounted = !!dom.mentionsBadge;\n if(hasMentionsBadge) {\n dialogElement.createMentionsBadge();\n }\n\n const a: [Parameters[0], boolean, boolean][] = [\n ['unreadBadge', hasUnreadBadge, isUnreadBadgeMounted],\n ['unreadAvatarBadge', hasUnreadAvatarBadge, isUnreadAvatarBadgeMounted],\n ['mentionsBadge', hasMentionsBadge, isMentionsBadgeMounted]\n ];\n\n a.forEach(([key, hasBadge, isBadgeMounted]) => {\n const badge = dom[key];\n if(!badge) {\n return;\n }\n\n dialogElement.toggleBadgeByKey(key, hasBadge, isBadgeMounted, isBatch);\n });\n\n if(!hasUnreadBadge) {\n deferred.resolve();\n return;\n }\n\n if(isPinned) {\n dom.unreadBadge.classList.add('tgico-chatspinned', 'tgico');\n } else if(dom.unreadBadge) {\n dom.unreadBadge.classList.remove('tgico-chatspinned', 'tgico');\n }\n\n let isUnread = true, isMention = false, unreadBadgeText: string;\n if(dialog.unread_mentions_count && unreadCount === 1) {\n unreadBadgeText = '@';\n isMention = true;\n // dom.unreadBadge.classList.add('tgico-mention', 'tgico');\n } else if(isDialogUnread) {\n // dom.unreadMessagesSpan.innerText = '' + (unreadCount ? formatNumber(unreadCount, 1) : ' ');\n unreadBadgeText = '' + (unreadCount ? formatNumber(unreadCount, 1) : ' ');\n } else {\n unreadBadgeText = '';\n isUnread = false;\n }\n\n if(isTopic) {\n const notVisited = isDialogUnread && unreadBadgeText === ' ';\n dom.unreadBadge.classList.toggle('not-visited', notVisited);\n }\n\n const b: Array<[HTMLElement, string]> = [\n [dom.unreadBadge, unreadBadgeText],\n [dom.unreadAvatarBadge, unreadBadgeText || undefined]\n ];\n\n b.filter(Boolean).forEach(([badge, text]) => {\n if(text !== undefined) {\n badge.innerText = unreadBadgeText;\n }\n\n badge.classList.toggle('unread', isUnread);\n badge.classList.toggle('mention', isMention);\n });\n\n deferred.resolve();\n }\n\n private async getDialog(dialog: Dialog | ForumTopic | PeerId, threadId?: number) {\n if(typeof(dialog) !== 'object') {\n let originalDialog: Dialog | ForumTopic;\n if(threadId) {\n originalDialog = await this.managers.dialogsStorage.getForumTopic(dialog, threadId);\n if(!originalDialog) {\n const peerId = dialog || NULL_PEER_ID;\n return {\n peerId,\n pFlags: {}\n } as any as ForumTopic;\n }\n } else {\n originalDialog = await this.managers.appMessagesManager.getDialogOnly(dialog);\n if(!originalDialog) {\n const peerId = dialog || NULL_PEER_ID;\n return {\n peerId,\n peer: await this.managers.appPeersManager.getOutputPeer(peerId),\n pFlags: {}\n } as any as Dialog;\n }\n }\n\n return originalDialog;\n }\n\n return dialog as Dialog | ForumTopic;\n }\n\n public addListDialog(options: Parameters[0] & {isBatch?: boolean}) {\n options.autonomous = false;\n\n const ret = this.addDialogNew(options);\n\n if(ret) {\n const {peerId} = options;\n const getDialogPromise = this.getDialog(peerId, options.threadId);\n const promise = getDialogPromise.then((dialog) => {\n const promises: Promise[] = [];\n const isUser = peerId.isUser();\n if(!isUser && dialog._ === 'dialog') {\n promises.push(this.xd.processDialogForCallStatus(peerId, ret.dom));\n }\n\n if(peerId !== rootScope.myId && isUser) {\n promises.push(this.managers.appUsersManager.getUserStatus(peerId.toUserId()).then((status) => {\n if(status?._ === 'userStatusOnline') {\n this.xd.setOnlineStatus(ret.dom.avatarEl, true);\n }\n }));\n }\n\n promises.push(this.setLastMessageN({\n dialog,\n dialogElement: ret,\n isBatch: options.isBatch,\n setUnread: true\n }));\n\n return Promise.all(promises);\n });\n\n options.loadPromises?.push(promise);\n }\n\n return ret;\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 = this.addDialogNew({\n ...options,\n ...getMessageSenderPeerIdOrName(message),\n peerId\n });\n\n this.setLastMessageN({\n dialog: {_: 'dialog', peerId} as any,\n lastMessage: message,\n dialogElement: ret,\n highlightWord: query\n });\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: DialogElementOptions & {container?: HTMLElement | Scrollable | false, append?: boolean}) {\n const d = new DialogElement({\n autonomous: !!options.container,\n avatarSize: 'bigger',\n ...options\n // avatarSize: !options.avatarSize || options.avatarSize >= 54 ? 'bigger' : 'abitbigger',\n });\n\n if(options.container) {\n const method = !options.append ? 'append' : 'prepend';\n options.container[method](d.container);\n }\n\n return d;\n // return this.addDialog(options.peerId, options.container, options.rippleEnabled, options.onlyFirstName, options.meAsSaved, options.append, options.avatarSize, options.autonomous, options.lazyLoadQueue, options.loadPromises, options.fromName, options.noIcons);\n }\n}\n\nconst appDialogsManager = new AppDialogsManager();\nMOUNT_CLASS_TO.appDialogsManager = appDialogsManager;\nexport default appDialogsManager;\n","export default function getUnsafeRandomInt(min: number, max: number) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1)) + min;\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 {DownloadMediaOptions, DownloadOptions} from '../mtproto/apiFileManager';\nimport type {AppMessagesManager} from './appMessagesManager';\nimport type {MyDocument} from './appDocsManager';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport {InputFile, Photo, PhotoSize} from '../../layer';\nimport getFileNameForUpload from '../../helpers/getFileNameForUpload';\nimport {AppManagers} from './managers';\nimport rootScope from '../rootScope';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport noop from '../../helpers/noop';\nimport getDownloadMediaDetails from './utils/download/getDownloadMediaDetails';\nimport getDownloadFileNameFromOptions from './utils/download/getDownloadFileNameFromOptions';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport makeError from '../../helpers/makeError';\nimport createDownloadAnchor from '../../helpers/dom/createDownloadAnchor';\nimport {getFileNameByLocation} from '../../helpers/fileName';\nimport getDocumentDownloadOptions from './utils/docs/getDocumentDownloadOptions';\nimport getPhotoDownloadOptions from './utils/photos/getPhotoDownloadOptions';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\n\nexport type ResponseMethodBlob = 'blob';\nexport type ResponseMethodJson = 'json';\nexport type ResponseMethod = ResponseMethodBlob | ResponseMethodJson;\n\n/* export type DownloadBlob = {promise: Promise, controller: AbortController};\nexport type DownloadJson = {promise: Promise, controller: AbortController}; */\nexport type DownloadBlob = CancellablePromise;\nexport type DownloadUrl = CancellablePromise;\nexport type DownloadJson = CancellablePromise;\n// export type Download = DownloadBlob/* | DownloadJson */;\nexport type Download = DownloadBlob | DownloadUrl/* | DownloadJson */;\n\nexport type Progress = {done: number, fileName: string, total: number, offset: number};\nexport type ProgressCallback = (details: Progress) => void;\n\ntype DownloadType = 'url' | 'blob' | 'void' | 'disc';\n\nexport class AppDownloadManager {\n private downloads: {[fileName: string]: {main: Download} & {[type in DownloadType]?: Download}} = {};\n // private downloadsToDisc: {[fileName: string]: Download} = {};\n private progress: {[fileName: string]: Progress} = {};\n // private progressCallbacks: {[fileName: string]: Array} = {};\n private managers: AppManagers;\n\n public construct(managers: AppManagers) {\n this.managers = managers;\n rootScope.addEventListener('download_progress', (details) => {\n // const callbacks = this.progressCallbacks[details.fileName];\n // if(callbacks) {\n // callbacks.forEach((callback) => callback(details));\n // }\n\n const download = this.downloads[details.fileName];\n if(download?.main?.notifyAll) {\n this.progress[details.fileName] = details;\n download.main.notifyAll(details);\n }\n });\n }\n\n private getNewDeferred(fileName: string, type?: DownloadType) {\n const deferred = deferredPromise();\n\n let download = this.downloads[fileName];\n if(!download) {\n download = this.downloads[fileName] = {\n main: deferred as any\n };\n\n deferred.cancel = () => {\n const error = makeError('DOWNLOAD_CANCELED');\n\n this.managers.apiFileManager.cancelDownload(fileName);\n\n deferred.reject(error);\n deferred.cancel = noop;\n };\n\n deferred.catch(() => {\n this.clearDownload(fileName, type);\n }).finally(() => {\n delete this.progress[fileName];\n // delete this.progressCallbacks[fileName];\n });\n } else {\n const main = download.main;\n (['cancel', 'addNotifyListener', 'notify', 'notifyAll'] as (keyof CancellablePromise)[]).forEach((key) => {\n if(!main[key]) {\n return;\n }\n\n // @ts-ignore\n deferred[key] = main[key].bind(main);\n });\n }\n\n const haveToClear = type === 'disc';\n if(haveToClear) {\n deferred.catch(noop).finally(() => {\n this.clearDownload(fileName, type);\n });\n }\n\n return download[type] = deferred as any;\n }\n\n public getNewDeferredForUpload>(fileName: string, promise: T) {\n const deferred = this.getNewDeferred(fileName);\n promise.then(deferred.resolve, deferred.reject);\n\n deferred.finally(() => {\n this.clearDownload(fileName);\n });\n\n return deferred as CancellablePromise>;\n }\n\n private clearDownload(fileName: string, type?: DownloadType) {\n const downloads = this.downloads[fileName];\n if(!downloads) {\n return;\n }\n\n delete downloads[type];\n\n const length = Object.keys(downloads).length;\n if(!length || (downloads.main && length === 1)) {\n delete this.downloads[fileName];\n }\n }\n\n public getUpload(fileName: string): ReturnType['promise'] {\n let deferred: CancellablePromise = this.getDownload(fileName);\n if(deferred) {\n return deferred;\n }\n\n deferred = this.getNewDeferred(fileName);\n this.managers.appMessagesManager.getUploadPromise(fileName).then(deferred.resolve, deferred.reject);\n return deferred;\n }\n\n /* public fakeDownload(fileName: string, value: Blob | string) {\n const deferred = this.getNewDeferred(fileName);\n if(typeof(value) === 'string') {\n fetch(value)\n .then((response) => response.blob())\n .then((blob) => deferred.resolve(blob));\n } else {\n deferred.resolve(value);\n }\n\n return deferred;\n } */\n\n private d(fileName: string, getPromise: () => Promise, type?: DownloadType) {\n let deferred = this.getDownload(fileName, type);\n if(deferred) return deferred;\n\n deferred = this.getNewDeferred(fileName, type);\n getPromise().then(deferred.resolve, deferred.reject);\n return deferred;\n }\n\n public download(options: DownloadOptions): DownloadBlob {\n const fileName = getDownloadFileNameFromOptions(options);\n return this.d(fileName, () => this.managers.apiFileManager.download(options), 'blob') as any;\n }\n\n public downloadMedia(options: DownloadMediaOptions, type: DownloadType = 'blob', promiseBefore?: Promise): DownloadBlob {\n const {downloadOptions, fileName} = getDownloadMediaDetails(options);\n\n return this.d(fileName, () => {\n let cb: any;\n if(type === 'url') {\n cb = this.managers.apiFileManager.downloadMediaURL;\n } else if(type === 'void'/* || type === 'disc' */) {\n cb = this.managers.apiFileManager.downloadMediaVoid;\n } else /* if(type === 'blob') */ {\n cb = this.managers.apiFileManager.downloadMedia;\n }\n\n if(promiseBefore) {\n return promiseBefore.then(() => cb(options));\n }\n\n return cb(options);\n }, type) as any;\n }\n\n public downloadMediaURL(options: DownloadMediaOptions): DownloadUrl {\n return this.downloadMedia(options, 'url') as any;\n }\n\n public downloadMediaVoid(options: DownloadMediaOptions): DownloadBlob {\n return this.downloadMedia(options, 'void');\n }\n\n public upload(file: File | Blob, fileName?: string, promise?: Promise) {\n if(!fileName) {\n fileName = getFileNameForUpload(file);\n }\n\n if(!promise) {\n promise = this.managers.apiFileManager.upload({file, fileName});\n }\n\n const deferred = this.getNewDeferredForUpload(fileName, promise);\n return deferred as any as CancellablePromise;\n }\n\n public getDownload(fileName: string, type?: DownloadType) {\n const d = this.downloads[fileName];\n return d && d[type];\n }\n\n // public addProgressCallback(fileName: string, callback: ProgressCallback) {\n // const progress = this.progress[fileName];\n // (this.progressCallbacks[fileName] ?? (this.progressCallbacks[fileName] = [])).push(callback);\n\n // if(progress) {\n // callback(progress);\n // }\n // }\n\n public downloadToDisc(options: DownloadMediaOptions, justAttach?: boolean) {\n const media = options.media;\n const isDocument = media._ === 'document';\n if(!isDocument && !options.thumb) {\n options.thumb = (media as Photo.photo).sizes.slice().pop() as PhotoSize.photoSize;\n }\n\n // const {fileName: cacheFileName} = getDownloadMediaDetails(options);\n // if(justAttach) {\n // const promise = this.downloadsToDisc[cacheFileName];\n // if(promise) {\n // return promise;\n // }\n // }\n\n // const {downloadOptions, fileName} = getDownloadMediaDetails(options);\n // if(downloadOptions.size && downloadOptions.size > MAX_FILE_SAVE_SIZE) {\n const id = '' + (Math.random() * 0x7FFFFFFF | 0);\n // const id = 'test';\n const url = `download/${id}`;\n options.downloadId = id;\n\n const pingPromise = apiManagerProxy.pingServiceWorkerWithIframe();\n\n const promise = this.downloadMedia(options, 'disc', pingPromise);\n // this.downloadsToDisc[cacheFileName] = promise;\n\n if(justAttach) {\n return promise;\n }\n\n const iframe = document.createElement('iframe');\n iframe.hidden = true;\n\n pingPromise.then(() => {\n iframe.src = url;\n document.body.append(iframe);\n });\n\n // createDownloadAnchor(url, 'asd.txt');\n\n // const events = [\n // 'emptied',\n // 'abort',\n // 'suspend',\n // 'reset',\n // 'error',\n // 'ended',\n // 'load'\n // ].forEach((event) => {\n // iframe.addEventListener(event, () => alert(event));\n // iframe.contentWindow.addEventListener(event, () => alert(event));\n // });\n\n let element: HTMLElement, hadProgress = false;\n const onProgress = () => {\n if(hadProgress) {\n return;\n }\n\n hadProgress = true;\n element = iframe;\n\n indexOfAndSplice(promise.listeners, onProgress);\n };\n\n promise.addNotifyListener(onProgress);\n promise.then((blob) => {\n if(!blob) {\n return;\n }\n\n const url = URL.createObjectURL(blob);\n const downloadOptions = isDocument ?\n getDocumentDownloadOptions(media) :\n getPhotoDownloadOptions(media as any, options.thumb as PhotoSize.photoSize);\n const fileName = (options.media as MyDocument).file_name || getFileNameByLocation(downloadOptions.location);\n createDownloadAnchor(url, downloadOptions.fileName || fileName, () => {\n URL.revokeObjectURL(url);\n });\n }).catch(noop).finally(() => {\n if(!hadProgress) {\n onProgress();\n }\n\n setTimeout(() => {\n element?.remove();\n }, 1000);\n\n // if(this.downloadsToDisc[cacheFileName] === promise) {\n // delete this.downloadsToDisc[cacheFileName];\n // }\n });\n\n return promise;\n }\n}\n\nconst appDownloadManager = new AppDownloadManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appDownloadManager = appDownloadManager);\nexport default appDownloadManager;\n","/*\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 createDownloadAnchor(url: string, fileName: string, onRemove?: () => void) {\n const a = document.createElement('a');\n a.href = url;\n a.download = fileName;\n a.target = '_blank';\n\n a.style.position = 'absolute';\n a.style.top = '1px';\n a.style.left = '1px';\n\n document.body.append(a);\n\n try {\n const clickEvent = document.createEvent('MouseEvents');\n clickEvent.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\n a.dispatchEvent(clickEvent);\n } catch(e) {\n console.error('Download click error', e);\n try {\n a.click();\n } catch(e) {\n window.open(url as string, '_blank');\n }\n }\n\n setTimeout(() => {\n a.remove();\n onRemove && onRemove();\n }, 100);\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 partition(arr: T[], callback: (item: T, idx: number, arr: T[]) => boolean) {\n const good: T[] = [], bad: T[] = [];\n for(let i = 0, length = arr.length; i < length; ++i) {\n const item = arr[i];\n (callback(item, i, arr) ? good : bad).push(item);\n }\n\n return [good, bad];\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// import { generatePathData } from \"../../helpers/dom\";\nimport {MyMessage} from '../../lib/appManagers/appMessagesManager';\nimport type Chat from './chat';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport insertInDescendSortedArray from '../../helpers/array/insertInDescendSortedArray';\nimport positionElementByIndex from '../../helpers/dom/positionElementByIndex';\nimport AvatarElement from '../avatar';\nimport {Message} from '../../layer';\nimport {NULL_PEER_ID, REPLIES_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport {SERVICE_AS_REGULAR, STICKY_OFFSET} from './bubbles';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport partition from '../../helpers/array/partition';\nimport noop from '../../helpers/noop';\nimport getMessageThreadId from '../../lib/appManagers/utils/messages/getMessageThreadId';\n\ntype GroupItem = {\n bubble: HTMLElement,\n fromId: PeerId,\n mid: number,\n groupMid?: number,\n timestamp: number,\n dateTimestamp: number,\n mounted: boolean,\n single: boolean,\n group?: BubbleGroup,\n message: Message.message | Message.messageService // use it only to set avatar\n};\n\nclass BubbleGroup {\n container: HTMLElement;\n chat: Chat;\n groups: BubbleGroups;\n items: GroupItem[]; // descend sorted\n avatarContainer: HTMLElement;\n avatarLoadPromise: ReturnType;\n avatar: AvatarElement;\n mounted: boolean;\n dateTimestamp: number;\n offset: number;\n\n constructor(chat: Chat, groups: BubbleGroups, dateTimestamp: number) {\n this.container = document.createElement('div');\n this.container.classList.add('bubbles-group');\n this.chat = chat;\n this.groups = groups;\n this.items = [];\n this.dateTimestamp = dateTimestamp;\n this.offset = 0;\n }\n\n createAvatar(message: Message.message | Message.messageService) {\n if(this.avatarLoadPromise) {\n return this.avatarLoadPromise;\n } else if(message._ === 'messageService') {\n return;\n }\n\n this.avatarContainer = document.createElement('div');\n this.avatarContainer.classList.add('bubbles-group-avatar-container');\n ++this.offset;\n\n const fwdFrom = message.fwd_from;\n const fwdFromId = message.fwdFromId;\n const isForwardFromChannel = message.from_id && message.from_id._ === 'peerChannel' && message.fromId === fwdFromId;\n const currentPeerId = this.chat.peerId;\n const avatar = this.avatar = new AvatarElement();\n this.avatar.classList.add('bubbles-group-avatar', 'user-avatar', 'avatar-40'/* , 'can-zoom-fade' */);\n const peerId = ((fwdFrom && (currentPeerId === rootScope.myId || currentPeerId === REPLIES_PEER_ID)) || isForwardFromChannel ? fwdFromId : message.fromId) || NULL_PEER_ID;\n const avatarLoadPromise = this.avatar.updateWithOptions({\n lazyLoadQueue: this.chat.bubbles.lazyLoadQueue,\n peerId,\n peerTitle: !fwdFromId && fwdFrom && fwdFrom.from_name ? /* '๐Ÿ”ฅ FF ๐Ÿ”ฅ' */fwdFrom.from_name : undefined\n });\n\n // this.avatarLoadPromise = Promise.all([\n // avatarLoadPromise,\n // peerId && peerId.isUser() ? this.chat.managers.appUsersManager.getUser(peerId.toUserId()) : undefined\n // ]).then(([result, user]) => {\n // if(user?.pFlags?.premium) {\n // avatar.classList.add('is-premium', 'tgico-star');\n // }\n\n // return result;\n // });\n this.avatarLoadPromise = avatarLoadPromise;\n\n this.avatarContainer.append(this.avatar);\n this.container.append(this.avatarContainer);\n\n return this.avatarLoadPromise;\n }\n\n get firstTimestamp() {\n return this.firstItem.timestamp;\n }\n\n get firstMid() {\n return this.firstItem.mid;\n }\n\n get firstItem() {\n return this.items[this.items.length - 1];\n }\n\n get lastTimestamp() {\n return this.lastItem.timestamp;\n }\n\n get lastMid() {\n return this.lastItem.mid;\n }\n\n get lastItem() {\n return this.items[0];\n }\n\n updateClassNames() {\n const items = this.items;\n const length = items.length;\n if(!length) {\n return;\n }\n\n // const elements = Array.from(this.container.children);\n // if(this.offset) elements.splice(0, this.offset);\n\n // const length = elements.length;\n // if(!length) {\n // return;\n // }\n\n const first = items[length - 1].bubble;\n\n if(items.length === 1) {\n first.classList.add('is-group-first', 'is-group-last');\n // this.setClipIfNeeded(first);\n return;\n } else {\n first.classList.remove('is-group-last');\n first.classList.add('is-group-first');\n // this.setClipIfNeeded(first, true);\n }\n\n for(let i = 1, _length = length - 1; i < _length; ++i) {\n const bubble = items[i].bubble;\n bubble.classList.remove('is-group-last', 'is-group-first');\n // this.setClipIfNeeded(bubble, true);\n }\n\n const last = items[0].bubble;\n last.classList.remove('is-group-first');\n last.classList.add('is-group-last');\n // this.setClipIfNeeded(last);\n }\n\n insertItem(item: GroupItem) {\n const {items} = this;\n insertInDescendSortedArray(items, item, this.groups.sortGroupItemsKey);\n\n item.group = this;\n if(items.length === 1) {\n this.groups.insertGroup(this);\n }\n }\n\n removeItem(item: GroupItem) {\n indexOfAndSplice(this.items, item);\n\n if(!this.items.length) {\n indexOfAndSplice(this.groups.groups, this);\n }\n\n item.group = undefined;\n }\n\n mount(updateClassNames?: boolean) {\n if(!this.groups.groups.includes(this) || !this.items.length) { // group can be already removed\n debugger;\n\n if(this.mounted) {\n this.onItemUnmount();\n }\n\n return;\n }\n\n const {offset, items} = this;\n const {length} = items;\n forEachReverse(items, (item, idx) => {\n this.mountItem(item, length - 1 - idx, offset);\n });\n\n if(updateClassNames) {\n this.updateClassNames();\n }\n\n this.onItemMount();\n }\n\n mountItem(item: GroupItem, idx = this.items.indexOf(item), offset = this.offset) {\n if(item.mounted) {\n return;\n }\n\n positionElementByIndex(item.bubble, this.container, offset + idx);\n item.mounted = true;\n }\n\n unmountItem(item: GroupItem) {\n if(!item.mounted) {\n return;\n }\n\n item.bubble.remove();\n item.mounted = false;\n this.onItemUnmount();\n }\n\n onItemMount() {\n if(this.mounted) {\n return;\n }\n\n const dateContainer = this.chat.bubbles.getDateContainerByTimestamp(this.dateTimestamp / 1000);\n // const idx = this.groups.indexOf(group);\n const dateGroups = this.groups.groups.filter((_group) => _group.dateTimestamp === this.dateTimestamp);\n const dateGroupsLength = dateGroups.length;\n const idx = dateGroups.indexOf(this);\n const unmountedLength = dateGroups.slice(idx + 1).reduce((acc, v) => acc + (v.mounted ? 0 : 1), 0);\n positionElementByIndex(this.container, dateContainer.container, STICKY_OFFSET + dateGroupsLength - 1 - idx - unmountedLength);\n this.mounted = true;\n }\n\n onItemUnmount() {\n if(!this.mounted) {\n return;\n }\n\n if(!this.items.length) {\n this.container.remove();\n this.chat.bubbles.deleteEmptyDateGroups();\n this.mounted = false;\n } else {\n this.updateClassNames();\n }\n }\n}\n\n// class BubbleGroupItem implements GroupItem {\n// bubble: HTMLElement;\n// fromId: PeerId;\n// mid: number;\n// timestamp: number;\n// dateTimestamp: number;\n// mounted: boolean;\n// single: boolean;\n// group: BubbleGroup;\n\n// constructor(details: GroupItem) {\n// Object.assign(this, details);\n// }\n// }\n\nexport default class BubbleGroups {\n public itemsArr: Array = []; // descend sorted\n private itemsMap: Map = new Map();\n public groups: Array = []; // descend sorted\n private newGroupDiff = 121; // * 121 in scheduled messages\n private sortItemsKey: Extract;\n private sortGroupsKey: Extract;\n public sortGroupItemsKey: Extract;\n\n constructor(private chat: Chat) {\n this.sortItemsKey = chat.type === 'scheduled' ? 'timestamp' : 'mid';\n this.sortGroupsKey = chat.type === 'scheduled' ? 'lastTimestamp' : 'lastMid';\n this.sortGroupItemsKey = /* chat.type === 'scheduled' ? 'timestamp' : */'groupMid';\n }\n\n removeItem(item: GroupItem) {\n item.group?.removeItem(item);\n this.removeItemFromCache(item);\n }\n\n removeAndUnmountBubble(bubble: HTMLElement) {\n const item = this.getItemByBubble(bubble);\n if(!item) {\n if(bubble.parentElement) {\n bubble.remove(); // * can be a placeholder\n }\n\n return false;\n }\n\n const items = this.itemsArr;\n const index = items.indexOf(item);\n const siblings = this.getSiblingsAtIndex(index, items);\n\n const group = item.group;\n this.removeItem(item);\n\n const modifiedGroups: Set = new Set();\n if(group) {\n group.unmountItem(item);\n modifiedGroups.add(group);\n }\n\n const [previousSibling, nextSibling] = siblings;\n if(\n previousSibling &&\n nextSibling &&\n this.canItemsBeGrouped(previousSibling, nextSibling) &&\n previousSibling.group !== nextSibling.group\n ) {\n const group = nextSibling.group;\n this.f(nextSibling.group.items);\n group.onItemUnmount();\n modifiedGroups.add(previousSibling.group);\n this.groupUngrouped();\n }\n\n this.mountUnmountGroups(Array.from(modifiedGroups));\n\n return true;\n }\n\n mountUnmountGroups(groups: BubbleGroup[]) {\n // groups.sort((a, b) => (b.lastItem?.mid ?? 0) - (a.lastItem?.mid ?? 0));\n\n const [toMount, toUnmount] = partition(groups, (group) => !!group.items.length);\n toUnmount.forEach((group) => {\n group.onItemUnmount();\n })\n\n toMount.forEach((group) => {\n group.mount(true);\n });\n\n // toMount.forEach((group) => {\n // group.updateClassNames();\n // });\n }\n\n f(items: GroupItem[], index: number = 0, length = items.length) {\n for(; index < length; ++index) {\n const item = items[index];\n item.mounted = false;\n item.group.removeItem(item);\n --length;\n --index;\n }\n }\n\n getItemByBubble(bubble: HTMLElement) {\n return this.itemsMap.get(bubble);\n }\n\n getLastGroup() {\n return this.groups[0];\n }\n\n changeBubbleMid(bubble: HTMLElement, mid: number) {\n const item = this.getItemByBubble(bubble);\n if(!item) {\n return;\n }\n\n item.mid = mid;\n\n // indexOfAndSplice(item.group.items, item);\n // // const canChangeGroupMid = !item.group.items.length || item.group.items.every((item) => item.groupMid === item.mid);\n // // if(canChangeGroupMid) item.groupMid = mid;\n // item.group.insertItem(item);\n\n indexOfAndSplice(this.itemsArr, item);\n this.insertItemToArray(item, this.itemsArr);\n }\n\n changeItemBubble(item: GroupItem, bubble: HTMLElement) {\n this.itemsMap.delete(item.bubble);\n item.bubble = bubble;\n this.itemsMap.set(bubble, item);\n }\n\n changeBubbleByBubble(from: HTMLElement, to: HTMLElement) {\n const item = this.getItemByBubble(from);\n if(!item) {\n return;\n }\n\n this.changeItemBubble(item, to);\n }\n\n canItemsBeGrouped(item1: GroupItem, item2: GroupItem) {\n return item2.fromId === item1.fromId &&\n Math.abs(item2.timestamp - item1.timestamp) <= this.newGroupDiff &&\n item1.dateTimestamp === item2.dateTimestamp &&\n !item1.single &&\n !item2.single &&\n item1.message.pFlags.out === item2.message.pFlags.out &&\n (!this.chat.isAllMessagesForum || getMessageThreadId(item1.message, true) === getMessageThreadId(item2.message, true)) &&\n (!item1.message.pFlags.out || item1.message.fromId === rootScope.myId);\n }\n\n getSiblingsAtIndex(itemIndex: number, items: GroupItem[]) {\n return [items[itemIndex - 1], items[itemIndex + 1]] as const;\n }\n\n // findGroupSiblingInSiblings(item: GroupItem, siblings: ReturnType) {\n // return siblings.find((sibling) => sibling && this.canItemsBeGrouped(item, sibling));\n // }\n\n findGroupSiblingByItem(item: GroupItem, items: GroupItem[]) {\n items = items.slice();\n const idx = this.insertItemToArray(item, items);\n // return this.findGroupSiblingInSiblings(item, this.getSiblingsAtIndex(idx, items));\n return this.findGroupSiblingInItems(item, items, idx);\n }\n\n findGroupSiblingInItems(item: GroupItem, items: GroupItem[], index = items.indexOf(item), length = items.length) {\n const previousItem = items[index - 1];\n let siblingGroupedItem: GroupItem;\n if(previousItem?.group && this.canItemsBeGrouped(item, previousItem)) {\n siblingGroupedItem = previousItem;\n } else {\n for(let k = index + 1; k < length; ++k) {\n const nextItem = items[k];\n if(this.canItemsBeGrouped(item, nextItem)) {\n if(nextItem.group) {\n siblingGroupedItem = nextItem;\n }\n } else {\n break;\n }\n }\n }\n\n return siblingGroupedItem;\n }\n\n addItemToGroup(item: GroupItem, group: BubbleGroup) {\n group.insertItem(item);\n this.addItemToCache(item);\n }\n\n insertItemToArray(item: GroupItem, array: GroupItem[]) {\n return insertInDescendSortedArray(array, item, this.sortItemsKey);\n }\n\n insertGroup(group: BubbleGroup) {\n return insertInDescendSortedArray(this.groups, group, this.sortGroupsKey);\n }\n\n addItemToCache(item: GroupItem) {\n this.insertItemToArray(item, this.itemsArr);\n this.itemsMap.set(item.bubble, item);\n }\n\n removeItemFromCache(item: GroupItem) {\n indexOfAndSplice(this.itemsArr, item);\n this.itemsMap.delete(item.bubble);\n }\n\n getMessageFromId(message: MyMessage) {\n let fromId = /* (this.chat.peerId.isAnyChat() && message.viaBotId) || */message.fromId;\n\n // fix for saved messages forward to self\n if(fromId === rootScope.myId && message.peerId === rootScope.myId && (message as Message.message).fwdFromId === fromId) {\n fromId = fromId.toPeerId(true);\n }\n\n return fromId;\n }\n\n createItem(bubble: HTMLElement, message: MyMessage) {\n const single = !(message._ === 'message' || (message.action && SERVICE_AS_REGULAR.has(message.action._)));\n const {mid, date: timestamp} = message;\n const {dateTimestamp} = this.chat.bubbles.getDateForDateContainer(timestamp);\n const item: GroupItem = {\n mid,\n groupMid: this.chat.type === 'scheduled' ? +`${(timestamp * 1000 - dateTimestamp) / 1000}.${mid}` : mid,\n fromId: this.getMessageFromId(message),\n bubble,\n // timestamp: this.chat.type === 'scheduled' ? +`${(timestamp * 1000 - dateTimestamp) / 1000}.${mid}` : timestamp,\n timestamp,\n dateTimestamp,\n mounted: false,\n single,\n message\n };\n\n return item;\n }\n\n splitSiblingsOnGrouping(siblings: ReturnType) {\n const [previousSibling, nextSibling] = siblings;\n const previousGroup = previousSibling?.group;\n const nextGroup = nextSibling?.group;\n\n if(!previousGroup) {\n return;\n }\n\n // will refresh group\n // if(previousGroup === nextGroup) {\n const items = previousGroup.items;\n const index = items.indexOf(previousSibling) + 1;\n const length = items.length;\n if(index === length) {\n return;\n }\n\n const modifiedGroups: BubbleGroup[] = [previousGroup];\n // if(previousGroup !== nextGroup && nextGroup) {\n // modifiedGroups.push(nextGroup);\n // }\n\n this.f(items, index, length);\n return modifiedGroups;\n // }\n }\n\n prepareForGrouping(bubble: HTMLElement, message: MyMessage) {\n const foundItem = this.getItemByBubble(bubble);\n if(foundItem) { // should happen only on edit\n // debugger;\n return;\n }\n\n const item = this.createItem(bubble, message);\n this.addItemToCache(item);\n }\n\n groupUngrouped() {\n const items = this.itemsArr;\n const length = items.length;\n const modifiedGroups: Set = new Set();\n // for(let i = length - 1; i >= 0; --i) {\n for(let i = 0; i < length; ++i) {\n const item = items[i];\n if(item.group) {\n continue;\n }\n\n let hadGroup = true;\n const siblings = this.getSiblingsAtIndex(i, items);\n const siblingGroupedItem = this.findGroupSiblingInItems(item, items, i, length);\n\n // const foundItem = this.findGroupSiblingInSiblings(item, siblings);\n const foundItem = siblingGroupedItem;\n const group = foundItem?.group ?? (hadGroup = false, new BubbleGroup(this.chat, this, item.dateTimestamp));\n\n modifiedGroups.add(group);\n group.insertItem(item);\n\n if(!hadGroup) {\n const splittedGroups = this.splitSiblingsOnGrouping(siblings);\n if(splittedGroups) {\n splittedGroups.forEach((group) => modifiedGroups.add(group));\n }\n }\n }\n\n return modifiedGroups;\n }\n\n // addBubble(bubble: HTMLElement, message: MyMessage, unmountIfFound?: boolean) {\n // const oldItem = this.getItemByBubble(bubble);\n // if(unmountIfFound) { // updating position\n // this.removeAndUnmountBubble(bubble);\n // } else if(oldItem) { // editing\n // const group = oldItem.group;\n // this.changeItemBubble(oldItem, bubble);\n // oldItem.mounted = false;\n\n // return {item: oldItem, group};\n // }\n\n // const item = this.createItem(bubble, message);\n\n // const foundItem = this.findSameGroupItem(item, this.itemsArr);\n\n // const group = foundItem?.group ?? new BubbleGroup(this.chat, this, item.dateTimestamp);\n // this.addItemToGroup(item, group);\n\n // return {item, group};\n // }\n\n /* setClipIfNeeded(bubble: HTMLDivElement, remove = false) {\n //console.log('setClipIfNeeded', bubble, remove);\n const className = bubble.className;\n if(className.includes('is-message-empty') && (className.includes('photo') || className.includes('video'))) {\n let container = bubble.querySelector('.bubble__media-container') as SVGSVGElement;\n //console.log('setClipIfNeeded', bubble, remove, container);\n if(!container) return;\n\n try {\n Array.from(container.children).forEach((object) => {\n if(object instanceof SVGDefsElement) return;\n\n if(remove) {\n object.removeAttributeNS(null, 'clip-path');\n } else {\n let clipId = container.dataset.clipId;\n let path = container.firstElementChild.firstElementChild.lastElementChild as SVGPathElement;\n let width = +object.getAttributeNS(null, 'width');\n let height = +object.getAttributeNS(null, 'height');\n let isOut = className.includes('is-out');\n let isReply = className.includes('is-reply');\n let d = '';\n\n //console.log('setClipIfNeeded', object, width, height, isOut);\n\n let tr: number, tl: number;\n if(className.includes('forwarded') || isReply) {\n tr = tl = 0;\n } else if(isOut) {\n tr = className.includes('is-group-first') ? 12 : 6;\n tl = 12;\n } else {\n tr = 12;\n tl = className.includes('is-group-first') ? 12 : 6;\n }\n\n if(isOut) {\n d = generatePathData(0, 0, width - 9, height, tl, tr, 0, 12);\n } else {\n d = generatePathData(9, 0, width - 9, height, tl, tr, 12, 0);\n }\n\n path.setAttributeNS(null, 'd', d);\n object.setAttributeNS(null, 'clip-path', 'url(#' + clipId + ')');\n }\n });\n } catch(err) {}\n }\n } */\n\n // updateGroupByMessageId(mid: number) {\n // const item = this.itemsArr.find((g) => g.mid === mid);\n // if(item) {\n // item.group.updateGroup();\n // }\n // }\n\n cleanup() {\n this.itemsArr = [];\n this.groups = [];\n this.itemsMap.clear();\n }\n\n // findIncorrentPositions() {\n // var bubbles = Array.from(this.chat.bubbles.chatInner.querySelectorAll('.bubbles-group .bubble')).reverse();\n // var items = this.itemsArr;\n // for(var i = 0, length = items.length; i < length; ++i) {\n // const item = items[i];\n // const foundBubble = bubbles[i];\n // if(item.bubble !== foundBubble) {\n // console.log('incorrect position', i, item, foundBubble);\n // // debugger;\n // // break;\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 PopupElement, {PopupOptions} from '.';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport I18n, {FormatterArguments, i18n, LangPackKey} from '../../lib/langPack';\nimport InputField from '../inputField';\n\nexport default class PopupDatePicker extends PopupElement {\n protected controlsDiv: HTMLElement;\n protected monthTitle: HTMLElement;\n protected prevBtn: HTMLElement;\n protected nextBtn: HTMLElement;\n\n protected monthsContainer: HTMLElement;\n protected month: HTMLElement;\n\n protected minMonth: Date;\n protected maxMonth: Date;\n protected minDate: Date;\n protected maxDate: Date;\n protected selectedDate: Date;\n protected selectedMonth: Date;\n protected selectedEl: HTMLElement;\n\n protected timeDiv: HTMLDivElement;\n protected hoursInputField: InputField;\n protected minutesInputField: InputField;\n\n constructor(initDate: Date, public onPick: (timestamp: number) => void, protected options: Partial<{\n noButtons: true,\n noTitle: true,\n minDate: Date,\n maxDate: Date\n withTime: true,\n showOverflowMonths: true\n }> & PopupOptions = {}) {\n super('popup-date-picker', {\n body: true,\n overlayClosable: true,\n buttons: options.noButtons ? [] : [{\n langKey: 'JumpToDate',\n callback: () => {\n if(this.onPick) {\n this.onPick(this.selectedDate.getTime() / 1000 | 0);\n }\n }\n }, {\n langKey: 'Cancel',\n isCancel: true\n }],\n title: true,\n ...options\n });\n\n this.minDate = options.minDate || new Date('2013-08-01T00:00:00');\n\n if(initDate < this.minDate) {\n initDate.setFullYear(this.minDate.getFullYear(), this.minDate.getMonth(), this.minDate.getDate());\n }\n\n // Controls\n this.controlsDiv = document.createElement('div');\n this.controlsDiv.classList.add('date-picker-controls');\n\n this.prevBtn = document.createElement('button');\n this.prevBtn.classList.add('btn-icon', 'tgico-down', 'date-picker-prev');\n attachClickEvent(this.prevBtn, this.onPrevClick, {listenerSetter: this.listenerSetter});\n\n this.nextBtn = document.createElement('button');\n this.nextBtn.classList.add('btn-icon', 'tgico-down', 'date-picker-next');\n attachClickEvent(this.nextBtn, this.onNextClick, {listenerSetter: this.listenerSetter});\n\n this.monthTitle = document.createElement('div');\n this.monthTitle.classList.add('date-picker-month-title');\n\n this.controlsDiv.append(this.prevBtn, this.monthTitle, this.nextBtn);\n\n // Month\n this.monthsContainer = document.createElement('div');\n this.monthsContainer.classList.add('date-picker-months');\n attachClickEvent(this.monthsContainer, this.onDateClick, {listenerSetter: this.listenerSetter});\n\n this.body.append(this.controlsDiv, this.monthsContainer);\n\n // Time inputs\n if(options.withTime) {\n this.timeDiv = document.createElement('div');\n this.timeDiv.classList.add('date-picker-time');\n\n const delimiter = document.createElement('div');\n delimiter.classList.add('date-picker-time-delimiter');\n delimiter.append(':');\n\n const handleTimeInput = (max: number, inputField: InputField, onInput: (length: number) => void, onOverflow?: (number: number) => void) => {\n const maxString = '' + max;\n this.listenerSetter.add(inputField.input)('input', (e) => {\n let value = inputField.value.replace(/\\D/g, '');\n if(value.length > 2) {\n value = value.slice(0, 2);\n } else {\n if((value.length === 1 && +value[0] > +maxString[0]) || (value.length === 2 && +value > max)) {\n if(value.length === 2 && onOverflow) {\n onOverflow(+value[1]);\n }\n\n value = '0' + value[0];\n }\n }\n\n inputField.setValueSilently(value);\n onInput(value.length);\n });\n };\n\n this.hoursInputField = new InputField({plainText: true});\n this.minutesInputField = new InputField({plainText: true});\n\n handleTimeInput(23, this.hoursInputField, (length) => {\n if(length === 2) {\n this.minutesInputField.input.focus();\n }\n\n this.setTimeTitle();\n }, (number) => {\n this.minutesInputField.value = (number + this.minutesInputField.value).slice(0, 2);\n });\n handleTimeInput(59, this.minutesInputField, (length) => {\n if(!length) {\n this.hoursInputField.input.focus();\n }\n\n this.setTimeTitle();\n });\n\n this.selectedDate = initDate;\n\n initDate.setMinutes(initDate.getMinutes() + 10);\n\n this.hoursInputField.setValueSilently(('0' + initDate.getHours()).slice(-2));\n this.minutesInputField.setValueSilently(('0' + initDate.getMinutes()).slice(-2));\n\n initDate.setHours(0, 0, 0, 0);\n\n this.timeDiv.append(this.hoursInputField.container, delimiter, this.minutesInputField.container);\n\n attachClickEvent(this.btnConfirm, () => {\n if(this.onPick) {\n this.selectedDate.setHours(+this.hoursInputField.value || 0, +this.minutesInputField.value || 0, 0, 0);\n this.onPick(this.selectedDate.getTime() / 1000 | 0);\n }\n\n this.hide();\n }, {listenerSetter: this.listenerSetter});\n\n this.body.append(this.timeDiv);\n\n this.prevBtn.classList.add('primary');\n this.nextBtn.classList.add('primary');\n }\n\n const popupCenterer = document.createElement('div');\n popupCenterer.classList.add('popup-centerer');\n popupCenterer.append(this.container);\n this.element.append(popupCenterer);\n\n // const passed = (initDate.getTime() - (initDate.getTimezoneOffset() * 60000)) % 86400000;\n // this.selectedDate = this.maxDate = new Date(initDate.getTime() - passed);\n initDate.setHours(0, 0, 0, 0);\n this.selectedDate = initDate;\n\n this.maxDate = options.maxDate || new Date();\n this.maxDate.setHours(0, 0, 0, 0);\n\n this.selectedMonth = new Date(this.selectedDate);\n this.selectedMonth.setDate(1);\n\n this.maxMonth = new Date(this.maxDate);\n this.maxMonth.setDate(1);\n\n this.minMonth = new Date(this.minDate);\n this.minMonth.setHours(0, 0, 0, 0);\n this.minMonth.setDate(1);\n\n if(this.selectedMonth.getTime() === this.minMonth.getTime()) {\n this.prevBtn.setAttribute('disabled', 'true');\n }\n\n if(this.selectedMonth.getTime() === this.maxMonth.getTime()) {\n this.nextBtn.setAttribute('disabled', 'true');\n }\n\n if(options.noTitle) {\n this.setTitle = () => {};\n }\n\n this.setTimeTitle();\n this.setTitle();\n this.setMonth();\n }\n\n onPrevClick = (e: MouseEvent) => {\n this.selectedMonth.setMonth(this.selectedMonth.getMonth() - 1);\n this.setMonth();\n\n if(this.selectedMonth.getTime() === this.minMonth.getTime()) {\n this.prevBtn.setAttribute('disabled', 'true');\n }\n\n this.nextBtn.removeAttribute('disabled');\n };\n\n onNextClick = (e: MouseEvent) => {\n this.selectedMonth.setMonth(this.selectedMonth.getMonth() + 1);\n this.setMonth();\n\n if(this.selectedMonth.getTime() === this.maxMonth.getTime()) {\n this.nextBtn.setAttribute('disabled', 'true');\n }\n\n this.prevBtn.removeAttribute('disabled');\n };\n\n onDateClick = (e: MouseEvent) => {\n // cancelEvent(e);\n const target = e.target as HTMLElement;\n\n if(!target.dataset.timestamp) return;\n\n if(this.selectedEl) {\n if(this.selectedEl === target) return;\n this.selectedEl.classList.remove('active');\n }\n\n this.selectedEl = target;\n\n target.classList.add('active');\n const timestamp = +target.dataset.timestamp;\n\n this.selectedDate = new Date(timestamp);\n\n this.setTitle();\n this.setTimeTitle();\n };\n\n public setTimeTitle() {\n if(this.btnConfirm && this.selectedDate) {\n let key: LangPackKey;\n const args: FormatterArguments = [];\n const date = new Date();\n date.setHours(0, 0, 0, 0);\n\n const timeOptions: Intl.DateTimeFormatOptions = {\n minute: '2-digit',\n hour: '2-digit'\n };\n\n const sendDate = new Date(this.selectedDate.getTime());\n sendDate.setHours(+this.hoursInputField.value, +this.minutesInputField.value);\n\n if(this.selectedDate.getTime() === date.getTime()) {\n key = 'Schedule.SendToday';\n }/* else if(this.selectedDate.getTime() === (date.getTime() + 86400e3)) {\n dayStr = 'Tomorrow';\n } */ else {\n key = 'Schedule.SendDate';\n\n const dateOptions: Intl.DateTimeFormatOptions = {\n month: 'short',\n day: 'numeric'\n };\n\n if(sendDate.getFullYear() !== date.getFullYear()) {\n dateOptions.year = 'numeric';\n }\n\n args.push(new I18n.IntlDateElement({\n date: sendDate,\n options: dateOptions\n }).element);\n }\n\n args.push(new I18n.IntlDateElement({\n date: sendDate,\n options: timeOptions\n }).element);\n\n this.btnConfirm.firstChild.replaceWith(i18n(key, args));\n }\n }\n\n public setTitle() {\n // const splitted = this.selectedDate.toString().split(' ', 3);\n // this.title.innerText = splitted[0] + ', ' + splitted[1] + ' ' + splitted[2];\n this.title.textContent = '';\n this.title.append(new I18n.IntlDateElement({\n date: this.selectedDate,\n options: {\n day: 'numeric',\n month: 'long',\n weekday: 'short'\n }\n }).element);\n }\n\n private renderElement(disabled: boolean, innerText: string | HTMLElement = '') {\n const el = document.createElement('button');\n el.classList.add('btn-icon', 'date-picker-month-date');\n\n if(disabled) {\n el.setAttribute('disabled', 'true');\n }\n\n if(innerText) {\n el.append(innerText);\n }\n\n return el;\n }\n\n public setMonth() {\n const firstDate = new Date(this.selectedMonth);\n\n const options: Intl.DateTimeFormatOptions = {\n year: 'numeric',\n month: this.timeDiv && mediaSizes.isMobile ? 'short' : 'long'\n };\n\n this.monthTitle.textContent = '';\n this.monthTitle.append(new I18n.IntlDateElement({date: firstDate, options}).element);\n // this.monthTitle.innerText = (this.timeDiv && mediaSizes.isMobile ? monthName.slice(0, 3) : monthName) + ' ' + this.selectedMonth.getFullYear();\n\n if(this.month) {\n this.month.remove();\n }\n\n this.month = document.createElement('div');\n this.month.classList.add('date-picker-month');\n\n const weekStartDate = new Date();\n const day = weekStartDate.getDay();\n if(day !== 1) {\n weekStartDate.setHours(-24 * (day - 1));\n }\n\n for(let i = 0; i < 7; ++i) {\n const el = this.renderElement(true, new I18n.IntlDateElement({date: weekStartDate, options: {weekday: 'narrow'}}).element);\n el.classList.remove('date-picker-month-date');\n el.classList.add('date-picker-month-day');\n this.month.append(el);\n weekStartDate.setDate(weekStartDate.getDate() + 1);\n }\n\n // 0 - sunday\n let dayIndex = firstDate.getDay() - 1;\n if(dayIndex === -1) dayIndex = 7 - 1;\n\n const clonedDate = new Date(firstDate.getTime());\n clonedDate.setDate(clonedDate.getDate() - dayIndex - 1);\n\n // Padding first week\n for(let i = 0; i < dayIndex; ++i) {\n if(this.options.showOverflowMonths) {\n clonedDate.setDate(clonedDate.getDate() + 1);\n this.month.append(this.renderElement(true, '' + clonedDate.getDate()));\n } else {\n this.month.append(this.renderElement(true));\n }\n }\n\n do {\n const date = firstDate.getDate();\n const el = this.renderElement(firstDate > this.maxDate || firstDate < this.minDate, '' + date);\n el.dataset.timestamp = '' + firstDate.getTime();\n\n if(firstDate.getTime() === this.selectedDate.getTime()) {\n this.selectedEl = el;\n el.classList.add('active');\n }\n\n this.month.append(el);\n\n firstDate.setDate(date + 1);\n } while(firstDate.getDate() !== 1);\n\n const remainder = this.month.childElementCount % 7;\n if(this.options.showOverflowMonths && remainder) {\n for(let i = remainder; i < 7; ++i) {\n this.month.append(this.renderElement(true, '' + firstDate.getDate()));\n firstDate.setDate(firstDate.getDate() + 1);\n }\n }\n\n const lines = Math.ceil(this.month.childElementCount / 7);\n this.container.dataset.lines = '' + lines;\n\n this.monthsContainer.append(this.month);\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 {setDirection} from '../helpers/dom/setInnerHTML';\n\nexport default class DivAndCaption {\n public container: HTMLElement;\n public border: HTMLElement;\n public content: HTMLElement;\n public title: HTMLElement;\n public subtitle: HTMLElement;\n\n constructor(protected className: string, public fill?: T) {\n this.container = document.createElement('div');\n this.container.className = className;\n\n this.border = document.createElement('div');\n this.border.classList.add(className + '-border');\n\n this.content = document.createElement('div');\n this.content.classList.add(className + '-content');\n\n this.title = document.createElement('div');\n this.title.classList.add(className + '-title');\n setDirection(this.title);\n\n this.subtitle = document.createElement('div');\n this.subtitle.classList.add(className + '-subtitle');\n setDirection(this.subtitle);\n\n this.content.append(this.title, this.subtitle);\n this.container.append(this.border, this.content);\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 {Middleware} from '../../helpers/middleware';\nimport limitSymbols from '../../helpers/string/limitSymbols';\nimport {Document, Message, MessageMedia, Photo, WebPage} from '../../layer';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport choosePhotoSize from '../../lib/appManagers/utils/photos/choosePhotoSize';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport DivAndCaption from '../divAndCaption';\nimport wrapMessageForReply from '../wrappers/messageForReply';\nimport wrapPhoto from '../wrappers/photo';\nimport wrapSticker from '../wrappers/sticker';\nimport wrapVideo from '../wrappers/video';\nimport {AnimationItemGroup} from '../animationIntersector';\n\nconst MEDIA_SIZE = 32;\n\nexport async function wrapReplyDivAndCaption(options: {\n title: string | HTMLElement | DocumentFragment,\n titleEl: HTMLElement,\n subtitle: string | HTMLElement | DocumentFragment,\n subtitleEl: HTMLElement,\n message: Message.message | Message.messageService,\n mediaEl: HTMLElement,\n loadPromises?: Promise[],\n animationGroup: AnimationItemGroup\n}) {\n let {title, titleEl, subtitle, subtitleEl, mediaEl, message, loadPromises, animationGroup} = options;\n if(title !== undefined) {\n if(typeof(title) === 'string') {\n title = limitSymbols(title, 140);\n title = wrapEmojiText(title);\n }\n\n replaceContent(titleEl, title);\n }\n\n if(!loadPromises) {\n loadPromises = [];\n }\n\n let messageMedia: MessageMedia | WebPage.webPage = (message as Message.message)?.media;\n let setMedia = false, isRound = false;\n const mediaChildren = mediaEl ? Array.from(mediaEl.children).slice() : [];\n let middleware: Middleware;\n if(messageMedia && mediaEl) {\n subtitleEl.textContent = '';\n subtitleEl.append(await wrapMessageForReply({message, animationGroup, withoutMediaType: true}));\n\n messageMedia = (messageMedia as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage || messageMedia;\n const photo = (messageMedia as MessageMedia.messageMediaPhoto).photo as Photo.photo;\n const document = (messageMedia as MessageMedia.messageMediaDocument).document as Document.document;\n if(photo || (document && document.thumbs?.length)/* ['video', 'sticker', 'gif', 'round', 'photo', 'audio'].indexOf(document.type) !== -1) */) {\n middleware = appImManager.chat.bubbles.getMiddleware();\n const lazyLoadQueue = appImManager.chat.bubbles.lazyLoadQueue;\n\n if(document?.type === 'sticker') {\n await wrapSticker({\n doc: document,\n div: mediaEl,\n lazyLoadQueue,\n group: animationGroup,\n // onlyThumb: document.sticker === 2,\n width: MEDIA_SIZE,\n height: MEDIA_SIZE,\n middleware,\n loadPromises\n });\n setMedia = true;\n } else if(document?.type === 'gif' && document.video_thumbs) {\n setMedia = true;\n await wrapVideo({\n doc: document,\n container: mediaEl,\n boxWidth: MEDIA_SIZE,\n boxHeight: MEDIA_SIZE,\n lazyLoadQueue,\n noPlayButton: true,\n noInfo: true,\n middleware,\n loadPromises,\n withoutPreloader: true,\n videoSize: document.video_thumbs[0],\n group: animationGroup\n });\n } else {\n const m = photo || document;\n isRound = document?.type === 'round';\n\n try {\n await wrapPhoto({\n photo: m,\n container: mediaEl,\n boxWidth: MEDIA_SIZE,\n boxHeight: MEDIA_SIZE,\n size: choosePhotoSize(m, MEDIA_SIZE, MEDIA_SIZE),\n middleware,\n lazyLoadQueue,\n noBlur: true,\n withoutPreloader: true,\n loadPromises\n });\n setMedia = true;\n } catch(err) {\n\n }\n }\n }\n } else {\n if(message) {\n subtitleEl.textContent = '';\n subtitleEl.append(await wrapMessageForReply({message}));\n } else {\n if(typeof(subtitle) === 'string') {\n subtitle = limitSymbols(subtitle, 140);\n subtitle = wrapEmojiText(subtitle);\n }\n\n replaceContent(subtitleEl, subtitle || '');\n }\n }\n\n Promise.all(loadPromises).then(() => {\n if(middleware && !middleware()) return;\n mediaChildren.forEach((child) => child.remove());\n\n if(mediaEl) {\n mediaEl.classList.toggle('is-round', isRound);\n }\n });\n\n return setMedia;\n}\n\nexport default class ReplyContainer extends DivAndCaption<(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message?: any) => Promise> {\n private mediaEl: HTMLElement;\n\n constructor(protected className: string, protected animationGroup: AnimationItemGroup) {\n super(className, async(title, subtitle = '', message?) => {\n if(!this.mediaEl) {\n this.mediaEl = document.createElement('div');\n this.mediaEl.classList.add(this.className + '-media');\n }\n\n const isMediaSet = await wrapReplyDivAndCaption({\n title,\n titleEl: this.title,\n subtitle,\n subtitleEl: this.subtitle,\n mediaEl: this.mediaEl,\n message,\n animationGroup\n });\n\n this.container.classList.toggle('is-media', isMediaSet);\n if(isMediaSet) {\n this.content.prepend(this.mediaEl);\n } else {\n this.mediaEl.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 {hexToRgb} from '../../helpers/color';\nimport {Message} from '../../layer';\nimport getPeerColorById from '../../lib/appManagers/utils/peers/getPeerColorById';\nimport {AnimationItemGroup} from '../animationIntersector';\nimport ReplyContainer from '../chat/replyContainer';\n\nexport default function wrapReply(\n title: Parameters[0],\n subtitle: Parameters[1],\n animationGroup: AnimationItemGroup,\n message?: Message.message | Message.messageService,\n setColorPeerId?: PeerId\n) {\n const replyContainer = new ReplyContainer('reply', animationGroup);\n const fillPromise = replyContainer.fill(title, subtitle, message);\n\n if(setColorPeerId) {\n const hex = getPeerColorById(setColorPeerId, false);\n const [r, g, b] = hexToRgb(hex);\n replyContainer.container.style.setProperty('--override-color', `${r}, ${g}, ${b}`);\n replyContainer.container.classList.add('is-overriding-color');\n // replyContainer.border.style.backgroundColor = hex;\n // replyContainer.title.style.color = hex;\n }\n\n return {container: replyContainer.container, fillPromise};\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 AvatarElement from './avatar';\nimport type LazyLoadQueue from './lazyLoadQueue';\n\nconst CLASS_NAME = 'stacked-avatars';\nconst AVATAR_CLASS_NAME = CLASS_NAME + '-avatar';\nconst AVATAR_CONTAINER_CLASS_NAME = AVATAR_CLASS_NAME + '-container';\n\nexport default class StackedAvatars {\n public container: HTMLElement;\n private lazyLoadQueue: LazyLoadQueue;\n private avatarSize: number;\n\n constructor(options: {\n lazyLoadQueue?: StackedAvatars['lazyLoadQueue'],\n avatarSize: StackedAvatars['avatarSize']\n }) {\n this.lazyLoadQueue = options.lazyLoadQueue;\n this.avatarSize = options.avatarSize;\n\n this.container = document.createElement('div');\n this.container.classList.add(CLASS_NAME);\n\n this.container.style.setProperty('--avatar-size', options.avatarSize + 'px');\n }\n /**\n * MACOS, ANDROID - ะฑะตะท ั€ะตะฒะตั€ัะฐ\n * WINDOWS DESKTOP - ั€ะตะฒะตั€ั\n * ะฒัะต ะฟั€ะธะปะพะถะตะฝะธั ะฝะฐะบะปะฐะดั‹ะฒะฐัŽั‚ ะฐะฒะฐั‚ะฐั€ะบัƒ ะฟะตั€ะฒัƒัŽ ะฝะฐ ะฒั‚ะพั€ัƒัŽ, ะฐ ะฒ ะผะฐะบะตั‚ะต ะทะฐั‚ะพ ะฒั‚ะพั€ะฐั ะฝะฐ ะฟะตั€ะฒัƒัŽ, ะ›ะžะ›!\n */\n public render(peerIds: PeerId[], loadPromises?: Promise[]) {\n const children = this.container.children;\n peerIds = peerIds.slice().reverse();\n if(peerIds.length > 3) {\n peerIds = peerIds.slice(-3);\n }\n\n peerIds.forEach((peerId, idx) => {\n let avatarContainer = children[idx] as HTMLElement;\n if(!avatarContainer) {\n avatarContainer = document.createElement('div');\n avatarContainer.classList.add(AVATAR_CONTAINER_CLASS_NAME);\n }\n\n let avatarElem = avatarContainer.firstElementChild as AvatarElement;\n if(!avatarElem) {\n avatarElem = new AvatarElement();\n avatarElem.classList.add('avatar-' + this.avatarSize, AVATAR_CLASS_NAME);\n avatarElem.updateOptions({\n isDialog: false,\n loadPromises\n });\n }\n\n avatarElem.updateWithOptions({\n lazyLoadQueue: this.lazyLoadQueue,\n peerId: peerId\n });\n\n if(!avatarElem.parentNode) {\n avatarContainer.append(avatarElem);\n }\n\n if(!avatarContainer.parentNode) {\n this.container.append(avatarContainer);\n }\n });\n\n // if were 3 and became 2\n (Array.from(children) as HTMLElement[]).slice(peerIds.length).forEach((el) => el.remove());\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';\nimport rootScope from '../../lib/rootScope';\nimport ripple from '../ripple';\nimport I18n from '../../lib/langPack';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport StackedAvatars from '../stackedAvatars';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport type LazyLoadQueue from '../lazyLoadQueue';\n\nconst TAG_NAME = 'replies-element';\n\nrootScope.addEventListener('replies_updated', (message) => {\n (Array.from(document.querySelectorAll(TAG_NAME + `[data-post-key=\"${message.peerId}_${message.mid}\"]`)) as RepliesElement[]).forEach((element) => {\n element.message = message;\n element.render();\n });\n});\n\nexport default class RepliesElement extends HTMLElement {\n public message: Message.message;\n public type: 'footer' | 'beside';\n public loadPromises: Promise[];\n public lazyLoadQueue: LazyLoadQueue;\n public stackedAvatars: StackedAvatars;\n public text: I18n.IntlElement;\n public managers: AppManagers;\n\n private updated = false;\n\n constructor() {\n super();\n this.managers = rootScope.managers;\n }\n\n public init() {\n this.render();\n this.dataset.postKey = this.message.peerId + '_' + this.message.mid;\n this.classList.add('replies', 'replies-' + this.type);\n }\n\n public render() {\n const replies = this.message.replies;\n\n /* if(this.firstChild) {\n this.innerHTML = '';\n } */\n\n if(this.type === 'footer') {\n let leftPart: HTMLElement;\n if(this.firstElementChild) {\n leftPart = this.firstElementChild as HTMLElement;\n }\n\n if(replies?.recent_repliers) {\n if(leftPart && !leftPart.classList.contains('replies-footer-avatars')) {\n this.innerHTML = '';\n leftPart = null;\n }\n\n if(!this.stackedAvatars) {\n this.stackedAvatars = new StackedAvatars({\n lazyLoadQueue: this.lazyLoadQueue,\n avatarSize: 30\n });\n\n this.stackedAvatars.container.classList.add('replies-footer-avatars');\n }\n\n leftPart = this.stackedAvatars.container;\n\n this.stackedAvatars.render(replies.recent_repliers.map((peer) => getPeerId(peer)), this.loadPromises);\n } else {\n if(leftPart && !leftPart.classList.contains('tgico-comments')) {\n leftPart.remove();\n leftPart = null;\n }\n\n if(!leftPart) {\n leftPart = document.createElement('span');\n leftPart.classList.add('tgico-comments');\n }\n }\n\n if(!leftPart.parentElement) {\n this.prepend(leftPart);\n }\n\n if(!this.text) {\n this.text = new I18n.IntlElement();\n }\n\n const text = this.text;\n if(replies) {\n if(replies.replies) {\n text.compareAndUpdate({key: 'Comments', args: [replies.replies]});\n } else {\n text.compareAndUpdate({key: 'LeaveAComment'});\n }\n } else {\n text.compareAndUpdate({key: 'ViewInChat'});\n }\n\n if(replies) {\n // const historyStorage = appMessagesManager.getHistoryStorage(replies.channel_id.toPeerId(true));\n let isUnread = false;\n if(replies.replies) {\n if(replies.read_max_id !== undefined && replies.max_id !== undefined) {\n isUnread = replies.read_max_id < replies.max_id;\n }/* else {\n isUnread = !historyStorage.readMaxId || historyStorage.readMaxId < (replies.max_id || 0);\n } */\n }\n this.classList.toggle('is-unread', isUnread);\n }\n\n let textSpan = this.children[1] as HTMLElement;\n if(!textSpan) {\n textSpan = document.createElement('span');\n textSpan.classList.add('replies-footer-text');\n\n const iconSpan = document.createElement('span');\n iconSpan.classList.add('tgico-next');\n\n const rippleContainer = document.createElement('div');\n ripple(rippleContainer);\n\n this.append(textSpan, iconSpan, rippleContainer);\n }\n\n replaceContent(textSpan, text.element);\n } else {\n this.classList.add('bubble-beside-button');\n this.innerHTML = `${replies?.replies ? formatNumber(replies.replies, 0) : ''}`;\n }\n\n if(replies && !this.updated && !this.message.pFlags.is_outgoing) {\n this.managers.appMessagesManager.subscribeRepliesThread(this.message.peerId, this.message.mid);\n this.managers.appMessagesManager.updateMessage(this.message.peerId, this.message.mid, 'replies_updated');\n this.updated = true;\n }\n\n if(this.loadPromises) {\n this.loadPromises = undefined;\n }\n }\n}\n\ncustomElements.define(TAG_NAME, RepliesElement);\n","/*\n * 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 setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport {Message} from '../../layer';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport {i18n, _i18n} from '../../lib/langPack';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport rootScope from '../../lib/rootScope';\nimport type LazyLoadQueue from '../lazyLoadQueue';\nimport PeerTitle from '../peerTitle';\nimport wrapReply from '../wrappers/reply';\nimport Chat, {ChatType} 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 = (options: {\n chatType: ChatType,\n message: Message.message | Message.messageService,\n reactionsMessage?: Message.message\n }) => {\n const {chatType, message} = options;\n const date = new Date(message.date * 1000);\n const args: (HTMLElement | string)[] = [];\n\n let editedSpan: HTMLElement,\n sponsoredSpan: HTMLElement;\n // reactionsElement: ReactionsElement,\n // reactionsMessage: Message.message;\n\n const isSponsored = !!(message as Message.message).pFlags.sponsored;\n const isMessage = !('action' in message) && !isSponsored;\n // let hasReactions: boolean;\n\n const 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 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 setInnerHTML(span, wrapEmojiText(postAuthor));\n span.insertAdjacentHTML('beforeend', ',' + NBSP)\n args.push(span);\n }\n }\n\n if(message.edit_date && chatType !== 'scheduled' && !message.pFlags.edit_hide) {\n args.unshift(editedSpan = makeEdited());\n }\n\n if(chatType !== 'pinned' && message.pFlags.pinned) {\n const i = document.createElement('i');\n i.classList.add('tgico-pinnedchat', 'time-icon');\n args.unshift(i);\n }\n\n // if(USER_REACTIONS_INLINE && message.peer_id._ === 'peerUser'/* && message.reactions?.results?.length */) {\n // hasReactions = true;\n\n // reactionsMessage = options.reactionsMessage;\n // reactionsElement = new ReactionsElement();\n // reactionsElement.init(reactionsMessage, 'inline', true);\n // reactionsElement.render();\n // args.unshift(reactionsElement);\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 && !message.pFlags.edit_hide ? `\\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 // if(reactionsElement) {\n // const _reactionsElement = clonedArgs[clonedArgs.indexOf(reactionsElement)] = new ReactionsElement();\n // _reactionsElement.init(reactionsMessage, 'inline');\n // _reactionsElement.render();\n // }\n clonedArgs = clonedArgs.map((a) => a instanceof HTMLElement && !a.classList.contains('i18n') && !a.classList.contains('reactions') ? 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 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?: LazyLoadQueue\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 = async({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 currentReplyDiv?.remove();\n\n bubble.classList.remove('is-reply');\n return;\n }\n\n\n const replyToPeerId = message.reply_to.reply_to_peer_id ? getPeerId(message.reply_to.reply_to_peer_id) : chat.peerId;\n\n const originalMessage = await rootScope.managers.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 let titlePeerId: PeerId;\n // need to download separately\n if(!originalMessage) {\n // ////////this.log('message to render reply empty, need download', message, message.reply_to_mid);\n rootScope.managers.appMessagesManager.fetchMessageReplyTo(message);\n chat.bubbles.needUpdate.push({replyToPeerId, replyMid: message.reply_to_mid, mid: message.mid});\n\n originalPeerTitle = i18n('Loading');\n } else {\n const originalMessageFwdFromId = (originalMessage as Message.message).fwdFromId;\n titlePeerId = message.fwdFromId && message.fwdFromId === originalMessageFwdFromId ? message.fwdFromId : originalMessage.fromId || originalMessageFwdFromId;\n originalPeerTitle = new PeerTitle({\n peerId: titlePeerId,\n dialog: false,\n onlyFirstName: false,\n plainText: false\n }).element;\n }\n\n const {container, fillPromise} = wrapReply(originalPeerTitle, undefined, chat.animationGroup, originalMessage, chat.isAnyGroup ? titlePeerId : undefined);\n await fillPromise;\n if(currentReplyDiv) {\n if(currentReplyDiv.classList.contains('floating-part')) {\n container.classList.add('floating-part');\n }\n currentReplyDiv.replaceWith(container);\n } else {\n bubbleContainer.append(container);\n }\n // bubbleContainer.insertBefore(, nameContainer);\n bubble.classList.add('is-reply');\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\nexport default function reflowScrollableElement(element: HTMLElement) {\n element.style.display = 'none';\n void element.offsetLeft; // reflow\n element.style.display = '';\n}\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\nexport enum INTERNAL_LINK_TYPE {\n MESSAGE,\n PRIVATE_POST,\n STICKER_SET,\n JOIN_CHAT,\n VOICE_CHAT,\n USER_PHONE_NUMBER,\n INVOICE,\n EMOJI_SET\n};\n\nexport type InternalLink = InternalLink.InternalLinkMessage | InternalLink.InternalLinkPrivatePost | InternalLink.InternalLinkStickerSet | InternalLink.InternalLinkJoinChat | InternalLink.InternalLinkVoiceChat | InternalLink.InternalLinkUserPhoneNumber | InternalLink.InternalLinkInvoice | InternalLink.InternalLinkEmojiSet;\n\nexport namespace InternalLink {\n export interface InternalLinkMessage {\n _: INTERNAL_LINK_TYPE.MESSAGE,\n domain: string,\n post?: string,\n comment?: string,\n thread?: string,\n start?: string,\n stack?: number // local\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 stack?: number // local\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 export interface InternalLinkUserPhoneNumber {\n _: INTERNAL_LINK_TYPE.USER_PHONE_NUMBER,\n phone: string\n }\n\n export interface InternalLinkInvoice {\n _: INTERNAL_LINK_TYPE.INVOICE,\n slug: string\n }\n\n export interface InternalLinkEmojiSet {\n _: INTERNAL_LINK_TYPE.EMOJI_SET,\n set: 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 [INTERNAL_LINK_TYPE.USER_PHONE_NUMBER]: InternalLink.InternalLinkUserPhoneNumber,\n [INTERNAL_LINK_TYPE.INVOICE]: InternalLink.InternalLinkInvoice,\n [INTERNAL_LINK_TYPE.EMOJI_SET]: InternalLink.InternalLinkEmojiSet\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, {addCancelButton} from '.';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport numberThousandSplitter from '../../helpers/number/numberThousandSplitter';\nimport {ChatInvite} from '../../layer';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {i18n, _i18n} from '../../lib/langPack';\nimport {NULL_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport AvatarElement from '../avatar';\nimport putPhoto from '../putPhoto';\nimport {toastNew} from '../toast';\nimport wrapPhoto from '../wrappers/photo';\n\n// const FAKE_CHAT_ID = Number.MAX_SAFE_INTEGER - 0x1000;\n\nexport default class PopupJoinChatInvite extends PopupElement {\n constructor(\n private hash: string,\n private chatInvite: ChatInvite.chatInvite\n ) {\n super('popup-join-chat-invite', {\n closable: true,\n overlayClosable: true,\n body: true,\n buttons: addCancelButton([{\n langKey: chatInvite.pFlags.request_needed ? 'RequestJoin.Button' : (chatInvite.pFlags.broadcast ? 'JoinByPeekChannelTitle' : 'JoinByPeekGroupTitle'),\n callback: () => {\n this.managers.appChatsManager.importChatInvite(hash)\n .then((chatId) => {\n const peerId = chatId.toPeerId(true);\n appImManager.setInnerPeer({peerId});\n }, (error) => {\n if(error.type === 'INVITE_REQUEST_SENT') {\n toastNew({langPackKey: 'RequestToJoinSent'});\n }\n });\n }\n }])\n });\n\n this.construct();\n }\n\n private async construct() {\n this.header.remove();\n /* const fakeChat: Chat.channel | Chat.chat = {\n _: chatInvite.pFlags.channel ? 'channel' : 'chat',\n id: FAKE_CHAT_ID,\n title: chatInvite.title,\n photo: chatInvite.photo as any,\n date: Date.now() / 1000 | 0,\n version: 0,\n participants_count: chatInvite.participants_count,\n pFlags: chatInvite.pFlags as any\n };\n\n appChatsManager.saveApiChat(fakeChat); */\n\n const {chatInvite, managers, hash} = this;\n\n const avatarElem = new AvatarElement();\n avatarElem.classList.add('avatar-100');\n avatarElem.isDialog = false;\n if(chatInvite.photo._ === 'photo') {\n chatInvite.photo = await managers.appPhotosManager.savePhoto(chatInvite.photo);\n wrapPhoto({\n container: avatarElem,\n message: null,\n photo: chatInvite.photo,\n boxHeight: 100,\n boxWidth: 100,\n withoutPreloader: true\n });\n avatarElem.style.width = avatarElem.style.height = '';\n } else {\n putPhoto({\n div: avatarElem,\n peerId: NULL_PEER_ID,\n isDialog: false,\n title: chatInvite.title\n });\n }\n\n const title = document.createElement('div');\n title.classList.add('chat-title');\n setInnerHTML(title, wrapEmojiText(chatInvite.title));\n // avatarElem.setAttribute('peer', '' + -fakeChat.id);\n\n const isBroadcast = chatInvite.pFlags.broadcast;\n const peopleCount = i18n(isBroadcast ? 'Subscribers' : 'Members', [numberThousandSplitter(chatInvite.participants_count)]);\n peopleCount.classList.add('chat-participants-count');\n\n this.body.append(avatarElem, title, peopleCount);\n\n if(chatInvite.pFlags.request_needed) {\n const caption = document.createElement('div');\n _i18n(caption, isBroadcast ? 'RequestToJoinChannelDescription' : 'RequestToJoinGroupDescription');\n caption.classList.add('chat-participants-count', 'request-caption');\n\n this.body.append(caption);\n }\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 callbackify from '../../helpers/callbackify';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport {Document, MessagePeerReaction, ReactionCount} from '../../layer';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport rootScope from '../../lib/rootScope';\nimport SetTransition from '../singleTransition';\nimport StackedAvatars from '../stackedAvatars';\nimport {Awaited} from '../../types';\nimport wrapSticker from '../wrappers/sticker';\nimport wrapCustomEmoji from '../wrappers/customEmoji';\nimport wrapStickerAnimation from '../wrappers/stickerAnimation';\nimport {makeMediaSize} from '../../helpers/mediaSize';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport {fastRaf} from '../../helpers/schedulers';\nimport noop from '../../helpers/noop';\nimport {Middleware} from '../../helpers/middleware';\n\nconst CLASS_NAME = 'reaction';\nconst TAG_NAME = CLASS_NAME + '-element';\nconst REACTION_INLINE_SIZE = 14;\nconst REACTION_BLOCK_SIZE = 22;\n\nexport const REACTION_DISPLAY_INLINE_COUNTER_AT = 2;\nexport const REACTION_DISPLAY_BLOCK_COUNTER_AT = 4;\n\nexport type ReactionLayoutType = 'block' | 'inline';\n\nexport default class ReactionElement extends HTMLElement {\n private type: ReactionLayoutType;\n private counter: HTMLElement;\n private stickerContainer: HTMLElement;\n private stackedAvatars: StackedAvatars;\n private canRenderAvatars: boolean;\n private _reactionCount: ReactionCount;\n private wrapStickerPromise: Awaited>['render'];\n private managers: AppManagers;\n private middleware: Middleware;\n\n constructor() {\n super();\n this.classList.add(CLASS_NAME);\n this.managers = rootScope.managers;\n }\n\n public get reactionCount() {\n return this._reactionCount;\n }\n\n public set reactionCount(reactionCount: ReactionCount) {\n this._reactionCount = reactionCount;\n }\n\n public get count() {\n return this.reactionCount.count;\n }\n\n public init(type: ReactionLayoutType, middleware: Middleware) {\n this.type = type;\n this.classList.add(CLASS_NAME + '-' + type);\n this.middleware = middleware;\n }\n\n public setCanRenderAvatars(canRenderAvatars: boolean) {\n this.canRenderAvatars = canRenderAvatars;\n }\n\n public render(doNotRenderSticker?: boolean) {\n const hadStickerContainer = !!this.stickerContainer;\n if(!hadStickerContainer) {\n this.stickerContainer = document.createElement('div');\n this.stickerContainer.classList.add(CLASS_NAME + '-sticker');\n this.append(this.stickerContainer);\n }\n\n const reactionCount = this.reactionCount;\n if(!doNotRenderSticker && !hadStickerContainer) {\n const reaction = reactionCount.reaction;\n if(reaction._ === 'reactionEmoji') {\n const availableReaction = this.managers.appReactionsManager.getReaction(reaction.emoticon);\n callbackify(availableReaction, (availableReaction) => {\n if(!availableReaction.center_icon) {\n this.stickerContainer.classList.add('is-static');\n }\n\n if(availableReaction.pFlags.inactive) {\n this.classList.add('is-inactive');\n }\n\n this.renderDoc(availableReaction.center_icon ?? availableReaction.static_icon);\n });\n } else if(reaction._ === 'reactionCustomEmoji') {\n this.stickerContainer.classList.add('is-custom');\n const wrapped = wrapCustomEmoji({\n docIds: [reaction.document_id],\n customEmojiSize: makeMediaSize(REACTION_BLOCK_SIZE, REACTION_BLOCK_SIZE)\n });\n\n this.stickerContainer.append(wrapped);\n }\n }\n }\n\n private renderDoc(doc: Document.document) {\n const size = this.type === 'inline' ? REACTION_INLINE_SIZE : REACTION_BLOCK_SIZE;\n const wrapPromise = this.wrapStickerPromise = wrapSticker({\n div: this.stickerContainer,\n doc,\n width: size,\n height: size,\n static: true,\n managers: this.managers,\n middleware: this.middleware\n }).then(({render}) => render).finally(() => {\n if(this.wrapStickerPromise === wrapPromise) {\n this.wrapStickerPromise = undefined;\n }\n });\n }\n\n public renderCounter() {\n const reactionCount = this.reactionCount;\n const displayOn = this.type === 'inline' ? REACTION_DISPLAY_INLINE_COUNTER_AT : REACTION_DISPLAY_BLOCK_COUNTER_AT;\n if(reactionCount.count >= displayOn || (this.type === 'block' && !this.canRenderAvatars)) {\n if(!this.counter) {\n this.counter = document.createElement(this.type === 'inline' ? 'i' : 'span');\n this.counter.classList.add(CLASS_NAME + '-counter');\n }\n\n const formatted = formatNumber(reactionCount.count);\n if(this.counter.textContent !== formatted) {\n this.counter.textContent = formatted;\n }\n\n if(!this.counter.parentElement) {\n this.append(this.counter);\n }\n } else if(this.counter?.parentElement) {\n this.counter.remove();\n this.counter = undefined;\n }\n }\n\n public renderAvatars(recentReactions: MessagePeerReaction[]) {\n if(this.type === 'inline') {\n return;\n }\n\n if(this.reactionCount.count >= REACTION_DISPLAY_BLOCK_COUNTER_AT || !this.canRenderAvatars) {\n if(this.stackedAvatars) {\n this.stackedAvatars.container.remove();\n this.stackedAvatars = undefined;\n }\n\n return;\n }\n\n if(!this.stackedAvatars) {\n this.stackedAvatars = new StackedAvatars({\n avatarSize: 24\n });\n\n this.append(this.stackedAvatars.container);\n }\n\n this.stackedAvatars.render(recentReactions.map((reaction) => getPeerId(reaction.peer_id)));\n }\n\n public setIsChosen(isChosen = this.reactionCount.chosen_order !== undefined) {\n if(this.type === 'inline') return;\n const wasChosen = this.classList.contains('is-chosen') && !this.classList.contains('backwards');\n if(wasChosen !== isChosen) {\n SetTransition({\n element: this,\n className: 'is-chosen',\n forwards: isChosen,\n duration: this.isConnected ? 300 : 0\n });\n }\n }\n\n public fireAroundAnimation() {\n const reaction = this.reactionCount.reaction;\n if(reaction._ !== 'reactionEmoji') return;\n callbackify(this.managers.appReactionsManager.getReaction(reaction.emoticon), (availableReaction) => {\n const size = this.type === 'inline' ? REACTION_INLINE_SIZE + 14 : REACTION_BLOCK_SIZE + 18;\n const div = document.createElement('div');\n div.classList.add(CLASS_NAME + '-sticker-activate');\n\n Promise.all([\n wrapSticker({\n div: div,\n doc: availableReaction.center_icon,\n width: size,\n height: size,\n withThumb: false,\n needUpscale: true,\n play: false,\n skipRatio: 1,\n group: 'none',\n needFadeIn: false,\n managers: this.managers,\n middleware: this.middleware\n }).then(({render}) => render as Promise),\n\n wrapStickerAnimation({\n doc: availableReaction.around_animation,\n size: 80,\n target: this.stickerContainer,\n side: 'center',\n skipRatio: 1,\n play: false,\n managers: this.managers,\n middleware: this.middleware\n }).stickerPromise.catch(noop)\n ]).then(([iconPlayer, aroundPlayer]) => {\n const remove = () => {\n // if(!isInDOM(div)) return;\n iconPlayer.remove();\n div.remove();\n this.stickerContainer.classList.remove('has-animation');\n };\n\n if(!aroundPlayer) {\n remove();\n return;\n }\n\n const removeOnFrame = () => {\n // if(!isInDOM(div)) return;\n fastRaf(remove);\n };\n\n iconPlayer.addEventListener('enterFrame', (frameNo) => {\n if(frameNo === iconPlayer.maxFrame) {\n if(this.wrapStickerPromise) { // wait for fade in animation\n this.wrapStickerPromise.then(() => {\n setTimeout(removeOnFrame, 1e3);\n });\n } else {\n removeOnFrame();\n }\n }\n });\n\n iconPlayer.addEventListener('firstFrame', () => {\n this.stickerContainer.append(div);\n this.stickerContainer.classList.add('has-animation');\n iconPlayer.play();\n aroundPlayer.play();\n }, {once: true});\n });\n });\n }\n}\n\ncustomElements.define(TAG_NAME, ReactionElement);\n","/*\n * 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/forEachReverse';\nimport positionElementByIndex from '../../helpers/dom/positionElementByIndex';\nimport {Middleware, MiddlewareHelper} from '../../helpers/middleware';\nimport {Message, ReactionCount} from '../../layer';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport reactionsEqual from '../../lib/appManagers/utils/reactions/reactionsEqual';\nimport rootScope from '../../lib/rootScope';\nimport ReactionElement, {ReactionLayoutType, REACTION_DISPLAY_BLOCK_COUNTER_AT} from './reaction';\n\nconst CLASS_NAME = 'reactions';\nconst TAG_NAME = CLASS_NAME + '-element';\n\nconst REACTIONS_ELEMENTS: Map> = new Map();\nexport {REACTIONS_ELEMENTS};\n\nexport default class ReactionsElement extends HTMLElement {\n private message: Message.message;\n private key: string;\n private isPlaceholder: boolean;\n private type: ReactionLayoutType;\n private sorted: ReactionElement[];\n private onConnectCallback: () => void;\n private managers: AppManagers;\n private middleware: Middleware;\n private middlewareHelpers: Map;\n\n constructor() {\n super();\n this.classList.add(CLASS_NAME);\n this.sorted = [];\n this.middlewareHelpers = new Map();\n this.managers = rootScope.managers;\n }\n\n connectedCallback() {\n let set = REACTIONS_ELEMENTS.get(this.key);\n if(!set) {\n REACTIONS_ELEMENTS.set(this.key, set = new Set());\n }\n\n set.add(this);\n\n if(this.onConnectCallback && this.isConnected) {\n this.onConnectCallback();\n this.onConnectCallback = undefined;\n }\n }\n\n disconnectedCallback() {\n const set = REACTIONS_ELEMENTS.get(this.key);\n set.delete(this);\n if(!set.size) {\n REACTIONS_ELEMENTS.delete(this.key);\n }\n }\n\n public getReactionCount(reactionElement: ReactionElement) {\n return this.sorted[this.sorted.indexOf(reactionElement)].reactionCount;\n }\n\n public getMessage() {\n return this.message;\n }\n\n public init(\n message: Message.message,\n type: ReactionLayoutType,\n middleware: Middleware,\n isPlaceholder = this.isPlaceholder\n ) {\n if(this.key !== undefined) {\n this.disconnectedCallback();\n }\n\n if(this.middleware !== middleware) {\n middleware.onDestroy(() => {\n this.middlewareHelpers.clear();\n });\n }\n\n this.message = message;\n this.key = this.message.peerId + '_' + this.message.mid;\n this.middleware = middleware;\n this.isPlaceholder = isPlaceholder;\n\n if(this.type !== type) {\n this.type = type;\n this.classList.add(CLASS_NAME + '-' + type);\n }\n\n this.connectedCallback();\n }\n\n public changeMessage(message: Message.message) {\n return this.init(message, this.type, this.middleware);\n }\n\n public update(message: Message.message, changedResults?: ReactionCount[]) {\n this.message = message;\n this.render(changedResults);\n }\n\n public render(changedResults?: ReactionCount[]) {\n const reactions = this.message.reactions;\n const hasReactions = !!(reactions && reactions.results.length);\n this.classList.toggle('has-no-reactions', !hasReactions);\n if(!hasReactions && !this.sorted.length) return;\n\n const availableReactionsResult = this.managers.appReactionsManager.getAvailableReactions();\n // callbackify(availableReactionsResult, () => {\n const counts = hasReactions ? (\n reactions.results\n // availableReactionsResult instanceof Promise ?\n // reactions.results :\n // reactions.results.filter((reactionCount) => {\n // return this.managers.appReactionsManager.isReactionActive(reactionCount.reaction);\n // })\n ) : [];\n\n // if(this.message.peerId.isUser()) {\n // counts.sort((a, b) => (b.count - a.count) || ((b.chosen_order ?? 0) - (a.chosen_order ?? 0)));\n // } else {\n counts.sort((a, b) => (b.count - a.count) || ((a.chosen_order ?? 0) - (b.chosen_order ?? 0)));\n // }\n\n forEachReverse(this.sorted, (reactionElement, idx, arr) => {\n const reaction = reactionElement.reactionCount.reaction;\n const found = counts.some((reactionCount) => reactionsEqual(reactionCount.reaction, reaction));\n if(!found) {\n const middlewareHelper = this.middlewareHelpers.get(reactionElement);\n middlewareHelper.destroy();\n this.middlewareHelpers.delete(reactionElement);\n arr.splice(idx, 1);\n reactionElement.remove();\n }\n });\n\n const totalReactions = counts.reduce((acc, c) => acc + c.count, 0);\n const canRenderAvatars = reactions && (!!reactions.pFlags.can_see_list || this.message.peerId.isUser()) && totalReactions < REACTION_DISPLAY_BLOCK_COUNTER_AT;\n this.sorted = counts.map((reactionCount, idx) => {\n let reactionElement = this.sorted.find((reactionElement) => reactionsEqual(reactionElement.reactionCount.reaction, reactionCount.reaction));\n if(!reactionElement) {\n const middlewareHelper = this.middleware.create();\n reactionElement = new ReactionElement();\n reactionElement.init(this.type, middlewareHelper.get());\n this.middlewareHelpers.set(reactionElement, middlewareHelper);\n }\n\n positionElementByIndex(reactionElement, this, idx);\n\n const recentReactions = reactions.recent_reactions ? reactions.recent_reactions.filter((reaction) => reactionsEqual(reaction.reaction, reactionCount.reaction)) : [];\n reactionElement.reactionCount = {...reactionCount};\n reactionElement.setCanRenderAvatars(canRenderAvatars);\n reactionElement.render(this.isPlaceholder);\n reactionElement.renderCounter();\n reactionElement.renderAvatars(recentReactions);\n reactionElement.setIsChosen();\n\n return reactionElement;\n });\n\n // this.sorted.forEach((reactionElement, idx) => {\n // /* if(this.type === 'block' && this.childElementCount !== this.sorted.length) { // because of appended time\n // idx += 1;\n // } */\n\n // positionElementByIndex(reactionElement, this, idx);\n // });\n\n if(!this.isPlaceholder && changedResults?.length) {\n if(this.isConnected) {\n this.handleChangedResults(changedResults);\n } else {\n this.onConnectCallback = () => {\n this.handleChangedResults(changedResults);\n };\n }\n }\n // });\n\n // ! ั‚ัƒั‚ ะฒะพะพะฑั‰ะต ะฝะต ะดะพะปะถะฝะพ ะฑั‹ั‚ัŒ ัั‚ะพะณะพ ะบะพะดะฐ, ะฝะพ ะฟะพะบะฐ ะพะฝ ะฟะพะฑัƒะดะตั‚ ั‚ัƒั‚\n if(!this.sorted.length && this.type === 'block') {\n const parentElement = this.parentElement;\n this.remove();\n\n if(parentElement.classList.contains('document-message') && !parentElement.childNodes.length) {\n parentElement.remove();\n return;\n }\n\n const timeSpan = this.querySelector('.time');\n if(timeSpan) {\n parentElement.append(timeSpan);\n }\n }\n }\n\n private handleChangedResults(changedResults: ReactionCount[]) {\n // ! temp\n if(this.message.peerId !== appImManager.chat.peerId) return;\n\n changedResults.forEach((reactionCount) => {\n const reactionElement = this.sorted.find((reactionElement) => reactionsEqual(reactionElement.reactionCount.reaction, reactionCount.reaction));\n reactionElement?.fireAroundAnimation();\n });\n }\n}\n\ncustomElements.define(TAG_NAME, ReactionsElement);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Scrollable from '../components/scrollable';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport {IS_SAFARI} from '../environment/userAgent';\nimport getVisibleRect from './dom/getVisibleRect';\nimport reflowScrollableElement from './dom/reflowScrollableElement';\n\nexport default class ScrollSaver {\n private scrollHeight: number;\n private scrollHeightMinusTop: number;\n private scrollTop: number;\n private clientHeight: number;\n private elements: {element: HTMLElement, rect: DOMRect}[];\n\n /**\n *\n * @param scrollable to reset scroll position and direction\n * @param reverse true means top\n */\n constructor(\n private scrollable: Scrollable,\n private query: string,\n private reverse: boolean\n ) {\n\n }\n\n private get container() {\n return this.scrollable.container;\n }\n\n public getSaved() {\n return {\n scrollHeight: this.scrollHeight,\n scrollTop: this.scrollTop,\n clientHeight: this.clientHeight\n };\n }\n\n public findElements() {\n if(!this.query) return [];\n\n const {container} = this;\n const containerRect = container.getBoundingClientRect();\n const bubbles = Array.from(container.querySelectorAll(this.query)) as HTMLElement[];\n const elements: ScrollSaver['elements'] = [];\n for(const bubble of bubbles) {\n const elementRect = bubble.getBoundingClientRect();\n const visibleRect = getVisibleRect(bubble, container, undefined, elementRect, containerRect);\n if(visibleRect) {\n elements.push({element: bubble, rect: elementRect});\n // break; // find first\n } else if(elements.length) { // find last\n break;\n }\n }\n\n if(!elements.length) {\n const bubble = bubbles[0];\n if(bubble) {\n elements.push({element: bubble, rect: bubble.getBoundingClientRect()});\n }\n }\n\n return elements;\n }\n\n public replaceSaved(from: HTMLElement, to: HTMLElement) {\n if(!this.elements) {\n return;\n }\n\n const idx = this.elements.findIndex(({element}) => from === element);\n if(idx !== -1) {\n this.elements[idx].element = to;\n }\n }\n\n public findAndSetElements() {\n this.elements = this.findElements();\n }\n\n public save() {\n this.findAndSetElements();\n // console.warn('scroll save', this.elements);\n this._save();\n }\n\n public _save() {\n const {scrollTop, scrollHeight, clientHeight} = this.container;\n\n // previousScrollHeight = scrollHeight;\n // previousScrollHeight = scrollHeight + padding;\n this.scrollHeight = scrollHeight;\n this.scrollTop = scrollTop;\n this.clientHeight = clientHeight;\n this.scrollHeightMinusTop = this.reverse ? scrollHeight - scrollTop : scrollTop;\n\n // this.chatInner.style.paddingTop = padding + 'px';\n /* if(reverse) {\n previousScrollHeightMinusTop = this.scrollable.scrollHeight - scrollTop;\n } else {\n previousScrollHeightMinusTop = scrollTop;\n } */\n }\n\n private onRestore(useReflow?: boolean) {\n if(IS_SAFARI && useReflow/* && !isAppleMobile */) { // * fix blinking and jumping\n reflowScrollableElement(this.container);\n }\n }\n\n private setScrollTop(newScrollTop: number, useReflow?: boolean) {\n // touchSupport for safari iOS\n // isTouchSupported && isApple && (container.container.style.overflow = 'hidden');\n this.scrollable.setScrollTopSilently(this.scrollTop = newScrollTop);\n // container.scrollTop = scrollHeight;\n // isTouchSupported && isApple && (container.container.style.overflow = '');\n\n this.onRestore(useReflow);\n }\n\n public restore(useReflow?: boolean) {\n const {scrollTop, scrollHeight} = this.scrollable;\n this.scrollHeight = scrollHeight;\n\n if(!this.elements.length) { // maybe all messages have been deleted\n this._restore(useReflow);\n return;\n }\n\n let anchor: ScrollSaver['elements'][0];\n // for(let i = this.elements.length - 1; i >= 0; --i) {\n // const _anchor = this.elements[i];\n // if(_anchor.element.parentElement) {\n // anchor = _anchor;\n // break;\n // }\n // }\n anchor = this.elements[this.elements.length - 1];\n\n if(!anchor?.element?.parentElement) { // try to find new anchor\n this.findAndSetElements();\n anchor = this.elements[this.elements.length - 1];\n\n if(!anchor) { // fallback to old method if smth is really strange\n this._restore(useReflow);\n return;\n }\n }\n\n const {element, rect} = anchor;\n const newRect = element.getBoundingClientRect();\n const diff = newRect.bottom - rect.bottom;\n this.setScrollTop(scrollTop + diff, useReflow);\n // if(diff) debugger;\n // console.warn('scroll restore', rect, diff, newRect);\n }\n\n public _restore(useReflow?: boolean) {\n const {scrollHeightMinusTop: previousScrollHeightMinusTop, scrollable} = this;\n // if(previousScrollHeightMinusTop === undefined) {\n // throw new Error('scroll was not saved');\n // }\n\n // const scrollHeight = container.scrollHeight;\n const scrollHeight = this.scrollHeight;\n // if(scrollHeight === this.scrollHeight) {\n // return;\n // }\n\n // this.scrollHeight = scrollHeight;\n\n /* const scrollHeight = container.scrollHeight;\n const addedHeight = scrollHeight - previousScrollHeight;\n\n this.chatInner.style.paddingTop = (10000 - addedHeight) + 'px'; */\n /* const scrollHeight = scrollHeight;\n const addedHeight = scrollHeight - previousScrollHeight;\n\n this.chatInner.style.paddingTop = (padding - addedHeight) + 'px';\n\n //const newScrollTop = reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n const newScrollTop = reverse ? scrollHeight - addedHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n this.log('performHistoryResult: will set scrollTop',\n previousScrollHeightMinusTop, scrollHeight,\n newScrollTop, container.container.clientHeight); */\n // const newScrollTop = reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n const newScrollTop = this.reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n\n /* if(DEBUG) {\n this.log('performHistoryResult: will set up scrollTop:', newScrollTop, this.isHeavyAnimationInProgress);\n } */\n\n this.setScrollTop(newScrollTop, useReflow);\n\n /* if(DEBUG) {\n this.log('performHistoryResult: have set up scrollTop:', newScrollTop, container.scrollTop, container.scrollHeight, this.isHeavyAnimationInProgress);\n } */\n }\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.ScrollSaver = ScrollSaver);\n","/*\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 type IntersectionTarget = Element;\nexport type IntersectionCallback = (entry: IntersectionObserverEntry) => void;\n\nexport default class SuperIntersectionObserver {\n private observing: Map>;\n private observingQueue: SuperIntersectionObserver['observing'];\n private observer: IntersectionObserver;\n private freezedObservingNew: boolean;\n\n constructor(init?: IntersectionObserverInit) {\n this.observing = new Map();\n this.observingQueue = new Map();\n this.freezedObservingNew = false;\n\n this.observer = new IntersectionObserver((entries) => {\n const observing = this.observing;\n for(let i = 0, length = entries.length; i < length; ++i) {\n const entry = entries[i];\n const callbacks = observing.get(entry.target);\n if(!callbacks) {\n console.error('intersection process no callbacks:', entry);\n debugger;\n continue;\n }\n\n for(const callback of callbacks) {\n try {\n callback(entry);\n } catch(err) {\n console.error('intersection process callback error:', err);\n }\n }\n }\n }, init);\n }\n\n public disconnect() {\n this.observing.clear();\n this.observingQueue.clear();\n this.observer.disconnect();\n }\n\n public toggleObservingNew(value: boolean) {\n if(this.freezedObservingNew === value) {\n return;\n }\n\n this.freezedObservingNew = value;\n\n const queue = this.observingQueue;\n if(!value && queue.size) {\n for(const [target, callbacks] of queue) {\n for(const callback of callbacks) {\n this.observe(target, callback);\n }\n }\n\n queue.clear();\n }\n }\n\n public has(target: IntersectionTarget, callback: IntersectionCallback, observing = this.observing) {\n const callbacks = observing.get(target);\n return !!(callbacks && callbacks.has(callback));\n }\n\n public observe(target: IntersectionTarget, callback: IntersectionCallback) {\n if(this.freezedObservingNew && this.has(target, callback)) {\n return;\n }\n\n const observing = this.freezedObservingNew ? this.observingQueue : this.observing;\n let callbacks = observing.get(target);\n if(callbacks && callbacks.has(callback)) {\n return;\n }\n\n if(!callbacks) {\n callbacks = new Set();\n observing.set(target, callbacks);\n\n if(observing === this.observing) {\n this.observer.observe(target);\n }\n }\n\n callbacks.add(callback);\n }\n\n public unobserve(target: IntersectionTarget, callback: IntersectionCallback) {\n const observing = this.freezedObservingNew && !this.has(target, callback) ? this.observingQueue : this.observing;\n const callbacks = observing.get(target);\n if(!callbacks) {\n return;\n }\n\n callbacks.delete(callback);\n if(!callbacks.size) {\n observing.delete(target);\n this.observer.unobserve(target);\n }\n }\n}\n","import type {MyDocument} from '../../appDocsManager';\nimport type {MyMessage} from '../../appMessagesManager';\nimport {Message, MessageMedia} from '../../../../layer';\n\nexport default function isMentionUnread(message: MyMessage) {\n if(!message) {\n return false;\n }\n\n const doc = ((message as Message.message).media as MessageMedia.messageMediaDocument)?.document as MyDocument;\n return !!(\n message.pFlags.media_unread &&\n message.pFlags.mentioned &&\n (\n !doc ||\n !(['voice', 'round'] as MyDocument['type'][]).includes(doc.type)\n )\n );\n}\n","export default function accumulate(arr: number[], initialValue: number) {\n return arr.reduce((acc, value) => acc + value, initialValue);\n}\n","function cacheCallback(callback: (str: A) => T) {\n const stringResults: any = {}, numberResults: any = {};\n return (value: A): T => {\n const key = '_' + value;\n return (typeof(value) === 'string' ? stringResults : numberResults)[key] ??= callback(value);\n };\n}\n\nexport default cacheCallback;\n","export default function replaceNonNumber(str: string) {\n return str.replace(/\\D/g, '');\n}\n","import cacheCallback from '../cacheCallback';\nimport replaceNonNumber from '../string/replaceNonNumber';\n\nconst CARD_BRAND_REGEXP: {[brand: string]: RegExp} = {\n visa: /^4/,\n mastercard: /^(51|52|53|54|55|222|23|24|25|26|27)/,\n amex: /^(34|37)/,\n discover: /^(60|64|65)/,\n diners: /^(30|38|39)/,\n diners14: /^(36)/,\n jcb: /^(35)/,\n unionpay: /^(62[0-6,8-9]|627[0-6,8-9]|6277[0-7,9]|62778[1-9]|81)/,\n elo: /^(5067|509|636368|627780)/,\n mir: /^(220[0-4])/\n};\n\n// * taken from Stripe\nexport const CARD_BRANDS: {[b: string]: {\n minLength: number,\n maxLength: number,\n cvcMaxLength: number,\n cvcMinLength: number | null\n}} = {\n visa: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n mastercard: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n amex: {\n minLength: 15,\n maxLength: 15,\n cvcMaxLength: 4,\n cvcMinLength: 3\n },\n unionpay: {\n minLength: 13,\n maxLength: 19,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n diners: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n diners14: {\n minLength: 14,\n maxLength: 14,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n discover: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n jcb: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n elo: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n mir: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n unknown: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 4,\n cvcMinLength: 3\n }\n};\n\nexport const detectCardBrand = cacheCallback((card: string = '') => {\n const keys = Object.keys(CARD_BRAND_REGEXP);\n const sanitizedCard = replaceNonNumber(card);\n let brand: string;\n let last = 0;\n keys.forEach((key) => {\n const regExp = CARD_BRAND_REGEXP[key];\n const match = sanitizedCard.match(regExp);\n if(match) {\n const result = match[0];\n if(result && result.length > last) {\n brand = key;\n last = result.length;\n }\n }\n });\n\n return brand || 'unknown';\n});\n\nexport function cardBrandToUnifiedBrand(brand: string) {\n return brand === 'diners14' ? 'diners' : brand;\n}\n\nexport function detectUnifiedCardBrand(card = '') {\n const brand = detectCardBrand(card);\n return cardBrandToUnifiedBrand(brand);\n}\n","export default function createArray(length: number, fill?: T1, map?: any): T1[] {\n const arr = new Array(length);\n arr.fill(fill);\n return map ? arr.map(map) : arr;\n}\n","const delta = '๏ผ'.charCodeAt(0) - '0'.charCodeAt(0);\nconst buggedRegExp = /[๏ผ-๏ผ™]/g;\n\n// function hasBuggedNumbers(str: string) {\n// return !!str.match(a);\n// }\n\nfunction getDistanceFromBuggedToNormal(char: string) {\n return String.fromCharCode(char.charCodeAt(0) - delta);\n}\n\nexport function fixBuggedNumbers(str: string) {\n return str.replace(buggedRegExp, getDistanceFromBuggedToNormal);\n}\n","import {fixBuggedNumbers} from '../string/buggedNumbers';\nimport replaceNonNumber from '../string/replaceNonNumber';\n\nexport type PatternCharacter = {\n type: 'optional',\n result: string,\n consumed: number\n} | {\n type: 'required',\n result: string,\n consumed: number,\n partial?: boolean\n} | {\n type: 'formatting',\n result: string,\n consumed: number\n};\n\nexport type PatternFunction = (str: string) => ((str: string) => PatternCharacter)[];\n\nfunction makeOptionalCharacter(result: string, consumed: number): PatternCharacter {\n return {type: 'optional', result, consumed};\n}\n\nfunction makeRequiredCharacter(result: string, consumed: number, partial?: boolean): PatternCharacter {\n return {type: 'required', result, consumed, partial};\n}\n\nfunction makeFormattingCharacter(result: string, consumed: number): PatternCharacter {\n return {type: 'formatting', result, consumed};\n}\n\nfunction wrapCharacterRegExpFactory(regExp: RegExp, optional?: boolean) {\n return (str: string) => {\n const _regExp = new RegExp('^'.concat(regExp.source.replace(/^\\^/, '')));\n const match = str.match(_regExp);\n const makeCharacter = optional ? makeOptionalCharacter : makeRequiredCharacter;\n if(match) {\n const result = match[0];\n return makeCharacter(result, match.index + result.length);\n }\n\n return makeCharacter('', str.length);\n };\n}\n\nfunction makeCapitalPatternCharacter(str: string) {\n const char = wrapCharacterRegExpFactory(/\\w/)(str);\n return char.result ? makeRequiredCharacter(char.result.toUpperCase(), char.consumed) : char;\n}\n\nconst makeMonthDigitPatternCharacter = wrapCharacterRegExpFactory(/1[0-2]|0?[1-9]|0/);\n\nfunction digit(str: string) {\n return wrapCharacterRegExpFactory(/[0-9]/)(fixBuggedNumbers(str));\n}\n\nconst patternCharacters = {\n digit,\n capitalCharacter: makeCapitalPatternCharacter,\n month: (str: string) => {\n const char = makeMonthDigitPatternCharacter(fixBuggedNumbers(str));\n const cleanedResult = replaceNonNumber(char.result);\n const isPartial = ['0', '1'].includes(char.result) && str.length === 1;\n if(isPartial || (char.result === '0' && str.length >= 2)) {\n return makeRequiredCharacter(char.result, str.length, true);\n }\n\n return makeRequiredCharacter(cleanedResult.length === 1 ? '0' + cleanedResult : cleanedResult, char.consumed);\n },\n formattingCharacter: (str: string) => {\n return (str1: string) => {\n const consumed = str === str1[0] ? 1 : 0;\n return makeFormattingCharacter(str, consumed);\n }\n },\n optionalPattern: (regExp: RegExp) => {\n return (str: string) => {\n const char = wrapCharacterRegExpFactory(regExp, true)(str);\n return char.result ? char : makeOptionalCharacter('', 0);\n };\n }\n};\n\nexport default patternCharacters;\n","import {IS_ANDROID} from '../../environment/userAgent';\nimport createArray from '../array/createArray';\nimport cacheCallback from '../cacheCallback';\nimport replaceNonNumber from '../string/replaceNonNumber';\nimport {CARD_BRANDS, detectCardBrand} from './cardBrands';\nimport patternCharacters from './patternCharacters';\n\nconst digit = patternCharacters.digit;\nconst capitalCharacter = patternCharacters.capitalCharacter;\nconst spaceCharacter = patternCharacters.formattingCharacter(' ');\nconst yearOptionalPattern = patternCharacters.optionalPattern(/\\d\\d/);\nconst sixteenPattern = [digit, digit, digit, digit, spaceCharacter, digit, digit, digit, digit, digit, digit, spaceCharacter, digit, digit, digit, digit, digit];\nconst fifteenPattern = [digit, digit, digit, digit, spaceCharacter, digit, digit, digit, digit, digit, digit, spaceCharacter, digit, digit, digit, digit];\n\nconst requiredPostcodes = new Set(['DZ', 'AR', 'AM', 'AU', 'AT', 'AZ', 'PT', 'BD', 'BY', 'BE', 'BA', 'BR', 'BN', 'BG', 'CA', 'IC', 'CN', 'CO', 'HR', 'CY', 'CZ', 'DK', 'EC', 'GB', 'EE', 'FO', 'FI', 'FR', 'GE', 'DE', 'GR', 'GL', 'GU', 'GG', 'NL', 'HU', 'IN', 'ID', 'IL', 'IT', 'JP', 'JE', 'KZ', 'KR', 'FM', 'KG', 'LV', 'LI', 'LT', 'LU', 'MK', 'MG', 'PT', 'MY', 'MH', 'MQ', 'YT', 'MX', 'MN', 'ME', 'NL', 'NZ', 'GB', 'NO', 'PK', 'PH', 'PL', 'FM', 'PT', 'PR', 'RE', 'RU', 'SA', 'SF', 'RS', 'SG', 'SK', 'SI', 'ZA', 'ES', 'LK', 'SX', 'VI', 'VI', 'SE', 'CH', 'TW', 'TJ', 'TH', 'TU', 'TN', 'TR', 'TM', 'VI', 'UA', 'GB', 'US', 'UY', 'UZ', 'VA', 'VN', 'GB', 'FM']);\n\nconst generateFourPattern = cacheCallback((length: number) => {\n const out: Array = [];\n\n for(let i = 0, k = 0; i < length;) {\n if(k === 4) {\n out.push(spaceCharacter);\n k = 0;\n } else {\n out.push(digit);\n ++i;\n ++k;\n }\n }\n\n return out;\n});\n\nfunction generateCardNumberPattern(card: string) {\n const brand = detectCardBrand(card);\n if(brand === 'amex') return sixteenPattern;\n if(brand === 'diners14') return fifteenPattern;\n const {minLength, maxLength} = CARD_BRANDS[brand];\n const s = replaceNonNumber(card).length;\n const d = Math.min(Math.max(minLength, s), maxLength);\n return generateFourPattern(d);\n}\n\nconst cardFormattingPatterns = {\n cardNumber: generateCardNumberPattern,\n cardExpiry: () => [patternCharacters.month, patternCharacters.formattingCharacter('/'), digit, digit, yearOptionalPattern],\n cardCvc: (card?: string) => cardFormattingPatterns.cardCvcFromBrand(detectCardBrand(card)),\n cardCvcFromBrand: cacheCallback((brand: string) => {\n const info = CARD_BRANDS[brand];\n const {cvcMinLength, cvcMaxLength} = info;\n const pattern = createArray(cvcMinLength || cvcMaxLength, digit);\n if(cvcMinLength && cvcMinLength < cvcMaxLength) {\n const i = cvcMaxLength - cvcMinLength;\n const h = patternCharacters.optionalPattern(/\\d/);\n if(i) {\n pattern.push(...createArray(i, h));\n }\n }\n\n return pattern;\n }),\n postalCodeFromCountry: cacheCallback((iso2: string) => {\n switch(iso2) {\n case 'US':\n return createArray(5, digit);\n case 'CA':\n return IS_ANDROID ? null : [capitalCharacter, capitalCharacter, capitalCharacter, spaceCharacter, capitalCharacter, capitalCharacter, capitalCharacter];\n default:\n const optionalDigits = createArray(10, patternCharacters.optionalPattern(/\\d/));\n if(requiredPostcodes.has(iso2)) {\n optionalDigits[0] = digit;\n }\n return optionalDigits;\n }\n })\n};\n\nexport default cardFormattingPatterns;\n","import accumulate from '../array/accumulate';\nimport {PatternFunction} from './patternCharacters';\n\nfunction accumulateLengths(strs: string[]) {\n return accumulate(strs.map((str) => str.length), 0);\n}\n\nfunction formatValueByPattern(\n getPattern: PatternFunction,\n value: string,\n options: Partial<{\n selectionStart: number,\n selectionEnd: number\n }> = {},\n pushRest?: boolean\n) {\n const pattern = getPattern(value);\n\n if(!pattern) {\n return {\n value: value,\n selection: null as typeof options,\n autocorrectComplete: !!value\n };\n }\n\n const length = pattern.length;\n const c: string[] = [];\n const s: string[] = [];\n\n let l = 0;\n let i = 0;\n let f = options.selectionStart === 0 ? 0 : null;\n let d = options.selectionEnd === 0 ? 0 : null;\n const p = () => {\n if(f === null && (i + 1) >= options.selectionStart) f = accumulateLengths(c) + (pushRest ? s.length : 0);\n if(d === null && (i + 1) >= options.selectionEnd) d = accumulateLengths(c) + (pushRest ? s.length : 0);\n };\n const m = (e: number) => {\n if(e > 0) {\n p();\n i += e;\n }\n };\n\n for(; l < length;) {\n const getCharacter = pattern[l];\n const character = getCharacter(value.slice(i));\n const {type, result, consumed} = character;\n if(type === 'required') {\n if(result) {\n c.push(...s, result);\n s.length = 0;\n ++l;\n\n if(character.partial) {\n m(value.length - i);\n break;\n }\n\n m(consumed);\n } else {\n if(!consumed) {\n break;\n }\n\n m(1);\n }\n } else if(type === 'optional') {\n if(result) {\n c.push(...s, result);\n s.length = 0;\n m(consumed);\n }\n\n ++l;\n } else if(type === 'formatting') {\n if(!pushRest && i >= value.length) {\n break;\n }\n\n s.push(result);\n ++l;\n m(consumed);\n }\n }\n\n if(pushRest) {\n c.push(...s);\n }\n\n return {\n value: c.join(''),\n selection: {\n selectionStart: f === null || value.length && options.selectionStart === value.length ? accumulateLengths(c) : f,\n selectionEnd: d === null || value.length && options.selectionEnd === value.length ? accumulateLengths(c) : d\n },\n autocorrectComplete: l === length\n };\n}\n\nexport default formatValueByPattern;\n","import {CARD_BRANDS, detectCardBrand} from './cardBrands';\nimport formatInputValueByPattern from './formatInputValueByPattern';\nimport NBSP from '../string/nbsp';\nimport replaceNonNumber from '../string/replaceNonNumber';\n\nexport type PatternValidationOptions = Partial<{\n ignoreIncomplete: boolean\n}>;\n\nconst nbspRegExp = new RegExp(NBSP, 'g');\n\nfunction makeValidationError(code?: string) {\n return code ? {\n type: 'invalid',\n code\n } : null;\n}\n\n// Luhn algorithm\nfunction validateCompleteCardNumber(card: string) {\n const t = '0'.charCodeAt(0);\n const n = card.length % 2;\n let a = 0;\n for(let i = card.length - 1; i >= 0; --i) {\n const c = n === (i % 2);\n let o = card.charCodeAt(i) - t;\n if(c) o *= 2;\n if(o > 9) o -= 9;\n a += o;\n }\n return !(a % 10);\n}\n\nfunction validateExpiry(year: number, month: number, options?: PatternValidationOptions) {\n const date = new Date(Date.now());\n const _year = year < 100 ? date.getFullYear() % 100 : date.getFullYear();\n const nextMonth = date.getMonth() + 1;\n\n if(isNaN(year) || isNaN(month)) {\n return options?.ignoreIncomplete ? null : 'incomplete';\n }\n\n if((year - _year) < 0) {\n return 'invalid_expiry_year_past';\n }\n\n if((year - _year) > 50) {\n return 'invalid_expiry_year';\n }\n\n return !(year - _year) && month < nextMonth ? 'invalid_expiry_month_past' : null;\n}\n\nfunction getCardInfoByNumber(card: string) {\n const sanitized = replaceNonNumber(card);\n const brand = detectCardBrand(card);\n return {\n sanitized,\n brand,\n minLength: CARD_BRANDS[brand].minLength\n };\n}\n\nfunction makeCardNumberError(str: string, length: number, ignoreIncomplete: boolean) {\n if(str.length >= length) {\n return validateCompleteCardNumber(str) || detectCardBrand(str) === 'mir' ? null : makeValidationError('invalid');\n }\n\n return ignoreIncomplete ? null : makeValidationError('incomplete');\n}\n\nexport function validateCardNumber(str: string, options: PatternValidationOptions = {}) {\n const {sanitized, minLength} = getCardInfoByNumber(str);\n return makeCardNumberError(sanitized, minLength, options.ignoreIncomplete);\n}\n\nexport function validateCardExpiry(str: string, options: PatternValidationOptions = {}) {\n const sanitized = str.replace(nbspRegExp, '').split(/ ?\\/ ?/);\n const [monthStr, yearStr = ''] = sanitized;\n const [month, year] = [monthStr, yearStr].map((str) => +str);\n const s = yearStr.length === 2 ? year % 100 : year;\n return yearStr.length < 2 || yearStr.length === 3 ? (options.ignoreIncomplete ? null : makeValidationError('incomplete')) : makeValidationError(validateExpiry(s, month, options));\n}\n\nexport function validateAnyIncomplete(formatted: ReturnType, str: string, options: PatternValidationOptions = {}) {\n return formatted.meta.autocorrectComplete || options.ignoreIncomplete ? null : makeValidationError('incomplete');\n}\n","const NBSP = 'โ€Ž';\nexport default NBSP;\n","/*\n * 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 from '../helpers/eventListenerBase';\nimport {TelegramWebViewEvent, TelegramWebViewEventCallback, TelegramWebViewEventMap} from '../types';\n\nconst weakMap: WeakMap = new WeakMap();\nwindow.addEventListener('message', (e) => {\n const callback = weakMap.get(e.source as Window);\n if(!callback) {\n return;\n }\n\n callback(JSON.parse(e.data));\n});\n\nexport default class TelegramWebView extends EventListenerBase<{\n [type in keyof TelegramWebViewEventMap]: (data: TelegramWebViewEventMap[type]) => void\n}> {\n public iframe: HTMLIFrameElement;\n\n constructor({url, sandbox}: {\n url: string,\n sandbox?: string\n }) {\n super(false);\n\n const iframe = this.iframe = document.createElement('iframe');\n iframe.src = url;\n if(sandbox) iframe.setAttribute('sandbox', sandbox);\n }\n\n public onMount() {\n weakMap.set(this.iframe.contentWindow, this.onTelegramWebViewEvent);\n }\n\n public destroy() {\n this.cleanup();\n weakMap.delete(this.iframe.contentWindow);\n }\n\n private onTelegramWebViewEvent = ({eventType, eventData}: TelegramWebViewEvent) => {\n if((eventData as any) === '') {\n eventData = undefined;\n }\n\n console.log('onTelegramWebViewEvent', eventType, eventData);\n this.dispatchEvent(eventType, eventData as any);\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 '.';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport TelegramWebView from '../telegramWebView';\n\nexport function createVerificationIframe(options: ConstructorParameters[0]) {\n const result = new TelegramWebView({\n ...options,\n sandbox: 'allow-forms allow-scripts allow-same-origin allow-modals'\n });\n const {iframe} = result;\n iframe.allow = 'payment';\n iframe.classList.add('payment-verification');\n return result;\n}\n\nexport default class PopupPaymentVerification extends PopupElement<{\n finish: () => void\n}> {\n private telegramWebView: TelegramWebView;\n\n constructor(private url: string, private openPathAfter?: boolean) {\n super('popup-payment popup-payment-verification', {\n closable: true,\n overlayClosable: true,\n body: true,\n title: 'Checkout.WebConfirmation.Title'\n });\n\n this.d();\n }\n\n private d() {\n const telegramWebView = this.telegramWebView = createVerificationIframe({\n url: this.url\n });\n\n telegramWebView.addEventListener('web_app_open_tg_link', (e) => {\n this.dispatchEvent('finish');\n this.hide();\n if(this.openPathAfter) {\n appImManager.openUrl('https://t.me' + e.path_full);\n }\n });\n\n this.body.append(telegramWebView.iframe);\n this.show();\n telegramWebView.onMount();\n }\n\n protected destroy() {\n this.telegramWebView.destroy();\n return super.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 PopupElement from '.';\nimport cardFormattingPatterns from '../../helpers/cards/cardFormattingPatterns';\nimport {detectUnifiedCardBrand} from '../../helpers/cards/cardBrands';\nimport formatInputValueByPattern from '../../helpers/cards/formatInputValueByPattern';\nimport {validateAnyIncomplete, validateCardExpiry, validateCardNumber} from '../../helpers/cards/validateCard';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\nimport noop from '../../helpers/noop';\nimport {PaymentsPaymentForm} from '../../layer';\nimport {LangPackKey, _i18n} from '../../lib/langPack';\nimport CheckboxField from '../checkboxField';\nimport confirmationPopup from '../confirmationPopup';\nimport CountryInputField from '../countryInputField';\nimport InputField, {InputFieldOptions, InputState} from '../inputField';\nimport Row from '../row';\nimport {getPaymentBrandIconPath, PaymentButton, PaymentsCredentialsToken} from './payment';\nimport {createVerificationIframe} from './paymentVerification';\nimport {PasswordInputHelpers} from '../passwordInputField';\nimport SettingSection from '../settingSection';\nimport TelegramWebView from '../telegramWebView';\n\nexport type PaymentCardDetails = {\n cardNumber: string;\n cardholderName: string;\n expiryFull: string;\n expiryMonth: string;\n expiryYear: string;\n cvc: string;\n country: string;\n zip: string;\n save?: boolean;\n};\n\nexport type PaymentCardDetailsShort = {\n title: string,\n save?: boolean;\n icon?: string;\n};\n\nexport type PaymentCardDetailsResult = PaymentCardDetails | PaymentCardDetailsShort;\n\nexport class InputFieldCorrected extends InputField {\n private lastKeyDown: string;\n private lastTransformed: ReturnType;\n\n constructor(public options: InputFieldOptions & {\n formatMethod: typeof cardFormattingPatterns['cardNumber'],\n validateMethod?: typeof validateCardNumber,\n errorKeys?: {[code: string]: LangPackKey},\n optional?: boolean,\n onChange?: (transformed: InputFieldCorrected['lastTransformed']) => void,\n onKeyDown?: (e: KeyboardEvent) => void\n }) {\n super(options);\n\n // const handleIncomplete = (t?: any) => {\n // if(\n // (!lastTransformed.value && t) ||\n // lastTransformed.meta.autocorrectComplete ||\n // lastTransformed.meta.error ||\n // optional\n // ) {\n // return;\n // }\n\n\n // };\n\n this.input.addEventListener('keydown', this.onKeyDown);\n this.input.addEventListener('input', this.onInput);\n this.input.addEventListener('blur', this.onBlur);\n }\n\n private onKeyDown = (e: KeyboardEvent) => {\n this.lastKeyDown = e.key;\n this.options.onKeyDown?.(e);\n };\n\n private onInput = () => {\n const value = this.value;\n const deleting = this.lastKeyDown === 'Backspace' && (((this.lastTransformed && this.lastTransformed.value.length) || 0) - value.length) === 1;\n const result = this.lastTransformed = formatInputValueByPattern({\n value: value,\n getPattern: this.options.formatMethod,\n deleting,\n input: this.input\n });\n\n const transformedValue = result.value;\n if(transformedValue !== value) {\n this.setValueSilently(transformedValue);\n\n if(result.selection) {\n (this.input as HTMLInputElement).selectionStart = result.selection.selectionStart;\n (this.input as HTMLInputElement).selectionEnd = result.selection.selectionEnd;\n }\n }\n\n this.validateNew(transformedValue, {ignoreIncomplete: true/* !result.meta.autocorrectComplete */});\n\n this.options.onChange?.(result);\n };\n\n private onBlur = () => {\n const value = this.lastTransformed?.value;\n if(value) {\n this.validateNew(value);\n }\n };\n\n public update() {\n this.onInput();\n }\n\n public validate = () => {\n return this.validateNew();\n };\n\n public validateNew(\n value = this.lastTransformed?.value ?? '',\n t: any = {},\n justReturn?: boolean\n ) {\n let result: ReturnType;\n if(this.options.validateMethod) {\n result = this.options.validateMethod?.(value, t);\n } else {\n result = validateAnyIncomplete(this.lastTransformed, value, t);\n }\n\n if(result?.code) {\n const langPackKey: LangPackKey = this.options.errorKeys?.[result.code];\n !justReturn && this.setState(InputState.Error, langPackKey);\n return false;\n }\n\n !justReturn && this.setState(InputState.Neutral);\n return true;\n }\n}\n\nexport function handleInputFieldsOnChange(inputFields: (CountryInputField | InputField | InputFieldCorrected)[], _onChange: (valid: boolean) => void) {\n const onChange = () => {\n const valid = inputFields.every((inputField) => {\n return 'validateNew' in inputField ? inputField.validateNew(undefined, undefined, true) : inputField.isValid();\n });\n\n _onChange(valid);\n };\n\n inputFields.forEach((inputField) => {\n if(inputField instanceof InputFieldCorrected) {\n const original = inputField.options.onChange;\n inputField.options.onChange = (...args: any[]) => {\n // @ts-ignore\n original?.(...args);\n onChange();\n };\n\n if('update' in inputField) {\n inputField.update();\n }\n } else {\n inputField.input.addEventListener('input', onChange);\n }\n });\n\n return {validate: onChange};\n}\n\nexport function createCountryZipFields(country?: boolean, zip?: boolean) {\n let countryInputField: CountryInputField, postcodeInputField: InputFieldCorrected;\n if(country || zip) {\n if(country) countryInputField = new CountryInputField({\n noPhoneCodes: true,\n onCountryChange: () => {\n postcodeInputField?.update();\n },\n required: true,\n autocomplete: 'country'\n });\n if(zip) postcodeInputField = new InputFieldCorrected({\n label: 'PaymentShippingZipPlaceholder',\n plainText: true,\n inputMode: 'numeric',\n autocomplete: 'postal-code',\n formatMethod: (/* ...args */) => {\n const {country} = countryInputField.getSelected();\n const iso2 = country?.iso2;\n return cardFormattingPatterns.postalCodeFromCountry(iso2 && iso2.toUpperCase());\n }\n });\n }\n\n return {countryInputField, postcodeInputField};\n}\n\nexport type PaymentsNativeProvider = 'stripe' | 'smartglocal';\nexport type PaymentsNativeParams = {\n need_country?: boolean,\n need_zip?: boolean,\n need_cardholder_name?: boolean,\n publishable_key?: string, // stripe\n public_token?: string, // smartglocal\n gpay_params: string,\n};\nconst SUPPORTED_NATIVE_PROVIDERS: Set = new Set(['stripe', 'smartglocal']);\n\nexport default class PopupPaymentCard extends PopupElement<{\n finish: (obj: {token: any, card: PaymentCardDetailsResult}) => void\n}> {\n protected telegramWebView: TelegramWebView;\n\n constructor(private paymentForm: PaymentsPaymentForm, private savedCard?: PaymentCardDetails) {\n super('popup-payment popup-payment-card', {\n closable: true,\n overlayClosable: true,\n body: true,\n scrollable: SUPPORTED_NATIVE_PROVIDERS.has(paymentForm.native_provider as PaymentsNativeProvider),\n title: 'PaymentCardInfo'\n });\n\n if(SUPPORTED_NATIVE_PROVIDERS.has(paymentForm.native_provider as PaymentsNativeProvider)) {\n this.d();\n } else {\n const telegramWebView = this.telegramWebView = createVerificationIframe({\n url: paymentForm.url\n });\n\n telegramWebView.addEventListener('payment_form_submit', (data) => {\n const cardOut = {title: data.title, save: false} as any as PaymentCardDetails;\n this.dispatchEvent('finish', {\n token: data.credentials,\n card: cardOut\n });\n\n this.hide();\n\n if(paymentForm.pFlags.can_save_credentials) {\n confirmationPopup({\n titleLangKey: 'PaymentCardSavePaymentInformation',\n descriptionLangKey: 'PaymentCardSavePaymentInformationInfoLine1',\n button: {\n langKey: 'Save'\n }\n }).then(() => {\n cardOut.save = true;\n }, noop);\n }\n });\n\n // putPreloader(this.body, true);\n this.body.append(telegramWebView.iframe);\n this.show();\n telegramWebView.onMount();\n }\n }\n\n protected destroy() {\n this.telegramWebView?.destroy();\n return super.destroy();\n }\n\n private d() {\n const savedCard = this.savedCard;\n const cardSection = new SettingSection({name: 'PaymentInfo.Card.Title', noDelimiter: true, noShadow: true});\n\n const nativeParams: PaymentsNativeParams = JSON.parse(this.paymentForm.native_params.data);\n\n let lastBrand: string, brandIconTempId = 0, lastBrandImg: HTMLImageElement;\n const setBrandIcon = (brand: string) => {\n if(lastBrand === brand) {\n return;\n }\n\n const tempId = ++brandIconTempId;\n lastBrand = brand;\n\n const path = getPaymentBrandIconPath(brand);\n if(!path) {\n if(lastBrandImg) {\n lastBrandImg.remove();\n lastBrandImg = undefined;\n }\n\n return;\n }\n\n const img = new Image();\n img.classList.add('input-field-icon');\n renderImageFromUrlPromise(img, path, false).then(() => {\n if(brandIconTempId !== tempId) {\n return;\n }\n\n if(lastBrandImg) {\n lastBrandImg.replaceWith(img);\n } else {\n cardInputField.container.append(img);\n }\n\n lastBrandImg = img;\n });\n };\n const cardInputField = new InputFieldCorrected({\n label: 'PaymentCardNumber',\n plainText: true,\n inputMode: 'numeric',\n autocomplete: 'cc-number',\n formatMethod: cardFormattingPatterns.cardNumber,\n validateMethod: validateCardNumber,\n errorKeys: {\n invalid: 'PaymentCard.Error.Invalid',\n incomplete: 'PaymentCard.Error.Incomplete'\n },\n onChange: (transformed) => {\n setBrandIcon(detectUnifiedCardBrand(transformed.value));\n cvcInputField.update(); // format cvc\n }\n });\n\n let nameInputField: InputField;\n if(nativeParams.need_cardholder_name) nameInputField = new InputField({\n label: 'Checkout.NewCard.CardholderNamePlaceholder',\n maxLength: 255,\n required: true,\n autocomplete: 'cc-name'\n });\n\n const expireInputField = new InputFieldCorrected({\n label: 'SecureId.Identity.Placeholder.ExpiryDate',\n plainText: true,\n inputMode: 'numeric',\n autocomplete: 'cc-exp',\n formatMethod: cardFormattingPatterns.cardExpiry,\n validateMethod: validateCardExpiry\n });\n\n // handle autocomplete: 01/2345 -> 01/45\n expireInputField.input.addEventListener('input', () => {\n let value = expireInputField.value;\n if(value.length < 5) {\n return;\n }\n\n const splitted = value.split('/');\n if(splitted[1].length !== 4) {\n return;\n }\n\n value = [splitted[0], splitted[1].slice(2)].join('/');\n expireInputField.setValueSilently(value);\n }, {capture: true});\n\n const cvcInputField = new InputFieldCorrected({\n labelText: 'CVC',\n plainText: true,\n inputMode: 'numeric',\n autocomplete: 'cc-csc',\n name: 'cvc',\n formatMethod: () => cardFormattingPatterns.cardCvc(cardInputField.value)\n // validateMethod: (...args) => _5AH3.a.cardCvc(cardInputField.value)(...args)\n });\n\n const passwordHelpers = new PasswordInputHelpers(cvcInputField.container, cvcInputField.input as HTMLInputElement);\n\n const switchFocusOrder: (InputFieldCorrected | InputField)[] = [\n cardInputField,\n expireInputField,\n cvcInputField,\n nameInputField\n ].filter(Boolean);\n switchFocusOrder.forEach((inputField) => {\n const onKeyDown = (e: KeyboardEvent) => {\n if(!inputField.value && e.key === 'Backspace') {\n const previousInputField = switchFocusOrder[switchFocusOrder.indexOf(inputField) - 1];\n if(previousInputField) {\n // previousInputField.value = previousInputField.value.slice(0, -1);\n placeCaretAtEnd(previousInputField.input, true);\n }\n }\n };\n\n if(inputField instanceof InputFieldCorrected) {\n inputField.options.onKeyDown = onKeyDown;\n\n const original = inputField.options.onChange;\n inputField.options.onChange = (transformed) => {\n original?.(transformed);\n\n if(document.activeElement === inputField.input && transformed.meta.autocorrectComplete) {\n for(let i = switchFocusOrder.indexOf(inputField), length = switchFocusOrder.length; i < length; ++i) {\n const nextInputField = switchFocusOrder[i];\n if(\n nextInputField instanceof InputFieldCorrected ?\n !nextInputField.validateNew(undefined, undefined, true) :\n !nextInputField.value\n ) {\n placeCaretAtEnd(nextInputField.input, true);\n break;\n }\n }\n }\n };\n } else {\n inputField.input.addEventListener('keydown', onKeyDown);\n }\n });\n\n const inputFieldsRow = document.createElement('div');\n inputFieldsRow.classList.add('input-fields-row');\n inputFieldsRow.append(expireInputField.container, cvcInputField.container);\n\n const form = document.createElement('form');\n form.append(...[\n cardInputField.container,\n inputFieldsRow,\n nameInputField?.container\n ].filter(Boolean))\n\n cardSection.content.append(form);\n\n let billingSection: SettingSection;\n // let saveCheckboxField: CheckboxField;\n const {countryInputField, postcodeInputField} = createCountryZipFields(nativeParams.need_country, nativeParams.need_zip);\n if(nativeParams.need_country || nativeParams.need_zip) {\n billingSection = new SettingSection({name: 'PaymentInfo.Billing.Title', noDelimiter: true, noShadow: true});\n\n // const inputFieldsRow2 = inputFieldsRow.cloneNode() as HTMLElement;\n // inputFieldsRow2.append(countryInputField.container, postcodeInputField.container);\n // billingSection.content.append(inputFieldsRow2);\n billingSection.content.append(...[countryInputField, postcodeInputField].filter(Boolean).map((i) => i.container));\n }\n\n const canSave = !!this.paymentForm.pFlags.can_save_credentials;\n const saveCheckboxField = new CheckboxField({\n text: 'PaymentCardSavePaymentInformation',\n checked: !!canSave\n });\n const saveRow = new Row({\n checkboxField: saveCheckboxField,\n subtitleLangKey: canSave ? 'PaymentCardSavePaymentInformationInfoLine1' : 'Checkout.2FA.Text'\n });\n\n if(!canSave) {\n saveRow.container.classList.add('is-disabled');\n }\n\n (billingSection || cardSection).content.append(saveRow.container);\n\n this.scrollable.append(...[cardSection, billingSection].filter(Boolean).map((s) => s.container));\n\n const payButton = PaymentButton({\n key: 'PaymentInfo.Done',\n onClick: async() => {\n const data: PaymentCardDetails = {\n cardNumber: cardInputField.value,\n expiryFull: expireInputField.value,\n expiryMonth: expireInputField.value.split('/')[0],\n expiryYear: expireInputField.value.split('/')[1],\n cvc: cvcInputField.value,\n\n cardholderName: nameInputField?.value,\n country: countryInputField?.value,\n zip: postcodeInputField?.value,\n\n save: saveCheckboxField?.checked\n };\n\n const nativeProvider: PaymentsNativeProvider = this.paymentForm.native_provider as any;\n let out: PaymentsCredentialsToken;\n if(nativeProvider === 'stripe') {\n const url = new URL('https://api.stripe.com/v1/tokens');\n url.search = new URLSearchParams({\n 'card[number]': data.cardNumber,\n 'card[exp_month]': data.expiryMonth,\n 'card[exp_year]': data.expiryYear,\n 'card[cvc]': data.cvc,\n 'card[address_zip]': data.zip,\n 'card[address_country]': data.country,\n 'card[name]': data.cardholderName\n }).toString();\n\n const response = await fetch(url.toString(), {\n method: 'POST',\n credentials: 'same-origin',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'Authorization': `Bearer ${nativeParams.publishable_key}`\n }\n });\n\n out = await response.json();\n } else if(nativeProvider === 'smartglocal') {\n const params = {\n card: {\n number: data.cardNumber.replace(/[^\\d]+/g, ''),\n expiration_month: data.expiryMonth,\n expiration_year: data.expiryYear,\n security_code: data.cvc.replace(/[^\\d]+/g, '')\n }\n };\n\n const url = /* DEBUG_PAYMENT_SMART_GLOCAL */false ?\n 'https://tgb-playground.smart-glocal.com/cds/v1/tokenize/card' :\n 'https://tgb.smart-glocal.com/cds/v1/tokenize/card';\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n 'X-PUBLIC-TOKEN': nativeParams.public_token\n },\n body: JSON.stringify(params)\n });\n\n const json: { // smartglocal\n data: {\n info: {\n card_network: string,\n card_type: string,\n masked_card_number: string\n },\n token: string\n },\n status: 'ok'\n } = await response.json();\n\n out = {type: 'card', token: json.data.token}\n }\n\n this.dispatchEvent('finish', {token: out, card: data});\n this.hide();\n }\n });\n\n const inputFields = ([\n cardInputField,\n nameInputField,\n expireInputField,\n cvcInputField,\n countryInputField,\n postcodeInputField\n ] as const).filter(Boolean);\n handleInputFieldsOnChange(inputFields, (valid) => {\n payButton.disabled = !valid;\n // payButton.classList.toggle('btn-disabled', !valid);\n });\n\n if(savedCard) {\n cardInputField.value = savedCard.cardNumber;\n expireInputField.value = savedCard.expiryFull;\n cvcInputField.value = savedCard.cvc;\n nameInputField && (nameInputField.value = savedCard.cardholderName);\n countryInputField && (countryInputField.value = savedCard.country);\n postcodeInputField && (postcodeInputField.value = savedCard.zip);\n }\n\n this.body.append(this.btnConfirmOnEnter = payButton);\n\n this.show();\n\n if(!cardInputField.validateNew(undefined, undefined, true)) {\n placeCaretAtEnd(cardInputField.input);\n }\n }\n}\n","import formatValueByPattern from './formatValueByPattern';\n\nexport default function formatInputValueByPattern(options: {\n value: string,\n getPattern: Parameters[0],\n deleting?: boolean,\n input?: HTMLElement\n}) {\n const {value: originalValue, getPattern, deleting, input} = options;\n const pushRest = !deleting && !!originalValue.length;\n const result = formatValueByPattern(getPattern, originalValue, {\n selectionStart: input ? (input as HTMLInputElement).selectionStart : 0,\n selectionEnd: input ? (input as HTMLInputElement).selectionEnd : 0\n }, pushRest)\n const {value, selection} = result;\n\n return {\n value,\n meta: {\n autocorrectComplete: result.autocorrectComplete,\n empty: !value\n },\n selection\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 '.';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {AccountPassword, AccountTmpPassword} from '../../layer';\nimport {InputState} from '../inputField';\nimport PasswordInputField from '../passwordInputField';\nimport SettingSection from '../settingSection';\nimport {PaymentButton} from './payment';\n\nexport default class PopupPaymentCardConfirmation extends PopupElement<{\n finish: (tmpPassword: AccountTmpPassword) => void\n}> {\n constructor(card: string, passwordState: AccountPassword) {\n super('popup-payment popup-payment-card-confirmation', {\n closable: true,\n overlayClosable: true,\n body: true,\n scrollable: true,\n title: 'Checkout.PasswordEntry.Title'\n });\n\n const section = new SettingSection({noDelimiter: true, noShadow: true, caption: 'Checkout.PasswordEntry.Text', captionArgs: [card]});\n const passwordInputField = new PasswordInputField({labelText: passwordState.hint});\n section.content.append(passwordInputField.container);\n this.scrollable.append(section.container);\n\n const onInput = () => {\n payButton.disabled = !passwordInputField.value;\n passwordInputField.setState(InputState.Neutral);\n };\n\n passwordInputField.input.addEventListener('input', onInput);\n\n const payButton = PaymentButton({\n key: 'Checkout.PasswordEntry.Pay',\n onClick: async() => {\n try {\n const inputCheckPassword = await this.managers.passwordManager.getInputCheckPassword(passwordInputField.value, passwordState);\n const tmpPassword = await this.managers.apiManager.invokeApi('account.getTmpPassword', {\n password: inputCheckPassword,\n period: 60\n });\n\n this.dispatchEvent('finish', tmpPassword);\n this.hide();\n } catch(err) {\n if((err as ApiError).type === 'PASSWORD_HASH_INVALID') {\n (err as ApiError).handled = true;\n passwordInputField.setError('PASSWORD_HASH_INVALID');\n }\n\n throw err;\n }\n }\n });\n this.body.append(this.btnConfirmOnEnter = payButton);\n\n onInput();\n\n this.show();\n\n placeCaretAtEnd(passwordInputField.input);\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 '.';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {InputInvoice, PaymentRequestedInfo, PaymentsPaymentForm, PaymentsValidatedRequestedInfo} from '../../layer';\nimport matchEmail from '../../lib/richTextProcessor/matchEmail';\nimport CheckboxField from '../checkboxField';\nimport CountryInputField from '../countryInputField';\nimport InputField from '../inputField';\nimport Row from '../row';\nimport SettingSection from '../settingSection';\nimport TelInputField from '../telInputField';\nimport {PaymentButton} from './payment';\nimport {createCountryZipFields, handleInputFieldsOnChange, InputFieldCorrected} from './paymentCard';\n\nexport type PaymentShippingAddress = PaymentRequestedInfo;\n\ntype ShippingFocusField = 'name' | 'email' | 'phone';\n\nexport default class PopupPaymentShipping extends PopupElement<{\n finish: (o: {shippingAddress: PaymentShippingAddress, requestedInfo: PaymentsValidatedRequestedInfo}) => void\n}> {\n constructor(\n private paymentForm: PaymentsPaymentForm,\n private inputInvoice: InputInvoice,\n private focus?: ShippingFocusField\n ) {\n super('popup-payment popup-payment-shipping', {\n closable: true,\n overlayClosable: true,\n body: true,\n scrollable: true,\n title: 'PaymentShippingInfo'\n });\n\n this.d();\n }\n\n private d() {\n const paymentForm = this.paymentForm;\n const invoice = paymentForm.invoice;\n const savedInfo = this.paymentForm.saved_info;\n\n let addressSection: SettingSection,\n address1InputField: InputField,\n address2InputField: InputField,\n cityInputField: InputField,\n stateInputField: InputField,\n countryInputField: CountryInputField,\n postcodeInputField: InputFieldCorrected;\n if(invoice.pFlags.shipping_address_requested) {\n addressSection = new SettingSection({name: 'PaymentShippingAddress', noDelimiter: true, noShadow: true});\n address1InputField = new InputField({label: 'PaymentShippingAddress1Placeholder', maxLength: 64, required: true});\n address2InputField = new InputField({label: 'PaymentShippingAddress2Placeholder', maxLength: 64});\n cityInputField = new InputField({label: 'PaymentShippingCityPlaceholder', maxLength: 64, required: true});\n stateInputField = new InputField({label: 'PaymentShippingStatePlaceholder', maxLength: 64});\n const res = createCountryZipFields(true, true);\n countryInputField = res.countryInputField;\n postcodeInputField = res.postcodeInputField;\n\n addressSection.content.append(...[\n address1InputField,\n address2InputField,\n cityInputField,\n stateInputField,\n countryInputField,\n postcodeInputField\n ].filter(Boolean).map((inputField) => inputField.container));\n }\n\n let receiverSection: SettingSection;\n let nameInputField: InputField, emailInputField: InputField, telInputField: TelInputField;\n if([invoice.pFlags.name_requested, invoice.pFlags.email_requested, invoice.pFlags.phone_requested].includes(true)) {\n receiverSection = new SettingSection({name: 'PaymentShippingReceiver', noDelimiter: true, noShadow: true});\n\n const validateEmail = () => {\n const value = emailInputField.value;\n const match = matchEmail(value);\n if(!match || match[0].length !== value.length) {\n return false;\n }\n\n return true;\n };\n\n const validatePhone = () => {\n return !!telInputField.value.match(/\\d/);\n };\n\n if(invoice.pFlags.name_requested) nameInputField = new InputField({label: 'PaymentShippingName', maxLength: 256, required: true});\n if(invoice.pFlags.email_requested) emailInputField = new InputField({label: 'PaymentShippingEmailPlaceholder', maxLength: 64, required: true, validate: validateEmail});\n if(invoice.pFlags.phone_requested) telInputField = new TelInputField({required: true, validate: validatePhone});\n\n receiverSection.content.append(...[\n nameInputField,\n emailInputField,\n telInputField\n ].filter(Boolean).map((inputField) => inputField.container));\n }\n\n const saveCheckboxField = new CheckboxField({\n text: 'PaymentShippingSave',\n checked: true\n });\n const saveRow = new Row({\n checkboxField: saveCheckboxField,\n subtitleLangKey: 'PaymentShippingSaveInfo'\n });\n\n (receiverSection || addressSection).content.append(saveRow.container);\n\n this.scrollable.append(...[addressSection, receiverSection].filter(Boolean).map((section) => section.container));\n\n const payButton = PaymentButton({\n key: 'PaymentInfo.Done',\n onClick: async() => {\n const selectedCountry = countryInputField && countryInputField.getSelected().country;\n const data: PaymentShippingAddress = {\n _: 'paymentRequestedInfo',\n shipping_address: selectedCountry && {\n _: 'postAddress',\n street_line1: address1InputField.value,\n street_line2: address2InputField.value,\n city: cityInputField.value,\n state: stateInputField.value,\n // country: countryInputField.value,\n country_iso2: selectedCountry?.iso2,\n post_code: postcodeInputField.value\n },\n name: nameInputField?.value,\n email: emailInputField?.value,\n phone: telInputField?.value\n };\n\n try {\n const requestedInfo = await this.managers.appPaymentsManager.validateRequestedInfo(this.inputInvoice, data, saveCheckboxField?.checked);\n\n this.dispatchEvent('finish', {\n shippingAddress: data,\n requestedInfo\n });\n\n this.hide();\n } catch(err: any) {\n const errorMap: {[err: string]: InputField} = {\n ADDRESS_STREET_LINE1_INVALID: address1InputField,\n ADDRESS_STREET_LINE2_INVALID: address2InputField,\n ADDRESS_COUNTRY_INVALID: countryInputField,\n ADDRESS_CITY_INVALID: cityInputField,\n ADDRESS_STATE_INVALID: stateInputField,\n ADDRESS_POSTCODE_INVALID: postcodeInputField,\n\n REQ_INFO_NAME_INVALID: nameInputField,\n REQ_INFO_EMAIL_INVALID: emailInputField,\n REQ_INFO_PHONE_INVALID: telInputField\n };\n\n const inputField = errorMap[(err as ApiError).type];\n if(inputField) {\n inputField.setError();\n (err as any).handled = true;\n }\n\n throw err;\n }\n }\n });\n this.body.append(this.btnConfirmOnEnter = payButton);\n\n if(savedInfo) {\n const shippingAddress = savedInfo.shipping_address;\n if(shippingAddress) {\n address1InputField.value = shippingAddress.street_line1;\n address2InputField.value = shippingAddress.street_line2;\n cityInputField.value = shippingAddress.city;\n stateInputField.value = shippingAddress.state;\n countryInputField.selectCountryByIso2(shippingAddress.country_iso2);\n postcodeInputField.value = shippingAddress.post_code;\n }\n\n savedInfo.name && nameInputField && (nameInputField.value = savedInfo.name);\n savedInfo.email && emailInputField && (emailInputField.value = savedInfo.email);\n savedInfo.phone && telInputField && (telInputField.value = savedInfo.phone);\n }\n\n const {validate} = handleInputFieldsOnChange([\n address1InputField,\n address2InputField,\n cityInputField,\n stateInputField,\n countryInputField,\n postcodeInputField,\n nameInputField,\n emailInputField,\n telInputField\n ].filter(Boolean), (valid) => {\n payButton.disabled = !valid;\n });\n\n validate();\n\n this.show();\n\n let focusField: InputField;\n if(this.focus) {\n const focusMap: {[field in ShippingFocusField]?: InputField} = {\n name: nameInputField,\n email: emailInputField,\n phone: telInputField\n };\n\n focusField = focusMap[this.focus];\n } else {\n focusField = address1InputField;\n }\n\n if(focusField) {\n placeCaretAtEnd(focusField.input);\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 PopupElement from '.';\nimport accumulate from '../../helpers/array/accumulate';\nimport paymentsWrapCurrencyAmount from '../../helpers/paymentsWrapCurrencyAmount';\nimport {PaymentsPaymentForm, PaymentsValidatedRequestedInfo, ShippingOption} from '../../layer';\nimport RadioField from '../radioField';\nimport Row, {RadioFormFromRows} from '../row';\nimport SettingSection from '../settingSection';\nimport {PaymentButton} from './payment';\n\nexport default class PopupPaymentShippingMethods extends PopupElement<{\n finish: (shippingOption: ShippingOption) => void\n}> {\n constructor(\n private paymentForm: PaymentsPaymentForm,\n private requestedInfo: PaymentsValidatedRequestedInfo,\n private shippingOption: ShippingOption\n ) {\n super('popup-payment popup-payment-shipping-methods', {\n closable: true,\n overlayClosable: true,\n body: true,\n scrollable: true,\n title: 'PaymentShippingMethod'\n });\n\n this.d();\n }\n\n private d() {\n const section = new SettingSection({name: 'PaymentCheckoutShippingMethod', noDelimiter: true, noShadow: true});\n\n const rows = this.requestedInfo.shipping_options.map((shippingOption) => {\n return new Row({\n radioField: new RadioField({\n text: shippingOption.title,\n name: 'shipping-method',\n value: shippingOption.id\n }),\n subtitle: paymentsWrapCurrencyAmount(\n accumulate(shippingOption.prices.map(({amount}) => +amount), 0),\n this.paymentForm.invoice.currency\n )\n });\n });\n\n let lastShippingId: string;\n const form = RadioFormFromRows(rows, (value) => {\n lastShippingId = value;\n });\n\n if(this.shippingOption) {\n rows.find((row) => row.radioField.input.value === this.shippingOption.id).radioField.checked = true;\n } else {\n rows[0].radioField.checked = true;\n }\n\n section.content.append(form);\n\n this.scrollable.append(section.container);\n\n const payButton = PaymentButton({\n key: 'PaymentInfo.Done',\n onClick: () => {\n this.dispatchEvent('finish', this.requestedInfo.shipping_options.find((option) => option.id === lastShippingId));\n this.hide();\n }\n });\n this.body.append(this.btnConfirmOnEnter = payButton);\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 PopupElement from '.';\nimport Currencies from '../../config/currencies';\nimport {FontFamily, FontSize} from '../../config/font';\nimport accumulate from '../../helpers/array/accumulate';\nimport getTextWidth from '../../helpers/canvas/getTextWidth';\nimport {detectUnifiedCardBrand} from '../../helpers/cards/cardBrands';\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport findUpAsChild from '../../helpers/dom/findUpAsChild';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport toggleDisability from '../../helpers/dom/toggleDisability';\nimport {formatPhoneNumber} from '../../helpers/formatPhoneNumber';\nimport paymentsWrapCurrencyAmount from '../../helpers/paymentsWrapCurrencyAmount';\nimport ScrollSaver from '../../helpers/scrollSaver';\nimport tsNow from '../../helpers/tsNow';\nimport {AccountTmpPassword, InputInvoice, InputPaymentCredentials, LabeledPrice, Message, MessageMedia, PaymentRequestedInfo, PaymentSavedCredentials, PaymentsPaymentForm, PaymentsPaymentReceipt, PaymentsValidatedRequestedInfo, PostAddress, ShippingOption} from '../../layer';\nimport I18n, {i18n, LangPackKey, _i18n} from '../../lib/langPack';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\nimport rootScope from '../../lib/rootScope';\nimport AvatarElement from '../avatar';\nimport Button from '../button';\nimport CheckboxField from '../checkboxField';\nimport PeerTitle from '../peerTitle';\nimport {putPreloader} from '../putPreloader';\nimport Row from '../row';\nimport {toastNew} from '../toast';\nimport wrapPeerTitle from '../wrappers/peerTitle';\nimport wrapPhoto from '../wrappers/photo';\nimport PopupPaymentCard, {PaymentCardDetails, PaymentCardDetailsResult} from './paymentCard';\nimport PopupPaymentCardConfirmation from './paymentCardConfirmation';\nimport PopupPaymentShipping, {PaymentShippingAddress} from './paymentShipping';\nimport PopupPaymentShippingMethods from './paymentShippingMethods';\nimport PopupPaymentVerification from './paymentVerification';\n\nconst iconPath = 'assets/img/';\nconst icons = [\n 'amex',\n 'card',\n 'diners',\n 'discover',\n 'jcb',\n 'mastercard',\n 'visa',\n 'unionpay',\n 'mir',\n 'logo'\n];\n\nexport function getPaymentBrandIconPath(brand: string) {\n if(!icons.includes(brand)) {\n return;\n }\n\n return `${iconPath}${brand}.svg`;\n}\n\nexport function PaymentButton(options: {\n onClick: () => Promise | void,\n key?: LangPackKey,\n textEl?: I18n.IntlElement\n}) {\n const textEl = options.textEl ?? new I18n.IntlElement({key: options.key ?? 'PaymentInfo.Done'});\n const key = textEl.key;\n const payButton = Button('btn-primary btn-color-primary payment-item-pay');\n payButton.append(textEl.element);\n attachClickEvent(payButton, async() => {\n const result = options.onClick();\n if(!(result instanceof Promise)) {\n return;\n }\n\n const d = putPreloader(payButton);\n const toggle = toggleDisability([payButton], true);\n textEl.compareAndUpdate({key: 'PleaseWait'});\n try {\n await result;\n } catch(err) {\n if(!(err as any).handled) {\n console.error('payment button error', err);\n }\n\n toggle();\n textEl.compareAndUpdate({key});\n d.remove();\n }\n });\n return payButton;\n}\n\nexport type PaymentsCredentialsToken = {type: 'card', token?: string, id?: string};\n\nexport default class PopupPayment extends PopupElement {\n private tipButtonsMap: Map;\n\n constructor(\n private message: Message.message,\n private inputInvoice: InputInvoice,\n private paymentForm?: PaymentsPaymentForm | PaymentsPaymentReceipt,\n private isReceipt?: boolean\n ) {\n super('popup-payment', {\n closable: true,\n overlayClosable: true,\n body: true,\n scrollable: true,\n title: true\n });\n\n this.tipButtonsMap = new Map();\n this.d().catch((err) => {\n console.error('payment popup error', err);\n this.hide();\n });\n }\n\n private async d() {\n this.element.classList.add('is-loading');\n this.show();\n\n let confirmed = false;\n const onConfirmed = () => {\n if(confirmed) {\n return;\n }\n\n confirmed = true;\n if(popupPaymentVerification) {\n popupPaymentVerification.hide();\n }\n\n this.hide();\n };\n\n let {paymentForm, message} = this;\n\n if(message) {\n this.listenerSetter.add(rootScope)('payment_sent', ({peerId, mid}) => {\n if(message.peerId === peerId && message.mid === mid) {\n onConfirmed();\n }\n });\n }\n\n const mediaInvoice = message?.media as MessageMedia.messageMediaInvoice;\n const isReceipt = this.isReceipt ??\n (\n mediaInvoice ?\n !!mediaInvoice.receipt_msg_id || mediaInvoice.extended_media?._ === 'messageExtendedMedia' :\n paymentForm._ === 'payments.paymentReceipt'\n );\n const isTest = mediaInvoice ? mediaInvoice.pFlags.test : paymentForm.invoice.pFlags.test;\n\n const photo = mediaInvoice ? mediaInvoice.photo : paymentForm.photo;\n const title = mediaInvoice ? mediaInvoice.title : paymentForm.title;\n const description = mediaInvoice ? mediaInvoice.description : paymentForm.description;\n\n _i18n(this.title, isReceipt ? 'PaymentReceipt' : 'PaymentCheckout');\n if(isTest) {\n this.title.append(' (Test)');\n }\n\n const className = 'payment-item';\n\n const itemEl = document.createElement('div');\n itemEl.classList.add(className);\n\n const detailsClassName = className + '-details';\n const details = document.createElement('div');\n details.classList.add(detailsClassName);\n\n let photoEl: HTMLElement;\n if(photo) {\n photoEl = document.createElement('div');\n photoEl.classList.add(detailsClassName + '-photo', 'media-container-contain');\n wrapPhoto({\n photo: photo,\n container: photoEl,\n boxWidth: 100,\n boxHeight: 100,\n size: {_: 'photoSizeEmpty', type: ''}\n });\n details.append(photoEl);\n }\n\n const linesClassName = detailsClassName + '-lines';\n const linesEl = document.createElement('div');\n linesEl.classList.add(linesClassName);\n\n const titleEl = document.createElement('div');\n titleEl.classList.add(linesClassName + '-title');\n\n const descriptionEl = document.createElement('div');\n descriptionEl.classList.add(linesClassName + '-description');\n\n const botName = document.createElement('div');\n botName.classList.add(linesClassName + '-bot-name');\n\n linesEl.append(titleEl, descriptionEl, botName);\n\n setInnerHTML(titleEl, wrapEmojiText(title));\n setInnerHTML(descriptionEl, wrapEmojiText(description));\n\n const peerTitle = new PeerTitle();\n botName.append(peerTitle.element);\n\n details.append(linesEl);\n itemEl.append(details);\n this.scrollable.append(itemEl);\n\n const preloaderContainer = document.createElement('div');\n preloaderContainer.classList.add(className + '-preloader-container');\n const preloader = putPreloader(preloaderContainer, true);\n this.scrollable.container.append(preloaderContainer);\n\n const inputInvoice = this.inputInvoice;\n if(!paymentForm) {\n if(isReceipt) paymentForm = await this.managers.appPaymentsManager.getPaymentReceipt(message.peerId, mediaInvoice.receipt_msg_id || (inputInvoice as InputInvoice.inputInvoiceMessage).msg_id);\n else paymentForm = await this.managers.appPaymentsManager.getPaymentForm(inputInvoice);\n this.paymentForm = paymentForm;\n }\n\n let savedInfo = (paymentForm as PaymentsPaymentForm).saved_info || (paymentForm as PaymentsPaymentReceipt).info;\n const savedCredentials = (paymentForm as PaymentsPaymentForm).saved_credentials?.[0];\n let [lastRequestedInfo, passwordState, providerPeerTitle] = await Promise.all([\n !isReceipt && savedInfo && this.managers.appPaymentsManager.validateRequestedInfo(inputInvoice, savedInfo),\n savedCredentials && this.managers.passwordManager.getState(),\n wrapPeerTitle({peerId: paymentForm.provider_id.toPeerId()})\n ]);\n\n // console.log(paymentForm, lastRequestedInfo);\n\n await peerTitle.update({peerId: paymentForm.bot_id.toPeerId()});\n preloaderContainer.remove();\n this.element.classList.remove('is-loading');\n\n const wrapAmount = (amount: string | number, skipSymbol?: boolean) => {\n return paymentsWrapCurrencyAmount(amount, currency, skipSymbol);\n };\n\n const {invoice} = paymentForm;\n const currency = invoice.currency;\n\n const isRecurring = invoice.pFlags.recurring && !isReceipt;\n\n await peerTitle.update({peerId: paymentForm.bot_id.toPeerId()});\n const peerTitle2 = isRecurring ? await wrapPeerTitle({peerId: paymentForm.bot_id.toPeerId()}) : undefined;\n preloaderContainer.remove();\n this.element.classList.remove('is-loading');\n\n const makeLabel = () => {\n const labelEl = document.createElement('div');\n labelEl.classList.add(pricesClassName + '-price');\n\n const left = document.createElement('span');\n const right = document.createElement('span');\n labelEl.append(left, right);\n return {label: labelEl, left, right};\n };\n\n const pricesClassName = className + '-prices';\n const prices = document.createElement('div');\n prices.classList.add(pricesClassName);\n const makePricesElements = (prices: LabeledPrice[]) => {\n return prices.map((price) => {\n const {amount, label} = price;\n\n const _label = makeLabel();\n _label.left.textContent = label;\n\n const wrappedAmount = wrapAmount(amount);\n _label.right.textContent = wrappedAmount;\n\n return _label.label;\n });\n };\n\n const pricesElements = makePricesElements(invoice.prices);\n\n let getTipsAmount = (): number => 0;\n let shippingAmount = 0;\n\n const getTotalTotal = () => totalAmount + getTipsAmount() + shippingAmount;\n const setTotal = () => {\n const wrapped = wrapAmount(getTotalTotal());\n totalLabel.right.textContent = wrapped;\n payI18n.compareAndUpdate({\n key: 'PaymentCheckoutPay',\n args: [wrapped]\n });\n };\n\n const payI18n = new I18n.IntlElement();\n\n const totalLabel = makeLabel();\n totalLabel.label.classList.add('is-total');\n _i18n(totalLabel.left, 'PaymentTransactionTotal');\n const totalAmount = accumulate(invoice.prices.map(({amount}) => +amount), 0);\n\n const canTip = (invoice.max_tip_amount !== undefined && !isReceipt) || !!(paymentForm as PaymentsPaymentReceipt).tip_amount;\n if(canTip) {\n const tipsClassName = className + '-tips';\n\n const currencyData = Currencies[currency];\n\n getTipsAmount = () => +getInputValue().replace(/\\D/g, '');\n\n const getInputValue = () => {\n // return input.textContent;\n return input.value;\n };\n\n const setInputWidth = () => {\n const width = getTextWidth(getInputValue(), `500 ${FontSize} ${FontFamily}`);\n input.style.width = width + 'px';\n };\n\n const setInputValue = (amount: string | number) => {\n amount = Math.min(+amount, +invoice.max_tip_amount);\n const wrapped = wrapAmount(amount, true);\n\n input.value = wrapped;\n // input.textContent = wrapped;\n if(document.activeElement === input) {\n placeCaretAtEnd(input);\n }\n\n unsetActiveTip && unsetActiveTip();\n const tipEl = this.tipButtonsMap.get(amount);\n if(tipEl) {\n tipEl.classList.add('active');\n }\n\n setInputWidth();\n setTotal();\n };\n\n const tipsLabel = makeLabel();\n _i18n(tipsLabel.left, isReceipt ? 'PaymentTip' : 'PaymentTipOptional');\n const input = document.createElement('input');\n input.type = 'tel';\n // const input: HTMLElement = document.createElement('div');\n // input.contentEditable = 'true';\n input.classList.add('input-clear', tipsClassName + '-input');\n tipsLabel.right.append(input);\n\n if(!isReceipt) {\n tipsLabel.label.style.cursor = 'text';\n } else {\n tipsLabel.label.classList.add('disable-hover');\n }\n\n tipsLabel.label.addEventListener('mousedown', (e) => {\n if(!findUpAsChild(e.target as HTMLElement, input)) {\n placeCaretAtEnd(input);\n }\n });\n\n const haveToIgnoreEvents = input instanceof HTMLInputElement ? 1 : 2;\n const onSelectionChange = () => {\n if(ignoreNextSelectionChange) {\n --ignoreNextSelectionChange;\n return;\n }\n\n // setTimeout(() => {\n ignoreNextSelectionChange = haveToIgnoreEvents;\n placeCaretAtEnd(input);\n // }, 0);\n };\n\n const onFocus = () => {\n // cancelEvent(e);\n setTimeout(() => {\n ignoreNextSelectionChange = haveToIgnoreEvents;\n placeCaretAtEnd(input);\n document.addEventListener('selectionchange', onSelectionChange);\n }, 0);\n };\n\n const onFocusOut = () => {\n input.addEventListener('focus', onFocus, {once: true});\n document.removeEventListener('selectionchange', onSelectionChange);\n };\n\n let ignoreNextSelectionChange: number;\n input.addEventListener('focusout', onFocusOut);\n onFocusOut();\n\n input.addEventListener('input', () => {\n setInputValue(getTipsAmount());\n });\n\n const s = [currencyData.symbol, currencyData.space_between ? ' ' : ''];\n if(!currencyData.symbol_left) s.reverse();\n tipsLabel.right[currencyData.symbol_left ? 'prepend' : 'append'](s.join(''));\n\n pricesElements.push(tipsLabel.label);\n\n //\n let unsetActiveTip: () => void;\n if(!isReceipt) {\n const tipsEl = document.createElement('div');\n tipsEl.classList.add(tipsClassName);\n\n const tipClassName = tipsClassName + '-tip';\n const tipButtons = invoice.suggested_tip_amounts.map((tipAmount) => {\n const button = Button(tipClassName, {noRipple: true});\n button.textContent = wrapAmount(tipAmount);\n\n this.tipButtonsMap.set(+tipAmount, button);\n return button;\n });\n\n unsetActiveTip = () => {\n const prevTipEl = tipsEl.querySelector('.active');\n if(prevTipEl) {\n prevTipEl.classList.remove('active');\n }\n };\n\n attachClickEvent(tipsEl, (e) => {\n const tipEl = findUpClassName(e.target, tipClassName);\n if(!tipEl) {\n return;\n }\n\n let tipAmount = 0;\n if(tipEl.classList.contains('active')) {\n tipEl.classList.remove('active');\n } else {\n unsetActiveTip();\n tipEl.classList.add('active');\n\n for(const [amount, el] of this.tipButtonsMap) {\n if(el === tipEl) {\n tipAmount = amount;\n break;\n }\n }\n }\n\n setInputValue(tipAmount);\n });\n\n setInputValue(0);\n\n tipsEl.append(...tipButtons);\n pricesElements.push(tipsEl);\n } else {\n setInputValue((paymentForm as PaymentsPaymentReceipt).tip_amount);\n }\n } else {\n setTotal();\n }\n\n pricesElements.push(totalLabel.label);\n\n prices.append(...pricesElements);\n itemEl.append(prices);\n\n // /\n\n const setRowIcon = async(row: Row, icon?: string) => {\n const img = document.createElement('img');\n img.classList.add('media-photo');\n await renderImageFromUrlPromise(img, getPaymentBrandIconPath(icon));\n let container = row.media;\n if(!container) {\n container = row.createMedia('small');\n container.classList.add('media-container-cover');\n container.append(img);\n } else {\n replaceContent(container, img);\n }\n\n row.container.classList.remove('row-with-icon');\n };\n\n const createRow = (options: ConstructorParameters[0]) => {\n if(options.titleLangKey) {\n options.subtitleLangKey = options.titleLangKey;\n }\n\n options.noWrap = true;\n const row = new Row(options);\n row.container.classList.add(className + '-row');\n\n if(options.titleLangKey) {\n row.subtitle.classList.add('hide');\n }\n\n return row;\n };\n\n const setRowTitle = (row: Row, textContent: string) => {\n row.title.textContent = textContent;\n if(!textContent) {\n const e = I18n.weakMap.get(row.subtitle.firstElementChild as HTMLElement) as I18n.IntlElement;\n row.title.append(i18n(e.key));\n }\n\n row.subtitle.classList.toggle('hide', !textContent);\n };\n\n const setCardSubtitle = (card: PaymentCardDetailsResult) => {\n let brand: string;\n let str: string;\n let icon: string;\n if('title' in card) {\n brand = card.title.split(' ').shift();\n str = card.title;\n icon = card.icon;\n } else {\n brand = detectUnifiedCardBrand(card.cardNumber);\n str = brand + ' *' + card.cardNumber.split(' ').pop();\n }\n\n methodRow.title.classList.remove('tgico', 'tgico-card_outline');\n setRowIcon(methodRow, icon || brand.toLowerCase());\n setRowTitle(methodRow, str);\n };\n\n const onMethodClick = () => {\n new PopupPaymentCard(paymentForm as PaymentsPaymentForm, previousCardDetails as PaymentCardDetails).addEventListener('finish', ({token, card}) => {\n previousToken = token, previousCardDetails = card;\n\n setCardSubtitle(card);\n });\n };\n\n let previousCardDetails: PaymentCardDetailsResult, previousToken: PaymentsCredentialsToken;\n const methodRow = createRow({\n titleLangKey: 'PaymentCheckoutMethod',\n clickable: isReceipt ? undefined : onMethodClick,\n icon: 'card_outline'\n });\n\n methodRow.container.classList.add(className + '-method-row');\n\n if(savedCredentials) {\n setCardSubtitle(savedCredentials);\n } else if((paymentForm as PaymentsPaymentReceipt).credentials_title) {\n setCardSubtitle({title: (paymentForm as PaymentsPaymentReceipt).credentials_title});\n }\n\n const providerRow = createRow({\n title: providerPeerTitle,\n subtitleLangKey: 'PaymentCheckoutProvider'\n });\n\n const providerAvatar = new AvatarElement();\n providerAvatar.classList.add('avatar-32');\n providerRow.createMedia('small').append(providerAvatar);\n /* await */ providerAvatar.updateWithOptions({peerId: paymentForm.provider_id.toPeerId()});\n\n let shippingAddressRow: Row, shippingNameRow: Row, shippingEmailRow: Row, shippingPhoneRow: Row, shippingMethodRow: Row;\n let lastShippingOption: ShippingOption, onShippingAddressClick: (focus?: ConstructorParameters[2]) => void, onShippingMethodClick: () => void;\n const setShippingTitle = invoice.pFlags.shipping_address_requested ? (shippingAddress?: PaymentShippingAddress) => {\n if(!shippingAddress) {\n shippingMethodRow.subtitle.classList.add('hide');\n replaceContent(shippingMethodRow.title, i18n('PaymentShippingAddress'));\n return;\n }\n\n const postAddress = shippingAddress.shipping_address;\n setRowTitle(shippingAddressRow, [postAddress.city, postAddress.street_line1, postAddress.street_line2].filter(Boolean).join(', '));\n\n shippingMethodRow.container.classList.toggle('hide', !lastRequestedInfo && !isReceipt);\n } : undefined;\n\n const setShippingInfo = (info: PaymentRequestedInfo) => {\n setShippingTitle && setShippingTitle(info);\n shippingNameRow && setRowTitle(shippingNameRow, info.name);\n shippingEmailRow && setRowTitle(shippingEmailRow, info.email);\n shippingPhoneRow && setRowTitle(shippingPhoneRow, info.phone && ('+' + formatPhoneNumber(info.phone).formatted));\n };\n\n if(!isReceipt) {\n onShippingAddressClick = (focus) => {\n new PopupPaymentShipping(paymentForm as PaymentsPaymentForm, inputInvoice, focus).addEventListener('finish', ({shippingAddress, requestedInfo}) => {\n lastRequestedInfo = requestedInfo;\n savedInfo = (paymentForm as PaymentsPaymentForm).saved_info = shippingAddress;\n setShippingInfo(shippingAddress);\n });\n };\n }\n\n if(invoice.pFlags.shipping_address_requested) {\n const setShippingOption = (shippingOption?: ShippingOption) => {\n const scrollSaver = new ScrollSaver(this.scrollable, undefined, true);\n scrollSaver.save();\n if(lastShippingPricesElements) {\n lastShippingPricesElements.forEach((node) => node.remove());\n }\n\n if(!shippingOption) {\n shippingAmount = 0;\n\n setTotal();\n scrollSaver.restore();\n this.onContentUpdate();\n return;\n }\n\n lastShippingOption = shippingOption;\n setRowTitle(shippingMethodRow, shippingOption.title);\n\n shippingAmount = accumulate(shippingOption.prices.map(({amount}) => +amount), 0);\n lastShippingPricesElements = makePricesElements(shippingOption.prices);\n let l = totalLabel.label;\n if(canTip) {\n l = l.previousElementSibling as any;\n if(!isReceipt) {\n l = l.previousElementSibling as any;\n }\n }\n\n lastShippingPricesElements.forEach((element) => l.parentElement.insertBefore(element, l));\n\n setTotal();\n scrollSaver.restore();\n this.onContentUpdate();\n };\n\n shippingAddressRow = createRow({\n icon: 'location',\n titleLangKey: 'PaymentShippingAddress',\n clickable: !isReceipt && onShippingAddressClick.bind(null, undefined)\n });\n\n let lastShippingPricesElements: HTMLElement[];\n shippingMethodRow = createRow({\n icon: 'shipping',\n titleLangKey: 'PaymentCheckoutShippingMethod',\n clickable: !isReceipt && (onShippingMethodClick = () => {\n new PopupPaymentShippingMethods(paymentForm as PaymentsPaymentForm, lastRequestedInfo, lastShippingOption).addEventListener('finish', (shippingOption) => {\n setShippingOption(shippingOption);\n });\n })\n });\n\n shippingMethodRow.container.classList.add('hide');\n\n const shippingOption = (paymentForm as PaymentsPaymentReceipt).shipping;\n if(shippingOption) {\n setShippingOption(shippingOption);\n }\n }\n\n if(invoice.pFlags.name_requested) {\n shippingNameRow = createRow({\n icon: 'newprivate',\n titleLangKey: 'PaymentCheckoutName',\n clickable: !isReceipt && onShippingAddressClick.bind(null, 'name')\n });\n }\n\n if(invoice.pFlags.email_requested) {\n shippingEmailRow = createRow({\n icon: 'mention',\n titleLangKey: 'PaymentShippingEmailPlaceholder',\n clickable: !isReceipt && onShippingAddressClick.bind(null, 'email')\n });\n }\n\n if(invoice.pFlags.phone_requested) {\n shippingPhoneRow = createRow({\n icon: 'phone',\n titleLangKey: 'PaymentCheckoutPhoneNumber',\n clickable: !isReceipt && onShippingAddressClick.bind(null, 'phone')\n });\n }\n\n if(savedInfo) {\n setShippingInfo(savedInfo);\n }\n\n const rows = [\n methodRow,\n providerRow,\n shippingAddressRow,\n shippingMethodRow,\n shippingNameRow,\n shippingEmailRow,\n shippingPhoneRow\n ].filter(Boolean);\n\n const acceptTermsCheckboxField = isRecurring && new CheckboxField({\n text: 'Payments.Recurrent.Accept',\n textArgs: [wrapRichText(invoice.recurring_terms_url), peerTitle2]\n });\n\n const acceptTermsRow = isRecurring && createRow({\n checkboxField: acceptTermsCheckboxField\n });\n\n const recurringElements = isRecurring ? [document.createElement('hr'), acceptTermsRow.container] : [];\n\n this.scrollable.append(...[\n document.createElement('hr'),\n ...rows.map((row) => row.container),\n ...recurringElements\n ].filter(Boolean));\n\n // /\n let popupPaymentVerification: PopupPaymentVerification, lastTmpPasword: AccountTmpPassword;\n const onClick = () => {\n const missingInfo = invoice.pFlags.name_requested && !savedInfo?.name ? 'name' : (invoice.pFlags.email_requested && !savedInfo?.email ? 'email' : (invoice.pFlags.phone_requested && !savedInfo?.phone ? 'phone' : undefined));\n if(invoice.pFlags.shipping_address_requested) {\n if(!lastRequestedInfo) {\n onShippingAddressClick();\n return;\n } else if(!lastShippingOption) {\n onShippingMethodClick();\n return;\n }\n } else if(missingInfo) {\n onShippingAddressClick(missingInfo);\n return;\n }\n\n if(!previousCardDetails && !lastTmpPasword) {\n if(!savedCredentials) {\n onMethodClick();\n return;\n }\n\n Promise.resolve(passwordState ?? this.managers.passwordManager.getState()).then((_passwordState) => {\n new PopupPaymentCardConfirmation(savedCredentials.title, _passwordState).addEventListener('finish', (tmpPassword) => {\n passwordState = undefined;\n lastTmpPasword = tmpPassword;\n simulateClickEvent(payButton);\n\n // * reserve 5 seconds\n const diff = tmpPassword.valid_until - tsNow(true) - 5;\n setTimeout(() => {\n if(lastTmpPasword === tmpPassword) {\n lastTmpPasword = undefined;\n }\n }, diff * 1000);\n });\n });\n\n return;\n }\n\n return Promise.resolve().then(async() => {\n const credentials: InputPaymentCredentials = lastTmpPasword ? {\n _: 'inputPaymentCredentialsSaved',\n id: savedCredentials.id,\n tmp_password: lastTmpPasword.tmp_password\n } : {\n _: 'inputPaymentCredentials',\n data: {\n _: 'dataJSON',\n data: JSON.stringify(previousToken.token ? previousToken : {type: previousToken.type, id: previousToken.id})\n },\n pFlags: {\n save: previousCardDetails.save || undefined\n }\n };\n\n try {\n const paymentResult = await this.managers.appPaymentsManager.sendPaymentForm(\n inputInvoice,\n (paymentForm as PaymentsPaymentForm).form_id,\n lastRequestedInfo?.id,\n lastShippingOption?.id,\n credentials,\n getTipsAmount()\n );\n\n if(paymentResult._ === 'payments.paymentResult') {\n onConfirmed();\n } else {\n popupPaymentVerification = new PopupPaymentVerification(paymentResult.url, !mediaInvoice.extended_media);\n popupPaymentVerification.addEventListener('finish', () => {\n popupPaymentVerification = undefined;\n\n onConfirmed();\n });\n await new Promise((resolve, reject) => {\n popupPaymentVerification.addEventListener('close', () => {\n popupPaymentVerification = undefined;\n if(confirmed) {\n resolve();\n } else {\n const err = new Error('payment not finished');\n (err as ApiError).handled = true;\n reject(err);\n }\n });\n });\n }\n } catch(err) {\n if((err as ApiError).type === 'BOT_PRECHECKOUT_TIMEOUT') {\n toastNew({langPackKey: 'Error.AnError'});\n (err as ApiError).handled = true;\n } else if((err as ApiError).type === 'TMP_PASSWORD_INVALID') {\n passwordState = lastTmpPasword = undefined;\n simulateClickEvent(payButton);\n (err as ApiError).handled = true;\n }\n\n throw err;\n }\n });\n };\n\n const onChange = () => {\n payButton.disabled = !!(acceptTermsCheckboxField && !acceptTermsCheckboxField.checked);\n };\n\n let payButton: HTMLButtonElement;\n if(isReceipt) {\n payButton = PaymentButton({\n onClick: () => this.hide(),\n key: 'Done'\n });\n } else {\n payButton = PaymentButton({\n onClick: onClick,\n textEl: payI18n\n });\n }\n\n onChange();\n if(acceptTermsCheckboxField) {\n acceptTermsCheckboxField.input.addEventListener('change', onChange);\n }\n\n this.body.append(this.btnConfirmOnEnter = payButton);\n\n this.onContentUpdate();\n }\n}\n","/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\nFor license and copyright information please follow this link:\nhttps://github.com/telegramdesktop/tdesktop/blob/master/LEGAL\n*/\n\nimport accumulate from '../helpers/array/accumulate';\nimport clamp from '../helpers/number/clamp';\n\ntype Size = {w: number, h: number};\nexport type GroupMediaLayout = {\n geometry: {\n x: number,\n y: number,\n width: number,\n height: number\n },\n sides: number\n};\ntype Attempt = {\n lineCounts: number[],\n heights: number[]\n};\nexport const RectPart = {\n None: 0,\n Top: 1,\n Right: 2,\n Bottom: 4,\n Left: 8\n};\n\n// https://github.com/telegramdesktop/tdesktop/blob/4669c07dc5335cbf4795bbbe5b0ab7c007b9aee2/Telegram/SourceFiles/ui/grouped_layout.cpp\nexport class Layouter {\n private count: number;\n private ratios: number[];\n private proportions: string;\n private averageRatio: number;\n private maxSizeRatio: number;\n\n constructor(private sizes: Size[], private maxWidth: number, private minWidth: number, private spacing: number, private maxHeight = maxWidth) {\n this.count = sizes.length;\n this.ratios = Layouter.countRatios(sizes);\n this.proportions = Layouter.countProportions(this.ratios);\n this.averageRatio = accumulate(this.ratios, 1) / this.count; // warn\n this.maxSizeRatio = maxWidth / this.maxHeight;\n }\n\n public layout(): GroupMediaLayout[] {\n if(!this.count) return [];\n // else if(this.count === 1) return this.layoutOne();\n\n if(this.count >= 5 || this.ratios.find((r) => r > 2)) {\n return new ComplexLayouter(this.ratios, this.averageRatio, this.maxWidth, this.minWidth, this.spacing).layout();\n }\n\n if(this.count === 2) return this.layoutTwo();\n else if(this.count === 3) return this.layoutThree();\n return this.layoutFour();\n }\n\n private layoutTwo(): ReturnType {\n if((this.proportions === 'ww') &&\n (this.averageRatio > 1.4 * this.maxSizeRatio) &&\n (this.ratios[1] - this.ratios[0] < 0.2)) {\n return this.layoutTwoTopBottom();\n } else if(this.proportions === 'ww' || this.proportions === 'qq') {\n return this.layoutTwoLeftRightEqual();\n }\n return this.layoutTwoLeftRight();\n }\n\n private layoutThree(): ReturnType {\n // console.log('layoutThree:', this);\n if(this.proportions[0] === 'n') {\n return this.layoutThreeLeftAndOther();\n }\n return this.layoutThreeTopAndOther();\n }\n\n private layoutFour(): ReturnType {\n if(this.proportions[0] === 'w') {\n return this.layoutFourTopAndOther();\n }\n return this.layoutFourLeftAndOther();\n }\n\n private layoutTwoTopBottom(): ReturnType {\n const width = this.maxWidth;\n const height = Math.round(Math.min(\n width / this.ratios[0],\n Math.min(\n width / this.ratios[1],\n (this.maxHeight - this.spacing) / 2)));\n\n return [\n {\n geometry: {x: 0, y: 0, width, height},\n sides: RectPart.Left | RectPart.Top | RectPart.Right\n },\n {\n geometry: {x: 0, y: height + this.spacing, width, height},\n sides: RectPart.Left | RectPart.Bottom | RectPart.Right\n }\n ];\n }\n\n private layoutTwoLeftRightEqual(): ReturnType {\n const width = (this.maxWidth - this.spacing) / 2;\n const height = Math.round(Math.min(\n width / this.ratios[0],\n Math.min(width / this.ratios[1], this.maxHeight * 1)));\n\n return [\n {\n geometry: {x: 0, y: 0, width, height},\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\n },\n {\n geometry: {x: width + this.spacing, y: 0, width, height},\n sides: RectPart.Top | RectPart.Right | RectPart.Bottom\n }\n ];\n }\n\n private layoutTwoLeftRight(): ReturnType {\n const minimalWidth = Math.round(this.minWidth * 1.5);\n const secondWidth = Math.min(\n Math.round(Math.max(\n 0.4 * (this.maxWidth - this.spacing),\n (this.maxWidth - this.spacing) / this.ratios[0] /\n (1 / this.ratios[0] + 1 / this.ratios[1]))),\n this.maxWidth - this.spacing - minimalWidth);\n const firstWidth = this.maxWidth -\n secondWidth -\n this.spacing;\n const height = Math.min(\n this.maxHeight,\n Math.round(Math.min(\n firstWidth / this.ratios[0],\n secondWidth / this.ratios[1])));\n\n return [\n {\n geometry: {x: 0, y: 0, width: firstWidth, height},\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\n },\n {\n geometry: {x: firstWidth + this.spacing, y: 0, width: secondWidth, height},\n sides: RectPart.Top | RectPart.Right | RectPart.Bottom\n }\n ];\n }\n\n private layoutThreeLeftAndOther(): ReturnType {\n const firstHeight = this.maxHeight;\n const thirdHeight = Math.round(Math.min(\n (this.maxHeight - this.spacing) / 2.,\n (this.ratios[1] * (this.maxWidth - this.spacing) /\n (this.ratios[2] + this.ratios[1]))));\n const secondHeight = firstHeight -\n thirdHeight -\n this.spacing;\n const rightWidth = Math.max(\n this.minWidth,\n Math.round(Math.min(\n (this.maxWidth - this.spacing) / 2.,\n Math.min(\n thirdHeight * this.ratios[2],\n secondHeight * this.ratios[1]))));\n const leftWidth = Math.min(\n Math.round(firstHeight * this.ratios[0]),\n this.maxWidth - this.spacing - rightWidth);\n\n return [\n {\n geometry: {x: 0, y: 0, width: leftWidth, height: firstHeight},\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\n },\n {\n geometry: {x: leftWidth + this.spacing, y: 0, width: rightWidth, height: secondHeight},\n sides: RectPart.Top | RectPart.Right\n },\n {\n geometry: {x: leftWidth + this.spacing, y: secondHeight + this.spacing, width: rightWidth, height: thirdHeight},\n sides: RectPart.Bottom | RectPart.Right\n }\n ];\n }\n\n private layoutThreeTopAndOther(): ReturnType {\n const firstWidth = this.maxWidth;\n const firstHeight = Math.round(Math.min(\n firstWidth / this.ratios[0],\n (this.maxHeight - this.spacing) * 0.66));\n const secondWidth = (this.maxWidth - this.spacing) / 2;\n const secondHeight = Math.min(\n this.maxHeight - firstHeight - this.spacing,\n Math.round(Math.min(\n secondWidth / this.ratios[1],\n secondWidth / this.ratios[2])));\n const thirdWidth = firstWidth - secondWidth - this.spacing;\n\n return [\n {\n geometry: {x: 0, y: 0, width: firstWidth, height: firstHeight},\n sides: RectPart.Left | RectPart.Top | RectPart.Right\n },\n {\n geometry: {x: 0, y: firstHeight + this.spacing, width: secondWidth, height: secondHeight},\n sides: RectPart.Bottom | RectPart.Left\n },\n {\n geometry: {x: secondWidth + this.spacing, y: firstHeight + this.spacing, width: thirdWidth, height: secondHeight},\n sides: RectPart.Bottom | RectPart.Right\n }\n ];\n }\n\n private layoutFourTopAndOther(): ReturnType {\n const w = this.maxWidth;\n const h0 = Math.round(Math.min(\n w / this.ratios[0],\n (this.maxHeight - this.spacing) * 0.66));\n const h = Math.round(\n (this.maxWidth - 2 * this.spacing) /\n (this.ratios[1] + this.ratios[2] + this.ratios[3]));\n const w0 = Math.max(\n this.minWidth,\n Math.round(Math.min(\n (this.maxWidth - 2 * this.spacing) * 0.4,\n h * this.ratios[1])));\n const w2 = Math.round(Math.max(\n Math.max(\n this.minWidth * 1.,\n (this.maxWidth - 2 * this.spacing) * 0.33),\n h * this.ratios[3]));\n const w1 = w - w0 - w2 - 2 * this.spacing;\n const h1 = Math.min(\n this.maxHeight - h0 - this.spacing,\n h);\n\n return [\n {\n geometry: {x: 0, y: 0, width: w, height: h0},\n sides: RectPart.Left | RectPart.Top | RectPart.Right\n },\n {\n geometry: {x: 0, y: h0 + this.spacing, width: w0, height: h1},\n sides: RectPart.Bottom | RectPart.Left\n },\n {\n geometry: {x: w0 + this.spacing, y: h0 + this.spacing, width: w1, height: h1},\n sides: RectPart.Bottom\n },\n {\n geometry: {x: w0 + this.spacing + w1 + this.spacing, y: h0 + this.spacing, width: w2, height: h1},\n sides: RectPart.Right | RectPart.Bottom\n }\n ];\n }\n\n private layoutFourLeftAndOther(): ReturnType {\n const h = this.maxHeight;\n const w0 = Math.round(Math.min(\n h * this.ratios[0],\n (this.maxWidth - this.spacing) * 0.6));\n\n const w = Math.round(\n (this.maxHeight - 2 * this.spacing) /\n (1. / this.ratios[1] + 1. / this.ratios[2] + 1. / this.ratios[3])\n );\n const h0 = Math.round(w / this.ratios[1]);\n const h1 = Math.round(w / this.ratios[2]);\n const h2 = h - h0 - h1 - 2 * this.spacing;\n const w1 = Math.max(\n this.minWidth,\n Math.min(this.maxWidth - w0 - this.spacing, w));\n\n return [\n {\n geometry: {x: 0, y: 0, width: w0, height: h},\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\n },\n {\n geometry: {x: w0 + this.spacing, y: 0, width: w1, height: h0},\n sides: RectPart.Top | RectPart.Right\n },\n {\n geometry: {x: w0 + this.spacing, y: h0 + this.spacing, width: w1, height: h1},\n sides: RectPart.Right\n },\n {\n geometry: {x: w0 + this.spacing, y: h0 + h1 + 2 * this.spacing, width: w1, height: h2},\n sides: RectPart.Bottom | RectPart.Right\n }\n ];\n }\n\n private static countRatios(sizes: Size[]) {\n return sizes.map((size) => size.w / size.h);\n }\n\n private static countProportions(ratios: number[]) {\n return ratios.map((ratio) => (ratio > 1.2) ? 'w' : (ratio < 0.8) ? 'n' : 'q').join('');\n }\n}\n\nclass ComplexLayouter {\n private ratios: number[];\n private count: number;\n\n constructor(ratios: number[], private averageRatio: number, private maxWidth: number, private minWidth: number, private spacing: number, private maxHeight = maxWidth * 4 / 3) {\n this.ratios = ComplexLayouter.cropRatios(ratios, averageRatio);\n this.count = ratios.length;\n }\n\n private static cropRatios(ratios: number[], averageRatio: number) {\n const kMaxRatio = 2.75;\n const kMinRatio = 0.6667;\n return ratios.map((ratio) => {\n return averageRatio > 1.1 ?\n clamp(ratio, 1., kMaxRatio) :\n clamp(ratio, kMinRatio, 1.);\n });\n }\n\n public layout(): GroupMediaLayout[] {\n const result = new Array(this.count);\n\n const attempts: Attempt[] = [];\n const multiHeight = (offset: number, count: number) => {\n const ratios = this.ratios.slice(offset, offset + count); // warn\n const sum = accumulate(ratios, 0);\n return (this.maxWidth - (count - 1) * this.spacing) / sum;\n };\n const pushAttempt = (lineCounts: number[]) => {\n const heights: number[] = [];\n let offset = 0;\n for(const count of lineCounts) {\n heights.push(multiHeight(offset, count));\n offset += count;\n }\n attempts.push({lineCounts, heights}); // warn\n };\n\n for(let first = 1; first !== this.count; ++first) {\n const second = this.count - first;\n if(first > 3 || second > 3) {\n continue;\n }\n pushAttempt([first, second]);\n }\n for(let first = 1; first !== this.count - 1; ++first) {\n for(let second = 1; second !== this.count - first; ++second) {\n const third = this.count - first - second;\n if((first > 3) ||\n (second > ((this.averageRatio < 0.85) ? 4 : 3)) ||\n (third > 3)) {\n continue;\n }\n pushAttempt([first, second, third]);\n }\n }\n for(let first = 1; first !== this.count - 1; ++first) {\n for(let second = 1; second !== this.count - first; ++second) {\n for(let third = 1; third !== this.count - first - second; ++third) {\n const fourth = this.count - first - second - third;\n if(first > 3 || second > 3 || third > 3 || fourth > 3) {\n continue;\n }\n pushAttempt([first, second, third, fourth]);\n }\n }\n }\n\n let optimalAttempt: Attempt = null;\n let optimalDiff = 0;\n for(const attempt of attempts) {\n const {heights, lineCounts: counts} = attempt;\n const lineCount = counts.length;\n const totalHeight = accumulate(heights, 0) +\n this.spacing * (lineCount - 1);\n const minLineHeight = Math.min(...heights);\n const maxLineHeight = Math.max(...heights);\n const bad1 = (minLineHeight < this.minWidth) ? 1.5 : 1;\n const bad2 = (() => {\n for(let line = 1; line !== lineCount; ++line) {\n if(counts[line - 1] > counts[line]) {\n return 1.5;\n }\n }\n return 1.;\n })();\n const diff = Math.abs(totalHeight - this.maxHeight) * bad1 * bad2;\n if(!optimalAttempt || diff < optimalDiff) {\n optimalAttempt = attempt;\n optimalDiff = diff;\n }\n }\n\n const optimalCounts = optimalAttempt.lineCounts;\n const optimalHeights = optimalAttempt.heights;\n const rowCount = optimalCounts.length;\n\n let index = 0;\n let y = 0;\n for(let row = 0; row !== rowCount; ++row) {\n const colCount = optimalCounts[row];\n const lineHeight = optimalHeights[row];\n const height = Math.round(lineHeight);\n\n let x = 0;\n for(let col = 0; col !== colCount; ++col) {\n const sides = RectPart.None |\n (row === 0 ? RectPart.Top : RectPart.None) |\n (row === rowCount - 1 ? RectPart.Bottom : RectPart.None) |\n (col === 0 ? RectPart.Left : RectPart.None) |\n (col === colCount - 1 ? RectPart.Right : RectPart.None);\n\n const ratio = this.ratios[index];\n const width = (col === colCount - 1) ?\n (this.maxWidth - x) :\n Math.round(ratio * lineHeight);\n result[index] = {\n geometry: {x, y, width, height},\n sides\n };\n\n x += width + this.spacing;\n ++index;\n }\n y += height + this.spacing;\n }\n\n return result;\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 {Layouter, RectPart} from './groupedLayout';\n\nexport default function prepareAlbum(options: {\n container: HTMLElement,\n items: {w: number, h: number}[],\n maxWidth: number,\n minWidth: number,\n spacing: number,\n maxHeight?: number,\n forMedia?: true\n}) {\n const layouter = new Layouter(options.items, options.maxWidth, options.minWidth, options.spacing, options.maxHeight);\n const layout = layouter.layout();\n\n const widthItem = layout.find((item) => item.sides & RectPart.Right);\n const width = widthItem.geometry.width + widthItem.geometry.x;\n\n const heightItem = layout.find((item) => item.sides & RectPart.Bottom);\n const height = heightItem.geometry.height + heightItem.geometry.y;\n\n const container = options.container;\n container.style.width = width + 'px';\n container.style.height = height + 'px';\n const children = container.children;\n\n layout.forEach(({geometry, sides}, idx) => {\n let div: HTMLElement;\n div = children[idx] as HTMLElement;\n if(!div) {\n div = document.createElement('div');\n container.append(div);\n }\n\n div.classList.add('album-item', 'grouped-item');\n\n div.style.width = (geometry.width / width * 100) + '%';\n div.style.height = (geometry.height / height * 100) + '%';\n div.style.top = (geometry.y / height * 100) + '%';\n div.style.left = (geometry.x / width * 100) + '%';\n\n if(sides & RectPart.Left && sides & RectPart.Top) {\n div.style.borderTopLeftRadius = 'inherit';\n }\n\n if(sides & RectPart.Left && sides & RectPart.Bottom) {\n div.style.borderBottomLeftRadius = 'inherit';\n }\n\n if(sides & RectPart.Right && sides & RectPart.Top) {\n div.style.borderTopRightRadius = 'inherit';\n }\n\n if(sides & RectPart.Right && sides & RectPart.Bottom) {\n div.style.borderBottomRightRadius = 'inherit';\n }\n\n if(options.forMedia) {\n const mediaDiv = document.createElement('div');\n mediaDiv.classList.add('album-item-media');\n\n div.append(mediaDiv);\n }\n\n // @ts-ignore\n // div.style.backgroundColor = '#' + Math.floor(Math.random() * (2 ** 24 - 1)).toString(16).padStart(6, '0');\n });\n\n /* if(options.forMedia) {\n layout.forEach((_, i) => {\n const mediaDiv = document.createElement('div');\n mediaDiv.classList.add('album-item-media');\n\n options.container.children[i].append(mediaDiv);\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 {ChatAutoDownloadSettings} from '../../helpers/autoDownload';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {Middleware} from '../../helpers/middleware';\nimport {Document, Message, MessageMedia, Photo, PhotoSize} from '../../layer';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getMediaFromMessage from '../../lib/appManagers/utils/messages/getMediaFromMessage';\nimport choosePhotoSize from '../../lib/appManagers/utils/photos/choosePhotoSize';\nimport rootScope from '../../lib/rootScope';\nimport {AnimationItemGroup} from '../animationIntersector';\nimport Chat from '../chat/chat';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport prepareAlbum from '../prepareAlbum';\nimport wrapMediaSpoiler from './mediaSpoiler';\nimport wrapPhoto from './photo';\nimport wrapVideo from './video';\n\nexport default function wrapAlbum({messages, attachmentDiv, middleware, uploading, lazyLoadQueue, isOut, chat, loadPromises, autoDownload, managers = rootScope.managers, animationGroup}: {\n messages: Message.message[],\n attachmentDiv: HTMLElement,\n middleware?: Middleware,\n lazyLoadQueue?: LazyLoadQueue,\n uploading?: boolean,\n isOut: boolean,\n chat: Chat,\n loadPromises?: Promise[],\n autoDownload?: ChatAutoDownloadSettings,\n managers?: AppManagers,\n animationGroup?: AnimationItemGroup\n}) {\n const items: {size: PhotoSize.photoSize, media: Photo.photo | Document.document, message: Message.message}[] = [];\n\n // !lowest msgID will be the FIRST in album\n for(const message of messages) {\n const media: Photo.photo | Document.document = getMediaFromMessage(message);\n\n const size: any = media._ === 'photo' ? choosePhotoSize(media, 480, 480) : {w: media.w, h: media.h};\n items.push({size, media, message});\n }\n\n /* // * pending\n if(storage[0] < 0) {\n items.reverse();\n } */\n\n prepareAlbum({\n container: attachmentDiv,\n items: items.map((i) => ({w: i.size.w, h: i.size.h})),\n maxWidth: mediaSizes.active.album.width,\n minWidth: 100,\n spacing: 2,\n forMedia: true\n });\n\n const {width, height} = attachmentDiv.style;\n const containerWidth = parseInt(width);\n const containerHeight = parseInt(height);\n\n items.forEach((item, idx) => {\n const {size, media, message} = item;\n\n const messageMedia = message.media;\n const hasSpoiler = !!(messageMedia as MessageMedia.messageMediaPhoto | MessageMedia.messageMediaDocument).pFlags?.spoiler;\n\n const div = attachmentDiv.children[idx] as HTMLElement;\n div.dataset.mid = '' + message.mid;\n div.dataset.peerId = '' + message.peerId;\n const mediaDiv = div.firstElementChild as HTMLElement;\n const isPhoto = media._ === 'photo';\n let thumbPromise: Promise;\n if(isPhoto) {\n thumbPromise = wrapPhoto({\n photo: media,\n message,\n container: mediaDiv,\n boxWidth: 0,\n boxHeight: 0,\n isOut,\n lazyLoadQueue,\n middleware,\n size,\n loadPromises,\n autoDownloadSize: autoDownload.photo,\n managers\n });\n } else {\n thumbPromise = wrapVideo({\n doc: media,\n container: mediaDiv,\n message,\n boxWidth: 0,\n boxHeight: 0,\n withTail: false,\n isOut,\n lazyLoadQueue,\n middleware,\n loadPromises,\n autoDownload,\n managers,\n noAutoplayAttribute: hasSpoiler\n });\n }\n\n if(thumbPromise) {\n loadPromises?.push(thumbPromise);\n }\n\n if(hasSpoiler) {\n const promise = (thumbPromise || Promise.resolve()).then(async() => {\n if(!middleware()) {\n return;\n }\n\n const {width, height} = div.style;\n const itemWidth = +width.slice(0, -1) / 100 * containerWidth;\n const itemHeight = +height.slice(0, -1) / 100 * containerHeight;\n const container = await wrapMediaSpoiler({\n media,\n animationGroup,\n middleware,\n width: itemWidth,\n height: itemHeight\n });\n\n if(!middleware()) {\n return;\n }\n\n mediaDiv.append(container);\n });\n\n loadPromises?.push(promise);\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 {SliderSuperTab} from '../../slider';\nimport appSidebarRight from '..';\nimport {roundPercents} from '../../poll';\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport {i18n} from '../../../lib/langPack';\nimport setInnerHTML from '../../../helpers/dom/setInnerHTML';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport Button from '../../button';\nimport {Message, MessageMedia} from '../../../layer';\n\nexport default class AppPollResultsTab extends SliderSuperTab {\n private resultsDiv: HTMLElement;\n\n public async init(message: Message.message) {\n this.container.id = 'poll-results-container';\n this.container.classList.add('chatlist-container');\n\n this.resultsDiv = document.createElement('div');\n this.resultsDiv.classList.add('poll-results');\n this.scrollable.append(this.resultsDiv);\n\n const poll = await this.managers.appPollsManager.getPoll((message.media as MessageMedia.messageMediaPoll).poll.id);\n\n this.setTitle(poll.poll.pFlags.quiz ? 'PollResults.Title.Quiz' : 'PollResults.Title.Poll');\n\n const title = document.createElement('h3');\n setInnerHTML(title, wrapEmojiText(poll.poll.question));\n\n const percents = poll.results.results.map((v) => v.voters / poll.results.total_voters * 100);\n roundPercents(percents);\n\n const fragment = document.createDocumentFragment();\n poll.results.results.forEach((result, idx) => {\n if(!result.voters) return;\n\n const hr = document.createElement('hr');\n\n const answer = poll.poll.answers[idx];\n\n // Head\n const answerEl = document.createElement('div');\n answerEl.classList.add('poll-results-answer');\n\n const answerTitle = document.createElement('div');\n setInnerHTML(answerTitle, wrapEmojiText(answer.text));\n\n const answerPercents = document.createElement('div');\n answerPercents.innerText = Math.round(percents[idx]) + '%';\n\n answerEl.append(answerTitle, answerPercents);\n\n // Humans\n const list = appDialogsManager.createChatList();\n list.classList.add('poll-results-voters');\n\n appDialogsManager.setListClickListener(list, () => {\n appSidebarRight.onCloseBtnClick();\n }, undefined, true);\n\n list.style.minHeight = Math.min(result.voters, 4) * 48 + 'px';\n\n fragment.append(hr, answerEl, list);\n\n let offset: string, limit = 4, loading = false, left = Math.max(0, result.voters - 4);\n const load = () => {\n if(loading) return;\n loading = true;\n\n this.managers.appPollsManager.getVotes(message, answer.option, offset, limit).then((votesList) => {\n votesList.votes.forEach((vote) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: vote.user_id.toPeerId(false),\n container: list,\n rippleEnabled: false,\n meAsSaved: false,\n avatarSize: 'small'\n });\n dom.lastMessageSpan.parentElement.remove();\n });\n\n if(offset) {\n left = Math.max(0, left - votesList.votes.length);\n\n if(left) {\n (showMore.lastElementChild as HTMLElement).replaceWith(i18n('PollResults.LoadMore', [Math.min(20, left)]));\n }\n }\n\n offset = votesList.next_offset;\n limit = 20;\n\n if(!left || !votesList.votes.length) {\n showMore.remove();\n }\n }).finally(() => {\n loading = false;\n });\n };\n\n const showMore = Button('poll-results-more btn btn-primary btn-transparent', {icon: 'down'});\n showMore.addEventListener('click', load);\n showMore.append(i18n('PollResults.LoadMore', [Math.min(20, left)]));\n\n fragment.append(showMore);\n\n load();\n });\n\n this.resultsDiv.append(title, fragment);\n\n appSidebarRight.toggleSidebar(true).then(() => {\n /* appPollsManager.getVotes(mid).then((votes) => {\n console.log('gOt VotEs', votes);\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 mediaSizes from '../helpers/mediaSizes';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport appImManager from '../lib/appManagers/appImManager';\nimport rootScope from '../lib/rootScope';\nimport ripple from './ripple';\nimport appSidebarRight from './sidebarRight';\nimport AppPollResultsTab from './sidebarRight/tabs/pollResults';\nimport {FormatterArguments, i18n, LangPackKey} from '../lib/langPack';\nimport {fastRaf} from '../helpers/schedulers';\nimport SetTransition from './singleTransition';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent, detachClickEvent, simulateClickEvent} from '../helpers/dom/clickEvent';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport windowSize from '../helpers/windowSize';\nimport {Message, MessageMedia, Poll, PollResults} from '../layer';\nimport toHHMMSS from '../helpers/string/toHHMMSS';\nimport StackedAvatars from './stackedAvatars';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport wrapRichText from '../lib/richTextProcessor/wrapRichText';\n\nlet lineTotalLength = 0;\nconst tailLength = 9;\nconst times = 10;\nconst fullTime = 340;\nconst oneTime = fullTime / times;\n\nexport const roundPercents = (percents: number[]) => {\n // console.log('roundPercents before percents:', percents);\n\n const sum = percents.reduce((acc, p) => acc + Math.round(p), 0);\n if(sum > 100) {\n const diff = sum - 100;\n const length = percents.length;\n for(let i = 0; i < diff; ++i) {\n let minIndex = -1, minRemainder = 1;\n for(let k = 0; k < length; ++k) {\n const remainder = percents[k] % 1;\n if(remainder >= 0.5 && remainder < minRemainder) {\n minRemainder = remainder;\n minIndex = k;\n }\n }\n\n if(minIndex === -1) {\n // throw new Error('lol chto');\n return;\n }\n\n percents[minIndex] -= minRemainder;\n }\n } else if(sum < 100) {\n const diff = 100 - sum;\n const length = percents.length;\n for(let i = 0; i < diff; ++i) {\n let minIndex = -1, maxRemainder = 0;\n for(let k = 0; k < length; ++k) {\n const remainder = percents[k] % 1;\n if(remainder < 0.5 && remainder > maxRemainder) {\n maxRemainder = remainder;\n minIndex = k;\n }\n }\n\n if(minIndex === -1) {\n // throw new Error('lol chto');\n return;\n }\n\n percents[minIndex] += 1 - maxRemainder;\n }\n }\n\n // console.log('roundPercents after percents:', percents);\n};\n\n/* const connectedPolls: {id: string, element: PollElement}[] = [];\nrootScope.on('poll_update', (e) => {\n const {poll, results} = e as {poll: Poll, results: PollResults};\n\n //console.log('poll_update', poll, results);\n for(const connected of connectedPolls) {\n if(connected.id === poll.id) {\n const pollElement = connected.element;\n pollElement.isClosed = !!poll.pFlags.closed;\n pollElement.performResults(results, poll.chosenIndexes);\n }\n }\n}); */\n\nrootScope.addEventListener('poll_update', ({poll, results}) => {\n const pollElements = Array.from(document.querySelectorAll(`poll-element[poll-id=\"${poll.id}\"]`)) as PollElement[];\n pollElements.forEach((pollElement) => {\n // console.log('poll_update', poll, results);\n pollElement.isClosed = !!poll.pFlags.closed;\n pollElement.performResults(results, poll.chosenIndexes);\n });\n});\n\nmediaSizes.addEventListener('resize', () => {\n PollElement.setMaxLength();\n PollElement.resizePolls();\n});\n\nmediaSizes.addEventListener('changeScreen', () => {\n PollElement.setMaxLength();\n});\n\nconst hideQuizHint = (element: HTMLElement, onHide: () => void, timeout: number) => {\n element.classList.remove('active');\n\n clearTimeout(timeout);\n setTimeout(() => {\n onHide();\n element.remove();\n\n if(prevQuizHint === element && prevQuizHintOnHide === onHide && prevQuizHintTimeout === timeout) {\n prevQuizHint = prevQuizHintOnHide = null;\n prevQuizHintTimeout = 0;\n }\n }, 200);\n};\n\nlet prevQuizHint: HTMLElement, prevQuizHintOnHide: () => void, prevQuizHintTimeout: number;\nlet isListenerSet = false;\nconst setQuizHint = (solution: string, solution_entities: any[], onHide: () => void) => {\n if(prevQuizHint) {\n hideQuizHint(prevQuizHint, prevQuizHintOnHide, prevQuizHintTimeout);\n }\n\n const element = document.createElement('div');\n element.classList.add('quiz-hint');\n\n const container = document.createElement('div');\n container.classList.add('container', 'tgico');\n\n const textEl = document.createElement('div');\n textEl.classList.add('text');\n\n container.append(textEl);\n element.append(container);\n\n setInnerHTML(textEl, wrapRichText(solution, {entities: solution_entities}));\n appImManager.chat.bubbles.container.append(element);\n\n void element.offsetLeft; // reflow\n element.classList.add('active');\n\n prevQuizHint = element;\n prevQuizHintOnHide = onHide;\n prevQuizHintTimeout = window.setTimeout(() => {\n hideQuizHint(element, onHide, prevQuizHintTimeout);\n }, IS_TOUCH_SUPPORTED ? 5000 : 7000);\n\n if(!isListenerSet) {\n isListenerSet = true;\n appImManager.addEventListener('peer_changed', () => {\n if(prevQuizHint) {\n hideQuizHint(prevQuizHint, prevQuizHintOnHide, prevQuizHintTimeout);\n }\n });\n }\n};\n\nexport default class PollElement extends HTMLElement {\n public static MAX_OFFSET = -46.5;\n public static MAX_LENGTH = 0;\n public svgLines: SVGSVGElement[];\n private numberDivs: HTMLDivElement[];\n private answerDivs: HTMLDivElement[];\n private descDiv: HTMLElement;\n private typeDiv: HTMLElement;\n private avatarsDiv: HTMLElement;\n private viewResults: HTMLElement;\n private votersCountDiv: HTMLDivElement;\n\n // private maxLength: number;\n // private maxLengths: number[];\n private maxPercents: number[];\n\n public isClosed = false;\n private isQuiz = false;\n private isRetracted = false;\n private isPublic = false;\n private isMultiple = false;\n private chosenIndexes: number[] = [];\n private percents: number[];\n\n public message: Message.message;\n public managers: AppManagers;\n\n private quizInterval: number;\n private quizTimer: SVGSVGElement;\n\n private sendVoteBtn: HTMLElement;\n private chosingIndexes: number[] = [];\n\n private sendVotePromise: Promise;\n private sentVote = false;\n\n public static setMaxLength() {\n const width = windowSize.width <= 360 ? windowSize.width - 120 : mediaSizes.active.poll.width;\n this.MAX_LENGTH = width + tailLength + this.MAX_OFFSET + -13.7; // 13 - position left\n }\n\n public static resizePolls() {\n if(!this.MAX_LENGTH) return;\n const pollElements = Array.from(document.querySelectorAll('poll-element.is-voted')) as PollElement[];\n pollElements.forEach((pollElement) => {\n pollElement.svgLines.forEach((svg, idx) => {\n // void svg.getBoundingClientRect(); // reflow\n pollElement.setLineProgress(idx, 1);\n });\n });\n }\n\n public async render() {\n // ะฑั€ะฐัƒะทะตั€ ะฒั‹ะทั‹ะฒะฐะตั‚ ัั‚ะพั‚ ะผะตั‚ะพะด ะฟั€ะธ ะดะพะฑะฐะฒะปะตะฝะธะธ ัะปะตะผะตะฝั‚ะฐ ะฒ ะดะพะบัƒะผะตะฝั‚\n // (ะผะพะถะตั‚ ะฒั‹ะทั‹ะฒะฐั‚ัŒัั ะผะฝะพะณะพ ั€ะฐะท, ะตัะปะธ ัะปะตะผะตะฝั‚ ะผะฝะพะณะพะบั€ะฐั‚ะฝะพ ะดะพะฑะฐะฒะปัะตั‚ัั/ัƒะดะฐะปัะตั‚ัั)\n\n if(!lineTotalLength) {\n lineTotalLength = (document.getElementById('poll-line') as any as SVGPathElement).getTotalLength();\n // console.log('line total length:', lineTotalLength);\n PollElement.setMaxLength();\n }\n\n // const {poll, results} = this.managers.appPollsManager.getPoll(pollId);\n const {poll, results} = this.message.media as MessageMedia.messageMediaPoll;\n\n /* const timestamp = Date.now() / 1000 | 0;\n if(timestamp < this.message.date) { */\n if(this.message.pFlags.is_scheduled) {\n this.classList.add('disable-hover');\n }\n\n // console.log('pollElement poll:', poll, results);\n\n let descKey: LangPackKey;\n if(poll.pFlags) {\n this.isPublic = !!poll.pFlags.public_voters;\n this.isQuiz = !!poll.pFlags.quiz;\n this.isClosed = !!poll.pFlags.closed;\n this.isMultiple = !!poll.pFlags.multiple_choice;\n\n if(this.isClosed) {\n descKey = 'Chat.Poll.Type.Closed';\n this.classList.add('is-closed');\n } else if(this.isQuiz) {\n descKey = this.isPublic ? 'Chat.Poll.Type.Quiz' : 'Chat.Poll.Type.AnonymousQuiz';\n } else {\n descKey = this.isPublic ? 'Chat.Poll.Type.Public' : 'Chat.Poll.Type.Anonymous';\n }\n }\n\n this.classList.toggle('is-multiple', this.isMultiple);\n\n const multipleSelect = this.isMultiple ? '' : '';\n const votes = poll.answers.map((answer, idx) => {\n return `\n
\n
\n
\n \n \n \n ${multipleSelect}\n
\n
\n
\n \n \n \n \n
\n `;\n }).join('');\n\n this.innerHTML = `\n
\n
\n
\n
\n
\n ${votes}`;\n\n setInnerHTML(this.firstElementChild, wrapEmojiText(poll.question));\n\n Array.from(this.querySelectorAll('.poll-answer-text')).forEach((el, idx) => {\n setInnerHTML(el, wrapEmojiText(poll.answers[idx].text));\n });\n\n this.descDiv = this.firstElementChild.nextElementSibling as HTMLElement;\n this.typeDiv = this.descDiv.firstElementChild as HTMLElement;\n this.avatarsDiv = this.descDiv.lastElementChild as HTMLElement;\n\n if(descKey) {\n this.typeDiv.append(i18n(descKey));\n }\n\n if(this.isQuiz) {\n this.classList.add('is-quiz');\n\n if(poll.close_period && poll.close_date) {\n const timeLeftDiv = document.createElement('div');\n timeLeftDiv.classList.add('poll-time');\n this.descDiv.append(timeLeftDiv);\n\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n // svg.setAttributeNS(null, 'viewBox', '0 0 15 15');\n svg.classList.add('poll-quiz-timer');\n\n this.quizTimer = svg;\n\n const strokeWidth = 2;\n const radius = 7;\n const circumference = 2 * Math.PI * radius;\n\n const circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle');\n circle.classList.add('poll-quiz-timer-circle');\n circle.setAttributeNS(null, 'cx', '16');\n circle.setAttributeNS(null, 'cy', '16');\n circle.setAttributeNS(null, 'r', '' + radius);\n circle.setAttributeNS(null, 'stroke-width', '' + strokeWidth);\n\n svg.append(circle);\n this.descDiv.append(svg);\n\n const period = poll.close_period * 1000;\n const closeTime = (poll.close_date - await rootScope.managers.timeManager.getServerTimeOffset()) * 1000;\n\n // console.log('closeTime:', poll.close_date, serverTimeManager.serverTimeOffset, Date.now() / 1000 | 0);\n\n // let time = Date.now();\n // let percents = (closeTime - time) / period;\n\n // timeLeftDiv.innerHTML = String((closeTime - time) / 1000 + 1 | 0).toHHMMSS();\n\n // // @ts-ignore\n // circle.style.strokeDashoffset = circumference + percents * circumference;\n // circle.style.strokeDasharray = ${circumference} ${circumference};\n\n this.quizInterval = window.setInterval(() => {\n const time = Date.now();\n const percents = (closeTime - time) / period;\n const timeLeft = (closeTime - time) / 1000 + 1 | 0;\n timeLeftDiv.innerHTML = toHHMMSS(timeLeft);\n\n if(timeLeft <= 5) {\n timeLeftDiv.style.color = '#ee545c';\n circle.style.stroke = '#ee545c';\n }\n // timeLeftDiv.style.visibility = 'visible';\n\n // @ts-ignore\n circle.style.strokeDashoffset = circumference + percents * circumference;\n circle.style.strokeDasharray = `${circumference} ${circumference}`;\n\n if(time >= closeTime) {\n clearInterval(this.quizInterval);\n timeLeftDiv.innerHTML = '';\n // @ts-ignore\n circle.style.strokeDashoffset = circumference;\n this.quizInterval = 0;\n\n setTimeout(() => {\n // ะฝัƒะถะฝะพ ะทะฐะฟั€ะพัะธั‚ัŒ ะฐะฟะดะตะนั‚ ั‡ั‚ะพะฑั‹ ะพะฟั€ะพั ะพะฑะฝะพะฒะธะปัั\n this.managers.appPollsManager.getResults(this.message);\n }, 3e3);\n }\n }, 1e3);\n }\n }\n\n this.answerDivs = Array.from(this.querySelectorAll('.poll-answer')) as HTMLDivElement[];\n this.svgLines = Array.from(this.querySelectorAll('.poll-line')) as SVGSVGElement[];\n this.numberDivs = Array.from(this.querySelectorAll('.poll-answer-percents')) as HTMLDivElement[];\n\n const footerDiv = document.createElement('div');\n footerDiv.classList.add('poll-footer');\n\n this.viewResults = document.createElement('div');\n this.viewResults.className = 'poll-footer-button poll-view-results hide';\n this.viewResults.append(i18n('Chat.Poll.ViewResults'));\n\n this.votersCountDiv = document.createElement('div');\n this.votersCountDiv.className = 'poll-votes-count';\n\n footerDiv.append(this.viewResults, this.votersCountDiv);\n this.append(footerDiv);\n\n this.viewResults.addEventListener('click', (e) => {\n cancelEvent(e);\n\n if(!appSidebarRight.isTabExists(AppPollResultsTab)) {\n appSidebarRight.createTab(AppPollResultsTab).open(this.message);\n }\n });\n ripple(this.viewResults);\n\n if(this.isMultiple) {\n this.sendVoteBtn = document.createElement('div');\n this.sendVoteBtn.classList.add('poll-footer-button', 'poll-send-vote');\n this.sendVoteBtn.append(i18n('Chat.Poll.SubmitVote'));\n ripple(this.sendVoteBtn);\n\n if(!poll.chosenIndexes.length) {\n this.votersCountDiv.classList.add('hide');\n }\n\n attachClickEvent(this.sendVoteBtn, (e) => {\n cancelEvent(e);\n /* const indexes = this.answerDivs.filter((el) => el.classList.contains('is-chosing')).map((el) => +el.dataset.index);\n if(indexes.length) {\n\n } */\n if(this.chosingIndexes.length) {\n this.sendVotes(this.chosingIndexes).then(() => {\n this.chosingIndexes.length = 0;\n this.answerDivs.forEach((el) => {\n el.classList.remove('is-chosing');\n });\n });\n }\n });\n\n footerDiv.append(this.sendVoteBtn);\n }\n\n // const width = this.getBoundingClientRect().width;\n // const width = mediaSizes.active.poll.width;\n // this.maxLength = width + tailLength + this.maxOffset + -13.7; // 13 - position left\n\n const canVote = !(poll.chosenIndexes.length || this.isClosed);\n if(!canVote || this.isPublic) {\n this.performResults(results, poll.chosenIndexes, false);\n }\n\n if(canVote) {\n this.setVotersCount(results);\n attachClickEvent(this, this.clickHandler);\n }\n }\n\n initQuizHint(results: PollResults) {\n if(results.solution && results.solution_entities) {\n const toggleHint = document.createElement('div');\n toggleHint.classList.add('tgico-tip', 'poll-hint');\n this.descDiv.append(toggleHint);\n\n // let active = false;\n attachClickEvent(toggleHint, (e) => {\n cancelEvent(e);\n\n // active = true;\n toggleHint.classList.add('active');\n setQuizHint(results.solution, results.solution_entities, () => {\n // active = false;\n toggleHint.classList.remove('active');\n });\n });\n\n if(this.sentVote) {\n const correctResult = results.results.find((r) => r.pFlags.correct);\n if(correctResult && !correctResult.pFlags.chosen) {\n simulateClickEvent(toggleHint);\n }\n }\n }\n }\n\n clickHandler(e: Event) {\n const target = findUpClassName(e.target, 'poll-answer') as HTMLElement;\n if(!target) {\n return;\n }\n\n cancelEvent(e);\n const answerIndex = +target.dataset.index;\n if(this.isMultiple) {\n target.classList.toggle('is-chosing');\n\n const foundIndex = this.chosingIndexes.indexOf(answerIndex);\n if(foundIndex !== -1) {\n this.chosingIndexes.splice(foundIndex, 1);\n } else {\n this.chosingIndexes.push(answerIndex);\n }\n } else {\n this.sendVotes([answerIndex]);\n }\n\n /* target.classList.add('is-voting');\n setTimeout(() => { // simulate\n this.setResults([100, 0], answerIndex);\n target.classList.remove('is-voting');\n }, 1000); */\n }\n\n sendVotes(indexes: number[]) {\n if(this.sendVotePromise) return this.sendVotePromise;\n\n const targets = this.answerDivs.filter((_, idx) => indexes.includes(idx));\n targets.forEach((target) => {\n target.classList.add('is-voting');\n });\n\n this.classList.add('disable-hover');\n this.sentVote = true;\n return this.sendVotePromise = this.managers.appPollsManager.sendVote(this.message, indexes).then(() => {\n targets.forEach((target) => {\n target.classList.remove('is-voting');\n });\n\n this.classList.remove('disable-hover');\n }).catch(() => {\n this.sentVote = false;\n }).finally(() => {\n this.sendVotePromise = null;\n });\n }\n\n performResults(results: PollResults, chosenIndexes: number[], animate = true) {\n if(!rootScope.settings.animationsEnabled) {\n animate = false;\n }\n\n if(this.isQuiz && (results.results?.length || this.isClosed)) {\n this.answerDivs.forEach((el, idx) => {\n el.classList.toggle('is-correct', !!results.results[idx].pFlags.correct);\n });\n\n if(this.initQuizHint) {\n this.initQuizHint(results);\n this.initQuizHint = null;\n }\n\n if(this.quizInterval) {\n clearInterval(this.quizInterval);\n this.quizInterval = 0;\n }\n\n if(this.quizTimer?.parentElement) {\n this.quizTimer.remove();\n }\n\n const timeEl = this.descDiv.querySelector('.poll-time');\n if(timeEl) {\n timeEl.remove();\n }\n }\n\n if(this.isClosed) {\n this.classList.add('is-closed');\n replaceContent(this.typeDiv, i18n('Chat.Poll.Type.Closed'));\n }\n\n // set chosen\n if(this.chosenIndexes.length !== chosenIndexes.length || this.isClosed) { // if we voted\n this.isRetracted = this.chosenIndexes.length && !chosenIndexes.length;\n this.chosenIndexes = chosenIndexes.slice();\n\n if(this.isRetracted) {\n attachClickEvent(this, this.clickHandler);\n } else {\n detachClickEvent(this, this.clickHandler);\n }\n }\n\n // is need update\n if(this.chosenIndexes.length || this.isRetracted || this.isClosed) {\n const percents = results.results.map((v) => results.total_voters ? v.voters / results.total_voters * 100 : 0);\n\n this.classList.toggle('no-transition', !animate);\n if(animate) {\n SetTransition({\n element: this,\n className: '',\n forwards: !this.isRetracted,\n duration: 340\n });\n }\n\n fastRaf(() => {\n this.setResults(this.isRetracted ? this.percents : percents, this.chosenIndexes, animate);\n this.percents = percents;\n this.isRetracted = false;\n });\n }\n\n this.setVotersCount(results);\n\n if(this.isPublic) {\n if(!this.isMultiple) {\n this.viewResults.classList.toggle('hide', !results.total_voters || !this.chosenIndexes.length);\n this.votersCountDiv.classList.toggle('hide', !!this.chosenIndexes.length);\n }\n\n const peerIds = (results.recent_voters || []).map((userId) => userId.toPeerId());\n const stackedAvatars = new StackedAvatars({avatarSize: 16});\n stackedAvatars.render(peerIds);\n replaceContent(this.avatarsDiv, stackedAvatars.container);\n }\n\n if(this.isMultiple) {\n const isVoted = !!this.chosenIndexes.length;\n\n const hideSendVoteBtn = this.isClosed || isVoted;\n const hideViewResultsBtn = !this.isPublic || !results.total_voters || (!isVoted && !this.isClosed);\n this.sendVoteBtn.classList.toggle('hide', hideSendVoteBtn);\n this.viewResults.classList.toggle('hide', hideViewResultsBtn);\n this.votersCountDiv.classList.toggle('hide', !hideSendVoteBtn || !hideViewResultsBtn);\n }\n }\n\n setResults(percents: number[], chosenIndexes: number[], animate: boolean) {\n this.svgLines.forEach((svg) => svg.style.display = '');\n\n this.answerDivs.forEach((el, idx) => {\n el.classList.toggle('is-chosen', chosenIndexes.includes(idx));\n });\n\n const maxValue = Math.max(...percents);\n // this.maxLengths = percents.map((p) => p / maxValue * this.maxLength);\n this.maxPercents = percents.map((p) => p / maxValue);\n\n // line\n if(this.isRetracted) {\n this.svgLines.forEach((svg, idx) => {\n this.setLineProgress(idx, -1);\n });\n } else {\n const cb = () => {\n this.svgLines.forEach((svg, idx) => {\n // void svg.getBoundingClientRect(); // reflow\n this.setLineProgress(idx, 1);\n });\n };\n\n animate ? fastRaf(cb) : cb();\n }\n\n percents = percents.slice();\n roundPercents(percents);\n let getPercentValue: (percents: number, index: number) => number;\n const iterate = (i: number) => {\n percents.forEach((percents, idx) => {\n const value = getPercentValue(percents, i);\n this.numberDivs[idx].innerText = value + '%';\n });\n };\n // numbers\n if(this.isRetracted) {\n getPercentValue = (percents, index) => Math.round(percents / times * index);\n\n if(animate) {\n for(let i = (times - 1), k = 0; i >= 0; --i, ++k) {\n setTimeout(() => {\n iterate(i);\n }, oneTime * k);\n }\n } else {\n iterate(0);\n }\n } else {\n getPercentValue = (percents, index) => Math.round(percents / times * (index + 1));\n\n if(animate) {\n for(let i = 0; i < times; ++i) {\n setTimeout(() => {\n iterate(i);\n }, oneTime * i);\n }\n } else {\n iterate(times - 1);\n }\n }\n\n if(this.isRetracted) {\n if(animate) {\n this.classList.add('is-retracting');\n }\n\n this.classList.remove('is-voted');\n const cb = () => {\n this.svgLines.forEach((svg) => svg.style.display = 'none');\n };\n\n if(animate) {\n setTimeout(() => {\n this.classList.remove('is-retracting');\n cb();\n }, fullTime);\n } else {\n cb();\n }\n } else {\n this.classList.add('is-voted');\n }\n }\n\n setVotersCount(results: PollResults) {\n const votersCount = results.total_voters || 0;\n let key: LangPackKey;\n const args: FormatterArguments = [votersCount];\n if(this.isClosed) {\n if(this.isQuiz) key = votersCount ? 'Chat.Quiz.TotalVotes' : 'Chat.Quiz.TotalVotesResultEmpty';\n else key = votersCount ? 'Chat.Poll.TotalVotes1' : 'Chat.Poll.TotalVotesResultEmpty';\n } else {\n if(this.isQuiz) key = votersCount ? 'Chat.Quiz.TotalVotes' : 'Chat.Quiz.TotalVotesEmpty';\n else key = votersCount ? 'Chat.Poll.TotalVotes1' : 'Chat.Poll.TotalVotesEmpty';\n }\n\n replaceContent(this.votersCountDiv, i18n(key, args));\n }\n\n setLineProgress(index: number, multiplier: number) {\n const svg = this.svgLines[index];\n\n if(multiplier === -1) {\n svg.style.strokeDasharray = '';\n svg.style.strokeDashoffset = '';\n } else {\n // svg.style.strokeDasharray = (multiplier * this.maxLengths[index]) + ', 485.9';\n svg.style.strokeDasharray = (multiplier * this.maxPercents[index] * PollElement.MAX_LENGTH) + ', 485.9';\n // svg.style.strokeDasharray = (multiplier * this.maxPercents[index] * 100) + '%, 485.9';\n svg.style.strokeDashoffset = '' + multiplier * PollElement.MAX_OFFSET;\n }\n }\n\n // ัƒ ัะปะตะผะตะฝั‚ะฐ ะผะพะณัƒั‚ ะฑั‹ั‚ัŒ ะตั‰ั‘ ะดั€ัƒะณะธะต ะผะตั‚ะพะดั‹ ะธ ัะฒะพะนัั‚ะฒะฐ\n}\n\ncustomElements.define('poll-element', PollElement);\n","// https://stackoverflow.com/a/14824756/6758968\nconst ltrChars = 'A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02B8\\u0300-\\u0590\\u0800-\\u1FFF'+'\\u2C00-\\uFB1C\\uFDFE-\\uFE6F\\uFEFD-\\uFFFF',\n rtlChars = '\\u0591-\\u07FF\\uFB1D-\\uFDFD\\uFE70-\\uFEFC',\n fullRtlDirCheck = new RegExp('^[^'+ltrChars+']*['+rtlChars+']'),\n justRtlDirCheck = new RegExp('['+rtlChars+']');\n\nexport default function isRTL(s: string, anyChar?: boolean) {\n return anyChar ? justRtlDirCheck.test(s) : fullRtlDirCheck.test(s);\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 {AppImManager, ChatSavedPosition, ChatSetPeerOptions} from '../../lib/appManagers/appImManager';\nimport type {HistoryResult, MyMessage} from '../../lib/appManagers/appMessagesManager';\nimport type {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport type Chat from './chat';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport {logger} from '../../lib/logger';\nimport rootScope from '../../lib/rootScope';\nimport BubbleGroups from './bubbleGroups';\nimport PopupDatePicker from '../popups/datePicker';\nimport PopupForward from '../popups/forward';\nimport PopupStickers from '../popups/stickers';\nimport ProgressivePreloader from '../preloader';\nimport Scrollable, {SliceSides} from '../scrollable';\nimport StickyIntersector from '../stickyIntersector';\nimport animationIntersector from '../animationIntersector';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {IS_ANDROID, IS_APPLE, IS_MOBILE, IS_SAFARI} from '../../environment/userAgent';\nimport I18n, {FormatterArguments, i18n, langPack, LangPackKey, UNSUPPORTED_LANG_PACK_KEY, _i18n} from '../../lib/langPack';\nimport AvatarElement from '../avatar';\nimport ripple from '../ripple';\nimport {MessageRender} from './messageRender';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport PollElement from '../poll';\nimport AudioElement from '../audio';\nimport {Chat as MTChat, ChatInvite, Document, Message, MessageEntity, MessageMedia, MessageReplyHeader, Photo, PhotoSize, ReactionCount, ReplyMarkup, SponsoredMessage, Update, UrlAuthResult, User, WebPage} from '../../layer';\nimport {BOT_START_PARAM, NULL_PEER_ID, REPLIES_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport {FocusDirection, ScrollStartCallbackDimensions} from '../../helpers/fastSmoothScroll';\nimport useHeavyAnimationCheck, {getHeavyAnimationPromise, dispatchHeavyAnimationEvent, interruptHeavyAnimation} from '../../hooks/useHeavyAnimationCheck';\nimport {fastRaf, fastRafPromise} from '../../helpers/schedulers';\nimport deferredPromise from '../../helpers/cancellablePromise';\nimport RepliesElement from './replies';\nimport DEBUG from '../../config/debug';\nimport {SliceEnd} from '../../helpers/slicedArray';\nimport PeerTitle from '../peerTitle';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport {toast, toastNew} from '../toast';\nimport {getMiddleware, Middleware} from '../../helpers/middleware';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent, detachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport htmlToDocumentFragment from '../../helpers/dom/htmlToDocumentFragment';\nimport reflowScrollableElement from '../../helpers/dom/reflowScrollableElement';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport whichChild from '../../helpers/dom/whichChild';\nimport {cancelAnimationByKey} from '../../helpers/animation';\nimport assumeType from '../../helpers/assumeType';\nimport debounce, {DebounceReturnType} from '../../helpers/schedulers/debounce';\nimport {SEND_WHEN_ONLINE_TIMESTAMP} from '../../lib/mtproto/constants';\nimport windowSize from '../../helpers/windowSize';\nimport {formatPhoneNumber} from '../../helpers/formatPhoneNumber';\nimport AppMediaViewer from '../appMediaViewer';\nimport SetTransition from '../singleTransition';\nimport handleHorizontalSwipe from '../../helpers/dom/handleHorizontalSwipe';\nimport findUpAttribute from '../../helpers/dom/findUpAttribute';\nimport findUpAsChild from '../../helpers/dom/findUpAsChild';\nimport formatCallDuration from '../../helpers/formatCallDuration';\nimport IS_CALL_SUPPORTED from '../../environment/callSupport';\nimport Button from '../button';\nimport {CallType} from '../../lib/calls/types';\nimport getVisibleRect from '../../helpers/dom/getVisibleRect';\nimport PopupJoinChatInvite from '../popups/joinChatInvite';\nimport {InternalLink, INTERNAL_LINK_TYPE} from '../../lib/appManagers/internalLink';\nimport ReactionsElement, {REACTIONS_ELEMENTS} from './reactions';\nimport type ReactionElement from './reaction';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport pause from '../../helpers/schedulers/pause';\nimport ScrollSaver from '../../helpers/scrollSaver';\nimport getObjectKeysAndSort from '../../helpers/object/getObjectKeysAndSort';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport getViewportSlice from '../../helpers/dom/getViewportSlice';\nimport SuperIntersectionObserver from '../../helpers/dom/superIntersectionObserver';\nimport generateFakeIcon from '../generateFakeIcon';\nimport copyFromElement from '../../helpers/dom/copyFromElement';\nimport PopupElement from '../popups';\nimport setAttachmentSize from '../../helpers/setAttachmentSize';\nimport wrapWebPageDescription from '../wrappers/webPageDescription';\nimport wrapWebPageTitle from '../wrappers/webPageTitle';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\nimport wrapMessageActionTextNew from '../wrappers/messageActionTextNew';\nimport isMentionUnread from '../../lib/appManagers/utils/messages/isMentionUnread';\nimport getMediaFromMessage from '../../lib/appManagers/utils/messages/getMediaFromMessage';\nimport getPeerColorById from '../../lib/appManagers/utils/peers/getPeerColorById';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\nimport generateMessageId from '../../lib/appManagers/utils/messageId/generateMessageId';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {Awaited, SendMessageEmojiInteractionData} from '../../types';\nimport idleController from '../../helpers/idleController';\nimport overlayCounter from '../../helpers/overlayCounter';\nimport {cancelContextMenuOpening} from '../../helpers/dom/attachContextMenuListener';\nimport contextMenuController from '../../helpers/contextMenuController';\nimport {AckedResult} from '../../lib/mtproto/superMessagePort';\nimport middlewarePromise from '../../helpers/middlewarePromise';\nimport {EmoticonsDropdown} from '../emoticonsDropdown';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport noop from '../../helpers/noop';\nimport getAlbumText from '../../lib/appManagers/utils/messages/getAlbumText';\nimport paymentsWrapCurrencyAmount from '../../helpers/paymentsWrapCurrencyAmount';\nimport PopupPayment from '../popups/payment';\nimport isInDOM from '../../helpers/dom/isInDOM';\nimport getStickerEffectThumb from '../../lib/appManagers/utils/stickers/getStickerEffectThumb';\nimport attachStickerViewerListeners from '../stickerViewer';\nimport {makeMediaSize, MediaSize} from '../../helpers/mediaSize';\nimport wrapSticker, {onEmojiStickerClick} from '../wrappers/sticker';\nimport wrapAlbum from '../wrappers/album';\nimport wrapDocument from '../wrappers/document';\nimport wrapGroupedDocuments from '../wrappers/groupedDocuments';\nimport wrapPhoto from '../wrappers/photo';\nimport wrapPoll from '../wrappers/poll';\nimport wrapVideo from '../wrappers/video';\nimport isRTL from '../../helpers/string/isRTL';\nimport NBSP from '../../helpers/string/nbsp';\nimport DotRenderer from '../dotRenderer';\nimport toHHMMSS from '../../helpers/string/toHHMMSS';\nimport {BatchProcessor} from '../../helpers/sortedList';\nimport wrapUrl from '../../lib/richTextProcessor/wrapUrl';\nimport getMessageThreadId from '../../lib/appManagers/utils/messages/getMessageThreadId';\nimport wrapTopicNameButton from '../wrappers/topicNameButton';\nimport wrapMediaSpoiler, {onMediaSpoilerClick, toggleMediaSpoiler} from '../wrappers/mediaSpoiler';\nimport confirmationPopup from '../confirmationPopup';\nimport wrapPeerTitle from '../wrappers/peerTitle';\nimport {PopupPeerCheckboxOptions} from '../popups/peer';\nimport toggleDisability from '../../helpers/dom/toggleDisability';\nimport {copyTextToClipboard} from '../../helpers/clipboard';\n\nexport const USER_REACTIONS_INLINE = false;\nconst USE_MEDIA_TAILS = false;\ntype MESSAGE_ACTION_TYPE = Message.messageService['action']['_'];\ntype IGNORE_ACTION_KEY = MESSAGE_ACTION_TYPE;\ntype IGNORE_ACTION_VALUE = true | ((message: Message.messageService) => boolean);\nconst IGNORE_ACTIONS: Map = new Map([\n ['messageActionHistoryClear', true],\n ['messageActionChatCreate', (message) => message.pFlags.out]\n // 'messageActionChannelMigrateFrom'\n] as [IGNORE_ACTION_KEY, IGNORE_ACTION_VALUE][]);\n\nexport const SERVICE_AS_REGULAR: Set = new Set();\n\nif(IS_CALL_SUPPORTED) {\n SERVICE_AS_REGULAR.add('messageActionPhoneCall');\n}\n\nconst TEST_SCROLL_TIMES: number = undefined;\nlet TEST_SCROLL = TEST_SCROLL_TIMES;\n\nlet queueId = 0;\n\ntype GenerateLocalMessageType = IsService extends true ? Message.messageService : Message.message;\n\nconst SPONSORED_MESSAGE_ID_OFFSET = 1;\nexport const STICKY_OFFSET = 3;\nconst SCROLLED_DOWN_THRESHOLD = 300;\nconst PEER_CHANGED_ERROR = new Error('peer changed');\n\nconst DO_NOT_SLICE_VIEWPORT = false;\nconst DO_NOT_SLICE_VIEWPORT_ON_RENDER = false;\nconst DO_NOT_UPDATE_MESSAGE_VIEWS = false;\nconst DO_NOT_UPDATE_MESSAGE_REACTIONS = false;\nconst DO_NOT_UPDATE_MESSAGE_REPLY = false;\n\nconst BIG_EMOJI_SIZES: {[size: number]: number} = {\n 1: 96,\n 2: 90,\n 3: 84,\n 4: 72,\n 5: 60,\n 6: 48,\n 7: 36\n};\nconst BIG_EMOJI_SIZES_LENGTH = Object.keys(BIG_EMOJI_SIZES).length;\n\ntype Bubble = {\n bubble: HTMLElement,\n mids: Set,\n groupedId?: string\n};\n\ntype MyHistoryResult = HistoryResult | {history: number[]};\n\nfunction getMainMidForGrouped(mids: number[]) {\n return Math.max(...mids);\n}\n\nexport default class ChatBubbles {\n public container: HTMLDivElement;\n public chatInner: HTMLDivElement;\n public scrollable: Scrollable;\n\n private getHistoryTopPromise: Promise;\n private getHistoryBottomPromise: Promise;\n\n // public messagesCount: number = -1;\n\n private unreadOut = new Set();\n public needUpdate: {replyToPeerId: PeerId, replyMid: number, mid: number}[] = []; // if need wrapSingleMessage\n\n public bubbles: {[mid: string]: HTMLElement} = {};\n public skippedMids: Set = new Set();\n public bubblesNewByGroupedId: {[groupId: string]: Bubble} = {};\n public bubblesNew: {[mid: string]: Bubble} = {};\n private dateMessages: {[timestamp: number]: {\n div: HTMLElement,\n firstTimestamp: number,\n container: HTMLElement,\n timeout?: number\n }} = {};\n\n private scrolledDown = true;\n private isScrollingTimeout = 0;\n\n private stickyIntersector: StickyIntersector;\n\n private unreaded: Map = new Map();\n private unreadedSeen: Set = new Set();\n private readPromise: Promise;\n\n private bubbleGroups: BubbleGroups;\n\n private preloader: ProgressivePreloader = null;\n\n // private messagesQueueOnRender: () => void = null;\n private messagesQueueOnRenderAdditional: () => void = null;\n\n private firstUnreadBubble: HTMLElement = null;\n private attachedUnreadBubble: boolean;\n\n public lazyLoadQueue: LazyLoadQueue;\n\n private middlewareHelper = getMiddleware();\n\n private log: ReturnType;\n\n public listenerSetter: ListenerSetter;\n\n private followStack: number[] = [];\n\n private isHeavyAnimationInProgress = false;\n private scrollingToBubble: HTMLElement;\n\n private isFirstLoad = true;\n private needReflowScroll: boolean;\n\n private fetchNewPromise: Promise;\n\n private passEntities: Partial<{\n [_ in MessageEntity['_']]: boolean\n }> = {};\n\n private onAnimateLadder: () => Promise | void;\n // private ladderDeferred: CancellablePromise;\n private resolveLadderAnimation: () => Promise;\n private emptyPlaceholderBubble: HTMLElement;\n\n private viewsMids: Set = new Set();\n private sendViewCountersDebounced: () => Promise;\n\n private isTopPaddingSet = false;\n\n private getSponsoredMessagePromise: Promise;\n\n private previousStickyDate: HTMLElement;\n private sponsoredMessage: SponsoredMessage.sponsoredMessage;\n\n private hoverBubble: HTMLElement;\n private hoverReaction: HTMLElement;\n private sliceViewportDebounced: DebounceReturnType;\n private resizeObserver: ResizeObserver;\n private willScrollOnLoad: boolean;\n public observer: SuperIntersectionObserver;\n\n private renderingMessages: Set = new Set();\n private setPeerCached: boolean;\n private attachPlaceholderOnRender: () => void;\n\n private bubblesToEject: Set = new Set();\n private bubblesToReplace: Map = new Map(); // TO -> FROM\n private updatePlaceholderPosition: () => void;\n private setPeerOptions: {lastMsgId: number; topMessage: number; savedPosition: ChatSavedPosition};\n\n private setPeerTempId: number = 0;\n\n private renderNewPromises: Set> = new Set();\n private updateGradient: boolean;\n\n private extendedMediaMessages: Set = new Set();\n private pollExtendedMediaMessagesPromise: Promise;\n\n private batchProcessor: BatchProcessor>>;\n\n // private reactions: Map;\n\n constructor(\n private chat: Chat,\n private managers: AppManagers\n ) {\n this.log = this.chat.log;\n // this.chat.log.error('Bubbles construction');\n\n this.listenerSetter = new ListenerSetter();\n\n this.constructBubbles();\n\n // * constructor end\n\n this.batchProcessor = new BatchProcessor({\n log: this.log,\n process: this.processBatch,\n possibleError: PEER_CHANGED_ERROR\n });\n this.bubbleGroups = new BubbleGroups(this.chat);\n this.preloader = new ProgressivePreloader({\n cancelable: false\n });\n this.lazyLoadQueue = new LazyLoadQueue(undefined, true);\n this.lazyLoadQueue.queueId = ++queueId;\n\n // this.reactions = new Map();\n\n // * events\n\n // will call when sent for update pos\n this.listenerSetter.add(rootScope)('history_update', async({storageKey, sequential, message}) => {\n if(this.chat.messagesStorageKey !== storageKey || this.chat.type === 'scheduled') {\n return;\n }\n\n const {mid} = message;\n const log = false ? this.log.bindPrefix('history_update-' + mid) : undefined;\n log && log('start');\n\n const bubble = this.bubbles[mid];\n if(!bubble) return;\n\n if(this.renderNewPromises.size) {\n log && log.error('will await new messages render');\n await Promise.all(Array.from(this.renderNewPromises));\n }\n\n if(this.messagesQueuePromise) {\n log && log.error('messages render in process');\n await this.messagesQueuePromise;\n }\n\n if(this.bubbles[mid] !== bubble) return;\n\n // await getHeavyAnimationPromise();\n\n const item = this.bubbleGroups.getItemByBubble(bubble);\n if(!item) { // probably a group item\n log && log.error('no item by bubble', bubble);\n return;\n } else if(item.mid === mid) {\n log && log.warn('wow what', item, mid);\n return;\n }\n\n if(sequential) {\n const group = item.group;\n const newItem = this.bubbleGroups.createItem(bubble, message);\n // newItem.mid = item.mid;\n const _items = this.bubbleGroups.itemsArr.slice();\n indexOfAndSplice(_items, item);\n const foundItem = this.bubbleGroups.findGroupSiblingByItem(newItem, _items);\n if(\n group === foundItem?.group ||\n (group === this.bubbleGroups.getLastGroup() && group.items.length === 1 && newItem.dateTimestamp === item.dateTimestamp) ||\n (this.peerId === rootScope.myId && sequential && newItem.dateTimestamp === item.dateTimestamp)\n ) {\n log && log('item has correct position', item);\n this.bubbleGroups.changeBubbleMid(bubble, mid);\n return;\n }\n }\n\n // return;\n\n // await fastRafPromise();\n // if(this.bubbles[mid] !== bubble) return;\n\n // const groupIndex = this.bubbleGroups.groups.indexOf(group);\n this.bubbleGroups.removeAndUnmountBubble(bubble);\n // if(!group.items.length) { // group has collapsed, next message can have higher mid so have to reposition them too\n // log && log('group has collapsed', item);\n\n // const siblingGroups = this.bubbleGroups.groups.slice(0, groupIndex + 1);\n // for(let length = siblingGroups.length, i = length - 2; i >= 0; --i) {\n // const siblingGroup = siblingGroups[i];\n // const siblingItems = siblingGroup.items;\n // const nextGroup = siblingGroups[i + 1];\n // const nextItems = nextGroup.items;\n\n // let _break = false, moved = false;\n // for(let j = siblingItems.length - 1; j >= 0; --j) {\n // const siblingItem = siblingItems[j];\n // const foundItem = this.bubbleGroups.findGroupSiblingByItem(siblingItem, nextItems);\n // if(!foundItem) {\n // _break = true;\n // break;\n // }\n\n // log('will move item', siblingItem, nextGroup);\n // this.bubbleGroups.removeAndUnmountBubble(siblingItem.bubble);\n // this.bubbleGroups.addItemToGroup(siblingItem, nextGroup);\n // moved = true;\n // }\n\n // if(moved) {\n // nextGroup.mount();\n // }\n\n // if(_break) {\n // break;\n // }\n // }\n // }\n\n const {groups} = this.groupBubbles([{bubble, message}]);\n this.bubbleGroups.mountUnmountGroups(groups);\n\n if(this.scrollingToBubble) {\n this.scrollToEnd();\n }\n\n log && log('end');\n\n // this.bubbleGroups.findIncorrentPositions();\n });\n\n this.listenerSetter.add(rootScope)('dialog_flush', ({peerId}) => {\n if(this.peerId === peerId) {\n this.deleteMessagesByIds(Object.keys(this.bubbles).map((m) => +m));\n }\n });\n\n // Calls when message successfully sent and we have an id\n this.listenerSetter.add(rootScope)('message_sent', async(e) => {\n const {storageKey, tempId, tempMessage, mid, message} = e;\n\n // ! can't use peerId to validate here, because id can be the same in 'scheduled' and 'chat' types\n if(this.chat.messagesStorageKey !== storageKey) {\n return;\n }\n\n const bubbles = this.bubbles;\n const _bubble = bubbles[tempId];\n if(_bubble) {\n const bubble = bubbles[tempId];\n bubbles[mid] = bubble;\n bubble.dataset.mid = '' + mid;\n delete bubbles[tempId];\n\n fastRaf(() => {\n const mid = +bubble.dataset.mid;\n if(bubbles[mid] === bubble && bubble.classList.contains('is-outgoing')) {\n bubble.classList.remove('is-sending', 'is-outgoing');\n bubble.classList.add((this.peerId === rootScope.myId && this.chat.type !== 'scheduled') || !this.unreadOut.has(mid) ? 'is-read' : 'is-sent');\n }\n });\n }\n\n if(this.unreadOut.has(tempId)) {\n this.unreadOut.delete(tempId);\n this.unreadOut.add(mid);\n }\n\n // * check timing of scheduled message\n if(this.chat.type === 'scheduled') {\n const timestamp = Date.now() / 1000 | 0;\n const maxTimestamp = tempMessage.date - 10;\n if(timestamp >= maxTimestamp) {\n this.deleteMessagesByIds([mid]);\n }\n }\n\n if(!_bubble) {\n return;\n }\n\n let messages: (Message.message | Message.messageService)[], tempIds: number[];\n const groupedId = (message as Message.message).grouped_id;\n if(groupedId) {\n messages = await this.managers.appMessagesManager.getMessagesByAlbum(groupedId);\n const mids = messages.map(({mid}) => mid);\n if(!mids.length || getMainMidForGrouped(mids) !== mid || bubbles[mid] !== _bubble) {\n return;\n }\n\n if(bubbles[mid] !== _bubble) {\n return;\n }\n\n tempIds = (Array.from(_bubble.querySelectorAll('.grouped-item')) as HTMLElement[]).map((el) => +el.dataset.mid);\n } else {\n messages = [message];\n tempIds = [tempId];\n }\n\n const reactionsElements = Array.from(_bubble.querySelectorAll('reactions-element')) as ReactionsElement[];\n if(reactionsElements.length) {\n reactionsElements.forEach((reactionsElement) => {\n reactionsElement.changeMessage(message as Message.message);\n });\n }\n\n (messages as Message.message[]).forEach((message, idx) => {\n if(!message) {\n return;\n }\n\n const tempId = tempIds[idx];\n const mid = message.mid;\n const bubble: HTMLElement = _bubble.querySelector(`.document-container[data-mid=\"${mid}\"]`) || _bubble;\n\n if(message._ !== 'message') {\n return;\n }\n\n if(message.replies) {\n const repliesElement = _bubble.querySelector('replies-element') as RepliesElement;\n if(repliesElement) {\n repliesElement.message = message;\n repliesElement.init();\n }\n }\n\n const media = message.media ?? {} as MessageMedia.messageMediaEmpty;\n const doc = (media as MessageMedia.messageMediaDocument).document as Document.document;\n const poll = (media as MessageMedia.messageMediaPoll).poll;\n const webPage = (media as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage;\n if(doc) {\n const div = bubble.querySelector(`.document-container[data-mid=\"${tempId}\"] .document`);\n if(div) {\n const container = findUpClassName(div, 'document-container');\n\n if(!tempMessage.media?.document?.thumbs?.length && doc.thumbs?.length) {\n getHeavyAnimationPromise().then(async() => {\n const timeSpan = div.querySelector('.time');\n const newDiv = await wrapDocument({message, fontSize: rootScope.settings.messagesTextSize});\n div.replaceWith(newDiv);\n\n if(timeSpan) {\n (newDiv.querySelector('.document') || newDiv).append(timeSpan);\n }\n });\n }\n\n if(container) {\n container.dataset.mid = '' + mid;\n }\n }\n\n const element = bubble.querySelector(`audio-element[data-mid=\"${tempId}\"], .document[data-doc-id=\"${tempId}\"], .media-round[data-mid=\"${tempId}\"]`) as HTMLElement;\n if(element) {\n if(element instanceof AudioElement || element.classList.contains('media-round')) {\n element.dataset.mid = '' + message.mid;\n delete element.dataset.isOutgoing;\n (element as any).message = message;\n (element as any).onLoad(true);\n } else {\n element.dataset.docId = '' + doc.id;\n (element as any).doc = doc;\n }\n }\n } else if(poll) {\n const pollElement = bubble.querySelector('poll-element') as PollElement;\n if(pollElement) {\n pollElement.message = message;\n pollElement.setAttribute('poll-id', '' + poll.id);\n pollElement.setAttribute('message-id', '' + mid);\n }\n } else if(webPage && !bubble.querySelector('.web')) {\n getHeavyAnimationPromise().then(() => {\n this.safeRenderMessage(message, true, bubble);\n this.scrollToBubbleIfLast(bubble);\n });\n }\n\n // set new mids to album items for mediaViewer\n if(groupedId) {\n const item = (bubble.querySelector(`.grouped-item[data-mid=\"${tempId}\"]`) as HTMLElement) || bubble; // * it can be .document-container\n if(item) {\n item.dataset.mid = '' + mid;\n }\n }\n });\n });\n\n this.listenerSetter.add(rootScope)('message_edit', async({storageKey, message}) => {\n if(storageKey !== this.chat.messagesStorageKey) return;\n\n const bubble = this.bubbles[message.mid];\n if(!bubble) return;\n\n await getHeavyAnimationPromise();\n if(this.bubbles[message.mid] !== bubble) return;\n\n this.safeRenderMessage(message, true, bubble);\n });\n\n this.listenerSetter.add(rootScope)('message_error', async({storageKey, tempId}) => {\n if(storageKey !== this.chat.messagesStorageKey) return;\n\n const bubble = this.bubbles[tempId];\n if(!bubble) return;\n\n await getHeavyAnimationPromise();\n if(this.bubbles[tempId] !== bubble) return;\n\n bubble.classList.remove('is-outgoing');\n bubble.classList.add('is-error');\n });\n\n this.listenerSetter.add(rootScope)('album_edit', ({peerId, messages, deletedMids}) => {\n if(peerId !== this.peerId) return;\n\n const mids = messages.map(({mid}) => mid);\n const oldMids = mids.concat(Array.from(deletedMids));\n const wasMainMid = getMainMidForGrouped(oldMids);\n const bubble = this.bubbles[wasMainMid];\n if(!bubble) {\n return;\n }\n\n const mainMid = getMainMidForGrouped(mids);\n const message = messages.find((message) => message.mid === mainMid);\n this.safeRenderMessage(message, true, bubble);\n });\n\n // this.listenerSetter.add(rootScope)('peer_title_edit', async(peerId) => {\n // if(peerId.isUser()) {\n // const middleware = this.getMiddleware();\n // const user = await this.managers.appUsersManager.getUser(peerId.toUserId());\n // if(!middleware()) return;\n\n // const isPremium = user?.pFlags?.premium;\n // const groups = this.bubbleGroups.groups.filter((group) => group.avatar?.peerId === peerId);\n // groups.forEach((group) => {\n // group.avatar.classList.toggle('is-premium', isPremium);\n // group.avatar.classList.toggle('tgico-star', isPremium);\n // });\n // }\n // });\n\n if(!DO_NOT_UPDATE_MESSAGE_REACTIONS/* && false */) {\n this.listenerSetter.add(rootScope)('messages_reactions', async(arr) => {\n if(this.chat.type === 'scheduled') {\n return;\n }\n\n let scrollSaver: ScrollSaver;\n\n const a = arr.map(async({message, changedResults}) => {\n if(this.peerId !== message.peerId) {\n return;\n }\n\n const result = await this.getMountedBubble(message.mid, message);\n if(!result) {\n return;\n }\n\n return {bubble: result.bubble, message, changedResults};\n });\n\n let top: number;\n (await Promise.all(a)).filter(Boolean).forEach(({bubble, message, changedResults}) => {\n if(!scrollSaver) {\n scrollSaver = this.createScrollSaver(false);\n scrollSaver.save();\n }\n\n const key = message.peerId + '_' + message.mid;\n const set = REACTIONS_ELEMENTS.get(key);\n if(set) {\n for(const element of set) {\n element.update(message, changedResults);\n }\n } else if(!message.reactions || !message.reactions.results.length) {\n return;\n } else {\n this.appendReactionsElementToBubble(bubble, message, message, changedResults);\n }\n });\n\n if(scrollSaver) {\n scrollSaver.restore();\n }\n });\n }\n\n !DO_NOT_UPDATE_MESSAGE_REPLY && this.listenerSetter.add(rootScope)('messages_downloaded', async({peerId, mids}) => {\n const middleware = this.getMiddleware();\n await getHeavyAnimationPromise();\n if(!middleware()) return;\n\n (mids as number[]).forEach((mid) => {\n const needUpdate = this.needUpdate;\n const filtered: typeof needUpdate[0][] = [];\n forEachReverse(this.needUpdate, (obj, idx) => {\n if(obj.replyMid === mid && obj.replyToPeerId === peerId) {\n this.needUpdate.splice(idx, 1)[0];\n filtered.push(obj);\n }\n });\n\n filtered.forEach(async({mid, replyMid, replyToPeerId}) => {\n const bubble = this.bubbles[mid];\n if(!bubble) return;\n\n const message = (await this.chat.getMessage(mid)) as Message.message;\n\n MessageRender.setReply({\n chat: this.chat,\n bubble,\n message\n });\n });\n });\n });\n\n attachStickerViewerListeners({\n listenTo: this.scrollable.container,\n listenerSetter: this.listenerSetter,\n findTarget: (e) => {\n const target = e.target as HTMLElement;\n const found = target.closest('.attachment.media-sticker-wrapper') || (findUpClassName(target, 'attachment') && target.closest('.custom-emoji'));\n return found as HTMLElement;\n }\n });\n attachClickEvent(this.scrollable.container, this.onBubblesClick, {listenerSetter: this.listenerSetter});\n // this.listenerSetter.add(this.bubblesContainer)('click', this.onBubblesClick/* , {capture: true, passive: false} */);\n\n this.listenerSetter.add(this.scrollable.container)('mousedown', (e) => {\n if(e.button !== 0) return;\n\n const code: HTMLElement = findUpTag(e.target, 'CODE');\n if(code) {\n cancelEvent(e);\n copyFromElement(code);\n\n const onClick = (e: MouseEvent) => {\n cancelEvent(e);\n toastNew({\n langPackKey: 'TextCopied',\n onClose: () => {\n detach();\n }\n });\n };\n\n const detach = attachClickEvent(window, onClick, {listenerSetter: this.listenerSetter, once: true, capture: true});\n return;\n }\n });\n\n /* if(false) */this.stickyIntersector = new StickyIntersector(this.scrollable.container, (stuck, target) => {\n for(const timestamp in this.dateMessages) {\n const dateMessage = this.dateMessages[timestamp];\n if(dateMessage.container === target) {\n const dateBubble = dateMessage.div;\n\n // dateMessage.container.classList.add('has-sticky-dates');\n\n // SetTransition(dateBubble, 'kek', stuck, this.previousStickyDate ? 300 : 0);\n // if(this.previousStickyDate) {\n // dateBubble.classList.add('kek');\n // }\n\n dateBubble.classList.toggle('is-sticky', stuck);\n if(stuck) {\n this.previousStickyDate = dateBubble;\n }\n\n break;\n }\n }\n\n if(this.previousStickyDate) {\n // fastRaf(() => {\n // this.bubblesContainer.classList.add('has-sticky-dates');\n // });\n }\n });\n\n if(!IS_SAFARI) {\n this.sliceViewportDebounced = debounce(this.sliceViewport.bind(this), 3000, false, true);\n }\n\n let middleware: ReturnType;\n useHeavyAnimationCheck(() => {\n this.isHeavyAnimationInProgress = true;\n this.lazyLoadQueue.lock();\n middleware = this.getMiddleware();\n\n // if(this.sliceViewportDebounced) {\n // this.sliceViewportDebounced.clearTimeout();\n // }\n }, () => {\n this.isHeavyAnimationInProgress = false;\n\n if(middleware?.()) {\n this.lazyLoadQueue.unlockAndRefresh();\n\n // if(this.sliceViewportDebounced) {\n // this.sliceViewportDebounced();\n // }\n }\n\n middleware = null;\n }, this.listenerSetter);\n }\n\n private constructBubbles() {\n const container = this.container = document.createElement('div');\n container.classList.add('bubbles', 'scrolled-down');\n\n const chatInner = this.chatInner = document.createElement('div');\n chatInner.classList.add('bubbles-inner');\n\n this.setScroll();\n\n container.append(this.scrollable.container);\n }\n\n public attachContainerListeners() {\n const container = this.container;\n\n this.chat.contextMenu.attachTo(container);\n this.chat.selection.attachListeners(container, new ListenerSetter());\n\n if(DEBUG) {\n this.listenerSetter.add(container)('dblclick', async(e) => {\n const bubble = findUpClassName(e.target, 'grouped-item') || findUpClassName(e.target, 'bubble');\n if(bubble) {\n const mid = +bubble.dataset.mid\n this.log('debug message:', await this.chat.getMessage(mid));\n this.highlightBubble(bubble);\n }\n });\n }\n\n if(!IS_MOBILE) {\n this.listenerSetter.add(container)('dblclick', async(e) => {\n if(this.chat.type === 'pinned' ||\n this.chat.selection.isSelecting ||\n !(await this.chat.canSend())) {\n return;\n }\n\n const target = e.target as HTMLElement;\n const bubble = target.classList.contains('bubble') ?\n target :\n (target.classList.contains('document-selection') ? target.parentElement : null);\n if(bubble && !bubble.classList.contains('bubble-first')) {\n const mid = +bubble.dataset.mid;\n const message = await this.chat.getMessage(mid);\n if(message.pFlags.is_outgoing) {\n return;\n }\n\n this.chat.input.initMessageReply(mid);\n }\n });\n } else if(IS_TOUCH_SUPPORTED) {\n const className = 'is-gesturing-reply';\n const MAX = 64;\n const replyAfter = MAX * .75;\n let shouldReply = false;\n let target: HTMLElement;\n let icon: HTMLElement;\n let swipeAvatar: HTMLElement;\n handleHorizontalSwipe({\n element: container,\n verifyTouchTarget: async(e) => {\n if(this.chat.type === 'pinned' || this.chat.selection.isSelecting || !(await this.chat.canSend())) {\n return false;\n }\n\n // cancelEvent(e);\n target = findUpClassName(e.target, 'bubble');\n if(target) {\n try {\n const avatar = target.parentElement.querySelector('.bubbles-group-avatar') as HTMLElement\n if(avatar) {\n const visibleRect = getVisibleRect(avatar, target);\n if(visibleRect) {\n swipeAvatar = avatar;\n }\n }\n } catch(err) {}\n\n [target, swipeAvatar].filter(Boolean).forEach((element) => {\n SetTransition({\n element,\n className,\n forwards: true,\n duration: 250\n });\n void element.offsetLeft; // reflow\n });\n\n if(!icon) {\n icon = document.createElement('span');\n icon.classList.add('tgico-reply_filled', 'bubble-gesture-reply-icon');\n } else {\n icon.classList.remove('is-visible');\n icon.style.opacity = '';\n }\n\n target/* .querySelector('.bubble-content') */.append(icon);\n }\n\n return !!target;\n },\n onSwipe: (xDiff) => {\n shouldReply = xDiff >= replyAfter;\n\n if(shouldReply && !icon.classList.contains('is-visible')) {\n icon.classList.add('is-visible');\n }\n icon.style.opacity = '' + Math.min(1, xDiff / replyAfter);\n\n const x = -Math.max(0, Math.min(MAX, xDiff));\n const transform = `translateX(${x}px)`;\n target.style.transform = transform;\n if(swipeAvatar) {\n swipeAvatar.style.transform = transform;\n }\n cancelContextMenuOpening();\n },\n onReset: () => {\n const _target = target;\n const _swipeAvatar = swipeAvatar;\n target = swipeAvatar = undefined;\n\n const onTransitionEnd = () => {\n if(icon.parentElement === _target) {\n icon.classList.remove('is-visible');\n icon.remove();\n }\n };\n\n [_target, _swipeAvatar].filter(Boolean).forEach((element, idx) => {\n SetTransition({\n element,\n className,\n forwards: false,\n duration: 250,\n onTransitionEnd: idx === 0 ? onTransitionEnd : undefined\n });\n });\n\n fastRaf(() => {\n _target.style.transform = '';\n if(_swipeAvatar) {\n _swipeAvatar.style.transform = '';\n }\n\n if(shouldReply) {\n const {mid} = _target.dataset;\n this.chat.input.initMessageReply(+mid);\n shouldReply = false;\n }\n });\n },\n listenerOptions: {capture: true}\n });\n }\n }\n\n public constructPeerHelpers() {\n // will call when message is sent (only 1)\n this.listenerSetter.add(rootScope)('history_append', async({storageKey, message}) => {\n if(storageKey !== this.chat.messagesStorageKey || this.chat.type === 'scheduled') return;\n\n if(rootScope.settings.animationsEnabled) {\n this.updateGradient = true;\n }\n\n if(!this.scrollable.loadedAll.bottom) {\n this.chat.setMessageId();\n } else {\n this.renderNewMessage(message, true);\n }\n });\n\n this.listenerSetter.add(rootScope)('history_multiappend', (message) => {\n if(this.peerId !== message.peerId || this.chat.type === 'scheduled') return;\n this.renderNewMessage(message);\n });\n\n this.listenerSetter.add(rootScope)('history_delete', ({peerId, msgs}) => {\n if(peerId !== this.peerId || this.chat.type === 'scheduled') {\n return;\n }\n\n this.deleteMessagesByIds(Array.from(msgs));\n });\n\n this.listenerSetter.add(rootScope)('dialog_unread', ({peerId}) => {\n if(peerId === this.peerId) {\n this.chat.input.setUnreadCount();\n\n getHeavyAnimationPromise().then(() => {\n this.updateUnreadByDialog();\n });\n }\n });\n\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\n if(!dialogs.has(this.peerId) || this.chat.type === 'scheduled') {\n return;\n }\n\n this.chat.input.setUnreadCount();\n });\n\n this.listenerSetter.add(rootScope)('dialog_notify_settings', (dialog) => {\n if(this.peerId !== dialog.peerId || this.chat.type === 'scheduled') {\n return;\n }\n\n this.chat.input.setUnreadCount();\n });\n\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n const {peerId} = this;\n if(peerId !== chatId.toPeerId(true)) {\n return;\n }\n\n const chat = await this.managers.appChatsManager.getChat(chatId);\n const hadRights = this.chatInner.classList.contains('has-rights');\n const hasRights = await this.chat.canSend();\n\n if(hadRights !== hasRights) {\n const callbacks = await Promise.all([\n this.finishPeerChange(),\n this.chat.input.finishPeerChange()\n ]);\n\n callbacks.forEach((callback) => callback());\n }\n\n if(!!(chat as MTChat.channel).pFlags.forum !== this.chat.isForum && this.chat.type === 'chat') {\n this.chat.peerId = 0;\n this.chat.appImManager.setPeer({peerId});\n }\n });\n\n this.listenerSetter.add(rootScope)('history_reload', (peerId) => {\n if(peerId !== this.peerId) {\n return;\n }\n\n const mids = getObjectKeysAndSort(this.bubbles, 'desc').filter((mid) => mid > 0);\n const middleware = this.getMiddleware();\n this.managers.appMessagesManager.reloadMessages(this.peerId, mids).then((messages) => {\n if(!middleware()) return;\n\n const toDelete: number[] = [];\n messages.forEach((message, idx) => {\n const mid = mids[idx];\n if(message) {\n const bubble = this.bubbles[message.mid];\n if(!bubble) return;\n\n this.safeRenderMessage(message, true, bubble);\n } else {\n toDelete.push(mid);\n }\n });\n\n this.deleteMessagesByIds(toDelete);\n\n this.setLoaded('top', false);\n this.setLoaded('bottom', false);\n this.scrollable.checkForTriggers();\n });\n });\n\n this.listenerSetter.add(rootScope)('settings_updated', async({key}) => {\n if(key === 'settings.emoji.big') {\n const middleware = this.getMiddleware();\n const mids = getObjectKeysAndSort(this.bubbles, 'desc');\n const m = mids.map(async(mid) => {\n const bubble = this.bubbles[mid];\n if(bubble.classList.contains('can-have-big-emoji')) {\n return {bubble, message: await this.chat.getMessage(mid)};\n }\n });\n\n const awaited = await Promise.all(m);\n if(!middleware()) {\n return;\n }\n\n awaited.filter(Boolean).forEach(({bubble, message}) => {\n if(this.bubbles[message.mid] !== bubble) {\n return;\n }\n\n this.safeRenderMessage(message, true, bubble);\n });\n }\n });\n\n !DO_NOT_UPDATE_MESSAGE_VIEWS && this.listenerSetter.add(rootScope)('messages_views', (arr) => {\n if(this.chat.type === 'scheduled') return;\n\n fastRaf(() => {\n let scrollSaver: ScrollSaver;\n for(const {peerId, views, mid} of arr) {\n if(this.peerId !== peerId) continue;\n\n const bubble = this.bubbles[mid];\n if(!bubble) continue;\n\n const postViewsElements = Array.from(bubble.querySelectorAll('.post-views')) as HTMLElement[];\n if(!postViewsElements.length) continue;\n\n const str = formatNumber(views, 1);\n let different = false;\n postViewsElements.forEach((postViews) => {\n if(different || postViews.textContent !== str) {\n if(!scrollSaver) {\n scrollSaver = this.createScrollSaver(true);\n scrollSaver.save();\n }\n\n different = true;\n postViews.textContent = str;\n }\n });\n }\n\n scrollSaver?.restore();\n });\n });\n\n this.observer = new SuperIntersectionObserver({root: this.scrollable.container});\n\n this.sendViewCountersDebounced = debounce(() => {\n const mids = [...this.viewsMids];\n this.viewsMids.clear();\n\n this.managers.appMessagesManager.incrementMessageViews(this.peerId, mids);\n }, 1000, false, true);\n\n // * pinned part start\n this.listenerSetter.add(rootScope)('peer_pinned_messages', ({peerId, mids, pinned}) => {\n if(this.chat.type !== 'pinned' || peerId !== this.peerId) {\n return;\n }\n\n if(mids) {\n if(!pinned) {\n this.deleteMessagesByIds(mids);\n }\n }\n });\n // * pinned part end\n\n // * scheduled part start\n const onUpdate = async() => {\n this.chat.topbar.setTitle((await this.managers.appMessagesManager.getScheduledMessagesStorage(this.peerId)).size);\n };\n\n this.listenerSetter.add(rootScope)('scheduled_new', (message) => {\n if(this.chat.type !== 'scheduled' || message.peerId !== this.peerId) return;\n\n this.renderNewMessage(message);\n onUpdate();\n });\n\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId, mids}) => {\n if(this.chat.type !== 'scheduled' || peerId !== this.peerId) return;\n\n this.deleteMessagesByIds(mids);\n onUpdate();\n });\n // * scheduled part end\n }\n\n private get peerId() {\n return this.chat.peerId;\n }\n\n public get messagesQueuePromise() {\n return this.batchProcessor.queuePromise;\n }\n\n private createScrollSaver(reverse = true) {\n const scrollSaver = new ScrollSaver(this.scrollable, '.bubble:not(.is-date)', reverse);\n return scrollSaver;\n }\n\n private unreadedObserverCallback = (entry: IntersectionObserverEntry) => {\n if(entry.isIntersecting) {\n const target = entry.target as HTMLElement;\n const mid = this.unreaded.get(target as HTMLElement);\n this.onUnreadedInViewport(target, mid);\n }\n };\n\n private viewsObserverCallback = (entry: IntersectionObserverEntry) => {\n if(entry.isIntersecting) {\n const mid = +(entry.target as HTMLElement).dataset.mid;\n this.observer.unobserve(entry.target, this.viewsObserverCallback);\n\n if(mid) {\n this.viewsMids.add(mid);\n this.sendViewCountersDebounced();\n } else {\n const {sponsoredMessage} = this;\n const randomId = sponsoredMessage?.random_id;\n if(randomId) {\n this.managers.appChatsManager.viewSponsoredMessage(this.peerId.toChatId(), randomId);\n delete sponsoredMessage.random_id;\n }\n }\n }\n };\n\n private stickerEffectObserverCallback = (entry: IntersectionObserverEntry) => {\n if(entry.isIntersecting) {\n this.observer.unobserve(entry.target, this.stickerEffectObserverCallback);\n\n const attachmentDiv: HTMLElement = entry.target.querySelector('.attachment');\n getHeavyAnimationPromise().then(() => {\n if(isInDOM(attachmentDiv)) {\n simulateClickEvent(attachmentDiv);\n }\n });\n }\n };\n\n private createResizeObserver() {\n if(!('ResizeObserver' in window) || this.resizeObserver) {\n return;\n }\n\n const container = this.scrollable.container;\n let wasHeight = 0/* container.offsetHeight */;\n let resizing = false;\n let skip = false;\n let scrolled = 0;\n let part = 0;\n let rAF = 0;\n // let skipNext = true;\n\n const onResizeEnd = () => {\n const height = container.offsetHeight;\n const isScrolledDown = this.scrollable.isScrolledDown;\n if(height !== wasHeight && (!skip || !isScrolledDown)) { // * fix opening keyboard while ESG is active, offsetHeight will change right between 'start' and this first frame\n part += wasHeight - height;\n }\n\n /* if(DEBUG) {\n this.log('resize end', scrolled, part, this.scrollable.scrollTop, height, wasHeight, this.scrollable.isScrolledDown);\n } */\n\n if(part) {\n this.scrollable.setScrollTopSilently(this.scrollable.scrollTop + Math.round(part));\n }\n\n wasHeight = height;\n scrolled = 0;\n rAF = 0;\n part = 0;\n resizing = false;\n skip = false;\n };\n\n const setEndRAF = (single: boolean) => {\n if(rAF) window.cancelAnimationFrame(rAF);\n rAF = window.requestAnimationFrame(single ? onResizeEnd : () => {\n rAF = window.requestAnimationFrame(onResizeEnd);\n // this.log('resize after RAF', part);\n });\n };\n\n const processEntries: ResizeObserverCallback = (entries) => {\n /* if(skipNext) {\n skipNext = false;\n return;\n } */\n\n if(skip) {\n setEndRAF(false);\n return;\n }\n\n const entry = entries[0];\n const height = entry.contentRect.height;/* Math.ceil(entry.contentRect.height); */\n\n if(!wasHeight) {\n wasHeight = height;\n return;\n }\n\n const realDiff = wasHeight - height;\n let diff = realDiff + part;\n const _part = diff % 1;\n diff -= _part;\n\n if(!resizing) {\n resizing = true;\n\n /* if(DEBUG) {\n this.log('resize start', realDiff, this.scrollable.scrollTop, this.scrollable.container.offsetHeight, this.scrollable.isScrolledDown);\n } */\n\n if(realDiff < 0 && this.scrollable.isScrolledDown) {\n // if(isSafari) { // * fix opening keyboard while ESG is active\n part = -realDiff;\n // }\n\n skip = true;\n setEndRAF(false);\n return;\n }\n }\n\n scrolled += diff;\n\n /* if(DEBUG) {\n this.log('resize', wasHeight - height, diff, this.scrollable.container.offsetHeight, this.scrollable.isScrolledDown, height, wasHeight);\n } */\n\n if(diff) {\n const needScrollTop = this.scrollable.scrollTop + diff;\n this.scrollable.setScrollTopSilently(needScrollTop);\n }\n\n setEndRAF(false);\n\n part = _part;\n wasHeight = height;\n };\n\n const resizeObserver = this.resizeObserver = new ResizeObserver(processEntries);\n resizeObserver.observe(container);\n }\n\n private destroyResizeObserver() {\n const resizeObserver = this.resizeObserver;\n if(!resizeObserver) {\n return;\n }\n\n resizeObserver.disconnect();\n this.resizeObserver = undefined;\n }\n\n private onBubblesMouseMove = async(e: MouseEvent) => {\n const content = findUpClassName(e.target, 'bubble-content');\n if(\n this.chat.type !== 'scheduled' &&\n content &&\n !this.chat.selection.isSelecting &&\n !findUpClassName(e.target, 'service') &&\n !findUpClassName(e.target, 'bubble-beside-button')\n ) {\n const bubble = findUpClassName(content, 'bubble');\n if(!this.chat.selection.canSelectBubble(bubble)) {\n this.unhoverPrevious();\n return;\n }\n\n let {hoverBubble, hoverReaction} = this;\n if(bubble === hoverBubble) {\n return;\n }\n\n this.unhoverPrevious();\n\n hoverBubble = this.hoverBubble = bubble;\n hoverReaction = this.hoverReaction;\n // hoverReaction = contentWrapper.querySelector('.bubble-hover-reaction');\n if(!hoverReaction) {\n hoverReaction = this.hoverReaction = document.createElement('div');\n hoverReaction.classList.add('bubble-hover-reaction');\n\n const stickerWrapper = document.createElement('div');\n stickerWrapper.classList.add('bubble-hover-reaction-sticker');\n hoverReaction.append(stickerWrapper);\n\n content.append(hoverReaction);\n\n let message = await this.chat.getMessage(+bubble.dataset.mid);\n if(message?._ !== 'message') {\n this.unhoverPrevious();\n return;\n }\n\n message = await this.managers.appMessagesManager.getGroupsFirstMessage(message);\n\n const middleware = this.getMiddleware(() => this.hoverReaction === hoverReaction);\n Promise.all([\n this.managers.appReactionsManager.getAvailableReactionsByMessage(message),\n pause(400)\n ]).then(([availableReactions]) => {\n const availableReaction = availableReactions[0];\n if(!availableReaction) {\n hoverReaction.remove();\n return;\n }\n\n wrapSticker({\n div: stickerWrapper,\n doc: availableReaction.select_animation,\n width: 18,\n height: 18,\n needUpscale: true,\n middleware,\n group: this.chat.animationGroup,\n withThumb: false,\n needFadeIn: false\n }).then(({render}) => render).then((player) => {\n assumeType(player);\n\n player.addEventListener('firstFrame', () => {\n if(!middleware()) {\n // debugger;\n return;\n }\n\n hoverReaction.dataset.loaded = '1';\n this.setHoverVisible(hoverReaction, true);\n }, {once: true});\n\n attachClickEvent(hoverReaction, (e) => {\n cancelEvent(e); // cancel triggering selection\n\n this.managers.appReactionsManager.sendReaction(message as Message.message, availableReaction);\n this.unhoverPrevious();\n }, {listenerSetter: this.listenerSetter});\n }, noop);\n });\n } else if(hoverReaction.dataset.loaded) {\n this.setHoverVisible(hoverReaction, true);\n }\n } else {\n this.unhoverPrevious();\n }\n };\n\n public setReactionsHoverListeners() {\n this.listenerSetter.add(contextMenuController)('toggle', this.unhoverPrevious);\n this.listenerSetter.add(overlayCounter)('change', this.unhoverPrevious);\n this.listenerSetter.add(this.chat.selection)('toggle', this.unhoverPrevious);\n this.listenerSetter.add(this.container)('mousemove', this.onBubblesMouseMove);\n }\n\n private setHoverVisible(hoverReaction: HTMLElement, visible: boolean) {\n if(hoverReaction.parentElement) {\n hoverReaction.parentElement.classList.toggle('hover-reaction-visible', visible);\n }\n\n SetTransition({\n element: hoverReaction,\n className: 'is-visible',\n forwards: visible,\n duration: 200,\n onTransitionEnd: visible ? undefined : () => {\n hoverReaction.remove();\n },\n useRafs: 2\n });\n }\n\n private unhoverPrevious = () => {\n const {hoverBubble, hoverReaction} = this;\n if(hoverBubble) {\n this.setHoverVisible(hoverReaction, false);\n this.hoverBubble = undefined;\n this.hoverReaction = undefined;\n }\n };\n\n public setStickyDateManually() {\n return;\n\n const timestamps = Object.keys(this.dateMessages).map((k) => +k).sort((a, b) => b - a);\n let lastVisible: HTMLElement;\n\n // if(this.chatInner.classList.contains('is-scrolling')) {\n const {scrollTop} = this.scrollable.container;\n const isOverflown = scrollTop > 0;\n if(isOverflown) {\n for(const timestamp of timestamps) {\n const dateMessage = this.dateMessages[timestamp];\n const visibleRect = getVisibleRect(dateMessage.container, this.scrollable.container);\n if(visibleRect && visibleRect.overflow.top) {\n lastVisible = dateMessage.div;\n } else if(lastVisible) {\n break;\n }\n }\n }\n // }\n\n if(lastVisible === this.previousStickyDate) {\n return;\n }\n\n if(lastVisible) {\n const needReflow = /* !!this.chat.setPeerPromise || */!this.previousStickyDate;\n if(needReflow) {\n lastVisible.classList.add('no-transition');\n }\n\n lastVisible.classList.add('is-sticky');\n\n if(needReflow) {\n void lastVisible.offsetLeft; // reflow\n lastVisible.classList.remove('no-transition');\n }\n }\n\n if(this.previousStickyDate && this.previousStickyDate !== lastVisible) {\n this.previousStickyDate.classList.remove('is-sticky');\n }\n\n this.previousStickyDate = lastVisible;\n }\n\n public getRenderedLength() {\n return Object.keys(this.bubbles).length - this.skippedMids.size;\n }\n\n private onUnreadedInViewport(target: HTMLElement, mid: number) {\n this.unreadedSeen.add(mid);\n this.observer.unobserve(target, this.unreadedObserverCallback);\n this.unreaded.delete(target);\n this.readUnreaded();\n }\n\n private readUnreaded() {\n if(this.readPromise) return;\n\n const middleware = this.getMiddleware();\n this.readPromise = idleController.getFocusPromise().then(async() => {\n if(!middleware()) return;\n let maxId = Math.max(...Array.from(this.unreadedSeen));\n\n // ? if message with maxId is not rendered ?\n if(this.scrollable.loadedAll.bottom) {\n const bubblesMaxId = Math.max(...Object.keys(this.bubbles).map((i) => +i));\n if(maxId >= bubblesMaxId) {\n maxId = Math.max((await this.chat.getHistoryMaxId()) || 0, maxId);\n }\n }\n\n this.unreaded.forEach((mid, target) => {\n if(mid <= maxId) {\n this.onUnreadedInViewport(target, mid);\n }\n });\n\n const readContents: number[] = [];\n for(const mid of this.unreadedSeen) {\n const message: MyMessage = await this.chat.getMessage(mid);\n if(isMentionUnread(message)) {\n readContents.push(mid);\n }\n }\n\n this.managers.appMessagesManager.readMessages(this.peerId, readContents);\n\n this.unreadedSeen.clear();\n\n if(DEBUG) {\n this.log('will readHistory by maxId:', maxId);\n }\n\n // return;\n\n return this.managers.appMessagesManager.readHistory(this.peerId, maxId, this.chat.threadId).catch((err: any) => {\n this.log.error('readHistory err:', err);\n this.managers.appMessagesManager.readHistory(this.peerId, maxId, this.chat.threadId);\n }).finally(() => {\n if(!middleware()) return;\n this.readPromise = undefined;\n\n if(this.unreadedSeen.size) {\n this.readUnreaded();\n }\n });\n });\n }\n\n public onBubblesClick = async(e: Event) => {\n let target = e.target as HTMLElement;\n let bubble: HTMLElement = null;\n try {\n bubble = findUpClassName(target, 'bubble');\n } catch(err) {}\n\n if(!bubble && !this.chat.selection.isSelecting) {\n const avatar = findUpClassName(target, 'user-avatar');\n if(!avatar) {\n return;\n }\n\n const peerId = avatar.dataset.peerId.toPeerId();\n if(peerId !== NULL_PEER_ID) {\n this.chat.appImManager.setInnerPeer({peerId});\n } else {\n toast(I18n.format('HidAccount', true));\n }\n return;\n }\n\n if(bubble.classList.contains('is-date') && findUpClassName(target, 'bubble-content')) {\n if(bubble.classList.contains('is-fake')) {\n bubble = bubble.previousElementSibling as HTMLElement;\n }\n\n if(bubble.classList.contains('is-sticky') && !this.chatInner.classList.contains('is-scrolling')) {\n return;\n }\n\n for(const timestamp in this.dateMessages) {\n const d = this.dateMessages[timestamp];\n if(d.div === bubble) {\n PopupElement.createPopup(PopupDatePicker, new Date(+timestamp), this.onDatePick).show();\n break;\n }\n }\n\n return;\n }\n\n if(!IS_TOUCH_SUPPORTED && findUpClassName(target, 'time')) {\n this.chat.selection.toggleByElement(bubble);\n return;\n }\n\n // ! Trusted - due to audio autoclick\n if(this.chat.selection.isSelecting && e.isTrusted) {\n if(bubble.classList.contains('service') && bubble.dataset.mid === undefined) {\n return;\n }\n\n cancelEvent(e);\n // console.log('bubble click', e);\n\n if(IS_TOUCH_SUPPORTED && this.chat.selection.selectedText) {\n this.chat.selection.selectedText = undefined;\n return;\n }\n\n // this.chatSelection.toggleByBubble(bubble);\n this.chat.selection.toggleByElement(findUpClassName(target, 'grouped-item') || bubble);\n return;\n }\n\n const mediaSpoiler: HTMLElement = findUpClassName(target, 'media-spoiler-container');\n if(mediaSpoiler) {\n onMediaSpoilerClick({\n event: e,\n mediaSpoiler\n });\n return;\n }\n\n const contactDiv: HTMLElement = findUpClassName(target, 'contact');\n if(contactDiv) {\n const peerId = contactDiv.dataset.peerId.toPeerId();\n if(peerId) {\n this.chat.appImManager.setInnerPeer({\n peerId\n });\n } else {\n const phone = contactDiv.querySelector('.contact-number');\n copyTextToClipboard(phone.innerText.replace(/\\s/g, ''));\n toastNew({langPackKey: 'PhoneCopied'});\n cancelEvent(e);\n }\n\n return;\n }\n\n const callDiv: HTMLElement = findUpClassName(target, 'bubble-call');\n if(callDiv) {\n this.chat.appImManager.callUser(this.peerId.toUserId(), callDiv.dataset.type as any);\n return;\n }\n\n const buyButton: HTMLElement = findUpClassName(target, 'is-buy');\n if(buyButton) {\n cancelEvent(e);\n\n const message = await this.chat.getMessage(+bubble.dataset.mid);\n if(!message) {\n return;\n }\n\n new PopupPayment(\n message as Message.message,\n await this.managers.appPaymentsManager.getInputInvoiceByPeerId(message.peerId, message.mid)\n );\n return;\n }\n\n const reactionElement = findUpTag(target, 'REACTION-ELEMENT') as ReactionElement;\n if(reactionElement) {\n cancelEvent(e);\n if(reactionElement.classList.contains('is-inactive')) {\n return;\n }\n\n const reactionsElement = reactionElement.parentElement as ReactionsElement;\n const reactionCount = reactionsElement.getReactionCount(reactionElement);\n\n const message = reactionsElement.getMessage();\n this.managers.appReactionsManager.sendReaction(message, reactionCount.reaction);\n\n return;\n }\n\n const stickerEmojiEl = findUpAttribute(target, 'data-sticker-emoji');\n if(stickerEmojiEl && stickerEmojiEl.parentElement.querySelectorAll('[data-sticker-emoji]').length === 1 && bubble.classList.contains('emoji-big')) {\n onEmojiStickerClick({\n event: e,\n container: stickerEmojiEl,\n managers: this.managers,\n middleware: this.getMiddleware(),\n peerId: this.peerId\n });\n\n return;\n }\n\n const commentsDiv: HTMLElement = findUpClassName(target, 'replies');\n if(commentsDiv) {\n const bubbleMid = +bubble.dataset.mid;\n if(this.peerId === REPLIES_PEER_ID) {\n const message = await this.chat.getMessage(bubbleMid) as Message.message;\n const peerId = getPeerId(message.reply_to.reply_to_peer_id);\n const threadId = message.reply_to.reply_to_top_id;\n const lastMsgId = message.fwd_from.saved_from_msg_id;\n this.chat.appImManager.openThread({\n peerId,\n lastMsgId,\n threadId\n });\n } else {\n const message1 = await this.chat.getMessage(bubbleMid);\n const message = await this.managers.appMessagesManager.getMessageWithReplies(message1 as Message.message);\n const replies = message.replies;\n if(replies) {\n this.managers.appMessagesManager.getDiscussionMessage(this.peerId, message.mid).then((message) => {\n this.chat.appImManager.setInnerPeer({\n peerId: replies.channel_id.toPeerId(true),\n type: 'discussion',\n threadId: (message as MyMessage).mid\n });\n });\n }\n }\n\n return;\n }\n\n const via = findUpClassName(target, 'is-via');\n if(via) {\n const el = via.querySelector('.peer-title') as HTMLElement;\n if(target === el || findUpAsChild(target, el)) {\n const message = el.innerText + ' ';\n this.managers.appDraftsManager.setDraft(this.peerId, this.chat.threadId, message);\n cancelEvent(e);\n\n return;\n }\n }\n\n const nameDiv = findUpClassName(target, 'peer-title') || findUpTag(target, 'AVATAR-ELEMENT') || findUpAttribute(target, 'data-saved-from');\n if(nameDiv && nameDiv !== bubble) {\n target = nameDiv || target;\n const peerIdStr = target.dataset.peerId || target.getAttribute('peer') || (target as AvatarElement).peerId;\n const savedFrom = target.dataset.savedFrom;\n if(typeof(peerIdStr) === 'string' || savedFrom) {\n if(savedFrom) {\n const [peerId, mid] = savedFrom.split('_');\n if(target.classList.contains('is-receipt-link')) {\n const message = await this.managers.appMessagesManager.getMessageByPeer(peerId.toPeerId(), +mid);\n if(message) {\n const inputInvoice = await this.managers.appPaymentsManager.getInputInvoiceByPeerId(this.peerId, +bubble.dataset.mid);\n new PopupPayment(message as Message.message, inputInvoice, undefined, true);\n }\n } else {\n this.chat.appImManager.setInnerPeer({\n peerId: peerId.toPeerId(),\n lastMsgId: +mid\n });\n }\n } else {\n const peerId = peerIdStr.toPeerId();\n if(peerId !== NULL_PEER_ID) {\n this.chat.appImManager.setInnerPeer({peerId});\n } else {\n toast(I18n.format('HidAccount', true));\n }\n }\n }\n\n return;\n }\n\n // this.log('chatInner click:', target);\n // const isVideoComponentElement = target.tagName === 'SPAN' && findUpClassName(target, 'media-container');\n /* if(isVideoComponentElement) {\n const video = target.parentElement.querySelector('video') as HTMLElement;\n if(video) {\n video.click(); // hot-fix for time and play button\n return;\n }\n } */\n\n if(bubble.classList.contains('sticker') && target.parentElement.classList.contains('attachment')) {\n const messageId = +bubble.dataset.mid;\n const message = await this.chat.getMessage(messageId);\n\n const doc = ((message as Message.message).media as MessageMedia.messageMediaDocument)?.document as Document.document;\n\n if(doc?.stickerSetInput) {\n new PopupStickers(doc.stickerSetInput).show();\n }\n\n return;\n }\n\n const documentDiv = findUpClassName(target, 'document-with-thumb');\n if((target.tagName === 'IMG' && !target.classList.contains('emoji') && !target.classList.contains('document-thumb')) ||\n target.classList.contains('album-item') ||\n // || isVideoComponentElement\n (target.tagName === 'VIDEO' && !bubble.classList.contains('round')) ||\n (documentDiv && !documentDiv.querySelector('.preloader-container')) ||\n target.classList.contains('canvas-thumbnail')) {\n const groupedItem = findUpClassName(target, 'album-item') || findUpClassName(target, 'document-container');\n const preloader = (groupedItem || bubble).querySelector('.preloader-container');\n if(preloader) {\n simulateClickEvent(preloader);\n cancelEvent(e);\n return;\n }\n\n cancelEvent(e);\n const messageId = +(groupedItem || bubble).dataset.mid;\n const message = await this.chat.getMessage(messageId);\n if(!message) {\n this.log.warn('no message by messageId:', messageId);\n return;\n }\n\n const SINGLE_MEDIA_CLASSNAME = 'webpage';\n const isSingleMedia = bubble.classList.contains(SINGLE_MEDIA_CLASSNAME);\n\n const f = documentDiv ? (media: any) => {\n return AppMediaViewer.isMediaCompatibleForDocumentViewer(media);\n } : (media: any) => {\n return media._ === 'photo' || ['video', 'gif'].includes(media.type);\n };\n\n const targets: {element: HTMLElement, mid: number, peerId: PeerId}[] = [];\n const ids = isSingleMedia ? [messageId] : (await Promise.all(Object.keys(this.bubbles).map((k) => +k).map(async(mid) => {\n /* if(isSingleMedia && !this.bubbles[id].classList.contains(SINGLE_MEDIA_CLASSNAME)) {\n return false;\n } */\n // if(!this.scrollable.visibleElements.find((e) => e.element === this.bubbles[id])) return false;\n\n const message = await this.chat.getMessage(mid);\n const media = getMediaFromMessage(message);\n\n return media && f(media) && mid;\n }))).filter(Boolean).sort((a, b) => a - b);\n\n ids.forEach((id) => {\n let selector: string;\n if(documentDiv) {\n selector = '.document-container';\n } else {\n const withTail = this.bubbles[id].classList.contains('with-media-tail');\n selector = '.album-item video, .album-item img, .preview video, .preview img, ';\n if(withTail) {\n selector += '.bubble__media-container';\n } else {\n selector += '.attachment video, .attachment img';\n }\n }\n\n const elements = Array.from(this.bubbles[id].querySelectorAll(selector)) as HTMLElement[];\n const parents: Set = new Set();\n if(documentDiv) {\n elements.forEach((element) => {\n targets.push({\n element: element.querySelector('.document-ico'),\n mid: +element.dataset.mid,\n peerId: this.peerId\n });\n });\n } else {\n const hasAspecter = !!this.bubbles[id].querySelector('.media-container-aspecter');\n elements.forEach((element) => {\n if(hasAspecter && !findUpClassName(element, 'media-container-aspecter')) return;\n const albumItem = findUpClassName(element, 'album-item');\n const parent = albumItem || element.parentElement;\n if(parents.has(parent)) return;\n parents.add(parent);\n targets.push({\n element,\n mid: albumItem ? +albumItem.dataset.mid : id,\n peerId: this.peerId\n });\n });\n }\n });\n\n targets.sort((a, b) => a.mid - b.mid);\n\n const idx = targets.findIndex((t) => t.mid === messageId);\n\n if(DEBUG) {\n this.log('open mediaViewer single with ids:', ids, idx, targets);\n }\n\n if(!targets[idx]) {\n this.log('no target for media viewer!', target);\n return;\n }\n\n new AppMediaViewer()\n .setSearchContext({\n threadId: this.chat.threadId,\n peerId: this.peerId,\n inputFilter: {_: documentDiv ? 'inputMessagesFilterDocument' : 'inputMessagesFilterPhotoVideo'},\n useSearch: this.chat.type !== 'scheduled' && !isSingleMedia,\n isScheduled: this.chat.type === 'scheduled'\n })\n .openMedia(message, targets[idx].element, 0, true, targets.slice(0, idx), targets.slice(idx + 1));\n\n // appMediaViewer.openMedia(message, target as HTMLImageElement);\n return;\n }\n\n if(['IMG', 'DIV', 'SPAN'/* , 'A' */].indexOf(target.tagName) === -1) target = findUpTag(target, 'DIV');\n\n if(['DIV', 'SPAN'].indexOf(target.tagName) !== -1/* || target.tagName === 'A' */) {\n if(target.classList.contains('goto-original')) {\n const savedFrom = bubble.dataset.savedFrom;\n const [peerId, mid] = savedFrom.split('_');\n // //this.log('savedFrom', peerId, msgID);\n this.chat.appImManager.setInnerPeer({\n peerId: peerId.toPeerId(),\n lastMsgId: +mid\n });\n return;\n } else if(target.classList.contains('forward')) {\n const mid = +bubble.dataset.mid;\n const message = await this.managers.appMessagesManager.getMessageByPeer(this.peerId, mid);\n new PopupForward({\n [this.peerId]: await this.managers.appMessagesManager.getMidsByMessage(message)\n });\n // appSidebarRight.forwardTab.open([mid]);\n return;\n }\n\n let isReplyClick = false;\n\n try {\n isReplyClick = !!findUpClassName(e.target, 'reply');\n } catch(err) {}\n\n if(isReplyClick && bubble.classList.contains('is-reply')/* || bubble.classList.contains('forwarded') */) {\n const bubbleMid = +bubble.dataset.mid;\n this.followStack.push(bubbleMid);\n\n const message = (await this.chat.getMessage(bubbleMid)) as Message.message;\n\n const replyToPeerId = message.reply_to.reply_to_peer_id ? getPeerId(message.reply_to.reply_to_peer_id) : this.peerId;\n const replyToMid = message.reply_to.reply_to_msg_id;\n\n this.chat.appImManager.setInnerPeer({\n peerId: replyToPeerId,\n lastMsgId: replyToMid,\n type: this.chat.type,\n threadId: this.chat.threadId\n });\n\n /* if(this.chat.type === 'discussion') {\n this.chat.appImManager.setMessageId(, originalMessageId);\n } else {\n this.chat.appImManager.setInnerPeer(this.peerId, originalMessageId);\n } */\n // this.chat.setMessageId(, originalMessageId);\n }\n }\n\n // console.log('chatInner click', e);\n };\n\n public async onGoDownClick() {\n if(!this.followStack.length) {\n // this.onScroll(true, undefined, true);\n this.chat.setMessageId(/* , dialog.top_message */);\n // const dialog = this.appMessagesManager.getDialogByPeerId(this.peerId)[0];\n\n // if(dialog) {\n // this.chat.setPeer(this.peerId/* , dialog.top_message */);\n // } else {\n // this.log('will scroll down 3');\n // this.scroll.scrollTop = this.scroll.scrollHeight;\n // }\n\n return;\n }\n\n const middleware = this.getMiddleware();\n const slice = this.followStack.slice();\n const messages = await Promise.all(slice.map((mid) => this.chat.getMessage(mid)));\n if(!middleware()) return;\n\n slice.forEach((mid, idx) => {\n const message = messages[idx];\n\n const bubble = this.bubbles[mid];\n let bad = true;\n if(bubble) {\n const rect = bubble.getBoundingClientRect();\n bad = (windowSize.height / 2) > rect.top;\n } else if(message) {\n bad = false;\n }\n\n if(bad) {\n this.followStack.splice(this.followStack.indexOf(mid), 1);\n }\n });\n\n this.followStack.sort((a, b) => b - a);\n\n const mid = this.followStack.pop();\n this.chat.setMessageId(mid);\n }\n\n public getBubbleByPoint(verticalSide: 'top' | 'bottom') {\n const slice = this.getViewportSlice();\n const item = slice.visible[verticalSide === 'top' ? 0 : slice.visible.length - 1];\n return item?.element;\n }\n\n public async getGroupedBubble(groupId: string) {\n const mids = await this.managers.appMessagesManager.getMidsByAlbum(groupId);\n for(const mid of mids) {\n if(this.bubbles[mid] && !this.skippedMids.has(mid)) {\n // const maxId = Math.max(...mids); // * because in scheduled album can be rendered by lowest mid during sending\n return {\n bubble: this.bubbles[mid],\n mid: mid\n // message: await this.chat.getMessage(maxId) as Message.message\n };\n }\n }\n }\n\n public getBubbleGroupedItems(bubble: HTMLElement) {\n return Array.from(bubble.querySelectorAll('.grouped-item')) as HTMLElement[];\n }\n\n public async getMountedBubble(mid: number, message?: Message.message | Message.messageService) {\n if(message === undefined) {\n message = await this.chat.getMessage(mid);\n }\n\n if(!message) {\n return;\n }\n\n const groupedId = (message as Message.message).grouped_id;\n if(groupedId) {\n const a = await this.getGroupedBubble(groupedId);\n if(a) {\n a.bubble = a.bubble.querySelector(`.document-container[data-mid=\"${mid}\"]`) || a.bubble;\n return a;\n }\n }\n\n const bubble = this.bubbles[mid];\n if(!bubble || this.skippedMids.has(mid)) return;\n\n return {bubble, mid};\n }\n\n private findNextMountedBubbleByMsgId(mid: number, prev?: boolean) {\n const mids = getObjectKeysAndSort(this.bubbles, prev ? 'desc' : 'asc');\n\n let filterCallback: (_mid: number) => boolean;\n if(prev) filterCallback = (_mid) => _mid < mid;\n else filterCallback = (_mid) => mid < _mid;\n\n const foundMid = mids.find((_mid) => {\n if(!filterCallback(_mid)) return false;\n return !!this.bubbles[_mid]?.parentElement;\n });\n\n return this.bubbles[foundMid];\n }\n\n public loadMoreHistory(top: boolean, justLoad = false) {\n // this.log('loadMoreHistory', top);\n if(\n !this.peerId ||\n /* TEST_SCROLL || */\n this.chat.setPeerPromise ||\n this.isHeavyAnimationInProgress ||\n (top && (this.getHistoryTopPromise || this.scrollable.loadedAll.top)) ||\n (!top && (this.getHistoryBottomPromise || this.scrollable.loadedAll.bottom))\n ) {\n return;\n }\n\n // warning, ะตัะปะธ ะธะดั‹ ั‚ะพะปัŒะบะพ ะพั‚ั€ะธั†ะฐั‚ะตะปัŒะฝั‹ะต ั‚ะพ ะฒะฝะธะท ะฝะต ะฟะพะฟะฐะดั‘ั‚ (ั…ะพั‚ั ะผะฑ ะธ ั‚ะฐะบ ะฝะต ะฟะพะฟะฐะดั‘ั‚)\n // some messages can have negative id (such as sponsored message)\n const history = Object.keys(this.bubbles)\n .map((id) => +id)\n .filter((id) => id > 0 && !this.skippedMids.has(id))\n .sort((a, b) => a - b);\n\n if(!history.length) {\n history.push(0);\n }\n\n if(top) {\n if(DEBUG) {\n this.log('Will load more (up) history by id:', history[0], 'maxId:', history[history.length - 1], justLoad/* , history */);\n }\n\n this.getHistory1(history[0], true, undefined, undefined, justLoad);\n } else {\n // let dialog = this.appMessagesManager.getDialogByPeerId(this.peerId)[0];\n // const historyMaxId = await this.chat.getHistoryMaxId();\n\n // // if scroll down after search\n // if(history.indexOf(historyMaxId) !== -1) {\n // this.setLoaded('bottom', true);\n // return;\n // }\n\n if(DEBUG) {\n this.log('Will load more (down) history by id:', history[history.length - 1], justLoad/* , history */);\n }\n\n this.getHistory1(history[history.length - 1], false, true, undefined, justLoad);\n }\n }\n\n public onScroll = (ignoreHeavyAnimation?: boolean, scrollDimensions?: ScrollStartCallbackDimensions, forceDown?: boolean) => {\n // return;\n\n if(this.isHeavyAnimationInProgress) {\n this.sliceViewportDebounced?.clearTimeout();\n\n // * ะ’ ั‚ะฐะบะพะผ ัะปัƒั‡ะฐะต, ะบะฝะพะฟะบะฐ ะฝะต ะฑัƒะดะตั‚ ะผะพั€ะณะฐั‚ัŒ ะตัะปะธ ั‡ะฐั‚ ะฒ ัะฐะผะพะผ ะฝะธะทัƒ, ะธ ะฟั€ะฐะฒะธะปัŒะฝะพ ะพั‚ั€ะฐะฑะพั‚ะฐะตั‚ ัะปัƒั‡ะฐะน ะฝะฐะฟะธัะฐะฝะธั ะฝะพะฒะพะณะพ ัะพะพะฑั‰ะตะฝะธั ะธ ะฟั€ะพัะบั€ะพะปะปะฐ ะฒะฝะธะท\n if(this.scrolledDown && !ignoreHeavyAnimation) {\n return;\n }\n } else {\n this.chat.topbar.pinnedMessage?.setCorrectIndexThrottled(this.scrollable.lastScrollDirection);\n this.sliceViewportDebounced?.();\n this.setStickyDateManually();\n }\n\n // lottieLoader.checkAnimations(false, 'chat');\n\n if(scrollDimensions && scrollDimensions.distanceToEnd < SCROLLED_DOWN_THRESHOLD && this.scrolledDown) {\n return;\n }\n\n const distanceToEnd = forceDown ? 0 : scrollDimensions?.distanceToEnd ?? this.scrollable.getDistanceToEnd();\n if(/* !IS_TOUCH_SUPPORTED && */(this.scrollable.lastScrollDirection !== 0 && distanceToEnd > 0) || scrollDimensions || forceDown) {\n // if(/* !IS_TOUCH_SUPPORTED && */(this.scrollable.lastScrollDirection !== 0 || scrollDimensions) && distanceToEnd > 0) {\n if(this.isScrollingTimeout) {\n clearTimeout(this.isScrollingTimeout);\n } else if(!this.chatInner.classList.contains('is-scrolling')) {\n this.chatInner.classList.add('is-scrolling');\n }\n\n this.isScrollingTimeout = window.setTimeout(() => {\n this.chatInner.classList.remove('is-scrolling');\n this.isScrollingTimeout = 0;\n }, 1350 + (scrollDimensions?.duration ?? 0));\n }\n\n if(distanceToEnd < SCROLLED_DOWN_THRESHOLD && (forceDown || this.scrollable.loadedAll.bottom || this.chat.setPeerPromise || !this.peerId)) {\n this.container.classList.add('scrolled-down');\n this.scrolledDown = true;\n } else if(this.container.classList.contains('scrolled-down')) {\n this.container.classList.remove('scrolled-down');\n this.scrolledDown = false;\n }\n };\n\n public setScroll() {\n if(this.scrollable) {\n this.destroyScrollable();\n }\n\n this.scrollable = new Scrollable(null, 'IM', /* 10300 */300);\n this.setLoaded('top', false, false);\n this.setLoaded('bottom', false, false);\n\n this.scrollable.container.append(this.chatInner);\n\n /* const getScrollOffset = () => {\n //return Math.round(Math.max(300, appPhotosManager.windowH / 1.5));\n return 300;\n };\n\n window.addEventListener('resize', () => {\n this.scrollable.onScrollOffset = getScrollOffset();\n });\n\n this.scrollable = new Scrollable(this.bubblesContainer, 'y', 'IM', this.chatInner, getScrollOffset()); */\n\n this.scrollable.onAdditionalScroll = this.onScroll;\n this.scrollable.onScrolledTop = () => this.loadMoreHistory(true);\n this.scrollable.onScrolledBottom = () => this.loadMoreHistory(false);\n // this.scrollable.attachSentinels(undefined, 300);\n\n if(IS_TOUCH_SUPPORTED && false) {\n this.scrollable.container.addEventListener('touchmove', () => {\n if(this.isScrollingTimeout) {\n clearTimeout(this.isScrollingTimeout);\n } else if(!this.chatInner.classList.contains('is-scrolling')) {\n this.chatInner.classList.add('is-scrolling');\n }\n }, {passive: true});\n\n this.scrollable.container.addEventListener('touchend', () => {\n if(!this.chatInner.classList.contains('is-scrolling')) {\n return;\n }\n\n if(this.isScrollingTimeout) {\n clearTimeout(this.isScrollingTimeout);\n }\n\n this.isScrollingTimeout = window.setTimeout(() => {\n this.chatInner.classList.remove('is-scrolling');\n this.isScrollingTimeout = 0;\n }, 1350);\n }, {passive: true});\n }\n }\n\n public async updateUnreadByDialog() {\n const historyStorage = await this.chat.getHistoryStorage();\n const maxId = this.peerId === rootScope.myId ? historyStorage.readMaxId : historyStorage.readOutboxMaxId;\n\n // /////this.log('updateUnreadByDialog', maxId, dialog, this.unreadOut);\n\n for(const msgId of this.unreadOut) {\n if(msgId > 0 && msgId <= maxId) {\n const bubble = this.bubbles[msgId];\n if(bubble) {\n this.unreadOut.delete(msgId);\n\n if(bubble.classList.contains('is-outgoing') || bubble.classList.contains('is-error')) {\n continue;\n }\n\n bubble.classList.remove('is-sent', 'is-sending', 'is-outgoing'); // is-sending can be when there are bulk of updates (e.g. sending command to Stickers bot)\n bubble.classList.add('is-read');\n }\n }\n }\n }\n\n public destroyBubble(bubble: HTMLElement, mid = +bubble.dataset.mid) {\n // this.log.warn('destroy bubble', bubble, mid);\n bubble.middlewareHelper.destroy();\n\n /* const mounted = this.getMountedBubble(mid);\n if(!mounted) return; */\n\n if(this.bubbles[mid] === bubble) { // have to check because can clear bubble with same id later\n delete this.bubbles[mid];\n }\n\n this.skippedMids.delete(mid);\n\n if(this.firstUnreadBubble === bubble) {\n this.firstUnreadBubble = null;\n }\n\n this.bubbleGroups.removeAndUnmountBubble(bubble);\n if(this.observer) {\n this.observer.unobserve(bubble, this.unreadedObserverCallback);\n this.unreaded.delete(bubble);\n\n this.observer.unobserve(bubble, this.viewsObserverCallback);\n this.viewsMids.delete(mid);\n\n this.observer.unobserve(bubble, this.stickerEffectObserverCallback);\n }\n\n // this.reactions.delete(mid);\n }\n\n public deleteMessagesByIds(mids: number[], permanent = true, ignoreOnScroll?: boolean) {\n let deleted = false;\n mids.forEach((mid) => {\n const bubble = this.bubbles[mid];\n if(!bubble) return;\n\n this.destroyBubble(bubble, mid);\n\n deleted = true;\n });\n\n if(!deleted) {\n return;\n }\n\n this.scrollable.ignoreNextScrollEvent();\n if(permanent && this.chat.selection.isSelecting) {\n this.chat.selection.deleteSelectedMids(this.peerId, mids);\n }\n\n animationIntersector.checkAnimations(false, this.chat.animationGroup);\n this.deleteEmptyDateGroups();\n\n if(!ignoreOnScroll) {\n this.scrollable.onScroll();\n // this.onScroll();\n }\n }\n\n private pollExtendedMediaMessages() {\n const mids = Array.from(this.extendedMediaMessages);\n return this.managers.appMessagesManager.getExtendedMedia(this.peerId, mids);\n }\n\n private setExtendedMediaMessagesPollInterval() {\n if(this.pollExtendedMediaMessagesPromise || !this.extendedMediaMessages.size) {\n return;\n }\n\n this.pollExtendedMediaMessagesPromise = pause(30000)\n .then(() => this.pollExtendedMediaMessages())\n .then(() => this.setExtendedMediaMessagesPollInterval());\n }\n\n private setTopPadding(middleware = this.getMiddleware()) {\n let isPaddingNeeded = false;\n let setPaddingTo: HTMLElement;\n if(!this.isTopPaddingSet && this.chat.type !== 'scheduled') {\n const {clientHeight, scrollHeight} = this.scrollable.container;\n isPaddingNeeded = clientHeight === scrollHeight;\n /* const firstEl = this.chatInner.firstElementChild as HTMLElement;\n if(this.chatInner.firstElementChild) {\n const visibleRect = getVisibleRect(firstEl, this.scrollable.container);\n isPaddingNeeded = !visibleRect.overflow.top && (visibleRect.rect.top - firstEl.offsetTop) !== this.scrollable.container.getBoundingClientRect().top;\n } else {\n isPaddingNeeded = true;\n } */\n\n if(isPaddingNeeded) {\n /* const add = clientHeight - scrollHeight;\n this.chatInner.style.paddingTop = add + 'px';\n this.scrollable.scrollTop += add; */\n setPaddingTo = this.chatInner;\n setPaddingTo.style.paddingTop = clientHeight + 'px';\n this.scrollable.setScrollTopSilently(scrollHeight);\n this.isTopPaddingSet = true;\n }\n }\n\n return {\n isPaddingNeeded,\n unsetPadding: isPaddingNeeded ? () => {\n if(middleware() && isPaddingNeeded) {\n setPaddingTo.style.paddingTop = '';\n this.isTopPaddingSet = false;\n }\n } : undefined\n };\n }\n\n private renderNewMessage(message: MyMessage, scrolledDown?: boolean) {\n const promise = this._renderNewMessage(message, scrolledDown);\n this.renderNewPromises.add(promise);\n promise.catch(noop).finally(() => {\n this.renderNewPromises.delete(promise);\n });\n return promise;\n }\n\n private async _renderNewMessage(message: MyMessage, scrolledDown?: boolean) {\n if(!this.scrollable.loadedAll.bottom) { // seems search active or sliced\n // this.log('renderNewMessagesByIds: seems search is active, skipping render:', mids);\n const setPeerPromise = this.chat.setPeerPromise;\n if(setPeerPromise) {\n const middleware = this.getMiddleware();\n setPeerPromise.then(async() => {\n if(!middleware()) return;\n const newMessage = await this.chat.getMessage(message.mid);\n if(!middleware()) return;\n this.renderNewMessage(newMessage);\n });\n }\n\n return;\n }\n\n if(this.chat.threadId && getMessageThreadId(message, this.chat.isForum) !== this.chat.threadId) {\n return;\n }\n\n if(this.bubbles[message.mid]) {\n return;\n }\n // ! should scroll even without new messages\n /* if(!mids.length) {\n return;\n } */\n\n if(!scrolledDown) {\n scrolledDown = this.scrolledDown && (\n !this.scrollingToBubble ||\n this.scrollingToBubble === this.getLastBubble() ||\n this.scrollingToBubble === this.chatInner\n );\n }\n\n const middleware = this.getMiddleware();\n const {isPaddingNeeded, unsetPadding} = this.setTopPadding(middleware);\n\n const promise = this.performHistoryResult({history: [message]}, false);\n if(scrolledDown) {\n promise.then(() => {\n if(!middleware()) return;\n // this.log('renderNewMessagesByIDs: messagesQueuePromise after', this.scrollable.isScrolledDown);\n // this.scrollable.scrollTo(this.scrollable.scrollHeight, 'top', true, true, 5000);\n // const bubble = this.bubbles[Math.max(...mids)];\n\n let bubble: HTMLElement;\n if(this.chat.type === 'scheduled') {\n bubble = this.bubbles[message.mid];\n }\n\n const promise = bubble ? this.scrollToBubbleEnd(bubble) : this.scrollToEnd();\n if(isPaddingNeeded) {\n // it will be called only once even if was set multiple times (that won't happen)\n promise.then(unsetPadding);\n }\n\n // this.scrollable.scrollIntoViewNew(this.chatInner, 'end');\n\n /* setTimeout(() => {\n this.log('messagesQueuePromise afterafter:', this.chatInner.childElementCount, this.scrollable.scrollHeight);\n }, 10); */\n });\n }\n\n return promise;\n }\n\n public getLastBubble() {\n const group = this.bubbleGroups.getLastGroup();\n return group?.lastItem?.bubble;\n }\n\n public scrollToBubble(\n element: HTMLElement,\n position: ScrollLogicalPosition,\n forceDirection?: FocusDirection,\n forceDuration?: number\n ) {\n const bubble = findUpClassName(element, 'bubble');\n\n if(!element.parentElement) {\n this.log.error('element is not connected', bubble);\n }\n\n let fallbackToElementStartWhenCentering: HTMLElement;\n // * if it's a start, then scroll to start of the group\n if(bubble && position !== 'end') {\n const item = this.bubbleGroups.getItemByBubble(bubble);\n if(item && item.group.firstItem === item && whichChild(item.group.container) === (this.stickyIntersector ? STICKY_OFFSET : 1)) {\n const dateGroup = item.group.container.parentElement;\n // if(whichChild(dateGroup) === 0) {\n fallbackToElementStartWhenCentering = dateGroup;\n // position = 'start';\n // element = dateGroup;\n // }\n }\n }\n\n // const isLastBubble = this.getLastBubble() === bubble;\n /* if(isLastBubble) {\n element = this.getLastDateGroup();\n } */\n\n const margin = 4; // * 4 = .25rem\n /* if(isLastBubble && this.chat.type === 'chat' && this.bubblesContainer.classList.contains('is-chat-input-hidden')) {\n margin = 20;\n } */\n\n const isChangingHeight = (this.chat.input.messageInput && this.chat.input.messageInput.classList.contains('is-changing-height')) || this.chat.container.classList.contains('is-toggling-helper');\n const promise = this.scrollable.scrollIntoViewNew({\n element,\n position,\n margin,\n forceDirection,\n forceDuration,\n axis: 'y',\n getNormalSize: isChangingHeight ? ({rect}) => {\n // return rect.height;\n\n let height = windowSize.height;\n // height -= this.chat.topbar.container.getBoundingClientRect().height;\n height -= this.container.offsetTop;\n height -= mediaSizes.isMobile || windowSize.height < 570 ? 58 : 78;\n return height;\n\n /* const rowsWrapperHeight = this.chat.input.rowsWrapper.getBoundingClientRect().height;\n const diff = rowsWrapperHeight - 54;\n return rect.height + diff; */\n } : undefined,\n fallbackToElementStartWhenCentering,\n startCallback: (dimensions) => {\n // this.onScroll(true, this.scrolledDown && dimensions.distanceToEnd <= SCROLLED_DOWN_THRESHOLD ? undefined : dimensions);\n this.onScroll(true, dimensions);\n\n if(this.updateGradient) {\n const {gradientRenderer} = this.chat;\n gradientRenderer?.toNextPosition(dimensions.getProgress);\n this.updateGradient = undefined;\n }\n }\n });\n\n // fix flickering date when opening unread chat and focusing message\n if(forceDirection === FocusDirection.Static) {\n this.scrollable.lastScrollPosition = this.scrollable.scrollTop;\n }\n\n return promise;\n }\n\n public scrollToEnd() {\n return this.scrollToBubbleEnd(this.chatInner);\n }\n\n public async scrollToBubbleEnd(bubble: HTMLElement) {\n /* if(DEBUG) {\n this.log('scrollToNewLastBubble: will scroll into view:', bubble);\n } */\n\n if(bubble) {\n this.scrollingToBubble = bubble;\n const middleware = this.getMiddleware();\n await this.scrollToBubble(bubble, 'end', undefined, undefined);\n if(!middleware()) return;\n this.scrollingToBubble = undefined;\n }\n }\n\n // ! can't get it by chatInner.lastElementChild because placeholder can be the last...\n // private getLastDateGroup() {\n // let lastTime = 0, lastElem: HTMLElement;\n // for(const i in this.dateMessages) {\n // const dateMessage = this.dateMessages[i];\n // if(dateMessage.firstTimestamp > lastTime) {\n // lastElem = dateMessage.container;\n // lastTime = dateMessage.firstTimestamp;\n // }\n // }\n\n // return lastElem;\n // }\n\n public async scrollToBubbleIfLast(bubble: HTMLElement) {\n if(this.getLastBubble() === bubble) {\n // return this.scrollToBubbleEnd(bubble);\n return this.scrollToEnd();\n }\n }\n\n public highlightBubble(element: HTMLElement) {\n const datasetKey = 'highlightTimeout';\n if(element.dataset[datasetKey]) {\n clearTimeout(+element.dataset[datasetKey]);\n element.classList.remove('is-highlighted');\n void element.offsetWidth; // reflow\n }\n\n element.classList.add('is-highlighted');\n element.dataset[datasetKey] = '' + setTimeout(() => {\n element.classList.remove('is-highlighted');\n delete element.dataset[datasetKey];\n }, 2000);\n }\n\n private createDateBubble(timestamp: number, date: Date = new Date(timestamp * 1000)) {\n let dateElement: HTMLElement;\n\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n\n const isScheduled = this.chat.type === 'scheduled';\n\n if(today.getTime() === date.getTime()) {\n dateElement = i18n(isScheduled ? 'Chat.Date.ScheduledForToday' : 'Date.Today');\n } else if(isScheduled && timestamp === SEND_WHEN_ONLINE_TIMESTAMP) {\n dateElement = i18n('MessageScheduledUntilOnline');\n } else {\n const options: Intl.DateTimeFormatOptions = {\n day: 'numeric',\n month: 'long'\n };\n\n if(date.getFullYear() !== today.getFullYear()) {\n options.year = 'numeric';\n }\n\n dateElement = new I18n.IntlDateElement({\n date,\n options\n }).element;\n\n if(isScheduled) {\n dateElement = i18n('Chat.Date.ScheduledFor', [dateElement]);\n }\n }\n\n const bubble = document.createElement('div');\n bubble.className = 'bubble service is-date';\n const bubbleContent = document.createElement('div');\n bubbleContent.classList.add('bubble-content');\n const serviceMsg = document.createElement('div');\n serviceMsg.classList.add('service-msg');\n\n serviceMsg.append(dateElement);\n\n bubbleContent.append(serviceMsg);\n bubble.append(bubbleContent);\n\n return bubble;\n }\n\n public getDateForDateContainer(timestamp: number) {\n const date = new Date(timestamp * 1000);\n date.setHours(0, 0, 0);\n return {date, dateTimestamp: date.getTime()};\n }\n\n public getDateContainerByTimestamp(timestamp: number) {\n const {date, dateTimestamp} = this.getDateForDateContainer(timestamp);\n let ret = this.dateMessages[dateTimestamp];\n if(ret) {\n return ret;\n }\n\n const bubble = this.createDateBubble(timestamp, date);\n // bubble.classList.add('is-sticky');\n const fakeBubble = this.createDateBubble(timestamp, date);\n fakeBubble.classList.add('is-fake');\n\n const container = document.createElement('section');\n container.className = 'bubbles-date-group';\n container.append(bubble, fakeBubble);\n\n ret = this.dateMessages[dateTimestamp] = {\n div: bubble,\n container,\n firstTimestamp: date.getTime()\n };\n\n const haveTimestamps = getObjectKeysAndSort(this.dateMessages, 'asc');\n const length = haveTimestamps.length;\n let i = 0, insertBefore: HTMLElement; // there can be 'first bubble' (e.g. bot description) so can't insert by index\n for(; i < haveTimestamps.length; ++i) {\n const t = haveTimestamps[i];\n insertBefore = this.dateMessages[t].container;\n if(dateTimestamp < t) {\n break;\n }\n }\n\n if(i === length && insertBefore) {\n insertBefore = insertBefore.nextElementSibling as HTMLElement;\n }\n\n if(!insertBefore) {\n this.chatInner.append(container);\n } else {\n this.chatInner.insertBefore(container, insertBefore);\n }\n\n this.stickyIntersector?.observeStickyHeaderChanges(container);\n\n if(this.chatInner.parentElement) {\n this.container.classList.add('has-groups');\n }\n\n return ret;\n }\n\n private destroyScrollable() {\n this.scrollable.destroy();\n }\n\n public destroy() {\n // this.chat.log.error('Bubbles destroying');\n\n this.destroyScrollable();\n\n this.listenerSetter.removeAll();\n\n this.lazyLoadQueue.clear();\n this.observer && this.observer.disconnect();\n this.stickyIntersector && this.stickyIntersector.disconnect();\n\n delete this.lazyLoadQueue;\n this.observer && delete this.observer;\n this.stickyIntersector && delete this.stickyIntersector;\n }\n\n public cleanup(bubblesToo = false) {\n this.log('cleanup');\n\n this.bubbles = {}; // clean it before so sponsored message won't be deleted faster on peer changing\n // //console.time('appImManager cleanup');\n this.setLoaded('top', false, false);\n this.setLoaded('bottom', false, false);\n\n // cancel scroll\n cancelAnimationByKey(this.scrollable.container);\n\n // do not wait ending of previous scale animation\n interruptHeavyAnimation();\n\n if(TEST_SCROLL !== undefined) {\n TEST_SCROLL = TEST_SCROLL_TIMES;\n }\n\n this.skippedMids.clear();\n this.dateMessages = {};\n this.bubbleGroups.cleanup();\n this.unreadOut.clear();\n this.needUpdate.length = 0;\n this.lazyLoadQueue.clear();\n this.renderNewPromises.clear();\n\n // clear messages\n if(bubblesToo) {\n this.scrollable.container.textContent = '';\n this.chatInner.textContent = '';\n this.cleanupPlaceholders();\n }\n\n this.firstUnreadBubble = null;\n this.attachedUnreadBubble = false;\n\n this.batchProcessor.clear();\n\n this.getHistoryTopPromise = this.getHistoryBottomPromise = undefined;\n this.fetchNewPromise = undefined;\n this.getSponsoredMessagePromise = undefined;\n this.updateGradient = undefined;\n\n if(this.stickyIntersector) {\n this.stickyIntersector.disconnect();\n }\n\n if(this.observer) {\n this.observer.disconnect();\n\n this.unreaded.clear();\n this.unreadedSeen.clear();\n this.readPromise = undefined;\n\n this.viewsMids.clear();\n }\n\n this.middlewareHelper.clean();\n\n this.onAnimateLadder = undefined;\n this.resolveLadderAnimation = undefined;\n this.attachPlaceholderOnRender = undefined;\n this.emptyPlaceholderBubble = undefined;\n this.sponsoredMessage = undefined;\n this.previousStickyDate = undefined;\n\n this.scrollingToBubble = undefined;\n // //console.timeEnd('appImManager cleanup');\n\n this.isTopPaddingSet = false;\n\n this.renderingMessages.clear();\n this.bubblesToEject.clear();\n this.bubblesToReplace.clear();\n\n // this.reactions.clear();\n\n if(this.isScrollingTimeout) {\n clearTimeout(this.isScrollingTimeout);\n this.isScrollingTimeout = 0;\n }\n\n this.container.classList.remove('has-sticky-dates');\n this.scrollable.cancelMeasure();\n }\n\n private cleanupPlaceholders(bubble = this.emptyPlaceholderBubble) {\n if(bubble) {\n this.destroyBubble(bubble);\n }\n }\n\n public async setPeer(options: ChatSetPeerOptions & {samePeer: boolean}): Promise<{cached?: boolean, promise: Chat['setPeerPromise']}> {\n const {samePeer, peerId, stack} = options;\n let {lastMsgId, startParam} = options;\n const tempId = ++this.setPeerTempId;\n\n if(!peerId) {\n this.cleanup(true);\n this.preloader.detach();\n return null;\n }\n\n const perf = performance.now();\n const log = this.log.bindPrefix('setPeer');\n log.warn('start');\n\n const middleware = () => {\n return this.setPeerTempId === tempId;\n };\n\n const m = middlewarePromise(middleware, PEER_CHANGED_ERROR);\n\n if(!samePeer) {\n await m(this.chat.onChangePeer(options, m));\n }\n\n /* if(samePeer && this.chat.setPeerPromise) {\n return {cached: true, promise: this.chat.setPeerPromise};\n } */\n\n const chatType = this.chat.type;\n\n if(chatType === 'scheduled' || this.chat.isRestricted) {\n lastMsgId = 0;\n }\n\n const historyStorage = await m(this.chat.getHistoryStorage());\n const topMessage = chatType === 'pinned' ? await m(this.managers.appMessagesManager.getPinnedMessagesMaxId(peerId, this.chat.threadId)) : historyStorage.maxId ?? 0;\n const isTarget = lastMsgId !== undefined;\n\n // * this one will fix topMessage for null message in history (e.g. channel comments with only 1 comment and it is a topMessage)\n /* if(chatType !== 'pinned' && topMessage && !historyStorage.history.slice.includes(topMessage)) {\n topMessage = 0;\n } */\n\n let followingUnread: boolean;\n let readMaxId = 0, savedPosition: ReturnType, overrideAdditionMsgId: number;\n if(!isTarget) {\n if(!samePeer) {\n savedPosition = this.chat.appImManager.getChatSavedPosition(this.chat);\n }\n\n if(savedPosition) {\n\n } else if(topMessage) {\n readMaxId = await m(this.managers.appMessagesManager.getReadMaxIdIfUnread(peerId, this.chat.threadId));\n const dialog = await m(this.chat.getDialogOrTopic());\n if(/* dialog.unread_count */readMaxId && !samePeer && (!dialog || dialog.unread_count !== 1)) {\n const foundSlice = historyStorage.history.findSliceOffset(readMaxId);\n if(foundSlice && foundSlice.slice.isEnd(SliceEnd.Bottom)) {\n overrideAdditionMsgId = foundSlice.slice[foundSlice.offset - 25] || foundSlice.slice[0] || readMaxId;\n }\n\n followingUnread = !isTarget;\n lastMsgId = readMaxId;\n } else {\n lastMsgId = topMessage;\n // lastMsgID = topMessage;\n }\n }\n }\n\n const isJump = lastMsgId !== topMessage/* && overrideAdditionMsgId === undefined */;\n\n if(startParam === undefined && await m(this.chat.isStartButtonNeeded())) {\n startParam = BOT_START_PARAM;\n }\n\n if(samePeer) {\n if(stack && lastMsgId) {\n this.followStack.push(stack);\n }\n\n const mounted = await m(this.getMountedBubble(lastMsgId));\n if(mounted) {\n if(isTarget) {\n this.scrollToBubble(mounted.bubble, 'center');\n this.highlightBubble(mounted.bubble);\n this.chat.dispatchEvent('setPeer', lastMsgId, false);\n } else if(topMessage && !isJump) {\n // log('will scroll down', this.scroll.scrollTop, this.scroll.scrollHeight);\n // scrollable.setScrollTopSilently(scrollable.scrollHeight);\n this.scrollToEnd();\n this.chat.dispatchEvent('setPeer', lastMsgId, true);\n }\n\n if(startParam !== undefined) {\n this.chat.input.setStartParam(startParam);\n }\n\n return null;\n }\n } else {\n if(this.peerId) { // * set new queue id if new peer (setting not from 0)\n this.lazyLoadQueue.queueId = ++queueId;\n this.managers.apiFileManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId);\n }\n\n this.followStack.length = 0;\n\n this.passEntities = {\n messageEntityBotCommand: await m(this.managers.appPeersManager.isAnyGroup(peerId)) || this.chat.isBot\n };\n }\n\n if(DEBUG) {\n log('setPeer peerId:', peerId, historyStorage, lastMsgId, topMessage);\n }\n\n // add last message, bc in getHistory will load < max_id\n const additionMsgId = overrideAdditionMsgId ?? (isJump || chatType === 'scheduled' || this.chat.isRestricted ? 0 : topMessage);\n\n let maxBubbleId = 0;\n if(samePeer) {\n const el = this.getBubbleByPoint('bottom'); // ! this may not work if being called when chat is hidden\n // this.chat.log('[PM]: setCorrectIndex: get last element perf:', performance.now() - perf, el);\n if(el) {\n maxBubbleId = +el.dataset.mid;\n }\n\n if(maxBubbleId <= 0) {\n maxBubbleId = Math.max(...Object.keys(this.bubbles).map((mid) => +mid));\n }\n } else {\n this.isFirstLoad = true;\n this.destroyResizeObserver();\n }\n\n const oldChatInner = this.chatInner;\n const oldPlaceholderBubble = this.emptyPlaceholderBubble;\n this.cleanup();\n const chatInner = this.chatInner = document.createElement('div');\n if(samePeer) {\n chatInner.className = oldChatInner.className;\n chatInner.classList.remove('disable-hover', 'is-scrolling');\n } else {\n chatInner.classList.add('bubbles-inner');\n }\n\n this.lazyLoadQueue.lock();\n\n // const haveToScrollToBubble = (topMessage && (isJump || samePeer)) || isTarget;\n const haveToScrollToBubble = samePeer || (topMessage && isJump) || isTarget;\n const fromUp = maxBubbleId > 0 && (!lastMsgId || maxBubbleId < lastMsgId || lastMsgId < 0);\n const scrollFromDown = !fromUp && samePeer;\n const scrollFromUp = !scrollFromDown && fromUp/* && (samePeer || forwardingUnread) */;\n this.willScrollOnLoad = scrollFromDown || scrollFromUp;\n\n this.setPeerOptions = {\n lastMsgId,\n topMessage,\n savedPosition\n };\n\n let result: Awaited>;\n if(!savedPosition) {\n result = await m(this.getHistory1(lastMsgId, true, isJump, additionMsgId));\n } else {\n result = {\n promise: getHeavyAnimationPromise().then(() => {\n return this.performHistoryResult({history: savedPosition.mids}, true);\n }) as any,\n cached: true,\n waitPromise: Promise.resolve()\n };\n }\n\n this.setPeerCached = result.cached;\n\n log.warn('got history');// warning\n\n const {promise, cached} = result;\n\n if(!cached && !samePeer) {\n await m(this.chat.finishPeerChange(isTarget, isJump, lastMsgId, startParam));\n this.scrollable.container.textContent = '';\n // oldContainer.textContent = '';\n // oldChatInner.remove();\n this.preloader.attach(this.container);\n }\n\n /* this.ladderDeferred && this.ladderDeferred.resolve();\n this.ladderDeferred = deferredPromise(); */\n\n animationIntersector.lockGroup(this.chat.animationGroup);\n const setPeerPromise = m(promise).then(async() => {\n log.warn('promise fulfilled');\n\n const mountedByLastMsgId = haveToScrollToBubble ? await m(lastMsgId ? this.getMountedBubble(lastMsgId) : {bubble: this.getLastBubble()}) : undefined;\n if(cached && !samePeer) {\n log.warn('finishing peer change');\n await m(this.chat.finishPeerChange(isTarget, isJump, lastMsgId, startParam)); // * ะบะพัั‚ั‹ะปัŒ\n log.warn('finished peer change');\n }\n\n this.preloader.detach();\n\n if(this.resolveLadderAnimation) {\n this.resolveLadderAnimation();\n this.resolveLadderAnimation = undefined;\n }\n\n this.setPeerCached = undefined;\n\n // this.ladderDeferred.resolve();\n\n const scrollable = this.scrollable;\n scrollable.lastScrollDirection = 0;\n scrollable.lastScrollPosition = 0;\n replaceContent(scrollable.container, chatInner);\n // this.chat.topbar.container.nextElementSibling.replaceWith(container);\n\n if(oldPlaceholderBubble) {\n this.cleanupPlaceholders(oldPlaceholderBubble);\n }\n\n if(this.attachPlaceholderOnRender) {\n this.attachPlaceholderOnRender();\n }\n\n if(!isTarget && this.chat.isPinnedMessagesNeeded()) {\n this.chat.topbar.pinnedMessage?.setCorrectIndex(0);\n }\n\n this.container.classList.toggle('has-groups', !!Object.keys(this.dateMessages).length);\n\n log.warn('mounted chat', this.chatInner === chatInner, this.chatInner.parentElement, performance.now() - perf);\n\n animationIntersector.unlockGroup(this.chat.animationGroup);\n animationIntersector.checkAnimations(false, this.chat.animationGroup/* , true */);\n\n // fastRaf(() => {\n this.lazyLoadQueue.unlock();\n // });\n\n // if(dialog && lastMsgID && lastMsgID !== topMessage && (this.bubbles[lastMsgID] || this.firstUnreadBubble)) {\n if(savedPosition) {\n scrollable.setScrollTopSilently(savedPosition.top);\n /* const mountedByLastMsgId = this.getMountedBubble(lastMsgId);\n let bubble: HTMLElement = mountedByLastMsgId?.bubble;\n if(!bubble?.parentElement) {\n bubble = this.findNextMountedBubbleByMsgId(lastMsgId);\n }\n\n if(bubble) {\n const top = bubble.getBoundingClientRect().top;\n const distance = savedPosition.top - top;\n scrollable.scrollTop += distance;\n } */\n } else if(haveToScrollToBubble) {\n let unsetPadding: () => void;\n if(scrollFromDown) {\n scrollable.setScrollTopSilently(99999);\n } else if(scrollFromUp) {\n const set = this.setTopPadding();\n if(set.isPaddingNeeded) {\n unsetPadding = set.unsetPadding;\n }\n\n scrollable.setScrollTopSilently(0);\n }\n\n // const mountedByLastMsgId = lastMsgId ? this.getMountedBubble(lastMsgId) : {bubble: this.getLastBubble()};\n let bubble: HTMLElement = (followingUnread && this.firstUnreadBubble) || mountedByLastMsgId?.bubble;\n if(!bubble?.parentElement) {\n bubble = this.findNextMountedBubbleByMsgId(lastMsgId, false) || this.findNextMountedBubbleByMsgId(lastMsgId, true);\n }\n\n let promise: Promise;\n // ! sometimes there can be no bubble\n if(bubble) {\n const lastBubble = this.getLastBubble();\n const position: ScrollLogicalPosition = followingUnread ? 'start' : (!isJump && !isTarget && lastBubble === bubble ? 'end' : 'center');\n\n if(position === 'end' && lastBubble === bubble && samePeer) {\n promise = this.scrollToEnd();\n } else {\n promise = this.scrollToBubble(bubble, position, !samePeer ? FocusDirection.Static : undefined);\n }\n\n if(!followingUnread && isTarget) {\n this.highlightBubble(bubble);\n }\n }\n\n if(unsetPadding) {\n (promise || Promise.resolve()).then(() => {\n unsetPadding();\n });\n }\n } else {\n scrollable.setScrollTopSilently(99999);\n }\n\n // if(!cached) {\n this.onRenderScrollSet();\n // }\n\n this.onScroll();\n\n const afterSetPromise = Promise.all([setPeerPromise, getHeavyAnimationPromise()]);\n afterSetPromise.then(() => { // check whether list isn't full\n scrollable.checkForTriggers();\n\n // if(cached) {\n // this.onRenderScrollSet();\n // }\n });\n\n this.chat.dispatchEvent('setPeer', lastMsgId, !isJump);\n\n Promise.all([\n this.setFetchReactionsInterval(afterSetPromise),\n this.setFetchHistoryInterval({\n afterSetPromise,\n lastMsgId,\n samePeer,\n savedPosition,\n topMessage\n })\n ]).then(() => {\n log('scrolledAllDown:', scrollable.loadedAll.bottom);\n // if(!this.unreaded.length && dialog) { // lol\n if(scrollable.loadedAll.bottom && topMessage && !this.unreaded.size) { // lol\n this.onScrolledAllDown();\n }\n });\n\n if(chatType === 'chat' && !this.chat.isForumTopic) {\n const dialog = await m(this.managers.appMessagesManager.getDialogOnly(peerId));\n if(dialog?.pFlags.unread_mark) {\n this.managers.appMessagesManager.markDialogUnread(peerId, true);\n }\n }\n\n // this.chatInner.classList.remove('disable-hover', 'is-scrolling'); // warning, performance!\n }).catch((err) => {\n log.error('setPeer promise error:', err);\n if(!middleware()) {\n this.preloader.detach();\n }\n\n throw err;\n });\n\n return {cached, promise: setPeerPromise};\n }\n\n private async setFetchReactionsInterval(afterSetPromise: Promise) {\n const middleware = this.getMiddleware();\n const needReactionsInterval = this.chat.isChannel;\n if(needReactionsInterval) {\n const fetchReactions = async() => {\n if(!middleware()) return;\n\n const mids: number[] = [];\n for(const mid in this.bubbles) {\n let message = await this.chat.getMessage(+mid);\n if(message?._ !== 'message') {\n continue;\n }\n\n message = await this.managers.appMessagesManager.getGroupsFirstMessage(message);\n mids.push(message.mid);\n }\n\n const promise = mids.length ? this.managers.appReactionsManager.getMessagesReactions(this.peerId, mids) : Promise.resolve();\n promise.then(() => {\n setTimeout(fetchReactions, 10e3);\n });\n };\n\n Promise.all([afterSetPromise, getHeavyAnimationPromise(), pause(500)]).then(() => {\n fetchReactions();\n });\n }\n }\n\n private async setFetchHistoryInterval({\n lastMsgId,\n topMessage,\n afterSetPromise,\n savedPosition,\n samePeer\n }: {\n lastMsgId: number,\n topMessage: number,\n afterSetPromise: Promise,\n savedPosition: ChatSavedPosition,\n samePeer: boolean\n }) {\n const middleware = this.getMiddleware();\n const peerId = this.peerId;\n\n const needFetchInterval = await this.managers.appMessagesManager.isFetchIntervalNeeded(peerId);\n const needFetchNew = savedPosition || needFetchInterval;\n if(!needFetchNew) {\n return;\n }\n\n await afterSetPromise;\n if(!middleware()) {\n return;\n }\n\n const chatId = peerId.toChatId();\n middleware.onClean(() => {\n this.managers.apiUpdatesManager.unsubscribeFromChannelUpdates(chatId);\n });\n\n this.managers.apiUpdatesManager.subscribeToChannelUpdates(chatId);\n return;\n\n this.setLoaded('bottom', false);\n this.scrollable.checkForTriggers();\n\n if(!needFetchInterval) {\n return;\n }\n\n const f = () => {\n this.fetchNewPromise = new Promise(async(resolve) => {\n if(!middleware() || !(await this.managers.appMessagesManager.isFetchIntervalNeeded(peerId))) {\n resolve();\n return;\n }\n\n this.managers.appMessagesManager.getNewHistory(peerId, this.chat.threadId).then((result) => {\n if(!middleware() || !result) {\n resolve();\n return;\n }\n\n const {isBottomEnd} = result;\n if(this.scrollable.loadedAll.bottom && this.scrollable.loadedAll.bottom !== isBottomEnd) {\n this.setLoaded('bottom', isBottomEnd);\n this.onScroll();\n }\n\n setTimeout(f, 30e3);\n resolve();\n });\n }).finally(() => {\n this.fetchNewPromise = undefined;\n });\n };\n\n if(samePeer) {\n setTimeout(f, 30e3);\n } else {\n f();\n }\n }\n\n public async onScrolledAllDown() {\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\n const historyMaxId = await this.chat.getHistoryMaxId();\n this.managers.appMessagesManager.readHistory(this.peerId, historyMaxId, this.chat.threadId, true);\n }\n }\n\n public async finishPeerChange() {\n const [isChannel, canWrite, isAnyGroup] = await Promise.all([\n this.chat.isChannel,\n this.chat.canSend(),\n this.chat.isAnyGroup\n ]);\n\n return () => {\n this.chatInner.classList.toggle('has-rights', canWrite);\n this.container.classList.toggle('is-chat-input-hidden', !canWrite);\n\n this.chatInner.classList.toggle('is-chat', isAnyGroup);\n this.chatInner.classList.toggle('is-channel', isChannel);\n\n this.createResizeObserver();\n };\n }\n\n private processBatch = async(...args: Parameters) => {\n let [loadQueue, m, log] = args;\n\n const filterQueue = (queue: typeof loadQueue) => {\n return queue.filter((details) => {\n // message can be deleted during rendering\n return details && this.bubbles[details.bubble.dataset.mid] === details.bubble;\n });\n };\n\n loadQueue = filterQueue(loadQueue);\n\n log('messages rendered');\n\n const reverse = loadQueue[0]?.reverse;\n\n const {groups, avatarPromises} = this.groupBubbles(loadQueue.filter((details) => details.updatePosition));\n\n // if(groups.length > 2 && loadQueue.length === 1) {\n // debugger;\n // }\n\n const promises = loadQueue.reduce((acc, details) => {\n const perf = performance.now();\n\n const promises = details.promises.slice();\n const timePromises = promises.map(async(promise) => (await promise, performance.now() - perf));\n Promise.all(timePromises).then((times) => {\n log.groupCollapsed('media message time', performance.now() - perf, details, times);\n times.forEach((time, idx) => {\n log('media message time', time, idx, promises[idx]);\n });\n log.groupEnd();\n });\n\n // if(details.updatePosition) {\n // if(res) {\n // groups.add(res.group);\n // if(details.needAvatar) {\n // details.promises.push(res.group.createAvatar(details.message));\n // }\n // }\n // }\n\n acc.push(...details.promises);\n return acc;\n }, [] as Promise[]);\n\n promises.push(...avatarPromises);\n // promises.push(pause(200));\n\n // * ัั‚ะพ ะฝัƒะถะฝะพ ะดะปั ั‚ะพะณะพ, ั‡ั‚ะพะฑั‹ ะตัะปะธ ะทะฐั…ะพั‡ะตั‚ ะฟะพะดะณั€ัƒะทะธั‚ัŒ reply ะธะปะธ ะบะฐะบะพะต-ะปะธะฑะพ ัะพะพะฑั‰ะตะฝะธะต, ั‚ะพ ัะบั€ะพะปะป ะฝะต ะฟั€ะตั€ะฒะฐะปัั\n // * ะตัะปะธ ะดะพะฑะฐะฒะธั‚ัŒ ัั‚ะพั‚ ะฟั€ะพะผะธั - ะฒ ั‚ะฐะบะพะผ ัะปัƒั‡ะฐะต ะฝัƒะถะฝะพ ัะดะตะปะฐั‚ัŒ, ั‡ั‚ะพะฑั‹ ัะบั€ะพะปะปะธะปะพ ะบ ะฟะพัะปะตะดะฝะตะผัƒ ัะพะพะฑั‰ะตะฝะธัŽ ะฟะพัะปะต ั€ะตะฝะดะตั€ะฐ\n // promises.push(getHeavyAnimationPromise());\n\n log('media promises to call', promises, loadQueue, this.isHeavyAnimationInProgress);\n await m(Promise.all([...promises, this.setUnreadDelimiter()]).catch(noop)); // ะฝะต ะฝะฐัˆั‘ะป ะผะตัั‚ะฐ ะปัƒั‡ัˆะต\n await m(fastRafPromise()); // have to be the last\n log('media promises end');\n\n loadQueue = filterQueue(loadQueue);\n\n const {restoreScroll, scrollSaver} = this.prepareToSaveScroll(reverse);\n // if(this.messagesQueueOnRender) {\n // this.messagesQueueOnRender();\n // }\n\n this.messagesQueueOnRenderAdditional?.();\n\n this.ejectBubbles();\n for(const [bubble, oldBubble] of this.bubblesToReplace) {\n if(scrollSaver) {\n scrollSaver.replaceSaved(oldBubble, bubble);\n }\n\n if(!loadQueue.find((details) => details.bubble === bubble)) {\n continue;\n }\n\n const item = this.bubbleGroups.getItemByBubble(bubble);\n if(!item) {\n this.log.error('NO ITEM BY BUBBLE', bubble);\n } else {\n item.mounted = false;\n if(!groups.includes(item.group)) {\n groups.push(item.group);\n }\n }\n\n this.bubblesToReplace.delete(bubble);\n }\n\n if(this.chat.selection.isSelecting) {\n loadQueue.forEach(({bubble}) => {\n this.chat.selection.toggleElementCheckbox(bubble, true);\n });\n }\n\n loadQueue.forEach(({message, bubble, updatePosition}) => {\n if(message.pFlags.local && updatePosition) {\n this.chatInner[(message as Message.message).pFlags.sponsored ? 'append' : 'prepend'](bubble);\n return;\n }\n });\n\n this.bubbleGroups.mountUnmountGroups(groups);\n // this.bubbleGroups.findIncorrentPositions();\n\n this.updatePlaceholderPosition?.();\n\n restoreScroll?.();\n\n // this.setStickyDateManually();\n };\n\n public renderMessagesQueue(options: ReturnType) {\n return this.batchProcessor.addToQueue(options);\n }\n\n private ejectBubbles() {\n for(const bubble of this.bubblesToEject) {\n bubble.remove();\n // this.bubbleGroups.removeAndUnmountBubble(bubble);\n }\n\n this.bubblesToEject.clear();\n }\n\n public groupBubbles(items: Array<{\n // Awaited> &\n bubble: HTMLElement,\n message: Message.message | Message.messageService\n }/* & {\n unmountIfFound?: boolean\n } */>) {\n let modifiedGroups: typeof groups;\n\n if(this.chat.type === 'scheduled') {\n modifiedGroups = new Set();\n items.forEach(({bubble, message}) => {\n const item = this.bubbleGroups.getItemByBubble(bubble);\n const group = item?.group;\n if(group && item.message.date !== message.date) {\n this.bubbleGroups.removeItem(item);\n modifiedGroups.add(group);\n }\n });\n }\n\n items.forEach(({bubble, message}) => {\n this.bubbleGroups.prepareForGrouping(bubble, message);\n });\n\n const groups = this.bubbleGroups.groupUngrouped();\n\n const avatarPromises = Array.from(groups).map((group) => {\n if(group.avatar) return;\n const firstItem = group.firstItem;\n if(firstItem && this.chat.isAvatarNeeded(firstItem.message)) {\n return group.createAvatar(firstItem.message);\n }\n }).filter(Boolean);\n\n if(modifiedGroups) {\n for(const group of modifiedGroups) {\n groups.add(group);\n }\n }\n\n return {\n groups: [...groups],\n avatarPromises\n };\n }\n\n public getMiddleware(additionalCallback?: () => boolean) {\n return this.middlewareHelper.get(additionalCallback);\n }\n\n private async wrapMediaSpoiler({\n media,\n promise,\n middleware,\n attachmentDiv\n }: {\n media: Photo.photo | MyDocument,\n promise: Promise,\n middleware: Middleware,\n attachmentDiv: HTMLElement\n }) {\n await promise;\n if(!middleware()) {\n return;\n }\n\n const {width, height} = attachmentDiv.style;\n const container = await wrapMediaSpoiler({\n media,\n width: parseInt(width),\n height: parseInt(height),\n middleware,\n animationGroup: this.chat.animationGroup\n });\n\n if(!middleware()) {\n return;\n }\n\n attachmentDiv.append(container);\n }\n\n private async safeRenderMessage(\n message: Message.message | Message.messageService,\n reverse?: boolean,\n bubble?: HTMLElement,\n updatePosition = true,\n processResult?: (result: ReturnType, bubble: HTMLElement) => typeof result\n ) {\n if(!message || this.renderingMessages.has(message.mid) || (this.bubbles[message.mid] && !bubble)) {\n return;\n }\n\n const middlewareHelper = this.getMiddleware().create();\n const middleware = middlewareHelper.get();\n\n let result: Awaited> & {updatePosition: typeof updatePosition};\n try {\n this.renderingMessages.add(message.mid);\n\n // const groupedId = (message as Message.message).grouped_id;\n const newBubble = document.createElement('div');\n newBubble.middlewareHelper = middlewareHelper;\n newBubble.dataset.mid = '' + message.mid;\n newBubble.dataset.peerId = '' + message.peerId;\n newBubble.dataset.timestamp = '' + message.date;\n\n // const bubbleNew: Bubble = this.bubblesNew[message.mid] ??= {\n // bubble: newBubble,\n // mids: new Set(),\n // groupedId\n // };\n\n // bubbleNew.mids.add(message.mid);\n\n if(bubble) {\n bubble.middlewareHelper.destroy();\n this.skippedMids.delete(message.mid);\n\n this.bubblesToEject.add(bubble);\n this.bubblesToReplace.delete(bubble);\n this.bubblesToReplace.set(newBubble, bubble);\n this.bubbleGroups.changeBubbleByBubble(bubble, newBubble);\n }\n\n bubble = this.bubbles[message.mid] = newBubble;\n let originalPromise = this.renderMessage(message, reverse, bubble, middleware);\n if(processResult) {\n originalPromise = processResult(originalPromise, bubble);\n }\n\n const promise = originalPromise.then((r) => ((r && middleware() ? {...r, updatePosition} : undefined) as typeof result));\n\n this.renderMessagesQueue(promise.catch(() => undefined));\n\n result = await promise;\n if(!middleware()) {\n return;\n }\n\n if(!result) {\n this.skippedMids.add(+message.mid);\n }\n } catch(err) {\n this.log.error('renderMessage error:', err);\n }\n\n if(!middleware()) {\n return;\n }\n\n this.renderingMessages.delete(message.mid);\n return result;\n }\n\n // reverse means top\n private async renderMessage(\n message: Message.message | Message.messageService,\n reverse = false,\n bubble: HTMLElement,\n middleware: Middleware\n ) {\n // if(DEBUG) {\n // this.log('message to render:', message);\n // }\n\n // if(!bubble && this.bubbles[message.mid]) {\n // return;\n // }\n\n // await pause(1000);\n\n const isMessage = message._ === 'message';\n const groupedId = isMessage && message.grouped_id;\n let albumMids: number[], reactionsMessage: Message.message;\n const albumMessages = groupedId ? await this.managers.appMessagesManager.getMessagesByAlbum(groupedId) : undefined;\n\n const albumMustBeRenderedFull = this.chat.type !== 'pinned';\n\n if(groupedId && albumMustBeRenderedFull) { // will render only last album's message\n albumMids = albumMessages.map((message) => message.mid);\n const mainMid = getMainMidForGrouped(albumMids);\n if(message.mid !== mainMid) {\n return;\n }\n }\n\n if(isMessage) {\n reactionsMessage = groupedId ? albumMessages[0] : message;\n }\n\n // * can't use 'message.pFlags.out' here because this check will be used to define side of message (left-right)\n const our = this.chat.isOurMessage(message);\n\n const messageDiv = document.createElement('div');\n messageDiv.classList.add('message', 'spoilers-container');\n\n const contentWrapper = document.createElement('div');\n contentWrapper.classList.add('bubble-content-wrapper');\n\n const bubbleContainer = document.createElement('div');\n bubbleContainer.classList.add('bubble-content');\n\n bubble.classList.add('bubble');\n contentWrapper.append(bubbleContainer);\n bubble.append(contentWrapper);\n\n let isInUnread = !our &&\n !message.pFlags.out &&\n (\n message.pFlags.unread ||\n isMentionUnread(message)\n );\n\n if(!isInUnread && this.chat.peerId.isAnyChat()) {\n const readMaxId = await this.managers.appMessagesManager.getReadMaxIdIfUnread(this.chat.peerId, this.chat.threadId);\n if(readMaxId !== undefined && readMaxId < message.mid) {\n isInUnread = true;\n }\n }\n\n if(isInUnread && this.observer) {\n // this.log('not our message', message, message.pFlags.unread);\n this.observer.observe(bubble, this.unreadedObserverCallback);\n this.unreaded.set(bubble, message.mid);\n }\n\n const loadPromises: Promise[] = [];\n const ret = {\n bubble,\n promises: loadPromises,\n message,\n reverse\n };\n\n const wrapOptions: WrapSomethingOptions = {\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n customEmojiSize: this.chat.appImManager.customEmojiSize,\n animationGroup: this.chat.animationGroup\n };\n\n if(message._ === 'messageService' && (!message.action || !SERVICE_AS_REGULAR.has(message.action._))) {\n const action = message.action;\n if(action) {\n const _ = action._;\n\n const ignoreAction = IGNORE_ACTIONS.get(_);\n if(ignoreAction && (ignoreAction === true || ignoreAction(message))) {\n return;\n }\n\n if(langPack.hasOwnProperty(_) && !langPack[_]) {\n return;\n }\n }\n\n bubble.className = 'bubble service';\n\n bubbleContainer.innerHTML = '';\n const s = document.createElement('div');\n s.classList.add('service-msg');\n if(action) {\n let promise: Promise;\n if(action._ === 'messageActionChannelMigrateFrom') {\n const peerTitle = new PeerTitle();\n promise = peerTitle.update({peerId: action.chat_id.toPeerId(true), wrapOptions});\n s.append(i18n('ChatMigration.From', [peerTitle.element]));\n } else if(action._ === 'messageActionChatMigrateTo') {\n const peerTitle = new PeerTitle();\n promise = peerTitle.update({peerId: action.channel_id.toPeerId(true), wrapOptions});\n s.append(i18n('ChatMigration.To', [peerTitle.element]));\n } else {\n s.append(await wrapMessageActionTextNew({\n message,\n ...wrapOptions\n }));\n }\n }\n bubbleContainer.append(s);\n\n if(message.pFlags.is_single) { // * Ignore 'Discussion started'\n bubble.classList.add('is-group-last');\n }\n\n return ret;\n }\n\n let messageMedia: MessageMedia = isMessage && message.media;\n let needToSetHTML = true;\n let messageMessage: string, totalEntities: MessageEntity[];\n if(isMessage) {\n if(groupedId && albumMustBeRenderedFull) {\n const t = getAlbumText(albumMessages);\n messageMessage = t?.message || '';\n // totalEntities = t.entities;\n totalEntities = t?.totalEntities || [];\n } else {\n messageMessage = message.message;\n // totalEntities = message.entities;\n totalEntities = message.totalEntities;\n }\n\n const document = (messageMedia as MessageMedia.messageMediaDocument)?.document as MyDocument;\n if(document) {\n if(document?.type === 'sticker') {\n messageMessage = totalEntities = undefined;\n } else if(!['video', 'gif'].includes(document.type)) {\n needToSetHTML = false;\n }\n }\n } else {\n if(message.action._ === 'messageActionPhoneCall') {\n messageMedia = {\n _: 'messageMediaCall',\n action: message.action\n };\n }\n }\n\n let bigEmojis = 0, customEmojiSize: MediaSize;\n if(totalEntities && !messageMedia) {\n const emojiEntities = totalEntities.filter((e) => e._ === 'messageEntityEmoji'/* || e._ === 'messageEntityCustomEmoji' */);\n const strLength = messageMessage.replace(/\\s/g, '').length;\n const emojiStrLength = emojiEntities.reduce((acc, curr) => acc + curr.length, 0);\n\n if(emojiStrLength === strLength /* && emojiEntities.length <= 3 *//* && totalEntities.length === emojiEntities.length */) {\n bigEmojis = Math.min(BIG_EMOJI_SIZES_LENGTH, emojiEntities.length);\n\n customEmojiSize = mediaSizes.active.customEmoji;\n\n const size = BIG_EMOJI_SIZES[bigEmojis];\n if(size) {\n customEmojiSize = makeMediaSize(size, size);\n bubble.style.setProperty('--emoji-size', size + 'px');\n }\n }\n }\n\n customEmojiSize ??= this.chat.appImManager.customEmojiSize;\n\n const richText = wrapRichText(messageMessage, {\n entities: totalEntities,\n passEntities: this.passEntities,\n loadPromises,\n lazyLoadQueue: this.lazyLoadQueue,\n customEmojiSize,\n middleware,\n animationGroup: this.chat.animationGroup\n });\n\n let canHaveTail = true;\n let isStandaloneMedia = false;\n let attachmentDiv: HTMLElement;\n if(bigEmojis) {\n if(rootScope.settings.emoji.big) {\n const sticker = bigEmojis === 1 &&\n !totalEntities.find((entity) => entity._ === 'messageEntityCustomEmoji') &&\n await this.managers.appStickersManager.getAnimatedEmojiSticker(messageMessage);\n if(bigEmojis === 1 && !messageMedia && sticker) {\n messageMedia = {\n _: 'messageMediaDocument',\n document: sticker,\n pFlags: {}\n };\n } else {\n attachmentDiv = document.createElement('div');\n attachmentDiv.classList.add('attachment', 'spoilers-container');\n\n setInnerHTML(attachmentDiv, richText);\n\n bubbleContainer.append(attachmentDiv);\n }\n\n bubble.classList.add('is-message-empty', 'emoji-big');\n isStandaloneMedia = true;\n canHaveTail = false;\n needToSetHTML = false;\n }\n\n bubble.classList.add('can-have-big-emoji');\n }\n\n if(needToSetHTML) {\n setInnerHTML(messageDiv, richText);\n }\n\n const haveRTLChar = isRTL(messageMessage, true);\n\n const timeSpan = MessageRender.setTime({\n chatType: this.chat.type,\n message,\n reactionsMessage\n });\n messageDiv.append(timeSpan);\n bubbleContainer.prepend(messageDiv);\n // bubble.prepend(timeSpan, messageDiv); // that's bad\n\n if(haveRTLChar) {\n timeSpan.classList.add('is-block');\n }\n\n let topicNameButtonContainer: HTMLElement;\n if(isMessage && this.chat.isAllMessagesForum) {\n const result = await wrapTopicNameButton({\n peerId: this.peerId,\n threadId: getMessageThreadId(message, this.chat.isForum),\n lastMsgId: message.mid,\n wrapOptions: {\n middleware\n },\n withIcons: true\n });\n\n const {element} = result;\n // if(isStandaloneMedia) {\n // element.classList.add('floating-part');\n // }\n\n topicNameButtonContainer = document.createElement('div');\n topicNameButtonContainer.classList.add(/* 'name', */'topic-name-button-container');\n topicNameButtonContainer.append(element);\n }\n\n if(isMessage && message.views) {\n bubble.classList.add('channel-post');\n\n if(!message.fwd_from?.saved_from_msg_id && this.chat.type !== 'pinned') {\n const forward = document.createElement('div');\n forward.classList.add('bubble-beside-button', 'forward', 'tgico-forward_filled');\n bubbleContainer.prepend(forward);\n bubble.classList.add('with-beside-button');\n }\n\n if(!message.pFlags.is_outgoing && this.observer) {\n this.observer.observe(bubble, this.viewsObserverCallback);\n }\n }\n\n const replyMarkup = isMessage && message.reply_markup;\n let replyMarkupRows = replyMarkup?._ === 'replyInlineMarkup' && replyMarkup.rows;\n if(replyMarkupRows) {\n replyMarkupRows = replyMarkupRows.filter((row) => row.buttons.length);\n }\n\n if(replyMarkupRows) {\n const containerDiv = document.createElement('div');\n containerDiv.classList.add('reply-markup');\n replyMarkupRows.forEach((row) => {\n const buttons = row.buttons;\n\n const rowDiv = document.createElement('div');\n rowDiv.classList.add('reply-markup-row');\n\n buttons.forEach((button) => {\n let text: DocumentFragment | HTMLElement | string = wrapRichText(button.text, {noLinks: true, noLinebreaks: true});\n\n let buttonEl: HTMLButtonElement | HTMLAnchorElement;\n\n switch(button._) {\n case 'keyboardButtonUrl': {\n const r = wrapRichText(' ', {\n entities: [{\n _: 'messageEntityTextUrl',\n length: 1,\n offset: 0,\n url: button.url\n }]\n });\n\n buttonEl = htmlToDocumentFragment(r).firstElementChild as HTMLAnchorElement;\n buttonEl.classList.add('is-link');\n\n break;\n }\n\n case 'keyboardButtonSwitchInline': {\n buttonEl = document.createElement('button');\n buttonEl.classList.add('is-switch-inline');\n attachClickEvent(buttonEl, (e) => {\n cancelEvent(e);\n\n const botId = message.viaBotId || message.fromId;\n let promise: Promise;\n if(button.pFlags.same_peer) promise = Promise.resolve(this.peerId);\n else promise = this.managers.appInlineBotsManager.checkSwitchReturn(botId).then((peerId) => {\n if(peerId) {\n return peerId;\n }\n\n return new Promise((resolve, reject) => {\n const popup = new PopupForward(undefined, (peerId) => {\n resolve(peerId);\n });\n\n popup.addEventListener('close', () => {\n reject();\n });\n });\n });\n\n promise.then((peerId) => {\n const threadId = this.peerId === peerId ? this.chat.threadId : undefined;\n this.chat.appImManager.setInnerPeer({peerId});\n this.managers.appInlineBotsManager.switchInlineQuery(peerId, threadId, botId, button.query);\n });\n });\n break;\n }\n\n case 'keyboardButtonBuy': {\n const mediaInvoice = messageMedia._ === 'messageMediaInvoice' ? messageMedia : undefined;\n if(mediaInvoice?.extended_media) {\n break;\n }\n\n buttonEl = document.createElement('button');\n buttonEl.classList.add('is-buy');\n\n if(mediaInvoice?.receipt_msg_id) {\n text = i18n('Message.ReplyActionButtonShowReceipt');\n }\n\n break;\n }\n\n case 'keyboardButtonUrlAuth': {\n buttonEl = document.createElement('button');\n buttonEl.classList.add('is-url-auth');\n\n const {peerId} = this;\n const {mid} = message;\n const {url, button_id} = button;\n\n attachClickEvent(buttonEl, () => {\n const toggle = toggleDisability([buttonEl], true);\n this.chat.appImManager.handleUrlAuth({\n peerId,\n mid,\n url,\n buttonId: button_id\n }).then(() => {\n toggle();\n });\n });\n break;\n }\n\n default: {\n buttonEl = document.createElement('button');\n break;\n }\n }\n\n if(!buttonEl) {\n return;\n }\n\n buttonEl.classList.add('reply-markup-button', 'rp', 'tgico');\n const t = document.createElement('span');\n t.classList.add('reply-markup-button-text');\n if(typeof(text) === 'string') {\n t.insertAdjacentHTML('beforeend', text);\n } else {\n t.append(text);\n }\n\n ripple(buttonEl);\n buttonEl.append(t);\n\n rowDiv.append(buttonEl);\n });\n\n if(!rowDiv.childElementCount) {\n return;\n }\n\n containerDiv.append(rowDiv);\n });\n\n const haveButtons = !!containerDiv.childElementCount;\n\n haveButtons && attachClickEvent(containerDiv, (e) => {\n let target = e.target as HTMLElement;\n\n if(!target.classList.contains('reply-markup-button')) target = findUpClassName(target, 'reply-markup-button');\n if(\n !target ||\n target.classList.contains('is-link') ||\n target.classList.contains('is-switch-inline') ||\n target.classList.contains('is-buy') ||\n target.classList.contains('is-url-auth')\n ) return;\n\n cancelEvent(e);\n\n const column = whichChild(target);\n const row = replyMarkupRows[whichChild(target.parentElement)];\n\n if(!row.buttons || !row.buttons[column]) {\n this.log.warn('no such button', row, column, message);\n return;\n }\n\n const button = row.buttons[column];\n this.managers.appInlineBotsManager.callbackButtonClick(this.peerId, message.mid, button).then((callbackAnswer) => {\n if(typeof callbackAnswer.message === 'string' && callbackAnswer.message.length) {\n toast(wrapRichText(callbackAnswer.message, {noLinks: true, noLinebreaks: true}));\n }\n\n // console.log('callbackButtonClick callbackAnswer:', callbackAnswer);\n });\n });\n\n if(haveButtons) {\n // canHaveTail = false;\n bubble.classList.add('with-reply-markup');\n contentWrapper.append(containerDiv);\n }\n }\n\n const isOutgoing = message.pFlags.is_outgoing/* && this.peerId !== rootScope.myId */;\n if(our) {\n if(message.pFlags.unread || isOutgoing) this.unreadOut.add(message.mid);\n let status = '';\n if(message.error) status = 'is-error';\n else if(isOutgoing) status = 'is-sending';\n else status = message.pFlags.unread || (message as Message.message).pFlags.is_scheduled ? 'is-sent' : 'is-read';\n bubble.classList.add(status);\n }\n\n if(isOutgoing && !message.error) {\n bubble.classList.add('is-outgoing');\n }\n\n const messageWithReplies = isMessage && await this.managers.appMessagesManager.getMessageWithCommentReplies(message);\n const withReplies = !!messageWithReplies && message.mid > 0;\n\n if(withReplies) {\n bubble.classList.add('with-replies');\n }\n\n const fwdFrom = isMessage && message.fwd_from;\n const fwdFromId = isMessage && message.fwdFromId;\n\n const isOut = this.chat.isOutMessage(message);\n let nameContainer: HTMLElement = bubbleContainer;\n\n const canHideNameIfMedia = !message.viaBotId && (message.fromId === rootScope.myId || !message.pFlags.out);\n\n const isMessageEmpty = !messageMessage/* && (!topicNameButtonContainer || isStandaloneMedia) */;\n\n let viewButton: HTMLAnchorElement;\n // media\n if(messageMedia/* && messageMedia._ === 'messageMediaPhoto' */) {\n attachmentDiv = document.createElement('div');\n attachmentDiv.classList.add('attachment');\n\n if(isMessageEmpty) {\n bubble.classList.add('is-message-empty');\n }\n\n let processingWebPage = false;\n\n /* if(isMessage) */switch(messageMedia._) {\n case 'messageMediaPhoto': {\n const photo = messageMedia.photo;\n // //////this.log('messageMediaPhoto', photo);\n\n if(isMessageEmpty) {\n canHaveTail = false;\n }\n\n if(canHideNameIfMedia) {\n bubble.classList.add('hide-name');\n }\n\n bubble.classList.add('photo');\n\n if(albumMustBeRenderedFull && groupedId && albumMids.length !== 1) {\n bubble.classList.add('is-album', 'is-grouped');\n wrapAlbum({\n messages: albumMessages,\n attachmentDiv,\n middleware: this.getMiddleware(),\n isOut: our,\n lazyLoadQueue: this.lazyLoadQueue,\n chat: this.chat,\n loadPromises,\n autoDownload: this.chat.autoDownload\n });\n\n break;\n }\n\n const withTail = !IS_ANDROID && canHaveTail && !withReplies && USE_MEDIA_TAILS;\n if(withTail) bubble.classList.add('with-media-tail');\n const p = wrapPhoto({\n photo: photo as Photo.photo,\n message,\n container: attachmentDiv,\n withTail,\n isOut,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware: this.getMiddleware(),\n loadPromises,\n autoDownloadSize: this.chat.autoDownload.photo\n });\n\n if(messageMedia.pFlags.spoiler) {\n loadPromises.push(this.wrapMediaSpoiler({\n media: photo as Photo.photo,\n promise: p,\n middleware,\n attachmentDiv\n }));\n }\n\n break;\n }\n\n case 'messageMediaWebPage': {\n processingWebPage = true;\n\n const webPage: WebPage = messageMedia.webpage;\n // //////this.log('messageMediaWebPage', webpage);\n if(webPage._ !== 'webPage') {\n break;\n }\n\n const wrapped = wrapUrl(webPage.url);\n if(wrapped?.onclick === 'im') {\n const map: {[type: string]: LangPackKey} = {\n telegram_channel: 'Chat.Message.ViewChannel',\n telegram_megagroup: 'OpenGroup',\n telegram_bot: 'Chat.Message.ViewBot'\n };\n\n const langPackKey = map[webPage.type] || 'OpenMessage';\n viewButton = this.makeViewButton({text: langPackKey, asLink: true});\n viewButton.href = wrapped.url;\n viewButton.setAttribute('onclick', `${wrapped.onclick}(this)`);\n }\n\n bubble.classList.add('webpage');\n\n const box = document.createElement('div');\n box.classList.add('web');\n\n const quote = document.createElement('div');\n quote.classList.add('quote');\n\n let previewResizer: HTMLDivElement, preview: HTMLDivElement;\n const photo: Photo.photo = webPage.photo as any;\n if(photo || webPage.document) {\n previewResizer = document.createElement('div');\n previewResizer.classList.add('preview-resizer');\n preview = document.createElement('div');\n preview.classList.add('preview');\n previewResizer.append(preview);\n }\n\n const quoteTextDiv = document.createElement('div');\n quoteTextDiv.classList.add('quote-text');\n\n const doc = webPage.document as MyDocument;\n if(doc) {\n if(doc.type === 'gif' || doc.type === 'video' || doc.type === 'round') {\n // if(doc.size <= 20e6) {\n const mediaSize = doc.type === 'round' ? mediaSizes.active.round : mediaSizes.active.webpage;\n if(doc.type === 'round') {\n bubble.classList.add('round');\n preview.classList.add('is-round');\n } else {\n bubble.classList.add('video');\n }\n wrapVideo({\n doc,\n container: preview,\n message: message as Message.message,\n boxWidth: mediaSize.width,\n boxHeight: mediaSize.height,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware: this.getMiddleware(),\n isOut,\n group: this.chat.animationGroup,\n loadPromises,\n autoDownload: this.chat.autoDownload,\n noInfo: message.mid < 0\n });\n // }\n } else {\n const docDiv = await wrapDocument({\n message: message as Message.message,\n autoDownloadSize: this.chat.autoDownload.file,\n lazyLoadQueue: this.lazyLoadQueue,\n loadPromises,\n sizeType: 'documentName',\n searchContext: {\n useSearch: false,\n peerId: this.peerId,\n inputFilter: {\n _: 'inputMessagesFilterEmpty'\n }\n },\n fontSize: rootScope.settings.messagesTextSize\n });\n preview.append(docDiv);\n preview.classList.add('preview-with-document');\n quoteTextDiv.classList.add('has-document');\n // messageDiv.classList.add((webpage.type || 'document') + '-message');\n // doc = null;\n }\n }\n\n if(previewResizer) {\n quoteTextDiv.append(previewResizer);\n }\n\n let t: HTMLElement;\n if(webPage.site_name) {\n const html = wrapRichText(webPage.url);\n const a: HTMLAnchorElement = htmlToDocumentFragment(html).firstElementChild as any;\n a.classList.add('webpage-name');\n const strong = document.createElement('strong');\n setInnerHTML(strong, wrapEmojiText(webPage.site_name));\n a.textContent = '';\n a.append(strong);\n quoteTextDiv.append(a);\n t = a;\n }\n\n const title = wrapWebPageTitle(webPage);\n if(title.textContent) {\n const titleDiv = document.createElement('div');\n titleDiv.classList.add('title');\n const strong = document.createElement('strong');\n setInnerHTML(strong, title);\n titleDiv.append(strong);\n quoteTextDiv.append(titleDiv);\n t = titleDiv;\n }\n\n const description = wrapWebPageDescription(webPage);\n if(description.textContent) {\n const textDiv = document.createElement('div');\n textDiv.classList.add('text');\n setInnerHTML(textDiv, description);\n quoteTextDiv.append(textDiv);\n t = textDiv;\n }\n\n /* if(t) {\n t.append(timeSpan);\n } else {\n box.classList.add('no-text');\n } */\n\n quote.append(quoteTextDiv);\n\n if(photo && !doc) {\n bubble.classList.add('photo');\n\n const size: PhotoSize.photoSize = photo.sizes[photo.sizes.length - 1] as any;\n let isSquare = false;\n if(size.w === size.h && t) {\n bubble.classList.add('is-square-photo');\n isSquare = true;\n setAttachmentSize(photo, preview, 48, 48, false);\n\n /* if(t) {\n t.append(timeSpan);\n } */\n } else if(size.h > size.w) {\n bubble.classList.add('is-vertical-photo');\n }\n\n wrapPhoto({\n photo,\n message,\n container: preview,\n boxWidth: isSquare ? 0 : mediaSizes.active.webpage.width,\n boxHeight: isSquare ? 0 : mediaSizes.active.webpage.height,\n isOut,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware: this.getMiddleware(),\n loadPromises,\n withoutPreloader: isSquare,\n autoDownloadSize: this.chat.autoDownload.photo\n });\n }\n\n box.append(quote);\n\n // bubble.prepend(box);\n // if(timeSpan.parentElement === messageDiv) {\n messageDiv.insertBefore(box, timeSpan);\n // } else {\n // messageDiv.append(box);\n // }\n\n // this.log('night running', bubble.scrollHeight);\n\n break;\n }\n\n case 'messageMediaDocument': {\n const doc = messageMedia.document as MyDocument;\n\n // this.log('messageMediaDocument', doc, bubble);\n\n if(doc.sticker/* && doc.size <= 1e6 */) {\n bubble.classList.add('sticker');\n canHaveTail = false;\n isStandaloneMedia = true;\n\n if(doc.animated) {\n bubble.classList.add('sticker-animated');\n }\n\n const sizes = mediaSizes.active;\n const isEmoji = bubble.classList.contains('emoji-big');\n const boxSize = isEmoji ? sizes.emojiSticker : (doc.animated ? sizes.animatedSticker : sizes.staticSticker);\n setAttachmentSize(doc, attachmentDiv, boxSize.width, boxSize.height);\n // let preloader = new ProgressivePreloader(attachmentDiv, false);\n bubbleContainer.style.minWidth = attachmentDiv.style.width;\n bubbleContainer.style.minHeight = attachmentDiv.style.height;\n // appPhotosManager.setAttachmentSize(doc, bubble);\n wrapSticker({\n doc,\n div: attachmentDiv,\n middleware,\n lazyLoadQueue: this.lazyLoadQueue,\n group: this.chat.animationGroup,\n // play: !!message.pending || !multipleRender,\n play: true,\n loop: true,\n emoji: isEmoji ? messageMessage : undefined,\n withThumb: true,\n loadPromises,\n isOut,\n noPremium: messageMedia?.pFlags?.nopremium\n });\n\n if((getStickerEffectThumb(doc) || isEmoji) && (isInUnread || isOutgoing)/* || true */) {\n this.observer.observe(bubble, this.stickerEffectObserverCallback);\n }\n } else if(doc.type === 'video' || doc.type === 'gif' || doc.type === 'round'/* && doc.size <= 20e6 */) {\n // this.log('never get free 2', doc);\n\n const isRound = doc.type === 'round';\n if(isRound) {\n isStandaloneMedia = true;\n }\n\n if(isRound || isMessageEmpty) {\n canHaveTail = false;\n }\n\n if(canHideNameIfMedia) {\n bubble.classList.add('hide-name');\n }\n\n bubble.classList.add(isRound ? 'round' : 'video');\n if(albumMustBeRenderedFull && groupedId && albumMids.length !== 1) {\n bubble.classList.add('is-album', 'is-grouped');\n\n wrapAlbum({\n messages: albumMessages,\n attachmentDiv,\n middleware,\n isOut: our,\n lazyLoadQueue: this.lazyLoadQueue,\n chat: this.chat,\n loadPromises,\n autoDownload: this.chat.autoDownload\n });\n } else {\n const withTail = !IS_ANDROID && !IS_APPLE && !isRound && canHaveTail && !withReplies && USE_MEDIA_TAILS;\n if(withTail) bubble.classList.add('with-media-tail');\n const p = wrapVideo({\n doc,\n container: attachmentDiv,\n message: message as Message.message,\n boxWidth: mediaSizes.active.regular.width,\n boxHeight: mediaSizes.active.regular.height,\n withTail,\n isOut,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n group: this.chat.animationGroup,\n loadPromises,\n autoDownload: this.chat.autoDownload,\n searchContext: isRound ? {\n peerId: this.peerId,\n inputFilter: {_: 'inputMessagesFilterRoundVoice'},\n threadId: this.chat.threadId,\n useSearch: !(message as Message.message).pFlags.is_scheduled,\n isScheduled: (message as Message.message).pFlags.is_scheduled\n } : undefined,\n noInfo: message.mid < 0,\n noAutoplayAttribute: !!messageMedia.pFlags.spoiler\n });\n\n if(messageMedia.pFlags.spoiler) {\n loadPromises.push(this.wrapMediaSpoiler({\n media: doc,\n promise: p,\n middleware,\n attachmentDiv\n }));\n }\n }\n } else {\n const newNameContainer = await wrapGroupedDocuments({\n albumMustBeRenderedFull,\n message,\n bubble,\n messageDiv,\n chat: this.chat,\n loadPromises,\n autoDownloadSize: this.chat.autoDownload.file,\n lazyLoadQueue: this.lazyLoadQueue,\n searchContext: doc.type === 'voice' || doc.type === 'audio' ? {\n peerId: this.peerId,\n inputFilter: {_: doc.type === 'voice' ? 'inputMessagesFilterRoundVoice' : 'inputMessagesFilterMusic'},\n threadId: this.chat.threadId,\n useSearch: !(message as Message.message).pFlags.is_scheduled,\n isScheduled: (message as Message.message).pFlags.is_scheduled\n } : undefined,\n sizeType: 'documentName',\n fontSize: rootScope.settings.messagesTextSize,\n richTextFragment: richText\n });\n\n if(newNameContainer) {\n nameContainer = newNameContainer;\n }\n\n const lastContainer = messageDiv.lastElementChild.querySelector('.document-message, .document, .audio');\n // lastContainer && lastContainer.append(timeSpan.cloneNode(true));\n lastContainer && lastContainer.append(timeSpan);\n\n bubble.classList.remove('is-message-empty');\n const addClassName = (!(['photo', 'pdf'] as MyDocument['type'][]).includes(doc.type) ? doc.type || 'document' : 'document') + '-message';\n messageDiv.classList.add(addClassName);\n\n if(doc.type === 'audio' || doc.type === 'voice') {\n bubble.classList.add('min-content');\n }\n\n processingWebPage = true;\n }\n\n break;\n }\n\n case 'messageMediaCall': {\n const action = messageMedia.action;\n const div = document.createElement('div');\n div.classList.add('bubble-call', action.pFlags.video ? 'tgico-videocamera' : 'tgico-phone');\n\n const type: CallType = action.pFlags.video ? 'video' : 'voice';\n div.dataset.type = type;\n\n const title = document.createElement('div');\n title.classList.add('bubble-call-title');\n\n _i18n(title, isOut ?\n (action.pFlags.video ? 'CallMessageVideoOutgoing' : 'CallMessageOutgoing') :\n (action.pFlags.video ? 'CallMessageVideoIncoming' : 'CallMessageIncoming'));\n\n const subtitle = document.createElement('div');\n subtitle.classList.add('bubble-call-subtitle');\n\n if(action.duration !== undefined) {\n subtitle.append(formatCallDuration(action.duration));\n } else {\n let langPackKey: LangPackKey;\n switch(action.reason._) {\n case 'phoneCallDiscardReasonBusy':\n langPackKey = 'Call.StatusBusy';\n break;\n case 'phoneCallDiscardReasonMissed':\n langPackKey = 'Chat.Service.Call.Missed';\n break;\n // case 'phoneCallDiscardReasonHangup':\n default:\n langPackKey = 'Chat.Service.Call.Cancelled';\n break;\n }\n\n subtitle.classList.add('is-reason');\n _i18n(subtitle, langPackKey);\n }\n\n subtitle.classList.add('tgico', 'arrow-' + (action.duration !== undefined ? 'green' : 'red'));\n\n div.append(title, subtitle);\n\n processingWebPage = true;\n\n bubble.classList.remove('is-message-empty');\n messageDiv.classList.add('call-message');\n messageDiv.append(div);\n\n break;\n }\n\n case 'messageMediaContact': {\n // this.log('wrapping contact', message);\n\n const contact = messageMedia;\n const contactDiv = document.createElement('div');\n contactDiv.classList.add('contact');\n contactDiv.dataset.peerId = '' + contact.user_id;\n\n processingWebPage = true;\n\n const contactDetails = document.createElement('div');\n contactDetails.className = 'contact-details';\n const contactNameDiv = document.createElement('div');\n contactNameDiv.className = 'contact-name';\n const fullName = [\n contact.first_name,\n contact.last_name\n ].filter(Boolean).join(' ');\n contactNameDiv.append(\n fullName.trim() ? wrapEmojiText(fullName) : i18n('AttachContact')\n );\n\n const contactNumberDiv = document.createElement('div');\n contactNumberDiv.className = 'contact-number';\n contactNumberDiv.textContent = contact.phone_number ? '+' + formatPhoneNumber(contact.phone_number).formatted : 'Unknown phone number';\n\n contactDiv.append(contactDetails);\n contactDetails.append(contactNameDiv, contactNumberDiv);\n\n const avatarElem = new AvatarElement();\n avatarElem.updateWithOptions({\n lazyLoadQueue: this.lazyLoadQueue,\n peerId: contact.user_id.toPeerId(),\n peerTitle: contact.user_id ? undefined : (fullName.trim() ? fullName : I18n.format('AttachContact', true)[0])\n });\n avatarElem.classList.add('contact-avatar', 'avatar-54');\n\n contactDiv.prepend(avatarElem);\n\n bubble.classList.remove('is-message-empty');\n messageDiv.classList.add('contact-message');\n messageDiv.append(contactDiv);\n\n break;\n }\n\n case 'messageMediaPoll': {\n bubble.classList.remove('is-message-empty');\n\n const pollElement = wrapPoll(message);\n messageDiv.prepend(pollElement);\n messageDiv.classList.add('poll-message');\n\n break;\n }\n\n case 'messageMediaInvoice': {\n const isTest = messageMedia.pFlags.test;\n const extendedMedia = messageMedia.extended_media;\n const isAlreadyPaid = extendedMedia?._ === 'messageExtendedMedia';\n const isNotPaid = extendedMedia?._ === 'messageExtendedMediaPreview';\n let innerMedia = isAlreadyPaid ?\n (extendedMedia.media as MessageMedia.messageMediaPhoto).photo as Photo.photo ||\n (extendedMedia.media as MessageMedia.messageMediaDocument).document as Document.document :\n messageMedia.photo;\n\n const wrappedPrice = paymentsWrapCurrencyAmount(messageMedia.total_amount, messageMedia.currency);\n let priceEl: HTMLElement;\n if(!extendedMedia) {\n priceEl = document.createElement(innerMedia ? 'span' : 'div');\n const f = document.createDocumentFragment();\n const l = i18n(messageMedia.receipt_msg_id ? 'PaymentReceipt' : (isTest ? 'PaymentTestInvoice' : 'PaymentInvoice'));\n l.classList.add('text-uppercase');\n const joiner = ' ' + NBSP;\n const p = document.createElement('span');\n p.classList.add('text-bold');\n p.textContent = wrappedPrice + joiner;\n f.append(p, l);\n if(isTest && messageMedia.receipt_msg_id) {\n const a = document.createElement('span');\n a.classList.add('text-uppercase', 'pre-wrap');\n a.append(joiner + '(Test)');\n f.append(a);\n }\n setInnerHTML(priceEl, f);\n } else if(isNotPaid) {\n priceEl = document.createElement('span');\n priceEl.classList.add('extended-media-buy', 'tgico-premium_lock');\n attachmentDiv.classList.add('is-buy');\n _i18n(priceEl, 'Checkout.PayPrice', [wrappedPrice]);\n\n if(extendedMedia.video_duration !== undefined) {\n const videoTime = document.createElement('span');\n videoTime.classList.add('video-time');\n videoTime.textContent = toHHMMSS(extendedMedia.video_duration, false);\n attachmentDiv.append(videoTime);\n }\n }\n\n if(isNotPaid) {\n (extendedMedia.thumb as PhotoSize.photoStrippedSize).w = extendedMedia.w;\n (extendedMedia.thumb as PhotoSize.photoStrippedSize).h = extendedMedia.h;\n innerMedia = {\n _: 'photo',\n access_hash: '',\n pFlags: {},\n date: 0,\n dc_id: 0,\n file_reference: [],\n id: 0,\n sizes: [extendedMedia.thumb]\n };\n }\n\n if(innerMedia) {\n const mediaSize = extendedMedia ? mediaSizes.active.extendedInvoice : mediaSizes.active.invoice;\n if(innerMedia._ === 'document') {\n wrapVideo({\n doc: innerMedia,\n container: attachmentDiv,\n withTail: false,\n isOut,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n loadPromises,\n boxWidth: mediaSize.width,\n boxHeight: mediaSize.height,\n group: this.chat.animationGroup,\n message: message as Message.message\n });\n bubble.classList.add('video');\n } else {\n wrapPhoto({\n photo: innerMedia,\n container: attachmentDiv,\n withTail: false,\n isOut,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n loadPromises,\n boxWidth: mediaSize.width,\n boxHeight: mediaSize.height,\n message: isAlreadyPaid ? message : undefined\n });\n bubble.classList.add('photo');\n }\n\n if(priceEl) {\n if(!extendedMedia) {\n priceEl.classList.add('video-time');\n }\n\n attachmentDiv.append(priceEl);\n }\n } else {\n attachmentDiv = undefined;\n }\n\n if(isNotPaid) {\n const {mid} = message;\n this.extendedMediaMessages.add(mid);\n middleware.onClean(() => {\n this.extendedMediaMessages.delete(mid);\n });\n this.setExtendedMediaMessagesPollInterval();\n\n const {width, height} = attachmentDiv.style;\n const dotRenderer = DotRenderer.create({\n width: parseInt(width),\n height: parseInt(height),\n middleware,\n animationGroup: this.chat.animationGroup\n });\n attachmentDiv.append(dotRenderer.canvas);\n }\n\n let titleDiv: HTMLElement;\n if(!extendedMedia) {\n titleDiv = document.createElement('div');\n titleDiv.classList.add('bubble-primary-color');\n setInnerHTML(titleDiv, wrapEmojiText(messageMedia.title));\n }\n\n const richText = isAlreadyPaid ? undefined : wrapEmojiText(messageMedia.description);\n messageDiv.prepend(...[titleDiv, !innerMedia && priceEl, richText].filter(Boolean));\n\n if(!richText) canHaveTail = false;\n else bubble.classList.remove('is-message-empty');\n bubble.classList.add('is-invoice');\n\n break;\n }\n\n default:\n attachmentDiv = undefined;\n bubble.classList.remove('is-message-empty');\n messageDiv.append(i18n(UNSUPPORTED_LANG_PACK_KEY), timeSpan);\n this.log.warn('unrecognized media type:', messageMedia._, message);\n break;\n }\n\n if(!processingWebPage && attachmentDiv) {\n bubbleContainer.append(attachmentDiv);\n }\n\n /* if(bubble.classList.contains('is-message-empty') && (bubble.classList.contains('photo') || bubble.classList.contains('video'))) {\n bubble.classList.add('no-tail');\n\n if(!bubble.classList.contains('with-media-tail')) {\n bubble.classList.add('use-border-radius');\n }\n } */\n }\n\n if(isStandaloneMedia) {\n bubble.classList.add('just-media');\n }\n\n if(viewButton) {\n timeSpan.before(viewButton);\n // messageDiv.append(viewButton);\n }\n\n let savedFrom = '';\n\n // const needName = ((peerId.isAnyChat() && (peerId !== message.fromId || our)) && message.fromId !== rootScope.myId) || message.viaBotId;\n const needName = (message.fromId !== rootScope.myId && this.chat.isAnyGroup) || message.viaBotId || (message as Message.message).pFlags.sponsored;\n if(needName || fwdFrom || message.reply_to_mid || topicNameButtonContainer) { // chat\n let title: HTMLElement | DocumentFragment;\n let titleVia: typeof title;\n\n const isForwardFromChannel = message.from_id?._ === 'peerChannel' && message.fromId === fwdFromId;\n\n const mustHaveName = !!(message.viaBotId/* || topicNameButtonContainer */);\n const isHidden = fwdFrom && !fwdFrom.from_id;\n if(message.viaBotId) {\n titleVia = document.createElement('span');\n titleVia.innerText = '@' + (await this.managers.appPeersManager.getPeerUsername(message.viaBotId));\n titleVia.classList.add('peer-title');\n }\n\n if(mustHaveName) {\n bubble.classList.add('must-have-name');\n }\n\n const isForward = fwdFromId || fwdFrom;\n if(isHidden) {\n // /////this.log('message to render hidden', message);\n title = document.createElement('span');\n setInnerHTML(title, wrapEmojiText(fwdFrom.from_name));\n title.classList.add('peer-title');\n // title = fwdFrom.from_name;\n bubble.classList.add('hidden-profile');\n } else {\n title = new PeerTitle({peerId: fwdFromId || message.fromId, withPremiumIcon: !isForward, wrapOptions}).element;\n }\n\n let replyContainer: HTMLElement;\n if(\n isMessage &&\n message.reply_to_mid &&\n message.reply_to_mid !== this.chat.threadId &&\n (!this.chat.isAllMessagesForum || message.reply_to.reply_to_top_id)\n ) {\n replyContainer = await MessageRender.setReply({\n chat: this.chat,\n bubble,\n bubbleContainer,\n message\n });\n }\n\n // this.log(title);\n\n let nameDiv: HTMLElement;\n if(isForward) {\n if(this.peerId !== rootScope.myId && !isForwardFromChannel) {\n bubble.classList.add('forwarded');\n }\n\n if(message.savedFrom) {\n savedFrom = message.savedFrom;\n title.dataset.savedFrom = savedFrom;\n }\n\n nameDiv = document.createElement('div');\n title.dataset.peerId = '' + fwdFromId;\n\n if((this.peerId === rootScope.myId || this.peerId === REPLIES_PEER_ID || isForwardFromChannel) && !isStandaloneMedia) {\n nameDiv.style.color = getPeerColorById(fwdFromId, false);\n nameDiv.classList.add('colored-name');\n nameDiv.append(title);\n } else {\n /* const fromTitle = message.fromId === this.myID || appPeersManager.isBroadcast(fwdFromId || message.fromId) ? '' : `
${appPeersManager.getPeerTitle(message.fromId)}
`;\n nameDiv.innerHTML = fromTitle + 'Forwarded from ' + title; */\n const args: FormatterArguments = [title];\n if(isStandaloneMedia) {\n const br = document.createElement('br');\n br.classList.add('hide-ol');\n args.unshift(br);\n }\n nameDiv.append(i18n('ForwardedFrom', [args]));\n }\n } else if(!message.viaBotId) {\n if(!isStandaloneMedia && needName) {\n nameDiv = document.createElement('div');\n nameDiv.append(title);\n\n const peer = await this.managers.appPeersManager.getPeer(message.fromId);\n const pFlags = (peer as User.user)?.pFlags;\n if(pFlags && (pFlags.scam || pFlags.fake)) {\n nameDiv.append(generateFakeIcon(pFlags.scam));\n }\n\n if(!our) {\n nameDiv.style.color = getPeerColorById(message.fromId, false);\n nameDiv.classList.add('colored-name');\n }\n\n nameDiv.dataset.peerId = '' + message.fromId;\n } else /* if(!message.reply_to_mid) */ {\n bubble.classList.add('hide-name');\n }\n }\n\n if(message.viaBotId) {\n if(!nameDiv) {\n nameDiv = document.createElement('div');\n } else {\n nameDiv.append(' ');\n }\n\n const span = document.createElement('span');\n span.append(i18n('ViaBot'), ' ', titleVia);\n span.classList.add('is-via');\n\n nameDiv.append(span);\n }\n\n if(topicNameButtonContainer) {\n if(isStandaloneMedia) {\n topicNameButtonContainer.classList.add('floating-part');\n } else {\n if(!nameDiv) {\n nameDiv = document.createElement('div');\n }\n\n nameDiv.append(topicNameButtonContainer);\n\n bubble.classList.remove('hide-name');\n }\n }\n\n if(nameDiv) {\n nameDiv.classList.add('name');\n\n if(isStandaloneMedia) {\n nameContainer.append(nameContainer = document.createElement('div'));\n nameContainer.classList.add('name-with-reply', 'floating-part');\n } else {\n nameDiv.classList.add('floating-part');\n }\n\n nameContainer.append(nameDiv);\n\n if(isStandaloneMedia && replyContainer) {\n nameContainer.append(replyContainer);\n }\n } else if(isStandaloneMedia && replyContainer) {\n replyContainer.classList.add('floating-part');\n }\n\n if(topicNameButtonContainer && isStandaloneMedia) {\n if(!attachmentDiv) {\n this.log.error('no attachment div?', bubble, message);\n debugger;\n } else {\n attachmentDiv.after(topicNameButtonContainer);\n }\n }\n } else {\n bubble.classList.add('hide-name');\n }\n\n if(this.chat.type === 'pinned') {\n savedFrom = `${this.chat.peerId}_${message.mid}`;\n }\n\n const isThreadStarter = messageWithReplies && messageWithReplies.mid === this.chat.threadId;\n if(isThreadStarter) {\n bubble.classList.add('is-thread-starter', 'is-group-last');\n }\n\n if(savedFrom && (this.chat.type === 'pinned' || fwdFrom.saved_from_msg_id) && this.peerId !== REPLIES_PEER_ID) {\n const goto = document.createElement('div');\n goto.classList.add('bubble-beside-button', 'goto-original', 'tgico-arrow_next');\n bubbleContainer.append(goto);\n bubble.dataset.savedFrom = savedFrom;\n bubble.classList.add('with-beside-button');\n }\n\n bubble.classList.add(isOut ? 'is-out' : 'is-in');\n\n if(withReplies) {\n const isFooter = MessageRender.renderReplies({\n bubble,\n bubbleContainer,\n message: messageWithReplies,\n messageDiv,\n loadPromises,\n lazyLoadQueue: this.lazyLoadQueue\n });\n\n if(isFooter) {\n canHaveTail = true;\n } else {\n bubble.classList.add('with-beside-replies');\n }\n }\n\n if(isMessage) {\n this.appendReactionsElementToBubble(bubble, message, reactionsMessage);\n }\n\n /* if(isMessage) {\n const reactionHover = document.createElement('div');\n reactionHover.classList.add('bubble-reaction-hover');\n contentWrapper.append(reactionHover);\n } */\n\n if(canHaveTail) {\n bubble.classList.add('can-have-tail');\n\n bubbleContainer.append(generateTail());\n }\n\n return ret;\n }\n\n private appendReactionsElementToBubble(\n bubble: HTMLElement,\n message: Message.message,\n reactionsMessage: Message.message,\n changedResults?: ReactionCount[]\n ) {\n if(this.peerId.isUser() && USER_REACTIONS_INLINE/* || true */) {\n return;\n }\n\n if(!reactionsMessage?.reactions || !reactionsMessage.reactions.results.length) {\n return;\n }\n\n // message = this.appMessagesManager.getMessageWithReactions(message);\n\n const reactionsElement = new ReactionsElement();\n reactionsElement.init(reactionsMessage, 'block', bubble.middlewareHelper.get());\n reactionsElement.render(changedResults);\n\n if(bubble.classList.contains('is-message-empty')) {\n bubble.querySelector('.bubble-content-wrapper').append(reactionsElement);\n } else {\n const messageDiv = bubble.querySelector('.message');\n if(bubble.classList.contains('is-multiple-documents')) {\n const documentContainer = messageDiv.lastElementChild as HTMLElement;\n let documentMessageDiv = documentContainer.querySelector('.document-message');\n\n let timeSpan: HTMLElement = documentMessageDiv && documentMessageDiv.querySelector('.time');\n if(!timeSpan) {\n timeSpan = MessageRender.setTime({\n chatType: this.chat.type,\n message,\n reactionsMessage\n });\n }\n\n reactionsElement.append(timeSpan);\n\n if(!documentMessageDiv) {\n documentMessageDiv = document.createElement('div');\n documentMessageDiv.classList.add('document-message');\n documentContainer.querySelector('.document-wrapper').prepend(documentMessageDiv);\n }\n\n documentMessageDiv.append(reactionsElement);\n } else {\n const timeSpan = Array.from(bubble.querySelectorAll('.time')).pop();\n reactionsElement.append(timeSpan);\n\n messageDiv.append(reactionsElement);\n }\n }\n }\n\n private prepareToSaveScroll(reverse?: boolean) {\n const isMounted = !!this.chatInner.parentElement;\n if(!isMounted) {\n return {};\n }\n\n const log = this.log.bindPrefix('prepareToSaveScroll');\n log('save');\n const scrollSaver = this.createScrollSaver(reverse);\n scrollSaver.save(); // * let's save scroll position by point before the slicing, not after\n\n if(this.getRenderedLength() && !this.chat.setPeerPromise) {\n const viewportSlice = this.getViewportSlice();\n this.deleteViewportSlice(viewportSlice, true);\n }\n\n // scrollSaver.save(); // ! slicing will corrupt scroll position\n // const saved = scrollSaver.getSaved();\n // const hadScroll = saved.scrollHeight !== saved.clientHeight;\n\n return {\n restoreScroll: () => {\n log('restore');\n // scrollSaver.restore(_history.length === 1 && !reverse ? false : true);\n scrollSaver.restore(reverse);\n this.onRenderScrollSet(scrollSaver.getSaved());\n },\n scrollSaver\n };\n }\n\n public async performHistoryResult(\n historyResult: HistoryResult | {history: (Message.message | Message.messageService | number)[]},\n reverse: boolean\n ) {\n const log = false ? this.log.bindPrefix('perform-' + (Math.random() * 1000 | 0)) : undefined;\n log?.('start', this.chatInner.parentElement);\n\n let history = historyResult.history;\n history = history.slice(); // need\n\n if(this.needReflowScroll) {\n reflowScrollableElement(this.scrollable.container);\n this.needReflowScroll = false;\n }\n\n const cb = (message: Message.message | Message.messageService) => {\n if(!message) {\n return;\n } else if(message.pFlags.local) {\n return this.processLocalMessageRender(message);\n } else {\n return this.safeRenderMessage(message, reverse);\n }\n };\n\n const messages = await Promise.all(history.map((mid) => {\n return typeof(mid) === 'number' ? this.chat.getMessage(mid) : mid;\n }));\n\n const setLoadedPromises: Promise[] = [];\n if(!this.scrollable.loadedAll['bottom'] || !this.scrollable.loadedAll['top']) {\n let isEnd = (historyResult as HistoryResult).isEnd;\n if(!isEnd) {\n const historyStorage = await this.chat.getHistoryStorage();\n const firstSlice = historyStorage.history.first;\n const lastSlice = historyStorage.history.last;\n isEnd = {top: false, bottom: false, both: false};\n if(firstSlice.isEnd(SliceEnd.Bottom) && (!firstSlice.length || history.includes(firstSlice[0]))) {\n isEnd.bottom = true;\n }\n\n if(lastSlice.isEnd(SliceEnd.Top) && (!lastSlice.length || history.includes(lastSlice[lastSlice.length - 1]))) {\n isEnd.top = true;\n }\n }\n\n if(!isEnd.bottom && this.setPeerOptions) {\n const {lastMsgId, topMessage, savedPosition} = this.setPeerOptions;\n this.setPeerOptions = undefined;\n if((!lastMsgId && !savedPosition) || this.bubbles[topMessage] || lastMsgId === topMessage) {\n isEnd.bottom = true;\n }\n }\n\n if(isEnd.top) setLoadedPromises.push(this.setLoaded('top', true));\n if(isEnd.bottom) setLoadedPromises.push(this.setLoaded('bottom', true));\n }\n\n await Promise.all(setLoadedPromises);\n\n // ! it is important to insert bubbles to group reversed way\n // const length = history.length, promises: Promise[] = [];\n // if(reverse) for(let i = 0; i < length; ++i) promises.push(cb(messages[i]));\n // else for(let i = length - 1; i >= 0; --i) promises.push(cb(messages[i]));\n const promises = messages.map(cb);\n\n // cannot combine them into one promise\n await Promise.all(promises);\n await this.messagesQueuePromise;\n\n if(this.scrollable.loadedAll.top && this.messagesQueueOnRenderAdditional) {\n this.messagesQueueOnRenderAdditional();\n this.messagesQueueOnRenderAdditional?.(); // * can set it second time\n }\n\n log?.('performHistoryResult end');\n }\n\n private onRenderScrollSet(state?: {scrollHeight: number, clientHeight: number}) {\n const className = 'has-sticky-dates';\n if(!this.container.classList.contains(className)) {\n const isLoading = !this.preloader.detached;\n\n if(isLoading ||\n (\n state ??= {\n scrollHeight: this.scrollable.scrollHeight,\n clientHeight: this.scrollable.container.clientHeight\n },\n state.scrollHeight !== state.clientHeight\n )\n ) {\n /* for(const timestamp in this.dateMessages) {\n const dateMessage = this.dateMessages[timestamp];\n dateMessage.div.classList.add('is-sticky');\n } */\n\n const middleware = this.getMiddleware();\n const callback = () => {\n if(!middleware()) return;\n this.container.classList.add(className);\n };\n\n if(this.willScrollOnLoad) {\n callback();\n } else {\n setTimeout(callback, 600);\n }\n\n return;\n }\n }\n\n this.willScrollOnLoad = undefined;\n }\n\n public onDatePick = (timestamp: number) => {\n const peerId = this.peerId;\n this.managers.appMessagesManager.requestHistory(peerId, 0, 2, -1, timestamp, this.chat.threadId).then((history) => {\n if(!history?.messages?.length) {\n this.log.error('no history!');\n return;\n } else if(this.peerId !== peerId) {\n return;\n }\n\n this.chat.setMessageId((history.messages[0] as MyMessage).mid);\n // console.log('got history date:', history);\n });\n };\n\n public requestHistory(maxId: number, loadCount: number, backLimit: number) {\n // const middleware = this.getMiddleware();\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\n return this.managers.acknowledged.appMessagesManager.getHistory(this.peerId, maxId, loadCount, backLimit, this.chat.threadId);\n } else if(this.chat.type === 'pinned') {\n return this.managers.acknowledged.appMessagesManager.getSearch({\n peerId: this.peerId,\n inputFilter: {_: 'inputMessagesFilterPinned'},\n maxId,\n limit: loadCount,\n backLimit\n }).then((ackedResult) => {\n return {\n cached: ackedResult.cached,\n result: Promise.resolve(ackedResult.result).then((value) => {\n return {history: value.history.map((m) => m.mid)};\n })\n };\n });\n } else if(this.chat.type === 'scheduled') {\n return this.managers.acknowledged.appMessagesManager.getScheduledMessages(this.peerId).then((ackedResult) => {\n // this.setLoaded('top', true);\n // this.setLoaded('bottom', true);\n return {\n cached: ackedResult.cached,\n result: Promise.resolve(ackedResult.result).then((mids) => ({history: mids.slice().reverse()}))\n };\n });\n }\n }\n\n private async animateAsLadder(additionMsgId: number, additionMsgIds: number[], isAdditionRender: boolean, backLimit: number, maxId: number) {\n /* const middleware = this.getMiddleware();\n await this.ladderDeferred; */\n\n const log = this.log.bindPrefix('ladder');\n if(this.chat.setPeerPromise && !this.resolveLadderAnimation) {\n log.warn('will be delayed');\n // @ts-ignore\n this.resolveLadderAnimation = this.animateAsLadder.bind(this, additionMsgId, additionMsgIds, isAdditionRender, backLimit, maxId);\n return;\n }\n\n /* if(!middleware()) {\n return;\n } */\n\n if(!Object.keys(this.bubbles).length) {\n log.warn('no bubbles');\n return;\n }\n\n let sortedMids = getObjectKeysAndSort(this.bubbles, 'desc');\n\n if(isAdditionRender && additionMsgIds.length) {\n sortedMids = sortedMids.filter((mid) => !additionMsgIds.includes(mid));\n }\n\n let targetMid: number;\n if(backLimit) {\n targetMid = maxId || Math.max(...sortedMids); // * on discussion enter\n } else {\n if(additionMsgId) {\n targetMid = additionMsgId;\n } else { // * if maxId === 0\n targetMid = Math.max(...sortedMids);\n }\n }\n\n const topIds = sortedMids.slice(sortedMids.findIndex((mid) => targetMid > mid));\n const middleIds = isAdditionRender ? [] : [targetMid];\n const bottomIds = isAdditionRender ? [] : sortedMids.slice(0, sortedMids.findIndex((mid) => targetMid >= mid)).reverse();\n\n if(DEBUG) {\n log('targeting mid:', targetMid, maxId, additionMsgId,\n topIds.map((m) => getServerMessageId(m)),\n bottomIds.map((m) => getServerMessageId(m)));\n }\n\n const setBubbles: HTMLElement[] = [];\n\n this.chatInner.classList.add('zoom-fading');\n const delay = isAdditionRender ? 10 : 40;\n const offsetIndex = isAdditionRender ? 0 : 1;\n const animateAsLadder = (mids: number[], offsetIndex = 0) => {\n const animationPromise = deferredPromise();\n let lastMsDelay = 0;\n mids.forEach((mid, idx) => {\n const bubble = this.bubbles[mid];\n if(!bubble || this.skippedMids.has(mid)) {\n log.warn('no bubble by mid:', mid);\n return;\n }\n\n lastMsDelay = ((idx + offsetIndex) || 0.1) * delay;\n // lastMsDelay = (idx + offsetIndex) * delay;\n // lastMsDelay = (idx || 0.1) * 1000;\n\n const contentWrapper = bubble.lastElementChild as HTMLElement;\n const elementsToAnimate: HTMLElement[] = [contentWrapper];\n const item = this.bubbleGroups.getItemByBubble(bubble);\n if(item && item.group.avatar && item.group.lastItem === item) {\n elementsToAnimate.push(item.group.avatar);\n }\n\n elementsToAnimate.forEach((element) => {\n element.classList.add('zoom-fade', 'can-zoom-fade');\n element.style.transitionDelay = lastMsDelay + 'ms';\n });\n\n if(idx === (mids.length - 1)) {\n const onTransitionEnd = (e: TransitionEvent) => {\n if(e.target !== contentWrapper) {\n return;\n }\n\n animationPromise.resolve();\n contentWrapper.removeEventListener('transitionend', onTransitionEnd);\n };\n\n contentWrapper.addEventListener('transitionend', onTransitionEnd);\n }\n\n setBubbles.push(...elementsToAnimate);\n });\n\n if(!mids.length) {\n animationPromise.resolve();\n }\n\n return {lastMsDelay, animationPromise};\n };\n\n const topRes = animateAsLadder(topIds, offsetIndex);\n const middleRes = animateAsLadder(middleIds);\n const bottomRes = animateAsLadder(bottomIds, offsetIndex);\n const promises = [topRes.animationPromise, middleRes.animationPromise, bottomRes.animationPromise];\n const delays: number[] = [topRes.lastMsDelay, middleRes.lastMsDelay, bottomRes.lastMsDelay];\n\n if(this.onAnimateLadder) {\n await this.onAnimateLadder();\n }\n\n fastRaf(() => {\n this.setStickyDateManually(); // ! maybe it's not efficient\n\n setBubbles.forEach((element) => {\n element.classList.remove('zoom-fade');\n });\n });\n\n let promise: Promise;\n if(topIds.length || middleIds.length || bottomIds.length) {\n promise = Promise.all(promises);\n\n dispatchHeavyAnimationEvent(promise, Math.max(...delays) + 200) // * 200 - transition time\n .then(() => {\n fastRaf(() => {\n setBubbles.forEach((element) => {\n element.style.transitionDelay = '';\n element.classList.remove('can-zoom-fade');\n });\n\n this.chatInner.classList.remove('zoom-fading');\n });\n\n // ! ะฒ ั…ั€ะพะผะต, ะบะฐะบะธะผ-ั‚ะพ ะพะฑั€ะฐะทะพะผ ะธะท-ะทะฐ zoom-fade ะบะปะฐััะฐ ะฝะฐั‡ะธะฝะฐะตั‚ ะฟั€ั‹ะณะฐั‚ัŒ ัะบั€ะพะปะป ะฟั€ะธ ะฟะพะดะณั€ัƒะทะบะต ัะพะพะฑั‰ะตะฝะธะน ะฒะฒะตั€ั…,\n // ! ั‚.ะต. ัะบั€ะพะปะป ะฝะต ัั‚ะฐะฒะธั‚ัั, ั‚ะฐะบ ะถะต, ะบะฐะบ ะฒ ัะฐั„ะฐั€ะธ ะฟั€ะธ translateZ ะฝะฐ ะฑะปะพะบ ะฒั‹ัˆะต scrollable\n // if(!IS_SAFARI) {\n // this.needReflowScroll = true;\n // }\n });\n }\n\n return promise;\n }\n\n private async renderEmptyPlaceholder(\n type: 'group' | 'saved' | 'noMessages' | 'noScheduledMessages' | 'greeting' | 'restricted',\n bubble: HTMLElement,\n message: any,\n elements: (Node | string)[]\n ) {\n const BASE_CLASS = 'empty-bubble-placeholder';\n bubble.classList.add(BASE_CLASS, BASE_CLASS + '-' + type);\n\n let title: HTMLElement;\n if(type === 'group') title = i18n('GroupEmptyTitle1');\n else if(type === 'saved') title = i18n('ChatYourSelfTitle');\n else if(type === 'noMessages' || type === 'greeting') title = i18n('NoMessages');\n else if(type === 'noScheduledMessages') title = i18n('NoScheduledMessages');\n else if(type === 'restricted') {\n title = document.createElement('span');\n title.innerText = await this.managers.appPeersManager.getRestrictionReasonText(this.peerId);\n }\n title.classList.add('center', BASE_CLASS + '-title');\n\n elements.push(title);\n\n let listElements: HTMLElement[];\n if(type === 'group') {\n elements.push(i18n('GroupEmptyTitle2'));\n listElements = [\n i18n('GroupDescription1'),\n i18n('GroupDescription2'),\n i18n('GroupDescription3'),\n i18n('GroupDescription4')\n ];\n } else if(type === 'saved') {\n listElements = [\n i18n('ChatYourSelfDescription1'),\n i18n('ChatYourSelfDescription2'),\n i18n('ChatYourSelfDescription3'),\n i18n('ChatYourSelfDescription4')\n ];\n } else if(type === 'greeting') {\n const subtitle = i18n('NoMessagesGreetingsDescription');\n subtitle.classList.add('center', BASE_CLASS + '-subtitle');\n\n // findAndSplice(this.messagesQueue, q => q.bubble === bubble);\n\n const stickerDiv = document.createElement('div');\n stickerDiv.classList.add(BASE_CLASS + '-sticker');\n\n const middleware = this.getMiddleware();\n\n await this.managers.appStickersManager.getGreetingSticker().then(async(doc) => {\n if(!middleware()) return;\n\n const loadPromises: Promise[] = [];\n await wrapSticker({\n doc,\n // doc: appDocsManager.getDoc(\"5431607541660389336\"), // cubigator mockup\n div: stickerDiv,\n middleware,\n lazyLoadQueue: this.lazyLoadQueue,\n group: this.chat.animationGroup,\n // play: !!message.pending || !multipleRender,\n play: true,\n loop: true,\n withThumb: true,\n loadPromises\n });\n\n attachClickEvent(stickerDiv, (e) => {\n cancelEvent(e);\n EmoticonsDropdown.onMediaClick({target: e.target});\n });\n\n return Promise.all(loadPromises);\n });\n\n // this.renderMessagesQueue({\n // message,\n // bubble,\n // reverse: false,\n // promises: [loadPromise]\n // });\n\n elements.push(subtitle, stickerDiv);\n }\n\n if(listElements) {\n elements.push(\n ...listElements.map((elem) => {\n const span = document.createElement('span');\n span.classList.add(BASE_CLASS + '-list-item');\n span.append(elem);\n return span;\n })\n );\n\n if(type === 'group') {\n listElements.forEach((elem) => {\n const i = document.createElement('span');\n i.classList.add('tgico-check');\n elem.prepend(i);\n });\n } else if(type === 'saved') {\n listElements.forEach((elem) => {\n const i = document.createElement('span');\n i.classList.add(BASE_CLASS + '-list-bullet');\n i.innerText = 'โ€ข';\n elem.prepend(i);\n });\n }\n }\n\n if(elements.length > 1) {\n bubble.classList.add('has-description');\n }\n\n elements.forEach((element: any) => element.classList.add(BASE_CLASS + '-line'));\n }\n\n private async processLocalMessageRender(\n message: Message.message | Message.messageService,\n animate?: boolean,\n middleware = this.getMiddleware()\n ) {\n const isSponsored = !!(message as Message.message).pFlags.sponsored;\n const m = middlewarePromise(middleware);\n\n const p: Parameters[4] = async(result) => {\n const {bubble} = await m(result);\n if(!bubble) {\n return result;\n }\n\n (bubble as any).message = message;\n\n bubble.classList.add('is-group-last', 'is-group-first');\n\n const updatePosition = () => {\n if(this.updatePlaceholderPosition === updatePosition) {\n this.updatePlaceholderPosition = undefined;\n }\n\n appendTo[method](bubble);\n };\n\n if(!isSponsored) {\n bubble.classList.add('bubble-first');\n bubble.classList.remove('can-have-tail', 'is-in');\n }\n\n const elements: (Node | string)[] = [];\n const isBot = this.chat.isBot;\n let renderPromise: Promise, appendTo = this.container, method: 'append' | 'prepend' = 'append';\n if(this.chat.isRestricted) {\n renderPromise = this.renderEmptyPlaceholder('restricted', bubble, message, elements);\n } else if(isSponsored) {\n let text: LangPackKey, mid: number, startParam: string, callback: () => void;\n\n bubble.classList.add('avoid-selection');\n bubble.style.order = '999999';\n\n const sponsoredMessage = this.sponsoredMessage = (message as Message.message).sponsoredMessage;\n const peerId = getPeerId(sponsoredMessage.from_id);\n // const peer = this.appPeersManager.getPeer(peerId);\n if(sponsoredMessage.channel_post) {\n text = 'OpenChannelPost';\n mid = generateMessageId(sponsoredMessage.channel_post);\n } else if(sponsoredMessage.start_param || isBot) {\n text = 'Chat.Message.ViewBot';\n startParam = sponsoredMessage.start_param;\n } else {\n text = await this.managers.appPeersManager.isAnyGroup(peerId) ? 'Chat.Message.ViewGroup' : 'Chat.Message.ViewChannel';\n }\n\n if(sponsoredMessage.chat_invite) {\n callback = () => {\n new PopupJoinChatInvite(sponsoredMessage.chat_invite_hash, sponsoredMessage.chat_invite as ChatInvite.chatInvite);\n };\n } else if(sponsoredMessage.chat_invite_hash) {\n callback = () => {\n const link: InternalLink = {\n _: INTERNAL_LINK_TYPE.JOIN_CHAT,\n invite: sponsoredMessage.chat_invite_hash\n };\n\n this.chat.appImManager.processInternalLink(link);\n };\n } else {\n callback = () => {\n this.chat.appImManager.setInnerPeer({\n peerId,\n lastMsgId: mid,\n startParam\n });\n };\n }\n\n const button = this.makeViewButton({text});\n\n this.observer.observe(button, this.viewsObserverCallback);\n\n if(callback) {\n attachClickEvent(button, callback);\n }\n\n bubble.querySelector('.bubble-content').prepend(button);\n\n appendTo = this.chatInner;\n method = 'append';\n animate = false;\n\n // return result;\n } else if(isBot && message._ === 'message') {\n const b = document.createElement('b');\n b.append(i18n('BotInfoTitle'));\n elements.push(b, '\\n\\n');\n appendTo = this.chatInner;\n method = 'prepend';\n } else if(this.chat.isAnyGroup && ((await m(this.managers.appPeersManager.getPeer(this.peerId))) as MTChat.chat).pFlags.creator) {\n renderPromise = this.renderEmptyPlaceholder('group', bubble, message, elements);\n } else if(this.chat.type === 'scheduled') {\n renderPromise = this.renderEmptyPlaceholder('noScheduledMessages', bubble, message, elements);\n } else if(rootScope.myId === this.peerId) {\n renderPromise = this.renderEmptyPlaceholder('saved', bubble, message, elements);\n } else if(this.peerId.isUser() && !isBot && await m(this.chat.canSend()) && this.chat.type === 'chat') {\n renderPromise = this.renderEmptyPlaceholder('greeting', bubble, message, elements);\n } else {\n renderPromise = this.renderEmptyPlaceholder('noMessages', bubble, message, elements);\n }\n\n if(renderPromise) {\n await renderPromise;\n }\n\n if(elements.length) {\n const messageDiv = bubble.querySelector('.message, .service-msg');\n messageDiv.prepend(...elements);\n }\n\n const isWaitingForAnimation = !!this.messagesQueueOnRenderAdditional;\n const noTransition = this.setPeerCached && !isWaitingForAnimation;\n if(noTransition) {\n const setOn = bubble.firstElementChild;\n setOn.classList.add('no-transition');\n\n if(this.chat.setPeerPromise) {\n this.chat.setPeerPromise.catch(noop).finally(() => {\n setOn.classList.remove('no-transition');\n });\n }\n }\n\n if(animate === undefined && !noTransition) {\n animate = true;\n }\n\n if(isWaitingForAnimation || animate) {\n this.updatePlaceholderPosition = updatePosition;\n\n this.onAnimateLadder = () => {\n // appendTo[method](bubble);\n this.onAnimateLadder = undefined;\n\n // need raf here because animation won't fire if this message is single\n if(!this.messagesQueuePromise) {\n return fastRafPromise();\n }\n };\n } else if(this.chat.setPeerPromise) {\n this.attachPlaceholderOnRender = () => {\n this.attachPlaceholderOnRender = undefined;\n updatePosition();\n // appendTo[method](bubble);\n };\n } else {\n this.updatePlaceholderPosition = updatePosition;\n // appendTo[method](bubble);\n }\n\n if(!isWaitingForAnimation && animate) {\n await m(getHeavyAnimationPromise());\n const additionMsgIds = getObjectKeysAndSort(this.bubbles);\n indexOfAndSplice(additionMsgIds, message.mid);\n this.animateAsLadder(message.mid, additionMsgIds, false, 0, 0);\n }\n\n bubble.middlewareHelper.onDestroy(() => {\n if(this.emptyPlaceholderBubble === bubble) {\n this.emptyPlaceholderBubble = undefined;\n }\n });\n\n this.emptyPlaceholderBubble = bubble;\n\n return result;\n };\n\n return this.safeRenderMessage(\n message,\n !isSponsored,\n undefined,\n false,\n p\n );\n }\n\n private makeViewButton[1]>(options: T) {\n return Button('btn-primary btn-primary-transparent bubble-view-button', options);\n }\n\n private generateLocalMessageId(addOffset = 0) {\n // const INCREMENT = 0x10;\n const offset = (this.chat.type === 'scheduled' ? -1 : 0) + addOffset;\n // offset = generateMessageId(offset);\n // id: -Math.abs(+this.peerId * INCREMENT + offset),\n const id = -Math.abs(offset);\n const mid = -Math.abs(generateMessageId(id));\n return {id, mid};\n }\n\n private async generateLocalFirstMessage(service?: T, fill?: (message: GenerateLocalMessageType) => void, addOffset = 0): Promise> {\n const {id, mid} = this.generateLocalMessageId(addOffset);\n let message: Omit & {message?: string} = {\n _: service ? 'messageService' : 'message',\n date: 0,\n id,\n mid,\n peer_id: await this.managers.appPeersManager.getOutputPeer(this.peerId),\n pFlags: {\n local: true\n }\n };\n\n if(!service) {\n message.message = '';\n }/* else {\n (message as Message.messageService).action = {} as any;\n } */\n\n assumeType>(message);\n\n fill && fill(message);\n\n const savedMessages = await this.managers.appMessagesManager.saveMessages([message], {storage: new Map() as any});\n message = savedMessages[0];\n message.mid = mid;\n return message as any;\n }\n\n public getViewportSlice() {\n // this.log.trace('viewport slice');\n return getViewportSlice({\n overflowElement: this.scrollable.container,\n selector: '.bubbles-date-group .bubble:not(.is-date)',\n extraSize: Math.max(700, windowSize.height) * 2\n });\n }\n\n public deleteViewportSlice(slice: ReturnType, ignoreScrollSaving?: boolean) {\n if(DO_NOT_SLICE_VIEWPORT_ON_RENDER) {\n return;\n }\n\n const {invisibleTop, invisibleBottom} = slice;\n const invisible = invisibleTop.concat(invisibleBottom);\n if(!invisible.length) {\n return;\n }\n\n if(invisibleTop.length) {\n this.setLoaded('top', false);\n this.getHistoryTopPromise = undefined;\n }\n\n if(invisibleBottom.length) {\n this.setLoaded('bottom', false);\n this.getHistoryBottomPromise = undefined;\n }\n\n const mids = invisible.map(({element}) => +element.dataset.mid);\n\n let scrollSaver: ScrollSaver;\n if(/* !!invisibleTop.length !== !!invisibleBottom.length && */!ignoreScrollSaving) {\n scrollSaver = this.createScrollSaver(!!invisibleTop.length);\n scrollSaver.save();\n }\n\n this.deleteMessagesByIds(mids, false, true);\n\n if(scrollSaver) {\n scrollSaver.restore();\n } else if(invisibleTop.length) {\n this.scrollable.lastScrollPosition = this.scrollable.scrollTop;\n }\n }\n\n public sliceViewport(ignoreHeavyAnimation?: boolean) {\n // Safari cannot reset the scroll.\n if(IS_SAFARI || (this.isHeavyAnimationInProgress && !ignoreHeavyAnimation) || DO_NOT_SLICE_VIEWPORT) {\n return;\n }\n\n // const scrollSaver = new ScrollSaver(this.scrollable, true);\n // scrollSaver.save();\n const slice = this.getViewportSlice();\n // if(IS_SAFARI) slice.invisibleTop = [];\n this.deleteViewportSlice(slice);\n // scrollSaver.restore();\n }\n\n private async setLoaded(side: SliceSides, value: boolean, checkPlaceholders = true) {\n const willChange = this.scrollable.loadedAll[side] !== value;\n if(!willChange) {\n return;\n }\n\n const log = this.log.bindPrefix('setLoaded');\n log('change', side, value);\n\n this.scrollable.loadedAll[side] = value;\n this.scrollable.onScroll(); // ! WARNING\n // return;\n\n if(!checkPlaceholders) {\n return;\n }\n\n if(!this.chat.isRestricted) {\n if(side === 'bottom' && this.chat.isBroadcast/* && false */) {\n this.toggleSponsoredMessage(value);\n }\n\n if(side === 'top' && value && this.chat.isBot) {\n return this.renderBotPlaceholder();\n }\n }\n\n return this.checkIfEmptyPlaceholderNeeded();\n }\n\n private async toggleSponsoredMessage(value: boolean) {\n const log = this.log.bindPrefix('sponsored');\n log('checking');\n const {mid} = this.generateLocalMessageId(SPONSORED_MESSAGE_ID_OFFSET);\n if(value) {\n const middleware = this.getMiddleware(() => {\n return this.scrollable.loadedAll.bottom && this.getSponsoredMessagePromise === promise;\n });\n\n const promise = this.getSponsoredMessagePromise = this.managers.appChatsManager.getSponsoredMessage(this.peerId.toChatId())\n .then(async(sponsoredMessages) => {\n if(!middleware() || sponsoredMessages._ === 'messages.sponsoredMessagesEmpty') {\n return;\n }\n\n const sponsoredMessage = sponsoredMessages.messages[0];\n if(!sponsoredMessage) {\n log('no message');\n return;\n }\n\n const messagePromise = this.generateLocalFirstMessage(false, (message) => {\n message.message = sponsoredMessage.message;\n message.from_id = sponsoredMessage.from_id;\n message.entities = sponsoredMessage.entities;\n message.pFlags.sponsored = true;\n message.sponsoredMessage = sponsoredMessage;\n }, SPONSORED_MESSAGE_ID_OFFSET);\n\n return Promise.all([\n messagePromise,\n this.getHistoryTopPromise, // wait for top load and execute rendering after or with it\n this.messagesQueuePromise\n ]).then(([message]) => {\n if(!middleware()) return;\n // this.processLocalMessageRender(message);\n log('rendering', message);\n return this.performHistoryResult({history: [message]}, false);\n });\n }).finally(() => {\n if(this.getSponsoredMessagePromise === promise) {\n this.getSponsoredMessagePromise = undefined;\n }\n });\n } else {\n log('clearing rendered', mid);\n this.getSponsoredMessagePromise = undefined;\n this.deleteMessagesByIds([mid]);\n }\n }\n\n private async renderBotPlaceholder() {\n const _log = this.log.bindPrefix('bot placeholder');\n\n const middleware = this.getMiddleware();\n const result = await this.managers.acknowledged.appProfileManager.getProfile(this.peerId.toUserId());\n _log('getting profile, cached:', result.cached);\n const processPromise = result.result.then(async(userFull) => {\n if(!middleware()) {\n return;\n }\n\n if(!userFull.bot_info?.description) {\n _log.warn('no description');\n return this.checkIfEmptyPlaceholderNeeded();\n }\n\n const message = await this.generateLocalFirstMessage(false, (message) => {\n const botInfo = userFull.bot_info;\n message.message = botInfo.description;\n if(botInfo.description_document) message.media = {_: 'messageMediaDocument', document: botInfo.description_document, pFlags: {}};\n if(botInfo.description_photo) message.media = {_: 'messageMediaPhoto', photo: botInfo.description_photo, pFlags: {}};\n });\n\n if(!middleware()) {\n return;\n }\n\n _log('rendering');\n const renderPromise = this.processLocalMessageRender(message, !result.cached).then(() => {\n _log('done');\n });\n\n return {renderPromise};\n });\n\n if(!result.cached) {\n return;\n }\n\n return processPromise;\n }\n\n public async checkIfEmptyPlaceholderNeeded() {\n if(this.scrollable.loadedAll.top &&\n this.scrollable.loadedAll.bottom &&\n this.emptyPlaceholderBubble === undefined &&\n (\n this.chat.isRestricted ||\n !(await this.chat.getHistoryStorage()).count ||\n (\n // !Object.keys(this.bubbles).length ||\n // ! WARNING ! ! ! ! ! ! REPLACE LINE ABOVE WITH THESE\n Object.keys(this.bubbles).length &&\n !this.getRenderedLength()\n ) ||\n (this.chat.type === 'scheduled' && !Object.keys(this.bubbles).length)\n )\n ) {\n this.log('inject empty peer placeholder');\n\n const message = await this.generateLocalFirstMessage(true);\n return {renderPromise: this.processLocalMessageRender(message)};\n }\n }\n\n public getHistory1(maxId?: number, reverse?: boolean, isBackLimit?: boolean, additionMsgId?: number, justLoad?: boolean) {\n const middleware = this.getMiddleware(justLoad ? undefined : () => {\n return (reverse ? this.getHistoryTopPromise : this.getHistoryBottomPromise) === waitPromise;\n });\n\n const result = this.getHistory(maxId, reverse, isBackLimit, additionMsgId, justLoad, middleware);\n const waitPromise = result.then((res) => res && (res.waitPromise || res.promise));\n\n (reverse ? this.getHistoryTopPromise = waitPromise : this.getHistoryBottomPromise = waitPromise);\n waitPromise.then(() => {\n if(!middleware()) {\n return;\n }\n\n (reverse ? this.getHistoryTopPromise = undefined : this.getHistoryBottomPromise = undefined);\n\n if(!justLoad) {\n // preload more\n // if(!isFirstMessageRender) {\n if(this.chat.type === 'chat'/* || this.chat.type === 'discussion' */) {\n /* const storage = this.appMessagesManager.getHistoryStorage(peerId, this.chat.threadId);\n const isMaxIdInHistory = storage.history.indexOf(maxId) !== -1;\n if(isMaxIdInHistory || true) { // * otherwise it is a search or jump */\n setTimeout(() => {\n if(reverse) {\n this.loadMoreHistory(true, true);\n } else {\n this.loadMoreHistory(false, true);\n }\n }, 0);\n // }\n }\n // }\n\n // this.scrollable.onScroll();\n }\n });\n\n return result;\n }\n\n /**\n * Load and render history\n * @param maxId max message id\n * @param reverse 'true' means up\n * @param isBackLimit is search\n * @param additionMsgId for the last message\n * @param justLoad do not render\n */\n public async getHistory(\n maxId = 0,\n reverse = false,\n isBackLimit = false,\n additionMsgId = 0,\n justLoad = false,\n middleware?: () => boolean\n ): Promise<{cached: boolean, promise: Promise, waitPromise: Promise}> {\n const peerId = this.peerId;\n\n const isBroadcast = this.chat.isBroadcast;\n // console.time('appImManager call getHistory');\n const pageCount = Math.min(30, windowSize.height / 40/* * 1.25 */ | 0);\n // const loadCount = Object.keys(this.bubbles).length > 0 ? 50 : pageCount;\n const realLoadCount = isBroadcast ? 20 : (Object.keys(this.bubbles).length > 0 ? Math.max(35, pageCount) : pageCount);\n // const realLoadCount = pageCount;//const realLoadCount = 50;\n let loadCount = realLoadCount;\n\n /* if(TEST_SCROLL) {\n //loadCount = 1;\n if(Object.keys(this.bubbles).length > 0)\n return {cached: false, promise: Promise.resolve(true)};\n } */\n if(TEST_SCROLL !== undefined) {\n if(TEST_SCROLL) {\n if(Object.keys(this.bubbles).length > 0) {\n --TEST_SCROLL;\n }\n } else {\n return {cached: false, promise: Promise.resolve(), waitPromise: Promise.resolve()};\n }\n }\n\n // //console.time('render history total');\n\n let backLimit = 0;\n if(isBackLimit) {\n backLimit = loadCount;\n\n if(!reverse) { // if not jump\n loadCount = 0;\n // maxId = this.appMessagesManager.incrementMessageId(maxId, 1);\n }\n }\n\n let additionMsgIds: number[];\n if(additionMsgId && !isBackLimit) {\n if(this.chat.type === 'pinned') {\n additionMsgIds = [additionMsgId];\n } else {\n const historyStorage = await this.chat.getHistoryStorage();\n const slice = historyStorage.history.slice;\n if(slice.length < loadCount && !slice.isEnd(SliceEnd.Both)) {\n additionMsgIds = slice.slice();\n\n // * filter last album, because we don't know is it the last item\n for(let i = additionMsgIds.length - 1; i >= 0; --i) {\n const message = await this.chat.getMessage(additionMsgIds[i]);\n if((message as Message.message)?.grouped_id) additionMsgIds.splice(i, 1);\n else break;\n }\n\n maxId = additionMsgIds[additionMsgIds.length - 1] || maxId;\n }\n }\n }\n\n /* const result = additionMsgID ?\n {history: [additionMsgID]} :\n appMessagesManager.getHistory(this.peerId, maxId, loadCount, backLimit); */\n let result: AckedResult = await this.requestHistory(maxId, loadCount, backLimit) as any;\n let resultPromise: typeof result['result'];\n\n this.log('i vin brehnya', result, maxId, loadCount, backLimit);\n\n // const isFirstMessageRender = !!additionMsgID && result.cached && !appMessagesManager.getMessage(additionMsgID).grouped_id;\n const isAdditionRender = additionMsgIds?.length && !result.cached;\n const isFirstMessageRender = (this.isFirstLoad && backLimit && !result.cached) || isAdditionRender;\n if(isAdditionRender) {\n resultPromise = result.result;\n\n result = {\n cached: true,\n result: Promise.resolve({history: additionMsgIds})\n };\n\n // additionMsgID = 0;\n }\n\n this.isFirstLoad = false;\n\n const processResult = async(historyResult: Awaited) => {\n if((historyResult as HistoryResult).isEnd?.top) {\n if(this.chat.type === 'discussion') { // * inject discussion start\n const serviceStartMessageId = await this.managers.appMessagesManager.getThreadServiceMessageId(this.peerId, this.chat.threadId);\n if(serviceStartMessageId) historyResult.history.push(serviceStartMessageId);\n const mids = await this.chat.getMidsByMid(this.chat.threadId);\n historyResult.history.push(...mids.reverse());\n }\n\n // synchronize bot placeholder appearance\n await this.managers.appProfileManager.getProfileByPeerId(peerId);\n\n // await this.setLoaded('top', true);\n }\n };\n\n const sup = (historyResult: Awaited) => {\n return getHeavyAnimationPromise().then(() => {\n return processResult(historyResult);\n }).then(() => {\n if(!isAdditionRender && additionMsgId) {\n historyResult.history.unshift(additionMsgId);\n }\n\n return this.performHistoryResult(historyResult, reverse);\n });\n };\n\n const processPromise = (_promise: typeof result['result']) => {\n const promise = Promise.resolve(_promise).then((result) => {\n if(middleware && !middleware()) {\n throw PEER_CHANGED_ERROR;\n }\n\n if(justLoad) {\n // ะฝัƒะถะฝะพ ะดะตะปะฐั‚ัŒ ะธะท-ะทะฐ ั€ะฐะฝะฝะตะน ะฟั€ะพะณั€ัƒะทะบะธ\n this.scrollable.onScroll();\n // fastRaf(() => {\n // this.scrollable.checkForTriggers();\n // });\n return;\n }\n\n return sup(result);\n }, (err) => {\n this.log.error('getHistory error:', err);\n throw err;\n });\n\n return promise;\n };\n\n let promise: Promise, cached: boolean;\n if(!result.cached) {\n cached = false;\n promise = processPromise(result.result);\n } else if(justLoad) {\n // ะฝัƒะถะฝะพ ะดะตะปะฐั‚ัŒ ะธะท-ะทะฐ ั€ะฐะฝะฝะตะน ะฟั€ะพะณั€ัƒะทะบะธ\n this.scrollable.onScroll();\n return null;\n } else {\n cached = true;\n promise = sup(await result.result);\n }\n\n const waitPromise = isAdditionRender ? processPromise(resultPromise) : promise;\n\n if(isFirstMessageRender && rootScope.settings.animationsEnabled/* && false */) {\n let times = isAdditionRender ? 2 : 1;\n this.messagesQueueOnRenderAdditional = () => {\n this.log('messagesQueueOnRenderAdditional');\n\n if(--times) return;\n\n this.messagesQueueOnRenderAdditional = undefined;\n\n const promise = this.animateAsLadder(additionMsgId, additionMsgIds, isAdditionRender, backLimit, maxId);\n promise.then(() => {\n setTimeout(() => { // preload messages\n this.loadMoreHistory(reverse, true);\n }, 0);\n });\n };\n } else {\n this.messagesQueueOnRenderAdditional = undefined;\n }\n\n if(justLoad) {\n return null;\n }\n\n return {cached, promise, waitPromise};\n }\n\n public async setUnreadDelimiter() {\n if(!(this.chat.type === 'chat' || this.chat.type === 'discussion')) {\n return;\n }\n\n if(this.attachedUnreadBubble) {\n return;\n }\n\n const historyMaxId = await this.chat.getHistoryMaxId();\n let readMaxId = await this.managers.appMessagesManager.getReadMaxIdIfUnread(this.peerId, this.chat.threadId);\n if(!readMaxId) return;\n\n readMaxId = Object.keys(this.bubbles)\n .filter((mid) => !this.bubbles[mid].classList.contains('is-out'))\n .map((i) => +i)\n .sort((a, b) => a - b)\n .find((i) => i > readMaxId);\n\n if(readMaxId && this.bubbles[readMaxId]) {\n const bubble = this.bubbles[readMaxId];\n if(this.firstUnreadBubble && this.firstUnreadBubble !== bubble) {\n this.firstUnreadBubble.classList.remove('is-first-unread');\n this.firstUnreadBubble = null;\n }\n\n if(readMaxId !== historyMaxId) {\n bubble.classList.add('is-first-unread');\n }\n\n this.firstUnreadBubble = bubble;\n this.attachedUnreadBubble = true;\n }\n }\n\n public deleteEmptyDateGroups() {\n const mustBeCount = this.stickyIntersector ? STICKY_OFFSET : 1;\n let deleted = false;\n for(const i in this.dateMessages) {\n const dateMessage = this.dateMessages[i];\n\n if(dateMessage.container.childElementCount === mustBeCount) { // only date div + sentinel div\n dateMessage.container.remove();\n if(this.stickyIntersector) {\n this.stickyIntersector.unobserve(dateMessage.container, dateMessage.div);\n }\n delete this.dateMessages[i];\n deleted = true;\n\n // * no sense in it\n /* if(dateMessage.div === this.previousStickyDate) {\n this.previousStickyDate = undefined;\n } */\n }\n }\n\n if(!deleted) {\n return;\n }\n\n if(!Object.keys(this.dateMessages).length) {\n this.container.classList.remove('has-groups');\n }\n\n this.checkIfEmptyPlaceholderNeeded();\n this.setStickyDateManually();\n }\n}\n\nexport function generateTail() {\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttributeNS(null, 'viewBox', '0 0 11 20');\n svg.setAttributeNS(null, 'width', '11');\n svg.setAttributeNS(null, 'height', '20');\n svg.classList.add('bubble-tail');\n\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use.setAttributeNS(null, 'href', '#message-tail-filled');\n\n svg.append(use);\n\n return svg;\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 {copyTextToClipboard} from '../clipboard';\n// import SelectionSaver from \"../selectionSaver\";\n// import selectElementContents from \"./selectElementContents\";\n\nexport default function copyFromElement(element: HTMLElement) {\n copyTextToClipboard(element.textContent);\n // const saver = new SelectionSaver();\n // saver.save();\n // selectElementContents(element);\n // document.execCommand('copy');\n // saver.restore();\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 {MediaSizeType} from '../../helpers/mediaSizes';\nimport {Message} from '../../layer';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {MediaSearchContext} from '../appMediaPlaybackController';\nimport Chat from '../chat/chat';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport wrapDocument from './document';\n\nexport default async function wrapGroupedDocuments({albumMustBeRenderedFull, message, bubble, messageDiv, chat, loadPromises, autoDownloadSize, lazyLoadQueue, searchContext, useSearch, sizeType, managers, fontWeight, fontSize, richTextFragment}: {\n albumMustBeRenderedFull: boolean,\n message: any,\n messageDiv: HTMLElement,\n bubble: HTMLElement,\n uploading?: boolean,\n chat: Chat,\n loadPromises?: Promise[],\n autoDownloadSize?: number,\n lazyLoadQueue?: LazyLoadQueue,\n searchContext?: MediaSearchContext,\n useSearch?: boolean,\n sizeType?: MediaSizeType,\n managers?: AppManagers,\n fontWeight?: number,\n fontSize?: number,\n richTextFragment?: DocumentFragment\n}) {\n let nameContainer: HTMLElement;\n const mids = albumMustBeRenderedFull ? await chat.getMidsByMid(message.mid) : [message.mid];\n /* if(isPending) {\n mids.reverse();\n } */\n\n const promises = mids.map(async(mid, idx) => {\n const message = (await chat.getMessage(mid)) as Message.message;\n const div = await wrapDocument({\n message,\n loadPromises,\n autoDownloadSize,\n lazyLoadQueue,\n searchContext,\n sizeType,\n managers,\n fontWeight,\n fontSize\n });\n\n const container = document.createElement('div');\n container.classList.add('document-container');\n container.dataset.mid = '' + mid;\n container.dataset.peerId = '' + message.peerId;\n\n const wrapper = document.createElement('div');\n wrapper.classList.add('document-wrapper');\n\n if(message.message) {\n const messageDiv = document.createElement('div');\n messageDiv.classList.add('document-message');\n\n setInnerHTML(messageDiv, richTextFragment);\n wrapper.append(messageDiv);\n }\n\n if(mids.length > 1) {\n const selection = document.createElement('div');\n selection.classList.add('document-selection');\n container.append(selection);\n\n container.classList.add('grouped-item');\n\n if(idx === 0) {\n nameContainer = wrapper;\n }\n }\n\n wrapper.append(div);\n container.append(wrapper);\n return container;\n });\n\n const containers = await Promise.all(promises);\n messageDiv.append(...containers);\n\n if(mids.length > 1) {\n bubble.classList.add('is-multiple-documents', 'is-grouped');\n }\n\n return nameContainer;\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 {AppManagers} from '../../lib/appManagers/managers';\nimport rootScope from '../../lib/rootScope';\nimport PollElement from '../poll';\n\nexport default function wrapPoll(message: any, managers: AppManagers = rootScope.managers) {\n const elem = new PollElement();\n elem.message = message;\n elem.managers = managers;\n elem.setAttribute('peer-id', '' + message.peerId);\n elem.setAttribute('poll-id', message.media.poll.id);\n elem.setAttribute('message-id', '' + message.mid);\n elem.render();\n return elem;\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, {addCancelButton} from '.';\nimport PopupPeer, {PopupPeerButtonCallbackCheckboxes, PopupPeerOptions} from './peer';\nimport rootScope from '../../lib/rootScope';\nimport {FormatterArguments, LangPackKey} from '../../lib/langPack';\nimport wrapPeerTitle from '../wrappers/peerTitle';\n\nexport default class PopupPinMessage {\n constructor(private peerId: PeerId, private mid: number, private unpin?: true, private onConfirm?: () => void) {\n this.construct();\n }\n\n private async construct() {\n const {peerId, mid, unpin, onConfirm} = this;\n let title: LangPackKey, description: LangPackKey, descriptionArgs: FormatterArguments;\n const buttons: PopupPeerOptions['buttons'] = [], checkboxes: PopupPeerOptions['checkboxes'] = [];\n\n const managers = PopupElement.MANAGERS;\n\n const canUnpin = await managers.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 = managers.appMessagesManager.unpinAllMessages(peerId);\n } else {\n promise = managers.appMessagesManager.hidePinnedMessages(peerId);\n }\n } else {\n promise = managers.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 = ['' + ((await managers.appMessagesManager.getPinnedMessagesCount(peerId)) || 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(await managers.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: [await wrapPeerTitle({peerId})],\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","/*\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 isSelectionEmpty(selection = window.getSelection()) {\n if(!selection?.rangeCount) {\n return true;\n }\n\n const selectionRange = selection.getRangeAt(0);\n if(selectionRange.collapsed || !selectionRange.START_TO_END) {\n return true;\n }\n\n return false;\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 appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport lottieLoader from '../lib/rlottie/lottieLoader';\nimport rootScope from '../lib/rootScope';\nimport {getEmojiToneIndex} from '../vendor/emoji';\nimport mediaSizes from './mediaSizes';\nimport {saveLottiePreview} from './saveLottiePreview';\n\nexport default function preloadAnimatedEmojiSticker(emoji: string, width?: number, height?: number) {\n return rootScope.managers.appStickersManager.preloadAnimatedEmojiSticker(emoji).then(({doc}) => {\n if(!doc) {\n return;\n }\n\n return appDownloadManager.downloadMedia({media: doc})\n .then(async(blob) => {\n const mediaSize = mediaSizes.active.emojiSticker;\n const toneIndex = getEmojiToneIndex(emoji);\n const animation = await lottieLoader.loadAnimationWorker({\n container: undefined,\n animationData: blob,\n width: width ?? mediaSize.width,\n height: height ?? mediaSize.height,\n name: 'doc' + doc.id,\n autoplay: false,\n loop: false,\n toneIndex,\n group: 'none'\n });\n\n animation.addEventListener('firstFrame', () => {\n saveLottiePreview(doc, animation.canvas[0], toneIndex);\n animation.remove();\n }, {once: true});\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 {ReportReason} from '../../layer';\nimport InputField from '../inputField';\nimport {toastNew} from '../toast';\nimport wrapStickerEmoji from '../wrappers/stickerEmoji';\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 this.managers.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 size = 100;\n wrapStickerEmoji({\n div,\n emoji: PopupReportMessagesConfirm.STICKER_EMOJI,\n width: size,\n height: size\n }).then(({render}) => render).finally(() => {\n this.show();\n });\n\n this.header.replaceWith(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 preloadAnimatedEmojiSticker from '../../helpers/preloadAnimatedEmojiSticker';\nimport {ReportReason} from '../../layer';\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 ['ReportChatPersonalDetails', 'inputReportReasonPersonalDetails'],\n ['ReportChatIllegalDrugs', 'inputReportReasonIllegalDrugs']\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 = 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 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 scrollable: true\n });\n\n this.scrollable.append(this.description);\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 PopupElement from '.';\nimport {Message, Reaction} from '../../layer';\nimport ReactionsElement from '../chat/reactions';\nimport {horizontalMenu} from '../horizontalMenu';\nimport Scrollable from '../scrollable';\nimport ScrollableLoader from '../../helpers/scrollableLoader';\nimport appDialogsManager from '../../lib/appManagers/appDialogsManager';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport wrapSticker from '../wrappers/sticker';\nimport ReactionElement from '../chat/reaction';\nimport getUserStatusString from '../wrappers/getUserStatusString';\nimport {makeMediaSize} from '../../helpers/mediaSize';\nimport wrapCustomEmoji from '../wrappers/customEmoji';\nimport SettingSection from '../settingSection';\n\nexport default class PopupReactedList extends PopupElement {\n constructor(\n private message: Message.message\n ) {\n super('popup-reacted-list', {closable: true, overlayClosable: true, body: true});\n\n this.init();\n }\n\n private async init() {\n const middleware = this.middlewareHelper.get();\n const message = await this.managers.appMessagesManager.getGroupsFirstMessage(this.message);\n if(!middleware()) return;\n const canViewReadParticipants = await this.managers.appMessagesManager.canViewMessageReadParticipants(message);\n if(!middleware()) return;\n // this.body.append(generateDelimiter());\n\n const reactionsElement = new ReactionsElement();\n const newMessage: Message.message = {\n ...message,\n mid: 0,\n id: 0,\n reactions: {\n _: 'messageReactions',\n results: [],\n\n ...message.reactions,\n\n pFlags: {},\n recent_reactions: []\n }\n };\n\n newMessage.reactions.results = newMessage.reactions.results.map((reactionCount) => {\n return {\n ...reactionCount,\n chosen_order: undefined,\n pFlags: {}\n };\n });\n\n reactionsElement.init(newMessage, 'block', this.middlewareHelper.get());\n reactionsElement.render();\n reactionsElement.classList.add('no-stripe');\n reactionsElement.classList.remove('has-no-reactions');\n\n reactionsElement.append(this.btnClose);\n\n this.header.append(reactionsElement);\n\n const tabsContainer = document.createElement('div');\n tabsContainer.classList.add('tabs-container');\n tabsContainer.dataset.animation = 'tabs';\n\n const loaders: Map = new Map();\n\n let hasAllReactions = false;\n if(newMessage.reactions.results.length) {\n const reaction = this.createFakeReaction('reactions', newMessage.reactions.results.reduce((acc, r) => acc + r.count, 0));\n\n reactionsElement.prepend(reaction);\n newMessage.reactions.results.unshift(reaction.reactionCount);\n hasAllReactions = true;\n }\n\n let hasReadParticipants = false;\n if(canViewReadParticipants) {\n try {\n const readUserIds = await this.managers.appMessagesManager.getMessageReadParticipants(message.peerId, message.mid);\n if(!middleware()) return;\n if(!readUserIds.length) {\n throw '';\n }\n\n const reaction = this.createFakeReaction('checks', readUserIds.length);\n\n reactionsElement.prepend(reaction);\n newMessage.reactions.results.unshift(reaction.reactionCount);\n hasReadParticipants = true;\n } catch(err) {\n\n }\n }\n\n newMessage.reactions.results.forEach((reactionCount) => {\n const scrollable = new Scrollable(undefined);\n scrollable.container.classList.add('tabs-tab');\n\n const section = new SettingSection({\n noShadow: true,\n noDelimiter: true\n });\n\n const chatlist = appDialogsManager.createChatList({\n dialogSize: 72\n });\n\n appDialogsManager.setListClickListener(chatlist, () => {\n this.hide();\n }, undefined, false, true);\n\n section.content.append(chatlist);\n scrollable.container.append(section.container);\n\n const skipReadParticipants = (reactionCount.reaction as any) !== 'checks';\n const skipReactionsList = (reactionCount.reaction as any) === 'checks';\n if(['checks', 'reactions'].includes(reactionCount.reaction as any)) {\n reactionCount.reaction = undefined;\n }\n\n const size = 24;\n const mediaSize = makeMediaSize(size, size);\n\n let nextOffset: string;\n const loader = new ScrollableLoader({\n scrollable,\n getPromise: async() => {\n const result = await this.managers.appMessagesManager.getMessageReactionsListAndReadParticipants(message, undefined, reactionCount.reaction, nextOffset, skipReadParticipants, skipReactionsList);\n nextOffset = result.nextOffset;\n\n await Promise.all(result.combined.map(async({peerId, reaction}) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n autonomous: true,\n container: chatlist,\n avatarSize: 'abitbigger',\n rippleEnabled: false,\n meAsSaved: false\n });\n\n if(reaction) {\n const stickerContainer = document.createElement('div');\n stickerContainer.classList.add('reacted-list-reaction-icon');\n\n if(reaction._ === 'reactionEmoji') {\n const availableReaction = await this.managers.appReactionsManager.getReactionCached(reaction.emoticon);\n\n wrapSticker({\n doc: availableReaction.static_icon,\n div: stickerContainer,\n width: 24,\n height: 24,\n middleware\n });\n } else if(reaction._ === 'reactionCustomEmoji') {\n stickerContainer.append(wrapCustomEmoji({\n docIds: [reaction.document_id],\n customEmojiSize: mediaSize,\n middleware\n }));\n }\n\n dom.listEl.append(stickerContainer);\n }\n\n replaceContent(dom.lastMessageSpan, getUserStatusString(await this.managers.appUsersManager.getUser(peerId.toUserId())));\n }));\n\n return !nextOffset;\n }\n });\n\n loaders.set(scrollable.container, loader);\n\n tabsContainer.append(scrollable.container);\n });\n\n this.body.append(tabsContainer);\n\n const selectTab = horizontalMenu(reactionsElement, tabsContainer, (id, tabContent) => {\n if(id === (reactionsElement.childElementCount - 1)) {\n return false;\n }\n\n const reaction = reactionsElement.children[id] as ReactionElement;\n const prevId = selectTab.prevId();\n if(prevId !== -1) {\n (reactionsElement.children[prevId] as ReactionElement).setIsChosen(false);\n }\n\n reaction.setIsChosen(true);\n\n const loader = loaders.get(tabContent);\n loader.load();\n }, undefined, undefined, undefined, this.listenerSetter);\n\n // selectTab(hasAllReactions && hasReadParticipants ? 1 : 0, false);\n selectTab(0, false);\n\n this.show();\n }\n\n private createFakeReaction(icon: string, count: number) {\n const reaction = new ReactionElement();\n reaction.init('block', this.middlewareHelper.get());\n reaction.reactionCount = {\n _: 'reactionCount',\n count: count,\n reaction: icon as any\n };\n reaction.setCanRenderAvatars(false);\n reaction.renderCounter();\n\n const allReactionsSticker = document.createElement('div');\n allReactionsSticker.classList.add('reaction-counter', 'reaction-sticker-icon', 'tgico-' + icon);\n reaction.prepend(allReactionsSticker);\n\n return reaction;\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_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport {IS_MOBILE, IS_SAFARI} from '../../environment/userAgent';\nimport assumeType from '../../helpers/assumeType';\nimport callbackify from '../../helpers/callbackify';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport getVisibleRect from '../../helpers/dom/getVisibleRect';\nimport {getMiddleware} from '../../helpers/middleware';\nimport noop from '../../helpers/noop';\nimport {fastRaf} from '../../helpers/schedulers';\nimport {Message, AvailableReaction, Reaction} from '../../layer';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport lottieLoader from '../../lib/rlottie/lottieLoader';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport rootScope from '../../lib/rootScope';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport Scrollable, {ScrollableBase, ScrollableX} from '../scrollable';\nimport wrapSticker from '../wrappers/sticker';\n\nconst REACTIONS_CLASS_NAME = 'btn-menu-reactions';\nconst REACTION_CLASS_NAME = REACTIONS_CLASS_NAME + '-reaction';\n\nconst REACTION_SIZE = 26;\nconst PADDING = 4;\nexport const REACTION_CONTAINER_SIZE = REACTION_SIZE + PADDING * 2;\n\nconst CAN_USE_TRANSFORM = !IS_SAFARI;\n\ntype ChatReactionsMenuPlayers = {\n select?: RLottiePlayer,\n appear?: RLottiePlayer,\n selectWrapper: HTMLElement,\n appearWrapper: HTMLElement,\n reaction: Reaction\n};\nexport class ChatReactionsMenu {\n public widthContainer: HTMLElement;\n public container: HTMLElement;\n private reactionsMap: Map;\n public scrollable: ScrollableBase;\n private animationGroup: AnimationItemGroup;\n private middleware: ReturnType;\n private message: Message.message;\n\n constructor(\n private managers: AppManagers,\n private type: 'horizontal' | 'vertical',\n middleware: ChatReactionsMenu['middleware']\n ) {\n const widthContainer = this.widthContainer = document.createElement('div');\n widthContainer.classList.add(REACTIONS_CLASS_NAME + '-container');\n widthContainer.classList.add(REACTIONS_CLASS_NAME + '-container-' + type);\n\n const reactionsContainer = this.container = document.createElement('div');\n reactionsContainer.classList.add(REACTIONS_CLASS_NAME);\n\n const reactionsScrollable = this.scrollable = type === 'vertical' ? new Scrollable(undefined) : new ScrollableX(undefined);\n reactionsContainer.append(reactionsScrollable.container);\n reactionsScrollable.onAdditionalScroll = this.onScroll;\n reactionsScrollable.setListeners();\n\n reactionsScrollable.container.classList.add('no-scrollbar');\n\n // ['big'].forEach((type) => {\n // const bubble = document.createElement('div');\n // bubble.classList.add(REACTIONS_CLASS_NAME + '-bubble', REACTIONS_CLASS_NAME + '-bubble-' + type);\n // reactionsContainer.append(bubble);\n // });\n\n this.reactionsMap = new Map();\n this.animationGroup = `CHAT-MENU-REACTIONS-${Date.now()}`;\n animationIntersector.setOverrideIdleGroup(this.animationGroup, true);\n\n if(!IS_TOUCH_SUPPORTED) {\n reactionsContainer.addEventListener('mousemove', this.onMouseMove);\n }\n\n attachClickEvent(reactionsContainer, (e) => {\n const reactionDiv = findUpClassName(e.target, REACTION_CLASS_NAME);\n if(!reactionDiv) return;\n\n const players = this.reactionsMap.get(reactionDiv);\n if(!players) return;\n\n this.managers.appReactionsManager.sendReaction(this.message, players.reaction);\n });\n\n widthContainer.append(reactionsContainer);\n\n this.middleware = middleware ?? getMiddleware();\n }\n\n public init(message: Message.message) {\n this.message = message;\n\n const middleware = this.middleware.get();\n // const result = Promise.resolve(this.appReactionsManager.getAvailableReactionsForPeer(message.peerId)).then((res) => pause(1000).then(() => res));\n const result = this.managers.appReactionsManager.getAvailableReactionsByMessage(message);\n callbackify(result, (reactions) => {\n if(!middleware() || !reactions.length) return;\n reactions.forEach((reaction) => {\n if(reaction.pFlags.premium && !rootScope.premium) return;\n this.renderReaction(reaction);\n });\n\n const setVisible = () => {\n this.container.classList.add('is-visible');\n };\n\n if(result instanceof Promise) {\n fastRaf(setVisible);\n } else {\n setVisible();\n }\n });\n }\n\n public cleanup() {\n this.middleware.clean();\n this.scrollable.removeListeners();\n this.reactionsMap.clear();\n animationIntersector.setOverrideIdleGroup(this.animationGroup, false);\n animationIntersector.checkAnimations(true, this.animationGroup, true);\n }\n\n private onScroll = () => {\n this.reactionsMap.forEach((players, div) => {\n this.onScrollProcessItem(div, players);\n });\n };\n\n private canUseAnimations() {\n return rootScope.settings.animationsEnabled && !IS_MOBILE;\n }\n\n private renderReaction(reaction: AvailableReaction) {\n const reactionDiv = document.createElement('div');\n reactionDiv.classList.add(REACTION_CLASS_NAME);\n\n const scaleContainer = document.createElement('div');\n scaleContainer.classList.add(REACTION_CLASS_NAME + '-scale');\n\n const appearWrapper = document.createElement('div');\n let selectWrapper: HTMLElement;;\n appearWrapper.classList.add(REACTION_CLASS_NAME + '-appear');\n\n if(this.canUseAnimations()) {\n selectWrapper = document.createElement('div');\n selectWrapper.classList.add(REACTION_CLASS_NAME + '-select', 'hide');\n }\n\n const players: ChatReactionsMenuPlayers = {\n selectWrapper,\n appearWrapper,\n reaction: {_: 'reactionEmoji', emoticon: reaction.reaction}\n };\n this.reactionsMap.set(reactionDiv, players);\n\n const middleware = this.middleware.get();\n\n const hoverScale = IS_TOUCH_SUPPORTED ? 1 : 1.25;\n const size = REACTION_SIZE * hoverScale;\n\n const options = {\n width: size,\n height: size,\n skipRatio: 1,\n needFadeIn: false,\n withThumb: false,\n group: this.animationGroup,\n middleware\n };\n\n if(!this.canUseAnimations()) {\n delete options.needFadeIn;\n delete options.withThumb;\n\n wrapSticker({\n doc: reaction.static_icon,\n div: appearWrapper,\n ...options\n });\n } else {\n let isFirst = true;\n wrapSticker({\n doc: reaction.appear_animation,\n div: appearWrapper,\n play: true,\n ...options\n }).then(({render}) => render).then((player) => {\n assumeType(player);\n\n players.appear = player;\n\n player.addEventListener('enterFrame', (frameNo) => {\n if(player.maxFrame === frameNo) {\n selectLoadPromise.then((selectPlayer) => {\n assumeType(selectPlayer);\n appearWrapper.classList.add('hide');\n selectWrapper.classList.remove('hide');\n\n if(isFirst) {\n players.select = selectPlayer;\n isFirst = false;\n }\n }, noop);\n }\n });\n }, noop);\n\n const selectLoadPromise = wrapSticker({\n doc: reaction.select_animation,\n div: selectWrapper,\n ...options\n }).then(({render}) => render).then((player) => {\n assumeType(player);\n\n return lottieLoader.waitForFirstFrame(player);\n }).catch(noop);\n }\n\n scaleContainer.append(appearWrapper);\n selectWrapper && scaleContainer.append(selectWrapper);\n reactionDiv.append(scaleContainer);\n this.scrollable.append(reactionDiv);\n }\n\n private onScrollProcessItem(div: HTMLElement, players: ChatReactionsMenuPlayers) {\n // return;\n\n const scaleContainer = div.firstElementChild as HTMLElement;\n const visibleRect = getVisibleRect(div, this.scrollable.container);\n let transform: string;\n if(!visibleRect) {\n if(!players.appearWrapper.classList.contains('hide') || !players.appear) {\n return;\n }\n\n if(players.select) {\n players.select.stop();\n }\n\n players.appear.stop();\n players.appear.autoplay = true;\n players.appearWrapper.classList.remove('hide');\n players.selectWrapper.classList.add('hide');\n\n transform = '';\n } else if(visibleRect.overflow.left || visibleRect.overflow.right) {\n const diff = Math.abs(visibleRect.rect.left - visibleRect.rect.right);\n const scale = Math.min(diff ** 2 / REACTION_CONTAINER_SIZE ** 2, 1);\n\n transform = 'scale(' + scale + ')';\n } else {\n transform = '';\n }\n\n if(CAN_USE_TRANSFORM) {\n scaleContainer.style.transform = transform;\n }\n }\n\n private onMouseMove = (e: MouseEvent) => {\n const reactionDiv = findUpClassName(e.target, REACTION_CLASS_NAME);\n if(!reactionDiv) {\n return;\n }\n\n const players = this.reactionsMap.get(reactionDiv);\n if(!players) {\n return;\n }\n\n // do not play select animation when appearing\n if(!players.appear?.paused) {\n return;\n }\n\n const player = players.select;\n if(!player) {\n return;\n }\n\n if(player.paused) {\n player.autoplay = true;\n player.restart();\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 {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport type Chat from './chat';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport ButtonMenu, {ButtonMenuItemOptions} from '../buttonMenu';\nimport PopupDeleteMessages from '../popups/deleteMessages';\nimport PopupForward from '../popups/forward';\nimport PopupPinMessage from '../popups/unpinMessage';\nimport {copyTextToClipboard} from '../../helpers/clipboard';\nimport PopupSendNow from '../popups/sendNow';\nimport {toast} from '../toast';\nimport I18n, {i18n, LangPackKey} from '../../lib/langPack';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport isSelectionEmpty from '../../helpers/dom/isSelectionEmpty';\nimport {Message, Poll, Chat as MTChat, MessageMedia, AvailableReaction, MessageEntity, InputStickerSet, StickerSet, Document, Reaction} from '../../layer';\nimport PopupReportMessages from '../popups/reportMessages';\nimport assumeType from '../../helpers/assumeType';\nimport PopupSponsored from '../popups/sponsored';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport {getMiddleware} from '../../helpers/middleware';\nimport PeerTitle from '../peerTitle';\nimport StackedAvatars from '../stackedAvatars';\nimport {IS_APPLE} from '../../environment/userAgent';\nimport PopupReactedList from '../popups/reactedList';\nimport {ChatReactionsMenu, REACTION_CONTAINER_SIZE} from './reactionsMenu';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport positionMenu, {MenuPositionPadding} from '../../helpers/positionMenu';\nimport contextMenuController from '../../helpers/contextMenuController';\nimport {attachContextMenuListener} from '../../helpers/dom/attachContextMenuListener';\nimport filterAsync from '../../helpers/array/filterAsync';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport {SERVICE_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport {MessagesStorageKey} from '../../lib/appManagers/appMessagesManager';\nimport filterUnique from '../../helpers/array/filterUnique';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport PopupStickers from '../popups/stickers';\nimport getMediaFromMessage from '../../lib/appManagers/utils/messages/getMediaFromMessage';\nimport canSaveMessageMedia from '../../lib/appManagers/utils/messages/canSaveMessageMedia';\nimport getAlbumText from '../../lib/appManagers/utils/messages/getAlbumText';\n\nexport default class ChatContextMenu {\n private buttons: (ButtonMenuItemOptions & {verify: () => boolean | Promise, notDirect?: () => boolean, withSelection?: true, isSponsored?: true, localName?: 'views' | 'emojis'})[];\n private element: HTMLElement;\n\n private isSelectable: boolean;\n private isSelected: boolean;\n private target: HTMLElement;\n private isTargetAGroupedItem: boolean;\n private isTextSelected: boolean;\n private isAnchorTarget: boolean;\n private isUsernameTarget: boolean;\n private isSponsored: boolean;\n private isOverBubble: boolean;\n private peerId: PeerId;\n private mid: number;\n private message: Message.message | Message.messageService;\n private noForwards: boolean;\n\n private reactionsMenu: ChatReactionsMenu;\n private listenerSetter: ListenerSetter;\n private attachListenerSetter: ListenerSetter;\n\n private viewerPeerId: PeerId;\n private middleware: ReturnType;\n private canOpenReactedList: boolean;\n\n private emojiInputsPromise: CancellablePromise;\n private albumMessages: Message.message[];\n private linkToMessage: Awaited>;\n private selectedMessagesText: string;\n\n constructor(\n private chat: Chat,\n private managers: AppManagers\n ) {\n this.listenerSetter = new ListenerSetter();\n this.attachListenerSetter = new ListenerSetter();\n this.middleware = getMiddleware();\n }\n\n public attachTo(element: HTMLElement) {\n this.attachListenerSetter.removeAll();\n\n if(IS_TOUCH_SUPPORTED/* && false */) {\n attachClickEvent(element, (e) => {\n if(this.chat.selection.isSelecting) {\n return;\n }\n\n this.chat.log('touchend', e);\n\n const badSelectors = [\n '.name',\n '.peer-title',\n '.reply',\n '.document',\n 'audio-element',\n 'avatar-element',\n 'a',\n '.bubble-beside-button',\n 'replies-element',\n '[data-saved-from]:not(.bubble)',\n 'poll-element',\n '.attachment',\n '.reply-markup-button'\n ];\n const good = !(e.target as HTMLElement).closest(badSelectors.join(', '));\n if(good) {\n cancelEvent(e);\n // onContextMenu((e as TouchEvent).changedTouches[0]);\n // onContextMenu((e as TouchEvent).changedTouches ? (e as TouchEvent).changedTouches[0] : e as MouseEvent);\n this.onContextMenu(e);\n }\n }, {listenerSetter: this.attachListenerSetter});\n } else attachContextMenuListener({\n element,\n callback: this.onContextMenu,\n listenerSetter: this.attachListenerSetter\n });\n }\n\n private onContextMenu = (e: MouseEvent | Touch | TouchEvent) => {\n let bubble: HTMLElement, contentWrapper: HTMLElement;\n\n try {\n contentWrapper = findUpClassName(e.target, 'bubble-content-wrapper');\n bubble = contentWrapper ? contentWrapper.parentElement : findUpClassName(e.target, 'bubble');\n } catch(e) {}\n\n // ! context menu click by date bubble (there is no pointer-events)\n if(!bubble || bubble.classList.contains('bubble-first')) return;\n\n let element = this.element;\n if(e instanceof MouseEvent || e.hasOwnProperty('preventDefault')) (e as any).preventDefault();\n if(element && element.classList.contains('active')) {\n return false;\n }\n if(e instanceof MouseEvent || e.hasOwnProperty('cancelBubble')) (e as any).cancelBubble = true;\n\n let mid = +bubble.dataset.mid;\n if(!mid) return;\n\n const r = async() => {\n const isSponsored = this.isSponsored = mid < 0;\n this.isSelectable = this.chat.selection.canSelectBubble(bubble);\n this.peerId = this.chat.peerId;\n // this.msgID = msgID;\n this.target = e.target as HTMLElement;\n this.isTextSelected = !isSelectionEmpty();\n this.isAnchorTarget = this.target.tagName === 'A' && (\n (this.target as HTMLAnchorElement).target === '_blank' ||\n this.target.classList.contains('anchor-url')\n );\n this.isUsernameTarget = this.target.tagName === 'A' && this.target.classList.contains('mention');\n\n const mids = await this.chat.getMidsByMid(mid);\n // * ะตัะปะธ ะพั‚ะบั€ั‹ั‚ัŒ ะบะพะฝั‚ะตะบัั‚ะฝะพะต ะผะตะฝัŽ ะดะปั ะฐะปัŒะฑะพะผะฐ ะฝะต ะฟะพ ะฑะฐะฑะฑะปัƒ, ะธ ะฟะพัะปะตะดะฝะธะน ัะปะตะผะตะฝั‚ ะฝะต ะฒั‹ะฑั€ะฐะฝ, ั‡ั‚ะพะฑั‹ ะฟะพะบะฐะทะฐั‚ัŒ ะพัั‚ะฐะปัŒะฝั‹ะต ะฟัƒะฝะบั‚ั‹\n if(this.chat.selection.isSelecting && !contentWrapper) {\n if(isSponsored) {\n return;\n }\n\n if(mids.length > 1) {\n const selectedMid = this.chat.selection.isMidSelected(this.peerId, mid) ?\n mid :\n mids.find((mid) => this.chat.selection.isMidSelected(this.peerId, mid));\n if(selectedMid) {\n mid = selectedMid;\n }\n }\n }\n\n this.isOverBubble = !!contentWrapper;\n\n const groupedItem = findUpClassName(this.target, 'grouped-item');\n this.isTargetAGroupedItem = !!groupedItem;\n if(groupedItem) {\n this.mid = +groupedItem.dataset.mid;\n } else {\n this.mid = mid;\n }\n\n this.isSelected = this.chat.selection.isMidSelected(this.peerId, this.mid);\n this.message = (bubble as any).message || await this.chat.getMessage(this.mid);\n this.albumMessages = (this.message as Message.message).grouped_id ? await this.managers.appMessagesManager.getMessagesByAlbum((this.message as Message.message).grouped_id) : undefined;\n this.noForwards = !isSponsored && !(await this.managers.appMessagesManager.canForward(this.message));\n this.viewerPeerId = undefined;\n this.canOpenReactedList = undefined;\n this.linkToMessage = await this.getUrlToMessage();\n this.selectedMessagesText = await this.getSelectedMessagesText();\n\n const initResult = await this.init();\n if(!initResult) {\n return;\n }\n\n element = initResult.element;\n const {cleanup, destroy, menuPadding, reactionsMenu, reactionsMenuPosition} = initResult;\n let isReactionsMenuVisible = false;\n if(reactionsMenu) {\n const className = 'is-visible';\n isReactionsMenuVisible = reactionsMenu.container.classList.contains(className);\n if(isReactionsMenuVisible) reactionsMenu.container.classList.remove(className);\n\n if(reactionsMenuPosition === 'horizontal') {\n const offsetSize = element[/* reactionsMenuPosition === 'vertical' ? 'offsetHeight' : */'offsetWidth'];\n // if(reactionsMenu.scrollable.container.scrollWidth > offsetWidth) {\n const INNER_CONTAINER_PADDING = 8;\n const visibleLength = (offsetSize - INNER_CONTAINER_PADDING) / REACTION_CONTAINER_SIZE;\n const nextVisiblePart = visibleLength % 1;\n const MIN_NEXT_VISIBLE_PART = 0.65;\n if(nextVisiblePart < MIN_NEXT_VISIBLE_PART) {\n const minSize = (offsetSize + (MIN_NEXT_VISIBLE_PART - nextVisiblePart) * REACTION_CONTAINER_SIZE) | 0;\n element.style[/* reactionsMenuPosition === 'vertical' ? 'minHeight' : */'minWidth'] = minSize + 'px';\n }\n // }\n }\n }\n\n const side: 'left' | 'right' = bubble.classList.contains('is-in') ? 'left' : 'right';\n // bubble.parentElement.append(element);\n // appImManager.log('contextmenu', e, bubble, side);\n positionMenu((e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent, element, side, menuPadding);\n\n if(reactionsMenu) {\n reactionsMenu.widthContainer.style.top = element.style.top;\n reactionsMenu.widthContainer.style.left = element.style.left;\n reactionsMenu.widthContainer.style.setProperty('--menu-width', element[reactionsMenuPosition === 'vertical' ? 'offsetHeight' : 'offsetWidth'] + 'px');\n element.parentElement.append(reactionsMenu.widthContainer);\n if(isReactionsMenuVisible) void reactionsMenu.container.offsetLeft; // reflow\n }\n\n contextMenuController.openBtnMenu(element, () => {\n if(reactionsMenu) {\n reactionsMenu.container.classList.remove('is-visible');\n }\n\n this.mid = 0;\n this.peerId = undefined;\n this.target = null;\n this.viewerPeerId = undefined;\n this.canOpenReactedList = undefined;\n cleanup();\n\n setTimeout(() => {\n destroy();\n }, 300);\n });\n\n if(isReactionsMenuVisible) {\n reactionsMenu.container.classList.add('is-visible');\n }\n };\n\n r();\n };\n\n public cleanup() {\n this.listenerSetter.removeAll();\n this.reactionsMenu && this.reactionsMenu.cleanup();\n this.middleware.clean();\n }\n\n public destroy() {\n this.cleanup();\n this.attachListenerSetter.removeAll();\n }\n\n private async filterButtons(buttons: ChatContextMenu['buttons']) {\n if(this.isSponsored) {\n return buttons.filter((button) => {\n return button.isSponsored;\n });\n } else {\n return filterAsync(buttons, async(button) => {\n let good: boolean;\n\n // if((appImManager.chatSelection.isSelecting && !button.withSelection) || (button.withSelection && !appImManager.chatSelection.isSelecting)) {\n if(this.chat.selection.isSelecting && !button.withSelection) {\n good = false;\n } else {\n good = this.isOverBubble || IS_TOUCH_SUPPORTED || true ?\n await button.verify() :\n button.notDirect && await button.verify() && button.notDirect();\n }\n\n return !!good;\n });\n }\n }\n\n private setButtons() {\n const verifyFavoriteSticker = async(toAdd: boolean) => {\n const doc = ((this.message as Message.message).media as MessageMedia.messageMediaDocument)?.document;\n if(!(doc as MyDocument)?.sticker) {\n return false;\n }\n\n const favedStickers = await this.managers.acknowledged.appStickersManager.getFavedStickersStickers();\n if(!favedStickers.cached) {\n return false;\n }\n\n const found = (await favedStickers.result).some((_doc) => _doc.id === doc.id);\n return toAdd ? !found : found;\n };\n\n this.buttons = [{\n icon: 'send2',\n text: 'MessageScheduleSend',\n onClick: this.onSendScheduledClick,\n verify: () => this.chat.type === 'scheduled' && !this.message.pFlags.is_outgoing\n }, {\n icon: 'send2',\n text: 'Message.Context.Selection.SendNow',\n onClick: this.onSendScheduledClick,\n verify: () => this.chat.type === 'scheduled' && this.isSelected && !this.chat.selection.selectionSendNowBtn.hasAttribute('disabled'),\n notDirect: () => true,\n withSelection: true\n }, {\n icon: 'schedule',\n text: 'MessageScheduleEditTime',\n onClick: () => {\n this.chat.input.scheduleSending(() => {\n assumeType(this.message);\n this.managers.appMessagesManager.editMessage(this.message, this.message.message, {\n scheduleDate: this.chat.input.scheduleDate,\n entities: this.message.entities\n });\n\n this.chat.input.onMessageSent(false, false);\n }, new Date(this.message.date * 1000));\n },\n verify: () => this.chat.type === 'scheduled'\n }, {\n icon: 'reply',\n text: 'Reply',\n onClick: this.onReplyClick,\n verify: async() => await this.chat.canSend() &&\n !this.message.pFlags.is_outgoing &&\n !!this.chat.input.messageInput &&\n this.chat.type !== 'scheduled'/* ,\n cancelEvent: true */\n }, {\n icon: 'favourites',\n text: 'AddToFavorites',\n onClick: this.onFaveStickerClick.bind(this, false),\n verify: () => verifyFavoriteSticker(true)\n }, {\n icon: 'favourites',\n text: 'DeleteFromFavorites',\n onClick: this.onFaveStickerClick.bind(this, true),\n verify: () => verifyFavoriteSticker(false)\n }, {\n icon: 'edit',\n text: 'Edit',\n onClick: this.onEditClick,\n verify: async() => (await this.managers.appMessagesManager.canEditMessage(this.message, 'text')) && !!this.chat.input.messageInput\n }, {\n icon: 'copy',\n text: 'Copy',\n onClick: this.onCopyClick,\n verify: () => !this.noForwards && !!(this.message as Message.message).message && !this.isTextSelected && (!this.isAnchorTarget || (this.message as Message.message).message !== this.target.innerText)\n }, {\n icon: 'copy',\n text: 'Chat.CopySelectedText',\n onClick: this.onCopyClick,\n verify: () => !this.noForwards && !!(this.message as Message.message).message && this.isTextSelected\n }, {\n icon: 'copy',\n text: 'Message.Context.Selection.Copy',\n onClick: this.onCopyClick,\n verify: async() => {\n if(!this.isSelected || this.noForwards) {\n return false;\n }\n\n for(const [peerId, mids] of this.chat.selection.selectedMids) {\n const storageKey: MessagesStorageKey = `${peerId}_${this.chat.type === 'scheduled' ? 'scheduled' : 'history'}`;\n for(const mid of mids) {\n const message = (await this.managers.appMessagesManager.getMessageFromStorage(storageKey, mid)) as Message.message;\n if(!!message.message) {\n return true;\n }\n }\n }\n\n return false;\n },\n notDirect: () => true,\n withSelection: true\n }, {\n icon: 'copy',\n text: 'CopyLink',\n onClick: this.onCopyAnchorLinkClick,\n verify: () => this.isAnchorTarget,\n withSelection: true\n }, {\n icon: 'copy',\n text: 'Text.Context.Copy.Username',\n onClick: () => {\n copyTextToClipboard(this.target.innerHTML);\n },\n verify: () => this.isUsernameTarget,\n withSelection: true\n }, {\n icon: 'copy',\n text: 'Text.Context.Copy.Hashtag',\n onClick: () => {\n copyTextToClipboard(this.target.innerHTML);\n },\n verify: () => this.target.classList.contains('anchor-hashtag'),\n withSelection: true\n }, {\n icon: 'link',\n text: 'MessageContext.CopyMessageLink1',\n onClick: this.onCopyLinkClick,\n verify: async() => await this.managers.appPeersManager.isChannel(this.peerId) && !this.message.pFlags.is_outgoing\n }, {\n icon: 'pin',\n text: 'Message.Context.Pin',\n onClick: this.onPinClick,\n verify: async() => !this.message.pFlags.is_outgoing &&\n this.message._ !== 'messageService' &&\n !this.message.pFlags.pinned &&\n await this.managers.appPeersManager.canPinMessage(this.peerId) &&\n this.chat.type !== 'scheduled'\n }, {\n icon: 'unpin',\n text: 'Message.Context.Unpin',\n onClick: this.onUnpinClick,\n verify: async() => (this.message as Message.message).pFlags.pinned && await this.managers.appPeersManager.canPinMessage(this.peerId)\n }, {\n icon: 'download',\n text: 'MediaViewer.Context.Download',\n onClick: () => {\n appDownloadManager.downloadToDisc({media: getMediaFromMessage(this.message)});\n },\n verify: () => {\n if(!canSaveMessageMedia(this.message) || this.noForwards) {\n return false;\n }\n\n const isPhoto: boolean = !!((this.message as Message.message).media as MessageMedia.messageMediaPhoto)?.photo;\n let isGoodType = false\n\n if(isPhoto) {\n isGoodType = true;\n } else {\n const doc: MyDocument = ((this.message as Message.message).media as MessageMedia.messageMediaDocument)?.document as any;\n if(!doc) return false;\n // isGoodType = doc.type && (['gif', 'video', 'audio', 'voice', 'sticker'] as MyDocument['type'][]).includes(doc.type)\n isGoodType = true;\n }\n\n let hasTarget = !!IS_TOUCH_SUPPORTED;\n\n if(isGoodType) hasTarget ||= !!findUpClassName(this.target, 'document') || !!findUpClassName(this.target, 'audio') || !!findUpClassName(this.target, 'media-sticker-wrapper') || !!findUpClassName(this.target, 'media-photo') || !!findUpClassName(this.target, 'media-video');\n\n return isGoodType && hasTarget;\n }\n }, {\n icon: 'checkretract',\n text: 'Chat.Poll.Unvote',\n onClick: this.onRetractVote,\n verify: () => {\n const poll = (this.message as any).media?.poll as Poll;\n return poll && poll.chosenIndexes.length && !poll.pFlags.closed && !poll.pFlags.quiz;\n }/* ,\n cancelEvent: true */\n }, {\n icon: 'stop',\n text: 'Chat.Poll.Stop',\n onClick: this.onStopPoll,\n verify: async() => {\n const poll = (this.message as any).media?.poll;\n return await this.managers.appMessagesManager.canEditMessage(this.message, 'poll') && poll && !poll.pFlags.closed && !this.message.pFlags.is_outgoing;\n }/* ,\n cancelEvent: true */\n }, {\n icon: 'forward',\n text: 'Forward',\n onClick: this.onForwardClick, // let forward the message if it's outgoing but not ours (like a changelog)\n verify: () => !this.noForwards && this.chat.type !== 'scheduled' && (!this.message.pFlags.is_outgoing || this.message.fromId === SERVICE_PEER_ID) && this.message._ !== 'messageService'\n }, {\n icon: 'forward',\n text: 'Message.Context.Selection.Forward',\n onClick: this.onForwardClick,\n verify: () => this.chat.selection.selectionForwardBtn &&\n this.isSelected &&\n !this.chat.selection.selectionForwardBtn.hasAttribute('disabled'),\n notDirect: () => true,\n withSelection: true\n }, {\n icon: 'flag',\n text: 'ReportChat',\n onClick: () => {\n new PopupReportMessages(this.peerId, [this.mid]);\n },\n verify: async() => !this.message.pFlags.out && this.message._ === 'message' && !this.message.pFlags.is_outgoing && await this.managers.appPeersManager.isChannel(this.peerId),\n notDirect: () => true,\n withSelection: true\n }, {\n icon: 'select',\n text: 'Message.Context.Select',\n onClick: this.onSelectClick,\n verify: () => !(this.message as Message.messageService).action && !this.isSelected && this.isSelectable,\n notDirect: () => true,\n withSelection: true\n }, {\n icon: 'select',\n text: 'Message.Context.Selection.Clear',\n onClick: this.onClearSelectionClick,\n verify: () => this.isSelected,\n notDirect: () => true,\n withSelection: true\n }, {\n onClick: () => {\n if(this.viewerPeerId) {\n this.chat.appImManager.setInnerPeer({\n peerId: this.viewerPeerId\n });\n } else if(this.canOpenReactedList) {\n new PopupReactedList(this.message as Message.message);\n } else {\n return false;\n }\n },\n verify: async() => !this.peerId.isUser() && (!!(this.message as Message.message).reactions?.recent_reactions?.length || await this.managers.appMessagesManager.canViewMessageReadParticipants(this.message)),\n notDirect: () => true,\n localName: 'views'\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick,\n verify: async() => this.managers.appMessagesManager.canDeleteMessage(this.message)\n }, {\n icon: 'delete danger',\n text: 'Message.Context.Selection.Delete',\n onClick: this.onDeleteClick,\n verify: () => this.isSelected && !this.chat.selection.selectionDeleteBtn.hasAttribute('disabled'),\n notDirect: () => true,\n withSelection: true\n }, {\n icon: 'info',\n text: 'Chat.Message.Sponsored.What',\n onClick: () => {\n new PopupSponsored();\n },\n verify: () => false,\n isSponsored: true\n }, {\n // icon: 'smile',\n text: 'Loading',\n onClick: () => {\n this.emojiInputsPromise.then((inputs) => {\n new PopupStickers(inputs, true).show();\n });\n },\n verify: () => !!this.getUniqueCustomEmojisFromMessage().length,\n notDirect: () => true,\n localName: 'emojis'\n }];\n }\n\n private getMessageWithText() {\n return (this.albumMessages && getAlbumText(this.albumMessages)) || this.message;\n }\n\n private getUniqueCustomEmojisFromMessage() {\n const docIds: DocId[] = [];\n\n const message = this.getMessageWithText();\n\n const entities = (message as Message.message).entities;\n if(entities) {\n const filtered = entities.filter((entity) => entity._ === 'messageEntityCustomEmoji') as MessageEntity.messageEntityCustomEmoji[];\n docIds.push(...filtered.map((entity) => entity.document_id));\n }\n\n const reactions = (message as Message.message).reactions;\n if(reactions) {\n const results = reactions.results.filter((reactionCount) => reactionCount.reaction._ === 'reactionCustomEmoji');\n docIds.push(...results.map((reactionCount) => (reactionCount.reaction as Reaction.reactionCustomEmoji).document_id));\n }\n\n return filterUnique(docIds);\n }\n\n private async init() {\n this.cleanup();\n this.setButtons();\n\n const filteredButtons = await this.filterButtons(this.buttons);\n if(!filteredButtons.length) {\n return;\n }\n\n const element = this.element = await ButtonMenu({\n buttons: filteredButtons,\n listenerSetter: this.listenerSetter\n });\n element.id = 'bubble-contextmenu';\n element.classList.add('contextmenu');\n\n const viewsButton = filteredButtons.find((button) => button.localName === 'views');\n if(viewsButton) {\n const reactions = (this.message as Message.message).reactions;\n const recentReactions = reactions?.recent_reactions;\n const isViewingReactions = !!recentReactions?.length;\n const participantsCount = await this.managers.appMessagesManager.canViewMessageReadParticipants(this.message) ?\n ((await this.managers.appPeersManager.getPeer(this.peerId)) as MTChat.chat).participants_count :\n undefined;\n const reactedLength = reactions ? reactions.results.reduce((acc, r) => acc + r.count, 0) : undefined;\n\n viewsButton.element.classList.add('tgico-' + (isViewingReactions ? 'reactions' : 'checks'));\n const i18nElem = new I18n.IntlElement({\n key: isViewingReactions ? (\n participantsCount === undefined ? 'Chat.Context.ReactedFast' : 'Chat.Context.Reacted'\n ) : 'NobodyViewed',\n args: isViewingReactions ? (\n participantsCount === undefined ? [reactedLength] : [participantsCount, participantsCount]\n ) : undefined,\n element: viewsButton.textElement\n });\n\n let fakeText: HTMLElement;\n if(isViewingReactions) {\n if(participantsCount === undefined) {\n fakeText = i18n('Chat.Context.ReactedFast', [reactedLength]);\n } else {\n fakeText = i18n(\n recentReactions.length === participantsCount ? 'Chat.Context.ReactedFast' : 'Chat.Context.Reacted',\n [recentReactions.length, participantsCount]\n );\n }\n } else {\n fakeText = i18n('Loading');\n }\n\n fakeText.classList.add('btn-menu-item-text-fake');\n viewsButton.element.append(fakeText);\n\n const AVATAR_SIZE = 22;\n const MAX_AVATARS = 3;\n const PADDING_PER_AVATAR = 1.125;\n i18nElem.element.style.visibility = 'hidden';\n i18nElem.element.style.paddingRight = isViewingReactions ? PADDING_PER_AVATAR * Math.min(MAX_AVATARS, recentReactions.length) + 'rem' : '1rem';\n const middleware = this.middleware.get();\n this.managers.appMessagesManager.getMessageReactionsListAndReadParticipants(this.message as Message.message).then((result) => {\n if(!middleware()) {\n return;\n }\n\n if(fakeText) {\n fakeText.remove();\n }\n\n const reactions = result.combined;\n const reactedLength = participantsCount === undefined ?\n result.reactionsCount :\n (\n isViewingReactions ?\n reactions.filter((reaction) => reaction.reaction).length :\n reactions.length\n );\n\n let fakeElem: HTMLElement;\n if(reactions.length === 1) {\n fakeElem = new PeerTitle({\n peerId: reactions[0].peerId,\n onlyFirstName: true,\n dialog: false\n }).element;\n\n if(!isViewingReactions || result.readParticipants.length <= 1) {\n this.viewerPeerId = reactions[0].peerId;\n }\n } else if(isViewingReactions) {\n const isFull = reactedLength === reactions.length || participantsCount === undefined;\n fakeElem = i18n(\n isFull ? 'Chat.Context.ReactedFast' : 'Chat.Context.Reacted',\n isFull ? [reactedLength] : [reactedLength, reactions.length]\n );\n } else {\n if(!reactions.length) {\n i18nElem.element.style.visibility = '';\n } else {\n fakeElem = i18n('MessageSeen', [reactions.length]);\n }\n }\n\n if(fakeElem) {\n fakeElem.style.paddingRight = PADDING_PER_AVATAR * Math.min(MAX_AVATARS, reactedLength) + 'rem';\n fakeElem.classList.add('btn-menu-item-text-fake');\n viewsButton.element.append(fakeElem);\n }\n\n if(reactions.length) {\n const avatars = new StackedAvatars({avatarSize: AVATAR_SIZE});\n avatars.render(recentReactions ? recentReactions.map((r) => getPeerId(r.peer_id)) : reactions.map((reaction) => reaction.peerId));\n viewsButton.element.append(avatars.container);\n\n // if(reactions.length > 1) {\n // if(isViewingReactions) {\n this.canOpenReactedList = true;\n // }\n }\n });\n }\n\n let menuPadding: MenuPositionPadding;\n let reactionsMenu: ChatReactionsMenu;\n let reactionsMenuPosition: 'horizontal' | 'vertical';\n if(\n this.message._ === 'message' &&\n !this.chat.selection.isSelecting &&\n !this.message.pFlags.is_outgoing &&\n !this.message.pFlags.is_scheduled &&\n !this.message.pFlags.local\n ) {\n reactionsMenuPosition = (IS_APPLE || IS_TOUCH_SUPPORTED)/* && false */ ? 'horizontal' : 'vertical';\n reactionsMenu = this.reactionsMenu = new ChatReactionsMenu(this.managers, reactionsMenuPosition, this.middleware);\n reactionsMenu.init(await this.managers.appMessagesManager.getGroupsFirstMessage(this.message));\n // element.prepend(reactionsMenu.widthContainer);\n\n const size = 36;\n const margin = 8;\n const totalSize = size + margin;\n const paddingLeft = 0, paddingRight = 0;\n if(reactionsMenuPosition === 'vertical') {\n menuPadding = {\n top: paddingLeft,\n // bottom: 36, // positionMenu will detect it itself somehow\n left: totalSize\n };\n } else {\n menuPadding = {\n top: totalSize,\n right: paddingRight,\n left: paddingLeft\n };\n }\n }\n\n const emojisButton = filteredButtons.find((button) => button.localName === 'emojis');\n if(emojisButton) {\n emojisButton.element.classList.add('is-multiline');\n emojisButton.element.parentElement.insertBefore(document.createElement('hr'), emojisButton.element);\n\n const setPadding = () => {\n menuPadding ??= {};\n menuPadding.bottom = 24;\n };\n\n const docIds = this.getUniqueCustomEmojisFromMessage();\n const inputsPromise = this.emojiInputsPromise = deferredPromise();\n\n await this.managers.appEmojiManager.getCachedCustomEmojiDocuments(docIds).then(async(docs) => {\n const p = async(docs: Document.document[]) => {\n const s: Map = new Map();\n docs.forEach((doc) => {\n if(!doc || s.has(doc.stickerSetInput.id)) {\n return;\n }\n\n s.set(doc.stickerSetInput.id, doc.stickerSetInput);\n });\n\n const inputs = [...s.values()];\n inputsPromise.resolve(inputs);\n if(s.size === 1) {\n const result = await this.managers.acknowledged.appStickersManager.getStickerSet(inputs[0]);\n const promise = result.result.then((set) => {\n const el = i18n('MessageContainsEmojiPack', [wrapEmojiText(set.set.title)]);\n replaceContent(emojisButton.textElement, el);\n });\n\n return result.cached ? promise : (setPadding(), undefined);\n }\n\n replaceContent(emojisButton.textElement, i18n('MessageContainsEmojiPacks', [s.size]));\n };\n\n if(docs.some((doc) => !doc)) {\n setPadding();\n this.managers.appEmojiManager.getCustomEmojiDocuments(docIds).then(p);\n } else {\n return p(docs);\n }\n });\n // emojisButton.element.append(i18n('Loading'));\n }\n\n this.chat.container.append(element);\n\n return {\n element,\n cleanup: () => {\n this.cleanup();\n reactionsMenu && reactionsMenu.cleanup();\n },\n destroy: () => {\n element.remove();\n reactionsMenu && reactionsMenu.widthContainer.remove();\n },\n menuPadding,\n reactionsMenu,\n reactionsMenuPosition\n };\n }\n\n private async getUrlToMessage() {\n if(this.peerId.isUser()) {\n return;\n }\n\n let threadMessage: Message.message;\n const {peerId, mid} = this;\n const threadId = this.chat.threadId;\n if(this.chat.type === 'discussion') {\n threadMessage = (await this.managers.appMessagesManager.getMessageByPeer(peerId, threadId)) as Message.message;\n }\n\n const username = await this.managers.appPeersManager.getPeerUsername(threadMessage ? threadMessage.fromId : peerId);\n const msgId = getServerMessageId(mid);\n let url = 'https://t.me/';\n if(username) {\n url += username;\n if(threadMessage) url += `/${getServerMessageId(threadMessage.fwd_from.channel_post)}?comment=${msgId}`;\n else if(threadId) url += `/${getServerMessageId(threadId)}/${msgId}`;\n else url += '/' + msgId;\n } else {\n url += 'c/' + peerId.toChatId();\n if(threadMessage) url += `/${msgId}?thread=${getServerMessageId(threadMessage.mid)}`;\n else if(threadId) url += `/${getServerMessageId(threadId)}/${msgId}`;\n else url += '/' + msgId;\n }\n\n return {url, isPrivate: !username};\n }\n\n private async getSelectedMessagesText() {\n if(!isSelectionEmpty()) {\n return '';\n }\n\n const mids = this.chat.selection.isSelecting ?\n [...this.chat.selection.selectedMids.get(this.peerId)].sort((a, b) => a - b) :\n [this.mid];\n\n const parts: string[] = await Promise.all(mids.map(async(mid) => {\n const message = (await this.chat.getMessage(mid)) as Message.message;\n return message?.message ? message.message + '\\n' : '';\n }));\n\n return parts.join('');\n }\n\n private onSendScheduledClick = async() => {\n if(this.chat.selection.isSelecting) {\n simulateClickEvent(this.chat.selection.selectionSendNowBtn);\n } else {\n new PopupSendNow(this.peerId, await this.chat.getMidsByMid(this.mid));\n }\n };\n\n private onReplyClick = () => {\n this.chat.input.initMessageReply(this.mid);\n };\n\n private onFaveStickerClick = (unfave?: boolean) => {\n const docId = ((this.message as Message.message).media as MessageMedia.messageMediaDocument).document.id;\n this.managers.appStickersManager.faveSticker(docId, unfave);\n };\n\n private onEditClick = () => {\n const message = this.getMessageWithText();\n this.chat.input.initMessageEditing(this.isTargetAGroupedItem ? this.mid : message.mid);\n };\n\n private onCopyClick = async() => {\n if(isSelectionEmpty()) {\n copyTextToClipboard(this.selectedMessagesText);\n } else {\n document.execCommand('copy');\n // cancelSelection();\n }\n };\n\n private onCopyAnchorLinkClick = () => {\n copyTextToClipboard((this.target as HTMLAnchorElement).href);\n };\n\n private onCopyLinkClick = () => {\n const {url, isPrivate} = this.linkToMessage;\n const key: LangPackKey = isPrivate ? 'LinkCopiedPrivateInfo' : 'LinkCopied';\n toast(I18n.format(key, true));\n copyTextToClipboard(url);\n };\n\n private onPinClick = () => {\n new PopupPinMessage(this.peerId, this.mid);\n };\n\n private onUnpinClick = () => {\n new PopupPinMessage(this.peerId, this.mid, true);\n };\n\n private onRetractVote = () => {\n this.managers.appPollsManager.sendVote(this.message as Message.message, []);\n };\n\n private onStopPoll = () => {\n this.managers.appPollsManager.stopPoll(this.message as Message.message);\n };\n\n private onForwardClick = async() => {\n if(this.chat.selection.isSelecting) {\n simulateClickEvent(this.chat.selection.selectionForwardBtn);\n } else {\n const peerId = this.peerId;\n const mids = this.isTargetAGroupedItem ? [this.mid] : await this.chat.getMidsByMid(this.mid);\n new PopupForward({\n [peerId]: mids\n });\n }\n };\n\n private onSelectClick = () => {\n this.chat.selection.toggleByElement(findUpClassName(this.target, 'grouped-item') || findUpClassName(this.target, 'bubble'));\n };\n\n private onClearSelectionClick = () => {\n this.chat.selection.cancelSelection();\n };\n\n private onDeleteClick = async() => {\n if(this.chat.selection.isSelecting) {\n simulateClickEvent(this.chat.selection.selectionDeleteBtn);\n } else {\n new PopupDeleteMessages(this.peerId, this.isTargetAGroupedItem ? [this.mid] : await this.chat.getMidsByMid(this.mid), this.chat.type);\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 contextMenuController from '../../helpers/contextMenuController';\nimport {attachContextMenuListener} from '../../helpers/dom/attachContextMenuListener';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport rootScope from '../../lib/rootScope';\nimport {ButtonMenuItemOptions, ButtonMenuSync} from '../buttonMenu';\n\nexport default class SendMenu {\n public sendMenu: HTMLElement;\n private sendMenuButtons: (ButtonMenuItemOptions & {verify: () => boolean})[];\n private type: 'schedule' | 'reminder';\n\n constructor(options: {\n onSilentClick: () => void,\n onScheduleClick: () => void,\n listenerSetter?: ListenerSetter,\n openSide: string,\n onContextElement: HTMLElement,\n onOpen?: () => boolean\n }) {\n this.sendMenuButtons = [{\n icon: 'mute',\n text: 'Chat.Send.WithoutSound',\n onClick: options.onSilentClick,\n verify: () => this.type === 'schedule'\n }, {\n icon: 'schedule',\n text: 'Chat.Send.ScheduledMessage',\n onClick: options.onScheduleClick,\n verify: () => this.type === 'schedule'\n }, {\n icon: 'schedule',\n text: 'Chat.Send.SetReminder',\n onClick: options.onScheduleClick,\n verify: () => this.type === 'reminder'\n }];\n\n this.sendMenu = ButtonMenuSync({buttons: this.sendMenuButtons, listenerSetter: options.listenerSetter});\n this.sendMenu.classList.add('menu-send', options.openSide);\n\n attachContextMenuListener({\n element: options.onContextElement,\n callback: (e) => {\n if(options.onOpen && !options.onOpen()) {\n return;\n }\n\n this.sendMenuButtons.forEach((button) => {\n button.element.classList.toggle('hide', !button.verify());\n });\n\n cancelEvent(e);\n contextMenuController.openBtnMenu(this.sendMenu);\n },\n listenerSetter: options.listenerSetter\n });\n }\n\n public setPeerId(peerId: PeerId) {\n this.type = peerId === rootScope.myId ? 'reminder' : 'schedule';\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 PopupElement from '.';\nimport CheckboxField from '../checkboxField';\nimport InputField from '../inputField';\nimport RadioField from '../radioField';\nimport Scrollable from '../scrollable';\nimport SendContextMenu from '../chat/sendContextMenu';\nimport I18n, {_i18n} from '../../lib/langPack';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport isInputEmpty from '../../helpers/dom/isInputEmpty';\nimport whichChild from '../../helpers/dom/whichChild';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport {Poll} from '../../layer';\nimport getRichValueWithCaret from '../../helpers/dom/getRichValueWithCaret';\n\nconst MAX_LENGTH_QUESTION = 255;\nconst MAX_LENGTH_OPTION = 100;\nconst MAX_LENGTH_SOLUTION = 200;\n\nexport default class PopupCreatePoll extends PopupElement {\n private questionInputField: InputField;\n private questions: HTMLElement;\n protected scrollable: Scrollable;\n private tempId = 0;\n\n private anonymousCheckboxField: CheckboxField;\n private multipleCheckboxField: PopupCreatePoll['anonymousCheckboxField'];\n private quizCheckboxField: PopupCreatePoll['anonymousCheckboxField'];\n\n private correctAnswers: Uint8Array[];\n private quizSolutionField: InputField;\n private optionInputFields: InputField[];\n\n constructor(private chat: Chat) {\n super('popup-create-poll popup-new-media', {closable: true, withConfirm: 'Create', body: true, title: 'NewPoll'});\n this.construct();\n }\n\n private async construct() {\n this.questionInputField = new InputField({\n placeholder: 'AskAQuestion',\n label: 'AskAQuestion',\n name: 'question',\n maxLength: MAX_LENGTH_QUESTION\n });\n\n this.listenerSetter.add(this.questionInputField.input)('input', () => {\n this.handleChange();\n });\n\n this.optionInputFields = [];\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 });\n\n sendMenu.setPeerId(this.chat.peerId);\n\n this.header.append(sendMenu.sendMenu);\n }\n\n this.header.append(this.questionInputField.container);\n\n const hr = document.createElement('hr');\n const d = document.createElement('div');\n d.classList.add('caption');\n _i18n(d, 'PollOptions');\n\n this.questions = document.createElement('form');\n this.questions.classList.add('poll-create-questions');\n\n const dd = document.createElement('div');\n dd.classList.add('poll-create-settings');\n\n const settingsCaption = document.createElement('div');\n settingsCaption.classList.add('caption');\n _i18n(settingsCaption, 'Settings');\n\n if(!(await this.chat.managers.appPeersManager.isBroadcast(this.chat.peerId))) {\n this.anonymousCheckboxField = new CheckboxField({\n text: 'NewPoll.Anonymous',\n name: 'anonymous'\n });\n this.anonymousCheckboxField.input.checked = true;\n dd.append(this.anonymousCheckboxField.label);\n }\n\n this.multipleCheckboxField = new CheckboxField({\n text: 'NewPoll.MultipleChoice',\n name: 'multiple'\n });\n this.quizCheckboxField = new CheckboxField({\n text: 'NewPoll.Quiz',\n name: 'quiz'\n });\n\n this.listenerSetter.add(this.multipleCheckboxField.input)('change', () => {\n const checked = this.multipleCheckboxField.input.checked;\n this.quizCheckboxField.input.toggleAttribute('disabled', checked);\n });\n\n this.listenerSetter.add(this.quizCheckboxField.input)('change', () => {\n const checked = this.quizCheckboxField.input.checked;\n\n (Array.from(this.questions.children) as HTMLElement[]).map((el) => {\n el.classList.toggle('radio-field', checked);\n });\n\n if(!checked) {\n this.correctAnswers = undefined;\n this.quizSolutionField.setValueSilently('');\n }\n\n quizElements.forEach((el) => el.classList.toggle('hide', !checked));\n\n this.multipleCheckboxField.input.toggleAttribute('disabled', checked);\n this.handleChange();\n });\n\n dd.append(this.multipleCheckboxField.label, this.quizCheckboxField.label);\n\n const quizElements: HTMLElement[] = [];\n\n const quizSolutionCaption = document.createElement('div');\n quizSolutionCaption.classList.add('caption');\n _i18n(quizSolutionCaption, 'AccDescrQuizExplanation');\n\n const quizHr = document.createElement('hr');\n\n const quizSolutionContainer = document.createElement('div');\n quizSolutionContainer.classList.add('poll-create-questions');\n\n this.quizSolutionField = new InputField({\n placeholder: 'NewPoll.Explanation.Placeholder',\n label: 'NewPoll.Explanation.Placeholder',\n name: 'solution',\n maxLength: MAX_LENGTH_SOLUTION\n });\n\n this.listenerSetter.add(this.questionInputField.input)('input', () => {\n this.handleChange();\n });\n\n const quizSolutionSubtitle = document.createElement('div');\n quizSolutionSubtitle.classList.add('subtitle');\n _i18n(quizSolutionSubtitle, 'AddAnExplanationInfo');\n\n quizSolutionContainer.append(this.quizSolutionField.container, quizSolutionSubtitle);\n\n quizElements.push(quizHr, quizSolutionCaption, quizSolutionContainer);\n quizElements.forEach((el) => el.classList.add('hide'));\n\n this.body.parentElement.insertBefore(hr, this.body);\n this.body.append(d, this.questions, document.createElement('hr'), settingsCaption, dd, ...quizElements);\n\n attachClickEvent(this.btnConfirm, this.onSubmitClick, {listenerSetter: this.listenerSetter});\n\n this.scrollable = new Scrollable(this.body);\n this.appendMoreField();\n\n this.onEscape = () => {\n return !this.getFilledAnswers().length;\n };\n\n this.handleChange();\n }\n\n private getFilledAnswers() {\n const answers = Array.from(this.questions.children).map((el, idx) => {\n const input = el.querySelector('.input-field-input') as HTMLElement;\n return input instanceof HTMLInputElement ? input.value : getRichValueWithCaret(input, false, false).value;\n }).filter((v) => !!v.trim());\n\n return answers;\n }\n\n private onSubmitClick = () => {\n this.send();\n };\n\n private validate() {\n const question = this.questionInputField.value;\n if(!question) {\n return false;\n }\n\n if(question.length > MAX_LENGTH_QUESTION) {\n return false;\n }\n\n if(this.quizCheckboxField.input.checked && !this.correctAnswers?.length) {\n return false;\n }\n\n const answers = this.getFilledAnswers();\n if(answers.length < 2) {\n return false;\n }\n\n const tooLongOption = answers.find((a) => a.length > MAX_LENGTH_OPTION);\n if(tooLongOption) {\n return false;\n }\n\n const {value: quizSolution} = getRichValueWithCaret(this.quizSolutionField.input, false, false);\n if(quizSolution.length > MAX_LENGTH_SOLUTION) {\n return false;\n }\n\n return true;\n }\n\n private handleChange() {\n const valid = this.validate();\n this.btnConfirm.toggleAttribute('disabled', !valid);\n }\n\n public async send(force = false) {\n const question = this.questionInputField.value;\n\n const answers = this.getFilledAnswers();\n\n const {value: quizSolution, entities: quizSolutionEntities} = getRichValueWithCaret(this.quizSolutionField.input, true, false);\n\n if(this.chat.type === 'scheduled' && !force) {\n this.chat.input.scheduleSending(() => {\n this.send(true);\n });\n\n return;\n }\n\n this.hide();\n\n // const randomID = [nextRandomInt(0xFFFFFFFF), nextRandomInt(0xFFFFFFFF)];\n // const randomIDS = bigint(randomID[0]).shiftLeft(32).add(bigint(randomID[1])).toString();\n\n const pFlags: Poll['pFlags'] = {};\n\n if(this.anonymousCheckboxField && !this.anonymousCheckboxField.input.checked) {\n pFlags.public_voters = true;\n }\n\n if(this.multipleCheckboxField.input.checked) {\n pFlags.multiple_choice = true;\n }\n\n if(this.quizCheckboxField.input.checked) {\n pFlags.quiz = true;\n }\n\n const poll: Poll = {\n _: 'poll',\n pFlags,\n question,\n answers: answers.map((value, idx) => {\n return {\n _: 'pollAnswer',\n text: value,\n option: new Uint8Array([idx])\n };\n }),\n id: undefined\n };\n // poll.id = randomIDS;\n\n const inputMediaPoll = await this.chat.managers.appPollsManager.getInputMediaPoll(poll, this.correctAnswers, quizSolution, quizSolutionEntities);\n\n // console.log('Will try to create poll:', inputMediaPoll);\n\n this.chat.managers.appMessagesManager.sendOther(this.chat.peerId, inputMediaPoll, {\n ...this.chat.getMessageSendingParams()\n });\n\n if(this.chat.input.helperType === 'reply') {\n this.chat.input.clearHelper();\n }\n\n this.chat.input.onMessageSent(false, false);\n }\n\n onInput = (e: Event) => {\n const target = e.target as HTMLInputElement;\n\n const radioLabel = findUpTag(target, 'LABEL');\n const isEmpty = isInputEmpty(target);\n if(!isEmpty) {\n target.parentElement.classList.add('is-filled');\n radioLabel.classList.remove('hidden-widget');\n radioLabel.firstElementChild.removeAttribute('disabled');\n }\n\n const isLast = !radioLabel.nextElementSibling;\n if(isLast && !isEmpty && this.questions.childElementCount < 10) {\n this.appendMoreField();\n }\n\n this.handleChange();\n };\n\n onDeleteClick = (e: MouseEvent) => {\n const target = e.target as HTMLSpanElement;\n const label = findUpTag(target, 'LABEL');\n const idx = whichChild(label);\n\n if(this.correctAnswers && this.correctAnswers[0][0] === idx) {\n this.correctAnswers = undefined;\n }\n\n label.remove();\n this.optionInputFields.splice(idx, 1);\n\n this.optionInputFields.forEach((inputField, idx) => {\n inputField.options.labelOptions.length = 0;\n inputField.options.labelOptions.push(idx + 1);\n const i18nElement = I18n.weakMap.get(inputField.label.firstElementChild as HTMLElement);\n i18nElement.update();\n });\n\n this.handleChange();\n };\n\n private appendMoreField() {\n const tempId = this.tempId++;\n const idx = this.questions.childElementCount + 1;\n const questionField = new InputField({\n placeholder: 'NewPoll.OptionsAddOption',\n label: 'NewPoll.OptionLabel',\n labelOptions: [idx],\n name: 'question-' + tempId,\n maxLength: MAX_LENGTH_OPTION\n });\n this.listenerSetter.add(questionField.input)('input', this.onInput);\n\n const radioField = new RadioField({\n text: '',\n name: 'question'\n });\n radioField.main.append(questionField.container);\n attachClickEvent(questionField.input, cancelEvent, {listenerSetter: this.listenerSetter});\n radioField.label.classList.add('hidden-widget');\n radioField.input.disabled = true;\n if(!this.quizCheckboxField.input.checked) {\n radioField.label.classList.remove('radio-field');\n }\n this.listenerSetter.add(radioField.input)('change', () => {\n const checked = radioField.input.checked;\n if(checked) {\n const idx = whichChild(radioField.label);\n this.correctAnswers = [new Uint8Array([idx])];\n this.handleChange();\n }\n });\n\n const deleteBtn = document.createElement('span');\n deleteBtn.classList.add('btn-icon', 'tgico-close');\n questionField.container.append(deleteBtn);\n\n attachClickEvent(deleteBtn, this.onDeleteClick, {listenerSetter: this.listenerSetter, once: true});\n\n this.questions.append(radioField.label);\n\n this.scrollable.scrollIntoViewNew({\n element: this.questions.lastElementChild as HTMLElement,\n position: 'center'\n });\n // this.scrollable.scrollTo(this.scrollable.scrollHeight, 'top', true, true);\n\n this.optionInputFields.push(questionField);\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 pause from './schedulers/pause';\nimport {makeMediaSize} from './mediaSize';\nimport scaleMediaElement from './canvas/scaleMediaElement';\nimport preloadVideo from './preloadVideo';\n\nexport function createPosterFromMedia(media: HTMLVideoElement | HTMLImageElement) {\n let width: number, height: number;\n if(media instanceof HTMLVideoElement) {\n width = media.videoWidth;\n height = media.videoHeight;\n } else {\n width = media.naturalWidth;\n height = media.naturalHeight;\n }\n\n return scaleMediaElement({\n media,\n mediaSize: makeMediaSize(width, height),\n boxSize: makeMediaSize(320, 240),\n quality: .9\n });\n}\n\nexport function createPosterFromVideo(video: HTMLVideoElement): ReturnType {\n return new Promise((resolve, reject) => {\n video.onseeked = () => {\n video.onseeked = () => {\n createPosterFromMedia(video).then(resolve);\n\n video.onseeked = undefined;\n };\n\n video.currentTime = 0;\n };\n\n video.onerror = reject;\n video.currentTime = Math.min(video.duration, 1);\n });\n}\n\nexport async function createPosterForVideo(url: string) {\n const video = await preloadVideo(url);\n\n return Promise.race([\n pause(2000) as Promise,\n createPosterFromVideo(video)\n ]);\n}\n\n\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 {USING_BOMS} from '../helpers/dom/richInputHandler';\nimport BOM from '../helpers/string/bom';\nimport {_i18n} from '../lib/langPack';\nimport InputField, {InputFieldOptions} from './inputField';\nimport SetTransition from './singleTransition';\n\nconst USELESS_REG_EXP = new RegExp(`(${BOM})|()`, 'g');\n\nexport default class InputFieldAnimated extends InputField {\n public inputFake: HTMLElement;\n public onChangeHeight: (height: number) => void;\n\n // public onLengthChange: (length: number, isOverflow: boolean) => void;\n // protected wasInputFakeClientHeight: number;\n // protected showScrollDebounced: () => void;\n\n constructor(options?: InputFieldOptions) {\n super(options);\n\n this.input.addEventListener('input', () => {\n this.updateInnerHTML();\n this.onFakeInput();\n });\n\n if(options.placeholder) {\n _i18n(this.inputFake, options.placeholder, undefined, 'placeholder');\n }\n\n this.input.classList.add('scrollable', 'scrollable-y', 'no-scrollbar');\n // this.wasInputFakeClientHeight = 0;\n // this.showScrollDebounced = debounce(() => this.input.classList.remove('no-scrollbar'), 150, false, true);\n this.inputFake = document.createElement('div');\n // this.inputFake.contentEditable = 'true';\n this.inputFake.contentEditable = 'true';\n this.inputFake.tabIndex = -1;\n this.inputFake.className = this.input.className + ' input-field-input-fake';\n }\n\n public onFakeInput(setHeight = true) {\n const {scrollHeight: newHeight/* , clientHeight */} = this.inputFake;\n /* if(this.wasInputFakeClientHeight && this.wasInputFakeClientHeight !== clientHeight) {\n this.input.classList.add('no-scrollbar'); // ! ะฒ ัะฐั„ะฐั€ะธ ะผะพะถะตั‚ ะฒะพะพะฑั‰ะต ะฝะต ะฟะพัะฒะธั‚ัŒัั ัะบั€ะพะปะป ะฟะพัะปะต ะฐะฝะธะผะฐั†ะธะธ, ั‚ะฐะบ ะบะฐะบ ะตะผัƒ ะฝัƒะถะตะฝ ะฟะพะปะฝั‹ะน reflow ะฑะปะพะบะฐ ั overflow.\n this.showScrollDebounced();\n } */\n\n const currentHeight = +this.input.style.height.replace('px', '');\n if(currentHeight === newHeight) {\n return;\n }\n\n const TRANSITION_DURATION_FACTOR = 50;\n const transitionDuration = Math.round(\n TRANSITION_DURATION_FACTOR * Math.log(Math.abs(newHeight - currentHeight))\n );\n\n // this.wasInputFakeClientHeight = clientHeight;\n this.input.style.transitionDuration = `${transitionDuration}ms`;\n\n if(setHeight) {\n this.onChangeHeight?.(newHeight);\n this.input.style.height = newHeight ? newHeight + 'px' : '';\n }\n\n const className = 'is-changing-height';\n SetTransition({\n element: this.input,\n className,\n forwards: true,\n duration: transitionDuration,\n onTransitionEnd: () => {\n this.input.classList.remove(className);\n }\n });\n }\n\n protected updateInnerHTML(innerHTML = this.input.innerHTML) {\n innerHTML = innerHTML.replace(//, '')\n .replace(/().+?\\/custom-emoji-element>/g, '$1')\n\n if(USING_BOMS) {\n innerHTML = innerHTML.replace(USELESS_REG_EXP, '');\n }\n\n this.inputFake.innerHTML = innerHTML;\n }\n\n public setValueSilently(value: Parameters[0], fromSet?: boolean) {\n super.setValueSilently(value, fromSet);\n\n this.updateInnerHTML();\n if(!fromSet) {\n this.onFakeInput();\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 Chat from '../chat/chat';\nimport type {SendFileDetails} from '../../lib/appManagers/appMessagesManager';\nimport PopupElement from '.';\nimport Scrollable from '../scrollable';\nimport {toast} from '../toast';\nimport SendContextMenu from '../chat/sendContextMenu';\nimport {createPosterFromMedia, createPosterFromVideo} from '../../helpers/createPoster';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport I18n, {FormatterArguments, i18n, LangPackKey} from '../../lib/langPack';\nimport calcImageInBox from '../../helpers/calcImageInBox';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\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';\nimport createVideo from '../../helpers/dom/createVideo';\nimport prepareAlbum from '../prepareAlbum';\nimport {makeMediaSize, MediaSize} from '../../helpers/mediaSize';\nimport {ThumbCache} from '../../lib/storages/thumbs';\nimport onMediaLoad from '../../helpers/onMediaLoad';\nimport apiManagerProxy from '../../lib/mtproto/mtprotoworker';\nimport {THUMB_TYPE_FULL} from '../../lib/mtproto/mtproto_config';\nimport wrapDocument from '../wrappers/document';\nimport createContextMenu from '../../helpers/dom/createContextMenu';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport wrapMediaSpoiler, {toggleMediaSpoiler} from '../wrappers/mediaSpoiler';\nimport {MiddlewareHelper} from '../../helpers/middleware';\nimport {AnimationItemGroup} from '../animationIntersector';\nimport scaleMediaElement from '../../helpers/canvas/scaleMediaElement';\nimport {doubleRaf} from '../../helpers/schedulers';\nimport defineNotNumerableProperties from '../../helpers/object/defineNotNumerableProperties';\nimport {Photo, PhotoSize} from '../../layer';\nimport {getPreviewBytesFromURL} from '../../helpers/bytes/getPreviewURLFromBytes';\nimport {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\nimport ButtonMenuToggle from '../buttonMenuToggle';\nimport partition from '../../helpers/array/partition';\nimport InputFieldAnimated from '../inputFieldAnimated';\n\ntype SendFileParams = SendFileDetails & {\n file?: File,\n scaledBlob?: Blob,\n noSound?: boolean,\n itemDiv: HTMLElement,\n mediaSpoiler?: HTMLElement,\n middlewareHelper: MiddlewareHelper\n // strippedBytes?: PhotoSize.photoStrippedSize['bytes']\n};\n\nlet currentPopup: PopupNewMedia;\n\nconst MAX_WIDTH = 400 - 16;\n\nexport function getCurrentNewMediaPopup() {\n return currentPopup;\n}\n\nexport default class PopupNewMedia extends PopupElement {\n private mediaContainer: HTMLElement;\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 messageInputField: InputFieldAnimated;\n private captionLengthMax: number;\n\n private animationGroup: AnimationItemGroup;\n private _scrollable: Scrollable;\n private inputContainer: HTMLDivElement;\n\n constructor(\n private chat: Chat,\n private files: File[],\n willAttachType: PopupNewMedia['willAttach']['type'],\n private ignoreInputValue?: boolean\n ) {\n super('popup-send-photo popup-new-media', {\n closable: true,\n withConfirm: 'Modal.Send',\n confirmShortcutIsSendShortcut: true,\n body: true,\n title: true,\n scrollable: true\n });\n\n this.animationGroup = '';\n this.construct(willAttachType);\n }\n\n private async construct(willAttachType: PopupNewMedia['willAttach']['type']) {\n this.willAttach = {\n type: willAttachType,\n sendFileDetails: [],\n group: true\n };\n\n const captionMaxLength = await this.managers.apiManager.getLimit('caption');\n this.captionLengthMax = captionMaxLength;\n\n attachClickEvent(this.btnConfirm, () => this.send(), {listenerSetter: this.listenerSetter});\n\n const btnMenu = await ButtonMenuToggle({\n listenerSetter: this.listenerSetter,\n direction: 'bottom-left',\n buttons: [{\n icon: 'image',\n text: 'Popup.Attach.AsMedia',\n onClick: () => this.changeType('media'),\n verify: () => this.hasAnyMedia() && this.willAttach.type === 'document'\n }, {\n icon: 'document',\n text: 'SendAsFile',\n onClick: () => this.changeType('document'),\n verify: () => this.files.length === 1 && this.willAttach.type !== 'document'\n }, {\n icon: 'document',\n text: 'SendAsFiles',\n onClick: () => this.changeType('document'),\n verify: () => this.files.length > 1 && this.willAttach.type !== 'document'\n }, {\n icon: 'groupmedia',\n text: 'Popup.Attach.GroupMedia',\n onClick: () => this.changeGroup(true),\n verify: () => !this.willAttach.group && this.canGroupSomething()\n }, {\n icon: 'groupmediaoff',\n text: 'Popup.Attach.UngroupMedia',\n onClick: () => this.changeGroup(false),\n verify: () => this.willAttach.group && this.canGroupSomething()\n }, {\n icon: 'mediaspoiler',\n text: 'EnablePhotoSpoiler',\n onClick: () => this.changeSpoilers(true),\n verify: () => this.canToggleSpoilers(true, true)\n }, {\n icon: 'mediaspoiler',\n text: 'Popup.Attach.EnableSpoilers',\n onClick: () => this.changeSpoilers(true),\n verify: () => this.canToggleSpoilers(true, false)\n }, {\n icon: 'mediaspoileroff',\n text: 'DisablePhotoSpoiler',\n onClick: () => this.changeSpoilers(false),\n verify: () => this.canToggleSpoilers(false, true)\n }, {\n icon: 'mediaspoileroff',\n text: 'Popup.Attach.RemoveSpoilers',\n onClick: () => this.changeSpoilers(false),\n verify: () => this.canToggleSpoilers(false, false)\n }]\n });\n\n this.header.append(btnMenu);\n\n this.btnConfirm.remove();\n\n this.mediaContainer = document.createElement('div');\n this.mediaContainer.classList.add('popup-photo');\n this.scrollable.container.append(this.mediaContainer);\n\n const inputContainer = this.inputContainer = document.createElement('div');\n inputContainer.classList.add('popup-input-container');\n\n const c = document.createElement('div');\n c.classList.add('popup-input-inputs', 'input-message-container');\n\n this.messageInputField = new InputFieldAnimated({\n placeholder: 'PreviewSender.CaptionPlaceholder',\n name: 'message',\n withLinebreaks: true,\n maxLength: this.captionLengthMax\n });\n\n this.listenerSetter.add(this.scrollable.container)('scroll', this.onScroll);\n this.listenerSetter.add(this.messageInputField.input)('scroll', this.onScroll);\n\n this.messageInputField.input.classList.replace('input-field-input', 'input-message-input');\n this.messageInputField.inputFake.classList.replace('input-field-input', 'input-message-input');\n\n c.append(this.messageInputField.input, this.messageInputField.inputFake);\n inputContainer.append(c, this.btnConfirm);\n\n if(!this.ignoreInputValue) {\n this.messageInputField.value = this.wasInputValue = this.chat.input.messageInputField.input.innerHTML;\n this.chat.input.messageInputField.value = '';\n }\n\n this.container.append(inputContainer);\n\n this.attachFiles();\n\n this.addEventListener('close', () => {\n this.files.length = 0;\n this.willAttach.sendFileDetails.length = 0;\n\n if(currentPopup === this) {\n currentPopup = undefined;\n }\n });\n\n let target: HTMLElement, isMedia: boolean, item: SendFileParams;\n createContextMenu({\n buttons: [{\n icon: 'mediaspoiler',\n text: 'EnablePhotoSpoiler',\n onClick: () => {\n this.applyMediaSpoiler(item);\n },\n verify: () => isMedia && !item.mediaSpoiler\n }, {\n icon: 'mediaspoileroff',\n text: 'DisablePhotoSpoiler',\n onClick: () => {\n this.removeMediaSpoiler(item);\n },\n verify: () => !!(isMedia && item.mediaSpoiler)\n }],\n listenTo: this.mediaContainer,\n listenerSetter: this.listenerSetter,\n findElement: (e) => {\n target = findUpClassName(e.target, 'popup-item');\n isMedia = target.classList.contains('popup-item-media');\n item = this.willAttach.sendFileDetails.find((i) => i.itemDiv === target);\n return target;\n }\n });\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: 'top-left',\n onContextElement: this.btnConfirm,\n listenerSetter: this.listenerSetter\n });\n\n sendMenu.setPeerId(this.chat.peerId);\n\n this.container.append(sendMenu.sendMenu);\n }\n\n currentPopup = this;\n }\n\n private onScroll = () => {\n const {input} = this.messageInputField;\n this.scrollable.onAdditionalScroll();\n if(input.scrollTop > 0 && input.scrollHeight > 130) {\n this.scrollable.container.classList.remove('scrolled-bottom');\n }\n };\n\n private async applyMediaSpoiler(item: SendFileParams, noAnimation?: boolean) {\n const middleware = item.middlewareHelper.get();\n const {width: widthStr, height: heightStr} = item.itemDiv.style;\n\n let width: number, height: number;\n if(item.itemDiv.classList.contains('album-item')) {\n const {width: containerWidthStr, height: containerHeightStr} = item.itemDiv.parentElement.style;\n const containerWidth = parseInt(containerWidthStr);\n const containerHeight = parseInt(containerHeightStr);\n\n width = +widthStr.slice(0, -1) / 100 * containerWidth;\n height = +heightStr.slice(0, -1) / 100 * containerHeight;\n } else {\n width = parseInt(widthStr);\n height = parseInt(heightStr);\n }\n\n const {url} = await scaleMediaElement({\n media: item.itemDiv.firstElementChild as HTMLImageElement,\n boxSize: makeMediaSize(40, 40),\n mediaSize: makeMediaSize(width, height),\n toDataURL: true,\n quality: 0.2\n });\n\n const strippedBytes = getPreviewBytesFromURL(url);\n const photoSize: PhotoSize.photoStrippedSize = {\n _: 'photoStrippedSize',\n bytes: strippedBytes,\n type: 'i'\n };\n\n item.strippedBytes = strippedBytes;\n\n const photo: Photo.photo = {\n _: 'photo',\n sizes: [\n photoSize\n ],\n id: 0,\n access_hash: 0,\n date: 0,\n dc_id: 0,\n file_reference: [],\n pFlags: {}\n };\n\n const mediaSpoiler = await wrapMediaSpoiler({\n middleware,\n width,\n height,\n animationGroup: this.animationGroup,\n media: photo\n });\n\n if(!middleware()) {\n return;\n }\n\n if(!noAnimation) {\n mediaSpoiler.classList.add('is-revealing');\n }\n\n item.mediaSpoiler = mediaSpoiler;\n item.itemDiv.append(mediaSpoiler);\n\n await doubleRaf();\n if(!middleware()) {\n return;\n }\n\n toggleMediaSpoiler({\n mediaSpoiler,\n reveal: false\n });\n }\n\n private removeMediaSpoiler(item: SendFileParams) {\n toggleMediaSpoiler({\n mediaSpoiler: item.mediaSpoiler,\n reveal: true,\n destroyAfter: true\n });\n\n item.mediaSpoiler = undefined;\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 partition() {\n const [media, files] = partition(this.willAttach.sendFileDetails, (d) => MEDIA_MIME_TYPES_SUPPORTED.has(d.file.type));\n return {\n media,\n files\n };\n }\n\n private mediaCount() {\n return this.partition().media.length;\n }\n\n private hasAnyMedia() {\n return this.mediaCount() > 0;\n }\n\n private canGroupSomething() {\n const {media, files} = this.partition();\n return media.length > 1 || files.length > 1;\n }\n\n private canToggleSpoilers(toggle: boolean, single: boolean) {\n let good = this.willAttach.type === 'media' && this.hasAnyMedia();\n if(single && good) {\n good = this.files.length === 1;\n }\n\n if(good) {\n const media = this.willAttach.sendFileDetails\n .filter((d) => MEDIA_MIME_TYPES_SUPPORTED.has(d.file.type))\n const mediaWithSpoilers = media.filter((d) => d.mediaSpoiler);\n\n good = single ? true : media.length > 1;\n\n if(good) {\n good = toggle ? media.length !== mediaWithSpoilers.length : media.length === mediaWithSpoilers.length;\n }\n }\n\n return good;\n }\n\n private changeType(type: PopupNewMedia['willAttach']['type']) {\n this.willAttach.type = type;\n this.attachFiles();\n }\n\n public changeGroup(group: boolean) {\n this.willAttach.group = group;\n this.attachFiles();\n }\n\n public changeSpoilers(toggle: boolean) {\n this.partition().media.forEach((item) => {\n if(toggle && !item.mediaSpoiler) {\n this.applyMediaSpoiler(item);\n } else if(!toggle && item.mediaSpoiler) {\n this.removeMediaSpoiler(item);\n }\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 const {input} = this.messageInputField;\n if(target !== input) {\n if(target.tagName === 'INPUT' || target.isContentEditable) {\n return;\n }\n\n input.focus();\n placeCaretAtEnd(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.messageInputField.value;\n if(caption.length > this.captionLengthMax) {\n toast(I18n.format('Error.PreviewSender.CaptionTooLong', true));\n return;\n }\n\n const willAttach = this.willAttach;\n willAttach.isMedia = willAttach.type === 'media' || undefined;\n const {sendFileDetails, isMedia} = willAttach;\n\n const {peerId, input} = this.chat;\n\n const {length} = sendFileDetails;\n const sendingParams = this.chat.getMessageSendingParams();\n this.iterate((sendFileParams) => {\n if(caption && sendFileParams.length !== length) {\n this.managers.appMessagesManager.sendText(peerId, caption, {\n ...sendingParams,\n clearDraft: true\n });\n\n caption = undefined;\n }\n\n const d: SendFileDetails[] = sendFileParams.map((params) => {\n return {\n ...params,\n file: params.scaledBlob || params.file,\n spoiler: !!params.mediaSpoiler\n };\n });\n\n const w = {\n ...willAttach,\n sendFileDetails: d\n };\n\n this.managers.appMessagesManager.sendAlbum(peerId, Object.assign({\n ...sendingParams,\n caption,\n isMedia,\n clearDraft: true\n }, w));\n\n caption = undefined;\n });\n\n input.replyToMsgId = this.chat.threadId;\n input.onMessageSent();\n this.wasInputValue = undefined;\n\n this.hide();\n }\n\n private modifyMimeTypeForTelegram(mimeType: string) {\n return mimeType === 'image/webp' ? 'image/jpeg' : mimeType;\n }\n\n private async scaleImageForTelegram(image: HTMLImageElement, mimeType: string, convertWebp?: boolean) {\n const PHOTO_SIDE_LIMIT = 2560;\n let url = image.src, scaledBlob: Blob;\n if(\n mimeType !== 'image/gif' &&\n (Math.max(image.naturalWidth, image.naturalHeight) > PHOTO_SIDE_LIMIT || (convertWebp && mimeType === 'image/webp'))\n ) {\n const {blob} = await scaleMediaElement({\n media: image,\n boxSize: makeMediaSize(PHOTO_SIDE_LIMIT, PHOTO_SIDE_LIMIT),\n mediaSize: makeMediaSize(image.naturalWidth, image.naturalHeight),\n mimeType: this.modifyMimeTypeForTelegram(mimeType) as any\n });\n\n scaledBlob = blob;\n URL.revokeObjectURL(url);\n url = await apiManagerProxy.invoke('createObjectURL', blob);\n await renderImageFromUrlPromise(image, url);\n }\n\n return scaledBlob && {url, blob: scaledBlob};\n }\n\n private async attachMedia(params: SendFileParams) {\n const {itemDiv} = params;\n itemDiv.classList.add('popup-item-media');\n\n const file = params.file;\n const isVideo = file.type.startsWith('video/');\n\n if(isVideo) {\n const video = createVideo();\n video.src = params.objectURL = await apiManagerProxy.invoke('createObjectURL', file);\n video.autoplay = true;\n video.controls = false;\n video.muted = true;\n\n video.addEventListener('timeupdate', () => {\n video.pause();\n }, {once: true});\n\n itemDiv.append(video);\n\n let error: Error;\n try {\n await onMediaLoad(video);\n } catch(err) {\n error = err as any;\n }\n\n params.width = video.videoWidth;\n params.height = video.videoHeight;\n params.duration = Math.floor(video.duration);\n\n if(error) {\n throw error;\n }\n\n const audioDecodedByteCount = (video as any).webkitAudioDecodedByteCount;\n if(audioDecodedByteCount !== undefined) {\n params.noSound = !audioDecodedByteCount;\n }\n\n const thumb = await createPosterFromVideo(video);\n params.thumb = {\n url: await apiManagerProxy.invoke('createObjectURL', thumb.blob),\n ...thumb\n };\n } else {\n const img = new Image();\n itemDiv.append(img);\n const url = params.objectURL = await apiManagerProxy.invoke('createObjectURL', file);\n\n await renderImageFromUrlPromise(img, url);\n const mimeType = params.file.type;\n const scaled = await this.scaleImageForTelegram(img, mimeType, true);\n if(scaled) {\n params.objectURL = scaled.url;\n params.scaledBlob = scaled.blob;\n }\n\n params.width = img.naturalWidth;\n params.height = img.naturalHeight;\n\n if(file.type === 'image/gif') {\n params.noSound = true;\n\n return Promise.all([\n getGifDuration(img).then((duration) => {\n params.duration = Math.ceil(duration);\n }),\n\n createPosterFromMedia(img).then(async(thumb) => {\n params.thumb = {\n url: await apiManagerProxy.invoke('createObjectURL', thumb.blob),\n ...thumb\n };\n })\n ]).then(() => {});\n }\n }\n }\n\n private async attachDocument(params: SendFileParams): ReturnType {\n const {itemDiv} = params;\n itemDiv.classList.add('popup-item-document');\n const file = params.file;\n\n const isPhoto = file.type.startsWith('image/');\n const isAudio = file.type.startsWith('audio/');\n if(isPhoto || isAudio || file.size < 20e6) {\n params.objectURL ||= await apiManagerProxy.invoke('createObjectURL', file);\n }\n\n let img: HTMLImageElement;\n if(isPhoto) {\n img = new Image();\n await renderImageFromUrlPromise(img, params.objectURL);\n const scaled = await this.scaleImageForTelegram(img, params.file.type);\n if(scaled) {\n params.objectURL = scaled.url;\n }\n }\n\n const doc = {\n _: 'document',\n file: file,\n file_name: file.name || '',\n size: file.size,\n type: isPhoto ? 'photo' : 'doc'\n } as MyDocument;\n\n let cacheContext: ThumbCache;\n if(params.objectURL) {\n cacheContext = {\n url: params.objectURL,\n downloaded: file.size,\n type: THUMB_TYPE_FULL\n };\n }\n\n const docDiv = await 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 cacheContext\n });\n\n if(isPhoto) {\n params.width = img.naturalWidth;\n params.height = img.naturalHeight;\n }\n\n itemDiv.append(docDiv);\n }\n\n private attachFile = (file: File) => {\n const willAttach = this.willAttach;\n const shouldCompress = this.shouldCompress(file.type);\n\n const itemDiv = document.createElement('div');\n itemDiv.classList.add('popup-item');\n\n const params: SendFileParams = {\n file\n } as any;\n\n // do not pass these properties to worker\n defineNotNumerableProperties(params, ['scaledBlob', 'middlewareHelper', 'itemDiv', 'mediaSpoiler']);\n\n params.middlewareHelper = this.middlewareHelper.get().create();\n params.itemDiv = itemDiv;\n\n const promise = shouldCompress ? this.attachMedia(params) : this.attachDocument(params);\n willAttach.sendFileDetails.push(params);\n return promise.catch((err) => {\n itemDiv.style.backgroundColor = '#000';\n console.error('error rendering file', err);\n });\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.ignoreInputValue && 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(params: SendFileParams) {\n if(this.shouldCompress(params.file.type)) {\n const size = calcImageInBox(params.width, params.height, MAX_WIDTH, 320);\n params.itemDiv.style.width = size.width + 'px';\n params.itemDiv.style.height = size.height + 'px';\n }\n\n this.mediaContainer.append(params.itemDiv);\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\n const oldSendFileDetails = willAttach.sendFileDetails.splice(0, willAttach.sendFileDetails.length);\n oldSendFileDetails.forEach((params) => {\n params.middlewareHelper.destroy();\n });\n\n const promises = files.map((file) => this.attachFile(file));\n\n Promise.all(promises).then(() => {\n mediaContainer.replaceChildren();\n\n if(!files.length) {\n return;\n }\n\n this.setTitle();\n\n this.iterate((sendFileDetails) => {\n const shouldCompress = this.shouldCompress(sendFileDetails[0].file.type);\n if(shouldCompress && 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: MAX_WIDTH,\n minWidth: 100,\n spacing: 4\n });\n\n mediaContainer.append(albumContainer);\n } else {\n sendFileDetails.forEach((params) => {\n this.appendMediaToContainer(params);\n });\n }\n\n if(!shouldCompress) {\n return;\n }\n\n sendFileDetails.forEach((params) => {\n const oldParams = oldSendFileDetails.find((o) => o.file === params.file);\n if(!oldParams) {\n return;\n }\n\n if(oldParams.mediaSpoiler) {\n this.applyMediaSpoiler(params, true);\n }\n });\n });\n }).then(() => {\n this.onRender();\n this.onScroll();\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 fastSmoothScroll from '../fastSmoothScroll';\nimport cancelEvent from './cancelEvent';\nimport {attachClickEvent, detachClickEvent} from './clickEvent';\nimport findUpAsChild from './findUpAsChild';\nimport findUpClassName from './findUpClassName';\n\ntype ArrowKey = 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight';\nconst HANDLE_EVENT = 'keydown';\nconst ACTIVE_CLASS_NAME = 'active';\n\nconst AXIS_Y_KEYS: ArrowKey[] = ['ArrowUp', 'ArrowDown'];\nconst AXIS_X_KEYS: ArrowKey[] = ['ArrowLeft', 'ArrowRight'];\n\nexport type ListNavigationOptions = {\n list: HTMLElement,\n type: 'xy' | 'x' | 'y',\n onSelect: (target: Element) => void | boolean | Promise,\n once: boolean,\n waitForKey?: string[]\n};\n\nexport default function attachListNavigation({list, type, onSelect, once, waitForKey}: ListNavigationOptions) {\n let waitForKeySet = waitForKey?.length ? new Set(waitForKey) : undefined;\n const keyNames = new Set(type === 'xy' ? AXIS_Y_KEYS.concat(AXIS_X_KEYS) : (type === 'x' ? AXIS_X_KEYS : AXIS_Y_KEYS));\n\n let target: Element;\n const getCurrentTarget = () => {\n return target || list.querySelector('.' + ACTIVE_CLASS_NAME) || list.firstElementChild;\n };\n\n const setCurrentTarget = (_target: Element, scrollTo: boolean) => {\n if(target === _target) {\n return;\n }\n\n let hadTarget = false;\n if(target) {\n hadTarget = true;\n target.classList.remove(ACTIVE_CLASS_NAME);\n }\n\n target = _target;\n if(!target) return;\n target.classList.add(ACTIVE_CLASS_NAME);\n\n if(hadTarget && scrollable && scrollTo) {\n fastSmoothScroll({\n container: scrollable,\n element: target as HTMLElement,\n position: 'center',\n forceDuration: 100,\n axis: type === 'x' ? 'x' : 'y'\n });\n }\n };\n\n const getNextTargetX = (currentTarget: Element, isNext: boolean) => {\n let nextTarget: Element;\n if(isNext) nextTarget = currentTarget.nextElementSibling || list.firstElementChild;\n else nextTarget = currentTarget.previousElementSibling || list.lastElementChild;\n\n return nextTarget;\n };\n\n const getNextTargetY = (currentTarget: Element, isNext: boolean) => {\n const property = isNext ? 'nextElementSibling' : 'previousElementSibling';\n const endProperty = isNext ? 'firstElementChild' : 'lastElementChild';\n const currentRect = currentTarget.getBoundingClientRect();\n\n let nextTarget = currentTarget[property] || list[endProperty];\n while(nextTarget !== currentTarget) {\n const targetRect = nextTarget.getBoundingClientRect();\n if(targetRect.x === currentRect.x && targetRect.y !== currentRect.y) {\n break;\n }\n\n nextTarget = nextTarget[property] || list[endProperty];\n }\n\n return nextTarget;\n };\n\n let handleArrowKey: (currentTarget: Element, key: ArrowKey) => Element;\n if(type === 'xy') { // flex-direction: row; flex-wrap: wrap;\n handleArrowKey = (currentTarget, key) => {\n if(key === 'ArrowUp' || key === 'ArrowDown') return getNextTargetY(currentTarget, key === 'ArrowDown');\n else return getNextTargetX(currentTarget, key === 'ArrowRight');\n };\n } else { // flex-direction: row | column;\n handleArrowKey = (currentTarget, key) => getNextTargetX(currentTarget, key === 'ArrowRight' || key === 'ArrowDown');\n }\n\n let onKeyDown = (e: KeyboardEvent) => {\n const key = e.key;\n if(!keyNames.has(key as any)) {\n if(key === 'Enter' || (type !== 'xy' && key === 'Tab')) {\n cancelEvent(e);\n fireSelect(getCurrentTarget());\n }\n\n return;\n }\n\n cancelEvent(e);\n\n if(list.childElementCount > 1) {\n let currentTarget = getCurrentTarget();\n currentTarget = handleArrowKey(currentTarget, key as any);\n setCurrentTarget(currentTarget, true);\n }\n };\n\n const scrollable = findUpClassName(list, 'scrollable');\n list.classList.add('navigable-list');\n\n const onMouseMove = (e: MouseEvent) => {\n const target = findUpAsChild(e.target as HTMLElement, list) as HTMLElement;\n if(!target) {\n return;\n }\n\n setCurrentTarget(target, false);\n };\n\n const onClick = (e: Event) => {\n cancelEvent(e); // cancel keyboard closening\n\n const target = findUpAsChild(e.target as HTMLElement, list) as HTMLElement;\n if(!target) {\n return;\n }\n\n setCurrentTarget(target, false);\n fireSelect(getCurrentTarget());\n };\n\n const fireSelect = async(target: Element) => {\n const canContinue = await onSelect(target);\n if(canContinue !== undefined ? !canContinue : once) {\n detach();\n }\n };\n\n let attached = false;\n const attach = () => {\n if(attached) return;\n attached = true;\n // const input = document.activeElement as HTMLElement;\n // input.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\n document.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\n list.addEventListener('mousemove', onMouseMove, {passive: true});\n attachClickEvent(list, onClick);\n };\n\n const detach = () => {\n if(!attached) return;\n attached = false;\n // input.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\n document.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\n list.removeEventListener('mousemove', onMouseMove);\n detachClickEvent(list, onClick);\n };\n\n const resetTarget = () => {\n if(waitForKeySet) return;\n setCurrentTarget(list.firstElementChild, false);\n };\n\n if(waitForKeySet) {\n const _onKeyDown = onKeyDown;\n onKeyDown = (e) => {\n if(waitForKeySet.has(e.key)) {\n cancelEvent(e);\n\n document.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\n onKeyDown = _onKeyDown;\n document.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\n\n waitForKeySet = undefined;\n resetTarget();\n }\n };\n } else {\n resetTarget();\n }\n\n attach();\n\n return {\n attach,\n detach,\n resetTarget\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 attachListNavigation, {ListNavigationOptions} from '../../helpers/dom/attachListNavigation';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport {IS_MOBILE} from '../../environment/userAgent';\nimport rootScope from '../../lib/rootScope';\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\nimport SetTransition from '../singleTransition';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport safeAssign from '../../helpers/object/safeAssign';\n\nexport default class AutocompleteHelper extends EventListenerBase<{\n hidden: () => void,\n visible: () => void,\n hiding: () => void\n}> {\n protected hidden = true;\n protected container: HTMLElement;\n protected list: HTMLElement;\n protected resetTarget: () => void;\n protected attach: () => void;\n protected detach: () => void;\n protected init?(): void;\n\n protected controller: AutocompleteHelperController;\n protected listType: 'xy' | 'x' | 'y';\n protected onSelect: ListNavigationOptions['onSelect'];\n protected waitForKey?: string[];\n\n protected navigationItem: NavigationItem;\n\n constructor(options: {\n appendTo: HTMLElement,\n controller?: AutocompleteHelper['controller'],\n listType: AutocompleteHelper['listType'],\n onSelect: AutocompleteHelper['onSelect'],\n waitForKey?: AutocompleteHelper['waitForKey']\n }) {\n super(false);\n\n safeAssign(this, options);\n\n this.container = document.createElement('div');\n this.container.classList.add('autocomplete-helper', 'z-depth-1');\n\n options.appendTo.append(this.container);\n\n this.attachNavigation();\n\n this.controller && this.controller.addHelper(this);\n }\n\n public toggleListNavigation(enabled: boolean) {\n if(enabled) {\n this.attach && this.attach();\n } else {\n this.detach && this.detach();\n }\n }\n\n protected onVisible = () => {\n if(this.detach) { // it can be so because 'visible' calls before animation's end\n this.detach();\n }\n\n const list = this.list;\n const {attach, detach, resetTarget} = attachListNavigation({\n list,\n type: this.listType,\n onSelect: this.onSelect,\n once: true,\n waitForKey: this.waitForKey\n });\n\n this.attach = attach;\n this.detach = detach;\n this.resetTarget = resetTarget;\n if(!IS_MOBILE && !this.navigationItem) {\n this.navigationItem = {\n type: 'autocomplete-helper',\n onPop: () => {\n this.navigationItem = undefined;\n this.toggle(true);\n },\n noBlurOnPop: true\n };\n\n appNavigationController.pushItem(this.navigationItem);\n }\n\n this.addEventListener('hidden', () => {\n this.resetTarget = undefined;\n this.attach = undefined;\n this.detach = undefined;\n\n list.innerHTML = '';\n detach();\n\n if(this.navigationItem) {\n appNavigationController.removeItem(this.navigationItem);\n this.navigationItem = undefined;\n }\n }, {once: true});\n };\n\n protected attachNavigation() {\n this.addEventListener('visible', this.onVisible);\n }\n\n public toggle(hide?: boolean, fromController = false, skipAnimation?: boolean) {\n if(this.init) {\n return;\n }\n\n if(hide === undefined) {\n hide = this.container.classList.contains('is-visible') && !this.container.classList.contains('backwards');\n }\n\n if(this.hidden === hide) {\n if(!hide) {\n this.dispatchEvent('visible'); // reset target and listener\n }\n\n return;\n }\n\n this.hidden = hide;\n\n if(!hide) {\n this.controller && this.controller.hideOtherHelpers(this);\n this.dispatchEvent('visible'); // fire it before so target will be set\n } else {\n if(this.navigationItem) {\n appNavigationController.removeItem(this.navigationItem);\n this.navigationItem = undefined;\n }\n\n if(!fromController && this.controller) {\n this.controller.hideOtherHelpers();\n }\n\n if(this.detach) { // force detach here\n this.detach();\n }\n }\n\n const useRafs = this.controller || hide ? 0 : 2;\n\n if(hide) {\n this.dispatchEvent('hiding');\n }\n\n SetTransition({\n element: this.container,\n className: 'is-visible',\n forwards: !hide,\n duration: rootScope.settings.animationsEnabled && !skipAnimation ? 300 : 0,\n onTransitionEnd: () => {\n this.hidden && this.dispatchEvent('hidden');\n },\n useRafs\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 Chat from './chat';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport preloadAnimatedEmojiSticker from '../../helpers/preloadAnimatedEmojiSticker';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport rootScope from '../../lib/rootScope';\nimport {EmoticonsDropdown} from '../emoticonsDropdown';\nimport {SuperStickerRenderer} from '../emoticonsDropdown/tabs/stickers';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport Scrollable from '../scrollable';\nimport attachStickerViewerListeners from '../stickerViewer';\nimport AutocompleteHelper from './autocompleteHelper';\nimport AutocompleteHelperController from './autocompleteHelperController';\n\nexport default class StickersHelper extends AutocompleteHelper {\n private scrollable: Scrollable;\n private superStickerRenderer: SuperStickerRenderer;\n private lazyLoadQueue: LazyLoadQueue;\n private onChangeScreen: () => void;\n private listenerSetter: ListenerSetter;\n\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n private chat: Chat,\n private managers: AppManagers\n ) {\n super({\n appendTo,\n controller,\n listType: 'xy',\n onSelect: async(target) => {\n return !(await EmoticonsDropdown.onMediaClick({target}, true));\n },\n waitForKey: ['ArrowUp', 'ArrowDown']\n });\n\n this.container.classList.add('stickers-helper');\n\n this.addEventListener('visible', () => {\n setTimeout(() => { // it is not rendered yet\n this.scrollable.container.scrollTop = 0;\n }, 0);\n\n rootScope.dispatchEvent('choosing_sticker', true);\n });\n\n this.addEventListener('hidden', () => {\n if(this.onChangeScreen) {\n mediaSizes.removeEventListener('changeScreen', this.onChangeScreen);\n this.onChangeScreen = undefined;\n\n this.listenerSetter.removeAll();\n this.listenerSetter = undefined;\n }\n\n rootScope.dispatchEvent('choosing_sticker', false);\n });\n }\n\n public checkEmoticon(emoticon: string) {\n const middleware = this.controller.getMiddleware();\n\n if(this.lazyLoadQueue) {\n this.lazyLoadQueue.clear();\n }\n\n preloadAnimatedEmojiSticker(emoticon);\n this.managers.appStickersManager.getStickersByEmoticon(emoticon)\n .then((stickers) => {\n if(!middleware()) {\n return;\n }\n\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n const container = this.list.cloneNode() as HTMLElement;\n\n let ready: Promise;\n\n this.lazyLoadQueue.clear();\n if(stickers.length) {\n ready = new Promise((resolve) => {\n const promises: Promise[] = [];\n stickers.forEach((sticker) => {\n container.append(this.superStickerRenderer.renderSticker(sticker as MyDocument, undefined, promises));\n });\n\n (Promise.all(promises) as Promise).finally(resolve);\n });\n } else {\n ready = Promise.resolve();\n }\n\n ready.then(() => {\n this.list.replaceWith(container);\n this.list = container;\n\n if(!this.onChangeScreen) {\n this.onChangeScreen = () => {\n const width = (this.list.childElementCount * mediaSizes.active.popupSticker.width) + (this.list.childElementCount - 1 * 1);\n this.list.style.width = width + 'px';\n };\n mediaSizes.addEventListener('changeScreen', this.onChangeScreen);\n\n this.listenerSetter = new ListenerSetter();\n attachStickerViewerListeners({listenTo: this.container, listenerSetter: this.listenerSetter});\n }\n\n this.onChangeScreen();\n\n this.toggle(!stickers.length);\n this.scrollable.scrollTop = 0;\n });\n });\n }\n\n public init() {\n this.list = document.createElement('div');\n this.list.classList.add('stickers-helper-stickers', 'super-stickers');\n\n this.container.append(this.list);\n\n this.scrollable = new Scrollable(this.container);\n this.lazyLoadQueue = new LazyLoadQueue();\n this.superStickerRenderer = new SuperStickerRenderer(this.lazyLoadQueue, this.chat.animationGroup, this.managers);\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 {SEND_WHEN_ONLINE_TIMESTAMP} from '../../lib/mtproto/constants';\nimport Button from '../button';\nimport PopupDatePicker from './datePicker';\n\nconst getMinDate = () => {\n const date = new Date();\n // date.setDate(date.getDate() - 1);\n date.setHours(0, 0, 0, 0);\n return date;\n};\n\nconst getMaxDate = () => {\n const date = new Date();\n date.setFullYear(date.getFullYear() + 1);\n date.setDate(date.getDate() - 1);\n return date;\n};\n\nconst checkDate = (date: Date) => {\n return date.getTime() > getMaxDate().getTime() ? new Date() : date;\n};\n\nexport default class PopupSchedule extends PopupDatePicker {\n constructor(initDate: Date, onPick: (timestamp: number) => void, canSendWhenOnline: boolean) {\n super(checkDate(initDate), onPick, {\n noButtons: true,\n noTitle: true,\n closable: true,\n withConfirm: true,\n minDate: getMinDate(),\n maxDate: getMaxDate(),\n withTime: true,\n showOverflowMonths: true,\n confirmShortcutIsSendShortcut: true,\n title: true\n });\n\n this.element.classList.add('popup-schedule');\n this.header.append(this.controlsDiv);\n this.title.replaceWith(this.monthTitle);\n this.body.append(this.btnConfirm);\n\n if(canSendWhenOnline) {\n const btnSendWhenOnline = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Schedule.SendWhenOnline'});\n this.body.append(btnSendWhenOnline);\n\n attachClickEvent(btnSendWhenOnline, () => {\n onPick(SEND_WHEN_ONLINE_TIMESTAMP);\n this.hide();\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 ChatInput from './input';\nimport {appendEmoji, getEmojiFromElement} from '../emoticonsDropdown/tabs/emoji';\nimport {ScrollableX} from '../scrollable';\nimport AutocompleteHelper from './autocompleteHelper';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nexport default class EmojiHelper extends AutocompleteHelper {\n private scrollable: ScrollableX;\n\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n chatInput: ChatInput,\n private managers: AppManagers\n ) {\n super({\n appendTo,\n controller,\n listType: 'x',\n onSelect: (target) => {\n chatInput.onEmojiSelected(getEmojiFromElement(target as any), true);\n }\n });\n\n this.container.classList.add('emoji-helper');\n }\n\n public init() {\n this.list = document.createElement('div');\n this.list.classList.add('emoji-helper-emojis', 'super-emojis');\n\n this.container.append(this.list);\n\n this.scrollable = new ScrollableX(this.container);\n\n this.addEventListener('visible', () => {\n setTimeout(() => { // it is not rendered yet\n this.scrollable.container.scrollLeft = 0;\n }, 0);\n });\n }\n\n public render(emojis: string[], waitForKey: boolean) {\n if(this.init) {\n if(!emojis.length) {\n return;\n }\n\n this.init();\n this.init = null;\n }\n\n emojis = emojis.slice(0, 80);\n\n if(emojis.length) {\n this.list.innerHTML = '';\n emojis.forEach((emoji) => {\n appendEmoji(emoji, this.list, false, true);\n });\n }\n\n this.waitForKey = waitForKey ? ['ArrowUp', 'ArrowDown'] : undefined;\n this.toggle(!emojis.length);\n\n /* window.requestAnimationFrame(() => {\n this.container.style.width = (3 * 2) + (emojis.length * 44) + 'px';\n }); */\n }\n\n public checkQuery(query: string, firstChar: string) {\n const middleware = this.controller.getMiddleware();\n this.managers.appEmojiManager.getBothEmojiKeywords().then(async() => {\n if(!middleware()) {\n return;\n }\n\n const q = query.replace(/^:/, '');\n const emojis = await this.managers.appEmojiManager.searchEmojis(q);\n if(!middleware()) {\n return;\n }\n\n this.render(emojis, firstChar !== ':');\n // console.log(emojis);\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 wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport AvatarElement from '../avatar';\nimport PeerTitle from '../peerTitle';\nimport Scrollable from '../scrollable';\nimport AutocompleteHelper from './autocompleteHelper';\nimport AutocompleteHelperController from './autocompleteHelperController';\n\nexport default class AutocompletePeerHelper extends AutocompleteHelper {\n protected static BASE_CLASS = 'autocomplete-peer-helper';\n protected static BASE_CLASS_LIST_ELEMENT = AutocompletePeerHelper.BASE_CLASS + '-list-element';\n private scrollable: Scrollable;\n\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n protected className: string,\n onSelect: (target: Element) => boolean | void\n ) {\n super({\n appendTo,\n controller,\n listType: 'y',\n onSelect\n });\n\n this.container.classList.add(AutocompletePeerHelper.BASE_CLASS, className);\n }\n\n public init() {\n this.list = document.createElement('div');\n this.list.classList.add(AutocompletePeerHelper.BASE_CLASS + '-list', this.className + '-list');\n\n this.container.append(this.list);\n\n this.scrollable = new Scrollable(this.container);\n\n this.addEventListener('visible', () => {\n setTimeout(() => { // it is not rendered yet\n this.scrollable.container.scrollTop = 0;\n }, 0);\n });\n }\n\n public render(data: {peerId: PeerId, name?: string, description?: string}[], doNotShow?: boolean) {\n if(this.init) {\n if(!data.length) {\n return;\n }\n\n this.init();\n this.init = null;\n }\n\n if(data.length) {\n this.list.innerHTML = '';\n data.forEach((d) => {\n const div = AutocompletePeerHelper.listElement({\n className: this.className,\n peerId: d.peerId,\n name: d.name,\n description: d.description\n });\n\n this.list.append(div);\n });\n }\n\n if(!doNotShow) {\n this.toggle(!data.length);\n }\n }\n\n public static listElement(options: {\n className: string,\n peerId: PeerId,\n name?: string,\n description?: string\n }) {\n const BASE = AutocompletePeerHelper.BASE_CLASS_LIST_ELEMENT;\n options.className += '-list-element';\n\n const div = document.createElement('div');\n div.classList.add(BASE, options.className);\n div.dataset.peerId = '' + options.peerId;\n\n const avatar = new AvatarElement();\n avatar.classList.add('avatar-30', BASE + '-avatar', options.className + '-avatar');\n avatar.updateWithOptions({\n isDialog: false,\n peerId: options.peerId\n });\n\n const name = document.createElement('div');\n name.classList.add(BASE + '-name', options.className + '-name');\n if(!options.name) {\n name.append(new PeerTitle({\n peerId: options.peerId,\n dialog: false,\n onlyFirstName: false,\n plainText: false\n }).element);\n } else {\n setInnerHTML(name, wrapEmojiText(options.name));\n }\n\n div.append(avatar, name);\n\n if(options.description) {\n const description = document.createElement('div');\n description.classList.add(BASE + '-description', options.className + '-description');\n setInnerHTML(description, wrapEmojiText(options.description));\n div.append(description);\n }\n\n return div;\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 ChatInput from './input';\nimport type {BotInfo, ChatFull, UserFull} from '../../layer';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport AutocompletePeerHelper from './autocompletePeerHelper';\nimport SearchIndex from '../../lib/searchIndex';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nexport function processPeerFullForCommands(peerId: PeerId, full: ChatFull.chatFull | ChatFull.channelFull | UserFull.userFull, query?: string) {\n const botInfos: BotInfo.botInfo[] = [].concat(full.bot_info);\n let index: SearchIndex;\n\n if(query !== undefined) {\n index = new SearchIndex({\n ignoreCase: true\n });\n }\n\n type T = {peerId: PeerId, name: string, description: string, index: number, command: string};\n const commands: Map = new Map();\n botInfos.forEach((botInfo) => {\n if(!botInfo.commands) {\n return;\n }\n\n botInfo.commands.forEach(({command, description}, idx) => {\n const c = '/' + command;\n commands.set(command, {\n peerId: botInfo.user_id ? botInfo.user_id.toPeerId(false) : peerId,\n command: command,\n name: c,\n description: description,\n index: idx\n });\n\n if(index) {\n index.indexObject(command, c);\n }\n });\n });\n\n let out: T[];\n if(!index) {\n out = [...commands.values()];\n } else {\n const found = index.search(query);\n out = Array.from(found).map((command) => commands.get(command));\n }\n\n out = out.sort((a, b) => commands.get(a.command).index - commands.get(b.command).index);\n\n return out;\n}\n\nexport default class CommandsHelper extends AutocompletePeerHelper {\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n chatInput: ChatInput,\n private managers: AppManagers\n ) {\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 async checkQuery(query: string, peerId: PeerId) {\n if(!(await this.managers.appUsersManager.isBot(peerId))) {\n return false;\n }\n\n const middleware = this.controller.getMiddleware();\n this.managers.appProfileManager.getProfileByPeerId(peerId).then((full) => {\n if(!middleware()) {\n return;\n }\n\n const filtered = processPeerFullForCommands(peerId, full, query);\n this.render(filtered);\n // console.log('found commands', found, filtered);\n });\n\n return 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 {getMiddleware} from '../../helpers/middleware';\nimport AutocompleteHelper from './autocompleteHelper';\n\nexport default class AutocompleteHelperController {\n private helpers: Set = new Set();\n private middleware = getMiddleware();\n /* private tempId = 0;\n\n public incrementToggleCount() {\n return ++this.tempId;\n }\n\n public getToggleCount() {\n return this.tempId;\n } */\n\n public toggleListNavigation(enabled: boolean) {\n for(const helper of this.helpers) {\n helper.toggleListNavigation(enabled);\n }\n }\n\n public getMiddleware() {\n this.middleware.clean();\n return this.middleware.get();\n }\n\n public addHelper(helper: AutocompleteHelper) {\n this.helpers.add(helper);\n }\n\n public hideOtherHelpers(preserveHelper?: AutocompleteHelper) {\n this.helpers.forEach((helper) => {\n if(helper !== preserveHelper) {\n helper.toggle(true, true);\n }\n });\n\n if(!preserveHelper) {\n this.middleware.clean();\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 ChatInput from './input';\nimport type {MessageEntity} from '../../layer';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport AutocompletePeerHelper from './autocompletePeerHelper';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerActiveUsernames from '../../lib/appManagers/utils/peers/getPeerActiveUsernames';\nimport rootScope from '../../lib/rootScope';\n\nexport default class MentionsHelper extends AutocompletePeerHelper {\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n chatInput: ChatInput,\n private managers: AppManagers\n ) {\n super(\n appendTo,\n controller,\n 'mentions-helper',\n (target) => {\n const userId = (target as HTMLElement).dataset.peerId.toUserId();\n const user = Promise.resolve(managers.appUsersManager.getUser(userId)).then((user) => {\n let str = '', entity: MessageEntity;\n const usernames = getPeerActiveUsernames(user);\n if(usernames[0]) {\n str = '@' + usernames[0];\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\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.managers.appProfileManager.getMentions(peerId && peerId.toChatId(), trimmed, topMsgId).then(async(peerIds) => {\n if(!middleware()) return;\n\n peerIds = peerIds.filter((peerId) => peerId !== rootScope.myId);\n\n // const username = trimmed.slice(1).toLowerCase();\n\n const p = peerIds.map(async(peerId) => {\n const user = await this.managers.appUsersManager.getUser(peerId);\n const usernames = getPeerActiveUsernames(user);\n // if(usernames.length && usernames.some((_username) => _username.toLowerCase() === username)) { // hide full matched suggestion\n // return;\n // }\n\n return {\n peerId,\n description: usernames[0] ? '@' + usernames[0] : undefined\n };\n });\n\n this.render((await Promise.all(p)).filter(Boolean));\n });\n\n return 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 type ChatInput from './input';\nimport DropdownHover from '../../helpers/dropdownHover';\nimport {KeyboardButton, ReplyMarkup} from '../../layer';\nimport rootScope from '../../lib/rootScope';\nimport ListenerSetter, {Listener} from '../../helpers/listenerSetter';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport findUpAsChild from '../../helpers/dom/findUpAsChild';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {getHeavyAnimationPromise} from '../../hooks/useHeavyAnimationCheck';\nimport confirmationPopup from '../confirmationPopup';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport Scrollable from '../scrollable';\n\nexport default class ReplyKeyboard extends DropdownHover {\n private static BASE_CLASS = 'reply-keyboard';\n private appendTo: HTMLElement;\n private listenerSetter: ListenerSetter;\n private managers: AppManagers;\n private btnHover: HTMLElement;\n private peerId: PeerId;\n private touchListener: Listener;\n private chatInput: ChatInput;\n private scrollable: Scrollable;\n\n constructor(options: {\n listenerSetter: ListenerSetter,\n managers: AppManagers,\n appendTo: HTMLElement,\n btnHover: HTMLElement,\n chatInput: ChatInput\n }) {\n super({\n element: document.createElement('div')\n });\n\n safeAssign(this, options);\n\n this.element.classList.add(ReplyKeyboard.BASE_CLASS);\n this.element.style.display = 'none';\n\n this.scrollable = new Scrollable();\n this.element.append(this.scrollable.container);\n\n this.attachButtonListener(this.btnHover, this.listenerSetter);\n this.listenerSetter.add(rootScope)('history_reply_markup', async({peerId}) => {\n if(this.peerId === peerId) {\n if(this.checkAvailability() && this.isActive()) {\n await this.render();\n }\n\n getHeavyAnimationPromise().then(() => {\n this.checkForceReply();\n });\n }\n });\n }\n\n public init() {\n this.appendTo.append(this.element);\n\n this.listenerSetter.add(this)('open', async() => {\n await this.render();\n\n if(IS_TOUCH_SUPPORTED) {\n this.touchListener = this.listenerSetter.add(document.body)('touchstart', this.onBodyTouchStart, {passive: false, capture: true}) as any as Listener;\n this.listenerSetter.add(this)('close', () => {\n this.listenerSetter.remove(this.touchListener);\n }, {once: true});\n }\n });\n\n attachClickEvent(this.element, (e) => {\n const target = findUpClassName(e.target, 'btn');\n if(!target) {\n return;\n }\n\n const type = target.dataset.type as KeyboardButton['_'];\n const {peerId} = this;\n switch(type) {\n case 'keyboardButtonRequestPhone': {\n confirmationPopup({\n titleLangKey: 'ShareYouPhoneNumberTitle',\n button: {\n langKey: 'OK'\n },\n descriptionLangKey: 'AreYouSureShareMyContactInfoBot'\n }).then(() => {\n this.managers.appMessagesManager.sendContact(peerId, rootScope.myId);\n });\n break;\n }\n\n default: {\n this.managers.appMessagesManager.sendText(peerId, target.dataset.text);\n break;\n }\n }\n\n this.toggle(false);\n }, {listenerSetter: this.listenerSetter});\n\n return super.init();\n }\n\n private onBodyTouchStart = (e: TouchEvent) => {\n const target = e.touches[0].target as HTMLElement;\n if(!findUpAsChild(target, this.element) && target !== this.btnHover) {\n cancelEvent(e);\n this.toggle(false);\n }\n };\n\n public async checkForceReply() {\n const replyMarkup = await this.getReplyMarkup();\n if(replyMarkup._ === 'replyKeyboardForceReply' &&\n !replyMarkup.pFlags.hidden &&\n !replyMarkup.pFlags.used) {\n replyMarkup.pFlags.used = true;\n this.chatInput.initMessageReply(replyMarkup.mid);\n }\n }\n\n private async getReplyMarkup(): Promise {\n return (await this.managers.appMessagesManager.getHistoryStorageTransferable(this.peerId)).replyMarkup ?? {\n _: 'replyKeyboardHide',\n pFlags: {}\n };\n }\n\n public async render(replyMarkup?: ReplyMarkup.replyKeyboardMarkup) {\n if(replyMarkup === undefined) {\n replyMarkup = await this.getReplyMarkup() as any;\n }\n\n this.scrollable.container.replaceChildren();\n\n for(const row of replyMarkup.rows) {\n const div = document.createElement('div');\n div.classList.add(ReplyKeyboard.BASE_CLASS + '-row');\n\n for(const button of row.buttons) {\n const btn = document.createElement('button');\n btn.classList.add(ReplyKeyboard.BASE_CLASS + '-button', 'btn');\n setInnerHTML(btn, wrapEmojiText(button.text));\n btn.dataset.text = button.text;\n btn.dataset.type = button._;\n div.append(btn);\n }\n\n this.scrollable.container.append(div);\n }\n }\n\n public async checkAvailability(replyMarkup?: ReplyMarkup) {\n if(replyMarkup === undefined) {\n replyMarkup = await this.getReplyMarkup();\n }\n\n const hide = replyMarkup._ === 'replyKeyboardHide' || !(replyMarkup as ReplyMarkup.replyInlineMarkup).rows?.length;\n this.btnHover.classList.toggle('hide', hide);\n\n if(hide) {\n this.toggle(false);\n }\n\n return !hide;\n }\n\n public setPeer(peerId: PeerId) {\n this.peerId = peerId;\n\n this.checkAvailability();\n this.checkForceReply();\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';\nimport debounce from '../../helpers/schedulers/debounce';\nimport {WebDocument} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport Scrollable from '../scrollable';\nimport AutocompleteHelper from './autocompleteHelper';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport Button from '../button';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport {MyPhoto} from '../../lib/appManagers/appPhotosManager';\nimport assumeType from '../../helpers/assumeType';\nimport GifsMasonry from '../gifsMasonry';\nimport {SuperStickerRenderer} from '../emoticonsDropdown/tabs/stickers';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport readBlobAsDataURL from '../../helpers/blob/readBlobAsDataURL';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport renderMediaWithFadeIn from '../../helpers/dom/renderMediaWithFadeIn';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\nimport generateQId from '../../lib/appManagers/utils/inlineBots/generateQId';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport {AnimationItemGroup} from '../animationIntersector';\nimport wrapPhoto from '../wrappers/photo';\n\nconst ANIMATION_GROUP: AnimationItemGroup = 'INLINE-HELPER';\n// const GRID_ITEMS = 5;\n\nexport default class InlineHelper extends AutocompleteHelper {\n private scrollable: Scrollable;\n private lazyLoadQueue: LazyLoadQueue;\n private gifsMasonry: GifsMasonry;\n private superStickerRenderer: SuperStickerRenderer;\n private onChangeScreen: () => void;\n public checkQuery: (peerId: PeerId, username: string, query: string) => ReturnType;\n\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n private chat: Chat,\n private managers: AppManagers\n ) {\n super({\n appendTo,\n controller,\n listType: 'xy',\n waitForKey: ['ArrowUp', 'ArrowDown'],\n onSelect: (target) => {\n if(!target) return false; // can happen when there is only button\n const {peerId, botId, queryId} = this.list.dataset;\n return this.chat.input.getReadyToSend(() => {\n const queryAndResultIds = generateQId(queryId, (target as HTMLElement).dataset.resultId);\n this.managers.appInlineBotsManager.sendInlineResult(peerId.toPeerId(), botId, queryAndResultIds, {\n ...this.chat.getMessageSendingParams(),\n clearDraft: true\n });\n\n this.chat.input.onMessageSent(true, true);\n });\n }\n });\n\n this.container.classList.add('inline-helper');\n\n this.addEventListener('visible', () => {\n setTimeout(() => { // it is not rendered yet\n this.scrollable.container.scrollTop = 0;\n }, 0);\n });\n\n this.checkQuery = debounce(this._checkQuery, 200, true, true);\n\n this.addEventListener('hidden', () => {\n if(this.onChangeScreen) {\n mediaSizes.removeEventListener('changeScreen', this.onChangeScreen);\n this.onChangeScreen = undefined;\n }\n });\n }\n\n public _checkQuery = async(peerId: PeerId, username: string, query: string) => {\n const middleware = this.controller.getMiddleware();\n\n const peer = await this.managers.appUsersManager.resolveUsername(username);\n if(!middleware()) {\n throw 'PEER_CHANGED';\n }\n\n if(peer._ !== 'user' || !peer.pFlags.bot) {\n throw 'NOT_A_BOT';\n }\n\n const renderPromise = this.managers.appInlineBotsManager.getInlineResults(peerId, peer.id, query).then((botResults) => {\n if(!middleware()) {\n throw 'PEER_CHANGED';\n }\n\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n const list = this.list.cloneNode() as HTMLElement;\n list.dataset.peerId = '' + peerId;\n list.dataset.botId = '' + peer.id;\n list.dataset.queryId = '' + botResults.query_id;\n\n const gifsMasonry = new GifsMasonry(null, ANIMATION_GROUP, this.scrollable, false);\n\n this.lazyLoadQueue.clear();\n this.superStickerRenderer.clear();\n\n const loadPromises: Promise[] = [];\n const isGallery = !!botResults.pFlags.gallery;\n // botResults.results.length = 3;\n for(const item of botResults.results) {\n const container = document.createElement('div');\n container.classList.add('inline-helper-result');\n container.dataset.resultId = item.id;\n\n const preview = isGallery ? undefined : document.createElement('div');\n if(preview) {\n preview.classList.add('inline-helper-result-preview');\n\n container.append(preview);\n }\n\n list.append(container);\n\n if(!isGallery) {\n preview.classList.add('empty');\n setInnerHTML(preview, wrapEmojiText([...item.title.trim()][0]));\n\n const title = document.createElement('div');\n title.classList.add('inline-helper-result-title');\n setInnerHTML(title, wrapEmojiText(item.title));\n\n const description = document.createElement('div');\n description.classList.add('inline-helper-result-description');\n setInnerHTML(description, wrapRichText(item.description, {\n noCommands: true,\n noLinks: true\n }));\n\n container.append(title, description);\n\n const separator = document.createElement('div');\n separator.classList.add('inline-helper-separator');\n\n list.append(separator);\n } else {\n container.classList.add('grid-item');\n }\n\n if(item._ === 'botInlineResult') {\n if(item.thumb && item.thumb.mime_type.indexOf('image/') === 0) {\n let mediaContainer: HTMLElement;\n if(preview) {\n mediaContainer = document.createElement('div');\n preview.append(mediaContainer);\n } else {\n mediaContainer = container;\n }\n\n mediaContainer.classList.add('media-container');\n isGallery && mediaContainer.classList.add('no-border-radius');\n\n this.lazyLoadQueue.push({\n div: container,\n load: () => {\n return appDownloadManager.download({\n dcId: 4,\n location: {\n _: 'inputWebFileLocation',\n access_hash: (item.thumb as WebDocument.webDocument).access_hash,\n url: item.thumb.url\n },\n size: item.thumb.size,\n mimeType: item.thumb.mime_type\n }).then((blob) => {\n const image = new Image();\n image.classList.add('media-photo');\n readBlobAsDataURL(blob).then((dataURL) => {\n renderMediaWithFadeIn(mediaContainer, image, dataURL, true);\n });\n });\n }\n });\n }\n } else {\n const media = item.document as MyDocument || item.photo as MyPhoto;\n if((['sticker', 'gif'] as MyDocument['type'][]).includes((media as MyDocument)?.type) && isGallery) {\n assumeType(media);\n\n if(media.type === 'gif') {\n gifsMasonry.add(media, container);\n } else if(media.type === 'sticker') {\n container.classList.add('super-sticker');\n this.superStickerRenderer.renderSticker(media, container, loadPromises);\n if(media.animated) {\n this.superStickerRenderer.observeAnimated(container);\n }\n }\n } else if(media) {\n const size = isGallery ? 48 : undefined;\n isGallery && container.classList.add('no-border-radius');\n wrapPhoto({\n photo: media,\n container: isGallery ? container : preview,\n boxWidth: size,\n boxHeight: size,\n middleware,\n lazyLoadQueue: this.lazyLoadQueue,\n loadPromises\n });\n }\n }\n }\n\n return Promise.all(loadPromises).then(() => {\n if(!middleware()) {\n gifsMasonry.clear();\n return;\n }\n\n list.classList.toggle('is-gallery', isGallery);\n list.classList.toggle('super-stickers', isGallery);\n this.container.classList.toggle('is-gallery', isGallery);\n\n /* if(isGallery) {\n list.style.gridTemplateColumns = `repeat(${Math.min(botResults.results.length, 4)}, 1fr)`;\n }\n\n this.container.style.setProperty('width', isGallery ? `${Math.min(botResults.results.length, 4) * 25}%` : '', 'important'); */\n\n const parent = this.list.parentElement;\n parent.textContent = '';\n if(botResults.switch_pm) {\n const btnSwitchToPM = Button('btn-primary btn-secondary btn-primary-transparent primary');\n setInnerHTML(btnSwitchToPM, wrapEmojiText(botResults.switch_pm.text));\n attachClickEvent(btnSwitchToPM, (e) => {\n this.chat.appImManager.setInnerPeer({peerId});\n this.managers.appInlineBotsManager.switchToPM(peerId, peer.id, botResults.switch_pm.start_param);\n });\n parent.append(btnSwitchToPM);\n }\n parent.append(this.list = list);\n\n if(this.gifsMasonry) {\n this.gifsMasonry.detach();\n }\n this.gifsMasonry = gifsMasonry;\n gifsMasonry.attach();\n\n if(!this.onChangeScreen) {\n this.onChangeScreen = () => {\n if(this.list.classList.contains('is-gallery')) {\n const width = (this.list.childElementCount * mediaSizes.active.popupSticker.width) + (this.list.childElementCount - 1 * 1);\n this.list.style.width = width + 'px';\n } else {\n this.list.style.width = '';\n }\n };\n mediaSizes.addEventListener('changeScreen', this.onChangeScreen);\n }\n\n this.onChangeScreen();\n\n this.toggle(!botResults.results.length && !botResults.switch_pm);\n this.scrollable.scrollTop = 0;\n });\n });\n\n return {user: peer, renderPromise};\n };\n\n public init() {\n this.list = document.createElement('div');\n this.list.classList.add('inline-helper-results');\n\n this.container.append(this.list);\n\n this.scrollable = new Scrollable(this.container);\n this.lazyLoadQueue = new LazyLoadQueue();\n this.superStickerRenderer = new SuperStickerRenderer(this.lazyLoadQueue, ANIMATION_GROUP, this.managers);\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 ChatInput from './input';\nimport callbackify from '../../helpers/callbackify';\nimport AutocompletePeerHelper from './autocompletePeerHelper';\nimport {processPeerFullForCommands} from './commandsHelper';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nconst CLASS_NAME = 'bot-commands';\nexport default class ChatBotCommands extends AutocompletePeerHelper {\n private userId: UserId;\n\n constructor(\n appendTo: HTMLElement,\n chatInput: ChatInput,\n private managers: AppManagers\n ) {\n super(appendTo, undefined, CLASS_NAME, (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 this.toggle(true);\n });\n });\n }\n\n public setUserId(userId: UserId, middleware: () => boolean) {\n if(this.userId === userId && this.list?.childElementCount) {\n this.toggle(false);\n return;\n }\n\n this.userId = userId;\n return callbackify(this.managers.appProfileManager.getProfile(userId), (full) => {\n if(!middleware()) return;\n const filtered = processPeerFullForCommands(userId.toPeerId(false), full);\n\n const PADDING_TOP = 8;\n // const PADDING_BOTTOM = 8;\n const PADDING_BOTTOM = 24;\n const height = filtered.length * 50 + PADDING_TOP + PADDING_BOTTOM;\n this.container.style.setProperty('--height', height + 'px');\n\n this.render(filtered);\n\n // this.container.style.top =\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 {AckedResult} from '../lib/mtproto/superMessagePort';\nimport {Modify} from '../types';\n\nexport default async function modifyAckedResult(acked: AckedResult): Promise, {result: T | Promise}>> {\n return {\n cached: acked.cached,\n result: acked.cached ? await acked.result : acked.result\n };\n}\n\nexport function modifyAckedPromise(promise: Promise>) {\n return promise.then(modifyAckedResult);\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 indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport callbackify from '../../helpers/callbackify';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport {getMiddleware} from '../../helpers/middleware';\nimport {modifyAckedPromise} from '../../helpers/modifyAckedResult';\nimport {ChatFull} from '../../layer';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport {i18n} from '../../lib/langPack';\nimport {AckedResult} from '../../lib/mtproto/superMessagePort';\nimport rootScope from '../../lib/rootScope';\nimport AvatarElement from '../avatar';\nimport {ButtonMenuItemOptions, ButtonMenuSync} from '../buttonMenu';\nimport ButtonMenuToggle from '../buttonMenuToggle';\nimport PeerTitle from '../peerTitle';\nimport SetTransition from '../singleTransition';\nimport getChatMembersString from '../wrappers/getChatMembersString';\n\nconst SEND_AS_ANIMATION_DURATION = 300;\n\nexport default class ChatSendAs {\n private avatar: AvatarElement;\n private container: HTMLElement;\n private closeBtn: HTMLElement;\n private btnMenu: HTMLElement;\n private sendAsPeerIds: PeerId[];\n private sendAsPeerId: PeerId;\n private updatingPromise: ReturnType;\n private middleware: ReturnType;\n private listenerSetter: ListenerSetter;\n private peerId: PeerId;\n private addedListener: boolean;\n private buttons: ButtonMenuItemOptions[];\n\n constructor(\n private managers: AppManagers,\n private onReady: (container: HTMLElement, skipAnimation?: boolean) => void,\n private onChange: (sendAsPeerId: PeerId) => void\n ) {\n this.middleware = getMiddleware();\n this.listenerSetter = new ListenerSetter();\n this.construct();\n }\n\n private construct() {\n this.container = document.createElement('div');\n this.container.classList.add('new-message-send-as-container');\n\n this.closeBtn = document.createElement('div');\n this.closeBtn.classList.add('new-message-send-as-close', 'new-message-send-as-avatar', 'tgico-close');\n\n const sendAsButtons: ButtonMenuItemOptions[] = [{\n text: 'SendMessageAsTitle',\n onClick: undefined\n }];\n\n this.buttons = [];\n\n let previousAvatar: HTMLElement;\n const onSendAsMenuToggle = (visible: boolean) => {\n if(visible) {\n previousAvatar = this.avatar;\n }\n\n const isChanged = this.avatar !== previousAvatar;\n const useRafs = !visible && isChanged ? 2 : 0;\n\n SetTransition({\n element: this.closeBtn,\n className: 'is-visible',\n forwards: visible,\n duration: SEND_AS_ANIMATION_DURATION,\n useRafs\n });\n if(!isChanged) {\n SetTransition({\n element: previousAvatar,\n className: 'is-visible',\n forwards: !visible,\n duration: SEND_AS_ANIMATION_DURATION,\n useRafs\n });\n }\n };\n\n ButtonMenuToggle({\n buttonOptions: {noRipple: true},\n listenerSetter: this.listenerSetter,\n container: this.container,\n direction: 'top-right',\n buttons: sendAsButtons,\n onOpenBefore: () => {\n onSendAsMenuToggle(true);\n },\n onOpen: (e, btnMenu) => {\n sendAsButtons[0].element.classList.add('btn-menu-item-header');\n this.btnMenu = btnMenu as any;\n this.btnMenu.classList.add('scrollable', 'scrollable-y');\n this.btnMenu.append(...this.buttons.map((button) => button.element));\n },\n onClose: () => {\n onSendAsMenuToggle(false);\n },\n onCloseAfter: () => {\n this.btnMenu = undefined;\n }\n });\n\n this.container.append(this.closeBtn);\n }\n\n private async updateButtons(peerIds: PeerId[]) {\n const promises: Promise[] = peerIds.map(async(sendAsPeerId, idx) => {\n const textElement = document.createElement('div');\n\n const subtitle = document.createElement('div');\n subtitle.classList.add('btn-menu-item-subtitle');\n if(sendAsPeerId.isUser()) {\n subtitle.append(i18n('Chat.SendAs.PersonalAccount'));\n } else if(sendAsPeerId === this.peerId) {\n subtitle.append(i18n('VoiceChat.DiscussionGroup'));\n } else {\n subtitle.append(await getChatMembersString(sendAsPeerId.toChatId()));\n }\n\n textElement.append(\n new PeerTitle({peerId: sendAsPeerId}).element,\n subtitle\n );\n\n return {\n onClick: idx ? async() => {\n const currentPeerId = this.peerId;\n this.changeSendAsPeerId(sendAsPeerId);\n\n const middleware = this.middleware.get();\n const executeButtonsUpdate = () => {\n if(this.sendAsPeerId !== sendAsPeerId || !middleware()) return;\n const peerIds = this.sendAsPeerIds.slice();\n indexOfAndSplice(peerIds, sendAsPeerId);\n peerIds.unshift(sendAsPeerId);\n this.updateButtons(peerIds);\n };\n\n if(rootScope.settings.animationsEnabled) {\n setTimeout(executeButtonsUpdate, 250);\n } else {\n executeButtonsUpdate();\n }\n\n // return;\n this.managers.appMessagesManager.saveDefaultSendAs(currentPeerId, sendAsPeerId);\n } : undefined,\n textElement\n };\n });\n\n const buttons = await Promise.all(promises);\n const btnMenu = ButtonMenuSync({buttons}/* , this.listenerSetter */);\n buttons.forEach((button, idx) => {\n const peerId = peerIds[idx];\n const avatar = new AvatarElement();\n avatar.classList.add('avatar-26', 'btn-menu-item-icon');\n avatar.updateWithOptions({peerId});\n\n if(!idx) {\n avatar.classList.add('active');\n }\n\n button.element.prepend(avatar);\n });\n\n this.buttons = buttons;\n\n // if already opened\n this.btnMenu?.append(...this.buttons.map((button) => button.element));\n }\n\n private async updateAvatar(sendAsPeerId: PeerId, skipAnimation?: boolean) {\n const previousAvatar = this.avatar;\n if(previousAvatar) {\n if(previousAvatar.peerId === sendAsPeerId) {\n return;\n }\n }\n\n if(!previousAvatar) {\n skipAnimation = true;\n }\n\n const useRafs = skipAnimation ? 0 : 2;\n const duration = skipAnimation ? 0 : SEND_AS_ANIMATION_DURATION;\n const avatar = this.avatar = new AvatarElement();\n avatar.classList.add('new-message-send-as-avatar', 'avatar-30');\n await avatar.updateWithOptions({\n isDialog: false,\n peerId: sendAsPeerId\n });\n\n SetTransition({\n element: avatar,\n className: 'is-visible',\n forwards: true,\n duration,\n useRafs\n });\n if(previousAvatar) {\n SetTransition({\n element: previousAvatar,\n className: 'is-visible',\n forwards: false,\n duration,\n onTransitionEnd: () => {\n previousAvatar.remove();\n },\n useRafs\n });\n }\n\n this.container.append(avatar);\n }\n\n private changeSendAsPeerId(sendAsPeerId: PeerId, skipAnimation?: boolean) {\n this.sendAsPeerId = sendAsPeerId;\n this.onChange(sendAsPeerId);\n return this.updateAvatar(sendAsPeerId, skipAnimation);\n }\n\n private getDefaultSendAs(): Promise> {\n // return rootScope.myId;\n return this.managers.acknowledged.appProfileManager.getChannelFull(this.peerId.toChatId()).then((acked) => {\n return {\n cached: acked.cached,\n result: acked.result.then((channelFull) => {\n return channelFull.default_send_as ? getPeerId(channelFull.default_send_as) : undefined\n })\n };\n });\n }\n\n public async updateManual(skipAnimation?: boolean): Promise<() => void> {\n const peerId = this.peerId;\n if(this.updatingPromise || !(await this.managers.appPeersManager.isChannel(peerId))) {\n return;\n }\n\n const middleware = this.middleware.get(() => {\n return !this.updatingPromise || this.updatingPromise === updatingPromise;\n });\n\n const {container} = this;\n const chatId = peerId.toChatId();\n const result = (await modifyAckedPromise(this.getDefaultSendAs())).result;\n // const result = Promise.resolve(this.getDefaultSendAs());\n\n const wasSkippingAnimation = skipAnimation;\n if(result instanceof Promise) {\n skipAnimation = undefined;\n }\n\n const auto = wasSkippingAnimation && !skipAnimation;\n\n const updatingPromise = this.updatingPromise = callbackify(result, async(sendAsPeerId) => {\n if(!middleware() || sendAsPeerId === undefined) return;\n\n await this.changeSendAsPeerId(sendAsPeerId, skipAnimation);\n if(!middleware()) return;\n\n this.managers.appChatsManager.getSendAs(chatId).then((sendAsPeers) => {\n if(!middleware()) return;\n\n const peers = sendAsPeers.filter((sendAsPeer) => !sendAsPeer.pFlags.premium_required).map((sendAsPeer) => sendAsPeer.peer);\n const peerIds = peers.map((peer) => getPeerId(peer));\n this.sendAsPeerIds = peerIds.slice();\n\n indexOfAndSplice(peerIds, sendAsPeerId);\n peerIds.unshift(sendAsPeerId);\n this.updateButtons(peerIds);\n });\n\n const callback = () => {\n this.onReady(container, skipAnimation);\n\n if(!this.addedListener) {\n this.listenerSetter.add(rootScope)('peer_full_update', (peerId) => {\n if(this.peerId === peerId) {\n this.update();\n }\n });\n\n this.addedListener = true;\n }\n };\n\n if(auto) {\n callback();\n return;\n }\n\n return callback;\n });\n\n updatingPromise.finally(() => {\n if(this.updatingPromise === updatingPromise) {\n this.updatingPromise = undefined;\n }\n });\n\n if(!auto) {\n return updatingPromise;\n }\n }\n\n public update(skipAnimation?: boolean) {\n return this.updateManual(skipAnimation).then((callback) => callback?.());\n }\n\n public setPeerId(peerId?: PeerId) {\n /* if(this.avatar) {\n this.avatar.remove();\n this.avatar = undefined;\n } */\n\n this.middleware.clean();\n this.updatingPromise = undefined;\n this.peerId = peerId;\n }\n\n public destroy() {\n this.container.remove();\n this.setPeerId();\n this.listenerSetter.removeAll();\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 {markdownTags, MarkdownType} from './getRichElementValue';\n\nexport default function hasMarkupInSelection(types: T[], onlyFull?: boolean) {\n const result: Record = {} as any;\n types.forEach((tag) => result[tag] = 0);\n const selection = window.getSelection();\n let nodes = -1;\n if(!selection.isCollapsed) {\n const range = selection.getRangeAt(0);\n const commonAncestor = range.commonAncestorContainer;\n const root = commonAncestor.nodeType === commonAncestor.ELEMENT_NODE ?\n commonAncestor as HTMLElement :\n (commonAncestor as ChildNode).parentElement;\n const treeWalker = document.createTreeWalker(\n root.closest('[contenteditable=\"true\"]'),\n NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT,\n {acceptNode: (node) => range.intersectsNode(node) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT}\n );\n\n nodes = 0;\n let node: Node;\n while(node = treeWalker.nextNode()) {\n ++nodes;\n for(const type of types) {\n const tag = markdownTags[type];\n const matches = (node.nodeType === node.ELEMENT_NODE ? node as HTMLElement : node.parentElement).closest(tag.match);\n if(matches) {\n ++result[type];\n }\n }\n }\n }\n\n const resultBoolean: Record = {} as any;\n for(const type of types) {\n resultBoolean[type] = result[type] >= (onlyFull ? nodes : 1);\n }\n\n return resultBoolean;\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 {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport {AppImManager, APP_TABS} from '../../lib/appManagers/appImManager';\nimport type {MyDraftMessage} from '../../lib/appManagers/appDraftsManager';\nimport type Chat from './chat';\nimport Recorder from '../../../public/recorder.min';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\n// import Recorder from '../opus-recorder/dist/recorder.min';\nimport opusDecodeController from '../../lib/opusDecodeController';\nimport {ButtonMenuItemOptions, ButtonMenuItemOptionsVerifiable, ButtonMenuSync} from '../buttonMenu';\nimport emoticonsDropdown from '../emoticonsDropdown';\nimport PopupCreatePoll from '../popups/createPoll';\nimport PopupForward from '../popups/forward';\nimport PopupNewMedia from '../popups/newMedia';\nimport {toast, toastNew} from '../toast';\nimport {MessageEntity, DraftMessage, WebPage, Message, UserFull, AttachMenuPeerType} from '../../layer';\nimport StickersHelper from './stickersHelper';\nimport ButtonIcon from '../buttonIcon';\nimport ButtonMenuToggle from '../buttonMenuToggle';\nimport ListenerSetter, {Listener} from '../../helpers/listenerSetter';\nimport Button from '../button';\nimport PopupSchedule from '../popups/schedule';\nimport SendMenu from './sendContextMenu';\nimport rootScope from '../../lib/rootScope';\nimport PopupPinMessage from '../popups/unpinMessage';\nimport tsNow from '../../helpers/tsNow';\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\nimport {IS_MOBILE, IS_MOBILE_SAFARI} from '../../environment/userAgent';\nimport I18n, {i18n, join, LangPackKey} from '../../lib/langPack';\nimport {generateTail} from './bubbles';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport ButtonCorner from '../buttonCorner';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport cancelSelection from '../../helpers/dom/cancelSelection';\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport isInputEmpty from '../../helpers/dom/isInputEmpty';\nimport isSendShortcutPressed from '../../helpers/dom/isSendShortcutPressed';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {MarkdownType} from '../../helpers/dom/getRichElementValue';\nimport getRichValueWithCaret from '../../helpers/dom/getRichValueWithCaret';\nimport EmojiHelper from './emojiHelper';\nimport CommandsHelper from './commandsHelper';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport AutocompleteHelper from './autocompleteHelper';\nimport MentionsHelper from './mentionsHelper';\nimport fixSafariStickyInput from '../../helpers/dom/fixSafariStickyInput';\nimport ReplyKeyboard from './replyKeyboard';\nimport InlineHelper from './inlineHelper';\nimport debounce from '../../helpers/schedulers/debounce';\nimport noop from '../../helpers/noop';\nimport {putPreloader} from '../putPreloader';\nimport SetTransition from '../singleTransition';\nimport PeerTitle from '../peerTitle';\nimport {fastRaf} from '../../helpers/schedulers';\nimport PopupDeleteMessages from '../popups/deleteMessages';\nimport fixSafariStickyInputFocusing, {IS_STICKY_INPUT_BUGGED} from '../../helpers/dom/fixSafariStickyInputFocusing';\nimport PopupPeer from '../popups/peer';\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\nimport appMediaPlaybackController from '../appMediaPlaybackController';\nimport {BOT_START_PARAM, NULL_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport setCaretAt from '../../helpers/dom/setCaretAt';\nimport CheckboxField from '../checkboxField';\nimport DropdownHover from '../../helpers/dropdownHover';\nimport RadioForm from '../radioForm';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport toggleDisability from '../../helpers/dom/toggleDisability';\nimport callbackify from '../../helpers/callbackify';\nimport ChatBotCommands from './botCommands';\nimport copy from '../../helpers/object/copy';\nimport toHHMMSS from '../../helpers/string/toHHMMSS';\nimport documentFragmentToHTML from '../../helpers/dom/documentFragmentToHTML';\nimport PopupElement from '../popups';\nimport getEmojiEntityFromEmoji from '../../lib/richTextProcessor/getEmojiEntityFromEmoji';\nimport mergeEntities from '../../lib/richTextProcessor/mergeEntities';\nimport parseEntities from '../../lib/richTextProcessor/parseEntities';\nimport parseMarkdown from '../../lib/richTextProcessor/parseMarkdown';\nimport wrapDraftText from '../../lib/richTextProcessor/wrapDraftText';\nimport wrapDraft from '../wrappers/draft';\nimport wrapMessageForReply from '../wrappers/messageForReply';\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport contextMenuController from '../../helpers/contextMenuController';\nimport {emojiFromCodePoints} from '../../vendor/emoji';\nimport {modifyAckedPromise} from '../../helpers/modifyAckedResult';\nimport ChatSendAs from './sendAs';\nimport filterAsync from '../../helpers/array/filterAsync';\nimport InputFieldAnimated from '../inputFieldAnimated';\nimport getStickerEffectThumb from '../../lib/appManagers/utils/stickers/getStickerEffectThumb';\nimport PopupStickers from '../popups/stickers';\nimport wrapPeerTitle from '../wrappers/peerTitle';\nimport wrapReply from '../wrappers/reply';\nimport {getEmojiFromElement} from '../emoticonsDropdown/tabs/emoji';\nimport hasMarkupInSelection from '../../helpers/dom/hasMarkupInSelection';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport RichInputHandler from '../../helpers/dom/richInputHandler';\nimport {insertRichTextAsHTML} from '../inputField';\nimport getCaretPosNew from '../../helpers/dom/getCaretPosNew';\nimport draftsAreEqual from '../../lib/appManagers/utils/drafts/draftsAreEqual';\nimport isSelectionEmpty from '../../helpers/dom/isSelectionEmpty';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport getAttachMenuBotIcon from '../../lib/appManagers/utils/attachMenuBots/getAttachMenuBotIcon';\nimport TelegramWebView from '../telegramWebView';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport {MARKDOWN_ENTITIES} from '../../lib/richTextProcessor';\n\nconst RECORD_MIN_TIME = 500;\nconst POSTING_MEDIA_NOT_ALLOWED = 'Posting media content isn\\'t allowed in this group.';\n\ntype ChatInputHelperType = 'edit' | 'webpage' | 'forward' | 'reply';\n\nexport default class ChatInput {\n // private static AUTO_COMPLETE_REG_EXP = /(\\s|^)((?::|.)(?!.*[:@]).*|(?:[@\\/]\\S*))$/;\n private static AUTO_COMPLETE_REG_EXP = /(\\s|^)((?:(?:@|^\\/)\\S*)|(?::|^[^:@\\/])(?!.*[:@\\/]).*)$/;\n public messageInput: HTMLElement;\n public messageInputField: InputFieldAnimated;\n private fileInput: HTMLInputElement;\n private inputMessageContainer: HTMLDivElement;\n private btnSend: HTMLButtonElement;\n private btnCancelRecord: HTMLButtonElement;\n private lastUrl = '';\n private lastTimeType = 0;\n\n public chatInput: HTMLElement;\n public inputContainer: HTMLElement;\n public rowsWrapper: HTMLDivElement;\n private newMessageWrapper: HTMLDivElement;\n private btnToggleEmoticons: HTMLButtonElement;\n private btnToggleReplyMarkup: HTMLButtonElement;\n private btnSendContainer: HTMLDivElement;\n\n private replyKeyboard: ReplyKeyboard;\n\n private attachMenu: HTMLElement;\n private attachMenuButtons: ButtonMenuItemOptionsVerifiable[];\n\n private sendMenu: SendMenu;\n\n private replyElements: {\n container: HTMLElement,\n cancelBtn: HTMLButtonElement,\n iconBtn: HTMLButtonElement\n } = {} as any;\n\n private forwardElements: {\n changePeer: ButtonMenuItemOptions,\n showSender: ButtonMenuItemOptions,\n hideSender: ButtonMenuItemOptions,\n showCaption: ButtonMenuItemOptions,\n hideCaption: ButtonMenuItemOptions,\n container: HTMLElement,\n modifyArgs?: ButtonMenuItemOptions[]\n };\n private forwardHover: DropdownHover;\n private forwardWasDroppingAuthor: boolean;\n\n private getWebPagePromise: Promise;\n private willSendWebPage: WebPage = null;\n private forwarding: {[fromPeerId: PeerId]: number[]};\n public replyToMsgId: number;\n public editMsgId: number;\n public editMessage: Message.message;\n private noWebPage: true;\n public scheduleDate: number;\n public sendSilent: true;\n public startParam: string;\n\n private recorder: any;\n public recording = false;\n private recordCanceled = false;\n private recordTimeEl: HTMLElement;\n private recordRippleEl: HTMLElement;\n private recordStartTime = 0;\n private recordingOverlayListener: Listener;\n private recordingNavigationItem: NavigationItem;\n\n // private scrollTop = 0;\n // private scrollOffsetTop = 0;\n // private scrollDiff = 0;\n\n public helperType: Exclude;\n private helperFunc: () => void | Promise;\n private helperWaitingForward: boolean;\n\n public willAttachType: 'document' | 'media';\n\n private lockRedo = false;\n private canRedoFromHTML = '';\n private readonly undoHistory: string[] = [];\n private readonly executedHistory: string[] = [];\n private canUndoFromHTML = '';\n\n private autocompleteHelperController: AutocompleteHelperController;\n private stickersHelper: StickersHelper;\n private emojiHelper: EmojiHelper;\n private commandsHelper: CommandsHelper;\n private mentionsHelper: MentionsHelper;\n private inlineHelper: InlineHelper;\n private listenerSetter: ListenerSetter;\n\n private pinnedControlBtn: HTMLButtonElement;\n\n private goDownBtn: HTMLButtonElement;\n private goDownUnreadBadge: HTMLElement;\n private goMentionBtn: HTMLButtonElement;\n private goMentionUnreadBadge: HTMLSpanElement;\n private btnScheduled: HTMLButtonElement;\n\n private btnPreloader: HTMLButtonElement;\n\n private saveDraftDebounced: () => void;\n\n private fakeRowsWrapper: HTMLDivElement;\n\n private previousQuery: string;\n\n private releaseMediaPlayback: () => void;\n\n private botStartBtn: HTMLButtonElement;\n private rowsWrapperWrapper: HTMLDivElement;\n private controlContainer: HTMLElement;\n private fakeSelectionWrapper: HTMLDivElement;\n\n private fakeWrapperTo: HTMLElement;\n private toggleBotStartBtnDisability: () => void;\n\n private botCommandsToggle: HTMLElement;\n private botCommands: ChatBotCommands;\n private botCommandsIcon: HTMLDivElement;\n private hasBotCommands: boolean;\n\n // private activeContainer: HTMLElement;\n\n private sendAs: ChatSendAs;\n public sendAsPeerId: PeerId;\n\n private replyInTopicOverlay: HTMLDivElement;\n\n constructor(\n private chat: Chat,\n private appImManager: AppImManager,\n private managers: AppManagers\n ) {\n this.listenerSetter = new ListenerSetter();\n }\n\n public construct() {\n this.chatInput = document.createElement('div');\n this.chatInput.classList.add('chat-input', 'hide');\n\n this.inputContainer = document.createElement('div');\n this.inputContainer.classList.add('chat-input-container');\n\n this.rowsWrapperWrapper = document.createElement('div');\n this.rowsWrapperWrapper.classList.add('rows-wrapper-wrapper');\n\n this.rowsWrapper = document.createElement('div');\n this.rowsWrapper.classList.add('rows-wrapper', 'chat-input-wrapper');\n\n this.rowsWrapperWrapper.append(this.rowsWrapper);\n\n const tail = generateTail();\n this.rowsWrapper.append(tail);\n\n const fakeRowsWrapper = this.fakeRowsWrapper = document.createElement('div');\n fakeRowsWrapper.classList.add('fake-wrapper', 'fake-rows-wrapper');\n\n const fakeSelectionWrapper = this.fakeSelectionWrapper = document.createElement('div');\n fakeSelectionWrapper.classList.add('fake-wrapper', 'fake-selection-wrapper');\n\n this.inputContainer.append(this.rowsWrapperWrapper, fakeRowsWrapper, fakeSelectionWrapper);\n this.chatInput.append(this.inputContainer);\n\n this.goDownBtn = ButtonCorner({icon: 'arrow_down', className: 'bubbles-corner-button chat-secondary-button bubbles-go-down hide'});\n this.inputContainer.append(this.goDownBtn);\n\n attachClickEvent(this.goDownBtn, (e) => {\n cancelEvent(e);\n this.chat.bubbles.onGoDownClick();\n }, {listenerSetter: this.listenerSetter});\n\n // * constructor end\n\n /* let setScrollTopTimeout: number;\n // @ts-ignore\n let height = window.visualViewport.height; */\n // @ts-ignore\n // this.listenerSetter.add(window.visualViewport)('resize', () => {\n // const scrollable = this.chat.bubbles.scrollable;\n // const wasScrolledDown = scrollable.isScrolledDown;\n\n // /* if(wasScrolledDown) {\n // this.saveScroll();\n // } */\n\n // // @ts-ignore\n // let newHeight = window.visualViewport.height;\n // const diff = height - newHeight;\n // const scrollTop = scrollable.scrollTop;\n // const needScrollTop = wasScrolledDown ? scrollable.scrollHeight : scrollTop + diff; // * wasScrolledDown ัั‚ะพ ะฟั€ะพะฒะตั€ะบะฐ ะดะปั ะดะตัะบั‚ะพะฟ ั…ั€ะพะผะฐ, ะบะพะณะดะฐ ะฟั€ะพะฟะฐะดะฐะตั‚ ะฟะฐะฝะตะปัŒ ะทะฐะณั€ัƒะทะพะบ ัะฝะธะทัƒ\n\n // console.log('resize before', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, wasScrolledDown, scrollable.lastScrollTop, diff, needScrollTop);\n\n // scrollable.scrollTop = needScrollTop;\n\n // if(setScrollTopTimeout) clearTimeout(setScrollTopTimeout);\n // setScrollTopTimeout = window.setTimeout(() => {\n // const diff = height - newHeight;\n // const isScrolledDown = scrollable.scrollHeight - Math.round(scrollable.scrollTop + scrollable.container.offsetHeight + diff) <= 1;\n // height = newHeight;\n\n // scrollable.scrollTop = needScrollTop;\n\n // console.log('resize after', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, scrollable.isScrolledDown, scrollable.lastScrollTop, isScrolledDown);\n\n // /* if(isScrolledDown) {\n // scrollable.scrollTop = scrollable.scrollHeight;\n // } */\n\n // //scrollable.scrollTop += diff;\n // setScrollTopTimeout = 0;\n // }, 0);\n // });\n\n // ! Can't use it with resizeObserver\n /* this.listenerSetter.add(window.visualViewport)('resize', () => {\n const scrollable = this.chat.bubbles.scrollable;\n const wasScrolledDown = scrollable.isScrolledDown;\n\n // @ts-ignore\n let newHeight = window.visualViewport.height;\n const diff = height - newHeight;\n const needScrollTop = wasScrolledDown ? scrollable.scrollHeight : scrollable.scrollTop + diff; // * wasScrolledDown ัั‚ะพ ะฟั€ะพะฒะตั€ะบะฐ ะดะปั ะดะตัะบั‚ะพะฟ ั…ั€ะพะผะฐ, ะบะพะณะดะฐ ะฟั€ะพะฟะฐะดะฐะตั‚ ะฟะฐะฝะตะปัŒ ะทะฐะณั€ัƒะทะพะบ ัะฝะธะทัƒ\n\n //console.log('resize before', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, wasScrolledDown, scrollable.lastScrollTop, diff, needScrollTop);\n\n scrollable.scrollTop = needScrollTop;\n height = newHeight;\n\n if(setScrollTopTimeout) clearTimeout(setScrollTopTimeout);\n setScrollTopTimeout = window.setTimeout(() => { // * try again for scrolled down Android Chrome\n scrollable.scrollTop = needScrollTop;\n\n //console.log('resize after', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, scrollable.isScrolledDown, scrollable.lastScrollTop, isScrolledDown);\n setScrollTopTimeout = 0;\n }, 0);\n }); */\n\n const c = this.controlContainer = document.createElement('div');\n c.classList.add('chat-input-control', 'chat-input-wrapper');\n this.inputContainer.append(c);\n }\n\n public constructPeerHelpers() {\n this.replyElements.container = document.createElement('div');\n this.replyElements.container.classList.add('reply-wrapper');\n\n this.replyElements.iconBtn = ButtonIcon('');\n this.replyElements.cancelBtn = ButtonIcon('close reply-cancel', {noRipple: true});\n\n this.replyElements.container.append(this.replyElements.iconBtn, this.replyElements.cancelBtn);\n\n //\n\n const onHideAuthorClick = () => {\n isChangingAuthor = true;\n };\n\n const onHideCaptionClick = () => {\n isChangingAuthor = false;\n };\n\n const forwardElements: ChatInput['forwardElements'] = this.forwardElements = {} as any;\n let isChangingAuthor = false;\n const forwardButtons: ButtonMenuItemOptions[] = [\n forwardElements.showSender = {\n text: 'Chat.Alert.Forward.Action.Show1',\n onClick: onHideAuthorClick,\n checkForClose: () => this.canToggleHideAuthor(),\n checkboxField: new CheckboxField({checked: true})\n },\n forwardElements.hideSender = {\n text: 'Chat.Alert.Forward.Action.Hide1',\n onClick: onHideAuthorClick,\n checkForClose: () => this.canToggleHideAuthor(),\n checkboxField: new CheckboxField({checked: false})\n },\n forwardElements.showCaption = {\n text: 'Chat.Alert.Forward.Action.ShowCaption',\n onClick: onHideCaptionClick,\n checkboxField: new CheckboxField({checked: true})\n },\n forwardElements.hideCaption = {\n text: 'Chat.Alert.Forward.Action.HideCaption',\n onClick: onHideCaptionClick,\n checkboxField: new CheckboxField({checked: false})\n },\n forwardElements.changePeer = {\n text: 'Chat.Alert.Forward.Action.Another',\n onClick: () => {\n this.changeForwardRecipient();\n },\n icon: 'replace'\n }\n ];\n const forwardBtnMenu = forwardElements.container = ButtonMenuSync({\n buttons: forwardButtons,\n listenerSetter: this.listenerSetter\n });\n // forwardBtnMenu.classList.add('top-center');\n\n const children = Array.from(forwardBtnMenu.children) as HTMLElement[];\n const groups: {\n elements: HTMLElement[],\n onChange: (value: string, event: Event) => void\n }[] = [{\n elements: children.slice(0, 2),\n onChange: (value, e) => {\n const checked = !!+value;\n if(isChangingAuthor) {\n this.forwardWasDroppingAuthor = !checked;\n }\n\n const replyTitle = this.replyElements.container.querySelector('.reply-title');\n if(replyTitle) {\n const el = replyTitle.firstElementChild as HTMLElement;\n const i = I18n.weakMap.get(el) as I18n.IntlElement;\n const langPackKey: LangPackKey = forwardElements.showSender.checkboxField.checked ? 'Chat.Accessory.Forward' : 'Chat.Accessory.Hidden';\n i.key = langPackKey;\n i.update();\n }\n }\n }, {\n elements: children.slice(2, 4),\n onChange: (value) => {\n const checked = !!+value;\n let b: ButtonMenuItemOptions;\n if(checked && this.forwardWasDroppingAuthor !== undefined) {\n b = this.forwardWasDroppingAuthor ? forwardElements.hideSender : forwardElements.showSender;\n } else {\n b = checked ? forwardElements.showSender : forwardElements.hideSender;\n }\n\n b.checkboxField.checked = true;\n }\n }];\n groups.forEach((group) => {\n const container = RadioForm(group.elements.map((e) => {\n return {\n container: e,\n input: e.querySelector('input')\n };\n }), group.onChange);\n\n const hr = document.createElement('hr');\n container.append(hr);\n forwardBtnMenu.append(container);\n });\n\n forwardBtnMenu.append(forwardElements.changePeer.element);\n\n if(!IS_TOUCH_SUPPORTED) {\n const forwardHover = this.forwardHover = new DropdownHover({\n element: forwardBtnMenu\n });\n }\n\n forwardElements.modifyArgs = forwardButtons.slice(0, -1);\n this.replyElements.container.append(forwardBtnMenu);\n\n forwardElements.modifyArgs.forEach((b, idx) => {\n const {input} = b.checkboxField;\n input.type = 'radio';\n input.name = idx < 2 ? 'author' : 'caption';\n input.value = '' + +!(idx % 2);\n });\n\n //\n\n this.newMessageWrapper = document.createElement('div');\n this.newMessageWrapper.classList.add('new-message-wrapper');\n\n this.replyInTopicOverlay = document.createElement('div');\n this.replyInTopicOverlay.classList.add('reply-in-topic-overlay', 'hide');\n this.replyInTopicOverlay.append(i18n('Chat.Input.ReplyToAnswer'));\n\n this.btnToggleEmoticons = ButtonIcon('none toggle-emoticons', {noRipple: true});\n\n this.inputMessageContainer = document.createElement('div');\n this.inputMessageContainer.classList.add('input-message-container');\n\n this.goDownUnreadBadge = document.createElement('span');\n this.goDownUnreadBadge.classList.add('badge', 'badge-24', 'badge-primary');\n this.goDownBtn.append(this.goDownUnreadBadge);\n\n this.goMentionBtn = ButtonCorner({icon: 'mention', className: 'bubbles-corner-button chat-secondary-button bubbles-go-mention'});\n this.goMentionUnreadBadge = document.createElement('span');\n this.goMentionUnreadBadge.classList.add('badge', 'badge-24', 'badge-primary');\n this.goMentionBtn.append(this.goMentionUnreadBadge);\n this.inputContainer.append(this.goMentionBtn);\n\n attachClickEvent(this.goMentionBtn, (e) => {\n cancelEvent(e);\n const middleware = this.chat.bubbles.getMiddleware();\n this.managers.appMessagesManager.goToNextMention(this.chat.peerId, this.chat.threadId).then((mid) => {\n if(!middleware()) {\n return;\n }\n\n if(mid) {\n this.chat.setMessageId(mid);\n }\n });\n }, {listenerSetter: this.listenerSetter});\n\n this.btnScheduled = ButtonIcon('scheduled btn-scheduled float hide', {noRipple: true});\n\n attachClickEvent(this.btnScheduled, (e) => {\n this.appImManager.openScheduled(this.chat.peerId);\n }, {listenerSetter: this.listenerSetter});\n\n this.listenerSetter.add(rootScope)('scheduled_new', ({peerId}) => {\n if(this.chat.peerId !== peerId) {\n return;\n }\n\n this.btnScheduled.classList.remove('hide');\n });\n\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId}) => {\n if(this.chat.peerId !== peerId) {\n return;\n }\n\n this.managers.appMessagesManager.getScheduledMessages(this.chat.peerId).then((value) => {\n this.btnScheduled.classList.toggle('hide', !value.length);\n });\n });\n\n this.btnToggleReplyMarkup = ButtonIcon('botcom toggle-reply-markup float hide', {noRipple: true});\n this.replyKeyboard = new ReplyKeyboard({\n appendTo: this.rowsWrapper,\n listenerSetter: this.listenerSetter,\n managers: this.managers,\n btnHover: this.btnToggleReplyMarkup,\n chatInput: this\n });\n this.listenerSetter.add(this.replyKeyboard)('open', () => this.btnToggleReplyMarkup.classList.add('active'));\n this.listenerSetter.add(this.replyKeyboard)('close', () => this.btnToggleReplyMarkup.classList.remove('active'));\n\n this.botCommands = new ChatBotCommands(this.rowsWrapper, this, this.managers);\n this.botCommandsToggle = document.createElement('div');\n this.botCommandsToggle.classList.add('new-message-bot-commands');\n\n const scaler = document.createElement('div');\n scaler.classList.add('new-message-bot-commands-icon-scale');\n\n const icon = this.botCommandsIcon = document.createElement('div');\n icon.classList.add('animated-menu-icon', 'animated-menu-close-icon');\n scaler.append(icon);\n this.botCommandsToggle.append(scaler);\n\n attachClickEvent(this.botCommandsToggle, (e) => {\n cancelEvent(e);\n const isShown = icon.classList.contains('state-back');\n if(isShown) {\n this.botCommands.toggle(true);\n icon.classList.remove('state-back');\n } else {\n this.botCommands.setUserId(this.chat.peerId.toUserId(), this.chat.bubbles.getMiddleware());\n icon.classList.add('state-back');\n }\n }, {listenerSetter: this.listenerSetter});\n\n this.botCommands.addEventListener('visible', () => {\n icon.classList.add('state-back');\n });\n\n this.botCommands.addEventListener('hiding', () => {\n icon.classList.remove('state-back');\n });\n\n this.attachMenuButtons = [{\n icon: 'image',\n text: 'Chat.Input.Attach.PhotoOrVideo',\n onClick: () => {\n this.fileInput.value = '';\n const accept = [...MEDIA_MIME_TYPES_SUPPORTED].join(', ');\n this.fileInput.setAttribute('accept', accept);\n this.willAttachType = 'media';\n this.fileInput.click();\n },\n verify: () => this.chat.canSend('send_media')\n }, {\n icon: 'document',\n text: 'Chat.Input.Attach.Document',\n onClick: () => {\n this.fileInput.value = '';\n this.fileInput.removeAttribute('accept');\n this.willAttachType = 'document';\n this.fileInput.click();\n },\n verify: () => this.chat.canSend('send_media')\n }, {\n icon: 'poll',\n text: 'Poll',\n onClick: () => {\n PopupElement.createPopup(PopupCreatePoll, this.chat).show();\n },\n verify: () => (this.chat.peerId.isAnyChat() || this.chat.isBot) && this.chat.canSend('send_polls')\n }];\n\n const attachMenuButtons = this.attachMenuButtons.slice();\n this.attachMenu = ButtonMenuToggle({\n buttonOptions: {noRipple: true},\n listenerSetter: this.listenerSetter,\n direction: 'top-left',\n buttons: this.attachMenuButtons,\n onOpenBefore: async() => {\n const attachMenuBots = await this.managers.appAttachMenuBotsManager.getAttachMenuBots();\n const buttons = attachMenuButtons.slice();\n const attachMenuBotsButtons = attachMenuBots.filter((attachMenuBot) => {\n return !attachMenuBot.pFlags.inactive;\n }).map((attachMenuBot) => {\n const icon = getAttachMenuBotIcon(attachMenuBot);\n const button: typeof buttons[0] = {\n regularText: wrapEmojiText(attachMenuBot.short_name),\n onClick: () => {\n this.managers.appAttachMenuBotsManager.requestWebView({\n botId: attachMenuBot.bot_id,\n peerId: this.chat.peerId,\n ...this.chat.getMessageSendingParams()\n }).then((webViewResultUrl) => {\n const SANDBOX_ATTRIBUTES = [\n 'allow-scripts',\n 'allow-same-origin',\n 'allow-popups',\n 'allow-forms',\n 'allow-modals',\n 'allow-storage-access-by-user-activation'\n ].join(' ');\n\n class P extends PopupElement<{\n finish: () => void\n }> {\n private telegramWebView: TelegramWebView;\n\n constructor(private url: string) {\n super('popup-payment popup-payment-verification', {\n closable: true,\n overlayClosable: true,\n body: true,\n titleRaw: attachMenuBot.short_name\n });\n\n this.d();\n }\n\n protected destroy() {\n this.telegramWebView.destroy();\n return super.destroy();\n }\n\n private d() {\n const telegramWebView = this.telegramWebView = new TelegramWebView({\n url: this.url,\n sandbox: SANDBOX_ATTRIBUTES\n });\n\n telegramWebView.iframe.classList.add('payment-verification');\n\n this.body.append(telegramWebView.iframe);\n this.show();\n telegramWebView.onMount();\n }\n }\n\n new P(webViewResultUrl.url);\n });\n },\n iconDoc: icon?.icon as MyDocument,\n verify: async() => {\n let found = false;\n\n const verifyMap: {\n [type in AttachMenuPeerType['_']]: () => boolean | Promise\n } = {\n attachMenuPeerTypeSameBotPM: () => this.chat.peerId.toUserId() === attachMenuBot.bot_id,\n attachMenuPeerTypeBotPM: () => this.chat.isBot,\n attachMenuPeerTypePM: () => this.chat.peerId.isUser(),\n attachMenuPeerTypeChat: () => this.chat.isAnyGroup,\n attachMenuPeerTypeBroadcast: () => this.chat.isBroadcast\n };\n\n for(const peerType of attachMenuBot.peer_types) {\n const verify = verifyMap[peerType._];\n found = await verify();\n if(found) {\n break;\n }\n }\n\n return found;\n }\n };\n\n return button;\n });\n\n buttons.splice(buttons.length, 0, ...attachMenuBotsButtons);\n this.attachMenuButtons.splice(0, this.attachMenuButtons.length, ...buttons);\n }\n });\n this.attachMenu.classList.add('attach-file', 'tgico-attach');\n this.attachMenu.classList.remove('tgico-more');\n\n // this.inputContainer.append(this.sendMenu);\n\n this.recordTimeEl = document.createElement('div');\n this.recordTimeEl.classList.add('record-time');\n\n this.fileInput = document.createElement('input');\n this.fileInput.type = 'file';\n this.fileInput.multiple = true;\n this.fileInput.style.display = 'none';\n\n this.newMessageWrapper.append(...[this.botCommandsToggle, this.btnToggleEmoticons, this.inputMessageContainer, this.btnScheduled, this.btnToggleReplyMarkup, this.attachMenu, this.recordTimeEl, this.fileInput].filter(Boolean));\n\n this.rowsWrapper.append(this.replyElements.container);\n this.autocompleteHelperController = new AutocompleteHelperController();\n this.stickersHelper = new StickersHelper(this.rowsWrapper, this.autocompleteHelperController, this.chat, this.managers);\n this.emojiHelper = new EmojiHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.managers);\n this.commandsHelper = new CommandsHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.managers);\n this.mentionsHelper = new MentionsHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.managers);\n this.inlineHelper = new InlineHelper(this.rowsWrapper, this.autocompleteHelperController, this.chat, this.managers);\n this.rowsWrapper.append(this.newMessageWrapper);\n\n this.btnCancelRecord = ButtonIcon('binfilled btn-circle btn-record-cancel chat-secondary-button');\n\n this.btnSendContainer = document.createElement('div');\n this.btnSendContainer.classList.add('btn-send-container');\n\n this.recordRippleEl = document.createElement('div');\n this.recordRippleEl.classList.add('record-ripple');\n\n this.btnSend = ButtonIcon('none btn-circle btn-send animated-button-icon');\n this.btnSend.insertAdjacentHTML('afterbegin', `\n \n \n \n \n `);\n\n this.btnSendContainer.append(this.recordRippleEl, this.btnSend);\n\n this.sendMenu = new SendMenu({\n onSilentClick: () => {\n this.sendSilent = true;\n this.sendMessage();\n },\n onScheduleClick: () => {\n this.scheduleSending(undefined);\n },\n listenerSetter: this.listenerSetter,\n openSide: 'top-left',\n onContextElement: this.btnSend,\n onOpen: () => {\n return this.chat.type !== 'scheduled' && (!this.isInputEmpty() || !!Object.keys(this.forwarding).length);\n }\n });\n\n this.btnSendContainer.append(this.sendMenu.sendMenu);\n\n this.inputContainer.append(this.btnCancelRecord, this.btnSendContainer);\n\n emoticonsDropdown.attachButtonListener(this.btnToggleEmoticons, this.listenerSetter);\n this.listenerSetter.add(emoticonsDropdown)('open', this.onEmoticonsOpen);\n this.listenerSetter.add(emoticonsDropdown)('close', this.onEmoticonsClose);\n\n this.attachMessageInputField();\n\n /* this.attachMenu.addEventListener('mousedown', (e) => {\n const hidden = this.attachMenu.querySelectorAll('.hide');\n if(hidden.length === this.attachMenuButtons.length) {\n toast(POSTING_MEDIA_NOT_ALLOWED);\n cancelEvent(e);\n return false;\n }\n }, {passive: false, capture: true}); */\n\n this.listenerSetter.add(rootScope)('settings_updated', () => {\n if(this.stickersHelper || this.emojiHelper) {\n // this.previousQuery = undefined;\n this.previousQuery = '';\n this.checkAutocomplete();\n /* if(!rootScope.settings.stickers.suggest) {\n this.stickersHelper.checkEmoticon('');\n } else {\n this.onMessageInput();\n } */\n }\n\n this.messageInputField?.onFakeInput();\n });\n\n this.listenerSetter.add(rootScope)('draft_updated', ({peerId, threadId, draft, force}) => {\n if(this.chat.threadId !== threadId || this.chat.peerId !== peerId || this.chat.type === 'scheduled') return;\n this.setDraft(draft, true, force);\n });\n\n this.listenerSetter.add(this.appImManager)('peer_changing', (chat) => {\n if(this.chat === chat && (this.chat.type === 'chat' || this.chat.type === 'discussion')) {\n this.saveDraft();\n }\n });\n\n this.listenerSetter.add(this.appImManager)('chat_changing', ({from, to}) => {\n if(this.chat === from) {\n this.autocompleteHelperController.toggleListNavigation(false);\n } else if(this.chat === to) {\n this.autocompleteHelperController.toggleListNavigation(true);\n }\n });\n\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId, mids}) => {\n if(this.chat.type === 'scheduled' && this.chat.peerId === peerId && mids.includes(this.editMsgId)) {\n this.onMessageSent();\n }\n });\n\n this.listenerSetter.add(rootScope)('history_delete', ({peerId, msgs}) => {\n if(this.chat.peerId === peerId && this.chat.type !== 'scheduled') {\n if(msgs.has(this.editMsgId)) {\n this.onMessageSent();\n }\n\n if(this.replyToMsgId && msgs.has(this.replyToMsgId)) {\n this.clearHelper('reply');\n }\n\n /* if(this.chat.isStartButtonNeeded()) {\n this.setStartParam(BOT_START_PARAM);\n } */\n }\n });\n\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\n if(dialogs.has(this.chat.peerId) && (this.chat.type === 'chat' || this.chat.type === 'discussion')) {\n if(this.startParam === BOT_START_PARAM) {\n this.setStartParam();\n } else { // updateNewMessage comes earlier than dialog appers\n this.center(true);\n }\n }\n });\n\n try {\n this.recorder = new Recorder({\n // encoderBitRate: 32,\n // encoderPath: \"../dist/encoderWorker.min.js\",\n encoderSampleRate: 48000,\n monitorGain: 0,\n numberOfChannels: 1,\n recordingGain: 1,\n reuseWorker: true\n });\n } catch(err) {\n console.error('Recorder constructor error:', err);\n }\n\n this.updateSendBtn();\n\n this.listenerSetter.add(this.fileInput)('change', (e) => {\n const files = (e.target as HTMLInputElement & EventTarget).files;\n if(!files.length) {\n return;\n }\n\n PopupElement.createPopup(PopupNewMedia, this.chat, Array.from(files).slice(), this.willAttachType);\n this.fileInput.value = '';\n }, false);\n\n /* let time = Date.now();\n this.btnSend.addEventListener('touchstart', (e) => {\n time = Date.now();\n });\n\n let eventName1 = 'touchend';\n this.btnSend.addEventListener(eventName1, (e: Event) => {\n //cancelEvent(e);\n console.log(eventName1 + ', time: ' + (Date.now() - time));\n });\n\n let eventName = 'mousedown';\n this.btnSend.addEventListener(eventName, (e: Event) => {\n cancelEvent(e);\n console.log(eventName + ', time: ' + (Date.now() - time));\n }); */\n attachClickEvent(this.btnSend, this.onBtnSendClick, {listenerSetter: this.listenerSetter, touchMouseDown: true});\n\n if(this.recorder) {\n attachClickEvent(this.btnCancelRecord, this.onCancelRecordClick, {listenerSetter: this.listenerSetter});\n\n this.recorder.onstop = () => {\n this.setRecording(false);\n this.chatInput.classList.remove('is-locked');\n this.recordRippleEl.style.transform = '';\n };\n\n this.recorder.ondataavailable = (typedArray: Uint8Array) => {\n if(this.releaseMediaPlayback) {\n this.releaseMediaPlayback();\n this.releaseMediaPlayback = undefined;\n }\n\n if(this.recordingOverlayListener) {\n this.listenerSetter.remove(this.recordingOverlayListener);\n this.recordingOverlayListener = undefined;\n }\n\n if(this.recordingNavigationItem) {\n appNavigationController.removeItem(this.recordingNavigationItem);\n this.recordingNavigationItem = undefined;\n }\n\n if(this.recordCanceled) {\n return;\n }\n\n const {peerId, threadId} = this.chat;\n const replyToMsgId = this.replyToMsgId;\n\n const duration = (Date.now() - this.recordStartTime) / 1000 | 0;\n const dataBlob = new Blob([typedArray], {type: 'audio/ogg'});\n /* const fileName = new Date().toISOString() + \".opus\";\n console.log('Recorder data received', typedArray, dataBlob); */\n\n // let perf = performance.now();\n opusDecodeController.decode(typedArray, true).then((result) => {\n // console.log('WAVEFORM!:', /* waveform, */performance.now() - perf);\n\n opusDecodeController.setKeepAlive(false);\n\n // ั‚ัƒั‚ objectURL ัั‚ะฐะฒะธั‚ัั ัƒะถะต ั audio/wav\n this.managers.appMessagesManager.sendFile(peerId, {\n file: dataBlob,\n isVoiceMessage: true,\n isMedia: true,\n duration,\n waveform: result.waveform,\n objectURL: result.url,\n replyToMsgId,\n threadId,\n clearDraft: true\n });\n\n this.onMessageSent(false, true);\n });\n };\n }\n\n attachClickEvent(this.replyElements.cancelBtn, this.onHelperCancel, {listenerSetter: this.listenerSetter});\n attachClickEvent(this.replyElements.container, this.onHelperClick, {listenerSetter: this.listenerSetter});\n\n this.saveDraftDebounced = debounce(() => this.saveDraft(), 2500, false, true);\n\n this.botStartBtn = Button('btn-primary btn-transparent text-bold chat-input-control-button');\n this.botStartBtn.append(i18n('BotStart'));\n\n attachClickEvent(this.botStartBtn, () => {\n const {startParam} = this;\n if(startParam === undefined) {\n return;\n }\n\n const toggle = this.toggleBotStartBtnDisability = toggleDisability([this.botStartBtn], true);\n const peerId = this.chat.peerId;\n const middleware = this.chat.bubbles.getMiddleware(() => {\n return this.chat.peerId === peerId && this.startParam === startParam && this.toggleBotStartBtnDisability === toggle;\n });\n\n this.managers.appMessagesManager.startBot(peerId.toUserId(), undefined, startParam).then(() => {\n if(middleware()) {\n toggle();\n this.toggleBotStartBtnDisability = undefined;\n this.setStartParam();\n }\n });\n }, {listenerSetter: this.listenerSetter});\n\n this.controlContainer.append(this.botStartBtn, this.replyInTopicOverlay);\n\n // * pinned part start\n this.pinnedControlBtn = Button('btn-primary btn-transparent text-bold chat-input-control-button', {icon: 'unpin'});\n this.controlContainer.append(this.pinnedControlBtn);\n\n this.listenerSetter.add(this.pinnedControlBtn)('click', () => {\n const peerId = this.chat.peerId;\n\n new PopupPinMessage(peerId, 0, true, () => {\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 // * pinned part end\n }\n\n public _center(neededFakeContainer: HTMLElement, animate?: boolean) {\n if(!neededFakeContainer && !this.inputContainer.classList.contains('is-centering')) {\n return;\n }\n\n if(neededFakeContainer === this.fakeWrapperTo) {\n return;\n }\n\n /* if(neededFakeContainer === this.botStartContainer && this.fakeWrapperTo === this.fakeSelectionWrapper) {\n this.inputContainer.classList.remove('is-centering');\n void this.rowsWrapper.offsetLeft; // reflow\n // this.inputContainer.classList.add('is-centering');\n // void this.rowsWrapper.offsetLeft; // reflow\n } */\n\n const fakeSelectionWrapper = neededFakeContainer || this.fakeWrapperTo;\n const forwards = !!neededFakeContainer;\n const oldFakeWrapperTo = this.fakeWrapperTo;\n let transform = '', borderRadius = '', needTranslateX: number;\n // if(forwards) {]\n const fakeSelectionRect = fakeSelectionWrapper.getBoundingClientRect();\n const fakeRowsRect = this.fakeRowsWrapper.getBoundingClientRect();\n const widthFrom = fakeRowsRect.width;\n const widthTo = fakeSelectionRect.width;\n\n if(widthFrom !== widthTo) {\n const scale = (widthTo/* - 8 */) / widthFrom;\n const initTranslateX = (widthFrom - widthTo) / 2;\n needTranslateX = fakeSelectionRect.left - fakeRowsRect.left - initTranslateX;\n\n if(forwards) {\n transform = `translateX(${needTranslateX}px) scaleX(${scale})`;\n // transform = `translateX(0px) scaleX(${scale})`;\n\n if(scale < 1) {\n const br = 16;\n borderRadius = '' + (br + br * (1 - scale)) + 'px';\n }\n }\n // scale = widthTo / widthFrom;\n }\n // }\n\n this.fakeWrapperTo = neededFakeContainer;\n\n const duration = animate ? 200 : 0;\n SetTransition({\n element: this.inputContainer,\n className: 'is-centering',\n forwards,\n duration\n });\n SetTransition({\n element: this.rowsWrapperWrapper,\n className: 'is-centering-to-control',\n forwards: !!(forwards && neededFakeContainer && neededFakeContainer.classList.contains('chat-input-control')),\n duration\n });\n this.rowsWrapper.style.transform = transform;\n this.rowsWrapper.style.borderRadius = borderRadius;\n\n return {\n transform,\n borderRadius,\n needTranslateX: oldFakeWrapperTo && (\n (\n neededFakeContainer &&\n neededFakeContainer.classList.contains('chat-input-control') &&\n oldFakeWrapperTo === this.fakeSelectionWrapper\n ) || oldFakeWrapperTo.classList.contains('chat-input-control')\n ) ? needTranslateX * -.5 : needTranslateX,\n widthFrom,\n widthTo\n };\n }\n\n public async center(animate = false) {\n return this._center(await this.getNeededFakeContainer(), animate);\n }\n\n public setStartParam(startParam?: string) {\n if(this.startParam === startParam) {\n return;\n }\n\n this.startParam = startParam;\n this.center(true);\n }\n\n public isReplyInTopicOverlayNeeded() {\n return this.chat.isForum &&\n !this.chat.isForumTopic &&\n !this.replyToMsgId &&\n this.chat.type === 'chat';\n }\n\n public async getNeededFakeContainer(startParam = this.startParam) {\n if(this.chat.selection.isSelecting) {\n return this.fakeSelectionWrapper;\n } else if(\n startParam !== undefined ||\n // !(await this.chat.canSend()) || // ! WARNING, TEMPORARILY COMMENTED\n this.chat.type === 'pinned' ||\n await this.chat.isStartButtonNeeded() ||\n this.isReplyInTopicOverlayNeeded()\n ) {\n return this.controlContainer;\n }\n }\n\n // public getActiveContainer() {\n // if(this.chat.selection.isSelecting) {\n // return this.chat\n // }\n // return this.startParam !== undefined ? this.botStartContainer : this.rowsWrapper;\n // }\n\n // public setActiveContainer() {\n // const container = this.activeContainer;\n // const newContainer = this.getActiveContainer();\n // if(newContainer === container) {\n // return;\n // }\n\n\n // }\n\n private onCancelRecordClick = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n this.recordCanceled = true;\n this.recorder.stop();\n opusDecodeController.setKeepAlive(false);\n };\n\n private onEmoticonsOpen = () => {\n const toggleClass = IS_TOUCH_SUPPORTED ? 'flip-icon' : 'active';\n this.btnToggleEmoticons.classList.toggle(toggleClass, true);\n };\n\n private onEmoticonsClose = () => {\n const toggleClass = IS_TOUCH_SUPPORTED ? 'flip-icon' : 'active';\n this.btnToggleEmoticons.classList.toggle(toggleClass, false);\n };\n\n public getReadyToSend(callback: () => void) {\n return this.chat.type === 'scheduled' ? (this.scheduleSending(callback), true) : (callback(), false);\n }\n\n public scheduleSending = async(callback: () => void = this.sendMessage.bind(this, true), initDate = new Date()) => {\n const {peerId} = this.chat;\n const middleware = this.chat.bubbles.getMiddleware();\n const canSendWhenOnline = rootScope.myId !== peerId && peerId.isUser() && await this.managers.appUsersManager.isUserOnlineVisible(peerId);\n\n new PopupSchedule(initDate, (timestamp) => {\n if(!middleware()) {\n return;\n }\n\n const minTimestamp = (Date.now() / 1000 | 0) + 10;\n if(timestamp <= minTimestamp) {\n timestamp = undefined;\n }\n\n this.scheduleDate = timestamp;\n callback();\n\n if(this.chat.type !== 'scheduled' && timestamp) {\n setTimeout(() => { // ! need timeout here because .forwardMessages will be called after timeout\n if(!middleware()) {\n return;\n }\n\n const popups = PopupElement.getPopups(PopupStickers);\n popups.forEach((popup) => popup.hide());\n\n this.appImManager.openScheduled(peerId);\n }, 0);\n }\n }, canSendWhenOnline).show();\n };\n\n public async setUnreadCount() {\n if(!this.goDownUnreadBadge) {\n return;\n }\n\n const dialog = await this.managers.dialogsStorage.getDialogOrTopic(this.chat.peerId, this.chat.type === 'discussion' ? undefined : this.chat.threadId);\n const count = dialog?.unread_count;\n this.goDownUnreadBadge.innerText = '' + (count || '');\n this.goDownUnreadBadge.classList.toggle('badge-gray', await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.chat.peerId, respectType: true, threadId: this.chat.threadId}));\n\n if(this.goMentionUnreadBadge && this.chat.type === 'chat') {\n const hasMentions = !!(dialog?.unread_mentions_count && dialog.unread_count);\n this.goMentionUnreadBadge.innerText = hasMentions ? '' + (dialog.unread_mentions_count) : '';\n this.goMentionBtn.classList.toggle('is-visible', hasMentions);\n }\n }\n\n public getCurrentInputAsDraft(ignoreEmptyValue?: boolean) {\n const {value, entities} = getRichValueWithCaret(this.messageInputField.input, true, false);\n\n let draft: DraftMessage.draftMessage;\n if((value.length || ignoreEmptyValue) || this.replyToMsgId) {\n draft = {\n _: 'draftMessage',\n date: tsNow(true),\n message: value,\n entities: entities.length ? entities : undefined,\n pFlags: {\n no_webpage: this.noWebPage\n },\n reply_to_msg_id: this.replyToMsgId\n };\n }\n\n return draft;\n }\n\n public saveDraft() {\n if(!this.chat.peerId || this.editMsgId || this.chat.type === 'scheduled') return;\n const draft = this.getCurrentInputAsDraft();\n this.managers.appDraftsManager.syncDraft(this.chat.peerId, this.chat.threadId, draft);\n }\n\n public destroy() {\n // this.chat.log.error('Input destroying');\n\n this.listenerSetter.removeAll();\n }\n\n public cleanup(helperToo = true) {\n if(!this.chat.peerId) {\n this.chatInput.classList.add('hide');\n this.goDownBtn.classList.add('hide');\n }\n\n cancelSelection();\n\n this.lastTimeType = 0;\n this.startParam = undefined;\n\n if(this.toggleBotStartBtnDisability) {\n this.toggleBotStartBtnDisability();\n this.toggleBotStartBtnDisability = undefined;\n }\n\n if(this.messageInput) {\n this.clearInput();\n helperToo && this.clearHelper();\n }\n }\n\n public async setDraft(draft?: MyDraftMessage, fromUpdate = true, force = false) {\n if((!force && !isInputEmpty(this.messageInput)) || this.chat.type === 'scheduled') return false;\n\n if(!draft) {\n draft = await this.managers.appDraftsManager.getDraft(this.chat.peerId, this.chat.threadId);\n\n if(!draft) {\n if(force) { // this situation can only happen when sending message with clearDraft\n /* const height = this.chatInput.getBoundingClientRect().height;\n const willChangeHeight = 78 - height;\n this.willChangeHeight = willChangeHeight; */\n if(this.chat.container.classList.contains('is-helper-active')) {\n this.t();\n }\n\n this.messageInputField.inputFake.textContent = '';\n this.messageInputField.onFakeInput(false);\n\n ((this.chat.bubbles.messagesQueuePromise || Promise.resolve()) as Promise).then(() => {\n fastRaf(() => {\n this.onMessageSent();\n });\n });\n }\n\n return false;\n }\n }\n\n const wrappedDraft = wrapDraft(draft, this.chat.peerId);\n const currentDraft = this.getCurrentInputAsDraft();\n\n if(draftsAreEqual(draft, currentDraft) &&/* this.messageInputField.value === wrappedDraft && */this.replyToMsgId === draft.reply_to_msg_id) return false;\n\n if(fromUpdate) {\n this.clearHelper();\n }\n\n this.noWebPage = draft.pFlags.no_webpage;\n if(draft.reply_to_msg_id) {\n this.initMessageReply(draft.reply_to_msg_id);\n }\n\n this.setInputValue(wrappedDraft, fromUpdate, fromUpdate);\n return true;\n }\n\n private createSendAs() {\n this.sendAsPeerId = undefined;\n\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\n let firstChange = true;\n this.sendAs = new ChatSendAs(\n this.managers,\n (container, skipAnimation) => {\n let useRafs = 0;\n if(!container.parentElement) {\n this.newMessageWrapper.prepend(container);\n useRafs = 2;\n }\n\n this.updateOffset('as', true, skipAnimation, useRafs);\n },\n (sendAsPeerId) => {\n this.sendAsPeerId = sendAsPeerId;\n\n // do not change placeholder earlier than finishPeerChange does\n if(firstChange) {\n firstChange = false;\n return;\n }\n\n this.getPlaceholderKey().then((key) => {\n this.updateMessageInputPlaceholder(key);\n });\n }\n );\n } else {\n this.sendAs = undefined;\n }\n\n return this.sendAs;\n }\n\n public async finishPeerChange(startParam?: string) {\n const peerId = this.chat.peerId;\n\n const {forwardElements, btnScheduled, replyKeyboard, sendMenu, goDownBtn, chatInput, botCommandsToggle} = this;\n\n const previousSendAs = this.sendAs;\n const sendAs = this.createSendAs();\n\n const [\n isBroadcast,\n canPinMessage,\n isBot,\n canSend,\n neededFakeContainer,\n ackedPeerFull,\n ackedScheduledMids,\n setSendAsCallback,\n filteredAttachMenuButtons\n ] = await Promise.all([\n this.managers.appPeersManager.isBroadcast(peerId),\n this.managers.appPeersManager.canPinMessage(peerId),\n this.managers.appPeersManager.isBot(peerId),\n this.chat.canSend(),\n this.getNeededFakeContainer(startParam),\n modifyAckedPromise(this.managers.acknowledged.appProfileManager.getProfileByPeerId(peerId)),\n btnScheduled ? modifyAckedPromise(this.managers.acknowledged.appMessagesManager.getScheduledMessages(peerId)) : undefined,\n sendAs ? (sendAs.setPeerId(this.chat.peerId), sendAs.updateManual(true)) : undefined,\n this.filterAttachMenuButtons()\n ]);\n\n const placeholderKey = this.messageInput ? await this.getPlaceholderKey() : undefined;\n\n return () => {\n // console.warn('[input] finishpeerchange start');\n\n chatInput.classList.remove('hide');\n goDownBtn.classList.toggle('is-broadcast', isBroadcast);\n goDownBtn.classList.remove('hide');\n\n this.messageInputField?.onFakeInput();\n\n if(this.goDownUnreadBadge) {\n this.setUnreadCount();\n }\n\n if(this.chat.type === 'pinned') {\n chatInput.classList.toggle('can-pin', canPinMessage);\n }/* else if(this.chat.type === 'chat') {\n } */\n\n if(forwardElements) {\n this.forwardWasDroppingAuthor = false;\n forwardElements.showCaption.checkboxField.setValueSilently(true);\n forwardElements.showSender.checkboxField.setValueSilently(true);\n }\n\n if(btnScheduled && ackedScheduledMids) {\n btnScheduled.classList.add('hide');\n const middleware = this.chat.bubbles.getMiddleware();\n callbackify(ackedScheduledMids.result, (mids) => {\n if(!middleware() || !mids) return;\n btnScheduled.classList.toggle('hide', !mids.length);\n });\n }\n\n if(this.newMessageWrapper) {\n this.updateOffset(null, false, true);\n }\n\n if(botCommandsToggle) {\n this.hasBotCommands = undefined;\n this.botCommands.toggle(true, undefined, true);\n this.updateBotCommandsToggle(true);\n botCommandsToggle.remove();\n if(isBot) {\n const middleware = this.chat.bubbles.getMiddleware();\n const result = ackedPeerFull.result;\n callbackify(result, (userFull) => {\n if(!middleware()) return;\n this.updateBotCommands(userFull as UserFull.userFull, !(result instanceof Promise));\n });\n }\n }\n\n if(previousSendAs) {\n previousSendAs.destroy();\n }\n\n if(setSendAsCallback) {\n setSendAsCallback();\n }\n\n if(replyKeyboard) {\n replyKeyboard.setPeer(peerId);\n }\n\n if(sendMenu) {\n sendMenu.setPeerId(peerId);\n }\n\n if(this.messageInput) {\n this.updateMessageInput(canSend, placeholderKey, filteredAttachMenuButtons);\n this.messageInput.dataset.peerId = '' + peerId;\n }\n\n let haveSomethingInControl = false;\n if(this.pinnedControlBtn) {\n const good = this.chat.type === 'pinned';\n haveSomethingInControl ||= good;\n this.pinnedControlBtn.classList.toggle('hide', !good);\n this.pinnedControlBtn.replaceChildren(i18n(canPinMessage ? 'Chat.Input.UnpinAll' : 'Chat.Pinned.DontShow'));\n }\n\n {\n const good = this.chat.isForum && !this.chat.isForumTopic && this.chat.type === 'chat';\n haveSomethingInControl ||= good;\n this.replyInTopicOverlay.classList.toggle('hide', !good);\n }\n\n this.botStartBtn.classList.toggle('hide', haveSomethingInControl);\n\n // * testing\n // this.startParam = this.appPeersManager.isBot(peerId) ? '123' : undefined;\n\n this.startParam = startParam;\n\n this._center(neededFakeContainer, false);\n\n // console.warn('[input] finishpeerchange ends');\n };\n }\n\n private updateOffset(type: 'commands' | 'as', forwards: boolean, skipAnimation?: boolean, useRafs?: number) {\n if(type) {\n this.newMessageWrapper.dataset.offset = type;\n } else {\n delete this.newMessageWrapper.dataset.offset;\n }\n\n SetTransition({\n element: this.newMessageWrapper,\n className: 'has-offset',\n forwards,\n duration: skipAnimation ? 0 : 300,\n useRafs\n });\n }\n\n private updateBotCommands(userFull: UserFull.userFull, skipAnimation?: boolean) {\n this.hasBotCommands = !!userFull.bot_info?.commands?.length;\n this.updateBotCommandsToggle(skipAnimation);\n }\n\n private updateBotCommandsToggle(skipAnimation?: boolean) {\n const {botCommandsToggle, hasBotCommands} = this;\n\n const show = !!hasBotCommands && this.isInputEmpty();\n if(!hasBotCommands) {\n if(!botCommandsToggle.parentElement) {\n return;\n }\n\n botCommandsToggle.remove();\n }\n\n const forwards = show;\n const useRafs = botCommandsToggle.parentElement ? 0 : 2;\n\n if(!botCommandsToggle.parentElement) {\n this.newMessageWrapper.prepend(botCommandsToggle);\n }\n\n this.updateOffset('commands', forwards, skipAnimation, useRafs);\n }\n\n private async getPlaceholderKey() {\n const {peerId, threadId, isForum} = this.chat;\n let key: LangPackKey;\n if(threadId && !isForum) {\n key = 'Comment';\n } else if(await this.managers.appPeersManager.isBroadcast(peerId)) {\n key = 'ChannelBroadcast';\n } else if(\n (this.sendAsPeerId !== undefined && this.sendAsPeerId !== rootScope.myId) ||\n await this.managers.appMessagesManager.isAnonymousSending(peerId)\n ) {\n key = 'SendAnonymously';\n } else {\n key = 'Message';\n }\n\n return key;\n }\n\n private updateMessageInputPlaceholder(key: LangPackKey) {\n // console.warn('[input] update placeholder');\n const i = I18n.weakMap.get(this.messageInput) as I18n.IntlElement;\n if(!i) {\n return;\n }\n\n i.compareAndUpdate({key});\n }\n\n private filterAttachMenuButtons() {\n if(!this.attachMenuButtons) return;\n return filterAsync(this.attachMenuButtons, (button) => {\n return button.verify();\n });\n }\n\n public updateMessageInput(canSend: boolean, placeholderKey: LangPackKey, visible: ChatInput['attachMenuButtons']) {\n const {chatInput, attachMenu, messageInput} = this;\n const {peerId, threadId} = this.chat;\n const isHidden = chatInput.classList.contains('is-hidden');\n const willBeHidden = !canSend;\n if(isHidden !== willBeHidden) {\n chatInput.classList.add('no-transition');\n chatInput.classList.toggle('is-hidden', !canSend);\n void chatInput.offsetLeft; // reflow\n chatInput.classList.remove('no-transition');\n }\n\n this.updateMessageInputPlaceholder(placeholderKey);\n\n if(!canSend) {\n messageInput.contentEditable = 'inherit';\n } else {\n messageInput.contentEditable = 'true';\n this.setDraft(undefined, false);\n\n if(!messageInput.innerHTML) {\n this.messageInputField.onFakeInput();\n }\n }\n\n if(attachMenu) {\n attachMenu.toggleAttribute('disabled', !visible.length);\n attachMenu.classList.toggle('btn-disabled', !visible.length);\n }\n\n this.updateSendBtn();\n }\n\n private attachMessageInputField() {\n const oldInputField = this.messageInputField;\n this.messageInputField = new InputFieldAnimated({\n placeholder: 'Message',\n name: 'message',\n withLinebreaks: true\n });\n\n this.messageInputField.input.classList.replace('input-field-input', 'input-message-input');\n this.messageInputField.inputFake.classList.replace('input-field-input', 'input-message-input');\n this.messageInput = this.messageInputField.input;\n this.attachMessageInputListeners();\n\n if(IS_STICKY_INPUT_BUGGED) {\n fixSafariStickyInputFocusing(this.messageInput);\n }\n\n if(oldInputField) {\n oldInputField.input.replaceWith(this.messageInputField.input);\n oldInputField.inputFake.replaceWith(this.messageInputField.inputFake);\n } else {\n this.inputMessageContainer.append(this.messageInputField.input, this.messageInputField.inputFake);\n }\n }\n\n private attachMessageInputListeners() {\n this.listenerSetter.add(this.messageInput)('keydown', (e) => {\n const key = e.key;\n\n if(isSendShortcutPressed(e)) {\n cancelEvent(e);\n this.sendMessage();\n } else if(e.ctrlKey || e.metaKey) {\n this.handleMarkdownShortcut(e);\n } else if((key === 'PageUp' || key === 'PageDown') && !e.shiftKey) { // * fix pushing page to left (Chrome Windows)\n e.preventDefault();\n\n if(key === 'PageUp') {\n const range = document.createRange();\n const sel = window.getSelection();\n\n range.setStart(this.messageInput.childNodes[0] || this.messageInput, 0);\n range.collapse(true);\n\n sel.removeAllRanges();\n sel.addRange(range);\n } else {\n placeCaretAtEnd(this.messageInput);\n }\n }\n });\n\n if(IS_TOUCH_SUPPORTED) {\n attachClickEvent(this.messageInput, (e) => {\n if(emoticonsDropdown.isActive()) {\n emoticonsDropdown.toggle(false);\n blurActiveElement();\n cancelEvent(e);\n // this.messageInput.focus();\n return;\n }\n\n this.appImManager.selectTab(APP_TABS.CHAT); // * set chat tab for album orientation\n // this.saveScroll();\n }, {listenerSetter: this.listenerSetter});\n\n /* this.listenerSetter.add(window)('resize', () => {\n this.restoreScroll();\n }); */\n\n /* if(isSafari) {\n this.listenerSetter.add(this.messageInput)('mousedown', () => {\n window.requestAnimationFrame(() => {\n window.requestAnimationFrame(() => {\n emoticonsDropdown.toggle(false);\n });\n });\n });\n } */\n }\n\n /* this.listenerSetter.add(this.messageInput)('beforeinput', (e: Event) => {\n // * validate due to manual formatting through browser's context menu\n const inputType = (e as InputEvent).inputType;\n //console.log('message beforeinput event', e);\n\n if(inputType.indexOf('format') === 0) {\n //console.log('message beforeinput format', e, inputType, this.messageInput.innerHTML);\n const markdownType = inputType.split('format')[1].toLowerCase() as MarkdownType;\n if(this.applyMarkdown(markdownType)) {\n cancelEvent(e); // * cancel legacy markdown event\n }\n }\n }); */\n this.listenerSetter.add(this.messageInput)('input', this.onMessageInput);\n this.listenerSetter.add(this.messageInput)('keyup', () => {\n this.checkAutocomplete();\n });\n\n this.listenerSetter.add(this.messageInput)('focusin', () => {\n if((this.chat.type === 'chat' || this.chat.type === 'discussion') &&\n this.chat.bubbles.scrollable.loadedAll.bottom) {\n this.managers.appMessagesManager.readAllHistory(this.chat.peerId, this.chat.threadId);\n }\n });\n }\n\n private prepareDocumentExecute = () => {\n this.executedHistory.push(this.messageInput.innerHTML);\n return () => this.canUndoFromHTML = this.messageInput.innerHTML;\n };\n\n private undoRedo = (e: Event, type: 'undo' | 'redo', needHTML: string) => {\n cancelEvent(e); // cancel legacy event\n\n let html = this.messageInput.innerHTML;\n if(html && html !== needHTML) {\n this.lockRedo = true;\n\n let sameHTMLTimes = 0;\n do {\n document.execCommand(type, false, null);\n const currentHTML = this.messageInput.innerHTML;\n if(html === currentHTML) {\n if(++sameHTMLTimes > 2) { // * unlink, removeFormat (ะฐ ะผะพะถะตั‚ ะธ ะฝะตั‚, ัะปัƒั‡ะฐะน: ะทะฐะฑะพะปะดะธั‚ัŒ ะฟะพะดั‡ั‘ั€ะบะฝัƒั‚ั‹ะน ั‚ะตะบัั‚ (ะฒั‹ะดะตะปะธั‚ัŒ ั€ะพะฒะฝะพ ะตะณะพ), ะฟะพะฟั€ะพะฑะพะฒะฐั‚ัŒ ะพั‚ะผะตะฝะธั‚ัŒ)\n break;\n }\n } else {\n sameHTMLTimes = 0;\n }\n\n html = currentHTML;\n } while(html !== needHTML);\n\n this.lockRedo = false;\n }\n };\n\n public applyMarkdown(type: MarkdownType, href?: string) {\n // const MONOSPACE_FONT = 'var(--font-monospace)';\n // const SPOILER_FONT = 'spoiler';\n const commandsMap: Partial<{[key in typeof type]: string | (() => void)}> = {\n // bold: 'Bold',\n // italic: 'Italic',\n // underline: 'Underline',\n // strikethrough: 'Strikethrough',\n // monospace: () => document.execCommand('fontName', false, MONOSPACE_FONT),\n link: href ? () => document.execCommand('createLink', false, href) : () => document.execCommand('unlink', false, null)\n // spoiler: () => document.execCommand('fontName', false, SPOILER_FONT)\n };\n\n const c = (type: MarkdownType) => {\n commandsMap[type] = () => {\n const k = (canCombine.includes(type) ? canCombine : [type]).filter((type) => hasMarkup[type]);\n if(!indexOfAndSplice(k, type)) {\n k.push(type);\n }\n\n if(!k.length) {\n return this.resetCurrentFontFormatting();\n } else {\n return document.execCommand('fontName', false, 'markup-' + k.join('-'));\n }\n };\n };\n\n const canCombine = ['bold', 'italic', 'underline', 'strikethrough', 'spoiler'] as (typeof type)[];\n canCombine.forEach((type) => {\n c(type);\n });\n\n c('monospace');\n\n if(!commandsMap[type]) {\n return false;\n }\n\n const command = commandsMap[type];\n\n // type = 'monospace';\n\n // const saveExecuted = this.prepareDocumentExecute();\n const executed: any[] = [];\n /**\n * * clear previous formatting, due to Telegram's inability to handle several entities\n */\n /* const checkForSingle = () => {\n const nodes = getSelectedNodes();\n //console.log('Using formatting:', commandsMap[type], nodes, this.executedHistory);\n\n const parents = [...new Set(nodes.map((node) => node.parentNode))];\n //const differentParents = !!nodes.find((node) => node.parentNode !== firstParent);\n const differentParents = parents.length > 1;\n\n let notSingle = false;\n if(differentParents) {\n notSingle = true;\n } else {\n const node = nodes[0];\n if(node && (node.parentNode as HTMLElement) !== this.messageInput && (node.parentNode.parentNode as HTMLElement) !== this.messageInput) {\n notSingle = true;\n }\n }\n\n if(notSingle) {\n //if(type === 'monospace') {\n executed.push(document.execCommand('styleWithCSS', false, 'true'));\n //}\n\n executed.push(document.execCommand('unlink', false, null));\n executed.push(document.execCommand('removeFormat', false, null));\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\n\n //if(type === 'monospace') {\n executed.push(document.execCommand('styleWithCSS', false, 'false'));\n //}\n }\n }; */\n\n // fix applying markdown when range starts from contenteditable=\"false\"\n let textNode: Text;\n // do {\n // // const {node, offset, selection} = getCaretPosNew(this.messageInput, true);\n // const selection = document.getSelection();\n // const range = selection.getRangeAt(0);\n // const {node, offset} = getCaretPosF(this.messageInput, range.startContainer, range.startOffset);\n // // const node = range.startContainer as ChildNode;\n // if(node?.textContent === BOM || (node as HTMLElement)?.isContentEditable === false) {\n // // selection.modify('extend', 'backward', 'character');\n // textNode = document.createTextNode(BOM);\n // (node.nodeType === node.ELEMENT_NODE ? node : node.parentElement).before(textNode);\n // range.setStart(textNode, 0);\n // }/* else {\n // break;\n // } */\n\n // break;\n // } while(true);\n\n const richInputHandler = RichInputHandler.getInstance();\n const restore = richInputHandler.prepareApplyingMarkdown();\n\n const listener = this.listenerSetter.add(this.messageInput)('input', cancelEvent, {capture: true, passive: false}) as any as Listener;\n\n executed.push(document.execCommand('styleWithCSS', false, 'true'));\n\n const hasMarkup = hasMarkupInSelection(Object.keys(commandsMap) as (typeof type)[]);\n\n // * monospace can't be combined with different types\n /* if(type === 'monospace' || type === 'spoiler') {\n // executed.push(document.execCommand('styleWithCSS', false, 'true'));\n\n const haveThisType = hasMarkup[type];\n // executed.push(document.execCommand('removeFormat', false, null));\n\n if(haveThisType) {\n executed.push(this.resetCurrentFontFormatting());\n } else {\n // if(type === 'monospace' || hasMarkup['monospace']) {\n // executed.push(this.resetCurrentFormatting());\n // }\n\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\n }\n } else */{\n if(hasMarkup['monospace'] && type === 'link') {\n executed.push(this.resetCurrentFormatting());\n }\n\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\n }\n\n executed.push(document.execCommand('styleWithCSS', false, 'false'));\n\n restore();\n\n // checkForSingle();\n // saveExecuted();\n if(this.appImManager.markupTooltip) {\n this.appImManager.markupTooltip.setActiveMarkupButton();\n }\n\n if(textNode) {\n (textNode.parentElement === this.messageInput ? textNode : textNode.parentElement).remove();\n textNode.nodeValue = '';\n }\n\n this.listenerSetter.remove(listener);\n this.messageInputField.simulateInputEvent();\n\n return true;\n }\n\n private resetCurrentFormatting() {\n return document.execCommand('removeFormat', false, null);\n }\n\n private resetCurrentFontFormatting() {\n return document.execCommand('fontName', false, 'Roboto');\n }\n\n private handleMarkdownShortcut = (e: KeyboardEvent) => {\n // console.log('handleMarkdownShortcut', e);\n const formatKeys: {[key: string]: MarkdownType} = {\n 'KeyB': 'bold',\n 'KeyI': 'italic',\n 'KeyU': 'underline',\n 'KeyS': 'strikethrough',\n 'KeyM': 'monospace',\n 'KeyP': 'spoiler'\n };\n\n if(this.appImManager.markupTooltip) {\n formatKeys['KeyK'] = 'link';\n }\n\n const code = e.code;\n const applyMarkdown = formatKeys[code];\n\n const selection = document.getSelection();\n if(!isSelectionEmpty(selection) && applyMarkdown) {\n // * ะบะพัั‚ั‹ะปัŒั‡ะธะบ\n if(code === 'KeyK') {\n this.appImManager.markupTooltip.showLinkEditor();\n } else {\n this.applyMarkdown(applyMarkdown);\n }\n\n cancelEvent(e); // cancel legacy event\n }\n\n // return;\n if(code === 'KeyZ') {\n let html = this.messageInput.innerHTML;\n\n if(e.shiftKey) {\n if(this.undoHistory.length) {\n this.executedHistory.push(html);\n html = this.undoHistory.pop();\n this.undoRedo(e, 'redo', html);\n html = this.messageInput.innerHTML;\n this.canRedoFromHTML = this.undoHistory.length ? html : '';\n this.canUndoFromHTML = html;\n }\n } else {\n // * ะฟะพะดะพะถะดั‘ะผ, ะบะพะณะดะฐ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปัŒ ัะฐะผ ะฒะพััั‚ะฐะฝะพะฒะธั‚ ะฟะพะปะต ะดะพ ะฝัƒะถะฝะพะณะพ ัะพัั‚ะพัะฝะธั, ะบะพั‚ะพั€ะพะต ัั‚ะฐะปะพ ัั€ะฐะทัƒ ะฟะพัะปะต saveExecuted\n if(this.executedHistory.length && (!this.canUndoFromHTML || html === this.canUndoFromHTML)) {\n this.undoHistory.push(html);\n html = this.executedHistory.pop();\n this.undoRedo(e, 'undo', html);\n\n // * ะฟะพัั‚ะฐะฒะธะผ ะฝะพะฒะพะต ัะพัั‚ะพัะฝะธะต ั‡ั‚ะพะฑั‹ ัะฝะพะฒะฐ ะฟะพะดะพะถะดะฐั‚ัŒ, ะตัะปะธ ะฟะพะปัŒะทะพะฒะฐั‚ะตะปัŒ ะธะทะผะตะฝะธั‚ ั‡ั‚ะพ-ั‚ะพ, ะธ ะฟะพั‚ะพะผ ะฟะพะฟั€ะพะฑัƒะตั‚ ะพั‚ะบะฐั‚ะธั‚ัŒ ะดะพ ะฟั€ะตะดั‹ะดัƒั‰ะตะณะพ ัะพัั‚ะพัะฝะธั\n this.canUndoFromHTML = this.canRedoFromHTML = this.messageInput.innerHTML;\n }\n }\n }\n };\n\n private onMessageInput = (e?: Event) => {\n // * validate due to manual formatting through browser's context menu\n /* const inputType = (e as InputEvent).inputType;\n console.log('message input event', e);\n if(inputType === 'formatBold') {\n console.log('message input format', this.messageInput.innerHTML);\n cancelEvent(e);\n }\n\n if(!isSelectionSingle()) {\n alert('not single');\n } */\n\n // console.log('messageInput input', this.messageInput.innerText);\n // const value = this.messageInput.innerText;\n const {value: richValue, entities: markdownEntities, caretPos} = getRichValueWithCaret(this.messageInputField.input);\n\n // const entities = parseEntities(value);\n const value = parseMarkdown(richValue, markdownEntities, true);\n const entities = mergeEntities(markdownEntities, parseEntities(value));\n\n // this.chat.log('messageInput entities', richValue, value, markdownEntities, caretPos);\n\n if(this.canRedoFromHTML && !this.lockRedo && this.messageInput.innerHTML !== this.canRedoFromHTML) {\n this.canRedoFromHTML = '';\n this.undoHistory.length = 0;\n }\n\n const urlEntities: Array = (!this.editMessage?.media || this.editMessage.media._ === 'messageMediaWebPage') && entities.filter((e) => e._ === 'messageEntityUrl' || e._ === 'messageEntityTextUrl') as any;\n if(urlEntities.length) {\n for(const entity of urlEntities) {\n let url: string;\n if(entity._ === 'messageEntityTextUrl') {\n url = entity.url;\n } else {\n url = richValue.slice(entity.offset, entity.offset + entity.length);\n\n if(!(url.includes('http://') || url.includes('https://'))) {\n continue;\n }\n }\n\n // console.log('messageInput url:', url);\n\n if(this.lastUrl !== url) {\n this.lastUrl = url;\n // this.willSendWebPage = null;\n const promise = this.getWebPagePromise = this.managers.appWebPagesManager.getWebPage(url).then((webpage) => {\n if(this.getWebPagePromise === promise) this.getWebPagePromise = undefined;\n if(this.lastUrl !== url) return;\n if(webpage._ === 'webPage') {\n // console.log('got webpage: ', webpage);\n\n this.setTopInfo('webpage', () => {}, webpage.site_name || webpage.title || 'Webpage', webpage.description || webpage.url || '');\n delete this.noWebPage;\n this.willSendWebPage = webpage;\n } else if(this.willSendWebPage) {\n this.onHelperCancel();\n }\n });\n }\n\n break;\n }\n } else if(this.lastUrl) {\n this.lastUrl = '';\n delete this.noWebPage;\n this.willSendWebPage = null;\n\n if(this.helperType) {\n this.helperFunc();\n } else {\n this.clearHelper();\n }\n }\n\n const isEmpty = !richValue.trim();\n if(isEmpty) {\n if(this.lastTimeType) {\n this.managers.appMessagesManager.setTyping(this.chat.peerId, {_: 'sendMessageCancelAction'}, undefined, this.chat.threadId);\n }\n\n if(this.appImManager.markupTooltip) {\n this.appImManager.markupTooltip.hide();\n }\n\n // * Chrome has a bug - it will preserve the formatting if the input with monospace text is cleared\n // * so have to reset formatting\n if(document.activeElement === this.messageInput) {\n // document.execCommand('styleWithCSS', false, 'true');\n setTimeout(() => {\n if(document.activeElement === this.messageInput) {\n this.resetCurrentFontFormatting();\n }\n }, 0);\n // document.execCommand('styleWithCSS', false, 'false');\n }\n } else {\n const time = Date.now();\n if((time - this.lastTimeType) >= 6000) {\n this.lastTimeType = time;\n this.managers.appMessagesManager.setTyping(this.chat.peerId, {_: 'sendMessageTypingAction'}, undefined, this.chat.threadId);\n }\n\n if(this.botCommands) {\n this.botCommands.toggle(true);\n }\n }\n\n if(this.botCommands) {\n this.updateBotCommandsToggle();\n }\n\n if(!this.editMsgId) {\n this.saveDraftDebounced();\n }\n\n this.checkAutocomplete(richValue, caretPos, entities);\n\n this.updateSendBtn();\n };\n\n public insertAtCaret(insertText: string, insertEntity?: MessageEntity, isHelper = true) {\n RichInputHandler.getInstance().makeFocused(this.messageInput);\n\n const {value: fullValue, caretPos, entities} = getRichValueWithCaret(this.messageInput);\n const pos = caretPos >= 0 ? caretPos : fullValue.length;\n const prefix = fullValue.substr(0, pos);\n const suffix = fullValue.substr(pos);\n\n const matches = isHelper ? prefix.match(ChatInput.AUTO_COMPLETE_REG_EXP) : null;\n\n const matchIndex = matches ? matches.index + (matches[0].length - matches[2].length) : prefix.length;\n const newPrefix = prefix.slice(0, matchIndex);\n const newValue = newPrefix + insertText + suffix;\n\n if(isHelper && caretPos !== -1) {\n const match = matches[2];\n // const {node, selection} = getCaretPosNew(this.messageInput);\n\n const selection = document.getSelection();\n // const range = document.createRange();\n let counter = 0;\n while(selection.toString() !== match) {\n if(++counter >= 10000) {\n throw new Error('lolwhat');\n }\n\n // for(let i = 0; i < match.length; ++i) {\n selection.modify('extend', 'backward', 'character');\n }\n }\n\n {\n // const fragment = wrapDraftText(insertText, {entities: insertEntity ? [insertEntity] : undefined, wrappingForPeerId: this.chat.peerId});\n insertRichTextAsHTML(this.messageInput, insertText, insertEntity ? [insertEntity] : undefined, this.chat.peerId);\n // const {node, offset} = getCaretPos(this.messageInput);\n // const fragmentLastChild = fragment.lastChild;\n // if(node?.nodeType === node.TEXT_NODE) {\n // const prefix = node.nodeValue.slice(0, offset);\n // const suffix = node.nodeValue.slice(offset);\n\n // const suffixNode = document.createTextNode(suffix);\n\n // node.nodeValue = prefix;\n // node.parentNode.insertBefore(suffixNode, node.nextSibling);\n // node.parentNode.insertBefore(fragment, suffixNode);\n\n // setCaretAt(fragmentLastChild.nextSibling);\n\n // this.messageInputField.simulateInputEvent();\n // }\n }\n return;\n\n // merge emojis\n const hadEntities = parseEntities(fullValue);\n mergeEntities(entities, hadEntities);\n\n // max for additional whitespace\n const insertLength = insertEntity ? Math.max(insertEntity.length, insertText.length) : insertText.length;\n const addEntities: MessageEntity[] = [];\n if(insertEntity) {\n addEntities.push(insertEntity);\n insertEntity.offset = matchIndex;\n }\n\n // add offset to entities next to emoji\n const diff = matches ? insertLength - matches[2].length : insertLength;\n entities.forEach((entity) => {\n if(entity.offset >= matchIndex) {\n entity.offset += diff;\n }\n });\n\n mergeEntities(entities, addEntities);\n\n if(/* caretPos !== -1 && caretPos !== fullValue.length */true) {\n const caretEntity: MessageEntity.messageEntityCaret = {\n _: 'messageEntityCaret',\n offset: matchIndex + insertLength,\n length: 0\n };\n\n let insertCaretAtIndex = 0;\n for(let length = entities.length; insertCaretAtIndex < length; ++insertCaretAtIndex) {\n const entity = entities[insertCaretAtIndex];\n if(entity.offset > caretEntity.offset) {\n break;\n }\n }\n\n entities.splice(insertCaretAtIndex, 0, caretEntity);\n }\n\n // const saveExecuted = this.prepareDocumentExecute();\n // can't exec .value here because it will instantly check for autocomplete\n const value = documentFragmentToHTML(wrapDraftText(newValue, {entities}));\n this.messageInputField.setValueSilently(value);\n\n const caret = this.messageInput.querySelector('.composer-sel');\n if(caret) {\n setCaretAt(caret);\n caret.remove();\n }\n\n // but it's needed to be checked only here\n this.onMessageInput();\n\n // saveExecuted();\n\n // document.execCommand('insertHTML', true, wrapEmojiText(emoji));\n }\n\n public onEmojiSelected = (emoji: ReturnType, autocomplete: boolean) => {\n const entity: MessageEntity = emoji.docId ? {_: 'messageEntityCustomEmoji', document_id: emoji.docId, length: emoji.emoji.length, offset: 0} : getEmojiEntityFromEmoji(emoji.emoji);\n this.insertAtCaret(emoji.emoji, entity, autocomplete);\n };\n\n private async checkAutocomplete(value?: string, caretPos?: number, entities?: MessageEntity[]) {\n // return;\n\n if(value === undefined) {\n const r = getRichValueWithCaret(this.messageInputField.input, true, true);\n value = r.value;\n caretPos = r.caretPos;\n entities = r.entities;\n }\n\n if(caretPos === -1) {\n caretPos = value.length;\n }\n\n if(entities === undefined) {\n const _value = parseMarkdown(value, entities, true);\n entities = mergeEntities(entities, parseEntities(_value));\n }\n\n value = value.slice(0, caretPos);\n\n if(this.previousQuery === value) {\n return;\n }\n\n this.previousQuery = value;\n\n const matches = value.match(ChatInput.AUTO_COMPLETE_REG_EXP);\n let foundHelper: AutocompleteHelper;\n if(matches) {\n const entity = entities[0];\n\n let query = matches[2];\n const firstChar = query[0];\n\n if(this.stickersHelper &&\n rootScope.settings.stickers.suggest &&\n await this.chat.canSend('send_stickers') &&\n entity?._ === 'messageEntityEmoji' && entity.length === value.length && !entity.offset) {\n foundHelper = this.stickersHelper;\n this.stickersHelper.checkEmoticon(value);\n } else if(firstChar === '@') { // mentions\n const topMsgId = this.chat.threadId ? getServerMessageId(this.chat.threadId) : undefined;\n if(await this.mentionsHelper.checkQuery(query, this.chat.peerId.isUser() ? NULL_PEER_ID : this.chat.peerId, topMsgId)) {\n foundHelper = this.mentionsHelper;\n }\n } else if(!matches[1] && firstChar === '/') { // commands\n if(await this.commandsHelper.checkQuery(query, this.chat.peerId)) {\n foundHelper = this.commandsHelper;\n }\n } else if(rootScope.settings.emoji.suggest) { // emoji\n query = query.replace(/^\\s*/, '');\n if(!value.match(/^\\s*:(.+):\\s*$/) && !value.match(/:[;!@#$%^&*()-=|]/) && query) {\n foundHelper = this.emojiHelper;\n this.emojiHelper.checkQuery(query, firstChar);\n }\n }\n }\n\n foundHelper = this.checkInlineAutocomplete(value, foundHelper);\n\n this.autocompleteHelperController.hideOtherHelpers(foundHelper);\n }\n\n private checkInlineAutocomplete(value: string, foundHelper?: AutocompleteHelper): AutocompleteHelper {\n let needPlaceholder = false;\n\n const setPreloaderShow = (show: boolean) => {\n if(!this.btnPreloader) {\n return;\n }\n\n SetTransition({\n element: this.btnPreloader,\n className: 'show',\n forwards: show,\n duration: 400\n });\n };\n\n if(!foundHelper) {\n const inlineMatch = value.match(/^@([a-zA-Z\\\\d_]{3,32})\\s/);\n if(inlineMatch) {\n const username = inlineMatch[1];\n const query = value.slice(inlineMatch[0].length);\n needPlaceholder = inlineMatch[0].length === value.length;\n\n foundHelper = this.inlineHelper;\n\n if(!this.btnPreloader) {\n this.btnPreloader = ButtonIcon('none btn-preloader float show disable-hover', {noRipple: true});\n putPreloader(this.btnPreloader, true);\n this.inputMessageContainer.parentElement.insertBefore(this.btnPreloader, this.inputMessageContainer.nextSibling);\n } else {\n setPreloaderShow(true);\n }\n\n this.inlineHelper.checkQuery(this.chat.peerId, username, query).then(({user, renderPromise}) => {\n if(needPlaceholder && user.bot_inline_placeholder) {\n this.messageInput.dataset.inlinePlaceholder = user.bot_inline_placeholder;\n }\n\n renderPromise.then(() => {\n setPreloaderShow(false);\n });\n }).catch((err: ApiError) => {\n setPreloaderShow(false);\n });\n }\n }\n\n if(!needPlaceholder) {\n delete this.messageInput.dataset.inlinePlaceholder;\n }\n\n if(foundHelper !== this.inlineHelper) {\n setPreloaderShow(false);\n }\n\n return foundHelper;\n }\n\n private setRecording(value: boolean) {\n if(this.recording === value) {\n return;\n }\n\n SetTransition({\n element: this.chatInput,\n className: 'is-recording',\n forwards: value,\n duration: 200\n });\n this.recording = value;\n this.updateSendBtn();\n }\n\n private onBtnSendClick = async(e: Event) => {\n cancelEvent(e);\n\n if(!this.recorder || this.recording || !this.isInputEmpty() || this.forwarding || this.editMsgId) {\n if(this.recording) {\n if((Date.now() - this.recordStartTime) < RECORD_MIN_TIME) {\n this.onCancelRecordClick();\n } else {\n this.recorder.stop();\n }\n } else {\n this.sendMessage();\n }\n } else {\n const isAnyChat = this.chat.peerId.isAnyChat();\n if(isAnyChat && !(await this.chat.canSend('send_media'))) {\n toast(POSTING_MEDIA_NOT_ALLOWED);\n return;\n }\n\n this.chatInput.classList.add('is-locked');\n blurActiveElement();\n\n let restricted = false;\n if(!isAnyChat) {\n const userFull = await this.managers.appProfileManager.getProfile(this.chat.peerId.toUserId());\n if(userFull?.pFlags.voice_messages_forbidden) {\n toastNew({\n langPackKey: 'Chat.SendVoice.PrivacyError',\n langPackArguments: [await wrapPeerTitle({peerId: this.chat.peerId})]\n });\n restricted = true;\n }\n }\n\n if(restricted) {\n this.chatInput.classList.remove('is-locked');\n return;\n }\n\n this.recorder.start().then(() => {\n this.releaseMediaPlayback = appMediaPlaybackController.setSingleMedia();\n this.recordCanceled = false;\n\n this.setRecording(true);\n opusDecodeController.setKeepAlive(true);\n\n const showDiscardPopup = () => {\n new PopupPeer('popup-cancel-record', {\n titleLangKey: 'DiscardVoiceMessageTitle',\n descriptionLangKey: 'DiscardVoiceMessageDescription',\n buttons: [{\n langKey: 'DiscardVoiceMessageAction',\n callback: () => {\n simulateClickEvent(this.btnCancelRecord);\n }\n }, {\n langKey: 'Continue',\n isCancel: true\n }]\n }).show();\n };\n\n this.recordingOverlayListener = this.listenerSetter.add(document.body)('mousedown', (e) => {\n if(!findUpClassName(e.target, 'chat-input') && !findUpClassName(e.target, 'popup-cancel-record')) {\n cancelEvent(e);\n showDiscardPopup();\n }\n }, {capture: true, passive: false}) as any;\n\n appNavigationController.pushItem(this.recordingNavigationItem = {\n type: 'voice',\n onPop: () => {\n setTimeout(() => {\n showDiscardPopup();\n }, 0);\n\n return false;\n }\n });\n\n this.recordStartTime = Date.now();\n\n const sourceNode: MediaStreamAudioSourceNode = this.recorder.sourceNode;\n const context = sourceNode.context;\n\n const analyser = context.createAnalyser();\n sourceNode.connect(analyser);\n // analyser.connect(context.destination);\n analyser.fftSize = 32;\n\n const frequencyData = new Uint8Array(analyser.frequencyBinCount);\n const max = frequencyData.length * 255;\n const min = 54 / 150;\n const r = () => {\n if(!this.recording) return;\n\n analyser.getByteFrequencyData(frequencyData);\n\n let sum = 0;\n frequencyData.forEach((value) => {\n sum += value;\n });\n\n const percents = Math.min(1, (sum / max) + min);\n // console.log('frequencyData', frequencyData, percents);\n\n this.recordRippleEl.style.transform = `scale(${percents})`;\n\n const diff = Date.now() - this.recordStartTime;\n const ms = diff % 1000;\n\n const formatted = toHHMMSS(diff / 1000) + ',' + ('00' + Math.round(ms / 10)).slice(-2);\n\n this.recordTimeEl.innerText = formatted;\n\n fastRaf(r);\n };\n\n r();\n }).catch((e: Error) => {\n switch(e.name as string) {\n case 'NotAllowedError': {\n toast('Please allow access to your microphone');\n break;\n }\n\n case 'NotReadableError': {\n toast(e.message);\n break;\n }\n\n default:\n console.error('Recorder start error:', e, e.name, e.message);\n toast(e.message);\n break;\n }\n\n this.setRecording(false);\n this.chatInput.classList.remove('is-locked');\n });\n }\n };\n\n private onHelperCancel = async(e?: Event, force?: boolean) => {\n if(e) {\n cancelEvent(e);\n }\n\n if(this.willSendWebPage) {\n const lastUrl = this.lastUrl;\n let needReturn = false;\n if(this.helperType) {\n // if(this.helperFunc) {\n await this.helperFunc();\n // }\n\n needReturn = true;\n }\n\n // * restore values\n this.lastUrl = lastUrl;\n this.noWebPage = true;\n this.willSendWebPage = null;\n\n if(needReturn) return;\n }\n\n if(this.helperType === 'edit' && !force) {\n const message = this.editMessage;\n const draft = this.getCurrentInputAsDraft(true);\n if(draft) {\n delete draft.pFlags.no_webpage;\n }\n // const value = parseMarkdown(this.messageInputField.value, []);\n // if(message.message !== value) {\n const originalDraft = {...message, _: 'draftMessage'} as DraftMessage.draftMessage;\n if(originalDraft.entities?.length) {\n const canPassEntitiesTypes = new Set(Object.values(MARKDOWN_ENTITIES));\n originalDraft.entities = originalDraft.entities.slice();\n forEachReverse(originalDraft.entities, (entity, idx, arr) => {\n if(!canPassEntitiesTypes.has(entity._)) {\n arr.splice(idx, 1);\n }\n });\n\n if(!originalDraft.entities.length) {\n delete originalDraft.entities;\n }\n }\n\n if(!draftsAreEqual(draft, originalDraft)) {\n new PopupPeer('discard-editing', {\n buttons: [{\n langKey: 'Alert.Confirm.Discard',\n callback: () => {\n this.onHelperCancel(undefined, true);\n }\n }],\n descriptionLangKey: 'Chat.Edit.Cancel.Text'\n }).show();\n\n return;\n }\n }\n\n this.clearHelper();\n this.updateSendBtn();\n };\n\n private onHelperClick = (e: Event) => {\n cancelEvent(e);\n\n if(!findUpClassName(e.target, 'reply')) return;\n if(this.helperType === 'forward') {\n const {forwardElements} = this;\n if(forwardElements && IS_TOUCH_SUPPORTED && !forwardElements.container.classList.contains('active')) {\n contextMenuController.openBtnMenu(forwardElements.container);\n }\n } else if(this.helperType === 'reply') {\n this.chat.setMessageId(this.replyToMsgId);\n } else if(this.helperType === 'edit') {\n this.chat.setMessageId(this.editMsgId);\n }\n };\n\n private changeForwardRecipient() {\n if(this.helperWaitingForward) return;\n this.helperWaitingForward = true;\n\n const forwarding = copy(this.forwarding);\n const helperFunc = this.helperFunc;\n this.clearHelper();\n this.updateSendBtn();\n let selected = false;\n const popup = new PopupForward(forwarding, () => {\n selected = true;\n });\n\n popup.addEventListener('close', () => {\n this.helperWaitingForward = false;\n\n if(!selected) {\n helperFunc();\n }\n });\n }\n\n public async clearInput(canSetDraft = true, fireEvent = true, clearValue = '') {\n if(document.activeElement === this.messageInput && IS_MOBILE_SAFARI) { // fix first char uppercase\n const i = document.createElement('input');\n document.body.append(i);\n fixSafariStickyInput(i);\n this.messageInputField.setValueSilently(clearValue);\n fixSafariStickyInput(this.messageInput);\n i.remove();\n } else {\n this.messageInputField.setValueSilently(clearValue);\n }\n\n if(IS_TOUCH_SUPPORTED) {\n // this.messageInput.innerText = '';\n } else {\n // this.attachMessageInputField();\n // this.messageInput.innerText = '';\n\n // clear executions\n this.canRedoFromHTML = '';\n this.undoHistory.length = 0;\n this.executedHistory.length = 0;\n this.canUndoFromHTML = '';\n }\n\n let set = false;\n if(canSetDraft) {\n set = await this.setDraft(undefined, false);\n }\n\n if(!set && fireEvent) {\n this.onMessageInput();\n }\n }\n\n public isInputEmpty() {\n return isInputEmpty(this.messageInput);\n }\n\n public updateSendBtn() {\n let icon: 'send' | 'record' | 'edit' | 'schedule';\n\n const isInputEmpty = this.isInputEmpty();\n\n if(this.editMsgId) icon = 'edit';\n else if(!this.recorder || this.recording || !isInputEmpty || this.forwarding) icon = this.chat.type === 'scheduled' ? 'schedule' : 'send';\n else icon = 'record';\n\n ['send', 'record', 'edit', 'schedule'].forEach((i) => {\n this.btnSend.classList.toggle(i, icon === i);\n });\n\n if(this.btnScheduled) {\n this.btnScheduled.classList.toggle('show', isInputEmpty && this.chat.type !== 'scheduled');\n }\n\n if(this.btnToggleReplyMarkup) {\n this.btnToggleReplyMarkup.classList.toggle('show', isInputEmpty && this.chat.type !== 'scheduled');\n }\n }\n\n private getValueAndEntities(input: HTMLElement) {\n const {entities: apiEntities, value} = getRichValueWithCaret(this.messageInput, true, false);\n const myEntities = parseEntities(value);\n const totalEntities = mergeEntities(apiEntities, myEntities);\n\n return {value, totalEntities};\n }\n\n public onMessageSent(clearInput = true, clearReply?: boolean) {\n if(this.chat.type !== 'scheduled') {\n this.managers.appMessagesManager.readAllHistory(this.chat.peerId, this.chat.threadId, true);\n }\n\n this.scheduleDate = undefined;\n this.sendSilent = undefined;\n\n const {totalEntities} = this.getValueAndEntities(this.messageInput);\n let nextOffset = 0;\n const emojiEntities: (MessageEntity.messageEntityEmoji | MessageEntity.messageEntityCustomEmoji)[] = totalEntities.filter((entity) => {\n if(entity._ === 'messageEntityEmoji' || entity._ === 'messageEntityCustomEmoji') {\n const endOffset = entity.offset + entity.length;\n return endOffset <= nextOffset ? false : (nextOffset = endOffset, true);\n }\n\n return false;\n }) as any;\n emojiEntities.forEach((entity) => {\n const emoji: AppEmoji = entity._ === 'messageEntityEmoji' ? {emoji: emojiFromCodePoints(entity.unicode)} : {docId: entity.document_id, emoji: ''};\n this.managers.appEmojiManager.pushRecentEmoji(emoji);\n });\n\n if(clearInput) {\n this.lastUrl = '';\n delete this.noWebPage;\n this.willSendWebPage = null;\n this.clearInput();\n }\n\n if(clearReply || clearInput) {\n this.clearHelper();\n }\n\n this.updateSendBtn();\n }\n\n public sendMessage(force = false) {\n const {editMsgId, chat} = this;\n if(chat.type === 'scheduled' && !force && !editMsgId) {\n this.scheduleSending();\n return;\n }\n\n const {peerId} = chat;\n const {noWebPage} = this;\n const sendingParams = this.chat.getMessageSendingParams();\n\n const {value, entities} = getRichValueWithCaret(this.messageInputField.input, true, false);\n\n // return;\n if(editMsgId) {\n const message = this.editMessage;\n if(value.trim() || message.media) {\n this.managers.appMessagesManager.editMessage(message, value, {\n entities,\n noWebPage: noWebPage\n });\n\n this.onMessageSent();\n } else {\n new PopupDeleteMessages(peerId, [editMsgId], chat.type);\n\n return;\n }\n } else if(value.trim()) {\n this.managers.appMessagesManager.sendText(peerId, value, {\n entities,\n ...sendingParams,\n noWebPage: noWebPage,\n webPage: this.getWebPagePromise ? undefined : this.willSendWebPage,\n clearDraft: true\n });\n\n if(this.chat.type === 'scheduled') {\n this.onMessageSent(true);\n } else {\n this.onMessageSent(false, false);\n }\n // this.onMessageSent();\n }\n\n // * wait for sendText set messageId for invokeAfterMsg\n if(this.forwarding) {\n const forwarding = copy(this.forwarding);\n // setTimeout(() => {\n for(const fromPeerId in forwarding) {\n this.managers.appMessagesManager.forwardMessages(peerId, fromPeerId.toPeerId(), forwarding[fromPeerId], {\n ...sendingParams,\n dropAuthor: this.forwardElements && this.forwardElements.hideSender.checkboxField.checked,\n dropCaptions: this.isDroppingCaptions()\n }).catch(async(err: ApiError) => {\n if(err.type === 'VOICE_MESSAGES_FORBIDDEN') {\n toastNew({\n langPackKey: 'Chat.SendVoice.PrivacyError',\n langPackArguments: [await wrapPeerTitle({peerId})]\n });\n }\n });\n }\n\n if(!value) {\n this.onMessageSent();\n }\n // }, 0);\n }\n\n // this.onMessageSent();\n }\n\n public async sendMessageWithDocument(\n document: MyDocument | DocId,\n force = false,\n clearDraft = false,\n silent = false\n ) {\n document = await this.managers.appDocsManager.getDoc(document);\n\n const flag = document.type === 'sticker' ? 'send_stickers' : (document.type === 'gif' ? 'send_gifs' : 'send_media');\n if(this.chat.peerId.isAnyChat() && !(await this.chat.canSend(flag))) {\n toast(POSTING_MEDIA_NOT_ALLOWED);\n return false;\n }\n\n if(this.chat.type === 'scheduled' && !force) {\n this.scheduleSending(() => this.sendMessageWithDocument(document, true, clearDraft, silent));\n return false;\n }\n\n if(!document) {\n return false;\n }\n\n if(document.sticker && getStickerEffectThumb(document) && !rootScope.premium) {\n return false;\n }\n\n this.managers.appMessagesManager.sendFile(this.chat.peerId, {\n ...this.chat.getMessageSendingParams(),\n file: document,\n isMedia: true,\n clearDraft,\n silent\n });\n this.onMessageSent(clearDraft, true);\n\n if(document.type === 'sticker') {\n this.managers.appStickersManager.saveRecentSticker(document.id);\n }\n\n return true;\n }\n\n private canToggleHideAuthor() {\n const {forwardElements} = this;\n if(!forwardElements) return false;\n const hideCaptionCheckboxField = forwardElements.hideCaption.checkboxField;\n return !hideCaptionCheckboxField.checked ||\n findUpTag(hideCaptionCheckboxField.label, 'FORM').classList.contains('hide');\n }\n\n private isDroppingCaptions() {\n return !this.canToggleHideAuthor();\n }\n\n /* public sendSomething(callback: () => void, force = false) {\n if(this.chat.type === 'scheduled' && !force) {\n this.scheduleSending(() => this.sendSomething(callback, true));\n return false;\n }\n\n callback();\n this.onMessageSent(false, true);\n\n return true;\n } */\n\n public async initMessageEditing(mid: number) {\n const message = (await this.chat.getMessage(mid)) as Message.message;\n\n let input = wrapDraftText(message.message, {entities: message.totalEntities, wrappingForPeerId: this.chat.peerId});\n const f = async() => {\n const replyFragment = await wrapMessageForReply({message, usingMids: [message.mid]});\n this.setTopInfo('edit', f, i18n('AccDescrEditing'), replyFragment, input, message);\n\n this.editMsgId = mid;\n this.editMessage = message;\n input = undefined;\n };\n f();\n }\n\n public initMessagesForward(fromPeerIdsMids: {[fromPeerId: PeerId]: number[]}) {\n const f = async() => {\n // const peerTitles: string[]\n const fromPeerIds = Object.keys(fromPeerIdsMids).map((fromPeerId) => fromPeerId.toPeerId());\n const smth: Set = new Set();\n let length = 0, messagesWithCaptionsLength = 0;\n\n const p = fromPeerIds.map(async(fromPeerId) => {\n const mids = fromPeerIdsMids[fromPeerId];\n const promises = mids.map(async(mid) => {\n const message = (await this.managers.appMessagesManager.getMessageByPeer(fromPeerId, mid)) as Message.message;\n if(message.fwd_from?.from_name && !message.fromId && !message.fwdFromId) {\n smth.add('N' + message.fwd_from.from_name);\n } else {\n smth.add('P' + message.fromId);\n }\n\n if(message.media && message.message) {\n ++messagesWithCaptionsLength;\n }\n });\n\n await Promise.all(promises);\n\n length += mids.length;\n });\n\n await Promise.all(p);\n\n const onlyFirstName = smth.size > 2;\n const peerTitles = [...smth].map((smth) => {\n const type = smth[0];\n smth = smth.slice(1);\n if(type === 'P') {\n const peerId = smth.toPeerId();\n return peerId === rootScope.myId ? i18n('Chat.Accessory.Forward.You') : new PeerTitle({peerId, dialog: false, onlyFirstName}).element;\n } else {\n return onlyFirstName ? smth.split(' ')[0] : smth;\n }\n });\n\n const {forwardElements} = this;\n const form = findUpTag(forwardElements.showCaption.checkboxField.label, 'FORM');\n form.classList.toggle('hide', !messagesWithCaptionsLength);\n const hideCaption = forwardElements.hideCaption.checkboxField.checked;\n if(messagesWithCaptionsLength && hideCaption) {\n forwardElements.hideSender.checkboxField.setValueSilently(true);\n } else if(this.forwardWasDroppingAuthor !== undefined) {\n (this.forwardWasDroppingAuthor ? forwardElements.hideSender : forwardElements.showSender).checkboxField.setValueSilently(true);\n }\n\n const titleKey: LangPackKey = forwardElements.showSender.checkboxField.checked ? 'Chat.Accessory.Forward' : 'Chat.Accessory.Hidden';\n const title = i18n(titleKey, [length]);\n\n const senderTitles = document.createDocumentFragment();\n if(peerTitles.length < 3) {\n senderTitles.append(...join(peerTitles, false));\n } else {\n senderTitles.append(peerTitles[0], i18n('AndOther', [peerTitles.length - 1]));\n }\n\n let firstMessage: Message.message, usingFullAlbum: boolean;\n if(fromPeerIds.length === 1) {\n const fromPeerId = fromPeerIds[0];\n const mids = fromPeerIdsMids[fromPeerId];\n firstMessage = (await this.managers.appMessagesManager.getMessageByPeer(fromPeerId, mids[0])) as Message.message;\n\n usingFullAlbum = !!firstMessage.grouped_id;\n if(usingFullAlbum) {\n const albumMids = await this.managers.appMessagesManager.getMidsByMessage(firstMessage);\n if(albumMids.length !== length || albumMids.find((mid) => !mids.includes(mid))) {\n usingFullAlbum = false;\n }\n }\n }\n\n const subtitleFragment = document.createDocumentFragment();\n const delimiter = ': ';\n if(usingFullAlbum || length === 1) {\n const mids = fromPeerIdsMids[fromPeerIds[0]];\n const replyFragment = await wrapMessageForReply({message: firstMessage, usingMids: mids});\n subtitleFragment.append(\n senderTitles,\n delimiter,\n replyFragment\n );\n } else {\n subtitleFragment.append(\n i18n('Chat.Accessory.Forward.From'),\n delimiter,\n senderTitles\n );\n }\n\n const newReply = this.setTopInfo('forward', f, title, subtitleFragment);\n\n forwardElements.modifyArgs.forEach((b, idx) => {\n const text = b.textElement;\n const intl: I18n.IntlElement = I18n.weakMap.get(text) as any;\n intl.args = [idx < 2 ? fromPeerIds.length : messagesWithCaptionsLength];\n intl.update();\n });\n\n if(this.forwardHover) {\n this.forwardHover.attachButtonListener(newReply, this.listenerSetter);\n }\n\n this.forwarding = fromPeerIdsMids;\n };\n\n f();\n }\n\n public async initMessageReply(mid: number) {\n if(this.replyToMsgId === mid) {\n return;\n }\n\n let message = await this.chat.getMessage(mid);\n const f = () => {\n let peerTitleEl: HTMLElement;\n if(!message) { // load missing replying message\n peerTitleEl = i18n('Loading');\n\n this.managers.appMessagesManager.reloadMessages(this.chat.peerId, mid).then((_message) => {\n if(this.replyToMsgId !== mid) {\n return;\n }\n\n message = _message;\n if(!message) {\n this.clearHelper('reply');\n } else {\n f();\n }\n });\n } else {\n peerTitleEl = new PeerTitle({\n peerId: message.fromId,\n dialog: false\n }).element;\n }\n\n this.setTopInfo('reply', f, peerTitleEl, message && (message as Message.message).message, undefined, message);\n this.setReplyToMsgId(mid)\n };\n f();\n }\n\n public setReplyToMsgId(mid: number) {\n this.replyToMsgId = mid;\n this.center(true);\n }\n\n public clearHelper(type?: ChatInputHelperType) {\n if(this.helperType === 'edit' && type !== 'edit') {\n this.clearInput();\n }\n\n if(type) {\n this.lastUrl = '';\n delete this.noWebPage;\n this.willSendWebPage = null;\n }\n\n if(type !== 'reply') {\n this.setReplyToMsgId(undefined);\n this.forwarding = undefined;\n }\n\n this.editMsgId = this.editMessage = undefined;\n this.helperType = this.helperFunc = undefined;\n\n if(this.chat.container.classList.contains('is-helper-active')) {\n appNavigationController.removeByType('input-helper');\n this.chat.container.classList.remove('is-helper-active');\n this.t();\n }\n }\n\n private t() {\n const className = 'is-toggling-helper';\n SetTransition({\n element: this.chat.container,\n className,\n forwards: true,\n duration: 150,\n onTransitionEnd: () => {\n this.chat.container.classList.remove(className);\n }\n });\n }\n\n public setInputValue(value: Parameters[0], clear = true, focus = true) {\n if(!value) value = '';\n\n if(clear) this.clearInput(false, false, value as string);\n else this.messageInputField.setValueSilently(value);\n\n fastRaf(() => {\n focus && placeCaretAtEnd(this.messageInput);\n this.onMessageInput();\n this.messageInput.scrollTop = this.messageInput.scrollHeight;\n });\n }\n\n public setTopInfo(\n type: ChatInputHelperType,\n callerFunc: () => void,\n title: Parameters[0] = '',\n subtitle: Parameters[1] = '',\n input?: Parameters[0],\n message?: any\n ) {\n if(this.willSendWebPage && type === 'reply') {\n return;\n }\n\n if(type !== 'webpage') {\n this.clearHelper(type);\n this.helperType = type;\n this.helperFunc = callerFunc;\n }\n\n const replyParent = this.replyElements.container;\n const oldReply = replyParent.lastElementChild.previousElementSibling;\n const haveReply = oldReply.classList.contains('reply');\n\n this.replyElements.iconBtn.replaceWith(this.replyElements.iconBtn = ButtonIcon((type === 'webpage' ? 'link' : type) + ' active reply-icon', {noRipple: true}));\n const {container} = wrapReply(title, subtitle, this.chat.animationGroup, message);\n if(haveReply) {\n oldReply.replaceWith(container);\n } else {\n replyParent.insertBefore(container, replyParent.lastElementChild);\n }\n\n if(type === 'webpage') {\n container.style.cursor = 'default';\n }\n\n if(!this.chat.container.classList.contains('is-helper-active')) {\n this.chat.container.classList.add('is-helper-active');\n this.t();\n }\n\n /* const scroll = appImManager.scrollable;\n if(scroll.isScrolledDown && !scroll.scrollLocked && !appImManager.messagesQueuePromise && !appImManager.setPeerPromise) {\n scroll.scrollTo(scroll.scrollHeight, 'top', true, true, 200);\n } */\n\n if(!IS_MOBILE) {\n appNavigationController.pushItem({\n type: 'input-helper',\n onPop: () => {\n this.onHelperCancel();\n }\n });\n }\n\n if(input !== undefined) {\n this.setInputValue(input);\n }\n\n setTimeout(() => {\n this.updateSendBtn();\n }, 0);\n\n return container;\n }\n\n // public saveScroll() {\n // this.scrollTop = this.chat.bubbles.scrollable.container.scrollTop;\n // this.scrollOffsetTop = this.chatInput.offsetTop;\n // }\n\n // public restoreScroll() {\n // if(this.chatInput.style.display) return;\n // //console.log('input resize', offsetTop, this.chatInput.offsetTop);\n // let newOffsetTop = this.chatInput.offsetTop;\n // let container = this.chat.bubbles.scrollable.container;\n // let scrollTop = container.scrollTop;\n // let clientHeight = container.clientHeight;\n // let maxScrollTop = container.scrollHeight;\n\n // if(newOffsetTop < this.scrollOffsetTop) {\n // this.scrollDiff = this.scrollOffsetTop - newOffsetTop;\n // container.scrollTop += this.scrollDiff;\n // } else if(scrollTop !== this.scrollTop) {\n // let endDiff = maxScrollTop - (scrollTop + clientHeight);\n // if(endDiff < this.scrollDiff/* && false */) {\n // //container.scrollTop -= endDiff;\n // } else {\n // container.scrollTop -= this.scrollDiff;\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 {DraftMessage} from '../../layer';\nimport mergeEntities from '../../lib/richTextProcessor/mergeEntities';\nimport parseEntities from '../../lib/richTextProcessor/parseEntities';\nimport wrapDraftText from '../../lib/richTextProcessor/wrapDraftText';\n\nexport default function wrapDraft(draft: DraftMessage.draftMessage, wrappingForPeerId: PeerId, loadPromises?: Promise[]) {\n const myEntities = parseEntities(draft.message);\n const apiEntities = draft.entities || [];\n const totalEntities = mergeEntities(apiEntities.slice(), myEntities); // ! only in this order, otherwise bold and emoji formatting won't work\n\n return wrapDraftText(draft.message, {entities: totalEntities, wrappingForPeerId, loadPromises});\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';\nimport type ChatTopbar from './topbar';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport DivAndCaption from '../divAndCaption';\nimport ripple from '../ripple';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport {Message} from '../../layer';\nimport safeAssign from '../../helpers/object/safeAssign';\n\nconst classNames: string[] = ['is-pinned-message-shown', 'is-pinned-audio-shown'];\nconst CLASSNAME_BASE = 'pinned-container';\nconst HEIGHT = 52;\n\nexport default class PinnedContainer {\n public wrapperUtils: HTMLElement;\n public btnClose: HTMLElement;\n protected wrapper: HTMLElement;\n\n protected topbar: ChatTopbar;\n protected chat: Chat;\n protected listenerSetter: ListenerSetter;\n public className: string;\n public divAndCaption: DivAndCaption<(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message?: any) => void>;\n\n protected floating = false;\n\n public onClose?: () => void | Promise;\n\n constructor(options: {\n topbar: PinnedContainer['topbar'],\n chat: PinnedContainer['chat'],\n listenerSetter: PinnedContainer['listenerSetter'],\n className: PinnedContainer['className'],\n divAndCaption: PinnedContainer['divAndCaption'],\n onClose?: PinnedContainer['onClose'],\n floating?: PinnedContainer['floating']\n }) {\n safeAssign(this, options);\n\n const {divAndCaption, className} = this;\n divAndCaption.container.classList.add(CLASSNAME_BASE, 'hide');\n divAndCaption.title.classList.add(CLASSNAME_BASE + '-title');\n divAndCaption.subtitle.classList.add(CLASSNAME_BASE + '-subtitle');\n divAndCaption.content.classList.add(CLASSNAME_BASE + '-content');\n\n this.btnClose = document.createElement('button');\n this.btnClose.classList.add(CLASSNAME_BASE + '-close', `pinned-${className}-close`, 'btn-icon', 'tgico-close');\n\n this.wrapper = document.createElement('div');\n this.wrapper.classList.add(CLASSNAME_BASE + '-wrapper');\n ripple(this.wrapper);\n\n this.wrapperUtils = document.createElement('div');\n this.wrapperUtils.classList.add(CLASSNAME_BASE + '-wrapper-utils');\n this.wrapperUtils.append(this.btnClose);\n\n this.wrapper.append(...Array.from(divAndCaption.container.children), this.wrapperUtils);\n\n divAndCaption.container.append(this.wrapper/* , this.close */);\n\n this.attachOnCloseEvent(this.btnClose);\n }\n\n public attachOnCloseEvent(elem: HTMLElement) {\n attachClickEvent(elem, (e) => {\n cancelEvent(e);\n\n ((this.onClose ? this.onClose() : null) || Promise.resolve(true)).then((needClose) => {\n if(needClose) {\n this.toggle(true);\n }\n });\n }, {listenerSetter: this.listenerSetter});\n }\n\n public toggle(hide?: boolean) {\n const isHidden = this.divAndCaption.container.classList.contains('hide');\n if(hide === undefined) {\n hide = !isHidden;\n } else if(hide === isHidden) {\n return;\n }\n\n // const scrollable = this.chat.bubbles.scrollable;\n\n const isFloating = (this.floating || mediaSizes.isMobile) && !hide;\n // const scrollTop = isFloating || this.divAndCaption.container.classList.contains('is-floating') ? scrollable.scrollTop : undefined;\n\n this.divAndCaption.container.classList.toggle('is-floating', isFloating);\n this.divAndCaption.container.classList.toggle('hide', hide);\n\n this.topbar.container.classList.toggle('is-pinned-floating', isFloating);\n this.topbar.container.classList.toggle(`is-pinned-${this.className}-shown`, !hide);\n\n // const active = classNames.filter((className) => this.topbar.container.classList.contains(className));\n // const maxActive = hide ? 0 : 1;\n\n // * not sure when it became unneeded\n // if(scrollTop !== undefined && active.length <= maxActive/* && !scrollable.isScrolledDown */) {\n // scrollable.scrollTop = scrollTop + ((hide ? -1 : 1) * HEIGHT);\n // }\n\n this.topbar.setFloating();\n this.topbar.setUtilsWidth();\n }\n\n public isVisible() {\n return !this.divAndCaption.container.classList.contains('hide');\n }\n\n public isFloating() {\n return this.divAndCaption.container.classList.contains('is-floating');\n }\n\n public fill(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message: Message.message) {\n this.divAndCaption.container.dataset.peerId = '' + message.peerId;\n this.divAndCaption.container.dataset.mid = '' + message.mid;\n this.divAndCaption.fill(title, subtitle, message);\n this.topbar.setUtilsWidth();\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}\n","/*\n * 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, {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 ButtonIcon from '../buttonIcon';\nimport {DocumentAttribute} from '../../layer';\nimport MediaProgressLine from '../mediaProgressLine';\nimport VolumeSelector from '../volumeSelector';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nexport default class ChatAudio extends PinnedContainer {\n private toggleEl: HTMLElement;\n private progressLine: MediaProgressLine;\n private volumeSelector: VolumeSelector;\n private fasterEl: HTMLElement;\n private repeatEl: HTMLButtonElement;\n\n constructor(protected topbar: ChatTopbar, protected chat: Chat, protected managers: AppManagers) {\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('fast_rewind active', {noRipple: true});\n const nextEl = ButtonIcon('fast_forward active', {noRipple: true});\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\n this.repeatEl = ButtonIcon('audio_repeat', {noRipple: true});\n attachClick(this.repeatEl, () => {\n const params = appMediaPlaybackController.getPlaybackParams();\n if(!params.round) {\n appMediaPlaybackController.round = true;\n } else if(params.loop) {\n appMediaPlaybackController.round = false;\n appMediaPlaybackController.loop = false;\n } else {\n appMediaPlaybackController.loop = !appMediaPlaybackController.loop;\n }\n });\n\n const fasterEl = this.fasterEl = ButtonIcon('playback_2x', {noRipple: true});\n attachClick(fasterEl, () => {\n appMediaPlaybackController.playbackRate = fasterEl.classList.contains('active') ? 1 : 1.75;\n });\n\n this.wrapperUtils.prepend(this.volumeSelector.btn, fasterEl, this.repeatEl);\n\n const progressWrapper = document.createElement('div');\n progressWrapper.classList.add('pinned-audio-progress-wrapper');\n\n this.progressLine = new MediaProgressLine({\n media: undefined,\n streamable: undefined,\n withTransition: true,\n useTransform: true\n });\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(appMediaPlaybackController)('play', this.onMediaPlay);\n this.topbar.listenerSetter.add(appMediaPlaybackController)('pause', this.onPause);\n this.topbar.listenerSetter.add(appMediaPlaybackController)('stop', this.onStop);\n this.topbar.listenerSetter.add(appMediaPlaybackController)('playbackParams', this.onPlaybackParams);\n\n const playingDetails = appMediaPlaybackController.getPlayingDetails();\n if(playingDetails) {\n this.onMediaPlay(playingDetails);\n this.onPlaybackParams(playingDetails.playbackParams);\n }\n }\n\n public destroy() {\n if(this.progressLine) {\n this.progressLine.removeListeners();\n }\n }\n\n private onPlaybackParams = (playbackParams: ReturnType) => {\n this.fasterEl.classList.toggle('active', playbackParams.playbackRate > 1);\n\n this.repeatEl.classList.remove('tgico-audio_repeat', 'tgico-audio_repeat_single');\n this.repeatEl.classList.add(playbackParams.loop ? 'tgico-audio_repeat_single' : 'tgico-audio_repeat');\n this.repeatEl.classList.toggle('active', playbackParams.loop || playbackParams.round);\n };\n\n private onPause = () => {\n this.toggleEl.classList.remove('flip-icon');\n };\n\n private onStop = () => {\n this.toggle(true);\n };\n\n private onMediaPlay = ({doc, message, media, playbackParams}: ReturnType) => {\n let title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment;\n const isMusic = doc.type !== 'voice' && doc.type !== 'round';\n if(!isMusic) {\n title = new PeerTitle({peerId: message.fromId, fromName: message.fwd_from?.from_name}).element;\n\n // subtitle = 'Voice message';\n subtitle = formatFullSentTime(message.date);\n } else {\n const audioAttribute = doc.attributes.find((attr) => attr._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio;\n title = wrapEmojiText(audioAttribute?.title ?? doc.file_name);\n subtitle = audioAttribute?.performer ? wrapEmojiText(audioAttribute.performer) : i18n('AudioUnknownArtist');\n }\n\n this.fasterEl.classList.toggle('hide', isMusic);\n this.repeatEl.classList.toggle('hide', !isMusic);\n\n this.onPlaybackParams(playbackParams);\n this.volumeSelector.setVolume();\n\n this.progressLine.setMedia(media);\n\n this.fill(title, subtitle, message);\n // this.toggleEl.classList.add('flip-icon');\n this.toggleEl.classList.toggle('flip-icon', !media.paused);\n this.toggle(false);\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 ChatTopbar from './topbar';\nimport PopupPinMessage from '../popups/unpinMessage';\nimport PinnedContainer from './pinnedContainer';\nimport PinnedMessageBorder from './pinnedMessageBorder';\nimport ReplyContainer, {wrapReplyDivAndCaption} from './replyContainer';\nimport rootScope from '../../lib/rootScope';\nimport Chat from './chat';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport ButtonIcon from '../buttonIcon';\nimport {getHeavyAnimationPromise} from '../../hooks/useHeavyAnimationCheck';\nimport {i18n} from '../../lib/langPack';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport handleScrollSideEvent from '../../helpers/dom/handleScrollSideEvent';\nimport debounce from '../../helpers/schedulers/debounce';\nimport throttle from '../../helpers/schedulers/throttle';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {Message} from '../../layer';\nimport {logger} from '../../lib/logger';\n\nclass AnimatedSuper {\n static DURATION = 200;\n static BASE_CLASS = 'animated-super';\n container: HTMLDivElement;\n rows: {[index: string]: {element: HTMLElement, timeout?: number, new?: true}} = {};\n clearTimeout: number;\n\n constructor() {\n this.container = document.createElement('div');\n this.container.className = AnimatedSuper.BASE_CLASS;\n }\n\n public getRow(index: number, animateFirst = false) {\n if(this.rows[index]) return this.rows[index].element;\n const row = document.createElement('div');\n const isFirst = !Object.keys(this.rows).length && !animateFirst;\n row.className = AnimatedSuper.BASE_CLASS + '-row' + (isFirst ? '' : ' is-hiding hide');\n this.rows[index] = {element: row, new: true};\n this.container.append(row);\n return row;\n }\n\n public clearRow(index: number) {\n if(!this.rows[index]) return;\n this.rows[index].element.remove();\n delete this.rows[index];\n }\n\n public clearRows(currentIndex?: number) {\n if(this.clearTimeout) clearTimeout(this.clearTimeout);\n this.clearTimeout = window.setTimeout(() => {\n for(const i in this.rows) {\n if(+i === currentIndex) continue;\n this.clearRow(+i);\n }\n }, AnimatedSuper.DURATION);\n }\n\n public setNewRow(index: number, reflow = false) {\n const row = this.rows[index];\n if(row.new) {\n if(reflow) {\n row.element.classList.remove('hide');\n void row.element.offsetLeft; // reflow\n } else {\n row.element.classList.remove('is-hiding', 'hide');\n }\n\n delete row.new;\n }\n\n this.clearRows(index);\n }\n\n public animate(index: number, previousIndex: number, fromTop = index > previousIndex, ignorePrevious = false) {\n if(index === previousIndex) { // * handle if set index 0 and previousIndex 0\n return this.setNewRow(index);\n }\n\n const row = this.rows[index];\n const previousRow = this.rows[previousIndex];\n if(!previousRow && !ignorePrevious) {\n return this.setNewRow(index);\n }\n\n const sides = ['from-top', 'from-bottom'];\n if(!fromTop) sides.reverse();\n\n row.element.classList.add(sides[0]);\n row.element.classList.remove(sides[1]);\n if(previousRow) {\n previousRow.element.classList.add(sides[1]);\n previousRow.element.classList.remove(sides[0]);\n }\n\n if(row.new) {\n this.setNewRow(index, true);\n }\n\n row.element.classList.toggle('is-hiding', false);\n previousRow && previousRow.element.classList.toggle('is-hiding', true);\n\n /* const height = row.element.getBoundingClientRect().height;\n row.element.style.transform = `translateY(${fromTop ? height * -1 : height}px)`;\n if(previousRow) {\n previousRow.element.style.transform = `translateY(${fromTop ? height : height * -1}px)`;\n } */\n\n /* row.element.style.setProperty('--height', row.element.getBoundingClientRect().height + 'px');\n if(previousRow) {\n previousRow.element.style.setProperty('--height', previousRow.element.getBoundingClientRect().height + 'px');\n } */\n\n this.clearRows(index);\n }\n}\n\nclass AnimatedCounter {\n static EMPTY_INDEX = -1;\n static BASE_CLASS = 'animated-counter';\n container: HTMLElement;\n decimals: {\n container: HTMLElement,\n placeholder: HTMLElement,\n animatedSuper: AnimatedSuper\n }[] = [];\n previousNumber = 0;\n clearTimeout: number;\n\n constructor(private reverse = false) {\n this.container = document.createElement('div');\n this.container.className = AnimatedCounter.BASE_CLASS;\n }\n\n getDecimal(index: number) {\n if(this.decimals[index]) return this.decimals[index];\n const item = document.createElement('div');\n item.className = AnimatedCounter.BASE_CLASS + '-decimal';\n\n const placeholder = document.createElement('div');\n placeholder.className = AnimatedCounter.BASE_CLASS + '-decimal-placeholder';\n\n const animatedSuper = new AnimatedSuper();\n animatedSuper.container.className = AnimatedCounter.BASE_CLASS + '-decimal-wrapper';\n\n item.append(placeholder, animatedSuper.container);\n\n this.container.append(item);\n\n return this.decimals[index] = {container: item, placeholder, animatedSuper};\n }\n\n clear(number: number) {\n if(this.clearTimeout) clearTimeout(this.clearTimeout);\n\n const decimals = ('' + number).length;\n if(decimals >= this.decimals.length) {\n return;\n }\n\n this.clearTimeout = window.setTimeout(() => {\n const byDecimal = this.decimals.splice(decimals, this.decimals.length - decimals);\n byDecimal.forEach((decimal) => {\n decimal.container.remove();\n });\n }, AnimatedSuper.DURATION);\n }\n\n /* prepareNumber(number: number) {\n const decimals = ('' + number).length;\n if(this.decimals.length < decimals) {\n for(let i = this.decimals.length; i < decimals; ++i) {\n this.getDecimal(i);\n }\n }\n } */\n\n hideLeft(number: number) {\n const decimals = ('' + number).length;\n const byDecimal = this.decimals.slice(decimals);// this.decimals.splice(deleteCount, this.decimals.length - deleteCount);\n byDecimal.forEach((decimal) => {\n const previousDecimalNumber = +decimal.placeholder.innerText || 0;\n const row = decimal.animatedSuper.getRow(AnimatedCounter.EMPTY_INDEX, true);\n decimal.animatedSuper.animate(AnimatedCounter.EMPTY_INDEX, previousDecimalNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\n });\n\n this.clear(number);\n }\n\n setCount(number: number) {\n // this.prepareNumber(number);\n\n const previousByDecimal = Array.from('' + this.previousNumber).map((n) => +n);\n const byDecimal = Array.from('' + number).map((n) => +n);\n byDecimal.forEach((decimalNumber, idx) => {\n const decimal = this.getDecimal(idx);\n // const row = decimal.animatedSuper.getRow(number, true);\n const row = decimal.animatedSuper.getRow(decimalNumber, true);\n const previousDecimalNumber = previousByDecimal[idx] ?? AnimatedCounter.EMPTY_INDEX;\n row.innerText = decimal.placeholder.innerText = '' + decimalNumber;\n // decimal.animatedSuper.animate(number, this.previousNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\n decimal.animatedSuper.animate(decimalNumber, previousDecimalNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\n });\n\n this.hideLeft(number);\n // this.clear(number);\n this.previousNumber = number;\n }\n}\n\nexport default class ChatPinnedMessage {\n private static LOAD_COUNT = 50;\n private static LOAD_OFFSET = 5;\n\n public pinnedMessageContainer: PinnedContainer;\n private pinnedMessageBorder: PinnedMessageBorder;\n\n private pinnedMaxMid = 0;\n public pinnedMid = 0;\n public pinnedIndex = -1;\n private wasPinnedIndex = 0;\n private wasPinnedMediaIndex = 0;\n\n public locked = false;\n private waitForScrollBottom = false;\n\n public count = 0;\n private mids: number[] = [];\n private offsetIndex = 0;\n\n private loading = false;\n private loadedBottom = false;\n private loadedTop = false;\n\n private animatedSubtitle: AnimatedSuper;\n private animatedMedia: AnimatedSuper;\n private animatedCounter: AnimatedCounter;\n\n private listenerSetter: ListenerSetter;\n private scrollDownListenerSetter: ListenerSetter = null;\n\n public hidden = false;\n\n private getCurrentIndexPromise: Promise = null;\n private btnOpen: HTMLButtonElement;\n\n private setPinnedMessage: () => void;\n\n private isStatic: boolean;\n\n private debug: boolean;\n\n public setCorrectIndexThrottled: (lastScrollDirection?: number) => void;\n\n private log: ReturnType;\n\n constructor(private topbar: ChatTopbar, private chat: Chat, private managers: AppManagers) {\n this.listenerSetter = new ListenerSetter();\n this.log = logger('PM');\n this.debug = true;\n this.isStatic = false;\n\n const dAC = new ReplyContainer('pinned-message', chat.animationGroup);\n this.pinnedMessageContainer = new PinnedContainer({\n topbar,\n chat,\n listenerSetter: this.listenerSetter,\n className: 'message',\n divAndCaption: dAC,\n onClose: async() => {\n if(await managers.appPeersManager.canPinMessage(this.chat.peerId)) {\n new PopupPinMessage(this.chat.peerId, this.pinnedMid, true);\n } else {\n new PopupPinMessage(this.chat.peerId, 0, true);\n }\n\n return false;\n }\n });\n\n this.pinnedMessageBorder = new PinnedMessageBorder();\n dAC.border.replaceWith(this.pinnedMessageBorder.render(1, 0));\n\n this.animatedSubtitle = new AnimatedSuper();\n dAC.subtitle.append(this.animatedSubtitle.container);\n\n this.animatedMedia = new AnimatedSuper();\n this.animatedMedia.container.classList.add('pinned-message-media-container');\n dAC.content.prepend(this.animatedMedia.container);\n\n this.animatedCounter = new AnimatedCounter(true);\n dAC.title.append(i18n('PinnedMessage'), ' ', this.animatedCounter.container);\n\n const btnClose = this.pinnedMessageContainer.btnClose.cloneNode(true) as HTMLElement;\n this.pinnedMessageContainer.attachOnCloseEvent(btnClose);\n dAC.container.prepend(btnClose);\n\n this.btnOpen = ButtonIcon('pinlist pinned-container-close pinned-message-pinlist', {noRipple: true});\n\n this.pinnedMessageContainer.wrapperUtils.prepend(this.btnOpen);\n\n attachClickEvent(this.btnOpen, (e) => {\n cancelEvent(e);\n this.topbar.openPinned(true);\n }, {listenerSetter: this.listenerSetter});\n\n this.listenerSetter.add(rootScope)('peer_pinned_messages', ({peerId}) => {\n if(peerId === this.chat.peerId) {\n // this.wasPinnedIndex = 0;\n // setTimeout(() => {\n if(this.hidden) {\n this.pinnedMessageContainer.toggle(this.hidden = false);\n }\n\n this.loadedTop = this.loadedBottom = false;\n this.pinnedIndex = -1;\n this.pinnedMid = 0;\n this.count = 0;\n this.mids = [];\n this.offsetIndex = 0;\n this.pinnedMaxMid = 0;\n this.setCorrectIndex(0);\n // }, 300);\n }\n });\n\n this.listenerSetter.add(rootScope)('peer_pinned_hidden', ({peerId}) => {\n if(peerId === this.chat.peerId) {\n this.pinnedMessageContainer.toggle(this.hidden = true);\n }\n });\n\n // * 200 - no lags\n // * 100 - need test\n this.setPinnedMessage = debounce(() => this._setPinnedMessage(), 100, true, true);\n this.setCorrectIndexThrottled = throttle(this.setCorrectIndex.bind(this), 100, false);\n\n this.isStatic = !this.chat.isPinnedMessagesNeeded();\n }\n\n public destroy() {\n this.pinnedMessageContainer.divAndCaption.container.remove();\n this.pinnedMessageContainer.toggle(true);\n this.listenerSetter.removeAll();\n this.unsetScrollDownListener(false);\n }\n\n public setCorrectIndex(lastScrollDirection?: number) {\n if(this.isStatic) return;\n // return;\n\n if(this.locked || this.hidden/* || this.chat.setPeerPromise || this.chat.bubbles.messagesQueuePromise */) {\n return;\n }\n\n if((this.loadedBottom || this.loadedTop) && !this.count) {\n return;\n }\n\n // const perf = performance.now();\n const el = this.chat.bubbles.getBubbleByPoint('bottom');\n // this.log('setCorrectIndex: get last element perf:', performance.now() - perf, el);\n if(!el) return;\n\n // return;\n\n const mid = el.dataset.mid;\n if(el && mid !== undefined) {\n // this.log('setCorrectIndex will test mid:', mid);\n this.testMid(+mid, lastScrollDirection);\n }\n }\n\n public testMid(mid: number, lastScrollDirection?: number) {\n if(this.isStatic) return;\n\n // if(lastScrollDirection !== undefined) return;\n if(this.hidden) return;\n\n // this.log('testMid', mid);\n\n let currentIndex: number = this.mids.findIndex((_mid) => _mid <= mid);\n if(currentIndex !== -1 && !this.isNeededMore(currentIndex)) {\n currentIndex += this.offsetIndex;\n } else if(this.loadedTop && mid < this.mids[this.mids.length - 1]) {\n // currentIndex = 0;\n currentIndex = this.mids.length - 1 + this.offsetIndex;\n } else {\n if(!this.getCurrentIndexPromise) {\n this.getCurrentIndexPromise = this.getCurrentIndex(mid, lastScrollDirection !== undefined);\n }\n\n return;\n }\n\n // const idx = Math.max(0, this.mids.indexOf(mid));\n\n /* if(currentIndex === this.count) {\n currentIndex = 0;\n } */\n\n // this.log('testMid: pinned currentIndex', currentIndex, mid);\n\n const changed = this.pinnedIndex !== currentIndex;\n if(changed) {\n if(this.waitForScrollBottom && lastScrollDirection !== undefined) {\n if(this.pinnedIndex === 0 || this.pinnedIndex > currentIndex) { // ะตัะปะธ ะฝะต ัะบั€ะพะปะปะธะป ะฒะฝะธะท ะธ ะฟั‹ั‚ะฐะตั‚ัั ะฟะพัั‚ะฐะฒะธั‚ัŒ ะฝะธะถะฝะธะน ะฟะธะฝะฝะตะด - ะฒั‹ะนั‚ะธ\n return;\n }\n }\n\n this.pinnedIndex = currentIndex;\n this.pinnedMid = this.mids.find((_mid) => _mid <= mid) || this.mids[this.mids.length - 1];\n this.setPinnedMessage();\n }\n }\n\n private isNeededMore(currentIndex: number) {\n return (this.count > ChatPinnedMessage.LOAD_COUNT &&\n (\n (!this.loadedBottom && currentIndex <= ChatPinnedMessage.LOAD_OFFSET) ||\n (!this.loadedTop && (this.count - 1 - currentIndex) <= ChatPinnedMessage.LOAD_OFFSET)\n )\n );\n }\n\n private async getCurrentIndex(mid: number, correctAfter = true) {\n if(this.loading) return;\n this.loading = true;\n\n try {\n const log = this.debug ? this.log.bindPrefix('getCurrentIndex') : undefined;\n log && log('start', mid, correctAfter);\n\n let gotRest = false;\n const promises = [\n this.managers.appMessagesManager.getSearch({\n peerId: this.chat.peerId,\n inputFilter: {_: 'inputMessagesFilterPinned'},\n maxId: mid,\n limit: ChatPinnedMessage.LOAD_COUNT,\n backLimit: ChatPinnedMessage.LOAD_COUNT,\n threadId: this.chat.threadId\n })\n .then((r) => {\n gotRest = true;\n return r;\n })\n ];\n\n if(!this.pinnedMaxMid) {\n const promise = this.managers.appMessagesManager.getPinnedMessage(this.chat.peerId, this.chat.threadId).then((p) => {\n if(!p.maxId) return;\n this.pinnedMaxMid = p.maxId;\n\n if(!gotRest && correctAfter) {\n this.mids = [this.pinnedMaxMid];\n this.count = p.count;\n this.pinnedIndex = 0;\n this.pinnedMid = this.mids[0];\n this.setPinnedMessage();\n // this.pinnedMessageContainer.toggle(false);\n }\n });\n\n promises.push(promise as any);\n }\n\n const result = (await Promise.all(promises))[0];\n\n let backLimited = result.history.findIndex((message) => message.mid <= mid);\n if(backLimited === -1) {\n backLimited = result.history.length;\n }/* else {\n backLimited -= 1;\n } */\n\n this.offsetIndex = result.offset_id_offset ? result.offset_id_offset - backLimited : 0;\n this.mids = result.history.map((message) => message.mid).slice();\n this.count = result.count;\n\n if(!this.count) {\n this.pinnedMessageContainer.toggle(true);\n }\n\n this.loadedTop = (this.offsetIndex + this.mids.length) === this.count;\n this.loadedBottom = !this.offsetIndex;\n\n log && log('result', mid, result, backLimited, this.offsetIndex, this.loadedTop, this.loadedBottom);\n } catch(err) {\n this.log.error('getCurrentIndex error', err);\n }\n\n this.loading = false;\n\n if(this.locked) {\n this.testMid(mid);\n } else if(correctAfter) {\n this.setCorrectIndex(0);\n }\n\n this.getCurrentIndexPromise = null;\n // return result.offset_id_offset || 0;\n }\n\n public setScrollDownListener() {\n this.waitForScrollBottom = true;\n\n if(!this.scrollDownListenerSetter) {\n this.scrollDownListenerSetter = new ListenerSetter();\n handleScrollSideEvent(this.chat.bubbles.scrollable.container, 'bottom', () => {\n this.unsetScrollDownListener();\n }, this.scrollDownListenerSetter);\n }\n }\n\n public unsetScrollDownListener(refreshPosition = true) {\n this.waitForScrollBottom = false;\n\n if(this.scrollDownListenerSetter) {\n this.scrollDownListenerSetter.removeAll();\n this.scrollDownListenerSetter = null;\n }\n\n if(refreshPosition) {\n this.setCorrectIndex(0);\n }\n }\n\n public async handleFollowingPinnedMessage() {\n this.locked = true;\n\n this.debug && this.log('handleFollowingPinnedMessage');\n try {\n this.setScrollDownListener();\n\n const setPeerPromise = this.chat.setPeerPromise;\n if(setPeerPromise instanceof Promise) {\n await setPeerPromise;\n }\n\n // await this.chat.bubbles.scrollable.scrollLockedPromise;\n await getHeavyAnimationPromise();\n\n if(this.getCurrentIndexPromise) {\n await this.getCurrentIndexPromise;\n }\n\n this.debug && this.log('handleFollowingPinnedMessage: unlock');\n this.locked = false;\n\n /* // ะฟะพะดะพะถะดั‘ะผ, ะฟะพะบะฐ ัะบั€ะพะปะป ะพัั‚ะฐะฝะพะฒะธั‚ัั\n setTimeout(() => {\n this.log('handleFollowingPinnedMessage: unlock');\n this.locked = false;\n }, 50); */\n } catch(err) {\n this.log.error('handleFollowingPinnedMessage error:', err);\n\n this.locked = false;\n this.waitForScrollBottom = false;\n this.setCorrectIndex(0);\n }\n }\n\n public async followPinnedMessage(mid: number) {\n const message = await this.chat.getMessage(mid);\n if(!message) {\n return;\n }\n\n this.chat.setMessageId(mid);\n (this.chat.setPeerPromise || Promise.resolve()).then(() => { // * debounce fast clicker\n this.handleFollowingPinnedMessage();\n this.testMid(this.pinnedIndex >= (this.count - 1) ? this.pinnedMaxMid : mid - 1);\n });\n }\n\n public async _setPinnedMessage() {\n // ///this.log('setting pinned message', message);\n // return;\n /* const promise: Promise = this.chat.setPeerPromise || this.chat.bubbles.messagesQueuePromise || Promise.resolve();\n Promise.all([\n promise\n ]).then(() => { */\n // const mids = results[0];\n const count = this.count;\n if(count) {\n const pinnedIndex = this.pinnedIndex;\n const message = await this.chat.getMessage(this.pinnedMid);\n\n // this.animatedCounter.prepareNumber(count);\n\n // setTimeout(() => {\n const isLast = pinnedIndex === 0;\n this.animatedCounter.container.classList.toggle('is-last', isLast);\n // SetTransition(this.animatedCounter.container, 'is-last', isLast, AnimatedSuper.DURATION);\n if(!isLast) {\n this.animatedCounter.setCount(count - pinnedIndex);\n }\n // }, 100);\n\n // this.pinnedMessageContainer.fill(undefined, message.message, message);\n this.pinnedMessageContainer.toggle(false);\n\n const fromTop = pinnedIndex > this.wasPinnedIndex;\n\n this.debug && this.log('setPinnedMessage: fromTop', fromTop, pinnedIndex, this.wasPinnedIndex);\n\n const writeTo = this.animatedSubtitle.getRow(pinnedIndex);\n const writeMediaTo = this.animatedMedia.getRow(pinnedIndex);\n writeMediaTo.classList.add('pinned-message-media');\n // writeMediaTo.innerHTML = writeMediaTo.style.cssText = writeMediaTo.dataset.docId = '';\n const loadPromises: Promise[] = [];\n const isMediaSet = await wrapReplyDivAndCaption({\n title: undefined,\n titleEl: null,\n subtitle: (message as Message.message).message,\n subtitleEl: writeTo,\n message,\n mediaEl: writeMediaTo,\n loadPromises,\n animationGroup: this.chat.animationGroup\n });\n\n await Promise.all(loadPromises);\n\n this.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-media', isMediaSet);\n\n // if(this.wasPinnedIndex !== this.pinnedIndex) {\n this.animatedSubtitle.animate(pinnedIndex, this.wasPinnedIndex);\n if(isMediaSet) {\n this.animatedMedia.animate(pinnedIndex, this.wasPinnedMediaIndex); // * wasPinnedMediaIndex ะธะท-ะทะฐ ั‚ะพะณะพ, ั‡ั‚ะพ ะฑะปะพะบ ะผะตะฝัะตั‚ัั ั ะดั€ัƒะณะธะผ ะฐะปะณะพั€ะธั‚ะผะพะผ\n this.wasPinnedMediaIndex = pinnedIndex;\n } else {\n this.animatedMedia.clearRows();\n }\n // }\n\n this.pinnedMessageBorder.render(count, count - pinnedIndex - 1);\n this.wasPinnedIndex = pinnedIndex;\n this.pinnedMessageContainer.divAndCaption.container.dataset.mid = '' + message.mid;\n } else {\n this.pinnedMessageContainer.toggle(true);\n this.wasPinnedIndex = 0;\n }\n\n this.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-many', this.count > 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 type ListenerSetter from '../listenerSetter';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\n\nexport default function handleScrollSideEvent(elem: HTMLElement, side: 'top' | 'bottom', callback: () => void, listenerSetter: ListenerSetter) {\n if(IS_TOUCH_SUPPORTED) {\n let lastY: number;\n const options = {passive: true};\n listenerSetter.add(elem)('touchstart', (e) => {\n if(e.touches.length > 1) {\n onTouchEnd();\n return;\n }\n\n lastY = e.touches[0].clientY;\n\n listenerSetter.add(elem)('touchmove', onTouchMove, options);\n listenerSetter.add(elem)('touchend', onTouchEnd, options);\n }, options);\n\n const onTouchMove = (e: TouchEvent) => {\n const clientY = e.touches[0].clientY;\n\n const isDown = clientY < lastY;\n if(side === 'bottom' && isDown) callback();\n else if(side === 'top' && !isDown) callback();\n lastY = clientY;\n // alert('isDown: ' + !!isDown);\n };\n\n const onTouchEnd = () => {\n listenerSetter.removeManual(elem, 'touchmove', onTouchMove, options);\n listenerSetter.removeManual(elem, 'touchend', onTouchEnd, options);\n };\n } else {\n listenerSetter.add(elem)('wheel', (e) => {\n const isDown = e.deltaY > 0;\n // this.log('wheel', e, isDown);\n if(side === 'bottom' && isDown) callback();\n else if(side === 'top' && !isDown) callback();\n }, {passive: 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 type {Channel} from '../../lib/appManagers/appChatsManager';\nimport type {AppSidebarRight} from '../sidebarRight';\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 ListenerSetter from '../../helpers/listenerSetter';\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 AppEditContactTab from '../sidebarRight/tabs/editContact';\nimport appMediaPlaybackController from '../appMediaPlaybackController';\nimport IS_GROUP_CALL_SUPPORTED from '../../environment/groupCallSupport';\nimport IS_CALL_SUPPORTED from '../../environment/callSupport';\nimport {CallType} from '../../lib/calls/types';\nimport PopupMute from '../popups/mute';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport hasRights from '../../lib/appManagers/utils/chats/hasRights';\nimport wrapPeerTitle from '../wrappers/peerTitle';\nimport groupCallsController from '../../lib/calls/groupCallsController';\nimport apiManagerProxy from '../../lib/mtproto/mtprotoworker';\nimport {makeMediaSize} from '../../helpers/mediaSize';\nimport {FOLDER_ID_ALL} from '../../lib/mtproto/mtproto_config';\nimport formatNumber from '../../helpers/number/formatNumber';\n\ntype ButtonToVerify = {element?: HTMLElement, verify: () => boolean | Promise};\n\nexport default class ChatTopbar {\n public container: HTMLDivElement;\n private btnBack: HTMLButtonElement;\n private btnBackBadge: HTMLElement;\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: HTMLElement;\n\n private chatAudio: ChatAudio;\n public pinnedMessage: ChatPinnedMessage;\n\n private setUtilsRAF: number;\n private setPeerStatusInterval: number;\n\n public listenerSetter: ListenerSetter;\n\n private menuButtons: Parameters[0]['buttons'];\n private buttonsToVerify: ButtonToVerify[];\n private chatInfoContainer: HTMLDivElement;\n private person: HTMLDivElement;\n\n constructor(\n private chat: Chat,\n private appSidebarRight: AppSidebarRight,\n private managers: AppManagers\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', 'hide');\n this.container.dataset.floating = '0';\n\n this.btnBack = ButtonIcon('left sidebar-close-button', {noRipple: true});\n this.btnBackBadge = document.createElement('span');\n this.btnBackBadge.classList.add('badge', 'badge-20', 'badge-primary', 'back-unread-badge');\n this.btnBack.append(this.btnBackBadge);\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 = this.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.managers);\n\n if(this.menuButtons.length) {\n this.btnMore = ButtonMenuToggle({\n listenerSetter: this.listenerSetter,\n direction: 'bottom-left',\n buttons: this.menuButtons,\n onOpen: async(e, element) => {\n const deleteButton = this.menuButtons[this.menuButtons.length - 1];\n if(deleteButton?.element) {\n const deleteButtonText = await this.managers.appPeersManager.getDeleteButtonText(this.peerId);\n deleteButton.element.lastChild.replaceWith(i18n(deleteButtonText));\n }\n }\n });\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') || findUpClassName(e.target, 'pinned-container-wrapper-utils')) {\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: ButtonToVerify['verify']) {\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 r = async() => {\n const buttons = this.buttonsToVerify.concat(isMenuOpen ? this.menuButtons as any : []);\n const results = await Promise.all(buttons.map(async(button) => {\n return {\n result: await button.verify(),\n button\n }\n }));\n\n results.forEach(({button, result}) => {\n button.element.classList.toggle('hide', !result);\n });\n };\n\n r();\n };\n\n private verifyVideoChatButton = async(type?: 'group' | 'broadcast') => {\n if(!IS_GROUP_CALL_SUPPORTED || this.peerId.isUser() || this.chat.type !== 'chat' || this.chat.threadId) return false;\n\n const currentGroupCall = groupCallsController.groupCall;\n const chatId = this.peerId.toChatId();\n if(currentGroupCall?.chatId === chatId) {\n return false;\n }\n\n if(type) {\n if(((await this.managers.appPeersManager.isBroadcast(this.peerId)) && type === 'group') ||\n ((await this.managers.appPeersManager.isAnyGroup(this.peerId)) && type === 'broadcast')) {\n return false;\n }\n }\n\n const chat = await this.managers.appChatsManager.getChat(chatId);\n return (chat as MTChat.chat).pFlags?.call_active || hasRights(chat, 'manage_call');\n };\n\n private verifyCallButton = async(type?: CallType) => {\n if(!IS_CALL_SUPPORTED || !this.peerId.isUser()) return false;\n const userId = this.peerId.toUserId();\n const userFull = await this.managers.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: this.onMuteClick,\n verify: async() => this.chat.type === 'chat' && rootScope.myId !== this.peerId && !(await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.peerId, respectType: false, threadId: this.chat.threadId}))\n }, {\n icon: 'unmute',\n text: 'ChatList.Context.Unmute',\n onClick: () => {\n this.managers.appMessagesManager.togglePeerMute({peerId: this.peerId, threadId: this.chat.threadId});\n },\n verify: async() => this.chat.type === 'chat' && rootScope.myId !== this.peerId && (await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.peerId, respectType: false, threadId: this.chat.threadId}))\n }, {\n icon: 'comments',\n text: 'ViewDiscussion',\n onClick: () => {\n const middleware = this.chat.bubbles.getMiddleware();\n Promise.resolve(this.managers.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: async() => {\n const chatFull = await this.managers.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 apiManagerProxy.getState().then((state) => {\n if(state.chatContextMenuHintWasShown) {\n return;\n }\n\n const original = selection.toggleByElement.bind(selection);\n selection.toggleByElement = async(bubble) => {\n this.managers.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 && !!this.chat.bubbles.getRenderedLength()\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 = this.appSidebarRight.createTab(AppEditContactTab);\n tab.peerId = this.peerId;\n tab.open();\n\n this.appSidebarRight.toggleSidebar(true);\n }\n },\n verify: async() => this.peerId.isUser() && !(await this.managers.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.managers.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: async() => rootScope.myId !== this.peerId && this.peerId.isUser() && (await this.managers.appPeersManager.isContact(this.peerId)) && !!(await this.managers.appUsersManager.getUser(this.peerId.toUserId())).phone\n }, {\n icon: 'bots',\n text: 'Settings',\n onClick: () => {\n this.managers.appMessagesManager.sendText(this.peerId, '/settings');\n },\n verify: async() => {\n try {\n const attachMenuBot = await this.managers.appAttachMenuBotsManager.getAttachMenuBot(this.peerId.toUserId());\n return !!attachMenuBot?.pFlags?.has_settings;\n } catch(err) {\n return false;\n }\n }\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.managers.appUsersManager.toggleBlock(this.peerId, true).then((value) => {\n if(value) {\n toastNew({langPackKey: 'UserBlocked'});\n }\n });\n }\n }]\n }).show();\n },\n verify: async() => {\n if(!this.peerId.isUser()) return false;\n const userFull = await this.managers.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.managers.appUsersManager.toggleBlock(this.peerId, false).then((value) => {\n if(value) {\n toastNew({langPackKey: 'UserUnblocked'});\n }\n });\n },\n verify: async() => {\n const userFull = await this.managers.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: async() => this.chat.type === 'chat' && !!(await this.managers.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 private constructAvatar() {\n const avatarElement = new AvatarElement();\n avatarElement.isDialog = true;\n avatarElement.classList.add('avatar-42', 'person-avatar');\n return avatarElement;\n }\n\n private get peerId() {\n return this.chat.peerId;\n }\n\n public constructPeerHelpers() {\n this.avatarElement = this.constructAvatar();\n\n this.subtitle = document.createElement('div');\n this.subtitle.classList.add('info');\n\n this.pinnedMessage = new ChatPinnedMessage(this, this.chat, this.managers);\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, this.onMuteClick);\n\n this.attachClickEvent(this.btnJoin, async() => {\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(await this.managers.appChatsManager.isChannel(chatId)) {\n promise = this.managers.appChatsManager.joinChannel(chatId);\n } else {\n promise = this.managers.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)('folder_unread', (folder) => {\n if(folder.id !== FOLDER_ID_ALL) {\n return;\n }\n\n const size = folder.unreadUnmutedPeerIds.size;\n this.btnBackBadge.textContent = size ? '' + formatNumber(size, 1) : '';\n // this.btnBack.classList.remove('tgico-left', 'tgico-previous');\n // this.btnBack.classList.add(size ? 'tgico-previous' : 'tgico-left');\n });\n\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n if(this.peerId === chatId.toPeerId(true)) {\n const chat = await this.managers.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 this.chat.addEventListener('setPeer', (mid, isTopMessage) => {\n const middleware = this.chat.bubbles.getMiddleware();\n apiManagerProxy.getState().then((state) => {\n if(!middleware() || !this.pinnedMessage) 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 this.listenerSetter.add(rootScope)('peer_pinned_messages', ({peerId, mids}) => {\n if(this.chat.type !== 'pinned' || peerId !== this.peerId) {\n return;\n }\n\n if(mids) {\n this.setTitle();\n }\n });\n\n this.setPeerStatusInterval = window.setInterval(this.setPeerStatus, 60e3);\n\n return this;\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 onMuteClick = () => {\n new PopupMute(this.peerId);\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 this.listenerSetter.removeAll();\n window.clearInterval(this.setPeerStatusInterval);\n\n this.pinnedMessage?.destroy(); // * ะฒะพะทะผะพะถะฝะพ ัั‚ะพ ะผะพะถะฝะพ ะฝะต ะดะตะปะฐั‚ัŒ\n this.chatAudio?.destroy();\n\n delete this.chatAudio;\n delete this.pinnedMessage;\n }\n\n public cleanup() {\n if(!this.chat.peerId) {\n this.container.classList.add('hide');\n }\n }\n\n public async finishPeerChange(isTarget: boolean) {\n const {peerId, threadId} = this.chat;\n\n let newAvatar: AvatarElement;\n if(this.chat.type === 'chat') {\n if(this.avatarElement?.peerId !== this.peerId || this.avatarElement.threadId !== this.chat.threadId) {\n newAvatar = this.constructAvatar();\n } else {\n newAvatar = this.avatarElement;\n }\n }\n\n const [isBroadcast, isAnyChat, chat, _, setTitleCallback, setStatusCallback, state] = await Promise.all([\n this.managers.appPeersManager.isBroadcast(peerId),\n this.managers.appPeersManager.isAnyChat(peerId),\n peerId.isAnyChat() ? this.managers.appChatsManager.getChat(peerId.toChatId()) : undefined,\n newAvatar ? newAvatar.updateWithOptions({peerId, threadId, wrapOptions: {customEmojiSize: makeMediaSize(32, 32)}}) : undefined,\n this.setTitleManual(),\n this.setPeerStatusManual(true),\n apiManagerProxy.getState()\n ]);\n\n return () => {\n const canHaveSomeButtons = !(this.chat.type === 'pinned' || this.chat.type === 'scheduled');\n this.btnMute && this.btnMute.classList.toggle('hide', !isBroadcast || !canHaveSomeButtons);\n if(this.btnJoin) {\n if(isAnyChat && !this.chat.isRestricted && canHaveSomeButtons) {\n replaceContent(this.btnJoin, i18n(isBroadcast ? 'Chat.Subscribe' : 'ChannelJoin'));\n this.btnJoin.classList.toggle('hide', !(chat as MTChat.chat)?.pFlags?.left);\n } else {\n this.btnJoin.classList.add('hide');\n }\n }\n\n if(this.btnSearch) {\n this.btnSearch.classList.toggle('hide', !canHaveSomeButtons);\n }\n\n if(this.btnPinned) {\n this.btnPinned.classList.toggle('hide', !canHaveSomeButtons);\n }\n\n if(this.avatarElement !== newAvatar) {\n if(newAvatar) {\n if(this.avatarElement) {\n this.avatarElement.replaceWith(newAvatar);\n } else {\n this.person.prepend(newAvatar);\n }\n }\n\n this.avatarElement?.remove();\n this.avatarElement = newAvatar;\n }\n\n this.setUtilsWidth();\n\n this.verifyButtons();\n\n if(this.btnMore) {\n this.btnMore.classList.toggle('hide', !canHaveSomeButtons);\n }\n\n const isPinnedMessagesNeeded = this.chat.isPinnedMessagesNeeded();\n if(isPinnedMessagesNeeded || this.chat.type === 'discussion') {\n if(this.chat.wasAlreadyUsed || !this.pinnedMessage) { // * change\n const newPinnedMessage = new ChatPinnedMessage(this, this.chat, this.managers);\n if(this.pinnedMessage) {\n this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.replaceWith(newPinnedMessage.pinnedMessageContainer.divAndCaption.container);\n this.pinnedMessage.destroy();\n // this.pinnedMessage.pinnedMessageContainer.toggle(true);\n } else {\n this.chatUtils.prepend(this.pinnedMessage.pinnedMessageContainer.divAndCaption.container);\n }\n\n this.pinnedMessage = newPinnedMessage;\n }\n\n if(isPinnedMessagesNeeded) {\n this.pinnedMessage.hidden = !!state.hiddenPinnedMessages[peerId];\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 } else if(this.pinnedMessage) {\n this.pinnedMessage.destroy();\n this.pinnedMessage = undefined;\n }\n\n setTitleCallback();\n setStatusCallback?.();\n this.subtitle.classList.toggle('hide', !setStatusCallback);\n this.setMutedState();\n\n this.container.classList.remove('hide');\n };\n }\n\n public async setTitleManual(count?: number) {\n const {peerId, threadId} = this.chat;\n const middleware = () => this.chat.bubbles.getMiddleware();\n let titleEl: HTMLElement, icons: Element[];\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.managers.appMessagesManager.getSearchCounters(peerId, [{_: 'inputMessagesFilterPinned'}], false).then((result) => {\n if(!middleware()) return;\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 titleEl = i18n(peerId === rootScope.myId ? 'Reminders' : 'ScheduledMessages');\n } else if(this.chat.type === 'discussion') {\n if(count === undefined) {\n const result = await this.managers.acknowledged.appMessagesManager.getHistory(peerId, 0, 1, 0, threadId);\n if(!middleware()) return;\n if(result.cached) {\n const historyResult = await result.result;\n if(!middleware()) return;\n count = historyResult.count;\n } else result.result.then((historyResult) => {\n if(!middleware()) return;\n this.setTitle(historyResult.count);\n });\n }\n\n if(count === undefined) titleEl = i18n('Loading');\n else titleEl = i18n('Chat.Title.Comments', [count]);\n } else if(this.chat.type === 'chat') {\n [titleEl/* , icons */] = await Promise.all([\n wrapPeerTitle({\n peerId,\n dialog: true,\n withIcons: !threadId,\n threadId: threadId\n })\n // generateTitleIcons(peerId)\n ]);\n\n if(!middleware()) {\n return;\n }\n }\n\n return () => {\n replaceContent(this.title, titleEl);\n // if(icons) {\n // this.title.append(...icons);\n // }\n };\n }\n\n public setTitle(count?: number) {\n this.setTitleManual(count).then((setTitleCallback) => setTitleCallback());\n }\n\n public async setMutedState() {\n if(!this.btnMute) return;\n\n const peerId = this.peerId;\n const muted = await this.managers.appNotificationsManager.isPeerLocalMuted({peerId, respectType: false, threadId: this.chat.threadId});\n if(await this.managers.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 // 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?.pinnedMessageContainer].filter(Boolean);\n const count = containers.reduce((acc, container) => {\n const isFloating = container.isFloating();\n this.container.classList.toggle(`is-pinned-${container.className}-floating`, isFloating);\n\n if(!container.isVisible()) {\n return acc;\n }\n\n return acc + +isFloating;\n }, 0);\n this.container.dataset.floating = '' + count;\n };\n\n public setPeerStatusManual = async(needClear = false) => {\n if(!this.subtitle || this.chat.type !== 'chat') return;\n\n if(this.chat.threadId) {\n const title = await wrapPeerTitle({peerId: this.peerId, dialog: true});\n const span = i18n('TopicProfileStatus', [title]);\n return () => replaceContent(this.subtitle, span);\n }\n\n const peerId = this.peerId;\n return this.chat.appImManager.setPeerStatus({\n peerId,\n element: this.subtitle,\n needClear,\n useWhitespace: false,\n middleware: () => peerId === this.peerId\n });\n };\n\n public setPeerStatus = (needClear?: boolean) => {\n return this.setPeerStatusManual(needClear).then((callback) => {\n callback?.();\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 appSidebarRight from '..';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport AppSearch, {SearchGroup} from '../../appSearch';\nimport ButtonIcon from '../../buttonIcon';\nimport InputSearch from '../../inputSearch';\nimport PopupElement from '../../popups';\nimport PopupDatePicker from '../../popups/datePicker';\nimport {SliderSuperTab} from '../../slider';\n\nexport default class AppPrivateSearchTab extends SliderSuperTab {\n private inputSearch: InputSearch;\n private appSearch: AppSearch;\n private btnPickDate: HTMLElement;\n\n private peerId: PeerId;\n private threadId = 0;\n private query = '';\n private onDatePick: (timestamp: number) => void;\n\n onOpenAfterTimeout() {\n this.appSearch.beginSearch(this.peerId, this.threadId, this.query);\n }\n\n public init(\n peerId: PeerId,\n threadId?: number,\n onDatePick?: AppPrivateSearchTab['onDatePick'],\n query?: string\n ) {\n this.container.id = 'search-private-container';\n this.container.classList.add('chatlist-container');\n this.inputSearch = new InputSearch('Search');\n this.title.replaceWith(this.inputSearch.container);\n\n this.btnPickDate = ButtonIcon('calendar sidebar-header-right');\n this.header.append(this.btnPickDate);\n\n const c = document.createElement('div');\n c.classList.add('chatlist-container');\n this.scrollable.container.replaceWith(c);\n this.appSearch = new AppSearch(c, this.inputSearch, {\n messages: new SearchGroup('Chat.Search.PrivateSearch', 'messages')\n });\n\n if(!this.peerId) {\n this.query = query;\n this.peerId = peerId;\n this.threadId = threadId;\n this.onDatePick = onDatePick;\n\n this.btnPickDate.classList.toggle('hide', !this.onDatePick);\n if(this.onDatePick) {\n attachClickEvent(this.btnPickDate, () => {\n PopupElement.createPopup(PopupDatePicker, new Date(), this.onDatePick).show();\n });\n }\n\n query && this.appSearch.searchInput.inputField.setValueSilently(query);\n\n appSidebarRight.toggleSidebar(true);\n } else {\n this.appSearch.beginSearch(this.peerId, this.threadId, query);\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 ChatTopbar from './topbar';\nimport AppSearch, {SearchGroup} from '../appSearch';\nimport PopupDatePicker from '../popups/datePicker';\nimport ripple from '../ripple';\nimport InputSearch from '../inputSearch';\nimport type Chat from './chat';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport whichChild from '../../helpers/dom/whichChild';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport {i18n} from '../../lib/langPack';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\nimport {IS_MOBILE_SAFARI} from '../../environment/userAgent';\nimport PopupElement from '../popups';\nimport {DIALOG_LIST_ELEMENT_TAG} from '../../lib/appManagers/appDialogsManager';\n\nexport default class ChatSearch {\n private element: HTMLElement;\n private backBtn: HTMLElement;\n private inputSearch: InputSearch;\n\n private results: HTMLElement;\n\n private footer: HTMLElement;\n private dateBtn: HTMLElement;\n private foundCountEl: HTMLElement;\n private controls: HTMLElement;\n private downBtn: HTMLElement;\n private upBtn: HTMLElement;\n\n private appSearch: AppSearch;\n private searchGroup: SearchGroup;\n\n private foundCount = 0;\n private selectedIndex = 0;\n private setPeerPromise: Promise;\n private listenerSetter: ListenerSetter;\n private navigationItem: NavigationItem;\n\n constructor(private topbar: ChatTopbar, private chat: Chat, query?: string) {\n this.element = document.createElement('div');\n this.element.classList.add('sidebar-header', 'chat-search', 'chatlist-container');\n\n this.backBtn = document.createElement('button');\n this.backBtn.classList.add('btn-icon', 'tgico-left', 'sidebar-close-button');\n ripple(this.backBtn);\n\n const listenerSetter = this.listenerSetter = new ListenerSetter();\n\n const attachClick = (element: HTMLElement, callback: (e: MouseEvent) => void) => {\n attachClickEvent(element, callback, {listenerSetter});\n };\n\n attachClick(this.backBtn, () => {\n this.destroy();\n });\n\n this.inputSearch = new InputSearch('Search');\n\n // Results\n this.results = document.createElement('div');\n this.results.classList.add('chat-search-results', 'chatlist-container');\n\n this.searchGroup = new SearchGroup(false, 'messages', undefined, '', false);\n attachClick(this.searchGroup.list, this.onResultsClick);\n\n this.appSearch = new AppSearch(this.results, this.inputSearch, {\n messages: this.searchGroup\n }, (count) => {\n this.foundCount = count;\n\n if(!this.foundCount) {\n replaceContent(this.foundCountEl, this.inputSearch.value ? i18n('NoResult') : '');\n this.results.classList.remove('active');\n this.chat.bubbles.container.classList.remove('search-results-active');\n this.upBtn.setAttribute('disabled', 'true');\n this.downBtn.setAttribute('disabled', 'true');\n } else {\n this.selectResult(this.searchGroup.list.children[0] as HTMLElement);\n }\n });\n this.appSearch.beginSearch(this.chat.peerId, this.chat.threadId);\n\n // appImManager.topbar.parentElement.insertBefore(this.results, appImManager.bubblesContainer);\n this.chat.bubbles.container.append(this.results);\n\n // Footer\n this.footer = document.createElement('div');\n this.footer.classList.add('chat-search-footer');\n\n attachClick(this.footer, this.onFooterClick);\n ripple(this.footer);\n\n this.foundCountEl = document.createElement('span');\n this.foundCountEl.classList.add('chat-search-count');\n\n this.dateBtn = document.createElement('button');\n this.dateBtn.classList.add('btn-icon', 'tgico-calendar');\n\n this.controls = document.createElement('div');\n this.controls.classList.add('chat-search-controls');\n\n this.upBtn = document.createElement('button');\n this.upBtn.classList.add('btn-icon', 'tgico-up');\n this.downBtn = document.createElement('button');\n this.downBtn.classList.add('btn-icon', 'tgico-down');\n\n this.upBtn.setAttribute('disabled', 'true');\n this.downBtn.setAttribute('disabled', 'true');\n\n attachClick(this.dateBtn, this.onDateClick);\n attachClick(this.upBtn, this.onUpClick);\n attachClick(this.downBtn, this.onDownClick);\n this.controls.append(this.upBtn, this.downBtn);\n\n this.footer.append(this.foundCountEl, this.dateBtn, this.controls);\n\n this.topbar.container.parentElement.insertBefore(this.footer, chat.input.chatInput);\n\n // Append container\n this.element.append(this.backBtn, this.inputSearch.container);\n\n this.topbar.container.classList.add('hide-pinned');\n this.topbar.container.parentElement.append(this.element);\n\n this.inputSearch.input.focus();\n\n if(query) {\n this.setQuery(query);\n }\n\n if(!IS_MOBILE_SAFARI) {\n this.navigationItem = {\n type: 'mobile-search',\n onPop: () => {\n this.destroy();\n }\n };\n\n appNavigationController.pushItem(this.navigationItem);\n }\n }\n\n public destroy() {\n this.topbar.container.classList.remove('hide-pinned');\n this.element.remove();\n this.inputSearch.remove();\n this.results.remove();\n this.footer.remove();\n this.listenerSetter.removeAll();\n this.chat.bubbles.container.classList.remove('search-results-active');\n this.chat.search = undefined;\n appNavigationController.removeItem(this.navigationItem);\n }\n\n public setQuery(query: string) {\n this.inputSearch.inputField.value = query;\n }\n\n private onDateClick = (e: MouseEvent) => {\n cancelEvent(e);\n PopupElement.createPopup(PopupDatePicker, new Date(), this.chat.bubbles.onDatePick).show();\n };\n\n private selectResult(elem: HTMLElement) {\n if(this.setPeerPromise) return this.setPeerPromise;\n\n const peerId = elem.dataset.peerId.toPeerId();\n const lastMsgId = +elem.dataset.mid || undefined;\n\n const index = whichChild(elem);\n\n if(index === (this.foundCount - 1)) {\n this.upBtn.setAttribute('disabled', 'true');\n } else {\n this.upBtn.removeAttribute('disabled');\n }\n\n if(!index) {\n this.downBtn.setAttribute('disabled', 'true');\n } else {\n this.downBtn.removeAttribute('disabled');\n }\n\n this.results.classList.remove('active');\n this.chat.bubbles.container.classList.remove('search-results-active');\n\n const res = this.chat.setPeer({peerId, lastMsgId});\n this.setPeerPromise = ((res instanceof Promise ? res : Promise.resolve(res)) as Promise).then(() => {\n this.selectedIndex = index;\n replaceContent(this.foundCountEl, i18n('Of', [index + 1, this.foundCount]));\n\n const renderedCount = this.searchGroup.list.childElementCount;\n if(this.selectedIndex >= (renderedCount - 6)) {\n this.appSearch.searchMore();\n }\n }).finally(() => {\n this.setPeerPromise = null;\n });\n }\n\n private onResultsClick = (e: MouseEvent) => {\n const target = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\n if(target) {\n this.selectResult(target);\n }\n };\n\n private onFooterClick = (e: MouseEvent) => {\n if(this.foundCount) {\n this.chat.bubbles.container.classList.toggle('search-results-active');\n this.results.classList.toggle('active');\n }\n };\n\n private onUpClick = (e: MouseEvent) => {\n cancelEvent(e);\n this.selectResult(this.searchGroup.list.children[this.selectedIndex + 1] as HTMLElement);\n };\n\n private onDownClick = (e: MouseEvent) => {\n cancelEvent(e);\n this.selectResult(this.searchGroup.list.children[this.selectedIndex - 1] as HTMLElement);\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 indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\nimport mediaSizes, {ScreenSize} from '../../helpers/mediaSizes';\nimport windowSize from '../../helpers/windowSize';\nimport IS_IMAGE_BITMAP_SUPPORTED from '../../environment/imageBitmapSupport';\n\ntype ChatBackgroundPatternRendererInitOptions = {\n url: string,\n width: number,\n height: number,\n mask?: boolean\n};\n\nexport default class ChatBackgroundPatternRenderer {\n private static INSTANCES: ChatBackgroundPatternRenderer[] = [];\n\n // private pattern: CanvasPattern;\n private objectUrl: string;\n private options: ChatBackgroundPatternRendererInitOptions;\n private canvases: Set;\n // private createCanvasPatternPromise: Promise;\n // private exportCanvasPatternToImagePromise: Promise;\n private renderImageFromUrlPromise: Promise;\n private image: HTMLImageElement;\n private imageBitmap: ImageBitmap;\n\n constructor() {\n this.canvases = new Set();\n }\n\n public static getInstance(options: ChatBackgroundPatternRendererInitOptions) {\n let instance = this.INSTANCES.find((instance) => {\n return deepEqual(instance.options, options);\n });\n\n if(!instance) {\n instance = new ChatBackgroundPatternRenderer();\n instance.init(options);\n this.INSTANCES.push(instance);\n }\n\n return instance;\n }\n\n public init(options: ChatBackgroundPatternRendererInitOptions) {\n // if(this.options) {\n // if(this.options.width !== options.width || this.options.height !== options.height) {\n // this.createCanvasPatternPromise =\n // this.pattern =\n // this.exportCanvasPatternToImagePromise =\n // undefined;\n // }\n // }\n\n this.options = options;\n }\n\n public renderToCanvas(canvas: HTMLCanvasElement) {\n // return this.createCanvasPattern(canvas).then(() => {\n // return this.fillCanvas(canvas);\n // });\n\n return this.renderImageFromUrl(this.options.url).then(() => {\n return this.fillCanvas(canvas);\n });\n }\n\n private renderImageFromUrl(url: string) {\n if(this.renderImageFromUrlPromise) return this.renderImageFromUrlPromise;\n const img = this.image = document.createElement('img');\n img.crossOrigin = 'anonymous';\n return this.renderImageFromUrlPromise = renderImageFromUrlPromise(img, url, false).then(() => {\n if(!IS_IMAGE_BITMAP_SUPPORTED) {\n return img;\n }\n\n return createImageBitmap(img, {\n resizeWidth: 1440,\n resizeHeight: 2960\n }).then((imageBitmap) => {\n this.imageBitmap = imageBitmap;\n return img;\n });\n });\n }\n\n /* private createCanvasPattern(canvas: HTMLCanvasElement) {\n if(this.createCanvasPatternPromise) return this.createCanvasPatternPromise;\n return this.createCanvasPatternPromise = this.renderImageFromUrl(this.options.url).then((img) => {\n let createPatternFrom: HTMLImageElement | HTMLCanvasElement;\n if(IS_SAFARI) {\n const canvas = createPatternFrom = document.createElement('canvas');\n canvas.width = img.naturalWidth;\n canvas.height = img.naturalHeight;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n } else {\n createPatternFrom = img;\n }\n\n const perf = performance.now();\n this.pattern = canvas.getContext('2d').createPattern(createPatternFrom, 'repeat-x');\n console.warn('creating pattern time:', performance.now() - perf);\n\n return this.pattern;\n });\n }\n\n public exportCanvasPatternToImage(canvas: HTMLCanvasElement) {\n if(this.exportCanvasPatternToImagePromise) return this.exportCanvasPatternToImagePromise;\n return this.exportCanvasPatternToImagePromise = new Promise((resolve) => {\n canvas.toBlob((blob) => {\n const newUrl = this.objectUrl = URL.createObjectURL(blob);\n resolve(newUrl);\n }, 'image/png');\n });\n } */\n\n public cleanup(canvas: HTMLCanvasElement) {\n this.canvases.delete(canvas);\n\n if(!this.canvases.size) {\n indexOfAndSplice(ChatBackgroundPatternRenderer.INSTANCES, this);\n\n if(this.objectUrl) {\n this.imageBitmap?.close();\n URL.revokeObjectURL(this.objectUrl);\n }\n }\n }\n\n public fillCanvas(canvas: HTMLCanvasElement) {\n const context = canvas.getContext('2d');\n const {width, height} = canvas;\n // const perf = performance.now();\n // if(context.fillStyle instanceof CanvasPattern) {\n // context.clearRect(0, 0, width, height);\n // }\n\n const source = this.imageBitmap || this.image;\n\n let imageWidth = source.width, imageHeight = source.height;\n // let patternHeight = 1480 * canvas.dpr;\n // if(+canvas.dataset.originalHeight !== height) patternHeight *= .6875;\n const patternHeight = (500 + (windowSize.height / 2.5)) * canvas.dpr;\n const ratio = patternHeight / imageHeight;\n imageWidth *= ratio;\n imageHeight = patternHeight;\n\n if(this.options.mask) {\n context.fillStyle = '#000';\n context.fillRect(0, 0, width, height);\n context.globalCompositeOperation = 'destination-out';\n } else {\n context.globalCompositeOperation = 'source-over';\n }\n\n const d = (y: number) => {\n for(let x = 0; x < width; x += imageWidth) {\n context.drawImage(source, x, y, imageWidth, imageHeight);\n }\n };\n\n const centerY = (height - imageHeight) / 2;\n d(centerY);\n\n if(centerY > 0) {\n let topY = centerY;\n do {\n d(topY -= imageHeight);\n } while(topY >= 0);\n }\n\n const endY = height - 1;\n for(let bottomY = centerY + imageHeight; bottomY < endY; bottomY += imageHeight) {\n d(bottomY);\n }\n\n // for(let x = 0; x < width; x += imageWidth) {\n // for(let y = 0; y < height; y += imageHeight) {\n // context.drawImage(img, x, y, imageWidth, imageHeight);\n // }\n // }\n // context.fillStyle = this.pattern;\n // context.fillRect(0, 0, width, height);\n // console.warn('fill canvas time', performance.now() - perf);\n }\n\n public setCanvasDimensions(canvas: HTMLCanvasElement) {\n const devicePixelRatio = Math.min(2, window.devicePixelRatio);\n const width = this.options.width * devicePixelRatio;\n let height = this.options.height * devicePixelRatio;\n\n canvas.dpr = devicePixelRatio;\n canvas.dataset.originalHeight = '' + height;\n if(mediaSizes.activeScreen === ScreenSize.large) height *= 1.5;\n canvas.width = width;\n canvas.height = height;\n }\n\n public createCanvas() {\n const canvas = document.createElement('canvas');\n this.canvases.add(canvas);\n this.setCanvasDimensions(canvas);\n return canvas;\n }\n\n public resize(width: number, height: number) {\n this.init({\n ...this.options,\n width,\n height\n });\n\n const promises: Promise[] = [];\n for(const canvas of this.canvases) {\n this.setCanvasDimensions(canvas);\n promises.push(this.renderToCanvas(canvas));\n }\n\n return Promise.all(promises);\n }\n\n public static resizeInstances(width: number, height: number) {\n return Promise.all(this.INSTANCES.map((instance) => instance.resize(width, height)));\n }\n\n /* public setResizeMode(resizing: boolean) {\n const canvases = Array.from(this.canvases);\n const canvas = canvases[canvases.length - 1];\n canvas.style.display = resizing ? 'none' : '';\n const img = this.img;\n img.style.display = resizing ? '' : 'none';\n\n return {img, canvas};\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 {ChatRights} from '../../lib/appManagers/appChatsManager';\nimport {AppImManager, APP_TABS, ChatSetPeerOptions} from '../../lib/appManagers/appImManager';\nimport type {MessageSendingParams, MessagesStorageKey} from '../../lib/appManagers/appMessagesManager';\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 {NULL_PEER_ID, REPLIES_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport SetTransition from '../singleTransition';\nimport AppPrivateSearchTab from '../sidebarRight/tabs/search';\nimport renderImageFromUrl from '../../helpers/dom/renderImageFromUrl';\nimport mediaSizes, {ScreenSize} from '../../helpers/mediaSizes';\nimport ChatSearch from './search';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport getAutoDownloadSettingsByPeerId, {ChatAutoDownloadSettings} from '../../helpers/autoDownload';\nimport ChatBackgroundGradientRenderer from './gradientRenderer';\nimport ChatBackgroundPatternRenderer from './patternRenderer';\nimport pause from '../../helpers/schedulers/pause';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport SlicedArray from '../../helpers/slicedArray';\nimport themeController from '../../helpers/themeController';\nimport AppSharedMediaTab from '../sidebarRight/tabs/sharedMedia';\nimport noop from '../../helpers/noop';\nimport middlewarePromise from '../../helpers/middlewarePromise';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport {Message, WallPaper} from '../../layer';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport {getColorsFromWallPaper} from '../../helpers/color';\n\nexport type ChatType = 'chat' | 'pinned' | '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 public messagesStorageKey: MessagesStorageKey;\n\n public noForwards: boolean;\n\n public inited: boolean;\n\n public isRestricted: boolean;\n public autoDownload: ChatAutoDownloadSettings;\n\n public gradientRenderer: ChatBackgroundGradientRenderer;\n public patternRenderer: ChatBackgroundPatternRenderer;\n public gradientCanvas: HTMLCanvasElement;\n public patternCanvas: HTMLCanvasElement;\n public backgroundTempId: number;\n public setBackgroundPromise: Promise;\n public sharedMediaTab: AppSharedMediaTab;\n public sharedMediaTabs: AppSharedMediaTab[];\n // public renderDarkPattern: () => Promise;\n\n public isBot: boolean;\n public isChannel: boolean;\n public isBroadcast: boolean;\n public isAnyGroup: boolean;\n public isMegagroup: boolean;\n public isForum: boolean;\n public isAllMessagesForum: boolean;\n public isAnonymousSending: boolean;\n\n public animationGroup: AnimationItemGroup;\n\n constructor(\n public appImManager: AppImManager,\n public managers: AppManagers\n ) {\n super();\n\n this.type = 'chat';\n this.animationGroup = `chat-${Math.round(Math.random() * 65535)}`;\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.warn('constructor');\n\n this.peerId = NULL_PEER_ID;\n\n this.container.append(this.backgroundEl);\n this.appImManager.chatsContainer.append(this.container);\n\n this.backgroundTempId = 0;\n this.sharedMediaTabs = [];\n }\n\n public setBackground(url: string, skipAnimation?: boolean): Promise {\n const theme = themeController.getTheme();\n const themeSettings = theme.settings;\n const wallPaper = themeSettings.wallpaper;\n const colors = getColorsFromWallPaper(wallPaper);\n\n let item: HTMLElement;\n const isColorBackground = !!colors && !(wallPaper as WallPaper.wallPaper).slug && !wallPaper.settings.intensity;\n if(\n isColorBackground &&\n document.documentElement.style.cursor === 'grabbing' &&\n this.gradientRenderer &&\n !this.patternRenderer\n ) {\n this.gradientCanvas.dataset.colors = colors;\n this.gradientRenderer.init(this.gradientCanvas);\n return Promise.resolve();\n }\n\n const tempId = ++this.backgroundTempId;\n\n const previousGradientRenderer = this.gradientRenderer;\n const previousPatternRenderer = this.patternRenderer;\n const previousGradientCanvas = this.gradientCanvas;\n const previousPatternCanvas = this.patternCanvas;\n\n this.gradientRenderer =\n this.patternRenderer =\n this.gradientCanvas =\n this.patternCanvas =\n // this.renderDarkPattern =\n undefined;\n\n const intensity = wallPaper.settings?.intensity && wallPaper.settings.intensity / 100;\n const isDarkPattern = !!intensity && intensity < 0;\n\n let patternRenderer: ChatBackgroundPatternRenderer;\n let patternCanvas = item?.firstElementChild as HTMLCanvasElement;\n let gradientCanvas: HTMLCanvasElement;\n if(!item) {\n item = document.createElement('div');\n item.classList.add('chat-background-item');\n\n if(url) {\n if(intensity) {\n item.classList.add('is-pattern');\n\n const rect = this.appImManager.chatsContainer.getBoundingClientRect();\n patternRenderer = this.patternRenderer = ChatBackgroundPatternRenderer.getInstance({\n url,\n width: rect.width,\n height: rect.height,\n mask: isDarkPattern\n });\n\n patternCanvas = this.patternCanvas = patternRenderer.createCanvas();\n patternCanvas.classList.add('chat-background-item-canvas', 'chat-background-item-pattern-canvas');\n\n if(isDarkPattern) {\n item.classList.add('is-dark');\n }\n\n // if(isDarkPattern) {\n // this.renderDarkPattern = () => {\n // return patternRenderer.exportCanvasPatternToImage(patternCanvas).then((url) => {\n // if(this.backgroundTempId !== tempId) {\n // return;\n // }\n\n // gradientCanvas.style.webkitMaskImage = `url(${url})`;\n // });\n // };\n // }\n } else {\n item.classList.add('is-image');\n }\n } else {\n item.classList.add('is-color');\n }\n }\n\n let gradientRenderer: ChatBackgroundGradientRenderer;\n if(colors) {\n // if(color.includes(',')) {\n const {canvas, gradientRenderer: _gradientRenderer} = ChatBackgroundGradientRenderer.create(colors);\n gradientRenderer = this.gradientRenderer = _gradientRenderer;\n gradientCanvas = this.gradientCanvas = canvas;\n gradientCanvas.classList.add('chat-background-item-canvas', 'chat-background-item-color-canvas');\n\n if(rootScope.settings.animationsEnabled) {\n gradientRenderer.scrollAnimate(true);\n }\n // } else {\n // item.style.backgroundColor = color;\n // item.style.backgroundImage = 'none';\n // }\n }\n\n if(patternRenderer) {\n const setOpacityTo = isDarkPattern ? gradientCanvas : patternCanvas;\n let opacityMax = Math.abs(intensity) * (isDarkPattern ? .5 : 1);\n if(isDarkPattern) {\n opacityMax = Math.max(0.3, opacityMax);\n }\n setOpacityTo.style.setProperty('--opacity-max', '' + opacityMax);\n }\n\n const promise = new Promise((resolve) => {\n const cb = () => {\n if(this.backgroundTempId !== tempId) {\n if(patternRenderer) {\n patternRenderer.cleanup(patternCanvas);\n }\n\n if(gradientRenderer) {\n gradientRenderer.cleanup();\n }\n\n return;\n }\n\n const prev = this.backgroundEl.lastElementChild as HTMLElement;\n\n if(prev === item) {\n resolve();\n return;\n }\n\n const append = [\n gradientCanvas,\n // isDarkPattern && this.renderDarkPattern ? undefined : patternCanvas\n patternCanvas\n ].filter(Boolean);\n if(append.length) {\n item.append(...append);\n }\n\n this.backgroundEl.append(item);\n\n SetTransition({\n element: item,\n className: 'is-visible',\n forwards: true,\n duration: !skipAnimation ? 200 : 0,\n onTransitionEnd: prev ? () => {\n previousPatternRenderer?.cleanup(previousPatternCanvas);\n previousGradientRenderer?.cleanup();\n\n prev.remove();\n } : null,\n useRafs: 2\n });\n\n resolve();\n };\n\n if(patternRenderer) {\n const renderPatternPromise = patternRenderer.renderToCanvas(patternCanvas);\n renderPatternPromise.then(() => {\n if(this.backgroundTempId !== tempId) {\n return;\n }\n\n // let promise: Promise;\n // if(isDarkPattern && this.renderDarkPattern) {\n // promise = this.renderDarkPattern();\n // } else {\n // const promise = Promise.resolve();\n // }\n\n // promise.then(cb);\n cb();\n });\n } else if(url) {\n renderImageFromUrl(item, url, cb);\n } else {\n cb();\n }\n });\n\n return this.setBackgroundPromise = Promise.race([\n pause(500),\n promise\n ]);\n }\n\n public setType(type: ChatType) {\n this.type = type;\n }\n\n public init(/* peerId: PeerId */) {\n // this.initPeerId = peerId;\n\n this.topbar = new ChatTopbar(this, appSidebarRight, this.managers);\n this.bubbles = new ChatBubbles(this, this.managers);\n this.input = new ChatInput(this, this.appImManager, this.managers);\n this.contextMenu = new ChatContextMenu(this, this.managers);\n this.selection = new ChatSelection(this, this.bubbles, this.input, this.managers);\n\n this.topbar.constructUtils();\n this.topbar.constructPeerHelpers();\n\n this.topbar.construct();\n this.input.construct();\n\n this.bubbles.constructPeerHelpers();\n this.input.constructPeerHelpers();\n\n if(!IS_TOUCH_SUPPORTED) {\n this.bubbles.setReactionsHoverListeners();\n }\n\n this.bubbles.attachContainerListeners();\n\n this.container.append(this.topbar.container, this.bubbles.container, this.input.chatInput);\n\n this.bubbles.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\n if(this.peerId === migrateFrom) {\n this.setPeer({peerId: migrateTo});\n }\n });\n\n this.bubbles.listenerSetter.add(rootScope)('dialog_drop', (dialog) => {\n if(dialog.peerId === this.peerId && (dialog._ === 'dialog' || this.threadId === dialog.id)) {\n this.appImManager.setPeer();\n }\n });\n\n this.bubbles.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n const {peerId} = this;\n if(peerId.isAnyChat() && peerId.toChatId() === chatId) {\n const isAnonymousSending = await this.managers.appMessagesManager.isAnonymousSending(peerId);\n if(peerId === this.peerId) {\n this.isAnonymousSending = isAnonymousSending;\n }\n }\n });\n\n const freezeObservers = (freeze: boolean) => {\n const cb = () => {\n this.bubbles.observer?.toggleObservingNew(freeze);\n animationIntersector.toggleIntersectionGroup(this.animationGroup, freeze);\n if(freeze) {\n animationIntersector.checkAnimations(freeze, this.animationGroup);\n }\n };\n\n if(!freeze) {\n setTimeout(() => {\n cb();\n }, 400);\n } else {\n cb();\n }\n };\n\n this.bubbles.listenerSetter.add(this.appImManager)('chat_changing', ({to}) => {\n freezeObservers(to !== this);\n });\n\n this.bubbles.listenerSetter.add(this.appImManager)('tab_changing', (tabId) => {\n freezeObservers(this.appImManager.chat !== this || (tabId !== APP_TABS.CHAT && mediaSizes.activeScreen === ScreenSize.mobile));\n });\n }\n\n public beforeDestroy() {\n this.bubbles.cleanup();\n }\n\n private cleanupBackground() {\n ++this.backgroundTempId;\n if(this.patternRenderer) {\n this.patternRenderer.cleanup(this.patternCanvas);\n this.patternRenderer = undefined;\n }\n\n if(this.gradientRenderer) {\n this.gradientRenderer.cleanup();\n this.gradientRenderer = undefined;\n }\n }\n\n public destroy() {\n // const perf = performance.now();\n\n this.destroySharedMediaTab();\n this.topbar.destroy();\n this.bubbles.destroy();\n this.input.destroy();\n this.contextMenu && this.contextMenu.destroy();\n this.selection && this.selection.attachListeners(undefined, undefined);\n\n this.cleanupBackground();\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.topbar.cleanup();\n this.selection.cleanup();\n }\n\n public get isForumTopic() {\n return !!(this.isForum && this.threadId);\n }\n\n public async onChangePeer(options: ChatSetPeerOptions, m: ReturnType) {\n const {peerId, threadId} = this;\n\n const searchTab = appSidebarRight.getTab(AppPrivateSearchTab);\n searchTab?.close();\n\n const [\n noForwards,\n isRestricted,\n isAnyGroup,\n _,\n isMegagroup,\n isBroadcast,\n isChannel,\n isBot,\n isForum,\n isAnonymousSending\n ] = await m(Promise.all([\n this.managers.appPeersManager.noForwards(peerId),\n this.managers.appPeersManager.isPeerRestricted(peerId),\n this._isAnyGroup(peerId),\n this.setAutoDownloadMedia(),\n this.managers.appPeersManager.isMegagroup(peerId),\n this.managers.appPeersManager.isBroadcast(peerId),\n this.managers.appPeersManager.isChannel(peerId),\n this.managers.appPeersManager.isBot(peerId),\n this.managers.appPeersManager.isForum(peerId),\n this.managers.appMessagesManager.isAnonymousSending(peerId)\n ]));\n\n // ! WARNING: TEMPORARY, HAVE TO GET TOPIC\n if(isForum && threadId) {\n await m(this.managers.dialogsStorage.getForumTopicOrReload(peerId, threadId));\n }\n\n this.noForwards = noForwards;\n this.isRestricted = isRestricted;\n this.isAnyGroup = isAnyGroup;\n this.isMegagroup = isMegagroup;\n this.isBroadcast = isBroadcast;\n this.isChannel = isChannel;\n this.isBot = isBot;\n this.isForum = isForum;\n this.isAllMessagesForum = isForum && !threadId;\n this.isAnonymousSending = isAnonymousSending;\n\n if(threadId && !this.isForum) {\n options.type = 'discussion';\n }\n\n const type = options.type ?? 'chat';\n this.setType(type);\n\n this.messagesStorageKey = `${this.peerId}_${this.type === 'scheduled' ? 'scheduled' : 'history'}`;\n\n this.container.classList.toggle('no-forwards', this.noForwards);\n\n this.sharedMediaTab = appSidebarRight.createSharedMediaTab();\n this.sharedMediaTabs.push(this.sharedMediaTab);\n\n this.sharedMediaTab.setPeer(peerId, threadId);\n this.input.clearHelper(); // ะบะพัั‚ั‹ะปัŒ\n this.selection.cleanup(); // TODO: REFACTOR !!!!!!\n }\n\n public setPeer(options: ChatSetPeerOptions) {\n const {peerId, threadId} = options;\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 appMediaViewer = (window as any).appMediaViewer as AppMediaViewerBase;\n // if(appMediaViewer) {\n // appMediaViewer.close();\n // }\n\n const samePeer = this.appImManager.isSamePeer(this, options);\n if(!samePeer) {\n this.appImManager.dispatchEvent('peer_changing', this);\n this.peerId = peerId || NULL_PEER_ID;\n this.threadId = threadId;\n } else if(this.setPeerPromise) {\n return;\n }\n\n if(!peerId) {\n appSidebarRight.toggleSidebar(false);\n this.cleanup(true);\n this.bubbles.setPeer({samePeer: false, peerId});\n this.peerId = 0;\n this.appImManager.dispatchEvent('peer_changed', this);\n\n appSidebarRight.replaceSharedMediaTab();\n this.destroySharedMediaTab();\n this.sharedMediaTab = undefined;\n\n return;\n }\n\n this.peerChanged = samePeer;\n\n const bubblesSetPeerPromise = this.bubbles.setPeer({...options, samePeer});\n const setPeerPromise = this.setPeerPromise = bubblesSetPeerPromise.then((result) => {\n return result.promise;\n }).catch(noop).finally(() => {\n if(this.setPeerPromise === setPeerPromise) {\n this.setPeerPromise = null;\n }\n });\n\n return bubblesSetPeerPromise;\n }\n\n public destroySharedMediaTab(tab = this.sharedMediaTab) {\n if(!tab) {\n return;\n }\n\n indexOfAndSplice(this.sharedMediaTabs, tab);\n tab.destroy();\n }\n\n public async setAutoDownloadMedia() {\n this.autoDownload = await getAutoDownloadSettingsByPeerId(this.peerId);\n }\n\n public setMessageId(messageId?: number) {\n return this.setPeer({\n peerId: this.peerId,\n threadId: this.threadId,\n lastMsgId: messageId\n });\n }\n\n public async finishPeerChange(isTarget: boolean, isJump: boolean, lastMsgId: number, startParam?: string) {\n if(this.peerChanged) return;\n\n const peerId = this.peerId;\n this.peerChanged = true;\n this.wasAlreadyUsed = true;\n\n const middleware = this.bubbles.getMiddleware();\n\n this.cleanup(false);\n\n const sharedMediaTab = this.sharedMediaTab;\n\n const callbacksPromise = Promise.all([\n this.topbar.finishPeerChange(isTarget),\n this.bubbles.finishPeerChange(),\n this.input.finishPeerChange(startParam),\n sharedMediaTab.fillProfileElements()\n ]);\n\n const callbacks = await callbacksPromise;\n sharedMediaTab.loadSidebarMedia(true);\n\n if(!middleware()) {\n return;\n }\n\n callbacks.forEach((callback) => {\n callback?.();\n });\n\n appSidebarRight.replaceSharedMediaTab(sharedMediaTab);\n\n this.sharedMediaTabs.filter((tab) => tab !== sharedMediaTab).forEach((tab) => this.destroySharedMediaTab(tab));\n\n this.container.dataset.type = this.type;\n this.log.setPrefix('CHAT-' + peerId + '-' + this.type);\n\n this.appImManager.dispatchEvent('peer_changed', this);\n }\n\n public getMessage(mid: number) {\n return this.managers.appMessagesManager.getMessageFromStorage(this.messagesStorageKey, mid);\n }\n\n public async getMidsByMid(mid: number) {\n return this.managers.appMessagesManager.getMidsByMessage(await this.getMessage(mid));\n }\n\n public getHistoryStorage(ignoreThreadId?: boolean) {\n return this.managers.appMessagesManager.getHistoryStorageTransferable(this.peerId, ignoreThreadId ? undefined : this.threadId)\n .then((historyStorageTransferable) => {\n return {\n ...historyStorageTransferable,\n history: SlicedArray.fromJSON(historyStorageTransferable.historySerialized)\n }\n });\n }\n\n public getDialogOrTopic() {\n return this.isForum && this.threadId ? this.managers.dialogsStorage.getForumTopic(this.peerId, this.threadId) : this.managers.dialogsStorage.getDialogOnly(this.peerId);\n }\n\n public getHistoryMaxId() {\n return this.getHistoryStorage().then((historyStorage) => historyStorage.maxId);\n }\n\n public async _isAnyGroup(peerId: PeerId) {\n return peerId === rootScope.myId || peerId === REPLIES_PEER_ID || (await this.managers.appPeersManager.isAnyGroup(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 = appSidebarRight.createTab(AppPrivateSearchTab);\n }\n\n tab.open(this.peerId, this.threadId, this.bubbles.onDatePick, query);\n }\n }\n\n public canSend(action?: ChatRights) {\n return this.managers.appMessagesManager.canSendToPeer(this.peerId, this.threadId, action);\n }\n\n public isStartButtonNeeded() {\n return Promise.all([\n this.managers.appPeersManager.isBot(this.peerId),\n this.managers.appMessagesManager.getDialogOnly(this.peerId),\n this.getHistoryStorage(true)\n ]).then(([isBot, dialog, historyStorage]) => {\n return isBot && !dialog && !historyStorage.history.length;\n });\n }\n\n public getMessageSendingParams(): MessageSendingParams {\n return {\n threadId: this.threadId,\n replyToMsgId: this.input.replyToMsgId,\n scheduleDate: this.input.scheduleDate,\n silent: this.input.sendSilent,\n sendAsPeerId: this.input.sendAsPeerId\n };\n }\n\n public isOurMessage(message: Message.message | Message.messageService) {\n return message.fromId === rootScope.myId || (!!message.pFlags.out && this.isMegagroup);\n }\n\n public isOutMessage(message: Message.message | Message.messageService) {\n const fwdFrom = (message as Message.message).fwd_from;\n const isOut = this.isOurMessage(message) && (!fwdFrom || this.peerId !== rootScope.myId);\n return !!isOut;\n }\n\n public isAvatarNeeded(message: Message.message | Message.messageService) {\n return this.isAnyGroup && !this.isOutMessage(message);\n }\n\n public isPinnedMessagesNeeded() {\n return this.type === 'chat' || this.isForum;\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 {State} from '../config/state';\nimport rootScope from '../lib/rootScope';\n\nexport type ChatAutoDownloadSettings = {\n photo: number,\n video: number,\n file: number\n};\n\nexport default async function getAutoDownloadSettingsByPeerId(peerId: PeerId): Promise {\n let type: keyof State['settings']['autoDownload'];\n\n let photoSizeMax = 0, videoSizeMax = 0, fileSizeMax = 0;\n const settings = rootScope.settings;\n const appPeersManager = rootScope.managers.appPeersManager;\n if(!settings.autoDownloadNew.pFlags.disabled && peerId) {\n if(peerId.isUser()) {\n if(await appPeersManager.isContact(peerId)) {\n type = 'contacts';\n } else {\n type = 'private';\n }\n } else if(await appPeersManager.isBroadcast(peerId)) {\n type = 'channels';\n } else {\n type = 'groups';\n }\n\n if(settings.autoDownload.photo[type]) photoSizeMax = settings.autoDownloadNew.photo_size_max;\n if(settings.autoDownload.video[type]) videoSizeMax = settings.autoDownloadNew.video_size_max;\n if(settings.autoDownload.file[type]) fileSizeMax = settings.autoDownloadNew.file_size_max;\n }\n\n return {\n photo: photoSizeMax,\n video: videoSizeMax,\n file: fileSizeMax\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 {AppImManager} from '../../lib/appManagers/appImManager';\nimport ButtonIcon from '../buttonIcon';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport {IS_APPLE, IS_MOBILE} from '../../environment/userAgent';\nimport appNavigationController from '../appNavigationController';\nimport {_i18n} from '../../lib/langPack';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport isSelectionEmpty from '../../helpers/dom/isSelectionEmpty';\nimport {MarkdownType} from '../../helpers/dom/getRichElementValue';\nimport getVisibleRect from '../../helpers/dom/getVisibleRect';\nimport clamp from '../../helpers/number/clamp';\nimport matchUrl from '../../lib/richTextProcessor/matchUrl';\nimport matchUrlProtocol from '../../lib/richTextProcessor/matchUrlProtocol';\nimport hasMarkupInSelection from '../../helpers/dom/hasMarkupInSelection';\n\nexport default class MarkupTooltip {\n public container: HTMLElement;\n private wrapper: HTMLElement;\n private buttons: {[type in MarkdownType]: HTMLElement} = {} as any;\n private linkBackButton: HTMLElement;\n private linkApplyButton: HTMLButtonElement;\n private hideTimeout: number;\n private addedListener = false;\n private waitingForMouseUp = false;\n private linkInput: HTMLInputElement;\n private savedRange: Range;\n private mouseUpCounter: number = 0;\n // private log: ReturnType;\n\n constructor(private appImManager: AppImManager) {\n // this.log = logger('MARKUP');\n }\n\n private init() {\n this.container = document.createElement('div');\n this.container.classList.add('markup-tooltip', 'z-depth-1', 'hide');\n\n this.wrapper = document.createElement('div');\n this.wrapper.classList.add('markup-tooltip-wrapper');\n\n const tools1 = document.createElement('div');\n const tools2 = document.createElement('div');\n tools1.classList.add('markup-tooltip-tools');\n tools2.classList.add('markup-tooltip-tools');\n\n const arr = ['bold', 'italic', 'underline', 'strikethrough', 'monospace', 'spoiler', 'link'] as (keyof MarkupTooltip['buttons'])[];\n arr.forEach((c) => {\n const button = ButtonIcon(c, {noRipple: true});\n tools1.append(this.buttons[c] = button);\n\n if(c !== 'link') {\n button.addEventListener('mousedown', (e) => {\n cancelEvent(e);\n this.appImManager.chat.input.applyMarkdown(c);\n this.cancelClosening();\n\n /* this.mouseUpCounter = 0;\n this.setMouseUpEvent(); */\n // this.hide();\n });\n } else {\n attachClickEvent(button, (e) => {\n cancelEvent(e);\n this.showLinkEditor();\n this.cancelClosening();\n });\n }\n });\n\n this.linkBackButton = ButtonIcon('left', {noRipple: true});\n this.linkInput = document.createElement('input');\n _i18n(this.linkInput, 'MarkupTooltip.LinkPlaceholder', undefined, 'placeholder');\n this.linkInput.classList.add('input-clear');\n this.linkInput.addEventListener('keydown', (e) => {\n const valid = !this.linkInput.value.length || !!matchUrl(this.linkInput.value);// /^(http)|(https):\\/\\//i.test(this.linkInput.value);\n\n if(e.key === 'Enter') {\n if(!valid) {\n if(this.linkInput.classList.contains('error')) {\n this.linkInput.classList.remove('error');\n void this.linkInput.offsetLeft; // reflow\n }\n\n this.linkInput.classList.add('error');\n } else {\n this.applyLink(e);\n }\n }\n });\n\n this.linkInput.addEventListener('input', (e) => {\n const valid = this.isLinkValid();\n\n this.linkInput.classList.toggle('is-valid', valid);\n this.linkInput.classList.remove('error');\n });\n\n this.linkBackButton.addEventListener('mousedown', (e) => {\n // this.log('linkBackButton click');\n cancelEvent(e);\n this.container.classList.remove('is-link');\n // input.value = '';\n this.resetSelection();\n this.setTooltipPosition();\n this.cancelClosening();\n });\n\n this.linkApplyButton = ButtonIcon('check markup-tooltip-link-apply', {noRipple: true});\n this.linkApplyButton.addEventListener('mousedown', (e) => {\n // this.log('linkApplyButton click');\n this.applyLink(e);\n });\n\n const applyDiv = document.createElement('div');\n applyDiv.classList.add('markup-tooltip-link-apply-container');\n\n const delimiter1 = document.createElement('span');\n const delimiter2 = document.createElement('span');\n const delimiter3 = document.createElement('span');\n delimiter1.classList.add('markup-tooltip-delimiter');\n delimiter2.classList.add('markup-tooltip-delimiter');\n delimiter3.classList.add('markup-tooltip-delimiter');\n tools1.insertBefore(delimiter1, this.buttons.link);\n applyDiv.append(delimiter3, this.linkApplyButton);\n tools2.append(this.linkBackButton, delimiter2, this.linkInput, applyDiv);\n // tools1.insertBefore(delimiter2, this.buttons.link.nextSibling);\n\n this.wrapper.append(tools1, tools2);\n this.container.append(this.wrapper);\n document.body.append(this.container);\n\n window.addEventListener('resize', () => {\n this.hide();\n });\n }\n\n public showLinkEditor() {\n if(!this.container || !this.container.classList.contains('is-visible')) { // * if not inited yet (Ctrl+A + Ctrl+K)\n this.show();\n }\n\n const button = this.buttons.link;\n this.container.classList.add('is-link');\n\n const selection = document.getSelection();\n this.savedRange = selection.getRangeAt(0);\n\n if(button.classList.contains('active')) {\n const startContainer = this.savedRange.startContainer;\n const anchor = startContainer.parentElement as HTMLAnchorElement;\n this.linkInput.value = anchor.href;\n } else {\n this.linkInput.value = '';\n }\n\n this.setTooltipPosition(true);\n\n setTimeout(() => {\n this.linkInput.focus(); // !!! instant focus will break animation\n }, 200);\n this.linkInput.classList.toggle('is-valid', this.isLinkValid());\n }\n\n private applyLink(e: Event) {\n cancelEvent(e);\n this.resetSelection();\n let url = this.linkInput.value;\n if(url && !matchUrlProtocol(url)) {\n url = 'https://' + url;\n }\n this.appImManager.chat.input.applyMarkdown('link', url);\n setTimeout(() => {\n this.hide();\n }, 0);\n }\n\n private isLinkValid() {\n return !this.linkInput.value.length || !!matchUrl(this.linkInput.value);\n }\n\n private resetSelection(range: Range = this.savedRange) {\n const selection = window.getSelection();\n selection.removeAllRanges();\n selection.addRange(range);\n this.appImManager.chat.input.messageInput.focus();\n }\n\n public hide() {\n // return;\n\n if(this.init) return;\n\n this.container.classList.remove('is-visible');\n // document.removeEventListener('mouseup', this.onMouseUp);\n document.removeEventListener('mouseup', this.onMouseUpSingle);\n this.waitingForMouseUp = false;\n\n appNavigationController.removeByType('markup');\n\n if(this.hideTimeout) clearTimeout(this.hideTimeout);\n this.hideTimeout = window.setTimeout(() => {\n this.hideTimeout = undefined;\n this.container.classList.add('hide');\n this.container.classList.remove('is-link');\n }, 200);\n }\n\n public getActiveMarkupButton() {\n const currentMarkups: Set = new Set();\n\n // const nodes = getSelectedNodes();\n // const parents = [...new Set(nodes.map((node) => node.parentNode))];\n // // if(parents.length > 1 && parents) return [];\n\n // (parents as HTMLElement[]).forEach((node) => {\n // for(const type in markdownTags) {\n // const tag = markdownTags[type as MarkdownType];\n // const closest = node.closest(tag.match + ', [contenteditable=\"true\"]');\n // if(closest !== this.appImManager.chat.input.messageInput) {\n // currentMarkups.add(this.buttons[type as MarkdownType]);\n // }\n // }\n // });\n\n const types = Object.keys(this.buttons) as MarkdownType[];\n const markup = hasMarkupInSelection(types);\n types.forEach((type) => {\n if(markup[type]) {\n currentMarkups.add(this.buttons[type as MarkdownType]);\n }\n });\n\n return [...currentMarkups];\n }\n\n public setActiveMarkupButton() {\n const activeButtons = this.getActiveMarkupButton();\n\n for(const i in this.buttons) {\n // @ts-ignore\n const button = this.buttons[i];\n button.classList.toggle('active', activeButtons.includes(button));\n }\n }\n\n private setTooltipPosition(isLinkToggle = false) {\n const selection = document.getSelection();\n const range = selection.getRangeAt(0);\n\n const bodyRect = document.body.getBoundingClientRect();\n const selectionRect = range.getBoundingClientRect();\n const inputRect = this.appImManager.chat.input.rowsWrapper.getBoundingClientRect();\n\n this.container.style.maxWidth = inputRect.width + 'px';\n\n const visibleRect = getVisibleRect(undefined, this.appImManager.chat.input.messageInput, false, selectionRect);\n\n const selectionTop = visibleRect.rect.top/* selectionRect.top */ + (bodyRect.top * -1);\n\n const currentTools = this.container.classList.contains('is-link') ? this.wrapper.lastElementChild : this.wrapper.firstElementChild;\n\n const sizesRect = currentTools.getBoundingClientRect();\n const top = selectionTop - sizesRect.height - 8;\n\n const minX = inputRect.left;\n const maxX = (inputRect.left + inputRect.width) - Math.min(inputRect.width, sizesRect.width);\n let left: number;\n if(isLinkToggle) {\n const containerRect = this.container.getBoundingClientRect();\n left = clamp(containerRect.left, minX, maxX);\n } else {\n const x = selectionRect.left + (selectionRect.width - sizesRect.width) / 2;\n left = clamp(x, minX, maxX);\n }\n\n /* const isClamped = x !== minX && x !== maxX && (left === minX || left === maxX || this.container.getBoundingClientRect().left >= maxX);\n\n if(isLinkToggle && this.container.classList.contains('is-link') && !isClamped) return; */\n\n this.container.style.transform = `translate3d(${left}px, ${top}px, 0)`;\n }\n\n public show() {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n if(isSelectionEmpty()) {\n this.hide();\n return;\n }\n\n if(this.hideTimeout !== undefined) {\n clearTimeout(this.hideTimeout);\n }\n\n if(this.container.classList.contains('is-visible')) {\n return;\n }\n\n this.setActiveMarkupButton();\n\n this.container.classList.remove('is-link');\n const isFirstShow = this.container.classList.contains('hide');\n if(isFirstShow) {\n this.container.classList.remove('hide');\n this.container.classList.add('no-transition');\n }\n\n this.setTooltipPosition();\n\n if(isFirstShow) {\n void this.container.offsetLeft; // reflow\n this.container.classList.remove('no-transition');\n }\n\n this.container.classList.add('is-visible');\n\n if(!IS_MOBILE) {\n appNavigationController.pushItem({\n type: 'markup',\n onPop: () => {\n this.hide();\n }\n });\n }\n\n // this.log('selection', selectionRect, activeButton);\n }\n\n /* private onMouseUp = (e: Event) => {\n this.log('onMouseUp');\n if(findUpClassName(e.target, 'markup-tooltip')) return;\n\n this.hide();\n //document.removeEventListener('mouseup', this.onMouseUp);\n }; */\n\n private onMouseUpSingle = (e?: Event) => {\n // this.log('onMouseUpSingle');\n this.waitingForMouseUp = false;\n\n if(IS_TOUCH_SUPPORTED) {\n e && cancelEvent(e);\n if(this.mouseUpCounter++ === 0) {\n this.resetSelection(this.savedRange);\n } else {\n this.hide();\n return;\n }\n }\n\n this.show();\n\n /* !isTouchSupported && document.addEventListener('mouseup', this.onMouseUp); */\n };\n\n public setMouseUpEvent() {\n if(this.waitingForMouseUp) return;\n this.waitingForMouseUp = true;\n\n // this.log('setMouseUpEvent');\n\n document.addEventListener('mouseup', this.onMouseUpSingle, {once: true});\n }\n\n public cancelClosening() {\n if(IS_TOUCH_SUPPORTED && !IS_APPLE) {\n document.removeEventListener('mouseup', this.onMouseUpSingle);\n document.addEventListener('mouseup', (e) => {\n cancelEvent(e);\n this.mouseUpCounter = 1;\n this.waitingForMouseUp = false;\n this.setMouseUpEvent();\n }, {once: true});\n }\n }\n\n public handleSelection() {\n if(this.addedListener) return;\n this.addedListener = true;\n document.addEventListener('selectionchange', (e) => {\n // this.log('selectionchange');\n\n if(document.activeElement === this.linkInput) {\n return;\n }\n\n const messageInput = this.appImManager.chat.input.messageInput;\n if(document.activeElement !== messageInput) {\n this.hide();\n return;\n }\n\n const selection = document.getSelection();\n if(isSelectionEmpty(selection)) {\n this.hide();\n return;\n }\n\n if(IS_TOUCH_SUPPORTED) {\n if(IS_APPLE) {\n this.show();\n this.setTooltipPosition(); // * because can skip this in .show();\n } else {\n if(this.mouseUpCounter === 2) {\n this.mouseUpCounter = 0;\n return;\n }\n\n this.savedRange = selection.getRangeAt(0);\n this.setMouseUpEvent();\n /* document.addEventListener('touchend', (e) => {\n cancelEvent(e);\n this.resetSelection(range);\n this.show();\n }, {once: true, passive: false}); */\n }\n } else if(this.container && this.container.classList.contains('is-visible')) {\n this.setActiveMarkupButton();\n this.setTooltipPosition();\n } else if(messageInput.matches(':active')) {\n this.setMouseUpEvent();\n } else {\n this.show();\n }\n });\n\n document.addEventListener('beforeinput', (e) => {\n if(e.inputType === 'historyRedo' || e.inputType === 'historyUndo') {\n e.target.addEventListener('input', () => this.setActiveMarkupButton(), {once: true});\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 generatePathData from '../../helpers/generatePathData';\nimport {FormatterArguments, i18n, LangPackKey} from '../../lib/langPack';\n\nexport default class ChatDragAndDrop {\n container: HTMLDivElement;\n svg: SVGSVGElement;\n outlineWrapper: HTMLDivElement;\n path: SVGPathElement;\n\n constructor(appendTo: HTMLElement, private options: {\n icon?: string,\n header: LangPackKey,\n headerArgs?: FormatterArguments,\n subtitle?: LangPackKey,\n onDrop: (e: DragEvent) => void\n }) {\n this.container = document.createElement('div');\n this.container.classList.add('drop', 'z-depth-1');\n\n this.outlineWrapper = document.createElement('div');\n this.outlineWrapper.classList.add('drop-outline-wrapper');\n\n this.svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n this.svg.classList.add('drop-outline');\n\n this.path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n this.path.classList.add('drop-outline-path');\n\n let dropIcon: HTMLElement;\n if(options.icon) {\n dropIcon = document.createElement('div');\n dropIcon.classList.add('drop-icon', 'tgico-' + options.icon);\n }\n\n const dropHeader = document.createElement('div');\n dropHeader.classList.add('drop-header');\n dropHeader.append(i18n(options.header, options.headerArgs));\n\n let dropSubtitle: HTMLElement;\n if(options.subtitle) {\n dropSubtitle = document.createElement('div');\n dropSubtitle.classList.add('drop-subtitle');\n dropSubtitle.append(i18n(options.subtitle));\n }\n\n this.svg.append(this.path);\n this.outlineWrapper.append(this.svg);\n\n this.container.append(...[this.outlineWrapper, dropIcon, dropHeader, dropSubtitle].filter(Boolean));\n appendTo.append(this.container);\n\n this.container.addEventListener('dragover', this.onDragOver);\n this.container.addEventListener('dragleave', this.onDragLeave);\n this.container.addEventListener('drop', this.onDrop);\n }\n\n onDragOver = (e: DragEvent) => {\n this.container.classList.add('is-dragover');\n // SetTransition(this.container, 'is-dragover', true, 500);\n };\n\n onDragLeave = (e: DragEvent) => {\n this.container.classList.remove('is-dragover');\n // SetTransition(this.container, 'is-dragover', false, 500);\n };\n\n onDrop = (e: DragEvent) => {\n this.options.onDrop(e);\n };\n\n destroy() {\n delete this.options;\n this.container.remove();\n this.container.removeEventListener('dragover', this.onDragOver);\n this.container.removeEventListener('dragleave', this.onDragLeave);\n this.container.removeEventListener('drop', this.onDrop);\n }\n\n setPath() {\n const rect = this.outlineWrapper.getBoundingClientRect();\n this.svg.setAttributeNS(null, 'preserveAspectRatio', 'none');\n this.svg.setAttributeNS(null, 'viewBox', `0 0 ${rect.width} ${rect.height}`);\n this.svg.setAttributeNS(null, 'width', `${rect.width}`);\n this.svg.setAttributeNS(null, 'height', `${rect.height}`);\n\n const radius = 10;\n // const strokeWidth = 2;\n const sizeX = rect.width - radius;\n const sizeY = rect.height - radius;\n const pos = radius / 2;\n const d = generatePathData(pos, pos, sizeX, sizeY, radius, radius, radius, radius);\n this.path.setAttributeNS(null, 'd', d);\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 {doubleRaf} from '../schedulers';\n\nexport default function disableTransition(elements: HTMLElement[]) {\n elements.forEach((el) => el.classList.add('no-transition'));\n\n doubleRaf().then(() => {\n elements.forEach((el) => el.classList.remove('no-transition'));\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 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 noop from '../../helpers/noop';\nimport safeAssign from '../../helpers/object/safeAssign';\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/safeAssign';\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) 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 || !this.getColor) {\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 {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 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';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport toggleClassName from '../../helpers/toggleClassName';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport themeController from '../../helpers/themeController';\nimport groupCallsController from '../../lib/calls/groupCallsController';\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 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 const color: RLottieColor = 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 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() {\n super('popup-group-call', {\n body: true,\n withoutOverlay: true,\n closable: true,\n title: true\n });\n\n this.videosCount = 0;\n this.container.classList.add(className, 'night');\n\n const instance = this.instance = groupCallsController.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 managers: this.managers\n });\n this.groupCallParticipants = new GroupCallParticipantsElement({\n appendTo: this.body,\n instance,\n listenerSetter,\n managers: this.managers\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 toggleDisability = toggleClassName.bind(null, 'btn-disabled');\n\n private onVideoClick = () => {\n const toggle = this.toggleDisability([this.btnVideo], true);\n this.instance.toggleVideoSharing().finally(() => {\n toggle();\n });\n };\n\n private onScreenClick = () => {\n const toggle = this.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 = async() => {\n const hangUp = (discard: boolean) => {\n this.instance.hangUp(discard);\n };\n\n if(await this.managers.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.checkAnimations2(isFull);\n\n themeController.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 {GROUP_CALL_PARTICIPANT_MUTED_STATE} from '.';\nimport {GroupCallParticipantVideoType} from './participantVideo';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\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, 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 appDialogsManager, {DialogDom, AppDialogsManager, DialogElementSize} from '../../lib/appManagers/appDialogsManager';\nimport {getGroupCallParticipantMutedState} from '.';\nimport GroupCallParticipantMutedIcon from './participantMutedIcon';\nimport GroupCallParticipantStatusElement from './participantStatus';\nimport type GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport type LazyLoadQueue from '../lazyLoadQueue';\n\ninterface SortedParticipant extends SortedElementBase {\n dom: DialogDom,\n mutedIcon: GroupCallParticipantMutedIcon,\n status: GroupCallParticipantStatusElement\n}\n\nexport default class GroupCallParticipantsList extends SortedList {\n public list: HTMLUListElement;\n\n protected lazyLoadQueue: LazyLoadQueue;\n protected avatarSize: DialogElementSize = 'abitbigger';\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: async(element) => (await this.instance.getParticipantByPeerId(element.id)).date,\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onElementDestroy(element);\n },\n onUpdate: async(element) => {\n const participant = await this.instance.getParticipantByPeerId(element.id);\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 peerId: base.id,\n container: false,\n avatarSize: this.avatarSize,\n autonomous: this.autonomous,\n meAsSaved: false,\n rippleEnabled: this.rippleEnabled,\n wrapOptions: {\n lazyLoadQueue: this.lazyLoadQueue\n }\n });\n\n const className = 'group-call-participant';\n dom.listEl.classList.add(className);\n\n const mutedIcon = new GroupCallParticipantMutedIcon(true);\n const status = new GroupCallParticipantStatusElement(['presentation', 'video']);\n replaceContent(dom.lastMessageSpan, status.container);\n dom.listEl.append(mutedIcon.container);\n (base as SortedParticipant).mutedIcon = mutedIcon;\n (base as SortedParticipant).status = status;\n\n /* instance.getParticipantByPeerId(base.id).then((participant) => {\n const mutedState = getGroupCallParticipantMutedState(participant);\n\n mutedIcon.setState(mutedState);\n status.setState(mutedState, participant);\n }); */\n\n (base as SortedParticipant).dom = dom;\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 {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', {alpha: false});\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","/*\n * 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 {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';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport {AppManagers} from '../../lib/appManagers/managers';\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 managers: AppManagers, 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: 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 {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/safeAssign';\nimport {GroupCallParticipant} from '../../layer';\nimport {GroupCallOutputSource} from '../../lib/appManagers/appGroupCallsManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\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 participantsElements: Map>;\n private displayPinned: boolean;\n private containers: Map;\n private onLengthChange: (length: number) => void;\n private managers: AppManagers;\n\n constructor(options: {\n appendTo: HTMLElement,\n instance: GroupCallInstance,\n listenerSetter: ListenerSetter,\n displayPinned: boolean,\n onLengthChange?: GroupCallParticipantsVideoElement['onLengthChange'],\n managers: AppManagers\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 = 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.managers, 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 async setInstance(instance: GroupCallInstance) {\n (await 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 filterAsync from '../../helpers/array/filterAsync';\nimport contextMenuController from '../../helpers/contextMenuController';\nimport {attachContextMenuListener} from '../../helpers/dom/attachContextMenuListener';\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/safeAssign';\nimport positionMenu from '../../helpers/positionMenu';\nimport ScrollableLoader from '../../helpers/scrollableLoader';\nimport {GroupCallParticipant} from '../../layer';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport rootScope from '../../lib/rootScope';\nimport {ButtonMenuItemOptions, ButtonMenuSync} from '../buttonMenu';\nimport confirmationPopup from '../confirmationPopup';\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 | Promise})[];\n private element: HTMLElement;\n private chatId: ChatId;\n private targetPeerId: PeerId;\n private participant: GroupCallParticipant;\n private instance: GroupCallInstance;\n private canManageCall: boolean;\n private managers: AppManagers;\n\n constructor(options: {\n listenerSetter: ListenerSetter,\n onContextElement: HTMLElement,\n managers: AppManagers,\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.managers.appChatsManager.hasRights(this.chatId, 'ban_users'),\n onClick: async() => {\n confirmationPopup({\n peerId: this.targetPeerId,\n title: new PeerTitle({peerId: this.targetPeerId}).element,\n descriptionLangKey: await this.managers.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.managers.appChatsManager.kickFromChat(this.chatId, this.targetPeerId);\n }, noop);\n }\n }];\n\n const {listenerSetter} = options;\n this.managers = options.managers;\n this.instance = options.instance;\n this.chatId = this.instance.chatId;\n\n this.element = ButtonMenuSync({buttons: this.buttons, listenerSetter});\n this.element.classList.add('group-call-participant-menu', 'night');\n\n attachContextMenuListener({\n element: options.onContextElement,\n callback: async(e) => {\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 cancelEvent(e);\n\n const peerId = this.targetPeerId = li.dataset.peerId.toPeerId();\n this.participant = await this.instance.getParticipantByPeerId(peerId);\n if(this.participant.pFlags.self) {\n return;\n }\n\n this.canManageCall = await this.managers.appChatsManager.hasRights(this.chatId, 'manage_call');\n\n await filterAsync(this.buttons, async(button) => {\n const good = await button.verify(peerId);\n button.element.classList.toggle('hide', !good);\n return good;\n });\n\n positionMenu((e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent, this.element, 'right');\n contextMenuController.openBtnMenu(this.element);\n },\n listenerSetter\n });\n\n listenerSetter.add(rootScope)('group_call_participant', ({groupCallId, participant}) => {\n if(this.instance.id === groupCallId) {\n const peerId = getPeerId(participant.peer);\n if(this.targetPeerId === peerId) {\n contextMenuController.close();\n }\n }\n });\n\n let appendTo: HTMLElement = document.body;\n addFullScreenListener(document.body, () => {\n const isFull = isFullScreen();\n appendTo = isFull ? PopupElement.getPopups(PopupGroupCall)[0].getContainer(): document.body;\n\n if(!isFull) {\n contextMenuController.close();\n }\n }, listenerSetter);\n }\n\n private onOpenProfileClick = () => {\n const popup = PopupElement.getPopups(PopupGroupCall)[0];\n if(popup) {\n popup.hide();\n }\n\n appImManager.setInnerPeer({peerId: this.targetPeerId});\n };\n\n private toggleParticipantMuted = (muted: boolean) => {\n this.instance.editParticipant(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 listenerSetter: ListenerSetter;\n private groupCallParticipantsVideo: GroupCallParticipantsVideoElement;\n private contextMenu: GroupCallParticipantContextMenu;\n private managers: AppManagers;\n\n constructor(options: {\n appendTo: HTMLElement,\n instance: GroupCallInstance,\n listenerSetter: ListenerSetter,\n managers: AppManagers\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.managers.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 = 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 async 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 const participants = await instance.participants;\n 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 wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\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, wrapEmojiText(groupCall.title));\n } else {\n if(peerTitle.options.peerId !== peerId) {\n peerTitle.options.peerId = peerId;\n peerTitle.update();\n }\n\n if(peerTitle.element.parentElement !== appendTo) {\n appendTo.append(peerTitle.element);\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 {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 EventListenerBase from '../helpers/eventListenerBase';\nimport mediaSizes from '../helpers/mediaSizes';\nimport clamp from '../helpers/number/clamp';\nimport safeAssign from '../helpers/object/safeAssign';\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: SwipeHandler['verifyTouchTarget'];\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 // 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/safeAssign';\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\nexport default function toggleClassName(className: string, elements: HTMLElement[], disable: boolean) {\n elements.forEach((element) => {\n element.classList.toggle(className, disable);\n });\n\n return () => toggleClassName(className, elements, !disable);\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 toHHMMSS from '../../helpers/string/toHHMMSS';\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 = toHHMMSS(instance.duration, 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 this.container.classList.toggle('has-duration', connectionState === CALL_STATE.CONNECTED);\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 IS_SCREEN_SHARING_SUPPORTED from '../../environment/screenSharingSupport';\nimport {IS_MOBILE} from '../../environment/userAgent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport ControlsHover from '../../helpers/dom/controlsHover';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport {addFullScreenListener, cancelFullScreen, isFullScreen, requestFullScreen} from '../../helpers/dom/fullScreen';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport MovablePanel from '../../helpers/movablePanel';\nimport onMediaLoad from '../../helpers/onMediaLoad';\nimport themeController from '../../helpers/themeController';\nimport toggleClassName from '../../helpers/toggleClassName';\nimport CallInstance from '../../lib/calls/callInstance';\nimport CALL_STATE from '../../lib/calls/callState';\nimport I18n, {i18n} from '../../lib/langPack';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport animationIntersector from '../animationIntersector';\nimport AvatarElement from '../avatar';\nimport ButtonIcon from '../buttonIcon';\nimport GroupCallMicrophoneIconMini from '../groupCall/microphoneIconMini';\nimport {MovableState} from '../movableElement';\nimport PeerTitle from '../peerTitle';\nimport PopupElement from '../popups';\nimport SetTransition from '../singleTransition';\nimport makeButton from './button';\nimport CallDescriptionElement from './description';\nimport callVideoCanvasBlur from './videoCanvasBlur';\n\nconst className = 'call';\n\nconst MIN_WIDTH = 400;\nconst MIN_HEIGHT = 580;\n\nconst INIT_STATE: MovableState = {\n width: MIN_WIDTH,\n height: MIN_HEIGHT\n};\n\nlet previousState: MovableState = {...INIT_STATE};\n\nexport default class PopupCall extends PopupElement {\n private peerId: PeerId;\n\n private description: CallDescriptionElement;\n private emojisSubtitle: HTMLElement;\n\n private partyStates: HTMLElement;\n private partyMutedState: HTMLElement;\n\n private firstButtonsRow: HTMLElement;\n private secondButtonsRow: HTMLElement;\n\n private declineI18nElement: I18n.IntlElement;\n\n private makeButton: (options: Parameters[2]) => HTMLElement;\n private btnAccept: HTMLElement;\n private btnDecline: HTMLElement;\n private btnVideo: HTMLElement;\n private btnScreen: HTMLElement;\n private btnMute: HTMLElement;\n private btnFullScreen: HTMLButtonElement;\n private btnExitFullScreen: HTMLButtonElement;\n\n private movablePanel: MovablePanel;\n private microphoneIcon: GroupCallMicrophoneIconMini;\n private muteI18nElement: I18n.IntlElement;\n\n private videoContainers: {\n input?: HTMLElement,\n output?: HTMLElement\n };\n\n private controlsHover: ControlsHover;\n\n constructor(private instance: CallInstance) {\n super('popup-call', {\n withoutOverlay: true,\n closable: true\n });\n\n this.videoContainers = {};\n\n const {container, listenerSetter} = this;\n container.classList.add(className, 'night');\n\n const avatarContainer = document.createElement('div');\n avatarContainer.classList.add(className + '-avatar');\n\n const peerId = this.peerId = this.instance.interlocutorUserId.toPeerId();\n const avatar = new AvatarElement();\n avatar.classList.add('avatar-full');\n avatar.updateWithOptions({\n isBig: true,\n peerId: peerId\n });\n avatarContainer.append(avatar);\n\n const title = new PeerTitle({\n peerId\n }).element;\n\n title.classList.add(className + '-title');\n\n const subtitle = document.createElement('div');\n subtitle.classList.add(className + '-subtitle');\n\n const description = this.description = new CallDescriptionElement(subtitle);\n\n const emojisSubtitle = this.emojisSubtitle = document.createElement('div');\n emojisSubtitle.classList.add(className + '-emojis');\n\n container.append(avatarContainer, title, subtitle);\n\n if(!IS_MOBILE) {\n this.btnFullScreen = ButtonIcon('fullscreen');\n this.btnExitFullScreen = ButtonIcon('smallscreen hide');\n attachClickEvent(this.btnFullScreen, this.onFullScreenClick, {listenerSetter});\n attachClickEvent(this.btnExitFullScreen, () => cancelFullScreen(), {listenerSetter});\n addFullScreenListener(this.container, this.onFullScreenChange, listenerSetter);\n this.header.prepend(this.btnExitFullScreen);\n this.header.append(this.btnFullScreen);\n\n container.append(emojisSubtitle);\n } else {\n this.header.append(emojisSubtitle);\n }\n\n this.partyStates = document.createElement('div');\n this.partyStates.classList.add(className + '-party-states');\n\n this.partyMutedState = document.createElement('div');\n this.partyMutedState.classList.add(className + '-party-state');\n const stateText = i18n('VoipUserMicrophoneIsOff', [new PeerTitle({peerId, onlyFirstName: true, limitSymbols: 18}).element]);\n stateText.classList.add(className + '-party-state-text');\n const mutedIcon = new GroupCallMicrophoneIconMini(false, true);\n mutedIcon.setState(false, false);\n this.partyMutedState.append(\n mutedIcon.container,\n stateText\n );\n\n this.partyStates.append(this.partyMutedState);\n this.container.append(this.partyStates);\n\n this.makeButton = makeButton.bind(null, className, this.listenerSetter);\n this.constructFirstButtons();\n this.constructSecondButtons();\n\n listenerSetter.add(instance)('state', () => {\n this.updateInstance();\n });\n\n listenerSetter.add(instance)('mediaState', () => {\n this.updateInstance();\n });\n\n this.movablePanel = new MovablePanel({\n listenerSetter,\n movableOptions: {\n minWidth: MIN_WIDTH,\n minHeight: MIN_HEIGHT,\n element: this.element,\n verifyTouchTarget: (e) => {\n const target = e.target;\n if(findUpClassName(target, 'call-button') ||\n findUpClassName(target, 'btn-icon') ||\n isFullScreen()) {\n return false;\n }\n\n return true;\n }\n },\n // onResize: () => this.toggleBigLayout(),\n previousState: !this.instance.wasTryingToJoin && !this.instance.isOutgoing ? {...INIT_STATE} : previousState\n });\n\n const movableElement = this.movablePanel.movable;\n if(movableElement) {\n this.listenerSetter.add(movableElement)('resize', () => {\n this.resizeVideoContainers();\n });\n }\n\n const controlsHover = this.controlsHover = new ControlsHover();\n controlsHover.setup({\n element: this.container,\n listenerSetter: this.listenerSetter,\n showOnLeaveToClassName: 'call-buttons'\n });\n controlsHover.showControls(false);\n\n this.addEventListener('close', () => {\n const {movablePanel} = this;\n previousState = movablePanel.state;\n\n this.microphoneIcon.destroy();\n\n movablePanel.destroy();\n });\n\n this.updateInstance();\n }\n\n public getCallInstance() {\n return this.instance;\n }\n\n private constructFirstButtons() {\n const buttons = this.firstButtonsRow = document.createElement('div');\n buttons.classList.add(className + '-buttons', 'is-first');\n\n const toggleDisability = toggleClassName.bind(null, 'btn-disabled');\n\n const btnVideo = this.btnVideo = this.makeButton({\n text: 'Call.Camera',\n icon: 'videocamera_filled',\n callback: () => {\n const toggle = toggleDisability([btnVideo, btnScreen], true);\n this.instance.toggleVideoSharing().finally(toggle);\n }\n });\n\n const btnScreen = this.btnScreen = this.makeButton({\n text: 'Call.Screen',\n icon: 'sharescreen_filled',\n callback: () => {\n const toggle = toggleDisability([btnVideo, btnScreen], true);\n this.instance.toggleScreenSharing().finally(toggle);\n }\n });\n\n if(!IS_SCREEN_SHARING_SUPPORTED) {\n btnScreen.classList.add('hide');\n this.container.classList.add('no-screen');\n }\n\n this.muteI18nElement = new I18n.IntlElement({\n key: 'Call.Mute'\n });\n const btnMute = this.btnMute = this.makeButton({\n text: this.muteI18nElement.element,\n callback: () => {\n this.instance.toggleMuted();\n }\n });\n\n const microphoneIcon = this.microphoneIcon = new GroupCallMicrophoneIconMini(true, true);\n btnMute.firstElementChild.append(microphoneIcon.container);\n\n // btnVideo.classList.add('disabled');\n // btnScreen.classList.add('disabled');\n\n buttons.append(btnVideo, btnScreen, btnMute);\n this.container.append(buttons);\n }\n\n private constructSecondButtons() {\n const buttons = this.secondButtonsRow = document.createElement('div');\n buttons.classList.add(className + '-buttons', 'is-second');\n\n this.declineI18nElement = new I18n.IntlElement({\n key: 'Call.Decline'\n });\n const btnDecline = this.btnDecline = this.makeButton({\n text: this.declineI18nElement.element,\n icon: 'endcall_filled',\n callback: () => {\n this.instance.hangUp('phoneCallDiscardReasonHangup');\n },\n isDanger: true\n });\n\n const btnAccept = this.btnAccept = this.makeButton({\n text: 'Call.Accept',\n icon: 'phone_filled',\n callback: () => {\n this.instance.acceptCall();\n },\n isConfirm: true\n });\n\n buttons.append(btnDecline, btnAccept);\n this.container.append(buttons);\n }\n\n private onFullScreenClick = () => {\n requestFullScreen(this.container);\n };\n\n private onFullScreenChange = () => {\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 themeController.setThemeColor(isFull ? '#000000' : undefined);\n\n this.resizeVideoContainers();\n }\n };\n\n private createVideoContainer(video: HTMLVideoElement) {\n const _className = className + '-video';\n const container = document.createElement('div');\n container.classList.add(_className + '-container');\n\n video.classList.add(_className);\n if(video.paused) {\n video.play();\n }\n\n attachClickEvent(container, () => {\n if(!container.classList.contains('small')) {\n return;\n }\n\n const big = Object.values(this.videoContainers).find((container) => !container.classList.contains('small'));\n big.classList.add('small');\n big.style.cssText = container.style.cssText;\n container.classList.remove('small');\n container.style.cssText = '';\n\n this.resizeVideoContainers();\n });\n\n const canvas = callVideoCanvasBlur(video);\n canvas.classList.add(_className + '-blur');\n\n container.append(canvas, video);\n\n return container;\n }\n\n private updateInstance() {\n const {instance} = this;\n const {connectionState} = instance;\n if(connectionState === CALL_STATE.CLOSED) {\n if(this.container.classList.contains('is-full-screen')) {\n cancelFullScreen();\n }\n\n this.btnVideo.classList.add('disabled');\n\n this.hide();\n return;\n }\n\n const isPendingIncoming = !instance.isOutgoing && connectionState === CALL_STATE.PENDING;\n this.declineI18nElement.compareAndUpdate({\n key: connectionState === CALL_STATE.PENDING ? 'Call.Decline' : 'Call.End'\n });\n this.btnAccept.classList.toggle('disable', !isPendingIncoming);\n this.btnAccept.classList.toggle('hide-me', !isPendingIncoming);\n this.container.classList.toggle('two-button-rows', isPendingIncoming);\n\n const isMuted = instance.isMuted;\n const onFrame = () => {\n this.btnMute.firstElementChild.classList.toggle('active', isMuted);\n };\n\n const player = this.microphoneIcon.getItem().player;\n this.microphoneIcon.setState(!isMuted, !isMuted, onFrame);\n if(!player) {\n onFrame();\n }\n\n this.muteI18nElement.compareAndUpdate({\n key: isMuted ? 'VoipUnmute' : 'Call.Mute'\n });\n\n const isSharingVideo = instance.isSharingVideo;\n this.btnVideo.firstElementChild.classList.toggle('active', isSharingVideo);\n\n const isSharingScreen = instance.isSharingScreen;\n this.btnScreen.firstElementChild.classList.toggle('active', isSharingScreen);\n\n const outputState = instance.getMediaState('output');\n\n SetTransition({\n element: this.partyMutedState,\n className: 'is-visible',\n forwards: !!outputState?.muted,\n duration: 300\n });\n\n const containers = this.videoContainers;\n const oldContainers = {...containers};\n ['input' as const, 'output' as const].forEach((type) => {\n const mediaState = instance.getMediaState(type);\n const video = instance.getVideoElement(type) as HTMLVideoElement;\n\n const hasFrame = !!(video && video.videoWidth && video.videoHeight);\n if(video && !hasFrame && !video.dataset.hasPromise) {\n video.dataset.hasPromise = '1';\n // container.classList.add('hide');\n onMediaLoad(video).then(() => {\n delete video.dataset.hasPromise;\n this.updateInstance();\n // this.resizeVideoContainers();\n // container.classList.remove('hide');\n });\n }\n\n const isActive = !!video && hasFrame && !!(mediaState && (mediaState.videoState === 'active' || mediaState.screencastState === 'active'));\n let videoContainer = containers[type];\n\n if(isActive && video && !videoContainer) {\n videoContainer = containers[type] = this.createVideoContainer(video);\n this.container.append(videoContainer);\n }\n\n if(!isActive && videoContainer) {\n videoContainer.remove();\n delete containers[type];\n }\n });\n\n {\n const input = containers.input;\n const output = containers.output;\n if(Object.keys(oldContainers).length !== Object.keys(containers).length && input) {\n input.classList.toggle('small', !!output);\n }\n\n if(output && !input) {\n output.classList.remove('small');\n }\n }\n\n this.resizeVideoContainers();\n\n this.container.classList.toggle('no-video', !Object.keys(containers).length);\n\n if(!this.emojisSubtitle.textContent && connectionState < CALL_STATE.EXCHANGING_KEYS) {\n Promise.resolve(instance.getEmojisFingerprint()).then((emojis) => {\n replaceContent(this.emojisSubtitle, wrapEmojiText(emojis.join('')));\n });\n }\n\n this.setDescription();\n }\n\n private resizeVideoContainers() {\n Object.values(this.videoContainers).forEach((container) => {\n const isSmall = container.classList.contains('small');\n if(isSmall) {\n const video = container.querySelector('video');\n const popupWidth = this.movablePanel.state;\n const MAX_WIDTH_PX = 240;\n const MAX_HEIGHT_PX = 240;\n\n const isVertical = video.videoHeight > video.videoWidth;\n const MAX_SIZE = isVertical ? MAX_HEIGHT_PX : MAX_WIDTH_PX;\n\n const biggestSideSize = 1 / 3 * (isFullScreen() ? 0xFFFF : (isVertical ? popupWidth.height : popupWidth.width));\n const widthRatio = isVertical ? video.videoWidth / video.videoHeight : 1;\n const heightRatio = isVertical ? 1 : video.videoHeight / video.videoWidth;\n container.style.width = biggestSideSize * widthRatio + 'px';\n container.style.height = biggestSideSize * heightRatio + 'px';\n container.style.maxWidth = MAX_SIZE * widthRatio + 'px';\n container.style.maxHeight = MAX_SIZE * heightRatio + 'px';\n } else {\n container.style.cssText = '';\n }\n });\n }\n\n private setDescription() {\n this.description.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 cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport ListenerSetter from '../helpers/listenerSetter';\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 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';\nimport PopupCall from './call';\nimport GroupCallMicrophoneIconMini from './groupCall/microphoneIconMini';\nimport CallInstance from '../lib/calls/callInstance';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport groupCallsController from '../lib/calls/groupCallsController';\nimport StreamManager from '../lib/calls/streamManager';\nimport callsController from '../lib/calls/callsController';\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 managers: AppManagers\n ) {\n const listenerSetter = this.listenerSetter = new ListenerSetter();\n\n listenerSetter.add(callsController)('instance', ({instance}) => {\n if(!this.instance) {\n this.updateInstance(instance);\n }\n });\n\n listenerSetter.add(callsController)('accepting', (instance) => {\n if(this.instance !== instance) {\n this.updateInstance(instance);\n }\n });\n\n listenerSetter.add(groupCallsController)('instance', (instance) => {\n this.updateInstance(instance);\n });\n\n listenerSetter.add(rootScope)('group_call_update', (groupCall) => {\n const instance = groupCallsController.groupCall;\n if(instance?.id === groupCall.id) {\n this.updateInstance(instance);\n }\n });\n\n listenerSetter.add(StreamManager.ANALYSER_LISTENER)('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 const isChangingInstance = this.instance !== instance;\n if(isChangingInstance) {\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 this.container.classList.toggle('is-call', !(instance instanceof GroupCallInstance));\n }\n\n const isMuted = this.instance.isMuted;\n const 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') || isChangingInstance) || isClosed) {\n if(isClosed) {\n weave.setAmplitude(0);\n }\n\n SetTransition({\n element: document.body,\n className: 'is-calling',\n forwards: !isClosed,\n duration: 250,\n onTransitionEnd: isClosed ? () => {\n weave.componentWillUnmount();\n\n this.clearCurrentInstance();\n } : undefined\n });\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.getPopups(PopupGroupCall).length) {\n return;\n }\n\n new PopupGroupCall().show();\n } else if(this.instance instanceof CallInstance) {\n const popups = PopupElement.getPopups(PopupCall);\n if(popups.find((popup) => popup.getCallInstance() === this.instance)) {\n return;\n }\n\n new PopupCall(this.instance).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\nimport type {PushNotificationObject} from '../serviceWorker/push';\nimport getPeerTitle from '../../components/wrappers/getPeerTitle';\nimport wrapMessageForReply from '../../components/wrappers/messageForReply';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {FontFamily} from '../../config/font';\nimport {NOTIFICATION_BADGE_PATH, NOTIFICATION_ICON_PATH} from '../../config/notifications';\nimport {IS_MOBILE} from '../../environment/userAgent';\nimport IS_VIBRATE_SUPPORTED from '../../environment/vibrateSupport';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport drawCircle from '../../helpers/canvas/drawCircle';\nimport customProperties from '../../helpers/dom/customProperties';\nimport idleController from '../../helpers/idleController';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport tsNow from '../../helpers/tsNow';\nimport {Message, MessagePeerReaction, PeerNotifySettings} from '../../layer';\nimport I18n, {FormatterArguments, LangPackKey} from '../langPack';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport singleInstance from '../mtproto/singleInstance';\nimport webPushApiManager, {PushSubscriptionNotify} from '../mtproto/webPushApiManager';\nimport fixEmoji from '../richTextProcessor/fixEmoji';\nimport getAbbreviation from '../richTextProcessor/getAbbreviation';\nimport wrapPlainText from '../richTextProcessor/wrapPlainText';\nimport rootScope from '../rootScope';\nimport appImManager from './appImManager';\nimport appRuntimeManager from './appRuntimeManager';\nimport {AppManagers} from './managers';\nimport generateMessageId from './utils/messageId/generateMessageId';\nimport getMessageThreadId from './utils/messages/getMessageThreadId';\nimport getPeerColorById from './utils/peers/getPeerColorById';\nimport getPeerId from './utils/peers/getPeerId';\nimport {logger} from '../logger';\n\ntype MyNotification = Notification & {\n hidden?: boolean,\n show?: () => void,\n};\n\nexport type NotifyOptions = Partial<{\n tag: string;\n image: string;\n key: string;\n title: string;\n message: string;\n silent: boolean;\n onclick: () => void;\n noIncrement: boolean;\n}>;\n\nexport type NotificationSettings = {\n nodesktop: boolean,\n volume: number,\n novibrate: boolean,\n nopreview: boolean,\n nopush: boolean,\n nosound: boolean\n};\n\nexport class UiNotificationsManager {\n private notificationsUiSupport: boolean;\n private notificationsShown: {[key: string]: MyNotification | true} = {};\n private notificationIndex = 0;\n private notificationsCount = 0;\n private soundsPlayed: {[tag: string]: number} = {};\n private vibrateSupport = IS_VIBRATE_SUPPORTED;\n private nextSoundAt: number;\n private prevSoundVolume: number;\n\n private faviconElements = Array.from(document.head.querySelectorAll('link[rel=\"icon\"], link[rel=\"alternate icon\"]'));\n\n private titleBackup = document.title;\n private titleChanged = false;\n private titleInterval: number;\n private prevFavicon: string;\n\n private notifySoundEl: HTMLElement;\n\n private stopped = false;\n\n private topMessagesDeferred: CancellablePromise;\n\n private settings: NotificationSettings = {} as any;\n\n private registeredDevice: any;\n private pushInited = false;\n\n private managers: AppManagers;\n private setAppBadge: (contents?: any) => Promise;\n\n private avatarCanvas: HTMLCanvasElement;\n private avatarContext: CanvasRenderingContext2D;\n private avatarGradients: {[color: string]: CanvasGradient};\n\n private log: ReturnType;\n\n construct(managers: AppManagers) {\n this.managers = managers;\n\n this.log = logger('NOTIFICATIONS');\n\n navigator.vibrate = navigator.vibrate || (navigator as any).mozVibrate || (navigator as any).webkitVibrate;\n this.setAppBadge = (navigator as any).setAppBadge && (navigator as any).setAppBadge.bind(navigator);\n this.setAppBadge && this.setAppBadge(0);\n\n this.notificationsUiSupport = ('Notification' in window) || ('mozNotification' in navigator);\n\n this.notifySoundEl = document.createElement('div');\n this.notifySoundEl.id = 'notify-sound';\n document.body.append(this.notifySoundEl);\n\n this.topMessagesDeferred = deferredPromise();\n\n singleInstance.addEventListener('deactivated', () => {\n this.stop();\n });\n\n singleInstance.addEventListener('activated', () => {\n if(this.stopped) {\n this.start();\n }\n });\n\n idleController.addEventListener('change', (idle) => {\n if(this.stopped) {\n return;\n }\n\n if(!idle) {\n this.clear();\n }\n\n this.toggleToggler();\n });\n\n rootScope.addEventListener('notification_reset', (peerString) => {\n this.soundReset(peerString);\n });\n\n rootScope.addEventListener('notification_cancel', (str) => {\n this.cancel(str);\n });\n\n if(this.setAppBadge) {\n rootScope.addEventListener('folder_unread', (folder) => {\n if(folder.id === 0) {\n this.setAppBadge(folder.unreadUnmutedPeerIds.size);\n }\n });\n }\n\n webPushApiManager.addEventListener('push_init', (tokenData) => {\n this.pushInited = true;\n if(!this.settings.nodesktop && !this.settings.nopush) {\n if(tokenData) {\n this.registerDevice(tokenData);\n } else {\n webPushApiManager.subscribe();\n }\n } else {\n this.unregisterDevice(tokenData);\n }\n });\n webPushApiManager.addEventListener('push_subscribe', (tokenData) => {\n this.registerDevice(tokenData);\n });\n webPushApiManager.addEventListener('push_unsubscribe', (tokenData) => {\n this.unregisterDevice(tokenData);\n });\n\n rootScope.addEventListener('dialogs_multiupdate', () => {\n // unregisterTopMsgs()\n this.topMessagesDeferred.resolve();\n }, {once: true});\n\n webPushApiManager.addEventListener('push_notification_click', (notificationData) => {\n if(notificationData.action === 'push_settings') {\n /* this.topMessagesDeferred.then(() => {\n $modal.open({\n templateUrl: templateUrl('settings_modal'),\n controller: 'SettingsModalController',\n windowClass: 'settings_modal_window mobile_modal',\n backdrop: 'single'\n })\n }); */\n return;\n }\n\n if(notificationData.action === 'mute1d') {\n this.managers.apiManager.invokeApi('account.updateDeviceLocked', {\n period: 86400\n }).then(() => {\n // var toastData = toaster.pop({\n // type: 'info',\n // body: _('push_action_mute1d_success'),\n // bodyOutputType: 'trustedHtml',\n // clickHandler: () => {\n // toaster.clear(toastData)\n // },\n // showCloseButton: false\n // })\n });\n\n return;\n }\n\n const peerId = notificationData.custom && notificationData.custom.peerId.toPeerId();\n console.log('click', notificationData, peerId);\n if(peerId) {\n this.topMessagesDeferred.then(async() => {\n const chatId = peerId.isAnyChat() ? peerId.toChatId() : undefined;\n if(chatId && !(await this.managers.appChatsManager.hasChat(chatId))) {\n return;\n }\n\n if(peerId.isUser() && !(await this.managers.appUsersManager.hasUser(peerId.toUserId()))) {\n return;\n }\n\n appImManager.setInnerPeer({\n peerId,\n lastMsgId: generateMessageId(+notificationData.custom.msg_id)\n });\n });\n }\n });\n }\n\n public async buildNotification({\n message,\n fwdCount,\n peerReaction,\n peerTypeNotifySettings\n }: {\n message: Message.message | Message.messageService,\n fwdCount?: number,\n peerReaction?: MessagePeerReaction,\n peerTypeNotifySettings?: PeerNotifySettings\n }) {\n const peerId = message.peerId;\n const isAnyChat = peerId.isAnyChat();\n const notification: NotifyOptions = {};\n const [peerString, isForum = false] = await Promise.all([\n this.managers.appPeersManager.getPeerString(peerId),\n isAnyChat && this.managers.appPeersManager.isForum(peerId)\n ]);\n let notificationMessage: string;\n let wrappedMessage = false;\n\n if(peerTypeNotifySettings.show_previews) {\n if(message._ === 'message' && message.fwd_from && fwdCount > 1) {\n notificationMessage = I18n.format('Notifications.Forwarded', true, [fwdCount]);\n } else {\n notificationMessage = await wrapMessageForReply({message, plain: true});\n\n const reaction = peerReaction?.reaction;\n if(reaction?._ === 'reactionEmoji') {\n const langPackKey: LangPackKey = /* isAnyChat ? 'Notification.Group.Reacted' : */'Notification.Contact.Reacted';\n const args: FormatterArguments = [\n fixEmoji(reaction.emoticon), // can be plain heart\n notificationMessage\n ];\n\n /* if(isAnyChat) {\n args.unshift(appPeersManager.getPeerTitle(message.fromId, true));\n } */\n\n notificationMessage = I18n.format(langPackKey, true, args);\n } else {\n wrappedMessage = true;\n }\n }\n } else {\n notificationMessage = I18n.format('Notifications.New', true);\n }\n\n if(peerReaction) {\n notification.noIncrement = true;\n notification.silent = true;\n }\n\n const peerTitleOptions/* : Partial[0]> */ = {\n plainText: true as const,\n managers: this.managers\n };\n\n const threadId = isForum ? getMessageThreadId(message, isForum) : undefined;\n const notificationFromPeerId = peerReaction ? getPeerId(peerReaction.peer_id) : message.fromId;\n const peerTitle = notification.title = await getPeerTitle({...peerTitleOptions, peerId, threadId: threadId});\n if(isForum) {\n const peerTitle = await getPeerTitle({...peerTitleOptions, peerId});\n notification.title += ` (${peerTitle})`;\n\n if(wrappedMessage && notificationFromPeerId !== message.peerId) {\n notificationMessage = await getPeerTitle({...peerTitleOptions, peerId: notificationFromPeerId}) +\n ': ' + notificationMessage;\n }\n } else if(isAnyChat && notificationFromPeerId !== message.peerId) {\n notification.title = await getPeerTitle({...peerTitleOptions, peerId: notificationFromPeerId}) +\n ' @ ' +\n notification.title;\n }\n\n notification.title = wrapPlainText(notification.title);\n\n notification.onclick = () => {\n appImManager.setInnerPeer({peerId, lastMsgId: message.mid, threadId});\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 = await this.managers.appPeersManager.getPeerPhoto(peerId);\n if(peerPhoto) {\n const url = await this.managers.appAvatarsManager.loadAvatar(peerId, peerPhoto, 'photo_small');\n\n if(!peerReaction) { // ! WARNING, message can be already read\n message = await this.managers.appMessagesManager.getMessageByPeer(message.peerId, message.mid);\n if(!message || !message.pFlags.unread) return;\n }\n\n notification.image = url;\n } else {\n let {avatarCanvas, avatarContext} = this;\n if(!this.avatarCanvas) {\n avatarCanvas = this.avatarCanvas = document.createElement('canvas');\n avatarContext = this.avatarContext = avatarCanvas.getContext('2d');\n\n const SIZE = 54;\n const dpr = 1;\n avatarCanvas.dpr = dpr;\n avatarCanvas.width = avatarCanvas.height = SIZE * dpr;\n\n this.avatarGradients = {};\n } else {\n avatarContext.clearRect(0, 0, avatarCanvas.width, avatarCanvas.height);\n }\n\n const color = getPeerColorById(peerId, true);\n let gradient = this.avatarGradients[color];\n if(!gradient) {\n gradient = this.avatarGradients[color] = avatarContext.createLinearGradient(avatarCanvas.width / 2, 0, avatarCanvas.width / 2, avatarCanvas.height);\n\n const colorTop = customProperties.getProperty(`peer-avatar-${color}-top`);\n const colorBottom = customProperties.getProperty(`peer-avatar-${color}-bottom`);\n gradient.addColorStop(0, colorTop);\n gradient.addColorStop(1, colorBottom);\n }\n\n avatarContext.fillStyle = gradient;\n\n drawCircle(avatarContext, avatarCanvas.width / 2, avatarCanvas.height / 2, avatarCanvas.width / 2);\n avatarContext.fill();\n\n const fontSize = 20 * avatarCanvas.dpr;\n const abbreviation = getAbbreviation(peerTitle);\n\n avatarContext.font = `700 ${fontSize}px ${FontFamily}`;\n avatarContext.textBaseline = 'middle';\n avatarContext.textAlign = 'center';\n avatarContext.fillStyle = 'white';\n avatarContext.fillText(abbreviation.text, avatarCanvas.width / 2, avatarCanvas.height * (window.devicePixelRatio > 1 ? .5625 : 5));\n\n notification.image = avatarCanvas.toDataURL();\n }\n\n const pushData: PushNotificationObject = {\n custom: {\n msg_id: '' + message.mid,\n peerId: '' + peerId\n },\n description: '',\n loc_key: '',\n loc_args: [],\n mute: '',\n random_id: 0,\n title: ''\n };\n\n const result = await this.notify(notification, pushData);\n if(result && this.registeredDevice) {\n webPushApiManager.ignorePushByMid(peerId, message.mid);\n }\n }\n\n private toggleToggler(enable = idleController.isIdle) {\n if(IS_MOBILE) return;\n\n const resetTitle = (isBlink?: boolean) => {\n this.titleChanged = false;\n document.title = this.titleBackup;\n this.setFavicon();\n };\n\n window.clearInterval(this.titleInterval);\n this.titleInterval = 0;\n\n if(!enable) {\n resetTitle();\n } else {\n this.titleInterval = window.setInterval(() => {\n const count = this.notificationsCount;\n if(!count) {\n this.toggleToggler(false);\n } else if(this.titleChanged) {\n resetTitle(true);\n } else {\n this.titleChanged = true;\n document.title = I18n.format('Notifications.Count', true, [count]);\n // this.setFavicon('assets/img/favicon_unread.ico');\n\n // fetch('assets/img/favicon.ico')\n // .then((res) => res.blob())\n // .then((blob) => {\n // const img = document.createElement('img');\n // img.src = URL.createObjectURL(blob);\n\n const canvas = document.createElement('canvas');\n canvas.width = 32 * window.devicePixelRatio;\n canvas.height = canvas.width;\n\n const ctx = canvas.getContext('2d');\n ctx.beginPath();\n ctx.arc(canvas.width / 2, canvas.height / 2, canvas.width / 2, 0, 2 * Math.PI, false);\n ctx.fillStyle = '#3390ec';\n ctx.fill();\n\n let fontSize = 24;\n let str = '' + count;\n if(count < 10) {\n fontSize = 22;\n } else if(count < 100) {\n fontSize = 20;\n } else {\n str = '99+';\n fontSize = 16;\n }\n\n fontSize *= window.devicePixelRatio;\n\n ctx.font = `700 ${fontSize}px ${FontFamily}`;\n ctx.textBaseline = 'middle';\n ctx.textAlign = 'center';\n ctx.fillStyle = 'white';\n ctx.fillText(str, canvas.width / 2, canvas.height * .5625);\n\n /* const ctx = canvas.getContext('2d');\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height); */\n\n this.setFavicon(canvas.toDataURL());\n // });\n }\n }, 1000);\n }\n }\n\n private setFavicon(href?: string) {\n if(this.prevFavicon === href) {\n return;\n }\n\n this.prevFavicon = href;\n this.faviconElements.forEach((element, idx, arr) => {\n const link = element.cloneNode() as HTMLLinkElement;\n\n link.dataset.href ||= link.href;\n\n href ??= link.dataset.href;\n link.href = href;\n element.replaceWith(arr[idx] = link);\n });\n }\n\n public async notify(data: NotifyOptions, pushData: PushNotificationObject) {\n this.log('notify', data, idleController.isIdle, this.notificationsUiSupport, this.stopped);\n\n if(this.stopped) {\n return;\n }\n\n data.image ||= NOTIFICATION_ICON_PATH;\n\n if(!data.noIncrement) {\n ++this.notificationsCount;\n }\n\n if(!this.titleInterval) {\n this.toggleToggler();\n }\n\n const idx = ++this.notificationIndex;\n const key = data.key || 'k' + idx;\n this.notificationsShown[key] = true;\n\n const now = tsNow();\n if(this.settings.volume > 0 && !this.settings.nosound/* &&\n (\n !data.tag ||\n !this.soundsPlayed[data.tag] ||\n now > this.soundsPlayed[data.tag] + 60000\n ) */\n ) {\n this.testSound(this.settings.volume);\n this.soundsPlayed[data.tag] = now;\n }\n\n if(!this.notificationsUiSupport ||\n 'Notification' in window && Notification.permission !== 'granted') {\n return;\n }\n\n if(this.settings.nodesktop) {\n if(this.vibrateSupport && !this.settings.novibrate) {\n navigator.vibrate([200, 100, 200]);\n return;\n }\n\n return;\n }\n\n if(!('Notification' in window)) {\n return;\n }\n\n let notification: MyNotification;\n\n const notificationOptions: NotificationOptions = {\n badge: NOTIFICATION_BADGE_PATH,\n icon: data.image || '',\n body: data.message || '',\n tag: data.tag || '',\n silent: data.silent || false,\n data: pushData\n };\n\n try {\n if(data.tag) {\n for(const i in this.notificationsShown) {\n const notification = this.notificationsShown[i];\n if(typeof(notification) !== 'boolean' && notification.tag === data.tag) {\n notification.hidden = true;\n }\n }\n }\n\n // throw new Error('test');\n notification = new Notification(data.title, notificationOptions);\n } catch(e) {\n try {\n const registration = await navigator.serviceWorker.ready;\n await registration.showNotification(data.title, notificationOptions);\n const notifications = await registration.getNotifications({tag: notificationOptions.tag});\n notification = notifications[notifications.length - 1];\n } catch(err) {\n this.log.error('creating push error', err, data, notificationOptions);\n }\n\n if(!notification) {\n this.notificationsUiSupport = false;\n webPushApiManager.setLocalNotificationsDisabled();\n return;\n }\n }\n\n notification.onclick = () => {\n this.log('notification onclick');\n notification.close();\n appRuntimeManager.focus();\n this.clear();\n data.onclick?.();\n };\n\n notification.onclose = () => {\n this.log('notification onclose');\n if(!notification.hidden) {\n delete this.notificationsShown[key];\n this.clear();\n }\n };\n\n notification.show?.();\n this.notificationsShown[key] = notification;\n\n if(!IS_MOBILE) {\n setTimeout(() => {\n this.hide(key);\n }, 8000);\n }\n\n return true;\n }\n\n public updateLocalSettings = () => {\n const keys = ['notify_nodesktop', 'notify_volume', 'notify_novibrate', 'notify_nopreview', 'notify_nopush'];\n const promises = keys.map(() => undefined);\n // const promises = keys.map((k) => stateStorage.get(k as any));\n Promise.all(promises)\n .then((updSettings) => {\n this.settings.nodesktop = updSettings[0];\n this.settings.volume = updSettings[1] === undefined ? 0.5 : updSettings[1];\n this.settings.novibrate = updSettings[2];\n this.settings.nopreview = updSettings[3];\n this.settings.nopush = updSettings[4];\n\n if(this.pushInited) {\n const needPush = !this.settings.nopush && !this.settings.nodesktop && webPushApiManager.isAvailable || false;\n const hasPush = this.registeredDevice !== false;\n if(needPush !== hasPush) {\n if(needPush) {\n webPushApiManager.subscribe();\n } else {\n webPushApiManager.unsubscribe();\n }\n }\n }\n\n webPushApiManager.setSettings(this.settings);\n });\n\n apiManagerProxy.getState().then((state) => {\n this.settings.nosound = !state.settings.notifications.sound;\n });\n }\n\n public getLocalSettings() {\n return this.settings;\n }\n\n private hide(key: string) {\n const notification = this.notificationsShown[key];\n if(notification) {\n this.closeNotification(notification);\n }\n }\n\n public soundReset(tag: string) {\n delete this.soundsPlayed[tag];\n }\n\n private requestPermission = () => {\n Notification.requestPermission();\n window.removeEventListener('click', this.requestPermission);\n };\n\n public testSound(volume: number) {\n const now = tsNow();\n if(this.nextSoundAt && now < this.nextSoundAt && this.prevSoundVolume === volume) {\n return;\n }\n\n this.nextSoundAt = now + 1000;\n this.prevSoundVolume = volume;\n const filename = 'assets/audio/notification.mp3';\n const audio = document.createElement('audio');\n audio.autoplay = true;\n audio.setAttribute('mozaudiochannel', 'notification');\n audio.volume = volume;\n audio.innerHTML = `\n \n \n `;\n this.notifySoundEl.append(audio);\n\n audio.addEventListener('ended', () => {\n audio.remove();\n }, {once: true});\n }\n\n public cancel(key: string) {\n const notification = this.notificationsShown[key];\n this.log('cancel', key, notification);\n if(notification) {\n if(this.notificationsCount > 0) {\n --this.notificationsCount;\n }\n\n this.closeNotification(notification);\n delete this.notificationsShown[key];\n }\n }\n\n private closeNotification(notification: boolean | MyNotification) {\n try {\n if(typeof(notification) !== 'boolean' && notification.close) {\n this.log('close notification', notification);\n notification.hidden = true;\n notification.close();\n }\n } catch(e) {}\n }\n\n public clear() {\n this.log.warn('clear');\n\n for(const i in this.notificationsShown) {\n const notification = this.notificationsShown[i];\n this.closeNotification(notification);\n }\n\n this.notificationsShown = {};\n this.notificationsCount = 0;\n\n webPushApiManager.hidePushNotifications();\n }\n\n public start() {\n this.log('start');\n\n this.updateLocalSettings();\n rootScope.addEventListener('settings_updated', this.updateLocalSettings);\n webPushApiManager.start();\n\n if(!this.notificationsUiSupport) {\n return false;\n }\n\n if('Notification' in window && Notification.permission !== 'granted' && Notification.permission !== 'denied') {\n window.addEventListener('click', this.requestPermission);\n }\n\n try {\n if('onbeforeunload' in window) {\n window.addEventListener('beforeunload', this.clear);\n }\n } catch(e) {}\n }\n\n private stop() {\n this.log('stop');\n\n this.clear();\n window.clearInterval(this.titleInterval);\n this.titleInterval = 0;\n this.setFavicon();\n this.stopped = true;\n }\n\n private registerDevice(tokenData: PushSubscriptionNotify) {\n if(this.registeredDevice && deepEqual(this.registeredDevice, tokenData)) {\n return false;\n }\n\n this.managers.apiManager.invokeApi('account.registerDevice', {\n token_type: tokenData.tokenType,\n token: tokenData.tokenValue,\n other_uids: [],\n app_sandbox: false,\n secret: new Uint8Array()\n }).then(() => {\n this.log('registered device');\n this.registeredDevice = tokenData;\n }, (error) => {\n error.handled = true;\n });\n }\n\n private unregisterDevice(tokenData: PushSubscriptionNotify) {\n if(!this.registeredDevice) {\n return false;\n }\n\n this.managers.apiManager.invokeApi('account.unregisterDevice', {\n token_type: tokenData.tokenType,\n token: tokenData.tokenValue,\n other_uids: []\n }).then(() => {\n this.registeredDevice = false;\n }, (error) => {\n error.handled = true;\n });\n }\n}\n\nconst uiNotificationsManager = new UiNotificationsManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.uiNotificationsManager = uiNotificationsManager);\nexport default uiNotificationsManager;\n","export const NOTIFICATION_ICON_PATH = 'assets/img/logo_filled_rounded.png';\nexport const NOTIFICATION_BADGE_PATH = 'assets/img/logo_plain.svg'; // masked\n","export default async function getFilesFromEvent(e: ClipboardEvent | DragEvent, onlyTypes = false): Promise {\n const files: any[] = [];\n\n const scanFiles = async(entry: any, item: DataTransferItem) => {\n if(entry.isDirectory) {\n const directoryReader = entry.createReader();\n await new Promise((resolve, reject) => {\n directoryReader.readEntries(async(entries: any) => {\n for(const entry of entries) {\n await scanFiles(entry, item);\n }\n\n resolve();\n });\n });\n } else if(entry) {\n if(onlyTypes) {\n files.push(entry.type);\n } else {\n const itemFile = item.getAsFile(); // * Safari can't handle entry.file with pasting\n const file = entry instanceof File ?\n entry :\n (\n entry instanceof DataTransferItem ?\n entry.getAsFile() :\n await new Promise((resolve, reject) => entry.file(resolve, (err: any) => resolve(itemFile)))\n );\n\n /* if(!onlyTypes) {\n console.log('getFilesFromEvent: got file', item, file);\n } */\n\n if(!file) return;\n files.push(file);\n }\n }\n };\n\n if(e instanceof DragEvent && e.dataTransfer.files && !e.dataTransfer.items) {\n for(let i = 0; i < e.dataTransfer.files.length; i++) {\n const file = e.dataTransfer.files[i];\n files.push(onlyTypes ? file.type : file);\n }\n } else {\n // @ts-ignore\n const items = (e.dataTransfer || e.clipboardData || e.originalEvent.clipboardData).items;\n\n const promises: Promise[] = [];\n for(let i = 0; i < items.length; ++i) {\n const item: DataTransferItem = items[i];\n if(item.kind === 'file') {\n const entry = (onlyTypes ? item : item.webkitGetAsEntry()) || item.getAsFile();\n promises.push(scanFiles(entry, item));\n }\n }\n\n await Promise.all(promises);\n }\n\n /* if(!onlyTypes) {\n console.log('getFilesFromEvent: got files:', e, files);\n } */\n\n return files;\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 {T_ME_PREFIXES} from '../lib/mtproto/mtproto_config';\nimport cancelEvent from './dom/cancelEvent';\nimport parseUriParams from './string/parseUriParams';\n\nexport default function addAnchorListener(options: {\n name: 'showMaskedAlert' | 'execBotCommand' | 'searchByHashtag' | 'addstickers' | 'im' |\n 'resolve' | 'privatepost' | 'addstickers' | 'voicechat' | 'joinchat' | 'join' | 'invoice' |\n 'addemoji',\n protocol?: 'tg',\n callback: (params: Params, element?: HTMLAnchorElement) => boolean | any,\n noPathnameParams?: boolean,\n noUriParams?: boolean,\n noCancelEvent?: boolean\n}) {\n (window as any)[(options.protocol ? options.protocol + '_' : '') + options.name] = (element?: HTMLAnchorElement/* , e: Event */) => {\n !options.noCancelEvent && cancelEvent(null);\n\n let href = element.href;\n let pathnameParams: any[];\n let uriParams: any;\n\n const u = new URL(href);\n const match = u.host.match(/(.+?)\\.t(?:elegram)?\\.me/);\n if(match && !T_ME_PREFIXES.has(match[1])) {\n u.pathname = match[1] + (u.pathname === '/' ? '' : u.pathname);\n href = u.toString();\n }\n\n if(!options.noPathnameParams) pathnameParams = new URL(href).pathname.split('/').slice(1);\n if(!options.noUriParams) uriParams = parseUriParams(href);\n\n const res = options.callback({pathnameParams, uriParams} as Params, element);\n return res === undefined ? res : false;\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 {GroupCallId, MyGroupCall} from './appGroupCallsManager';\nimport type GroupCallInstance from '../calls/groupCallInstance';\nimport type CallInstance from '../calls/callInstance';\nimport animationIntersector, {AnimationItemGroup} 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 rootScope from '../rootScope';\nimport Chat, {ChatType} from '../../components/chat/chat';\nimport PopupNewMedia, {getCurrentNewMediaPopup} from '../../components/popups/newMedia';\nimport MarkupTooltip from '../../components/chat/markupTooltip';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\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 stateStorage from '../stateStorage';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport appNavigationController from '../../components/appNavigationController';\nimport AppPrivateSearchTab from '../../components/sidebarRight/tabs/search';\nimport I18n, {i18n, join, LangPackKey} from '../langPack';\nimport {ChatFull, ChatInvite, ChatParticipant, ChatParticipants, Message, MessageAction, MessageMedia, SendMessageAction, User, Chat as MTChat, UrlAuthResult, WallPaper} from '../../layer';\nimport PeerTitle from '../../components/peerTitle';\nimport PopupPeer, {PopupPeerCheckboxOptions} from '../../components/popups/peer';\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 PopupElement from '../../components/popups';\nimport singleInstance, {InstanceDeactivateReason, 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 {InternalLink, InternalLinkTypeMap, INTERNAL_LINK_TYPE} from './internalLink';\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 TopbarCall from '../../components/topbarCall';\nimport confirmationPopup from '../../components/confirmationPopup';\nimport IS_GROUP_CALL_SUPPORTED from '../../environment/groupCallSupport';\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';\nimport PopupCall from '../../components/call';\nimport copy from '../../helpers/object/copy';\nimport getObjectKeysAndSort from '../../helpers/object/getObjectKeysAndSort';\nimport numberThousandSplitter from '../../helpers/number/numberThousandSplitter';\nimport ChatBackgroundPatternRenderer from '../../components/chat/patternRenderer';\nimport {IS_FIREFOX} from '../../environment/userAgent';\nimport compareVersion from '../../helpers/compareVersion';\nimport {AppManagers} from './managers';\nimport uiNotificationsManager from './uiNotificationsManager';\nimport appMediaPlaybackController from '../../components/appMediaPlaybackController';\nimport {PHONE_NUMBER_REG_EXP} from '../richTextProcessor';\nimport wrapEmojiText from '../richTextProcessor/wrapEmojiText';\nimport wrapRichText, {CustomEmojiRendererElement, renderEmojis} from '../richTextProcessor/wrapRichText';\nimport wrapUrl from '../richTextProcessor/wrapUrl';\nimport generateMessageId from './utils/messageId/generateMessageId';\nimport getUserStatusString from '../../components/wrappers/getUserStatusString';\nimport getChatMembersString from '../../components/wrappers/getChatMembersString';\nimport {STATE_INIT} from '../../config/state';\nimport CacheStorageController from '../files/cacheStorage';\nimport themeController from '../../helpers/themeController';\nimport overlayCounter from '../../helpers/overlayCounter';\nimport appDialogsManager from './appDialogsManager';\nimport idleController from '../../helpers/idleController';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport {AckedResult} from '../mtproto/superMessagePort';\nimport groupCallsController from '../calls/groupCallsController';\nimport callsController from '../calls/callsController';\nimport getFilesFromEvent from '../../helpers/files/getFilesFromEvent';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport appRuntimeManager from './appRuntimeManager';\nimport paymentsWrapCurrencyAmount from '../../helpers/paymentsWrapCurrencyAmount';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport {CLICK_EVENT_NAME} from '../../helpers/dom/clickEvent';\nimport PopupPayment from '../../components/popups/payment';\nimport wrapPeerTitle from '../../components/wrappers/peerTitle';\nimport NBSP from '../../helpers/string/nbsp';\nimport {makeMediaSize, MediaSize} from '../../helpers/mediaSize';\nimport {MiddleEllipsisElement} from '../../components/middleEllipsis';\nimport addAnchorListener from '../../helpers/addAnchorListener';\nimport parseUriParams from '../../helpers/string/parseUriParams';\nimport getMessageThreadId from './utils/messages/getMessageThreadId';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport {MTAppConfig} from '../mtproto/appConfig';\nimport PopupForward from '../../components/popups/forward';\nimport AppBackgroundTab from '../../components/sidebarLeft/tabs/background';\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 stack?: number,\n commentId?: number,\n type?: ChatType\n};\n\nexport type ChatSetInnerPeerOptions = Modify;\n\nexport enum APP_TABS {\n CHATLIST,\n CHAT,\n PROFILE\n}\n\nexport class AppImManager extends EventListenerBase<{\n chat_changing: (details: {from: Chat, to: Chat}) => void,\n peer_changed: (chat: Chat) => void,\n peer_changing: (chat: Chat) => void,\n tab_changing: (tabId: number) => void\n}> {\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 private tabId: APP_TABS;\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 public emojiAnimationContainer: HTMLDivElement;\n\n private lastBackgroundUrl: string;\n\n public managers: AppManagers;\n\n public cacheStorage = new CacheStorageController('cachedFiles');\n public customEmojiSize: MediaSize;\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 public construct(managers: AppManagers) {\n this.managers = managers;\n\n const {\n apiUpdatesManager\n } = managers;\n apiUpdatesManager.attach(I18n.lastRequestedLangCode);\n\n appMediaPlaybackController.construct(managers);\n uiNotificationsManager.construct(managers);\n uiNotificationsManager.start();\n\n this.log = logger('IM', LogTypes.Log | LogTypes.Warn | LogTypes.Debug | LogTypes.Error);\n\n this.backgroundPromises = {};\n STATE_INIT.settings.themes.forEach((theme) => {\n const themeSettings = theme.settings;\n if(!themeSettings) {\n return;\n }\n\n const {wallpaper} = themeSettings;\n const slug = (wallpaper as WallPaper.wallPaper).slug;\n if(!slug) {\n return;\n }\n\n const url = 'assets/img/' + slug + '.svg' + (IS_FIREFOX ? '?1' : '');\n this.backgroundPromises[slug] = Promise.resolve(url);\n });\n\n this.selectTab(APP_TABS.CHATLIST);\n\n idleController.addEventListener('change', (idle) => {\n this.offline = idle;\n this.updateStatus();\n if(idle) {\n clearInterval(this.updateStatusInterval);\n } else {\n this.updateStatusInterval = window.setInterval(() => this.updateStatus(), 50e3);\n }\n });\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 const onPremiumToggle = (isPremium: boolean) => {\n document.body.classList.toggle('is-premium', isPremium);\n };\n rootScope.addEventListener('premium_toggle', onPremiumToggle);\n onPremiumToggle(rootScope.premium);\n this.managers.rootScope.getPremium().then(onPremiumToggle);\n\n useHeavyAnimationCheck(() => {\n animationIntersector.setOnlyOnePlayableGroup('lock');\n animationIntersector.checkAnimations2(true);\n }, () => {\n animationIntersector.setOnlyOnePlayableGroup();\n animationIntersector.checkAnimations2(false);\n });\n\n themeController.AppBackgroundTab = AppBackgroundTab;\n\n if(IS_FIREFOX && apiManagerProxy.oldVersion && compareVersion(apiManagerProxy.oldVersion, '1.4.3') === -1) {\n this.deleteFilesIterative((response) => {\n return response.headers.get('Content-Type') === 'image/svg+xml';\n }).then(() => {\n this.applyCurrentTheme();\n });\n } else {\n this.applyCurrentTheme();\n }\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 mediaSizes.addEventListener('resize', () => {\n // const perf = performance.now();\n const rect = this.chatsContainer.getBoundingClientRect();\n ChatBackgroundPatternRenderer.resizeInstances(rect.width, rect.height).then(() => {\n // this.log.warn('resize bg time:', performance.now() - perf);\n // for(const chat of this.chats) {\n // if(chat.renderDarkPattern) {\n // chat.renderDarkPattern();\n // }\n // }\n });\n });\n\n this.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_title_edit', ({peerId, threadId}) => {\n if(this.chat?.peerId === peerId && !threadId && this.tabId !== undefined) {\n this.overrideHash(peerId);\n }\n });\n\n rootScope.addEventListener('peer_typings', ({peerId, typings}) => {\n const chat = this.chat;\n if(\n !chat ||\n chat.peerId !== peerId ||\n overlayCounter.isOverlayActive || (\n mediaSizes.activeScreen === ScreenSize.mobile &&\n this.tabId !== APP_TABS.CHAT\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[generateMessageId(typing.action.msg_id)];\n if(bubble && bubble.classList.contains('emoji-big') && getVisibleRect(bubble, chat.bubbles.scrollable.container)) {\n const stickerWrapper: HTMLElement = bubble.querySelector('.media-sticker-wrapper:not(.bubble-hover-reaction-sticker):not(.reaction-sticker)');\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 this.managers.appMessagesManager.setTyping(peerId, {\n _: 'sendMessageEmojiInteractionSeen',\n emoticon: action.emoticon\n });\n }\n }\n });\n\n const onInstanceDeactivated = (reason: InstanceDeactivateReason) => {\n const isUpdated = reason === 'version';\n const popup = new PopupElement('popup-instance-deactivated', {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(isUpdated ? 'Deactivated.Version.Title' : 'Deactivated.Title'));\n\n const subtitle = document.createElement('div');\n subtitle.classList.add('subtitle');\n subtitle.append(i18n(isUpdated ? 'Deactivated.Version.Subtitle' : 'Deactivated.Subtitle'));\n\n c.append(header, subtitle);\n\n document.body.classList.add('deactivated');\n\n const onClose = isUpdated ? () => {\n appRuntimeManager.reload();\n } : () => {\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.addEventListener('close', onClose);\n popup.show();\n };\n\n singleInstance.addEventListener('deactivated', onInstanceDeactivated);\n if(singleInstance.deactivatedReason) {\n onInstanceDeactivated(singleInstance.deactivatedReason);\n }\n\n // remove scroll listener when setting chat to tray\n this.addEventListener('chat_changing', ({to}) => {\n this.toggleChatGradientAnimation(to);\n });\n\n rootScope.addEventListener('service_notification', (update) => {\n confirmationPopup({\n button: {langKey: 'OK', isCancel: true},\n description: wrapRichText(update.message)\n });\n });\n\n rootScope.addEventListener('payment_sent', async({peerId, mid, receiptMessage}) => {\n const message = await this.managers.appMessagesManager.getMessageByPeer(peerId, mid);\n if(!message) {\n return;\n }\n\n const action = receiptMessage.action as MessageAction.messageActionPaymentSent;\n toastNew({\n langPackKey: 'PaymentInfoHint',\n langPackArguments: [\n paymentsWrapCurrencyAmount(action.total_amount, action.currency),\n wrapEmojiText(((message as Message.message).media as MessageMedia.messageMediaInvoice).title)\n ]\n });\n });\n\n (window as any).onSpoilerClick = (e: MouseEvent) => {\n const spoiler = findUpClassName(e.target, 'spoiler');\n const parentElement = findUpClassName(spoiler, 'spoilers-container') || spoiler.parentElement;\n\n const className = 'is-spoiler-visible';\n const isVisible = parentElement.classList.contains(className);\n if(!isVisible) {\n cancelEvent(e);\n\n if(CLICK_EVENT_NAME !== 'click') {\n window.addEventListener('click', cancelEvent, {capture: true, once: true});\n }\n }\n\n const duration = 400 / 2;\n const showDuration = 5000;\n const useRafs = !isVisible ? 2 : 0;\n if(useRafs) {\n parentElement.classList.add('will-change');\n }\n\n const spoilerTimeout = parentElement.dataset.spoilerTimeout;\n if(spoilerTimeout !== null) {\n clearTimeout(+spoilerTimeout);\n delete parentElement.dataset.spoilerTimeout;\n }\n\n SetTransition({\n element: parentElement,\n className,\n forwards: true,\n duration,\n onTransitionEnd: () => {\n parentElement.dataset.spoilerTimeout = '' + window.setTimeout(() => {\n SetTransition({\n element: parentElement,\n className,\n forwards: false,\n duration,\n onTransitionEnd: () => {\n parentElement.classList.remove('will-change');\n delete parentElement.dataset.spoilerTimeout;\n }\n });\n }, showDuration);\n },\n useRafs\n });\n };\n\n rootScope.addEventListener('sticker_updated', ({type, faved}) => {\n if(type === 'faved') {\n toastNew({\n langPackKey: faved ? 'AddedToFavorites' : 'RemovedFromFavorites'\n });\n } else if(!faved) {\n toastNew({\n langPackKey: 'RemovedFromRecent'\n });\n }\n });\n\n apiManagerProxy.addEventListener('notificationBuild', async(options) => {\n const isForum = await this.managers.appPeersManager.isForum(options.message.peerId);\n const threadId = getMessageThreadId(options.message, isForum);\n if(this.chat.peerId === options.message.peerId && this.chat.threadId === threadId && !idleController.isIdle) {\n return;\n }\n\n uiNotificationsManager.buildNotification(options);\n });\n\n this.addEventListener('peer_changed', async({peerId}) => {\n document.body.classList.toggle('has-chat', !!peerId);\n\n this.emojiAnimationContainer.textContent = '';\n\n this.overrideHash(peerId);\n\n apiManagerProxy.updateTabState('chatPeerIds', this.chats.map((chat) => chat.peerId).filter(Boolean));\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(managers);\n }\n\n if(IS_CALL_SUPPORTED) {\n callsController.addEventListener('instance', ({instance/* , hasCurrent */}) => {\n // if(hasCurrent) {\n // return;\n // }\n\n const popup = new PopupCall(instance);\n\n instance.addEventListener('acceptCallOverride', () => {\n return this.discardCurrentCall(instance.interlocutorUserId.toPeerId(), undefined, instance)\n .then(() => {\n callsController.dispatchEvent('accepting', instance);\n return true;\n })\n .catch(() => false);\n });\n\n popup.addEventListener('close', () => {\n const currentCall = callsController.currentCall;\n if(currentCall && currentCall !== instance && !instance.wasTryingToJoin) {\n instance.hangUp('phoneCallDiscardReasonBusy');\n }\n }, {once: true});\n\n popup.show();\n });\n\n callsController.addEventListener('incompatible', async(userId) => {\n toastNew({\n langPackKey: 'VoipPeerIncompatible',\n langPackArguments: [\n await wrapPeerTitle({peerId: userId.toPeerId()})\n ]\n });\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 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 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 this.managers.appMessagesManager.sendText(peerId, '/' + command);\n }); */\n\n this.managers.appMessagesManager.sendText(this.chat.peerId, '/' + command + (bot ? '@' + bot : ''));\n\n // console.log(command, bot);\n }\n });\n\n 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 ([\n ['addstickers', INTERNAL_LINK_TYPE.STICKER_SET],\n ['addemoji', INTERNAL_LINK_TYPE.EMOJI_SET]\n ] as [\n 'addstickers' | 'addemoji',\n INTERNAL_LINK_TYPE.STICKER_SET | INTERNAL_LINK_TYPE.EMOJI_SET\n ][]).forEach(([name, type]) => {\n addAnchorListener<{pathnameParams: [typeof name, string]}>({\n name,\n callback: ({pathnameParams}) => {\n if(!pathnameParams[1]) {\n return;\n }\n\n const link: InternalLink = {\n _: type,\n set: pathnameParams[1]\n };\n\n this.processInternalLink(link);\n }\n });\n\n addAnchorListener<{\n uriParams: {\n set: string\n }\n }>({\n name,\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(type, uriParams);\n this.processInternalLink(link);\n }\n });\n });\n\n // * t.me/invoice/asdasdad\n // * t.me/$asdasdad\n addAnchorListener<{pathnameParams: ['invoice', string] | string}>({\n name: 'invoice',\n callback: ({pathnameParams}) => {\n const link: InternalLink = {\n _: INTERNAL_LINK_TYPE.INVOICE,\n slug: pathnameParams.length > 1 ? pathnameParams[1] : pathnameParams[0].slice(1)\n };\n\n this.processInternalLink(link);\n }\n });\n\n // Support old t.me/joinchat/asd and new t.me/+asd\n 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 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 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}, element) => {\n let link: InternalLink;\n if(PHONE_NUMBER_REG_EXP.test(pathnameParams[0])) {\n link = {\n _: INTERNAL_LINK_TYPE.USER_PHONE_NUMBER,\n phone: pathnameParams[0].slice(1)\n };\n } else if(pathnameParams[0] === 'c') {\n pathnameParams.shift();\n const thread = 'thread' in uriParams ? uriParams.thread : pathnameParams[2] && pathnameParams[1];\n link = {\n _: INTERNAL_LINK_TYPE.PRIVATE_POST,\n channel: pathnameParams[0],\n post: pathnameParams[2] || pathnameParams[1],\n thread,\n comment: uriParams.comment,\n stack: this.getStackFromElement(element)\n };\n } else {\n const thread = 'thread' in uriParams ? uriParams.thread : pathnameParams[2] && pathnameParams[1];\n link = {\n _: INTERNAL_LINK_TYPE.MESSAGE,\n domain: pathnameParams[0],\n post: pathnameParams[2] || pathnameParams[1],\n thread,\n comment: uriParams.comment,\n start: 'start' in uriParams ? uriParams.start : undefined,\n stack: this.getStackFromElement(element)\n };\n }\n\n this.processInternalLink(link);\n }\n });\n\n 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 phone?: string\n }\n }>({\n name: 'resolve',\n protocol: 'tg',\n callback: ({uriParams}, element) => {\n let link: InternalLink;\n if(uriParams.phone) {\n link = this.makeLink(INTERNAL_LINK_TYPE.USER_PHONE_NUMBER, uriParams as Required);\n } else if(uriParams.domain === 'telegrampassport') {\n\n } else {\n link = this.makeLink(INTERNAL_LINK_TYPE.MESSAGE, {\n ...uriParams,\n stack: this.getStackFromElement(element)\n });\n }\n\n this.processInternalLink(link);\n }\n });\n\n 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 addAnchorListener<{\n uriParams: {\n slug: string\n }\n }>({\n name: 'invoice',\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.INVOICE, uriParams);\n this.processInternalLink(link);\n }\n });\n\n ['joinchat' as const, 'join' as const].forEach((name) => {\n 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(true);\n this.attachKeydownListener();\n this.handleAutologinDomains();\n this.checkForShare();\n }\n\n private checkForShare() {\n const share = apiManagerProxy.share;\n if(share) {\n apiManagerProxy.share = undefined;\n new PopupForward(undefined, async(peerId) => {\n await this.setPeer({peerId});\n if(share.files?.length) {\n const foundMedia = share.files.some((file) => MEDIA_MIME_TYPES_SUPPORTED.has(file.type));\n new PopupNewMedia(this.chat, share.files, foundMedia ? 'media' : 'document');\n } else {\n this.managers.appMessagesManager.sendText(peerId, share.text);\n }\n });\n }\n }\n\n public handleUrlAuth(options: {\n peerId?: PeerId,\n mid?: number,\n buttonId?: number,\n url: string\n }) {\n const {peerId, mid, buttonId, url} = options;\n\n const openWindow = (url: string) => {\n window.open(url, '_blank');\n };\n\n const onUrlAuthResultAccepted = (urlAuthResult: UrlAuthResult.urlAuthResultAccepted) => {\n openWindow(urlAuthResult.url);\n };\n\n const onUrlAuthResult = async(urlAuthResult: UrlAuthResult): Promise => {\n if(urlAuthResult._ === 'urlAuthResultRequest') {\n const b = document.createElement('b');\n b.append(urlAuthResult.domain);\n const peerTitle = await wrapPeerTitle({peerId: rootScope.myId});\n const botPeerTitle = await wrapPeerTitle({peerId: urlAuthResult.bot.id.toPeerId()});\n\n const logInCheckbox: PopupPeerCheckboxOptions = {\n text: 'OpenUrlOption1',\n textArgs: [b.cloneNode(true), peerTitle],\n checked: true\n };\n\n const allowMessagesCheckbox: PopupPeerCheckboxOptions = urlAuthResult.pFlags.request_write_access ? {\n text: 'OpenUrlOption2',\n textArgs: [botPeerTitle],\n checked: true\n } : undefined;\n\n const checkboxes: PopupPeerCheckboxOptions[] = [\n logInCheckbox,\n allowMessagesCheckbox\n ];\n\n const confirmationPromise = confirmationPopup({\n titleLangKey: 'OpenUrlTitle',\n button: {\n langKey: 'Open'\n },\n descriptionLangKey: 'OpenUrlAlert2',\n descriptionLangArgs: [b],\n checkboxes: checkboxes.filter(Boolean)\n });\n\n if(allowMessagesCheckbox) {\n logInCheckbox.checkboxField.input.addEventListener('change', () => {\n const disabled = !logInCheckbox.checkboxField.checked;\n allowMessagesCheckbox.checkboxField.toggleDisability(disabled);\n\n if(disabled) {\n allowMessagesCheckbox.checkboxField.checked = false;\n }\n });\n }\n\n const [logInChecked, allowMessagesChecked] = await confirmationPromise;\n\n if(!logInChecked) {\n openWindow(url);\n return;\n }\n\n const result = await this.managers.appSeamlessLoginManager.acceptUrlAuth(\n url,\n peerId,\n mid,\n buttonId,\n allowMessagesChecked\n );\n\n return onUrlAuthResult(result);\n } else if(urlAuthResult._ === 'urlAuthResultAccepted') {\n onUrlAuthResultAccepted(urlAuthResult);\n } else {\n openWindow(url);\n }\n };\n\n return this.managers.appSeamlessLoginManager.requestUrlAuth(\n url,\n peerId,\n mid,\n buttonId\n ).then((urlAuthResult) => {\n onUrlAuthResult(urlAuthResult);\n });\n }\n\n private handleAutologinDomains() {\n let appConfig: MTAppConfig;\n rootScope.addEventListener('app_config', (_appConfig) => {\n appConfig = _appConfig;\n });\n\n const onAnchorClick = (element: HTMLAnchorElement) => {\n const url = new URL(element.href);\n if(appConfig.url_auth_domains.includes(url.hostname)) {\n this.handleUrlAuth({url: element.href});\n cancelEvent();\n return;\n }\n\n if(!appConfig.autologin_token || !appConfig.autologin_domains) {\n return;\n }\n\n const originalUrl = element.dataset.originalUrl ??= element.href;\n if(appConfig.autologin_domains.includes(url.hostname)) {\n url.searchParams.set('autologin_token', appConfig.autologin_token);\n element.href = url.toString();\n\n setTimeout(() => {\n element.href = originalUrl;\n delete element.dataset.originalUrl;\n }, 0);\n }\n };\n\n document.addEventListener('click', (e) => {\n const anchor = findUpTag(e.target as HTMLElement, 'A') as HTMLAnchorElement;\n if(anchor?.href) {\n onAnchorClick(anchor);\n }\n });\n\n // addAnchorListener({\n // name: 'handleUrlClick',\n // callback: (_, element) => {\n // onAnchorClick(element);\n // },\n // noCancelEvent: true,\n // noPathnameParams: true,\n // noUriParams: true\n // });\n }\n\n private getStackFromElement(element: HTMLElement) {\n const possibleBubble = findUpClassName(element, 'bubble');\n return possibleBubble ? +possibleBubble.dataset.mid : undefined;\n }\n\n private deleteFilesIterative(callback: (response: Response) => boolean) {\n return this.cacheStorage.timeoutOperation((cache) => {\n const perf = performance.now();\n return cache.keys().then((requests) => {\n const promises = requests.map((request) => {\n return cache.match(request).then((response) => {\n return callback(response);\n });\n });\n\n return Promise.all(promises).then((values) => {\n values.map((isBad, idx) => {\n if(!isBad) {\n return;\n }\n\n const request = requests[idx];\n return cache.delete(request);\n });\n\n return Promise.all(values.filter(Boolean));\n });\n }).then(() => {\n this.log('deleted files', performance.now() - perf);\n });\n });\n }\n\n private toggleChatGradientAnimation(activatingChat: Chat) {\n this.chats.forEach((chat) => {\n if(chat.gradientRenderer) {\n chat.gradientRenderer.scrollAnimate(rootScope.settings.animationsEnabled && chat === activatingChat);\n }\n });\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 const isSelectionCollapsed = document.getSelection().isCollapsed;\n if(overlayCounter.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((key.startsWith('Arrow') || (e.shiftKey && key === 'Shift')) && !isSelectionCollapsed) {\n return;\n } else if(e.code === 'KeyC' && (e.ctrlKey || e.metaKey) && target.tagName !== 'INPUT') {\n return;\n } else if(e.altKey && (key === 'ArrowUp' || key === 'ArrowDown')) {\n cancelEvent(e);\n this.managers.dialogsStorage.getNextDialog(this.chat.peerId, key === 'ArrowDown', appDialogsManager.filterId).then((dialog) => {\n if(dialog) {\n this.setPeer({peerId: dialog.peerId});\n }\n });\n } else if(key === 'ArrowUp' && this.chat.type !== 'scheduled') {\n if(!chat.input.editMsgId && chat.input.isInputEmpty()) {\n this.managers.appMessagesManager.getFirstMessageToEdit(chat.peerId, chat.threadId).then((message) => {\n if(message) {\n chat.input.initMessageEditing(message.mid);\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.isContentEditable &&\n !IS_TOUCH_SUPPORTED &&\n (!mediaSizes.isMobile || this.tabId === APP_TABS.CHAT) &&\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 ? generateMessageId(+link.post) : undefined;\n const commentId = link.comment ? generateMessageId(+link.comment) : undefined;\n const threadId = link.thread ? generateMessageId(+link.thread) : undefined;\n\n this.openUsername({\n userName: link.domain,\n lastMsgId: postId,\n commentId,\n startParam: link.start,\n stack: link.stack,\n threadId\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 = await this.managers.appChatsManager.getChat(chatId);\n if(!chat) {\n try {\n await this.managers.appChatsManager.resolveChannel(chatId);\n } catch(err) {\n toastNew({langPackKey: 'LinkNotFound'});\n throw err;\n }\n }\n\n const postId = generateMessageId(+link.post);\n const threadId = link.thread ? generateMessageId(+link.thread) : undefined;\n\n this.op({\n peer: chat,\n lastMsgId: postId,\n threadId,\n stack: link.stack\n });\n break;\n }\n\n case INTERNAL_LINK_TYPE.EMOJI_SET:\n case INTERNAL_LINK_TYPE.STICKER_SET: {\n new PopupStickers({id: link.set}, link._ === INTERNAL_LINK_TYPE.EMOJI_SET).show();\n break;\n }\n\n case INTERNAL_LINK_TYPE.JOIN_CHAT: {\n this.managers.appChatsManager.checkChatInvite(link.invite).then((chatInvite) => {\n if((chatInvite as ChatInvite.chatInvitePeek).chat) {\n this.managers.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);\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 case INTERNAL_LINK_TYPE.USER_PHONE_NUMBER: {\n this.managers.appUsersManager.resolvePhone(link.phone).then((user) => {\n this.setInnerPeer({\n peerId: user.id.toPeerId(false)\n });\n }).catch((err) => {\n if(err.type === 'PHONE_NOT_OCCUPIED') {\n toastNew({langPackKey: 'Alert.UserDoesntExists'});\n }\n });\n\n break;\n }\n\n case INTERNAL_LINK_TYPE.INVOICE: {\n this.managers.appPaymentsManager.getInputInvoiceBySlug(link.slug).then((inputInvoice) => {\n this.managers.appPaymentsManager.getPaymentForm(inputInvoice).then((paymentForm) => {\n // const message: Message.message = {\n // _: 'message',\n // date: 0,\n // id: 0,\n // peerId: 0,\n // peer_id: undefined,\n // message: '',\n // media: {\n // _: 'messageMediaInvoice',\n // currency: paymentForm.invoice.currency,\n // description: paymentForm.description,\n\n // }\n // };\n new PopupPayment(undefined, inputInvoice, paymentForm);\n });\n });\n break;\n }\n\n default: {\n this.log.warn('Not supported internal link:', link);\n break;\n }\n }\n }\n\n public openUrl(url: string) {\n const {url: wrappedUrl, onclick} = wrapUrl(url);\n if(!onclick) {\n return;\n }\n\n const a = document.createElement('a');\n a.href = wrappedUrl;\n (window as any)[onclick](a);\n }\n\n private onHashChange = (saveState?: boolean) => {\n try {\n this.onHashChangeUnsafe(saveState);\n } catch(err) {\n this.log.error('hash change error', err);\n }\n };\n\n private onHashChangeUnsafe = (saveState?: boolean) => {\n const hash = location.hash;\n if(!saveState) {\n appNavigationController.replaceState();\n }\n\n const splitted = hash.split('?');\n const params = parseUriParams(hash, splitted);\n this.log('hashchange', hash, splitted[0], params);\n if(!hash) {\n return;\n }\n\n if(params.tgaddr) {\n this.openUrl(params.tgaddr);\n return;\n }\n\n switch(splitted[0]) {\n default: {\n params.p = splitted[0].slice(1);\n }\n\n case '#/im': {\n if(!Object.keys(params).length) {\n break;\n }\n\n const p: string = params.p;\n const postId = params.post !== undefined ? 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 private async op(options: {\n peer: User.user | MTChat\n } & Omit) {\n let {peer, commentId, threadId, lastMsgId} = options;\n const isUser = peer._ === 'user';\n const peerId = peer.id.toPeerId(!isUser);\n\n const isForum = peer._ === 'channel' && peer.pFlags.forum;\n // open forum tab\n if(!commentId && !threadId && !lastMsgId && isForum) {\n appDialogsManager.toggleForumTabByPeerId(peerId, true);\n return;\n }\n\n // handle t.me/username/thread or t.me/username/messageId\n if(isForum && lastMsgId && !threadId) {\n const message = await this.managers.appMessagesManager.reloadMessages(peerId, lastMsgId);\n if(message) {\n threadId = options.threadId = getMessageThreadId(message, isForum);\n } else {\n threadId = options.threadId = lastMsgId;\n lastMsgId = options.lastMsgId = undefined;\n }\n }\n\n if(threadId) {\n return this.openThread({\n ...(options as any as Parameters[0]),\n peerId\n });\n } else if(commentId) {\n return this.openComment({\n peerId,\n msgId: lastMsgId,\n commentId\n });\n }\n\n return this.setInnerPeer({\n ...options,\n peerId\n });\n }\n\n public openPremiumBot() {\n return this.managers.apiManager.getAppConfig().then((appConfig) => {\n return this.openUsername({userName: appConfig.premium_bot_username});\n });\n }\n\n public openUsername(options: {\n userName: string\n } & Omit) {\n const {userName} = options;\n return this.managers.appUsersManager.resolveUsername(userName).then((peer) => {\n return this.op({\n peer,\n ...options\n });\n }, (err: ApiError) => {\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 async openThread(options: {\n peerId: PeerId,\n lastMsgId: number,\n threadId: number,\n stack?: number\n }) {\n if(await this.managers.appChatsManager.isForum(options.peerId.toChatId())) {\n await this.managers.dialogsStorage.getForumTopicOrReload(options.peerId, options.threadId);\n return this.setInnerPeer(options);\n }\n\n return this.managers.appMessagesManager.reloadMessages(options.peerId, options.threadId).then((message) => {\n if(!message) {\n options.lastMsgId = undefined;\n } else {\n this.managers.appMessagesManager.generateThreadServiceStartMessage(message);\n }\n\n return this.setInnerPeer({\n ...options,\n type: 'discussion'\n });\n });\n }\n\n /**\n * Opens comment directly from original channel\n */\n public openComment(options: {\n peerId: PeerId,\n msgId: number,\n commentId: number\n }) {\n return this.managers.appMessagesManager.getDiscussionMessage(options.peerId, options.msgId).then((message) => {\n return this.openThread({\n peerId: message.peerId,\n lastMsgId: options.commentId,\n threadId: message.mid\n });\n });\n }\n\n public async callUser(userId: UserId, type: CallType) {\n const call = callsController.getCallByUserId(userId);\n if(call) {\n return;\n }\n\n const userFull = await this.managers.appProfileManager.getProfile(userId);\n if(userFull.pFlags.phone_calls_private) {\n wrapPeerTitle({peerId: userId.toPeerId()}).then((element) => {\n return confirmationPopup({\n descriptionLangKey: 'Call.PrivacyErrorMessage',\n descriptionLangArgs: [element],\n button: {\n langKey: 'OK',\n isCancel: true\n }\n });\n });\n\n return;\n }\n\n await this.discardCurrentCall(userId.toPeerId());\n\n callsController.startCallInternal(userId, type === 'video');\n }\n\n private discardCurrentCall(toPeerId: PeerId, ignoreGroupCall?: GroupCallInstance, ignoreCall?: CallInstance) {\n if(groupCallsController.groupCall && groupCallsController.groupCall !== ignoreGroupCall) return this.discardGroupCallConfirmation(toPeerId);\n else if(callsController.currentCall && callsController.currentCall !== ignoreCall) return this.discardCallConfirmation(toPeerId);\n else return Promise.resolve();\n }\n\n private async discardCallConfirmation(toPeerId: PeerId) {\n const currentCall = callsController.currentCall;\n if(currentCall) {\n await Promise.all([\n wrapPeerTitle({peerId: currentCall.interlocutorUserId.toPeerId(false)}),\n wrapPeerTitle({peerId: toPeerId})\n ]).then(([title1, title2]) => {\n return 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: [title1, title2],\n button: {\n langKey: 'OK'\n }\n });\n });\n\n if(!currentCall.isClosing) {\n await currentCall.hangUp('phoneCallDiscardReasonDisconnect');\n }\n }\n }\n\n private async discardGroupCallConfirmation(toPeerId: PeerId) {\n const currentGroupCall = groupCallsController.groupCall;\n if(currentGroupCall) {\n await Promise.all([\n wrapPeerTitle({peerId: currentGroupCall.chatId.toPeerId(true)}),\n wrapPeerTitle({peerId: toPeerId})\n ]).then(([title1, title2]) => {\n return 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: [title1, title2],\n button: {\n langKey: 'OK'\n }\n });\n });\n\n if(groupCallsController.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 = this.managers.appChatsManager.hasRights(chatId, 'manage_call');\n const next = async() => {\n const chatFull = await this.managers.appProfileManager.getChatFull(chatId);\n let call: MyGroupCall;\n if(!chatFull.call) {\n if(!hasRights) {\n return;\n }\n\n call = await this.managers.appGroupCallsManager.createGroupCall(chatId);\n } else {\n call = chatFull.call;\n }\n\n groupCallsController.joinGroupCall(chatId, call.id, true, false);\n };\n\n if(groupCallId) {\n const groupCall = await this.managers.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): ReturnType {\n const theme = themeController.getTheme();\n\n const slug = (theme.settings?.wallpaper as WallPaper.wallPaper)?.slug;\n if(slug) {\n const defaultTheme = STATE_INIT.settings.themes.find((t) => t.name === theme.name);\n // const isDefaultBackground = theme.background.blur === defaultTheme.background.blur &&\n // slug === defaultslug;\n\n // if(!isDefaultBackground) {\n return this.getBackground(slug).then((url) => {\n return this.setBackground(url, broadcastEvent);\n }, () => { // * if NO_ENTRY_FOUND\n theme.settings = copy(defaultTheme.settings); // * reset background\n return this.setCurrentBackground(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] = this.cacheStorage.getFile('backgrounds/' + slug).then((blob) => {\n return URL.createObjectURL(blob);\n });\n }\n\n public setBackground(url: string, broadcastEvent = true): Promise {\n this.lastBackgroundUrl = url;\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 key = chat.peerId + (chat.threadId ? '_' + chat.threadId : '');\n const chatPositions = stateStorage.getFromCache('chatPositions');\n if(!(chatBubbles.scrollable.getDistanceToEnd() <= 16 && chatBubbles.scrollable.loadedAll.bottom) && chatBubbles.getRenderedLength()) {\n chatBubbles.sliceViewport(true);\n const top = chatBubbles.scrollable.scrollTop;\n\n const position = {\n mids: getObjectKeysAndSort(chatBubbles.bubbles, 'desc').filter((mid) => mid > 0 && !chatBubbles.skippedMids.has(mid)),\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 applyCurrentTheme(slug?: string, backgroundUrl?: string, broadcastEvent?: boolean) {\n if(backgroundUrl) {\n this.backgroundPromises[slug] = Promise.resolve(backgroundUrl);\n }\n\n themeController.setTheme();\n\n return this.setCurrentBackground(broadcastEvent === undefined ? !!slug : broadcastEvent);\n }\n\n private setSettings = () => {\n const {messagesTextSize} = rootScope.settings;\n\n this.customEmojiSize = makeMediaSize(messagesTextSize + 4, messagesTextSize + 4);\n document.documentElement.style.setProperty('--messages-text-size', messagesTextSize + 'px');\n\n const firstTime = !this.customEmojiSize;\n if(!firstTime) {\n const ellipsisElements = document.querySelectorAll('middle-ellipsis-element');\n ellipsisElements.forEach((element) => {\n element.disconnectedCallback();\n element.dataset.fontSize = '' + messagesTextSize;\n if(element.title) element.textContent = element.title;\n element.connectedCallback();\n });\n\n const renderers = document.querySelectorAll('.chat custom-emoji-renderer-element');\n renderers.forEach((renderer) => {\n renderer.forceRenderAfterSize = true;\n });\n }\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 topbar.pinnedMessage?.setCorrectIndex(0); // * ะฑัƒะดัƒ ะผะพะปะธั‚ัŒัั ะฑะพะณะฐะผ, ั‡ั‚ะพะฑั‹ ัั‚ะพ ะฝะธั‡ะตะณะพ ะฝะต ัะปะพะผะฐะปะพ, ะฝะพ ัั‚ะพ ะธัะฟั€ะฐะฒะปัะตั‚ ะฟะพะปัƒั‡ะตะฝะธะต ะฟะธะฝะฝะตะดะฐ ะฟะพัะปะต ะฐะฝะธะผะฐั†ะธะธ\n\n this.managers.apiFileManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId);\n }, rootScope.settings.animationsEnabled ? 250 : 0, false, true);\n\n if(lottieLoader.setLoop(rootScope.settings.stickers.loop)) {\n animationIntersector.checkAnimations2(false);\n }\n\n for(const chat of this.chats) {\n chat.setAutoDownloadMedia();\n }\n\n I18n.setTimeFormat(rootScope.settings.timeFormat);\n\n this.toggleChatGradientAnimation(this.chat);\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 const types: string[] = await getFilesFromEvent(e, true);\n if(!isFiles || (!(await 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 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 this.log('drop', e);\n this.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 this.log('drop', e);\n this.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 this.log('drop', e);\n this.onDocumentPaste(e, 'media');\n }\n }));\n }\n\n this.chat.container.append(_dropsContainer);\n }\n }\n\n // if(!mount) return;\n\n SetTransition({\n element: _dropsContainer,\n className: 'is-visible',\n forwards: mount,\n duration: 200,\n onTransitionEnd: () => {\n if(!mount) {\n _drops.forEach((drop) => {\n drop.destroy();\n });\n\n _drops.length = 0;\n }\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 >= this.managers.appPhotosManager.windowW) || (e.pageY <= 0 || e.pageY >= this.managers.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 async canDrag() {\n const chat = this.chat;\n const peerId = chat?.peerId;\n return !(!peerId || overlayCounter.isOverlayActive || !(await chat.canSend('send_media')));\n }\n\n private onDocumentPaste = async(e: ClipboardEvent | DragEvent, attachType?: 'media' | 'document') => {\n const newMediaPopup = getCurrentNewMediaPopup();\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 const files = await getFilesFromEvent(e);\n if(!(await this.canDrag()) && !newMediaPopup) return;\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 PopupElement.createPopup(PopupNewMedia, this.chat, files, chatInput.willAttachType);\n }\n };\n\n private async overrideHash(peerId?: PeerId) {\n let str: string;\n if(peerId) {\n const username = await this.managers.appPeersManager.getPeerUsername(peerId);\n str = username ? '@' + username : '' + peerId;\n }\n\n appNavigationController.overrideHash(str);\n }\n\n public selectTab(id: APP_TABS, 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 === APP_TABS.CHATLIST);\n\n const prevTabId = this.tabId;\n if(prevTabId !== undefined) {\n this.overrideHash(id > APP_TABS.CHATLIST ? this.chat?.peerId : undefined);\n this.dispatchEvent('tab_changing', id);\n }\n\n this.log('selectTab', id, prevTabId);\n\n let animationPromise: Promise = rootScope.settings.animationsEnabled ? doubleRaf() : Promise.resolve();\n if(\n prevTabId !== undefined &&\n prevTabId !== id &&\n rootScope.settings.animationsEnabled &&\n animate !== false/* &&\n mediaSizes.activeScreen !== ScreenSize.large */\n ) {\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 === APP_TABS.PROFILE && id < APP_TABS.PROFILE) {\n document.body.classList.remove(RIGHT_COLUMN_ACTIVE_CLASSNAME);\n }\n\n if(prevTabId !== undefined && id > prevTabId) {\n if(id < APP_TABS.PROFILE || !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 const onImTabChange = (window as any).onImTabChange;\n onImTabChange && onImTabChange(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 return this.managers.appUsersManager.updateMyOnlineStatus(this.offline);\n }\n\n private createNewChat() {\n const chat = new Chat(\n this,\n this.managers\n );\n\n if(this.chats.length) {\n chat.setBackground(this.lastBackgroundUrl, 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 this.dispatchEvent('peer_changing', this.chat);\n }\n\n if(!spliced) {\n spliced = this.chats.splice(fromIndex, this.chats.length - fromIndex);\n }\n\n const chatTo = this.chat;\n this.dispatchEvent('chat_changing', {from: chatFrom, to: chatTo});\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(chatTo.container, animate);\n\n if(justReturn) {\n this.dispatchEvent('peer_changed', chatTo);\n\n const searchTab = appSidebarRight.getTab(AppPrivateSearchTab);\n searchTab?.close();\n\n appSidebarRight.replaceSharedMediaTab(chatTo.sharedMediaTab);\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 async setPeer(options: Partial = {}, animate?: boolean): Promise {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n options.peerId ??= NULL_PEER_ID;\n\n const {peerId, lastMsgId, threadId} = options;\n\n const chat = this.chat;\n const chatIndex = this.chats.indexOf(chat);\n const isSamePeer = this.isSamePeer(chat, options as any);\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 && !isSamePeer) {\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(isSamePeer && mediaSizes.activeScreen <= ScreenSize.medium && document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME)) {\n this.selectTab(APP_TABS.CHAT, animate);\n return false;\n }\n\n if(peerId || mediaSizes.activeScreen !== ScreenSize.mobile) {\n const result = await chat.setPeer(options as any as Parameters[0]);\n\n // * wait for cached render\n const promise = result?.cached ? result.promise : Promise.resolve();\n if(peerId) {\n Promise.all([\n promise,\n chat.setBackgroundPromise\n ]).then(() => {\n // window.requestAnimationFrame(() => {\n setTimeout(() => { // * setTimeout is better here\n setTimeout(() => {\n this.chatsSelectTab(this.chat.container);\n }, 0);\n this.selectTab(APP_TABS.CHAT, animate);\n }, 0);\n });\n }\n }\n\n if(!peerId) {\n this.selectTab(APP_TABS.CHATLIST, animate);\n return false;\n }\n }\n\n public async setInnerPeer(options: ChatSetInnerPeerOptions) {\n const {peerId} = options;\n if(peerId === NULL_PEER_ID || !peerId) {\n return;\n }\n\n if(!options.type) {\n if(options.threadId && !(await this.managers.appPeersManager.isForum(options.peerId))) {\n options.type = 'discussion';\n }\n\n options.type ??= 'chat';\n }\n\n // * reuse current chat\n const existingIndex = this.chats.findIndex((chat) => this.isSamePeer(chat, options) || (mediaSizes.activeScreen === ScreenSize.mobile && this.tabId === 0));\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 this.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 async getPeerTyping(peerId: PeerId, container?: HTMLElement, threadId?: number) {\n // const log = this.log.bindPrefix('getPeerTyping-' + peerId);\n // log('getting peer typing');\n\n const isUser = peerId.isUser();\n if(isUser && await this.managers.appUsersManager.isBot(peerId)) {\n // log('a bot');\n return;\n }\n\n const typings = await this.managers.appProfileManager.getPeerTypings(peerId, threadId);\n if(!typings?.length) {\n // log('have no typing');\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 = 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 // log('no langPackKey');\n return;\n }\n\n let peerTitlePromise: Promise;\n let args: any[];\n if(peerId.isAnyChat()) {\n const peerTitle = new PeerTitle();\n peerTitlePromise = peerTitle.update({peerId: typing.userId.toPeerId(false), onlyFirstName: true});\n args = [\n peerTitle.element,\n typings.length - 1\n ];\n\n await peerTitlePromise;\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 if(action._ === 'sendMessageEmojiInteractionSeen') {\n if(args) {\n args.pop();\n } else {\n args = [];\n }\n\n const span = htmlToSpan(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\n // log('returning typing');\n return container;\n }\n\n private async getChatStatus(chatId: ChatId, noTyping?: boolean): Promise> {\n const typingEl = noTyping ? undefined : await this.getPeerTyping(chatId.toPeerId(true));\n if(typingEl) {\n return {cached: true, result: Promise.resolve(typingEl)};\n }\n\n const result = await this.managers.acknowledged.appProfileManager.getChatFull(chatId);\n const dooo = async(chatInfo: ChatFull) => {\n // this.chat.log('chatInfo res:', chatInfo);\n\n const participants_count = (chatInfo as ChatFull.channelFull).participants_count ||\n ((chatInfo as ChatFull.chatFull).participants as ChatParticipants.chatParticipants)?.participants?.length ||\n 1;\n // if(participants_count) {\n let subtitle = await getChatMembersString(chatId);\n\n if(participants_count < 2) {\n return subtitle;\n }\n\n const onlines = await this.managers.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 };\n\n const promise = Promise.resolve(result.result).then(dooo);\n return {\n cached: result.cached,\n result: promise\n };\n }\n\n private async getUserStatus(userId: UserId, ignoreSelf?: boolean) {\n const result: AckedResult = {\n cached: true,\n result: Promise.resolve(undefined as HTMLElement)\n };\n\n const user = await this.managers.appUsersManager.getUser(userId);\n if(!user || (user.pFlags.self && !ignoreSelf)) {\n return result;\n }\n\n const subtitle = getUserStatusString(user);\n\n if(!user.pFlags.bot && !user.pFlags.support) {\n let typingEl = await this.getPeerTyping(userId.toPeerId());\n if(!typingEl && user.status?._ === 'userStatusOnline') {\n typingEl = document.createElement('span');\n typingEl.classList.add('online');\n typingEl.append(subtitle);\n }\n\n if(typingEl) {\n result.result = Promise.resolve(typingEl);\n return result;\n }\n }\n\n result.result = Promise.resolve(subtitle);\n return result;\n }\n\n private async getPeerStatus(peerId: PeerId, ignoreSelf?: boolean, noTyping?: boolean) {\n if(!peerId) return;\n let promise: Promise>;\n if(peerId.isAnyChat()) {\n promise = this.getChatStatus(peerId.toChatId(), noTyping);\n } else {\n promise = this.getUserStatus(peerId.toUserId(), ignoreSelf);\n }\n\n return promise;\n }\n\n public async setPeerStatus(options: {\n peerId: PeerId,\n element: HTMLElement,\n needClear: boolean,\n useWhitespace: boolean,\n middleware: () => boolean,\n ignoreSelf?: boolean,\n noTyping?: boolean\n }) {\n // const log = this.log.bindPrefix('status-' + peerId);\n // log('setting status', element);\n\n const {peerId, element, needClear, useWhitespace, middleware, ignoreSelf, noTyping} = options;\n\n if(!needClear) {\n // * good good good\n const typingContainer = element.querySelector('.peer-typing-container') as HTMLElement;\n if(typingContainer && await this.getPeerTyping(peerId, typingContainer)) {\n // log('already have a status');\n return;\n }\n }\n\n const result = await this.getPeerStatus(peerId, ignoreSelf, noTyping);\n // log('getPeerStatus result', result);\n if(!middleware()) {\n // log.warn('middleware');\n return;\n }\n\n const set = async() => {\n const subtitle = result && await result.result;\n if(!middleware()) {\n return;\n }\n\n return () => replaceContent(element, subtitle || placeholder);\n };\n\n const placeholder = useWhitespace ? NBSP : ''; // ! HERE U CAN FIND WHITESPACE\n if(!result || result.cached || needClear === undefined) {\n return await set();\n } else if(needClear) {\n return () => {\n element.textContent = placeholder;\n return set().then((callback) => callback?.());\n };\n }\n }\n\n public setChoosingStickerTyping(cancel: boolean) {\n this.managers.appMessagesManager.setTyping(this.chat.peerId, {_: cancel ? 'sendMessageCancelAction' : 'sendMessageChooseStickerAction'}, undefined, this.chat.threadId);\n }\n\n public isSamePeer(options1: {peerId: PeerId, threadId?: number, type?: ChatType}, options2: typeof options1) {\n return options1.peerId === options2.peerId &&\n options1.threadId === options2.threadId &&\n (typeof(options1.type) !== typeof(options2.type) || options1.type === options2.type);\n }\n}\n\nconst appImManager = new AppImManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appImManager = appImManager);\nexport default appImManager;\n","import {Message, MessageMedia} from '../../../../layer';\n\nexport default function canSaveMessageMedia(message: Message.message | Message.messageService) {\n return message &&\n !message.pFlags.is_outgoing &&\n !(message as Message.message).pFlags.noforwards &&\n !((message as Message.message).media as MessageMedia.messageMediaInvoice)?.extended_media\n}\n","import {Document, Message, MessageAction, MessageExtendedMedia, MessageMedia, Photo, WebPage} from '../../../../layer';\n\nexport default function getMediaFromMessage(message: Message) {\n if(!message) return;\n\n let media: any;\n if((message as Message.messageService).action) {\n media = ((message as Message.messageService).action as MessageAction.messageActionChannelEditPhoto).photo;\n } else if((message as Message.message).media) {\n let messageMedia = (message as Message.message).media;\n if((messageMedia as MessageMedia.messageMediaWebPage).webpage) {\n messageMedia = (messageMedia as MessageMedia.messageMediaWebPage).webpage as any as MessageMedia;\n } else if((messageMedia as MessageMedia.messageMediaInvoice).extended_media?._ === 'messageExtendedMedia') {\n messageMedia = ((messageMedia as MessageMedia.messageMediaInvoice).extended_media as MessageExtendedMedia.messageExtendedMedia).media;\n }\n\n media = (messageMedia as MessageMedia.messageMediaDocument).document ||\n (messageMedia as MessageMedia.messageMediaPhoto).photo;\n }\n\n return media as Photo.photo | Document.document;\n}\n","import {Message} from '../../../../layer';\nimport type {MyMessage} from '../../appMessagesManager';\n\nexport default function 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","import {isRestricted} from '../../../../helpers/restrictions';\nimport {Message} from '../../../../layer';\n\nexport default function isMessageRestricted(message: Message.message) {\n return !!(message.restriction_reason && isRestricted(message.restriction_reason));\n}\n","// https://github.com/eelcohn/Telegram-API/wiki/Calculating-color-for-a-Telegram-user-on-IRC\n/*\n HTML-color IRC-color Description\n #c03d33 4 red\n #4fad2d 3 green\n #d09306 7 yellow\n #168acd 10 blue\n #8544d6 6 purple\n #cd4073 13 pink\n #2996ad 11 sea\n #ce671b 5 orange\n*/\nconst DialogColorsFg = ['#fc5c51', '#0fb297', '#d09306', '#3d72ed', '#895dd5', '#cd4073', '#00c1a6', '#fa790f'];\nconst DialogColors = ['red', 'green', 'yellow', 'blue', 'violet', 'pink', 'cyan', 'orange'];\nconst DialogColorsMap = [0, 7, 4, 1, 6, 3, 5];\n\nexport default function getPeerColorById(peerId: PeerId, pic = true) {\n if(!peerId) return '';\n\n const idx = DialogColorsMap[Math.abs(+peerId) % 7];\n const color = (pic ? DialogColors : DialogColorsFg)[idx];\n return color;\n}\n","import {Chat, User} from '../../../../layer';\n\nexport default function getPeerEditableUsername(peer: User.user | Chat.channel) {\n if(peer.username) {\n return peer.username;\n }\n\n const usernames = peer.usernames;\n const username = usernames?.find((username) => username.pFlags.editable);\n return username?.username;\n}\n","import isObject from '../../../../helpers/object/isObject';\nimport {InputChannel, InputPeer, Peer} from '../../../../layer';\nimport {NULL_PEER_ID} from '../../../mtproto/mtproto_config';\n\nexport default function getPeerId(peerId: {user_id: UserId} | {channel_id: ChatId} | {chat_id: ChatId} | InputPeer | InputChannel | PeerId | string): PeerId {\n if(peerId !== undefined && ((peerId as string).isPeerId ? (peerId as string).isPeerId() : false)) return peerId as PeerId;\n // if(typeof(peerId) === 'string' && /^[uc]/.test(peerId)) return peerId as PeerId;\n // if(typeof(peerId) === 'number') return peerId;\n else if(isObject(peerId)) {\n const userId = (peerId as Peer.peerUser).user_id;\n if(userId !== undefined) {\n return userId.toPeerId(false);\n }\n\n const chatId = (peerId as Peer.peerChannel).channel_id || (peerId as Peer.peerChat).chat_id;\n if(chatId !== undefined) {\n return chatId.toPeerId(true);\n }\n\n return NULL_PEER_ID; // maybe it is an inputPeerSelf\n // } else if(!peerId) return 'u0';\n } else if(!peerId) return NULL_PEER_ID;\n\n const isUser = (peerId as string).charAt(0) === 'u';\n const peerParams = (peerId as string).substr(1).split('_');\n\n return isUser ? peerParams[0].toPeerId() : (peerParams[0] || '').toPeerId(true);\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 {MyDocument} from '../../appDocsManager';\nimport type {MyPhoto} from '../../appPhotosManager';\nimport type {PhotoSize, VideoSize, WebDocument} from '../../../../layer';\nimport calcImageInBox from '../../../../helpers/calcImageInBox';\nimport {THUMB_TYPE_FULL} from '../../../mtproto/mtproto_config';\n\nexport default function choosePhotoSize(\n photo: MyPhoto | MyDocument | WebDocument,\n boxWidth = 0,\n boxHeight = 0,\n useBytes = false,\n pushDocumentSize = false\n) {\n if(window.devicePixelRatio > 1) {\n boxWidth *= 2;\n boxHeight *= 2;\n }\n\n /*\n s box 100x100\n m box 320x320\n x box 800x800\n y box 1280x1280\n w box 2560x2560\n a crop 160x160\n b crop 320x320\n c crop 640x640\n d crop 1280x1280 */\n\n let sizes: PhotoSize[] = (photo as MyPhoto).sizes || (photo as MyDocument).thumbs as PhotoSize[];\n let bestPhotoSize: typeof sizes[0] = {_: 'photoSizeEmpty', type: THUMB_TYPE_FULL};\n if(pushDocumentSize && sizes && photo._ !== 'photo') {\n sizes = sizes.concat({\n _: 'photoSize',\n w: photo.w,\n h: photo.h,\n size: photo.size,\n type: THUMB_TYPE_FULL\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 * 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/safeAssign';\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 const 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 SDP from '../sdp';\nimport {CallSignalingData, P2PVideoCodec} from '../types';\nimport parseMediaSectionInfo from './parseMediaSectionInfo';\n\nexport default function parseSignalingData(sdp: SDP) {\n const info = parseMediaSectionInfo(sdp, sdp.media[0]);\n\n const data: CallSignalingData.initialSetup = {\n '@type': 'InitialSetup',\n 'fingerprints': [info.fingerprint],\n 'ufrag': info.ufrag,\n 'pwd': info.pwd,\n 'audio': undefined,\n 'video': undefined,\n 'screencast': undefined\n };\n\n const convertNumber = (number: number) => '' + number;\n\n for(const section of sdp.media) {\n const mediaType = section.mediaType;\n if(mediaType === 'application' || !section.isSending) {\n continue;\n }\n\n const codec: P2PVideoCodec = data[mediaType === 'video' && data['video'] ? 'screencast' : mediaType] = {} as any;\n const info = parseMediaSectionInfo(sdp, section);\n codec.ssrc = convertNumber(info.source);\n\n if(info.sourceGroups) {\n codec.ssrcGroups = info.sourceGroups.map((sourceGroup) => ({semantics: sourceGroup.semantics, ssrcs: sourceGroup.sources.map(convertNumber)}));\n }\n\n const rtpExtensions: P2PVideoCodec['rtpExtensions'] = codec.rtpExtensions = [];\n section.attributes.get('extmap').forEach((attribute) => {\n rtpExtensions.push({\n id: +attribute.key,\n uri: attribute.value\n });\n });\n\n const payloadTypesMap: Map = new Map();\n\n const getPayloadType = (id: number) => {\n let payloadType = payloadTypesMap.get(id);\n if(!payloadType) {\n payloadTypesMap.set(id, payloadType = {\n id\n } as any);\n }\n\n return payloadType;\n };\n\n section.attributes.get('rtpmap').forEach((attribute) => {\n const id = +attribute.key;\n const payloadType = getPayloadType(id);\n const splitted = attribute.value.split('/');\n const [name, clockrate, channels] = splitted;\n payloadType.name = name;\n payloadType.clockrate = +clockrate;\n payloadType.channels = channels ? +channels : 0;\n });\n\n section.attributes.get('rtcp-fb').forEach((attribute) => {\n const id = +attribute.key;\n const payloadType = getPayloadType(id);\n payloadType.feedbackTypes = attribute.lines.map((line) => {\n const splitted = line.split(' ');\n const [type, subtype] = splitted;\n return {\n type,\n subtype: subtype || ''\n };\n });\n });\n\n section.attributes.get('fmtp').forEach((attribute) => {\n const id = +attribute.key;\n const payloadType = getPayloadType(id);\n const parameters: P2PVideoCodec['payloadTypes'][0]['parameters'] = payloadType.parameters = {};\n const splitted = attribute.value.split(';');\n for(const str of splitted) {\n const [key, value] = str.split('=');\n parameters[key] = value;\n }\n });\n\n codec.payloadTypes = Array.from(payloadTypesMap.values());\n\n /* if(codec.payloadTypes.length > 5) {\n codec.payloadTypes.length = Math.min(codec.payloadTypes.length, 5);\n } */\n }\n\n return data;\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 CallConnectionInstanceBase, {CallConnectionInstanceOptions} from './callConnectionInstanceBase';\nimport CallInstance from './callInstance';\nimport parseSignalingData from './helpers/parseSignalingData';\nimport {parseSdp} from './sdp/utils';\n\nexport default class CallConnectionInstance extends CallConnectionInstanceBase {\n private call: CallInstance;\n\n constructor(options: CallConnectionInstanceOptions & {\n call: CallConnectionInstance['call']\n }) {\n super(options);\n }\n\n protected async negotiateInternal() {\n const {connection, call} = this;\n\n if(!connection.localDescription && !connection.remoteDescription && !call.isOutgoing) {\n return;\n }\n\n let descriptionInit: RTCSessionDescriptionInit;\n if(call.offerReceived) {\n call.offerReceived = false;\n\n const answer = descriptionInit = await connection.createAnswer();\n\n this.log('[sdp] local', answer.type, answer.sdp);\n await connection.setLocalDescription(answer);\n\n this.log('[InitialSetup] send 2');\n } else {\n const offer = descriptionInit = await connection.createOffer();\n\n this.log('[sdp] local', offer.sdp);\n await connection.setLocalDescription(offer);\n\n call.offerSent = true;\n\n this.log('[InitialSetup] send 0');\n }\n\n const initialSetup = parseSignalingData(parseSdp(descriptionInit.sdp));\n call.sendCallSignalingData(initialSetup);\n }\n}\n","const subtle = typeof(window) !== 'undefined' && 'crypto' in window ? window.crypto.subtle : self.crypto.subtle;\n\nexport default subtle;\n","/*\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 bufferConcats from '../../../helpers/bytes/bufferConcats';\nimport subtle from '../../crypto/subtle';\nimport sha256 from '../../crypto/utils/sha256';\n\nconst kMaxIncomingPacketSize = 128 * 1024 * 1024;\n\nexport default class P2PEncryptor {\n private type: 'Signaling';\n private counter: number;\n private seqMap: Map;\n\n constructor(private isOutgoing: boolean, private p2pKey: Uint8Array) {\n this.type = 'Signaling';\n this.counter = 0;\n this.seqMap = new Map();\n }\n\n private concatSHA256(parts: Uint8Array[]) {\n return sha256(bufferConcats(...parts));\n }\n\n private async encryptPrepared(buffer: Uint8Array) {\n const result = {\n counter: 0, // this.counterFromSeq(this.readSeq(buffer)),\n bytes: new Uint8Array(16 + buffer.length)\n };\n\n const x = (this.isOutgoing ? 0 : 8) + (this.type === 'Signaling' ? 128 : 0);\n const key = this.p2pKey;\n\n const msgKeyLarge = await this.concatSHA256([key.subarray(x + 88, x + 88 + 32), buffer]);\n const msgKey = result.bytes;\n for(let i = 0; i < 16; ++i) {\n msgKey[i] = msgKeyLarge[i + 8];\n }\n\n const aesKeyIv = await this.prepareAesKeyIv(key, msgKey, x);\n\n const bytes = await this.aesProcessCtr(buffer, buffer.length, aesKeyIv, true);\n\n result.bytes = new Uint8Array([...result.bytes.subarray(0, 16), ...bytes]);\n\n return result;\n }\n\n public encryptRawPacket(buffer: Uint8Array) {\n const seq = ++this.counter;\n const arr = new ArrayBuffer(4);\n const view = new DataView(arr);\n view.setUint32(0, seq >>> 0, false); // byteOffset = 0; litteEndian = false\n\n const result = new Uint8Array([...new Uint8Array(arr), ...buffer]);\n\n return this.encryptPrepared(result);\n }\n\n private async prepareAesKeyIv(key: Uint8Array, msgKey: Uint8Array, x: number) {\n const [sha256a, sha256b] = await Promise.all([\n this.concatSHA256([\n msgKey.subarray(0, 16),\n key.subarray(x, x + 36)\n ]),\n\n this.concatSHA256([\n key.subarray(40 + x, 40 + x + 36),\n msgKey.subarray(0, 16)\n ])\n ]);\n\n return {\n key: new Uint8Array([\n ...sha256a.subarray(0, 8),\n ...sha256b.subarray(8, 8 + 16),\n ...sha256a.subarray(24, 24 + 8)\n ]),\n iv: new Uint8Array([\n ...sha256b.subarray(0, 4),\n ...sha256a.subarray(8, 8 + 8),\n ...sha256b.subarray(24, 24 + 4)\n ])\n };\n }\n\n private async aesProcessCtr(encryptedData: Uint8Array, dataSize: number, aesKeyIv: {key: Uint8Array, iv: Uint8Array}, encrypt = true) {\n const cryptoKey = await subtle.importKey(\n 'raw',\n aesKeyIv.key,\n {name: 'AES-CTR'},\n false,\n [encrypt ? 'encrypt' : 'decrypt']\n );\n\n const buffer: ArrayBuffer = await subtle[encrypt ? 'encrypt' : 'decrypt']({\n name: 'AES-CTR',\n counter: aesKeyIv.iv,\n length: aesKeyIv.iv.length * 8\n },\n cryptoKey,\n encryptedData\n );\n\n return new Uint8Array(buffer);\n }\n\n private constTimeIsDifferent(a: Uint8Array, b: Uint8Array, count: number) {\n let msgKeyEquals = true;\n for(let i = 0; i < count; ++i) {\n if(a[i] !== b[i]) {\n msgKeyEquals = false;\n }\n }\n\n return !msgKeyEquals;\n }\n\n public async decryptRawPacket(buffer: Uint8Array) {\n if(buffer.length < 21 || buffer.length > kMaxIncomingPacketSize) {\n return;\n }\n\n const {isOutgoing, type} = this;\n\n const x = (isOutgoing ? 8 : 0) + (type === 'Signaling' ? 128 : 0);\n const key = this.p2pKey;\n\n const msgKey = buffer.subarray(0, 16);\n const encryptedData = buffer.subarray(16);\n const encryptedDataSize = buffer.length - 16;\n\n const aesKeyIv = await this.prepareAesKeyIv(key, msgKey, x);\n\n const decryptionBuffer = await this.aesProcessCtr(encryptedData, encryptedDataSize, aesKeyIv, false);\n\n const msgKeyLarge = await this.concatSHA256([\n key.subarray(88 + x, 88 + x + 32),\n decryptionBuffer\n ]);\n\n if(this.constTimeIsDifferent(msgKeyLarge.subarray(8), msgKey, 16)) {\n return;\n }\n\n const dataView = new DataView(decryptionBuffer.buffer);\n const seq = dataView.getUint32(0);\n if(this.seqMap.has(seq)) {\n return;\n }\n this.seqMap.set(seq, seq);\n\n return decryptionBuffer.slice(4);\n }\n}\n","import convertToUint8Array from '../../../helpers/bytes/convertToUint8Array';\nimport subtle from '../subtle';\n// import sha256 from '@cryptography/sha256';\n\nexport default function sha256(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","/*\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 StringFromLineBuilder from '../stringFromLineBuilder';\nimport {addDataChannel, addExtmap, addPayloadTypes, addSsrc} from './p2PSdpBuilder';\n\nexport default class ChromeP2PSdpBuilder {\n static generateOffer(info: any) {\n const {fingerprints, ufrag, pwd, audio, video} = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n const stringBuilder = new StringFromLineBuilder();\n stringBuilder.add(\n 'v=0',\n 'o=- 1 2 IN IP4 127.0.0.1',\n 's=-',\n 't=0 0'\n );\n\n if(fingerprints) {\n fingerprints.forEach((x: any) => {\n const {hash, fingerprint, setup} = x;\n stringBuilder.add(\n `a=fingerprint:${hash} ${fingerprint}`,\n `a=setup:${setup}`\n );\n });\n }\n if(ufrag && pwd) {\n stringBuilder.add(\n `a=ice-ufrag:${ufrag}`,\n `a=ice-pwd:${pwd}`\n );\n }\n\n stringBuilder.add(\n 'a=group:BUNDLE 0 1 2',\n 'a=extmap-allow-mixed',\n 'a=msid-semantic: WMS *'\n );\n const streamName = 'stream' + media.map((x) => x.ssrc).join('_');\n for(let i = 0; i < media.length; i++) {\n const m = media[i];\n const {type, ssrc, ssrcGroups, payloadTypes, rtpExtensions} = m;\n switch(type) {\n case 'audio': {\n stringBuilder.add(\n `m=audio 56930 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} audio${ssrc}`);\n }\n stringBuilder.add(\n 'a=rtcp-mux',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n\n break;\n }\n\n case 'video': {\n stringBuilder.add(\n `m=video 61986 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} video${ssrc}`);\n }\n stringBuilder.add(\n 'a=rtcp-mux',\n 'a=rtcp-rsize',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n break;\n }\n }\n }\n stringBuilder.add(addDataChannel(2));\n return stringBuilder.finalize();\n }\n\n static generateAnswer(info: any) {\n const {fingerprints, ufrag, pwd, audio, video} = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n const stringBuilder = new StringFromLineBuilder();\n stringBuilder.add(\n 'v=0',\n 'o=- 1 2 IN IP4 127.0.0.1',\n 's=-',\n 't=0 0'\n );\n\n if(fingerprints) {\n fingerprints.forEach((x: any) => {\n const {hash, fingerprint, setup} = x;\n stringBuilder.add(\n `a=fingerprint:${hash} ${fingerprint}`,\n `a=setup:${setup}`\n );\n });\n }\n if(ufrag && pwd) {\n stringBuilder.add(\n `a=ice-ufrag:${ufrag}`,\n `a=ice-pwd:${pwd}`\n );\n }\n\n stringBuilder.add(\n 'a=group:BUNDLE 0 1 2',\n 'a=extmap-allow-mixed',\n 'a=msid-semantic: WMS *'\n );\n const streamName = 'stream' + media.map((x) => x.ssrc).join('_');\n for(let i = 0; i < media.length; i++) {\n const m = media[i];\n const {type, ssrc, ssrcGroups, payloadTypes, rtpExtensions} = m;\n switch(type) {\n case 'audio': {\n stringBuilder.add(\n `m=audio 56930 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} audio${ssrc}`);\n }\n stringBuilder.add(\n 'a=rtcp-mux',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n break;\n }\n\n case 'video': {\n stringBuilder.add(\n `m=video 61986 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} video${ssrc}`);\n }\n\n stringBuilder.add(\n 'a=rtcp-mux',\n 'a=rtcp-rsize',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n break;\n }\n }\n }\n stringBuilder.add(addDataChannel(2));\n return stringBuilder.finalize();\n }\n}\n","/*\n* Copyright (c) 2018-present, Evgeny Nadymov\n*\n* This source code is licensed under the GPL v.3.0 license found in the\n* LICENSE file in the root directory of this source tree.\n*/\n\nimport ChromeP2PSdpBuilder from './chromeP2PSdpBuilder';\nimport { FirefoxP2PSdpBuilder } from './firefoxP2PSdpBuilder';\nimport { SafariP2PSdpBuilder } from './safariP2PSdpBuilder';\n// import { TG_CALLS_SDP_STRING } from '../../Stores/CallStore';\n\nexport function p2pParseCandidate(candidate) {\n if(!candidate || !candidate.startsWith('candidate:')) {\n return;\n }\n \n const sdpString = candidate;\n candidate = candidate.substr('candidate:'.length);\n \n const [foundation, component, protocol, priority, ip, port, ...other] = candidate.split(' ');\n const c = {\n sdpString,\n foundation,\n component,\n protocol,\n priority,\n address: { ip, port }\n };\n \n for(let i = 0; i < other.length; i += 2) {\n switch(other[i]) {\n case 'typ': {\n c.type = other[i + 1];\n break;\n }\n case 'raddr': {\n if(!c.relAddress) {\n c.relAddress = {};\n }\n \n c.relAddress.ip = other[i + 1];\n break;\n }\n case 'rport': {\n if(!c.relAddress) {\n c.relAddress = {};\n }\n \n c.relAddress.port = other[i + 1];\n break;\n }\n case 'generation': {\n c.generation = other[i + 1];\n break;\n }\n case 'tcptype': {\n c.tcpType = other[i + 1];\n break;\n }\n case 'network-id': {\n c.networkId = other[i + 1];\n break;\n }\n case 'network-cost': {\n c.networkCost = other[i + 1];\n break;\n }\n case 'ufrag': {\n c.username = other[i + 1];\n break;\n }\n }\n }\n \n return c;\n}\n\nexport function p2pParseSdp(sdp) {\n const lines = sdp.split('\\r\\n');\n const lookup = (prefix, force = true, lineFrom = 0, lineTo = Number.MAX_VALUE) => {\n if (lineTo === -1) {\n lineTo = Number.MAX_VALUE;\n }\n for (let i = lineFrom; i < lines.length && i < lineTo; i++) {\n const line = lines[i];\n if (line.startsWith(prefix)) {\n return line.substr(prefix.length);\n }\n }\n \n if (force) {\n console.error(\"Can't find prefix\", prefix);\n }\n \n return null;\n };\n const findIndex = (prefix, lineFrom = 0, lineTo = Number.MAX_VALUE) => {\n if (lineTo === -1) {\n lineTo = Number.MAX_VALUE;\n }\n for (let i = lineFrom; i < lines.length && i < lineTo; i++) {\n const line = lines[i];\n if (line.startsWith(prefix)) {\n return i;\n }\n }\n \n return -1;\n };\n \n const pwdIndex = findIndex('a=ice-pwd:');\n const ufragIndex = findIndex('a=ice-ufrag:');\n if (pwdIndex === -1 && ufragIndex === -1) {\n return {\n // sessionId: lookup('o=').split(' ')[1],\n ufrag: null,\n pwd: null,\n fingerprints: []\n };\n }\n \n const info = {\n // sessionId: lookup('o=').split(' ')[1],\n ufrag: null,\n pwd: null,\n fingerprints: []\n };\n \n let mediaIndex = findIndex('m=');\n const fingerprint = lookup('a=fingerprint:', false);\n const setup = lookup('a=setup:', false);\n if (fingerprint && setup) {\n info.fingerprints.push({\n hash: fingerprint.split(' ')[0],\n fingerprint: fingerprint.split(' ')[1],\n setup\n });\n }\n \n const ufrag = lookup('a=ice-ufrag:', false);\n const pwd = lookup('a=ice-pwd:', false);\n if (ufrag && pwd) {\n info.ufrag = ufrag;\n info.pwd = pwd;\n }\n \n while (mediaIndex !== -1) {\n let nextMediaIndex = findIndex('m=', mediaIndex + 1);\n \n const extmap = [];\n const types = [];\n const mediaType = lookup('m=', true, mediaIndex, nextMediaIndex).split(' ')[0];\n const media = {\n // type: lookup('m=', true, mediaIndex, nextMediaIndex).split(' ')[0],\n // mid: lookup('a=mid:', true, mediaIndex, nextMediaIndex),\n // dir: findDirection(mediaIndex, nextMediaIndex),\n rtpExtensions: extmap,\n payloadTypes: types\n }\n \n const lineTo = nextMediaIndex === -1 ? lines.length : nextMediaIndex;\n const fmtp = new Map();\n const rtcpFb = new Map();\n for (let i = mediaIndex; i < lineTo; i++) {\n const line = lines[i];\n if (line.startsWith('a=extmap:')) {\n const [ id, uri ] = line.substr('a=extmap:'.length).split(' ');\n extmap.push({ id: parseInt(id), uri });\n } else if (line.startsWith('a=fmtp:')) {\n const [ id, str ] = line.substr('a=fmtp:'.length).split(' ');\n const obj = { };\n const arr = str.split(';').map(x => {\n const [ key, value ] = x.split('=');\n obj[key] = value;\n return { [key]: value };\n });\n fmtp.set(parseInt(id), obj);\n } else if (line.startsWith('a=rtcp-fb:')) {\n const [ id, type = '', subtype = '' ] = line.substr('a=rtcp-fb:'.length).split(' ');\n if (rtcpFb.has(parseInt(id))) {\n rtcpFb.get(parseInt(id)).push({ type, subtype });\n } else {\n rtcpFb.set(parseInt(id), [{ type, subtype }])\n }\n } else if (line.startsWith('a=rtpmap')) {\n const [ id, str ] = line.substr('a=rtpmap:'.length).split(' ');\n const [ name, clockrate, channels = '0' ] = str.split('/');\n const obj = { id: parseInt(id), name, clockrate: parseInt(clockrate), channels: parseInt(channels) };\n \n types.push(obj);\n }\n }\n \n for (let i = 0; i < types.length; i++) {\n const { id } = types[i];\n if (rtcpFb.has(id)) {\n types[i].feedbackTypes = rtcpFb.get(id);\n }\n if (fmtp.has(id)) {\n types[i].parameters = fmtp.get(id);\n }\n }\n \n const ssrc = lookup('a=ssrc:', false, mediaIndex, nextMediaIndex);\n if (ssrc) {\n media.ssrc = ssrc.split(' ')[0];\n }\n \n const ssrcGroup = lookup('a=ssrc-group:', false, mediaIndex, nextMediaIndex);\n if (ssrcGroup) {\n const [ semantics, ...ssrcs ] = ssrcGroup.split(' ');\n media.ssrcGroups = [{\n semantics,\n ssrcs\n }]\n }\n \n switch (mediaType) {\n case 'audio': {\n info.audio = media;\n break;\n }\n case 'video': {\n info.video = media;\n break;\n }\n }\n \n mediaIndex = nextMediaIndex;\n }\n\n if(!info.video.ssrcGroups) {\n info.video.ssrcGroups = [];\n }\n\n info['@type'] = 'InitialSetup';\n \n // console.log('[p2pParseSdp]', sdp, info);\n return info;\n}\n\nexport function isFirefox() {\n return navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n}\n\nfunction isSafari() {\n return navigator.userAgent.toLowerCase().indexOf('safari') > -1 && navigator.userAgent.toLowerCase().indexOf('chrome') === -1;\n}\n\nexport function addExtmap(extmap) {\n let sdp = [];\n // return sdp;\n for (let j = 0; j < extmap.length; j++) {\n const ext = extmap[j];\n const { id, uri } = ext;\n // if (isFirefox() && uri.indexOf(''))\n console.log('[extmap] add', id, uri);\n sdp.push(`a=extmap:${id} ${uri}`);\n }\n \n return sdp.join('\\n');\n}\n\nexport function addPayloadTypes(types) {\n let sdp = [];\n console.log('[SDP] addPayloadTypes', types);\n for (let i = 0; i < types.length; i++) {\n const type = types[i];\n const { id, name, clockrate, channels, feedbackTypes, parameters } = type;\n sdp.push(`a=rtpmap:${id} ${name}/${clockrate}${channels ? '/' + channels : ''}`);\n if (feedbackTypes) {\n feedbackTypes.forEach(x => {\n const { type, subtype } = x;\n sdp.push(`a=rtcp-fb:${id} ${[type, subtype].join(' ')}`);\n });\n }\n if (parameters) {\n const fmtp = [];\n Object.getOwnPropertyNames(parameters).forEach(pName => {\n fmtp.push(`${pName}=${parameters[pName]}`);\n });\n \n sdp.push(`a=fmtp:${id} ${fmtp.join(';')}`);\n }\n }\n \n return sdp.join('\\n');\n}\n\nexport function addSsrc(type, ssrc, ssrcGroups, streamName) {\n let sdp = [];\n \n if (ssrcGroups && ssrcGroups.length > 0) {\n ssrcGroups.forEach(ssrcGroup => {\n if (ssrcGroup && ssrcGroup.ssrcs.length > 0) {\n sdp.push(`a=ssrc-group:${ssrcGroup.semantics} ${ssrcGroup.ssrcs.join(' ')}`);\n ssrcGroup.ssrcs.forEach(ssrc => {\n sdp.push(\n `a=ssrc:${ssrc} cname:stream${ssrc}`,\n `a=ssrc:${ssrc} msid:${streamName} ${type}${ssrc}`,\n `a=ssrc:${ssrc} mslabel:${type}${ssrc}`,\n `a=ssrc:${ssrc} label:${type}${ssrc}`\n );\n });\n }\n });\n } else if (ssrc) {\n sdp.push(\n `a=ssrc:${ssrc} cname:stream${ssrc}`,\n `a=ssrc:${ssrc} msid:${streamName} ${type}${ssrc}`,\n `a=ssrc:${ssrc} mslabel:${type}${ssrc}`,\n `a=ssrc:${ssrc} label:${type}${ssrc}`\n );\n }\n \n return sdp.join('\\n');\n}\n\nexport function addDataChannel(mid) {\n return `m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144`;\n}\n\nexport class P2PSdpBuilder {\n static generateCandidate(info) {\n if (!info) return null;\n \n const { sdpString, sdpMLineIndex, sdpMid, foundation, component, protocol, priority, address, type, relAddress, generation, tcpType, networkId, networkCost, username } = info;\n if (/* TG_CALLS_SDP_STRING */true) {\n if (sdpString) {\n return {\n candidate: sdpString,\n sdpMLineIndex,\n sdpMid\n };\n }\n }\n throw 'no sdpString';\n \n let candidate = `candidate:${foundation} ${component} ${protocol} ${priority} ${address.ip} ${address.port}`;\n const attrs = []\n if (type) {\n attrs.push(`typ ${type}`);\n }\n if (relAddress) {\n attrs.push(`raddr ${relAddress.ip}`);\n attrs.push(`rport ${relAddress.port}`);\n }\n if (tcpType) {\n attrs.push(`tcptype ${tcpType}`);\n }\n if (generation) {\n attrs.push(`generation ${generation}`);\n }\n if (username) {\n attrs.push(`ufrag ${username}`);\n }\n if (networkId) {\n attrs.push(`network-id ${networkId}`);\n }\n if (networkCost) {\n attrs.push(`network-cost ${networkCost}`);\n }\n if (attrs.length > 0) {\n candidate += ` ${attrs.join(' ')}`;\n }\n \n return { candidate, sdpMid, sdpMLineIndex };\n }\n \n static generateOffer(info) {\n if (isFirefox()) {\n return FirefoxP2PSdpBuilder.generateOffer(info);\n } else if (isSafari()) {\n return SafariP2PSdpBuilder.generateOffer(info);\n }\n \n return ChromeP2PSdpBuilder.generateOffer(info);\n }\n \n static generateAnswer(info) {\n if (isFirefox()) {\n return FirefoxP2PSdpBuilder.generateAnswer(info);\n } else if (isSafari()) {\n return SafariP2PSdpBuilder.generateAnswer(info);\n }\n \n return ChromeP2PSdpBuilder.generateAnswer(info);\n }\n}","/*\n * Copyright (c) 2018-present, Evgeny Nadymov\n *\n * This source code is licensed under the GPL v.3.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { addDataChannel, addExtmap, addPayloadTypes, addSsrc } from './p2PSdpBuilder';\n\nexport class FirefoxP2PSdpBuilder {\n static generateOffer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n let sdp = `v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, ssrc, ssrcGroups, payloadTypes, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n\n static generateAnswer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n let sdp = `v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, mid, ssrc, ssrcGroups, payloadTypes, dir, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n}","/*\n * Copyright (c) 2018-present, Evgeny Nadymov\n *\n * This source code is licensed under the GPL v.3.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { addDataChannel, addExtmap, addPayloadTypes, addSsrc } from './p2PSdpBuilder';\n\nexport class SafariP2PSdpBuilder {\n static generateOffer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n if (!media.length) {\n return `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n`;\n }\n\n let sdp = `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, ssrc, ssrcGroups, payloadTypes, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} audio${ssrc}`;\n }\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} video${ssrc}`;\n }\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n\n static generateAnswer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n if (!media.length) {\n return `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n`;\n }\n\n let sdp = `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, ssrc, ssrcGroups, payloadTypes, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} audio${ssrc}`;\n }\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} video${ssrc}`;\n }\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\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 {IS_SAFARI} from '../../environment/userAgent';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport debounce from '../../helpers/schedulers/debounce';\nimport {GroupCallParticipantVideoSourceGroup, PhoneCall, PhoneCallDiscardReason, PhoneCallProtocol, Update} from '../../layer';\nimport {emojiFromCodePoints} from '../../vendor/emoji';\nimport type {CallId} from '../appManagers/appCallsManager';\nimport type {AppManagers} from '../appManagers/managers';\nimport {logger} from '../logger';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport CallConnectionInstance from './callConnectionInstance';\nimport CallInstanceBase from './callInstanceBase';\nimport callsController from './callsController';\nimport CALL_STATE from './callState';\nimport {GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS} from './constants';\nimport parseSignalingData from './helpers/parseSignalingData';\nimport stopTrack from './helpers/stopTrack';\nimport localConferenceDescription, {ConferenceEntry, generateSsrc} from './localConferenceDescription';\nimport getCallProtocol from './p2P/getCallProtocol';\nimport getRtcConfiguration from './p2P/getRtcConfiguration';\nimport P2PEncryptor from './p2P/p2PEncryptor';\nimport {p2pParseCandidate, P2PSdpBuilder} from './p2P/p2PSdpBuilder';\nimport {parseSdp} from './sdp/utils';\nimport {WebRTCLineType} from './sdpBuilder';\nimport StreamManager from './streamManager';\nimport {AudioCodec, CallMediaState, CallSignalingData, DiffieHellmanInfo, P2PAudioCodec, P2PVideoCodec, VideoCodec} from './types';\n\nexport default class CallInstance extends CallInstanceBase<{\n state: (state: CALL_STATE) => void,\n id: (id: CallId, prevId: CallId) => void,\n muted: (muted: boolean) => void,\n mediaState: (mediaState: CallMediaState) => void,\n acceptCallOverride: () => Promise,\n}> {\n public dh: Partial;\n public id: CallId;\n public call: PhoneCall;\n public interlocutorUserId: UserId;\n public protocol: PhoneCallProtocol;\n public isOutgoing: boolean;\n public encryptionKey: Uint8Array;\n public connectionInstance: CallConnectionInstance;\n public encryptor: P2PEncryptor;\n public decryptor: P2PEncryptor;\n public candidates: RTCIceCandidate[];\n\n public offerReceived: boolean;\n public offerSent: boolean;\n\n public createdParticipantEntries: boolean;\n public release: () => Promise;\n public _connectionState: CALL_STATE;\n\n public createdAt: number;\n public connectedAt: number;\n public discardReason: string;\n\n private managers: AppManagers;\n\n private hangUpTimeout: number;\n\n private mediaStates: {\n input: CallMediaState,\n output?: CallMediaState\n };\n\n private sendMediaState: () => Promise;\n\n private decryptQueue: Uint8Array[];\n\n private getEmojisFingerprintPromise: Promise;\n private emojisFingerprint: [string, string, string, string];\n\n private wasStartingScreen: boolean;\n private wasStartingVideo: boolean;\n public wasTryingToJoin: boolean;\n\n public streamManager: StreamManager;\n\n constructor(options: {\n isOutgoing: boolean,\n interlocutorUserId: UserId,\n managers: CallInstance['managers'],\n protocol?: PhoneCallProtocol\n }) {\n super();\n\n this.log = logger('CALL');\n\n if(!this.protocol) {\n this.protocol = getCallProtocol();\n }\n\n safeAssign(this, options);\n\n this.createdAt = Date.now();\n this.offerReceived = false;\n this.offerSent = false;\n this.decryptQueue = [];\n this.candidates = [];\n\n this.addEventListener('state', (state) => {\n this.log('state', CALL_STATE[state]);\n\n if(state === CALL_STATE.CLOSED) {\n this.cleanup();\n }\n });\n\n const streamManager = this.streamManager = new StreamManager(GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS);\n streamManager.direction = 'sendrecv';\n streamManager.types.push('screencast');\n if(!this.isOutgoing) {\n streamManager.locked = true;\n streamManager.canCreateConferenceEntry = false;\n }\n\n let mediaState: CallMediaState = {\n '@type': 'MediaState',\n 'type': 'input',\n 'lowBattery': false,\n 'muted': true,\n 'screencastState': 'inactive',\n 'videoRotation': 0,\n 'videoState': 'inactive'\n };\n\n const self = this;\n mediaState = new Proxy(mediaState, {\n set: function(target, key, value) {\n // @ts-ignore\n target[key] = value;\n self.setMediaState(mediaState);\n self.sendMediaState();\n return true;\n }\n });\n\n this.mediaStates = {\n input: mediaState\n };\n\n this.sendMediaState = debounce(this._sendMediaState.bind(this), 0, false, true);\n }\n\n get connectionState() {\n const {_connectionState, connectionInstance} = this;\n if(_connectionState !== undefined) {\n return _connectionState;\n } else if(!connectionInstance) {\n return CALL_STATE.CONNECTING;\n } else {\n const {iceConnectionState} = connectionInstance.connection;\n if(iceConnectionState === 'closed') {\n return CALL_STATE.CLOSED;\n } else if(iceConnectionState !== 'connected' && (!IS_SAFARI || iceConnectionState !== 'completed')) {\n return CALL_STATE.CONNECTING;\n } else {\n return CALL_STATE.CONNECTED;\n }\n }\n }\n\n get sortIndex() {\n const connectionState = this.connectionState;\n const state = CALL_STATE.CLOSED - connectionState + 1;\n let index = state * 10000000000000;\n index += 2147483647000 - (connectionState === CALL_STATE.PENDING && this.isOutgoing ? 0 : this.createdAt);\n return index;\n }\n\n public getVideoElement(type: CallMediaState['type']) {\n if(type === 'input') return this.elements.get('main');\n else {\n const mediaState = this.getMediaState('output');\n if(!mediaState) {\n return;\n }\n\n const type: WebRTCLineType = mediaState.videoState === 'active' ? 'video' : (mediaState.screencastState === 'active' ? 'screencast' : undefined);\n if(!type) {\n return;\n }\n\n const entry = this.description.findEntry((entry) => entry.type === type);\n if(!entry) {\n return;\n }\n\n return this.elements.get('' + entry.recvEntry.source);\n }\n }\n\n public async startScreenSharingInternal() {\n try {\n this.wasStartingScreen = true;\n this.wasStartingVideo = false;\n this.streamManager.types = ['audio', 'screencast'];\n await this.requestScreen();\n } catch(err) {\n this.log.error('startScreenSharing error', err);\n }\n }\n\n public async toggleScreenSharing() {\n if(this.isSharingVideo) {\n await this.stopVideoSharing();\n }\n\n if(this.isSharingScreen) {\n return this.stopVideoSharing();\n } else {\n return this.startScreenSharingInternal();\n }\n }\n\n public async startVideoSharingInternal() {\n try {\n this.wasStartingScreen = false;\n this.wasStartingVideo = true;\n this.streamManager.types = ['audio', 'video'];\n await this.requestInputSource(false, true, false);\n } catch(err) {\n this.log.error('startVideoSharing error', err);\n }\n }\n\n public async stopVideoSharing() {\n const mediaState = this.getMediaState('input');\n mediaState.videoState = mediaState.screencastState = 'inactive';\n\n const {streamManager, description} = this;\n const track = streamManager.inputStream.getVideoTracks()[0];\n if(track) {\n stopTrack(track);\n streamManager.appendToConference(description); // clear sender track\n }\n }\n\n public async toggleVideoSharing() {\n if(this.isSharingScreen) {\n await this.stopVideoSharing();\n }\n\n if(this.isSharingVideo) {\n return this.stopVideoSharing();\n } else {\n return this.startVideoSharingInternal();\n }\n }\n\n public getMediaState(type: CallMediaState['type']) {\n return this.mediaStates[type];\n }\n\n public setMediaState(mediaState: CallMediaState) {\n this.mediaStates[mediaState.type] = mediaState;\n this.dispatchEvent('mediaState', mediaState);\n }\n\n public isSharingVideoType(type: 'video' | 'screencast') {\n try {\n const hasVideoTrack = super.isSharingVideo;\n return hasVideoTrack && !!((this.wasStartingScreen && type === 'screencast') || (this.wasStartingVideo && type === 'video'));\n\n // ! it will be used before the track appears\n // return !!this.description.entries.find((entry) => entry.type === type && entry.transceiver.sender.track.enabled);\n } catch(err) {\n return false;\n }\n }\n\n public get isSharingVideo() {\n return this.isSharingVideoType('video');\n }\n\n public get isSharingScreen() {\n return this.isSharingVideoType('screencast');\n }\n\n public get isMuted() {\n const audioTrack = this.streamManager.inputStream.getAudioTracks()[0];\n return !audioTrack?.enabled;\n }\n\n public get isClosing() {\n const {connectionState} = this;\n return connectionState === CALL_STATE.CLOSING || connectionState === CALL_STATE.CLOSED;\n }\n\n public get description(): localConferenceDescription {\n return this.connectionInstance?.description;\n }\n\n public setHangUpTimeout(timeout: number, reason: PhoneCallDiscardReason['_']) {\n this.clearHangUpTimeout();\n this.hangUpTimeout = ctx.setTimeout(() => {\n this.hangUpTimeout = undefined;\n this.hangUp(reason);\n }, timeout);\n }\n\n public clearHangUpTimeout() {\n if(this.hangUpTimeout !== undefined) {\n clearTimeout(this.hangUpTimeout);\n this.hangUpTimeout = undefined;\n }\n }\n\n public setPhoneCall(phoneCall: PhoneCall) {\n this.call = phoneCall;\n\n const {id} = phoneCall;\n if(this.id !== id) {\n const prevId = this.id;\n this.id = id;\n this.dispatchEvent('id', id, prevId);\n }\n }\n\n public async acceptCall() {\n const canAccept = (await Promise.all(this.dispatchResultableEvent('acceptCallOverride')))[0] ?? true;\n if(this.isClosing || !canAccept) {\n return;\n }\n\n // this.clearHangUpTimeout();\n this.overrideConnectionState(CALL_STATE.EXCHANGING_KEYS);\n\n const call = this.call as PhoneCall.phoneCallRequested;\n this.requestInputSource(true, !!call.pFlags.video, false);\n\n const g_a_hash = call.g_a_hash;\n this.managers.appCallsManager.generateDh().then(async(dh) => {\n this.dh = { // ! it is correct\n g_a_hash,\n b: dh.a,\n g_b: dh.g_a,\n g_b_hash: dh.g_a_hash,\n p: dh.p\n };\n\n return this.managers.apiManager.invokeApi('phone.acceptCall', {\n peer: await this.managers.appCallsManager.getCallInput(this.id),\n protocol: this.protocol,\n g_b: this.dh.g_b\n });\n }).then(async(phonePhoneCall) => {\n await this.managers.appCallsManager.savePhonePhoneCall(phonePhoneCall);\n }).catch((err) => {\n this.log.error('accept call error', err);\n // if(err.type === 'CALL_PROTOCOL_COMPAT_LAYER_INVALID') {\n\n // }\n\n this.hangUp('phoneCallDiscardReasonHangup');\n });\n }\n\n public joinCall() {\n this.log('joinCall');\n\n this.getEmojisFingerprint();\n\n this.overrideConnectionState();\n\n const {isOutgoing, encryptionKey, streamManager} = this;\n\n const configuration = getRtcConfiguration(this.call as PhoneCall.phoneCall);\n this.log('joinCall configuration', configuration);\n if(!configuration) return;\n\n const connectionInstance = this.connectionInstance = new CallConnectionInstance({\n call: this,\n streamManager,\n log: this.log.bindPrefix('connection')\n });\n\n const connection = connectionInstance.createPeerConnection(configuration);\n connection.addEventListener('iceconnectionstatechange', () => {\n const state = this.connectionState;\n if(this.connectedAt === undefined && state === CALL_STATE.CONNECTED) {\n this.connectedAt = Date.now();\n }\n\n this.dispatchEvent('state', state);\n });\n connection.addEventListener('negotiationneeded', () => {\n connectionInstance.negotiate();\n });\n connection.addEventListener('icecandidate', (event) => {\n const {candidate} = event;\n connection.log('onicecandidate', candidate);\n if(candidate?.candidate) {\n this.sendIceCandidate(candidate);\n }\n });\n connection.addEventListener('track', (event) => {\n const {track} = event;\n connection.log('ontrack', track);\n this.onTrack(event);\n });\n\n const description = connectionInstance.createDescription();\n\n this.encryptor = new P2PEncryptor(isOutgoing, encryptionKey);\n this.decryptor = new P2PEncryptor(!isOutgoing, encryptionKey);\n\n this.log('currentCall', this);\n\n if(isOutgoing) {\n connectionInstance.appendStreamToConference();\n }\n\n this.createDataChannel();\n\n this.processDecryptQueue();\n }\n\n private createDataChannelEntry() {\n const dataChannelEntry = this.description.createEntry('application');\n dataChannelEntry.setDirection('sendrecv');\n dataChannelEntry.sendEntry = dataChannelEntry.recvEntry = dataChannelEntry;\n }\n\n private createDataChannel() {\n if(this.connectionInstance.dataChannel) {\n return;\n }\n\n const channel = this.connectionInstance.createDataChannel({\n id: 0,\n negotiated: true\n });\n channel.addEventListener('message', (e) => {\n this.applyDataChannelData(JSON.parse(e.data));\n });\n channel.addEventListener('open', () => {\n this.sendMediaState();\n });\n }\n\n private applyDataChannelData(data: CallMediaState) {\n switch(data['@type']) {\n case 'MediaState': {\n data.type = 'output';\n this.log('got output media state', data);\n this.setMediaState(data);\n break;\n }\n\n default:\n this.log.error('unknown data channel data:', data);\n break;\n }\n }\n\n private _sendMediaState() {\n const {connectionInstance} = this;\n if(!connectionInstance) return;\n\n const mediaState = {...this.getMediaState('input')};\n // mediaState.videoRotation = 90;\n delete mediaState.type;\n this.log('sendMediaState', mediaState);\n\n connectionInstance.sendDataChannelData(mediaState);\n }\n\n public async sendCallSignalingData(data: CallSignalingData) {\n /* if(data['@type'] === 'InitialSetup') {\n this.filterNotVP8(data);\n } */\n\n const json = JSON.stringify(data);\n const arr = new TextEncoder().encode(json);\n const {bytes} = await this.encryptor.encryptRawPacket(arr);\n\n this.log('sendCallSignalingData', this.id, json);\n await this.managers.apiManager.invokeApi('phone.sendSignalingData', {\n peer: await this.managers.appCallsManager.getCallInput(this.id),\n data: bytes\n });\n }\n\n public sendIceCandidate(iceCandidate: RTCIceCandidate) {\n this.log('sendIceCandidate', iceCandidate);\n const {candidate, sdpMLineIndex} = iceCandidate;\n if(sdpMLineIndex !== 0) {\n return;\n }\n\n const parsed = p2pParseCandidate(candidate);\n // const parsed = {sdpString: candidate};\n /* if(parsed.address.ip !== '') {\n return;\n } */\n\n this.sendCallSignalingData({\n '@type': 'Candidates',\n 'candidates': [parsed]\n });\n }\n\n public async confirmCall() {\n const {protocol, id, call} = this;\n const dh = this.dh as DiffieHellmanInfo.a;\n\n // this.clearHangUpTimeout();\n this.overrideConnectionState(CALL_STATE.EXCHANGING_KEYS);\n const {key, key_fingerprint} = await this.managers.appCallsManager.computeKey((call as PhoneCall.phoneCallAccepted).g_b, dh.a, dh.p);\n\n const phonePhoneCall = await this.managers.apiManager.invokeApi('phone.confirmCall', {\n peer: await this.managers.appCallsManager.getCallInput(id),\n protocol: protocol,\n g_a: dh.g_a,\n key_fingerprint: key_fingerprint\n });\n\n this.encryptionKey = key;\n await this.managers.appCallsManager.savePhonePhoneCall(phonePhoneCall);\n this.joinCall();\n }\n\n public getEmojisFingerprint() {\n if(this.emojisFingerprint) return this.emojisFingerprint;\n if(this.getEmojisFingerprintPromise) return this.getEmojisFingerprintPromise;\n return this.getEmojisFingerprintPromise = apiManagerProxy.invokeCrypto('get-emojis-fingerprint', this.encryptionKey, this.dh.g_a).then((codePoints) => {\n this.getEmojisFingerprintPromise = undefined;\n return this.emojisFingerprint = codePoints.map((codePoints) => emojiFromCodePoints(codePoints)) as [string, string, string, string];\n });\n }\n\n private unlockStreamManager() {\n this.connectionInstance.streamManager.locked = false;\n this.connectionInstance.appendStreamToConference();\n }\n\n private async doTheMagic() {\n this.connectionInstance.appendStreamToConference();\n\n const connection = this.connectionInstance.connection;\n\n let answer = await connection.createAnswer();\n\n this.log('[sdp] local', answer.type, answer.sdp);\n await connection.setLocalDescription(answer);\n\n connection.getTransceivers().filter((transceiver) => transceiver.direction === 'recvonly').forEach((transceiver) => {\n const entry = this.connectionInstance.description.getEntryByMid(transceiver.mid);\n entry.transceiver = entry.recvEntry.transceiver = transceiver;\n transceiver.direction = 'sendrecv';\n });\n\n const isAnswer = false;\n\n const description = this.description;\n const bundle = description.entries.map((entry) => entry.mid);\n const sdpDescription: RTCSessionDescriptionInit = {\n type: isAnswer ? 'answer' : 'offer',\n sdp: description.generateSdp({\n bundle,\n entries: description.entries.filter((entry) => bundle.includes(entry.mid)),\n // isAnswer: isAnswer\n isAnswer: !isAnswer\n })\n };\n\n await connection.setRemoteDescription(sdpDescription);\n\n answer = await connection.createAnswer();\n\n await connection.setLocalDescription(answer);\n\n const initialSetup = parseSignalingData(parseSdp(answer.sdp));\n this.log('[InitialSetup] send 1');\n this.sendCallSignalingData(initialSetup);\n\n this.unlockStreamManager();\n }\n\n public overrideConnectionState(state?: CALL_STATE) {\n this._connectionState = state;\n this.dispatchEvent('state', this.connectionState);\n }\n\n public get duration() {\n return this.connectedAt !== undefined ? (Date.now() - this.connectedAt) / 1000 | 0 : 0;\n }\n\n protected onInputStream(stream: MediaStream): void {\n super.onInputStream(stream);\n\n const videoTrack = stream.getVideoTracks()[0];\n if(videoTrack) {\n const state = this.getMediaState('input');\n\n // handle starting camera\n if(!this.wasStartingScreen && !this.wasStartingVideo) {\n this.wasStartingVideo = true;\n }\n\n if(this.isSharingVideo) {\n state.videoState = 'active';\n } else if(this.isSharingScreen) {\n state.screencastState = 'active';\n }\n\n videoTrack.addEventListener('ended', () => {\n this.stopVideoSharing();\n }, {once: true});\n }\n\n if(stream.getAudioTracks().length) {\n this.onMutedChange();\n }\n }\n\n private onMutedChange() {\n const isMuted = this.isMuted;\n this.dispatchEvent('muted', isMuted);\n\n const state = this.getMediaState('input');\n state.muted = isMuted;\n }\n\n public toggleMuted(): Promise {\n return this.requestAudioSource(true).then(() => {\n this.setMuted();\n this.onMutedChange();\n });\n }\n\n public async hangUp(discardReason?: PhoneCallDiscardReason['_'], discardedByOtherParty?: boolean) {\n if(this.isClosing) {\n return;\n }\n\n this.discardReason = discardReason;\n this.log('hangUp', discardReason);\n this.overrideConnectionState(CALL_STATE.CLOSED);\n\n if(this.connectionInstance) {\n this.connectionInstance.closeConnectionAndStream(true);\n }\n\n if(discardReason && !discardedByOtherParty) {\n let hasVideo = false;\n for(const type in this.mediaStates) {\n const mediaState = this.mediaStates[type as 'input' | 'output'];\n hasVideo = mediaState.videoState === 'active' || mediaState.screencastState === 'active' || hasVideo;\n }\n\n await this.managers.appCallsManager.discardCall(this.id, this.duration, discardReason, hasVideo);\n }\n }\n\n private performCodec(_codec: P2PAudioCodec | P2PVideoCodec) {\n const payloadTypes: AudioCodec['payload-types'] = _codec.payloadTypes.map((payloadType) => {\n return {\n ...payloadType,\n 'rtcp-fbs': payloadType.feedbackTypes\n }\n });\n\n const codec: AudioCodec = {\n 'rtp-hdrexts': _codec.rtpExtensions,\n 'payload-types': payloadTypes\n };\n\n return codec;\n }\n\n private setDataToDescription(data: CallSignalingData.initialSetup) {\n this.description.setData({\n transport: {\n 'pwd': data.pwd,\n 'ufrag': data.ufrag,\n 'fingerprints': data.fingerprints,\n 'rtcp-mux': true\n },\n audio: this.performCodec(data.audio),\n video: data.video ? this.performCodec(data.video) as VideoCodec : undefined,\n screencast: data.screencast ? this.performCodec(data.screencast) as VideoCodec : undefined\n });\n }\n\n private filterNotVP8(initialSetup: CallSignalingData.initialSetup) {\n if(!this.isOutgoing) { // only VP8 works now\n [initialSetup.video, initialSetup.screencast].filter(Boolean).forEach((codec) => {\n const payloadTypes = codec.payloadTypes;\n const idx = payloadTypes.findIndex((payloadType) => payloadType.name === 'VP8');\n const vp8PayloadType = payloadTypes[idx];\n const rtxIdx = payloadTypes.findIndex((payloadType) => +payloadType.parameters?.apt === vp8PayloadType.id);\n codec.payloadTypes = [payloadTypes[idx], payloadTypes[rtxIdx]];\n });\n }\n }\n\n public async applyCallSignalingData(data: CallSignalingData) {\n this.log('applyCallSignalingData', this, data);\n\n const {connection, description} = this.connectionInstance;\n\n switch(data['@type']) {\n case 'InitialSetup': {\n this.log('[sdp] InitialSetup', data);\n\n this.filterNotVP8(data);\n this.setDataToDescription(data);\n\n const performSsrcGroups = (ssrcGroups: P2PVideoCodec['ssrcGroups']): GroupCallParticipantVideoSourceGroup[] => {\n return ssrcGroups.map((ssrcGroup) => {\n return {\n _: 'groupCallParticipantVideoSourceGroup',\n semantics: ssrcGroup.semantics,\n sources: ssrcGroup.ssrcs.map((source) => +source)\n };\n });\n };\n\n const ssrcs = [\n generateSsrc('audio', +data.audio.ssrc),\n data.video ? generateSsrc('video', performSsrcGroups(data.video.ssrcGroups)) : undefined,\n data.screencast ? generateSsrc('screencast', performSsrcGroups(data.screencast.ssrcGroups)) : undefined\n ].filter(Boolean);\n\n ssrcs.forEach((ssrc) => {\n let entry = description.getEntryBySource(ssrc.source);\n if(entry) {\n return;\n }\n\n const sendRecvEntry = description.findFreeSendRecvEntry(ssrc.type, false);\n entry = new ConferenceEntry(sendRecvEntry.mid, ssrc.type);\n entry.setDirection('sendrecv');\n sendRecvEntry.recvEntry = entry;\n\n description.setEntrySource(entry, ssrc.sourceGroups || ssrc.source);\n });\n\n this.createDataChannelEntry();\n\n const isAnswer = this.offerSent;\n this.offerSent = false;\n\n const bundle = description.entries.map((entry) => entry.mid);\n const sdpDescription: RTCSessionDescriptionInit = {\n type: isAnswer ? 'answer' : 'offer',\n sdp: description.generateSdp({\n bundle,\n entries: description.entries.filter((entry) => bundle.includes(entry.mid)),\n // isAnswer: isAnswer\n isAnswer: !isAnswer\n })\n };\n\n this.log('[sdp] remote', sdpDescription.sdp);\n\n await connection.setRemoteDescription(sdpDescription);\n\n await this.tryToReleaseCandidates();\n\n if(!isAnswer) {\n await this.doTheMagic();\n }\n\n break;\n }\n\n case 'Candidates': {\n for(const candidate of data.candidates) {\n const init: RTCIceCandidateInit = P2PSdpBuilder.generateCandidate(candidate);\n init.sdpMLineIndex = 0;\n const iceCandidate = new RTCIceCandidate(init);\n this.candidates.push(iceCandidate);\n }\n\n await this.tryToReleaseCandidates();\n break;\n }\n\n default: {\n this.log.error('unrecognized signaling data', data);\n }\n }\n }\n\n public async tryToReleaseCandidates() {\n const {connectionInstance} = this;\n if(!connectionInstance) {\n return;\n }\n\n const {connection} = connectionInstance;\n if(connection.remoteDescription) {\n const promises: Promise[] = this.candidates.map((candidate) => this.addIceCandidate(connection, candidate));\n this.candidates.length = 0;\n\n await Promise.all(promises);\n } else {\n this.log('[candidates] postpone');\n }\n }\n\n private async addIceCandidate(connection: RTCPeerConnection, candidate: RTCIceCandidate) {\n this.log('[candidate] start', candidate);\n try {\n // if(!candidate.address) return;\n await connection.addIceCandidate(candidate);\n this.log('[candidate] add', candidate);\n } catch(e) {\n this.log.error('[candidate] error', candidate, e);\n }\n }\n\n private async processDecryptQueue() {\n const {encryptor} = this;\n if(!encryptor) {\n this.log.warn('got encrypted signaling data before the encryption key');\n return;\n }\n\n const length = this.decryptQueue.length;\n if(!length) {\n return;\n }\n\n const queue = this.decryptQueue.slice();\n this.decryptQueue.length = 0;\n\n for(const data of queue) {\n const decryptedData = await encryptor.decryptRawPacket(data);\n if(!decryptedData) {\n continue;\n }\n\n // this.log('[update] updateNewCallSignalingData', update, decryptedData);\n\n const str = new TextDecoder().decode(decryptedData);\n try {\n const signalingData: CallSignalingData = JSON.parse(str);\n this.log('[update] updateNewCallSignalingData', signalingData);\n this.applyCallSignalingData(signalingData);\n } catch(err) {\n this.log.error('wrong signaling data', str);\n this.hangUp('phoneCallDiscardReasonDisconnect');\n callsController.dispatchEvent('incompatible', this.interlocutorUserId);\n }\n }\n }\n\n public onUpdatePhoneCallSignalingData(data: Uint8Array) {\n this.decryptQueue.push(data);\n this.processDecryptQueue();\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 {PhoneCallProtocol} from '../../../layer';\n\nexport default function getCallProtocol(): PhoneCallProtocol {\n return {\n _: 'phoneCallProtocol',\n pFlags: {\n udp_p2p: true,\n udp_reflector: true\n },\n min_layer: 92,\n max_layer: 92,\n library_versions: ['4.0.0']\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 {PhoneCall} from '../../../layer';\n\nexport default function getRtcConfiguration(call: PhoneCall.phoneCall): RTCConfiguration {\n const iceServers: RTCIceServer[] = [];\n call.connections.forEach((connection) => {\n switch(connection._) {\n /* case 'callServerTypeTelegramReflector': {\n break;\n } */\n case 'phoneConnectionWebrtc': {\n const {ip, ipv6, port, username, password} = connection;\n const urls: string[] = [];\n if(connection.pFlags.turn) {\n if(ip) {\n urls.push(`turn:${ip}:${port}`);\n }\n if(ipv6) {\n urls.push(`turn:[${ipv6}]:${port}`);\n }\n } else if(connection.pFlags.stun) {\n if(ip) {\n urls.push(`stun:${ip}:${port}`);\n }\n if(ipv6) {\n urls.push(`stun:[${ipv6}]:${port}`);\n }\n }\n\n if(urls.length > 0) {\n iceServers.push({\n urls,\n username,\n credential: password\n });\n }\n break;\n }\n }\n });\n\n return {\n iceServers,\n iceTransportPolicy: call.pFlags.p2p_allowed ? 'all' : 'relay'\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 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: DisplayMediaStreamOptions,\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 getScreenConstraints from './helpers/getScreenConstraints';\nimport getStreamCached from './helpers/getStreamCached';\nimport getVideoConstraints from './helpers/getVideoConstraints';\nimport stopTrack from './helpers/stopTrack';\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 this.onInputStream(stream);\n });\n }\n\n public requestScreen() {\n return this.getStream({\n isScreen: true,\n constraints: getScreenConstraints(true)\n }).then((stream) => {\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 } else {\n element.setAttribute('playsinline', 'true');\n element.muted = true;\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 videoTracks = stream.getVideoTracks();\n if(videoTracks.length) {\n this.saveInputVideoStream(stream, 'main');\n }\n\n const {streamManager, description} = this;\n streamManager.addStream(stream, 'input');\n\n if(description) {\n streamManager.appendToConference(description);\n }\n } else { // if call is declined earlier than stream appears\n stream.getTracks().forEach((track) => {\n stopTrack(track);\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\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 AudioAssetPlayer from '../../helpers/audioAssetPlayer';\n\nexport type CallAudioAssetName = 'call_busy.mp3' | 'call_connect.mp3' | 'call_end.mp3' | 'call_incoming.mp3' | 'call_outgoing.mp3' | 'voip_failed.mp3' | 'voip_connecting.mp3';\n\nlet audioAsset: AudioAssetPlayer;\nexport default function getCallAudioAsset() {\n return audioAsset ??= new AudioAssetPlayer([\n 'call_busy.mp3',\n 'call_connect.mp3',\n 'call_end.mp3',\n 'call_incoming.mp3',\n 'call_outgoing.mp3',\n 'voip_failed.mp3'\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 getCallAudioAsset, {CallAudioAssetName} from '../../components/call/getAudioAsset';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport IS_CALL_SUPPORTED from '../../environment/callSupport';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport insertInDescendSortedArray from '../../helpers/array/insertInDescendSortedArray';\nimport AudioAssetPlayer from '../../helpers/audioAssetPlayer';\nimport bytesCmp from '../../helpers/bytes/bytesCmp';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport tsNow from '../../helpers/tsNow';\nimport {PhoneCallProtocol} from '../../layer';\nimport {CallId} from '../appManagers/appCallsManager';\nimport {AppManagers} from '../appManagers/managers';\nimport {logger} from '../logger';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport {NULL_PEER_ID} from '../mtproto/mtproto_config';\nimport rootScope from '../rootScope';\nimport CallInstance from './callInstance';\nimport CALL_STATE from './callState';\n\nconst CALL_REQUEST_TIMEOUT = 45e3;\n\nexport class CallsController extends EventListenerBase<{\n instance: (details: {hasCurrent: boolean, instance: CallInstance}) => void,\n accepting: (instance: CallInstance) => void, // ัั‚ะพ ะบะพัั‚ั‹ะปัŒ. ะธัะฟะพะปัŒะทัƒะตั‚ัั ะฟั€ะธ ะฟะฐั€ะฐะปะปะตะปัŒะฝะพะผ ะฒั‹ะทะพะฒะต, ั‡ั‚ะพะฑั‹ ะทะฐะผะตะฝะธั‚ัŒ ะทะฒะพะฝะพะบ ะฒ topbarCall\n incompatible: (userId: UserId) => void,\n}> {\n private log: ReturnType;\n private managers: AppManagers;\n private audioAsset: AudioAssetPlayer;\n private instances: Map;\n private sortedInstances: Array;\n private tempId: number;\n\n public construct(managers: AppManagers) {\n this.managers = managers;\n this.log = logger('CC');\n\n if(!IS_CALL_SUPPORTED) {\n return;\n }\n\n this.audioAsset = getCallAudioAsset();\n this.tempId = 0;\n this.instances = new Map();\n this.sortedInstances = [];\n\n rootScope.addEventListener('call_update', async(call) => {\n let instance = this.instances.get(call.id);\n\n if(instance) {\n instance.setPhoneCall(call);\n }\n\n switch(call._) {\n case 'phoneCallDiscarded': {\n if(instance) {\n instance.hangUp(call.reason?._, true);\n }\n\n break;\n }\n\n case 'phoneCallAccepted': {\n if(instance) {\n /* if(!this.verifyProtocolCompatibility(call.protocol)) {\n instance.hangUp('phoneCallDiscardReasonDisconnect');\n rootScope.dispatchEvent('call_incompatible', instance.interlocutorUserId);\n break;\n } */\n\n instance.confirmCall();\n }\n\n break;\n }\n\n case 'phoneCallRequested': {\n if(!instance) {\n /* if(!this.verifyProtocolCompatibility(call.protocol)) {\n rootScope.dispatchEvent('call_incompatible', call.admin_id);\n break;\n } */\n\n instance = this.createCallInstance({\n isOutgoing: false,\n interlocutorUserId: call.admin_id\n });\n\n instance.overrideConnectionState(CALL_STATE.PENDING);\n instance.setPhoneCall(call);\n instance.setHangUpTimeout(CALL_REQUEST_TIMEOUT, 'phoneCallDiscardReasonMissed');\n }\n\n break;\n }\n\n case 'phoneCall': {\n if(!instance || instance.encryptionKey) {\n break;\n }\n\n const g_a = instance.dh.g_a = call.g_a_or_b;\n const dh = instance.dh;\n const g_a_hash = await apiManagerProxy.invokeCrypto('sha256', g_a);\n if(!bytesCmp(dh.g_a_hash, g_a_hash)) {\n this.log.error('Incorrect g_a_hash', dh.g_a_hash, g_a_hash);\n break;\n }\n\n const {key, key_fingerprint} = await this.managers.appCallsManager.computeKey(g_a, dh.b, dh.p);\n if(call.key_fingerprint !== key_fingerprint) {\n this.log.error('Incorrect key fingerprint', call.key_fingerprint, key_fingerprint, g_a, dh);\n instance.hangUp('phoneCallDiscardReasonDisconnect');\n break;\n }\n\n instance.encryptionKey = key;\n instance.joinCall();\n\n break;\n }\n }\n });\n\n rootScope.addEventListener('call_signaling', ({callId, data}) => {\n const instance = this.instances.get(callId);\n if(instance?.id !== callId) {\n return;\n }\n\n instance.onUpdatePhoneCallSignalingData(data);\n });\n }\n\n public get currentCall() {\n return this.sortedInstances[0];\n }\n\n public getCallByUserId(userId: UserId) {\n for(const [callId, instance] of this.instances) {\n if(instance.interlocutorUserId === userId) {\n return instance;\n }\n }\n }\n\n private createCallInstance(options: {\n isOutgoing: boolean,\n interlocutorUserId: UserId,\n protocol?: PhoneCallProtocol\n }) {\n const call = new CallInstance({\n managers: this.managers,\n ...options\n });\n\n call.addEventListener('state', (state) => {\n const currentCall = this.currentCall;\n if(state === CALL_STATE.CLOSED) {\n this.instances.delete(call.id);\n indexOfAndSplice(this.sortedInstances, call);\n } else {\n insertInDescendSortedArray(this.sortedInstances, call, 'sortIndex');\n }\n\n if(state === CALL_STATE.EXCHANGING_KEYS) {\n call.wasTryingToJoin = true;\n }\n\n const hasConnected = call.connectedAt !== undefined;\n if(state === CALL_STATE.EXCHANGING_KEYS || (state === CALL_STATE.CONNECTING && hasConnected)) {\n call.setHangUpTimeout(CALL_REQUEST_TIMEOUT, 'phoneCallDiscardReasonDisconnect');\n } else {\n call.clearHangUpTimeout();\n }\n\n if(currentCall === call || !currentCall) {\n if(state === CALL_STATE.CLOSED) {\n if(!call.isOutgoing && !call.wasTryingToJoin) { // incoming call has been accepted on other device or ended\n this.audioAsset.stopSound();\n } else if(call.wasTryingToJoin && !hasConnected) { // something has happened during the key exchanging\n this.audioAsset.playSound('voip_failed.mp3');\n } else {\n this.audioAsset.playSound(call.discardReason === 'phoneCallDiscardReasonBusy' ? 'call_busy.mp3' : 'call_end.mp3');\n }\n } else if(state === CALL_STATE.PENDING) {\n this.audioAsset.playSound(call.isOutgoing ? 'call_outgoing.mp3' : 'call_incoming.mp3', true);\n } else if(state === CALL_STATE.EXCHANGING_KEYS) {\n this.audioAsset.playSoundIfDifferent('call_connect.mp3');\n } else if(state === CALL_STATE.CONNECTING) {\n if(call.duration) {\n this.audioAsset.playSound('voip_connecting.mp3', true);\n }\n } else {\n this.audioAsset.stopSound();\n }\n }\n });\n\n call.addEventListener('id', (id, prevId) => {\n if(prevId !== undefined) {\n this.instances.delete(prevId);\n }\n\n const hasCurrent = !!this.currentCall;\n this.instances.set(id, call);\n\n if(prevId === undefined) {\n this.dispatchEvent('instance', {instance: call, hasCurrent: hasCurrent});\n }\n });\n\n return call;\n }\n\n public async startCallInternal(userId: UserId, isVideo: boolean) {\n this.log('p2pStartCallInternal', userId, isVideo);\n\n const fullInfo = await this.managers.appProfileManager.getProfile(userId);\n if(!fullInfo) return;\n\n const {video_calls_available} = fullInfo.pFlags;\n\n const call = this.createCallInstance({\n isOutgoing: true,\n interlocutorUserId: userId\n });\n\n call.requestInputSource(true, !!(isVideo && video_calls_available), false);\n\n call.overrideConnectionState(CALL_STATE.REQUESTING);\n call.setPhoneCall({\n _: 'phoneCallWaiting',\n access_hash: '',\n admin_id: NULL_PEER_ID,\n date: tsNow(true),\n id: --this.tempId,\n participant_id: userId,\n protocol: call.protocol,\n pFlags: {\n video: isVideo || undefined\n }\n });\n\n // return;\n this.managers.appCallsManager.generateDh().then(async(dh) => {\n call.dh = dh;\n\n return this.managers.appCallsManager.requestCall(userId, call.protocol, call.dh.g_a_hash, isVideo && video_calls_available);\n }).then((phoneCall) => {\n call.overrideConnectionState(CALL_STATE.PENDING);\n call.setPhoneCall(phoneCall);\n call.setHangUpTimeout(CALL_REQUEST_TIMEOUT, 'phoneCallDiscardReasonHangup');\n });\n }\n}\n\nconst callsController = new CallsController();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.callsController = callsController);\nexport default callsController;\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","/*\n * 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/forEachReverse';\nimport throttle from '../../helpers/schedulers/throttle';\nimport {GroupCallConnectionType, JoinGroupCallJsonPayload} from '../appManagers/appGroupCallsManager';\nimport {AppManagers} from '../appManagers/managers';\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 private managers: AppManagers;\n\n constructor(options: CallConnectionInstanceOptions & {\n groupCall: GroupCallConnectionInstance['groupCall'],\n type: GroupCallConnectionInstance['type'],\n options: GroupCallConnectionInstance['options'],\n managers: AppManagers\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 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 update = await this.managers.appGroupCallsManager.joinGroupCall(groupCallId, params, options);\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 if(this.options.type === 'presentation') {\n promise.then(() => {\n this.connection.getTransceivers().find((transceiver) => {\n if(transceiver.sender?.track?.kind === 'video') {\n transceiver.sender.setParameters({\n ...transceiver.sender.getParameters(),\n degradationPreference: 'maintain-resolution'\n });\n }\n });\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 {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/forEachReverse';\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 forEachReverse from '../../../helpers/array/forEachReverse';\nimport copy from '../../../helpers/object/copy';\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 const 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 type {GroupCallConnectionType, GroupCallId, GroupCallOutputSource} from '../appManagers/appGroupCallsManager';\nimport {IS_SAFARI} from '../../environment/userAgent';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport throttle from '../../helpers/schedulers/throttle';\nimport {GroupCall, GroupCallParticipant} from '../../layer';\nimport {logger} from '../logger';\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';\nimport getPeerId from '../appManagers/utils/peers/getPeerId';\nimport {AppManagers} from '../appManagers/managers';\nimport {generateSelfVideo, makeSsrcFromParticipant, makeSsrcsFromParticipant} from './groupCallsController';\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 private managers: AppManagers;\n\n constructor(options: {\n id: GroupCallInstance['id'],\n chatId: GroupCallInstance['chatId'],\n isSpeakingMap?: GroupCallInstance['isSpeakingMap'],\n connections?: GroupCallInstance['connections'],\n managers: AppManagers\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 this.managers.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 async getParticipantByPeerId(peerId: PeerId) {\n return NULL_PEER_ID === peerId ? this.participant : (await this.participants).get(peerId);\n }\n\n public toggleMuted() {\n return this.requestAudioSource(true).then(() => this.changeUserMuted(NULL_PEER_ID));\n }\n\n public async changeUserMuted(peerId: PeerId, muted?: boolean) {\n const participant = await this.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(participant, {muted});\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 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 managers: this.managers,\n ...options\n });\n }\n\n public changeRaiseHand(raise: boolean) {\n return this.editParticipant(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.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 this.managers.appGroupCallsManager.saveApiParticipant(this.id, this.participant);\n\n return this.managers.appGroupCallsManager.leaveGroupCallPresentation(this.id);\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 this.editParticipant(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.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 this.editParticipant(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 const d = discard || (this.joined ? this.connections.main.sources.audio.source : undefined);\n this.managers.appGroupCallsManager.hangUp(this.id, d);\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 this.getParticipantByPeerId(entry.peerId).then((participant) => {\n if(participant) {\n rootScope.dispatchEvent('group_call_participant', {groupCallId: this.id, participant});\n }\n });\n }\n\n return source;\n }\n\n public async editParticipant(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 isCurrentCall = true;\n const isUpdatingMeInCurrentCall = isCurrentCall && participant.pFlags.self;\n\n if(isUpdatingMeInCurrentCall) {\n if(options.muted !== undefined && !this.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 = generateSelfVideo(this.connections.main.sources.video);\n }\n\n if(!participant.pFlags.muted && participant.pFlags.can_self_unmute) {\n this.setMuted(false);\n }\n\n this.dispatchEvent('state', this.state);\n }\n\n // rootScope.dispatchEvent('group_call_participant', {groupCallId, participant});\n\n /* if(participant.pFlags.self) {\n processUpdate = false;\n } */\n }\n\n return this.managers.appGroupCallsManager.editParticipant(this.id, participant, options);\n }\n\n public onParticipantUpdate(participant: GroupCallParticipant, doNotDispatchParticipantUpdate?: PeerId) {\n const connectionInstance = this.connections.main;\n const {connection, description} = connectionInstance;\n\n const peerId = 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} = 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 ? [] : 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","/*\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\nimport AudioAssetPlayer from '../../helpers/audioAssetPlayer';\n\nexport type GroupCallAudioAssetName = 'group_call_connect.mp3' | 'group_call_end.mp3' | 'group_call_start.mp3' | 'voip_onallowtalk.mp3';\n\nlet audioAsset: AudioAssetPlayer;\nexport default function getGroupCallAudioAsset() {\n return 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 * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getGroupCallAudioAsset from '../../components/groupCall/getAudioAsset';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport {GroupCallParticipant, GroupCallParticipantVideo, GroupCallParticipantVideoSourceGroup} from '../../layer';\nimport {GroupCallId, GroupCallConnectionType} from '../appManagers/appGroupCallsManager';\nimport {AppManagers} from '../appManagers/managers';\nimport {logger} from '../logger';\nimport rootScope from '../rootScope';\nimport GroupCallInstance from './groupCallInstance';\nimport GROUP_CALL_STATE from './groupCallState';\nimport createMainStreamManager from './helpers/createMainStreamManager';\nimport {generateSsrc} from './localConferenceDescription';\nimport {WebRTCLineType} from './sdpBuilder';\nimport StreamManager from './streamManager';\nimport {Ssrc} from './types';\n\nconst IS_MUTED = true;\n\nexport function makeSsrcsFromParticipant(participant: GroupCallParticipant) {\n return [\n makeSsrcFromParticipant(participant, 'audio', participant.source),\n participant.video?.audio_source && makeSsrcFromParticipant(participant, 'audio', participant.video.audio_source),\n participant.video && makeSsrcFromParticipant(participant, 'video', participant.video.source_groups, participant.video.endpoint),\n participant.presentation?.audio_source && makeSsrcFromParticipant(participant, 'audio', participant.presentation.audio_source),\n participant.presentation && makeSsrcFromParticipant(participant, 'video', participant.presentation.source_groups, participant.presentation.endpoint)\n ].filter(Boolean);\n};\n\nexport function makeSsrcFromParticipant(participant: GroupCallParticipant, type: WebRTCLineType, source?: number | GroupCallParticipantVideoSourceGroup[], endpoint?: string): Ssrc {\n return generateSsrc(type, source, endpoint);\n}\n\nexport function 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\nexport class GroupCallsController extends EventListenerBase<{\n instance: (instance: GroupCallInstance) => void\n}> {\n private audioAsset: ReturnType;\n private log: ReturnType;\n private currentGroupCall: GroupCallInstance;\n private managers: AppManagers;\n\n public construct(managers: AppManagers) {\n this.managers = managers;\n this.audioAsset = getGroupCallAudioAsset();\n this.log = logger('GCC');\n\n rootScope.addEventListener('group_call_update', (groupCall) => {\n const {currentGroupCall} = this;\n if(currentGroupCall?.id === groupCall.id) {\n currentGroupCall.groupCall = groupCall;\n\n if(groupCall._ === 'groupCallDiscarded') {\n currentGroupCall.hangUp(false, false, true);\n }\n }\n });\n\n rootScope.addEventListener('group_call_participant', ({groupCallId, participant}) => {\n const {currentGroupCall} = this;\n if(currentGroupCall?.id === groupCallId) {\n currentGroupCall.onParticipantUpdate(participant/* , this.doNotDispatchParticipantUpdate */);\n }\n });\n }\n\n get groupCall() {\n return this.currentGroupCall;\n }\n\n public setCurrentGroupCall(groupCall: GroupCallInstance) {\n this.currentGroupCall = groupCall;\n\n if(groupCall) {\n this.dispatchEvent('instance', groupCall);\n }\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 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 .then(() => {\n // have to refresh participants because of the new connection\n const {currentGroupCall} = this;\n currentGroupCall.participants.then((participants) => {\n if(this.currentGroupCall !== currentGroupCall || currentGroupCall.state === GROUP_CALL_STATE.CLOSED) {\n return;\n }\n\n participants.forEach((participant) => {\n if(!participant.pFlags.self) {\n currentGroupCall.onParticipantUpdate(participant);\n }\n });\n });\n });\n }\n\n private 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 managers: this.managers\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.managers.appGroupCallsManager.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 this.managers.appGroupCallsManager.getGroupCallParticipants(groupCallId);\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\nconst groupCallsController = new GroupCallsController();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.groupCallController = groupCallsController);\nexport default groupCallsController;\n","/*\n * 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","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","export default function getScreenConstraints(skipAudio?: boolean) {\n const constraints: DisplayMediaStreamOptions = {\n video: {\n // @ts-ignore\n // cursor: 'always',\n width: {max: 1920},\n height: {max: 1080},\n frameRate: {max: 30}\n }\n };\n\n if(!skipAudio) {\n constraints.audio = true;\n }\n\n return constraints;\n}\n","export default async function getScreenStream(constraints: DisplayMediaStreamOptions) {\n const screenStream = await navigator.mediaDevices.getDisplayMedia(constraints);\n const track = screenStream.getVideoTracks()[0];\n track.contentHint = 'text';\n return screenStream;\n}\n","export default async function getStream(constraints: MediaStreamConstraints, muted: boolean) {\n // console.log('getStream', constraints);\n\n const stream = await navigator.mediaDevices.getUserMedia(constraints);\n stream.getTracks().forEach((x) => {\n x.enabled = !muted;\n });\n\n // console.log('getStream result', stream);\n return 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\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","import simulateEvent from '../../../helpers/dom/dispatchEvent';\n\nexport default function stopTrack(track: MediaStreamTrack) {\n track.stop();\n simulateEvent(track, 'ended');\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/indexOfAndSplice';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {GroupCallParticipantVideoSourceGroup} from '../../layer';\nimport {fixMediaLineType, 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(fixMediaLineType(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 public readonly screencast?: 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","/*\n * 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, lines: SDPLine[] = [];\n const mediaSections: SDPMediaSection[] = [];\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 * 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\n// screencast is for Peer-to-Peer only\nexport type WebRTCLineTypeTrue = 'video' | 'audio' | 'application';\nexport type WebRTCLineType = WebRTCLineTypeTrue | 'screencast';\n\nexport const WEBRTC_MEDIA_PORT = '9';\n\nexport function fixMediaLineType(mediaType: WebRTCLineType) {\n return mediaType === 'screencast' ? 'video' : mediaType;\n}\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 return mediaType === 'application' ? 'DTLS/SCTP' : 'UDP/TLS/RTP/SAVPF';\n}\n\nexport function generateMediaFirstLine(mediaType: WebRTCLineType, port = WEBRTC_MEDIA_PORT, payloadIds: (string | number)[]) {\n const connectionType = getConnectionTypeForMediaType(mediaType);\n return `m=${fixMediaLineType(mediaType)} ${port} ${connectionType} ${payloadIds.join(' ')}`;\n}\n\ntype ConferenceData = UpdateGroupCallConnectionData | LocalConferenceDescription;\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=${fixMediaLineType(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\nimport EventListenerBase from '../../helpers/eventListenerBase';\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 {fixMediaLineType, WebRTCLineType} from './sdpBuilder';\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 public static ANALYSER_LISTENER = new EventListenerBase<{amplitude: (details: {amplitudes: StreamAmplitude[], type: 'all' | 'input'}) => void}>();\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 locked: boolean;\n public types: WebRTCLineType[];\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 this.types = ['audio', 'video'];\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 StreamManager.ANALYSER_LISTENER.dispatchEvent('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.locked) {\n return;\n }\n\n const {inputStream, direction, canCreateConferenceEntry} = this;\n const transceiverInit: RTCRtpTransceiverInit = {direction, streams: [inputStream]};\n const types = this.types.map((type) => {\n return [\n type,\n /* type === 'video' || type === 'screencast' ?\n {sendEncodings: [{maxBitrate: 2500000}], ...transceiverInit} : */\n transceiverInit\n ] as const;\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 /* if(this.isScreenSharingManager) {\n transceiver.sender.setParameters({\n ...transceiver.sender.getParameters(),\n degradationPreference: 'maintain-resolution'\n });\n } */\n }\n\n if(entry.direction !== transceiver.direction) {\n transceiver.direction = entry.direction;\n }\n\n const mediaTrackType = fixMediaLineType(type);\n const trackIdx = tracks.findIndex((track) => track.kind === mediaTrackType);\n const track = trackIdx !== -1 ? tracks.splice(trackIdx, 1)[0] : undefined;\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","/*\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 this.lines = [];\n this.newLine = [];\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","/*\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 return 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 return source >>> 0;\n}\n\nexport function getAmplitude(array: Uint8Array, scale = 3) {\n if(!array) return 0;\n\n const {length} = array;\n let total = 0;\n for(let i = 0; i < length; ++i) {\n total += array[i] * array[i];\n }\n const rms = Math.sqrt(total / length) / 255;\n\n return 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\nimport {MessageEntity} from '../../layer';\nimport getEmojiEntityFromEmoji from './getEmojiEntityFromEmoji';\nimport emojiRegExp from '../../vendor/emoji/regex';\n\nconst EMOJI_REG_EXP = new RegExp(`(^${emojiRegExp})`);\n\nexport default function getAbbreviation(str: string, onlyFirst = false): {\n text: string,\n entities: MessageEntity[]\n} {\n const splitted = (str || '').trim().split(' ');\n if(!splitted[0]) return {text: '', entities: []};\n\n const entities: MessageEntity.messageEntityEmoji[] = [];\n\n const firstEmojiMatch = splitted[0].match(EMOJI_REG_EXP);\n const first = firstEmojiMatch?.[0] || splitted[0][0];\n if(firstEmojiMatch) {\n entities.push(getEmojiEntityFromEmoji(first));\n }\n\n const length = splitted.length;\n if(onlyFirst || length === 1) return {text: first, entities};\n\n const lastEmojiMatch = splitted[length - 1].match(EMOJI_REG_EXP);\n const last = lastEmojiMatch?.[0] || splitted[length - 1][0];\n if(lastEmojiMatch) {\n entities.push({\n ...getEmojiEntityFromEmoji(last),\n offset: first.length\n });\n }\n\n return {text: first + last, entities};\n}\n","import {MessageEntity} from '../../layer';\nimport {toCodePoints} from '../../vendor/emoji';\n\nexport default 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","import {EMAIL_REG_EXP} from '.';\n\nexport default function matchEmail(text: string) {\n return !text ? null : text.match(EMAIL_REG_EXP);\n}\n","export default function setBlankToAnchor(anchor: HTMLAnchorElement) {\n anchor.target = '_blank';\n anchor.rel = 'noopener noreferrer';\n return anchor;\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 wrapEmojiText from './wrapEmojiText';\nimport getAbbreviation from './getAbbreviation';\n\nexport default function wrapAbbreviation(str: string, onlyFirst?: boolean) {\n const {text, entities} = getAbbreviation(str, onlyFirst);\n return wrapEmojiText(text, undefined, entities);\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 '../rootScope';\nimport wrapRichText from './wrapRichText';\n\nexport default function wrapDraftText(text: string, options: Partial<{\n wrappingForPeerId: PeerId\n}> & Parameters[1] = {}) {\n if(!text) {\n return wrapRichText('');\n }\n\n let entities = options.entities;\n if(entities && !rootScope.premium && options.wrappingForPeerId !== rootScope.myId) {\n entities = entities.filter((entity) => entity._ !== 'messageEntityCustomEmoji');\n }\n\n const fragment = wrapRichText(text, {\n ...options,\n entities,\n noLinks: true,\n wrappingDraft: true,\n passEntities: {\n messageEntityTextUrl: true,\n messageEntityMentionName: true\n }\n });\n\n return fragment;\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 {MessageEntity} from '../../layer';\nimport parseEntities from './parseEntities';\nimport wrapRichText from './wrapRichText';\n\nexport default function wrapEmojiText(text: string, isDraft = false, entities?: MessageEntity[]) {\n if(!text) return wrapRichText('');\n\n entities ??= parseEntities(text).filter((e) => e._ === 'messageEntityEmoji');\n return wrapRichText(text, {entities, wrappingDraft: isDraft});\n}\n","import IS_EMOJI_SUPPORTED from './emojiSupport';\n\nexport type EMOJI_VERSION = '' | '14';\n\nconst EMOJI_VERSIONS_SUPPORTED: {\n [v in EMOJI_VERSION]: boolean\n} = {} as any;\n\n// Thanks to WebZ for the detect\nfunction isEmojiSupported(emoji: string) {\n const ALLOWABLE_CALCULATION_ERROR_SIZE = 5;\n const inlineEl = document.createElement('span');\n inlineEl.classList.add('emoji');\n document.body.appendChild(inlineEl);\n\n inlineEl.innerText = emoji; // Emoji from 14.0 version\n const newEmojiWidth = inlineEl.offsetWidth;\n inlineEl.innerText = 'โค๏ธ'; // Emoji from 1.0 version\n const legacyEmojiWidth = inlineEl.offsetWidth;\n\n document.body.removeChild(inlineEl);\n\n return Math.abs(newEmojiWidth - legacyEmojiWidth) < ALLOWABLE_CALCULATION_ERROR_SIZE;\n}\n\nif(IS_EMOJI_SUPPORTED) {\n EMOJI_VERSIONS_SUPPORTED[''] = true;\n\n const a: [keyof typeof EMOJI_VERSIONS_SUPPORTED, string][] = [\n ['14', '๐Ÿซฑ๐Ÿป']\n ];\n\n a.forEach(([version, emoji]) => {\n EMOJI_VERSIONS_SUPPORTED[version] = isEmojiSupported(emoji);\n });\n}\n\nexport default EMOJI_VERSIONS_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 {EMOJI_VERSION} from '../../environment/emojiVersionsSupport';\nimport {SITE_HASHTAGS} from '.';\nimport {EmojiVersions} from '../../config/emoji';\nimport IS_EMOJI_SUPPORTED from '../../environment/emojiSupport';\nimport buildURLHash from '../../helpers/buildURLHash';\nimport copy from '../../helpers/object/copy';\nimport encodeEntities from '../../helpers/string/encodeEntities';\nimport {MessageEntity} from '../../layer';\nimport encodeSpoiler from './encodeSpoiler';\nimport parseEntities from './parseEntities';\nimport setBlankToAnchor from './setBlankToAnchor';\nimport wrapUrl from './wrapUrl';\nimport EMOJI_VERSIONS_SUPPORTED from '../../environment/emojiVersionsSupport';\nimport {CLICK_EVENT_NAME} from '../../helpers/dom/clickEvent';\nimport IS_CUSTOM_EMOJI_SUPPORTED from '../../environment/customEmojiSupport';\nimport rootScope from '../rootScope';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport wrapSticker, {videosCache} from '../../components/wrappers/sticker';\nimport RLottiePlayer, {getLottiePixelRatio} from '../rlottie/rlottiePlayer';\nimport animationIntersector, {AnimationItemGroup} from '../../components/animationIntersector';\nimport type {MyDocument} from '../appManagers/appDocsManager';\nimport LazyLoadQueue from '../../components/lazyLoadQueue';\nimport {Awaited} from '../../types';\nimport {MediaSize} from '../../helpers/mediaSize';\nimport IS_WEBM_SUPPORTED from '../../environment/webmSupport';\nimport assumeType from '../../helpers/assumeType';\nimport noop from '../../helpers/noop';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport getViewportSlice from '../../helpers/dom/getViewportSlice';\nimport {getMiddleware, Middleware, MiddlewareHelper} from '../../helpers/middleware';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport BOM from '../../helpers/string/bom';\nimport framesCache from '../../helpers/framesCache';\nimport wrapTelegramUrlToAnchor from './wrapTelegramUrlToAnchor';\n\nconst resizeObserver = new ResizeObserver((entries) => {\n for(const entry of entries) {\n const renderer = entry.target.parentElement as CustomEmojiRendererElement;\n renderer.setDimensionsFromRect(entry.contentRect);\n }\n});\n\nconst globalLazyLoadQueue = new LazyLoadQueue();\n\nexport class CustomEmojiElement extends HTMLElement {\n public elements: CustomEmojiElements;\n public renderer: CustomEmojiRendererElement;\n public player: RLottiePlayer | HTMLVideoElement;\n public paused: boolean;\n public syncedPlayer: SyncedPlayer;\n public clean: boolean;\n public lastChildWas: Node;\n // public docId: DocId;\n public placeholder: HTMLImageElement;\n public middlewareHelper: MiddlewareHelper;\n\n constructor() {\n super();\n this.paused = true;\n this.classList.add('custom-emoji');\n }\n\n public get docId() {\n return this.dataset.docId;\n }\n\n public static create(docId: DocId) {\n const element = new CustomEmojiElement();\n // element.docId = docId;\n element.dataset.docId = '' + docId;\n return element;\n }\n\n public get isConnected() {\n return this.placeholder?.isConnected ?? super.isConnected;\n }\n\n public connectedCallback() {\n // if(this.isConnected) {\n // return;\n // }\n\n if(this.player) {\n animationIntersector.addAnimation(this, this.renderer.animationGroup, undefined, true);\n }\n\n // this.connectedCallback = undefined;\n }\n\n public disconnectedCallback() {\n if(this.isConnected || !this.renderer?.isSelectable) { // prepend on sibling can invoke disconnectedCallback\n return;\n }\n\n this.clear();\n }\n\n public destroy() {\n this.clear();\n }\n\n public clear(replaceChildren = true) {\n if(this.clean) {\n return;\n }\n\n // if(this.docId === '5399836826758290421') {\n // console.log('clear', this, this.isConnected);\n // }\n\n this.clean = true;\n this.pause();\n\n const {syncedPlayer} = this;\n if(syncedPlayer) {\n syncedPlayer.pausedElements.delete(this);\n }\n\n this.middlewareHelper?.clean();\n\n if(this.renderer) {\n const elements = this.renderer.customEmojis.get(this.docId);\n if(elements?.delete(this) && !elements.size) {\n this.renderer.customEmojis.delete(this.docId);\n this.renderer.playersSynced.delete(elements);\n }\n\n if(replaceChildren) {\n if(this.renderer.isSelectable) {\n this.replaceChildren(createCustomFiller(true));\n } else {\n // otherwise https://bugs.chromium.org/p/chromium/issues/detail?id=1144736#c27 will happen\n this.replaceChildren();\n }\n }\n }\n\n if(this.player) {\n animationIntersector.removeAnimationByPlayer(this);\n }\n\n if(globalLazyLoadQueue) {\n globalLazyLoadQueue.delete({div: this});\n }\n\n /* this.disconnectedCallback = */this.elements =\n this.renderer =\n this.player =\n this.syncedPlayer =\n undefined;\n }\n\n public pause() {\n if(this.paused) {\n return;\n }\n\n this.paused = true;\n\n if(this.player instanceof HTMLVideoElement && !this.syncedPlayer) {\n this.renderer.lastPausedVideo = this.player;\n this.player.pause();\n }\n\n if(this.syncedPlayer && !this.syncedPlayer.pausedElements.has(this)) {\n this.syncedPlayer.pausedElements.add(this);\n\n if(this.syncedPlayer.player && this.syncedPlayer.pausedElements.size === this.syncedPlayer.middlewares.size) {\n this.syncedPlayer.player.pause();\n }\n }\n }\n\n public play() {\n if(!this.paused) {\n return;\n }\n\n this.paused = false;\n\n if(this.player instanceof HTMLVideoElement) {\n this.player.currentTime = this.renderer.lastPausedVideo?.currentTime || this.player.currentTime;\n this.player.play().catch(noop);\n }\n\n if(this.syncedPlayer && this.syncedPlayer.pausedElements.has(this)) {\n this.syncedPlayer.pausedElements.delete(this);\n\n if(this.syncedPlayer.pausedElements.size !== this.syncedPlayer.middlewares.size) {\n this.player.play();\n }\n }\n }\n\n public remove() {\n this.clear();\n // this.elements = this.renderer = this.player = undefined;\n }\n\n public get autoplay() {\n return true;\n }\n}\n\ntype CustomEmojiElements = Set;\n\nexport class CustomEmojiRendererElement extends HTMLElement {\n public canvas: HTMLCanvasElement;\n public context: CanvasRenderingContext2D;\n\n public playersSynced: Map;\n public clearedElements: WeakSet;\n public customEmojis: Parameters[1]['customEmojis'];\n public lastPausedVideo: HTMLVideoElement;\n\n public lastRect: DOMRect;\n public isDimensionsSet: boolean;\n\n public animationGroup: AnimationItemGroup;\n public size: MediaSize;\n\n public isSelectable: boolean;\n public isCanvasClean: boolean;\n\n public ignoreSettingDimensions: boolean;\n\n public forceRenderAfterSize: boolean;\n\n public middlewareHelper: MiddlewareHelper;\n\n public auto: boolean;\n\n constructor() {\n super();\n\n this.classList.add('custom-emoji-renderer');\n this.canvas = document.createElement('canvas');\n this.canvas.classList.add('custom-emoji-canvas');\n this.context = this.canvas.getContext('2d');\n this.append(this.canvas);\n\n this.playersSynced = new Map();\n this.clearedElements = new WeakSet();\n this.customEmojis = new Map();\n\n this.animationGroup = 'EMOJI';\n this.isCanvasClean = false;\n }\n\n public connectedCallback() {\n if(emojiRenderers.has(this)) {\n return;\n }\n\n // this.setDimensions();\n // animationIntersector.addAnimation(this, this.animationGroup);\n resizeObserver.observe(this.canvas);\n emojiRenderers.add(this);\n\n this.connectedCallback = undefined;\n }\n\n public disconnectedCallback() {\n if(this.isConnected || !this.auto) {\n return;\n }\n\n this.destroy?.();\n\n this.disconnectedCallback = undefined;\n }\n\n public destroy() {\n // if(this.isConnected) {\n // return;\n // }\n\n resizeObserver.unobserve(this.canvas);\n\n this.customEmojis.forEach((elements) => {\n elements.forEach((element) => {\n element.clear();\n });\n });\n\n emojiRenderers.delete(this);\n this.playersSynced.clear();\n this.middlewareHelper?.clean();\n this.customEmojis.clear();\n\n this.destroy =\n this.lastPausedVideo =\n undefined;\n }\n\n public getOffsets(offsetsMap: Map = new Map()) {\n if(!this.playersSynced.size) {\n return offsetsMap;\n }\n\n const overflowElement = findUpClassName(this, 'scrollable') || this.offsetParent as HTMLElement;\n if(!overflowElement) {\n return offsetsMap;\n }\n\n const overflowRect = overflowElement.getBoundingClientRect();\n const rect = this.getBoundingClientRect();\n\n for(const elements of this.playersSynced.keys()) {\n const elementsArr = Array.from(elements);\n const placeholders = this.isSelectable ? elementsArr.map((element) => element.placeholder) : elementsArr;\n const {visible} = getViewportSlice({\n overflowElement,\n overflowRect,\n elements: placeholders,\n extraSize: this.size.height * 2.5 // let's add some margin\n });\n\n const offsets = visible.map(({rect: elementRect}) => {\n const top = elementRect.top - rect.top;\n const left = elementRect.left - rect.left;\n return {top, left, width: elementRect.width};\n });\n\n if(offsets.length) {\n offsetsMap.set(elements, offsets);\n }\n }\n\n // const rect = this.getBoundingClientRect();\n // const visibleRect = getVisibleRect(this, overflowElement, undefined, rect);\n // const minTop = visibleRect ? visibleRect.rect.top - this.size.height : 0;\n // const maxTop = Infinity;\n // for(const elements of this.playersSynced.keys()) {\n // const offsets = elements.map((element) => {\n // const elementRect = element.getBoundingClientRect();\n // const top = elementRect.top - rect.top;\n // const left = elementRect.left - rect.left;\n // return top >= minTop && (top + elementRect.height) <= maxTop ? {top, left} : undefined;\n // }).filter(Boolean);\n\n // if(offsets.length) {\n // offsetsMap.set(elements, offsets);\n // }\n // }\n\n return offsetsMap;\n }\n\n public clearCanvas() {\n if(this.isCanvasClean) {\n return;\n }\n\n const {context, canvas} = this;\n context.clearRect(0, 0, canvas.width, canvas.height);\n this.isCanvasClean = true;\n }\n\n public render(offsetsMap: ReturnType) {\n const {context, canvas, isDimensionsSet} = this;\n if(!isDimensionsSet) {\n this.setDimensionsFromRect(undefined, false);\n }\n\n this.isCanvasClean = false;\n\n const {width, height, dpr} = canvas;\n for(const [elements, offsets] of offsetsMap) {\n const player = this.playersSynced.get(elements);\n const frame = syncedPlayersFrames.get(player) || (player instanceof HTMLVideoElement ? player : undefined);\n if(!frame) {\n continue;\n }\n\n const isImageData = frame instanceof ImageData;\n let frameWidth: number, frameHeight: number;\n if(player instanceof HTMLVideoElement) {\n frameWidth = this.size.width * dpr;\n frameHeight = this.size.height * dpr;\n } else {\n frameWidth = frame.width;\n frameHeight = frame.height;\n }\n\n // ! check performance of scaling\n const elementWidth = Math.round(offsets[0].width * dpr);\n if(elementWidth !== frameWidth) {\n // if(this.size.width === 36) {\n // console.warn('different width', elementWidth, frameWidth, this);\n // }\n\n frameWidth = elementWidth;\n frameHeight = elementWidth;\n }\n\n const maxTop = height - frameHeight;\n const maxLeft = width - frameWidth;\n\n if(!this.clearedElements.has(elements) && !this.isSelectable) {\n if(this.isSelectable/* && false */) {\n elements.forEach((element) => {\n element.lastChildWas ??= element.lastChild;\n replaceContent(element, element.firstChild);\n });\n } else {\n elements.forEach((element) => {\n element.replaceChildren();\n });\n }\n\n this.clearedElements.add(elements);\n }\n\n offsets.forEach(({top, left}) => {\n top = Math.round(top * dpr), left = Math.round(left * dpr);\n if(left < 0 ||/* top > maxTop || */left > maxLeft) {\n return;\n }\n\n if(isImageData) {\n context.putImageData(frame, left, top);\n } else {\n // context.clearRect(left, top, width, height);\n context.drawImage(frame, left, top, frameWidth, frameHeight);\n }\n });\n }\n }\n\n public checkForAnyFrame() {\n for(const player of this.playersSynced.values()) {\n if(syncedPlayersFrames.has(player) || player instanceof HTMLVideoElement) {\n return true;\n }\n }\n\n return false;\n }\n\n public remove() {\n super.remove();\n // this.canvas.remove();\n }\n\n // public setDimensions() {\n // const {canvas} = this;\n // sequentialDom.mutateElement(canvas, () => {\n // const rect = canvas.getBoundingClientRect();\n // this.setDimensionsFromRect(rect);\n // });\n // }\n\n public setDimensionsFromRect(rect: DOMRect = this.lastRect, forceRenderAfter = true) {\n const {canvas} = this;\n const {dpr} = canvas;\n\n if(this.lastRect !== rect) {\n this.lastRect = rect;\n }\n\n if(!rect || !dpr || this.ignoreSettingDimensions) {\n return;\n }\n\n const {width, height} = rect;\n // if(this.isSelectable) {\n // height = this.parentElement.scrollHeight || height;\n\n // this.style.width = width + 'px';\n // this.style.height = height + 'px';\n // }\n\n const newWidth = Math.floor(Math.round(width * dpr));\n const newHeight = Math.floor(Math.round(height * dpr));\n if(canvas.width === newWidth && canvas.height === newHeight) {\n return;\n }\n\n canvas.width = newWidth;\n canvas.height = newHeight;\n this.isDimensionsSet = true;\n this.isCanvasClean = true;\n\n if(this.forceRenderAfterSize || (this.isSelectable && forceRenderAfter)) {\n this.forceRenderAfterSize = undefined;\n this.forceRender();\n }\n }\n\n public forceRender() {\n if(!this.isDimensionsSet) {\n return;\n }\n\n if(!renderEmojis(new Set([this]))) {\n this.clearCanvas();\n }\n }\n\n public add(\n addCustomEmojis: Parameters[1]['customEmojis'],\n lazyLoadQueue?: LazyLoadQueue | false,\n onlyThumb?: boolean,\n withThumb?: boolean\n ) {\n const renderer = this;\n\n addCustomEmojis.forEach((addElements, docId) => { // prevent adding old elements\n let elements = this.customEmojis.get(docId);\n if(!elements) this.customEmojis.set(docId, elements = new Set());\n else this.clearedElements.delete(elements);\n\n for(const el of addElements) {\n if(elements.has(el)) {\n addElements.delete(el);\n } else {\n el.clean = false;\n el.renderer = renderer;\n el.elements = elements;\n el.middlewareHelper = this.middlewareHelper.get().create();\n elements.add(el);\n\n if(el.lastChildWas && !el.lastChildWas.parentNode) {\n el.append(el.lastChildWas);\n }\n }\n }\n\n if(!addElements.size) {\n addCustomEmojis.delete(docId);\n }\n });\n\n if(!addCustomEmojis.size) {\n return;\n }\n\n const usingOwnQueue = !!(!lazyLoadQueue && lazyLoadQueue !== false && globalLazyLoadQueue);\n\n const docIds = Array.from(addCustomEmojis.keys());\n\n const managers = rootScope.managers;\n const middleware = this.middlewareHelper.get();\n const size = this.size;\n\n const loadPromise = managers.appEmojiManager.getCachedCustomEmojiDocuments(docIds).then((docs) => {\n if(middleware && !middleware()) return;\n\n const loadPromises: Promise[] = [];\n const wrap = (doc: MyDocument, _loadPromises?: Promise[]) => {\n const docId = doc.id;\n const newElements = addCustomEmojis.get(docId);\n const customEmojis = renderer.customEmojis.get(docId);\n const isLottie = doc.sticker === 2;\n const isStatic = doc.mime_type === 'video/webm' && !IS_WEBM_SUPPORTED;\n const willHaveSyncedPlayer = (isLottie || (doc.sticker === 3 && this.isSelectable)) && !onlyThumb && !isStatic;\n\n const loadPromises: Promise[] = [];\n const newElementsArray = Array.from(newElements);\n const promise = wrapSticker({\n div: newElementsArray,\n doc,\n width: size.width,\n height: size.height,\n loop: true,\n play: CUSTOM_EMOJI_INSTANT_PLAY,\n managers,\n isCustomEmoji: true,\n group: 'none',\n loadPromises,\n middleware,\n exportLoad: usingOwnQueue || lazyLoadQueue === false ? 2 : 1, // 2 - export load always, 1 - do not export load if cached static\n needFadeIn: false,\n loadStickerMiddleware: willHaveSyncedPlayer && middleware ? middleware.create().get(() => {\n // if(syncedPlayers.get(key) !== syncedPlayer) {\n // return false;\n // }\n\n // let good = false;\n // for(const middleware of syncedPlayer.middlewares) {\n // if(middleware()) {\n // good = true;\n // break;\n // }\n // }\n\n // return good;\n return !!syncedPlayer.middlewares.size;\n }) : undefined,\n static: isStatic,\n onlyThumb,\n withThumb: withThumb ?? (renderer.clearedElements.has(customEmojis) ? false : undefined),\n syncedVideo: this.isSelectable\n });\n\n if(_loadPromises) {\n promise.then(() => _loadPromises.push(...loadPromises));\n }\n\n const addition: {\n onRender?: (_p: Awaited['render']>) => Promise,\n elements: typeof newElements\n } = {\n elements: newElements\n };\n\n if(doc.sticker === 1 || onlyThumb || isStatic) {\n if(this.isSelectable) {\n addition.onRender = () => Promise.all(loadPromises).then(() => {\n if(middleware && !middleware()) return;\n newElementsArray.forEach((element) => {\n const {placeholder} = element;\n placeholder.src = (element.firstElementChild as HTMLImageElement).src;\n });\n });\n }\n\n return promise.then((res) => ({...res, ...addition}));\n }\n\n // eslint-disable-next-line prefer-const\n addition.onRender = (_p) => Promise.all(loadPromises).then(() => {\n if((middleware && !middleware()) || !doc.animated) {\n return;\n }\n\n const players = Array.isArray(_p) ? _p as HTMLVideoElement[] : [_p as RLottiePlayer];\n const player = Array.isArray(players) ? players[0] : players;\n assumeType(player);\n newElementsArray.forEach((element, idx) => {\n const player = players[idx] || players[0];\n element.player = player;\n\n if(syncedPlayer) {\n element.syncedPlayer = syncedPlayer;\n if(element.paused) {\n element.syncedPlayer.pausedElements.add(element);\n } else if(player.paused) {\n player.play();\n }\n }\n\n if(element.isConnected) {\n animationIntersector.addAnimation(element, element.renderer.animationGroup, undefined, true);\n }\n });\n\n if(player instanceof RLottiePlayer || (player instanceof HTMLVideoElement && this.isSelectable)) {\n syncedPlayer.player = player;\n renderer.playersSynced.set(customEmojis, player);\n }\n\n if(player instanceof RLottiePlayer) {\n player.group = renderer.animationGroup;\n\n player.overrideRender ??= (frame) => {\n syncedPlayersFrames.set(player, frame);\n // frames.set(containers, frame);\n };\n } else if(player instanceof HTMLVideoElement) {\n // player.play();\n\n // const cache = framesCache.getCache(key);\n // let {width, height} = renderer.size;\n // width *= dpr;\n // height *= dpr;\n\n // const onFrame = (frame: ImageBitmap | HTMLCanvasElement) => {\n // topFrames.set(player, frame);\n // player.requestVideoFrameCallback(callback);\n // };\n\n // let frameNo = -1, lastTime = 0;\n // const callback: VideoFrameRequestCallback = (now, metadata) => {\n // const time = player.currentTime;\n // if(lastTime > time) {\n // frameNo = -1;\n // }\n\n // const _frameNo = ++frameNo;\n // lastTime = time;\n // // const frameNo = Math.floor(player.currentTime * 1000 / CUSTOM_EMOJI_FRAME_INTERVAL);\n // // const frameNo = metadata.presentedFrames;\n // const imageBitmap = cache.framesNew.get(_frameNo);\n\n // if(imageBitmap) {\n // onFrame(imageBitmap);\n // } else if(IS_IMAGE_BITMAP_SUPPORTED) {\n // createImageBitmap(player, {resizeWidth: width, resizeHeight: height}).then((imageBitmap) => {\n // cache.framesNew.set(_frameNo, imageBitmap);\n // if(frameNo === _frameNo) onFrame(imageBitmap);\n // });\n // } else {\n // const canvas = document.createElement('canvas');\n // const context = canvas.getContext('2d');\n // canvas.width = width;\n // canvas.height = height;\n // context.drawImage(player, 0, 0);\n // cache.framesNew.set(_frameNo, canvas);\n // onFrame(canvas);\n // }\n // };\n\n // // player.requestVideoFrameCallback(callback);\n // // setInterval(callback, CUSTOM_EMOJI_FRAME_INTERVAL);\n }\n\n if(willHaveSyncedPlayer) {\n const dpr = getLottiePixelRatio(this.size.width, this.size.height);\n renderer.canvas.dpr = dpr;\n setRenderInterval();\n }\n });\n\n let syncedPlayer: SyncedPlayer;\n const key = [docId, size.width, size.height].join('-');\n if(willHaveSyncedPlayer) {\n syncedPlayer = syncedPlayers.get(key);\n if(!syncedPlayer) {\n syncedPlayer = {\n player: undefined,\n middlewares: new Set(),\n pausedElements: new Set(),\n key\n };\n\n syncedPlayers.set(key, syncedPlayer);\n }\n\n for(const element of newElements) {\n const middleware = element.middlewareHelper.get();\n syncedPlayer.middlewares.add(middleware);\n middleware.onClean(() => {\n syncedPlayer.middlewares.delete(middleware);\n\n if(!syncedPlayer.middlewares.size) {\n if(syncedPlayer.player) {\n const frame = syncedPlayersFrames.get(syncedPlayer.player);\n if(frame) {\n (frame as ImageBitmap).close?.();\n syncedPlayersFrames.delete(syncedPlayer.player);\n }\n\n syncedPlayersFrames.delete(syncedPlayer.player);\n if(syncedPlayer.player instanceof RLottiePlayer) {\n syncedPlayer.player.overrideRender = noop;\n syncedPlayer.player.remove();\n } else if(syncedPlayer.player instanceof HTMLVideoElement) {\n const cacheName = framesCache.generateName('' + element.docId, 0, 0, undefined, undefined);\n delete videosCache[cacheName];\n }\n\n syncedPlayer.player = undefined;\n }\n\n if(syncedPlayers.get(syncedPlayer.key) === syncedPlayer && syncedPlayers.delete(syncedPlayer.key) && !syncedPlayers.size) {\n clearRenderInterval();\n }\n }\n });\n }\n }\n\n return promise.then((res) => ({...res, ...addition}));\n };\n\n const missing: DocId[] = [];\n const cachedPromises = docs.map((doc, idx) => {\n if(!doc) {\n missing.push(docIds[idx]);\n return;\n }\n\n return wrap(doc, loadPromises);\n }).filter(Boolean);\n\n const uncachedPromisesPromise = !missing.length ?\n Promise.resolve([] as typeof cachedPromises) :\n managers.appEmojiManager.getCustomEmojiDocuments(missing).then((docs) => {\n if(middleware && !middleware()) return [];\n return docs.filter(Boolean).map((doc) => wrap(doc));\n });\n\n const loadFromPromises = (promises: typeof cachedPromises) => {\n return Promise.all(promises).then((arr) => {\n const promises = arr.map(({load, onRender, elements}) => {\n if(!load) {\n return;\n }\n\n const l = () => load().then(onRender);\n\n if(usingOwnQueue) {\n elements.forEach((element) => {\n globalLazyLoadQueue.push({\n div: element,\n load: () => {\n elements.forEach((element) => {\n globalLazyLoadQueue.delete({div: element});\n });\n\n return l();\n }\n });\n });\n } else {\n return l();\n }\n });\n\n return Promise.all(promises);\n });\n };\n\n const load = () => {\n if(middleware && !middleware()) return;\n const cached = loadFromPromises(cachedPromises);\n const uncached = uncachedPromisesPromise.then((promises) => loadFromPromises(promises));\n return Promise.all([cached, uncached]);\n };\n\n if(lazyLoadQueue) {\n lazyLoadQueue.push({\n div: renderer.canvas,\n load\n });\n } else {\n load();\n }\n\n return Promise.all(cachedPromises).then(() => Promise.all(loadPromises)).then(() => {});\n });\n\n // recordPromise(loadPromise, 'render emojis: ' + docIds.length);\n\n return loadPromise;\n }\n\n public static create(options: CustomEmojiRendererElementOptions) {\n const renderer = new CustomEmojiRendererElement();\n renderer.animationGroup = options.animationGroup;\n renderer.size = options.customEmojiSize || mediaSizes.active.customEmoji;\n renderer.isSelectable = options.isSelectable;\n if(options.wrappingDraft) {\n renderer.contentEditable = 'false';\n renderer.style.height = 'inherit';\n }\n // const middleware = () => !!renderer.disconnectedCallback && (!options.middleware || options.middleware());\n let middleware = options.middleware;\n if(middleware) {\n renderer.middlewareHelper = middleware.create();\n middleware = renderer.middlewareHelper.get();\n middleware.onDestroy(() => {\n renderer.destroy?.();\n });\n } else {\n // console.error('no middleware', this, options);\n renderer.auto = true;\n renderer.middlewareHelper = getMiddleware();\n }\n\n return renderer;\n }\n}\n\ntype CustomEmojiRenderer = CustomEmojiRendererElement;\ntype SyncedPlayer = {\n player: RLottiePlayer | HTMLVideoElement,\n middlewares: Set,\n pausedElements: Set,\n key: string\n};\ntype CustomEmojiFrame = Parameters[0] | HTMLVideoElement;\n\nconst CUSTOM_EMOJI_INSTANT_PLAY = true; // do not wait for animationIntersector\nlet emojiRenderInterval: number;\nconst emojiRenderers: Set = new Set();\nconst syncedPlayers: Map = new Map();\nconst syncedPlayersFrames: Map = new Map();\nexport const renderEmojis = (renderers = emojiRenderers) => {\n const r = Array.from(renderers);\n const t = r.filter((r) => r.isConnected && r.checkForAnyFrame() && !r.ignoreSettingDimensions);\n if(!t.length) {\n return false;\n }\n\n const o = t.map((renderer) => {\n const paused = [...renderer.playersSynced.values()].reduce((acc, v) => acc + +!!v.paused, 0);\n if(renderer.playersSynced.size === paused) {\n return;\n }\n\n const offsets = renderer.getOffsets();\n if(offsets.size) {\n return [renderer, offsets] as const;\n }\n }).filter(Boolean);\n\n for(const [renderer] of o) {\n renderer.clearCanvas();\n }\n\n for(const [renderer, offsets] of o) {\n renderer.render(offsets);\n }\n\n return true;\n};\nconst CUSTOM_EMOJI_FPS = 60;\nconst CUSTOM_EMOJI_FRAME_INTERVAL = 1000 / CUSTOM_EMOJI_FPS;\nconst setRenderInterval = () => {\n if(emojiRenderInterval) {\n return;\n }\n\n emojiRenderInterval = window.setInterval(renderEmojis, CUSTOM_EMOJI_FRAME_INTERVAL);\n renderEmojis();\n};\nconst clearRenderInterval = () => {\n if(!emojiRenderInterval) {\n return;\n }\n\n clearInterval(emojiRenderInterval);\n emojiRenderInterval = undefined;\n};\n\n(window as any).syncedPlayers = syncedPlayers;\n(window as any).emojiRenderers = emojiRenderers;\n\ncustomElements.define('custom-emoji-element', CustomEmojiElement);\ncustomElements.define('custom-emoji-renderer-element', CustomEmojiRendererElement);\n\ntype CustomEmojiRendererElementOptions = Partial<{\n loadPromises: Promise[],\n customEmojiRenderer: CustomEmojiRendererElement,\n\n isSelectable: boolean,\n wrappingDraft: boolean\n}> & WrapSomethingOptions;\n\n/**\n * * Expecting correctly sorted nested entities (RichTextProcessor.sortEntities)\n */\nexport default 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 isSelectable: boolean,\n\n contextHashtag?: string,\n\n // ! recursive, do not provide\n nasty?: {\n i: number,\n usedLength: number,\n text: string,\n lastEntity?: MessageEntity\n },\n voodoo?: boolean,\n customEmojis?: Map,\n customWraps?: Set,\n}> & CustomEmojiRendererElementOptions = {}) {\n const fragment = document.createDocumentFragment();\n if(!text) {\n return fragment;\n }\n\n const nasty = options.nasty ??= {\n i: 0,\n usedLength: 0,\n text\n };\n\n const wrapSomething = (wrapElement: HTMLElement, noFiller?: boolean) => {\n const element = document.createElement('span');\n // element.append(BOM, a, BOM);\n if(options.wrappingDraft) {\n element.contentEditable = 'false';\n }\n // element.style.display = 'inline-block';\n element.classList.add('input-something');\n element.append(/* BOM, */wrapElement);\n\n (lastElement || fragment).append(element);\n\n wrapElement.classList.add('input-selectable');\n // if(wrapElement instanceof HTMLImageElement) {\n // element.prepend(f());\n // } else {\n !noFiller && wrapElement.append(createCustomFiller(true));\n // }\n\n customWraps.add(element);\n\n return element;\n };\n\n options.isSelectable ||= options.wrappingDraft;\n\n const customEmojis = options.customEmojis ??= new Map() as Map;\n const customWraps = options.customWraps ??= new Set();\n\n const entities = options.entities ??= parseEntities(nasty.text);\n\n const passEntities = options.passEntities ??= {};\n const contextSite = options.contextSite ??= 'Telegram';\n const contextExternal = contextSite !== 'Telegram';\n\n const textLength = nasty.text.length;\n const length = entities.length;\n let lastElement: HTMLElement | DocumentFragment;\n for(; nasty.i < length; ++nasty.i) {\n let entity = entities[nasty.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 entity.length = textLength - entity.offset;\n }\n\n if(entity.length) {\n nasty.lastEntity = entity;\n }\n\n let nextEntity = entities[nasty.i + 1];\n\n const startOffset = entity.offset;\n const endOffset = startOffset + entity.length;\n const endPartOffset = Math.min(endOffset, nextEntity?.offset ?? 0xFFFF);\n const fullEntityText = nasty.text.slice(startOffset, endOffset);\n const sliced = nasty.text.slice(startOffset, endPartOffset);\n let partText = sliced;\n\n if(nasty.usedLength < startOffset) {\n (lastElement || fragment).append(nasty.text.slice(nasty.usedLength, startOffset));\n }\n\n if(lastElement) {\n lastElement = fragment;\n }\n\n nasty.usedLength = endPartOffset;\n\n let element: HTMLElement,\n property: 'textContent' | 'alt' = 'textContent',\n usedText = false;\n switch(entity._) {\n case 'messageEntityBold': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n // element.style.fontWeight = 'bold';\n element.style.fontFamily = 'markup-bold';\n } else {\n element = document.createElement('strong');\n }\n }\n\n break;\n }\n\n case 'messageEntityItalic': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n // element.style.fontStyle = 'italic';\n element.style.fontFamily = 'markup-italic';\n } else {\n element = document.createElement('em');\n }\n }\n\n break;\n }\n\n case 'messageEntityStrike': {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n // const styleName = IS_SAFARI ? 'text-decoration' : 'text-decoration-line';\n // element.style.cssText = `${styleName}: line-through;`;\n element.style.fontFamily = 'markup-strikethrough';\n } else/* if(!options.noTextFormat) */ {\n element = document.createElement('del');\n }\n\n break;\n }\n\n case 'messageEntityUnderline': {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n // const styleName = IS_SAFARI ? 'text-decoration' : 'text-decoration-line';\n // element.style.cssText = `${styleName}: underline;`;\n element.style.fontFamily = 'markup-underline';\n } else if(!options.noTextFormat) {\n element = document.createElement('u');\n }\n\n break;\n }\n\n case 'messageEntityPre':\n case 'messageEntityCode': {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n // element.style.fontFamily = 'var(--font-monospace)';\n element.style.fontFamily = 'markup-monospace';\n } else if(!options.noTextFormat) {\n element = document.createElement('code');\n }\n\n break;\n }\n\n // case 'messageEntityPre': {\n // if(options.wrappingDraft) {\n // element = document.createElement('span');\n // element.style.fontFamily = 'var(--font-monospace)';\n // } else if(!options.noTextFormat) {\n // element = document.createElement('pre');\n // const inner = document.createElement('code');\n // if(entity.language) {\n // inner.className = 'language-' + entity.language;\n // inner.textContent = entityText;\n // usedText = true;\n // }\n // }\n\n // break;\n // }\n\n case 'messageEntityHighlight': {\n element = document.createElement('i');\n element.className = 'text-highlight';\n break;\n }\n\n case 'messageEntityBotCommand': {\n // if(!(options.noLinks || options.noCommands || contextExternal)/* && !entity.unsafe */) {\n if(!options.noLinks && passEntities[entity._]) {\n let command = fullEntityText.slice(1);\n let bot: string | boolean;\n let atPos: number;\n if((atPos = command.indexOf('@')) !== -1) {\n bot = command.slice(atPos + 1);\n command = command.slice(0, atPos);\n } else {\n bot = options.fromBot;\n }\n\n element = document.createElement('a');\n (element as HTMLAnchorElement).href = encodeEntities('tg://bot_command?command=' + encodeURIComponent(command) + (bot ? '&bot=' + encodeURIComponent(bot) : ''));\n if(!contextExternal) {\n element.setAttribute('onclick', 'execBotCommand(this)');\n }\n }\n\n break;\n }\n\n case 'messageEntityCustomEmoji': {\n if(!IS_CUSTOM_EMOJI_SUPPORTED) {\n break;\n }\n\n while(nextEntity?._ === 'messageEntityEmoji' && nextEntity.offset < endOffset) {\n ++nasty.i;\n nasty.lastEntity = nextEntity;\n nasty.usedLength += nextEntity.length;\n nextEntity = entities[nasty.i + 1];\n }\n\n const customEmojiElement = element = CustomEmojiElement.create(entity.document_id);\n const {docId} = customEmojiElement;\n let set = customEmojis.get(docId);\n if(!set) customEmojis.set(docId, set = new Set());\n set.add(customEmojiElement);\n customEmojiElement.dataset.stickerEmoji = fullEntityText;\n\n if(options.wrappingDraft) {\n element = document.createElement('img');\n (element as HTMLImageElement).alt = fullEntityText;\n for(const i in customEmojiElement.dataset) {\n element.dataset[i] = customEmojiElement.dataset[i];\n }\n (element as any).customEmojiElement = customEmojiElement;\n customEmojiElement.placeholder = element as HTMLImageElement;\n element.classList.add('custom-emoji-placeholder');\n (element as HTMLImageElement).src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAAtJREFUGFdjYAACAAAFAAGq1chRAAAAAElFTkSuQmCC';\n property = 'alt';\n break;\n }\n\n if(options.isSelectable) {\n // const s = document.createElement('span');\n // s.append(fullEntityText);\n // element.append(s);\n // element.textContent = fullEntityText;\n // element.textContent = 'a';\n // element.contentEditable = 'false';\n\n // const x = f();\n // x.style.display = 'inline-block';\n // x.contentEditable = 'false';\n // (lastElement || fragment).append(BOM);\n // (lastElement || fragment).append(x);\n\n element = wrapSomething(element, !!options.customEmojiRenderer);\n\n // const a = element;\n // element = document.createElement('span');\n // element.append(BOM, a, BOM);\n // element.contentEditable = 'false';\n }\n\n property = 'alt';\n break;\n }\n\n case 'messageEntityEmoji': {\n let isSupported = IS_EMOJI_SUPPORTED;\n if(isSupported) {\n for(const version in EmojiVersions) {\n if(version) {\n const emojiData = EmojiVersions[version as EMOJI_VERSION];\n if(emojiData.hasOwnProperty(entity.unicode) && !EMOJI_VERSIONS_SUPPORTED[version as EMOJI_VERSION]) {\n isSupported = false;\n break;\n }\n }\n }\n }\n\n // if(!(options.wrappingDraft && isSupported)) { // * fix safari emoji\n if(!isSupported) { // no wrapping needed\n // if(isSupported) { // ! contenteditable=\"false\" ะฝัƒะถะตะฝ ะดะปั ะฟะพะปั ะฒะฒะพะดะฐ, ะธะฝะฐั‡ะต ั‚ะฐะผ ะฑัƒะดะตั‚ ะผะตะฝัั‚ัŒัั ัˆั€ะธั„ั‚ ะฒ Safari, ะธะปะธ ะถะต ั€ะตะฝะดะตั€ะธั‚ัŒ ัะผะฐะนะปะธะบ ะฝะฐะฟั€ัะผัƒัŽ, ะฑะตะท ะบะพะฝั‚ะตะนะฝะตั€ะฐ\n // insertPart(entity, '', '');\n // } else {\n element = document.createElement('img');\n (element as HTMLImageElement).src = `assets/img/emoji/${entity.unicode}.png`;\n property = 'alt';\n element.className = 'emoji';\n\n // if(options.isSelectable) {\n // usedText = true;\n // (element as HTMLImageElement).alt = partText;\n // element = wrapSomething(element);\n // }\n\n // const a = element;\n // a.contentEditable = 'false';\n // element = document.createElement('span');\n // element.append(a);\n // element.contentEditable = 'false';\n // }\n // } else if(options.mustWrapEmoji) {\n } else if(!options.wrappingDraft) {\n element = document.createElement('span');\n element.className = 'emoji';\n }/* else if(!IS_SAFARI) {\n insertPart(entity, '', '');\n } */\n /* if(!isSupported) {\n insertPart(entity, `\"`,`);\n } */\n\n break;\n }\n\n case 'messageEntityCaret': {\n element = document.createElement('span');\n element.className = 'composer-sel';\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 // let inner: string;\n let url: string = (entity as MessageEntity.messageEntityTextUrl).url || fullEntityText;\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 if(nextEntity?._ === 'messageEntityUrl' &&\n nextEntity.length === entity.length &&\n nextEntity.offset === entity.offset) {\n nasty.lastEntity = nextEntity;\n ++nasty.i;\n }\n\n if(url !== fullEntityText) {\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 url :\n `javascript:electronHelpers.openExternal('${url}');`;\n\n element = document.createElement('a');\n element.className = 'anchor-url';\n (element as HTMLAnchorElement).href = href;\n\n if(!(currentContext || typeof electronHelpers !== 'undefined')) {\n setBlankToAnchor(element as HTMLAnchorElement);\n }\n\n if(onclick) {\n element.setAttribute('onclick', onclick + '(this)');\n }\n }\n\n break;\n }\n\n case 'messageEntityEmail': {\n if(!options.noLinks) {\n element = document.createElement('a');\n (element as HTMLAnchorElement).href = encodeEntities('mailto:' + fullEntityText);\n setBlankToAnchor(element as HTMLAnchorElement);\n }\n\n break;\n }\n\n case 'messageEntityHashtag': {\n const contextUrl = !options.noLinks && SITE_HASHTAGS[contextSite];\n if(contextUrl) {\n const hashtag = fullEntityText.slice(1);\n element = document.createElement('a');\n element.className = 'anchor-hashtag';\n (element as HTMLAnchorElement).href = contextUrl.replace('{1}', encodeURIComponent(hashtag));\n if(contextExternal) {\n setBlankToAnchor(element as HTMLAnchorElement);\n } else {\n element.setAttribute('onclick', 'searchByHashtag(this)');\n }\n }\n\n break;\n }\n\n case 'messageEntityMentionName': {\n if(!(options.noLinks && !passEntities[entity._])) {\n element = document.createElement('a');\n (element as HTMLAnchorElement).href = buildURLHash('' + entity.user_id);\n element.className = 'follow';\n element.dataset.follow = '' + entity.user_id;\n }\n\n break;\n }\n\n case 'messageEntityMention': {\n // const contextUrl = !options.noLinks && siteMentions[contextSite];\n if(!options.noLinks) {\n const username = fullEntityText.slice(1);\n\n element = wrapTelegramUrlToAnchor('t.me/' + username);\n element.className = 'mention';\n\n // insertPart(entity, ``, '');\n }\n\n break;\n }\n\n case 'messageEntitySpoiler': {\n if(options.noTextFormat) {\n const encoded = encodeSpoiler(nasty.text, entity);\n nasty.text = encoded.text;\n partText = encoded.entityText;\n if(endPartOffset !== endOffset) {\n nasty.usedLength += endOffset - endPartOffset;\n }\n let n: MessageEntity;\n for(; n = entities[nasty.i + 1], n && n.offset < endOffset;) {\n // nasty.usedLength += n.length;\n ++nasty.i;\n nasty.lastEntity = n;\n nextEntity = entities[nasty.i + 1];\n }\n } else if(options.wrappingDraft) {\n element = document.createElement('span');\n // element.style.fontFamily = 'spoiler';\n element.style.fontFamily = 'markup-spoiler';\n } else {\n const container = document.createElement('span');\n container.className = 'spoiler';\n element = document.createElement('span');\n element.className = 'spoiler-text';\n element.textContent = partText;\n usedText = true;\n container.append(element);\n fragment.append(container);\n\n container[`on${CLICK_EVENT_NAME}`] = (window as any).onSpoilerClick;\n }\n\n break;\n }\n }\n\n if(!usedText && partText) {\n if(element) {\n // @ts-ignore\n element[property] = partText;\n } else {\n (element || fragment).append(partText);\n }\n }\n\n if(element && !element.parentNode) {\n (lastElement || fragment).append(element);\n }\n\n while(nextEntity && nextEntity.offset < endOffset) {\n ++nasty.i;\n\n (element || fragment).append(wrapRichText(nasty.text, {\n ...options,\n voodoo: true\n }));\n\n nextEntity = entities[nasty.i + 1];\n }\n\n // if(!element?.parentNode) {\n // (lastElement || fragment).append(element ?? partText);\n // }\n\n if(nasty.usedLength <= endOffset) {\n if(nasty.usedLength < endOffset) {\n (element || fragment).append(nasty.text.slice(nasty.usedLength, endOffset));\n nasty.usedLength = endOffset;\n }\n\n lastElement = fragment;\n nasty.lastEntity = undefined;\n } else if(entity.length > partText.length && element) {\n lastElement = element;\n } else {\n lastElement = fragment;\n }\n\n if(options.voodoo) {\n return fragment;\n }\n }\n\n if(nasty.lastEntity) {\n nasty.usedLength = nasty.lastEntity.offset + nasty.lastEntity.length;\n }\n\n if(nasty.usedLength < textLength) {\n (lastElement || fragment).append(nasty.text.slice(nasty.usedLength));\n }\n\n if((!options.wrappingDraft || options.customEmojiRenderer) && customEmojis.size) {\n let renderer = options.customEmojiRenderer;\n if(!renderer) {\n renderer = CustomEmojiRendererElement.create(options);\n fragment.prepend(renderer);\n }\n\n const loadPromise = renderer.add(customEmojis, options.lazyLoadQueue, options.wrappingDraft);\n options.loadPromises?.push(loadPromise);\n // recordPromise(loadPromise, 'render emojis: ' + docIds.length);\n }\n\n if(customWraps.size) {\n insertCustomFillers(customWraps);\n }\n\n return fragment;\n}\n\nexport const createCustomFiller = (notFiller?: boolean) => {\n const x = document.createElement('span');\n x.classList.add(notFiller ? 'input-filler2' : 'input-filler');\n x.textContent = BOM;\n return x;\n};\n\nexport function isCustomFillerNeededBySiblingNode(node: ChildNode) {\n if(\n // !node?.textContent ||\n // node.textContent.endsWith('\\n') ||\n node?.textContent !== BOM ||\n (node as HTMLElement)?.getAttribute?.('contenteditable') === 'false'\n ) {\n // if(!node || (node as HTMLElement).firstElementChild || node.textContent.endsWith('\\n')) {\n if(!node || node.textContent !== BOM || (node as HTMLElement).firstElementChild) {\n return 2;\n } else if(node.nodeType === node.ELEMENT_NODE) {\n return 1;\n }/* else if(node.nodeType === node.TEXT_NODE && !node.nodeValue) {\n (node as CharacterData).insertData(0, BOM);\n } */\n }\n\n return 0;\n}\n\nexport function insertCustomFillers(elements: Iterable) {\n const check = (element: HTMLElement, node: ChildNode, method: 'before' | 'after') => {\n const needed = isCustomFillerNeededBySiblingNode(node);\n if(needed === 2) {\n element[method](createCustomFiller());\n } else if(needed === 1) {\n node.appendChild(document.createTextNode(BOM));\n }\n };\n\n for(const element of elements) {\n const {previousSibling, nextSibling} = element;\n check(element, previousSibling, 'before');\n check(element, nextSibling, 'after');\n }\n}\n\n(window as any).wrapRichText = wrapRichText;\n","// just for the future\nexport default function buildURLHash(str: string) {\n return '#' + encodeURIComponent(str);\n}\n","import wrapUrl from './wrapUrl';\n\nexport default function wrapTelegramUrlToAnchor(url1: string) {\n const {url, onclick} = wrapUrl(url1);\n const element = document.createElement('a');\n (element as HTMLAnchorElement).href = url;\n if(onclick) {\n element.setAttribute('onclick', `${onclick}(this)`);\n }\n\n return element;\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 CAN_USE_TRANSFERABLES from '../../environment/canUseTransferables';\nimport EventListenerBase from '../../helpers/eventListenerBase';\n\nexport default class QueryableWorker extends EventListenerBase<{\n ready: () => void,\n frame: (reqId: number, frameNo: number, frame: Uint8ClampedArray | ImageBitmap) => 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(args: any[], transfer?: Transferable[]) {\n this.worker.postMessage({\n queryMethod: args.shift(),\n queryMethodArguments: args\n }, CAN_USE_TRANSFERABLES ? transfer: undefined);\n }\n}\n","const IS_WEB_ASSEMBLY_SUPPORTED = typeof(WebAssembly) !== 'undefined';\n\nexport default IS_WEB_ASSEMBLY_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 animationIntersector, {AnimationItemGroup} from '../../components/animationIntersector';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport pause from '../../helpers/schedulers/pause';\nimport {logger, LogTypes} from '../logger';\nimport RLottiePlayer, {RLottieOptions} from './rlottiePlayer';\nimport QueryableWorker from './queryableWorker';\nimport blobConstruct from '../../helpers/blob/blobConstruct';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport IS_WEB_ASSEMBLY_SUPPORTED from '../../environment/webAssemblySupport';\nimport makeError from '../../helpers/makeError';\nimport App from '../../config/app';\n\nexport type LottieAssetName = 'EmptyFolder' | 'Folders_1' | 'Folders_2' |\n 'TwoFactorSetupMonkeyClose' | 'TwoFactorSetupMonkeyCloseAndPeek' |\n 'TwoFactorSetupMonkeyCloseAndPeekToIdle' | 'TwoFactorSetupMonkeyIdle' |\n 'TwoFactorSetupMonkeyPeek' | 'TwoFactorSetupMonkeyTracking' |\n 'voice_outlined2' | 'voip_filled' | 'voice_mini' | 'jolly_roger';\n\nexport class LottieLoader {\n private loadPromise: Promise = !IS_WEB_ASSEMBLY_SUPPORTED ? Promise.reject() : undefined;\n private loaded = false;\n\n private workersLimit = App.threads;\n private players: {[reqId: number]: RLottiePlayer} = {};\n private playersByCacheName: {[cacheName: string]: Set} = {};\n\n private workers: QueryableWorker[] = [];\n private curWorkerNum = 0;\n\n private log = logger('LOTTIE', LogTypes.Error);\n\n public getAnimation(element: HTMLElement) {\n for(const i in this.players) {\n if(this.players[i].el.includes(element)) {\n return this.players[i];\n }\n }\n\n return null;\n }\n\n public setLoop(loop: boolean) {\n let changed = false;\n for(const i in this.players) {\n const player = this.players[i];\n if(player._loop && player.loop !== loop) {\n changed = true;\n player.loop = loop;\n\n // if(player._autoplay && player.autoplay !== player._autoplay) {\n player.autoplay = player._autoplay;\n // }\n }\n }\n\n return changed;\n }\n\n public loadLottieWorkers() {\n if(this.loadPromise) {\n return this.loadPromise;\n }\n\n return this.loadPromise = new Promise((resolve, reject) => {\n let remain = this.workersLimit;\n for(let i = 0; i < this.workersLimit; ++i) {\n const worker = new Worker(new URL('./rlottie.worker.ts', import.meta.url));\n const queryableWorker = this.workers[i] = new QueryableWorker(worker);\n\n queryableWorker.addEventListener('ready', () => {\n this.log('worker #' + i + ' ready');\n\n queryableWorker.addEventListener('frame', this.onFrame);\n queryableWorker.addEventListener('loaded', this.onPlayerLoaded);\n queryableWorker.addEventListener('error', this.onPlayerError);\n\n --remain;\n if(!remain) {\n this.log('workers ready');\n resolve();\n this.loaded = true;\n }\n }, {once: true});\n\n queryableWorker.addEventListener('workerError', (error) => {\n reject('rlottie load error: ' + error.message);\n this.loaded = false;\n }, {once: true});\n }\n });\n }\n\n private makeAssetUrl(name: LottieAssetName) {\n return 'assets/tgs/' + name + '.json';\n }\n\n public loadAnimationAsAsset(params: Omit, name: LottieAssetName) {\n // (params as RLottieOptions).name = name;\n return this.loadAnimationFromURL(params, this.makeAssetUrl(name));\n }\n\n public loadAnimationDataFromURL(url: string): Promise {\n if(!IS_WEB_ASSEMBLY_SUPPORTED) {\n return this.loadPromise as any;\n }\n\n this.loadLottieWorkers();\n\n return fetch(url)\n .then((res) => {\n if(!res.headers || res.headers.get('content-type') === 'application/octet-stream') {\n return res.arrayBuffer()\n .then((data) => apiManagerProxy.invokeCrypto('gzipUncompress', data))\n .then((arr) => blobConstruct(arr as Uint8Array, ''));\n } else {\n return res.blob();\n }\n });\n /* .then((str) => {\n return new Promise((resolve) => setTimeout(() => resolve(str), 2e3));\n }) */\n }\n\n public loadAnimationFromURLManually(name: LottieAssetName) {\n const url = this.makeAssetUrl(name);\n return this.loadAnimationDataFromURL(url).then((blob) => {\n return (params: Omit) => this.loadAnimationFromURLNext(blob, params, url);\n });\n }\n\n public loadAnimationFromURL(params: Omit, url: string) {\n return this.loadAnimationDataFromURL(url).then((blob) => {\n return this.loadAnimationFromURLNext(blob, params, url);\n });\n }\n\n public loadAnimationFromURLNext(blob: Blob, params: Omit, url: string) {\n const newParams = Object.assign(params, {animationData: blob, needUpscale: true});\n newParams.name ||= url;\n return this.loadAnimationWorker(newParams);\n }\n\n public waitForFirstFrame(player: RLottiePlayer) {\n return Promise.race([\n /* new Promise((resolve) => {\n player.addEventListener('firstFrame', () => {\n setTimeout(() => resolve(), 1500);\n }, true);\n }) */\n new Promise((resolve) => {\n player.addEventListener('firstFrame', resolve, {once: true});\n }),\n pause(2500)\n ]).then(() => player);\n }\n\n public async loadAnimationWorker(params: RLottieOptions): Promise {\n if(!IS_WEB_ASSEMBLY_SUPPORTED) {\n return this.loadPromise as any;\n }\n\n if(!this.loaded) {\n await this.loadLottieWorkers();\n }\n\n const {middleware, group = ''} = params;\n if(middleware && !middleware()) {\n throw makeError('MIDDLEWARE');\n }\n\n if(params.sync) {\n const cacheName = RLottiePlayer.CACHE.generateName(params.name, params.width, params.height, params.color, params.toneIndex);\n const players = this.playersByCacheName[cacheName];\n if(players?.size) {\n return Promise.resolve(players.entries().next().value[0]);\n }\n }\n\n const containers = Array.isArray(params.container) ? params.container : [params.container];\n if(!params.width || !params.height) {\n params.width = parseInt(containers[0].style.width);\n params.height = parseInt(containers[0].style.height);\n }\n\n if(!params.width || !params.height) {\n throw new Error('No size for sticker!');\n }\n\n params.group = group;\n\n const player = this.initPlayer(containers, params);\n\n animationIntersector.addAnimation(player, group, undefined, middleware);\n\n return player;\n }\n\n private onPlayerLoaded = (reqId: number, frameCount: number, fps: number) => {\n const player = this.players[reqId];\n if(!player) {\n this.log.warn('onPlayerLoaded on destroyed player:', reqId, frameCount);\n return;\n }\n\n this.log.debug('onPlayerLoaded');\n player.onLoad(frameCount, fps);\n };\n\n private onFrame = (reqId: number, frameNo: number, frame: Uint8ClampedArray | ImageBitmap) => {\n const player = this.players[reqId];\n if(!player) {\n this.log.warn('onFrame on destroyed player:', reqId, frameNo);\n return;\n }\n\n if(player.clamped !== undefined && frame instanceof Uint8ClampedArray) {\n player.clamped = frame;\n }\n\n player.renderFrame(frame, frameNo);\n };\n\n private onPlayerError = (reqId: number, error: Error) => {\n const player = this.players[reqId];\n if(!player) {\n return;\n }\n\n // ! will need refactoring later, this is not the best way to remove the animation\n const animations = animationIntersector.getAnimations(player.el[0]);\n animations.forEach((animation) => {\n animationIntersector.removeAnimation(animation);\n });\n };\n\n public onDestroy(reqId: number) {\n delete this.players[reqId];\n }\n\n public destroyWorkers() {\n if(!IS_WEB_ASSEMBLY_SUPPORTED) {\n return;\n }\n\n this.workers.forEach((worker, idx) => {\n worker.terminate();\n this.log('worker #' + idx + ' terminated');\n });\n\n this.log('workers destroyed');\n this.workers.length = 0;\n this.curWorkerNum = 0;\n this.loaded = false;\n this.loadPromise = undefined;\n }\n\n private initPlayer(el: RLottiePlayer['el'], options: RLottieOptions) {\n const player = new RLottiePlayer({\n el,\n worker: this.workers[this.curWorkerNum++],\n options\n });\n\n const {reqId, cacheName} = player;\n this.players[reqId] = player;\n\n const playersByCacheName = cacheName ? this.playersByCacheName[cacheName] ??= new Set() : undefined;\n if(cacheName) {\n playersByCacheName.add(player);\n }\n\n if(this.curWorkerNum >= this.workers.length) {\n this.curWorkerNum = 0;\n }\n\n player.addEventListener('destroy', () => {\n this.onDestroy(reqId);\n if(playersByCacheName.delete(player) && !playersByCacheName.size) {\n delete this.playersByCacheName[cacheName];\n }\n });\n\n player.loadFromData(options.animationData);\n\n return player;\n }\n}\n\nconst lottieLoader = new LottieLoader();\nMOUNT_CLASS_TO.lottieLoader = lottieLoader;\nexport default lottieLoader;\n","/*\n * 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 {AnimationItemGroup, AnimationItemWrapper} from '../../components/animationIntersector';\nimport type {Middleware} from '../../helpers/middleware';\nimport CAN_USE_TRANSFERABLES from '../../environment/canUseTransferables';\nimport IS_APPLE_MX from '../../environment/appleMx';\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/clamp';\nimport QueryableWorker from './queryableWorker';\nimport IS_IMAGE_BITMAP_SUPPORTED from '../../environment/imageBitmapSupport';\nimport framesCache, {FramesCache, FramesCacheItem} from '../../helpers/framesCache';\n\nexport type RLottieOptions = {\n container: HTMLElement | HTMLElement[],\n middleware?: Middleware,\n canvas?: HTMLCanvasElement,\n autoplay?: boolean,\n animationData: Blob,\n loop?: RLottiePlayer['loop'],\n width?: number,\n height?: number,\n group?: AnimationItemGroup,\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 sync?: boolean\n};\n\nexport type RLottieColor = [number, number, number];\n\nexport function getLottiePixelRatio(width: number, height: number, needUpscale?: boolean) {\n let pixelRatio = clamp(window.devicePixelRatio, 1, 2);\n if(pixelRatio > 1 && !needUpscale) {\n if(width > 90 && height > 90) {\n if(!IS_APPLE && mediaSizes.isMobile) {\n pixelRatio = 1;\n }\n } else if((width > 60 && height > 60) || IS_ANDROID) {\n pixelRatio = Math.max(1.5, pixelRatio - 1.5);\n }\n }\n\n return pixelRatio;\n}\n\nexport default class RLottiePlayer extends EventListenerBase<{\n enterFrame: (frameNo: number) => void,\n ready: () => void,\n firstFrame: () => void,\n cached: () => void,\n destroy: () => void\n}> implements AnimationItemWrapper {\n public static CACHE = framesCache;\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 public name: string;\n public 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 contexts: 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: number | boolean = true;\n public _loop: RLottiePlayer['loop']; // ! will be used to store original value for settings.stickers.loop\n public group: AnimationItemGroup = '';\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 cache: FramesCacheItem;\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 public overrideRender: (frame: ImageData | HTMLCanvasElement | ImageBitmap) => void;\n private renderedFirstFrame: boolean;\n\n private raw: boolean;\n\n constructor({el, worker, options}: {\n el: RLottiePlayer['el'],\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(const 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 this.raw = this.color !== undefined;\n\n if(this.name) {\n this.cacheName = RLottiePlayer.CACHE.generateName(this.name, this.width, this.height, this.color, this.toneIndex);\n }\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 && !IS_APPLE_MX)) && 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 = getLottiePixelRatio(this.width, this.height, options.needUpscale);\n\n this.width = Math.round(this.width * pixelRatio);\n this.height = Math.round(this.height * pixelRatio);\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 // this.cachingDelta = 0;\n // if(isApple) {\n // this.cachingDelta = 0; //2 // 50%\n // }\n\n if(!this.canvas) {\n this.canvas = this.el.map(() => {\n const canvas = document.createElement('canvas');\n canvas.classList.add('rlottie');\n canvas.width = this.width;\n canvas.height = this.height;\n canvas.dpr = pixelRatio;\n return canvas;\n });\n }\n\n this.contexts = this.canvas.map((canvas) => canvas.getContext('2d'));\n\n if(!IS_IMAGE_BITMAP_SUPPORTED || this.raw) {\n this.imageData = new ImageData(this.width, this.height);\n\n if(CAN_USE_TRANSFERABLES) {\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\n }\n }\n\n if(this.name) {\n this.cache = RLottiePlayer.CACHE.getCache(this.cacheName);\n } else {\n this.cache = FramesCache.createCache();\n }\n }\n\n public clearCache() {\n if(this.cachingDelta === Infinity) {\n return;\n }\n\n if(this.cacheName && this.cache.counter > 1) { // skip clearing because same sticker can be still visible\n return;\n }\n\n this.cache.clearCache();\n }\n\n public sendQuery(args: any[], transfer?: Transferable[]) {\n this.worker.sendQuery([args.shift(), this.reqId, ...args], transfer);\n }\n\n public loadFromData(data: RLottieOptions['animationData']) {\n this.sendQuery(['loadFromData', data, this.width, this.height, this.toneIndex, this.color !== undefined/* , this.canvas.transferControlToOffscreen() */]);\n }\n\n public play() {\n if(!this.paused) {\n return;\n }\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 this.rafId = undefined;\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 this.pause();\n this.sendQuery(['destroy']);\n if(this.cacheName) RLottiePlayer.CACHE.releaseCache(this.cacheName);\n this.dispatchEvent('destroy');\n this.cleanup();\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 | HTMLCanvasElement | ImageBitmap, frameNo: number) {\n /* this.setListenerResult('enterFrame', frameNo);\n return; */\n\n try {\n if(frame instanceof Uint8ClampedArray) {\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\n // this.context.putImageData(new ImageData(frame, this.width, this.height), 0, 0);\n this.contexts.forEach((context, idx) => {\n let cachedSource: HTMLCanvasElement | ImageBitmap = this.cache.framesNew.get(frameNo);\n if(!(frame instanceof Uint8ClampedArray)) {\n cachedSource = frame;\n } else if(idx > 0) {\n cachedSource = this.canvas[0];\n }\n\n if(!cachedSource) {\n // console.log('drawing from data');\n const c = document.createElement('canvas');\n c.width = context.canvas.width;\n c.height = context.canvas.height;\n c.getContext('2d').putImageData(this.imageData, 0, 0);\n this.cache.framesNew.set(frameNo, c);\n cachedSource = c;\n }\n\n if(this.overrideRender && this.renderedFirstFrame) {\n this.overrideRender(cachedSource || this.imageData);\n } else if(cachedSource) {\n // console.log('drawing from canvas');\n context.clearRect(0, 0, cachedSource.width, cachedSource.height);\n context.drawImage(cachedSource, 0, 0);\n } else {\n context.putImageData(this.imageData, 0, 0);\n }\n\n if(!this.renderedFirstFrame) {\n this.renderedFirstFrame = true;\n }\n });\n\n this.dispatchEvent('enterFrame', frameNo);\n } catch(err) {\n console.error('RLottiePlayer renderFrame error:', err/* , frame */, this.width, this.height);\n this.autoplay = false;\n this.pause();\n }\n }\n\n public renderFrame(frame: Parameters[0], frameNo: number) {\n const canCacheFrame = this.cachingDelta && (frameNo % this.cachingDelta || !frameNo);\n if(canCacheFrame) {\n if(frame instanceof Uint8ClampedArray && !this.cache.frames.has(frameNo)) {\n this.cache.frames.set(frameNo, new Uint8ClampedArray(frame));// frame;\n } else if(IS_IMAGE_BITMAP_SUPPORTED && frame instanceof ImageBitmap && !this.cache.framesNew.has(frameNo)) {\n this.cache.framesNew.set(frameNo, frame);\n }\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\n if(delta < 0) {\n const timeout = this.frInterval > -delta ? -delta % this.frInterval : this.frInterval;\n if(this.rafId) clearTimeout(this.rafId);\n this.rafId = window.setTimeout(() => {\n this.renderFrame2(frame, frameNo);\n }, timeout);\n // await new Promise((resolve) => setTimeout(resolve, -delta % this.frInterval));\n return;\n }\n }\n\n this.renderFrame2(frame, frameNo);\n }\n\n public requestFrame(frameNo: number) {\n const frame = this.cache.frames.get(frameNo);\n const frameNew = this.cache.framesNew.get(frameNo);\n if(frameNew) {\n this.renderFrame(frameNew, frameNo);\n } else if(frame) {\n this.renderFrame(frame, frameNo);\n } else {\n if(this.clamped && !this.clamped.length) { // fix detached\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\n }\n\n this.sendQuery(['renderFrame', frameNo], this.clamped ? [this.clamped.buffer] : undefined);\n }\n }\n\n private onLap() {\n if(++this.playedTimes === this.loop) {\n this.loop = false;\n }\n\n if(!this.loop) {\n this.pause(false);\n return false;\n }\n\n return true;\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 return 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 return this.onLap();\n }\n\n return true;\n }\n\n public setMainLoop() {\n // window.cancelAnimationFrame(this.rafId);\n clearTimeout(this.rafId);\n this.rafId = undefined;\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[0].parentNode && this.el && !this.overrideRender) {\n this.el.forEach((container, idx) => container.append(this.canvas[idx]));\n }\n\n // console.log('enterFrame firstFrame');\n\n // let lastTime = this.frThen;\n this.frameListener = () => {\n if(this.paused || !this.currentMethod) {\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 // setInterval(this.frameListener, this.frInterval);\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","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Page from './page';\nimport lottieLoader from '../lib/rlottie/lottieLoader';\nimport {horizontalMenu} from '../components/horizontalMenu';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport fastSmoothScroll from '../helpers/fastSmoothScroll';\nimport whichChild from '../helpers/dom/whichChild';\n\nclass PagesManager {\n private pageId = -1;\n private page: Page;\n\n private selectTab: ReturnType;\n public pagesDiv: HTMLDivElement;\n public scrollableDiv: HTMLElement;\n\n constructor() {\n this.pagesDiv = document.getElementById('auth-pages') as HTMLDivElement;\n this.scrollableDiv = this.pagesDiv.querySelector('.scrollable') as HTMLElement;\n this.selectTab = horizontalMenu(null, this.scrollableDiv.querySelector('.tabs-container') as HTMLDivElement, null, () => {\n if(this.page?.onShown) {\n this.page.onShown();\n }\n });\n }\n\n public setPage(page: Page) {\n if(page.isAuthPage) {\n this.pagesDiv.style.display = '';\n\n const id = whichChild(page.pageEl);\n if(this.pageId === id) return;\n\n this.selectTab(id);\n\n if(this.pageId !== -1 && id > 1) {\n lottieLoader.loadLottieWorkers();\n }\n\n\n this.pageId = id;\n\n if(this.scrollableDiv) {\n fastSmoothScroll({\n container: this.scrollableDiv,\n element: this.scrollableDiv.firstElementChild as HTMLElement,\n position: 'start'\n });\n }\n } else {\n this.pagesDiv.style.display = 'none';\n page.pageEl.style.display = '';\n\n this.pageId = -1;\n }\n\n this.page = page;\n }\n}\n\nconst pagesManager = new PagesManager();\nMOUNT_CLASS_TO.pagesManager = pagesManager;\nexport default pagesManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport pagesManager from './pagesManager';\n\nexport default class Page {\n public pageEl: HTMLDivElement;\n private installed = false;\n\n constructor(\n className: string,\n public isAuthPage: boolean,\n private onFirstMount?: (...args: any[]) => Promise | void,\n private onMount?: (...args: any[]) => Promise | void,\n public onShown?: () => void\n ) {\n this.pageEl = document.body.querySelector('.' + className) as HTMLDivElement;\n }\n\n public async mount(...args: any[]) {\n // this.pageEl.style.display = '';\n\n if(this.onMount) {\n const res = this.onMount(...args);\n if(res instanceof Promise) {\n await res;\n }\n }\n\n if(!this.installed) {\n if(this.onFirstMount) {\n try {\n const res = this.onFirstMount(...args);\n if(res instanceof Promise) {\n await res;\n }\n } catch(err) {\n console.error('PAGE MOUNT ERROR:', err);\n }\n }\n\n this.installed = true;\n }\n\n pagesManager.setPage(this);\n }\n}\n","// https://github.com/twitter/twemoji-parser/blob/master/src/lib/regex.js\n\nexport function encodeEmoji(emojiText: string) {\n const codepoints = toCodePoints(removeVS16s(emojiText)).join('-');\n return codepoints;\n}\n\nconst vs16RegExp = /\\uFE0F/g;\n// avoid using a string literal like '\\u200D' here because minifiers expand it inline\nconst zeroWidthJoiner = String.fromCharCode(0x200d);\n\nconst removeVS16s = (rawEmoji: string) => (rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, '') : rawEmoji);\n\nexport function toCodePoints(unicodeSurrogates: string): Array {\n const points = [];\n let char = 0;\n let previous = 0;\n let i = 0;\n while(i < unicodeSurrogates.length) {\n char = unicodeSurrogates.charCodeAt(i++);\n if(previous) {\n points.push((0x10000 + ((previous - 0xd800) << 10) + (char - 0xdc00)).toString(16));\n previous = 0;\n } else if(char > 0xd800 && char <= 0xdbff) {\n previous = char;\n } else {\n points.push(char.toString(16));\n }\n }\n\n if(points.length && points[0].length === 2) {\n points[0] = '00' + points[0];\n }\n\n return points;\n}\n\nexport function getEmojiToneIndex(input: string) {\n const match = input.match(/[\\uDFFB-\\uDFFF]/);\n return match ? 5 - (57343 - match[0].charCodeAt(0)) : 0;\n}\n\nconst VIRTUAL_COUNTRIES_EMOJIS: Map = new Map([\n ['FT', '๐Ÿดโ€โ˜ ']\n]);\n\nexport function getCountryEmoji(iso2: string) {\n return VIRTUAL_COUNTRIES_EMOJIS.get(iso2) ??\n String.fromCharCode(55356, 56741 + iso2.charCodeAt(0), 55356, 56741 + iso2.charCodeAt(1));\n}\n\nexport function emojiFromCodePoints(codePoints: string) {\n return codePoints.split('-').reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\n}\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}])}));","/**\n * https://github.com/gre/bezier-easing\n * BezierEasing - use bezier curve for transition easing function\n * by Gaรซtan Renaudeau 2014 - 2015 โ€“ MIT License\n */\n\n// These values are established by empiricism with tests (tradeoff: performance VS precision)\nvar NEWTON_ITERATIONS = 4;\nvar NEWTON_MIN_SLOPE = 0.001;\nvar SUBDIVISION_PRECISION = 0.0000001;\nvar SUBDIVISION_MAX_ITERATIONS = 10;\n\nvar kSplineTableSize = 11;\nvar kSampleStepSize = 1.0 / (kSplineTableSize - 1.0);\n\nvar float32ArraySupported = typeof Float32Array === 'function';\n\nfunction A (aA1, aA2) { return 1.0 - 3.0 * aA2 + 3.0 * aA1; }\nfunction B (aA1, aA2) { return 3.0 * aA2 - 6.0 * aA1; }\nfunction C (aA1) { return 3.0 * aA1; }\n\n// Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2.\nfunction calcBezier (aT, aA1, aA2) { return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT; }\n\n// Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2.\nfunction getSlope (aT, aA1, aA2) { return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1); }\n\nfunction binarySubdivide (aX, aA, aB, mX1, mX2) {\n var currentX, currentT, i = 0;\n do {\n currentT = aA + (aB - aA) / 2.0;\n currentX = calcBezier(currentT, mX1, mX2) - aX;\n if (currentX > 0.0) {\n aB = currentT;\n } else {\n aA = currentT;\n }\n } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS);\n return currentT;\n}\n\nfunction newtonRaphsonIterate (aX, aGuessT, mX1, mX2) {\n for (var i = 0; i < NEWTON_ITERATIONS; ++i) {\n var currentSlope = getSlope(aGuessT, mX1, mX2);\n if (currentSlope === 0.0) {\n return aGuessT;\n }\n var currentX = calcBezier(aGuessT, mX1, mX2) - aX;\n aGuessT -= currentX / currentSlope;\n }\n return aGuessT;\n}\n\nfunction LinearEasing (x) {\n return x;\n}\n\nmodule.exports = function bezier (mX1, mY1, mX2, mY2) {\n if (!(0 <= mX1 && mX1 <= 1 && 0 <= mX2 && mX2 <= 1)) {\n throw new Error('bezier x values must be in [0, 1] range');\n }\n\n if (mX1 === mY1 && mX2 === mY2) {\n return LinearEasing;\n }\n\n // Precompute samples table\n var sampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize);\n for (var i = 0; i < kSplineTableSize; ++i) {\n sampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2);\n }\n\n function getTForX (aX) {\n var intervalStart = 0.0;\n var currentSample = 1;\n var lastSample = kSplineTableSize - 1;\n\n for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) {\n intervalStart += kSampleStepSize;\n }\n --currentSample;\n\n // Interpolate to provide an initial guess for t\n var dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]);\n var guessForT = intervalStart + dist * kSampleStepSize;\n\n var initialSlope = getSlope(guessForT, mX1, mX2);\n if (initialSlope >= NEWTON_MIN_SLOPE) {\n return newtonRaphsonIterate(aX, guessForT, mX1, mX2);\n } else if (initialSlope === 0.0) {\n return guessForT;\n } else {\n return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, mX1, mX2);\n }\n }\n\n return function BezierEasing (x) {\n // Because JavaScript number are imprecise, we should guarantee the extremes are right.\n if (x === 0 || x === 1) {\n return x;\n }\n return calcBezier(getTForX(x), mY1, mY2);\n };\n};\n"],"names":["animationIntersector","constructor","this","observer","IntersectionObserver","entries","entry","target","group","byGroups","intersectionLockedGroups","animation","find","p","el","isIntersecting","visible","add","checkAnimation","delete","_animation","clearCache","Set","overrideIdleGroups","byPlayer","Map","lockedGroups","onlyOnePlayableGroup","videosLocked","doc","type","checkAnimations2","idle","setOverrideIdleGroup","override","getAnimations","element","found","player","push","removeAnimation","HTMLVideoElement","remove","IS_SAFARI","setTimeout","src","load","length","unobserve","removeAnimationByPlayer","item","get","addAnimation","observeElement","controlled","has","canvas","placeholder","HTMLElement","onClean","loop","observe","set","checkAnimations","blurred","destroy","imitateIntersection","undefined","groups","Object","keys","animations","paused","pause","autoplay","play","getOnlyOnePlayableGroup","setOnlyOnePlayableGroup","lockGroup","unlockGroup","refreshGroup","forEach","lockIntersectionGroup","unlockIntersectionGroup","toggleIntersectionGroup","lock","SHOULD_USE_SAFARI_FIX","navigator","userAgent","match","err","AppMediaPlaybackController","media","scheduled","mediaDetails","waitingMediaForLoad","waitingScheduledMediaForLoad","waitingDocumentsForLoad","playbackRates","voice","video","audio","seekBackward","details","playingMedia","currentTime","Math","max","seekOffset","seekForward","min","duration","seekTo","seekTime","onMediaDocumentLoad","managers","appDocsManager","getDoc","docId","supportsStreaming","handleSafariStreamable","cacheContext","thumbsStorage","getCacheContext","url","playbackRate","id","size","onPlay","e","peerId","mid","pip","message","getMessageByMedia","stop","setMedia","verify","listLoader","current","getCurrent","jumpLength","withOtherSide","previous","getPrevious","idx","findIndex","getNext","go","setTargets","dispatchEvent","getPlayingDetails","pauseMediaInOtherTabs","onPause","onEnded","isTrusted","lockedSwitchers","round","next","toggle","clean","s","isScheduled","storage","playingMediaType","playItem","searchContext","getMedia","resolveWaitingForLoadMedia","dispatchJump","goRound","browserPlay","bindBrowserCallback","browserPause","browserStop","browserSeekBackward","browserSeekForward","browserSeekTo","browserNext","browserPrevious","seekToStart","construct","container","document","createElement","style","cssText","body","append","mediaSession","actions","seekbackward","seekforward","seekto","previoustrack","nexttrack","action","setActionHandler","console","warn","skipMediaPlayEvent","properties","key","_key","value","dispatchPlaybackParams","defineProperties","getPlaybackParams","volume","muted","setPlaybackParams","params","_volume","_muted","_playbackRate","_loop","_round","addMedia","autoload","pFlags","is_scheduled","setAttribute","addEventListener","media_unread","fromId","appMessagesManager","readMessages","once","deferred","resolve","w","waitingStorage","then","promise","isSafariBuffering","safariBuffering","setSafariBuffering","setNewMediadata","pictureInPictureElement","artwork","isVoice","title","artist","thumbs","bytes","sizes","h","thumb","appPeersManager","getPeerPhoto","plainText","onlyFirstName","attribute","attributes","_","file_name","performer","IS_APPLE","metadata","MediaMetadata","setCurrentMediadata","playbackParams","cb","willBePlayed","willBePlayedMedia","setSearchContext","context","getSearchContext","prev","reset","loadCount","loadWhenLeft","processItem","onJump","older","onEmptied","reverse","folderId","getPlaybackMediaTypeFromMessage","mediaType","setSingleMedia","wasPlaying","toggleSwitchers","playPaused","removeEventListener","enabled","setPictureInPicture","listenerSetter","removeAll","appMediaPlaybackController","AppMediaViewer","captionTimeout","super","isForDocument","inputFilter","isMediaCompatibleForDocumentViewer","onPrevClick","openMedia","getMessageByPeer","onNextClick","onDeleteClick","content","close","onForwardClick","onAuthorClick","Number","MAX_SAFE_INTEGER","threadId","tab","lastMsgId","onDownloadClick","queueId","caption","classList","setCaptionTimeout","clearTimeout","window","onAdditionalScroll","wholeDiv","buttons","btnMenuForward","icon","text","onClick","btnMenuDownload","btnMenuDelete","setBtnMenuToggle","setListeners","forward","author","onCaptionClick","a","spoiler","HTMLAnchorElement","contains","onclick","getAttribute","includes","capture","click","getScheduledMessageByPeer","setCaption","html","entities","totalEntities","firstElementChild","fromRight","prevTargets","nextTargets","setMoverPromise","fwd_from","from_name","noForwards","isServiceMessage","cantForwardMessage","canForward","cantDownloadMessage","download","canDeleteMessage","hide","button","_openMedia","date","static","mime_type","VideoPlayer","streamable","onPlaybackRackMenuToggle","onPip","onPipClose","wrapper","setup","canHideControls","playbackRateButton","showOnLeaveToClassName","ignoreClickClassName","parentNode","insertBefore","appendChild","skin","stylePlayer","controls","querySelector","progress","onSeekStart","onSeekEnd","prepend","catch","name","finally","initDuration","buildControls","timeDuration","insertAdjacentHTML","pipButton","querySelectorAll","fullScreenButton","timeElapsed","textContent","toHHMMSS","volumeSelector","leftControls","btn","parentElement","Array","from","togglePlay","requestPictureInPicture","visibility","debounceTime","debouncedPip","debounce","listener","timeout","overlayCounter","code","good","toggleFullScreen","altKey","nextIdx","PLAYBACK_RATES","indexOf","cancelEvent","onFullScreen","bind","hideControls","showControls","setPlaybackRateIcon","onMediaLoad","isPaused","IS_MOBILE","pictureInPictureEnabled","map","rate","regularText","btnMenu","onOpen","onClose","PLAYBACK_RATES_ICONS","className","IS_APPLE_MOBILE","webkitEnterFullscreen","enterFullscreen","isFull","cleanup","removeListeners","isBetween","num","ZOOM_MIN_VALUE","MEDIA_VIEWER_CLASSNAME","AppMediaViewerBase","topButtons","tempId","preloader","preloaderStreamable","isFirstOpen","pageEl","getElementById","zoomElements","transform","x","y","scale","lastTransform","lastZoomCenter","lastDragOffset","lastDragDelta","onSwipeFirst","moversContainer","isGesturingNow","lastGestureTime","Date","now","clampZoomDebounced","isZooming","initialContentRect","getBoundingClientRect","onSwipeReset","draggingType","isZoomingNow","closing","s1","scaleFactor","x1","y1","k","elapsedTime","Vx","abs","Vy","calculateOffsetBoundaries","setTransform","resetZoom","onZoom","initialCenterX","initialCenterY","zoom","zoomAdd","currentCenterX","currentCenterY","dragOffsetX","dragOffsetY","zoomFactor","windowSize","clamp","ZOOM_MAX_VALUE","offsetX","offsetY","scaledCenterX","scaledCenterY","scaleOffsetX","scaleOffsetY","calculateScaleOffset","offsetTop","inBoundsX","inBoundsY","minX","maxX","minY","maxY","getZoomBoundaries","setZoomValue","toFixed","btnOut","btnIn","toggleZoom","setMoverAnimationPromise","tagName","highlightSwitchersTimeout","mover","classNames","findUpClassName","onKeyDown","ctrlKeyDown","addZoomStep","ctrlKey","metaKey","onKeyUp","rootScope","log","logger","cancelable","lazyLoadQueue","overlaysDiv","mainDiv","topbar","topbarLeft","onlyMobile","authorRight","avatarEl","nameEl","buttonsDiv","concat","noRipple","rangeSelector","step","withTransition","setHandlers","onScrub","onMouseUp","main","innerHTML","onLoadedMore","setNewMover","moveLength","adjustPosition","xDiff","yDiff","setLastGestureTime","swipeHandler","onReset","onFirstSwipe","onSwipe","cancelDrag","onDoubleClick","centerX","centerY","ZOOM_INITIAL_VALUE","changeZoomByPosition","verifyTouchTarget","cursor","changeZoom","enable","isVisible","auto","mousedown","zoomValue","setProgress","videoPlayer","lockControls","addZoom","getZoomBounce","left","right","top","bottom","btnMenuToggle","buttonOptions","direction","Promise","reject","navigationItem","appNavigationController","clear","setMoverToTarget","onAnimationEnd","appMediaViewer","removeGlobalListeners","toggleOverlay","active","toggleGlobalListeners","setGlobalListeners","removeCenterFromMover","wasActive","delay","realParent","rect","SVGImageElement","SVGForeignObjectElement","needOpacity","overflowElement","visibleRect","getVisibleRect","overflow","vertical","horizontal","containerRect","aspecter","width","HTMLImageElement","setFullAspect","offsetLeft","height","scaleX","scaleY","borderRadius","getComputedStyle","getPropertyValue","brSplitted","str","splitted","split","i","fillPropertyValue","r","parseInt","join","path","opacity","isOut","ret","isFulfilled","isRejected","SVGSVGElement","sizeTailPath","toggleWholeActive","mediaElement","selector","queryFrom","matches","elements","pop","getContext","naturalWidth","naturalHeight","videoWidth","videoHeight","HTMLCanvasElement","drawImage","image","Image","createVideo","clipId","dataset","newClipId","newSvg","createElementNS","setAttributeNS","outerHTML","replace","lastElementChild","defs","use","SVGUseElement","d","getAttributeNS","sX","sY","br","v","generatePathData","foreignObject","renderImageFromUrl","display","proportion","upscale","start","diff","_br","moveTheMover","toLeft","windowW","newTransform","p1","newMover","updateMediaSource","toLowerCase","setAuthorInfo","timestamp","isPeerId","wrapTitlePromise","dialog","wrapEmojiText","oldAvatar","newAvatar","cloneNode","all","updateWithOptions","peerTitle","replaceContent","replaceWith","setAuthorPromise","isDocument","isVideo","useContainerAsTarget","onPop","canAnimate","IS_MOBILE_SAFARI","maxWidth","padding","windowH","mediaSizes","maxHeight","thumbPromise","setAttachmentSize","photoSize","img","downloaded","gotThumb","getStrippedThumbIfNeeded","loadPromise","useController","div","moverVideo","canPlayThrough","createPlayer","ckin","overlay","open","otherMediaViewer","releaseSingleMedia","show","readyState","HAVE_FUTURE_DATA","attach","attachCanPlay","detach","loading","networkState","NETWORK_LOADING","isntEnoughData","unshift","appDownloadManager","toast","langPackKey","error","cancellablePromise","photoSizes","slice","filter","sort","b","cancellableFullPromise","attachPromise","haveImage","fullImage","setManual","onPopState","hash","location","state","debug","isPossibleSwipe","currentHash","overriddenHash","overrideHash","onHashChange","pushState","navigations","manual","handleItem","onEscape","back","onTouchStart","touches","passive","options","history","scrollRestoration","replaceState","pushItem","noBlurOnPop","findItemByType","index","backByItem","splice","onItemAdded","noHistory","unshiftItem","spliceItems","items","origin","pathname","search","removeItem","removeByType","single","SearchGroup","clearable","clickable","autonomous","onFound","noIcons","list","setActive","childElementCount","AppSearch","searchInput","searchGroups","onSearch","minMsgId","loadedCount","foundCount","searchPromise","searchTimeout","query","listsContainer","scrollable","messages","setVirtualContainer","onChange","searchMore","onScrolledBottom","trim","beginSearch","inputField","input","focus","maxId","limit","res","count","shift","searchGroup","avatarSize","meAsSaved","SearchContextMenu","attachTo","searchSuper","onGotoClick","appImManager","selection","isSelecting","selectionForwardBtn","onSelectClick","toggleByElement","onClearSelectionClick","cancelSelection","selectionDeleteBtn","attachContextMenuListener","callback","init","MouseEvent","preventDefault","cancelBubble","toPeerId","isSelected","isMidSelected","withSelection","positionMenu","contextMenuController","AppSearchSuper","tabs","prevTabId","middleware","historyStorage","usedFromHistory","loadMutex","nextRates","loadPromises","loaded","loadedChats","firstLoad","monthContainers","mediaTabsMap","asChatList","groupByMonth","hideEmptyTabs","showSender","onTransitionStart","onTransitionEnd","safeAssign","searchContextMenu","navScrollableContainer","navScrollable","nav","tabsMenu","mediaTab","mediaTabs","menuTab","span","ripple","unlockScroll","tabsContainer","handleTabSwipe","prevId","selectTab","children","onTouchMove","lockers","lockTouchScroll","contentTab","searchGroupMedia","canLoadMediaTab","horizontalMenu","tabContent","animate","skipScroll","scrollIntoViewNew","position","startCallback","scrollStartCallback","newMediaTab","onChangeTab","fromMediaTab","scrollTop","scroll","scrollHeight","rect2","onScroll","onMediaClick","targetClassName","mediaSpoiler","event","targets","containerEl","copySearchContext","inputMessagesFilterPhotoVideo","inputMessagesFilterDocument","useHeavyAnimationCheck","unlockAndRefresh","filterMessagesByType","filterMessagesByInputFilter","processEmptyFilter","dialogElement","appDialogsManager","setLastMessagePromise","lastMessage","highlightWord","noop","processPhotoVideoFilter","promises","getMediaFromMessage","wrapped","choosePhotoSize","boxWidth","boxHeight","onlyPreview","withoutPreloader","noPlayButton","photo","noBlur","animationGroup","multiply","images","full","Boolean","processDocumentFilter","withTime","fontWeight","voiceAsMusic","autoDownloadSize","getSize","processUrlFilter","webPage","webpage","entity","display_url","sliced","offset","matchUrl","same","URL","hostname","description","previewDiv","setInnerHTML","wrapAbbreviation","subtitleFragment","htmlToDocumentFragment","wrapRichText","innerText","decodeURIComponent","href","firstChild","wrapPlainText","row","titleRight","subtitle","havePadding","applyMediaElement","performSearchResult","elemsToAppend","sharedMediaDiv","processCallback","results","awaited","method","monthContainer","getMonthContainerByTimestamp","toggleElementCheckbox","afterPerforming","parent","child","loadChats","renderedPeerIds","inputMessagesFilterEmpty","setResults","showMembersCount","dom","peer","getPeer","participants_count","participants","regExp","RegExp","escapeRegExp","cleanSearchText","titleSpan","lastMessageSpan","getChatMembersString","toChatId","username","getPeerUsername","user","appUsersManager","getUser","phone","formatPhoneNumber","formatted","onLoad","arg","getContactsPeerIds","contacts","searchContacts","my_results","globalContacts","showMore","intlElement","isShort","update","dialogsStorage","getDialogs","offsetIndex","filterId","dialogs","minDate","renderRecentSearch","recent","replaceChildren","recentSearch","isUser","getUserStatusString","toUserId","getTopPeers","peers","people","subtitleEl","loadMembers","renderParticipants","membersList","rippleEnabled","li","findUpTag","DIALOG_LIST_ELEMENT_TAG","participant","getParticipantPeerId","isAnyChat","deleted","appChatsManager","isChannel","LOAD_COUNT","appProfileManager","getChannelParticipants","getChatFull","chatFull","loadType","justLoad","used","slicedLength","ids","notFilteredMessages","m","checkForTriggers","getSearch","nextRate","next_rate","loadFirstTime","filters","counters","canViewMembers","getSearchCounters","firstMediaTab","counter","c","membersTab","loadFirstTimePromise","toLoad","t","findAndSplice","setHours","setDate","dateTimestamp","getTime","containers","month","getFullYear","year","dateElement","haveTimestamps","getObjectKeysAndSort","positionElementByIndex","chatId","isBroadcast","hasRights","isForum","cleanScrollPositions","cleanupHTML","goFirst","putPreloader","empty","newInputFilter","copy","setQuery","maxDate","AppSelectPeers","chatsContainer","selected","freezed","loadedWhat","peerType","multiSelect","exceptSelf","tempIds","selfPresence","needSwitchList","design","onInput","cachedContacts","getMoreResults","f","renderResultsFunc","renderResults","peerIds","splitUp","notRendered","filterPeerTypeBy","section","innerContainer","topContainer","selectedContainer","selectedScrollable","sectionNameLangPackKey","noShadow","checkbox","checked","debouncedInput","appendTo","getResultsPromise","onFirstRender","renderSaved","testSelfSearch","getTempId","getMoreDialogs","archived","pageCount","skipMigrated","newOffsetIndex","chatRightsAction","filterByRights","isEnd","getMoreContacts","isGlobalSearch","searchResult","resultPeerIds","arr","getMoreChannelParticipants","channelParticipants","q","getMoreSomething","call","isNonContactUser","checkboxField","label","isDialog","insertAdjacentElement","offsetWidth","getSelected","addInitial","values","requestAnimationFrame","forceDirection","constructDownloadPreloader","tryAgainOnFail","circle","totalLength","mids","attr","elem","findMediaTargets","anchor","anchorMid","isBubbles","justAudioSelector","selectors","prefix","mediaItems","AudioElement","render","isRealVoice","isOutgoing","is_outgoing","uploadingFileName","durationStr","downloadDiv","onTypeLoad","audioEl","out","waveform","Uint8Array","valueCount","result","dataView","DataView","buffer","byteIndex","bitShift","getUint16","decodeWaveform","svg","svgContainer","availW","barHeightMax","minW","maxW","normValue","wfSize","barCount","maxValue","maxDelta","barX","sumI","bar_value","barWidth","createWaveformBars","fakeSvgContainer","waveformContainer","timeDiv","onTimeUpdate","throttledTimeUpdate","addAudioListener","readyPromise","mousemove","scrub","targetTouches","pageX","scrubTime","wrapVoiceMessage","descriptionEl","audioAttribute","parts","titleEl","middleEllipsisEl","fontSize","sizeType","subtitleDiv","launched","progressLine","lastChild","wrapAudio","audioTimeDiv","HAVE_CURRENT_DATA","onTypeDisconnect","getTimeStr","hadSearchContext","useSearch","imgs","autoDownload","shouldPlay","onDownloadInit","pauseListener","notifyAll","done","total","cancel","Error","playListener","setDownloadFunction","disconnectedCallback","isConnected","customElements","define","AvatarListLoader","loadMore","photoId","appPhotosManager","getUserPhotos","photos","loadedAllUp","AppMediaViewerAvatar","getPhoto","onAvatarUpdate","openAvatarViewer","getTarget","hadMessage","isObject","data","believeMe","seen","getAvatarQueueKey","AvatarElement","addedToQueue","middlewareHelper","attachClickEvent","updateOptions","wasPeerId","wasThreadId","newPeerId","wrapOptions","create","onlyThumb","putPhoto","isBig","AvatarEdit","clearRect","Button","asLink","asDiv","rippleSquare","disabled","ButtonMenuItem","separator","iconDoc","noCheckboxClickListener","textElement","textArgs","iconElement","noFadeIn","processUrl","fetch","response","color","DOMParser","parseFromString","stroke","strokeWidth","keepOpen","menu","checkForClose","multiline","ButtonMenuSync","ButtonMenu","ButtonMenuToggleHandler","openedMenu","ButtonMenuToggle","attachListenerSetter","onOpenBefore","onCloseAfter","closeTimeout","filteredButtons","_element","ChatBackgroundGradientRenderer","_width","_height","_tails","_scrollTails","_curve","_positions","_phases","onWheel","_animatingToNextPosition","_scrollDelta","deltaY","_onWheelRAF","drawOnWheel","floor","ceil","changeTailAndDraw","drawNextPositionAnimated","getProgress","transitionValue","nextPositionTail","_nextPositionTail","_nextPositionTails","_nextPositionLeft","frames","_frames","drawImageData","_incrementalCurve","hexToRgb","hex","g","getPositions","positions","getNextPositions","phase","curveMax","curve","pos","distances","nextPos","distance","curPosition","tail","changeTail","_tail","_phase","curPos","drawGradient","getGradientImageData","_hctx","createImageData","pixels","centerDistanceY","centerDistanceY2","centerDistanceX","swirlFactor","sqrt","theta","sinTheta","sin","cosTheta","cos","pixelX","pixelY","distanceSum","_colors","distanceX","distanceY","putImageData","_ctx","_hc","cancelAnimationFrame","colors","alpha","_canvas","fillStyle","fillRect","toNextPosition","tails","nextPhaseOnIdx","inc","curves","last","scrollAnimate","createCanvas","gradientRenderer","accumulateMapSet","reduce","acc","AppSelection","selectedMids","onMouseDown","targetLookupClassName","verifyTarget","selecting","firstTarget","processElement","checkBetween","isInDOM","seenSet","seenLength","findUpAsChild","elementsBetween","getElementsBetween","toggleByMid","canceledSelection","onMouseMove","getElementFromTarget","verifyMouseMoveTarget","removeManual","listenElement","documentListenerOptions","first","firstRect","lastRect","isHigher","lookupBetweenParentClassName","lookupBetweenElementsQuery","firstIndex","lastIndex","doNotAnimate","onCancelSelection","toggleSelection","navigationType","random","attachListeners","selectedText","getSelection","toString","createRange","verifyTouchLongPress","isElementShouldBeSelected","appendCheckbox","hasCheckbox","getCheckboxInputFromElement","forwards","updateContainer","forceSelection","cantForward","cantDelete","cantSend","storageKey","cantForwardDeleteMids","onUpdateContainer","toggleCheckboxes","wasSelecting","blurActiveElement","toggleResult","onToggleSelection","updateElementSelection","toggleMid","unselect","deleteSelectedMids","SearchSelection","selectionCountEl","selectionGotoBtn","selectionContainer","BASE_CLASS","btnCancel","attachClickOptions","obj","fromPeerId","isPrivate","transitionElement","ChatSelection","chat","bubbles","recording","bubble","canSelectBubble","isGroupedBubbleSelected","getMidsFromGroupContainer","getBubbleGroupedItems","groupContainer","isGroupedSelected","isGroupedMidsSelected","mounted","getMountedBubble","needTranslateX","widthFrom","widthTo","center","selectionInputWrapper","selectionSendNowBtn","selectionLeft","selectionRight","translateButtonsX","inputContainer","toggleAttribute","skippedMids","isGrouped","groupedCheckboxInput","CheckboxField","restriction","toggleDisability","stateKey","stateValues","stateValue","setValueSilently","box","checkSvg","bg","border","withRipple","withHover","Event","disable","CodeInputField","assign","autocomplete","lastLength","setLabel","onFill","confirmationPopup","checkboxes","cancelButton","isCancel","countries","setCountries","country","hidden","default_name","localeCompare","VIRTUAL_COUNTRIES","CountryInputField","hidePicker","hideTimeout","selectWrapper","selectCountryByTarget","defaultName","phoneCodeEl","phoneCode","countryCode","simulateInputEvent","lastCountrySelected","lastCountryCodeSelected","country_codes","_countryCode","country_code","onCountryChange","liMap","arrowDown","selectList","initSelect","noPhoneCodes","iso2","emoji","liArr","Infinity","spanEmoji","select","margin","mouseDownHandlerAttached","onKeyPress","_value","names","abbr","word","test","blur","selectCountryByIso2","countryName","DotRenderer","dpr","devicePixelRatio","prepare","dots","generateDot","adding","radius","Path2D","arc","PI","mOpacity","draw","dot","addOpacity","easedOpacity","globalAlpha","fill","renderFirstFrame","dotRenderer","EditPeer","_disabled","isChanged","uploadAvatar","changedLength","requiredLength","requiredValidLength","inputFields","isValid","required","handleChange","nextBtn","withoutAvatar","avatarElem","doNotEditAvatar","avatarEdit","_upload","popupOptions","lockWithPromise","unlockOnSuccess","GifsTab","gifsContainer","EmoticonsDropdown","masonry","EMOTICONSSTICKERGROUP","getGifs","docs","processInvisibleDiv","ANIMATIONGROUP","AppGifsTab","nextOffset","loadedAll","onGifsClick","fileId","inputSearch","gifsDiv","onCloseAfterTimeout","newSearch","gifBotPeerId","resolveUsername","appInlineBotsManager","getInlineResults","next_offset","AppStickersTab","setsDiv","listenTo","sticker","stickerSet","access_hash","appStickersManager","getStickerSet","toggleStickerSet","changed","installed_date","removeAttribute","renderFeatured","renderSet","header","countDiv","stickersDiv","stickerDiv","documents","withLock","getFeaturedStickers","coveredSets","filterRendered","forEachReverse","covered","searchStickerSets","scrollOptions","forceDuration","transitionFunction","ignoreOutClickClassName","tabId","onSelectTabClick","searchButton","emojiTab","deleteBtn","scrollTo","checkRights","tabsEl","tabsElements","canSendStickers","canSendGifs","canSendToPeer","stickersTab","gifsTab","whichChild","savedRange","getGoodRange","onOpened","unlock","refresh","onClosed","range","getSavedRange","setStartAfter","newRange","cloneRange","collapsed","node","endContainer","endOffset","newStartNode","previousSibling","nodeType","TEXT_NODE","nodeValue","ELEMENT_NODE","isContentEditable","selectNode","newOffset","setStart","deleteContents","HIDE_EMOJI_TAB","INIT_TAB_ID","lastMouseMoveEvent","mouseMoveEventAttached","isActive","onMouseOut","getElement","axis","clearDraft","silent","emoticonsDropdown","forceClose","addLazyLoadQueueRepeat","divs","intersector","getVisible","clearVisible","sel","rangeCount","activeElement","getRangeAt","menuOnClick","emoticons","menuScroll","prevTab","jumpedTo","getElementPosition","elementPosition","scrollToTab","scrollingToContent","stickyIntersector","stuck","getCategoryByContainer","which","getCategoryByMenuTab","additionalOffset","setActiveStatic","local","scrollLeft","clientWidth","sendDocId","loadedURLs","appendEmoji","unify","kek","getEmojiEntityFromEmoji","wrapSingleEmoji","fixEmoji","getEmojiFromElement","superEmoji","stickerEmoji","EMOJI_RECENT_ID","EMOJI_RECENT_CATEGORY","CUSTOM_EMOJI_RECENT_CATEGORY","EMOJI_CATEGORIES","sorted","category","order","EMOJI_ELEMENT_SIZE","EmojiTab","onCategoryVisibility","categoriesMap","renderer","newChildren","customEmojis","customEmojiElement","clearCanvas","onContentClick","isStandalone","langPackArguments","activeElements","menuInnerScroll","intersectionOptions","root","categoriesIntersector","menuOnClickResult","innerScrollWrapper","preparedMap","noRegularEmoji","emojis","titleLangPackKey","createLocalCategory","unified","addEmojiToCategory","batch","appEmojiManager","getRecentEmojis","stickerSetId","getLocalStickerSet","getCustomEmojis","recentCustom","mainSet","sets","recentCategory","categories","recentCustomCategory","CUSTOM_EMOJI_RECENT_ID","createRendererForCategory","paddingTop","toggleLocalCategory","resizeCategories","after","renderStickerSet","toggleCustomCategory","postponedEvent","positionCategory","toggleRenderers","ignore","ignoreSettingDimensions","setDimensionsFromRect","deleteCategory","isCategoryVisible","forceRender","closeScrollTop","createCategory","menuTabPadding","stickerEmojiRaw","setCategoryItemsHeight","getCustomCategory","hasPremium","canSeeCustomCategory","customEmojiSize","activeEmoji","spliceExceed","onLocalCategoryUpdate","LazyLoadQueueRepeat","parallelLimit","onVisibilityChange","elementsMap","queueItem","wasSeen","queue","indexOfAndSplice","setProcessQueueTimeout","SuperStickerRenderer","regularLazyLoadQueue","animated","checkAnimationContainer","processVisible","processInvisible","renderSticker","observeAnimated","unobserveAnimated","StickersTabCategory","noMenuTab","getContainerSize","getElementMediaSize","gapX","gapY","containerWidth","elementSize","itemsPerRow","rows","minHeight","EmoticonsTabC","categoryItemsClassName","args","postponedEvents","categoriesByMenuTabMap","localCategories","menuWrapper","isLocal","esgWidth","customProperties","observeStickyHeaderChanges","posItems","foundMenuScroll","posMenu","notMountedItems","notMountedMenus","itemsIdx","menuIdx","disconnect","StickersTab","setTyping","setFavedLimit","categoryAppendStickers","superStickerRenderer","clearCategoryItems","onCategoryStickers","stickers","deleteSticker","unshiftSticker","favedCategory","clearButton","titleLangKey","descriptionLangKey","langKey","clearRecentStickers","premiumCategory","apiManager","getLimit","getFavedStickersStickers","getRecentStickersStickers","getAllStickers","getPremiumStickers","isPremium","race","rendererLazyLoadQueue","faved","createStickersContextMenu","verifyRecent","unshiftRecentSticker","saveRecentSticker","deleteRecentSticker","generateDelimiter","delimiter","generateFakeIcon","isScam","LazyLoadQueueRepeat2","spliced","findAndSpliceAll","GifsMasonry","scrollPromise","processVisibleDiv","noInfo","noPreview","transitionTime","scrollableX","proxy","Proxy","apply","that","selectTarget","result1","canChange","mutateCallback","useStripe","indicator","currentIndicator","shiftLeft","insertRichTextAsHTML","wrappingForPeerId","some","createCustomEmojiRendererForInput","fragment","wrapDraftText","customEmojiRenderer","contentEditable","richInputHandler","customEmojiElements","ces","documentFragmentToHTML","pre","getCaretPosNew","createTextNode","collapse","removeAllRanges","addRange","onBeforeInput","inputType","execCommand","removeExtraBOMs","findUpAttribute","noLinebreaks","originalEvent","clipboardData","getData","usePlainText","filterEntity","curChild","nextSibling","richValue","getRichValueWithCaret","lines","textLength","lineIndex","line","nextLine","correctedText","entities2","parseEntities","mergeEntities","InputState","wrappingDraft","isSelectable","processCustomEmojisInInput","hasSet","connectedCallback","InputField","validate","maxLength","showLengthOn","canBeEdited","labelText","onInputCallbacks","isCollapsed","focusOnNext","clientX","isInputEmpty","inputMode","labelEl","showingLength","wasError","inputLength","isError","withLinebreaks","selectNodeContents","selectElementContents","labelOptions","fromSet","originalValue","isValidToChange","setDraftValue","setOriginalValue","setState","Valid","setError","InputSearch","prevValue","onClearClick","onClear","searchIcon","clearBtn","LazyLoadQueue","ignoreHeavyAnimation","getItem","addElement","LazyLoadQueueIntersector","inProcess","loadItem","intersectorTimeout","processQueue","MediaProgressLine","useTransform","onLoadedData","seek","progressRAF","setLoadProgress","onProgress","filledLoad","setSeekMax","buf","buffered","numRanges","nearestStart","end","percents","testQueue","pendingTest","setTestQueue","testElement","getElementWidth","mapped","firstTime","multiplier","font","textWidth","elementWidth","newElementWidth","widthChanged","smallerText","smallerWidth","smallerTextLength","half","half1","substr","half2","MiddleEllipsisElement","PasswordMonkey","passwordInputField","needFrame","noCache","currentFrame","setSpeed","helpers","onVisibilityClickAdditional","passwordVisible","setDirection","curFrame","TrackingMonkey","playAnimation","frame","idleAnimation","PasswordInputHelpers","onVisibilityClick","toggleVisible","stealthy","tabIndex","PasswordInputField","PeerProfileAvatars","avatar","avatars","draggable","loadCallback","intersectionObserver","loadCallbacks","addTab","gradient","info","arrowPrevious","arrowNext","checkScrollTop","SWITCH_ZONE","freeze","_e","clickX","toRight","cancelNextClick","lastDiffX","lastX","SCALE","TRANSLATE_TEMPLATE","addIndex","loadNearestToTarget","setPeer","backLimit","filterChatPhotosMessages","chat_photo","generateFakeAvatarMessage","activeTab","photo_id","setText","PeerProfile","noDelimiter","bio","contextMenu","subtitleLangKey","isAnonymous","getUserPhone","link","notifications","togglePeerMute","appNotificationsManager","isPeerLocalMuted","respectType","setPeerStatus","setMoreDetails","n","fillUsername","userId","self","fillUserPhone","setAvatar","setPeerStatusInterval","setInterval","needClear","callbacks","useWhitespace","ignoreSelf","clearSetMoreDetailsTimeout","canBeDetailed","createAvatar","_setAvatar","isTopic","oldAvatars","getUsernamesAlso","usernames","also","anchorCopy","getPeerActiveUsernames","formatUserPhone","fillNotifications","notificationsRow","fillName","withIcons","fillRows","fillProfileElements","cleaned","_setMoreDetails","peerFull","getMiddlewarePromise","getServerMessageId","about","getChat","exportedInvite","exported_invite","address","setMoreDetailsTimeout","isPeerRestricted","acknowledged","getProfileByPeerId","setPromise","cached","middlewarePromise","makeError","clearInterval","generateTitleIcons","noVerifiedIcon","noFakeIcon","noPremiumIcon","verified","use2","generateVerifiedIcon","fake","scam","premium","emojiStatus","emoji_status","generatePremiumIcon","weakMap","WeakMap","PeerTitle","setOptions","setHasInner","hasInner","fromName","limitSymbols","topic","forumTopic","getTopicIconPromise","icons","topicIcon","getPeerTitle","withPremiumIcon","inner","createDocumentFragment","PopupAvatar","closable","withConfirm","cropper","crop","removeHandlers","h6","btnClose","cropContainer","file","files","readBlobAsDataURL","contents","onload","originalImage","cropComponent","cropImage","event_state","cropLeft","cropTop","cropWidth","cropHeight","scaledRatio","overlayColor","CROPWIDTH","offsetHeight","CROPHEIGHT","updateCropSize","updateCropImage","startMoving","resizing","keyHandler","imgZoom","newWidth","newHeight","clientHeight","String","fromCharCode","charCode","stopPropagation","container_width","container_height","container_left","container_top","mouse_x","scrollX","mouse_y","clientY","pageY","scrollY","saveEventState","moving","endMoving","currentTouch","complete","btnConfirm","toBlob","blob","darkenCanvas","onCrop","postCanvas","ctx","PopupDeleteDialog","onSelect","peerTitleElement","getDialogType","callbackLeave","flush","leave","flushHistory","callbackDelete","titleArgs","descriptionArgs","isDanger","titleLangArgs","descriptionLangArgs","PopupDeleteMessages","onConfirm","revoke","deleteScheduledMessages","deleteMessages","isMegagroup","_hasRights","canRevoke","PopupForward","peerIdMids","peerTypes","forwardMessages","DEFAULT_APPEND_TO","appendPopupTo","onFullScreenChange","PopupElement","reAppend","titleRaw","MANAGERS","confirmShortcutIsSendShortcut","withoutOverlay","overlayClosable","attachScrollableListeners","btnConfirmOnEnter","buttonsEl","buttonsElements","langArgs","POPUPS","setClassOn","attachBorderListeners","onContentUpdate","popup","popupConstructor","ctor","addCancelButton","pin","descriptionPremium","descriptionLocked","folders","P","_a","limitPremium","isLocked","limitContainer","hint","free","setHintActive","showLimitPopup","appConfig","premium_purchase_blocked","times","ONE_HOUR","PopupMute","time","mutePeer","muteUntil","radioForm","PopupPeer","noTitle","o","original","nextElementSibling","PopupPickUser","PopupSendNow","sendScheduledMessages","ANIMATION_GROUP","PopupStickers","stickerSetInput","isEmojis","onStickersClick","updateAdded","stickersFooter","onStickerSetUpdate","_set","updateButton","loadStickerSet","createStickerSetElements","headerRow","buttonRight","added","itemsContainer","setsPromises","isArray","firstSet","isStickerPack","onSend","containersPromises","docIds","toggleStickerSets","isAdd","buttonAppend","installed","ProgressivePreloader","detached","isUpload","attachMethod","loadFunc","constructContainer","bold","constructDownloadIcon","downloadSvg","cancelSvg","previousElementSibling","func","startTime","onEnd","notify","TRANSITION_TIME","addNotifyListener","useRafs","getTotalLength","strokeDasharray","putAvatar","renderThumbPromise","thumbImage","isFullLoaded","loadThumbPromise","stripped_thumb","getPreviewURLFromBytes","sequentialDom","renderPromise","myId","getForumTopic","setProperty","getPeerColorById","forum","avatarAvailable","avatarRendered","appAvatarsManager","isAvatarCached","first_name","last_name","getPeerInitials","returnDiv","setButtonLoader","RadioField","alignRight","RadioForm","radios","form","RangeSelector","events","setFilled","filled","stepStr","decimals","_removeListeners","addProgress","rectMax","offsetAxisValue","rippleClickId","attachListenerTo","handler","drawRipple","clickId","_handler","touchStartFired","clickY","isRippleUnneeded","touchEnd","setContent","Row","checkboxFieldOptions","radioField","noWrap","subtitleRight","subtitleRow","createRow","subtitleLangArgs","isToggle","withCheckboxSubtitle","titleRightContent","titleRightSecondary","titleRow","createTitle","navigationTab","buttonRightLangKey","_subtitle","createSubtitle","midtitle","_midtitle","createMidtitle","createMedia","disableWithPromise","makeSortable","sortIcon","toggleSorting","CreateRowFromCheckboxField","RadioFormFromRows","RadioFormFromValues","checkedRadioField","ScrollableBase","logPrefix","onScrollMeasure","lastScrollPosition","lastScrollDirection","isHeavyAnimationInProgress","needCheckAfterAnimation","cancelMeasure","onScrolledTop","scrollPosition","scrollProperty","addScrollListener","addedScrollListener","removeScrollListener","removeHeavyAnimationListener","Scrollable","onScrollOffset","withPaddingContainer","maxScrollTop","isScrolledDown","getDistanceToEnd","setScrollTopSilently","ignoreNextScrollEvent","ScrollableX","splitCount","scrollHorizontally","deltaX","scrollWidth","SettingSection","fakeGradientDelimiter","hr","generateContentElement","nameArgs","captionOld","captionArgs","generateSection","AppNewGroupTab","isGeoChat","setTitle","inputWrapper","groupNameInputField","groupLocationInputField","valueCheck","userLocationCoords","userLocationAddress","createChannel","geo_point","megagroup","inputFile","editPhoto","inviteToChannel","createChat","chatsSection","new","startLocating","geolocation","getCurrentPosition","lat","coords","latitude","long","longitude","uri","json","display_name","GeolocationPositionError","PrivacyType","getPrivacyRulesDetails","rules","types","allowPeers","users","chats","disallowPeers","rule","PrivacySection","onRadioChange","captions","captionElement","radioSection","exceptions","radioRows","skipTypes","noExceptions","exceptionTexts","exception","_peerIds","slider","createTab","skippable","takeOut","newPeerIds","generateStr","splitPeersByType","selectedPeerIds","appPrivacyManager","getPrivacy","inputKey","setRadio","eventListener","chatKey","usersKey","getUserInput","setPrivacy","AppPrivacyPhoneNumberTab","getSelf","captionEl","mePath","phoneSection","sCaption","AppTwoStepVerificationSetTab","stickerContainer","inputContent","btnReturn","sliceTabsUntilTab","AppSettingsTab","canFocus","isFirstInput","AppTwoStepVerificationEmailConfirmationTab","isFirst","email","codeInputField","passwordManager","confirmPasswordEmail","goNext","btnChange","btnResend","cancelPasswordEmail","AppTwoStepVerificationEmailTab","resendPasswordEmail","onOpenAfterTimeout","onContinueClick","btnContinue","btnSkip","matchEmail","toggleButtons","updateSettings","currentPassword","plainPassword","newPassword","symbols","AppTwoStepVerificationHintTab","onSkipClick","saveHint","AppTwoStepVerificationReEnterPasswordTab","monkey","verifyInput","AppTwoStepVerificationEnterPasswordTab","isNew","has_password","textEl","getStateInterval","getState","_state","check","auth","AppTwoStepVerificationTab","removeTabFromHistory","btnChangePassword","btnDisablePassword","btnSetRecoveryEmail","has_recovery","btnSetPassword","AppPrivacyLastSeenTab","AppPrivacyProfilePhotoTab","AppPrivacyForwardMessagesTab","AppPrivacyAddToGroupsTab","AppPrivacyCallsTab","AppActiveSessionsTab","Session","app_name","app_version","ip","date_active","date_created","device_model","system_version","platform","authorizations","session","btnTerminate","invokeApi","otherSection","onError","onTerminateClick","menuElement","AppBlockedUsersTab","btnAdd","toggleBlock","bot","blocked","getBlocked","convertKeyToInputKey","toUpperCase","AppPrivacyVoicesTab","AppActiveWebSessionsTab","sessions","bot_id","region","domain","browser","appSeamlessLoginManager","resetWebAuthorizations","leftLength","resetWebAuthorization","AppPrivacyAndSecurityTab","fromTab","getAppConfig","globalPrivacy","getGlobalPrivacySettings","contentSettings","webAuthorizations","getWebAuthorizations","SUBTITLE","blockedPeerIds","blockedUsersRow","passwordState","twoFactorRowOptions","email_unconfirmed_pattern","twoFactorRow","activeSessionsRow","updateActiveSessions","websitesRow","updateActiveWebsites","websites","setBlockedCount","updateBlocked","rowsByKeys","numberVisibilityRow","lastSeenTimeRow","photoVisibilityRow","callRow","linkAccountRow","groupChatsAddRow","voicesRow","updatePrivacyRow","disallowLength","allowLength","destroyed","setGlobalPrivacySettings","archive_and_mute_new_noncontact_peers","settings","onPremiumToggle","autoarchive_setting_available","_enabled","sensitive_enabled","sensitive_can_change","payment","appPaymentsManager","clearSavedInfo","deleteButton","appDraftsManager","clearAllDrafts","auths","AppQuickReactionTab","appReactionsManager","getQuickReaction","getAvailableReactions","quickReaction","availableReactions","reaction","inactive","availableReaction","static_icon","setDefaultReaction","emoticon","RangeSettingSelector","initialValue","minValue","writeValue","nameDiv","valueDiv","valueContainer","AppGeneralSettingsTab","themes","allStickers","chatBackgroundButton","initArgs","animationsCheckboxField","themesContainer","themesMap","currentTheme","themeController","isNight","applyThemeOnItem","theme","wallPaperContainer","wallPaperContainers","lastOnFrameNo","lastActive","restart","onFrameNo","frameNo","maxFrame","availableBaseThemes","defaultThemes","default","themeSettings","base_theme","wallPaper","wallpaper","emoticonContainer","bubbleIn","marginTop","dayRow","nightRow","systemRow","newIsNight","enterRow","ctrlEnterRow","kilometersRow","milesRow","formats","format","runFirst","getNextTimeout","_callback","run","eachTimeout","getSeconds","eachMinute","toLocaleTimeString","hour","minute","suggestCheckboxField","bigCheckboxField","reactionsRow","renderQuickReaction","getCustomEmojiDocument","document_id","loopCheckboxField","stickerSets","stickersContent","assumeType","AppChatFoldersTab","filtersRendered","animationData","lottieLoader","renderFolder","dialogFilter","non_contacts","broadcasts","bots","folder","getFolderDialogs","channels","isAnyGroup","filtersStorage","getFilter","setInitFilter","localId","getInitArgs","createFolderBtn","foldersSection","suggestedSection","canCreateFolder","onFiltersContainerUpdate","renderFiltersPromise","toggleAllChats","getSuggestedFilters","loadAnimationPromise","onSort","prevIdx","newIdx","updateDialogFiltersOrder","getDialogFilters","getSuggestedDialogsFilters","suggestedFilters","includePeerIds","excludePeerIds","pinnedPeerIds","createDialogFilter","AppNotificationsTab","NotifySection","enabledRow","typeText","previewEnabledRow","inputNotifyPeer","getNotifySettings","notifySettings","applySettings","isMuted","show_previews","mute","showPreviews","inputSettings","mute_until","flags","updateNotifySettings","notify_settings","contactsSignUpRow","soundRow","sound","getContactSignUpNotification","setContactSignUpNotification","AppLanguageTab","languages1","lang_pack","languages2","rendered","webLangCodes","language","lang_code","native_name","langPack","autoDownloadPeerTypeSection","contactsCheckboxField","privateCheckboxField","groupsCheckboxField","channelsCheckboxField","AppAutoDownloadPhotoTab","AppAutoDownloadFileTab","debouncedSave","sizeMax","appStateManager","setByKey","MIN","MAX_RANGE","MAX","upTo","formatBytes","compareAndUpdate","AppAutoDownloadVideoTab","AUTO_DOWNLOAD_FOR_KEYS","private","AppDataAndStorageTab","autoCheckboxField","autoDownloadNew","autoRow","resetButton","deepEqual","setSubtitles","setAutoDownloadSubtitle","photoRow","videoRow","fileRow","file_size_max","openTab","tabConstructor","onDisabledChange","peerKeys","enabledKeys","isAll","logOut","edit","profile","fillPromise","changeAvatarBtn","upload","uploadProfilePhoto","updateChangeAvatarBtn","languageArgs","devicesRow","languageRow","buttonsSection","getEditProfileArgs","editProfileArgs","getAuthorizations","overwrite","getAuthorizationsPromise","AppNewChannelTab","channelNameInputField","channelDescriptionInputField","onLengthChange","broadcast","channelId","PopupCreateContact","importContact","nameInputField","lastNameInputField","telInputField","editPeer","AppContactsTab","openContacts","isContact","sortedUserList","createList","renderPage","AppArchivedTab","wasFilterId","ul","AppPeopleNearbyTab","isLocationWatched","parseDistance","startWatching","latestLocationSaved","getLocated","accuracy","watchPosition","isLongitudeDifferent","isLatitudeDifferent","distanceCheck","calculateDistance","stopWatching","lat1","long1","lat2","long2","asin","LEFT_COLUMN_ACTIVE_CLASSNAME","AppSidebarLeft","sidebarEl","sidebarHeader","onContactsClick","backBtn","btnArchive","isDialogsLoaded","themeCheckboxField","sessionStorage","kz_version","installPrompt","toolsBtn","btnMenuFooter","rel","archivedCount","newBtnMenu","updateBtn","reload","initSearch","unreadPeerIds","formatNumber","checkUpdateInterval","cache","status","ok","hasUpdate","onResize","documentElement","searchContainer","pickedElements","selectedPeerId","selectedMinDate","selectedMaxDate","updatePicked","removeProperty","helper","unselectEntity","renderEntity","dates","dateData","pushRecentSearch","peopleContainer","hideNewBtnMenuTimeout","transition","activeClassName","onFocus","clearRecentSearchBtn","clearRecentSearch","appSidebarLeft","AppAddMembersTab","attachToPromise","isPrivacy","removeLoader","averageColorFromCanvas","pixel","getImageData","pixelsLength","outPixel","Uint8ClampedArray","highlightningColor","rgba","l","ColorPicker","hue","saturation","lightness","onGrabStart","boxDragger","onGrabEnd","sliders","hueDragger","hexInputField","rgbInputField","inputs","valid","setColor","rgbRegExp","attachBoxListeners","attachHueListeners","attachGrabListeners","boxRect","saturationHandler","hueRect","hueHandler","updateHexInput","updateRgbInput","rgb","boxX","percentY","boxY","percentHue","hueX","updatePicker","getCurrentColor","rgbaArray","hexa","hsl","hsla","posX","posY","lightnessX","lightnessY","AppBackgroundColorTab","_applyColor","updateColorPicker","colorPicker","background_color","pushToState","onColorChange","applyColor","gridSection","grid","backgroundColor","throttle","isColored","AppBackgroundTab","clicked","wallPapersByElement","elementsByKey","onUploadClick","accept","requestFile","endsWith","createObjectURL","mimeType","scaleMediaElement","File","prepareWallPaperUpload","uploadPromise","uploadWallPaper","uploadDeferred","newKey","getWallPaperKey","setBackgroundDocument","addWallPaper","onResetClick","defaultTheme","blurCheckboxField","onGridClick","getWallPaperKeyFromTheme","backgrounds","uploadButton","colorButton","pattern","wallPapers","gridContainer","hasFile","isDark","dark","intensity","webkitMaskImage","_tempId","saveToCache","slug","hadSettings","onReady","getPixelPromise","imageUrl","imageSource","ratio","averageColorFromImageSource","averageColor","toDataURL","AppIncludedChatsTab","getContacts","foundInFilters","dialogsByFilters","onSelectChange","confirmBtn","editFolderTab","originalFilter","cmp","pinned_peers","other","otherLegacy","getInputPeerById","setFilter","onAppConfig","dialog_filters_chats_limit_premium","dialog_filters_chats_limit_default","categoriesSection","exclude_muted","ico","exclude_archived","exclude_read","selectedPeers","addedInitial","_add","flag","hasOwnProperty","AppEditFolderTab","deleting","deleteFolderButton","updateDialogFilter","bool","menuBtn","inputSection","generateList","h2Text","to","includedFlagsContainer","excludedFlagsContainer","include","include_peers","editCheckForChange","reloadMissingPromises","reloadMissingPeerIds","onEditOpen","onCreateOpen","ignoreClick","hasPeer","getDialogOnly","filtered","filterAsync","renderMore","_length","exclude_peers","purchaseUsernameCaption","purchaseText","setUsername","AppEditProfileTab","bioMaxLength","userFull","firstNameInputField","bioInputField","usernameInputField","isPurchase","availableText","takenText","invalidText","profilePromise","updateProfile","updateUsername","RIGHT_COLUMN_ACTIVE_CLASSNAME","AppSidebarRight","canHideFirst","isColumnProportionSet","toggleSidebar","setColumnProportion","createSharedMediaTab","replaceSharedMediaTab","previousTab","sharedMediaTab","historyTabIds","_selectTab","getFrom","setFrom","onCloseTab","isNavigation","willChange","animationPromise","appSidebarRight","AppEditContactTab","privacy","notificationsCheckboxField","profileNameDiv","profileSubtitleDiv","phoneRow","privacyRule","sharePhoneCheckboxField","btnDelete","deleteContacts","addContact","mediaSize","AppEditTopicTab","colorIndex","isGeneral","originalTopic","iconDiv","icon_emoji_id","setIcon","editForumTopic","topicId","iconEmojiId","createForumTopic","iconColor","onDestroy","emojiElement","icon_color","force","isMainIcon","newTopic","oldTopic","oldEl","applyFadeAnimation","fadeIn","iterations","easing","AppChatTypeTab","privateRow","publicRow","privateSection","publicContainer","chatUpdateListeners","basic","linkRow","btnRevoke","getChatInviteLink","publicSection","linkInputField","applyBtn","getValue","head","usernamesSection","getPeerEditableUsername","wasUsername","migrateChat","makeChannelPrivate","toggleNoForwards","onChatUpdate","noforwards","addChatUpdateListener","AppUserPermissionsTab","destroyListener","ChatPermissions","rights","banned_rights","editBanned","btnDeleteException","clearChannelParticipantBannedRights","kickFromChannel","exceptionText","toggleWith","defaultBannedRights","default_banned_rights","defaultRights","combineParticipantBannedRights","restrictionText","mainFlag","until_date","AppGroupPermissionsTab","chatPermissions","editChatDefaultBannedRights","addExceptionRow","openPermissions","getChannelParticipant","setSubtitle","bannedRights","cantWhat","getPeerId","setLength","exceptionsCount","loader","setLoader","getPromise","migrateFrom","migrateTo","AppChatReactionsTab","getActiveAvailableReactions","_chatReactions","available_reactions","chatReactions","reactions","makeReactionFromEmoticons","getCaptionLangPackKey","toggleSection","reactionsSection","toggleCheckboxFieldsByEmoticons","checkboxFieldsByEmoticon","toggleCheckboxField","toggleRow","save","checkboxFields","every","saveReactionsDebounced","allow_custom","saveReactions","setChatAvailableReactions","isDebounced","AppEditChatTab","_init","canChangeType","canChangePermissions","canManageTopics","getCachedFullChat","chatNameInputField","descriptionInputField","chatTypeRow","setChatTypeSubtitle","availableReactionsLength","setReactionsLength","chatAvailableReactions","permissionsRow","setPermissionsLength","forum_upgrade_participants_min","topicsRow","setTopics","toggleForum","editTitle","editAbout","signMessagesCheckboxField","signatures","toggleSignatures","showChatHistoryCheckboxField","togglePreHistoryHidden","hidden_prehistory","historiesStorage","AppSharedMediaTab","newCloseBtn","closeBtn","animatedCloseIcon","transitionContainer","transitionFirstItem","titleI18n","editBtn","transitionLastItem","secondTitle","setIsSharedMedia","isSharedMedia","isHeavy","onCloseBtnClick","toggleEditBtn","renderNewMessage","msgs","deleteDeletedMessages","btnAddMembers","showConfirmation","addChatUser","_renderNewMessage","getMessageThreadId","_deleteDeletedMessages","setLoadMutex","peerChanged","changeTitleKey","loadSidebarMedia","destroyable","SetTransition","raf","afterTimeout","SidebarSlider","closeTab","closingId","getMiddleware","onOpenTab","preserveTab","getTab","getHistory","isTabExists","deleteTab","doNotAppend","SliderSuperTab","_constructor","SliderSuperTabEventable","dispatchResultableEvent","SortedUserList","getIndex","getUserStatusForSort","onDelete","listEl","onListLengthChange","onUpdate","willChangeLength","onElementCreate","base","updateElementWith","updateListWith","createChatListOptions","doTimeout","updateList","SORT_INTERVAL","hasViewer","attachStickerViewerListeners","findTarget","originalFindTarget","checkForParent","closest","mediaContainer","previousGroup","_middleware","previousTransformer","doThatSticker","lockGroups","isSwitching","effectThumb","mediaRect","boxSize","fitted","aspectFitted","transformer","transformX","transformY","needFadeIn","withThumb","relativeEffect","loopEffect","firstFramePromise","prevPlayer","ready","onMousePreMove","newMediaContainer","_previousTransformer","StickyIntersector","observeHeaders","observeElements","headersObserver","targetInfo","boundingClientRect","stickyTarget","rootBoundsInfo","rootBounds","threshold","elementsObserver","addSentinel","sentinel","headerSentinel","getEvent","getDistance","hypot","getTouchCenter","attachGlobalListenerTo","RESET_GLOBAL","TOUCH_MOVE_OPTIONS","MOUSE_MOVE_OPTIONS","WHEEL_OPTIONS","SwipeHandler","handleMove","setCursorTo","hadMove","releaseWheelDrag","releaseWheelZoom","resetValues","handleStart","isMouseDown","initialDistance","initialTouchCenter","verifyResult","withDelay","xDown","yDown","eventUp","onStart","xUp","yUp","xAdded","yAdded","setHadMove","endDistance","touchCenter","dispatchOnSwipe","handleWheel","is","onWheelCapture","shiftKey","onWheelZoom","handleWheelDrag","isDragCanceled","sign","initialDragOffset","dx","dy","delta","wheelZoom","listenerOptions","setCursor","onSwipeResult","TelInputField","pasted","lastValue","telEl","HTMLInputElement","pixelRatio","letterSpacing","IS_ANDROID","originalFunc","formattedPhoneNumber","leftPattern","toastEl","hideToast","toastNew","transitions","navigation","prevTabContent","animateFirst","withAnimationListener","animationFunction","_animateFirst","onTransitionEndCallbacks","animationDeferred","listenerName","onEndEvent","overrideFrom","onTransitionEndCallback","transitionTimeout","_from","isUsernameValid","UsernameInputField","checkUsernameDebounced","checkUsername","checkUsernamePromise","checkPromise","available","UsernamesSection","CLASS_NAME","_usernames","sortedList","editable","changeActive","applyUsernames","getAll","_peerId","cancelClick","newActive","toggleUsername","reorderUsernames","VisibilityIntersector","locked","change","refreshVisible","VolumeSelector","onMuteClick","setVolume","iconIndex","ICONS","wrapCustomEmoji","repeat","wrapCustomEmojiAwaited","wrapDocument","noAutoDownload","uploadFileName","audioElement","extSplitted","ext","docDiv","icoDiv","icoTextEl","hadContext","hasThumb","performance","fileName","bytesContainer","descriptionParts","bytesMaxEl","sizeDiv","_downloadDiv","addByteProgress","sizeContainer","_bytesContainer","_d","canOpenAfter","downloadFileName","downloadId","apiFileManager","isDownloading","support","was_online","today","getDate","dateEl","timeEl","toggleMediaSpoiler","reveal","destroyAfter","onMediaSpoilerClick","wrapMediaSpoiler","wrapMediaSpoilerWithImage","wrapMessageActionTextNew","plain","hadColors","wrapJoinVoiceChatAnchor","wrapUrl","wrapLinkToMessage","savedFrom","dir","wrapSomeText","htmlToSpan","wrapTopicIcon","ns","contentSpan","gradientId","strokeColor","clone","topicAvatar","wrapMessageActionTopicIcon","wrapMessageActionTopicIconAndName","wrapMessageActionTextNewUnsafe","unsafeMessage","getNameDivHTML","formatCallDuration","post","schedule_date","daysToStart","tomorrowDate","_args","day","pinnedMessage","reply_to_mid","fetchMessageReplyTo","user_id","joined","anchorHTML","isRecurringInit","recurring_init","isRecurringUsed","recurring_used","paymentsWrapCurrencyAmount","total_amount","currency","invoiceMessage","reply_to","reply_to_peer_id","period","titleElement","authorElement","isMe","isIconChanged","isIconRemoved","isTitleChanged","isHiddenChanged","closed","waited","wrapMessageForReply","usingMids","withoutMediaType","hasAlbumKey","addPart","part","isRestricted","usingFullAlbum","grouped_id","getMidsByMessage","albumText","getAlbumText","poll","question","game","extended_media","actionWrapped","restriction_reason","exec","messageWrapped","noLinks","noTextFormat","wrapPeerTitle","wrapPhoto","withTail","noThumb","blurAfter","isImageFromDocument","startsWith","isWebDoc","isFit","renderOnLoad","canAttachPreloader","haveToDownload","onlyCache","getDownloadPromise","wrapSenderToPeer","senderTitle","fromMe","wrapSentTime","STICKER_EFFECT_MULTIPLIER","locksUrls","videosCache","_timeout","wrapSticker","loadStickerMiddleware","exportLoad","needUpscale","skipRatio","asStatic","fullThumb","noPremium","isCustomEmoji","syncedVideo","stickerType","emojiSticker","animatedSticker","staticSticker","isAnimated","getStickerEffectThumb","willHaveLock","lockUrl","toneIndex","isThumbNeededForType","lottieCachedThumb","getLottieCachedThumb","haveThumbCached","afterRender","getPathFromBytes","getPreviewURLFromThumb","stickerThumbConverted","webpWorkerController","saveWebPConvertedStrippedThumb","getImageFromStrippedThumb","middlewareError","sync","setLockColor","skipx","skipy","imageData","sr","sg","sb","sa","outCanvas","outContext","computeLockColor","onFirstFrame","saveLottiePreview","preloadAnimatedEmojiStickerAnimation","isSingleVideo","cacheName","framesCache","cachePromise","previousTime","playedTimes","onTimeupdate","mediaLength","lastPromise","_media","preloadSticker","playing","animationDiv","stickerPromise","side","attachStickerEffectHandler","onEmojiStickerClick","getAnimatedEmojiSoundDocument","getAnimatedEmojiSticker","emojiData","sendInteractionThrottled","msg_id","interaction","JSON","stringify","withRandomOffset","wrapStickerAnimation","unmountAnimation","vibrate","generateRandomSigned","randomOffsetX","randomOffsetY","setPosition","factor","stableOffsetX","stableOffsetY","rectX","rectY","addOffsetX","addOffsetY","wrapStickerEmoji","wrapStickerSetThumb","downloadOptions","getStickerSetThumbDownloadOptions","videos","getDocPromise","thumb_document_id","wrapStickerToRow","previousMedia","_size","wrapTopicNameButton","roundVideoCircumference","wrapVideo","videoSize","noAutoplayAttribute","isAlbumItem","canAutoplay","spanTime","spanPlay","needPlayButton","photoRes","divRound","halfSize","strokeDashoffset","globalVideo","onPaused","onFrame","renderDeferred","loadPhotoThumbFunc","wrapWebPageDescription","shortDescriptionText","wrapWebPageTitle","shortTitle","site_name","EmojiVersions","Emoji","version","FontFamily","FontSize","FontWeight","instances","getAnimationInstance","cancelAnimationByKey","instance","isCancelled","animateSingle","tick","createAnimationInstance","array","AudioAssetPlayer","assets","playSound","assetName","createAudio","playSoundIfDifferent","Audio","stopSound","cancelDelayedPlay","playSoundWithTimeout","heavyQueue","processingQueue","addHeavyTask","processHeavyQueue","todo","possiblePromise","process","realResult","timedChunk","requireBlurPromise","fastBlurFunc","processBlurNext","dataUri","JPEG_HEADER","bytesFromHex","JPEG_TAIL","getPreviewBytesFromURL","needle","jpegBytes","atob","char","charCodeAt","isSticker","convertToUint8Array","dataURL","btoa","bytesToDataURL","calcImageInBox","imageW","imageH","boxW","boxH","noZoom","boxedImageW","boxedImageH","drawCircle","beginPath","closePath","drawCircleFromStart","getTextWidth","measureText","source","createImageBitmap","resizeWidth","resizeHeight","quality","badCharsRe","trimRe","C2L","clearBadCharsAndTrim","latinize","processSearchText","clearBadChars","ignoreCase","hasTag","includeTag","charAt","originalText","ch","latinizeCh","latinizeString","fixCyrillic","fallbackCopyTextToClipboard","textArea","removeChild","copyTextToClipboard","clipboard","writeText","ContextMenuController","diffX","diffY","isOpened","openBtnMenu","months","days","ONE_DAY","getWeekNumber","UTC","getMonth","dayNum","getUTCDay","setUTCDate","getUTCDate","yearStart","getUTCFullYear","formatDateAccordingToTodayNew","weekday","formatFullSentTimeRaw","formatTime","capitalize","textTransform","formatFullSentTime","getFullDate","joiner","monthAsNumber","getHours","getMinutes","noSeconds","leadingZero","noTime","minYear","yearPattern","monthYearOrDayPattern","yearOrDayAndMonthPattern","shortDate","longDate","numberOfDaysEachMonth","fillTipDates","setFullYear","dayOfWeek","formatWeekLong","getDay","getDayOfWeek","setTime","g1","g2","createForDayMonth","createForMonthYear","selectedYear","currentYear","g3","validDateForMonth","formatterYearMax","k1","setMonth","formatterMonthYear","formatterDayMonth","T_ME","copyWhat","copyText","_cancelContextMenuOpening","_cancelContextMenuOpeningTimeout","cancelContextMenuOpening","onCancel","onMove","isTouch","onTouchEnd","touch","changedTouches","CLICK_EVENT_NAME","touchMouseDown","detachClickEvent","simulateClickEvent","ControlsHover","setHideTimeout","hideControlsTimeout","isShown","controlsLocked","toggleControls","relatedTarget","createContextMenu","findElement","filterButtons","onBeforeOpen","initResult","verifyFavoriteSticker","toAdd","favedStickers","_doc","disablePictureInPicture","resetCache","computedStyle","getProperty","getPropertyAsSize","simulateEvent","childNodes","tag","requestFullScreen","requestFullscreen","mozRequestFullScreen","webkitRequestFullscreen","msRequestFullscreen","cancelFullScreen","mozCancelFullScreen","webkitCancelFullScreen","msExitFullscreen","addFullScreenListener","addListener","eventName","getFullScreenElement","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","msFullscreenElement","isFullScreen","getCaretPosF","childNodesLength","alt","markdownTags","entityName","underline","italic","monospace","strikethrough","mentionName","BLOCK_TAGS","BOM_REG_EXP","SELECTION_SEPARATOR","checkNodeForEntity","follow","isLineEmpty","getRichElementValue","selNode","selOffset","pushLine","isBlock","isTableCell","wasEntitiesLength","wasNodeEmpty","field","withEntities","withCaret","DocumentFragment","startOffset","startContainer","possibleChildrenFocusOffset","getCaretPos","caretPos","getViewportSlice","overflowRect","extraSize","invisibleTop","invisibleBottom","foundVisible","lookForSticky","overflowTop","overflowRight","overflowBottom","overflowLeft","sticky","windowWidth","windowHeight","handleHorizontalSwipe","cancelY","template","isSendShortcutPressed","isComposing","secondaryKey","isSwipingBackSafari","TouchEvent","placeCaretAtEnd","ignoreTouchCheck","selectionStart","selectionEnd","prevPos","backgroundImage","useCache","isImage","renderImageFromUrlPromise","renderMediaWithFadeIn","compareNodes","node1","node1Offset","node2","node2Offset","parents","commonAncestorContainer","NOT_ONLY_BOMS_REG_EXP","USING_BOMS","RichInputHandler","saveSelectionOnChange","saveRangeForElement","onFocusOut","lastNode","lastOffset","onSelectionChange","setSelectionClassName","caret","getCaretPosN","move","superMove","modify","getFiller","addInputCallback","processEmptiedFillers","fixInsertedLineBreaks","moveFirst","setEnd","isBOM","deleteData","processFilledFillers","removeEmptyTextNodes","fixBuggedCaret","savedRanges","IS_FIREFOX","inputCaptureCallbacks","anchorNode","findPreviousSmthIndex","something","fromSelectionChange","smthIndex","moved","idxidx","rangeString","onlyBOMs","restoreSavedRange","makeFocused","newCallback","sibling","needed","treeWalker","createTreeWalker","NodeFilter","SHOW_TEXT","acceptNode","FILTER_REJECT","FILTER_ACCEPT","textNode","nextNode","removePossibleBOMSiblings","removePossibleBOMSiblingsByNode","cleanSiblings","insertData","bomNode","intersectsNode","focusNode","focusNodeBefore","focusOffset","focusOffsetBefore","collapseToStart","collapseToEnd","focusNodeAfter","focusOffsetAfter","prepareApplyingMarkdown","fillers","smths","INSTANCE","Sortable","elementRect","lastSiblings","siblings","property","getSortableTarget","scrollableRect","toEnd","addScrollPos","scrollPos","startScrollPos","isVertical","countNonElements","DropdownHover","onClickOut","ignoreButtons","ignoreMouseOut","toElement","willBeActive","inited","timeouts","attachButtonListener","setIgnoreMouseOut","onmouseout","onmouseover","FocusDirection","fastSmoothScroll","maxDistance","Static","scrollWithJs","getNormalSize","rectStartKey","rectEndKey","sizeKey","scrollSizeKey","elementScrollSizeKey","scrollPositionKey","possibleElementPosition","containerSize","scrollSize","fallbackToElementStartWhenCentering","remainingPath","absPath","startAt","shortTransition","longTransition","currentPath","distanceToEnd","FILENAME_JOINER","getFileNameByLocation","thumb_size","big","stickerset","short_name","thumb_version","volume_id","local_id","strictDecimals","_decimals","dm","fixed","pow","parseFloat","CALL_DURATION_LANG_KEYS","mm","showLast","dd","formatDuration","strings","prefixes","maxPrefixLength","setPrefix","originalStr","prefixCountry","patterns","searchForPattern","mostMatchedPatternMatches","mostMatchedPattern","_pattern","patternMatches","symbol","FramesCache","framesNew","framesURLs","getCache","createCache","releaseCache","getCacheCounter","generateName","arcParameter","rx","ry","xAxisRotation","largeArcFlag","sweepFlag","tl","tr","bl","useBlur","ignoreCache","ListLoader","loadedAllDown","setLoaded","unsetCurrent","toPrevious","goUnsafe","down","loadPromiseDown","loadPromiseUp","processedArr","processed","ListenerSetter","listeners","addManual","onceCallback","onceFired","_listener","MediaSize","aspect","aspectCovered","makeMediaSize","ScreenSize","CUSTOM_EMOJI_SIZE","ESG_CUSTOM_EMOJI_SIZE","EMOJI_STATUS_SIZE","MediaSizes","screenSizes","mobile","medium","large","handhelds","regular","album","esgSticker","documentName","invoice","extendedInvoice","customEmoji","esgCustomEmoji","popupSticker","desktop","isMobile","handleResize","innerWidth","activeScreen","wasScreen","rAF","throwWhat","numberThousandSplitter","HAVE_METADATA","useCanplayOnIos","loadEventName","errorEventName","OverlayClickHandler","withOverlay","amount","skipSymbol","isNegative","currencyData","amountExp","exp","number","dec_point","thousands_sep","isFinite","prec","sep","dec","toFixedFix","number_format","decimal_sep","space_between","symbol_left","splitter","additionalPadding","getScrollWidthFromElement","menuWidth","menuHeight","paddingRight","paddingBottom","paddingLeft","verticalSide","maxTop","maxLeft","minLeft","sides","intermediateX","intermediateY","possibleSides","platforms","getRestrictionReason","reasons","reason","savingLottiePreview","isSavingLottiePreview","saving","throttleWithRaf","fn","schedulerFn","waiting","throttleWith","ScrollableLoader","SearchListLoader","messageId","generateMessageId","filterMids","onHistoryDelete","shouldBeDeleted","onHistoryMultiappend","onMessageSent","isInner","otherSideLoader","filterMessagesByInputFilterFromStorage","goToOtherEnd","do","kind","scheduleFlush","measure","mutate","mutateElement","read","write","pushDocumentSize","_isWebDocument","replies","comments","channel_id","BatchProcessor","bindPrefix","queuePromise","addToQueue","setQueue","possibleError","perf","renderedQueue","SortedList","batchProcessor","_updateList","canUpdate","createPromise","noScheduler","encodeEntities","limitFrom","leadZero","sec_num","hours","minutes","seconds","textToSvgURL","Blob","reader","FileReader","readAsDataURL","visualViewport","innerHeight","ANIMATION_START_EVENT","ANIMATION_END_EVENT","isAnimating","heavyAnimationPromise","promisesInQueue","dispatchHeavyAnimationEvent","_heavyAnimationPromise","onHeavyAnimationEnd","interruptHeavyAnimation","getHeavyAnimationPromise","handleAnimationStart","handleAnimationEnd","DialogsContextMenu","onArchiveClick","editPeerFolders","folder_id","onHideTopicClick","onToggleTopicClick","onPinClick","toggleDialogPin","onUnmuteClick","onUnreadClick","unread_count","readHistory","top_message","markDialogUnread","getButtons","getDialogOrTopic","getDeleteButtonText","lastButton","isDialogUnread","pinned","ConnectionStatusComponent","hadConnect","connecting","timedOut","updating","setConnectionStatus","overrideStatus","baseDcId","connectionStatus","setFirstConnectionTimeout","online","apiUpdatesManager","forceGetDifference","retryAt","setStatusText","currentLangPackKey","statusEl","statusPreloader","singleInstance","CHANGE_STATE_DELAY","getA","networkerFactory","forceReconnect","timerSpan","interval","forceReconnectTimeout","setStateTimeout","statusContainer","SENDING_STATUS","easeInOutSine","easeInOutSineApply","roundRect","defaultRadius","moveTo","lineTo","quadraticCurveTo","DPR","SIZE","MARGIN","WIDTH","RADIUS","Shimmer","currTime","diffTime","spread","pausedTime","pauseInterval","lightSource","lightSpread","currentAnimationIndex","keepTime","cycleAnimation","currentAnimation","animateGlow","animateSlide","smartInc","lightLeft","lightRight","lightCenter","createLinearGradient","shimmerColor","addColorStop","dict","on","fillText","DialogsPlaceholder","onThemeChange","stopAnimation","startAnimation","updateCanvasSize","shimmer","generatedValues","marginVertical","totalHeight","lineHeight","lineBorderRadius","lineMarginVertical","statusWidth","getRectFrom","onRemove","blockScrollable","overflowY","availableLength","detachTime","renderDetachAnimationFrame","globalCompositeOperation","completed","elapsedRowTime","dialogHeight","renderFrame","createPattern","patternCanvas","patternContext","drawChat","firstLineWidth","secondLineWidth","marginLeft","shake","keyframes","setPromiseMiddleware","oldPromise","SortedDialogList","getDialogIndex","forumPeerId","indexKey","addListDialog","isBatch","isMainList","DialogElement","bigger","abitbigger","small","captionDiv","titleSpanContainer","peerTitlePromise","statusSpan","lastTimeSpan","rightSpan","dialogDom","setDialogActive","forumTab","createUnreadBadge","unreadBadge","badge","createUnreadAvatarBadge","unreadAvatarBadge","createMentionsBadge","mentionsBadge","toggleBadgeByKey","hasBadge","justCreated","ForumTab","init2","isFloating","toggleForumTab","createChatList","setListClickListener","xd","Some3","bindScrollable","getOptionsForMessages","fullReset","subscribeToChannelUpdates","unsubscribeFromChannelUpdates","setStatusPromise","noTyping","onChatsScroll","loadResult","setStatus","NOT_IMPLEMENTED_ERROR","Some","onChatsRegularScroll","sliceTimeout","processContact","scrollTopWas","rectContainer","rectTarget","firstY","lastY","firstElement","elementFromPoint","lastElement","elementOverflow","sliceFromStart","sliceFromEnd","deleteDialogByKey","getDialogKeyFromElement","setOffsets","offsets","getOffsetIndex","isDialogMustBeInViewport","topOffset","bottomOffset","setIndexKey","deleteDialog","getDialogKey","updateDialog","loadedDialogsAtLeastOnce","getDialogElement","setLastMessageN","setUnread","onChatsScrollTop","loadDialogs","createPlaceholder","placeholderOptions","getRectFromForPlaceholder","loadDialogsPromise","loadDialogsRenderPromise","cachedInfoPromise","chatList","getConversationsResult","loadDialogsInner","needPlaceholderAtFirstTime","isTopEnd","offsetDialog","firstDialog","lastDialog","getDialogFromElement","getDialogDom","oldTypingElement","newTypingElement","unsetTyping","paddingX","typings","topics","setUnreadMessagesN","drop","sidebarRect","currentOffsetIndex","needIndex","Some2","getUserStatus","setOnlineStatus","processDialogForCallStatus","validateDialogForFilter","getCachedDialogs","validateListForFilter","doNotRenderChatList","hasClassName","generateScrollable","getDialogIndexKey","sortedDialogList","testDialogForFilter","migratedTo","setCallStatus","callIcon","START_X","wasMounted","itemProgress","groupCallActiveIcon","call_active","call_not_empty","loadContacts","toggleAvatarUnreadBadges","sortedDialog","reuseClassNames","unreadContent","isUnreadAvatarBadgeMounted","unreadAvatarBadgeClassList","unreadBadgeClassList","AppDialogsManager","Log","menuScrollContainer","lastActiveElements","initedListeners","xds","onTabChange","_onListLengthChange","checkIfPlaceholderNeeded","hasContacts","removeContactsPlaceholder","updateContactsLength","dialogSize","verifyPeerIdForContacts","getProxiedManagers","stateMiddlewareHelper","bottomPart","forumsTabs","forumsSlider","allChatsIntlElement","isFilterIdAvailable","clearCurrent","showFiltersPromise","onStateLoaded","setFilterId","addFilter","foldersScrollable","_id","filtersNavigationItem","setFilterIdAndChangeTab","changeFiltersAllChatsKey","groupCallsController","callsController","initListeners","setFiltersUnreadCount","setFilterUnreadCount","elementThreadId","elementPeerId","onFiltersLengthChange","containerToAppend","getDialogIndexKeyByFilterId","renderedFilter","filtersArr","haveFilters","addFilters","addFiltersPromise","getNotifyPeerTypeSettings","fillConversations","unreadSpan","unread","unreadUnmutedCount","unreadCount","getFolderUnreadCount","wasShowing","generateEmptyPlaceholder","classNameType","subtitleArgs","placeholderContainer","needPlaceholder","emptyDialogsPlaceholderSubtitle","usersLength","placeholderType","updatePartClassName","updateContactsLengthPromise","newTab","hideTab","forumNavigationItem","toggleForumTabByPeerId","lastTab","isSameTab","withContext","openInner","lastActiveListElement","setPeerFunc","setLastMessage","draftMessage","draft","topMessage","isSearch","isMessageRestricted","willPrepend","videoTypes","playIcon","replyTo","forum_topic","setUnreadMessages","isDialogPinned","getForumUnreadCount","hasUnmuted","isPinned","forumUnreadCount","wasMuted","unreadTopicsCount","hasUnmutedTopic","setStatusMessage","read_inbox_max_id","hasUnreadBadge","hasUnreadAvatarBadge","transitionDuration","disableAnimationIfRippleFound","iconClassName","setSendingStatus","isUnreadBadgeMounted","hasMentionsBadge","unread_mentions_count","isMentionsBadgeMounted","isBadgeMounted","unreadBadgeText","isUnread","isMention","notVisited","getDialog","originalDialog","getOutputPeer","addDialogNew","addDialogAndSetLastMessage","getMessageSenderPeerIdOrName","downloads","getNewDeferred","cancelDownload","clearDownload","getNewDeferredForUpload","getUpload","getDownload","getUploadPromise","getDownloadFileNameFromOptions","downloadMedia","promiseBefore","getDownloadMediaDetails","downloadMediaURL","downloadMediaVoid","getFileNameForUpload","downloadToDisc","justAttach","pingPromise","iframe","hadProgress","getDocumentDownloadOptions","getPhotoDownloadOptions","clickEvent","createEvent","initMouseEvent","createDownloadAnchor","revokeObjectURL","partition","bad","BubbleGroup","avatarLoadPromise","avatarContainer","fwdFrom","fwdFromId","isForwardFromChannel","from_id","currentPeerId","firstTimestamp","firstItem","firstMid","lastTimestamp","lastItem","lastMid","updateClassNames","insertItem","insertInDescendSortedArray","sortGroupItemsKey","insertGroup","mount","onItemUnmount","mountItem","onItemMount","unmountItem","dateContainer","getDateContainerByTimestamp","dateGroups","_group","dateGroupsLength","unmountedLength","STICKY_OFFSET","deleteEmptyDateGroups","BubbleGroups","itemsArr","itemsMap","newGroupDiff","sortItemsKey","sortGroupsKey","removeItemFromCache","removeAndUnmountBubble","getItemByBubble","getSiblingsAtIndex","modifiedGroups","canItemsBeGrouped","groupUngrouped","mountUnmountGroups","toMount","toUnmount","getLastGroup","changeBubbleMid","insertItemToArray","changeItemBubble","changeBubbleByBubble","item1","item2","isAllMessagesForum","itemIndex","findGroupSiblingByItem","findGroupSiblingInItems","previousItem","siblingGroupedItem","nextItem","addItemToGroup","addItemToCache","getMessageFromId","createItem","SERVICE_AS_REGULAR","getDateForDateContainer","groupMid","splitSiblingsOnGrouping","prepareForGrouping","hadGroup","foundItem","splittedGroups","PopupDatePicker","initDate","onPick","noButtons","selectedDate","selectedMonth","minMonth","prevBtn","maxMonth","onDateClick","selectedEl","setTimeTitle","controlsDiv","monthTitle","monthsContainer","handleTimeInput","onOverflow","maxString","hoursInputField","minutesInputField","setMinutes","popupCenterer","timeOptions","sendDate","dateOptions","renderElement","firstDate","weekStartDate","dayIndex","clonedDate","showOverflowMonths","remainder","DivAndCaption","MEDIA_SIZE","wrapReplyDivAndCaption","mediaEl","messageMedia","isRound","mediaChildren","video_thumbs","ReplyContainer","isMediaSet","wrapReply","setColorPeerId","replyContainer","AVATAR_CLASS_NAME","AVATAR_CONTAINER_CLASS_NAME","StackedAvatars","TAG_NAME","RepliesElement","updated","postKey","leftPart","recent_repliers","stackedAvatars","read_max_id","max_id","textSpan","iconSpan","rippleContainer","subscribeRepliesThread","updateMessage","makeEdited","edited","makeSponsored","MessageRender","chatType","editedSpan","sponsoredSpan","isSponsored","sponsored","isMessage","views","postAuthor","post_author","postViewsSpan","channelViews","edit_date","edit_hide","timeSpan","clonedArgs","renderReplies","bubbleContainer","messageDiv","isFooter","repliesFooter","setReply","isReplacing","currentReplyDiv","replyToPeerId","originalMessage","originalPeerTitle","titlePeerId","originalMessageFwdFromId","needUpdate","replyMid","reflowScrollableElement","SEND_WHEN_ONLINE_TIMESTAMP","INTERNAL_LINK_TYPE","PopupJoinChatInvite","chatInvite","request_needed","importChatInvite","savePhoto","peopleCount","ReactionElement","reactionCount","_reactionCount","setCanRenderAvatars","canRenderAvatars","doNotRenderSticker","hadStickerContainer","getReaction","callbackify","center_icon","renderDoc","wrapPromise","wrapStickerPromise","renderCounter","displayOn","renderAvatars","recentReactions","peer_id","setIsChosen","isChosen","chosen_order","fireAroundAnimation","REACTION_INLINE_SIZE","REACTION_BLOCK_SIZE","around_animation","iconPlayer","aroundPlayer","removeOnFrame","REACTIONS_ELEMENTS","ReactionsElement","middlewareHelpers","onConnectCallback","getReactionCount","reactionElement","getMessage","isPlaceholder","changeMessage","changedResults","hasReactions","counts","reactionsEqual","totalReactions","can_see_list","recent_reactions","handleChangedResults","ScrollSaver","getSaved","findElements","replaceSaved","findAndSetElements","_save","scrollHeightMinusTop","onRestore","useReflow","setScrollTop","newScrollTop","restore","_restore","previousScrollHeightMinusTop","SuperIntersectionObserver","observing","observingQueue","freezedObservingNew","toggleObservingNew","isMentionUnread","mentioned","accumulate","stringResults","numberResults","replaceNonNumber","CARD_BRAND_REGEXP","visa","mastercard","amex","discover","diners","diners14","jcb","unionpay","elo","mir","CARD_BRANDS","minLength","cvcMaxLength","cvcMinLength","unknown","detectCardBrand","card","sanitizedCard","brand","detectUnifiedCardBrand","createArray","buggedRegExp","getDistanceFromBuggedToNormal","fixBuggedNumbers","makeOptionalCharacter","consumed","makeRequiredCharacter","partial","wrapCharacterRegExpFactory","optional","_regExp","makeCharacter","makeMonthDigitPatternCharacter","digit","capitalCharacter","cleanedResult","formattingCharacter","str1","makeFormattingCharacter","optionalPattern","spaceCharacter","yearOptionalPattern","sixteenPattern","fifteenPattern","requiredPostcodes","generateFourPattern","cardFormattingPatterns","cardNumber","cardExpiry","cardCvc","cardCvcFromBrand","postalCodeFromCountry","optionalDigits","accumulateLengths","strs","nbspRegExp","makeValidationError","validateCardNumber","sanitized","getCardInfoByNumber","ignoreIncomplete","validateCompleteCardNumber","makeCardNumberError","validateCardExpiry","monthStr","yearStr","_year","nextMonth","isNaN","validateExpiry","parse","TelegramWebView","sandbox","onTelegramWebViewEvent","eventType","eventData","onMount","contentWindow","createVerificationIframe","allow","PopupPaymentVerification","openPathAfter","telegramWebView","path_full","InputFieldCorrected","lastKeyDown","lastTransformed","getPattern","pushRest","autocorrectComplete","character","getCharacter","meta","formatInputValueByPattern","formatMethod","transformedValue","validateNew","onBlur","justReturn","validateMethod","validateAnyIncomplete","errorKeys","handleInputFieldsOnChange","_onChange","createCountryZipFields","zip","countryInputField","postcodeInputField","SUPPORTED_NATIVE_PROVIDERS","PopupPaymentCard","paymentForm","savedCard","native_provider","cardOut","token","credentials","can_save_credentials","cardSection","nativeParams","native_params","lastBrand","lastBrandImg","brandIconTempId","cardInputField","invalid","incomplete","transformed","getPaymentBrandIconPath","setBrandIcon","cvcInputField","need_cardholder_name","expireInputField","switchFocusOrder","previousInputField","nextInputField","inputFieldsRow","billingSection","need_country","need_zip","canSave","saveCheckboxField","saveRow","payButton","PaymentButton","expiryFull","expiryMonth","expiryYear","cvc","cardholderName","nativeProvider","URLSearchParams","headers","publishable_key","expiration_month","expiration_year","security_code","public_token","PopupPaymentCardConfirmation","inputCheckPassword","getInputCheckPassword","tmpPassword","password","handled","PopupPaymentShipping","inputInvoice","savedInfo","saved_info","addressSection","address1InputField","address2InputField","cityInputField","stateInputField","receiverSection","emailInputField","shipping_address_requested","name_requested","email_requested","phone_requested","validateEmail","validatePhone","selectedCountry","shipping_address","street_line1","street_line2","city","country_iso2","post_code","requestedInfo","validateRequestedInfo","shippingAddress","ADDRESS_STREET_LINE1_INVALID","ADDRESS_STREET_LINE2_INVALID","ADDRESS_COUNTRY_INVALID","ADDRESS_CITY_INVALID","ADDRESS_STATE_INVALID","ADDRESS_POSTCODE_INVALID","REQ_INFO_NAME_INVALID","REQ_INFO_EMAIL_INVALID","REQ_INFO_PHONE_INVALID","focusField","PopupPaymentShippingMethods","shippingOption","shipping_options","prices","lastShippingId","option","PopupPayment","isReceipt","tipButtonsMap","confirmed","onConfirmed","popupPaymentVerification","mediaInvoice","receipt_msg_id","isTest","itemEl","detailsClassName","photoEl","linesClassName","linesEl","botName","preloaderContainer","getPaymentReceipt","getPaymentForm","savedCredentials","saved_credentials","lastRequestedInfo","providerPeerTitle","provider_id","wrapAmount","isRecurring","recurring","peerTitle2","makeLabel","pricesClassName","makePricesElements","price","_label","wrappedAmount","pricesElements","getTipsAmount","shippingAmount","setTotal","totalAmount","totalLabel","payI18n","canTip","max_tip_amount","tip_amount","tipsClassName","getInputValue","setInputWidth","setInputValue","unsetActiveTip","tipEl","tipsLabel","haveToIgnoreEvents","ignoreNextSelectionChange","tipsEl","tipClassName","tipButtons","suggested_tip_amounts","tipAmount","prevTipEl","setRowIcon","setRowTitle","setCardSubtitle","methodRow","onMethodClick","previousCardDetails","previousToken","credentials_title","providerRow","providerAvatar","shippingAddressRow","shippingNameRow","shippingEmailRow","shippingPhoneRow","shippingMethodRow","lastShippingOption","onShippingAddressClick","onShippingMethodClick","setShippingTitle","postAddress","setShippingInfo","setShippingOption","scrollSaver","lastShippingPricesElements","shipping","acceptTermsCheckboxField","recurring_terms_url","acceptTermsRow","recurringElements","lastTmpPasword","missingInfo","tmp_password","paymentResult","sendPaymentForm","form_id","_passwordState","valid_until","tsNow","Layouter","minWidth","spacing","ratios","countRatios","proportions","countProportions","averageRatio","maxSizeRatio","layout","ComplexLayouter","layoutTwo","layoutThree","layoutFour","layoutTwoTopBottom","layoutTwoLeftRightEqual","layoutTwoLeftRight","layoutThreeLeftAndOther","layoutThreeTopAndOther","layoutFourTopAndOther","layoutFourLeftAndOther","geometry","RectPart","minimalWidth","secondWidth","firstWidth","firstHeight","thirdHeight","secondHeight","rightWidth","leftWidth","thirdWidth","h0","w0","w2","w1","h1","h2","cropRatios","attempts","multiHeight","sum","pushAttempt","lineCounts","heights","second","third","fourth","optimalAttempt","optimalDiff","attempt","lineCount","minLineHeight","bad1","bad2","optimalCounts","optimalHeights","rowCount","colCount","col","prepareAlbum","widthItem","heightItem","borderTopLeftRadius","borderBottomLeftRadius","borderTopRightRadius","borderBottomRightRadius","forMedia","mediaDiv","wrapAlbum","attachmentDiv","uploading","containerHeight","hasSpoiler","itemWidth","itemHeight","AppPollResultsTab","resultsDiv","appPollsManager","getPoll","quiz","voters","total_voters","roundPercents","answer","answers","answerEl","answerTitle","answerPercents","getVotes","votesList","votes","vote","lineTotalLength","minIndex","minRemainder","maxRemainder","pollElement","isClosed","performResults","chosenIndexes","PollElement","setMaxLength","resizePolls","hideQuizHint","onHide","prevQuizHint","prevQuizHintOnHide","prevQuizHintTimeout","isListenerSet","isQuiz","isRetracted","isPublic","isMultiple","chosingIndexes","sentVote","MAX_LENGTH","MAX_OFFSET","svgLines","setLineProgress","descKey","public_voters","multiple_choice","multipleSelect","descDiv","typeDiv","avatarsDiv","close_period","close_date","timeLeftDiv","quizTimer","circumference","closeTime","quizInterval","timeLeft","getResults","answerDivs","numberDivs","footerDiv","viewResults","votersCountDiv","sendVoteBtn","sendVotes","canVote","setVotersCount","clickHandler","initQuizHint","solution","solution_entities","toggleHint","setQuizHint","correctResult","correct","chosen","answerIndex","foundIndex","indexes","sendVotePromise","sendVote","recent_voters","isVoted","hideSendVoteBtn","hideViewResultsBtn","maxPercents","getPercentValue","iterate","fullTime","votersCount","rtlChars","justRtlDirCheck","IGNORE_ACTIONS","TEST_SCROLL_TIMES","TEST_SCROLL","PEER_CHANGED_ERROR","BIG_EMOJI_SIZES","BIG_EMOJI_SIZES_LENGTH","getMainMidForGrouped","ChatBubbles","unreadOut","bubblesNewByGroupedId","bubblesNew","dateMessages","scrolledDown","isScrollingTimeout","unreaded","unreadedSeen","messagesQueueOnRenderAdditional","firstUnreadBubble","followStack","isFirstLoad","passEntities","viewsMids","isTopPaddingSet","renderingMessages","bubblesToEject","bubblesToReplace","setPeerTempId","renderNewPromises","extendedMediaMessages","unreadedObserverCallback","onUnreadedInViewport","viewsObserverCallback","sendViewCountersDebounced","sponsoredMessage","randomId","random_id","viewSponsoredMessage","stickerEffectObserverCallback","onBubblesMouseMove","unhoverPrevious","hoverBubble","hoverReaction","setHoverVisible","stickerWrapper","getGroupsFirstMessage","getAvailableReactionsByMessage","select_animation","sendReaction","onBubblesClick","setInnerPeer","chatInner","onDatePick","contactDiv","callDiv","callUser","getInputInvoiceByPeerId","reactionsElement","stickerEmojiEl","bubbleMid","reply_to_top_id","saved_from_msg_id","openThread","message1","getMessageWithReplies","getDiscussionMessage","via","setDraft","peerIdStr","documentDiv","groupedItem","SINGLE_MEDIA_CLASSNAME","isSingleMedia","hasAspecter","albumItem","isReplyClick","replyToMid","reply_to_msg_id","scrollDimensions","forceDown","sliceViewportDebounced","setCorrectIndexThrottled","setStickyDateManually","setPeerPromise","processBatch","loadQueue","filterQueue","avatarPromises","groupBubbles","updatePosition","timePromises","groupCollapsed","groupEnd","setUnreadDelimiter","restoreScroll","prepareToSaveScroll","ejectBubbles","oldBubble","bubbleGroups","updatePlaceholderPosition","requestHistory","setMessageId","constructBubbles","sequential","messagesStorageKey","messagesQueuePromise","newItem","_items","scrollingToBubble","scrollToEnd","deleteMessagesByIds","tempMessage","_bubble","groupedId","getMessagesByAlbum","reactionsElements","repliesElement","newDiv","safeRenderMessage","scrollToBubbleIfLast","deletedMids","wasMainMid","mainMid","createScrollSaver","appendReactionsElementToBubble","dateMessage","dateBubble","previousStickyDate","sliceViewport","setScroll","attachContainerListeners","highlightBubble","replyAfter","swipeAvatar","shouldReply","canSend","_target","_swipeAvatar","initMessageReply","constructPeerHelpers","updateGradient","setUnreadCount","updateUnreadByDialog","finishPeerChange","reloadMessages","toDelete","postViewsElements","different","postViews","incrementMessageViews","getScheduledMessagesStorage","createResizeObserver","resizeObserver","wasHeight","skip","scrolled","onResizeEnd","setEndRAF","ResizeObserver","contentRect","realDiff","_part","needScrollTop","destroyResizeObserver","setReactionsHoverListeners","getRenderedLength","readUnreaded","readPromise","idleController","bubblesMaxId","getHistoryMaxId","readContents","onGoDownClick","getBubbleByPoint","getGroupedBubble","groupId","getMidsByAlbum","findNextMountedBubbleByMsgId","filterCallback","_mid","foundMid","loadMoreHistory","getHistoryTopPromise","getHistoryBottomPromise","getHistory1","destroyScrollable","getHistoryStorage","readMaxId","readOutboxMaxId","msgId","destroyBubble","permanent","ignoreOnScroll","pollExtendedMediaMessages","getExtendedMedia","setExtendedMediaMessagesPollInterval","pollExtendedMediaMessagesPromise","setTopPadding","setPaddingTo","isPaddingNeeded","unsetPadding","newMessage","getLastBubble","performHistoryResult","scrollToBubbleEnd","scrollToBubble","isChangingHeight","messageInput","dimensions","datasetKey","createDateBubble","bubbleContent","serviceMsg","fakeBubble","bubblesToo","cleanupPlaceholders","attachedUnreadBubble","fetchNewPromise","getSponsoredMessagePromise","onAnimateLadder","resolveLadderAnimation","attachPlaceholderOnRender","emptyPlaceholderBubble","samePeer","stack","startParam","onChangePeer","getPinnedMessagesMaxId","isTarget","followingUnread","savedPosition","overrideAdditionMsgId","getChatSavedPosition","getReadMaxIdIfUnread","foundSlice","findSliceOffset","isJump","isStartButtonNeeded","setStartParam","setQueueId","messageEntityBotCommand","isBot","additionMsgId","maxBubbleId","oldChatInner","oldPlaceholderBubble","haveToScrollToBubble","fromUp","scrollFromDown","scrollFromUp","willScrollOnLoad","setPeerOptions","waitPromise","setPeerCached","mountedByLastMsgId","isPinnedMessagesNeeded","setCorrectIndex","lastBubble","onRenderScrollSet","afterSetPromise","setFetchReactionsInterval","setFetchHistoryInterval","onScrolledAllDown","isForumTopic","unread_mark","fetchReactions","getMessagesReactions","needFetchInterval","isFetchIntervalNeeded","historyMaxId","canWrite","renderMessagesQueue","isAvatarNeeded","additionalCallback","processResult","newBubble","originalPromise","renderMessage","albumMids","reactionsMessage","albumMessages","albumMustBeRenderedFull","our","isOurMessage","contentWrapper","isInUnread","ignoreAction","chat_id","is_single","messageMessage","needToSetHTML","bigEmojis","emojiEntities","strLength","curr","richText","canHaveTail","isStandaloneMedia","haveRTLChar","topicNameButtonContainer","replyMarkup","reply_markup","replyMarkupRows","containerDiv","rowDiv","buttonEl","botId","viaBotId","same_peer","checkSwitchReturn","switchInlineQuery","button_id","handleUrlAuth","buttonId","haveButtons","column","callbackButtonClick","callbackAnswer","messageWithReplies","getMessageWithCommentReplies","withReplies","isOutMessage","nameContainer","canHideNameIfMedia","isMessageEmpty","viewButton","processingWebPage","telegram_channel","telegram_megagroup","telegram_bot","makeViewButton","quote","previewResizer","preview","quoteTextDiv","strong","titleDiv","textDiv","isSquare","isEmoji","nopremium","newNameContainer","richTextFragment","getMidsByMid","wrapGroupedDocuments","lastContainer","addClassName","contact","contactDetails","contactNameDiv","fullName","contactNumberDiv","phone_number","wrapPoll","extendedMedia","isAlreadyPaid","isNotPaid","innerMedia","wrappedPrice","priceEl","video_duration","videoTime","dc_id","file_reference","before","needName","titleVia","mustHaveName","isHidden","isForward","goto","generateTail","documentContainer","documentMessageDiv","viewportSlice","deleteViewportSlice","historyResult","needReflowScroll","setLoadedPromises","firstSlice","lastSlice","both","processLocalMessageRender","ackedResult","getScheduledMessages","animateAsLadder","additionMsgIds","isAdditionRender","targetMid","sortedMids","topIds","middleIds","bottomIds","setBubbles","lastMsDelay","elementsToAnimate","transitionDelay","topRes","middleRes","bottomRes","delays","renderEmptyPlaceholder","listElements","getRestrictionReasonText","getGreetingSticker","channel_post","start_param","chat_invite","chat_invite_hash","JOIN_CHAT","invite","processInternalLink","creator","isWaitingForAnimation","noTransition","setOn","generateLocalMessageId","addOffset","generateLocalFirstMessage","service","saveMessages","ignoreScrollSaving","invisible","checkPlaceholders","toggleSponsoredMessage","renderBotPlaceholder","checkIfEmptyPlaceholderNeeded","getSponsoredMessage","sponsoredMessages","messagePromise","_log","getProfile","processPromise","bot_info","botInfo","description_document","description_photo","isBackLimit","resultPromise","isFirstMessageRender","serviceStartMessageId","getThreadServiceMessageId","sup","_promise","mustBeCount","PopupPinMessage","unpin","canUnpin","canPinMessage","oneSide","unpinAllMessages","hidePinnedMessages","updatePinnedMessage","buttonText","getPinnedMessagesCount","pinButtonText","isSelectionEmpty","selectionRange","START_TO_END","preloadAnimatedEmojiSticker","PopupReportMessagesConfirm","reportMessages","STICKER_EMOJI","PopupReportMessages","preloadStickerPromise","PopupSponsored","PopupReactedList","canViewReadParticipants","canViewMessageReadParticipants","loaders","hasAllReactions","createFakeReaction","hasReadParticipants","readUserIds","getMessageReadParticipants","chatlist","skipReadParticipants","skipReactionsList","getMessageReactionsListAndReadParticipants","combined","getReactionCached","allReactionsSticker","REACTIONS_CLASS_NAME","REACTION_CLASS_NAME","CAN_USE_TRANSFORM","ChatReactionsMenu","reactionsMap","players","onScrollProcessItem","reactionDiv","appear","widthContainer","reactionsContainer","reactionsScrollable","renderReaction","setVisible","canUseAnimations","scaleContainer","appearWrapper","appear_animation","selectLoadPromise","selectPlayer","REACTION_SIZE","ChatContextMenu","onContextMenu","isTextSelected","isAnchorTarget","isUsernameTarget","selectedMid","isOverBubble","isTargetAGroupedItem","viewerPeerId","canOpenReactedList","linkToMessage","getUrlToMessage","selectedMessagesText","getSelectedMessagesText","menuPadding","reactionsMenu","reactionsMenuPosition","isReactionsMenuVisible","offsetSize","nextVisiblePart","MIN_NEXT_VISIBLE_PART","minSize","onSendScheduledClick","onReplyClick","onFaveStickerClick","unfave","faveSticker","onEditClick","getMessageWithText","initMessageEditing","onCopyClick","onCopyAnchorLinkClick","onCopyLinkClick","onUnpinClick","onRetractVote","onStopPoll","stopPoll","setButtons","hasAttribute","notDirect","scheduleSending","editMessage","scheduleDate","canEditMessage","getMessageFromStorage","canSaveMessageMedia","isGoodType","hasTarget","localName","emojiInputsPromise","getUniqueCustomEmojisFromMessage","filterUnique","viewsButton","isViewingReactions","participantsCount","reactedLength","i18nElem","fakeText","AVATAR_SIZE","MAX_AVATARS","PADDING_PER_AVATAR","reactionsCount","fakeElem","readParticipants","totalSize","emojisButton","setPadding","inputsPromise","getCachedCustomEmojiDocuments","getCustomEmojiDocuments","threadMessage","SendMenu","sendMenuButtons","onSilentClick","onScheduleClick","sendMenu","openSide","onContextElement","setPeerId","PopupCreatePoll","onSubmitClick","send","radioLabel","isEmpty","questions","appendMoreField","correctAnswers","optionInputFields","questionInputField","sendSilent","settingsCaption","anonymousCheckboxField","multipleCheckboxField","quizCheckboxField","quizSolutionField","quizElements","quizSolutionCaption","quizHr","quizSolutionContainer","quizSolutionSubtitle","getFilledAnswers","quizSolution","quizSolutionEntities","inputMediaPoll","getInputMediaPoll","sendOther","getMessageSendingParams","helperType","clearHelper","questionField","createPosterFromMedia","getGifDuration","arrayBuffer","USELESS_REG_EXP","InputFieldAnimated","updateInnerHTML","onFakeInput","inputFake","setHeight","currentHeight","onChangeHeight","currentPopup","getCurrentNewMediaPopup","PopupNewMedia","willAttachType","ignoreInputValue","messageInputField","attachFile","willAttach","shouldCompress","itemDiv","defineNotNumerableProperties","attachMedia","attachDocument","sendFileDetails","captionMaxLength","captionLengthMax","changeType","hasAnyMedia","changeGroup","canGroupSomething","changeSpoilers","canToggleSpoilers","isMedia","wasInputValue","attachFiles","applyMediaSpoiler","removeMediaSpoiler","noAnimation","widthStr","heightStr","containerWidthStr","containerHeightStr","strippedBytes","appendDrops","mediaCount","mediaWithSpoilers","addFiles","toPush","_file","lastModified","sendingParams","sendFileParams","sendText","scaledBlob","sendAlbum","replyToMsgId","modifyMimeTypeForTelegram","scaleImageForTelegram","convertWebp","PHOTO_SIDE_LIMIT","objectURL","audioDecodedByteCount","webkitAudioDecodedByteCount","noSound","onseeked","onerror","createPosterFromVideo","scaled","isPhoto","isAudio","onRender","foundPhotos","foundVideos","foundFiles","appendMediaToContainer","firstType","oldSendFileDetails","albumContainer","oldParams","HANDLE_EVENT","ACTIVE_CLASS_NAME","AXIS_Y_KEYS","AXIS_X_KEYS","attachListNavigation","waitForKey","waitForKeySet","keyNames","getCurrentTarget","setCurrentTarget","hadTarget","getNextTargetX","currentTarget","isNext","nextTarget","handleArrowKey","endProperty","currentRect","targetRect","getNextTargetY","fireSelect","canContinue","attached","resetTarget","_onKeyDown","AutocompleteHelper","onVisible","listType","attachNavigation","controller","addHelper","toggleListNavigation","fromController","skipAnimation","hideOtherHelpers","StickersHelper","onChangeScreen","checkEmoticon","getStickersByEmoticon","getMinDate","getMaxDate","PopupSchedule","canSendWhenOnline","btnSendWhenOnline","EmojiHelper","chatInput","onEmojiSelected","checkQuery","firstChar","getBothEmojiKeywords","searchEmojis","AutocompletePeerHelper","doNotShow","listElement","BASE","BASE_CLASS_LIST_ELEMENT","processPeerFullForCommands","botInfos","commands","command","indexObject","CommandsHelper","getReadyToSend","sendMessage","AutocompleteHelperController","preserveHelper","MentionsHelper","insertAtCaret","topMsgId","trimmed","getMentions","ReplyKeyboard","onBodyTouchStart","btnHover","checkAvailability","checkForceReply","touchListener","sendContact","getReplyMarkup","getHistoryStorageTransferable","InlineHelper","queryId","queryAndResultIds","generateQId","resultId","sendInlineResult","_checkQuery","botResults","query_id","gifsMasonry","isGallery","gallery","noCommands","dcId","switch_pm","btnSwitchToPM","switchToPM","ChatBotCommands","setUserId","modifyAckedResult","acked","modifyAckedPromise","ChatSendAs","sendAsButtons","previousAvatar","onSendAsMenuToggle","updateButtons","sendAsPeerId","changeSendAsPeerId","executeButtonsUpdate","sendAsPeerIds","saveDefaultSendAs","updateAvatar","getDefaultSendAs","getChannelFull","channelFull","default_send_as","updateManual","updatingPromise","wasSkippingAnimation","getSendAs","sendAsPeers","sendAsPeer","premium_required","addedListener","hasMarkupInSelection","onlyFull","nodes","commonAncestor","SHOW_ELEMENT","resultBoolean","POSTING_MEDIA_NOT_ALLOWED","ChatInput","lastUrl","lastTimeType","replyElements","willSendWebPage","recordCanceled","recordStartTime","lockRedo","canRedoFromHTML","undoHistory","executedHistory","canUndoFromHTML","onCancelRecordClick","recorder","opusDecodeController","onEmoticonsOpen","toggleClass","btnToggleEmoticons","onEmoticonsClose","isUserOnlineVisible","openScheduled","prepareDocumentExecute","undoRedo","needHTML","sameHTMLTimes","currentHTML","handleMarkdownShortcut","formatKeys","markupTooltip","applyMarkdown","showLinkEditor","onMessageInput","markdownEntities","parseMarkdown","urlEntities","getWebPagePromise","appWebPagesManager","getWebPage","setTopInfo","noWebPage","onHelperCancel","helperFunc","botCommands","resetCurrentFontFormatting","updateBotCommandsToggle","editMsgId","saveDraftDebounced","checkAutocomplete","updateSendBtn","onBtnSendClick","forwarding","restricted","voice_messages_forbidden","releaseMediaPlayback","setRecording","showDiscardPopup","btnCancelRecord","recordingOverlayListener","recordingNavigationItem","sourceNode","analyser","createAnalyser","connect","fftSize","frequencyData","frequencyBinCount","getByteFrequencyData","recordRippleEl","ms","recordTimeEl","needReturn","getCurrentInputAsDraft","no_webpage","originalDraft","canPassEntitiesTypes","draftsAreEqual","onHelperClick","forwardElements","rowsWrapperWrapper","rowsWrapper","fakeRowsWrapper","fakeSelectionWrapper","goDownBtn","controlContainer","iconBtn","cancelBtn","onHideAuthorClick","isChangingAuthor","onHideCaptionClick","forwardButtons","canToggleHideAuthor","hideSender","showCaption","hideCaption","changePeer","changeForwardRecipient","forwardBtnMenu","forwardWasDroppingAuthor","replyTitle","forwardHover","modifyArgs","newMessageWrapper","replyInTopicOverlay","inputMessageContainer","goDownUnreadBadge","goMentionBtn","goMentionUnreadBadge","goToNextMention","btnScheduled","btnToggleReplyMarkup","replyKeyboard","botCommandsToggle","scaler","botCommandsIcon","attachMenuButtons","fileInput","attachMenu","attachMenuBots","appAttachMenuBotsManager","getAttachMenuBots","attachMenuBotsButtons","attachMenuBot","getAttachMenuBotIcon","requestWebView","webViewResultUrl","SANDBOX_ATTRIBUTES","verifyMap","attachMenuPeerTypeSameBotPM","attachMenuPeerTypeBotPM","attachMenuPeerTypePM","attachMenuPeerTypeChat","attachMenuPeerTypeBroadcast","peer_types","multiple","autocompleteHelperController","stickersHelper","emojiHelper","commandsHelper","mentionsHelper","inlineHelper","btnSendContainer","btnSend","attachMessageInputField","previousQuery","saveDraft","encoderSampleRate","monitorGain","numberOfChannels","recordingGain","reuseWorker","onstop","ondataavailable","typedArray","dataBlob","sendFile","isVoiceMessage","botStartBtn","toggleBotStartBtnDisability","startBot","pinnedControlBtn","originalChat","pinnedMessageContainer","_center","neededFakeContainer","fakeWrapperTo","oldFakeWrapperTo","fakeSelectionRect","fakeRowsRect","initTranslateX","getNeededFakeContainer","isReplyInTopicOverlayNeeded","hasMentions","ignoreEmptyValue","syncDraft","helperToo","clearInput","fromUpdate","getDraft","wrappedDraft","myEntities","apiEntities","wrapDraft","currentDraft","createSendAs","firstChange","sendAs","updateOffset","getPlaceholderKey","updateMessageInputPlaceholder","previousSendAs","ackedPeerFull","ackedScheduledMids","setSendAsCallback","filteredAttachMenuButtons","filterAttachMenuButtons","placeholderKey","hasBotCommands","updateBotCommands","updateMessageInput","haveSomethingInControl","isAnonymousSending","oldInputField","attachMessageInputListeners","fixSafariStickyInputFocusing","APP_TABS","CHAT","readAllHistory","commandsMap","canCombine","hasMarkup","executed","resetCurrentFormatting","setActiveMarkupButton","insertText","insertEntity","isHelper","fullValue","AUTO_COMPLETE_REG_EXP","matchIndex","foundHelper","checkInlineAutocomplete","setPreloaderShow","btnPreloader","inlineMatch","bot_inline_placeholder","inlinePlaceholder","helperWaitingForward","canSetDraft","fireEvent","clearValue","fixSafariStickyInput","getValueAndEntities","clearReply","unicode","pushRecentEmoji","dropAuthor","dropCaptions","isDroppingCaptions","sendMessageWithDocument","hideCaptionCheckboxField","replyFragment","initMessagesForward","fromPeerIdsMids","fromPeerIds","smth","messagesWithCaptionsLength","peerTitles","titleKey","senderTitles","firstMessage","newReply","intl","peerTitleEl","_message","setReplyToMsgId","callerFunc","replyParent","oldReply","haveReply","CLASSNAME_BASE","PinnedContainer","floating","divAndCaption","wrapperUtils","attachOnCloseEvent","needClose","setFloating","setUtilsWidth","BAR_HEIGHTS","ChatAudio","onPlaybackParams","fasterEl","repeatEl","toggleEl","onStop","onMediaPlay","isMusic","prevEl","nextEl","attachClick","volumeProgressLineContainer","tunnel","progressWrapper","playingDetails","PinnedMessageBorder","drawRect","getClipPath","barHeight","GAP","clipPath","getBarHeight","ONE","TWO","THREE","FOUR","MORE","getMarkHeight","markHeight","getMarkTranslateY","getTrackTranslateY","trackHeight","getTrackHeight","clipPathId","markTranslateY","trackTranslateY","mark","AnimatedSuper","getRow","clearRow","clearRows","currentIndex","DURATION","setNewRow","reflow","previousIndex","fromTop","ignorePrevious","previousRow","AnimatedCounter","previousNumber","getDecimal","animatedSuper","decimal","hideLeft","previousDecimalNumber","EMPTY_INDEX","setCount","previousByDecimal","decimalNumber","ChatPinnedMessage","pinnedMaxMid","pinnedMid","pinnedIndex","wasPinnedIndex","wasPinnedMediaIndex","waitForScrollBottom","loadedBottom","loadedTop","scrollDownListenerSetter","getCurrentIndexPromise","isStatic","dAC","pinnedMessageBorder","animatedSubtitle","animatedMedia","animatedCounter","btnOpen","openPinned","setPinnedMessage","_setPinnedMessage","unsetScrollDownListener","testMid","isNeededMore","getCurrentIndex","LOAD_OFFSET","correctAfter","gotRest","getPinnedMessage","backLimited","offset_id_offset","setScrollDownListener","isDown","handleScrollSideEvent","refreshPosition","handleFollowingPinnedMessage","followPinnedMessage","isLast","writeTo","writeMediaTo","ChatTopbar","verifyButtons","isMenuOpen","btnMore","buttonsToVerify","menuButtons","verifyVideoChatButton","currentGroupCall","groupCall","verifyCallButton","getCachedFullUser","phone_calls_available","video_calls_available","onJoinGroupCallClick","joinGroupCall","resize","setUtilsRAF","chatUtils","chatAudio","setPeerStatusManual","btnBack","btnBackBadge","chatInfoContainer","chatInfo","person","avatarElement","deleteButtonText","btnJoin","btnPinned","btnCall","btnGroupCall","btnMute","btnSearch","pushButtonToVerify","onBtnBackClick","isFirstChat","constructUtils","linked_chat_id","onCallClick","chatContextMenuHintWasShown","contactPeerId","getAttachMenuBot","has_settings","constructAvatar","joinChannel","unreadUnmutedPeerIds","setMutedState","isTopMessage","hiddenPinnedMessages","byCurrent","setTitleCallback","setStatusCallback","setTitleManual","canHaveSomeButtons","wasAlreadyUsed","newPinnedMessage","AppPrivateSearchTab","appSearch","btnPickDate","ChatSearch","selectedIndex","onResultsClick","selectResult","onFooterClick","onUpClick","onDownClick","foundCountEl","upBtn","downBtn","footer","dateBtn","renderedCount","ChatBackgroundPatternRenderer","canvases","INSTANCES","renderToCanvas","fillCanvas","crossOrigin","imageBitmap","objectUrl","imageWidth","imageHeight","patternHeight","mask","topY","endY","bottomY","setCanvasDimensions","originalHeight","Chat","backgroundEl","backgroundTempId","sharedMediaTabs","setBackground","patternRenderer","gradientCanvas","previousGradientRenderer","previousPatternRenderer","previousPatternCanvas","isDarkPattern","getInstance","_gradientRenderer","setOpacityTo","opacityMax","setBackgroundPromise","setType","freezeObservers","beforeDestroy","cleanupBackground","destroySharedMediaTab","searchTab","_isAnyGroup","setAutoDownloadMedia","getForumTopicOrReload","isSamePeer","bubblesSetPeerPromise","photoSizeMax","videoSizeMax","fileSizeMax","photo_size_max","video_size_max","getAutoDownloadSettingsByPeerId","callbacksPromise","ignoreThreadId","historyStorageTransferable","historySerialized","MarkupTooltip","waitingForMouseUp","mouseUpCounter","onMouseUpSingle","resetSelection","tools1","tools2","cancelClosening","linkBackButton","linkInput","applyLink","isLinkValid","setTooltipPosition","linkApplyButton","applyDiv","delimiter1","delimiter2","delimiter3","matchUrlProtocol","getActiveMarkupButton","currentMarkups","markup","activeButtons","isLinkToggle","bodyRect","selectionRect","inputRect","selectionTop","sizesRect","isFirstShow","setMouseUpEvent","handleSelection","ChatDragAndDrop","dropIcon","onDragOver","onDragLeave","onDrop","outlineWrapper","dropHeader","dropSubtitle","headerArgs","setPath","sizeX","sizeY","disableTransition","LineBlobDrawable","maxRadius","minRadius","N","radiusNext","speed","generateBlob","radDif","generateNextBlob","amplitude","speedScale","paint","pinnedTop","progressToPinned","r1","progressNext","x2","cx","y2","bezierCurveTo","WeavingState","stateId","createGradient","shader","getGradientFromType","x0","y0","dt","TopbarWeave","handleDevicePixelRatioChanged","setSize","forceUpdate","resizeHandler","resizeCanvas","invokeDraw","handleFocus","focused","handleBlur","lbd","lbd1","lbd2","currentState","previousState","progressToState","lastUpdateTime","animateToAmplitude","animateAmplitudeDiff","amplitude2","animateAmplitudeDiff2","top1","top2","paint1","setCurrentState","states","componentDidMount","matchMedia","setAmplitude","componentWillUnmount","setCanvasSize","RLottieIconItemPart","playPart","RLottieIconItem","createPart","initFrame","skipFirstFrameRendering","inverseColor","onLoadForColor","onLoadForPart","getPart","RLottieIcon","startFrame","endFrame","frameCount","SuperRLottieIcon","partState","colorState","getColor","partCallback","changedPartState","changedColorState","setPartState","setColorState","prevState","renderIfPaused","invoke","GroupCallMicrophoneIcon","GROUP_CALL_MICROPHONE_BUTTON_STATE","partName","HAND","MUTED","UNMUTED","GroupCallParticipantMutedIcon","colored","GROUP_CALL_PARTICIPANT_MUTED_STATE","colorStr","MUTED_FOR_ME","MUTED_BY_ADMIN","propertyValue","getColorByMutedState","generateEqualParts","clearMutedStateModifier","GroupCallParticipantStatusElement","element2","actionClassName","GroupCallParticipantsList","getParticipantByPeerId","onElementDestroy","getGroupCallParticipantMutedState","mutedIcon","callVideoCanvasBlur","GroupCallParticipantVideoElement","setPinned","setParticipant","groupCallParticipantMutedIcon","groupCallParticipantStatus","updateParticipant","GroupCallParticipantsVideoElement","participantsElements","groupCallId","setElementDisplay","pinnedSource","pinSource","unpinAll","setInstance","shouldDisplayElement","displayPinned","shouldDisplay","hasAnyVideo","participantElements","participantVideo","getVideoElementFromParticipantByType","_onLengthChange","GroupCallParticipantContextMenu","onOpenProfileClick","PopupGroupCall","targetPeerId","toggleParticipantMuted","editParticipant","canManageCall","can_self_unmute","muted_by_you","kickFromChat","getContainer","GroupCallParticipantsElement","groupCallParticipantsVideo","appGroupCallsManager","getGroupCallParticipants","GroupCallDescriptionElement","descriptionIntl","GroupCallTitleElement","makeButton","_className","buttonDiv","isConfirm","resizeHandlerClassName","MovableElement","fixDimensions","fixPosition","addResizeHandlers","setSwipeHandler","destroyElements","handlers","startTop","startLeft","startWidth","startHeight","resizingSide","isEnlarging","resizeDiff","maxPossible","setPositionToCenter","MovablePanel","toggleMovable","movable","movableOptions","toggleClassName","raise_hand_rating","onFullScreenClick","onToggleControls","buttonsContainer","onVideoClick","btnVideo","toggleVideoSharing","onScreenClick","btnScreen","toggleScreenSharing","toggleMuted","changeRaiseHand","onLeaveClick","hangUp","discard","toggleBigLayout","btnFullScreen","btnExitFullScreen","wasFullScreen","movablePanel","videosCount","wasBig","btnInvite","btnShowColumn","toggleRightColumn","btnFullScreen2","headerInfo","newHeader","newHeaderInfo","newHeaderTitle","btnHideColumn","videosScrollable","groupCallTitle","groupCallDescription","groupCallBodyHeaderDescription","constructButtons","groupCallParticipants","updateInstance","setHasPinned","groupCallMicrophoneIcon","_makeButton","microphoneIcon","btnLeave","setDescription","microphoneButtonState","getGroupCallMicrophoneButtonState","micState","CallDescriptionElement","connectionState","connectedAt","GroupCallMicrophoneIconMini","INIT_STATE","PopupCall","resizeVideoContainers","videoContainers","interlocutorUserId","emojisSubtitle","partyStates","partyMutedState","stateText","constructFirstButtons","constructSecondButtons","wasTryingToJoin","movableElement","controlsHover","getCallInstance","firstButtonsRow","muteI18nElement","secondButtonsRow","declineI18nElement","btnDecline","btnAccept","acceptCall","createVideoContainer","isPendingIncoming","isSharingVideo","isSharingScreen","outputState","getMediaState","oldContainers","mediaState","getVideoElement","hasFrame","hasPromise","videoState","screencastState","videoContainer","output","getEmojisFingerprint","popupWidth","MAX_WIDTH_PX","MAX_HEIGHT_PX","MAX_SIZE","biggestSideSize","widthRatio","heightRatio","TopbarCall","onState","amplitudes","weave","clearCurrentInstance","currentDescription","instanceListenerSetter","isChangingInstance","callDescription","convertCallStateToGroupState","groupCallMicrophoneIconMini","throttledMuteClick","weaveContainer","uiNotificationsManager","notificationsShown","notificationIndex","notificationsCount","soundsPlayed","vibrateSupport","faviconElements","titleBackup","titleChanged","stopped","pushInited","updateLocalSettings","updSettings","nodesktop","novibrate","nopreview","nopush","needPush","webPushApiManager","registeredDevice","nosound","requestPermission","Notification","mozVibrate","webkitVibrate","setAppBadge","notificationsUiSupport","notifySoundEl","topMessagesDeferred","toggleToggler","peerString","soundReset","tokenData","unregisterDevice","registerDevice","notificationData","custom","hasChat","hasUser","buildNotification","fwdCount","peerReaction","peerTypeNotifySettings","notification","getPeerString","notificationMessage","wrappedMessage","noIncrement","peerTitleOptions","notificationFromPeerId","peerPhoto","loadAvatar","avatarCanvas","avatarContext","avatarGradients","colorTop","colorBottom","abbreviation","getAbbreviation","textBaseline","textAlign","pushData","loc_key","loc_args","resetTitle","isBlink","setFavicon","titleInterval","prevFavicon","testSound","permission","notificationOptions","registration","serviceWorker","showNotification","getNotifications","appRuntimeManager","onclose","getLocalSettings","closeNotification","nextSoundAt","prevSoundVolume","filename","token_type","tokenType","tokenValue","other_uids","app_sandbox","secret","getFilesFromEvent","onlyTypes","scanFiles","isDirectory","directoryReader","createReader","readEntries","itemFile","getAsFile","DataTransferItem","DragEvent","dataTransfer","webkitGetAsEntry","addAnchorListener","protocol","noCancelEvent","pathnameParams","uriParams","u","host","noPathnameParams","noUriParams","parseUriParams","AppImManager","columnEl","offline","updateStatusInterval","cacheStorage","saveState","onHashChangeUnsafe","tgaddr","openUrl","postId","openUsername","userName","setSettings","messagesTextSize","forceRenderAfterSize","chatsSelectTabDebounced","toggleChatGradientAnimation","onDocumentPaste","attachType","newMediaPopup","_types","canDrag","backgroundPromises","CHATLIST","updateStatus","emojiAnimationContainer","appendEmojiAnimationContainer","createNewChat","chatsSelectTab","getPremium","compareVersion","deleteFilesIterative","applyCurrentTheme","resizeInstances","saveChatPosition","choosing","setChoosingStickerTyping","typing","onInstanceDeactivated","isUpdated","receiptMessage","onSpoilerClick","spoilerTimeout","stateStorage","topbarCall","discardCurrentCall","currentCall","setAuthorized","telegramMeWebManager","hashtag","STICKER_SET","EMOJI_SET","makeLink","INVOICE","VOICE_CHAT","USER_PHONE_NUMBER","thread","PRIVATE_POST","channel","comment","getStackFromElement","MESSAGE","attachKeydownListener","handleAutologinDomains","checkForShare","share","foundMedia","openWindow","onUrlAuthResult","urlAuthResult","botPeerTitle","logInCheckbox","allowMessagesCheckbox","request_write_access","confirmationPromise","logInChecked","allowMessagesChecked","acceptUrlAuth","onUrlAuthResultAccepted","requestUrlAuth","_appConfig","onAnchorClick","url_auth_domains","autologin_token","autologin_domains","originalUrl","searchParams","possibleBubble","timeoutOperation","requests","request","isBad","activatingChat","screen","IGNORE_KEYS","isSelectionCollapsed","getFirstMessageToEdit","getNextDialog","newEvent","KeyboardEvent","commentId","resolveChannel","op","checkChatInvite","saveApiChat","resolvePhone","getInputInvoiceBySlug","wrappedUrl","openComment","openPremiumBot","premium_bot_username","generateThreadServiceStartMessage","phone_calls_private","ignoreGroupCall","ignoreCall","discardGroupCallConfirmation","discardCallConfirmation","title1","title2","isClosing","getGroupCallFull","createGroupCall","setCurrentBackground","broadcastEvent","getBackground","getFile","lastBackgroundUrl","chatBubbles","chatPositions","backgroundUrl","attachDragAndDropListeners","drops","mediaDrops","isFiles","_dropsContainer","mediaDropsContainer","dropsContainer","_drops","PROFILE","onImTabChange","updateMyOnlineStatus","spliceChats","fromIndex","chatFrom","chatTo","chatIndex","existingIndex","oldChat","getTypingElement","eye","getPeerTyping","getPeerTypings","langPackKeys","multi","mapa","typingElement","descriptionElement","getChatStatus","typingEl","onlines","getOnlines","getPeerStatus","typingContainer","options1","options2","DialogColorsFg","DialogColors","DialogColorsMap","pic","peerParams","useBytes","bestPhotoSize","CallConnectionInstanceBase","connection","sources","createPeerConnection","config","RTCPeerConnection","signalingState","iceConnectionState","createDataChannel","dataChannel","createDescription","appendStreamToConference","streamManager","appendToConference","closeConnection","closeConnectionAndStream","stopStream","negotiate","negotiating","negotiateInternal","sendDataChannelData","parseSignalingData","sdp","parseMediaSectionInfo","fingerprint","ufrag","pwd","convertNumber","isSending","codec","ssrc","sourceGroups","ssrcGroups","sourceGroup","semantics","ssrcs","rtpExtensions","payloadTypesMap","getPayloadType","payloadType","clockrate","feedbackTypes","subtype","parameters","payloadTypes","CallConnectionInstance","localDescription","remoteDescription","descriptionInit","offerReceived","createAnswer","setLocalDescription","offer","createOffer","offerSent","initialSetup","sendCallSignalingData","crypto","subtle","P2PEncryptor","p2pKey","seqMap","concatSHA256","bufferConcats","encryptPrepared","msgKeyLarge","subarray","msgKey","aesKeyIv","prepareAesKeyIv","aesProcessCtr","encryptRawPacket","seq","ArrayBuffer","setUint32","sha256a","sha256b","iv","encryptedData","dataSize","encrypt","cryptoKey","constTimeIsDifferent","msgKeyEquals","decryptRawPacket","encryptedDataSize","decryptionBuffer","getUint32","ChromeP2PSdpBuilder","fingerprints","stringBuilder","streamName","addExtmap","addPayloadTypes","addSsrc","finalize","FirefoxP2PSdpBuilder","SafariP2PSdpBuilder","isFirefox","isSafari","extmap","j","fmtp","getOwnPropertyNames","pName","ssrcGroup","P2PSdpBuilder","sdpString","sdpMLineIndex","sdpMid","foundation","component","priority","relAddress","generation","tcpType","networkId","networkCost","candidate","generateOffer","generateAnswer","CallInstance","udp_p2p","udp_reflector","min_layer","max_layer","library_versions","createdAt","decryptQueue","candidates","canCreateConferenceEntry","setMediaState","sendMediaState","mediaStates","_sendMediaState","_connectionState","connectionInstance","sortIndex","findEntry","recvEntry","startScreenSharingInternal","wasStartingScreen","wasStartingVideo","requestScreen","stopVideoSharing","startVideoSharingInternal","requestInputSource","track","inputStream","getVideoTracks","stopTrack","isSharingVideoType","audioTrack","getAudioTracks","setHangUpTimeout","clearHangUpTimeout","hangUpTimeout","setPhoneCall","phoneCall","canAccept","overrideConnectionState","g_a_hash","appCallsManager","generateDh","dh","g_b","g_a","g_b_hash","getCallInput","phonePhoneCall","savePhonePhoneCall","joinCall","encryptionKey","configuration","iceServers","connections","ipv6","port","urls","turn","stun","credential","iceTransportPolicy","p2p_allowed","getRtcConfiguration","sendIceCandidate","onTrack","encryptor","decryptor","processDecryptQueue","createDataChannelEntry","dataChannelEntry","createEntry","sendEntry","negotiated","applyDataChannelData","TextEncoder","encode","iceCandidate","parsed","p2pParseCandidate","confirmCall","key_fingerprint","computeKey","emojisFingerprint","getEmojisFingerprintPromise","codePoints","unlockStreamManager","doTheMagic","getTransceivers","transceiver","getEntryByMid","bundle","sdpDescription","generateSdp","isAnswer","setRemoteDescription","onInputStream","stream","videoTrack","onMutedChange","requestAudioSource","setMuted","discardReason","discardedByOtherParty","hasVideo","discardCall","performCodec","_codec","setDataToDescription","setData","transport","screencast","filterNotVP8","vp8PayloadType","rtxIdx","apt","applyCallSignalingData","performSsrcGroups","getEntryBySource","sendRecvEntry","findFreeSendRecvEntry","setEntrySource","tryToReleaseCandidates","generateCandidate","RTCIceCandidate","addIceCandidate","decryptedData","TextDecoder","decode","signalingData","onUpdatePhoneCallSignalingData","getStreamCached","_cache","isScreen","constraints","getScreenStream","getStream","CallInstanceBase","fixSafariAudio","isSharingAudio","hasInputTrackKind","isAudioGood","isVideoGood","getAudioConstraints","getVideoConstraints","getScreenConstraints","endpoint","tryAddTrack","streams","saveInputVideoStream","isOutput","elementEndpoint","addTrack","useStream","outputStream","srcObject","sinkId","outputDeviceId","setSinkId","getTracks","addStream","CALL_STATE","audioAsset","CALL_REQUEST_TIMEOUT","CallsController","sortedInstances","createCallInstance","admin_id","g_a_or_b","bytesCmp","callId","getCallByUserId","hasConnected","hasCurrent","startCallInternal","fullInfo","participant_id","requestCall","GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX","GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS","GroupCallConnectionInstance","negotiateThrottled","bundlePolicy","rtcpMuxPolicy","iceCandidatePoolSize","maybeUpdateRemoteVideoConstraints","updateConstraintsInterval","invokeJoinGroupCall","localSdp","mainChannels","processedChannels","sectionInfo","payload","processMediaSection","audioChannel","videoChannel","useChannel","setEntryPeerId","performExtmap","filterServerCodecs","isNewConnection","originalOffer","iceRestart","hasMunged","skipAddingMulticast","mediaLine","mediaLineParts","localMLine","codecIds","newData","setPort","setSource","newSdp","addSsrcEntry","newChannel","mungedSdp","fixLocalOffer","entriesToDelete","shouldBeSkipped","answerDescription","deleteEntry","iceGatheringState","updateConstraints","sender","setParameters","getParameters","degradationPreference","colibriClass","defaultConstraints","onStageEndpoints","addInputVideoStream","GroupCallInstance","isSpeakingMap","pinnedSources","participantsSsrcs","hadAutoPinnedSources","dispatchPinnedThrottled","getCachedParticipants","presentation","unpinSource","changeUserMuted","source_groups","createConnectionInstance","raise","raiseHand","stopScreenSharing","startScreenSharing","startScreenSharingPromise","saveApiParticipant","leaveGroupCallPresentation","videoPaused","videoStopped","startVideoSharing","startVideoSharingPromise","rejoin","isDiscarded","isUpdatingMeInCurrentCall","onParticipantUpdate","doNotDispatchParticipantUpdate","hasLeft","oldSsrcs","modifiedTypes","oldSsrc","oldSource","oldEntry","originalDirection","setEndpoint","createTransceiver","GROUP_CALL_STATE","makeSsrcsFromParticipant","makeSsrcFromParticipant","audio_source","generateSelfVideo","audioSource","GroupCallsController","setCurrentGroupCall","startConnectingSound","stopConnectingSound","joinVideo","MediaStream","createMainStreamManager","joinGroupCallInternal","handleUpdateGroupCallParticipants","updatingSdp","channelCount","constraint","mediaDevices","getSupportedConstraints","constraintSupported","skipAudio","frameRate","screenStream","getDisplayMedia","contentHint","getUserMedia","clientInfo","lookupAttributeKeys","telegramSourceGroups","sdpLines","rest","parseSourceGroups","raw","ConferenceEntry","addTransceiver","generateSsrc","LocalConferenceDescription","sessionId","maxSeenId","entriesByMid","entriesBySource","entriesByPeerId","getEntriesByPeerId","conference","SDP","mediaSections","splitStringByLimitWithRest","UniqueNumberGenerator","generate","maxTries","_try","SDPAttributeSplitted","SDPMediaLineParts","SDPLine","SDPAttributeInner","missed","exists","nestedMap","makeAttributes","innerParts","SDPAttributes","fillAttributes","attributesMap","linesArray","SDPMediaSection","isReceiving","resultShouldBeArray","SDPSessionSection","parseSdp","createSection","sessionSection","lineStr","isIncorrectSdpLine","parseSdpLine","addSimulcast","generator","originalSsrcs","ssrcs2","ssrcsStrLines","ssrc2","WEBRTC_MEDIA_PORT","fixMediaLineType","getConnectionTypeForMediaType","generateMediaFirstLine","payloadIds","connectionType","SDPBuilder","addCandidate","performCandidate","addHeader","sId","bundleMids","addTransport","skipCandidates","addSource","addMsid","isApplication","isInactive","hdrexts","hdrext","fbs","fb","addConference","AudioStreamAnalyser","streamSource","createMediaStreamSource","gain","createGain","minDecibels","maxDecibels","smoothingTimeConstant","StreamManager","getAmplitude","streamAnalyser","analyse","ANALYSER_LISTENER","AudioContext","webkitAudioContext","getSource","itemSource","removeTrack","finalizeAddingTrack","changeTimer","substring","replaceInputAudio","oldTrack","timer","transceiverInit","tracks","mediaTrackType","trackIdx","replaceTrack","StringFromLineBuilder","newLine","addJoined","toTelegramSource","fromTelegramSource","rms","EMOJI_REG_EXP","onlyFirst","firstEmojiMatch","lastEmojiMatch","E","setBlankToAnchor","messageEntityTextUrl","messageEntityMentionName","isDraft","EMOJI_VERSIONS_SUPPORTED","inlineEl","newEmojiWidth","legacyEmojiWidth","isEmojiSupported","globalLazyLoadQueue","CustomEmojiElement","syncedPlayer","pausedElements","playersSynced","createCustomFiller","lastPausedVideo","middlewares","CustomEmojiRendererElement","clearedElements","WeakSet","isCanvasClean","emojiRenderers","getOffsets","offsetsMap","offsetParent","elementsArr","placeholders","isDimensionsSet","syncedPlayersFrames","isImageData","ImageData","frameWidth","frameHeight","lastChildWas","checkForAnyFrame","forceRenderAfter","renderEmojis","addCustomEmojis","addElements","usingOwnQueue","wrap","_loadPromises","newElements","isLottie","willHaveSyncedPlayer","newElementsArray","CUSTOM_EMOJI_INSTANT_PLAY","addition","_p","overrideRender","setRenderInterval","syncedPlayers","clearRenderInterval","missing","cachedPromises","uncachedPromisesPromise","loadFromPromises","uncached","emojiRenderInterval","renderers","nasty","usedLength","wrapSomething","wrapElement","noFiller","customWraps","contextSite","contextExternal","lastEntity","nextEntity","endPartOffset","fullEntityText","partText","usedText","fontFamily","atPos","fromBot","encodeURIComponent","isSupported","masked","currentContext","electronHelpers","contextUrl","wrapTelegramUrlToAnchor","encoded","encodeSpoiler","entityText","voodoo","insertCustomFillers","notFiller","isCustomFillerNeededBySiblingNode","url1","QueryableWorker","worker","terminate","onmessage","queryMethodListener","queryMethodArguments","postMessage","sendQuery","transfer","queryMethod","workersLimit","playersByCacheName","workers","curWorkerNum","onPlayerLoaded","reqId","fps","clamped","onPlayerError","getAnimation","setLoop","_autoplay","loadLottieWorkers","remain","Worker","queryableWorker","makeAssetUrl","loadAnimationAsAsset","loadAnimationFromURL","loadAnimationDataFromURL","blobConstruct","loadAnimationFromURLManually","loadAnimationFromURLNext","newParams","loadAnimationWorker","waitForFirstFrame","initPlayer","destroyWorkers","loadFromData","getLottiePixelRatio","RLottiePlayer","cachingDelta","CACHE","skipDelta","contexts","setMainLoop","clearPendingRAF","rafId","resetCurrentFrame","minFrame","requestFrame","applyInversing","renderFrame2","cachedSource","renderedFirstFrame","ImageBitmap","frInterval","frThen","frameNew","onLap","mainLoopForwards","mainLoopBackwards","currentMethod","frameListener","listenerResults","enterFrame","playToFrame","bounds","setMinMax","playToFrameOnFrameCallback","setInverseColor","pagesManager","pageId","pagesDiv","scrollableDiv","page","onShown","setPage","isAuthPage","Page","onFirstMount","encodeEmoji","emojiText","toCodePoints","removeVS16s","vs16RegExp","zeroWidthJoiner","rawEmoji","unicodeSurrogates","points","getEmojiToneIndex","VIRTUAL_COUNTRIES_EMOJIS","getCountryEmoji","emojiFromCodePoints","fromCodePoint","module","exports","defineProperty","enumerable","Symbol","toStringTag","__esModule","prototype","isRecordingSupported","bufferLength","encoderApplication","encoderFrameSize","encoderPath","maxFramesPerPage","mediaTrackConstraints","resampleQuality","streamPages","wavBitDepth","encodedSamplePosition","WebAssembly","clearStream","audioContext","closeAudioContext","encodeBuffers","getChannelData","encoder","buffers","initAudioContext","initAudioGraph","scriptProcessorNode","createScriptProcessor","destination","onaudioprocess","inputBuffer","monitorGainNode","setMonitorGain","recordingGainNode","setRecordingGain","initSourceNode","loadWorker","initWorker","streamPage","storePage","recordedPages","samplePosition","finish","originalSampleRate","sampleRate","wavSampleRate","onpause","resume","onresume","setTargetAtTime","onstart","destroyWorker","Function","kSampleStepSize","float32ArraySupported","Float32Array","A","aA1","aA2","B","C","calcBezier","aT","getSlope","LinearEasing","mX1","mY1","mX2","mY2","sampleValues","aX","intervalStart","currentSample","kSplineTableSize","guessForT","initialSlope","aGuessT","currentSlope","newtonRaphsonIterate","aA","aB","currentX","currentT","binarySubdivide","getTForX"],"sourceRoot":""} \ No newline at end of file diff --git a/public/crypto.worker.f500ff0fffe065cf9cba.chunk.js b/public/crypto.worker.c66e4e0d76fa581af241.chunk.js similarity index 99% rename from public/crypto.worker.f500ff0fffe065cf9cba.chunk.js rename to public/crypto.worker.c66e4e0d76fa581af241.chunk.js index b3ce9638..06414ed9 100644 --- a/public/crypto.worker.f500ff0fffe065cf9cba.chunk.js +++ b/public/crypto.worker.c66e4e0d76fa581af241.chunk.js @@ -1,2 +1,2 @@ (()=>{"use strict";var e,t,n={410:(e,t,n)=>{n.d(t,{GO:()=>o,ZP:()=>i});const r=n(1267).Z.debug,o="undefined"!=typeof window?window:self,i=r},4762:(e,t,n)=>{n.d(t,{IS_FIREFOX:()=>f,IS_SAFARI:()=>i});var r=n(6761);const o=navigator?navigator.userAgent:null,i=(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)&&r.Z.MSStream,!!("safari"in r.Z)||!(!o||!(/\b(iPad|iPhone|iPod)\b/.test(o)||o.match("Safari")&&!o.match("Chrome")))),f=navigator.userAgent.toLowerCase().indexOf("firefox")>-1;(void 0===navigator.maxTouchPoints||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)},1352:(e,t,n)=>{n.d(t,{N5:()=>o,SU:()=>r,kC:()=>i});const r="undefined"!=typeof ServiceWorkerGlobalScope&&self instanceof ServiceWorkerGlobalScope,o="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&!r,i=o||r,f=(e,...t)=>{try{e.postMessage(...t)}catch(e){console.error("[worker] postMessage error:",e,t)}},c=(e,...t)=>{self.clients.matchAll({includeUncontrolled:!1,type:"window"}).then((n=>{n.length&&n.slice(e?0:-1).forEach((e=>{f(e,...t)}))}))};r&&c.bind(null,!1),r&&c.bind(null,!0)},6991:(e,t,n)=>{function r(...e){const t=e.reduce(((e,t)=>e+(t.byteLength||t.length)),0),n=new Uint8Array(t);let r=0;return e.forEach((e=>{n.set(e instanceof ArrayBuffer?new Uint8Array(e):e,r),r+=e.byteLength||e.length})),n}Uint8Array.prototype.concat=function(...e){return r(this,...e)},Uint8Array.prototype.toJSON=function(){return[...this]},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)))))};var o=n(4736),i=n.n(o);i()(Number.MAX_SAFE_INTEGER);const f=i()(i()[2]).pow(64),c=f.divide(i()[2]);function a(e,t=256){return i().fromArray(e instanceof Uint8Array?[...e]:e,t)}function s(e){return new Uint8Array(e.toArray(256).value)}function u(e,t,n){const r=a(e),o=a(t),i=a(n);return s(r.modPow(o,i))}var h=n(745),l=n.n(h),d=n(6761),y=n(153),p=n(410),v=n(1352);class g extends y.Z{constructor(){super("CRYPTO"),this.lastIndex=-1}invokeCryptoNew({method:e,args:t,transfer:n}){const r={method:e,args:t},o=this.listeners.invoke;if(null==o?void 0:o.length){let e=o[0].callback(r);return v.kC||e instanceof Promise||(e=Promise.resolve(e)),e}const i="aes-encrypt"===e||"aes-decrypt"===e?this.lastIndex=(this.lastIndex+1)%this.sendPorts.length:0;return this.invoke("invoke",r,void 0,this.sendPorts[i],n)}invokeCrypto(e,...t){return this.invokeCryptoNew({method:e,args:t})}}const w=new g;p.GO&&(p.GO.cryptoMessagePort=w);const b=w;function m(e){const t=e.length,n=8*t;let r=i()(e[0]).and(127).shiftLeft(n-8);for(let o=1;o0&&c>7),f[i[s]^s]=s;for(;!x[c];c^=e||1)n=(n=a^a<<1^a<<2^a<<3^a<<4)>>8^255&n^99,x[c]=n,K[n]=c,o=16843009*i[t=i[e=i[c]]]^65537*t^257*e^16843008*c,r=257*i[n]^16843008*n,E[c]=r=r<<24^r>>>8,L[c]=r=r<<24^r>>>8,O[c]=r=r<<24^r>>>8,F[c]=r=r<<24^r>>>8,_[n]=o=o<<24^o>>>8,I[n]=o=o<<24^o>>>8,z[n]=o=o<<24^o>>>8,N[n]=o=o<<24^o>>>8,a=f[a]||1}();var R=function(){function e(e){var t=Z(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 n,r=1,o=t.length;o<4*t.length+28;o++)n=this.encKey[o-1],(o%t.length==0||8===t.length&&o%t.length==4)&&(n=x[n>>>24]<<24^x[n>>16&255]<<16^x[n>>8&255]<<8^x[255&n],o%t.length==0&&(n=n<<8^n>>>24^r<<24,r=r<<1^283*(r>>7))),this.encKey[o]=this.encKey[o-t.length]^n;for(var i=0;o;i++,o--)n=this.encKey[3&i?o:o-4],this.decKey[i]=o<=4||i<4?n:_[x[n>>>24]]^I[x[n>>16&255]]^z[x[n>>8&255]]^N[x[255&n]]}return e.prototype.encrypt=function(e){for(var t,n,r,o=Z(e),i=new Uint32Array(4),f=o[0]^this.encKey[0],c=o[1]^this.encKey[1],a=o[2]^this.encKey[2],s=o[3]^this.encKey[3],u=this.encKey.length/4-2,h=4,l=0;l>>24]^L[c>>16&255]^O[a>>8&255]^F[255&s]^this.encKey[h],n=E[c>>>24]^L[a>>16&255]^O[s>>8&255]^F[255&f]^this.encKey[h+1],r=E[a>>>24]^L[s>>16&255]^O[f>>8&255]^F[255&c]^this.encKey[h+2],s=E[s>>>24]^L[f>>16&255]^O[c>>8&255]^F[255&a]^this.encKey[h+3],f=t,c=n,a=r,h+=4;for(l=0;l<4;l++)i[l]=x[f>>>24]<<24^x[c>>16&255]<<16^x[a>>8&255]<<8^x[255&s]^this.encKey[h++],t=f,f=c,c=a,a=s,s=t;return i},e.prototype.decrypt=function(e){for(var t,n,r,o=Z(e),i=new Uint32Array(4),f=o[0]^this.decKey[0],c=o[3]^this.decKey[1],a=o[2]^this.decKey[2],s=o[1]^this.decKey[3],u=this.decKey.length/4-2,h=4,l=0;l>>24]^I[c>>16&255]^z[a>>8&255]^N[255&s]^this.decKey[h],n=_[c>>>24]^I[a>>16&255]^z[s>>8&255]^N[255&f]^this.decKey[h+1],r=_[a>>>24]^I[s>>16&255]^z[f>>8&255]^N[255&c]^this.decKey[h+2],s=_[s>>>24]^I[f>>16&255]^z[c>>8&255]^N[255&a]^this.decKey[h+3],f=t,c=n,a=r,h+=4;for(l=0;l<4;l++)i[3&-l]=K[f>>>24]<<24^K[c>>16&255]<<16^K[a>>8&255]<<8^K[255&s]^this.decKey[h++],t=f,f=c,c=a,a=s,s=t;return i},e}(),T=function(){function e(e,t,n){void 0===n&&(n=16),this.key=Z(e),this.iv=Z(t),this.cipher=new R(e),this.blockSize=n/4}return e.prototype.encrypt=function(e,t){for(var n=Z(e),r=t||new Uint32Array(n.length),o=this.iv.subarray(this.blockSize,this.iv.length),i=this.iv.subarray(0,this.blockSize),f=new Uint32Array(this.blockSize),c=0;c>>2]|=t[e]<<24-e%4*8;return new Uint32Array(n)}function W(e,t,n,r=!0){return function(e){const t=new Uint8Array(e.byteLength);for(let n=0,r=4*e.length;n>>2]>>>24-n%4*8&255;return t}(new T(B(t),B(n))[r?"encrypt":"decrypt"](B(e)))}!function(){function e(e,t,n){if(void 0===n&&(n=16),this.offset=0,this.key=Z(e),this.counter=Z(t),this.cipher=new R(e),this.blockSize=n/4,4!==this.counter.length)throw new Error("AES-CTR mode counter must be 16 bytes length")}e.prototype.encrypt=function(e,t){for(var n=Z(e),r=t||new Uint32Array(n.length),o=this.offset,i=0;i=this.blockSize&&this.incrementCounter(),o&&(i-=o,o=0)}return this.offset=(this.offset+n.length%4)%4,r},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--);}}();const G={8:new Uint8Array(1),16:new Uint16Array(1),32:new Uint32Array(1)};function j(e,t){return i().randBetween(e,t,(()=>function(e){const t=G[e];return crypto.getRandomValues(t),t[0]}(32)/4294967295))}function q(e){const t=i()[2];if(e.remainder(t).isZero())return t;const n=i()(1e3);let r,o,f,c,a,s,u;do{r=j(i().one,e.minus(1))}while(r.isZero()||r.eq(e.minus(t)));f=j(i().one,e.minus(1)),a=i().one,s=i().one;const h=i()("FFFFFFFFFFFFFFFF",16).minus(e).plus(1),l=n=>((n=(n=n.pow(t).mod(e)).add(r)).lesser(r)&&(n=n.add(h)),n.mod(e));do{o=f;for(let e=0;i()(e).lesser(a);++e)f=l(f);let t=i().zero;do{c=f;const r=i().min(n,a.minus(t));for(let t=0;i()(t).lesser(r);++t)f=l(f),s=s.multiply(o.greater(f)?o.minus(f):f.minus(o)).mod(e);u=i().gcd(s,e),t=t.add(n)}while(t.lesser(a)&&u.eq(i().one));a=a.shiftLeft(i().one)}while(u.eq(i().one));if(u.eq(e))do{c=l(c),u=i().gcd(o.minus(c).abs(),e)}while(u.eq(i().one));return u}const D="undefined"!=typeof window&&"crypto"in window?window.crypto.subtle:self.crypto.subtle;var J=function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function f(e){try{a(r.next(e))}catch(e){i(e)}}function c(e){try{a(r.throw(e))}catch(e){i(e)}}function a(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(f,c)}a((r=r.apply(e,t||[])).next())}))};class ${constructor(e,t,n){this.mode=e,this.cryptoKey=t,this.queue=[],this.counter=a(n)}update(e){return J(this,void 0,void 0,(function*(){return new Promise((t=>{this.queue.push({data:e,resolve:t}),this.release()}))}))}release(){return J(this,void 0,void 0,(function*(){if(!this.releasing){for(this.releasing=!0;this.queue.length;){const{data:e,resolve:t}=this.queue.shift();t(yield this._update(e))}this.releasing=!1}}))}perform(e){return J(this,void 0,void 0,(function*(){return yield D[this.mode]({name:"AES-CTR",counter:S(s(this.counter),16,!0,!0,!0),length:128},this.cryptoKey,e)}))}_update(e){return J(this,void 0,void 0,(function*(){let t,n=e;if(this.leftLength){const e=this.leftLength,r=16-e,o=new Uint8Array(e).concat(n.slice(0,r)),i=yield this.perform(o);t=new Uint8Array(i.slice(e)),n=n.slice(r),this.counter=this.counter.add(1)}const r=new Uint8Array(yield this.perform(n)),o=t?t.concat(r):r;let i=n.length;const f=i%16;i-=f;const c=i/16;return this.counter=this.counter.add(c),this.leftLength=f||void 0,o}))}}var V=function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function f(e){try{a(r.next(e))}catch(e){i(e)}}function c(e){try{a(r.throw(e))}catch(e){i(e)}}function a(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(f,c)}a((r=r.apply(e,t||[])).next())}))};const X=new Map;let H=-1;console.log("CryptoWorker start");const Y={sha1:function(e){return D.digest("SHA-1",U(e)).then((e=>new Uint8Array(e)))},sha256:function(e){return D.digest("SHA-256",U(e)).then((e=>new Uint8Array(e)))},pbkdf2:function(e,t,n){return r=this,o=void 0,f=function*(){const r=yield D.importKey("raw",e,{name:"PBKDF2"},!1,["deriveBits"]);return D.deriveBits({name:"PBKDF2",salt:t,iterations:n,hash:{name:"SHA-512"}},r,512).then((e=>new Uint8Array(e)))},new((i=void 0)||(i=Promise))((function(e,t){function n(e){try{a(f.next(e))}catch(e){t(e)}}function c(e){try{a(f.throw(e))}catch(e){t(e)}}function a(t){var r;t.done?e(t.value):(r=t.value,r instanceof i?r:new i((function(e){e(r)}))).then(n,c)}a((f=f.apply(r,o||[])).next())}));var r,o,i,f},"aes-encrypt":function(e,t,n){return W(S(e),t,n,!0)},"aes-decrypt":function(e,t,n){return W(e,t,n,!1)},"rsa-encrypt":function(e,t){return u(e,P(t.exponent),P(t.modulus))},factorize:function(e){let t=function(e){const t=a(e),n=[],r=[];let o=q(t);n.push(t.divide(o)),n.push(o);do{const e=n.pop();if(!e.eq(i().one))if(e.isPrime(!0)){r.push(e);for(let t=0;te.compare(t))),t.length>2&&(t=[t.splice(t.length-2,1)[0],t.reduce(((e,t)=>e.multiply(t)),i().one)]);const n=t[0],r=t[t.length-1];return(n.lesser(r)?[n,r]:[r,n]).map((e=>s(e)))},"mod-pow":u,gzipUncompress:function(e,t){return l().inflate(e,t?{to:"string"}:void 0)},computeSRP:function(e,t,n){return C(this,void 0,void 0,(function*(){const o=n?t.new_algo:t.current_algo,f=a(o.p),c=i()(o.g),u=yield function(e,t,n){return C(this,void 0,void 0,(function*(){let o=yield b.invokeCrypto("sha256",r(t,(new TextEncoder).encode(e),t));o=r(n,o,n),o=yield b.invokeCrypto("sha256",o);let i=yield b.invokeCrypto("pbkdf2",new Uint8Array(o),t,1e5);return i=r(n,i,n),o=yield b.invokeCrypto("sha256",i),o}))}(e,o.salt1,o.salt2),h=i()(function(e){const t=e.length,n=new Array(t);for(let r=0;r{const t=new Uint8Array(e.length);for(let n=0;n{const n=t.subtract(e);return!(n.isNegative()||n.bitLength().toJSNumber()<1984||e.bitLength().toJSNumber()<1984||Math.floor((e.bitLength().toJSNumber()+7)/8)>256)},{a:k,a_for_hash:P,u:x}=yield(()=>C(this,void 0,void 0,(function*(){for(;;){const e=a(y(t.secure_random)),n=c.modPow(e,f);if(A(n,f)){const t=s(n),o=a(yield b.invokeCrypto("sha256",r(t,w)));if(!o.isZero()&&!o.isNegative())return{a:e,a_for_hash:t,u:o}}}})))();let K;K=p.greater(m)?p:p.add(f),K=K.subtract(m).mod(f);const E=x.multiply(h),L=k.add(E),O=K.modPow(L,f),F=yield b.invokeCrypto("sha256",l(s(O),256));let _=yield b.invokeCrypto("sha256",v);_=function(e,t){const n=e.length,r=new Uint8Array(n);for(let o=0;o{for(;;){const t=k(new Uint8Array(e.length)),n=a(t);if(!n.greater(i().one))continue;const r=a(e);if(n.lesser(r.subtract(i().one)))return t}})(t),o=P(n.toString(16)),f=S(yield b.invokeCrypto("mod-pow",o,r,t),256,!0,!0,!0);return{a:r,g_a:f,g_a_hash:yield b.invokeCrypto("sha256",f),p:t}},new((r=void 0)||(r=Promise))((function(e,i){function f(e){try{a(o.next(e))}catch(e){i(e)}}function c(e){try{a(o.throw(e))}catch(e){i(e)}}function a(t){var n;t.done?e(t.value):(n=t.value,n instanceof r?n:new r((function(e){e(n)}))).then(f,c)}a((o=o.apply(t,n||[])).next())}));var t,n,r,o},"compute-dh-key":function(e,t,n){return r=this,o=void 0,s=function*(){const r=yield b.invokeCrypto("mod-pow",e,t,n);var o;return{key:r,key_fingerprint:(o=a((yield b.invokeCrypto("sha1",r)).slice(-8).reverse()),o.greater(c)?o.minus(f):o).toString(10)}},new((i=void 0)||(i=Promise))((function(e,t){function n(e){try{c(s.next(e))}catch(e){t(e)}}function f(e){try{c(s.throw(e))}catch(e){t(e)}}function c(t){var r;t.done?e(t.value):(r=t.value,r instanceof i?r:new i((function(e){e(r)}))).then(n,f)}c((s=s.apply(r,o||[])).next())}));var r,o,i,s},"get-emojis-fingerprint":function(e,t){return n=this,r=void 0,i=function*(){const n=e.concat(t),r=yield b.invokeCrypto("sha256",n),o=[],i=A.length;for(let e=0;e!=r.length;e+=8){const t=m(r.slice(e,e+8)).mod(i).toJSNumber(),n=A[t];o.push(n)}return o},new((o=void 0)||(o=Promise))((function(e,t){function f(e){try{a(i.next(e))}catch(e){t(e)}}function c(e){try{a(i.throw(e))}catch(e){t(e)}}function a(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(f,c)}a((i=i.apply(n,r||[])).next())}));var n,r,o,i},"aes-ctr-prepare":function({encKey:e,encIv:t,decKey:n,decIv:r}){return V(this,void 0,void 0,(function*(){const o=++H,i=[["encrypt",e],["decrypt",n]].map((([e,t])=>D.importKey("raw",t,{name:"AES-CTR"},!1,[e]))),[f,c]=yield Promise.all(i),a={enc:new $("encrypt",f,t.slice()),dec:new $("decrypt",c,r.slice())};return X.set(o,a),o}))},"aes-ctr-process":function({id:e,data:t,operation:n}){return V(this,void 0,void 0,(function*(){const r=X.get(e);return yield("encrypt"===n?r.enc:r.dec).update(t)}))},"aes-ctr-destroy":function(e){X.delete(e)}};b.addMultipleEventsListeners({invoke:({method:e,args:t})=>Y[e](...t),terminate:()=>{d.Z.close()}}),"undefined"!=typeof MessageChannel&&function(e,t,n){const r=(n,r)=>{e.attachListenPort(n),r&&e.attachSendPort(r),null==t||t(n)};e.setOnPortDisconnect(void 0),"undefined"!=typeof SharedWorkerGlobalScope?d.Z.addEventListener("connect",(e=>r(e.source,e.source))):"undefined"!=typeof ServiceWorkerGlobalScope?r(d.Z,null):r(d.Z,d.Z)}(b,(e=>{const t=new MessageChannel;b.attachPort(t.port1),b.invokeVoid("port",void 0,e,[t.port2])}))},5003:(e,t,n)=>{n.d(t,{kg:()=>d});var r,o=n(410),i=n(4762),f=n(1352),c=n(5289);!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"}(r||(r={}));const a=[r.None,r.Error,r.Warn,r.Log,r.Debug],s=!(i.IS_SAFARI||i.IS_FIREFOX),u="",h="",l=[["debug",r.Debug],["info",r.Log],["warn",r.Warn],["error",r.Error],["assert",r.Error],["trace",r.Log],["group",r.Log],["groupCollapsed",r.Log],["groupEnd",r.Log]];function d(e,t=r.Log|r.Warn|r.Error,n=!1,i=""){let y;o.ZP||n||(t=r.Error),s?i||(f.SU?i=u:f.N5&&(i=h)):i="";const p=i;i=i?`%s ${i}%s`:"%s";const v=function(...n){return t&r.Log&&console.log(i,(0,c.Z)(),e,...n)};return l.forEach((([n,r])=>{v[n]=function(...o){return t&r&&console[n](i,(0,c.Z)(),e,...o)}})),v.setPrefix=function(t){y=t,e="["+t+"]"},v.setPrefix(e),v.setLevel=function(e){t=a.slice(0,e+1).reduce(((e,t)=>e|t),0)},v.bindPrefix=function(e){return d(`${y}] [${e}`,t,n,p)},v}}},r={};function o(e){var t=r[e];if(void 0!==t)return t.exports;var i=r[e]={id:e,loaded:!1,exports:{}};return n[e].call(i.exports,i,i.exports,o),i.loaded=!0,i.exports}o.m=n,o.x=()=>{var e=o.O(void 0,[699,211,85],(()=>o(6991)));return o.O(e)},e=[],o.O=(t,n,r,i)=>{if(!n){var f=1/0;for(u=0;u=i)&&Object.keys(o.O).every((e=>o.O[e](n[a])))?n.splice(a--,1):(c=!1,i0&&e[u-1][2]>i;u--)e[u]=e[u-1];e[u]=[n,r,i]},o.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return o.d(t,{a:t}),t},o.d=(e,t)=>{for(var n in t)o.o(t,n)&&!o.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},o.f={},o.e=e=>Promise.all(Object.keys(o.f).reduce(((t,n)=>(o.f[n](e,t),t)),[])),o.u=e=>85===e?"85.887945ef5f43bc205112.bundle.js":{211:"npm.big-integer",699:"npm.pako"}[e]+"."+{211:"363d763daad0ee4e2741",699:"89deb457201f16c93925"}[e]+".chunk.js",o.miniCssF=e=>{},o.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),o.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),(()=>{var e;o.g.importScripts&&(e=o.g.location+"");var t=o.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var n=t.getElementsByTagName("script");n.length&&(e=n[n.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),o.p=e})(),(()=>{if(void 0!==o){var e=o.u,t=o.e,n={},r={};o.u=function(t){return e(t)+(n.hasOwnProperty(t)?"?"+n[t]:"")},o.e=function(i){return t(i).catch((function(t){var f=r.hasOwnProperty(i)?r[i]:999999;if(f<1){var c=e(i);throw t.message="Loading chunk "+i+" failed after 999999 retries.\n("+c+")",t.request=c,t}return new Promise((function(e){setTimeout((function(){var t=Date.now();n[i]=t,r[i]=f-1,e(o.e(i))}),3e3)}))}))}}})(),(()=>{var e={589:1};o.f.i=(t,n)=>{e[t]||importScripts(o.p+o.u(t))};var t=this.webpackChunktweb=this.webpackChunktweb||[],n=t.push.bind(t);t.push=t=>{var[r,i,f]=t;for(var c in i)o.o(i,c)&&(o.m[c]=i[c]);for(f&&f(o);r.length;)e[r.pop()]=1;n(t)}})(),t=o.x,o.x=()=>Promise.all([699,211,85].map(o.e,o)).then(t),o.x()})(); -//# sourceMappingURL=crypto.worker.f500ff0fffe065cf9cba.chunk.js.map \ No newline at end of file +//# sourceMappingURL=crypto.worker.c66e4e0d76fa581af241.chunk.js.map \ No newline at end of file diff --git a/public/crypto.worker.f500ff0fffe065cf9cba.chunk.js.map b/public/crypto.worker.c66e4e0d76fa581af241.chunk.js.map similarity index 99% rename from public/crypto.worker.f500ff0fffe065cf9cba.chunk.js.map rename to public/crypto.worker.c66e4e0d76fa581af241.chunk.js.map index 9c42619e..a463de80 100644 --- a/public/crypto.worker.f500ff0fffe065cf9cba.chunk.js.map +++ b/public/crypto.worker.c66e4e0d76fa581af241.chunk.js.map @@ -1 +1 @@ -{"version":3,"file":"crypto.worker.f500ff0fffe065cf9cba.chunk.js","mappings":"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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/startup chunk dependencies","webpack://tweb/./src/config/debug.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/helpers/context.ts","webpack://tweb/./src/helpers/bytes/bufferConcats.ts","webpack://tweb/./src/lib/polyfill.ts","webpack://tweb/./src/helpers/bigInt/bigIntConstants.ts","webpack://tweb/./src/helpers/bigInt/bigIntConversion.ts","webpack://tweb/./src/helpers/bytes/bytesModPow.ts","webpack://tweb/./src/lib/crypto/cryptoMessagePort.ts","webpack://tweb/./src/lib/calls/helpers/getEmojisFingerprint.ts","webpack://tweb/./src/helpers/array/randomize.ts","webpack://tweb/./src/helpers/bytes/addPadding.ts","webpack://tweb/./src/helpers/bytes/bytesFromHex.ts","webpack://tweb/./src/helpers/bytes/convertToUint8Array.ts","webpack://tweb/./node_modules/@cryptography/aes/dist/es/aes.js","webpack://tweb/./src/helpers/bytes/bytesToWordss.ts","webpack://tweb/./src/lib/crypto/utils/aesIGE.ts","webpack://tweb/./src/helpers/bytes/bytesFromWordss.ts","webpack://tweb/./src/helpers/random.ts","webpack://tweb/./src/helpers/bigInt/bigIntRandom.ts","webpack://tweb/./src/lib/crypto/utils/factorize/BrentPollard.ts","webpack://tweb/./src/lib/crypto/subtle.ts","webpack://tweb/./src/lib/crypto/utils/aesCTR.ts","webpack://tweb/./src/lib/crypto/aesCtrUtils.ts","webpack://tweb/./src/lib/crypto/crypto.worker.ts","webpack://tweb/./src/lib/crypto/utils/sha1.ts","webpack://tweb/./src/lib/crypto/utils/sha256.ts","webpack://tweb/./src/lib/crypto/utils/pbkdf2.ts","webpack://tweb/./src/lib/crypto/utils/rsa.ts","webpack://tweb/./src/helpers/gzipUncompress.ts","webpack://tweb/./src/lib/crypto/srp.ts","webpack://tweb/./src/helpers/bytes/bytesToHex.ts","webpack://tweb/./src/helpers/bytes/bytesXor.ts","webpack://tweb/./src/lib/crypto/generateDh.ts","webpack://tweb/./src/lib/crypto/computeDhKey.ts","webpack://tweb/./src/helpers/listenMessagePort.ts","webpack://tweb/./src/lib/logger.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/compat get default export","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/node module decorator","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/importScripts chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn Promise.all([699,211,85].map(__webpack_require__.e, __webpack_require__)).then(next);\n};","/*\n * 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 './modes';\n\nexport const IS_BETA = process.env.NODE_ENV !== 'production';\nexport const DEBUG = (IS_BETA || Modes.debug)/* && false */;\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\nexport default DEBUG;\n\n// let m = DEBUG;\n/* if(!DEBUG) {\n ctx.sandpitTurtle = () => {\n //if(!m) {\n for(let i in MOUNT_CLASS_TO) {\n ctx[i] = MOUNT_CLASS_TO[i];\n }\n //m = true;\n //}\n\n //DEBUG = !DEBUG;\n };\n} */\n\n/* export const superDebug = (object: any, key: string) => {\n var d = object[key];\n var beforeStr = '', afterStr = '';\n for(var r of d) {\n beforeStr += r.before.hex + '\\n';\n afterStr += r.after.hex + '\\n';\n }\n\n beforeStr = beforeStr.trim();\n afterStr = afterStr.trim();\n //var beforeStr = d.map((r) => r.before.hex).join('\\n');\n //var afterStr = d.map((r) => r.after.hex).join('\\n');\n\n var dada = (name: string, str: string) => {\n var a = document.createElement('a');\n a.target = '_blank';\n a.download = name + '.txt';\n a.href = URL.createObjectURL(new Blob([str], {\n type: 'text/plain'\n }));\n document.body.append(a);\n a.click();\n };\n\n dada(key + '_' + 'before', beforeStr);\n dada(key + '_' + 'after', afterStr);\n}\n\nMOUNT_CLASS_TO.superDebug = superDebug; */\n","/*\n * 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 './ctx';\n\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\n\n// https://stackoverflow.com/a/58065241\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\n !(ctx as any).MSStream;\n\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 */;\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\n\nexport const IS_MOBILE = (navigator.maxTouchPoints === undefined || 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;\n","/*\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// ะฒ SW ะผะพะถะตั‚ ะฑั‹ั‚ัŒ ัั€ะฐะทัƒ ะดะฒะต ะฟะตั€ะตะผะตะฝะฝั‹ั… TRUE\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\n\nexport const getWindowClients = () => {\n return (self as any as ServiceWorkerGlobalScope)\n .clients\n .matchAll({includeUncontrolled: false, type: 'window'});\n};\n\nexport const getLastWindowClient = () => getWindowClients().then((windowClients) => windowClients.slice(-1)[0]);\n\nconst postMessage = (listener: WindowClient | DedicatedWorkerGlobalScope, ...args: any[]) => {\n try {\n // @ts-ignore\n listener.postMessage(...args);\n } catch(err) {\n console.error('[worker] postMessage error:', err, args);\n }\n};\n\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\n getWindowClients().then((listeners) => {\n if(!listeners.length) {\n // console.trace('no listeners?', self, listeners);\n return;\n }\n\n listeners.slice(all ? 0 : -1).forEach((listener) => {\n postMessage(listener, ...args);\n });\n });\n};\n\nconst notifyWorker = (...args: any[]) => {\n postMessage(self as any as DedicatedWorkerGlobalScope, ...args);\n};\n\nconst noop = () => {};\n\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\n","export default function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\n\n const tmp = new Uint8Array(length);\n\n let lastLength = 0;\n args.forEach((b) => {\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\n });\n\n return tmp/* .buffer */;\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 bufferConcats from '../helpers/bytes/bufferConcats';\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\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\ndeclare global {\n interface Uint8Array {\n concat: (...args: Array) => Uint8Array,\n // toString: () => string,\n toJSON: () => number[],\n // toJSON: () => {type: 'bytes', value: number[]},\n }\n\n interface Promise {\n finally: (onfinally?: () => void) => Promise;\n }\n}\n","import bigInt from 'big-integer';\n\nexport const safeBigInt = bigInt(Number.MAX_SAFE_INTEGER);\nexport const ulongBigInt = bigInt(bigInt[2]).pow(64);\nexport const longBigInt = ulongBigInt.divide(bigInt[2]);\n","import bigInt from 'big-integer';\nimport { longBigInt, ulongBigInt } from './bigIntConstants';\n\nexport function bigIntFromBytes(bytes: Uint8Array | number[], base = 256) {\n return bigInt.fromArray(bytes instanceof Uint8Array ? [...bytes] : bytes, base);\n}\n\nexport function bigIntToBytes(bigInt: bigInt.BigInteger) {\n return new Uint8Array(bigInt.toArray(256).value);\n}\n\nexport function bigIntToSigned(bigInt: bigInt.BigInteger) {\n return bigInt.greater(longBigInt) ? bigInt.minus(ulongBigInt) : bigInt;\n}\n\nexport function bigIntToUnsigned(bigInt: bigInt.BigInteger) {\n return bigInt.isNegative() ? ulongBigInt.add(bigInt) : bigInt;\n}\n","import {bigIntFromBytes, bigIntToBytes} from '../bigInt/bigIntConversion';\n\nexport default function bytesModPow(bytes: number[] | Uint8Array, exp: number[] | Uint8Array, mod: number[] | Uint8Array) {\n const bytesBigInt = bigIntFromBytes(bytes);\n const expBigInt = bigIntFromBytes(exp);\n const modBigInt = bigIntFromBytes(mod);\n const resBigInt = bytesBigInt.modPow(expBigInt, modBigInt);\n return bigIntToBytes(resBigInt);\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 {CryptoMethods} from './crypto_methods';\nimport SuperMessagePort from '../mtproto/superMessagePort';\nimport {Awaited} from '../../types';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {IS_WORKER} from '../../helpers/context';\n\ntype CryptoEvent = {\n invoke: (payload: {method: T, args: Parameters}) => ReturnType,\n port: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n terminate: () => void\n};\n\nexport class CryptoMessagePort extends SuperMessagePort {\n private lastIndex: number;\n\n constructor() {\n super('CRYPTO');\n this.lastIndex = -1;\n }\n\n public invokeCryptoNew({method, args, transfer}: {\n method: T,\n args: Parameters,\n transfer?: Transferable[]\n }): Promise>> {\n const payload = {method, args};\n const listeners = this.listeners['invoke'];\n if(listeners?.length) { // already in worker\n // try {\n // @ts-ignore\n let result: any = listeners[0].callback(payload);\n if(!IS_WORKER && !(result instanceof Promise)) {\n result = Promise.resolve(result);\n }\n\n return result;\n // } catch(err) {\n // return Promise.reject(err);\n // }\n }\n\n const sendPortIndex = method === 'aes-encrypt' || method === 'aes-decrypt' ?\n this.lastIndex = (this.lastIndex + 1) % this.sendPorts.length :\n 0;\n // @ts-ignore\n return this.invoke('invoke', payload, undefined, this.sendPorts[sendPortIndex], transfer);\n }\n\n public invokeCrypto(method: T, ...args: Parameters): Promise>> {\n return this.invokeCryptoNew({method, args});\n }\n}\n\nconst cryptoMessagePort = new CryptoMessagePort();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.cryptoMessagePort = cryptoMessagePort);\nexport default cryptoMessagePort;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cryptoWorker from '../../crypto/cryptoMessagePort';\nimport bigInt from 'big-integer';\n\nfunction readBigIntFromBytesBE(bytes: Uint8Array) {\n const length = bytes.length;\n const bits = length * 8;\n let value = bigInt(bytes[0]).and(0x7F).shiftLeft(bits - 8);\n for(let i = 1; i < length; ++i) {\n const _bits = bits - (i + 1) * 8;\n const b = bigInt(bytes[i]);\n value = value.or(_bits ? b.shiftLeft(_bits) : b);\n }\n\n return value;\n}\n\n// Emojis were taken from tdlib\nconst emojis = [\n '1f609', '1f60d', '1f61b', '1f62d', '1f631', '1f621', '1f60e',\n '1f634', '1f635', '1f608', '1f62c', '1f607', '1f60f', '1f46e',\n '1f477', '1f482', '1f476', '1f468', '1f469', '1f474', '1f475',\n '1f63b', '1f63d', '1f640', '1f47a', '1f648', '1f649', '1f64a',\n '1f480', '1f47d', '1f4a9', '1f525', '1f4a5', '1f4a4', '1f442',\n '1f440', '1f443', '1f445', '1f444', '1f44d', '1f44e', '1f44c',\n '1f44a', '270c', '270b', '1f450', '1f446', '1f447', '1f449',\n '1f448', '1f64f', '1f44f', '1f4aa', '1f6b6', '1f3c3', '1f483',\n '1f46b', '1f46a', '1f46c', '1f46d', '1f485', '1f3a9', '1f451',\n '1f452', '1f45f', '1f45e', '1f460', '1f455', '1f457', '1f456',\n '1f459', '1f45c', '1f453', '1f380', '1f484', '1f49b', '1f499',\n '1f49c', '1f49a', '1f48d', '1f48e', '1f436', '1f43a', '1f431',\n '1f42d', '1f439', '1f430', '1f438', '1f42f', '1f428', '1f43b',\n '1f437', '1f42e', '1f417', '1f434', '1f411', '1f418', '1f43c',\n '1f427', '1f425', '1f414', '1f40d', '1f422', '1f41b', '1f41d',\n '1f41c', '1f41e', '1f40c', '1f419', '1f41a', '1f41f', '1f42c',\n '1f40b', '1f410', '1f40a', '1f42b', '1f340', '1f339', '1f33b',\n '1f341', '1f33e', '1f344', '1f335', '1f334', '1f333', '1f31e',\n '1f31a', '1f319', '1f30e', '1f30b', '26a1', '2614', '2744', '26c4',\n '1f300', '1f308', '1f30a', '1f393', '1f386', '1f383', '1f47b',\n '1f385', '1f384', '1f381', '1f388', '1f52e', '1f3a5', '1f4f7',\n '1f4bf', '1f4bb', '260e', '1f4e1', '1f4fa', '1f4fb', '1f509',\n '1f514', '23f3', '23f0', '231a', '1f512', '1f511', '1f50e',\n '1f4a1', '1f526', '1f50c', '1f50b', '1f6bf', '1f6bd', '1f527',\n '1f528', '1f6aa', '1f6ac', '1f4a3', '1f52b', '1f52a', '1f48a',\n '1f489', '1f4b0', '1f4b5', '1f4b3', '2709', '1f4eb', '1f4e6',\n '1f4c5', '1f4c1', '2702', '1f4cc', '1f4ce', '2712', '270f',\n '1f4d0', '1f4da', '1f52c', '1f52d', '1f3a8', '1f3ac', '1f3a4',\n '1f3a7', '1f3b5', '1f3b9', '1f3bb', '1f3ba', '1f3b8', '1f47e',\n '1f3ae', '1f0cf', '1f3b2', '1f3af', '1f3c8', '1f3c0', '26bd',\n '26be', '1f3be', '1f3b1', '1f3c9', '1f3b3', '1f3c1', '1f3c7',\n '1f3c6', '1f3ca', '1f3c4', '2615', '1f37c', '1f37a', '1f377',\n '1f374', '1f355', '1f354', '1f35f', '1f357', '1f371', '1f35a',\n '1f35c', '1f361', '1f373', '1f35e', '1f369', '1f366', '1f382',\n '1f370', '1f36a', '1f36b', '1f36d', '1f36f', '1f34e', '1f34f',\n '1f34a', '1f34b', '1f352', '1f347', '1f349', '1f353', '1f351',\n '1f34c', '1f350', '1f34d', '1f346', '1f345', '1f33d', '1f3e1',\n '1f3e5', '1f3e6', '26ea', '1f3f0', '26fa', '1f3ed', '1f5fb',\n '1f5fd', '1f3a0', '1f3a1', '26f2', '1f3a2', '1f6a2', '1f6a4',\n '2693', '1f680', '2708', '1f681', '1f682', '1f68b', '1f68e',\n '1f68c', '1f699', '1f697', '1f695', '1f69b', '1f6a8', '1f694',\n '1f692', '1f691', '1f6b2', '1f6a0', '1f69c', '1f6a6', '26a0',\n '1f6a7', '26fd', '1f3b0', '1f5ff', '1f3aa', '1f3ad',\n '1f1ef-1f1f5', '1f1f0-1f1f7', '1f1e9-1f1ea', '1f1e8-1f1f3',\n '1f1fa-1f1f8', '1f1eb-1f1f7', '1f1ea-1f1f8', '1f1ee-1f1f9',\n '1f1f7-1f1fa', '1f1ec-1f1e7', '0031-20e3', '0032-20e3', '0033-20e3',\n '0034-20e3', '0035-20e3', '0036-20e3', '0037-20e3', '0038-20e3', '0039-20e3',\n '0030-20e3', '1f51f', '2757', '2753', '2665', '2666', '1f4af', '1f517',\n '1f531', '1f534', '1f535', '1f536', '1f537'\n];\n\nexport default async function getEmojisFingerprint(key: Uint8Array, g_a: Uint8Array) {\n const arr = key.concat(g_a);\n const hash = await cryptoWorker.invokeCrypto('sha256', arr);\n\n const result: [string, string, string, string] = [] as any;\n const emojisLength = emojis.length;\n\n const kPartSize = 8;\n for(let partOffset = 0; partOffset != hash.length; partOffset += kPartSize) {\n const bytes = hash.slice(partOffset, partOffset + kPartSize);\n const value = readBigIntFromBytesBE(bytes);\n const index = value.mod(emojisLength).toJSNumber();\n\n // const emoji = emojiFromCodePoints(emojis[index]);\n const codePoints = emojis[index];\n result.push(codePoints);\n }\n\n return result;\n}\n","export default function randomize(arr: T) {\n if(crypto && 'getRandomValues' in crypto) {\n crypto.getRandomValues(arr);\n } else {\n throw new Error('NO_SECURE_RANDOM');\n }\n\n return arr;\n}\n","import randomize from '../array/randomize';\nimport bufferConcats from './bufferConcats';\n\nexport default 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 randomize(padding);\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","export default function bytesFromHex(hexString: string) {\n const len = hexString.length;\n const bytes = new Uint8Array(Math.ceil(len / 2));\n let start = 0;\n\n if(len % 2) { // read 0x581 as 0x0581\n bytes[start++] = parseInt(hexString.charAt(0), 16);\n }\n\n for(let i = start; i < len; i += 2) {\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\n }\n\n return bytes;\n}\n","export default function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\n if(bytes instanceof Uint8Array) {\n return bytes;\n } else if(typeof(bytes) === 'string') {\n return new TextEncoder().encode(bytes);\n }\n\n return new Uint8Array(bytes);\n}\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","import convertToUint8Array from './convertToUint8Array';\n\nexport default function bytesToWordss(input: Parameters[0]) {\n const bytes = convertToUint8Array(input);\n\n const words: number[] = [];\n for(let i = 0, len = bytes.length; i < len; ++i) {\n words[i >>> 2] |= bytes[i] << (24 - (i % 4) * 8);\n }\n\n return new Uint32Array(words);\n}\n","import {IGE} from '@cryptography/aes';\nimport addPadding from '../../../helpers/bytes/addPadding';\nimport bytesFromWordss from '../../../helpers/bytes/bytesFromWordss';\nimport bytesToWordss from '../../../helpers/bytes/bytesToWordss';\n\nexport default function aesSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array, encrypt = true) {\n // console.log(dT(), 'AES start', bytes, keyBytes, ivBytes);\n\n const cipher = new IGE(bytesToWordss(keyBytes), bytesToWordss(ivBytes));\n const performedBytes = cipher[encrypt ? 'encrypt' : 'decrypt'](bytesToWordss(bytes));\n // console.log(dT(), 'AES finish');\n\n return bytesFromWordss(performedBytes);\n}\n\nexport function aesEncryptSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array) {\n return aesSync(addPadding(bytes), keyBytes, ivBytes, true);\n}\n\nexport function aesDecryptSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array) {\n return aesSync(bytes, keyBytes, ivBytes, false);\n}\n","export default function bytesFromWordss(input: Uint32Array) {\n const o = new Uint8Array(input.byteLength);\n for(let i = 0, length = input.length * 4; i < length; ++i) {\n o[i] = ((input[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);\n }\n\n return o;\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\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","import bigInt from 'big-integer';\nimport {nextRandomUint} from '../random';\n\nexport default function bigIntRandom(min: bigInt.BigNumber, max: bigInt.BigNumber) {\n return bigInt.randBetween(min, max, () => {\n return nextRandomUint(32) / 0xFFFFFFFF;\n /* const bits = 32;\n const randomBytes = new Uint8Array(bits / 8);\n crypto.getRandomValues(randomBytes);\n const r = bigIntFromBytes(randomBytes).mod(bigInt(2).pow(bits));\n return r.toJSNumber(); */\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// Thanks to https://xn--2-umb.com/09/12/brent-pollard-rho-factorisation/\n\nimport bigInt from 'big-integer';\nimport {bigIntFromBytes, bigIntToBytes} from '../../../../helpers/bigInt/bigIntConversion';\nimport bigIntRandom from '../../../../helpers/bigInt/bigIntRandom';\n\n// let test = 0;\nfunction BrentPollardFactor(n: bigInt.BigInteger) {\n const two = bigInt[2];\n if(n.remainder(two).isZero()) {\n return two;\n }\n\n const m = bigInt(1000);\n let a: bigInt.BigInteger,\n x: bigInt.BigInteger,\n y: bigInt.BigInteger,\n ys: bigInt.BigInteger,\n r: bigInt.BigInteger,\n q: bigInt.BigInteger,\n g: bigInt.BigInteger;\n do\n a = bigIntRandom(bigInt.one, n.minus(1));\n while(a.isZero() || a.eq(n.minus(two)));\n y = bigIntRandom(bigInt.one, n.minus(1));\n r = bigInt.one;\n q = bigInt.one;\n\n // if(!test++) {\n // a = bigInt(3);\n // y = bigInt(3);\n // }\n\n const bigIntUint64 = bigInt('FFFFFFFFFFFFFFFF', 16);\n const bigIntUint64MinusPqPlusOne = bigIntUint64.minus(n).plus(1);\n\n const performY = (y: bigInt.BigInteger) => {\n y = y.pow(two).mod(n);\n y = y.add(a);\n if(y.lesser(a)) { // it slows down the script\n y = y.add(bigIntUint64MinusPqPlusOne);\n }\n y = y.mod(n);\n return y;\n };\n\n do {\n x = y;\n for(let i = 0; bigInt(i).lesser(r); ++i) {\n y = performY(y);\n }\n\n let k = bigInt.zero;\n do {\n ys = y;\n const condition = bigInt.min(m, r.minus(k));\n for(let i = 0; bigInt(i).lesser(condition); ++i) {\n y = performY(y);\n q = q.multiply(x.greater(y) ? x.minus(y) : y.minus(x)).mod(n);\n }\n g = bigInt.gcd(q, n);\n k = k.add(m);\n } while(k.lesser(r) && g.eq(bigInt.one));\n\n r = r.shiftLeft(bigInt.one);\n } while(g.eq(bigInt.one));\n\n if(g.eq(n)) {\n do {\n ys = performY(ys);\n g = bigInt.gcd(x.minus(ys).abs(), n);\n } while(g.eq(bigInt.one));\n }\n\n return g;\n}\n\nfunction primeFactors(pqBytes: Uint8Array | number[]) {\n const n = bigIntFromBytes(pqBytes);\n\n const factors: bigInt.BigInteger[] = [];\n const primes: bigInt.BigInteger[] = [];\n\n let factor = BrentPollardFactor(n);\n factors.push(n.divide(factor));\n factors.push(factor);\n\n // return [factor];\n\n do {\n const m = factors.pop();\n\n if(m.eq(bigInt.one))\n continue;\n\n if(m.isPrime(true)) {\n primes.push(m);\n\n // Remove the prime from the other factors\n for(let i = 0; i < factors.length; ++i) {\n let k = factors[i];\n if(k.mod(m).isZero()) {\n do\n k = k.divide(m);\n while(k.mod(m).isZero());\n factors[i] = k;\n }\n }\n } else {\n // factor = m.lesser(100) ? bigInt(PollardRho(m.toJSNumber())) : this.brentPollardFactor(m);\n factor = BrentPollardFactor(m);\n factors.push(m.divide(factor));\n factors.push(factor);\n }\n } while(factors.length);\n\n return primes;\n}\n\nexport default function factorizeBrentPollardPQ(pqBytes: Uint8Array | number[]): [Uint8Array, Uint8Array] {\n let factors = primeFactors(pqBytes);\n factors.sort((a, b) => a.compare(b));\n if(factors.length > 2) {\n factors = [\n factors.splice(factors.length - 2, 1)[0],\n factors.reduce((acc, v) => acc.multiply(v), bigInt.one)\n ];\n }\n\n const p = factors[0], q = factors[factors.length - 1];\n return (p.lesser(q) ? [p, q] : [q, p]).map((b) => bigIntToBytes(b)) as any;\n}\n","const subtle = typeof(window) !== 'undefined' && 'crypto' in window ? window.crypto.subtle : self.crypto.subtle;\n\nexport default subtle;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {BigInteger} from 'big-integer';\nimport {bigIntFromBytes, bigIntToBytes} from '../../../helpers/bigInt/bigIntConversion';\nimport addPadding from '../../../helpers/bytes/addPadding';\nimport subtle from '../subtle';\n\nconst COUNTER_LENGTH = 16;\n\nexport default class CTR {\n private cryptoKey: CryptoKey;\n // private encLeft: Uint8Array;\n private leftLength: number;\n private mode: 'encrypt' | 'decrypt';\n private counter: BigInteger;\n private queue: {data: Uint8Array, resolve: (data: Uint8Array) => void}[];\n private releasing: boolean;\n\n constructor(mode: 'encrypt' | 'decrypt', cryptoKey: CryptoKey, counter: Uint8Array) {\n this.mode = mode;\n this.cryptoKey = cryptoKey;\n this.queue = [];\n this.counter = bigIntFromBytes(counter);\n }\n\n public async update(data: Uint8Array) {\n return new Promise((resolve) => {\n this.queue.push({data, resolve});\n this.release();\n });\n }\n\n private async release() {\n if(this.releasing) {\n return;\n }\n\n this.releasing = true;\n while(this.queue.length) {\n const {data, resolve} = this.queue.shift();\n resolve(await this._update(data));\n }\n this.releasing = false;\n }\n\n private async perform(data: Uint8Array) {\n const arrayBuffer: ArrayBuffer = await subtle[this.mode]({\n name: 'AES-CTR',\n counter: addPadding(bigIntToBytes(this.counter), COUNTER_LENGTH, true, true, true),\n length: 128\n },\n this.cryptoKey,\n data\n );\n\n return arrayBuffer;\n }\n\n private async _update(data: Uint8Array) {\n let toEncrypt = data;\n let head: Uint8Array/* , tail: Uint8Array */;\n if(this.leftLength) {\n // const leftLength = this.encLeft.byteLength;\n const leftLength = this.leftLength;\n const leftLength2 = COUNTER_LENGTH - leftLength;\n // const left = this.encLeft.concat(toEncrypt.slice(0, leftLength2));\n const left = (new Uint8Array(leftLength)).concat(toEncrypt.slice(0, leftLength2));\n\n const performed = await this.perform(left);\n\n head = new Uint8Array(performed.slice(leftLength));\n\n toEncrypt = toEncrypt.slice(leftLength2);\n\n this.counter = this.counter.add(1);\n }\n\n const tail = new Uint8Array(await this.perform(toEncrypt));\n\n const result = head ? head.concat(tail) : tail;\n\n let length = toEncrypt.length;\n const leftAfter = length % COUNTER_LENGTH;\n length -= leftAfter;\n\n const a = length / COUNTER_LENGTH;\n this.counter = this.counter.add(a);\n\n this.leftLength = leftAfter || undefined;\n // this.encLeft = leftAfter ? toEncrypt.slice(-leftAfter) : undefined;\n\n return result;\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 CTR from './utils/aesCTR';\nimport subtle from './subtle';\n\nconst aesCTRs: Map = new Map();\nlet lastCTRId = -1;\n\ntype K = {\n enc: CTR,\n dec: CTR,\n};\n\nexport async function aesCtrPrepare({encKey, encIv, decKey, decIv}: {[k in 'encKey' | 'encIv' | 'decKey' | 'decIv']: Uint8Array}) {\n const id = ++lastCTRId;\n\n const a = [['encrypt', encKey], ['decrypt', decKey]] as ['encrypt' | 'decrypt', Uint8Array][];\n const promises = a.map(([mode, key]) => {\n return subtle.importKey(\n 'raw',\n key,\n {name: 'AES-CTR'},\n false,\n [mode]\n )\n });\n\n const [encCryptoKey, decCryptoKey] = await Promise.all(promises);\n const enc = new CTR('encrypt', encCryptoKey, encIv.slice());\n const dec = new CTR('decrypt', decCryptoKey, decIv.slice());\n\n const k: K = {\n enc,\n dec\n };\n\n aesCTRs.set(id, k);\n\n return id;\n}\n\nexport async function aesCtrProcess({id, data, operation}: {id: number, data: Uint8Array, operation: 'encrypt' | 'decrypt'}) {\n const ctrs = aesCTRs.get(id);\n const result = await (operation === 'encrypt' ? ctrs.enc : ctrs.dec).update(data);\n return result;\n}\n\nexport function aesCtrDestroy(id: number) {\n aesCTRs.delete(id);\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 '../polyfill'; // just to include\n\nimport bytesModPow from '../../helpers/bytes/bytesModPow';\nimport gzipUncompress from '../../helpers/gzipUncompress';\nimport listenMessagePort from '../../helpers/listenMessagePort';\nimport getEmojisFingerprint from '../calls/helpers/getEmojisFingerprint';\nimport computeDhKey from './computeDhKey';\nimport cryptoMessagePort from './cryptoMessagePort';\nimport {CryptoMethods} from './crypto_methods';\nimport generateDh from './generateDh';\nimport computeSRP from './srp';\nimport {aesEncryptSync, aesDecryptSync} from './utils/aesIGE';\nimport factorizeBrentPollardPQ from './utils/factorize/BrentPollard';\nimport pbkdf2 from './utils/pbkdf2';\nimport rsaEncrypt from './utils/rsa';\nimport sha1 from './utils/sha1';\nimport sha256 from './utils/sha256';\nimport {aesCtrDestroy, aesCtrPrepare, aesCtrProcess} from './aesCtrUtils';\nimport ctx from '../../environment/ctx';\n\nconsole.log('CryptoWorker start');\n\nconst cryptoMethods: CryptoMethods = {\n 'sha1': sha1,\n 'sha256': sha256,\n 'pbkdf2': pbkdf2,\n 'aes-encrypt': aesEncryptSync,\n 'aes-decrypt': aesDecryptSync,\n 'rsa-encrypt': rsaEncrypt,\n 'factorize': factorizeBrentPollardPQ,\n // 'factorize-tdlib': factorizeTdlibPQ,\n // 'factorize-new-new': pqPrimeLeemonNew,\n 'mod-pow': bytesModPow,\n 'gzipUncompress': gzipUncompress,\n 'computeSRP': computeSRP,\n 'generate-dh': generateDh,\n 'compute-dh-key': computeDhKey,\n 'get-emojis-fingerprint': getEmojisFingerprint,\n 'aes-ctr-prepare': aesCtrPrepare,\n 'aes-ctr-process': aesCtrProcess,\n 'aes-ctr-destroy': aesCtrDestroy\n};\n\ncryptoMessagePort.addMultipleEventsListeners({\n invoke: ({method, args}) => {\n // @ts-ignore\n const result: any = cryptoMethods[method](...args);\n return result;\n },\n\n terminate: () => {\n ctx.close();\n }\n});\n\nif(typeof(MessageChannel) !== 'undefined') listenMessagePort(cryptoMessagePort, (source) => {\n const channel = new MessageChannel();\n cryptoMessagePort.attachPort(channel.port1);\n cryptoMessagePort.invokeVoid('port', undefined, source, [channel.port2]);\n});\n","import convertToUint8Array from '../../../helpers/bytes/convertToUint8Array';\nimport subtle from '../subtle';\n// import sha1 from '@cryptography/sha1';\n\nexport default function sha1(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","import convertToUint8Array from '../../../helpers/bytes/convertToUint8Array';\nimport subtle from '../subtle';\n// import sha256 from '@cryptography/sha256';\n\nexport default function sha256(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","import subtle from '../subtle';\n\nexport default async function 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 const 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","import type {RSAPublicKeyHex} from '../../mtproto/rsaKeysManager';\nimport bytesModPow from '../../../helpers/bytes/bytesModPow';\nimport bytesFromHex from '../../../helpers/bytes/bytesFromHex';\n\nexport default function rsaEncrypt(bytes: Uint8Array, publicKey: RSAPublicKeyHex) {\n return bytesModPow(bytes, bytesFromHex(publicKey.exponent), bytesFromHex(publicKey.modulus));\n}\n","// export function gzipUncompress(bytes: ArrayBuffer, toString: true): string;\n\n// @ts-ignore\nimport pako from 'pako/dist/pako_inflate.min.js';\n// import dT from './dT';\n\n// export function gzipUncompress(bytes: ArrayBuffer, toString?: false): Uint8Array;\nexport default 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\nimport cryptoWorker from './cryptoMessagePort';\nimport {AccountPassword, InputCheckPasswordSRP, PasswordKdfAlgo} from '../../layer';\nimport addPadding from '../../helpers/bytes/addPadding';\nimport bufferConcats from '../../helpers/bytes/bufferConcats';\nimport bytesXor from '../../helpers/bytes/bytesXor';\nimport convertToUint8Array from '../../helpers/bytes/convertToUint8Array';\nimport bigInt from 'big-integer';\nimport {bigIntFromBytes, bigIntToBytes} from '../../helpers/bigInt/bigIntConversion';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\n\nexport async function makePasswordHash(password: string, client_salt: Uint8Array, server_salt: Uint8Array) {\n // ! look into crypto_methods.test.ts\n let buffer = await cryptoWorker.invokeCrypto('sha256', bufferConcats(client_salt, new TextEncoder().encode(password), client_salt));\n buffer = bufferConcats(server_salt, buffer, server_salt);\n buffer = await cryptoWorker.invokeCrypto('sha256', buffer);\n\n let hash = await cryptoWorker.invokeCrypto('pbkdf2', new Uint8Array(buffer), client_salt, 100000);\n hash = bufferConcats(server_salt, hash, server_salt);\n\n buffer = await cryptoWorker.invokeCrypto('sha256', hash);\n\n return buffer;\n}\n\nexport default async function computeSRP(password: string, state: AccountPassword, isNew: boolean) {\n const algo = (isNew ? state.new_algo : state.current_algo) as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\n\n const p = bigIntFromBytes(algo.p);\n const g = bigInt(algo.g);\n\n /* if(B.compareTo(BigInteger.ZERO) < 0) {\n console.error('srp_B < 0')\n }\n\n if(B.compareTo(p) <= 0) {\n console.error('srp_B <= p');\n } */\n\n /* let check_prime_and_good = (bytes: any, g: number) => {\n let good_prime = 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b';\n\n if(bytesToHex(bytes) === good_prime && [3, 4, 5, 7].indexOf(g) !== -1) {\n return true;\n }\n\n // TO-DO check_prime_and_good_check\n }; */\n\n // check_prime_and_good(algo.p, g);\n\n const pw_hash = await makePasswordHash(password, algo.salt1, algo.salt2);\n const x = bigInt(bytesToHex(pw_hash), 16);\n\n const padArray = function(arr: number[] | Uint8Array, len: number) {\n if(!(arr instanceof Uint8Array)) {\n arr = convertToUint8Array(arr);\n }\n\n return addPadding(arr, len, true, true, true);\n };\n\n const v = g.modPow(x, p);\n\n const flipper = (arr: Uint8Array | number[]) => {\n const out = new Uint8Array(arr.length);\n for(let i = 0; i < arr.length; i += 4) {\n out[i] = arr[i + 3];\n out[i + 1] = arr[i + 2];\n out[i + 2] = arr[i + 1];\n out[i + 3] = arr[i];\n }\n\n return out;\n };\n\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password\n if(isNew) {\n const bytes = bigIntToBytes(v);\n return padArray(/* (isBigEndian ? bytes.reverse() : bytes) */bytes, 256);\n }\n\n const B = bigIntFromBytes(state.srp_B);\n\n const pForHash = padArray(bigIntToBytes(p), 256);\n const gForHash = padArray(bigIntToBytes(g), 256);\n const b_for_hash = padArray(bigIntToBytes(B), 256);\n\n const kHash = await cryptoWorker.invokeCrypto('sha256', bufferConcats(pForHash, gForHash));\n const k = bigIntFromBytes(kHash);\n\n const k_v = k.multiply(v).mod(p);\n\n const is_good_mod_exp_first = (modexp: bigInt.BigInteger, prime: bigInt.BigInteger) => {\n const diff = prime.subtract(modexp);\n const min_diff_bits_count = 2048 - 64;\n const max_mod_exp_size = 256;\n if(diff.isNegative() ||\n diff.bitLength().toJSNumber() < min_diff_bits_count ||\n modexp.bitLength().toJSNumber() < min_diff_bits_count ||\n Math.floor((modexp.bitLength().toJSNumber() + 7) / 8) > max_mod_exp_size)\n return false;\n return true;\n };\n\n const generate_and_check_random = async() => {\n while(true) {\n const a = bigIntFromBytes(flipper(state.secure_random));\n // const a = str2bigInt('9153faef8f2bb6da91f6e5bc96bc00860a530a572a0f45aac0842b4602d711f8bda8d59fb53705e4ae3e31a3c4f0681955425f224297b8e9efd898fec22046debb7ba8a0bcf2be1ada7b100424ea318fdcef6ccfe6d7ab7d978c0eb76a807d4ab200eb767a22de0d828bc53f42c5a35c2df6e6ceeef9a3487aae8e9ef2271f2f6742e83b8211161fb1a0e037491ab2c2c73ad63c8bd1d739de1b523fe8d461270cedcf240de8da75f31be4933576532955041dc5770c18d3e75d0b357df9da4a5c8726d4fced87d15752400883dc57fa1937ac17608c5446c4774dcd123676d683ce3a1ab9f7e020ca52faafc99969822717c8e07ea383d5fb1a007ba0d170cb', 16);\n\n const A = g.modPow(a, p);\n if(is_good_mod_exp_first(A, p)) {\n const a_for_hash = bigIntToBytes(A);\n\n const s = await cryptoWorker.invokeCrypto('sha256', bufferConcats(a_for_hash, b_for_hash));\n // const u = bigInt(s.hex, 16);\n const u = bigIntFromBytes(s);\n if(!u.isZero() && !u.isNegative())\n return {a, a_for_hash, u};\n }\n }\n }\n\n const {a, a_for_hash, u} = await generate_and_check_random();\n\n let g_b: bigInt.BigInteger;\n if(!B.greater(k_v)) {\n g_b = B.add(p);\n } else g_b = B;\n g_b = g_b.subtract(k_v).mod(p);\n\n const ux = u.multiply(x);\n const a_ux = a.add(ux);\n const S = g_b.modPow(a_ux, p);\n\n const K = await cryptoWorker.invokeCrypto('sha256', padArray(bigIntToBytes(S), 256));\n\n let h1 = await cryptoWorker.invokeCrypto('sha256', pForHash);\n const h2 = await cryptoWorker.invokeCrypto('sha256', gForHash);\n h1 = bytesXor(h1, h2);\n\n const buff = bufferConcats(\n h1,\n await cryptoWorker.invokeCrypto('sha256', algo.salt1),\n await cryptoWorker.invokeCrypto('sha256', algo.salt2),\n a_for_hash,\n b_for_hash,\n K\n );\n\n const M1 = await cryptoWorker.invokeCrypto('sha256', buff);\n\n const out: InputCheckPasswordSRP.inputCheckPasswordSRP = {\n _: 'inputCheckPasswordSRP',\n srp_id: state.srp_id,\n A: new Uint8Array(a_for_hash),\n M1\n };\n\n return out;\n}\n","export default function bytesToHex(bytes: ArrayLike) {\n const length = bytes.length;\n const arr: string[] = new Array(length);\n for(let i = 0; i < length; ++i) {\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\n }\n return arr.join('');\n}\n","export default function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\n const len = bytes1.length;\n const bytes = new Uint8Array(len);\n\n for(let i = 0; i < len; ++i) {\n bytes[i] = bytes1[i] ^ bytes2[i];\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\nimport type CallInstance from '../calls/callInstance';\nimport type {MessagesDhConfig} from '../../layer';\nimport bigInt from 'big-integer';\nimport randomize from '../../helpers/array/randomize';\nimport {bigIntFromBytes} from '../../helpers/bigInt/bigIntConversion';\nimport addPadding from '../../helpers/bytes/addPadding';\nimport bytesFromHex from '../../helpers/bytes/bytesFromHex';\nimport cryptoWorker from './cryptoMessagePort';\n\nexport default async function generateDh(dhConfig: MessagesDhConfig.messagesDhConfig) {\n const {p, g} = dhConfig;\n\n const generateA = (p: Uint8Array) => {\n for(;;) {\n const a = randomize(new Uint8Array(p.length));\n // const a = new Uint8Array(4).randomize();\n\n const aBigInt = bigIntFromBytes(a); // str2bigInt(bytesToHex(a), 16);\n if(!aBigInt.greater(bigInt.one)) {\n continue;\n }\n\n const pBigInt = bigIntFromBytes(p); // str2bigInt(bytesToHex(p), 16);\n if(!aBigInt.lesser(pBigInt.subtract(bigInt.one))) {\n continue;\n }\n\n return a;\n }\n };\n\n const a = generateA(p);\n // const a = new Uint8Array([0]);\n\n const gBytes = bytesFromHex(g.toString(16));\n const g_a = addPadding(await cryptoWorker.invokeCrypto('mod-pow', gBytes, a, p), 256, true, true, true);\n const g_a_hash = await cryptoWorker.invokeCrypto('sha256', g_a);\n\n const dh: CallInstance['dh'] = {\n a: a,\n g_a: g_a,\n g_a_hash: g_a_hash,\n p\n };\n\n return dh;\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 {bigIntFromBytes, bigIntToSigned} from '../../helpers/bigInt/bigIntConversion';\nimport cryptoWorker from './cryptoMessagePort';\n\nexport default async function computeDhKey(g_b: Uint8Array, a: Uint8Array, p: Uint8Array) {\n const key = await cryptoWorker.invokeCrypto('mod-pow', g_b, a, p);\n const keySha1Hashed = await cryptoWorker.invokeCrypto('sha1', key);\n const key_fingerprint = keySha1Hashed.slice(-8).reverse();\n const key_fingerprint_long = bigIntToSigned(bigIntFromBytes(key_fingerprint)).toString(10);\n\n return {key, key_fingerprint: key_fingerprint_long};\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 SuperMessagePort from '../lib/mtproto/superMessagePort';\nimport ctx from '../environment/ctx';\n\nexport default function listenMessagePort(\n messagePort: SuperMessagePort,\n onConnect?: (source: MessageEventSource) => void,\n onDisconnect?: (source: MessageEventSource) => void\n) {\n const attachPort = (listenPort: any, sendPort: any) => {\n messagePort.attachListenPort(listenPort);\n sendPort && messagePort.attachSendPort(sendPort);\n onConnect?.(listenPort);\n };\n\n messagePort.setOnPortDisconnect(onDisconnect);\n\n if(typeof(SharedWorkerGlobalScope) !== 'undefined') {\n (ctx as any as SharedWorkerGlobalScope).addEventListener('connect', (e) => attachPort(e.source, e.source));\n } else if(typeof(ServiceWorkerGlobalScope) !== 'undefined') {\n attachPort(ctx, null);\n } else {\n attachPort(ctx, ctx);\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 DEBUG from '../config/debug';\nimport {IS_FIREFOX, IS_SAFARI} from '../environment/userAgent';\nimport {IS_SERVICE_WORKER, IS_WEB_WORKER} from '../helpers/context';\nimport dT from '../helpers/dT';\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 IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\n// let getCallerFunctionNameFromLine: (line: string) => string;\n// if(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;\n// const LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\n// function 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 group(...args: any[]): void;\n groupCollapsed(...args: any[]): void;\n groupEnd(...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' */ | 'group' | 'groupCollapsed' | 'groupEnd', 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 ['group', LogTypes.Log],\n ['groupCollapsed', LogTypes.Log],\n ['groupEnd', 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 const 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","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [699,211,85], () => (__webpack_require__(6991)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames not based on template\n\tif (chunkId === 85) return \"85.887945ef5f43bc205112.bundle.js\";\n\t// return url for filenames based on template\n\treturn \"\" + {\"211\":\"npm.big-integer\",\"699\":\"npm.pako\"}[chunkId] + \".\" + {\"211\":\"363d763daad0ee4e2741\",\"699\":\"89deb457201f16c93925\"}[chunkId] + \".chunk.js\";\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = {};\n var countMap = {};\n var getRetryDelay = function () {\n return 3000;\n };\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result +\n (queryMap.hasOwnProperty(chunkId) ? '?' + queryMap[chunkId] : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.hasOwnProperty(chunkId)\n ? countMap[chunkId]\n : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n var retryAttempt = 999999 - retries + 1;\n setTimeout(function () {\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap[chunkId] = cacheBust;\n countMap[chunkId] = retries - 1;\n resolve(__webpack_require__.e(chunkId));\n }, getRetryDelay(retryAttempt));\n });\n });\n };\n }\n})();\n","// no baseURI\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t589: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","next","DEBUG","MOUNT_CLASS_TO","window","self","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","IS_FIREFOX","undefined","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","IS_WEB_WORKER","WorkerGlobalScope","IS_WORKER","postMessage","listener","args","err","console","error","notifyServiceWorker","all","clients","matchAll","includeUncontrolled","type","then","listeners","length","slice","forEach","bind","bufferConcats","reduce","acc","v","byteLength","tmp","Uint8Array","lastLength","b","set","ArrayBuffer","prototype","concat","this","toJSON","Promise","finally","fn","onFinally","callback","resolve","result","reason","reject","Number","MAX_SAFE_INTEGER","pow","longBigInt","divide","bigIntFromBytes","bytes","base","bigIntToBytes","bigInt","toArray","value","bytesModPow","exp","mod","bytesBigInt","expBigInt","modBigInt","modPow","CryptoMessagePort","constructor","super","lastIndex","invokeCryptoNew","method","transfer","payload","sendPortIndex","sendPorts","invoke","invokeCrypto","cryptoMessagePort","readBigIntFromBytesBE","bits","and","shiftLeft","i","_bits","or","emojis","randomize","arr","crypto","Error","getRandomValues","addPadding","blockSize","zeroes","blockSizeAsTotalLength","prepend","len","needPadding","padding","buffer","bytesFromHex","hexString","Math","ceil","start","parseInt","charAt","substr","convertToUint8Array","TextEncoder","encode","S","Si","T1","Uint32Array","T2","T3","T4","T5","T6","T7","T8","getWords","key","buf","pos","str","charCodeAt","xor","left","right","to","x2","x4","s","tEnc","tDec","d","t","x","xInv","computeTables","AES","_key","encKey","decKey","rcon","j","encrypt","_message","a2","b2","c2","message","out","a","c","rounds","k","decrypt","AES_IGE","iv","cipher","text","cipherText","prevX","subarray","prevY","yXOR","y","bytesToWordss","input","words","aesSync","keyBytes","ivBytes","o","bytesFromWordss","counter","offset","incrementCounter","carry","arrays","Uint16Array","bigIntRandom","min","max","array","nextRandomUint","BrentPollardFactor","n","two","remainder","isZero","m","ys","r","q","g","minus","eq","bigIntUint64MinusPqPlusOne","plus","performY","add","lesser","condition","multiply","greater","abs","subtle","CTR","mode","cryptoKey","queue","update","data","push","release","releasing","shift","_update","perform","name","head","toEncrypt","leftLength","leftLength2","performed","tail","leftAfter","aesCTRs","Map","lastCTRId","log","cryptoMethods","salt","iterations","importKey","hash","publicKey","exponent","modulus","pqBytes","factors","primes","factor","pop","isPrime","primeFactors","sort","compare","splice","p","map","toString","password","state","isNew","algo","new_algo","current_algo","pw_hash","client_salt","server_salt","makePasswordHash","salt1","salt2","Array","join","bytesToHex","padArray","flipper","B","srp_B","pForHash","gForHash","b_for_hash","k_v","is_good_mod_exp_first","modexp","prime","diff","subtract","isNegative","bitLength","toJSNumber","floor","a_for_hash","u","secure_random","A","generate_and_check_random","g_b","ux","a_ux","K","h1","bytes1","bytes2","bytesXor","buff","M1","_","srp_id","dhConfig","aBigInt","pBigInt","generateA","gBytes","g_a","g_a_hash","key_fingerprint","reverse","emojisLength","partOffset","index","codePoints","encIv","decIv","id","promises","encCryptoKey","decCryptoKey","enc","dec","operation","ctrs","get","delete","terminate","ctx","messagePort","onConnect","onDisconnect","attachPort","listenPort","sendPort","attachListenPort","attachSendPort","setOnPortDisconnect","listenMessagePort","e","source","channel","MessageChannel","port1","port2","LogTypes","LOG_LEVELS","None","Warn","Log","Debug","STYLES_SUPPORTED","LOGGER_STYLES","methods","logger","prefix","ignoreDebugReset","style","originalPrefix","originalStyle","logType","setPrefix","newPrefix","setLevel","level","bindPrefix","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","loaded","__webpack_modules__","call","__webpack_exports__","O","chunkIds","priority","notFulfilled","Infinity","fulfilled","Object","keys","every","getter","__esModule","definition","defineProperty","enumerable","f","chunkId","miniCssF","globalThis","Function","obj","prop","hasOwnProperty","nmd","paths","children","scriptUrl","importScripts","location","document","currentScript","src","scripts","getElementsByTagName","replace","oldGetScript","oldLoadScript","queryMap","countMap","catch","retries","realSrc","request","setTimeout","cacheBust","Date","now","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","moreModules","runtime"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"crypto.worker.c66e4e0d76fa581af241.chunk.js","mappings":"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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/startup chunk dependencies","webpack://tweb/./src/config/debug.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/helpers/context.ts","webpack://tweb/./src/helpers/bytes/bufferConcats.ts","webpack://tweb/./src/lib/polyfill.ts","webpack://tweb/./src/helpers/bigInt/bigIntConstants.ts","webpack://tweb/./src/helpers/bigInt/bigIntConversion.ts","webpack://tweb/./src/helpers/bytes/bytesModPow.ts","webpack://tweb/./src/lib/crypto/cryptoMessagePort.ts","webpack://tweb/./src/lib/calls/helpers/getEmojisFingerprint.ts","webpack://tweb/./src/helpers/array/randomize.ts","webpack://tweb/./src/helpers/bytes/addPadding.ts","webpack://tweb/./src/helpers/bytes/bytesFromHex.ts","webpack://tweb/./src/helpers/bytes/convertToUint8Array.ts","webpack://tweb/./node_modules/@cryptography/aes/dist/es/aes.js","webpack://tweb/./src/helpers/bytes/bytesToWordss.ts","webpack://tweb/./src/lib/crypto/utils/aesIGE.ts","webpack://tweb/./src/helpers/bytes/bytesFromWordss.ts","webpack://tweb/./src/helpers/random.ts","webpack://tweb/./src/helpers/bigInt/bigIntRandom.ts","webpack://tweb/./src/lib/crypto/utils/factorize/BrentPollard.ts","webpack://tweb/./src/lib/crypto/subtle.ts","webpack://tweb/./src/lib/crypto/utils/aesCTR.ts","webpack://tweb/./src/lib/crypto/aesCtrUtils.ts","webpack://tweb/./src/lib/crypto/crypto.worker.ts","webpack://tweb/./src/lib/crypto/utils/sha1.ts","webpack://tweb/./src/lib/crypto/utils/sha256.ts","webpack://tweb/./src/lib/crypto/utils/pbkdf2.ts","webpack://tweb/./src/lib/crypto/utils/rsa.ts","webpack://tweb/./src/helpers/gzipUncompress.ts","webpack://tweb/./src/lib/crypto/srp.ts","webpack://tweb/./src/helpers/bytes/bytesToHex.ts","webpack://tweb/./src/helpers/bytes/bytesXor.ts","webpack://tweb/./src/lib/crypto/generateDh.ts","webpack://tweb/./src/lib/crypto/computeDhKey.ts","webpack://tweb/./src/helpers/listenMessagePort.ts","webpack://tweb/./src/lib/logger.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/compat get default export","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/node module decorator","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/importScripts chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn Promise.all([699,211,85].map(__webpack_require__.e, __webpack_require__)).then(next);\n};","/*\n * 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 './modes';\n\nexport const IS_BETA = process.env.NODE_ENV !== 'production';\nexport const DEBUG = (IS_BETA || Modes.debug)/* && false */;\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\nexport default DEBUG;\n\n// let m = DEBUG;\n/* if(!DEBUG) {\n ctx.sandpitTurtle = () => {\n //if(!m) {\n for(let i in MOUNT_CLASS_TO) {\n ctx[i] = MOUNT_CLASS_TO[i];\n }\n //m = true;\n //}\n\n //DEBUG = !DEBUG;\n };\n} */\n\n/* export const superDebug = (object: any, key: string) => {\n var d = object[key];\n var beforeStr = '', afterStr = '';\n for(var r of d) {\n beforeStr += r.before.hex + '\\n';\n afterStr += r.after.hex + '\\n';\n }\n\n beforeStr = beforeStr.trim();\n afterStr = afterStr.trim();\n //var beforeStr = d.map((r) => r.before.hex).join('\\n');\n //var afterStr = d.map((r) => r.after.hex).join('\\n');\n\n var dada = (name: string, str: string) => {\n var a = document.createElement('a');\n a.target = '_blank';\n a.download = name + '.txt';\n a.href = URL.createObjectURL(new Blob([str], {\n type: 'text/plain'\n }));\n document.body.append(a);\n a.click();\n };\n\n dada(key + '_' + 'before', beforeStr);\n dada(key + '_' + 'after', afterStr);\n}\n\nMOUNT_CLASS_TO.superDebug = superDebug; */\n","/*\n * 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 './ctx';\n\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\n\n// https://stackoverflow.com/a/58065241\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\n !(ctx as any).MSStream;\n\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 */;\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\n\nexport const IS_MOBILE = (navigator.maxTouchPoints === undefined || 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;\n","/*\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// ะฒ SW ะผะพะถะตั‚ ะฑั‹ั‚ัŒ ัั€ะฐะทัƒ ะดะฒะต ะฟะตั€ะตะผะตะฝะฝั‹ั… TRUE\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\n\nexport const getWindowClients = () => {\n return (self as any as ServiceWorkerGlobalScope)\n .clients\n .matchAll({includeUncontrolled: false, type: 'window'});\n};\n\nexport const getLastWindowClient = () => getWindowClients().then((windowClients) => windowClients.slice(-1)[0]);\n\nconst postMessage = (listener: WindowClient | DedicatedWorkerGlobalScope, ...args: any[]) => {\n try {\n // @ts-ignore\n listener.postMessage(...args);\n } catch(err) {\n console.error('[worker] postMessage error:', err, args);\n }\n};\n\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\n getWindowClients().then((listeners) => {\n if(!listeners.length) {\n // console.trace('no listeners?', self, listeners);\n return;\n }\n\n listeners.slice(all ? 0 : -1).forEach((listener) => {\n postMessage(listener, ...args);\n });\n });\n};\n\nconst notifyWorker = (...args: any[]) => {\n postMessage(self as any as DedicatedWorkerGlobalScope, ...args);\n};\n\nconst noop = () => {};\n\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\n","export default function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\n\n const tmp = new Uint8Array(length);\n\n let lastLength = 0;\n args.forEach((b) => {\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\n });\n\n return tmp/* .buffer */;\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 bufferConcats from '../helpers/bytes/bufferConcats';\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\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\ndeclare global {\n interface Uint8Array {\n concat: (...args: Array) => Uint8Array,\n // toString: () => string,\n toJSON: () => number[],\n // toJSON: () => {type: 'bytes', value: number[]},\n }\n\n interface Promise {\n finally: (onfinally?: () => void) => Promise;\n }\n}\n","import bigInt from 'big-integer';\n\nexport const safeBigInt = bigInt(Number.MAX_SAFE_INTEGER);\nexport const ulongBigInt = bigInt(bigInt[2]).pow(64);\nexport const longBigInt = ulongBigInt.divide(bigInt[2]);\n","import bigInt from 'big-integer';\nimport { longBigInt, ulongBigInt } from './bigIntConstants';\n\nexport function bigIntFromBytes(bytes: Uint8Array | number[], base = 256) {\n return bigInt.fromArray(bytes instanceof Uint8Array ? [...bytes] : bytes, base);\n}\n\nexport function bigIntToBytes(bigInt: bigInt.BigInteger) {\n return new Uint8Array(bigInt.toArray(256).value);\n}\n\nexport function bigIntToSigned(bigInt: bigInt.BigInteger) {\n return bigInt.greater(longBigInt) ? bigInt.minus(ulongBigInt) : bigInt;\n}\n\nexport function bigIntToUnsigned(bigInt: bigInt.BigInteger) {\n return bigInt.isNegative() ? ulongBigInt.add(bigInt) : bigInt;\n}\n","import {bigIntFromBytes, bigIntToBytes} from '../bigInt/bigIntConversion';\n\nexport default function bytesModPow(bytes: number[] | Uint8Array, exp: number[] | Uint8Array, mod: number[] | Uint8Array) {\n const bytesBigInt = bigIntFromBytes(bytes);\n const expBigInt = bigIntFromBytes(exp);\n const modBigInt = bigIntFromBytes(mod);\n const resBigInt = bytesBigInt.modPow(expBigInt, modBigInt);\n return bigIntToBytes(resBigInt);\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 {CryptoMethods} from './crypto_methods';\nimport SuperMessagePort from '../mtproto/superMessagePort';\nimport {Awaited} from '../../types';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {IS_WORKER} from '../../helpers/context';\n\ntype CryptoEvent = {\n invoke: (payload: {method: T, args: Parameters}) => ReturnType,\n port: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n terminate: () => void\n};\n\nexport class CryptoMessagePort extends SuperMessagePort {\n private lastIndex: number;\n\n constructor() {\n super('CRYPTO');\n this.lastIndex = -1;\n }\n\n public invokeCryptoNew({method, args, transfer}: {\n method: T,\n args: Parameters,\n transfer?: Transferable[]\n }): Promise>> {\n const payload = {method, args};\n const listeners = this.listeners['invoke'];\n if(listeners?.length) { // already in worker\n // try {\n // @ts-ignore\n let result: any = listeners[0].callback(payload);\n if(!IS_WORKER && !(result instanceof Promise)) {\n result = Promise.resolve(result);\n }\n\n return result;\n // } catch(err) {\n // return Promise.reject(err);\n // }\n }\n\n const sendPortIndex = method === 'aes-encrypt' || method === 'aes-decrypt' ?\n this.lastIndex = (this.lastIndex + 1) % this.sendPorts.length :\n 0;\n // @ts-ignore\n return this.invoke('invoke', payload, undefined, this.sendPorts[sendPortIndex], transfer);\n }\n\n public invokeCrypto(method: T, ...args: Parameters): Promise>> {\n return this.invokeCryptoNew({method, args});\n }\n}\n\nconst cryptoMessagePort = new CryptoMessagePort();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.cryptoMessagePort = cryptoMessagePort);\nexport default cryptoMessagePort;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cryptoWorker from '../../crypto/cryptoMessagePort';\nimport bigInt from 'big-integer';\n\nfunction readBigIntFromBytesBE(bytes: Uint8Array) {\n const length = bytes.length;\n const bits = length * 8;\n let value = bigInt(bytes[0]).and(0x7F).shiftLeft(bits - 8);\n for(let i = 1; i < length; ++i) {\n const _bits = bits - (i + 1) * 8;\n const b = bigInt(bytes[i]);\n value = value.or(_bits ? b.shiftLeft(_bits) : b);\n }\n\n return value;\n}\n\n// Emojis were taken from tdlib\nconst emojis = [\n '1f609', '1f60d', '1f61b', '1f62d', '1f631', '1f621', '1f60e',\n '1f634', '1f635', '1f608', '1f62c', '1f607', '1f60f', '1f46e',\n '1f477', '1f482', '1f476', '1f468', '1f469', '1f474', '1f475',\n '1f63b', '1f63d', '1f640', '1f47a', '1f648', '1f649', '1f64a',\n '1f480', '1f47d', '1f4a9', '1f525', '1f4a5', '1f4a4', '1f442',\n '1f440', '1f443', '1f445', '1f444', '1f44d', '1f44e', '1f44c',\n '1f44a', '270c', '270b', '1f450', '1f446', '1f447', '1f449',\n '1f448', '1f64f', '1f44f', '1f4aa', '1f6b6', '1f3c3', '1f483',\n '1f46b', '1f46a', '1f46c', '1f46d', '1f485', '1f3a9', '1f451',\n '1f452', '1f45f', '1f45e', '1f460', '1f455', '1f457', '1f456',\n '1f459', '1f45c', '1f453', '1f380', '1f484', '1f49b', '1f499',\n '1f49c', '1f49a', '1f48d', '1f48e', '1f436', '1f43a', '1f431',\n '1f42d', '1f439', '1f430', '1f438', '1f42f', '1f428', '1f43b',\n '1f437', '1f42e', '1f417', '1f434', '1f411', '1f418', '1f43c',\n '1f427', '1f425', '1f414', '1f40d', '1f422', '1f41b', '1f41d',\n '1f41c', '1f41e', '1f40c', '1f419', '1f41a', '1f41f', '1f42c',\n '1f40b', '1f410', '1f40a', '1f42b', '1f340', '1f339', '1f33b',\n '1f341', '1f33e', '1f344', '1f335', '1f334', '1f333', '1f31e',\n '1f31a', '1f319', '1f30e', '1f30b', '26a1', '2614', '2744', '26c4',\n '1f300', '1f308', '1f30a', '1f393', '1f386', '1f383', '1f47b',\n '1f385', '1f384', '1f381', '1f388', '1f52e', '1f3a5', '1f4f7',\n '1f4bf', '1f4bb', '260e', '1f4e1', '1f4fa', '1f4fb', '1f509',\n '1f514', '23f3', '23f0', '231a', '1f512', '1f511', '1f50e',\n '1f4a1', '1f526', '1f50c', '1f50b', '1f6bf', '1f6bd', '1f527',\n '1f528', '1f6aa', '1f6ac', '1f4a3', '1f52b', '1f52a', '1f48a',\n '1f489', '1f4b0', '1f4b5', '1f4b3', '2709', '1f4eb', '1f4e6',\n '1f4c5', '1f4c1', '2702', '1f4cc', '1f4ce', '2712', '270f',\n '1f4d0', '1f4da', '1f52c', '1f52d', '1f3a8', '1f3ac', '1f3a4',\n '1f3a7', '1f3b5', '1f3b9', '1f3bb', '1f3ba', '1f3b8', '1f47e',\n '1f3ae', '1f0cf', '1f3b2', '1f3af', '1f3c8', '1f3c0', '26bd',\n '26be', '1f3be', '1f3b1', '1f3c9', '1f3b3', '1f3c1', '1f3c7',\n '1f3c6', '1f3ca', '1f3c4', '2615', '1f37c', '1f37a', '1f377',\n '1f374', '1f355', '1f354', '1f35f', '1f357', '1f371', '1f35a',\n '1f35c', '1f361', '1f373', '1f35e', '1f369', '1f366', '1f382',\n '1f370', '1f36a', '1f36b', '1f36d', '1f36f', '1f34e', '1f34f',\n '1f34a', '1f34b', '1f352', '1f347', '1f349', '1f353', '1f351',\n '1f34c', '1f350', '1f34d', '1f346', '1f345', '1f33d', '1f3e1',\n '1f3e5', '1f3e6', '26ea', '1f3f0', '26fa', '1f3ed', '1f5fb',\n '1f5fd', '1f3a0', '1f3a1', '26f2', '1f3a2', '1f6a2', '1f6a4',\n '2693', '1f680', '2708', '1f681', '1f682', '1f68b', '1f68e',\n '1f68c', '1f699', '1f697', '1f695', '1f69b', '1f6a8', '1f694',\n '1f692', '1f691', '1f6b2', '1f6a0', '1f69c', '1f6a6', '26a0',\n '1f6a7', '26fd', '1f3b0', '1f5ff', '1f3aa', '1f3ad',\n '1f1ef-1f1f5', '1f1f0-1f1f7', '1f1e9-1f1ea', '1f1e8-1f1f3',\n '1f1fa-1f1f8', '1f1eb-1f1f7', '1f1ea-1f1f8', '1f1ee-1f1f9',\n '1f1f7-1f1fa', '1f1ec-1f1e7', '0031-20e3', '0032-20e3', '0033-20e3',\n '0034-20e3', '0035-20e3', '0036-20e3', '0037-20e3', '0038-20e3', '0039-20e3',\n '0030-20e3', '1f51f', '2757', '2753', '2665', '2666', '1f4af', '1f517',\n '1f531', '1f534', '1f535', '1f536', '1f537'\n];\n\nexport default async function getEmojisFingerprint(key: Uint8Array, g_a: Uint8Array) {\n const arr = key.concat(g_a);\n const hash = await cryptoWorker.invokeCrypto('sha256', arr);\n\n const result: [string, string, string, string] = [] as any;\n const emojisLength = emojis.length;\n\n const kPartSize = 8;\n for(let partOffset = 0; partOffset != hash.length; partOffset += kPartSize) {\n const bytes = hash.slice(partOffset, partOffset + kPartSize);\n const value = readBigIntFromBytesBE(bytes);\n const index = value.mod(emojisLength).toJSNumber();\n\n // const emoji = emojiFromCodePoints(emojis[index]);\n const codePoints = emojis[index];\n result.push(codePoints);\n }\n\n return result;\n}\n","export default function randomize(arr: T) {\n if(crypto && 'getRandomValues' in crypto) {\n crypto.getRandomValues(arr);\n } else {\n throw new Error('NO_SECURE_RANDOM');\n }\n\n return arr;\n}\n","import randomize from '../array/randomize';\nimport bufferConcats from './bufferConcats';\n\nexport default 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 randomize(padding);\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","export default function bytesFromHex(hexString: string) {\n const len = hexString.length;\n const bytes = new Uint8Array(Math.ceil(len / 2));\n let start = 0;\n\n if(len % 2) { // read 0x581 as 0x0581\n bytes[start++] = parseInt(hexString.charAt(0), 16);\n }\n\n for(let i = start; i < len; i += 2) {\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\n }\n\n return bytes;\n}\n","export default function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\n if(bytes instanceof Uint8Array) {\n return bytes;\n } else if(typeof(bytes) === 'string') {\n return new TextEncoder().encode(bytes);\n }\n\n return new Uint8Array(bytes);\n}\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","import convertToUint8Array from './convertToUint8Array';\n\nexport default function bytesToWordss(input: Parameters[0]) {\n const bytes = convertToUint8Array(input);\n\n const words: number[] = [];\n for(let i = 0, len = bytes.length; i < len; ++i) {\n words[i >>> 2] |= bytes[i] << (24 - (i % 4) * 8);\n }\n\n return new Uint32Array(words);\n}\n","import {IGE} from '@cryptography/aes';\nimport addPadding from '../../../helpers/bytes/addPadding';\nimport bytesFromWordss from '../../../helpers/bytes/bytesFromWordss';\nimport bytesToWordss from '../../../helpers/bytes/bytesToWordss';\n\nexport default function aesSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array, encrypt = true) {\n // console.log(dT(), 'AES start', bytes, keyBytes, ivBytes);\n\n const cipher = new IGE(bytesToWordss(keyBytes), bytesToWordss(ivBytes));\n const performedBytes = cipher[encrypt ? 'encrypt' : 'decrypt'](bytesToWordss(bytes));\n // console.log(dT(), 'AES finish');\n\n return bytesFromWordss(performedBytes);\n}\n\nexport function aesEncryptSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array) {\n return aesSync(addPadding(bytes), keyBytes, ivBytes, true);\n}\n\nexport function aesDecryptSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array) {\n return aesSync(bytes, keyBytes, ivBytes, false);\n}\n","export default function bytesFromWordss(input: Uint32Array) {\n const o = new Uint8Array(input.byteLength);\n for(let i = 0, length = input.length * 4; i < length; ++i) {\n o[i] = ((input[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);\n }\n\n return o;\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\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","import bigInt from 'big-integer';\nimport {nextRandomUint} from '../random';\n\nexport default function bigIntRandom(min: bigInt.BigNumber, max: bigInt.BigNumber) {\n return bigInt.randBetween(min, max, () => {\n return nextRandomUint(32) / 0xFFFFFFFF;\n /* const bits = 32;\n const randomBytes = new Uint8Array(bits / 8);\n crypto.getRandomValues(randomBytes);\n const r = bigIntFromBytes(randomBytes).mod(bigInt(2).pow(bits));\n return r.toJSNumber(); */\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// Thanks to https://xn--2-umb.com/09/12/brent-pollard-rho-factorisation/\n\nimport bigInt from 'big-integer';\nimport {bigIntFromBytes, bigIntToBytes} from '../../../../helpers/bigInt/bigIntConversion';\nimport bigIntRandom from '../../../../helpers/bigInt/bigIntRandom';\n\n// let test = 0;\nfunction BrentPollardFactor(n: bigInt.BigInteger) {\n const two = bigInt[2];\n if(n.remainder(two).isZero()) {\n return two;\n }\n\n const m = bigInt(1000);\n let a: bigInt.BigInteger,\n x: bigInt.BigInteger,\n y: bigInt.BigInteger,\n ys: bigInt.BigInteger,\n r: bigInt.BigInteger,\n q: bigInt.BigInteger,\n g: bigInt.BigInteger;\n do\n a = bigIntRandom(bigInt.one, n.minus(1));\n while(a.isZero() || a.eq(n.minus(two)));\n y = bigIntRandom(bigInt.one, n.minus(1));\n r = bigInt.one;\n q = bigInt.one;\n\n // if(!test++) {\n // a = bigInt(3);\n // y = bigInt(3);\n // }\n\n const bigIntUint64 = bigInt('FFFFFFFFFFFFFFFF', 16);\n const bigIntUint64MinusPqPlusOne = bigIntUint64.minus(n).plus(1);\n\n const performY = (y: bigInt.BigInteger) => {\n y = y.pow(two).mod(n);\n y = y.add(a);\n if(y.lesser(a)) { // it slows down the script\n y = y.add(bigIntUint64MinusPqPlusOne);\n }\n y = y.mod(n);\n return y;\n };\n\n do {\n x = y;\n for(let i = 0; bigInt(i).lesser(r); ++i) {\n y = performY(y);\n }\n\n let k = bigInt.zero;\n do {\n ys = y;\n const condition = bigInt.min(m, r.minus(k));\n for(let i = 0; bigInt(i).lesser(condition); ++i) {\n y = performY(y);\n q = q.multiply(x.greater(y) ? x.minus(y) : y.minus(x)).mod(n);\n }\n g = bigInt.gcd(q, n);\n k = k.add(m);\n } while(k.lesser(r) && g.eq(bigInt.one));\n\n r = r.shiftLeft(bigInt.one);\n } while(g.eq(bigInt.one));\n\n if(g.eq(n)) {\n do {\n ys = performY(ys);\n g = bigInt.gcd(x.minus(ys).abs(), n);\n } while(g.eq(bigInt.one));\n }\n\n return g;\n}\n\nfunction primeFactors(pqBytes: Uint8Array | number[]) {\n const n = bigIntFromBytes(pqBytes);\n\n const factors: bigInt.BigInteger[] = [];\n const primes: bigInt.BigInteger[] = [];\n\n let factor = BrentPollardFactor(n);\n factors.push(n.divide(factor));\n factors.push(factor);\n\n // return [factor];\n\n do {\n const m = factors.pop();\n\n if(m.eq(bigInt.one))\n continue;\n\n if(m.isPrime(true)) {\n primes.push(m);\n\n // Remove the prime from the other factors\n for(let i = 0; i < factors.length; ++i) {\n let k = factors[i];\n if(k.mod(m).isZero()) {\n do\n k = k.divide(m);\n while(k.mod(m).isZero());\n factors[i] = k;\n }\n }\n } else {\n // factor = m.lesser(100) ? bigInt(PollardRho(m.toJSNumber())) : this.brentPollardFactor(m);\n factor = BrentPollardFactor(m);\n factors.push(m.divide(factor));\n factors.push(factor);\n }\n } while(factors.length);\n\n return primes;\n}\n\nexport default function factorizeBrentPollardPQ(pqBytes: Uint8Array | number[]): [Uint8Array, Uint8Array] {\n let factors = primeFactors(pqBytes);\n factors.sort((a, b) => a.compare(b));\n if(factors.length > 2) {\n factors = [\n factors.splice(factors.length - 2, 1)[0],\n factors.reduce((acc, v) => acc.multiply(v), bigInt.one)\n ];\n }\n\n const p = factors[0], q = factors[factors.length - 1];\n return (p.lesser(q) ? [p, q] : [q, p]).map((b) => bigIntToBytes(b)) as any;\n}\n","const subtle = typeof(window) !== 'undefined' && 'crypto' in window ? window.crypto.subtle : self.crypto.subtle;\n\nexport default subtle;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {BigInteger} from 'big-integer';\nimport {bigIntFromBytes, bigIntToBytes} from '../../../helpers/bigInt/bigIntConversion';\nimport addPadding from '../../../helpers/bytes/addPadding';\nimport subtle from '../subtle';\n\nconst COUNTER_LENGTH = 16;\n\nexport default class CTR {\n private cryptoKey: CryptoKey;\n // private encLeft: Uint8Array;\n private leftLength: number;\n private mode: 'encrypt' | 'decrypt';\n private counter: BigInteger;\n private queue: {data: Uint8Array, resolve: (data: Uint8Array) => void}[];\n private releasing: boolean;\n\n constructor(mode: 'encrypt' | 'decrypt', cryptoKey: CryptoKey, counter: Uint8Array) {\n this.mode = mode;\n this.cryptoKey = cryptoKey;\n this.queue = [];\n this.counter = bigIntFromBytes(counter);\n }\n\n public async update(data: Uint8Array) {\n return new Promise((resolve) => {\n this.queue.push({data, resolve});\n this.release();\n });\n }\n\n private async release() {\n if(this.releasing) {\n return;\n }\n\n this.releasing = true;\n while(this.queue.length) {\n const {data, resolve} = this.queue.shift();\n resolve(await this._update(data));\n }\n this.releasing = false;\n }\n\n private async perform(data: Uint8Array) {\n const arrayBuffer: ArrayBuffer = await subtle[this.mode]({\n name: 'AES-CTR',\n counter: addPadding(bigIntToBytes(this.counter), COUNTER_LENGTH, true, true, true),\n length: 128\n },\n this.cryptoKey,\n data\n );\n\n return arrayBuffer;\n }\n\n private async _update(data: Uint8Array) {\n let toEncrypt = data;\n let head: Uint8Array/* , tail: Uint8Array */;\n if(this.leftLength) {\n // const leftLength = this.encLeft.byteLength;\n const leftLength = this.leftLength;\n const leftLength2 = COUNTER_LENGTH - leftLength;\n // const left = this.encLeft.concat(toEncrypt.slice(0, leftLength2));\n const left = (new Uint8Array(leftLength)).concat(toEncrypt.slice(0, leftLength2));\n\n const performed = await this.perform(left);\n\n head = new Uint8Array(performed.slice(leftLength));\n\n toEncrypt = toEncrypt.slice(leftLength2);\n\n this.counter = this.counter.add(1);\n }\n\n const tail = new Uint8Array(await this.perform(toEncrypt));\n\n const result = head ? head.concat(tail) : tail;\n\n let length = toEncrypt.length;\n const leftAfter = length % COUNTER_LENGTH;\n length -= leftAfter;\n\n const a = length / COUNTER_LENGTH;\n this.counter = this.counter.add(a);\n\n this.leftLength = leftAfter || undefined;\n // this.encLeft = leftAfter ? toEncrypt.slice(-leftAfter) : undefined;\n\n return result;\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 CTR from './utils/aesCTR';\nimport subtle from './subtle';\n\nconst aesCTRs: Map = new Map();\nlet lastCTRId = -1;\n\ntype K = {\n enc: CTR,\n dec: CTR,\n};\n\nexport async function aesCtrPrepare({encKey, encIv, decKey, decIv}: {[k in 'encKey' | 'encIv' | 'decKey' | 'decIv']: Uint8Array}) {\n const id = ++lastCTRId;\n\n const a = [['encrypt', encKey], ['decrypt', decKey]] as ['encrypt' | 'decrypt', Uint8Array][];\n const promises = a.map(([mode, key]) => {\n return subtle.importKey(\n 'raw',\n key,\n {name: 'AES-CTR'},\n false,\n [mode]\n )\n });\n\n const [encCryptoKey, decCryptoKey] = await Promise.all(promises);\n const enc = new CTR('encrypt', encCryptoKey, encIv.slice());\n const dec = new CTR('decrypt', decCryptoKey, decIv.slice());\n\n const k: K = {\n enc,\n dec\n };\n\n aesCTRs.set(id, k);\n\n return id;\n}\n\nexport async function aesCtrProcess({id, data, operation}: {id: number, data: Uint8Array, operation: 'encrypt' | 'decrypt'}) {\n const ctrs = aesCTRs.get(id);\n const result = await (operation === 'encrypt' ? ctrs.enc : ctrs.dec).update(data);\n return result;\n}\n\nexport function aesCtrDestroy(id: number) {\n aesCTRs.delete(id);\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 '../polyfill'; // just to include\n\nimport bytesModPow from '../../helpers/bytes/bytesModPow';\nimport gzipUncompress from '../../helpers/gzipUncompress';\nimport listenMessagePort from '../../helpers/listenMessagePort';\nimport getEmojisFingerprint from '../calls/helpers/getEmojisFingerprint';\nimport computeDhKey from './computeDhKey';\nimport cryptoMessagePort from './cryptoMessagePort';\nimport {CryptoMethods} from './crypto_methods';\nimport generateDh from './generateDh';\nimport computeSRP from './srp';\nimport {aesEncryptSync, aesDecryptSync} from './utils/aesIGE';\nimport factorizeBrentPollardPQ from './utils/factorize/BrentPollard';\nimport pbkdf2 from './utils/pbkdf2';\nimport rsaEncrypt from './utils/rsa';\nimport sha1 from './utils/sha1';\nimport sha256 from './utils/sha256';\nimport {aesCtrDestroy, aesCtrPrepare, aesCtrProcess} from './aesCtrUtils';\nimport ctx from '../../environment/ctx';\n\nconsole.log('CryptoWorker start');\n\nconst cryptoMethods: CryptoMethods = {\n 'sha1': sha1,\n 'sha256': sha256,\n 'pbkdf2': pbkdf2,\n 'aes-encrypt': aesEncryptSync,\n 'aes-decrypt': aesDecryptSync,\n 'rsa-encrypt': rsaEncrypt,\n 'factorize': factorizeBrentPollardPQ,\n // 'factorize-tdlib': factorizeTdlibPQ,\n // 'factorize-new-new': pqPrimeLeemonNew,\n 'mod-pow': bytesModPow,\n 'gzipUncompress': gzipUncompress,\n 'computeSRP': computeSRP,\n 'generate-dh': generateDh,\n 'compute-dh-key': computeDhKey,\n 'get-emojis-fingerprint': getEmojisFingerprint,\n 'aes-ctr-prepare': aesCtrPrepare,\n 'aes-ctr-process': aesCtrProcess,\n 'aes-ctr-destroy': aesCtrDestroy\n};\n\ncryptoMessagePort.addMultipleEventsListeners({\n invoke: ({method, args}) => {\n // @ts-ignore\n const result: any = cryptoMethods[method](...args);\n return result;\n },\n\n terminate: () => {\n ctx.close();\n }\n});\n\nif(typeof(MessageChannel) !== 'undefined') listenMessagePort(cryptoMessagePort, (source) => {\n const channel = new MessageChannel();\n cryptoMessagePort.attachPort(channel.port1);\n cryptoMessagePort.invokeVoid('port', undefined, source, [channel.port2]);\n});\n","import convertToUint8Array from '../../../helpers/bytes/convertToUint8Array';\nimport subtle from '../subtle';\n// import sha1 from '@cryptography/sha1';\n\nexport default function sha1(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","import convertToUint8Array from '../../../helpers/bytes/convertToUint8Array';\nimport subtle from '../subtle';\n// import sha256 from '@cryptography/sha256';\n\nexport default function sha256(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","import subtle from '../subtle';\n\nexport default async function 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 const 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","import type {RSAPublicKeyHex} from '../../mtproto/rsaKeysManager';\nimport bytesModPow from '../../../helpers/bytes/bytesModPow';\nimport bytesFromHex from '../../../helpers/bytes/bytesFromHex';\n\nexport default function rsaEncrypt(bytes: Uint8Array, publicKey: RSAPublicKeyHex) {\n return bytesModPow(bytes, bytesFromHex(publicKey.exponent), bytesFromHex(publicKey.modulus));\n}\n","// export function gzipUncompress(bytes: ArrayBuffer, toString: true): string;\n\n// @ts-ignore\nimport pako from 'pako/dist/pako_inflate.min.js';\n// import dT from './dT';\n\n// export function gzipUncompress(bytes: ArrayBuffer, toString?: false): Uint8Array;\nexport default 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\nimport cryptoWorker from './cryptoMessagePort';\nimport {AccountPassword, InputCheckPasswordSRP, PasswordKdfAlgo} from '../../layer';\nimport addPadding from '../../helpers/bytes/addPadding';\nimport bufferConcats from '../../helpers/bytes/bufferConcats';\nimport bytesXor from '../../helpers/bytes/bytesXor';\nimport convertToUint8Array from '../../helpers/bytes/convertToUint8Array';\nimport bigInt from 'big-integer';\nimport {bigIntFromBytes, bigIntToBytes} from '../../helpers/bigInt/bigIntConversion';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\n\nexport async function makePasswordHash(password: string, client_salt: Uint8Array, server_salt: Uint8Array) {\n // ! look into crypto_methods.test.ts\n let buffer = await cryptoWorker.invokeCrypto('sha256', bufferConcats(client_salt, new TextEncoder().encode(password), client_salt));\n buffer = bufferConcats(server_salt, buffer, server_salt);\n buffer = await cryptoWorker.invokeCrypto('sha256', buffer);\n\n let hash = await cryptoWorker.invokeCrypto('pbkdf2', new Uint8Array(buffer), client_salt, 100000);\n hash = bufferConcats(server_salt, hash, server_salt);\n\n buffer = await cryptoWorker.invokeCrypto('sha256', hash);\n\n return buffer;\n}\n\nexport default async function computeSRP(password: string, state: AccountPassword, isNew: boolean) {\n const algo = (isNew ? state.new_algo : state.current_algo) as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\n\n const p = bigIntFromBytes(algo.p);\n const g = bigInt(algo.g);\n\n /* if(B.compareTo(BigInteger.ZERO) < 0) {\n console.error('srp_B < 0')\n }\n\n if(B.compareTo(p) <= 0) {\n console.error('srp_B <= p');\n } */\n\n /* let check_prime_and_good = (bytes: any, g: number) => {\n let good_prime = 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b';\n\n if(bytesToHex(bytes) === good_prime && [3, 4, 5, 7].indexOf(g) !== -1) {\n return true;\n }\n\n // TO-DO check_prime_and_good_check\n }; */\n\n // check_prime_and_good(algo.p, g);\n\n const pw_hash = await makePasswordHash(password, algo.salt1, algo.salt2);\n const x = bigInt(bytesToHex(pw_hash), 16);\n\n const padArray = function(arr: number[] | Uint8Array, len: number) {\n if(!(arr instanceof Uint8Array)) {\n arr = convertToUint8Array(arr);\n }\n\n return addPadding(arr, len, true, true, true);\n };\n\n const v = g.modPow(x, p);\n\n const flipper = (arr: Uint8Array | number[]) => {\n const out = new Uint8Array(arr.length);\n for(let i = 0; i < arr.length; i += 4) {\n out[i] = arr[i + 3];\n out[i + 1] = arr[i + 2];\n out[i + 2] = arr[i + 1];\n out[i + 3] = arr[i];\n }\n\n return out;\n };\n\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password\n if(isNew) {\n const bytes = bigIntToBytes(v);\n return padArray(/* (isBigEndian ? bytes.reverse() : bytes) */bytes, 256);\n }\n\n const B = bigIntFromBytes(state.srp_B);\n\n const pForHash = padArray(bigIntToBytes(p), 256);\n const gForHash = padArray(bigIntToBytes(g), 256);\n const b_for_hash = padArray(bigIntToBytes(B), 256);\n\n const kHash = await cryptoWorker.invokeCrypto('sha256', bufferConcats(pForHash, gForHash));\n const k = bigIntFromBytes(kHash);\n\n const k_v = k.multiply(v).mod(p);\n\n const is_good_mod_exp_first = (modexp: bigInt.BigInteger, prime: bigInt.BigInteger) => {\n const diff = prime.subtract(modexp);\n const min_diff_bits_count = 2048 - 64;\n const max_mod_exp_size = 256;\n if(diff.isNegative() ||\n diff.bitLength().toJSNumber() < min_diff_bits_count ||\n modexp.bitLength().toJSNumber() < min_diff_bits_count ||\n Math.floor((modexp.bitLength().toJSNumber() + 7) / 8) > max_mod_exp_size)\n return false;\n return true;\n };\n\n const generate_and_check_random = async() => {\n while(true) {\n const a = bigIntFromBytes(flipper(state.secure_random));\n // const a = str2bigInt('9153faef8f2bb6da91f6e5bc96bc00860a530a572a0f45aac0842b4602d711f8bda8d59fb53705e4ae3e31a3c4f0681955425f224297b8e9efd898fec22046debb7ba8a0bcf2be1ada7b100424ea318fdcef6ccfe6d7ab7d978c0eb76a807d4ab200eb767a22de0d828bc53f42c5a35c2df6e6ceeef9a3487aae8e9ef2271f2f6742e83b8211161fb1a0e037491ab2c2c73ad63c8bd1d739de1b523fe8d461270cedcf240de8da75f31be4933576532955041dc5770c18d3e75d0b357df9da4a5c8726d4fced87d15752400883dc57fa1937ac17608c5446c4774dcd123676d683ce3a1ab9f7e020ca52faafc99969822717c8e07ea383d5fb1a007ba0d170cb', 16);\n\n const A = g.modPow(a, p);\n if(is_good_mod_exp_first(A, p)) {\n const a_for_hash = bigIntToBytes(A);\n\n const s = await cryptoWorker.invokeCrypto('sha256', bufferConcats(a_for_hash, b_for_hash));\n // const u = bigInt(s.hex, 16);\n const u = bigIntFromBytes(s);\n if(!u.isZero() && !u.isNegative())\n return {a, a_for_hash, u};\n }\n }\n }\n\n const {a, a_for_hash, u} = await generate_and_check_random();\n\n let g_b: bigInt.BigInteger;\n if(!B.greater(k_v)) {\n g_b = B.add(p);\n } else g_b = B;\n g_b = g_b.subtract(k_v).mod(p);\n\n const ux = u.multiply(x);\n const a_ux = a.add(ux);\n const S = g_b.modPow(a_ux, p);\n\n const K = await cryptoWorker.invokeCrypto('sha256', padArray(bigIntToBytes(S), 256));\n\n let h1 = await cryptoWorker.invokeCrypto('sha256', pForHash);\n const h2 = await cryptoWorker.invokeCrypto('sha256', gForHash);\n h1 = bytesXor(h1, h2);\n\n const buff = bufferConcats(\n h1,\n await cryptoWorker.invokeCrypto('sha256', algo.salt1),\n await cryptoWorker.invokeCrypto('sha256', algo.salt2),\n a_for_hash,\n b_for_hash,\n K\n );\n\n const M1 = await cryptoWorker.invokeCrypto('sha256', buff);\n\n const out: InputCheckPasswordSRP.inputCheckPasswordSRP = {\n _: 'inputCheckPasswordSRP',\n srp_id: state.srp_id,\n A: new Uint8Array(a_for_hash),\n M1\n };\n\n return out;\n}\n","export default function bytesToHex(bytes: ArrayLike) {\n const length = bytes.length;\n const arr: string[] = new Array(length);\n for(let i = 0; i < length; ++i) {\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\n }\n return arr.join('');\n}\n","export default function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\n const len = bytes1.length;\n const bytes = new Uint8Array(len);\n\n for(let i = 0; i < len; ++i) {\n bytes[i] = bytes1[i] ^ bytes2[i];\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\nimport type CallInstance from '../calls/callInstance';\nimport type {MessagesDhConfig} from '../../layer';\nimport bigInt from 'big-integer';\nimport randomize from '../../helpers/array/randomize';\nimport {bigIntFromBytes} from '../../helpers/bigInt/bigIntConversion';\nimport addPadding from '../../helpers/bytes/addPadding';\nimport bytesFromHex from '../../helpers/bytes/bytesFromHex';\nimport cryptoWorker from './cryptoMessagePort';\n\nexport default async function generateDh(dhConfig: MessagesDhConfig.messagesDhConfig) {\n const {p, g} = dhConfig;\n\n const generateA = (p: Uint8Array) => {\n for(;;) {\n const a = randomize(new Uint8Array(p.length));\n // const a = new Uint8Array(4).randomize();\n\n const aBigInt = bigIntFromBytes(a); // str2bigInt(bytesToHex(a), 16);\n if(!aBigInt.greater(bigInt.one)) {\n continue;\n }\n\n const pBigInt = bigIntFromBytes(p); // str2bigInt(bytesToHex(p), 16);\n if(!aBigInt.lesser(pBigInt.subtract(bigInt.one))) {\n continue;\n }\n\n return a;\n }\n };\n\n const a = generateA(p);\n // const a = new Uint8Array([0]);\n\n const gBytes = bytesFromHex(g.toString(16));\n const g_a = addPadding(await cryptoWorker.invokeCrypto('mod-pow', gBytes, a, p), 256, true, true, true);\n const g_a_hash = await cryptoWorker.invokeCrypto('sha256', g_a);\n\n const dh: CallInstance['dh'] = {\n a: a,\n g_a: g_a,\n g_a_hash: g_a_hash,\n p\n };\n\n return dh;\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 {bigIntFromBytes, bigIntToSigned} from '../../helpers/bigInt/bigIntConversion';\nimport cryptoWorker from './cryptoMessagePort';\n\nexport default async function computeDhKey(g_b: Uint8Array, a: Uint8Array, p: Uint8Array) {\n const key = await cryptoWorker.invokeCrypto('mod-pow', g_b, a, p);\n const keySha1Hashed = await cryptoWorker.invokeCrypto('sha1', key);\n const key_fingerprint = keySha1Hashed.slice(-8).reverse();\n const key_fingerprint_long = bigIntToSigned(bigIntFromBytes(key_fingerprint)).toString(10);\n\n return {key, key_fingerprint: key_fingerprint_long};\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 SuperMessagePort from '../lib/mtproto/superMessagePort';\nimport ctx from '../environment/ctx';\n\nexport default function listenMessagePort(\n messagePort: SuperMessagePort,\n onConnect?: (source: MessageEventSource) => void,\n onDisconnect?: (source: MessageEventSource) => void\n) {\n const attachPort = (listenPort: any, sendPort: any) => {\n messagePort.attachListenPort(listenPort);\n sendPort && messagePort.attachSendPort(sendPort);\n onConnect?.(listenPort);\n };\n\n messagePort.setOnPortDisconnect(onDisconnect);\n\n if(typeof(SharedWorkerGlobalScope) !== 'undefined') {\n (ctx as any as SharedWorkerGlobalScope).addEventListener('connect', (e) => attachPort(e.source, e.source));\n } else if(typeof(ServiceWorkerGlobalScope) !== 'undefined') {\n attachPort(ctx, null);\n } else {\n attachPort(ctx, ctx);\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 DEBUG from '../config/debug';\nimport {IS_FIREFOX, IS_SAFARI} from '../environment/userAgent';\nimport {IS_SERVICE_WORKER, IS_WEB_WORKER} from '../helpers/context';\nimport dT from '../helpers/dT';\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 IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\n// let getCallerFunctionNameFromLine: (line: string) => string;\n// if(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;\n// const LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\n// function 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 group(...args: any[]): void;\n groupCollapsed(...args: any[]): void;\n groupEnd(...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' */ | 'group' | 'groupCollapsed' | 'groupEnd', 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 ['group', LogTypes.Log],\n ['groupCollapsed', LogTypes.Log],\n ['groupEnd', 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 const 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","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [699,211,85], () => (__webpack_require__(6991)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames not based on template\n\tif (chunkId === 85) return \"85.887945ef5f43bc205112.bundle.js\";\n\t// return url for filenames based on template\n\treturn \"\" + {\"211\":\"npm.big-integer\",\"699\":\"npm.pako\"}[chunkId] + \".\" + {\"211\":\"363d763daad0ee4e2741\",\"699\":\"89deb457201f16c93925\"}[chunkId] + \".chunk.js\";\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = {};\n var countMap = {};\n var getRetryDelay = function () {\n return 3000;\n };\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result +\n (queryMap.hasOwnProperty(chunkId) ? '?' + queryMap[chunkId] : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.hasOwnProperty(chunkId)\n ? countMap[chunkId]\n : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n var retryAttempt = 999999 - retries + 1;\n setTimeout(function () {\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap[chunkId] = cacheBust;\n countMap[chunkId] = retries - 1;\n resolve(__webpack_require__.e(chunkId));\n }, getRetryDelay(retryAttempt));\n });\n });\n };\n }\n})();\n","// no baseURI\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t589: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","next","DEBUG","MOUNT_CLASS_TO","window","self","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","IS_FIREFOX","undefined","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","IS_WEB_WORKER","WorkerGlobalScope","IS_WORKER","postMessage","listener","args","err","console","error","notifyServiceWorker","all","clients","matchAll","includeUncontrolled","type","then","listeners","length","slice","forEach","bind","bufferConcats","reduce","acc","v","byteLength","tmp","Uint8Array","lastLength","b","set","ArrayBuffer","prototype","concat","this","toJSON","Promise","finally","fn","onFinally","callback","resolve","result","reason","reject","Number","MAX_SAFE_INTEGER","pow","longBigInt","divide","bigIntFromBytes","bytes","base","bigIntToBytes","bigInt","toArray","value","bytesModPow","exp","mod","bytesBigInt","expBigInt","modBigInt","modPow","CryptoMessagePort","constructor","super","lastIndex","invokeCryptoNew","method","transfer","payload","sendPortIndex","sendPorts","invoke","invokeCrypto","cryptoMessagePort","readBigIntFromBytesBE","bits","and","shiftLeft","i","_bits","or","emojis","randomize","arr","crypto","Error","getRandomValues","addPadding","blockSize","zeroes","blockSizeAsTotalLength","prepend","len","needPadding","padding","buffer","bytesFromHex","hexString","Math","ceil","start","parseInt","charAt","substr","convertToUint8Array","TextEncoder","encode","S","Si","T1","Uint32Array","T2","T3","T4","T5","T6","T7","T8","getWords","key","buf","pos","str","charCodeAt","xor","left","right","to","x2","x4","s","tEnc","tDec","d","t","x","xInv","computeTables","AES","_key","encKey","decKey","rcon","j","encrypt","_message","a2","b2","c2","message","out","a","c","rounds","k","decrypt","AES_IGE","iv","cipher","text","cipherText","prevX","subarray","prevY","yXOR","y","bytesToWordss","input","words","aesSync","keyBytes","ivBytes","o","bytesFromWordss","counter","offset","incrementCounter","carry","arrays","Uint16Array","bigIntRandom","min","max","array","nextRandomUint","BrentPollardFactor","n","two","remainder","isZero","m","ys","r","q","g","minus","eq","bigIntUint64MinusPqPlusOne","plus","performY","add","lesser","condition","multiply","greater","abs","subtle","CTR","mode","cryptoKey","queue","update","data","push","release","releasing","shift","_update","perform","name","head","toEncrypt","leftLength","leftLength2","performed","tail","leftAfter","aesCTRs","Map","lastCTRId","log","cryptoMethods","salt","iterations","importKey","hash","publicKey","exponent","modulus","pqBytes","factors","primes","factor","pop","isPrime","primeFactors","sort","compare","splice","p","map","toString","password","state","isNew","algo","new_algo","current_algo","pw_hash","client_salt","server_salt","makePasswordHash","salt1","salt2","Array","join","bytesToHex","padArray","flipper","B","srp_B","pForHash","gForHash","b_for_hash","k_v","is_good_mod_exp_first","modexp","prime","diff","subtract","isNegative","bitLength","toJSNumber","floor","a_for_hash","u","secure_random","A","generate_and_check_random","g_b","ux","a_ux","K","h1","bytes1","bytes2","bytesXor","buff","M1","_","srp_id","dhConfig","aBigInt","pBigInt","generateA","gBytes","g_a","g_a_hash","key_fingerprint","reverse","emojisLength","partOffset","index","codePoints","encIv","decIv","id","promises","encCryptoKey","decCryptoKey","enc","dec","operation","ctrs","get","delete","terminate","ctx","messagePort","onConnect","onDisconnect","attachPort","listenPort","sendPort","attachListenPort","attachSendPort","setOnPortDisconnect","listenMessagePort","e","source","channel","MessageChannel","port1","port2","LogTypes","LOG_LEVELS","None","Warn","Log","Debug","STYLES_SUPPORTED","LOGGER_STYLES","methods","logger","prefix","ignoreDebugReset","style","originalPrefix","originalStyle","logType","setPrefix","newPrefix","setLevel","level","bindPrefix","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","loaded","__webpack_modules__","call","__webpack_exports__","O","chunkIds","priority","notFulfilled","Infinity","fulfilled","Object","keys","every","getter","__esModule","definition","defineProperty","enumerable","f","chunkId","miniCssF","globalThis","Function","obj","prop","hasOwnProperty","nmd","paths","children","scriptUrl","importScripts","location","document","currentScript","src","scripts","getElementsByTagName","replace","oldGetScript","oldLoadScript","queryMap","countMap","catch","retries","realSrc","request","setTimeout","cacheBust","Date","now","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","moreModules","runtime"],"sourceRoot":""} \ No newline at end of file diff --git a/public/index.html b/public/index.html index 1b262320..08800b58 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.57462bdb2faa73d01185.css.map b/public/main.57462bdb2faa73d01185.css.map deleted file mode 100644 index 97075c4a..00000000 --- a/public/main.57462bdb2faa73d01185.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"main.57462bdb2faa73d01185.css","mappings":"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","sources":["webpack://tweb/./src/materialize.scss","webpack://tweb/./src/scss/style.scss"],"sourcesContent":["/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;line-height:1.15}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{-webkit-text-decoration-skip:objects;background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted currentColor;text-decoration:underline dotted currentColor}b,strong{font-weight:inherit;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:-.25em}sup{top:-.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}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-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}[hidden],template{display:none}html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}ul:not(.browser-default){list-style-type:none;padding-left:0}ul:not(.browser-default)>li{list-style-type:none}a{-webkit-tap-highlight-color:rgba(0,0,0,0)}button{background:none;border:none;cursor:pointer;outline:none;padding:0}img,video{-webkit-user-drag:none}.valign-wrapper{align-items:center;display:flex}.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;user-select:none}.no-transition,.no-transition:after,.no-transition:before{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{left:50%;position:absolute!important;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-wrap{white-space:nowrap!important}.no-border-radius{border-radius:0!important}.disable-hover{pointer-events:none!important}.reflect-x{transform:scaleX(-1)}[dir=auto]{unicode-bidi:plaintext}.is-rtl [dir=auto]{direction:inherit}a{text-decoration:none}html{font-weight:400;line-height:1.5}h1,h2,h3,h4,h5,h6{line-height:1.3}em{font-style:italic}strong{font-weight:500}small{font-size:75%}code,pre{word-wrap:break-word;white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap}",":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:.2s ease-in-out;--btn-menu-transition:.2s cubic-bezier(.4,0,.2,1);--esg-transition:var(--btn-menu-transition);--input-transition:.2s ease-out;--sticker-viewer-open-transition-in:.2s var(--transition-standard-easing);--sticker-viewer-open-transition-out:.2s var(--transition-standard-easing);--sticker-viewer-switch-transition:.2s cubic-bezier(.12,1.1,.56,1.2);--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:.25s cubic-bezier(.35,.35,.47,1.34);--chatlist-badge-transition-out:.25s 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) + 0.5rem)*-1);--message-time-background:rgba(0,0,0,.35);--message-highlightning-color:rgba(109,141,65,.4);--messages-container-width:728px;--messages-text-size:16px;--messages-line-height:1.3125;--messages-secondary-text-size:calc(var(--messages-text-size) - 2px);--messages-secondary-line-height:calc(var(--messages-secondary-text-size) + 4px);--messages-time-text-size:calc(var(--messages-text-size) - 4px);--messages-service-text-size:calc(var(--messages-text-size) - 1px);--messages-custom-emoji-size:calc(var(--messages-text-size) + 4px);--bubble-transition-in:transform var(--transition-standard-in),opacity var(--transition-standard-in);--bubble-transition-out:transform var(--transition-standard-out),opacity var(--transition-standard-out);--line-height-20:26px;--line-height-16:21px;--line-height-14:18px;--line-height-12:16px;--line-height:1.3125;--font-size-20:20px;--font-size-16:16px;--font-size-14:14px;--font-size-12:12px;--font-size:var(--font-size-16);--esg-sticker-size:72px;--esg-custom-emoji-size:36px;--popup-sticker-size:80px;--disabled-opacity:.3;--round-video-size:280px;--menu-box-shadow:0px 0px 10px var(--menu-box-shadow-color);--menu-backdrop-filter:blur(50px);--font-monospace:\"Roboto Mono\",monospace;--font-weight-bold:500;--font-weight-normal:400;--selection-background-color:rgba(var(--primary-color-rgb),.4);--selection-color:inherit;--topbar-floating-scaleX:1;--topbar-call-height:3rem;--topbar-floating-call-height:0px;--call-button-size:3.375rem;--call-button-margin:2rem;--custom-emoji-size:1.25rem;--esg-width:100%;--peer-avatar-red-top:#ff845e;--peer-avatar-red-bottom:#d45246;--peer-avatar-orange-top:#febb5b;--peer-avatar-orange-bottom:#f68136;--peer-avatar-violet-top:#b694f9;--peer-avatar-violet-bottom:#6c61df;--peer-avatar-green-top:#9ad164;--peer-avatar-green-bottom:#46ba43;--peer-avatar-cyan-top:#53edd6;--peer-avatar-cyan-bottom:#28c9b7;--peer-avatar-blue-top:#5bcbe3;--peer-avatar-blue-bottom:#359ad4;--peer-avatar-pink-top:#ff8aac;--peer-avatar-pink-bottom:#d95574;--peer-avatar-archive-top:#b8c2cc;--peer-avatar-archive-bottom:#9eaab5;--peer-avatar-saved-top:var(--light-filled-saved-color);--peer-avatar-saved-bottom:var(--saved-color);--avatar-color-top:var(--peer-avatar-saved-top);--avatar-color-bottom:var(--peer-avatar-saved-bottom);--avatar-border-radius-forum:37%;--premium-gradient:linear-gradient(52.62deg,#6b93ff 12.22%,#976fff 50.25%,#e46ace 98.83%)}@media only screen and (max-width:600px){:root{--right-column-width:100vw;--esg-sticker-size:68px;--popup-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:420px;--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-height:570px)and (min-width:601px){:root{--esg-width:23.875rem}}@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;--scrollbar-color:rgba(0,0,0,.2);--section-box-shadow-color:rgba(0,0,0,.06);--menu-box-shadow-color:rgba(0,0,0,.15);--input-search-background-color:#fff;--input-search-border-color:#dfe1e5;--secondary-color:#c4c9cc;--avatar-online-color:var(--primary-color);--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;--monospace-text-color:var(--danger-color);--backdrop-opacity:.85;--menu-background-color:rgba(var(--surface-color-rgb),var(--backdrop-opacity));--message-background-color:var(--surface-color);--message-time-color:var(--secondary-text-color);--message-checkbox-color:#61c642;--message-checkbox-border-color:#fff;--message-primary-color:var(--primary-color);--light-filled-message-primary-color:var(--light-filled-primary-color);--message-secondary-color:var(--secondary-color);--message-error-color:var(--danger-color);--message-out-link-color:var(--link-color);--message-out-status-color:var(--message-out-primary-color);--message-out-time-color:var(--message-out-status-color);--message-out-audio-play-button-color:#fff;--message-out-selection-background-color:var(--selection-background-color);--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:#aaa;--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;--scrollbar-color:hsla(0,0%,100%,.2);--section-box-shadow-color:rgba(0,0,0,.12);--input-search-background-color:#181818;--input-search-border-color:#2f2f2f;--secondary-color:#707579;--avatar-online-color:var(--primary-color);--chatlist-status-color:var(--primary-color);--chatlist-pinned-color:var(--secondary-color);--badge-text-color:#fff;--link-color:var(--primary-color);--ripple-color:hsla(0,0%,100%,.08);--poll-circle-color:#fff;--spoiler-background-color:#373e4e;--spoiler-draft-background-color:#484848;--monospace-text-color:var(--primary-text-color);--menu-background-color:rgba(var(--surface-color-rgb),.75);--message-background-color:var(--surface-color);--message-time-color:var(--secondary-text-color);--message-checkbox-color:var(--primary-color);--message-checkbox-border-color:#fff;--message-secondary-color:var(--secondary-color);--message-error-color:#fff;--message-out-link-color:#fff;--message-out-status-color:#fff;--message-out-time-color:hsla(0,0%,100%,.6);--message-out-audio-play-button-color:var(--message-out-background-color);--message-out-selection-background-color:rgba(var(--surface-color-rgb),.4)}@font-face{font-display:block;font-family:tgico;font-style:normal;font-weight:400;src:url(assets/fonts/tgico.ttf?ivbp49) format(\"truetype\"),url(assets/fonts/tgico.woff?ivbp49) format(\"woff\"),url(assets/fonts/tgico.svg?ivbp49#tgico) format(\"svg\")}.tgico:after,.tgico:before,[class*=\" tgico-\"]:after,[class*=\" tgico-\"]:before,[class^=tgico-]{speak:never;font-feature-settings:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:tgico!important;font-style:normal;font-variant:normal;font-weight:400;line-height:1;text-transform:none}.tgico-check:before{content:\"๎ค€\"}.tgico-checks:before{content:\"๎ค\"}.tgico-activesessions:before{content:\"๎ค‚\"}.tgico-add:before{content:\"๎คƒ\"}.tgico-add_reaction: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-audio_repeat:before{content:\"๎คŽ\"}.tgico-audio_repeat_single:before{content:\"๎ค\"}.tgico-avatarnext:before{content:\"๎ค\"}.tgico-avatarprevious:before{content:\"๎ค‘\"}.tgico-binfilled: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-card:before{content:\"๎คœ\"}.tgico-card_outline: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:before{content:\"๎คฑ\"}.tgico-delete_filled: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-fast_forward:before{content:\"๎ฅƒ\"}.tgico-fast_rewind:before{content:\"๎ฅ„\"}.tgico-favourites:before{content:\"๎ฅ…\"}.tgico-flag:before{content:\"๎ฅ†\"}.tgico-flip:before{content:\"๎ฅ‡\"}.tgico-folder:before{content:\"๎ฅˆ\"}.tgico-fontsize:before{content:\"๎ฅ‰\"}.tgico-forward:before{content:\"๎ฅŠ\"}.tgico-forward_filled: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-groupmedia:before{content:\"๎ฅ‘\"}.tgico-groupmediaoff:before{content:\"๎ฅ’\"}.tgico-help:before{content:\"๎ฅ“\"}.tgico-hide: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-limit_chat:before{content:\"๎ฅŸ\"}.tgico-limit_chats:before{content:\"๎ฅ \"}.tgico-limit_file:before{content:\"๎ฅก\"}.tgico-limit_folders:before{content:\"๎ฅข\"}.tgico-limit_link:before{content:\"๎ฅฃ\"}.tgico-limit_pin: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-mediaspoiler:before{content:\"๎ฅฎ\"}.tgico-mediaspoileroff:before{content:\"๎ฅฏ\"}.tgico-mention:before{content:\"๎ฅฐ\"}.tgico-menu:before{content:\"๎ฅฑ\"}.tgico-message:before{content:\"๎ฅฒ\"}.tgico-messageunread:before{content:\"๎ฅณ\"}.tgico-microphone:before{content:\"๎ฅด\"}.tgico-microphone_crossed:before{content:\"๎ฅต\"}.tgico-microphone_crossed_filled:before{content:\"๎ฅถ\"}.tgico-microphone_filled: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-pip:before{content:\"๎ฆŒ\"}.tgico-play:before{content:\"๎ฆ\"}.tgico-playback_05:before{content:\"๎ฆŽ\"}.tgico-playback_15:before{content:\"๎ฆ\"}.tgico-playback_1x:before{content:\"๎ฆ\"}.tgico-playback_2x:before{content:\"๎ฆ‘\"}.tgico-plus:before{content:\"๎ฆ’\"}.tgico-poll:before{content:\"๎ฆ“\"}.tgico-premium_addone:before{content:\"๎ฆ”\"}.tgico-premium_double:before{content:\"๎ฆ•\"}.tgico-premium_lock:before{content:\"๎ฆ–\"}.tgico-premium_unlock:before{content:\"๎ฆ—\"}.tgico-previous:before{content:\"๎ฆ˜\"}.tgico-radiooff:before{content:\"๎ฆ™\"}.tgico-radioon:before{content:\"๎ฆš\"}.tgico-reactions:before{content:\"๎ฆ›\"}.tgico-readchats:before{content:\"๎ฆœ\"}.tgico-recent:before{content:\"๎ฆ\"}.tgico-replace:before{content:\"๎ฆž\"}.tgico-reply:before{content:\"๎ฆŸ\"}.tgico-reply_filled:before{content:\"๎ฆ \"}.tgico-rightpanel:before{content:\"๎ฆก\"}.tgico-rotate_left:before{content:\"๎ฆข\"}.tgico-rotate_right: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:before{content:\"๎ฆฎ\"}.tgico-settings_filled:before{content:\"๎ฆฏ\"}.tgico-sharescreen_filled:before{content:\"๎ฆฐ\"}.tgico-shipping:before{content:\"๎ฆฑ\"}.tgico-shuffle:before{content:\"๎ฆฒ\"}.tgico-smallscreen:before{content:\"๎ฆณ\"}.tgico-smile:before{content:\"๎ฆด\"}.tgico-spoiler:before{content:\"๎ฆต\"}.tgico-sport:before{content:\"๎ฆถ\"}.tgico-star:before{content:\"๎ฆท\"}.tgico-stickers:before{content:\"๎ฆธ\"}.tgico-stickers_face:before{content:\"๎ฆน\"}.tgico-stop:before{content:\"๎ฆบ\"}.tgico-strikethrough:before{content:\"๎ฆป\"}.tgico-textedit:before{content:\"๎ฆผ\"}.tgico-tip:before{content:\"๎ฆฝ\"}.tgico-tools:before{content:\"๎ฆพ\"}.tgico-topics: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:before{content:\"๎งˆ\"}.tgico-videocamera_crossed_filled:before{content:\"๎ง‰\"}.tgico-videocamera_filled:before{content:\"๎งŠ\"}.tgico-videochat:before{content:\"๎ง‹\"}.tgico-volume_down:before{content:\"๎งŒ\"}.tgico-volume_mute:before{content:\"๎ง\"}.tgico-volume_off:before{content:\"๎งŽ\"}.tgico-volume_up:before{content:\"๎ง\"}.tgico-zoomin:before{content:\"๎ง\"}.tgico-zoomout:before{content:\"๎ง‘\"}.tgico-phone_filled:before{content:\"๎คฟ\";transform:rotate(-135deg)}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;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-display:swap;font-family:Roboto;font-style:normal;font-weight:400;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-display:swap;font-family:Roboto;font-style:normal;font-weight:400;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-display:swap;font-family:Roboto;font-style:normal;font-weight:500;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-display:swap;font-family:Roboto;font-style:normal;font-weight:500;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-display:swap;font-family:Roboto;font-style:normal;font-weight:500;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-display:swap;font-family:Roboto;font-style:normal;font-weight:600;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-display:swap;font-family:Roboto;font-style:normal;font-weight:600;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-display:swap;font-family:Roboto;font-style:normal;font-weight:600;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-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-Ulco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ulco8VkA.woff2) format(\"woff2\");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-Ulco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ulco8VkA.woff2) format(\"woff2\");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0me8iUI0.woff2) format(\"woff2\");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0me8iUI0.woff2) format(\"woff2\");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}.input-wrapper{margin:0 auto;width:360px}.input-field{--height:54px;--border-radius:10px;position:relative}@media only screen and (max-width:600px){.input-field{--height:50px}}.input-field .arrow-down{border:solid var(--secondary-text-color);border-radius:1px;border-width:0 2px 2px 0;bottom:0;content:\" \";cursor:pointer;display:inline-block;height:0;margin-top:-9px;padding:5px;position:absolute;right:21px;top:50%;transform:rotate(45deg);-webkit-transform:rotate(45deg);transition:all .2s;vertical-align:middle;width:0;z-index:2}[dir=ltr] .input-field label{left:1rem}[dir=rtl] .input-field label{right:1rem}.input-field label{background-color:var(--surface-color);color:#9e9e9e;height:1.5rem;margin-top:calc((var(--height) - 1.5rem)/2);pointer-events:none;position:absolute;right:auto;top:0;transform:translate(0);transform-origin:left center;-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap;z-index:2}.is-rtl .input-field label{transform-origin:right center}body.animation-level-2 .input-field label{transition:transform .2s,padding .2s,opacity .1s,font-weight 0s .1s}.input-field-border{border:2px solid var(--primary-color);border-radius:var(--border-radius);bottom:0;left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:0;z-index:1}body.animation-level-2 .input-field-border{transition:opacity .2s}.input-field-icon{border-radius:.375rem;height:1.5rem;pointer-events:none;position:absolute;right:1rem;top:50%;transform:translateY(-50%);width:1.5rem;z-index:1}.input-field-input{--padding:1rem;--padding-horizontal:1rem;--border-width:1px;background-color:var(--surface-color);border:var(--border-width) solid var(--input-search-border-color);border-radius:var(--border-radius);box-sizing:border-box;line-height:var(--line-height);min-height:var(--height);padding:calc(var(--padding) - var(--border-width)) calc(var(--padding-horizontal) - var(--border-width));position:relative;transition:border-color 0s;width:100%;z-index:1}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:active,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:hover{-webkit-box-shadow:0 0 0 1000px var(--surface-color) inset}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:active,.input-field-input:-webkit-autofill:first-line,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:hover{color:var(--primary-text-color)!important;font-family:Roboto,-apple-system,apple color emoji,BlinkMacSystemFont,Segoe UI,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif!important;font-size:1rem!important}@media only screen and (max-width:600px){.input-field-input{--padding:.9375rem;--padding-horizontal:.9375rem}}body.animation-level-0 .input-field-input{transition:none!important}html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid),html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid){border-color:var(--primary-color);transition:border-color .2s}html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid)~label,html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid)~label{color:var(--primary-color)}.input-field-input:focus{border-color:var(--primary-color)}.input-field-input.error{border-color:var(--danger-color)}.input-field-input.error~label{color:var(--danger-color)!important}.input-field-input.error~.input-field-border{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{border-color:var(--primary-color);margin-top:-4px;transform:rotate(225deg)}.input-field-input:focus~label{color:var(--primary-color);font-weight:var(--font-weight-bold)}.input-field-input:focus~.input-field-border{opacity:1}.input-field-input:disabled~label,.input-field-input:focus~label,.input-field-input:not(:empty)~label,.input-field-input:valid~label{opacity:1;padding:0 .3125rem;transform:translate(-.1875rem,calc(var(--height)/-2 + .0625rem)) scale(.75)}.input-field-input-fake{bottom:auto!important;height:auto!important;left:0;opacity:0;pointer-events:none;position:absolute!important;right:auto!important;top:0;z-index:-3}.input-fields-row{display:flex}.input-fields-row .input-field{flex:1 1 auto;width:1%}.input-wrapper>*+*{margin-top:1.5rem}::-moz-placeholder{color:#909192;opacity:1}::placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192}::-ms-input-placeholder{color:#909192}button:focus,input:focus{outline:none}.input-clear{border:none;outline:none;padding:0}body.animation-level-0 .input-clear.error{color:var(--danger-color)!important}body:not(.animation-level-0) .input-clear.error{animation:input-shake .2s ease-in-out forwards}@keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-.5rem)}75%{transform:translateX(.5rem)}to{transform:translateX(0)}}.input-search{--border-radius:22px;margin-left:.4375rem;margin-right:.4375rem;overflow:hidden;position:relative;width:100%}@media only screen and (max-width:600px){[dir=ltr] .input-search{margin-left:1rem}[dir=rtl] .input-search{margin-right:1rem}}.input-search-input{--height:42px;background-color:var(--input-search-background-color);border-color:var(--input-search-border-color);height:var(--height);line-height:var(--height);max-height:var(--height)!important;min-height:var(--height)!important;padding:0 calc(var(--height) + 3px - var(--border-width))}body.animation-level-2 .input-search-input{transition:border-color .2s ease-in-out}html.no-touch .input-search-input:active:not(:focus),html.no-touch .input-search-input:hover:not(:focus){border-color:var(--secondary-color)!important}.input-search-input:focus{background-color:transparent;border-color:var(--primary-color)}.input-search-input:focus~.tgico{color:var(--primary-color);opacity:1}html.no-touch .input-search-input:focus~.btn-icon:active,html.no-touch .input-search-input:focus~.btn-icon:hover{background-color:var(--light-primary-color)}.input-search-input:-moz-placeholder-shown~.tgico-close{display:none}.input-search-input:placeholder-shown~.tgico-close{display:none}.input-search>.tgico{color:var(--secondary-text-color);font-size:1.5rem;line-height:1;opacity:.6;position:absolute;text-align:center;top:50%;transform:translateY(-50%);z-index:1}body.animation-level-2 .input-search>.tgico{transition:opacity .2s ease-out,color .2s ease-out}[dir=ltr] .input-search>.tgico-search{left:.8125rem}[dir=rtl] .input-search>.tgico-search{right:.8125rem}.input-search>.tgico-search{height:1.5rem;pointer-events:none;width:1.5rem}[dir=ltr] .input-search>.tgico-close{right:0}[dir=rtl] .input-search>.tgico-close{left:0}.input-search>.tgico-close{height:42px;width:42px;z-index:1}[dir=ltr] .input-search>.tgico-close:before{margin-right:-1px}[dir=rtl] .input-search>.tgico-close:before{margin-left:-1px}[dir=ltr] .input-field-password .input-field-input{padding-right:2.5rem}[dir=rtl] .input-field-password .input-field-input{padding-left:2.5rem}.input-field-password .input-field-input{max-height:var(--height)}.input-field-password .input-field-input[type=password]{font-family:Arial,Helvetica,sans-serif;font-size:2.25rem;line-height:1;padding-bottom:0;padding-left:calc(.875rem - var(--border-width));padding-top: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{align-items:center;color:#9e9e9e;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;padding:.5rem;position:absolute;right:.375rem;top:50%;transform:translateY(-50%);transition:color .2s;z-index:2}.input-field-password .toggle-visible:before{content:\"๎ฅ\"}.input-field-password .toggle-visible.eye-hidden:before{content:\"๎ฅ‚\"}html.no-touch .input-field-password .toggle-visible:active,html.no-touch .input-field-password .toggle-visible:hover{color:var(--primary-text-color)}.input-field-phone .input-field-input{--letter-spacing:.24px}.input-field-phone .input-field-input:after{color:#9e9e9e;content:attr(data-left-pattern);letter-spacing:var(--letter-spacing)}.btn,.btn-icon{background:none;border:none;cursor:pointer;outline:none}body.animation-level-0 .btn,body.animation-level-0 .btn-icon{transition:none}html.no-touch .btn-icon:active,html.no-touch .btn-icon:hover,html.no-touch .btn:active,html.no-touch .btn:hover{background-color:var(--light-secondary-text-color)}html.no-touch .btn-icon.active:active,html.no-touch .btn-icon.active:hover,html.no-touch .btn-icon.blue:active,html.no-touch .btn-icon.blue:hover,html.no-touch .btn-icon.primary:active,html.no-touch .btn-icon.primary:hover,html.no-touch .btn.active:active,html.no-touch .btn.active:hover,html.no-touch .btn.blue:active,html.no-touch .btn.blue:hover,html.no-touch .btn.primary:active,html.no-touch .btn.primary:hover{background-color:var(--light-primary-color)}html.no-touch .btn-icon.danger:active,html.no-touch .btn-icon.danger:hover,html.no-touch .btn.danger:active,html.no-touch .btn.danger:hover{background-color:var(--light-danger-color)}.btn-icon:disabled,.btn:disabled{opacity:var(--disabled-opacity);pointer-events:none!important}.btn-icon{align-items:center;background-color:transparent;border:none;border-radius:50%!important;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;line-height:1;padding:.5rem;position:relative;text-align:center;transition:color .15s ease-in-out,opacity .15s ease-in-out}.btn-icon.rp{overflow:hidden}.btn-icon.active{color:var(--primary-color)}[dir=ltr] .btn-corner{right:var(--offset)}[dir=rtl] .btn-corner{left:var(--offset)}.btn-corner{--offset:1.25rem;--translateY:calc(54px + var(--offset));align-items:center;background-color:var(--primary-color);border:none;bottom:var(--offset);box-shadow:none!important;color:#fff;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;outline:none;padding:0!important;position:absolute!important;text-align:center;transform:translate3d(0,var(--translateY),0);transition:transform var(--btn-corner-transition)!important;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:3}html.no-touch .btn-corner:active,html.no-touch .btn-corner:hover{background-color:var(--dark-primary-color)}.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{height:2.5rem;width:2.5rem}.btn-menu{-webkit-touch-callout:none;-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:var(--menu-background-color);border-radius:10px;font-size:1rem;min-width:11.25rem;opacity:0;padding:.3125rem 0;position:absolute;top:100%;transform:scale(.8)!important;transition:opacity var(--btn-menu-transition),transform var(--btn-menu-transition),visibility var(--btn-menu-transition);-webkit-user-select:none;visibility:hidden;z-index:4}.btn-menu-old,.is-mobile .btn-menu{-webkit-backdrop-filter:none;backdrop-filter:none;background-color:var(--surface-color);min-width:auto;padding:.5rem 0}.btn-menu-old .btn-menu-item,.is-mobile .btn-menu .btn-menu-item{--padding-left:1rem;--padding-right:2.5rem;--icon-margin:1.5rem;--icon-size:1.5rem;border-radius:0;font-size:var(--font-size-16);font-weight:400;height:3rem;line-height:var(--line-height-16);margin:0;transform:none!important}.btn-menu-old .btn-menu-item:before,.is-mobile .btn-menu .btn-menu-item:before{align-self:auto;color:var(--secondary-text-color);margin-top:0}.btn-menu-old .btn-menu-footer,.is-mobile .btn-menu .btn-menu-footer{background-color:var(--background-color)}.btn-menu{box-shadow:var(--menu-box-shadow)}body.animation-level-0 .btn-menu{transition:none}.btn-menu.active{opacity:1;visibility:visible}.btn-menu.active,.is-mobile .btn-menu.was-open{transform:scaleX(1)!important}.btn-menu.bottom-left,.is-rtl .btn-menu.bottom-right{left:auto;right:0;top:100%;transform-origin:top right}.btn-menu.bottom-right,.is-rtl .btn-menu.bottom-left{left:0;right:auto;top:100%;transform-origin:top left}.btn-menu.bottom-center{transform-origin:top center}.btn-menu.top-left{bottom:100%;left:auto;right:0;top:auto;transform-origin:bottom right}.btn-menu.top-right,.is-rtl .btn-menu.top-left{bottom:100%;left:0;right:auto;top:auto;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}[dir=ltr] .btn-menu-item{text-align:left}[dir=rtl] .btn-menu-item{text-align:right}.btn-menu-item{--padding-vertical:.25rem;--padding-left:.75rem;--padding-right:.75rem;--icon-margin:1.25rem;--icon-size:1.25rem;align-items:center;border-radius:.3125rem;color:var(--primary-text-color);cursor:pointer!important;display:flex;font-size:var(--font-size-14);font-weight:500;height:2rem;line-height:var(--line-height-14);margin-left:.3125rem;margin-right:.3125rem;padding:var(--padding-vertical) var(--padding-right) var(--padding-vertical) var(--padding-left);pointer-events:all!important;position:relative;text-transform:none;transform:scale(1);white-space:nowrap}.btn-menu-item.tgico-char:before{width:var(--icon-size)}body.animation-level-2 .btn-menu-item{transition:transform var(--btn-menu-transition)}.btn-menu-item:active{transform:scale(.96)}html.no-touch .btn-menu-item:active,html.no-touch .btn-menu-item:hover{background-color:var(--light-secondary-text-color)}html.no-touch .btn-menu-item.danger:active,html.no-touch .btn-menu-item.danger:hover{background-color:var(--light-danger-color)}.btn-menu-item:before{align-self:flex-start;color:var(--primary-text-color);font-size:var(--icon-size);margin-top:.125rem}[dir=ltr] .btn-menu-item-icon,[dir=ltr] .btn-menu-item:before{margin-right:var(--icon-margin)}[dir=rtl] .btn-menu-item-icon,[dir=rtl] .btn-menu-item:before{margin-left:var(--icon-margin)}.btn-menu-item-icon,.btn-menu-item:before{position:relative}[dir=ltr] .btn-menu-item-icon{margin-right:calc(var(--icon-margin) - var(--add)/2)}[dir=rtl] .btn-menu-item-icon{margin-left:calc(var(--icon-margin) - var(--add)/2)}[dir=ltr] .btn-menu-item-icon{margin-left:calc(var(--add)/-2)}[dir=rtl] .btn-menu-item-icon{margin-right:calc(var(--add)/-2)}.btn-menu-item-icon{--add:.25rem;--total:calc(var(--icon-size) + var(--add));flex:0 0 auto;height:var(--total);width:var(--total)}.btn-menu-item-icon .media-photo{height:inherit;width:inherit}@media only screen and (max-width:600px){.btn-menu-item{--padding-right:1.875rem}}.btn-menu-item-text{flex:1 1 auto;position:relative}.btn-menu-item-text,.btn-menu-item-text-fake{pointer-events:none}[dir=ltr] .btn-menu-item-text-fake{margin-left:var(--margin-left)}[dir=rtl] .btn-menu-item-text-fake{margin-right:var(--margin-left)}.btn-menu-item-text-fake{--margin-left:calc(var(--icon-size) + var(--icon-margin));max-width:calc(100% - var(--margin-left) - var(--padding-left) - var(--padding-right));overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap}.btn-menu-item-subtitle{color:var(--secondary-text-color);font-size:.875rem}.btn-menu-item-header{color:var(--secondary-text-color);font-weight:var(--font-weight-bold);height:2rem;pointer-events:none!important}[dir=ltr] .btn-menu-item .stacked-avatars{right:.5rem}[dir=rtl] .btn-menu-item .stacked-avatars{left:.5rem}.btn-menu-item .stacked-avatars{--margin-right:-.6875rem;flex:0 0 auto;pointer-events:none;position:absolute}.btn-menu-item.is-multiline{font-size:.75rem;height:auto;max-width:16.25rem;min-width:calc(100% - .625rem);width:-moz-fit-content;width:fit-content}.btn-menu-item.is-multiline .btn-menu-item-text{white-space:pre-wrap;width:-moz-fit-content;width:fit-content}.btn-menu-item .checkbox-field-toggle{padding:0}.btn-menu-overlay{bottom:0;bottom:-100vh;cursor:default;left:0;left:-100vw;max-width:none!important;position:fixed!important;right:0;right:-100vw;top:0;top:-100vh;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:auto!important;z-index:4}.btn-menu.has-footer{padding-bottom:0}.btn-menu-footer{align-items:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;color:currentColor;display:flex;font-size:.875rem;height:2.5rem;justify-content:center}.btn-menu hr{display:block!important;margin:.3125rem auto;opacity:.6;padding:0;width:calc(100% - 1.875rem)}html:not(.is-mobile) .btn-menu .badge{background-color:transparent;color:var(--secondary-text-color)}.btn-menu-reactions{--inner-shadow-degree:90deg;-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:var(--menu-background-color);border-radius:var(--height);filter:drop-shadow(0 .125rem .5rem rgba(0,0,0,.24));height:inherit;max-height:100%;max-width:100%;opacity:0;position:absolute;transform:scale(.8);transform-origin:bottom left}[dir=ltr] .btn-menu-reactions-container{margin-left:var(--other-side-offset)}[dir=rtl] .btn-menu-reactions-container{margin-right:var(--other-side-offset)}.btn-menu-reactions-container{--height:2.25rem;--bubble-side-offset:0rem;--other-side-offset:0rem;--menu-offset:calc((var(--height) + 0.5rem)*-1);--width:calc(var(--menu-width) + (var(--bubble-side-offset) + var(--other-side-offset))*-1);display:flex;height:var(--height);justify-content:flex-start;margin-top:var(--menu-offset);max-width:var(--width);position:fixed;width:var(--width);z-index:4}.contextmenu.bottom-left+.btn-menu-reactions-container .btn-menu-reactions,.contextmenu.center-left+.btn-menu-reactions-container .btn-menu-reactions{transform-origin:bottom right!important}.contextmenu.bottom-center+.btn-menu-reactions-container .btn-menu-reactions{transform-origin:bottom center!important}[dir=ltr] .btn-menu-reactions-container-vertical{margin-left:var(--menu-offset)}[dir=rtl] .btn-menu-reactions-container-vertical{margin-right:var(--menu-offset)}.btn-menu-reactions-container-vertical{flex-direction:column;height:var(--width);margin-top:0;max-height:var(--width);max-width:var(--height);width:var(--height)}.btn-menu-reactions-container-vertical .btn-menu-reactions{--inner-shadow-degree:180deg;display:flex;flex-direction:column;height:auto;transform-origin:top right;width:inherit}.btn-menu-reactions-container-vertical .btn-menu-reactions-reaction{--padding-vertical:var(--padding-base);--padding-horizontal:0rem}.btn-menu-reactions-container-vertical .btn-menu-reactions-bubble-big{bottom:var(--offset);right:calc(var(--size)/-2)}body.animation-level-2 .btn-menu-reactions{transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.btn-menu-reactions.is-visible{opacity:1;transform:scale(1)}.btn-menu-reactions-bubble{background-color:inherit;border-radius:50%;position:absolute;z-index:-1}.btn-menu-reactions-bubble-big{--size:1rem;--offset:calc(var(--height)/2);bottom:calc(var(--size)/-2);height:var(--size);right:var(--offset);width:var(--size)}.btn-menu-reactions:after{background:linear-gradient(var(--inner-shadow-degree),var(--surface-color) 0,rgba(var(--surface-color-rgb),0) 1rem,rgba(var(--surface-color-rgb),0) calc(100% - 1rem),var(--surface-color) 100%);border-radius:inherit;bottom:0;content:\" \";left:0;pointer-events:none;position:absolute;right:0;top:0}.btn-menu-reactions .scrollable{border-radius:inherit;display:flex;position:relative}.btn-menu-reactions .scrollable-x{align-items:center;padding:0 .25rem}.btn-menu-reactions .scrollable-y{align-items:center;flex-direction:column;padding:.25rem 0}.btn-menu-reactions-reaction{--size:1.625rem;--padding-base:.25rem;--padding-vertical:0rem;--padding-horizontal:var(--padding-base);cursor:pointer;flex:0 0 auto;height:calc(var(--size) + var(--padding-vertical)*2);padding:var(--padding-vertical) var(--padding-horizontal);width:calc(var(--size) + var(--padding-horizontal)*2)}.btn-menu-reactions-reaction-scale{height:100%;width:100%}html:not(.is-safari) .btn-menu-reactions-reaction-scale{transform:scale(1)}html:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-scale{transition:transform .1s linear}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select{transform:scale(1)}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:active,html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:hover{transform:scale(1.25)}html.no-touch:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-select{transition:transform var(--transition-standard-in)}.btn-menu-reactions-reaction .media-sticker-wrapper{height:100%;position:relative;width:100%}.btn-primary{border:none;border-radius:10px;cursor:pointer;font-weight:var(--font-weight-bold);height:54px;overflow:hidden;padding:0;position:relative;text-align:center;transition:opacity .2s;width:100%}html.no-touch .btn-primary:active,html.no-touch .btn-primary:hover{background:var(--dark-primary-color);transition:opacity .2s}.btn-primary-transparent{background-color:transparent;color:var(--primary-color)}html.no-touch .btn-primary-transparent:active,html.no-touch .btn-primary-transparent:hover{background:var(--light-primary-color)}.btn-primary-transparent .c-ripple__circle{background-color:var(--light-primary-color)}html.no-touch .btn-primary-transparent.danger:active,html.no-touch .btn-primary-transparent.danger:hover{background-color:var(--light-danger-color)}.btn-primary-transparent .preloader-circular .preloader-path{stroke:var(--primary-color)}body.animation-level-0 .btn-primary{transition:none}[dir=ltr] .btn-primary use,[dir=ltr] .btn-primary>svg{right:15px}[dir=rtl] .btn-primary use,[dir=rtl] .btn-primary>svg{left:15px}.btn-primary use,.btn-primary>svg{height:calc(100% - 20px);left:auto}.btn-primary:disabled{opacity:var(--disabled-opacity);pointer-events:none!important}[dir=ltr] .btn-control{padding-left:.75rem;padding-right:1.5rem}[dir=rtl] .btn-control{padding-left:1.5rem;padding-right:.75rem}.btn-control{align-items:center;border-radius:1.25rem;display:flex;height:2.5rem;line-height:2.5rem;margin:.9375rem auto 1rem;width:auto}[dir=ltr] .btn-control.tgico:before{margin-right:.375rem}[dir=rtl] .btn-control.tgico:before{margin-left:.375rem}.btn-control.tgico:before{font-size:1.5rem}.btn-transparent{align-items:center;background-color:transparent;color:var(--primary-text-color);display:flex;font-weight:400;height:3rem;line-height:var(--line-height);padding:0 1rem}@media only screen and (max-width:600px){.btn-transparent{height:3rem}}html.no-touch .btn-transparent:active,html.no-touch .btn-transparent:hover{background-color:var(--light-secondary-text-color)}html.no-touch .btn-transparent.danger:active,html.no-touch .btn-transparent.danger:hover{background-color:var(--light-danger-color)}html.no-touch .btn-transparent.primary:active,html.no-touch .btn-transparent.primary:hover{background-color:var(--light-primary-color)}[dir=ltr] .btn-transparent:before{margin-right:2rem}[dir=rtl] .btn-transparent:before{margin-left:2rem}.btn-transparent:before{color:var(--secondary-text-color);font-size:1.5rem}@media only screen and (max-width:600px){[dir=ltr] .btn-transparent:before{margin-right:1.5rem}[dir=rtl] .btn-transparent:before{margin-left:1.5rem}}[dir=ltr] .btn-transparent.btn-short:before{margin-right:1rem}[dir=rtl] .btn-transparent.btn-short:before{margin-left:1rem}.btn-primary.btn-circle .preloader-circular{height:calc(100% - 20px);left:auto;margin:0;right:auto;top:10px}.btn-primary.btn-circle .preloader-circular .preloader-path{stroke:#fff}.btn-menu-toggle{cursor:pointer!important;font-weight:400!important;overflow:visible!important;pointer-events:all!important;position:relative}.btn-menu-toggle:not(.btn-primary):not(.btn-corner).menu-open{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);line-height:var(--size);width:var(--size)}@media only screen and (max-width:600px){.btn-circle{--size:46px}}.btn-circle path{fill:#fff}.btn-disabled{color:var(--secondary-text-color)!important;cursor:default!important;pointer-events:none!important}.btn-disabled:before{color:inherit!important}.btn-secondary:not(:first-child){margin-top:.5rem!important}.btn-color-primary{background:var(--primary-color);color:#fff}.call-button{-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);border-radius:50%;font-size:1.5rem;height:var(--call-button-size);justify-content:center;position:relative}.call-button,.call-button-container{align-items:center;cursor:pointer;display:flex;width:var(--call-button-size)}.call-button-container{flex-direction:column}.call-button-container.disabled,.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{font-size:.875rem;margin-top:.25rem;white-space:nowrap}body.animation-level-2 .call-button-text{transition:opacity var(--transition-standard-in)}body.animation-level-2 .call-button{transition:background-color var(--transition-standard-in),opacity var(--transition-standard-in)}[dir=ltr] .call-button+.call-button,[dir=ltr] .call-button-container+.call-button-container{margin-left:var(--call-button-margin)}[dir=rtl] .call-button+.call-button,[dir=rtl] .call-button-container+.call-button-container{margin-right:var(--call-button-margin)}[dir=ltr] .btn-update{right:auto!important}[dir=rtl] .btn-update{left:auto!important}.btn-update{border-radius:var(--size);font-size:1rem;font-weight:var(--font-weight-bold);padding:0 2rem!important;width:auto}.animated-close-icon{pointer-events:none;position:absolute;transform:rotate(-45deg)}.animated-close-icon,.animated-close-icon:after,.animated-close-icon:before{background-color:var(--secondary-text-color);border-radius:.125rem;height:.125rem;width:1.125rem}.animated-close-icon:after,.animated-close-icon:before{content:\"\";left:0;position:absolute;top:0}.animated-close-icon:before{transform:rotate(90deg)}body.animation-level-2 .animated-close-icon,body.animation-level-2 .animated-close-icon:after,body.animation-level-2 .animated-close-icon:before{transition:transform var(--slide-header-transition)}.animated-close-icon.state-back{transform:rotate(180deg)}.animated-close-icon.state-back:before{transform:rotate(45deg) scaleX(.75) translateY(-.375rem)}.animated-close-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translateY(.375rem)}.animated-menu-icon{--color:var(--secondary-text-color);position:absolute}.animated-menu-icon,.animated-menu-icon:after,.animated-menu-icon:before{background-color:var(--color);border-radius:.125rem;height:.125rem;transform:rotate(0);width:1.125rem}body.animation-level-2 .animated-menu-icon,body.animation-level-2 .animated-menu-icon:after,body.animation-level-2 .animated-menu-icon:before{transition:transform .25s}.animated-menu-icon:after,.animated-menu-icon:before{content:\"\";left:0;position:absolute}.animated-menu-icon:before{top:-.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(.75) translate(.375rem,-.1875rem)}.animated-menu-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translate(.375rem,.1875rem)}.animated-menu-close-icon{margin-top:-.625rem}.animated-menu-close-icon:before{opacity:1;top:.3125rem}body.animation-level-2 .animated-menu-close-icon:before{transition:transform .25s,opacity .125s 0s}.animated-menu-close-icon:after{top:.625rem}.animated-menu-close-icon.state-back{transform:translateY(.3125rem) rotate(135deg)}.animated-menu-close-icon.state-back:before{opacity:0;transform:rotate(45deg)}.animated-menu-close-icon.state-back:after{transform:translateY(-.625rem) rotate(90deg)}.animated-button-icon>.tgico{height:24px;line-height:24px;position:absolute}body:not(.animation-level-0) .animated-button-icon>.tgico{animation:hide-icon .4s ease-in-out forwards}body.animation-level-0 .animated-button-icon>.tgico{animation:none!important;visibility:hidden}.autocomplete-helper{--border-radius:10px;border-radius:var(--border-radius)!important;bottom:calc(100% + .5rem);left:0;max-width:100%;overflow:hidden;padding:0!important;position:absolute!important;width:auto!important}.autocomplete-helper:not(.is-visible){display:none}.autocomplete-helper.is-visible{visibility:hidden}body.animation-level-2 .autocomplete-helper.is-visible{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){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{max-height:232px;position:relative}.autocomplete-peer-helper-list{padding:.5rem 0}.autocomplete-peer-helper-list-element{align-items:center;cursor:pointer;display:flex;height:3.125rem;line-height:var(--line-height);padding:0 2.125rem 0 .75rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (max-width:600px){.autocomplete-peer-helper-list-element{padding-right:.75rem}}.autocomplete-peer-helper-list-element-name{flex:0 0 auto;font-weight:var(--font-weight-bold);margin-left:.875rem}.autocomplete-peer-helper-list-element-description{color:var(--secondary-text-color);margin-left:.5625rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.autocomplete-peer-helper-list-element-avatar{flex:0 0 auto}.badge{--size:1.375rem;--padding:.4375rem;border-radius:calc(var(--size)/2);color:var(--badge-text-color);font-size:.875rem;font-weight:var(--font-weight-bold);height:var(--size);line-height:var(--size)!important;min-width:var(--size);padding:0 var(--padding);text-align:center}body.animation-level-2 .badge{transition:background-color .2s ease-in-out}.badge:not(.tgico):empty{display:none}.badge-20{--size:1.25rem;--padding:.375rem}.badge-24{--size:1.5rem;--padding:.5rem}.badge.tgico:before{font-size:var(--size)}.badge-primary{background-color:var(--primary-color)}.badge-gray{background-color:var(--secondary-color)}.ckin__player{letter-spacing:.02em;-webkit-user-select:none;-moz-user-select:none;user-select:none}.ckin__player.ckin__fullscreen{background:#000;border-radius:0!important;bottom:0;display:flex;height:100%;left:0;position:fixed;right:0;top:0;width:100%;z-index:10000000}.ckin__player.ckin__fullscreen video{height:100%;-o-object-fit:contain;object-fit:contain;width:100%}.ckin__player .time{color:#fff;font-size:.875rem;margin-left:.875rem}@media only screen and (max-width:600px){.ckin__player .time{margin-left:1.125rem}}.default{align-items:center;display:flex;font-size:0;justify-content:center;position:relative}.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;color:#fff;font-size:4rem;left:50%;line-height:1;opacity:1;outline:0;padding:0;position:absolute;text-align:center;top:50%;transform:translate3d(-50%,-50%,0) scale(1)}@media only screen and (min-width:601px){.default__button--big{pointer-events:none}}body.animation-level-2 .default__button--big{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}[dir=ltr] .default__controls{text-align:left}[dir=rtl] .default__controls{text-align:right}.default__controls{bottom:0;direction:ltr;left:0;position:absolute;right:0;z-index:6}body.animation-level-2 .default__controls{transition:transform var(--layer-transition)}.default__controls .progress-line{border-radius:var(--border-radius);margin:0 16px}.default__controls .progress-line__filled{background:var(--primary-color)}.default__controls .progress-line__loaded{background-color:#fff}.default__controls .progress-line{background:hsla(0,0%,100%,.38)}@media only screen and (max-width:600px){.default__controls .progress-line{margin-bottom:-1px}}.default__gradient-bottom{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAADGCAYAAAAT+OqFAAAAdklEQVQoz42QQQ7AIAgEF/T/D+kbq/RWAlnQyyazA4aoAB4FsBSA/bFjuF1EOL7VbrIrBuusmrt4ZZORfb6ehbWdnRHEIiITaEUKa5EJqUakRSaEYBJSCY2dEstQY7AuxahwXFrvZmWl2rh4JZ07z9dLtesfNj5q0FU3A5ObbwAAAABJRU5ErkJggg==);background-position:bottom;background-repeat:repeat-x;bottom:0;height:49px;padding-top:93px;pointer-events:none;position:absolute;width:100%;z-index:2}body.animation-level-2 .default__gradient-bottom{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__controls,.default.show-controls .default__gradient-bottom{transform:translateZ(0)}.default.is-playing:not(.show-controls){cursor:none}.default.is-playing .default__button--big,.default.is-seeking .default__button--big,.default:not(.played) .default__button--big{opacity:0}.default.is-playing .toggle:not(.default__button--big):before,.default.is-seeking .toggle:not(.default__button--big):before,.default:not(.played) .toggle:not(.default__button--big):before{content:\"๎ฆ…\"}.default .is-seeking+.default__button--big{opacity:0}.default .player-volume{--icon-size:2.25rem;--icon-margin-right:.5rem;--selector-size:50px;--selector-thumb-size:.75rem;--hide-width:var(--icon-size);--show-width:calc(var(--icon-size) + var(--icon-margin-right) + var(--selector-size) + var(--selector-thumb-size)*0.75);align-items:center;display:flex;overflow:hidden;width:var(--hide-width)}body.animation-level-2 .default .player-volume{transition:width var(--layer-transition)}html.is-touch .default .player-volume{display:none}html:not(.is-touch) .default .player-volume+.time{margin-left:.5rem}html.no-touch .default .player-volume:active,html.no-touch .default .player-volume:hover{width:var(--show-width)}.default .player-volume__icon{color:#fff;cursor:pointer;display:flex;font-size:1.5rem;height:var(--icon-size);margin-right:var(--icon-margin-right);padding:.375rem;width:var(--icon-size)}.default .player-volume .progress-line{--color:#fff;--thumb-size:var(--selector-thumb-size);--height:4px;margin:0;min-width:var(--selector-size);width:var(--selector-size)}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);cursor:pointer;height:var(--height);position:relative}.progress-line:before{border-radius:inherit;bottom:0;content:\" \";display:block;left:0;position:absolute;right:0;top:0}.progress-line__seek{-webkit-appearance:none;-moz-appearance:none;background:transparent;bottom:-.5rem;caret-color:var(--color);cursor:pointer;margin:0;outline:none;padding:0;position:absolute;top:-.5rem;width:100%}.progress-line__seek:focus{outline:none}.progress-line__seek::-webkit-slider-thumb{display:none}.progress-line__seek::-moz-range-thumb{display:none;height:0;width: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{background-color:var(--color);border-radius:50%;content:\" \";cursor:pointer;display:block;height:var(--thumb-size);position:absolute;right:0;top:calc((var(--thumb-size) - var(--height))/-2);transform:translateX(calc(var(--thumb-size)/2)) scale(1);width:var(--thumb-size)}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:translateX(calc(var(--thumb-size)/2)) scale(1.125)}.progress-line:before,.progress-line__loaded{background-color:var(--secondary-color);opacity:.3}.progress-line__filled,.progress-line__loaded{border-radius:var(--border-radius);bottom:0;position:absolute;top:0}body.animation-level-2 .progress-line.with-transition .progress-line__filled{transition:width .2s}.progress-line.use-transform .progress-line__filled{transform-origin:left center;width:100%}input[type=range]::-ms-track{visibility:hidden}input[type=range]::-ms-ticks{background:none;border:none;color:none}input[type=range]::-ms-thumb,input[type=range]::-ms-tooltip{visibility:hidden}.bottom-controls,.left-controls,.right-controls{align-items:center;display:flex}.bottom-controls{height:2.25rem;justify-content:space-between;padding:0 .625rem}@media only screen and (max-width:600px){.bottom-controls{height:3.625rem}}[dir=ltr] .checkbox-field{text-align:left}[dir=rtl] .checkbox-field{text-align:right}.checkbox-field{--size:1.25rem;--offset-left:0px;cursor:pointer;display:block;margin:1.5rem 1.1875rem;min-height:var(--size);min-width:var(--size);position:relative}body.animation-level-2 .checkbox-field{transition:opacity .2s}.checkbox-field.checkbox-disabled{opacity:var(--disabled-opacity);pointer-events:none!important}@media only screen and (max-width:600px){.checkbox-field{margin-bottom:27px}}[dir=ltr] .checkbox-field .checkbox-box{left:var(--offset-left)}[dir=rtl] .checkbox-field .checkbox-box{right:var(--offset-left)}.checkbox-field .checkbox-box{border-radius:.3125rem;height:var(--size);overflow:hidden;position:absolute;top:50%;transform:translateY(-50%);width:var(--size)}html.is-safari .checkbox-field .checkbox-box{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.checkbox-field .checkbox-box-background,.checkbox-field .checkbox-box-border,.checkbox-field .checkbox-box-check{left:0;position:absolute;top:0}.checkbox-field .checkbox-box-border{border:2px solid #8d969c;border-radius:inherit;bottom:0;left:0;right:0}.checkbox-field .checkbox-box-background{background-color:var(--primary-color);border-radius:50%;bottom:-15%;left:-15%;right:-15%;top:-15%;transform:scale(1);transition:transform .2s ease-in-out 0s}body.animation-level-0 .checkbox-field .checkbox-box-background{transition:none!important}.checkbox-field .checkbox-box-check{--offset:7px;height:calc(var(--size) - var(--offset));left:50%;top:50%;transform:translate(-50%,-50%);width:calc(var(--size) - var(--offset))}.checkbox-field .checkbox-box-check use{stroke:#fff;stroke-width:3.75;stroke-linecap:round;stroke-dasharray:24.19,24.19;stroke-dashoffset:0;transition:stroke-dasharray .1s ease-in-out .15s,visibility 0s .15s;visibility:visible}body.animation-level-0 .checkbox-field .checkbox-box-check use{transition:none!important}[dir=ltr] .checkbox-field .checkbox-caption{padding-left:3.375rem}[dir=rtl] .checkbox-field .checkbox-caption{padding-right:3.375rem}.checkbox-field .checkbox-caption{color:inherit;line-height:var(--line-height);pointer-events:none;position:relative;transition:opacity .2s}body.animation-level-0 .checkbox-field .checkbox-caption{transition:none}.checkbox-field.hover-effect{align-items:center;display:flex;height:3.5rem;margin-left:0;margin-right:0;padding:0 1.1875rem}[dir=ltr] .checkbox-field.hover-effect .checkbox-box{left:auto}[dir=rtl] .checkbox-field.hover-effect .checkbox-box{right:auto}.checkbox-field .anchor-url{pointer-events:all}.checkbox-ripple{border-radius:10px;overflow:hidden}.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{bottom:0;left:0;right:0;top:0}.checkbox-field-round .checkbox-box-border{border:2px solid var(--secondary-color);z-index:1}.checkbox-field-round .checkbox-box-check{--offset:calc(var(--size) - var(--size)/2 - 0.125rem)}html.is-safari .checkbox-field-round .checkbox-box{-webkit-mask-image:none}[dir=ltr] .radio-field{text-align:left}[dir=rtl] .radio-field{text-align:right}.radio-field{--size:1.375rem;--offset-left:0px;cursor:pointer;line-height:var(--line-height);margin:1.25rem 0;position:relative}.radio-field.hidden-widget{cursor:default}.radio-field.hidden-widget .radio-field-main:after,.radio-field.hidden-widget .radio-field-main:before{visibility:hidden}.radio-field>input:checked~.radio-field-main:before{border-color:var(--primary-color)}.radio-field>input:checked~.radio-field-main:after{transform:translateY(-50%) scale(1)}[dir=ltr] .radio-field .radio-field-main{padding-left:3.5rem}[dir=rtl] .radio-field .radio-field-main{padding-right:3.5rem}.radio-field .radio-field-main{color:inherit;position:relative}[dir=ltr] .radio-field .radio-field-main:after,[dir=ltr] .radio-field .radio-field-main:before{left:var(--offset-left)}[dir=rtl] .radio-field .radio-field-main:after,[dir=rtl] .radio-field .radio-field-main:before{right:var(--offset-left)}.radio-field .radio-field-main:after,.radio-field .radio-field-main:before{content:\"\";display:block;height:var(--size);position:absolute;top:50%;transform:translateY(-50%);width:var(--size)}.radio-field .radio-field-main:before{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}[dir=ltr] .radio-field .radio-field-main:after{left:calc(var(--offset-left) + .3125rem)}[dir=rtl] .radio-field .radio-field-main:after{right:calc(var(--offset-left) + .3125rem)}.radio-field .radio-field-main:after{background:var(--primary-color);border-radius:50%;height:.75rem;transform:translateY(-50%) scale(0);transform-origin:center;width:.75rem}body.animation-level-2 .radio-field .radio-field-main:after{transition:transform .1s ease}[dir=ltr] .radio-field.radio-field-right .radio-field-main:before{left:auto;right:0}[dir=rtl] .radio-field.radio-field-right .radio-field-main:before{left:0;right:auto}[dir=ltr] .radio-field.radio-field-right .radio-field-main:after{left:auto;right:.3125rem}[dir=rtl] .radio-field.radio-field-right .radio-field-main:after{left:.3125rem;right:auto}[type=checkbox],[type=radio]{box-sizing:border-box;opacity:0;padding:0;position:absolute;z-index:var(--z-below)}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dasharray:0,24.19;transition:stroke-dasharray .1s ease-in-out,visibility 0s .1s;visibility:hidden}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-background{transform:scale(0);transition:transform .2s ease-in-out .05s}.checkbox-field .checkbox-field-input:disabled+.checkbox-box,.checkbox-field .checkbox-field-input:disabled~.checkbox-caption{cursor:default;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{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;visibility:visible!important}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dashoffset:35.5;transform:rotate(45deg) translateY(-10px)}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-background{background-color:var(--danger-color)}.checkbox-field-toggle{--size:20px;align-items:center;display:flex;margin:0 .3125rem;padding:0 .25rem;pointer-events:none}.checkbox-field-toggle .checkbox-toggle{--offset:3px;--toggle-width:1.9375rem;align-items:center;background-color:var(--secondary-color);border-radius:12px;display:flex;height:.875rem;margin:0 var(--offset);position:relative;width:var(--toggle-width)}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle{transition:background-color .1s}.checkbox-field-toggle .checkbox-toggle:before{background-color:var(--surface-color);border:2px solid var(--secondary-color);border-radius:50%;content:\" \";height:1.25rem;position:absolute;transform:translateX(calc(var(--offset)*-1));width:1.25rem}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle:before{transition:border-color .1s,transform .1s cubic-bezier(.22,.75,.7,1.44)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle{background-color:var(--primary-color)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle:before{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{margin-bottom:17px;padding:1rem 0 .5rem;width:100%}@media only screen and (max-width:600px){.chatlist-container .search-group{margin-bottom:0}}.chatlist-container .search-group__name{color:var(--secondary-text-color);font-weight:var(--font-weight-bold);padding:0 23px 1rem;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (max-width:600px){.chatlist-container .search-group__name{font-size:15px;padding:5px 9px 0 16px}}.chatlist-container .search-group-contacts{border-bottom:1px solid var(--border-color)}@media only screen and (max-width:600px){.chatlist-container .search-group-contacts{padding:0 0 2px}}.chatlist-container .search-group-people.search-group-contacts{padding:5px 0!important}.chatlist-container .search-group:last-child{border-bottom:none}.chatlist-container .search-super .search-group{margin-bottom:0;padding:0 0 .5rem}.chatlist-container .search-super .search-group__name{display:flex;justify-content:space-between;padding-top:1rem}ul.chatlist{padding:0 .5rem}@media only screen and (max-width:600px){ul.chatlist{padding:0}}.chatlist{-webkit-touch-callout:none;background-color:var(--surface-color);display:flex;flex-direction:column;margin:0;position:relative;-moz-user-select:none;user-select:none;-webkit-user-select:none;width:100%}.chatlist-chat{--background:unset;-webkit-user-drag:none;background:var(--background)!important}.chatlist-chat.is-forum-open,.chatlist-chat.menu-open,html.no-touch .chatlist-chat:active,html.no-touch .chatlist-chat:hover{--background:var(--light-filled-secondary-text-color)}[dir=ltr] .chatlist-chat.is-muted .user-title:after{margin-left:.125rem}[dir=rtl] .chatlist-chat.is-muted .user-title:after{margin-right:.125rem}.chatlist-chat.is-muted .user-title:after{color:var(--chatlist-pinned-color);content:\"๎ฆƒ\";flex:0 0 auto;font-size:1.125rem}body:not(.animation-level-0) .chatlist-chat.is-muted.animating:not(.backwards) .user-title:after{animation:fade-in-opacity .2s ease-in-out forwards}body:not(.animation-level-0) .chatlist-chat.is-muted.animating.backwards .user-title:after{animation:fade-in-backwards-opacity .2s ease-in-out forwards}.chatlist-chat i{font-style:normal}.chatlist-chat .text-highlight{color:var(--primary-text-color)}.chatlist-chat .premium-icon{margin-top:-.125rem}.chatlist-chat .topic-icon{flex:0 0 auto}[dir=ltr] .chatlist-chat .row-title .topic-icon{margin-right:.25rem}[dir=rtl] .chatlist-chat .row-title .topic-icon{margin-left:.25rem}.chatlist-chat .row-title .topic-icon{--size:1.375rem}.chatlist-chat .topic-name .topic-icon{display:inline;line-height:1!important}.chatlist-chat .topic-name .topic-icon-svg{position:relative}.chatlist-chat .topic-name .topic-icon-content{left:0;margin-top:-6px;position:absolute;right:0;top:0}@media only screen and (min-width:601px){.chatlist-chat.active{--background:var(--primary-color)!important}.chatlist-chat.active .message-status,.chatlist-chat.active .premium-icon,.chatlist-chat.active .row-subtitle,.chatlist-chat.active .row-title,.chatlist-chat.active .sending-status-icon,.chatlist-chat.active .text-highlight,.chatlist-chat.active .tgico-chatspinned:before,.chatlist-chat.active .user-title,.chatlist-chat.active .verified-icon{color:#fff!important}.chatlist-chat.active .badge-fake{border-color:#fff;color:#fff}.chatlist-chat.active .danger,.chatlist-chat.active .primary-text{color:#fff!important}.chatlist-chat.active .user-title:after{color:hsla(0,0%,100%,.7)}.chatlist-chat.active .verified-icon-background{fill:#fff!important}.chatlist-chat.active .verified-icon-check{visibility:hidden}.chatlist-chat.active .dialog-avatar.is-online:after,.chatlist-chat.active .dialog-group-call-icon{background-color:#fff;border-color:var(--primary-color)}.chatlist-chat.active .badge.unread,.chatlist-chat.active .mention{background-color:#fff!important;color:var(--primary-color)}.chatlist-chat.active .peer-typing-container{--color:#fff}}.chatlist .peer-typing-container{--color:var(--secondary-text-color)}.chatlist .peer-typing-container .peer-typing-text{display:inline-flex;transform:translateY(-2px)}.chatlist .sending-status-icon.tgico-premium_lock{color:var(--secondary-color);font-size:.8125rem;margin:.1875rem 0 0 .5rem}[dir=ltr] .chatlist .dialog-title-details{margin-left:.5rem}[dir=rtl] .chatlist .dialog-title-details{margin-right:.5rem}.chatlist .dialog-title-details{flex:0 0 auto;font-size:.75rem;padding:1px 0 0}[dir=ltr] .chatlist .dialog-subtitle-badge{margin-left:.5rem}[dir=rtl] .chatlist .dialog-subtitle-badge{margin-right:.5rem}.chatlist .dialog-subtitle-badge{display:block!important;flex:0 0 auto}.chatlist .dialog-subtitle-badge.avatar-badge{--size:1.625rem;border:2px solid var(--background,var(--surface-color));line-height:23px!important;margin:0;pointer-events:none;position:absolute;right:calc(100% - 4.0625rem);top:2.4375rem}[dir=ltr] .chatlist .dialog-subtitle-media{margin-right:.375rem}[dir=rtl] .chatlist .dialog-subtitle-media{margin-left:.375rem}.chatlist .dialog-subtitle-media{border-radius:.25rem;display:inline-block;flex:0 0 auto;height:1.25rem;line-height:1.25rem;position:relative;width:1.25rem}.chatlist .dialog-subtitle-media:before{content:\"ย \";display:inline-block;height:inherit;min-height:inherit;min-width:inherit;width:inherit}.chatlist .dialog-subtitle-media.is-round{border-radius:50%}.chatlist .dialog-subtitle-media.is-round .tgico-play{font-size:.875rem}.chatlist .dialog-subtitle-media .tgico-play{color:#fff;font-size:1rem;left:50%;line-height:1;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:1}.chatlist .dialog-subtitle-media .media-photo{border-radius:inherit;bottom:auto;height:inherit;-o-object-fit:cover;object-fit:cover;top:auto;width:inherit}.chatlist .dialog-group-call-icon{background-color:var(--avatar-online-color);border:2px solid var(--surface-color);border-radius:50%;height:20px;left:45px;overflow:hidden;position:absolute;top:45px;width:20px;z-index:2}body.animation-level-2 .chatlist .dialog-group-call-icon,body.animation-level-2 .chatlist .dialog-subtitle-badge{opacity:1;transform:scale(0);transition:none}body.animation-level-2 .chatlist .dialog-group-call-icon.is-visible:not(.backwards),body.animation-level-2 .chatlist .dialog-subtitle-badge.is-visible:not(.backwards){transform:scale(1)}body.animation-level-2 .chatlist .dialog-group-call-icon.backwards,body.animation-level-2 .chatlist .dialog-subtitle-badge.backwards{opacity:0}body.animation-level-2 .chatlist .dialog-group-call-icon.animating,body.animation-level-2 .chatlist .dialog-subtitle-badge.animating{transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-group-call-icon.animating.backwards,body.animation-level-2 .chatlist .dialog-subtitle-badge.animating.backwards{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{opacity:1;transform:scale(0);transition:none}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 var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-avatar.animating.backwards:after{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 .dialog-avatar,.chatlist .row-row{pointer-events:none;position:relative}.chatlist .user-title{align-items:center;display:flex!important}.chatlist .user-title img.emoji{height:18px;margin-top:1px;vertical-align:top;width:18px}.chatlist .user-last-message img.emoji{height:20px;margin-top:-3px;width:20px}.chatlist .user-last-message,.chatlist .user-title{flex-grow:1;position:relative}[dir=ltr] .chatlist .message-status{margin-right:.125rem}[dir=rtl] .chatlist .message-status{margin-left:.125rem}.chatlist .message-status{color:var(--chatlist-status-color);display:inline-block;font-size:1.25rem;height:1.25rem;line-height:1;margin-top:-.0625rem;position:relative;vertical-align:middle;width:1.25rem}.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:var(--chatlist-pinned-color);opacity:1}.chatlist .tgico-chatspinned.unread:before{opacity:0}.chatlist .tgico-chatspinned{position:relative}.chatlist .tgico-chatspinned:before{left:0;position:absolute;top:0}.chatlist .mention{background-color:var(--chatlist-status-color)!important;line-height:1.25rem!important;padding:0}[dir=ltr] .chatlist .mention-badge{margin-right:-.125rem}[dir=rtl] .chatlist .mention-badge{margin-left:-.125rem}.chatlist .is-muted.backwards .unread,.chatlist .unread{background-color:var(--chatlist-status-color)}.chatlist .is-muted .unread,.chatlist .no-unmuted-topic .unread{background-color:var(--secondary-color)}.chatlist .not-visited{--size:.5rem;--padding:0;background-color:var(--secondary-color)!important}.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{margin-bottom:0!important;padding-bottom:0}.chatlist-bottom .chatlist-new{padding:0}.chat-input{--translateY:0;--padding-bottom:0.5rem;--bottom:var(--padding-bottom);display:flex;flex:0 0 auto;flex-direction:column;max-width:100%;padding-top:.25rem;position:relative;transform:translate3d(0,var(--translateY),0);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .chat-input{transition:none!important}@media only screen and (min-height:570px)and (min-width:601px){.chat-input{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{transform:translate3d(calc(var(--right-column-width)/-2),var(--translateY),0)!important;transition:transform var(--transition-standard-in)}}.chat-input.is-hidden{--translateY:100%;bottom:0;position:absolute!important;transform:translate3d(0,var(--translateY),0)!important;transition:transform var(--transition-standard-in)}.bubbles.is-selecting:not(.backwards)~.chat-input.is-hidden{--translateY:0}.chat-input-container{--padding-horizontal:var(--chat-input-padding);align-items:flex-end;display:flex;flex:0 0 auto;justify-content:center;margin:0 auto;max-width:var(--messages-container-width);padding:0 var(--padding-horizontal);padding-bottom:var(--bottom);position:relative;width:100%}.chat-input-container .btn-circle{height:var(--chat-input-size);width: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{border-bottom-right-radius:12px;max-height:var(--chat-input-size)}.chat-input-container.is-centering:not(.backwards) .rows-wrapper .bubble-tail{opacity:0;transform:scaleX(-1) translateX(1.125rem)}.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 .1s}.chat-input-container.is-centering.animating .rows-wrapper .bubble-tail{transition:transform .1s,opacity 25ms 0s}.chat-input-container.is-centering.animating .selection-wrapper{transition:opacity .1s 75ms}.chat-input-container.is-centering.animating .btn-send{transition:transform .2s}.chat-input-container.is-centering.animating:not(.backwards) .rows-wrapper .bubble-tail{transition:transform .1s,opacity 25ms 75ms}.chat-input .menu-send{bottom:calc(100% + .5rem);top:auto}.chat-input .toggle-emoticons:before{content:\"๎ฆด\"}.chat-input .toggle-emoticons.flip-icon:before{content:\"๎ฅ™\"!important}[dir=ltr] .chat-input .btn-record-cancel{right:0}[dir=rtl] .chat-input .btn-record-cancel{left:0}.chat-input .btn-record-cancel{--multiplier:-1;opacity:0;padding:0;position:absolute;top:0;transform:translateX(calc((100% + var(--padding-horizontal) + .5rem)*var(--multiplier)));visibility:hidden;z-index:3}.chat-input .btn-record-cancel .c-ripple__circle,html.no-touch .chat-input .btn-record-cancel:active:after,html.no-touch .chat-input .btn-record-cancel:hover:after{background-color:var(--light-danger-color)}.chat-input .btn-record-cancel:before{color:var(--danger-color)}.is-rtl .chat-input .btn-record-cancel{--multiplier:1}[dir=ltr] .chat-input .btn-scheduled:after{right:5px}[dir=rtl] .chat-input .btn-scheduled:after{left:5px}.chat-input .btn-scheduled:after{background:var(--message-checkbox-color);border-radius:50%;content:\"\";height:.5rem;position:absolute;top:5px;width:.5rem}.chat-input .btn-preloader .preloader{height:1.5rem;width:1.5rem}.chat-input .btn-preloader .preloader .preloader-path{stroke:var(--secondary-text-color)}body.animation-level-2 .chat-input .btn-preloader.show.backwards{animation:hide-icon .4s ease-in-out forwards!important}[dir=ltr] .chat-input .float{margin-right:.75rem!important}[dir=rtl] .chat-input .float{margin-left:.75rem!important}.chat-input .float{align-self:center;display:none!important;margin:0!important}body.animation-level-2 .chat-input .float{animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-height:569px),only screen and (max-width:600px){[dir=ltr] .chat-input .float{margin-right:.125rem!important}[dir=rtl] .chat-input .float{margin-left:.125rem!important}}.chat-input:not(.is-recording) .float.show:not(.hide){display:flex!important}[dir=ltr] .chat-input .btn-send-container{right:var(--padding-horizontal)}[dir=rtl] .chat-input .btn-send-container{left:var(--padding-horizontal)}.chat-input .btn-send-container{align-items:center;bottom:0;display:flex;justify-content:center;padding-bottom:inherit;position:absolute}.chat-input .btn-send-container .btn-menu-overlay{z-index:3}.chat-input .btn-icon{transition:opacity .2s}body.animation-level-0 .chat-input .btn-icon{transition:none}.chat-input .btn-cancel-record,.chat-input .btn-send{box-shadow:0 1px 8px 1px rgba(0,0,0,.12)}.chat-input .btn-send{background-color:var(--primary-color)!important;color:#fff!important;z-index:3}html.no-touch .chat-input .btn-send:active,html.no-touch .chat-input .btn-send:hover{background-color:var(--dark-primary-color)!important}.chat-input .btn-send .tgico-check{font-size:2rem;height:32px!important}.chat-input .btn-send .tgico-check:before{font-weight:var(--font-weight-bold)}.chat-input .btn-send.edit .tgico-check,.chat-input .btn-send.record .tgico-microphone_filled,.chat-input .btn-send.schedule .tgico-schedule,.chat-input .btn-send.send .tgico-send{visibility:visible!important}body.animation-level-2 .chat-input .btn-send.edit .tgico-check,body.animation-level-2 .chat-input .btn-send.record .tgico-microphone_filled,body.animation-level-2 .chat-input .btn-send.schedule .tgico-schedule,body.animation-level-2 .chat-input .btn-send.send .tgico-send{animation:grow-icon .4s ease-in-out forwards!important}.chat-input .btn-record-cancel,.chat-input .btn-send{font-size:1.5rem;line-height:1.5rem}.chat-input .record-time{display:none;height:44px;line-height:44px}.chat-input .record-time:after{background-color:var(--danger-color);border-radius:50%;content:\" \";display:inline-block;height:10px;margin-left:9px;margin-right:9px;width:10px}body.animation-level-2 .chat-input .record-time:after{animation:recordBlink 1.25s infinite}.chat-input .record-ripple{background-color:var(--message-highlightning-color);border-radius:50%;height:300px;opacity:.5;position:absolute;transform:scale(0);visibility:hidden;width:300px}@media only screen and (max-width:600px){.chat-input .record-ripple{height:240px;width: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-record-cancel,.chat-input.is-recording:not(.backwards) .btn-send{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 .1s,opacity .1s 0s}.chat-input.is-recording.animating .record-ripple{transition:transform .03s ease-in-out,visibility .1s}.chat-input.is-recording.animating .rows-wrapper{transition:width .2s}.chat-input.is-recording.animating:not(.backwards) .btn-record-cancel{transition:visibility 0s .1s,opacity .1s .1s}.chat-input.is-recording.animating:not(.backwards) .record-ripple{transition:transform .03s,visibility 0s}[dir=ltr] .chat-input:not(.is-recording) .btn-record-cancel{margin-right:0}[dir=rtl] .chat-input:not(.is-recording) .btn-record-cancel{margin-left:0}.chat-input:not(.is-recording) .btn-record-cancel{width:0}.chat-input .new-message-wrapper{opacity:1}.chat-input .reply-in-topic-overlay{align-items:center;background-color:inherit;border-radius:inherit;color:var(--secondary-text-color);display:flex;justify-content:center;padding:0 1rem;pointer-events:none;z-index:3}.bubbles.is-selecting:not(.backwards)~.chat-input .selection-wrapper{opacity:1}.bubbles.is-selecting.animating~.chat-input .new-message-wrapper{transition:opacity .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 .1s .1s}.bubbles.is-selecting.animating.backwards~.chat-input .selection-wrapper{transition:opacity .1s 0s}@keyframes recordBlink{0%{opacity:1}50%{opacity:.2}to{opacity:1}}#column-center{flex:3;position:relative;width:100%}@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{filter:brightness(80%);transform:translate3d(-25vw,0,0)}}@media only screen and (min-width:601px)and (max-width:925px){#column-center{bottom:0;left:0;position:fixed!important;right:0;top:0;transform:translateZ(0)}body.animation-level-2 #column-center{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:before{transform:rotate(180deg)}}.chats-container{height:100%}.chat{align-items:center;display:flex!important;flex-direction:column;transition:transform var(--tabs-transition),filter var(--tabs-transition);width:100%}body.animation-level-0 .chat{transition:none!important}.chat:not(.active):not(:last-child){filter:brightness(.8)}@media only screen and (min-width:926px){.chat:not(.active){transform:translate3d(calc((100vw - min(40vw, 420px))*-.25),0,0)}.chat:not(.active):last-child{transform:translate3d(calc(100vw - min(40vw, 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;user-select:none!important}.chat-background{background-color:#e6ebee;overflow:hidden}html.night .chat-background{background-color:var(--border-color)}.chat-background.no-transition:before{transition:none!important}.chat-background,.chat-background-item{bottom:0;left:0;position:absolute!important;right:0;top:0}.chat-background-item.is-image{background-color:inherit;background-image:url(assets/img/bg.jpeg);background-position:50%;background-size:cover}.chat-background-item.is-pattern{align-items:center;background-color:#000!important;background-image:none!important;background-repeat:repeat-x;background-size:contain;display:flex;justify-content:center;margin:0!important}@media only screen and (min-width:1276px){.chat-background-item.is-pattern{height:150%;top:-25%}}body.animation-level-2 .chat-background-item{opacity:0;transition:opacity var(--transition-standard-out)}body.animation-level-2 .chat-background-item.is-visible:not(.backwards){opacity:1;transition:opacity var(--transition-standard-in)}@media only screen and (min-width:1276px){body.animation-level-2 .chat-background-item{margin:-18.5rem 0 -22rem;transform:scale(1);transform-origin:left center;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(.666666667);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)!important}}.chat-background-item-canvas{--opacity-max:1;opacity:var(--opacity-max);position:absolute;width:100%}.chat-background-item:not(.is-dark) .chat-background-item-pattern-canvas{mix-blend-mode:soft-light}.chat-background-item-color-canvas{height:100%;-webkit-mask-position:center;mask-position:center;-webkit-mask-size:cover;mask-size:cover}.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){[dir=ltr] body.is-right-column-shown .chat .drops-container{right:calc(var(--right-column-width))}[dir=rtl] body.is-right-column-shown .chat .drops-container{left:calc(var(--right-column-width))}}@media only screen and (max-width:600px){.chat .drops-container{--padding:10px}}.chat .drop{--wrapper-padding:15px;max-width:696px}.chat[data-type=chat] .bubbles.is-chat-input-hidden .bubbles-date-group:last-of-type .bubbles-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);--button-size:2.125rem;--button-horizontal-margin:.125rem;align-items:center;border-radius:1rem;display:flex;flex:0 0 auto;flex-direction:column;justify-content:center;max-height:30rem;max-width:calc(100% - var(--chat-input-size) - .5rem);min-height:var(--chat-input-size);position:relative;width:calc(100% - var(--chat-input-size) - .5rem);z-index:3}.chat-input-wrapper:before{background-color:#fff;border-radius:inherit;bottom:0;box-shadow:0 1px 8px 1px rgba(0,0,0,.12);content:\" \";left:0;opacity:1;right:0;top:0}.chat-input-control,.chat-input-wrapper:before{background-color:var(--surface-color);position:absolute}.chat-input-control{--padding-vertical:.3125rem;--padding-horizontal:var(--chat-input-inner-padding);--padding:var(--padding-vertical) var(--padding-horizontal);height:var(--chat-input-size);margin:0 auto;padding:var(--padding);visibility:hidden;width:auto;z-index:3}.chat-input-control:before{opacity:0}.chat-input-control-button{height:2.5rem;justify-content:center;padding:0 .625rem}@media only screen and (max-width:600px){.chat-input-control-button{font-size:15px}}[dir=ltr] .chat-input-control-button:before{margin-right:10px}[dir=rtl] .chat-input-control-button:before{margin-left:10px}.fake-selection-wrapper,.selection-wrapper{max-width:calc(100% - var(--chat-input-padding)*2);position:absolute;top:0;width:28.75rem}.chat-input-control,.selection-wrapper{opacity:0}.selection-wrapper{background-color:var(--surface-color)}.selection-wrapper:before{content:none}.selection-wrapper .selection-container{align-items:center;border-radius:inherit;display:flex;font-size:15px;height:100%;justify-content:space-between;padding:inherit;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.selection-wrapper .selection-container-left,.selection-wrapper .selection-container-right{align-items:center;display:flex;justify-content:space-between;transform:translateX(0)}.selection-wrapper .selection-container-right{flex:0 0 auto}.selection-wrapper .selection-container-count{color:var(--primary-text-color);flex-grow:1;font-weight:var(--font-weight-bold);text-transform:capitalize;white-space:nowrap}[dir=ltr] .selection-wrapper .selection-container .btn-icon{margin-left:6px;margin-right:5px}[dir=rtl] .selection-wrapper .selection-container .btn-icon{margin-left:5px;margin-right:6px}.selection-wrapper .selection-container .btn-icon{height:42px;line-height:42px;width: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}}[dir=ltr] .selection-wrapper .selection-container-forward:before{margin-right:14px}[dir=rtl] .selection-wrapper .selection-container-forward:before{margin-left:14px}[dir=ltr] .selection-wrapper .selection-container-delete{margin-left:.375rem;margin-right:.625rem}[dir=rtl] .selection-wrapper .selection-container-delete{margin-left:.625rem;margin-right:.375rem}[dir=ltr] .selection-wrapper .selection-container-delete:before{margin-right:10px}[dir=rtl] .selection-wrapper .selection-container-delete:before{margin-left:10px}.fake-wrapper{position:absolute;visibility:hidden;z-index:-1}[dir=ltr] .fake-rows-wrapper{left:var(--padding-horizontal)}[dir=rtl] .fake-rows-wrapper{right:var(--padding-horizontal)}.fake-rows-wrapper{top:0;width:calc(100% - var(--chat-input-size) - var(--padding-horizontal)*2 - .5rem)}.rows-wrapper-wrapper{display:flex;width:100%}.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 .15s}.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control{transition:opacity .1s 75ms,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 .1s 0s,visibility 0s .2s}[dir=ltr] .rows-wrapper{border-bottom-right-radius:0}[dir=rtl] .rows-wrapper{border-bottom-left-radius:0}.rows-wrapper{transform:translateX(0) scaleX(1)}.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}}[dir=ltr] .rows-wrapper .bubble-tail{right:-8.4px}[dir=rtl] .rows-wrapper .bubble-tail{left:-8.4px}.rows-wrapper .bubble-tail{fill:var(--surface-color);bottom:-1px;height:20px;position:absolute;transform:scaleX(-1);width:11px}.is-rtl .rows-wrapper .bubble-tail{transform:scaleX(1)}.rows-wrapper .attach-file.menu-open{background-color:var(--light-primary-color)!important;color:var(--primary-color)}.rows-wrapper .attach-file.btn-disabled{opacity:var(--disabled-opacity)}.rows-wrapper>div{align-items:center;background-color:var(--surface-color);border-radius:1rem;display:flex;justify-content:space-between;padding:var(--padding);position:relative;width:100%}.rows-wrapper .reply-wrapper{align-items:center;height:0;justify-content:flex-start;margin-bottom:-.5625rem;opacity:0;padding:.5625rem var(--padding-horizontal) 0;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:2}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-bottom:-.3125rem;padding-top:.3125rem}}.chat.is-helper-active .rows-wrapper .reply-wrapper{height:45px;opacity:1;pointer-events:inherit}.rows-wrapper .reply-wrapper .reply{flex:1 1 auto;margin-left:.625rem;margin-right:.625rem;order:1}.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:var(--secondary-text-color)!important;height:1.125rem}.rows-wrapper .reply-wrapper .reply .peer-title{font-weight:400}[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu{left:3.125rem}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu{right:3.125rem}.rows-wrapper .reply-wrapper .btn-menu{bottom:calc(100% + .5rem);top:auto;transform:scale(1)!important}[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu-item{padding-right:1.5rem}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu-item{padding-left:1.5rem}.rows-wrapper .reply-wrapper .btn-menu-item-text{order:1}[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{margin-right:var(--icon-margin)}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{margin-left:var(--icon-margin)}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{--size:1.25rem;margin:0;order:0}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-background,.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-border{display:none}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-check use{stroke:var(--primary-text-color)}@media only screen and (max-width:600px){[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu{left:calc(var(--padding-horizontal)*-1)}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu{right:calc(var(--padding-horizontal)*-1)}}.rows-wrapper .input-message-input{margin-top:-1px;max-height:27.5rem!important}@media only screen and (max-height:30rem){.rows-wrapper .input-message-input{max-height:max(36px,calc(100vh - 10rem))}}@media only screen and (max-width:600px){.rows-wrapper .input-message-input{max-height:10rem}}.rows-wrapper .input-message-input[data-inline-placeholder]:after{color:#a2acb4;content:attr(data-inline-placeholder);pointer-events:none}.rows-wrapper .new-message-wrapper{--send-as-size:1.875rem;--send-as-margin-left:.25rem;--send-as-margin-right:.375rem;--send-as-total-size:calc(var(--send-as-size) + var(--send-as-margin-left) + var(--send-as-margin-right));--commands-size:2.375rem;--commands-margin-left:.25rem;--commands-margin-right:.375rem;--commands-total-size:calc(var(--commands-size) + var(--commands-margin-left) + var(--commands-margin-right));--offset-translateX:0px;align-items:flex-end;min-height:var(--chat-input-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands,.rows-wrapper .new-message-wrapper .new-message-send-as-container{bottom:calc(var(--padding-vertical) + .4375rem);cursor:pointer;flex:0 0 auto;opacity:0;position:absolute;transform:scale(0);z-index:2}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-bot-commands{margin-left:var(--commands-margin-left)}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-bot-commands{margin-right:var(--commands-margin-left)}.rows-wrapper .new-message-wrapper .new-message-bot-commands{align-items:center;background-color:var(--primary-color);border-radius:1.875rem;cursor:pointer;display:flex;height:1.875rem;justify-content:center;width:var(--commands-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{position:relative}.rows-wrapper .new-message-wrapper .new-message-bot-commands-icon-scale{align-items:center;display:flex;justify-content:center;transform:scale(.875)}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{--color:#fff}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container{margin-left:var(--send-as-margin-left)}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container{margin-right:var(--send-as-margin-left)}.rows-wrapper .new-message-wrapper .new-message-send-as-container{background:none!important;height:var(--send-as-size);width:var(--send-as-size)}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{right:auto}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{left:auto}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{left:calc(var(--padding-horizontal)*-1 - .25rem)!important}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{right:calc(var(--padding-horizontal)*-1 - .25rem)!important}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{height:auto;max-height:20rem;max-width:20rem;top:auto;transform:scaleX(1);width:auto}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item{height:2.25rem}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-header{height:1.875rem}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon{margin-right:calc(var(--icon-margin) - .5rem)}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon{margin-left:calc(var(--icon-margin) - .5rem)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon.active:before{--offset:-.125rem;border:.0625rem solid var(--primary-color);border-radius:inherit;bottom:var(--offset);content:\" \";left:var(--offset);position:absolute;right:var(--offset);top:var(--offset)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-text{display:flex;flex-direction:column;justify-content:center;line-height:1!important;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-subtitle{font-size:.8125rem;font-weight:400}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar{opacity:0;pointer-events:none;position:absolute;transform:scale(0)}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible:not(.backwards){opacity:1;transform:scale(1)}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible.animating{transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .new-message-send-as-close{align-items:center;background-color:var(--primary-color);border-radius:50%;color:#fff;display:flex;font-size:1.375rem;height:inherit;justify-content:center;width:inherit;z-index:1}.rows-wrapper .new-message-wrapper.has-offset[data-offset=as]{--offset-translateX:var(--send-as-total-size)}.rows-wrapper .new-message-wrapper.has-offset[data-offset=commands]{--offset-translateX:48px}.rows-wrapper .new-message-wrapper.has-offset .input-message-container,.rows-wrapper .new-message-wrapper.has-offset .toggle-emoticons{transform:translateX(0)}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .toggle-emoticons{transform:translateX(var(--offset-translateX))}[dir=ltr] .rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{margin-right:var(--translateX)}[dir=rtl] .rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{margin-left:var(--translateX)}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{--translateX:calc(var(--offset-translateX));transform:translate(var(--translateX))}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-bot-commands,.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-send-as-container{opacity:1;transform:scale(1)}.rows-wrapper .new-message-wrapper.has-offset.animating .input-message-container,.rows-wrapper .new-message-wrapper.has-offset.animating .toggle-emoticons{transition:transform var(--transition-standard-in)}.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-bot-commands,.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-send-as-container{transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + 1.125rem)}@media only screen and (max-height:569px),only screen and (max-width:600px){.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + .875rem)}}.rows-wrapper .new-message-wrapper .btn-menu.top-left{right:calc(var(--padding-horizontal)*-1 - .125rem)}.rows-wrapper .new-message-wrapper .btn-menu.top-right{left:calc(var(--padding-horizontal)*-1 - .125rem)}.rows-wrapper .btn-icon{color:var(--secondary-text-color);flex:0 0 auto;font-size:1.5rem;height:var(--button-size);margin-bottom:5px;margin-left:var(--button-horizontal-margin);margin-right:var(--button-horizontal-margin);margin-top:0;padding:0;width:var(--button-size)}.rows-wrapper .btn-icon.active{color:var(--primary-color)}.input-message-container{align-items:center;align-self:center;display:flex;flex:1 1 auto;max-height:inherit;min-height:calc(var(--chat-input-size) - var(--padding-vertical)*2);overflow:hidden;position:relative;width:1%}.input-message-container .scrollable{position:relative}.input-message-input{--custom-emoji-size:var(--messages-custom-emoji-size);background:none;border:none;font-size:var(--messages-text-size);line-height:var(--line-height);outline:none;overflow-y:none;padding:.5rem .5625rem;resize:none;width:100%}.input-message-input pre{display:inline;margin:0}body.animation-level-2 .input-message-input{transition:height .1s}.bubbles{--translateY:0;flex:1 1 auto;position:relative;transform:translate3d(0,var(--translateY),0);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .bubbles{transition:none!important}.chat[data-type=chat] .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-78px;transition:transform var(--transition-standard-in)}@media only screen and (max-width:600px){.chat[data-type=chat] .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-58px}}.chat[data-type=chat] .bubbles.is-chat-input-hidden.is-selecting:not(.backwards) .bubbles-inner{transform:translateY(calc(var(--translateY)*-1));transition:transform var(--transition-standard-in)}.bubbles>.scrollable{display:block;height:auto}@media only screen and (min-width:1276px){body.is-right-column-shown .bubbles{transform:translate3d(calc(var(--right-column-width)/-2),var(--translateY),0);transition:transform var(--transition-standard-in)}}body.animation-level-2 .bubbles.is-selecting .bubbles-group-avatar,body.animation-level-2 .bubbles.is-selecting .is-in .bubble-content-wrapper{transition:var(--bubble-transition-out)}body.animation-level-2 .bubbles.is-selecting:not(.backwards) .bubbles-group-avatar,body.animation-level-2 .bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transition:var(--bubble-transition-in)}.bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transform:translateX(2.5rem) scale(1)}.bubbles.is-selecting:not(.backwards) .bubbles-group-avatar{transform:translate3d(2.5rem,0,0) scale3d(.76,.76,1)}.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 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 - 0.625rem)}.bubbles .search-group.search-group-messages{padding:.25rem 0 .5rem}.bubbles-inner{display:flex;flex-direction:column;justify-content:flex-end;margin:0 auto;max-width:var(--messages-container-width);min-height:100%;padding:0 .8125rem;transform:translateY(0);transition:transform var(--transition-standard-out);width:100%}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:after{content:\" \";height:.125rem}[dir=ltr] .bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-left:45px}[dir=rtl] .bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-right:45px}@media only screen and (max-width:600px){.bubbles-inner.is-chat .is-in .bubble-content-wrapper{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% - var(--message-beside-button-margin)*-1)!important}.bubbles-inner.is-chat .message,.bubbles-inner.is-chat .name,.bubbles-inner:not(.is-channel) .message,.bubbles-inner:not(.is-channel) .name{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 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;transform:none!important;transition:opacity var(--layer-transition),visibility 0s .2s!important;visibility:hidden}.bubbles-go-mention{--translateY:0;cursor:default;opacity:0;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s .2s!important;visibility:hidden}.bubbles-go-mention.is-visible{cursor:pointer;opacity:1;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s 0s!important;visibility:visible}.chat-secondary-button{align-items:center;background-color:var(--surface-color)!important;border-radius:50%;box-shadow:0 1px 8px 1px rgba(0,0,0,.12)!important;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;position:absolute}body.animation-level-0 .chat-secondary-button{transition:none!important}.chat-secondary-button:before{position:relative}.chat-secondary-button:after{border-radius:inherit;bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}html.no-touch .chat-secondary-button:active:after,html.no-touch .chat-secondary-button:hover:after{background-color:var(--light-secondary-text-color)}[dir=ltr] .bubbles-corner-button{right:var(--chat-input-padding)}[dir=rtl] .bubbles-corner-button{left:var(--chat-input-padding)}.bubbles-corner-button{bottom:calc(var(--chat-input-size) + var(--bottom) + 10px);overflow:visible;z-index:2}[dir=ltr] .bubbles-corner-button .badge{right:-.25rem}[dir=rtl] .bubbles-corner-button .badge{left:-.25rem}.bubbles-corner-button .badge{position:absolute;top:-.25rem}.bubbles-corner-button .badge.badge-primary:not(.badge-gray){background-color:var(--chatlist-status-color)}@media only screen and (max-width:600px){[dir=ltr] .bubbles-corner-button .badge{right:.1875rem}[dir=rtl] .bubbles-corner-button .badge{left:.1875rem}.bubbles-corner-button .badge{top:-.75rem}}.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 var(--transition-standard-out)}body.is-calling:not(.backwards) .topbar,body.is-calling:not(.backwards) .topbar-call-container{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;cursor:pointer!important;margin-bottom:var(--pinned-floating-height);max-height:var(--topbar-height)!important;min-height:var(--topbar-height)!important;position:relative;width:100%;z-index:1}.topbar:before{box-shadow:0 1px 5px -1px rgba(0,0,0,.21);content:\" \";height:calc(var(--topbar-height) + var(--pinned-floating-height) - var(--topbar-floating-call-height));left:0;pointer-events:none;position:absolute;right:0;top:0}.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}[dir=ltr] .chat:first-child .topbar .chat-info{padding-left:.1875rem}[dir=rtl] .chat:first-child .topbar .chat-info{padding-right:.1875rem}}@media only screen and (min-width:1276px){.topbar .pinned-container-wrapper-utils{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 var(--transition-standard-in)}body.animation-level-0 .topbar .pinned-container-wrapper-utils{transition:none}}.topbar .sidebar-close-button{position:absolute}.topbar .user-title{align-items:center;display:flex;font-size:1rem;font-weight:var(--font-weight-bold);line-height:1.5rem;max-width:calc(100% - 1.5rem)}.topbar .user-title span.emoji{vertical-align:inherit}.topbar .info,.topbar .peer-title{line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.topbar .info:not(:empty){margin-top:1px}.topbar .btn-menu-toggle .btn-menu{max-height:calc(var(--vh)*100 - 4.375rem);top:calc(100% + 7px)}@media only screen and (max-width:600px){.topbar .btn-menu-toggle .btn-menu{max-height:calc(var(--vh)*100 - 3.75rem);top:29px}.topbar .btn-menu-toggle{margin-left:0}}[dir=ltr] .topbar .chat-info{padding-left:49px}[dir=rtl] .topbar .chat-info{padding-right:49px}.topbar .chat-info{flex:1 1 auto;max-width:calc(100% - var(--utils-width));overflow:hidden}@media only screen and (max-width:600px){[dir=ltr] .topbar .chat-info{padding-left:52px}[dir=rtl] .topbar .chat-info{padding-right: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{align-items:center;display:flex;flex:1 1 auto;height:3.5rem;justify-content:space-between;max-height:3.5rem;max-width:100%}.topbar .chat-utils{align-items:center;display:flex;flex:0 0 auto}@media only screen and (min-width:1276px){.topbar .chat-utils{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 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}}[dir=ltr] .topbar .chat-join{margin-right:.5rem}[dir=rtl] .topbar .chat-join{margin-left:.5rem}.topbar .chat-join{font-size:.875rem;font-weight:400;height:2.25rem;padding:0 1.375rem;width:auto}.topbar .chat-join:not(.hide)+.chat-mute-button{display:none}[dir=ltr] .topbar .content{padding-left:1.125rem}[dir=rtl] .topbar .content{padding-right:1.125rem}.topbar .content{flex:1 1 auto;max-width:100%;overflow:hidden}.topbar .person{align-items:center;display:flex}.topbar .person-avatar{flex:0 0 auto}.topbar .person .bottom{color:var(--secondary-text-color);font-size:.875rem}.topbar .person .bottom .online{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}[dir=ltr] .chat:not([data-type=chat]) .topbar .content{padding-left:16px}[dir=rtl] .chat:not([data-type=chat]) .topbar .content{padding-right:16px}[dir=ltr] .topbar-call-container{left:1px;right:0}[dir=rtl] .topbar-call-container{left:0;right:1px}.topbar-call-container{color:#fff;cursor:pointer!important;height:var(--topbar-call-height)!important;min-height:auto!important;position:absolute;top:calc(var(--topbar-call-height)*-1);z-index:2}body:not(.has-chat) .topbar-call-container{background:none!important}@media only screen and (max-width:925px){[dir=ltr] .topbar-call-container{left:0}[dir=rtl] .topbar-call-container{right:0}}.topbar-call-container .btn-icon{color:inherit;flex:0 0 auto;height:2.5rem;padding:0;width:2.5rem}.topbar-call-container .peer-title{font-weight:var(--font-weight-bold);white-space:nowrap}@media only screen and (max-width:480px){.topbar-call-container:not(.is-call) .topbar-call-left,.topbar-call-container:not(.is-call) .topbar-call-right{width:auto}.topbar-call-container:not(.is-call) .group-call-description{display:none}.topbar-call-container.is-call .topbar-call-left,.topbar-call-container.is-call .topbar-call-right{width:6.25rem}.topbar-call-container.is-call .call-description:not(.has-duration){display:none}}.topbar-call-left,.topbar-call-right{flex:0 0 auto;width:12rem}.topbar-call-left{align-items:center;display:flex}[dir=ltr] .topbar-call-left .btn-icon{margin-right:.375rem}[dir=rtl] .topbar-call-left .btn-icon{margin-left:.375rem}.topbar-call-left .call-description{white-space:nowrap}.topbar-call-left .call-description-duration{font-weight:var(--font-weight-bold)}.topbar-call-center{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media only screen and (min-width:1276px){.topbar-call-center{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 var(--transition-standard-in)}body.animation-level-0 .topbar-call-center{transition:none}.topbar-call-center{padding:0 calc(var(--right-column-width)/2)}}.topbar-call-right{display:flex;justify-content:flex-end}@media only screen and (min-width:1276px){.topbar-call-right{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 var(--transition-standard-in)}body.animation-level-0 .topbar-call-right{transition:none}}.topbar-call-weave{bottom:-1.125rem;left:0;pointer-events:none;position:absolute;right:0;top:0;transform:scale(var(--topbar-floating-scaleX),-1);transform-origin:left center;z-index:-1}.is-rtl .topbar-call-weave{transform-origin:right center}@media only screen and (min-width:1276px){.topbar-call-weave{transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-weave{transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-weave{transition:none}}.topbar-call-weave-canvas{height:100%;width:100%}.topbar .back-unread-badge{position:absolute;right:-.5rem;top:-.25rem}@media only screen and (min-width:601px){.topbar .back-unread-badge{display:none}}@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}.bubbles-group{position:relative}.bubbles-group-avatar{bottom:.25rem;cursor:pointer;pointer-events:all;position:sticky!important;top:0}.bubbles.is-selecting .bubbles-group-avatar{transform:translateZ(0) scaleX(1);transform-origin:bottom}.bubbles-group-avatar.is-gesturing-reply{transform:translateX(0)}.bubbles-group-avatar.is-gesturing-reply.animating.backwards{transition:transform var(--transition-standard-out)}.bubbles-group-avatar-container{bottom:0;display:flex;flex-direction:column-reverse;left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:2}.bubble{--line-height:var(--messages-line-height);display:flex;flex-wrap:wrap;margin:0 auto .125rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:1}.bubble.is-gesturing-reply{transform:translateX(0)}.bubble.is-gesturing-reply.animating.backwards{transition:transform var(--transition-standard-out)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon{align-items:center;background-color:var(--message-highlightning-color);border-radius:50%;color:#fff;display:flex;height:var(--message-beside-button-size);justify-content:center;opacity:0;position:absolute;right:var(--message-beside-button-margin);top:50%;transform:translateY(-50%);transform:translateY(-50%) scale(.6);visibility:hidden;width:var(--message-beside-button-size)}.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{transform:translateY(-50%) scale(1);visibility:visible}.bubble.is-highlighted:after,.bubble.is-selected:after,.bubble:after{bottom:-.0625rem;content:\" \";left:-50%;position:absolute;top:-.0625rem;z-index:-1}.bubble.is-highlighted:after{background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-highlighted:after{animation:bubbleSelected 2s linear}@media only screen and (max-width:600px){.bubble.is-first-unread{max-width:none}}.bubble.is-first-unread:before{background-color:var(--surface-color);color:var(--primary-color);content:\"Unread messages\";font-size:15px;font-weight:var(--font-weight-bold);height:30px;line-height:2.1;margin-bottom:.25rem;margin-left:-50%;margin-right:-50%;position:relative;text-align:center;z-index:2}.bubble.is-first-unread.is-highlighted:after,.bubble.is-first-unread.is-selected:after{top:calc(.0625rem + 30px)}.bubble.is-selected:after{background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-selected:after{animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-selected.backwards:after{animation:fade-in-backwards-opacity .2s linear forwards}.bubble:after,.bubble:before{display:block;width:200%}.bubble.is-multiple-documents:after,.bubble.is-multiple-documents:before{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{display:flex;left:0;margin:0;position:absolute;z-index:3}.bubble-select-checkbox .checkbox-box-border{border-color:var(--message-checkbox-border-color)}.bubble-select-checkbox .checkbox-box-background{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:0 0 3px 0 rgba(0,0,0,.4)}.bubbles.is-selecting .bubble:not(.is-album) .attachment,.bubbles.is-selecting .bubble:not(.is-album) .audio,.bubbles.is-selecting .bubble:not(.is-album) .document,.bubbles.is-selecting .bubble:not(.is-album) poll-element{pointer-events:none!important}.bubbles.is-selecting .bubble a,.bubbles.is-selecting .bubble img,.bubbles.is-selecting .bubble video{pointer-events:none}.bubble-content{background-color:var(--message-background-color);border-radius:12px;box-shadow:0 1px 2px 0 rgba(16,35,47,.15);display:flex;flex-direction:column-reverse;max-width:100%;min-width:56px;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:2}body.animation-level-0 .bubble-content{transition:none}html.is-touch body:not(.no-select) .chat:not(.no-forwards) .bubbles.is-selecting .bubble-content,html.no-touch .chat:not(.no-forwards) .bubbles:not(.is-selecting) .bubble-content{-webkit-user-select:text;-moz-user-select:text;user-select:text}.bubble-content.hover-reaction-visible .bubble-beside-button{transform:translateX(1.125rem)}.bubble.is-out .bubble-content.hover-reaction-visible .bubble-beside-button{transform:translateX(-1.125rem)}.bubble.is-out .bubble-content.hover-reaction-visible .bubble-beside-button.goto-original{transform:translateX(-1.125rem) rotate(180deg)}.bubble-hover-reaction{--size:1.875rem;--offset:calc(var(--size)*-0.75);align-items:center;background-color:var(--surface-color);border-radius:var(--size);bottom:0;box-shadow:var(--menu-box-shadow);cursor:pointer;display:flex;height:1.625rem;justify-content:center;opacity:0;position:absolute;right:var(--offset);transform:scale(.8);width:var(--size);z-index:2}body.animation-level-2 .bubble-hover-reaction{transition:opacity var(--btn-corner-transition),transform var(--btn-corner-transition)}.bubble-hover-reaction.is-visible:not(.backwards){opacity:1;transform:scale(1)}.bubble-hover-reaction-sticker{height:1.125rem;position:relative;width:1.125rem}.bubble.service{max-width:var(--messages-container-width)}.bubble.service .bubble-content{box-shadow:none;margin:0 auto;max-width:100%}.bubble.is-date{font-weight:var(--font-weight-bold);opacity:.99999;padding-bottom:.375rem;pointer-events:none;position:sticky;top:.25rem;transition:opacity .3s ease;z-index:2}.bubble.is-date:after,.bubble.is-date:before{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[data-type=chat] .bubble.is-date .bubble-content,.chat[data-type=discussion] .bubble.is-date .bubble-content{cursor:pointer;pointer-events:all}.bubbles:not(.has-sticky-dates) .bubble.is-date{visibility:hidden}.bubbles.has-sticky-dates .bubble.is-date.is-fake{display:none}.bubble.is-date.is-fake{left:50%;opacity:1!important;position:absolute;top:0;transform:translateX(-50%);transition:none!important;visibility:visible!important}.bubble-beside-button{align-items:center;background:var(--message-highlightning-color);border-radius:50%;bottom:0;color:var(--badge-text-color);cursor:pointer;display:flex;font-size:1.5rem;height:var(--message-beside-button-size);justify-content:center;position:absolute;right:var(--message-beside-button-margin);transform:translateX(0);width:var(--message-beside-button-size)}html.no-touch .bubble-beside-button{opacity:0}html.no-touch body.animation-level-2 .bubble-beside-button{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.bubble-view-button{align-items:center;border:1px solid var(--message-primary-color);border-radius:6px;color:var(--message-primary-color);display:flex;height:2rem;justify-content:center;margin:0 .5625rem .5rem;text-decoration:none!important;width:auto}html.no-touch .bubble-view-button:active,html.no-touch .bubble-view-button:hover{background-color:var(--light-filled-message-primary-color)}.bubble-view-button .c-ripple__circle{background-color:var(--message-primary-color);opacity:.08}.message .bubble-view-button{margin:.375rem 0 -.375rem;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.bubble-view-button+.reactions-block{margin-top:.375rem}html.no-touch .bubble:active .bubble-beside-button,html.no-touch .bubble:hover .bubble-beside-button{opacity:1}.bubble .forward{font-size:1.25rem}.bubble.is-group-last{margin-bottom:.5rem}.bubble.is-group-last:after{bottom:-.25rem}.bubbles-inner.is-chat .bubble.is-group-last.is-in>.bubble-select-checkbox{bottom:.1875rem}.bubble.is-group-first:after{top:-.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:-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;min-width:100%}.bubble.webpage .document{height:3.375rem}@media only screen and (max-width:600px){.bubble.webpage .document{padding-left:44px}}.bubble.webpage .has-document{display:flex;flex-direction:column}.bubble.webpage .has-document .preview-resizer{order:1}.bubble .preview-resizer{display:flex}.bubble img.emoji{height:18px;vertical-align:bottom;width:18px}.bubble .thumbnail{position:absolute}.bubble .canvas-thumbnail{border-radius:inherit}.bubble .canvas-dots{z-index:1}.bubble.emoji-big{--emoji-size:1rem;font-size:0}.bubble.emoji-big .bubble-content{line-height:1}.bubble.emoji-big .attachment{--custom-emoji-size:var(--emoji-size);border-radius:0!important}.bubble.emoji-big .attachment img.emoji{height:var(--emoji-size);max-height:64px;max-width:64px;width:var(--emoji-size)}.bubble.emoji-big .attachment .custom-emoji,.bubble.emoji-big .attachment .emoji{display:inline-block}.bubble.emoji-big:not(.sticker) .attachment{display:block;font-size:var(--emoji-size);max-height:-moz-fit-content!important;max-height:fit-content!important;padding-bottom:1.25rem;padding-top:.25rem;white-space:pre-wrap;word-break:break-word}.bubble.emoji-big:not(.sticker) .attachment span.emoji{height:auto;width:auto}.bubble.emoji-big:not(.sticker) .message{margin-top:-1.125rem}.bubble.emoji-big:not(.sticker) .bubble-content{max-width:min(420px,100%)}.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:var(--message-highlightning-color)}.bubble.emoji-big:not(.sticker) .bubble-content,.bubble.sticker .bubble-content{align-self:flex-start}.bubble.emoji-big:not(.sticker) .message,.bubble.sticker .message{margin-left:auto;position:relative!important;right:0!important}.bubble.sticker .attachment{border-radius:0;position:absolute;z-index:1}.bubble.round .attachment{height:var(--round-video-size)!important;max-height:var(--round-video-size)!important;max-width:var(--round-video-size)!important;width: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{border-radius:inherit;cursor:pointer;display:flex;justify-content:center;max-width:100%;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .attachment img,.bubble .attachment video{max-width:100%}.bubble .attachment .download{align-items:center;cursor:pointer;display:flex;height:100%;justify-content:center;left:0;position:absolute;top:0;width:100%}.bubble .attachment .download span{background-color:var(--message-time-background);color:#fff;font-size:23px;text-align:center}.bubble .attachment .download~.video-play,.bubble .attachment .preloader-container~.video-play{display:none}.bubble .media-container-aspecter{margin:0 auto;position:relative;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{animation:thumbnail-fade-in-opacity .2s ease-in-out forwards}.bubble .preloader-container{z-index:2}.bubble:not(.sticker) .attachment{max-height:min(340px,100%);max-width:min(420px,100%);width:-moz-max-content;width:max-content}.bubble img:not(.emoji),.bubble video{height:100%;-o-object-fit:cover;object-fit:cover;width: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-height:none;max-width:min(451px,100%)}.bubble .album-item{background-color:var(--message-highlightning-color);cursor:pointer;max-width:100%;overflow:hidden;position:absolute}body.animation-level-0 .bubble .album-item{transition:none!important}.bubble .album-item img,.bubble .album-item video,.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 var(--transition-standard-out)}.bubble .album-item.is-selected.animating .album-item-media{transition:transform var(--transition-standard-out),border-radius var(--transition-standard-out)}.bubble .album-item.is-selected:not(.backwards){transition:border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards) .album-item-media{transform:scale(.883333);transition:transform var(--transition-standard-in),border-radius var(--transition-standard-in)}.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:active,html.no-touch .bubble a:hover{text-decoration:underline}.bubble-first{align-items:center;justify-content:center;margin-top:.5rem;max-width:100%;order:-1}body.animation-level-0 .bubble-first{flex:1 1 auto}.bubble-first .attachment{pointer-events:none}.bubble-first .bubble-content-wrapper{max-width:100%}.bubble-first.empty-bubble-placeholder{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}body.animation-level-2 .bubble-first.empty-bubble-placeholder .bubble-content-wrapper{transition:var(--bubble-transition-in)}.bubble-first.empty-bubble-placeholder.has-description .service-msg{align-items:flex-start!important;flex-direction:column;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-size:1rem!important;font-weight:var(--font-weight-bold)}.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{font-size:1.25rem;margin-left:-.1875rem;margin-right:.25rem;vertical-align:bottom}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-list-bullet{margin-right:.3125rem}.bubbles.has-groups .bubble-first.empty-bubble-placeholder{pointer-events:none}.bubbles.has-groups .bubble-first.empty-bubble-placeholder .bubble-content-wrapper{opacity:0;transform:scale3d(.8,.8,1) translateX(0)}.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{cursor:pointer;height:200px;margin-top:.75rem!important;position:relative;width:200px}.bubble-first .time{display:none!important}.bubble-first:after,.bubble-first:before{display:none}.bubble .web{line-height:var(--line-height);margin:.125rem 0 0;max-width:100%;overflow:hidden}.bubble .web+.time{display:block}.bubble .web .preview{border-radius:4px;cursor:pointer;max-height:min(340px,100%);max-width:min(420px,100%);overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;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 .text,.bubble .web .title,.bubble .web .webpage-name{font-size:var(--messages-secondary-text-size);line-height:var(--messages-secondary-line-height)}.bubble .web .webpage-name{text-decoration:none}html.no-touch .bubble .web .webpage-name:active,html.no-touch .bubble .web .webpage-name:hover{text-decoration:underline}.bubble .web .text{margin-top:1px;word-break:break-word}.bubble .web .quote{display:flex;max-width:100%;overflow:hidden;width:100%}.bubble .web .quote-text{margin-left:-.625rem;max-width:100%;padding-left:.625rem;width:100%}.bubble .web .quote:before{background-color:var(--primary-color);border-radius:.125rem;content:\" \";flex:0 0 auto;margin:.1875rem .5rem .125rem 0;width:.125rem}.bubble .reply{--font-size:var(--messages-secondary-text-size)}.bubble .document-name{font-size:var(--messages-text-size)}.bubble .document-size{font-size:var(--messages-secondary-text-size)}.bubble.is-square-photo .bubble-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{float:right;height:3rem;margin:.1875rem 0 0 .625rem;width:3rem}.bubble.is-square-photo .web .preview{margin:0;max-height:min(3rem,100%);max-width:min(3rem,100%)}.bubble .reply{border-radius:.25rem;cursor:pointer;margin:0 .375rem .375rem;min-width:10rem;padding:.25rem;width:auto}.bubble .reply-media{top:.125rem}.bubble .reply-content{height:auto;max-width:calc(100% - 1.25rem);min-height:32px;overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap}.bubble .message+.reply{margin-bottom:0}.bubble:not(.just-media) .reply{border-radius:6px}html.no-touch .bubble:not(.just-media) .reply:active,html.no-touch .bubble:not(.just-media) .reply:hover{background-color:var(--light-filled-message-primary-color)}.bubble.just-media .floating-part{background-color:var(--message-highlightning-color);border-radius:12px;margin:0;max-width:15rem;padding:.375rem .625rem;position:absolute;top:0;white-space:nowrap}@media only screen and (max-width:600px){.bubble.just-media .floating-part{max-width:calc(100vw - 1rem - 10px - 100%)}}.bubble.just-media .name{color:#fff!important;line-height:var(--line-height);padding:.375rem .625rem}.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;max-width:none!important;position:relative}.bubble.just-media .reply i,.bubble.just-media .reply-subtitle,.bubble.just-media .reply-title{color:#fff!important}.bubble.just-media .reply-border{background:#fff!important}.bubble.forwarded .attachment,.bubble.is-reply .attachment,.bubble:not(.hide-name) .attachment{border-top-left-radius:0;border-top-right-radius:0}.bubble .message,.bubble .service-msg{--custom-emoji-size:var(--messages-custom-emoji-size)}.bubble .message{color:var(--primary-text-color);font-size:var(--messages-text-size);line-height:var(--line-height);max-width:100%;padding:0 .5rem .375rem .625rem;position:relative;white-space:pre-wrap;word-break:break-word}.bubble .message .custom-emoji{display:inline-flex}.bubble .message:last-child{padding-top:6px}@media only screen and (max-width:600px){.bubble .audio,.bubble .document{--icon-size:2.25rem}}.bubble .audio .audio-title{font-weight:var(--font-weight-bold)}.bubble .audio .audio-ico{font-size:0}@media only screen and (max-width:600px){.bubble .audio{--icon-margin:.6875rem;height:2.375rem}.bubble .audio .audio-details{margin-bottom:0;margin-top:2px}.bubble .audio .audio-subtitle{margin-top:-1px}}.bubble .message.audio-message{width:335px}@media only screen and (max-width:600px){.bubble .message.audio-message{width:280px}}.bubble .message.audio-message,.bubble .message.voice-message{max-width:min(100%,335px)!important}@media only screen and (max-width:600px){.bubble .message.audio-message,.bubble .message.voice-message{max-width:min(100%,300px)!important}}.bubble.min-content .bubble-content{width:-moz-min-content;width:min-content}.bubble .message.voice-message .document-message{max-width:-moz-fit-content;max-width:fit-content}.bubble .message.audio-message,.bubble .message.voice-message{padding:8px!important}.bubble .message.call-message,.bubble .message.contact-message{min-width:200px;padding-left:8px}.bubble .message.contact-message .contact{cursor:pointer;display:flex;padding:2px 0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .message.contact-message .contact-avatar{color:#fff}.bubble .message.contact-message .contact-details{display:flex;flex-direction:column;margin-top:8px;padding-left:12px}.bubble .message.contact-message .contact-name{font-size:1rem;font-weight:var(--font-weight-bold)}.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{--icon-margin:.75rem;height:58px}@media only screen and (max-width:600px){.bubble .message.document-message .document{--icon-margin:.5rem;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 0 0}}.bubble .message.document-message .document-name{line-height:1.4;margin-top:1px;overflow:hidden;text-overflow:ellipsis}.bubble-call{cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding:.125rem 0 .125rem 2.5625rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble-call:before{font-size:1.5rem;left:.3125rem;position:absolute}.bubble-call-title{font-weight:var(--font-weight-bold)}.bubble-call-subtitle{align-items:center;color:var(--secondary-text-color);display:flex;font-size:var(--messages-secondary-text-size);line-height:var(--messages-secondary-line-height);margin-left:-.1875rem;margin-top:.0625rem}.bubble-call-subtitle.is-reason:before{margin-right:.0625rem}.bubble-call-subtitle:before{content:\"๎คŒ\";display:inline-block;font-size:1rem;transform:rotate(135deg)}.bubble-call-subtitle.arrow-red:before{color:var(--danger-color)}.bubble-call-subtitle.arrow-green:before{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 .time{align-self:flex-start;height:0}.bubble .document-message+.audio .time,.bubble .document-message+.document .time{display:none!important}.bubble.is-multiple-documents .message{border-radius:inherit;padding:0!important}.bubble.is-multiple-documents .document-container{border-radius:inherit;position:relative}.bubble.is-multiple-documents .document-container .document-selection{bottom:0;left:-75vw;position:absolute;top:0;width:200vw;z-index:-2}.bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before,.bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{background-color:var(--message-background-color);border-radius:inherit;bottom:0;content:\" \";left:0;position:absolute;right:0;top:0;z-index:-1}.bubble.is-multiple-documents .document-container.is-highlighted .document-selection{background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-selection{animation:bubbleSelected 2s linear}.bubble.is-multiple-documents .document-container.is-selected .document-selection{background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-selection{animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-selection{animation:fade-in-backwards-opacity .2s linear forwards}.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--margin-top:.25rem;--margin-left:.125rem;background:#fff;border-radius:50%;left:auto;margin-left:calc(var(--padding-left)*-1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto}@media only screen and (max-width:600px){.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--size:1.125rem}}.bubble.is-multiple-documents .document-container .bubble-select-checkbox:before{--inner-size:.125rem;border:2px solid var(--secondary-color);border-radius:inherit;content:\" \";height:calc(var(--size) - var(--inner-size)*2);left:var(--inner-size);position:absolute;top:var(--inner-size);width:calc(var(--size) - var(--inner-size)*2)}.bubble.is-multiple-documents .document-container:first-of-type .document-selection{top:-.0625rem}.bubble.is-multiple-documents .document-container:first-of-type .document-wrapper{border-top-left-radius:inherit;border-top-right-radius:inherit;padding-top:.5rem}.bubble.is-multiple-documents .document-container:last-of-type .document-selection{bottom:-.0625rem}.bubble.is-multiple-documents .document-container:last-of-type .document-wrapper{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;padding-bottom:.5rem}.bubble.is-multiple-documents.is-group-first .document-container:first-of-type .document-selection{top:-.25rem}.bubble.is-multiple-documents.is-group-last .document-container:last-of-type .document-selection{bottom:-.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{padding:.25rem .5rem}.bubble.is-multiple-documents .document-wrapper>.name{margin-top:-.1875rem;padding:0 0 .25rem}.bubble .message .audio .time,.bubble .message.contact-message .time,.bubble .message.poll-message .time{bottom:0;position:absolute;right:0}html:not(.is-safari) .bubble .message.voice-message{overflow:hidden}.bubble.is-message-empty .bubble-content-wrapper{width:-moz-min-content;width:min-content}.bubble.is-message-empty .message{background-color:var(--message-time-background);border-radius:.75rem;bottom:.1875rem;padding:0 .3125rem;position:absolute;right:.1875rem;z-index:2}.bubble.is-message-empty .message .time{align-items:center;display:flex;height:calc(var(--messages-time-text-size) + .375rem);margin:0;padding:0;white-space:nowrap}.bubble.is-message-empty .message .time .inner{bottom:auto;color:#fff;margin:inherit;right:auto}.bubble.is-message-empty .message .time .inner:after{color:#fff!important}.bubble.is-message-empty.with-replies:not(.sticker):not(.with-beside-replies) .message{bottom:55px}.bubble.is-message-empty.emoji-big .message,.bubble.is-message-empty.sticker .message,.bubble.is-message-empty.with-replies.round .message{bottom:0}.bubble.is-message-empty:not(.emoji-big) .reactions-block{max-width:-moz-fit-content;max-width:fit-content}.bubble.is-message-empty .reaction-block{--chosen-background-color:var(--primary-color)}html.no-touch .bubble.is-message-empty .reaction-block:not(.is-chosen):active:after,html.no-touch .bubble.is-message-empty .reaction-block:not(.is-chosen):hover:after{background-color:#fff}.bubble.with-reply-markup .bubble-content{min-width:100%}.bubble.with-replies .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble.with-beside-replies .bubble-content{min-height:5.5rem}.bubble .colored-name .premium-icon{color:inherit;opacity:.6}.bubble .time{cursor:pointer;direction:ltr;display:inline-flex;float:right;font-size:var(--messages-time-text-size);height:var(--messages-time-text-size);line-height:1;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;visibility:hidden;z-index:1}.bubble .time i{font-size:1.125rem;margin-right:.375rem}.bubble .time-icon{pointer-events:none}.bubble .time-icon:not(:first-child){margin-left:2px}.bubble .time i.edited{font-size:inherit;overflow:visible}.bubble .time .inner{align-items:center;bottom:0;color:var(--message-time-color);display:flex;height:var(--messages-time-text-size);line-height:1;padding:inherit;pointer-events:all;position:absolute;right:0;visibility:visible;white-space:nowrap}.bubble .time .inner:after{color:var(--message-status-color)}.bubble .time .tgico-pinnedchat{margin-right:.125rem}.bubble .time.is-block{display:block;float:none}.bubble.webpage .time{float:none}.bubble .video-play,.bubble .video-time{pointer-events:none}.bubble .video-time{--height:calc(var(--messages-time-text-size) + 0.375rem);align-items:center;background-color:var(--message-time-background);border-radius:var(--height);color:#fff;display:flex;font-size:var(--messages-time-text-size);height:var(--height);left:3px;line-height:1;padding:0 6px;position:absolute;top:3px;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:2}.bubble .video-time.can-autoplay:after{color:#fff;content:\"๎ฆƒ\";font-size:calc(var(--messages-time-text-size) + 8px);padding:0 1px 0 3px}[dir=ltr] .bubble .video-time.is-error:after{margin-left:1px}[dir=rtl] .bubble .video-time.is-error:after{margin-right:1px}.bubble .video-time.is-error:after{content:\"๎ฆญ\";font-size:calc(var(--messages-time-text-size) + 4px);padding:0}.bubble .extended-media-buy{align-items:center;-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:rgba(0,0,0,.3);border-radius:2rem;color:#fff;display:flex;font-size:var(--font-size-14);font-weight:var(--font-weight-bold);height:2.5rem;left:50%;padding:0 1rem;position:absolute;top:50%;transform:translate(-50%,-50%);white-space:nowrap;z-index:2}.bubble .extended-media-buy:before{font-size:1.125rem;margin-right:.25rem}.bubble pre{display:inline;margin:0}.bubble .anchor-url{text-decoration:underline}.bubble .video-play{align-items:center;background-color:var(--message-time-background);color:#fff;display:flex;font-size:2.125rem;justify-content:center;text-align:center;z-index:2}.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;user-select:none}.bubble .peer-title{cursor:pointer}.bubble .name{color:var(--primary-color);font-size:var(--messages-secondary-text-size);font-weight:var(--font-weight-bold)!important;line-height:calc(var(--messages-secondary-text-size) + .25rem);max-width:100%;overflow:hidden;padding:.375rem .625rem 0;text-overflow:ellipsis}.bubble .name .badge-fake{display:inline-block;margin-top:-2px;vertical-align:middle}.bubble:not(.webpage).photo:not(.is-reply) .bubble-content>.name,.bubble:not(.webpage).video:not(.is-reply) .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).photo .topic-name-button-container,.bubble:not(.webpage).video .topic-name-button-container{margin-bottom:0}.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):not(.forwarded).hide-name .reply,.bubble:not(.sticker):not(.emoji-big):not(.forwarded):not(.is-group-first) .reply{margin-top:6px}.bubble .bubble-tail{display:none}.bubble.can-have-tail.is-group-last .bubble-tail{fill:var(--message-background-color);display:block;height:20px;position:absolute;transform:translateY(1px);width:11px;z-index:-2}.bubble.is-message-empty.is-group-last.with-media-tail .bubble-tail,.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 .attachment{overflow:visible}.bubble__media-container{border-radius:inherit;cursor:pointer}.bubble audio-element,.bubble poll-element{white-space:normal}.bubble .replies{-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .replies .c-ripple__circle{background-color:var(--light-primary-color)}.bubble .replies .rp{border-radius:inherit;cursor:pointer;height:100%;left:0;overflow:hidden;position:absolute;top:0;width:100%}.bubble .replies-beside{border-radius:2rem;bottom:47px;flex-direction:column;height:auto;max-height:52px;min-height:36px;padding:.375rem 0 .5rem;right:-44px;width:36px}.bubble .replies-beside-text{font-size:.75rem;margin-top:.125rem}.bubble .replies-footer{align-items:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;border-top:.0625rem solid var(--border-color);color:var(--primary-color);display:flex;height:3.0625rem;min-width:15rem;padding:0 .5rem;position:relative}html.no-touch .bubble .replies-footer:active,html.no-touch .bubble .replies-footer:hover{background-color:var(--light-primary-color)}html.no-touch .bubble .replies-footer:active~.bubble-tail,html.no-touch .bubble .replies-footer:hover~.bubble-tail{fill:var(--light-filled-message-primary-color)}.bubble .replies-footer .tgico-comments,.bubble .replies-footer .tgico-next{font-size:1.5rem}.bubble .replies-footer .tgico-comments{margin-left:.125rem;margin-right:.375rem}.bubble .replies-footer-text{align-items:center;color:var(--primary-color);display:flex;font-size:.9375rem;font-weight:var(--font-weight-bold);line-height:1.125rem;margin-left:.5rem}.bubble .replies-footer-avatars{--margin-right:-.875rem;--border-size:2px}.bubble .replies-footer .tgico-next{position:absolute;right:.1875rem}.bubble .replies-footer.is-unread .replies-footer-text:after{background-color:var(--primary-color);border-radius:50%;content:\" \";height:.5rem;margin-left:.75rem;width:.5rem}.bubble.is-thread-starter .user-avatar{display:none}.bubble.is-thread-starter.is-in .bubble-content-wrapper{margin-left:0}.bubble .message .reaction{--background-color:var(--light-filled-message-primary-color)}.bubble .message .reaction.is-chosen.backwards,.bubble .message .reaction:not(.is-chosen){--counter-color:var(--message-primary-color)}.bubble .message .reaction.is-chosen.backwards .stacked-avatars,.bubble .message .reaction:not(.is-chosen) .stacked-avatars{--border-color:var(--background-color)}.bubble .message .reactions-block .time{bottom:auto!important;order:100;position:static!important;right:auto!important}.bubble code{cursor:pointer}.bubble.is-invoice .attachment{background-color:inherit!important}.bubble.with-reply-markup .bubble-content{border-bottom-left-radius:6px!important;border-bottom-right-radius:6px!important}.bubble .name-with-reply .name{padding:0!important}.bubble .name-with-reply .name:not(:last-child) .hide-ol{display:none}.bubble .name-with-reply .name:not(:last-child) .peer-title{font-weight:var(--font-weight-bold)!important}.bubble .name-with-reply .reply{height:auto;margin:.25rem 0 0;max-height:none;padding:0}.bubble .topic-name-button{--color:var(--message-primary-color)}.bubble .name .topic-name-button-container{margin:.25rem -.125rem}.bubble .name .topic-name-button-container:first-child{margin-top:0}.bubble.is-message-empty:not(.is-reply) .name .topic-name-button-container{margin-bottom:0}.bubble:not(.is-group-first) .topic-name-button-container{display:none!important}.bubble .topic-name-button-container.floating-part{font-size:var(--messages-secondary-text-size);padding-bottom:0;padding-top:0}.bubble .topic-name-button-container.floating-part .topic-name-button{--color:#fff;padding:0}.bubble .topic-name-button-container.floating-part .topic-name-button:before{content:none}.bubble .topic-name-button-container.floating-part+.floating-part{margin-top:1.75rem}.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type{margin-bottom:.0625rem}.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type .document-container:last-of-type .document-selection,.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type:after{bottom:-.0625rem}.can-zoom-fade{opacity:1;transform:scale(1) translateX(0);transform-origin:center}body.animation-level-2 .can-zoom-fade{transition:var(--bubble-transition-out)}.bubbles-inner.zoom-fading .can-zoom-fade{transition:var(--bubble-transition-in)}.can-zoom-fade.zoom-fade{opacity:0;transform:scale3d(.8,.8,1) translateX(0)}.bubble-content-wrapper{display:flex;flex-direction:column}@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% - var(--message-handhelds-margin))}}.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{align-items:center;background-color:var(--message-highlightning-color);border-radius:inherit;color:#fff;display:flex;font-size:var(--messages-service-text-size);justify-content:center;line-height:calc(var(--messages-service-text-size) + 5px);padding:.28125rem .625rem;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;word-break:break-word}.bubble.service .service-msg i{font-style:normal}.bubble.service .service-msg a{color:#fff}.bubble.service .service-msg .peer-title,.bubble.service .service-msg [data-saved-from],.bubble.service .service-msg a{cursor:pointer;font-weight:var(--font-weight-bold)}.bubble.service .service-msg .peer-title:hover,.bubble.service .service-msg [data-saved-from]:hover,.bubble.service .service-msg a:hover{text-decoration:underline}.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!important}.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 .floating-part{left:calc(100% + 10px)}@media only screen and (max-width:600px){.bubble.is-in.just-media .floating-part{left:calc(100% + 1px)}}.bubble.is-in .quote .webpage-name,.bubble.is-in .reply-title{color:var(--primary-color)}.bubble.is-in .time{margin-left:-3px;padding-right:8px}.bubble.is-in .time .inner{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 .audio-time,.bubble.is-in .contact-number{color:var(--secondary-text-color)!important}.bubble.is-in code,.bubble.is-in pre{color:var(--monospace-text-color)}.bubble.is-in:not(.just-media) .reply.is-overriding-color .reply-border{background-color:rgb(var(--override-color))}.bubble.is-in:not(.just-media) .reply.is-overriding-color .reply-title{color:rgb(var(--override-color))}html.no-touch .bubble.is-in:not(.just-media) .reply.is-overriding-color:active,html.no-touch .bubble.is-in:not(.just-media) .reply.is-overriding-color:hover{background-color:rgba(var(--override-color),.08)}.bubble.is-out{--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);--message-primary-color:var(--message-out-primary-color);--light-filled-message-primary-color:var(--light-filled-message-out-primary-color);--selection-background-color:var(--message-out-selection-background-color);--message-time-color:var(--message-out-time-color);--message-status-color:var(--message-out-status-color);flex-direction:row-reverse}.bubble.is-out .bubble-content{margin-left:auto}.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: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) + .5rem)*-1))}.bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(.8,.8,1) translateX(calc((var(--chat-input-size) + .5rem)*-1))}body.animation-level-2 .bubble.is-out .bubble-content-wrapper{transition:var(--bubble-transition-out)}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:var(--bubble-transition-in)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(.8,.8,1) translateX(0)}}.bubble.is-out .anchor-url{color:var(--message-primary-color)}.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!important}.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 .floating-part{right:calc(100% + 10px)}.bubble.is-out.just-media .message{right:0}.bubble.is-out:not(.just-media) .reply-border{background-color:var(--message-out-primary-color)!important}.bubble.is-out:not(.just-media) .reply i,.bubble.is-out:not(.just-media) .reply-title{color:var(--message-out-primary-color)!important}.bubble.is-out .quote:before{background-color:var(--message-out-primary-color)}.bubble.is-out .quote .webpage-name{color:var(--message-out-primary-color)}.bubble.is-out .time{margin-left:-4px;padding-right:5px}.bubble.is-out .time .inner{bottom:4px}.bubble.is-out .time .inner:after,.bubble.is-out .time:after{font-size:calc(var(--messages-text-size) + 3px);line-height:var(--messages-time-text-size);margin-left:1px}.bubble.is-out.forwarded .name{color:var(--message-out-primary-color)}.bubble.is-out.is-read .time .inner:after,.bubble.is-out.is-read .time:after{content:\"๎ค\"}.bubble.is-out.is-sent .time .inner:after,.bubble.is-out.is-sent .time:after{content:\"๎ค€\"}.bubble.is-out.is-sending .time .inner:after,.bubble.is-out.is-sending .time:after{content:\"๎ฆฌ\"}.bubble.is-out.is-error .time .inner:after,.bubble.is-out.is-error .time:after{color:var(--message-error-color);content:\"๎ฆญ\"}.bubble.is-out .document-ico:after{border-right-color:var(--message-background-color);border-top-color:var(--message-background-color)}.bubble.is-out .audio-waveform rect{fill:var(--message-out-primary-color)}.bubble.is-out .audio-waveform rect.active{fill:var(--message-out-primary-color)!important}.bubble.is-out .audio-subtitle,.bubble.is-out .audio-time{color:var(--message-out-status-color)}.bubble.is-out .audio-download,.bubble.is-out .audio-toggle,.bubble.is-out .audio.corner-download .preloader-container{background-color:var(--message-out-primary-color)}.bubble.is-out .audio-download:empty{display:none}.bubble.is-out .audio.is-unread rect{fill:var(--message-out-primary-color)}.bubble.is-out .audio.is-unread .audio-time:after{background-color:var(--message-out-primary-color)}.bubble.is-out .audio-toggle .part{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.is-message-empty .reactions-block{justify-content:flex-end}.bubble.is-out.is-message-empty .reaction-block{margin-right:.25rem}.bubble.is-out.is-message-empty .reaction-block:last-child{margin-right:0}.bubble.is-out.is-message-empty .reaction-block.is-chosen{--chosen-background-color:var(--surface-color)}.bubble.is-out.is-message-empty:not(.emoji-big) .reactions-block{margin-left:auto}.bubble.is-out .bubble-call-subtitle,.bubble.is-out .contact-number,.bubble.is-out .document-size{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:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-line use{stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-answer-selected{background-color:var(--message-out-primary-color);color:var(--light-filled-message-out-primary-color)}html.no-touch .bubble.is-out poll-element .poll-answer:hover .animation-ring{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:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-avatars .stacked-avatars{--border-color:var(--message-background-color)}.bubble.is-out poll-element .progress-ring__circle{stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle{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:var(--message-out-primary-color)}.bubble.is-out .audio .preloader-container{--color:var(--message-background-color)}.bubble.is-out .bubble-beside-button{left:var(--message-beside-button-margin);right:auto}.bubble.is-out .bubble-beside-button.goto-original{transform:rotate(180deg)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox{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:var(--message-background-color)}.bubble.is-out .bubble-hover-reaction{left:var(--offset);right:auto}.reply-markup{margin-top:.0625rem;width:100%}.bubble:not(.is-group-last) .reply-markup{margin-bottom:.125rem}.reply-markup-row{display:flex;margin-top:.125rem;min-height:2.5rem;overflow:hidden}.reply-markup-row:last-child .reply-markup-button:first-child{border-bottom-left-radius:12px}.reply-markup-row:last-child .reply-markup-button:last-child{border-bottom-right-radius:12px}.reply-markup-button{background:var(--message-highlightning-color);border:none;border-radius:.375rem;color:#fff!important;cursor:pointer;font-size:var(--font-size-14);font-weight:var(--font-weight-bold);outline:none;overflow:hidden;padding:.5625rem 0;position:relative;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:2}.reply-markup-button-text{pointer-events:none;position:relative}.reply-markup-button.anchor-url{text-decoration:none!important}.reply-markup-button+.reply-markup-button{margin-left:.125rem}.reply-markup-button .forward-icon,.reply-markup-button.tgico:before{display:block;position:absolute;right:.125rem;top:.125rem}.reply-markup-button.is-link:before{content:\"๎คŒ\";transform:rotate(-45deg)}.reply-markup-button.is-buy:before{content:\"๎คœ\"}.reply-markup-button.is-switch-inline:before{content:\"๎ฅ‹\"}.bubble-beside-button:after,.bubble.just-media .reply:after,.reply-markup-button:after{background-color:#fff;border-radius:inherit;bottom:0;content:\" \";display:block;left:0;opacity:0;position:absolute;right:0;top:0;z-index:-1}html.no-touch .bubble-beside-button:active:after,html.no-touch .bubble-beside-button:hover:after,html.no-touch .bubble.just-media .reply:active:after,html.no-touch .bubble.just-media .reply:hover:after,html.no-touch .reply-markup-button:active:after,html.no-touch .reply-markup-button:hover:after{opacity:var(--hover-alpha)}.bubble-primary-color{color:var(--message-primary-color);font-weight:var(--font-weight-bold)}.pinned-message{--custom-emoji-size:calc(var(--font-size) + 2px)!important}.pinned-message-border{flex:0 0 auto;height:2rem;position:relative;width:.125rem}.pinned-message-border-wrapper-1{background:var(--primary-color);border-radius:1px;height:2rem;position:relative;top:50%;transform:translateY(-50%);width:.125rem}.pinned-message-border-mask{--mask-height:.375rem;--height:2.5rem;height:var(--height);overflow:hidden}.pinned-message-border-mask:after,.pinned-message-border-mask:before{content:\" \";display:block;height:var(--mask-height);left:0;opacity:0;position:absolute;right:0;z-index:1}body.animation-level-2 .pinned-message-border-mask:after,body.animation-level-2 .pinned-message-border-mask:before{transition:opacity .2s ease-in-out}.pinned-message-border-mask:before{background:linear-gradient(var(--surface-color),transparent);top:0}.pinned-message-border-mask:after{background:linear-gradient(transparent,var(--surface-color));bottom:0}.pinned-message-border-mask.mask-bottom:after,.pinned-message-border-mask.mask-top:before{opacity:1}.pinned-message-border-wrapper{color:var(--primary-color);position:relative}.pinned-message-border-wrapper:before{background:var(--primary-color);bottom:0;content:\" \";display:block;left:0;opacity:.4;position:absolute;right:0;top:0}.pinned-message-border-bars{stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.pinned-message-border-mark{background:currentColor;border-radius:1px;left:0;position:absolute;top:0;width:2px}body:not(.animation-level-0) .pinned-message-border-mark,body:not(.animation-level-0) .pinned-message-border-wrapper{transition:transform .25s ease-in-out;will-change:transform}.pinned-message-content{--height:32px;height:var(--height)}.pinned-message-media{border-radius:.1875rem}.pinned-message,.reply{--font-size:var(--font-size-14);--custom-emoji-size:calc(var(--font-size) + 4px);--line-height:calc(var(--font-size) + 4px);align-items:center;cursor:pointer;display:flex;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.pinned-message-content,.reply-content{display:flex;flex-direction:column;flex-grow:1;flex-shrink:1;justify-content:center;margin-left:.5rem;overflow:hidden;pointer-events:none;position:relative}.pinned-message-title,.reply-title{color:var(--primary-color)}.pinned-message-subtitle,.pinned-message-title,.reply-subtitle,.reply-title{font-size:var(--font-size);line-height:var(--line-height);overflow:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap}.pinned-message-media,.reply-media{height:2rem!important;left:0;overflow:hidden;position:absolute;top:.125rem;width:2rem!important}.pinned-message-media.is-round,.reply-media.is-round{border-radius:50%}.pinned-message-media>img,.pinned-message-media>video,.reply-media>img,.reply-media>video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.pinned-message i,.reply i{color:var(--secondary-text-color);font-style:normal}.pinned-message img.emoji,.reply img.emoji{height:1rem;vertical-align:top;width:1rem}.reply.is-media .reply-content{padding-left:2.5rem}.reply-border{background:var(--primary-color);border-radius:1px;height:calc(var(--font-size)*2 + .25rem);min-width:2px}.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:var(--font-weight-bold)}.pinned-container{--container-height:3.25rem;align-items:center;cursor:pointer;display:flex;flex:0 0 auto;justify-content:space-between;overflow:visible}.pinned-container.is-floating{background-color:var(--surface-color)!important;height:var(--container-height);left:0;margin:0;max-height:var(--container-height);position:absolute!important;right:0;top:var(--topbar-height);width:auto}.pinned-container.is-floating .pinned-container-wrapper{border-radius:0;height:100%;max-width:100%;order:0;padding:0 1rem;z-index:0}@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{border-bottom:1px solid var(--border-color);border-top:1px solid var(--border-color);bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.pinned-container-content{flex:1 1 auto;overflow:hidden;pointer-events:none;position:relative}.pinned-container .btn-icon{display:flex;flex:0 0 auto;font-size:1.5rem;justify-content:center}.pinned-container-wrapper{align-items:center;border-radius:.25rem;display:flex;flex:1 1 auto;order:1;overflow:hidden;padding:.25rem}.pinned-container-wrapper-utils{align-items:center;display:flex;flex:0 0 auto;position:relative}.pinned-message{display:flex;width:auto}.pinned-message-content{overflow:visible!important}.pinned-message-media-container{height:2rem;margin-left:-.25rem;position:absolute;width:2rem}body.animation-level-2 .pinned-message-media-container{transition:transform var(--pm-transition)}.pinned-message-subtitle,.pinned-message-title{transform:translateX(0)}.pinned-message.is-media .pinned-message-subtitle,.pinned-message.is-media .pinned-message-title{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-subtitle,.pinned-message.is-media .pinned-message-title{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-subtitle,.pinned-message-content .pinned-message-title{height:calc(var(--height)/2);min-height:calc(var(--height)/2);overflow:visible;position:relative}body.animation-level-2 .pinned-message-content .pinned-message-subtitle,body.animation-level-2 .pinned-message-content .pinned-message-title{transition:transform var(--pm-transition)}.pinned-message-title{margin-bottom:.25rem}.pinned-message-subtitle .animated-super-row{font-size:var(--font-size-14);line-height:16px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pinned-message .animated-counter{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){opacity:0;transform:scale(.68)}.pinned-message .animated-super-row{--translateY:16px}.pinned-message .pinned-message-media{--translateY:32px}.pinned-message.hide~.tgico-pinlist,.pinned-message.is-many .pinned-message-close,.pinned-message.is-many.is-floating .pinned-message-close,.pinned-message.is-many:not(.is-floating) .pinned-message-pinlist,.pinned-message:not(.is-many) .pinned-message-pinlist,.pinned-message:not(.is-many)~.tgico-pinlist{display:none}.pinned-message-pinlist{order:2}.chat[data-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){max-width:210px;padding-right:1.75rem;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:var(--font-weight-bold)}.pinned-audio-subtitle{color:var(--secondary-text-color)}.pinned-audio-subtitle,.pinned-audio-title{font-size:var(--font-size-14);line-height:var(--line-height-14);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.pinned-audio-content{margin-left:.75rem}.pinned-audio-progress{--border-radius:0;--height:var(--progress-height);--translateY:.125rem;bottom:0;left:0;position:absolute;right:0;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 var(--transition-standard-out)}body.is-right-column-shown .pinned-audio-progress{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:active,html.no-touch .pinned-audio-progress:hover{--translateY:0}.pinned-audio-progress .progress-line__filled:after{display:none!important}.pinned-audio-progress .progress-line__seek{top:-1rem}.pinned-audio-progress-wrapper{bottom:0;height:.5rem;left:0;overflow:hidden;position:absolute;right:0}.pinned-audio-volume{align-items:center;height:2.5rem;position:relative;width:2.5rem}html.is-touch .pinned-audio-volume{display:none}.pinned-audio-volume-tunnel{bottom:-1rem;content:\" \";left:0;position:absolute;right:0;top:100%}.pinned-audio-volume .player-volume__icon{cursor:pointer;display:flex}.pinned-audio-volume .progress-line-container{background-color:var(--surface-color);border-radius:10px;box-shadow:0 1px 5px 0 rgba(0,0,0,.15);margin-top:2.25rem;opacity:0;padding:.75rem 1rem;position:absolute;top:100%;transform:rotate(270deg);transition:opacity .2s ease-in-out,visibility 0s .2s;visibility:hidden;width:5rem}body.animation-level-0 .pinned-audio-volume .progress-line-container{transition:none!important}.pinned-audio-volume:active .progress-line-container,.pinned-audio-volume:hover .progress-line-container{opacity:1;transition:opacity .2s ease-in-out,visibility 0s 0s;visibility:visible}.markup-tooltip{background:var(--surface-color);border-radius:10px;bottom:0;display:flex;height:44px;justify-content:flex-start;left:0;opacity:0;overflow:hidden;position:fixed;right:0;top:0;transform:translateZ(0);transition:opacity var(--layer-transition),transform var(--layer-transition),width var(--layer-transition);width:252px;z-index:1}body.animation-level-0 .markup-tooltip{transition:none}.markup-tooltip-wrapper{align-items:center;display:flex;height:100%;justify-content:flex-start;left:0;max-width:100%;position:absolute;top:0;transform:translateX(0);transition:transform var(--layer-transition);width:672px}body.animation-level-0 .markup-tooltip-wrapper{transition:none}.markup-tooltip-tools{align-items:center;display:flex;flex:0 0 auto;justify-content:space-between;max-width:100%;padding:7px}.markup-tooltip-tools:first-child{width:252px}.markup-tooltip-tools:last-child{width:420px}.markup-tooltip-tools:last-child .markup-tooltip-delimiter{margin:0 .25rem}.markup-tooltip-delimiter{background-color:var(--border-color);height:25px;width:1px}.markup-tooltip .btn-icon{border-radius:8px!important;height:30px;padding:0;width:30px}.markup-tooltip .btn-icon.active{background-color:var(--primary-color)!important;color:#fff!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(-252px)}.markup-tooltip-link-apply{color:var(--primary-color);font-size:2rem}.markup-tooltip-link-apply-container{align-items:center;display:flex;opacity:0;pointer-events:none;transition:opacity var(--layer-transition)}body.animation-level-0 .markup-tooltip-link-apply-container{transition:none}.markup-tooltip .input-clear{flex:1 1 auto;margin:0 .5rem;text-overflow:ellipsis}.markup-tooltip .input-clear.is-valid+.markup-tooltip-link-apply-container{opacity:1;pointer-events:all}.stickers-helper>.scrollable{max-height:13.75rem;min-height:var(--esg-sticker-size);padding:.4375rem;position:relative}.stickers-helper-stickers{border-radius:var(--border-radius);max-width:100%}html.no-touch .stickers-helper .super-sticker:not(.active):active,html.no-touch .stickers-helper .super-sticker:not(.active):hover{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:after,.emoji-helper .super-emojis:before{content:\" \";display:inline-block;width:.25rem}html.no-touch .emoji-helper .super-emoji:not(.active):active,html.no-touch .emoji-helper .super-emoji:not(.active):hover{background:none}.emoji-helper .super-emoji.active{background-color:var(--primary-color)!important}.inline-helper{-webkit-user-select:none;-moz-user-select:none;user-select:none}.inline-helper:not(.is-gallery){min-width:min(20rem,100%)}.inline-helper .scrollable{max-height:232px;position:relative}.inline-helper-separator{background-color:var(--border-color);height:1px;margin-left:4rem;width:100%}.inline-helper-separator:last-child{display:none}.inline-helper .btn-primary{border-radius:0;border-radius:initial}.inline-helper-results:not(.is-gallery){cursor:pointer}.inline-helper-results:not(.is-gallery) .inline-helper-result{height:4rem;line-height:var(--line-height);padding:.5rem .5rem .5rem 4rem}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview{height:3rem!important;left:.5rem;overflow:hidden;position:absolute;width:3rem!important}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview.empty{align-items:center;background-color:var(--primary-color);border-radius:.375rem;color:#fff;display:flex;font-size:1.75rem;justify-content:center;text-transform:uppercase}.inline-helper .media-container{border-radius:inherit}.inline-helper .media-photo,.inline-helper .media-poster,.inline-helper .media-video{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.inline-helper .gif{bottom:0;height:auto!important;left:0;position:absolute;right:0;top:0;width:auto!important}.inline-helper-results.is-gallery{grid-gap:1px;border-radius:var(--border-radius);grid-template-columns:repeat(auto-fill,minmax(var(--esg-sticker-size),1fr));max-width:100%}.inline-helper-results.is-gallery .inline-helper-result{height:auto!important;width:auto!important}.inline-helper-result{position:relative}.inline-helper-result-title{font-weight:var(--font-weight-bold);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.inline-helper-result-description{-webkit-line-clamp:2;-webkit-box-orient:vertical;color:var(--secondary-text-color);display:-webkit-box;font-size:.875rem;overflow:hidden;text-overflow:ellipsis;white-space:pre-wrap}.chat-search{left:0;position:absolute!important;right:0;top:0;z-index:2}.chat-search-footer{align-items:center;background-color:var(--surface-color);box-shadow:0 -1px 5px -1px rgba(0,0,0,.21);display:flex;flex:0 0 auto;height:46px;justify-content:space-between;overflow:hidden;padding:0 8px;width:100%}.chat-search-footer .chat-search-count{color:var(--secondary-text-color);margin-left:8px}.chat-search-count:empty,.chat-search-count:not(:empty)+.btn-icon,.chat-search-footer+.chat-input{display:none}.chat-search-controls{display:flex}.chat-search-results{background-color:var(--surface-color);height:100%;left:0;max-height:100%;opacity:0;overflow:hidden;position:absolute;top:0;transition:.2s ease;visibility:hidden;width:100%}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;align-items:center;bottom:var(--padding);display:flex;flex-direction:column;justify-content:center;left:var(--padding);position:absolute!important;right:var(--padding);top:var(--padding);-webkit-user-select:none;-moz-user-select:none;user-select:none;width:auto!important;z-index:3}.drops-container:not(.is-visible){display:none}.drops-container.is-visible{animation:fade-in-opacity .2s linear forwards}.drops-container.is-visible.backwards{animation:fade-in-backwards-opacity .2s linear forwards}.drop{--wrapper-padding:-4px;align-items:center;background-color:var(--surface-color);border-radius:12px;color:#a2acb4;display:flex;flex:1 1 auto;flex-direction:column;justify-content:center;max-width:100%;pointer-events:all;position:relative;transition:color .2s ease-in-out;width:100%}.drop-outline-wrapper{bottom:var(--wrapper-padding);left:var(--wrapper-padding);pointer-events:none;position:absolute;right:var(--wrapper-padding);top:var(--wrapper-padding)}.drop-outline-path{fill:none;stroke-dasharray:13.5,11;stroke:#a2acb4;stroke-width:2;stroke-linecap:round;stroke-dashoffset:0;transition:stroke .2s ease-in-out}.drop.is-dragover .drop-outline-path{stroke:var(--primary-color);animation:drop-outline-move .5s linear infinite}.drop-icon{font-size:6rem}.drop-header{font-size:1.25rem;font-weight:var(--font-weight-bold)}.drop-header:not(:last-child){margin-top:-10px}@media only screen and (max-height:670px){.drop-icon{font-size:0}.drop-header{margin-top:0}}.drop.is-dragover{color:var(--primary-color)}.drop+.drop{margin-top:10px}@keyframes drop-outline-move{0%{stroke-dashoffset:0}to{stroke-dashoffset:-24.5}}body.is-dragging .page-chats{pointer-events:none}.bot-commands{--border-radius-padding:24px;--offset:.5rem;animation:none!important;background-color:transparent!important;border-radius:12px 12px 0 0!important;bottom:calc(100% - var(--border-radius-padding));box-shadow:none;left:calc(var(--offset)*-1);max-height:20rem;max-width:none;overflow:hidden;padding:var(--offset) var(--offset) 0!important;pointer-events:none;position:absolute!important;right:calc(var(--offset)*-1);transition:none!important;visibility:visible!important;width:auto!important}body.animation-level-2 .bot-commands{display:flex!important}.bot-commands .scrollable{background-color:var(--surface-color);border-radius:inherit;box-shadow:0 1px 8px 1px rgba(0,0,0,.12);height:auto;max-height:207px!important;pointer-events:all}body.animation-level-2 .bot-commands .scrollable{opacity:0;transform:translateY(var(--height))}.bot-commands.is-visible.animating .scrollable{transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.bot-commands.is-visible:not(.backwards) .scrollable{opacity:1;transform:translateY(0)}.bot-commands-list{border-radius:inherit;height:var(--height);padding-bottom:0;width:100%}.bot-commands-list-element{align-items:flex-start;border-radius:0!important;flex-direction:column;justify-content:center;padding-left:3.375rem}.bot-commands-list-element-avatar{left:.75rem;position:absolute}.bot-commands-list-element-description,.bot-commands-list-element-name{font-size:.875rem;line-height:var(--line-height-14);margin-left:0}.crop .overlay::-moz-selection,.crop-component::-moz-selection{background:transparent}.crop .overlay::selection,.crop-component::selection{background:transparent}.crop-image,.crop-overlay-image{display:block;height:auto;-o-object-fit:contain;object-fit:contain;-o-object-position:center;object-position:center;width:auto}.crop-image{display:block;pointer-events:none;position:relative}.crop-component{background-color:#fff;margin:0 auto;overflow:hidden;position:relative;z-index:999}.crop-component>img{max-width:100%}.crop-overlay{border-radius:50%;box-sizing:content-box;overflow:hidden;position:absolute;z-index:999}.crop-overlay:active,html.no-touch .crop-overlay:hover{cursor:move}.crop-overlay-image{display:block;position:absolute}.crop-overlay-color{background-color:hsla(0,0%,100%,.7);border-radius:8px;height:100%;left:0;position:absolute;top:0;width:100%}.crop.is-forum .crop-overlay{border-radius:var(--avatar-border-radius-forum)}.sidebar-header{align-items:center;background-color:var(--surface-color);cursor:default;display:flex;flex:0 0 auto;justify-content:space-between;min-height:3.5rem;padding-left:1rem;padding-right:1rem;-webkit-user-select:none;-moz-user-select:none;user-select:none}.sidebar-header .btn-menu{overflow-y:overlay}@media only screen and (max-width:600px){.sidebar-header{padding-left:.5rem;padding-right:.5rem}}[dir=ltr] .sidebar-header__title{padding-left:1.5rem}[dir=rtl] .sidebar-header__title{padding-right:1.5rem}.sidebar-header__title{color:var(--primary-text-color);flex:1;font-size:1.25rem;font-weight:var(--font-weight-bold)}[dir=ltr] .sidebar-header .btn-icon+.btn-icon{margin-left:.5rem}[dir=rtl] .sidebar-header .btn-icon+.btn-icon{margin-right:.5rem}.sidebar-header-right{flex:0 0 auto}.scrollable-y-bordered .sidebar-header{position:relative}.scrollable-y-bordered .sidebar-header:after{background-color:var(--border-color);bottom:-1px;content:\" \";height:1px;left:0;opacity:0;position:absolute;right:0;z-index:1}body.animation-level-2 .scrollable-y-bordered .sidebar-header:after{transition:opacity var(--transition-standard-in)}.scrollable-y-bordered:not(.scrolled-top) .sidebar-header:after{opacity:1}.sidebar-close-button{flex:0 0 auto;height:2.5rem;overflow:inherit!important;width:2.5rem}.sidebar-content{display:flex;flex:1 1 auto;height:100%;max-height:100%;overflow:hidden;position:relative;width:100%}.profile-avatars-container{cursor:pointer;padding-bottom:100%;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}html.no-touch .profile-avatars-container:active .profile-avatars-arrow,html.no-touch .profile-avatars-container:hover .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{display:flex;flex-wrap:nowrap;height:100%;position:absolute;transform:translateZ(-1px) scale(2);transform-origin:left top;transition:transform .2s ease-in-out;width:100%}.scrollable.no-parallax .profile-avatars-avatars{transform:translate(0)}.profile-avatars-avatars:before{bottom:0;content:\" \";left:0;right:0;top:0}.profile-avatars-avatar{background-color:#000;display:flex;height:inherit;min-height:100%;min-width:100%;position:relative;width:inherit}.profile-avatars-avatar .avatar-photo{height:100%;-o-object-fit:cover;object-fit:cover;pointer-events:none;width:100%}.profile-avatars-gradient{background:linear-gradient(1turn,rgba(0,0,0,.3) 8.98%,transparent);bottom:0;height:80px;left:0;position:absolute;right:0}[dir=ltr] .profile-avatars-info{left:1.5rem}[dir=rtl] .profile-avatars-info{right:1.5rem}.profile-avatars-info{align-items:flex-start;bottom:0;bottom:.5625rem;display:flex;flex-direction:column;pointer-events:none;position:absolute}[dir=ltr] .profile-avatars-info .profile-name,[dir=ltr] .profile-avatars-info .profile-subtitle{text-align:left}[dir=rtl] .profile-avatars-info .profile-name,[dir=rtl] .profile-avatars-info .profile-subtitle{text-align:right}.profile-avatars-info .profile-name,.profile-avatars-info .profile-subtitle{color:#fff;margin:0}.profile-avatars-info .peer-typing-container{--color:#fff}.profile-avatars-info .premium-icon{color:#fff}.profile-avatars-info .verified-icon-background{fill:#fff}.profile-avatars-info .verified-icon-check{visibility:hidden}.profile-avatars-info .premium-icon,.profile-avatars-info .profile-subtitle,.profile-avatars-info .verified-icon{opacity:.7}.profile-avatars-info .online{color:inherit!important}.profile-avatars-tabs{display:flex;height:.125rem;left:.375rem;pointer-events:none;position:absolute;right:.375rem;top:.5rem}.profile-avatars-tab{background-color:#fff;border-radius:4px;flex:1 1 auto;height:inherit;margin:0 .125rem;opacity:.2;transition:opacity .2s ease-in-out}.profile-avatars-tab.active{opacity:.6}.profile-avatars-arrow{bottom:0;left:0;opacity:0;position:absolute;top:0;width:33.3333333333%}.profile-avatars-arrow:before{color:#fff;font-size:2.1875rem;left:.625rem;position:absolute;top:50%;transform:translateY(-50%)}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:active,html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:hover{opacity:1!important}.profile-avatars-arrow-next{left:auto;right:0}.profile-avatars-arrow-next:before{left:auto;right:.625rem}.profile-content{display:flex;flex:0 0 auto;flex-direction:column;position:relative;width:100%}.profile-content .sidebar-left-section{background-color:var(--surface-color);padding-bottom:.5rem;position:relative}.profile-content .sidebar-left-section .profile-subtitle .peer-typing-container{justify-content:center}.profile-content.search-empty .gradient-delimiter{display:none}@media only screen and (max-width:600px){.profile-button{border-radius:0}}[dir=ltr] .profile-change-avatar{right:1.25rem}[dir=rtl] .profile-change-avatar{left:1.25rem}.profile-change-avatar{--size:3.375rem;position:absolute!important;top:calc(var(--size)/-2);transform:none;transition:none!important}.profile-container>.scrollable{display:flex;flex-direction:column}.profile-name{align-items:flex-end;color:var(--primary-text-color);display:flex;font-size:var(--font-size-20);font-weight:var(--font-weight-bold);line-height:var(--line-height-20);margin:0 auto;max-width:21.25rem;overflow:hidden;text-align:center}.profile-name span.emoji{min-width:-moz-min-content;min-width:min-content;vertical-align:inherit}.profile-name .peer-title{overflow:hidden;text-overflow:ellipsis;word-break:break-word}.sidebar-left-section-content>.profile-name{justify-content:center}.profile-name .badge-fake{align-self:center}.profile-subtitle{align-items:center;color:var(--secondary-text-color);display:flex;font-size:.875rem;justify-content:center;margin-bottom:.875rem;margin-top:1px;text-align:center}@media only screen and (max-width:600px){.profile-subtitle{margin-top:3px}}.profile-subtitle .online{color:var(--primary-color)}.profile-avatar{display:block;margin:.5rem auto 10px}@media only screen and (max-width:600px){.profile-avatar{--size:100px;--multiplier:.54;margin:0 auto 10px}}.profile-avatar,.profile-name,.profile-subtitle{flex:0 0 auto}.menu-horizontal-scrollable{--scrollable-size:3rem;height:var(--scrollable-size)}.menu-horizontal-scrollable:after{border-bottom:1px solid var(--border-color);bottom:0;content:\" \";height:1px;left:0;position:absolute;right:0;z-index:-1}.menu-horizontal-scrollable .menu-horizontal-div{border-bottom:none}.menu-horizontal-div{--size:var(--scrollable-size,3rem);--padding-horizontal:0px;border-bottom:1px solid var(--border-color);color:var(--secondary-text-color);display:flex;flex-direction:row;height:var(--size);justify-content:space-around;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:2}.menu-horizontal-div:not(.no-stripe):after,.menu-horizontal-div:not(.no-stripe):before{content:\" \";flex:0 0 auto;width:var(--padding-horizontal)}.menu-horizontal-div:not(.no-stripe) .menu-horizontal-div-item{border-radius:10px 10px 0 0}.menu-horizontal-div-item{align-items:center;border-radius:0;cursor:pointer;display:flex;flex:1 1 auto;font-size:1rem;font-weight:var(--font-weight-bold);height:100%;justify-content:center;line-height:var(--line-height);padding:0 1rem;position:relative;text-align:center;transition:none!important}html.no-touch .menu-horizontal-div-item:active,html.no-touch .menu-horizontal-div-item:hover{background-color:var(--light-secondary-text-color)}.menu-horizontal-div-item.active{color:var(--primary-color)}.menu-horizontal-div-item.active i{opacity:1}.menu-horizontal-div-item.active .c-ripple__circle,html.no-touch .menu-horizontal-div-item.active:active,html.no-touch .menu-horizontal-div-item.active:hover{background-color:var(--light-primary-color)}.menu-horizontal-div-item.active .badge{background-color:var(--primary-color)}.menu-horizontal-div-item>span{align-items:center;display:inline-flex;overflow:visible;pointer-events:none;position:relative}.menu-horizontal-div i{background-color:var(--primary-color);border-radius:.1875rem .1875rem 0 0;bottom:-.8125rem;box-sizing:content-box;height:.1875rem;left:0;opacity:0;pointer-events:none;position:absolute;transform-origin:left;width:100%;z-index:1}.menu-horizontal-div i.animate{transition:transform var(--tabs-transition)}.tabs-container{display:grid;grid-template-columns:100%;grid-template-rows:100%;min-width:100%;width:100%}.tabs-container .tabs-tab{background-color:var(--background-color);display:none;flex-direction:column;grid-column-start:1;grid-row-start:1;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 var(--tabs-transition)}.tabs-container[data-animation=navigation].animating .tabs-tab{transition:transform var(--transition-standard-in),filter var(--transition-standard-in)}.tabs-container[data-animation=navigation].animating.backwards .tabs-tab{transition:transform var(--transition-standard-out),filter var(--transition-standard-out)}#column-left{flex:1 1 auto;flex-direction:column;max-width:420px;width:420px}@media only screen and (max-width:600px){#column-left{max-width:100%;width:100%}body:not(.is-left-column-shown) #column-left{filter:brightness(80%);transform:translate3d(-25vw,0,0)}}@media only screen and (min-width:601px){#column-left{overflow:visible}[dir=ltr] #column-left:after{right:-1px}[dir=rtl] #column-left:after{left:-1px}#column-left:after{background-color:var(--border-color);content:\" \";display:block;height:100vh;position:absolute;top:0;width:1px;z-index:2}}@media only screen and (min-width:601px)and (max-width:925px){#column-left{display:flex;left:0;max-width:none;position:fixed;top:0;transform:translate3d(-5rem,0,0);transition:transform var(--layer-transition);width:26.5rem}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:418.75px}}#column-left .item-main .menu-horizontal-scrollable{background-color:var(--surface-color);position:relative;top:auto;z-index:1}@media only screen and (max-width:600px){#column-left .item-main .menu-horizontal-scrollable{box-shadow:0 1px 5px -1px rgba(0,0,0,.16)}}#column-left .item-main .menu-horizontal-scrollable .scrollable{position:relative}[dir=ltr] #column-left .item-main .menu-horizontal-scrollable .badge{margin-left:5px}[dir=rtl] #column-left .item-main .menu-horizontal-scrollable .badge{margin-right:5px}#column-left .item-main .menu-horizontal-scrollable:not(.hide)+#folders-container{height:calc(100% - var(--scrollable-size));position:relative}#column-left .item-main .menu-horizontal-scrollable:not(.hide)+#folders-container .scrollable{padding-top:.5rem}#column-left .item-main .menu-horizontal-scrollable:not(.hide)+#folders-container .dialogs-placeholder-canvas{top:.5rem}#column-left .item-main .menu-horizontal-div{--padding-horizontal:.6875rem;justify-content:flex-start;position:relative!important;z-index:0}@media only screen and (max-width:600px){#column-left .item-main .menu-horizontal-div{--padding-horizontal:.1875rem}}#column-left .item-main .menu-horizontal-div-item{flex:0 0 auto;min-width:3rem}#column-left .item-main .menu-horizontal-div__stripe{display:none}#column-left .folders-tabs-scrollable{flex:0 0 auto}#column-left .item-main{--offset-top:0;background-color:var(--surface-color)}[dir=ltr] #column-left .item-main .input-search .selector-user{left:6px}[dir=rtl] #column-left .item-main .input-search .selector-user{right:6px}[dir=ltr] #column-left .item-main .input-search .selector-user{margin-left:0}[dir=rtl] #column-left .item-main .input-search .selector-user{margin-right:0}#column-left .item-main .input-search .selector-user{height:30px;line-height:1.875rem;position:absolute!important;top:6px;z-index:1}[dir=ltr] #column-left .item-main .input-search.is-picked .input-search-input{padding-left:calc(var(--paddingLeft) + 12px - var(--border-width))}[dir=rtl] #column-left .item-main .input-search.is-picked .input-search-input{padding-right: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}[dir=ltr] #column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{left:38px}[dir=rtl] #column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{right:38px}[dir=ltr] #column-left .item-main .search-helper{margin-left:28px}[dir=rtl] #column-left .item-main .search-helper{margin-right:28px}#column-left .item-main .search-helper{display:flex}@media only screen and (max-width:600px){[dir=ltr] #column-left .item-main .search-helper{margin-left:20px}[dir=rtl] #column-left .item-main .search-helper{margin-right:20px}}#column-left .item-main .search-helper .selector-user{font-size:14px;margin-top:7px}html.no-touch #column-left .item-main .search-helper .selector-user:active,html.no-touch #column-left .item-main .search-helper .selector-user:hover{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{background-color:var(--surface-color);max-height:100%;position:relative}#column-left #chatlist-container.has-filters .connection-status-bottom{height:calc(100% + var(--offset-top)*-1)}#column-left #folders-container{flex:1 1 auto}#column-left #folders-container .scrollable-y{background-color:transparent;position:absolute}#column-left #folders-container .scrollable-y.active{display:block}#column-left .dialogs-placeholder-canvas{position:absolute;top:0;z-index:2}#column-left .sidebar-slider{height:100%}#column-left .sidebar-header__btn-container{align-items:center;display:flex;flex:0 0 auto;height:2.5rem;justify-content:center;position:relative;width:2.5rem}#column-left .sidebar-header__btn-container>.btn-icon{bottom:0;left:0;margin:0;opacity:0;position:absolute;right:0;top:0;visibility:hidden;z-index:4}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:-.25rem}}#column-left .sidebar-tools-button{width:100%}#column-left .sidebar-tools-button .btn-menu{max-height:calc(var(--vh)*100 - 3.75rem);min-width:260px}[dir=ltr] #column-left .sidebar-tools-button .btn-menu-item{padding-right:.375rem}[dir=rtl] #column-left .sidebar-tools-button .btn-menu-item{padding-left:.375rem}[dir=ltr] #column-left .archived-count{margin-left:.625rem}[dir=rtl] #column-left .archived-count{margin-right:.625rem}#column-left .archived-count{justify-self:flex-end}html[dir=ltr].is-mobile #column-left .archived-count{margin-right:.375rem}html[dir=rtl].is-mobile #column-left .archived-count{margin-left:.375rem}@media only screen and (max-width:600px){#column-left .archived-count{font-weight:var(--font-weight-bold)}}#column-left .archived-count:empty{display:none}#column-left .search-group-people .chatlist{display:flex;flex-direction:row;margin-top:-1px;padding:0 0 1px}#column-left .search-group-people .chatlist:after,#column-left .search-group-people .chatlist:before{content:\"ย \";display:inline-block;flex:0 0 auto;width:.3125rem}#column-left .search-group-people .chatlist-chat{align-items:center;border-radius:10px;display:flex;flex:0 0 auto;flex-direction:column;height:6.125rem;justify-content:flex-end;max-width:4.875rem;padding:0!important;width:4.875rem}#column-left .search-group-people .dialog-subtitle,#column-left .search-group-people .dialog-title-details{display:none}#column-left .search-group-people .dialog-title{max-width:65px;padding-bottom:.75rem}#column-left .search-group-people .dialog-title .user-title{font-size:.75rem!important}#column-left .search-group-people .dialog-title .peer-title{font-weight:var(--font-weight-normal)!important}[dir=ltr] #column-left .search-group-people .dialog-avatar{left:auto!important}[dir=rtl] #column-left .search-group-people .dialog-avatar{right:auto!important}#column-left .search-group-people .dialog-avatar{top:.75rem!important}#column-left .search-group-people .search-group-scrollable{position:relative}@media only screen and (max-width:600px){[dir=ltr] #column-left .search-group-people .search-group-scrollable{margin-left:-7px}[dir=rtl] #column-left .search-group-people .search-group-scrollable{margin-right:-7px}#column-left .search-group-people .search-group-scrollable{margin-top:4px}}#column-left .search-group-people .search-group-scrollable>.scrollable{position:relative}#column-left .item-main .sidebar-content{justify-content:center}#column-left .item-main .sidebar-content .btn-menu{bottom:calc(100% + 10px)}#column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close,#column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled{visibility:visible!important}body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close,body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled{animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-width:600px){#column-left .item-main .sidebar-content .btn-corner{--size:54px;bottom:14px;position:fixed!important;right:14px;z-index:1}}#column-left .item-main .sidebar-content .btn-corner:not(.is-hidden){transform:translateZ(0)}#column-left .connection-status{flex:0 0 auto;overflow:hidden;padding:0 .5rem .5rem;width:100%}#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 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))}[dir=ltr] #column-left .connection-status-button{padding-left:4.5rem}[dir=rtl] #column-left .connection-status-button{padding-right:4.5rem}[dir=ltr] #column-left .connection-status-button{text-align:left}[dir=rtl] #column-left .connection-status-button{text-align:right}#column-left .connection-status-button{align-self:center;color:#2e3939;cursor:default;height:3.5rem;transform:translateY(-100%)}#column-left .connection-status-button .force-reconnect{color:inherit;cursor:pointer;text-decoration:underline}[dir=ltr] #column-left .connection-status-button .preloader-container{left:1rem}[dir=rtl] #column-left .connection-status-button .preloader-container{right:1rem}#column-left .connection-status-button .preloader-container{height:1.5rem;right:auto;width:1.5rem}#column-left .connection-status-button .preloader-container .preloader-path-new{stroke:#2e3939}#column-left .connection-status-bottom{--offset-top:0px;background-color:var(--surface-color);bottom:0;display:flex;flex-direction:column;height:100%;left:0;overflow:hidden;position:absolute;right:0;top:0;transform:translateY(var(--offset-top))}#column-left .input-wrapper{flex:0 0 auto;margin:.75rem 0;max-width:100%;padding:0 .75rem;width:420px}@media only screen and (max-width:600px){#column-left .input-wrapper{width:100%}}#search-container{display:flex;top:var(--offset-top)!important}#search-container .scrollable-y{flex:1 1 auto;position:relative}.edit-profile-container .sidebar-content,.new-channel-container .sidebar-content,.new-group-container .sidebar-content{flex-direction:column}.edit-profile-container .chatlist-container,.new-channel-container .chatlist-container,.new-group-container .chatlist-container{flex:1 1 auto}[dir=ltr] .edit-profile-container .caption,[dir=ltr] .new-channel-container .caption,[dir=ltr] .new-group-container .caption{margin-left:23px}[dir=rtl] .edit-profile-container .caption,[dir=rtl] .new-channel-container .caption,[dir=rtl] .new-group-container .caption{margin-right:23px}[dir=ltr] .edit-profile-container .caption,[dir=ltr] .new-channel-container .caption,[dir=ltr] .new-group-container .caption{padding-right:24px}[dir=rtl] .edit-profile-container .caption,[dir=rtl] .new-channel-container .caption,[dir=rtl] .new-group-container .caption{padding-left:24px}.edit-profile-container .caption,.new-channel-container .caption,.new-group-container .caption{color:var(--secondary-text-color);font-size:.875rem;margin-top:14px}.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}.settings-container .profile-avatars-container{height:15rem;padding-bottom: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;user-select:none}.chat-folders-container .sticker-container,.edit-folder-container .sticker-container,.people-nearby-container .sticker-container{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.chat-folders-container .caption,.edit-folder-container .caption,.people-nearby-container .caption{color:var(--secondary-text-color);font-size:var(--font-size-14);line-height:var(--line-height-14);margin:0 auto;max-width:20rem;text-align:center}.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}.edit-folder-container .caption{margin-bottom:18px}@media only screen and (max-width:600px){.edit-folder-container .input-wrapper{padding:0 16px;width:100%}}.edit-folder-container .sidebar-left-section{padding-bottom:0}.edit-folder-container .sidebar-left-section:last-child{padding-bottom:.5rem}.folder-categories .checkbox-field{position:absolute;right:1.125rem!important}.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}[dir=ltr] .included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-left:26px}[dir=rtl] .included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-right:26px}[dir=ltr] .included-chatlist-container .chatlist-chat{padding-right:3.5rem!important}[dir=rtl] .included-chatlist-container .chatlist-chat{padding-left:3.5rem!important}.search-group-recent .search-group__name{align-items:center;display:flex;justify-content:space-between}.search-group-recent .btn-icon{font-size:22px}@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:0 0 7px}}.sidebar-left-section{padding:.5rem 0 1rem}.sidebar-left-section.with-fake-delimiter{box-shadow:none;padding-top:0!important}.sidebar-left-section.with-fake-delimiter .gradient-delimiter{margin-bottom:.5rem}.sidebar-left-section.no-padding-top{padding-top:0!important}@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}[dir=ltr] .sidebar-left-section-content>.checkbox-field .checkbox-box{left:auto}[dir=rtl] .sidebar-left-section-content>.checkbox-field .checkbox-box{right:auto}@media only screen and (max-width:600px){.sidebar-left-section-content>.btn-primary,.sidebar-left-section-content>.checkbox-ripple{border-radius:0}}.sidebar-left-section-content.full-width{margin:0!important}.sidebar-left-section-content>.media-sticker-wrapper{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.sidebar-left-section-name{padding:1rem}@media only screen and (max-width:600px){.sidebar-left-section-name{font-size:.875rem;padding:.5rem 1rem}}.sidebar-left-section-caption{color:var(--secondary-text-color);font-size:1rem;line-height:var(--line-height);margin-top:1rem;padding:0 1rem}@media only screen and (max-width:600px){.sidebar-left-section-caption{font-size:.875rem;margin:.5rem}}.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{align-items:center;display:flex;height:3.5rem;padding:0 1.125rem}.sidebar-left-section-disabled{opacity:.25;pointer-events:none!important}.sidebar-left-section .chatlist{padding:0}.sidebar-left-h2{color:var(--primary-color);font-size:16px;font-weight:var(--font-weight-bold)}.general-settings-container{-webkit-user-select:none;-moz-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,#poll-results-container,#search-gifs-container,#search-private-container,#stickers-container,.add-members-container{background-color:var(--surface-color)!important}.chat-folders-container .btn-control{margin-bottom:1.5rem}.two-step-verification{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{margin-bottom:1.125rem;margin-left:auto;margin-right:auto;max-width:342px;text-align:center}.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{height:168px;margin:.625rem auto 1.1875rem;width:168px}.two-step-verification .input-wrapper .btn-primary:first-child:last-child{margin-top:.25rem}.two-step-verification-enter-password .media-sticker-wrapper{height:157px;margin:1.125rem auto 1.8125rem;width:157px}.two-step-verification-hint .media-sticker-wrapper{height:160px;margin:.5rem auto 2.25rem;width:160px}.two-step-verification-email .media-sticker-wrapper{height:160px;margin:.5625rem auto 2.1875rem;width:160px}.two-step-verification-set .media-sticker-wrapper{height:160px;margin:1rem auto 1.3125rem;width:160px}[dir=ltr] .two-step-verification-set .media-sticker-wrapper .rlottie,[dir=ltr] .two-step-verification-set .media-sticker-wrapper .rlottie-vector{left:.625rem}[dir=rtl] .two-step-verification-set .media-sticker-wrapper .rlottie,[dir=rtl] .two-step-verification-set .media-sticker-wrapper .rlottie-vector{right:.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-title:first-child{font-weight:var(--font-weight-bold)}.active-sessions-container .row-title-right{color:var(--secondary-text-color);font-size:var(--font-size-12);line-height:var(--line-height-12)}.active-sessions-container .row-midtitle,.active-sessions-container .row-subtitle{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.active-sessions-container .sidebar-left-section:first-child{padding-bottom:0}.active-sessions-container .sidebar-left-section:first-child .row-title{font-weight:var(--font-weight-bold)}@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:var(--primary-text-color)}.range-setting-selector-value{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:var(--primary-color)}.background-container .background-item:after{border:3px solid var(--primary-color);bottom:0;content:\" \";display:block;left:0;opacity:0;position:absolute;right:0;top:0;transition:opacity .2s ease-in-out}.background-container .background-item.active:after{opacity:1}.background-container .background-item.active .grid-item-media{transform:scale(.91)}.background-container .background-item-media{transform:scale(1);transition:transform .2s ease-in-out}.background-container .background .preloader-container{z-index:1}.background-item{cursor:pointer}.background-item-media{border-radius:inherit}.background-item-media.is-pattern{background-color:#000;bottom:0;left:0;position:absolute;right:0;top:0}.background-item-media.is-pattern .media-photo{mix-blend-mode:soft-light}.background-item .media-photo{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.background-colors-canvas{border-radius:inherit;height:100%;-webkit-mask-position:center;-webkit-mask-size:cover;position:absolute;width:100%}.background-image-container .sidebar-left-section{padding-bottom:.5rem}.empty-placeholder{line-height:var(--line-height);margin:0 auto;padding:0 1rem;position:relative;text-align:center;top:40%;transform:translateY(-50%);-webkit-user-select:none;-moz-user-select:none;user-select:none;width:21rem!important}.empty-placeholder .media-sticker-wrapper{height:128px;margin:0 auto 1.9375rem;position:relative;width:128px}.empty-placeholder-header{font-size:1.25rem;font-weight:var(--font-weight-bold)}.empty-placeholder-subtitle{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}[dir=ltr] .empty-placeholder .btn-control:before{margin-right:.625rem}[dir=rtl] .empty-placeholder .btn-control:before{margin-left:.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}.is-forum-visible .can-have-forum .input-search,.is-forum-visible .can-have-forum .row-row,.is-forum-visible .can-have-forum .sidebar-header__title{opacity:0}.is-forum-visible .folders-tabs-scrollable{opacity:var(--disabled-opacity);pointer-events:none}.is-forum-visible.backwards .can-have-forum .input-search,.is-forum-visible.backwards .can-have-forum .row-row,.is-forum-visible.backwards .can-have-forum .sidebar-header__title,.is-forum-visible.backwards .folders-tabs-scrollable{opacity:1}.is-forum-visible.animating .can-have-forum .input-search,.is-forum-visible.animating .can-have-forum .row-row,.is-forum-visible.animating .can-have-forum .sidebar-header__title,.is-forum-visible.animating .folders-tabs-scrollable{transition:opacity var(--transition-standard-in)}.is-forum-visible.animating.backwards .can-have-forum .input-search,.is-forum-visible.animating.backwards .can-have-forum .row-row,.is-forum-visible.animating.backwards .can-have-forum .sidebar-header__title,.is-forum-visible.animating.backwards .folders-tabs-scrollable{transition:opacity var(--transition-standard-out)}#column-right{overflow:visible;overflow:initial;position:relative}@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)and (max-width:925px){body.is-right-column-shown:not(.is-left-column-shown) #column-right{transform:translateZ(0);transition:transform var(--transition-standard-in)}}@media only screen and (min-width:926px){body.is-right-column-shown #column-right{transform:translateZ(0);transition:transform var(--transition-standard-in)}}@media only screen and (min-width:601px){#column-right{position:absolute;right:0;transform:translate3d(var(--right-column-width),0,0);transition:transform var(--transition-standard-out);width:calc(var(--right-column-width));z-index:3}#column-right .sidebar-content{min-width:var(--right-column-width)}body.animation-level-0 #column-right{transition:none}}@media only screen and (min-width:1276px){#column-right{border-left:1px solid var(--border-color);transform:translate3d(calc(var(--right-column-width) + 1px),0,0);width:calc(var(--right-column-width) + 1px)}}#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{flex:1 1 auto;position:relative}#column-right .sidebar-search{display:none}#column-right .sidebar-search.active{display:flex}#column-right .input-wrapper{margin:.75rem 0;max-width:100%;padding:0 .75rem;width:100%}.shared-media-container .scrollable:not(.no-parallax){perspective:0;perspective-origin:0 0}.shared-media-container .scrollable:not(.no-parallax).parallax{perspective:1px}.shared-media-container .profile-content.is-me .profile-name{margin-bottom:.9375rem}.shared-media-container .profile-content.is-me .profile-subtitle{display:none}.shared-media-container .search-super{min-height:calc(var(--vh, 1vh)*100 - 56px);top:100%}.shared-media-container .search-super-tabs{--padding-horizontal:0}.shared-media-container .search-super-tabs .menu-horizontal-div-item{border-radius:0!important}.shared-media-container .sidebar-header .transition{flex-grow:1}.shared-media-container .sidebar-header .transition .transition-item{align-items:center;display:flex}.shared-media-container .btn-corner.menu-open:before{content:\"๎คฉ\"}@media only screen and (max-width:600px){.shared-media-container .btn-corner{bottom:14px;height:54px;position:fixed!important;right:14px;width:54px;z-index:1}}.shared-media-container.can-add-members .btn-corner:not(.is-hidden){transform:translateZ(0)}.search-super{background-color:var(--surface-color);display:flex;flex-direction:column;max-width:100%;min-height:100%;position:absolute;width:100%}.search-super .search-group__show-more{color:var(--primary-color);cursor:pointer;font-weight:400}.search-super .search-super-month-name{border-top:1px solid var(--border-color);color:var(--secondary-text-color);font-weight:var(--font-weight-bold);padding:24px 0 0 24px}@media only screen and (max-width:600px){.search-super .search-super-month-name{padding:18px 0 0 16px}}.search-super.sliding{max-height:none!important}.search-super-tabs{flex:1 1 auto;width:auto}.search-super-tabs-scrollable{background-color:var(--surface-color);box-shadow:none!important;position:sticky!important;top:0;z-index:2}.search-super-tabs-scrollable:before{background-color:inherit;content:\" \";display:block;height:1px;left:0;position:absolute;top:0;width:100%;z-index:-1}.search-super.is-full-viewport .search-super-tabs-scrollable:before{top:-1px}.search-super-tabs-scrollable .scrollable{display:flex;position:relative}.search-super-tabs-container{flex:1 1 auto;grid-template-rows:100%;min-height:calc(100% - 49px)}.search-super-tabs-container>div{background-color:var(--surface-color)!important;min-height:150px;position:relative}.search-super-tabs-container>div>div:first-child{min-height:calc(100vh - 111px);transform:translateY(0)}.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 .audio-title,.search-super .document-name,.search-super .title{display:flex;justify-content:space-between}.search-super .sent-time{color:var(--secondary-text-color);flex:0 0 auto;font-size:12px;margin-left:8px;margin-top:3px}.search-super-content-media .search-super-month-name{border:none;padding:9px 0 7px 24px}.search-super-content-media .video-time{background-color:var(--message-time-background);border-radius:4px;color:#fff;font-size:12px;height:18px;left:5px;line-height:18px;padding:0 6px 0 5px;position:absolute;top:4px;z-index:2}.search-super-content-media .grid-item{overflow:hidden}.search-super-content-media .checkbox-field{right:.25rem;top:.25rem}.search-super .checkbox-box{box-shadow:0 0 3px 0 rgba(0,0,0,.4)}.search-super .checkbox-box-border{border-color:var(--message-checkbox-border-color)}.search-super .checkbox-box-background{background-color:var(--message-checkbox-color)}.search-super .checkbox-field{margin:0;position:absolute!important;z-index:2}.search-super-content-media .search-super-month-items{grid-gap:1px;display:grid;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr);padding-top:1px;width:100%}.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{--icon-size:3rem;--icon-margin:.75rem;height:calc(48px + 1.5rem)}.search-super-content-files .document-download,.search-super-content-files .document-ico{border-radius:5px!important}.search-super-content-files .document-name{font-weight:400;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.search-super-content-links .search-super-item{cursor:pointer;display:flex;flex-direction:column;justify-content:flex-start;min-height:4.375rem;overflow:hidden;padding-left:4.4375rem;position:relative}.search-super-content-links .row-media{border-radius:.375rem;height:3rem;left:.6875rem;overflow:hidden;position:absolute;width:3rem}.search-super-content-links .row-media.empty{align-items:center;background-color:var(--primary-color);color:#fff;display:flex;font-size:2rem;justify-content:center;text-transform:uppercase}.search-super-content-links a:not(:last-child){position:relative;z-index:2}.search-super-content-links .anchor-url:last-child{position:static}.search-super-content-links .anchor-url:last-child:before{bottom:0;content:\" \";cursor:pointer;left:0;position:absolute;right:0;top:0;z-index:1}.search-super-content-links .media-photo{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.search-super-content-links .row-title{margin-top:.1875rem}.search-super-content-links .row-subtitle{overflow:hidden;text-overflow:ellipsis;white-space:pre-wrap;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{--offset-left:0!important;margin:2rem 0 0 -1.75rem!important;padding:0!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 0 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 0 12px}}.search-super-content-music .audio,.search-super-content-voice .audio{justify-content:normal;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-bottom:.5rem;padding-top:.5rem}.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{align-items:center;bottom:0;display:flex;justify-content:space-between;left:0;opacity:0;padding:0 1rem;position:absolute;right:0;top: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{color:var(--primary-text-color);flex-grow:1;font-weight:var(--font-weight-bold);margin-left:1.5rem;text-transform:capitalize;white-space:nowrap}#search-container .search-group.is-short .chatlist-chat:nth-child(n+4),#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-description:before,#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-time{display:none}#stickers-container .sticker-sets{display:flex;flex-direction:column;margin-top:16px}#stickers-container .sticker-set{cursor:pointer;display:flex;flex-direction:column;height:140px}#stickers-container .sticker-set-name{font-weight:var(--font-weight-bold)}#stickers-container .sticker-set-count{color:var(--secondary-text-color);font-size:14px}#stickers-container .sticker-set-header{display:flex;justify-content:space-between;padding-bottom:12px;padding-left:16px}#stickers-container .sticker-set-button{border-radius:16px;font-size:15px;font-weight:400;height:30px;margin-right:16px;padding-left:12px;padding-right:13px;transition:width .2s;width:auto}#stickers-container .sticker-set-button.gray{background:#f1f3f4;color:var(--secondary-text-color)}#stickers-container .sticker-set-stickers{display:flex;justify-content:space-around}#stickers-container .sticker-set-sticker{height:68px;position:relative;width:68px}#stickers-container .sticker-set-sticker:hover{background-color:var(--light-secondary-text-color);border-radius:12px}#stickers-container .sticker-set-sticker img{max-height:100%;max-width:100%}#poll-results-container .poll-results{display:flex;flex-direction:column;position:relative;width:100%}#poll-results-container .poll-results-answer{color:var(--secondary-text-color);display:flex;font-size:15px;font-weight:var(--font-weight-bold);justify-content:space-between;margin:0;padding:0 16px 8px;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (min-width:601px){#poll-results-container .poll-results-answer{padding:0 24px 8px}}#poll-results-container .poll-results-more{margin:0 .5rem;width:auto}@media only screen and (max-width:600px){#poll-results-container .poll-results-more{border-radius:0;margin:0}}#poll-results-container .poll-results h3{font-size:20px;margin-bottom:16px;margin-top:15px;padding:0 16px}@media only screen and (min-width:601px){#poll-results-container .poll-results h3{padding:0 24px}}#poll-results-container .poll-results hr{display:block!important;margin-bottom:15px;margin-top:7px}.edit-peer-container .input-wrapper{margin-bottom:.5625rem!important}.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!important}.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:var(--line-height)}.group-type-container .sidebar-left-section-caption{font-size:.875rem;margin-top:.8125rem}.group-type-container .input-wrapper{margin-top:.875rem!important}.media-viewer{align-items:center;background:rgba(0,0,0,.88);bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0}@media only screen and (max-width:600px){.media-viewer{background:#000}}.media-viewer-author{align-items:center;cursor:pointer;display:flex;height:100%}@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{font-weight:var(--font-weight-bold);line-height:var(--line-height);margin:.0625rem 0}@media only screen and (min-width:601px){.media-viewer-name{margin:.0625rem 0 .125rem}}.media-viewer-date{font-size:.875rem;line-height:var(--line-height)}.media-viewer-buttons{display:flex;flex-flow:row nowrap;padding:.5rem .75rem;position:absolute;right:0;top:0}.media-viewer-buttons .btn-icon{margin:0 .25rem;transition:var(--open-duration)}html.no-touch .media-viewer-buttons .btn-icon:active,html.no-touch .media-viewer-buttons .btn-icon:hover{color:#fff}@media only screen and (max-width:600px){.media-viewer-buttons{display:none}}.media-viewer-content{flex-direction:column;height:100%;justify-content:center}.media-viewer-container,.media-viewer-content{align-items:center;display:flex;max-height:100%;max-width:100%;overflow:hidden}.media-viewer-container{align-self:center;flex:1 1 auto;position:relative}.media-viewer-media{visibility:hidden}.media-viewer-caption{background-color:transparent;bottom:0;color:#fff;left:0;line-height:var(--line-height);opacity:0;overflow:hidden;padding:.5rem .5rem 0;position:absolute;right:0;text-align:center;text-overflow:ellipsis;white-space:pre-wrap;word-break:break-word;z-index:4}body.animation-level-2 .media-viewer-caption{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{height:6rem;margin:0 auto;max-height:6rem;max-width:50rem;padding:.5rem .875rem;position:relative}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{bottom:1.0625rem;text-align:inherit;transform:translateZ(0);width:100%}.media-viewer-caption .scrollable{height:auto;padding:0 .5rem}.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:active,html.no-touch .media-viewer-caption:hover{background-color:#000;opacity:1!important}}.media-viewer-caption.is-focused{background-color:#000;opacity:1!important}.media-viewer-switcher{cursor:pointer;height:calc(100% - 7.5rem);left:0;position:absolute;top:3.75rem;width:7rem}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-next-button,.media-viewer-prev-button{color:#fff;cursor:pointer;font-size:2rem;left:1rem;opacity:0;position:absolute;top:50%;transform:translateY(-50%) rotate(90deg);transition:var(--open-duration) opacity;z-index:5}@media only screen and (min-width:601px){.media-viewer-next-button,.media-viewer-prev-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{align-items:center;border-radius:0;display:flex;justify-content:center;left:0;min-height:auto!important;overflow:hidden;position:fixed!important;top:0;transform:translateZ(0) scaleX(1);transform-origin:top left}.media-viewer-mover:not(.center){-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}@media only screen and (max-width:600px){.media-viewer-mover{overflow:visible}}.media-viewer-mover .ckin__player{height:100%;left:0;position:absolute;top:0;width:100%}.media-viewer-mover>svg{height:100%;width:100%}.media-viewer-mover .canvas-thumbnail,.media-viewer-mover img,.media-viewer-mover video{height:100%;max-height:100%;max-width:100%;-o-object-fit:cover;object-fit:cover;opacity:1;position:absolute;transition:var(--open-duration) opacity;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.media-viewer-mover svg img,.media-viewer-mover svg video{position:static}.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;max-height:calc(var(--vh, 1vh)*100 - 15rem);max-width:100vw;top:50%!important;transform:translate3d(-50%,-50%,0)!important}@media only screen and (max-width:600px){.media-viewer-mover.center{height:100%!important;max-height:calc(var(--vh, 1vh)*100 - 120px);max-width:100vw!important;width:100%!important}.media-viewer-mover.center .ckin__player:not(.ckin__fullscreen) .default__controls{bottom:-62px}}.media-viewer-mover.center .canvas-thumbnail,.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{-o-object-fit:contain;object-fit:contain;width:auto}.media-viewer-mover.hiding .canvas-thumbnail,.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{align-items:center;display:flex;height:3.5rem;justify-content:space-between;left:0;padding:0 1.25rem;position:absolute;right:0;top:0;z-index:5}.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:active,html.no-touch .media-viewer-topbar .btn-icon:hover,html.no-touch .media-viewer-topbar .media-viewer-author:active,html.no-touch .media-viewer-topbar .media-viewer-author:hover{opacity:1}.media-viewer-topbar-left{align-items:center;display:flex}@media only screen and (max-width:600px){.media-viewer-topbar{padding:0 .5rem}}.media-viewer-aspecter{align-items:center;border-radius:0;display:flex;height:100%;justify-content:center;position:absolute;transform:scaleX(1);width:100%}.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;display:block;height:100%;left:0;position:fixed!important;top:0;transition:visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}body.animation-level-0 .media-viewer-whole{--open-duration:0s;--move-duration:0s}.media-viewer-whole.active{transition-delay:0s;visibility:visible}.media-viewer-whole.active .media-viewer-appear,.media-viewer-whole.active .overlays{opacity:1;visibility:visible}body.animation-level-2 .media-viewer-whole.active .media-viewer-appear,body.animation-level-2 .media-viewer-whole.active .overlays{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:not(.playback-rate){color:hsla(0,0%,100%,.4);opacity:1}.media-viewer-whole .btn-menu-toggle:not(.playback-rate).menu-open{background-color:hsla(207,4%,46%,.2)!important;color:#fff}.media-viewer-whole.hide-caption .media-viewer-caption{opacity:0!important;pointer-events:none}}.media-viewer-whole.highlight-switchers .media-viewer-switcher>span{opacity:1}.media-viewer-whole.no-forwards .canvas-thumbnail,.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;user-select:none}.media-viewer-movers{bottom:0;left:0;position:absolute;right:0;top: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{align-items:center;background-color:rgba(0,0,0,.4);border-radius:12px;bottom:1.25rem;display:flex;height:3.375rem;justify-content:space-between;left:50%;opacity:1;padding:.5rem;position:absolute;transform:translateX(-50%);width:17.125rem;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{opacity:.4;pointer-events:none}.zoom-container .progress-line{--color:#fff;--height:2px;flex:1 1 auto;margin:0 1px}.zoom-container .progress-line:before{opacity:1}.media-viewer-whole:not(.active) .zoom-container,.zoom-container:not(.is-visible){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{background-color:rgba(0,0,0,.2);height:100%;left:0;opacity:0;position:fixed!important;top:0;transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}.emoji-dropdown{background:var(--surface-color);display:flex;flex:1 1 auto;flex-direction:column;height:min(282px,calc(var(--vh)*100 - 135px));max-height:100%;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:var(--esg-width)}@media only screen and (min-height:570px)and (min-width:601px){.emoji-dropdown{-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:var(--menu-background-color);border-radius:1.25rem;bottom:5.125rem;box-shadow:0 5px 10px 5px rgba(16,35,47,.14);height:26.25rem;left:.8125rem;max-height:26.25rem;opacity:0;position:absolute!important;transform:scale(0);transform-origin:0 100%;transition:transform var(--esg-transition),opacity var(--esg-transition);z-index:3}.emoji-dropdown.active{opacity:1;transform:scale(1)}body.animation-level-0 .emoji-dropdown{transition:none}}.emoji-dropdown .emoji-container{height:100%;max-width:100%;overflow:hidden;width:100%}.emoji-dropdown .emoji-tabs{border:none;border-top:1px solid var(--border-color);justify-content:center}.emoji-dropdown .emoji-tabs:after{content:none}.emoji-dropdown .emoji-tabs-search{left:0;margin-left:.5rem!important;position:absolute}.emoji-dropdown .emoji-tabs-delete{margin-right:.5rem!important;position:absolute;right:0}.emoji-dropdown .emoji-tabs .menu-horizontal-div-item{margin:0 .75rem}.emoji-dropdown .tabs-container{height:100%}.emoji-dropdown .stickers-padding .category-items{gap:.25rem;padding:0 .1875rem}.emoji-dropdown #content-gifs .scrollable-y{padding:0 .1875rem}.emoji-dropdown .gifs-masonry{border-radius:10px;overflow:hidden}.emoticons-container{background-color:transparent;flex-direction:column;height:100%;min-height:100%}.emoticons-menu{--item-size:1.875rem;align-items:center;min-height:3.0625rem;padding:0 .3125rem;width:100%;z-index:4}.emoticons-menu,.emoticons-menu-wrapper{background-color:transparent;height:3.0625rem}.emoticons-menu-wrapper{border-bottom:1px solid var(--border-color);max-width:100%;padding:0;position:relative}.emoticons-menu:after{content:\" \";display:block;flex:0 0 auto;height:1px;width:.1875rem}.emoticons-menu .menu-horizontal-div-item{align-items:center;display:flex;flex:0 0 auto;font-size:1.5rem;height:var(--item-size);line-height:var(--item-size);margin:0 .3125rem;padding:0;width:var(--item-size)}.emoticons-menu .menu-horizontal-div-item.not-local{--item-size:2.375rem;border-radius:.25rem!important;padding:.25rem}.emoticons-menu .menu-horizontal-div-item.active{background-color:rgba(var(--primary-text-color-rgb),.06)!important}.emoticons-menu .menu-horizontal-div-item.active,html.no-touch .emoticons-menu .menu-horizontal-div-item:active,html.no-touch .emoticons-menu .menu-horizontal-div-item:hover{color:rgba(var(--primary-text-color-rgb),.8)!important}.emoticons-menu .menu-horizontal-div-item-padding{height:100%;position:relative;width:100%}.emoticons-menu .menu-horizontal-div-item.active:not(.tgico){background-color:var(--light-secondary-text-color)}.emoticons-menu .menu-horizontal-inner{border-radius:15px;flex:0 0 auto;margin:0 .3125rem;overflow:hidden;width:1.875rem}html.is-safari .emoticons-menu .menu-horizontal-inner{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}body.animation-level-2 .emoticons-menu .menu-horizontal-inner{transition:width .2s ease-in-out}.emoticons-menu .menu-horizontal-inner-scroll{align-items:center;display:flex;height:100%;position:relative;width:8.5rem}.emoticons-menu .menu-horizontal-inner .menu-horizontal-div-item{margin:0!important;transform:scale(1)}body.animation-level-2 .emoticons-menu .menu-horizontal-inner .menu-horizontal-div-item{transition:transform .2s ease-in-out!important}.emoticons-menu .menu-horizontal-inner.active{background-color:rgba(var(--primary-text-color-rgb),.06)!important;width:8.5rem}.emoticons-menu .menu-horizontal-inner.active .menu-horizontal-div-item{transform:scale(.8)}.emoticons-menu .menu-horizontal-inner.active .menu-horizontal-div-item.active{background-color:transparent!important}.emoticons-menu .menu-horizontal-inner:not(.active){cursor:pointer}.emoticons-menu .menu-horizontal-inner:not(.active) .menu-horizontal-inner-scroll{pointer-events:none}.emoticons-menu .menu-horizontal-inner:not(.active) .menu-horizontal-div-item:first-child{pointer-events:all}.emoticons-content{flex:1;padding:0;position:relative}.emoticons-content .emoji-category{position:relative}.emoticons-content .sticky_sentinel--top{height:1px;top:0}.emoticons-content .category-title{color:rgba(var(--primary-text-color-rgb),.42);cursor:pointer;font-size:var(--font-size-16);font-weight:var(--font-weight-bold);line-height:1.1875rem;padding:.75rem .875rem .375rem;position:relative;text-align:center;width:100%}.emoticons-content .category-title .btn-icon{font-size:1.25rem;pointer-events:all;position:absolute;right:.5rem;top:50%;transform:translateY(-50%);z-index:1}.emoticons-content:not(.has-premium) .is-premium-set .category-title:before{content:\"๎ฆ–\";line-height:inherit;margin-right:.125rem;vertical-align:middle}.emoji-padding .super-emojis{padding:0 .5rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar{height:0;opacity:0;width:0;width:.375rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar-thumb{height:0;width: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{display:none;height:0;width:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-corner{background-color:transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover{scrollbar-color:var(--scrollbar-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{-webkit-backdrop-filter:blur(100);backdrop-filter:blur(100);background-color:var(--scrollbar-color);border-radius:10px;max-height:12.5rem;min-height:5rem;opacity:1}.no-scrollbar::-webkit-scrollbar,.scrollable-x::-webkit-scrollbar{display:none}.scrollable{-webkit-overflow-scrolling:touch;bottom:0;height:100%;left:0;max-height:100%;overflow-x:hidden;overflow-y:hidden;position:absolute;right:0;top:0;width:100%}.scrollable.scrollable-x{-ms-overflow-style:none;overflow-x:auto;scrollbar-width:none}.scrollable.scrollable-y{-ms-overflow-style:none;overflow-y:auto;overflow-y:overlay;scrollbar-color:transparent transparent;scrollbar-width:thin;transform:translateZ(0)}.scrollable.scrollable-y.scrollable-y-bordered{border-bottom:1px solid transparent;border-top:1px solid transparent}body.animation-level-2 .scrollable.scrollable-y.scrollable-y-bordered{transition:border-top-color var(--transition-standard-in),border-bottom-color var(--transition-standard-in)}.scrollable.scrollable-y.scrollable-y-bordered:not(.scrolled-top){border-top-color:var(--border-color)}.scrollable.scrollable-y.scrollable-y-bordered:not(.scrolled-bottom){border-bottom-color:var(--border-color)}.scrollable-padding{height:100%;min-width:100%}@keyframes scaleIn{0%{transform:scale(.2)}to{transform:scale(1)}}.selector{display:flex;flex-direction:column;height:100%;width:100%}.selector .selector-search-section{margin-bottom:0!important;padding:0!important;position:relative;z-index:1}.selector-search-container{flex:0 0 auto;max-height:132px;overflow:hidden;position:relative}.selector-search-container .scrollable{max-height:inherit;position:relative}.selector-search{display:flex;flex-flow:wrap;padding-left:1rem;padding-right:1rem;position:relative}.selector-search-input{border:none;flex:1 1 auto;outline:none}.selector-search .selector-search-input{padding:7px 0 19px}[dir=ltr] .selector-user{padding-right:17px}[dir=rtl] .selector-user{padding-left:17px}[dir=ltr] .selector-user{margin-left:-.25rem;margin-right:.75rem}[dir=rtl] .selector-user{margin-left:.75rem;margin-right:-.25rem}.selector-user{background-color:var(--light-secondary-text-color);border-radius:1.5rem;color:var(--primary-text-color);flex:0 0 auto;font-size:1rem;height:2rem;line-height:2rem;margin-bottom:7px;max-width:11.25rem;overflow:hidden;text-overflow:ellipsis;transition:opacity .2s,transform .2s,background-color .2s;-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap}body.animation-level-0 .selector-user{transition:none}html.no-touch .selector-user:active,html.no-touch .selector-user:hover{background-color:var(--light-danger-color);cursor:pointer}html.no-touch .selector-user:active .selector-user-avatar:after,html.no-touch .selector-user:hover .selector-user-avatar:after{opacity:1;transform:scaleX(-1) rotate(-90deg)}body:not(.animation-level-0) .selector-user.scale-in{animation:scaleIn .15s ease forwards}body:not(.animation-level-0) .selector-user.scale-out{animation:scaleIn .1s ease forwards;animation-direction:reverse}[dir=ltr] .selector-user-avatar{margin-right:8px}[dir=rtl] .selector-user-avatar{margin-left:8px}.selector-user-avatar{border-radius:50%!important;float:left;overflow:hidden;position:relative}.is-rtl .selector-user-avatar{float:right}html.is-safari .selector-user-avatar{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}[dir=ltr] .selector-user-avatar:after{left:0}[dir=rtl] .selector-user-avatar:after{right:0}.selector-user-avatar:after{background-color:var(--danger-color);content:\"๎คฉ\";font-size:23px;height:100%;line-height:32px!important;opacity:0;position:absolute;top:0;transform:scaleX(-1) rotate(0deg);transition:opacity .2s,transform .2s;width:100%;z-index:2}body.animation-level-0 .selector-user-avatar:after{transition:none}.selector .chatlist-container{flex:1 1 auto;height:100%}.selector>hr{margin:0;padding:0}[dir=ltr] .selector .checkbox{padding-left:11px}[dir=rtl] .selector .checkbox{padding-right:11px}.selector .checkbox{margin-top:11px}.selector .checkbox-field{--offset-left:0!important;margin:0!important;padding:0!important;pointer-events:none;position:absolute!important;top:50%;transform:translateY(-50%);z-index:1}[dir=ltr] .selector .checkbox-field:first-child{margin-left:.6875rem;margin-right:1.6875rem}[dir=rtl] .selector .checkbox-field:first-child{margin-left:1.6875rem;margin-right:.6875rem}[dir=ltr] .selector .checkbox-field-round{right:1.125rem}[dir=rtl] .selector .checkbox-field-round{left:1.125rem}.selector .checkbox-field-round{--size:1.25rem}.selector .checkbox-field-round .checkbox-box-border{z-index:auto}.selector .checkbox-field-round .checkbox-box-check{--offset:6px}[dir=ltr] .selector-square .checkbox-field{left:1.25rem!important}[dir=rtl] .selector-square .checkbox-field{right:1.25rem!important}[dir=ltr] .selector-square .chatlist-chat.row-with-padding{padding-left:7.5rem!important}[dir=rtl] .selector-square .chatlist-chat.row-with-padding{padding-right:7.5rem!important}[dir=ltr] .selector-square .dialog-avatar{margin-left:3rem!important}[dir=rtl] .selector-square .dialog-avatar{margin-right:3rem!important}.gifs-masonry{grid-gap:.125rem;display:grid;gap:.125rem;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr)}.gifs-masonry .gif img,.gifs-masonry .gif video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.gifs-masonry .gif img{left:0;position:absolute;top:0}.gifs-masonry .preloader-container{z-index:2}.preloader-circular{animation:rotate 1s linear infinite;bottom:0;height:100%;left:0;margin:auto;position:absolute;right:0;top:0;transform-origin:center center}.preloader-path{stroke-dasharray:93.6375,124.85;stroke-dashoffset:0;stroke-linecap:round;stroke:#fff;stroke-width:3}.preloader-container{bottom:0;cursor:pointer;display:flex;height:54px;left:0;margin:auto;opacity:0;overflow:hidden;position:absolute;right:0;top:0;transform:scale(0);width:54px}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{height:100%;width:100%}.preloader-container .preloader-circular{animation:none;background-color:rgba(0,0,0,.3);border-radius:50%;height:100%;width: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.animating .you-spin-me-round,body.animation-level-2 .preloader-container.is-visible:not(.manual) .you-spin-me-round{animation:rotate 2s linear infinite}body.animation-level-2 .preloader-container.is-visible.animating .preloader-path-new,body.animation-level-2 .preloader-container.is-visible:not(.manual) .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{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{bottom:0;color:var(--color);height:56%;left:0;margin:auto;opacity:1;position:absolute;right:0;top:0;width:56%}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:active,html.no-touch .preloader-container .preloader-close:hover,html.no-touch .preloader-container .preloader-download:active,html.no-touch .preloader-container .preloader-download:hover{background:none}.preloader-container.manual .preloader-close,.preloader-container:not(.manual) .preloader-download{opacity:0}.preloader-container.manual .preloader-path-new{stroke-width:0}.preloader-container .preloader-download{height:1.5rem;width: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{background-color:var(--color);border-radius:.125rem;content:\"\";height:.8125rem;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:.8125rem}.preloader-container.preloader-transparent .preloader-circular{background-color:transparent}.preloader-container.preloader-bold .preloader-path-new{stroke-width:3.5}@keyframes rotate{to{transform:rotate(1turn)}}@keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}to{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-237%}}.rp{position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.btn-corner.rp .c-ripple,.btn-menu-toggle.rp .c-ripple,.menu-horizontal-div-item.rp .c-ripple,.pinned-container-wrapper.rp .c-ripple,.rp-overflow .c-ripple{border-radius:inherit;height:100%;overflow:hidden;width:100%}.btn-corner.rp .c-ripple__circle,.btn-menu-toggle.rp .c-ripple__circle,.menu-horizontal-div-item.rp .c-ripple__circle,.pinned-container-wrapper.rp .c-ripple__circle,.rp-overflow .c-ripple__circle{overflow:hidden}.c-ripple{--ripple-duration:.7s;bottom:0;left:0;position:absolute;right:0;top:0}html.is-safari .c-ripple:not(:empty){border-radius:inherit;-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.c-ripple__circle{animation:ripple-effect .7s forwards;background-color:var(--ripple-color);border-radius:50%;display:block;pointer-events:none;position:absolute;transform:scale(0);transition:opacity .35s,background-color .35s}.c-ripple__circle.hiding,.c-ripple__square.hiding{opacity:0}@media only screen and (max-width:925px){.c-ripple{--ripple-duration:.4s}.c-ripple__circle{animation-duration:.4s;animation-name:ripple-effect-handhelds;transition-duration:.3s}}@keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@keyframes ripple-effect-handhelds{0%{transform:scale(.27)}to{transform:scale(2)}}.avatar-like{--size:54px;--multiplier:1;color:#fff;font-size:calc(1.25rem/var(--multiplier));font-weight:var(--font-weight-bold);height:var(--size);line-height:var(--size)!important;text-align:center;text-transform:uppercase;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:var(--size)}avatar-element{--color-top:var(--avatar-color-top);--color-bottom:var(--avatar-color-bottom);background:linear-gradient(var(--color-top),var(--color-bottom));border-radius:50%}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(30px/var(--multiplier))!important}avatar-element.tgico-reply_filled:before{font-size:calc(28px/var(--multiplier))!important}avatar-element.tgico-deletedaccount{--color-top:var(--peer-avatar-archive-top);--color-bottom:var(--peer-avatar-archive-bottom);overflow:hidden}avatar-element.tgico-deletedaccount:before{font-size:calc(30px/var(--multiplier))}avatar-element:before{line-height:inherit!important}avatar-element.media-container{position:relative}avatar-element img{border-radius:inherit!important;display:block;height:var(--size)!important;width:var(--size)!important}avatar-element img.fade-in{animation:fade-in-opacity .2s ease forwards}avatar-element img.emoji{height:calc(1.125rem/var(--multiplier))!important;vertical-align:middle!important;width:calc(1.125rem/var(--multiplier))!important}avatar-element.is-forum{border-radius:var(--avatar-border-radius-forum)}avatar-element.is-topic{background:none;border-radius:0;position:relative}avatar-element.is-topic .topic-icon{--size:inherit}avatar-element.is-online{position:relative}avatar-element.is-online:after{background-color:var(--avatar-online-color);border:2px solid var(--surface-color);border-radius:50%;content:\" \";display:block;height:14px;left:2.4375rem;position:absolute;top:2.4375rem;width:14px}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-36{--size:36px;--multiplier:1.5}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.6875}avatar-element.avatar-26{--size:26px;--multiplier:2.076923}avatar-element.avatar-24{--size:24px;--multiplier:2.25}avatar-element.avatar-22{--size:22px;--multiplier:2.454545}avatar-element.avatar-18{--size:18px;--multiplier:3}avatar-element.avatar-16{--size:16px;--multiplier:3.375}.avatar-relative .avatar-photo{left:0;position:absolute;top:0}.avatar-full{align-items:center;border-radius:inherit;display:inline-flex;height:100%;justify-content:center;position:absolute;width:100%}.avatar-full .avatar-photo{height:100%!important;-o-object-fit:cover;object-fit:cover;width:100%!important}.document{--background-color:var(--primary-color);height:70px}.document .media-photo{border-radius:inherit}.document .media-photo.thumbnail{left:0}.document-ico{background-color:var(--background-color);border-radius:.375rem;line-height:1;text-align:center}html.is-safari .document-ico{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.document-ico-text{opacity:0}body.animation-level-2 .document-ico-text{transition:opacity .2s ease-in-out}.document:not(.document-with-thumb) .document-ico{padding:1.5625rem .25rem 0}@media only screen and (max-width:600px){.document:not(.document-with-thumb) .document-ico{font-size:14px;padding:1.5rem 0 0}.document:not(.document-with-thumb) .document-ico:after{--size:.875rem}}.document-ico:after{--size:1.125rem;border-bottom-color:rgba(0,0,0,.25);border-bottom-left-radius:.25rem;border-left-color:rgba(0,0,0,.25);border-right-color:var(--message-background-color);border-style:solid;border-top-color:var(--message-background-color);border-width:calc(var(--size)/2);content:\"\";display:block;position:absolute;right:0;top:0}body.animation-level-2 .document-ico:after{transition:border-width .2s ease-in-out}html.no-touch .document:not(.downloaded):active .document-ico:after,html.no-touch .document:not(.downloaded):hover .document-ico:after{border-width:0}html.no-touch .document:not(.downloaded):active .document-ico-text,html.no-touch .document:not(.downloaded):hover .document-ico-text{opacity:0}html.no-touch .document:not(.downloaded):active .preloader-container,html.no-touch .document:not(.downloaded):hover .preloader-container{opacity:1!important}.document:not(.downloading) .document-ico-text{opacity:1}.document:not(.downloading) .preloader-container{opacity:0!important}.document.downloading .document-ico:after{border-width:0}.document-ico{background-size:contain;font-size:1.125rem}.document-ico,.document-name,.document-size{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.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,.2);border-radius:.375rem}.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{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.document-name{font-size:var(--font-size-16);font-weight:var(--font-weight-bold);line-height:var(--line-height-16);white-space:nowrap}.document-size{color:var(--secondary-text-color);font-size:var(--font-size-14);line-height:var(--line-height-14);pointer-events:none;position:relative}.document .preloader-container{height:2.5rem;width:2.5rem}@media only screen and (max-width:600px){.document .preloader-container{height:1.625rem;width:1.625rem}}.document .preloader-circular{background-color:transparent!important}.document .preloader-path-new{stroke-width:2.5}[dir=ltr] .audio,[dir=ltr] .document{padding-left:var(--padding-left)}[dir=rtl] .audio,[dir=rtl] .document{padding-right:var(--padding-left)}.audio,.document{--padding:0px;--icon-size:3.375rem;--icon-margin:.875rem;--padding-left:calc(var(--icon-size) + var(--icon-margin) + var(--padding));cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding:var(--padding);-webkit-user-select:none;-moz-user-select:none;user-select:none}[dir=ltr] .audio-download,[dir=ltr] .audio-ico,[dir=ltr] .document-download,[dir=ltr] .document-ico{margin-left:calc((var(--padding-left) - var(--padding))*-1)}[dir=rtl] .audio-download,[dir=rtl] .audio-ico,[dir=rtl] .document-download,[dir=rtl] .document-ico{margin-right:calc((var(--padding-left) - var(--padding))*-1)}.audio-download,.audio-ico,.document-download,.document-ico{color:#fff;height:var(--icon-size);position:absolute;width:var(--icon-size)}.audio-download,.document-download{align-items:center;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;opacity:1;transition:opacity .2s ease-in-out;z-index:1}.audio-download.downloaded,.document-download.downloaded{opacity:0}.audio-description,.document-description{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio:not(.corner-download) .preloader-container:not(.preloader-streamable),.document:not(.corner-download) .preloader-container:not(.preloader-streamable){transform:scale(1)!important}.audio .checkbox-field-round,.document .checkbox-field-round{--margin-top:.25rem;--margin-left:.125rem;left:auto;margin-left:calc(var(--padding-left)*-1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto}.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){height:100%;width:100%}.audio{--icon-size:3rem;--icon-margin:.5625rem;height:var(--icon-size);overflow:visible!important}.audio-download,.audio-toggle{align-items:center;background-color:var(--primary-color);border-radius:50%}.audio.corner-download .audio-download{background:none;display:flex!important;height:1.375rem;left:57.5%;margin:0!important;top:57.5%;width:1.375rem}.audio.corner-download .preloader-container{background-color:var(--primary-color);border-radius:inherit}.audio.corner-download .preloader-path-new{stroke-width:.25rem}.audio-play-icon{border-radius:inherit;bottom:0;left:0;max-height:100%;max-width:100%;overflow:hidden;position:absolute;right:0;top:0;transform:rotate(-119deg)}body.animation-level-2 .audio-play-icon{transition:transform .25s ease-in-out}.audio-toggle .part{background-color:#fff;left:50%;position:absolute;top: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:100%}.audio-waveform-background rect{opacity:.3}html.no-touch .audio-waveform-background rect:active,html.no-touch .audio-waveform-background rect:hover{opacity:1}.audio-waveform-fake{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0;width:0}.audio-waveform-container{height:23px;margin-top:1px;position:relative}.audio-waveform rect{fill:var(--primary-color)}.audio .audio-details{margin-bottom:0;margin-top:3px}.audio .audio-title{margin-bottom:-2px}.audio .part{height:112px!important;width:112px!important}@media only screen and (max-width:600px){.audio .part{height:100px!important;width:100px!important}}.audio-title{color:var(--primary-text-color);font-size:1rem}.audio-description:not(:empty):before{content:\" โ€ข \"}.audio-subtitle,.audio-time{color:var(--secondary-text-color);display:flex;font-size:.875rem}@media only screen and (max-width:600px){.audio-subtitle,.audio-time{font-size:.75rem}}.audio-subtitle,.audio-time,.audio-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio-subtitle{align-items:center}.audio-subtitle .audio-time{flex:0 0 auto;margin-right:.25rem}.audio-subtitle,.audio-title{margin-left:-1px}.audio-title,.audio:not(.audio-show-progress) .audio-subtitle{max-width:100%}.audio.is-voice .audio-time{align-items:center;line-height:1;margin-left:-1px;margin-top:7px}@media only screen and (max-width:600px){.audio.is-voice .audio-time{margin-top:.3125rem}.audio.is-voice .audio-waveform-container{height:16px;margin-top:0}}.audio.is-voice.is-unread .audio-time:after{background-color:var(--primary-color);border-radius:50%;content:\" \";height:.5rem;margin-left:.375rem;width:.5rem}.audio.is-voice.is-unread:not(.is-out) .audio-toggle:not(.playing)+.audio-waveform-container .audio-waveform-background rect{opacity:1}.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{background-color:transparent;opacity:1;z-index: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;height:inherit;-o-object-fit:cover;object-fit:cover;width: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{align-items:center;display:flex;justify-content:center;left:0;position:absolute;top:8px;transform:translate3d(0,calc(-100% - 10px),0);transition:transform .2s ease;width:100%}body.animation-level-0 .quiz-hint{transition:none}.quiz-hint.active{transform:translateZ(0)}[dir=ltr] .quiz-hint .container{text-align:left}[dir=rtl] .quiz-hint .container{text-align:right}.quiz-hint .container{align-items:center;background:rgba(0,0,0,.7);border-radius:12px;color:#fff;display:flex;flex-wrap:wrap;font-size:15px;line-height:1.5;max-width:400px;min-height:48px;overflow:hidden;padding:10px 18px 12px 50px;position:relative;text-align:center;width:auto}@media only screen and (max-width:600px){.quiz-hint .container{font-size:14px;margin:0 10px;padding:10px 18px 12px 54px}}.quiz-hint .container .text{word-break:break-word}.quiz-hint .container:before{content:\"๎ฅ—\";font-size:1.5rem;left:15px;position:absolute;top:12px}.quiz-hint .container a{border-bottom:1px solid #fff;color:#fff}.peer-typing{margin-right:4px}.peer-typing-container{--color:var(--primary-color);color:var(--color)}.peer-typing-flex{align-items:center;display:flex}.peer-typing:not(.peer-typing-text):not(.peer-typing-choosing-sticker){display:inline-block;transform:translateY(-1px);vertical-align:middle}.peer-typing-text-dot{animation-duration:.6s;animation-iteration-count:infinite;animation-name:dotMiddle;animation-timing-function:linear;background-color:var(--color);border-radius:50%;display:inline-block;height:6px;margin:0 .5px;vertical-align:middle;width:6px}.peer-typing-text-dot:first-child{animation-name:dotFirst}.peer-typing-text-dot:last-child{animation-name:dotLast}.peer-typing-upload{border-radius:2px;height:5px;margin-right:.375rem;overflow:hidden;position:relative;width:13px}.peer-typing-upload:after,.peer-typing-upload:before{background-color:var(--color);border-radius:inherit;bottom:0;content:\" \";display:block;left:0;position:absolute;right:0;top:0}.peer-typing-upload:before{opacity:.3}.peer-typing-upload:after{animation:upload 1s ease-in-out infinite}.peer-typing-record{margin-right:.375rem}.peer-typing-record:before{animation:recordBlink 1.25s infinite;background-color:var(--color);border-radius:50%;content:\" \";display:block;height:6px;width:6px}.peer-typing-choosing-sticker{align-items:center;display:flex;flex:0 0 auto;height:16px;margin-right:.375rem}.peer-typing-choosing-sticker-eye{animation:eye 1.8s ease-in-out infinite;border:1px solid var(--color);border-radius:50%;display:inline-block;height:14px;margin:0 .0625rem;position:relative;vertical-align:middle;width:8px}.peer-typing-choosing-sticker-eye:before{animation:eye-move 1.8s ease-in-out infinite;background-color:var(--color);border-radius:50%;content:\" \";display:block;height:.25rem;position:absolute;top:50%;transform:translate(-1px,-50%);width:.25rem}@keyframes dotFirst{0%{opacity:.8;transform:scale(.6666666667)}50%{opacity:.8;transform:scale(.6666666667)}75%{opacity:1;transform:scale(1)}to{opacity:.8;transform:scale(.6666666667)}}@keyframes dotMiddle{0%{opacity:.9;transform:scale(.8333333333)}12.5%{opacity:.8;transform:scale(.6666666667)}62.5%{opacity:.8;transform:scale(.6666666667)}87.5%{opacity:1;transform:scale(1)}to{opacity:.9;transform:scale(.8333333333)}}@keyframes dotLast{0%{opacity:1;transform:scale(1)}25%{opacity:.8;transform:scale(.6666666667)}75%{opacity:.8;transform:scale(.6666666667)}to{opacity:1;transform:scale(1)}}@keyframes upload{0%{transform:translateX(-13px)}to{transform:translate(13px)}}@keyframes eye{0%{transform:scale(1.1) translateX(-.75px)}12.5%{transform:scale(1) translateX(0)}25%{transform:scale(1.1) translateX(.375px)}50%{transform:scale(1.1) translateX(.75px)}62.5%{transform:scale(1) translateX(0)}75%{transform:scale(1.1) translateX(-.375px)}to{transform:scale(1.1) translateX(-.75px)}}@keyframes eye-move{0%{transform:translate(-1px,-50%)}25%{transform:translate(3px,-50%)}50%{transform:translate(3px,-50%)}75%{transform:translate(-1px,-50%)}to{transform:translate(-1px,-50%)}}poll-element{color:var(--primary-text-color);display:block;margin-top:-1px;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:330px}@media only screen and (max-width:600px){poll-element{max-width:100%;width:240px}}poll-element:not(.is-closed):not(.is-voted) .poll-answer{cursor:pointer}poll-element .poll-title{font-weight:var(--font-weight-bold)}@media only screen and (max-width:600px){poll-element .poll-title{max-width:88%;white-space:normal}}poll-element .poll-desc{align-items:center;color:var(--secondary-text-color);display:flex;font-size:14px;margin-bottom:5px;margin-top:2px;position:relative}poll-element .poll-type{margin-top:2px}poll-element .poll-hint{color:var(--primary-color);cursor:pointer;font-size:1.5rem;position:absolute;right:2px;top:-4px;transform:scale(1)}body.animation-level-2 poll-element .poll-hint{transition:transform .2s ease}poll-element .poll-hint.active{pointer-events:none;transform:scale(0)}poll-element .poll-send-vote{cursor:default}poll-element .poll-avatars{cursor:pointer;display:flex;margin-left:18px}poll-element .poll-avatar{border:1px solid var(--border-color);cursor:pointer;height:18px;width:18px}poll-element .poll-answer{display:flex;margin-top:1px;padding-bottom:20px;padding-left:28px;position:relative}poll-element .poll-answer-text{margin-left:12px;margin-top:6px}[dir=ltr] poll-element .poll-answer-percents{text-align:right}[dir=rtl] poll-element .poll-answer-percents{text-align:left}poll-element .poll-answer-percents{font-size:14px;font-weight:var(--font-weight-bold);left:0;margin-left:-9px;margin-top:7px;opacity:0;position:absolute;top:0;width:40px}poll-element .poll-answer-selected{align-items:center;background:var(--primary-color);border-radius:50%;bottom:1px;color:#fff;display:flex;font-size:.75rem;font-weight:var(--font-weight-bold);height:16px;justify-content:center;left:15px;opacity:1;position:absolute;width:16px}poll-element .poll-answer-selected:before{content:\"๎ค€\";font-weight:var(--font-weight-bold)}html.no-touch poll-element .poll-answer:active .animation-ring,html.no-touch poll-element .poll-answer:hover .animation-ring{transform:scale(1);visibility:visible}poll-element .poll-answer.is-voting .progress-ring__circle{stroke-dashoffset:-19.792;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:var(--secondary-text-color);font-size:.875rem;margin-top:-.5rem}poll-element .poll-line{stroke-dashoffset:0;stroke-dasharray:0,485.9;bottom:2px;height:35px;left:10px;position:absolute}poll-element .poll-line use{stroke-width:4px;stroke-linecap:round;stroke:var(--primary-color);fill:none}poll-element .poll-footer{height:2.875rem;margin:-.375rem -.5rem -.375rem -.625rem;text-align:center}poll-element .poll-footer-button{border-top-left-radius:0!important;border-top-right-radius:0!important;color:var(--primary-color);cursor:pointer;font-size:1rem;font-weight:var(--font-weight-bold);height:100%;overflow:hidden;width:100%}poll-element .poll-footer,poll-element .poll-footer-button{align-items:center;display:flex;justify-content:center}poll-element .poll-quiz-timer{stroke:#a3adb6;fill:none;stroke-linecap:round;height:32px;position:absolute;right:-2px;top:-7px;transform:rotate(270deg);width:32px}poll-element .poll-time{color:#a3adb6;font-size:12px;font-weight:var(--font-weight-bold);position:absolute;right:27px}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) use{stroke:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected{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{align-items:center;display:flex;height:34px;justify-content:center;left:-1px;position:absolute;top:-1px;transform:scale(1);width:34px}poll-element .circle-hover .poll-answer-selected{animation:none;display:flex!important;font-size:20px;height:20px;left:50%;line-height:16px;opacity:0;top:50%;transform:translate(-50%,-50%);width:20px}body.animation-level-2 poll-element .circle-hover .poll-answer-selected{transition:opacity .2s ease}poll-element .animation-ring{background-color:var(--light-secondary-text-color);border-radius:50%;display:block;height:34px;transform:scale(.1);visibility:hidden;width:34px}body.animation-level-2 poll-element .animation-ring{transition:transform .12s ease}poll-element .progress-ring{height:26px;left:auto;top:auto;width:26px}poll-element .progress-ring__circle{stroke-dasharray:56.5487,56.5487;stroke-dashoffset:0;stroke-opacity:1;stroke-width:2;stroke:var(--poll-circle-color);fill:transparent;transform:rotate(-90deg);transform-origin:center}poll-element.is-voted .animation-ring,poll-element.is-voted .circle-hover{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 forwards .1s ease}poll-element.animating.is-retracting .poll-answer-selected{transition-delay:0s}poll-element.animating .poll-answer-percents{transition:opacity .34s}poll-element.animating .progress-ring__circle{transition:stroke-dashoffset .15s}poll-element.animating .circle-hover{transition:transform .1s}poll-element.is-multiple .poll-desc{margin-bottom:.5rem}poll-element .c-ripple__circle{background-color:var(--light-primary-color)}@keyframes pollAnswerRotate{to{transform:rotate(270deg)}}.transition>.transition-item{animation-fill-mode:forwards!important;height:100%;left:0;position:absolute;top:0;width:100%}.transition>.transition-item:not(.active):not(.from):not(.to){display:none!important}.transition.zoom-fade>.from{opacity:1;transform:scale(1);transform-origin:center}.transition.zoom-fade>.to{opacity:0;transform-origin:center}.transition.zoom-fade.animating>.from{animation:fade-out-opacity .15s ease}.transition.zoom-fade.animating>.to{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(.95)}.transition.zoom-fade.backwards.animating>.from{animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease}.transition.zoom-fade.backwards.animating>.to{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{opacity:1;transform:translateX(0);transform-origin:left center}.transition.slide-fade>.to{opacity:0;transform:translateX(1.5rem);transform-origin:left center}.transition.slide-fade.animating>.from{animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s}.transition.slide-fade.animating>.to{animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s}.transition.slide-fade.backwards>.from{opacity:1;transform:translateX(0)}.transition.slide-fade.backwards>.to{opacity:0;transform:translateX(-1.5rem)}.transition.slide-fade.backwards.animating>.from{animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s}.transition.slide-fade.backwards.animating>.to{animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s}@keyframes zoom-fade-in-move{0%{transform:scale(1.1)}to{transform:scale(1)}}@keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}to{transform:scale(1.1)}}@keyframes zoom-fade-out-backwards-move{0%{transform:scale(.95)}to{transform:scale(1)}}@keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}to{transform:translateX(0)}}@keyframes slide-fade-out-move{0%{transform:translateX(0)}to{transform:translateX(-1.5rem)}}@keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}to{transform:translateX(1.5rem)}}@keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}to{transform:translateX(0)}}.row{display:flex;flex-direction:column;justify-content:center;min-height:3.5rem;padding:.4375rem 1rem;position:relative}.row.no-subtitle,.row.row-small{min-height:3rem;padding-bottom:.1875rem;padding-top:.1875rem}body.animation-level-2 .row{transition:opacity var(--transition-standard-in)}.row.is-disabled{opacity:var(--disabled-opacity);pointer-events:none!important}.row.no-wrap{padding-bottom:0!important;padding-top:0!important}.row a{pointer-events:all;position:relative;z-index:1}.row-title-row,.row>.row-title{order:0}[dir=ltr] .row-big{padding-left:1rem;padding-right:.75rem}[dir=rtl] .row-big{padding-left:.75rem;padding-right:1rem}.row-big{min-height:4.5rem;padding-bottom:.5625rem;padding-top:.5625rem}.row-row{align-items:center;display:flex;justify-content:space-between}.row-row .row-subtitle,.row-row .row-title{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.row-subtitle-row,.row>.row-subtitle{order:1}.row-title{color:var(--primary-text-color);font-size:var(--font-size);line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;word-break:break-word}.row-title-right-secondary{color:var(--secondary-text-color)}[dir=ltr] .row-subtitle-right,[dir=ltr] .row-title-right{margin-left:1rem}[dir=rtl] .row-subtitle-right,[dir=rtl] .row-title-right{margin-right:1rem}.row-subtitle-right,.row-title-right{flex:0 0 auto!important}.row-midtitle,.row-subtitle,.row-title{pointer-events:none;position:relative}.row-midtitle{font-size:var(--font-size-14);margin-top:.125rem;order:1}[dir=ltr] .row-with-padding{padding-left:4.5rem}[dir=rtl] .row-with-padding{padding-right:4.5rem}@media only screen and (max-width:600px){[dir=ltr] .row-with-padding{padding-left:4rem}[dir=rtl] .row-with-padding{padding-right:4rem}}[dir=ltr] .row-with-padding.tgico:before{left:1rem}[dir=rtl] .row-with-padding.tgico:before{right:1rem}.row-with-padding.tgico:before{color:var(--secondary-text-color);font-size:1.5rem;pointer-events:none;position:absolute;top:50%;transform:translateY(-50%);z-index:1}.row-with-padding:not(.row-with-icon):before{display:none}.row-clickable{cursor:pointer;overflow:hidden}@media only screen and (min-width:601px){.row-clickable{border-radius:10px}}[dir=ltr] .row-sortable .row-subtitle,[dir=ltr] .row-sortable .row-title{padding-right:2.5rem}[dir=rtl] .row-sortable .row-subtitle,[dir=rtl] .row-sortable .row-title{padding-left:2.5rem}[dir=ltr] .row-sortable-icon{right:.75rem}[dir=rtl] .row-sortable-icon{left:.75rem}.row-sortable-icon{color:var(--secondary-text-color);font-size:1.5rem;height:1.5rem;line-height:1;opacity:0;pointer-events:none;position:absolute;top:50%;transform:translateY(-50%)}.row-sortable.cant-sort .row-sortable-icon{display:none}.row-sortable.is-dragging{background-color:var(--surface-color)!important;z-index:1}html.no-touch .row-sortable.is-dragging:active,html.no-touch .row-sortable.is-dragging:hover{background-color:var(--light-filled-secondary-text-color)!important}html.no-touch .row-sortable:active .row-sortable-icon,html.no-touch .row-sortable:hover .row-sortable-icon{opacity:1}body.animation-level-2 .is-reordering .row-sortable{transition:transform var(--transition-standard-in)}[dir=ltr] .row .checkbox-field,[dir=ltr] .row .radio-field-main{padding-left:3.375rem}[dir=rtl] .row .checkbox-field,[dir=rtl] .row .radio-field-main{padding-right:3.375rem}[dir=ltr] .row .checkbox-field,[dir=ltr] .row .radio-field-main{margin-left:-3.375rem}[dir=rtl] .row .checkbox-field,[dir=rtl] .row .radio-field-main{margin-right:-3.375rem}.row .checkbox-field,.row .radio-field,.row .radio-field:not(.radio-field-right) .radio-field-main{position:static}.row .checkbox-field,.row .radio-field{--offset-left:1rem}.row .radio-field{margin-bottom:0;margin-top:0}[dir=ltr] .row .checkbox-field{margin-right:0}[dir=rtl] .row .checkbox-field{margin-left:0}.row .checkbox-field{height:auto;margin-bottom:0;margin-top:0}[dir=ltr] .row .checkbox-field .checkbox-caption{padding-left:0}[dir=rtl] .row .checkbox-field .checkbox-caption{padding-right:0}.row .checkbox-field .checkbox-caption{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.row .checkbox-field-toggle{margin-left:.125rem;margin-right:.125rem;padding:0}.row-subtitle{color:var(--secondary-text-color)!important;font-size:var(--font-size-14)!important;line-height:var(--line-height-14);margin-top:.1875rem}.row-subtitle:empty{display:none}[dir=ltr] .row-media{left:.75rem}[dir=rtl] .row-media{right:.75rem}.row-media{align-items:center;display:flex;height:2.25rem!important;justify-content:center;margin:0!important;pointer-events:none;position:absolute!important;width:2.25rem!important}[dir=ltr] .row-media-small{left:.75rem!important}[dir=rtl] .row-media-small{right:.75rem!important}.row-media-small{height:2rem!important;width:2rem!important}[dir=ltr] .row-media-abitbigger{left:.75rem!important}[dir=rtl] .row-media-abitbigger{right:.75rem!important}.row-media-abitbigger{height:2.625rem!important;width:2.625rem!important}[dir=ltr] .row-media-big{left:.5rem!important}[dir=rtl] .row-media-big{right:.5rem!important}.row-media-big{height:3rem!important;width:3rem!important}[dir=ltr] .row-media-bigger{left:.5625rem!important}[dir=rtl] .row-media-bigger{right:.5625rem!important}.row-media-bigger{height:3.375rem!important;width:3.375rem!important}.row.menu-open{background-color:var(--light-secondary-text-color)}[dir=ltr] .row>.btn-primary{right:1rem}[dir=rtl] .row>.btn-primary{left:1rem}.row>.btn-primary{border-radius:.9375rem;font-size:.9375rem;height:1.875rem;line-height:1.875rem;margin:0;padding-left:.75rem;padding-right:.75rem;position:absolute;top:50%;transform:translateY(-50%);width:auto}body.animation-level-2 .row>.btn-primary{transition:width .2s,background-color .2s,color .2s}.row>.btn-primary.active{background-color:var(--light-primary-color)!important;color:var(--primary-color)}.color-picker{margin:1.1875rem auto .25rem;max-width:100%;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:380px}@media only screen and (max-width:600px){.color-picker{padding:0 .75rem}}.color-picker-box{height:198px;width:100%}.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: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:var(--surface-color);border-radius:10px;bottom:calc(100% + .625rem);box-shadow:0 5px 10px 5px rgba(16,35,47,.14);display:flex!important;flex-direction:column;max-height:26.25rem;max-width:100%;opacity:0;overflow:hidden;padding:0!important;position:absolute!important;right:0;transform:scale(0);transform-origin:bottom right;transition:transform var(--esg-transition),opacity var(--esg-transition);width:26.25rem!important;z-index:3}@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{background-color:transparent;border:2px solid var(--primary-color);border-radius:.375rem;color:var(--primary-color);font-size:.9375rem;font-weight:var(--font-weight-bold);height:3rem;text-align:center;width:100%}body.animation-level-2 .reply-keyboard-button{transition:color .15s,background-color .15s}html.no-touch .reply-keyboard-button:active,html.no-touch .reply-keyboard-button:hover{background-color:var(--primary-color);color:#fff}.reply-keyboard-button+.reply-keyboard-button{margin-left:.3125rem}.reply-keyboard .scrollable-y{bottom:auto;height:auto;left:auto;max-height:100%;padding:.625rem!important;position:relative;right:auto;top:auto}.peoplenearby-container div.text.nearby-description{color:var(--primary-text-color);margin-top:15px;text-align:center}.peoplenearby-container div.text.nearby-error{color:var(--gc-secondary-text-color);margin-top:10px;text-align:center}.peoplenearby-container .locating-animation-container{align-items:center;display:flex;justify-content:center;min-height:140px;width:100%}.peoplenearby-container .locating-animation-container .tgico.tgico-location{align-items:center;background:var(--avatar-color-bottom);border-radius:50%;display:flex;height:140px;justify-content:center;padding:50px;width:140px}.peoplenearby-container .locating-animation-container .tgico.tgico-location:before{color:#fff;font-size:58px}.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{animation:waves-animation 3s infinite;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%);height:50px;margin-left:36px;width:50px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-2,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{animation:waves-animation 5s infinite;animation-delay:2s;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%);height:71px;margin-left:51px;margin-top:1px;width:66px}.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)}@keyframes waves-animation{0%{opacity:1}50%{opacity:0}to{opacity:1}}.spoiler{--anim:.4s ease;background-color:var(--spoiler-background-color)}.spoiler-text{opacity:0}.spoilers-container .custom-emoji-canvas{z-index:-1}.spoilers-container.is-spoiler-visible.animating .spoiler{transition:background-color var(--anim)}.spoilers-container.is-spoiler-visible.animating .spoiler-text{transition:opacity var(--anim)}.spoilers-container.is-spoiler-visible:not(.backwards) .spoiler{background-color:transparent}.spoilers-container.is-spoiler-visible:not(.backwards) .spoiler-text{opacity:1}.spoilers-container:not(.is-spoiler-visible) .spoiler{cursor:pointer}.spoilers-container:not(.is-spoiler-visible) .spoiler-text{pointer-events:none}.emoji-animation,.emoji-animation-container{pointer-events:none;position:absolute}.emoji-animation-container{bottom:0;left:0;overflow:hidden;right:0;top:0;z-index:3}.reactions-block{display:flex;flex-wrap:wrap;-webkit-user-select:none;-moz-user-select:none;user-select:none}.reactions-block.has-no-reactions{display:inline;display:initial}.reactions-inline{display:inline-flex}.reactions-inline:not(:empty){margin-right:.125rem}.reaction,.reaction-sticker{align-items:center;display:flex}.reaction-sticker{--custom-emoji-size:var(--reaction-size);height:var(--reaction-size);justify-content:center;position:relative;width:var(--reaction-size)}.reaction-sticker-activate{bottom:var(--reaction-offset);left:var(--reaction-offset);position:absolute;right:var(--reaction-offset);top:var(--reaction-offset);z-index:1}.reaction-sticker.has-animation>.media-sticker{opacity:0}.reaction-sticker:not(.is-static):not(.is-custom) .media-sticker{--size:calc(var(--reaction-size) + var(--reaction-offset)*-2);bottom:auto;height:var(--size)!important;left:auto;max-height:var(--size);max-width:var(--size);right:auto;top:auto;width:var(--size)!important}.reaction-sticker.is-custom{border-radius:.3125rem}.reaction-sticker.is-custom .custom-emoji,.reaction-sticker.is-custom .media-sticker{border-radius:inherit}.reaction-sticker.is-custom .custom-emoji-canvas{z-index:auto}.reaction-inline{--reaction-size:.875rem;--reaction-offset:-.4375rem;min-height:var(--reaction-size);min-width:var(--reaction-size)}.reaction-inline .reaction-counter{font-size:inherit!important;margin-right:.0625rem!important;order:-1}.reaction-block{--additional-height:.5rem;--margin:.375rem;--reaction-size:1.375rem;--reaction-offset:-.5625rem;--background-color:var(--message-highlightning-color);--chosen-background-color:var(--message-primary-color);--counter-color:#fff;--reaction-total-size:calc(var(--reaction-size) + var(--additional-height));background-color:var(--background-color);border-radius:var(--reaction-total-size);color:var(--counter-color);cursor:pointer;height:var(--reaction-total-size);margin-right:var(--margin);margin-top:var(--margin);padding:0 .5rem;position:relative}html.no-touch .reaction-block:active:after,html.no-touch .reaction-block:hover:after{background-color:var(--chosen-background-color);border-radius:inherit;bottom:0;content:\" \";left:0;opacity:.08;position:absolute;right:0;top:0}.reaction-block .reaction-counter,.reaction-block .reaction-sticker{z-index:1}.reaction-block:last-child{margin-right:0}.reaction-block:before{background-color:var(--chosen-background-color);border-radius:inherit;bottom:0;content:\" \";left:0;opacity:0;position:absolute;right:0;top:0;transform:scale(0)}.reaction-block.is-chosen:not(.backwards):before{opacity:1;transform:scale(1)}.reaction-block.is-chosen:not(.backwards) .stacked-avatars{--border-color:var(--chosen-background-color)}.reaction-block.is-chosen.animating:before{transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.reaction-block.is-chosen.animating .reaction-counter{transition:color var(--transition-standard-in)}.reaction-block.is-chosen.animating .stacked-avatars-avatar-container{transition:border-color var(--transition-standard-in)}.reaction-block .stacked-avatars{--border-color:transparent;--border-size:.125rem;--margin-right:-.875rem;margin-left:.1875rem}.reaction-block .reaction-counter{font-size:.9375rem!important;font-weight:var(--font-weight-bold);line-height:1.125rem;margin:0 .0625rem 0 .375rem;position:relative}.stacked-avatars{--border-color:var(--surface-color);--border-size:1px;--margin-right:-.3125rem;--avatar-size:1rem;--avatar-total-size:calc(var(--avatar-size) + var(--border-size)*2);display:flex;flex-direction:row-reverse}.stacked-avatars-avatar{height:var(--avatar-size);width:var(--avatar-size);z-index:0}.stacked-avatars-avatar-container{align-items:center;border:var(--border-size) solid var(--border-color);border-radius:50%;display:flex;height:var(--avatar-total-size);justify-content:center;position:relative;width:var(--avatar-total-size)}.stacked-avatars-avatar-container:not(:first-child){margin-right:var(--margin-right)}.sticker-viewer{align-items:center;bottom:0;display:flex;justify-content:center;left:0;pointer-events:none;position:fixed;right:0;top:0;z-index:4}.sticker-viewer:before{background-color:rgba(0,0,0,.6);bottom:0;content:\" \";left:0;opacity:0;position:absolute;right:0;top:0}body.animation-level-2 .sticker-viewer:before{transition:opacity var(--sticker-viewer-open-transition-out)}.sticker-viewer.is-visible:not(.backwards):before{opacity:1}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards):before{transition:opacity var(--sticker-viewer-open-transition-in)}.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-transformer:not(.is-switching){transform:translateX(var(--translateX)) scale(1)!important}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-transformer:not(.is-switching){transition:transform var(--sticker-viewer-open-transition-in)}.sticker-viewer.is-visible:not(.backwards) .emoji-animation,.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-emoji,.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker{opacity:1}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .emoji-animation,body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-emoji,body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker{transition:opacity var(--sticker-viewer-open-transition-in)}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker:not(.is-overflow){transition:opacity 0s}.sticker-viewer-transformer{--translateX:0;align-items:center;display:flex;height:360px;justify-content:center;position:absolute;width:360px}.sticker-viewer-transformer.has-effect{height:280px;width:280px}.sticker-viewer-transformer.has-effect .sticker-viewer-emoji{top:-5.5rem}body.animation-level-2 .sticker-viewer-transformer{transition:transform var(--sticker-viewer-open-transition-out)}.sticker-viewer-transformer.is-switching{opacity:1!important;transform:translateX(var(--translateX)) scale(1)!important}body.animation-level-2 .sticker-viewer-transformer.is-switching{transition:transform var(--sticker-viewer-switch-transition),opacity var(--sticker-viewer-switch-transition)!important}.sticker-viewer-transformer.is-switching:not(.backwards){opacity:0!important;transform:scale(.4) translateX(var(--translateX))!important}.sticker-viewer-emoji{position:absolute;top:-3rem;transform:translateX(var(--translateX)) scale(2)}.sticker-viewer-sticker{position:absolute}.sticker-viewer .emoji-animation,.sticker-viewer-emoji,.sticker-viewer-sticker{opacity:0}body.animation-level-2 .sticker-viewer .emoji-animation,body.animation-level-2 .sticker-viewer-emoji,body.animation-level-2 .sticker-viewer-sticker{transition:opacity var(--sticker-viewer-open-transition-out)}.custom-emoji{display:inline;height:var(--custom-emoji-size)!important;min-height:var(--custom-emoji-size)!important;min-width:var(--custom-emoji-size)!important;position:relative;width:var(--custom-emoji-size)!important}.custom-emoji:before{content:\"ย \";display:inline-block;height:inherit;min-height:inherit;min-width:inherit;width:inherit}.custom-emoji .media-sticker,.custom-emoji .rlottie{height:inherit!important;margin:0;max-height:inherit!important;max-width:inherit!important;pointer-events:none;text-indent:-9999px;width:inherit!important}.custom-emoji-canvas{height:100%;width:100%}.custom-emoji-canvas,.custom-emoji-renderer{bottom:0;left:0;position:absolute;right:0;top:0}.custom-emoji-renderer{pointer-events:none}.custom-emoji-placeholder{display:inline;height:var(--messages-custom-emoji-size);margin-top:-.125rem;vertical-align:middle;width:var(--messages-custom-emoji-size)}.usernames-username-icon{background-color:var(--secondary-color);border-radius:50%;color:#fff;font-size:1.25rem}.usernames-username-icon:before{content:\"๎ฅฅ\"}.usernames-username.active .usernames-username-status{color:var(--primary-color)!important}.usernames-username.active .usernames-username-icon{background-color:var(--primary-color)}.topics-slider{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0}.topics-container{--offset:0;--width:100%;background-color:var(--surface-color)!important;width:var(--width)!important}.topics-container.is-floating{--offset:5.0625rem;--width:calc(var(--left-column-width) - var(--offset));border-left:1px solid var(--border-color);bottom:0;overflow:visible!important;overflow:initial!important;pointer-events:all;position:absolute;right:0;top:0;transform:translateX(var(--width));z-index:3}.topics-container.is-visible:not(.backwards){transform:translateX(0)}.topics-container.is-visible.animating{transition:transform var(--transition-standard-in)}.topics-container.is-visible.animating.backwards{transition:transform var(--transition-standard-out)}.topics-container .sidebar-header{padding:0 .75rem}.topics-container .sidebar-header__rows{flex:1 1 auto;overflow:hidden;padding-left:.5rem}.topics-container .sidebar-header__rows .sidebar-header__title{font-size:var(--font-size-16);line-height:var(--line-height-16);margin-bottom:.125rem;padding-left:0!important}.topics-container .sidebar-header__subtitle,.topics-container .sidebar-header__title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.topics-container .sidebar-header__subtitle{color:var(--secondary-text-color);font-size:var(--font-size-14);line-height:var(--line-height-14)}.topics-container .chatlist-chat{min-height:4rem;padding-left:.75rem}.topic-name .topic-icon{margin-right:.25rem}.topic-name-button{--color:var(--primary-color);align-items:center;color:var(--color);cursor:pointer;display:flex;font-weight:var(--font-weight-bold);height:1.5rem;justify-content:center;max-width:100%;padding:0 .5rem;position:relative;text-decoration:none!important}.topic-name-button-container{align-items:flex-start;display:flex!important;justify-content:flex-start}.topic-name-button .peer-title,.topic-name-button .topic-name{position:relative}.topic-name-button:before{background-color:var(--color);border-radius:1.5rem;bottom:0;content:\" \";left:0;opacity:.08;position:absolute;right:0;top:0}html.no-touch .topic-name-button:active:before,html.no-touch .topic-name-button:hover:before{opacity:.16}.topic-icon{--size:1.25rem;--custom-emoji-size:var(--size);display:inline-flex;font-size:calc(var(--size)/2);justify-content:center;line-height:1.875!important;position:relative;vertical-align:middle}.topic-icon-general{fill:var(--secondary-color);height:var(--size);width:var(--size)}.topic-icon-svg{height:inherit;position:absolute;width:inherit}.topic-icon-content{position:relative}.edit-topic-container .scrollable-y{display:flex;flex-direction:column}.edit-topic-icon{position:absolute}.edit-topic-icon .topic-icon{--size:4rem}.edit-topic-icon-container{align-items:center;cursor:pointer;display:flex;height:100px;justify-content:center;margin:0 auto;position:relative;width:100px}.edit-topic-emoticons-container{flex:1 1 auto}.edit-topic-emoticons-container .sidebar-left-section{height:100%;padding:0!important}.edit-topic-emoticons-container .emoji-padding{display:flex;flex-direction:column}.edit-topic-emoticons-container .super-emoji-topic-icon .topic-icon{--size:var(--esg-emoji-size);--custom-emoji-size:inherit;margin-left:calc((var(--custom-emoji-size) - var(--esg-emoji-size))/2)}.themes-container{align-items:center;display:flex;height:6.5rem;position:relative}@media only screen and (min-width:601px){.themes-container{margin:0 -.5rem;padding:0;width:calc(100% + 1rem)}}.themes-container:after,.themes-container:before{content:\" \";display:block;flex:0 0 auto;height:.5rem;width:.5rem}.theme-container{border-radius:10px;cursor:pointer;display:flex;flex:0 0 auto;height:calc(100% - .5rem);justify-content:center;margin:0 .25rem;position:relative;width:4.5rem}.theme-container:before{border:2px solid var(--primary-color);border-radius:14px;bottom:-4px;content:\" \";left:-4px;opacity:0;position:absolute;right:-4px;top:-4px;transform:scale(.86)}html.is-safari .theme-container:before{transform:none!important}body.animation-level-2 .theme-container:before{transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.theme-container.active{pointer-events:none}.theme-container.active:before{opacity:1;transform:scale(1)}.theme-container .background-item{border-radius:inherit;height:100%;left:0;pointer-events:none;position:absolute;top:0;width:100%}.theme-emoticon{bottom:.5rem;height:1.75rem;pointer-events:none;position:absolute;width:1.75rem;z-index:1}html:not(.is-safari) .theme-emoticon{transform:scale(1);transform-origin:center bottom}body.animation-level-2 .theme-emoticon{transition:transform var(--transition-standard-in)}.theme-bubble{background-color:#fff;border-radius:1.75rem;height:1.25rem;pointer-events:none;position:absolute;width:2.5rem}.theme-bubble.is-out{background-color:var(--light-filled-message-out-primary-color);right:.375rem;top:.5rem}.theme-bubble.is-in{background-color:var(--message-background-color);left:.375rem;top:2rem}.popup{background-color:rgba(0,0,0,.3);bottom:0;box-shadow:none;display:flex;left:0;margin:0;max-width:none;opacity:0;overflow:auto;padding:1.875rem;position:fixed!important;right:0;top:0;transition-delay:0s,var(--popup-transition-time);transition-duration:var(--popup-transition-time),0s;transition-property:opacity,visibility;transition-timing-function:var(--popup-transition-function);-webkit-user-select:none;-moz-user-select:none;user-select:none;visibility:hidden;z-index:3}.popup.no-overlay{background-color:transparent;overflow:visible;padding:0}body.animation-level-0 .popup{transition:none}.popup.active{opacity:1;transition-delay:0s,0s;visibility:visible;z-index:4}.popup.active .popup-container,.popup.hiding .popup-container{transform:translate3d(var(--translateX),0,0)}[dir=ltr] .popup-title{padding-left:1.5rem;padding-right:1rem}[dir=rtl] .popup-title{padding-left:1rem;padding-right:1.5rem}.popup-title{flex:1;font-size:1.25rem;font-weight:var(--font-weight-bold);line-height:1;margin:0}.popup-title:first-child{padding-left:0}.popup-container{--translateX:0;-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:var(--surface-color);border-radius:10px;display:flex;flex-direction:column;margin:auto;overflow:hidden;padding:1rem;position:relative;transform:translate3d(var(--translateX),3rem,0);transition:transform var(--popup-transition-time) var(--popup-transition-function)}body.animation-level-0 .popup-container{transition:none}.popup-description .peer-title{font-weight:var(--font-weight-bold)}.popup-centerer{margin:auto}.popup-close{flex:0 0 auto;justify-self:center;z-index:3}.popup-header{align-items:center;display:flex;flex:0 0 auto;margin-bottom:2rem;position:relative}.popup-body{display:flex;flex:1 1 auto;flex-direction:column;overflow:hidden}.popup-body .scrollable{position:relative}.popup-buttons{align-items:center;display:flex;flex-direction:row-reverse;height:3rem;justify-content:flex-start;padding:0 .5rem}.popup-buttons .btn{border-radius:10px;font-weight:var(--font-weight-bold);height:2.5rem;max-width:100%;overflow:hidden;padding:0 1rem;position:relative;text-overflow:ellipsis;text-transform:uppercase;white-space:nowrap}[dir=ltr] .popup-buttons .btn+.btn{margin-right:.625rem}[dir=rtl] .popup-buttons .btn+.btn{margin-left:.625rem}.popup-avatar .popup-container{max-width:600px;padding:15px 16px 16px 24px}.popup-avatar .popup-container>button{bottom:20px;position:absolute;right:20px}.popup-avatar .popup-close{font-size:1.5rem;margin-top:4px}.popup-avatar .popup-header{margin-bottom:1px}[dir=ltr] .popup-avatar h6{text-align:left}[dir=rtl] .popup-avatar h6{text-align:right}.popup-avatar h6{font-size:1.25rem;margin:0 0 0 2rem}.popup-avatar .crop{border-radius:8px;max-height:100%;max-width:100%;padding:24px 54px 46px 46px}.popup-avatar .crop>img{display:none}.popup-avatar .crop img{border-radius:8px}.popup-new-media .popup-container{max-height:100%;max-width:420px;padding:12px 20px 32.5px;width:420px}.popup-new-media .popup-container img,.popup-new-media .popup-container video{border-radius:inherit}.popup-new-media .popup-header{align-items:center;flex:0 0 auto;flex-wrap:wrap;justify-content:space-between;margin-bottom:9px;padding:12px 20px 15px;position:relative}.popup-new-media .popup-header .btn-primary{border-radius:10px;font-size:var(--font-size-14);height:2.25rem;line-height:2.25rem;padding:0 1.375rem;text-transform:uppercase;width:auto}.popup-new-media .popup-close{margin:-1px 0 0 -4px}.popup-new-media .popup-photo{border-radius:10px;max-width:100%;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.popup-new-media .scrollable{position:relative}.popup-new-media .input-field{flex:0 0 auto;margin-top:25px;width:100%}.popup-new-media .input-field-input{border-radius:10px;font-size:1rem}.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{top:calc(100% + .25rem);z-index:4}.popup-new-media.popup-send-photo .popup-container{max-width:25rem;padding:0;width:25rem}.popup-new-media.popup-send-photo .popup-container.border-top-offset .popup-input-container{overflow:visible;overflow:initial}.popup-new-media.popup-send-photo .popup-container.border-top-offset .popup-input-container:before{top:-8px}.popup-new-media.popup-send-photo .menu-send{bottom:3.5rem;right:.5rem;top:auto}.popup-new-media.popup-send-photo .popup-header{height:3.5rem;margin:0;padding:0 1rem}[dir=ltr] .popup-new-media.popup-send-photo .popup-title{padding-left:1.5rem}[dir=rtl] .popup-new-media.popup-send-photo .popup-title{padding-right:1.5rem}.popup-new-media.popup-send-photo .popup-close{margin:0}.popup-new-media.popup-send-photo .popup-body{position:relative}.popup-new-media.popup-send-photo .popup-body .scrollable{padding:0 .5rem}.popup-new-media.popup-send-photo .input-message-container{max-height:inherit;min-height:inherit}.popup-new-media.popup-send-photo .input-message-input{max-height:inherit!important}.popup-new-media.popup-send-photo .btn-primary{flex:0 0 auto;height:2.5rem;line-height:2.5rem;margin-bottom:.5rem;padding:0 1rem;text-transform:uppercase;width:auto}.popup-new-media.popup-send-photo .popup-input-container{--height:3.5rem;--max-height:8.375rem;align-items:flex-end;display:flex;flex:0 0 auto;justify-content:space-between;max-height:var(--max-height);min-height:var(--height);overflow:hidden;padding:0 .5rem;position:relative}.popup-new-media.popup-send-photo .popup-input-container:before{background-color:var(--border-color);content:\" \";height:1px;left:0;opacity:0;position:absolute;right:0;top:0}body.animation-level-2 .popup-new-media.popup-send-photo .popup-input-container:before{transition:opacity var(--transition-standard-in)}.popup-new-media.popup-send-photo .popup-input-container.has-border-top:before{opacity:1}.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{height:100%;-o-object-fit:cover;object-fit:cover;width: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{border-radius:inherit;overflow:hidden;position:relative}.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{--padding:.25rem;--icon-size:4.5rem;--icon-margin:.5rem;border-radius:10px;cursor:default;height:5rem;margin:0 .25rem;max-width:100%;overflow:hidden}.popup-new-media.popup-send-photo .document-name{line-height:1.5;margin-bottom:.125rem;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.popup-new-media.popup-send-photo .document-ico{border-radius:5px;font-size:16px;font-weight:400;letter-spacing:0;line-height:11px}html.no-touch .popup-new-media.popup-send-photo .document:active,html.no-touch .popup-new-media.popup-send-photo .document:hover{background-color:var(--light-secondary-text-color)}.popup-create-contact .name-fields{display:flex;flex-direction:column;margin-top:1rem;padding-left:116px;position:relative}.popup-create-contact .name-fields .input-field:first-child{margin-top:0}.popup-create-contact .avatar-placeholder{left:0;position:absolute;top:50%;transform:translateY(-50%)}.popup-peer .popup-header{align-items:center;display:flex;height:2.5rem;margin:0;padding:0 1rem;width:-moz-max-content;width:max-content}.popup-peer .popup-container{max-width:min(400px,100%);min-width:min(100%,17.5rem);padding:.75rem .5rem;width:-moz-min-content;width:min-content}.popup-peer .popup-title{font-size:1.25rem;font-weight:var(--font-weight-bold)}.popup-peer .popup-title:not(:first-child){padding-left:1rem}.popup-peer .popup-description{line-height:var(--line-height);margin-bottom:0;margin-top:0;max-width:-moz-fit-content;max-width:fit-content;min-width:min(100%,15rem);overflow:hidden;padding:.625rem 1rem .5rem;text-overflow:ellipsis;word-break:break-word}.popup-peer .checkbox-field{align-items:center;display:flex;height:3rem;margin:0;padding:0 1.125rem}.popup-peer .checkbox-field .checkbox-box{left:auto}.popup-stickers{-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-stickers .sticker-set-footer{color:var(--primary-color);text-align:center}.popup-stickers .sticker-set-footer .btn-primary{height:44px;line-height:44px;padding:0 1.0625rem;text-transform:uppercase;width:auto}.popup-stickers .scrollable.is-loading{min-height:9rem;position:relative}.popup-stickers .sticker-set-footer{padding:8px 0}.popup-stickers .super-emojis{padding:0 .5rem}.popup-stickers .popup-container{max-height:420px;max-width:420px;padding:0;width:420px}[dir=ltr] .popup-stickers .popup-close{margin-left:1rem}[dir=rtl] .popup-stickers .popup-close{margin-right:1rem}.popup-stickers .popup-close{font-size:1.5rem}.popup-stickers .popup-header{flex:0 0 auto;margin:.625rem 0}.popup-stickers .sticker-set{margin:.0625rem 0}.popup-stickers .sticker-set .row-title{font-weight:var(--font-weight-bold)}.popup-stickers .sticker-set-stickers{--per-row:5;--item-size:var(--popup-sticker-size);display:grid;grid-template-columns:repeat(var(--per-row),1fr);padding:0 5px;position:relative}@media only screen and (max-width:600px){.popup-stickers .sticker-set-stickers{--per-row:4}}.popup-stickers .sticker-set-stickers .media-sticker-wrapper{cursor:pointer;height:var(--item-size);justify-self:center;margin-bottom:2px;position:relative;width:var(--item-size)}@media only screen and (max-width:600px){.popup-stickers .sticker-set-stickers .media-sticker-wrapper{margin-bottom:8px}}.popup-stickers .sticker-set-stickers .media-sticker-wrapper:hover{background-color:var(--light-secondary-text-color);border-radius:12px}.popup-date-picker{-webkit-user-select:none;-moz-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-bottom:1.375rem;margin-left:6px;margin-top:4px}.popup-date-picker .popup-title{font-size:20px;font-weight:var(--font-weight-bold)}.popup-date-picker .popup-buttons{margin-right:-2px;order:2}.popup-date-picker .popup-buttons button+button{margin-left:9px;margin-top:0}.popup-date-picker .date-picker-controls{align-items:center;display:flex;justify-content:space-between}.popup-date-picker .date-picker-controls .date-picker-month-title{font-size:14px;font-weight:var(--font-weight-bold)}.popup-date-picker .date-picker-prev{transform:rotate(90deg)}.popup-date-picker .date-picker-next{transform:rotate(-90deg)}.popup-date-picker .date-picker-next:disabled,.popup-date-picker .date-picker-prev:disabled{visibility:hidden}.popup-date-picker .date-picker-months{margin-bottom:1.5rem;margin-top:7px;-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-date-picker .date-picker-month{display:grid;grid-template-columns:repeat(7,1fr);justify-content:center;width:100%}.popup-date-picker .date-picker-month .btn-icon{align-items:center;color:var(--secondary-text-color);display:flex;font-size:12px;height:38px;justify-content:center;justify-self:center;width:38px}.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:var(--primary-text-color)}.popup-date-picker .date-picker-month .btn-icon.active{background-color:var(--primary-color)!important;border-radius:50%;color:var(--badge-text-color)}.popup-schedule .popup-header{justify-content:space-between;margin-bottom:17px;margin-left:0;margin-top:5px}@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;padding:4px 16px 16px;width:420px}@media only screen and (max-width:600px){.popup-schedule .popup-container{min-width:312px;padding:4px 14px 14px;width:312px}}.popup-schedule .popup-container[data-lines=\"5\"]{top:-16px}.popup-schedule .popup-container[data-lines=\"7\"]{top:16px}.popup-schedule .date-picker-month{margin-left:2px;margin-right:-20px;width:auto}@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-size:20px;font-weight:var(--font-weight-bold);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{font-size:14px;font-weight:var(--font-weight-bold);height:36px;justify-self:auto;margin-top:-4px;width:36px}.popup-schedule .date-picker-month-date:disabled{color:#9ba3a8!important}.popup-schedule .date-picker-month-day{color:var(--primary-text-color)!important;font-size:14px!important;font-weight:var(--font-weight-bold)}.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:400}@media only screen and (max-width:600px){.popup-schedule .btn-primary{widtH:280px;height:50px;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{opacity:0!important;pointer-events:none}.popup-create-poll .input-field .btn-icon{opacity:1;position:absolute;right:.4375rem;top:.4375rem;transition:opacity .2s ease;z-index:1}@media only screen and (max-width:600px){.popup-create-poll .input-field .btn-icon{right:.3125rem;top:.3125rem}}.popup-create-poll .caption{color:var(--secondary-text-color);font-weight:var(--font-weight-bold);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{font-size:.875rem;line-height:1.2;margin-top:.875rem}.popup-create-poll .btn-primary{width:94px}.popup-create-poll .menu-send{right:20px;top:54px}.popup-create-poll hr:not(.hide){display:block!important}.popup-forward .popup-container{height:40.625rem;max-height:min(40.625rem,100%);max-width:420px;padding:7px 0 0;width:420px}.popup-forward .popup-header{flex:0 0 auto;margin-bottom:7px;padding:0 1rem}@media only screen and (max-width:600px){.popup-forward .popup-header{padding-left:.8125rem}}.popup-forward .popup-title{flex-grow:1;height:100%;padding:0}.popup-forward .chatlist-container,.popup-forward .selector{display:flex;flex:1 1 auto;flex-direction:row;height:auto;overflow:hidden;width:100%}.popup-forward .selector-search-input{font-size:var(--font-size-20);height:100%;line-height:1;padding:.5rem 1.5rem;width:100%}@media only screen and (max-width:600px){.popup-forward .selector-search-input{padding-left:1.1875rem}}.popup-forward .selector .chatlist{margin-top:0!important}.popup-forward .gradient-delimiter{display:none}.popup-forward .sidebar-left-section{margin-bottom:0!important;padding-top:0!important}.popup-instance-deactivated{background-color:rgba(0,0,0,.6)}.popup-instance-deactivated .instance-deactivated-container{margin:auto;pointer-events:none;text-align:center}.popup-instance-deactivated .header{color:#fff;font-size:2rem}.popup-instance-deactivated .subtitle{color:#fff;font-size:1.5rem;line-height:var(--line-height);opacity:.6}.popup-join-chat-invite{-webkit-user-select:none;-moz-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:var(--font-weight-bold);line-height:var(--line-height);margin:.75rem 0 .25rem}.popup-join-chat-invite .chat-participants-count{color:var(--secondary-text-color);font-size:.875rem;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;user-select:none}.popup-report-messages-confirm .media-sticker-wrapper{height:100px;margin:0 auto;position:relative;width:100px}.popup-report-messages-confirm .popup-body{margin:1rem 0 .375rem;overflow:visible;overflow:initial}.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-call .popup-header{justify-content:space-between;width:100%}.popup-call .popup-title{flex:1 1 auto}.call{align-items:center;color:#fff;height:100%;width:100%}.call.is-full-screen,html.is-mobile .call{border-radius:0}.call.is-full-screen:not(.show-controls){cursor:none}.call.no-video .call-button,.call.no-video .call-button-text,.call.no-video .call-emojis,.call.no-video .call-party-state,.call.no-video .call-subtitle,.call.no-video .call-title,.call.no-video .popup-header,.call.show-controls .call-button,.call.show-controls .call-button-text,.call.show-controls .call-emojis,.call.show-controls .call-party-state,.call.show-controls .call-subtitle,.call.show-controls .call-title,.call.show-controls .popup-header{opacity:1}.call.show-controls .call-video{opacity:.8}.call.show-controls .call-video-blur{opacity:.56}.call .popup-header .btn-icon{color:#fff}.call .popup-header .call-emojis{margin-right:1rem;transform:scale(1.3125)}.call-avatar{border-radius:inherit;bottom:0;left:0;opacity:.7;position:absolute;right:0;top:0;z-index:-1}.call-avatar .avatar-full{font-size:6rem}.call-title{font-size:1.25rem;font-weight:var(--font-weight-bold)}.call-subtitle{font-size:1rem}.call .popup-header,.call-emojis,.call-subtitle,.call-title{opacity:0}body.animation-level-2 .call .popup-header,body.animation-level-2 .call-emojis,body.animation-level-2 .call-subtitle,body.animation-level-2 .call-title{transition:opacity var(--transition-standard-in)}.call-buttons{align-items:center;align-self:center;bottom:1.75rem;display:flex;pointer-events:none;position:absolute;z-index:1}.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 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 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(var(--call-button-size)*-.5 + var(--call-button-margin)*-.5))}.call-buttons.is-second{--margin-length:2}.call-buttons.is-second .call-button,.call-buttons.is-second .call-button-text{transform:translateX(calc(var(--call-button-size)*2 + var(--call-button-margin)*var(--margin-length)))}.call.no-screen .call-buttons.is-second{--margin-length:.656875}.call-button{background-color:hsla(0,0%,100%,.1)}.call-button-red{background-color:var(--danger-color)!important}.call-button-green{background-color:var(--gc-green-text-color)!important}.call-button.active{background-color:#fff!important}.call-button.active:before{color:#9e9e9e}.call-button,.call-button-text{opacity:0}.call-video{border-radius:inherit;height:100%;-o-object-fit:contain;object-fit:contain;opacity:1;position:absolute;width:100%}.call-video-container{align-items:center;background-color:#000;bottom:0;display:flex;left:0;position:absolute;right:0;top:0;z-index:-1}.call-video-container.small{border-radius:10px;bottom:8rem;cursor:pointer;left:auto;right:1rem;top:auto;z-index:1}.call-video-blur{border-radius:inherit;height:100%;opacity:.7;position:absolute;width:100%}body.animation-level-2 .call-video,body.animation-level-2 .call-video-blur{transition:opacity var(--transition-standard-in)}.call .call-emojis{transform:scale(1.125)}.call .call-emojis .emoji{margin:0 .125rem}.call-party-states{align-items:center;bottom:calc(4.25rem + var(--call-button-size));display:flex;flex-direction:column;padding:0 1rem;pointer-events:none;position:absolute;width:100%;z-index:2}.call-party-state{align-items:center;-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);background-color:hsla(0,0%,100%,.2);border-radius:1.625rem;color:#fff;display:flex;font-size:.875rem;font-weight:var(--font-weight-bold);height:1.625rem;line-height:1.625rem;margin-top:1rem;max-width:100%;opacity:0;padding:0 .625rem;transform:scale(0) translateY(0)}body.animation-level-2 .call-party-state{transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-party-state .rlottie-icon{flex:0 0 auto;height:1.875rem!important;margin-left:-.25rem;margin-right:.25rem;width:1.875rem!important}.call-party-state.is-visible:not(.backwards){transform:scale(1) translateY(0)}.call-party-state-text,.call-title{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.call.two-button-rows .call-buttons.is-first .call-button,.call.two-button-rows .call-buttons.is-first .call-button-text{transform:translateY(calc(var(--call-button-size)*-1 + var(--call-button-margin)*-1 + -1.125rem))}.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-group-call:not(.movable-element){top:7rem}.popup-group-call:not(.movable-element) .group-call{border-bottom-left-radius:0;border-bottom-right-radius:0}.popup-group-call .popup-body{justify-content:space-between}.popup-group-call .popup-container{background-color:var(--gc-background-color);color:var(--gc-primary-text-color)}.popup-group-call .popup{z-index:6}.group-call{--call-button-margin:1.25rem;height:100%;padding:0 .5rem;width:100%}.group-call:after{background:linear-gradient(180deg,rgba(33,33,33,0) 0,rgba(33,33,33,.65) 48.54%,var(--gc-background-color) 100%);bottom:0;content:\" \";height:7.5rem;left:0;position:absolute;right:0}.group-call-header{height:3.5rem;margin-bottom:.125rem;padding:0 .5rem}.group-call-header .btn-icon{color:inherit;flex:0 0 auto}.group-call-header-info{flex:1 1 auto;margin-left:1.5rem;overflow:hidden}.group-call-header-title{font-weight:var(--font-weight-bold)}.group-call-header-subtitle,.group-call-header-title{font-size:var(--font-size-16);line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-header-subtitle{color:var(--gc-secondary-text-color);font-size:.875rem}.group-call-buttons{align-items:center;align-self:center;bottom:1.75rem;display:flex;justify-content:space-between;position:absolute;z-index:1}.group-call-button{background-color:var(--gc-button-unmuted-color);color:var(--gc-primary-text-color);opacity:1}.group-call[data-mic-state=muted] .group-call-button{background-color:var(--gc-button-muted-color)}.group-call[data-mic-state=hand] .group-call-button{background-color:var(--gc-button-hand-color)}.group-call:not(.is-big-layout)[data-mic-state=unmuted] .group-call-button{background-color:var(--gc-button-unmuted-fill-color)}.group-call-button-red{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{padding-right:.5rem}.group-call-participant-status-icon{display:inline-block;font-size:1.125rem;height:1.125rem;line-height:1;margin-right:6px;vertical-align:middle;width:1.125rem}.group-call-participant-status-container{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-participant .dialog-subtitle,.group-call-participant .dialog-title{padding-right:2.5rem}.group-call-participant-muted-icon-container{position:absolute!important;right:.5rem}.group-call-participant-video-container{align-items:center;background-color:#000;border-radius:10px;cursor:pointer;display:flex;flex:1 1 auto;height:15rem;margin:.25rem;overflow:hidden;position:relative;width:100%;width:33%}.group-call-participant-video-container:after{background:linear-gradient(180deg,transparent 55.62%,rgba(0,0,0,.5) 86.46%);bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.group-call-participant-video-container .group-call-participant-status-icon{font-size:1.25rem;height:1.25rem;width:1.25rem}.group-call-participant-video-container:after,.group-call-participant-video-header,.group-call-participant-video-info{opacity:0}body.animation-level-2 .group-call-participant-video-container:after,body.animation-level-2 .group-call-participant-video-header,body.animation-level-2 .group-call-participant-video-info{transition:opacity var(--transition-standard-in)}.group-call-participant-video-header,.group-call-participant-video-info{align-items:center;bottom:.25rem;display:flex;justify-content:space-between;left:0;padding:0 .5rem 0 .75rem;position:absolute;right:0;z-index:1}.group-call-participant-video-header{bottom:auto;justify-content:flex-end;padding-right:.75rem;padding-top:.875rem;top:0}.group-call-participant-video-header .group-call-pin-icon{font-size:1.5rem;height:1.5rem;width:1.5rem}.group-call-participant-video-info .peer-title{font-weight:var(--font-weight-bold)}.group-call-participant-video-info .peer-title,.group-call-participant-video-info-left{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-participant-video-info .group-call-participant-status-container{margin-top:-1px;opacity:.6}.group-call-participant-video-info-left{flex:1 1 auto}.group-call-participant-video-info-right{flex:0 0 auto;height:2rem;margin-left:.75rem;width:2rem}.group-call-participant .is-speaking{color:var(--gc-green-text-color)}.group-call-participant .is-waiting{color:var(--gc-blue-text-color)}.group-call-participants{border-radius:10px;flex:1 1 auto;overflow:hidden}.group-call-participants-scrollable{border-radius:inherit;height:auto;padding-bottom:6rem;position:relative}.group-call-participants-video-container{display:flex;flex-wrap:wrap;margin:-.25rem -.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=\"3\"] .group-call-participant-video-container:nth-child(n+2),.group-call-participants-video-container[data-layout=\"4\"] .group-call-participant-video-container{flex:1 0 auto;height:auto}.group-call-participants-video-container[data-layout=\"3\"] .group-call-participant-video-container:nth-child(n+2):before,.group-call-participants-video-container[data-layout=\"4\"] .group-call-participant-video-container: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-header,.group-call-participants-video-container.show-controls .group-call-participant-video-info{opacity:1}.group-call-participants .chatlist{background:none;margin:0 auto;max-width:600px;padding:0}.group-call-participants .user-title{color:var(--gc-primary-text-color)}.group-call-participants .user-last-message{color:var(--gc-secondary-text-color)}.group-call-big-video-container{position:relative}.group-call-big-video-container .group-call-participants-video-container{margin-bottom:.25rem;min-height:100%}.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,.group-call:not(.is-big-layout) .group-call-big-video-container,.group-call:not(.is-big-layout) .popup-body .group-call-header,.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:active,html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:hover{background-color:hsla(207,4%,46%,.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% - var(--gc-right-column-width))}.group-call.is-big-layout.is-right-column-shown .group-call-buttons{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{background-color:var(--gc-background-color);bottom:0;padding:inherit;position:absolute;right:calc(var(--gc-right-column-width)*-1);top:0;width:var(--gc-right-column-width)}.group-call.is-big-layout .group-call-buttons{bottom:2.5rem;padding:.75rem}body.animation-level-2 .group-call.is-big-layout .group-call-buttons{transition:opacity var(--transition-standard-in)}.group-call.is-big-layout .group-call-buttons:before{-webkit-backdrop-filter:blur(100px);backdrop-filter:blur(100px);background:rgba(0,0,0,.5);border-radius:1.25rem;bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.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 var(--transition-standard-in)}body.animation-level-2 .group-call.is-big-layout .group-call-buttons .group-call-button{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-sponsored .scrollable-y{margin:0 -1.5rem;max-height:25rem;padding:.5rem 1.5rem;position:relative;-webkit-user-select:text;-moz-user-select:text;user-select:text;width:calc(100% + 3rem)}.popup-mute .popup-container{min-width:16rem}.popup-reacted-list{--size:1.5rem;--custom-emoji-size:var(--size)}.popup-reacted-list .popup-container{height:600px;max-height:600px;padding:0;width:25rem}.popup-reacted-list .popup-header{border-bottom:1px solid var(--border-color);margin:0;min-height:3.5625rem;padding:.25rem .75rem .75rem}.popup-reacted-list .popup-close{height:40px;margin-right:.5rem;margin-top:.375rem;order:-1}.popup-reacted-list .reaction{--reaction-size:var(--size);--additional-height:.75rem;--margin:.5rem;--background-color:var(--light-filled-primary-color);--counter-color:var(--primary-color);flex:1 0 auto;justify-content:space-evenly}.popup-reacted-list .reaction.is-chosen:not(.backwards){--counter-color:#fff}.popup-reacted-list .reaction-sticker-icon{align-items:center;display:flex;font-size:1.25rem!important;margin:0}.popup-reacted-list .sidebar-left-section{margin-bottom:0!important}.popup-reacted-list .tabs-container{flex:1 1 auto;overflow:hidden}.popup-reacted-list .tabs-tab{background-color:var(--surface-color)}.popup-reacted-list .reacted-list-reaction-icon{display:flex;height:var(--size);position:absolute;right:1rem;top:50%;transform:translateY(-50%);width:var(--size)}.popup-reacted-list .chatlist-chat{padding-right:3.25rem!important}.popup-payment .popup-container{border-radius:16px;max-height:min(100%,43.5rem);max-width:26.25rem;padding:0;width:26.25rem}.popup-payment .popup-header{height:3.5rem;margin:0;padding:0 1rem}.popup-payment.is-loading .popup-container{min-height:26.25rem}.popup-payment .scrollable{display:flex;flex:1 1 auto;flex-direction:column}.popup-payment hr{display:block!important;margin:.5rem 0!important;padding:0!important}.popup-payment .input-field{--height:3rem;margin:.75rem .5rem 0}.popup-payment .input-field-input{--padding:.75rem}.popup-payment .input-fields-row .input-field{margin-top:1.25rem}.popup-payment .sidebar-left-section{padding:0!important}.popup-payment .sidebar-left-section-name+.input-field,.popup-payment .sidebar-left-section-name+.input-fields-row .input-field{margin-top:.75rem}.popup-payment .sidebar-left-section .row{margin-top:.5rem}.popup-payment .sidebar-left-section-content{margin:0 .5rem!important}.popup-payment .select-wrapper{box-shadow:var(--menu-box-shadow);max-height:10rem}.popup-payment .select-wrapper li{grid-template-columns:calc(26px + 2rem) 1fr;height:3rem}.popup-payment .payment-verification{border:none;flex:1 1 auto;height:40rem;max-height:100%;width:100%}.popup-payment .row{border-radius:10px}.payment-item{padding:0 1.25rem;width:100%}.payment-item-details{display:flex;flex:0 0 auto;justify-content:space-between;margin-bottom:1rem;overflow:hidden}.payment-item-details:last-child{margin-bottom:0}.payment-item-details-photo{border-radius:10px;flex:0 0 auto;height:6.25rem;margin-right:1rem;width:6.25rem}.payment-item-details-photo .media-photo{border-radius:inherit}.payment-item-details-lines{display:flex;flex:1 1 auto;flex-direction:column}.payment-item-details-lines-title{font-size:var(--font-size-16);font-weight:var(--font-weight-bold);line-height:var(--line-height-16)}.payment-item-details-lines-bot-name,.payment-item-details-lines-description{font-size:var(--font-size-14);line-height:1.25rem}.payment-item-details-lines-bot-name{color:var(--secondary-text-color)}.payment-item-prices{display:flex;flex-direction:column;margin:1rem .25rem .5rem}.payment-item-prices-price{color:var(--secondary-text-color);display:flex;font-weight:500;justify-content:space-between;line-height:1.1875rem}.payment-item-prices-price+.payment-item-prices-price{margin-top:1.5rem}.payment-item-prices-price.is-total{color:var(--primary-text-color)}.payment-item-tips{display:flex;justify-content:space-between;margin:.75rem -.5rem 1.5rem}.payment-item-tips-tip{--background-intensity:.1;background-color:rgba(84,190,97,var(--background-intensity));border-radius:1.25rem;color:#3ba748;flex:1 1 auto;font-size:var(--font-size-16);font-weight:var(--font-weight-bold);height:2.5rem;line-height:2.5rem;text-align:center}body.animation-level-2 .payment-item-tips-tip{transition:color .1s ease-in-out,background-color .1s ease-in-out}.payment-item-tips-tip+.payment-item-tips-tip{margin-left:.5rem}html.no-touch .payment-item-tips-tip:not(.active):active,html.no-touch .payment-item-tips-tip:not(.active):hover{--background-intensity:.3}.payment-item-tips-tip.active{--background-intensity:1;color:#fff}.payment-item-tips-input{color:inherit!important;display:inline;font-weight:inherit!important}.payment-item-row{margin:0 .5rem;padding-bottom:0;padding-top:0}.payment-item-method-row .media-photo{border-radius:10px}.payment-item-pay{flex:0 0 auto;height:3rem;margin:1rem;text-transform:uppercase;width:auto}.payment-item-preloader-container{flex:1 1 auto;position:relative}.popup-payment-shipping-methods .popup-container{min-height:auto}.popup-payment-shipping-methods .row{margin-top:0!important}.popup-payment-verification .popup-header:after{background-color:var(--border-color);bottom:-1px;content:\" \";height:1px;left:0;position:absolute;right:0}.popup-payment-card-confirmation .popup-container{min-height:auto}.popup-payment-card-confirmation .input-field-password{margin-top:.5rem!important}.popup-limit .popup-container{min-width:min(100%,22.5rem)}.popup-limit-line{align-items:center;display:flex;flex-direction:column;margin:.75rem 0}.popup-limit-hint{align-items:center;color:#fff;display:flex;font-weight:var(--font-weight-bold);justify-content:center;transform:scale(.6) translate(-280px,16px) rotate(-30deg)}body.animation-level-2 .popup-limit-hint{transition:transform .3s cubic-bezier(.12,1.1,.56,1.2)}.popup-limit-hint.active{transform:scale(1) translate(0) rotate(0)}.popup-limit-hint-icon{display:flex;font-size:1.25rem;margin-right:.25rem}.popup-limit-button.primary{align-items:center;background:linear-gradient(88.39deg,#6c93ff -2.56%,#976fff 51.27%,#df69d1 107.39%);color:#fff!important;display:flex}.popup-limit-button-icon{display:flex;font-size:1.5rem;margin-left:.625rem}.popup-limit .limit-line{align-self:stretch;margin:1rem .5rem 0}.popup-limit:not(.is-locked) .popup-limit-hint{background:linear-gradient(73.4deg,#6c93ff -7.21%,#976fff 114.57%,#df69d1 241.52%);background-size:200px 2rem;border-radius:1rem;height:2rem;padding:0 .75rem;position:relative}.popup-limit:not(.is-locked) .popup-limit-hint:after{background:inherit;background-position-x:calc(-50% - 86px);background-repeat:no-repeat;background-size:inherit;bottom:-9px;-webkit-clip-path:path(\"M0 0H26H24.4853C22.894 0 21.3679 0.632141 20.2426 1.75736L14.4142 7.58579C13.6332 8.36684 12.3668 8.36683 11.5858 7.58579L5.75736 1.75736C4.63214 0.632139 3.10602 0 1.51472 0H0Z\");clip-path:path(\"M0 0H26H24.4853C22.894 0 21.3679 0.632141 20.2426 1.75736L14.4142 7.58579C13.6332 8.36684 12.3668 8.36683 11.5858 7.58579L5.75736 1.75736C4.63214 0.632139 3.10602 0 1.51472 0H0Z\");content:\" \";display:block;height:9px;left:50%;margin-left:-13px;position:absolute;width:100%}.popup-limit.is-locked .popup-limit-hint{background-color:var(--primary-color);border-radius:1.375rem;height:2.75rem;margin-right:-.25rem;padding:0 1.25rem 0 1rem}.popup-limit.is-premium .popup-limit-hint{align-self:flex-end;background:linear-gradient(84.4deg,#6c93ff -4.85%,#976fff 51.72%,#df69d1 110.7%);background-position-x:100%;background-size:200px 2rem;border-bottom-right-radius:0;margin-right:.5rem}body.animation-level-2 .popup-limit.is-premium .popup-limit-hint{transition:transform .3s cubic-bezier(.12,1.1,.56,1.1)}.popup-limit.is-premium .popup-limit-hint:after{background-position-x:134%;bottom:-11.3px;-webkit-clip-path:path(\"M8.44528 0.5H20.5V10.1943C20.5 10.9154 19.9154 11.5 19.1943 11.5C18.8178 11.5 18.4597 11.3375 18.2117 11.0541L10.2274 1.92918C9.75146 1.38523 9.18812 0.924478 8.56057 0.565879L8.44528 0.5Z\");clip-path:path(\"M8.44528 0.5H20.5V10.1943C20.5 10.9154 19.9154 11.5 19.1943 11.5C18.8178 11.5 18.4597 11.3375 18.2117 11.0541L10.2274 1.92918C9.75146 1.38523 9.18812 0.924478 8.56057 0.565879L8.44528 0.5Z\");height:12px;left:100%;margin-left:-20.6px}#auth-pages{background:var(--surface-color);max-width:100%;overflow:hidden}#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;padding:0 16px;width:100%}}#auth-pages .auth-image,#auth-pages .input-wrapper,#auth-pages .subtitle{flex:0 0 auto}#auth-pages>.scrollable{display:flex;flex-direction:column;margin:0 auto;max-width:720px;position:relative}#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{margin:0 auto;max-width:720px;min-width:auto;position:relative}#auth-pages .tabs-container .tabs-tab{background-color:var(--surface-color)}#auth-pages .tabs-container .tabs-tab .container{display:flex;flex:1 1 auto;flex-direction:column;height:810px;padding:0;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-bottom:.5rem;margin-top:.5rem}.page-sign .auth-image,.page-signUp .auth-image{height:7.5rem;margin-bottom:1.5rem;width:7.5rem}@media only screen and (min-width:601px){.page-sign .auth-image,.page-signUp .auth-image{height:10rem;margin-bottom:1.5rem;width:10rem}}.page-authCode .phone-wrapper{flex:0 0 auto}.sign-logo{fill:var(--primary-color);max-height:100%;max-width:100%}.page-sign .btn-secondary,.page-signQR .btn-secondary{font-weight:400}.page-sign .qr,.page-signQR .qr{margin-top:1.5rem}.page-signQR{overflow:visible!important;overflow:initial!important}.page-signQR .auth-image{align-items:center;display:flex;height:240px!important;justify-content:center;width:240px!important}.page-signQR .auth-image .preloader{left:auto;top:auto;transform:none}.page-signQR .auth-image .qr-canvas{height:100%;width: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}[dir=ltr] .page-signQR .qr-description{text-align:left}[dir=rtl] .page-signQR .qr-description{text-align:right}.page-signQR .qr-description{line-height:var(--line-height);margin:1rem auto;max-width:480px}.page-signQR .qr-description li{margin-top:.5rem}.page-signUp .auth-image{margin-bottom:14px;margin-top:10px}@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 var(--transition-standard-in)}.page-authCode .auth-image{transform:translateY(12px)}.page-authCode .phone-wrapper{align-items:center;display:flex;justify-content:center;margin:1.375rem 0 .875rem}.page-authCode .phone-wrapper h4[contenteditable]{border:none;border-bottom:2px solid var(--primary-color);outline:none;padding:0 1rem}.page-authCode .phone-wrapper .phone.error{border-color:var(--danger-color)!important}.page-authCode .phone-wrapper .phone{margin:0}.page-authCode .subtitle{margin:0 auto!important;max-width:300px}.page-chats{display:flex;max-width:1682px!important}.page-chats .avatar-edit .tgico-cameraadd{top:52%}.page-chats #main-columns{height:100%;max-height:100%;min-height:100%;overflow:hidden;position:relative;width:100%}@media only screen and (max-width:600px){.page-chats .main-column{display:flex!important;width:100%;z-index:1}}@media only screen and (min-width:601px){.page-chats #column-center{background-color:#e6ebee;display:flex!important;width:100%}.page-chats #column-right{display:flex!important}.page-chats .main-column{height:100%;max-height:100%;min-height:100%;position:relative}.page-chats #main-columns{display:flex}}.page-chats #search-container,.page-chats .sidebar-search{flex-direction:column;height:100%;left:0;max-height:100%;overflow:hidden;position:absolute;top:0;width:100%;z-index:3}@media only screen and (min-width:1681px){.page-chats{border-color:var(--border-color);border-style:solid;border-width:0 1px}}.page-chats .avatar-edit{flex:0 0 auto;height:120px;margin:1rem auto 2rem;width:120px}body.animation-level-2 .page-chats .main-column{transition:transform var(--tabs-transition),filter var(--tabs-transition)}body,html{height:100%;margin:0;overflow:hidden;padding:0;width:100%}@media only screen and (max-width:600px){body,html{height:calc(var(--vh, 1vh)*100)}}html.is-ios{-webkit-touch-callout:none;position:fixed;-webkit-user-select:none}html.no-backdrop{--menu-background-color:var(--surface-color);--menu-backdrop-filter:none}@supports(padding:max(0px)){html{padding:0 min(16px,env(safe-area-inset-right)) 0 min(16px,env(safe-area-inset-left))}}html{-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);font-size:16px}body{background-color:var(--body-background-color);color:var(--primary-text-color)}body.deactivated{animation:grayscale-in var(--transition-standard-in) forwards}body.deactivated-backwards{animation:grayscale-out var(--transition-standard-out) forwards}@keyframes grayscale-in{0%{filter:grayscale(0)}to{filter:grayscale(1)}}@keyframes grayscale-out{0%{filter:grayscale(1)}to{filter:grayscale(0)}}a{color:var(--link-color)}button,html,input,optgroup,select,textarea{font-family:Roboto,-apple-system,apple color emoji,BlinkMacSystemFont,Segoe UI,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif}a,button,div,input,select,textarea{-webkit-tap-highlight-color:rgba(0,0,0,0)}code,kbd,pre,samp{font-family:var(--font-monospace)}.whole{height:100%;margin:0 auto;max-width:1680px;min-height:100%;width: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:var(--font-weight-bold)}h4{font-size:2rem;line-height:110%;margin:22px 0 14px}@media only screen and (max-width:600px){h4{font-size:20px;margin:2px 0 8px}}[contenteditable=true],input{background-color:transparent;caret-color:var(--primary-color);color:var(--primary-text-color)}input,textarea{-webkit-appearance:none}input::-webkit-contacts-auto-fill-button,input::-webkit-credentials-auto-fill-button{position:absolute;right:0;visibility:hidden}input:-webkit-autofill:first-line{font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,Helvetica Neue,Arial;font-size:16px}.subtitle{color:var(--secondary-text-color);line-height:1.35}.danger{color:var(--danger-color)!important}.danger .c-ripple__circle{background-color:var(--light-danger-color)}.blue,.primary{color:var(--primary-color)!important}.blue .c-ripple__circle,.primary .c-ripple__circle{background-color:var(--light-primary-color)}.primary-text{color:var(--primary-text-color)!important}.color-premium{-webkit-text-fill-color:transparent;background:var(--premium-gradient);-webkit-background-clip:text}.blue:before,.danger:before,.primary:before{color:inherit!important}.bg-warning{background:#fed85a!important}.contextmenu{bottom:auto!important;position:fixed!important;right:auto!important;width:auto!important;z-index:4!important}.preloader{height:50px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:50px}.preloader .preloader-path{stroke:var(--primary-color)}@keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-in-backwards-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-out-backwards-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}.toast{-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);background-color:rgba(0,0,0,.66);border-radius:10px;color:#fff;font-size:1rem;left:50%;max-width:min(30rem,calc(100vw - 2rem));opacity:0;padding:.5rem 1rem;position:fixed;top:50%;transform:translate(-50%,-50%);z-index:5}.toast.is-visible{opacity:1}body.animation-level-2 .toast{transition:opacity var(--transition-standard-in)}.toast b{color:inherit}.toast a{color:#60a5e9!important;cursor:pointer}hr{border:none;border-top:1px solid var(--border-color);margin:0;padding-bottom:.5rem;width:100%}b{font-weight:var(--font-weight-bold)}.avatar-edit{border-radius:50%;cursor:pointer;overflow:hidden;position:relative}.avatar-edit.is-forum{border-radius:var(--avatar-border-radius-forum)}.avatar-edit-canvas{background:linear-gradient(var(--avatar-color-top),var(--avatar-color-bottom));height:100%;max-height:100%;max-width:100%;width:100%}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{color:#fff;font-size:3rem;height:3rem;left:50%;line-height:1;position:absolute;top:50%;transform:translateY(-50%) translateX(-50%);width:3rem;z-index:2}.avatar-edit .avatar-placeholder{filter:brightness(.7);height:100%;left:0;position:absolute;top:0;width:100%}.missing-icon{height:1.5rem;width:1.5rem}.missing-icon-path{fill:currentColor}.select-wrapper{background-color:var(--surface-color);border-radius:10px;display:flex;flex-direction:column;flex-wrap:wrap;left:0;max-height:23.5rem;opacity:0;overflow:hidden;position:absolute;top:calc(100% + .5rem);transform:scale(.95);transform-origin:top center;transition:opacity .2s ease-out,transform .2s ease-out;width:100%;z-index:3}.select-wrapper.active{opacity:1;transform:scale(1)}.select-wrapper ul{margin:.5rem 0}[dir=ltr] .select-wrapper li{text-align:left}[dir=rtl] .select-wrapper li{text-align:right}.select-wrapper li{align-items:center;cursor:pointer;display:grid;grid-template-columns:calc(26px + 2rem) 1fr 80px;height:3.5rem;justify-content:space-between;padding:0 1rem}html.no-touch .select-wrapper li:active,html.no-touch .select-wrapper li:hover{background-color:var(--light-secondary-text-color)}.select-wrapper .emoji{font-size:26px;height:26px;line-height:1;width:26px}.select-wrapper .scrollable{position:relative}[dir=ltr] .phone-code{text-align:right}[dir=rtl] .phone-code{text-align:left}.phone-code{color:#9e9e9e}.auth-image{height:166px;margin:0 auto 18px;position:relative;width:166px}@media only screen and (max-width:600px){.auth-image{height:120px;width:120px}}[dir=ltr] .phone-edit{margin-left:.4rem}[dir=rtl] .phone-edit{margin-right:.4rem}.phone-edit{cursor:pointer;font-size:1.5rem;height:1.5rem;line-height:1;opacity:.5;transition:opacity .2s;width:1.5rem}html.no-touch .phone-edit:active,html.no-touch .phone-edit:hover{opacity:1}span.emoji{display:inline!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;vertical-align:baseline!important;vertical-align:initial!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[dir=ltr]:not(.is-safari) span.emoji{margin-right:5px!important}html[dir=rtl]:not(.is-safari) span.emoji{margin-left:5px!important}html[dir=ltr]:not(.is-safari) avatar-element span.emoji{margin-right:0!important}html[dir=rtl]:not(.is-safari) avatar-element span.emoji{margin-left:0!important}}img.emoji{display:inline-block;height:18px;max-height:100%;max-width:100%;vertical-align:middle;width:18px}[contenteditable=true]{cursor:text;outline:none;-webkit-user-select:text;-moz-user-select:text;user-select:text;white-space:pre-wrap}[contenteditable=true] .custom-emoji{display:inline-block;margin-bottom:-2px}[contenteditable=true] .custom-emoji:before{content:none}[contenteditable=true] [style*=markup]{font-family:inherit!important}[contenteditable=true] [style*=bold]{font-weight:700}[contenteditable=true] [style*=italic]{font-style:italic}[contenteditable=true] [style*=underline]{text-decoration-line:underline}[contenteditable=true] [style*=strikethrough]{text-decoration-line:line-through}[contenteditable=true] [style*=underline][style*=strikethrough]{text-decoration-line:underline line-through}[contenteditable=true] [style*=monospace]{font-family:var(--font-monospace)!important}[contenteditable=true] [style*=spoiler]{background-color:var(--spoiler-draft-background-color)}[contenteditable][data-placeholder]:before{color:#a2acb4;content:attr(data-placeholder);display:block;opacity:0;pointer-events:none;position:absolute}body.animation-level-2 [contenteditable][data-placeholder]:before{transform:translateX(1.75rem);transition:opacity var(--input-transition) .01s,transform var(--input-transition) .01s}[contenteditable][data-placeholder]:empty:before{opacity:1}body.animation-level-2 [contenteditable][data-placeholder]:empty:before{transform:translateX(0)}.sticky_sentinel{left:0;pointer-events:none;position:absolute;right:0;visibility:hidden}.super-stickers{display:grid;grid-template-columns:repeat(auto-fill,var(--esg-sticker-size));justify-content:space-between;width:100%}html.no-touch .super-sticker:active,html.no-touch .super-sticker:hover{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{cursor:pointer;padding-bottom:13px;padding-top:13px;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (min-width:601px){[dir=ltr] .show-more{padding-left:8px}[dir=rtl] .show-more{padding-right:8px}}[dir=ltr] .show-more .tgico-down{padding-left:1rem;padding-right:2rem}[dir=rtl] .show-more .tgico-down{padding-left:2rem;padding-right:1rem}.show-more .tgico-down{float:left;font-size:24px}.content-empty,.show-more .tgico-down{color:var(--secondary-text-color)}::-moz-selection{background:var(--selection-background-color)}.selection:after,::selection{background:var(--selection-background-color)}.selection:after{bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.input-something{display:inline-block}.input-selectable{position:relative}@keyframes grow-icon{0%{opacity:.8;transform:scale(.5)}50%{opacity:1;transform:scale(1.1)}to{transform:scale(1)}}@keyframes hide-icon{0%{opacity:.4;transform:scale(1)}to{opacity:0;transform:scale(.5)}}.popup-disable-password .popup-description,.popup-skip-email .popup-description{max-width:284px}.grid{grid-gap:.25rem;display:grid;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr);width:100%}.grid-item{cursor:pointer;height:0;padding-bottom:100%;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.grid-item-media{height:100%;left:0;-o-object-fit:cover;object-fit:cover;position:absolute;top:0;width:100%}.animated-super-row{--translateY:100%;bottom:0;left:0;position:absolute;right:0;top:0;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{bottom:0;left:0;position:absolute;right:0;top:0}middle-ellipsis-element{display:block;overflow:hidden;width:100%}.album-item-media{height:100%;width:100%}html.no-touch .hover-effect:active,html.no-touch .hover-effect:hover{background-color:var(--light-secondary-text-color)}.progress-ring{left:0;pointer-events:none;position:absolute;top:0}.progress-ring__circle{stroke-linecap:round;transition:stroke-dashoffset}.rlottie,.rlottie-vector{bottom:0;height:100%;left:0;max-height:100%;max-width:100%;position:absolute;right:0;top:0;width:100%}.rlottie-icon{pointer-events:none;position:relative}body.animation-level-2 .rlottie.fade-in{animation:fade-in-opacity .2s ease-in-out forwards}.rlottie-vector{fill:rgba(0,0,0,.08)}.canvas-thumbnail{height:100%;position:absolute;width:100%}.media-container-contain{position:relative}.media-container-contain .media-photo{max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain}.media-container-cover{position:relative}.media-container-cover .media-photo{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.media-photo,.media-poster,.media-round,.media-sticker,.media-video{bottom:0;left:0;position:absolute;right:0;top:0}body.animation-level-2 .media-photo.fade-in,body.animation-level-2 .media-poster.fade-in,body.animation-level-2 .media-round.fade-in,body.animation-level-2 .media-sticker.fade-in,body.animation-level-2 .media-video.fade-in{animation:fade-in-opacity .2s ease-in-out forwards}body.animation-level-2 .media-photo.fade-out,body.animation-level-2 .media-poster.fade-out,body.animation-level-2 .media-round.fade-out,body.animation-level-2 .media-sticker.fade-out,body.animation-level-2 .media-video.fade-out{animation:fade-out-opacity .2s ease-in-out forwards}.media-video{z-index:1}.media-sticker{height:100%;margin:auto;max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain;width:100%}.media-sticker-wrapper.is-premium-sticker:before{align-items:center;background:rgba(0,0,0,.2);background-image:var(--lock-url);background-repeat:no-repeat;background-size:cover;border-radius:50%;bottom:.125rem;color:#fff;display:flex;height:1.25rem;justify-content:center;left:50%;position:absolute;transform:translateX(-50%);width:1.25rem;z-index:1}body.is-premium .media-sticker-wrapper.is-premium-sticker:after,body.is-premium .media-sticker-wrapper.is-premium-sticker:before{content:none}.media-round{max-height:var(--round-video-size);max-width:var(--round-video-size);z-index:1}.media-round canvas{border-radius:50%;height:100%;position:relative;width:100%}.media-round .video-time{background-color:var(--message-highlightning-color)!important;padding:0 .375rem}[dir=ltr] .media-round .video-time:after,[dir=ltr] .media-round .video-time:before{margin-left:.25rem}[dir=rtl] .media-round .video-time:after,[dir=rtl] .media-round .video-time:before{margin-right:.25rem}.media-round.is-unread .video-time:before{background-color:#fff;border-radius:50%;content:\" \";height:.5rem;order:1;width:.5rem}.media-round.is-paused .video-time:after{align-items:center;content:\"๎ฆƒ\";display:flex;font-size:1.125rem;order:2}.gradient-delimiter{background-color:var(--background-color-true);height:.75rem;position:relative;width:100%}.gradient-delimiter:before{background:linear-gradient(180deg,rgba(0,0,0,.06),transparent 20%,transparent 94%,rgba(0,0,0,.06));bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.sidebar-left-section{background-color:var(--surface-color);box-shadow:0 1px 3px 0 var(--section-box-shadow-color);margin-bottom:.75rem;padding:.5rem 0!important}.sidebar-left-section.no-shadow{box-shadow:none!important}.sidebar-left-section-name{padding:.5rem 1rem}.sidebar-left-section-caption{font-size:var(--font-size-14);line-height:var(--line-height-14);margin:-.1875rem 0 1rem;padding:0 1.5rem}.sidebar-left-section-caption:first-child{margin-bottom:.8125rem;margin-top:.8125rem}@media only screen and (max-width:600px){.sidebar-left-section-caption{padding:0 1rem}}.sidebar-left-section-container{-webkit-user-select:none;-moz-user-select:none;user-select:none}.sidebar-left-section-container a{cursor:pointer}hr{display:none!important}.tgico-admin:before,.tgico-fontsize:before{font-size:20px!important;padding:2px}.tgico-endcall_filled,.tgico-phone_filled{font-size:26px!important}.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}.navigable-list .active{background-color:var(--light-secondary-text-color);border-radius:inherit}.super-emojis{--esg-emoji-total-size:calc(var(--esg-emoji-size) + 0.5rem);--custom-emoji-size:var(--esg-emoji-size);grid-column-gap:2.44px;--esg-emoji-size:2.125rem;--esg-emoji-total-size:2.625rem;--custom-emoji-size:2.25rem;-moz-column-gap:2.44px;column-gap:2.44px;-moz-column-gap:.25rem;column-gap:.25rem;display:grid;font-size:var(--esg-emoji-size);grid-template-columns:repeat(auto-fill,var(--esg-emoji-total-size));justify-content:space-between;line-height:var(--esg-emoji-size);position:relative}.super-emojis .super-emoji{border-radius:8px;cursor:pointer;display:inline-block;height:var(--esg-emoji-total-size);line-height:inherit;margin-left:.0625rem;margin-right:.0625rem;padding:.25rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;width:var(--esg-emoji-total-size)}.super-emojis .super-emoji .emoji-placeholder{background-color:var(--light-secondary-text-color);border-radius:50%;height:1.75rem;left:7px;pointer-events:none;position:absolute;top:7px;width:1.75rem}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{height:100%;margin:0;vertical-align:baseline;vertical-align:initial;width:100%}.super-emojis .super-emoji.active,html.no-touch .super-emojis .super-emoji:active,html.no-touch .super-emojis .super-emoji:hover{background-color:var(--light-secondary-text-color)}.super-emojis.not-local .super-emoji{padding:.1875rem}.super-emojis .super-emoji{margin:0}.super-emojis:not(.not-local) .super-emoji{overflow:hidden}html.native-emoji .super-emojis:not(.not-local) .super-emoji{padding-bottom:.3125rem;padding-top:.3125rem}.super-emojis .custom-emoji{display:block}.super-emojis .custom-emoji-renderer{z-index:1}.super-emojis .custom-emoji:before{content:none}.tgico-char:before{font-family:Roboto!important;font-weight:var(--font-weight-bold);text-align:center;width:1.5rem}.tgico-char.z:before{content:\"Z\"}.tgico-char.w:before{content:\"W\"}.sending-status:empty{display:none}.sending-status .tgico-sendingerror{color:var(--danger-color)}.sending-status-icon{line-height:1!important;position:absolute}.quick-reaction-title{align-items:center;display:flex}.quick-reaction-sticker{height:32px!important;margin:0 .5rem 0 0!important;position:relative!important;width:32px!important}.verified-icon-svg{height:1rem;width:1rem}.verified-icon-check{fill:#fff}.verified-icon-background{fill:var(--primary-color)}[dir=ltr] .emoji-status,[dir=ltr] .premium-icon,[dir=ltr] .verified-icon{margin-left:.125rem}[dir=rtl] .emoji-status,[dir=rtl] .premium-icon,[dir=rtl] .verified-icon{margin-right:.125rem}.emoji-status,.premium-icon,.verified-icon{align-items:center;display:flex;flex:0 0 auto;font-size:1rem;height:1.25rem;justify-content:center;width:1.25rem}[dir=ltr] .emoji-status{margin-left:.25rem}[dir=rtl] .emoji-status{margin-right:.25rem}.emoji-status{height:1.125rem;position:relative;width:1.125rem}.premium-icon{color:var(--primary-color);margin-top:-.0625rem}.badge-fake{border:1px solid var(--danger-color);border-radius:.185rem;color:var(--danger-color);flex:0 0 auto;font-size:.625rem;font-weight:var(--font-weight-bold);line-height:1!important;margin-left:.25rem;margin-right:.25rem;padding:.125rem .25rem}.peer-title.with-icons{align-items:center;display:flex;overflow:hidden}.peer-title-inner{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.limit-line{display:flex;font-weight:var(--font-weight-bold);height:2rem}.limit-line-free{color:#000}.limit-line-premium{color:#fff}.limit-line-free{background-color:#f1f3f5;border-bottom-left-radius:10px;border-top-left-radius:10px}.limit-line-premium{background:linear-gradient(84.4deg,#6c93ff -4.85%,#976fff 51.72%,#df69d1 110.7%);border-bottom-right-radius:10px;border-top-right-radius:10px}.limit-line-free,.limit-line-premium{align-items:center;display:flex;flex:1 1 0;justify-content:space-between;padding:0 .75rem}.movable-element{--size:.5rem;position:relative}.movable-element-resize-handler{position:absolute}.movable-element-resize-handler-side-n,.movable-element-resize-handler-side-s{cursor:row-resize;height:var(--size);left:0;right:0}.movable-element-resize-handler-side-e,.movable-element-resize-handler-side-w{bottom:0;cursor:col-resize;top:0;width:var(--size)}.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-ne,.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-se,.movable-element-resize-handler-side-sw{height:var(--size);width: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-nw,.movable-element-resize-handler-side-se{cursor:nwse-resize}.movable-element-resize-handler-side-ne{right:0;top:0}.movable-element-resize-handler-side-se{bottom:0;right:0}.movable-element-resize-handler-side-sw{bottom:0;left:0}.movable-element-resize-handler-side-nw{left:0;top:0}[dir=ltr] .chatlist-chat.row-with-padding{padding-left:4.5rem!important}[dir=rtl] .chatlist-chat.row-with-padding{padding-right:4.5rem!important}.chatlist-chat span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chatlist-chat .row-title{font-size:var(--font-size-16)!important;line-height:1.375rem}.chatlist-chat .row-title-right-secondary{font-size:var(--font-size-12)!important;line-height:var(--line-height-12)!important;margin-top:-.4375rem}.chatlist-chat .row-subtitle{display:block!important}.chatlist-chat .row-row{height:1.375rem}.chatlist-chat.chatlist-chat-abitbigger .row-subtitle{margin-top:0}.chatlist-chat.chatlist-chat-bigger .row-subtitle{font-size:var(--font-size-16)!important;line-height:1.375rem;margin-top:0}.chatlist-chat.chatlist-chat-bigger .row-subtitle-row{margin-top:.125rem}.chatlist-chat.chatlist-chat-bigger .row-title .peer-title{font-weight:var(--font-weight-bold)}.username-purchase-help b{color:var(--danger-color)!important;font-weight:var(--font-weight-normal)!important}.media-spoiler-container{border-radius:inherit;bottom:0;left:0;position:absolute;right:0;top:0;z-index:1}.media-spoiler-container.is-revealing{opacity:1}.media-spoiler-container.is-revealing:not(.backwards){opacity:0}.media-spoiler-container.is-revealing.animating{transition:opacity var(--transition-standard-out)}.media-spoiler .canvas-thumbnail,.media-spoiler-thumbnail{height:100%;-o-object-fit:initial!important;object-fit:fill!important;position:absolute;width:100%}"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/public/main.5f90a31fa81da70d8bc4.bundle.js b/public/main.5f90a31fa81da70d8bc4.bundle.js new file mode 100644 index 00000000..9efcbdaa --- /dev/null +++ b/public/main.5f90a31fa81da70d8bc4.bundle.js @@ -0,0 +1,2 @@ +(()=>{"use strict";var e,t,n,s,i,o={410:(e,t,n)=>{n.d(t,{GO:()=>r,Tj:()=>i,ZP:()=>a});var s=n(1267);const i=!1,o=i||s.Z.debug,r="undefined"!=typeof window?window:self,a=o},236:(e,t,n)=>{n.d(t,{t:()=>c,h:()=>d});var s=n(4762),i=n(144),o=n(4159);const r=o.Z.version,a=o.Z.build,c={_:"theme",access_hash:"",id:"",settings:[{_:"themeSettings",pFlags:{},base_theme:{_:"baseThemeClassic"},accent_color:3379436,message_colors:[5221966],wallpaper:{_:"wallPaper",pFlags:{default:!0,pattern:!0},access_hash:"",document:void 0,id:"",slug:"pattern",settings:{_:"wallPaperSettings",pFlags:{},intensity:50,background_color:14409147,second_background_color:7054727,third_background_color:14014605,fourth_background_color:8960132}}},{_:"themeSettings",pFlags:{},base_theme:{_:"baseThemeNight"},accent_color:8877281,message_colors:[8877281],wallpaper:{_:"wallPaper",pFlags:{default:!0,pattern:!0,dark:!0},access_hash:"",document:void 0,id:"",slug:"pattern",settings:{_:"wallPaperSettings",pFlags:{},intensity:-50,background_color:16696470,second_background_color:14511289,third_background_color:9842623,fourth_background_color:5200853}}}],slug:"",title:"",emoticon:"๐Ÿ ",pFlags:{default:!0}},l=(e,t,n)=>Object.assign(Object.assign({},c),{name:e,settings:Object.assign(Object.assign({},c.settings.find((e=>e.base_theme._===t))),{highlightningColor:n})}),d={allDialogsLoaded:{},pinnedOrders:{},contactsListCachedTime:0,updates:{},filtersArr:[],maxSeenMsgId:0,stateCreatedTime:Date.now(),recentEmoji:[],recentCustomEmoji:[],topPeersCache:{},recentSearch:[],version:r,build:a,authState:{_:s.IS_MOBILE?"authStateSignIn":"authStateSignQr"},hiddenPinnedMessages:{},settings:{messagesTextSize:16,distanceUnit:"kilometers",sendShortcut:"enter",animationsEnabled:!0,autoDownload:{photo:{contacts:!0,private:!0,groups:!0,channels:!0},video:{contacts:!0,private:!0,groups:!0,channels:!0},file:{contacts:!0,private:!0,groups:!0,channels:!0}},autoDownloadNew:{_:"autoDownloadSettings",file_size_max:3145728,pFlags:{video_preload_large:!0,audio_preload_next:!0},photo_size_max:1048576,video_size_max:15728640,video_upload_maxbitrate:100},autoPlay:{gifs:!0,videos:!0},stickers:{suggest:!0,loop:!0},emoji:{suggest:!0,big:!0},themes:[l("day","baseThemeClassic","hsla(86.4, 43.846153%, 45.117647%, .4)"),l("night","baseThemeNight","hsla(299.142857, 44.166666%, 37.470588%, .4)")],theme:"system",notifications:{sound:!1},timeFormat:(new Date).toLocaleString().match(/\s(AM|PM)/)?"h12":"h23"},playbackParams:{volume:1,muted:!1,playbackRate:1,playbackRates:{voice:1,video:1,audio:1},loop:!1,round:!1},keepSigned:!0,chatContextMenuHintWasShown:!1,stateId:(0,i.d)(32),notifySettings:{}}},8189:(e,t,n)=>{n.d(t,{Z:()=>i});let s=!1;try{const e=document.createElement("canvas").getContext("webgl"),t=e.getExtension("WEBGL_debug_renderer_info"),n=t&&e.getParameter(t.UNMASKED_RENDERER_WEBGL)||"";(n.match(/Apple/)&&!n.match(/Apple GPU/)||-1===e.getSupportedExtensions().indexOf("WEBGL_compressed_texture_s3tc_srgb"))&&(s=!0)}catch(e){}const i=s},993:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n(4089).Z},7328:(e,t,n)=>{let s;if(n.d(t,{Z:()=>i}),n(4762).IS_SAFARI)try{s=+navigator.userAgent.match(/Version\/(.+?) /)[1]>=14}catch(e){s=!1}else s=!0;const i=s},6663:(e,t,n)=>{n.d(t,{Z:()=>s});const s="filter"in(document.createElement("canvas").getContext("2d")||{})},9976:(e,t,n)=>{n.d(t,{Z:()=>s});const s=-1!==navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i)},3731:(e,t,n)=>{var s;n.d(t,{Z:()=>i});const i=!!(null===(s=null===navigator||void 0===navigator?void 0:navigator.geolocation)||void 0===s?void 0:s.getCurrentPosition)&&!1},6818:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n(4089).Z},1174:(e,t,n)=>{n.d(t,{Z:()=>o});var s=n(5269);const i=new Set(["image/jpeg","image/png","image/bmp"]);s.Z&&i.add("image/webp");const o=i},2341:(e,t,n)=>{n.d(t,{Z:()=>r});var s=n(1174),i=n(554);const o=[...s.Z].concat([...i.Z]),r=new Set(o)},9030:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(4762);const i=!!document.createElement("video").canPlayType("video/quicktime")||s.IS_SAFARI||s.IS_APPLE_MOBILE},5783:(e,t,n)=>{n.d(t,{Z:()=>i});const s=document.createElement("audio"),i=!(!s.canPlayType||!s.canPlayType("audio/ogg;").replace(/no/,""))},2365:(e,t,n)=>{n.d(t,{Z:()=>s});const s=!n(4762).IS_FIREFOX&&!1},2820:(e,t,n)=>{n.d(t,{Z:()=>s});const s=!!("getDisplayMedia"in((null===navigator||void 0===navigator?void 0:navigator.mediaDevices)||{}))},2045:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(1267);const i="undefined"!=typeof SharedWorker&&!s.Z.noSharedWorker},5432:(e,t,n)=>{n.d(t,{Z:()=>s});const s="ontouchstart"in window||window.DocumentTouch&&document instanceof DocumentTouch},4762:(e,t,n)=>{n.r(t),n.d(t,{IS_ANDROID:()=>r,IS_APPLE:()=>o,IS_APPLE_MOBILE:()=>c,IS_CHROMIUM:()=>a,IS_FIREFOX:()=>d,IS_MOBILE:()=>u,IS_MOBILE_SAFARI:()=>h,IS_SAFARI:()=>l,USER_AGENT:()=>i});var s=n(6761);const i=navigator?navigator.userAgent:null,o=-1!==navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),r=-1!==navigator.userAgent.toLowerCase().indexOf("android"),a=/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),c=(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&!s.Z.MSStream,l=!!("safari"in s.Z)||!(!i||!(/\b(iPad|iPhone|iPod)\b/.test(i)||i.match("Safari")&&!i.match("Chrome"))),d=navigator.userAgent.toLowerCase().indexOf("firefox")>-1,h=l&&c,u=(void 0===navigator.maxTouchPoints||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)},2131:(e,t,n)=>{n.d(t,{Z:()=>s});const s=!!(null===navigator||void 0===navigator?void 0:navigator.vibrate)},554:(e,t,n)=>{n.d(t,{Z:()=>o});var s=n(9030);const i=new Set(["image/gif","video/mp4","video/webm"]);s.Z&&i.add("video/quicktime");const o=i},393:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(4762);const i=!!document.createElement("video").canPlayType("video/webm")&&!s.IS_SAFARI&&!s.IS_APPLE_MOBILE},5269:(e,t,n)=>{n.d(t,{Z:()=>s});const s=document.createElement("canvas").toDataURL("image/webp").startsWith("data:image/webp")},4089:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(4762);const i=!("undefined"==typeof RTCPeerConnection||s.IS_FIREFOX)},2064:(e,t,n)=>{n.d(t,{Dk:()=>g,EM:()=>w,K5:()=>u,Pi:()=>c,WE:()=>o,Y6:()=>a,cw:()=>d,dI:()=>r,e9:()=>f,ix:()=>p,oo:()=>l,py:()=>i,t1:()=>h,tB:()=>y,uY:()=>v});var s=n(3228);function i(e,t,n){e/=255,t/=255,n/=255;const s=Math.max(e,t,n),i=s-Math.min(e,t,n),o=i&&(s===e?(t-n)/i:s==t?2+(n-e)/i:4+(e-t)/i);return[60*(o<0?o+6:o),s&&i/s,s]}function o(e,t,n){const s=(s,i=(s+e/60)%6)=>Math.round(255*(n-n*t*Math.max(Math.min(i,4-i,1),0)));return[s(5),s(3),s(1)]}function r(e,t,n,s=1){e/=255,t/=255,n/=255;const i=Math.max(e,t,n),o=Math.min(e,t,n);let r,a;const c=(i+o)/2;if(i===o)r=a=0;else{const s=i-o;switch(a=c>.5?s/(2-i-o):s/(i+o),i){case e:r=(t-n)/s+(t1&&(n-=1),n<1/6?e+6*(t-e)*n:n<.5?t:n<2/3?e+(t-e)*(2/3-n)*6:e},a=n<.5?n*(1+t):n+t-n*t,c=2*n-a;i=s(c,a,e+1/3),o=s(c,a,e),r=s(c,a,e-1/3)}return[i,o,r,s].map((e=>Math.round(255*e)))}function c(e){const t=[],n="#"===e[0]?1:0;if(e.length===5+n&&(e=(n?"#":"")+"0"+e.slice(n)),e.length===3+n)for(let s=n;s("0"+e.toString(16)).slice(-2))).join("")}function u(e){return function(e){return h(function(e){const t=e.slice(5,-1).split(", "),n=+t.pop(),s=t.map((e=>e.endsWith("%")?+e.slice(0,-1):+e));return a(s[0],s[1],s[2],n)}(e))}(e).slice(0,-2)}function g(e,t,n){const s=new Array(3);for(let i=0;i<3;++i){const o=e[i],r=t[i];s[i]=Math.floor(r+(o-r)*n)}return s}function m(e){return(.2126*e[0]+.7152*e[1]+.0722*e[2])/255}function p(e,t){return e.map(((e,n)=>Math.round((e+t[n])/2)))}function f(e,t,n){const s=i(...t),r=i(...n),a=Math.min(1.5*s[1]/e[1],1);return s[0]=Math.min(360,r[0]-s[0]+e[0]),s[1]=Math.min(1,r[1]*e[1]/s[1]),s[2]=Math.min(1,(r[2]/s[2]+a-1)*e[2]/a),s[2]<.3?n:o(...s)}function v(e,t,n,r){const a=i(...n);if(Math.min(Math.abs(a[0]-e[0]),Math.abs(a[0]-e[0]-360))>30)return n;const c=Math.min(1.5*a[1]/e[1],1);a[0]=Math.min(360,a[0]+t[0]-e[0]),a[1]=Math.min(1,a[1]*t[1]/e[1]),a[2]=Math.min(1,a[2]*(1-c+c*t[2]/e[2]));let l=o(...a);const d=m(n),h=m(l);if(r?d>h:d(0,s.Z)(Math.round(e*t),0,255)))}(l,(1-e)*d/h+e)}return l}function b(e){const t=(e<0?16777215+e:e).toString(16);return"#"+(t.length>=6?t:"0".repeat(6-t.length)+t)}function y(e){return l(b(e))}function w(e){return e.settings?[e.settings.background_color,e.settings.second_background_color,e.settings.third_background_color,e.settings.fourth_background_color].filter(Boolean).map(b).join(","):""}},6009:(e,t,n)=>{function s(e,t){e=e.split(" ",1)[0],t=t.split(" ",1)[0];const n=e.split("."),s=t.split(".");for(let e=0;ei)return 1;if(ts})},8799:(e,t,n)=>{function s(){var e;return!!(null===(e=document.activeElement)||void 0===e?void 0:e.blur)&&(document.activeElement.blur(),!0)}n.d(t,{Z:()=>s})},3910:(e,t,n)=>{function s(e){if(e||(e=window.event),e){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,{Z:()=>s})},8497:(e,t,n)=>{function s(e,t){return e.closest("."+t)}n.d(t,{Z:()=>s})},5494:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(3035);function i(e){e.style.transform="translateY(-99999px)",e.focus(),(0,s.d1)().then((()=>{e.style.transform=""}))}},8090:(e,t,n)=>{n.d(t,{T:()=>a,Z:()=>c});var s=n(5432),i=n(4762),o=n(8497),r=n(5494);const a=i.IS_SAFARI&&i.IS_MOBILE&&s.Z;if(a){const e="clientY";let t=0;const n={capture:!0,passive:!1},s=n=>{const s=n.touches[0],i=(0,o.Z)(s.target,"scrollable-y");if(i){const o=s[e],r=t-o,a=i.scrollTop,c=i.scrollHeight,l=i.clientHeight,d=a?Math.round(a+i.clientHeight+r):a+r;(c===l||d>=c||d<=0)&&n.preventDefault()}else n.preventDefault()};let i=0;document.addEventListener("focusin",(o=>{!o.target.classList.contains("is-sticky-input-bugged")||o.timeStamp-i<50||((0,r.Z)(o.target),document.addEventListener("touchmove",s,n),document.addEventListener("touchstart",(n=>{if(n.touches.length>1)return;const s=n.touches[0];t=s[e]})))}),{passive:!0}),document.addEventListener("focusout",(e=>{document.removeEventListener("touchmove",s,n),i=e.timeStamp}),{passive:!0}),document.addEventListener("visibilitychange",(()=>{document.activeElement&&document.activeElement.classList.contains("is-sticky-input-bugged")&&document.activeElement.blur&&(0,r.Z)(document.activeElement)}),{passive:!0})}function c(e){a&&e.classList.add("is-sticky-input-bugged")}},6472:(e,t,n)=>{n.d(t,{B:()=>o,Z:()=>i});let s;function i(){window.addEventListener("beforeinstallprompt",(e=>{s=()=>{return t=this,n=void 0,o=function*(){e.prompt();const{outcome:t}=yield e.userChoice;"accepted"===t&&(s=void 0)},new((i=void 0)||(i=Promise))((function(e,s){function r(e){try{c(o.next(e))}catch(e){s(e)}}function a(e){try{c(o.throw(e))}catch(e){s(e)}}function c(t){var n;t.done?e(t.value):(n=t.value,n instanceof i?n:new i((function(e){e(n)}))).then(r,a)}c((o=o.apply(t,n||[])).next())}));var t,n,i,o}}))}function o(){return s}},4541:(e,t,n)=>{n.d(t,{Z:()=>c});var s=n(319),i=n(5418);const o=["b","ะฑ"],r={},a={text:"Roboto",icons:"tgico",monospace:"Roboto Mono"};function c(e={text:o,icons:void 0,monospace:o}){if(!("fonts"in document))return Promise.resolve();const t=[];for(const n in e){let s=e[n];"all"===s&&(s=o);const i=a[n],c="icons"===n?[500]:[400,500];for(const e of c){const n=(s||[void 0]).map((t=>{var n,s,o,a;const c=[e,"1rem",i].join(" ");return null!==(s=(o=null!==(n=r[c])&&void 0!==n?n:r[c]={})[a=t||""])&&void 0!==s?s:o[a]=document.fonts.load(c,t)}));t.push(...n)}}return Promise.race([Promise.all(t).catch(s.Z),(0,i.Z)(1e3)])}},130:(e,t,n)=>{function s(e,t){i(e),"string"==typeof t?t?e.innerHTML=t:e.replaceChildren():e.replaceChildren(t)}function i(e){e.setAttribute("dir","auto")}n.d(t,{Z:()=>s,m:()=>i})},2586:(e,t,n)=>{n.d(t,{Z:()=>a});var s=n(5432),i=n(3241);const o=s.Z?"touchstart":"mousemove";class r extends i.Z{constructor(){super(),this._isIdle=!0,this.focusPromise=Promise.resolve(),this.focusResolve=()=>{},window.addEventListener("blur",(()=>{this.isIdle=!0,window.addEventListener("focus",(()=>{this.isIdle=!1}),{once:!0})})),window.addEventListener(o,(()=>{this.isIdle=!1}),{once:!0,passive:!0}),this.addEventListener("change",(e=>{e?this.focusPromise=new Promise((e=>{this.focusResolve=e})):this.focusResolve()}))}getFocusPromise(){return this.focusPromise}get isIdle(){return this._isIdle}set isIdle(e){this._isIdle!==e&&(this._isIdle=e,this.dispatchEvent("change",e))}}const a=new r},3228:(e,t,n)=>{function s(e,t,n){return Math.min(n,Math.max(t,e))}n.d(t,{Z:()=>s})},3815:(e,t,n)=>{n.d(t,{Z:()=>o});var s=n(3241);class i extends s.Z{constructor(){super(...arguments),this.overlaysActive=0}get isOverlayActive(){return this.overlaysActive>0}set isOverlayActive(e){this.overlaysActive+=e?1:-1,this.dispatchEvent("change",this.isOverlayActive)}}const o=new i},3035:(e,t,n)=>{let s;function i(e){s?s.push(e):(s=[e],requestAnimationFrame((()=>{const e=s;s=void 0,e.forEach((e=>e()))})))}n.d(t,{AD:()=>l,T2:()=>i,TR:()=>c,d1:()=>d});let o,r,a=!1;function c(e){o?a?e():o.push(e):(o=[e],requestAnimationFrame((()=>{a=!0;for(let e=0;ei((()=>e())))),r.then((()=>{r=void 0})),r)}function d(){return new Promise((e=>{i((()=>{i(e)}))}))}},764:(e,t,n)=>{function s(e,t=e.split("?")){const n={};return t[1]?(t[1].split("&").forEach((e=>{n[e.split("=")[0]]=decodeURIComponent(e.split("=")[1])})),n):n}n.d(t,{Z:()=>s})},6714:(e,t,n)=>{n.d(t,{Z:()=>h});var s=n(5432),i=n(3512),o=n(2064),r=n(410),a=function(e,t,n,s){return new(n||(n=Promise))((function(i,o){function r(e){try{c(s.next(e))}catch(e){o(e)}}function a(e){try{c(s.throw(e))}catch(e){o(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(r,a)}c((s=s.apply(e,t||[])).next())}))};const c={"primary-color":{rgb:!0,light:!0,lightFilled:!0,dark:!0,darkRgb:!0},"message-out-primary-color":{lightFilled:!0},"surface-color":{rgb:!0},"danger-color":{light:!0,dark:!0},"primary-text-color":{rgb:!0},"secondary-text-color":{light:!0,lightFilled:!0},"message-out-background-color":{light:!0,lightFilled:!0,dark:!0,darkFilled:!0},"saved-color":{lightFilled:!0}},l={day:{"primary-color":"#3390ec","message-out-primary-color":"#4fae4e","surface-color":"#ffffff","danger-color":"#df3f40","primary-text-color":"#000000","secondary-text-color":"#707579","saved-color":"#359AD4"},night:{"primary-color":"#8774E1","message-out-primary-color":"#8774E1","surface-color":"#212121","danger-color":"#ff595a","primary-text-color":"#ffffff","secondary-text-color":"#aaaaaa","saved-color":"#8774E1"}},d=new class{constructor(){i.Z.addEventListener("theme_change",(()=>{this.setTheme()}))}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",i.Z.myId?i.Z.dispatchEvent("theme_change"):this.setTheme()};"addEventListener"in e?e.addEventListener("change",t):"addListener"in e&&e.addListener(t),t()}catch(e){}}applyHighlightningColor(){var e;let t;const n=this.getTheme();(null===(e=n.settings)||void 0===e?void 0:e.highlightningColor)?(t=n.settings.highlightningColor,document.documentElement.style.setProperty("--message-highlightning-color",t)):document.documentElement.style.removeProperty("--message-highlightning-color"),!s.Z&&t&&(this.themeColor=(0,o.K5)(t))}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();const n=this.getTheme();this.applyTheme(n);let s=this.styleElement;s||(s=this.styleElement=document.createElement("style"),document.head.append(s));const o=document.createElement("div");this.applyTheme(i.Z.settings.themes.find((e=>"night"===e.name)),o),s.textContent=`.night {${o.style.cssText}}`,this.applyHighlightningColor()}switchTheme(e){return a(this,void 0,void 0,(function*(){yield i.Z.managers.appStateManager.setByKey("settings.theme",e),i.Z.dispatchEvent("theme_change")}))}isNight(){return"night"===this.getTheme().name}getTheme(e=("system"===i.Z.settings.theme?this.systemTheme:i.Z.settings.theme)){return i.Z.settings.themes.find((t=>t.name===e))}bindColorApplier(e){const t=new Set;return{applyAppColor:n=>(t.add(n.name),this.applyAppColor(Object.assign(Object.assign({},n),e))),finalize:()=>{const n=e.isNight;for(const s in c)t.has(s)||this.applyAppColor(Object.assign({name:s,hex:l[n?"night":"day"][s]},e))}}}applyAppColor({name:e,hex:t,element:n,lightenAlpha:s=.08,darkenAlpha:i=s,mixColor:r,isNight:a}){const d=c[e],h=(0,o.oo)(t),u=(0,o.dI)(...h);null!=r||(r=(0,o.oo)(l[a?"night":"day"]["surface-color"]));const g=(0,o.Dk)(h,r,s),m=Object.assign(Object.assign({},u),{l:u.l-100*i});[[e,t],d.rgb&&[e+"-rgb",h.join(",")],d.light&&["light-"+e,`rgba(${h[0]}, ${h[1]}, ${h[2]}, ${s})`],d.lightFilled&&["light-filled-"+e,(0,o.t1)(g)],d.dark&&["dark-"+e,`hsl(${m.h}, ${m.s}%, ${m.l}%)`]].filter(Boolean).forEach((([e,t])=>{n.style.setProperty("--"+e,t)}))}applyNewTheme(e){return a(this,void 0,void 0,(function*(){const t=this.isNightTheme(e),n=this.getTheme(),s=i.Z.settings.themes,o=e.settings.find((e=>e.base_theme._===(t?"baseThemeNight":"baseThemeClassic"))),r=Object.assign(Object.assign({},e),{name:n.name,settings:Object.assign(Object.assign({},o),{highlightningColor:""})});yield this.AppBackgroundTab.setBackgroundDocument(o.wallpaper,r.settings),s[s.indexOf(n)]=r,yield i.Z.managers.appStateManager.setByKey("settings.themes",i.Z.settings.themes),i.Z.dispatchEvent("theme_change")}))}isNightTheme(e){return"night"===e.name||this.isNight()}applyTheme(e,t=document.documentElement){var n;const s=this.isNightTheme(e),i=Array.isArray(e.settings)?e.settings.find((e=>e.base_theme._===(s?"baseThemeNight":"baseThemeClassic"))):e.settings,r=l[s?"night":"day"];let a=(0,o.py)(...(0,o.oo)(r["primary-color"])),c=(0,o.py)(...(0,o.tB)(i.accent_color));const d=(0,o.uY)(a,c,(0,o.oo)(r["primary-color"]),!s),h=(0,o.t1)(d),{applyAppColor:u,finalize:g}=this.bindColorApplier({element:t,isNight:s});if(u({name:"primary-color",hex:h,darkenAlpha:.04}),u({name:"saved-color",hex:h,lightenAlpha:.64,mixColor:[255,255,255]}),!(null===(n=i.message_colors)||void 0===n?void 0:n.length))return;const m=s?.92:.12,p=(0,o.oo)(r["message-out-primary-color"]);a=(0,o.py)(...p);const f=(0,o.Dk)(p,(0,o.oo)(r["surface-color"]),m);let v=(0,o.tB)(i.message_colors[0]);i.message_colors.length>1&&(i.message_colors.slice(1).forEach((e=>{v=(0,o.ix)(v,(0,o.tB)(e))})),v=(0,o.e9)(a,f,v));const b=v;c=(0,o.py)(...b);const y=void 0!==i.outbox_accent_color&&(0,o.py)(...(0,o.tB)(i.outbox_accent_color)),w=(0,o.Dk)(v,(0,o.oo)(r["surface-color"]),m);u({name:"message-out-background-color",hex:(0,o.t1)(w),lightenAlpha:m}),u({name:"message-out-primary-color",hex:s?"#ffffff":(0,o.t1)(y?(0,o.WE)(...y):v),mixColor:w}),g()}};r.GO&&(r.GO.themeController=d);const h=d},2938:(e,t,n)=>{var s=n(4159),i=n(8799),o=n(3910),r=n(8090),a=n(4541),c=n(9976),l=n(4762),d=n(5418);!function(){const e={construct(e,t){let n=t[0]+"";return 0!==n.indexOf("blob:")&&(n+=location.search),new e(n)}};[Worker,"undefined"!=typeof SharedWorker&&SharedWorker].filter(Boolean).forEach((t=>{window[t.name]=new Proxy(t,e)}))}();var h=n(3512),u=n(5432),g=n(2325),m=(n(4110),n(690),n(3855)),p=n(2554),f=n(6714),v=n(3815),b=n(490),y=n(764),w=n(1267),S=n(410);const k="onbeforeinstallprompt"in window;var P=n(6472);document.addEventListener("DOMContentLoaded",(()=>{return e=void 0,t=void 0,E=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)}),void 0===Node.prototype.replaceChildren&&(Node.prototype.replaceChildren=function(...e){this.textContent="",e&&this.append(...e)}),h.Z.managers=(0,p.Z)(),document.getElementById("manifest").href=`site${l.IS_APPLE&&!l.IS_APPLE_MOBILE?"_apple":""}.webmanifest?v=jw3mK7G9Aq`,b.Z.start();const e=window.visualViewport||window;let t,_=!1;const E=()=>{const n=.01*(_&&!v.Z.isOverlayActive?e.height||e.innerHeight:window.innerHeight);t!==n&&(u.Z&&t1&&(0,i.Z)(),t=n,document.documentElement.style.setProperty("--vh",`${n}px`))};if(window.addEventListener("resize",E),E(),r.T){const t=()=>{_=1===n&&r.T&&!v.Z.isOverlayActive,E(),e!==window&&(_?(window.removeEventListener("resize",E),e.addEventListener("resize",E)):(e.removeEventListener("resize",E),window.addEventListener("resize",E)))};let n;window.onImTabChange=e=>{const s=void 0!==n;n=e,(s||1===n)&&t()},v.Z.addEventListener("change",(()=>{t()}))}if(l.IS_FIREFOX&&!c.Z&&document.addEventListener("dragstart",(e=>{const t=e.target;if("IMG"===t.tagName&&t.classList.contains("emoji"))return(0,o.Z)(e),!1})),c.Z&&document.documentElement.classList.add("native-emoji"),document.addEventListener("dragstart",(e=>{var t;if("IMG"===(null===(t=e.target)||void 0===t?void 0:t.tagName))return e.preventDefault(),!1})),document.addEventListener("contextmenu",(e=>{"IMG"!==e.target.tagName||window.appMediaViewer||(0,o.Z)(e)})),l.IS_FIREFOX&&document.documentElement.classList.add("is-firefox","no-backdrop"),l.IS_MOBILE&&document.documentElement.classList.add("is-mobile"),l.IS_APPLE)l.IS_SAFARI&&document.documentElement.classList.add("is-safari"),l.IS_APPLE_MOBILE?document.documentElement.classList.add("is-ios"):document.documentElement.classList.add("is-mac");else if(l.IS_ANDROID){document.documentElement.classList.add("is-android");const e=()=>{n=!0,window.addEventListener("resize",t,{once:!0})},t=()=>{n=!1,(0,i.Z)()};let n=!1;document.addEventListener("touchend",(t=>{const s=t.target.closest('[contenteditable="true"], input');s&&(document.activeElement===s||n||(console.log("input click",t,document.activeElement,s,s.matches(":focus")),window.addEventListener("resize",e,{once:!0})))}))}u.Z?document.documentElement.classList.add("is-touch"):document.documentElement.classList.add("no-touch"),k&&(0,P.Z)();const A=performance.now(),Z=g.ZP.getCacheLangPack(),[C,I]=yield Promise.all([m.Z.sendState().then((([e])=>e)),Z]);function L(e,t){e.style.opacity="0",t.then((()=>{window.requestAnimationFrame((()=>{e.style.opacity=""}))}))}g.ZP.setTimeFormat(C.state.settings.timeFormat),h.Z.managers.rootScope.getPremium().then((e=>{h.Z.premium=e})),f.Z.setThemeListener(),I.appVersion!==s.Z.langPackVersion&&g.ZP.getLangPack(I.lang_code),console.log("got state, time:",performance.now()-A),"ar"===I.lang_code&&S.Tj,document.documentElement.dir="ltr";let T=C.state.authState;const O=location.hash,M=O.split("?"),x=(0,y.Z)(O,M);if(x.tgWebAuthToken&&"authStateSignedIn"!==T._){const e={token:x.tgWebAuthToken,dcId:+x.tgWebAuthDcId,userId:x.tgWebAuthUserId.toUserId(),isTest:void 0!==x.tgWebAuthTest&&!!+x.tgWebAuthTest,tgAddr:x.tgaddr};if(e.isTest!==w.Z.test){const e=new URLSearchParams(location.search);return+x.tgWebAuthTest?e.set("test","1"):e.delete("test"),void(location.search=e.toString())}h.Z.managers.appStateManager.pushToState("authState",T={_:"authStateSignImport",data:e})}if("authStateSignedIn"!==T._){console.log("Will mount auth page:",T._,Date.now()/1e3);const e=document.getElementById("auth-pages");let t,s;if(e){t=e.querySelector(".scrollable"),u.Z&&!l.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.resolve().then(n.bind(n,2831)),Promise.resolve().then(n.bind(n,6702))]).then((([e,t])=>{e.default.setAuthorized(!1),t.default.forceUnsubscribe()}))}catch(e){}switch(T._){case"authStateSignIn":s=(yield Promise.all([n.e(147),n.e(684),n.e(63)]).then(n.bind(n,810))).default.mount();break;case"authStateSignQr":s=(yield Promise.all([n.e(147),n.e(684),n.e(709)]).then(n.bind(n,9709))).default.mount();break;case"authStateAuthCode":s=(yield Promise.all([n.e(147),n.e(684),n.e(53)]).then(n.bind(n,6392))).default.mount(T.sentCode);break;case"authStatePassword":s=(yield Promise.all([n.e(147),n.e(684),n.e(437)]).then(n.bind(n,9437))).default.mount();break;case"authStateSignUp":s=(yield Promise.all([n.e(147),n.e(684),n.e(339)]).then(n.bind(n,8339))).default.mount(T.authCode);break;case"authStateSignImport":s=(yield Promise.all([n.e(147),n.e(684),n.e(231)]).then(n.bind(n,3231))).default.mount(T.data)}t&&(s&&(yield s),L(t,"fonts"in document?Promise.race([(0,d.Z)(1e3),document.fonts.ready]):Promise.resolve()))}else console.log("Will mount IM page:",Date.now()/1e3),L(document.getElementById("main-columns"),(0,a.Z)()),(yield Promise.all([n.e(147),n.e(684),n.e(436)]).then(n.bind(n,5436))).default.mount()},new((_=void 0)||(_=Promise))((function(n,s){function i(e){try{r(E.next(e))}catch(e){s(e)}}function o(e){try{r(E.throw(e))}catch(e){s(e)}}function r(e){var t;e.done?n(e.value):(t=e.value,t instanceof _?t:new _((function(e){e(t)}))).then(i,o)}r((E=E.apply(e,t||[])).next())}));var e,t,_,E}))},1722:(e,t,n)=>{n.d(t,{Z:()=>s});const s=new class{reload(){try{location.reload()}catch(e){}}close(){try{window.close()}catch(e){}}focus(){window.focus()}}},2554:(e,t,n)=>{n.d(t,{Z:()=>c});var s=n(3855),i=n(410);const o={};function r(e,t){return new Proxy(e,{get:(e,n,r)=>{var a;return null!==(a=e[n])&&void 0!==a?a:e[n]=function(e,t){return new Proxy({},{get:(n,r,a)=>(...n)=>{var a;const c=s.Z.invoke("manager",{name:e,method:r,args:n},t);return i.ZP&&(null===(a=o[e])||void 0===a?void 0:a.has(r))&&console.warn("manager request",e,r,n),c}})}(n,t)}})}let a;function c(){return a||(a=r({},!1),a.acknowledged=r({},!0),a)}i.ZP&&(window.DEBUG_MANAGER_REQUESTS=o)},6666:(e,t,n)=>{n.d(t,{Z:()=>c});var s=n(1267),i=n(5471),o=n(5953),r=n(5003);class a{constructor(e){(0,o.Z)(this,e),s.Z.test&&(this.name+="_test"),this.storageIsAvailable=!0,this.log=(0,r.kg)(["IDB",e.name].join("-")),this.log("constructor"),this.openDatabase(!0),a.INSTANCES.push(this)}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;const t=(e,t)=>{var n;const s=Array.from(e.indexNames);for(const t of s)e.deleteIndex(t);if(null===(n=t.indexes)||void 0===n?void 0:n.length)for(const n of t.indexes)e.indexNames.contains(n.indexName)||e.createIndex(n.indexName,n.keyPath,n.objectParameters)};try{var n=indexedDB.open(this.name,this.version);if(!n)return Promise.reject()}catch(e){return this.log.error("error opening db",e.message),this.storageIsAvailable=!1,Promise.reject(e)}let s=!1;return setTimeout((()=>{s||n.onerror((0,i.Z)("IDB_CREATE_TIMEOUT"))}),3e3),this.openDbPromise=new Promise(((e,i)=>{n.onsuccess=t=>{s=!0;const o=n.result;let r=!1;this.log("Opened"),o.onerror=e=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),i(e)},o.onclose=e=>{this.log.error("closed:",e),!r&&this.openDatabase()},o.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(r=!0),t.onerror&&t.onerror(e),o.close()},o.onversionchange=e=>{this.log.error("onversionchange, lol?")},e(this.db=o)},n.onerror=e=>{s=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),i(e)},n.onupgradeneeded=e=>{s=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);const n=e.target,i=n.result;this.stores.forEach((e=>{if(i.objectStoreNames.contains(e.name)){const s=n.transaction.objectStore(e.name);t(s,e)}else((e,n)=>{const s=e.createObjectStore(n.name);t(s,n)})(i,e)}))}}))}static create(e){var t;return null!==(t=this.INSTANCES.find((t=>t.name===e.name)))&&void 0!==t?t:new a(e)}static closeDatabases(e){this.INSTANCES.forEach((t=>{if(e&&e===t)return;const n=t.db;n&&(n.onclose=()=>{},n.close())}))}}a.INSTANCES=[];class c{constructor(e,t){this.storeName=t,this.log=(0,r.kg)(["IDB",e.name,t].join("-")),this.idb=a.create(e)}delete(e,t){const n=Array.isArray(e);return n||(e=[].concat(e)),this.getObjectStore("readwrite",(t=>{const s=e.map((e=>t.delete(e)));return n?s:s[0]}),"",t)}clear(e){return this.getObjectStore("readwrite",(e=>e.clear()),"",e)}save(e,t,n){const s=Array.isArray(e);return s||(e=[].concat(e),t=[].concat(t)),this.getObjectStore("readwrite",(n=>{const i=e.map(((e,s)=>n.put(t[s],e)));return s?i:i[0]}),"",n)}get(e,t){const n=Array.isArray(e);if(n){if(!e.length)return Promise.resolve([])}else{if(!e)return;e=[].concat(e)}return this.getObjectStore("readonly",(t=>{const s=e.map((e=>t.get(e)));return n?s:s[0]}),"",t)}getObjectStore(e,t,n,s=this.storeName){let i;return n&&(i=performance.now(),this.log(n+": start")),this.idb.openDatabase().then((o=>new Promise(((r,a)=>{const c=o.transaction([s],e),l=()=>{clearTimeout(u),a(c.error)},d=()=>{clearTimeout(u),n&&this.log(n+": end",performance.now()-i);const e=p.map((e=>e.result));r(m?e:e[0])};c.onerror=l;const h="readwrite"===e;h&&(c.oncomplete=()=>d());const u=setTimeout((()=>{this.log.error("transaction not finished",c,n)}),1e4),g=t(c.objectStore(s)),m=Array.isArray(g),p=m?g:[].concat(g);if(h)return;const f=p.length;let v=f;const b=()=>{c.error||--v||d()};for(let e=0;ee.getAll()),"",e)}}},2325:(e,t,n)=>{n.d(t,{$d:()=>w,A1:()=>S,Hz:()=>m,XZ:()=>y,ZP:()=>v,ag:()=>b,nK:()=>p,v_:()=>k});var s=n(410),i=n(7922),o=n(4159),r=n(3512),a=n(4762),c=n(6848),l=n(5953),d=n(9005),h=n(6637),u=n(3591),g=n(130);const m={messageActionChatCreate:"ActionCreateGroup",messageActionChatCreateYou:"ActionYouCreateGroup",messageActionChatEditTitle:"ActionChangedTitle",messageActionChatEditPhoto:"ActionChangedPhoto",messageActionChatEditVideo:"ActionChangedVideo",messageActionChatDeletePhoto:"ActionRemovedPhoto",messageActionChatReturn:"ActionAddUserSelf",messageActionChatReturnYou:"ActionAddUserSelfYou",messageActionChatJoined:"ActionAddUserSelfMega",messageActionChatJoinedYou:"ChannelMegaJoined",messageActionChatAddUser:"ActionAddUser",messageActionChatAddUsers:"ActionAddUser",messageActionChatLeave:"ActionLeftUser",messageActionChatLeaveYou:"YouLeft",messageActionChatDeleteUser:"ActionKickUser",messageActionChatJoinedByLink:"ActionInviteUser",messageActionPinMessage:"Chat.Service.Group.UpdatedPinnedMessage",messageActionContactSignUp:"Chat.Service.PeerJoinedTelegram",messageActionChannelCreate:"ActionCreateChannel",messageActionChannelEditTitle:"Chat.Service.Channel.UpdatedTitle",messageActionChannelEditPhoto:"Chat.Service.Channel.UpdatedPhoto",messageActionChannelEditVideo:"Chat.Service.Channel.UpdatedVideo",messageActionChannelDeletePhoto:"Chat.Service.Channel.RemovedPhoto",messageActionHistoryClear:"HistoryCleared",messageActionDiscussionStarted:"DiscussionStarted",messageActionChannelMigrateFrom:"ActionMigrateFromGroup","messageActionPhoneCall.video_in_ok":"ChatList.Service.VideoCall.incoming","messageActionPhoneCall.video_out_ok":"ChatList.Service.VideoCall.outgoing","messageActionPhoneCall.video_missed":"ChatList.Service.VideoCall.Missed","messageActionPhoneCall.video_cancelled":"ChatList.Service.VideoCall.Cancelled","messageActionPhoneCall.in_ok":"ChatList.Service.Call.incoming","messageActionPhoneCall.out_ok":"ChatList.Service.Call.outgoing","messageActionPhoneCall.missed":"ChatList.Service.Call.Missed","messageActionPhoneCall.cancelled":"ChatList.Service.Call.Cancelled","messageActionGroupCall.started":"Chat.Service.VoiceChatStarted.Channel","messageActionGroupCall.started_by":"Chat.Service.VoiceChatStarted","messageActionGroupCall.started_byYou":"Chat.Service.VoiceChatStartedYou","messageActionGroupCall.ended":"Chat.Service.VoiceChatFinished.Channel","messageActionGroupCall.ended_by":"Chat.Service.VoiceChatFinished","messageActionGroupCall.ended_byYou":"Chat.Service.VoiceChatFinishedYou",messageActionBotAllowed:"Chat.Service.BotPermissionAllowed"},p=a.IS_MOBILE?"Message.Unsupported.Mobile":"Message.Unsupported.Desktop";var f;!function(e){let t,a;function m(t){e.lastRequestedLangCode=t,e.lastRequestedNormalizedLangCode=t.split("-")[0]}function p(){if("h12"===e.timeFormat)try{const t=A({hour:"numeric",minute:"numeric",hour12:!0}),n=new Date;n.setHours(0);const s=t.format(n);e.amPmCache.am=s.split(/\s/)[1],n.setHours(12);const i=t.format(n);e.amPmCache.pm=i.split(/\s/)[1]}catch(t){console.error("cannot get am/pm",t),e.amPmCache={am:"AM",pm:"PM"}}}function f(){const e=o.Z.langPackCode;return m(e),Promise.all([n.e(104).then(n.bind(n,9104)),n.e(301).then(n.bind(n,9301)),n.e(8).then(n.bind(n,9179))]).then((([t,n,s])=>{const i=[];return b(t.default,i),b(n.default,i),y({_:"langPackDifference",from_version:0,lang_code:e,strings:i,version:0,local:!0,countries:s.default})}))}function v(t,s){e.requestedServerLanguage=!0;const i=r.Z.managers;return Promise.all([i.apiManager.invokeApiCacheable("langpack.getLangPack",{lang_code:t,lang_pack:"web"}),!1,n.e(104).then(n.bind(n,9104)),n.e(301).then(n.bind(n,9301)),i.apiManager.invokeApiCacheable("help.getCountriesList",{lang_code:t,hash:0}),e.polyfillPromise])}function b(e,t=[]){for(const n in e){const s=e[n];"string"==typeof s?t.push({_:"langPackString",key:n,value:s}):t.push(Object.assign({_:"langPackStringPluralized",key:n},s))}return t}function y(e){return e.appVersion=o.Z.langPackVersion,i.Z.set({langPack:e}).then((()=>(w(e),e)))}function w(n){const s=e.lastRequestedLangCode;if(n.lang_code===s){try{t=new Intl.PluralRules(e.lastRequestedNormalizedLangCode)}catch(n){console.error("pluralRules error",n),t=new Intl.PluralRules(e.lastRequestedNormalizedLangCode.split("-",1)[0])}try{t=new Intl.PluralRules(n.lang_code)}catch(e){console.error("pluralRules error",e),t=new Intl.PluralRules(n.lang_code.split("-",1)[0])}e.strings.clear();for(const t of n.strings)e.strings.set(t.key,t);n.countries&&(e.countriesList.length=0,e.countriesList.push(...n.countries.countries),n.countries.countries.forEach((t=>{if(t.name){const n=t.default_name;e.strings.set(n,{_:"langPackString",key:n,value:t.name})}}))),e.lastAppliedLangCode!==s&&(r.Z.dispatchEvent("language_change",s),e.lastAppliedLangCode=s,E.clear(),p()),Array.from(document.querySelectorAll(".i18n")).forEach((t=>{const n=e.weakMap.get(t);n&&n.update()}))}}function S(e,t,n={i:0}){const s=[];let i=0;return e.replace(/(\*\*|__)(.+?)\1|(\n)|(\[.+?\]\(.*?\))|un\d|%\d\$.|%./g,((e,o,r,a,c,l,d)=>{if(s.push(d.slice(i,l)),o){let e;switch(o){case"**":e=document.createElement("b");break;case"__":e=document.createElement("i")}e.append(...S(r,t,n)),s.push(e)}else if(a)s.push(document.createElement("br"));else if(c){const e=c.lastIndexOf("]"),i=c.slice(1,e),o=c.slice(e+2,c.length-1);let r;if(o&&(0,h.Z)(o)){r=document.createElement("a");const e=(0,u.Z)(o);r.href=e.url,e.onclick&&r.setAttribute("onclick",e.onclick),r.target="_blank"}else r=t[n.i++],r instanceof DocumentFragment&&(r=r.firstChild),r.textContent="";r.append(...S(i,t,n)),s.push(r)}else t&&function(e,t,n){const s=t[n.i++];Array.isArray(s)?e.push(...s):e.push(s)}(s,t,n);return i=l+e.length,""})),i!==e.length&&s.push(e.slice(i)),s}function k(n,s=!1,i){const o=e.strings.get(n);let r;if(o)if("langPackStringPluralized"===o._&&(null==i?void 0:i.length)){let e=i[0];"string"==typeof e&&(e=+e.replace(/\D/g,"")),r=o[t.select(e)+"_value"]||o.other_value}else r="langPackString"===o._?o.value:n;else r=n;const a=S(r,i);return s?a.map((e=>e instanceof Node?e.textContent:e)).join(""):a}e.strings=new Map,e.countriesList=[],e.requestedServerLanguage=!1,e.isRTL=!1,e.setRTL=function(t){e.isRTL=t},e.getCacheLangPack=function(){return a||(a=Promise.all([i.Z.get("langPack"),e.polyfillPromise]).then((([t])=>t?(s.ZP,e.lastRequestedLangCode||m(t.lang_code),w(t),t):f())).finally((()=>{a=void 0})))},e.setTimeFormat=function(t,n=!!e.timeFormat&&e.timeFormat!==t){e.timeFormat=t,p(),n&&(E.clear(),Array.from(document.querySelectorAll(".i18n")).forEach((t=>{const n=e.weakMap.get(t);n instanceof Z&&n.update()})))},e.loadLocalLangPack=f,e.loadLangPack=v,e.getStrings=function(e,t){return r.Z.managers.apiManager.invokeApi("langpack.getStrings",{lang_pack:o.Z.langPack,lang_code:e,keys:t})},e.formatLocalStrings=b,e.getLangPack=function(e,t){return m(e),v(e).then((([e,t,n,s,i,o])=>{let r=[];return[n,s].forEach((e=>{b(e.default,r)})),r=r.concat(...[e.strings,t.strings].filter(Boolean)),e.strings=r,e.countries=i,y(e)}))},e.saveLangPack=y,e.polyfillPromise="undefined"!=typeof Intl&&void 0!==Intl.PluralRules?Promise.resolve():n.e(642).then(n.bind(n,4642)).then((e=>{window.Intl=Object.assign("undefined"!=typeof Intl?Intl:{},e.default)})),e.applyLangPack=w,e.superFormatter=S,e.format=k,e.weakMap=new WeakMap;class P{constructor(t){this.element=(null==t?void 0:t.element)||document.createElement("span"),this.element.classList.add("i18n"),this.property=null==t?void 0:t.property,t&&(t.key||t.date)&&this.update(t),e.weakMap.set(this.element,this)}}class _ extends P{constructor(e={}){var t;super(Object.assign(Object.assign({},e),{property:null!==(t=e.property)&&void 0!==t?t:"innerHTML"}))}update(e){if((0,l.Z)(this,e),"innerHTML"===this.property)this.element.textContent="",this.element.append(...k(this.key,!1,this.args));else{const e=this.element[this.property],t=k(this.key,!0,this.args);void 0===e?this.element.dataset[this.property]=t:this.element[this.property]=t}}compareAndUpdate(e){if(this.key!==e.key||!(0,c.Z)(this.args,e.args))return this.update(e)}}e.IntlElement=_;const E=new Map;function A(t={}){const n=JSON.stringify(t);let s=E.get(n);return s||(s=new Intl.DateTimeFormat(e.lastRequestedNormalizedLangCode+"-u-hc-"+e.timeFormat,t),E.set(n,s)),s}e.amPmCache={am:"AM",pm:"PM"};class Z extends P{constructor(e){var t;super(Object.assign(Object.assign({},e),{property:null!==(t=e.property)&&void 0!==t?t:"textContent"})),(0,g.m)(this.element)}update(t){let n;if((0,l.Z)(this,t),this.options.hour&&this.options.minute&&2===Object.keys(this.options).length){const t=this.date.getHours();n=("0"+("h12"===e.timeFormat?t%12||12:t)).slice(-2)+":"+("0"+this.date.getMinutes()).slice(-2),"h12"===e.timeFormat&&(n+=" "+(t<12?e.amPmCache.am:e.amPmCache.pm))}else{const e=A(this.options);n=(0,d.Z)(e.format(this.date))}this.element[this.property]=n}}e.IntlDateElement=Z,e.i18n=function(e,t){return new _({key:e,args:t}).element},e.i18n_=function(e){return new _(e).element},e._i18n=function(e,t,n,s){return new _({element:e,key:t,args:n,property:s}).element}}(f||(f={}));const v=f,b=f.i18n,y=f.i18n_,w=f._i18n;function S(e,t){const n=e.slice(0,1);for(let s=1;s{const s=e&&t?"AutoDownloadSettings.LastDelimeter":"AutoDownloadSettings.Delimeter";return n?f.format(s,!0):b(s)}));return n?s.join(""):s}s.GO.I18n=f},1507:(e,t,n)=>{n.d(t,{BP:()=>u,BX:()=>m,DZ:()=>v,IA:()=>o,Iw:()=>l,J$:()=>p,NM:()=>s,OS:()=>h,Ox:()=>g,Pt:()=>d,Zi:()=>f,gZ:()=>c,hj:()=>i,rU:()=>a,yF:()=>r});const s=0,i=1271266957,o=777,r=777e3,a=2147483647,c="",l=20971520,d="",h=[7322096,16766590,13338331,9367192,16749490,16478047],u="default_static",g=4295032831,m=new Set(["web","k","z"]),p=0,f=1,v=new Set([p,f]);Math.max(...Array.from(v))},3855:(e,t,n)=>{n.d(t,{Z:()=>se});var s=n(3512),i=n(7730),o=n(410),r=n(7487),a=n(6702),c=n(1722),l=n(2831),d=n(5418),h=n(993),u=n(7328),g=n(6663),m=n(9976),p=n(3731),f=n(6818),v=n(1174),b=n(2341),y=n(9030),w=n(2365),S=n(2820),k=n(5432),P=n(2131),_=n(554),E=n(393),A=n(5269),Z=n(4089),C=n(4762),I=n(5783),L=n(2045),T=n(8189);const O=Object.assign({CAN_USE_TRANSFERABLES:u.Z,IS_APPLE_MX:T.Z,IS_CALL_SUPPORTED:h.Z,IS_CANVAS_FILTER_SUPPORTED:g.Z,IS_EMOJI_SUPPORTED:m.Z,IS_GEOLOCATION_SUPPORTED:p.Z,IS_GROUP_CALL_SUPPORTED:f.Z,IS_MOV_SUPPORTED:y.Z,IS_PARALLAX_SUPPORTED:w.Z,IS_SCREEN_SHARING_SUPPORTED:S.Z,IS_TOUCH_SUPPORTED:k.Z,IS_VIBRATE_SUPPORTED:P.Z,IS_OPUS_SUPPORTED:I.Z,IS_SHARED_WORKER_SUPPORTED:L.Z,IS_WEBM_SUPPORTED:E.Z,IS_WEBP_SUPPORTED:A.Z,IS_WEBRTC_SUPPORTED:Z.Z,IMAGE_MIME_TYPES_SUPPORTED:v.Z,MEDIA_MIME_TYPES_SUPPORTED:b.Z,VIDEO_MIME_TYPES_SUPPORTED:_.Z},C);var M=n(4159),x=n(236),W=n(6009),D=n(8479),R=n(946),N=n(7922),j=n(5466),F=n(5003);const U=x.h.version,B=x.h.build,V=Object.keys(x.h),G=["contactsListCachedTime","stateCreatedTime","maxSeenMsgId","filtersArr"];function $(){return e=this,t=void 0,i=function*(){const e=(0,F.kg)("STATE-LOADER"),t=performance.now(),n=(0,j.$)(e),i=V.map((e=>n(N.Z.get(e),"state "+e))).concat(n(r.Z.get("user_auth"),"auth"),n(r.Z.get("state_id"),"auth"),n(r.Z.get("k_build"),"auth")).concat(n(N.Z.get("user_auth"),"old auth")),a=yield Promise.all(i);e.warn("promises",performance.now()-t);const c=[],l=(e,t)=>{d[e]=t,c.push(e)};let d={};for(let e=0,t=V.length;eN.Z.get(e))));e.push("user_auth"),t.push("number"==typeof h||"string"==typeof h?{dcID:t[0]||M.Z.baseDcId,date:Date.now()/1e3|0,id:h.toPeerId(!1)}:h);const n={};e.forEach(((e,s)=>{n[e]=t[s]})),yield r.Z.set(n)}h&&(d.authState={_:"authStateSignedIn"},s.Z.dispatchEvent("user_auth","number"==typeof h||"string"==typeof h?{dcID:0,date:Date.now()/1e3|0,id:h.toPeerId(!1)}:h));const p=new Set;if(d.stateId!==u){if(void 0!==u){const e=new Map([["authState",void 0],["stateId",void 0]]);e.forEach(((t,n)=>{e.set(n,(0,D.Z)(d[n]))})),d=(0,D.Z)(x.h),e.forEach(((e,t)=>{d[t]=e}));const t={chats:1,dialogs:1,users:1};for(const e in t)p.add(e);f=d,c.length=0,d=f,c.push(...Object.keys(d))}yield r.Z.set({state_id:d.stateId})}var f;const v=Date.now();d.stateCreatedTime+864e5{l(e,(0,D.Z)(x.h[e]))})));const b=d.settings.autoDownload;if(void 0!==(null==b?void 0:b.private)){const e=["contacts","private","groups","channels"];["photo","video","file"].forEach((t=>{const n=b[t]={};e.forEach((e=>{n[e]=b[e]}))})),e.forEach((e=>{delete b[e]})),l("settings",d.settings)}const y=new Set(["settings.themes"]);let w,S;if((0,R.Z)(x.h,d,(e=>{l(e,d[e])}),void 0,y),d.version!==U||d.build!==B){if(d.build<217&&(d.allDialogsLoaded=(0,D.Z)(x.h.allDialogsLoaded),d.pinnedOrders=(0,D.Z)(x.h.pinnedOrders),d.filtersArr=(0,D.Z)(x.h.filtersArr),p.add("dialogs")),-1===(0,W.Z)(d.version,"1.7.1")){let e=!1;if(-1===(0,W.Z)(d.version,"1.3.0"))e=!0,d.settings.theme=(0,D.Z)(x.h.settings.theme),d.settings.themes=(0,D.Z)(x.h.settings.themes);else if(-1===(0,W.Z)(d.version,"1.7.1")){e=!0;const t=d.settings.themes;d.settings.themes=(0,D.Z)(x.h.settings.themes);try{t.forEach((e=>{const t=e.background;if(!t)return;const n=d.settings.themes.find((t=>t.name===e.name));n.settings.highlightningColor=t.highlightningColor;const s=(t.color||"").split(",").map((e=>e&&parseInt(e.slice(1),16)));if(t.color&&!t.slug)n.settings.wallpaper={_:"wallPaperNoFile",id:0,pFlags:{},settings:{_:"wallPaperSettings",pFlags:{}}};else{const e={_:"wallPaper",id:0,access_hash:0,slug:t.slug,document:{},pFlags:{},settings:{_:"wallPaperSettings",pFlags:{}}},s=e.settings;n.settings.wallpaper=e,t.slug&&!t.color?s.pFlags.blur=t.blur||void 0:t.intensity&&(s.intensity=t.intensity,e.pFlags.pattern=!0,e.pFlags.dark=t.intensity<0||void 0)}if(s.length){const e=n.settings.wallpaper.settings;e.background_color=s[0],e.second_background_color=s[1],e.third_background_color=s[2],e.fourth_background_color=s[3]}}))}catch(e){console.error("migrating themes error",e)}}e&&l("settings",d.settings)}0!==(0,W.Z)(d.version,U)&&(w=U,S=d.version),l("version",U),l("build",B)}return g!==B&&(!g||g{var t,n;const{name:s,key:i,value:o}=e;if(!e.hasOwnProperty("key"))return void(this.mirrors[s]=o);const r=null!==(t=(n=this.mirrors)[s])&&void 0!==t?t:n[s]={};void 0===o?delete r[i]:r[i]=o},this.mirrors={},this.tabState={chatPeerIds:[],idleStartTime:0},this.log("constructor"),this.registerWorker(),this.registerServiceWorker(),this.registerCryptoWorker(),this.addMultipleEventsListeners({convertWebp:({fileName:e,bytes:t})=>i.Z.convert(e,t),convertOpus:({fileName:e,bytes:t})=>q.Z.pushDecodeTask(t,!1).then((e=>e.bytes)),event:({name:e,args:t})=>{s.Z.dispatchEventSingle(e,...t)},localStorageProxy:e=>{const t=e;return r.Z[t.type](...t.args)},mirror:this.onMirrorTask}),s.Z.addEventListener("language_change",(e=>{s.Z.managers.networkerFactory.setLanguage(e)})),window.addEventListener("online",(()=>{s.Z.managers.networkerFactory.forceReconnectTimeout()})),s.Z.addEventListener("logging_out",(()=>{Promise.all([(0,X.Z)(!1,!0),r.Z.clear(),Promise.race([l.default.setAuthorized(!1),(0,d.Z)(3e3)]),a.default.forceUnsubscribe(),Promise.all(["cachedFiles","cachedStreamChunks"].map((e=>caches.delete(e))))]).finally((()=>{c.Z.reload()}))})),J.Z.addEventListener("change",(e=>{this.updateTabStateIdle(e)})),this.updateTabStateIdle(J.Z.isIdle),this.log("Passing environment:",O),this.invoke("environment",O)}pingServiceWorkerWithIframe(){if(this.pingServiceWorkerPromise)return this.pingServiceWorkerPromise;const e=this.pingServiceWorkerPromise=(0,Q.Z)(),t=document.createElement("iframe");t.hidden=!0;const n=()=>{setTimeout((()=>{this.pingServiceWorkerPromise=void 0}),1e4),clearTimeout(s),t.remove(),t.removeEventListener("load",n),t.removeEventListener("error",n),e.resolve()};t.addEventListener("load",n),t.addEventListener("error",n),t.src="ping/"+(4294967295*Math.random()|0),document.body.append(t);const s=window.setTimeout(n,1e3);return e}attachServiceWorker(e){this.lastServiceWorker&&this.serviceMessagePort.detachPort(this.lastServiceWorker),this.serviceMessagePort.attachSendPort(this.lastServiceWorker=e),this.serviceMessagePort.invokeVoid("hello",void 0)}_registerServiceWorker(){navigator.serviceWorker.register(new URL(n.p+n.u(670),n.b),{scope:"./"}).then((e=>{if(this.log("SW registered",e),e.active&&!navigator.serviceWorker.controller)return e.unregister().then((()=>{window.location.reload()}));(e.installing||e.waiting||e.active).addEventListener("statechange",(e=>{this.log("SW statechange",e)}));const t=navigator.serviceWorker.controller||e.installing||e.waiting||e.active;this.attachServiceWorker(t)}),(e=>{this.log.error("SW registration failed!",e),this.invokeVoid("serviceWorkerOnline",!1)}))}registerServiceWorker(){if(!("serviceWorker"in navigator))return;this.serviceMessagePort=new K.Z;const e=navigator.serviceWorker;this._registerServiceWorker(),e.addEventListener("controllerchange",(()=>{this.log.warn("controllerchange");const t=e.controller;this.attachServiceWorker(t),t.addEventListener("error",(e=>{this.log.error("controller error:",e)}))})),this.serviceMessagePort.attachListenPort(e),this.serviceMessagePort.addMultipleEventsListeners({port:(e,t,n)=>{this.invokeVoid("serviceWorkerPort",void 0,void 0,[n.ports[0]])},hello:(e,t)=>{this.serviceMessagePort.resendLockTask(t)},share:e=>{this.log("will try to share something"),this.share=e}}),e.addEventListener("messageerror",(e=>{this.log.error("SW messageerror:",e)}))}registerCryptoWorker(){return ee(this,void 0,void 0,(function*(){const e={construct:(e,t)=>({url:t[0]+location.search})},t=[Worker,"undefined"!=typeof SharedWorker&&SharedWorker].filter(Boolean);t.forEach((t=>window[t.name]=new Proxy(t,e)));const s=new Worker(new URL(n.p+n.u(589),n.b),{type:void 0});t.forEach((e=>window[e.name]=e));const i=s.url,o=e=>new a(e,{type:"module"}),r=e=>this.attachWorkerToPort(e,Y.Z,"crypto"),a=L.Z?SharedWorker:Worker;Y.Z.addEventListener("port",((e,t,n)=>{this.invokeVoid("cryptoPort",void 0,void 0,[n.ports[0]])})),r(o(i));const c=yield(l=i,fetch(l).then((e=>e.text())).then((e=>{const t=location.pathname.split("/");return t[t.length-1]="",e=`\n var originalImportScripts = importScripts; \n importScripts = (url) => {\n console.log('importScripts', url);\n var newUrl = '${location.origin+t.join("/")}' + url.split('/').pop();\n return originalImportScripts(newUrl);\n };\n ${e}`,new Blob([e],{type:"application/javascript"})})));var l;(yield this.invoke("createProxyWorkerURLs",{originalUrl:i,blob:c})).slice(1).map(o).forEach(r)}))}registerWorker(){let e;e=L.Z?new SharedWorker(new URL(n.p+n.u(678),n.b),{type:void 0}):new Worker(new URL(n.p+n.u(678),n.b),{type:void 0}),this.onWorkerFirstMessage(e)}attachWorkerToPort(e,t,n){const s=e.port||e;t.attachPort(s),e.addEventListener("error",(e=>{this.log.error(n,"worker error",e)}))}onWorkerFirstMessage(e){this.log("set webWorker"),this.attachWorkerToPort(e,this,"mtproto")}loadState(){return Promise.all([(null!=z?z:z=$()).then((e=>(this.newVersion=e.newVersion,this.oldVersion=e.oldVersion,this.mirrors.state=e.state,e)))])}sendState(){return this.loadState().then((e=>{const[t]=e;return this.invoke("state",Object.assign(Object.assign({},t),{userId:s.Z.myId.toUserId()})),e}))}invokeCrypto(e,...t){return Y.Z.invokeCrypto(e,...t)}toggleStorages(e,t){return ee(this,void 0,void 0,(function*(){yield(0,X.Z)(e,t),this.invoke("toggleStorages",{enabled:e,clearWrite:t}),this.serviceMessagePort.invokeVoid("toggleStorages",{enabled:e,clearWrite:t})}))}getMirror(e){return ee(this,void 0,void 0,(function*(){return this.mirrors[e]}))}getState(){return this.getMirror("state")}updateTabState(e,t){this.tabState[e]=t,this.invokeVoid("tabState",this.tabState)}updateTabStateIdle(e){this.updateTabState("idleStartTime",e?Date.now():0)}}const ne=new te;o.GO.apiManagerProxy=ne;const se=ne},490:(e,t,n)=>{n.d(t,{Z:()=>f});var s=n(4159),i=n(410),o=n(2219),r=n(2045),a=n(3241),c=n(2586),l=n(5003),d=n(3512),h=n(7487),u=n(3855);const g=r.Z;class m extends a.Z{constructor(){super(!1),this.log=(0,l.kg)("INSTANCE"),this.clearInstance=()=>{this.masterInstance&&!this.deactivated&&(this.log.warn("clear master instance"),h.Z.delete("xt_instance"))},this.checkInstance=(e=c.Z.isIdle)=>{return t=this,n=void 0,o=function*(){if(this.deactivated)return;const t=Date.now(),n={id:this.instanceId,idle:e,time:t},[i,o=s.Z.build]=yield Promise.all([h.Z.get("xt_instance",!1),h.Z.get("k_build",!1)]);if(o>s.Z.build)return this.masterInstance=!1,d.Z.managers.networkerFactory.stopAll(),this.deactivateInstance("version"),void u.Z.toggleStorages(!1,!1);g?h.Z.set({xt_instance:n}):!e||!i||i.id===this.instanceId||i.timethis.deactivateInstance("tabs")),3e4)))},new((i=void 0)||(i=Promise))((function(e,s){function r(e){try{c(o.next(e))}catch(e){s(e)}}function a(e){try{c(o.throw(e))}catch(e){s(e)}}function c(t){var n;t.done?e(t.value):(n=t.value,n instanceof i?n:new i((function(e){e(n)}))).then(r,a)}c((o=o.apply(t,n||[])).next())}));var t,n,i,o},this.log=(0,l.kg)("INSTANCE"),this.instanceId=o.Z}get deactivatedReason(){return this.deactivated}start(){if(this.reset(),!this.started){this.started=!0,c.Z.addEventListener("change",this.checkInstance),setInterval(this.checkInstance,5e3),this.checkInstance();try{document.documentElement.addEventListener("beforeunload",this.clearInstance)}catch(e){}}}reset(){this.masterInstance=!1,this.clearDeactivateTimeout(),this.deactivated=void 0}activateInstance(){this.deactivated&&(this.reset(),this.checkInstance(!1),this.dispatchEvent("activated"))}deactivateInstance(e){this.masterInstance||this.deactivated||(this.log.warn("deactivate",e),this.clearDeactivateTimeout(),this.deactivated=e,this.dispatchEvent("deactivated",e))}clearDeactivateTimeout(){this.deactivateTimeout&&(clearTimeout(this.deactivateTimeout),this.deactivateTimeout=0)}}const p=new m;i.GO&&(i.GO.singleInstance=p);const f=p},2831:(e,t,n)=>{n.r(t),n.d(t,{TelegramMeWebManager:()=>c,default:()=>d});var s=n(4159),i=n(410),o=n(1267),r=n(7298),a=n(7487);class c{constructor(){this.disabled=o.Z.test||!s.Z.domains.includes(location.hostname)}setAuthorized(e){if(!this.disabled)return a.Z.get("tgme_sync").then((t=>{const n=(0,r.Z)(!0);if(e&&(null==t?void 0:t.canRedirect)===e&&t.ts+86400>n)return;a.Z.set({tgme_sync:{canRedirect:e,ts:n}});const i=`_websync_?authed=${e?"1":"0"}&version=${encodeURIComponent(s.Z.version+" "+s.Z.suffix)}`,o=["//telegram.me/"+i,"//t.me/"+i].map((e=>function(e){const t=document.createElement("script"),n=new Promise((e=>{t.onload=t.onerror=()=>{e(t)}}));return t.src=e,document.body.appendChild(t),n}(e).then((e=>{e.remove()}))));return Promise.all(o)}))}}const l=new c;i.GO&&(i.GO.telegramMeWebManager=l);const d=l},6702:(e,t,n)=>{n.r(t),n.d(t,{WebPushApiManager:()=>g,default:()=>p});var s=n(410),i=n(5003),o=n(3855),r=n(2325),a=n(4762),c=n(1722),l=n(8479),d=n(490),h=n(3241),u=n(2790);class g extends h.Z{constructor(){super(!1),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=(0,i.kg)("PM"),this.subscribe=()=>{this.isAvailable&&navigator.serviceWorker.ready.then((e=>{e.pushManager.subscribe({userVisibleOnly:this.userVisibleOnly}).then((e=>{this.isPushEnabled=!0,this.pushSubscriptionNotify("subscribe",e)})).catch((e=>{"denied"===Notification.permission?this.log("Permission for Notifications was denied"):(this.log("Unable to subscribe to push.",e),this.userVisibleOnly||(this.userVisibleOnly=!0,setTimeout(this.subscribe,0)))}))}))},this.isAliveNotify=()=>{if(!this.isAvailable||d.Z.deactivatedReason)return;this.settings.baseUrl=(location.href||"").replace(/#.*$/,"");const e={},t={push_action_mute1d:a.IS_MOBILE?"PushNotification.Action.Mute1d.Mobile":"PushNotification.Action.Mute1d",push_action_settings:a.IS_MOBILE?"PushNotification.Action.Settings.Mobile":"PushNotification.Action.Settings",push_message_nopreview:"PushNotification.Message.NoPreview"};for(const n in t)e[n]=r.ZP.format(t[n],!0);o.Z.serviceMessagePort.invokeVoid("pushPing",{localNotifications:this.localNotificationsAvailable,lang:e,settings:this.settings}),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((e=>{e.pushManager.getSubscription().then((e=>{this.isPushEnabled=!!e,this.pushSubscriptionNotify("init",e)})).catch((e=>{this.log.error("Error during getSubscription()",e)}))}))}unsubscribe(){this.isAvailable&&navigator.serviceWorker.ready.then((e=>{e.pushManager.getSubscription().then((e=>{this.isPushEnabled=!1,e&&(this.pushSubscriptionNotify("unsubscribe",e),setTimeout((()=>{e.unsubscribe().then((e=>{this.isPushEnabled=!1})).catch((e=>{this.log.error("Unsubscription error: ",e)}))}),3e3))})).catch((e=>{this.log.error("Error thrown while unsubscribing from push messaging.",e)}))}))}forceUnsubscribe(){this.isAvailable&&navigator.serviceWorker.ready.then((e=>{e.pushManager.getSubscription().then((e=>{this.log.warn("force unsubscribe",e),e&&e.unsubscribe().then((e=>{this.log.warn("force unsubscribe successful",e),this.isPushEnabled=!1})).catch((e=>{this.log.error("Unsubscription error: ",e)}))})).catch((e=>{this.log.error("Error thrown while unsubscribing from push messaging.",e)}))}))}setSettings(e){this.settings=(0,l.Z)(e),clearTimeout(this.isAliveTO),this.isAliveNotify()}hidePushNotifications(){this.isAvailable&&o.Z.serviceMessagePort.invokeVoid("notificationsClear",void 0)}setUpServiceWorkerChannel(){this.isAvailable&&(o.Z.serviceMessagePort.addEventListener("pushClick",(e=>{d.Z.deactivatedReason?c.Z.reload():this.dispatchEvent("push_notification_click",e)})),navigator.serviceWorker.ready.then(this.isAliveNotify))}pushSubscriptionNotify(e,t){if(t){const n=t.toJSON();if(!(n&&n.endpoint&&n.keys&&n.keys.p256dh&&n.keys.auth))return this.log.warn("Invalid push subscription",n),this.unsubscribe(),this.isAvailable=!1,void this.pushSubscriptionNotify(e);this.log.warn("Push",e,n),this.dispatchEvent("push_"+e,{tokenType:10,tokenValue:JSON.stringify(n)})}else this.log.warn("Push",e,!1),this.dispatchEvent("push_"+e,!1)}ignorePushByMid(e,t){this.isAvailable&&o.Z.serviceMessagePort.invokeVoid("shownNotification",e+"_"+(0,u.Z)(t))}}const m=new g;s.GO&&(s.GO.webPushApiManager=m);const p=m},9043:(e,t,n)=>{n.d(t,{Z:()=>d});var s=n(410),i=n(5783),o=n(4762),r=n(5003),a=n(3855),c=function(e,t,n,s){return new(n||(n=Promise))((function(i,o){function r(e){try{c(s.next(e))}catch(e){o(e)}}function a(e){try{c(s.throw(e))}catch(e){o(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(r,a)}c((s=s.apply(e,t||[])).next())}))};const l=new class{constructor(){this.sampleRate=48e3,this.tasks=[],this.keepAlive=!1,this.log=(0,r.kg)("OPUS",r.v9.Error)}isPlaySupported(){return i.Z}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},o.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},o.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(((n,s)=>{const i={pages:e,withWaveform:t,callback:{resolve:n,reject:s},timeout:0};this.loadWorker(),this.loadWavWorker(),1===this.tasks.push(i)&&this.executeNewTask(i)}))}decode(e,t=!1){return c(this,void 0,void 0,(function*(){return this.pushDecodeTask(e,t).then((e=>c(this,void 0,void 0,(function*(){const t=new Blob([e.bytes],{type:"audio/wav"});return{url:yield a.Z.invoke("createObjectURL",t),waveform:e.waveform}}))))}))}};s.GO.opusDecodeController=l;const d=l},2423:(e,t,n)=>{n.d(t,{$2:()=>u,E:()=>g,Hk:()=>p,QB:()=>m,SC:()=>f,bu:()=>l,it:()=>c,kO:()=>b,tY:()=>v});var s=n(1229);const i="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",o="0-9_"+i,r="["+i+"0-9]",a="((?:https?|ftp)://|mailto:)?",c=a+"(?:"+r+"{1,64}(?::"+r+"{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}|"+r+"["+i+"ยท0-9-]{0,64}(?:\\."+r+"["+i+"ยท0-9-]{0,64}){0,10}(?:\\.(xn--[0-9a-z]{2,16}|["+i+"]{2,24})))(?::\\d{2,5})?(?:/(?:\\S{0,255}[^\\s.;,(\\[\\]{}<>\"'])?)?",l=(new RegExp("^"+a.slice(0,-1),"i"),/^((?:[^\/]+?):\/\/|mailto:)/),d="[a-zA-Z\\d_]{5,32}",h="\\/([a-zA-Z\\d_]{1,32})(?:@("+d+"))?(\\b|$)",u=new RegExp("(^| )(@)("+d+")|("+c+")|(\\n)|("+s.Z+")|(^|[\\s\\(\\]])(#["+o+"]{2,64})|(^|\\s)"+h,"i"),g=/^(([^<>()[\]\\.,;:\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,p={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}"},f={"`":"messageEntityCode","``":"messageEntityPre","**":"messageEntityBold",__:"messageEntityItalic","~~":"messageEntityStrike","_-_":"messageEntityUnderline","||":"messageEntitySpoiler"},v=new Set(["messageEntityEmoji","messageEntityLinebreak","messageEntityCaret"]);for(const e in f)v.add(f[e]);const b=/^\+\d+$/},3591:(e,t,n)=>{n.d(t,{Z:()=>a});var s=n(2423),i=n(410),o=n(6637),r=n(1507);function a(e,t){(0,o.Z)(e)||(e="https://"+e);const n={url:e};let i,a,c,l;if(i=e.match(/^(?:https?:\/\/)?(?:(.+?)\.)?(?:(?:web|k|z)\.)?t(?:elegram)?\.me(?:\/(.+))?/)){const t=new URL(e);let n=i[1];n&&r.BX.has(i[1])&&(n=void 0),n&&(t.pathname=n+("/"===t.pathname?"":t.pathname));const o=t.pathname.slice(1),a=o.split("/");if(a[0]&&"$"===a[0][0]&&a[0].length>1)l="invoice";else if(/^\W/.test(o)&&!s.kO.test(o))l="joinchat";else switch(a[0]){case"joinchat":case"addstickers":case"addemoji":case"voicechat":case"invoice":if(1!==a.length&&!n){l=a[0];break}default:if(a[1]&&a[1].match(/^\d+(?:\?(?:comment|thread)=\d+)?$/)||1===a.length){l="im";break}}}else(a=e.match(/^(?:https?:\/\/)?telesco\.pe\/([^/?]+)\/(\d+)/))?l="im":(c=e.match(/tg:(?:\/\/)?(.+?)(?:\?|$)/))&&(l="tg_"+c[1]);return window[l]||(l=void 0),n.onclick=l,n}i.GO&&(i.GO.wrapUrl=a)},3512:(e,t,n)=>{n.d(t,{Z:()=>d});var s=n(1507),i=n(3241),o=n(410),r=n(3206),a=n(1352);class c extends i.Z{constructor(){super(),this.myId=s.NM,this.connectionStatus={},this.premium=!1,this.addEventListener("user_auth",(({id:e})=>{this.myId=e.toPeerId()})),this.addEventListener("premium_toggle_private",(({isNew:e,isPremium:t})=>{this.premium=t,e||this.dispatchEventSingle("premium_toggle",t)})),this.addEventListener("connection_status_change",(e=>{this.connectionStatus[e.name]=e})),this.dispatchEvent=(e,...t)=>{super.dispatchEvent(e,...t),r.Z.getInstance().invokeVoid("event",{name:e,args:t})},a.kC||this.addEventListener("settings_updated",(({settings:e})=>{this.settings=e}))}getConnectionStatus(){return this.connectionStatus}getPremium(){return this.premium}dispatchEventSingle(...e){super.dispatchEvent(...e)}}const l=new c;o.GO.rootScope=l;const d=l},7730:(e,t,n)=>{n.d(t,{Z:()=>r});var s=n(410),i=n(3725);const o=new class{constructor(){this.convertPromises={}}init(){this.worker=new Worker(new URL(n.p+n.u(61),n.b)),this.worker.addEventListener("message",(e=>{const t=e.data.payload,n=this.convertPromises[t.fileName];n&&(t.bytes?n.resolve(t.bytes):n.reject(),delete this.convertPromises[t.fileName])}))}postMessage(e){this.init&&(this.init(),this.init=null),this.worker.postMessage(e)}convert(e,t){if(this.convertPromises.hasOwnProperty(e))return this.convertPromises[e];const n=(0,i.Z)();return this.postMessage({type:"convertWebp",payload:{fileName:e,bytes:t}}),this.convertPromises[e]=n}};s.GO.webpWorkerController=o;const r=o}},r={};function a(e){var t=r[e];if(void 0!==t)return t.exports;var n=r[e]={exports:{}};return o[e].call(n.exports,n,n.exports,a),n.exports}a.m=o,e=[],a.O=(t,n,s,i)=>{if(!n){var o=1/0;for(d=0;d=i)&&Object.keys(a.O).every((e=>a.O[e](n[c])))?n.splice(c--,1):(r=!1,i0&&e[d-1][2]>i;d--)e[d]=e[d-1];e[d]=[n,s,i]},a.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return a.d(t,{a:t}),t},n=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,a.t=function(e,s){if(1&s&&(e=this(e)),8&s)return e;if("object"==typeof e&&e){if(4&s&&e.__esModule)return e;if(16&s&&"function"==typeof e.then)return e}var i=Object.create(null);a.r(i);var o={};t=t||[null,n({}),n([]),n(n)];for(var r=2&s&&e;"object"==typeof r&&!~t.indexOf(r);r=n(r))Object.getOwnPropertyNames(r).forEach((t=>o[t]=()=>e[t]));return o.default=()=>e,a.d(i,o),i},a.d=(e,t)=>{for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},a.f={},a.e=e=>Promise.all(Object.keys(a.f).reduce(((t,n)=>(a.f[n](e,t),t)),[])),a.u=e=>(({589:"crypto.worker",630:"npm.qr-code-styling",670:"sw",678:"mtproto.worker"}[e]||e)+"."+{8:"93d2f33af815eb0455aa",53:"9088c624bc0da70fcd02",61:"5a1b64b6ed7885fd6d34",63:"7e1f9a4ae86bb873ca6d",77:"b8cf11d2b5dca36479ca",104:"476c2f411510266c35de",147:"4eb614e56f1d9fbfd1e7",231:"f4d1bfe6ff7f14577f96",301:"95838a8203f23dd1ce8f",339:"12bdbede82465e666965",392:"031f85fcb7cf31c35a88",436:"65389e22546d82aaa8c8",437:"487f9ec608fdb29ab7a0",442:"765ae47d035fd5250820",508:"049a695db07b5a81eb8b",589:"c66e4e0d76fa581af241",630:"f8f57a1c721e03c3f699",641:"e29a883ff173169e88cd",642:"be93122d1116ecdc9322",670:"c55ec44ab819870d4ac4",678:"5211e33b3f0c47c582c8",684:"c02f8f5d69deae872060",709:"9186b58006e0c80f1e5f",776:"01d9a0f7f70d71de2d79",781:"decdb6e23f9d404a1931",783:"949e247466ad3ebe82d6",810:"58611e718b4eafec6685",813:"315ffd640c7d6013a536"}[e]+".chunk.js"),a.miniCssF=e=>{},a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),s={},i="tweb:",a.l=(e,t,n,o)=>{if(s[e])s[e].push(t);else{var r,c;if(void 0!==n)for(var l=document.getElementsByTagName("script"),d=0;d{r.onerror=r.onload=null,clearTimeout(g);var i=s[e];if(delete s[e],r.parentNode&&r.parentNode.removeChild(r),i&&i.forEach((e=>e(n))),t)return t(n)},g=setTimeout(u.bind(null,void 0,{type:"timeout",target:r}),12e4);r.onerror=u.bind(null,r.onerror),r.onload=u.bind(null,r.onload),c&&document.head.appendChild(r)}},a.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e;a.g.importScripts&&(e=a.g.location+"");var t=a.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var n=t.getElementsByTagName("script");n.length&&(e=n[n.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),a.p=e})(),(()=>{if(void 0!==a){var e=a.u,t=a.e,n={},s={};a.u=function(t){return e(t)+(n.hasOwnProperty(t)?"?"+n[t]:"")},a.e=function(i){return t(i).catch((function(t){var o=s.hasOwnProperty(i)?s[i]:999999;if(o<1){var r=e(i);throw t.message="Loading chunk "+i+" failed after 999999 retries.\n("+r+")",t.request=r,t}return new Promise((function(e){setTimeout((function(){var t=Date.now();n[i]=t,s[i]=o-1,e(a.e(i))}),3e3)}))}))}}})(),(()=>{a.b=document.baseURI||self.location.href;var e={179:0};a.f.j=(t,n)=>{var s=a.o(e,t)?e[t]:void 0;if(0!==s)if(s)n.push(s[2]);else{var i=new Promise(((n,i)=>s=e[t]=[n,i]));n.push(s[2]=i);var o=a.p+a.u(t),r=new Error;a.l(o,(n=>{if(a.o(e,t)&&(0!==(s=e[t])&&(e[t]=void 0),s)){var i=n&&("load"===n.type?"missing":n.type),o=n&&n.target&&n.target.src;r.message="Loading chunk "+t+" failed.\n("+i+": "+o+")",r.name="ChunkLoadError",r.type=i,r.request=o,s[1](r)}}),"chunk-"+t,t)}},a.O.j=t=>0===e[t];var t=(t,n)=>{var s,i,[o,r,c]=n,l=0;if(o.some((t=>0!==e[t]))){for(s in r)a.o(r,s)&&(a.m[s]=r[s]);if(c)var d=c(a)}for(t&&t(n);la(2938)));c=a.O(c)})(); +//# sourceMappingURL=main.5f90a31fa81da70d8bc4.bundle.js.map \ No newline at end of file diff --git a/public/main.5f90a31fa81da70d8bc4.bundle.js.map b/public/main.5f90a31fa81da70d8bc4.bundle.js.map new file mode 100644 index 00000000..3174bbc4 --- /dev/null +++ b/public/main.5f90a31fa81da70d8bc4.bundle.js.map @@ -0,0 +1 @@ +{"version":3,"file":"main.5f90a31fa81da70d8bc4.bundle.js","mappings":"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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/create fake namespace object","webpack://tweb/webpack/runtime/load script","webpack://tweb/./src/config/debug.ts","webpack://tweb/./src/config/state.ts","webpack://tweb/./src/helpers/getTimeFormat.ts","webpack://tweb/./src/environment/appleMx.ts","webpack://tweb/./src/environment/callSupport.ts","webpack://tweb/./src/environment/canUseTransferables.ts","webpack://tweb/./src/environment/canvasFilterSupport.ts","webpack://tweb/./src/environment/emojiSupport.ts","webpack://tweb/./src/environment/geolocationSupport.ts","webpack://tweb/./src/environment/groupCallSupport.ts","webpack://tweb/./src/environment/imageMimeTypesSupport.ts","webpack://tweb/./src/environment/mediaMimeTypesSupport.ts","webpack://tweb/./src/environment/movSupport.ts","webpack://tweb/./src/environment/opusSupport.ts","webpack://tweb/./src/environment/parallaxSupport.ts","webpack://tweb/./src/environment/screenSharingSupport.ts","webpack://tweb/./src/environment/sharedWorkerSupport.ts","webpack://tweb/./src/environment/touchSupport.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/environment/vibrateSupport.ts","webpack://tweb/./src/environment/videoMimeTypesSupport.ts","webpack://tweb/./src/environment/webmSupport.ts","webpack://tweb/./src/environment/webpSupport.ts","webpack://tweb/./src/environment/webrtcSupport.ts","webpack://tweb/./src/helpers/color.ts","webpack://tweb/./src/helpers/compareVersion.ts","webpack://tweb/./src/helpers/dom/blurActiveElement.ts","webpack://tweb/./src/helpers/dom/cancelEvent.ts","webpack://tweb/./src/helpers/dom/findUpClassName.ts","webpack://tweb/./src/helpers/dom/fixSafariStickyInput.ts","webpack://tweb/./src/helpers/dom/fixSafariStickyInputFocusing.ts","webpack://tweb/./src/helpers/dom/installPrompt.ts","webpack://tweb/./src/helpers/dom/loadFonts.ts","webpack://tweb/./src/helpers/dom/setInnerHTML.ts","webpack://tweb/./src/helpers/idleController.ts","webpack://tweb/./src/helpers/number/clamp.ts","webpack://tweb/./src/helpers/overlayCounter.ts","webpack://tweb/./src/helpers/schedulers.ts","webpack://tweb/./src/helpers/string/parseUriParams.ts","webpack://tweb/./src/helpers/themeController.ts","webpack://tweb/./src/helpers/setWorkerProxy.ts","webpack://tweb/./src/environment/installPrompt.ts","webpack://tweb/./src/index.ts","webpack://tweb/./src/helpers/dom/toggleAttributePolyfill.ts","webpack://tweb/./src/lib/appManagers/appRuntimeManager.ts","webpack://tweb/./src/lib/appManagers/getProxiedManagers.ts","webpack://tweb/./src/lib/files/idb.ts","webpack://tweb/./src/lib/langPack.ts","webpack://tweb/./src/lib/mtproto/mtproto_config.ts","webpack://tweb/./src/environment/index.ts","webpack://tweb/./src/lib/appManagers/utils/state/loadState.ts","webpack://tweb/./src/lib/mtproto/mtprotoworker.ts","webpack://tweb/./src/lib/mtproto/singleInstance.ts","webpack://tweb/./src/lib/mtproto/telegramMeWebManager.ts","webpack://tweb/./src/helpers/dom/loadScript.ts","webpack://tweb/./src/lib/mtproto/webPushApiManager.ts","webpack://tweb/./src/lib/opusDecodeController.ts","webpack://tweb/./src/lib/richTextProcessor/index.ts","webpack://tweb/./src/lib/richTextProcessor/wrapUrl.ts","webpack://tweb/./src/lib/rootScope.ts","webpack://tweb/./src/lib/webp/webpWorkerController.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/compat get default export","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/make namespace object","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/jsonp chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"tweb:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t};\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","/*\n * 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 './modes';\n\nexport const IS_BETA = process.env.NODE_ENV !== 'production';\nexport const DEBUG = (IS_BETA || Modes.debug)/* && false */;\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\nexport default DEBUG;\n\n// let m = DEBUG;\n/* if(!DEBUG) {\n ctx.sandpitTurtle = () => {\n //if(!m) {\n for(let i in MOUNT_CLASS_TO) {\n ctx[i] = MOUNT_CLASS_TO[i];\n }\n //m = true;\n //}\n\n //DEBUG = !DEBUG;\n };\n} */\n\n/* export const superDebug = (object: any, key: string) => {\n var d = object[key];\n var beforeStr = '', afterStr = '';\n for(var r of d) {\n beforeStr += r.before.hex + '\\n';\n afterStr += r.after.hex + '\\n';\n }\n\n beforeStr = beforeStr.trim();\n afterStr = afterStr.trim();\n //var beforeStr = d.map((r) => r.before.hex).join('\\n');\n //var afterStr = d.map((r) => r.after.hex).join('\\n');\n\n var dada = (name: string, str: string) => {\n var a = document.createElement('a');\n a.target = '_blank';\n a.download = name + '.txt';\n a.href = URL.createObjectURL(new Blob([str], {\n type: 'text/plain'\n }));\n document.body.append(a);\n a.click();\n };\n\n dada(key + '_' + 'before', beforeStr);\n dada(key + '_' + 'after', afterStr);\n}\n\nMOUNT_CLASS_TO.superDebug = superDebug; */\n","/*\n * 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_MOBILE} from '../environment/userAgent';\nimport getTimeFormat from '../helpers/getTimeFormat';\nimport {nextRandomUint} from '../helpers/random';\nimport {AutoDownloadSettings, BaseTheme, NotifyPeer, PeerNotifySettings, Theme, ThemeSettings, WallPaper} from '../layer';\nimport {TopPeerType, MyTopPeer} from '../lib/appManagers/appUsersManager';\nimport DialogsStorage from '../lib/storages/dialogs';\nimport FiltersStorage from '../lib/storages/filters';\nimport {AuthState, Modify} from '../types';\nimport App from './app';\n\nconst STATE_VERSION = App.version;\nconst BUILD = App.build;\n\n// ! DEPRECATED\nexport type Background = {\n type?: 'color' | 'image' | 'default', // ! DEPRECATED\n blur: boolean,\n highlightningColor?: string,\n color?: string,\n slug?: string, // image slug\n intensity?: number, // pattern intensity\n id: string | number, // wallpaper id\n};\n\nexport type AppTheme = Modify\n}>;\n\nexport type AutoDownloadPeerTypeSettings = {\n contacts: boolean,\n private: boolean,\n groups: boolean,\n channels: boolean\n};\n\nexport type State = {\n allDialogsLoaded: DialogsStorage['allDialogsLoaded'],\n pinnedOrders: DialogsStorage['pinnedOrders'],\n // contactsList: UserId[],\n contactsListCachedTime: number,\n updates: Partial<{\n seq: number,\n pts: number,\n date: number\n }>,\n // filters?: FiltersStorage['filters'], // ! DEPRECATED\n filtersArr?: FiltersStorage['filtersArr'],\n maxSeenMsgId: number,\n stateCreatedTime: number,\n recentEmoji: string[],\n recentCustomEmoji: DocId[],\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, // ! DEPRECATED\n private?: boolean, // ! DEPRECATED\n groups?: boolean, // ! DEPRECATED\n channels?: boolean, // ! DEPRECATED\n photo: AutoDownloadPeerTypeSettings,\n video: AutoDownloadPeerTypeSettings,\n file: AutoDownloadPeerTypeSettings\n },\n autoDownloadNew: AutoDownloadSettings,\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: AppTheme[],\n theme: AppTheme['name'],\n notifications: {\n sound: boolean\n },\n nightTheme?: boolean, // ! DEPRECATED\n timeFormat: 'h12' | 'h23'\n },\n playbackParams: ReturnType,\n keepSigned: boolean,\n chatContextMenuHintWasShown: boolean,\n stateId: number,\n notifySettings: {[k in Exclude]?: PeerNotifySettings.peerNotifySettings}\n};\n\n// const BACKGROUND_DAY_MOBILE: Background = {\n// blur: false,\n// slug: '',\n// color: '#dbddbb,#6ba587,#d5d88d,#88b884',\n// highlightningColor: 'hsla(86.4, 43.846153%, 45.117647%, .4)',\n// intensity: 0,\n// id: '1'\n// };\n\n// const BACKGROUND_NIGHT_MOBILE: Background = {\n// blur: false,\n// slug: '',\n// color: '#0f0f0f',\n// highlightningColor: 'hsla(0, 0%, 3.82353%, 0.4)',\n// intensity: 0,\n// id: '-1'\n// };\n\nexport const DEFAULT_THEME: Theme = {\n _: 'theme',\n access_hash: '',\n id: '',\n settings: [{\n _: 'themeSettings',\n pFlags: {},\n base_theme: {_: 'baseThemeClassic'},\n accent_color: 0x3390ec,\n message_colors: [0x4fae4e],\n wallpaper: {\n _: 'wallPaper',\n pFlags: {\n default: true,\n pattern: true\n },\n access_hash: '',\n document: undefined,\n id: '',\n slug: 'pattern',\n settings: {\n _: 'wallPaperSettings',\n pFlags: {},\n intensity: 50,\n background_color: 0xdbddbb,\n second_background_color: 0x6ba587,\n third_background_color: 0xd5d88d,\n fourth_background_color: 0x88b884\n }\n }\n }, {\n _: 'themeSettings',\n pFlags: {},\n base_theme: {_: 'baseThemeNight'},\n accent_color: 0x8774E1,\n message_colors: [0x8774E1],\n wallpaper: {\n _: 'wallPaper',\n pFlags: {\n default: true,\n pattern: true,\n dark: true\n },\n access_hash: '',\n document: undefined,\n id: '',\n slug: 'pattern',\n settings: {\n _: 'wallPaperSettings',\n pFlags: {},\n intensity: -50,\n background_color: 0xfec496,\n second_background_color: 0xdd6cb9,\n third_background_color: 0x962fbf,\n fourth_background_color: 0x4f5bd5\n }\n }\n }],\n slug: '',\n title: '',\n emoticon: '๐Ÿ ',\n pFlags: {default: true}\n};\n\nconst makeDefaultAppTheme = (\n name: AppTheme['name'],\n baseTheme: BaseTheme['_'],\n highlightningColor: string\n): AppTheme => {\n return {\n ...DEFAULT_THEME,\n name,\n settings: {\n ...DEFAULT_THEME.settings.find((s) => s.base_theme._ === baseTheme),\n highlightningColor\n }\n };\n};\n\nexport const STATE_INIT: State = {\n allDialogsLoaded: {},\n pinnedOrders: {},\n // contactsList: [],\n contactsListCachedTime: 0,\n updates: {},\n filtersArr: [],\n maxSeenMsgId: 0,\n stateCreatedTime: Date.now(),\n recentEmoji: [],\n recentCustomEmoji: [],\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 photo: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n },\n video: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n },\n file: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n }\n },\n autoDownloadNew: {\n _: 'autoDownloadSettings',\n file_size_max: 3145728,\n pFlags: {\n video_preload_large: true,\n audio_preload_next: true\n },\n photo_size_max: 1048576,\n video_size_max: 15728640,\n video_upload_maxbitrate: 100\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 makeDefaultAppTheme('day', 'baseThemeClassic', 'hsla(86.4, 43.846153%, 45.117647%, .4)'),\n makeDefaultAppTheme('night', 'baseThemeNight', 'hsla(299.142857, 44.166666%, 37.470588%, .4)')\n ],\n theme: 'system',\n notifications: {\n sound: false\n },\n timeFormat: getTimeFormat()\n },\n playbackParams: {\n volume: 1,\n muted: false,\n playbackRate: 1,\n playbackRates: {\n voice: 1,\n video: 1,\n audio: 1\n },\n loop: false,\n round: false\n },\n keepSigned: true,\n chatContextMenuHintWasShown: false,\n stateId: nextRandomUint(32),\n notifySettings: {}\n};\n","export default function getTimeFormat(): 'h12' | 'h23' {\n // try {\n // const resolvedOptions = Intl.DateTimeFormat(navigator.language, {hour: 'numeric'}).resolvedOptions();\n // if('hourCycle' in resolvedOptions) {\n // return (resolvedOptions as any).hourCycle === 'h12' ? 'h12' : 'h23';\n // } else {\n // return resolvedOptions.hour12 ? 'h12' : 'h23';\n // }\n // } catch(err) {\n return new Date().toLocaleString().match(/\\s(AM|PM)/) ? 'h12' : 'h23';\n // }\n}\n","let IS_APPLE_MX = false;\n\ntry {\n // Awesome detect from https://stackoverflow.com/a/65412357\n const ctx = document.createElement('canvas').getContext('webgl');\n const extension = ctx.getExtension('WEBGL_debug_renderer_info');\n const renderer: string = extension && ctx.getParameter(extension.UNMASKED_RENDERER_WEBGL) || '';\n if((renderer.match(/Apple/) && !renderer.match(/Apple GPU/)) ||\n ctx.getSupportedExtensions().indexOf('WEBGL_compressed_texture_s3tc_srgb') === -1) {\n IS_APPLE_MX = true;\n }\n} catch(err) {\n\n}\n\nexport default IS_APPLE_MX;\n","import IS_WEBRTC_SUPPORTED from './webrtcSupport';\n\nconst IS_CALL_SUPPORTED = IS_WEBRTC_SUPPORTED;\n\nexport default IS_CALL_SUPPORTED;\n","import {IS_SAFARI} from './userAgent';\n\n/*\n * This is used as a workaround for a memory leak in Safari caused by using Transferable objects to\n * transfer data between WebWorkers and the main thread.\n * https://github.com/mapbox/mapbox-gl-js/issues/8771\n *\n * This should be removed once the underlying Safari issue is fixed.\n */\n\nlet CAN_USE_TRANSFERABLES: boolean;\nif(!IS_SAFARI) CAN_USE_TRANSFERABLES = true;\nelse {\n try {\n const match = navigator.userAgent.match(/Version\\/(.+?) /);\n CAN_USE_TRANSFERABLES = +match[1] >= 14;\n } catch(err) {\n CAN_USE_TRANSFERABLES = false;\n }\n}\n\nexport default CAN_USE_TRANSFERABLES;\n","const IS_CANVAS_FILTER_SUPPORTED = 'filter' in (document.createElement('canvas').getContext('2d') || {});\n\nexport default IS_CANVAS_FILTER_SUPPORTED;\n","const IS_EMOJI_SUPPORTED = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1/* && false *//* || true */;\n\nexport default IS_EMOJI_SUPPORTED;\n","const IS_GEOLOCATION_SUPPORTED = !!navigator?.geolocation?.getCurrentPosition && false;\n\nexport default IS_GEOLOCATION_SUPPORTED;\n","import IS_WEBRTC_SUPPORTED from './webrtcSupport';\n\nconst IS_GROUP_CALL_SUPPORTED = IS_WEBRTC_SUPPORTED;\n\nexport default IS_GROUP_CALL_SUPPORTED;\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","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","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","const audio = document.createElement('audio');\nconst IS_OPUS_SUPPORTED = !!(audio.canPlayType && audio.canPlayType('audio/ogg;').replace(/no/, ''))/* && false */;\n\nexport default IS_OPUS_SUPPORTED;\n","import {IS_FIREFOX} from './userAgent';\n\nconst IS_PARALLAX_SUPPORTED = !IS_FIREFOX && false;\n\nexport default IS_PARALLAX_SUPPORTED;\n","const IS_SCREEN_SHARING_SUPPORTED = !!('getDisplayMedia' in (navigator?.mediaDevices || {}));\n\nexport default IS_SCREEN_SHARING_SUPPORTED;\n","import Modes from '../config/modes';\n\nconst IS_SHARED_WORKER_SUPPORTED = typeof(SharedWorker) !== 'undefined' && !Modes.noSharedWorker/* && false */;\n\nexport default IS_SHARED_WORKER_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\n// @ts-ignore\nconst IS_TOUCH_SUPPORTED = ('ontouchstart' in window) || (window.DocumentTouch && document instanceof DocumentTouch)/* || true */;\nexport default IS_TOUCH_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 ctx from './ctx';\n\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\n\n// https://stackoverflow.com/a/58065241\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\n !(ctx as any).MSStream;\n\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 */;\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\n\nexport const IS_MOBILE = (navigator.maxTouchPoints === undefined || 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;\n","const IS_VIBRATE_SUPPORTED = !!navigator?.vibrate;\n\nexport default IS_VIBRATE_SUPPORTED;\n","import IS_MOV_SUPPORTED from './movSupport';\n\nexport type VIDEO_MIME_TYPE = 'image/gif' | 'video/mp4' | 'video/webm' | 'video/quicktime';\nconst VIDEO_MIME_TYPES_SUPPORTED: Set = 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 {IS_APPLE_MOBILE, IS_SAFARI} from './userAgent';\n\nconst IS_WEBM_SUPPORTED = !!document.createElement('video').canPlayType('video/webm') && !IS_SAFARI && !IS_APPLE_MOBILE;\n\nexport default IS_WEBM_SUPPORTED;\n","const IS_WEBP_SUPPORTED = document.createElement('canvas').toDataURL('image/webp').startsWith('data:image/webp');\n\nexport default IS_WEBP_SUPPORTED;\n","import {IS_FIREFOX} from './userAgent';\n\nconst IS_WEBRTC_SUPPORTED = !!(typeof(RTCPeerConnection) !== 'undefined' && !IS_FIREFOX);\n\nexport default IS_WEBRTC_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 {WallPaper} from '../layer';\nimport clamp from './number/clamp';\n\nexport type ColorHsla = {\n h: number,\n s: number,\n l: number,\n a: number\n};\n\nexport type ColorRgba = [number, number, number, number];\nexport type ColorRgb = [number, number, number];\n\n/**\n * https://stackoverflow.com/a/54070620/6758968\n * r, g, b in [0, 255]\n * @returns h in [0,360) and s, v in [0,1]\n */\nexport function rgbToHsv(r: number, g: number, b: number): [number, number, number] {\n r /= 255, g /= 255, b /= 255;\n const v = Math.max(r, g, b),\n c = v - Math.min(r, g, b);\n const h = c && ((v === r) ? (g - b ) / c : ((v == g) ? 2 + (b - r) / c : 4 + (r - g) / c));\n return [60 * (h < 0 ? h + 6 : h), v && c / v, v];\n}\n\n/**\n * https://stackoverflow.com/a/54024653/6758968\n * @param h [0, 360]\n * @param s [0, 1]\n * @param v [0, 1]\n * @returns r, g, b in [0, 255]\n */\nexport function hsvToRgb(h: number, s: number, v: number): ColorRgb {\n const f = (n: number, k: number = (n + h / 60) % 6) => Math.round((v - v * s * Math.max(Math.min(k, 4 - k, 1), 0)) * 255);\n return [f(5), f(3), f(1)];\n}\n\n/**\n * @returns h [0, 360], s [0, 100], l [0, 100], a [0, 1]\n */\nexport function rgbaToHsla(r: number, g: number, b: number, a: number = 1): ColorHsla {\n r /= 255, g /= 255, b /= 255;\n const max = Math.max(r, g, b),\n min = Math.min(r, g, b);\n let h: number, s: number;\n const l = (max + min) / 2;\n\n if(max === min) {\n h = s = 0; // achromatic\n } else {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch(max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n\n return {\n h: h * 360,\n s: s * 100,\n l: l * 100,\n a\n };\n}\n\n// * https://stackoverflow.com/a/9493060/6758968\n/**\n * Converts an HSL color value to RGB. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSL_color_space.\n *\n * @param {number} h The hue [0, 360]\n * @param {number} s The saturation [0, 1]\n * @param {number} l The lightness [0, 1]\n * @return {Array} The RGB representation [0, 255]\n */\nexport function hslaToRgba(h: number, s: number, l: number, a: number): ColorRgba {\n h /= 360, s /= 100, l /= 100;\n let r: number, g: number, b: number;\n\n if(s === 0) {\n r = g = b = l; // achromatic\n } else {\n const hue2rgb = function hue2rgb(p: number, q: number, t: number) {\n if(t < 0) t += 1;\n if(t > 1) t -= 1;\n if(t < 1/6) return p + (q - p) * 6 * t;\n if(t < 1/2) return q;\n if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;\n return p;\n }\n\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r = hue2rgb(p, q, h + 1/3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1/3);\n }\n\n return [r, g, b, a].map((v) => Math.round(v * 255)) as ColorRgba;\n}\n\nexport function hslaStringToRgba(hsla: string) {\n const splitted = hsla.slice(5, -1).split(', ');\n const alpha = +splitted.pop();\n const arr = splitted.map((val) => {\n if(val.endsWith('%')) {\n return +val.slice(0, -1);\n }\n\n return +val;\n });\n\n return hslaToRgba(arr[0], arr[1], arr[2], alpha);\n}\n\nexport function hexaToRgba(hexa: string) {\n const arr: ColorRgba = [] as any;\n const offset = hexa[0] === '#' ? 1 : 0;\n if(hexa.length === (5 + offset)) {\n hexa = (offset ? '#' : '') + '0' + hexa.slice(offset);\n }\n\n if(hexa.length === (3 + offset)) {\n for(let i = offset; i < hexa.length; ++i) {\n arr.push(parseInt(hexa[i] + hexa[i], 16));\n }\n } else if(hexa.length === (4 + offset)) {\n for(let i = offset; i < (hexa.length - 1); ++i) {\n arr.push(parseInt(hexa[i] + hexa[i], 16));\n }\n\n arr.push(parseInt(hexa[hexa.length - 1], 16));\n } else {\n for(let i = offset; i < hexa.length; i += 2) {\n arr.push(parseInt(hexa.slice(i, i + 2), 16));\n }\n }\n\n return arr;\n}\n\nexport function hexToRgb(hex: string) {\n return hexaToRgba(hex.slice(0, 7)) as any as ColorRgb;\n}\n\nexport function hexaToHsla(hexa: string) {\n const rgba = hexaToRgba(hexa);\n return rgbaToHsla(rgba[0], rgba[1], rgba[2], rgba[3]);\n}\n\nexport function rgbaToHexa(rgba: ColorRgba | ColorRgb) {\n return '#' + rgba.map((v) => ('0' + v.toString(16)).slice(-2)).join('');\n}\n\nexport function hslaStringToHexa(hsla: string) {\n return rgbaToHexa(hslaStringToRgba(hsla));\n}\n\nexport function hslaStringToHex(hsla: string) {\n return hslaStringToHexa(hsla).slice(0, -2);\n}\n\n/**\n * @param weight [0, 1]\n */\nexport function mixColors(color1: ColorRgb, color2: ColorRgb, weight: number) {\n const out = new Array(3) as ColorRgb;\n for(let i = 0; i < 3; ++i) {\n const v1 = color1[i], v2 = color2[i];\n out[i] = Math.floor(v2 + (v1 - v2) * weight);\n }\n\n return out;\n}\n\nexport function computePerceivedBrightness(color: ColorRgb) {\n return (color[0] * 0.2126 + color[1] * 0.7152 + color[2] * 0.0722) / 255;\n}\n\nexport function getAverageColor(color1: ColorRgb, color2: ColorRgb): ColorRgb {\n return color1.map((v, i) => Math.round((v + color2[i]) / 2)) as ColorRgb;\n}\n\nexport function getAccentColor(baseHsv: number[], baseColor: ColorRgb, elementColor: ColorRgb): ColorRgb {\n const hsvTemp3 = rgbToHsv(...baseColor);\n const hsvTemp4 = rgbToHsv(...elementColor);\n\n const dist = Math.min(1.5 * hsvTemp3[1] / baseHsv[1], 1);\n\n hsvTemp3[0] = Math.min(360, hsvTemp4[0] - hsvTemp3[0] + baseHsv[0]);\n hsvTemp3[1] = Math.min(1, hsvTemp4[1] * baseHsv[1] / hsvTemp3[1]);\n hsvTemp3[2] = Math.min(1, (hsvTemp4[2] / hsvTemp3[2] + dist - 1) * baseHsv[2] / dist);\n if(hsvTemp3[2] < 0.3) {\n return elementColor;\n }\n return hsvToRgb(...hsvTemp3);\n}\n\nexport function changeColorAccent(baseHsv: number[], accentHsv: number[], color: ColorRgb, isDarkTheme: boolean) {\n const colorHsv = rgbToHsv(...color);\n\n const diffH = Math.min(Math.abs(colorHsv[0] - baseHsv[0]), Math.abs(colorHsv[0] - baseHsv[0] - 360));\n if(diffH > 30) {\n return color;\n }\n\n const dist = Math.min(1.5 * colorHsv[1] / baseHsv[1], 1);\n\n colorHsv[0] = Math.min(360, colorHsv[0] + accentHsv[0] - baseHsv[0]);\n colorHsv[1] = Math.min(1, colorHsv[1] * accentHsv[1] / baseHsv[1]);\n colorHsv[2] = Math.min(1, colorHsv[2] * (1 - dist + dist * accentHsv[2] / baseHsv[2]));\n\n let newColor = hsvToRgb(...colorHsv);\n\n const origBrightness = computePerceivedBrightness(color);\n const newBrightness = computePerceivedBrightness(newColor);\n\n // We need to keep colors lighter in dark themes and darker in light themes\n const needRevertBrightness = isDarkTheme ? origBrightness > newBrightness : origBrightness < newBrightness;\n\n if(needRevertBrightness) {\n const amountOfNew = 0.6;\n const fallbackAmount = (1 - amountOfNew) * origBrightness / newBrightness + amountOfNew;\n newColor = changeBrightness(newColor, fallbackAmount);\n }\n\n return newColor;\n}\n\nexport function changeBrightness(color: ColorRgb, amount: number) {\n return color.map((v) => clamp(Math.round(v * amount), 0, 255)) as ColorRgb;\n}\n\nexport function getHexColorFromTelegramColor(color: number) {\n const hex = (color < 0 ? 0xFFFFFF + color : color).toString(16);\n return '#' + (hex.length >= 6 ? hex : '0'.repeat(6 - hex.length) + hex);\n}\n\nexport function getRgbColorFromTelegramColor(color: number) {\n return hexToRgb(getHexColorFromTelegramColor(color));\n}\n\nexport function getColorsFromWallPaper(wallPaper: WallPaper) {\n return wallPaper.settings ? [\n wallPaper.settings.background_color,\n wallPaper.settings.second_background_color,\n wallPaper.settings.third_background_color,\n wallPaper.settings.fourth_background_color\n ].filter(Boolean).map(getHexColorFromTelegramColor).join(',') : '';\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\nexport default function blurActiveElement() {\n if((document.activeElement as HTMLInputElement)?.blur) {\n (document.activeElement as HTMLInputElement).blur();\n return true;\n }\n\n return false;\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\nexport default function cancelEvent(event?: Event) {\n event ||= window.event;\n if(event) {\n // 'input' event will have cancelable=false, but we still need to preventDefault\n // if(!event.cancelable) {\n // return false;\n // }\n\n // @ts-ignore\n event = event.originalEvent || event;\n\n try {\n if(event.stopPropagation) event.stopPropagation();\n if(event.preventDefault) event.preventDefault();\n event.returnValue = false;\n event.cancelBubble = true;\n } catch(err) {}\n }\n\n return false;\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// export function findUpClassName(el: any, className: string): T;\nexport default function findUpClassName(el: EventTarget | {closest: (selector: string) => any}, className: string): HTMLElement {\n return (el as any).closest('.' + className);\n /* if(el.classList.contains(className)) return el; // 03.02.2020\n\n while(el.parentElement) {\n el = el.parentElement;\n if(el.classList.contains(className))\n return el;\n }\n return null; */\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 {doubleRaf} from '../schedulers';\n\nexport default function fixSafariStickyInput(input: HTMLElement) {\n input.style.transform = 'translateY(-99999px)';\n /* input.style.position = 'fixed';\n input.style.top = '-99999px';\n input.style.left = '0'; */\n input.focus();\n\n // setTimeout(() => {\n doubleRaf().then(() => {\n // fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4, undefined, FocusDirection.Static);\n /* input.style.position = '';\n input.style.top = ''; */\n input.style.transform = '';\n // fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4, undefined, FocusDirection.Static);\n\n /* setTimeout(() => {\n fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4);\n }, 50); */\n });\n // }, 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 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 const 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","let callback: () => Promise;\nexport default function cacheInstallPrompt() {\n window.addEventListener('beforeinstallprompt', (deferredPrompt: any) => {\n callback = async() => {\n deferredPrompt.prompt();\n const {outcome} = await deferredPrompt.userChoice;\n const installed = outcome === 'accepted';\n if(installed) {\n callback = undefined;\n }\n };\n });\n}\n\nexport function getInstallPrompt() {\n return callback;\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 '../noop';\nimport pause from '../schedulers/pause';\n\nconst texts = ['b', 'ะฑ'];\ntype FontType = 'text' | 'icons' | 'monospace';\n\nconst cache: {\n [key: string]: {\n [text: string]: Promise\n }\n} = {};\n\nconst fonts: {[type in FontType]: string} = {\n text: 'Roboto',\n icons: 'tgico',\n monospace: 'Roboto Mono'\n};\n\nexport default function loadFonts(types: {[type in FontType]?: string[] | 'all'} = {\n text: texts,\n icons: undefined,\n monospace: texts\n}): Promise {\n if(!('fonts' in document)) {\n return Promise.resolve();\n }\n\n const promises: Promise[] = [];\n for(const type in types) {\n let _texts = types[type as FontType];\n if(_texts === 'all') {\n _texts = texts;\n }\n\n const font = fonts[type as FontType];\n const weights = type === 'icons' ? [500] : [400, 500];\n for(const weight of weights) {\n const _promises = (_texts || [undefined]).map((text) => {\n const key = [weight, '1rem', font].join(' ');\n const promise = (cache[key] ??= {})[text || ''] ??= document.fonts.load(key, text);\n return promise;\n });\n promises.push(..._promises);\n }\n }\n\n return Promise.race([\n Promise.all(promises).catch(noop),\n pause(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\n// import I18n from '../../lib/langPack';\n\nexport default function setInnerHTML(elem: Element, html: string | DocumentFragment | Element) {\n setDirection(elem);\n if(typeof(html) === 'string') {\n if(!html) elem.replaceChildren();\n else elem.innerHTML = html;\n } else {\n elem.replaceChildren(html);\n }\n}\n\nexport function setDirection(elem: Element) {\n // if(!I18n.isRTL) {\n elem.setAttribute('dir', 'auto');\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_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport EventListenerBase from './eventListenerBase';\n\nconst FOCUS_EVENT_NAME = IS_TOUCH_SUPPORTED ? 'touchstart' : 'mousemove';\nconst DO_NOT_IDLE = false;\n\nexport class IdleController extends EventListenerBase<{\n change: (idle: boolean) => void\n}> {\n private _isIdle: boolean;\n\n private focusPromise: Promise;\n private focusResolve: () => void;\n\n constructor() {\n super();\n\n this._isIdle = true;\n this.focusPromise = Promise.resolve();\n this.focusResolve = () => {};\n\n window.addEventListener('blur', () => {\n this.isIdle = true;\n\n window.addEventListener('focus', () => {\n this.isIdle = false;\n }, {once: true});\n });\n\n // * Prevent setting online after reloading page\n window.addEventListener(FOCUS_EVENT_NAME, () => {\n this.isIdle = false;\n }, {once: true, passive: true});\n\n this.addEventListener('change', (idle) => {\n if(idle) {\n this.focusPromise = new Promise((resolve) => {\n this.focusResolve = resolve;\n });\n } else {\n this.focusResolve();\n }\n });\n }\n\n public getFocusPromise() {\n return this.focusPromise;\n }\n\n public get isIdle() {\n return this._isIdle;\n }\n\n public set isIdle(value: boolean) {\n if(this._isIdle === value) {\n return;\n }\n\n if(DO_NOT_IDLE && value) {\n return;\n }\n\n this._isIdle = value;\n this.dispatchEvent('change', value);\n }\n}\n\nconst idleController = new IdleController();\nexport default idleController;\n","export default function clamp(v: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, v));\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 EventListenerBase from './eventListenerBase';\n\nexport class OverlayCounter extends EventListenerBase<{\n change: (isActive: boolean) => void\n}> {\n public overlaysActive = 0;\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('change', this.isOverlayActive);\n }\n}\n\nconst overlayCounter = new OverlayCounter();\nexport default overlayCounter;\n","/*\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// * Jolly Cobra's schedulers\nimport {NoneToVoidFunction} from '../types';\n\n/*\nexport function throttleWithTickEnd(fn: F) {\n return throttleWith(onTickEnd, fn);\n}\n\nexport function throttleWithNow(fn: F) {\n return throttleWith(runNow, fn);\n}\n\nexport function onTickEnd(cb: NoneToVoidFunction) {\n Promise.resolve().then(cb);\n}\n\nfunction runNow(fn: NoneToVoidFunction) {\n fn();\n} */\n\nlet fastRafCallbacks: NoneToVoidFunction[] | undefined;\nexport function fastRaf(callback: NoneToVoidFunction) {\n if(!fastRafCallbacks) {\n fastRafCallbacks = [callback];\n\n requestAnimationFrame(() => {\n const currentCallbacks = fastRafCallbacks!;\n fastRafCallbacks = undefined;\n currentCallbacks.forEach((cb) => cb());\n });\n } else {\n fastRafCallbacks.push(callback);\n }\n}\n\nlet fastRafConventionalCallbacks: NoneToVoidFunction[] | undefined, processing = false;\nexport function fastRafConventional(callback: NoneToVoidFunction) {\n if(!fastRafConventionalCallbacks) {\n fastRafConventionalCallbacks = [callback];\n\n requestAnimationFrame(() => {\n processing = true;\n for(let i = 0; i < fastRafConventionalCallbacks.length; ++i) {\n fastRafConventionalCallbacks[i]();\n }\n\n fastRafConventionalCallbacks = undefined;\n processing = false;\n });\n } else if(processing) {\n callback();\n } else {\n fastRafConventionalCallbacks.push(callback);\n }\n}\n\nlet rafPromise: Promise;\nexport function fastRafPromise() {\n if(rafPromise) return rafPromise;\n\n rafPromise = new Promise((resolve) => fastRaf(() => resolve()));\n rafPromise.then(() => {\n rafPromise = undefined;\n });\n\n return rafPromise;\n}\n\nexport function doubleRaf() {\n return new Promise((resolve) => {\n fastRaf(() => {\n fastRaf(resolve);\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 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 * 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 {AppTheme} from '../config/state';\nimport type {Theme} from '../layer';\nimport type AppBackgroundTab from '../components/sidebarLeft/tabs/background';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport rootScope from '../lib/rootScope';\nimport {changeColorAccent, ColorRgb, getAccentColor, getAverageColor, getHexColorFromTelegramColor, getRgbColorFromTelegramColor, hexToRgb, hslaStringToHex, hsvToRgb, mixColors, rgbaToHexa, rgbaToHsla, rgbToHsv} from './color';\nimport {MOUNT_CLASS_TO} from '../config/debug';\n\ntype AppColorName = 'primary-color' | 'message-out-primary-color' |\n 'surface-color' | 'danger-color' | 'primary-text-color' |\n 'secondary-text-color' | 'message-out-background-color' |\n 'saved-color';\ntype AppColor = {\n rgb?: boolean,\n light?: boolean,\n lightFilled?: boolean,\n dark?: boolean,\n darkRgb?: boolean,\n darkFilled?: boolean\n};\n\nconst appColorMap: {[name in AppColorName]: AppColor} = {\n 'primary-color': {\n rgb: true,\n light: true,\n lightFilled: true,\n dark: true,\n darkRgb: true\n },\n 'message-out-primary-color': {\n lightFilled: true\n },\n 'surface-color': {\n rgb: true\n },\n 'danger-color': {\n light: true,\n dark: true\n },\n 'primary-text-color': {\n rgb: true\n },\n 'secondary-text-color': {\n light: true,\n lightFilled: true\n },\n 'message-out-background-color': {\n light: true,\n lightFilled: true,\n dark: true,\n darkFilled: true\n },\n 'saved-color': {\n lightFilled: true\n }\n};\n\nconst colorMap: {\n [name in AppTheme['name']]?: {\n [name in AppColorName]?: string\n }\n} = {\n day: {\n 'primary-color': '#3390ec',\n 'message-out-primary-color': '#4fae4e',\n 'surface-color': '#ffffff',\n 'danger-color': '#df3f40',\n 'primary-text-color': '#000000',\n 'secondary-text-color': '#707579',\n 'saved-color': '#359AD4'\n },\n night: {\n 'primary-color': '#8774E1',\n 'message-out-primary-color': '#8774E1',\n 'surface-color': '#212121',\n 'danger-color': '#ff595a',\n 'primary-text-color': '#ffffff',\n 'secondary-text-color': '#aaaaaa',\n 'saved-color': '#8774E1'\n }\n};\n\nexport class ThemeController {\n private themeColor: string;\n private _themeColorElem: Element;\n private systemTheme: AppTheme['name'];\n private styleElement: HTMLStyleElement;\n public AppBackgroundTab: typeof AppBackgroundTab;\n\n constructor() {\n rootScope.addEventListener('theme_change', () => {\n this.setTheme();\n });\n\n // rootScope.addEventListener('settings_updated', ())\n }\n\n private 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(rootScope.myId) {\n rootScope.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 applyHighlightningColor() {\n let hsla: string;\n const theme = this.getTheme();\n if(theme.settings?.highlightningColor) {\n hsla = theme.settings.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 this.themeColor = hslaStringToHex(hsla);\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 const theme = this.getTheme();\n this.applyTheme(theme);\n\n let style = this.styleElement;\n if(!style) {\n style = this.styleElement = document.createElement('style');\n document.head.append(style);\n }\n\n const e = document.createElement('div');\n this.applyTheme(rootScope.settings.themes.find((theme) => theme.name === 'night'), e);\n style.textContent = `.night {${e.style.cssText}}`;\n\n this.applyHighlightningColor();\n }\n\n public async switchTheme(name: AppTheme['name']) {\n await rootScope.managers.appStateManager.setByKey('settings.theme', name);\n rootScope.dispatchEvent('theme_change');\n }\n\n public isNight() {\n return this.getTheme().name === 'night';\n }\n\n public getTheme(name: AppTheme['name'] = rootScope.settings.theme === 'system' ? this.systemTheme : rootScope.settings.theme) {\n return rootScope.settings.themes.find((t) => t.name === name);\n }\n\n // theme applier\n private bindColorApplier(options: Pick[0], 'element' | 'isNight'>) {\n const appliedColors: Set = new Set();\n return {\n applyAppColor: (_options: Omit[0], keyof typeof options>) => {\n appliedColors.add(_options.name);\n return this.applyAppColor({..._options, ...options});\n },\n finalize: () => {\n const isNight = options.isNight;\n for(const name in appColorMap) {\n if(!appliedColors.has(name as AppColorName)) {\n this.applyAppColor({\n name: name as AppColorName,\n hex: colorMap[isNight ? 'night' : 'day'][name as AppColorName],\n ...options\n });\n }\n }\n }\n };\n };\n\n private applyAppColor({\n name,\n hex,\n element,\n lightenAlpha = 0.08,\n darkenAlpha = lightenAlpha,\n mixColor,\n isNight\n }: {\n name: AppColorName,\n hex: string,\n element: HTMLElement,\n lightenAlpha?: number\n darkenAlpha?: number,\n mixColor?: ColorRgb,\n isNight?: boolean\n }) {\n const appColor = appColorMap[name];\n const rgb = hexToRgb(hex);\n const hsla = rgbaToHsla(...rgb);\n\n mixColor ??= hexToRgb(colorMap[isNight ? 'night' : 'day']['surface-color']);\n const lightenedRgb = mixColors(rgb, mixColor, lightenAlpha);\n\n const darkenedHsla: typeof hsla = {\n ...hsla,\n l: hsla.l - darkenAlpha * 100\n };\n\n const properties: [string, string][] = [\n [name, hex],\n appColor.rgb && [name + '-rgb', rgb.join(',')],\n appColor.light && ['light-' + name, `rgba(${rgb[0]}, ${rgb[1]}, ${rgb[2]}, ${lightenAlpha})`],\n appColor.lightFilled && ['light-filled-' + name, rgbaToHexa(lightenedRgb)],\n appColor.dark && ['dark-' + name, `hsl(${darkenedHsla.h}, ${darkenedHsla.s}%, ${darkenedHsla.l}%)`]\n // appColor.darkFilled && ['dark-' + name, `hsl(${darkenedHsla.h}, ${darkenedHsla.s}%, ${darkenedHsla.l}%)`]\n ];\n\n properties.filter(Boolean).forEach(([name, value]) => {\n element.style.setProperty('--' + name, value);\n });\n }\n\n public async applyNewTheme(theme: Theme) {\n const isNight = this.isNightTheme(theme);\n const currentTheme = this.getTheme();\n const themes = rootScope.settings.themes;\n const themeSettings = theme.settings.find((themeSettings) => themeSettings.base_theme._ === (isNight ? 'baseThemeNight' : 'baseThemeClassic'));\n const newAppTheme: AppTheme = {\n ...theme,\n name: currentTheme.name,\n settings: {\n ...themeSettings,\n highlightningColor: ''\n }\n };\n\n await this.AppBackgroundTab.setBackgroundDocument(themeSettings.wallpaper, newAppTheme.settings);\n themes[themes.indexOf(currentTheme)] = newAppTheme;\n await rootScope.managers.appStateManager.setByKey('settings.themes', rootScope.settings.themes);\n rootScope.dispatchEvent('theme_change');\n }\n\n private isNightTheme(theme: Theme | AppTheme) {\n return (theme as AppTheme).name === 'night' || this.isNight();\n }\n\n public applyTheme(theme: Theme | AppTheme, element = document.documentElement) {\n const isNight = this.isNightTheme(theme);\n const themeSettings = Array.isArray(theme.settings) ?\n theme.settings.find((settings) => settings.base_theme._ === (isNight ? 'baseThemeNight' : 'baseThemeClassic')) :\n theme.settings;\n const baseColors = colorMap[isNight ? 'night' : 'day'];\n\n let hsvTemp1 = rgbToHsv(...hexToRgb(baseColors['primary-color'])); // primary base\n let hsvTemp2 = rgbToHsv(...getRgbColorFromTelegramColor(themeSettings.accent_color)); // new primary\n\n const newAccentRgb = changeColorAccent(\n hsvTemp1,\n hsvTemp2,\n hexToRgb(baseColors['primary-color']),\n !isNight\n );\n const newAccentHex = rgbaToHexa(newAccentRgb);\n\n const {applyAppColor, finalize} = this.bindColorApplier({element, isNight});\n\n applyAppColor({\n name: 'primary-color',\n hex: newAccentHex,\n darkenAlpha: 0.04\n });\n\n applyAppColor({\n name: 'saved-color',\n hex: newAccentHex,\n lightenAlpha: 0.64,\n mixColor: [255, 255, 255]\n });\n\n if(!themeSettings.message_colors?.length) {\n return;\n }\n\n const messageLightenAlpha = isNight ? 0.92 : 0.12;\n const baseMessageColor = hexToRgb(baseColors['message-out-primary-color']);\n hsvTemp1 = rgbToHsv(...baseMessageColor);\n const baseMessageOutBackgroundColor = mixColors(baseMessageColor, hexToRgb(baseColors['surface-color']), messageLightenAlpha);\n\n const firstColor = getRgbColorFromTelegramColor(themeSettings.message_colors[0]);\n\n let myMessagesAccent = firstColor;\n if(themeSettings.message_colors.length > 1) {\n // const w = getAccentColor(hsvTemp1, baseMessageOutBackgroundColor, myMessagesAccent);\n\n themeSettings.message_colors.slice(1).forEach((nextColor) => {\n myMessagesAccent = getAverageColor(myMessagesAccent, getRgbColorFromTelegramColor(nextColor));\n });\n\n myMessagesAccent = getAccentColor(hsvTemp1, baseMessageOutBackgroundColor, myMessagesAccent);\n\n // console.log('www', rgbaToHexa(w), rgbaToHexa(myMessagesAccent));\n }\n\n const o = myMessagesAccent;\n hsvTemp2 = rgbToHsv(...o);\n\n // const c = changeColorAccent(\n // hsvTemp1,\n // hsvTemp2,\n // baseMessageOutBackgroundColor\n // );\n\n // console.log(o, c, rgbaToHexa(o), rgbaToHexa(c));\n\n const accentColor2 = themeSettings.outbox_accent_color !== undefined && rgbToHsv(...getRgbColorFromTelegramColor(themeSettings.outbox_accent_color));\n\n const newMessageOutBackgroundColor = mixColors(myMessagesAccent, hexToRgb(baseColors['surface-color']), messageLightenAlpha);\n\n applyAppColor({\n name: 'message-out-background-color',\n hex: rgbaToHexa(newMessageOutBackgroundColor),\n lightenAlpha: messageLightenAlpha\n });\n\n applyAppColor({\n name: 'message-out-primary-color',\n hex: isNight ? '#ffffff' : rgbaToHexa(accentColor2 ? hsvToRgb(...accentColor2) : myMessagesAccent),\n mixColor: newMessageOutBackgroundColor\n });\n\n // if(accentColor2) {\n // console.log(rgbaToHexa(myMessagesAccent), rgbaToHexa(hsvToRgb(...accentColor2)));\n // }\n\n finalize();\n }\n}\n\nconst themeController = new ThemeController();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.themeController = themeController);\nexport default themeController;\n","/*\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 setWorkerProxy() {\n // * hook worker constructor to set search parameters (test, debug, etc)\n const workerHandler = {\n construct(target: any, args: any) {\n let url = args[0] + '';\n if(url.indexOf('blob:') !== 0) {\n url += location.search;\n }\n\n return new target(url);\n }\n };\n\n [\n Worker,\n typeof(SharedWorker) !== 'undefined' && SharedWorker\n ].filter(Boolean).forEach((w) => {\n window[w.name as any] = new Proxy(w, workerHandler);\n });\n}\n\nsetWorkerProxy();\n","const IS_INSTALL_PROMPT_SUPPORTED = 'onbeforeinstallprompt' in window;\nexport default IS_INSTALL_PROMPT_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 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_ANDROID, IS_APPLE, IS_APPLE_MOBILE, IS_FIREFOX, IS_MOBILE, IS_MOBILE_SAFARI, IS_SAFARI} from './environment/userAgent';\nimport './materialize.scss';\nimport './scss/style.scss';\nimport pause from './helpers/schedulers/pause';\nimport setWorkerProxy from './helpers/setWorkerProxy';\nimport toggleAttributePolyfill from './helpers/dom/toggleAttributePolyfill';\nimport rootScope from './lib/rootScope';\nimport IS_TOUCH_SUPPORTED from './environment/touchSupport';\nimport I18n from './lib/langPack';\nimport './helpers/peerIdPolyfill';\nimport './lib/polyfill';\nimport apiManagerProxy from './lib/mtproto/mtprotoworker';\nimport getProxiedManagers from './lib/appManagers/getProxiedManagers';\nimport themeController from './helpers/themeController';\nimport overlayCounter from './helpers/overlayCounter';\nimport singleInstance from './lib/mtproto/singleInstance';\nimport parseUriParams from './helpers/string/parseUriParams';\nimport Modes from './config/modes';\nimport {AuthState} from './types';\nimport {IS_BETA} from './config/debug';\nimport IS_INSTALL_PROMPT_SUPPORTED from './environment/installPrompt';\nimport cacheInstallPrompt from './helpers/dom/installPrompt';\n// import appNavigationController from './components/appNavigationController';\n\ndocument.addEventListener('DOMContentLoaded', async() => {\n toggleAttributePolyfill();\n\n // polyfill for replaceChildren\n if((Node as any).prototype.replaceChildren === undefined) {\n (Node as any).prototype.replaceChildren = function(...nodes: any[]) {\n this.textContent = '';\n // while(this.lastChild) {\n // this.removeChild(this.lastChild);\n // }\n if(nodes) {\n this.append(...nodes);\n }\n }\n }\n\n rootScope.managers = getProxiedManagers();\n\n const manifest = document.getElementById('manifest') as HTMLLinkElement;\n manifest.href = `site${IS_APPLE && !IS_APPLE_MOBILE ? '_apple' : ''}.webmanifest?v=jw3mK7G9Aq`;\n\n singleInstance.start();\n\n // We listen to the resize event (https://css-tricks.com/the-trick-to-viewport-units-on-mobile/)\n const w = window.visualViewport || window; // * handle iOS keyboard\n let setViewportVH = false/* , hasFocus = false */;\n let lastVH: number;\n const setVH = () => {\n const vh = (setViewportVH && !overlayCounter.isOverlayActive ? (w as VisualViewport).height || (w as Window).innerHeight : window.innerHeight) * 0.01;\n if(lastVH === vh) {\n return;\n } else if(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 setWorkerProxy;\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 /* const {IS_TOUCH_SUPPORTED} = touchSupport;\n const {IS_FIREFOX, IS_MOBILE, IS_APPLE, IS_SAFARI, IS_APPLE_MOBILE, IS_ANDROID} = userAgent;\n const rootScope = _rootScope.default;\n const appStateManager = _appStateManager.default;\n const I18n = _I18n.default; */\n\n window.addEventListener('resize', setVH);\n setVH();\n\n if(IS_STICKY_INPUT_BUGGED) {\n const toggleResizeMode = () => {\n setViewportVH = tabId === 1 && IS_STICKY_INPUT_BUGGED && !overlayCounter.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 (window as any).onImTabChange = (id: number) => {\n const wasTabId = tabId !== undefined;\n tabId = id;\n\n if(wasTabId || tabId === 1) {\n toggleResizeMode();\n }\n };\n\n overlayCounter.addEventListener('change', () => {\n toggleResizeMode();\n });\n }\n\n if(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 if(IS_EMOJI_SUPPORTED) {\n document.documentElement.classList.add('native-emoji');\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 // restrict contextmenu on images (e.g. webp stickers)\n document.addEventListener('contextmenu', (e) => {\n if((e.target as HTMLElement).tagName === 'IMG' && !(window as any).appMediaViewer) {\n cancelEvent(e);\n }\n });\n\n if(IS_FIREFOX) {\n document.documentElement.classList.add('is-firefox', 'no-backdrop');\n }\n\n if(IS_MOBILE) {\n document.documentElement.classList.add('is-mobile');\n }\n\n if(IS_APPLE) {\n if(IS_SAFARI) {\n document.documentElement.classList.add('is-safari');\n }\n\n // document.documentElement.classList.add('emoji-supported');\n\n if(IS_APPLE_MOBILE) {\n document.documentElement.classList.add('is-ios');\n } else {\n document.documentElement.classList.add('is-mac');\n }\n } else if(IS_ANDROID) {\n document.documentElement.classList.add('is-android');\n\n // force losing focus on input blur\n // focusin and focusout are not working on mobile\n\n const onInResize = () => {\n hasFocus = true;\n window.addEventListener('resize', onOutResize, {once: true});\n };\n\n const onOutResize = () => {\n hasFocus = false;\n blurActiveElement();\n };\n\n let hasFocus = false;\n document.addEventListener('touchend', (e) => {\n const input = (e.target as HTMLElement).closest('[contenteditable=\"true\"], input');\n if(!input) {\n return;\n }\n\n if(document.activeElement !== input && !hasFocus) {\n console.log('input click', e, document.activeElement, input, input.matches(':focus'));\n window.addEventListener('resize', onInResize, {once: true});\n }\n });\n }\n\n if(!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(IS_INSTALL_PROMPT_SUPPORTED) {\n cacheInstallPrompt();\n }\n\n const perf = performance.now();\n\n // await pause(1000000);\n\n const langPromise = I18n.getCacheLangPack();\n\n const [stateResult, langPack] = await Promise.all([\n // loadState(),\n apiManagerProxy.sendState().then(([stateResult]) => stateResult),\n langPromise\n ]);\n I18n.setTimeFormat(stateResult.state.settings.timeFormat);\n\n rootScope.managers.rootScope.getPremium().then((isPremium) => {\n rootScope.premium = isPremium;\n });\n\n themeController.setThemeListener();\n\n if(langPack.appVersion !== App.langPackVersion) {\n I18n.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 if(langPack.lang_code === 'ar' && IS_BETA && false) {\n document.body.classList.add('is-rtl');\n document.documentElement.dir = 'rtl';\n document.documentElement.lang = langPack.lang_code;\n I18n.setRTL(true);\n } else {\n document.documentElement.dir = 'ltr';\n }\n\n let authState = stateResult.state.authState;\n\n const hash = location.hash;\n const splitted = hash.split('?');\n const params = parseUriParams(hash, splitted);\n if(params.tgWebAuthToken && authState._ !== 'authStateSignedIn') {\n const data: AuthState.signImport['data'] = {\n token: params.tgWebAuthToken,\n dcId: +params.tgWebAuthDcId,\n userId: params.tgWebAuthUserId.toUserId(),\n isTest: params.tgWebAuthTest !== undefined && !!+params.tgWebAuthTest,\n tgAddr: params.tgaddr\n };\n\n if(data.isTest !== Modes.test) {\n const urlSearchParams = new URLSearchParams(location.search);\n if(+params.tgWebAuthTest) {\n urlSearchParams.set('test', '1');\n } else {\n urlSearchParams.delete('test');\n }\n\n location.search = urlSearchParams.toString();\n return;\n }\n\n rootScope.managers.appStateManager.pushToState('authState', authState = {_: 'authStateSignImport', data});\n\n // appNavigationController.overrideHash('?tgaddr=' + encodeURIComponent(params.tgaddr));\n }\n\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((!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 case 'authStateSignImport':\n pagePromise = (await import('./pages/pageSignImport')).default.mount(authState.data);\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 pause(1000),\n document.fonts.ready\n ]) :\n Promise.resolve();\n fadeInWhenFontsReady(scrollable, promise);\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\": \"\",\n \"next_type\": {\n \"_\": \"auth.codeTypeCall\"\n },\n \"timeout\": 120,\n \"phone_number\": \"\"\n });\n\n (await import('./pages/pageSignQR')).default.mount();\n\n (await import('./pages/pagePassword')).default.mount();\n\n (await import('./pages/pageSignUp')).default.mount({\n \"phone_code_hash\": \"\",\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 }\n});\n","export default function toggleAttributePolyfill() {\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","/*\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\nexport class AppRuntimeManager {\n public reload() {\n try {\n location.reload();\n } catch(e) {};\n\n // if(window.chrome && chrome.runtime && chrome.runtime.reload) {\n // chrome.runtime.reload();\n // }\n }\n\n public close() {\n try {\n window.close();\n } catch(e) {}\n }\n\n /**\n * Better to call from event\n */\n public focus() {\n // // @ts-ignore\n // if(window.navigator.mozApps && document.hidden) {\n // // Get app instance and launch it to bring app to foreground\n // // @ts-ignore\n // window.navigator.mozApps.getSelf().onsuccess = function() {\n // this.result.launch();\n // };\n // } else {\n // // @ts-ignore\n // if(window.chrome && chrome.app && chrome.app.window) {\n // // @ts-ignore\n // chrome.app.window.current().focus();\n // }\n\n window.focus();\n // }\n }\n}\n\nconst appRuntimeManager = new AppRuntimeManager();\nexport default appRuntimeManager;\n","/*\n * 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 createManagers from './createManagers';\nimport {ModifyFunctionsToAsync} from '../../types';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport {AckedResult} from '../mtproto/superMessagePort';\nimport noop from '../../helpers/noop';\nimport dT from '../../helpers/dT';\nimport DEBUG from '../../config/debug';\n\n// let stats: {\n// [manager: string]: {\n// [method: string]: {\n// times: number[],\n// byArgs: {\n// [args: string]: number[]\n// }\n// }\n// }\n// } = {};\n\n// let sentCount = 0;\n// let sentMethods: {[key: string]: number} = {};\n// let sentMethods2: {[key: string]: number} = {};\n// function collectStats(manager: string, method: string, args: any[], promise: Promise) {\n// ++sentCount;\n\n// const key = [manager, method].join('-');\n// if(!sentMethods[key]) sentMethods[key] = 0;\n// ++sentMethods[key];\n\n// const key2 = [('00000' + sentCount).slice(-5), key].join('-');\n\n// let byManager = stats[manager] ??= {};\n// let byMethod = byManager[method] ??= {times: [], byArgs: {}};\n\n// const perf = performance.now();\n// promise.catch(noop).finally(() => {\n// const time = performance.now() - perf;\n// byMethod.times.push(time);\n\n// sentMethods2[key2] = time;\n\n// try {\n// const argsString = JSON.stringify(args);\n// byMethod.byArgs[argsString].push(time);\n// } catch(err) {}\n// });\n// }\n\n// setInterval(() => {\n// // console.log(dT(), '[PROXY] stats', stats, sentCount, sentMethods, sentMethods2);\n// sentCount = 0;\n// sentMethods = {};\n// sentMethods2 = {};\n// }, 2000);\n\nconst DEBUG_MANAGER_REQUESTS: {[managerName: string]: Set} = {};\nif(DEBUG) {\n (window as any).DEBUG_MANAGER_REQUESTS = DEBUG_MANAGER_REQUESTS;\n}\n\nfunction createProxy(/* source: T, */name: string, ack?: boolean) {\n const proxy = new Proxy({}, {\n get: (target, p, receiver) => {\n // console.log('get', target, p, receiver);\n // @ts-ignore\n // const value = source[p];\n // if(typeof(value) !== 'function') {\n // return value;\n // }\n\n return (...args: any[]) => {\n const promise = apiManagerProxy.invoke('manager', {\n name,\n method: p as string,\n args\n }, ack as any);\n\n if(DEBUG) {\n if(DEBUG_MANAGER_REQUESTS[name]?.has(p as any)) {\n console.warn('manager request', name, p, args);\n }\n }\n\n // collectStats(name, p as string, args, promise);\n\n return promise;\n\n // @ts-ignore\n // return Promise.resolve(value.call(source, ...args));\n };\n }\n });\n\n return proxy;\n}\n\ntype AA = {\n [key in keyof T]: T[key] extends (...args: infer A) => infer R ? (...args: A) => Promise>> : never\n};\n\ntype T = Awaited>;\ntype ProxiedManagers = {\n [name in keyof T]?: ModifyFunctionsToAsync;\n} & {\n acknowledged?: {\n [name in keyof T]?: AA;\n }\n};\n\nfunction createProxyProxy(proxied: any, ack?: boolean) {\n return new Proxy(proxied, {\n get: (target, p, receiver) => {\n // @ts-ignore\n return target[p] ??= createProxy(p as string, ack);\n }\n });\n}\n\nlet proxied: ProxiedManagers;\nexport default function getProxiedManagers() {\n if(proxied) {\n return proxied;\n }\n\n proxied = createProxyProxy({}, false);\n proxied.acknowledged = createProxyProxy({}, true);\n return proxied;\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 {Database} from '../../config/databases';\nimport Modes from '../../config/modes';\nimport makeError from '../../helpers/makeError';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {logger} from '../logger';\n\n/**\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\n */\nexport type IDBIndex = {\n indexName: string,\n keyPath: string,\n objectParameters: IDBIndexParameters\n};\n\nexport type IDBStore = {\n name: string,\n indexes?: IDBIndex[]\n};\n\nexport type IDBOptions = {\n name?: string,\n storeName: string,\n stores?: IDBStore[],\n version?: number\n};\n\nconst DEBUG = false;\n\nexport class IDB {\n private static INSTANCES: IDB[] = [];\n private openDbPromise: Promise;\n private db: IDBDatabase;\n private storageIsAvailable: boolean;\n private log: ReturnType;\n private name: string;\n private version: number;\n private stores: IDBStore[];\n\n constructor(db: Database) {\n safeAssign(this, db);\n\n if(Modes.test) {\n this.name += '_test';\n }\n\n this.storageIsAvailable = true;\n this.log = logger(['IDB', db.name].join('-'));\n this.log('constructor');\n\n this.openDatabase(true);\n\n IDB.INSTANCES.push(this);\n }\n\n public isAvailable() {\n return this.storageIsAvailable;\n }\n\n public openDatabase(createNew = false): Promise {\n if(this.openDbPromise && !createNew) {\n return this.openDbPromise;\n }\n\n const createIndexes = (os: IDBObjectStore, store: IDBStore) => {\n const indexNames = Array.from(os.indexNames);\n for(const indexName of indexNames) {\n os.deleteIndex(indexName);\n }\n\n if(!store.indexes?.length) {\n return;\n }\n\n for(const index of store.indexes) {\n if(os.indexNames.contains(index.indexName)) {\n continue;\n }\n\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\n }\n };\n\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\n const os = db.createObjectStore(store.name);\n createIndexes(os, store);\n };\n\n try {\n var request = indexedDB.open(this.name, this.version);\n\n if(!request) {\n return Promise.reject();\n }\n } catch(error) {\n this.log.error('error opening db', (error as Error).message);\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n let finished = false;\n setTimeout(() => {\n if(!finished) {\n request.onerror(makeError('IDB_CREATE_TIMEOUT') as Event);\n }\n }, 3000);\n\n return this.openDbPromise = new Promise((resolve, reject) => {\n request.onsuccess = (event) => {\n finished = true;\n const db = request.result;\n let calledNew = false;\n\n this.log('Opened');\n\n db.onerror = (error) => {\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', error);\n reject(error);\n };\n\n db.onclose = (e) => {\n this.log.error('closed:', e);\n !calledNew && this.openDatabase();\n };\n\n db.onabort = (e) => {\n this.log.error('abort:', e);\n const transaction = e.target as IDBTransaction;\n\n this.openDatabase(calledNew = true);\n\n if(transaction.onerror) {\n transaction.onerror(e);\n }\n\n db.close();\n };\n\n db.onversionchange = (e) => {\n this.log.error('onversionchange, lol?');\n };\n\n resolve(this.db = db);\n };\n\n request.onerror = (event) => {\n finished = true;\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', event);\n reject(event);\n };\n\n request.onupgradeneeded = (event) => {\n finished = true;\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\n\n const target = event.target as IDBOpenDBRequest;\n const db = target.result;\n this.stores.forEach((store) => {\n /* if(db.objectStoreNames.contains(store.name)) {\n //if(event.oldVersion === 1) {\n db.deleteObjectStore(store.name);\n //}\n } */\n\n if(!db.objectStoreNames.contains(store.name)) {\n createObjectStore(db, store);\n } else {\n const txn = target.transaction;\n const os = txn.objectStore(store.name);\n createIndexes(os, store);\n }\n });\n };\n });\n }\n\n public static create>(db: T) {\n return this.INSTANCES.find((instance) => instance.name === db.name) ?? new IDB(db);\n }\n\n public static closeDatabases(preserve?: IDB) {\n this.INSTANCES.forEach((storage) => {\n if(preserve && preserve === storage) {\n return;\n }\n\n const db = storage.db;\n if(db) {\n db.onclose = () => {};\n db.close();\n }\n });\n }\n}\n\nexport default class IDBStorage, StoreName extends string = T['stores'][0]['name']> {\n private log: ReturnType;\n private storeName: T['stores'][0]['name'];\n private idb: IDB;\n\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\n this.storeName = storeName;\n this.log = logger(['IDB', db.name, storeName].join('-'));\n this.idb = IDB.create(db);\n }\n\n /**\n * ! WARNING ! function requires at least one opened connection\n */\n /* public static clearObjectStores() {\n const storage = this.STORAGES[0];\n this.closeDatabases(storage);\n\n const names = Array.from(storage.db.objectStoreNames);\n const promises = names.map((name) => storage.clear(name));\n return Promise.all(promises);\n } */\n\n /* public static deleteDatabase() {\n this.closeDatabases();\n\n const storages = this.STORAGES;\n const dbNames = Array.from(new Set(storages.map((storage) => storage.name)));\n const promises = dbNames.map((dbName) => {\n return new Promise((resolve, reject) => {\n const deleteRequest = indexedDB.deleteDatabase(dbName);\n\n deleteRequest.onerror = () => {\n reject();\n };\n\n deleteRequest.onsuccess = () => {\n resolve();\n };\n });\n });\n\n return Promise.all(promises);\n } */\n\n public delete(entryName: string | string[], storeName?: StoreName): Promise {\n // return Promise.resolve();\n const isArray = Array.isArray(entryName);\n if(!isArray) {\n entryName = [].concat(entryName);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n const promises = (entryName as string[]).map((entryName) => objectStore.delete(entryName));\n return isArray ? promises : promises[0];\n }, DEBUG ? 'delete: ' + (entryName as string[]).join(', ') : '', storeName);\n }\n\n public clear(storeName?: StoreName): Promise {\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\n }\n\n public save(entryName: string | string[], value: any | any[], storeName?: StoreName) {\n // const handleError = (error: Error) => {\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\n // setTimeout(() => {\n // this.save(entryName, value);\n // }, 2e3);\n // } else {\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\n // }\n // };\n\n const isArray = Array.isArray(entryName);\n if(!isArray) {\n entryName = [].concat(entryName);\n value = [].concat(value);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n const promises = (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\n return isArray ? promises : promises[0];\n }, DEBUG ? 'save: ' + (entryName as string[]).join(', ') : '', storeName);\n }\n\n // public saveFile(fileName: string, blob: Blob | Uint8Array) {\n // //return Promise.resolve(blobConstruct([blob]));\n // if(!(blob instanceof Blob)) {\n // blob = blobConstruct(blob);\n // }\n\n // return this.save(fileName, blob);\n // }\n\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\n return Promise.reject();\n }\n\n if(!(blob instanceof Blob)) {\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\n return this.storagePutB64String(db, fileName, address).then(() => {\n return blob;\n });\n }\n\n try {\n var reader = new FileReader();\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n let promise = new Promise((resolve, reject) => {\n reader.onloadend = () => {\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\n resolve(blob);\n }, reject);\n }\n\n reader.onerror = reject;\n });\n\n\n try {\n reader.readAsDataURL(blob);\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n return promise;\n }\n\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\n try {\n var objectStore = db.transaction([this.storeName], 'readwrite')\n .objectStore(this.storeName);\n var request = objectStore.put(b64string, fileName);\n } catch(error) {\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n resolve();\n };\n\n request.onerror = reject;\n });\n }\n\n public getBlobSize(blob: any) {\n return blob.size || blob.byteLength || blob.length;\n } */\n\n public get(entryName: string[], storeName?: StoreName): Promise;\n public get(entryName: string, storeName?: StoreName): Promise;\n public get(entryName: string | string[], storeName?: StoreName): Promise | Promise {\n // return Promise.reject();\n\n const isArray = Array.isArray(entryName);\n if(!isArray) {\n if(!entryName) {\n return undefined;\n }\n\n entryName = [].concat(entryName);\n } else if(!entryName.length) {\n return Promise.resolve([]) as any;\n }\n\n return this.getObjectStore('readonly', (objectStore) => {\n const promises = (entryName as string[]).map((entryName) => objectStore.get(entryName));\n return isArray ? promises : promises[0];\n }, DEBUG ? 'get: ' + (entryName as string[]).join(', ') : '', storeName);\n }\n\n private getObjectStore(\n mode: IDBTransactionMode,\n callback: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[],\n log?: string,\n storeName = this.storeName\n ) {\n let perf: number;\n\n if(log) {\n perf = performance.now();\n this.log(log + ': start');\n }\n\n return this.idb.openDatabase().then((db) => {\n return new Promise((resolve, reject) => {\n /* if(mode === 'readwrite') {\n return;\n } */\n\n const transaction = db.transaction([storeName], mode);\n\n const onError = () => {\n clearTimeout(timeout);\n reject(transaction.error);\n };\n\n // let resolved = false;\n const onComplete = (/* what: string */) => {\n clearTimeout(timeout);\n\n if(log) {\n this.log(log + ': end', performance.now() - perf/* , what */);\n }\n\n // if(resolved) {\n // return;\n // }\n\n // resolved = true;\n const results = requests.map((r) => r.result);\n resolve(isArray ? results : results[0]);\n };\n\n transaction.onerror = onError;\n\n // * have to wait while clearing or setting something\n const waitForTransactionComplete = mode === 'readwrite';\n if(waitForTransactionComplete) {\n transaction.oncomplete = () => onComplete(/* 'transaction' */);\n }\n\n const timeout = setTimeout(() => {\n this.log.error('transaction not finished', transaction, log);\n }, 10000);\n\n /* transaction.addEventListener('abort', (e) => {\n //handleError();\n this.log.error('IndexedDB: transaction abort!', transaction.error);\n }); */\n\n const callbackResult = callback(transaction.objectStore(storeName));\n\n const isArray = Array.isArray(callbackResult);\n const requests: IDBRequest[] = isArray ? callbackResult : [].concat(callbackResult) as any;\n\n if(waitForTransactionComplete) {\n return;\n }\n\n const length = requests.length;\n let left = length;\n\n const onRequestFinished = () => {\n if(transaction.error) {\n return;\n }\n\n if(!--left) {\n onComplete(/* 'requests' */);\n }\n };\n\n for(let i = 0; i < length; ++i) {\n const request = requests[i];\n request.onerror = onError;\n request.onsuccess = onRequestFinished;\n }\n });\n });\n }\n\n public getAll(storeName?: StoreName): Promise {\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '', storeName);\n }\n\n /* public getAllKeys(): Promise> {\n console.time('getAllEntries');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.getAllKeys();\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var result = event.target.result;\n resolve(result);\n console.timeEnd('getAllEntries');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public isFileExists(fileName: string): Promise {\n console.time('isFileExists');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.openCursor(fileName);\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var cursor = event.target.result;\n resolve(!!cursor);\n console.timeEnd('isFileExists');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public getFileWriter(fileName: string, mimeType: string) {\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\n return this.saveFile(fileName, blob);\n });\n\n return Promise.resolve(fakeWriter);\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 lang from '../lang';\nimport type langSign from '../langSign';\nimport type {State} from '../config/state';\nimport DEBUG, {MOUNT_CLASS_TO} from '../config/debug';\nimport {HelpCountriesList, HelpCountry, LangPackDifference, LangPackString} from '../layer';\nimport stateStorage from './stateStorage';\nimport App from '../config/app';\nimport rootScope from './rootScope';\nimport {IS_MOBILE} from '../environment/userAgent';\nimport deepEqual from '../helpers/object/deepEqual';\nimport safeAssign from '../helpers/object/safeAssign';\nimport capitalizeFirstLetter from '../helpers/string/capitalizeFirstLetter';\nimport matchUrlProtocol from './richTextProcessor/matchUrlProtocol';\nimport wrapUrl from './richTextProcessor/wrapUrl';\nimport {setDirection} from '../helpers/dom/setInnerHTML';\n\nexport const langPack: {[actionType: string]: LangPackKey} = {\n 'messageActionChatCreate': 'ActionCreateGroup',\n 'messageActionChatCreateYou': 'ActionYouCreateGroup',\n 'messageActionChatEditTitle': 'ActionChangedTitle',\n 'messageActionChatEditPhoto': 'ActionChangedPhoto',\n 'messageActionChatEditVideo': 'ActionChangedVideo',\n 'messageActionChatDeletePhoto': 'ActionRemovedPhoto',\n 'messageActionChatReturn': 'ActionAddUserSelf',\n 'messageActionChatReturnYou': 'ActionAddUserSelfYou',\n 'messageActionChatJoined': 'ActionAddUserSelfMega',\n 'messageActionChatJoinedYou': 'ChannelMegaJoined',\n 'messageActionChatAddUser': 'ActionAddUser',\n 'messageActionChatAddUsers': 'ActionAddUser',\n 'messageActionChatLeave': 'ActionLeftUser',\n 'messageActionChatLeaveYou': 'YouLeft',\n 'messageActionChatDeleteUser': 'ActionKickUser',\n 'messageActionChatJoinedByLink': 'ActionInviteUser',\n 'messageActionPinMessage': 'Chat.Service.Group.UpdatedPinnedMessage',\n 'messageActionContactSignUp': 'Chat.Service.PeerJoinedTelegram',\n 'messageActionChannelCreate': 'ActionCreateChannel',\n 'messageActionChannelEditTitle': 'Chat.Service.Channel.UpdatedTitle',\n 'messageActionChannelEditPhoto': 'Chat.Service.Channel.UpdatedPhoto',\n 'messageActionChannelEditVideo': 'Chat.Service.Channel.UpdatedVideo',\n 'messageActionChannelDeletePhoto': 'Chat.Service.Channel.RemovedPhoto',\n 'messageActionHistoryClear': 'HistoryCleared',\n 'messageActionDiscussionStarted': 'DiscussionStarted',\n\n 'messageActionChannelMigrateFrom': 'ActionMigrateFromGroup',\n\n 'messageActionPhoneCall.video_in_ok': 'ChatList.Service.VideoCall.incoming',\n 'messageActionPhoneCall.video_out_ok': 'ChatList.Service.VideoCall.outgoing',\n 'messageActionPhoneCall.video_missed': 'ChatList.Service.VideoCall.Missed',\n 'messageActionPhoneCall.video_cancelled': 'ChatList.Service.VideoCall.Cancelled',\n 'messageActionPhoneCall.in_ok': 'ChatList.Service.Call.incoming',\n 'messageActionPhoneCall.out_ok': 'ChatList.Service.Call.outgoing',\n 'messageActionPhoneCall.missed': 'ChatList.Service.Call.Missed',\n 'messageActionPhoneCall.cancelled': 'ChatList.Service.Call.Cancelled',\n\n 'messageActionGroupCall.started': 'Chat.Service.VoiceChatStarted.Channel',\n 'messageActionGroupCall.started_by': 'Chat.Service.VoiceChatStarted',\n 'messageActionGroupCall.started_byYou': 'Chat.Service.VoiceChatStartedYou',\n 'messageActionGroupCall.ended': 'Chat.Service.VoiceChatFinished.Channel',\n 'messageActionGroupCall.ended_by': 'Chat.Service.VoiceChatFinished',\n 'messageActionGroupCall.ended_byYou': 'Chat.Service.VoiceChatFinishedYou',\n\n '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 export const strings: Map = new Map();\n export const countriesList: HelpCountry[] = [];\n let pluralRules: Intl.PluralRules;\n\n let cacheLangPackPromise: Promise;\n export let lastRequestedLangCode: string;\n export let lastRequestedNormalizedLangCode: string;\n export let lastAppliedLangCode: string;\n export let requestedServerLanguage = false;\n export let timeFormat: State['settings']['timeFormat'];\n export let isRTL = false;\n\n export function setRTL(rtl: boolean) {\n isRTL = rtl;\n }\n\n function setLangCode(langCode: string) {\n lastRequestedLangCode = langCode;\n lastRequestedNormalizedLangCode = langCode.split('-')[0];\n }\n\n export function getCacheLangPack(): Promise {\n if(cacheLangPackPromise) return cacheLangPackPromise;\n return cacheLangPackPromise = Promise.all([\n stateStorage.get('langPack') as Promise,\n polyfillPromise\n ]).then(([langPack]) => {\n if(!langPack/* || true */) {\n return loadLocalLangPack();\n } else if(DEBUG && false) {\n return getLangPack(langPack.lang_code);\n }/* else if(langPack.appVersion !== App.langPackVersion) {\n return getLangPack(langPack.lang_code);\n } */\n\n if(!lastRequestedLangCode) {\n setLangCode(langPack.lang_code);\n }\n\n applyLangPack(langPack);\n return langPack;\n }).finally(() => {\n cacheLangPackPromise = undefined;\n });\n }\n\n function updateAmPm() {\n if(timeFormat === 'h12') {\n try {\n const dateTimeFormat = getDateTimeFormat({hour: 'numeric', minute: 'numeric', hour12: true});\n const date = new Date();\n date.setHours(0);\n const amText = dateTimeFormat.format(date);\n amPmCache.am = amText.split(/\\s/)[1];\n date.setHours(12);\n const pmText = dateTimeFormat.format(date);\n amPmCache.pm = pmText.split(/\\s/)[1];\n } catch(err) {\n console.error('cannot get am/pm', err);\n amPmCache = {am: 'AM', pm: 'PM'};\n }\n }\n }\n\n export function setTimeFormat(\n format: State['settings']['timeFormat'],\n haveToUpdate = !!timeFormat && timeFormat !== format\n ) {\n timeFormat = format;\n\n updateAmPm();\n\n if(haveToUpdate) {\n cachedDateTimeFormats.clear();\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 export function loadLocalLangPack() {\n const defaultCode = App.langPackCode;\n setLangCode(defaultCode);\n return Promise.all([\n import('../lang'),\n import('../langSign'),\n import('../countries')\n ]).then(([lang, langSign, countries]) => {\n const strings: LangPackString[] = [];\n formatLocalStrings(lang.default, strings);\n formatLocalStrings(langSign.default, strings);\n\n const langPack: LangPackDifference = {\n _: 'langPackDifference',\n from_version: 0,\n lang_code: defaultCode,\n strings,\n version: 0,\n local: true,\n countries: countries.default\n };\n return saveLangPack(langPack);\n });\n }\n\n export function loadLangPack(langCode: string, web?: boolean) {\n web = true;\n requestedServerLanguage = true;\n const managers = rootScope.managers;\n return Promise.all([\n managers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n lang_code: langCode,\n lang_pack: web ? 'web' : App.langPack\n }),\n !web && managers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n lang_code: langCode,\n lang_pack: 'android'\n }),\n import('../lang'),\n import('../langSign'),\n managers.apiManager.invokeApiCacheable('help.getCountriesList', {\n lang_code: langCode,\n hash: 0\n }) as Promise,\n polyfillPromise\n ]);\n }\n\n export function getStrings(langCode: string, strings: string[]) {\n return rootScope.managers.apiManager.invokeApi('langpack.getStrings', {\n lang_pack: App.langPack,\n lang_code: langCode,\n keys: strings\n });\n }\n\n export function formatLocalStrings(strings: any, pushTo: LangPackString[] = []) {\n for(const i in strings) {\n // @ts-ignore\n const v = strings[i];\n if(typeof(v) === 'string') {\n pushTo.push({\n _: 'langPackString',\n key: i,\n value: v\n });\n } else {\n pushTo.push({\n _: 'langPackStringPluralized',\n key: i,\n ...v\n });\n }\n }\n\n return pushTo;\n }\n\n export function getLangPack(langCode: string, web?: boolean) {\n setLangCode(langCode);\n return loadLangPack(langCode, web).then(([langPack1, langPack2, localLangPack1, localLangPack2, countries, _]) => {\n let strings: LangPackString[] = [];\n\n [localLangPack1, localLangPack2].forEach((l) => {\n formatLocalStrings(l.default as any, strings);\n });\n\n strings = strings.concat(...[langPack1.strings, langPack2.strings].filter(Boolean));\n\n langPack1.strings = strings;\n langPack1.countries = countries;\n return saveLangPack(langPack1);\n });\n }\n\n export function saveLangPack(langPack: LangPackDifference) {\n langPack.appVersion = App.langPackVersion;\n\n return stateStorage.set({langPack}).then(() => {\n applyLangPack(langPack);\n return langPack;\n });\n }\n\n export const polyfillPromise = (function checkIfPolyfillNeeded() {\n if(typeof(Intl) !== 'undefined' && typeof(Intl.PluralRules) !== 'undefined'/* && false */) {\n return Promise.resolve();\n } else {\n return import('./pluralPolyfill').then((_Intl) => {\n (window as any).Intl = Object.assign(typeof(Intl) !== 'undefined' ? Intl : {}, _Intl.default);\n });\n }\n })();\n\n export function applyLangPack(langPack: LangPackDifference) {\n const currentLangCode = lastRequestedLangCode;\n if(langPack.lang_code !== currentLangCode) {\n return;\n }\n\n try {\n pluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode);\n } catch(err) {\n console.error('pluralRules error', err);\n pluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode.split('-', 1)[0]);\n }\n\n try {\n pluralRules = new Intl.PluralRules(langPack.lang_code);\n } catch(err) {\n console.error('pluralRules error', err);\n pluralRules = new Intl.PluralRules(langPack.lang_code.split('-', 1)[0]);\n }\n\n strings.clear();\n\n for(const string of langPack.strings) {\n strings.set(string.key as LangPackKey, string);\n }\n\n if(langPack.countries) {\n countriesList.length = 0;\n countriesList.push(...langPack.countries.countries);\n\n langPack.countries.countries.forEach((country) => {\n if(country.name) {\n const langPackKey: any = country.default_name;\n strings.set(langPackKey, {\n _: 'langPackString',\n key: langPackKey,\n value: country.name\n });\n }\n });\n }\n\n if(lastAppliedLangCode !== currentLangCode) {\n rootScope.dispatchEvent('language_change', currentLangCode);\n lastAppliedLangCode = currentLangCode;\n cachedDateTimeFormats.clear();\n updateAmPm();\n }\n\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n elements.forEach((element) => {\n const instance = weakMap.get(element);\n\n if(instance) {\n instance.update();\n }\n });\n }\n\n function pushNextArgument(out: ReturnType, args: FormatterArguments, indexHolder: {i: number}) {\n const arg = args[indexHolder.i++];\n if(Array.isArray(arg)) {\n out.push(...arg as any);\n } else {\n out.push(arg);\n }\n }\n\n export function superFormatter(input: string, args?: FormatterArguments, indexHolder = {i: 0}): Exclude[] {\n const out: ReturnType = [];\n const regExp = /(\\*\\*|__)(.+?)\\1|(\\n)|(\\[.+?\\]\\(.*?\\))|un\\d|%\\d\\$.|%./g;\n\n let lastIndex = 0;\n input.replace(regExp, (match, p1: any, p2: any, p3: any, p4: string, offset: number, string: string) => {\n // console.table({match, p1, p2, offset, string});\n\n out.push(string.slice(lastIndex, offset));\n\n if(p1) {\n // offset += p1.length;\n let element: HTMLElement;\n switch(p1) {\n case '**': {\n element = document.createElement('b');\n break;\n }\n\n case '__': {\n element = document.createElement('i');\n break;\n }\n }\n\n element.append(...superFormatter(p2, args, indexHolder) as any);\n out.push(element);\n } else if(p3) {\n out.push(document.createElement('br'));\n } else if(p4) {\n const idx = p4.lastIndexOf(']');\n const text = p4.slice(1, idx);\n\n const url = p4.slice(idx + 2, p4.length - 1);\n let a: HTMLAnchorElement;\n if(url && matchUrlProtocol(url)) {\n a = document.createElement('a');\n const wrappedUrl = wrapUrl(url);\n a.href = wrappedUrl.url;\n if(wrappedUrl.onclick) a.setAttribute('onclick', wrappedUrl.onclick);\n a.target = '_blank';\n } else {\n a = args[indexHolder.i++] as HTMLAnchorElement;\n\n if(a instanceof DocumentFragment) { // right after wrapRichText\n a = a.firstChild as any;\n }\n\n a.textContent = ''; // reset content\n }\n\n a.append(...superFormatter(text, args, indexHolder) as any);\n\n out.push(a);\n } else if(args) {\n pushNextArgument(out, args, indexHolder);\n }\n\n lastIndex = offset + match.length;\n return '';\n });\n\n if(lastIndex !== input.length) {\n out.push(input.slice(lastIndex));\n }\n\n return out;\n }\n\n export function format(key: LangPackKey, plain: true, args?: FormatterArguments): string;\n export function format(key: LangPackKey, plain?: false, args?: FormatterArguments): ReturnType;\n export function format(key: LangPackKey, plain = false, args?: FormatterArguments): ReturnType | string {\n const str = strings.get(key);\n let input: string;\n if(str) {\n if(str._ === 'langPackStringPluralized' && args?.length) {\n let v = args[0] as number | string;\n if(typeof(v) === 'string') v = +v.replace(/\\D/g, '');\n const s = pluralRules.select(v);\n // @ts-ignore\n input = str[s + '_value'] || str['other_value'];\n } else if(str._ === 'langPackString') {\n input = str.value;\n } else {\n // input = '[' + key + ']';\n input = key;\n }\n } else {\n // input = '[' + key + ']';\n input = key;\n }\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\n /* if(plain) {\n if(args?.length) {\n const regExp = /un\\d|%\\d\\$.|%./g;\n let i = 0;\n input = input.replace(regExp, (match, offset, string) => {\n return '' + args[i++];\n });\n }\n\n return input;\n } else {\n return superFormatter(input, args);\n } */\n }\n\n export const weakMap: WeakMap> = new WeakMap();\n\n export type IntlElementBaseOptions = {\n element?: HTMLElement,\n property?: 'innerText' | 'innerHTML' | 'placeholder' | 'textContent',\n };\n\n abstract class IntlElementBase {\n public element: IntlElementBaseOptions['element'];\n public property: IntlElementBaseOptions['property'];\n\n constructor(options?: Options) {\n this.element = options?.element || document.createElement('span');\n this.element.classList.add('i18n');\n\n this.property = options?.property;\n if(options && ((options as any as IntlElementOptions).key || (options as any as IntlDateElementOptions).date)) {\n this.update(options);\n }\n\n weakMap.set(this.element, this);\n }\n\n abstract update(options?: Options): void;\n }\n\n export type IntlElementOptions = IntlElementBaseOptions & {\n key?: LangPackKey,\n args?: FormatterArguments\n };\n export class IntlElement extends IntlElementBase {\n public key: IntlElementOptions['key'];\n public args: IntlElementOptions['args'];\n\n constructor(options: IntlElementOptions = {}) {\n super({...options, property: options.property ?? 'innerHTML'});\n }\n\n public update(options?: IntlElementOptions) {\n safeAssign(this, options);\n\n if(this.property === 'innerHTML') {\n this.element.textContent = '';\n this.element.append(...format(this.key, false, this.args) as any);\n } else {\n // @ts-ignore\n const v = this.element[this.property];\n const formatted = format(this.key, true, this.args);\n\n // * hasOwnProperty won't work here\n if(v === undefined) this.element.dataset[this.property] = formatted;\n else (this.element as HTMLInputElement)[this.property] = formatted;\n }\n }\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 }\n\n const cachedDateTimeFormats: Map = new Map();\n function getDateTimeFormat(options: Intl.DateTimeFormatOptions = {}) {\n const json = JSON.stringify(options);\n let dateTimeFormat = cachedDateTimeFormats.get(json);\n if(!dateTimeFormat) {\n dateTimeFormat = new Intl.DateTimeFormat(lastRequestedNormalizedLangCode + '-u-hc-' + timeFormat, options);\n cachedDateTimeFormats.set(json, dateTimeFormat);\n }\n\n return dateTimeFormat;\n }\n\n export let amPmCache = {am: 'AM', pm: 'PM'};\n export type IntlDateElementOptions = IntlElementBaseOptions & {\n date?: Date,\n options: Intl.DateTimeFormatOptions\n };\n export class IntlDateElement extends IntlElementBase {\n public date: IntlDateElementOptions['date'];\n public options: IntlDateElementOptions['options'];\n\n constructor(options: IntlDateElementOptions) {\n super({...options, property: options.property ?? 'textContent'});\n setDirection(this.element);\n }\n\n public update(options?: IntlDateElementOptions) {\n safeAssign(this, options);\n\n let text: string;\n if(this.options.hour && this.options.minute && Object.keys(this.options).length === 2/* && false */) {\n const hours = this.date.getHours();\n text = ('0' + (timeFormat === 'h12' ? (hours % 12) || 12 : hours)).slice(-2) + ':' + ('0' + this.date.getMinutes()).slice(-2);\n // if(this.options.second) {\n // text += ':' + ('0' + this.date.getSeconds()).slice(-2);\n // }\n\n if(timeFormat === 'h12') {\n text += ' ' + (hours < 12 ? amPmCache.am : amPmCache.pm);\n }\n } else {\n // * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/hourCycle#adding_an_hour_cycle_via_the_locale_string\n const dateTimeFormat = getDateTimeFormat(this.options);\n text = capitalizeFirstLetter(dateTimeFormat.format(this.date));\n }\n\n (this.element as any)[this.property] = text;\n }\n }\n\n export function i18n(key: LangPackKey, args?: FormatterArguments) {\n return new IntlElement({key, args}).element;\n }\n\n export function i18n_(options: IntlElementOptions) {\n return new IntlElement(options).element;\n }\n\n export function _i18n(element: HTMLElement, key: LangPackKey, args?: FormatterArguments, property?: IntlElementOptions['property']) {\n return new IntlElement({element, key, args, property}).element;\n }\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 const 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 return 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 const joined = joinElementsWith(elements, (isLast) => {\n const langPackKey: LangPackKey = isLast && useLast ? 'AutoDownloadSettings.LastDelimeter' : 'AutoDownloadSettings.Delimeter';\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","/*\n * 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 {MyDialogFilter} from '../storages/filters';\n\n/**\n * Legacy Webogram's format, don't change dcID to camelCase. date is timestamp\n */\nexport type UserAuth = {dcID: number | string, date: number, id: PeerId};\nexport type REAL_FOLDER_ID = 0 | 1;\n\nexport const NULL_PEER_ID: PeerId = 0;\nexport const REPLIES_PEER_ID: PeerId = 1271266957;\nexport const REPLIES_HIDDEN_CHANNEL_ID: ChatId = 777;\nexport const SERVICE_PEER_ID: PeerId = 777000;\nexport const MUTE_UNTIL = 0x7FFFFFFF;\nexport const BOT_START_PARAM = '';\nexport const MAX_FILE_SAVE_SIZE = 20 * 1024 * 1024;\nexport const THUMB_TYPE_FULL = '';\nexport const TOPIC_COLORS = [0x6FB9F0, 0xFFD67E, 0xCB86DB, 0x8EEE98, 0xFF93B2, 0xFB6F5F];\nexport const ATTACH_MENU_BOT_ICON_NAME = 'default_static';\nexport const GENERAL_TOPIC_ID = 4295032831;\nexport const T_ME_PREFIXES = new Set(['web', 'k', 'z']);\n\nexport const FOLDER_ID_ALL: REAL_FOLDER_ID = 0;\nexport const FOLDER_ID_ARCHIVE: REAL_FOLDER_ID = 1;\nexport const REAL_FOLDERS: Set = new Set([FOLDER_ID_ALL, FOLDER_ID_ARCHIVE]);\nexport const START_LOCAL_ID = Math.max(...Array.from(REAL_FOLDERS)) + 1 as MyDialogFilter['localId'];\n","import IS_CALL_SUPPORTED from './callSupport';\nimport CAN_USE_TRANSFERABLES from './canUseTransferables';\nimport IS_CANVAS_FILTER_SUPPORTED from './canvasFilterSupport';\nimport IS_EMOJI_SUPPORTED from './emojiSupport';\nimport IS_GEOLOCATION_SUPPORTED from './geolocationSupport';\nimport IS_GROUP_CALL_SUPPORTED from './groupCallSupport';\nimport IMAGE_MIME_TYPES_SUPPORTED from './imageMimeTypesSupport';\nimport MEDIA_MIME_TYPES_SUPPORTED from './mediaMimeTypesSupport';\nimport IS_MOV_SUPPORTED from './movSupport';\nimport IS_PARALLAX_SUPPORTED from './parallaxSupport';\nimport IS_SCREEN_SHARING_SUPPORTED from './screenSharingSupport';\nimport IS_TOUCH_SUPPORTED from './touchSupport';\nimport IS_VIBRATE_SUPPORTED from './vibrateSupport';\nimport VIDEO_MIME_TYPES_SUPPORTED from './videoMimeTypesSupport';\nimport IS_WEBM_SUPPORTED from './webmSupport';\nimport IS_WEBP_SUPPORTED from './webpSupport';\nimport IS_WEBRTC_SUPPORTED from './webrtcSupport';\nimport * as userAgent from './userAgent';\nimport IS_OPUS_SUPPORTED from './opusSupport';\nimport IS_SHARED_WORKER_SUPPORTED from './sharedWorkerSupport';\nimport IS_APPLE_MX from './appleMx';\n\nconst ENVIRONMENT = {\n CAN_USE_TRANSFERABLES,\n IS_APPLE_MX,\n IS_CALL_SUPPORTED,\n IS_CANVAS_FILTER_SUPPORTED,\n IS_EMOJI_SUPPORTED,\n IS_GEOLOCATION_SUPPORTED,\n IS_GROUP_CALL_SUPPORTED,\n IS_MOV_SUPPORTED,\n IS_PARALLAX_SUPPORTED,\n IS_SCREEN_SHARING_SUPPORTED,\n IS_TOUCH_SUPPORTED,\n IS_VIBRATE_SUPPORTED,\n IS_OPUS_SUPPORTED,\n IS_SHARED_WORKER_SUPPORTED,\n IS_WEBM_SUPPORTED,\n IS_WEBP_SUPPORTED,\n IS_WEBRTC_SUPPORTED,\n IMAGE_MIME_TYPES_SUPPORTED,\n MEDIA_MIME_TYPES_SUPPORTED,\n VIDEO_MIME_TYPES_SUPPORTED,\n ...userAgent\n};\n\nexport default ENVIRONMENT;\n","/*\n * 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 DEBUG from '../../../../config/debug';\nimport {AutoDownloadPeerTypeSettings, State, STATE_INIT, Background, AppTheme} from '../../../../config/state';\nimport compareVersion from '../../../../helpers/compareVersion';\nimport copy from '../../../../helpers/object/copy';\nimport validateInitObject from '../../../../helpers/object/validateInitObject';\nimport {UserAuth} from '../../../mtproto/mtproto_config';\nimport rootScope from '../../../rootScope';\nimport stateStorage from '../../../stateStorage';\nimport sessionStorage from '../../../sessionStorage';\nimport {recordPromiseBound} from '../../../../helpers/recordPromise';\n// import RESET_STORAGES_PROMISE from \"../storages/resetStoragesPromise\";\nimport {StoragesResults} from '../storages/loadStorages';\nimport {logger} from '../../../logger';\nimport {WallPaper} from '../../../../layer';\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\n\nconst STATE_VERSION = STATE_INIT.version;\nconst BUILD = STATE_INIT.build;\n\nconst ALL_KEYS = Object.keys(STATE_INIT) as any as Array;\n\nconst REFRESH_KEYS: Array = [\n 'contactsListCachedTime',\n 'stateCreatedTime',\n 'maxSeenMsgId',\n 'filtersArr'\n];\n\n// const REFRESH_KEYS_WEEK = ['dialogs', 'allDialogsLoaded', 'updates', 'pinnedOrders'] as any as Array;\n\nasync function loadStateInner() {\n const log = logger('STATE-LOADER');\n\n const totalPerf = performance.now();\n const recordPromise = recordPromiseBound(log);\n\n const promises = ALL_KEYS.map((key) => recordPromise(stateStorage.get(key), 'state ' + key))\n .concat(\n recordPromise(sessionStorage.get('user_auth'), 'auth'),\n recordPromise(sessionStorage.get('state_id'), 'auth'),\n recordPromise(sessionStorage.get('k_build'), 'auth')\n )\n .concat(recordPromise(stateStorage.get('user_auth'), 'old auth')); // support old webk format\n\n const arr = await Promise.all(promises);\n log.warn('promises', performance.now() - totalPerf);\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 // const pushed: {key: keyof State, value: State[keyof State]}[] = [];\n const pushedKeys: (keyof State)[] = [];\n const pushToState = (key: T, value: State[T]) => {\n // appStateManager.pushToState(key, value);\n state[key] = value;\n // pushed.push({key, value});\n pushedKeys.push(key);\n };\n\n const replaceState = (_state: State) => {\n // pushed.length = 0;\n pushedKeys.length = 0;\n state = _state;\n pushedKeys.push(...Object.keys(state) as any as typeof pushedKeys);\n // state = appStateManager.setState(_state);\n // appStateManager.storage.set(state);\n };\n\n // let state: State = appStateManager.setState({} as any);\n let state: 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 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 sessionBuild = 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 const 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 const resetStorages: Set = new Set();\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 = copy(STATE_INIT);\n\n preserve.forEach((value, key) => {\n // @ts-ignore\n state[key] = value;\n });\n\n const r: {[k in keyof StoragesResults]: number} = {\n chats: 1,\n dialogs: 1,\n users: 1\n };\n for(const key in r) {\n resetStorages.add(key as keyof StoragesResults);\n // this.storagesResults[key as keyof AppStateManager['storagesResults']].length = 0;\n }\n\n replaceState(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 log('will refresh state', state.stateCreatedTime, time);\n }\n\n const r = (keys: typeof REFRESH_KEYS) => {\n keys.forEach((key) => {\n pushToState(key, copy(STATE_INIT[key]));\n\n // const s = appStateManager.storagesResults[key as keyof AppStateManager['storagesResults']];\n // if(s?.length) {\n // appStateManager.resetStorages.add(key as keyof AppStateManager['storagesResults']);\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 // * migrate auto download settings\n const autoDownloadSettings = state.settings.autoDownload;\n if(autoDownloadSettings?.private !== undefined) {\n const oldTypes = [\n 'contacts' as const,\n 'private' as const,\n 'groups' as const,\n 'channels' as const\n ];\n\n const mediaTypes = [\n 'photo' as const,\n 'video' as const,\n 'file' as const\n ];\n\n mediaTypes.forEach((mediaType) => {\n const peerTypeSettings: AutoDownloadPeerTypeSettings = autoDownloadSettings[mediaType] = {} as any;\n oldTypes.forEach((peerType) => {\n peerTypeSettings[peerType] = autoDownloadSettings[peerType];\n });\n });\n\n oldTypes.forEach((peerType) => {\n delete autoDownloadSettings[peerType];\n });\n\n pushToState('settings', state.settings);\n }\n\n const SKIP_VALIDATING_PATHS: Set = new Set([\n 'settings.themes'\n ]);\n validateInitObject(STATE_INIT, state, (missingKey) => {\n pushToState(missingKey as keyof State, state[missingKey as keyof State]);\n }, undefined, SKIP_VALIDATING_PATHS);\n\n let newVersion: string, oldVersion: string;\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 || state.build < 179 || */state.build < 217) {\n state.allDialogsLoaded = copy(STATE_INIT.allDialogsLoaded);\n state.pinnedOrders = copy(STATE_INIT.pinnedOrders);\n state.filtersArr = copy(STATE_INIT.filtersArr);\n\n resetStorages.add('dialogs');\n }\n\n if(compareVersion(state.version, '1.7.1') === -1) {\n let migrated = false;\n // * migrate backgrounds (March 13, 2022; to version 1.3.0)\n if(compareVersion(state.version, '1.3.0') === -1) {\n migrated = true;\n state.settings.theme = copy(STATE_INIT.settings.theme);\n state.settings.themes = copy(STATE_INIT.settings.themes);\n } else if(compareVersion(state.version, '1.7.1') === -1) { // * migrate backgrounds (January 25th, 2023; to version 1.7.1)\n migrated = true;\n const oldThemes = state.settings.themes as any as Array<{\n name: AppTheme['name'],\n background: Background\n }>;\n\n state.settings.themes = copy(STATE_INIT.settings.themes);\n\n try {\n oldThemes.forEach((oldTheme) => {\n const oldBackground = oldTheme.background;\n if(!oldBackground) {\n return;\n }\n\n const newTheme = state.settings.themes.find((t) => t.name === oldTheme.name);\n newTheme.settings.highlightningColor = oldBackground.highlightningColor;\n\n const getColorFromHex = (hex: string) => hex && parseInt(hex.slice(1), 16);\n\n const colors = (oldBackground.color || '').split(',').map(getColorFromHex);\n\n if(oldBackground.color && !oldBackground.slug) {\n newTheme.settings.wallpaper = {\n _: 'wallPaperNoFile',\n id: 0,\n pFlags: {},\n settings: {\n _: 'wallPaperSettings',\n pFlags: {}\n }\n };\n } else {\n const wallPaper: WallPaper.wallPaper = {\n _: 'wallPaper',\n id: 0,\n access_hash: 0,\n slug: oldBackground.slug,\n document: {} as any,\n pFlags: {},\n settings: {\n _: 'wallPaperSettings',\n pFlags: {}\n }\n };\n\n const wallPaperSettings = wallPaper.settings;\n newTheme.settings.wallpaper = wallPaper;\n if(oldBackground.slug && !oldBackground.color) {\n wallPaperSettings.pFlags.blur = oldBackground.blur || undefined;\n } else if(oldBackground.intensity) {\n wallPaperSettings.intensity = oldBackground.intensity;\n wallPaper.pFlags.pattern = true;\n wallPaper.pFlags.dark = oldBackground.intensity < 0 || undefined;\n }\n }\n\n if(colors.length) {\n const wallPaperSettings = newTheme.settings.wallpaper.settings;\n wallPaperSettings.background_color = colors[0];\n wallPaperSettings.second_background_color = colors[1];\n wallPaperSettings.third_background_color = colors[2];\n wallPaperSettings.fourth_background_color = colors[3];\n }\n });\n } catch(err) {\n console.error('migrating themes error', err);\n }\n }\n\n if(migrated) {\n pushToState('settings', state.settings);\n }\n }\n\n if(compareVersion(state.version, STATE_VERSION) !== 0) {\n newVersion = STATE_VERSION;\n oldVersion = state.version;\n }\n\n pushToState('version', STATE_VERSION);\n pushToState('build', BUILD);\n }\n\n if(sessionBuild !== BUILD && (!sessionBuild || sessionBuild < BUILD)) {\n sessionStorage.set({k_build: BUILD});\n }\n\n // ! probably there is better place for it\n rootScope.settings = state.settings;\n\n if(DEBUG) {\n log('state res', state, copy(state));\n }\n\n // return resolve();\n\n log.warn('total', performance.now() - totalPerf);\n\n // RESET_STORAGES_PROMISE.resolve(appStateManager.resetStorages);\n\n return {state, resetStorages, newVersion, oldVersion, pushedKeys};\n}\n\nlet promise: ReturnType;\nexport default function loadState() {\n return promise ??= loadStateInner();\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 {Awaited} from '../../types';\nimport type {CacheStorageDbName} from '../files/cacheStorage';\nimport type {State} from '../../config/state';\nimport type {Message, MessagePeerReaction, PeerNotifySettings} from '../../layer';\nimport {CryptoMethods} from '../crypto/crypto_methods';\nimport rootScope from '../rootScope';\nimport webpWorkerController from '../webp/webpWorkerController';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport sessionStorage from '../sessionStorage';\nimport webPushApiManager from './webPushApiManager';\nimport appRuntimeManager from '../appManagers/appRuntimeManager';\nimport telegramMeWebManager from './telegramMeWebManager';\nimport pause from '../../helpers/schedulers/pause';\nimport ENVIRONMENT from '../../environment';\nimport loadState from '../appManagers/utils/state/loadState';\nimport opusDecodeController from '../opusDecodeController';\nimport MTProtoMessagePort from './mtprotoMessagePort';\nimport cryptoMessagePort from '../crypto/cryptoMessagePort';\nimport SuperMessagePort from './superMessagePort';\nimport IS_SHARED_WORKER_SUPPORTED from '../../environment/sharedWorkerSupport';\nimport toggleStorages from '../../helpers/toggleStorages';\nimport idleController from '../../helpers/idleController';\nimport ServiceMessagePort from '../serviceWorker/serviceMessagePort';\nimport App from '../../config/app';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\n\nexport type Mirrors = {\n state: State\n};\n\nexport type MirrorTaskPayload = {\n name: T,\n key?: K,\n value: any\n};\n\nexport type NotificationBuildTaskPayload = {\n message: Message.message | Message.messageService,\n fwdCount?: number,\n peerReaction?: MessagePeerReaction,\n peerTypeNotifySettings?: PeerNotifySettings\n};\n\nexport type TabState = {\n chatPeerIds: PeerId[],\n idleStartTime: number,\n};\n\nclass ApiManagerProxy extends MTProtoMessagePort {\n // private worker: /* Window */Worker;\n // private sockets: Map = new Map();\n private mirrors: Mirrors;\n\n public newVersion: string;\n public oldVersion: string;\n\n private tabState: TabState;\n\n public share: ShareData;\n\n public serviceMessagePort: ServiceMessagePort;\n private lastServiceWorker: ServiceWorker;\n\n private pingServiceWorkerPromise: CancellablePromise;\n\n constructor() {\n super();\n\n this.mirrors = {} as any;\n this.tabState = {\n chatPeerIds: [],\n idleStartTime: 0\n };\n\n this.log('constructor');\n\n \n this.registerWorker();\n \n\n this.registerServiceWorker();\n this.registerCryptoWorker();\n\n // const perf = performance.now();\n this.addMultipleEventsListeners({\n convertWebp: ({fileName, bytes}) => {\n return webpWorkerController.convert(fileName, bytes);\n },\n\n convertOpus: ({fileName, bytes}) => {\n return opusDecodeController.pushDecodeTask(bytes, false).then((result) => result.bytes);\n },\n\n event: ({name, args}) => {\n // @ts-ignore\n rootScope.dispatchEventSingle(name, ...args);\n },\n\n localStorageProxy: (payload) => {\n const storageTask = payload;\n return (sessionStorage[storageTask.type] as any)(...storageTask.args);\n },\n\n mirror: this.onMirrorTask\n\n // hello: () => {\n // this.log.error('time hello', performance.now() - perf);\n // }\n });\n\n // this.addTaskListener('socketProxy', (task) => {\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 rootScope.addEventListener('language_change', (language) => {\n rootScope.managers.networkerFactory.setLanguage(language);\n });\n\n window.addEventListener('online', () => {\n rootScope.managers.networkerFactory.forceReconnectTimeout();\n });\n\n rootScope.addEventListener('logging_out', () => {\n const toClear: CacheStorageDbName[] = ['cachedFiles', 'cachedStreamChunks'];\n Promise.all([\n toggleStorages(false, true),\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 idleController.addEventListener('change', (idle) => {\n this.updateTabStateIdle(idle);\n });\n this.updateTabStateIdle(idleController.isIdle);\n\n this.log('Passing environment:', ENVIRONMENT);\n this.invoke('environment', ENVIRONMENT);\n // this.sendState();\n }\n\n public pingServiceWorkerWithIframe() {\n if(this.pingServiceWorkerPromise) {\n return this.pingServiceWorkerPromise;\n }\n\n const promise = this.pingServiceWorkerPromise = deferredPromise();\n const iframe = document.createElement('iframe');\n iframe.hidden = true;\n const onLoad = () => {\n setTimeout(() => { // ping once in 10 seconds\n this.pingServiceWorkerPromise = undefined;\n }, 10e3);\n\n clearTimeout(timeout);\n iframe.remove();\n iframe.removeEventListener('load', onLoad);\n iframe.removeEventListener('error', onLoad);\n promise.resolve();\n };\n iframe.addEventListener('load', onLoad);\n iframe.addEventListener('error', onLoad);\n iframe.src = 'ping/' + (Math.random() * 0xFFFFFFFF | 0);\n document.body.append(iframe);\n\n const timeout = window.setTimeout(onLoad, 1e3);\n return promise;\n }\n\n private attachServiceWorker(serviceWorker: ServiceWorker) {\n this.lastServiceWorker && this.serviceMessagePort.detachPort(this.lastServiceWorker);\n this.serviceMessagePort.attachSendPort(this.lastServiceWorker = serviceWorker);\n this.serviceMessagePort.invokeVoid('hello', undefined);\n }\n\n private _registerServiceWorker() {\n navigator.serviceWorker.register(\n /* webpackChunkName: \"sw\" */\n new URL('../serviceWorker/index.service', import.meta.url),\n {scope: './'}\n ).then((registration) => {\n this.log('SW registered', registration);\n\n // ! doubtful fix for hard refresh\n if(registration.active && !navigator.serviceWorker.controller) {\n return registration.unregister().then(() => {\n window.location.reload();\n });\n }\n\n const sw = registration.installing || registration.waiting || registration.active;\n sw.addEventListener('statechange', (e) => {\n this.log('SW statechange', e);\n });\n\n const controller = navigator.serviceWorker.controller || registration.installing || registration.waiting || registration.active;\n this.attachServiceWorker(controller);\n\n \n \n \n }, (err) => {\n this.log.error('SW registration failed!', err);\n\n this.invokeVoid('serviceWorkerOnline', false);\n });\n }\n\n private registerServiceWorker() {\n if(!('serviceWorker' in navigator)) return;\n\n this.serviceMessagePort = new ServiceMessagePort();\n\n // this.addMultipleEventsListeners({\n // hello: () => {\n // // this.serviceMessagePort.invokeVoid('port', undefined);\n // }\n // });\n\n // ! I hate webpack - it won't load it by using worker.register, only navigator.serviceWorker will do it.\n const worker = navigator.serviceWorker;\n this._registerServiceWorker();\n\n // worker.startMessages();\n\n worker.addEventListener('controllerchange', () => {\n this.log.warn('controllerchange');\n\n const controller = worker.controller;\n this.attachServiceWorker(controller);\n\n controller.addEventListener('error', (e) => {\n this.log.error('controller error:', e);\n });\n });\n\n \n \n \n this.serviceMessagePort.attachListenPort(worker);\n this.serviceMessagePort.addMultipleEventsListeners({\n port: (payload, source, event) => {\n this.invokeVoid('serviceWorkerPort', undefined, undefined, [event.ports[0]]);\n },\n\n hello: (payload, source) => {\n this.serviceMessagePort.resendLockTask(source);\n },\n\n share: (payload) => {\n this.log('will try to share something');\n this.share = payload;\n }\n });\n \n\n worker.addEventListener('messageerror', (e) => {\n this.log.error('SW messageerror:', e);\n });\n }\n\n private async registerCryptoWorker() {\n const get = (url: string) => {\n return fetch(url).then((response) => response.text()).then((text) => {\n const pathnameSplitted = location.pathname.split('/');\n pathnameSplitted[pathnameSplitted.length - 1] = '';\n const pre = location.origin + pathnameSplitted.join('/');\n text = `\n var originalImportScripts = importScripts; \n importScripts = (url) => {\n console.log('importScripts', url);\n var newUrl = '${pre}' + url.split('/').pop();\n return originalImportScripts(newUrl);\n };\n ${text}`;\n const blob = new Blob([text], {type: 'application/javascript'});\n return blob;\n });\n };\n\n const workerHandler = {\n construct(target: any, args: any): any {\n const url = args[0] + location.search;\n return {url};\n }\n };\n\n const originals = [\n Worker,\n typeof(SharedWorker) !== 'undefined' && SharedWorker\n ].filter(Boolean);\n originals.forEach((w) => window[w.name as any] = new Proxy(w, workerHandler));\n\n const worker: SharedWorker | Worker = new Worker(\n /* webpackChunkName: \"crypto.worker\" */\n new URL('../crypto/crypto.worker.ts', import.meta.url),\n {type: 'module'}\n );\n\n originals.forEach((w) => window[w.name as any] = w as any);\n\n const originalUrl = (worker as any).url;\n\n const createWorker = (url: string) => new constructor(url, {type: 'module'});\n const attachWorkerToPort = (worker: SharedWorker | Worker) => this.attachWorkerToPort(worker, cryptoMessagePort, 'crypto');\n const constructor = IS_SHARED_WORKER_SUPPORTED ? SharedWorker : Worker;\n\n // let cryptoWorkers = workers.length;\n cryptoMessagePort.addEventListener('port', (payload, source, event) => {\n this.invokeVoid('cryptoPort', undefined, undefined, [event.ports[0]]);\n // .then((attached) => {\n // if(!attached && cryptoWorkers-- > 1) {\n // this.log.error('terminating unneeded crypto worker');\n\n // cryptoMessagePort.invokeVoid('terminate', undefined, source);\n // const worker = workers.find((worker) => (worker as SharedWorker).port === source || (worker as any) === source);\n // if((worker as SharedWorker).port) (worker as SharedWorker).port.close();\n // else (worker as Worker).terminate();\n // cryptoMessagePort.detachPort(source);\n // }\n // });\n });\n\n const firstWorker = createWorker(originalUrl);\n attachWorkerToPort(firstWorker);\n\n const blob = await get(originalUrl);\n const urlsPromise = await this.invoke('createProxyWorkerURLs', {originalUrl, blob});\n const workers = urlsPromise.slice(1).map(createWorker);\n workers.forEach(attachWorkerToPort);\n }\n\n \n private registerWorker() {\n // return;\n\n let worker: SharedWorker | Worker;\n if(IS_SHARED_WORKER_SUPPORTED) {\n worker = new SharedWorker(\n /* webpackChunkName: \"mtproto.worker\" */\n new URL('./mtproto.worker.ts', import.meta.url),\n {type: 'module'}\n );\n } else {\n worker = new Worker(\n /* webpackChunkName: \"mtproto.worker\" */\n new URL('./mtproto.worker.ts', import.meta.url),\n {type: 'module'}\n );\n }\n\n this.onWorkerFirstMessage(worker);\n }\n \n\n private attachWorkerToPort(worker: SharedWorker | Worker, messagePort: SuperMessagePort, type: string) {\n const port: MessagePort = (worker as SharedWorker).port || worker as any;\n messagePort.attachPort(port);\n\n worker.addEventListener('error', (err) => {\n this.log.error(type, 'worker error', err);\n });\n }\n\n private onWorkerFirstMessage(worker: any) {\n this.log('set webWorker');\n\n // this.worker = worker;\n \n \n \n this.attachWorkerToPort(worker, this, 'mtproto');\n \n }\n\n private loadState() {\n return Promise.all([\n loadState().then((stateResult) => {\n this.newVersion = stateResult.newVersion;\n this.oldVersion = stateResult.oldVersion;\n this.mirrors['state'] = stateResult.state;\n return stateResult;\n })\n // loadStorages(createStorages()),\n ]);\n }\n\n public sendState() {\n return this.loadState().then((result) => {\n const [stateResult] = result;\n this.invoke('state', {...stateResult, userId: rootScope.myId.toUserId()});\n return result;\n });\n }\n\n \n public invokeCrypto(method: Method, ...args: Parameters): Promise>> {\n return cryptoMessagePort.invokeCrypto(method, ...args);\n }\n \n\n public async toggleStorages(enabled: boolean, clearWrite: boolean) {\n await toggleStorages(enabled, clearWrite);\n this.invoke('toggleStorages', {enabled, clearWrite});\n this.serviceMessagePort.invokeVoid('toggleStorages', {enabled, clearWrite});\n }\n\n public async getMirror(name: T) {\n const mirror = this.mirrors[name];\n return mirror;\n }\n\n public getState() {\n return this.getMirror('state');\n }\n\n public updateTabState(key: T, value: TabState[T]) {\n this.tabState[key] = value;\n this.invokeVoid('tabState', this.tabState);\n }\n\n public updateTabStateIdle(idle: boolean) {\n this.updateTabState('idleStartTime', idle ? Date.now() : 0);\n }\n\n private onMirrorTask = (payload: MirrorTaskPayload) => {\n const {name, key, value} = payload;\n if(!payload.hasOwnProperty('key')) {\n this.mirrors[name] = value;\n return;\n }\n\n const mirror = this.mirrors[name] ??= {} as any;\n if(value === undefined) {\n delete mirror[key];\n } else {\n mirror[key] = value;\n }\n };\n}\n\ninterface ApiManagerProxy extends MTProtoMessagePort {}\n\nconst apiManagerProxy = new ApiManagerProxy();\nMOUNT_CLASS_TO.apiManagerProxy = apiManagerProxy;\nexport default apiManagerProxy;\n","/*\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 App from '../../config/app';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport tabId from '../../config/tabId';\nimport IS_SHARED_WORKER_SUPPORTED from '../../environment/sharedWorkerSupport';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport idleController from '../../helpers/idleController';\nimport {logger} from '../logger';\nimport rootScope from '../rootScope';\nimport sessionStorage from '../sessionStorage';\nimport apiManagerProxy from './mtprotoworker';\n\nexport type AppInstance = {\n id: number,\n idle: boolean,\n time: number\n};\n\nexport type InstanceDeactivateReason = 'version' | 'tabs';\n\nconst CHECK_INSTANCE_INTERVAL = 5000;\nconst DEACTIVATE_TIMEOUT = 30000;\nconst MULTIPLE_TABS_THRESHOLD = 20000;\nconst IS_MULTIPLE_TABS_SUPPORTED = IS_SHARED_WORKER_SUPPORTED;\n\nexport class SingleInstance extends EventListenerBase<{\n activated: () => void,\n deactivated: (reason: InstanceDeactivateReason) => void\n}> {\n private instanceId: number;\n private started: boolean;\n private masterInstance: boolean;\n private deactivateTimeout: number;\n private deactivated: InstanceDeactivateReason;\n private log = logger('INSTANCE');\n\n constructor() {\n super(false);\n\n this.log = logger('INSTANCE');\n this.instanceId = tabId;\n }\n\n public get deactivatedReason() {\n return this.deactivated;\n }\n\n public start() {\n this.reset();\n\n if(!this.started/* && !Config.Navigator.mobile && !Config.Modes.packed */) {\n this.started = true;\n\n idleController.addEventListener('change', 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 private reset() {\n this.masterInstance = false;\n this.clearDeactivateTimeout();\n this.deactivated = undefined;\n }\n\n private 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 this.dispatchEvent('activated');\n }\n }\n\n private deactivateInstance(reason: InstanceDeactivateReason) {\n if(this.masterInstance || this.deactivated) {\n return;\n }\n\n this.log.warn('deactivate', reason);\n this.clearDeactivateTimeout();\n this.deactivated = reason;\n\n this.dispatchEvent('deactivated', reason);\n }\n\n private clearDeactivateTimeout() {\n if(this.deactivateTimeout) {\n clearTimeout(this.deactivateTimeout);\n this.deactivateTimeout = 0;\n }\n }\n\n private checkInstance = async(idle = idleController.isIdle) => {\n if(this.deactivated) {\n return;\n }\n\n const time = Date.now();\n const newInstance: AppInstance = {\n id: this.instanceId,\n idle,\n time\n };\n\n const [curInstance, build = App.build] = await Promise.all([\n sessionStorage.get('xt_instance', false),\n sessionStorage.get('k_build', false)\n ]);\n\n if(build > App.build) {\n this.masterInstance = false;\n rootScope.managers.networkerFactory.stopAll();\n this.deactivateInstance('version');\n apiManagerProxy.toggleStorages(false, false);\n return;\n } else if(IS_MULTIPLE_TABS_SUPPORTED) {\n sessionStorage.set({xt_instance: newInstance});\n return;\n }\n\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 this.masterInstance = true;\n rootScope.managers.networkerFactory.startAll();\n this.log.warn('now master instance', newInstance);\n }\n\n this.clearDeactivateTimeout();\n } else if(this.masterInstance) {\n this.masterInstance = false;\n rootScope.managers.networkerFactory.stopAll();\n this.log.warn('now idle instance', newInstance);\n this.deactivateTimeout ||= window.setTimeout(() => this.deactivateInstance('tabs'), DEACTIVATE_TIMEOUT);\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 * 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 App from '../../config/app';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport Modes from '../../config/modes';\nimport loadScript from '../../helpers/dom/loadScript';\nimport tsNow from '../../helpers/tsNow';\nimport sessionStorage from '../sessionStorage';\n\nexport class TelegramMeWebManager {\n private disabled = /* false && */(Modes.test || !App.domains.includes(location.hostname));\n\n public setAuthorized(canRedirect: boolean) {\n if(this.disabled) {\n return;\n }\n\n return sessionStorage.get('tgme_sync').then((curValue) => {\n const ts = tsNow(true);\n if(\n canRedirect &&\n curValue?.canRedirect === canRedirect &&\n (curValue.ts + 86400) > ts\n ) {\n return;\n }\n\n sessionStorage.set({\n tgme_sync: {\n canRedirect,\n ts\n }\n });\n\n const path = `_websync_?authed=${canRedirect ? '1' : '0'}&version=${encodeURIComponent(App.version + ' ' + App.suffix)}`;\n const urls = [\n '//telegram.me/' + path,\n '//t.me/' + path\n ];\n\n const promises = urls.map((url) => {\n return loadScript(url).then((script) => {\n script.remove();\n });\n });\n\n return Promise.all(promises);\n });\n }\n}\n\nconst telegramMeWebManager = new TelegramMeWebManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.telegramMeWebManager = telegramMeWebManager);\nexport default telegramMeWebManager;\n","/*\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 loadScript(url: string) {\n const script = document.createElement('script');\n const promise = new Promise((resolve) => {\n script.onload = script.onerror = () => {\n resolve(script);\n };\n });\n script.src = url;\n document.body.appendChild(script);\n return promise;\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 type {PushNotificationObject} from '../serviceWorker/push';\nimport type {ServicePushPingTaskPayload} from '../serviceWorker/serviceMessagePort';\nimport type {NotificationSettings} from '../appManagers/uiNotificationsManager';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {logger} from '../logger';\nimport apiManagerProxy from './mtprotoworker';\nimport I18n, {LangPackKey} from '../langPack';\nimport {IS_MOBILE} from '../../environment/userAgent';\nimport appRuntimeManager from '../appManagers/appRuntimeManager';\nimport copy from '../../helpers/object/copy';\nimport singleInstance from './singleInstance';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport getServerMessageId from '../appManagers/utils/messageId/getServerMessageId';\n\nexport type PushSubscriptionNotifyType = 'init' | 'subscribe' | 'unsubscribe';\nexport type PushSubscriptionNotifyEvent = `push_${PushSubscriptionNotifyType}`;\n\nexport type PushSubscriptionNotify = {\n tokenType: number,\n tokenValue: string\n};\n\nconst PING_PUSH_INTERVAL = 10000;\n\nexport class WebPushApiManager extends EventListenerBase<{\n push_notification_click: (n: PushNotificationObject) => void,\n push_init: (n: PushSubscriptionNotify) => void,\n push_subscribe: (n: PushSubscriptionNotify) => void,\n push_unsubscribe: (n: PushSubscriptionNotify) => void\n}> {\n public isAvailable = true;\n private isPushEnabled = false;\n private localNotificationsAvailable = true;\n private started = false;\n private settings: NotificationSettings & {baseUrl?: string} = {} as any;\n private isAliveTO: any;\n private isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n private userVisibleOnly = this.isFirefox ? false : true;\n private log = logger('PM');\n\n constructor() {\n super(false);\n\n if(!('PushManager' in window) ||\n !('Notification' in window) ||\n !('serviceWorker' in navigator)) {\n this.log.warn('Push messaging is not supported.');\n this.isAvailable = false;\n this.localNotificationsAvailable = false;\n }\n\n if(this.isAvailable && Notification.permission === 'denied') {\n this.log.warn('The user has blocked notifications.');\n }\n }\n\n public start() {\n if(!this.started) {\n this.started = true;\n this.getSubscription();\n this.setUpServiceWorkerChannel();\n }\n }\n\n public setLocalNotificationsDisabled() {\n this.localNotificationsAvailable = false;\n }\n\n public getSubscription() {\n if(!this.isAvailable) {\n return;\n }\n\n navigator.serviceWorker.ready.then((reg) => {\n reg.pushManager.getSubscription().then((subscription) => {\n this.isPushEnabled = !!subscription;\n this.pushSubscriptionNotify('init', subscription);\n }).catch((err) => {\n this.log.error('Error during getSubscription()', err);\n });\n });\n }\n\n public subscribe = () => {\n if(!this.isAvailable) {\n return;\n }\n\n navigator.serviceWorker.ready.then((reg) => {\n reg.pushManager.subscribe({userVisibleOnly: this.userVisibleOnly}).then((subscription) => {\n // The subscription was successful\n this.isPushEnabled = true;\n this.pushSubscriptionNotify('subscribe', subscription);\n }).catch((e) => {\n if(Notification.permission === 'denied') {\n this.log('Permission for Notifications was denied');\n } else {\n this.log('Unable to subscribe to push.', e);\n if(!this.userVisibleOnly) {\n this.userVisibleOnly = true;\n setTimeout(this.subscribe, 0);\n }\n }\n });\n });\n }\n\n public unsubscribe() {\n if(!this.isAvailable) {\n return;\n }\n\n navigator.serviceWorker.ready.then((reg) => {\n reg.pushManager.getSubscription().then((subscription) => {\n this.isPushEnabled = false;\n\n if(subscription) {\n this.pushSubscriptionNotify('unsubscribe', subscription);\n\n setTimeout(() => {\n subscription.unsubscribe().then((successful) => {\n this.isPushEnabled = false;\n }).catch((e) => {\n this.log.error('Unsubscription error: ', e);\n });\n }, 3000);\n }\n }).catch((e) => {\n this.log.error('Error thrown while unsubscribing from ' +\n 'push messaging.', e);\n });\n });\n }\n\n public forceUnsubscribe() {\n if(!this.isAvailable) {\n return;\n }\n\n navigator.serviceWorker.ready.then((reg) => {\n reg.pushManager.getSubscription().then((subscription) => {\n this.log.warn('force unsubscribe', subscription);\n if(subscription) {\n subscription.unsubscribe().then((successful) => {\n this.log.warn('force unsubscribe successful', successful);\n this.isPushEnabled = false;\n }).catch((e) => {\n this.log.error('Unsubscription error: ', e);\n });\n }\n }).catch((e) => {\n this.log.error('Error thrown while unsubscribing from ' +\n 'push messaging.', e);\n });\n });\n }\n\n public isAliveNotify = () => {\n if(!this.isAvailable || singleInstance.deactivatedReason) {\n return;\n }\n\n this.settings.baseUrl = (location.href || '').replace(/#.*$/, '');\n\n const lang: ServicePushPingTaskPayload['lang'] = {} as any;\n const ACTIONS_LANG_MAP: Record = {\n push_action_mute1d: IS_MOBILE ? 'PushNotification.Action.Mute1d.Mobile' : 'PushNotification.Action.Mute1d',\n push_action_settings: IS_MOBILE ? 'PushNotification.Action.Settings.Mobile' : 'PushNotification.Action.Settings',\n push_message_nopreview: 'PushNotification.Message.NoPreview'\n };\n\n for(const action in ACTIONS_LANG_MAP) {\n lang[action as keyof typeof ACTIONS_LANG_MAP] = I18n.format(ACTIONS_LANG_MAP[action as keyof typeof ACTIONS_LANG_MAP], true);\n }\n\n apiManagerProxy.serviceMessagePort.invokeVoid('pushPing', {\n localNotifications: this.localNotificationsAvailable,\n lang: lang,\n settings: this.settings\n });\n\n this.isAliveTO = setTimeout(this.isAliveNotify, PING_PUSH_INTERVAL);\n }\n\n public setSettings(newSettings: WebPushApiManager['settings']) {\n this.settings = copy(newSettings);\n clearTimeout(this.isAliveTO);\n this.isAliveNotify();\n }\n\n public hidePushNotifications() {\n if(!this.isAvailable) {\n return;\n }\n\n apiManagerProxy.serviceMessagePort.invokeVoid('notificationsClear', undefined);\n }\n\n public setUpServiceWorkerChannel() {\n if(!this.isAvailable) {\n return;\n }\n\n apiManagerProxy.serviceMessagePort.addEventListener('pushClick', (payload) => {\n if(singleInstance.deactivatedReason) {\n appRuntimeManager.reload();\n return;\n }\n\n this.dispatchEvent('push_notification_click', payload);\n });\n\n navigator.serviceWorker.ready.then(this.isAliveNotify);\n }\n\n public pushSubscriptionNotify(event: PushSubscriptionNotifyType, subscription?: PushSubscription) {\n if(subscription) {\n const subscriptionObj: PushSubscriptionJSON = subscription.toJSON();\n if(!subscriptionObj ||\n !subscriptionObj.endpoint ||\n !subscriptionObj.keys ||\n !subscriptionObj.keys.p256dh ||\n !subscriptionObj.keys.auth) {\n this.log.warn('Invalid push subscription', subscriptionObj);\n this.unsubscribe();\n this.isAvailable = false;\n this.pushSubscriptionNotify(event);\n return;\n }\n\n this.log.warn('Push', event, subscriptionObj);\n this.dispatchEvent(('push_' + event) as PushSubscriptionNotifyEvent, {\n tokenType: 10,\n tokenValue: JSON.stringify(subscriptionObj)\n });\n } else {\n this.log.warn('Push', event, false);\n this.dispatchEvent(('push_' + event) as PushSubscriptionNotifyEvent, false as any);\n }\n }\n\n public ignorePushByMid(peerId: PeerId, mid: number) {\n if(!this.isAvailable) {\n return;\n }\n\n apiManagerProxy.serviceMessagePort.invokeVoid('shownNotification', peerId + '_' + getServerMessageId(mid));\n }\n}\n\nconst webPushApiManager = new WebPushApiManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.webPushApiManager = webPushApiManager);\nexport default webPushApiManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport IS_OPUS_SUPPORTED from '../environment/opusSupport';\nimport {IS_SAFARI} from '../environment/userAgent';\nimport {Modify} from '../types';\nimport {logger, LogTypes} from './logger';\nimport apiManagerProxy from './mtproto/mtprotoworker';\nimport type {ConvertWebPTask} from './webp/webpWorkerController';\n\ntype Result = {\n bytes: Uint8Array,\n waveform?: Uint8Array\n};\n\ntype Task = {\n pages: Uint8Array,\n withWaveform: boolean,\n waveform?: Uint8Array,\n callback: {resolve: (result: Result) => void, reject: (err: any) => void},\n timeout: number\n};\n\nexport interface ConvertOpusTask extends Modify {\n type: 'convertOpus'\n}\n\nexport class OpusDecodeController {\n private worker: Worker;\n private wavWorker: Worker;\n private sampleRate = 48000;\n private tasks: Array = [];\n private keepAlive = false;\n private log = logger('OPUS', LogTypes.Error);\n\n public isPlaySupported() {\n return IS_OPUS_SUPPORTED;\n }\n\n public loadWavWorker() {\n if(this.wavWorker) return;\n\n this.wavWorker = new Worker('waveWorker.min.js');\n this.wavWorker.addEventListener('message', (e) => {\n const data = e.data;\n\n this.log('[WAV] got message:', data);\n if(data && data.page) {\n const bytes = data.page;\n this.onTaskEnd(this.tasks.shift(), bytes);\n }\n });\n }\n\n public loadWorker() {\n if(this.worker) return;\n\n this.worker = new Worker('decoderWorker.min.js');\n this.worker.addEventListener('message', (e) => {\n const data = e.data;\n\n this.log('[DECODER] got message', data);\n if(data.type === 'done') {\n // this.log('[DECODER] send done to wav');\n this.wavWorker.postMessage({command: 'done'});\n\n if(data.waveform) {\n this.tasks[0].waveform = data.waveform;\n }\n } else { // e.data contains decoded buffers as float32 values\n // this.log('[DECODER] send encode to wav');\n this.wavWorker.postMessage({\n command: 'encode',\n buffers: e.data\n }, IS_SAFARI ? undefined : data.map((typedArray: Uint8Array) => typedArray.buffer));\n }\n });\n }\n\n public setKeepAlive(keepAlive: boolean) {\n this.keepAlive = keepAlive;\n if(this.keepAlive) {\n this.loadWorker();\n this.loadWavWorker();\n } else if(!this.tasks.length) {\n this.terminateWorkers();\n }\n }\n\n public onTaskEnd(task: Task, result?: Uint8Array) {\n if(!result) {\n task.callback.reject('timeout');\n } else {\n clearTimeout(task.timeout);\n task.callback.resolve({bytes: result, waveform: task.waveform});\n }\n\n if(this.tasks.length) {\n this.executeNewTask(this.tasks[0]);\n }\n\n this.terminateWorkers();\n }\n\n public terminateWorkers(kill = false) {\n if((this.keepAlive || this.tasks.length) && !kill) return;\n\n if(this.worker) {\n this.worker.terminate();\n this.worker = null;\n }\n\n if(this.wavWorker) {\n this.wavWorker.terminate();\n this.wavWorker = null;\n }\n }\n\n public executeNewTask(task: Task) {\n this.worker.postMessage({\n command: 'init',\n decoderSampleRate: this.sampleRate,\n outputBufferSampleRate: this.sampleRate\n });\n\n this.wavWorker.postMessage({\n command: 'init',\n wavBitDepth: 16,\n wavSampleRate: this.sampleRate\n });\n\n // console.log('sending command to worker:', task);\n // setTimeout(() => {\n this.log('[DECODER] send decode');\n this.worker.postMessage({\n command: 'decode',\n pages: task.pages,\n waveform: task.withWaveform\n }, IS_SAFARI ? undefined : [task.pages.buffer]);\n // }, 1e3);\n\n task.timeout = window.setTimeout(() => {\n this.log.error('decode timeout'/* , task */);\n\n this.terminateWorkers(true);\n if(this.tasks.length) {\n this.loadWorker();\n this.loadWavWorker();\n }\n\n this.onTaskEnd(this.tasks.shift());\n }, 10e3);\n }\n\n public pushDecodeTask(pages: Uint8Array, withWaveform: boolean) {\n return new Promise((resolve, reject) => {\n const task = {\n pages,\n withWaveform,\n callback: {resolve, reject},\n timeout: 0\n };\n\n this.loadWorker();\n this.loadWavWorker();\n\n if(this.tasks.push(task) === 1) {\n this.executeNewTask(task);\n }\n });\n }\n\n public async decode(typedArray: Uint8Array, withWaveform = false) {\n return this.pushDecodeTask(typedArray, withWaveform).then(async(result) => {\n const dataBlob = new Blob([result.bytes], {type: 'audio/wav'});\n return {url: await apiManagerProxy.invoke('createObjectURL', dataBlob), waveform: result.waveform};\n });\n }\n}\n\nconst opusDecodeController = new OpusDecodeController();\nMOUNT_CLASS_TO.opusDecodeController = opusDecodeController;\nexport default opusDecodeController;\n","/*\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 emojiRegExp from '../../vendor/emoji/regex';\nimport {MessageEntity} from '../../layer';\n\nconst EmojiHelper = {\n emojiMap: (code: string) => { return code; },\n shortcuts: [] as any,\n emojis: [] as any\n};\n\nexport const ALPHA_CHARS_REG_EXP = '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)\nexport const ALPHA_NUMERIC_REG_EXP = '0-9\\_' + ALPHA_CHARS_REG_EXP;\nexport const DOMAIN_ADD_CHARS = '\\u00b7';\n// Based on Regular Expression for URL validation by Diego Perini\nexport const URL_ALPHANUMERIC_REG_EXP_PART = '[' + ALPHA_CHARS_REG_EXP + '0-9]';\nexport const URL_PROTOCOL_REG_EXP_PART = '((?:https?|ftp)://|mailto:)?';\nexport const URL_REG_EXP = URL_PROTOCOL_REG_EXP_PART +\n // user:pass authentication\n '(?:' + URL_ALPHANUMERIC_REG_EXP_PART + '{1,64}(?::' + URL_ALPHANUMERIC_REG_EXP_PART + '{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 URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}' +\n // domain name\n '(?:\\\\.' + URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}){0,10}' +\n // TLD identifier\n '(?:\\\\.(xn--[0-9a-z]{2,16}|[' + ALPHA_CHARS_REG_EXP + ']{2,24}))' +\n ')' +\n // port number\n '(?::\\\\d{2,5})?' +\n // resource path\n '(?:/(?:\\\\S{0,255}[^\\\\s.;,(\\\\[\\\\]{}<>\"\\'])?)?';\nexport const URL_PROTOCOL_REG_EXP = new RegExp('^' + URL_PROTOCOL_REG_EXP_PART.slice(0, -1), 'i');\nexport const URL_ANY_PROTOCOL_REG_EXP = /^((?:[^\\/]+?):\\/\\/|mailto:)/;\nexport const USERNAME_REG_EXP = '[a-zA-Z\\\\d_]{5,32}';\nexport const BOT_COMMAND_REG_EXP = '\\\\/([a-zA-Z\\\\d_]{1,32})(?:@(' + USERNAME_REG_EXP + '))?(\\\\b|$)';\nexport const FULL_REG_EXP = new RegExp('(^| )(@)(' + USERNAME_REG_EXP + ')|(' + URL_REG_EXP + ')|(\\\\n)|(' + emojiRegExp + ')|(^|[\\\\s\\\\(\\\\]])(#[' + ALPHA_NUMERIC_REG_EXP + ']{2,64})|(^|\\\\s)' + BOT_COMMAND_REG_EXP, 'i');\nexport const EMAIL_REG_EXP = /^(([^<>()[\\]\\\\.,;:\\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 = /[`_*@~]/;\nexport const MARKDOWN_REG_EXP = /(^|\\s|\\n)(````?)([\\s\\S]+?)(````?)([\\s\\n\\.,:?!;]|$)|(^|\\s|\\x01)(`|~~|\\*\\*|__|_-_|\\|\\|)([^\\n]+?)\\7([\\x01\\s\\.,:?!;]|$)|@(\\d+)\\s*\\((.+?)\\)|(\\[(.+?)\\]\\((.+?)\\))/m;\nexport const SITE_HASHTAGS: {[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\n// export const SITE_MENTIONS: {[siteName in 'Telegram' | 'Twitter' | 'Instagram' | 'GitHub']: string} = {\n// Telegram: '#{1}',\n// Twitter: 'https://twitter.com/{1}',\n// Instagram: 'https://instagram.com/{1}/',\n// GitHub: 'https://github.com/{1}'\n// };\n\nexport const MARKDOWN_ENTITIES: {[markdown: string]: MessageEntity['_']} = {\n '`': 'messageEntityCode',\n '``': 'messageEntityPre',\n '**': 'messageEntityBold',\n '__': 'messageEntityItalic',\n '~~': 'messageEntityStrike',\n '_-_': 'messageEntityUnderline',\n '||': 'messageEntitySpoiler'\n};\n\nexport const PASS_CONFLICTING_ENTITIES: Set = new Set([\n 'messageEntityEmoji',\n 'messageEntityLinebreak',\n 'messageEntityCaret'\n]);\nfor(const i in MARKDOWN_ENTITIES) {\n PASS_CONFLICTING_ENTITIES.add(MARKDOWN_ENTITIES[i]);\n}\n\nexport const PHONE_NUMBER_REG_EXP = /^\\+\\d+$/;\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\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 * 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 addAnchorListener from '../../helpers/addAnchorListener';\nimport {PHONE_NUMBER_REG_EXP} from '.';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport matchUrlProtocol from './matchUrlProtocol';\nimport {T_ME_PREFIXES} from '../mtproto/mtproto_config';\n\nexport default function wrapUrl(url: string, unsafe?: number | boolean) {\n if(!matchUrlProtocol(url)) {\n url = 'https://' + url;\n }\n\n const out: {url: string, onclick?: Parameters[0]['name']} = {url};\n let tgMeMatch, telescoPeMatch, tgMatch;\n let onclick: typeof out['onclick'];\n /* if(unsafe === 2) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } else */if((tgMeMatch = url.match(/^(?:https?:\\/\\/)?(?:(.+?)\\.)?(?:(?:web|k|z)\\.)?t(?:elegram)?\\.me(?:\\/(.+))?/))) {\n const u = new URL(url);\n let prefix = tgMeMatch[1];\n if(prefix && T_ME_PREFIXES.has(tgMeMatch[1])) {\n prefix = undefined;\n }\n\n if(prefix) {\n u.pathname = prefix + (u.pathname === '/' ? '' : u.pathname);\n }\n\n const fullPath = u.pathname.slice(1);\n const path = fullPath.split('/');\n\n if(path[0] && path[0][0] === '$' && path[0].length > 1) {\n onclick = 'invoice';\n } else if(/^\\W/.test(fullPath) && !PHONE_NUMBER_REG_EXP.test(fullPath)) { // second regexp is for phone numbers (t.me/+38050...)\n onclick = 'joinchat';\n } else switch(path[0]) {\n case 'joinchat':\n case 'addstickers':\n case 'addemoji':\n case 'voicechat':\n case 'invoice':\n if(path.length !== 1 && !prefix) {\n onclick = path[0];\n break;\n }\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] as any;\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 out.onclick = onclick;\n return out;\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.wrapUrl = wrapUrl);\n","/*\n * 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, PollResults, Poll, WebPage, GroupCall, GroupCallParticipant, ReactionCount, MessagePeerReaction, PhoneCall, Config, Reaction} from '../layer';\nimport type {Dialog, ForumTopic, MessagesStorageKey, MyMessage} from './appManagers/appMessagesManager';\nimport type {MyDialogFilter} from './storages/filters';\nimport type {Folder} from './storages/dialogs';\nimport type {UserTyping} from './appManagers/appProfileManager';\nimport type {MyDraftMessage} from './appManagers/appDraftsManager';\nimport type {ConnectionStatusChange} from './mtproto/connectionStatus';\nimport type {GroupCallId} from './appManagers/appGroupCallsManager';\nimport type {AppManagers} from './appManagers/managers';\nimport type {State} from '../config/state';\nimport type {Progress} from './appManagers/appDownloadManager';\nimport type {CallId} from './appManagers/appCallsManager';\nimport type {MyDocument} from './appManagers/appDocsManager';\nimport type {MTAppConfig} from './mtproto/appConfig';\nimport {NULL_PEER_ID, UserAuth} from './mtproto/mtproto_config';\nimport EventListenerBase from '../helpers/eventListenerBase';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport MTProtoMessagePort from './mtproto/mtprotoMessagePort';\nimport {IS_WORKER} from '../helpers/context';\n\nexport type BroadcastEvents = {\n 'chat_full_update': ChatId,\n 'chat_update': ChatId,\n 'chat_toggle_forum': {chatId: ChatId, enabled: boolean},\n\n 'channel_update': ChatId,\n\n 'user_update': UserId,\n 'user_auth': UserAuth,\n 'user_full_update': UserId,\n\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, threadId?: number, typings: UserTyping[]},\n 'peer_block': {peerId: PeerId, blocked: boolean},\n 'peer_title_edit': {peerId: PeerId, threadId?: number},\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': Omit,\n\n 'dialog_draft': {peerId: PeerId, dialog: Dialog | ForumTopic, drop: boolean, draft: MyDraftMessage | undefined},\n 'dialog_unread': {peerId: PeerId, dialog: Dialog | ForumTopic},\n 'dialog_flush': {peerId: PeerId, dialog: Dialog},\n 'dialog_drop': Dialog | ForumTopic,\n 'dialog_migrate': {migrateFrom: PeerId, migrateTo: PeerId},\n // 'dialog_top': Dialog,\n 'dialog_notify_settings': Dialog | ForumTopic,\n // 'dialog_order': {dialog: Dialog, pos: number},\n 'dialogs_multiupdate': Map}>,\n\n 'history_append': {storageKey: MessagesStorageKey, message: Message.message},\n 'history_update': {storageKey: MessagesStorageKey, message: MyMessage, sequential?: boolean},\n 'history_reply_markup': {peerId: PeerId},\n 'history_multiappend': MyMessage,\n 'history_delete': {peerId: PeerId, msgs: Set},\n 'history_forbidden': PeerId,\n 'history_reload': PeerId,\n // 'history_request': void,\n\n 'message_edit': {storageKey: MessagesStorageKey, peerId: PeerId, mid: number, message: MyMessage},\n 'message_sent': {storageKey: MessagesStorageKey, tempId: number, tempMessage: any, mid: number, message: MyMessage},\n 'message_error': {storageKey: MessagesStorageKey, tempId: number, error: ApiError},\n 'messages_views': {peerId: PeerId, mid: number, views: number}[],\n 'messages_reactions': {message: Message.message, changedResults: ReactionCount[]}[],\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': Message.message,\n 'scheduled_delete': {peerId: PeerId, mids: number[]},\n\n 'album_edit': {peerId: PeerId, groupId: string, deletedMids: number[], messages: Message.message[]},\n\n 'stickers_installed': StickerSet.stickerSet,\n 'stickers_deleted': StickerSet.stickerSet,\n 'stickers_updated': {type: 'recent' | 'faved', stickers: MyDocument[]},\n 'stickers_top': Long,\n 'sticker_updated': {type: 'recent' | 'faved', document: MyDocument, faved: boolean},\n\n 'state_cleared': void,\n 'state_synchronized': ChatId | void,\n 'state_synchronizing': ChatId | void,\n\n 'contacts_update': UserId,\n 'avatar_update': {peerId: PeerId, threadId?: number},\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, settings: State['settings']},\n 'draft_updated': {peerId: PeerId, threadId: number, draft: MyDraftMessage | undefined, force?: 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 'notification_reset': string,\n 'notification_cancel': string,\n\n 'language_change': string,\n\n 'theme_change': void,\n\n 'media_play': void,\n\n 'emoji_recent': AppEmoji,\n\n 'download_progress': Progress,\n 'document_downloading': DocId,\n 'document_downloaded': DocId,\n\n 'choosing_sticker': boolean\n\n 'group_call_update': GroupCall,\n 'group_call_participant': {groupCallId: GroupCallId, participant: GroupCallParticipant},\n // 'group_call_video_track_added': {instance: GroupCallInstance}\n\n 'call_update': PhoneCall,\n 'call_signaling': {callId: CallId, data: Uint8Array},\n\n 'quick_reaction': Reaction,\n\n 'service_notification': Update.updateServiceNotification,\n\n 'logging_out': void,\n\n 'payment_sent': {peerId: PeerId, mid: number, receiptMessage: Message.messageService}\n\n 'premium_toggle': boolean,\n 'premium_toggle_private': {isNew: boolean, isPremium: boolean},\n\n 'config': Config,\n 'app_config': MTAppConfig\n};\n\nexport type BroadcastEventsListeners = {\n [name in keyof BroadcastEvents]: (e: BroadcastEvents[name]) => void\n};\n\nexport class RootScope extends EventListenerBase {\n public myId: PeerId;\n private connectionStatus: {[name: string]: ConnectionStatusChange};\n public settings: State['settings'];\n public managers: AppManagers;\n public premium: boolean;\n\n constructor() {\n super();\n\n this.myId = NULL_PEER_ID;\n this.connectionStatus = {};\n this.premium = false;\n\n this.addEventListener('user_auth', ({id}) => {\n this.myId = id.toPeerId();\n });\n\n this.addEventListener('premium_toggle_private', ({isNew, isPremium}) => {\n this.premium = isPremium;\n\n if(!isNew) {\n this.dispatchEventSingle('premium_toggle', isPremium);\n }\n });\n\n this.addEventListener('connection_status_change', (status) => {\n this.connectionStatus[status.name] = status;\n });\n\n this.dispatchEvent = (e, ...args) => {\n super.dispatchEvent(e, ...args);\n MTProtoMessagePort.getInstance().invokeVoid('event', {name: e as string, args});\n };\n\n if(!IS_WORKER) {\n this.addEventListener('settings_updated', ({settings}) => {\n this.settings = settings;\n });\n }\n }\n\n public getConnectionStatus() {\n return this.connectionStatus;\n }\n\n public getPremium() {\n return this.premium;\n }\n\n public dispatchEventSingle(...args: any[]) {\n // @ts-ignore\n super.dispatchEvent(...args);\n }\n}\n\nconst rootScope = new RootScope();\nMOUNT_CLASS_TO.rootScope = rootScope;\nexport default rootScope;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport {WorkerTaskVoidTemplate} from '../../types';\n\nexport interface ConvertWebPTask extends WorkerTaskVoidTemplate {\n type: 'convertWebp',\n payload: {\n fileName: string,\n bytes: Uint8Array\n }\n};\n\nexport class WebpWorkerController {\n private worker: Worker;\n private convertPromises: {[fileName: string]: CancellablePromise} = {};\n\n private init() {\n this.worker = new Worker(new URL('./webp.worker.ts', import.meta.url));\n this.worker.addEventListener('message', (e) => {\n const task = e.data as ConvertWebPTask;\n const payload = task.payload;\n\n const promise = this.convertPromises[payload.fileName];\n if(promise) {\n payload.bytes ? promise.resolve(payload.bytes) : promise.reject();\n delete this.convertPromises[payload.fileName];\n }\n });\n }\n\n private postMessage(data: ConvertWebPTask) {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n this.worker.postMessage(data);\n }\n\n public convert(fileName: string, bytes: Uint8Array) {\n if(this.convertPromises.hasOwnProperty(fileName)) {\n return this.convertPromises[fileName];\n }\n\n const convertPromise = deferredPromise();\n\n this.postMessage({type: 'convertWebp', payload: {fileName, bytes}});\n\n return this.convertPromises[fileName] = convertPromise;\n }\n}\n\nconst webpWorkerController = new WebpWorkerController();\nMOUNT_CLASS_TO.webpWorkerController = webpWorkerController;\nexport default webpWorkerController;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + ({\"589\":\"crypto.worker\",\"630\":\"npm.qr-code-styling\",\"670\":\"sw\",\"678\":\"mtproto.worker\"}[chunkId] || chunkId) + \".\" + {\"8\":\"93d2f33af815eb0455aa\",\"53\":\"9088c624bc0da70fcd02\",\"61\":\"5a1b64b6ed7885fd6d34\",\"63\":\"7e1f9a4ae86bb873ca6d\",\"77\":\"b8cf11d2b5dca36479ca\",\"104\":\"476c2f411510266c35de\",\"147\":\"4eb614e56f1d9fbfd1e7\",\"231\":\"f4d1bfe6ff7f14577f96\",\"301\":\"95838a8203f23dd1ce8f\",\"339\":\"12bdbede82465e666965\",\"392\":\"031f85fcb7cf31c35a88\",\"436\":\"65389e22546d82aaa8c8\",\"437\":\"487f9ec608fdb29ab7a0\",\"442\":\"765ae47d035fd5250820\",\"508\":\"049a695db07b5a81eb8b\",\"589\":\"c66e4e0d76fa581af241\",\"630\":\"f8f57a1c721e03c3f699\",\"641\":\"e29a883ff173169e88cd\",\"642\":\"be93122d1116ecdc9322\",\"670\":\"c55ec44ab819870d4ac4\",\"678\":\"5211e33b3f0c47c582c8\",\"684\":\"c02f8f5d69deae872060\",\"709\":\"9186b58006e0c80f1e5f\",\"776\":\"01d9a0f7f70d71de2d79\",\"781\":\"decdb6e23f9d404a1931\",\"783\":\"949e247466ad3ebe82d6\",\"810\":\"58611e718b4eafec6685\",\"813\":\"315ffd640c7d6013a536\"}[chunkId] + \".chunk.js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = {};\n var countMap = {};\n var getRetryDelay = function () {\n return 3000;\n };\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result +\n (queryMap.hasOwnProperty(chunkId) ? '?' + queryMap[chunkId] : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.hasOwnProperty(chunkId)\n ? countMap[chunkId]\n : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n var retryAttempt = 999999 - retries + 1;\n setTimeout(function () {\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap[chunkId] = cacheBust;\n countMap[chunkId] = retries - 1;\n resolve(__webpack_require__.e(chunkId));\n }, getRetryDelay(retryAttempt));\n });\n });\n };\n }\n})();\n","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t179: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\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\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [85,110], () => (__webpack_require__(2938)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","leafPrototypes","getProto","inProgress","dataWebpackPrefix","IS_BETA","DEBUG","MOUNT_CLASS_TO","window","self","STATE_VERSION","BUILD","DEFAULT_THEME","_","access_hash","id","settings","pFlags","base_theme","accent_color","message_colors","wallpaper","default","pattern","document","undefined","slug","intensity","background_color","second_background_color","third_background_color","fourth_background_color","dark","title","emoticon","makeDefaultAppTheme","name","baseTheme","highlightningColor","find","s","STATE_INIT","allDialogsLoaded","pinnedOrders","contactsListCachedTime","updates","filtersArr","maxSeenMsgId","stateCreatedTime","Date","now","recentEmoji","recentCustomEmoji","topPeersCache","recentSearch","version","build","authState","IS_MOBILE","hiddenPinnedMessages","messagesTextSize","distanceUnit","sendShortcut","animationsEnabled","autoDownload","photo","contacts","private","groups","channels","video","file","autoDownloadNew","file_size_max","video_preload_large","audio_preload_next","photo_size_max","video_size_max","video_upload_maxbitrate","autoPlay","gifs","videos","stickers","suggest","loop","emoji","big","themes","theme","notifications","sound","timeFormat","toLocaleString","match","playbackParams","volume","muted","playbackRate","playbackRates","voice","audio","round","keepSigned","chatContextMenuHintWasShown","stateId","notifySettings","IS_APPLE_MX","ctx","createElement","getContext","extension","getExtension","renderer","getParameter","UNMASKED_RENDERER_WEBGL","getSupportedExtensions","indexOf","err","CAN_USE_TRANSFERABLES","IS_SAFARI","navigator","userAgent","search","geolocation","getCurrentPosition","IMAGE_MIME_TYPES_SUPPORTED","Set","add","arr","concat","canPlayType","IS_APPLE_MOBILE","replace","IS_FIREFOX","mediaDevices","DocumentTouch","USER_AGENT","IS_APPLE","IS_ANDROID","toLowerCase","IS_CHROMIUM","test","vendor","platform","maxTouchPoints","IS_MOBILE_SAFARI","vibrate","VIDEO_MIME_TYPES_SUPPORTED","toDataURL","startsWith","rgbToHsv","r","g","b","v","Math","max","c","min","h","hsvToRgb","f","n","k","rgbaToHsla","a","l","d","hslaToRgba","hue2rgb","p","q","t","map","hexaToRgba","hexa","offset","length","slice","i","push","parseInt","hexToRgb","hex","hexaToHsla","rgba","rgbaToHexa","toString","join","hslaStringToHex","hsla","splitted","split","alpha","pop","val","endsWith","hslaStringToRgba","hslaStringToHexa","mixColors","color1","color2","weight","out","Array","v1","v2","floor","computePerceivedBrightness","color","getAverageColor","getAccentColor","baseHsv","baseColor","elementColor","hsvTemp3","hsvTemp4","dist","changeColorAccent","accentHsv","isDarkTheme","colorHsv","abs","newColor","origBrightness","newBrightness","amountOfNew","amount","changeBrightness","getHexColorFromTelegramColor","repeat","getRgbColorFromTelegramColor","getColorsFromWallPaper","wallPaper","filter","Boolean","compareVersion","s1","s2","blurActiveElement","activeElement","blur","cancelEvent","event","originalEvent","stopPropagation","preventDefault","returnValue","cancelBubble","findUpClassName","el","className","closest","fixSafariStickyInput","input","style","transform","focus","then","IS_STICKY_INPUT_BUGGED","key","startY","o","capture","passive","onTouchMove","e","touch","touches","scrollable","target","y","scrolled","scrollTop","scrollHeight","clientHeight","nextScrollTop","lastFocusOutTimeStamp","addEventListener","classList","contains","timeStamp","touchStart","removeEventListener","fixSafariStickyInputFocusing","callback","cacheInstallPrompt","deferredPrompt","prompt","outcome","userChoice","getInstallPrompt","texts","cache","fonts","text","icons","monospace","loadFonts","types","Promise","resolve","promises","type","_texts","font","weights","_promises","load","race","all","catch","setInnerHTML","elem","html","setDirection","innerHTML","replaceChildren","setAttribute","FOCUS_EVENT_NAME","IdleController","constructor","super","this","_isIdle","focusPromise","focusResolve","isIdle","once","idle","getFocusPromise","value","dispatchEvent","clamp","OverlayCounter","overlaysActive","isOverlayActive","fastRafCallbacks","fastRaf","requestAnimationFrame","currentCallbacks","forEach","cb","fastRafConventionalCallbacks","rafPromise","processing","fastRafConventional","fastRafPromise","doubleRaf","parseUriParams","uri","params","item","decodeURIComponent","appColorMap","rgb","light","lightFilled","darkRgb","darkFilled","colorMap","day","night","themeController","setTheme","themeColorElem","_themeColorElem","head","querySelector","setThemeColor","themeColor","isNight","setThemeListener","darkModeMediaQuery","matchMedia","checkDarkMode","systemTheme","matches","addListener","applyHighlightningColor","getTheme","documentElement","setProperty","removeProperty","colorScheme","toggle","applyTheme","styleElement","append","textContent","cssText","switchTheme","bindColorApplier","options","appliedColors","applyAppColor","_options","finalize","has","element","lightenAlpha","darkenAlpha","mixColor","appColor","lightenedRgb","darkenedHsla","applyNewTheme","isNightTheme","currentTheme","themeSettings","newAppTheme","AppBackgroundTab","setBackgroundDocument","isArray","baseColors","hsvTemp1","hsvTemp2","newAccentRgb","newAccentHex","messageLightenAlpha","baseMessageColor","baseMessageOutBackgroundColor","myMessagesAccent","nextColor","accentColor2","outbox_accent_color","newMessageOutBackgroundColor","workerHandler","construct","args","url","location","Worker","SharedWorker","w","Proxy","setWorkerProxy","Element","prototype","toggleAttribute","force","hasAttribute","removeAttribute","Node","nodes","rootScope","getProxiedManagers","getElementById","href","singleInstance","visualViewport","lastVH","setViewportVH","setVH","vh","overlayCounter","height","innerHeight","toggleResizeMode","tabId","onImTabChange","wasTabId","tagName","appMediaViewer","onInResize","hasFocus","onOutResize","console","log","perf","performance","langPromise","stateResult","langPack","fadeInWhenFontsReady","promise","opacity","state","isPremium","appVersion","lang_code","dir","hash","tgWebAuthToken","data","token","dcId","tgWebAuthDcId","userId","tgWebAuthUserId","toUserId","isTest","tgWebAuthTest","tgAddr","tgaddr","urlSearchParams","URLSearchParams","set","delete","pagePromise","placeholder","prepend","cloneNode","meModule","pushModule","setAuthorized","forceUnsubscribe","mount","sentCode","authCode","pause","ready","reload","close","DEBUG_MANAGER_REQUESTS","createProxyProxy","proxied","ack","get","receiver","method","warn","createProxy","acknowledged","IDB","db","storageIsAvailable","openDatabase","INSTANCES","isAvailable","createNew","openDbPromise","createIndexes","os","store","indexNames","from","indexName","deleteIndex","indexes","index","createIndex","keyPath","objectParameters","request","indexedDB","open","reject","error","message","finished","setTimeout","onerror","onsuccess","result","calledNew","onclose","onabort","transaction","onversionchange","onupgradeneeded","oldVersion","newVersion","stores","objectStoreNames","objectStore","createObjectStore","static","instance","preserve","storage","IDBStorage","storeName","idb","create","entryName","getObjectStore","clear","save","idx","put","mode","onError","clearTimeout","timeout","onComplete","results","requests","waitForTransactionComplete","oncomplete","callbackResult","left","onRequestFinished","getAll","UNSUPPORTED_LANG_PACK_KEY","I18n","pluralRules","cacheLangPackPromise","setLangCode","langCode","lastRequestedLangCode","lastRequestedNormalizedLangCode","updateAmPm","dateTimeFormat","getDateTimeFormat","hour","minute","hour12","date","setHours","amText","format","amPmCache","am","pmText","pm","loadLocalLangPack","defaultCode","lang","langSign","countries","strings","formatLocalStrings","saveLangPack","from_version","local","loadLangPack","web","requestedServerLanguage","managers","apiManager","invokeApiCacheable","lang_pack","polyfillPromise","pushTo","applyLangPack","currentLangCode","Intl","PluralRules","string","countriesList","country","langPackKey","default_name","lastAppliedLangCode","cachedDateTimeFormats","querySelectorAll","weakMap","update","superFormatter","indexHolder","lastIndex","p1","p2","p3","p4","lastIndexOf","wrappedUrl","onclick","DocumentFragment","firstChild","arg","pushNextArgument","plain","str","select","Map","isRTL","setRTL","rtl","getCacheLangPack","finally","setTimeFormat","haveToUpdate","IntlDateElement","getStrings","keys","getLangPack","langPack1","langPack2","localLangPack1","localLangPack2","_Intl","Object","assign","WeakMap","IntlElementBase","property","IntlElement","formatted","dataset","compareAndUpdate","json","JSON","stringify","DateTimeFormat","hours","getHours","getMinutes","i18n","i18n_","_i18n","joinElementsWith","elements","joiner","isLast","useLast","joined","NULL_PEER_ID","REPLIES_PEER_ID","REPLIES_HIDDEN_CHANNEL_ID","SERVICE_PEER_ID","MUTE_UNTIL","BOT_START_PARAM","MAX_FILE_SAVE_SIZE","THUMB_TYPE_FULL","TOPIC_COLORS","ATTACH_MENU_BOT_ICON_NAME","GENERAL_TOPIC_ID","T_ME_PREFIXES","FOLDER_ID_ALL","FOLDER_ID_ARCHIVE","REAL_FOLDERS","IS_CALL_SUPPORTED","IS_CANVAS_FILTER_SUPPORTED","IS_EMOJI_SUPPORTED","IS_GEOLOCATION_SUPPORTED","IS_GROUP_CALL_SUPPORTED","IS_MOV_SUPPORTED","IS_PARALLAX_SUPPORTED","IS_SCREEN_SHARING_SUPPORTED","IS_TOUCH_SUPPORTED","IS_VIBRATE_SUPPORTED","IS_OPUS_SUPPORTED","IS_SHARED_WORKER_SUPPORTED","IS_WEBM_SUPPORTED","IS_WEBP_SUPPORTED","IS_WEBRTC_SUPPORTED","MEDIA_MIME_TYPES_SUPPORTED","ALL_KEYS","REFRESH_KEYS","loadStateInner","logger","totalPerf","recordPromise","stateStorage","sessionStorage","pushedKeys","pushToState","copy","splice","auth","shift","sessionBuild","shiftedWebKAuth","values","dcID","toPeerId","obj","resetStorages","chats","dialogs","users","_state","state_id","time","autoDownloadSettings","oldTypes","mediaType","peerTypeSettings","peerType","SKIP_VALIDATING_PATHS","validateInitObject","missingKey","migrated","oldThemes","oldTheme","oldBackground","background","newTheme","colors","wallPaperSettings","k_build","ApiManagerProxy","onMirrorTask","payload","hasOwnProperty","mirrors","mirror","tabState","chatPeerIds","idleStartTime","registerWorker","registerServiceWorker","registerCryptoWorker","addMultipleEventsListeners","convertWebp","fileName","bytes","webpWorkerController","convertOpus","opusDecodeController","localStorageProxy","storageTask","language","toggleStorages","telegramMeWebManager","webPushApiManager","cacheName","caches","appRuntimeManager","idleController","updateTabStateIdle","invoke","pingServiceWorkerWithIframe","pingServiceWorkerPromise","iframe","hidden","onLoad","remove","src","random","body","attachServiceWorker","serviceWorker","lastServiceWorker","serviceMessagePort","detachPort","attachSendPort","invokeVoid","_registerServiceWorker","register","URL","scope","registration","active","controller","unregister","installing","waiting","worker","attachListenPort","port","source","ports","hello","resendLockTask","share","originals","originalUrl","createWorker","attachWorkerToPort","cryptoMessagePort","blob","fetch","response","pathnameSplitted","pathname","origin","Blob","onWorkerFirstMessage","messagePort","attachPort","loadState","sendState","invokeCrypto","enabled","clearWrite","getMirror","getState","updateTabState","apiManagerProxy","IS_MULTIPLE_TABS_SUPPORTED","SingleInstance","clearInstance","masterInstance","deactivated","checkInstance","newInstance","instanceId","curInstance","deactivateInstance","xt_instance","clearDeactivateTimeout","deactivateTimeout","deactivatedReason","start","reset","started","setInterval","activateInstance","reason","TelegramMeWebManager","disabled","hostname","canRedirect","curValue","ts","tsNow","tgme_sync","path","encodeURIComponent","script","onload","appendChild","loadScript","WebPushApiManager","isPushEnabled","localNotificationsAvailable","isFirefox","userVisibleOnly","subscribe","reg","pushManager","subscription","pushSubscriptionNotify","Notification","permission","isAliveNotify","baseUrl","ACTIONS_LANG_MAP","push_action_mute1d","push_action_settings","push_message_nopreview","action","localNotifications","isAliveTO","getSubscription","setUpServiceWorkerChannel","setLocalNotificationsDisabled","unsubscribe","successful","setSettings","newSettings","hidePushNotifications","subscriptionObj","toJSON","endpoint","p256dh","tokenType","tokenValue","ignorePushByMid","peerId","mid","sampleRate","tasks","keepAlive","isPlaySupported","loadWavWorker","wavWorker","page","onTaskEnd","loadWorker","postMessage","command","waveform","buffers","typedArray","buffer","setKeepAlive","terminateWorkers","task","executeNewTask","kill","terminate","decoderSampleRate","outputBufferSampleRate","wavBitDepth","wavSampleRate","pages","withWaveform","pushDecodeTask","decode","dataBlob","ALPHA_CHARS_REG_EXP","ALPHA_NUMERIC_REG_EXP","URL_ALPHANUMERIC_REG_EXP_PART","URL_PROTOCOL_REG_EXP_PART","URL_REG_EXP","URL_ANY_PROTOCOL_REG_EXP","RegExp","USERNAME_REG_EXP","BOT_COMMAND_REG_EXP","FULL_REG_EXP","EMAIL_REG_EXP","MARKDOWN_REG_EXP","SITE_HASHTAGS","MARKDOWN_ENTITIES","PASS_CONFLICTING_ENTITIES","PHONE_NUMBER_REG_EXP","wrapUrl","unsafe","tgMeMatch","telescoPeMatch","tgMatch","u","prefix","fullPath","RootScope","myId","connectionStatus","premium","isNew","dispatchEventSingle","status","getConnectionStatus","getPremium","convertPromises","init","convert","convertPromise","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","call","m","O","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","j","every","getter","__esModule","getPrototypeOf","ns","def","current","getOwnPropertyNames","definition","defineProperty","enumerable","chunkId","reduce","miniCssF","globalThis","Function","prop","done","needAttach","scripts","getElementsByTagName","getAttribute","charset","nc","onScriptComplete","prev","doneFns","parentNode","removeChild","bind","Symbol","toStringTag","scriptUrl","importScripts","currentScript","Error","oldGetScript","oldLoadScript","queryMap","countMap","retries","realSrc","cacheBust","baseURI","installedChunks","installedChunkData","errorType","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file diff --git a/public/main.ca3d632b985df17254b5.bundle.js b/public/main.ca3d632b985df17254b5.bundle.js deleted file mode 100644 index cd8241e0..00000000 --- a/public/main.ca3d632b985df17254b5.bundle.js +++ /dev/null @@ -1,2 +0,0 @@ -(()=>{"use strict";var e,t,n,s,i,o={410:(e,t,n)=>{n.d(t,{GO:()=>r,Tj:()=>i,ZP:()=>a});var s=n(1267);const i=!1,o=i||s.Z.debug,r="undefined"!=typeof window?window:self,a=o},236:(e,t,n)=>{n.d(t,{t:()=>c,h:()=>d});var s=n(4762),i=n(144),o=n(4159);const r=o.Z.version,a=o.Z.build,c={_:"theme",access_hash:"",id:"",settings:[{_:"themeSettings",pFlags:{},base_theme:{_:"baseThemeClassic"},accent_color:3379436,message_colors:[5221966],wallpaper:{_:"wallPaper",pFlags:{default:!0,pattern:!0},access_hash:"",document:void 0,id:"",slug:"pattern",settings:{_:"wallPaperSettings",pFlags:{},intensity:50,background_color:14409147,second_background_color:7054727,third_background_color:14014605,fourth_background_color:8960132}}},{_:"themeSettings",pFlags:{},base_theme:{_:"baseThemeNight"},accent_color:8877281,message_colors:[8877281],wallpaper:{_:"wallPaper",pFlags:{default:!0,pattern:!0,dark:!0},access_hash:"",document:void 0,id:"",slug:"pattern",settings:{_:"wallPaperSettings",pFlags:{},intensity:-50,background_color:16696470,second_background_color:14511289,third_background_color:9842623,fourth_background_color:5200853}}}],slug:"",title:"",emoticon:"๐Ÿ ",pFlags:{default:!0}},l=(e,t,n)=>Object.assign(Object.assign({},c),{name:e,settings:Object.assign(Object.assign({},c.settings.find((e=>e.base_theme._===t))),{highlightningColor:n})}),d={allDialogsLoaded:{},pinnedOrders:{},contactsListCachedTime:0,updates:{},filtersArr:[],maxSeenMsgId:0,stateCreatedTime:Date.now(),recentEmoji:[],recentCustomEmoji:[],topPeersCache:{},recentSearch:[],version:r,build:a,authState:{_:s.IS_MOBILE?"authStateSignIn":"authStateSignQr"},hiddenPinnedMessages:{},settings:{messagesTextSize:16,distanceUnit:"kilometers",sendShortcut:"enter",animationsEnabled:!0,autoDownload:{photo:{contacts:!0,private:!0,groups:!0,channels:!0},video:{contacts:!0,private:!0,groups:!0,channels:!0},file:{contacts:!0,private:!0,groups:!0,channels:!0}},autoDownloadNew:{_:"autoDownloadSettings",file_size_max:3145728,pFlags:{video_preload_large:!0,audio_preload_next:!0},photo_size_max:1048576,video_size_max:15728640,video_upload_maxbitrate:100},autoPlay:{gifs:!0,videos:!0},stickers:{suggest:!0,loop:!0},emoji:{suggest:!0,big:!0},themes:[l("day","baseThemeClassic","hsla(86.4, 43.846153%, 45.117647%, .4)"),l("night","baseThemeNight","hsla(299.142857, 44.166666%, 37.470588%, .4)")],theme:"system",notifications:{sound:!1},timeFormat:(new Date).toLocaleString().match(/\s(AM|PM)/)?"h12":"h23"},playbackParams:{volume:1,muted:!1,playbackRate:1,playbackRates:{voice:1,video:1,audio:1},loop:!1,round:!1},keepSigned:!0,chatContextMenuHintWasShown:!1,stateId:(0,i.d)(32),notifySettings:{}}},8189:(e,t,n)=>{n.d(t,{Z:()=>i});let s=!1;try{const e=document.createElement("canvas").getContext("webgl"),t=e.getExtension("WEBGL_debug_renderer_info"),n=t&&e.getParameter(t.UNMASKED_RENDERER_WEBGL)||"";(n.match(/Apple/)&&!n.match(/Apple GPU/)||-1===e.getSupportedExtensions().indexOf("WEBGL_compressed_texture_s3tc_srgb"))&&(s=!0)}catch(e){}const i=s},993:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n(4089).Z},7328:(e,t,n)=>{let s;if(n.d(t,{Z:()=>i}),n(4762).IS_SAFARI)try{s=+navigator.userAgent.match(/Version\/(.+?) /)[1]>=14}catch(e){s=!1}else s=!0;const i=s},6663:(e,t,n)=>{n.d(t,{Z:()=>s});const s="filter"in(document.createElement("canvas").getContext("2d")||{})},9976:(e,t,n)=>{n.d(t,{Z:()=>s});const s=-1!==navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i)},3731:(e,t,n)=>{var s;n.d(t,{Z:()=>i});const i=!!(null===(s=null===navigator||void 0===navigator?void 0:navigator.geolocation)||void 0===s?void 0:s.getCurrentPosition)&&!1},6818:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n(4089).Z},1174:(e,t,n)=>{n.d(t,{Z:()=>o});var s=n(5269);const i=new Set(["image/jpeg","image/png","image/bmp"]);s.Z&&i.add("image/webp");const o=i},2341:(e,t,n)=>{n.d(t,{Z:()=>r});var s=n(1174),i=n(554);const o=[...s.Z].concat([...i.Z]),r=new Set(o)},9030:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(4762);const i=!!document.createElement("video").canPlayType("video/quicktime")||s.IS_SAFARI||s.IS_APPLE_MOBILE},5783:(e,t,n)=>{n.d(t,{Z:()=>i});const s=document.createElement("audio"),i=!(!s.canPlayType||!s.canPlayType("audio/ogg;").replace(/no/,""))},2365:(e,t,n)=>{n.d(t,{Z:()=>s});const s=!n(4762).IS_FIREFOX&&!1},2820:(e,t,n)=>{n.d(t,{Z:()=>s});const s=!!("getDisplayMedia"in((null===navigator||void 0===navigator?void 0:navigator.mediaDevices)||{}))},2045:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(1267);const i="undefined"!=typeof SharedWorker&&!s.Z.noSharedWorker},5432:(e,t,n)=>{n.d(t,{Z:()=>s});const s="ontouchstart"in window||window.DocumentTouch&&document instanceof DocumentTouch},4762:(e,t,n)=>{n.r(t),n.d(t,{IS_ANDROID:()=>r,IS_APPLE:()=>o,IS_APPLE_MOBILE:()=>c,IS_CHROMIUM:()=>a,IS_FIREFOX:()=>d,IS_MOBILE:()=>u,IS_MOBILE_SAFARI:()=>h,IS_SAFARI:()=>l,USER_AGENT:()=>i});var s=n(6761);const i=navigator?navigator.userAgent:null,o=-1!==navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),r=-1!==navigator.userAgent.toLowerCase().indexOf("android"),a=/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),c=(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&!s.Z.MSStream,l=!!("safari"in s.Z)||!(!i||!(/\b(iPad|iPhone|iPod)\b/.test(i)||i.match("Safari")&&!i.match("Chrome"))),d=navigator.userAgent.toLowerCase().indexOf("firefox")>-1,h=l&&c,u=(void 0===navigator.maxTouchPoints||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)},2131:(e,t,n)=>{n.d(t,{Z:()=>s});const s=!!(null===navigator||void 0===navigator?void 0:navigator.vibrate)},554:(e,t,n)=>{n.d(t,{Z:()=>o});var s=n(9030);const i=new Set(["image/gif","video/mp4","video/webm"]);s.Z&&i.add("video/quicktime");const o=i},393:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(4762);const i=!!document.createElement("video").canPlayType("video/webm")&&!s.IS_SAFARI&&!s.IS_APPLE_MOBILE},5269:(e,t,n)=>{n.d(t,{Z:()=>s});const s=document.createElement("canvas").toDataURL("image/webp").startsWith("data:image/webp")},4089:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(4762);const i=!("undefined"==typeof RTCPeerConnection||s.IS_FIREFOX)},2064:(e,t,n)=>{n.d(t,{Dk:()=>g,EM:()=>w,K5:()=>u,Pi:()=>c,WE:()=>o,Y6:()=>a,cw:()=>d,dI:()=>r,e9:()=>f,ix:()=>p,oo:()=>l,py:()=>i,t1:()=>h,tB:()=>y,uY:()=>v});var s=n(3228);function i(e,t,n){e/=255,t/=255,n/=255;const s=Math.max(e,t,n),i=s-Math.min(e,t,n),o=i&&(s===e?(t-n)/i:s==t?2+(n-e)/i:4+(e-t)/i);return[60*(o<0?o+6:o),s&&i/s,s]}function o(e,t,n){const s=(s,i=(s+e/60)%6)=>Math.round(255*(n-n*t*Math.max(Math.min(i,4-i,1),0)));return[s(5),s(3),s(1)]}function r(e,t,n,s=1){e/=255,t/=255,n/=255;const i=Math.max(e,t,n),o=Math.min(e,t,n);let r,a;const c=(i+o)/2;if(i===o)r=a=0;else{const s=i-o;switch(a=c>.5?s/(2-i-o):s/(i+o),i){case e:r=(t-n)/s+(t1&&(n-=1),n<1/6?e+6*(t-e)*n:n<.5?t:n<2/3?e+(t-e)*(2/3-n)*6:e},a=n<.5?n*(1+t):n+t-n*t,c=2*n-a;i=s(c,a,e+1/3),o=s(c,a,e),r=s(c,a,e-1/3)}return[i,o,r,s].map((e=>Math.round(255*e)))}function c(e){const t=[],n="#"===e[0]?1:0;if(e.length===5+n&&(e=(n?"#":"")+"0"+e.slice(n)),e.length===3+n)for(let s=n;s("0"+e.toString(16)).slice(-2))).join("")}function u(e){return function(e){return h(function(e){const t=e.slice(5,-1).split(", "),n=+t.pop(),s=t.map((e=>e.endsWith("%")?+e.slice(0,-1):+e));return a(s[0],s[1],s[2],n)}(e))}(e).slice(0,-2)}function g(e,t,n){const s=new Array(3);for(let i=0;i<3;++i){const o=e[i],r=t[i];s[i]=Math.floor(r+(o-r)*n)}return s}function m(e){return(.2126*e[0]+.7152*e[1]+.0722*e[2])/255}function p(e,t){return e.map(((e,n)=>Math.round((e+t[n])/2)))}function f(e,t,n){const s=i(...t),r=i(...n),a=Math.min(1.5*s[1]/e[1],1);return s[0]=Math.min(360,r[0]-s[0]+e[0]),s[1]=Math.min(1,r[1]*e[1]/s[1]),s[2]=Math.min(1,(r[2]/s[2]+a-1)*e[2]/a),s[2]<.3?n:o(...s)}function v(e,t,n,r){const a=i(...n);if(Math.min(Math.abs(a[0]-e[0]),Math.abs(a[0]-e[0]-360))>30)return n;const c=Math.min(1.5*a[1]/e[1],1);a[0]=Math.min(360,a[0]+t[0]-e[0]),a[1]=Math.min(1,a[1]*t[1]/e[1]),a[2]=Math.min(1,a[2]*(1-c+c*t[2]/e[2]));let l=o(...a);const d=m(n),h=m(l);if(r?d>h:d(0,s.Z)(Math.round(e*t),0,255)))}(l,(1-e)*d/h+e)}return l}function b(e){const t=(e<0?16777215+e:e).toString(16);return"#"+(t.length>=6?t:"0".repeat(6-t.length)+t)}function y(e){return l(b(e))}function w(e){return e.settings?[e.settings.background_color,e.settings.second_background_color,e.settings.third_background_color,e.settings.fourth_background_color].filter(Boolean).map(b).join(","):""}},6009:(e,t,n)=>{function s(e,t){e=e.split(" ",1)[0],t=t.split(" ",1)[0];const n=e.split("."),s=t.split(".");for(let e=0;ei)return 1;if(ts})},8799:(e,t,n)=>{function s(){var e;return!!(null===(e=document.activeElement)||void 0===e?void 0:e.blur)&&(document.activeElement.blur(),!0)}n.d(t,{Z:()=>s})},3910:(e,t,n)=>{function s(e){if(e||(e=window.event),e){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,{Z:()=>s})},8497:(e,t,n)=>{function s(e,t){return e.closest("."+t)}n.d(t,{Z:()=>s})},5494:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(3035);function i(e){e.style.transform="translateY(-99999px)",e.focus(),(0,s.d1)().then((()=>{e.style.transform=""}))}},8090:(e,t,n)=>{n.d(t,{T:()=>a,Z:()=>c});var s=n(5432),i=n(4762),o=n(8497),r=n(5494);const a=i.IS_SAFARI&&i.IS_MOBILE&&s.Z;if(a){const e="clientY";let t=0;const n={capture:!0,passive:!1},s=n=>{const s=n.touches[0],i=(0,o.Z)(s.target,"scrollable-y");if(i){const o=s[e],r=t-o,a=i.scrollTop,c=i.scrollHeight,l=i.clientHeight,d=a?Math.round(a+i.clientHeight+r):a+r;(c===l||d>=c||d<=0)&&n.preventDefault()}else n.preventDefault()};let i=0;document.addEventListener("focusin",(o=>{!o.target.classList.contains("is-sticky-input-bugged")||o.timeStamp-i<50||((0,r.Z)(o.target),document.addEventListener("touchmove",s,n),document.addEventListener("touchstart",(n=>{if(n.touches.length>1)return;const s=n.touches[0];t=s[e]})))}),{passive:!0}),document.addEventListener("focusout",(e=>{document.removeEventListener("touchmove",s,n),i=e.timeStamp}),{passive:!0}),document.addEventListener("visibilitychange",(()=>{document.activeElement&&document.activeElement.classList.contains("is-sticky-input-bugged")&&document.activeElement.blur&&(0,r.Z)(document.activeElement)}),{passive:!0})}function c(e){a&&e.classList.add("is-sticky-input-bugged")}},6472:(e,t,n)=>{n.d(t,{B:()=>o,Z:()=>i});let s;function i(){window.addEventListener("beforeinstallprompt",(e=>{s=()=>{return t=this,n=void 0,o=function*(){e.prompt();const{outcome:t}=yield e.userChoice;"accepted"===t&&(s=void 0)},new((i=void 0)||(i=Promise))((function(e,s){function r(e){try{c(o.next(e))}catch(e){s(e)}}function a(e){try{c(o.throw(e))}catch(e){s(e)}}function c(t){var n;t.done?e(t.value):(n=t.value,n instanceof i?n:new i((function(e){e(n)}))).then(r,a)}c((o=o.apply(t,n||[])).next())}));var t,n,i,o}}))}function o(){return s}},4541:(e,t,n)=>{n.d(t,{Z:()=>c});var s=n(319),i=n(5418);const o=["b","ะฑ"],r={},a={text:"Roboto",icons:"tgico",monospace:"Roboto Mono"};function c(e={text:o,icons:void 0,monospace:o}){if(!("fonts"in document))return Promise.resolve();const t=[];for(const n in e){let s=e[n];"all"===s&&(s=o);const i=a[n],c="icons"===n?[500]:[400,500];for(const e of c){const n=(s||[void 0]).map((t=>{var n,s,o,a;const c=[e,"1rem",i].join(" ");return null!==(s=(o=null!==(n=r[c])&&void 0!==n?n:r[c]={})[a=t||""])&&void 0!==s?s:o[a]=document.fonts.load(c,t)}));t.push(...n)}}return Promise.race([Promise.all(t).catch(s.Z),(0,i.Z)(1e3)])}},130:(e,t,n)=>{function s(e,t){i(e),"string"==typeof t?t?e.innerHTML=t:e.replaceChildren():e.replaceChildren(t)}function i(e){e.setAttribute("dir","auto")}n.d(t,{Z:()=>s,m:()=>i})},2586:(e,t,n)=>{n.d(t,{Z:()=>a});var s=n(5432),i=n(3241);const o=s.Z?"touchstart":"mousemove";class r extends i.Z{constructor(){super(),this._isIdle=!0,this.focusPromise=Promise.resolve(),this.focusResolve=()=>{},window.addEventListener("blur",(()=>{this.isIdle=!0,window.addEventListener("focus",(()=>{this.isIdle=!1}),{once:!0})})),window.addEventListener(o,(()=>{this.isIdle=!1}),{once:!0,passive:!0}),this.addEventListener("change",(e=>{e?this.focusPromise=new Promise((e=>{this.focusResolve=e})):this.focusResolve()}))}getFocusPromise(){return this.focusPromise}get isIdle(){return this._isIdle}set isIdle(e){this._isIdle!==e&&(this._isIdle=e,this.dispatchEvent("change",e))}}const a=new r},3228:(e,t,n)=>{function s(e,t,n){return en?n:e}n.d(t,{Z:()=>s})},3815:(e,t,n)=>{n.d(t,{Z:()=>o});var s=n(3241);class i extends s.Z{constructor(){super(...arguments),this.overlaysActive=0}get isOverlayActive(){return this.overlaysActive>0}set isOverlayActive(e){this.overlaysActive+=e?1:-1,this.dispatchEvent("change",this.isOverlayActive)}}const o=new i},3035:(e,t,n)=>{let s;function i(e){s?s.push(e):(s=[e],requestAnimationFrame((()=>{const e=s;s=void 0,e.forEach((e=>e()))})))}n.d(t,{AD:()=>l,T2:()=>i,TR:()=>c,d1:()=>d});let o,r,a=!1;function c(e){o?a?e():o.push(e):(o=[e],requestAnimationFrame((()=>{a=!0;for(let e=0;ei((()=>e())))),r.then((()=>{r=void 0})),r)}function d(){return new Promise((e=>{i((()=>{i(e)}))}))}},764:(e,t,n)=>{function s(e,t=e.split("?")){const n={};return t[1]?(t[1].split("&").forEach((e=>{n[e.split("=")[0]]=decodeURIComponent(e.split("=")[1])})),n):n}n.d(t,{Z:()=>s})},6714:(e,t,n)=>{n.d(t,{Z:()=>h});var s=n(5432),i=n(3512),o=n(2064),r=n(410),a=function(e,t,n,s){return new(n||(n=Promise))((function(i,o){function r(e){try{c(s.next(e))}catch(e){o(e)}}function a(e){try{c(s.throw(e))}catch(e){o(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(r,a)}c((s=s.apply(e,t||[])).next())}))};const c={"primary-color":{rgb:!0,light:!0,lightFilled:!0,dark:!0,darkRgb:!0},"message-out-primary-color":{lightFilled:!0},"surface-color":{rgb:!0},"danger-color":{light:!0,dark:!0},"primary-text-color":{rgb:!0},"secondary-text-color":{light:!0,lightFilled:!0},"message-out-background-color":{light:!0,lightFilled:!0,dark:!0,darkFilled:!0},"saved-color":{lightFilled:!0}},l={day:{"primary-color":"#3390ec","message-out-primary-color":"#4fae4e","surface-color":"#ffffff","danger-color":"#df3f40","primary-text-color":"#000000","secondary-text-color":"#707579","saved-color":"#359AD4"},night:{"primary-color":"#8774E1","message-out-primary-color":"#8774E1","surface-color":"#212121","danger-color":"#ff595a","primary-text-color":"#ffffff","secondary-text-color":"#aaaaaa","saved-color":"#8774E1"}},d=new class{constructor(){i.Z.addEventListener("theme_change",(()=>{this.setTheme()}))}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",i.Z.myId?i.Z.dispatchEvent("theme_change"):this.setTheme()};"addEventListener"in e?e.addEventListener("change",t):"addListener"in e&&e.addListener(t),t()}catch(e){}}applyHighlightningColor(){var e;let t;const n=this.getTheme();(null===(e=n.settings)||void 0===e?void 0:e.highlightningColor)?(t=n.settings.highlightningColor,document.documentElement.style.setProperty("--message-highlightning-color",t)):document.documentElement.style.removeProperty("--message-highlightning-color"),!s.Z&&t&&(this.themeColor=(0,o.K5)(t))}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();const n=this.getTheme();this.applyTheme(n);let s=this.styleElement;s||(s=this.styleElement=document.createElement("style"),document.head.append(s));const o=document.createElement("div");this.applyTheme(i.Z.settings.themes.find((e=>"night"===e.name)),o),s.textContent=`.night {${o.style.cssText}}`,this.applyHighlightningColor()}switchTheme(e){return a(this,void 0,void 0,(function*(){yield i.Z.managers.appStateManager.setByKey("settings.theme",e),i.Z.dispatchEvent("theme_change")}))}isNight(){return"night"===this.getTheme().name}getTheme(e=("system"===i.Z.settings.theme?this.systemTheme:i.Z.settings.theme)){return i.Z.settings.themes.find((t=>t.name===e))}bindColorApplier(e){const t=new Set;return{applyAppColor:n=>(t.add(n.name),this.applyAppColor(Object.assign(Object.assign({},n),e))),finalize:()=>{const n=e.isNight;for(const s in c)t.has(s)||this.applyAppColor(Object.assign({name:s,hex:l[n?"night":"day"][s]},e))}}}applyAppColor({name:e,hex:t,element:n,lightenAlpha:s=.08,darkenAlpha:i=s,mixColor:r,isNight:a}){const d=c[e],h=(0,o.oo)(t),u=(0,o.dI)(...h);null!=r||(r=(0,o.oo)(l[a?"night":"day"]["surface-color"]));const g=(0,o.Dk)(h,r,s),m=Object.assign(Object.assign({},u),{l:u.l-100*i});[[e,t],d.rgb&&[e+"-rgb",h.join(",")],d.light&&["light-"+e,`rgba(${h[0]}, ${h[1]}, ${h[2]}, ${s})`],d.lightFilled&&["light-filled-"+e,(0,o.t1)(g)],d.dark&&["dark-"+e,`hsl(${m.h}, ${m.s}%, ${m.l}%)`]].filter(Boolean).forEach((([e,t])=>{n.style.setProperty("--"+e,t)}))}applyNewTheme(e){return a(this,void 0,void 0,(function*(){const t=this.isNightTheme(e),n=this.getTheme(),s=i.Z.settings.themes,o=e.settings.find((e=>e.base_theme._===(t?"baseThemeNight":"baseThemeClassic"))),r=Object.assign(Object.assign({},e),{name:n.name,settings:Object.assign(Object.assign({},o),{highlightningColor:""})});yield this.AppBackgroundTab.setBackgroundDocument(o.wallpaper,r.settings),s[s.indexOf(n)]=r,yield i.Z.managers.appStateManager.setByKey("settings.themes",i.Z.settings.themes),i.Z.dispatchEvent("theme_change")}))}isNightTheme(e){return"night"===e.name||this.isNight()}applyTheme(e,t=document.documentElement){var n;const s=this.isNightTheme(e),i=Array.isArray(e.settings)?e.settings.find((e=>e.base_theme._===(s?"baseThemeNight":"baseThemeClassic"))):e.settings,r=l[s?"night":"day"];let a=(0,o.py)(...(0,o.oo)(r["primary-color"])),c=(0,o.py)(...(0,o.tB)(i.accent_color));const d=(0,o.uY)(a,c,(0,o.oo)(r["primary-color"]),!s),h=(0,o.t1)(d),{applyAppColor:u,finalize:g}=this.bindColorApplier({element:t,isNight:s});if(u({name:"primary-color",hex:h,darkenAlpha:.04}),u({name:"saved-color",hex:h,lightenAlpha:.64,mixColor:[255,255,255]}),!(null===(n=i.message_colors)||void 0===n?void 0:n.length))return;const m=s?.92:.12,p=(0,o.oo)(r["message-out-primary-color"]);a=(0,o.py)(...p);const f=(0,o.Dk)(p,(0,o.oo)(r["surface-color"]),m);let v=(0,o.tB)(i.message_colors[0]);i.message_colors.length>1&&(i.message_colors.slice(1).forEach((e=>{v=(0,o.ix)(v,(0,o.tB)(e))})),v=(0,o.e9)(a,f,v));const b=v;c=(0,o.py)(...b);const y=void 0!==i.outbox_accent_color&&(0,o.py)(...(0,o.tB)(i.outbox_accent_color)),w=(0,o.Dk)(v,(0,o.oo)(r["surface-color"]),m);u({name:"message-out-background-color",hex:(0,o.t1)(w),lightenAlpha:m}),u({name:"message-out-primary-color",hex:s?"#ffffff":(0,o.t1)(y?(0,o.WE)(...y):v),mixColor:w}),g()}};r.GO&&(r.GO.themeController=d);const h=d},2938:(e,t,n)=>{var s=n(4159),i=n(8799),o=n(3910),r=n(8090),a=n(4541),c=n(9976),l=n(4762),d=n(5418);!function(){const e={construct(e,t){let n=t[0]+"";return 0!==n.indexOf("blob:")&&(n+=location.search),new e(n)}};[Worker,"undefined"!=typeof SharedWorker&&SharedWorker].filter(Boolean).forEach((t=>{window[t.name]=new Proxy(t,e)}))}();var h=n(3512),u=n(5432),g=n(2325),m=(n(4110),n(690),n(3855)),p=n(2554),f=n(6714),v=n(3815),b=n(490),y=n(764),w=n(1267),S=n(410);const k="onbeforeinstallprompt"in window;var P=n(6472);document.addEventListener("DOMContentLoaded",(()=>{return e=void 0,t=void 0,E=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)}),void 0===Node.prototype.replaceChildren&&(Node.prototype.replaceChildren=function(...e){this.textContent="",e&&this.append(...e)}),h.Z.managers=(0,p.Z)(),document.getElementById("manifest").href=`site${l.IS_APPLE&&!l.IS_APPLE_MOBILE?"_apple":""}.webmanifest?v=jw3mK7G9Aq`,b.Z.start();const e=window.visualViewport||window;let t,_=!1;const E=()=>{const n=.01*(_&&!v.Z.isOverlayActive?e.height||e.innerHeight:window.innerHeight);t!==n&&(u.Z&&t1&&(0,i.Z)(),t=n,document.documentElement.style.setProperty("--vh",`${n}px`))};if(window.addEventListener("resize",E),E(),r.T){const t=()=>{_=1===n&&r.T&&!v.Z.isOverlayActive,E(),e!==window&&(_?(window.removeEventListener("resize",E),e.addEventListener("resize",E)):(e.removeEventListener("resize",E),window.addEventListener("resize",E)))};let n;window.onImTabChange=e=>{const s=void 0!==n;n=e,(s||1===n)&&t()},v.Z.addEventListener("change",(()=>{t()}))}if(l.IS_FIREFOX&&!c.Z&&document.addEventListener("dragstart",(e=>{const t=e.target;if("IMG"===t.tagName&&t.classList.contains("emoji"))return(0,o.Z)(e),!1})),c.Z&&document.documentElement.classList.add("native-emoji"),document.addEventListener("dragstart",(e=>{var t;if("IMG"===(null===(t=e.target)||void 0===t?void 0:t.tagName))return e.preventDefault(),!1})),document.addEventListener("contextmenu",(e=>{"IMG"!==e.target.tagName||window.appMediaViewer||(0,o.Z)(e)})),l.IS_FIREFOX&&document.documentElement.classList.add("is-firefox","no-backdrop"),l.IS_MOBILE&&document.documentElement.classList.add("is-mobile"),l.IS_APPLE)l.IS_SAFARI&&document.documentElement.classList.add("is-safari"),l.IS_APPLE_MOBILE?document.documentElement.classList.add("is-ios"):document.documentElement.classList.add("is-mac");else if(l.IS_ANDROID){document.documentElement.classList.add("is-android");const e=()=>{n=!0,window.addEventListener("resize",t,{once:!0})},t=()=>{n=!1,(0,i.Z)()};let n=!1;document.addEventListener("touchend",(t=>{const s=t.target.closest('[contenteditable="true"], input');s&&(document.activeElement===s||n||(console.log("input click",t,document.activeElement,s,s.matches(":focus")),window.addEventListener("resize",e,{once:!0})))}))}u.Z?document.documentElement.classList.add("is-touch"):document.documentElement.classList.add("no-touch"),k&&(0,P.Z)();const A=performance.now(),Z=g.ZP.getCacheLangPack(),[C,I]=yield Promise.all([m.Z.sendState().then((([e])=>e)),Z]);function L(e,t){e.style.opacity="0",t.then((()=>{window.requestAnimationFrame((()=>{e.style.opacity=""}))}))}g.ZP.setTimeFormat(C.state.settings.timeFormat),h.Z.managers.rootScope.getPremium().then((e=>{h.Z.premium=e})),f.Z.setThemeListener(),I.appVersion!==s.Z.langPackVersion&&g.ZP.getLangPack(I.lang_code),console.log("got state, time:",performance.now()-A),"ar"===I.lang_code&&S.Tj,document.documentElement.dir="ltr";let T=C.state.authState;const O=location.hash,M=O.split("?"),x=(0,y.Z)(O,M);if(x.tgWebAuthToken&&"authStateSignedIn"!==T._){const e={token:x.tgWebAuthToken,dcId:+x.tgWebAuthDcId,userId:x.tgWebAuthUserId.toUserId(),isTest:void 0!==x.tgWebAuthTest&&!!+x.tgWebAuthTest,tgAddr:x.tgaddr};if(e.isTest!==w.Z.test){const e=new URLSearchParams(location.search);return+x.tgWebAuthTest?e.set("test","1"):e.delete("test"),void(location.search=e.toString())}h.Z.managers.appStateManager.pushToState("authState",T={_:"authStateSignImport",data:e})}if("authStateSignedIn"!==T._){console.log("Will mount auth page:",T._,Date.now()/1e3);const e=document.getElementById("auth-pages");let t,s;if(e){t=e.querySelector(".scrollable"),u.Z&&!l.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.resolve().then(n.bind(n,2831)),Promise.resolve().then(n.bind(n,6702))]).then((([e,t])=>{e.default.setAuthorized(!1),t.default.forceUnsubscribe()}))}catch(e){}switch(T._){case"authStateSignIn":s=(yield Promise.all([n.e(147),n.e(684),n.e(63)]).then(n.bind(n,810))).default.mount();break;case"authStateSignQr":s=(yield Promise.all([n.e(147),n.e(684),n.e(709)]).then(n.bind(n,9709))).default.mount();break;case"authStateAuthCode":s=(yield Promise.all([n.e(147),n.e(684),n.e(53)]).then(n.bind(n,6392))).default.mount(T.sentCode);break;case"authStatePassword":s=(yield Promise.all([n.e(147),n.e(684),n.e(437)]).then(n.bind(n,9437))).default.mount();break;case"authStateSignUp":s=(yield Promise.all([n.e(147),n.e(684),n.e(339)]).then(n.bind(n,8339))).default.mount(T.authCode);break;case"authStateSignImport":s=(yield Promise.all([n.e(147),n.e(684),n.e(231)]).then(n.bind(n,3231))).default.mount(T.data)}t&&(s&&(yield s),L(t,"fonts"in document?Promise.race([(0,d.Z)(1e3),document.fonts.ready]):Promise.resolve()))}else console.log("Will mount IM page:",Date.now()/1e3),L(document.getElementById("main-columns"),(0,a.Z)()),(yield Promise.all([n.e(147),n.e(684),n.e(436)]).then(n.bind(n,5436))).default.mount()},new((_=void 0)||(_=Promise))((function(n,s){function i(e){try{r(E.next(e))}catch(e){s(e)}}function o(e){try{r(E.throw(e))}catch(e){s(e)}}function r(e){var t;e.done?n(e.value):(t=e.value,t instanceof _?t:new _((function(e){e(t)}))).then(i,o)}r((E=E.apply(e,t||[])).next())}));var e,t,_,E}))},1722:(e,t,n)=>{n.d(t,{Z:()=>s});const s=new class{reload(){try{location.reload()}catch(e){}}close(){try{window.close()}catch(e){}}focus(){window.focus()}}},2554:(e,t,n)=>{n.d(t,{Z:()=>c});var s=n(3855),i=n(410);const o={};function r(e,t){return new Proxy(e,{get:(e,n,r)=>{var a;return null!==(a=e[n])&&void 0!==a?a:e[n]=function(e,t){return new Proxy({},{get:(n,r,a)=>(...n)=>{var a;const c=s.Z.invoke("manager",{name:e,method:r,args:n},t);return i.ZP&&(null===(a=o[e])||void 0===a?void 0:a.has(r))&&console.warn("manager request",e,r,n),c}})}(n,t)}})}let a;function c(){return a||(a=r({},!1),a.acknowledged=r({},!0),a)}i.ZP&&(window.DEBUG_MANAGER_REQUESTS=o)},6666:(e,t,n)=>{n.d(t,{Z:()=>c});var s=n(1267),i=n(5471),o=n(5953),r=n(5003);class a{constructor(e){(0,o.Z)(this,e),s.Z.test&&(this.name+="_test"),this.storageIsAvailable=!0,this.log=(0,r.kg)(["IDB",e.name].join("-")),this.log("constructor"),this.openDatabase(!0),a.INSTANCES.push(this)}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;const t=(e,t)=>{var n;const s=Array.from(e.indexNames);for(const t of s)e.deleteIndex(t);if(null===(n=t.indexes)||void 0===n?void 0:n.length)for(const n of t.indexes)e.indexNames.contains(n.indexName)||e.createIndex(n.indexName,n.keyPath,n.objectParameters)};try{var n=indexedDB.open(this.name,this.version);if(!n)return Promise.reject()}catch(e){return this.log.error("error opening db",e.message),this.storageIsAvailable=!1,Promise.reject(e)}let s=!1;return setTimeout((()=>{s||n.onerror((0,i.Z)("IDB_CREATE_TIMEOUT"))}),3e3),this.openDbPromise=new Promise(((e,i)=>{n.onsuccess=t=>{s=!0;const o=n.result;let r=!1;this.log("Opened"),o.onerror=e=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),i(e)},o.onclose=e=>{this.log.error("closed:",e),!r&&this.openDatabase()},o.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(r=!0),t.onerror&&t.onerror(e),o.close()},o.onversionchange=e=>{this.log.error("onversionchange, lol?")},e(this.db=o)},n.onerror=e=>{s=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),i(e)},n.onupgradeneeded=e=>{s=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);const n=e.target,i=n.result;this.stores.forEach((e=>{if(i.objectStoreNames.contains(e.name)){const s=n.transaction.objectStore(e.name);t(s,e)}else((e,n)=>{const s=e.createObjectStore(n.name);t(s,n)})(i,e)}))}}))}static create(e){var t;return null!==(t=this.INSTANCES.find((t=>t.name===e.name)))&&void 0!==t?t:new a(e)}static closeDatabases(e){this.INSTANCES.forEach((t=>{if(e&&e===t)return;const n=t.db;n&&(n.onclose=()=>{},n.close())}))}}a.INSTANCES=[];class c{constructor(e,t){this.storeName=t,this.log=(0,r.kg)(["IDB",e.name,t].join("-")),this.idb=a.create(e)}delete(e,t){const n=Array.isArray(e);return n||(e=[].concat(e)),this.getObjectStore("readwrite",(t=>{const s=e.map((e=>t.delete(e)));return n?s:s[0]}),"",t)}clear(e){return this.getObjectStore("readwrite",(e=>e.clear()),"",e)}save(e,t,n){const s=Array.isArray(e);return s||(e=[].concat(e),t=[].concat(t)),this.getObjectStore("readwrite",(n=>{const i=e.map(((e,s)=>n.put(t[s],e)));return s?i:i[0]}),"",n)}get(e,t){const n=Array.isArray(e);if(n){if(!e.length)return Promise.resolve([])}else{if(!e)return;e=[].concat(e)}return this.getObjectStore("readonly",(t=>{const s=e.map((e=>t.get(e)));return n?s:s[0]}),"",t)}getObjectStore(e,t,n,s=this.storeName){let i;return n&&(i=performance.now(),this.log(n+": start")),this.idb.openDatabase().then((o=>new Promise(((r,a)=>{const c=o.transaction([s],e),l=()=>{clearTimeout(u),a(c.error)},d=()=>{clearTimeout(u),n&&this.log(n+": end",performance.now()-i);const e=p.map((e=>e.result));r(m?e:e[0])};c.onerror=l;const h="readwrite"===e;h&&(c.oncomplete=()=>d());const u=setTimeout((()=>{this.log.error("transaction not finished",c,n)}),1e4),g=t(c.objectStore(s)),m=Array.isArray(g),p=m?g:[].concat(g);if(h)return;const f=p.length;let v=f;const b=()=>{c.error||--v||d()};for(let e=0;ee.getAll()),"",e)}}},2325:(e,t,n)=>{n.d(t,{$d:()=>w,A1:()=>S,Hz:()=>m,XZ:()=>y,ZP:()=>v,ag:()=>b,nK:()=>p,v_:()=>k});var s=n(410),i=n(7922),o=n(4159),r=n(3512),a=n(4762),c=n(6848),l=n(5953),d=n(9005),h=n(6637),u=n(3591),g=n(130);const m={messageActionChatCreate:"ActionCreateGroup",messageActionChatCreateYou:"ActionYouCreateGroup",messageActionChatEditTitle:"ActionChangedTitle",messageActionChatEditPhoto:"ActionChangedPhoto",messageActionChatEditVideo:"ActionChangedVideo",messageActionChatDeletePhoto:"ActionRemovedPhoto",messageActionChatReturn:"ActionAddUserSelf",messageActionChatReturnYou:"ActionAddUserSelfYou",messageActionChatJoined:"ActionAddUserSelfMega",messageActionChatJoinedYou:"ChannelMegaJoined",messageActionChatAddUser:"ActionAddUser",messageActionChatAddUsers:"ActionAddUser",messageActionChatLeave:"ActionLeftUser",messageActionChatLeaveYou:"YouLeft",messageActionChatDeleteUser:"ActionKickUser",messageActionChatJoinedByLink:"ActionInviteUser",messageActionPinMessage:"Chat.Service.Group.UpdatedPinnedMessage",messageActionContactSignUp:"Chat.Service.PeerJoinedTelegram",messageActionChannelCreate:"ActionCreateChannel",messageActionChannelEditTitle:"Chat.Service.Channel.UpdatedTitle",messageActionChannelEditPhoto:"Chat.Service.Channel.UpdatedPhoto",messageActionChannelEditVideo:"Chat.Service.Channel.UpdatedVideo",messageActionChannelDeletePhoto:"Chat.Service.Channel.RemovedPhoto",messageActionHistoryClear:"HistoryCleared",messageActionDiscussionStarted:"DiscussionStarted",messageActionChannelMigrateFrom:"ActionMigrateFromGroup","messageActionPhoneCall.video_in_ok":"ChatList.Service.VideoCall.incoming","messageActionPhoneCall.video_out_ok":"ChatList.Service.VideoCall.outgoing","messageActionPhoneCall.video_missed":"ChatList.Service.VideoCall.Missed","messageActionPhoneCall.video_cancelled":"ChatList.Service.VideoCall.Cancelled","messageActionPhoneCall.in_ok":"ChatList.Service.Call.incoming","messageActionPhoneCall.out_ok":"ChatList.Service.Call.outgoing","messageActionPhoneCall.missed":"ChatList.Service.Call.Missed","messageActionPhoneCall.cancelled":"ChatList.Service.Call.Cancelled","messageActionGroupCall.started":"Chat.Service.VoiceChatStarted.Channel","messageActionGroupCall.started_by":"Chat.Service.VoiceChatStarted","messageActionGroupCall.started_byYou":"Chat.Service.VoiceChatStartedYou","messageActionGroupCall.ended":"Chat.Service.VoiceChatFinished.Channel","messageActionGroupCall.ended_by":"Chat.Service.VoiceChatFinished","messageActionGroupCall.ended_byYou":"Chat.Service.VoiceChatFinishedYou",messageActionBotAllowed:"Chat.Service.BotPermissionAllowed"},p=a.IS_MOBILE?"Message.Unsupported.Mobile":"Message.Unsupported.Desktop";var f;!function(e){let t,a;function m(t){e.lastRequestedLangCode=t,e.lastRequestedNormalizedLangCode=t.split("-")[0]}function p(){if("h12"===e.timeFormat)try{const t=A({hour:"numeric",minute:"numeric",hour12:!0}),n=new Date;n.setHours(0);const s=t.format(n);e.amPmCache.am=s.split(/\s/)[1],n.setHours(12);const i=t.format(n);e.amPmCache.pm=i.split(/\s/)[1]}catch(t){console.error("cannot get am/pm",t),e.amPmCache={am:"AM",pm:"PM"}}}function f(){const e=o.Z.langPackCode;return m(e),Promise.all([n.e(104).then(n.bind(n,9104)),n.e(301).then(n.bind(n,9301)),n.e(8).then(n.bind(n,9179))]).then((([t,n,s])=>{const i=[];return b(t.default,i),b(n.default,i),y({_:"langPackDifference",from_version:0,lang_code:e,strings:i,version:0,local:!0,countries:s.default})}))}function v(t,s){e.requestedServerLanguage=!0;const i=r.Z.managers;return Promise.all([i.apiManager.invokeApiCacheable("langpack.getLangPack",{lang_code:t,lang_pack:"web"}),!1,n.e(104).then(n.bind(n,9104)),n.e(301).then(n.bind(n,9301)),i.apiManager.invokeApiCacheable("help.getCountriesList",{lang_code:t,hash:0}),e.polyfillPromise])}function b(e,t=[]){for(const n in e){const s=e[n];"string"==typeof s?t.push({_:"langPackString",key:n,value:s}):t.push(Object.assign({_:"langPackStringPluralized",key:n},s))}return t}function y(e){return e.appVersion=o.Z.langPackVersion,i.Z.set({langPack:e}).then((()=>(w(e),e)))}function w(n){const s=e.lastRequestedLangCode;if(n.lang_code===s){try{t=new Intl.PluralRules(e.lastRequestedNormalizedLangCode)}catch(n){console.error("pluralRules error",n),t=new Intl.PluralRules(e.lastRequestedNormalizedLangCode.split("-",1)[0])}try{t=new Intl.PluralRules(n.lang_code)}catch(e){console.error("pluralRules error",e),t=new Intl.PluralRules(n.lang_code.split("-",1)[0])}e.strings.clear();for(const t of n.strings)e.strings.set(t.key,t);n.countries&&(e.countriesList.length=0,e.countriesList.push(...n.countries.countries),n.countries.countries.forEach((t=>{if(t.name){const n=t.default_name;e.strings.set(n,{_:"langPackString",key:n,value:t.name})}}))),e.lastAppliedLangCode!==s&&(r.Z.dispatchEvent("language_change",s),e.lastAppliedLangCode=s,E.clear(),p()),Array.from(document.querySelectorAll(".i18n")).forEach((t=>{const n=e.weakMap.get(t);n&&n.update()}))}}function S(e,t,n={i:0}){const s=[];let i=0;return e.replace(/(\*\*|__)(.+?)\1|(\n)|(\[.+?\]\(.*?\))|un\d|%\d\$.|%./g,((e,o,r,a,c,l,d)=>{if(s.push(d.slice(i,l)),o){let e;switch(o){case"**":e=document.createElement("b");break;case"__":e=document.createElement("i")}e.append(...S(r,t,n)),s.push(e)}else if(a)s.push(document.createElement("br"));else if(c){const e=c.lastIndexOf("]"),i=c.slice(1,e),o=c.slice(e+2,c.length-1);let r;if(o&&(0,h.Z)(o)){r=document.createElement("a");const e=(0,u.Z)(o);r.href=e.url,e.onclick&&r.setAttribute("onclick",e.onclick),r.target="_blank"}else r=t[n.i++],r instanceof DocumentFragment&&(r=r.firstChild),r.textContent="";r.append(...S(i,t,n)),s.push(r)}else t&&function(e,t,n){const s=t[n.i++];Array.isArray(s)?e.push(...s):e.push(s)}(s,t,n);return i=l+e.length,""})),i!==e.length&&s.push(e.slice(i)),s}function k(n,s=!1,i){const o=e.strings.get(n);let r;if(o)if("langPackStringPluralized"===o._&&(null==i?void 0:i.length)){let e=i[0];"string"==typeof e&&(e=+e.replace(/\D/g,"")),r=o[t.select(e)+"_value"]||o.other_value}else r="langPackString"===o._?o.value:n;else r=n;const a=S(r,i);return s?a.map((e=>e instanceof Node?e.textContent:e)).join(""):a}e.strings=new Map,e.countriesList=[],e.requestedServerLanguage=!1,e.isRTL=!1,e.setRTL=function(t){e.isRTL=t},e.getCacheLangPack=function(){return a||(a=Promise.all([i.Z.get("langPack"),e.polyfillPromise]).then((([t])=>t?(s.ZP,e.lastRequestedLangCode||m(t.lang_code),w(t),t):f())).finally((()=>{a=void 0})))},e.setTimeFormat=function(t,n=!!e.timeFormat&&e.timeFormat!==t){e.timeFormat=t,p(),n&&(E.clear(),Array.from(document.querySelectorAll(".i18n")).forEach((t=>{const n=e.weakMap.get(t);n instanceof Z&&n.update()})))},e.loadLocalLangPack=f,e.loadLangPack=v,e.getStrings=function(e,t){return r.Z.managers.apiManager.invokeApi("langpack.getStrings",{lang_pack:o.Z.langPack,lang_code:e,keys:t})},e.formatLocalStrings=b,e.getLangPack=function(e,t){return m(e),v(e).then((([e,t,n,s,i,o])=>{let r=[];return[n,s].forEach((e=>{b(e.default,r)})),r=r.concat(...[e.strings,t.strings].filter(Boolean)),e.strings=r,e.countries=i,y(e)}))},e.saveLangPack=y,e.polyfillPromise="undefined"!=typeof Intl&&void 0!==Intl.PluralRules?Promise.resolve():n.e(642).then(n.bind(n,4642)).then((e=>{window.Intl=Object.assign("undefined"!=typeof Intl?Intl:{},e.default)})),e.applyLangPack=w,e.superFormatter=S,e.format=k,e.weakMap=new WeakMap;class P{constructor(t){this.element=(null==t?void 0:t.element)||document.createElement("span"),this.element.classList.add("i18n"),this.property=null==t?void 0:t.property,t&&(t.key||t.date)&&this.update(t),e.weakMap.set(this.element,this)}}class _ extends P{constructor(e={}){var t;super(Object.assign(Object.assign({},e),{property:null!==(t=e.property)&&void 0!==t?t:"innerHTML"}))}update(e){if((0,l.Z)(this,e),"innerHTML"===this.property)this.element.textContent="",this.element.append(...k(this.key,!1,this.args));else{const e=this.element[this.property],t=k(this.key,!0,this.args);void 0===e?this.element.dataset[this.property]=t:this.element[this.property]=t}}compareAndUpdate(e){if(this.key!==e.key||!(0,c.Z)(this.args,e.args))return this.update(e)}}e.IntlElement=_;const E=new Map;function A(t={}){const n=JSON.stringify(t);let s=E.get(n);return s||(s=new Intl.DateTimeFormat(e.lastRequestedNormalizedLangCode+"-u-hc-"+e.timeFormat,t),E.set(n,s)),s}e.amPmCache={am:"AM",pm:"PM"};class Z extends P{constructor(e){var t;super(Object.assign(Object.assign({},e),{property:null!==(t=e.property)&&void 0!==t?t:"textContent"})),(0,g.m)(this.element)}update(t){let n;if((0,l.Z)(this,t),this.options.hour&&this.options.minute&&2===Object.keys(this.options).length){const t=this.date.getHours();n=("0"+("h12"===e.timeFormat?t%12||12:t)).slice(-2)+":"+("0"+this.date.getMinutes()).slice(-2),"h12"===e.timeFormat&&(n+=" "+(t<12?e.amPmCache.am:e.amPmCache.pm))}else{const e=A(this.options);n=(0,d.Z)(e.format(this.date))}this.element[this.property]=n}}e.IntlDateElement=Z,e.i18n=function(e,t){return new _({key:e,args:t}).element},e.i18n_=function(e){return new _(e).element},e._i18n=function(e,t,n,s){return new _({element:e,key:t,args:n,property:s}).element}}(f||(f={}));const v=f,b=f.i18n,y=f.i18n_,w=f._i18n;function S(e,t){const n=e.slice(0,1);for(let s=1;s{const s=e&&t?"AutoDownloadSettings.LastDelimeter":"AutoDownloadSettings.Delimeter";return n?f.format(s,!0):b(s)}));return n?s.join(""):s}s.GO.I18n=f},1507:(e,t,n)=>{n.d(t,{BP:()=>u,BX:()=>m,DZ:()=>v,IA:()=>o,Iw:()=>l,J$:()=>p,NM:()=>s,OS:()=>h,Ox:()=>g,Pt:()=>d,Zi:()=>f,gZ:()=>c,hj:()=>i,rU:()=>a,yF:()=>r});const s=0,i=1271266957,o=777,r=777e3,a=2147483647,c="",l=20971520,d="",h=[7322096,16766590,13338331,9367192,16749490,16478047],u="default_static",g=4295032831,m=new Set(["web","k","z"]),p=0,f=1,v=new Set([p,f]);Math.max(...Array.from(v))},3855:(e,t,n)=>{n.d(t,{Z:()=>se});var s=n(3512),i=n(7730),o=n(410),r=n(7487),a=n(6702),c=n(1722),l=n(2831),d=n(5418),h=n(993),u=n(7328),g=n(6663),m=n(9976),p=n(3731),f=n(6818),v=n(1174),b=n(2341),y=n(9030),w=n(2365),S=n(2820),k=n(5432),P=n(2131),_=n(554),E=n(393),A=n(5269),Z=n(4089),C=n(4762),I=n(5783),L=n(2045),T=n(8189);const O=Object.assign({CAN_USE_TRANSFERABLES:u.Z,IS_APPLE_MX:T.Z,IS_CALL_SUPPORTED:h.Z,IS_CANVAS_FILTER_SUPPORTED:g.Z,IS_EMOJI_SUPPORTED:m.Z,IS_GEOLOCATION_SUPPORTED:p.Z,IS_GROUP_CALL_SUPPORTED:f.Z,IS_MOV_SUPPORTED:y.Z,IS_PARALLAX_SUPPORTED:w.Z,IS_SCREEN_SHARING_SUPPORTED:S.Z,IS_TOUCH_SUPPORTED:k.Z,IS_VIBRATE_SUPPORTED:P.Z,IS_OPUS_SUPPORTED:I.Z,IS_SHARED_WORKER_SUPPORTED:L.Z,IS_WEBM_SUPPORTED:E.Z,IS_WEBP_SUPPORTED:A.Z,IS_WEBRTC_SUPPORTED:Z.Z,IMAGE_MIME_TYPES_SUPPORTED:v.Z,MEDIA_MIME_TYPES_SUPPORTED:b.Z,VIDEO_MIME_TYPES_SUPPORTED:_.Z},C);var M=n(4159),x=n(236),W=n(6009),D=n(8479),R=n(946),N=n(7922),j=n(5466),F=n(5003);const U=x.h.version,B=x.h.build,V=Object.keys(x.h),G=["contactsListCachedTime","stateCreatedTime","maxSeenMsgId","filtersArr"];function $(){return e=this,t=void 0,i=function*(){const e=(0,F.kg)("STATE-LOADER"),t=performance.now(),n=(0,j.$)(e),i=V.map((e=>n(N.Z.get(e),"state "+e))).concat(n(r.Z.get("user_auth"),"auth"),n(r.Z.get("state_id"),"auth"),n(r.Z.get("k_build"),"auth")).concat(n(N.Z.get("user_auth"),"old auth")),a=yield Promise.all(i);e.warn("promises",performance.now()-t);const c=[],l=(e,t)=>{d[e]=t,c.push(e)};let d={};for(let e=0,t=V.length;eN.Z.get(e))));e.push("user_auth"),t.push("number"==typeof h||"string"==typeof h?{dcID:t[0]||M.Z.baseDcId,date:Date.now()/1e3|0,id:h.toPeerId(!1)}:h);const n={};e.forEach(((e,s)=>{n[e]=t[s]})),yield r.Z.set(n)}h&&(d.authState={_:"authStateSignedIn"},s.Z.dispatchEvent("user_auth","number"==typeof h||"string"==typeof h?{dcID:0,date:Date.now()/1e3|0,id:h.toPeerId(!1)}:h));const p=new Set;if(d.stateId!==u){if(void 0!==u){const e=new Map([["authState",void 0],["stateId",void 0]]);e.forEach(((t,n)=>{e.set(n,(0,D.Z)(d[n]))})),d=(0,D.Z)(x.h),e.forEach(((e,t)=>{d[t]=e}));const t={chats:1,dialogs:1,users:1};for(const e in t)p.add(e);f=d,c.length=0,d=f,c.push(...Object.keys(d))}yield r.Z.set({state_id:d.stateId})}var f;const v=Date.now();d.stateCreatedTime+864e5{l(e,(0,D.Z)(x.h[e]))})));const b=d.settings.autoDownload;if(void 0!==(null==b?void 0:b.private)){const e=["contacts","private","groups","channels"];["photo","video","file"].forEach((t=>{const n=b[t]={};e.forEach((e=>{n[e]=b[e]}))})),e.forEach((e=>{delete b[e]})),l("settings",d.settings)}const y=new Set(["settings.themes"]);let w,S;if((0,R.Z)(x.h,d,(e=>{l(e,d[e])}),void 0,y),d.version!==U||d.build!==B){if(d.build<217&&(d.allDialogsLoaded=(0,D.Z)(x.h.allDialogsLoaded),d.pinnedOrders=(0,D.Z)(x.h.pinnedOrders),d.filtersArr=(0,D.Z)(x.h.filtersArr),p.add("dialogs")),-1===(0,W.Z)(d.version,"1.7.1")){let e=!1;if(-1===(0,W.Z)(d.version,"1.3.0"))e=!0,d.settings.theme=(0,D.Z)(x.h.settings.theme),d.settings.themes=(0,D.Z)(x.h.settings.themes);else if(-1===(0,W.Z)(d.version,"1.7.1")){e=!0;const t=d.settings.themes;d.settings.themes=(0,D.Z)(x.h.settings.themes);try{t.forEach((e=>{const t=e.background;if(!t)return;const n=d.settings.themes.find((t=>t.name===e.name));n.settings.highlightningColor=t.highlightningColor;const s=(t.color||"").split(",").map((e=>e&&parseInt(e.slice(1),16)));if(t.color&&!t.slug)n.settings.wallpaper={_:"wallPaperNoFile",id:0,pFlags:{},settings:{_:"wallPaperSettings",pFlags:{}}};else{const e={_:"wallPaper",id:0,access_hash:0,slug:t.slug,document:{},pFlags:{},settings:{_:"wallPaperSettings",pFlags:{}}},s=e.settings;n.settings.wallpaper=e,t.slug&&!t.color?s.pFlags.blur=t.blur||void 0:t.intensity&&(s.intensity=t.intensity,e.pFlags.pattern=!0,e.pFlags.dark=t.intensity<0||void 0)}if(s.length){const e=n.settings.wallpaper.settings;e.background_color=s[0],e.second_background_color=s[1],e.third_background_color=s[2],e.fourth_background_color=s[3]}}))}catch(e){console.error("migrating themes error",e)}}e&&l("settings",d.settings)}0!==(0,W.Z)(d.version,U)&&(w=U,S=d.version),l("version",U),l("build",B)}return g!==B&&(!g||g{var t,n;const{name:s,key:i,value:o}=e;if(!e.hasOwnProperty("key"))return void(this.mirrors[s]=o);const r=null!==(t=(n=this.mirrors)[s])&&void 0!==t?t:n[s]={};void 0===o?delete r[i]:r[i]=o},this.mirrors={},this.tabState={chatPeerIds:[],idleStartTime:0},this.log("constructor"),this.registerWorker(),this.registerServiceWorker(),this.registerCryptoWorker(),this.addMultipleEventsListeners({convertWebp:({fileName:e,bytes:t})=>i.Z.convert(e,t),convertOpus:({fileName:e,bytes:t})=>q.Z.pushDecodeTask(t,!1).then((e=>e.bytes)),event:({name:e,args:t})=>{s.Z.dispatchEventSingle(e,...t)},localStorageProxy:e=>{const t=e;return r.Z[t.type](...t.args)},mirror:this.onMirrorTask}),s.Z.addEventListener("language_change",(e=>{s.Z.managers.networkerFactory.setLanguage(e)})),window.addEventListener("online",(()=>{s.Z.managers.networkerFactory.forceReconnectTimeout()})),s.Z.addEventListener("logging_out",(()=>{Promise.all([(0,X.Z)(!1,!0),r.Z.clear(),Promise.race([l.default.setAuthorized(!1),(0,d.Z)(3e3)]),a.default.forceUnsubscribe(),Promise.all(["cachedFiles","cachedStreamChunks"].map((e=>caches.delete(e))))]).finally((()=>{c.Z.reload()}))})),J.Z.addEventListener("change",(e=>{this.updateTabStateIdle(e)})),this.updateTabStateIdle(J.Z.isIdle),this.log("Passing environment:",O),this.invoke("environment",O)}pingServiceWorkerWithIframe(){if(this.pingServiceWorkerPromise)return this.pingServiceWorkerPromise;const e=this.pingServiceWorkerPromise=(0,Q.Z)(),t=document.createElement("iframe");t.hidden=!0;const n=()=>{setTimeout((()=>{this.pingServiceWorkerPromise=void 0}),1e4),clearTimeout(s),t.remove(),t.removeEventListener("load",n),t.removeEventListener("error",n),e.resolve()};t.addEventListener("load",n),t.addEventListener("error",n),t.src="ping/"+(4294967295*Math.random()|0),document.body.append(t);const s=window.setTimeout(n,1e3);return e}attachServiceWorker(e){this.lastServiceWorker&&this.serviceMessagePort.detachPort(this.lastServiceWorker),this.serviceMessagePort.attachSendPort(this.lastServiceWorker=e),this.serviceMessagePort.invokeVoid("hello",void 0)}_registerServiceWorker(){navigator.serviceWorker.register(new URL(n.p+n.u(670),n.b),{scope:"./"}).then((e=>{if(this.log("SW registered",e),e.active&&!navigator.serviceWorker.controller)return e.unregister().then((()=>{window.location.reload()}));(e.installing||e.waiting||e.active).addEventListener("statechange",(e=>{this.log("SW statechange",e)}));const t=navigator.serviceWorker.controller||e.installing||e.waiting||e.active;this.attachServiceWorker(t)}),(e=>{this.log.error("SW registration failed!",e),this.invokeVoid("serviceWorkerOnline",!1)}))}registerServiceWorker(){if(!("serviceWorker"in navigator))return;this.serviceMessagePort=new K.Z;const e=navigator.serviceWorker;this._registerServiceWorker(),e.addEventListener("controllerchange",(()=>{this.log.warn("controllerchange");const t=e.controller;this.attachServiceWorker(t),t.addEventListener("error",(e=>{this.log.error("controller error:",e)}))})),this.serviceMessagePort.attachListenPort(e),this.serviceMessagePort.addMultipleEventsListeners({port:(e,t,n)=>{this.invokeVoid("serviceWorkerPort",void 0,void 0,[n.ports[0]])},hello:(e,t)=>{this.serviceMessagePort.resendLockTask(t)},share:e=>{this.log("will try to share something"),this.share=e}}),e.addEventListener("messageerror",(e=>{this.log.error("SW messageerror:",e)}))}registerCryptoWorker(){return ee(this,void 0,void 0,(function*(){const e={construct:(e,t)=>({url:t[0]+location.search})},t=[Worker,"undefined"!=typeof SharedWorker&&SharedWorker].filter(Boolean);t.forEach((t=>window[t.name]=new Proxy(t,e)));const s=new Worker(new URL(n.p+n.u(589),n.b),{type:void 0});t.forEach((e=>window[e.name]=e));const i=s.url,o=e=>new a(e,{type:"module"}),r=e=>this.attachWorkerToPort(e,Y.Z,"crypto"),a=L.Z?SharedWorker:Worker;Y.Z.addEventListener("port",((e,t,n)=>{this.invokeVoid("cryptoPort",void 0,void 0,[n.ports[0]])})),r(o(i));const c=yield(l=i,fetch(l).then((e=>e.text())).then((e=>{const t=location.pathname.split("/");return t[t.length-1]="",e=`\n var originalImportScripts = importScripts; \n importScripts = (url) => {\n console.log('importScripts', url);\n var newUrl = '${location.origin+t.join("/")}' + url.split('/').pop();\n return originalImportScripts(newUrl);\n };\n ${e}`,new Blob([e],{type:"application/javascript"})})));var l;(yield this.invoke("createProxyWorkerURLs",{originalUrl:i,blob:c})).slice(1).map(o).forEach(r)}))}registerWorker(){let e;e=L.Z?new SharedWorker(new URL(n.p+n.u(678),n.b),{type:void 0}):new Worker(new URL(n.p+n.u(678),n.b),{type:void 0}),this.onWorkerFirstMessage(e)}attachWorkerToPort(e,t,n){const s=e.port||e;t.attachPort(s),e.addEventListener("error",(e=>{this.log.error(n,"worker error",e)}))}onWorkerFirstMessage(e){this.log("set webWorker"),this.attachWorkerToPort(e,this,"mtproto")}loadState(){return Promise.all([(null!=z?z:z=$()).then((e=>(this.newVersion=e.newVersion,this.oldVersion=e.oldVersion,this.mirrors.state=e.state,e)))])}sendState(){return this.loadState().then((e=>{const[t]=e;return this.invoke("state",Object.assign(Object.assign({},t),{userId:s.Z.myId.toUserId()})),e}))}invokeCrypto(e,...t){return Y.Z.invokeCrypto(e,...t)}toggleStorages(e,t){return ee(this,void 0,void 0,(function*(){yield(0,X.Z)(e,t),this.invoke("toggleStorages",{enabled:e,clearWrite:t}),this.serviceMessagePort.invokeVoid("toggleStorages",{enabled:e,clearWrite:t})}))}getMirror(e){return ee(this,void 0,void 0,(function*(){return this.mirrors[e]}))}getState(){return this.getMirror("state")}updateTabState(e,t){this.tabState[e]=t,this.invokeVoid("tabState",this.tabState)}updateTabStateIdle(e){this.updateTabState("idleStartTime",e?Date.now():0)}}const ne=new te;o.GO.apiManagerProxy=ne;const se=ne},490:(e,t,n)=>{n.d(t,{Z:()=>f});var s=n(4159),i=n(410),o=n(2219),r=n(2045),a=n(3241),c=n(2586),l=n(5003),d=n(3512),h=n(7487),u=n(3855);const g=r.Z;class m extends a.Z{constructor(){super(!1),this.log=(0,l.kg)("INSTANCE"),this.clearInstance=()=>{this.masterInstance&&!this.deactivated&&(this.log.warn("clear master instance"),h.Z.delete("xt_instance"))},this.checkInstance=(e=c.Z.isIdle)=>{return t=this,n=void 0,o=function*(){if(this.deactivated)return;const t=Date.now(),n={id:this.instanceId,idle:e,time:t},[i,o=s.Z.build]=yield Promise.all([h.Z.get("xt_instance",!1),h.Z.get("k_build",!1)]);if(o>s.Z.build)return this.masterInstance=!1,d.Z.managers.networkerFactory.stopAll(),this.deactivateInstance("version"),void u.Z.toggleStorages(!1,!1);g?h.Z.set({xt_instance:n}):!e||!i||i.id===this.instanceId||i.timethis.deactivateInstance("tabs")),3e4)))},new((i=void 0)||(i=Promise))((function(e,s){function r(e){try{c(o.next(e))}catch(e){s(e)}}function a(e){try{c(o.throw(e))}catch(e){s(e)}}function c(t){var n;t.done?e(t.value):(n=t.value,n instanceof i?n:new i((function(e){e(n)}))).then(r,a)}c((o=o.apply(t,n||[])).next())}));var t,n,i,o},this.log=(0,l.kg)("INSTANCE"),this.instanceId=o.Z}get deactivatedReason(){return this.deactivated}start(){if(this.reset(),!this.started){this.started=!0,c.Z.addEventListener("change",this.checkInstance),setInterval(this.checkInstance,5e3),this.checkInstance();try{document.documentElement.addEventListener("beforeunload",this.clearInstance)}catch(e){}}}reset(){this.masterInstance=!1,this.clearDeactivateTimeout(),this.deactivated=void 0}activateInstance(){this.deactivated&&(this.reset(),this.checkInstance(!1),this.dispatchEvent("activated"))}deactivateInstance(e){this.masterInstance||this.deactivated||(this.log.warn("deactivate",e),this.clearDeactivateTimeout(),this.deactivated=e,this.dispatchEvent("deactivated",e))}clearDeactivateTimeout(){this.deactivateTimeout&&(clearTimeout(this.deactivateTimeout),this.deactivateTimeout=0)}}const p=new m;i.GO&&(i.GO.singleInstance=p);const f=p},2831:(e,t,n)=>{n.r(t),n.d(t,{TelegramMeWebManager:()=>c,default:()=>d});var s=n(4159),i=n(410),o=n(1267),r=n(7298),a=n(7487);class c{constructor(){this.disabled=o.Z.test||!s.Z.domains.includes(location.hostname)}setAuthorized(e){if(!this.disabled)return a.Z.get("tgme_sync").then((t=>{const n=(0,r.Z)(!0);if(e&&(null==t?void 0:t.canRedirect)===e&&t.ts+86400>n)return;a.Z.set({tgme_sync:{canRedirect:e,ts:n}});const i=`_websync_?authed=${e?"1":"0"}&version=${encodeURIComponent(s.Z.version+" "+s.Z.suffix)}`,o=["//telegram.me/"+i,"//t.me/"+i].map((e=>function(e){const t=document.createElement("script"),n=new Promise((e=>{t.onload=t.onerror=()=>{e(t)}}));return t.src=e,document.body.appendChild(t),n}(e).then((e=>{e.remove()}))));return Promise.all(o)}))}}const l=new c;i.GO&&(i.GO.telegramMeWebManager=l);const d=l},6702:(e,t,n)=>{n.r(t),n.d(t,{WebPushApiManager:()=>g,default:()=>p});var s=n(410),i=n(5003),o=n(3855),r=n(2325),a=n(4762),c=n(1722),l=n(8479),d=n(490),h=n(3241),u=n(2790);class g extends h.Z{constructor(){super(!1),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=(0,i.kg)("PM"),this.subscribe=()=>{this.isAvailable&&navigator.serviceWorker.ready.then((e=>{e.pushManager.subscribe({userVisibleOnly:this.userVisibleOnly}).then((e=>{this.isPushEnabled=!0,this.pushSubscriptionNotify("subscribe",e)})).catch((e=>{"denied"===Notification.permission?this.log("Permission for Notifications was denied"):(this.log("Unable to subscribe to push.",e),this.userVisibleOnly||(this.userVisibleOnly=!0,setTimeout(this.subscribe,0)))}))}))},this.isAliveNotify=()=>{if(!this.isAvailable||d.Z.deactivatedReason)return;this.settings.baseUrl=(location.href||"").replace(/#.*$/,"");const e={},t={push_action_mute1d:a.IS_MOBILE?"PushNotification.Action.Mute1d.Mobile":"PushNotification.Action.Mute1d",push_action_settings:a.IS_MOBILE?"PushNotification.Action.Settings.Mobile":"PushNotification.Action.Settings",push_message_nopreview:"PushNotification.Message.NoPreview"};for(const n in t)e[n]=r.ZP.format(t[n],!0);o.Z.serviceMessagePort.invokeVoid("pushPing",{localNotifications:this.localNotificationsAvailable,lang:e,settings:this.settings}),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((e=>{e.pushManager.getSubscription().then((e=>{this.isPushEnabled=!!e,this.pushSubscriptionNotify("init",e)})).catch((e=>{this.log.error("Error during getSubscription()",e)}))}))}unsubscribe(){this.isAvailable&&navigator.serviceWorker.ready.then((e=>{e.pushManager.getSubscription().then((e=>{this.isPushEnabled=!1,e&&(this.pushSubscriptionNotify("unsubscribe",e),setTimeout((()=>{e.unsubscribe().then((e=>{this.isPushEnabled=!1})).catch((e=>{this.log.error("Unsubscription error: ",e)}))}),3e3))})).catch((e=>{this.log.error("Error thrown while unsubscribing from push messaging.",e)}))}))}forceUnsubscribe(){this.isAvailable&&navigator.serviceWorker.ready.then((e=>{e.pushManager.getSubscription().then((e=>{this.log.warn("force unsubscribe",e),e&&e.unsubscribe().then((e=>{this.log.warn("force unsubscribe successful",e),this.isPushEnabled=!1})).catch((e=>{this.log.error("Unsubscription error: ",e)}))})).catch((e=>{this.log.error("Error thrown while unsubscribing from push messaging.",e)}))}))}setSettings(e){this.settings=(0,l.Z)(e),clearTimeout(this.isAliveTO),this.isAliveNotify()}hidePushNotifications(){this.isAvailable&&o.Z.serviceMessagePort.invokeVoid("notificationsClear",void 0)}setUpServiceWorkerChannel(){this.isAvailable&&(o.Z.serviceMessagePort.addEventListener("pushClick",(e=>{d.Z.deactivatedReason?c.Z.reload():this.dispatchEvent("push_notification_click",e)})),navigator.serviceWorker.ready.then(this.isAliveNotify))}pushSubscriptionNotify(e,t){if(t){const n=t.toJSON();if(!(n&&n.endpoint&&n.keys&&n.keys.p256dh&&n.keys.auth))return this.log.warn("Invalid push subscription",n),this.unsubscribe(),this.isAvailable=!1,void this.pushSubscriptionNotify(e);this.log.warn("Push",e,n),this.dispatchEvent("push_"+e,{tokenType:10,tokenValue:JSON.stringify(n)})}else this.log.warn("Push",e,!1),this.dispatchEvent("push_"+e,!1)}ignorePushByMid(e,t){this.isAvailable&&o.Z.serviceMessagePort.invokeVoid("shownNotification",e+"_"+(0,u.Z)(t))}}const m=new g;s.GO&&(s.GO.webPushApiManager=m);const p=m},9043:(e,t,n)=>{n.d(t,{Z:()=>d});var s=n(410),i=n(5783),o=n(4762),r=n(5003),a=n(3855),c=function(e,t,n,s){return new(n||(n=Promise))((function(i,o){function r(e){try{c(s.next(e))}catch(e){o(e)}}function a(e){try{c(s.throw(e))}catch(e){o(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(r,a)}c((s=s.apply(e,t||[])).next())}))};const l=new class{constructor(){this.sampleRate=48e3,this.tasks=[],this.keepAlive=!1,this.log=(0,r.kg)("OPUS",r.v9.Error)}isPlaySupported(){return i.Z}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},o.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},o.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(((n,s)=>{const i={pages:e,withWaveform:t,callback:{resolve:n,reject:s},timeout:0};this.loadWorker(),this.loadWavWorker(),1===this.tasks.push(i)&&this.executeNewTask(i)}))}decode(e,t=!1){return c(this,void 0,void 0,(function*(){return this.pushDecodeTask(e,t).then((e=>c(this,void 0,void 0,(function*(){const t=new Blob([e.bytes],{type:"audio/wav"});return{url:yield a.Z.invoke("createObjectURL",t),waveform:e.waveform}}))))}))}};s.GO.opusDecodeController=l;const d=l},2423:(e,t,n)=>{n.d(t,{$2:()=>u,E:()=>g,Hk:()=>p,QB:()=>m,SC:()=>f,bu:()=>l,it:()=>c,kO:()=>b,tY:()=>v});var s=n(1229);const i="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",o="0-9_"+i,r="["+i+"0-9]",a="((?:https?|ftp)://|mailto:)?",c=a+"(?:"+r+"{1,64}(?::"+r+"{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}|"+r+"["+i+"ยท0-9-]{0,64}(?:\\."+r+"["+i+"ยท0-9-]{0,64}){0,10}(?:\\.(xn--[0-9a-z]{2,16}|["+i+"]{2,24})))(?::\\d{2,5})?(?:/(?:\\S{0,255}[^\\s.;,(\\[\\]{}<>\"'])?)?",l=(new RegExp("^"+a.slice(0,-1),"i"),/^((?:[^\/]+?):\/\/|mailto:)/),d="[a-zA-Z\\d_]{5,32}",h="\\/([a-zA-Z\\d_]{1,32})(?:@("+d+"))?(\\b|$)",u=new RegExp("(^| )(@)("+d+")|("+c+")|(\\n)|("+s.Z+")|(^|[\\s\\(\\]])(#["+o+"]{2,64})|(^|\\s)"+h,"i"),g=/^(([^<>()[\]\\.,;:\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,p={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}"},f={"`":"messageEntityCode","``":"messageEntityPre","**":"messageEntityBold",__:"messageEntityItalic","~~":"messageEntityStrike","_-_":"messageEntityUnderline","||":"messageEntitySpoiler"},v=new Set(["messageEntityEmoji","messageEntityLinebreak","messageEntityCaret"]);for(const e in f)v.add(f[e]);const b=/^\+\d+$/},3591:(e,t,n)=>{n.d(t,{Z:()=>a});var s=n(2423),i=n(410),o=n(6637),r=n(1507);function a(e,t){(0,o.Z)(e)||(e="https://"+e);const n={url:e};let i,a,c,l;if(i=e.match(/^(?:https?:\/\/)?(?:(.+?)\.)?(?:(?:web|k|z)\.)?t(?:elegram)?\.me(?:\/(.+))?/)){const t=new URL(e);let n=i[1];n&&r.BX.has(i[1])&&(n=void 0),n&&(t.pathname=n+("/"===t.pathname?"":t.pathname));const o=t.pathname.slice(1),a=o.split("/");if(a[0]&&"$"===a[0][0]&&a[0].length>1)l="invoice";else if(/^\W/.test(o)&&!s.kO.test(o))l="joinchat";else switch(a[0]){case"joinchat":case"addstickers":case"addemoji":case"voicechat":case"invoice":if(1!==a.length&&!n){l=a[0];break}default:if(a[1]&&a[1].match(/^\d+(?:\?(?:comment|thread)=\d+)?$/)||1===a.length){l="im";break}}}else(a=e.match(/^(?:https?:\/\/)?telesco\.pe\/([^/?]+)\/(\d+)/))?l="im":(c=e.match(/tg:(?:\/\/)?(.+?)(?:\?|$)/))&&(l="tg_"+c[1]);return window[l]||(l=void 0),n.onclick=l,n}i.GO&&(i.GO.wrapUrl=a)},3512:(e,t,n)=>{n.d(t,{Z:()=>d});var s=n(1507),i=n(3241),o=n(410),r=n(3206),a=n(1352);class c extends i.Z{constructor(){super(),this.myId=s.NM,this.connectionStatus={},this.premium=!1,this.addEventListener("user_auth",(({id:e})=>{this.myId=e.toPeerId()})),this.addEventListener("premium_toggle_private",(({isNew:e,isPremium:t})=>{this.premium=t,e||this.dispatchEventSingle("premium_toggle",t)})),this.addEventListener("connection_status_change",(e=>{this.connectionStatus[e.name]=e})),this.dispatchEvent=(e,...t)=>{super.dispatchEvent(e,...t),r.Z.getInstance().invokeVoid("event",{name:e,args:t})},a.kC||this.addEventListener("settings_updated",(({settings:e})=>{this.settings=e}))}getConnectionStatus(){return this.connectionStatus}getPremium(){return this.premium}dispatchEventSingle(...e){super.dispatchEvent(...e)}}const l=new c;o.GO.rootScope=l;const d=l},7730:(e,t,n)=>{n.d(t,{Z:()=>r});var s=n(410),i=n(3725);const o=new class{constructor(){this.convertPromises={}}init(){this.worker=new Worker(new URL(n.p+n.u(61),n.b)),this.worker.addEventListener("message",(e=>{const t=e.data.payload,n=this.convertPromises[t.fileName];n&&(t.bytes?n.resolve(t.bytes):n.reject(),delete this.convertPromises[t.fileName])}))}postMessage(e){this.init&&(this.init(),this.init=null),this.worker.postMessage(e)}convert(e,t){if(this.convertPromises.hasOwnProperty(e))return this.convertPromises[e];const n=(0,i.Z)();return this.postMessage({type:"convertWebp",payload:{fileName:e,bytes:t}}),this.convertPromises[e]=n}};s.GO.webpWorkerController=o;const r=o}},r={};function a(e){var t=r[e];if(void 0!==t)return t.exports;var n=r[e]={exports:{}};return o[e].call(n.exports,n,n.exports,a),n.exports}a.m=o,e=[],a.O=(t,n,s,i)=>{if(!n){var o=1/0;for(d=0;d=i)&&Object.keys(a.O).every((e=>a.O[e](n[c])))?n.splice(c--,1):(r=!1,i0&&e[d-1][2]>i;d--)e[d]=e[d-1];e[d]=[n,s,i]},a.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return a.d(t,{a:t}),t},n=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,a.t=function(e,s){if(1&s&&(e=this(e)),8&s)return e;if("object"==typeof e&&e){if(4&s&&e.__esModule)return e;if(16&s&&"function"==typeof e.then)return e}var i=Object.create(null);a.r(i);var o={};t=t||[null,n({}),n([]),n(n)];for(var r=2&s&&e;"object"==typeof r&&!~t.indexOf(r);r=n(r))Object.getOwnPropertyNames(r).forEach((t=>o[t]=()=>e[t]));return o.default=()=>e,a.d(i,o),i},a.d=(e,t)=>{for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},a.f={},a.e=e=>Promise.all(Object.keys(a.f).reduce(((t,n)=>(a.f[n](e,t),t)),[])),a.u=e=>(({589:"crypto.worker",630:"npm.qr-code-styling",670:"sw",678:"mtproto.worker"}[e]||e)+"."+{8:"93d2f33af815eb0455aa",53:"9088c624bc0da70fcd02",61:"99941a688bad81e71e09",63:"7e1f9a4ae86bb873ca6d",77:"b8cf11d2b5dca36479ca",104:"476c2f411510266c35de",147:"4eb614e56f1d9fbfd1e7",231:"f4d1bfe6ff7f14577f96",301:"95838a8203f23dd1ce8f",339:"12bdbede82465e666965",392:"031f85fcb7cf31c35a88",436:"65389e22546d82aaa8c8",437:"487f9ec608fdb29ab7a0",442:"765ae47d035fd5250820",508:"a90261547e5af541e4e8",589:"f500ff0fffe065cf9cba",630:"f8f57a1c721e03c3f699",641:"e29a883ff173169e88cd",642:"be93122d1116ecdc9322",670:"a575e0dcdf92b2ccb0f9",678:"e3a23c58261a5160e0d7",684:"a0a965e6cfe303d2345a",709:"9186b58006e0c80f1e5f",776:"01d9a0f7f70d71de2d79",781:"decdb6e23f9d404a1931",783:"949e247466ad3ebe82d6",810:"58611e718b4eafec6685",813:"315ffd640c7d6013a536"}[e]+".chunk.js"),a.miniCssF=e=>{},a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),s={},i="tweb:",a.l=(e,t,n,o)=>{if(s[e])s[e].push(t);else{var r,c;if(void 0!==n)for(var l=document.getElementsByTagName("script"),d=0;d{r.onerror=r.onload=null,clearTimeout(g);var i=s[e];if(delete s[e],r.parentNode&&r.parentNode.removeChild(r),i&&i.forEach((e=>e(n))),t)return t(n)},g=setTimeout(u.bind(null,void 0,{type:"timeout",target:r}),12e4);r.onerror=u.bind(null,r.onerror),r.onload=u.bind(null,r.onload),c&&document.head.appendChild(r)}},a.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e;a.g.importScripts&&(e=a.g.location+"");var t=a.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var n=t.getElementsByTagName("script");n.length&&(e=n[n.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),a.p=e})(),(()=>{if(void 0!==a){var e=a.u,t=a.e,n={},s={};a.u=function(t){return e(t)+(n.hasOwnProperty(t)?"?"+n[t]:"")},a.e=function(i){return t(i).catch((function(t){var o=s.hasOwnProperty(i)?s[i]:999999;if(o<1){var r=e(i);throw t.message="Loading chunk "+i+" failed after 999999 retries.\n("+r+")",t.request=r,t}return new Promise((function(e){setTimeout((function(){var t=Date.now();n[i]=t,s[i]=o-1,e(a.e(i))}),3e3)}))}))}}})(),(()=>{a.b=document.baseURI||self.location.href;var e={179:0};a.f.j=(t,n)=>{var s=a.o(e,t)?e[t]:void 0;if(0!==s)if(s)n.push(s[2]);else{var i=new Promise(((n,i)=>s=e[t]=[n,i]));n.push(s[2]=i);var o=a.p+a.u(t),r=new Error;a.l(o,(n=>{if(a.o(e,t)&&(0!==(s=e[t])&&(e[t]=void 0),s)){var i=n&&("load"===n.type?"missing":n.type),o=n&&n.target&&n.target.src;r.message="Loading chunk "+t+" failed.\n("+i+": "+o+")",r.name="ChunkLoadError",r.type=i,r.request=o,s[1](r)}}),"chunk-"+t,t)}},a.O.j=t=>0===e[t];var t=(t,n)=>{var s,i,[o,r,c]=n,l=0;if(o.some((t=>0!==e[t]))){for(s in r)a.o(r,s)&&(a.m[s]=r[s]);if(c)var d=c(a)}for(t&&t(n);la(2938)));c=a.O(c)})(); -//# sourceMappingURL=main.ca3d632b985df17254b5.bundle.js.map \ No newline at end of file diff --git a/public/main.ca3d632b985df17254b5.bundle.js.map b/public/main.ca3d632b985df17254b5.bundle.js.map deleted file mode 100644 index 7790adac..00000000 --- a/public/main.ca3d632b985df17254b5.bundle.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"main.ca3d632b985df17254b5.bundle.js","mappings":"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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/create fake namespace object","webpack://tweb/webpack/runtime/load script","webpack://tweb/./src/config/debug.ts","webpack://tweb/./src/config/state.ts","webpack://tweb/./src/helpers/getTimeFormat.ts","webpack://tweb/./src/environment/appleMx.ts","webpack://tweb/./src/environment/callSupport.ts","webpack://tweb/./src/environment/canUseTransferables.ts","webpack://tweb/./src/environment/canvasFilterSupport.ts","webpack://tweb/./src/environment/emojiSupport.ts","webpack://tweb/./src/environment/geolocationSupport.ts","webpack://tweb/./src/environment/groupCallSupport.ts","webpack://tweb/./src/environment/imageMimeTypesSupport.ts","webpack://tweb/./src/environment/mediaMimeTypesSupport.ts","webpack://tweb/./src/environment/movSupport.ts","webpack://tweb/./src/environment/opusSupport.ts","webpack://tweb/./src/environment/parallaxSupport.ts","webpack://tweb/./src/environment/screenSharingSupport.ts","webpack://tweb/./src/environment/sharedWorkerSupport.ts","webpack://tweb/./src/environment/touchSupport.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/environment/vibrateSupport.ts","webpack://tweb/./src/environment/videoMimeTypesSupport.ts","webpack://tweb/./src/environment/webmSupport.ts","webpack://tweb/./src/environment/webpSupport.ts","webpack://tweb/./src/environment/webrtcSupport.ts","webpack://tweb/./src/helpers/color.ts","webpack://tweb/./src/helpers/compareVersion.ts","webpack://tweb/./src/helpers/dom/blurActiveElement.ts","webpack://tweb/./src/helpers/dom/cancelEvent.ts","webpack://tweb/./src/helpers/dom/findUpClassName.ts","webpack://tweb/./src/helpers/dom/fixSafariStickyInput.ts","webpack://tweb/./src/helpers/dom/fixSafariStickyInputFocusing.ts","webpack://tweb/./src/helpers/dom/installPrompt.ts","webpack://tweb/./src/helpers/dom/loadFonts.ts","webpack://tweb/./src/helpers/dom/setInnerHTML.ts","webpack://tweb/./src/helpers/idleController.ts","webpack://tweb/./src/helpers/number/clamp.ts","webpack://tweb/./src/helpers/overlayCounter.ts","webpack://tweb/./src/helpers/schedulers.ts","webpack://tweb/./src/helpers/string/parseUriParams.ts","webpack://tweb/./src/helpers/themeController.ts","webpack://tweb/./src/helpers/setWorkerProxy.ts","webpack://tweb/./src/environment/installPrompt.ts","webpack://tweb/./src/index.ts","webpack://tweb/./src/helpers/dom/toggleAttributePolyfill.ts","webpack://tweb/./src/lib/appManagers/appRuntimeManager.ts","webpack://tweb/./src/lib/appManagers/getProxiedManagers.ts","webpack://tweb/./src/lib/files/idb.ts","webpack://tweb/./src/lib/langPack.ts","webpack://tweb/./src/lib/mtproto/mtproto_config.ts","webpack://tweb/./src/environment/index.ts","webpack://tweb/./src/lib/appManagers/utils/state/loadState.ts","webpack://tweb/./src/lib/mtproto/mtprotoworker.ts","webpack://tweb/./src/lib/mtproto/singleInstance.ts","webpack://tweb/./src/lib/mtproto/telegramMeWebManager.ts","webpack://tweb/./src/helpers/dom/loadScript.ts","webpack://tweb/./src/lib/mtproto/webPushApiManager.ts","webpack://tweb/./src/lib/opusDecodeController.ts","webpack://tweb/./src/lib/richTextProcessor/index.ts","webpack://tweb/./src/lib/richTextProcessor/wrapUrl.ts","webpack://tweb/./src/lib/rootScope.ts","webpack://tweb/./src/lib/webp/webpWorkerController.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/compat get default export","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/make namespace object","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/jsonp chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"tweb:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t};\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","/*\n * 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 './modes';\n\nexport const IS_BETA = process.env.NODE_ENV !== 'production';\nexport const DEBUG = (IS_BETA || Modes.debug)/* && false */;\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\nexport default DEBUG;\n\n// let m = DEBUG;\n/* if(!DEBUG) {\n ctx.sandpitTurtle = () => {\n //if(!m) {\n for(let i in MOUNT_CLASS_TO) {\n ctx[i] = MOUNT_CLASS_TO[i];\n }\n //m = true;\n //}\n\n //DEBUG = !DEBUG;\n };\n} */\n\n/* export const superDebug = (object: any, key: string) => {\n var d = object[key];\n var beforeStr = '', afterStr = '';\n for(var r of d) {\n beforeStr += r.before.hex + '\\n';\n afterStr += r.after.hex + '\\n';\n }\n\n beforeStr = beforeStr.trim();\n afterStr = afterStr.trim();\n //var beforeStr = d.map((r) => r.before.hex).join('\\n');\n //var afterStr = d.map((r) => r.after.hex).join('\\n');\n\n var dada = (name: string, str: string) => {\n var a = document.createElement('a');\n a.target = '_blank';\n a.download = name + '.txt';\n a.href = URL.createObjectURL(new Blob([str], {\n type: 'text/plain'\n }));\n document.body.append(a);\n a.click();\n };\n\n dada(key + '_' + 'before', beforeStr);\n dada(key + '_' + 'after', afterStr);\n}\n\nMOUNT_CLASS_TO.superDebug = superDebug; */\n","/*\n * 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_MOBILE} from '../environment/userAgent';\nimport getTimeFormat from '../helpers/getTimeFormat';\nimport {nextRandomUint} from '../helpers/random';\nimport {AutoDownloadSettings, BaseTheme, NotifyPeer, PeerNotifySettings, Theme, ThemeSettings, WallPaper} from '../layer';\nimport {TopPeerType, MyTopPeer} from '../lib/appManagers/appUsersManager';\nimport DialogsStorage from '../lib/storages/dialogs';\nimport FiltersStorage from '../lib/storages/filters';\nimport {AuthState, Modify} from '../types';\nimport App from './app';\n\nconst STATE_VERSION = App.version;\nconst BUILD = App.build;\n\n// ! DEPRECATED\nexport type Background = {\n type?: 'color' | 'image' | 'default', // ! DEPRECATED\n blur: boolean,\n highlightningColor?: string,\n color?: string,\n slug?: string, // image slug\n intensity?: number, // pattern intensity\n id: string | number, // wallpaper id\n};\n\nexport type AppTheme = Modify\n}>;\n\nexport type AutoDownloadPeerTypeSettings = {\n contacts: boolean,\n private: boolean,\n groups: boolean,\n channels: boolean\n};\n\nexport type State = {\n allDialogsLoaded: DialogsStorage['allDialogsLoaded'],\n pinnedOrders: DialogsStorage['pinnedOrders'],\n // contactsList: UserId[],\n contactsListCachedTime: number,\n updates: Partial<{\n seq: number,\n pts: number,\n date: number\n }>,\n // filters?: FiltersStorage['filters'], // ! DEPRECATED\n filtersArr?: FiltersStorage['filtersArr'],\n maxSeenMsgId: number,\n stateCreatedTime: number,\n recentEmoji: string[],\n recentCustomEmoji: DocId[],\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, // ! DEPRECATED\n private?: boolean, // ! DEPRECATED\n groups?: boolean, // ! DEPRECATED\n channels?: boolean, // ! DEPRECATED\n photo: AutoDownloadPeerTypeSettings,\n video: AutoDownloadPeerTypeSettings,\n file: AutoDownloadPeerTypeSettings\n },\n autoDownloadNew: AutoDownloadSettings,\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: AppTheme[],\n theme: AppTheme['name'],\n notifications: {\n sound: boolean\n },\n nightTheme?: boolean, // ! DEPRECATED\n timeFormat: 'h12' | 'h23'\n },\n playbackParams: ReturnType,\n keepSigned: boolean,\n chatContextMenuHintWasShown: boolean,\n stateId: number,\n notifySettings: {[k in Exclude]?: PeerNotifySettings.peerNotifySettings}\n};\n\n// const BACKGROUND_DAY_MOBILE: Background = {\n// blur: false,\n// slug: '',\n// color: '#dbddbb,#6ba587,#d5d88d,#88b884',\n// highlightningColor: 'hsla(86.4, 43.846153%, 45.117647%, .4)',\n// intensity: 0,\n// id: '1'\n// };\n\n// const BACKGROUND_NIGHT_MOBILE: Background = {\n// blur: false,\n// slug: '',\n// color: '#0f0f0f',\n// highlightningColor: 'hsla(0, 0%, 3.82353%, 0.4)',\n// intensity: 0,\n// id: '-1'\n// };\n\nexport const DEFAULT_THEME: Theme = {\n _: 'theme',\n access_hash: '',\n id: '',\n settings: [{\n _: 'themeSettings',\n pFlags: {},\n base_theme: {_: 'baseThemeClassic'},\n accent_color: 0x3390ec,\n message_colors: [0x4fae4e],\n wallpaper: {\n _: 'wallPaper',\n pFlags: {\n default: true,\n pattern: true\n },\n access_hash: '',\n document: undefined,\n id: '',\n slug: 'pattern',\n settings: {\n _: 'wallPaperSettings',\n pFlags: {},\n intensity: 50,\n background_color: 0xdbddbb,\n second_background_color: 0x6ba587,\n third_background_color: 0xd5d88d,\n fourth_background_color: 0x88b884\n }\n }\n }, {\n _: 'themeSettings',\n pFlags: {},\n base_theme: {_: 'baseThemeNight'},\n accent_color: 0x8774E1,\n message_colors: [0x8774E1],\n wallpaper: {\n _: 'wallPaper',\n pFlags: {\n default: true,\n pattern: true,\n dark: true\n },\n access_hash: '',\n document: undefined,\n id: '',\n slug: 'pattern',\n settings: {\n _: 'wallPaperSettings',\n pFlags: {},\n intensity: -50,\n background_color: 0xfec496,\n second_background_color: 0xdd6cb9,\n third_background_color: 0x962fbf,\n fourth_background_color: 0x4f5bd5\n }\n }\n }],\n slug: '',\n title: '',\n emoticon: '๐Ÿ ',\n pFlags: {default: true}\n};\n\nconst makeDefaultAppTheme = (\n name: AppTheme['name'],\n baseTheme: BaseTheme['_'],\n highlightningColor: string\n): AppTheme => {\n return {\n ...DEFAULT_THEME,\n name,\n settings: {\n ...DEFAULT_THEME.settings.find((s) => s.base_theme._ === baseTheme),\n highlightningColor\n }\n };\n};\n\nexport const STATE_INIT: State = {\n allDialogsLoaded: {},\n pinnedOrders: {},\n // contactsList: [],\n contactsListCachedTime: 0,\n updates: {},\n filtersArr: [],\n maxSeenMsgId: 0,\n stateCreatedTime: Date.now(),\n recentEmoji: [],\n recentCustomEmoji: [],\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 photo: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n },\n video: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n },\n file: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n }\n },\n autoDownloadNew: {\n _: 'autoDownloadSettings',\n file_size_max: 3145728,\n pFlags: {\n video_preload_large: true,\n audio_preload_next: true\n },\n photo_size_max: 1048576,\n video_size_max: 15728640,\n video_upload_maxbitrate: 100\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 makeDefaultAppTheme('day', 'baseThemeClassic', 'hsla(86.4, 43.846153%, 45.117647%, .4)'),\n makeDefaultAppTheme('night', 'baseThemeNight', 'hsla(299.142857, 44.166666%, 37.470588%, .4)')\n ],\n theme: 'system',\n notifications: {\n sound: false\n },\n timeFormat: getTimeFormat()\n },\n playbackParams: {\n volume: 1,\n muted: false,\n playbackRate: 1,\n playbackRates: {\n voice: 1,\n video: 1,\n audio: 1\n },\n loop: false,\n round: false\n },\n keepSigned: true,\n chatContextMenuHintWasShown: false,\n stateId: nextRandomUint(32),\n notifySettings: {}\n};\n","export default function getTimeFormat(): 'h12' | 'h23' {\n // try {\n // const resolvedOptions = Intl.DateTimeFormat(navigator.language, {hour: 'numeric'}).resolvedOptions();\n // if('hourCycle' in resolvedOptions) {\n // return (resolvedOptions as any).hourCycle === 'h12' ? 'h12' : 'h23';\n // } else {\n // return resolvedOptions.hour12 ? 'h12' : 'h23';\n // }\n // } catch(err) {\n return new Date().toLocaleString().match(/\\s(AM|PM)/) ? 'h12' : 'h23';\n // }\n}\n","let IS_APPLE_MX = false;\n\ntry {\n // Awesome detect from https://stackoverflow.com/a/65412357\n const ctx = document.createElement('canvas').getContext('webgl');\n const extension = ctx.getExtension('WEBGL_debug_renderer_info');\n const renderer: string = extension && ctx.getParameter(extension.UNMASKED_RENDERER_WEBGL) || '';\n if((renderer.match(/Apple/) && !renderer.match(/Apple GPU/)) ||\n ctx.getSupportedExtensions().indexOf('WEBGL_compressed_texture_s3tc_srgb') === -1) {\n IS_APPLE_MX = true;\n }\n} catch(err) {\n\n}\n\nexport default IS_APPLE_MX;\n","import IS_WEBRTC_SUPPORTED from './webrtcSupport';\n\nconst IS_CALL_SUPPORTED = IS_WEBRTC_SUPPORTED;\n\nexport default IS_CALL_SUPPORTED;\n","import {IS_SAFARI} from './userAgent';\n\n/*\n * This is used as a workaround for a memory leak in Safari caused by using Transferable objects to\n * transfer data between WebWorkers and the main thread.\n * https://github.com/mapbox/mapbox-gl-js/issues/8771\n *\n * This should be removed once the underlying Safari issue is fixed.\n */\n\nlet CAN_USE_TRANSFERABLES: boolean;\nif(!IS_SAFARI) CAN_USE_TRANSFERABLES = true;\nelse {\n try {\n const match = navigator.userAgent.match(/Version\\/(.+?) /);\n CAN_USE_TRANSFERABLES = +match[1] >= 14;\n } catch(err) {\n CAN_USE_TRANSFERABLES = false;\n }\n}\n\nexport default CAN_USE_TRANSFERABLES;\n","const IS_CANVAS_FILTER_SUPPORTED = 'filter' in (document.createElement('canvas').getContext('2d') || {});\n\nexport default IS_CANVAS_FILTER_SUPPORTED;\n","const IS_EMOJI_SUPPORTED = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1/* && false *//* || true */;\n\nexport default IS_EMOJI_SUPPORTED;\n","const IS_GEOLOCATION_SUPPORTED = !!navigator?.geolocation?.getCurrentPosition && false;\n\nexport default IS_GEOLOCATION_SUPPORTED;\n","import IS_WEBRTC_SUPPORTED from './webrtcSupport';\n\nconst IS_GROUP_CALL_SUPPORTED = IS_WEBRTC_SUPPORTED;\n\nexport default IS_GROUP_CALL_SUPPORTED;\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","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","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","const audio = document.createElement('audio');\nconst IS_OPUS_SUPPORTED = !!(audio.canPlayType && audio.canPlayType('audio/ogg;').replace(/no/, ''))/* && false */;\n\nexport default IS_OPUS_SUPPORTED;\n","import {IS_FIREFOX} from './userAgent';\n\nconst IS_PARALLAX_SUPPORTED = !IS_FIREFOX && false;\n\nexport default IS_PARALLAX_SUPPORTED;\n","const IS_SCREEN_SHARING_SUPPORTED = !!('getDisplayMedia' in (navigator?.mediaDevices || {}));\n\nexport default IS_SCREEN_SHARING_SUPPORTED;\n","import Modes from '../config/modes';\n\nconst IS_SHARED_WORKER_SUPPORTED = typeof(SharedWorker) !== 'undefined' && !Modes.noSharedWorker/* && false */;\n\nexport default IS_SHARED_WORKER_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\n// @ts-ignore\nconst IS_TOUCH_SUPPORTED = ('ontouchstart' in window) || (window.DocumentTouch && document instanceof DocumentTouch)/* || true */;\nexport default IS_TOUCH_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 ctx from './ctx';\n\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\n\n// https://stackoverflow.com/a/58065241\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\n !(ctx as any).MSStream;\n\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 */;\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\n\nexport const IS_MOBILE = (navigator.maxTouchPoints === undefined || 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;\n","const IS_VIBRATE_SUPPORTED = !!navigator?.vibrate;\n\nexport default IS_VIBRATE_SUPPORTED;\n","import IS_MOV_SUPPORTED from './movSupport';\n\nexport type VIDEO_MIME_TYPE = 'image/gif' | 'video/mp4' | 'video/webm' | 'video/quicktime';\nconst VIDEO_MIME_TYPES_SUPPORTED: Set = 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 {IS_APPLE_MOBILE, IS_SAFARI} from './userAgent';\n\nconst IS_WEBM_SUPPORTED = !!document.createElement('video').canPlayType('video/webm') && !IS_SAFARI && !IS_APPLE_MOBILE;\n\nexport default IS_WEBM_SUPPORTED;\n","const IS_WEBP_SUPPORTED = document.createElement('canvas').toDataURL('image/webp').startsWith('data:image/webp');\n\nexport default IS_WEBP_SUPPORTED;\n","import {IS_FIREFOX} from './userAgent';\n\nconst IS_WEBRTC_SUPPORTED = !!(typeof(RTCPeerConnection) !== 'undefined' && !IS_FIREFOX);\n\nexport default IS_WEBRTC_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 {WallPaper} from '../layer';\nimport clamp from './number/clamp';\n\nexport type ColorHsla = {\n h: number,\n s: number,\n l: number,\n a: number\n};\n\nexport type ColorRgba = [number, number, number, number];\nexport type ColorRgb = [number, number, number];\n\n/**\n * https://stackoverflow.com/a/54070620/6758968\n * r, g, b in [0, 255]\n * @returns h in [0,360) and s, v in [0,1]\n */\nexport function rgbToHsv(r: number, g: number, b: number): [number, number, number] {\n r /= 255, g /= 255, b /= 255;\n const v = Math.max(r, g, b),\n c = v - Math.min(r, g, b);\n const h = c && ((v === r) ? (g - b ) / c : ((v == g) ? 2 + (b - r) / c : 4 + (r - g) / c));\n return [60 * (h < 0 ? h + 6 : h), v && c / v, v];\n}\n\n/**\n * https://stackoverflow.com/a/54024653/6758968\n * @param h [0, 360]\n * @param s [0, 1]\n * @param v [0, 1]\n * @returns r, g, b in [0, 255]\n */\nexport function hsvToRgb(h: number, s: number, v: number): ColorRgb {\n const f = (n: number, k: number = (n + h / 60) % 6) => Math.round((v - v * s * Math.max(Math.min(k, 4 - k, 1), 0)) * 255);\n return [f(5), f(3), f(1)];\n}\n\n/**\n * @returns h [0, 360], s [0, 100], l [0, 100], a [0, 1]\n */\nexport function rgbaToHsla(r: number, g: number, b: number, a: number = 1): ColorHsla {\n r /= 255, g /= 255, b /= 255;\n const max = Math.max(r, g, b),\n min = Math.min(r, g, b);\n let h: number, s: number;\n const l = (max + min) / 2;\n\n if(max === min) {\n h = s = 0; // achromatic\n } else {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch(max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n\n return {\n h: h * 360,\n s: s * 100,\n l: l * 100,\n a\n };\n}\n\n// * https://stackoverflow.com/a/9493060/6758968\n/**\n * Converts an HSL color value to RGB. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSL_color_space.\n *\n * @param {number} h The hue [0, 360]\n * @param {number} s The saturation [0, 1]\n * @param {number} l The lightness [0, 1]\n * @return {Array} The RGB representation [0, 255]\n */\nexport function hslaToRgba(h: number, s: number, l: number, a: number): ColorRgba {\n h /= 360, s /= 100, l /= 100;\n let r: number, g: number, b: number;\n\n if(s === 0) {\n r = g = b = l; // achromatic\n } else {\n const hue2rgb = function hue2rgb(p: number, q: number, t: number) {\n if(t < 0) t += 1;\n if(t > 1) t -= 1;\n if(t < 1/6) return p + (q - p) * 6 * t;\n if(t < 1/2) return q;\n if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;\n return p;\n }\n\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r = hue2rgb(p, q, h + 1/3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1/3);\n }\n\n return [r, g, b, a].map((v) => Math.round(v * 255)) as ColorRgba;\n}\n\nexport function hslaStringToRgba(hsla: string) {\n const splitted = hsla.slice(5, -1).split(', ');\n const alpha = +splitted.pop();\n const arr = splitted.map((val) => {\n if(val.endsWith('%')) {\n return +val.slice(0, -1);\n }\n\n return +val;\n });\n\n return hslaToRgba(arr[0], arr[1], arr[2], alpha);\n}\n\nexport function hexaToRgba(hexa: string) {\n const arr: ColorRgba = [] as any;\n const offset = hexa[0] === '#' ? 1 : 0;\n if(hexa.length === (5 + offset)) {\n hexa = (offset ? '#' : '') + '0' + hexa.slice(offset);\n }\n\n if(hexa.length === (3 + offset)) {\n for(let i = offset; i < hexa.length; ++i) {\n arr.push(parseInt(hexa[i] + hexa[i], 16));\n }\n } else if(hexa.length === (4 + offset)) {\n for(let i = offset; i < (hexa.length - 1); ++i) {\n arr.push(parseInt(hexa[i] + hexa[i], 16));\n }\n\n arr.push(parseInt(hexa[hexa.length - 1], 16));\n } else {\n for(let i = offset; i < hexa.length; i += 2) {\n arr.push(parseInt(hexa.slice(i, i + 2), 16));\n }\n }\n\n return arr;\n}\n\nexport function hexToRgb(hex: string) {\n return hexaToRgba(hex.slice(0, 7)) as any as ColorRgb;\n}\n\nexport function hexaToHsla(hexa: string) {\n const rgba = hexaToRgba(hexa);\n return rgbaToHsla(rgba[0], rgba[1], rgba[2], rgba[3]);\n}\n\nexport function rgbaToHexa(rgba: ColorRgba | ColorRgb) {\n return '#' + rgba.map((v) => ('0' + v.toString(16)).slice(-2)).join('');\n}\n\nexport function hslaStringToHexa(hsla: string) {\n return rgbaToHexa(hslaStringToRgba(hsla));\n}\n\nexport function hslaStringToHex(hsla: string) {\n return hslaStringToHexa(hsla).slice(0, -2);\n}\n\n/**\n * @param weight [0, 1]\n */\nexport function mixColors(color1: ColorRgb, color2: ColorRgb, weight: number) {\n const out = new Array(3) as ColorRgb;\n for(let i = 0; i < 3; ++i) {\n const v1 = color1[i], v2 = color2[i];\n out[i] = Math.floor(v2 + (v1 - v2) * weight);\n }\n\n return out;\n}\n\nexport function computePerceivedBrightness(color: ColorRgb) {\n return (color[0] * 0.2126 + color[1] * 0.7152 + color[2] * 0.0722) / 255;\n}\n\nexport function getAverageColor(color1: ColorRgb, color2: ColorRgb): ColorRgb {\n return color1.map((v, i) => Math.round((v + color2[i]) / 2)) as ColorRgb;\n}\n\nexport function getAccentColor(baseHsv: number[], baseColor: ColorRgb, elementColor: ColorRgb): ColorRgb {\n const hsvTemp3 = rgbToHsv(...baseColor);\n const hsvTemp4 = rgbToHsv(...elementColor);\n\n const dist = Math.min(1.5 * hsvTemp3[1] / baseHsv[1], 1);\n\n hsvTemp3[0] = Math.min(360, hsvTemp4[0] - hsvTemp3[0] + baseHsv[0]);\n hsvTemp3[1] = Math.min(1, hsvTemp4[1] * baseHsv[1] / hsvTemp3[1]);\n hsvTemp3[2] = Math.min(1, (hsvTemp4[2] / hsvTemp3[2] + dist - 1) * baseHsv[2] / dist);\n if(hsvTemp3[2] < 0.3) {\n return elementColor;\n }\n return hsvToRgb(...hsvTemp3);\n}\n\nexport function changeColorAccent(baseHsv: number[], accentHsv: number[], color: ColorRgb, isDarkTheme: boolean) {\n const colorHsv = rgbToHsv(...color);\n\n const diffH = Math.min(Math.abs(colorHsv[0] - baseHsv[0]), Math.abs(colorHsv[0] - baseHsv[0] - 360));\n if(diffH > 30) {\n return color;\n }\n\n const dist = Math.min(1.5 * colorHsv[1] / baseHsv[1], 1);\n\n colorHsv[0] = Math.min(360, colorHsv[0] + accentHsv[0] - baseHsv[0]);\n colorHsv[1] = Math.min(1, colorHsv[1] * accentHsv[1] / baseHsv[1]);\n colorHsv[2] = Math.min(1, colorHsv[2] * (1 - dist + dist * accentHsv[2] / baseHsv[2]));\n\n let newColor = hsvToRgb(...colorHsv);\n\n const origBrightness = computePerceivedBrightness(color);\n const newBrightness = computePerceivedBrightness(newColor);\n\n // We need to keep colors lighter in dark themes and darker in light themes\n const needRevertBrightness = isDarkTheme ? origBrightness > newBrightness : origBrightness < newBrightness;\n\n if(needRevertBrightness) {\n const amountOfNew = 0.6;\n const fallbackAmount = (1 - amountOfNew) * origBrightness / newBrightness + amountOfNew;\n newColor = changeBrightness(newColor, fallbackAmount);\n }\n\n return newColor;\n}\n\nexport function changeBrightness(color: ColorRgb, amount: number) {\n return color.map((v) => clamp(Math.round(v * amount), 0, 255)) as ColorRgb;\n}\n\nexport function getHexColorFromTelegramColor(color: number) {\n const hex = (color < 0 ? 0xFFFFFF + color : color).toString(16);\n return '#' + (hex.length >= 6 ? hex : '0'.repeat(6 - hex.length) + hex);\n}\n\nexport function getRgbColorFromTelegramColor(color: number) {\n return hexToRgb(getHexColorFromTelegramColor(color));\n}\n\nexport function getColorsFromWallPaper(wallPaper: WallPaper) {\n return wallPaper.settings ? [\n wallPaper.settings.background_color,\n wallPaper.settings.second_background_color,\n wallPaper.settings.third_background_color,\n wallPaper.settings.fourth_background_color\n ].filter(Boolean).map(getHexColorFromTelegramColor).join(',') : '';\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\nexport default function blurActiveElement() {\n if((document.activeElement as HTMLInputElement)?.blur) {\n (document.activeElement as HTMLInputElement).blur();\n return true;\n }\n\n return false;\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\nexport default function cancelEvent(event?: Event) {\n event ||= window.event;\n if(event) {\n // 'input' event will have cancelable=false, but we still need to preventDefault\n // if(!event.cancelable) {\n // return false;\n // }\n\n // @ts-ignore\n event = event.originalEvent || event;\n\n try {\n if(event.stopPropagation) event.stopPropagation();\n if(event.preventDefault) event.preventDefault();\n event.returnValue = false;\n event.cancelBubble = true;\n } catch(err) {}\n }\n\n return false;\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// export function findUpClassName(el: any, className: string): T;\nexport default function findUpClassName(el: EventTarget | {closest: (selector: string) => any}, className: string): HTMLElement {\n return (el as any).closest('.' + className);\n /* if(el.classList.contains(className)) return el; // 03.02.2020\n\n while(el.parentElement) {\n el = el.parentElement;\n if(el.classList.contains(className))\n return el;\n }\n return null; */\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 {doubleRaf} from '../schedulers';\n\nexport default function fixSafariStickyInput(input: HTMLElement) {\n input.style.transform = 'translateY(-99999px)';\n /* input.style.position = 'fixed';\n input.style.top = '-99999px';\n input.style.left = '0'; */\n input.focus();\n\n // setTimeout(() => {\n doubleRaf().then(() => {\n // fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4, undefined, FocusDirection.Static);\n /* input.style.position = '';\n input.style.top = ''; */\n input.style.transform = '';\n // fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4, undefined, FocusDirection.Static);\n\n /* setTimeout(() => {\n fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4);\n }, 50); */\n });\n // }, 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 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 const 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","let callback: () => Promise;\nexport default function cacheInstallPrompt() {\n window.addEventListener('beforeinstallprompt', (deferredPrompt: any) => {\n callback = async() => {\n deferredPrompt.prompt();\n const {outcome} = await deferredPrompt.userChoice;\n const installed = outcome === 'accepted';\n if(installed) {\n callback = undefined;\n }\n };\n });\n}\n\nexport function getInstallPrompt() {\n return callback;\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 '../noop';\nimport pause from '../schedulers/pause';\n\nconst texts = ['b', 'ะฑ'];\ntype FontType = 'text' | 'icons' | 'monospace';\n\nconst cache: {\n [key: string]: {\n [text: string]: Promise\n }\n} = {};\n\nconst fonts: {[type in FontType]: string} = {\n text: 'Roboto',\n icons: 'tgico',\n monospace: 'Roboto Mono'\n};\n\nexport default function loadFonts(types: {[type in FontType]?: string[] | 'all'} = {\n text: texts,\n icons: undefined,\n monospace: texts\n}): Promise {\n if(!('fonts' in document)) {\n return Promise.resolve();\n }\n\n const promises: Promise[] = [];\n for(const type in types) {\n let _texts = types[type as FontType];\n if(_texts === 'all') {\n _texts = texts;\n }\n\n const font = fonts[type as FontType];\n const weights = type === 'icons' ? [500] : [400, 500];\n for(const weight of weights) {\n const _promises = (_texts || [undefined]).map((text) => {\n const key = [weight, '1rem', font].join(' ');\n const promise = (cache[key] ??= {})[text || ''] ??= document.fonts.load(key, text);\n return promise;\n });\n promises.push(..._promises);\n }\n }\n\n return Promise.race([\n Promise.all(promises).catch(noop),\n pause(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\n// import I18n from '../../lib/langPack';\n\nexport default function setInnerHTML(elem: Element, html: string | DocumentFragment | Element) {\n setDirection(elem);\n if(typeof(html) === 'string') {\n if(!html) elem.replaceChildren();\n else elem.innerHTML = html;\n } else {\n elem.replaceChildren(html);\n }\n}\n\nexport function setDirection(elem: Element) {\n // if(!I18n.isRTL) {\n elem.setAttribute('dir', 'auto');\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_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport EventListenerBase from './eventListenerBase';\n\nconst FOCUS_EVENT_NAME = IS_TOUCH_SUPPORTED ? 'touchstart' : 'mousemove';\nconst DO_NOT_IDLE = false;\n\nexport class IdleController extends EventListenerBase<{\n change: (idle: boolean) => void\n}> {\n private _isIdle: boolean;\n\n private focusPromise: Promise;\n private focusResolve: () => void;\n\n constructor() {\n super();\n\n this._isIdle = true;\n this.focusPromise = Promise.resolve();\n this.focusResolve = () => {};\n\n window.addEventListener('blur', () => {\n this.isIdle = true;\n\n window.addEventListener('focus', () => {\n this.isIdle = false;\n }, {once: true});\n });\n\n // * Prevent setting online after reloading page\n window.addEventListener(FOCUS_EVENT_NAME, () => {\n this.isIdle = false;\n }, {once: true, passive: true});\n\n this.addEventListener('change', (idle) => {\n if(idle) {\n this.focusPromise = new Promise((resolve) => {\n this.focusResolve = resolve;\n });\n } else {\n this.focusResolve();\n }\n });\n }\n\n public getFocusPromise() {\n return this.focusPromise;\n }\n\n public get isIdle() {\n return this._isIdle;\n }\n\n public set isIdle(value: boolean) {\n if(this._isIdle === value) {\n return;\n }\n\n if(DO_NOT_IDLE && value) {\n return;\n }\n\n this._isIdle = value;\n this.dispatchEvent('change', value);\n }\n}\n\nconst idleController = new IdleController();\nexport default idleController;\n","export default function clamp(v: number, min: number, max: number): number {\n return v < min ? min : ((v > max) ? max : v);\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 EventListenerBase from './eventListenerBase';\n\nexport class OverlayCounter extends EventListenerBase<{\n change: (isActive: boolean) => void\n}> {\n public overlaysActive = 0;\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('change', this.isOverlayActive);\n }\n}\n\nconst overlayCounter = new OverlayCounter();\nexport default overlayCounter;\n","/*\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// * Jolly Cobra's schedulers\nimport {NoneToVoidFunction} from '../types';\n\n/*\nexport function throttleWithTickEnd(fn: F) {\n return throttleWith(onTickEnd, fn);\n}\n\nexport function throttleWithNow(fn: F) {\n return throttleWith(runNow, fn);\n}\n\nexport function onTickEnd(cb: NoneToVoidFunction) {\n Promise.resolve().then(cb);\n}\n\nfunction runNow(fn: NoneToVoidFunction) {\n fn();\n} */\n\nlet fastRafCallbacks: NoneToVoidFunction[] | undefined;\nexport function fastRaf(callback: NoneToVoidFunction) {\n if(!fastRafCallbacks) {\n fastRafCallbacks = [callback];\n\n requestAnimationFrame(() => {\n const currentCallbacks = fastRafCallbacks!;\n fastRafCallbacks = undefined;\n currentCallbacks.forEach((cb) => cb());\n });\n } else {\n fastRafCallbacks.push(callback);\n }\n}\n\nlet fastRafConventionalCallbacks: NoneToVoidFunction[] | undefined, processing = false;\nexport function fastRafConventional(callback: NoneToVoidFunction) {\n if(!fastRafConventionalCallbacks) {\n fastRafConventionalCallbacks = [callback];\n\n requestAnimationFrame(() => {\n processing = true;\n for(let i = 0; i < fastRafConventionalCallbacks.length; ++i) {\n fastRafConventionalCallbacks[i]();\n }\n\n fastRafConventionalCallbacks = undefined;\n processing = false;\n });\n } else if(processing) {\n callback();\n } else {\n fastRafConventionalCallbacks.push(callback);\n }\n}\n\nlet rafPromise: Promise;\nexport function fastRafPromise() {\n if(rafPromise) return rafPromise;\n\n rafPromise = new Promise((resolve) => fastRaf(() => resolve()));\n rafPromise.then(() => {\n rafPromise = undefined;\n });\n\n return rafPromise;\n}\n\nexport function doubleRaf() {\n return new Promise((resolve) => {\n fastRaf(() => {\n fastRaf(resolve);\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 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 * 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 {AppTheme} from '../config/state';\nimport type {Theme} from '../layer';\nimport type AppBackgroundTab from '../components/sidebarLeft/tabs/background';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport rootScope from '../lib/rootScope';\nimport {changeColorAccent, ColorRgb, getAccentColor, getAverageColor, getHexColorFromTelegramColor, getRgbColorFromTelegramColor, hexToRgb, hslaStringToHex, hsvToRgb, mixColors, rgbaToHexa, rgbaToHsla, rgbToHsv} from './color';\nimport {MOUNT_CLASS_TO} from '../config/debug';\n\ntype AppColorName = 'primary-color' | 'message-out-primary-color' |\n 'surface-color' | 'danger-color' | 'primary-text-color' |\n 'secondary-text-color' | 'message-out-background-color' |\n 'saved-color';\ntype AppColor = {\n rgb?: boolean,\n light?: boolean,\n lightFilled?: boolean,\n dark?: boolean,\n darkRgb?: boolean,\n darkFilled?: boolean\n};\n\nconst appColorMap: {[name in AppColorName]: AppColor} = {\n 'primary-color': {\n rgb: true,\n light: true,\n lightFilled: true,\n dark: true,\n darkRgb: true\n },\n 'message-out-primary-color': {\n lightFilled: true\n },\n 'surface-color': {\n rgb: true\n },\n 'danger-color': {\n light: true,\n dark: true\n },\n 'primary-text-color': {\n rgb: true\n },\n 'secondary-text-color': {\n light: true,\n lightFilled: true\n },\n 'message-out-background-color': {\n light: true,\n lightFilled: true,\n dark: true,\n darkFilled: true\n },\n 'saved-color': {\n lightFilled: true\n }\n};\n\nconst colorMap: {\n [name in AppTheme['name']]?: {\n [name in AppColorName]?: string\n }\n} = {\n day: {\n 'primary-color': '#3390ec',\n 'message-out-primary-color': '#4fae4e',\n 'surface-color': '#ffffff',\n 'danger-color': '#df3f40',\n 'primary-text-color': '#000000',\n 'secondary-text-color': '#707579',\n 'saved-color': '#359AD4'\n },\n night: {\n 'primary-color': '#8774E1',\n 'message-out-primary-color': '#8774E1',\n 'surface-color': '#212121',\n 'danger-color': '#ff595a',\n 'primary-text-color': '#ffffff',\n 'secondary-text-color': '#aaaaaa',\n 'saved-color': '#8774E1'\n }\n};\n\nexport class ThemeController {\n private themeColor: string;\n private _themeColorElem: Element;\n private systemTheme: AppTheme['name'];\n private styleElement: HTMLStyleElement;\n public AppBackgroundTab: typeof AppBackgroundTab;\n\n constructor() {\n rootScope.addEventListener('theme_change', () => {\n this.setTheme();\n });\n\n // rootScope.addEventListener('settings_updated', ())\n }\n\n private 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(rootScope.myId) {\n rootScope.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 applyHighlightningColor() {\n let hsla: string;\n const theme = this.getTheme();\n if(theme.settings?.highlightningColor) {\n hsla = theme.settings.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 this.themeColor = hslaStringToHex(hsla);\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 const theme = this.getTheme();\n this.applyTheme(theme);\n\n let style = this.styleElement;\n if(!style) {\n style = this.styleElement = document.createElement('style');\n document.head.append(style);\n }\n\n const e = document.createElement('div');\n this.applyTheme(rootScope.settings.themes.find((theme) => theme.name === 'night'), e);\n style.textContent = `.night {${e.style.cssText}}`;\n\n this.applyHighlightningColor();\n }\n\n public async switchTheme(name: AppTheme['name']) {\n await rootScope.managers.appStateManager.setByKey('settings.theme', name);\n rootScope.dispatchEvent('theme_change');\n }\n\n public isNight() {\n return this.getTheme().name === 'night';\n }\n\n public getTheme(name: AppTheme['name'] = rootScope.settings.theme === 'system' ? this.systemTheme : rootScope.settings.theme) {\n return rootScope.settings.themes.find((t) => t.name === name);\n }\n\n // theme applier\n private bindColorApplier(options: Pick[0], 'element' | 'isNight'>) {\n const appliedColors: Set = new Set();\n return {\n applyAppColor: (_options: Omit[0], keyof typeof options>) => {\n appliedColors.add(_options.name);\n return this.applyAppColor({..._options, ...options});\n },\n finalize: () => {\n const isNight = options.isNight;\n for(const name in appColorMap) {\n if(!appliedColors.has(name as AppColorName)) {\n this.applyAppColor({\n name: name as AppColorName,\n hex: colorMap[isNight ? 'night' : 'day'][name as AppColorName],\n ...options\n });\n }\n }\n }\n };\n };\n\n private applyAppColor({\n name,\n hex,\n element,\n lightenAlpha = 0.08,\n darkenAlpha = lightenAlpha,\n mixColor,\n isNight\n }: {\n name: AppColorName,\n hex: string,\n element: HTMLElement,\n lightenAlpha?: number\n darkenAlpha?: number,\n mixColor?: ColorRgb,\n isNight?: boolean\n }) {\n const appColor = appColorMap[name];\n const rgb = hexToRgb(hex);\n const hsla = rgbaToHsla(...rgb);\n\n mixColor ??= hexToRgb(colorMap[isNight ? 'night' : 'day']['surface-color']);\n const lightenedRgb = mixColors(rgb, mixColor, lightenAlpha);\n\n const darkenedHsla: typeof hsla = {\n ...hsla,\n l: hsla.l - darkenAlpha * 100\n };\n\n const properties: [string, string][] = [\n [name, hex],\n appColor.rgb && [name + '-rgb', rgb.join(',')],\n appColor.light && ['light-' + name, `rgba(${rgb[0]}, ${rgb[1]}, ${rgb[2]}, ${lightenAlpha})`],\n appColor.lightFilled && ['light-filled-' + name, rgbaToHexa(lightenedRgb)],\n appColor.dark && ['dark-' + name, `hsl(${darkenedHsla.h}, ${darkenedHsla.s}%, ${darkenedHsla.l}%)`]\n // appColor.darkFilled && ['dark-' + name, `hsl(${darkenedHsla.h}, ${darkenedHsla.s}%, ${darkenedHsla.l}%)`]\n ];\n\n properties.filter(Boolean).forEach(([name, value]) => {\n element.style.setProperty('--' + name, value);\n });\n }\n\n public async applyNewTheme(theme: Theme) {\n const isNight = this.isNightTheme(theme);\n const currentTheme = this.getTheme();\n const themes = rootScope.settings.themes;\n const themeSettings = theme.settings.find((themeSettings) => themeSettings.base_theme._ === (isNight ? 'baseThemeNight' : 'baseThemeClassic'));\n const newAppTheme: AppTheme = {\n ...theme,\n name: currentTheme.name,\n settings: {\n ...themeSettings,\n highlightningColor: ''\n }\n };\n\n await this.AppBackgroundTab.setBackgroundDocument(themeSettings.wallpaper, newAppTheme.settings);\n themes[themes.indexOf(currentTheme)] = newAppTheme;\n await rootScope.managers.appStateManager.setByKey('settings.themes', rootScope.settings.themes);\n rootScope.dispatchEvent('theme_change');\n }\n\n private isNightTheme(theme: Theme | AppTheme) {\n return (theme as AppTheme).name === 'night' || this.isNight();\n }\n\n public applyTheme(theme: Theme | AppTheme, element = document.documentElement) {\n const isNight = this.isNightTheme(theme);\n const themeSettings = Array.isArray(theme.settings) ?\n theme.settings.find((settings) => settings.base_theme._ === (isNight ? 'baseThemeNight' : 'baseThemeClassic')) :\n theme.settings;\n const baseColors = colorMap[isNight ? 'night' : 'day'];\n\n let hsvTemp1 = rgbToHsv(...hexToRgb(baseColors['primary-color'])); // primary base\n let hsvTemp2 = rgbToHsv(...getRgbColorFromTelegramColor(themeSettings.accent_color)); // new primary\n\n const newAccentRgb = changeColorAccent(\n hsvTemp1,\n hsvTemp2,\n hexToRgb(baseColors['primary-color']),\n !isNight\n );\n const newAccentHex = rgbaToHexa(newAccentRgb);\n\n const {applyAppColor, finalize} = this.bindColorApplier({element, isNight});\n\n applyAppColor({\n name: 'primary-color',\n hex: newAccentHex,\n darkenAlpha: 0.04\n });\n\n applyAppColor({\n name: 'saved-color',\n hex: newAccentHex,\n lightenAlpha: 0.64,\n mixColor: [255, 255, 255]\n });\n\n if(!themeSettings.message_colors?.length) {\n return;\n }\n\n const messageLightenAlpha = isNight ? 0.92 : 0.12;\n const baseMessageColor = hexToRgb(baseColors['message-out-primary-color']);\n hsvTemp1 = rgbToHsv(...baseMessageColor);\n const baseMessageOutBackgroundColor = mixColors(baseMessageColor, hexToRgb(baseColors['surface-color']), messageLightenAlpha);\n\n const firstColor = getRgbColorFromTelegramColor(themeSettings.message_colors[0]);\n\n let myMessagesAccent = firstColor;\n if(themeSettings.message_colors.length > 1) {\n // const w = getAccentColor(hsvTemp1, baseMessageOutBackgroundColor, myMessagesAccent);\n\n themeSettings.message_colors.slice(1).forEach((nextColor) => {\n myMessagesAccent = getAverageColor(myMessagesAccent, getRgbColorFromTelegramColor(nextColor));\n });\n\n myMessagesAccent = getAccentColor(hsvTemp1, baseMessageOutBackgroundColor, myMessagesAccent);\n\n // console.log('www', rgbaToHexa(w), rgbaToHexa(myMessagesAccent));\n }\n\n const o = myMessagesAccent;\n hsvTemp2 = rgbToHsv(...o);\n\n // const c = changeColorAccent(\n // hsvTemp1,\n // hsvTemp2,\n // baseMessageOutBackgroundColor\n // );\n\n // console.log(o, c, rgbaToHexa(o), rgbaToHexa(c));\n\n const accentColor2 = themeSettings.outbox_accent_color !== undefined && rgbToHsv(...getRgbColorFromTelegramColor(themeSettings.outbox_accent_color));\n\n const newMessageOutBackgroundColor = mixColors(myMessagesAccent, hexToRgb(baseColors['surface-color']), messageLightenAlpha);\n\n applyAppColor({\n name: 'message-out-background-color',\n hex: rgbaToHexa(newMessageOutBackgroundColor),\n lightenAlpha: messageLightenAlpha\n });\n\n applyAppColor({\n name: 'message-out-primary-color',\n hex: isNight ? '#ffffff' : rgbaToHexa(accentColor2 ? hsvToRgb(...accentColor2) : myMessagesAccent),\n mixColor: newMessageOutBackgroundColor\n });\n\n // if(accentColor2) {\n // console.log(rgbaToHexa(myMessagesAccent), rgbaToHexa(hsvToRgb(...accentColor2)));\n // }\n\n finalize();\n }\n}\n\nconst themeController = new ThemeController();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.themeController = themeController);\nexport default themeController;\n","/*\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 setWorkerProxy() {\n // * hook worker constructor to set search parameters (test, debug, etc)\n const workerHandler = {\n construct(target: any, args: any) {\n let url = args[0] + '';\n if(url.indexOf('blob:') !== 0) {\n url += location.search;\n }\n\n return new target(url);\n }\n };\n\n [\n Worker,\n typeof(SharedWorker) !== 'undefined' && SharedWorker\n ].filter(Boolean).forEach((w) => {\n window[w.name as any] = new Proxy(w, workerHandler);\n });\n}\n\nsetWorkerProxy();\n","const IS_INSTALL_PROMPT_SUPPORTED = 'onbeforeinstallprompt' in window;\nexport default IS_INSTALL_PROMPT_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 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_ANDROID, IS_APPLE, IS_APPLE_MOBILE, IS_FIREFOX, IS_MOBILE, IS_MOBILE_SAFARI, IS_SAFARI} from './environment/userAgent';\nimport './materialize.scss';\nimport './scss/style.scss';\nimport pause from './helpers/schedulers/pause';\nimport setWorkerProxy from './helpers/setWorkerProxy';\nimport toggleAttributePolyfill from './helpers/dom/toggleAttributePolyfill';\nimport rootScope from './lib/rootScope';\nimport IS_TOUCH_SUPPORTED from './environment/touchSupport';\nimport I18n from './lib/langPack';\nimport './helpers/peerIdPolyfill';\nimport './lib/polyfill';\nimport apiManagerProxy from './lib/mtproto/mtprotoworker';\nimport getProxiedManagers from './lib/appManagers/getProxiedManagers';\nimport themeController from './helpers/themeController';\nimport overlayCounter from './helpers/overlayCounter';\nimport singleInstance from './lib/mtproto/singleInstance';\nimport parseUriParams from './helpers/string/parseUriParams';\nimport Modes from './config/modes';\nimport {AuthState} from './types';\nimport {IS_BETA} from './config/debug';\nimport IS_INSTALL_PROMPT_SUPPORTED from './environment/installPrompt';\nimport cacheInstallPrompt from './helpers/dom/installPrompt';\n// import appNavigationController from './components/appNavigationController';\n\ndocument.addEventListener('DOMContentLoaded', async() => {\n toggleAttributePolyfill();\n\n // polyfill for replaceChildren\n if((Node as any).prototype.replaceChildren === undefined) {\n (Node as any).prototype.replaceChildren = function(...nodes: any[]) {\n this.textContent = '';\n // while(this.lastChild) {\n // this.removeChild(this.lastChild);\n // }\n if(nodes) {\n this.append(...nodes);\n }\n }\n }\n\n rootScope.managers = getProxiedManagers();\n\n const manifest = document.getElementById('manifest') as HTMLLinkElement;\n manifest.href = `site${IS_APPLE && !IS_APPLE_MOBILE ? '_apple' : ''}.webmanifest?v=jw3mK7G9Aq`;\n\n singleInstance.start();\n\n // We listen to the resize event (https://css-tricks.com/the-trick-to-viewport-units-on-mobile/)\n const w = window.visualViewport || window; // * handle iOS keyboard\n let setViewportVH = false/* , hasFocus = false */;\n let lastVH: number;\n const setVH = () => {\n const vh = (setViewportVH && !overlayCounter.isOverlayActive ? (w as VisualViewport).height || (w as Window).innerHeight : window.innerHeight) * 0.01;\n if(lastVH === vh) {\n return;\n } else if(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 setWorkerProxy;\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 /* const {IS_TOUCH_SUPPORTED} = touchSupport;\n const {IS_FIREFOX, IS_MOBILE, IS_APPLE, IS_SAFARI, IS_APPLE_MOBILE, IS_ANDROID} = userAgent;\n const rootScope = _rootScope.default;\n const appStateManager = _appStateManager.default;\n const I18n = _I18n.default; */\n\n window.addEventListener('resize', setVH);\n setVH();\n\n if(IS_STICKY_INPUT_BUGGED) {\n const toggleResizeMode = () => {\n setViewportVH = tabId === 1 && IS_STICKY_INPUT_BUGGED && !overlayCounter.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 (window as any).onImTabChange = (id: number) => {\n const wasTabId = tabId !== undefined;\n tabId = id;\n\n if(wasTabId || tabId === 1) {\n toggleResizeMode();\n }\n };\n\n overlayCounter.addEventListener('change', () => {\n toggleResizeMode();\n });\n }\n\n if(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 if(IS_EMOJI_SUPPORTED) {\n document.documentElement.classList.add('native-emoji');\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 // restrict contextmenu on images (e.g. webp stickers)\n document.addEventListener('contextmenu', (e) => {\n if((e.target as HTMLElement).tagName === 'IMG' && !(window as any).appMediaViewer) {\n cancelEvent(e);\n }\n });\n\n if(IS_FIREFOX) {\n document.documentElement.classList.add('is-firefox', 'no-backdrop');\n }\n\n if(IS_MOBILE) {\n document.documentElement.classList.add('is-mobile');\n }\n\n if(IS_APPLE) {\n if(IS_SAFARI) {\n document.documentElement.classList.add('is-safari');\n }\n\n // document.documentElement.classList.add('emoji-supported');\n\n if(IS_APPLE_MOBILE) {\n document.documentElement.classList.add('is-ios');\n } else {\n document.documentElement.classList.add('is-mac');\n }\n } else if(IS_ANDROID) {\n document.documentElement.classList.add('is-android');\n\n // force losing focus on input blur\n // focusin and focusout are not working on mobile\n\n const onInResize = () => {\n hasFocus = true;\n window.addEventListener('resize', onOutResize, {once: true});\n };\n\n const onOutResize = () => {\n hasFocus = false;\n blurActiveElement();\n };\n\n let hasFocus = false;\n document.addEventListener('touchend', (e) => {\n const input = (e.target as HTMLElement).closest('[contenteditable=\"true\"], input');\n if(!input) {\n return;\n }\n\n if(document.activeElement !== input && !hasFocus) {\n console.log('input click', e, document.activeElement, input, input.matches(':focus'));\n window.addEventListener('resize', onInResize, {once: true});\n }\n });\n }\n\n if(!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(IS_INSTALL_PROMPT_SUPPORTED) {\n cacheInstallPrompt();\n }\n\n const perf = performance.now();\n\n // await pause(1000000);\n\n const langPromise = I18n.getCacheLangPack();\n\n const [stateResult, langPack] = await Promise.all([\n // loadState(),\n apiManagerProxy.sendState().then(([stateResult]) => stateResult),\n langPromise\n ]);\n I18n.setTimeFormat(stateResult.state.settings.timeFormat);\n\n rootScope.managers.rootScope.getPremium().then((isPremium) => {\n rootScope.premium = isPremium;\n });\n\n themeController.setThemeListener();\n\n if(langPack.appVersion !== App.langPackVersion) {\n I18n.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 if(langPack.lang_code === 'ar' && IS_BETA && false) {\n document.body.classList.add('is-rtl');\n document.documentElement.dir = 'rtl';\n document.documentElement.lang = langPack.lang_code;\n I18n.setRTL(true);\n } else {\n document.documentElement.dir = 'ltr';\n }\n\n let authState = stateResult.state.authState;\n\n const hash = location.hash;\n const splitted = hash.split('?');\n const params = parseUriParams(hash, splitted);\n if(params.tgWebAuthToken && authState._ !== 'authStateSignedIn') {\n const data: AuthState.signImport['data'] = {\n token: params.tgWebAuthToken,\n dcId: +params.tgWebAuthDcId,\n userId: params.tgWebAuthUserId.toUserId(),\n isTest: params.tgWebAuthTest !== undefined && !!+params.tgWebAuthTest,\n tgAddr: params.tgaddr\n };\n\n if(data.isTest !== Modes.test) {\n const urlSearchParams = new URLSearchParams(location.search);\n if(+params.tgWebAuthTest) {\n urlSearchParams.set('test', '1');\n } else {\n urlSearchParams.delete('test');\n }\n\n location.search = urlSearchParams.toString();\n return;\n }\n\n rootScope.managers.appStateManager.pushToState('authState', authState = {_: 'authStateSignImport', data});\n\n // appNavigationController.overrideHash('?tgaddr=' + encodeURIComponent(params.tgaddr));\n }\n\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((!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 case 'authStateSignImport':\n pagePromise = (await import('./pages/pageSignImport')).default.mount(authState.data);\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 pause(1000),\n document.fonts.ready\n ]) :\n Promise.resolve();\n fadeInWhenFontsReady(scrollable, promise);\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\": \"\",\n \"next_type\": {\n \"_\": \"auth.codeTypeCall\"\n },\n \"timeout\": 120,\n \"phone_number\": \"\"\n });\n\n (await import('./pages/pageSignQR')).default.mount();\n\n (await import('./pages/pagePassword')).default.mount();\n\n (await import('./pages/pageSignUp')).default.mount({\n \"phone_code_hash\": \"\",\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 }\n});\n","export default function toggleAttributePolyfill() {\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","/*\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\nexport class AppRuntimeManager {\n public reload() {\n try {\n location.reload();\n } catch(e) {};\n\n // if(window.chrome && chrome.runtime && chrome.runtime.reload) {\n // chrome.runtime.reload();\n // }\n }\n\n public close() {\n try {\n window.close();\n } catch(e) {}\n }\n\n /**\n * Better to call from event\n */\n public focus() {\n // // @ts-ignore\n // if(window.navigator.mozApps && document.hidden) {\n // // Get app instance and launch it to bring app to foreground\n // // @ts-ignore\n // window.navigator.mozApps.getSelf().onsuccess = function() {\n // this.result.launch();\n // };\n // } else {\n // // @ts-ignore\n // if(window.chrome && chrome.app && chrome.app.window) {\n // // @ts-ignore\n // chrome.app.window.current().focus();\n // }\n\n window.focus();\n // }\n }\n}\n\nconst appRuntimeManager = new AppRuntimeManager();\nexport default appRuntimeManager;\n","/*\n * 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 createManagers from './createManagers';\nimport {ModifyFunctionsToAsync} from '../../types';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport {AckedResult} from '../mtproto/superMessagePort';\nimport noop from '../../helpers/noop';\nimport dT from '../../helpers/dT';\nimport DEBUG from '../../config/debug';\n\n// let stats: {\n// [manager: string]: {\n// [method: string]: {\n// times: number[],\n// byArgs: {\n// [args: string]: number[]\n// }\n// }\n// }\n// } = {};\n\n// let sentCount = 0;\n// let sentMethods: {[key: string]: number} = {};\n// let sentMethods2: {[key: string]: number} = {};\n// function collectStats(manager: string, method: string, args: any[], promise: Promise) {\n// ++sentCount;\n\n// const key = [manager, method].join('-');\n// if(!sentMethods[key]) sentMethods[key] = 0;\n// ++sentMethods[key];\n\n// const key2 = [('00000' + sentCount).slice(-5), key].join('-');\n\n// let byManager = stats[manager] ??= {};\n// let byMethod = byManager[method] ??= {times: [], byArgs: {}};\n\n// const perf = performance.now();\n// promise.catch(noop).finally(() => {\n// const time = performance.now() - perf;\n// byMethod.times.push(time);\n\n// sentMethods2[key2] = time;\n\n// try {\n// const argsString = JSON.stringify(args);\n// byMethod.byArgs[argsString].push(time);\n// } catch(err) {}\n// });\n// }\n\n// setInterval(() => {\n// // console.log(dT(), '[PROXY] stats', stats, sentCount, sentMethods, sentMethods2);\n// sentCount = 0;\n// sentMethods = {};\n// sentMethods2 = {};\n// }, 2000);\n\nconst DEBUG_MANAGER_REQUESTS: {[managerName: string]: Set} = {};\nif(DEBUG) {\n (window as any).DEBUG_MANAGER_REQUESTS = DEBUG_MANAGER_REQUESTS;\n}\n\nfunction createProxy(/* source: T, */name: string, ack?: boolean) {\n const proxy = new Proxy({}, {\n get: (target, p, receiver) => {\n // console.log('get', target, p, receiver);\n // @ts-ignore\n // const value = source[p];\n // if(typeof(value) !== 'function') {\n // return value;\n // }\n\n return (...args: any[]) => {\n const promise = apiManagerProxy.invoke('manager', {\n name,\n method: p as string,\n args\n }, ack as any);\n\n if(DEBUG) {\n if(DEBUG_MANAGER_REQUESTS[name]?.has(p as any)) {\n console.warn('manager request', name, p, args);\n }\n }\n\n // collectStats(name, p as string, args, promise);\n\n return promise;\n\n // @ts-ignore\n // return Promise.resolve(value.call(source, ...args));\n };\n }\n });\n\n return proxy;\n}\n\ntype AA = {\n [key in keyof T]: T[key] extends (...args: infer A) => infer R ? (...args: A) => Promise>> : never\n};\n\ntype T = Awaited>;\ntype ProxiedManagers = {\n [name in keyof T]?: ModifyFunctionsToAsync;\n} & {\n acknowledged?: {\n [name in keyof T]?: AA;\n }\n};\n\nfunction createProxyProxy(proxied: any, ack?: boolean) {\n return new Proxy(proxied, {\n get: (target, p, receiver) => {\n // @ts-ignore\n return target[p] ??= createProxy(p as string, ack);\n }\n });\n}\n\nlet proxied: ProxiedManagers;\nexport default function getProxiedManagers() {\n if(proxied) {\n return proxied;\n }\n\n proxied = createProxyProxy({}, false);\n proxied.acknowledged = createProxyProxy({}, true);\n return proxied;\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 {Database} from '../../config/databases';\nimport Modes from '../../config/modes';\nimport makeError from '../../helpers/makeError';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {logger} from '../logger';\n\n/**\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\n */\nexport type IDBIndex = {\n indexName: string,\n keyPath: string,\n objectParameters: IDBIndexParameters\n};\n\nexport type IDBStore = {\n name: string,\n indexes?: IDBIndex[]\n};\n\nexport type IDBOptions = {\n name?: string,\n storeName: string,\n stores?: IDBStore[],\n version?: number\n};\n\nconst DEBUG = false;\n\nexport class IDB {\n private static INSTANCES: IDB[] = [];\n private openDbPromise: Promise;\n private db: IDBDatabase;\n private storageIsAvailable: boolean;\n private log: ReturnType;\n private name: string;\n private version: number;\n private stores: IDBStore[];\n\n constructor(db: Database) {\n safeAssign(this, db);\n\n if(Modes.test) {\n this.name += '_test';\n }\n\n this.storageIsAvailable = true;\n this.log = logger(['IDB', db.name].join('-'));\n this.log('constructor');\n\n this.openDatabase(true);\n\n IDB.INSTANCES.push(this);\n }\n\n public isAvailable() {\n return this.storageIsAvailable;\n }\n\n public openDatabase(createNew = false): Promise {\n if(this.openDbPromise && !createNew) {\n return this.openDbPromise;\n }\n\n const createIndexes = (os: IDBObjectStore, store: IDBStore) => {\n const indexNames = Array.from(os.indexNames);\n for(const indexName of indexNames) {\n os.deleteIndex(indexName);\n }\n\n if(!store.indexes?.length) {\n return;\n }\n\n for(const index of store.indexes) {\n if(os.indexNames.contains(index.indexName)) {\n continue;\n }\n\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\n }\n };\n\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\n const os = db.createObjectStore(store.name);\n createIndexes(os, store);\n };\n\n try {\n var request = indexedDB.open(this.name, this.version);\n\n if(!request) {\n return Promise.reject();\n }\n } catch(error) {\n this.log.error('error opening db', (error as Error).message);\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n let finished = false;\n setTimeout(() => {\n if(!finished) {\n request.onerror(makeError('IDB_CREATE_TIMEOUT') as Event);\n }\n }, 3000);\n\n return this.openDbPromise = new Promise((resolve, reject) => {\n request.onsuccess = (event) => {\n finished = true;\n const db = request.result;\n let calledNew = false;\n\n this.log('Opened');\n\n db.onerror = (error) => {\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', error);\n reject(error);\n };\n\n db.onclose = (e) => {\n this.log.error('closed:', e);\n !calledNew && this.openDatabase();\n };\n\n db.onabort = (e) => {\n this.log.error('abort:', e);\n const transaction = e.target as IDBTransaction;\n\n this.openDatabase(calledNew = true);\n\n if(transaction.onerror) {\n transaction.onerror(e);\n }\n\n db.close();\n };\n\n db.onversionchange = (e) => {\n this.log.error('onversionchange, lol?');\n };\n\n resolve(this.db = db);\n };\n\n request.onerror = (event) => {\n finished = true;\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', event);\n reject(event);\n };\n\n request.onupgradeneeded = (event) => {\n finished = true;\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\n\n const target = event.target as IDBOpenDBRequest;\n const db = target.result;\n this.stores.forEach((store) => {\n /* if(db.objectStoreNames.contains(store.name)) {\n //if(event.oldVersion === 1) {\n db.deleteObjectStore(store.name);\n //}\n } */\n\n if(!db.objectStoreNames.contains(store.name)) {\n createObjectStore(db, store);\n } else {\n const txn = target.transaction;\n const os = txn.objectStore(store.name);\n createIndexes(os, store);\n }\n });\n };\n });\n }\n\n public static create>(db: T) {\n return this.INSTANCES.find((instance) => instance.name === db.name) ?? new IDB(db);\n }\n\n public static closeDatabases(preserve?: IDB) {\n this.INSTANCES.forEach((storage) => {\n if(preserve && preserve === storage) {\n return;\n }\n\n const db = storage.db;\n if(db) {\n db.onclose = () => {};\n db.close();\n }\n });\n }\n}\n\nexport default class IDBStorage, StoreName extends string = T['stores'][0]['name']> {\n private log: ReturnType;\n private storeName: T['stores'][0]['name'];\n private idb: IDB;\n\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\n this.storeName = storeName;\n this.log = logger(['IDB', db.name, storeName].join('-'));\n this.idb = IDB.create(db);\n }\n\n /**\n * ! WARNING ! function requires at least one opened connection\n */\n /* public static clearObjectStores() {\n const storage = this.STORAGES[0];\n this.closeDatabases(storage);\n\n const names = Array.from(storage.db.objectStoreNames);\n const promises = names.map((name) => storage.clear(name));\n return Promise.all(promises);\n } */\n\n /* public static deleteDatabase() {\n this.closeDatabases();\n\n const storages = this.STORAGES;\n const dbNames = Array.from(new Set(storages.map((storage) => storage.name)));\n const promises = dbNames.map((dbName) => {\n return new Promise((resolve, reject) => {\n const deleteRequest = indexedDB.deleteDatabase(dbName);\n\n deleteRequest.onerror = () => {\n reject();\n };\n\n deleteRequest.onsuccess = () => {\n resolve();\n };\n });\n });\n\n return Promise.all(promises);\n } */\n\n public delete(entryName: string | string[], storeName?: StoreName): Promise {\n // return Promise.resolve();\n const isArray = Array.isArray(entryName);\n if(!isArray) {\n entryName = [].concat(entryName);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n const promises = (entryName as string[]).map((entryName) => objectStore.delete(entryName));\n return isArray ? promises : promises[0];\n }, DEBUG ? 'delete: ' + (entryName as string[]).join(', ') : '', storeName);\n }\n\n public clear(storeName?: StoreName): Promise {\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\n }\n\n public save(entryName: string | string[], value: any | any[], storeName?: StoreName) {\n // const handleError = (error: Error) => {\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\n // setTimeout(() => {\n // this.save(entryName, value);\n // }, 2e3);\n // } else {\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\n // }\n // };\n\n const isArray = Array.isArray(entryName);\n if(!isArray) {\n entryName = [].concat(entryName);\n value = [].concat(value);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n const promises = (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\n return isArray ? promises : promises[0];\n }, DEBUG ? 'save: ' + (entryName as string[]).join(', ') : '', storeName);\n }\n\n // public saveFile(fileName: string, blob: Blob | Uint8Array) {\n // //return Promise.resolve(blobConstruct([blob]));\n // if(!(blob instanceof Blob)) {\n // blob = blobConstruct(blob);\n // }\n\n // return this.save(fileName, blob);\n // }\n\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\n return Promise.reject();\n }\n\n if(!(blob instanceof Blob)) {\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\n return this.storagePutB64String(db, fileName, address).then(() => {\n return blob;\n });\n }\n\n try {\n var reader = new FileReader();\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n let promise = new Promise((resolve, reject) => {\n reader.onloadend = () => {\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\n resolve(blob);\n }, reject);\n }\n\n reader.onerror = reject;\n });\n\n\n try {\n reader.readAsDataURL(blob);\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n return promise;\n }\n\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\n try {\n var objectStore = db.transaction([this.storeName], 'readwrite')\n .objectStore(this.storeName);\n var request = objectStore.put(b64string, fileName);\n } catch(error) {\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n resolve();\n };\n\n request.onerror = reject;\n });\n }\n\n public getBlobSize(blob: any) {\n return blob.size || blob.byteLength || blob.length;\n } */\n\n public get(entryName: string[], storeName?: StoreName): Promise;\n public get(entryName: string, storeName?: StoreName): Promise;\n public get(entryName: string | string[], storeName?: StoreName): Promise | Promise {\n // return Promise.reject();\n\n const isArray = Array.isArray(entryName);\n if(!isArray) {\n if(!entryName) {\n return undefined;\n }\n\n entryName = [].concat(entryName);\n } else if(!entryName.length) {\n return Promise.resolve([]) as any;\n }\n\n return this.getObjectStore('readonly', (objectStore) => {\n const promises = (entryName as string[]).map((entryName) => objectStore.get(entryName));\n return isArray ? promises : promises[0];\n }, DEBUG ? 'get: ' + (entryName as string[]).join(', ') : '', storeName);\n }\n\n private getObjectStore(\n mode: IDBTransactionMode,\n callback: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[],\n log?: string,\n storeName = this.storeName\n ) {\n let perf: number;\n\n if(log) {\n perf = performance.now();\n this.log(log + ': start');\n }\n\n return this.idb.openDatabase().then((db) => {\n return new Promise((resolve, reject) => {\n /* if(mode === 'readwrite') {\n return;\n } */\n\n const transaction = db.transaction([storeName], mode);\n\n const onError = () => {\n clearTimeout(timeout);\n reject(transaction.error);\n };\n\n // let resolved = false;\n const onComplete = (/* what: string */) => {\n clearTimeout(timeout);\n\n if(log) {\n this.log(log + ': end', performance.now() - perf/* , what */);\n }\n\n // if(resolved) {\n // return;\n // }\n\n // resolved = true;\n const results = requests.map((r) => r.result);\n resolve(isArray ? results : results[0]);\n };\n\n transaction.onerror = onError;\n\n // * have to wait while clearing or setting something\n const waitForTransactionComplete = mode === 'readwrite';\n if(waitForTransactionComplete) {\n transaction.oncomplete = () => onComplete(/* 'transaction' */);\n }\n\n const timeout = setTimeout(() => {\n this.log.error('transaction not finished', transaction, log);\n }, 10000);\n\n /* transaction.addEventListener('abort', (e) => {\n //handleError();\n this.log.error('IndexedDB: transaction abort!', transaction.error);\n }); */\n\n const callbackResult = callback(transaction.objectStore(storeName));\n\n const isArray = Array.isArray(callbackResult);\n const requests: IDBRequest[] = isArray ? callbackResult : [].concat(callbackResult) as any;\n\n if(waitForTransactionComplete) {\n return;\n }\n\n const length = requests.length;\n let left = length;\n\n const onRequestFinished = () => {\n if(transaction.error) {\n return;\n }\n\n if(!--left) {\n onComplete(/* 'requests' */);\n }\n };\n\n for(let i = 0; i < length; ++i) {\n const request = requests[i];\n request.onerror = onError;\n request.onsuccess = onRequestFinished;\n }\n });\n });\n }\n\n public getAll(storeName?: StoreName): Promise {\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '', storeName);\n }\n\n /* public getAllKeys(): Promise> {\n console.time('getAllEntries');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.getAllKeys();\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var result = event.target.result;\n resolve(result);\n console.timeEnd('getAllEntries');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public isFileExists(fileName: string): Promise {\n console.time('isFileExists');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.openCursor(fileName);\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var cursor = event.target.result;\n resolve(!!cursor);\n console.timeEnd('isFileExists');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public getFileWriter(fileName: string, mimeType: string) {\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\n return this.saveFile(fileName, blob);\n });\n\n return Promise.resolve(fakeWriter);\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 lang from '../lang';\nimport type langSign from '../langSign';\nimport type {State} from '../config/state';\nimport DEBUG, {MOUNT_CLASS_TO} from '../config/debug';\nimport {HelpCountriesList, HelpCountry, LangPackDifference, LangPackString} from '../layer';\nimport stateStorage from './stateStorage';\nimport App from '../config/app';\nimport rootScope from './rootScope';\nimport {IS_MOBILE} from '../environment/userAgent';\nimport deepEqual from '../helpers/object/deepEqual';\nimport safeAssign from '../helpers/object/safeAssign';\nimport capitalizeFirstLetter from '../helpers/string/capitalizeFirstLetter';\nimport matchUrlProtocol from './richTextProcessor/matchUrlProtocol';\nimport wrapUrl from './richTextProcessor/wrapUrl';\nimport {setDirection} from '../helpers/dom/setInnerHTML';\n\nexport const langPack: {[actionType: string]: LangPackKey} = {\n 'messageActionChatCreate': 'ActionCreateGroup',\n 'messageActionChatCreateYou': 'ActionYouCreateGroup',\n 'messageActionChatEditTitle': 'ActionChangedTitle',\n 'messageActionChatEditPhoto': 'ActionChangedPhoto',\n 'messageActionChatEditVideo': 'ActionChangedVideo',\n 'messageActionChatDeletePhoto': 'ActionRemovedPhoto',\n 'messageActionChatReturn': 'ActionAddUserSelf',\n 'messageActionChatReturnYou': 'ActionAddUserSelfYou',\n 'messageActionChatJoined': 'ActionAddUserSelfMega',\n 'messageActionChatJoinedYou': 'ChannelMegaJoined',\n 'messageActionChatAddUser': 'ActionAddUser',\n 'messageActionChatAddUsers': 'ActionAddUser',\n 'messageActionChatLeave': 'ActionLeftUser',\n 'messageActionChatLeaveYou': 'YouLeft',\n 'messageActionChatDeleteUser': 'ActionKickUser',\n 'messageActionChatJoinedByLink': 'ActionInviteUser',\n 'messageActionPinMessage': 'Chat.Service.Group.UpdatedPinnedMessage',\n 'messageActionContactSignUp': 'Chat.Service.PeerJoinedTelegram',\n 'messageActionChannelCreate': 'ActionCreateChannel',\n 'messageActionChannelEditTitle': 'Chat.Service.Channel.UpdatedTitle',\n 'messageActionChannelEditPhoto': 'Chat.Service.Channel.UpdatedPhoto',\n 'messageActionChannelEditVideo': 'Chat.Service.Channel.UpdatedVideo',\n 'messageActionChannelDeletePhoto': 'Chat.Service.Channel.RemovedPhoto',\n 'messageActionHistoryClear': 'HistoryCleared',\n 'messageActionDiscussionStarted': 'DiscussionStarted',\n\n 'messageActionChannelMigrateFrom': 'ActionMigrateFromGroup',\n\n 'messageActionPhoneCall.video_in_ok': 'ChatList.Service.VideoCall.incoming',\n 'messageActionPhoneCall.video_out_ok': 'ChatList.Service.VideoCall.outgoing',\n 'messageActionPhoneCall.video_missed': 'ChatList.Service.VideoCall.Missed',\n 'messageActionPhoneCall.video_cancelled': 'ChatList.Service.VideoCall.Cancelled',\n 'messageActionPhoneCall.in_ok': 'ChatList.Service.Call.incoming',\n 'messageActionPhoneCall.out_ok': 'ChatList.Service.Call.outgoing',\n 'messageActionPhoneCall.missed': 'ChatList.Service.Call.Missed',\n 'messageActionPhoneCall.cancelled': 'ChatList.Service.Call.Cancelled',\n\n 'messageActionGroupCall.started': 'Chat.Service.VoiceChatStarted.Channel',\n 'messageActionGroupCall.started_by': 'Chat.Service.VoiceChatStarted',\n 'messageActionGroupCall.started_byYou': 'Chat.Service.VoiceChatStartedYou',\n 'messageActionGroupCall.ended': 'Chat.Service.VoiceChatFinished.Channel',\n 'messageActionGroupCall.ended_by': 'Chat.Service.VoiceChatFinished',\n 'messageActionGroupCall.ended_byYou': 'Chat.Service.VoiceChatFinishedYou',\n\n '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 export const strings: Map = new Map();\n export const countriesList: HelpCountry[] = [];\n let pluralRules: Intl.PluralRules;\n\n let cacheLangPackPromise: Promise;\n export let lastRequestedLangCode: string;\n export let lastRequestedNormalizedLangCode: string;\n export let lastAppliedLangCode: string;\n export let requestedServerLanguage = false;\n export let timeFormat: State['settings']['timeFormat'];\n export let isRTL = false;\n\n export function setRTL(rtl: boolean) {\n isRTL = rtl;\n }\n\n function setLangCode(langCode: string) {\n lastRequestedLangCode = langCode;\n lastRequestedNormalizedLangCode = langCode.split('-')[0];\n }\n\n export function getCacheLangPack(): Promise {\n if(cacheLangPackPromise) return cacheLangPackPromise;\n return cacheLangPackPromise = Promise.all([\n stateStorage.get('langPack') as Promise,\n polyfillPromise\n ]).then(([langPack]) => {\n if(!langPack/* || true */) {\n return loadLocalLangPack();\n } else if(DEBUG && false) {\n return getLangPack(langPack.lang_code);\n }/* else if(langPack.appVersion !== App.langPackVersion) {\n return getLangPack(langPack.lang_code);\n } */\n\n if(!lastRequestedLangCode) {\n setLangCode(langPack.lang_code);\n }\n\n applyLangPack(langPack);\n return langPack;\n }).finally(() => {\n cacheLangPackPromise = undefined;\n });\n }\n\n function updateAmPm() {\n if(timeFormat === 'h12') {\n try {\n const dateTimeFormat = getDateTimeFormat({hour: 'numeric', minute: 'numeric', hour12: true});\n const date = new Date();\n date.setHours(0);\n const amText = dateTimeFormat.format(date);\n amPmCache.am = amText.split(/\\s/)[1];\n date.setHours(12);\n const pmText = dateTimeFormat.format(date);\n amPmCache.pm = pmText.split(/\\s/)[1];\n } catch(err) {\n console.error('cannot get am/pm', err);\n amPmCache = {am: 'AM', pm: 'PM'};\n }\n }\n }\n\n export function setTimeFormat(\n format: State['settings']['timeFormat'],\n haveToUpdate = !!timeFormat && timeFormat !== format\n ) {\n timeFormat = format;\n\n updateAmPm();\n\n if(haveToUpdate) {\n cachedDateTimeFormats.clear();\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 export function loadLocalLangPack() {\n const defaultCode = App.langPackCode;\n setLangCode(defaultCode);\n return Promise.all([\n import('../lang'),\n import('../langSign'),\n import('../countries')\n ]).then(([lang, langSign, countries]) => {\n const strings: LangPackString[] = [];\n formatLocalStrings(lang.default, strings);\n formatLocalStrings(langSign.default, strings);\n\n const langPack: LangPackDifference = {\n _: 'langPackDifference',\n from_version: 0,\n lang_code: defaultCode,\n strings,\n version: 0,\n local: true,\n countries: countries.default\n };\n return saveLangPack(langPack);\n });\n }\n\n export function loadLangPack(langCode: string, web?: boolean) {\n web = true;\n requestedServerLanguage = true;\n const managers = rootScope.managers;\n return Promise.all([\n managers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n lang_code: langCode,\n lang_pack: web ? 'web' : App.langPack\n }),\n !web && managers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n lang_code: langCode,\n lang_pack: 'android'\n }),\n import('../lang'),\n import('../langSign'),\n managers.apiManager.invokeApiCacheable('help.getCountriesList', {\n lang_code: langCode,\n hash: 0\n }) as Promise,\n polyfillPromise\n ]);\n }\n\n export function getStrings(langCode: string, strings: string[]) {\n return rootScope.managers.apiManager.invokeApi('langpack.getStrings', {\n lang_pack: App.langPack,\n lang_code: langCode,\n keys: strings\n });\n }\n\n export function formatLocalStrings(strings: any, pushTo: LangPackString[] = []) {\n for(const i in strings) {\n // @ts-ignore\n const v = strings[i];\n if(typeof(v) === 'string') {\n pushTo.push({\n _: 'langPackString',\n key: i,\n value: v\n });\n } else {\n pushTo.push({\n _: 'langPackStringPluralized',\n key: i,\n ...v\n });\n }\n }\n\n return pushTo;\n }\n\n export function getLangPack(langCode: string, web?: boolean) {\n setLangCode(langCode);\n return loadLangPack(langCode, web).then(([langPack1, langPack2, localLangPack1, localLangPack2, countries, _]) => {\n let strings: LangPackString[] = [];\n\n [localLangPack1, localLangPack2].forEach((l) => {\n formatLocalStrings(l.default as any, strings);\n });\n\n strings = strings.concat(...[langPack1.strings, langPack2.strings].filter(Boolean));\n\n langPack1.strings = strings;\n langPack1.countries = countries;\n return saveLangPack(langPack1);\n });\n }\n\n export function saveLangPack(langPack: LangPackDifference) {\n langPack.appVersion = App.langPackVersion;\n\n return stateStorage.set({langPack}).then(() => {\n applyLangPack(langPack);\n return langPack;\n });\n }\n\n export const polyfillPromise = (function checkIfPolyfillNeeded() {\n if(typeof(Intl) !== 'undefined' && typeof(Intl.PluralRules) !== 'undefined'/* && false */) {\n return Promise.resolve();\n } else {\n return import('./pluralPolyfill').then((_Intl) => {\n (window as any).Intl = Object.assign(typeof(Intl) !== 'undefined' ? Intl : {}, _Intl.default);\n });\n }\n })();\n\n export function applyLangPack(langPack: LangPackDifference) {\n const currentLangCode = lastRequestedLangCode;\n if(langPack.lang_code !== currentLangCode) {\n return;\n }\n\n try {\n pluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode);\n } catch(err) {\n console.error('pluralRules error', err);\n pluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode.split('-', 1)[0]);\n }\n\n try {\n pluralRules = new Intl.PluralRules(langPack.lang_code);\n } catch(err) {\n console.error('pluralRules error', err);\n pluralRules = new Intl.PluralRules(langPack.lang_code.split('-', 1)[0]);\n }\n\n strings.clear();\n\n for(const string of langPack.strings) {\n strings.set(string.key as LangPackKey, string);\n }\n\n if(langPack.countries) {\n countriesList.length = 0;\n countriesList.push(...langPack.countries.countries);\n\n langPack.countries.countries.forEach((country) => {\n if(country.name) {\n const langPackKey: any = country.default_name;\n strings.set(langPackKey, {\n _: 'langPackString',\n key: langPackKey,\n value: country.name\n });\n }\n });\n }\n\n if(lastAppliedLangCode !== currentLangCode) {\n rootScope.dispatchEvent('language_change', currentLangCode);\n lastAppliedLangCode = currentLangCode;\n cachedDateTimeFormats.clear();\n updateAmPm();\n }\n\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n elements.forEach((element) => {\n const instance = weakMap.get(element);\n\n if(instance) {\n instance.update();\n }\n });\n }\n\n function pushNextArgument(out: ReturnType, args: FormatterArguments, indexHolder: {i: number}) {\n const arg = args[indexHolder.i++];\n if(Array.isArray(arg)) {\n out.push(...arg as any);\n } else {\n out.push(arg);\n }\n }\n\n export function superFormatter(input: string, args?: FormatterArguments, indexHolder = {i: 0}): Exclude[] {\n const out: ReturnType = [];\n const regExp = /(\\*\\*|__)(.+?)\\1|(\\n)|(\\[.+?\\]\\(.*?\\))|un\\d|%\\d\\$.|%./g;\n\n let lastIndex = 0;\n input.replace(regExp, (match, p1: any, p2: any, p3: any, p4: string, offset: number, string: string) => {\n // console.table({match, p1, p2, offset, string});\n\n out.push(string.slice(lastIndex, offset));\n\n if(p1) {\n // offset += p1.length;\n let element: HTMLElement;\n switch(p1) {\n case '**': {\n element = document.createElement('b');\n break;\n }\n\n case '__': {\n element = document.createElement('i');\n break;\n }\n }\n\n element.append(...superFormatter(p2, args, indexHolder) as any);\n out.push(element);\n } else if(p3) {\n out.push(document.createElement('br'));\n } else if(p4) {\n const idx = p4.lastIndexOf(']');\n const text = p4.slice(1, idx);\n\n const url = p4.slice(idx + 2, p4.length - 1);\n let a: HTMLAnchorElement;\n if(url && matchUrlProtocol(url)) {\n a = document.createElement('a');\n const wrappedUrl = wrapUrl(url);\n a.href = wrappedUrl.url;\n if(wrappedUrl.onclick) a.setAttribute('onclick', wrappedUrl.onclick);\n a.target = '_blank';\n } else {\n a = args[indexHolder.i++] as HTMLAnchorElement;\n\n if(a instanceof DocumentFragment) { // right after wrapRichText\n a = a.firstChild as any;\n }\n\n a.textContent = ''; // reset content\n }\n\n a.append(...superFormatter(text, args, indexHolder) as any);\n\n out.push(a);\n } else if(args) {\n pushNextArgument(out, args, indexHolder);\n }\n\n lastIndex = offset + match.length;\n return '';\n });\n\n if(lastIndex !== input.length) {\n out.push(input.slice(lastIndex));\n }\n\n return out;\n }\n\n export function format(key: LangPackKey, plain: true, args?: FormatterArguments): string;\n export function format(key: LangPackKey, plain?: false, args?: FormatterArguments): ReturnType;\n export function format(key: LangPackKey, plain = false, args?: FormatterArguments): ReturnType | string {\n const str = strings.get(key);\n let input: string;\n if(str) {\n if(str._ === 'langPackStringPluralized' && args?.length) {\n let v = args[0] as number | string;\n if(typeof(v) === 'string') v = +v.replace(/\\D/g, '');\n const s = pluralRules.select(v);\n // @ts-ignore\n input = str[s + '_value'] || str['other_value'];\n } else if(str._ === 'langPackString') {\n input = str.value;\n } else {\n // input = '[' + key + ']';\n input = key;\n }\n } else {\n // input = '[' + key + ']';\n input = key;\n }\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\n /* if(plain) {\n if(args?.length) {\n const regExp = /un\\d|%\\d\\$.|%./g;\n let i = 0;\n input = input.replace(regExp, (match, offset, string) => {\n return '' + args[i++];\n });\n }\n\n return input;\n } else {\n return superFormatter(input, args);\n } */\n }\n\n export const weakMap: WeakMap> = new WeakMap();\n\n export type IntlElementBaseOptions = {\n element?: HTMLElement,\n property?: 'innerText' | 'innerHTML' | 'placeholder' | 'textContent',\n };\n\n abstract class IntlElementBase {\n public element: IntlElementBaseOptions['element'];\n public property: IntlElementBaseOptions['property'];\n\n constructor(options?: Options) {\n this.element = options?.element || document.createElement('span');\n this.element.classList.add('i18n');\n\n this.property = options?.property;\n if(options && ((options as any as IntlElementOptions).key || (options as any as IntlDateElementOptions).date)) {\n this.update(options);\n }\n\n weakMap.set(this.element, this);\n }\n\n abstract update(options?: Options): void;\n }\n\n export type IntlElementOptions = IntlElementBaseOptions & {\n key?: LangPackKey,\n args?: FormatterArguments\n };\n export class IntlElement extends IntlElementBase {\n public key: IntlElementOptions['key'];\n public args: IntlElementOptions['args'];\n\n constructor(options: IntlElementOptions = {}) {\n super({...options, property: options.property ?? 'innerHTML'});\n }\n\n public update(options?: IntlElementOptions) {\n safeAssign(this, options);\n\n if(this.property === 'innerHTML') {\n this.element.textContent = '';\n this.element.append(...format(this.key, false, this.args) as any);\n } else {\n // @ts-ignore\n const v = this.element[this.property];\n const formatted = format(this.key, true, this.args);\n\n // * hasOwnProperty won't work here\n if(v === undefined) this.element.dataset[this.property] = formatted;\n else (this.element as HTMLInputElement)[this.property] = formatted;\n }\n }\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 }\n\n const cachedDateTimeFormats: Map = new Map();\n function getDateTimeFormat(options: Intl.DateTimeFormatOptions = {}) {\n const json = JSON.stringify(options);\n let dateTimeFormat = cachedDateTimeFormats.get(json);\n if(!dateTimeFormat) {\n dateTimeFormat = new Intl.DateTimeFormat(lastRequestedNormalizedLangCode + '-u-hc-' + timeFormat, options);\n cachedDateTimeFormats.set(json, dateTimeFormat);\n }\n\n return dateTimeFormat;\n }\n\n export let amPmCache = {am: 'AM', pm: 'PM'};\n export type IntlDateElementOptions = IntlElementBaseOptions & {\n date?: Date,\n options: Intl.DateTimeFormatOptions\n };\n export class IntlDateElement extends IntlElementBase {\n public date: IntlDateElementOptions['date'];\n public options: IntlDateElementOptions['options'];\n\n constructor(options: IntlDateElementOptions) {\n super({...options, property: options.property ?? 'textContent'});\n setDirection(this.element);\n }\n\n public update(options?: IntlDateElementOptions) {\n safeAssign(this, options);\n\n let text: string;\n if(this.options.hour && this.options.minute && Object.keys(this.options).length === 2/* && false */) {\n const hours = this.date.getHours();\n text = ('0' + (timeFormat === 'h12' ? (hours % 12) || 12 : hours)).slice(-2) + ':' + ('0' + this.date.getMinutes()).slice(-2);\n // if(this.options.second) {\n // text += ':' + ('0' + this.date.getSeconds()).slice(-2);\n // }\n\n if(timeFormat === 'h12') {\n text += ' ' + (hours < 12 ? amPmCache.am : amPmCache.pm);\n }\n } else {\n // * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/hourCycle#adding_an_hour_cycle_via_the_locale_string\n const dateTimeFormat = getDateTimeFormat(this.options);\n text = capitalizeFirstLetter(dateTimeFormat.format(this.date));\n }\n\n (this.element as any)[this.property] = text;\n }\n }\n\n export function i18n(key: LangPackKey, args?: FormatterArguments) {\n return new IntlElement({key, args}).element;\n }\n\n export function i18n_(options: IntlElementOptions) {\n return new IntlElement(options).element;\n }\n\n export function _i18n(element: HTMLElement, key: LangPackKey, args?: FormatterArguments, property?: IntlElementOptions['property']) {\n return new IntlElement({element, key, args, property}).element;\n }\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 const 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 return 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 const joined = joinElementsWith(elements, (isLast) => {\n const langPackKey: LangPackKey = isLast && useLast ? 'AutoDownloadSettings.LastDelimeter' : 'AutoDownloadSettings.Delimeter';\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","/*\n * 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 {MyDialogFilter} from '../storages/filters';\n\n/**\n * Legacy Webogram's format, don't change dcID to camelCase. date is timestamp\n */\nexport type UserAuth = {dcID: number | string, date: number, id: PeerId};\nexport type REAL_FOLDER_ID = 0 | 1;\n\nexport const NULL_PEER_ID: PeerId = 0;\nexport const REPLIES_PEER_ID: PeerId = 1271266957;\nexport const REPLIES_HIDDEN_CHANNEL_ID: ChatId = 777;\nexport const SERVICE_PEER_ID: PeerId = 777000;\nexport const MUTE_UNTIL = 0x7FFFFFFF;\nexport const BOT_START_PARAM = '';\nexport const MAX_FILE_SAVE_SIZE = 20 * 1024 * 1024;\nexport const THUMB_TYPE_FULL = '';\nexport const TOPIC_COLORS = [0x6FB9F0, 0xFFD67E, 0xCB86DB, 0x8EEE98, 0xFF93B2, 0xFB6F5F];\nexport const ATTACH_MENU_BOT_ICON_NAME = 'default_static';\nexport const GENERAL_TOPIC_ID = 4295032831;\nexport const T_ME_PREFIXES = new Set(['web', 'k', 'z']);\n\nexport const FOLDER_ID_ALL: REAL_FOLDER_ID = 0;\nexport const FOLDER_ID_ARCHIVE: REAL_FOLDER_ID = 1;\nexport const REAL_FOLDERS: Set = new Set([FOLDER_ID_ALL, FOLDER_ID_ARCHIVE]);\nexport const START_LOCAL_ID = Math.max(...Array.from(REAL_FOLDERS)) + 1 as MyDialogFilter['localId'];\n","import IS_CALL_SUPPORTED from './callSupport';\nimport CAN_USE_TRANSFERABLES from './canUseTransferables';\nimport IS_CANVAS_FILTER_SUPPORTED from './canvasFilterSupport';\nimport IS_EMOJI_SUPPORTED from './emojiSupport';\nimport IS_GEOLOCATION_SUPPORTED from './geolocationSupport';\nimport IS_GROUP_CALL_SUPPORTED from './groupCallSupport';\nimport IMAGE_MIME_TYPES_SUPPORTED from './imageMimeTypesSupport';\nimport MEDIA_MIME_TYPES_SUPPORTED from './mediaMimeTypesSupport';\nimport IS_MOV_SUPPORTED from './movSupport';\nimport IS_PARALLAX_SUPPORTED from './parallaxSupport';\nimport IS_SCREEN_SHARING_SUPPORTED from './screenSharingSupport';\nimport IS_TOUCH_SUPPORTED from './touchSupport';\nimport IS_VIBRATE_SUPPORTED from './vibrateSupport';\nimport VIDEO_MIME_TYPES_SUPPORTED from './videoMimeTypesSupport';\nimport IS_WEBM_SUPPORTED from './webmSupport';\nimport IS_WEBP_SUPPORTED from './webpSupport';\nimport IS_WEBRTC_SUPPORTED from './webrtcSupport';\nimport * as userAgent from './userAgent';\nimport IS_OPUS_SUPPORTED from './opusSupport';\nimport IS_SHARED_WORKER_SUPPORTED from './sharedWorkerSupport';\nimport IS_APPLE_MX from './appleMx';\n\nconst ENVIRONMENT = {\n CAN_USE_TRANSFERABLES,\n IS_APPLE_MX,\n IS_CALL_SUPPORTED,\n IS_CANVAS_FILTER_SUPPORTED,\n IS_EMOJI_SUPPORTED,\n IS_GEOLOCATION_SUPPORTED,\n IS_GROUP_CALL_SUPPORTED,\n IS_MOV_SUPPORTED,\n IS_PARALLAX_SUPPORTED,\n IS_SCREEN_SHARING_SUPPORTED,\n IS_TOUCH_SUPPORTED,\n IS_VIBRATE_SUPPORTED,\n IS_OPUS_SUPPORTED,\n IS_SHARED_WORKER_SUPPORTED,\n IS_WEBM_SUPPORTED,\n IS_WEBP_SUPPORTED,\n IS_WEBRTC_SUPPORTED,\n IMAGE_MIME_TYPES_SUPPORTED,\n MEDIA_MIME_TYPES_SUPPORTED,\n VIDEO_MIME_TYPES_SUPPORTED,\n ...userAgent\n};\n\nexport default ENVIRONMENT;\n","/*\n * 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 DEBUG from '../../../../config/debug';\nimport {AutoDownloadPeerTypeSettings, State, STATE_INIT, Background, AppTheme} from '../../../../config/state';\nimport compareVersion from '../../../../helpers/compareVersion';\nimport copy from '../../../../helpers/object/copy';\nimport validateInitObject from '../../../../helpers/object/validateInitObject';\nimport {UserAuth} from '../../../mtproto/mtproto_config';\nimport rootScope from '../../../rootScope';\nimport stateStorage from '../../../stateStorage';\nimport sessionStorage from '../../../sessionStorage';\nimport {recordPromiseBound} from '../../../../helpers/recordPromise';\n// import RESET_STORAGES_PROMISE from \"../storages/resetStoragesPromise\";\nimport {StoragesResults} from '../storages/loadStorages';\nimport {logger} from '../../../logger';\nimport {WallPaper} from '../../../../layer';\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\n\nconst STATE_VERSION = STATE_INIT.version;\nconst BUILD = STATE_INIT.build;\n\nconst ALL_KEYS = Object.keys(STATE_INIT) as any as Array;\n\nconst REFRESH_KEYS: Array = [\n 'contactsListCachedTime',\n 'stateCreatedTime',\n 'maxSeenMsgId',\n 'filtersArr'\n];\n\n// const REFRESH_KEYS_WEEK = ['dialogs', 'allDialogsLoaded', 'updates', 'pinnedOrders'] as any as Array;\n\nasync function loadStateInner() {\n const log = logger('STATE-LOADER');\n\n const totalPerf = performance.now();\n const recordPromise = recordPromiseBound(log);\n\n const promises = ALL_KEYS.map((key) => recordPromise(stateStorage.get(key), 'state ' + key))\n .concat(\n recordPromise(sessionStorage.get('user_auth'), 'auth'),\n recordPromise(sessionStorage.get('state_id'), 'auth'),\n recordPromise(sessionStorage.get('k_build'), 'auth')\n )\n .concat(recordPromise(stateStorage.get('user_auth'), 'old auth')); // support old webk format\n\n const arr = await Promise.all(promises);\n log.warn('promises', performance.now() - totalPerf);\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 // const pushed: {key: keyof State, value: State[keyof State]}[] = [];\n const pushedKeys: (keyof State)[] = [];\n const pushToState = (key: T, value: State[T]) => {\n // appStateManager.pushToState(key, value);\n state[key] = value;\n // pushed.push({key, value});\n pushedKeys.push(key);\n };\n\n const replaceState = (_state: State) => {\n // pushed.length = 0;\n pushedKeys.length = 0;\n state = _state;\n pushedKeys.push(...Object.keys(state) as any as typeof pushedKeys);\n // state = appStateManager.setState(_state);\n // appStateManager.storage.set(state);\n };\n\n // let state: State = appStateManager.setState({} as any);\n let state: 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 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 sessionBuild = 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 const 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 const resetStorages: Set = new Set();\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 = copy(STATE_INIT);\n\n preserve.forEach((value, key) => {\n // @ts-ignore\n state[key] = value;\n });\n\n const r: {[k in keyof StoragesResults]: number} = {\n chats: 1,\n dialogs: 1,\n users: 1\n };\n for(const key in r) {\n resetStorages.add(key as keyof StoragesResults);\n // this.storagesResults[key as keyof AppStateManager['storagesResults']].length = 0;\n }\n\n replaceState(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 log('will refresh state', state.stateCreatedTime, time);\n }\n\n const r = (keys: typeof REFRESH_KEYS) => {\n keys.forEach((key) => {\n pushToState(key, copy(STATE_INIT[key]));\n\n // const s = appStateManager.storagesResults[key as keyof AppStateManager['storagesResults']];\n // if(s?.length) {\n // appStateManager.resetStorages.add(key as keyof AppStateManager['storagesResults']);\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 // * migrate auto download settings\n const autoDownloadSettings = state.settings.autoDownload;\n if(autoDownloadSettings?.private !== undefined) {\n const oldTypes = [\n 'contacts' as const,\n 'private' as const,\n 'groups' as const,\n 'channels' as const\n ];\n\n const mediaTypes = [\n 'photo' as const,\n 'video' as const,\n 'file' as const\n ];\n\n mediaTypes.forEach((mediaType) => {\n const peerTypeSettings: AutoDownloadPeerTypeSettings = autoDownloadSettings[mediaType] = {} as any;\n oldTypes.forEach((peerType) => {\n peerTypeSettings[peerType] = autoDownloadSettings[peerType];\n });\n });\n\n oldTypes.forEach((peerType) => {\n delete autoDownloadSettings[peerType];\n });\n\n pushToState('settings', state.settings);\n }\n\n const SKIP_VALIDATING_PATHS: Set = new Set([\n 'settings.themes'\n ]);\n validateInitObject(STATE_INIT, state, (missingKey) => {\n pushToState(missingKey as keyof State, state[missingKey as keyof State]);\n }, undefined, SKIP_VALIDATING_PATHS);\n\n let newVersion: string, oldVersion: string;\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 || state.build < 179 || */state.build < 217) {\n state.allDialogsLoaded = copy(STATE_INIT.allDialogsLoaded);\n state.pinnedOrders = copy(STATE_INIT.pinnedOrders);\n state.filtersArr = copy(STATE_INIT.filtersArr);\n\n resetStorages.add('dialogs');\n }\n\n if(compareVersion(state.version, '1.7.1') === -1) {\n let migrated = false;\n // * migrate backgrounds (March 13, 2022; to version 1.3.0)\n if(compareVersion(state.version, '1.3.0') === -1) {\n migrated = true;\n state.settings.theme = copy(STATE_INIT.settings.theme);\n state.settings.themes = copy(STATE_INIT.settings.themes);\n } else if(compareVersion(state.version, '1.7.1') === -1) { // * migrate backgrounds (January 25th, 2023; to version 1.7.1)\n migrated = true;\n const oldThemes = state.settings.themes as any as Array<{\n name: AppTheme['name'],\n background: Background\n }>;\n\n state.settings.themes = copy(STATE_INIT.settings.themes);\n\n try {\n oldThemes.forEach((oldTheme) => {\n const oldBackground = oldTheme.background;\n if(!oldBackground) {\n return;\n }\n\n const newTheme = state.settings.themes.find((t) => t.name === oldTheme.name);\n newTheme.settings.highlightningColor = oldBackground.highlightningColor;\n\n const getColorFromHex = (hex: string) => hex && parseInt(hex.slice(1), 16);\n\n const colors = (oldBackground.color || '').split(',').map(getColorFromHex);\n\n if(oldBackground.color && !oldBackground.slug) {\n newTheme.settings.wallpaper = {\n _: 'wallPaperNoFile',\n id: 0,\n pFlags: {},\n settings: {\n _: 'wallPaperSettings',\n pFlags: {}\n }\n };\n } else {\n const wallPaper: WallPaper.wallPaper = {\n _: 'wallPaper',\n id: 0,\n access_hash: 0,\n slug: oldBackground.slug,\n document: {} as any,\n pFlags: {},\n settings: {\n _: 'wallPaperSettings',\n pFlags: {}\n }\n };\n\n const wallPaperSettings = wallPaper.settings;\n newTheme.settings.wallpaper = wallPaper;\n if(oldBackground.slug && !oldBackground.color) {\n wallPaperSettings.pFlags.blur = oldBackground.blur || undefined;\n } else if(oldBackground.intensity) {\n wallPaperSettings.intensity = oldBackground.intensity;\n wallPaper.pFlags.pattern = true;\n wallPaper.pFlags.dark = oldBackground.intensity < 0 || undefined;\n }\n }\n\n if(colors.length) {\n const wallPaperSettings = newTheme.settings.wallpaper.settings;\n wallPaperSettings.background_color = colors[0];\n wallPaperSettings.second_background_color = colors[1];\n wallPaperSettings.third_background_color = colors[2];\n wallPaperSettings.fourth_background_color = colors[3];\n }\n });\n } catch(err) {\n console.error('migrating themes error', err);\n }\n }\n\n if(migrated) {\n pushToState('settings', state.settings);\n }\n }\n\n if(compareVersion(state.version, STATE_VERSION) !== 0) {\n newVersion = STATE_VERSION;\n oldVersion = state.version;\n }\n\n pushToState('version', STATE_VERSION);\n pushToState('build', BUILD);\n }\n\n if(sessionBuild !== BUILD && (!sessionBuild || sessionBuild < BUILD)) {\n sessionStorage.set({k_build: BUILD});\n }\n\n // ! probably there is better place for it\n rootScope.settings = state.settings;\n\n if(DEBUG) {\n log('state res', state, copy(state));\n }\n\n // return resolve();\n\n log.warn('total', performance.now() - totalPerf);\n\n // RESET_STORAGES_PROMISE.resolve(appStateManager.resetStorages);\n\n return {state, resetStorages, newVersion, oldVersion, pushedKeys};\n}\n\nlet promise: ReturnType;\nexport default function loadState() {\n return promise ??= loadStateInner();\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 {Awaited} from '../../types';\nimport type {CacheStorageDbName} from '../files/cacheStorage';\nimport type {State} from '../../config/state';\nimport type {Message, MessagePeerReaction, PeerNotifySettings} from '../../layer';\nimport {CryptoMethods} from '../crypto/crypto_methods';\nimport rootScope from '../rootScope';\nimport webpWorkerController from '../webp/webpWorkerController';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport sessionStorage from '../sessionStorage';\nimport webPushApiManager from './webPushApiManager';\nimport appRuntimeManager from '../appManagers/appRuntimeManager';\nimport telegramMeWebManager from './telegramMeWebManager';\nimport pause from '../../helpers/schedulers/pause';\nimport ENVIRONMENT from '../../environment';\nimport loadState from '../appManagers/utils/state/loadState';\nimport opusDecodeController from '../opusDecodeController';\nimport MTProtoMessagePort from './mtprotoMessagePort';\nimport cryptoMessagePort from '../crypto/cryptoMessagePort';\nimport SuperMessagePort from './superMessagePort';\nimport IS_SHARED_WORKER_SUPPORTED from '../../environment/sharedWorkerSupport';\nimport toggleStorages from '../../helpers/toggleStorages';\nimport idleController from '../../helpers/idleController';\nimport ServiceMessagePort from '../serviceWorker/serviceMessagePort';\nimport App from '../../config/app';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\n\nexport type Mirrors = {\n state: State\n};\n\nexport type MirrorTaskPayload = {\n name: T,\n key?: K,\n value: any\n};\n\nexport type NotificationBuildTaskPayload = {\n message: Message.message | Message.messageService,\n fwdCount?: number,\n peerReaction?: MessagePeerReaction,\n peerTypeNotifySettings?: PeerNotifySettings\n};\n\nexport type TabState = {\n chatPeerIds: PeerId[],\n idleStartTime: number,\n};\n\nclass ApiManagerProxy extends MTProtoMessagePort {\n // private worker: /* Window */Worker;\n // private sockets: Map = new Map();\n private mirrors: Mirrors;\n\n public newVersion: string;\n public oldVersion: string;\n\n private tabState: TabState;\n\n public share: ShareData;\n\n public serviceMessagePort: ServiceMessagePort;\n private lastServiceWorker: ServiceWorker;\n\n private pingServiceWorkerPromise: CancellablePromise;\n\n constructor() {\n super();\n\n this.mirrors = {} as any;\n this.tabState = {\n chatPeerIds: [],\n idleStartTime: 0\n };\n\n this.log('constructor');\n\n \n this.registerWorker();\n \n\n this.registerServiceWorker();\n this.registerCryptoWorker();\n\n // const perf = performance.now();\n this.addMultipleEventsListeners({\n convertWebp: ({fileName, bytes}) => {\n return webpWorkerController.convert(fileName, bytes);\n },\n\n convertOpus: ({fileName, bytes}) => {\n return opusDecodeController.pushDecodeTask(bytes, false).then((result) => result.bytes);\n },\n\n event: ({name, args}) => {\n // @ts-ignore\n rootScope.dispatchEventSingle(name, ...args);\n },\n\n localStorageProxy: (payload) => {\n const storageTask = payload;\n return (sessionStorage[storageTask.type] as any)(...storageTask.args);\n },\n\n mirror: this.onMirrorTask\n\n // hello: () => {\n // this.log.error('time hello', performance.now() - perf);\n // }\n });\n\n // this.addTaskListener('socketProxy', (task) => {\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 rootScope.addEventListener('language_change', (language) => {\n rootScope.managers.networkerFactory.setLanguage(language);\n });\n\n window.addEventListener('online', () => {\n rootScope.managers.networkerFactory.forceReconnectTimeout();\n });\n\n rootScope.addEventListener('logging_out', () => {\n const toClear: CacheStorageDbName[] = ['cachedFiles', 'cachedStreamChunks'];\n Promise.all([\n toggleStorages(false, true),\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 idleController.addEventListener('change', (idle) => {\n this.updateTabStateIdle(idle);\n });\n this.updateTabStateIdle(idleController.isIdle);\n\n this.log('Passing environment:', ENVIRONMENT);\n this.invoke('environment', ENVIRONMENT);\n // this.sendState();\n }\n\n public pingServiceWorkerWithIframe() {\n if(this.pingServiceWorkerPromise) {\n return this.pingServiceWorkerPromise;\n }\n\n const promise = this.pingServiceWorkerPromise = deferredPromise();\n const iframe = document.createElement('iframe');\n iframe.hidden = true;\n const onLoad = () => {\n setTimeout(() => { // ping once in 10 seconds\n this.pingServiceWorkerPromise = undefined;\n }, 10e3);\n\n clearTimeout(timeout);\n iframe.remove();\n iframe.removeEventListener('load', onLoad);\n iframe.removeEventListener('error', onLoad);\n promise.resolve();\n };\n iframe.addEventListener('load', onLoad);\n iframe.addEventListener('error', onLoad);\n iframe.src = 'ping/' + (Math.random() * 0xFFFFFFFF | 0);\n document.body.append(iframe);\n\n const timeout = window.setTimeout(onLoad, 1e3);\n return promise;\n }\n\n private attachServiceWorker(serviceWorker: ServiceWorker) {\n this.lastServiceWorker && this.serviceMessagePort.detachPort(this.lastServiceWorker);\n this.serviceMessagePort.attachSendPort(this.lastServiceWorker = serviceWorker);\n this.serviceMessagePort.invokeVoid('hello', undefined);\n }\n\n private _registerServiceWorker() {\n navigator.serviceWorker.register(\n /* webpackChunkName: \"sw\" */\n new URL('../serviceWorker/index.service', import.meta.url),\n {scope: './'}\n ).then((registration) => {\n this.log('SW registered', registration);\n\n // ! doubtful fix for hard refresh\n if(registration.active && !navigator.serviceWorker.controller) {\n return registration.unregister().then(() => {\n window.location.reload();\n });\n }\n\n const sw = registration.installing || registration.waiting || registration.active;\n sw.addEventListener('statechange', (e) => {\n this.log('SW statechange', e);\n });\n\n const controller = navigator.serviceWorker.controller || registration.installing || registration.waiting || registration.active;\n this.attachServiceWorker(controller);\n\n \n \n \n }, (err) => {\n this.log.error('SW registration failed!', err);\n\n this.invokeVoid('serviceWorkerOnline', false);\n });\n }\n\n private registerServiceWorker() {\n if(!('serviceWorker' in navigator)) return;\n\n this.serviceMessagePort = new ServiceMessagePort();\n\n // this.addMultipleEventsListeners({\n // hello: () => {\n // // this.serviceMessagePort.invokeVoid('port', undefined);\n // }\n // });\n\n // ! I hate webpack - it won't load it by using worker.register, only navigator.serviceWorker will do it.\n const worker = navigator.serviceWorker;\n this._registerServiceWorker();\n\n // worker.startMessages();\n\n worker.addEventListener('controllerchange', () => {\n this.log.warn('controllerchange');\n\n const controller = worker.controller;\n this.attachServiceWorker(controller);\n\n controller.addEventListener('error', (e) => {\n this.log.error('controller error:', e);\n });\n });\n\n \n \n \n this.serviceMessagePort.attachListenPort(worker);\n this.serviceMessagePort.addMultipleEventsListeners({\n port: (payload, source, event) => {\n this.invokeVoid('serviceWorkerPort', undefined, undefined, [event.ports[0]]);\n },\n\n hello: (payload, source) => {\n this.serviceMessagePort.resendLockTask(source);\n },\n\n share: (payload) => {\n this.log('will try to share something');\n this.share = payload;\n }\n });\n \n\n worker.addEventListener('messageerror', (e) => {\n this.log.error('SW messageerror:', e);\n });\n }\n\n private async registerCryptoWorker() {\n const get = (url: string) => {\n return fetch(url).then((response) => response.text()).then((text) => {\n const pathnameSplitted = location.pathname.split('/');\n pathnameSplitted[pathnameSplitted.length - 1] = '';\n const pre = location.origin + pathnameSplitted.join('/');\n text = `\n var originalImportScripts = importScripts; \n importScripts = (url) => {\n console.log('importScripts', url);\n var newUrl = '${pre}' + url.split('/').pop();\n return originalImportScripts(newUrl);\n };\n ${text}`;\n const blob = new Blob([text], {type: 'application/javascript'});\n return blob;\n });\n };\n\n const workerHandler = {\n construct(target: any, args: any): any {\n const url = args[0] + location.search;\n return {url};\n }\n };\n\n const originals = [\n Worker,\n typeof(SharedWorker) !== 'undefined' && SharedWorker\n ].filter(Boolean);\n originals.forEach((w) => window[w.name as any] = new Proxy(w, workerHandler));\n\n const worker: SharedWorker | Worker = new Worker(\n /* webpackChunkName: \"crypto.worker\" */\n new URL('../crypto/crypto.worker.ts', import.meta.url),\n {type: 'module'}\n );\n\n originals.forEach((w) => window[w.name as any] = w as any);\n\n const originalUrl = (worker as any).url;\n\n const createWorker = (url: string) => new constructor(url, {type: 'module'});\n const attachWorkerToPort = (worker: SharedWorker | Worker) => this.attachWorkerToPort(worker, cryptoMessagePort, 'crypto');\n const constructor = IS_SHARED_WORKER_SUPPORTED ? SharedWorker : Worker;\n\n // let cryptoWorkers = workers.length;\n cryptoMessagePort.addEventListener('port', (payload, source, event) => {\n this.invokeVoid('cryptoPort', undefined, undefined, [event.ports[0]]);\n // .then((attached) => {\n // if(!attached && cryptoWorkers-- > 1) {\n // this.log.error('terminating unneeded crypto worker');\n\n // cryptoMessagePort.invokeVoid('terminate', undefined, source);\n // const worker = workers.find((worker) => (worker as SharedWorker).port === source || (worker as any) === source);\n // if((worker as SharedWorker).port) (worker as SharedWorker).port.close();\n // else (worker as Worker).terminate();\n // cryptoMessagePort.detachPort(source);\n // }\n // });\n });\n\n const firstWorker = createWorker(originalUrl);\n attachWorkerToPort(firstWorker);\n\n const blob = await get(originalUrl);\n const urlsPromise = await this.invoke('createProxyWorkerURLs', {originalUrl, blob});\n const workers = urlsPromise.slice(1).map(createWorker);\n workers.forEach(attachWorkerToPort);\n }\n\n \n private registerWorker() {\n // return;\n\n let worker: SharedWorker | Worker;\n if(IS_SHARED_WORKER_SUPPORTED) {\n worker = new SharedWorker(\n /* webpackChunkName: \"mtproto.worker\" */\n new URL('./mtproto.worker.ts', import.meta.url),\n {type: 'module'}\n );\n } else {\n worker = new Worker(\n /* webpackChunkName: \"mtproto.worker\" */\n new URL('./mtproto.worker.ts', import.meta.url),\n {type: 'module'}\n );\n }\n\n this.onWorkerFirstMessage(worker);\n }\n \n\n private attachWorkerToPort(worker: SharedWorker | Worker, messagePort: SuperMessagePort, type: string) {\n const port: MessagePort = (worker as SharedWorker).port || worker as any;\n messagePort.attachPort(port);\n\n worker.addEventListener('error', (err) => {\n this.log.error(type, 'worker error', err);\n });\n }\n\n private onWorkerFirstMessage(worker: any) {\n this.log('set webWorker');\n\n // this.worker = worker;\n \n \n \n this.attachWorkerToPort(worker, this, 'mtproto');\n \n }\n\n private loadState() {\n return Promise.all([\n loadState().then((stateResult) => {\n this.newVersion = stateResult.newVersion;\n this.oldVersion = stateResult.oldVersion;\n this.mirrors['state'] = stateResult.state;\n return stateResult;\n })\n // loadStorages(createStorages()),\n ]);\n }\n\n public sendState() {\n return this.loadState().then((result) => {\n const [stateResult] = result;\n this.invoke('state', {...stateResult, userId: rootScope.myId.toUserId()});\n return result;\n });\n }\n\n \n public invokeCrypto(method: Method, ...args: Parameters): Promise>> {\n return cryptoMessagePort.invokeCrypto(method, ...args);\n }\n \n\n public async toggleStorages(enabled: boolean, clearWrite: boolean) {\n await toggleStorages(enabled, clearWrite);\n this.invoke('toggleStorages', {enabled, clearWrite});\n this.serviceMessagePort.invokeVoid('toggleStorages', {enabled, clearWrite});\n }\n\n public async getMirror(name: T) {\n const mirror = this.mirrors[name];\n return mirror;\n }\n\n public getState() {\n return this.getMirror('state');\n }\n\n public updateTabState(key: T, value: TabState[T]) {\n this.tabState[key] = value;\n this.invokeVoid('tabState', this.tabState);\n }\n\n public updateTabStateIdle(idle: boolean) {\n this.updateTabState('idleStartTime', idle ? Date.now() : 0);\n }\n\n private onMirrorTask = (payload: MirrorTaskPayload) => {\n const {name, key, value} = payload;\n if(!payload.hasOwnProperty('key')) {\n this.mirrors[name] = value;\n return;\n }\n\n const mirror = this.mirrors[name] ??= {} as any;\n if(value === undefined) {\n delete mirror[key];\n } else {\n mirror[key] = value;\n }\n };\n}\n\ninterface ApiManagerProxy extends MTProtoMessagePort {}\n\nconst apiManagerProxy = new ApiManagerProxy();\nMOUNT_CLASS_TO.apiManagerProxy = apiManagerProxy;\nexport default apiManagerProxy;\n","/*\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 App from '../../config/app';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport tabId from '../../config/tabId';\nimport IS_SHARED_WORKER_SUPPORTED from '../../environment/sharedWorkerSupport';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport idleController from '../../helpers/idleController';\nimport {logger} from '../logger';\nimport rootScope from '../rootScope';\nimport sessionStorage from '../sessionStorage';\nimport apiManagerProxy from './mtprotoworker';\n\nexport type AppInstance = {\n id: number,\n idle: boolean,\n time: number\n};\n\nexport type InstanceDeactivateReason = 'version' | 'tabs';\n\nconst CHECK_INSTANCE_INTERVAL = 5000;\nconst DEACTIVATE_TIMEOUT = 30000;\nconst MULTIPLE_TABS_THRESHOLD = 20000;\nconst IS_MULTIPLE_TABS_SUPPORTED = IS_SHARED_WORKER_SUPPORTED;\n\nexport class SingleInstance extends EventListenerBase<{\n activated: () => void,\n deactivated: (reason: InstanceDeactivateReason) => void\n}> {\n private instanceId: number;\n private started: boolean;\n private masterInstance: boolean;\n private deactivateTimeout: number;\n private deactivated: InstanceDeactivateReason;\n private log = logger('INSTANCE');\n\n constructor() {\n super(false);\n\n this.log = logger('INSTANCE');\n this.instanceId = tabId;\n }\n\n public get deactivatedReason() {\n return this.deactivated;\n }\n\n public start() {\n this.reset();\n\n if(!this.started/* && !Config.Navigator.mobile && !Config.Modes.packed */) {\n this.started = true;\n\n idleController.addEventListener('change', 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 private reset() {\n this.masterInstance = false;\n this.clearDeactivateTimeout();\n this.deactivated = undefined;\n }\n\n private 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 this.dispatchEvent('activated');\n }\n }\n\n private deactivateInstance(reason: InstanceDeactivateReason) {\n if(this.masterInstance || this.deactivated) {\n return;\n }\n\n this.log.warn('deactivate', reason);\n this.clearDeactivateTimeout();\n this.deactivated = reason;\n\n this.dispatchEvent('deactivated', reason);\n }\n\n private clearDeactivateTimeout() {\n if(this.deactivateTimeout) {\n clearTimeout(this.deactivateTimeout);\n this.deactivateTimeout = 0;\n }\n }\n\n private checkInstance = async(idle = idleController.isIdle) => {\n if(this.deactivated) {\n return;\n }\n\n const time = Date.now();\n const newInstance: AppInstance = {\n id: this.instanceId,\n idle,\n time\n };\n\n const [curInstance, build = App.build] = await Promise.all([\n sessionStorage.get('xt_instance', false),\n sessionStorage.get('k_build', false)\n ]);\n\n if(build > App.build) {\n this.masterInstance = false;\n rootScope.managers.networkerFactory.stopAll();\n this.deactivateInstance('version');\n apiManagerProxy.toggleStorages(false, false);\n return;\n } else if(IS_MULTIPLE_TABS_SUPPORTED) {\n sessionStorage.set({xt_instance: newInstance});\n return;\n }\n\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 this.masterInstance = true;\n rootScope.managers.networkerFactory.startAll();\n this.log.warn('now master instance', newInstance);\n }\n\n this.clearDeactivateTimeout();\n } else if(this.masterInstance) {\n this.masterInstance = false;\n rootScope.managers.networkerFactory.stopAll();\n this.log.warn('now idle instance', newInstance);\n this.deactivateTimeout ||= window.setTimeout(() => this.deactivateInstance('tabs'), DEACTIVATE_TIMEOUT);\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 * 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 App from '../../config/app';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport Modes from '../../config/modes';\nimport loadScript from '../../helpers/dom/loadScript';\nimport tsNow from '../../helpers/tsNow';\nimport sessionStorage from '../sessionStorage';\n\nexport class TelegramMeWebManager {\n private disabled = /* false && */(Modes.test || !App.domains.includes(location.hostname));\n\n public setAuthorized(canRedirect: boolean) {\n if(this.disabled) {\n return;\n }\n\n return sessionStorage.get('tgme_sync').then((curValue) => {\n const ts = tsNow(true);\n if(\n canRedirect &&\n curValue?.canRedirect === canRedirect &&\n (curValue.ts + 86400) > ts\n ) {\n return;\n }\n\n sessionStorage.set({\n tgme_sync: {\n canRedirect,\n ts\n }\n });\n\n const path = `_websync_?authed=${canRedirect ? '1' : '0'}&version=${encodeURIComponent(App.version + ' ' + App.suffix)}`;\n const urls = [\n '//telegram.me/' + path,\n '//t.me/' + path\n ];\n\n const promises = urls.map((url) => {\n return loadScript(url).then((script) => {\n script.remove();\n });\n });\n\n return Promise.all(promises);\n });\n }\n}\n\nconst telegramMeWebManager = new TelegramMeWebManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.telegramMeWebManager = telegramMeWebManager);\nexport default telegramMeWebManager;\n","/*\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 loadScript(url: string) {\n const script = document.createElement('script');\n const promise = new Promise((resolve) => {\n script.onload = script.onerror = () => {\n resolve(script);\n };\n });\n script.src = url;\n document.body.appendChild(script);\n return promise;\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 type {PushNotificationObject} from '../serviceWorker/push';\nimport type {ServicePushPingTaskPayload} from '../serviceWorker/serviceMessagePort';\nimport type {NotificationSettings} from '../appManagers/uiNotificationsManager';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {logger} from '../logger';\nimport apiManagerProxy from './mtprotoworker';\nimport I18n, {LangPackKey} from '../langPack';\nimport {IS_MOBILE} from '../../environment/userAgent';\nimport appRuntimeManager from '../appManagers/appRuntimeManager';\nimport copy from '../../helpers/object/copy';\nimport singleInstance from './singleInstance';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport getServerMessageId from '../appManagers/utils/messageId/getServerMessageId';\n\nexport type PushSubscriptionNotifyType = 'init' | 'subscribe' | 'unsubscribe';\nexport type PushSubscriptionNotifyEvent = `push_${PushSubscriptionNotifyType}`;\n\nexport type PushSubscriptionNotify = {\n tokenType: number,\n tokenValue: string\n};\n\nconst PING_PUSH_INTERVAL = 10000;\n\nexport class WebPushApiManager extends EventListenerBase<{\n push_notification_click: (n: PushNotificationObject) => void,\n push_init: (n: PushSubscriptionNotify) => void,\n push_subscribe: (n: PushSubscriptionNotify) => void,\n push_unsubscribe: (n: PushSubscriptionNotify) => void\n}> {\n public isAvailable = true;\n private isPushEnabled = false;\n private localNotificationsAvailable = true;\n private started = false;\n private settings: NotificationSettings & {baseUrl?: string} = {} as any;\n private isAliveTO: any;\n private isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n private userVisibleOnly = this.isFirefox ? false : true;\n private log = logger('PM');\n\n constructor() {\n super(false);\n\n if(!('PushManager' in window) ||\n !('Notification' in window) ||\n !('serviceWorker' in navigator)) {\n this.log.warn('Push messaging is not supported.');\n this.isAvailable = false;\n this.localNotificationsAvailable = false;\n }\n\n if(this.isAvailable && Notification.permission === 'denied') {\n this.log.warn('The user has blocked notifications.');\n }\n }\n\n public start() {\n if(!this.started) {\n this.started = true;\n this.getSubscription();\n this.setUpServiceWorkerChannel();\n }\n }\n\n public setLocalNotificationsDisabled() {\n this.localNotificationsAvailable = false;\n }\n\n public getSubscription() {\n if(!this.isAvailable) {\n return;\n }\n\n navigator.serviceWorker.ready.then((reg) => {\n reg.pushManager.getSubscription().then((subscription) => {\n this.isPushEnabled = !!subscription;\n this.pushSubscriptionNotify('init', subscription);\n }).catch((err) => {\n this.log.error('Error during getSubscription()', err);\n });\n });\n }\n\n public subscribe = () => {\n if(!this.isAvailable) {\n return;\n }\n\n navigator.serviceWorker.ready.then((reg) => {\n reg.pushManager.subscribe({userVisibleOnly: this.userVisibleOnly}).then((subscription) => {\n // The subscription was successful\n this.isPushEnabled = true;\n this.pushSubscriptionNotify('subscribe', subscription);\n }).catch((e) => {\n if(Notification.permission === 'denied') {\n this.log('Permission for Notifications was denied');\n } else {\n this.log('Unable to subscribe to push.', e);\n if(!this.userVisibleOnly) {\n this.userVisibleOnly = true;\n setTimeout(this.subscribe, 0);\n }\n }\n });\n });\n }\n\n public unsubscribe() {\n if(!this.isAvailable) {\n return;\n }\n\n navigator.serviceWorker.ready.then((reg) => {\n reg.pushManager.getSubscription().then((subscription) => {\n this.isPushEnabled = false;\n\n if(subscription) {\n this.pushSubscriptionNotify('unsubscribe', subscription);\n\n setTimeout(() => {\n subscription.unsubscribe().then((successful) => {\n this.isPushEnabled = false;\n }).catch((e) => {\n this.log.error('Unsubscription error: ', e);\n });\n }, 3000);\n }\n }).catch((e) => {\n this.log.error('Error thrown while unsubscribing from ' +\n 'push messaging.', e);\n });\n });\n }\n\n public forceUnsubscribe() {\n if(!this.isAvailable) {\n return;\n }\n\n navigator.serviceWorker.ready.then((reg) => {\n reg.pushManager.getSubscription().then((subscription) => {\n this.log.warn('force unsubscribe', subscription);\n if(subscription) {\n subscription.unsubscribe().then((successful) => {\n this.log.warn('force unsubscribe successful', successful);\n this.isPushEnabled = false;\n }).catch((e) => {\n this.log.error('Unsubscription error: ', e);\n });\n }\n }).catch((e) => {\n this.log.error('Error thrown while unsubscribing from ' +\n 'push messaging.', e);\n });\n });\n }\n\n public isAliveNotify = () => {\n if(!this.isAvailable || singleInstance.deactivatedReason) {\n return;\n }\n\n this.settings.baseUrl = (location.href || '').replace(/#.*$/, '');\n\n const lang: ServicePushPingTaskPayload['lang'] = {} as any;\n const ACTIONS_LANG_MAP: Record = {\n push_action_mute1d: IS_MOBILE ? 'PushNotification.Action.Mute1d.Mobile' : 'PushNotification.Action.Mute1d',\n push_action_settings: IS_MOBILE ? 'PushNotification.Action.Settings.Mobile' : 'PushNotification.Action.Settings',\n push_message_nopreview: 'PushNotification.Message.NoPreview'\n };\n\n for(const action in ACTIONS_LANG_MAP) {\n lang[action as keyof typeof ACTIONS_LANG_MAP] = I18n.format(ACTIONS_LANG_MAP[action as keyof typeof ACTIONS_LANG_MAP], true);\n }\n\n apiManagerProxy.serviceMessagePort.invokeVoid('pushPing', {\n localNotifications: this.localNotificationsAvailable,\n lang: lang,\n settings: this.settings\n });\n\n this.isAliveTO = setTimeout(this.isAliveNotify, PING_PUSH_INTERVAL);\n }\n\n public setSettings(newSettings: WebPushApiManager['settings']) {\n this.settings = copy(newSettings);\n clearTimeout(this.isAliveTO);\n this.isAliveNotify();\n }\n\n public hidePushNotifications() {\n if(!this.isAvailable) {\n return;\n }\n\n apiManagerProxy.serviceMessagePort.invokeVoid('notificationsClear', undefined);\n }\n\n public setUpServiceWorkerChannel() {\n if(!this.isAvailable) {\n return;\n }\n\n apiManagerProxy.serviceMessagePort.addEventListener('pushClick', (payload) => {\n if(singleInstance.deactivatedReason) {\n appRuntimeManager.reload();\n return;\n }\n\n this.dispatchEvent('push_notification_click', payload);\n });\n\n navigator.serviceWorker.ready.then(this.isAliveNotify);\n }\n\n public pushSubscriptionNotify(event: PushSubscriptionNotifyType, subscription?: PushSubscription) {\n if(subscription) {\n const subscriptionObj: PushSubscriptionJSON = subscription.toJSON();\n if(!subscriptionObj ||\n !subscriptionObj.endpoint ||\n !subscriptionObj.keys ||\n !subscriptionObj.keys.p256dh ||\n !subscriptionObj.keys.auth) {\n this.log.warn('Invalid push subscription', subscriptionObj);\n this.unsubscribe();\n this.isAvailable = false;\n this.pushSubscriptionNotify(event);\n return;\n }\n\n this.log.warn('Push', event, subscriptionObj);\n this.dispatchEvent(('push_' + event) as PushSubscriptionNotifyEvent, {\n tokenType: 10,\n tokenValue: JSON.stringify(subscriptionObj)\n });\n } else {\n this.log.warn('Push', event, false);\n this.dispatchEvent(('push_' + event) as PushSubscriptionNotifyEvent, false as any);\n }\n }\n\n public ignorePushByMid(peerId: PeerId, mid: number) {\n if(!this.isAvailable) {\n return;\n }\n\n apiManagerProxy.serviceMessagePort.invokeVoid('shownNotification', peerId + '_' + getServerMessageId(mid));\n }\n}\n\nconst webPushApiManager = new WebPushApiManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.webPushApiManager = webPushApiManager);\nexport default webPushApiManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport IS_OPUS_SUPPORTED from '../environment/opusSupport';\nimport {IS_SAFARI} from '../environment/userAgent';\nimport {Modify} from '../types';\nimport {logger, LogTypes} from './logger';\nimport apiManagerProxy from './mtproto/mtprotoworker';\nimport type {ConvertWebPTask} from './webp/webpWorkerController';\n\ntype Result = {\n bytes: Uint8Array,\n waveform?: Uint8Array\n};\n\ntype Task = {\n pages: Uint8Array,\n withWaveform: boolean,\n waveform?: Uint8Array,\n callback: {resolve: (result: Result) => void, reject: (err: any) => void},\n timeout: number\n};\n\nexport interface ConvertOpusTask extends Modify {\n type: 'convertOpus'\n}\n\nexport class OpusDecodeController {\n private worker: Worker;\n private wavWorker: Worker;\n private sampleRate = 48000;\n private tasks: Array = [];\n private keepAlive = false;\n private log = logger('OPUS', LogTypes.Error);\n\n public isPlaySupported() {\n return IS_OPUS_SUPPORTED;\n }\n\n public loadWavWorker() {\n if(this.wavWorker) return;\n\n this.wavWorker = new Worker('waveWorker.min.js');\n this.wavWorker.addEventListener('message', (e) => {\n const data = e.data;\n\n this.log('[WAV] got message:', data);\n if(data && data.page) {\n const bytes = data.page;\n this.onTaskEnd(this.tasks.shift(), bytes);\n }\n });\n }\n\n public loadWorker() {\n if(this.worker) return;\n\n this.worker = new Worker('decoderWorker.min.js');\n this.worker.addEventListener('message', (e) => {\n const data = e.data;\n\n this.log('[DECODER] got message', data);\n if(data.type === 'done') {\n // this.log('[DECODER] send done to wav');\n this.wavWorker.postMessage({command: 'done'});\n\n if(data.waveform) {\n this.tasks[0].waveform = data.waveform;\n }\n } else { // e.data contains decoded buffers as float32 values\n // this.log('[DECODER] send encode to wav');\n this.wavWorker.postMessage({\n command: 'encode',\n buffers: e.data\n }, IS_SAFARI ? undefined : data.map((typedArray: Uint8Array) => typedArray.buffer));\n }\n });\n }\n\n public setKeepAlive(keepAlive: boolean) {\n this.keepAlive = keepAlive;\n if(this.keepAlive) {\n this.loadWorker();\n this.loadWavWorker();\n } else if(!this.tasks.length) {\n this.terminateWorkers();\n }\n }\n\n public onTaskEnd(task: Task, result?: Uint8Array) {\n if(!result) {\n task.callback.reject('timeout');\n } else {\n clearTimeout(task.timeout);\n task.callback.resolve({bytes: result, waveform: task.waveform});\n }\n\n if(this.tasks.length) {\n this.executeNewTask(this.tasks[0]);\n }\n\n this.terminateWorkers();\n }\n\n public terminateWorkers(kill = false) {\n if((this.keepAlive || this.tasks.length) && !kill) return;\n\n if(this.worker) {\n this.worker.terminate();\n this.worker = null;\n }\n\n if(this.wavWorker) {\n this.wavWorker.terminate();\n this.wavWorker = null;\n }\n }\n\n public executeNewTask(task: Task) {\n this.worker.postMessage({\n command: 'init',\n decoderSampleRate: this.sampleRate,\n outputBufferSampleRate: this.sampleRate\n });\n\n this.wavWorker.postMessage({\n command: 'init',\n wavBitDepth: 16,\n wavSampleRate: this.sampleRate\n });\n\n // console.log('sending command to worker:', task);\n // setTimeout(() => {\n this.log('[DECODER] send decode');\n this.worker.postMessage({\n command: 'decode',\n pages: task.pages,\n waveform: task.withWaveform\n }, IS_SAFARI ? undefined : [task.pages.buffer]);\n // }, 1e3);\n\n task.timeout = window.setTimeout(() => {\n this.log.error('decode timeout'/* , task */);\n\n this.terminateWorkers(true);\n if(this.tasks.length) {\n this.loadWorker();\n this.loadWavWorker();\n }\n\n this.onTaskEnd(this.tasks.shift());\n }, 10e3);\n }\n\n public pushDecodeTask(pages: Uint8Array, withWaveform: boolean) {\n return new Promise((resolve, reject) => {\n const task = {\n pages,\n withWaveform,\n callback: {resolve, reject},\n timeout: 0\n };\n\n this.loadWorker();\n this.loadWavWorker();\n\n if(this.tasks.push(task) === 1) {\n this.executeNewTask(task);\n }\n });\n }\n\n public async decode(typedArray: Uint8Array, withWaveform = false) {\n return this.pushDecodeTask(typedArray, withWaveform).then(async(result) => {\n const dataBlob = new Blob([result.bytes], {type: 'audio/wav'});\n return {url: await apiManagerProxy.invoke('createObjectURL', dataBlob), waveform: result.waveform};\n });\n }\n}\n\nconst opusDecodeController = new OpusDecodeController();\nMOUNT_CLASS_TO.opusDecodeController = opusDecodeController;\nexport default opusDecodeController;\n","/*\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 emojiRegExp from '../../vendor/emoji/regex';\nimport {MessageEntity} from '../../layer';\n\nconst EmojiHelper = {\n emojiMap: (code: string) => { return code; },\n shortcuts: [] as any,\n emojis: [] as any\n};\n\nexport const ALPHA_CHARS_REG_EXP = '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)\nexport const ALPHA_NUMERIC_REG_EXP = '0-9\\_' + ALPHA_CHARS_REG_EXP;\nexport const DOMAIN_ADD_CHARS = '\\u00b7';\n// Based on Regular Expression for URL validation by Diego Perini\nexport const URL_ALPHANUMERIC_REG_EXP_PART = '[' + ALPHA_CHARS_REG_EXP + '0-9]';\nexport const URL_PROTOCOL_REG_EXP_PART = '((?:https?|ftp)://|mailto:)?';\nexport const URL_REG_EXP = URL_PROTOCOL_REG_EXP_PART +\n // user:pass authentication\n '(?:' + URL_ALPHANUMERIC_REG_EXP_PART + '{1,64}(?::' + URL_ALPHANUMERIC_REG_EXP_PART + '{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 URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}' +\n // domain name\n '(?:\\\\.' + URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}){0,10}' +\n // TLD identifier\n '(?:\\\\.(xn--[0-9a-z]{2,16}|[' + ALPHA_CHARS_REG_EXP + ']{2,24}))' +\n ')' +\n // port number\n '(?::\\\\d{2,5})?' +\n // resource path\n '(?:/(?:\\\\S{0,255}[^\\\\s.;,(\\\\[\\\\]{}<>\"\\'])?)?';\nexport const URL_PROTOCOL_REG_EXP = new RegExp('^' + URL_PROTOCOL_REG_EXP_PART.slice(0, -1), 'i');\nexport const URL_ANY_PROTOCOL_REG_EXP = /^((?:[^\\/]+?):\\/\\/|mailto:)/;\nexport const USERNAME_REG_EXP = '[a-zA-Z\\\\d_]{5,32}';\nexport const BOT_COMMAND_REG_EXP = '\\\\/([a-zA-Z\\\\d_]{1,32})(?:@(' + USERNAME_REG_EXP + '))?(\\\\b|$)';\nexport const FULL_REG_EXP = new RegExp('(^| )(@)(' + USERNAME_REG_EXP + ')|(' + URL_REG_EXP + ')|(\\\\n)|(' + emojiRegExp + ')|(^|[\\\\s\\\\(\\\\]])(#[' + ALPHA_NUMERIC_REG_EXP + ']{2,64})|(^|\\\\s)' + BOT_COMMAND_REG_EXP, 'i');\nexport const EMAIL_REG_EXP = /^(([^<>()[\\]\\\\.,;:\\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 = /[`_*@~]/;\nexport const MARKDOWN_REG_EXP = /(^|\\s|\\n)(````?)([\\s\\S]+?)(````?)([\\s\\n\\.,:?!;]|$)|(^|\\s|\\x01)(`|~~|\\*\\*|__|_-_|\\|\\|)([^\\n]+?)\\7([\\x01\\s\\.,:?!;]|$)|@(\\d+)\\s*\\((.+?)\\)|(\\[(.+?)\\]\\((.+?)\\))/m;\nexport const SITE_HASHTAGS: {[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\n// export const SITE_MENTIONS: {[siteName in 'Telegram' | 'Twitter' | 'Instagram' | 'GitHub']: string} = {\n// Telegram: '#{1}',\n// Twitter: 'https://twitter.com/{1}',\n// Instagram: 'https://instagram.com/{1}/',\n// GitHub: 'https://github.com/{1}'\n// };\n\nexport const MARKDOWN_ENTITIES: {[markdown: string]: MessageEntity['_']} = {\n '`': 'messageEntityCode',\n '``': 'messageEntityPre',\n '**': 'messageEntityBold',\n '__': 'messageEntityItalic',\n '~~': 'messageEntityStrike',\n '_-_': 'messageEntityUnderline',\n '||': 'messageEntitySpoiler'\n};\n\nexport const PASS_CONFLICTING_ENTITIES: Set = new Set([\n 'messageEntityEmoji',\n 'messageEntityLinebreak',\n 'messageEntityCaret'\n]);\nfor(const i in MARKDOWN_ENTITIES) {\n PASS_CONFLICTING_ENTITIES.add(MARKDOWN_ENTITIES[i]);\n}\n\nexport const PHONE_NUMBER_REG_EXP = /^\\+\\d+$/;\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\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 * 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 addAnchorListener from '../../helpers/addAnchorListener';\nimport {PHONE_NUMBER_REG_EXP} from '.';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport matchUrlProtocol from './matchUrlProtocol';\nimport {T_ME_PREFIXES} from '../mtproto/mtproto_config';\n\nexport default function wrapUrl(url: string, unsafe?: number | boolean) {\n if(!matchUrlProtocol(url)) {\n url = 'https://' + url;\n }\n\n const out: {url: string, onclick?: Parameters[0]['name']} = {url};\n let tgMeMatch, telescoPeMatch, tgMatch;\n let onclick: typeof out['onclick'];\n /* if(unsafe === 2) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } else */if((tgMeMatch = url.match(/^(?:https?:\\/\\/)?(?:(.+?)\\.)?(?:(?:web|k|z)\\.)?t(?:elegram)?\\.me(?:\\/(.+))?/))) {\n const u = new URL(url);\n let prefix = tgMeMatch[1];\n if(prefix && T_ME_PREFIXES.has(tgMeMatch[1])) {\n prefix = undefined;\n }\n\n if(prefix) {\n u.pathname = prefix + (u.pathname === '/' ? '' : u.pathname);\n }\n\n const fullPath = u.pathname.slice(1);\n const path = fullPath.split('/');\n\n if(path[0] && path[0][0] === '$' && path[0].length > 1) {\n onclick = 'invoice';\n } else if(/^\\W/.test(fullPath) && !PHONE_NUMBER_REG_EXP.test(fullPath)) { // second regexp is for phone numbers (t.me/+38050...)\n onclick = 'joinchat';\n } else switch(path[0]) {\n case 'joinchat':\n case 'addstickers':\n case 'addemoji':\n case 'voicechat':\n case 'invoice':\n if(path.length !== 1 && !prefix) {\n onclick = path[0];\n break;\n }\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] as any;\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 out.onclick = onclick;\n return out;\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.wrapUrl = wrapUrl);\n","/*\n * 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, PollResults, Poll, WebPage, GroupCall, GroupCallParticipant, ReactionCount, MessagePeerReaction, PhoneCall, Config, Reaction} from '../layer';\nimport type {Dialog, ForumTopic, MessagesStorageKey, MyMessage} from './appManagers/appMessagesManager';\nimport type {MyDialogFilter} from './storages/filters';\nimport type {Folder} from './storages/dialogs';\nimport type {UserTyping} from './appManagers/appProfileManager';\nimport type {MyDraftMessage} from './appManagers/appDraftsManager';\nimport type {ConnectionStatusChange} from './mtproto/connectionStatus';\nimport type {GroupCallId} from './appManagers/appGroupCallsManager';\nimport type {AppManagers} from './appManagers/managers';\nimport type {State} from '../config/state';\nimport type {Progress} from './appManagers/appDownloadManager';\nimport type {CallId} from './appManagers/appCallsManager';\nimport type {MyDocument} from './appManagers/appDocsManager';\nimport type {MTAppConfig} from './mtproto/appConfig';\nimport {NULL_PEER_ID, UserAuth} from './mtproto/mtproto_config';\nimport EventListenerBase from '../helpers/eventListenerBase';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport MTProtoMessagePort from './mtproto/mtprotoMessagePort';\nimport {IS_WORKER} from '../helpers/context';\n\nexport type BroadcastEvents = {\n 'chat_full_update': ChatId,\n 'chat_update': ChatId,\n 'chat_toggle_forum': {chatId: ChatId, enabled: boolean},\n\n 'channel_update': ChatId,\n\n 'user_update': UserId,\n 'user_auth': UserAuth,\n 'user_full_update': UserId,\n\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, threadId?: number, typings: UserTyping[]},\n 'peer_block': {peerId: PeerId, blocked: boolean},\n 'peer_title_edit': {peerId: PeerId, threadId?: number},\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': Omit,\n\n 'dialog_draft': {peerId: PeerId, dialog: Dialog | ForumTopic, drop: boolean, draft: MyDraftMessage | undefined},\n 'dialog_unread': {peerId: PeerId, dialog: Dialog | ForumTopic},\n 'dialog_flush': {peerId: PeerId, dialog: Dialog},\n 'dialog_drop': Dialog | ForumTopic,\n 'dialog_migrate': {migrateFrom: PeerId, migrateTo: PeerId},\n // 'dialog_top': Dialog,\n 'dialog_notify_settings': Dialog | ForumTopic,\n // 'dialog_order': {dialog: Dialog, pos: number},\n 'dialogs_multiupdate': Map}>,\n\n 'history_append': {storageKey: MessagesStorageKey, message: Message.message},\n 'history_update': {storageKey: MessagesStorageKey, message: MyMessage, sequential?: boolean},\n 'history_reply_markup': {peerId: PeerId},\n 'history_multiappend': MyMessage,\n 'history_delete': {peerId: PeerId, msgs: Set},\n 'history_forbidden': PeerId,\n 'history_reload': PeerId,\n // 'history_request': void,\n\n 'message_edit': {storageKey: MessagesStorageKey, peerId: PeerId, mid: number, message: MyMessage},\n 'message_sent': {storageKey: MessagesStorageKey, tempId: number, tempMessage: any, mid: number, message: MyMessage},\n 'message_error': {storageKey: MessagesStorageKey, tempId: number, error: ApiError},\n 'messages_views': {peerId: PeerId, mid: number, views: number}[],\n 'messages_reactions': {message: Message.message, changedResults: ReactionCount[]}[],\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': Message.message,\n 'scheduled_delete': {peerId: PeerId, mids: number[]},\n\n 'album_edit': {peerId: PeerId, groupId: string, deletedMids: number[], messages: Message.message[]},\n\n 'stickers_installed': StickerSet.stickerSet,\n 'stickers_deleted': StickerSet.stickerSet,\n 'stickers_updated': {type: 'recent' | 'faved', stickers: MyDocument[]},\n 'stickers_top': Long,\n 'sticker_updated': {type: 'recent' | 'faved', document: MyDocument, faved: boolean},\n\n 'state_cleared': void,\n 'state_synchronized': ChatId | void,\n 'state_synchronizing': ChatId | void,\n\n 'contacts_update': UserId,\n 'avatar_update': {peerId: PeerId, threadId?: number},\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, settings: State['settings']},\n 'draft_updated': {peerId: PeerId, threadId: number, draft: MyDraftMessage | undefined, force?: 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 'notification_reset': string,\n 'notification_cancel': string,\n\n 'language_change': string,\n\n 'theme_change': void,\n\n 'media_play': void,\n\n 'emoji_recent': AppEmoji,\n\n 'download_progress': Progress,\n 'document_downloading': DocId,\n 'document_downloaded': DocId,\n\n 'choosing_sticker': boolean\n\n 'group_call_update': GroupCall,\n 'group_call_participant': {groupCallId: GroupCallId, participant: GroupCallParticipant},\n // 'group_call_video_track_added': {instance: GroupCallInstance}\n\n 'call_update': PhoneCall,\n 'call_signaling': {callId: CallId, data: Uint8Array},\n\n 'quick_reaction': Reaction,\n\n 'service_notification': Update.updateServiceNotification,\n\n 'logging_out': void,\n\n 'payment_sent': {peerId: PeerId, mid: number, receiptMessage: Message.messageService}\n\n 'premium_toggle': boolean,\n 'premium_toggle_private': {isNew: boolean, isPremium: boolean},\n\n 'config': Config,\n 'app_config': MTAppConfig\n};\n\nexport type BroadcastEventsListeners = {\n [name in keyof BroadcastEvents]: (e: BroadcastEvents[name]) => void\n};\n\nexport class RootScope extends EventListenerBase {\n public myId: PeerId;\n private connectionStatus: {[name: string]: ConnectionStatusChange};\n public settings: State['settings'];\n public managers: AppManagers;\n public premium: boolean;\n\n constructor() {\n super();\n\n this.myId = NULL_PEER_ID;\n this.connectionStatus = {};\n this.premium = false;\n\n this.addEventListener('user_auth', ({id}) => {\n this.myId = id.toPeerId();\n });\n\n this.addEventListener('premium_toggle_private', ({isNew, isPremium}) => {\n this.premium = isPremium;\n\n if(!isNew) {\n this.dispatchEventSingle('premium_toggle', isPremium);\n }\n });\n\n this.addEventListener('connection_status_change', (status) => {\n this.connectionStatus[status.name] = status;\n });\n\n this.dispatchEvent = (e, ...args) => {\n super.dispatchEvent(e, ...args);\n MTProtoMessagePort.getInstance().invokeVoid('event', {name: e as string, args});\n };\n\n if(!IS_WORKER) {\n this.addEventListener('settings_updated', ({settings}) => {\n this.settings = settings;\n });\n }\n }\n\n public getConnectionStatus() {\n return this.connectionStatus;\n }\n\n public getPremium() {\n return this.premium;\n }\n\n public dispatchEventSingle(...args: any[]) {\n // @ts-ignore\n super.dispatchEvent(...args);\n }\n}\n\nconst rootScope = new RootScope();\nMOUNT_CLASS_TO.rootScope = rootScope;\nexport default rootScope;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport {WorkerTaskVoidTemplate} from '../../types';\n\nexport interface ConvertWebPTask extends WorkerTaskVoidTemplate {\n type: 'convertWebp',\n payload: {\n fileName: string,\n bytes: Uint8Array\n }\n};\n\nexport class WebpWorkerController {\n private worker: Worker;\n private convertPromises: {[fileName: string]: CancellablePromise} = {};\n\n private init() {\n this.worker = new Worker(new URL('./webp.worker.ts', import.meta.url));\n this.worker.addEventListener('message', (e) => {\n const task = e.data as ConvertWebPTask;\n const payload = task.payload;\n\n const promise = this.convertPromises[payload.fileName];\n if(promise) {\n payload.bytes ? promise.resolve(payload.bytes) : promise.reject();\n delete this.convertPromises[payload.fileName];\n }\n });\n }\n\n private postMessage(data: ConvertWebPTask) {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n this.worker.postMessage(data);\n }\n\n public convert(fileName: string, bytes: Uint8Array) {\n if(this.convertPromises.hasOwnProperty(fileName)) {\n return this.convertPromises[fileName];\n }\n\n const convertPromise = deferredPromise();\n\n this.postMessage({type: 'convertWebp', payload: {fileName, bytes}});\n\n return this.convertPromises[fileName] = convertPromise;\n }\n}\n\nconst webpWorkerController = new WebpWorkerController();\nMOUNT_CLASS_TO.webpWorkerController = webpWorkerController;\nexport default webpWorkerController;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + ({\"589\":\"crypto.worker\",\"630\":\"npm.qr-code-styling\",\"670\":\"sw\",\"678\":\"mtproto.worker\"}[chunkId] || chunkId) + \".\" + {\"8\":\"93d2f33af815eb0455aa\",\"53\":\"9088c624bc0da70fcd02\",\"61\":\"99941a688bad81e71e09\",\"63\":\"7e1f9a4ae86bb873ca6d\",\"77\":\"b8cf11d2b5dca36479ca\",\"104\":\"476c2f411510266c35de\",\"147\":\"4eb614e56f1d9fbfd1e7\",\"231\":\"f4d1bfe6ff7f14577f96\",\"301\":\"95838a8203f23dd1ce8f\",\"339\":\"12bdbede82465e666965\",\"392\":\"031f85fcb7cf31c35a88\",\"436\":\"65389e22546d82aaa8c8\",\"437\":\"487f9ec608fdb29ab7a0\",\"442\":\"765ae47d035fd5250820\",\"508\":\"a90261547e5af541e4e8\",\"589\":\"f500ff0fffe065cf9cba\",\"630\":\"f8f57a1c721e03c3f699\",\"641\":\"e29a883ff173169e88cd\",\"642\":\"be93122d1116ecdc9322\",\"670\":\"a575e0dcdf92b2ccb0f9\",\"678\":\"e3a23c58261a5160e0d7\",\"684\":\"a0a965e6cfe303d2345a\",\"709\":\"9186b58006e0c80f1e5f\",\"776\":\"01d9a0f7f70d71de2d79\",\"781\":\"decdb6e23f9d404a1931\",\"783\":\"949e247466ad3ebe82d6\",\"810\":\"58611e718b4eafec6685\",\"813\":\"315ffd640c7d6013a536\"}[chunkId] + \".chunk.js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = {};\n var countMap = {};\n var getRetryDelay = function () {\n return 3000;\n };\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result +\n (queryMap.hasOwnProperty(chunkId) ? '?' + queryMap[chunkId] : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.hasOwnProperty(chunkId)\n ? countMap[chunkId]\n : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n var retryAttempt = 999999 - retries + 1;\n setTimeout(function () {\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap[chunkId] = cacheBust;\n countMap[chunkId] = retries - 1;\n resolve(__webpack_require__.e(chunkId));\n }, getRetryDelay(retryAttempt));\n });\n });\n };\n }\n})();\n","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t179: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\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\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [85,110], () => (__webpack_require__(2938)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","leafPrototypes","getProto","inProgress","dataWebpackPrefix","IS_BETA","DEBUG","MOUNT_CLASS_TO","window","self","STATE_VERSION","BUILD","DEFAULT_THEME","_","access_hash","id","settings","pFlags","base_theme","accent_color","message_colors","wallpaper","default","pattern","document","undefined","slug","intensity","background_color","second_background_color","third_background_color","fourth_background_color","dark","title","emoticon","makeDefaultAppTheme","name","baseTheme","highlightningColor","find","s","STATE_INIT","allDialogsLoaded","pinnedOrders","contactsListCachedTime","updates","filtersArr","maxSeenMsgId","stateCreatedTime","Date","now","recentEmoji","recentCustomEmoji","topPeersCache","recentSearch","version","build","authState","IS_MOBILE","hiddenPinnedMessages","messagesTextSize","distanceUnit","sendShortcut","animationsEnabled","autoDownload","photo","contacts","private","groups","channels","video","file","autoDownloadNew","file_size_max","video_preload_large","audio_preload_next","photo_size_max","video_size_max","video_upload_maxbitrate","autoPlay","gifs","videos","stickers","suggest","loop","emoji","big","themes","theme","notifications","sound","timeFormat","toLocaleString","match","playbackParams","volume","muted","playbackRate","playbackRates","voice","audio","round","keepSigned","chatContextMenuHintWasShown","stateId","notifySettings","IS_APPLE_MX","ctx","createElement","getContext","extension","getExtension","renderer","getParameter","UNMASKED_RENDERER_WEBGL","getSupportedExtensions","indexOf","err","CAN_USE_TRANSFERABLES","IS_SAFARI","navigator","userAgent","search","geolocation","getCurrentPosition","IMAGE_MIME_TYPES_SUPPORTED","Set","add","arr","concat","canPlayType","IS_APPLE_MOBILE","replace","IS_FIREFOX","mediaDevices","DocumentTouch","USER_AGENT","IS_APPLE","IS_ANDROID","toLowerCase","IS_CHROMIUM","test","vendor","platform","maxTouchPoints","IS_MOBILE_SAFARI","vibrate","VIDEO_MIME_TYPES_SUPPORTED","toDataURL","startsWith","rgbToHsv","r","g","b","v","Math","max","c","min","h","hsvToRgb","f","n","k","rgbaToHsla","a","l","d","hslaToRgba","hue2rgb","p","q","t","map","hexaToRgba","hexa","offset","length","slice","i","push","parseInt","hexToRgb","hex","hexaToHsla","rgba","rgbaToHexa","toString","join","hslaStringToHex","hsla","splitted","split","alpha","pop","val","endsWith","hslaStringToRgba","hslaStringToHexa","mixColors","color1","color2","weight","out","Array","v1","v2","floor","computePerceivedBrightness","color","getAverageColor","getAccentColor","baseHsv","baseColor","elementColor","hsvTemp3","hsvTemp4","dist","changeColorAccent","accentHsv","isDarkTheme","colorHsv","abs","newColor","origBrightness","newBrightness","amountOfNew","amount","changeBrightness","getHexColorFromTelegramColor","repeat","getRgbColorFromTelegramColor","getColorsFromWallPaper","wallPaper","filter","Boolean","compareVersion","s1","s2","blurActiveElement","activeElement","blur","cancelEvent","event","originalEvent","stopPropagation","preventDefault","returnValue","cancelBubble","findUpClassName","el","className","closest","fixSafariStickyInput","input","style","transform","focus","then","IS_STICKY_INPUT_BUGGED","key","startY","o","capture","passive","onTouchMove","e","touch","touches","scrollable","target","y","scrolled","scrollTop","scrollHeight","clientHeight","nextScrollTop","lastFocusOutTimeStamp","addEventListener","classList","contains","timeStamp","touchStart","removeEventListener","fixSafariStickyInputFocusing","callback","cacheInstallPrompt","deferredPrompt","prompt","outcome","userChoice","getInstallPrompt","texts","cache","fonts","text","icons","monospace","loadFonts","types","Promise","resolve","promises","type","_texts","font","weights","_promises","load","race","all","catch","setInnerHTML","elem","html","setDirection","innerHTML","replaceChildren","setAttribute","FOCUS_EVENT_NAME","IdleController","constructor","super","this","_isIdle","focusPromise","focusResolve","isIdle","once","idle","getFocusPromise","value","dispatchEvent","clamp","OverlayCounter","overlaysActive","isOverlayActive","fastRafCallbacks","fastRaf","requestAnimationFrame","currentCallbacks","forEach","cb","fastRafConventionalCallbacks","rafPromise","processing","fastRafConventional","fastRafPromise","doubleRaf","parseUriParams","uri","params","item","decodeURIComponent","appColorMap","rgb","light","lightFilled","darkRgb","darkFilled","colorMap","day","night","themeController","setTheme","themeColorElem","_themeColorElem","head","querySelector","setThemeColor","themeColor","isNight","setThemeListener","darkModeMediaQuery","matchMedia","checkDarkMode","systemTheme","matches","addListener","applyHighlightningColor","getTheme","documentElement","setProperty","removeProperty","colorScheme","toggle","applyTheme","styleElement","append","textContent","cssText","switchTheme","bindColorApplier","options","appliedColors","applyAppColor","_options","finalize","has","element","lightenAlpha","darkenAlpha","mixColor","appColor","lightenedRgb","darkenedHsla","applyNewTheme","isNightTheme","currentTheme","themeSettings","newAppTheme","AppBackgroundTab","setBackgroundDocument","isArray","baseColors","hsvTemp1","hsvTemp2","newAccentRgb","newAccentHex","messageLightenAlpha","baseMessageColor","baseMessageOutBackgroundColor","myMessagesAccent","nextColor","accentColor2","outbox_accent_color","newMessageOutBackgroundColor","workerHandler","construct","args","url","location","Worker","SharedWorker","w","Proxy","setWorkerProxy","Element","prototype","toggleAttribute","force","hasAttribute","removeAttribute","Node","nodes","rootScope","getProxiedManagers","getElementById","href","singleInstance","visualViewport","lastVH","setViewportVH","setVH","vh","overlayCounter","height","innerHeight","toggleResizeMode","tabId","onImTabChange","wasTabId","tagName","appMediaViewer","onInResize","hasFocus","onOutResize","console","log","perf","performance","langPromise","stateResult","langPack","fadeInWhenFontsReady","promise","opacity","state","isPremium","appVersion","lang_code","dir","hash","tgWebAuthToken","data","token","dcId","tgWebAuthDcId","userId","tgWebAuthUserId","toUserId","isTest","tgWebAuthTest","tgAddr","tgaddr","urlSearchParams","URLSearchParams","set","delete","pagePromise","placeholder","prepend","cloneNode","meModule","pushModule","setAuthorized","forceUnsubscribe","mount","sentCode","authCode","pause","ready","reload","close","DEBUG_MANAGER_REQUESTS","createProxyProxy","proxied","ack","get","receiver","method","warn","createProxy","acknowledged","IDB","db","storageIsAvailable","openDatabase","INSTANCES","isAvailable","createNew","openDbPromise","createIndexes","os","store","indexNames","from","indexName","deleteIndex","indexes","index","createIndex","keyPath","objectParameters","request","indexedDB","open","reject","error","message","finished","setTimeout","onerror","onsuccess","result","calledNew","onclose","onabort","transaction","onversionchange","onupgradeneeded","oldVersion","newVersion","stores","objectStoreNames","objectStore","createObjectStore","static","instance","preserve","storage","IDBStorage","storeName","idb","create","entryName","getObjectStore","clear","save","idx","put","mode","onError","clearTimeout","timeout","onComplete","results","requests","waitForTransactionComplete","oncomplete","callbackResult","left","onRequestFinished","getAll","UNSUPPORTED_LANG_PACK_KEY","I18n","pluralRules","cacheLangPackPromise","setLangCode","langCode","lastRequestedLangCode","lastRequestedNormalizedLangCode","updateAmPm","dateTimeFormat","getDateTimeFormat","hour","minute","hour12","date","setHours","amText","format","amPmCache","am","pmText","pm","loadLocalLangPack","defaultCode","lang","langSign","countries","strings","formatLocalStrings","saveLangPack","from_version","local","loadLangPack","web","requestedServerLanguage","managers","apiManager","invokeApiCacheable","lang_pack","polyfillPromise","pushTo","applyLangPack","currentLangCode","Intl","PluralRules","string","countriesList","country","langPackKey","default_name","lastAppliedLangCode","cachedDateTimeFormats","querySelectorAll","weakMap","update","superFormatter","indexHolder","lastIndex","p1","p2","p3","p4","lastIndexOf","wrappedUrl","onclick","DocumentFragment","firstChild","arg","pushNextArgument","plain","str","select","Map","isRTL","setRTL","rtl","getCacheLangPack","finally","setTimeFormat","haveToUpdate","IntlDateElement","getStrings","keys","getLangPack","langPack1","langPack2","localLangPack1","localLangPack2","_Intl","Object","assign","WeakMap","IntlElementBase","property","IntlElement","formatted","dataset","compareAndUpdate","json","JSON","stringify","DateTimeFormat","hours","getHours","getMinutes","i18n","i18n_","_i18n","joinElementsWith","elements","joiner","isLast","useLast","joined","NULL_PEER_ID","REPLIES_PEER_ID","REPLIES_HIDDEN_CHANNEL_ID","SERVICE_PEER_ID","MUTE_UNTIL","BOT_START_PARAM","MAX_FILE_SAVE_SIZE","THUMB_TYPE_FULL","TOPIC_COLORS","ATTACH_MENU_BOT_ICON_NAME","GENERAL_TOPIC_ID","T_ME_PREFIXES","FOLDER_ID_ALL","FOLDER_ID_ARCHIVE","REAL_FOLDERS","IS_CALL_SUPPORTED","IS_CANVAS_FILTER_SUPPORTED","IS_EMOJI_SUPPORTED","IS_GEOLOCATION_SUPPORTED","IS_GROUP_CALL_SUPPORTED","IS_MOV_SUPPORTED","IS_PARALLAX_SUPPORTED","IS_SCREEN_SHARING_SUPPORTED","IS_TOUCH_SUPPORTED","IS_VIBRATE_SUPPORTED","IS_OPUS_SUPPORTED","IS_SHARED_WORKER_SUPPORTED","IS_WEBM_SUPPORTED","IS_WEBP_SUPPORTED","IS_WEBRTC_SUPPORTED","MEDIA_MIME_TYPES_SUPPORTED","ALL_KEYS","REFRESH_KEYS","loadStateInner","logger","totalPerf","recordPromise","stateStorage","sessionStorage","pushedKeys","pushToState","copy","splice","auth","shift","sessionBuild","shiftedWebKAuth","values","dcID","toPeerId","obj","resetStorages","chats","dialogs","users","_state","state_id","time","autoDownloadSettings","oldTypes","mediaType","peerTypeSettings","peerType","SKIP_VALIDATING_PATHS","validateInitObject","missingKey","migrated","oldThemes","oldTheme","oldBackground","background","newTheme","colors","wallPaperSettings","k_build","ApiManagerProxy","onMirrorTask","payload","hasOwnProperty","mirrors","mirror","tabState","chatPeerIds","idleStartTime","registerWorker","registerServiceWorker","registerCryptoWorker","addMultipleEventsListeners","convertWebp","fileName","bytes","webpWorkerController","convertOpus","opusDecodeController","localStorageProxy","storageTask","language","toggleStorages","telegramMeWebManager","webPushApiManager","cacheName","caches","appRuntimeManager","idleController","updateTabStateIdle","invoke","pingServiceWorkerWithIframe","pingServiceWorkerPromise","iframe","hidden","onLoad","remove","src","random","body","attachServiceWorker","serviceWorker","lastServiceWorker","serviceMessagePort","detachPort","attachSendPort","invokeVoid","_registerServiceWorker","register","URL","scope","registration","active","controller","unregister","installing","waiting","worker","attachListenPort","port","source","ports","hello","resendLockTask","share","originals","originalUrl","createWorker","attachWorkerToPort","cryptoMessagePort","blob","fetch","response","pathnameSplitted","pathname","origin","Blob","onWorkerFirstMessage","messagePort","attachPort","loadState","sendState","invokeCrypto","enabled","clearWrite","getMirror","getState","updateTabState","apiManagerProxy","IS_MULTIPLE_TABS_SUPPORTED","SingleInstance","clearInstance","masterInstance","deactivated","checkInstance","newInstance","instanceId","curInstance","deactivateInstance","xt_instance","clearDeactivateTimeout","deactivateTimeout","deactivatedReason","start","reset","started","setInterval","activateInstance","reason","TelegramMeWebManager","disabled","hostname","canRedirect","curValue","ts","tsNow","tgme_sync","path","encodeURIComponent","script","onload","appendChild","loadScript","WebPushApiManager","isPushEnabled","localNotificationsAvailable","isFirefox","userVisibleOnly","subscribe","reg","pushManager","subscription","pushSubscriptionNotify","Notification","permission","isAliveNotify","baseUrl","ACTIONS_LANG_MAP","push_action_mute1d","push_action_settings","push_message_nopreview","action","localNotifications","isAliveTO","getSubscription","setUpServiceWorkerChannel","setLocalNotificationsDisabled","unsubscribe","successful","setSettings","newSettings","hidePushNotifications","subscriptionObj","toJSON","endpoint","p256dh","tokenType","tokenValue","ignorePushByMid","peerId","mid","sampleRate","tasks","keepAlive","isPlaySupported","loadWavWorker","wavWorker","page","onTaskEnd","loadWorker","postMessage","command","waveform","buffers","typedArray","buffer","setKeepAlive","terminateWorkers","task","executeNewTask","kill","terminate","decoderSampleRate","outputBufferSampleRate","wavBitDepth","wavSampleRate","pages","withWaveform","pushDecodeTask","decode","dataBlob","ALPHA_CHARS_REG_EXP","ALPHA_NUMERIC_REG_EXP","URL_ALPHANUMERIC_REG_EXP_PART","URL_PROTOCOL_REG_EXP_PART","URL_REG_EXP","URL_ANY_PROTOCOL_REG_EXP","RegExp","USERNAME_REG_EXP","BOT_COMMAND_REG_EXP","FULL_REG_EXP","EMAIL_REG_EXP","MARKDOWN_REG_EXP","SITE_HASHTAGS","MARKDOWN_ENTITIES","PASS_CONFLICTING_ENTITIES","PHONE_NUMBER_REG_EXP","wrapUrl","unsafe","tgMeMatch","telescoPeMatch","tgMatch","u","prefix","fullPath","RootScope","myId","connectionStatus","premium","isNew","dispatchEventSingle","status","getConnectionStatus","getPremium","convertPromises","init","convert","convertPromise","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","call","m","O","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","j","every","getter","__esModule","getPrototypeOf","ns","def","current","getOwnPropertyNames","definition","defineProperty","enumerable","chunkId","reduce","miniCssF","globalThis","Function","prop","done","needAttach","scripts","getElementsByTagName","getAttribute","charset","nc","onScriptComplete","prev","doneFns","parentNode","removeChild","bind","Symbol","toStringTag","scriptUrl","importScripts","currentScript","Error","oldGetScript","oldLoadScript","queryMap","countMap","retries","realSrc","cacheBust","baseURI","installedChunks","installedChunkData","errorType","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file diff --git a/public/main.57462bdb2faa73d01185.css b/public/main.e77b88e634966721e48d.css similarity index 64% rename from public/main.57462bdb2faa73d01185.css rename to public/main.e77b88e634966721e48d.css index 65665a33..396fe51f 100644 --- a/public/main.57462bdb2faa73d01185.css +++ b/public/main.e77b88e634966721e48d.css @@ -1,4 +1,4 @@ /*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;line-height:1.15}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{-webkit-text-decoration-skip:objects;background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted currentColor;text-decoration:underline dotted currentColor}b,strong{font-weight:inherit;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:-.25em}sup{top:-.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}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-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}[hidden],template{display:none}html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}ul:not(.browser-default){list-style-type:none;padding-left:0}ul:not(.browser-default)>li{list-style-type:none}a{-webkit-tap-highlight-color:rgba(0,0,0,0)}button{background:none;border:none;cursor:pointer;outline:none;padding:0}img,video{-webkit-user-drag:none}.valign-wrapper{align-items:center;display:flex}.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;user-select:none}.no-transition,.no-transition:after,.no-transition:before{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{left:50%;position:absolute!important;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-wrap{white-space:nowrap!important}.no-border-radius{border-radius:0!important}.disable-hover{pointer-events:none!important}.reflect-x{transform:scaleX(-1)}[dir=auto]{unicode-bidi:plaintext}.is-rtl [dir=auto]{direction:inherit}a{text-decoration:none}html{font-weight:400;line-height:1.5}h1,h2,h3,h4,h5,h6{line-height:1.3}em{font-style:italic}strong{font-weight:500}small{font-size:75%}code,pre{word-wrap:break-word;white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap} -: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:.2s ease-in-out;--btn-menu-transition:.2s cubic-bezier(.4,0,.2,1);--esg-transition:var(--btn-menu-transition);--input-transition:.2s ease-out;--sticker-viewer-open-transition-in:.2s var(--transition-standard-easing);--sticker-viewer-open-transition-out:.2s var(--transition-standard-easing);--sticker-viewer-switch-transition:.2s cubic-bezier(.12,1.1,.56,1.2);--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:.25s cubic-bezier(.35,.35,.47,1.34);--chatlist-badge-transition-out:.25s 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) + 0.5rem)*-1);--message-time-background:rgba(0,0,0,.35);--message-highlightning-color:rgba(109,141,65,.4);--messages-container-width:728px;--messages-text-size:16px;--messages-line-height:1.3125;--messages-secondary-text-size:calc(var(--messages-text-size) - 2px);--messages-secondary-line-height:calc(var(--messages-secondary-text-size) + 4px);--messages-time-text-size:calc(var(--messages-text-size) - 4px);--messages-service-text-size:calc(var(--messages-text-size) - 1px);--messages-custom-emoji-size:calc(var(--messages-text-size) + 4px);--bubble-transition-in:transform var(--transition-standard-in),opacity var(--transition-standard-in);--bubble-transition-out:transform var(--transition-standard-out),opacity var(--transition-standard-out);--line-height-20:26px;--line-height-16:21px;--line-height-14:18px;--line-height-12:16px;--line-height:1.3125;--font-size-20:20px;--font-size-16:16px;--font-size-14:14px;--font-size-12:12px;--font-size:var(--font-size-16);--esg-sticker-size:72px;--esg-custom-emoji-size:36px;--popup-sticker-size:80px;--disabled-opacity:.3;--round-video-size:280px;--menu-box-shadow:0px 0px 10px var(--menu-box-shadow-color);--menu-backdrop-filter:blur(50px);--font-monospace:"Roboto Mono",monospace;--font-weight-bold:500;--font-weight-normal:400;--selection-background-color:rgba(var(--primary-color-rgb),.4);--selection-color:inherit;--topbar-floating-scaleX:1;--topbar-call-height:3rem;--topbar-floating-call-height:0px;--call-button-size:3.375rem;--call-button-margin:2rem;--custom-emoji-size:1.25rem;--esg-width:100%;--peer-avatar-red-top:#ff845e;--peer-avatar-red-bottom:#d45246;--peer-avatar-orange-top:#febb5b;--peer-avatar-orange-bottom:#f68136;--peer-avatar-violet-top:#b694f9;--peer-avatar-violet-bottom:#6c61df;--peer-avatar-green-top:#9ad164;--peer-avatar-green-bottom:#46ba43;--peer-avatar-cyan-top:#53edd6;--peer-avatar-cyan-bottom:#28c9b7;--peer-avatar-blue-top:#5bcbe3;--peer-avatar-blue-bottom:#359ad4;--peer-avatar-pink-top:#ff8aac;--peer-avatar-pink-bottom:#d95574;--peer-avatar-archive-top:#b8c2cc;--peer-avatar-archive-bottom:#9eaab5;--peer-avatar-saved-top:var(--light-filled-saved-color);--peer-avatar-saved-bottom:var(--saved-color);--avatar-color-top:var(--peer-avatar-saved-top);--avatar-color-bottom:var(--peer-avatar-saved-bottom);--avatar-border-radius-forum:37%;--premium-gradient:linear-gradient(52.62deg,#6b93ff 12.22%,#976fff 50.25%,#e46ace 98.83%)}@media only screen and (max-width:600px){:root{--right-column-width:100vw;--esg-sticker-size:68px;--popup-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:420px;--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-height:570px)and (min-width:601px){:root{--esg-width:23.875rem}}@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;--scrollbar-color:rgba(0,0,0,.2);--section-box-shadow-color:rgba(0,0,0,.06);--menu-box-shadow-color:rgba(0,0,0,.15);--input-search-background-color:#fff;--input-search-border-color:#dfe1e5;--secondary-color:#c4c9cc;--avatar-online-color:var(--primary-color);--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;--monospace-text-color:var(--danger-color);--backdrop-opacity:.85;--menu-background-color:rgba(var(--surface-color-rgb),var(--backdrop-opacity));--message-background-color:var(--surface-color);--message-time-color:var(--secondary-text-color);--message-checkbox-color:#61c642;--message-checkbox-border-color:#fff;--message-primary-color:var(--primary-color);--light-filled-message-primary-color:var(--light-filled-primary-color);--message-secondary-color:var(--secondary-color);--message-error-color:var(--danger-color);--message-out-link-color:var(--link-color);--message-out-status-color:var(--message-out-primary-color);--message-out-time-color:var(--message-out-status-color);--message-out-audio-play-button-color:#fff;--message-out-selection-background-color:var(--selection-background-color);--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:#aaa;--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;--scrollbar-color:hsla(0,0%,100%,.2);--section-box-shadow-color:rgba(0,0,0,.12);--input-search-background-color:#181818;--input-search-border-color:#2f2f2f;--secondary-color:#707579;--avatar-online-color:var(--primary-color);--chatlist-status-color:var(--primary-color);--chatlist-pinned-color:var(--secondary-color);--badge-text-color:#fff;--link-color:var(--primary-color);--ripple-color:hsla(0,0%,100%,.08);--poll-circle-color:#fff;--spoiler-background-color:#373e4e;--spoiler-draft-background-color:#484848;--monospace-text-color:var(--primary-text-color);--menu-background-color:rgba(var(--surface-color-rgb),.75);--message-background-color:var(--surface-color);--message-time-color:var(--secondary-text-color);--message-checkbox-color:var(--primary-color);--message-checkbox-border-color:#fff;--message-secondary-color:var(--secondary-color);--message-error-color:#fff;--message-out-link-color:#fff;--message-out-status-color:#fff;--message-out-time-color:hsla(0,0%,100%,.6);--message-out-audio-play-button-color:var(--message-out-background-color);--message-out-selection-background-color:rgba(var(--surface-color-rgb),.4)}@font-face{font-display:block;font-family:tgico;font-style:normal;font-weight:400;src:url(assets/fonts/tgico.ttf?ivbp49) format("truetype"),url(assets/fonts/tgico.woff?ivbp49) format("woff"),url(assets/fonts/tgico.svg?ivbp49#tgico) format("svg")}.tgico:after,.tgico:before,[class*=" tgico-"]:after,[class*=" tgico-"]:before,[class^=tgico-]{speak:never;font-feature-settings:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:tgico!important;font-style:normal;font-variant:normal;font-weight:400;line-height:1;text-transform:none}.tgico-check:before{content:"๎ค€"}.tgico-checks:before{content:"๎ค"}.tgico-activesessions:before{content:"๎ค‚"}.tgico-add:before{content:"๎คƒ"}.tgico-add_reaction: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-audio_repeat:before{content:"๎คŽ"}.tgico-audio_repeat_single:before{content:"๎ค"}.tgico-avatarnext:before{content:"๎ค"}.tgico-avatarprevious:before{content:"๎ค‘"}.tgico-binfilled: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-card:before{content:"๎คœ"}.tgico-card_outline: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:before{content:"๎คฑ"}.tgico-delete_filled: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-fast_forward:before{content:"๎ฅƒ"}.tgico-fast_rewind:before{content:"๎ฅ„"}.tgico-favourites:before{content:"๎ฅ…"}.tgico-flag:before{content:"๎ฅ†"}.tgico-flip:before{content:"๎ฅ‡"}.tgico-folder:before{content:"๎ฅˆ"}.tgico-fontsize:before{content:"๎ฅ‰"}.tgico-forward:before{content:"๎ฅŠ"}.tgico-forward_filled: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-groupmedia:before{content:"๎ฅ‘"}.tgico-groupmediaoff:before{content:"๎ฅ’"}.tgico-help:before{content:"๎ฅ“"}.tgico-hide: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-limit_chat:before{content:"๎ฅŸ"}.tgico-limit_chats:before{content:"๎ฅ "}.tgico-limit_file:before{content:"๎ฅก"}.tgico-limit_folders:before{content:"๎ฅข"}.tgico-limit_link:before{content:"๎ฅฃ"}.tgico-limit_pin: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-mediaspoiler:before{content:"๎ฅฎ"}.tgico-mediaspoileroff:before{content:"๎ฅฏ"}.tgico-mention:before{content:"๎ฅฐ"}.tgico-menu:before{content:"๎ฅฑ"}.tgico-message:before{content:"๎ฅฒ"}.tgico-messageunread:before{content:"๎ฅณ"}.tgico-microphone:before{content:"๎ฅด"}.tgico-microphone_crossed:before{content:"๎ฅต"}.tgico-microphone_crossed_filled:before{content:"๎ฅถ"}.tgico-microphone_filled: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-pip:before{content:"๎ฆŒ"}.tgico-play:before{content:"๎ฆ"}.tgico-playback_05:before{content:"๎ฆŽ"}.tgico-playback_15:before{content:"๎ฆ"}.tgico-playback_1x:before{content:"๎ฆ"}.tgico-playback_2x:before{content:"๎ฆ‘"}.tgico-plus:before{content:"๎ฆ’"}.tgico-poll:before{content:"๎ฆ“"}.tgico-premium_addone:before{content:"๎ฆ”"}.tgico-premium_double:before{content:"๎ฆ•"}.tgico-premium_lock:before{content:"๎ฆ–"}.tgico-premium_unlock:before{content:"๎ฆ—"}.tgico-previous:before{content:"๎ฆ˜"}.tgico-radiooff:before{content:"๎ฆ™"}.tgico-radioon:before{content:"๎ฆš"}.tgico-reactions:before{content:"๎ฆ›"}.tgico-readchats:before{content:"๎ฆœ"}.tgico-recent:before{content:"๎ฆ"}.tgico-replace:before{content:"๎ฆž"}.tgico-reply:before{content:"๎ฆŸ"}.tgico-reply_filled:before{content:"๎ฆ "}.tgico-rightpanel:before{content:"๎ฆก"}.tgico-rotate_left:before{content:"๎ฆข"}.tgico-rotate_right: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:before{content:"๎ฆฎ"}.tgico-settings_filled:before{content:"๎ฆฏ"}.tgico-sharescreen_filled:before{content:"๎ฆฐ"}.tgico-shipping:before{content:"๎ฆฑ"}.tgico-shuffle:before{content:"๎ฆฒ"}.tgico-smallscreen:before{content:"๎ฆณ"}.tgico-smile:before{content:"๎ฆด"}.tgico-spoiler:before{content:"๎ฆต"}.tgico-sport:before{content:"๎ฆถ"}.tgico-star:before{content:"๎ฆท"}.tgico-stickers:before{content:"๎ฆธ"}.tgico-stickers_face:before{content:"๎ฆน"}.tgico-stop:before{content:"๎ฆบ"}.tgico-strikethrough:before{content:"๎ฆป"}.tgico-textedit:before{content:"๎ฆผ"}.tgico-tip:before{content:"๎ฆฝ"}.tgico-tools:before{content:"๎ฆพ"}.tgico-topics: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:before{content:"๎งˆ"}.tgico-videocamera_crossed_filled:before{content:"๎ง‰"}.tgico-videocamera_filled:before{content:"๎งŠ"}.tgico-videochat:before{content:"๎ง‹"}.tgico-volume_down:before{content:"๎งŒ"}.tgico-volume_mute:before{content:"๎ง"}.tgico-volume_off:before{content:"๎งŽ"}.tgico-volume_up:before{content:"๎ง"}.tgico-zoomin:before{content:"๎ง"}.tgico-zoomout:before{content:"๎ง‘"}.tgico-phone_filled:before{content:"๎คฟ";transform:rotate(-135deg)}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;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-display:swap;font-family:Roboto;font-style:normal;font-weight:400;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-display:swap;font-family:Roboto;font-style:normal;font-weight:400;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-display:swap;font-family:Roboto;font-style:normal;font-weight:500;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-display:swap;font-family:Roboto;font-style:normal;font-weight:500;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-display:swap;font-family:Roboto;font-style:normal;font-weight:500;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-display:swap;font-family:Roboto;font-style:normal;font-weight:600;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-display:swap;font-family:Roboto;font-style:normal;font-weight:600;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-display:swap;font-family:Roboto;font-style:normal;font-weight:600;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-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlco8VkKjG.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-Ulco8VkKjG.woff2) format("woff2");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlco8VkKjG.woff2) format("woff2");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlco8VkKjG.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlco8VkKjG.woff2) format("woff2");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ulco8VkA.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlco8VkKjG.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-Ulco8VkKjG.woff2) format("woff2");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlco8VkKjG.woff2) format("woff2");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlco8VkKjG.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlco8VkKjG.woff2) format("woff2");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ulco8VkA.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0me8iUI0.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0me8iUI0.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}.input-wrapper{margin:0 auto;width:360px}.input-field{--height:54px;--border-radius:10px;position:relative}@media only screen and (max-width:600px){.input-field{--height:50px}}.input-field .arrow-down{border:solid var(--secondary-text-color);border-radius:1px;border-width:0 2px 2px 0;bottom:0;content:" ";cursor:pointer;display:inline-block;height:0;margin-top:-9px;padding:5px;position:absolute;right:21px;top:50%;transform:rotate(45deg);-webkit-transform:rotate(45deg);transition:all .2s;vertical-align:middle;width:0;z-index:2}[dir=ltr] .input-field label{left:1rem}[dir=rtl] .input-field label{right:1rem}.input-field label{background-color:var(--surface-color);color:#9e9e9e;height:1.5rem;margin-top:calc((var(--height) - 1.5rem)/2);pointer-events:none;position:absolute;right:auto;top:0;transform:translate(0);transform-origin:left center;-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap;z-index:2}.is-rtl .input-field label{transform-origin:right center}body.animation-level-2 .input-field label{transition:transform .2s,padding .2s,opacity .1s,font-weight 0s .1s}.input-field-border{border:2px solid var(--primary-color);border-radius:var(--border-radius);bottom:0;left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:0;z-index:1}body.animation-level-2 .input-field-border{transition:opacity .2s}.input-field-icon{border-radius:.375rem;height:1.5rem;pointer-events:none;position:absolute;right:1rem;top:50%;transform:translateY(-50%);width:1.5rem;z-index:1}.input-field-input{--padding:1rem;--padding-horizontal:1rem;--border-width:1px;background-color:var(--surface-color);border:var(--border-width) solid var(--input-search-border-color);border-radius:var(--border-radius);box-sizing:border-box;line-height:var(--line-height);min-height:var(--height);padding:calc(var(--padding) - var(--border-width)) calc(var(--padding-horizontal) - var(--border-width));position:relative;transition:border-color 0s;width:100%;z-index:1}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:active,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:hover{-webkit-box-shadow:0 0 0 1000px var(--surface-color) inset}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:active,.input-field-input:-webkit-autofill:first-line,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:hover{color:var(--primary-text-color)!important;font-family:Roboto,-apple-system,apple color emoji,BlinkMacSystemFont,Segoe UI,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif!important;font-size:1rem!important}@media only screen and (max-width:600px){.input-field-input{--padding:.9375rem;--padding-horizontal:.9375rem}}body.animation-level-0 .input-field-input{transition:none!important}html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid),html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid){border-color:var(--primary-color);transition:border-color .2s}html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid)~label,html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid)~label{color:var(--primary-color)}.input-field-input:focus{border-color:var(--primary-color)}.input-field-input.error{border-color:var(--danger-color)}.input-field-input.error~label{color:var(--danger-color)!important}.input-field-input.error~.input-field-border{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{border-color:var(--primary-color);margin-top:-4px;transform:rotate(225deg)}.input-field-input:focus~label{color:var(--primary-color);font-weight:var(--font-weight-bold)}.input-field-input:focus~.input-field-border{opacity:1}.input-field-input:disabled~label,.input-field-input:focus~label,.input-field-input:not(:empty)~label,.input-field-input:valid~label{opacity:1;padding:0 .3125rem;transform:translate(-.1875rem,calc(var(--height)/-2 + .0625rem)) scale(.75)}.input-field-input-fake{bottom:auto!important;height:auto!important;left:0;opacity:0;pointer-events:none;position:absolute!important;right:auto!important;top:0;z-index:-3}.input-fields-row{display:flex}.input-fields-row .input-field{flex:1 1 auto;width:1%}.input-wrapper>*+*{margin-top:1.5rem}::-moz-placeholder{color:#909192;opacity:1}::placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192}::-ms-input-placeholder{color:#909192}button:focus,input:focus{outline:none}.input-clear{border:none;outline:none;padding:0}body.animation-level-0 .input-clear.error{color:var(--danger-color)!important}body:not(.animation-level-0) .input-clear.error{animation:input-shake .2s ease-in-out forwards}@keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-.5rem)}75%{transform:translateX(.5rem)}to{transform:translateX(0)}}.input-search{--border-radius:22px;margin-left:.4375rem;margin-right:.4375rem;overflow:hidden;position:relative;width:100%}@media only screen and (max-width:600px){[dir=ltr] .input-search{margin-left:1rem}[dir=rtl] .input-search{margin-right:1rem}}.input-search-input{--height:42px;background-color:var(--input-search-background-color);border-color:var(--input-search-border-color);height:var(--height);line-height:var(--height);max-height:var(--height)!important;min-height:var(--height)!important;padding:0 calc(var(--height) + 3px - var(--border-width))}body.animation-level-2 .input-search-input{transition:border-color .2s ease-in-out}html.no-touch .input-search-input:active:not(:focus),html.no-touch .input-search-input:hover:not(:focus){border-color:var(--secondary-color)!important}.input-search-input:focus{background-color:transparent;border-color:var(--primary-color)}.input-search-input:focus~.tgico{color:var(--primary-color);opacity:1}html.no-touch .input-search-input:focus~.btn-icon:active,html.no-touch .input-search-input:focus~.btn-icon:hover{background-color:var(--light-primary-color)}.input-search-input:-moz-placeholder-shown~.tgico-close{display:none}.input-search-input:placeholder-shown~.tgico-close{display:none}.input-search>.tgico{color:var(--secondary-text-color);font-size:1.5rem;line-height:1;opacity:.6;position:absolute;text-align:center;top:50%;transform:translateY(-50%);z-index:1}body.animation-level-2 .input-search>.tgico{transition:opacity .2s ease-out,color .2s ease-out}[dir=ltr] .input-search>.tgico-search{left:.8125rem}[dir=rtl] .input-search>.tgico-search{right:.8125rem}.input-search>.tgico-search{height:1.5rem;pointer-events:none;width:1.5rem}[dir=ltr] .input-search>.tgico-close{right:0}[dir=rtl] .input-search>.tgico-close{left:0}.input-search>.tgico-close{height:42px;width:42px;z-index:1}[dir=ltr] .input-search>.tgico-close:before{margin-right:-1px}[dir=rtl] .input-search>.tgico-close:before{margin-left:-1px}[dir=ltr] .input-field-password .input-field-input{padding-right:2.5rem}[dir=rtl] .input-field-password .input-field-input{padding-left:2.5rem}.input-field-password .input-field-input{max-height:var(--height)}.input-field-password .input-field-input[type=password]{font-family:Arial,Helvetica,sans-serif;font-size:2.25rem;line-height:1;padding-bottom:0;padding-left:calc(.875rem - var(--border-width));padding-top: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{align-items:center;color:#9e9e9e;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;padding:.5rem;position:absolute;right:.375rem;top:50%;transform:translateY(-50%);transition:color .2s;z-index:2}.input-field-password .toggle-visible:before{content:"๎ฅ"}.input-field-password .toggle-visible.eye-hidden:before{content:"๎ฅ‚"}html.no-touch .input-field-password .toggle-visible:active,html.no-touch .input-field-password .toggle-visible:hover{color:var(--primary-text-color)}.input-field-phone .input-field-input{--letter-spacing:.24px}.input-field-phone .input-field-input:after{color:#9e9e9e;content:attr(data-left-pattern);letter-spacing:var(--letter-spacing)}.btn,.btn-icon{background:none;border:none;cursor:pointer;outline:none}body.animation-level-0 .btn,body.animation-level-0 .btn-icon{transition:none}html.no-touch .btn-icon:active,html.no-touch .btn-icon:hover,html.no-touch .btn:active,html.no-touch .btn:hover{background-color:var(--light-secondary-text-color)}html.no-touch .btn-icon.active:active,html.no-touch .btn-icon.active:hover,html.no-touch .btn-icon.blue:active,html.no-touch .btn-icon.blue:hover,html.no-touch .btn-icon.primary:active,html.no-touch .btn-icon.primary:hover,html.no-touch .btn.active:active,html.no-touch .btn.active:hover,html.no-touch .btn.blue:active,html.no-touch .btn.blue:hover,html.no-touch .btn.primary:active,html.no-touch .btn.primary:hover{background-color:var(--light-primary-color)}html.no-touch .btn-icon.danger:active,html.no-touch .btn-icon.danger:hover,html.no-touch .btn.danger:active,html.no-touch .btn.danger:hover{background-color:var(--light-danger-color)}.btn-icon:disabled,.btn:disabled{opacity:var(--disabled-opacity);pointer-events:none!important}.btn-icon{align-items:center;background-color:transparent;border:none;border-radius:50%!important;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;line-height:1;padding:.5rem;position:relative;text-align:center;transition:color .15s ease-in-out,opacity .15s ease-in-out}.btn-icon.rp{overflow:hidden}.btn-icon.active{color:var(--primary-color)}[dir=ltr] .btn-corner{right:var(--offset)}[dir=rtl] .btn-corner{left:var(--offset)}.btn-corner{--offset:1.25rem;--translateY:calc(54px + var(--offset));align-items:center;background-color:var(--primary-color);border:none;bottom:var(--offset);box-shadow:none!important;color:#fff;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;outline:none;padding:0!important;position:absolute!important;text-align:center;transform:translate3d(0,var(--translateY),0);transition:transform var(--btn-corner-transition)!important;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:3}html.no-touch .btn-corner:active,html.no-touch .btn-corner:hover{background-color:var(--dark-primary-color)}.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{height:2.5rem;width:2.5rem}.btn-menu{-webkit-touch-callout:none;-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:var(--menu-background-color);border-radius:10px;font-size:1rem;min-width:11.25rem;opacity:0;padding:.3125rem 0;position:absolute;top:100%;transform:scale(.8)!important;transition:opacity var(--btn-menu-transition),transform var(--btn-menu-transition),visibility var(--btn-menu-transition);-webkit-user-select:none;visibility:hidden;z-index:4}.btn-menu-old,.is-mobile .btn-menu{-webkit-backdrop-filter:none;backdrop-filter:none;background-color:var(--surface-color);min-width:auto;padding:.5rem 0}.btn-menu-old .btn-menu-item,.is-mobile .btn-menu .btn-menu-item{--padding-left:1rem;--padding-right:2.5rem;--icon-margin:1.5rem;--icon-size:1.5rem;border-radius:0;font-size:var(--font-size-16);font-weight:400;height:3rem;line-height:var(--line-height-16);margin:0;transform:none!important}.btn-menu-old .btn-menu-item:before,.is-mobile .btn-menu .btn-menu-item:before{align-self:auto;color:var(--secondary-text-color);margin-top:0}.btn-menu-old .btn-menu-footer,.is-mobile .btn-menu .btn-menu-footer{background-color:var(--background-color)}.btn-menu{box-shadow:var(--menu-box-shadow)}body.animation-level-0 .btn-menu{transition:none}.btn-menu.active{opacity:1;visibility:visible}.btn-menu.active,.is-mobile .btn-menu.was-open{transform:scaleX(1)!important}.btn-menu.bottom-left,.is-rtl .btn-menu.bottom-right{left:auto;right:0;top:100%;transform-origin:top right}.btn-menu.bottom-right,.is-rtl .btn-menu.bottom-left{left:0;right:auto;top:100%;transform-origin:top left}.btn-menu.bottom-center{transform-origin:top center}.btn-menu.top-left{bottom:100%;left:auto;right:0;top:auto;transform-origin:bottom right}.btn-menu.top-right,.is-rtl .btn-menu.top-left{bottom:100%;left:0;right:auto;top:auto;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}[dir=ltr] .btn-menu-item{text-align:left}[dir=rtl] .btn-menu-item{text-align:right}.btn-menu-item{--padding-vertical:.25rem;--padding-left:.75rem;--padding-right:.75rem;--icon-margin:1.25rem;--icon-size:1.25rem;align-items:center;border-radius:.3125rem;color:var(--primary-text-color);cursor:pointer!important;display:flex;font-size:var(--font-size-14);font-weight:500;height:2rem;line-height:var(--line-height-14);margin-left:.3125rem;margin-right:.3125rem;padding:var(--padding-vertical) var(--padding-right) var(--padding-vertical) var(--padding-left);pointer-events:all!important;position:relative;text-transform:none;transform:scale(1);white-space:nowrap}.btn-menu-item.tgico-char:before{width:var(--icon-size)}body.animation-level-2 .btn-menu-item{transition:transform var(--btn-menu-transition)}.btn-menu-item:active{transform:scale(.96)}html.no-touch .btn-menu-item:active,html.no-touch .btn-menu-item:hover{background-color:var(--light-secondary-text-color)}html.no-touch .btn-menu-item.danger:active,html.no-touch .btn-menu-item.danger:hover{background-color:var(--light-danger-color)}.btn-menu-item:before{align-self:flex-start;color:var(--primary-text-color);font-size:var(--icon-size);margin-top:.125rem}[dir=ltr] .btn-menu-item-icon,[dir=ltr] .btn-menu-item:before{margin-right:var(--icon-margin)}[dir=rtl] .btn-menu-item-icon,[dir=rtl] .btn-menu-item:before{margin-left:var(--icon-margin)}.btn-menu-item-icon,.btn-menu-item:before{position:relative}[dir=ltr] .btn-menu-item-icon{margin-right:calc(var(--icon-margin) - var(--add)/2)}[dir=rtl] .btn-menu-item-icon{margin-left:calc(var(--icon-margin) - var(--add)/2)}[dir=ltr] .btn-menu-item-icon{margin-left:calc(var(--add)/-2)}[dir=rtl] .btn-menu-item-icon{margin-right:calc(var(--add)/-2)}.btn-menu-item-icon{--add:.25rem;--total:calc(var(--icon-size) + var(--add));flex:0 0 auto;height:var(--total);width:var(--total)}.btn-menu-item-icon .media-photo{height:inherit;width:inherit}@media only screen and (max-width:600px){.btn-menu-item{--padding-right:1.875rem}}.btn-menu-item-text{flex:1 1 auto;position:relative}.btn-menu-item-text,.btn-menu-item-text-fake{pointer-events:none}[dir=ltr] .btn-menu-item-text-fake{margin-left:var(--margin-left)}[dir=rtl] .btn-menu-item-text-fake{margin-right:var(--margin-left)}.btn-menu-item-text-fake{--margin-left:calc(var(--icon-size) + var(--icon-margin));max-width:calc(100% - var(--margin-left) - var(--padding-left) - var(--padding-right));overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap}.btn-menu-item-subtitle{color:var(--secondary-text-color);font-size:.875rem}.btn-menu-item-header{color:var(--secondary-text-color);font-weight:var(--font-weight-bold);height:2rem;pointer-events:none!important}[dir=ltr] .btn-menu-item .stacked-avatars{right:.5rem}[dir=rtl] .btn-menu-item .stacked-avatars{left:.5rem}.btn-menu-item .stacked-avatars{--margin-right:-.6875rem;flex:0 0 auto;pointer-events:none;position:absolute}.btn-menu-item.is-multiline{font-size:.75rem;height:auto;max-width:16.25rem;min-width:calc(100% - .625rem);width:-moz-fit-content;width:fit-content}.btn-menu-item.is-multiline .btn-menu-item-text{white-space:pre-wrap;width:-moz-fit-content;width:fit-content}.btn-menu-item .checkbox-field-toggle{padding:0}.btn-menu-overlay{bottom:0;bottom:-100vh;cursor:default;left:0;left:-100vw;max-width:none!important;position:fixed!important;right:0;right:-100vw;top:0;top:-100vh;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:auto!important;z-index:4}.btn-menu.has-footer{padding-bottom:0}.btn-menu-footer{align-items:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;color:currentColor;display:flex;font-size:.875rem;height:2.5rem;justify-content:center}.btn-menu hr{display:block!important;margin:.3125rem auto;opacity:.6;padding:0;width:calc(100% - 1.875rem)}html:not(.is-mobile) .btn-menu .badge{background-color:transparent;color:var(--secondary-text-color)}.btn-menu-reactions{--inner-shadow-degree:90deg;-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:var(--menu-background-color);border-radius:var(--height);filter:drop-shadow(0 .125rem .5rem rgba(0,0,0,.24));height:inherit;max-height:100%;max-width:100%;opacity:0;position:absolute;transform:scale(.8);transform-origin:bottom left}[dir=ltr] .btn-menu-reactions-container{margin-left:var(--other-side-offset)}[dir=rtl] .btn-menu-reactions-container{margin-right:var(--other-side-offset)}.btn-menu-reactions-container{--height:2.25rem;--bubble-side-offset:0rem;--other-side-offset:0rem;--menu-offset:calc((var(--height) + 0.5rem)*-1);--width:calc(var(--menu-width) + (var(--bubble-side-offset) + var(--other-side-offset))*-1);display:flex;height:var(--height);justify-content:flex-start;margin-top:var(--menu-offset);max-width:var(--width);position:fixed;width:var(--width);z-index:4}.contextmenu.bottom-left+.btn-menu-reactions-container .btn-menu-reactions,.contextmenu.center-left+.btn-menu-reactions-container .btn-menu-reactions{transform-origin:bottom right!important}.contextmenu.bottom-center+.btn-menu-reactions-container .btn-menu-reactions{transform-origin:bottom center!important}[dir=ltr] .btn-menu-reactions-container-vertical{margin-left:var(--menu-offset)}[dir=rtl] .btn-menu-reactions-container-vertical{margin-right:var(--menu-offset)}.btn-menu-reactions-container-vertical{flex-direction:column;height:var(--width);margin-top:0;max-height:var(--width);max-width:var(--height);width:var(--height)}.btn-menu-reactions-container-vertical .btn-menu-reactions{--inner-shadow-degree:180deg;display:flex;flex-direction:column;height:auto;transform-origin:top right;width:inherit}.btn-menu-reactions-container-vertical .btn-menu-reactions-reaction{--padding-vertical:var(--padding-base);--padding-horizontal:0rem}.btn-menu-reactions-container-vertical .btn-menu-reactions-bubble-big{bottom:var(--offset);right:calc(var(--size)/-2)}body.animation-level-2 .btn-menu-reactions{transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.btn-menu-reactions.is-visible{opacity:1;transform:scale(1)}.btn-menu-reactions-bubble{background-color:inherit;border-radius:50%;position:absolute;z-index:-1}.btn-menu-reactions-bubble-big{--size:1rem;--offset:calc(var(--height)/2);bottom:calc(var(--size)/-2);height:var(--size);right:var(--offset);width:var(--size)}.btn-menu-reactions:after{background:linear-gradient(var(--inner-shadow-degree),var(--surface-color) 0,rgba(var(--surface-color-rgb),0) 1rem,rgba(var(--surface-color-rgb),0) calc(100% - 1rem),var(--surface-color) 100%);border-radius:inherit;bottom:0;content:" ";left:0;pointer-events:none;position:absolute;right:0;top:0}.btn-menu-reactions .scrollable{border-radius:inherit;display:flex;position:relative}.btn-menu-reactions .scrollable-x{align-items:center;padding:0 .25rem}.btn-menu-reactions .scrollable-y{align-items:center;flex-direction:column;padding:.25rem 0}.btn-menu-reactions-reaction{--size:1.625rem;--padding-base:.25rem;--padding-vertical:0rem;--padding-horizontal:var(--padding-base);cursor:pointer;flex:0 0 auto;height:calc(var(--size) + var(--padding-vertical)*2);padding:var(--padding-vertical) var(--padding-horizontal);width:calc(var(--size) + var(--padding-horizontal)*2)}.btn-menu-reactions-reaction-scale{height:100%;width:100%}html:not(.is-safari) .btn-menu-reactions-reaction-scale{transform:scale(1)}html:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-scale{transition:transform .1s linear}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select{transform:scale(1)}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:active,html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:hover{transform:scale(1.25)}html.no-touch:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-select{transition:transform var(--transition-standard-in)}.btn-menu-reactions-reaction .media-sticker-wrapper{height:100%;position:relative;width:100%}.btn-primary{border:none;border-radius:10px;cursor:pointer;font-weight:var(--font-weight-bold);height:54px;overflow:hidden;padding:0;position:relative;text-align:center;transition:opacity .2s;width:100%}html.no-touch .btn-primary:active,html.no-touch .btn-primary:hover{background:var(--dark-primary-color);transition:opacity .2s}.btn-primary-transparent{background-color:transparent;color:var(--primary-color)}html.no-touch .btn-primary-transparent:active,html.no-touch .btn-primary-transparent:hover{background:var(--light-primary-color)}.btn-primary-transparent .c-ripple__circle{background-color:var(--light-primary-color)}html.no-touch .btn-primary-transparent.danger:active,html.no-touch .btn-primary-transparent.danger:hover{background-color:var(--light-danger-color)}.btn-primary-transparent .preloader-circular .preloader-path{stroke:var(--primary-color)}body.animation-level-0 .btn-primary{transition:none}[dir=ltr] .btn-primary use,[dir=ltr] .btn-primary>svg{right:15px}[dir=rtl] .btn-primary use,[dir=rtl] .btn-primary>svg{left:15px}.btn-primary use,.btn-primary>svg{height:calc(100% - 20px);left:auto}.btn-primary:disabled{opacity:var(--disabled-opacity);pointer-events:none!important}[dir=ltr] .btn-control{padding-left:.75rem;padding-right:1.5rem}[dir=rtl] .btn-control{padding-left:1.5rem;padding-right:.75rem}.btn-control{align-items:center;border-radius:1.25rem;display:flex;height:2.5rem;line-height:2.5rem;margin:.9375rem auto 1rem;width:auto}[dir=ltr] .btn-control.tgico:before{margin-right:.375rem}[dir=rtl] .btn-control.tgico:before{margin-left:.375rem}.btn-control.tgico:before{font-size:1.5rem}.btn-transparent{align-items:center;background-color:transparent;color:var(--primary-text-color);display:flex;font-weight:400;height:3rem;line-height:var(--line-height);padding:0 1rem}@media only screen and (max-width:600px){.btn-transparent{height:3rem}}html.no-touch .btn-transparent:active,html.no-touch .btn-transparent:hover{background-color:var(--light-secondary-text-color)}html.no-touch .btn-transparent.danger:active,html.no-touch .btn-transparent.danger:hover{background-color:var(--light-danger-color)}html.no-touch .btn-transparent.primary:active,html.no-touch .btn-transparent.primary:hover{background-color:var(--light-primary-color)}[dir=ltr] .btn-transparent:before{margin-right:2rem}[dir=rtl] .btn-transparent:before{margin-left:2rem}.btn-transparent:before{color:var(--secondary-text-color);font-size:1.5rem}@media only screen and (max-width:600px){[dir=ltr] .btn-transparent:before{margin-right:1.5rem}[dir=rtl] .btn-transparent:before{margin-left:1.5rem}}[dir=ltr] .btn-transparent.btn-short:before{margin-right:1rem}[dir=rtl] .btn-transparent.btn-short:before{margin-left:1rem}.btn-primary.btn-circle .preloader-circular{height:calc(100% - 20px);left:auto;margin:0;right:auto;top:10px}.btn-primary.btn-circle .preloader-circular .preloader-path{stroke:#fff}.btn-menu-toggle{cursor:pointer!important;font-weight:400!important;overflow:visible!important;pointer-events:all!important;position:relative}.btn-menu-toggle:not(.btn-primary):not(.btn-corner).menu-open{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);line-height:var(--size);width:var(--size)}@media only screen and (max-width:600px){.btn-circle{--size:46px}}.btn-circle path{fill:#fff}.btn-disabled{color:var(--secondary-text-color)!important;cursor:default!important;pointer-events:none!important}.btn-disabled:before{color:inherit!important}.btn-secondary:not(:first-child){margin-top:.5rem!important}.btn-color-primary{background:var(--primary-color);color:#fff}.call-button{-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);border-radius:50%;font-size:1.5rem;height:var(--call-button-size);justify-content:center;position:relative}.call-button,.call-button-container{align-items:center;cursor:pointer;display:flex;width:var(--call-button-size)}.call-button-container{flex-direction:column}.call-button-container.disabled,.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{font-size:.875rem;margin-top:.25rem;white-space:nowrap}body.animation-level-2 .call-button-text{transition:opacity var(--transition-standard-in)}body.animation-level-2 .call-button{transition:background-color var(--transition-standard-in),opacity var(--transition-standard-in)}[dir=ltr] .call-button+.call-button,[dir=ltr] .call-button-container+.call-button-container{margin-left:var(--call-button-margin)}[dir=rtl] .call-button+.call-button,[dir=rtl] .call-button-container+.call-button-container{margin-right:var(--call-button-margin)}[dir=ltr] .btn-update{right:auto!important}[dir=rtl] .btn-update{left:auto!important}.btn-update{border-radius:var(--size);font-size:1rem;font-weight:var(--font-weight-bold);padding:0 2rem!important;width:auto}.animated-close-icon{pointer-events:none;position:absolute;transform:rotate(-45deg)}.animated-close-icon,.animated-close-icon:after,.animated-close-icon:before{background-color:var(--secondary-text-color);border-radius:.125rem;height:.125rem;width:1.125rem}.animated-close-icon:after,.animated-close-icon:before{content:"";left:0;position:absolute;top:0}.animated-close-icon:before{transform:rotate(90deg)}body.animation-level-2 .animated-close-icon,body.animation-level-2 .animated-close-icon:after,body.animation-level-2 .animated-close-icon:before{transition:transform var(--slide-header-transition)}.animated-close-icon.state-back{transform:rotate(180deg)}.animated-close-icon.state-back:before{transform:rotate(45deg) scaleX(.75) translateY(-.375rem)}.animated-close-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translateY(.375rem)}.animated-menu-icon{--color:var(--secondary-text-color);position:absolute}.animated-menu-icon,.animated-menu-icon:after,.animated-menu-icon:before{background-color:var(--color);border-radius:.125rem;height:.125rem;transform:rotate(0);width:1.125rem}body.animation-level-2 .animated-menu-icon,body.animation-level-2 .animated-menu-icon:after,body.animation-level-2 .animated-menu-icon:before{transition:transform .25s}.animated-menu-icon:after,.animated-menu-icon:before{content:"";left:0;position:absolute}.animated-menu-icon:before{top:-.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(.75) translate(.375rem,-.1875rem)}.animated-menu-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translate(.375rem,.1875rem)}.animated-menu-close-icon{margin-top:-.625rem}.animated-menu-close-icon:before{opacity:1;top:.3125rem}body.animation-level-2 .animated-menu-close-icon:before{transition:transform .25s,opacity .125s 0s}.animated-menu-close-icon:after{top:.625rem}.animated-menu-close-icon.state-back{transform:translateY(.3125rem) rotate(135deg)}.animated-menu-close-icon.state-back:before{opacity:0;transform:rotate(45deg)}.animated-menu-close-icon.state-back:after{transform:translateY(-.625rem) rotate(90deg)}.animated-button-icon>.tgico{height:24px;line-height:24px;position:absolute}body:not(.animation-level-0) .animated-button-icon>.tgico{animation:hide-icon .4s ease-in-out forwards}body.animation-level-0 .animated-button-icon>.tgico{animation:none!important;visibility:hidden}.autocomplete-helper{--border-radius:10px;border-radius:var(--border-radius)!important;bottom:calc(100% + .5rem);left:0;max-width:100%;overflow:hidden;padding:0!important;position:absolute!important;width:auto!important}.autocomplete-helper:not(.is-visible){display:none}.autocomplete-helper.is-visible{visibility:hidden}body.animation-level-2 .autocomplete-helper.is-visible{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){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{max-height:232px;position:relative}.autocomplete-peer-helper-list{padding:.5rem 0}.autocomplete-peer-helper-list-element{align-items:center;cursor:pointer;display:flex;height:3.125rem;line-height:var(--line-height);padding:0 2.125rem 0 .75rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (max-width:600px){.autocomplete-peer-helper-list-element{padding-right:.75rem}}.autocomplete-peer-helper-list-element-name{flex:0 0 auto;font-weight:var(--font-weight-bold);margin-left:.875rem}.autocomplete-peer-helper-list-element-description{color:var(--secondary-text-color);margin-left:.5625rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.autocomplete-peer-helper-list-element-avatar{flex:0 0 auto}.badge{--size:1.375rem;--padding:.4375rem;border-radius:calc(var(--size)/2);color:var(--badge-text-color);font-size:.875rem;font-weight:var(--font-weight-bold);height:var(--size);line-height:var(--size)!important;min-width:var(--size);padding:0 var(--padding);text-align:center}body.animation-level-2 .badge{transition:background-color .2s ease-in-out}.badge:not(.tgico):empty{display:none}.badge-20{--size:1.25rem;--padding:.375rem}.badge-24{--size:1.5rem;--padding:.5rem}.badge.tgico:before{font-size:var(--size)}.badge-primary{background-color:var(--primary-color)}.badge-gray{background-color:var(--secondary-color)}.ckin__player{letter-spacing:.02em;-webkit-user-select:none;-moz-user-select:none;user-select:none}.ckin__player.ckin__fullscreen{background:#000;border-radius:0!important;bottom:0;display:flex;height:100%;left:0;position:fixed;right:0;top:0;width:100%;z-index:10000000}.ckin__player.ckin__fullscreen video{height:100%;-o-object-fit:contain;object-fit:contain;width:100%}.ckin__player .time{color:#fff;font-size:.875rem;margin-left:.875rem}@media only screen and (max-width:600px){.ckin__player .time{margin-left:1.125rem}}.default{align-items:center;display:flex;font-size:0;justify-content:center;position:relative}.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;color:#fff;font-size:4rem;left:50%;line-height:1;opacity:1;outline:0;padding:0;position:absolute;text-align:center;top:50%;transform:translate3d(-50%,-50%,0) scale(1)}@media only screen and (min-width:601px){.default__button--big{pointer-events:none}}body.animation-level-2 .default__button--big{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}[dir=ltr] .default__controls{text-align:left}[dir=rtl] .default__controls{text-align:right}.default__controls{bottom:0;direction:ltr;left:0;position:absolute;right:0;z-index:6}body.animation-level-2 .default__controls{transition:transform var(--layer-transition)}.default__controls .progress-line{border-radius:var(--border-radius);margin:0 16px}.default__controls .progress-line__filled{background:var(--primary-color)}.default__controls .progress-line__loaded{background-color:#fff}.default__controls .progress-line{background:hsla(0,0%,100%,.38)}@media only screen and (max-width:600px){.default__controls .progress-line{margin-bottom:-1px}}.default__gradient-bottom{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAADGCAYAAAAT+OqFAAAAdklEQVQoz42QQQ7AIAgEF/T/D+kbq/RWAlnQyyazA4aoAB4FsBSA/bFjuF1EOL7VbrIrBuusmrt4ZZORfb6ehbWdnRHEIiITaEUKa5EJqUakRSaEYBJSCY2dEstQY7AuxahwXFrvZmWl2rh4JZ07z9dLtesfNj5q0FU3A5ObbwAAAABJRU5ErkJggg==);background-position:bottom;background-repeat:repeat-x;bottom:0;height:49px;padding-top:93px;pointer-events:none;position:absolute;width:100%;z-index:2}body.animation-level-2 .default__gradient-bottom{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__controls,.default.show-controls .default__gradient-bottom{transform:translateZ(0)}.default.is-playing:not(.show-controls){cursor:none}.default.is-playing .default__button--big,.default.is-seeking .default__button--big,.default:not(.played) .default__button--big{opacity:0}.default.is-playing .toggle:not(.default__button--big):before,.default.is-seeking .toggle:not(.default__button--big):before,.default:not(.played) .toggle:not(.default__button--big):before{content:"๎ฆ…"}.default .is-seeking+.default__button--big{opacity:0}.default .player-volume{--icon-size:2.25rem;--icon-margin-right:.5rem;--selector-size:50px;--selector-thumb-size:.75rem;--hide-width:var(--icon-size);--show-width:calc(var(--icon-size) + var(--icon-margin-right) + var(--selector-size) + var(--selector-thumb-size)*0.75);align-items:center;display:flex;overflow:hidden;width:var(--hide-width)}body.animation-level-2 .default .player-volume{transition:width var(--layer-transition)}html.is-touch .default .player-volume{display:none}html:not(.is-touch) .default .player-volume+.time{margin-left:.5rem}html.no-touch .default .player-volume:active,html.no-touch .default .player-volume:hover{width:var(--show-width)}.default .player-volume__icon{color:#fff;cursor:pointer;display:flex;font-size:1.5rem;height:var(--icon-size);margin-right:var(--icon-margin-right);padding:.375rem;width:var(--icon-size)}.default .player-volume .progress-line{--color:#fff;--thumb-size:var(--selector-thumb-size);--height:4px;margin:0;min-width:var(--selector-size);width:var(--selector-size)}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);cursor:pointer;height:var(--height);position:relative}.progress-line:before{border-radius:inherit;bottom:0;content:" ";display:block;left:0;position:absolute;right:0;top:0}.progress-line__seek{-webkit-appearance:none;-moz-appearance:none;background:transparent;bottom:-.5rem;caret-color:var(--color);cursor:pointer;margin:0;outline:none;padding:0;position:absolute;top:-.5rem;width:100%}.progress-line__seek:focus{outline:none}.progress-line__seek::-webkit-slider-thumb{display:none}.progress-line__seek::-moz-range-thumb{display:none;height:0;width: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{background-color:var(--color);border-radius:50%;content:" ";cursor:pointer;display:block;height:var(--thumb-size);position:absolute;right:0;top:calc((var(--thumb-size) - var(--height))/-2);transform:translateX(calc(var(--thumb-size)/2)) scale(1);width:var(--thumb-size)}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:translateX(calc(var(--thumb-size)/2)) scale(1.125)}.progress-line:before,.progress-line__loaded{background-color:var(--secondary-color);opacity:.3}.progress-line__filled,.progress-line__loaded{border-radius:var(--border-radius);bottom:0;position:absolute;top:0}body.animation-level-2 .progress-line.with-transition .progress-line__filled{transition:width .2s}.progress-line.use-transform .progress-line__filled{transform-origin:left center;width:100%}input[type=range]::-ms-track{visibility:hidden}input[type=range]::-ms-ticks{background:none;border:none;color:none}input[type=range]::-ms-thumb,input[type=range]::-ms-tooltip{visibility:hidden}.bottom-controls,.left-controls,.right-controls{align-items:center;display:flex}.bottom-controls{height:2.25rem;justify-content:space-between;padding:0 .625rem}@media only screen and (max-width:600px){.bottom-controls{height:3.625rem}}[dir=ltr] .checkbox-field{text-align:left}[dir=rtl] .checkbox-field{text-align:right}.checkbox-field{--size:1.25rem;--offset-left:0px;cursor:pointer;display:block;margin:1.5rem 1.1875rem;min-height:var(--size);min-width:var(--size);position:relative}body.animation-level-2 .checkbox-field{transition:opacity .2s}.checkbox-field.checkbox-disabled{opacity:var(--disabled-opacity);pointer-events:none!important}@media only screen and (max-width:600px){.checkbox-field{margin-bottom:27px}}[dir=ltr] .checkbox-field .checkbox-box{left:var(--offset-left)}[dir=rtl] .checkbox-field .checkbox-box{right:var(--offset-left)}.checkbox-field .checkbox-box{border-radius:.3125rem;height:var(--size);overflow:hidden;position:absolute;top:50%;transform:translateY(-50%);width:var(--size)}html.is-safari .checkbox-field .checkbox-box{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.checkbox-field .checkbox-box-background,.checkbox-field .checkbox-box-border,.checkbox-field .checkbox-box-check{left:0;position:absolute;top:0}.checkbox-field .checkbox-box-border{border:2px solid #8d969c;border-radius:inherit;bottom:0;left:0;right:0}.checkbox-field .checkbox-box-background{background-color:var(--primary-color);border-radius:50%;bottom:-15%;left:-15%;right:-15%;top:-15%;transform:scale(1);transition:transform .2s ease-in-out 0s}body.animation-level-0 .checkbox-field .checkbox-box-background{transition:none!important}.checkbox-field .checkbox-box-check{--offset:7px;height:calc(var(--size) - var(--offset));left:50%;top:50%;transform:translate(-50%,-50%);width:calc(var(--size) - var(--offset))}.checkbox-field .checkbox-box-check use{stroke:#fff;stroke-width:3.75;stroke-linecap:round;stroke-dasharray:24.19,24.19;stroke-dashoffset:0;transition:stroke-dasharray .1s ease-in-out .15s,visibility 0s .15s;visibility:visible}body.animation-level-0 .checkbox-field .checkbox-box-check use{transition:none!important}[dir=ltr] .checkbox-field .checkbox-caption{padding-left:3.375rem}[dir=rtl] .checkbox-field .checkbox-caption{padding-right:3.375rem}.checkbox-field .checkbox-caption{color:inherit;line-height:var(--line-height);pointer-events:none;position:relative;transition:opacity .2s}body.animation-level-0 .checkbox-field .checkbox-caption{transition:none}.checkbox-field.hover-effect{align-items:center;display:flex;height:3.5rem;margin-left:0;margin-right:0;padding:0 1.1875rem}[dir=ltr] .checkbox-field.hover-effect .checkbox-box{left:auto}[dir=rtl] .checkbox-field.hover-effect .checkbox-box{right:auto}.checkbox-field .anchor-url{pointer-events:all}.checkbox-ripple{border-radius:10px;overflow:hidden}.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{bottom:0;left:0;right:0;top:0}.checkbox-field-round .checkbox-box-border{border:2px solid var(--secondary-color);z-index:1}.checkbox-field-round .checkbox-box-check{--offset:calc(var(--size) - var(--size)/2 - 0.125rem)}html.is-safari .checkbox-field-round .checkbox-box{-webkit-mask-image:none}[dir=ltr] .radio-field{text-align:left}[dir=rtl] .radio-field{text-align:right}.radio-field{--size:1.375rem;--offset-left:0px;cursor:pointer;line-height:var(--line-height);margin:1.25rem 0;position:relative}.radio-field.hidden-widget{cursor:default}.radio-field.hidden-widget .radio-field-main:after,.radio-field.hidden-widget .radio-field-main:before{visibility:hidden}.radio-field>input:checked~.radio-field-main:before{border-color:var(--primary-color)}.radio-field>input:checked~.radio-field-main:after{transform:translateY(-50%) scale(1)}[dir=ltr] .radio-field .radio-field-main{padding-left:3.5rem}[dir=rtl] .radio-field .radio-field-main{padding-right:3.5rem}.radio-field .radio-field-main{color:inherit;position:relative}[dir=ltr] .radio-field .radio-field-main:after,[dir=ltr] .radio-field .radio-field-main:before{left:var(--offset-left)}[dir=rtl] .radio-field .radio-field-main:after,[dir=rtl] .radio-field .radio-field-main:before{right:var(--offset-left)}.radio-field .radio-field-main:after,.radio-field .radio-field-main:before{content:"";display:block;height:var(--size);position:absolute;top:50%;transform:translateY(-50%);width:var(--size)}.radio-field .radio-field-main:before{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}[dir=ltr] .radio-field .radio-field-main:after{left:calc(var(--offset-left) + .3125rem)}[dir=rtl] .radio-field .radio-field-main:after{right:calc(var(--offset-left) + .3125rem)}.radio-field .radio-field-main:after{background:var(--primary-color);border-radius:50%;height:.75rem;transform:translateY(-50%) scale(0);transform-origin:center;width:.75rem}body.animation-level-2 .radio-field .radio-field-main:after{transition:transform .1s ease}[dir=ltr] .radio-field.radio-field-right .radio-field-main:before{left:auto;right:0}[dir=rtl] .radio-field.radio-field-right .radio-field-main:before{left:0;right:auto}[dir=ltr] .radio-field.radio-field-right .radio-field-main:after{left:auto;right:.3125rem}[dir=rtl] .radio-field.radio-field-right .radio-field-main:after{left:.3125rem;right:auto}[type=checkbox],[type=radio]{box-sizing:border-box;opacity:0;padding:0;position:absolute;z-index:var(--z-below)}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dasharray:0,24.19;transition:stroke-dasharray .1s ease-in-out,visibility 0s .1s;visibility:hidden}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-background{transform:scale(0);transition:transform .2s ease-in-out .05s}.checkbox-field .checkbox-field-input:disabled+.checkbox-box,.checkbox-field .checkbox-field-input:disabled~.checkbox-caption{cursor:default;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{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;visibility:visible!important}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dashoffset:35.5;transform:rotate(45deg) translateY(-10px)}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-background{background-color:var(--danger-color)}.checkbox-field-toggle{--size:20px;align-items:center;display:flex;margin:0 .3125rem;padding:0 .25rem;pointer-events:none}.checkbox-field-toggle .checkbox-toggle{--offset:3px;--toggle-width:1.9375rem;align-items:center;background-color:var(--secondary-color);border-radius:12px;display:flex;height:.875rem;margin:0 var(--offset);position:relative;width:var(--toggle-width)}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle{transition:background-color .1s}.checkbox-field-toggle .checkbox-toggle:before{background-color:var(--surface-color);border:2px solid var(--secondary-color);border-radius:50%;content:" ";height:1.25rem;position:absolute;transform:translateX(calc(var(--offset)*-1));width:1.25rem}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle:before{transition:border-color .1s,transform .1s cubic-bezier(.22,.75,.7,1.44)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle{background-color:var(--primary-color)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle:before{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{margin-bottom:17px;padding:1rem 0 .5rem;width:100%}@media only screen and (max-width:600px){.chatlist-container .search-group{margin-bottom:0}}.chatlist-container .search-group__name{color:var(--secondary-text-color);font-weight:var(--font-weight-bold);padding:0 23px 1rem;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (max-width:600px){.chatlist-container .search-group__name{font-size:15px;padding:5px 9px 0 16px}}.chatlist-container .search-group-contacts{border-bottom:1px solid var(--border-color)}@media only screen and (max-width:600px){.chatlist-container .search-group-contacts{padding:0 0 2px}}.chatlist-container .search-group-people.search-group-contacts{padding:5px 0!important}.chatlist-container .search-group:last-child{border-bottom:none}.chatlist-container .search-super .search-group{margin-bottom:0;padding:0 0 .5rem}.chatlist-container .search-super .search-group__name{display:flex;justify-content:space-between;padding-top:1rem}ul.chatlist{padding:0 .5rem}@media only screen and (max-width:600px){ul.chatlist{padding:0}}.chatlist{-webkit-touch-callout:none;background-color:var(--surface-color);display:flex;flex-direction:column;margin:0;position:relative;-moz-user-select:none;user-select:none;-webkit-user-select:none;width:100%}.chatlist-chat{--background:unset;-webkit-user-drag:none;background:var(--background)!important}.chatlist-chat.is-forum-open,.chatlist-chat.menu-open,html.no-touch .chatlist-chat:active,html.no-touch .chatlist-chat:hover{--background:var(--light-filled-secondary-text-color)}[dir=ltr] .chatlist-chat.is-muted .user-title:after{margin-left:.125rem}[dir=rtl] .chatlist-chat.is-muted .user-title:after{margin-right:.125rem}.chatlist-chat.is-muted .user-title:after{color:var(--chatlist-pinned-color);content:"๎ฆƒ";flex:0 0 auto;font-size:1.125rem}body:not(.animation-level-0) .chatlist-chat.is-muted.animating:not(.backwards) .user-title:after{animation:fade-in-opacity .2s ease-in-out forwards}body:not(.animation-level-0) .chatlist-chat.is-muted.animating.backwards .user-title:after{animation:fade-in-backwards-opacity .2s ease-in-out forwards}.chatlist-chat i{font-style:normal}.chatlist-chat .text-highlight{color:var(--primary-text-color)}.chatlist-chat .premium-icon{margin-top:-.125rem}.chatlist-chat .topic-icon{flex:0 0 auto}[dir=ltr] .chatlist-chat .row-title .topic-icon{margin-right:.25rem}[dir=rtl] .chatlist-chat .row-title .topic-icon{margin-left:.25rem}.chatlist-chat .row-title .topic-icon{--size:1.375rem}.chatlist-chat .topic-name .topic-icon{display:inline;line-height:1!important}.chatlist-chat .topic-name .topic-icon-svg{position:relative}.chatlist-chat .topic-name .topic-icon-content{left:0;margin-top:-6px;position:absolute;right:0;top:0}@media only screen and (min-width:601px){.chatlist-chat.active{--background:var(--primary-color)!important}.chatlist-chat.active .message-status,.chatlist-chat.active .premium-icon,.chatlist-chat.active .row-subtitle,.chatlist-chat.active .row-title,.chatlist-chat.active .sending-status-icon,.chatlist-chat.active .text-highlight,.chatlist-chat.active .tgico-chatspinned:before,.chatlist-chat.active .user-title,.chatlist-chat.active .verified-icon{color:#fff!important}.chatlist-chat.active .badge-fake{border-color:#fff;color:#fff}.chatlist-chat.active .danger,.chatlist-chat.active .primary-text{color:#fff!important}.chatlist-chat.active .user-title:after{color:hsla(0,0%,100%,.7)}.chatlist-chat.active .verified-icon-background{fill:#fff!important}.chatlist-chat.active .verified-icon-check{visibility:hidden}.chatlist-chat.active .dialog-avatar.is-online:after,.chatlist-chat.active .dialog-group-call-icon{background-color:#fff;border-color:var(--primary-color)}.chatlist-chat.active .badge.unread,.chatlist-chat.active .mention{background-color:#fff!important;color:var(--primary-color)}.chatlist-chat.active .peer-typing-container{--color:#fff}}.chatlist .peer-typing-container{--color:var(--secondary-text-color)}.chatlist .peer-typing-container .peer-typing-text{display:inline-flex;transform:translateY(-2px)}.chatlist .sending-status-icon.tgico-premium_lock{color:var(--secondary-color);font-size:.8125rem;margin:.1875rem 0 0 .5rem}[dir=ltr] .chatlist .dialog-title-details{margin-left:.5rem}[dir=rtl] .chatlist .dialog-title-details{margin-right:.5rem}.chatlist .dialog-title-details{flex:0 0 auto;font-size:.75rem;padding:1px 0 0}[dir=ltr] .chatlist .dialog-subtitle-badge{margin-left:.5rem}[dir=rtl] .chatlist .dialog-subtitle-badge{margin-right:.5rem}.chatlist .dialog-subtitle-badge{display:block!important;flex:0 0 auto}.chatlist .dialog-subtitle-badge.avatar-badge{--size:1.625rem;border:2px solid var(--background,var(--surface-color));line-height:23px!important;margin:0;pointer-events:none;position:absolute;right:calc(100% - 4.0625rem);top:2.4375rem}[dir=ltr] .chatlist .dialog-subtitle-media{margin-right:.375rem}[dir=rtl] .chatlist .dialog-subtitle-media{margin-left:.375rem}.chatlist .dialog-subtitle-media{border-radius:.25rem;display:inline-block;flex:0 0 auto;height:1.25rem;line-height:1.25rem;position:relative;width:1.25rem}.chatlist .dialog-subtitle-media:before{content:"ย ";display:inline-block;height:inherit;min-height:inherit;min-width:inherit;width:inherit}.chatlist .dialog-subtitle-media.is-round{border-radius:50%}.chatlist .dialog-subtitle-media.is-round .tgico-play{font-size:.875rem}.chatlist .dialog-subtitle-media .tgico-play{color:#fff;font-size:1rem;left:50%;line-height:1;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:1}.chatlist .dialog-subtitle-media .media-photo{border-radius:inherit;bottom:auto;height:inherit;-o-object-fit:cover;object-fit:cover;top:auto;width:inherit}.chatlist .dialog-group-call-icon{background-color:var(--avatar-online-color);border:2px solid var(--surface-color);border-radius:50%;height:20px;left:45px;overflow:hidden;position:absolute;top:45px;width:20px;z-index:2}body.animation-level-2 .chatlist .dialog-group-call-icon,body.animation-level-2 .chatlist .dialog-subtitle-badge{opacity:1;transform:scale(0);transition:none}body.animation-level-2 .chatlist .dialog-group-call-icon.is-visible:not(.backwards),body.animation-level-2 .chatlist .dialog-subtitle-badge.is-visible:not(.backwards){transform:scale(1)}body.animation-level-2 .chatlist .dialog-group-call-icon.backwards,body.animation-level-2 .chatlist .dialog-subtitle-badge.backwards{opacity:0}body.animation-level-2 .chatlist .dialog-group-call-icon.animating,body.animation-level-2 .chatlist .dialog-subtitle-badge.animating{transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-group-call-icon.animating.backwards,body.animation-level-2 .chatlist .dialog-subtitle-badge.animating.backwards{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{opacity:1;transform:scale(0);transition:none}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 var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-avatar.animating.backwards:after{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 .dialog-avatar,.chatlist .row-row{pointer-events:none;position:relative}.chatlist .user-title{align-items:center;display:flex!important}.chatlist .user-title img.emoji{height:18px;margin-top:1px;vertical-align:top;width:18px}.chatlist .user-last-message img.emoji{height:20px;margin-top:-3px;width:20px}.chatlist .user-last-message,.chatlist .user-title{flex-grow:1;position:relative}[dir=ltr] .chatlist .message-status{margin-right:.125rem}[dir=rtl] .chatlist .message-status{margin-left:.125rem}.chatlist .message-status{color:var(--chatlist-status-color);display:inline-block;font-size:1.25rem;height:1.25rem;line-height:1;margin-top:-.0625rem;position:relative;vertical-align:middle;width:1.25rem}.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:var(--chatlist-pinned-color);opacity:1}.chatlist .tgico-chatspinned.unread:before{opacity:0}.chatlist .tgico-chatspinned{position:relative}.chatlist .tgico-chatspinned:before{left:0;position:absolute;top:0}.chatlist .mention{background-color:var(--chatlist-status-color)!important;line-height:1.25rem!important;padding:0}[dir=ltr] .chatlist .mention-badge{margin-right:-.125rem}[dir=rtl] .chatlist .mention-badge{margin-left:-.125rem}.chatlist .is-muted.backwards .unread,.chatlist .unread{background-color:var(--chatlist-status-color)}.chatlist .is-muted .unread,.chatlist .no-unmuted-topic .unread{background-color:var(--secondary-color)}.chatlist .not-visited{--size:.5rem;--padding:0;background-color:var(--secondary-color)!important}.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{margin-bottom:0!important;padding-bottom:0}.chatlist-bottom .chatlist-new{padding:0}.chat-input{--translateY:0;--padding-bottom:0.5rem;--bottom:var(--padding-bottom);display:flex;flex:0 0 auto;flex-direction:column;max-width:100%;padding-top:.25rem;position:relative;transform:translate3d(0,var(--translateY),0);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .chat-input{transition:none!important}@media only screen and (min-height:570px)and (min-width:601px){.chat-input{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{transform:translate3d(calc(var(--right-column-width)/-2),var(--translateY),0)!important;transition:transform var(--transition-standard-in)}}.chat-input.is-hidden{--translateY:100%;bottom:0;position:absolute!important;transform:translate3d(0,var(--translateY),0)!important;transition:transform var(--transition-standard-in)}.bubbles.is-selecting:not(.backwards)~.chat-input.is-hidden{--translateY:0}.chat-input-container{--padding-horizontal:var(--chat-input-padding);align-items:flex-end;display:flex;flex:0 0 auto;justify-content:center;margin:0 auto;max-width:var(--messages-container-width);padding:0 var(--padding-horizontal);padding-bottom:var(--bottom);position:relative;width:100%}.chat-input-container .btn-circle{height:var(--chat-input-size);width: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{border-bottom-right-radius:12px;max-height:var(--chat-input-size)}.chat-input-container.is-centering:not(.backwards) .rows-wrapper .bubble-tail{opacity:0;transform:scaleX(-1) translateX(1.125rem)}.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 .1s}.chat-input-container.is-centering.animating .rows-wrapper .bubble-tail{transition:transform .1s,opacity 25ms 0s}.chat-input-container.is-centering.animating .selection-wrapper{transition:opacity .1s 75ms}.chat-input-container.is-centering.animating .btn-send{transition:transform .2s}.chat-input-container.is-centering.animating:not(.backwards) .rows-wrapper .bubble-tail{transition:transform .1s,opacity 25ms 75ms}.chat-input .menu-send{bottom:calc(100% + .5rem);top:auto}.chat-input .toggle-emoticons:before{content:"๎ฆด"}.chat-input .toggle-emoticons.flip-icon:before{content:"๎ฅ™"!important}[dir=ltr] .chat-input .btn-record-cancel{right:0}[dir=rtl] .chat-input .btn-record-cancel{left:0}.chat-input .btn-record-cancel{--multiplier:-1;opacity:0;padding:0;position:absolute;top:0;transform:translateX(calc((100% + var(--padding-horizontal) + .5rem)*var(--multiplier)));visibility:hidden;z-index:3}.chat-input .btn-record-cancel .c-ripple__circle,html.no-touch .chat-input .btn-record-cancel:active:after,html.no-touch .chat-input .btn-record-cancel:hover:after{background-color:var(--light-danger-color)}.chat-input .btn-record-cancel:before{color:var(--danger-color)}.is-rtl .chat-input .btn-record-cancel{--multiplier:1}[dir=ltr] .chat-input .btn-scheduled:after{right:5px}[dir=rtl] .chat-input .btn-scheduled:after{left:5px}.chat-input .btn-scheduled:after{background:var(--message-checkbox-color);border-radius:50%;content:"";height:.5rem;position:absolute;top:5px;width:.5rem}.chat-input .btn-preloader .preloader{height:1.5rem;width:1.5rem}.chat-input .btn-preloader .preloader .preloader-path{stroke:var(--secondary-text-color)}body.animation-level-2 .chat-input .btn-preloader.show.backwards{animation:hide-icon .4s ease-in-out forwards!important}[dir=ltr] .chat-input .float{margin-right:.75rem!important}[dir=rtl] .chat-input .float{margin-left:.75rem!important}.chat-input .float{align-self:center;display:none!important;margin:0!important}body.animation-level-2 .chat-input .float{animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-height:569px),only screen and (max-width:600px){[dir=ltr] .chat-input .float{margin-right:.125rem!important}[dir=rtl] .chat-input .float{margin-left:.125rem!important}}.chat-input:not(.is-recording) .float.show:not(.hide){display:flex!important}[dir=ltr] .chat-input .btn-send-container{right:var(--padding-horizontal)}[dir=rtl] .chat-input .btn-send-container{left:var(--padding-horizontal)}.chat-input .btn-send-container{align-items:center;bottom:0;display:flex;justify-content:center;padding-bottom:inherit;position:absolute}.chat-input .btn-send-container .btn-menu-overlay{z-index:3}.chat-input .btn-icon{transition:opacity .2s}body.animation-level-0 .chat-input .btn-icon{transition:none}.chat-input .btn-cancel-record,.chat-input .btn-send{box-shadow:0 1px 8px 1px rgba(0,0,0,.12)}.chat-input .btn-send{background-color:var(--primary-color)!important;color:#fff!important;z-index:3}html.no-touch .chat-input .btn-send:active,html.no-touch .chat-input .btn-send:hover{background-color:var(--dark-primary-color)!important}.chat-input .btn-send .tgico-check{font-size:2rem;height:32px!important}.chat-input .btn-send .tgico-check:before{font-weight:var(--font-weight-bold)}.chat-input .btn-send.edit .tgico-check,.chat-input .btn-send.record .tgico-microphone_filled,.chat-input .btn-send.schedule .tgico-schedule,.chat-input .btn-send.send .tgico-send{visibility:visible!important}body.animation-level-2 .chat-input .btn-send.edit .tgico-check,body.animation-level-2 .chat-input .btn-send.record .tgico-microphone_filled,body.animation-level-2 .chat-input .btn-send.schedule .tgico-schedule,body.animation-level-2 .chat-input .btn-send.send .tgico-send{animation:grow-icon .4s ease-in-out forwards!important}.chat-input .btn-record-cancel,.chat-input .btn-send{font-size:1.5rem;line-height:1.5rem}.chat-input .record-time{display:none;height:44px;line-height:44px}.chat-input .record-time:after{background-color:var(--danger-color);border-radius:50%;content:" ";display:inline-block;height:10px;margin-left:9px;margin-right:9px;width:10px}body.animation-level-2 .chat-input .record-time:after{animation:recordBlink 1.25s infinite}.chat-input .record-ripple{background-color:var(--message-highlightning-color);border-radius:50%;height:300px;opacity:.5;position:absolute;transform:scale(0);visibility:hidden;width:300px}@media only screen and (max-width:600px){.chat-input .record-ripple{height:240px;width: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-record-cancel,.chat-input.is-recording:not(.backwards) .btn-send{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 .1s,opacity .1s 0s}.chat-input.is-recording.animating .record-ripple{transition:transform .03s ease-in-out,visibility .1s}.chat-input.is-recording.animating .rows-wrapper{transition:width .2s}.chat-input.is-recording.animating:not(.backwards) .btn-record-cancel{transition:visibility 0s .1s,opacity .1s .1s}.chat-input.is-recording.animating:not(.backwards) .record-ripple{transition:transform .03s,visibility 0s}[dir=ltr] .chat-input:not(.is-recording) .btn-record-cancel{margin-right:0}[dir=rtl] .chat-input:not(.is-recording) .btn-record-cancel{margin-left:0}.chat-input:not(.is-recording) .btn-record-cancel{width:0}.chat-input .new-message-wrapper{opacity:1}.chat-input .reply-in-topic-overlay{align-items:center;background-color:inherit;border-radius:inherit;color:var(--secondary-text-color);display:flex;justify-content:center;padding:0 1rem;pointer-events:none;z-index:3}.bubbles.is-selecting:not(.backwards)~.chat-input .selection-wrapper{opacity:1}.bubbles.is-selecting.animating~.chat-input .new-message-wrapper{transition:opacity .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 .1s .1s}.bubbles.is-selecting.animating.backwards~.chat-input .selection-wrapper{transition:opacity .1s 0s}@keyframes recordBlink{0%{opacity:1}50%{opacity:.2}to{opacity:1}}#column-center{flex:3;position:relative;width:100%}@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{filter:brightness(80%);transform:translate3d(-25vw,0,0)}}@media only screen and (min-width:601px)and (max-width:925px){#column-center{bottom:0;left:0;position:fixed!important;right:0;top:0;transform:translateZ(0)}body.animation-level-2 #column-center{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:before{transform:rotate(180deg)}}.chats-container{height:100%}.chat{align-items:center;display:flex!important;flex-direction:column;transition:transform var(--tabs-transition),filter var(--tabs-transition);width:100%}body.animation-level-0 .chat{transition:none!important}.chat:not(.active):not(:last-child){filter:brightness(.8)}@media only screen and (min-width:926px){.chat:not(.active){transform:translate3d(calc((100vw - min(40vw, 420px))*-.25),0,0)}.chat:not(.active):last-child{transform:translate3d(calc(100vw - min(40vw, 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;user-select:none!important}.chat-background{background-color:#e6ebee;overflow:hidden}html.night .chat-background{background-color:var(--border-color)}.chat-background.no-transition:before{transition:none!important}.chat-background,.chat-background-item{bottom:0;left:0;position:absolute!important;right:0;top:0}.chat-background-item.is-image{background-color:inherit;background-image:url(assets/img/bg.jpeg);background-position:50%;background-size:cover}.chat-background-item.is-pattern{align-items:center;background-color:#000!important;background-image:none!important;background-repeat:repeat-x;background-size:contain;display:flex;justify-content:center;margin:0!important}@media only screen and (min-width:1276px){.chat-background-item.is-pattern{height:150%;top:-25%}}body.animation-level-2 .chat-background-item{opacity:0;transition:opacity var(--transition-standard-out)}body.animation-level-2 .chat-background-item.is-visible:not(.backwards){opacity:1;transition:opacity var(--transition-standard-in)}@media only screen and (min-width:1276px){body.animation-level-2 .chat-background-item{margin:-18.5rem 0 -22rem;transform:scale(1);transform-origin:left center;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(.666666667);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)!important}}.chat-background-item-canvas{--opacity-max:1;opacity:var(--opacity-max);position:absolute;width:100%}.chat-background-item:not(.is-dark) .chat-background-item-pattern-canvas{mix-blend-mode:soft-light}.chat-background-item-color-canvas{height:100%;-webkit-mask-position:center;mask-position:center;-webkit-mask-size:cover;mask-size:cover}.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){[dir=ltr] body.is-right-column-shown .chat .drops-container{right:calc(var(--right-column-width))}[dir=rtl] body.is-right-column-shown .chat .drops-container{left:calc(var(--right-column-width))}}@media only screen and (max-width:600px){.chat .drops-container{--padding:10px}}.chat .drop{--wrapper-padding:15px;max-width:696px}.chat[data-type=chat] .bubbles.is-chat-input-hidden .bubbles-date-group:last-of-type .bubbles-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);--button-size:2.125rem;--button-horizontal-margin:.125rem;align-items:center;border-radius:1rem;display:flex;flex:0 0 auto;flex-direction:column;justify-content:center;max-height:30rem;max-width:calc(100% - var(--chat-input-size) - .5rem);min-height:var(--chat-input-size);position:relative;width:calc(100% - var(--chat-input-size) - .5rem);z-index:3}.chat-input-wrapper:before{background-color:#fff;border-radius:inherit;bottom:0;box-shadow:0 1px 8px 1px rgba(0,0,0,.12);content:" ";left:0;opacity:1;right:0;top:0}.chat-input-control,.chat-input-wrapper:before{background-color:var(--surface-color);position:absolute}.chat-input-control{--padding-vertical:.3125rem;--padding-horizontal:var(--chat-input-inner-padding);--padding:var(--padding-vertical) var(--padding-horizontal);height:var(--chat-input-size);margin:0 auto;padding:var(--padding);visibility:hidden;width:auto;z-index:3}.chat-input-control:before{opacity:0}.chat-input-control-button{height:2.5rem;justify-content:center;padding:0 .625rem}@media only screen and (max-width:600px){.chat-input-control-button{font-size:15px}}[dir=ltr] .chat-input-control-button:before{margin-right:10px}[dir=rtl] .chat-input-control-button:before{margin-left:10px}.fake-selection-wrapper,.selection-wrapper{max-width:calc(100% - var(--chat-input-padding)*2);position:absolute;top:0;width:28.75rem}.chat-input-control,.selection-wrapper{opacity:0}.selection-wrapper{background-color:var(--surface-color)}.selection-wrapper:before{content:none}.selection-wrapper .selection-container{align-items:center;border-radius:inherit;display:flex;font-size:15px;height:100%;justify-content:space-between;padding:inherit;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.selection-wrapper .selection-container-left,.selection-wrapper .selection-container-right{align-items:center;display:flex;justify-content:space-between;transform:translateX(0)}.selection-wrapper .selection-container-right{flex:0 0 auto}.selection-wrapper .selection-container-count{color:var(--primary-text-color);flex-grow:1;font-weight:var(--font-weight-bold);text-transform:capitalize;white-space:nowrap}[dir=ltr] .selection-wrapper .selection-container .btn-icon{margin-left:6px;margin-right:5px}[dir=rtl] .selection-wrapper .selection-container .btn-icon{margin-left:5px;margin-right:6px}.selection-wrapper .selection-container .btn-icon{height:42px;line-height:42px;width: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}}[dir=ltr] .selection-wrapper .selection-container-forward:before{margin-right:14px}[dir=rtl] .selection-wrapper .selection-container-forward:before{margin-left:14px}[dir=ltr] .selection-wrapper .selection-container-delete{margin-left:.375rem;margin-right:.625rem}[dir=rtl] .selection-wrapper .selection-container-delete{margin-left:.625rem;margin-right:.375rem}[dir=ltr] .selection-wrapper .selection-container-delete:before{margin-right:10px}[dir=rtl] .selection-wrapper .selection-container-delete:before{margin-left:10px}.fake-wrapper{position:absolute;visibility:hidden;z-index:-1}[dir=ltr] .fake-rows-wrapper{left:var(--padding-horizontal)}[dir=rtl] .fake-rows-wrapper{right:var(--padding-horizontal)}.fake-rows-wrapper{top:0;width:calc(100% - var(--chat-input-size) - var(--padding-horizontal)*2 - .5rem)}.rows-wrapper-wrapper{display:flex;width:100%}.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 .15s}.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control{transition:opacity .1s 75ms,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 .1s 0s,visibility 0s .2s}[dir=ltr] .rows-wrapper{border-bottom-right-radius:0}[dir=rtl] .rows-wrapper{border-bottom-left-radius:0}.rows-wrapper{transform:translateX(0) scaleX(1)}.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}}[dir=ltr] .rows-wrapper .bubble-tail{right:-8.4px}[dir=rtl] .rows-wrapper .bubble-tail{left:-8.4px}.rows-wrapper .bubble-tail{fill:var(--surface-color);bottom:-1px;height:20px;position:absolute;transform:scaleX(-1);width:11px}.is-rtl .rows-wrapper .bubble-tail{transform:scaleX(1)}.rows-wrapper .attach-file.menu-open{background-color:var(--light-primary-color)!important;color:var(--primary-color)}.rows-wrapper .attach-file.btn-disabled{opacity:var(--disabled-opacity)}.rows-wrapper>div{align-items:center;background-color:var(--surface-color);border-radius:1rem;display:flex;justify-content:space-between;padding:var(--padding);position:relative;width:100%}.rows-wrapper .reply-wrapper{align-items:center;height:0;justify-content:flex-start;margin-bottom:-.5625rem;opacity:0;padding:.5625rem var(--padding-horizontal) 0;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:2}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-bottom:-.3125rem;padding-top:.3125rem}}.chat.is-helper-active .rows-wrapper .reply-wrapper{height:45px;opacity:1;pointer-events:inherit}.rows-wrapper .reply-wrapper .reply{flex:1 1 auto;margin-left:.625rem;margin-right:.625rem;order:1}.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:var(--secondary-text-color)!important;height:1.125rem}.rows-wrapper .reply-wrapper .reply .peer-title{font-weight:400}[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu{left:3.125rem}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu{right:3.125rem}.rows-wrapper .reply-wrapper .btn-menu{bottom:calc(100% + .5rem);top:auto;transform:scale(1)!important}[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu-item{padding-right:1.5rem}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu-item{padding-left:1.5rem}.rows-wrapper .reply-wrapper .btn-menu-item-text{order:1}[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{margin-right:var(--icon-margin)}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{margin-left:var(--icon-margin)}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{--size:1.25rem;margin:0;order:0}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-background,.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-border{display:none}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-check use{stroke:var(--primary-text-color)}@media only screen and (max-width:600px){[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu{left:calc(var(--padding-horizontal)*-1)}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu{right:calc(var(--padding-horizontal)*-1)}}.rows-wrapper .input-message-input{margin-top:-1px;max-height:27.5rem!important}@media only screen and (max-height:30rem){.rows-wrapper .input-message-input{max-height:max(36px,calc(100vh - 10rem))}}@media only screen and (max-width:600px){.rows-wrapper .input-message-input{max-height:10rem}}.rows-wrapper .input-message-input[data-inline-placeholder]:after{color:#a2acb4;content:attr(data-inline-placeholder);pointer-events:none}.rows-wrapper .new-message-wrapper{--send-as-size:1.875rem;--send-as-margin-left:.25rem;--send-as-margin-right:.375rem;--send-as-total-size:calc(var(--send-as-size) + var(--send-as-margin-left) + var(--send-as-margin-right));--commands-size:2.375rem;--commands-margin-left:.25rem;--commands-margin-right:.375rem;--commands-total-size:calc(var(--commands-size) + var(--commands-margin-left) + var(--commands-margin-right));--offset-translateX:0px;align-items:flex-end;min-height:var(--chat-input-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands,.rows-wrapper .new-message-wrapper .new-message-send-as-container{bottom:calc(var(--padding-vertical) + .4375rem);cursor:pointer;flex:0 0 auto;opacity:0;position:absolute;transform:scale(0);z-index:2}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-bot-commands{margin-left:var(--commands-margin-left)}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-bot-commands{margin-right:var(--commands-margin-left)}.rows-wrapper .new-message-wrapper .new-message-bot-commands{align-items:center;background-color:var(--primary-color);border-radius:1.875rem;cursor:pointer;display:flex;height:1.875rem;justify-content:center;width:var(--commands-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{position:relative}.rows-wrapper .new-message-wrapper .new-message-bot-commands-icon-scale{align-items:center;display:flex;justify-content:center;transform:scale(.875)}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{--color:#fff}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container{margin-left:var(--send-as-margin-left)}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container{margin-right:var(--send-as-margin-left)}.rows-wrapper .new-message-wrapper .new-message-send-as-container{background:none!important;height:var(--send-as-size);width:var(--send-as-size)}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{right:auto}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{left:auto}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{left:calc(var(--padding-horizontal)*-1 - .25rem)!important}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{right:calc(var(--padding-horizontal)*-1 - .25rem)!important}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{height:auto;max-height:20rem;max-width:20rem;top:auto;transform:scaleX(1);width:auto}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item{height:2.25rem}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-header{height:1.875rem}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon{margin-right:calc(var(--icon-margin) - .5rem)}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon{margin-left:calc(var(--icon-margin) - .5rem)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon.active:before{--offset:-.125rem;border:.0625rem solid var(--primary-color);border-radius:inherit;bottom:var(--offset);content:" ";left:var(--offset);position:absolute;right:var(--offset);top:var(--offset)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-text{display:flex;flex-direction:column;justify-content:center;line-height:1!important;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-subtitle{font-size:.8125rem;font-weight:400}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar{opacity:0;pointer-events:none;position:absolute;transform:scale(0)}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible:not(.backwards){opacity:1;transform:scale(1)}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible.animating{transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .new-message-send-as-close{align-items:center;background-color:var(--primary-color);border-radius:50%;color:#fff;display:flex;font-size:1.375rem;height:inherit;justify-content:center;width:inherit;z-index:1}.rows-wrapper .new-message-wrapper.has-offset[data-offset=as]{--offset-translateX:var(--send-as-total-size)}.rows-wrapper .new-message-wrapper.has-offset[data-offset=commands]{--offset-translateX:48px}.rows-wrapper .new-message-wrapper.has-offset .input-message-container,.rows-wrapper .new-message-wrapper.has-offset .toggle-emoticons{transform:translateX(0)}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .toggle-emoticons{transform:translateX(var(--offset-translateX))}[dir=ltr] .rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{margin-right:var(--translateX)}[dir=rtl] .rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{margin-left:var(--translateX)}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{--translateX:calc(var(--offset-translateX));transform:translate(var(--translateX))}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-bot-commands,.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-send-as-container{opacity:1;transform:scale(1)}.rows-wrapper .new-message-wrapper.has-offset.animating .input-message-container,.rows-wrapper .new-message-wrapper.has-offset.animating .toggle-emoticons{transition:transform var(--transition-standard-in)}.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-bot-commands,.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-send-as-container{transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + 1.125rem)}@media only screen and (max-height:569px),only screen and (max-width:600px){.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + .875rem)}}.rows-wrapper .new-message-wrapper .btn-menu.top-left{right:calc(var(--padding-horizontal)*-1 - .125rem)}.rows-wrapper .new-message-wrapper .btn-menu.top-right{left:calc(var(--padding-horizontal)*-1 - .125rem)}.rows-wrapper .btn-icon{color:var(--secondary-text-color);flex:0 0 auto;font-size:1.5rem;height:var(--button-size);margin-bottom:5px;margin-left:var(--button-horizontal-margin);margin-right:var(--button-horizontal-margin);margin-top:0;padding:0;width:var(--button-size)}.rows-wrapper .btn-icon.active{color:var(--primary-color)}.input-message-container{align-items:center;align-self:center;display:flex;flex:1 1 auto;max-height:inherit;min-height:calc(var(--chat-input-size) - var(--padding-vertical)*2);overflow:hidden;position:relative;width:1%}.input-message-container .scrollable{position:relative}.input-message-input{--custom-emoji-size:var(--messages-custom-emoji-size);background:none;border:none;font-size:var(--messages-text-size);line-height:var(--line-height);outline:none;overflow-y:none;padding:.5rem .5625rem;resize:none;width:100%}.input-message-input pre{display:inline;margin:0}body.animation-level-2 .input-message-input{transition:height .1s}.bubbles{--translateY:0;flex:1 1 auto;position:relative;transform:translate3d(0,var(--translateY),0);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .bubbles{transition:none!important}.chat[data-type=chat] .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-78px;transition:transform var(--transition-standard-in)}@media only screen and (max-width:600px){.chat[data-type=chat] .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-58px}}.chat[data-type=chat] .bubbles.is-chat-input-hidden.is-selecting:not(.backwards) .bubbles-inner{transform:translateY(calc(var(--translateY)*-1));transition:transform var(--transition-standard-in)}.bubbles>.scrollable{display:block;height:auto}@media only screen and (min-width:1276px){body.is-right-column-shown .bubbles{transform:translate3d(calc(var(--right-column-width)/-2),var(--translateY),0);transition:transform var(--transition-standard-in)}}body.animation-level-2 .bubbles.is-selecting .bubbles-group-avatar,body.animation-level-2 .bubbles.is-selecting .is-in .bubble-content-wrapper{transition:var(--bubble-transition-out)}body.animation-level-2 .bubbles.is-selecting:not(.backwards) .bubbles-group-avatar,body.animation-level-2 .bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transition:var(--bubble-transition-in)}.bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transform:translateX(2.5rem) scale(1)}.bubbles.is-selecting:not(.backwards) .bubbles-group-avatar{transform:translate3d(2.5rem,0,0) scale3d(.76,.76,1)}.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 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 - 0.625rem)}.bubbles .search-group.search-group-messages{padding:.25rem 0 .5rem}.bubbles-inner{display:flex;flex-direction:column;justify-content:flex-end;margin:0 auto;max-width:var(--messages-container-width);min-height:100%;padding:0 .8125rem;transform:translateY(0);transition:transform var(--transition-standard-out);width:100%}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:after{content:" ";height:.125rem}[dir=ltr] .bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-left:45px}[dir=rtl] .bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-right:45px}@media only screen and (max-width:600px){.bubbles-inner.is-chat .is-in .bubble-content-wrapper{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% - var(--message-beside-button-margin)*-1)!important}.bubbles-inner.is-chat .message,.bubbles-inner.is-chat .name,.bubbles-inner:not(.is-channel) .message,.bubbles-inner:not(.is-channel) .name{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 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;transform:none!important;transition:opacity var(--layer-transition),visibility 0s .2s!important;visibility:hidden}.bubbles-go-mention{--translateY:0;cursor:default;opacity:0;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s .2s!important;visibility:hidden}.bubbles-go-mention.is-visible{cursor:pointer;opacity:1;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s 0s!important;visibility:visible}.chat-secondary-button{align-items:center;background-color:var(--surface-color)!important;border-radius:50%;box-shadow:0 1px 8px 1px rgba(0,0,0,.12)!important;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;position:absolute}body.animation-level-0 .chat-secondary-button{transition:none!important}.chat-secondary-button:before{position:relative}.chat-secondary-button:after{border-radius:inherit;bottom:0;content:" ";left:0;position:absolute;right:0;top:0}html.no-touch .chat-secondary-button:active:after,html.no-touch .chat-secondary-button:hover:after{background-color:var(--light-secondary-text-color)}[dir=ltr] .bubbles-corner-button{right:var(--chat-input-padding)}[dir=rtl] .bubbles-corner-button{left:var(--chat-input-padding)}.bubbles-corner-button{bottom:calc(var(--chat-input-size) + var(--bottom) + 10px);overflow:visible;z-index:2}[dir=ltr] .bubbles-corner-button .badge{right:-.25rem}[dir=rtl] .bubbles-corner-button .badge{left:-.25rem}.bubbles-corner-button .badge{position:absolute;top:-.25rem}.bubbles-corner-button .badge.badge-primary:not(.badge-gray){background-color:var(--chatlist-status-color)}@media only screen and (max-width:600px){[dir=ltr] .bubbles-corner-button .badge{right:.1875rem}[dir=rtl] .bubbles-corner-button .badge{left:.1875rem}.bubbles-corner-button .badge{top:-.75rem}}.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 var(--transition-standard-out)}body.is-calling:not(.backwards) .topbar,body.is-calling:not(.backwards) .topbar-call-container{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;cursor:pointer!important;margin-bottom:var(--pinned-floating-height);max-height:var(--topbar-height)!important;min-height:var(--topbar-height)!important;position:relative;width:100%;z-index:1}.topbar:before{box-shadow:0 1px 5px -1px rgba(0,0,0,.21);content:" ";height:calc(var(--topbar-height) + var(--pinned-floating-height) - var(--topbar-floating-call-height));left:0;pointer-events:none;position:absolute;right:0;top:0}.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}[dir=ltr] .chat:first-child .topbar .chat-info{padding-left:.1875rem}[dir=rtl] .chat:first-child .topbar .chat-info{padding-right:.1875rem}}@media only screen and (min-width:1276px){.topbar .pinned-container-wrapper-utils{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 var(--transition-standard-in)}body.animation-level-0 .topbar .pinned-container-wrapper-utils{transition:none}}.topbar .sidebar-close-button{position:absolute}.topbar .user-title{align-items:center;display:flex;font-size:1rem;font-weight:var(--font-weight-bold);line-height:1.5rem;max-width:calc(100% - 1.5rem)}.topbar .user-title span.emoji{vertical-align:inherit}.topbar .info,.topbar .peer-title{line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.topbar .info:not(:empty){margin-top:1px}.topbar .btn-menu-toggle .btn-menu{max-height:calc(var(--vh)*100 - 4.375rem);top:calc(100% + 7px)}@media only screen and (max-width:600px){.topbar .btn-menu-toggle .btn-menu{max-height:calc(var(--vh)*100 - 3.75rem);top:29px}.topbar .btn-menu-toggle{margin-left:0}}[dir=ltr] .topbar .chat-info{padding-left:49px}[dir=rtl] .topbar .chat-info{padding-right:49px}.topbar .chat-info{flex:1 1 auto;max-width:calc(100% - var(--utils-width));overflow:hidden}@media only screen and (max-width:600px){[dir=ltr] .topbar .chat-info{padding-left:52px}[dir=rtl] .topbar .chat-info{padding-right: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{align-items:center;display:flex;flex:1 1 auto;height:3.5rem;justify-content:space-between;max-height:3.5rem;max-width:100%}.topbar .chat-utils{align-items:center;display:flex;flex:0 0 auto}@media only screen and (min-width:1276px){.topbar .chat-utils{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 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}}[dir=ltr] .topbar .chat-join{margin-right:.5rem}[dir=rtl] .topbar .chat-join{margin-left:.5rem}.topbar .chat-join{font-size:.875rem;font-weight:400;height:2.25rem;padding:0 1.375rem;width:auto}.topbar .chat-join:not(.hide)+.chat-mute-button{display:none}[dir=ltr] .topbar .content{padding-left:1.125rem}[dir=rtl] .topbar .content{padding-right:1.125rem}.topbar .content{flex:1 1 auto;max-width:100%;overflow:hidden}.topbar .person{align-items:center;display:flex}.topbar .person-avatar{flex:0 0 auto}.topbar .person .bottom{color:var(--secondary-text-color);font-size:.875rem}.topbar .person .bottom .online{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}[dir=ltr] .chat:not([data-type=chat]) .topbar .content{padding-left:16px}[dir=rtl] .chat:not([data-type=chat]) .topbar .content{padding-right:16px}[dir=ltr] .topbar-call-container{left:1px;right:0}[dir=rtl] .topbar-call-container{left:0;right:1px}.topbar-call-container{color:#fff;cursor:pointer!important;height:var(--topbar-call-height)!important;min-height:auto!important;position:absolute;top:calc(var(--topbar-call-height)*-1);z-index:2}body:not(.has-chat) .topbar-call-container{background:none!important}@media only screen and (max-width:925px){[dir=ltr] .topbar-call-container{left:0}[dir=rtl] .topbar-call-container{right:0}}.topbar-call-container .btn-icon{color:inherit;flex:0 0 auto;height:2.5rem;padding:0;width:2.5rem}.topbar-call-container .peer-title{font-weight:var(--font-weight-bold);white-space:nowrap}@media only screen and (max-width:480px){.topbar-call-container:not(.is-call) .topbar-call-left,.topbar-call-container:not(.is-call) .topbar-call-right{width:auto}.topbar-call-container:not(.is-call) .group-call-description{display:none}.topbar-call-container.is-call .topbar-call-left,.topbar-call-container.is-call .topbar-call-right{width:6.25rem}.topbar-call-container.is-call .call-description:not(.has-duration){display:none}}.topbar-call-left,.topbar-call-right{flex:0 0 auto;width:12rem}.topbar-call-left{align-items:center;display:flex}[dir=ltr] .topbar-call-left .btn-icon{margin-right:.375rem}[dir=rtl] .topbar-call-left .btn-icon{margin-left:.375rem}.topbar-call-left .call-description{white-space:nowrap}.topbar-call-left .call-description-duration{font-weight:var(--font-weight-bold)}.topbar-call-center{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media only screen and (min-width:1276px){.topbar-call-center{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 var(--transition-standard-in)}body.animation-level-0 .topbar-call-center{transition:none}.topbar-call-center{padding:0 calc(var(--right-column-width)/2)}}.topbar-call-right{display:flex;justify-content:flex-end}@media only screen and (min-width:1276px){.topbar-call-right{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 var(--transition-standard-in)}body.animation-level-0 .topbar-call-right{transition:none}}.topbar-call-weave{bottom:-1.125rem;left:0;pointer-events:none;position:absolute;right:0;top:0;transform:scale(var(--topbar-floating-scaleX),-1);transform-origin:left center;z-index:-1}.is-rtl .topbar-call-weave{transform-origin:right center}@media only screen and (min-width:1276px){.topbar-call-weave{transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-weave{transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-weave{transition:none}}.topbar-call-weave-canvas{height:100%;width:100%}.topbar .back-unread-badge{position:absolute;right:-.5rem;top:-.25rem}@media only screen and (min-width:601px){.topbar .back-unread-badge{display:none}}@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}.bubbles-group{position:relative}.bubbles-group-avatar{bottom:.25rem;cursor:pointer;pointer-events:all;position:sticky!important;top:0}.bubbles.is-selecting .bubbles-group-avatar{transform:translateZ(0) scaleX(1);transform-origin:bottom}.bubbles-group-avatar.is-gesturing-reply{transform:translateX(0)}.bubbles-group-avatar.is-gesturing-reply.animating.backwards{transition:transform var(--transition-standard-out)}.bubbles-group-avatar-container{bottom:0;display:flex;flex-direction:column-reverse;left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:2}.bubble{--line-height:var(--messages-line-height);display:flex;flex-wrap:wrap;margin:0 auto .125rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:1}.bubble.is-gesturing-reply{transform:translateX(0)}.bubble.is-gesturing-reply.animating.backwards{transition:transform var(--transition-standard-out)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon{align-items:center;background-color:var(--message-highlightning-color);border-radius:50%;color:#fff;display:flex;height:var(--message-beside-button-size);justify-content:center;opacity:0;position:absolute;right:var(--message-beside-button-margin);top:50%;transform:translateY(-50%);transform:translateY(-50%) scale(.6);visibility:hidden;width:var(--message-beside-button-size)}.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{transform:translateY(-50%) scale(1);visibility:visible}.bubble.is-highlighted:after,.bubble.is-selected:after,.bubble:after{bottom:-.0625rem;content:" ";left:-50%;position:absolute;top:-.0625rem;z-index:-1}.bubble.is-highlighted:after{background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-highlighted:after{animation:bubbleSelected 2s linear}@media only screen and (max-width:600px){.bubble.is-first-unread{max-width:none}}.bubble.is-first-unread:before{background-color:var(--surface-color);color:var(--primary-color);content:"Unread messages";font-size:15px;font-weight:var(--font-weight-bold);height:30px;line-height:2.1;margin-bottom:.25rem;margin-left:-50%;margin-right:-50%;position:relative;text-align:center;z-index:2}.bubble.is-first-unread.is-highlighted:after,.bubble.is-first-unread.is-selected:after{top:calc(.0625rem + 30px)}.bubble.is-selected:after{background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-selected:after{animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-selected.backwards:after{animation:fade-in-backwards-opacity .2s linear forwards}.bubble:after,.bubble:before{display:block;width:200%}.bubble.is-multiple-documents:after,.bubble.is-multiple-documents:before{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{display:flex;left:0;margin:0;position:absolute;z-index:3}.bubble-select-checkbox .checkbox-box-border{border-color:var(--message-checkbox-border-color)}.bubble-select-checkbox .checkbox-box-background{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:0 0 3px 0 rgba(0,0,0,.4)}.bubbles.is-selecting .bubble:not(.is-album) .attachment,.bubbles.is-selecting .bubble:not(.is-album) .audio,.bubbles.is-selecting .bubble:not(.is-album) .document,.bubbles.is-selecting .bubble:not(.is-album) poll-element{pointer-events:none!important}.bubbles.is-selecting .bubble a,.bubbles.is-selecting .bubble img,.bubbles.is-selecting .bubble video{pointer-events:none}.bubble-content{background-color:var(--message-background-color);border-radius:12px;box-shadow:0 1px 2px 0 rgba(16,35,47,.15);display:flex;flex-direction:column-reverse;max-width:100%;min-width:56px;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:2}body.animation-level-0 .bubble-content{transition:none}html.is-touch body:not(.no-select) .chat:not(.no-forwards) .bubbles.is-selecting .bubble-content,html.no-touch .chat:not(.no-forwards) .bubbles:not(.is-selecting) .bubble-content{-webkit-user-select:text;-moz-user-select:text;user-select:text}.bubble-content.hover-reaction-visible .bubble-beside-button{transform:translateX(1.125rem)}.bubble.is-out .bubble-content.hover-reaction-visible .bubble-beside-button{transform:translateX(-1.125rem)}.bubble.is-out .bubble-content.hover-reaction-visible .bubble-beside-button.goto-original{transform:translateX(-1.125rem) rotate(180deg)}.bubble-hover-reaction{--size:1.875rem;--offset:calc(var(--size)*-0.75);align-items:center;background-color:var(--surface-color);border-radius:var(--size);bottom:0;box-shadow:var(--menu-box-shadow);cursor:pointer;display:flex;height:1.625rem;justify-content:center;opacity:0;position:absolute;right:var(--offset);transform:scale(.8);width:var(--size);z-index:2}body.animation-level-2 .bubble-hover-reaction{transition:opacity var(--btn-corner-transition),transform var(--btn-corner-transition)}.bubble-hover-reaction.is-visible:not(.backwards){opacity:1;transform:scale(1)}.bubble-hover-reaction-sticker{height:1.125rem;position:relative;width:1.125rem}.bubble.service{max-width:var(--messages-container-width)}.bubble.service .bubble-content{box-shadow:none;margin:0 auto;max-width:100%}.bubble.is-date{font-weight:var(--font-weight-bold);opacity:.99999;padding-bottom:.375rem;pointer-events:none;position:sticky;top:.25rem;transition:opacity .3s ease;z-index:2}.bubble.is-date:after,.bubble.is-date:before{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[data-type=chat] .bubble.is-date .bubble-content,.chat[data-type=discussion] .bubble.is-date .bubble-content{cursor:pointer;pointer-events:all}.bubbles:not(.has-sticky-dates) .bubble.is-date{visibility:hidden}.bubbles.has-sticky-dates .bubble.is-date.is-fake{display:none}.bubble.is-date.is-fake{left:50%;opacity:1!important;position:absolute;top:0;transform:translateX(-50%);transition:none!important;visibility:visible!important}.bubble-beside-button{align-items:center;background:var(--message-highlightning-color);border-radius:50%;bottom:0;color:var(--badge-text-color);cursor:pointer;display:flex;font-size:1.5rem;height:var(--message-beside-button-size);justify-content:center;position:absolute;right:var(--message-beside-button-margin);transform:translateX(0);width:var(--message-beside-button-size)}html.no-touch .bubble-beside-button{opacity:0}html.no-touch body.animation-level-2 .bubble-beside-button{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.bubble-view-button{align-items:center;border:1px solid var(--message-primary-color);border-radius:6px;color:var(--message-primary-color);display:flex;height:2rem;justify-content:center;margin:0 .5625rem .5rem;text-decoration:none!important;width:auto}html.no-touch .bubble-view-button:active,html.no-touch .bubble-view-button:hover{background-color:var(--light-filled-message-primary-color)}.bubble-view-button .c-ripple__circle{background-color:var(--message-primary-color);opacity:.08}.message .bubble-view-button{margin:.375rem 0 -.375rem;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.bubble-view-button+.reactions-block{margin-top:.375rem}html.no-touch .bubble:active .bubble-beside-button,html.no-touch .bubble:hover .bubble-beside-button{opacity:1}.bubble .forward{font-size:1.25rem}.bubble.is-group-last{margin-bottom:.5rem}.bubble.is-group-last:after{bottom:-.25rem}.bubbles-inner.is-chat .bubble.is-group-last.is-in>.bubble-select-checkbox{bottom:.1875rem}.bubble.is-group-first:after{top:-.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:-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;min-width:100%}.bubble.webpage .document{height:3.375rem}@media only screen and (max-width:600px){.bubble.webpage .document{padding-left:44px}}.bubble.webpage .has-document{display:flex;flex-direction:column}.bubble.webpage .has-document .preview-resizer{order:1}.bubble .preview-resizer{display:flex}.bubble img.emoji{height:18px;vertical-align:bottom;width:18px}.bubble .thumbnail{position:absolute}.bubble .canvas-thumbnail{border-radius:inherit}.bubble .canvas-dots{z-index:1}.bubble.emoji-big{--emoji-size:1rem;font-size:0}.bubble.emoji-big .bubble-content{line-height:1}.bubble.emoji-big .attachment{--custom-emoji-size:var(--emoji-size);border-radius:0!important}.bubble.emoji-big .attachment img.emoji{height:var(--emoji-size);max-height:64px;max-width:64px;width:var(--emoji-size)}.bubble.emoji-big .attachment .custom-emoji,.bubble.emoji-big .attachment .emoji{display:inline-block}.bubble.emoji-big:not(.sticker) .attachment{display:block;font-size:var(--emoji-size);max-height:-moz-fit-content!important;max-height:fit-content!important;padding-bottom:1.25rem;padding-top:.25rem;white-space:pre-wrap;word-break:break-word}.bubble.emoji-big:not(.sticker) .attachment span.emoji{height:auto;width:auto}.bubble.emoji-big:not(.sticker) .message{margin-top:-1.125rem}.bubble.emoji-big:not(.sticker) .bubble-content{max-width:min(420px,100%)}.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:var(--message-highlightning-color)}.bubble.emoji-big:not(.sticker) .bubble-content,.bubble.sticker .bubble-content{align-self:flex-start}.bubble.emoji-big:not(.sticker) .message,.bubble.sticker .message{margin-left:auto;position:relative!important;right:0!important}.bubble.sticker .attachment{border-radius:0;position:absolute;z-index:1}.bubble.round .attachment{height:var(--round-video-size)!important;max-height:var(--round-video-size)!important;max-width:var(--round-video-size)!important;width: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{border-radius:inherit;cursor:pointer;display:flex;justify-content:center;max-width:100%;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .attachment img,.bubble .attachment video{max-width:100%}.bubble .attachment .download{align-items:center;cursor:pointer;display:flex;height:100%;justify-content:center;left:0;position:absolute;top:0;width:100%}.bubble .attachment .download span{background-color:var(--message-time-background);color:#fff;font-size:23px;text-align:center}.bubble .attachment .download~.video-play,.bubble .attachment .preloader-container~.video-play{display:none}.bubble .media-container-aspecter{margin:0 auto;position:relative;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{animation:thumbnail-fade-in-opacity .2s ease-in-out forwards}.bubble .preloader-container{z-index:2}.bubble:not(.sticker) .attachment{max-height:min(340px,100%);max-width:min(420px,100%);width:-moz-max-content;width:max-content}.bubble img:not(.emoji),.bubble video{height:100%;-o-object-fit:cover;object-fit:cover;width: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-height:none;max-width:min(451px,100%)}.bubble .album-item{background-color:var(--message-highlightning-color);cursor:pointer;max-width:100%;overflow:hidden;position:absolute}body.animation-level-0 .bubble .album-item{transition:none!important}.bubble .album-item img,.bubble .album-item video,.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 var(--transition-standard-out)}.bubble .album-item.is-selected.animating .album-item-media{transition:transform var(--transition-standard-out),border-radius var(--transition-standard-out)}.bubble .album-item.is-selected:not(.backwards){transition:border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards) .album-item-media{transform:scale(.883333);transition:transform var(--transition-standard-in),border-radius var(--transition-standard-in)}.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:active,html.no-touch .bubble a:hover{text-decoration:underline}.bubble-first{align-items:center;justify-content:center;margin-top:.5rem;max-width:100%;order:-1}body.animation-level-0 .bubble-first{flex:1 1 auto}.bubble-first .attachment{pointer-events:none}.bubble-first .bubble-content-wrapper{max-width:100%}.bubble-first.empty-bubble-placeholder{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}body.animation-level-2 .bubble-first.empty-bubble-placeholder .bubble-content-wrapper{transition:var(--bubble-transition-in)}.bubble-first.empty-bubble-placeholder.has-description .service-msg{align-items:flex-start!important;flex-direction:column;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-size:1rem!important;font-weight:var(--font-weight-bold)}.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{font-size:1.25rem;margin-left:-.1875rem;margin-right:.25rem;vertical-align:bottom}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-list-bullet{margin-right:.3125rem}.bubbles.has-groups .bubble-first.empty-bubble-placeholder{pointer-events:none}.bubbles.has-groups .bubble-first.empty-bubble-placeholder .bubble-content-wrapper{opacity:0;transform:scale3d(.8,.8,1) translateX(0)}.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{cursor:pointer;height:200px;margin-top:.75rem!important;position:relative;width:200px}.bubble-first .time{display:none!important}.bubble-first:after,.bubble-first:before{display:none}.bubble .web{line-height:var(--line-height);margin:.125rem 0 0;max-width:100%;overflow:hidden}.bubble .web+.time{display:block}.bubble .web .preview{border-radius:4px;cursor:pointer;max-height:min(340px,100%);max-width:min(420px,100%);overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;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 .text,.bubble .web .title,.bubble .web .webpage-name{font-size:var(--messages-secondary-text-size);line-height:var(--messages-secondary-line-height)}.bubble .web .webpage-name{text-decoration:none}html.no-touch .bubble .web .webpage-name:active,html.no-touch .bubble .web .webpage-name:hover{text-decoration:underline}.bubble .web .text{margin-top:1px;word-break:break-word}.bubble .web .quote{display:flex;max-width:100%;overflow:hidden;width:100%}.bubble .web .quote-text{margin-left:-.625rem;max-width:100%;padding-left:.625rem;width:100%}.bubble .web .quote:before{background-color:var(--primary-color);border-radius:.125rem;content:" ";flex:0 0 auto;margin:.1875rem .5rem .125rem 0;width:.125rem}.bubble .reply{--font-size:var(--messages-secondary-text-size)}.bubble .document-name{font-size:var(--messages-text-size)}.bubble .document-size{font-size:var(--messages-secondary-text-size)}.bubble.is-square-photo .bubble-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{float:right;height:3rem;margin:.1875rem 0 0 .625rem;width:3rem}.bubble.is-square-photo .web .preview{margin:0;max-height:min(3rem,100%);max-width:min(3rem,100%)}.bubble .reply{border-radius:.25rem;cursor:pointer;margin:0 .375rem .375rem;min-width:10rem;padding:.25rem;width:auto}.bubble .reply-media{top:.125rem}.bubble .reply-content{height:auto;max-width:calc(100% - 1.25rem);min-height:32px;overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap}.bubble .message+.reply{margin-bottom:0}.bubble:not(.just-media) .reply{border-radius:6px}html.no-touch .bubble:not(.just-media) .reply:active,html.no-touch .bubble:not(.just-media) .reply:hover{background-color:var(--light-filled-message-primary-color)}.bubble.just-media .floating-part{background-color:var(--message-highlightning-color);border-radius:12px;margin:0;max-width:15rem;padding:.375rem .625rem;position:absolute;top:0;white-space:nowrap}@media only screen and (max-width:600px){.bubble.just-media .floating-part{max-width:calc(100vw - 1rem - 10px - 100%)}}.bubble.just-media .name{color:#fff!important;line-height:var(--line-height);padding:.375rem .625rem}.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;max-width:none!important;position:relative}.bubble.just-media .reply i,.bubble.just-media .reply-subtitle,.bubble.just-media .reply-title{color:#fff!important}.bubble.just-media .reply-border{background:#fff!important}.bubble.forwarded .attachment,.bubble.is-reply .attachment,.bubble:not(.hide-name) .attachment{border-top-left-radius:0;border-top-right-radius:0}.bubble .message,.bubble .service-msg{--custom-emoji-size:var(--messages-custom-emoji-size)}.bubble .message{color:var(--primary-text-color);font-size:var(--messages-text-size);line-height:var(--line-height);max-width:100%;padding:0 .5rem .375rem .625rem;position:relative;white-space:pre-wrap;word-break:break-word}.bubble .message .custom-emoji{display:inline-flex}.bubble .message:last-child{padding-top:6px}@media only screen and (max-width:600px){.bubble .audio,.bubble .document{--icon-size:2.25rem}}.bubble .audio .audio-title{font-weight:var(--font-weight-bold)}.bubble .audio .audio-ico{font-size:0}@media only screen and (max-width:600px){.bubble .audio{--icon-margin:.6875rem;height:2.375rem}.bubble .audio .audio-details{margin-bottom:0;margin-top:2px}.bubble .audio .audio-subtitle{margin-top:-1px}}.bubble .message.audio-message{width:335px}@media only screen and (max-width:600px){.bubble .message.audio-message{width:280px}}.bubble .message.audio-message,.bubble .message.voice-message{max-width:min(100%,335px)!important}@media only screen and (max-width:600px){.bubble .message.audio-message,.bubble .message.voice-message{max-width:min(100%,300px)!important}}.bubble.min-content .bubble-content{width:-moz-min-content;width:min-content}.bubble .message.voice-message .document-message{max-width:-moz-fit-content;max-width:fit-content}.bubble .message.audio-message,.bubble .message.voice-message{padding:8px!important}.bubble .message.call-message,.bubble .message.contact-message{min-width:200px;padding-left:8px}.bubble .message.contact-message .contact{cursor:pointer;display:flex;padding:2px 0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .message.contact-message .contact-avatar{color:#fff}.bubble .message.contact-message .contact-details{display:flex;flex-direction:column;margin-top:8px;padding-left:12px}.bubble .message.contact-message .contact-name{font-size:1rem;font-weight:var(--font-weight-bold)}.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{--icon-margin:.75rem;height:58px}@media only screen and (max-width:600px){.bubble .message.document-message .document{--icon-margin:.5rem;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 0 0}}.bubble .message.document-message .document-name{line-height:1.4;margin-top:1px;overflow:hidden;text-overflow:ellipsis}.bubble-call{cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding:.125rem 0 .125rem 2.5625rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble-call:before{font-size:1.5rem;left:.3125rem;position:absolute}.bubble-call-title{font-weight:var(--font-weight-bold)}.bubble-call-subtitle{align-items:center;color:var(--secondary-text-color);display:flex;font-size:var(--messages-secondary-text-size);line-height:var(--messages-secondary-line-height);margin-left:-.1875rem;margin-top:.0625rem}.bubble-call-subtitle.is-reason:before{margin-right:.0625rem}.bubble-call-subtitle:before{content:"๎คŒ";display:inline-block;font-size:1rem;transform:rotate(135deg)}.bubble-call-subtitle.arrow-red:before{color:var(--danger-color)}.bubble-call-subtitle.arrow-green:before{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 .time{align-self:flex-start;height:0}.bubble .document-message+.audio .time,.bubble .document-message+.document .time{display:none!important}.bubble.is-multiple-documents .message{border-radius:inherit;padding:0!important}.bubble.is-multiple-documents .document-container{border-radius:inherit;position:relative}.bubble.is-multiple-documents .document-container .document-selection{bottom:0;left:-75vw;position:absolute;top:0;width:200vw;z-index:-2}.bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before,.bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{background-color:var(--message-background-color);border-radius:inherit;bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.bubble.is-multiple-documents .document-container.is-highlighted .document-selection{background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-selection{animation:bubbleSelected 2s linear}.bubble.is-multiple-documents .document-container.is-selected .document-selection{background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-selection{animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-selection{animation:fade-in-backwards-opacity .2s linear forwards}.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--margin-top:.25rem;--margin-left:.125rem;background:#fff;border-radius:50%;left:auto;margin-left:calc(var(--padding-left)*-1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto}@media only screen and (max-width:600px){.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--size:1.125rem}}.bubble.is-multiple-documents .document-container .bubble-select-checkbox:before{--inner-size:.125rem;border:2px solid var(--secondary-color);border-radius:inherit;content:" ";height:calc(var(--size) - var(--inner-size)*2);left:var(--inner-size);position:absolute;top:var(--inner-size);width:calc(var(--size) - var(--inner-size)*2)}.bubble.is-multiple-documents .document-container:first-of-type .document-selection{top:-.0625rem}.bubble.is-multiple-documents .document-container:first-of-type .document-wrapper{border-top-left-radius:inherit;border-top-right-radius:inherit;padding-top:.5rem}.bubble.is-multiple-documents .document-container:last-of-type .document-selection{bottom:-.0625rem}.bubble.is-multiple-documents .document-container:last-of-type .document-wrapper{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;padding-bottom:.5rem}.bubble.is-multiple-documents.is-group-first .document-container:first-of-type .document-selection{top:-.25rem}.bubble.is-multiple-documents.is-group-last .document-container:last-of-type .document-selection{bottom:-.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{padding:.25rem .5rem}.bubble.is-multiple-documents .document-wrapper>.name{margin-top:-.1875rem;padding:0 0 .25rem}.bubble .message .audio .time,.bubble .message.contact-message .time,.bubble .message.poll-message .time{bottom:0;position:absolute;right:0}html:not(.is-safari) .bubble .message.voice-message{overflow:hidden}.bubble.is-message-empty .bubble-content-wrapper{width:-moz-min-content;width:min-content}.bubble.is-message-empty .message{background-color:var(--message-time-background);border-radius:.75rem;bottom:.1875rem;padding:0 .3125rem;position:absolute;right:.1875rem;z-index:2}.bubble.is-message-empty .message .time{align-items:center;display:flex;height:calc(var(--messages-time-text-size) + .375rem);margin:0;padding:0;white-space:nowrap}.bubble.is-message-empty .message .time .inner{bottom:auto;color:#fff;margin:inherit;right:auto}.bubble.is-message-empty .message .time .inner:after{color:#fff!important}.bubble.is-message-empty.with-replies:not(.sticker):not(.with-beside-replies) .message{bottom:55px}.bubble.is-message-empty.emoji-big .message,.bubble.is-message-empty.sticker .message,.bubble.is-message-empty.with-replies.round .message{bottom:0}.bubble.is-message-empty:not(.emoji-big) .reactions-block{max-width:-moz-fit-content;max-width:fit-content}.bubble.is-message-empty .reaction-block{--chosen-background-color:var(--primary-color)}html.no-touch .bubble.is-message-empty .reaction-block:not(.is-chosen):active:after,html.no-touch .bubble.is-message-empty .reaction-block:not(.is-chosen):hover:after{background-color:#fff}.bubble.with-reply-markup .bubble-content{min-width:100%}.bubble.with-replies .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble.with-beside-replies .bubble-content{min-height:5.5rem}.bubble .colored-name .premium-icon{color:inherit;opacity:.6}.bubble .time{cursor:pointer;direction:ltr;display:inline-flex;float:right;font-size:var(--messages-time-text-size);height:var(--messages-time-text-size);line-height:1;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;visibility:hidden;z-index:1}.bubble .time i{font-size:1.125rem;margin-right:.375rem}.bubble .time-icon{pointer-events:none}.bubble .time-icon:not(:first-child){margin-left:2px}.bubble .time i.edited{font-size:inherit;overflow:visible}.bubble .time .inner{align-items:center;bottom:0;color:var(--message-time-color);display:flex;height:var(--messages-time-text-size);line-height:1;padding:inherit;pointer-events:all;position:absolute;right:0;visibility:visible;white-space:nowrap}.bubble .time .inner:after{color:var(--message-status-color)}.bubble .time .tgico-pinnedchat{margin-right:.125rem}.bubble .time.is-block{display:block;float:none}.bubble.webpage .time{float:none}.bubble .video-play,.bubble .video-time{pointer-events:none}.bubble .video-time{--height:calc(var(--messages-time-text-size) + 0.375rem);align-items:center;background-color:var(--message-time-background);border-radius:var(--height);color:#fff;display:flex;font-size:var(--messages-time-text-size);height:var(--height);left:3px;line-height:1;padding:0 6px;position:absolute;top:3px;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:2}.bubble .video-time.can-autoplay:after{color:#fff;content:"๎ฆƒ";font-size:calc(var(--messages-time-text-size) + 8px);padding:0 1px 0 3px}[dir=ltr] .bubble .video-time.is-error:after{margin-left:1px}[dir=rtl] .bubble .video-time.is-error:after{margin-right:1px}.bubble .video-time.is-error:after{content:"๎ฆญ";font-size:calc(var(--messages-time-text-size) + 4px);padding:0}.bubble .extended-media-buy{align-items:center;-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:rgba(0,0,0,.3);border-radius:2rem;color:#fff;display:flex;font-size:var(--font-size-14);font-weight:var(--font-weight-bold);height:2.5rem;left:50%;padding:0 1rem;position:absolute;top:50%;transform:translate(-50%,-50%);white-space:nowrap;z-index:2}.bubble .extended-media-buy:before{font-size:1.125rem;margin-right:.25rem}.bubble pre{display:inline;margin:0}.bubble .anchor-url{text-decoration:underline}.bubble .video-play{align-items:center;background-color:var(--message-time-background);color:#fff;display:flex;font-size:2.125rem;justify-content:center;text-align:center;z-index:2}.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;user-select:none}.bubble .peer-title{cursor:pointer}.bubble .name{color:var(--primary-color);font-size:var(--messages-secondary-text-size);font-weight:var(--font-weight-bold)!important;line-height:calc(var(--messages-secondary-text-size) + .25rem);max-width:100%;overflow:hidden;padding:.375rem .625rem 0;text-overflow:ellipsis}.bubble .name .badge-fake{display:inline-block;margin-top:-2px;vertical-align:middle}.bubble:not(.webpage).photo:not(.is-reply) .bubble-content>.name,.bubble:not(.webpage).video:not(.is-reply) .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).photo .topic-name-button-container,.bubble:not(.webpage).video .topic-name-button-container{margin-bottom:0}.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):not(.forwarded).hide-name .reply,.bubble:not(.sticker):not(.emoji-big):not(.forwarded):not(.is-group-first) .reply{margin-top:6px}.bubble .bubble-tail{display:none}.bubble.can-have-tail.is-group-last .bubble-tail{fill:var(--message-background-color);display:block;height:20px;position:absolute;transform:translateY(1px);width:11px;z-index:-2}.bubble.is-message-empty.is-group-last.with-media-tail .bubble-tail,.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 .attachment{overflow:visible}.bubble__media-container{border-radius:inherit;cursor:pointer}.bubble audio-element,.bubble poll-element{white-space:normal}.bubble .replies{-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .replies .c-ripple__circle{background-color:var(--light-primary-color)}.bubble .replies .rp{border-radius:inherit;cursor:pointer;height:100%;left:0;overflow:hidden;position:absolute;top:0;width:100%}.bubble .replies-beside{border-radius:2rem;bottom:47px;flex-direction:column;height:auto;max-height:52px;min-height:36px;padding:.375rem 0 .5rem;right:-44px;width:36px}.bubble .replies-beside-text{font-size:.75rem;margin-top:.125rem}.bubble .replies-footer{align-items:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;border-top:.0625rem solid var(--border-color);color:var(--primary-color);display:flex;height:3.0625rem;min-width:15rem;padding:0 .5rem;position:relative}html.no-touch .bubble .replies-footer:active,html.no-touch .bubble .replies-footer:hover{background-color:var(--light-primary-color)}html.no-touch .bubble .replies-footer:active~.bubble-tail,html.no-touch .bubble .replies-footer:hover~.bubble-tail{fill:var(--light-filled-message-primary-color)}.bubble .replies-footer .tgico-comments,.bubble .replies-footer .tgico-next{font-size:1.5rem}.bubble .replies-footer .tgico-comments{margin-left:.125rem;margin-right:.375rem}.bubble .replies-footer-text{align-items:center;color:var(--primary-color);display:flex;font-size:.9375rem;font-weight:var(--font-weight-bold);line-height:1.125rem;margin-left:.5rem}.bubble .replies-footer-avatars{--margin-right:-.875rem;--border-size:2px}.bubble .replies-footer .tgico-next{position:absolute;right:.1875rem}.bubble .replies-footer.is-unread .replies-footer-text:after{background-color:var(--primary-color);border-radius:50%;content:" ";height:.5rem;margin-left:.75rem;width:.5rem}.bubble.is-thread-starter .user-avatar{display:none}.bubble.is-thread-starter.is-in .bubble-content-wrapper{margin-left:0}.bubble .message .reaction{--background-color:var(--light-filled-message-primary-color)}.bubble .message .reaction.is-chosen.backwards,.bubble .message .reaction:not(.is-chosen){--counter-color:var(--message-primary-color)}.bubble .message .reaction.is-chosen.backwards .stacked-avatars,.bubble .message .reaction:not(.is-chosen) .stacked-avatars{--border-color:var(--background-color)}.bubble .message .reactions-block .time{bottom:auto!important;order:100;position:static!important;right:auto!important}.bubble code{cursor:pointer}.bubble.is-invoice .attachment{background-color:inherit!important}.bubble.with-reply-markup .bubble-content{border-bottom-left-radius:6px!important;border-bottom-right-radius:6px!important}.bubble .name-with-reply .name{padding:0!important}.bubble .name-with-reply .name:not(:last-child) .hide-ol{display:none}.bubble .name-with-reply .name:not(:last-child) .peer-title{font-weight:var(--font-weight-bold)!important}.bubble .name-with-reply .reply{height:auto;margin:.25rem 0 0;max-height:none;padding:0}.bubble .topic-name-button{--color:var(--message-primary-color)}.bubble .name .topic-name-button-container{margin:.25rem -.125rem}.bubble .name .topic-name-button-container:first-child{margin-top:0}.bubble.is-message-empty:not(.is-reply) .name .topic-name-button-container{margin-bottom:0}.bubble:not(.is-group-first) .topic-name-button-container{display:none!important}.bubble .topic-name-button-container.floating-part{font-size:var(--messages-secondary-text-size);padding-bottom:0;padding-top:0}.bubble .topic-name-button-container.floating-part .topic-name-button{--color:#fff;padding:0}.bubble .topic-name-button-container.floating-part .topic-name-button:before{content:none}.bubble .topic-name-button-container.floating-part+.floating-part{margin-top:1.75rem}.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type{margin-bottom:.0625rem}.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type .document-container:last-of-type .document-selection,.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type:after{bottom:-.0625rem}.can-zoom-fade{opacity:1;transform:scale(1) translateX(0);transform-origin:center}body.animation-level-2 .can-zoom-fade{transition:var(--bubble-transition-out)}.bubbles-inner.zoom-fading .can-zoom-fade{transition:var(--bubble-transition-in)}.can-zoom-fade.zoom-fade{opacity:0;transform:scale3d(.8,.8,1) translateX(0)}.bubble-content-wrapper{display:flex;flex-direction:column}@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% - var(--message-handhelds-margin))}}.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{align-items:center;background-color:var(--message-highlightning-color);border-radius:inherit;color:#fff;display:flex;font-size:var(--messages-service-text-size);justify-content:center;line-height:calc(var(--messages-service-text-size) + 5px);padding:.28125rem .625rem;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;word-break:break-word}.bubble.service .service-msg i{font-style:normal}.bubble.service .service-msg a{color:#fff}.bubble.service .service-msg .peer-title,.bubble.service .service-msg [data-saved-from],.bubble.service .service-msg a{cursor:pointer;font-weight:var(--font-weight-bold)}.bubble.service .service-msg .peer-title:hover,.bubble.service .service-msg [data-saved-from]:hover,.bubble.service .service-msg a:hover{text-decoration:underline}.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!important}.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 .floating-part{left:calc(100% + 10px)}@media only screen and (max-width:600px){.bubble.is-in.just-media .floating-part{left:calc(100% + 1px)}}.bubble.is-in .quote .webpage-name,.bubble.is-in .reply-title{color:var(--primary-color)}.bubble.is-in .time{margin-left:-3px;padding-right:8px}.bubble.is-in .time .inner{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 .audio-time,.bubble.is-in .contact-number{color:var(--secondary-text-color)!important}.bubble.is-in code,.bubble.is-in pre{color:var(--monospace-text-color)}.bubble.is-in:not(.just-media) .reply.is-overriding-color .reply-border{background-color:rgb(var(--override-color))}.bubble.is-in:not(.just-media) .reply.is-overriding-color .reply-title{color:rgb(var(--override-color))}html.no-touch .bubble.is-in:not(.just-media) .reply.is-overriding-color:active,html.no-touch .bubble.is-in:not(.just-media) .reply.is-overriding-color:hover{background-color:rgba(var(--override-color),.08)}.bubble.is-out{--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);--message-primary-color:var(--message-out-primary-color);--light-filled-message-primary-color:var(--light-filled-message-out-primary-color);--selection-background-color:var(--message-out-selection-background-color);--message-time-color:var(--message-out-time-color);--message-status-color:var(--message-out-status-color);flex-direction:row-reverse}.bubble.is-out .bubble-content{margin-left:auto}.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: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) + .5rem)*-1))}.bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(.8,.8,1) translateX(calc((var(--chat-input-size) + .5rem)*-1))}body.animation-level-2 .bubble.is-out .bubble-content-wrapper{transition:var(--bubble-transition-out)}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:var(--bubble-transition-in)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(.8,.8,1) translateX(0)}}.bubble.is-out .anchor-url{color:var(--message-primary-color)}.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!important}.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 .floating-part{right:calc(100% + 10px)}.bubble.is-out.just-media .message{right:0}.bubble.is-out:not(.just-media) .reply-border{background-color:var(--message-out-primary-color)!important}.bubble.is-out:not(.just-media) .reply i,.bubble.is-out:not(.just-media) .reply-title{color:var(--message-out-primary-color)!important}.bubble.is-out .quote:before{background-color:var(--message-out-primary-color)}.bubble.is-out .quote .webpage-name{color:var(--message-out-primary-color)}.bubble.is-out .time{margin-left:-4px;padding-right:5px}.bubble.is-out .time .inner{bottom:4px}.bubble.is-out .time .inner:after,.bubble.is-out .time:after{font-size:calc(var(--messages-text-size) + 3px);line-height:var(--messages-time-text-size);margin-left:1px}.bubble.is-out.forwarded .name{color:var(--message-out-primary-color)}.bubble.is-out.is-read .time .inner:after,.bubble.is-out.is-read .time:after{content:"๎ค"}.bubble.is-out.is-sent .time .inner:after,.bubble.is-out.is-sent .time:after{content:"๎ค€"}.bubble.is-out.is-sending .time .inner:after,.bubble.is-out.is-sending .time:after{content:"๎ฆฌ"}.bubble.is-out.is-error .time .inner:after,.bubble.is-out.is-error .time:after{color:var(--message-error-color);content:"๎ฆญ"}.bubble.is-out .document-ico:after{border-right-color:var(--message-background-color);border-top-color:var(--message-background-color)}.bubble.is-out .audio-waveform rect{fill:var(--message-out-primary-color)}.bubble.is-out .audio-waveform rect.active{fill:var(--message-out-primary-color)!important}.bubble.is-out .audio-subtitle,.bubble.is-out .audio-time{color:var(--message-out-status-color)}.bubble.is-out .audio-download,.bubble.is-out .audio-toggle,.bubble.is-out .audio.corner-download .preloader-container{background-color:var(--message-out-primary-color)}.bubble.is-out .audio-download:empty{display:none}.bubble.is-out .audio.is-unread rect{fill:var(--message-out-primary-color)}.bubble.is-out .audio.is-unread .audio-time:after{background-color:var(--message-out-primary-color)}.bubble.is-out .audio-toggle .part{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.is-message-empty .reactions-block{justify-content:flex-end}.bubble.is-out.is-message-empty .reaction-block{margin-right:.25rem}.bubble.is-out.is-message-empty .reaction-block:last-child{margin-right:0}.bubble.is-out.is-message-empty .reaction-block.is-chosen{--chosen-background-color:var(--surface-color)}.bubble.is-out.is-message-empty:not(.emoji-big) .reactions-block{margin-left:auto}.bubble.is-out .bubble-call-subtitle,.bubble.is-out .contact-number,.bubble.is-out .document-size{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:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-line use{stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-answer-selected{background-color:var(--message-out-primary-color);color:var(--light-filled-message-out-primary-color)}html.no-touch .bubble.is-out poll-element .poll-answer:hover .animation-ring{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:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-avatars .stacked-avatars{--border-color:var(--message-background-color)}.bubble.is-out poll-element .progress-ring__circle{stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle{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:var(--message-out-primary-color)}.bubble.is-out .audio .preloader-container{--color:var(--message-background-color)}.bubble.is-out .bubble-beside-button{left:var(--message-beside-button-margin);right:auto}.bubble.is-out .bubble-beside-button.goto-original{transform:rotate(180deg)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox{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:var(--message-background-color)}.bubble.is-out .bubble-hover-reaction{left:var(--offset);right:auto}.reply-markup{margin-top:.0625rem;width:100%}.bubble:not(.is-group-last) .reply-markup{margin-bottom:.125rem}.reply-markup-row{display:flex;margin-top:.125rem;min-height:2.5rem;overflow:hidden}.reply-markup-row:last-child .reply-markup-button:first-child{border-bottom-left-radius:12px}.reply-markup-row:last-child .reply-markup-button:last-child{border-bottom-right-radius:12px}.reply-markup-button{background:var(--message-highlightning-color);border:none;border-radius:.375rem;color:#fff!important;cursor:pointer;font-size:var(--font-size-14);font-weight:var(--font-weight-bold);outline:none;overflow:hidden;padding:.5625rem 0;position:relative;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:2}.reply-markup-button-text{pointer-events:none;position:relative}.reply-markup-button.anchor-url{text-decoration:none!important}.reply-markup-button+.reply-markup-button{margin-left:.125rem}.reply-markup-button .forward-icon,.reply-markup-button.tgico:before{display:block;position:absolute;right:.125rem;top:.125rem}.reply-markup-button.is-link:before{content:"๎คŒ";transform:rotate(-45deg)}.reply-markup-button.is-buy:before{content:"๎คœ"}.reply-markup-button.is-switch-inline:before{content:"๎ฅ‹"}.bubble-beside-button:after,.bubble.just-media .reply:after,.reply-markup-button:after{background-color:#fff;border-radius:inherit;bottom:0;content:" ";display:block;left:0;opacity:0;position:absolute;right:0;top:0;z-index:-1}html.no-touch .bubble-beside-button:active:after,html.no-touch .bubble-beside-button:hover:after,html.no-touch .bubble.just-media .reply:active:after,html.no-touch .bubble.just-media .reply:hover:after,html.no-touch .reply-markup-button:active:after,html.no-touch .reply-markup-button:hover:after{opacity:var(--hover-alpha)}.bubble-primary-color{color:var(--message-primary-color);font-weight:var(--font-weight-bold)}.pinned-message{--custom-emoji-size:calc(var(--font-size) + 2px)!important}.pinned-message-border{flex:0 0 auto;height:2rem;position:relative;width:.125rem}.pinned-message-border-wrapper-1{background:var(--primary-color);border-radius:1px;height:2rem;position:relative;top:50%;transform:translateY(-50%);width:.125rem}.pinned-message-border-mask{--mask-height:.375rem;--height:2.5rem;height:var(--height);overflow:hidden}.pinned-message-border-mask:after,.pinned-message-border-mask:before{content:" ";display:block;height:var(--mask-height);left:0;opacity:0;position:absolute;right:0;z-index:1}body.animation-level-2 .pinned-message-border-mask:after,body.animation-level-2 .pinned-message-border-mask:before{transition:opacity .2s ease-in-out}.pinned-message-border-mask:before{background:linear-gradient(var(--surface-color),transparent);top:0}.pinned-message-border-mask:after{background:linear-gradient(transparent,var(--surface-color));bottom:0}.pinned-message-border-mask.mask-bottom:after,.pinned-message-border-mask.mask-top:before{opacity:1}.pinned-message-border-wrapper{color:var(--primary-color);position:relative}.pinned-message-border-wrapper:before{background:var(--primary-color);bottom:0;content:" ";display:block;left:0;opacity:.4;position:absolute;right:0;top:0}.pinned-message-border-bars{stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.pinned-message-border-mark{background:currentColor;border-radius:1px;left:0;position:absolute;top:0;width:2px}body:not(.animation-level-0) .pinned-message-border-mark,body:not(.animation-level-0) .pinned-message-border-wrapper{transition:transform .25s ease-in-out;will-change:transform}.pinned-message-content{--height:32px;height:var(--height)}.pinned-message-media{border-radius:.1875rem}.pinned-message,.reply{--font-size:var(--font-size-14);--custom-emoji-size:calc(var(--font-size) + 4px);--line-height:calc(var(--font-size) + 4px);align-items:center;cursor:pointer;display:flex;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.pinned-message-content,.reply-content{display:flex;flex-direction:column;flex-grow:1;flex-shrink:1;justify-content:center;margin-left:.5rem;overflow:hidden;pointer-events:none;position:relative}.pinned-message-title,.reply-title{color:var(--primary-color)}.pinned-message-subtitle,.pinned-message-title,.reply-subtitle,.reply-title{font-size:var(--font-size);line-height:var(--line-height);overflow:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap}.pinned-message-media,.reply-media{height:2rem!important;left:0;overflow:hidden;position:absolute;top:.125rem;width:2rem!important}.pinned-message-media.is-round,.reply-media.is-round{border-radius:50%}.pinned-message-media>img,.pinned-message-media>video,.reply-media>img,.reply-media>video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.pinned-message i,.reply i{color:var(--secondary-text-color);font-style:normal}.pinned-message img.emoji,.reply img.emoji{height:1rem;vertical-align:top;width:1rem}.reply.is-media .reply-content{padding-left:2.5rem}.reply-border{background:var(--primary-color);border-radius:1px;height:calc(var(--font-size)*2 + .25rem);min-width:2px}.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:var(--font-weight-bold)}.pinned-container{--container-height:3.25rem;align-items:center;cursor:pointer;display:flex;flex:0 0 auto;justify-content:space-between;overflow:visible}.pinned-container.is-floating{background-color:var(--surface-color)!important;height:var(--container-height);left:0;margin:0;max-height:var(--container-height);position:absolute!important;right:0;top:var(--topbar-height);width:auto}.pinned-container.is-floating .pinned-container-wrapper{border-radius:0;height:100%;max-width:100%;order:0;padding:0 1rem;z-index:0}@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{border-bottom:1px solid var(--border-color);border-top:1px solid var(--border-color);bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.pinned-container-content{flex:1 1 auto;overflow:hidden;pointer-events:none;position:relative}.pinned-container .btn-icon{display:flex;flex:0 0 auto;font-size:1.5rem;justify-content:center}.pinned-container-wrapper{align-items:center;border-radius:.25rem;display:flex;flex:1 1 auto;order:1;overflow:hidden;padding:.25rem}.pinned-container-wrapper-utils{align-items:center;display:flex;flex:0 0 auto;position:relative}.pinned-message{display:flex;width:auto}.pinned-message-content{overflow:visible!important}.pinned-message-media-container{height:2rem;margin-left:-.25rem;position:absolute;width:2rem}body.animation-level-2 .pinned-message-media-container{transition:transform var(--pm-transition)}.pinned-message-subtitle,.pinned-message-title{transform:translateX(0)}.pinned-message.is-media .pinned-message-subtitle,.pinned-message.is-media .pinned-message-title{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-subtitle,.pinned-message.is-media .pinned-message-title{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-subtitle,.pinned-message-content .pinned-message-title{height:calc(var(--height)/2);min-height:calc(var(--height)/2);overflow:visible;position:relative}body.animation-level-2 .pinned-message-content .pinned-message-subtitle,body.animation-level-2 .pinned-message-content .pinned-message-title{transition:transform var(--pm-transition)}.pinned-message-title{margin-bottom:.25rem}.pinned-message-subtitle .animated-super-row{font-size:var(--font-size-14);line-height:16px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pinned-message .animated-counter{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){opacity:0;transform:scale(.68)}.pinned-message .animated-super-row{--translateY:16px}.pinned-message .pinned-message-media{--translateY:32px}.pinned-message.hide~.tgico-pinlist,.pinned-message.is-many .pinned-message-close,.pinned-message.is-many.is-floating .pinned-message-close,.pinned-message.is-many:not(.is-floating) .pinned-message-pinlist,.pinned-message:not(.is-many) .pinned-message-pinlist,.pinned-message:not(.is-many)~.tgico-pinlist{display:none}.pinned-message-pinlist{order:2}.chat[data-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){max-width:210px;padding-right:1.75rem;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:var(--font-weight-bold)}.pinned-audio-subtitle{color:var(--secondary-text-color)}.pinned-audio-subtitle,.pinned-audio-title{font-size:var(--font-size-14);line-height:var(--line-height-14);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.pinned-audio-content{margin-left:.75rem}.pinned-audio-progress{--border-radius:0;--height:var(--progress-height);--translateY:.125rem;bottom:0;left:0;position:absolute;right:0;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 var(--transition-standard-out)}body.is-right-column-shown .pinned-audio-progress{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:active,html.no-touch .pinned-audio-progress:hover{--translateY:0}.pinned-audio-progress .progress-line__filled:after{display:none!important}.pinned-audio-progress .progress-line__seek{top:-1rem}.pinned-audio-progress-wrapper{bottom:0;height:.5rem;left:0;overflow:hidden;position:absolute;right:0}.pinned-audio-volume{align-items:center;height:2.5rem;position:relative;width:2.5rem}html.is-touch .pinned-audio-volume{display:none}.pinned-audio-volume-tunnel{bottom:-1rem;content:" ";left:0;position:absolute;right:0;top:100%}.pinned-audio-volume .player-volume__icon{cursor:pointer;display:flex}.pinned-audio-volume .progress-line-container{background-color:var(--surface-color);border-radius:10px;box-shadow:0 1px 5px 0 rgba(0,0,0,.15);margin-top:2.25rem;opacity:0;padding:.75rem 1rem;position:absolute;top:100%;transform:rotate(270deg);transition:opacity .2s ease-in-out,visibility 0s .2s;visibility:hidden;width:5rem}body.animation-level-0 .pinned-audio-volume .progress-line-container{transition:none!important}.pinned-audio-volume:active .progress-line-container,.pinned-audio-volume:hover .progress-line-container{opacity:1;transition:opacity .2s ease-in-out,visibility 0s 0s;visibility:visible}.markup-tooltip{background:var(--surface-color);border-radius:10px;bottom:0;display:flex;height:44px;justify-content:flex-start;left:0;opacity:0;overflow:hidden;position:fixed;right:0;top:0;transform:translateZ(0);transition:opacity var(--layer-transition),transform var(--layer-transition),width var(--layer-transition);width:252px;z-index:1}body.animation-level-0 .markup-tooltip{transition:none}.markup-tooltip-wrapper{align-items:center;display:flex;height:100%;justify-content:flex-start;left:0;max-width:100%;position:absolute;top:0;transform:translateX(0);transition:transform var(--layer-transition);width:672px}body.animation-level-0 .markup-tooltip-wrapper{transition:none}.markup-tooltip-tools{align-items:center;display:flex;flex:0 0 auto;justify-content:space-between;max-width:100%;padding:7px}.markup-tooltip-tools:first-child{width:252px}.markup-tooltip-tools:last-child{width:420px}.markup-tooltip-tools:last-child .markup-tooltip-delimiter{margin:0 .25rem}.markup-tooltip-delimiter{background-color:var(--border-color);height:25px;width:1px}.markup-tooltip .btn-icon{border-radius:8px!important;height:30px;padding:0;width:30px}.markup-tooltip .btn-icon.active{background-color:var(--primary-color)!important;color:#fff!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(-252px)}.markup-tooltip-link-apply{color:var(--primary-color);font-size:2rem}.markup-tooltip-link-apply-container{align-items:center;display:flex;opacity:0;pointer-events:none;transition:opacity var(--layer-transition)}body.animation-level-0 .markup-tooltip-link-apply-container{transition:none}.markup-tooltip .input-clear{flex:1 1 auto;margin:0 .5rem;text-overflow:ellipsis}.markup-tooltip .input-clear.is-valid+.markup-tooltip-link-apply-container{opacity:1;pointer-events:all}.stickers-helper>.scrollable{max-height:13.75rem;min-height:var(--esg-sticker-size);padding:.4375rem;position:relative}.stickers-helper-stickers{border-radius:var(--border-radius);max-width:100%}html.no-touch .stickers-helper .super-sticker:not(.active):active,html.no-touch .stickers-helper .super-sticker:not(.active):hover{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:after,.emoji-helper .super-emojis:before{content:" ";display:inline-block;width:.25rem}html.no-touch .emoji-helper .super-emoji:not(.active):active,html.no-touch .emoji-helper .super-emoji:not(.active):hover{background:none}.emoji-helper .super-emoji.active{background-color:var(--primary-color)!important}.inline-helper{-webkit-user-select:none;-moz-user-select:none;user-select:none}.inline-helper:not(.is-gallery){min-width:min(20rem,100%)}.inline-helper .scrollable{max-height:232px;position:relative}.inline-helper-separator{background-color:var(--border-color);height:1px;margin-left:4rem;width:100%}.inline-helper-separator:last-child{display:none}.inline-helper .btn-primary{border-radius:0;border-radius:initial}.inline-helper-results:not(.is-gallery){cursor:pointer}.inline-helper-results:not(.is-gallery) .inline-helper-result{height:4rem;line-height:var(--line-height);padding:.5rem .5rem .5rem 4rem}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview{height:3rem!important;left:.5rem;overflow:hidden;position:absolute;width:3rem!important}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview.empty{align-items:center;background-color:var(--primary-color);border-radius:.375rem;color:#fff;display:flex;font-size:1.75rem;justify-content:center;text-transform:uppercase}.inline-helper .media-container{border-radius:inherit}.inline-helper .media-photo,.inline-helper .media-poster,.inline-helper .media-video{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.inline-helper .gif{bottom:0;height:auto!important;left:0;position:absolute;right:0;top:0;width:auto!important}.inline-helper-results.is-gallery{grid-gap:1px;border-radius:var(--border-radius);grid-template-columns:repeat(auto-fill,minmax(var(--esg-sticker-size),1fr));max-width:100%}.inline-helper-results.is-gallery .inline-helper-result{height:auto!important;width:auto!important}.inline-helper-result{position:relative}.inline-helper-result-title{font-weight:var(--font-weight-bold);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.inline-helper-result-description{-webkit-line-clamp:2;-webkit-box-orient:vertical;color:var(--secondary-text-color);display:-webkit-box;font-size:.875rem;overflow:hidden;text-overflow:ellipsis;white-space:pre-wrap}.chat-search{left:0;position:absolute!important;right:0;top:0;z-index:2}.chat-search-footer{align-items:center;background-color:var(--surface-color);box-shadow:0 -1px 5px -1px rgba(0,0,0,.21);display:flex;flex:0 0 auto;height:46px;justify-content:space-between;overflow:hidden;padding:0 8px;width:100%}.chat-search-footer .chat-search-count{color:var(--secondary-text-color);margin-left:8px}.chat-search-count:empty,.chat-search-count:not(:empty)+.btn-icon,.chat-search-footer+.chat-input{display:none}.chat-search-controls{display:flex}.chat-search-results{background-color:var(--surface-color);height:100%;left:0;max-height:100%;opacity:0;overflow:hidden;position:absolute;top:0;transition:.2s ease;visibility:hidden;width:100%}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;align-items:center;bottom:var(--padding);display:flex;flex-direction:column;justify-content:center;left:var(--padding);position:absolute!important;right:var(--padding);top:var(--padding);-webkit-user-select:none;-moz-user-select:none;user-select:none;width:auto!important;z-index:3}.drops-container:not(.is-visible){display:none}.drops-container.is-visible{animation:fade-in-opacity .2s linear forwards}.drops-container.is-visible.backwards{animation:fade-in-backwards-opacity .2s linear forwards}.drop{--wrapper-padding:-4px;align-items:center;background-color:var(--surface-color);border-radius:12px;color:#a2acb4;display:flex;flex:1 1 auto;flex-direction:column;justify-content:center;max-width:100%;pointer-events:all;position:relative;transition:color .2s ease-in-out;width:100%}.drop-outline-wrapper{bottom:var(--wrapper-padding);left:var(--wrapper-padding);pointer-events:none;position:absolute;right:var(--wrapper-padding);top:var(--wrapper-padding)}.drop-outline-path{fill:none;stroke-dasharray:13.5,11;stroke:#a2acb4;stroke-width:2;stroke-linecap:round;stroke-dashoffset:0;transition:stroke .2s ease-in-out}.drop.is-dragover .drop-outline-path{stroke:var(--primary-color);animation:drop-outline-move .5s linear infinite}.drop-icon{font-size:6rem}.drop-header{font-size:1.25rem;font-weight:var(--font-weight-bold)}.drop-header:not(:last-child){margin-top:-10px}@media only screen and (max-height:670px){.drop-icon{font-size:0}.drop-header{margin-top:0}}.drop.is-dragover{color:var(--primary-color)}.drop+.drop{margin-top:10px}@keyframes drop-outline-move{0%{stroke-dashoffset:0}to{stroke-dashoffset:-24.5}}body.is-dragging .page-chats{pointer-events:none}.bot-commands{--border-radius-padding:24px;--offset:.5rem;animation:none!important;background-color:transparent!important;border-radius:12px 12px 0 0!important;bottom:calc(100% - var(--border-radius-padding));box-shadow:none;left:calc(var(--offset)*-1);max-height:20rem;max-width:none;overflow:hidden;padding:var(--offset) var(--offset) 0!important;pointer-events:none;position:absolute!important;right:calc(var(--offset)*-1);transition:none!important;visibility:visible!important;width:auto!important}body.animation-level-2 .bot-commands{display:flex!important}.bot-commands .scrollable{background-color:var(--surface-color);border-radius:inherit;box-shadow:0 1px 8px 1px rgba(0,0,0,.12);height:auto;max-height:207px!important;pointer-events:all}body.animation-level-2 .bot-commands .scrollable{opacity:0;transform:translateY(var(--height))}.bot-commands.is-visible.animating .scrollable{transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.bot-commands.is-visible:not(.backwards) .scrollable{opacity:1;transform:translateY(0)}.bot-commands-list{border-radius:inherit;height:var(--height);padding-bottom:0;width:100%}.bot-commands-list-element{align-items:flex-start;border-radius:0!important;flex-direction:column;justify-content:center;padding-left:3.375rem}.bot-commands-list-element-avatar{left:.75rem;position:absolute}.bot-commands-list-element-description,.bot-commands-list-element-name{font-size:.875rem;line-height:var(--line-height-14);margin-left:0}.crop .overlay::-moz-selection,.crop-component::-moz-selection{background:transparent}.crop .overlay::selection,.crop-component::selection{background:transparent}.crop-image,.crop-overlay-image{display:block;height:auto;-o-object-fit:contain;object-fit:contain;-o-object-position:center;object-position:center;width:auto}.crop-image{display:block;pointer-events:none;position:relative}.crop-component{background-color:#fff;margin:0 auto;overflow:hidden;position:relative;z-index:999}.crop-component>img{max-width:100%}.crop-overlay{border-radius:50%;box-sizing:content-box;overflow:hidden;position:absolute;z-index:999}.crop-overlay:active,html.no-touch .crop-overlay:hover{cursor:move}.crop-overlay-image{display:block;position:absolute}.crop-overlay-color{background-color:hsla(0,0%,100%,.7);border-radius:8px;height:100%;left:0;position:absolute;top:0;width:100%}.crop.is-forum .crop-overlay{border-radius:var(--avatar-border-radius-forum)}.sidebar-header{align-items:center;background-color:var(--surface-color);cursor:default;display:flex;flex:0 0 auto;justify-content:space-between;min-height:3.5rem;padding-left:1rem;padding-right:1rem;-webkit-user-select:none;-moz-user-select:none;user-select:none}.sidebar-header .btn-menu{overflow-y:overlay}@media only screen and (max-width:600px){.sidebar-header{padding-left:.5rem;padding-right:.5rem}}[dir=ltr] .sidebar-header__title{padding-left:1.5rem}[dir=rtl] .sidebar-header__title{padding-right:1.5rem}.sidebar-header__title{color:var(--primary-text-color);flex:1;font-size:1.25rem;font-weight:var(--font-weight-bold)}[dir=ltr] .sidebar-header .btn-icon+.btn-icon{margin-left:.5rem}[dir=rtl] .sidebar-header .btn-icon+.btn-icon{margin-right:.5rem}.sidebar-header-right{flex:0 0 auto}.scrollable-y-bordered .sidebar-header{position:relative}.scrollable-y-bordered .sidebar-header:after{background-color:var(--border-color);bottom:-1px;content:" ";height:1px;left:0;opacity:0;position:absolute;right:0;z-index:1}body.animation-level-2 .scrollable-y-bordered .sidebar-header:after{transition:opacity var(--transition-standard-in)}.scrollable-y-bordered:not(.scrolled-top) .sidebar-header:after{opacity:1}.sidebar-close-button{flex:0 0 auto;height:2.5rem;overflow:inherit!important;width:2.5rem}.sidebar-content{display:flex;flex:1 1 auto;height:100%;max-height:100%;overflow:hidden;position:relative;width:100%}.profile-avatars-container{cursor:pointer;padding-bottom:100%;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}html.no-touch .profile-avatars-container:active .profile-avatars-arrow,html.no-touch .profile-avatars-container:hover .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{display:flex;flex-wrap:nowrap;height:100%;position:absolute;transform:translateZ(-1px) scale(2);transform-origin:left top;transition:transform .2s ease-in-out;width:100%}.scrollable.no-parallax .profile-avatars-avatars{transform:translate(0)}.profile-avatars-avatars:before{bottom:0;content:" ";left:0;right:0;top:0}.profile-avatars-avatar{background-color:#000;display:flex;height:inherit;min-height:100%;min-width:100%;position:relative;width:inherit}.profile-avatars-avatar .avatar-photo{height:100%;-o-object-fit:cover;object-fit:cover;pointer-events:none;width:100%}.profile-avatars-gradient{background:linear-gradient(1turn,rgba(0,0,0,.3) 8.98%,transparent);bottom:0;height:80px;left:0;position:absolute;right:0}[dir=ltr] .profile-avatars-info{left:1.5rem}[dir=rtl] .profile-avatars-info{right:1.5rem}.profile-avatars-info{align-items:flex-start;bottom:0;bottom:.5625rem;display:flex;flex-direction:column;pointer-events:none;position:absolute}[dir=ltr] .profile-avatars-info .profile-name,[dir=ltr] .profile-avatars-info .profile-subtitle{text-align:left}[dir=rtl] .profile-avatars-info .profile-name,[dir=rtl] .profile-avatars-info .profile-subtitle{text-align:right}.profile-avatars-info .profile-name,.profile-avatars-info .profile-subtitle{color:#fff;margin:0}.profile-avatars-info .peer-typing-container{--color:#fff}.profile-avatars-info .premium-icon{color:#fff}.profile-avatars-info .verified-icon-background{fill:#fff}.profile-avatars-info .verified-icon-check{visibility:hidden}.profile-avatars-info .premium-icon,.profile-avatars-info .profile-subtitle,.profile-avatars-info .verified-icon{opacity:.7}.profile-avatars-info .online{color:inherit!important}.profile-avatars-tabs{display:flex;height:.125rem;left:.375rem;pointer-events:none;position:absolute;right:.375rem;top:.5rem}.profile-avatars-tab{background-color:#fff;border-radius:4px;flex:1 1 auto;height:inherit;margin:0 .125rem;opacity:.2;transition:opacity .2s ease-in-out}.profile-avatars-tab.active{opacity:.6}.profile-avatars-arrow{bottom:0;left:0;opacity:0;position:absolute;top:0;width:33.3333333333%}.profile-avatars-arrow:before{color:#fff;font-size:2.1875rem;left:.625rem;position:absolute;top:50%;transform:translateY(-50%)}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:active,html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:hover{opacity:1!important}.profile-avatars-arrow-next{left:auto;right:0}.profile-avatars-arrow-next:before{left:auto;right:.625rem}.profile-content{display:flex;flex:0 0 auto;flex-direction:column;position:relative;width:100%}.profile-content .sidebar-left-section{background-color:var(--surface-color);padding-bottom:.5rem;position:relative}.profile-content .sidebar-left-section .profile-subtitle .peer-typing-container{justify-content:center}.profile-content.search-empty .gradient-delimiter{display:none}@media only screen and (max-width:600px){.profile-button{border-radius:0}}[dir=ltr] .profile-change-avatar{right:1.25rem}[dir=rtl] .profile-change-avatar{left:1.25rem}.profile-change-avatar{--size:3.375rem;position:absolute!important;top:calc(var(--size)/-2);transform:none;transition:none!important}.profile-container>.scrollable{display:flex;flex-direction:column}.profile-name{align-items:flex-end;color:var(--primary-text-color);display:flex;font-size:var(--font-size-20);font-weight:var(--font-weight-bold);line-height:var(--line-height-20);margin:0 auto;max-width:21.25rem;overflow:hidden;text-align:center}.profile-name span.emoji{min-width:-moz-min-content;min-width:min-content;vertical-align:inherit}.profile-name .peer-title{overflow:hidden;text-overflow:ellipsis;word-break:break-word}.sidebar-left-section-content>.profile-name{justify-content:center}.profile-name .badge-fake{align-self:center}.profile-subtitle{align-items:center;color:var(--secondary-text-color);display:flex;font-size:.875rem;justify-content:center;margin-bottom:.875rem;margin-top:1px;text-align:center}@media only screen and (max-width:600px){.profile-subtitle{margin-top:3px}}.profile-subtitle .online{color:var(--primary-color)}.profile-avatar{display:block;margin:.5rem auto 10px}@media only screen and (max-width:600px){.profile-avatar{--size:100px;--multiplier:.54;margin:0 auto 10px}}.profile-avatar,.profile-name,.profile-subtitle{flex:0 0 auto}.menu-horizontal-scrollable{--scrollable-size:3rem;height:var(--scrollable-size)}.menu-horizontal-scrollable:after{border-bottom:1px solid var(--border-color);bottom:0;content:" ";height:1px;left:0;position:absolute;right:0;z-index:-1}.menu-horizontal-scrollable .menu-horizontal-div{border-bottom:none}.menu-horizontal-div{--size:var(--scrollable-size,3rem);--padding-horizontal:0px;border-bottom:1px solid var(--border-color);color:var(--secondary-text-color);display:flex;flex-direction:row;height:var(--size);justify-content:space-around;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:2}.menu-horizontal-div:not(.no-stripe):after,.menu-horizontal-div:not(.no-stripe):before{content:" ";flex:0 0 auto;width:var(--padding-horizontal)}.menu-horizontal-div:not(.no-stripe) .menu-horizontal-div-item{border-radius:10px 10px 0 0}.menu-horizontal-div-item{align-items:center;border-radius:0;cursor:pointer;display:flex;flex:1 1 auto;font-size:1rem;font-weight:var(--font-weight-bold);height:100%;justify-content:center;line-height:var(--line-height);padding:0 1rem;position:relative;text-align:center;transition:none!important}html.no-touch .menu-horizontal-div-item:active,html.no-touch .menu-horizontal-div-item:hover{background-color:var(--light-secondary-text-color)}.menu-horizontal-div-item.active{color:var(--primary-color)}.menu-horizontal-div-item.active i{opacity:1}.menu-horizontal-div-item.active .c-ripple__circle,html.no-touch .menu-horizontal-div-item.active:active,html.no-touch .menu-horizontal-div-item.active:hover{background-color:var(--light-primary-color)}.menu-horizontal-div-item.active .badge{background-color:var(--primary-color)}.menu-horizontal-div-item>span{align-items:center;display:inline-flex;overflow:visible;pointer-events:none;position:relative}.menu-horizontal-div i{background-color:var(--primary-color);border-radius:.1875rem .1875rem 0 0;bottom:-.8125rem;box-sizing:content-box;height:.1875rem;left:0;opacity:0;pointer-events:none;position:absolute;transform-origin:left;width:100%;z-index:1}.menu-horizontal-div i.animate{transition:transform var(--tabs-transition)}.tabs-container{display:grid;grid-template-columns:100%;grid-template-rows:100%;min-width:100%;width:100%}.tabs-container .tabs-tab{background-color:var(--background-color);display:none;flex-direction:column;grid-column-start:1;grid-row-start:1;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 var(--tabs-transition)}.tabs-container[data-animation=navigation].animating .tabs-tab{transition:transform var(--transition-standard-in),filter var(--transition-standard-in)}.tabs-container[data-animation=navigation].animating.backwards .tabs-tab{transition:transform var(--transition-standard-out),filter var(--transition-standard-out)}#column-left{flex:1 1 auto;flex-direction:column;max-width:420px;width:420px}@media only screen and (max-width:600px){#column-left{max-width:100%;width:100%}body:not(.is-left-column-shown) #column-left{filter:brightness(80%);transform:translate3d(-25vw,0,0)}}@media only screen and (min-width:601px){#column-left{overflow:visible}[dir=ltr] #column-left:after{right:-1px}[dir=rtl] #column-left:after{left:-1px}#column-left:after{background-color:var(--border-color);content:" ";display:block;height:100vh;position:absolute;top:0;width:1px;z-index:2}}@media only screen and (min-width:601px)and (max-width:925px){#column-left{display:flex;left:0;max-width:none;position:fixed;top:0;transform:translate3d(-5rem,0,0);transition:transform var(--layer-transition);width:26.5rem}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:418.75px}}#column-left .item-main .menu-horizontal-scrollable{background-color:var(--surface-color);position:relative;top:auto;z-index:1}@media only screen and (max-width:600px){#column-left .item-main .menu-horizontal-scrollable{box-shadow:0 1px 5px -1px rgba(0,0,0,.16)}}#column-left .item-main .menu-horizontal-scrollable .scrollable{position:relative}[dir=ltr] #column-left .item-main .menu-horizontal-scrollable .badge{margin-left:5px}[dir=rtl] #column-left .item-main .menu-horizontal-scrollable .badge{margin-right:5px}#column-left .item-main .menu-horizontal-scrollable:not(.hide)+#folders-container{height:calc(100% - var(--scrollable-size));position:relative}#column-left .item-main .menu-horizontal-scrollable:not(.hide)+#folders-container .scrollable{padding-top:.5rem}#column-left .item-main .menu-horizontal-scrollable:not(.hide)+#folders-container .dialogs-placeholder-canvas{top:.5rem}#column-left .item-main .menu-horizontal-div{--padding-horizontal:.6875rem;justify-content:flex-start;position:relative!important;z-index:0}@media only screen and (max-width:600px){#column-left .item-main .menu-horizontal-div{--padding-horizontal:.1875rem}}#column-left .item-main .menu-horizontal-div-item{flex:0 0 auto;min-width:3rem}#column-left .item-main .menu-horizontal-div__stripe{display:none}#column-left .folders-tabs-scrollable{flex:0 0 auto}#column-left .item-main{--offset-top:0;background-color:var(--surface-color)}[dir=ltr] #column-left .item-main .input-search .selector-user{left:6px}[dir=rtl] #column-left .item-main .input-search .selector-user{right:6px}[dir=ltr] #column-left .item-main .input-search .selector-user{margin-left:0}[dir=rtl] #column-left .item-main .input-search .selector-user{margin-right:0}#column-left .item-main .input-search .selector-user{height:30px;line-height:1.875rem;position:absolute!important;top:6px;z-index:1}[dir=ltr] #column-left .item-main .input-search.is-picked .input-search-input{padding-left:calc(var(--paddingLeft) + 12px - var(--border-width))}[dir=rtl] #column-left .item-main .input-search.is-picked .input-search-input{padding-right: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}[dir=ltr] #column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{left:38px}[dir=rtl] #column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{right:38px}[dir=ltr] #column-left .item-main .search-helper{margin-left:28px}[dir=rtl] #column-left .item-main .search-helper{margin-right:28px}#column-left .item-main .search-helper{display:flex}@media only screen and (max-width:600px){[dir=ltr] #column-left .item-main .search-helper{margin-left:20px}[dir=rtl] #column-left .item-main .search-helper{margin-right:20px}}#column-left .item-main .search-helper .selector-user{font-size:14px;margin-top:7px}html.no-touch #column-left .item-main .search-helper .selector-user:active,html.no-touch #column-left .item-main .search-helper .selector-user:hover{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{background-color:var(--surface-color);max-height:100%;position:relative}#column-left #chatlist-container.has-filters .connection-status-bottom{height:calc(100% + var(--offset-top)*-1)}#column-left #folders-container{flex:1 1 auto}#column-left #folders-container .scrollable-y{background-color:transparent;position:absolute}#column-left #folders-container .scrollable-y.active{display:block}#column-left .dialogs-placeholder-canvas{position:absolute;top:0;z-index:2}#column-left .sidebar-slider{height:100%}#column-left .sidebar-header__btn-container{align-items:center;display:flex;flex:0 0 auto;height:2.5rem;justify-content:center;position:relative;width:2.5rem}#column-left .sidebar-header__btn-container>.btn-icon{bottom:0;left:0;margin:0;opacity:0;position:absolute;right:0;top:0;visibility:hidden;z-index:4}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:-.25rem}}#column-left .sidebar-tools-button{width:100%}#column-left .sidebar-tools-button .btn-menu{max-height:calc(var(--vh)*100 - 3.75rem);min-width:260px}[dir=ltr] #column-left .sidebar-tools-button .btn-menu-item{padding-right:.375rem}[dir=rtl] #column-left .sidebar-tools-button .btn-menu-item{padding-left:.375rem}[dir=ltr] #column-left .archived-count{margin-left:.625rem}[dir=rtl] #column-left .archived-count{margin-right:.625rem}#column-left .archived-count{justify-self:flex-end}html[dir=ltr].is-mobile #column-left .archived-count{margin-right:.375rem}html[dir=rtl].is-mobile #column-left .archived-count{margin-left:.375rem}@media only screen and (max-width:600px){#column-left .archived-count{font-weight:var(--font-weight-bold)}}#column-left .archived-count:empty{display:none}#column-left .search-group-people .chatlist{display:flex;flex-direction:row;margin-top:-1px;padding:0 0 1px}#column-left .search-group-people .chatlist:after,#column-left .search-group-people .chatlist:before{content:"ย ";display:inline-block;flex:0 0 auto;width:.3125rem}#column-left .search-group-people .chatlist-chat{align-items:center;border-radius:10px;display:flex;flex:0 0 auto;flex-direction:column;height:6.125rem;justify-content:flex-end;max-width:4.875rem;padding:0!important;width:4.875rem}#column-left .search-group-people .dialog-subtitle,#column-left .search-group-people .dialog-title-details{display:none}#column-left .search-group-people .dialog-title{max-width:65px;padding-bottom:.75rem}#column-left .search-group-people .dialog-title .user-title{font-size:.75rem!important}#column-left .search-group-people .dialog-title .peer-title{font-weight:var(--font-weight-normal)!important}[dir=ltr] #column-left .search-group-people .dialog-avatar{left:auto!important}[dir=rtl] #column-left .search-group-people .dialog-avatar{right:auto!important}#column-left .search-group-people .dialog-avatar{top:.75rem!important}#column-left .search-group-people .search-group-scrollable{position:relative}@media only screen and (max-width:600px){[dir=ltr] #column-left .search-group-people .search-group-scrollable{margin-left:-7px}[dir=rtl] #column-left .search-group-people .search-group-scrollable{margin-right:-7px}#column-left .search-group-people .search-group-scrollable{margin-top:4px}}#column-left .search-group-people .search-group-scrollable>.scrollable{position:relative}#column-left .item-main .sidebar-content{justify-content:center}#column-left .item-main .sidebar-content .btn-menu{bottom:calc(100% + 10px)}#column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close,#column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled{visibility:visible!important}body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close,body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled{animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-width:600px){#column-left .item-main .sidebar-content .btn-corner{--size:54px;bottom:14px;position:fixed!important;right:14px;z-index:1}}#column-left .item-main .sidebar-content .btn-corner:not(.is-hidden){transform:translateZ(0)}#column-left .connection-status{flex:0 0 auto;overflow:hidden;padding:0 .5rem .5rem;width:100%}#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 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))}[dir=ltr] #column-left .connection-status-button{padding-left:4.5rem}[dir=rtl] #column-left .connection-status-button{padding-right:4.5rem}[dir=ltr] #column-left .connection-status-button{text-align:left}[dir=rtl] #column-left .connection-status-button{text-align:right}#column-left .connection-status-button{align-self:center;color:#2e3939;cursor:default;height:3.5rem;transform:translateY(-100%)}#column-left .connection-status-button .force-reconnect{color:inherit;cursor:pointer;text-decoration:underline}[dir=ltr] #column-left .connection-status-button .preloader-container{left:1rem}[dir=rtl] #column-left .connection-status-button .preloader-container{right:1rem}#column-left .connection-status-button .preloader-container{height:1.5rem;right:auto;width:1.5rem}#column-left .connection-status-button .preloader-container .preloader-path-new{stroke:#2e3939}#column-left .connection-status-bottom{--offset-top:0px;background-color:var(--surface-color);bottom:0;display:flex;flex-direction:column;height:100%;left:0;overflow:hidden;position:absolute;right:0;top:0;transform:translateY(var(--offset-top))}#column-left .input-wrapper{flex:0 0 auto;margin:.75rem 0;max-width:100%;padding:0 .75rem;width:420px}@media only screen and (max-width:600px){#column-left .input-wrapper{width:100%}}#search-container{display:flex;top:var(--offset-top)!important}#search-container .scrollable-y{flex:1 1 auto;position:relative}.edit-profile-container .sidebar-content,.new-channel-container .sidebar-content,.new-group-container .sidebar-content{flex-direction:column}.edit-profile-container .chatlist-container,.new-channel-container .chatlist-container,.new-group-container .chatlist-container{flex:1 1 auto}[dir=ltr] .edit-profile-container .caption,[dir=ltr] .new-channel-container .caption,[dir=ltr] .new-group-container .caption{margin-left:23px}[dir=rtl] .edit-profile-container .caption,[dir=rtl] .new-channel-container .caption,[dir=rtl] .new-group-container .caption{margin-right:23px}[dir=ltr] .edit-profile-container .caption,[dir=ltr] .new-channel-container .caption,[dir=ltr] .new-group-container .caption{padding-right:24px}[dir=rtl] .edit-profile-container .caption,[dir=rtl] .new-channel-container .caption,[dir=rtl] .new-group-container .caption{padding-left:24px}.edit-profile-container .caption,.new-channel-container .caption,.new-group-container .caption{color:var(--secondary-text-color);font-size:.875rem;margin-top:14px}.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}.settings-container .profile-avatars-container{height:15rem;padding-bottom: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;user-select:none}.chat-folders-container .sticker-container,.edit-folder-container .sticker-container,.people-nearby-container .sticker-container{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.chat-folders-container .caption,.edit-folder-container .caption,.people-nearby-container .caption{color:var(--secondary-text-color);font-size:var(--font-size-14);line-height:var(--line-height-14);margin:0 auto;max-width:20rem;text-align:center}.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}.edit-folder-container .caption{margin-bottom:18px}@media only screen and (max-width:600px){.edit-folder-container .input-wrapper{padding:0 16px;width:100%}}.edit-folder-container .sidebar-left-section{padding-bottom:0}.edit-folder-container .sidebar-left-section:last-child{padding-bottom:.5rem}.folder-categories .checkbox-field{position:absolute;right:1.125rem!important}.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}[dir=ltr] .included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-left:26px}[dir=rtl] .included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-right:26px}[dir=ltr] .included-chatlist-container .chatlist-chat{padding-right:3.5rem!important}[dir=rtl] .included-chatlist-container .chatlist-chat{padding-left:3.5rem!important}.search-group-recent .search-group__name{align-items:center;display:flex;justify-content:space-between}.search-group-recent .btn-icon{font-size:22px}@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:0 0 7px}}.sidebar-left-section{padding:.5rem 0 1rem}.sidebar-left-section.with-fake-delimiter{box-shadow:none;padding-top:0!important}.sidebar-left-section.with-fake-delimiter .gradient-delimiter{margin-bottom:.5rem}.sidebar-left-section.no-padding-top{padding-top:0!important}@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}[dir=ltr] .sidebar-left-section-content>.checkbox-field .checkbox-box{left:auto}[dir=rtl] .sidebar-left-section-content>.checkbox-field .checkbox-box{right:auto}@media only screen and (max-width:600px){.sidebar-left-section-content>.btn-primary,.sidebar-left-section-content>.checkbox-ripple{border-radius:0}}.sidebar-left-section-content.full-width{margin:0!important}.sidebar-left-section-content>.media-sticker-wrapper{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.sidebar-left-section-name{padding:1rem}@media only screen and (max-width:600px){.sidebar-left-section-name{font-size:.875rem;padding:.5rem 1rem}}.sidebar-left-section-caption{color:var(--secondary-text-color);font-size:1rem;line-height:var(--line-height);margin-top:1rem;padding:0 1rem}@media only screen and (max-width:600px){.sidebar-left-section-caption{font-size:.875rem;margin:.5rem}}.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{align-items:center;display:flex;height:3.5rem;padding:0 1.125rem}.sidebar-left-section-disabled{opacity:.25;pointer-events:none!important}.sidebar-left-section .chatlist{padding:0}.sidebar-left-h2{color:var(--primary-color);font-size:16px;font-weight:var(--font-weight-bold)}.general-settings-container{-webkit-user-select:none;-moz-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,#poll-results-container,#search-gifs-container,#search-private-container,#stickers-container,.add-members-container{background-color:var(--surface-color)!important}.chat-folders-container .btn-control{margin-bottom:1.5rem}.two-step-verification{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{margin-bottom:1.125rem;margin-left:auto;margin-right:auto;max-width:342px;text-align:center}.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{height:168px;margin:.625rem auto 1.1875rem;width:168px}.two-step-verification .input-wrapper .btn-primary:first-child:last-child{margin-top:.25rem}.two-step-verification-enter-password .media-sticker-wrapper{height:157px;margin:1.125rem auto 1.8125rem;width:157px}.two-step-verification-hint .media-sticker-wrapper{height:160px;margin:.5rem auto 2.25rem;width:160px}.two-step-verification-email .media-sticker-wrapper{height:160px;margin:.5625rem auto 2.1875rem;width:160px}.two-step-verification-set .media-sticker-wrapper{height:160px;margin:1rem auto 1.3125rem;width:160px}[dir=ltr] .two-step-verification-set .media-sticker-wrapper .rlottie,[dir=ltr] .two-step-verification-set .media-sticker-wrapper .rlottie-vector{left:.625rem}[dir=rtl] .two-step-verification-set .media-sticker-wrapper .rlottie,[dir=rtl] .two-step-verification-set .media-sticker-wrapper .rlottie-vector{right:.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-title:first-child{font-weight:var(--font-weight-bold)}.active-sessions-container .row-title-right{color:var(--secondary-text-color);font-size:var(--font-size-12);line-height:var(--line-height-12)}.active-sessions-container .row-midtitle,.active-sessions-container .row-subtitle{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.active-sessions-container .sidebar-left-section:first-child{padding-bottom:0}.active-sessions-container .sidebar-left-section:first-child .row-title{font-weight:var(--font-weight-bold)}@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:var(--primary-text-color)}.range-setting-selector-value{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:var(--primary-color)}.background-container .background-item:after{border:3px solid var(--primary-color);bottom:0;content:" ";display:block;left:0;opacity:0;position:absolute;right:0;top:0;transition:opacity .2s ease-in-out}.background-container .background-item.active:after{opacity:1}.background-container .background-item.active .grid-item-media{transform:scale(.91)}.background-container .background-item-media{transform:scale(1);transition:transform .2s ease-in-out}.background-container .background .preloader-container{z-index:1}.background-item{cursor:pointer}.background-item-media{border-radius:inherit}.background-item-media.is-pattern{background-color:#000;bottom:0;left:0;position:absolute;right:0;top:0}.background-item-media.is-pattern .media-photo{mix-blend-mode:soft-light}.background-item .media-photo{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.background-colors-canvas{border-radius:inherit;height:100%;-webkit-mask-position:center;-webkit-mask-size:cover;position:absolute;width:100%}.background-image-container .sidebar-left-section{padding-bottom:.5rem}.empty-placeholder{line-height:var(--line-height);margin:0 auto;padding:0 1rem;position:relative;text-align:center;top:40%;transform:translateY(-50%);-webkit-user-select:none;-moz-user-select:none;user-select:none;width:21rem!important}.empty-placeholder .media-sticker-wrapper{height:128px;margin:0 auto 1.9375rem;position:relative;width:128px}.empty-placeholder-header{font-size:1.25rem;font-weight:var(--font-weight-bold)}.empty-placeholder-subtitle{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}[dir=ltr] .empty-placeholder .btn-control:before{margin-right:.625rem}[dir=rtl] .empty-placeholder .btn-control:before{margin-left:.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}.is-forum-visible .can-have-forum .input-search,.is-forum-visible .can-have-forum .row-row,.is-forum-visible .can-have-forum .sidebar-header__title{opacity:0}.is-forum-visible .folders-tabs-scrollable{opacity:var(--disabled-opacity);pointer-events:none}.is-forum-visible.backwards .can-have-forum .input-search,.is-forum-visible.backwards .can-have-forum .row-row,.is-forum-visible.backwards .can-have-forum .sidebar-header__title,.is-forum-visible.backwards .folders-tabs-scrollable{opacity:1}.is-forum-visible.animating .can-have-forum .input-search,.is-forum-visible.animating .can-have-forum .row-row,.is-forum-visible.animating .can-have-forum .sidebar-header__title,.is-forum-visible.animating .folders-tabs-scrollable{transition:opacity var(--transition-standard-in)}.is-forum-visible.animating.backwards .can-have-forum .input-search,.is-forum-visible.animating.backwards .can-have-forum .row-row,.is-forum-visible.animating.backwards .can-have-forum .sidebar-header__title,.is-forum-visible.animating.backwards .folders-tabs-scrollable{transition:opacity var(--transition-standard-out)}#column-right{overflow:visible;overflow:initial;position:relative}@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)and (max-width:925px){body.is-right-column-shown:not(.is-left-column-shown) #column-right{transform:translateZ(0);transition:transform var(--transition-standard-in)}}@media only screen and (min-width:926px){body.is-right-column-shown #column-right{transform:translateZ(0);transition:transform var(--transition-standard-in)}}@media only screen and (min-width:601px){#column-right{position:absolute;right:0;transform:translate3d(var(--right-column-width),0,0);transition:transform var(--transition-standard-out);width:calc(var(--right-column-width));z-index:3}#column-right .sidebar-content{min-width:var(--right-column-width)}body.animation-level-0 #column-right{transition:none}}@media only screen and (min-width:1276px){#column-right{border-left:1px solid var(--border-color);transform:translate3d(calc(var(--right-column-width) + 1px),0,0);width:calc(var(--right-column-width) + 1px)}}#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{flex:1 1 auto;position:relative}#column-right .sidebar-search{display:none}#column-right .sidebar-search.active{display:flex}#column-right .input-wrapper{margin:.75rem 0;max-width:100%;padding:0 .75rem;width:100%}.shared-media-container .scrollable:not(.no-parallax){perspective:0;perspective-origin:0 0}.shared-media-container .scrollable:not(.no-parallax).parallax{perspective:1px}.shared-media-container .profile-content.is-me .profile-name{margin-bottom:.9375rem}.shared-media-container .profile-content.is-me .profile-subtitle{display:none}.shared-media-container .search-super{min-height:calc(var(--vh, 1vh)*100 - 56px);top:100%}.shared-media-container .search-super-tabs{--padding-horizontal:0}.shared-media-container .search-super-tabs .menu-horizontal-div-item{border-radius:0!important}.shared-media-container .sidebar-header .transition{flex-grow:1}.shared-media-container .sidebar-header .transition .transition-item{align-items:center;display:flex}.shared-media-container .btn-corner.menu-open:before{content:"๎คฉ"}@media only screen and (max-width:600px){.shared-media-container .btn-corner{bottom:14px;height:54px;position:fixed!important;right:14px;width:54px;z-index:1}}.shared-media-container.can-add-members .btn-corner:not(.is-hidden){transform:translateZ(0)}.search-super{background-color:var(--surface-color);display:flex;flex-direction:column;max-width:100%;min-height:100%;position:absolute;width:100%}.search-super .search-group__show-more{color:var(--primary-color);cursor:pointer;font-weight:400}.search-super .search-super-month-name{border-top:1px solid var(--border-color);color:var(--secondary-text-color);font-weight:var(--font-weight-bold);padding:24px 0 0 24px}@media only screen and (max-width:600px){.search-super .search-super-month-name{padding:18px 0 0 16px}}.search-super.sliding{max-height:none!important}.search-super-tabs{flex:1 1 auto;width:auto}.search-super-tabs-scrollable{background-color:var(--surface-color);box-shadow:none!important;position:sticky!important;top:0;z-index:2}.search-super-tabs-scrollable:before{background-color:inherit;content:" ";display:block;height:1px;left:0;position:absolute;top:0;width:100%;z-index:-1}.search-super.is-full-viewport .search-super-tabs-scrollable:before{top:-1px}.search-super-tabs-scrollable .scrollable{display:flex;position:relative}.search-super-tabs-container{flex:1 1 auto;grid-template-rows:100%;min-height:calc(100% - 49px)}.search-super-tabs-container>div{background-color:var(--surface-color)!important;min-height:150px;position:relative}.search-super-tabs-container>div>div:first-child{min-height:calc(100vh - 111px);transform:translateY(0)}.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 .audio-title,.search-super .document-name,.search-super .title{display:flex;justify-content:space-between}.search-super .sent-time{color:var(--secondary-text-color);flex:0 0 auto;font-size:12px;margin-left:8px;margin-top:3px}.search-super-content-media .search-super-month-name{border:none;padding:9px 0 7px 24px}.search-super-content-media .video-time{background-color:var(--message-time-background);border-radius:4px;color:#fff;font-size:12px;height:18px;left:5px;line-height:18px;padding:0 6px 0 5px;position:absolute;top:4px;z-index:2}.search-super-content-media .grid-item{overflow:hidden}.search-super-content-media .checkbox-field{right:.25rem;top:.25rem}.search-super .checkbox-box{box-shadow:0 0 3px 0 rgba(0,0,0,.4)}.search-super .checkbox-box-border{border-color:var(--message-checkbox-border-color)}.search-super .checkbox-box-background{background-color:var(--message-checkbox-color)}.search-super .checkbox-field{margin:0;position:absolute!important;z-index:2}.search-super-content-media .search-super-month-items{grid-gap:1px;display:grid;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr);padding-top:1px;width:100%}.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{--icon-size:3rem;--icon-margin:.75rem;height:calc(48px + 1.5rem)}.search-super-content-files .document-download,.search-super-content-files .document-ico{border-radius:5px!important}.search-super-content-files .document-name{font-weight:400;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.search-super-content-links .search-super-item{cursor:pointer;display:flex;flex-direction:column;justify-content:flex-start;min-height:4.375rem;overflow:hidden;padding-left:4.4375rem;position:relative}.search-super-content-links .row-media{border-radius:.375rem;height:3rem;left:.6875rem;overflow:hidden;position:absolute;width:3rem}.search-super-content-links .row-media.empty{align-items:center;background-color:var(--primary-color);color:#fff;display:flex;font-size:2rem;justify-content:center;text-transform:uppercase}.search-super-content-links a:not(:last-child){position:relative;z-index:2}.search-super-content-links .anchor-url:last-child{position:static}.search-super-content-links .anchor-url:last-child:before{bottom:0;content:" ";cursor:pointer;left:0;position:absolute;right:0;top:0;z-index:1}.search-super-content-links .media-photo{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.search-super-content-links .row-title{margin-top:.1875rem}.search-super-content-links .row-subtitle{overflow:hidden;text-overflow:ellipsis;white-space:pre-wrap;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{--offset-left:0!important;margin:2rem 0 0 -1.75rem!important;padding:0!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 0 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 0 12px}}.search-super-content-music .audio,.search-super-content-voice .audio{justify-content:normal;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-bottom:.5rem;padding-top:.5rem}.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{align-items:center;bottom:0;display:flex;justify-content:space-between;left:0;opacity:0;padding:0 1rem;position:absolute;right:0;top: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{color:var(--primary-text-color);flex-grow:1;font-weight:var(--font-weight-bold);margin-left:1.5rem;text-transform:capitalize;white-space:nowrap}#search-container .search-group.is-short .chatlist-chat:nth-child(n+4),#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-description:before,#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-time{display:none}#stickers-container .sticker-sets{display:flex;flex-direction:column;margin-top:16px}#stickers-container .sticker-set{cursor:pointer;display:flex;flex-direction:column;height:140px}#stickers-container .sticker-set-name{font-weight:var(--font-weight-bold)}#stickers-container .sticker-set-count{color:var(--secondary-text-color);font-size:14px}#stickers-container .sticker-set-header{display:flex;justify-content:space-between;padding-bottom:12px;padding-left:16px}#stickers-container .sticker-set-button{border-radius:16px;font-size:15px;font-weight:400;height:30px;margin-right:16px;padding-left:12px;padding-right:13px;transition:width .2s;width:auto}#stickers-container .sticker-set-button.gray{background:#f1f3f4;color:var(--secondary-text-color)}#stickers-container .sticker-set-stickers{display:flex;justify-content:space-around}#stickers-container .sticker-set-sticker{height:68px;position:relative;width:68px}#stickers-container .sticker-set-sticker:hover{background-color:var(--light-secondary-text-color);border-radius:12px}#stickers-container .sticker-set-sticker img{max-height:100%;max-width:100%}#poll-results-container .poll-results{display:flex;flex-direction:column;position:relative;width:100%}#poll-results-container .poll-results-answer{color:var(--secondary-text-color);display:flex;font-size:15px;font-weight:var(--font-weight-bold);justify-content:space-between;margin:0;padding:0 16px 8px;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (min-width:601px){#poll-results-container .poll-results-answer{padding:0 24px 8px}}#poll-results-container .poll-results-more{margin:0 .5rem;width:auto}@media only screen and (max-width:600px){#poll-results-container .poll-results-more{border-radius:0;margin:0}}#poll-results-container .poll-results h3{font-size:20px;margin-bottom:16px;margin-top:15px;padding:0 16px}@media only screen and (min-width:601px){#poll-results-container .poll-results h3{padding:0 24px}}#poll-results-container .poll-results hr{display:block!important;margin-bottom:15px;margin-top:7px}.edit-peer-container .input-wrapper{margin-bottom:.5625rem!important}.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!important}.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:var(--line-height)}.group-type-container .sidebar-left-section-caption{font-size:.875rem;margin-top:.8125rem}.group-type-container .input-wrapper{margin-top:.875rem!important}.media-viewer{align-items:center;background:rgba(0,0,0,.88);bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0}@media only screen and (max-width:600px){.media-viewer{background:#000}}.media-viewer-author{align-items:center;cursor:pointer;display:flex;height:100%}@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{font-weight:var(--font-weight-bold);line-height:var(--line-height);margin:.0625rem 0}@media only screen and (min-width:601px){.media-viewer-name{margin:.0625rem 0 .125rem}}.media-viewer-date{font-size:.875rem;line-height:var(--line-height)}.media-viewer-buttons{display:flex;flex-flow:row nowrap;padding:.5rem .75rem;position:absolute;right:0;top:0}.media-viewer-buttons .btn-icon{margin:0 .25rem;transition:var(--open-duration)}html.no-touch .media-viewer-buttons .btn-icon:active,html.no-touch .media-viewer-buttons .btn-icon:hover{color:#fff}@media only screen and (max-width:600px){.media-viewer-buttons{display:none}}.media-viewer-content{flex-direction:column;height:100%;justify-content:center}.media-viewer-container,.media-viewer-content{align-items:center;display:flex;max-height:100%;max-width:100%;overflow:hidden}.media-viewer-container{align-self:center;flex:1 1 auto;position:relative}.media-viewer-media{visibility:hidden}.media-viewer-caption{background-color:transparent;bottom:0;color:#fff;left:0;line-height:var(--line-height);opacity:0;overflow:hidden;padding:.5rem .5rem 0;position:absolute;right:0;text-align:center;text-overflow:ellipsis;white-space:pre-wrap;word-break:break-word;z-index:4}body.animation-level-2 .media-viewer-caption{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{height:6rem;margin:0 auto;max-height:6rem;max-width:50rem;padding:.5rem .875rem;position:relative}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{bottom:1.0625rem;text-align:inherit;transform:translateZ(0);width:100%}.media-viewer-caption .scrollable{height:auto;padding:0 .5rem}.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:active,html.no-touch .media-viewer-caption:hover{background-color:#000;opacity:1!important}}.media-viewer-caption.is-focused{background-color:#000;opacity:1!important}.media-viewer-switcher{cursor:pointer;height:calc(100% - 7.5rem);left:0;position:absolute;top:3.75rem;width:7rem}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-next-button,.media-viewer-prev-button{color:#fff;cursor:pointer;font-size:2rem;left:1rem;opacity:0;position:absolute;top:50%;transform:translateY(-50%) rotate(90deg);transition:var(--open-duration) opacity;z-index:5}@media only screen and (min-width:601px){.media-viewer-next-button,.media-viewer-prev-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{align-items:center;border-radius:0;display:flex;justify-content:center;left:0;min-height:auto!important;overflow:hidden;position:fixed!important;top:0;transform:translateZ(0) scaleX(1);transform-origin:top left}.media-viewer-mover:not(.center){-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}@media only screen and (max-width:600px){.media-viewer-mover{overflow:visible}}.media-viewer-mover .ckin__player{height:100%;left:0;position:absolute;top:0;width:100%}.media-viewer-mover>svg{height:100%;width:100%}.media-viewer-mover .canvas-thumbnail,.media-viewer-mover img,.media-viewer-mover video{height:100%;max-height:100%;max-width:100%;-o-object-fit:cover;object-fit:cover;opacity:1;position:absolute;transition:var(--open-duration) opacity;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.media-viewer-mover svg img,.media-viewer-mover svg video{position:static}.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;max-height:calc(var(--vh, 1vh)*100 - 15rem);max-width:100vw;top:50%!important;transform:translate3d(-50%,-50%,0)!important}@media only screen and (max-width:600px){.media-viewer-mover.center{height:100%!important;max-height:calc(var(--vh, 1vh)*100 - 120px);max-width:100vw!important;width:100%!important}.media-viewer-mover.center .ckin__player:not(.ckin__fullscreen) .default__controls{bottom:-62px}}.media-viewer-mover.center .canvas-thumbnail,.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{-o-object-fit:contain;object-fit:contain;width:auto}.media-viewer-mover.hiding .canvas-thumbnail,.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{align-items:center;display:flex;height:3.5rem;justify-content:space-between;left:0;padding:0 1.25rem;position:absolute;right:0;top:0;z-index:5}.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:active,html.no-touch .media-viewer-topbar .btn-icon:hover,html.no-touch .media-viewer-topbar .media-viewer-author:active,html.no-touch .media-viewer-topbar .media-viewer-author:hover{opacity:1}.media-viewer-topbar-left{align-items:center;display:flex}@media only screen and (max-width:600px){.media-viewer-topbar{padding:0 .5rem}}.media-viewer-aspecter{align-items:center;border-radius:0;display:flex;height:100%;justify-content:center;position:absolute;transform:scaleX(1);width:100%}.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;display:block;height:100%;left:0;position:fixed!important;top:0;transition:visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}body.animation-level-0 .media-viewer-whole{--open-duration:0s;--move-duration:0s}.media-viewer-whole.active{transition-delay:0s;visibility:visible}.media-viewer-whole.active .media-viewer-appear,.media-viewer-whole.active .overlays{opacity:1;visibility:visible}body.animation-level-2 .media-viewer-whole.active .media-viewer-appear,body.animation-level-2 .media-viewer-whole.active .overlays{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:not(.playback-rate){color:hsla(0,0%,100%,.4);opacity:1}.media-viewer-whole .btn-menu-toggle:not(.playback-rate).menu-open{background-color:hsla(207,4%,46%,.2)!important;color:#fff}.media-viewer-whole.hide-caption .media-viewer-caption{opacity:0!important;pointer-events:none}}.media-viewer-whole.highlight-switchers .media-viewer-switcher>span{opacity:1}.media-viewer-whole.no-forwards .canvas-thumbnail,.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;user-select:none}.media-viewer-movers{bottom:0;left:0;position:absolute;right:0;top: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{align-items:center;background-color:rgba(0,0,0,.4);border-radius:12px;bottom:1.25rem;display:flex;height:3.375rem;justify-content:space-between;left:50%;opacity:1;padding:.5rem;position:absolute;transform:translateX(-50%);width:17.125rem;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{opacity:.4;pointer-events:none}.zoom-container .progress-line{--color:#fff;--height:2px;flex:1 1 auto;margin:0 1px}.zoom-container .progress-line:before{opacity:1}.media-viewer-whole:not(.active) .zoom-container,.zoom-container:not(.is-visible){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{background-color:rgba(0,0,0,.2);height:100%;left:0;opacity:0;position:fixed!important;top:0;transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}.emoji-dropdown{background:var(--surface-color);display:flex;flex:1 1 auto;flex-direction:column;height:min(282px,calc(var(--vh)*100 - 135px));max-height:100%;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:var(--esg-width)}@media only screen and (min-height:570px)and (min-width:601px){.emoji-dropdown{-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:var(--menu-background-color);border-radius:1.25rem;bottom:5.125rem;box-shadow:0 5px 10px 5px rgba(16,35,47,.14);height:26.25rem;left:.8125rem;max-height:26.25rem;opacity:0;position:absolute!important;transform:scale(0);transform-origin:0 100%;transition:transform var(--esg-transition),opacity var(--esg-transition);z-index:3}.emoji-dropdown.active{opacity:1;transform:scale(1)}body.animation-level-0 .emoji-dropdown{transition:none}}.emoji-dropdown .emoji-container{height:100%;max-width:100%;overflow:hidden;width:100%}.emoji-dropdown .emoji-tabs{border:none;border-top:1px solid var(--border-color);justify-content:center}.emoji-dropdown .emoji-tabs:after{content:none}.emoji-dropdown .emoji-tabs-search{left:0;margin-left:.5rem!important;position:absolute}.emoji-dropdown .emoji-tabs-delete{margin-right:.5rem!important;position:absolute;right:0}.emoji-dropdown .emoji-tabs .menu-horizontal-div-item{margin:0 .75rem}.emoji-dropdown .tabs-container{height:100%}.emoji-dropdown .stickers-padding .category-items{gap:.25rem;padding:0 .1875rem}.emoji-dropdown #content-gifs .scrollable-y{padding:0 .1875rem}.emoji-dropdown .gifs-masonry{border-radius:10px;overflow:hidden}.emoticons-container{background-color:transparent;flex-direction:column;height:100%;min-height:100%}.emoticons-menu{--item-size:1.875rem;align-items:center;min-height:3.0625rem;padding:0 .3125rem;width:100%;z-index:4}.emoticons-menu,.emoticons-menu-wrapper{background-color:transparent;height:3.0625rem}.emoticons-menu-wrapper{border-bottom:1px solid var(--border-color);max-width:100%;padding:0;position:relative}.emoticons-menu:after{content:" ";display:block;flex:0 0 auto;height:1px;width:.1875rem}.emoticons-menu .menu-horizontal-div-item{align-items:center;display:flex;flex:0 0 auto;font-size:1.5rem;height:var(--item-size);line-height:var(--item-size);margin:0 .3125rem;padding:0;width:var(--item-size)}.emoticons-menu .menu-horizontal-div-item.not-local{--item-size:2.375rem;border-radius:.25rem!important;padding:.25rem}.emoticons-menu .menu-horizontal-div-item.active{background-color:rgba(var(--primary-text-color-rgb),.06)!important}.emoticons-menu .menu-horizontal-div-item.active,html.no-touch .emoticons-menu .menu-horizontal-div-item:active,html.no-touch .emoticons-menu .menu-horizontal-div-item:hover{color:rgba(var(--primary-text-color-rgb),.8)!important}.emoticons-menu .menu-horizontal-div-item-padding{height:100%;position:relative;width:100%}.emoticons-menu .menu-horizontal-div-item.active:not(.tgico){background-color:var(--light-secondary-text-color)}.emoticons-menu .menu-horizontal-inner{border-radius:15px;flex:0 0 auto;margin:0 .3125rem;overflow:hidden;width:1.875rem}html.is-safari .emoticons-menu .menu-horizontal-inner{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}body.animation-level-2 .emoticons-menu .menu-horizontal-inner{transition:width .2s ease-in-out}.emoticons-menu .menu-horizontal-inner-scroll{align-items:center;display:flex;height:100%;position:relative;width:8.5rem}.emoticons-menu .menu-horizontal-inner .menu-horizontal-div-item{margin:0!important;transform:scale(1)}body.animation-level-2 .emoticons-menu .menu-horizontal-inner .menu-horizontal-div-item{transition:transform .2s ease-in-out!important}.emoticons-menu .menu-horizontal-inner.active{background-color:rgba(var(--primary-text-color-rgb),.06)!important;width:8.5rem}.emoticons-menu .menu-horizontal-inner.active .menu-horizontal-div-item{transform:scale(.8)}.emoticons-menu .menu-horizontal-inner.active .menu-horizontal-div-item.active{background-color:transparent!important}.emoticons-menu .menu-horizontal-inner:not(.active){cursor:pointer}.emoticons-menu .menu-horizontal-inner:not(.active) .menu-horizontal-inner-scroll{pointer-events:none}.emoticons-menu .menu-horizontal-inner:not(.active) .menu-horizontal-div-item:first-child{pointer-events:all}.emoticons-content{flex:1;padding:0;position:relative}.emoticons-content .emoji-category{position:relative}.emoticons-content .sticky_sentinel--top{height:1px;top:0}.emoticons-content .category-title{color:rgba(var(--primary-text-color-rgb),.42);cursor:pointer;font-size:var(--font-size-16);font-weight:var(--font-weight-bold);line-height:1.1875rem;padding:.75rem .875rem .375rem;position:relative;text-align:center;width:100%}.emoticons-content .category-title .btn-icon{font-size:1.25rem;pointer-events:all;position:absolute;right:.5rem;top:50%;transform:translateY(-50%);z-index:1}.emoticons-content:not(.has-premium) .is-premium-set .category-title:before{content:"๎ฆ–";line-height:inherit;margin-right:.125rem;vertical-align:middle}.emoji-padding .super-emojis{padding:0 .5rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar{height:0;opacity:0;width:0;width:.375rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar-thumb{height:0;width: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{display:none;height:0;width:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-corner{background-color:transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover{scrollbar-color:var(--scrollbar-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{-webkit-backdrop-filter:blur(100);backdrop-filter:blur(100);background-color:var(--scrollbar-color);border-radius:10px;max-height:12.5rem;min-height:5rem;opacity:1}.no-scrollbar::-webkit-scrollbar,.scrollable-x::-webkit-scrollbar{display:none}.scrollable{-webkit-overflow-scrolling:touch;bottom:0;height:100%;left:0;max-height:100%;overflow-x:hidden;overflow-y:hidden;position:absolute;right:0;top:0;width:100%}.scrollable.scrollable-x{-ms-overflow-style:none;overflow-x:auto;scrollbar-width:none}.scrollable.scrollable-y{-ms-overflow-style:none;overflow-y:auto;overflow-y:overlay;scrollbar-color:transparent transparent;scrollbar-width:thin;transform:translateZ(0)}.scrollable.scrollable-y.scrollable-y-bordered{border-bottom:1px solid transparent;border-top:1px solid transparent}body.animation-level-2 .scrollable.scrollable-y.scrollable-y-bordered{transition:border-top-color var(--transition-standard-in),border-bottom-color var(--transition-standard-in)}.scrollable.scrollable-y.scrollable-y-bordered:not(.scrolled-top){border-top-color:var(--border-color)}.scrollable.scrollable-y.scrollable-y-bordered:not(.scrolled-bottom){border-bottom-color:var(--border-color)}.scrollable-padding{height:100%;min-width:100%}@keyframes scaleIn{0%{transform:scale(.2)}to{transform:scale(1)}}.selector{display:flex;flex-direction:column;height:100%;width:100%}.selector .selector-search-section{margin-bottom:0!important;padding:0!important;position:relative;z-index:1}.selector-search-container{flex:0 0 auto;max-height:132px;overflow:hidden;position:relative}.selector-search-container .scrollable{max-height:inherit;position:relative}.selector-search{display:flex;flex-flow:wrap;padding-left:1rem;padding-right:1rem;position:relative}.selector-search-input{border:none;flex:1 1 auto;outline:none}.selector-search .selector-search-input{padding:7px 0 19px}[dir=ltr] .selector-user{padding-right:17px}[dir=rtl] .selector-user{padding-left:17px}[dir=ltr] .selector-user{margin-left:-.25rem;margin-right:.75rem}[dir=rtl] .selector-user{margin-left:.75rem;margin-right:-.25rem}.selector-user{background-color:var(--light-secondary-text-color);border-radius:1.5rem;color:var(--primary-text-color);flex:0 0 auto;font-size:1rem;height:2rem;line-height:2rem;margin-bottom:7px;max-width:11.25rem;overflow:hidden;text-overflow:ellipsis;transition:opacity .2s,transform .2s,background-color .2s;-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap}body.animation-level-0 .selector-user{transition:none}html.no-touch .selector-user:active,html.no-touch .selector-user:hover{background-color:var(--light-danger-color);cursor:pointer}html.no-touch .selector-user:active .selector-user-avatar:after,html.no-touch .selector-user:hover .selector-user-avatar:after{opacity:1;transform:scaleX(-1) rotate(-90deg)}body:not(.animation-level-0) .selector-user.scale-in{animation:scaleIn .15s ease forwards}body:not(.animation-level-0) .selector-user.scale-out{animation:scaleIn .1s ease forwards;animation-direction:reverse}[dir=ltr] .selector-user-avatar{margin-right:8px}[dir=rtl] .selector-user-avatar{margin-left:8px}.selector-user-avatar{border-radius:50%!important;float:left;overflow:hidden;position:relative}.is-rtl .selector-user-avatar{float:right}html.is-safari .selector-user-avatar{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}[dir=ltr] .selector-user-avatar:after{left:0}[dir=rtl] .selector-user-avatar:after{right:0}.selector-user-avatar:after{background-color:var(--danger-color);content:"๎คฉ";font-size:23px;height:100%;line-height:32px!important;opacity:0;position:absolute;top:0;transform:scaleX(-1) rotate(0deg);transition:opacity .2s,transform .2s;width:100%;z-index:2}body.animation-level-0 .selector-user-avatar:after{transition:none}.selector .chatlist-container{flex:1 1 auto;height:100%}.selector>hr{margin:0;padding:0}[dir=ltr] .selector .checkbox{padding-left:11px}[dir=rtl] .selector .checkbox{padding-right:11px}.selector .checkbox{margin-top:11px}.selector .checkbox-field{--offset-left:0!important;margin:0!important;padding:0!important;pointer-events:none;position:absolute!important;top:50%;transform:translateY(-50%);z-index:1}[dir=ltr] .selector .checkbox-field:first-child{margin-left:.6875rem;margin-right:1.6875rem}[dir=rtl] .selector .checkbox-field:first-child{margin-left:1.6875rem;margin-right:.6875rem}[dir=ltr] .selector .checkbox-field-round{right:1.125rem}[dir=rtl] .selector .checkbox-field-round{left:1.125rem}.selector .checkbox-field-round{--size:1.25rem}.selector .checkbox-field-round .checkbox-box-border{z-index:auto}.selector .checkbox-field-round .checkbox-box-check{--offset:6px}[dir=ltr] .selector-square .checkbox-field{left:1.25rem!important}[dir=rtl] .selector-square .checkbox-field{right:1.25rem!important}[dir=ltr] .selector-square .chatlist-chat.row-with-padding{padding-left:7.5rem!important}[dir=rtl] .selector-square .chatlist-chat.row-with-padding{padding-right:7.5rem!important}[dir=ltr] .selector-square .dialog-avatar{margin-left:3rem!important}[dir=rtl] .selector-square .dialog-avatar{margin-right:3rem!important}.gifs-masonry{grid-gap:.125rem;display:grid;gap:.125rem;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr)}.gifs-masonry .gif img,.gifs-masonry .gif video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.gifs-masonry .gif img{left:0;position:absolute;top:0}.gifs-masonry .preloader-container{z-index:2}.preloader-circular{animation:rotate 1s linear infinite;bottom:0;height:100%;left:0;margin:auto;position:absolute;right:0;top:0;transform-origin:center center}.preloader-path{stroke-dasharray:93.6375,124.85;stroke-dashoffset:0;stroke-linecap:round;stroke:#fff;stroke-width:3}.preloader-container{bottom:0;cursor:pointer;display:flex;height:54px;left:0;margin:auto;opacity:0;overflow:hidden;position:absolute;right:0;top:0;transform:scale(0);width:54px}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{height:100%;width:100%}.preloader-container .preloader-circular{animation:none;background-color:rgba(0,0,0,.3);border-radius:50%;height:100%;width: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.animating .you-spin-me-round,body.animation-level-2 .preloader-container.is-visible:not(.manual) .you-spin-me-round{animation:rotate 2s linear infinite}body.animation-level-2 .preloader-container.is-visible.animating .preloader-path-new,body.animation-level-2 .preloader-container.is-visible:not(.manual) .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{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{bottom:0;color:var(--color);height:56%;left:0;margin:auto;opacity:1;position:absolute;right:0;top:0;width:56%}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:active,html.no-touch .preloader-container .preloader-close:hover,html.no-touch .preloader-container .preloader-download:active,html.no-touch .preloader-container .preloader-download:hover{background:none}.preloader-container.manual .preloader-close,.preloader-container:not(.manual) .preloader-download{opacity:0}.preloader-container.manual .preloader-path-new{stroke-width:0}.preloader-container .preloader-download{height:1.5rem;width: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{background-color:var(--color);border-radius:.125rem;content:"";height:.8125rem;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:.8125rem}.preloader-container.preloader-transparent .preloader-circular{background-color:transparent}.preloader-container.preloader-bold .preloader-path-new{stroke-width:3.5}@keyframes rotate{to{transform:rotate(1turn)}}@keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}to{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-237%}}.rp{position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.btn-corner.rp .c-ripple,.btn-menu-toggle.rp .c-ripple,.menu-horizontal-div-item.rp .c-ripple,.pinned-container-wrapper.rp .c-ripple,.rp-overflow .c-ripple{border-radius:inherit;height:100%;overflow:hidden;width:100%}.btn-corner.rp .c-ripple__circle,.btn-menu-toggle.rp .c-ripple__circle,.menu-horizontal-div-item.rp .c-ripple__circle,.pinned-container-wrapper.rp .c-ripple__circle,.rp-overflow .c-ripple__circle{overflow:hidden}.c-ripple{--ripple-duration:.7s;bottom:0;left:0;position:absolute;right:0;top:0}html.is-safari .c-ripple:not(:empty){border-radius:inherit;-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.c-ripple__circle{animation:ripple-effect .7s forwards;background-color:var(--ripple-color);border-radius:50%;display:block;pointer-events:none;position:absolute;transform:scale(0);transition:opacity .35s,background-color .35s}.c-ripple__circle.hiding,.c-ripple__square.hiding{opacity:0}@media only screen and (max-width:925px){.c-ripple{--ripple-duration:.4s}.c-ripple__circle{animation-duration:.4s;animation-name:ripple-effect-handhelds;transition-duration:.3s}}@keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@keyframes ripple-effect-handhelds{0%{transform:scale(.27)}to{transform:scale(2)}}.avatar-like{--size:54px;--multiplier:1;color:#fff;font-size:calc(1.25rem/var(--multiplier));font-weight:var(--font-weight-bold);height:var(--size);line-height:var(--size)!important;text-align:center;text-transform:uppercase;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:var(--size)}avatar-element{--color-top:var(--avatar-color-top);--color-bottom:var(--avatar-color-bottom);background:linear-gradient(var(--color-top),var(--color-bottom));border-radius:50%}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(30px/var(--multiplier))!important}avatar-element.tgico-reply_filled:before{font-size:calc(28px/var(--multiplier))!important}avatar-element.tgico-deletedaccount{--color-top:var(--peer-avatar-archive-top);--color-bottom:var(--peer-avatar-archive-bottom);overflow:hidden}avatar-element.tgico-deletedaccount:before{font-size:calc(30px/var(--multiplier))}avatar-element:before{line-height:inherit!important}avatar-element.media-container{position:relative}avatar-element img{border-radius:inherit!important;display:block;height:var(--size)!important;width:var(--size)!important}avatar-element img.fade-in{animation:fade-in-opacity .2s ease forwards}avatar-element img.emoji{height:calc(1.125rem/var(--multiplier))!important;vertical-align:middle!important;width:calc(1.125rem/var(--multiplier))!important}avatar-element.is-forum{border-radius:var(--avatar-border-radius-forum)}avatar-element.is-topic{background:none;border-radius:0;position:relative}avatar-element.is-topic .topic-icon{--size:inherit}avatar-element.is-online{position:relative}avatar-element.is-online:after{background-color:var(--avatar-online-color);border:2px solid var(--surface-color);border-radius:50%;content:" ";display:block;height:14px;left:2.4375rem;position:absolute;top:2.4375rem;width:14px}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-36{--size:36px;--multiplier:1.5}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.6875}avatar-element.avatar-26{--size:26px;--multiplier:2.076923}avatar-element.avatar-24{--size:24px;--multiplier:2.25}avatar-element.avatar-22{--size:22px;--multiplier:2.454545}avatar-element.avatar-18{--size:18px;--multiplier:3}avatar-element.avatar-16{--size:16px;--multiplier:3.375}.avatar-relative .avatar-photo{left:0;position:absolute;top:0}.avatar-full{align-items:center;border-radius:inherit;display:inline-flex;height:100%;justify-content:center;position:absolute;width:100%}.avatar-full .avatar-photo{height:100%!important;-o-object-fit:cover;object-fit:cover;width:100%!important}.document{--background-color:var(--primary-color);height:70px}.document .media-photo{border-radius:inherit}.document .media-photo.thumbnail{left:0}.document-ico{background-color:var(--background-color);border-radius:.375rem;line-height:1;text-align:center}html.is-safari .document-ico{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.document-ico-text{opacity:0}body.animation-level-2 .document-ico-text{transition:opacity .2s ease-in-out}.document:not(.document-with-thumb) .document-ico{padding:1.5625rem .25rem 0}@media only screen and (max-width:600px){.document:not(.document-with-thumb) .document-ico{font-size:14px;padding:1.5rem 0 0}.document:not(.document-with-thumb) .document-ico:after{--size:.875rem}}.document-ico:after{--size:1.125rem;border-bottom-color:rgba(0,0,0,.25);border-bottom-left-radius:.25rem;border-left-color:rgba(0,0,0,.25);border-right-color:var(--message-background-color);border-style:solid;border-top-color:var(--message-background-color);border-width:calc(var(--size)/2);content:"";display:block;position:absolute;right:0;top:0}body.animation-level-2 .document-ico:after{transition:border-width .2s ease-in-out}html.no-touch .document:not(.downloaded):active .document-ico:after,html.no-touch .document:not(.downloaded):hover .document-ico:after{border-width:0}html.no-touch .document:not(.downloaded):active .document-ico-text,html.no-touch .document:not(.downloaded):hover .document-ico-text{opacity:0}html.no-touch .document:not(.downloaded):active .preloader-container,html.no-touch .document:not(.downloaded):hover .preloader-container{opacity:1!important}.document:not(.downloading) .document-ico-text{opacity:1}.document:not(.downloading) .preloader-container{opacity:0!important}.document.downloading .document-ico:after{border-width:0}.document-ico{background-size:contain;font-size:1.125rem}.document-ico,.document-name,.document-size{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.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,.2);border-radius:.375rem}.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{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.document-name{font-size:var(--font-size-16);font-weight:var(--font-weight-bold);line-height:var(--line-height-16);white-space:nowrap}.document-size{color:var(--secondary-text-color);font-size:var(--font-size-14);line-height:var(--line-height-14);pointer-events:none;position:relative}.document .preloader-container{height:2.5rem;width:2.5rem}@media only screen and (max-width:600px){.document .preloader-container{height:1.625rem;width:1.625rem}}.document .preloader-circular{background-color:transparent!important}.document .preloader-path-new{stroke-width:2.5}[dir=ltr] .audio,[dir=ltr] .document{padding-left:var(--padding-left)}[dir=rtl] .audio,[dir=rtl] .document{padding-right:var(--padding-left)}.audio,.document{--padding:0px;--icon-size:3.375rem;--icon-margin:.875rem;--padding-left:calc(var(--icon-size) + var(--icon-margin) + var(--padding));cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding:var(--padding);-webkit-user-select:none;-moz-user-select:none;user-select:none}[dir=ltr] .audio-download,[dir=ltr] .audio-ico,[dir=ltr] .document-download,[dir=ltr] .document-ico{margin-left:calc((var(--padding-left) - var(--padding))*-1)}[dir=rtl] .audio-download,[dir=rtl] .audio-ico,[dir=rtl] .document-download,[dir=rtl] .document-ico{margin-right:calc((var(--padding-left) - var(--padding))*-1)}.audio-download,.audio-ico,.document-download,.document-ico{color:#fff;height:var(--icon-size);position:absolute;width:var(--icon-size)}.audio-download,.document-download{align-items:center;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;opacity:1;transition:opacity .2s ease-in-out;z-index:1}.audio-download.downloaded,.document-download.downloaded{opacity:0}.audio-description,.document-description{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio:not(.corner-download) .preloader-container:not(.preloader-streamable),.document:not(.corner-download) .preloader-container:not(.preloader-streamable){transform:scale(1)!important}.audio .checkbox-field-round,.document .checkbox-field-round{--margin-top:.25rem;--margin-left:.125rem;left:auto;margin-left:calc(var(--padding-left)*-1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto}.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){height:100%;width:100%}.audio{--icon-size:3rem;--icon-margin:.5625rem;height:var(--icon-size);overflow:visible!important}.audio-download,.audio-toggle{align-items:center;background-color:var(--primary-color);border-radius:50%}.audio.corner-download .audio-download{background:none;display:flex!important;height:1.375rem;left:57.5%;margin:0!important;top:57.5%;width:1.375rem}.audio.corner-download .preloader-container{background-color:var(--primary-color);border-radius:inherit}.audio.corner-download .preloader-path-new{stroke-width:.25rem}.audio-play-icon{border-radius:inherit;bottom:0;left:0;max-height:100%;max-width:100%;overflow:hidden;position:absolute;right:0;top:0;transform:rotate(-119deg)}body.animation-level-2 .audio-play-icon{transition:transform .25s ease-in-out}.audio-toggle .part{background-color:#fff;left:50%;position:absolute;top: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:100%}.audio-waveform-background rect{opacity:.3}html.no-touch .audio-waveform-background rect:active,html.no-touch .audio-waveform-background rect:hover{opacity:1}.audio-waveform-fake{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0;width:0}.audio-waveform-container{height:23px;margin-top:1px;position:relative}.audio-waveform rect{fill:var(--primary-color)}.audio .audio-details{margin-bottom:0;margin-top:3px}.audio .audio-title{margin-bottom:-2px}.audio .part{height:112px!important;width:112px!important}@media only screen and (max-width:600px){.audio .part{height:100px!important;width:100px!important}}.audio-title{color:var(--primary-text-color);font-size:1rem}.audio-description:not(:empty):before{content:" โ€ข "}.audio-subtitle,.audio-time{color:var(--secondary-text-color);display:flex;font-size:.875rem}@media only screen and (max-width:600px){.audio-subtitle,.audio-time{font-size:.75rem}}.audio-subtitle,.audio-time,.audio-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio-subtitle{align-items:center}.audio-subtitle .audio-time{flex:0 0 auto;margin-right:.25rem}.audio-subtitle,.audio-title{margin-left:-1px}.audio-title,.audio:not(.audio-show-progress) .audio-subtitle{max-width:100%}.audio.is-voice .audio-time{align-items:center;line-height:1;margin-left:-1px;margin-top:7px}@media only screen and (max-width:600px){.audio.is-voice .audio-time{margin-top:.3125rem}.audio.is-voice .audio-waveform-container{height:16px;margin-top:0}}.audio.is-voice.is-unread .audio-time:after{background-color:var(--primary-color);border-radius:50%;content:" ";height:.5rem;margin-left:.375rem;width:.5rem}.audio.is-voice.is-unread:not(.is-out) .audio-toggle:not(.playing)+.audio-waveform-container .audio-waveform-background rect{opacity:1}.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{background-color:transparent;opacity:1;z-index: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;height:inherit;-o-object-fit:cover;object-fit:cover;width: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{align-items:center;display:flex;justify-content:center;left:0;position:absolute;top:8px;transform:translate3d(0,calc(-100% - 10px),0);transition:transform .2s ease;width:100%}body.animation-level-0 .quiz-hint{transition:none}.quiz-hint.active{transform:translateZ(0)}[dir=ltr] .quiz-hint .container{text-align:left}[dir=rtl] .quiz-hint .container{text-align:right}.quiz-hint .container{align-items:center;background:rgba(0,0,0,.7);border-radius:12px;color:#fff;display:flex;flex-wrap:wrap;font-size:15px;line-height:1.5;max-width:400px;min-height:48px;overflow:hidden;padding:10px 18px 12px 50px;position:relative;text-align:center;width:auto}@media only screen and (max-width:600px){.quiz-hint .container{font-size:14px;margin:0 10px;padding:10px 18px 12px 54px}}.quiz-hint .container .text{word-break:break-word}.quiz-hint .container:before{content:"๎ฅ—";font-size:1.5rem;left:15px;position:absolute;top:12px}.quiz-hint .container a{border-bottom:1px solid #fff;color:#fff}.peer-typing{margin-right:4px}.peer-typing-container{--color:var(--primary-color);color:var(--color)}.peer-typing-flex{align-items:center;display:flex}.peer-typing:not(.peer-typing-text):not(.peer-typing-choosing-sticker){display:inline-block;transform:translateY(-1px);vertical-align:middle}.peer-typing-text-dot{animation-duration:.6s;animation-iteration-count:infinite;animation-name:dotMiddle;animation-timing-function:linear;background-color:var(--color);border-radius:50%;display:inline-block;height:6px;margin:0 .5px;vertical-align:middle;width:6px}.peer-typing-text-dot:first-child{animation-name:dotFirst}.peer-typing-text-dot:last-child{animation-name:dotLast}.peer-typing-upload{border-radius:2px;height:5px;margin-right:.375rem;overflow:hidden;position:relative;width:13px}.peer-typing-upload:after,.peer-typing-upload:before{background-color:var(--color);border-radius:inherit;bottom:0;content:" ";display:block;left:0;position:absolute;right:0;top:0}.peer-typing-upload:before{opacity:.3}.peer-typing-upload:after{animation:upload 1s ease-in-out infinite}.peer-typing-record{margin-right:.375rem}.peer-typing-record:before{animation:recordBlink 1.25s infinite;background-color:var(--color);border-radius:50%;content:" ";display:block;height:6px;width:6px}.peer-typing-choosing-sticker{align-items:center;display:flex;flex:0 0 auto;height:16px;margin-right:.375rem}.peer-typing-choosing-sticker-eye{animation:eye 1.8s ease-in-out infinite;border:1px solid var(--color);border-radius:50%;display:inline-block;height:14px;margin:0 .0625rem;position:relative;vertical-align:middle;width:8px}.peer-typing-choosing-sticker-eye:before{animation:eye-move 1.8s ease-in-out infinite;background-color:var(--color);border-radius:50%;content:" ";display:block;height:.25rem;position:absolute;top:50%;transform:translate(-1px,-50%);width:.25rem}@keyframes dotFirst{0%{opacity:.8;transform:scale(.6666666667)}50%{opacity:.8;transform:scale(.6666666667)}75%{opacity:1;transform:scale(1)}to{opacity:.8;transform:scale(.6666666667)}}@keyframes dotMiddle{0%{opacity:.9;transform:scale(.8333333333)}12.5%{opacity:.8;transform:scale(.6666666667)}62.5%{opacity:.8;transform:scale(.6666666667)}87.5%{opacity:1;transform:scale(1)}to{opacity:.9;transform:scale(.8333333333)}}@keyframes dotLast{0%{opacity:1;transform:scale(1)}25%{opacity:.8;transform:scale(.6666666667)}75%{opacity:.8;transform:scale(.6666666667)}to{opacity:1;transform:scale(1)}}@keyframes upload{0%{transform:translateX(-13px)}to{transform:translate(13px)}}@keyframes eye{0%{transform:scale(1.1) translateX(-.75px)}12.5%{transform:scale(1) translateX(0)}25%{transform:scale(1.1) translateX(.375px)}50%{transform:scale(1.1) translateX(.75px)}62.5%{transform:scale(1) translateX(0)}75%{transform:scale(1.1) translateX(-.375px)}to{transform:scale(1.1) translateX(-.75px)}}@keyframes eye-move{0%{transform:translate(-1px,-50%)}25%{transform:translate(3px,-50%)}50%{transform:translate(3px,-50%)}75%{transform:translate(-1px,-50%)}to{transform:translate(-1px,-50%)}}poll-element{color:var(--primary-text-color);display:block;margin-top:-1px;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:330px}@media only screen and (max-width:600px){poll-element{max-width:100%;width:240px}}poll-element:not(.is-closed):not(.is-voted) .poll-answer{cursor:pointer}poll-element .poll-title{font-weight:var(--font-weight-bold)}@media only screen and (max-width:600px){poll-element .poll-title{max-width:88%;white-space:normal}}poll-element .poll-desc{align-items:center;color:var(--secondary-text-color);display:flex;font-size:14px;margin-bottom:5px;margin-top:2px;position:relative}poll-element .poll-type{margin-top:2px}poll-element .poll-hint{color:var(--primary-color);cursor:pointer;font-size:1.5rem;position:absolute;right:2px;top:-4px;transform:scale(1)}body.animation-level-2 poll-element .poll-hint{transition:transform .2s ease}poll-element .poll-hint.active{pointer-events:none;transform:scale(0)}poll-element .poll-send-vote{cursor:default}poll-element .poll-avatars{cursor:pointer;display:flex;margin-left:18px}poll-element .poll-avatar{border:1px solid var(--border-color);cursor:pointer;height:18px;width:18px}poll-element .poll-answer{display:flex;margin-top:1px;padding-bottom:20px;padding-left:28px;position:relative}poll-element .poll-answer-text{margin-left:12px;margin-top:6px}[dir=ltr] poll-element .poll-answer-percents{text-align:right}[dir=rtl] poll-element .poll-answer-percents{text-align:left}poll-element .poll-answer-percents{font-size:14px;font-weight:var(--font-weight-bold);left:0;margin-left:-9px;margin-top:7px;opacity:0;position:absolute;top:0;width:40px}poll-element .poll-answer-selected{align-items:center;background:var(--primary-color);border-radius:50%;bottom:1px;color:#fff;display:flex;font-size:.75rem;font-weight:var(--font-weight-bold);height:16px;justify-content:center;left:15px;opacity:1;position:absolute;width:16px}poll-element .poll-answer-selected:before{content:"๎ค€";font-weight:var(--font-weight-bold)}html.no-touch poll-element .poll-answer:active .animation-ring,html.no-touch poll-element .poll-answer:hover .animation-ring{transform:scale(1);visibility:visible}poll-element .poll-answer.is-voting .progress-ring__circle{stroke-dashoffset:-19.792;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:var(--secondary-text-color);font-size:.875rem;margin-top:-.5rem}poll-element .poll-line{stroke-dashoffset:0;stroke-dasharray:0,485.9;bottom:2px;height:35px;left:10px;position:absolute}poll-element .poll-line use{stroke-width:4px;stroke-linecap:round;stroke:var(--primary-color);fill:none}poll-element .poll-footer{height:2.875rem;margin:-.375rem -.5rem -.375rem -.625rem;text-align:center}poll-element .poll-footer-button{border-top-left-radius:0!important;border-top-right-radius:0!important;color:var(--primary-color);cursor:pointer;font-size:1rem;font-weight:var(--font-weight-bold);height:100%;overflow:hidden;width:100%}poll-element .poll-footer,poll-element .poll-footer-button{align-items:center;display:flex;justify-content:center}poll-element .poll-quiz-timer{stroke:#a3adb6;fill:none;stroke-linecap:round;height:32px;position:absolute;right:-2px;top:-7px;transform:rotate(270deg);width:32px}poll-element .poll-time{color:#a3adb6;font-size:12px;font-weight:var(--font-weight-bold);position:absolute;right:27px}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) use{stroke:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected{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{align-items:center;display:flex;height:34px;justify-content:center;left:-1px;position:absolute;top:-1px;transform:scale(1);width:34px}poll-element .circle-hover .poll-answer-selected{animation:none;display:flex!important;font-size:20px;height:20px;left:50%;line-height:16px;opacity:0;top:50%;transform:translate(-50%,-50%);width:20px}body.animation-level-2 poll-element .circle-hover .poll-answer-selected{transition:opacity .2s ease}poll-element .animation-ring{background-color:var(--light-secondary-text-color);border-radius:50%;display:block;height:34px;transform:scale(.1);visibility:hidden;width:34px}body.animation-level-2 poll-element .animation-ring{transition:transform .12s ease}poll-element .progress-ring{height:26px;left:auto;top:auto;width:26px}poll-element .progress-ring__circle{stroke-dasharray:56.5487,56.5487;stroke-dashoffset:0;stroke-opacity:1;stroke-width:2;stroke:var(--poll-circle-color);fill:transparent;transform:rotate(-90deg);transform-origin:center}poll-element.is-voted .animation-ring,poll-element.is-voted .circle-hover{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 forwards .1s ease}poll-element.animating.is-retracting .poll-answer-selected{transition-delay:0s}poll-element.animating .poll-answer-percents{transition:opacity .34s}poll-element.animating .progress-ring__circle{transition:stroke-dashoffset .15s}poll-element.animating .circle-hover{transition:transform .1s}poll-element.is-multiple .poll-desc{margin-bottom:.5rem}poll-element .c-ripple__circle{background-color:var(--light-primary-color)}@keyframes pollAnswerRotate{to{transform:rotate(270deg)}}.transition>.transition-item{animation-fill-mode:forwards!important;height:100%;left:0;position:absolute;top:0;width:100%}.transition>.transition-item:not(.active):not(.from):not(.to){display:none!important}.transition.zoom-fade>.from{opacity:1;transform:scale(1);transform-origin:center}.transition.zoom-fade>.to{opacity:0;transform-origin:center}.transition.zoom-fade.animating>.from{animation:fade-out-opacity .15s ease}.transition.zoom-fade.animating>.to{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(.95)}.transition.zoom-fade.backwards.animating>.from{animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease}.transition.zoom-fade.backwards.animating>.to{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{opacity:1;transform:translateX(0);transform-origin:left center}.transition.slide-fade>.to{opacity:0;transform:translateX(1.5rem);transform-origin:left center}.transition.slide-fade.animating>.from{animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s}.transition.slide-fade.animating>.to{animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s}.transition.slide-fade.backwards>.from{opacity:1;transform:translateX(0)}.transition.slide-fade.backwards>.to{opacity:0;transform:translateX(-1.5rem)}.transition.slide-fade.backwards.animating>.from{animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s}.transition.slide-fade.backwards.animating>.to{animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s}@keyframes zoom-fade-in-move{0%{transform:scale(1.1)}to{transform:scale(1)}}@keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}to{transform:scale(1.1)}}@keyframes zoom-fade-out-backwards-move{0%{transform:scale(.95)}to{transform:scale(1)}}@keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}to{transform:translateX(0)}}@keyframes slide-fade-out-move{0%{transform:translateX(0)}to{transform:translateX(-1.5rem)}}@keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}to{transform:translateX(1.5rem)}}@keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}to{transform:translateX(0)}}.row{display:flex;flex-direction:column;justify-content:center;min-height:3.5rem;padding:.4375rem 1rem;position:relative}.row.no-subtitle,.row.row-small{min-height:3rem;padding-bottom:.1875rem;padding-top:.1875rem}body.animation-level-2 .row{transition:opacity var(--transition-standard-in)}.row.is-disabled{opacity:var(--disabled-opacity);pointer-events:none!important}.row.no-wrap{padding-bottom:0!important;padding-top:0!important}.row a{pointer-events:all;position:relative;z-index:1}.row-title-row,.row>.row-title{order:0}[dir=ltr] .row-big{padding-left:1rem;padding-right:.75rem}[dir=rtl] .row-big{padding-left:.75rem;padding-right:1rem}.row-big{min-height:4.5rem;padding-bottom:.5625rem;padding-top:.5625rem}.row-row{align-items:center;display:flex;justify-content:space-between}.row-row .row-subtitle,.row-row .row-title{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.row-subtitle-row,.row>.row-subtitle{order:1}.row-title{color:var(--primary-text-color);font-size:var(--font-size);line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;word-break:break-word}.row-title-right-secondary{color:var(--secondary-text-color)}[dir=ltr] .row-subtitle-right,[dir=ltr] .row-title-right{margin-left:1rem}[dir=rtl] .row-subtitle-right,[dir=rtl] .row-title-right{margin-right:1rem}.row-subtitle-right,.row-title-right{flex:0 0 auto!important}.row-midtitle,.row-subtitle,.row-title{pointer-events:none;position:relative}.row-midtitle{font-size:var(--font-size-14);margin-top:.125rem;order:1}[dir=ltr] .row-with-padding{padding-left:4.5rem}[dir=rtl] .row-with-padding{padding-right:4.5rem}@media only screen and (max-width:600px){[dir=ltr] .row-with-padding{padding-left:4rem}[dir=rtl] .row-with-padding{padding-right:4rem}}[dir=ltr] .row-with-padding.tgico:before{left:1rem}[dir=rtl] .row-with-padding.tgico:before{right:1rem}.row-with-padding.tgico:before{color:var(--secondary-text-color);font-size:1.5rem;pointer-events:none;position:absolute;top:50%;transform:translateY(-50%);z-index:1}.row-with-padding:not(.row-with-icon):before{display:none}.row-clickable{cursor:pointer;overflow:hidden}@media only screen and (min-width:601px){.row-clickable{border-radius:10px}}[dir=ltr] .row-sortable .row-subtitle,[dir=ltr] .row-sortable .row-title{padding-right:2.5rem}[dir=rtl] .row-sortable .row-subtitle,[dir=rtl] .row-sortable .row-title{padding-left:2.5rem}[dir=ltr] .row-sortable-icon{right:.75rem}[dir=rtl] .row-sortable-icon{left:.75rem}.row-sortable-icon{color:var(--secondary-text-color);font-size:1.5rem;height:1.5rem;line-height:1;opacity:0;pointer-events:none;position:absolute;top:50%;transform:translateY(-50%)}.row-sortable.cant-sort .row-sortable-icon{display:none}.row-sortable.is-dragging{background-color:var(--surface-color)!important;z-index:1}html.no-touch .row-sortable.is-dragging:active,html.no-touch .row-sortable.is-dragging:hover{background-color:var(--light-filled-secondary-text-color)!important}html.no-touch .row-sortable:active .row-sortable-icon,html.no-touch .row-sortable:hover .row-sortable-icon{opacity:1}body.animation-level-2 .is-reordering .row-sortable{transition:transform var(--transition-standard-in)}[dir=ltr] .row .checkbox-field,[dir=ltr] .row .radio-field-main{padding-left:3.375rem}[dir=rtl] .row .checkbox-field,[dir=rtl] .row .radio-field-main{padding-right:3.375rem}[dir=ltr] .row .checkbox-field,[dir=ltr] .row .radio-field-main{margin-left:-3.375rem}[dir=rtl] .row .checkbox-field,[dir=rtl] .row .radio-field-main{margin-right:-3.375rem}.row .checkbox-field,.row .radio-field,.row .radio-field:not(.radio-field-right) .radio-field-main{position:static}.row .checkbox-field,.row .radio-field{--offset-left:1rem}.row .radio-field{margin-bottom:0;margin-top:0}[dir=ltr] .row .checkbox-field{margin-right:0}[dir=rtl] .row .checkbox-field{margin-left:0}.row .checkbox-field{height:auto;margin-bottom:0;margin-top:0}[dir=ltr] .row .checkbox-field .checkbox-caption{padding-left:0}[dir=rtl] .row .checkbox-field .checkbox-caption{padding-right:0}.row .checkbox-field .checkbox-caption{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.row .checkbox-field-toggle{margin-left:.125rem;margin-right:.125rem;padding:0}.row-subtitle{color:var(--secondary-text-color)!important;font-size:var(--font-size-14)!important;line-height:var(--line-height-14);margin-top:.1875rem}.row-subtitle:empty{display:none}[dir=ltr] .row-media{left:.75rem}[dir=rtl] .row-media{right:.75rem}.row-media{align-items:center;display:flex;height:2.25rem!important;justify-content:center;margin:0!important;pointer-events:none;position:absolute!important;width:2.25rem!important}[dir=ltr] .row-media-small{left:.75rem!important}[dir=rtl] .row-media-small{right:.75rem!important}.row-media-small{height:2rem!important;width:2rem!important}[dir=ltr] .row-media-abitbigger{left:.75rem!important}[dir=rtl] .row-media-abitbigger{right:.75rem!important}.row-media-abitbigger{height:2.625rem!important;width:2.625rem!important}[dir=ltr] .row-media-big{left:.5rem!important}[dir=rtl] .row-media-big{right:.5rem!important}.row-media-big{height:3rem!important;width:3rem!important}[dir=ltr] .row-media-bigger{left:.5625rem!important}[dir=rtl] .row-media-bigger{right:.5625rem!important}.row-media-bigger{height:3.375rem!important;width:3.375rem!important}.row.menu-open{background-color:var(--light-secondary-text-color)}[dir=ltr] .row>.btn-primary{right:1rem}[dir=rtl] .row>.btn-primary{left:1rem}.row>.btn-primary{border-radius:.9375rem;font-size:.9375rem;height:1.875rem;line-height:1.875rem;margin:0;padding-left:.75rem;padding-right:.75rem;position:absolute;top:50%;transform:translateY(-50%);width:auto}body.animation-level-2 .row>.btn-primary{transition:width .2s,background-color .2s,color .2s}.row>.btn-primary.active{background-color:var(--light-primary-color)!important;color:var(--primary-color)}.color-picker{margin:1.1875rem auto .25rem;max-width:100%;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:380px}@media only screen and (max-width:600px){.color-picker{padding:0 .75rem}}.color-picker-box{height:198px;width:100%}.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: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:var(--surface-color);border-radius:10px;bottom:calc(100% + .625rem);box-shadow:0 5px 10px 5px rgba(16,35,47,.14);display:flex!important;flex-direction:column;max-height:26.25rem;max-width:100%;opacity:0;overflow:hidden;padding:0!important;position:absolute!important;right:0;transform:scale(0);transform-origin:bottom right;transition:transform var(--esg-transition),opacity var(--esg-transition);width:26.25rem!important;z-index:3}@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{background-color:transparent;border:2px solid var(--primary-color);border-radius:.375rem;color:var(--primary-color);font-size:.9375rem;font-weight:var(--font-weight-bold);height:3rem;text-align:center;width:100%}body.animation-level-2 .reply-keyboard-button{transition:color .15s,background-color .15s}html.no-touch .reply-keyboard-button:active,html.no-touch .reply-keyboard-button:hover{background-color:var(--primary-color);color:#fff}.reply-keyboard-button+.reply-keyboard-button{margin-left:.3125rem}.reply-keyboard .scrollable-y{bottom:auto;height:auto;left:auto;max-height:100%;padding:.625rem!important;position:relative;right:auto;top:auto}.peoplenearby-container div.text.nearby-description{color:var(--primary-text-color);margin-top:15px;text-align:center}.peoplenearby-container div.text.nearby-error{color:var(--gc-secondary-text-color);margin-top:10px;text-align:center}.peoplenearby-container .locating-animation-container{align-items:center;display:flex;justify-content:center;min-height:140px;width:100%}.peoplenearby-container .locating-animation-container .tgico.tgico-location{align-items:center;background:var(--avatar-color-bottom);border-radius:50%;display:flex;height:140px;justify-content:center;padding:50px;width:140px}.peoplenearby-container .locating-animation-container .tgico.tgico-location:before{color:#fff;font-size:58px}.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{animation:waves-animation 3s infinite;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%);height:50px;margin-left:36px;width:50px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-2,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{animation:waves-animation 5s infinite;animation-delay:2s;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%);height:71px;margin-left:51px;margin-top:1px;width:66px}.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)}@keyframes waves-animation{0%{opacity:1}50%{opacity:0}to{opacity:1}}.spoiler{--anim:.4s ease;background-color:var(--spoiler-background-color)}.spoiler-text{opacity:0}.spoilers-container .custom-emoji-canvas{z-index:-1}.spoilers-container.is-spoiler-visible.animating .spoiler{transition:background-color var(--anim)}.spoilers-container.is-spoiler-visible.animating .spoiler-text{transition:opacity var(--anim)}.spoilers-container.is-spoiler-visible:not(.backwards) .spoiler{background-color:transparent}.spoilers-container.is-spoiler-visible:not(.backwards) .spoiler-text{opacity:1}.spoilers-container:not(.is-spoiler-visible) .spoiler{cursor:pointer}.spoilers-container:not(.is-spoiler-visible) .spoiler-text{pointer-events:none}.emoji-animation,.emoji-animation-container{pointer-events:none;position:absolute}.emoji-animation-container{bottom:0;left:0;overflow:hidden;right:0;top:0;z-index:3}.reactions-block{display:flex;flex-wrap:wrap;-webkit-user-select:none;-moz-user-select:none;user-select:none}.reactions-block.has-no-reactions{display:inline;display:initial}.reactions-inline{display:inline-flex}.reactions-inline:not(:empty){margin-right:.125rem}.reaction,.reaction-sticker{align-items:center;display:flex}.reaction-sticker{--custom-emoji-size:var(--reaction-size);height:var(--reaction-size);justify-content:center;position:relative;width:var(--reaction-size)}.reaction-sticker-activate{bottom:var(--reaction-offset);left:var(--reaction-offset);position:absolute;right:var(--reaction-offset);top:var(--reaction-offset);z-index:1}.reaction-sticker.has-animation>.media-sticker{opacity:0}.reaction-sticker:not(.is-static):not(.is-custom) .media-sticker{--size:calc(var(--reaction-size) + var(--reaction-offset)*-2);bottom:auto;height:var(--size)!important;left:auto;max-height:var(--size);max-width:var(--size);right:auto;top:auto;width:var(--size)!important}.reaction-sticker.is-custom{border-radius:.3125rem}.reaction-sticker.is-custom .custom-emoji,.reaction-sticker.is-custom .media-sticker{border-radius:inherit}.reaction-sticker.is-custom .custom-emoji-canvas{z-index:auto}.reaction-inline{--reaction-size:.875rem;--reaction-offset:-.4375rem;min-height:var(--reaction-size);min-width:var(--reaction-size)}.reaction-inline .reaction-counter{font-size:inherit!important;margin-right:.0625rem!important;order:-1}.reaction-block{--additional-height:.5rem;--margin:.375rem;--reaction-size:1.375rem;--reaction-offset:-.5625rem;--background-color:var(--message-highlightning-color);--chosen-background-color:var(--message-primary-color);--counter-color:#fff;--reaction-total-size:calc(var(--reaction-size) + var(--additional-height));background-color:var(--background-color);border-radius:var(--reaction-total-size);color:var(--counter-color);cursor:pointer;height:var(--reaction-total-size);margin-right:var(--margin);margin-top:var(--margin);padding:0 .5rem;position:relative}html.no-touch .reaction-block:active:after,html.no-touch .reaction-block:hover:after{background-color:var(--chosen-background-color);border-radius:inherit;bottom:0;content:" ";left:0;opacity:.08;position:absolute;right:0;top:0}.reaction-block .reaction-counter,.reaction-block .reaction-sticker{z-index:1}.reaction-block:last-child{margin-right:0}.reaction-block:before{background-color:var(--chosen-background-color);border-radius:inherit;bottom:0;content:" ";left:0;opacity:0;position:absolute;right:0;top:0;transform:scale(0)}.reaction-block.is-chosen:not(.backwards):before{opacity:1;transform:scale(1)}.reaction-block.is-chosen:not(.backwards) .stacked-avatars{--border-color:var(--chosen-background-color)}.reaction-block.is-chosen.animating:before{transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.reaction-block.is-chosen.animating .reaction-counter{transition:color var(--transition-standard-in)}.reaction-block.is-chosen.animating .stacked-avatars-avatar-container{transition:border-color var(--transition-standard-in)}.reaction-block .stacked-avatars{--border-color:transparent;--border-size:.125rem;--margin-right:-.875rem;margin-left:.1875rem}.reaction-block .reaction-counter{font-size:.9375rem!important;font-weight:var(--font-weight-bold);line-height:1.125rem;margin:0 .0625rem 0 .375rem;position:relative}.stacked-avatars{--border-color:var(--surface-color);--border-size:1px;--margin-right:-.3125rem;--avatar-size:1rem;--avatar-total-size:calc(var(--avatar-size) + var(--border-size)*2);display:flex;flex-direction:row-reverse}.stacked-avatars-avatar{height:var(--avatar-size);width:var(--avatar-size);z-index:0}.stacked-avatars-avatar-container{align-items:center;border:var(--border-size) solid var(--border-color);border-radius:50%;display:flex;height:var(--avatar-total-size);justify-content:center;position:relative;width:var(--avatar-total-size)}.stacked-avatars-avatar-container:not(:first-child){margin-right:var(--margin-right)}.sticker-viewer{align-items:center;bottom:0;display:flex;justify-content:center;left:0;pointer-events:none;position:fixed;right:0;top:0;z-index:4}.sticker-viewer:before{background-color:rgba(0,0,0,.6);bottom:0;content:" ";left:0;opacity:0;position:absolute;right:0;top:0}body.animation-level-2 .sticker-viewer:before{transition:opacity var(--sticker-viewer-open-transition-out)}.sticker-viewer.is-visible:not(.backwards):before{opacity:1}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards):before{transition:opacity var(--sticker-viewer-open-transition-in)}.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-transformer:not(.is-switching){transform:translateX(var(--translateX)) scale(1)!important}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-transformer:not(.is-switching){transition:transform var(--sticker-viewer-open-transition-in)}.sticker-viewer.is-visible:not(.backwards) .emoji-animation,.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-emoji,.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker{opacity:1}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .emoji-animation,body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-emoji,body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker{transition:opacity var(--sticker-viewer-open-transition-in)}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker:not(.is-overflow){transition:opacity 0s}.sticker-viewer-transformer{--translateX:0;align-items:center;display:flex;height:360px;justify-content:center;position:absolute;width:360px}.sticker-viewer-transformer.has-effect{height:280px;width:280px}.sticker-viewer-transformer.has-effect .sticker-viewer-emoji{top:-5.5rem}body.animation-level-2 .sticker-viewer-transformer{transition:transform var(--sticker-viewer-open-transition-out)}.sticker-viewer-transformer.is-switching{opacity:1!important;transform:translateX(var(--translateX)) scale(1)!important}body.animation-level-2 .sticker-viewer-transformer.is-switching{transition:transform var(--sticker-viewer-switch-transition),opacity var(--sticker-viewer-switch-transition)!important}.sticker-viewer-transformer.is-switching:not(.backwards){opacity:0!important;transform:scale(.4) translateX(var(--translateX))!important}.sticker-viewer-emoji{position:absolute;top:-3rem;transform:translateX(var(--translateX)) scale(2)}.sticker-viewer-sticker{position:absolute}.sticker-viewer .emoji-animation,.sticker-viewer-emoji,.sticker-viewer-sticker{opacity:0}body.animation-level-2 .sticker-viewer .emoji-animation,body.animation-level-2 .sticker-viewer-emoji,body.animation-level-2 .sticker-viewer-sticker{transition:opacity var(--sticker-viewer-open-transition-out)}.custom-emoji{display:inline;height:var(--custom-emoji-size)!important;min-height:var(--custom-emoji-size)!important;min-width:var(--custom-emoji-size)!important;position:relative;width:var(--custom-emoji-size)!important}.custom-emoji:before{content:"ย ";display:inline-block;height:inherit;min-height:inherit;min-width:inherit;width:inherit}.custom-emoji .media-sticker,.custom-emoji .rlottie{height:inherit!important;margin:0;max-height:inherit!important;max-width:inherit!important;pointer-events:none;text-indent:-9999px;width:inherit!important}.custom-emoji-canvas{height:100%;width:100%}.custom-emoji-canvas,.custom-emoji-renderer{bottom:0;left:0;position:absolute;right:0;top:0}.custom-emoji-renderer{pointer-events:none}.custom-emoji-placeholder{display:inline;height:var(--messages-custom-emoji-size);margin-top:-.125rem;vertical-align:middle;width:var(--messages-custom-emoji-size)}.usernames-username-icon{background-color:var(--secondary-color);border-radius:50%;color:#fff;font-size:1.25rem}.usernames-username-icon:before{content:"๎ฅฅ"}.usernames-username.active .usernames-username-status{color:var(--primary-color)!important}.usernames-username.active .usernames-username-icon{background-color:var(--primary-color)}.topics-slider{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0}.topics-container{--offset:0;--width:100%;background-color:var(--surface-color)!important;width:var(--width)!important}.topics-container.is-floating{--offset:5.0625rem;--width:calc(var(--left-column-width) - var(--offset));border-left:1px solid var(--border-color);bottom:0;overflow:visible!important;overflow:initial!important;pointer-events:all;position:absolute;right:0;top:0;transform:translateX(var(--width));z-index:3}.topics-container.is-visible:not(.backwards){transform:translateX(0)}.topics-container.is-visible.animating{transition:transform var(--transition-standard-in)}.topics-container.is-visible.animating.backwards{transition:transform var(--transition-standard-out)}.topics-container .sidebar-header{padding:0 .75rem}.topics-container .sidebar-header__rows{flex:1 1 auto;overflow:hidden;padding-left:.5rem}.topics-container .sidebar-header__rows .sidebar-header__title{font-size:var(--font-size-16);line-height:var(--line-height-16);margin-bottom:.125rem;padding-left:0!important}.topics-container .sidebar-header__subtitle,.topics-container .sidebar-header__title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.topics-container .sidebar-header__subtitle{color:var(--secondary-text-color);font-size:var(--font-size-14);line-height:var(--line-height-14)}.topics-container .chatlist-chat{min-height:4rem;padding-left:.75rem}.topic-name .topic-icon{margin-right:.25rem}.topic-name-button{--color:var(--primary-color);align-items:center;color:var(--color);cursor:pointer;display:flex;font-weight:var(--font-weight-bold);height:1.5rem;justify-content:center;max-width:100%;padding:0 .5rem;position:relative;text-decoration:none!important}.topic-name-button-container{align-items:flex-start;display:flex!important;justify-content:flex-start}.topic-name-button .peer-title,.topic-name-button .topic-name{position:relative}.topic-name-button:before{background-color:var(--color);border-radius:1.5rem;bottom:0;content:" ";left:0;opacity:.08;position:absolute;right:0;top:0}html.no-touch .topic-name-button:active:before,html.no-touch .topic-name-button:hover:before{opacity:.16}.topic-icon{--size:1.25rem;--custom-emoji-size:var(--size);display:inline-flex;font-size:calc(var(--size)/2);justify-content:center;line-height:1.875!important;position:relative;vertical-align:middle}.topic-icon-general{fill:var(--secondary-color);height:var(--size);width:var(--size)}.topic-icon-svg{height:inherit;position:absolute;width:inherit}.topic-icon-content{position:relative}.edit-topic-container .scrollable-y{display:flex;flex-direction:column}.edit-topic-icon{position:absolute}.edit-topic-icon .topic-icon{--size:4rem}.edit-topic-icon-container{align-items:center;cursor:pointer;display:flex;height:100px;justify-content:center;margin:0 auto;position:relative;width:100px}.edit-topic-emoticons-container{flex:1 1 auto}.edit-topic-emoticons-container .sidebar-left-section{height:100%;padding:0!important}.edit-topic-emoticons-container .emoji-padding{display:flex;flex-direction:column}.edit-topic-emoticons-container .super-emoji-topic-icon .topic-icon{--size:var(--esg-emoji-size);--custom-emoji-size:inherit;margin-left:calc((var(--custom-emoji-size) - var(--esg-emoji-size))/2)}.themes-container{align-items:center;display:flex;height:6.5rem;position:relative}@media only screen and (min-width:601px){.themes-container{margin:0 -.5rem;padding:0;width:calc(100% + 1rem)}}.themes-container:after,.themes-container:before{content:" ";display:block;flex:0 0 auto;height:.5rem;width:.5rem}.theme-container{border-radius:10px;cursor:pointer;display:flex;flex:0 0 auto;height:calc(100% - .5rem);justify-content:center;margin:0 .25rem;position:relative;width:4.5rem}.theme-container:before{border:2px solid var(--primary-color);border-radius:14px;bottom:-4px;content:" ";left:-4px;opacity:0;position:absolute;right:-4px;top:-4px;transform:scale(.86)}html.is-safari .theme-container:before{transform:none!important}body.animation-level-2 .theme-container:before{transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.theme-container.active{pointer-events:none}.theme-container.active:before{opacity:1;transform:scale(1)}.theme-container .background-item{border-radius:inherit;height:100%;left:0;pointer-events:none;position:absolute;top:0;width:100%}.theme-emoticon{bottom:.5rem;height:1.75rem;pointer-events:none;position:absolute;width:1.75rem;z-index:1}html:not(.is-safari) .theme-emoticon{transform:scale(1);transform-origin:center bottom}body.animation-level-2 .theme-emoticon{transition:transform var(--transition-standard-in)}.theme-bubble{background-color:#fff;border-radius:1.75rem;height:1.25rem;pointer-events:none;position:absolute;width:2.5rem}.theme-bubble.is-out{background-color:var(--light-filled-message-out-primary-color);right:.375rem;top:.5rem}.theme-bubble.is-in{background-color:var(--message-background-color);left:.375rem;top:2rem}.popup{background-color:rgba(0,0,0,.3);bottom:0;box-shadow:none;display:flex;left:0;margin:0;max-width:none;opacity:0;overflow:auto;padding:1.875rem;position:fixed!important;right:0;top:0;transition-delay:0s,var(--popup-transition-time);transition-duration:var(--popup-transition-time),0s;transition-property:opacity,visibility;transition-timing-function:var(--popup-transition-function);-webkit-user-select:none;-moz-user-select:none;user-select:none;visibility:hidden;z-index:3}.popup.no-overlay{background-color:transparent;overflow:visible;padding:0}body.animation-level-0 .popup{transition:none}.popup.active{opacity:1;transition-delay:0s,0s;visibility:visible;z-index:4}.popup.active .popup-container,.popup.hiding .popup-container{transform:translate3d(var(--translateX),0,0)}[dir=ltr] .popup-title{padding-left:1.5rem;padding-right:1rem}[dir=rtl] .popup-title{padding-left:1rem;padding-right:1.5rem}.popup-title{flex:1;font-size:1.25rem;font-weight:var(--font-weight-bold);line-height:1;margin:0}.popup-title:first-child{padding-left:0}.popup-container{--translateX:0;-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:var(--surface-color);border-radius:10px;display:flex;flex-direction:column;margin:auto;overflow:hidden;padding:1rem;position:relative;transform:translate3d(var(--translateX),3rem,0);transition:transform var(--popup-transition-time) var(--popup-transition-function)}body.animation-level-0 .popup-container{transition:none}.popup-description .peer-title{font-weight:var(--font-weight-bold)}.popup-centerer{margin:auto}.popup-close{flex:0 0 auto;justify-self:center;z-index:3}.popup-header{align-items:center;display:flex;flex:0 0 auto;margin-bottom:2rem;position:relative}.popup-body{display:flex;flex:1 1 auto;flex-direction:column;overflow:hidden}.popup-body .scrollable{position:relative}.popup-buttons{align-items:center;display:flex;flex-direction:row-reverse;height:3rem;justify-content:flex-start;padding:0 .5rem}.popup-buttons .btn{border-radius:10px;font-weight:var(--font-weight-bold);height:2.5rem;max-width:100%;overflow:hidden;padding:0 1rem;position:relative;text-overflow:ellipsis;text-transform:uppercase;white-space:nowrap}[dir=ltr] .popup-buttons .btn+.btn{margin-right:.625rem}[dir=rtl] .popup-buttons .btn+.btn{margin-left:.625rem}.popup-avatar .popup-container{max-width:600px;padding:15px 16px 16px 24px}.popup-avatar .popup-container>button{bottom:20px;position:absolute;right:20px}.popup-avatar .popup-close{font-size:1.5rem;margin-top:4px}.popup-avatar .popup-header{margin-bottom:1px}[dir=ltr] .popup-avatar h6{text-align:left}[dir=rtl] .popup-avatar h6{text-align:right}.popup-avatar h6{font-size:1.25rem;margin:0 0 0 2rem}.popup-avatar .crop{border-radius:8px;max-height:100%;max-width:100%;padding:24px 54px 46px 46px}.popup-avatar .crop>img{display:none}.popup-avatar .crop img{border-radius:8px}.popup-new-media .popup-container{max-height:100%;max-width:420px;padding:12px 20px 32.5px;width:420px}.popup-new-media .popup-container img,.popup-new-media .popup-container video{border-radius:inherit}.popup-new-media .popup-header{align-items:center;flex:0 0 auto;flex-wrap:wrap;justify-content:space-between;margin-bottom:9px;padding:12px 20px 15px;position:relative}.popup-new-media .popup-header .btn-primary{border-radius:10px;font-size:var(--font-size-14);height:2.25rem;line-height:2.25rem;padding:0 1.375rem;text-transform:uppercase;width:auto}.popup-new-media .popup-close{margin:-1px 0 0 -4px}.popup-new-media .popup-photo{border-radius:10px;max-width:100%;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.popup-new-media .scrollable{position:relative}.popup-new-media .input-field{flex:0 0 auto;margin-top:25px;width:100%}.popup-new-media .input-field-input{border-radius:10px;font-size:1rem}.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{top:calc(100% + .25rem);z-index:4}.popup-new-media.popup-send-photo .popup-container{max-width:25rem;padding:0;width:25rem}.popup-new-media.popup-send-photo .popup-container.border-top-offset .popup-input-container{overflow:visible;overflow:initial}.popup-new-media.popup-send-photo .popup-container.border-top-offset .popup-input-container:before{top:-8px}.popup-new-media.popup-send-photo .menu-send{bottom:3.5rem;right:.5rem;top:auto}.popup-new-media.popup-send-photo .popup-header{height:3.5rem;margin:0;padding:0 1rem}[dir=ltr] .popup-new-media.popup-send-photo .popup-title{padding-left:1.5rem}[dir=rtl] .popup-new-media.popup-send-photo .popup-title{padding-right:1.5rem}.popup-new-media.popup-send-photo .popup-close{margin:0}.popup-new-media.popup-send-photo .popup-body{position:relative}.popup-new-media.popup-send-photo .popup-body .scrollable{padding:0 .5rem}.popup-new-media.popup-send-photo .input-message-container{max-height:inherit;min-height:inherit}.popup-new-media.popup-send-photo .input-message-input{max-height:inherit!important}.popup-new-media.popup-send-photo .btn-primary{flex:0 0 auto;height:2.5rem;line-height:2.5rem;margin-bottom:.5rem;padding:0 1rem;text-transform:uppercase;width:auto}.popup-new-media.popup-send-photo .popup-input-container{--height:3.5rem;--max-height:8.375rem;align-items:flex-end;display:flex;flex:0 0 auto;justify-content:space-between;max-height:var(--max-height);min-height:var(--height);overflow:hidden;padding:0 .5rem;position:relative}.popup-new-media.popup-send-photo .popup-input-container:before{background-color:var(--border-color);content:" ";height:1px;left:0;opacity:0;position:absolute;right:0;top:0}body.animation-level-2 .popup-new-media.popup-send-photo .popup-input-container:before{transition:opacity var(--transition-standard-in)}.popup-new-media.popup-send-photo .popup-input-container.has-border-top:before{opacity:1}.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{height:100%;-o-object-fit:cover;object-fit:cover;width: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{border-radius:inherit;overflow:hidden;position:relative}.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{--padding:.25rem;--icon-size:4.5rem;--icon-margin:.5rem;border-radius:10px;cursor:default;height:5rem;margin:0 .25rem;max-width:100%;overflow:hidden}.popup-new-media.popup-send-photo .document-name{line-height:1.5;margin-bottom:.125rem;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.popup-new-media.popup-send-photo .document-ico{border-radius:5px;font-size:16px;font-weight:400;letter-spacing:0;line-height:11px}html.no-touch .popup-new-media.popup-send-photo .document:active,html.no-touch .popup-new-media.popup-send-photo .document:hover{background-color:var(--light-secondary-text-color)}.popup-create-contact .name-fields{display:flex;flex-direction:column;margin-top:1rem;padding-left:116px;position:relative}.popup-create-contact .name-fields .input-field:first-child{margin-top:0}.popup-create-contact .avatar-placeholder{left:0;position:absolute;top:50%;transform:translateY(-50%)}.popup-peer .popup-header{align-items:center;display:flex;height:2.5rem;margin:0;padding:0 1rem;width:-moz-max-content;width:max-content}.popup-peer .popup-container{max-width:min(400px,100%);min-width:min(100%,17.5rem);padding:.75rem .5rem;width:-moz-min-content;width:min-content}.popup-peer .popup-title{font-size:1.25rem;font-weight:var(--font-weight-bold)}.popup-peer .popup-title:not(:first-child){padding-left:1rem}.popup-peer .popup-description{line-height:var(--line-height);margin-bottom:0;margin-top:0;max-width:-moz-fit-content;max-width:fit-content;min-width:min(100%,15rem);overflow:hidden;padding:.625rem 1rem .5rem;text-overflow:ellipsis;word-break:break-word}.popup-peer .checkbox-field{align-items:center;display:flex;height:3rem;margin:0;padding:0 1.125rem}.popup-peer .checkbox-field .checkbox-box{left:auto}.popup-stickers{-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-stickers .sticker-set-footer{color:var(--primary-color);text-align:center}.popup-stickers .sticker-set-footer .btn-primary{height:44px;line-height:44px;padding:0 1.0625rem;text-transform:uppercase;width:auto}.popup-stickers .scrollable.is-loading{min-height:9rem;position:relative}.popup-stickers .sticker-set-footer{padding:8px 0}.popup-stickers .super-emojis{padding:0 .5rem}.popup-stickers .popup-container{max-height:420px;max-width:420px;padding:0;width:420px}[dir=ltr] .popup-stickers .popup-close{margin-left:1rem}[dir=rtl] .popup-stickers .popup-close{margin-right:1rem}.popup-stickers .popup-close{font-size:1.5rem}.popup-stickers .popup-header{flex:0 0 auto;margin:.625rem 0}.popup-stickers .sticker-set{margin:.0625rem 0}.popup-stickers .sticker-set .row-title{font-weight:var(--font-weight-bold)}.popup-stickers .sticker-set-stickers{--per-row:5;--item-size:var(--popup-sticker-size);display:grid;grid-template-columns:repeat(var(--per-row),1fr);padding:0 5px;position:relative}@media only screen and (max-width:600px){.popup-stickers .sticker-set-stickers{--per-row:4}}.popup-stickers .sticker-set-stickers .media-sticker-wrapper{cursor:pointer;height:var(--item-size);justify-self:center;margin-bottom:2px;position:relative;width:var(--item-size)}@media only screen and (max-width:600px){.popup-stickers .sticker-set-stickers .media-sticker-wrapper{margin-bottom:8px}}.popup-stickers .sticker-set-stickers .media-sticker-wrapper:hover{background-color:var(--light-secondary-text-color);border-radius:12px}.popup-date-picker{-webkit-user-select:none;-moz-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-bottom:1.375rem;margin-left:6px;margin-top:4px}.popup-date-picker .popup-title{font-size:20px;font-weight:var(--font-weight-bold)}.popup-date-picker .popup-buttons{margin-right:-2px;order:2}.popup-date-picker .popup-buttons button+button{margin-left:9px;margin-top:0}.popup-date-picker .date-picker-controls{align-items:center;display:flex;justify-content:space-between}.popup-date-picker .date-picker-controls .date-picker-month-title{font-size:14px;font-weight:var(--font-weight-bold)}.popup-date-picker .date-picker-prev{transform:rotate(90deg)}.popup-date-picker .date-picker-next{transform:rotate(-90deg)}.popup-date-picker .date-picker-next:disabled,.popup-date-picker .date-picker-prev:disabled{visibility:hidden}.popup-date-picker .date-picker-months{margin-bottom:1.5rem;margin-top:7px;-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-date-picker .date-picker-month{display:grid;grid-template-columns:repeat(7,1fr);justify-content:center;width:100%}.popup-date-picker .date-picker-month .btn-icon{align-items:center;color:var(--secondary-text-color);display:flex;font-size:12px;height:38px;justify-content:center;justify-self:center;width:38px}.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:var(--primary-text-color)}.popup-date-picker .date-picker-month .btn-icon.active{background-color:var(--primary-color)!important;border-radius:50%;color:var(--badge-text-color)}.popup-schedule .popup-header{justify-content:space-between;margin-bottom:17px;margin-left:0;margin-top:5px}@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;padding:4px 16px 16px;width:420px}@media only screen and (max-width:600px){.popup-schedule .popup-container{min-width:312px;padding:4px 14px 14px;width:312px}}.popup-schedule .popup-container[data-lines="5"]{top:-16px}.popup-schedule .popup-container[data-lines="7"]{top:16px}.popup-schedule .date-picker-month{margin-left:2px;margin-right:-20px;width:auto}@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-size:20px;font-weight:var(--font-weight-bold);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{font-size:14px;font-weight:var(--font-weight-bold);height:36px;justify-self:auto;margin-top:-4px;width:36px}.popup-schedule .date-picker-month-date:disabled{color:#9ba3a8!important}.popup-schedule .date-picker-month-day{color:var(--primary-text-color)!important;font-size:14px!important;font-weight:var(--font-weight-bold)}.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:400}@media only screen and (max-width:600px){.popup-schedule .btn-primary{widtH:280px;height:50px;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{opacity:0!important;pointer-events:none}.popup-create-poll .input-field .btn-icon{opacity:1;position:absolute;right:.4375rem;top:.4375rem;transition:opacity .2s ease;z-index:1}@media only screen and (max-width:600px){.popup-create-poll .input-field .btn-icon{right:.3125rem;top:.3125rem}}.popup-create-poll .caption{color:var(--secondary-text-color);font-weight:var(--font-weight-bold);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{font-size:.875rem;line-height:1.2;margin-top:.875rem}.popup-create-poll .btn-primary{width:94px}.popup-create-poll .menu-send{right:20px;top:54px}.popup-create-poll hr:not(.hide){display:block!important}.popup-forward .popup-container{height:40.625rem;max-height:min(40.625rem,100%);max-width:420px;padding:7px 0 0;width:420px}.popup-forward .popup-header{flex:0 0 auto;margin-bottom:7px;padding:0 1rem}@media only screen and (max-width:600px){.popup-forward .popup-header{padding-left:.8125rem}}.popup-forward .popup-title{flex-grow:1;height:100%;padding:0}.popup-forward .chatlist-container,.popup-forward .selector{display:flex;flex:1 1 auto;flex-direction:row;height:auto;overflow:hidden;width:100%}.popup-forward .selector-search-input{font-size:var(--font-size-20);height:100%;line-height:1;padding:.5rem 1.5rem;width:100%}@media only screen and (max-width:600px){.popup-forward .selector-search-input{padding-left:1.1875rem}}.popup-forward .selector .chatlist{margin-top:0!important}.popup-forward .gradient-delimiter{display:none}.popup-forward .sidebar-left-section{margin-bottom:0!important;padding-top:0!important}.popup-instance-deactivated{background-color:rgba(0,0,0,.6)}.popup-instance-deactivated .instance-deactivated-container{margin:auto;pointer-events:none;text-align:center}.popup-instance-deactivated .header{color:#fff;font-size:2rem}.popup-instance-deactivated .subtitle{color:#fff;font-size:1.5rem;line-height:var(--line-height);opacity:.6}.popup-join-chat-invite{-webkit-user-select:none;-moz-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:var(--font-weight-bold);line-height:var(--line-height);margin:.75rem 0 .25rem}.popup-join-chat-invite .chat-participants-count{color:var(--secondary-text-color);font-size:.875rem;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;user-select:none}.popup-report-messages-confirm .media-sticker-wrapper{height:100px;margin:0 auto;position:relative;width:100px}.popup-report-messages-confirm .popup-body{margin:1rem 0 .375rem;overflow:visible;overflow:initial}.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-call .popup-header{justify-content:space-between;width:100%}.popup-call .popup-title{flex:1 1 auto}.call{align-items:center;color:#fff;height:100%;width:100%}.call.is-full-screen,html.is-mobile .call{border-radius:0}.call.is-full-screen:not(.show-controls){cursor:none}.call.no-video .call-button,.call.no-video .call-button-text,.call.no-video .call-emojis,.call.no-video .call-party-state,.call.no-video .call-subtitle,.call.no-video .call-title,.call.no-video .popup-header,.call.show-controls .call-button,.call.show-controls .call-button-text,.call.show-controls .call-emojis,.call.show-controls .call-party-state,.call.show-controls .call-subtitle,.call.show-controls .call-title,.call.show-controls .popup-header{opacity:1}.call.show-controls .call-video{opacity:.8}.call.show-controls .call-video-blur{opacity:.56}.call .popup-header .btn-icon{color:#fff}.call .popup-header .call-emojis{margin-right:1rem;transform:scale(1.3125)}.call-avatar{border-radius:inherit;bottom:0;left:0;opacity:.7;position:absolute;right:0;top:0;z-index:-1}.call-avatar .avatar-full{font-size:6rem}.call-title{font-size:1.25rem;font-weight:var(--font-weight-bold)}.call-subtitle{font-size:1rem}.call .popup-header,.call-emojis,.call-subtitle,.call-title{opacity:0}body.animation-level-2 .call .popup-header,body.animation-level-2 .call-emojis,body.animation-level-2 .call-subtitle,body.animation-level-2 .call-title{transition:opacity var(--transition-standard-in)}.call-buttons{align-items:center;align-self:center;bottom:1.75rem;display:flex;pointer-events:none;position:absolute;z-index:1}.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 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 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(var(--call-button-size)*-.5 + var(--call-button-margin)*-.5))}.call-buttons.is-second{--margin-length:2}.call-buttons.is-second .call-button,.call-buttons.is-second .call-button-text{transform:translateX(calc(var(--call-button-size)*2 + var(--call-button-margin)*var(--margin-length)))}.call.no-screen .call-buttons.is-second{--margin-length:.656875}.call-button{background-color:hsla(0,0%,100%,.1)}.call-button-red{background-color:var(--danger-color)!important}.call-button-green{background-color:var(--gc-green-text-color)!important}.call-button.active{background-color:#fff!important}.call-button.active:before{color:#9e9e9e}.call-button,.call-button-text{opacity:0}.call-video{border-radius:inherit;height:100%;-o-object-fit:contain;object-fit:contain;opacity:1;position:absolute;width:100%}.call-video-container{align-items:center;background-color:#000;bottom:0;display:flex;left:0;position:absolute;right:0;top:0;z-index:-1}.call-video-container.small{border-radius:10px;bottom:8rem;cursor:pointer;left:auto;right:1rem;top:auto;z-index:1}.call-video-blur{border-radius:inherit;height:100%;opacity:.7;position:absolute;width:100%}body.animation-level-2 .call-video,body.animation-level-2 .call-video-blur{transition:opacity var(--transition-standard-in)}.call .call-emojis{transform:scale(1.125)}.call .call-emojis .emoji{margin:0 .125rem}.call-party-states{align-items:center;bottom:calc(4.25rem + var(--call-button-size));display:flex;flex-direction:column;padding:0 1rem;pointer-events:none;position:absolute;width:100%;z-index:2}.call-party-state{align-items:center;-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);background-color:hsla(0,0%,100%,.2);border-radius:1.625rem;color:#fff;display:flex;font-size:.875rem;font-weight:var(--font-weight-bold);height:1.625rem;line-height:1.625rem;margin-top:1rem;max-width:100%;opacity:0;padding:0 .625rem;transform:scale(0) translateY(0)}body.animation-level-2 .call-party-state{transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-party-state .rlottie-icon{flex:0 0 auto;height:1.875rem!important;margin-left:-.25rem;margin-right:.25rem;width:1.875rem!important}.call-party-state.is-visible:not(.backwards){transform:scale(1) translateY(0)}.call-party-state-text,.call-title{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.call.two-button-rows .call-buttons.is-first .call-button,.call.two-button-rows .call-buttons.is-first .call-button-text{transform:translateY(calc(var(--call-button-size)*-1 + var(--call-button-margin)*-1 + -1.125rem))}.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-group-call:not(.movable-element){top:7rem}.popup-group-call:not(.movable-element) .group-call{border-bottom-left-radius:0;border-bottom-right-radius:0}.popup-group-call .popup-body{justify-content:space-between}.popup-group-call .popup-container{background-color:var(--gc-background-color);color:var(--gc-primary-text-color)}.popup-group-call .popup{z-index:6}.group-call{--call-button-margin:1.25rem;height:100%;padding:0 .5rem;width:100%}.group-call:after{background:linear-gradient(180deg,rgba(33,33,33,0) 0,rgba(33,33,33,.65) 48.54%,var(--gc-background-color) 100%);bottom:0;content:" ";height:7.5rem;left:0;position:absolute;right:0}.group-call-header{height:3.5rem;margin-bottom:.125rem;padding:0 .5rem}.group-call-header .btn-icon{color:inherit;flex:0 0 auto}.group-call-header-info{flex:1 1 auto;margin-left:1.5rem;overflow:hidden}.group-call-header-title{font-weight:var(--font-weight-bold)}.group-call-header-subtitle,.group-call-header-title{font-size:var(--font-size-16);line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-header-subtitle{color:var(--gc-secondary-text-color);font-size:.875rem}.group-call-buttons{align-items:center;align-self:center;bottom:1.75rem;display:flex;justify-content:space-between;position:absolute;z-index:1}.group-call-button{background-color:var(--gc-button-unmuted-color);color:var(--gc-primary-text-color);opacity:1}.group-call[data-mic-state=muted] .group-call-button{background-color:var(--gc-button-muted-color)}.group-call[data-mic-state=hand] .group-call-button{background-color:var(--gc-button-hand-color)}.group-call:not(.is-big-layout)[data-mic-state=unmuted] .group-call-button{background-color:var(--gc-button-unmuted-fill-color)}.group-call-button-red{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{padding-right:.5rem}.group-call-participant-status-icon{display:inline-block;font-size:1.125rem;height:1.125rem;line-height:1;margin-right:6px;vertical-align:middle;width:1.125rem}.group-call-participant-status-container{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-participant .dialog-subtitle,.group-call-participant .dialog-title{padding-right:2.5rem}.group-call-participant-muted-icon-container{position:absolute!important;right:.5rem}.group-call-participant-video-container{align-items:center;background-color:#000;border-radius:10px;cursor:pointer;display:flex;flex:1 1 auto;height:15rem;margin:.25rem;overflow:hidden;position:relative;width:100%;width:33%}.group-call-participant-video-container:after{background:linear-gradient(180deg,transparent 55.62%,rgba(0,0,0,.5) 86.46%);bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.group-call-participant-video-container .group-call-participant-status-icon{font-size:1.25rem;height:1.25rem;width:1.25rem}.group-call-participant-video-container:after,.group-call-participant-video-header,.group-call-participant-video-info{opacity:0}body.animation-level-2 .group-call-participant-video-container:after,body.animation-level-2 .group-call-participant-video-header,body.animation-level-2 .group-call-participant-video-info{transition:opacity var(--transition-standard-in)}.group-call-participant-video-header,.group-call-participant-video-info{align-items:center;bottom:.25rem;display:flex;justify-content:space-between;left:0;padding:0 .5rem 0 .75rem;position:absolute;right:0;z-index:1}.group-call-participant-video-header{bottom:auto;justify-content:flex-end;padding-right:.75rem;padding-top:.875rem;top:0}.group-call-participant-video-header .group-call-pin-icon{font-size:1.5rem;height:1.5rem;width:1.5rem}.group-call-participant-video-info .peer-title{font-weight:var(--font-weight-bold)}.group-call-participant-video-info .peer-title,.group-call-participant-video-info-left{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-participant-video-info .group-call-participant-status-container{margin-top:-1px;opacity:.6}.group-call-participant-video-info-left{flex:1 1 auto}.group-call-participant-video-info-right{flex:0 0 auto;height:2rem;margin-left:.75rem;width:2rem}.group-call-participant .is-speaking{color:var(--gc-green-text-color)}.group-call-participant .is-waiting{color:var(--gc-blue-text-color)}.group-call-participants{border-radius:10px;flex:1 1 auto;overflow:hidden}.group-call-participants-scrollable{border-radius:inherit;height:auto;padding-bottom:6rem;position:relative}.group-call-participants-video-container{display:flex;flex-wrap:wrap;margin:-.25rem -.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="3"] .group-call-participant-video-container:nth-child(n+2),.group-call-participants-video-container[data-layout="4"] .group-call-participant-video-container{flex:1 0 auto;height:auto}.group-call-participants-video-container[data-layout="3"] .group-call-participant-video-container:nth-child(n+2):before,.group-call-participants-video-container[data-layout="4"] .group-call-participant-video-container: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-header,.group-call-participants-video-container.show-controls .group-call-participant-video-info{opacity:1}.group-call-participants .chatlist{background:none;margin:0 auto;max-width:600px;padding:0}.group-call-participants .user-title{color:var(--gc-primary-text-color)}.group-call-participants .user-last-message{color:var(--gc-secondary-text-color)}.group-call-big-video-container{position:relative}.group-call-big-video-container .group-call-participants-video-container{margin-bottom:.25rem;min-height:100%}.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,.group-call:not(.is-big-layout) .group-call-big-video-container,.group-call:not(.is-big-layout) .popup-body .group-call-header,.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:active,html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:hover{background-color:hsla(207,4%,46%,.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% - var(--gc-right-column-width))}.group-call.is-big-layout.is-right-column-shown .group-call-buttons{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{background-color:var(--gc-background-color);bottom:0;padding:inherit;position:absolute;right:calc(var(--gc-right-column-width)*-1);top:0;width:var(--gc-right-column-width)}.group-call.is-big-layout .group-call-buttons{bottom:2.5rem;padding:.75rem}body.animation-level-2 .group-call.is-big-layout .group-call-buttons{transition:opacity var(--transition-standard-in)}.group-call.is-big-layout .group-call-buttons:before{-webkit-backdrop-filter:blur(100px);backdrop-filter:blur(100px);background:rgba(0,0,0,.5);border-radius:1.25rem;bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.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 var(--transition-standard-in)}body.animation-level-2 .group-call.is-big-layout .group-call-buttons .group-call-button{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-sponsored .scrollable-y{margin:0 -1.5rem;max-height:25rem;padding:.5rem 1.5rem;position:relative;-webkit-user-select:text;-moz-user-select:text;user-select:text;width:calc(100% + 3rem)}.popup-mute .popup-container{min-width:16rem}.popup-reacted-list{--size:1.5rem;--custom-emoji-size:var(--size)}.popup-reacted-list .popup-container{height:600px;max-height:600px;padding:0;width:25rem}.popup-reacted-list .popup-header{border-bottom:1px solid var(--border-color);margin:0;min-height:3.5625rem;padding:.25rem .75rem .75rem}.popup-reacted-list .popup-close{height:40px;margin-right:.5rem;margin-top:.375rem;order:-1}.popup-reacted-list .reaction{--reaction-size:var(--size);--additional-height:.75rem;--margin:.5rem;--background-color:var(--light-filled-primary-color);--counter-color:var(--primary-color);flex:1 0 auto;justify-content:space-evenly}.popup-reacted-list .reaction.is-chosen:not(.backwards){--counter-color:#fff}.popup-reacted-list .reaction-sticker-icon{align-items:center;display:flex;font-size:1.25rem!important;margin:0}.popup-reacted-list .sidebar-left-section{margin-bottom:0!important}.popup-reacted-list .tabs-container{flex:1 1 auto;overflow:hidden}.popup-reacted-list .tabs-tab{background-color:var(--surface-color)}.popup-reacted-list .reacted-list-reaction-icon{display:flex;height:var(--size);position:absolute;right:1rem;top:50%;transform:translateY(-50%);width:var(--size)}.popup-reacted-list .chatlist-chat{padding-right:3.25rem!important}.popup-payment .popup-container{border-radius:16px;max-height:min(100%,43.5rem);max-width:26.25rem;padding:0;width:26.25rem}.popup-payment .popup-header{height:3.5rem;margin:0;padding:0 1rem}.popup-payment.is-loading .popup-container{min-height:26.25rem}.popup-payment .scrollable{display:flex;flex:1 1 auto;flex-direction:column}.popup-payment hr{display:block!important;margin:.5rem 0!important;padding:0!important}.popup-payment .input-field{--height:3rem;margin:.75rem .5rem 0}.popup-payment .input-field-input{--padding:.75rem}.popup-payment .input-fields-row .input-field{margin-top:1.25rem}.popup-payment .sidebar-left-section{padding:0!important}.popup-payment .sidebar-left-section-name+.input-field,.popup-payment .sidebar-left-section-name+.input-fields-row .input-field{margin-top:.75rem}.popup-payment .sidebar-left-section .row{margin-top:.5rem}.popup-payment .sidebar-left-section-content{margin:0 .5rem!important}.popup-payment .select-wrapper{box-shadow:var(--menu-box-shadow);max-height:10rem}.popup-payment .select-wrapper li{grid-template-columns:calc(26px + 2rem) 1fr;height:3rem}.popup-payment .payment-verification{border:none;flex:1 1 auto;height:40rem;max-height:100%;width:100%}.popup-payment .row{border-radius:10px}.payment-item{padding:0 1.25rem;width:100%}.payment-item-details{display:flex;flex:0 0 auto;justify-content:space-between;margin-bottom:1rem;overflow:hidden}.payment-item-details:last-child{margin-bottom:0}.payment-item-details-photo{border-radius:10px;flex:0 0 auto;height:6.25rem;margin-right:1rem;width:6.25rem}.payment-item-details-photo .media-photo{border-radius:inherit}.payment-item-details-lines{display:flex;flex:1 1 auto;flex-direction:column}.payment-item-details-lines-title{font-size:var(--font-size-16);font-weight:var(--font-weight-bold);line-height:var(--line-height-16)}.payment-item-details-lines-bot-name,.payment-item-details-lines-description{font-size:var(--font-size-14);line-height:1.25rem}.payment-item-details-lines-bot-name{color:var(--secondary-text-color)}.payment-item-prices{display:flex;flex-direction:column;margin:1rem .25rem .5rem}.payment-item-prices-price{color:var(--secondary-text-color);display:flex;font-weight:500;justify-content:space-between;line-height:1.1875rem}.payment-item-prices-price+.payment-item-prices-price{margin-top:1.5rem}.payment-item-prices-price.is-total{color:var(--primary-text-color)}.payment-item-tips{display:flex;justify-content:space-between;margin:.75rem -.5rem 1.5rem}.payment-item-tips-tip{--background-intensity:.1;background-color:rgba(84,190,97,var(--background-intensity));border-radius:1.25rem;color:#3ba748;flex:1 1 auto;font-size:var(--font-size-16);font-weight:var(--font-weight-bold);height:2.5rem;line-height:2.5rem;text-align:center}body.animation-level-2 .payment-item-tips-tip{transition:color .1s ease-in-out,background-color .1s ease-in-out}.payment-item-tips-tip+.payment-item-tips-tip{margin-left:.5rem}html.no-touch .payment-item-tips-tip:not(.active):active,html.no-touch .payment-item-tips-tip:not(.active):hover{--background-intensity:.3}.payment-item-tips-tip.active{--background-intensity:1;color:#fff}.payment-item-tips-input{color:inherit!important;display:inline;font-weight:inherit!important}.payment-item-row{margin:0 .5rem;padding-bottom:0;padding-top:0}.payment-item-method-row .media-photo{border-radius:10px}.payment-item-pay{flex:0 0 auto;height:3rem;margin:1rem;text-transform:uppercase;width:auto}.payment-item-preloader-container{flex:1 1 auto;position:relative}.popup-payment-shipping-methods .popup-container{min-height:auto}.popup-payment-shipping-methods .row{margin-top:0!important}.popup-payment-verification .popup-header:after{background-color:var(--border-color);bottom:-1px;content:" ";height:1px;left:0;position:absolute;right:0}.popup-payment-card-confirmation .popup-container{min-height:auto}.popup-payment-card-confirmation .input-field-password{margin-top:.5rem!important}.popup-limit .popup-container{min-width:min(100%,22.5rem)}.popup-limit-line{align-items:center;display:flex;flex-direction:column;margin:.75rem 0}.popup-limit-hint{align-items:center;color:#fff;display:flex;font-weight:var(--font-weight-bold);justify-content:center;transform:scale(.6) translate(-280px,16px) rotate(-30deg)}body.animation-level-2 .popup-limit-hint{transition:transform .3s cubic-bezier(.12,1.1,.56,1.2)}.popup-limit-hint.active{transform:scale(1) translate(0) rotate(0)}.popup-limit-hint-icon{display:flex;font-size:1.25rem;margin-right:.25rem}.popup-limit-button.primary{align-items:center;background:linear-gradient(88.39deg,#6c93ff -2.56%,#976fff 51.27%,#df69d1 107.39%);color:#fff!important;display:flex}.popup-limit-button-icon{display:flex;font-size:1.5rem;margin-left:.625rem}.popup-limit .limit-line{align-self:stretch;margin:1rem .5rem 0}.popup-limit:not(.is-locked) .popup-limit-hint{background:linear-gradient(73.4deg,#6c93ff -7.21%,#976fff 114.57%,#df69d1 241.52%);background-size:200px 2rem;border-radius:1rem;height:2rem;padding:0 .75rem;position:relative}.popup-limit:not(.is-locked) .popup-limit-hint:after{background:inherit;background-position-x:calc(-50% - 86px);background-repeat:no-repeat;background-size:inherit;bottom:-9px;-webkit-clip-path:path("M0 0H26H24.4853C22.894 0 21.3679 0.632141 20.2426 1.75736L14.4142 7.58579C13.6332 8.36684 12.3668 8.36683 11.5858 7.58579L5.75736 1.75736C4.63214 0.632139 3.10602 0 1.51472 0H0Z");clip-path:path("M0 0H26H24.4853C22.894 0 21.3679 0.632141 20.2426 1.75736L14.4142 7.58579C13.6332 8.36684 12.3668 8.36683 11.5858 7.58579L5.75736 1.75736C4.63214 0.632139 3.10602 0 1.51472 0H0Z");content:" ";display:block;height:9px;left:50%;margin-left:-13px;position:absolute;width:100%}.popup-limit.is-locked .popup-limit-hint{background-color:var(--primary-color);border-radius:1.375rem;height:2.75rem;margin-right:-.25rem;padding:0 1.25rem 0 1rem}.popup-limit.is-premium .popup-limit-hint{align-self:flex-end;background:linear-gradient(84.4deg,#6c93ff -4.85%,#976fff 51.72%,#df69d1 110.7%);background-position-x:100%;background-size:200px 2rem;border-bottom-right-radius:0;margin-right:.5rem}body.animation-level-2 .popup-limit.is-premium .popup-limit-hint{transition:transform .3s cubic-bezier(.12,1.1,.56,1.1)}.popup-limit.is-premium .popup-limit-hint:after{background-position-x:134%;bottom:-11.3px;-webkit-clip-path:path("M8.44528 0.5H20.5V10.1943C20.5 10.9154 19.9154 11.5 19.1943 11.5C18.8178 11.5 18.4597 11.3375 18.2117 11.0541L10.2274 1.92918C9.75146 1.38523 9.18812 0.924478 8.56057 0.565879L8.44528 0.5Z");clip-path:path("M8.44528 0.5H20.5V10.1943C20.5 10.9154 19.9154 11.5 19.1943 11.5C18.8178 11.5 18.4597 11.3375 18.2117 11.0541L10.2274 1.92918C9.75146 1.38523 9.18812 0.924478 8.56057 0.565879L8.44528 0.5Z");height:12px;left:100%;margin-left:-20.6px}#auth-pages{background:var(--surface-color);max-width:100%;overflow:hidden}#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;padding:0 16px;width:100%}}#auth-pages .auth-image,#auth-pages .input-wrapper,#auth-pages .subtitle{flex:0 0 auto}#auth-pages>.scrollable{display:flex;flex-direction:column;margin:0 auto;max-width:720px;position:relative}#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{margin:0 auto;max-width:720px;min-width:auto;position:relative}#auth-pages .tabs-container .tabs-tab{background-color:var(--surface-color)}#auth-pages .tabs-container .tabs-tab .container{display:flex;flex:1 1 auto;flex-direction:column;height:810px;padding:0;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-bottom:.5rem;margin-top:.5rem}.page-sign .auth-image,.page-signUp .auth-image{height:7.5rem;margin-bottom:1.5rem;width:7.5rem}@media only screen and (min-width:601px){.page-sign .auth-image,.page-signUp .auth-image{height:10rem;margin-bottom:1.5rem;width:10rem}}.page-authCode .phone-wrapper{flex:0 0 auto}.sign-logo{fill:var(--primary-color);max-height:100%;max-width:100%}.page-sign .btn-secondary,.page-signQR .btn-secondary{font-weight:400}.page-sign .qr,.page-signQR .qr{margin-top:1.5rem}.page-signQR{overflow:visible!important;overflow:initial!important}.page-signQR .auth-image{align-items:center;display:flex;height:240px!important;justify-content:center;width:240px!important}.page-signQR .auth-image .preloader{left:auto;top:auto;transform:none}.page-signQR .auth-image .qr-canvas{height:100%;width: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}[dir=ltr] .page-signQR .qr-description{text-align:left}[dir=rtl] .page-signQR .qr-description{text-align:right}.page-signQR .qr-description{line-height:var(--line-height);margin:1rem auto;max-width:480px}.page-signQR .qr-description li{margin-top:.5rem}.page-signUp .auth-image{margin-bottom:14px;margin-top:10px}@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 var(--transition-standard-in)}.page-authCode .auth-image{transform:translateY(12px)}.page-authCode .phone-wrapper{align-items:center;display:flex;justify-content:center;margin:1.375rem 0 .875rem}.page-authCode .phone-wrapper h4[contenteditable]{border:none;border-bottom:2px solid var(--primary-color);outline:none;padding:0 1rem}.page-authCode .phone-wrapper .phone.error{border-color:var(--danger-color)!important}.page-authCode .phone-wrapper .phone{margin:0}.page-authCode .subtitle{margin:0 auto!important;max-width:300px}.page-chats{display:flex;max-width:1682px!important}.page-chats .avatar-edit .tgico-cameraadd{top:52%}.page-chats #main-columns{height:100%;max-height:100%;min-height:100%;overflow:hidden;position:relative;width:100%}@media only screen and (max-width:600px){.page-chats .main-column{display:flex!important;width:100%;z-index:1}}@media only screen and (min-width:601px){.page-chats #column-center{background-color:#e6ebee;display:flex!important;width:100%}.page-chats #column-right{display:flex!important}.page-chats .main-column{height:100%;max-height:100%;min-height:100%;position:relative}.page-chats #main-columns{display:flex}}.page-chats #search-container,.page-chats .sidebar-search{flex-direction:column;height:100%;left:0;max-height:100%;overflow:hidden;position:absolute;top:0;width:100%;z-index:3}@media only screen and (min-width:1681px){.page-chats{border-color:var(--border-color);border-style:solid;border-width:0 1px}}.page-chats .avatar-edit{flex:0 0 auto;height:120px;margin:1rem auto 2rem;width:120px}body.animation-level-2 .page-chats .main-column{transition:transform var(--tabs-transition),filter var(--tabs-transition)}body,html{height:100%;margin:0;overflow:hidden;padding:0;width:100%}@media only screen and (max-width:600px){body,html{height:calc(var(--vh, 1vh)*100)}}html.is-ios{-webkit-touch-callout:none;position:fixed;-webkit-user-select:none}html.no-backdrop{--menu-background-color:var(--surface-color);--menu-backdrop-filter:none}@supports(padding:max(0px)){html{padding:0 min(16px,env(safe-area-inset-right)) 0 min(16px,env(safe-area-inset-left))}}html{-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);font-size:16px}body{background-color:var(--body-background-color);color:var(--primary-text-color)}body.deactivated{animation:grayscale-in var(--transition-standard-in) forwards}body.deactivated-backwards{animation:grayscale-out var(--transition-standard-out) forwards}@keyframes grayscale-in{0%{filter:grayscale(0)}to{filter:grayscale(1)}}@keyframes grayscale-out{0%{filter:grayscale(1)}to{filter:grayscale(0)}}a{color:var(--link-color)}button,html,input,optgroup,select,textarea{font-family:Roboto,-apple-system,apple color emoji,BlinkMacSystemFont,Segoe UI,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif}a,button,div,input,select,textarea{-webkit-tap-highlight-color:rgba(0,0,0,0)}code,kbd,pre,samp{font-family:var(--font-monospace)}.whole{height:100%;margin:0 auto;max-width:1680px;min-height:100%;width: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:var(--font-weight-bold)}h4{font-size:2rem;line-height:110%;margin:22px 0 14px}@media only screen and (max-width:600px){h4{font-size:20px;margin:2px 0 8px}}[contenteditable=true],input{background-color:transparent;caret-color:var(--primary-color);color:var(--primary-text-color)}input,textarea{-webkit-appearance:none}input::-webkit-contacts-auto-fill-button,input::-webkit-credentials-auto-fill-button{position:absolute;right:0;visibility:hidden}input:-webkit-autofill:first-line{font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,Helvetica Neue,Arial;font-size:16px}.subtitle{color:var(--secondary-text-color);line-height:1.35}.danger{color:var(--danger-color)!important}.danger .c-ripple__circle{background-color:var(--light-danger-color)}.blue,.primary{color:var(--primary-color)!important}.blue .c-ripple__circle,.primary .c-ripple__circle{background-color:var(--light-primary-color)}.primary-text{color:var(--primary-text-color)!important}.color-premium{-webkit-text-fill-color:transparent;background:var(--premium-gradient);-webkit-background-clip:text}.blue:before,.danger:before,.primary:before{color:inherit!important}.bg-warning{background:#fed85a!important}.contextmenu{bottom:auto!important;position:fixed!important;right:auto!important;width:auto!important;z-index:4!important}.preloader{height:50px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:50px}.preloader .preloader-path{stroke:var(--primary-color)}@keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-in-backwards-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-out-backwards-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}.toast{-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);background-color:rgba(0,0,0,.66);border-radius:10px;color:#fff;font-size:1rem;left:50%;max-width:min(30rem,calc(100vw - 2rem));opacity:0;padding:.5rem 1rem;position:fixed;top:50%;transform:translate(-50%,-50%);z-index:5}.toast.is-visible{opacity:1}body.animation-level-2 .toast{transition:opacity var(--transition-standard-in)}.toast b{color:inherit}.toast a{color:#60a5e9!important;cursor:pointer}hr{border:none;border-top:1px solid var(--border-color);margin:0;padding-bottom:.5rem;width:100%}b{font-weight:var(--font-weight-bold)}.avatar-edit{border-radius:50%;cursor:pointer;overflow:hidden;position:relative}.avatar-edit.is-forum{border-radius:var(--avatar-border-radius-forum)}.avatar-edit-canvas{background:linear-gradient(var(--avatar-color-top),var(--avatar-color-bottom));height:100%;max-height:100%;max-width:100%;width:100%}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{color:#fff;font-size:3rem;height:3rem;left:50%;line-height:1;position:absolute;top:50%;transform:translateY(-50%) translateX(-50%);width:3rem;z-index:2}.avatar-edit .avatar-placeholder{filter:brightness(.7);height:100%;left:0;position:absolute;top:0;width:100%}.missing-icon{height:1.5rem;width:1.5rem}.missing-icon-path{fill:currentColor}.select-wrapper{background-color:var(--surface-color);border-radius:10px;display:flex;flex-direction:column;flex-wrap:wrap;left:0;max-height:23.5rem;opacity:0;overflow:hidden;position:absolute;top:calc(100% + .5rem);transform:scale(.95);transform-origin:top center;transition:opacity .2s ease-out,transform .2s ease-out;width:100%;z-index:3}.select-wrapper.active{opacity:1;transform:scale(1)}.select-wrapper ul{margin:.5rem 0}[dir=ltr] .select-wrapper li{text-align:left}[dir=rtl] .select-wrapper li{text-align:right}.select-wrapper li{align-items:center;cursor:pointer;display:grid;grid-template-columns:calc(26px + 2rem) 1fr 80px;height:3.5rem;justify-content:space-between;padding:0 1rem}html.no-touch .select-wrapper li:active,html.no-touch .select-wrapper li:hover{background-color:var(--light-secondary-text-color)}.select-wrapper .emoji{font-size:26px;height:26px;line-height:1;width:26px}.select-wrapper .scrollable{position:relative}[dir=ltr] .phone-code{text-align:right}[dir=rtl] .phone-code{text-align:left}.phone-code{color:#9e9e9e}.auth-image{height:166px;margin:0 auto 18px;position:relative;width:166px}@media only screen and (max-width:600px){.auth-image{height:120px;width:120px}}[dir=ltr] .phone-edit{margin-left:.4rem}[dir=rtl] .phone-edit{margin-right:.4rem}.phone-edit{cursor:pointer;font-size:1.5rem;height:1.5rem;line-height:1;opacity:.5;transition:opacity .2s;width:1.5rem}html.no-touch .phone-edit:active,html.no-touch .phone-edit:hover{opacity:1}span.emoji{display:inline!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;vertical-align:baseline!important;vertical-align:initial!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[dir=ltr]:not(.is-safari) span.emoji{margin-right:5px!important}html[dir=rtl]:not(.is-safari) span.emoji{margin-left:5px!important}html[dir=ltr]:not(.is-safari) avatar-element span.emoji{margin-right:0!important}html[dir=rtl]:not(.is-safari) avatar-element span.emoji{margin-left:0!important}}img.emoji{display:inline-block;height:18px;max-height:100%;max-width:100%;vertical-align:middle;width:18px}[contenteditable=true]{cursor:text;outline:none;-webkit-user-select:text;-moz-user-select:text;user-select:text;white-space:pre-wrap}[contenteditable=true] .custom-emoji{display:inline-block;margin-bottom:-2px}[contenteditable=true] .custom-emoji:before{content:none}[contenteditable=true] [style*=markup]{font-family:inherit!important}[contenteditable=true] [style*=bold]{font-weight:700}[contenteditable=true] [style*=italic]{font-style:italic}[contenteditable=true] [style*=underline]{text-decoration-line:underline}[contenteditable=true] [style*=strikethrough]{text-decoration-line:line-through}[contenteditable=true] [style*=underline][style*=strikethrough]{text-decoration-line:underline line-through}[contenteditable=true] [style*=monospace]{font-family:var(--font-monospace)!important}[contenteditable=true] [style*=spoiler]{background-color:var(--spoiler-draft-background-color)}[contenteditable][data-placeholder]:before{color:#a2acb4;content:attr(data-placeholder);display:block;opacity:0;pointer-events:none;position:absolute}body.animation-level-2 [contenteditable][data-placeholder]:before{transform:translateX(1.75rem);transition:opacity var(--input-transition) .01s,transform var(--input-transition) .01s}[contenteditable][data-placeholder]:empty:before{opacity:1}body.animation-level-2 [contenteditable][data-placeholder]:empty:before{transform:translateX(0)}.sticky_sentinel{left:0;pointer-events:none;position:absolute;right:0;visibility:hidden}.super-stickers{display:grid;grid-template-columns:repeat(auto-fill,var(--esg-sticker-size));justify-content:space-between;width:100%}html.no-touch .super-sticker:active,html.no-touch .super-sticker:hover{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{cursor:pointer;padding-bottom:13px;padding-top:13px;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (min-width:601px){[dir=ltr] .show-more{padding-left:8px}[dir=rtl] .show-more{padding-right:8px}}[dir=ltr] .show-more .tgico-down{padding-left:1rem;padding-right:2rem}[dir=rtl] .show-more .tgico-down{padding-left:2rem;padding-right:1rem}.show-more .tgico-down{float:left;font-size:24px}.content-empty,.show-more .tgico-down{color:var(--secondary-text-color)}::-moz-selection{background:var(--selection-background-color)}.selection:after,::selection{background:var(--selection-background-color)}.selection:after{bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.input-something{display:inline-block}.input-selectable{position:relative}@keyframes grow-icon{0%{opacity:.8;transform:scale(.5)}50%{opacity:1;transform:scale(1.1)}to{transform:scale(1)}}@keyframes hide-icon{0%{opacity:.4;transform:scale(1)}to{opacity:0;transform:scale(.5)}}.popup-disable-password .popup-description,.popup-skip-email .popup-description{max-width:284px}.grid{grid-gap:.25rem;display:grid;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr);width:100%}.grid-item{cursor:pointer;height:0;padding-bottom:100%;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.grid-item-media{height:100%;left:0;-o-object-fit:cover;object-fit:cover;position:absolute;top:0;width:100%}.animated-super-row{--translateY:100%;bottom:0;left:0;position:absolute;right:0;top:0;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{bottom:0;left:0;position:absolute;right:0;top:0}middle-ellipsis-element{display:block;overflow:hidden;width:100%}.album-item-media{height:100%;width:100%}html.no-touch .hover-effect:active,html.no-touch .hover-effect:hover{background-color:var(--light-secondary-text-color)}.progress-ring{left:0;pointer-events:none;position:absolute;top:0}.progress-ring__circle{stroke-linecap:round;transition:stroke-dashoffset}.rlottie,.rlottie-vector{bottom:0;height:100%;left:0;max-height:100%;max-width:100%;position:absolute;right:0;top:0;width:100%}.rlottie-icon{pointer-events:none;position:relative}body.animation-level-2 .rlottie.fade-in{animation:fade-in-opacity .2s ease-in-out forwards}.rlottie-vector{fill:rgba(0,0,0,.08)}.canvas-thumbnail{height:100%;position:absolute;width:100%}.media-container-contain{position:relative}.media-container-contain .media-photo{max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain}.media-container-cover{position:relative}.media-container-cover .media-photo{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.media-photo,.media-poster,.media-round,.media-sticker,.media-video{bottom:0;left:0;position:absolute;right:0;top:0}body.animation-level-2 .media-photo.fade-in,body.animation-level-2 .media-poster.fade-in,body.animation-level-2 .media-round.fade-in,body.animation-level-2 .media-sticker.fade-in,body.animation-level-2 .media-video.fade-in{animation:fade-in-opacity .2s ease-in-out forwards}body.animation-level-2 .media-photo.fade-out,body.animation-level-2 .media-poster.fade-out,body.animation-level-2 .media-round.fade-out,body.animation-level-2 .media-sticker.fade-out,body.animation-level-2 .media-video.fade-out{animation:fade-out-opacity .2s ease-in-out forwards}.media-video{z-index:1}.media-sticker{height:100%;margin:auto;max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain;width:100%}.media-sticker-wrapper.is-premium-sticker:before{align-items:center;background:rgba(0,0,0,.2);background-image:var(--lock-url);background-repeat:no-repeat;background-size:cover;border-radius:50%;bottom:.125rem;color:#fff;display:flex;height:1.25rem;justify-content:center;left:50%;position:absolute;transform:translateX(-50%);width:1.25rem;z-index:1}body.is-premium .media-sticker-wrapper.is-premium-sticker:after,body.is-premium .media-sticker-wrapper.is-premium-sticker:before{content:none}.media-round{max-height:var(--round-video-size);max-width:var(--round-video-size);z-index:1}.media-round canvas{border-radius:50%;height:100%;position:relative;width:100%}.media-round .video-time{background-color:var(--message-highlightning-color)!important;padding:0 .375rem}[dir=ltr] .media-round .video-time:after,[dir=ltr] .media-round .video-time:before{margin-left:.25rem}[dir=rtl] .media-round .video-time:after,[dir=rtl] .media-round .video-time:before{margin-right:.25rem}.media-round.is-unread .video-time:before{background-color:#fff;border-radius:50%;content:" ";height:.5rem;order:1;width:.5rem}.media-round.is-paused .video-time:after{align-items:center;content:"๎ฆƒ";display:flex;font-size:1.125rem;order:2}.gradient-delimiter{background-color:var(--background-color-true);height:.75rem;position:relative;width:100%}.gradient-delimiter:before{background:linear-gradient(180deg,rgba(0,0,0,.06),transparent 20%,transparent 94%,rgba(0,0,0,.06));bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.sidebar-left-section{background-color:var(--surface-color);box-shadow:0 1px 3px 0 var(--section-box-shadow-color);margin-bottom:.75rem;padding:.5rem 0!important}.sidebar-left-section.no-shadow{box-shadow:none!important}.sidebar-left-section-name{padding:.5rem 1rem}.sidebar-left-section-caption{font-size:var(--font-size-14);line-height:var(--line-height-14);margin:-.1875rem 0 1rem;padding:0 1.5rem}.sidebar-left-section-caption:first-child{margin-bottom:.8125rem;margin-top:.8125rem}@media only screen and (max-width:600px){.sidebar-left-section-caption{padding:0 1rem}}.sidebar-left-section-container{-webkit-user-select:none;-moz-user-select:none;user-select:none}.sidebar-left-section-container a{cursor:pointer}hr{display:none!important}.tgico-admin:before,.tgico-fontsize:before{font-size:20px!important;padding:2px}.tgico-endcall_filled,.tgico-phone_filled{font-size:26px!important}.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}.navigable-list .active{background-color:var(--light-secondary-text-color);border-radius:inherit}.super-emojis{--esg-emoji-total-size:calc(var(--esg-emoji-size) + 0.5rem);--custom-emoji-size:var(--esg-emoji-size);grid-column-gap:2.44px;--esg-emoji-size:2.125rem;--esg-emoji-total-size:2.625rem;--custom-emoji-size:2.25rem;-moz-column-gap:2.44px;column-gap:2.44px;-moz-column-gap:.25rem;column-gap:.25rem;display:grid;font-size:var(--esg-emoji-size);grid-template-columns:repeat(auto-fill,var(--esg-emoji-total-size));justify-content:space-between;line-height:var(--esg-emoji-size);position:relative}.super-emojis .super-emoji{border-radius:8px;cursor:pointer;display:inline-block;height:var(--esg-emoji-total-size);line-height:inherit;margin-left:.0625rem;margin-right:.0625rem;padding:.25rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;width:var(--esg-emoji-total-size)}.super-emojis .super-emoji .emoji-placeholder{background-color:var(--light-secondary-text-color);border-radius:50%;height:1.75rem;left:7px;pointer-events:none;position:absolute;top:7px;width:1.75rem}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{height:100%;margin:0;vertical-align:baseline;vertical-align:initial;width:100%}.super-emojis .super-emoji.active,html.no-touch .super-emojis .super-emoji:active,html.no-touch .super-emojis .super-emoji:hover{background-color:var(--light-secondary-text-color)}.super-emojis.not-local .super-emoji{padding:.1875rem}.super-emojis .super-emoji{margin:0}.super-emojis:not(.not-local) .super-emoji{overflow:hidden}html.native-emoji .super-emojis:not(.not-local) .super-emoji{padding-bottom:.3125rem;padding-top:.3125rem}.super-emojis .custom-emoji{display:block}.super-emojis .custom-emoji-renderer{z-index:1}.super-emojis .custom-emoji:before{content:none}.tgico-char:before{font-family:Roboto!important;font-weight:var(--font-weight-bold);text-align:center;width:1.5rem}.tgico-char.z:before{content:"Z"}.tgico-char.w:before{content:"W"}.sending-status:empty{display:none}.sending-status .tgico-sendingerror{color:var(--danger-color)}.sending-status-icon{line-height:1!important;position:absolute}.quick-reaction-title{align-items:center;display:flex}.quick-reaction-sticker{height:32px!important;margin:0 .5rem 0 0!important;position:relative!important;width:32px!important}.verified-icon-svg{height:1rem;width:1rem}.verified-icon-check{fill:#fff}.verified-icon-background{fill:var(--primary-color)}[dir=ltr] .emoji-status,[dir=ltr] .premium-icon,[dir=ltr] .verified-icon{margin-left:.125rem}[dir=rtl] .emoji-status,[dir=rtl] .premium-icon,[dir=rtl] .verified-icon{margin-right:.125rem}.emoji-status,.premium-icon,.verified-icon{align-items:center;display:flex;flex:0 0 auto;font-size:1rem;height:1.25rem;justify-content:center;width:1.25rem}[dir=ltr] .emoji-status{margin-left:.25rem}[dir=rtl] .emoji-status{margin-right:.25rem}.emoji-status{height:1.125rem;position:relative;width:1.125rem}.premium-icon{color:var(--primary-color);margin-top:-.0625rem}.badge-fake{border:1px solid var(--danger-color);border-radius:.185rem;color:var(--danger-color);flex:0 0 auto;font-size:.625rem;font-weight:var(--font-weight-bold);line-height:1!important;margin-left:.25rem;margin-right:.25rem;padding:.125rem .25rem}.peer-title.with-icons{align-items:center;display:flex;overflow:hidden}.peer-title-inner{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.limit-line{display:flex;font-weight:var(--font-weight-bold);height:2rem}.limit-line-free{color:#000}.limit-line-premium{color:#fff}.limit-line-free{background-color:#f1f3f5;border-bottom-left-radius:10px;border-top-left-radius:10px}.limit-line-premium{background:linear-gradient(84.4deg,#6c93ff -4.85%,#976fff 51.72%,#df69d1 110.7%);border-bottom-right-radius:10px;border-top-right-radius:10px}.limit-line-free,.limit-line-premium{align-items:center;display:flex;flex:1 1 0;justify-content:space-between;padding:0 .75rem}.movable-element{--size:.5rem;position:relative}.movable-element-resize-handler{position:absolute}.movable-element-resize-handler-side-n,.movable-element-resize-handler-side-s{cursor:row-resize;height:var(--size);left:0;right:0}.movable-element-resize-handler-side-e,.movable-element-resize-handler-side-w{bottom:0;cursor:col-resize;top:0;width:var(--size)}.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-ne,.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-se,.movable-element-resize-handler-side-sw{height:var(--size);width: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-nw,.movable-element-resize-handler-side-se{cursor:nwse-resize}.movable-element-resize-handler-side-ne{right:0;top:0}.movable-element-resize-handler-side-se{bottom:0;right:0}.movable-element-resize-handler-side-sw{bottom:0;left:0}.movable-element-resize-handler-side-nw{left:0;top:0}[dir=ltr] .chatlist-chat.row-with-padding{padding-left:4.5rem!important}[dir=rtl] .chatlist-chat.row-with-padding{padding-right:4.5rem!important}.chatlist-chat span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chatlist-chat .row-title{font-size:var(--font-size-16)!important;line-height:1.375rem}.chatlist-chat .row-title-right-secondary{font-size:var(--font-size-12)!important;line-height:var(--line-height-12)!important;margin-top:-.4375rem}.chatlist-chat .row-subtitle{display:block!important}.chatlist-chat .row-row{height:1.375rem}.chatlist-chat.chatlist-chat-abitbigger .row-subtitle{margin-top:0}.chatlist-chat.chatlist-chat-bigger .row-subtitle{font-size:var(--font-size-16)!important;line-height:1.375rem;margin-top:0}.chatlist-chat.chatlist-chat-bigger .row-subtitle-row{margin-top:.125rem}.chatlist-chat.chatlist-chat-bigger .row-title .peer-title{font-weight:var(--font-weight-bold)}.username-purchase-help b{color:var(--danger-color)!important;font-weight:var(--font-weight-normal)!important}.media-spoiler-container{border-radius:inherit;bottom:0;left:0;position:absolute;right:0;top:0;z-index:1}.media-spoiler-container.is-revealing{opacity:1}.media-spoiler-container.is-revealing:not(.backwards){opacity:0}.media-spoiler-container.is-revealing.animating{transition:opacity var(--transition-standard-out)}.media-spoiler .canvas-thumbnail,.media-spoiler-thumbnail{height:100%;-o-object-fit:initial!important;object-fit:fill!important;position:absolute;width:100%} +: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:.2s ease-in-out;--btn-menu-transition:.2s cubic-bezier(.4,0,.2,1);--esg-transition:var(--btn-menu-transition);--input-transition:.2s ease-out;--sticker-viewer-open-transition-in:.2s var(--transition-standard-easing);--sticker-viewer-open-transition-out:.2s var(--transition-standard-easing);--sticker-viewer-switch-transition:.2s cubic-bezier(.12,1.1,.56,1.2);--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:.25s cubic-bezier(.35,.35,.47,1.34);--chatlist-badge-transition-out:.25s 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) + 0.5rem)*-1);--message-time-background:rgba(0,0,0,.35);--message-highlightning-color:rgba(109,141,65,.4);--messages-container-width:728px;--messages-text-size:16px;--messages-line-height:1.3125;--messages-secondary-text-size:calc(var(--messages-text-size) - 2px);--messages-secondary-line-height:calc(var(--messages-secondary-text-size) + 4px);--messages-time-text-size:calc(var(--messages-text-size) - 4px);--messages-service-text-size:calc(var(--messages-text-size) - 1px);--messages-custom-emoji-size:calc(var(--messages-text-size) + 4px);--bubble-transition-in:transform var(--transition-standard-in),opacity var(--transition-standard-in);--bubble-transition-out:transform var(--transition-standard-out),opacity var(--transition-standard-out);--line-height-20:26px;--line-height-16:21px;--line-height-14:18px;--line-height-12:16px;--line-height:1.3125;--font-size-20:20px;--font-size-16:16px;--font-size-14:14px;--font-size-12:12px;--font-size:var(--font-size-16);--esg-sticker-size:72px;--esg-custom-emoji-size:36px;--popup-sticker-size:80px;--disabled-opacity:.3;--round-video-size:280px;--menu-box-shadow:0px 0px 10px var(--menu-box-shadow-color);--menu-backdrop-filter:blur(50px);--font-monospace:"Roboto Mono",monospace;--font-weight-bold:500;--font-weight-normal:400;--selection-background-color:rgba(var(--primary-color-rgb),.4);--selection-color:inherit;--topbar-floating-scaleX:1;--topbar-call-height:3rem;--topbar-floating-call-height:0px;--call-button-size:3.375rem;--call-button-margin:2rem;--custom-emoji-size:1.25rem;--esg-width:100%;--peer-avatar-red-top:#ff845e;--peer-avatar-red-bottom:#d45246;--peer-avatar-orange-top:#febb5b;--peer-avatar-orange-bottom:#f68136;--peer-avatar-violet-top:#b694f9;--peer-avatar-violet-bottom:#6c61df;--peer-avatar-green-top:#9ad164;--peer-avatar-green-bottom:#46ba43;--peer-avatar-cyan-top:#53edd6;--peer-avatar-cyan-bottom:#28c9b7;--peer-avatar-blue-top:#5bcbe3;--peer-avatar-blue-bottom:#359ad4;--peer-avatar-pink-top:#ff8aac;--peer-avatar-pink-bottom:#d95574;--peer-avatar-archive-top:#b8c2cc;--peer-avatar-archive-bottom:#9eaab5;--peer-avatar-saved-top:var(--light-filled-saved-color);--peer-avatar-saved-bottom:var(--saved-color);--avatar-color-top:var(--peer-avatar-saved-top);--avatar-color-bottom:var(--peer-avatar-saved-bottom);--avatar-border-radius-forum:37%;--premium-gradient:linear-gradient(52.62deg,#6b93ff 12.22%,#976fff 50.25%,#e46ace 98.83%)}@media only screen and (max-width:600px){:root{--right-column-width:100vw;--esg-sticker-size:68px;--popup-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:420px;--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-height:570px)and (min-width:601px){:root{--esg-width:23.875rem}}@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;--scrollbar-color:rgba(0,0,0,.2);--section-box-shadow-color:rgba(0,0,0,.06);--menu-box-shadow-color:rgba(0,0,0,.15);--input-search-background-color:#fff;--input-search-border-color:#dfe1e5;--secondary-color:#c4c9cc;--avatar-online-color:var(--primary-color);--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;--monospace-text-color:var(--danger-color);--backdrop-opacity:.85;--menu-background-color:rgba(var(--surface-color-rgb),var(--backdrop-opacity));--message-background-color:var(--surface-color);--message-time-color:var(--secondary-text-color);--message-checkbox-color:#61c642;--message-checkbox-border-color:#fff;--message-primary-color:var(--primary-color);--light-filled-message-primary-color:var(--light-filled-primary-color);--message-secondary-color:var(--secondary-color);--message-error-color:var(--danger-color);--message-out-link-color:var(--link-color);--message-out-status-color:var(--message-out-primary-color);--message-out-time-color:var(--message-out-status-color);--message-out-audio-play-button-color:#fff;--message-out-selection-background-color:var(--selection-background-color);--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:#aaa;--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;--scrollbar-color:hsla(0,0%,100%,.2);--section-box-shadow-color:rgba(0,0,0,.12);--input-search-background-color:#181818;--input-search-border-color:#2f2f2f;--secondary-color:#707579;--avatar-online-color:var(--primary-color);--chatlist-status-color:var(--primary-color);--chatlist-pinned-color:var(--secondary-color);--badge-text-color:#fff;--link-color:var(--primary-color);--ripple-color:hsla(0,0%,100%,.08);--poll-circle-color:#fff;--spoiler-background-color:#373e4e;--spoiler-draft-background-color:#484848;--monospace-text-color:var(--primary-text-color);--menu-background-color:rgba(var(--surface-color-rgb),.75);--message-background-color:var(--surface-color);--message-time-color:var(--secondary-text-color);--message-checkbox-color:var(--primary-color);--message-checkbox-border-color:#fff;--message-secondary-color:var(--secondary-color);--message-error-color:#fff;--message-out-link-color:#fff;--message-out-status-color:#fff;--message-out-time-color:hsla(0,0%,100%,.6);--message-out-audio-play-button-color:var(--message-out-background-color);--message-out-selection-background-color:rgba(var(--surface-color-rgb),.4)}@font-face{font-display:block;font-family:tgico;font-style:normal;font-weight:400;src:url(assets/fonts/tgico.ttf?ivbp49) format("truetype"),url(assets/fonts/tgico.woff?ivbp49) format("woff"),url(assets/fonts/tgico.svg?ivbp49#tgico) format("svg")}.tgico:after,.tgico:before,[class*=" tgico-"]:after,[class*=" tgico-"]:before,[class^=tgico-]{speak:never;font-feature-settings:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:tgico!important;font-style:normal;font-variant:normal;font-weight:400;line-height:1;text-transform:none}.tgico-check:before{content:"๎ค€"}.tgico-checks:before{content:"๎ค"}.tgico-activesessions:before{content:"๎ค‚"}.tgico-add:before{content:"๎คƒ"}.tgico-add_reaction: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-audio_repeat:before{content:"๎คŽ"}.tgico-audio_repeat_single:before{content:"๎ค"}.tgico-avatarnext:before{content:"๎ค"}.tgico-avatarprevious:before{content:"๎ค‘"}.tgico-binfilled: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-card:before{content:"๎คœ"}.tgico-card_outline: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:before{content:"๎คฑ"}.tgico-delete_filled: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-fast_forward:before{content:"๎ฅƒ"}.tgico-fast_rewind:before{content:"๎ฅ„"}.tgico-favourites:before{content:"๎ฅ…"}.tgico-flag:before{content:"๎ฅ†"}.tgico-flip:before{content:"๎ฅ‡"}.tgico-folder:before{content:"๎ฅˆ"}.tgico-fontsize:before{content:"๎ฅ‰"}.tgico-forward:before{content:"๎ฅŠ"}.tgico-forward_filled: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-groupmedia:before{content:"๎ฅ‘"}.tgico-groupmediaoff:before{content:"๎ฅ’"}.tgico-help:before{content:"๎ฅ“"}.tgico-hide: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-limit_chat:before{content:"๎ฅŸ"}.tgico-limit_chats:before{content:"๎ฅ "}.tgico-limit_file:before{content:"๎ฅก"}.tgico-limit_folders:before{content:"๎ฅข"}.tgico-limit_link:before{content:"๎ฅฃ"}.tgico-limit_pin: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-mediaspoiler:before{content:"๎ฅฎ"}.tgico-mediaspoileroff:before{content:"๎ฅฏ"}.tgico-mention:before{content:"๎ฅฐ"}.tgico-menu:before{content:"๎ฅฑ"}.tgico-message:before{content:"๎ฅฒ"}.tgico-messageunread:before{content:"๎ฅณ"}.tgico-microphone:before{content:"๎ฅด"}.tgico-microphone_crossed:before{content:"๎ฅต"}.tgico-microphone_crossed_filled:before{content:"๎ฅถ"}.tgico-microphone_filled: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-pip:before{content:"๎ฆŒ"}.tgico-play:before{content:"๎ฆ"}.tgico-playback_05:before{content:"๎ฆŽ"}.tgico-playback_15:before{content:"๎ฆ"}.tgico-playback_1x:before{content:"๎ฆ"}.tgico-playback_2x:before{content:"๎ฆ‘"}.tgico-plus:before{content:"๎ฆ’"}.tgico-poll:before{content:"๎ฆ“"}.tgico-premium_addone:before{content:"๎ฆ”"}.tgico-premium_double:before{content:"๎ฆ•"}.tgico-premium_lock:before{content:"๎ฆ–"}.tgico-premium_unlock:before{content:"๎ฆ—"}.tgico-previous:before{content:"๎ฆ˜"}.tgico-radiooff:before{content:"๎ฆ™"}.tgico-radioon:before{content:"๎ฆš"}.tgico-reactions:before{content:"๎ฆ›"}.tgico-readchats:before{content:"๎ฆœ"}.tgico-recent:before{content:"๎ฆ"}.tgico-replace:before{content:"๎ฆž"}.tgico-reply:before{content:"๎ฆŸ"}.tgico-reply_filled:before{content:"๎ฆ "}.tgico-rightpanel:before{content:"๎ฆก"}.tgico-rotate_left:before{content:"๎ฆข"}.tgico-rotate_right: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:before{content:"๎ฆฎ"}.tgico-settings_filled:before{content:"๎ฆฏ"}.tgico-sharescreen_filled:before{content:"๎ฆฐ"}.tgico-shipping:before{content:"๎ฆฑ"}.tgico-shuffle:before{content:"๎ฆฒ"}.tgico-smallscreen:before{content:"๎ฆณ"}.tgico-smile:before{content:"๎ฆด"}.tgico-spoiler:before{content:"๎ฆต"}.tgico-sport:before{content:"๎ฆถ"}.tgico-star:before{content:"๎ฆท"}.tgico-stickers:before{content:"๎ฆธ"}.tgico-stickers_face:before{content:"๎ฆน"}.tgico-stop:before{content:"๎ฆบ"}.tgico-strikethrough:before{content:"๎ฆป"}.tgico-textedit:before{content:"๎ฆผ"}.tgico-tip:before{content:"๎ฆฝ"}.tgico-tools:before{content:"๎ฆพ"}.tgico-topics: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:before{content:"๎งˆ"}.tgico-videocamera_crossed_filled:before{content:"๎ง‰"}.tgico-videocamera_filled:before{content:"๎งŠ"}.tgico-videochat:before{content:"๎ง‹"}.tgico-volume_down:before{content:"๎งŒ"}.tgico-volume_mute:before{content:"๎ง"}.tgico-volume_off:before{content:"๎งŽ"}.tgico-volume_up:before{content:"๎ง"}.tgico-zoomin:before{content:"๎ง"}.tgico-zoomout:before{content:"๎ง‘"}.tgico-phone_filled:before{content:"๎คฟ";transform:rotate(-135deg)}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;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-display:swap;font-family:Roboto;font-style:normal;font-weight:400;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-display:swap;font-family:Roboto;font-style:normal;font-weight:400;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-display:swap;font-family:Roboto;font-style:normal;font-weight:500;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-display:swap;font-family:Roboto;font-style:normal;font-weight:500;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-display:swap;font-family:Roboto;font-style:normal;font-weight:500;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-display:swap;font-family:Roboto;font-style:normal;font-weight:600;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-display:swap;font-family:Roboto;font-style:normal;font-weight:600;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-display:swap;font-family:Roboto;font-style:normal;font-weight:600;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-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlco8VkKjG.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-Ulco8VkKjG.woff2) format("woff2");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlco8VkKjG.woff2) format("woff2");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlco8VkKjG.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlco8VkKjG.woff2) format("woff2");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ulco8VkA.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlco8VkKjG.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-Ulco8VkKjG.woff2) format("woff2");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlco8VkKjG.woff2) format("woff2");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlco8VkKjG.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlco8VkKjG.woff2) format("woff2");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ulco8VkA.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0me8iUI0.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0me8iUI0.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}.input-wrapper{margin:0 auto;width:360px}.input-field{--height:54px;--border-radius:10px;position:relative}@media only screen and (max-width:600px){.input-field{--height:50px}}.input-field .arrow-down{border:solid var(--secondary-text-color);border-radius:1px;border-width:0 2px 2px 0;bottom:0;content:" ";cursor:pointer;display:inline-block;height:0;margin-top:-9px;padding:5px;position:absolute;right:21px;top:50%;transform:rotate(45deg);-webkit-transform:rotate(45deg);transition:all .2s;vertical-align:middle;width:0;z-index:2}[dir=ltr] .input-field label{left:1rem}[dir=rtl] .input-field label{right:1rem}.input-field label{background-color:var(--surface-color);color:#9e9e9e;height:1.5rem;margin-top:calc((var(--height) - 1.5rem)/2);pointer-events:none;position:absolute;right:auto;top:0;transform:translate(0);transform-origin:left center;-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap;z-index:2}.is-rtl .input-field label{transform-origin:right center}body.animation-level-2 .input-field label{transition:transform .2s,padding .2s,opacity .1s,font-weight 0s .1s}.input-field-border{border:2px solid var(--primary-color);border-radius:var(--border-radius);bottom:0;left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:0;z-index:1}body.animation-level-2 .input-field-border{transition:opacity .2s}.input-field-icon{border-radius:.375rem;height:1.5rem;pointer-events:none;position:absolute;right:1rem;top:50%;transform:translateY(-50%);width:1.5rem;z-index:1}.input-field-input{--padding:1rem;--padding-horizontal:1rem;--border-width:1px;background-color:var(--surface-color);border:var(--border-width) solid var(--input-search-border-color);border-radius:var(--border-radius);box-sizing:border-box;line-height:var(--line-height);min-height:var(--height);padding:calc(var(--padding) - var(--border-width)) calc(var(--padding-horizontal) - var(--border-width));position:relative;transition:border-color 0s;width:100%;z-index:1}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:active,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:hover{-webkit-box-shadow:0 0 0 1000px var(--surface-color) inset}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:active,.input-field-input:-webkit-autofill:first-line,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:hover{color:var(--primary-text-color)!important;font-family:Roboto,-apple-system,apple color emoji,BlinkMacSystemFont,Segoe UI,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif!important;font-size:1rem!important}@media only screen and (max-width:600px){.input-field-input{--padding:.9375rem;--padding-horizontal:.9375rem}}body.animation-level-0 .input-field-input{transition:none!important}html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid),html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid){border-color:var(--primary-color);transition:border-color .2s}html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid)~label,html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid)~label{color:var(--primary-color)}.input-field-input:focus{border-color:var(--primary-color)}.input-field-input.error{border-color:var(--danger-color)}.input-field-input.error~label{color:var(--danger-color)!important}.input-field-input.error~.input-field-border{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{border-color:var(--primary-color);margin-top:-4px;transform:rotate(225deg)}.input-field-input:focus~label{color:var(--primary-color);font-weight:var(--font-weight-bold)}.input-field-input:focus~.input-field-border{opacity:1}.input-field-input:disabled~label,.input-field-input:focus~label,.input-field-input:not(:empty)~label,.input-field-input:valid~label{opacity:1;padding:0 .3125rem;transform:translate(-.1875rem,calc(var(--height)/-2 + .0625rem)) scale(.75)}.input-field-input-fake{bottom:auto!important;height:auto!important;left:0;opacity:0;pointer-events:none;position:absolute!important;right:auto!important;top:0;z-index:-3}.input-fields-row{display:flex}.input-fields-row .input-field{flex:1 1 auto;width:1%}.input-wrapper>*+*{margin-top:1.5rem}::-moz-placeholder{color:#909192;opacity:1}::placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192}::-ms-input-placeholder{color:#909192}button:focus,input:focus{outline:none}.input-clear{border:none;outline:none;padding:0}body.animation-level-0 .input-clear.error{color:var(--danger-color)!important}body:not(.animation-level-0) .input-clear.error{animation:input-shake .2s ease-in-out forwards}@keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-.5rem)}75%{transform:translateX(.5rem)}to{transform:translateX(0)}}.input-search{--border-radius:22px;margin-left:.4375rem;margin-right:.4375rem;overflow:hidden;position:relative;width:100%}@media only screen and (max-width:600px){[dir=ltr] .input-search{margin-left:1rem}[dir=rtl] .input-search{margin-right:1rem}}.input-search-input{--height:42px;background-color:var(--input-search-background-color);border-color:var(--input-search-border-color);height:var(--height);line-height:var(--height);max-height:var(--height)!important;min-height:var(--height)!important;padding:0 calc(var(--height) + 3px - var(--border-width))}body.animation-level-2 .input-search-input{transition:border-color .2s ease-in-out}html.no-touch .input-search-input:active:not(:focus),html.no-touch .input-search-input:hover:not(:focus){border-color:var(--secondary-color)!important}.input-search-input:focus{background-color:transparent;border-color:var(--primary-color)}.input-search-input:focus~.tgico{color:var(--primary-color);opacity:1}html.no-touch .input-search-input:focus~.btn-icon:active,html.no-touch .input-search-input:focus~.btn-icon:hover{background-color:var(--light-primary-color)}.input-search-input:-moz-placeholder-shown~.tgico-close{display:none}.input-search-input:placeholder-shown~.tgico-close{display:none}.input-search>.tgico{color:var(--secondary-text-color);font-size:1.5rem;line-height:1;opacity:.6;position:absolute;text-align:center;top:50%;transform:translateY(-50%);z-index:1}body.animation-level-2 .input-search>.tgico{transition:opacity .2s ease-out,color .2s ease-out}[dir=ltr] .input-search>.tgico-search{left:.8125rem}[dir=rtl] .input-search>.tgico-search{right:.8125rem}.input-search>.tgico-search{height:1.5rem;pointer-events:none;width:1.5rem}[dir=ltr] .input-search>.tgico-close{right:0}[dir=rtl] .input-search>.tgico-close{left:0}.input-search>.tgico-close{height:42px;width:42px;z-index:1}[dir=ltr] .input-search>.tgico-close:before{margin-right:-1px}[dir=rtl] .input-search>.tgico-close:before{margin-left:-1px}[dir=ltr] .input-field-password .input-field-input{padding-right:2.5rem}[dir=rtl] .input-field-password .input-field-input{padding-left:2.5rem}.input-field-password .input-field-input{max-height:var(--height)}.input-field-password .input-field-input[type=password]{font-family:Arial,Helvetica,sans-serif;font-size:2.25rem;line-height:1;padding-bottom:0;padding-left:calc(.875rem - var(--border-width));padding-top: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{align-items:center;color:#9e9e9e;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;padding:.5rem;position:absolute;right:.375rem;top:50%;transform:translateY(-50%);transition:color .2s;z-index:2}.input-field-password .toggle-visible:before{content:"๎ฅ"}.input-field-password .toggle-visible.eye-hidden:before{content:"๎ฅ‚"}html.no-touch .input-field-password .toggle-visible:active,html.no-touch .input-field-password .toggle-visible:hover{color:var(--primary-text-color)}.input-field-phone .input-field-input{--letter-spacing:.24px}.input-field-phone .input-field-input:after{color:#9e9e9e;content:attr(data-left-pattern);letter-spacing:var(--letter-spacing)}.btn,.btn-icon{background:none;border:none;cursor:pointer;outline:none}body.animation-level-0 .btn,body.animation-level-0 .btn-icon{transition:none}html.no-touch .btn-icon:active,html.no-touch .btn-icon:hover,html.no-touch .btn:active,html.no-touch .btn:hover{background-color:var(--light-secondary-text-color)}html.no-touch .btn-icon.active:active,html.no-touch .btn-icon.active:hover,html.no-touch .btn-icon.blue:active,html.no-touch .btn-icon.blue:hover,html.no-touch .btn-icon.primary:active,html.no-touch .btn-icon.primary:hover,html.no-touch .btn.active:active,html.no-touch .btn.active:hover,html.no-touch .btn.blue:active,html.no-touch .btn.blue:hover,html.no-touch .btn.primary:active,html.no-touch .btn.primary:hover{background-color:var(--light-primary-color)}html.no-touch .btn-icon.danger:active,html.no-touch .btn-icon.danger:hover,html.no-touch .btn.danger:active,html.no-touch .btn.danger:hover{background-color:var(--light-danger-color)}.btn-icon:disabled,.btn:disabled{opacity:var(--disabled-opacity);pointer-events:none!important}.btn-icon{align-items:center;background-color:transparent;border:none;border-radius:50%!important;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;line-height:1;padding:.5rem;position:relative;text-align:center;transition:color .15s ease-in-out,opacity .15s ease-in-out}.btn-icon.rp{overflow:hidden}.btn-icon.active{color:var(--primary-color)}[dir=ltr] .btn-corner{right:var(--offset)}[dir=rtl] .btn-corner{left:var(--offset)}.btn-corner{--offset:1.25rem;--translateY:calc(54px + var(--offset));align-items:center;background-color:var(--primary-color);border:none;bottom:var(--offset);box-shadow:none!important;color:#fff;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;outline:none;padding:0!important;position:absolute!important;text-align:center;transform:translate3d(0,var(--translateY),0);transition:transform var(--btn-corner-transition)!important;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:3}html.no-touch .btn-corner:active,html.no-touch .btn-corner:hover{background-color:var(--dark-primary-color)}.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{height:2.5rem;width:2.5rem}.btn-menu{-webkit-touch-callout:none;-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:var(--menu-background-color);border-radius:10px;font-size:1rem;min-width:11.25rem;opacity:0;padding:.3125rem 0;position:absolute;top:100%;transform:scale(.8)!important;transition:opacity var(--btn-menu-transition),transform var(--btn-menu-transition),visibility var(--btn-menu-transition);-webkit-user-select:none;visibility:hidden;z-index:4}.btn-menu-old,.is-mobile .btn-menu{-webkit-backdrop-filter:none;backdrop-filter:none;background-color:var(--surface-color);min-width:auto;padding:.5rem 0}.btn-menu-old .btn-menu-item,.is-mobile .btn-menu .btn-menu-item{--padding-left:1rem;--padding-right:2.5rem;--icon-margin:1.5rem;--icon-size:1.5rem;border-radius:0;font-size:var(--font-size-16);font-weight:400;height:3rem;line-height:var(--line-height-16);margin:0;transform:none!important}.btn-menu-old .btn-menu-item:before,.is-mobile .btn-menu .btn-menu-item:before{align-self:auto;color:var(--secondary-text-color);margin-top:0}.btn-menu-old .btn-menu-footer,.is-mobile .btn-menu .btn-menu-footer{background-color:var(--background-color)}.btn-menu{box-shadow:var(--menu-box-shadow)}body.animation-level-0 .btn-menu{transition:none}.btn-menu.active{opacity:1;visibility:visible}.btn-menu.active,.is-mobile .btn-menu.was-open{transform:scaleX(1)!important}.btn-menu.bottom-left,.is-rtl .btn-menu.bottom-right{left:auto;right:0;top:100%;transform-origin:top right}.btn-menu.bottom-right,.is-rtl .btn-menu.bottom-left{left:0;right:auto;top:100%;transform-origin:top left}.btn-menu.bottom-center{transform-origin:top center}.btn-menu.top-left{bottom:100%;left:auto;right:0;top:auto;transform-origin:bottom right}.btn-menu.top-right,.is-rtl .btn-menu.top-left{bottom:100%;left:0;right:auto;top:auto;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}[dir=ltr] .btn-menu-item{text-align:left}[dir=rtl] .btn-menu-item{text-align:right}.btn-menu-item{--padding-vertical:.25rem;--padding-left:.75rem;--padding-right:.75rem;--icon-margin:1.25rem;--icon-size:1.25rem;align-items:center;border-radius:.3125rem;color:var(--primary-text-color);cursor:pointer!important;display:flex;font-size:var(--font-size-14);font-weight:500;height:2rem;line-height:var(--line-height-14);margin-left:.3125rem;margin-right:.3125rem;padding:var(--padding-vertical) var(--padding-right) var(--padding-vertical) var(--padding-left);pointer-events:all!important;position:relative;text-transform:none;transform:scale(1);white-space:nowrap}.btn-menu-item.tgico-char:before{width:var(--icon-size)}body.animation-level-2 .btn-menu-item{transition:transform var(--btn-menu-transition)}.btn-menu-item:active{transform:scale(.96)}html.no-touch .btn-menu-item:active,html.no-touch .btn-menu-item:hover{background-color:var(--light-secondary-text-color)}html.no-touch .btn-menu-item.danger:active,html.no-touch .btn-menu-item.danger:hover{background-color:var(--light-danger-color)}.btn-menu-item:before{align-self:flex-start;color:var(--primary-text-color);font-size:var(--icon-size);margin-top:.125rem}[dir=ltr] .btn-menu-item-icon,[dir=ltr] .btn-menu-item:before{margin-right:var(--icon-margin)}[dir=rtl] .btn-menu-item-icon,[dir=rtl] .btn-menu-item:before{margin-left:var(--icon-margin)}.btn-menu-item-icon,.btn-menu-item:before{position:relative}[dir=ltr] .btn-menu-item-icon{margin-right:calc(var(--icon-margin) - var(--add)/2)}[dir=rtl] .btn-menu-item-icon{margin-left:calc(var(--icon-margin) - var(--add)/2)}[dir=ltr] .btn-menu-item-icon{margin-left:calc(var(--add)/-2)}[dir=rtl] .btn-menu-item-icon{margin-right:calc(var(--add)/-2)}.btn-menu-item-icon{--add:.25rem;--total:calc(var(--icon-size) + var(--add));flex:0 0 auto;height:var(--total);width:var(--total)}.btn-menu-item-icon .media-photo{height:inherit;width:inherit}@media only screen and (max-width:600px){.btn-menu-item{--padding-right:1.875rem}}.btn-menu-item-text{flex:1 1 auto;position:relative}.btn-menu-item-text,.btn-menu-item-text-fake{pointer-events:none}[dir=ltr] .btn-menu-item-text-fake{margin-left:var(--margin-left)}[dir=rtl] .btn-menu-item-text-fake{margin-right:var(--margin-left)}.btn-menu-item-text-fake{--margin-left:calc(var(--icon-size) + var(--icon-margin));max-width:calc(100% - var(--margin-left) - var(--padding-left) - var(--padding-right));overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap}.btn-menu-item-subtitle{color:var(--secondary-text-color);font-size:.875rem}.btn-menu-item-header{color:var(--secondary-text-color);font-weight:var(--font-weight-bold);height:2rem;pointer-events:none!important}[dir=ltr] .btn-menu-item .stacked-avatars{right:.5rem}[dir=rtl] .btn-menu-item .stacked-avatars{left:.5rem}.btn-menu-item .stacked-avatars{--margin-right:-.6875rem;flex:0 0 auto;pointer-events:none;position:absolute}.btn-menu-item.is-multiline{font-size:.75rem;height:auto;max-width:16.25rem;min-width:calc(100% - .625rem);width:-moz-fit-content;width:fit-content}.btn-menu-item.is-multiline .btn-menu-item-text{white-space:pre-wrap;width:-moz-fit-content;width:fit-content}.btn-menu-item .checkbox-field-toggle{padding:0}.btn-menu-overlay{bottom:0;bottom:-100vh;cursor:default;left:0;left:-100vw;max-width:none!important;position:fixed!important;right:0;right:-100vw;top:0;top:-100vh;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:auto!important;z-index:4}.btn-menu.has-footer{padding-bottom:0}.btn-menu-footer{align-items:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;color:currentColor;display:flex;font-size:.875rem;height:2.5rem;justify-content:center}.btn-menu hr{display:block!important;margin:.3125rem auto;opacity:.6;padding:0;width:calc(100% - 1.875rem)}html:not(.is-mobile) .btn-menu .badge{background-color:transparent;color:var(--secondary-text-color)}.btn-menu-reactions{--inner-shadow-degree:90deg;-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:var(--menu-background-color);border-radius:var(--height);filter:drop-shadow(0 .125rem .5rem rgba(0,0,0,.24));height:inherit;max-height:100%;max-width:100%;opacity:0;position:absolute;transform:scale(.8);transform-origin:bottom left}[dir=ltr] .btn-menu-reactions-container{margin-left:var(--other-side-offset)}[dir=rtl] .btn-menu-reactions-container{margin-right:var(--other-side-offset)}.btn-menu-reactions-container{--height:2.25rem;--bubble-side-offset:0rem;--other-side-offset:0rem;--menu-offset:calc((var(--height) + 0.5rem)*-1);--width:calc(var(--menu-width) + (var(--bubble-side-offset) + var(--other-side-offset))*-1);display:flex;height:var(--height);justify-content:flex-start;margin-top:var(--menu-offset);max-width:var(--width);position:fixed;width:var(--width);z-index:4}.contextmenu.bottom-left+.btn-menu-reactions-container .btn-menu-reactions,.contextmenu.center-left+.btn-menu-reactions-container .btn-menu-reactions{transform-origin:bottom right!important}.contextmenu.bottom-center+.btn-menu-reactions-container .btn-menu-reactions{transform-origin:bottom center!important}[dir=ltr] .btn-menu-reactions-container-vertical{margin-left:var(--menu-offset)}[dir=rtl] .btn-menu-reactions-container-vertical{margin-right:var(--menu-offset)}.btn-menu-reactions-container-vertical{flex-direction:column;height:var(--width);margin-top:0;max-height:var(--width);max-width:var(--height);width:var(--height)}.btn-menu-reactions-container-vertical .btn-menu-reactions{--inner-shadow-degree:180deg;display:flex;flex-direction:column;height:auto;transform-origin:top right;width:inherit}.btn-menu-reactions-container-vertical .btn-menu-reactions-reaction{--padding-vertical:var(--padding-base);--padding-horizontal:0rem}.btn-menu-reactions-container-vertical .btn-menu-reactions-bubble-big{bottom:var(--offset);right:calc(var(--size)/-2)}body.animation-level-2 .btn-menu-reactions{transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.btn-menu-reactions.is-visible{opacity:1;transform:scale(1)}.btn-menu-reactions-bubble{background-color:inherit;border-radius:50%;position:absolute;z-index:-1}.btn-menu-reactions-bubble-big{--size:1rem;--offset:calc(var(--height)/2);bottom:calc(var(--size)/-2);height:var(--size);right:var(--offset);width:var(--size)}.btn-menu-reactions:after{background:linear-gradient(var(--inner-shadow-degree),var(--surface-color) 0,rgba(var(--surface-color-rgb),0) 1rem,rgba(var(--surface-color-rgb),0) calc(100% - 1rem),var(--surface-color) 100%);border-radius:inherit;bottom:0;content:" ";left:0;pointer-events:none;position:absolute;right:0;top:0}.btn-menu-reactions .scrollable{border-radius:inherit;display:flex;position:relative}.btn-menu-reactions .scrollable-x{align-items:center;padding:0 .25rem}.btn-menu-reactions .scrollable-y{align-items:center;flex-direction:column;padding:.25rem 0}.btn-menu-reactions-reaction{--size:1.625rem;--padding-base:.25rem;--padding-vertical:0rem;--padding-horizontal:var(--padding-base);cursor:pointer;flex:0 0 auto;height:calc(var(--size) + var(--padding-vertical)*2);padding:var(--padding-vertical) var(--padding-horizontal);width:calc(var(--size) + var(--padding-horizontal)*2)}.btn-menu-reactions-reaction-scale{height:100%;width:100%}html:not(.is-safari) .btn-menu-reactions-reaction-scale{transform:scale(1)}html:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-scale{transition:transform .1s linear}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select{transform:scale(1)}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:active,html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:hover{transform:scale(1.25)}html.no-touch:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-select{transition:transform var(--transition-standard-in)}.btn-menu-reactions-reaction .media-sticker-wrapper{height:100%;position:relative;width:100%}.btn-primary{border:none;border-radius:10px;cursor:pointer;font-weight:var(--font-weight-bold);height:54px;overflow:hidden;padding:0;position:relative;text-align:center;transition:opacity .2s;width:100%}html.no-touch .btn-primary:active,html.no-touch .btn-primary:hover{background:var(--dark-primary-color);transition:opacity .2s}.btn-primary-transparent{background-color:transparent;color:var(--primary-color)}html.no-touch .btn-primary-transparent:active,html.no-touch .btn-primary-transparent:hover{background:var(--light-primary-color)}.btn-primary-transparent .c-ripple__circle{background-color:var(--light-primary-color)}html.no-touch .btn-primary-transparent.danger:active,html.no-touch .btn-primary-transparent.danger:hover{background-color:var(--light-danger-color)}.btn-primary-transparent .preloader-circular .preloader-path{stroke:var(--primary-color)}body.animation-level-0 .btn-primary{transition:none}[dir=ltr] .btn-primary use,[dir=ltr] .btn-primary>svg{right:15px}[dir=rtl] .btn-primary use,[dir=rtl] .btn-primary>svg{left:15px}.btn-primary use,.btn-primary>svg{height:calc(100% - 20px);left:auto}.btn-primary:disabled{opacity:var(--disabled-opacity);pointer-events:none!important}[dir=ltr] .btn-control{padding-left:.75rem;padding-right:1.5rem}[dir=rtl] .btn-control{padding-left:1.5rem;padding-right:.75rem}.btn-control{align-items:center;border-radius:1.25rem;display:flex;height:2.5rem;line-height:2.5rem;margin:.9375rem auto 1rem;width:auto}[dir=ltr] .btn-control.tgico:before{margin-right:.375rem}[dir=rtl] .btn-control.tgico:before{margin-left:.375rem}.btn-control.tgico:before{font-size:1.5rem}.btn-transparent{align-items:center;background-color:transparent;color:var(--primary-text-color);display:flex;font-weight:400;height:3rem;line-height:var(--line-height);padding:0 1rem}@media only screen and (max-width:600px){.btn-transparent{height:3rem}}html.no-touch .btn-transparent:active,html.no-touch .btn-transparent:hover{background-color:var(--light-secondary-text-color)}html.no-touch .btn-transparent.danger:active,html.no-touch .btn-transparent.danger:hover{background-color:var(--light-danger-color)}html.no-touch .btn-transparent.primary:active,html.no-touch .btn-transparent.primary:hover{background-color:var(--light-primary-color)}[dir=ltr] .btn-transparent:before{margin-right:2rem}[dir=rtl] .btn-transparent:before{margin-left:2rem}.btn-transparent:before{color:var(--secondary-text-color);font-size:1.5rem}@media only screen and (max-width:600px){[dir=ltr] .btn-transparent:before{margin-right:1.5rem}[dir=rtl] .btn-transparent:before{margin-left:1.5rem}}[dir=ltr] .btn-transparent.btn-short:before{margin-right:1rem}[dir=rtl] .btn-transparent.btn-short:before{margin-left:1rem}.btn-primary.btn-circle .preloader-circular{height:calc(100% - 20px);left:auto;margin:0;right:auto;top:10px}.btn-primary.btn-circle .preloader-circular .preloader-path{stroke:#fff}.btn-menu-toggle{cursor:pointer!important;font-weight:400!important;overflow:visible!important;pointer-events:all!important;position:relative}.btn-menu-toggle:not(.btn-primary):not(.btn-corner).menu-open{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);line-height:var(--size);width:var(--size)}@media only screen and (max-width:600px){.btn-circle{--size:46px}}.btn-circle path{fill:#fff}.btn-disabled{color:var(--secondary-text-color)!important;cursor:default!important;pointer-events:none!important}.btn-disabled:before{color:inherit!important}.btn-secondary:not(:first-child){margin-top:.5rem!important}.btn-color-primary{background:var(--primary-color);color:#fff}.call-button{-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);border-radius:50%;font-size:1.5rem;height:var(--call-button-size);justify-content:center;position:relative}.call-button,.call-button-container{align-items:center;cursor:pointer;display:flex;width:var(--call-button-size)}.call-button-container{flex-direction:column}.call-button-container.disabled,.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{font-size:.875rem;margin-top:.25rem;white-space:nowrap}body.animation-level-2 .call-button-text{transition:opacity var(--transition-standard-in)}body.animation-level-2 .call-button{transition:background-color var(--transition-standard-in),opacity var(--transition-standard-in)}[dir=ltr] .call-button+.call-button,[dir=ltr] .call-button-container+.call-button-container{margin-left:var(--call-button-margin)}[dir=rtl] .call-button+.call-button,[dir=rtl] .call-button-container+.call-button-container{margin-right:var(--call-button-margin)}[dir=ltr] .btn-update{right:auto!important}[dir=rtl] .btn-update{left:auto!important}.btn-update{border-radius:var(--size);font-size:1rem;font-weight:var(--font-weight-bold);padding:0 2rem!important;width:auto}.animated-close-icon{pointer-events:none;position:absolute;transform:rotate(-45deg)}.animated-close-icon,.animated-close-icon:after,.animated-close-icon:before{background-color:var(--secondary-text-color);border-radius:.125rem;height:.125rem;width:1.125rem}.animated-close-icon:after,.animated-close-icon:before{content:"";left:0;position:absolute;top:0}.animated-close-icon:before{transform:rotate(90deg)}body.animation-level-2 .animated-close-icon,body.animation-level-2 .animated-close-icon:after,body.animation-level-2 .animated-close-icon:before{transition:transform var(--slide-header-transition)}.animated-close-icon.state-back{transform:rotate(180deg)}.animated-close-icon.state-back:before{transform:rotate(45deg) scaleX(.75) translateY(-.375rem)}.animated-close-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translateY(.375rem)}.animated-menu-icon{--color:var(--secondary-text-color);position:absolute}.animated-menu-icon,.animated-menu-icon:after,.animated-menu-icon:before{background-color:var(--color);border-radius:.125rem;height:.125rem;transform:rotate(0);width:1.125rem}body.animation-level-2 .animated-menu-icon,body.animation-level-2 .animated-menu-icon:after,body.animation-level-2 .animated-menu-icon:before{transition:transform .25s}.animated-menu-icon:after,.animated-menu-icon:before{content:"";left:0;position:absolute}.animated-menu-icon:before{top:-.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(.75) translate(.375rem,-.1875rem)}.animated-menu-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translate(.375rem,.1875rem)}.animated-menu-close-icon{margin-top:-.625rem}.animated-menu-close-icon:before{opacity:1;top:.3125rem}body.animation-level-2 .animated-menu-close-icon:before{transition:transform .25s,opacity .125s 0s}.animated-menu-close-icon:after{top:.625rem}.animated-menu-close-icon.state-back{transform:translateY(.3125rem) rotate(135deg)}.animated-menu-close-icon.state-back:before{opacity:0;transform:rotate(45deg)}.animated-menu-close-icon.state-back:after{transform:translateY(-.625rem) rotate(90deg)}.animated-button-icon>.tgico{height:24px;line-height:24px;position:absolute}body:not(.animation-level-0) .animated-button-icon>.tgico{animation:hide-icon .4s ease-in-out forwards}body.animation-level-0 .animated-button-icon>.tgico{animation:none!important;visibility:hidden}.autocomplete-helper{--border-radius:10px;border-radius:var(--border-radius)!important;bottom:calc(100% + .5rem);left:0;max-width:100%;overflow:hidden;padding:0!important;position:absolute!important;width:auto!important}.autocomplete-helper:not(.is-visible){display:none}.autocomplete-helper.is-visible{visibility:hidden}body.animation-level-2 .autocomplete-helper.is-visible{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){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{max-height:232px;position:relative}.autocomplete-peer-helper-list{padding:.5rem 0}.autocomplete-peer-helper-list-element{align-items:center;cursor:pointer;display:flex;height:3.125rem;line-height:var(--line-height);padding:0 2.125rem 0 .75rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (max-width:600px){.autocomplete-peer-helper-list-element{padding-right:.75rem}}.autocomplete-peer-helper-list-element-name{flex:0 0 auto;font-weight:var(--font-weight-bold);margin-left:.875rem}.autocomplete-peer-helper-list-element-description{color:var(--secondary-text-color);margin-left:.5625rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.autocomplete-peer-helper-list-element-avatar{flex:0 0 auto}.badge{--size:1.375rem;--padding:.4375rem;border-radius:calc(var(--size)/2);color:var(--badge-text-color);font-size:.875rem;font-weight:var(--font-weight-bold);height:var(--size);line-height:var(--size)!important;min-width:var(--size);padding:0 var(--padding);text-align:center}body.animation-level-2 .badge{transition:background-color .2s ease-in-out}.badge:not(.tgico):empty{display:none}.badge-20{--size:1.25rem;--padding:.375rem}.badge-24{--size:1.5rem;--padding:.5rem}.badge.tgico:before{font-size:var(--size)}.badge-primary{background-color:var(--primary-color)}.badge-gray{background-color:var(--secondary-color)}.ckin__player{letter-spacing:.02em;-webkit-user-select:none;-moz-user-select:none;user-select:none}.ckin__player.ckin__fullscreen{background:#000;border-radius:0!important;bottom:0;display:flex;height:100%;left:0;position:fixed;right:0;top:0;width:100%;z-index:10000000}.ckin__player.ckin__fullscreen video{height:100%;-o-object-fit:contain;object-fit:contain;width:100%}.ckin__player .time{color:#fff;font-size:.875rem;margin-left:.875rem}@media only screen and (max-width:600px){.ckin__player .time{margin-left:1.125rem}}.default{align-items:center;display:flex;font-size:0;justify-content:center;position:relative}.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;color:#fff;font-size:4rem;left:50%;line-height:1;opacity:1;outline:0;padding:0;position:absolute;text-align:center;top:50%;transform:translate3d(-50%,-50%,0) scale(1)}@media only screen and (min-width:601px){.default__button--big{pointer-events:none}}body.animation-level-2 .default__button--big{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}[dir=ltr] .default__controls{text-align:left}[dir=rtl] .default__controls{text-align:right}.default__controls{bottom:0;direction:ltr;left:0;position:absolute;right:0;z-index:6}body.animation-level-2 .default__controls{transition:transform var(--layer-transition)}.default__controls .progress-line{border-radius:var(--border-radius);margin:0 16px}.default__controls .progress-line__filled{background:var(--primary-color)}.default__controls .progress-line__loaded{background-color:#fff}.default__controls .progress-line{background:hsla(0,0%,100%,.38)}@media only screen and (max-width:600px){.default__controls .progress-line{margin-bottom:-1px}}.default__gradient-bottom{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAADGCAYAAAAT+OqFAAAAdklEQVQoz42QQQ7AIAgEF/T/D+kbq/RWAlnQyyazA4aoAB4FsBSA/bFjuF1EOL7VbrIrBuusmrt4ZZORfb6ehbWdnRHEIiITaEUKa5EJqUakRSaEYBJSCY2dEstQY7AuxahwXFrvZmWl2rh4JZ07z9dLtesfNj5q0FU3A5ObbwAAAABJRU5ErkJggg==);background-position:bottom;background-repeat:repeat-x;bottom:0;height:49px;padding-top:93px;pointer-events:none;position:absolute;width:100%;z-index:2}body.animation-level-2 .default__gradient-bottom{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__controls,.default.show-controls .default__gradient-bottom{transform:translateZ(0)}.default.is-playing:not(.show-controls){cursor:none}.default.is-playing .default__button--big,.default.is-seeking .default__button--big,.default:not(.played) .default__button--big{opacity:0}.default.is-playing .toggle:not(.default__button--big):before,.default.is-seeking .toggle:not(.default__button--big):before,.default:not(.played) .toggle:not(.default__button--big):before{content:"๎ฆ…"}.default .is-seeking+.default__button--big{opacity:0}.default .player-volume{--icon-size:2.25rem;--icon-margin-right:.5rem;--selector-size:50px;--selector-thumb-size:.75rem;--hide-width:var(--icon-size);--show-width:calc(var(--icon-size) + var(--icon-margin-right) + var(--selector-size) + var(--selector-thumb-size)*0.75);align-items:center;display:flex;overflow:hidden;width:var(--hide-width)}body.animation-level-2 .default .player-volume{transition:width var(--layer-transition)}html.is-touch .default .player-volume{display:none}html:not(.is-touch) .default .player-volume+.time{margin-left:.5rem}html.no-touch .default .player-volume:active,html.no-touch .default .player-volume:hover{width:var(--show-width)}.default .player-volume__icon{color:#fff;cursor:pointer;display:flex;font-size:1.5rem;height:var(--icon-size);margin-right:var(--icon-margin-right);padding:.375rem;width:var(--icon-size)}.default .player-volume .progress-line{--color:#fff;--thumb-size:var(--selector-thumb-size);--height:4px;margin:0;min-width:var(--selector-size);width:var(--selector-size)}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);cursor:pointer;height:var(--height);position:relative}.progress-line:before{border-radius:inherit;bottom:0;content:" ";display:block;left:0;position:absolute;right:0;top:0}.progress-line__seek{-webkit-appearance:none;-moz-appearance:none;background:transparent;bottom:-.5rem;caret-color:var(--color);cursor:pointer;margin:0;outline:none;padding:0;position:absolute;top:-.5rem;width:100%}.progress-line__seek:focus{outline:none}.progress-line__seek::-webkit-slider-thumb{display:none}.progress-line__seek::-moz-range-thumb{display:none;height:0;width: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{background-color:var(--color);border-radius:50%;content:" ";cursor:pointer;display:block;height:var(--thumb-size);position:absolute;right:0;top:calc((var(--thumb-size) - var(--height))/-2);transform:translateX(calc(var(--thumb-size)/2)) scale(1);width:var(--thumb-size)}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:translateX(calc(var(--thumb-size)/2)) scale(1.125)}.progress-line:before,.progress-line__loaded{background-color:var(--secondary-color);opacity:.3}.progress-line__filled,.progress-line__loaded{border-radius:var(--border-radius);bottom:0;position:absolute;top:0}body.animation-level-2 .progress-line.with-transition .progress-line__filled{transition:width .2s}.progress-line.use-transform .progress-line__filled{transform-origin:left center;width:100%}input[type=range]::-ms-track{visibility:hidden}input[type=range]::-ms-ticks{background:none;border:none;color:none}input[type=range]::-ms-thumb,input[type=range]::-ms-tooltip{visibility:hidden}.bottom-controls,.left-controls,.right-controls{align-items:center;display:flex}.bottom-controls{height:2.25rem;justify-content:space-between;padding:0 .625rem}@media only screen and (max-width:600px){.bottom-controls{height:3.625rem}}[dir=ltr] .checkbox-field{text-align:left}[dir=rtl] .checkbox-field{text-align:right}.checkbox-field{--size:1.25rem;--offset-left:0px;cursor:pointer;display:block;margin:1.5rem 1.1875rem;min-height:var(--size);min-width:var(--size);position:relative}body.animation-level-2 .checkbox-field{transition:opacity .2s}.checkbox-field.checkbox-disabled{opacity:var(--disabled-opacity);pointer-events:none!important}@media only screen and (max-width:600px){.checkbox-field{margin-bottom:27px}}[dir=ltr] .checkbox-field .checkbox-box{left:var(--offset-left)}[dir=rtl] .checkbox-field .checkbox-box{right:var(--offset-left)}.checkbox-field .checkbox-box{border-radius:.3125rem;height:var(--size);overflow:hidden;position:absolute;top:50%;transform:translateY(-50%);width:var(--size)}html.is-safari .checkbox-field .checkbox-box{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.checkbox-field .checkbox-box-background,.checkbox-field .checkbox-box-border,.checkbox-field .checkbox-box-check{left:0;position:absolute;top:0}.checkbox-field .checkbox-box-border{border:2px solid #8d969c;border-radius:inherit;bottom:0;left:0;right:0}.checkbox-field .checkbox-box-background{background-color:var(--primary-color);border-radius:50%;bottom:-15%;left:-15%;right:-15%;top:-15%;transform:scale(1);transition:transform .2s ease-in-out 0s}body.animation-level-0 .checkbox-field .checkbox-box-background{transition:none!important}.checkbox-field .checkbox-box-check{--offset:7px;height:calc(var(--size) - var(--offset));left:50%;top:50%;transform:translate(-50%,-50%);width:calc(var(--size) - var(--offset))}.checkbox-field .checkbox-box-check use{stroke:#fff;stroke-width:3.75;stroke-linecap:round;stroke-dasharray:24.19,24.19;stroke-dashoffset:0;transition:stroke-dasharray .1s ease-in-out .15s,visibility 0s .15s;visibility:visible}body.animation-level-0 .checkbox-field .checkbox-box-check use{transition:none!important}[dir=ltr] .checkbox-field .checkbox-caption{padding-left:3.375rem}[dir=rtl] .checkbox-field .checkbox-caption{padding-right:3.375rem}.checkbox-field .checkbox-caption{color:inherit;line-height:var(--line-height);pointer-events:none;position:relative;transition:opacity .2s}body.animation-level-0 .checkbox-field .checkbox-caption{transition:none}.checkbox-field.hover-effect{align-items:center;display:flex;height:3.5rem;margin-left:0;margin-right:0;padding:0 1.1875rem}[dir=ltr] .checkbox-field.hover-effect .checkbox-box{left:auto}[dir=rtl] .checkbox-field.hover-effect .checkbox-box{right:auto}.checkbox-field .anchor-url{pointer-events:all}.checkbox-ripple{border-radius:10px;overflow:hidden}.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{bottom:0;left:0;right:0;top:0}.checkbox-field-round .checkbox-box-border{border:2px solid var(--secondary-color);z-index:1}.checkbox-field-round .checkbox-box-check{--offset:calc(var(--size) - var(--size)/2 - 0.125rem)}html.is-safari .checkbox-field-round .checkbox-box{-webkit-mask-image:none}[dir=ltr] .radio-field{text-align:left}[dir=rtl] .radio-field{text-align:right}.radio-field{--size:1.375rem;--offset-left:0px;cursor:pointer;line-height:var(--line-height);margin:1.25rem 0;position:relative}.radio-field.hidden-widget{cursor:default}.radio-field.hidden-widget .radio-field-main:after,.radio-field.hidden-widget .radio-field-main:before{visibility:hidden}.radio-field>input:checked~.radio-field-main:before{border-color:var(--primary-color)}.radio-field>input:checked~.radio-field-main:after{transform:translateY(-50%) scale(1)}[dir=ltr] .radio-field .radio-field-main{padding-left:3.5rem}[dir=rtl] .radio-field .radio-field-main{padding-right:3.5rem}.radio-field .radio-field-main{color:inherit;position:relative}[dir=ltr] .radio-field .radio-field-main:after,[dir=ltr] .radio-field .radio-field-main:before{left:var(--offset-left)}[dir=rtl] .radio-field .radio-field-main:after,[dir=rtl] .radio-field .radio-field-main:before{right:var(--offset-left)}.radio-field .radio-field-main:after,.radio-field .radio-field-main:before{content:"";display:block;height:var(--size);position:absolute;top:50%;transform:translateY(-50%);width:var(--size)}.radio-field .radio-field-main:before{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}[dir=ltr] .radio-field .radio-field-main:after{left:calc(var(--offset-left) + .3125rem)}[dir=rtl] .radio-field .radio-field-main:after{right:calc(var(--offset-left) + .3125rem)}.radio-field .radio-field-main:after{background:var(--primary-color);border-radius:50%;height:.75rem;transform:translateY(-50%) scale(0);transform-origin:center;width:.75rem}body.animation-level-2 .radio-field .radio-field-main:after{transition:transform .1s ease}[dir=ltr] .radio-field.radio-field-right .radio-field-main:before{left:auto;right:0}[dir=rtl] .radio-field.radio-field-right .radio-field-main:before{left:0;right:auto}[dir=ltr] .radio-field.radio-field-right .radio-field-main:after{left:auto;right:.3125rem}[dir=rtl] .radio-field.radio-field-right .radio-field-main:after{left:.3125rem;right:auto}[type=checkbox],[type=radio]{box-sizing:border-box;opacity:0;padding:0;position:absolute;z-index:var(--z-below)}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dasharray:0,24.19;transition:stroke-dasharray .1s ease-in-out,visibility 0s .1s;visibility:hidden}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-background{transform:scale(0);transition:transform .2s ease-in-out .05s}.checkbox-field .checkbox-field-input:disabled+.checkbox-box,.checkbox-field .checkbox-field-input:disabled~.checkbox-caption{cursor:default;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{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;visibility:visible!important}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dashoffset:35.5;transform:rotate(45deg) translateY(-10px)}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-background{background-color:var(--danger-color)}.checkbox-field-toggle{--size:20px;align-items:center;display:flex;margin:0 .3125rem;padding:0 .25rem;pointer-events:none}.checkbox-field-toggle .checkbox-toggle{--offset:3px;--toggle-width:1.9375rem;align-items:center;background-color:var(--secondary-color);border-radius:12px;display:flex;height:.875rem;margin:0 var(--offset);position:relative;width:var(--toggle-width)}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle{transition:background-color .1s}.checkbox-field-toggle .checkbox-toggle:before{background-color:var(--surface-color);border:2px solid var(--secondary-color);border-radius:50%;content:" ";height:1.25rem;position:absolute;transform:translateX(calc(var(--offset)*-1));width:1.25rem}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle:before{transition:border-color .1s,transform .1s cubic-bezier(.22,.75,.7,1.44)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle{background-color:var(--primary-color)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle:before{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{margin-bottom:17px;padding:1rem 0 .5rem;width:100%}@media only screen and (max-width:600px){.chatlist-container .search-group{margin-bottom:0}}.chatlist-container .search-group__name{color:var(--secondary-text-color);font-weight:var(--font-weight-bold);padding:0 23px 1rem;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (max-width:600px){.chatlist-container .search-group__name{font-size:15px;padding:5px 9px 0 16px}}.chatlist-container .search-group-contacts{border-bottom:1px solid var(--border-color)}@media only screen and (max-width:600px){.chatlist-container .search-group-contacts{padding:0 0 2px}}.chatlist-container .search-group-people.search-group-contacts{padding:5px 0!important}.chatlist-container .search-group:last-child{border-bottom:none}.chatlist-container .search-super .search-group{margin-bottom:0;padding:0 0 .5rem}.chatlist-container .search-super .search-group__name{display:flex;justify-content:space-between;padding-top:1rem}ul.chatlist{padding:0 .5rem}@media only screen and (max-width:600px){ul.chatlist{padding:0}}.chatlist{-webkit-touch-callout:none;background-color:var(--surface-color);display:flex;flex-direction:column;margin:0;position:relative;-moz-user-select:none;user-select:none;-webkit-user-select:none;width:100%}.chatlist-chat{--background:unset;-webkit-user-drag:none;background:var(--background)!important}.chatlist-chat.is-forum-open,.chatlist-chat.menu-open,html.no-touch .chatlist-chat:active,html.no-touch .chatlist-chat:hover{--background:var(--light-filled-secondary-text-color)}[dir=ltr] .chatlist-chat.is-muted .user-title:after{margin-left:.125rem}[dir=rtl] .chatlist-chat.is-muted .user-title:after{margin-right:.125rem}.chatlist-chat.is-muted .user-title:after{color:var(--chatlist-pinned-color);content:"๎ฆƒ";flex:0 0 auto;font-size:1.125rem}body:not(.animation-level-0) .chatlist-chat.is-muted.animating:not(.backwards) .user-title:after{animation:fade-in-opacity .2s ease-in-out forwards}body:not(.animation-level-0) .chatlist-chat.is-muted.animating.backwards .user-title:after{animation:fade-in-backwards-opacity .2s ease-in-out forwards}.chatlist-chat i{font-style:normal}.chatlist-chat .text-highlight{color:var(--primary-text-color)}.chatlist-chat .premium-icon{margin-top:-.125rem}.chatlist-chat .topic-icon{flex:0 0 auto}[dir=ltr] .chatlist-chat .row-title .topic-icon{margin-right:.25rem}[dir=rtl] .chatlist-chat .row-title .topic-icon{margin-left:.25rem}.chatlist-chat .row-title .topic-icon{--size:1.375rem}.chatlist-chat .topic-name .topic-icon{display:inline;line-height:1!important}.chatlist-chat .topic-name .topic-icon-svg{position:relative}.chatlist-chat .topic-name .topic-icon-content{left:0;margin-top:-6px;position:absolute;right:0;top:0}@media only screen and (min-width:601px){.chatlist-chat.active{--background:var(--primary-color)!important}.chatlist-chat.active .message-status,.chatlist-chat.active .premium-icon,.chatlist-chat.active .row-subtitle,.chatlist-chat.active .row-title,.chatlist-chat.active .sending-status-icon,.chatlist-chat.active .text-highlight,.chatlist-chat.active .tgico-chatspinned:before,.chatlist-chat.active .user-title,.chatlist-chat.active .verified-icon{color:#fff!important}.chatlist-chat.active .badge-fake{border-color:#fff;color:#fff}.chatlist-chat.active .danger,.chatlist-chat.active .primary-text{color:#fff!important}.chatlist-chat.active .user-title:after{color:hsla(0,0%,100%,.7)}.chatlist-chat.active .verified-icon-background{fill:#fff!important}.chatlist-chat.active .verified-icon-check{visibility:hidden}.chatlist-chat.active .dialog-avatar.is-online:after,.chatlist-chat.active .dialog-group-call-icon{background-color:#fff;border-color:var(--primary-color)}.chatlist-chat.active .badge.unread,.chatlist-chat.active .mention{background-color:#fff!important;color:var(--primary-color)}.chatlist-chat.active .peer-typing-container{--color:#fff}}.chatlist .peer-typing-container{--color:var(--secondary-text-color)}.chatlist .peer-typing-container .peer-typing-text{display:inline-flex;transform:translateY(-2px)}.chatlist .sending-status-icon.tgico-premium_lock{color:var(--secondary-color);font-size:.8125rem;margin:.1875rem 0 0 .5rem}[dir=ltr] .chatlist .dialog-title-details{margin-left:.5rem}[dir=rtl] .chatlist .dialog-title-details{margin-right:.5rem}.chatlist .dialog-title-details{flex:0 0 auto;font-size:.75rem;padding:1px 0 0}[dir=ltr] .chatlist .dialog-subtitle-badge{margin-left:.5rem}[dir=rtl] .chatlist .dialog-subtitle-badge{margin-right:.5rem}.chatlist .dialog-subtitle-badge{display:block!important;flex:0 0 auto}.chatlist .dialog-subtitle-badge.avatar-badge{--size:1.625rem;border:2px solid var(--background,var(--surface-color));line-height:23px!important;margin:0;pointer-events:none;position:absolute;right:calc(100% - 4.0625rem);top:2.4375rem}[dir=ltr] .chatlist .dialog-subtitle-media{margin-right:.375rem}[dir=rtl] .chatlist .dialog-subtitle-media{margin-left:.375rem}.chatlist .dialog-subtitle-media{border-radius:.25rem;display:inline-block;flex:0 0 auto;height:1.25rem;line-height:1.25rem;position:relative;width:1.25rem}.chatlist .dialog-subtitle-media:before{content:"ย ";display:inline-block;height:inherit;min-height:inherit;min-width:inherit;width:inherit}.chatlist .dialog-subtitle-media.is-round{border-radius:50%}.chatlist .dialog-subtitle-media.is-round .tgico-play{font-size:.875rem}.chatlist .dialog-subtitle-media .tgico-play{color:#fff;font-size:1rem;left:50%;line-height:1;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:1}.chatlist .dialog-subtitle-media .media-photo{border-radius:inherit;bottom:auto;height:inherit;-o-object-fit:cover;object-fit:cover;top:auto;width:inherit}.chatlist .dialog-group-call-icon{background-color:var(--avatar-online-color);border:2px solid var(--surface-color);border-radius:50%;height:20px;left:45px;overflow:hidden;position:absolute;top:45px;width:20px;z-index:2}body.animation-level-2 .chatlist .dialog-group-call-icon,body.animation-level-2 .chatlist .dialog-subtitle-badge{opacity:1;transform:scale(0);transition:none}body.animation-level-2 .chatlist .dialog-group-call-icon.is-visible:not(.backwards),body.animation-level-2 .chatlist .dialog-subtitle-badge.is-visible:not(.backwards){transform:scale(1)}body.animation-level-2 .chatlist .dialog-group-call-icon.backwards,body.animation-level-2 .chatlist .dialog-subtitle-badge.backwards{opacity:0}body.animation-level-2 .chatlist .dialog-group-call-icon.animating,body.animation-level-2 .chatlist .dialog-subtitle-badge.animating{transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-group-call-icon.animating.backwards,body.animation-level-2 .chatlist .dialog-subtitle-badge.animating.backwards{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{opacity:1;transform:scale(0);transition:none}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 var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-avatar.animating.backwards:after{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 .dialog-avatar,.chatlist .row-row{pointer-events:none;position:relative}.chatlist .user-title{align-items:center;display:flex!important}.chatlist .user-title img.emoji{height:18px;margin-top:1px;vertical-align:top;width:18px}.chatlist .user-last-message img.emoji{height:20px;margin-top:-3px;width:20px}.chatlist .user-last-message,.chatlist .user-title{flex-grow:1;position:relative}[dir=ltr] .chatlist .message-status{margin-right:.125rem}[dir=rtl] .chatlist .message-status{margin-left:.125rem}.chatlist .message-status{color:var(--chatlist-status-color);display:inline-block;font-size:1.25rem;height:1.25rem;line-height:1;margin-top:-.0625rem;position:relative;vertical-align:middle;width:1.25rem}.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:var(--chatlist-pinned-color);opacity:1}.chatlist .tgico-chatspinned.unread:before{opacity:0}.chatlist .tgico-chatspinned{position:relative}.chatlist .tgico-chatspinned:before{left:0;position:absolute;top:0}.chatlist .mention{background-color:var(--chatlist-status-color)!important;line-height:1.25rem!important;padding:0}[dir=ltr] .chatlist .mention-badge{margin-right:-.125rem}[dir=rtl] .chatlist .mention-badge{margin-left:-.125rem}.chatlist .is-muted.backwards .unread,.chatlist .unread{background-color:var(--chatlist-status-color)}.chatlist .is-muted .unread,.chatlist .no-unmuted-topic .unread{background-color:var(--secondary-color)}.chatlist .not-visited{--size:.5rem;--padding:0;background-color:var(--secondary-color)!important}.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{margin-bottom:0!important;padding-bottom:0}.chatlist-bottom .chatlist-new{padding:0}.chat-input{--translateY:0;--padding-bottom:0.5rem;--bottom:var(--padding-bottom);display:flex;flex:0 0 auto;flex-direction:column;max-width:100%;padding-top:.25rem;position:relative;transform:translate3d(0,var(--translateY),0);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .chat-input{transition:none!important}@media only screen and (min-height:570px)and (min-width:601px){.chat-input{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{transform:translate3d(calc(var(--right-column-width)/-2),var(--translateY),0)!important;transition:transform var(--transition-standard-in)}}.chat-input.is-hidden{--translateY:100%;bottom:0;position:absolute!important;transform:translate3d(0,var(--translateY),0)!important;transition:transform var(--transition-standard-in)}.bubbles.is-selecting:not(.backwards)~.chat-input.is-hidden{--translateY:0}.chat-input-container{--padding-horizontal:var(--chat-input-padding);align-items:flex-end;display:flex;flex:0 0 auto;justify-content:center;margin:0 auto;max-width:var(--messages-container-width);padding:0 var(--padding-horizontal);padding-bottom:var(--bottom);position:relative;width:100%}.chat-input-container .btn-circle{height:var(--chat-input-size);width: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{border-bottom-right-radius:12px;max-height:var(--chat-input-size)}.chat-input-container.is-centering:not(.backwards) .rows-wrapper .bubble-tail{opacity:0;transform:scaleX(-1) translateX(1.125rem)}.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 .1s}.chat-input-container.is-centering.animating .rows-wrapper .bubble-tail{transition:transform .1s,opacity 25ms 0s}.chat-input-container.is-centering.animating .selection-wrapper{transition:opacity .1s 75ms}.chat-input-container.is-centering.animating .btn-send{transition:transform .2s}.chat-input-container.is-centering.animating:not(.backwards) .rows-wrapper .bubble-tail{transition:transform .1s,opacity 25ms 75ms}.chat-input .menu-send{bottom:calc(100% + .5rem);top:auto}.chat-input .toggle-emoticons:before{content:"๎ฆด"}.chat-input .toggle-emoticons.flip-icon:before{content:"๎ฅ™"!important}[dir=ltr] .chat-input .btn-record-cancel{right:0}[dir=rtl] .chat-input .btn-record-cancel{left:0}.chat-input .btn-record-cancel{--multiplier:-1;opacity:0;padding:0;position:absolute;top:0;transform:translateX(calc((100% + var(--padding-horizontal) + .5rem)*var(--multiplier)));visibility:hidden;z-index:3}.chat-input .btn-record-cancel .c-ripple__circle,html.no-touch .chat-input .btn-record-cancel:active:after,html.no-touch .chat-input .btn-record-cancel:hover:after{background-color:var(--light-danger-color)}.chat-input .btn-record-cancel:before{color:var(--danger-color)}.is-rtl .chat-input .btn-record-cancel{--multiplier:1}[dir=ltr] .chat-input .btn-scheduled:after{right:5px}[dir=rtl] .chat-input .btn-scheduled:after{left:5px}.chat-input .btn-scheduled:after{background:var(--message-checkbox-color);border-radius:50%;content:"";height:.5rem;position:absolute;top:5px;width:.5rem}.chat-input .btn-preloader .preloader{height:1.5rem;width:1.5rem}.chat-input .btn-preloader .preloader .preloader-path{stroke:var(--secondary-text-color)}body.animation-level-2 .chat-input .btn-preloader.show.backwards{animation:hide-icon .4s ease-in-out forwards!important}[dir=ltr] .chat-input .float{margin-right:.75rem!important}[dir=rtl] .chat-input .float{margin-left:.75rem!important}.chat-input .float{align-self:center;display:none!important;margin:0!important}body.animation-level-2 .chat-input .float{animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-height:569px),only screen and (max-width:600px){[dir=ltr] .chat-input .float{margin-right:.125rem!important}[dir=rtl] .chat-input .float{margin-left:.125rem!important}}.chat-input:not(.is-recording) .float.show:not(.hide){display:flex!important}[dir=ltr] .chat-input .btn-send-container{right:var(--padding-horizontal)}[dir=rtl] .chat-input .btn-send-container{left:var(--padding-horizontal)}.chat-input .btn-send-container{align-items:center;bottom:0;display:flex;justify-content:center;padding-bottom:inherit;position:absolute}.chat-input .btn-send-container .btn-menu-overlay{z-index:3}.chat-input .btn-icon{transition:opacity .2s}body.animation-level-0 .chat-input .btn-icon{transition:none}.chat-input .btn-cancel-record,.chat-input .btn-send{box-shadow:0 1px 8px 1px rgba(0,0,0,.12)}.chat-input .btn-send{background-color:var(--primary-color)!important;color:#fff!important;z-index:3}html.no-touch .chat-input .btn-send:active,html.no-touch .chat-input .btn-send:hover{background-color:var(--dark-primary-color)!important}.chat-input .btn-send .tgico-check{font-size:2rem;height:32px!important}.chat-input .btn-send .tgico-check:before{font-weight:var(--font-weight-bold)}.chat-input .btn-send.edit .tgico-check,.chat-input .btn-send.record .tgico-microphone_filled,.chat-input .btn-send.schedule .tgico-schedule,.chat-input .btn-send.send .tgico-send{visibility:visible!important}body.animation-level-2 .chat-input .btn-send.edit .tgico-check,body.animation-level-2 .chat-input .btn-send.record .tgico-microphone_filled,body.animation-level-2 .chat-input .btn-send.schedule .tgico-schedule,body.animation-level-2 .chat-input .btn-send.send .tgico-send{animation:grow-icon .4s ease-in-out forwards!important}.chat-input .btn-record-cancel,.chat-input .btn-send{font-size:1.5rem;line-height:1.5rem}.chat-input .record-time{display:none;height:44px;line-height:44px}.chat-input .record-time:after{background-color:var(--danger-color);border-radius:50%;content:" ";display:inline-block;height:10px;margin-left:9px;margin-right:9px;width:10px}body.animation-level-2 .chat-input .record-time:after{animation:recordBlink 1.25s infinite}.chat-input .record-ripple{background-color:var(--message-highlightning-color);border-radius:50%;height:300px;opacity:.5;position:absolute;transform:scale(0);visibility:hidden;width:300px}@media only screen and (max-width:600px){.chat-input .record-ripple{height:240px;width: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-record-cancel,.chat-input.is-recording:not(.backwards) .btn-send{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 .1s,opacity .1s 0s}.chat-input.is-recording.animating .record-ripple{transition:transform .03s ease-in-out,visibility .1s}.chat-input.is-recording.animating .rows-wrapper{transition:width .2s}.chat-input.is-recording.animating:not(.backwards) .btn-record-cancel{transition:visibility 0s .1s,opacity .1s .1s}.chat-input.is-recording.animating:not(.backwards) .record-ripple{transition:transform .03s,visibility 0s}[dir=ltr] .chat-input:not(.is-recording) .btn-record-cancel{margin-right:0}[dir=rtl] .chat-input:not(.is-recording) .btn-record-cancel{margin-left:0}.chat-input:not(.is-recording) .btn-record-cancel{width:0}.chat-input .new-message-wrapper{opacity:1}.chat-input .reply-in-topic-overlay{align-items:center;background-color:inherit;border-radius:inherit;color:var(--secondary-text-color);display:flex;justify-content:center;padding:0 1rem;pointer-events:none;z-index:3}.bubbles.is-selecting:not(.backwards)~.chat-input .selection-wrapper{opacity:1}.bubbles.is-selecting.animating~.chat-input .new-message-wrapper{transition:opacity .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 .1s .1s}.bubbles.is-selecting.animating.backwards~.chat-input .selection-wrapper{transition:opacity .1s 0s}@keyframes recordBlink{0%{opacity:1}50%{opacity:.2}to{opacity:1}}#column-center{flex:3;position:relative;width:100%}@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{filter:brightness(80%);transform:translate3d(-25vw,0,0)}}@media only screen and (min-width:601px)and (max-width:925px){#column-center{bottom:0;left:0;position:fixed!important;right:0;top:0;transform:translateZ(0)}body.animation-level-2 #column-center{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:before{transform:rotate(180deg)}}.chats-container{height:100%}.chat{align-items:center;display:flex!important;flex-direction:column;transition:transform var(--tabs-transition),filter var(--tabs-transition);width:100%}body.animation-level-0 .chat{transition:none!important}.chat:not(.active):not(:last-child){filter:brightness(.8)}@media only screen and (min-width:926px){.chat:not(.active){transform:translate3d(calc((100vw - min(40vw, 420px))*-.25),0,0)}.chat:not(.active):last-child{transform:translate3d(calc(100vw - min(40vw, 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;user-select:none!important}.chat-background{background-color:#e6ebee;overflow:hidden}html.night .chat-background{background-color:var(--border-color)}.chat-background.no-transition:before{transition:none!important}.chat-background,.chat-background-item{bottom:0;left:0;position:absolute!important;right:0;top:0}.chat-background-item.is-image{background-color:inherit;background-image:url(assets/img/bg.jpeg);background-position:50%;background-size:cover}.chat-background-item.is-pattern{align-items:center;background-color:#000!important;background-image:none!important;background-repeat:repeat-x;background-size:contain;display:flex;justify-content:center;margin:0!important}@media only screen and (min-width:1276px){.chat-background-item.is-pattern{height:150%;top:-25%}}body.animation-level-2 .chat-background-item{opacity:0;transition:opacity var(--transition-standard-out)}body.animation-level-2 .chat-background-item.is-visible:not(.backwards){opacity:1;transition:opacity var(--transition-standard-in)}@media only screen and (min-width:1276px){body.animation-level-2 .chat-background-item{margin:-18.5rem 0 -22rem;transform:scale(1);transform-origin:left center;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(.666666667);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)!important}}.chat-background-item-canvas{--opacity-max:1;opacity:var(--opacity-max);position:absolute;width:100%}.chat-background-item:not(.is-dark) .chat-background-item-pattern-canvas{mix-blend-mode:soft-light}.chat-background-item-color-canvas{height:100%;-webkit-mask-position:center;mask-position:center;-webkit-mask-size:cover;mask-size:cover}.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){[dir=ltr] body.is-right-column-shown .chat .drops-container{right:calc(var(--right-column-width))}[dir=rtl] body.is-right-column-shown .chat .drops-container{left:calc(var(--right-column-width))}}@media only screen and (max-width:600px){.chat .drops-container{--padding:10px}}.chat .drop{--wrapper-padding:15px;max-width:696px}.chat[data-type=chat] .bubbles.is-chat-input-hidden .bubbles-date-group:last-of-type .bubbles-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);--button-size:2.125rem;--button-horizontal-margin:.125rem;align-items:center;border-radius:1rem;display:flex;flex:0 0 auto;flex-direction:column;justify-content:center;max-height:30rem;max-width:calc(100% - var(--chat-input-size) - .5rem);min-height:var(--chat-input-size);position:relative;width:calc(100% - var(--chat-input-size) - .5rem);z-index:3}.chat-input-wrapper:before{background-color:#fff;border-radius:inherit;bottom:0;box-shadow:0 1px 8px 1px rgba(0,0,0,.12);content:" ";left:0;opacity:1;right:0;top:0}.chat-input-control,.chat-input-wrapper:before{background-color:var(--surface-color);position:absolute}.chat-input-control{--padding-vertical:.3125rem;--padding-horizontal:var(--chat-input-inner-padding);--padding:var(--padding-vertical) var(--padding-horizontal);height:var(--chat-input-size);margin:0 auto;padding:var(--padding);visibility:hidden;width:auto;z-index:3}.chat-input-control:before{opacity:0}.chat-input-control-button{height:2.5rem;justify-content:center;padding:0 .625rem}@media only screen and (max-width:600px){.chat-input-control-button{font-size:15px}}[dir=ltr] .chat-input-control-button:before{margin-right:10px}[dir=rtl] .chat-input-control-button:before{margin-left:10px}.fake-selection-wrapper,.selection-wrapper{max-width:calc(100% - var(--chat-input-padding)*2);position:absolute;top:0;width:28.75rem}.chat-input-control,.selection-wrapper{opacity:0}.selection-wrapper{background-color:var(--surface-color)}.selection-wrapper:before{content:none}.selection-wrapper .selection-container{align-items:center;border-radius:inherit;display:flex;font-size:15px;height:100%;justify-content:space-between;padding:inherit;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.selection-wrapper .selection-container-left,.selection-wrapper .selection-container-right{align-items:center;display:flex;justify-content:space-between;transform:translateX(0)}.selection-wrapper .selection-container-right{flex:0 0 auto}.selection-wrapper .selection-container-count{color:var(--primary-text-color);flex-grow:1;font-weight:var(--font-weight-bold);text-transform:capitalize;white-space:nowrap}[dir=ltr] .selection-wrapper .selection-container .btn-icon{margin-left:6px;margin-right:5px}[dir=rtl] .selection-wrapper .selection-container .btn-icon{margin-left:5px;margin-right:6px}.selection-wrapper .selection-container .btn-icon{height:42px;line-height:42px;width: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}}[dir=ltr] .selection-wrapper .selection-container-forward:before{margin-right:14px}[dir=rtl] .selection-wrapper .selection-container-forward:before{margin-left:14px}[dir=ltr] .selection-wrapper .selection-container-delete{margin-left:.375rem;margin-right:.625rem}[dir=rtl] .selection-wrapper .selection-container-delete{margin-left:.625rem;margin-right:.375rem}[dir=ltr] .selection-wrapper .selection-container-delete:before{margin-right:10px}[dir=rtl] .selection-wrapper .selection-container-delete:before{margin-left:10px}.fake-wrapper{position:absolute;visibility:hidden;z-index:-1}[dir=ltr] .fake-rows-wrapper{left:var(--padding-horizontal)}[dir=rtl] .fake-rows-wrapper{right:var(--padding-horizontal)}.fake-rows-wrapper{top:0;width:calc(100% - var(--chat-input-size) - var(--padding-horizontal)*2 - .5rem)}.rows-wrapper-wrapper{display:flex;width:100%}.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 .15s}.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control{transition:opacity .1s 75ms,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 .1s 0s,visibility 0s .2s}[dir=ltr] .rows-wrapper{border-bottom-right-radius:0}[dir=rtl] .rows-wrapper{border-bottom-left-radius:0}.rows-wrapper{transform:translateX(0) scaleX(1)}.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}}[dir=ltr] .rows-wrapper .bubble-tail{right:-8.4px}[dir=rtl] .rows-wrapper .bubble-tail{left:-8.4px}.rows-wrapper .bubble-tail{fill:var(--surface-color);bottom:-1px;height:20px;position:absolute;transform:scaleX(-1);width:11px}.is-rtl .rows-wrapper .bubble-tail{transform:scaleX(1)}.rows-wrapper .attach-file.menu-open{background-color:var(--light-primary-color)!important;color:var(--primary-color)}.rows-wrapper .attach-file.btn-disabled{opacity:var(--disabled-opacity)}.rows-wrapper>div{align-items:center;background-color:var(--surface-color);border-radius:1rem;display:flex;justify-content:space-between;padding:var(--padding);position:relative;width:100%}.rows-wrapper .reply-wrapper{align-items:center;height:0;justify-content:flex-start;margin-bottom:-.5625rem;opacity:0;padding:.5625rem var(--padding-horizontal) 0;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:2}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-bottom:-.3125rem;padding-top:.3125rem}}.chat.is-helper-active .rows-wrapper .reply-wrapper{height:45px;opacity:1;pointer-events:inherit}.rows-wrapper .reply-wrapper .reply{flex:1 1 auto;margin-left:.625rem;margin-right:.625rem;order:1}.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:var(--secondary-text-color)!important;height:1.125rem}.rows-wrapper .reply-wrapper .reply .peer-title{font-weight:400}[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu{left:3.125rem}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu{right:3.125rem}.rows-wrapper .reply-wrapper .btn-menu{bottom:calc(100% + .5rem);top:auto;transform:scale(1)!important}[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu-item{padding-right:1.5rem}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu-item{padding-left:1.5rem}.rows-wrapper .reply-wrapper .btn-menu-item-text{order:1}[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{margin-right:var(--icon-margin)}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{margin-left:var(--icon-margin)}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{--size:1.25rem;margin:0;order:0}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-background,.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-border{display:none}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-check use{stroke:var(--primary-text-color)}@media only screen and (max-width:600px){[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu{left:calc(var(--padding-horizontal)*-1)}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu{right:calc(var(--padding-horizontal)*-1)}}.rows-wrapper .input-message-input{margin-top:-1px;max-height:27.5rem!important}@media only screen and (max-height:30rem){.rows-wrapper .input-message-input{max-height:max(36px,calc(100vh - 10rem))}}@media only screen and (max-width:600px){.rows-wrapper .input-message-input{max-height:10rem}}.rows-wrapper .input-message-input[data-inline-placeholder]:after{color:#a2acb4;content:attr(data-inline-placeholder);pointer-events:none}.rows-wrapper .new-message-wrapper{--send-as-size:1.875rem;--send-as-margin-left:.25rem;--send-as-margin-right:.375rem;--send-as-total-size:calc(var(--send-as-size) + var(--send-as-margin-left) + var(--send-as-margin-right));--commands-size:2.375rem;--commands-margin-left:.25rem;--commands-margin-right:.375rem;--commands-total-size:calc(var(--commands-size) + var(--commands-margin-left) + var(--commands-margin-right));--offset-translateX:0px;align-items:flex-end;min-height:var(--chat-input-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands,.rows-wrapper .new-message-wrapper .new-message-send-as-container{bottom:calc(var(--padding-vertical) + .4375rem);cursor:pointer;flex:0 0 auto;opacity:0;position:absolute;transform:scale(0);z-index:2}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-bot-commands{margin-left:var(--commands-margin-left)}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-bot-commands{margin-right:var(--commands-margin-left)}.rows-wrapper .new-message-wrapper .new-message-bot-commands{align-items:center;background-color:var(--primary-color);border-radius:1.875rem;cursor:pointer;display:flex;height:1.875rem;justify-content:center;width:var(--commands-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{position:relative}.rows-wrapper .new-message-wrapper .new-message-bot-commands-icon-scale{align-items:center;display:flex;justify-content:center;transform:scale(.875)}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{--color:#fff}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container{margin-left:var(--send-as-margin-left)}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container{margin-right:var(--send-as-margin-left)}.rows-wrapper .new-message-wrapper .new-message-send-as-container{background:none!important;height:var(--send-as-size);width:var(--send-as-size)}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{right:auto}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{left:auto}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{left:calc(var(--padding-horizontal)*-1 - .25rem)!important}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{right:calc(var(--padding-horizontal)*-1 - .25rem)!important}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{height:auto;max-height:20rem;max-width:20rem;top:auto;transform:scaleX(1);width:auto}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item{height:2.25rem}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-header{height:1.875rem}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon{margin-right:calc(var(--icon-margin) - .5rem)}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon{margin-left:calc(var(--icon-margin) - .5rem)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon.active:before{--offset:-.125rem;border:.0625rem solid var(--primary-color);border-radius:inherit;bottom:var(--offset);content:" ";left:var(--offset);position:absolute;right:var(--offset);top:var(--offset)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-text{display:flex;flex-direction:column;justify-content:center;line-height:1!important;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-subtitle{font-size:.8125rem;font-weight:400}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar{opacity:0;pointer-events:none;position:absolute;transform:scale(0)}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible:not(.backwards){opacity:1;transform:scale(1)}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible.animating{transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .new-message-send-as-close{align-items:center;background-color:var(--primary-color);border-radius:50%;color:#fff;display:flex;font-size:1.375rem;height:inherit;justify-content:center;width:inherit;z-index:1}.rows-wrapper .new-message-wrapper.has-offset[data-offset=as]{--offset-translateX:var(--send-as-total-size)}.rows-wrapper .new-message-wrapper.has-offset[data-offset=commands]{--offset-translateX:48px}.rows-wrapper .new-message-wrapper.has-offset .input-message-container,.rows-wrapper .new-message-wrapper.has-offset .toggle-emoticons{transform:translateX(0)}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .toggle-emoticons{transform:translateX(var(--offset-translateX))}[dir=ltr] .rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{margin-right:var(--translateX)}[dir=rtl] .rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{margin-left:var(--translateX)}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{--translateX:calc(var(--offset-translateX));transform:translate(var(--translateX))}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-bot-commands,.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-send-as-container{opacity:1;transform:scale(1)}.rows-wrapper .new-message-wrapper.has-offset.animating .input-message-container,.rows-wrapper .new-message-wrapper.has-offset.animating .toggle-emoticons{transition:transform var(--transition-standard-in)}.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-bot-commands,.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-send-as-container{transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + 1.125rem)}@media only screen and (max-height:569px),only screen and (max-width:600px){.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + .875rem)}}.rows-wrapper .new-message-wrapper .btn-menu.top-left{right:calc(var(--padding-horizontal)*-1 - .125rem)}.rows-wrapper .new-message-wrapper .btn-menu.top-right{left:calc(var(--padding-horizontal)*-1 - .125rem)}.rows-wrapper .btn-icon{color:var(--secondary-text-color);flex:0 0 auto;font-size:1.5rem;height:var(--button-size);margin-bottom:5px;margin-left:var(--button-horizontal-margin);margin-right:var(--button-horizontal-margin);margin-top:0;padding:0;width:var(--button-size)}.rows-wrapper .btn-icon.active{color:var(--primary-color)}.input-message-container{align-items:center;align-self:center;display:flex;flex:1 1 auto;max-height:inherit;min-height:calc(var(--chat-input-size) - var(--padding-vertical)*2);overflow:hidden;position:relative;width:1%}.input-message-container .scrollable{position:relative}.input-message-input{--custom-emoji-size:var(--messages-custom-emoji-size);background:none;border:none;font-size:var(--messages-text-size);line-height:var(--line-height);outline:none;overflow-y:none;padding:.5rem .5625rem;resize:none;width:100%}.input-message-input pre{display:inline;margin:0}body.animation-level-2 .input-message-input{transition:height .1s}.bubbles{--translateY:0;flex:1 1 auto;position:relative;transform:translate3d(0,var(--translateY),0);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .bubbles{transition:none!important}.chat[data-type=chat] .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-78px;transition:transform var(--transition-standard-in)}@media only screen and (max-width:600px){.chat[data-type=chat] .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-58px}}.chat[data-type=chat] .bubbles.is-chat-input-hidden.is-selecting:not(.backwards) .bubbles-inner{transform:translateY(calc(var(--translateY)*-1));transition:transform var(--transition-standard-in)}.bubbles>.scrollable{display:block;height:auto}@media only screen and (min-width:1276px){body.is-right-column-shown .bubbles{transform:translate3d(calc(var(--right-column-width)/-2),var(--translateY),0);transition:transform var(--transition-standard-in)}}body.animation-level-2 .bubbles.is-selecting .bubbles-group-avatar,body.animation-level-2 .bubbles.is-selecting .is-in .bubble-content-wrapper{transition:var(--bubble-transition-out)}body.animation-level-2 .bubbles.is-selecting:not(.backwards) .bubbles-group-avatar,body.animation-level-2 .bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transition:var(--bubble-transition-in)}.bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transform:translateX(2.5rem) scale(1)}.bubbles.is-selecting:not(.backwards) .bubbles-group-avatar{transform:translate3d(2.5rem,0,0) scale3d(.76,.76,1)}.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 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 - 0.625rem)}.bubbles .search-group.search-group-messages{padding:.25rem 0 .5rem}.bubbles-inner{display:flex;flex-direction:column;justify-content:flex-end;margin:0 auto;max-width:var(--messages-container-width);min-height:100%;padding:0 .8125rem;transform:translateY(0);transition:transform var(--transition-standard-out);width:100%}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:after{content:" ";height:.125rem}[dir=ltr] .bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-left:45px}[dir=rtl] .bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-right:45px}@media only screen and (max-width:600px){.bubbles-inner.is-chat .is-in .bubble-content-wrapper{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% - var(--message-beside-button-margin)*-1)!important}.bubbles-inner.is-chat .message,.bubbles-inner.is-chat .name,.bubbles-inner:not(.is-channel) .message,.bubbles-inner:not(.is-channel) .name{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 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;transform:none!important;transition:opacity var(--layer-transition),visibility 0s .2s!important;visibility:hidden}.bubbles-go-mention{--translateY:0;cursor:default;opacity:0;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s .2s!important;visibility:hidden}.bubbles-go-mention.is-visible{cursor:pointer;opacity:1;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s 0s!important;visibility:visible}.chat-secondary-button{align-items:center;background-color:var(--surface-color)!important;border-radius:50%;box-shadow:0 1px 8px 1px rgba(0,0,0,.12)!important;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;position:absolute}body.animation-level-0 .chat-secondary-button{transition:none!important}.chat-secondary-button:before{position:relative}.chat-secondary-button:after{border-radius:inherit;bottom:0;content:" ";left:0;position:absolute;right:0;top:0}html.no-touch .chat-secondary-button:active:after,html.no-touch .chat-secondary-button:hover:after{background-color:var(--light-secondary-text-color)}[dir=ltr] .bubbles-corner-button{right:var(--chat-input-padding)}[dir=rtl] .bubbles-corner-button{left:var(--chat-input-padding)}.bubbles-corner-button{bottom:calc(var(--chat-input-size) + var(--bottom) + 10px);overflow:visible;z-index:2}[dir=ltr] .bubbles-corner-button .badge{right:-.25rem}[dir=rtl] .bubbles-corner-button .badge{left:-.25rem}.bubbles-corner-button .badge{position:absolute;top:-.25rem}.bubbles-corner-button .badge.badge-primary:not(.badge-gray){background-color:var(--chatlist-status-color)}@media only screen and (max-width:600px){[dir=ltr] .bubbles-corner-button .badge{right:.1875rem}[dir=rtl] .bubbles-corner-button .badge{left:.1875rem}.bubbles-corner-button .badge{top:-.75rem}}.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 var(--transition-standard-out)}body.is-calling:not(.backwards) .topbar,body.is-calling:not(.backwards) .topbar-call-container{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;cursor:pointer!important;margin-bottom:var(--pinned-floating-height);max-height:var(--topbar-height)!important;min-height:var(--topbar-height)!important;position:relative;width:100%;z-index:1}.topbar:before{box-shadow:0 1px 5px -1px rgba(0,0,0,.21);content:" ";height:calc(var(--topbar-height) + var(--pinned-floating-height) - var(--topbar-floating-call-height));left:0;pointer-events:none;position:absolute;right:0;top:0}.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}[dir=ltr] .chat:first-child .topbar .chat-info{padding-left:.1875rem}[dir=rtl] .chat:first-child .topbar .chat-info{padding-right:.1875rem}}@media only screen and (min-width:1276px){.topbar .pinned-container-wrapper-utils{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 var(--transition-standard-in)}body.animation-level-0 .topbar .pinned-container-wrapper-utils{transition:none}}.topbar .sidebar-close-button{position:absolute}.topbar .user-title{align-items:center;display:flex;font-size:1rem;font-weight:var(--font-weight-bold);line-height:1.5rem;max-width:calc(100% - 1.5rem)}.topbar .user-title span.emoji{vertical-align:inherit}.topbar .info,.topbar .peer-title{line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.topbar .info:not(:empty){margin-top:1px}.topbar .btn-menu-toggle .btn-menu{max-height:calc(var(--vh)*100 - 4.375rem);top:calc(100% + 7px)}@media only screen and (max-width:600px){.topbar .btn-menu-toggle .btn-menu{max-height:calc(var(--vh)*100 - 3.75rem);top:29px}.topbar .btn-menu-toggle{margin-left:0}}[dir=ltr] .topbar .chat-info{padding-left:49px}[dir=rtl] .topbar .chat-info{padding-right:49px}.topbar .chat-info{flex:1 1 auto;max-width:calc(100% - var(--utils-width));overflow:hidden}@media only screen and (max-width:600px){[dir=ltr] .topbar .chat-info{padding-left:52px}[dir=rtl] .topbar .chat-info{padding-right: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{align-items:center;display:flex;flex:1 1 auto;height:3.5rem;justify-content:space-between;max-height:3.5rem;max-width:100%}.topbar .chat-utils{align-items:center;display:flex;flex:0 0 auto}@media only screen and (min-width:1276px){.topbar .chat-utils{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 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}}[dir=ltr] .topbar .chat-join{margin-right:.5rem}[dir=rtl] .topbar .chat-join{margin-left:.5rem}.topbar .chat-join{font-size:.875rem;font-weight:400;height:2.25rem;padding:0 1.375rem;width:auto}.topbar .chat-join:not(.hide)+.chat-mute-button{display:none}[dir=ltr] .topbar .content{padding-left:1.125rem}[dir=rtl] .topbar .content{padding-right:1.125rem}.topbar .content{flex:1 1 auto;max-width:100%;overflow:hidden}.topbar .person{align-items:center;display:flex}.topbar .person-avatar{flex:0 0 auto}.topbar .person .bottom{color:var(--secondary-text-color);font-size:.875rem}.topbar .person .bottom .online{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}[dir=ltr] .chat:not([data-type=chat]) .topbar .content{padding-left:16px}[dir=rtl] .chat:not([data-type=chat]) .topbar .content{padding-right:16px}[dir=ltr] .topbar-call-container{left:1px;right:0}[dir=rtl] .topbar-call-container{left:0;right:1px}.topbar-call-container{color:#fff;cursor:pointer!important;height:var(--topbar-call-height)!important;min-height:auto!important;position:absolute;top:calc(var(--topbar-call-height)*-1);z-index:2}body:not(.has-chat) .topbar-call-container{background:none!important}@media only screen and (max-width:925px){[dir=ltr] .topbar-call-container{left:0}[dir=rtl] .topbar-call-container{right:0}}.topbar-call-container .btn-icon{color:inherit;flex:0 0 auto;height:2.5rem;padding:0;width:2.5rem}.topbar-call-container .peer-title{font-weight:var(--font-weight-bold);white-space:nowrap}@media only screen and (max-width:480px){.topbar-call-container:not(.is-call) .topbar-call-left,.topbar-call-container:not(.is-call) .topbar-call-right{width:auto}.topbar-call-container:not(.is-call) .group-call-description{display:none}.topbar-call-container.is-call .topbar-call-left,.topbar-call-container.is-call .topbar-call-right{width:6.25rem}.topbar-call-container.is-call .call-description:not(.has-duration){display:none}}.topbar-call-left,.topbar-call-right{flex:0 0 auto;width:12rem}.topbar-call-left{align-items:center;display:flex}[dir=ltr] .topbar-call-left .btn-icon{margin-right:.375rem}[dir=rtl] .topbar-call-left .btn-icon{margin-left:.375rem}.topbar-call-left .call-description{white-space:nowrap}.topbar-call-left .call-description-duration{font-weight:var(--font-weight-bold)}.topbar-call-center{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media only screen and (min-width:1276px){.topbar-call-center{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 var(--transition-standard-in)}body.animation-level-0 .topbar-call-center{transition:none}.topbar-call-center{padding:0 calc(var(--right-column-width)/2)}}.topbar-call-right{display:flex;justify-content:flex-end}@media only screen and (min-width:1276px){.topbar-call-right{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 var(--transition-standard-in)}body.animation-level-0 .topbar-call-right{transition:none}}.topbar-call-weave{bottom:-1.125rem;left:0;pointer-events:none;position:absolute;right:0;top:0;transform:scale(var(--topbar-floating-scaleX),-1);transform-origin:left center;z-index:-1}.is-rtl .topbar-call-weave{transform-origin:right center}@media only screen and (min-width:1276px){.topbar-call-weave{transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-weave{transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-weave{transition:none}}.topbar-call-weave-canvas{height:100%;width:100%}.topbar .back-unread-badge{position:absolute;right:-.5rem;top:-.25rem}@media only screen and (min-width:601px){.topbar .back-unread-badge{display:none}}@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}.bubbles-group{position:relative}.bubbles-group-avatar{bottom:.25rem;cursor:pointer;pointer-events:all;position:sticky!important;top:0}.bubbles.is-selecting .bubbles-group-avatar{transform:translateZ(0) scaleX(1);transform-origin:bottom}.bubbles-group-avatar.is-gesturing-reply{transform:translateX(0)}.bubbles-group-avatar.is-gesturing-reply.animating.backwards{transition:transform var(--transition-standard-out)}.bubbles-group-avatar-container{bottom:0;display:flex;flex-direction:column-reverse;left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:2}.bubble{--line-height:var(--messages-line-height);display:flex;flex-wrap:wrap;margin:0 auto .125rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:1}.bubble.is-gesturing-reply{transform:translateX(0)}.bubble.is-gesturing-reply.animating.backwards{transition:transform var(--transition-standard-out)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon{align-items:center;background-color:var(--message-highlightning-color);border-radius:50%;color:#fff;display:flex;height:var(--message-beside-button-size);justify-content:center;opacity:0;position:absolute;right:var(--message-beside-button-margin);top:50%;transform:translateY(-50%);transform:translateY(-50%) scale(.6);visibility:hidden;width:var(--message-beside-button-size)}.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{transform:translateY(-50%) scale(1);visibility:visible}.bubble.is-highlighted:after,.bubble.is-selected:after,.bubble:after{bottom:-.0625rem;content:" ";left:-50%;position:absolute;top:-.0625rem;z-index:-1}.bubble.is-highlighted:after{background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-highlighted:after{animation:bubbleSelected 2s linear}@media only screen and (max-width:600px){.bubble.is-first-unread{max-width:none}}.bubble.is-first-unread:before{background-color:var(--surface-color);color:var(--primary-color);content:"Unread messages";font-size:15px;font-weight:var(--font-weight-bold);height:30px;line-height:2.1;margin-bottom:.25rem;margin-left:-50%;margin-right:-50%;position:relative;text-align:center;z-index:2}.bubble.is-first-unread.is-highlighted:after,.bubble.is-first-unread.is-selected:after{top:calc(.0625rem + 30px)}.bubble.is-selected:after{background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-selected:after{animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-selected.backwards:after{animation:fade-in-backwards-opacity .2s linear forwards}.bubble:after,.bubble:before{display:block;width:200%}.bubble.is-multiple-documents:after,.bubble.is-multiple-documents:before{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{display:flex;left:0;margin:0;position:absolute;z-index:3}.bubble-select-checkbox .checkbox-box-border{border-color:var(--message-checkbox-border-color)}.bubble-select-checkbox .checkbox-box-background{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:0 0 3px 0 rgba(0,0,0,.4)}.bubbles.is-selecting .bubble:not(.is-album) .attachment,.bubbles.is-selecting .bubble:not(.is-album) .audio,.bubbles.is-selecting .bubble:not(.is-album) .document,.bubbles.is-selecting .bubble:not(.is-album) poll-element{pointer-events:none!important}.bubbles.is-selecting .bubble a,.bubbles.is-selecting .bubble img,.bubbles.is-selecting .bubble video{pointer-events:none}.bubble-content{background-color:var(--message-background-color);border-radius:12px;box-shadow:0 1px 2px 0 rgba(16,35,47,.15);display:flex;flex-direction:column-reverse;max-width:100%;min-width:56px;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:2}body.animation-level-0 .bubble-content{transition:none}html.is-touch body:not(.no-select) .chat:not(.no-forwards) .bubbles.is-selecting .bubble-content,html.no-touch .chat:not(.no-forwards) .bubbles:not(.is-selecting) .bubble-content{-webkit-user-select:text;-moz-user-select:text;user-select:text}.bubble-content.hover-reaction-visible .bubble-beside-button{transform:translateX(1.125rem)}.bubble.is-out .bubble-content.hover-reaction-visible .bubble-beside-button{transform:translateX(-1.125rem)}.bubble.is-out .bubble-content.hover-reaction-visible .bubble-beside-button.goto-original{transform:translateX(-1.125rem) rotate(180deg)}.bubble-hover-reaction{--size:1.875rem;--offset:calc(var(--size)*-0.75);align-items:center;background-color:var(--surface-color);border-radius:var(--size);bottom:0;box-shadow:var(--menu-box-shadow);cursor:pointer;display:flex;height:1.625rem;justify-content:center;opacity:0;position:absolute;right:var(--offset);transform:scale(.8);width:var(--size);z-index:2}body.animation-level-2 .bubble-hover-reaction{transition:opacity var(--btn-corner-transition),transform var(--btn-corner-transition)}.bubble-hover-reaction.is-visible:not(.backwards){opacity:1;transform:scale(1)}.bubble-hover-reaction-sticker{height:1.125rem;position:relative;width:1.125rem}.bubble.service{max-width:var(--messages-container-width)}.bubble.service .bubble-content{box-shadow:none;margin:0 auto;max-width:100%}.bubble.is-date{font-weight:var(--font-weight-bold);opacity:.99999;padding-bottom:.375rem;pointer-events:none;position:sticky;top:.25rem;transition:opacity .3s ease;z-index:2}.bubble.is-date:after,.bubble.is-date:before{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[data-type=chat] .bubble.is-date .bubble-content,.chat[data-type=discussion] .bubble.is-date .bubble-content{cursor:pointer;pointer-events:all}.bubbles:not(.has-sticky-dates) .bubble.is-date{visibility:hidden}.bubbles.has-sticky-dates .bubble.is-date.is-fake{display:none}.bubble.is-date.is-fake{left:50%;opacity:1!important;position:absolute;top:0;transform:translateX(-50%);transition:none!important;visibility:visible!important}.bubble-beside-button{align-items:center;background:var(--message-highlightning-color);border-radius:50%;bottom:0;color:var(--badge-text-color);cursor:pointer;display:flex;font-size:1.5rem;height:var(--message-beside-button-size);justify-content:center;position:absolute;right:var(--message-beside-button-margin);transform:translateX(0);width:var(--message-beside-button-size)}html.no-touch .bubble-beside-button{opacity:0}html.no-touch body.animation-level-2 .bubble-beside-button{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.bubble-view-button{align-items:center;border:1px solid var(--message-primary-color);border-radius:6px;color:var(--message-primary-color);display:flex;height:2rem;justify-content:center;margin:0 .5625rem .5rem;text-decoration:none!important;width:auto}html.no-touch .bubble-view-button:active,html.no-touch .bubble-view-button:hover{background-color:var(--light-filled-message-primary-color)}.bubble-view-button .c-ripple__circle{background-color:var(--message-primary-color);opacity:.08}.message .bubble-view-button{margin:.375rem 0 -.375rem;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.bubble-view-button+.reactions-block{margin-top:.375rem}html.no-touch .bubble:active .bubble-beside-button,html.no-touch .bubble:hover .bubble-beside-button{opacity:1}.bubble .forward{font-size:1.25rem}.bubble.is-group-last{margin-bottom:.5rem}.bubble.is-group-last:after{bottom:-.25rem}.bubbles-inner.is-chat .bubble.is-group-last.is-in>.bubble-select-checkbox{bottom:.1875rem}.bubble.is-group-first:after{top:-.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:-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;min-width:100%}.bubble.webpage .document{height:3.375rem}@media only screen and (max-width:600px){.bubble.webpage .document{padding-left:44px}}.bubble.webpage .has-document{display:flex;flex-direction:column}.bubble.webpage .has-document .preview-resizer{order:1}.bubble .preview-resizer{display:flex}.bubble img.emoji{height:18px;vertical-align:bottom;width:18px}.bubble .thumbnail{position:absolute}.bubble .canvas-thumbnail{border-radius:inherit}.bubble .canvas-dots{z-index:1}.bubble.emoji-big{--emoji-size:1rem;font-size:0}.bubble.emoji-big .bubble-content{line-height:1}.bubble.emoji-big .attachment{--custom-emoji-size:var(--emoji-size);border-radius:0!important}.bubble.emoji-big .attachment img.emoji{height:var(--emoji-size);max-height:64px;max-width:64px;width:var(--emoji-size)}.bubble.emoji-big .attachment .custom-emoji,.bubble.emoji-big .attachment .emoji{display:inline-block}.bubble.emoji-big:not(.sticker) .attachment{display:block;font-size:var(--emoji-size);max-height:-moz-fit-content!important;max-height:fit-content!important;padding-bottom:1.25rem;padding-top:.25rem;white-space:pre-wrap;word-break:break-word}.bubble.emoji-big:not(.sticker) .attachment span.emoji{height:auto;width:auto}.bubble.emoji-big:not(.sticker) .message{margin-top:-1.125rem}.bubble.emoji-big:not(.sticker) .bubble-content{max-width:min(420px,100%)}.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:var(--message-highlightning-color)}.bubble.emoji-big:not(.sticker) .bubble-content,.bubble.sticker .bubble-content{align-self:flex-start}.bubble.emoji-big:not(.sticker) .message,.bubble.sticker .message{margin-left:auto;position:relative!important;right:0!important}.bubble.sticker .attachment{border-radius:0;position:absolute;z-index:1}.bubble.round .attachment{height:var(--round-video-size)!important;max-height:var(--round-video-size)!important;max-width:var(--round-video-size)!important;width: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{border-radius:inherit;cursor:pointer;display:flex;justify-content:center;max-width:100%;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .attachment img,.bubble .attachment video{max-width:100%}.bubble .attachment .download{align-items:center;cursor:pointer;display:flex;height:100%;justify-content:center;left:0;position:absolute;top:0;width:100%}.bubble .attachment .download span{background-color:var(--message-time-background);color:#fff;font-size:23px;text-align:center}.bubble .attachment .download~.video-play,.bubble .attachment .preloader-container~.video-play{display:none}.bubble .media-container-aspecter{margin:0 auto;position:relative;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{animation:thumbnail-fade-in-opacity .2s ease-in-out forwards}.bubble .preloader-container{z-index:2}.bubble:not(.sticker) .attachment{max-height:min(340px,100%);max-width:min(420px,100%);width:-moz-max-content;width:max-content}.bubble img:not(.emoji),.bubble video{height:100%;-o-object-fit:cover;object-fit:cover;width: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-height:none;max-width:min(451px,100%)}.bubble .album-item{background-color:var(--message-highlightning-color);cursor:pointer;max-width:100%;overflow:hidden;position:absolute}body.animation-level-0 .bubble .album-item{transition:none!important}.bubble .album-item img,.bubble .album-item video,.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 var(--transition-standard-out)}.bubble .album-item.is-selected.animating .album-item-media{transition:transform var(--transition-standard-out),border-radius var(--transition-standard-out)}.bubble .album-item.is-selected:not(.backwards){transition:border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards) .album-item-media{transform:scale(.883333);transition:transform var(--transition-standard-in),border-radius var(--transition-standard-in)}.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:active,html.no-touch .bubble a:hover{text-decoration:underline}.bubble-first{align-items:center;justify-content:center;margin-top:.5rem;max-width:100%;order:-1}body.animation-level-0 .bubble-first{flex:1 1 auto}.bubble-first .attachment{pointer-events:none}.bubble-first .bubble-content-wrapper{max-width:100%}.bubble-first.empty-bubble-placeholder{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}body.animation-level-2 .bubble-first.empty-bubble-placeholder .bubble-content-wrapper{transition:var(--bubble-transition-in)}.bubble-first.empty-bubble-placeholder.has-description .service-msg{align-items:flex-start!important;flex-direction:column;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-size:1rem!important;font-weight:var(--font-weight-bold)}.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{font-size:1.25rem;margin-left:-.1875rem;margin-right:.25rem;vertical-align:bottom}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-list-bullet{margin-right:.3125rem}.bubbles.has-groups .bubble-first.empty-bubble-placeholder{pointer-events:none}.bubbles.has-groups .bubble-first.empty-bubble-placeholder .bubble-content-wrapper{opacity:0;transform:scale3d(.8,.8,1) translateX(0)}.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{cursor:pointer;height:200px;margin-top:.75rem!important;position:relative;width:200px}.bubble-first .time{display:none!important}.bubble-first:after,.bubble-first:before{display:none}.bubble .web{line-height:var(--line-height);margin:.125rem 0 0;max-width:100%;overflow:hidden}.bubble .web+.time{display:block}.bubble .web .preview{border-radius:4px;cursor:pointer;max-height:min(340px,100%);max-width:min(420px,100%);overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;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 .text,.bubble .web .title,.bubble .web .webpage-name{font-size:var(--messages-secondary-text-size);line-height:var(--messages-secondary-line-height)}.bubble .web .webpage-name{text-decoration:none}html.no-touch .bubble .web .webpage-name:active,html.no-touch .bubble .web .webpage-name:hover{text-decoration:underline}.bubble .web .text{margin-top:1px;word-break:break-word}.bubble .web .quote{display:flex;max-width:100%;overflow:hidden;width:100%}.bubble .web .quote-text{margin-left:-.625rem;max-width:100%;padding-left:.625rem;width:100%}.bubble .web .quote:before{background-color:var(--primary-color);border-radius:.125rem;content:" ";flex:0 0 auto;margin:.1875rem .5rem .125rem 0;width:.125rem}.bubble .reply{--font-size:var(--messages-secondary-text-size)}.bubble .document-name{font-size:var(--messages-text-size)}.bubble .document-size{font-size:var(--messages-secondary-text-size)}.bubble.is-square-photo .bubble-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{float:right;height:3rem;margin:.1875rem 0 0 .625rem;width:3rem}.bubble.is-square-photo .web .preview{margin:0;max-height:min(3rem,100%);max-width:min(3rem,100%)}.bubble .reply{border-radius:.25rem;cursor:pointer;margin:0 .375rem .375rem;min-width:10rem;padding:.25rem;width:auto}.bubble .reply-media{top:.125rem}.bubble .reply-content{height:auto;max-width:calc(100% - 1.25rem);min-height:32px;overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap}.bubble .message+.reply{margin-bottom:0}.bubble:not(.just-media) .reply{border-radius:6px}html.no-touch .bubble:not(.just-media) .reply:active,html.no-touch .bubble:not(.just-media) .reply:hover{background-color:var(--light-filled-message-primary-color)}.bubble.just-media .floating-part{background-color:var(--message-highlightning-color);border-radius:12px;margin:0;max-width:15rem;padding:.375rem .625rem;position:absolute;top:0;white-space:nowrap}@media only screen and (max-width:600px){.bubble.just-media .floating-part{max-width:calc(100vw - 1rem - 10px - 100%)}}.bubble.just-media .name{color:#fff!important;line-height:var(--line-height);padding:.375rem .625rem}.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;max-width:none!important;position:relative}.bubble.just-media .reply i,.bubble.just-media .reply-subtitle,.bubble.just-media .reply-title{color:#fff!important}.bubble.just-media .reply-border{background:#fff!important}.bubble.forwarded .attachment,.bubble.is-reply .attachment,.bubble:not(.hide-name) .attachment{border-top-left-radius:0;border-top-right-radius:0}.bubble .message,.bubble .service-msg{--custom-emoji-size:var(--messages-custom-emoji-size)}.bubble .message{color:var(--primary-text-color);font-size:var(--messages-text-size);line-height:var(--line-height);max-width:100%;padding:0 .5rem .375rem .625rem;position:relative;white-space:pre-wrap;word-break:break-word}.bubble .message .custom-emoji{display:inline-flex}.bubble .message:last-child{padding-top:6px}@media only screen and (max-width:600px){.bubble .audio,.bubble .document{--icon-size:2.25rem}}.bubble .audio .audio-title{font-weight:var(--font-weight-bold)}.bubble .audio .audio-ico{font-size:0}@media only screen and (max-width:600px){.bubble .audio{--icon-margin:.6875rem;height:2.375rem}.bubble .audio .audio-details{margin-bottom:0;margin-top:2px}.bubble .audio .audio-subtitle{margin-top:-1px}}.bubble .message.audio-message{width:335px}@media only screen and (max-width:600px){.bubble .message.audio-message{width:280px}}.bubble .message.audio-message,.bubble .message.voice-message{max-width:min(100%,335px)!important}@media only screen and (max-width:600px){.bubble .message.audio-message,.bubble .message.voice-message{max-width:min(100%,300px)!important}}.bubble.min-content .bubble-content{width:-moz-min-content;width:min-content}.bubble .message.voice-message .document-message{max-width:-moz-fit-content;max-width:fit-content}.bubble .message.audio-message,.bubble .message.voice-message{padding:8px!important}.bubble .message.call-message,.bubble .message.contact-message{min-width:200px;padding-left:8px}.bubble .message.contact-message .contact{cursor:pointer;display:flex;padding:2px 0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .message.contact-message .contact-avatar{color:#fff}.bubble .message.contact-message .contact-details{display:flex;flex-direction:column;margin-top:8px;padding-left:12px}.bubble .message.contact-message .contact-name{font-size:1rem;font-weight:var(--font-weight-bold)}.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{--icon-margin:.75rem;height:58px}@media only screen and (max-width:600px){.bubble .message.document-message .document{--icon-margin:.5rem;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 0 0}}.bubble .message.document-message .document-name{line-height:1.4;margin-top:1px;overflow:hidden;text-overflow:ellipsis}.bubble-call{cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding:.125rem 0 .125rem 2.5625rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble-call:before{font-size:1.5rem;left:.3125rem;position:absolute}.bubble-call-title{font-weight:var(--font-weight-bold)}.bubble-call-subtitle{align-items:center;color:var(--secondary-text-color);display:flex;font-size:var(--messages-secondary-text-size);line-height:var(--messages-secondary-line-height);margin-left:-.1875rem;margin-top:.0625rem}.bubble-call-subtitle.is-reason:before{margin-right:.0625rem}.bubble-call-subtitle:before{content:"๎คŒ";display:inline-block;font-size:1rem;transform:rotate(135deg)}.bubble-call-subtitle.arrow-red:before{color:var(--danger-color)}.bubble-call-subtitle.arrow-green:before{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 .time{align-self:flex-start;height:0}.bubble .document-message+.audio .time,.bubble .document-message+.document .time{display:none!important}.bubble.is-multiple-documents .message{border-radius:inherit;padding:0!important}.bubble.is-multiple-documents .document-container{border-radius:inherit;position:relative}.bubble.is-multiple-documents .document-container .document-selection{bottom:0;left:-75vw;position:absolute;top:0;width:200vw;z-index:-2}.bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before,.bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{background-color:var(--message-background-color);border-radius:inherit;bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.bubble.is-multiple-documents .document-container.is-highlighted .document-selection{background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-selection{animation:bubbleSelected 2s linear}.bubble.is-multiple-documents .document-container.is-selected .document-selection{background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-selection{animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-selection{animation:fade-in-backwards-opacity .2s linear forwards}.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--margin-top:.25rem;--margin-left:.125rem;background:#fff;border-radius:50%;left:auto;margin-left:calc(var(--padding-left)*-1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto}@media only screen and (max-width:600px){.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--size:1.125rem}}.bubble.is-multiple-documents .document-container .bubble-select-checkbox:before{--inner-size:.125rem;border:2px solid var(--secondary-color);border-radius:inherit;content:" ";height:calc(var(--size) - var(--inner-size)*2);left:var(--inner-size);position:absolute;top:var(--inner-size);width:calc(var(--size) - var(--inner-size)*2)}.bubble.is-multiple-documents .document-container:first-of-type .document-selection{top:-.0625rem}.bubble.is-multiple-documents .document-container:first-of-type .document-wrapper{border-top-left-radius:inherit;border-top-right-radius:inherit;padding-top:.5rem}.bubble.is-multiple-documents .document-container:last-of-type .document-selection{bottom:-.0625rem}.bubble.is-multiple-documents .document-container:last-of-type .document-wrapper{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;padding-bottom:.5rem}.bubble.is-multiple-documents.is-group-first .document-container:first-of-type .document-selection{top:-.25rem}.bubble.is-multiple-documents.is-group-last .document-container:last-of-type .document-selection{bottom:-.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{padding:.25rem .5rem}.bubble.is-multiple-documents .document-wrapper>.name{margin-top:-.1875rem;padding:0 0 .25rem}.bubble .message .audio .time,.bubble .message.contact-message .time,.bubble .message.poll-message .time{bottom:0;position:absolute;right:0}html:not(.is-safari) .bubble .message.voice-message{overflow:hidden}.bubble.is-message-empty .bubble-content-wrapper{width:-moz-min-content;width:min-content}.bubble.is-message-empty .message{background-color:var(--message-time-background);border-radius:.75rem;bottom:.1875rem;padding:0 .3125rem;position:absolute;right:.1875rem;z-index:2}.bubble.is-message-empty .message .time{align-items:center;display:flex;height:calc(var(--messages-time-text-size) + .375rem);margin:0;padding:0;white-space:nowrap}.bubble.is-message-empty .message .time .inner{bottom:auto;color:#fff;margin:inherit;right:auto}.bubble.is-message-empty .message .time .inner:after{color:#fff!important}.bubble.is-message-empty.with-replies:not(.sticker):not(.with-beside-replies) .message{bottom:55px}.bubble.is-message-empty.emoji-big .message,.bubble.is-message-empty.sticker .message,.bubble.is-message-empty.with-replies.round .message{bottom:0}.bubble.is-message-empty:not(.emoji-big) .reactions-block{max-width:-moz-fit-content;max-width:fit-content}.bubble.is-message-empty .reaction-block{--chosen-background-color:var(--primary-color)}html.no-touch .bubble.is-message-empty .reaction-block:not(.is-chosen):active:after,html.no-touch .bubble.is-message-empty .reaction-block:not(.is-chosen):hover:after{background-color:#fff}.bubble.with-reply-markup .bubble-content{min-width:100%}.bubble.with-replies .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble.with-beside-replies .bubble-content{min-height:5.5rem}.bubble .colored-name .premium-icon{color:inherit;opacity:.6}.bubble .time{cursor:pointer;direction:ltr;display:inline-flex;float:right;font-size:var(--messages-time-text-size);height:var(--messages-time-text-size);line-height:1;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;visibility:hidden;z-index:1}.bubble .time i{font-size:1.125rem;margin-right:.375rem}.bubble .time-icon{pointer-events:none}.bubble .time-icon:not(:first-child){margin-left:2px}.bubble .time i.edited{font-size:inherit;overflow:visible}.bubble .time .inner{align-items:center;bottom:0;color:var(--message-time-color);display:flex;height:var(--messages-time-text-size);line-height:1;padding:inherit;pointer-events:all;position:absolute;right:0;visibility:visible;white-space:nowrap}.bubble .time .inner:after{color:var(--message-status-color)}.bubble .time .tgico-pinnedchat{margin-right:.125rem}.bubble .time.is-block{display:block;float:none}.bubble.webpage .time{float:none}.bubble .video-play,.bubble .video-time{pointer-events:none}.bubble .video-time{--height:calc(var(--messages-time-text-size) + 0.375rem);align-items:center;background-color:var(--message-time-background);border-radius:var(--height);color:#fff;display:flex;font-size:var(--messages-time-text-size);height:var(--height);left:3px;line-height:1;padding:0 6px;position:absolute;top:3px;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:2}.bubble .video-time.can-autoplay:after{color:#fff;content:"๎ฆƒ";font-size:calc(var(--messages-time-text-size) + 8px);padding:0 1px 0 3px}[dir=ltr] .bubble .video-time.is-error:after{margin-left:1px}[dir=rtl] .bubble .video-time.is-error:after{margin-right:1px}.bubble .video-time.is-error:after{content:"๎ฆญ";font-size:calc(var(--messages-time-text-size) + 4px);padding:0}.bubble .extended-media-buy{align-items:center;-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:rgba(0,0,0,.3);border-radius:2rem;color:#fff;display:flex;font-size:var(--font-size-14);font-weight:var(--font-weight-bold);height:2.5rem;left:50%;padding:0 1rem;position:absolute;top:50%;transform:translate(-50%,-50%);white-space:nowrap;z-index:2}.bubble .extended-media-buy:before{font-size:1.125rem;margin-right:.25rem}.bubble pre{display:inline;margin:0}.bubble .anchor-url{text-decoration:underline}.bubble .video-play{align-items:center;background-color:var(--message-time-background);color:#fff;display:flex;font-size:2.125rem;justify-content:center;text-align:center;z-index:2}.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;user-select:none}.bubble .peer-title{cursor:pointer}.bubble .name{color:var(--primary-color);font-size:var(--messages-secondary-text-size);font-weight:var(--font-weight-bold)!important;line-height:calc(var(--messages-secondary-text-size) + .25rem);max-width:100%;overflow:hidden;padding:.375rem .625rem 0;text-overflow:ellipsis}.bubble .name .badge-fake{display:inline-block;margin-top:-2px;vertical-align:middle}.bubble:not(.webpage).photo:not(.is-reply) .bubble-content>.name,.bubble:not(.webpage).video:not(.is-reply) .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).photo .topic-name-button-container,.bubble:not(.webpage).video .topic-name-button-container{margin-bottom:0}.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):not(.forwarded).hide-name .reply,.bubble:not(.sticker):not(.emoji-big):not(.forwarded):not(.is-group-first) .reply{margin-top:6px}.bubble .bubble-tail{display:none}.bubble.can-have-tail.is-group-last .bubble-tail{fill:var(--message-background-color);display:block;height:20px;position:absolute;transform:translateY(1px);width:11px;z-index:-2}.bubble.is-message-empty.is-group-last.with-media-tail .bubble-tail,.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 .attachment{overflow:visible}.bubble__media-container{border-radius:inherit;cursor:pointer}.bubble audio-element,.bubble poll-element{white-space:normal}.bubble .replies{-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .replies .c-ripple__circle{background-color:var(--light-primary-color)}.bubble .replies .rp{border-radius:inherit;cursor:pointer;height:100%;left:0;overflow:hidden;position:absolute;top:0;width:100%}.bubble .replies-beside{border-radius:2rem;bottom:47px;flex-direction:column;height:auto;max-height:52px;min-height:36px;padding:.375rem 0 .5rem;right:-44px;width:36px}.bubble .replies-beside-text{font-size:.75rem;margin-top:.125rem}.bubble .replies-footer{align-items:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;border-top:.0625rem solid var(--border-color);color:var(--primary-color);display:flex;height:3.0625rem;min-width:15rem;padding:0 .5rem;position:relative}html.no-touch .bubble .replies-footer:active,html.no-touch .bubble .replies-footer:hover{background-color:var(--light-primary-color)}html.no-touch .bubble .replies-footer:active~.bubble-tail,html.no-touch .bubble .replies-footer:hover~.bubble-tail{fill:var(--light-filled-message-primary-color)}.bubble .replies-footer .tgico-comments,.bubble .replies-footer .tgico-next{font-size:1.5rem}.bubble .replies-footer .tgico-comments{margin-left:.125rem;margin-right:.375rem}.bubble .replies-footer-text{align-items:center;color:var(--primary-color);display:flex;font-size:.9375rem;font-weight:var(--font-weight-bold);line-height:1.125rem;margin-left:.5rem}.bubble .replies-footer-avatars{--margin-right:-.875rem;--border-size:2px}.bubble .replies-footer .tgico-next{position:absolute;right:.1875rem}.bubble .replies-footer.is-unread .replies-footer-text:after{background-color:var(--primary-color);border-radius:50%;content:" ";height:.5rem;margin-left:.75rem;width:.5rem}.bubble.is-thread-starter .user-avatar{display:none}.bubble.is-thread-starter.is-in .bubble-content-wrapper{margin-left:0}.bubble .message .reaction{--background-color:var(--light-filled-message-primary-color)}.bubble .message .reaction.is-chosen.backwards,.bubble .message .reaction:not(.is-chosen){--counter-color:var(--message-primary-color)}.bubble .message .reaction.is-chosen.backwards .stacked-avatars,.bubble .message .reaction:not(.is-chosen) .stacked-avatars{--border-color:var(--background-color)}.bubble .message .reactions-block .time{bottom:auto!important;order:100;position:static!important;right:auto!important}.bubble code{cursor:pointer}.bubble.is-invoice .attachment{background-color:inherit!important}.bubble.with-reply-markup .bubble-content{border-bottom-left-radius:6px!important;border-bottom-right-radius:6px!important}.bubble .name-with-reply .name{padding:0!important}.bubble .name-with-reply .name:not(:last-child) .hide-ol{display:none}.bubble .name-with-reply .name:not(:last-child) .peer-title{font-weight:var(--font-weight-bold)!important}.bubble .name-with-reply .reply{height:auto;margin:.25rem 0 0;max-height:none;padding:0}.bubble .topic-name-button{--color:var(--message-primary-color)}.bubble .name .topic-name-button-container{margin:.25rem -.125rem}.bubble .name .topic-name-button-container:first-child{margin-top:0}.bubble.is-message-empty:not(.is-reply) .name .topic-name-button-container{margin-bottom:0}.bubble:not(.is-group-first) .topic-name-button-container{display:none!important}.bubble .topic-name-button-container.floating-part{font-size:var(--messages-secondary-text-size);padding-bottom:0;padding-top:0}.bubble .topic-name-button-container.floating-part .topic-name-button{--color:#fff;padding:0}.bubble .topic-name-button-container.floating-part .topic-name-button:before{content:none}.bubble .topic-name-button-container.floating-part+.floating-part{margin-top:1.75rem}.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type{margin-bottom:.0625rem}.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type .document-container:last-of-type .document-selection,.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type:after{bottom:-.0625rem}.can-zoom-fade{opacity:1;transform:scale(1) translateX(0);transform-origin:center}body.animation-level-2 .can-zoom-fade{transition:var(--bubble-transition-out)}.bubbles-inner.zoom-fading .can-zoom-fade{transition:var(--bubble-transition-in)}.can-zoom-fade.zoom-fade{opacity:0;transform:scale3d(.8,.8,1) translateX(0)}.bubble-content-wrapper{display:flex;flex-direction:column}@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% - var(--message-handhelds-margin))}}.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{align-items:center;background-color:var(--message-highlightning-color);border-radius:inherit;color:#fff;display:flex;font-size:var(--messages-service-text-size);justify-content:center;line-height:calc(var(--messages-service-text-size) + 5px);padding:.28125rem .625rem;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;word-break:break-word}.bubble.service .service-msg i{font-style:normal}.bubble.service .service-msg a{color:#fff}.bubble.service .service-msg .peer-title,.bubble.service .service-msg [data-saved-from],.bubble.service .service-msg a{cursor:pointer;font-weight:var(--font-weight-bold)}.bubble.service .service-msg .peer-title:hover,.bubble.service .service-msg [data-saved-from]:hover,.bubble.service .service-msg a:hover{text-decoration:underline}.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!important}.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 .floating-part{left:calc(100% + 10px)}@media only screen and (max-width:600px){.bubble.is-in.just-media .floating-part{left:calc(100% + 1px)}}.bubble.is-in .quote .webpage-name,.bubble.is-in .reply-title{color:var(--primary-color)}.bubble.is-in .time{margin-left:-3px;padding-right:8px}.bubble.is-in .time .inner{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 .audio-time,.bubble.is-in .contact-number{color:var(--secondary-text-color)!important}.bubble.is-in code,.bubble.is-in pre{color:var(--monospace-text-color)}.bubble.is-in:not(.just-media) .reply.is-overriding-color .reply-border{background-color:rgb(var(--override-color))}.bubble.is-in:not(.just-media) .reply.is-overriding-color .reply-title{color:rgb(var(--override-color))}html.no-touch .bubble.is-in:not(.just-media) .reply.is-overriding-color:active,html.no-touch .bubble.is-in:not(.just-media) .reply.is-overriding-color:hover{background-color:rgba(var(--override-color),.08)}.bubble.is-out{--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);--message-primary-color:var(--message-out-primary-color);--light-filled-message-primary-color:var(--light-filled-message-out-primary-color);--selection-background-color:var(--message-out-selection-background-color);--message-time-color:var(--message-out-time-color);--message-status-color:var(--message-out-status-color);flex-direction:row-reverse}.bubble.is-out .bubble-content{margin-left:auto}.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: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) + .5rem)*-1))}.bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(.8,.8,1) translateX(calc((var(--chat-input-size) + .5rem)*-1))}body.animation-level-2 .bubble.is-out .bubble-content-wrapper{transition:var(--bubble-transition-out)}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:var(--bubble-transition-in)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(.8,.8,1) translateX(0)}}.bubble.is-out .anchor-url{color:var(--message-primary-color)}.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!important}.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 .floating-part{right:calc(100% + 10px)}.bubble.is-out.just-media .message{right:0}.bubble.is-out:not(.just-media) .reply-border{background-color:var(--message-out-primary-color)!important}.bubble.is-out:not(.just-media) .reply i,.bubble.is-out:not(.just-media) .reply-title{color:var(--message-out-primary-color)!important}.bubble.is-out .quote:before{background-color:var(--message-out-primary-color)}.bubble.is-out .quote .webpage-name{color:var(--message-out-primary-color)}.bubble.is-out .time{margin-left:-4px;padding-right:5px}.bubble.is-out .time .inner{bottom:4px}.bubble.is-out .time .inner:after,.bubble.is-out .time:after{font-size:calc(var(--messages-text-size) + 3px);line-height:var(--messages-time-text-size);margin-left:1px}.bubble.is-out.forwarded .name{color:var(--message-out-primary-color)}.bubble.is-out.is-read .time .inner:after,.bubble.is-out.is-read .time:after{content:"๎ค"}.bubble.is-out.is-sent .time .inner:after,.bubble.is-out.is-sent .time:after{content:"๎ค€"}.bubble.is-out.is-sending .time .inner:after,.bubble.is-out.is-sending .time:after{content:"๎ฆฌ"}.bubble.is-out.is-error .time .inner:after,.bubble.is-out.is-error .time:after{color:var(--message-error-color);content:"๎ฆญ"}.bubble.is-out .document-ico:after{border-right-color:var(--message-background-color);border-top-color:var(--message-background-color)}.bubble.is-out .audio-waveform rect{fill:var(--message-out-primary-color)}.bubble.is-out .audio-waveform rect.active{fill:var(--message-out-primary-color)!important}.bubble.is-out .audio-subtitle,.bubble.is-out .audio-time{color:var(--message-out-status-color)}.bubble.is-out .audio-download,.bubble.is-out .audio-toggle,.bubble.is-out .audio.corner-download .preloader-container{background-color:var(--message-out-primary-color)}.bubble.is-out .audio-download:empty{display:none}.bubble.is-out .audio.is-unread rect{fill:var(--message-out-primary-color)}.bubble.is-out .audio.is-unread .audio-time:after{background-color:var(--message-out-primary-color)}.bubble.is-out .audio-toggle .part{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.is-message-empty .reactions-block{justify-content:flex-end}.bubble.is-out.is-message-empty .reaction-block{margin-right:.25rem}.bubble.is-out.is-message-empty .reaction-block:last-child{margin-right:0}.bubble.is-out.is-message-empty .reaction-block.is-chosen{--chosen-background-color:var(--surface-color)}.bubble.is-out.is-message-empty:not(.emoji-big) .reactions-block{margin-left:auto}.bubble.is-out .bubble-call-subtitle,.bubble.is-out .contact-number,.bubble.is-out .document-size{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:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-line use{stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-answer-selected{background-color:var(--message-out-primary-color);color:var(--light-filled-message-out-primary-color)}html.no-touch .bubble.is-out poll-element .poll-answer:hover .animation-ring{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:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-avatars .stacked-avatars{--border-color:var(--message-background-color)}.bubble.is-out poll-element .progress-ring__circle{stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle{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:var(--message-out-primary-color)}.bubble.is-out .audio .preloader-container{--color:var(--message-background-color)}.bubble.is-out .bubble-beside-button{left:var(--message-beside-button-margin);right:auto}.bubble.is-out .bubble-beside-button.goto-original{transform:rotate(180deg)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox{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:var(--message-background-color)}.bubble.is-out .bubble-hover-reaction{left:var(--offset);right:auto}.reply-markup{margin-top:.0625rem;width:100%}.bubble:not(.is-group-last) .reply-markup{margin-bottom:.125rem}.reply-markup-row{display:flex;margin-top:.125rem;min-height:2.5rem;overflow:hidden}.reply-markup-row:last-child .reply-markup-button:first-child{border-bottom-left-radius:12px}.reply-markup-row:last-child .reply-markup-button:last-child{border-bottom-right-radius:12px}.reply-markup-button{background:var(--message-highlightning-color);border:none;border-radius:.375rem;color:#fff!important;cursor:pointer;font-size:var(--font-size-14);font-weight:var(--font-weight-bold);outline:none;overflow:hidden;padding:.5625rem 0;position:relative;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:2}.reply-markup-button-text{pointer-events:none;position:relative}.reply-markup-button.anchor-url{text-decoration:none!important}.reply-markup-button+.reply-markup-button{margin-left:.125rem}.reply-markup-button .forward-icon,.reply-markup-button.tgico:before{display:block;position:absolute;right:.125rem;top:.125rem}.reply-markup-button.is-link:before{content:"๎คŒ";transform:rotate(-45deg)}.reply-markup-button.is-buy:before{content:"๎คœ"}.reply-markup-button.is-switch-inline:before{content:"๎ฅ‹"}.bubble-beside-button:after,.bubble.just-media .reply:after,.reply-markup-button:after{background-color:#fff;border-radius:inherit;bottom:0;content:" ";display:block;left:0;opacity:0;position:absolute;right:0;top:0;z-index:-1}html.no-touch .bubble-beside-button:active:after,html.no-touch .bubble-beside-button:hover:after,html.no-touch .bubble.just-media .reply:active:after,html.no-touch .bubble.just-media .reply:hover:after,html.no-touch .reply-markup-button:active:after,html.no-touch .reply-markup-button:hover:after{opacity:var(--hover-alpha)}.bubble-primary-color{color:var(--message-primary-color);font-weight:var(--font-weight-bold)}.pinned-message{--custom-emoji-size:calc(var(--font-size) + 2px)!important}.pinned-message-border{flex:0 0 auto;height:2rem;position:relative;width:.125rem}.pinned-message-border-wrapper-1{background:var(--primary-color);border-radius:1px;height:2rem;position:relative;top:50%;transform:translateY(-50%);width:.125rem}.pinned-message-border-mask{--mask-height:.375rem;--height:2.5rem;height:var(--height);overflow:hidden}.pinned-message-border-mask:after,.pinned-message-border-mask:before{content:" ";display:block;height:var(--mask-height);left:0;opacity:0;position:absolute;right:0;z-index:1}body.animation-level-2 .pinned-message-border-mask:after,body.animation-level-2 .pinned-message-border-mask:before{transition:opacity .2s ease-in-out}.pinned-message-border-mask:before{background:linear-gradient(var(--surface-color),transparent);top:0}.pinned-message-border-mask:after{background:linear-gradient(transparent,var(--surface-color));bottom:0}.pinned-message-border-mask.mask-bottom:after,.pinned-message-border-mask.mask-top:before{opacity:1}.pinned-message-border-wrapper{color:var(--primary-color);position:relative}.pinned-message-border-wrapper:before{background:var(--primary-color);bottom:0;content:" ";display:block;left:0;opacity:.4;position:absolute;right:0;top:0}.pinned-message-border-bars{stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.pinned-message-border-mark{background:currentColor;border-radius:1px;left:0;position:absolute;top:0;width:2px}body:not(.animation-level-0) .pinned-message-border-mark,body:not(.animation-level-0) .pinned-message-border-wrapper{transition:transform .25s ease-in-out;will-change:transform}.pinned-message-content{--height:32px;height:var(--height)}.pinned-message-media{border-radius:.1875rem}.pinned-message,.reply{--font-size:var(--font-size-14);--custom-emoji-size:calc(var(--font-size) + 4px);--line-height:calc(var(--font-size) + 4px);align-items:center;cursor:pointer;display:flex;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.pinned-message-content,.reply-content{display:flex;flex-direction:column;flex-grow:1;flex-shrink:1;justify-content:center;margin-left:.5rem;overflow:hidden;pointer-events:none;position:relative}.pinned-message-title,.reply-title{color:var(--primary-color)}.pinned-message-subtitle,.pinned-message-title,.reply-subtitle,.reply-title{font-size:var(--font-size);line-height:var(--line-height);overflow:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap}.pinned-message-media,.reply-media{height:2rem!important;left:0;overflow:hidden;position:absolute;top:.125rem;width:2rem!important}.pinned-message-media.is-round,.reply-media.is-round{border-radius:50%}.pinned-message-media>img,.pinned-message-media>video,.reply-media>img,.reply-media>video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.pinned-message i,.reply i{color:var(--secondary-text-color);font-style:normal}.pinned-message img.emoji,.reply img.emoji{height:1rem;vertical-align:top;width:1rem}.reply.is-media .reply-content{padding-left:2.5rem}.reply-border{background:var(--primary-color);border-radius:1px;height:calc(var(--font-size)*2 + .25rem);min-width:2px}.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:var(--font-weight-bold)}.pinned-container{--container-height:3.25rem;align-items:center;cursor:pointer;display:flex;flex:0 0 auto;justify-content:space-between;overflow:visible}.pinned-container.is-floating{background-color:var(--surface-color)!important;height:var(--container-height);left:0;margin:0;max-height:var(--container-height);position:absolute!important;right:0;top:var(--topbar-height);width:auto}.pinned-container.is-floating .pinned-container-wrapper{border-radius:0;height:100%;max-width:100%;order:0;padding:0 1rem;z-index:0}@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{border-bottom:1px solid var(--border-color);border-top:1px solid var(--border-color);bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.pinned-container-content{flex:1 1 auto;overflow:hidden;pointer-events:none;position:relative}.pinned-container .btn-icon{display:flex;flex:0 0 auto;font-size:1.5rem;justify-content:center}.pinned-container-wrapper{align-items:center;border-radius:.25rem;display:flex;flex:1 1 auto;order:1;overflow:hidden;padding:.25rem}.pinned-container-wrapper-utils{align-items:center;display:flex;flex:0 0 auto;position:relative}.pinned-message{display:flex;width:auto}.pinned-message-content{overflow:visible!important}.pinned-message-media-container{height:2rem;margin-left:-.25rem;position:absolute;width:2rem}body.animation-level-2 .pinned-message-media-container{transition:transform var(--pm-transition)}.pinned-message-subtitle,.pinned-message-title{transform:translateX(0)}.pinned-message.is-media .pinned-message-subtitle,.pinned-message.is-media .pinned-message-title{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-subtitle,.pinned-message.is-media .pinned-message-title{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-subtitle,.pinned-message-content .pinned-message-title{height:calc(var(--height)/2);min-height:calc(var(--height)/2);overflow:visible;position:relative}body.animation-level-2 .pinned-message-content .pinned-message-subtitle,body.animation-level-2 .pinned-message-content .pinned-message-title{transition:transform var(--pm-transition)}.pinned-message-title{margin-bottom:.25rem}.pinned-message-subtitle .animated-super-row{font-size:var(--font-size-14);line-height:16px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pinned-message .animated-counter{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){opacity:0;transform:scale(.68)}.pinned-message .animated-super-row{--translateY:16px}.pinned-message .pinned-message-media{--translateY:32px}.pinned-message.hide~.tgico-pinlist,.pinned-message.is-many .pinned-message-close,.pinned-message.is-many.is-floating .pinned-message-close,.pinned-message.is-many:not(.is-floating) .pinned-message-pinlist,.pinned-message:not(.is-many) .pinned-message-pinlist,.pinned-message:not(.is-many)~.tgico-pinlist{display:none}.pinned-message-pinlist{order:2}.chat[data-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){max-width:210px;padding-right:1.75rem;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:var(--font-weight-bold)}.pinned-audio-subtitle{color:var(--secondary-text-color)}.pinned-audio-subtitle,.pinned-audio-title{font-size:var(--font-size-14);line-height:var(--line-height-14);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.pinned-audio-content{margin-left:.75rem}.pinned-audio-progress{--border-radius:0;--height:var(--progress-height);--translateY:.125rem;bottom:0;left:0;position:absolute;right:0;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 var(--transition-standard-out)}body.is-right-column-shown .pinned-audio-progress{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:active,html.no-touch .pinned-audio-progress:hover{--translateY:0}.pinned-audio-progress .progress-line__filled:after{display:none!important}.pinned-audio-progress .progress-line__seek{top:-1rem}.pinned-audio-progress-wrapper{bottom:0;height:.5rem;left:0;overflow:hidden;position:absolute;right:0}.pinned-audio-volume{align-items:center;height:2.5rem;position:relative;width:2.5rem}html.is-touch .pinned-audio-volume{display:none}.pinned-audio-volume-tunnel{bottom:-1rem;content:" ";left:0;position:absolute;right:0;top:100%}.pinned-audio-volume .player-volume__icon{cursor:pointer;display:flex}.pinned-audio-volume .progress-line-container{background-color:var(--surface-color);border-radius:10px;box-shadow:0 1px 5px 0 rgba(0,0,0,.15);margin-top:2.25rem;opacity:0;padding:.75rem 1rem;position:absolute;top:100%;transform:rotate(270deg);transition:opacity .2s ease-in-out,visibility 0s .2s;visibility:hidden;width:5rem}body.animation-level-0 .pinned-audio-volume .progress-line-container{transition:none!important}.pinned-audio-volume:active .progress-line-container,.pinned-audio-volume:hover .progress-line-container{opacity:1;transition:opacity .2s ease-in-out,visibility 0s 0s;visibility:visible}.markup-tooltip{background:var(--surface-color);border-radius:10px;bottom:0;display:flex;height:44px;justify-content:flex-start;left:0;opacity:0;overflow:hidden;position:fixed;right:0;top:0;transform:translateZ(0);transition:opacity var(--layer-transition),transform var(--layer-transition),width var(--layer-transition);width:252px;z-index:1}body.animation-level-0 .markup-tooltip{transition:none}.markup-tooltip-wrapper{align-items:center;display:flex;height:100%;justify-content:flex-start;left:0;max-width:100%;position:absolute;top:0;transform:translateX(0);transition:transform var(--layer-transition);width:672px}body.animation-level-0 .markup-tooltip-wrapper{transition:none}.markup-tooltip-tools{align-items:center;display:flex;flex:0 0 auto;justify-content:space-between;max-width:100%;padding:7px}.markup-tooltip-tools:first-child{width:252px}.markup-tooltip-tools:last-child{width:420px}.markup-tooltip-tools:last-child .markup-tooltip-delimiter{margin:0 .25rem}.markup-tooltip-delimiter{background-color:var(--border-color);height:25px;width:1px}.markup-tooltip .btn-icon{border-radius:8px!important;height:30px;padding:0;width:30px}.markup-tooltip .btn-icon.active{background-color:var(--primary-color)!important;color:#fff!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(-252px)}.markup-tooltip-link-apply{color:var(--primary-color);font-size:2rem}.markup-tooltip-link-apply-container{align-items:center;display:flex;opacity:0;pointer-events:none;transition:opacity var(--layer-transition)}body.animation-level-0 .markup-tooltip-link-apply-container{transition:none}.markup-tooltip .input-clear{flex:1 1 auto;margin:0 .5rem;text-overflow:ellipsis}.markup-tooltip .input-clear.is-valid+.markup-tooltip-link-apply-container{opacity:1;pointer-events:all}.stickers-helper>.scrollable{max-height:13.75rem;min-height:var(--esg-sticker-size);padding:.4375rem;position:relative}.stickers-helper-stickers{border-radius:var(--border-radius);max-width:100%}html.no-touch .stickers-helper .super-sticker:not(.active):active,html.no-touch .stickers-helper .super-sticker:not(.active):hover{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:after,.emoji-helper .super-emojis:before{content:" ";display:inline-block;width:.25rem}html.no-touch .emoji-helper .super-emoji:not(.active):active,html.no-touch .emoji-helper .super-emoji:not(.active):hover{background:none}.emoji-helper .super-emoji.active{background-color:var(--primary-color)!important}.inline-helper{-webkit-user-select:none;-moz-user-select:none;user-select:none}.inline-helper:not(.is-gallery){min-width:min(20rem,100%)}.inline-helper .scrollable{max-height:232px;position:relative}.inline-helper-separator{background-color:var(--border-color);height:1px;margin-left:4rem;width:100%}.inline-helper-separator:last-child{display:none}.inline-helper .btn-primary{border-radius:0;border-radius:initial}.inline-helper-results:not(.is-gallery){cursor:pointer}.inline-helper-results:not(.is-gallery) .inline-helper-result{height:4rem;line-height:var(--line-height);padding:.5rem .5rem .5rem 4rem}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview{height:3rem!important;left:.5rem;overflow:hidden;position:absolute;width:3rem!important}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview.empty{align-items:center;background-color:var(--primary-color);border-radius:.375rem;color:#fff;display:flex;font-size:1.75rem;justify-content:center;text-transform:uppercase}.inline-helper .media-container{border-radius:inherit}.inline-helper .media-photo,.inline-helper .media-poster,.inline-helper .media-video{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.inline-helper .gif{bottom:0;height:auto!important;left:0;position:absolute;right:0;top:0;width:auto!important}.inline-helper-results.is-gallery{grid-gap:1px;border-radius:var(--border-radius);grid-template-columns:repeat(auto-fill,minmax(var(--esg-sticker-size),1fr));max-width:100%}.inline-helper-results.is-gallery .inline-helper-result{height:auto!important;width:auto!important}.inline-helper-result{position:relative}.inline-helper-result-title{font-weight:var(--font-weight-bold);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.inline-helper-result-description{-webkit-line-clamp:2;-webkit-box-orient:vertical;color:var(--secondary-text-color);display:-webkit-box;font-size:.875rem;overflow:hidden;text-overflow:ellipsis;white-space:pre-wrap}.chat-search{left:0;position:absolute!important;right:0;top:0;z-index:2}.chat-search-footer{align-items:center;background-color:var(--surface-color);box-shadow:0 -1px 5px -1px rgba(0,0,0,.21);display:flex;flex:0 0 auto;height:46px;justify-content:space-between;overflow:hidden;padding:0 8px;width:100%}.chat-search-footer .chat-search-count{color:var(--secondary-text-color);margin-left:8px}.chat-search-count:empty,.chat-search-count:not(:empty)+.btn-icon,.chat-search-footer+.chat-input{display:none}.chat-search-controls{display:flex}.chat-search-results{background-color:var(--surface-color);height:100%;left:0;max-height:100%;opacity:0;overflow:hidden;position:absolute;top:0;transition:.2s ease;visibility:hidden;width:100%}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;align-items:center;bottom:var(--padding);display:flex;flex-direction:column;justify-content:center;left:var(--padding);position:absolute!important;right:var(--padding);top:var(--padding);-webkit-user-select:none;-moz-user-select:none;user-select:none;width:auto!important;z-index:3}.drops-container:not(.is-visible){display:none}.drops-container.is-visible{animation:fade-in-opacity .2s linear forwards}.drops-container.is-visible.backwards{animation:fade-in-backwards-opacity .2s linear forwards}.drop{--wrapper-padding:-4px;align-items:center;background-color:var(--surface-color);border-radius:12px;color:#a2acb4;display:flex;flex:1 1 auto;flex-direction:column;justify-content:center;max-width:100%;pointer-events:all;position:relative;transition:color .2s ease-in-out;width:100%}.drop-outline-wrapper{bottom:var(--wrapper-padding);left:var(--wrapper-padding);pointer-events:none;position:absolute;right:var(--wrapper-padding);top:var(--wrapper-padding)}.drop-outline-path{fill:none;stroke-dasharray:13.5,11;stroke:#a2acb4;stroke-width:2;stroke-linecap:round;stroke-dashoffset:0;transition:stroke .2s ease-in-out}.drop.is-dragover .drop-outline-path{stroke:var(--primary-color);animation:drop-outline-move .5s linear infinite}.drop-icon{font-size:6rem}.drop-header{font-size:1.25rem;font-weight:var(--font-weight-bold)}.drop-header:not(:last-child){margin-top:-10px}@media only screen and (max-height:670px){.drop-icon{font-size:0}.drop-header{margin-top:0}}.drop.is-dragover{color:var(--primary-color)}.drop+.drop{margin-top:10px}@keyframes drop-outline-move{0%{stroke-dashoffset:0}to{stroke-dashoffset:-24.5}}body.is-dragging .page-chats{pointer-events:none}.bot-commands{--border-radius-padding:24px;--offset:.5rem;animation:none!important;background-color:transparent!important;border-radius:12px 12px 0 0!important;bottom:calc(100% - var(--border-radius-padding));box-shadow:none;left:calc(var(--offset)*-1);max-height:20rem;max-width:none;overflow:hidden;padding:var(--offset) var(--offset) 0!important;pointer-events:none;position:absolute!important;right:calc(var(--offset)*-1);transition:none!important;visibility:visible!important;width:auto!important}body.animation-level-2 .bot-commands{display:flex!important}.bot-commands .scrollable{background-color:var(--surface-color);border-radius:inherit;box-shadow:0 1px 8px 1px rgba(0,0,0,.12);height:auto;max-height:207px!important;pointer-events:all}body.animation-level-2 .bot-commands .scrollable{opacity:0;transform:translateY(var(--height))}.bot-commands.is-visible.animating .scrollable{transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.bot-commands.is-visible:not(.backwards) .scrollable{opacity:1;transform:translateY(0)}.bot-commands-list{border-radius:inherit;height:var(--height);padding-bottom:0;width:100%}.bot-commands-list-element{align-items:flex-start;border-radius:0!important;flex-direction:column;justify-content:center;padding-left:3.375rem}.bot-commands-list-element-avatar{left:.75rem;position:absolute}.bot-commands-list-element-description,.bot-commands-list-element-name{font-size:.875rem;line-height:var(--line-height-14);margin-left:0}.crop .overlay::-moz-selection,.crop-component::-moz-selection{background:transparent}.crop .overlay::selection,.crop-component::selection{background:transparent}.crop-image,.crop-overlay-image{display:block;height:auto;-o-object-fit:contain;object-fit:contain;-o-object-position:center;object-position:center;width:auto}.crop-image{display:block;pointer-events:none;position:relative}.crop-component{background-color:#fff;margin:0 auto;overflow:hidden;position:relative;z-index:999}.crop-component>img{max-width:100%}.crop-overlay{border-radius:50%;box-sizing:content-box;overflow:hidden;position:absolute;z-index:999}.crop-overlay:active,html.no-touch .crop-overlay:hover{cursor:move}.crop-overlay-image{display:block;position:absolute}.crop-overlay-color{background-color:hsla(0,0%,100%,.7);border-radius:8px;height:100%;left:0;position:absolute;top:0;width:100%}.crop.is-forum .crop-overlay{border-radius:var(--avatar-border-radius-forum)}.sidebar-header{align-items:center;background-color:var(--surface-color);cursor:default;display:flex;flex:0 0 auto;justify-content:space-between;min-height:3.5rem;padding-left:1rem;padding-right:1rem;-webkit-user-select:none;-moz-user-select:none;user-select:none}.sidebar-header .btn-menu{overflow-y:overlay}@media only screen and (max-width:600px){.sidebar-header{padding-left:.5rem;padding-right:.5rem}}[dir=ltr] .sidebar-header__title{padding-left:1.5rem}[dir=rtl] .sidebar-header__title{padding-right:1.5rem}.sidebar-header__title{color:var(--primary-text-color);flex:1;font-size:1.25rem;font-weight:var(--font-weight-bold)}[dir=ltr] .sidebar-header .btn-icon+.btn-icon{margin-left:.5rem}[dir=rtl] .sidebar-header .btn-icon+.btn-icon{margin-right:.5rem}.sidebar-header-right{flex:0 0 auto}.scrollable-y-bordered .sidebar-header{position:relative}.scrollable-y-bordered .sidebar-header:after{background-color:var(--border-color);bottom:-1px;content:" ";height:1px;left:0;opacity:0;position:absolute;right:0;z-index:1}body.animation-level-2 .scrollable-y-bordered .sidebar-header:after{transition:opacity var(--transition-standard-in)}.scrollable-y-bordered:not(.scrolled-top) .sidebar-header:after{opacity:1}.sidebar-close-button{flex:0 0 auto;height:2.5rem;overflow:inherit!important;width:2.5rem}.sidebar-content{display:flex;flex:1 1 auto;height:100%;max-height:100%;overflow:hidden;position:relative;width:100%}.profile-avatars-container{cursor:pointer;padding-bottom:100%;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}html.no-touch .profile-avatars-container:active .profile-avatars-arrow,html.no-touch .profile-avatars-container:hover .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{display:flex;flex-wrap:nowrap;height:100%;position:absolute;transform:translateZ(-1px) scale(2);transform-origin:left top;transition:transform .2s ease-in-out;width:100%}.scrollable.no-parallax .profile-avatars-avatars{transform:translate(0)}.profile-avatars-avatars:before{bottom:0;content:" ";left:0;right:0;top:0}.profile-avatars-avatar{background-color:#000;display:flex;height:inherit;min-height:100%;min-width:100%;position:relative;width:inherit}.profile-avatars-avatar .avatar-photo{height:100%;-o-object-fit:cover;object-fit:cover;pointer-events:none;width:100%}.profile-avatars-gradient{background:linear-gradient(1turn,rgba(0,0,0,.3) 8.98%,transparent);bottom:0;height:80px;left:0;position:absolute;right:0}[dir=ltr] .profile-avatars-info{left:1.5rem}[dir=rtl] .profile-avatars-info{right:1.5rem}.profile-avatars-info{align-items:flex-start;bottom:0;bottom:.5625rem;display:flex;flex-direction:column;pointer-events:none;position:absolute}[dir=ltr] .profile-avatars-info .profile-name,[dir=ltr] .profile-avatars-info .profile-subtitle{text-align:left}[dir=rtl] .profile-avatars-info .profile-name,[dir=rtl] .profile-avatars-info .profile-subtitle{text-align:right}.profile-avatars-info .profile-name,.profile-avatars-info .profile-subtitle{color:#fff;margin:0}.profile-avatars-info .peer-typing-container{--color:#fff}.profile-avatars-info .premium-icon{color:#fff}.profile-avatars-info .verified-icon-background{fill:#fff}.profile-avatars-info .verified-icon-check{visibility:hidden}.profile-avatars-info .premium-icon,.profile-avatars-info .profile-subtitle,.profile-avatars-info .verified-icon{opacity:.7}.profile-avatars-info .online{color:inherit!important}.profile-avatars-tabs{display:flex;height:.125rem;left:.375rem;pointer-events:none;position:absolute;right:.375rem;top:.5rem}.profile-avatars-tab{background-color:#fff;border-radius:4px;flex:1 1 auto;height:inherit;margin:0 .125rem;opacity:.2;transition:opacity .2s ease-in-out}.profile-avatars-tab.active{opacity:.6}.profile-avatars-arrow{bottom:0;left:0;opacity:0;position:absolute;top:0;width:33.3333333333%}.profile-avatars-arrow:before{color:#fff;font-size:2.1875rem;left:.625rem;position:absolute;top:50%;transform:translateY(-50%)}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:active,html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:hover{opacity:1!important}.profile-avatars-arrow-next{left:auto;right:0}.profile-avatars-arrow-next:before{left:auto;right:.625rem}.profile-content{display:flex;flex:0 0 auto;flex-direction:column;position:relative;width:100%}.profile-content .sidebar-left-section{background-color:var(--surface-color);padding-bottom:.5rem;position:relative}.profile-content .sidebar-left-section .profile-subtitle .peer-typing-container{justify-content:center}.profile-content.search-empty .gradient-delimiter{display:none}@media only screen and (max-width:600px){.profile-button{border-radius:0}}[dir=ltr] .profile-change-avatar{right:1.25rem}[dir=rtl] .profile-change-avatar{left:1.25rem}.profile-change-avatar{--size:3.375rem;position:absolute!important;top:calc(var(--size)/-2);transform:none;transition:none!important}.profile-container>.scrollable{display:flex;flex-direction:column}.profile-name{align-items:flex-end;color:var(--primary-text-color);display:flex;font-size:var(--font-size-20);font-weight:var(--font-weight-bold);line-height:var(--line-height-20);margin:0 auto;max-width:21.25rem;overflow:hidden;text-align:center}.profile-name span.emoji{min-width:-moz-min-content;min-width:min-content;vertical-align:inherit}.profile-name .peer-title{overflow:hidden;text-overflow:ellipsis;word-break:break-word}.sidebar-left-section-content>.profile-name{justify-content:center}.profile-name .badge-fake{align-self:center}.profile-subtitle{align-items:center;color:var(--secondary-text-color);display:flex;font-size:.875rem;justify-content:center;margin-bottom:.875rem;margin-top:1px;text-align:center}@media only screen and (max-width:600px){.profile-subtitle{margin-top:3px}}.profile-subtitle .online{color:var(--primary-color)}.profile-avatar{display:block;margin:.5rem auto 10px}@media only screen and (max-width:600px){.profile-avatar{--size:100px;--multiplier:.54;margin:0 auto 10px}}.profile-avatar,.profile-name,.profile-subtitle{flex:0 0 auto}.menu-horizontal-scrollable{--scrollable-size:3rem;height:var(--scrollable-size)}.menu-horizontal-scrollable:after{border-bottom:1px solid var(--border-color);bottom:0;content:" ";height:1px;left:0;position:absolute;right:0;z-index:-1}.menu-horizontal-scrollable .menu-horizontal-div{border-bottom:none}.menu-horizontal-div{--size:var(--scrollable-size,3rem);--padding-horizontal:0px;border-bottom:1px solid var(--border-color);color:var(--secondary-text-color);display:flex;flex-direction:row;height:var(--size);justify-content:space-around;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:2}.menu-horizontal-div:not(.no-stripe):after,.menu-horizontal-div:not(.no-stripe):before{content:" ";flex:0 0 auto;width:var(--padding-horizontal)}.menu-horizontal-div:not(.no-stripe) .menu-horizontal-div-item{border-radius:10px 10px 0 0}.menu-horizontal-div-item{align-items:center;border-radius:0;cursor:pointer;display:flex;flex:1 1 auto;font-size:1rem;font-weight:var(--font-weight-bold);height:100%;justify-content:center;line-height:var(--line-height);padding:0 1rem;position:relative;text-align:center;transition:none!important}html.no-touch .menu-horizontal-div-item:active,html.no-touch .menu-horizontal-div-item:hover{background-color:var(--light-secondary-text-color)}.menu-horizontal-div-item.active{color:var(--primary-color)}.menu-horizontal-div-item.active i{opacity:1}.menu-horizontal-div-item.active .c-ripple__circle,html.no-touch .menu-horizontal-div-item.active:active,html.no-touch .menu-horizontal-div-item.active:hover{background-color:var(--light-primary-color)}.menu-horizontal-div-item.active .badge{background-color:var(--primary-color)}.menu-horizontal-div-item>span{align-items:center;display:inline-flex;overflow:visible;pointer-events:none;position:relative}.menu-horizontal-div i{background-color:var(--primary-color);border-radius:.1875rem .1875rem 0 0;bottom:-.8125rem;box-sizing:content-box;height:.1875rem;left:0;opacity:0;pointer-events:none;position:absolute;transform-origin:left;width:100%;z-index:1}.menu-horizontal-div i.animate{transition:transform var(--tabs-transition)}.tabs-container{display:grid;grid-template-columns:100%;grid-template-rows:100%;min-width:100%;width:100%}.tabs-container .tabs-tab{background-color:var(--background-color);display:none;flex-direction:column;grid-column-start:1;grid-row-start:1;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 var(--tabs-transition)}.tabs-container[data-animation=navigation].animating .tabs-tab{transition:transform var(--transition-standard-in),filter var(--transition-standard-in)}.tabs-container[data-animation=navigation].animating.backwards .tabs-tab{transition:transform var(--transition-standard-out),filter var(--transition-standard-out)}#column-left{flex:1 1 auto;flex-direction:column;max-width:420px;width:420px}@media only screen and (max-width:600px){#column-left{max-width:100%;width:100%}body:not(.is-left-column-shown) #column-left{filter:brightness(80%);transform:translate3d(-25vw,0,0)}}@media only screen and (min-width:601px){#column-left{overflow:visible}[dir=ltr] #column-left:after{right:-1px}[dir=rtl] #column-left:after{left:-1px}#column-left:after{background-color:var(--border-color);content:" ";display:block;height:100vh;position:absolute;top:0;width:1px;z-index:2}}@media only screen and (min-width:601px)and (max-width:925px){#column-left{display:flex;left:0;max-width:none;position:fixed;top:0;transform:translate3d(-5rem,0,0);transition:transform var(--layer-transition);width:26.5rem}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:418.75px}}#column-left .item-main .menu-horizontal-scrollable{background-color:var(--surface-color);position:relative;top:auto;z-index:1}@media only screen and (max-width:600px){#column-left .item-main .menu-horizontal-scrollable{box-shadow:0 1px 5px -1px rgba(0,0,0,.16)}}#column-left .item-main .menu-horizontal-scrollable .scrollable{position:relative}[dir=ltr] #column-left .item-main .menu-horizontal-scrollable .badge{margin-left:5px}[dir=rtl] #column-left .item-main .menu-horizontal-scrollable .badge{margin-right:5px}#column-left .item-main .menu-horizontal-scrollable:not(.hide)+#folders-container{height:calc(100% - var(--scrollable-size));position:relative}#column-left .item-main .menu-horizontal-scrollable:not(.hide)+#folders-container .scrollable{padding-top:.5rem}#column-left .item-main .menu-horizontal-scrollable:not(.hide)+#folders-container .dialogs-placeholder-canvas{top:.5rem}#column-left .item-main .menu-horizontal-div{--padding-horizontal:.6875rem;justify-content:flex-start;position:relative!important;z-index:0}@media only screen and (max-width:600px){#column-left .item-main .menu-horizontal-div{--padding-horizontal:.1875rem}}#column-left .item-main .menu-horizontal-div-item{flex:0 0 auto;min-width:3rem}#column-left .item-main .menu-horizontal-div__stripe{display:none}#column-left .folders-tabs-scrollable{flex:0 0 auto}#column-left .item-main{--offset-top:0;background-color:var(--surface-color)}[dir=ltr] #column-left .item-main .input-search .selector-user{left:6px}[dir=rtl] #column-left .item-main .input-search .selector-user{right:6px}[dir=ltr] #column-left .item-main .input-search .selector-user{margin-left:0}[dir=rtl] #column-left .item-main .input-search .selector-user{margin-right:0}#column-left .item-main .input-search .selector-user{height:30px;line-height:1.875rem;position:absolute!important;top:6px;z-index:1}[dir=ltr] #column-left .item-main .input-search.is-picked .input-search-input{padding-left:calc(var(--paddingLeft) + 12px - var(--border-width))}[dir=rtl] #column-left .item-main .input-search.is-picked .input-search-input{padding-right: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}[dir=ltr] #column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{left:38px}[dir=rtl] #column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{right:38px}[dir=ltr] #column-left .item-main .search-helper{margin-left:28px}[dir=rtl] #column-left .item-main .search-helper{margin-right:28px}#column-left .item-main .search-helper{display:flex}@media only screen and (max-width:600px){[dir=ltr] #column-left .item-main .search-helper{margin-left:20px}[dir=rtl] #column-left .item-main .search-helper{margin-right:20px}}#column-left .item-main .search-helper .selector-user{font-size:14px;margin-top:7px}html.no-touch #column-left .item-main .search-helper .selector-user:active,html.no-touch #column-left .item-main .search-helper .selector-user:hover{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{background-color:var(--surface-color);max-height:100%;position:relative}#column-left #chatlist-container.has-filters .connection-status-bottom{height:calc(100% + var(--offset-top)*-1)}#column-left #folders-container{flex:1 1 auto}#column-left #folders-container .scrollable-y{background-color:transparent;position:absolute}#column-left #folders-container .scrollable-y.active{display:block}#column-left .dialogs-placeholder-canvas{position:absolute;top:0;z-index:2}#column-left .sidebar-slider{height:100%}#column-left .sidebar-header__btn-container{align-items:center;display:flex;flex:0 0 auto;height:2.5rem;justify-content:center;position:relative;width:2.5rem}#column-left .sidebar-header__btn-container>.btn-icon{bottom:0;left:0;margin:0;opacity:0;position:absolute;right:0;top:0;visibility:hidden;z-index:4}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:-.25rem}}#column-left .sidebar-tools-button{width:100%}#column-left .sidebar-tools-button .btn-menu{max-height:calc(var(--vh)*100 - 3.75rem);min-width:260px}[dir=ltr] #column-left .sidebar-tools-button .btn-menu-item{padding-right:.375rem}[dir=rtl] #column-left .sidebar-tools-button .btn-menu-item{padding-left:.375rem}[dir=ltr] #column-left .archived-count{margin-left:.625rem}[dir=rtl] #column-left .archived-count{margin-right:.625rem}#column-left .archived-count{justify-self:flex-end}html[dir=ltr].is-mobile #column-left .archived-count{margin-right:.375rem}html[dir=rtl].is-mobile #column-left .archived-count{margin-left:.375rem}@media only screen and (max-width:600px){#column-left .archived-count{font-weight:var(--font-weight-bold)}}#column-left .archived-count:empty{display:none}#column-left .search-group-people .chatlist{display:flex;flex-direction:row;margin-top:-1px;padding:0 0 1px}#column-left .search-group-people .chatlist:after,#column-left .search-group-people .chatlist:before{content:"ย ";display:inline-block;flex:0 0 auto;width:.3125rem}#column-left .search-group-people .chatlist-chat{align-items:center;border-radius:10px;display:flex;flex:0 0 auto;flex-direction:column;height:6.125rem;justify-content:flex-end;max-width:4.875rem;padding:0!important;width:4.875rem}#column-left .search-group-people .dialog-subtitle,#column-left .search-group-people .dialog-title-details{display:none}#column-left .search-group-people .dialog-title{max-width:65px;padding-bottom:.75rem}#column-left .search-group-people .dialog-title .user-title{font-size:.75rem!important}#column-left .search-group-people .dialog-title .peer-title{font-weight:var(--font-weight-normal)!important}[dir=ltr] #column-left .search-group-people .dialog-avatar{left:auto!important}[dir=rtl] #column-left .search-group-people .dialog-avatar{right:auto!important}#column-left .search-group-people .dialog-avatar{top:.75rem!important}#column-left .search-group-people .search-group-scrollable{position:relative}@media only screen and (max-width:600px){[dir=ltr] #column-left .search-group-people .search-group-scrollable{margin-left:-7px}[dir=rtl] #column-left .search-group-people .search-group-scrollable{margin-right:-7px}#column-left .search-group-people .search-group-scrollable{margin-top:4px}}#column-left .search-group-people .search-group-scrollable>.scrollable{position:relative}#column-left .item-main .sidebar-content{justify-content:center}#column-left .item-main .sidebar-content .btn-menu{bottom:calc(100% + 10px)}#column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close,#column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled{visibility:visible!important}body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close,body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled{animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-width:600px){#column-left .item-main .sidebar-content .btn-corner{--size:54px;bottom:14px;position:fixed!important;right:14px;z-index:1}}#column-left .item-main .sidebar-content .btn-corner:not(.is-hidden){transform:translateZ(0)}#column-left .connection-status{flex:0 0 auto;overflow:hidden;padding:0 .5rem .5rem;width:100%}#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 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))}[dir=ltr] #column-left .connection-status-button{padding-left:4.5rem}[dir=rtl] #column-left .connection-status-button{padding-right:4.5rem}[dir=ltr] #column-left .connection-status-button{text-align:left}[dir=rtl] #column-left .connection-status-button{text-align:right}#column-left .connection-status-button{align-self:center;color:#2e3939;cursor:default;height:3.5rem;transform:translateY(-100%)}#column-left .connection-status-button .force-reconnect{color:inherit;cursor:pointer;text-decoration:underline}[dir=ltr] #column-left .connection-status-button .preloader-container{left:1rem}[dir=rtl] #column-left .connection-status-button .preloader-container{right:1rem}#column-left .connection-status-button .preloader-container{height:1.5rem;right:auto;width:1.5rem}#column-left .connection-status-button .preloader-container .preloader-path-new{stroke:#2e3939}#column-left .connection-status-bottom{--offset-top:0px;background-color:var(--surface-color);bottom:0;display:flex;flex-direction:column;height:100%;left:0;overflow:hidden;position:absolute;right:0;top:0;transform:translateY(var(--offset-top))}#column-left .input-wrapper{flex:0 0 auto;margin:.75rem 0;max-width:100%;padding:0 .75rem;width:420px}@media only screen and (max-width:600px){#column-left .input-wrapper{width:100%}}#search-container{display:flex;top:var(--offset-top)!important}#search-container .scrollable-y{flex:1 1 auto;position:relative}.edit-profile-container .sidebar-content,.new-channel-container .sidebar-content,.new-group-container .sidebar-content{flex-direction:column}.edit-profile-container .chatlist-container,.new-channel-container .chatlist-container,.new-group-container .chatlist-container{flex:1 1 auto}[dir=ltr] .edit-profile-container .caption,[dir=ltr] .new-channel-container .caption,[dir=ltr] .new-group-container .caption{margin-left:23px}[dir=rtl] .edit-profile-container .caption,[dir=rtl] .new-channel-container .caption,[dir=rtl] .new-group-container .caption{margin-right:23px}[dir=ltr] .edit-profile-container .caption,[dir=ltr] .new-channel-container .caption,[dir=ltr] .new-group-container .caption{padding-right:24px}[dir=rtl] .edit-profile-container .caption,[dir=rtl] .new-channel-container .caption,[dir=rtl] .new-group-container .caption{padding-left:24px}.edit-profile-container .caption,.new-channel-container .caption,.new-group-container .caption{color:var(--secondary-text-color);font-size:.875rem;margin-top:14px}.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}.settings-container .profile-avatars-container{height:15rem;padding-bottom: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;user-select:none}.chat-folders-container .sticker-container,.edit-folder-container .sticker-container,.people-nearby-container .sticker-container{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.chat-folders-container .caption,.edit-folder-container .caption,.people-nearby-container .caption{color:var(--secondary-text-color);font-size:var(--font-size-14);line-height:var(--line-height-14);margin:0 auto;max-width:20rem;text-align:center}.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}.edit-folder-container .caption{margin-bottom:18px}@media only screen and (max-width:600px){.edit-folder-container .input-wrapper{padding:0 16px;width:100%}}.edit-folder-container .sidebar-left-section{padding-bottom:0}.edit-folder-container .sidebar-left-section:last-child{padding-bottom:.5rem}.folder-categories .checkbox-field{position:absolute;right:1.125rem!important}.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}[dir=ltr] .included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-left:26px}[dir=rtl] .included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-right:26px}[dir=ltr] .included-chatlist-container .chatlist-chat{padding-right:3.5rem!important}[dir=rtl] .included-chatlist-container .chatlist-chat{padding-left:3.5rem!important}.search-group-recent .search-group__name{align-items:center;display:flex;justify-content:space-between}.search-group-recent .btn-icon{font-size:22px}@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:0 0 7px}}.sidebar-left-section{padding:.5rem 0 1rem}.sidebar-left-section.with-fake-delimiter{box-shadow:none;padding-top:0!important}.sidebar-left-section.with-fake-delimiter .gradient-delimiter{margin-bottom:.5rem}.sidebar-left-section.no-padding-top{padding-top:0!important}@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}[dir=ltr] .sidebar-left-section-content>.checkbox-field .checkbox-box{left:auto}[dir=rtl] .sidebar-left-section-content>.checkbox-field .checkbox-box{right:auto}@media only screen and (max-width:600px){.sidebar-left-section-content>.btn-primary,.sidebar-left-section-content>.checkbox-ripple{border-radius:0}}.sidebar-left-section-content.full-width{margin:0!important}.sidebar-left-section-content>.media-sticker-wrapper{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.sidebar-left-section-name{padding:1rem}@media only screen and (max-width:600px){.sidebar-left-section-name{font-size:.875rem;padding:.5rem 1rem}}.sidebar-left-section-caption{color:var(--secondary-text-color);font-size:1rem;line-height:var(--line-height);margin-top:1rem;padding:0 1rem}@media only screen and (max-width:600px){.sidebar-left-section-caption{font-size:.875rem;margin:.5rem}}.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{align-items:center;display:flex;height:3.5rem;padding:0 1.125rem}.sidebar-left-section-disabled{opacity:.25;pointer-events:none!important}.sidebar-left-section .chatlist{padding:0}.sidebar-left-h2{color:var(--primary-color);font-size:16px;font-weight:var(--font-weight-bold)}.general-settings-container{-webkit-user-select:none;-moz-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,#poll-results-container,#search-gifs-container,#search-private-container,#stickers-container,.add-members-container{background-color:var(--surface-color)!important}.chat-folders-container .btn-control{margin-bottom:1.5rem}.two-step-verification{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{margin-bottom:1.125rem;margin-left:auto;margin-right:auto;max-width:342px;text-align:center}.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{height:168px;margin:.625rem auto 1.1875rem;width:168px}.two-step-verification .input-wrapper .btn-primary:first-child:last-child{margin-top:.25rem}.two-step-verification-enter-password .media-sticker-wrapper{height:157px;margin:1.125rem auto 1.8125rem;width:157px}.two-step-verification-hint .media-sticker-wrapper{height:160px;margin:.5rem auto 2.25rem;width:160px}.two-step-verification-email .media-sticker-wrapper{height:160px;margin:.5625rem auto 2.1875rem;width:160px}.two-step-verification-set .media-sticker-wrapper{height:160px;margin:1rem auto 1.3125rem;width:160px}[dir=ltr] .two-step-verification-set .media-sticker-wrapper .rlottie,[dir=ltr] .two-step-verification-set .media-sticker-wrapper .rlottie-vector{left:.625rem}[dir=rtl] .two-step-verification-set .media-sticker-wrapper .rlottie,[dir=rtl] .two-step-verification-set .media-sticker-wrapper .rlottie-vector{right:.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-title:first-child{font-weight:var(--font-weight-bold)}.active-sessions-container .row-title-right{color:var(--secondary-text-color);font-size:var(--font-size-12);line-height:var(--line-height-12)}.active-sessions-container .row-midtitle,.active-sessions-container .row-subtitle{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.active-sessions-container .sidebar-left-section:first-child{padding-bottom:0}.active-sessions-container .sidebar-left-section:first-child .row-title{font-weight:var(--font-weight-bold)}@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:var(--primary-text-color)}.range-setting-selector-value{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:var(--primary-color)}.background-container .background-item:after{border:3px solid var(--primary-color);bottom:0;content:" ";display:block;left:0;opacity:0;position:absolute;right:0;top:0;transition:opacity .2s ease-in-out}.background-container .background-item.active:after{opacity:1}.background-container .background-item.active .grid-item-media{transform:scale(.91)}.background-container .background-item-media{transform:scale(1);transition:transform .2s ease-in-out}.background-container .background .preloader-container{z-index:1}.background-item{cursor:pointer}.background-item-media{border-radius:inherit}.background-item-media.is-pattern{background-color:#000;bottom:0;left:0;position:absolute;right:0;top:0}.background-item-media.is-pattern .media-photo{mix-blend-mode:soft-light}.background-item .media-photo{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.background-colors-canvas{border-radius:inherit;height:100%;-webkit-mask-position:center;-webkit-mask-size:cover;position:absolute;width:100%}.background-image-container .sidebar-left-section{padding-bottom:.5rem}.empty-placeholder{line-height:var(--line-height);margin:0 auto;padding:0 1rem;position:relative;text-align:center;top:40%;transform:translateY(-50%);-webkit-user-select:none;-moz-user-select:none;user-select:none;width:21rem!important}.empty-placeholder .media-sticker-wrapper{height:128px;margin:0 auto 1.9375rem;position:relative;width:128px}.empty-placeholder-header{font-size:1.25rem;font-weight:var(--font-weight-bold)}.empty-placeholder-subtitle{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}[dir=ltr] .empty-placeholder .btn-control:before{margin-right:.625rem}[dir=rtl] .empty-placeholder .btn-control:before{margin-left:.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}.is-forum-visible .can-have-forum .input-search,.is-forum-visible .can-have-forum .row-row,.is-forum-visible .can-have-forum .sidebar-header__title{opacity:0}.is-forum-visible .folders-tabs-scrollable{opacity:var(--disabled-opacity);pointer-events:none}.is-forum-visible.backwards .can-have-forum .input-search,.is-forum-visible.backwards .can-have-forum .row-row,.is-forum-visible.backwards .can-have-forum .sidebar-header__title,.is-forum-visible.backwards .folders-tabs-scrollable{opacity:1}.is-forum-visible.animating .can-have-forum .input-search,.is-forum-visible.animating .can-have-forum .row-row,.is-forum-visible.animating .can-have-forum .sidebar-header__title,.is-forum-visible.animating .folders-tabs-scrollable{transition:opacity var(--transition-standard-in)}.is-forum-visible.animating.backwards .can-have-forum .input-search,.is-forum-visible.animating.backwards .can-have-forum .row-row,.is-forum-visible.animating.backwards .can-have-forum .sidebar-header__title,.is-forum-visible.animating.backwards .folders-tabs-scrollable{transition:opacity var(--transition-standard-out)}#column-right{overflow:visible;overflow:initial;position:relative}@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)and (max-width:925px){body.is-right-column-shown:not(.is-left-column-shown) #column-right{transform:translateZ(0);transition:transform var(--transition-standard-in)}}@media only screen and (min-width:926px){body.is-right-column-shown #column-right{transform:translateZ(0);transition:transform var(--transition-standard-in)}}@media only screen and (min-width:601px){#column-right{position:absolute;right:0;transform:translate3d(var(--right-column-width),0,0);transition:transform var(--transition-standard-out);width:calc(var(--right-column-width));z-index:3}#column-right .sidebar-content{min-width:var(--right-column-width)}body.animation-level-0 #column-right{transition:none}}@media only screen and (min-width:1276px){#column-right{border-left:1px solid var(--border-color);transform:translate3d(calc(var(--right-column-width) + 1px),0,0);width:calc(var(--right-column-width) + 1px)}}#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{flex:1 1 auto;position:relative}#column-right .sidebar-search{display:none}#column-right .sidebar-search.active{display:flex}#column-right .input-wrapper{margin:.75rem 0;max-width:100%;padding:0 .75rem;width:100%}.shared-media-container .scrollable:not(.no-parallax){perspective:0;perspective-origin:0 0}.shared-media-container .scrollable:not(.no-parallax).parallax{perspective:1px}.shared-media-container .profile-content.is-me .profile-name{margin-bottom:.9375rem}.shared-media-container .profile-content.is-me .profile-subtitle{display:none}.shared-media-container .search-super{min-height:calc(var(--vh, 1vh)*100 - 56px);top:100%}.shared-media-container .search-super-tabs{--padding-horizontal:0}.shared-media-container .search-super-tabs .menu-horizontal-div-item{border-radius:0!important}.shared-media-container .sidebar-header .transition{flex-grow:1}.shared-media-container .sidebar-header .transition .transition-item{align-items:center;display:flex}.shared-media-container .btn-corner.menu-open:before{content:"๎คฉ"}@media only screen and (max-width:600px){.shared-media-container .btn-corner{bottom:14px;height:54px;position:fixed!important;right:14px;width:54px;z-index:1}}.shared-media-container.can-add-members .btn-corner:not(.is-hidden){transform:translateZ(0)}.search-super{background-color:var(--surface-color);display:flex;flex-direction:column;max-width:100%;min-height:100%;position:absolute;width:100%}.search-super .search-group__show-more{color:var(--primary-color);cursor:pointer;font-weight:400}.search-super .search-super-month-name{border-top:1px solid var(--border-color);color:var(--secondary-text-color);font-weight:var(--font-weight-bold);padding:24px 0 0 24px}@media only screen and (max-width:600px){.search-super .search-super-month-name{padding:18px 0 0 16px}}.search-super.sliding{max-height:none!important}.search-super-tabs{flex:1 1 auto;width:auto}.search-super-tabs-scrollable{background-color:var(--surface-color);box-shadow:none!important;position:sticky!important;top:0;z-index:2}.search-super-tabs-scrollable:before{background-color:inherit;content:" ";display:block;height:1px;left:0;position:absolute;top:0;width:100%;z-index:-1}.search-super.is-full-viewport .search-super-tabs-scrollable:before{top:-1px}.search-super-tabs-scrollable .scrollable{display:flex;position:relative}.search-super-tabs-container{flex:1 1 auto;grid-template-rows:100%;min-height:calc(100% - 49px)}.search-super-tabs-container>div{background-color:var(--surface-color)!important;min-height:150px;position:relative}.search-super-tabs-container>div>div:first-child{min-height:calc(100vh - 111px);transform:translateY(0)}.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 .audio-title,.search-super .document-name,.search-super .title{display:flex;justify-content:space-between}.search-super .sent-time{color:var(--secondary-text-color);flex:0 0 auto;font-size:12px;margin-left:8px;margin-top:3px}.search-super-content-media .search-super-month-name{border:none;padding:9px 0 7px 24px}.search-super-content-media .video-time{background-color:var(--message-time-background);border-radius:4px;color:#fff;font-size:12px;height:18px;left:5px;line-height:18px;padding:0 6px 0 5px;position:absolute;top:4px;z-index:2}.search-super-content-media .grid-item{overflow:hidden}.search-super-content-media .checkbox-field{right:.25rem;top:.25rem}.search-super .checkbox-box{box-shadow:0 0 3px 0 rgba(0,0,0,.4)}.search-super .checkbox-box-border{border-color:var(--message-checkbox-border-color)}.search-super .checkbox-box-background{background-color:var(--message-checkbox-color)}.search-super .checkbox-field{margin:0;position:absolute!important;z-index:2}.search-super-content-media .search-super-month-items{grid-gap:1px;display:grid;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr);padding-top:1px;width:100%}.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{--icon-size:3rem;--icon-margin:.75rem;height:calc(48px + 1.5rem)}.search-super-content-files .document-download,.search-super-content-files .document-ico{border-radius:5px!important}.search-super-content-files .document-name{font-weight:400;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.search-super-content-links .search-super-item{cursor:pointer;display:flex;flex-direction:column;justify-content:flex-start;min-height:4.375rem;overflow:hidden;padding-left:4.4375rem;position:relative}.search-super-content-links .row-media{border-radius:.375rem;height:3rem;left:.6875rem;overflow:hidden;position:absolute;width:3rem}.search-super-content-links .row-media.empty{align-items:center;background-color:var(--primary-color);color:#fff;display:flex;font-size:2rem;justify-content:center;text-transform:uppercase}.search-super-content-links a:not(:last-child){position:relative;z-index:2}.search-super-content-links .anchor-url:last-child{position:static}.search-super-content-links .anchor-url:last-child:before{bottom:0;content:" ";cursor:pointer;left:0;position:absolute;right:0;top:0;z-index:1}.search-super-content-links .media-photo{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.search-super-content-links .row-title{margin-top:.1875rem}.search-super-content-links .row-subtitle{overflow:hidden;text-overflow:ellipsis;white-space:pre-wrap;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{--offset-left:0!important;margin:2rem 0 0 -1.75rem!important;padding:0!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 0 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 0 12px}}.search-super-content-music .audio,.search-super-content-voice .audio{justify-content:normal;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-bottom:.5rem;padding-top:.5rem}.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{align-items:center;bottom:0;display:flex;justify-content:space-between;left:0;opacity:0;padding:0 1rem;position:absolute;right:0;top: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{color:var(--primary-text-color);flex-grow:1;font-weight:var(--font-weight-bold);margin-left:1.5rem;text-transform:capitalize;white-space:nowrap}#search-container .search-group.is-short .chatlist-chat:nth-child(n+4),#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-description:before,#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-time{display:none}#stickers-container .sticker-sets{display:flex;flex-direction:column;margin-top:16px}#stickers-container .sticker-set{cursor:pointer;display:flex;flex-direction:column;height:140px}#stickers-container .sticker-set-name{font-weight:var(--font-weight-bold)}#stickers-container .sticker-set-count{color:var(--secondary-text-color);font-size:14px}#stickers-container .sticker-set-header{display:flex;justify-content:space-between;padding-bottom:12px;padding-left:16px}#stickers-container .sticker-set-button{border-radius:16px;font-size:15px;font-weight:400;height:30px;margin-right:16px;padding-left:12px;padding-right:13px;transition:width .2s;width:auto}#stickers-container .sticker-set-button.gray{background:#f1f3f4;color:var(--secondary-text-color)}#stickers-container .sticker-set-stickers{display:flex;justify-content:space-around}#stickers-container .sticker-set-sticker{height:68px;position:relative;width:68px}#stickers-container .sticker-set-sticker:hover{background-color:var(--light-secondary-text-color);border-radius:12px}#stickers-container .sticker-set-sticker img{max-height:100%;max-width:100%}#poll-results-container .poll-results{display:flex;flex-direction:column;position:relative;width:100%}#poll-results-container .poll-results-answer{color:var(--secondary-text-color);display:flex;font-size:15px;font-weight:var(--font-weight-bold);justify-content:space-between;margin:0;padding:0 16px 8px;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (min-width:601px){#poll-results-container .poll-results-answer{padding:0 24px 8px}}#poll-results-container .poll-results-more{margin:0 .5rem;width:auto}@media only screen and (max-width:600px){#poll-results-container .poll-results-more{border-radius:0;margin:0}}#poll-results-container .poll-results h3{font-size:20px;margin-bottom:16px;margin-top:15px;padding:0 16px}@media only screen and (min-width:601px){#poll-results-container .poll-results h3{padding:0 24px}}#poll-results-container .poll-results hr{display:block!important;margin-bottom:15px;margin-top:7px}.edit-peer-container .input-wrapper{margin-bottom:.5625rem!important}.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!important}.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:var(--line-height)}.group-type-container .sidebar-left-section-caption{font-size:.875rem;margin-top:.8125rem}.group-type-container .input-wrapper{margin-top:.875rem!important}.media-viewer{align-items:center;background:rgba(0,0,0,.88);bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0}@media only screen and (max-width:600px){.media-viewer{background:#000}}.media-viewer-author{align-items:center;cursor:pointer;display:flex;height:100%}@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{font-weight:var(--font-weight-bold);line-height:var(--line-height);margin:.0625rem 0}@media only screen and (min-width:601px){.media-viewer-name{margin:.0625rem 0 .125rem}}.media-viewer-date{font-size:.875rem;line-height:var(--line-height)}.media-viewer-buttons{display:flex;flex-flow:row nowrap;padding:.5rem .75rem;position:absolute;right:0;top:0}.media-viewer-buttons .btn-icon{margin:0 .25rem;transition:var(--open-duration)}html.no-touch .media-viewer-buttons .btn-icon:active,html.no-touch .media-viewer-buttons .btn-icon:hover{color:#fff}@media only screen and (max-width:600px){.media-viewer-buttons{display:none}}.media-viewer-content{flex-direction:column;height:100%;justify-content:center}.media-viewer-container,.media-viewer-content{align-items:center;display:flex;max-height:100%;max-width:100%;overflow:hidden}.media-viewer-container{align-self:center;flex:1 1 auto;position:relative}.media-viewer-media{visibility:hidden}.media-viewer-caption{background-color:transparent;bottom:0;color:#fff;left:0;line-height:var(--line-height);opacity:0;overflow:hidden;padding:.5rem .5rem 0;position:absolute;right:0;text-align:center;text-overflow:ellipsis;white-space:pre-wrap;word-break:break-word;z-index:4}body.animation-level-2 .media-viewer-caption{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{height:6rem;margin:0 auto;max-height:6rem;max-width:50rem;padding:.5rem .875rem;position:relative}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{bottom:1.0625rem;text-align:inherit;transform:translateZ(0);width:100%}.media-viewer-caption .scrollable{height:auto;padding:0 .5rem}.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:active,html.no-touch .media-viewer-caption:hover{background-color:#000;opacity:1!important}}.media-viewer-caption.is-focused{background-color:#000;opacity:1!important}.media-viewer-switcher{cursor:pointer;height:calc(100% - 7.5rem);left:0;position:absolute;top:3.75rem;width:7rem}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-next-button,.media-viewer-prev-button{color:#fff;cursor:pointer;font-size:2rem;left:1rem;opacity:0;position:absolute;top:50%;transform:translateY(-50%) rotate(90deg);transition:var(--open-duration) opacity;z-index:5}@media only screen and (min-width:601px){.media-viewer-next-button,.media-viewer-prev-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{align-items:center;border-radius:0;display:flex;justify-content:center;left:0;min-height:auto!important;overflow:hidden;position:fixed!important;top:0;transform:translateZ(0) scaleX(1);transform-origin:top left}.media-viewer-mover:not(.center){-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}@media only screen and (max-width:600px){.media-viewer-mover{overflow:visible}}.media-viewer-mover .ckin__player{height:100%;left:0;position:absolute;top:0;width:100%}.media-viewer-mover>svg{height:100%;width:100%}.media-viewer-mover .canvas-thumbnail,.media-viewer-mover img,.media-viewer-mover video{height:100%;max-height:100%;max-width:100%;-o-object-fit:cover;object-fit:cover;opacity:1;position:absolute;transition:var(--open-duration) opacity;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.media-viewer-mover svg img,.media-viewer-mover svg video{position:static}.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;max-height:calc(var(--vh, 1vh)*100 - 15rem);max-width:100vw;top:50%!important;transform:translate3d(-50%,-50%,0)!important}@media only screen and (max-width:600px){.media-viewer-mover.center{height:100%!important;max-height:calc(var(--vh, 1vh)*100 - 120px);max-width:100vw!important;width:100%!important}.media-viewer-mover.center .ckin__player:not(.ckin__fullscreen) .default__controls{bottom:-62px}}.media-viewer-mover.center .canvas-thumbnail,.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{-o-object-fit:contain;object-fit:contain;width:auto}.media-viewer-mover.hiding .canvas-thumbnail,.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{align-items:center;display:flex;height:3.5rem;justify-content:space-between;left:0;padding:0 1.25rem;position:absolute;right:0;top:0;z-index:5}.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:active,html.no-touch .media-viewer-topbar .btn-icon:hover,html.no-touch .media-viewer-topbar .media-viewer-author:active,html.no-touch .media-viewer-topbar .media-viewer-author:hover{opacity:1}.media-viewer-topbar-left{align-items:center;display:flex}@media only screen and (max-width:600px){.media-viewer-topbar{padding:0 .5rem}}.media-viewer-aspecter{align-items:center;border-radius:0;display:flex;height:100%;justify-content:center;position:absolute;transform:scaleX(1);width:100%}.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;display:block;height:100%;left:0;position:fixed!important;top:0;transition:visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}body.animation-level-0 .media-viewer-whole{--open-duration:0s;--move-duration:0s}.media-viewer-whole.active{transition-delay:0s;visibility:visible}.media-viewer-whole.active .media-viewer-appear,.media-viewer-whole.active .overlays{opacity:1;visibility:visible}body.animation-level-2 .media-viewer-whole.active .media-viewer-appear,body.animation-level-2 .media-viewer-whole.active .overlays{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:not(.playback-rate){color:hsla(0,0%,100%,.4);opacity:1}.media-viewer-whole .btn-menu-toggle:not(.playback-rate).menu-open{background-color:hsla(207,4%,46%,.2)!important;color:#fff}.media-viewer-whole.hide-caption .media-viewer-caption{opacity:0!important;pointer-events:none}}.media-viewer-whole.is-zooming .media-viewer-caption,.media-viewer-whole.is-zooming .media-viewer-switcher .tgico-down{opacity:0!important;pointer-events:none}.media-viewer-whole.highlight-switchers .media-viewer-switcher>span{opacity:1}.media-viewer-whole.no-forwards .canvas-thumbnail,.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;user-select:none}.media-viewer-movers{bottom:0;left:0;position:absolute;right:0;top:0;transform:translate3d(1,1,0) scale(1);transform-origin:0 0;will-change:transform;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{align-items:center;background-color:rgba(0,0,0,.4);border-radius:12px;bottom:1.25rem;display:flex;height:3.375rem;justify-content:space-between;left:50%;opacity:1;padding:.5rem;position:absolute;transform:translateX(-50%);width:17.125rem;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{opacity:.4;pointer-events:none}.zoom-container .progress-line{--color:#fff;--height:2px;flex:1 1 auto;margin:0 1px}.zoom-container .progress-line:before{opacity:1}.media-viewer-whole:not(.active) .zoom-container,.zoom-container:not(.is-visible){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{background-color:rgba(0,0,0,.2);height:100%;left:0;opacity:0;position:fixed!important;top:0;transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}.emoji-dropdown{background:var(--surface-color);display:flex;flex:1 1 auto;flex-direction:column;height:min(282px,calc(var(--vh)*100 - 135px));max-height:100%;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:var(--esg-width)}@media only screen and (min-height:570px)and (min-width:601px){.emoji-dropdown{-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:var(--menu-background-color);border-radius:1.25rem;bottom:5.125rem;box-shadow:0 5px 10px 5px rgba(16,35,47,.14);height:26.25rem;left:.8125rem;max-height:26.25rem;opacity:0;position:absolute!important;transform:scale(0);transform-origin:0 100%;transition:transform var(--esg-transition),opacity var(--esg-transition);z-index:3}.emoji-dropdown.active{opacity:1;transform:scale(1)}body.animation-level-0 .emoji-dropdown{transition:none}}.emoji-dropdown .emoji-container{height:100%;max-width:100%;overflow:hidden;width:100%}.emoji-dropdown .emoji-tabs{border:none;border-top:1px solid var(--border-color);justify-content:center}.emoji-dropdown .emoji-tabs:after{content:none}.emoji-dropdown .emoji-tabs-search{left:0;margin-left:.5rem!important;position:absolute}.emoji-dropdown .emoji-tabs-delete{margin-right:.5rem!important;position:absolute;right:0}.emoji-dropdown .emoji-tabs .menu-horizontal-div-item{margin:0 .75rem}.emoji-dropdown .tabs-container{height:100%}.emoji-dropdown .stickers-padding .category-items{gap:.25rem;padding:0 .1875rem}.emoji-dropdown #content-gifs .scrollable-y{padding:0 .1875rem}.emoji-dropdown .gifs-masonry{border-radius:10px;overflow:hidden}.emoticons-container{background-color:transparent;flex-direction:column;height:100%;min-height:100%}.emoticons-menu{--item-size:1.875rem;align-items:center;min-height:3.0625rem;padding:0 .3125rem;width:100%;z-index:4}.emoticons-menu,.emoticons-menu-wrapper{background-color:transparent;height:3.0625rem}.emoticons-menu-wrapper{border-bottom:1px solid var(--border-color);max-width:100%;padding:0;position:relative}.emoticons-menu:after{content:" ";display:block;flex:0 0 auto;height:1px;width:.1875rem}.emoticons-menu .menu-horizontal-div-item{align-items:center;display:flex;flex:0 0 auto;font-size:1.5rem;height:var(--item-size);line-height:var(--item-size);margin:0 .3125rem;padding:0;width:var(--item-size)}.emoticons-menu .menu-horizontal-div-item.not-local{--item-size:2.375rem;border-radius:.25rem!important;padding:.25rem}.emoticons-menu .menu-horizontal-div-item.active{background-color:rgba(var(--primary-text-color-rgb),.06)!important}.emoticons-menu .menu-horizontal-div-item.active,html.no-touch .emoticons-menu .menu-horizontal-div-item:active,html.no-touch .emoticons-menu .menu-horizontal-div-item:hover{color:rgba(var(--primary-text-color-rgb),.8)!important}.emoticons-menu .menu-horizontal-div-item-padding{height:100%;position:relative;width:100%}.emoticons-menu .menu-horizontal-div-item.active:not(.tgico){background-color:var(--light-secondary-text-color)}.emoticons-menu .menu-horizontal-inner{border-radius:15px;flex:0 0 auto;margin:0 .3125rem;overflow:hidden;width:1.875rem}html.is-safari .emoticons-menu .menu-horizontal-inner{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}body.animation-level-2 .emoticons-menu .menu-horizontal-inner{transition:width .2s ease-in-out}.emoticons-menu .menu-horizontal-inner-scroll{align-items:center;display:flex;height:100%;position:relative;width:8.5rem}.emoticons-menu .menu-horizontal-inner .menu-horizontal-div-item{margin:0!important;transform:scale(1)}body.animation-level-2 .emoticons-menu .menu-horizontal-inner .menu-horizontal-div-item{transition:transform .2s ease-in-out!important}.emoticons-menu .menu-horizontal-inner.active{background-color:rgba(var(--primary-text-color-rgb),.06)!important;width:8.5rem}.emoticons-menu .menu-horizontal-inner.active .menu-horizontal-div-item{transform:scale(.8)}.emoticons-menu .menu-horizontal-inner.active .menu-horizontal-div-item.active{background-color:transparent!important}.emoticons-menu .menu-horizontal-inner:not(.active){cursor:pointer}.emoticons-menu .menu-horizontal-inner:not(.active) .menu-horizontal-inner-scroll{pointer-events:none}.emoticons-menu .menu-horizontal-inner:not(.active) .menu-horizontal-div-item:first-child{pointer-events:all}.emoticons-content{flex:1;padding:0;position:relative}.emoticons-content .emoji-category{position:relative}.emoticons-content .sticky_sentinel--top{height:1px;top:0}.emoticons-content .category-title{color:rgba(var(--primary-text-color-rgb),.42);cursor:pointer;font-size:var(--font-size-16);font-weight:var(--font-weight-bold);line-height:1.1875rem;padding:.75rem .875rem .375rem;position:relative;text-align:center;width:100%}.emoticons-content .category-title .btn-icon{font-size:1.25rem;pointer-events:all;position:absolute;right:.5rem;top:50%;transform:translateY(-50%);z-index:1}.emoticons-content:not(.has-premium) .is-premium-set .category-title:before{content:"๎ฆ–";line-height:inherit;margin-right:.125rem;vertical-align:middle}.emoji-padding .super-emojis{padding:0 .5rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar{height:0;opacity:0;width:0;width:.375rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar-thumb{height:0;width: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{display:none;height:0;width:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-corner{background-color:transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover{scrollbar-color:var(--scrollbar-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{-webkit-backdrop-filter:blur(100);backdrop-filter:blur(100);background-color:var(--scrollbar-color);border-radius:10px;max-height:12.5rem;min-height:5rem;opacity:1}.no-scrollbar::-webkit-scrollbar,.scrollable-x::-webkit-scrollbar{display:none}.scrollable{-webkit-overflow-scrolling:touch;bottom:0;height:100%;left:0;max-height:100%;overflow-x:hidden;overflow-y:hidden;position:absolute;right:0;top:0;width:100%}.scrollable.scrollable-x{-ms-overflow-style:none;overflow-x:auto;scrollbar-width:none}.scrollable.scrollable-y{-ms-overflow-style:none;overflow-y:auto;overflow-y:overlay;scrollbar-color:transparent transparent;scrollbar-width:thin;transform:translateZ(0)}.scrollable.scrollable-y.scrollable-y-bordered{border-bottom:1px solid transparent;border-top:1px solid transparent}body.animation-level-2 .scrollable.scrollable-y.scrollable-y-bordered{transition:border-top-color var(--transition-standard-in),border-bottom-color var(--transition-standard-in)}.scrollable.scrollable-y.scrollable-y-bordered:not(.scrolled-top){border-top-color:var(--border-color)}.scrollable.scrollable-y.scrollable-y-bordered:not(.scrolled-bottom){border-bottom-color:var(--border-color)}.scrollable-padding{height:100%;min-width:100%}@keyframes scaleIn{0%{transform:scale(.2)}to{transform:scale(1)}}.selector{display:flex;flex-direction:column;height:100%;width:100%}.selector .selector-search-section{margin-bottom:0!important;padding:0!important;position:relative;z-index:1}.selector-search-container{flex:0 0 auto;max-height:132px;overflow:hidden;position:relative}.selector-search-container .scrollable{max-height:inherit;position:relative}.selector-search{display:flex;flex-flow:wrap;padding-left:1rem;padding-right:1rem;position:relative}.selector-search-input{border:none;flex:1 1 auto;outline:none}.selector-search .selector-search-input{padding:7px 0 19px}[dir=ltr] .selector-user{padding-right:17px}[dir=rtl] .selector-user{padding-left:17px}[dir=ltr] .selector-user{margin-left:-.25rem;margin-right:.75rem}[dir=rtl] .selector-user{margin-left:.75rem;margin-right:-.25rem}.selector-user{background-color:var(--light-secondary-text-color);border-radius:1.5rem;color:var(--primary-text-color);flex:0 0 auto;font-size:1rem;height:2rem;line-height:2rem;margin-bottom:7px;max-width:11.25rem;overflow:hidden;text-overflow:ellipsis;transition:opacity .2s,transform .2s,background-color .2s;-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap}body.animation-level-0 .selector-user{transition:none}html.no-touch .selector-user:active,html.no-touch .selector-user:hover{background-color:var(--light-danger-color);cursor:pointer}html.no-touch .selector-user:active .selector-user-avatar:after,html.no-touch .selector-user:hover .selector-user-avatar:after{opacity:1;transform:scaleX(-1) rotate(-90deg)}body:not(.animation-level-0) .selector-user.scale-in{animation:scaleIn .15s ease forwards}body:not(.animation-level-0) .selector-user.scale-out{animation:scaleIn .1s ease forwards;animation-direction:reverse}[dir=ltr] .selector-user-avatar{margin-right:8px}[dir=rtl] .selector-user-avatar{margin-left:8px}.selector-user-avatar{border-radius:50%!important;float:left;overflow:hidden;position:relative}.is-rtl .selector-user-avatar{float:right}html.is-safari .selector-user-avatar{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}[dir=ltr] .selector-user-avatar:after{left:0}[dir=rtl] .selector-user-avatar:after{right:0}.selector-user-avatar:after{background-color:var(--danger-color);content:"๎คฉ";font-size:23px;height:100%;line-height:32px!important;opacity:0;position:absolute;top:0;transform:scaleX(-1) rotate(0deg);transition:opacity .2s,transform .2s;width:100%;z-index:2}body.animation-level-0 .selector-user-avatar:after{transition:none}.selector .chatlist-container{flex:1 1 auto;height:100%}.selector>hr{margin:0;padding:0}[dir=ltr] .selector .checkbox{padding-left:11px}[dir=rtl] .selector .checkbox{padding-right:11px}.selector .checkbox{margin-top:11px}.selector .checkbox-field{--offset-left:0!important;margin:0!important;padding:0!important;pointer-events:none;position:absolute!important;top:50%;transform:translateY(-50%);z-index:1}[dir=ltr] .selector .checkbox-field:first-child{margin-left:.6875rem;margin-right:1.6875rem}[dir=rtl] .selector .checkbox-field:first-child{margin-left:1.6875rem;margin-right:.6875rem}[dir=ltr] .selector .checkbox-field-round{right:1.125rem}[dir=rtl] .selector .checkbox-field-round{left:1.125rem}.selector .checkbox-field-round{--size:1.25rem}.selector .checkbox-field-round .checkbox-box-border{z-index:auto}.selector .checkbox-field-round .checkbox-box-check{--offset:6px}[dir=ltr] .selector-square .checkbox-field{left:1.25rem!important}[dir=rtl] .selector-square .checkbox-field{right:1.25rem!important}[dir=ltr] .selector-square .chatlist-chat.row-with-padding{padding-left:7.5rem!important}[dir=rtl] .selector-square .chatlist-chat.row-with-padding{padding-right:7.5rem!important}[dir=ltr] .selector-square .dialog-avatar{margin-left:3rem!important}[dir=rtl] .selector-square .dialog-avatar{margin-right:3rem!important}.gifs-masonry{grid-gap:.125rem;display:grid;gap:.125rem;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr)}.gifs-masonry .gif img,.gifs-masonry .gif video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.gifs-masonry .gif img{left:0;position:absolute;top:0}.gifs-masonry .preloader-container{z-index:2}.preloader-circular{animation:rotate 1s linear infinite;bottom:0;height:100%;left:0;margin:auto;position:absolute;right:0;top:0;transform-origin:center center}.preloader-path{stroke-dasharray:93.6375,124.85;stroke-dashoffset:0;stroke-linecap:round;stroke:#fff;stroke-width:3}.preloader-container{bottom:0;cursor:pointer;display:flex;height:54px;left:0;margin:auto;opacity:0;overflow:hidden;position:absolute;right:0;top:0;transform:scale(0);width:54px}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{height:100%;width:100%}.preloader-container .preloader-circular{animation:none;background-color:rgba(0,0,0,.3);border-radius:50%;height:100%;width: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.animating .you-spin-me-round,body.animation-level-2 .preloader-container.is-visible:not(.manual) .you-spin-me-round{animation:rotate 2s linear infinite}body.animation-level-2 .preloader-container.is-visible.animating .preloader-path-new,body.animation-level-2 .preloader-container.is-visible:not(.manual) .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{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{bottom:0;color:var(--color);height:56%;left:0;margin:auto;opacity:1;position:absolute;right:0;top:0;width:56%}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:active,html.no-touch .preloader-container .preloader-close:hover,html.no-touch .preloader-container .preloader-download:active,html.no-touch .preloader-container .preloader-download:hover{background:none}.preloader-container.manual .preloader-close,.preloader-container:not(.manual) .preloader-download{opacity:0}.preloader-container.manual .preloader-path-new{stroke-width:0}.preloader-container .preloader-download{height:1.5rem;width: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{background-color:var(--color);border-radius:.125rem;content:"";height:.8125rem;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:.8125rem}.preloader-container.preloader-transparent .preloader-circular{background-color:transparent}.preloader-container.preloader-bold .preloader-path-new{stroke-width:3.5}@keyframes rotate{to{transform:rotate(1turn)}}@keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}to{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-237%}}.rp{position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.btn-corner.rp .c-ripple,.btn-menu-toggle.rp .c-ripple,.menu-horizontal-div-item.rp .c-ripple,.pinned-container-wrapper.rp .c-ripple,.rp-overflow .c-ripple{border-radius:inherit;height:100%;overflow:hidden;width:100%}.btn-corner.rp .c-ripple__circle,.btn-menu-toggle.rp .c-ripple__circle,.menu-horizontal-div-item.rp .c-ripple__circle,.pinned-container-wrapper.rp .c-ripple__circle,.rp-overflow .c-ripple__circle{overflow:hidden}.c-ripple{--ripple-duration:.7s;bottom:0;left:0;position:absolute;right:0;top:0}html.is-safari .c-ripple:not(:empty){border-radius:inherit;-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.c-ripple__circle{animation:ripple-effect .7s forwards;background-color:var(--ripple-color);border-radius:50%;display:block;pointer-events:none;position:absolute;transform:scale(0);transition:opacity .35s,background-color .35s}.c-ripple__circle.hiding,.c-ripple__square.hiding{opacity:0}@media only screen and (max-width:925px){.c-ripple{--ripple-duration:.4s}.c-ripple__circle{animation-duration:.4s;animation-name:ripple-effect-handhelds;transition-duration:.3s}}@keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@keyframes ripple-effect-handhelds{0%{transform:scale(.27)}to{transform:scale(2)}}.avatar-like{--size:54px;--multiplier:1;color:#fff;font-size:calc(1.25rem/var(--multiplier));font-weight:var(--font-weight-bold);height:var(--size);line-height:var(--size)!important;text-align:center;text-transform:uppercase;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:var(--size)}avatar-element{--color-top:var(--avatar-color-top);--color-bottom:var(--avatar-color-bottom);background:linear-gradient(var(--color-top),var(--color-bottom));border-radius:50%}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(30px/var(--multiplier))!important}avatar-element.tgico-reply_filled:before{font-size:calc(28px/var(--multiplier))!important}avatar-element.tgico-deletedaccount{--color-top:var(--peer-avatar-archive-top);--color-bottom:var(--peer-avatar-archive-bottom);overflow:hidden}avatar-element.tgico-deletedaccount:before{font-size:calc(30px/var(--multiplier))}avatar-element:before{line-height:inherit!important}avatar-element.media-container{position:relative}avatar-element img{border-radius:inherit!important;display:block;height:var(--size)!important;width:var(--size)!important}avatar-element img.fade-in{animation:fade-in-opacity .2s ease forwards}avatar-element img.emoji{height:calc(1.125rem/var(--multiplier))!important;vertical-align:middle!important;width:calc(1.125rem/var(--multiplier))!important}avatar-element.is-forum{border-radius:var(--avatar-border-radius-forum)}avatar-element.is-topic{background:none;border-radius:0;position:relative}avatar-element.is-topic .topic-icon{--size:inherit}avatar-element.is-online{position:relative}avatar-element.is-online:after{background-color:var(--avatar-online-color);border:2px solid var(--surface-color);border-radius:50%;content:" ";display:block;height:14px;left:2.4375rem;position:absolute;top:2.4375rem;width:14px}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-36{--size:36px;--multiplier:1.5}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.6875}avatar-element.avatar-26{--size:26px;--multiplier:2.076923}avatar-element.avatar-24{--size:24px;--multiplier:2.25}avatar-element.avatar-22{--size:22px;--multiplier:2.454545}avatar-element.avatar-18{--size:18px;--multiplier:3}avatar-element.avatar-16{--size:16px;--multiplier:3.375}.avatar-relative .avatar-photo{left:0;position:absolute;top:0}.avatar-full{align-items:center;border-radius:inherit;display:inline-flex;height:100%;justify-content:center;position:absolute;width:100%}.avatar-full .avatar-photo{height:100%!important;-o-object-fit:cover;object-fit:cover;width:100%!important}.document{--background-color:var(--primary-color);height:70px}.document .media-photo{border-radius:inherit}.document .media-photo.thumbnail{left:0}.document-ico{background-color:var(--background-color);border-radius:.375rem;line-height:1;text-align:center}html.is-safari .document-ico{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.document-ico-text{opacity:0}body.animation-level-2 .document-ico-text{transition:opacity .2s ease-in-out}.document:not(.document-with-thumb) .document-ico{padding:1.5625rem .25rem 0}@media only screen and (max-width:600px){.document:not(.document-with-thumb) .document-ico{font-size:14px;padding:1.5rem 0 0}.document:not(.document-with-thumb) .document-ico:after{--size:.875rem}}.document-ico:after{--size:1.125rem;border-bottom-color:rgba(0,0,0,.25);border-bottom-left-radius:.25rem;border-left-color:rgba(0,0,0,.25);border-right-color:var(--message-background-color);border-style:solid;border-top-color:var(--message-background-color);border-width:calc(var(--size)/2);content:"";display:block;position:absolute;right:0;top:0}body.animation-level-2 .document-ico:after{transition:border-width .2s ease-in-out}html.no-touch .document:not(.downloaded):active .document-ico:after,html.no-touch .document:not(.downloaded):hover .document-ico:after{border-width:0}html.no-touch .document:not(.downloaded):active .document-ico-text,html.no-touch .document:not(.downloaded):hover .document-ico-text{opacity:0}html.no-touch .document:not(.downloaded):active .preloader-container,html.no-touch .document:not(.downloaded):hover .preloader-container{opacity:1!important}.document:not(.downloading) .document-ico-text{opacity:1}.document:not(.downloading) .preloader-container{opacity:0!important}.document.downloading .document-ico:after{border-width:0}.document-ico{background-size:contain;font-size:1.125rem}.document-ico,.document-name,.document-size{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.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,.2);border-radius:.375rem}.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{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.document-name{font-size:var(--font-size-16);font-weight:var(--font-weight-bold);line-height:var(--line-height-16);white-space:nowrap}.document-size{color:var(--secondary-text-color);font-size:var(--font-size-14);line-height:var(--line-height-14);pointer-events:none;position:relative}.document .preloader-container{height:2.5rem;width:2.5rem}@media only screen and (max-width:600px){.document .preloader-container{height:1.625rem;width:1.625rem}}.document .preloader-circular{background-color:transparent!important}.document .preloader-path-new{stroke-width:2.5}[dir=ltr] .audio,[dir=ltr] .document{padding-left:var(--padding-left)}[dir=rtl] .audio,[dir=rtl] .document{padding-right:var(--padding-left)}.audio,.document{--padding:0px;--icon-size:3.375rem;--icon-margin:.875rem;--padding-left:calc(var(--icon-size) + var(--icon-margin) + var(--padding));cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding:var(--padding);-webkit-user-select:none;-moz-user-select:none;user-select:none}[dir=ltr] .audio-download,[dir=ltr] .audio-ico,[dir=ltr] .document-download,[dir=ltr] .document-ico{margin-left:calc((var(--padding-left) - var(--padding))*-1)}[dir=rtl] .audio-download,[dir=rtl] .audio-ico,[dir=rtl] .document-download,[dir=rtl] .document-ico{margin-right:calc((var(--padding-left) - var(--padding))*-1)}.audio-download,.audio-ico,.document-download,.document-ico{color:#fff;height:var(--icon-size);position:absolute;width:var(--icon-size)}.audio-download,.document-download{align-items:center;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;opacity:1;transition:opacity .2s ease-in-out;z-index:1}.audio-download.downloaded,.document-download.downloaded{opacity:0}.audio-description,.document-description{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio:not(.corner-download) .preloader-container:not(.preloader-streamable),.document:not(.corner-download) .preloader-container:not(.preloader-streamable){transform:scale(1)!important}.audio .checkbox-field-round,.document .checkbox-field-round{--margin-top:.25rem;--margin-left:.125rem;left:auto;margin-left:calc(var(--padding-left)*-1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto}.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){height:100%;width:100%}.audio{--icon-size:3rem;--icon-margin:.5625rem;height:var(--icon-size);overflow:visible!important}.audio-download,.audio-toggle{align-items:center;background-color:var(--primary-color);border-radius:50%}.audio.corner-download .audio-download{background:none;display:flex!important;height:1.375rem;left:57.5%;margin:0!important;top:57.5%;width:1.375rem}.audio.corner-download .preloader-container{background-color:var(--primary-color);border-radius:inherit}.audio.corner-download .preloader-path-new{stroke-width:.25rem}.audio-play-icon{border-radius:inherit;bottom:0;left:0;max-height:100%;max-width:100%;overflow:hidden;position:absolute;right:0;top:0;transform:rotate(-119deg)}body.animation-level-2 .audio-play-icon{transition:transform .25s ease-in-out}.audio-toggle .part{background-color:#fff;left:50%;position:absolute;top: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:100%}.audio-waveform-background rect{opacity:.3}html.no-touch .audio-waveform-background rect:active,html.no-touch .audio-waveform-background rect:hover{opacity:1}.audio-waveform-fake{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0;width:0}.audio-waveform-container{height:23px;margin-top:1px;position:relative}.audio-waveform rect{fill:var(--primary-color)}.audio .audio-details{margin-bottom:0;margin-top:3px}.audio .audio-title{margin-bottom:-2px}.audio .part{height:112px!important;width:112px!important}@media only screen and (max-width:600px){.audio .part{height:100px!important;width:100px!important}}.audio-title{color:var(--primary-text-color);font-size:1rem}.audio-description:not(:empty):before{content:" โ€ข "}.audio-subtitle,.audio-time{color:var(--secondary-text-color);display:flex;font-size:.875rem}@media only screen and (max-width:600px){.audio-subtitle,.audio-time{font-size:.75rem}}.audio-subtitle,.audio-time,.audio-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio-subtitle{align-items:center}.audio-subtitle .audio-time{flex:0 0 auto;margin-right:.25rem}.audio-subtitle,.audio-title{margin-left:-1px}.audio-title,.audio:not(.audio-show-progress) .audio-subtitle{max-width:100%}.audio.is-voice .audio-time{align-items:center;line-height:1;margin-left:-1px;margin-top:7px}@media only screen and (max-width:600px){.audio.is-voice .audio-time{margin-top:.3125rem}.audio.is-voice .audio-waveform-container{height:16px;margin-top:0}}.audio.is-voice.is-unread .audio-time:after{background-color:var(--primary-color);border-radius:50%;content:" ";height:.5rem;margin-left:.375rem;width:.5rem}.audio.is-voice.is-unread:not(.is-out) .audio-toggle:not(.playing)+.audio-waveform-container .audio-waveform-background rect{opacity:1}.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{background-color:transparent;opacity:1;z-index: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;height:inherit;-o-object-fit:cover;object-fit:cover;width: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{align-items:center;display:flex;justify-content:center;left:0;position:absolute;top:8px;transform:translate3d(0,calc(-100% - 10px),0);transition:transform .2s ease;width:100%}body.animation-level-0 .quiz-hint{transition:none}.quiz-hint.active{transform:translateZ(0)}[dir=ltr] .quiz-hint .container{text-align:left}[dir=rtl] .quiz-hint .container{text-align:right}.quiz-hint .container{align-items:center;background:rgba(0,0,0,.7);border-radius:12px;color:#fff;display:flex;flex-wrap:wrap;font-size:15px;line-height:1.5;max-width:400px;min-height:48px;overflow:hidden;padding:10px 18px 12px 50px;position:relative;text-align:center;width:auto}@media only screen and (max-width:600px){.quiz-hint .container{font-size:14px;margin:0 10px;padding:10px 18px 12px 54px}}.quiz-hint .container .text{word-break:break-word}.quiz-hint .container:before{content:"๎ฅ—";font-size:1.5rem;left:15px;position:absolute;top:12px}.quiz-hint .container a{border-bottom:1px solid #fff;color:#fff}.peer-typing{margin-right:4px}.peer-typing-container{--color:var(--primary-color);color:var(--color)}.peer-typing-flex{align-items:center;display:flex}.peer-typing:not(.peer-typing-text):not(.peer-typing-choosing-sticker){display:inline-block;transform:translateY(-1px);vertical-align:middle}.peer-typing-text-dot{animation-duration:.6s;animation-iteration-count:infinite;animation-name:dotMiddle;animation-timing-function:linear;background-color:var(--color);border-radius:50%;display:inline-block;height:6px;margin:0 .5px;vertical-align:middle;width:6px}.peer-typing-text-dot:first-child{animation-name:dotFirst}.peer-typing-text-dot:last-child{animation-name:dotLast}.peer-typing-upload{border-radius:2px;height:5px;margin-right:.375rem;overflow:hidden;position:relative;width:13px}.peer-typing-upload:after,.peer-typing-upload:before{background-color:var(--color);border-radius:inherit;bottom:0;content:" ";display:block;left:0;position:absolute;right:0;top:0}.peer-typing-upload:before{opacity:.3}.peer-typing-upload:after{animation:upload 1s ease-in-out infinite}.peer-typing-record{margin-right:.375rem}.peer-typing-record:before{animation:recordBlink 1.25s infinite;background-color:var(--color);border-radius:50%;content:" ";display:block;height:6px;width:6px}.peer-typing-choosing-sticker{align-items:center;display:flex;flex:0 0 auto;height:16px;margin-right:.375rem}.peer-typing-choosing-sticker-eye{animation:eye 1.8s ease-in-out infinite;border:1px solid var(--color);border-radius:50%;display:inline-block;height:14px;margin:0 .0625rem;position:relative;vertical-align:middle;width:8px}.peer-typing-choosing-sticker-eye:before{animation:eye-move 1.8s ease-in-out infinite;background-color:var(--color);border-radius:50%;content:" ";display:block;height:.25rem;position:absolute;top:50%;transform:translate(-1px,-50%);width:.25rem}@keyframes dotFirst{0%{opacity:.8;transform:scale(.6666666667)}50%{opacity:.8;transform:scale(.6666666667)}75%{opacity:1;transform:scale(1)}to{opacity:.8;transform:scale(.6666666667)}}@keyframes dotMiddle{0%{opacity:.9;transform:scale(.8333333333)}12.5%{opacity:.8;transform:scale(.6666666667)}62.5%{opacity:.8;transform:scale(.6666666667)}87.5%{opacity:1;transform:scale(1)}to{opacity:.9;transform:scale(.8333333333)}}@keyframes dotLast{0%{opacity:1;transform:scale(1)}25%{opacity:.8;transform:scale(.6666666667)}75%{opacity:.8;transform:scale(.6666666667)}to{opacity:1;transform:scale(1)}}@keyframes upload{0%{transform:translateX(-13px)}to{transform:translate(13px)}}@keyframes eye{0%{transform:scale(1.1) translateX(-.75px)}12.5%{transform:scale(1) translateX(0)}25%{transform:scale(1.1) translateX(.375px)}50%{transform:scale(1.1) translateX(.75px)}62.5%{transform:scale(1) translateX(0)}75%{transform:scale(1.1) translateX(-.375px)}to{transform:scale(1.1) translateX(-.75px)}}@keyframes eye-move{0%{transform:translate(-1px,-50%)}25%{transform:translate(3px,-50%)}50%{transform:translate(3px,-50%)}75%{transform:translate(-1px,-50%)}to{transform:translate(-1px,-50%)}}poll-element{color:var(--primary-text-color);display:block;margin-top:-1px;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:330px}@media only screen and (max-width:600px){poll-element{max-width:100%;width:240px}}poll-element:not(.is-closed):not(.is-voted) .poll-answer{cursor:pointer}poll-element .poll-title{font-weight:var(--font-weight-bold)}@media only screen and (max-width:600px){poll-element .poll-title{max-width:88%;white-space:normal}}poll-element .poll-desc{align-items:center;color:var(--secondary-text-color);display:flex;font-size:14px;margin-bottom:5px;margin-top:2px;position:relative}poll-element .poll-type{margin-top:2px}poll-element .poll-hint{color:var(--primary-color);cursor:pointer;font-size:1.5rem;position:absolute;right:2px;top:-4px;transform:scale(1)}body.animation-level-2 poll-element .poll-hint{transition:transform .2s ease}poll-element .poll-hint.active{pointer-events:none;transform:scale(0)}poll-element .poll-send-vote{cursor:default}poll-element .poll-avatars{cursor:pointer;display:flex;margin-left:18px}poll-element .poll-avatar{border:1px solid var(--border-color);cursor:pointer;height:18px;width:18px}poll-element .poll-answer{display:flex;margin-top:1px;padding-bottom:20px;padding-left:28px;position:relative}poll-element .poll-answer-text{margin-left:12px;margin-top:6px}[dir=ltr] poll-element .poll-answer-percents{text-align:right}[dir=rtl] poll-element .poll-answer-percents{text-align:left}poll-element .poll-answer-percents{font-size:14px;font-weight:var(--font-weight-bold);left:0;margin-left:-9px;margin-top:7px;opacity:0;position:absolute;top:0;width:40px}poll-element .poll-answer-selected{align-items:center;background:var(--primary-color);border-radius:50%;bottom:1px;color:#fff;display:flex;font-size:.75rem;font-weight:var(--font-weight-bold);height:16px;justify-content:center;left:15px;opacity:1;position:absolute;width:16px}poll-element .poll-answer-selected:before{content:"๎ค€";font-weight:var(--font-weight-bold)}html.no-touch poll-element .poll-answer:active .animation-ring,html.no-touch poll-element .poll-answer:hover .animation-ring{transform:scale(1);visibility:visible}poll-element .poll-answer.is-voting .progress-ring__circle{stroke-dashoffset:-19.792;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:var(--secondary-text-color);font-size:.875rem;margin-top:-.5rem}poll-element .poll-line{stroke-dashoffset:0;stroke-dasharray:0,485.9;bottom:2px;height:35px;left:10px;position:absolute}poll-element .poll-line use{stroke-width:4px;stroke-linecap:round;stroke:var(--primary-color);fill:none}poll-element .poll-footer{height:2.875rem;margin:-.375rem -.5rem -.375rem -.625rem;text-align:center}poll-element .poll-footer-button{border-top-left-radius:0!important;border-top-right-radius:0!important;color:var(--primary-color);cursor:pointer;font-size:1rem;font-weight:var(--font-weight-bold);height:100%;overflow:hidden;width:100%}poll-element .poll-footer,poll-element .poll-footer-button{align-items:center;display:flex;justify-content:center}poll-element .poll-quiz-timer{stroke:#a3adb6;fill:none;stroke-linecap:round;height:32px;position:absolute;right:-2px;top:-7px;transform:rotate(270deg);width:32px}poll-element .poll-time{color:#a3adb6;font-size:12px;font-weight:var(--font-weight-bold);position:absolute;right:27px}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) use{stroke:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected{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{align-items:center;display:flex;height:34px;justify-content:center;left:-1px;position:absolute;top:-1px;transform:scale(1);width:34px}poll-element .circle-hover .poll-answer-selected{animation:none;display:flex!important;font-size:20px;height:20px;left:50%;line-height:16px;opacity:0;top:50%;transform:translate(-50%,-50%);width:20px}body.animation-level-2 poll-element .circle-hover .poll-answer-selected{transition:opacity .2s ease}poll-element .animation-ring{background-color:var(--light-secondary-text-color);border-radius:50%;display:block;height:34px;transform:scale(.1);visibility:hidden;width:34px}body.animation-level-2 poll-element .animation-ring{transition:transform .12s ease}poll-element .progress-ring{height:26px;left:auto;top:auto;width:26px}poll-element .progress-ring__circle{stroke-dasharray:56.5487,56.5487;stroke-dashoffset:0;stroke-opacity:1;stroke-width:2;stroke:var(--poll-circle-color);fill:transparent;transform:rotate(-90deg);transform-origin:center}poll-element.is-voted .animation-ring,poll-element.is-voted .circle-hover{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 forwards .1s ease}poll-element.animating.is-retracting .poll-answer-selected{transition-delay:0s}poll-element.animating .poll-answer-percents{transition:opacity .34s}poll-element.animating .progress-ring__circle{transition:stroke-dashoffset .15s}poll-element.animating .circle-hover{transition:transform .1s}poll-element.is-multiple .poll-desc{margin-bottom:.5rem}poll-element .c-ripple__circle{background-color:var(--light-primary-color)}@keyframes pollAnswerRotate{to{transform:rotate(270deg)}}.transition>.transition-item{animation-fill-mode:forwards!important;height:100%;left:0;position:absolute;top:0;width:100%}.transition>.transition-item:not(.active):not(.from):not(.to){display:none!important}.transition.zoom-fade>.from{opacity:1;transform:scale(1);transform-origin:center}.transition.zoom-fade>.to{opacity:0;transform-origin:center}.transition.zoom-fade.animating>.from{animation:fade-out-opacity .15s ease}.transition.zoom-fade.animating>.to{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(.95)}.transition.zoom-fade.backwards.animating>.from{animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease}.transition.zoom-fade.backwards.animating>.to{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{opacity:1;transform:translateX(0);transform-origin:left center}.transition.slide-fade>.to{opacity:0;transform:translateX(1.5rem);transform-origin:left center}.transition.slide-fade.animating>.from{animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s}.transition.slide-fade.animating>.to{animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s}.transition.slide-fade.backwards>.from{opacity:1;transform:translateX(0)}.transition.slide-fade.backwards>.to{opacity:0;transform:translateX(-1.5rem)}.transition.slide-fade.backwards.animating>.from{animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s}.transition.slide-fade.backwards.animating>.to{animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s}@keyframes zoom-fade-in-move{0%{transform:scale(1.1)}to{transform:scale(1)}}@keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}to{transform:scale(1.1)}}@keyframes zoom-fade-out-backwards-move{0%{transform:scale(.95)}to{transform:scale(1)}}@keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}to{transform:translateX(0)}}@keyframes slide-fade-out-move{0%{transform:translateX(0)}to{transform:translateX(-1.5rem)}}@keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}to{transform:translateX(1.5rem)}}@keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}to{transform:translateX(0)}}.row{display:flex;flex-direction:column;justify-content:center;min-height:3.5rem;padding:.4375rem 1rem;position:relative}.row.no-subtitle,.row.row-small{min-height:3rem;padding-bottom:.1875rem;padding-top:.1875rem}body.animation-level-2 .row{transition:opacity var(--transition-standard-in)}.row.is-disabled{opacity:var(--disabled-opacity);pointer-events:none!important}.row.no-wrap{padding-bottom:0!important;padding-top:0!important}.row a{pointer-events:all;position:relative;z-index:1}.row-title-row,.row>.row-title{order:0}[dir=ltr] .row-big{padding-left:1rem;padding-right:.75rem}[dir=rtl] .row-big{padding-left:.75rem;padding-right:1rem}.row-big{min-height:4.5rem;padding-bottom:.5625rem;padding-top:.5625rem}.row-row{align-items:center;display:flex;justify-content:space-between}.row-row .row-subtitle,.row-row .row-title{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.row-subtitle-row,.row>.row-subtitle{order:1}.row-title{color:var(--primary-text-color);font-size:var(--font-size);line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;word-break:break-word}.row-title-right-secondary{color:var(--secondary-text-color)}[dir=ltr] .row-subtitle-right,[dir=ltr] .row-title-right{margin-left:1rem}[dir=rtl] .row-subtitle-right,[dir=rtl] .row-title-right{margin-right:1rem}.row-subtitle-right,.row-title-right{flex:0 0 auto!important}.row-midtitle,.row-subtitle,.row-title{pointer-events:none;position:relative}.row-midtitle{font-size:var(--font-size-14);margin-top:.125rem;order:1}[dir=ltr] .row-with-padding{padding-left:4.5rem}[dir=rtl] .row-with-padding{padding-right:4.5rem}@media only screen and (max-width:600px){[dir=ltr] .row-with-padding{padding-left:4rem}[dir=rtl] .row-with-padding{padding-right:4rem}}[dir=ltr] .row-with-padding.tgico:before{left:1rem}[dir=rtl] .row-with-padding.tgico:before{right:1rem}.row-with-padding.tgico:before{color:var(--secondary-text-color);font-size:1.5rem;pointer-events:none;position:absolute;top:50%;transform:translateY(-50%);z-index:1}.row-with-padding:not(.row-with-icon):before{display:none}.row-clickable{cursor:pointer;overflow:hidden}@media only screen and (min-width:601px){.row-clickable{border-radius:10px}}[dir=ltr] .row-sortable .row-subtitle,[dir=ltr] .row-sortable .row-title{padding-right:2.5rem}[dir=rtl] .row-sortable .row-subtitle,[dir=rtl] .row-sortable .row-title{padding-left:2.5rem}[dir=ltr] .row-sortable-icon{right:.75rem}[dir=rtl] .row-sortable-icon{left:.75rem}.row-sortable-icon{color:var(--secondary-text-color);font-size:1.5rem;height:1.5rem;line-height:1;opacity:0;pointer-events:none;position:absolute;top:50%;transform:translateY(-50%)}.row-sortable.cant-sort .row-sortable-icon{display:none}.row-sortable.is-dragging{background-color:var(--surface-color)!important;z-index:1}html.no-touch .row-sortable.is-dragging:active,html.no-touch .row-sortable.is-dragging:hover{background-color:var(--light-filled-secondary-text-color)!important}html.no-touch .row-sortable:active .row-sortable-icon,html.no-touch .row-sortable:hover .row-sortable-icon{opacity:1}body.animation-level-2 .is-reordering .row-sortable{transition:transform var(--transition-standard-in)}[dir=ltr] .row .checkbox-field,[dir=ltr] .row .radio-field-main{padding-left:3.375rem}[dir=rtl] .row .checkbox-field,[dir=rtl] .row .radio-field-main{padding-right:3.375rem}[dir=ltr] .row .checkbox-field,[dir=ltr] .row .radio-field-main{margin-left:-3.375rem}[dir=rtl] .row .checkbox-field,[dir=rtl] .row .radio-field-main{margin-right:-3.375rem}.row .checkbox-field,.row .radio-field,.row .radio-field:not(.radio-field-right) .radio-field-main{position:static}.row .checkbox-field,.row .radio-field{--offset-left:1rem}.row .radio-field{margin-bottom:0;margin-top:0}[dir=ltr] .row .checkbox-field{margin-right:0}[dir=rtl] .row .checkbox-field{margin-left:0}.row .checkbox-field{height:auto;margin-bottom:0;margin-top:0}[dir=ltr] .row .checkbox-field .checkbox-caption{padding-left:0}[dir=rtl] .row .checkbox-field .checkbox-caption{padding-right:0}.row .checkbox-field .checkbox-caption{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.row .checkbox-field-toggle{margin-left:.125rem;margin-right:.125rem;padding:0}.row-subtitle{color:var(--secondary-text-color)!important;font-size:var(--font-size-14)!important;line-height:var(--line-height-14);margin-top:.1875rem}.row-subtitle:empty{display:none}[dir=ltr] .row-media{left:.75rem}[dir=rtl] .row-media{right:.75rem}.row-media{align-items:center;display:flex;height:2.25rem!important;justify-content:center;margin:0!important;pointer-events:none;position:absolute!important;width:2.25rem!important}[dir=ltr] .row-media-small{left:.75rem!important}[dir=rtl] .row-media-small{right:.75rem!important}.row-media-small{height:2rem!important;width:2rem!important}[dir=ltr] .row-media-abitbigger{left:.75rem!important}[dir=rtl] .row-media-abitbigger{right:.75rem!important}.row-media-abitbigger{height:2.625rem!important;width:2.625rem!important}[dir=ltr] .row-media-big{left:.5rem!important}[dir=rtl] .row-media-big{right:.5rem!important}.row-media-big{height:3rem!important;width:3rem!important}[dir=ltr] .row-media-bigger{left:.5625rem!important}[dir=rtl] .row-media-bigger{right:.5625rem!important}.row-media-bigger{height:3.375rem!important;width:3.375rem!important}.row.menu-open{background-color:var(--light-secondary-text-color)}[dir=ltr] .row>.btn-primary{right:1rem}[dir=rtl] .row>.btn-primary{left:1rem}.row>.btn-primary{border-radius:.9375rem;font-size:.9375rem;height:1.875rem;line-height:1.875rem;margin:0;padding-left:.75rem;padding-right:.75rem;position:absolute;top:50%;transform:translateY(-50%);width:auto}body.animation-level-2 .row>.btn-primary{transition:width .2s,background-color .2s,color .2s}.row>.btn-primary.active{background-color:var(--light-primary-color)!important;color:var(--primary-color)}.color-picker{margin:1.1875rem auto .25rem;max-width:100%;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:380px}@media only screen and (max-width:600px){.color-picker{padding:0 .75rem}}.color-picker-box{height:198px;width:100%}.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: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:var(--surface-color);border-radius:10px;bottom:calc(100% + .625rem);box-shadow:0 5px 10px 5px rgba(16,35,47,.14);display:flex!important;flex-direction:column;max-height:26.25rem;max-width:100%;opacity:0;overflow:hidden;padding:0!important;position:absolute!important;right:0;transform:scale(0);transform-origin:bottom right;transition:transform var(--esg-transition),opacity var(--esg-transition);width:26.25rem!important;z-index:3}@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{background-color:transparent;border:2px solid var(--primary-color);border-radius:.375rem;color:var(--primary-color);font-size:.9375rem;font-weight:var(--font-weight-bold);height:3rem;text-align:center;width:100%}body.animation-level-2 .reply-keyboard-button{transition:color .15s,background-color .15s}html.no-touch .reply-keyboard-button:active,html.no-touch .reply-keyboard-button:hover{background-color:var(--primary-color);color:#fff}.reply-keyboard-button+.reply-keyboard-button{margin-left:.3125rem}.reply-keyboard .scrollable-y{bottom:auto;height:auto;left:auto;max-height:100%;padding:.625rem!important;position:relative;right:auto;top:auto}.peoplenearby-container div.text.nearby-description{color:var(--primary-text-color);margin-top:15px;text-align:center}.peoplenearby-container div.text.nearby-error{color:var(--gc-secondary-text-color);margin-top:10px;text-align:center}.peoplenearby-container .locating-animation-container{align-items:center;display:flex;justify-content:center;min-height:140px;width:100%}.peoplenearby-container .locating-animation-container .tgico.tgico-location{align-items:center;background:var(--avatar-color-bottom);border-radius:50%;display:flex;height:140px;justify-content:center;padding:50px;width:140px}.peoplenearby-container .locating-animation-container .tgico.tgico-location:before{color:#fff;font-size:58px}.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{animation:waves-animation 3s infinite;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%);height:50px;margin-left:36px;width:50px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-2,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{animation:waves-animation 5s infinite;animation-delay:2s;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%);height:71px;margin-left:51px;margin-top:1px;width:66px}.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)}@keyframes waves-animation{0%{opacity:1}50%{opacity:0}to{opacity:1}}.spoiler{--anim:.4s ease;background-color:var(--spoiler-background-color)}.spoiler-text{opacity:0}.spoilers-container .custom-emoji-canvas{z-index:-1}.spoilers-container.is-spoiler-visible.animating .spoiler{transition:background-color var(--anim)}.spoilers-container.is-spoiler-visible.animating .spoiler-text{transition:opacity var(--anim)}.spoilers-container.is-spoiler-visible:not(.backwards) .spoiler{background-color:transparent}.spoilers-container.is-spoiler-visible:not(.backwards) .spoiler-text{opacity:1}.spoilers-container:not(.is-spoiler-visible) .spoiler{cursor:pointer}.spoilers-container:not(.is-spoiler-visible) .spoiler-text{pointer-events:none}.emoji-animation,.emoji-animation-container{pointer-events:none;position:absolute}.emoji-animation-container{bottom:0;left:0;overflow:hidden;right:0;top:0;z-index:3}.reactions-block{display:flex;flex-wrap:wrap;-webkit-user-select:none;-moz-user-select:none;user-select:none}.reactions-block.has-no-reactions{display:inline;display:initial}.reactions-inline{display:inline-flex}.reactions-inline:not(:empty){margin-right:.125rem}.reaction,.reaction-sticker{align-items:center;display:flex}.reaction-sticker{--custom-emoji-size:var(--reaction-size);height:var(--reaction-size);justify-content:center;position:relative;width:var(--reaction-size)}.reaction-sticker-activate{bottom:var(--reaction-offset);left:var(--reaction-offset);position:absolute;right:var(--reaction-offset);top:var(--reaction-offset);z-index:1}.reaction-sticker.has-animation>.media-sticker{opacity:0}.reaction-sticker:not(.is-static):not(.is-custom) .media-sticker{--size:calc(var(--reaction-size) + var(--reaction-offset)*-2);bottom:auto;height:var(--size)!important;left:auto;max-height:var(--size);max-width:var(--size);right:auto;top:auto;width:var(--size)!important}.reaction-sticker.is-custom{border-radius:.3125rem}.reaction-sticker.is-custom .custom-emoji,.reaction-sticker.is-custom .media-sticker{border-radius:inherit}.reaction-sticker.is-custom .custom-emoji-canvas{z-index:auto}.reaction-inline{--reaction-size:.875rem;--reaction-offset:-.4375rem;min-height:var(--reaction-size);min-width:var(--reaction-size)}.reaction-inline .reaction-counter{font-size:inherit!important;margin-right:.0625rem!important;order:-1}.reaction-block{--additional-height:.5rem;--margin:.375rem;--reaction-size:1.375rem;--reaction-offset:-.5625rem;--background-color:var(--message-highlightning-color);--chosen-background-color:var(--message-primary-color);--counter-color:#fff;--reaction-total-size:calc(var(--reaction-size) + var(--additional-height));background-color:var(--background-color);border-radius:var(--reaction-total-size);color:var(--counter-color);cursor:pointer;height:var(--reaction-total-size);margin-right:var(--margin);margin-top:var(--margin);padding:0 .5rem;position:relative}html.no-touch .reaction-block:active:after,html.no-touch .reaction-block:hover:after{background-color:var(--chosen-background-color);border-radius:inherit;bottom:0;content:" ";left:0;opacity:.08;position:absolute;right:0;top:0}.reaction-block .reaction-counter,.reaction-block .reaction-sticker{z-index:1}.reaction-block:last-child{margin-right:0}.reaction-block:before{background-color:var(--chosen-background-color);border-radius:inherit;bottom:0;content:" ";left:0;opacity:0;position:absolute;right:0;top:0;transform:scale(0)}.reaction-block.is-chosen:not(.backwards):before{opacity:1;transform:scale(1)}.reaction-block.is-chosen:not(.backwards) .stacked-avatars{--border-color:var(--chosen-background-color)}.reaction-block.is-chosen.animating:before{transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.reaction-block.is-chosen.animating .reaction-counter{transition:color var(--transition-standard-in)}.reaction-block.is-chosen.animating .stacked-avatars-avatar-container{transition:border-color var(--transition-standard-in)}.reaction-block .stacked-avatars{--border-color:transparent;--border-size:.125rem;--margin-right:-.875rem;margin-left:.1875rem}.reaction-block .reaction-counter{font-size:.9375rem!important;font-weight:var(--font-weight-bold);line-height:1.125rem;margin:0 .0625rem 0 .375rem;position:relative}.stacked-avatars{--border-color:var(--surface-color);--border-size:1px;--margin-right:-.3125rem;--avatar-size:1rem;--avatar-total-size:calc(var(--avatar-size) + var(--border-size)*2);display:flex;flex-direction:row-reverse}.stacked-avatars-avatar{height:var(--avatar-size);width:var(--avatar-size);z-index:0}.stacked-avatars-avatar-container{align-items:center;border:var(--border-size) solid var(--border-color);border-radius:50%;display:flex;height:var(--avatar-total-size);justify-content:center;position:relative;width:var(--avatar-total-size)}.stacked-avatars-avatar-container:not(:first-child){margin-right:var(--margin-right)}.sticker-viewer{align-items:center;bottom:0;display:flex;justify-content:center;left:0;pointer-events:none;position:fixed;right:0;top:0;z-index:4}.sticker-viewer:before{background-color:rgba(0,0,0,.6);bottom:0;content:" ";left:0;opacity:0;position:absolute;right:0;top:0}body.animation-level-2 .sticker-viewer:before{transition:opacity var(--sticker-viewer-open-transition-out)}.sticker-viewer.is-visible:not(.backwards):before{opacity:1}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards):before{transition:opacity var(--sticker-viewer-open-transition-in)}.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-transformer:not(.is-switching){transform:translateX(var(--translateX)) scale(1)!important}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-transformer:not(.is-switching){transition:transform var(--sticker-viewer-open-transition-in)}.sticker-viewer.is-visible:not(.backwards) .emoji-animation,.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-emoji,.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker{opacity:1}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .emoji-animation,body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-emoji,body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker{transition:opacity var(--sticker-viewer-open-transition-in)}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker:not(.is-overflow){transition:opacity 0s}.sticker-viewer-transformer{--translateX:0;align-items:center;display:flex;height:360px;justify-content:center;position:absolute;width:360px}.sticker-viewer-transformer.has-effect{height:280px;width:280px}.sticker-viewer-transformer.has-effect .sticker-viewer-emoji{top:-5.5rem}body.animation-level-2 .sticker-viewer-transformer{transition:transform var(--sticker-viewer-open-transition-out)}.sticker-viewer-transformer.is-switching{opacity:1!important;transform:translateX(var(--translateX)) scale(1)!important}body.animation-level-2 .sticker-viewer-transformer.is-switching{transition:transform var(--sticker-viewer-switch-transition),opacity var(--sticker-viewer-switch-transition)!important}.sticker-viewer-transformer.is-switching:not(.backwards){opacity:0!important;transform:scale(.4) translateX(var(--translateX))!important}.sticker-viewer-emoji{position:absolute;top:-3rem;transform:translateX(var(--translateX)) scale(2)}.sticker-viewer-sticker{position:absolute}.sticker-viewer .emoji-animation,.sticker-viewer-emoji,.sticker-viewer-sticker{opacity:0}body.animation-level-2 .sticker-viewer .emoji-animation,body.animation-level-2 .sticker-viewer-emoji,body.animation-level-2 .sticker-viewer-sticker{transition:opacity var(--sticker-viewer-open-transition-out)}.custom-emoji{display:inline;height:var(--custom-emoji-size)!important;min-height:var(--custom-emoji-size)!important;min-width:var(--custom-emoji-size)!important;position:relative;width:var(--custom-emoji-size)!important}.custom-emoji:before{content:"ย ";display:inline-block;height:inherit;min-height:inherit;min-width:inherit;width:inherit}.custom-emoji .media-sticker,.custom-emoji .rlottie{height:inherit!important;margin:0;max-height:inherit!important;max-width:inherit!important;pointer-events:none;text-indent:-9999px;width:inherit!important}.custom-emoji-canvas{height:100%;width:100%}.custom-emoji-canvas,.custom-emoji-renderer{bottom:0;left:0;position:absolute;right:0;top:0}.custom-emoji-renderer{pointer-events:none}.custom-emoji-placeholder{display:inline;height:var(--messages-custom-emoji-size);margin-top:-.125rem;vertical-align:middle;width:var(--messages-custom-emoji-size)}.usernames-username-icon{background-color:var(--secondary-color);border-radius:50%;color:#fff;font-size:1.25rem}.usernames-username-icon:before{content:"๎ฅฅ"}.usernames-username.active .usernames-username-status{color:var(--primary-color)!important}.usernames-username.active .usernames-username-icon{background-color:var(--primary-color)}.topics-slider{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0}.topics-container{--offset:0;--width:100%;background-color:var(--surface-color)!important;width:var(--width)!important}.topics-container.is-floating{--offset:5.0625rem;--width:calc(var(--left-column-width) - var(--offset));border-left:1px solid var(--border-color);bottom:0;overflow:visible!important;overflow:initial!important;pointer-events:all;position:absolute;right:0;top:0;transform:translateX(var(--width));z-index:3}.topics-container.is-visible:not(.backwards){transform:translateX(0)}.topics-container.is-visible.animating{transition:transform var(--transition-standard-in)}.topics-container.is-visible.animating.backwards{transition:transform var(--transition-standard-out)}.topics-container .sidebar-header{padding:0 .75rem}.topics-container .sidebar-header__rows{flex:1 1 auto;overflow:hidden;padding-left:.5rem}.topics-container .sidebar-header__rows .sidebar-header__title{font-size:var(--font-size-16);line-height:var(--line-height-16);margin-bottom:.125rem;padding-left:0!important}.topics-container .sidebar-header__subtitle,.topics-container .sidebar-header__title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.topics-container .sidebar-header__subtitle{color:var(--secondary-text-color);font-size:var(--font-size-14);line-height:var(--line-height-14)}.topics-container .chatlist-chat{min-height:4rem;padding-left:.75rem}.topic-name .topic-icon{margin-right:.25rem}.topic-name-button{--color:var(--primary-color);align-items:center;color:var(--color);cursor:pointer;display:flex;font-weight:var(--font-weight-bold);height:1.5rem;justify-content:center;max-width:100%;padding:0 .5rem;position:relative;text-decoration:none!important}.topic-name-button-container{align-items:flex-start;display:flex!important;justify-content:flex-start}.topic-name-button .peer-title,.topic-name-button .topic-name{position:relative}.topic-name-button:before{background-color:var(--color);border-radius:1.5rem;bottom:0;content:" ";left:0;opacity:.08;position:absolute;right:0;top:0}html.no-touch .topic-name-button:active:before,html.no-touch .topic-name-button:hover:before{opacity:.16}.topic-icon{--size:1.25rem;--custom-emoji-size:var(--size);display:inline-flex;font-size:calc(var(--size)/2);justify-content:center;line-height:1.875!important;position:relative;vertical-align:middle}.topic-icon-general{fill:var(--secondary-color);height:var(--size);width:var(--size)}.topic-icon-svg{height:inherit;position:absolute;width:inherit}.topic-icon-content{position:relative}.edit-topic-container .scrollable-y{display:flex;flex-direction:column}.edit-topic-icon{position:absolute}.edit-topic-icon .topic-icon{--size:4rem}.edit-topic-icon-container{align-items:center;cursor:pointer;display:flex;height:100px;justify-content:center;margin:0 auto;position:relative;width:100px}.edit-topic-emoticons-container{flex:1 1 auto}.edit-topic-emoticons-container .sidebar-left-section{height:100%;padding:0!important}.edit-topic-emoticons-container .emoji-padding{display:flex;flex-direction:column}.edit-topic-emoticons-container .super-emoji-topic-icon .topic-icon{--size:var(--esg-emoji-size);--custom-emoji-size:inherit;margin-left:calc((var(--custom-emoji-size) - var(--esg-emoji-size))/2)}.themes-container{align-items:center;display:flex;height:6.5rem;position:relative}@media only screen and (min-width:601px){.themes-container{margin:0 -.5rem;padding:0;width:calc(100% + 1rem)}}.themes-container:after,.themes-container:before{content:" ";display:block;flex:0 0 auto;height:.5rem;width:.5rem}.theme-container{border-radius:10px;cursor:pointer;display:flex;flex:0 0 auto;height:calc(100% - .5rem);justify-content:center;margin:0 .25rem;position:relative;width:4.5rem}.theme-container:before{border:2px solid var(--primary-color);border-radius:14px;bottom:-4px;content:" ";left:-4px;opacity:0;position:absolute;right:-4px;top:-4px;transform:scale(.86)}html.is-safari .theme-container:before{transform:none!important}body.animation-level-2 .theme-container:before{transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.theme-container.active{pointer-events:none}.theme-container.active:before{opacity:1;transform:scale(1)}.theme-container .background-item{border-radius:inherit;height:100%;left:0;pointer-events:none;position:absolute;top:0;width:100%}.theme-emoticon{bottom:.5rem;height:1.75rem;pointer-events:none;position:absolute;width:1.75rem;z-index:1}html:not(.is-safari) .theme-emoticon{transform:scale(1);transform-origin:center bottom}body.animation-level-2 .theme-emoticon{transition:transform var(--transition-standard-in)}.theme-bubble{background-color:#fff;border-radius:1.75rem;height:1.25rem;pointer-events:none;position:absolute;width:2.5rem}.theme-bubble.is-out{background-color:var(--light-filled-message-out-primary-color);right:.375rem;top:.5rem}.theme-bubble.is-in{background-color:var(--message-background-color);left:.375rem;top:2rem}.popup{background-color:rgba(0,0,0,.3);bottom:0;box-shadow:none;display:flex;left:0;margin:0;max-width:none;opacity:0;overflow:auto;padding:1.875rem;position:fixed!important;right:0;top:0;transition-delay:0s,var(--popup-transition-time);transition-duration:var(--popup-transition-time),0s;transition-property:opacity,visibility;transition-timing-function:var(--popup-transition-function);-webkit-user-select:none;-moz-user-select:none;user-select:none;visibility:hidden;z-index:3}.popup.no-overlay{background-color:transparent;overflow:visible;padding:0}body.animation-level-0 .popup{transition:none}.popup.active{opacity:1;transition-delay:0s,0s;visibility:visible;z-index:4}.popup.active .popup-container,.popup.hiding .popup-container{transform:translate3d(var(--translateX),0,0)}[dir=ltr] .popup-title{padding-left:1.5rem;padding-right:1rem}[dir=rtl] .popup-title{padding-left:1rem;padding-right:1.5rem}.popup-title{flex:1;font-size:1.25rem;font-weight:var(--font-weight-bold);line-height:1;margin:0}.popup-title:first-child{padding-left:0}.popup-container{--translateX:0;-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:var(--surface-color);border-radius:10px;display:flex;flex-direction:column;margin:auto;overflow:hidden;padding:1rem;position:relative;transform:translate3d(var(--translateX),3rem,0);transition:transform var(--popup-transition-time) var(--popup-transition-function)}body.animation-level-0 .popup-container{transition:none}.popup-description .peer-title{font-weight:var(--font-weight-bold)}.popup-centerer{margin:auto}.popup-close{flex:0 0 auto;justify-self:center;z-index:3}.popup-header{align-items:center;display:flex;flex:0 0 auto;margin-bottom:2rem;position:relative}.popup-body{display:flex;flex:1 1 auto;flex-direction:column;overflow:hidden}.popup-body .scrollable{position:relative}.popup-buttons{align-items:center;display:flex;flex-direction:row-reverse;height:3rem;justify-content:flex-start;padding:0 .5rem}.popup-buttons .btn{border-radius:10px;font-weight:var(--font-weight-bold);height:2.5rem;max-width:100%;overflow:hidden;padding:0 1rem;position:relative;text-overflow:ellipsis;text-transform:uppercase;white-space:nowrap}[dir=ltr] .popup-buttons .btn+.btn{margin-right:.625rem}[dir=rtl] .popup-buttons .btn+.btn{margin-left:.625rem}.popup-avatar .popup-container{max-width:600px;padding:15px 16px 16px 24px}.popup-avatar .popup-container>button{bottom:20px;position:absolute;right:20px}.popup-avatar .popup-close{font-size:1.5rem;margin-top:4px}.popup-avatar .popup-header{margin-bottom:1px}[dir=ltr] .popup-avatar h6{text-align:left}[dir=rtl] .popup-avatar h6{text-align:right}.popup-avatar h6{font-size:1.25rem;margin:0 0 0 2rem}.popup-avatar .crop{border-radius:8px;max-height:100%;max-width:100%;padding:24px 54px 46px 46px}.popup-avatar .crop>img{display:none}.popup-avatar .crop img{border-radius:8px}.popup-new-media .popup-container{max-height:100%;max-width:420px;padding:12px 20px 32.5px;width:420px}.popup-new-media .popup-container img,.popup-new-media .popup-container video{border-radius:inherit}.popup-new-media .popup-header{align-items:center;flex:0 0 auto;flex-wrap:wrap;justify-content:space-between;margin-bottom:9px;padding:12px 20px 15px;position:relative}.popup-new-media .popup-header .btn-primary{border-radius:10px;font-size:var(--font-size-14);height:2.25rem;line-height:2.25rem;padding:0 1.375rem;text-transform:uppercase;width:auto}.popup-new-media .popup-close{margin:-1px 0 0 -4px}.popup-new-media .popup-photo{border-radius:10px;max-width:100%;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.popup-new-media .scrollable{position:relative}.popup-new-media .input-field{flex:0 0 auto;margin-top:25px;width:100%}.popup-new-media .input-field-input{border-radius:10px;font-size:1rem}.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{top:calc(100% + .25rem);z-index:4}.popup-new-media.popup-send-photo .popup-container{max-width:25rem;padding:0;width:25rem}.popup-new-media.popup-send-photo .popup-container.border-top-offset .popup-input-container{overflow:visible;overflow:initial}.popup-new-media.popup-send-photo .popup-container.border-top-offset .popup-input-container:before{top:-8px}.popup-new-media.popup-send-photo .menu-send{bottom:3.5rem;right:.5rem;top:auto}.popup-new-media.popup-send-photo .popup-header{height:3.5rem;margin:0;padding:0 1rem}[dir=ltr] .popup-new-media.popup-send-photo .popup-title{padding-left:1.5rem}[dir=rtl] .popup-new-media.popup-send-photo .popup-title{padding-right:1.5rem}.popup-new-media.popup-send-photo .popup-close{margin:0}.popup-new-media.popup-send-photo .popup-body{position:relative}.popup-new-media.popup-send-photo .popup-body .scrollable{padding:0 .5rem}.popup-new-media.popup-send-photo .input-message-container{max-height:inherit;min-height:inherit}.popup-new-media.popup-send-photo .input-message-input{max-height:inherit!important}.popup-new-media.popup-send-photo .btn-primary{flex:0 0 auto;height:2.5rem;line-height:2.5rem;margin-bottom:.5rem;padding:0 1rem;text-transform:uppercase;width:auto}.popup-new-media.popup-send-photo .popup-input-container{--height:3.5rem;--max-height:8.375rem;align-items:flex-end;display:flex;flex:0 0 auto;justify-content:space-between;max-height:var(--max-height);min-height:var(--height);overflow:hidden;padding:0 .5rem;position:relative}.popup-new-media.popup-send-photo .popup-input-container:before{background-color:var(--border-color);content:" ";height:1px;left:0;opacity:0;position:absolute;right:0;top:0}body.animation-level-2 .popup-new-media.popup-send-photo .popup-input-container:before{transition:opacity var(--transition-standard-in)}.popup-new-media.popup-send-photo .popup-input-container.has-border-top:before{opacity:1}.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{height:100%;-o-object-fit:cover;object-fit:cover;width: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{border-radius:inherit;overflow:hidden;position:relative}.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{--padding:.25rem;--icon-size:4.5rem;--icon-margin:.5rem;border-radius:10px;cursor:default;height:5rem;margin:0 .25rem;max-width:100%;overflow:hidden}.popup-new-media.popup-send-photo .document-name{line-height:1.5;margin-bottom:.125rem;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.popup-new-media.popup-send-photo .document-ico{border-radius:5px;font-size:16px;font-weight:400;letter-spacing:0;line-height:11px}html.no-touch .popup-new-media.popup-send-photo .document:active,html.no-touch .popup-new-media.popup-send-photo .document:hover{background-color:var(--light-secondary-text-color)}.popup-create-contact .name-fields{display:flex;flex-direction:column;margin-top:1rem;padding-left:116px;position:relative}.popup-create-contact .name-fields .input-field:first-child{margin-top:0}.popup-create-contact .avatar-placeholder{left:0;position:absolute;top:50%;transform:translateY(-50%)}.popup-peer .popup-header{align-items:center;display:flex;height:2.5rem;margin:0;padding:0 1rem;width:-moz-max-content;width:max-content}.popup-peer .popup-container{max-width:min(400px,100%);min-width:min(100%,17.5rem);padding:.75rem .5rem;width:-moz-min-content;width:min-content}.popup-peer .popup-title{font-size:1.25rem;font-weight:var(--font-weight-bold)}.popup-peer .popup-title:not(:first-child){padding-left:1rem}.popup-peer .popup-description{line-height:var(--line-height);margin-bottom:0;margin-top:0;max-width:-moz-fit-content;max-width:fit-content;min-width:min(100%,15rem);overflow:hidden;padding:.625rem 1rem .5rem;text-overflow:ellipsis;word-break:break-word}.popup-peer .checkbox-field{align-items:center;display:flex;height:3rem;margin:0;padding:0 1.125rem}.popup-peer .checkbox-field .checkbox-box{left:auto}.popup-stickers{-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-stickers .sticker-set-footer{color:var(--primary-color);text-align:center}.popup-stickers .sticker-set-footer .btn-primary{height:44px;line-height:44px;padding:0 1.0625rem;text-transform:uppercase;width:auto}.popup-stickers .scrollable.is-loading{min-height:9rem;position:relative}.popup-stickers .sticker-set-footer{padding:8px 0}.popup-stickers .super-emojis{padding:0 .5rem}.popup-stickers .popup-container{max-height:420px;max-width:420px;padding:0;width:420px}[dir=ltr] .popup-stickers .popup-close{margin-left:1rem}[dir=rtl] .popup-stickers .popup-close{margin-right:1rem}.popup-stickers .popup-close{font-size:1.5rem}.popup-stickers .popup-header{flex:0 0 auto;margin:.625rem 0}.popup-stickers .sticker-set{margin:.0625rem 0}.popup-stickers .sticker-set .row-title{font-weight:var(--font-weight-bold)}.popup-stickers .sticker-set-stickers{--per-row:5;--item-size:var(--popup-sticker-size);display:grid;grid-template-columns:repeat(var(--per-row),1fr);padding:0 5px;position:relative}@media only screen and (max-width:600px){.popup-stickers .sticker-set-stickers{--per-row:4}}.popup-stickers .sticker-set-stickers .media-sticker-wrapper{cursor:pointer;height:var(--item-size);justify-self:center;margin-bottom:2px;position:relative;width:var(--item-size)}@media only screen and (max-width:600px){.popup-stickers .sticker-set-stickers .media-sticker-wrapper{margin-bottom:8px}}.popup-stickers .sticker-set-stickers .media-sticker-wrapper:hover{background-color:var(--light-secondary-text-color);border-radius:12px}.popup-date-picker{-webkit-user-select:none;-moz-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-bottom:1.375rem;margin-left:6px;margin-top:4px}.popup-date-picker .popup-title{font-size:20px;font-weight:var(--font-weight-bold)}.popup-date-picker .popup-buttons{margin-right:-2px;order:2}.popup-date-picker .popup-buttons button+button{margin-left:9px;margin-top:0}.popup-date-picker .date-picker-controls{align-items:center;display:flex;justify-content:space-between}.popup-date-picker .date-picker-controls .date-picker-month-title{font-size:14px;font-weight:var(--font-weight-bold)}.popup-date-picker .date-picker-prev{transform:rotate(90deg)}.popup-date-picker .date-picker-next{transform:rotate(-90deg)}.popup-date-picker .date-picker-next:disabled,.popup-date-picker .date-picker-prev:disabled{visibility:hidden}.popup-date-picker .date-picker-months{margin-bottom:1.5rem;margin-top:7px;-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-date-picker .date-picker-month{display:grid;grid-template-columns:repeat(7,1fr);justify-content:center;width:100%}.popup-date-picker .date-picker-month .btn-icon{align-items:center;color:var(--secondary-text-color);display:flex;font-size:12px;height:38px;justify-content:center;justify-self:center;width:38px}.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:var(--primary-text-color)}.popup-date-picker .date-picker-month .btn-icon.active{background-color:var(--primary-color)!important;border-radius:50%;color:var(--badge-text-color)}.popup-schedule .popup-header{justify-content:space-between;margin-bottom:17px;margin-left:0;margin-top:5px}@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;padding:4px 16px 16px;width:420px}@media only screen and (max-width:600px){.popup-schedule .popup-container{min-width:312px;padding:4px 14px 14px;width:312px}}.popup-schedule .popup-container[data-lines="5"]{top:-16px}.popup-schedule .popup-container[data-lines="7"]{top:16px}.popup-schedule .date-picker-month{margin-left:2px;margin-right:-20px;width:auto}@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-size:20px;font-weight:var(--font-weight-bold);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{font-size:14px;font-weight:var(--font-weight-bold);height:36px;justify-self:auto;margin-top:-4px;width:36px}.popup-schedule .date-picker-month-date:disabled{color:#9ba3a8!important}.popup-schedule .date-picker-month-day{color:var(--primary-text-color)!important;font-size:14px!important;font-weight:var(--font-weight-bold)}.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:400}@media only screen and (max-width:600px){.popup-schedule .btn-primary{widtH:280px;height:50px;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{opacity:0!important;pointer-events:none}.popup-create-poll .input-field .btn-icon{opacity:1;position:absolute;right:.4375rem;top:.4375rem;transition:opacity .2s ease;z-index:1}@media only screen and (max-width:600px){.popup-create-poll .input-field .btn-icon{right:.3125rem;top:.3125rem}}.popup-create-poll .caption{color:var(--secondary-text-color);font-weight:var(--font-weight-bold);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{font-size:.875rem;line-height:1.2;margin-top:.875rem}.popup-create-poll .btn-primary{width:94px}.popup-create-poll .menu-send{right:20px;top:54px}.popup-create-poll hr:not(.hide){display:block!important}.popup-forward .popup-container{height:40.625rem;max-height:min(40.625rem,100%);max-width:420px;padding:7px 0 0;width:420px}.popup-forward .popup-header{flex:0 0 auto;margin-bottom:7px;padding:0 1rem}@media only screen and (max-width:600px){.popup-forward .popup-header{padding-left:.8125rem}}.popup-forward .popup-title{flex-grow:1;height:100%;padding:0}.popup-forward .chatlist-container,.popup-forward .selector{display:flex;flex:1 1 auto;flex-direction:row;height:auto;overflow:hidden;width:100%}.popup-forward .selector-search-input{font-size:var(--font-size-20);height:100%;line-height:1;padding:.5rem 1.5rem;width:100%}@media only screen and (max-width:600px){.popup-forward .selector-search-input{padding-left:1.1875rem}}.popup-forward .selector .chatlist{margin-top:0!important}.popup-forward .gradient-delimiter{display:none}.popup-forward .sidebar-left-section{margin-bottom:0!important;padding-top:0!important}.popup-instance-deactivated{background-color:rgba(0,0,0,.6)}.popup-instance-deactivated .instance-deactivated-container{margin:auto;pointer-events:none;text-align:center}.popup-instance-deactivated .header{color:#fff;font-size:2rem}.popup-instance-deactivated .subtitle{color:#fff;font-size:1.5rem;line-height:var(--line-height);opacity:.6}.popup-join-chat-invite{-webkit-user-select:none;-moz-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:var(--font-weight-bold);line-height:var(--line-height);margin:.75rem 0 .25rem}.popup-join-chat-invite .chat-participants-count{color:var(--secondary-text-color);font-size:.875rem;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;user-select:none}.popup-report-messages-confirm .media-sticker-wrapper{height:100px;margin:0 auto;position:relative;width:100px}.popup-report-messages-confirm .popup-body{margin:1rem 0 .375rem;overflow:visible;overflow:initial}.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-call .popup-header{justify-content:space-between;width:100%}.popup-call .popup-title{flex:1 1 auto}.call{align-items:center;color:#fff;height:100%;width:100%}.call.is-full-screen,html.is-mobile .call{border-radius:0}.call.is-full-screen:not(.show-controls){cursor:none}.call.no-video .call-button,.call.no-video .call-button-text,.call.no-video .call-emojis,.call.no-video .call-party-state,.call.no-video .call-subtitle,.call.no-video .call-title,.call.no-video .popup-header,.call.show-controls .call-button,.call.show-controls .call-button-text,.call.show-controls .call-emojis,.call.show-controls .call-party-state,.call.show-controls .call-subtitle,.call.show-controls .call-title,.call.show-controls .popup-header{opacity:1}.call.show-controls .call-video{opacity:.8}.call.show-controls .call-video-blur{opacity:.56}.call .popup-header .btn-icon{color:#fff}.call .popup-header .call-emojis{margin-right:1rem;transform:scale(1.3125)}.call-avatar{border-radius:inherit;bottom:0;left:0;opacity:.7;position:absolute;right:0;top:0;z-index:-1}.call-avatar .avatar-full{font-size:6rem}.call-title{font-size:1.25rem;font-weight:var(--font-weight-bold)}.call-subtitle{font-size:1rem}.call .popup-header,.call-emojis,.call-subtitle,.call-title{opacity:0}body.animation-level-2 .call .popup-header,body.animation-level-2 .call-emojis,body.animation-level-2 .call-subtitle,body.animation-level-2 .call-title{transition:opacity var(--transition-standard-in)}.call-buttons{align-items:center;align-self:center;bottom:1.75rem;display:flex;pointer-events:none;position:absolute;z-index:1}.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 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 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(var(--call-button-size)*-.5 + var(--call-button-margin)*-.5))}.call-buttons.is-second{--margin-length:2}.call-buttons.is-second .call-button,.call-buttons.is-second .call-button-text{transform:translateX(calc(var(--call-button-size)*2 + var(--call-button-margin)*var(--margin-length)))}.call.no-screen .call-buttons.is-second{--margin-length:.656875}.call-button{background-color:hsla(0,0%,100%,.1)}.call-button-red{background-color:var(--danger-color)!important}.call-button-green{background-color:var(--gc-green-text-color)!important}.call-button.active{background-color:#fff!important}.call-button.active:before{color:#9e9e9e}.call-button,.call-button-text{opacity:0}.call-video{border-radius:inherit;height:100%;-o-object-fit:contain;object-fit:contain;opacity:1;position:absolute;width:100%}.call-video-container{align-items:center;background-color:#000;bottom:0;display:flex;left:0;position:absolute;right:0;top:0;z-index:-1}.call-video-container.small{border-radius:10px;bottom:8rem;cursor:pointer;left:auto;right:1rem;top:auto;z-index:1}.call-video-blur{border-radius:inherit;height:100%;opacity:.7;position:absolute;width:100%}body.animation-level-2 .call-video,body.animation-level-2 .call-video-blur{transition:opacity var(--transition-standard-in)}.call .call-emojis{transform:scale(1.125)}.call .call-emojis .emoji{margin:0 .125rem}.call-party-states{align-items:center;bottom:calc(4.25rem + var(--call-button-size));display:flex;flex-direction:column;padding:0 1rem;pointer-events:none;position:absolute;width:100%;z-index:2}.call-party-state{align-items:center;-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);background-color:hsla(0,0%,100%,.2);border-radius:1.625rem;color:#fff;display:flex;font-size:.875rem;font-weight:var(--font-weight-bold);height:1.625rem;line-height:1.625rem;margin-top:1rem;max-width:100%;opacity:0;padding:0 .625rem;transform:scale(0) translateY(0)}body.animation-level-2 .call-party-state{transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-party-state .rlottie-icon{flex:0 0 auto;height:1.875rem!important;margin-left:-.25rem;margin-right:.25rem;width:1.875rem!important}.call-party-state.is-visible:not(.backwards){transform:scale(1) translateY(0)}.call-party-state-text,.call-title{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.call.two-button-rows .call-buttons.is-first .call-button,.call.two-button-rows .call-buttons.is-first .call-button-text{transform:translateY(calc(var(--call-button-size)*-1 + var(--call-button-margin)*-1 + -1.125rem))}.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-group-call:not(.movable-element){top:7rem}.popup-group-call:not(.movable-element) .group-call{border-bottom-left-radius:0;border-bottom-right-radius:0}.popup-group-call .popup-body{justify-content:space-between}.popup-group-call .popup-container{background-color:var(--gc-background-color);color:var(--gc-primary-text-color)}.popup-group-call .popup{z-index:6}.group-call{--call-button-margin:1.25rem;height:100%;padding:0 .5rem;width:100%}.group-call:after{background:linear-gradient(180deg,rgba(33,33,33,0) 0,rgba(33,33,33,.65) 48.54%,var(--gc-background-color) 100%);bottom:0;content:" ";height:7.5rem;left:0;position:absolute;right:0}.group-call-header{height:3.5rem;margin-bottom:.125rem;padding:0 .5rem}.group-call-header .btn-icon{color:inherit;flex:0 0 auto}.group-call-header-info{flex:1 1 auto;margin-left:1.5rem;overflow:hidden}.group-call-header-title{font-weight:var(--font-weight-bold)}.group-call-header-subtitle,.group-call-header-title{font-size:var(--font-size-16);line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-header-subtitle{color:var(--gc-secondary-text-color);font-size:.875rem}.group-call-buttons{align-items:center;align-self:center;bottom:1.75rem;display:flex;justify-content:space-between;position:absolute;z-index:1}.group-call-button{background-color:var(--gc-button-unmuted-color);color:var(--gc-primary-text-color);opacity:1}.group-call[data-mic-state=muted] .group-call-button{background-color:var(--gc-button-muted-color)}.group-call[data-mic-state=hand] .group-call-button{background-color:var(--gc-button-hand-color)}.group-call:not(.is-big-layout)[data-mic-state=unmuted] .group-call-button{background-color:var(--gc-button-unmuted-fill-color)}.group-call-button-red{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{padding-right:.5rem}.group-call-participant-status-icon{display:inline-block;font-size:1.125rem;height:1.125rem;line-height:1;margin-right:6px;vertical-align:middle;width:1.125rem}.group-call-participant-status-container{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-participant .dialog-subtitle,.group-call-participant .dialog-title{padding-right:2.5rem}.group-call-participant-muted-icon-container{position:absolute!important;right:.5rem}.group-call-participant-video-container{align-items:center;background-color:#000;border-radius:10px;cursor:pointer;display:flex;flex:1 1 auto;height:15rem;margin:.25rem;overflow:hidden;position:relative;width:100%;width:33%}.group-call-participant-video-container:after{background:linear-gradient(180deg,transparent 55.62%,rgba(0,0,0,.5) 86.46%);bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.group-call-participant-video-container .group-call-participant-status-icon{font-size:1.25rem;height:1.25rem;width:1.25rem}.group-call-participant-video-container:after,.group-call-participant-video-header,.group-call-participant-video-info{opacity:0}body.animation-level-2 .group-call-participant-video-container:after,body.animation-level-2 .group-call-participant-video-header,body.animation-level-2 .group-call-participant-video-info{transition:opacity var(--transition-standard-in)}.group-call-participant-video-header,.group-call-participant-video-info{align-items:center;bottom:.25rem;display:flex;justify-content:space-between;left:0;padding:0 .5rem 0 .75rem;position:absolute;right:0;z-index:1}.group-call-participant-video-header{bottom:auto;justify-content:flex-end;padding-right:.75rem;padding-top:.875rem;top:0}.group-call-participant-video-header .group-call-pin-icon{font-size:1.5rem;height:1.5rem;width:1.5rem}.group-call-participant-video-info .peer-title{font-weight:var(--font-weight-bold)}.group-call-participant-video-info .peer-title,.group-call-participant-video-info-left{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-participant-video-info .group-call-participant-status-container{margin-top:-1px;opacity:.6}.group-call-participant-video-info-left{flex:1 1 auto}.group-call-participant-video-info-right{flex:0 0 auto;height:2rem;margin-left:.75rem;width:2rem}.group-call-participant .is-speaking{color:var(--gc-green-text-color)}.group-call-participant .is-waiting{color:var(--gc-blue-text-color)}.group-call-participants{border-radius:10px;flex:1 1 auto;overflow:hidden}.group-call-participants-scrollable{border-radius:inherit;height:auto;padding-bottom:6rem;position:relative}.group-call-participants-video-container{display:flex;flex-wrap:wrap;margin:-.25rem -.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="3"] .group-call-participant-video-container:nth-child(n+2),.group-call-participants-video-container[data-layout="4"] .group-call-participant-video-container{flex:1 0 auto;height:auto}.group-call-participants-video-container[data-layout="3"] .group-call-participant-video-container:nth-child(n+2):before,.group-call-participants-video-container[data-layout="4"] .group-call-participant-video-container: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-header,.group-call-participants-video-container.show-controls .group-call-participant-video-info{opacity:1}.group-call-participants .chatlist{background:none;margin:0 auto;max-width:600px;padding:0}.group-call-participants .user-title{color:var(--gc-primary-text-color)}.group-call-participants .user-last-message{color:var(--gc-secondary-text-color)}.group-call-big-video-container{position:relative}.group-call-big-video-container .group-call-participants-video-container{margin-bottom:.25rem;min-height:100%}.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,.group-call:not(.is-big-layout) .group-call-big-video-container,.group-call:not(.is-big-layout) .popup-body .group-call-header,.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:active,html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:hover{background-color:hsla(207,4%,46%,.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% - var(--gc-right-column-width))}.group-call.is-big-layout.is-right-column-shown .group-call-buttons{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{background-color:var(--gc-background-color);bottom:0;padding:inherit;position:absolute;right:calc(var(--gc-right-column-width)*-1);top:0;width:var(--gc-right-column-width)}.group-call.is-big-layout .group-call-buttons{bottom:2.5rem;padding:.75rem}body.animation-level-2 .group-call.is-big-layout .group-call-buttons{transition:opacity var(--transition-standard-in)}.group-call.is-big-layout .group-call-buttons:before{-webkit-backdrop-filter:blur(100px);backdrop-filter:blur(100px);background:rgba(0,0,0,.5);border-radius:1.25rem;bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.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 var(--transition-standard-in)}body.animation-level-2 .group-call.is-big-layout .group-call-buttons .group-call-button{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-sponsored .scrollable-y{margin:0 -1.5rem;max-height:25rem;padding:.5rem 1.5rem;position:relative;-webkit-user-select:text;-moz-user-select:text;user-select:text;width:calc(100% + 3rem)}.popup-mute .popup-container{min-width:16rem}.popup-reacted-list{--size:1.5rem;--custom-emoji-size:var(--size)}.popup-reacted-list .popup-container{height:600px;max-height:600px;padding:0;width:25rem}.popup-reacted-list .popup-header{border-bottom:1px solid var(--border-color);margin:0;min-height:3.5625rem;padding:.25rem .75rem .75rem}.popup-reacted-list .popup-close{height:40px;margin-right:.5rem;margin-top:.375rem;order:-1}.popup-reacted-list .reaction{--reaction-size:var(--size);--additional-height:.75rem;--margin:.5rem;--background-color:var(--light-filled-primary-color);--counter-color:var(--primary-color);flex:1 0 auto;justify-content:space-evenly}.popup-reacted-list .reaction.is-chosen:not(.backwards){--counter-color:#fff}.popup-reacted-list .reaction-sticker-icon{align-items:center;display:flex;font-size:1.25rem!important;margin:0}.popup-reacted-list .sidebar-left-section{margin-bottom:0!important}.popup-reacted-list .tabs-container{flex:1 1 auto;overflow:hidden}.popup-reacted-list .tabs-tab{background-color:var(--surface-color)}.popup-reacted-list .reacted-list-reaction-icon{display:flex;height:var(--size);position:absolute;right:1rem;top:50%;transform:translateY(-50%);width:var(--size)}.popup-reacted-list .chatlist-chat{padding-right:3.25rem!important}.popup-payment .popup-container{border-radius:16px;max-height:min(100%,43.5rem);max-width:26.25rem;padding:0;width:26.25rem}.popup-payment .popup-header{height:3.5rem;margin:0;padding:0 1rem}.popup-payment.is-loading .popup-container{min-height:26.25rem}.popup-payment .scrollable{display:flex;flex:1 1 auto;flex-direction:column}.popup-payment hr{display:block!important;margin:.5rem 0!important;padding:0!important}.popup-payment .input-field{--height:3rem;margin:.75rem .5rem 0}.popup-payment .input-field-input{--padding:.75rem}.popup-payment .input-fields-row .input-field{margin-top:1.25rem}.popup-payment .sidebar-left-section{padding:0!important}.popup-payment .sidebar-left-section-name+.input-field,.popup-payment .sidebar-left-section-name+.input-fields-row .input-field{margin-top:.75rem}.popup-payment .sidebar-left-section .row{margin-top:.5rem}.popup-payment .sidebar-left-section-content{margin:0 .5rem!important}.popup-payment .select-wrapper{box-shadow:var(--menu-box-shadow);max-height:10rem}.popup-payment .select-wrapper li{grid-template-columns:calc(26px + 2rem) 1fr;height:3rem}.popup-payment .payment-verification{border:none;flex:1 1 auto;height:40rem;max-height:100%;width:100%}.popup-payment .row{border-radius:10px}.payment-item{padding:0 1.25rem;width:100%}.payment-item-details{display:flex;flex:0 0 auto;justify-content:space-between;margin-bottom:1rem;overflow:hidden}.payment-item-details:last-child{margin-bottom:0}.payment-item-details-photo{border-radius:10px;flex:0 0 auto;height:6.25rem;margin-right:1rem;width:6.25rem}.payment-item-details-photo .media-photo{border-radius:inherit}.payment-item-details-lines{display:flex;flex:1 1 auto;flex-direction:column}.payment-item-details-lines-title{font-size:var(--font-size-16);font-weight:var(--font-weight-bold);line-height:var(--line-height-16)}.payment-item-details-lines-bot-name,.payment-item-details-lines-description{font-size:var(--font-size-14);line-height:1.25rem}.payment-item-details-lines-bot-name{color:var(--secondary-text-color)}.payment-item-prices{display:flex;flex-direction:column;margin:1rem .25rem .5rem}.payment-item-prices-price{color:var(--secondary-text-color);display:flex;font-weight:500;justify-content:space-between;line-height:1.1875rem}.payment-item-prices-price+.payment-item-prices-price{margin-top:1.5rem}.payment-item-prices-price.is-total{color:var(--primary-text-color)}.payment-item-tips{display:flex;justify-content:space-between;margin:.75rem -.5rem 1.5rem}.payment-item-tips-tip{--background-intensity:.1;background-color:rgba(84,190,97,var(--background-intensity));border-radius:1.25rem;color:#3ba748;flex:1 1 auto;font-size:var(--font-size-16);font-weight:var(--font-weight-bold);height:2.5rem;line-height:2.5rem;text-align:center}body.animation-level-2 .payment-item-tips-tip{transition:color .1s ease-in-out,background-color .1s ease-in-out}.payment-item-tips-tip+.payment-item-tips-tip{margin-left:.5rem}html.no-touch .payment-item-tips-tip:not(.active):active,html.no-touch .payment-item-tips-tip:not(.active):hover{--background-intensity:.3}.payment-item-tips-tip.active{--background-intensity:1;color:#fff}.payment-item-tips-input{color:inherit!important;display:inline;font-weight:inherit!important}.payment-item-row{margin:0 .5rem;padding-bottom:0;padding-top:0}.payment-item-method-row .media-photo{border-radius:10px}.payment-item-pay{flex:0 0 auto;height:3rem;margin:1rem;text-transform:uppercase;width:auto}.payment-item-preloader-container{flex:1 1 auto;position:relative}.popup-payment-shipping-methods .popup-container{min-height:auto}.popup-payment-shipping-methods .row{margin-top:0!important}.popup-payment-verification .popup-header:after{background-color:var(--border-color);bottom:-1px;content:" ";height:1px;left:0;position:absolute;right:0}.popup-payment-card-confirmation .popup-container{min-height:auto}.popup-payment-card-confirmation .input-field-password{margin-top:.5rem!important}.popup-limit .popup-container{min-width:min(100%,22.5rem)}.popup-limit-line{align-items:center;display:flex;flex-direction:column;margin:.75rem 0}.popup-limit-hint{align-items:center;color:#fff;display:flex;font-weight:var(--font-weight-bold);justify-content:center;transform:scale(.6) translate(-280px,16px) rotate(-30deg)}body.animation-level-2 .popup-limit-hint{transition:transform .3s cubic-bezier(.12,1.1,.56,1.2)}.popup-limit-hint.active{transform:scale(1) translate(0) rotate(0)}.popup-limit-hint-icon{display:flex;font-size:1.25rem;margin-right:.25rem}.popup-limit-button.primary{align-items:center;background:linear-gradient(88.39deg,#6c93ff -2.56%,#976fff 51.27%,#df69d1 107.39%);color:#fff!important;display:flex}.popup-limit-button-icon{display:flex;font-size:1.5rem;margin-left:.625rem}.popup-limit .limit-line{align-self:stretch;margin:1rem .5rem 0}.popup-limit:not(.is-locked) .popup-limit-hint{background:linear-gradient(73.4deg,#6c93ff -7.21%,#976fff 114.57%,#df69d1 241.52%);background-size:200px 2rem;border-radius:1rem;height:2rem;padding:0 .75rem;position:relative}.popup-limit:not(.is-locked) .popup-limit-hint:after{background:inherit;background-position-x:calc(-50% - 86px);background-repeat:no-repeat;background-size:inherit;bottom:-9px;-webkit-clip-path:path("M0 0H26H24.4853C22.894 0 21.3679 0.632141 20.2426 1.75736L14.4142 7.58579C13.6332 8.36684 12.3668 8.36683 11.5858 7.58579L5.75736 1.75736C4.63214 0.632139 3.10602 0 1.51472 0H0Z");clip-path:path("M0 0H26H24.4853C22.894 0 21.3679 0.632141 20.2426 1.75736L14.4142 7.58579C13.6332 8.36684 12.3668 8.36683 11.5858 7.58579L5.75736 1.75736C4.63214 0.632139 3.10602 0 1.51472 0H0Z");content:" ";display:block;height:9px;left:50%;margin-left:-13px;position:absolute;width:100%}.popup-limit.is-locked .popup-limit-hint{background-color:var(--primary-color);border-radius:1.375rem;height:2.75rem;margin-right:-.25rem;padding:0 1.25rem 0 1rem}.popup-limit.is-premium .popup-limit-hint{align-self:flex-end;background:linear-gradient(84.4deg,#6c93ff -4.85%,#976fff 51.72%,#df69d1 110.7%);background-position-x:100%;background-size:200px 2rem;border-bottom-right-radius:0;margin-right:.5rem}body.animation-level-2 .popup-limit.is-premium .popup-limit-hint{transition:transform .3s cubic-bezier(.12,1.1,.56,1.1)}.popup-limit.is-premium .popup-limit-hint:after{background-position-x:134%;bottom:-11.3px;-webkit-clip-path:path("M8.44528 0.5H20.5V10.1943C20.5 10.9154 19.9154 11.5 19.1943 11.5C18.8178 11.5 18.4597 11.3375 18.2117 11.0541L10.2274 1.92918C9.75146 1.38523 9.18812 0.924478 8.56057 0.565879L8.44528 0.5Z");clip-path:path("M8.44528 0.5H20.5V10.1943C20.5 10.9154 19.9154 11.5 19.1943 11.5C18.8178 11.5 18.4597 11.3375 18.2117 11.0541L10.2274 1.92918C9.75146 1.38523 9.18812 0.924478 8.56057 0.565879L8.44528 0.5Z");height:12px;left:100%;margin-left:-20.6px}#auth-pages{background:var(--surface-color);max-width:100%;overflow:hidden}#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;padding:0 16px;width:100%}}#auth-pages .auth-image,#auth-pages .input-wrapper,#auth-pages .subtitle{flex:0 0 auto}#auth-pages>.scrollable{display:flex;flex-direction:column;margin:0 auto;max-width:720px;position:relative}#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{margin:0 auto;max-width:720px;min-width:auto;position:relative}#auth-pages .tabs-container .tabs-tab{background-color:var(--surface-color)}#auth-pages .tabs-container .tabs-tab .container{display:flex;flex:1 1 auto;flex-direction:column;height:810px;padding:0;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-bottom:.5rem;margin-top:.5rem}.page-sign .auth-image,.page-signUp .auth-image{height:7.5rem;margin-bottom:1.5rem;width:7.5rem}@media only screen and (min-width:601px){.page-sign .auth-image,.page-signUp .auth-image{height:10rem;margin-bottom:1.5rem;width:10rem}}.page-authCode .phone-wrapper{flex:0 0 auto}.sign-logo{fill:var(--primary-color);max-height:100%;max-width:100%}.page-sign .btn-secondary,.page-signQR .btn-secondary{font-weight:400}.page-sign .qr,.page-signQR .qr{margin-top:1.5rem}.page-signQR{overflow:visible!important;overflow:initial!important}.page-signQR .auth-image{align-items:center;display:flex;height:240px!important;justify-content:center;width:240px!important}.page-signQR .auth-image .preloader{left:auto;top:auto;transform:none}.page-signQR .auth-image .qr-canvas{height:100%;width: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}[dir=ltr] .page-signQR .qr-description{text-align:left}[dir=rtl] .page-signQR .qr-description{text-align:right}.page-signQR .qr-description{line-height:var(--line-height);margin:1rem auto;max-width:480px}.page-signQR .qr-description li{margin-top:.5rem}.page-signUp .auth-image{margin-bottom:14px;margin-top:10px}@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 var(--transition-standard-in)}.page-authCode .auth-image{transform:translateY(12px)}.page-authCode .phone-wrapper{align-items:center;display:flex;justify-content:center;margin:1.375rem 0 .875rem}.page-authCode .phone-wrapper h4[contenteditable]{border:none;border-bottom:2px solid var(--primary-color);outline:none;padding:0 1rem}.page-authCode .phone-wrapper .phone.error{border-color:var(--danger-color)!important}.page-authCode .phone-wrapper .phone{margin:0}.page-authCode .subtitle{margin:0 auto!important;max-width:300px}.page-chats{display:flex;max-width:1682px!important}.page-chats .avatar-edit .tgico-cameraadd{top:52%}.page-chats #main-columns{height:100%;max-height:100%;min-height:100%;overflow:hidden;position:relative;width:100%}@media only screen and (max-width:600px){.page-chats .main-column{display:flex!important;width:100%;z-index:1}}@media only screen and (min-width:601px){.page-chats #column-center{background-color:#e6ebee;display:flex!important;width:100%}.page-chats #column-right{display:flex!important}.page-chats .main-column{height:100%;max-height:100%;min-height:100%;position:relative}.page-chats #main-columns{display:flex}}.page-chats #search-container,.page-chats .sidebar-search{flex-direction:column;height:100%;left:0;max-height:100%;overflow:hidden;position:absolute;top:0;width:100%;z-index:3}@media only screen and (min-width:1681px){.page-chats{border-color:var(--border-color);border-style:solid;border-width:0 1px}}.page-chats .avatar-edit{flex:0 0 auto;height:120px;margin:1rem auto 2rem;width:120px}body.animation-level-2 .page-chats .main-column{transition:transform var(--tabs-transition),filter var(--tabs-transition)}body,html{height:100%;margin:0;overflow:hidden;padding:0;width:100%}@media only screen and (max-width:600px){body,html{height:calc(var(--vh, 1vh)*100)}}html.is-ios{-webkit-touch-callout:none;position:fixed;-webkit-user-select:none}html.no-backdrop{--menu-background-color:var(--surface-color);--menu-backdrop-filter:none}@supports(padding:max(0px)){html{padding:0 min(16px,env(safe-area-inset-right)) 0 min(16px,env(safe-area-inset-left))}}html{-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);font-size:16px}body{background-color:var(--body-background-color);color:var(--primary-text-color)}body.deactivated{animation:grayscale-in var(--transition-standard-in) forwards}body.deactivated-backwards{animation:grayscale-out var(--transition-standard-out) forwards}@keyframes grayscale-in{0%{filter:grayscale(0)}to{filter:grayscale(1)}}@keyframes grayscale-out{0%{filter:grayscale(1)}to{filter:grayscale(0)}}a{color:var(--link-color)}button,html,input,optgroup,select,textarea{font-family:Roboto,-apple-system,apple color emoji,BlinkMacSystemFont,Segoe UI,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif}a,button,div,input,select,textarea{-webkit-tap-highlight-color:rgba(0,0,0,0)}code,kbd,pre,samp{font-family:var(--font-monospace)}.whole{height:100%;margin:0 auto;max-width:1680px;min-height:100%;width: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:var(--font-weight-bold)}h4{font-size:2rem;line-height:110%;margin:22px 0 14px}@media only screen and (max-width:600px){h4{font-size:20px;margin:2px 0 8px}}[contenteditable=true],input{background-color:transparent;caret-color:var(--primary-color);color:var(--primary-text-color)}input,textarea{-webkit-appearance:none}input::-webkit-contacts-auto-fill-button,input::-webkit-credentials-auto-fill-button{position:absolute;right:0;visibility:hidden}input:-webkit-autofill:first-line{font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,Helvetica Neue,Arial;font-size:16px}.subtitle{color:var(--secondary-text-color);line-height:1.35}.danger{color:var(--danger-color)!important}.danger .c-ripple__circle{background-color:var(--light-danger-color)}.blue,.primary{color:var(--primary-color)!important}.blue .c-ripple__circle,.primary .c-ripple__circle{background-color:var(--light-primary-color)}.primary-text{color:var(--primary-text-color)!important}.color-premium{-webkit-text-fill-color:transparent;background:var(--premium-gradient);-webkit-background-clip:text}.blue:before,.danger:before,.primary:before{color:inherit!important}.bg-warning{background:#fed85a!important}.contextmenu{bottom:auto!important;position:fixed!important;right:auto!important;width:auto!important;z-index:4!important}.preloader{height:50px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:50px}.preloader .preloader-path{stroke:var(--primary-color)}@keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-in-backwards-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-out-backwards-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}.toast{-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);background-color:rgba(0,0,0,.66);border-radius:10px;color:#fff;font-size:1rem;left:50%;max-width:min(30rem,calc(100vw - 2rem));opacity:0;padding:.5rem 1rem;position:fixed;top:50%;transform:translate(-50%,-50%);z-index:5}.toast.is-visible{opacity:1}body.animation-level-2 .toast{transition:opacity var(--transition-standard-in)}.toast b{color:inherit}.toast a{color:#60a5e9!important;cursor:pointer}hr{border:none;border-top:1px solid var(--border-color);margin:0;padding-bottom:.5rem;width:100%}b{font-weight:var(--font-weight-bold)}.avatar-edit{border-radius:50%;cursor:pointer;overflow:hidden;position:relative}.avatar-edit.is-forum{border-radius:var(--avatar-border-radius-forum)}.avatar-edit-canvas{background:linear-gradient(var(--avatar-color-top),var(--avatar-color-bottom));height:100%;max-height:100%;max-width:100%;width:100%}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{color:#fff;font-size:3rem;height:3rem;left:50%;line-height:1;position:absolute;top:50%;transform:translateY(-50%) translateX(-50%);width:3rem;z-index:2}.avatar-edit .avatar-placeholder{filter:brightness(.7);height:100%;left:0;position:absolute;top:0;width:100%}.missing-icon{height:1.5rem;width:1.5rem}.missing-icon-path{fill:currentColor}.select-wrapper{background-color:var(--surface-color);border-radius:10px;display:flex;flex-direction:column;flex-wrap:wrap;left:0;max-height:23.5rem;opacity:0;overflow:hidden;position:absolute;top:calc(100% + .5rem);transform:scale(.95);transform-origin:top center;transition:opacity .2s ease-out,transform .2s ease-out;width:100%;z-index:3}.select-wrapper.active{opacity:1;transform:scale(1)}.select-wrapper ul{margin:.5rem 0}[dir=ltr] .select-wrapper li{text-align:left}[dir=rtl] .select-wrapper li{text-align:right}.select-wrapper li{align-items:center;cursor:pointer;display:grid;grid-template-columns:calc(26px + 2rem) 1fr 80px;height:3.5rem;justify-content:space-between;padding:0 1rem}html.no-touch .select-wrapper li:active,html.no-touch .select-wrapper li:hover{background-color:var(--light-secondary-text-color)}.select-wrapper .emoji{font-size:26px;height:26px;line-height:1;width:26px}.select-wrapper .scrollable{position:relative}[dir=ltr] .phone-code{text-align:right}[dir=rtl] .phone-code{text-align:left}.phone-code{color:#9e9e9e}.auth-image{height:166px;margin:0 auto 18px;position:relative;width:166px}@media only screen and (max-width:600px){.auth-image{height:120px;width:120px}}[dir=ltr] .phone-edit{margin-left:.4rem}[dir=rtl] .phone-edit{margin-right:.4rem}.phone-edit{cursor:pointer;font-size:1.5rem;height:1.5rem;line-height:1;opacity:.5;transition:opacity .2s;width:1.5rem}html.no-touch .phone-edit:active,html.no-touch .phone-edit:hover{opacity:1}span.emoji{display:inline!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;vertical-align:baseline!important;vertical-align:initial!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[dir=ltr]:not(.is-safari) span.emoji{margin-right:5px!important}html[dir=rtl]:not(.is-safari) span.emoji{margin-left:5px!important}html[dir=ltr]:not(.is-safari) avatar-element span.emoji{margin-right:0!important}html[dir=rtl]:not(.is-safari) avatar-element span.emoji{margin-left:0!important}}img.emoji{display:inline-block;height:18px;max-height:100%;max-width:100%;vertical-align:middle;width:18px}[contenteditable=true]{cursor:text;outline:none;-webkit-user-select:text;-moz-user-select:text;user-select:text;white-space:pre-wrap}[contenteditable=true] .custom-emoji{display:inline-block;margin-bottom:-2px}[contenteditable=true] .custom-emoji:before{content:none}[contenteditable=true] [style*=markup]{font-family:inherit!important}[contenteditable=true] [style*=bold]{font-weight:700}[contenteditable=true] [style*=italic]{font-style:italic}[contenteditable=true] [style*=underline]{text-decoration-line:underline}[contenteditable=true] [style*=strikethrough]{text-decoration-line:line-through}[contenteditable=true] [style*=underline][style*=strikethrough]{text-decoration-line:underline line-through}[contenteditable=true] [style*=monospace]{font-family:var(--font-monospace)!important}[contenteditable=true] [style*=spoiler]{background-color:var(--spoiler-draft-background-color)}[contenteditable][data-placeholder]:before{color:#a2acb4;content:attr(data-placeholder);display:block;opacity:0;pointer-events:none;position:absolute}body.animation-level-2 [contenteditable][data-placeholder]:before{transform:translateX(1.75rem);transition:opacity var(--input-transition) .01s,transform var(--input-transition) .01s}[contenteditable][data-placeholder]:empty:before{opacity:1}body.animation-level-2 [contenteditable][data-placeholder]:empty:before{transform:translateX(0)}.sticky_sentinel{left:0;pointer-events:none;position:absolute;right:0;visibility:hidden}.super-stickers{display:grid;grid-template-columns:repeat(auto-fill,var(--esg-sticker-size));justify-content:space-between;width:100%}html.no-touch .super-sticker:active,html.no-touch .super-sticker:hover{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{cursor:pointer;padding-bottom:13px;padding-top:13px;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (min-width:601px){[dir=ltr] .show-more{padding-left:8px}[dir=rtl] .show-more{padding-right:8px}}[dir=ltr] .show-more .tgico-down{padding-left:1rem;padding-right:2rem}[dir=rtl] .show-more .tgico-down{padding-left:2rem;padding-right:1rem}.show-more .tgico-down{float:left;font-size:24px}.content-empty,.show-more .tgico-down{color:var(--secondary-text-color)}::-moz-selection{background:var(--selection-background-color)}.selection:after,::selection{background:var(--selection-background-color)}.selection:after{bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.input-something{display:inline-block}.input-selectable{position:relative}@keyframes grow-icon{0%{opacity:.8;transform:scale(.5)}50%{opacity:1;transform:scale(1.1)}to{transform:scale(1)}}@keyframes hide-icon{0%{opacity:.4;transform:scale(1)}to{opacity:0;transform:scale(.5)}}.popup-disable-password .popup-description,.popup-skip-email .popup-description{max-width:284px}.grid{grid-gap:.25rem;display:grid;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr);width:100%}.grid-item{cursor:pointer;height:0;padding-bottom:100%;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.grid-item-media{height:100%;left:0;-o-object-fit:cover;object-fit:cover;position:absolute;top:0;width:100%}.animated-super-row{--translateY:100%;bottom:0;left:0;position:absolute;right:0;top:0;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{bottom:0;left:0;position:absolute;right:0;top:0}middle-ellipsis-element{display:block;overflow:hidden;width:100%}.album-item-media{height:100%;width:100%}html.no-touch .hover-effect:active,html.no-touch .hover-effect:hover{background-color:var(--light-secondary-text-color)}.progress-ring{left:0;pointer-events:none;position:absolute;top:0}.progress-ring__circle{stroke-linecap:round;transition:stroke-dashoffset}.rlottie,.rlottie-vector{bottom:0;height:100%;left:0;max-height:100%;max-width:100%;position:absolute;right:0;top:0;width:100%}.rlottie-icon{pointer-events:none;position:relative}body.animation-level-2 .rlottie.fade-in{animation:fade-in-opacity .2s ease-in-out forwards}.rlottie-vector{fill:rgba(0,0,0,.08)}.canvas-thumbnail{height:100%;position:absolute;width:100%}.media-container-contain{position:relative}.media-container-contain .media-photo{max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain}.media-container-cover{position:relative}.media-container-cover .media-photo{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.media-photo,.media-poster,.media-round,.media-sticker,.media-video{bottom:0;left:0;position:absolute;right:0;top:0}body.animation-level-2 .media-photo.fade-in,body.animation-level-2 .media-poster.fade-in,body.animation-level-2 .media-round.fade-in,body.animation-level-2 .media-sticker.fade-in,body.animation-level-2 .media-video.fade-in{animation:fade-in-opacity .2s ease-in-out forwards}body.animation-level-2 .media-photo.fade-out,body.animation-level-2 .media-poster.fade-out,body.animation-level-2 .media-round.fade-out,body.animation-level-2 .media-sticker.fade-out,body.animation-level-2 .media-video.fade-out{animation:fade-out-opacity .2s ease-in-out forwards}.media-video{z-index:1}.media-sticker{height:100%;margin:auto;max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain;width:100%}.media-sticker-wrapper.is-premium-sticker:before{align-items:center;background:rgba(0,0,0,.2);background-image:var(--lock-url);background-repeat:no-repeat;background-size:cover;border-radius:50%;bottom:.125rem;color:#fff;display:flex;height:1.25rem;justify-content:center;left:50%;position:absolute;transform:translateX(-50%);width:1.25rem;z-index:1}body.is-premium .media-sticker-wrapper.is-premium-sticker:after,body.is-premium .media-sticker-wrapper.is-premium-sticker:before{content:none}.media-round{max-height:var(--round-video-size);max-width:var(--round-video-size);z-index:1}.media-round canvas{border-radius:50%;height:100%;position:relative;width:100%}.media-round .video-time{background-color:var(--message-highlightning-color)!important;padding:0 .375rem}[dir=ltr] .media-round .video-time:after,[dir=ltr] .media-round .video-time:before{margin-left:.25rem}[dir=rtl] .media-round .video-time:after,[dir=rtl] .media-round .video-time:before{margin-right:.25rem}.media-round.is-unread .video-time:before{background-color:#fff;border-radius:50%;content:" ";height:.5rem;order:1;width:.5rem}.media-round.is-paused .video-time:after{align-items:center;content:"๎ฆƒ";display:flex;font-size:1.125rem;order:2}.gradient-delimiter{background-color:var(--background-color-true);height:.75rem;position:relative;width:100%}.gradient-delimiter:before{background:linear-gradient(180deg,rgba(0,0,0,.06),transparent 20%,transparent 94%,rgba(0,0,0,.06));bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.sidebar-left-section{background-color:var(--surface-color);box-shadow:0 1px 3px 0 var(--section-box-shadow-color);margin-bottom:.75rem;padding:.5rem 0!important}.sidebar-left-section.no-shadow{box-shadow:none!important}.sidebar-left-section-name{padding:.5rem 1rem}.sidebar-left-section-caption{font-size:var(--font-size-14);line-height:var(--line-height-14);margin:-.1875rem 0 1rem;padding:0 1.5rem}.sidebar-left-section-caption:first-child{margin-bottom:.8125rem;margin-top:.8125rem}@media only screen and (max-width:600px){.sidebar-left-section-caption{padding:0 1rem}}.sidebar-left-section-container{-webkit-user-select:none;-moz-user-select:none;user-select:none}.sidebar-left-section-container a{cursor:pointer}hr{display:none!important}.tgico-admin:before,.tgico-fontsize:before{font-size:20px!important;padding:2px}.tgico-endcall_filled,.tgico-phone_filled{font-size:26px!important}.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}.navigable-list .active{background-color:var(--light-secondary-text-color);border-radius:inherit}.super-emojis{--esg-emoji-total-size:calc(var(--esg-emoji-size) + 0.5rem);--custom-emoji-size:var(--esg-emoji-size);grid-column-gap:2.44px;--esg-emoji-size:2.125rem;--esg-emoji-total-size:2.625rem;--custom-emoji-size:2.25rem;-moz-column-gap:2.44px;column-gap:2.44px;-moz-column-gap:.25rem;column-gap:.25rem;display:grid;font-size:var(--esg-emoji-size);grid-template-columns:repeat(auto-fill,var(--esg-emoji-total-size));justify-content:space-between;line-height:var(--esg-emoji-size);position:relative}.super-emojis .super-emoji{border-radius:8px;cursor:pointer;display:inline-block;height:var(--esg-emoji-total-size);line-height:inherit;margin-left:.0625rem;margin-right:.0625rem;padding:.25rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;width:var(--esg-emoji-total-size)}.super-emojis .super-emoji .emoji-placeholder{background-color:var(--light-secondary-text-color);border-radius:50%;height:1.75rem;left:7px;pointer-events:none;position:absolute;top:7px;width:1.75rem}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{height:100%;margin:0;vertical-align:baseline;vertical-align:initial;width:100%}.super-emojis .super-emoji.active,html.no-touch .super-emojis .super-emoji:active,html.no-touch .super-emojis .super-emoji:hover{background-color:var(--light-secondary-text-color)}.super-emojis.not-local .super-emoji{padding:.1875rem}.super-emojis .super-emoji{margin:0}.super-emojis:not(.not-local) .super-emoji{overflow:hidden}html.native-emoji .super-emojis:not(.not-local) .super-emoji{padding-bottom:.3125rem;padding-top:.3125rem}.super-emojis .custom-emoji{display:block}.super-emojis .custom-emoji-renderer{z-index:1}.super-emojis .custom-emoji:before{content:none}.tgico-char:before{font-family:Roboto!important;font-weight:var(--font-weight-bold);text-align:center;width:1.5rem}.tgico-char.z:before{content:"Z"}.tgico-char.w:before{content:"W"}.sending-status:empty{display:none}.sending-status .tgico-sendingerror{color:var(--danger-color)}.sending-status-icon{line-height:1!important;position:absolute}.quick-reaction-title{align-items:center;display:flex}.quick-reaction-sticker{height:32px!important;margin:0 .5rem 0 0!important;position:relative!important;width:32px!important}.verified-icon-svg{height:1rem;width:1rem}.verified-icon-check{fill:#fff}.verified-icon-background{fill:var(--primary-color)}[dir=ltr] .emoji-status,[dir=ltr] .premium-icon,[dir=ltr] .verified-icon{margin-left:.125rem}[dir=rtl] .emoji-status,[dir=rtl] .premium-icon,[dir=rtl] .verified-icon{margin-right:.125rem}.emoji-status,.premium-icon,.verified-icon{align-items:center;display:flex;flex:0 0 auto;font-size:1rem;height:1.25rem;justify-content:center;width:1.25rem}[dir=ltr] .emoji-status{margin-left:.25rem}[dir=rtl] .emoji-status{margin-right:.25rem}.emoji-status{height:1.125rem;position:relative;width:1.125rem}.premium-icon{color:var(--primary-color);margin-top:-.0625rem}.badge-fake{border:1px solid var(--danger-color);border-radius:.185rem;color:var(--danger-color);flex:0 0 auto;font-size:.625rem;font-weight:var(--font-weight-bold);line-height:1!important;margin-left:.25rem;margin-right:.25rem;padding:.125rem .25rem}.peer-title.with-icons{align-items:center;display:flex;overflow:hidden}.peer-title-inner{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.limit-line{display:flex;font-weight:var(--font-weight-bold);height:2rem}.limit-line-free{color:#000}.limit-line-premium{color:#fff}.limit-line-free{background-color:#f1f3f5;border-bottom-left-radius:10px;border-top-left-radius:10px}.limit-line-premium{background:linear-gradient(84.4deg,#6c93ff -4.85%,#976fff 51.72%,#df69d1 110.7%);border-bottom-right-radius:10px;border-top-right-radius:10px}.limit-line-free,.limit-line-premium{align-items:center;display:flex;flex:1 1 0;justify-content:space-between;padding:0 .75rem}.movable-element{--size:.5rem;position:relative}.movable-element-resize-handler{position:absolute}.movable-element-resize-handler-side-n,.movable-element-resize-handler-side-s{cursor:row-resize;height:var(--size);left:0;right:0}.movable-element-resize-handler-side-e,.movable-element-resize-handler-side-w{bottom:0;cursor:col-resize;top:0;width:var(--size)}.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-ne,.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-se,.movable-element-resize-handler-side-sw{height:var(--size);width: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-nw,.movable-element-resize-handler-side-se{cursor:nwse-resize}.movable-element-resize-handler-side-ne{right:0;top:0}.movable-element-resize-handler-side-se{bottom:0;right:0}.movable-element-resize-handler-side-sw{bottom:0;left:0}.movable-element-resize-handler-side-nw{left:0;top:0}[dir=ltr] .chatlist-chat.row-with-padding{padding-left:4.5rem!important}[dir=rtl] .chatlist-chat.row-with-padding{padding-right:4.5rem!important}.chatlist-chat span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chatlist-chat .row-title{font-size:var(--font-size-16)!important;line-height:1.375rem}.chatlist-chat .row-title-right-secondary{font-size:var(--font-size-12)!important;line-height:var(--line-height-12)!important;margin-top:-.4375rem}.chatlist-chat .row-subtitle{display:block!important}.chatlist-chat .row-row{height:1.375rem}.chatlist-chat.chatlist-chat-abitbigger .row-subtitle{margin-top:0}.chatlist-chat.chatlist-chat-bigger .row-subtitle{font-size:var(--font-size-16)!important;line-height:1.375rem;margin-top:0}.chatlist-chat.chatlist-chat-bigger .row-subtitle-row{margin-top:.125rem}.chatlist-chat.chatlist-chat-bigger .row-title .peer-title{font-weight:var(--font-weight-bold)}.username-purchase-help b{color:var(--danger-color)!important;font-weight:var(--font-weight-normal)!important}.media-spoiler-container{border-radius:inherit;bottom:0;left:0;position:absolute;right:0;top:0;z-index:1}.media-spoiler-container.is-revealing{opacity:1}.media-spoiler-container.is-revealing:not(.backwards){opacity:0}.media-spoiler-container.is-revealing.animating{transition:opacity var(--transition-standard-out)}.media-spoiler .canvas-thumbnail,.media-spoiler-thumbnail{height:100%;-o-object-fit:initial!important;object-fit:fill!important;position:absolute;width:100%} -/*# sourceMappingURL=main.57462bdb2faa73d01185.css.map*/ \ No newline at end of file +/*# sourceMappingURL=main.e77b88e634966721e48d.css.map*/ \ No newline at end of file diff --git a/public/main.e77b88e634966721e48d.css.map b/public/main.e77b88e634966721e48d.css.map new file mode 100644 index 00000000..e43b86d4 --- /dev/null +++ b/public/main.e77b88e634966721e48d.css.map @@ -0,0 +1 @@ +{"version":3,"file":"main.e77b88e634966721e48d.css","mappings":"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","sources":["webpack://tweb/./src/materialize.scss","webpack://tweb/./src/scss/style.scss"],"sourcesContent":["/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;line-height:1.15}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{-webkit-text-decoration-skip:objects;background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted currentColor;text-decoration:underline dotted currentColor}b,strong{font-weight:inherit;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:-.25em}sup{top:-.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}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-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}[hidden],template{display:none}html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}ul:not(.browser-default){list-style-type:none;padding-left:0}ul:not(.browser-default)>li{list-style-type:none}a{-webkit-tap-highlight-color:rgba(0,0,0,0)}button{background:none;border:none;cursor:pointer;outline:none;padding:0}img,video{-webkit-user-drag:none}.valign-wrapper{align-items:center;display:flex}.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;user-select:none}.no-transition,.no-transition:after,.no-transition:before{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{left:50%;position:absolute!important;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-wrap{white-space:nowrap!important}.no-border-radius{border-radius:0!important}.disable-hover{pointer-events:none!important}.reflect-x{transform:scaleX(-1)}[dir=auto]{unicode-bidi:plaintext}.is-rtl [dir=auto]{direction:inherit}a{text-decoration:none}html{font-weight:400;line-height:1.5}h1,h2,h3,h4,h5,h6{line-height:1.3}em{font-style:italic}strong{font-weight:500}small{font-size:75%}code,pre{word-wrap:break-word;white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap}",":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:.2s ease-in-out;--btn-menu-transition:.2s cubic-bezier(.4,0,.2,1);--esg-transition:var(--btn-menu-transition);--input-transition:.2s ease-out;--sticker-viewer-open-transition-in:.2s var(--transition-standard-easing);--sticker-viewer-open-transition-out:.2s var(--transition-standard-easing);--sticker-viewer-switch-transition:.2s cubic-bezier(.12,1.1,.56,1.2);--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:.25s cubic-bezier(.35,.35,.47,1.34);--chatlist-badge-transition-out:.25s 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) + 0.5rem)*-1);--message-time-background:rgba(0,0,0,.35);--message-highlightning-color:rgba(109,141,65,.4);--messages-container-width:728px;--messages-text-size:16px;--messages-line-height:1.3125;--messages-secondary-text-size:calc(var(--messages-text-size) - 2px);--messages-secondary-line-height:calc(var(--messages-secondary-text-size) + 4px);--messages-time-text-size:calc(var(--messages-text-size) - 4px);--messages-service-text-size:calc(var(--messages-text-size) - 1px);--messages-custom-emoji-size:calc(var(--messages-text-size) + 4px);--bubble-transition-in:transform var(--transition-standard-in),opacity var(--transition-standard-in);--bubble-transition-out:transform var(--transition-standard-out),opacity var(--transition-standard-out);--line-height-20:26px;--line-height-16:21px;--line-height-14:18px;--line-height-12:16px;--line-height:1.3125;--font-size-20:20px;--font-size-16:16px;--font-size-14:14px;--font-size-12:12px;--font-size:var(--font-size-16);--esg-sticker-size:72px;--esg-custom-emoji-size:36px;--popup-sticker-size:80px;--disabled-opacity:.3;--round-video-size:280px;--menu-box-shadow:0px 0px 10px var(--menu-box-shadow-color);--menu-backdrop-filter:blur(50px);--font-monospace:\"Roboto Mono\",monospace;--font-weight-bold:500;--font-weight-normal:400;--selection-background-color:rgba(var(--primary-color-rgb),.4);--selection-color:inherit;--topbar-floating-scaleX:1;--topbar-call-height:3rem;--topbar-floating-call-height:0px;--call-button-size:3.375rem;--call-button-margin:2rem;--custom-emoji-size:1.25rem;--esg-width:100%;--peer-avatar-red-top:#ff845e;--peer-avatar-red-bottom:#d45246;--peer-avatar-orange-top:#febb5b;--peer-avatar-orange-bottom:#f68136;--peer-avatar-violet-top:#b694f9;--peer-avatar-violet-bottom:#6c61df;--peer-avatar-green-top:#9ad164;--peer-avatar-green-bottom:#46ba43;--peer-avatar-cyan-top:#53edd6;--peer-avatar-cyan-bottom:#28c9b7;--peer-avatar-blue-top:#5bcbe3;--peer-avatar-blue-bottom:#359ad4;--peer-avatar-pink-top:#ff8aac;--peer-avatar-pink-bottom:#d95574;--peer-avatar-archive-top:#b8c2cc;--peer-avatar-archive-bottom:#9eaab5;--peer-avatar-saved-top:var(--light-filled-saved-color);--peer-avatar-saved-bottom:var(--saved-color);--avatar-color-top:var(--peer-avatar-saved-top);--avatar-color-bottom:var(--peer-avatar-saved-bottom);--avatar-border-radius-forum:37%;--premium-gradient:linear-gradient(52.62deg,#6b93ff 12.22%,#976fff 50.25%,#e46ace 98.83%)}@media only screen and (max-width:600px){:root{--right-column-width:100vw;--esg-sticker-size:68px;--popup-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:420px;--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-height:570px)and (min-width:601px){:root{--esg-width:23.875rem}}@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;--scrollbar-color:rgba(0,0,0,.2);--section-box-shadow-color:rgba(0,0,0,.06);--menu-box-shadow-color:rgba(0,0,0,.15);--input-search-background-color:#fff;--input-search-border-color:#dfe1e5;--secondary-color:#c4c9cc;--avatar-online-color:var(--primary-color);--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;--monospace-text-color:var(--danger-color);--backdrop-opacity:.85;--menu-background-color:rgba(var(--surface-color-rgb),var(--backdrop-opacity));--message-background-color:var(--surface-color);--message-time-color:var(--secondary-text-color);--message-checkbox-color:#61c642;--message-checkbox-border-color:#fff;--message-primary-color:var(--primary-color);--light-filled-message-primary-color:var(--light-filled-primary-color);--message-secondary-color:var(--secondary-color);--message-error-color:var(--danger-color);--message-out-link-color:var(--link-color);--message-out-status-color:var(--message-out-primary-color);--message-out-time-color:var(--message-out-status-color);--message-out-audio-play-button-color:#fff;--message-out-selection-background-color:var(--selection-background-color);--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:#aaa;--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;--scrollbar-color:hsla(0,0%,100%,.2);--section-box-shadow-color:rgba(0,0,0,.12);--input-search-background-color:#181818;--input-search-border-color:#2f2f2f;--secondary-color:#707579;--avatar-online-color:var(--primary-color);--chatlist-status-color:var(--primary-color);--chatlist-pinned-color:var(--secondary-color);--badge-text-color:#fff;--link-color:var(--primary-color);--ripple-color:hsla(0,0%,100%,.08);--poll-circle-color:#fff;--spoiler-background-color:#373e4e;--spoiler-draft-background-color:#484848;--monospace-text-color:var(--primary-text-color);--menu-background-color:rgba(var(--surface-color-rgb),.75);--message-background-color:var(--surface-color);--message-time-color:var(--secondary-text-color);--message-checkbox-color:var(--primary-color);--message-checkbox-border-color:#fff;--message-secondary-color:var(--secondary-color);--message-error-color:#fff;--message-out-link-color:#fff;--message-out-status-color:#fff;--message-out-time-color:hsla(0,0%,100%,.6);--message-out-audio-play-button-color:var(--message-out-background-color);--message-out-selection-background-color:rgba(var(--surface-color-rgb),.4)}@font-face{font-display:block;font-family:tgico;font-style:normal;font-weight:400;src:url(assets/fonts/tgico.ttf?ivbp49) format(\"truetype\"),url(assets/fonts/tgico.woff?ivbp49) format(\"woff\"),url(assets/fonts/tgico.svg?ivbp49#tgico) format(\"svg\")}.tgico:after,.tgico:before,[class*=\" tgico-\"]:after,[class*=\" tgico-\"]:before,[class^=tgico-]{speak:never;font-feature-settings:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:tgico!important;font-style:normal;font-variant:normal;font-weight:400;line-height:1;text-transform:none}.tgico-check:before{content:\"๎ค€\"}.tgico-checks:before{content:\"๎ค\"}.tgico-activesessions:before{content:\"๎ค‚\"}.tgico-add:before{content:\"๎คƒ\"}.tgico-add_reaction: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-audio_repeat:before{content:\"๎คŽ\"}.tgico-audio_repeat_single:before{content:\"๎ค\"}.tgico-avatarnext:before{content:\"๎ค\"}.tgico-avatarprevious:before{content:\"๎ค‘\"}.tgico-binfilled: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-card:before{content:\"๎คœ\"}.tgico-card_outline: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:before{content:\"๎คฑ\"}.tgico-delete_filled: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-fast_forward:before{content:\"๎ฅƒ\"}.tgico-fast_rewind:before{content:\"๎ฅ„\"}.tgico-favourites:before{content:\"๎ฅ…\"}.tgico-flag:before{content:\"๎ฅ†\"}.tgico-flip:before{content:\"๎ฅ‡\"}.tgico-folder:before{content:\"๎ฅˆ\"}.tgico-fontsize:before{content:\"๎ฅ‰\"}.tgico-forward:before{content:\"๎ฅŠ\"}.tgico-forward_filled: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-groupmedia:before{content:\"๎ฅ‘\"}.tgico-groupmediaoff:before{content:\"๎ฅ’\"}.tgico-help:before{content:\"๎ฅ“\"}.tgico-hide: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-limit_chat:before{content:\"๎ฅŸ\"}.tgico-limit_chats:before{content:\"๎ฅ \"}.tgico-limit_file:before{content:\"๎ฅก\"}.tgico-limit_folders:before{content:\"๎ฅข\"}.tgico-limit_link:before{content:\"๎ฅฃ\"}.tgico-limit_pin: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-mediaspoiler:before{content:\"๎ฅฎ\"}.tgico-mediaspoileroff:before{content:\"๎ฅฏ\"}.tgico-mention:before{content:\"๎ฅฐ\"}.tgico-menu:before{content:\"๎ฅฑ\"}.tgico-message:before{content:\"๎ฅฒ\"}.tgico-messageunread:before{content:\"๎ฅณ\"}.tgico-microphone:before{content:\"๎ฅด\"}.tgico-microphone_crossed:before{content:\"๎ฅต\"}.tgico-microphone_crossed_filled:before{content:\"๎ฅถ\"}.tgico-microphone_filled: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-pip:before{content:\"๎ฆŒ\"}.tgico-play:before{content:\"๎ฆ\"}.tgico-playback_05:before{content:\"๎ฆŽ\"}.tgico-playback_15:before{content:\"๎ฆ\"}.tgico-playback_1x:before{content:\"๎ฆ\"}.tgico-playback_2x:before{content:\"๎ฆ‘\"}.tgico-plus:before{content:\"๎ฆ’\"}.tgico-poll:before{content:\"๎ฆ“\"}.tgico-premium_addone:before{content:\"๎ฆ”\"}.tgico-premium_double:before{content:\"๎ฆ•\"}.tgico-premium_lock:before{content:\"๎ฆ–\"}.tgico-premium_unlock:before{content:\"๎ฆ—\"}.tgico-previous:before{content:\"๎ฆ˜\"}.tgico-radiooff:before{content:\"๎ฆ™\"}.tgico-radioon:before{content:\"๎ฆš\"}.tgico-reactions:before{content:\"๎ฆ›\"}.tgico-readchats:before{content:\"๎ฆœ\"}.tgico-recent:before{content:\"๎ฆ\"}.tgico-replace:before{content:\"๎ฆž\"}.tgico-reply:before{content:\"๎ฆŸ\"}.tgico-reply_filled:before{content:\"๎ฆ \"}.tgico-rightpanel:before{content:\"๎ฆก\"}.tgico-rotate_left:before{content:\"๎ฆข\"}.tgico-rotate_right: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:before{content:\"๎ฆฎ\"}.tgico-settings_filled:before{content:\"๎ฆฏ\"}.tgico-sharescreen_filled:before{content:\"๎ฆฐ\"}.tgico-shipping:before{content:\"๎ฆฑ\"}.tgico-shuffle:before{content:\"๎ฆฒ\"}.tgico-smallscreen:before{content:\"๎ฆณ\"}.tgico-smile:before{content:\"๎ฆด\"}.tgico-spoiler:before{content:\"๎ฆต\"}.tgico-sport:before{content:\"๎ฆถ\"}.tgico-star:before{content:\"๎ฆท\"}.tgico-stickers:before{content:\"๎ฆธ\"}.tgico-stickers_face:before{content:\"๎ฆน\"}.tgico-stop:before{content:\"๎ฆบ\"}.tgico-strikethrough:before{content:\"๎ฆป\"}.tgico-textedit:before{content:\"๎ฆผ\"}.tgico-tip:before{content:\"๎ฆฝ\"}.tgico-tools:before{content:\"๎ฆพ\"}.tgico-topics: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:before{content:\"๎งˆ\"}.tgico-videocamera_crossed_filled:before{content:\"๎ง‰\"}.tgico-videocamera_filled:before{content:\"๎งŠ\"}.tgico-videochat:before{content:\"๎ง‹\"}.tgico-volume_down:before{content:\"๎งŒ\"}.tgico-volume_mute:before{content:\"๎ง\"}.tgico-volume_off:before{content:\"๎งŽ\"}.tgico-volume_up:before{content:\"๎ง\"}.tgico-zoomin:before{content:\"๎ง\"}.tgico-zoomout:before{content:\"๎ง‘\"}.tgico-phone_filled:before{content:\"๎คฟ\";transform:rotate(-135deg)}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;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-display:swap;font-family:Roboto;font-style:normal;font-weight:400;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-display:swap;font-family:Roboto;font-style:normal;font-weight:400;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-display:swap;font-family:Roboto;font-style:normal;font-weight:500;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-display:swap;font-family:Roboto;font-style:normal;font-weight:500;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-display:swap;font-family:Roboto;font-style:normal;font-weight:500;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-display:swap;font-family:Roboto;font-style:normal;font-weight:600;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-display:swap;font-family:Roboto;font-style:normal;font-weight:600;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-display:swap;font-family:Roboto;font-style:normal;font-weight:600;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-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-Ulco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ulco8VkA.woff2) format(\"woff2\");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-Ulco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ulco8VkA.woff2) format(\"woff2\");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0me8iUI0.woff2) format(\"woff2\");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0me8iUI0.woff2) format(\"woff2\");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}.input-wrapper{margin:0 auto;width:360px}.input-field{--height:54px;--border-radius:10px;position:relative}@media only screen and (max-width:600px){.input-field{--height:50px}}.input-field .arrow-down{border:solid var(--secondary-text-color);border-radius:1px;border-width:0 2px 2px 0;bottom:0;content:\" \";cursor:pointer;display:inline-block;height:0;margin-top:-9px;padding:5px;position:absolute;right:21px;top:50%;transform:rotate(45deg);-webkit-transform:rotate(45deg);transition:all .2s;vertical-align:middle;width:0;z-index:2}[dir=ltr] .input-field label{left:1rem}[dir=rtl] .input-field label{right:1rem}.input-field label{background-color:var(--surface-color);color:#9e9e9e;height:1.5rem;margin-top:calc((var(--height) - 1.5rem)/2);pointer-events:none;position:absolute;right:auto;top:0;transform:translate(0);transform-origin:left center;-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap;z-index:2}.is-rtl .input-field label{transform-origin:right center}body.animation-level-2 .input-field label{transition:transform .2s,padding .2s,opacity .1s,font-weight 0s .1s}.input-field-border{border:2px solid var(--primary-color);border-radius:var(--border-radius);bottom:0;left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:0;z-index:1}body.animation-level-2 .input-field-border{transition:opacity .2s}.input-field-icon{border-radius:.375rem;height:1.5rem;pointer-events:none;position:absolute;right:1rem;top:50%;transform:translateY(-50%);width:1.5rem;z-index:1}.input-field-input{--padding:1rem;--padding-horizontal:1rem;--border-width:1px;background-color:var(--surface-color);border:var(--border-width) solid var(--input-search-border-color);border-radius:var(--border-radius);box-sizing:border-box;line-height:var(--line-height);min-height:var(--height);padding:calc(var(--padding) - var(--border-width)) calc(var(--padding-horizontal) - var(--border-width));position:relative;transition:border-color 0s;width:100%;z-index:1}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:active,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:hover{-webkit-box-shadow:0 0 0 1000px var(--surface-color) inset}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:active,.input-field-input:-webkit-autofill:first-line,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:hover{color:var(--primary-text-color)!important;font-family:Roboto,-apple-system,apple color emoji,BlinkMacSystemFont,Segoe UI,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif!important;font-size:1rem!important}@media only screen and (max-width:600px){.input-field-input{--padding:.9375rem;--padding-horizontal:.9375rem}}body.animation-level-0 .input-field-input{transition:none!important}html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid),html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid){border-color:var(--primary-color);transition:border-color .2s}html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid)~label,html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid)~label{color:var(--primary-color)}.input-field-input:focus{border-color:var(--primary-color)}.input-field-input.error{border-color:var(--danger-color)}.input-field-input.error~label{color:var(--danger-color)!important}.input-field-input.error~.input-field-border{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{border-color:var(--primary-color);margin-top:-4px;transform:rotate(225deg)}.input-field-input:focus~label{color:var(--primary-color);font-weight:var(--font-weight-bold)}.input-field-input:focus~.input-field-border{opacity:1}.input-field-input:disabled~label,.input-field-input:focus~label,.input-field-input:not(:empty)~label,.input-field-input:valid~label{opacity:1;padding:0 .3125rem;transform:translate(-.1875rem,calc(var(--height)/-2 + .0625rem)) scale(.75)}.input-field-input-fake{bottom:auto!important;height:auto!important;left:0;opacity:0;pointer-events:none;position:absolute!important;right:auto!important;top:0;z-index:-3}.input-fields-row{display:flex}.input-fields-row .input-field{flex:1 1 auto;width:1%}.input-wrapper>*+*{margin-top:1.5rem}::-moz-placeholder{color:#909192;opacity:1}::placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192}::-ms-input-placeholder{color:#909192}button:focus,input:focus{outline:none}.input-clear{border:none;outline:none;padding:0}body.animation-level-0 .input-clear.error{color:var(--danger-color)!important}body:not(.animation-level-0) .input-clear.error{animation:input-shake .2s ease-in-out forwards}@keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-.5rem)}75%{transform:translateX(.5rem)}to{transform:translateX(0)}}.input-search{--border-radius:22px;margin-left:.4375rem;margin-right:.4375rem;overflow:hidden;position:relative;width:100%}@media only screen and (max-width:600px){[dir=ltr] .input-search{margin-left:1rem}[dir=rtl] .input-search{margin-right:1rem}}.input-search-input{--height:42px;background-color:var(--input-search-background-color);border-color:var(--input-search-border-color);height:var(--height);line-height:var(--height);max-height:var(--height)!important;min-height:var(--height)!important;padding:0 calc(var(--height) + 3px - var(--border-width))}body.animation-level-2 .input-search-input{transition:border-color .2s ease-in-out}html.no-touch .input-search-input:active:not(:focus),html.no-touch .input-search-input:hover:not(:focus){border-color:var(--secondary-color)!important}.input-search-input:focus{background-color:transparent;border-color:var(--primary-color)}.input-search-input:focus~.tgico{color:var(--primary-color);opacity:1}html.no-touch .input-search-input:focus~.btn-icon:active,html.no-touch .input-search-input:focus~.btn-icon:hover{background-color:var(--light-primary-color)}.input-search-input:-moz-placeholder-shown~.tgico-close{display:none}.input-search-input:placeholder-shown~.tgico-close{display:none}.input-search>.tgico{color:var(--secondary-text-color);font-size:1.5rem;line-height:1;opacity:.6;position:absolute;text-align:center;top:50%;transform:translateY(-50%);z-index:1}body.animation-level-2 .input-search>.tgico{transition:opacity .2s ease-out,color .2s ease-out}[dir=ltr] .input-search>.tgico-search{left:.8125rem}[dir=rtl] .input-search>.tgico-search{right:.8125rem}.input-search>.tgico-search{height:1.5rem;pointer-events:none;width:1.5rem}[dir=ltr] .input-search>.tgico-close{right:0}[dir=rtl] .input-search>.tgico-close{left:0}.input-search>.tgico-close{height:42px;width:42px;z-index:1}[dir=ltr] .input-search>.tgico-close:before{margin-right:-1px}[dir=rtl] .input-search>.tgico-close:before{margin-left:-1px}[dir=ltr] .input-field-password .input-field-input{padding-right:2.5rem}[dir=rtl] .input-field-password .input-field-input{padding-left:2.5rem}.input-field-password .input-field-input{max-height:var(--height)}.input-field-password .input-field-input[type=password]{font-family:Arial,Helvetica,sans-serif;font-size:2.25rem;line-height:1;padding-bottom:0;padding-left:calc(.875rem - var(--border-width));padding-top: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{align-items:center;color:#9e9e9e;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;padding:.5rem;position:absolute;right:.375rem;top:50%;transform:translateY(-50%);transition:color .2s;z-index:2}.input-field-password .toggle-visible:before{content:\"๎ฅ\"}.input-field-password .toggle-visible.eye-hidden:before{content:\"๎ฅ‚\"}html.no-touch .input-field-password .toggle-visible:active,html.no-touch .input-field-password .toggle-visible:hover{color:var(--primary-text-color)}.input-field-phone .input-field-input{--letter-spacing:.24px}.input-field-phone .input-field-input:after{color:#9e9e9e;content:attr(data-left-pattern);letter-spacing:var(--letter-spacing)}.btn,.btn-icon{background:none;border:none;cursor:pointer;outline:none}body.animation-level-0 .btn,body.animation-level-0 .btn-icon{transition:none}html.no-touch .btn-icon:active,html.no-touch .btn-icon:hover,html.no-touch .btn:active,html.no-touch .btn:hover{background-color:var(--light-secondary-text-color)}html.no-touch .btn-icon.active:active,html.no-touch .btn-icon.active:hover,html.no-touch .btn-icon.blue:active,html.no-touch .btn-icon.blue:hover,html.no-touch .btn-icon.primary:active,html.no-touch .btn-icon.primary:hover,html.no-touch .btn.active:active,html.no-touch .btn.active:hover,html.no-touch .btn.blue:active,html.no-touch .btn.blue:hover,html.no-touch .btn.primary:active,html.no-touch .btn.primary:hover{background-color:var(--light-primary-color)}html.no-touch .btn-icon.danger:active,html.no-touch .btn-icon.danger:hover,html.no-touch .btn.danger:active,html.no-touch .btn.danger:hover{background-color:var(--light-danger-color)}.btn-icon:disabled,.btn:disabled{opacity:var(--disabled-opacity);pointer-events:none!important}.btn-icon{align-items:center;background-color:transparent;border:none;border-radius:50%!important;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;line-height:1;padding:.5rem;position:relative;text-align:center;transition:color .15s ease-in-out,opacity .15s ease-in-out}.btn-icon.rp{overflow:hidden}.btn-icon.active{color:var(--primary-color)}[dir=ltr] .btn-corner{right:var(--offset)}[dir=rtl] .btn-corner{left:var(--offset)}.btn-corner{--offset:1.25rem;--translateY:calc(54px + var(--offset));align-items:center;background-color:var(--primary-color);border:none;bottom:var(--offset);box-shadow:none!important;color:#fff;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;outline:none;padding:0!important;position:absolute!important;text-align:center;transform:translate3d(0,var(--translateY),0);transition:transform var(--btn-corner-transition)!important;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:3}html.no-touch .btn-corner:active,html.no-touch .btn-corner:hover{background-color:var(--dark-primary-color)}.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{height:2.5rem;width:2.5rem}.btn-menu{-webkit-touch-callout:none;-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:var(--menu-background-color);border-radius:10px;font-size:1rem;min-width:11.25rem;opacity:0;padding:.3125rem 0;position:absolute;top:100%;transform:scale(.8)!important;transition:opacity var(--btn-menu-transition),transform var(--btn-menu-transition),visibility var(--btn-menu-transition);-webkit-user-select:none;visibility:hidden;z-index:4}.btn-menu-old,.is-mobile .btn-menu{-webkit-backdrop-filter:none;backdrop-filter:none;background-color:var(--surface-color);min-width:auto;padding:.5rem 0}.btn-menu-old .btn-menu-item,.is-mobile .btn-menu .btn-menu-item{--padding-left:1rem;--padding-right:2.5rem;--icon-margin:1.5rem;--icon-size:1.5rem;border-radius:0;font-size:var(--font-size-16);font-weight:400;height:3rem;line-height:var(--line-height-16);margin:0;transform:none!important}.btn-menu-old .btn-menu-item:before,.is-mobile .btn-menu .btn-menu-item:before{align-self:auto;color:var(--secondary-text-color);margin-top:0}.btn-menu-old .btn-menu-footer,.is-mobile .btn-menu .btn-menu-footer{background-color:var(--background-color)}.btn-menu{box-shadow:var(--menu-box-shadow)}body.animation-level-0 .btn-menu{transition:none}.btn-menu.active{opacity:1;visibility:visible}.btn-menu.active,.is-mobile .btn-menu.was-open{transform:scaleX(1)!important}.btn-menu.bottom-left,.is-rtl .btn-menu.bottom-right{left:auto;right:0;top:100%;transform-origin:top right}.btn-menu.bottom-right,.is-rtl .btn-menu.bottom-left{left:0;right:auto;top:100%;transform-origin:top left}.btn-menu.bottom-center{transform-origin:top center}.btn-menu.top-left{bottom:100%;left:auto;right:0;top:auto;transform-origin:bottom right}.btn-menu.top-right,.is-rtl .btn-menu.top-left{bottom:100%;left:0;right:auto;top:auto;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}[dir=ltr] .btn-menu-item{text-align:left}[dir=rtl] .btn-menu-item{text-align:right}.btn-menu-item{--padding-vertical:.25rem;--padding-left:.75rem;--padding-right:.75rem;--icon-margin:1.25rem;--icon-size:1.25rem;align-items:center;border-radius:.3125rem;color:var(--primary-text-color);cursor:pointer!important;display:flex;font-size:var(--font-size-14);font-weight:500;height:2rem;line-height:var(--line-height-14);margin-left:.3125rem;margin-right:.3125rem;padding:var(--padding-vertical) var(--padding-right) var(--padding-vertical) var(--padding-left);pointer-events:all!important;position:relative;text-transform:none;transform:scale(1);white-space:nowrap}.btn-menu-item.tgico-char:before{width:var(--icon-size)}body.animation-level-2 .btn-menu-item{transition:transform var(--btn-menu-transition)}.btn-menu-item:active{transform:scale(.96)}html.no-touch .btn-menu-item:active,html.no-touch .btn-menu-item:hover{background-color:var(--light-secondary-text-color)}html.no-touch .btn-menu-item.danger:active,html.no-touch .btn-menu-item.danger:hover{background-color:var(--light-danger-color)}.btn-menu-item:before{align-self:flex-start;color:var(--primary-text-color);font-size:var(--icon-size);margin-top:.125rem}[dir=ltr] .btn-menu-item-icon,[dir=ltr] .btn-menu-item:before{margin-right:var(--icon-margin)}[dir=rtl] .btn-menu-item-icon,[dir=rtl] .btn-menu-item:before{margin-left:var(--icon-margin)}.btn-menu-item-icon,.btn-menu-item:before{position:relative}[dir=ltr] .btn-menu-item-icon{margin-right:calc(var(--icon-margin) - var(--add)/2)}[dir=rtl] .btn-menu-item-icon{margin-left:calc(var(--icon-margin) - var(--add)/2)}[dir=ltr] .btn-menu-item-icon{margin-left:calc(var(--add)/-2)}[dir=rtl] .btn-menu-item-icon{margin-right:calc(var(--add)/-2)}.btn-menu-item-icon{--add:.25rem;--total:calc(var(--icon-size) + var(--add));flex:0 0 auto;height:var(--total);width:var(--total)}.btn-menu-item-icon .media-photo{height:inherit;width:inherit}@media only screen and (max-width:600px){.btn-menu-item{--padding-right:1.875rem}}.btn-menu-item-text{flex:1 1 auto;position:relative}.btn-menu-item-text,.btn-menu-item-text-fake{pointer-events:none}[dir=ltr] .btn-menu-item-text-fake{margin-left:var(--margin-left)}[dir=rtl] .btn-menu-item-text-fake{margin-right:var(--margin-left)}.btn-menu-item-text-fake{--margin-left:calc(var(--icon-size) + var(--icon-margin));max-width:calc(100% - var(--margin-left) - var(--padding-left) - var(--padding-right));overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap}.btn-menu-item-subtitle{color:var(--secondary-text-color);font-size:.875rem}.btn-menu-item-header{color:var(--secondary-text-color);font-weight:var(--font-weight-bold);height:2rem;pointer-events:none!important}[dir=ltr] .btn-menu-item .stacked-avatars{right:.5rem}[dir=rtl] .btn-menu-item .stacked-avatars{left:.5rem}.btn-menu-item .stacked-avatars{--margin-right:-.6875rem;flex:0 0 auto;pointer-events:none;position:absolute}.btn-menu-item.is-multiline{font-size:.75rem;height:auto;max-width:16.25rem;min-width:calc(100% - .625rem);width:-moz-fit-content;width:fit-content}.btn-menu-item.is-multiline .btn-menu-item-text{white-space:pre-wrap;width:-moz-fit-content;width:fit-content}.btn-menu-item .checkbox-field-toggle{padding:0}.btn-menu-overlay{bottom:0;bottom:-100vh;cursor:default;left:0;left:-100vw;max-width:none!important;position:fixed!important;right:0;right:-100vw;top:0;top:-100vh;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:auto!important;z-index:4}.btn-menu.has-footer{padding-bottom:0}.btn-menu-footer{align-items:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;color:currentColor;display:flex;font-size:.875rem;height:2.5rem;justify-content:center}.btn-menu hr{display:block!important;margin:.3125rem auto;opacity:.6;padding:0;width:calc(100% - 1.875rem)}html:not(.is-mobile) .btn-menu .badge{background-color:transparent;color:var(--secondary-text-color)}.btn-menu-reactions{--inner-shadow-degree:90deg;-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:var(--menu-background-color);border-radius:var(--height);filter:drop-shadow(0 .125rem .5rem rgba(0,0,0,.24));height:inherit;max-height:100%;max-width:100%;opacity:0;position:absolute;transform:scale(.8);transform-origin:bottom left}[dir=ltr] .btn-menu-reactions-container{margin-left:var(--other-side-offset)}[dir=rtl] .btn-menu-reactions-container{margin-right:var(--other-side-offset)}.btn-menu-reactions-container{--height:2.25rem;--bubble-side-offset:0rem;--other-side-offset:0rem;--menu-offset:calc((var(--height) + 0.5rem)*-1);--width:calc(var(--menu-width) + (var(--bubble-side-offset) + var(--other-side-offset))*-1);display:flex;height:var(--height);justify-content:flex-start;margin-top:var(--menu-offset);max-width:var(--width);position:fixed;width:var(--width);z-index:4}.contextmenu.bottom-left+.btn-menu-reactions-container .btn-menu-reactions,.contextmenu.center-left+.btn-menu-reactions-container .btn-menu-reactions{transform-origin:bottom right!important}.contextmenu.bottom-center+.btn-menu-reactions-container .btn-menu-reactions{transform-origin:bottom center!important}[dir=ltr] .btn-menu-reactions-container-vertical{margin-left:var(--menu-offset)}[dir=rtl] .btn-menu-reactions-container-vertical{margin-right:var(--menu-offset)}.btn-menu-reactions-container-vertical{flex-direction:column;height:var(--width);margin-top:0;max-height:var(--width);max-width:var(--height);width:var(--height)}.btn-menu-reactions-container-vertical .btn-menu-reactions{--inner-shadow-degree:180deg;display:flex;flex-direction:column;height:auto;transform-origin:top right;width:inherit}.btn-menu-reactions-container-vertical .btn-menu-reactions-reaction{--padding-vertical:var(--padding-base);--padding-horizontal:0rem}.btn-menu-reactions-container-vertical .btn-menu-reactions-bubble-big{bottom:var(--offset);right:calc(var(--size)/-2)}body.animation-level-2 .btn-menu-reactions{transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.btn-menu-reactions.is-visible{opacity:1;transform:scale(1)}.btn-menu-reactions-bubble{background-color:inherit;border-radius:50%;position:absolute;z-index:-1}.btn-menu-reactions-bubble-big{--size:1rem;--offset:calc(var(--height)/2);bottom:calc(var(--size)/-2);height:var(--size);right:var(--offset);width:var(--size)}.btn-menu-reactions:after{background:linear-gradient(var(--inner-shadow-degree),var(--surface-color) 0,rgba(var(--surface-color-rgb),0) 1rem,rgba(var(--surface-color-rgb),0) calc(100% - 1rem),var(--surface-color) 100%);border-radius:inherit;bottom:0;content:\" \";left:0;pointer-events:none;position:absolute;right:0;top:0}.btn-menu-reactions .scrollable{border-radius:inherit;display:flex;position:relative}.btn-menu-reactions .scrollable-x{align-items:center;padding:0 .25rem}.btn-menu-reactions .scrollable-y{align-items:center;flex-direction:column;padding:.25rem 0}.btn-menu-reactions-reaction{--size:1.625rem;--padding-base:.25rem;--padding-vertical:0rem;--padding-horizontal:var(--padding-base);cursor:pointer;flex:0 0 auto;height:calc(var(--size) + var(--padding-vertical)*2);padding:var(--padding-vertical) var(--padding-horizontal);width:calc(var(--size) + var(--padding-horizontal)*2)}.btn-menu-reactions-reaction-scale{height:100%;width:100%}html:not(.is-safari) .btn-menu-reactions-reaction-scale{transform:scale(1)}html:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-scale{transition:transform .1s linear}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select{transform:scale(1)}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:active,html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:hover{transform:scale(1.25)}html.no-touch:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-select{transition:transform var(--transition-standard-in)}.btn-menu-reactions-reaction .media-sticker-wrapper{height:100%;position:relative;width:100%}.btn-primary{border:none;border-radius:10px;cursor:pointer;font-weight:var(--font-weight-bold);height:54px;overflow:hidden;padding:0;position:relative;text-align:center;transition:opacity .2s;width:100%}html.no-touch .btn-primary:active,html.no-touch .btn-primary:hover{background:var(--dark-primary-color);transition:opacity .2s}.btn-primary-transparent{background-color:transparent;color:var(--primary-color)}html.no-touch .btn-primary-transparent:active,html.no-touch .btn-primary-transparent:hover{background:var(--light-primary-color)}.btn-primary-transparent .c-ripple__circle{background-color:var(--light-primary-color)}html.no-touch .btn-primary-transparent.danger:active,html.no-touch .btn-primary-transparent.danger:hover{background-color:var(--light-danger-color)}.btn-primary-transparent .preloader-circular .preloader-path{stroke:var(--primary-color)}body.animation-level-0 .btn-primary{transition:none}[dir=ltr] .btn-primary use,[dir=ltr] .btn-primary>svg{right:15px}[dir=rtl] .btn-primary use,[dir=rtl] .btn-primary>svg{left:15px}.btn-primary use,.btn-primary>svg{height:calc(100% - 20px);left:auto}.btn-primary:disabled{opacity:var(--disabled-opacity);pointer-events:none!important}[dir=ltr] .btn-control{padding-left:.75rem;padding-right:1.5rem}[dir=rtl] .btn-control{padding-left:1.5rem;padding-right:.75rem}.btn-control{align-items:center;border-radius:1.25rem;display:flex;height:2.5rem;line-height:2.5rem;margin:.9375rem auto 1rem;width:auto}[dir=ltr] .btn-control.tgico:before{margin-right:.375rem}[dir=rtl] .btn-control.tgico:before{margin-left:.375rem}.btn-control.tgico:before{font-size:1.5rem}.btn-transparent{align-items:center;background-color:transparent;color:var(--primary-text-color);display:flex;font-weight:400;height:3rem;line-height:var(--line-height);padding:0 1rem}@media only screen and (max-width:600px){.btn-transparent{height:3rem}}html.no-touch .btn-transparent:active,html.no-touch .btn-transparent:hover{background-color:var(--light-secondary-text-color)}html.no-touch .btn-transparent.danger:active,html.no-touch .btn-transparent.danger:hover{background-color:var(--light-danger-color)}html.no-touch .btn-transparent.primary:active,html.no-touch .btn-transparent.primary:hover{background-color:var(--light-primary-color)}[dir=ltr] .btn-transparent:before{margin-right:2rem}[dir=rtl] .btn-transparent:before{margin-left:2rem}.btn-transparent:before{color:var(--secondary-text-color);font-size:1.5rem}@media only screen and (max-width:600px){[dir=ltr] .btn-transparent:before{margin-right:1.5rem}[dir=rtl] .btn-transparent:before{margin-left:1.5rem}}[dir=ltr] .btn-transparent.btn-short:before{margin-right:1rem}[dir=rtl] .btn-transparent.btn-short:before{margin-left:1rem}.btn-primary.btn-circle .preloader-circular{height:calc(100% - 20px);left:auto;margin:0;right:auto;top:10px}.btn-primary.btn-circle .preloader-circular .preloader-path{stroke:#fff}.btn-menu-toggle{cursor:pointer!important;font-weight:400!important;overflow:visible!important;pointer-events:all!important;position:relative}.btn-menu-toggle:not(.btn-primary):not(.btn-corner).menu-open{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);line-height:var(--size);width:var(--size)}@media only screen and (max-width:600px){.btn-circle{--size:46px}}.btn-circle path{fill:#fff}.btn-disabled{color:var(--secondary-text-color)!important;cursor:default!important;pointer-events:none!important}.btn-disabled:before{color:inherit!important}.btn-secondary:not(:first-child){margin-top:.5rem!important}.btn-color-primary{background:var(--primary-color);color:#fff}.call-button{-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);border-radius:50%;font-size:1.5rem;height:var(--call-button-size);justify-content:center;position:relative}.call-button,.call-button-container{align-items:center;cursor:pointer;display:flex;width:var(--call-button-size)}.call-button-container{flex-direction:column}.call-button-container.disabled,.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{font-size:.875rem;margin-top:.25rem;white-space:nowrap}body.animation-level-2 .call-button-text{transition:opacity var(--transition-standard-in)}body.animation-level-2 .call-button{transition:background-color var(--transition-standard-in),opacity var(--transition-standard-in)}[dir=ltr] .call-button+.call-button,[dir=ltr] .call-button-container+.call-button-container{margin-left:var(--call-button-margin)}[dir=rtl] .call-button+.call-button,[dir=rtl] .call-button-container+.call-button-container{margin-right:var(--call-button-margin)}[dir=ltr] .btn-update{right:auto!important}[dir=rtl] .btn-update{left:auto!important}.btn-update{border-radius:var(--size);font-size:1rem;font-weight:var(--font-weight-bold);padding:0 2rem!important;width:auto}.animated-close-icon{pointer-events:none;position:absolute;transform:rotate(-45deg)}.animated-close-icon,.animated-close-icon:after,.animated-close-icon:before{background-color:var(--secondary-text-color);border-radius:.125rem;height:.125rem;width:1.125rem}.animated-close-icon:after,.animated-close-icon:before{content:\"\";left:0;position:absolute;top:0}.animated-close-icon:before{transform:rotate(90deg)}body.animation-level-2 .animated-close-icon,body.animation-level-2 .animated-close-icon:after,body.animation-level-2 .animated-close-icon:before{transition:transform var(--slide-header-transition)}.animated-close-icon.state-back{transform:rotate(180deg)}.animated-close-icon.state-back:before{transform:rotate(45deg) scaleX(.75) translateY(-.375rem)}.animated-close-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translateY(.375rem)}.animated-menu-icon{--color:var(--secondary-text-color);position:absolute}.animated-menu-icon,.animated-menu-icon:after,.animated-menu-icon:before{background-color:var(--color);border-radius:.125rem;height:.125rem;transform:rotate(0);width:1.125rem}body.animation-level-2 .animated-menu-icon,body.animation-level-2 .animated-menu-icon:after,body.animation-level-2 .animated-menu-icon:before{transition:transform .25s}.animated-menu-icon:after,.animated-menu-icon:before{content:\"\";left:0;position:absolute}.animated-menu-icon:before{top:-.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(.75) translate(.375rem,-.1875rem)}.animated-menu-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translate(.375rem,.1875rem)}.animated-menu-close-icon{margin-top:-.625rem}.animated-menu-close-icon:before{opacity:1;top:.3125rem}body.animation-level-2 .animated-menu-close-icon:before{transition:transform .25s,opacity .125s 0s}.animated-menu-close-icon:after{top:.625rem}.animated-menu-close-icon.state-back{transform:translateY(.3125rem) rotate(135deg)}.animated-menu-close-icon.state-back:before{opacity:0;transform:rotate(45deg)}.animated-menu-close-icon.state-back:after{transform:translateY(-.625rem) rotate(90deg)}.animated-button-icon>.tgico{height:24px;line-height:24px;position:absolute}body:not(.animation-level-0) .animated-button-icon>.tgico{animation:hide-icon .4s ease-in-out forwards}body.animation-level-0 .animated-button-icon>.tgico{animation:none!important;visibility:hidden}.autocomplete-helper{--border-radius:10px;border-radius:var(--border-radius)!important;bottom:calc(100% + .5rem);left:0;max-width:100%;overflow:hidden;padding:0!important;position:absolute!important;width:auto!important}.autocomplete-helper:not(.is-visible){display:none}.autocomplete-helper.is-visible{visibility:hidden}body.animation-level-2 .autocomplete-helper.is-visible{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){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{max-height:232px;position:relative}.autocomplete-peer-helper-list{padding:.5rem 0}.autocomplete-peer-helper-list-element{align-items:center;cursor:pointer;display:flex;height:3.125rem;line-height:var(--line-height);padding:0 2.125rem 0 .75rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (max-width:600px){.autocomplete-peer-helper-list-element{padding-right:.75rem}}.autocomplete-peer-helper-list-element-name{flex:0 0 auto;font-weight:var(--font-weight-bold);margin-left:.875rem}.autocomplete-peer-helper-list-element-description{color:var(--secondary-text-color);margin-left:.5625rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.autocomplete-peer-helper-list-element-avatar{flex:0 0 auto}.badge{--size:1.375rem;--padding:.4375rem;border-radius:calc(var(--size)/2);color:var(--badge-text-color);font-size:.875rem;font-weight:var(--font-weight-bold);height:var(--size);line-height:var(--size)!important;min-width:var(--size);padding:0 var(--padding);text-align:center}body.animation-level-2 .badge{transition:background-color .2s ease-in-out}.badge:not(.tgico):empty{display:none}.badge-20{--size:1.25rem;--padding:.375rem}.badge-24{--size:1.5rem;--padding:.5rem}.badge.tgico:before{font-size:var(--size)}.badge-primary{background-color:var(--primary-color)}.badge-gray{background-color:var(--secondary-color)}.ckin__player{letter-spacing:.02em;-webkit-user-select:none;-moz-user-select:none;user-select:none}.ckin__player.ckin__fullscreen{background:#000;border-radius:0!important;bottom:0;display:flex;height:100%;left:0;position:fixed;right:0;top:0;width:100%;z-index:10000000}.ckin__player.ckin__fullscreen video{height:100%;-o-object-fit:contain;object-fit:contain;width:100%}.ckin__player .time{color:#fff;font-size:.875rem;margin-left:.875rem}@media only screen and (max-width:600px){.ckin__player .time{margin-left:1.125rem}}.default{align-items:center;display:flex;font-size:0;justify-content:center;position:relative}.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;color:#fff;font-size:4rem;left:50%;line-height:1;opacity:1;outline:0;padding:0;position:absolute;text-align:center;top:50%;transform:translate3d(-50%,-50%,0) scale(1)}@media only screen and (min-width:601px){.default__button--big{pointer-events:none}}body.animation-level-2 .default__button--big{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}[dir=ltr] .default__controls{text-align:left}[dir=rtl] .default__controls{text-align:right}.default__controls{bottom:0;direction:ltr;left:0;position:absolute;right:0;z-index:6}body.animation-level-2 .default__controls{transition:transform var(--layer-transition)}.default__controls .progress-line{border-radius:var(--border-radius);margin:0 16px}.default__controls .progress-line__filled{background:var(--primary-color)}.default__controls .progress-line__loaded{background-color:#fff}.default__controls .progress-line{background:hsla(0,0%,100%,.38)}@media only screen and (max-width:600px){.default__controls .progress-line{margin-bottom:-1px}}.default__gradient-bottom{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAADGCAYAAAAT+OqFAAAAdklEQVQoz42QQQ7AIAgEF/T/D+kbq/RWAlnQyyazA4aoAB4FsBSA/bFjuF1EOL7VbrIrBuusmrt4ZZORfb6ehbWdnRHEIiITaEUKa5EJqUakRSaEYBJSCY2dEstQY7AuxahwXFrvZmWl2rh4JZ07z9dLtesfNj5q0FU3A5ObbwAAAABJRU5ErkJggg==);background-position:bottom;background-repeat:repeat-x;bottom:0;height:49px;padding-top:93px;pointer-events:none;position:absolute;width:100%;z-index:2}body.animation-level-2 .default__gradient-bottom{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__controls,.default.show-controls .default__gradient-bottom{transform:translateZ(0)}.default.is-playing:not(.show-controls){cursor:none}.default.is-playing .default__button--big,.default.is-seeking .default__button--big,.default:not(.played) .default__button--big{opacity:0}.default.is-playing .toggle:not(.default__button--big):before,.default.is-seeking .toggle:not(.default__button--big):before,.default:not(.played) .toggle:not(.default__button--big):before{content:\"๎ฆ…\"}.default .is-seeking+.default__button--big{opacity:0}.default .player-volume{--icon-size:2.25rem;--icon-margin-right:.5rem;--selector-size:50px;--selector-thumb-size:.75rem;--hide-width:var(--icon-size);--show-width:calc(var(--icon-size) + var(--icon-margin-right) + var(--selector-size) + var(--selector-thumb-size)*0.75);align-items:center;display:flex;overflow:hidden;width:var(--hide-width)}body.animation-level-2 .default .player-volume{transition:width var(--layer-transition)}html.is-touch .default .player-volume{display:none}html:not(.is-touch) .default .player-volume+.time{margin-left:.5rem}html.no-touch .default .player-volume:active,html.no-touch .default .player-volume:hover{width:var(--show-width)}.default .player-volume__icon{color:#fff;cursor:pointer;display:flex;font-size:1.5rem;height:var(--icon-size);margin-right:var(--icon-margin-right);padding:.375rem;width:var(--icon-size)}.default .player-volume .progress-line{--color:#fff;--thumb-size:var(--selector-thumb-size);--height:4px;margin:0;min-width:var(--selector-size);width:var(--selector-size)}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);cursor:pointer;height:var(--height);position:relative}.progress-line:before{border-radius:inherit;bottom:0;content:\" \";display:block;left:0;position:absolute;right:0;top:0}.progress-line__seek{-webkit-appearance:none;-moz-appearance:none;background:transparent;bottom:-.5rem;caret-color:var(--color);cursor:pointer;margin:0;outline:none;padding:0;position:absolute;top:-.5rem;width:100%}.progress-line__seek:focus{outline:none}.progress-line__seek::-webkit-slider-thumb{display:none}.progress-line__seek::-moz-range-thumb{display:none;height:0;width: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{background-color:var(--color);border-radius:50%;content:\" \";cursor:pointer;display:block;height:var(--thumb-size);position:absolute;right:0;top:calc((var(--thumb-size) - var(--height))/-2);transform:translateX(calc(var(--thumb-size)/2)) scale(1);width:var(--thumb-size)}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:translateX(calc(var(--thumb-size)/2)) scale(1.125)}.progress-line:before,.progress-line__loaded{background-color:var(--secondary-color);opacity:.3}.progress-line__filled,.progress-line__loaded{border-radius:var(--border-radius);bottom:0;position:absolute;top:0}body.animation-level-2 .progress-line.with-transition .progress-line__filled{transition:width .2s}.progress-line.use-transform .progress-line__filled{transform-origin:left center;width:100%}input[type=range]::-ms-track{visibility:hidden}input[type=range]::-ms-ticks{background:none;border:none;color:none}input[type=range]::-ms-thumb,input[type=range]::-ms-tooltip{visibility:hidden}.bottom-controls,.left-controls,.right-controls{align-items:center;display:flex}.bottom-controls{height:2.25rem;justify-content:space-between;padding:0 .625rem}@media only screen and (max-width:600px){.bottom-controls{height:3.625rem}}[dir=ltr] .checkbox-field{text-align:left}[dir=rtl] .checkbox-field{text-align:right}.checkbox-field{--size:1.25rem;--offset-left:0px;cursor:pointer;display:block;margin:1.5rem 1.1875rem;min-height:var(--size);min-width:var(--size);position:relative}body.animation-level-2 .checkbox-field{transition:opacity .2s}.checkbox-field.checkbox-disabled{opacity:var(--disabled-opacity);pointer-events:none!important}@media only screen and (max-width:600px){.checkbox-field{margin-bottom:27px}}[dir=ltr] .checkbox-field .checkbox-box{left:var(--offset-left)}[dir=rtl] .checkbox-field .checkbox-box{right:var(--offset-left)}.checkbox-field .checkbox-box{border-radius:.3125rem;height:var(--size);overflow:hidden;position:absolute;top:50%;transform:translateY(-50%);width:var(--size)}html.is-safari .checkbox-field .checkbox-box{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.checkbox-field .checkbox-box-background,.checkbox-field .checkbox-box-border,.checkbox-field .checkbox-box-check{left:0;position:absolute;top:0}.checkbox-field .checkbox-box-border{border:2px solid #8d969c;border-radius:inherit;bottom:0;left:0;right:0}.checkbox-field .checkbox-box-background{background-color:var(--primary-color);border-radius:50%;bottom:-15%;left:-15%;right:-15%;top:-15%;transform:scale(1);transition:transform .2s ease-in-out 0s}body.animation-level-0 .checkbox-field .checkbox-box-background{transition:none!important}.checkbox-field .checkbox-box-check{--offset:7px;height:calc(var(--size) - var(--offset));left:50%;top:50%;transform:translate(-50%,-50%);width:calc(var(--size) - var(--offset))}.checkbox-field .checkbox-box-check use{stroke:#fff;stroke-width:3.75;stroke-linecap:round;stroke-dasharray:24.19,24.19;stroke-dashoffset:0;transition:stroke-dasharray .1s ease-in-out .15s,visibility 0s .15s;visibility:visible}body.animation-level-0 .checkbox-field .checkbox-box-check use{transition:none!important}[dir=ltr] .checkbox-field .checkbox-caption{padding-left:3.375rem}[dir=rtl] .checkbox-field .checkbox-caption{padding-right:3.375rem}.checkbox-field .checkbox-caption{color:inherit;line-height:var(--line-height);pointer-events:none;position:relative;transition:opacity .2s}body.animation-level-0 .checkbox-field .checkbox-caption{transition:none}.checkbox-field.hover-effect{align-items:center;display:flex;height:3.5rem;margin-left:0;margin-right:0;padding:0 1.1875rem}[dir=ltr] .checkbox-field.hover-effect .checkbox-box{left:auto}[dir=rtl] .checkbox-field.hover-effect .checkbox-box{right:auto}.checkbox-field .anchor-url{pointer-events:all}.checkbox-ripple{border-radius:10px;overflow:hidden}.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{bottom:0;left:0;right:0;top:0}.checkbox-field-round .checkbox-box-border{border:2px solid var(--secondary-color);z-index:1}.checkbox-field-round .checkbox-box-check{--offset:calc(var(--size) - var(--size)/2 - 0.125rem)}html.is-safari .checkbox-field-round .checkbox-box{-webkit-mask-image:none}[dir=ltr] .radio-field{text-align:left}[dir=rtl] .radio-field{text-align:right}.radio-field{--size:1.375rem;--offset-left:0px;cursor:pointer;line-height:var(--line-height);margin:1.25rem 0;position:relative}.radio-field.hidden-widget{cursor:default}.radio-field.hidden-widget .radio-field-main:after,.radio-field.hidden-widget .radio-field-main:before{visibility:hidden}.radio-field>input:checked~.radio-field-main:before{border-color:var(--primary-color)}.radio-field>input:checked~.radio-field-main:after{transform:translateY(-50%) scale(1)}[dir=ltr] .radio-field .radio-field-main{padding-left:3.5rem}[dir=rtl] .radio-field .radio-field-main{padding-right:3.5rem}.radio-field .radio-field-main{color:inherit;position:relative}[dir=ltr] .radio-field .radio-field-main:after,[dir=ltr] .radio-field .radio-field-main:before{left:var(--offset-left)}[dir=rtl] .radio-field .radio-field-main:after,[dir=rtl] .radio-field .radio-field-main:before{right:var(--offset-left)}.radio-field .radio-field-main:after,.radio-field .radio-field-main:before{content:\"\";display:block;height:var(--size);position:absolute;top:50%;transform:translateY(-50%);width:var(--size)}.radio-field .radio-field-main:before{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}[dir=ltr] .radio-field .radio-field-main:after{left:calc(var(--offset-left) + .3125rem)}[dir=rtl] .radio-field .radio-field-main:after{right:calc(var(--offset-left) + .3125rem)}.radio-field .radio-field-main:after{background:var(--primary-color);border-radius:50%;height:.75rem;transform:translateY(-50%) scale(0);transform-origin:center;width:.75rem}body.animation-level-2 .radio-field .radio-field-main:after{transition:transform .1s ease}[dir=ltr] .radio-field.radio-field-right .radio-field-main:before{left:auto;right:0}[dir=rtl] .radio-field.radio-field-right .radio-field-main:before{left:0;right:auto}[dir=ltr] .radio-field.radio-field-right .radio-field-main:after{left:auto;right:.3125rem}[dir=rtl] .radio-field.radio-field-right .radio-field-main:after{left:.3125rem;right:auto}[type=checkbox],[type=radio]{box-sizing:border-box;opacity:0;padding:0;position:absolute;z-index:var(--z-below)}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dasharray:0,24.19;transition:stroke-dasharray .1s ease-in-out,visibility 0s .1s;visibility:hidden}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-background{transform:scale(0);transition:transform .2s ease-in-out .05s}.checkbox-field .checkbox-field-input:disabled+.checkbox-box,.checkbox-field .checkbox-field-input:disabled~.checkbox-caption{cursor:default;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{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;visibility:visible!important}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dashoffset:35.5;transform:rotate(45deg) translateY(-10px)}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-background{background-color:var(--danger-color)}.checkbox-field-toggle{--size:20px;align-items:center;display:flex;margin:0 .3125rem;padding:0 .25rem;pointer-events:none}.checkbox-field-toggle .checkbox-toggle{--offset:3px;--toggle-width:1.9375rem;align-items:center;background-color:var(--secondary-color);border-radius:12px;display:flex;height:.875rem;margin:0 var(--offset);position:relative;width:var(--toggle-width)}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle{transition:background-color .1s}.checkbox-field-toggle .checkbox-toggle:before{background-color:var(--surface-color);border:2px solid var(--secondary-color);border-radius:50%;content:\" \";height:1.25rem;position:absolute;transform:translateX(calc(var(--offset)*-1));width:1.25rem}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle:before{transition:border-color .1s,transform .1s cubic-bezier(.22,.75,.7,1.44)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle{background-color:var(--primary-color)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle:before{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{margin-bottom:17px;padding:1rem 0 .5rem;width:100%}@media only screen and (max-width:600px){.chatlist-container .search-group{margin-bottom:0}}.chatlist-container .search-group__name{color:var(--secondary-text-color);font-weight:var(--font-weight-bold);padding:0 23px 1rem;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (max-width:600px){.chatlist-container .search-group__name{font-size:15px;padding:5px 9px 0 16px}}.chatlist-container .search-group-contacts{border-bottom:1px solid var(--border-color)}@media only screen and (max-width:600px){.chatlist-container .search-group-contacts{padding:0 0 2px}}.chatlist-container .search-group-people.search-group-contacts{padding:5px 0!important}.chatlist-container .search-group:last-child{border-bottom:none}.chatlist-container .search-super .search-group{margin-bottom:0;padding:0 0 .5rem}.chatlist-container .search-super .search-group__name{display:flex;justify-content:space-between;padding-top:1rem}ul.chatlist{padding:0 .5rem}@media only screen and (max-width:600px){ul.chatlist{padding:0}}.chatlist{-webkit-touch-callout:none;background-color:var(--surface-color);display:flex;flex-direction:column;margin:0;position:relative;-moz-user-select:none;user-select:none;-webkit-user-select:none;width:100%}.chatlist-chat{--background:unset;-webkit-user-drag:none;background:var(--background)!important}.chatlist-chat.is-forum-open,.chatlist-chat.menu-open,html.no-touch .chatlist-chat:active,html.no-touch .chatlist-chat:hover{--background:var(--light-filled-secondary-text-color)}[dir=ltr] .chatlist-chat.is-muted .user-title:after{margin-left:.125rem}[dir=rtl] .chatlist-chat.is-muted .user-title:after{margin-right:.125rem}.chatlist-chat.is-muted .user-title:after{color:var(--chatlist-pinned-color);content:\"๎ฆƒ\";flex:0 0 auto;font-size:1.125rem}body:not(.animation-level-0) .chatlist-chat.is-muted.animating:not(.backwards) .user-title:after{animation:fade-in-opacity .2s ease-in-out forwards}body:not(.animation-level-0) .chatlist-chat.is-muted.animating.backwards .user-title:after{animation:fade-in-backwards-opacity .2s ease-in-out forwards}.chatlist-chat i{font-style:normal}.chatlist-chat .text-highlight{color:var(--primary-text-color)}.chatlist-chat .premium-icon{margin-top:-.125rem}.chatlist-chat .topic-icon{flex:0 0 auto}[dir=ltr] .chatlist-chat .row-title .topic-icon{margin-right:.25rem}[dir=rtl] .chatlist-chat .row-title .topic-icon{margin-left:.25rem}.chatlist-chat .row-title .topic-icon{--size:1.375rem}.chatlist-chat .topic-name .topic-icon{display:inline;line-height:1!important}.chatlist-chat .topic-name .topic-icon-svg{position:relative}.chatlist-chat .topic-name .topic-icon-content{left:0;margin-top:-6px;position:absolute;right:0;top:0}@media only screen and (min-width:601px){.chatlist-chat.active{--background:var(--primary-color)!important}.chatlist-chat.active .message-status,.chatlist-chat.active .premium-icon,.chatlist-chat.active .row-subtitle,.chatlist-chat.active .row-title,.chatlist-chat.active .sending-status-icon,.chatlist-chat.active .text-highlight,.chatlist-chat.active .tgico-chatspinned:before,.chatlist-chat.active .user-title,.chatlist-chat.active .verified-icon{color:#fff!important}.chatlist-chat.active .badge-fake{border-color:#fff;color:#fff}.chatlist-chat.active .danger,.chatlist-chat.active .primary-text{color:#fff!important}.chatlist-chat.active .user-title:after{color:hsla(0,0%,100%,.7)}.chatlist-chat.active .verified-icon-background{fill:#fff!important}.chatlist-chat.active .verified-icon-check{visibility:hidden}.chatlist-chat.active .dialog-avatar.is-online:after,.chatlist-chat.active .dialog-group-call-icon{background-color:#fff;border-color:var(--primary-color)}.chatlist-chat.active .badge.unread,.chatlist-chat.active .mention{background-color:#fff!important;color:var(--primary-color)}.chatlist-chat.active .peer-typing-container{--color:#fff}}.chatlist .peer-typing-container{--color:var(--secondary-text-color)}.chatlist .peer-typing-container .peer-typing-text{display:inline-flex;transform:translateY(-2px)}.chatlist .sending-status-icon.tgico-premium_lock{color:var(--secondary-color);font-size:.8125rem;margin:.1875rem 0 0 .5rem}[dir=ltr] .chatlist .dialog-title-details{margin-left:.5rem}[dir=rtl] .chatlist .dialog-title-details{margin-right:.5rem}.chatlist .dialog-title-details{flex:0 0 auto;font-size:.75rem;padding:1px 0 0}[dir=ltr] .chatlist .dialog-subtitle-badge{margin-left:.5rem}[dir=rtl] .chatlist .dialog-subtitle-badge{margin-right:.5rem}.chatlist .dialog-subtitle-badge{display:block!important;flex:0 0 auto}.chatlist .dialog-subtitle-badge.avatar-badge{--size:1.625rem;border:2px solid var(--background,var(--surface-color));line-height:23px!important;margin:0;pointer-events:none;position:absolute;right:calc(100% - 4.0625rem);top:2.4375rem}[dir=ltr] .chatlist .dialog-subtitle-media{margin-right:.375rem}[dir=rtl] .chatlist .dialog-subtitle-media{margin-left:.375rem}.chatlist .dialog-subtitle-media{border-radius:.25rem;display:inline-block;flex:0 0 auto;height:1.25rem;line-height:1.25rem;position:relative;width:1.25rem}.chatlist .dialog-subtitle-media:before{content:\"ย \";display:inline-block;height:inherit;min-height:inherit;min-width:inherit;width:inherit}.chatlist .dialog-subtitle-media.is-round{border-radius:50%}.chatlist .dialog-subtitle-media.is-round .tgico-play{font-size:.875rem}.chatlist .dialog-subtitle-media .tgico-play{color:#fff;font-size:1rem;left:50%;line-height:1;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:1}.chatlist .dialog-subtitle-media .media-photo{border-radius:inherit;bottom:auto;height:inherit;-o-object-fit:cover;object-fit:cover;top:auto;width:inherit}.chatlist .dialog-group-call-icon{background-color:var(--avatar-online-color);border:2px solid var(--surface-color);border-radius:50%;height:20px;left:45px;overflow:hidden;position:absolute;top:45px;width:20px;z-index:2}body.animation-level-2 .chatlist .dialog-group-call-icon,body.animation-level-2 .chatlist .dialog-subtitle-badge{opacity:1;transform:scale(0);transition:none}body.animation-level-2 .chatlist .dialog-group-call-icon.is-visible:not(.backwards),body.animation-level-2 .chatlist .dialog-subtitle-badge.is-visible:not(.backwards){transform:scale(1)}body.animation-level-2 .chatlist .dialog-group-call-icon.backwards,body.animation-level-2 .chatlist .dialog-subtitle-badge.backwards{opacity:0}body.animation-level-2 .chatlist .dialog-group-call-icon.animating,body.animation-level-2 .chatlist .dialog-subtitle-badge.animating{transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-group-call-icon.animating.backwards,body.animation-level-2 .chatlist .dialog-subtitle-badge.animating.backwards{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{opacity:1;transform:scale(0);transition:none}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 var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-avatar.animating.backwards:after{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 .dialog-avatar,.chatlist .row-row{pointer-events:none;position:relative}.chatlist .user-title{align-items:center;display:flex!important}.chatlist .user-title img.emoji{height:18px;margin-top:1px;vertical-align:top;width:18px}.chatlist .user-last-message img.emoji{height:20px;margin-top:-3px;width:20px}.chatlist .user-last-message,.chatlist .user-title{flex-grow:1;position:relative}[dir=ltr] .chatlist .message-status{margin-right:.125rem}[dir=rtl] .chatlist .message-status{margin-left:.125rem}.chatlist .message-status{color:var(--chatlist-status-color);display:inline-block;font-size:1.25rem;height:1.25rem;line-height:1;margin-top:-.0625rem;position:relative;vertical-align:middle;width:1.25rem}.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:var(--chatlist-pinned-color);opacity:1}.chatlist .tgico-chatspinned.unread:before{opacity:0}.chatlist .tgico-chatspinned{position:relative}.chatlist .tgico-chatspinned:before{left:0;position:absolute;top:0}.chatlist .mention{background-color:var(--chatlist-status-color)!important;line-height:1.25rem!important;padding:0}[dir=ltr] .chatlist .mention-badge{margin-right:-.125rem}[dir=rtl] .chatlist .mention-badge{margin-left:-.125rem}.chatlist .is-muted.backwards .unread,.chatlist .unread{background-color:var(--chatlist-status-color)}.chatlist .is-muted .unread,.chatlist .no-unmuted-topic .unread{background-color:var(--secondary-color)}.chatlist .not-visited{--size:.5rem;--padding:0;background-color:var(--secondary-color)!important}.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{margin-bottom:0!important;padding-bottom:0}.chatlist-bottom .chatlist-new{padding:0}.chat-input{--translateY:0;--padding-bottom:0.5rem;--bottom:var(--padding-bottom);display:flex;flex:0 0 auto;flex-direction:column;max-width:100%;padding-top:.25rem;position:relative;transform:translate3d(0,var(--translateY),0);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .chat-input{transition:none!important}@media only screen and (min-height:570px)and (min-width:601px){.chat-input{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{transform:translate3d(calc(var(--right-column-width)/-2),var(--translateY),0)!important;transition:transform var(--transition-standard-in)}}.chat-input.is-hidden{--translateY:100%;bottom:0;position:absolute!important;transform:translate3d(0,var(--translateY),0)!important;transition:transform var(--transition-standard-in)}.bubbles.is-selecting:not(.backwards)~.chat-input.is-hidden{--translateY:0}.chat-input-container{--padding-horizontal:var(--chat-input-padding);align-items:flex-end;display:flex;flex:0 0 auto;justify-content:center;margin:0 auto;max-width:var(--messages-container-width);padding:0 var(--padding-horizontal);padding-bottom:var(--bottom);position:relative;width:100%}.chat-input-container .btn-circle{height:var(--chat-input-size);width: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{border-bottom-right-radius:12px;max-height:var(--chat-input-size)}.chat-input-container.is-centering:not(.backwards) .rows-wrapper .bubble-tail{opacity:0;transform:scaleX(-1) translateX(1.125rem)}.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 .1s}.chat-input-container.is-centering.animating .rows-wrapper .bubble-tail{transition:transform .1s,opacity 25ms 0s}.chat-input-container.is-centering.animating .selection-wrapper{transition:opacity .1s 75ms}.chat-input-container.is-centering.animating .btn-send{transition:transform .2s}.chat-input-container.is-centering.animating:not(.backwards) .rows-wrapper .bubble-tail{transition:transform .1s,opacity 25ms 75ms}.chat-input .menu-send{bottom:calc(100% + .5rem);top:auto}.chat-input .toggle-emoticons:before{content:\"๎ฆด\"}.chat-input .toggle-emoticons.flip-icon:before{content:\"๎ฅ™\"!important}[dir=ltr] .chat-input .btn-record-cancel{right:0}[dir=rtl] .chat-input .btn-record-cancel{left:0}.chat-input .btn-record-cancel{--multiplier:-1;opacity:0;padding:0;position:absolute;top:0;transform:translateX(calc((100% + var(--padding-horizontal) + .5rem)*var(--multiplier)));visibility:hidden;z-index:3}.chat-input .btn-record-cancel .c-ripple__circle,html.no-touch .chat-input .btn-record-cancel:active:after,html.no-touch .chat-input .btn-record-cancel:hover:after{background-color:var(--light-danger-color)}.chat-input .btn-record-cancel:before{color:var(--danger-color)}.is-rtl .chat-input .btn-record-cancel{--multiplier:1}[dir=ltr] .chat-input .btn-scheduled:after{right:5px}[dir=rtl] .chat-input .btn-scheduled:after{left:5px}.chat-input .btn-scheduled:after{background:var(--message-checkbox-color);border-radius:50%;content:\"\";height:.5rem;position:absolute;top:5px;width:.5rem}.chat-input .btn-preloader .preloader{height:1.5rem;width:1.5rem}.chat-input .btn-preloader .preloader .preloader-path{stroke:var(--secondary-text-color)}body.animation-level-2 .chat-input .btn-preloader.show.backwards{animation:hide-icon .4s ease-in-out forwards!important}[dir=ltr] .chat-input .float{margin-right:.75rem!important}[dir=rtl] .chat-input .float{margin-left:.75rem!important}.chat-input .float{align-self:center;display:none!important;margin:0!important}body.animation-level-2 .chat-input .float{animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-height:569px),only screen and (max-width:600px){[dir=ltr] .chat-input .float{margin-right:.125rem!important}[dir=rtl] .chat-input .float{margin-left:.125rem!important}}.chat-input:not(.is-recording) .float.show:not(.hide){display:flex!important}[dir=ltr] .chat-input .btn-send-container{right:var(--padding-horizontal)}[dir=rtl] .chat-input .btn-send-container{left:var(--padding-horizontal)}.chat-input .btn-send-container{align-items:center;bottom:0;display:flex;justify-content:center;padding-bottom:inherit;position:absolute}.chat-input .btn-send-container .btn-menu-overlay{z-index:3}.chat-input .btn-icon{transition:opacity .2s}body.animation-level-0 .chat-input .btn-icon{transition:none}.chat-input .btn-cancel-record,.chat-input .btn-send{box-shadow:0 1px 8px 1px rgba(0,0,0,.12)}.chat-input .btn-send{background-color:var(--primary-color)!important;color:#fff!important;z-index:3}html.no-touch .chat-input .btn-send:active,html.no-touch .chat-input .btn-send:hover{background-color:var(--dark-primary-color)!important}.chat-input .btn-send .tgico-check{font-size:2rem;height:32px!important}.chat-input .btn-send .tgico-check:before{font-weight:var(--font-weight-bold)}.chat-input .btn-send.edit .tgico-check,.chat-input .btn-send.record .tgico-microphone_filled,.chat-input .btn-send.schedule .tgico-schedule,.chat-input .btn-send.send .tgico-send{visibility:visible!important}body.animation-level-2 .chat-input .btn-send.edit .tgico-check,body.animation-level-2 .chat-input .btn-send.record .tgico-microphone_filled,body.animation-level-2 .chat-input .btn-send.schedule .tgico-schedule,body.animation-level-2 .chat-input .btn-send.send .tgico-send{animation:grow-icon .4s ease-in-out forwards!important}.chat-input .btn-record-cancel,.chat-input .btn-send{font-size:1.5rem;line-height:1.5rem}.chat-input .record-time{display:none;height:44px;line-height:44px}.chat-input .record-time:after{background-color:var(--danger-color);border-radius:50%;content:\" \";display:inline-block;height:10px;margin-left:9px;margin-right:9px;width:10px}body.animation-level-2 .chat-input .record-time:after{animation:recordBlink 1.25s infinite}.chat-input .record-ripple{background-color:var(--message-highlightning-color);border-radius:50%;height:300px;opacity:.5;position:absolute;transform:scale(0);visibility:hidden;width:300px}@media only screen and (max-width:600px){.chat-input .record-ripple{height:240px;width: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-record-cancel,.chat-input.is-recording:not(.backwards) .btn-send{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 .1s,opacity .1s 0s}.chat-input.is-recording.animating .record-ripple{transition:transform .03s ease-in-out,visibility .1s}.chat-input.is-recording.animating .rows-wrapper{transition:width .2s}.chat-input.is-recording.animating:not(.backwards) .btn-record-cancel{transition:visibility 0s .1s,opacity .1s .1s}.chat-input.is-recording.animating:not(.backwards) .record-ripple{transition:transform .03s,visibility 0s}[dir=ltr] .chat-input:not(.is-recording) .btn-record-cancel{margin-right:0}[dir=rtl] .chat-input:not(.is-recording) .btn-record-cancel{margin-left:0}.chat-input:not(.is-recording) .btn-record-cancel{width:0}.chat-input .new-message-wrapper{opacity:1}.chat-input .reply-in-topic-overlay{align-items:center;background-color:inherit;border-radius:inherit;color:var(--secondary-text-color);display:flex;justify-content:center;padding:0 1rem;pointer-events:none;z-index:3}.bubbles.is-selecting:not(.backwards)~.chat-input .selection-wrapper{opacity:1}.bubbles.is-selecting.animating~.chat-input .new-message-wrapper{transition:opacity .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 .1s .1s}.bubbles.is-selecting.animating.backwards~.chat-input .selection-wrapper{transition:opacity .1s 0s}@keyframes recordBlink{0%{opacity:1}50%{opacity:.2}to{opacity:1}}#column-center{flex:3;position:relative;width:100%}@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{filter:brightness(80%);transform:translate3d(-25vw,0,0)}}@media only screen and (min-width:601px)and (max-width:925px){#column-center{bottom:0;left:0;position:fixed!important;right:0;top:0;transform:translateZ(0)}body.animation-level-2 #column-center{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:before{transform:rotate(180deg)}}.chats-container{height:100%}.chat{align-items:center;display:flex!important;flex-direction:column;transition:transform var(--tabs-transition),filter var(--tabs-transition);width:100%}body.animation-level-0 .chat{transition:none!important}.chat:not(.active):not(:last-child){filter:brightness(.8)}@media only screen and (min-width:926px){.chat:not(.active){transform:translate3d(calc((100vw - min(40vw, 420px))*-.25),0,0)}.chat:not(.active):last-child{transform:translate3d(calc(100vw - min(40vw, 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;user-select:none!important}.chat-background{background-color:#e6ebee;overflow:hidden}html.night .chat-background{background-color:var(--border-color)}.chat-background.no-transition:before{transition:none!important}.chat-background,.chat-background-item{bottom:0;left:0;position:absolute!important;right:0;top:0}.chat-background-item.is-image{background-color:inherit;background-image:url(assets/img/bg.jpeg);background-position:50%;background-size:cover}.chat-background-item.is-pattern{align-items:center;background-color:#000!important;background-image:none!important;background-repeat:repeat-x;background-size:contain;display:flex;justify-content:center;margin:0!important}@media only screen and (min-width:1276px){.chat-background-item.is-pattern{height:150%;top:-25%}}body.animation-level-2 .chat-background-item{opacity:0;transition:opacity var(--transition-standard-out)}body.animation-level-2 .chat-background-item.is-visible:not(.backwards){opacity:1;transition:opacity var(--transition-standard-in)}@media only screen and (min-width:1276px){body.animation-level-2 .chat-background-item{margin:-18.5rem 0 -22rem;transform:scale(1);transform-origin:left center;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(.666666667);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)!important}}.chat-background-item-canvas{--opacity-max:1;opacity:var(--opacity-max);position:absolute;width:100%}.chat-background-item:not(.is-dark) .chat-background-item-pattern-canvas{mix-blend-mode:soft-light}.chat-background-item-color-canvas{height:100%;-webkit-mask-position:center;mask-position:center;-webkit-mask-size:cover;mask-size:cover}.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){[dir=ltr] body.is-right-column-shown .chat .drops-container{right:calc(var(--right-column-width))}[dir=rtl] body.is-right-column-shown .chat .drops-container{left:calc(var(--right-column-width))}}@media only screen and (max-width:600px){.chat .drops-container{--padding:10px}}.chat .drop{--wrapper-padding:15px;max-width:696px}.chat[data-type=chat] .bubbles.is-chat-input-hidden .bubbles-date-group:last-of-type .bubbles-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);--button-size:2.125rem;--button-horizontal-margin:.125rem;align-items:center;border-radius:1rem;display:flex;flex:0 0 auto;flex-direction:column;justify-content:center;max-height:30rem;max-width:calc(100% - var(--chat-input-size) - .5rem);min-height:var(--chat-input-size);position:relative;width:calc(100% - var(--chat-input-size) - .5rem);z-index:3}.chat-input-wrapper:before{background-color:#fff;border-radius:inherit;bottom:0;box-shadow:0 1px 8px 1px rgba(0,0,0,.12);content:\" \";left:0;opacity:1;right:0;top:0}.chat-input-control,.chat-input-wrapper:before{background-color:var(--surface-color);position:absolute}.chat-input-control{--padding-vertical:.3125rem;--padding-horizontal:var(--chat-input-inner-padding);--padding:var(--padding-vertical) var(--padding-horizontal);height:var(--chat-input-size);margin:0 auto;padding:var(--padding);visibility:hidden;width:auto;z-index:3}.chat-input-control:before{opacity:0}.chat-input-control-button{height:2.5rem;justify-content:center;padding:0 .625rem}@media only screen and (max-width:600px){.chat-input-control-button{font-size:15px}}[dir=ltr] .chat-input-control-button:before{margin-right:10px}[dir=rtl] .chat-input-control-button:before{margin-left:10px}.fake-selection-wrapper,.selection-wrapper{max-width:calc(100% - var(--chat-input-padding)*2);position:absolute;top:0;width:28.75rem}.chat-input-control,.selection-wrapper{opacity:0}.selection-wrapper{background-color:var(--surface-color)}.selection-wrapper:before{content:none}.selection-wrapper .selection-container{align-items:center;border-radius:inherit;display:flex;font-size:15px;height:100%;justify-content:space-between;padding:inherit;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.selection-wrapper .selection-container-left,.selection-wrapper .selection-container-right{align-items:center;display:flex;justify-content:space-between;transform:translateX(0)}.selection-wrapper .selection-container-right{flex:0 0 auto}.selection-wrapper .selection-container-count{color:var(--primary-text-color);flex-grow:1;font-weight:var(--font-weight-bold);text-transform:capitalize;white-space:nowrap}[dir=ltr] .selection-wrapper .selection-container .btn-icon{margin-left:6px;margin-right:5px}[dir=rtl] .selection-wrapper .selection-container .btn-icon{margin-left:5px;margin-right:6px}.selection-wrapper .selection-container .btn-icon{height:42px;line-height:42px;width: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}}[dir=ltr] .selection-wrapper .selection-container-forward:before{margin-right:14px}[dir=rtl] .selection-wrapper .selection-container-forward:before{margin-left:14px}[dir=ltr] .selection-wrapper .selection-container-delete{margin-left:.375rem;margin-right:.625rem}[dir=rtl] .selection-wrapper .selection-container-delete{margin-left:.625rem;margin-right:.375rem}[dir=ltr] .selection-wrapper .selection-container-delete:before{margin-right:10px}[dir=rtl] .selection-wrapper .selection-container-delete:before{margin-left:10px}.fake-wrapper{position:absolute;visibility:hidden;z-index:-1}[dir=ltr] .fake-rows-wrapper{left:var(--padding-horizontal)}[dir=rtl] .fake-rows-wrapper{right:var(--padding-horizontal)}.fake-rows-wrapper{top:0;width:calc(100% - var(--chat-input-size) - var(--padding-horizontal)*2 - .5rem)}.rows-wrapper-wrapper{display:flex;width:100%}.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 .15s}.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control{transition:opacity .1s 75ms,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 .1s 0s,visibility 0s .2s}[dir=ltr] .rows-wrapper{border-bottom-right-radius:0}[dir=rtl] .rows-wrapper{border-bottom-left-radius:0}.rows-wrapper{transform:translateX(0) scaleX(1)}.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}}[dir=ltr] .rows-wrapper .bubble-tail{right:-8.4px}[dir=rtl] .rows-wrapper .bubble-tail{left:-8.4px}.rows-wrapper .bubble-tail{fill:var(--surface-color);bottom:-1px;height:20px;position:absolute;transform:scaleX(-1);width:11px}.is-rtl .rows-wrapper .bubble-tail{transform:scaleX(1)}.rows-wrapper .attach-file.menu-open{background-color:var(--light-primary-color)!important;color:var(--primary-color)}.rows-wrapper .attach-file.btn-disabled{opacity:var(--disabled-opacity)}.rows-wrapper>div{align-items:center;background-color:var(--surface-color);border-radius:1rem;display:flex;justify-content:space-between;padding:var(--padding);position:relative;width:100%}.rows-wrapper .reply-wrapper{align-items:center;height:0;justify-content:flex-start;margin-bottom:-.5625rem;opacity:0;padding:.5625rem var(--padding-horizontal) 0;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:2}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-bottom:-.3125rem;padding-top:.3125rem}}.chat.is-helper-active .rows-wrapper .reply-wrapper{height:45px;opacity:1;pointer-events:inherit}.rows-wrapper .reply-wrapper .reply{flex:1 1 auto;margin-left:.625rem;margin-right:.625rem;order:1}.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:var(--secondary-text-color)!important;height:1.125rem}.rows-wrapper .reply-wrapper .reply .peer-title{font-weight:400}[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu{left:3.125rem}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu{right:3.125rem}.rows-wrapper .reply-wrapper .btn-menu{bottom:calc(100% + .5rem);top:auto;transform:scale(1)!important}[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu-item{padding-right:1.5rem}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu-item{padding-left:1.5rem}.rows-wrapper .reply-wrapper .btn-menu-item-text{order:1}[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{margin-right:var(--icon-margin)}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{margin-left:var(--icon-margin)}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{--size:1.25rem;margin:0;order:0}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-background,.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-border{display:none}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-check use{stroke:var(--primary-text-color)}@media only screen and (max-width:600px){[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu{left:calc(var(--padding-horizontal)*-1)}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu{right:calc(var(--padding-horizontal)*-1)}}.rows-wrapper .input-message-input{margin-top:-1px;max-height:27.5rem!important}@media only screen and (max-height:30rem){.rows-wrapper .input-message-input{max-height:max(36px,calc(100vh - 10rem))}}@media only screen and (max-width:600px){.rows-wrapper .input-message-input{max-height:10rem}}.rows-wrapper .input-message-input[data-inline-placeholder]:after{color:#a2acb4;content:attr(data-inline-placeholder);pointer-events:none}.rows-wrapper .new-message-wrapper{--send-as-size:1.875rem;--send-as-margin-left:.25rem;--send-as-margin-right:.375rem;--send-as-total-size:calc(var(--send-as-size) + var(--send-as-margin-left) + var(--send-as-margin-right));--commands-size:2.375rem;--commands-margin-left:.25rem;--commands-margin-right:.375rem;--commands-total-size:calc(var(--commands-size) + var(--commands-margin-left) + var(--commands-margin-right));--offset-translateX:0px;align-items:flex-end;min-height:var(--chat-input-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands,.rows-wrapper .new-message-wrapper .new-message-send-as-container{bottom:calc(var(--padding-vertical) + .4375rem);cursor:pointer;flex:0 0 auto;opacity:0;position:absolute;transform:scale(0);z-index:2}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-bot-commands{margin-left:var(--commands-margin-left)}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-bot-commands{margin-right:var(--commands-margin-left)}.rows-wrapper .new-message-wrapper .new-message-bot-commands{align-items:center;background-color:var(--primary-color);border-radius:1.875rem;cursor:pointer;display:flex;height:1.875rem;justify-content:center;width:var(--commands-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{position:relative}.rows-wrapper .new-message-wrapper .new-message-bot-commands-icon-scale{align-items:center;display:flex;justify-content:center;transform:scale(.875)}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{--color:#fff}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container{margin-left:var(--send-as-margin-left)}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container{margin-right:var(--send-as-margin-left)}.rows-wrapper .new-message-wrapper .new-message-send-as-container{background:none!important;height:var(--send-as-size);width:var(--send-as-size)}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{right:auto}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{left:auto}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{left:calc(var(--padding-horizontal)*-1 - .25rem)!important}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{right:calc(var(--padding-horizontal)*-1 - .25rem)!important}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{height:auto;max-height:20rem;max-width:20rem;top:auto;transform:scaleX(1);width:auto}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item{height:2.25rem}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-header{height:1.875rem}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon{margin-right:calc(var(--icon-margin) - .5rem)}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon{margin-left:calc(var(--icon-margin) - .5rem)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon.active:before{--offset:-.125rem;border:.0625rem solid var(--primary-color);border-radius:inherit;bottom:var(--offset);content:\" \";left:var(--offset);position:absolute;right:var(--offset);top:var(--offset)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-text{display:flex;flex-direction:column;justify-content:center;line-height:1!important;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-subtitle{font-size:.8125rem;font-weight:400}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar{opacity:0;pointer-events:none;position:absolute;transform:scale(0)}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible:not(.backwards){opacity:1;transform:scale(1)}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible.animating{transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .new-message-send-as-close{align-items:center;background-color:var(--primary-color);border-radius:50%;color:#fff;display:flex;font-size:1.375rem;height:inherit;justify-content:center;width:inherit;z-index:1}.rows-wrapper .new-message-wrapper.has-offset[data-offset=as]{--offset-translateX:var(--send-as-total-size)}.rows-wrapper .new-message-wrapper.has-offset[data-offset=commands]{--offset-translateX:48px}.rows-wrapper .new-message-wrapper.has-offset .input-message-container,.rows-wrapper .new-message-wrapper.has-offset .toggle-emoticons{transform:translateX(0)}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .toggle-emoticons{transform:translateX(var(--offset-translateX))}[dir=ltr] .rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{margin-right:var(--translateX)}[dir=rtl] .rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{margin-left:var(--translateX)}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{--translateX:calc(var(--offset-translateX));transform:translate(var(--translateX))}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-bot-commands,.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-send-as-container{opacity:1;transform:scale(1)}.rows-wrapper .new-message-wrapper.has-offset.animating .input-message-container,.rows-wrapper .new-message-wrapper.has-offset.animating .toggle-emoticons{transition:transform var(--transition-standard-in)}.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-bot-commands,.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-send-as-container{transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + 1.125rem)}@media only screen and (max-height:569px),only screen and (max-width:600px){.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + .875rem)}}.rows-wrapper .new-message-wrapper .btn-menu.top-left{right:calc(var(--padding-horizontal)*-1 - .125rem)}.rows-wrapper .new-message-wrapper .btn-menu.top-right{left:calc(var(--padding-horizontal)*-1 - .125rem)}.rows-wrapper .btn-icon{color:var(--secondary-text-color);flex:0 0 auto;font-size:1.5rem;height:var(--button-size);margin-bottom:5px;margin-left:var(--button-horizontal-margin);margin-right:var(--button-horizontal-margin);margin-top:0;padding:0;width:var(--button-size)}.rows-wrapper .btn-icon.active{color:var(--primary-color)}.input-message-container{align-items:center;align-self:center;display:flex;flex:1 1 auto;max-height:inherit;min-height:calc(var(--chat-input-size) - var(--padding-vertical)*2);overflow:hidden;position:relative;width:1%}.input-message-container .scrollable{position:relative}.input-message-input{--custom-emoji-size:var(--messages-custom-emoji-size);background:none;border:none;font-size:var(--messages-text-size);line-height:var(--line-height);outline:none;overflow-y:none;padding:.5rem .5625rem;resize:none;width:100%}.input-message-input pre{display:inline;margin:0}body.animation-level-2 .input-message-input{transition:height .1s}.bubbles{--translateY:0;flex:1 1 auto;position:relative;transform:translate3d(0,var(--translateY),0);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .bubbles{transition:none!important}.chat[data-type=chat] .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-78px;transition:transform var(--transition-standard-in)}@media only screen and (max-width:600px){.chat[data-type=chat] .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-58px}}.chat[data-type=chat] .bubbles.is-chat-input-hidden.is-selecting:not(.backwards) .bubbles-inner{transform:translateY(calc(var(--translateY)*-1));transition:transform var(--transition-standard-in)}.bubbles>.scrollable{display:block;height:auto}@media only screen and (min-width:1276px){body.is-right-column-shown .bubbles{transform:translate3d(calc(var(--right-column-width)/-2),var(--translateY),0);transition:transform var(--transition-standard-in)}}body.animation-level-2 .bubbles.is-selecting .bubbles-group-avatar,body.animation-level-2 .bubbles.is-selecting .is-in .bubble-content-wrapper{transition:var(--bubble-transition-out)}body.animation-level-2 .bubbles.is-selecting:not(.backwards) .bubbles-group-avatar,body.animation-level-2 .bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transition:var(--bubble-transition-in)}.bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transform:translateX(2.5rem) scale(1)}.bubbles.is-selecting:not(.backwards) .bubbles-group-avatar{transform:translate3d(2.5rem,0,0) scale3d(.76,.76,1)}.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 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 - 0.625rem)}.bubbles .search-group.search-group-messages{padding:.25rem 0 .5rem}.bubbles-inner{display:flex;flex-direction:column;justify-content:flex-end;margin:0 auto;max-width:var(--messages-container-width);min-height:100%;padding:0 .8125rem;transform:translateY(0);transition:transform var(--transition-standard-out);width:100%}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:after{content:\" \";height:.125rem}[dir=ltr] .bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-left:45px}[dir=rtl] .bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-right:45px}@media only screen and (max-width:600px){.bubbles-inner.is-chat .is-in .bubble-content-wrapper{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% - var(--message-beside-button-margin)*-1)!important}.bubbles-inner.is-chat .message,.bubbles-inner.is-chat .name,.bubbles-inner:not(.is-channel) .message,.bubbles-inner:not(.is-channel) .name{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 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;transform:none!important;transition:opacity var(--layer-transition),visibility 0s .2s!important;visibility:hidden}.bubbles-go-mention{--translateY:0;cursor:default;opacity:0;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s .2s!important;visibility:hidden}.bubbles-go-mention.is-visible{cursor:pointer;opacity:1;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s 0s!important;visibility:visible}.chat-secondary-button{align-items:center;background-color:var(--surface-color)!important;border-radius:50%;box-shadow:0 1px 8px 1px rgba(0,0,0,.12)!important;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;position:absolute}body.animation-level-0 .chat-secondary-button{transition:none!important}.chat-secondary-button:before{position:relative}.chat-secondary-button:after{border-radius:inherit;bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}html.no-touch .chat-secondary-button:active:after,html.no-touch .chat-secondary-button:hover:after{background-color:var(--light-secondary-text-color)}[dir=ltr] .bubbles-corner-button{right:var(--chat-input-padding)}[dir=rtl] .bubbles-corner-button{left:var(--chat-input-padding)}.bubbles-corner-button{bottom:calc(var(--chat-input-size) + var(--bottom) + 10px);overflow:visible;z-index:2}[dir=ltr] .bubbles-corner-button .badge{right:-.25rem}[dir=rtl] .bubbles-corner-button .badge{left:-.25rem}.bubbles-corner-button .badge{position:absolute;top:-.25rem}.bubbles-corner-button .badge.badge-primary:not(.badge-gray){background-color:var(--chatlist-status-color)}@media only screen and (max-width:600px){[dir=ltr] .bubbles-corner-button .badge{right:.1875rem}[dir=rtl] .bubbles-corner-button .badge{left:.1875rem}.bubbles-corner-button .badge{top:-.75rem}}.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 var(--transition-standard-out)}body.is-calling:not(.backwards) .topbar,body.is-calling:not(.backwards) .topbar-call-container{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;cursor:pointer!important;margin-bottom:var(--pinned-floating-height);max-height:var(--topbar-height)!important;min-height:var(--topbar-height)!important;position:relative;width:100%;z-index:1}.topbar:before{box-shadow:0 1px 5px -1px rgba(0,0,0,.21);content:\" \";height:calc(var(--topbar-height) + var(--pinned-floating-height) - var(--topbar-floating-call-height));left:0;pointer-events:none;position:absolute;right:0;top:0}.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}[dir=ltr] .chat:first-child .topbar .chat-info{padding-left:.1875rem}[dir=rtl] .chat:first-child .topbar .chat-info{padding-right:.1875rem}}@media only screen and (min-width:1276px){.topbar .pinned-container-wrapper-utils{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 var(--transition-standard-in)}body.animation-level-0 .topbar .pinned-container-wrapper-utils{transition:none}}.topbar .sidebar-close-button{position:absolute}.topbar .user-title{align-items:center;display:flex;font-size:1rem;font-weight:var(--font-weight-bold);line-height:1.5rem;max-width:calc(100% - 1.5rem)}.topbar .user-title span.emoji{vertical-align:inherit}.topbar .info,.topbar .peer-title{line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.topbar .info:not(:empty){margin-top:1px}.topbar .btn-menu-toggle .btn-menu{max-height:calc(var(--vh)*100 - 4.375rem);top:calc(100% + 7px)}@media only screen and (max-width:600px){.topbar .btn-menu-toggle .btn-menu{max-height:calc(var(--vh)*100 - 3.75rem);top:29px}.topbar .btn-menu-toggle{margin-left:0}}[dir=ltr] .topbar .chat-info{padding-left:49px}[dir=rtl] .topbar .chat-info{padding-right:49px}.topbar .chat-info{flex:1 1 auto;max-width:calc(100% - var(--utils-width));overflow:hidden}@media only screen and (max-width:600px){[dir=ltr] .topbar .chat-info{padding-left:52px}[dir=rtl] .topbar .chat-info{padding-right: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{align-items:center;display:flex;flex:1 1 auto;height:3.5rem;justify-content:space-between;max-height:3.5rem;max-width:100%}.topbar .chat-utils{align-items:center;display:flex;flex:0 0 auto}@media only screen and (min-width:1276px){.topbar .chat-utils{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 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}}[dir=ltr] .topbar .chat-join{margin-right:.5rem}[dir=rtl] .topbar .chat-join{margin-left:.5rem}.topbar .chat-join{font-size:.875rem;font-weight:400;height:2.25rem;padding:0 1.375rem;width:auto}.topbar .chat-join:not(.hide)+.chat-mute-button{display:none}[dir=ltr] .topbar .content{padding-left:1.125rem}[dir=rtl] .topbar .content{padding-right:1.125rem}.topbar .content{flex:1 1 auto;max-width:100%;overflow:hidden}.topbar .person{align-items:center;display:flex}.topbar .person-avatar{flex:0 0 auto}.topbar .person .bottom{color:var(--secondary-text-color);font-size:.875rem}.topbar .person .bottom .online{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}[dir=ltr] .chat:not([data-type=chat]) .topbar .content{padding-left:16px}[dir=rtl] .chat:not([data-type=chat]) .topbar .content{padding-right:16px}[dir=ltr] .topbar-call-container{left:1px;right:0}[dir=rtl] .topbar-call-container{left:0;right:1px}.topbar-call-container{color:#fff;cursor:pointer!important;height:var(--topbar-call-height)!important;min-height:auto!important;position:absolute;top:calc(var(--topbar-call-height)*-1);z-index:2}body:not(.has-chat) .topbar-call-container{background:none!important}@media only screen and (max-width:925px){[dir=ltr] .topbar-call-container{left:0}[dir=rtl] .topbar-call-container{right:0}}.topbar-call-container .btn-icon{color:inherit;flex:0 0 auto;height:2.5rem;padding:0;width:2.5rem}.topbar-call-container .peer-title{font-weight:var(--font-weight-bold);white-space:nowrap}@media only screen and (max-width:480px){.topbar-call-container:not(.is-call) .topbar-call-left,.topbar-call-container:not(.is-call) .topbar-call-right{width:auto}.topbar-call-container:not(.is-call) .group-call-description{display:none}.topbar-call-container.is-call .topbar-call-left,.topbar-call-container.is-call .topbar-call-right{width:6.25rem}.topbar-call-container.is-call .call-description:not(.has-duration){display:none}}.topbar-call-left,.topbar-call-right{flex:0 0 auto;width:12rem}.topbar-call-left{align-items:center;display:flex}[dir=ltr] .topbar-call-left .btn-icon{margin-right:.375rem}[dir=rtl] .topbar-call-left .btn-icon{margin-left:.375rem}.topbar-call-left .call-description{white-space:nowrap}.topbar-call-left .call-description-duration{font-weight:var(--font-weight-bold)}.topbar-call-center{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media only screen and (min-width:1276px){.topbar-call-center{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 var(--transition-standard-in)}body.animation-level-0 .topbar-call-center{transition:none}.topbar-call-center{padding:0 calc(var(--right-column-width)/2)}}.topbar-call-right{display:flex;justify-content:flex-end}@media only screen and (min-width:1276px){.topbar-call-right{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 var(--transition-standard-in)}body.animation-level-0 .topbar-call-right{transition:none}}.topbar-call-weave{bottom:-1.125rem;left:0;pointer-events:none;position:absolute;right:0;top:0;transform:scale(var(--topbar-floating-scaleX),-1);transform-origin:left center;z-index:-1}.is-rtl .topbar-call-weave{transform-origin:right center}@media only screen and (min-width:1276px){.topbar-call-weave{transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-weave{transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-weave{transition:none}}.topbar-call-weave-canvas{height:100%;width:100%}.topbar .back-unread-badge{position:absolute;right:-.5rem;top:-.25rem}@media only screen and (min-width:601px){.topbar .back-unread-badge{display:none}}@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}.bubbles-group{position:relative}.bubbles-group-avatar{bottom:.25rem;cursor:pointer;pointer-events:all;position:sticky!important;top:0}.bubbles.is-selecting .bubbles-group-avatar{transform:translateZ(0) scaleX(1);transform-origin:bottom}.bubbles-group-avatar.is-gesturing-reply{transform:translateX(0)}.bubbles-group-avatar.is-gesturing-reply.animating.backwards{transition:transform var(--transition-standard-out)}.bubbles-group-avatar-container{bottom:0;display:flex;flex-direction:column-reverse;left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:2}.bubble{--line-height:var(--messages-line-height);display:flex;flex-wrap:wrap;margin:0 auto .125rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:1}.bubble.is-gesturing-reply{transform:translateX(0)}.bubble.is-gesturing-reply.animating.backwards{transition:transform var(--transition-standard-out)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon{align-items:center;background-color:var(--message-highlightning-color);border-radius:50%;color:#fff;display:flex;height:var(--message-beside-button-size);justify-content:center;opacity:0;position:absolute;right:var(--message-beside-button-margin);top:50%;transform:translateY(-50%);transform:translateY(-50%) scale(.6);visibility:hidden;width:var(--message-beside-button-size)}.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{transform:translateY(-50%) scale(1);visibility:visible}.bubble.is-highlighted:after,.bubble.is-selected:after,.bubble:after{bottom:-.0625rem;content:\" \";left:-50%;position:absolute;top:-.0625rem;z-index:-1}.bubble.is-highlighted:after{background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-highlighted:after{animation:bubbleSelected 2s linear}@media only screen and (max-width:600px){.bubble.is-first-unread{max-width:none}}.bubble.is-first-unread:before{background-color:var(--surface-color);color:var(--primary-color);content:\"Unread messages\";font-size:15px;font-weight:var(--font-weight-bold);height:30px;line-height:2.1;margin-bottom:.25rem;margin-left:-50%;margin-right:-50%;position:relative;text-align:center;z-index:2}.bubble.is-first-unread.is-highlighted:after,.bubble.is-first-unread.is-selected:after{top:calc(.0625rem + 30px)}.bubble.is-selected:after{background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-selected:after{animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-selected.backwards:after{animation:fade-in-backwards-opacity .2s linear forwards}.bubble:after,.bubble:before{display:block;width:200%}.bubble.is-multiple-documents:after,.bubble.is-multiple-documents:before{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{display:flex;left:0;margin:0;position:absolute;z-index:3}.bubble-select-checkbox .checkbox-box-border{border-color:var(--message-checkbox-border-color)}.bubble-select-checkbox .checkbox-box-background{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:0 0 3px 0 rgba(0,0,0,.4)}.bubbles.is-selecting .bubble:not(.is-album) .attachment,.bubbles.is-selecting .bubble:not(.is-album) .audio,.bubbles.is-selecting .bubble:not(.is-album) .document,.bubbles.is-selecting .bubble:not(.is-album) poll-element{pointer-events:none!important}.bubbles.is-selecting .bubble a,.bubbles.is-selecting .bubble img,.bubbles.is-selecting .bubble video{pointer-events:none}.bubble-content{background-color:var(--message-background-color);border-radius:12px;box-shadow:0 1px 2px 0 rgba(16,35,47,.15);display:flex;flex-direction:column-reverse;max-width:100%;min-width:56px;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:2}body.animation-level-0 .bubble-content{transition:none}html.is-touch body:not(.no-select) .chat:not(.no-forwards) .bubbles.is-selecting .bubble-content,html.no-touch .chat:not(.no-forwards) .bubbles:not(.is-selecting) .bubble-content{-webkit-user-select:text;-moz-user-select:text;user-select:text}.bubble-content.hover-reaction-visible .bubble-beside-button{transform:translateX(1.125rem)}.bubble.is-out .bubble-content.hover-reaction-visible .bubble-beside-button{transform:translateX(-1.125rem)}.bubble.is-out .bubble-content.hover-reaction-visible .bubble-beside-button.goto-original{transform:translateX(-1.125rem) rotate(180deg)}.bubble-hover-reaction{--size:1.875rem;--offset:calc(var(--size)*-0.75);align-items:center;background-color:var(--surface-color);border-radius:var(--size);bottom:0;box-shadow:var(--menu-box-shadow);cursor:pointer;display:flex;height:1.625rem;justify-content:center;opacity:0;position:absolute;right:var(--offset);transform:scale(.8);width:var(--size);z-index:2}body.animation-level-2 .bubble-hover-reaction{transition:opacity var(--btn-corner-transition),transform var(--btn-corner-transition)}.bubble-hover-reaction.is-visible:not(.backwards){opacity:1;transform:scale(1)}.bubble-hover-reaction-sticker{height:1.125rem;position:relative;width:1.125rem}.bubble.service{max-width:var(--messages-container-width)}.bubble.service .bubble-content{box-shadow:none;margin:0 auto;max-width:100%}.bubble.is-date{font-weight:var(--font-weight-bold);opacity:.99999;padding-bottom:.375rem;pointer-events:none;position:sticky;top:.25rem;transition:opacity .3s ease;z-index:2}.bubble.is-date:after,.bubble.is-date:before{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[data-type=chat] .bubble.is-date .bubble-content,.chat[data-type=discussion] .bubble.is-date .bubble-content{cursor:pointer;pointer-events:all}.bubbles:not(.has-sticky-dates) .bubble.is-date{visibility:hidden}.bubbles.has-sticky-dates .bubble.is-date.is-fake{display:none}.bubble.is-date.is-fake{left:50%;opacity:1!important;position:absolute;top:0;transform:translateX(-50%);transition:none!important;visibility:visible!important}.bubble-beside-button{align-items:center;background:var(--message-highlightning-color);border-radius:50%;bottom:0;color:var(--badge-text-color);cursor:pointer;display:flex;font-size:1.5rem;height:var(--message-beside-button-size);justify-content:center;position:absolute;right:var(--message-beside-button-margin);transform:translateX(0);width:var(--message-beside-button-size)}html.no-touch .bubble-beside-button{opacity:0}html.no-touch body.animation-level-2 .bubble-beside-button{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.bubble-view-button{align-items:center;border:1px solid var(--message-primary-color);border-radius:6px;color:var(--message-primary-color);display:flex;height:2rem;justify-content:center;margin:0 .5625rem .5rem;text-decoration:none!important;width:auto}html.no-touch .bubble-view-button:active,html.no-touch .bubble-view-button:hover{background-color:var(--light-filled-message-primary-color)}.bubble-view-button .c-ripple__circle{background-color:var(--message-primary-color);opacity:.08}.message .bubble-view-button{margin:.375rem 0 -.375rem;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.bubble-view-button+.reactions-block{margin-top:.375rem}html.no-touch .bubble:active .bubble-beside-button,html.no-touch .bubble:hover .bubble-beside-button{opacity:1}.bubble .forward{font-size:1.25rem}.bubble.is-group-last{margin-bottom:.5rem}.bubble.is-group-last:after{bottom:-.25rem}.bubbles-inner.is-chat .bubble.is-group-last.is-in>.bubble-select-checkbox{bottom:.1875rem}.bubble.is-group-first:after{top:-.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:-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;min-width:100%}.bubble.webpage .document{height:3.375rem}@media only screen and (max-width:600px){.bubble.webpage .document{padding-left:44px}}.bubble.webpage .has-document{display:flex;flex-direction:column}.bubble.webpage .has-document .preview-resizer{order:1}.bubble .preview-resizer{display:flex}.bubble img.emoji{height:18px;vertical-align:bottom;width:18px}.bubble .thumbnail{position:absolute}.bubble .canvas-thumbnail{border-radius:inherit}.bubble .canvas-dots{z-index:1}.bubble.emoji-big{--emoji-size:1rem;font-size:0}.bubble.emoji-big .bubble-content{line-height:1}.bubble.emoji-big .attachment{--custom-emoji-size:var(--emoji-size);border-radius:0!important}.bubble.emoji-big .attachment img.emoji{height:var(--emoji-size);max-height:64px;max-width:64px;width:var(--emoji-size)}.bubble.emoji-big .attachment .custom-emoji,.bubble.emoji-big .attachment .emoji{display:inline-block}.bubble.emoji-big:not(.sticker) .attachment{display:block;font-size:var(--emoji-size);max-height:-moz-fit-content!important;max-height:fit-content!important;padding-bottom:1.25rem;padding-top:.25rem;white-space:pre-wrap;word-break:break-word}.bubble.emoji-big:not(.sticker) .attachment span.emoji{height:auto;width:auto}.bubble.emoji-big:not(.sticker) .message{margin-top:-1.125rem}.bubble.emoji-big:not(.sticker) .bubble-content{max-width:min(420px,100%)}.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:var(--message-highlightning-color)}.bubble.emoji-big:not(.sticker) .bubble-content,.bubble.sticker .bubble-content{align-self:flex-start}.bubble.emoji-big:not(.sticker) .message,.bubble.sticker .message{margin-left:auto;position:relative!important;right:0!important}.bubble.sticker .attachment{border-radius:0;position:absolute;z-index:1}.bubble.round .attachment{height:var(--round-video-size)!important;max-height:var(--round-video-size)!important;max-width:var(--round-video-size)!important;width: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{border-radius:inherit;cursor:pointer;display:flex;justify-content:center;max-width:100%;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .attachment img,.bubble .attachment video{max-width:100%}.bubble .attachment .download{align-items:center;cursor:pointer;display:flex;height:100%;justify-content:center;left:0;position:absolute;top:0;width:100%}.bubble .attachment .download span{background-color:var(--message-time-background);color:#fff;font-size:23px;text-align:center}.bubble .attachment .download~.video-play,.bubble .attachment .preloader-container~.video-play{display:none}.bubble .media-container-aspecter{margin:0 auto;position:relative;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{animation:thumbnail-fade-in-opacity .2s ease-in-out forwards}.bubble .preloader-container{z-index:2}.bubble:not(.sticker) .attachment{max-height:min(340px,100%);max-width:min(420px,100%);width:-moz-max-content;width:max-content}.bubble img:not(.emoji),.bubble video{height:100%;-o-object-fit:cover;object-fit:cover;width: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-height:none;max-width:min(451px,100%)}.bubble .album-item{background-color:var(--message-highlightning-color);cursor:pointer;max-width:100%;overflow:hidden;position:absolute}body.animation-level-0 .bubble .album-item{transition:none!important}.bubble .album-item img,.bubble .album-item video,.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 var(--transition-standard-out)}.bubble .album-item.is-selected.animating .album-item-media{transition:transform var(--transition-standard-out),border-radius var(--transition-standard-out)}.bubble .album-item.is-selected:not(.backwards){transition:border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards) .album-item-media{transform:scale(.883333);transition:transform var(--transition-standard-in),border-radius var(--transition-standard-in)}.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:active,html.no-touch .bubble a:hover{text-decoration:underline}.bubble-first{align-items:center;justify-content:center;margin-top:.5rem;max-width:100%;order:-1}body.animation-level-0 .bubble-first{flex:1 1 auto}.bubble-first .attachment{pointer-events:none}.bubble-first .bubble-content-wrapper{max-width:100%}.bubble-first.empty-bubble-placeholder{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}body.animation-level-2 .bubble-first.empty-bubble-placeholder .bubble-content-wrapper{transition:var(--bubble-transition-in)}.bubble-first.empty-bubble-placeholder.has-description .service-msg{align-items:flex-start!important;flex-direction:column;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-size:1rem!important;font-weight:var(--font-weight-bold)}.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{font-size:1.25rem;margin-left:-.1875rem;margin-right:.25rem;vertical-align:bottom}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-list-bullet{margin-right:.3125rem}.bubbles.has-groups .bubble-first.empty-bubble-placeholder{pointer-events:none}.bubbles.has-groups .bubble-first.empty-bubble-placeholder .bubble-content-wrapper{opacity:0;transform:scale3d(.8,.8,1) translateX(0)}.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{cursor:pointer;height:200px;margin-top:.75rem!important;position:relative;width:200px}.bubble-first .time{display:none!important}.bubble-first:after,.bubble-first:before{display:none}.bubble .web{line-height:var(--line-height);margin:.125rem 0 0;max-width:100%;overflow:hidden}.bubble .web+.time{display:block}.bubble .web .preview{border-radius:4px;cursor:pointer;max-height:min(340px,100%);max-width:min(420px,100%);overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;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 .text,.bubble .web .title,.bubble .web .webpage-name{font-size:var(--messages-secondary-text-size);line-height:var(--messages-secondary-line-height)}.bubble .web .webpage-name{text-decoration:none}html.no-touch .bubble .web .webpage-name:active,html.no-touch .bubble .web .webpage-name:hover{text-decoration:underline}.bubble .web .text{margin-top:1px;word-break:break-word}.bubble .web .quote{display:flex;max-width:100%;overflow:hidden;width:100%}.bubble .web .quote-text{margin-left:-.625rem;max-width:100%;padding-left:.625rem;width:100%}.bubble .web .quote:before{background-color:var(--primary-color);border-radius:.125rem;content:\" \";flex:0 0 auto;margin:.1875rem .5rem .125rem 0;width:.125rem}.bubble .reply{--font-size:var(--messages-secondary-text-size)}.bubble .document-name{font-size:var(--messages-text-size)}.bubble .document-size{font-size:var(--messages-secondary-text-size)}.bubble.is-square-photo .bubble-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{float:right;height:3rem;margin:.1875rem 0 0 .625rem;width:3rem}.bubble.is-square-photo .web .preview{margin:0;max-height:min(3rem,100%);max-width:min(3rem,100%)}.bubble .reply{border-radius:.25rem;cursor:pointer;margin:0 .375rem .375rem;min-width:10rem;padding:.25rem;width:auto}.bubble .reply-media{top:.125rem}.bubble .reply-content{height:auto;max-width:calc(100% - 1.25rem);min-height:32px;overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap}.bubble .message+.reply{margin-bottom:0}.bubble:not(.just-media) .reply{border-radius:6px}html.no-touch .bubble:not(.just-media) .reply:active,html.no-touch .bubble:not(.just-media) .reply:hover{background-color:var(--light-filled-message-primary-color)}.bubble.just-media .floating-part{background-color:var(--message-highlightning-color);border-radius:12px;margin:0;max-width:15rem;padding:.375rem .625rem;position:absolute;top:0;white-space:nowrap}@media only screen and (max-width:600px){.bubble.just-media .floating-part{max-width:calc(100vw - 1rem - 10px - 100%)}}.bubble.just-media .name{color:#fff!important;line-height:var(--line-height);padding:.375rem .625rem}.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;max-width:none!important;position:relative}.bubble.just-media .reply i,.bubble.just-media .reply-subtitle,.bubble.just-media .reply-title{color:#fff!important}.bubble.just-media .reply-border{background:#fff!important}.bubble.forwarded .attachment,.bubble.is-reply .attachment,.bubble:not(.hide-name) .attachment{border-top-left-radius:0;border-top-right-radius:0}.bubble .message,.bubble .service-msg{--custom-emoji-size:var(--messages-custom-emoji-size)}.bubble .message{color:var(--primary-text-color);font-size:var(--messages-text-size);line-height:var(--line-height);max-width:100%;padding:0 .5rem .375rem .625rem;position:relative;white-space:pre-wrap;word-break:break-word}.bubble .message .custom-emoji{display:inline-flex}.bubble .message:last-child{padding-top:6px}@media only screen and (max-width:600px){.bubble .audio,.bubble .document{--icon-size:2.25rem}}.bubble .audio .audio-title{font-weight:var(--font-weight-bold)}.bubble .audio .audio-ico{font-size:0}@media only screen and (max-width:600px){.bubble .audio{--icon-margin:.6875rem;height:2.375rem}.bubble .audio .audio-details{margin-bottom:0;margin-top:2px}.bubble .audio .audio-subtitle{margin-top:-1px}}.bubble .message.audio-message{width:335px}@media only screen and (max-width:600px){.bubble .message.audio-message{width:280px}}.bubble .message.audio-message,.bubble .message.voice-message{max-width:min(100%,335px)!important}@media only screen and (max-width:600px){.bubble .message.audio-message,.bubble .message.voice-message{max-width:min(100%,300px)!important}}.bubble.min-content .bubble-content{width:-moz-min-content;width:min-content}.bubble .message.voice-message .document-message{max-width:-moz-fit-content;max-width:fit-content}.bubble .message.audio-message,.bubble .message.voice-message{padding:8px!important}.bubble .message.call-message,.bubble .message.contact-message{min-width:200px;padding-left:8px}.bubble .message.contact-message .contact{cursor:pointer;display:flex;padding:2px 0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .message.contact-message .contact-avatar{color:#fff}.bubble .message.contact-message .contact-details{display:flex;flex-direction:column;margin-top:8px;padding-left:12px}.bubble .message.contact-message .contact-name{font-size:1rem;font-weight:var(--font-weight-bold)}.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{--icon-margin:.75rem;height:58px}@media only screen and (max-width:600px){.bubble .message.document-message .document{--icon-margin:.5rem;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 0 0}}.bubble .message.document-message .document-name{line-height:1.4;margin-top:1px;overflow:hidden;text-overflow:ellipsis}.bubble-call{cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding:.125rem 0 .125rem 2.5625rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble-call:before{font-size:1.5rem;left:.3125rem;position:absolute}.bubble-call-title{font-weight:var(--font-weight-bold)}.bubble-call-subtitle{align-items:center;color:var(--secondary-text-color);display:flex;font-size:var(--messages-secondary-text-size);line-height:var(--messages-secondary-line-height);margin-left:-.1875rem;margin-top:.0625rem}.bubble-call-subtitle.is-reason:before{margin-right:.0625rem}.bubble-call-subtitle:before{content:\"๎คŒ\";display:inline-block;font-size:1rem;transform:rotate(135deg)}.bubble-call-subtitle.arrow-red:before{color:var(--danger-color)}.bubble-call-subtitle.arrow-green:before{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 .time{align-self:flex-start;height:0}.bubble .document-message+.audio .time,.bubble .document-message+.document .time{display:none!important}.bubble.is-multiple-documents .message{border-radius:inherit;padding:0!important}.bubble.is-multiple-documents .document-container{border-radius:inherit;position:relative}.bubble.is-multiple-documents .document-container .document-selection{bottom:0;left:-75vw;position:absolute;top:0;width:200vw;z-index:-2}.bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before,.bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{background-color:var(--message-background-color);border-radius:inherit;bottom:0;content:\" \";left:0;position:absolute;right:0;top:0;z-index:-1}.bubble.is-multiple-documents .document-container.is-highlighted .document-selection{background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-selection{animation:bubbleSelected 2s linear}.bubble.is-multiple-documents .document-container.is-selected .document-selection{background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-selection{animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-selection{animation:fade-in-backwards-opacity .2s linear forwards}.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--margin-top:.25rem;--margin-left:.125rem;background:#fff;border-radius:50%;left:auto;margin-left:calc(var(--padding-left)*-1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto}@media only screen and (max-width:600px){.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--size:1.125rem}}.bubble.is-multiple-documents .document-container .bubble-select-checkbox:before{--inner-size:.125rem;border:2px solid var(--secondary-color);border-radius:inherit;content:\" \";height:calc(var(--size) - var(--inner-size)*2);left:var(--inner-size);position:absolute;top:var(--inner-size);width:calc(var(--size) - var(--inner-size)*2)}.bubble.is-multiple-documents .document-container:first-of-type .document-selection{top:-.0625rem}.bubble.is-multiple-documents .document-container:first-of-type .document-wrapper{border-top-left-radius:inherit;border-top-right-radius:inherit;padding-top:.5rem}.bubble.is-multiple-documents .document-container:last-of-type .document-selection{bottom:-.0625rem}.bubble.is-multiple-documents .document-container:last-of-type .document-wrapper{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;padding-bottom:.5rem}.bubble.is-multiple-documents.is-group-first .document-container:first-of-type .document-selection{top:-.25rem}.bubble.is-multiple-documents.is-group-last .document-container:last-of-type .document-selection{bottom:-.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{padding:.25rem .5rem}.bubble.is-multiple-documents .document-wrapper>.name{margin-top:-.1875rem;padding:0 0 .25rem}.bubble .message .audio .time,.bubble .message.contact-message .time,.bubble .message.poll-message .time{bottom:0;position:absolute;right:0}html:not(.is-safari) .bubble .message.voice-message{overflow:hidden}.bubble.is-message-empty .bubble-content-wrapper{width:-moz-min-content;width:min-content}.bubble.is-message-empty .message{background-color:var(--message-time-background);border-radius:.75rem;bottom:.1875rem;padding:0 .3125rem;position:absolute;right:.1875rem;z-index:2}.bubble.is-message-empty .message .time{align-items:center;display:flex;height:calc(var(--messages-time-text-size) + .375rem);margin:0;padding:0;white-space:nowrap}.bubble.is-message-empty .message .time .inner{bottom:auto;color:#fff;margin:inherit;right:auto}.bubble.is-message-empty .message .time .inner:after{color:#fff!important}.bubble.is-message-empty.with-replies:not(.sticker):not(.with-beside-replies) .message{bottom:55px}.bubble.is-message-empty.emoji-big .message,.bubble.is-message-empty.sticker .message,.bubble.is-message-empty.with-replies.round .message{bottom:0}.bubble.is-message-empty:not(.emoji-big) .reactions-block{max-width:-moz-fit-content;max-width:fit-content}.bubble.is-message-empty .reaction-block{--chosen-background-color:var(--primary-color)}html.no-touch .bubble.is-message-empty .reaction-block:not(.is-chosen):active:after,html.no-touch .bubble.is-message-empty .reaction-block:not(.is-chosen):hover:after{background-color:#fff}.bubble.with-reply-markup .bubble-content{min-width:100%}.bubble.with-replies .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble.with-beside-replies .bubble-content{min-height:5.5rem}.bubble .colored-name .premium-icon{color:inherit;opacity:.6}.bubble .time{cursor:pointer;direction:ltr;display:inline-flex;float:right;font-size:var(--messages-time-text-size);height:var(--messages-time-text-size);line-height:1;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;visibility:hidden;z-index:1}.bubble .time i{font-size:1.125rem;margin-right:.375rem}.bubble .time-icon{pointer-events:none}.bubble .time-icon:not(:first-child){margin-left:2px}.bubble .time i.edited{font-size:inherit;overflow:visible}.bubble .time .inner{align-items:center;bottom:0;color:var(--message-time-color);display:flex;height:var(--messages-time-text-size);line-height:1;padding:inherit;pointer-events:all;position:absolute;right:0;visibility:visible;white-space:nowrap}.bubble .time .inner:after{color:var(--message-status-color)}.bubble .time .tgico-pinnedchat{margin-right:.125rem}.bubble .time.is-block{display:block;float:none}.bubble.webpage .time{float:none}.bubble .video-play,.bubble .video-time{pointer-events:none}.bubble .video-time{--height:calc(var(--messages-time-text-size) + 0.375rem);align-items:center;background-color:var(--message-time-background);border-radius:var(--height);color:#fff;display:flex;font-size:var(--messages-time-text-size);height:var(--height);left:3px;line-height:1;padding:0 6px;position:absolute;top:3px;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:2}.bubble .video-time.can-autoplay:after{color:#fff;content:\"๎ฆƒ\";font-size:calc(var(--messages-time-text-size) + 8px);padding:0 1px 0 3px}[dir=ltr] .bubble .video-time.is-error:after{margin-left:1px}[dir=rtl] .bubble .video-time.is-error:after{margin-right:1px}.bubble .video-time.is-error:after{content:\"๎ฆญ\";font-size:calc(var(--messages-time-text-size) + 4px);padding:0}.bubble .extended-media-buy{align-items:center;-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:rgba(0,0,0,.3);border-radius:2rem;color:#fff;display:flex;font-size:var(--font-size-14);font-weight:var(--font-weight-bold);height:2.5rem;left:50%;padding:0 1rem;position:absolute;top:50%;transform:translate(-50%,-50%);white-space:nowrap;z-index:2}.bubble .extended-media-buy:before{font-size:1.125rem;margin-right:.25rem}.bubble pre{display:inline;margin:0}.bubble .anchor-url{text-decoration:underline}.bubble .video-play{align-items:center;background-color:var(--message-time-background);color:#fff;display:flex;font-size:2.125rem;justify-content:center;text-align:center;z-index:2}.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;user-select:none}.bubble .peer-title{cursor:pointer}.bubble .name{color:var(--primary-color);font-size:var(--messages-secondary-text-size);font-weight:var(--font-weight-bold)!important;line-height:calc(var(--messages-secondary-text-size) + .25rem);max-width:100%;overflow:hidden;padding:.375rem .625rem 0;text-overflow:ellipsis}.bubble .name .badge-fake{display:inline-block;margin-top:-2px;vertical-align:middle}.bubble:not(.webpage).photo:not(.is-reply) .bubble-content>.name,.bubble:not(.webpage).video:not(.is-reply) .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).photo .topic-name-button-container,.bubble:not(.webpage).video .topic-name-button-container{margin-bottom:0}.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):not(.forwarded).hide-name .reply,.bubble:not(.sticker):not(.emoji-big):not(.forwarded):not(.is-group-first) .reply{margin-top:6px}.bubble .bubble-tail{display:none}.bubble.can-have-tail.is-group-last .bubble-tail{fill:var(--message-background-color);display:block;height:20px;position:absolute;transform:translateY(1px);width:11px;z-index:-2}.bubble.is-message-empty.is-group-last.with-media-tail .bubble-tail,.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 .attachment{overflow:visible}.bubble__media-container{border-radius:inherit;cursor:pointer}.bubble audio-element,.bubble poll-element{white-space:normal}.bubble .replies{-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .replies .c-ripple__circle{background-color:var(--light-primary-color)}.bubble .replies .rp{border-radius:inherit;cursor:pointer;height:100%;left:0;overflow:hidden;position:absolute;top:0;width:100%}.bubble .replies-beside{border-radius:2rem;bottom:47px;flex-direction:column;height:auto;max-height:52px;min-height:36px;padding:.375rem 0 .5rem;right:-44px;width:36px}.bubble .replies-beside-text{font-size:.75rem;margin-top:.125rem}.bubble .replies-footer{align-items:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;border-top:.0625rem solid var(--border-color);color:var(--primary-color);display:flex;height:3.0625rem;min-width:15rem;padding:0 .5rem;position:relative}html.no-touch .bubble .replies-footer:active,html.no-touch .bubble .replies-footer:hover{background-color:var(--light-primary-color)}html.no-touch .bubble .replies-footer:active~.bubble-tail,html.no-touch .bubble .replies-footer:hover~.bubble-tail{fill:var(--light-filled-message-primary-color)}.bubble .replies-footer .tgico-comments,.bubble .replies-footer .tgico-next{font-size:1.5rem}.bubble .replies-footer .tgico-comments{margin-left:.125rem;margin-right:.375rem}.bubble .replies-footer-text{align-items:center;color:var(--primary-color);display:flex;font-size:.9375rem;font-weight:var(--font-weight-bold);line-height:1.125rem;margin-left:.5rem}.bubble .replies-footer-avatars{--margin-right:-.875rem;--border-size:2px}.bubble .replies-footer .tgico-next{position:absolute;right:.1875rem}.bubble .replies-footer.is-unread .replies-footer-text:after{background-color:var(--primary-color);border-radius:50%;content:\" \";height:.5rem;margin-left:.75rem;width:.5rem}.bubble.is-thread-starter .user-avatar{display:none}.bubble.is-thread-starter.is-in .bubble-content-wrapper{margin-left:0}.bubble .message .reaction{--background-color:var(--light-filled-message-primary-color)}.bubble .message .reaction.is-chosen.backwards,.bubble .message .reaction:not(.is-chosen){--counter-color:var(--message-primary-color)}.bubble .message .reaction.is-chosen.backwards .stacked-avatars,.bubble .message .reaction:not(.is-chosen) .stacked-avatars{--border-color:var(--background-color)}.bubble .message .reactions-block .time{bottom:auto!important;order:100;position:static!important;right:auto!important}.bubble code{cursor:pointer}.bubble.is-invoice .attachment{background-color:inherit!important}.bubble.with-reply-markup .bubble-content{border-bottom-left-radius:6px!important;border-bottom-right-radius:6px!important}.bubble .name-with-reply .name{padding:0!important}.bubble .name-with-reply .name:not(:last-child) .hide-ol{display:none}.bubble .name-with-reply .name:not(:last-child) .peer-title{font-weight:var(--font-weight-bold)!important}.bubble .name-with-reply .reply{height:auto;margin:.25rem 0 0;max-height:none;padding:0}.bubble .topic-name-button{--color:var(--message-primary-color)}.bubble .name .topic-name-button-container{margin:.25rem -.125rem}.bubble .name .topic-name-button-container:first-child{margin-top:0}.bubble.is-message-empty:not(.is-reply) .name .topic-name-button-container{margin-bottom:0}.bubble:not(.is-group-first) .topic-name-button-container{display:none!important}.bubble .topic-name-button-container.floating-part{font-size:var(--messages-secondary-text-size);padding-bottom:0;padding-top:0}.bubble .topic-name-button-container.floating-part .topic-name-button{--color:#fff;padding:0}.bubble .topic-name-button-container.floating-part .topic-name-button:before{content:none}.bubble .topic-name-button-container.floating-part+.floating-part{margin-top:1.75rem}.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type{margin-bottom:.0625rem}.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type .document-container:last-of-type .document-selection,.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type:after{bottom:-.0625rem}.can-zoom-fade{opacity:1;transform:scale(1) translateX(0);transform-origin:center}body.animation-level-2 .can-zoom-fade{transition:var(--bubble-transition-out)}.bubbles-inner.zoom-fading .can-zoom-fade{transition:var(--bubble-transition-in)}.can-zoom-fade.zoom-fade{opacity:0;transform:scale3d(.8,.8,1) translateX(0)}.bubble-content-wrapper{display:flex;flex-direction:column}@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% - var(--message-handhelds-margin))}}.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{align-items:center;background-color:var(--message-highlightning-color);border-radius:inherit;color:#fff;display:flex;font-size:var(--messages-service-text-size);justify-content:center;line-height:calc(var(--messages-service-text-size) + 5px);padding:.28125rem .625rem;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;word-break:break-word}.bubble.service .service-msg i{font-style:normal}.bubble.service .service-msg a{color:#fff}.bubble.service .service-msg .peer-title,.bubble.service .service-msg [data-saved-from],.bubble.service .service-msg a{cursor:pointer;font-weight:var(--font-weight-bold)}.bubble.service .service-msg .peer-title:hover,.bubble.service .service-msg [data-saved-from]:hover,.bubble.service .service-msg a:hover{text-decoration:underline}.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!important}.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 .floating-part{left:calc(100% + 10px)}@media only screen and (max-width:600px){.bubble.is-in.just-media .floating-part{left:calc(100% + 1px)}}.bubble.is-in .quote .webpage-name,.bubble.is-in .reply-title{color:var(--primary-color)}.bubble.is-in .time{margin-left:-3px;padding-right:8px}.bubble.is-in .time .inner{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 .audio-time,.bubble.is-in .contact-number{color:var(--secondary-text-color)!important}.bubble.is-in code,.bubble.is-in pre{color:var(--monospace-text-color)}.bubble.is-in:not(.just-media) .reply.is-overriding-color .reply-border{background-color:rgb(var(--override-color))}.bubble.is-in:not(.just-media) .reply.is-overriding-color .reply-title{color:rgb(var(--override-color))}html.no-touch .bubble.is-in:not(.just-media) .reply.is-overriding-color:active,html.no-touch .bubble.is-in:not(.just-media) .reply.is-overriding-color:hover{background-color:rgba(var(--override-color),.08)}.bubble.is-out{--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);--message-primary-color:var(--message-out-primary-color);--light-filled-message-primary-color:var(--light-filled-message-out-primary-color);--selection-background-color:var(--message-out-selection-background-color);--message-time-color:var(--message-out-time-color);--message-status-color:var(--message-out-status-color);flex-direction:row-reverse}.bubble.is-out .bubble-content{margin-left:auto}.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: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) + .5rem)*-1))}.bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(.8,.8,1) translateX(calc((var(--chat-input-size) + .5rem)*-1))}body.animation-level-2 .bubble.is-out .bubble-content-wrapper{transition:var(--bubble-transition-out)}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:var(--bubble-transition-in)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(.8,.8,1) translateX(0)}}.bubble.is-out .anchor-url{color:var(--message-primary-color)}.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!important}.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 .floating-part{right:calc(100% + 10px)}.bubble.is-out.just-media .message{right:0}.bubble.is-out:not(.just-media) .reply-border{background-color:var(--message-out-primary-color)!important}.bubble.is-out:not(.just-media) .reply i,.bubble.is-out:not(.just-media) .reply-title{color:var(--message-out-primary-color)!important}.bubble.is-out .quote:before{background-color:var(--message-out-primary-color)}.bubble.is-out .quote .webpage-name{color:var(--message-out-primary-color)}.bubble.is-out .time{margin-left:-4px;padding-right:5px}.bubble.is-out .time .inner{bottom:4px}.bubble.is-out .time .inner:after,.bubble.is-out .time:after{font-size:calc(var(--messages-text-size) + 3px);line-height:var(--messages-time-text-size);margin-left:1px}.bubble.is-out.forwarded .name{color:var(--message-out-primary-color)}.bubble.is-out.is-read .time .inner:after,.bubble.is-out.is-read .time:after{content:\"๎ค\"}.bubble.is-out.is-sent .time .inner:after,.bubble.is-out.is-sent .time:after{content:\"๎ค€\"}.bubble.is-out.is-sending .time .inner:after,.bubble.is-out.is-sending .time:after{content:\"๎ฆฌ\"}.bubble.is-out.is-error .time .inner:after,.bubble.is-out.is-error .time:after{color:var(--message-error-color);content:\"๎ฆญ\"}.bubble.is-out .document-ico:after{border-right-color:var(--message-background-color);border-top-color:var(--message-background-color)}.bubble.is-out .audio-waveform rect{fill:var(--message-out-primary-color)}.bubble.is-out .audio-waveform rect.active{fill:var(--message-out-primary-color)!important}.bubble.is-out .audio-subtitle,.bubble.is-out .audio-time{color:var(--message-out-status-color)}.bubble.is-out .audio-download,.bubble.is-out .audio-toggle,.bubble.is-out .audio.corner-download .preloader-container{background-color:var(--message-out-primary-color)}.bubble.is-out .audio-download:empty{display:none}.bubble.is-out .audio.is-unread rect{fill:var(--message-out-primary-color)}.bubble.is-out .audio.is-unread .audio-time:after{background-color:var(--message-out-primary-color)}.bubble.is-out .audio-toggle .part{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.is-message-empty .reactions-block{justify-content:flex-end}.bubble.is-out.is-message-empty .reaction-block{margin-right:.25rem}.bubble.is-out.is-message-empty .reaction-block:last-child{margin-right:0}.bubble.is-out.is-message-empty .reaction-block.is-chosen{--chosen-background-color:var(--surface-color)}.bubble.is-out.is-message-empty:not(.emoji-big) .reactions-block{margin-left:auto}.bubble.is-out .bubble-call-subtitle,.bubble.is-out .contact-number,.bubble.is-out .document-size{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:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-line use{stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-answer-selected{background-color:var(--message-out-primary-color);color:var(--light-filled-message-out-primary-color)}html.no-touch .bubble.is-out poll-element .poll-answer:hover .animation-ring{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:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-avatars .stacked-avatars{--border-color:var(--message-background-color)}.bubble.is-out poll-element .progress-ring__circle{stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle{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:var(--message-out-primary-color)}.bubble.is-out .audio .preloader-container{--color:var(--message-background-color)}.bubble.is-out .bubble-beside-button{left:var(--message-beside-button-margin);right:auto}.bubble.is-out .bubble-beside-button.goto-original{transform:rotate(180deg)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox{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:var(--message-background-color)}.bubble.is-out .bubble-hover-reaction{left:var(--offset);right:auto}.reply-markup{margin-top:.0625rem;width:100%}.bubble:not(.is-group-last) .reply-markup{margin-bottom:.125rem}.reply-markup-row{display:flex;margin-top:.125rem;min-height:2.5rem;overflow:hidden}.reply-markup-row:last-child .reply-markup-button:first-child{border-bottom-left-radius:12px}.reply-markup-row:last-child .reply-markup-button:last-child{border-bottom-right-radius:12px}.reply-markup-button{background:var(--message-highlightning-color);border:none;border-radius:.375rem;color:#fff!important;cursor:pointer;font-size:var(--font-size-14);font-weight:var(--font-weight-bold);outline:none;overflow:hidden;padding:.5625rem 0;position:relative;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:2}.reply-markup-button-text{pointer-events:none;position:relative}.reply-markup-button.anchor-url{text-decoration:none!important}.reply-markup-button+.reply-markup-button{margin-left:.125rem}.reply-markup-button .forward-icon,.reply-markup-button.tgico:before{display:block;position:absolute;right:.125rem;top:.125rem}.reply-markup-button.is-link:before{content:\"๎คŒ\";transform:rotate(-45deg)}.reply-markup-button.is-buy:before{content:\"๎คœ\"}.reply-markup-button.is-switch-inline:before{content:\"๎ฅ‹\"}.bubble-beside-button:after,.bubble.just-media .reply:after,.reply-markup-button:after{background-color:#fff;border-radius:inherit;bottom:0;content:\" \";display:block;left:0;opacity:0;position:absolute;right:0;top:0;z-index:-1}html.no-touch .bubble-beside-button:active:after,html.no-touch .bubble-beside-button:hover:after,html.no-touch .bubble.just-media .reply:active:after,html.no-touch .bubble.just-media .reply:hover:after,html.no-touch .reply-markup-button:active:after,html.no-touch .reply-markup-button:hover:after{opacity:var(--hover-alpha)}.bubble-primary-color{color:var(--message-primary-color);font-weight:var(--font-weight-bold)}.pinned-message{--custom-emoji-size:calc(var(--font-size) + 2px)!important}.pinned-message-border{flex:0 0 auto;height:2rem;position:relative;width:.125rem}.pinned-message-border-wrapper-1{background:var(--primary-color);border-radius:1px;height:2rem;position:relative;top:50%;transform:translateY(-50%);width:.125rem}.pinned-message-border-mask{--mask-height:.375rem;--height:2.5rem;height:var(--height);overflow:hidden}.pinned-message-border-mask:after,.pinned-message-border-mask:before{content:\" \";display:block;height:var(--mask-height);left:0;opacity:0;position:absolute;right:0;z-index:1}body.animation-level-2 .pinned-message-border-mask:after,body.animation-level-2 .pinned-message-border-mask:before{transition:opacity .2s ease-in-out}.pinned-message-border-mask:before{background:linear-gradient(var(--surface-color),transparent);top:0}.pinned-message-border-mask:after{background:linear-gradient(transparent,var(--surface-color));bottom:0}.pinned-message-border-mask.mask-bottom:after,.pinned-message-border-mask.mask-top:before{opacity:1}.pinned-message-border-wrapper{color:var(--primary-color);position:relative}.pinned-message-border-wrapper:before{background:var(--primary-color);bottom:0;content:\" \";display:block;left:0;opacity:.4;position:absolute;right:0;top:0}.pinned-message-border-bars{stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.pinned-message-border-mark{background:currentColor;border-radius:1px;left:0;position:absolute;top:0;width:2px}body:not(.animation-level-0) .pinned-message-border-mark,body:not(.animation-level-0) .pinned-message-border-wrapper{transition:transform .25s ease-in-out;will-change:transform}.pinned-message-content{--height:32px;height:var(--height)}.pinned-message-media{border-radius:.1875rem}.pinned-message,.reply{--font-size:var(--font-size-14);--custom-emoji-size:calc(var(--font-size) + 4px);--line-height:calc(var(--font-size) + 4px);align-items:center;cursor:pointer;display:flex;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.pinned-message-content,.reply-content{display:flex;flex-direction:column;flex-grow:1;flex-shrink:1;justify-content:center;margin-left:.5rem;overflow:hidden;pointer-events:none;position:relative}.pinned-message-title,.reply-title{color:var(--primary-color)}.pinned-message-subtitle,.pinned-message-title,.reply-subtitle,.reply-title{font-size:var(--font-size);line-height:var(--line-height);overflow:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap}.pinned-message-media,.reply-media{height:2rem!important;left:0;overflow:hidden;position:absolute;top:.125rem;width:2rem!important}.pinned-message-media.is-round,.reply-media.is-round{border-radius:50%}.pinned-message-media>img,.pinned-message-media>video,.reply-media>img,.reply-media>video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.pinned-message i,.reply i{color:var(--secondary-text-color);font-style:normal}.pinned-message img.emoji,.reply img.emoji{height:1rem;vertical-align:top;width:1rem}.reply.is-media .reply-content{padding-left:2.5rem}.reply-border{background:var(--primary-color);border-radius:1px;height:calc(var(--font-size)*2 + .25rem);min-width:2px}.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:var(--font-weight-bold)}.pinned-container{--container-height:3.25rem;align-items:center;cursor:pointer;display:flex;flex:0 0 auto;justify-content:space-between;overflow:visible}.pinned-container.is-floating{background-color:var(--surface-color)!important;height:var(--container-height);left:0;margin:0;max-height:var(--container-height);position:absolute!important;right:0;top:var(--topbar-height);width:auto}.pinned-container.is-floating .pinned-container-wrapper{border-radius:0;height:100%;max-width:100%;order:0;padding:0 1rem;z-index:0}@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{border-bottom:1px solid var(--border-color);border-top:1px solid var(--border-color);bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.pinned-container-content{flex:1 1 auto;overflow:hidden;pointer-events:none;position:relative}.pinned-container .btn-icon{display:flex;flex:0 0 auto;font-size:1.5rem;justify-content:center}.pinned-container-wrapper{align-items:center;border-radius:.25rem;display:flex;flex:1 1 auto;order:1;overflow:hidden;padding:.25rem}.pinned-container-wrapper-utils{align-items:center;display:flex;flex:0 0 auto;position:relative}.pinned-message{display:flex;width:auto}.pinned-message-content{overflow:visible!important}.pinned-message-media-container{height:2rem;margin-left:-.25rem;position:absolute;width:2rem}body.animation-level-2 .pinned-message-media-container{transition:transform var(--pm-transition)}.pinned-message-subtitle,.pinned-message-title{transform:translateX(0)}.pinned-message.is-media .pinned-message-subtitle,.pinned-message.is-media .pinned-message-title{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-subtitle,.pinned-message.is-media .pinned-message-title{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-subtitle,.pinned-message-content .pinned-message-title{height:calc(var(--height)/2);min-height:calc(var(--height)/2);overflow:visible;position:relative}body.animation-level-2 .pinned-message-content .pinned-message-subtitle,body.animation-level-2 .pinned-message-content .pinned-message-title{transition:transform var(--pm-transition)}.pinned-message-title{margin-bottom:.25rem}.pinned-message-subtitle .animated-super-row{font-size:var(--font-size-14);line-height:16px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pinned-message .animated-counter{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){opacity:0;transform:scale(.68)}.pinned-message .animated-super-row{--translateY:16px}.pinned-message .pinned-message-media{--translateY:32px}.pinned-message.hide~.tgico-pinlist,.pinned-message.is-many .pinned-message-close,.pinned-message.is-many.is-floating .pinned-message-close,.pinned-message.is-many:not(.is-floating) .pinned-message-pinlist,.pinned-message:not(.is-many) .pinned-message-pinlist,.pinned-message:not(.is-many)~.tgico-pinlist{display:none}.pinned-message-pinlist{order:2}.chat[data-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){max-width:210px;padding-right:1.75rem;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:var(--font-weight-bold)}.pinned-audio-subtitle{color:var(--secondary-text-color)}.pinned-audio-subtitle,.pinned-audio-title{font-size:var(--font-size-14);line-height:var(--line-height-14);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.pinned-audio-content{margin-left:.75rem}.pinned-audio-progress{--border-radius:0;--height:var(--progress-height);--translateY:.125rem;bottom:0;left:0;position:absolute;right:0;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 var(--transition-standard-out)}body.is-right-column-shown .pinned-audio-progress{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:active,html.no-touch .pinned-audio-progress:hover{--translateY:0}.pinned-audio-progress .progress-line__filled:after{display:none!important}.pinned-audio-progress .progress-line__seek{top:-1rem}.pinned-audio-progress-wrapper{bottom:0;height:.5rem;left:0;overflow:hidden;position:absolute;right:0}.pinned-audio-volume{align-items:center;height:2.5rem;position:relative;width:2.5rem}html.is-touch .pinned-audio-volume{display:none}.pinned-audio-volume-tunnel{bottom:-1rem;content:\" \";left:0;position:absolute;right:0;top:100%}.pinned-audio-volume .player-volume__icon{cursor:pointer;display:flex}.pinned-audio-volume .progress-line-container{background-color:var(--surface-color);border-radius:10px;box-shadow:0 1px 5px 0 rgba(0,0,0,.15);margin-top:2.25rem;opacity:0;padding:.75rem 1rem;position:absolute;top:100%;transform:rotate(270deg);transition:opacity .2s ease-in-out,visibility 0s .2s;visibility:hidden;width:5rem}body.animation-level-0 .pinned-audio-volume .progress-line-container{transition:none!important}.pinned-audio-volume:active .progress-line-container,.pinned-audio-volume:hover .progress-line-container{opacity:1;transition:opacity .2s ease-in-out,visibility 0s 0s;visibility:visible}.markup-tooltip{background:var(--surface-color);border-radius:10px;bottom:0;display:flex;height:44px;justify-content:flex-start;left:0;opacity:0;overflow:hidden;position:fixed;right:0;top:0;transform:translateZ(0);transition:opacity var(--layer-transition),transform var(--layer-transition),width var(--layer-transition);width:252px;z-index:1}body.animation-level-0 .markup-tooltip{transition:none}.markup-tooltip-wrapper{align-items:center;display:flex;height:100%;justify-content:flex-start;left:0;max-width:100%;position:absolute;top:0;transform:translateX(0);transition:transform var(--layer-transition);width:672px}body.animation-level-0 .markup-tooltip-wrapper{transition:none}.markup-tooltip-tools{align-items:center;display:flex;flex:0 0 auto;justify-content:space-between;max-width:100%;padding:7px}.markup-tooltip-tools:first-child{width:252px}.markup-tooltip-tools:last-child{width:420px}.markup-tooltip-tools:last-child .markup-tooltip-delimiter{margin:0 .25rem}.markup-tooltip-delimiter{background-color:var(--border-color);height:25px;width:1px}.markup-tooltip .btn-icon{border-radius:8px!important;height:30px;padding:0;width:30px}.markup-tooltip .btn-icon.active{background-color:var(--primary-color)!important;color:#fff!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(-252px)}.markup-tooltip-link-apply{color:var(--primary-color);font-size:2rem}.markup-tooltip-link-apply-container{align-items:center;display:flex;opacity:0;pointer-events:none;transition:opacity var(--layer-transition)}body.animation-level-0 .markup-tooltip-link-apply-container{transition:none}.markup-tooltip .input-clear{flex:1 1 auto;margin:0 .5rem;text-overflow:ellipsis}.markup-tooltip .input-clear.is-valid+.markup-tooltip-link-apply-container{opacity:1;pointer-events:all}.stickers-helper>.scrollable{max-height:13.75rem;min-height:var(--esg-sticker-size);padding:.4375rem;position:relative}.stickers-helper-stickers{border-radius:var(--border-radius);max-width:100%}html.no-touch .stickers-helper .super-sticker:not(.active):active,html.no-touch .stickers-helper .super-sticker:not(.active):hover{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:after,.emoji-helper .super-emojis:before{content:\" \";display:inline-block;width:.25rem}html.no-touch .emoji-helper .super-emoji:not(.active):active,html.no-touch .emoji-helper .super-emoji:not(.active):hover{background:none}.emoji-helper .super-emoji.active{background-color:var(--primary-color)!important}.inline-helper{-webkit-user-select:none;-moz-user-select:none;user-select:none}.inline-helper:not(.is-gallery){min-width:min(20rem,100%)}.inline-helper .scrollable{max-height:232px;position:relative}.inline-helper-separator{background-color:var(--border-color);height:1px;margin-left:4rem;width:100%}.inline-helper-separator:last-child{display:none}.inline-helper .btn-primary{border-radius:0;border-radius:initial}.inline-helper-results:not(.is-gallery){cursor:pointer}.inline-helper-results:not(.is-gallery) .inline-helper-result{height:4rem;line-height:var(--line-height);padding:.5rem .5rem .5rem 4rem}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview{height:3rem!important;left:.5rem;overflow:hidden;position:absolute;width:3rem!important}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview.empty{align-items:center;background-color:var(--primary-color);border-radius:.375rem;color:#fff;display:flex;font-size:1.75rem;justify-content:center;text-transform:uppercase}.inline-helper .media-container{border-radius:inherit}.inline-helper .media-photo,.inline-helper .media-poster,.inline-helper .media-video{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.inline-helper .gif{bottom:0;height:auto!important;left:0;position:absolute;right:0;top:0;width:auto!important}.inline-helper-results.is-gallery{grid-gap:1px;border-radius:var(--border-radius);grid-template-columns:repeat(auto-fill,minmax(var(--esg-sticker-size),1fr));max-width:100%}.inline-helper-results.is-gallery .inline-helper-result{height:auto!important;width:auto!important}.inline-helper-result{position:relative}.inline-helper-result-title{font-weight:var(--font-weight-bold);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.inline-helper-result-description{-webkit-line-clamp:2;-webkit-box-orient:vertical;color:var(--secondary-text-color);display:-webkit-box;font-size:.875rem;overflow:hidden;text-overflow:ellipsis;white-space:pre-wrap}.chat-search{left:0;position:absolute!important;right:0;top:0;z-index:2}.chat-search-footer{align-items:center;background-color:var(--surface-color);box-shadow:0 -1px 5px -1px rgba(0,0,0,.21);display:flex;flex:0 0 auto;height:46px;justify-content:space-between;overflow:hidden;padding:0 8px;width:100%}.chat-search-footer .chat-search-count{color:var(--secondary-text-color);margin-left:8px}.chat-search-count:empty,.chat-search-count:not(:empty)+.btn-icon,.chat-search-footer+.chat-input{display:none}.chat-search-controls{display:flex}.chat-search-results{background-color:var(--surface-color);height:100%;left:0;max-height:100%;opacity:0;overflow:hidden;position:absolute;top:0;transition:.2s ease;visibility:hidden;width:100%}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;align-items:center;bottom:var(--padding);display:flex;flex-direction:column;justify-content:center;left:var(--padding);position:absolute!important;right:var(--padding);top:var(--padding);-webkit-user-select:none;-moz-user-select:none;user-select:none;width:auto!important;z-index:3}.drops-container:not(.is-visible){display:none}.drops-container.is-visible{animation:fade-in-opacity .2s linear forwards}.drops-container.is-visible.backwards{animation:fade-in-backwards-opacity .2s linear forwards}.drop{--wrapper-padding:-4px;align-items:center;background-color:var(--surface-color);border-radius:12px;color:#a2acb4;display:flex;flex:1 1 auto;flex-direction:column;justify-content:center;max-width:100%;pointer-events:all;position:relative;transition:color .2s ease-in-out;width:100%}.drop-outline-wrapper{bottom:var(--wrapper-padding);left:var(--wrapper-padding);pointer-events:none;position:absolute;right:var(--wrapper-padding);top:var(--wrapper-padding)}.drop-outline-path{fill:none;stroke-dasharray:13.5,11;stroke:#a2acb4;stroke-width:2;stroke-linecap:round;stroke-dashoffset:0;transition:stroke .2s ease-in-out}.drop.is-dragover .drop-outline-path{stroke:var(--primary-color);animation:drop-outline-move .5s linear infinite}.drop-icon{font-size:6rem}.drop-header{font-size:1.25rem;font-weight:var(--font-weight-bold)}.drop-header:not(:last-child){margin-top:-10px}@media only screen and (max-height:670px){.drop-icon{font-size:0}.drop-header{margin-top:0}}.drop.is-dragover{color:var(--primary-color)}.drop+.drop{margin-top:10px}@keyframes drop-outline-move{0%{stroke-dashoffset:0}to{stroke-dashoffset:-24.5}}body.is-dragging .page-chats{pointer-events:none}.bot-commands{--border-radius-padding:24px;--offset:.5rem;animation:none!important;background-color:transparent!important;border-radius:12px 12px 0 0!important;bottom:calc(100% - var(--border-radius-padding));box-shadow:none;left:calc(var(--offset)*-1);max-height:20rem;max-width:none;overflow:hidden;padding:var(--offset) var(--offset) 0!important;pointer-events:none;position:absolute!important;right:calc(var(--offset)*-1);transition:none!important;visibility:visible!important;width:auto!important}body.animation-level-2 .bot-commands{display:flex!important}.bot-commands .scrollable{background-color:var(--surface-color);border-radius:inherit;box-shadow:0 1px 8px 1px rgba(0,0,0,.12);height:auto;max-height:207px!important;pointer-events:all}body.animation-level-2 .bot-commands .scrollable{opacity:0;transform:translateY(var(--height))}.bot-commands.is-visible.animating .scrollable{transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.bot-commands.is-visible:not(.backwards) .scrollable{opacity:1;transform:translateY(0)}.bot-commands-list{border-radius:inherit;height:var(--height);padding-bottom:0;width:100%}.bot-commands-list-element{align-items:flex-start;border-radius:0!important;flex-direction:column;justify-content:center;padding-left:3.375rem}.bot-commands-list-element-avatar{left:.75rem;position:absolute}.bot-commands-list-element-description,.bot-commands-list-element-name{font-size:.875rem;line-height:var(--line-height-14);margin-left:0}.crop .overlay::-moz-selection,.crop-component::-moz-selection{background:transparent}.crop .overlay::selection,.crop-component::selection{background:transparent}.crop-image,.crop-overlay-image{display:block;height:auto;-o-object-fit:contain;object-fit:contain;-o-object-position:center;object-position:center;width:auto}.crop-image{display:block;pointer-events:none;position:relative}.crop-component{background-color:#fff;margin:0 auto;overflow:hidden;position:relative;z-index:999}.crop-component>img{max-width:100%}.crop-overlay{border-radius:50%;box-sizing:content-box;overflow:hidden;position:absolute;z-index:999}.crop-overlay:active,html.no-touch .crop-overlay:hover{cursor:move}.crop-overlay-image{display:block;position:absolute}.crop-overlay-color{background-color:hsla(0,0%,100%,.7);border-radius:8px;height:100%;left:0;position:absolute;top:0;width:100%}.crop.is-forum .crop-overlay{border-radius:var(--avatar-border-radius-forum)}.sidebar-header{align-items:center;background-color:var(--surface-color);cursor:default;display:flex;flex:0 0 auto;justify-content:space-between;min-height:3.5rem;padding-left:1rem;padding-right:1rem;-webkit-user-select:none;-moz-user-select:none;user-select:none}.sidebar-header .btn-menu{overflow-y:overlay}@media only screen and (max-width:600px){.sidebar-header{padding-left:.5rem;padding-right:.5rem}}[dir=ltr] .sidebar-header__title{padding-left:1.5rem}[dir=rtl] .sidebar-header__title{padding-right:1.5rem}.sidebar-header__title{color:var(--primary-text-color);flex:1;font-size:1.25rem;font-weight:var(--font-weight-bold)}[dir=ltr] .sidebar-header .btn-icon+.btn-icon{margin-left:.5rem}[dir=rtl] .sidebar-header .btn-icon+.btn-icon{margin-right:.5rem}.sidebar-header-right{flex:0 0 auto}.scrollable-y-bordered .sidebar-header{position:relative}.scrollable-y-bordered .sidebar-header:after{background-color:var(--border-color);bottom:-1px;content:\" \";height:1px;left:0;opacity:0;position:absolute;right:0;z-index:1}body.animation-level-2 .scrollable-y-bordered .sidebar-header:after{transition:opacity var(--transition-standard-in)}.scrollable-y-bordered:not(.scrolled-top) .sidebar-header:after{opacity:1}.sidebar-close-button{flex:0 0 auto;height:2.5rem;overflow:inherit!important;width:2.5rem}.sidebar-content{display:flex;flex:1 1 auto;height:100%;max-height:100%;overflow:hidden;position:relative;width:100%}.profile-avatars-container{cursor:pointer;padding-bottom:100%;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}html.no-touch .profile-avatars-container:active .profile-avatars-arrow,html.no-touch .profile-avatars-container:hover .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{display:flex;flex-wrap:nowrap;height:100%;position:absolute;transform:translateZ(-1px) scale(2);transform-origin:left top;transition:transform .2s ease-in-out;width:100%}.scrollable.no-parallax .profile-avatars-avatars{transform:translate(0)}.profile-avatars-avatars:before{bottom:0;content:\" \";left:0;right:0;top:0}.profile-avatars-avatar{background-color:#000;display:flex;height:inherit;min-height:100%;min-width:100%;position:relative;width:inherit}.profile-avatars-avatar .avatar-photo{height:100%;-o-object-fit:cover;object-fit:cover;pointer-events:none;width:100%}.profile-avatars-gradient{background:linear-gradient(1turn,rgba(0,0,0,.3) 8.98%,transparent);bottom:0;height:80px;left:0;position:absolute;right:0}[dir=ltr] .profile-avatars-info{left:1.5rem}[dir=rtl] .profile-avatars-info{right:1.5rem}.profile-avatars-info{align-items:flex-start;bottom:0;bottom:.5625rem;display:flex;flex-direction:column;pointer-events:none;position:absolute}[dir=ltr] .profile-avatars-info .profile-name,[dir=ltr] .profile-avatars-info .profile-subtitle{text-align:left}[dir=rtl] .profile-avatars-info .profile-name,[dir=rtl] .profile-avatars-info .profile-subtitle{text-align:right}.profile-avatars-info .profile-name,.profile-avatars-info .profile-subtitle{color:#fff;margin:0}.profile-avatars-info .peer-typing-container{--color:#fff}.profile-avatars-info .premium-icon{color:#fff}.profile-avatars-info .verified-icon-background{fill:#fff}.profile-avatars-info .verified-icon-check{visibility:hidden}.profile-avatars-info .premium-icon,.profile-avatars-info .profile-subtitle,.profile-avatars-info .verified-icon{opacity:.7}.profile-avatars-info .online{color:inherit!important}.profile-avatars-tabs{display:flex;height:.125rem;left:.375rem;pointer-events:none;position:absolute;right:.375rem;top:.5rem}.profile-avatars-tab{background-color:#fff;border-radius:4px;flex:1 1 auto;height:inherit;margin:0 .125rem;opacity:.2;transition:opacity .2s ease-in-out}.profile-avatars-tab.active{opacity:.6}.profile-avatars-arrow{bottom:0;left:0;opacity:0;position:absolute;top:0;width:33.3333333333%}.profile-avatars-arrow:before{color:#fff;font-size:2.1875rem;left:.625rem;position:absolute;top:50%;transform:translateY(-50%)}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:active,html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:hover{opacity:1!important}.profile-avatars-arrow-next{left:auto;right:0}.profile-avatars-arrow-next:before{left:auto;right:.625rem}.profile-content{display:flex;flex:0 0 auto;flex-direction:column;position:relative;width:100%}.profile-content .sidebar-left-section{background-color:var(--surface-color);padding-bottom:.5rem;position:relative}.profile-content .sidebar-left-section .profile-subtitle .peer-typing-container{justify-content:center}.profile-content.search-empty .gradient-delimiter{display:none}@media only screen and (max-width:600px){.profile-button{border-radius:0}}[dir=ltr] .profile-change-avatar{right:1.25rem}[dir=rtl] .profile-change-avatar{left:1.25rem}.profile-change-avatar{--size:3.375rem;position:absolute!important;top:calc(var(--size)/-2);transform:none;transition:none!important}.profile-container>.scrollable{display:flex;flex-direction:column}.profile-name{align-items:flex-end;color:var(--primary-text-color);display:flex;font-size:var(--font-size-20);font-weight:var(--font-weight-bold);line-height:var(--line-height-20);margin:0 auto;max-width:21.25rem;overflow:hidden;text-align:center}.profile-name span.emoji{min-width:-moz-min-content;min-width:min-content;vertical-align:inherit}.profile-name .peer-title{overflow:hidden;text-overflow:ellipsis;word-break:break-word}.sidebar-left-section-content>.profile-name{justify-content:center}.profile-name .badge-fake{align-self:center}.profile-subtitle{align-items:center;color:var(--secondary-text-color);display:flex;font-size:.875rem;justify-content:center;margin-bottom:.875rem;margin-top:1px;text-align:center}@media only screen and (max-width:600px){.profile-subtitle{margin-top:3px}}.profile-subtitle .online{color:var(--primary-color)}.profile-avatar{display:block;margin:.5rem auto 10px}@media only screen and (max-width:600px){.profile-avatar{--size:100px;--multiplier:.54;margin:0 auto 10px}}.profile-avatar,.profile-name,.profile-subtitle{flex:0 0 auto}.menu-horizontal-scrollable{--scrollable-size:3rem;height:var(--scrollable-size)}.menu-horizontal-scrollable:after{border-bottom:1px solid var(--border-color);bottom:0;content:\" \";height:1px;left:0;position:absolute;right:0;z-index:-1}.menu-horizontal-scrollable .menu-horizontal-div{border-bottom:none}.menu-horizontal-div{--size:var(--scrollable-size,3rem);--padding-horizontal:0px;border-bottom:1px solid var(--border-color);color:var(--secondary-text-color);display:flex;flex-direction:row;height:var(--size);justify-content:space-around;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:2}.menu-horizontal-div:not(.no-stripe):after,.menu-horizontal-div:not(.no-stripe):before{content:\" \";flex:0 0 auto;width:var(--padding-horizontal)}.menu-horizontal-div:not(.no-stripe) .menu-horizontal-div-item{border-radius:10px 10px 0 0}.menu-horizontal-div-item{align-items:center;border-radius:0;cursor:pointer;display:flex;flex:1 1 auto;font-size:1rem;font-weight:var(--font-weight-bold);height:100%;justify-content:center;line-height:var(--line-height);padding:0 1rem;position:relative;text-align:center;transition:none!important}html.no-touch .menu-horizontal-div-item:active,html.no-touch .menu-horizontal-div-item:hover{background-color:var(--light-secondary-text-color)}.menu-horizontal-div-item.active{color:var(--primary-color)}.menu-horizontal-div-item.active i{opacity:1}.menu-horizontal-div-item.active .c-ripple__circle,html.no-touch .menu-horizontal-div-item.active:active,html.no-touch .menu-horizontal-div-item.active:hover{background-color:var(--light-primary-color)}.menu-horizontal-div-item.active .badge{background-color:var(--primary-color)}.menu-horizontal-div-item>span{align-items:center;display:inline-flex;overflow:visible;pointer-events:none;position:relative}.menu-horizontal-div i{background-color:var(--primary-color);border-radius:.1875rem .1875rem 0 0;bottom:-.8125rem;box-sizing:content-box;height:.1875rem;left:0;opacity:0;pointer-events:none;position:absolute;transform-origin:left;width:100%;z-index:1}.menu-horizontal-div i.animate{transition:transform var(--tabs-transition)}.tabs-container{display:grid;grid-template-columns:100%;grid-template-rows:100%;min-width:100%;width:100%}.tabs-container .tabs-tab{background-color:var(--background-color);display:none;flex-direction:column;grid-column-start:1;grid-row-start:1;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 var(--tabs-transition)}.tabs-container[data-animation=navigation].animating .tabs-tab{transition:transform var(--transition-standard-in),filter var(--transition-standard-in)}.tabs-container[data-animation=navigation].animating.backwards .tabs-tab{transition:transform var(--transition-standard-out),filter var(--transition-standard-out)}#column-left{flex:1 1 auto;flex-direction:column;max-width:420px;width:420px}@media only screen and (max-width:600px){#column-left{max-width:100%;width:100%}body:not(.is-left-column-shown) #column-left{filter:brightness(80%);transform:translate3d(-25vw,0,0)}}@media only screen and (min-width:601px){#column-left{overflow:visible}[dir=ltr] #column-left:after{right:-1px}[dir=rtl] #column-left:after{left:-1px}#column-left:after{background-color:var(--border-color);content:\" \";display:block;height:100vh;position:absolute;top:0;width:1px;z-index:2}}@media only screen and (min-width:601px)and (max-width:925px){#column-left{display:flex;left:0;max-width:none;position:fixed;top:0;transform:translate3d(-5rem,0,0);transition:transform var(--layer-transition);width:26.5rem}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:418.75px}}#column-left .item-main .menu-horizontal-scrollable{background-color:var(--surface-color);position:relative;top:auto;z-index:1}@media only screen and (max-width:600px){#column-left .item-main .menu-horizontal-scrollable{box-shadow:0 1px 5px -1px rgba(0,0,0,.16)}}#column-left .item-main .menu-horizontal-scrollable .scrollable{position:relative}[dir=ltr] #column-left .item-main .menu-horizontal-scrollable .badge{margin-left:5px}[dir=rtl] #column-left .item-main .menu-horizontal-scrollable .badge{margin-right:5px}#column-left .item-main .menu-horizontal-scrollable:not(.hide)+#folders-container{height:calc(100% - var(--scrollable-size));position:relative}#column-left .item-main .menu-horizontal-scrollable:not(.hide)+#folders-container .scrollable{padding-top:.5rem}#column-left .item-main .menu-horizontal-scrollable:not(.hide)+#folders-container .dialogs-placeholder-canvas{top:.5rem}#column-left .item-main .menu-horizontal-div{--padding-horizontal:.6875rem;justify-content:flex-start;position:relative!important;z-index:0}@media only screen and (max-width:600px){#column-left .item-main .menu-horizontal-div{--padding-horizontal:.1875rem}}#column-left .item-main .menu-horizontal-div-item{flex:0 0 auto;min-width:3rem}#column-left .item-main .menu-horizontal-div__stripe{display:none}#column-left .folders-tabs-scrollable{flex:0 0 auto}#column-left .item-main{--offset-top:0;background-color:var(--surface-color)}[dir=ltr] #column-left .item-main .input-search .selector-user{left:6px}[dir=rtl] #column-left .item-main .input-search .selector-user{right:6px}[dir=ltr] #column-left .item-main .input-search .selector-user{margin-left:0}[dir=rtl] #column-left .item-main .input-search .selector-user{margin-right:0}#column-left .item-main .input-search .selector-user{height:30px;line-height:1.875rem;position:absolute!important;top:6px;z-index:1}[dir=ltr] #column-left .item-main .input-search.is-picked .input-search-input{padding-left:calc(var(--paddingLeft) + 12px - var(--border-width))}[dir=rtl] #column-left .item-main .input-search.is-picked .input-search-input{padding-right: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}[dir=ltr] #column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{left:38px}[dir=rtl] #column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{right:38px}[dir=ltr] #column-left .item-main .search-helper{margin-left:28px}[dir=rtl] #column-left .item-main .search-helper{margin-right:28px}#column-left .item-main .search-helper{display:flex}@media only screen and (max-width:600px){[dir=ltr] #column-left .item-main .search-helper{margin-left:20px}[dir=rtl] #column-left .item-main .search-helper{margin-right:20px}}#column-left .item-main .search-helper .selector-user{font-size:14px;margin-top:7px}html.no-touch #column-left .item-main .search-helper .selector-user:active,html.no-touch #column-left .item-main .search-helper .selector-user:hover{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{background-color:var(--surface-color);max-height:100%;position:relative}#column-left #chatlist-container.has-filters .connection-status-bottom{height:calc(100% + var(--offset-top)*-1)}#column-left #folders-container{flex:1 1 auto}#column-left #folders-container .scrollable-y{background-color:transparent;position:absolute}#column-left #folders-container .scrollable-y.active{display:block}#column-left .dialogs-placeholder-canvas{position:absolute;top:0;z-index:2}#column-left .sidebar-slider{height:100%}#column-left .sidebar-header__btn-container{align-items:center;display:flex;flex:0 0 auto;height:2.5rem;justify-content:center;position:relative;width:2.5rem}#column-left .sidebar-header__btn-container>.btn-icon{bottom:0;left:0;margin:0;opacity:0;position:absolute;right:0;top:0;visibility:hidden;z-index:4}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:-.25rem}}#column-left .sidebar-tools-button{width:100%}#column-left .sidebar-tools-button .btn-menu{max-height:calc(var(--vh)*100 - 3.75rem);min-width:260px}[dir=ltr] #column-left .sidebar-tools-button .btn-menu-item{padding-right:.375rem}[dir=rtl] #column-left .sidebar-tools-button .btn-menu-item{padding-left:.375rem}[dir=ltr] #column-left .archived-count{margin-left:.625rem}[dir=rtl] #column-left .archived-count{margin-right:.625rem}#column-left .archived-count{justify-self:flex-end}html[dir=ltr].is-mobile #column-left .archived-count{margin-right:.375rem}html[dir=rtl].is-mobile #column-left .archived-count{margin-left:.375rem}@media only screen and (max-width:600px){#column-left .archived-count{font-weight:var(--font-weight-bold)}}#column-left .archived-count:empty{display:none}#column-left .search-group-people .chatlist{display:flex;flex-direction:row;margin-top:-1px;padding:0 0 1px}#column-left .search-group-people .chatlist:after,#column-left .search-group-people .chatlist:before{content:\"ย \";display:inline-block;flex:0 0 auto;width:.3125rem}#column-left .search-group-people .chatlist-chat{align-items:center;border-radius:10px;display:flex;flex:0 0 auto;flex-direction:column;height:6.125rem;justify-content:flex-end;max-width:4.875rem;padding:0!important;width:4.875rem}#column-left .search-group-people .dialog-subtitle,#column-left .search-group-people .dialog-title-details{display:none}#column-left .search-group-people .dialog-title{max-width:65px;padding-bottom:.75rem}#column-left .search-group-people .dialog-title .user-title{font-size:.75rem!important}#column-left .search-group-people .dialog-title .peer-title{font-weight:var(--font-weight-normal)!important}[dir=ltr] #column-left .search-group-people .dialog-avatar{left:auto!important}[dir=rtl] #column-left .search-group-people .dialog-avatar{right:auto!important}#column-left .search-group-people .dialog-avatar{top:.75rem!important}#column-left .search-group-people .search-group-scrollable{position:relative}@media only screen and (max-width:600px){[dir=ltr] #column-left .search-group-people .search-group-scrollable{margin-left:-7px}[dir=rtl] #column-left .search-group-people .search-group-scrollable{margin-right:-7px}#column-left .search-group-people .search-group-scrollable{margin-top:4px}}#column-left .search-group-people .search-group-scrollable>.scrollable{position:relative}#column-left .item-main .sidebar-content{justify-content:center}#column-left .item-main .sidebar-content .btn-menu{bottom:calc(100% + 10px)}#column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close,#column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled{visibility:visible!important}body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close,body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled{animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-width:600px){#column-left .item-main .sidebar-content .btn-corner{--size:54px;bottom:14px;position:fixed!important;right:14px;z-index:1}}#column-left .item-main .sidebar-content .btn-corner:not(.is-hidden){transform:translateZ(0)}#column-left .connection-status{flex:0 0 auto;overflow:hidden;padding:0 .5rem .5rem;width:100%}#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 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))}[dir=ltr] #column-left .connection-status-button{padding-left:4.5rem}[dir=rtl] #column-left .connection-status-button{padding-right:4.5rem}[dir=ltr] #column-left .connection-status-button{text-align:left}[dir=rtl] #column-left .connection-status-button{text-align:right}#column-left .connection-status-button{align-self:center;color:#2e3939;cursor:default;height:3.5rem;transform:translateY(-100%)}#column-left .connection-status-button .force-reconnect{color:inherit;cursor:pointer;text-decoration:underline}[dir=ltr] #column-left .connection-status-button .preloader-container{left:1rem}[dir=rtl] #column-left .connection-status-button .preloader-container{right:1rem}#column-left .connection-status-button .preloader-container{height:1.5rem;right:auto;width:1.5rem}#column-left .connection-status-button .preloader-container .preloader-path-new{stroke:#2e3939}#column-left .connection-status-bottom{--offset-top:0px;background-color:var(--surface-color);bottom:0;display:flex;flex-direction:column;height:100%;left:0;overflow:hidden;position:absolute;right:0;top:0;transform:translateY(var(--offset-top))}#column-left .input-wrapper{flex:0 0 auto;margin:.75rem 0;max-width:100%;padding:0 .75rem;width:420px}@media only screen and (max-width:600px){#column-left .input-wrapper{width:100%}}#search-container{display:flex;top:var(--offset-top)!important}#search-container .scrollable-y{flex:1 1 auto;position:relative}.edit-profile-container .sidebar-content,.new-channel-container .sidebar-content,.new-group-container .sidebar-content{flex-direction:column}.edit-profile-container .chatlist-container,.new-channel-container .chatlist-container,.new-group-container .chatlist-container{flex:1 1 auto}[dir=ltr] .edit-profile-container .caption,[dir=ltr] .new-channel-container .caption,[dir=ltr] .new-group-container .caption{margin-left:23px}[dir=rtl] .edit-profile-container .caption,[dir=rtl] .new-channel-container .caption,[dir=rtl] .new-group-container .caption{margin-right:23px}[dir=ltr] .edit-profile-container .caption,[dir=ltr] .new-channel-container .caption,[dir=ltr] .new-group-container .caption{padding-right:24px}[dir=rtl] .edit-profile-container .caption,[dir=rtl] .new-channel-container .caption,[dir=rtl] .new-group-container .caption{padding-left:24px}.edit-profile-container .caption,.new-channel-container .caption,.new-group-container .caption{color:var(--secondary-text-color);font-size:.875rem;margin-top:14px}.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}.settings-container .profile-avatars-container{height:15rem;padding-bottom: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;user-select:none}.chat-folders-container .sticker-container,.edit-folder-container .sticker-container,.people-nearby-container .sticker-container{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.chat-folders-container .caption,.edit-folder-container .caption,.people-nearby-container .caption{color:var(--secondary-text-color);font-size:var(--font-size-14);line-height:var(--line-height-14);margin:0 auto;max-width:20rem;text-align:center}.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}.edit-folder-container .caption{margin-bottom:18px}@media only screen and (max-width:600px){.edit-folder-container .input-wrapper{padding:0 16px;width:100%}}.edit-folder-container .sidebar-left-section{padding-bottom:0}.edit-folder-container .sidebar-left-section:last-child{padding-bottom:.5rem}.folder-categories .checkbox-field{position:absolute;right:1.125rem!important}.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}[dir=ltr] .included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-left:26px}[dir=rtl] .included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-right:26px}[dir=ltr] .included-chatlist-container .chatlist-chat{padding-right:3.5rem!important}[dir=rtl] .included-chatlist-container .chatlist-chat{padding-left:3.5rem!important}.search-group-recent .search-group__name{align-items:center;display:flex;justify-content:space-between}.search-group-recent .btn-icon{font-size:22px}@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:0 0 7px}}.sidebar-left-section{padding:.5rem 0 1rem}.sidebar-left-section.with-fake-delimiter{box-shadow:none;padding-top:0!important}.sidebar-left-section.with-fake-delimiter .gradient-delimiter{margin-bottom:.5rem}.sidebar-left-section.no-padding-top{padding-top:0!important}@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}[dir=ltr] .sidebar-left-section-content>.checkbox-field .checkbox-box{left:auto}[dir=rtl] .sidebar-left-section-content>.checkbox-field .checkbox-box{right:auto}@media only screen and (max-width:600px){.sidebar-left-section-content>.btn-primary,.sidebar-left-section-content>.checkbox-ripple{border-radius:0}}.sidebar-left-section-content.full-width{margin:0!important}.sidebar-left-section-content>.media-sticker-wrapper{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.sidebar-left-section-name{padding:1rem}@media only screen and (max-width:600px){.sidebar-left-section-name{font-size:.875rem;padding:.5rem 1rem}}.sidebar-left-section-caption{color:var(--secondary-text-color);font-size:1rem;line-height:var(--line-height);margin-top:1rem;padding:0 1rem}@media only screen and (max-width:600px){.sidebar-left-section-caption{font-size:.875rem;margin:.5rem}}.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{align-items:center;display:flex;height:3.5rem;padding:0 1.125rem}.sidebar-left-section-disabled{opacity:.25;pointer-events:none!important}.sidebar-left-section .chatlist{padding:0}.sidebar-left-h2{color:var(--primary-color);font-size:16px;font-weight:var(--font-weight-bold)}.general-settings-container{-webkit-user-select:none;-moz-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,#poll-results-container,#search-gifs-container,#search-private-container,#stickers-container,.add-members-container{background-color:var(--surface-color)!important}.chat-folders-container .btn-control{margin-bottom:1.5rem}.two-step-verification{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{margin-bottom:1.125rem;margin-left:auto;margin-right:auto;max-width:342px;text-align:center}.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{height:168px;margin:.625rem auto 1.1875rem;width:168px}.two-step-verification .input-wrapper .btn-primary:first-child:last-child{margin-top:.25rem}.two-step-verification-enter-password .media-sticker-wrapper{height:157px;margin:1.125rem auto 1.8125rem;width:157px}.two-step-verification-hint .media-sticker-wrapper{height:160px;margin:.5rem auto 2.25rem;width:160px}.two-step-verification-email .media-sticker-wrapper{height:160px;margin:.5625rem auto 2.1875rem;width:160px}.two-step-verification-set .media-sticker-wrapper{height:160px;margin:1rem auto 1.3125rem;width:160px}[dir=ltr] .two-step-verification-set .media-sticker-wrapper .rlottie,[dir=ltr] .two-step-verification-set .media-sticker-wrapper .rlottie-vector{left:.625rem}[dir=rtl] .two-step-verification-set .media-sticker-wrapper .rlottie,[dir=rtl] .two-step-verification-set .media-sticker-wrapper .rlottie-vector{right:.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-title:first-child{font-weight:var(--font-weight-bold)}.active-sessions-container .row-title-right{color:var(--secondary-text-color);font-size:var(--font-size-12);line-height:var(--line-height-12)}.active-sessions-container .row-midtitle,.active-sessions-container .row-subtitle{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.active-sessions-container .sidebar-left-section:first-child{padding-bottom:0}.active-sessions-container .sidebar-left-section:first-child .row-title{font-weight:var(--font-weight-bold)}@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:var(--primary-text-color)}.range-setting-selector-value{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:var(--primary-color)}.background-container .background-item:after{border:3px solid var(--primary-color);bottom:0;content:\" \";display:block;left:0;opacity:0;position:absolute;right:0;top:0;transition:opacity .2s ease-in-out}.background-container .background-item.active:after{opacity:1}.background-container .background-item.active .grid-item-media{transform:scale(.91)}.background-container .background-item-media{transform:scale(1);transition:transform .2s ease-in-out}.background-container .background .preloader-container{z-index:1}.background-item{cursor:pointer}.background-item-media{border-radius:inherit}.background-item-media.is-pattern{background-color:#000;bottom:0;left:0;position:absolute;right:0;top:0}.background-item-media.is-pattern .media-photo{mix-blend-mode:soft-light}.background-item .media-photo{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.background-colors-canvas{border-radius:inherit;height:100%;-webkit-mask-position:center;-webkit-mask-size:cover;position:absolute;width:100%}.background-image-container .sidebar-left-section{padding-bottom:.5rem}.empty-placeholder{line-height:var(--line-height);margin:0 auto;padding:0 1rem;position:relative;text-align:center;top:40%;transform:translateY(-50%);-webkit-user-select:none;-moz-user-select:none;user-select:none;width:21rem!important}.empty-placeholder .media-sticker-wrapper{height:128px;margin:0 auto 1.9375rem;position:relative;width:128px}.empty-placeholder-header{font-size:1.25rem;font-weight:var(--font-weight-bold)}.empty-placeholder-subtitle{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}[dir=ltr] .empty-placeholder .btn-control:before{margin-right:.625rem}[dir=rtl] .empty-placeholder .btn-control:before{margin-left:.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}.is-forum-visible .can-have-forum .input-search,.is-forum-visible .can-have-forum .row-row,.is-forum-visible .can-have-forum .sidebar-header__title{opacity:0}.is-forum-visible .folders-tabs-scrollable{opacity:var(--disabled-opacity);pointer-events:none}.is-forum-visible.backwards .can-have-forum .input-search,.is-forum-visible.backwards .can-have-forum .row-row,.is-forum-visible.backwards .can-have-forum .sidebar-header__title,.is-forum-visible.backwards .folders-tabs-scrollable{opacity:1}.is-forum-visible.animating .can-have-forum .input-search,.is-forum-visible.animating .can-have-forum .row-row,.is-forum-visible.animating .can-have-forum .sidebar-header__title,.is-forum-visible.animating .folders-tabs-scrollable{transition:opacity var(--transition-standard-in)}.is-forum-visible.animating.backwards .can-have-forum .input-search,.is-forum-visible.animating.backwards .can-have-forum .row-row,.is-forum-visible.animating.backwards .can-have-forum .sidebar-header__title,.is-forum-visible.animating.backwards .folders-tabs-scrollable{transition:opacity var(--transition-standard-out)}#column-right{overflow:visible;overflow:initial;position:relative}@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)and (max-width:925px){body.is-right-column-shown:not(.is-left-column-shown) #column-right{transform:translateZ(0);transition:transform var(--transition-standard-in)}}@media only screen and (min-width:926px){body.is-right-column-shown #column-right{transform:translateZ(0);transition:transform var(--transition-standard-in)}}@media only screen and (min-width:601px){#column-right{position:absolute;right:0;transform:translate3d(var(--right-column-width),0,0);transition:transform var(--transition-standard-out);width:calc(var(--right-column-width));z-index:3}#column-right .sidebar-content{min-width:var(--right-column-width)}body.animation-level-0 #column-right{transition:none}}@media only screen and (min-width:1276px){#column-right{border-left:1px solid var(--border-color);transform:translate3d(calc(var(--right-column-width) + 1px),0,0);width:calc(var(--right-column-width) + 1px)}}#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{flex:1 1 auto;position:relative}#column-right .sidebar-search{display:none}#column-right .sidebar-search.active{display:flex}#column-right .input-wrapper{margin:.75rem 0;max-width:100%;padding:0 .75rem;width:100%}.shared-media-container .scrollable:not(.no-parallax){perspective:0;perspective-origin:0 0}.shared-media-container .scrollable:not(.no-parallax).parallax{perspective:1px}.shared-media-container .profile-content.is-me .profile-name{margin-bottom:.9375rem}.shared-media-container .profile-content.is-me .profile-subtitle{display:none}.shared-media-container .search-super{min-height:calc(var(--vh, 1vh)*100 - 56px);top:100%}.shared-media-container .search-super-tabs{--padding-horizontal:0}.shared-media-container .search-super-tabs .menu-horizontal-div-item{border-radius:0!important}.shared-media-container .sidebar-header .transition{flex-grow:1}.shared-media-container .sidebar-header .transition .transition-item{align-items:center;display:flex}.shared-media-container .btn-corner.menu-open:before{content:\"๎คฉ\"}@media only screen and (max-width:600px){.shared-media-container .btn-corner{bottom:14px;height:54px;position:fixed!important;right:14px;width:54px;z-index:1}}.shared-media-container.can-add-members .btn-corner:not(.is-hidden){transform:translateZ(0)}.search-super{background-color:var(--surface-color);display:flex;flex-direction:column;max-width:100%;min-height:100%;position:absolute;width:100%}.search-super .search-group__show-more{color:var(--primary-color);cursor:pointer;font-weight:400}.search-super .search-super-month-name{border-top:1px solid var(--border-color);color:var(--secondary-text-color);font-weight:var(--font-weight-bold);padding:24px 0 0 24px}@media only screen and (max-width:600px){.search-super .search-super-month-name{padding:18px 0 0 16px}}.search-super.sliding{max-height:none!important}.search-super-tabs{flex:1 1 auto;width:auto}.search-super-tabs-scrollable{background-color:var(--surface-color);box-shadow:none!important;position:sticky!important;top:0;z-index:2}.search-super-tabs-scrollable:before{background-color:inherit;content:\" \";display:block;height:1px;left:0;position:absolute;top:0;width:100%;z-index:-1}.search-super.is-full-viewport .search-super-tabs-scrollable:before{top:-1px}.search-super-tabs-scrollable .scrollable{display:flex;position:relative}.search-super-tabs-container{flex:1 1 auto;grid-template-rows:100%;min-height:calc(100% - 49px)}.search-super-tabs-container>div{background-color:var(--surface-color)!important;min-height:150px;position:relative}.search-super-tabs-container>div>div:first-child{min-height:calc(100vh - 111px);transform:translateY(0)}.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 .audio-title,.search-super .document-name,.search-super .title{display:flex;justify-content:space-between}.search-super .sent-time{color:var(--secondary-text-color);flex:0 0 auto;font-size:12px;margin-left:8px;margin-top:3px}.search-super-content-media .search-super-month-name{border:none;padding:9px 0 7px 24px}.search-super-content-media .video-time{background-color:var(--message-time-background);border-radius:4px;color:#fff;font-size:12px;height:18px;left:5px;line-height:18px;padding:0 6px 0 5px;position:absolute;top:4px;z-index:2}.search-super-content-media .grid-item{overflow:hidden}.search-super-content-media .checkbox-field{right:.25rem;top:.25rem}.search-super .checkbox-box{box-shadow:0 0 3px 0 rgba(0,0,0,.4)}.search-super .checkbox-box-border{border-color:var(--message-checkbox-border-color)}.search-super .checkbox-box-background{background-color:var(--message-checkbox-color)}.search-super .checkbox-field{margin:0;position:absolute!important;z-index:2}.search-super-content-media .search-super-month-items{grid-gap:1px;display:grid;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr);padding-top:1px;width:100%}.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{--icon-size:3rem;--icon-margin:.75rem;height:calc(48px + 1.5rem)}.search-super-content-files .document-download,.search-super-content-files .document-ico{border-radius:5px!important}.search-super-content-files .document-name{font-weight:400;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.search-super-content-links .search-super-item{cursor:pointer;display:flex;flex-direction:column;justify-content:flex-start;min-height:4.375rem;overflow:hidden;padding-left:4.4375rem;position:relative}.search-super-content-links .row-media{border-radius:.375rem;height:3rem;left:.6875rem;overflow:hidden;position:absolute;width:3rem}.search-super-content-links .row-media.empty{align-items:center;background-color:var(--primary-color);color:#fff;display:flex;font-size:2rem;justify-content:center;text-transform:uppercase}.search-super-content-links a:not(:last-child){position:relative;z-index:2}.search-super-content-links .anchor-url:last-child{position:static}.search-super-content-links .anchor-url:last-child:before{bottom:0;content:\" \";cursor:pointer;left:0;position:absolute;right:0;top:0;z-index:1}.search-super-content-links .media-photo{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.search-super-content-links .row-title{margin-top:.1875rem}.search-super-content-links .row-subtitle{overflow:hidden;text-overflow:ellipsis;white-space:pre-wrap;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{--offset-left:0!important;margin:2rem 0 0 -1.75rem!important;padding:0!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 0 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 0 12px}}.search-super-content-music .audio,.search-super-content-voice .audio{justify-content:normal;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-bottom:.5rem;padding-top:.5rem}.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{align-items:center;bottom:0;display:flex;justify-content:space-between;left:0;opacity:0;padding:0 1rem;position:absolute;right:0;top: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{color:var(--primary-text-color);flex-grow:1;font-weight:var(--font-weight-bold);margin-left:1.5rem;text-transform:capitalize;white-space:nowrap}#search-container .search-group.is-short .chatlist-chat:nth-child(n+4),#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-description:before,#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-time{display:none}#stickers-container .sticker-sets{display:flex;flex-direction:column;margin-top:16px}#stickers-container .sticker-set{cursor:pointer;display:flex;flex-direction:column;height:140px}#stickers-container .sticker-set-name{font-weight:var(--font-weight-bold)}#stickers-container .sticker-set-count{color:var(--secondary-text-color);font-size:14px}#stickers-container .sticker-set-header{display:flex;justify-content:space-between;padding-bottom:12px;padding-left:16px}#stickers-container .sticker-set-button{border-radius:16px;font-size:15px;font-weight:400;height:30px;margin-right:16px;padding-left:12px;padding-right:13px;transition:width .2s;width:auto}#stickers-container .sticker-set-button.gray{background:#f1f3f4;color:var(--secondary-text-color)}#stickers-container .sticker-set-stickers{display:flex;justify-content:space-around}#stickers-container .sticker-set-sticker{height:68px;position:relative;width:68px}#stickers-container .sticker-set-sticker:hover{background-color:var(--light-secondary-text-color);border-radius:12px}#stickers-container .sticker-set-sticker img{max-height:100%;max-width:100%}#poll-results-container .poll-results{display:flex;flex-direction:column;position:relative;width:100%}#poll-results-container .poll-results-answer{color:var(--secondary-text-color);display:flex;font-size:15px;font-weight:var(--font-weight-bold);justify-content:space-between;margin:0;padding:0 16px 8px;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (min-width:601px){#poll-results-container .poll-results-answer{padding:0 24px 8px}}#poll-results-container .poll-results-more{margin:0 .5rem;width:auto}@media only screen and (max-width:600px){#poll-results-container .poll-results-more{border-radius:0;margin:0}}#poll-results-container .poll-results h3{font-size:20px;margin-bottom:16px;margin-top:15px;padding:0 16px}@media only screen and (min-width:601px){#poll-results-container .poll-results h3{padding:0 24px}}#poll-results-container .poll-results hr{display:block!important;margin-bottom:15px;margin-top:7px}.edit-peer-container .input-wrapper{margin-bottom:.5625rem!important}.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!important}.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:var(--line-height)}.group-type-container .sidebar-left-section-caption{font-size:.875rem;margin-top:.8125rem}.group-type-container .input-wrapper{margin-top:.875rem!important}.media-viewer{align-items:center;background:rgba(0,0,0,.88);bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0}@media only screen and (max-width:600px){.media-viewer{background:#000}}.media-viewer-author{align-items:center;cursor:pointer;display:flex;height:100%}@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{font-weight:var(--font-weight-bold);line-height:var(--line-height);margin:.0625rem 0}@media only screen and (min-width:601px){.media-viewer-name{margin:.0625rem 0 .125rem}}.media-viewer-date{font-size:.875rem;line-height:var(--line-height)}.media-viewer-buttons{display:flex;flex-flow:row nowrap;padding:.5rem .75rem;position:absolute;right:0;top:0}.media-viewer-buttons .btn-icon{margin:0 .25rem;transition:var(--open-duration)}html.no-touch .media-viewer-buttons .btn-icon:active,html.no-touch .media-viewer-buttons .btn-icon:hover{color:#fff}@media only screen and (max-width:600px){.media-viewer-buttons{display:none}}.media-viewer-content{flex-direction:column;height:100%;justify-content:center}.media-viewer-container,.media-viewer-content{align-items:center;display:flex;max-height:100%;max-width:100%;overflow:hidden}.media-viewer-container{align-self:center;flex:1 1 auto;position:relative}.media-viewer-media{visibility:hidden}.media-viewer-caption{background-color:transparent;bottom:0;color:#fff;left:0;line-height:var(--line-height);opacity:0;overflow:hidden;padding:.5rem .5rem 0;position:absolute;right:0;text-align:center;text-overflow:ellipsis;white-space:pre-wrap;word-break:break-word;z-index:4}body.animation-level-2 .media-viewer-caption{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{height:6rem;margin:0 auto;max-height:6rem;max-width:50rem;padding:.5rem .875rem;position:relative}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{bottom:1.0625rem;text-align:inherit;transform:translateZ(0);width:100%}.media-viewer-caption .scrollable{height:auto;padding:0 .5rem}.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:active,html.no-touch .media-viewer-caption:hover{background-color:#000;opacity:1!important}}.media-viewer-caption.is-focused{background-color:#000;opacity:1!important}.media-viewer-switcher{cursor:pointer;height:calc(100% - 7.5rem);left:0;position:absolute;top:3.75rem;width:7rem}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-next-button,.media-viewer-prev-button{color:#fff;cursor:pointer;font-size:2rem;left:1rem;opacity:0;position:absolute;top:50%;transform:translateY(-50%) rotate(90deg);transition:var(--open-duration) opacity;z-index:5}@media only screen and (min-width:601px){.media-viewer-next-button,.media-viewer-prev-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{align-items:center;border-radius:0;display:flex;justify-content:center;left:0;min-height:auto!important;overflow:hidden;position:fixed!important;top:0;transform:translateZ(0) scaleX(1);transform-origin:top left}.media-viewer-mover:not(.center){-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}@media only screen and (max-width:600px){.media-viewer-mover{overflow:visible}}.media-viewer-mover .ckin__player{height:100%;left:0;position:absolute;top:0;width:100%}.media-viewer-mover>svg{height:100%;width:100%}.media-viewer-mover .canvas-thumbnail,.media-viewer-mover img,.media-viewer-mover video{height:100%;max-height:100%;max-width:100%;-o-object-fit:cover;object-fit:cover;opacity:1;position:absolute;transition:var(--open-duration) opacity;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.media-viewer-mover svg img,.media-viewer-mover svg video{position:static}.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;max-height:calc(var(--vh, 1vh)*100 - 15rem);max-width:100vw;top:50%!important;transform:translate3d(-50%,-50%,0)!important}@media only screen and (max-width:600px){.media-viewer-mover.center{height:100%!important;max-height:calc(var(--vh, 1vh)*100 - 120px);max-width:100vw!important;width:100%!important}.media-viewer-mover.center .ckin__player:not(.ckin__fullscreen) .default__controls{bottom:-62px}}.media-viewer-mover.center .canvas-thumbnail,.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{-o-object-fit:contain;object-fit:contain;width:auto}.media-viewer-mover.hiding .canvas-thumbnail,.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{align-items:center;display:flex;height:3.5rem;justify-content:space-between;left:0;padding:0 1.25rem;position:absolute;right:0;top:0;z-index:5}.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:active,html.no-touch .media-viewer-topbar .btn-icon:hover,html.no-touch .media-viewer-topbar .media-viewer-author:active,html.no-touch .media-viewer-topbar .media-viewer-author:hover{opacity:1}.media-viewer-topbar-left{align-items:center;display:flex}@media only screen and (max-width:600px){.media-viewer-topbar{padding:0 .5rem}}.media-viewer-aspecter{align-items:center;border-radius:0;display:flex;height:100%;justify-content:center;position:absolute;transform:scaleX(1);width:100%}.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;display:block;height:100%;left:0;position:fixed!important;top:0;transition:visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}body.animation-level-0 .media-viewer-whole{--open-duration:0s;--move-duration:0s}.media-viewer-whole.active{transition-delay:0s;visibility:visible}.media-viewer-whole.active .media-viewer-appear,.media-viewer-whole.active .overlays{opacity:1;visibility:visible}body.animation-level-2 .media-viewer-whole.active .media-viewer-appear,body.animation-level-2 .media-viewer-whole.active .overlays{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:not(.playback-rate){color:hsla(0,0%,100%,.4);opacity:1}.media-viewer-whole .btn-menu-toggle:not(.playback-rate).menu-open{background-color:hsla(207,4%,46%,.2)!important;color:#fff}.media-viewer-whole.hide-caption .media-viewer-caption{opacity:0!important;pointer-events:none}}.media-viewer-whole.is-zooming .media-viewer-caption,.media-viewer-whole.is-zooming .media-viewer-switcher .tgico-down{opacity:0!important;pointer-events:none}.media-viewer-whole.highlight-switchers .media-viewer-switcher>span{opacity:1}.media-viewer-whole.no-forwards .canvas-thumbnail,.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;user-select:none}.media-viewer-movers{bottom:0;left:0;position:absolute;right:0;top:0;transform:translate3d(1,1,0) scale(1);transform-origin:0 0;will-change:transform;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{align-items:center;background-color:rgba(0,0,0,.4);border-radius:12px;bottom:1.25rem;display:flex;height:3.375rem;justify-content:space-between;left:50%;opacity:1;padding:.5rem;position:absolute;transform:translateX(-50%);width:17.125rem;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{opacity:.4;pointer-events:none}.zoom-container .progress-line{--color:#fff;--height:2px;flex:1 1 auto;margin:0 1px}.zoom-container .progress-line:before{opacity:1}.media-viewer-whole:not(.active) .zoom-container,.zoom-container:not(.is-visible){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{background-color:rgba(0,0,0,.2);height:100%;left:0;opacity:0;position:fixed!important;top:0;transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}.emoji-dropdown{background:var(--surface-color);display:flex;flex:1 1 auto;flex-direction:column;height:min(282px,calc(var(--vh)*100 - 135px));max-height:100%;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:var(--esg-width)}@media only screen and (min-height:570px)and (min-width:601px){.emoji-dropdown{-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:var(--menu-background-color);border-radius:1.25rem;bottom:5.125rem;box-shadow:0 5px 10px 5px rgba(16,35,47,.14);height:26.25rem;left:.8125rem;max-height:26.25rem;opacity:0;position:absolute!important;transform:scale(0);transform-origin:0 100%;transition:transform var(--esg-transition),opacity var(--esg-transition);z-index:3}.emoji-dropdown.active{opacity:1;transform:scale(1)}body.animation-level-0 .emoji-dropdown{transition:none}}.emoji-dropdown .emoji-container{height:100%;max-width:100%;overflow:hidden;width:100%}.emoji-dropdown .emoji-tabs{border:none;border-top:1px solid var(--border-color);justify-content:center}.emoji-dropdown .emoji-tabs:after{content:none}.emoji-dropdown .emoji-tabs-search{left:0;margin-left:.5rem!important;position:absolute}.emoji-dropdown .emoji-tabs-delete{margin-right:.5rem!important;position:absolute;right:0}.emoji-dropdown .emoji-tabs .menu-horizontal-div-item{margin:0 .75rem}.emoji-dropdown .tabs-container{height:100%}.emoji-dropdown .stickers-padding .category-items{gap:.25rem;padding:0 .1875rem}.emoji-dropdown #content-gifs .scrollable-y{padding:0 .1875rem}.emoji-dropdown .gifs-masonry{border-radius:10px;overflow:hidden}.emoticons-container{background-color:transparent;flex-direction:column;height:100%;min-height:100%}.emoticons-menu{--item-size:1.875rem;align-items:center;min-height:3.0625rem;padding:0 .3125rem;width:100%;z-index:4}.emoticons-menu,.emoticons-menu-wrapper{background-color:transparent;height:3.0625rem}.emoticons-menu-wrapper{border-bottom:1px solid var(--border-color);max-width:100%;padding:0;position:relative}.emoticons-menu:after{content:\" \";display:block;flex:0 0 auto;height:1px;width:.1875rem}.emoticons-menu .menu-horizontal-div-item{align-items:center;display:flex;flex:0 0 auto;font-size:1.5rem;height:var(--item-size);line-height:var(--item-size);margin:0 .3125rem;padding:0;width:var(--item-size)}.emoticons-menu .menu-horizontal-div-item.not-local{--item-size:2.375rem;border-radius:.25rem!important;padding:.25rem}.emoticons-menu .menu-horizontal-div-item.active{background-color:rgba(var(--primary-text-color-rgb),.06)!important}.emoticons-menu .menu-horizontal-div-item.active,html.no-touch .emoticons-menu .menu-horizontal-div-item:active,html.no-touch .emoticons-menu .menu-horizontal-div-item:hover{color:rgba(var(--primary-text-color-rgb),.8)!important}.emoticons-menu .menu-horizontal-div-item-padding{height:100%;position:relative;width:100%}.emoticons-menu .menu-horizontal-div-item.active:not(.tgico){background-color:var(--light-secondary-text-color)}.emoticons-menu .menu-horizontal-inner{border-radius:15px;flex:0 0 auto;margin:0 .3125rem;overflow:hidden;width:1.875rem}html.is-safari .emoticons-menu .menu-horizontal-inner{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}body.animation-level-2 .emoticons-menu .menu-horizontal-inner{transition:width .2s ease-in-out}.emoticons-menu .menu-horizontal-inner-scroll{align-items:center;display:flex;height:100%;position:relative;width:8.5rem}.emoticons-menu .menu-horizontal-inner .menu-horizontal-div-item{margin:0!important;transform:scale(1)}body.animation-level-2 .emoticons-menu .menu-horizontal-inner .menu-horizontal-div-item{transition:transform .2s ease-in-out!important}.emoticons-menu .menu-horizontal-inner.active{background-color:rgba(var(--primary-text-color-rgb),.06)!important;width:8.5rem}.emoticons-menu .menu-horizontal-inner.active .menu-horizontal-div-item{transform:scale(.8)}.emoticons-menu .menu-horizontal-inner.active .menu-horizontal-div-item.active{background-color:transparent!important}.emoticons-menu .menu-horizontal-inner:not(.active){cursor:pointer}.emoticons-menu .menu-horizontal-inner:not(.active) .menu-horizontal-inner-scroll{pointer-events:none}.emoticons-menu .menu-horizontal-inner:not(.active) .menu-horizontal-div-item:first-child{pointer-events:all}.emoticons-content{flex:1;padding:0;position:relative}.emoticons-content .emoji-category{position:relative}.emoticons-content .sticky_sentinel--top{height:1px;top:0}.emoticons-content .category-title{color:rgba(var(--primary-text-color-rgb),.42);cursor:pointer;font-size:var(--font-size-16);font-weight:var(--font-weight-bold);line-height:1.1875rem;padding:.75rem .875rem .375rem;position:relative;text-align:center;width:100%}.emoticons-content .category-title .btn-icon{font-size:1.25rem;pointer-events:all;position:absolute;right:.5rem;top:50%;transform:translateY(-50%);z-index:1}.emoticons-content:not(.has-premium) .is-premium-set .category-title:before{content:\"๎ฆ–\";line-height:inherit;margin-right:.125rem;vertical-align:middle}.emoji-padding .super-emojis{padding:0 .5rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar{height:0;opacity:0;width:0;width:.375rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar-thumb{height:0;width: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{display:none;height:0;width:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-corner{background-color:transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover{scrollbar-color:var(--scrollbar-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{-webkit-backdrop-filter:blur(100);backdrop-filter:blur(100);background-color:var(--scrollbar-color);border-radius:10px;max-height:12.5rem;min-height:5rem;opacity:1}.no-scrollbar::-webkit-scrollbar,.scrollable-x::-webkit-scrollbar{display:none}.scrollable{-webkit-overflow-scrolling:touch;bottom:0;height:100%;left:0;max-height:100%;overflow-x:hidden;overflow-y:hidden;position:absolute;right:0;top:0;width:100%}.scrollable.scrollable-x{-ms-overflow-style:none;overflow-x:auto;scrollbar-width:none}.scrollable.scrollable-y{-ms-overflow-style:none;overflow-y:auto;overflow-y:overlay;scrollbar-color:transparent transparent;scrollbar-width:thin;transform:translateZ(0)}.scrollable.scrollable-y.scrollable-y-bordered{border-bottom:1px solid transparent;border-top:1px solid transparent}body.animation-level-2 .scrollable.scrollable-y.scrollable-y-bordered{transition:border-top-color var(--transition-standard-in),border-bottom-color var(--transition-standard-in)}.scrollable.scrollable-y.scrollable-y-bordered:not(.scrolled-top){border-top-color:var(--border-color)}.scrollable.scrollable-y.scrollable-y-bordered:not(.scrolled-bottom){border-bottom-color:var(--border-color)}.scrollable-padding{height:100%;min-width:100%}@keyframes scaleIn{0%{transform:scale(.2)}to{transform:scale(1)}}.selector{display:flex;flex-direction:column;height:100%;width:100%}.selector .selector-search-section{margin-bottom:0!important;padding:0!important;position:relative;z-index:1}.selector-search-container{flex:0 0 auto;max-height:132px;overflow:hidden;position:relative}.selector-search-container .scrollable{max-height:inherit;position:relative}.selector-search{display:flex;flex-flow:wrap;padding-left:1rem;padding-right:1rem;position:relative}.selector-search-input{border:none;flex:1 1 auto;outline:none}.selector-search .selector-search-input{padding:7px 0 19px}[dir=ltr] .selector-user{padding-right:17px}[dir=rtl] .selector-user{padding-left:17px}[dir=ltr] .selector-user{margin-left:-.25rem;margin-right:.75rem}[dir=rtl] .selector-user{margin-left:.75rem;margin-right:-.25rem}.selector-user{background-color:var(--light-secondary-text-color);border-radius:1.5rem;color:var(--primary-text-color);flex:0 0 auto;font-size:1rem;height:2rem;line-height:2rem;margin-bottom:7px;max-width:11.25rem;overflow:hidden;text-overflow:ellipsis;transition:opacity .2s,transform .2s,background-color .2s;-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap}body.animation-level-0 .selector-user{transition:none}html.no-touch .selector-user:active,html.no-touch .selector-user:hover{background-color:var(--light-danger-color);cursor:pointer}html.no-touch .selector-user:active .selector-user-avatar:after,html.no-touch .selector-user:hover .selector-user-avatar:after{opacity:1;transform:scaleX(-1) rotate(-90deg)}body:not(.animation-level-0) .selector-user.scale-in{animation:scaleIn .15s ease forwards}body:not(.animation-level-0) .selector-user.scale-out{animation:scaleIn .1s ease forwards;animation-direction:reverse}[dir=ltr] .selector-user-avatar{margin-right:8px}[dir=rtl] .selector-user-avatar{margin-left:8px}.selector-user-avatar{border-radius:50%!important;float:left;overflow:hidden;position:relative}.is-rtl .selector-user-avatar{float:right}html.is-safari .selector-user-avatar{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}[dir=ltr] .selector-user-avatar:after{left:0}[dir=rtl] .selector-user-avatar:after{right:0}.selector-user-avatar:after{background-color:var(--danger-color);content:\"๎คฉ\";font-size:23px;height:100%;line-height:32px!important;opacity:0;position:absolute;top:0;transform:scaleX(-1) rotate(0deg);transition:opacity .2s,transform .2s;width:100%;z-index:2}body.animation-level-0 .selector-user-avatar:after{transition:none}.selector .chatlist-container{flex:1 1 auto;height:100%}.selector>hr{margin:0;padding:0}[dir=ltr] .selector .checkbox{padding-left:11px}[dir=rtl] .selector .checkbox{padding-right:11px}.selector .checkbox{margin-top:11px}.selector .checkbox-field{--offset-left:0!important;margin:0!important;padding:0!important;pointer-events:none;position:absolute!important;top:50%;transform:translateY(-50%);z-index:1}[dir=ltr] .selector .checkbox-field:first-child{margin-left:.6875rem;margin-right:1.6875rem}[dir=rtl] .selector .checkbox-field:first-child{margin-left:1.6875rem;margin-right:.6875rem}[dir=ltr] .selector .checkbox-field-round{right:1.125rem}[dir=rtl] .selector .checkbox-field-round{left:1.125rem}.selector .checkbox-field-round{--size:1.25rem}.selector .checkbox-field-round .checkbox-box-border{z-index:auto}.selector .checkbox-field-round .checkbox-box-check{--offset:6px}[dir=ltr] .selector-square .checkbox-field{left:1.25rem!important}[dir=rtl] .selector-square .checkbox-field{right:1.25rem!important}[dir=ltr] .selector-square .chatlist-chat.row-with-padding{padding-left:7.5rem!important}[dir=rtl] .selector-square .chatlist-chat.row-with-padding{padding-right:7.5rem!important}[dir=ltr] .selector-square .dialog-avatar{margin-left:3rem!important}[dir=rtl] .selector-square .dialog-avatar{margin-right:3rem!important}.gifs-masonry{grid-gap:.125rem;display:grid;gap:.125rem;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr)}.gifs-masonry .gif img,.gifs-masonry .gif video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.gifs-masonry .gif img{left:0;position:absolute;top:0}.gifs-masonry .preloader-container{z-index:2}.preloader-circular{animation:rotate 1s linear infinite;bottom:0;height:100%;left:0;margin:auto;position:absolute;right:0;top:0;transform-origin:center center}.preloader-path{stroke-dasharray:93.6375,124.85;stroke-dashoffset:0;stroke-linecap:round;stroke:#fff;stroke-width:3}.preloader-container{bottom:0;cursor:pointer;display:flex;height:54px;left:0;margin:auto;opacity:0;overflow:hidden;position:absolute;right:0;top:0;transform:scale(0);width:54px}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{height:100%;width:100%}.preloader-container .preloader-circular{animation:none;background-color:rgba(0,0,0,.3);border-radius:50%;height:100%;width: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.animating .you-spin-me-round,body.animation-level-2 .preloader-container.is-visible:not(.manual) .you-spin-me-round{animation:rotate 2s linear infinite}body.animation-level-2 .preloader-container.is-visible.animating .preloader-path-new,body.animation-level-2 .preloader-container.is-visible:not(.manual) .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{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{bottom:0;color:var(--color);height:56%;left:0;margin:auto;opacity:1;position:absolute;right:0;top:0;width:56%}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:active,html.no-touch .preloader-container .preloader-close:hover,html.no-touch .preloader-container .preloader-download:active,html.no-touch .preloader-container .preloader-download:hover{background:none}.preloader-container.manual .preloader-close,.preloader-container:not(.manual) .preloader-download{opacity:0}.preloader-container.manual .preloader-path-new{stroke-width:0}.preloader-container .preloader-download{height:1.5rem;width: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{background-color:var(--color);border-radius:.125rem;content:\"\";height:.8125rem;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:.8125rem}.preloader-container.preloader-transparent .preloader-circular{background-color:transparent}.preloader-container.preloader-bold .preloader-path-new{stroke-width:3.5}@keyframes rotate{to{transform:rotate(1turn)}}@keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}to{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-237%}}.rp{position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.btn-corner.rp .c-ripple,.btn-menu-toggle.rp .c-ripple,.menu-horizontal-div-item.rp .c-ripple,.pinned-container-wrapper.rp .c-ripple,.rp-overflow .c-ripple{border-radius:inherit;height:100%;overflow:hidden;width:100%}.btn-corner.rp .c-ripple__circle,.btn-menu-toggle.rp .c-ripple__circle,.menu-horizontal-div-item.rp .c-ripple__circle,.pinned-container-wrapper.rp .c-ripple__circle,.rp-overflow .c-ripple__circle{overflow:hidden}.c-ripple{--ripple-duration:.7s;bottom:0;left:0;position:absolute;right:0;top:0}html.is-safari .c-ripple:not(:empty){border-radius:inherit;-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.c-ripple__circle{animation:ripple-effect .7s forwards;background-color:var(--ripple-color);border-radius:50%;display:block;pointer-events:none;position:absolute;transform:scale(0);transition:opacity .35s,background-color .35s}.c-ripple__circle.hiding,.c-ripple__square.hiding{opacity:0}@media only screen and (max-width:925px){.c-ripple{--ripple-duration:.4s}.c-ripple__circle{animation-duration:.4s;animation-name:ripple-effect-handhelds;transition-duration:.3s}}@keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@keyframes ripple-effect-handhelds{0%{transform:scale(.27)}to{transform:scale(2)}}.avatar-like{--size:54px;--multiplier:1;color:#fff;font-size:calc(1.25rem/var(--multiplier));font-weight:var(--font-weight-bold);height:var(--size);line-height:var(--size)!important;text-align:center;text-transform:uppercase;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:var(--size)}avatar-element{--color-top:var(--avatar-color-top);--color-bottom:var(--avatar-color-bottom);background:linear-gradient(var(--color-top),var(--color-bottom));border-radius:50%}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(30px/var(--multiplier))!important}avatar-element.tgico-reply_filled:before{font-size:calc(28px/var(--multiplier))!important}avatar-element.tgico-deletedaccount{--color-top:var(--peer-avatar-archive-top);--color-bottom:var(--peer-avatar-archive-bottom);overflow:hidden}avatar-element.tgico-deletedaccount:before{font-size:calc(30px/var(--multiplier))}avatar-element:before{line-height:inherit!important}avatar-element.media-container{position:relative}avatar-element img{border-radius:inherit!important;display:block;height:var(--size)!important;width:var(--size)!important}avatar-element img.fade-in{animation:fade-in-opacity .2s ease forwards}avatar-element img.emoji{height:calc(1.125rem/var(--multiplier))!important;vertical-align:middle!important;width:calc(1.125rem/var(--multiplier))!important}avatar-element.is-forum{border-radius:var(--avatar-border-radius-forum)}avatar-element.is-topic{background:none;border-radius:0;position:relative}avatar-element.is-topic .topic-icon{--size:inherit}avatar-element.is-online{position:relative}avatar-element.is-online:after{background-color:var(--avatar-online-color);border:2px solid var(--surface-color);border-radius:50%;content:\" \";display:block;height:14px;left:2.4375rem;position:absolute;top:2.4375rem;width:14px}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-36{--size:36px;--multiplier:1.5}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.6875}avatar-element.avatar-26{--size:26px;--multiplier:2.076923}avatar-element.avatar-24{--size:24px;--multiplier:2.25}avatar-element.avatar-22{--size:22px;--multiplier:2.454545}avatar-element.avatar-18{--size:18px;--multiplier:3}avatar-element.avatar-16{--size:16px;--multiplier:3.375}.avatar-relative .avatar-photo{left:0;position:absolute;top:0}.avatar-full{align-items:center;border-radius:inherit;display:inline-flex;height:100%;justify-content:center;position:absolute;width:100%}.avatar-full .avatar-photo{height:100%!important;-o-object-fit:cover;object-fit:cover;width:100%!important}.document{--background-color:var(--primary-color);height:70px}.document .media-photo{border-radius:inherit}.document .media-photo.thumbnail{left:0}.document-ico{background-color:var(--background-color);border-radius:.375rem;line-height:1;text-align:center}html.is-safari .document-ico{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.document-ico-text{opacity:0}body.animation-level-2 .document-ico-text{transition:opacity .2s ease-in-out}.document:not(.document-with-thumb) .document-ico{padding:1.5625rem .25rem 0}@media only screen and (max-width:600px){.document:not(.document-with-thumb) .document-ico{font-size:14px;padding:1.5rem 0 0}.document:not(.document-with-thumb) .document-ico:after{--size:.875rem}}.document-ico:after{--size:1.125rem;border-bottom-color:rgba(0,0,0,.25);border-bottom-left-radius:.25rem;border-left-color:rgba(0,0,0,.25);border-right-color:var(--message-background-color);border-style:solid;border-top-color:var(--message-background-color);border-width:calc(var(--size)/2);content:\"\";display:block;position:absolute;right:0;top:0}body.animation-level-2 .document-ico:after{transition:border-width .2s ease-in-out}html.no-touch .document:not(.downloaded):active .document-ico:after,html.no-touch .document:not(.downloaded):hover .document-ico:after{border-width:0}html.no-touch .document:not(.downloaded):active .document-ico-text,html.no-touch .document:not(.downloaded):hover .document-ico-text{opacity:0}html.no-touch .document:not(.downloaded):active .preloader-container,html.no-touch .document:not(.downloaded):hover .preloader-container{opacity:1!important}.document:not(.downloading) .document-ico-text{opacity:1}.document:not(.downloading) .preloader-container{opacity:0!important}.document.downloading .document-ico:after{border-width:0}.document-ico{background-size:contain;font-size:1.125rem}.document-ico,.document-name,.document-size{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.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,.2);border-radius:.375rem}.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{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.document-name{font-size:var(--font-size-16);font-weight:var(--font-weight-bold);line-height:var(--line-height-16);white-space:nowrap}.document-size{color:var(--secondary-text-color);font-size:var(--font-size-14);line-height:var(--line-height-14);pointer-events:none;position:relative}.document .preloader-container{height:2.5rem;width:2.5rem}@media only screen and (max-width:600px){.document .preloader-container{height:1.625rem;width:1.625rem}}.document .preloader-circular{background-color:transparent!important}.document .preloader-path-new{stroke-width:2.5}[dir=ltr] .audio,[dir=ltr] .document{padding-left:var(--padding-left)}[dir=rtl] .audio,[dir=rtl] .document{padding-right:var(--padding-left)}.audio,.document{--padding:0px;--icon-size:3.375rem;--icon-margin:.875rem;--padding-left:calc(var(--icon-size) + var(--icon-margin) + var(--padding));cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding:var(--padding);-webkit-user-select:none;-moz-user-select:none;user-select:none}[dir=ltr] .audio-download,[dir=ltr] .audio-ico,[dir=ltr] .document-download,[dir=ltr] .document-ico{margin-left:calc((var(--padding-left) - var(--padding))*-1)}[dir=rtl] .audio-download,[dir=rtl] .audio-ico,[dir=rtl] .document-download,[dir=rtl] .document-ico{margin-right:calc((var(--padding-left) - var(--padding))*-1)}.audio-download,.audio-ico,.document-download,.document-ico{color:#fff;height:var(--icon-size);position:absolute;width:var(--icon-size)}.audio-download,.document-download{align-items:center;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;opacity:1;transition:opacity .2s ease-in-out;z-index:1}.audio-download.downloaded,.document-download.downloaded{opacity:0}.audio-description,.document-description{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio:not(.corner-download) .preloader-container:not(.preloader-streamable),.document:not(.corner-download) .preloader-container:not(.preloader-streamable){transform:scale(1)!important}.audio .checkbox-field-round,.document .checkbox-field-round{--margin-top:.25rem;--margin-left:.125rem;left:auto;margin-left:calc(var(--padding-left)*-1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto}.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){height:100%;width:100%}.audio{--icon-size:3rem;--icon-margin:.5625rem;height:var(--icon-size);overflow:visible!important}.audio-download,.audio-toggle{align-items:center;background-color:var(--primary-color);border-radius:50%}.audio.corner-download .audio-download{background:none;display:flex!important;height:1.375rem;left:57.5%;margin:0!important;top:57.5%;width:1.375rem}.audio.corner-download .preloader-container{background-color:var(--primary-color);border-radius:inherit}.audio.corner-download .preloader-path-new{stroke-width:.25rem}.audio-play-icon{border-radius:inherit;bottom:0;left:0;max-height:100%;max-width:100%;overflow:hidden;position:absolute;right:0;top:0;transform:rotate(-119deg)}body.animation-level-2 .audio-play-icon{transition:transform .25s ease-in-out}.audio-toggle .part{background-color:#fff;left:50%;position:absolute;top: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:100%}.audio-waveform-background rect{opacity:.3}html.no-touch .audio-waveform-background rect:active,html.no-touch .audio-waveform-background rect:hover{opacity:1}.audio-waveform-fake{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0;width:0}.audio-waveform-container{height:23px;margin-top:1px;position:relative}.audio-waveform rect{fill:var(--primary-color)}.audio .audio-details{margin-bottom:0;margin-top:3px}.audio .audio-title{margin-bottom:-2px}.audio .part{height:112px!important;width:112px!important}@media only screen and (max-width:600px){.audio .part{height:100px!important;width:100px!important}}.audio-title{color:var(--primary-text-color);font-size:1rem}.audio-description:not(:empty):before{content:\" โ€ข \"}.audio-subtitle,.audio-time{color:var(--secondary-text-color);display:flex;font-size:.875rem}@media only screen and (max-width:600px){.audio-subtitle,.audio-time{font-size:.75rem}}.audio-subtitle,.audio-time,.audio-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio-subtitle{align-items:center}.audio-subtitle .audio-time{flex:0 0 auto;margin-right:.25rem}.audio-subtitle,.audio-title{margin-left:-1px}.audio-title,.audio:not(.audio-show-progress) .audio-subtitle{max-width:100%}.audio.is-voice .audio-time{align-items:center;line-height:1;margin-left:-1px;margin-top:7px}@media only screen and (max-width:600px){.audio.is-voice .audio-time{margin-top:.3125rem}.audio.is-voice .audio-waveform-container{height:16px;margin-top:0}}.audio.is-voice.is-unread .audio-time:after{background-color:var(--primary-color);border-radius:50%;content:\" \";height:.5rem;margin-left:.375rem;width:.5rem}.audio.is-voice.is-unread:not(.is-out) .audio-toggle:not(.playing)+.audio-waveform-container .audio-waveform-background rect{opacity:1}.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{background-color:transparent;opacity:1;z-index: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;height:inherit;-o-object-fit:cover;object-fit:cover;width: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{align-items:center;display:flex;justify-content:center;left:0;position:absolute;top:8px;transform:translate3d(0,calc(-100% - 10px),0);transition:transform .2s ease;width:100%}body.animation-level-0 .quiz-hint{transition:none}.quiz-hint.active{transform:translateZ(0)}[dir=ltr] .quiz-hint .container{text-align:left}[dir=rtl] .quiz-hint .container{text-align:right}.quiz-hint .container{align-items:center;background:rgba(0,0,0,.7);border-radius:12px;color:#fff;display:flex;flex-wrap:wrap;font-size:15px;line-height:1.5;max-width:400px;min-height:48px;overflow:hidden;padding:10px 18px 12px 50px;position:relative;text-align:center;width:auto}@media only screen and (max-width:600px){.quiz-hint .container{font-size:14px;margin:0 10px;padding:10px 18px 12px 54px}}.quiz-hint .container .text{word-break:break-word}.quiz-hint .container:before{content:\"๎ฅ—\";font-size:1.5rem;left:15px;position:absolute;top:12px}.quiz-hint .container a{border-bottom:1px solid #fff;color:#fff}.peer-typing{margin-right:4px}.peer-typing-container{--color:var(--primary-color);color:var(--color)}.peer-typing-flex{align-items:center;display:flex}.peer-typing:not(.peer-typing-text):not(.peer-typing-choosing-sticker){display:inline-block;transform:translateY(-1px);vertical-align:middle}.peer-typing-text-dot{animation-duration:.6s;animation-iteration-count:infinite;animation-name:dotMiddle;animation-timing-function:linear;background-color:var(--color);border-radius:50%;display:inline-block;height:6px;margin:0 .5px;vertical-align:middle;width:6px}.peer-typing-text-dot:first-child{animation-name:dotFirst}.peer-typing-text-dot:last-child{animation-name:dotLast}.peer-typing-upload{border-radius:2px;height:5px;margin-right:.375rem;overflow:hidden;position:relative;width:13px}.peer-typing-upload:after,.peer-typing-upload:before{background-color:var(--color);border-radius:inherit;bottom:0;content:\" \";display:block;left:0;position:absolute;right:0;top:0}.peer-typing-upload:before{opacity:.3}.peer-typing-upload:after{animation:upload 1s ease-in-out infinite}.peer-typing-record{margin-right:.375rem}.peer-typing-record:before{animation:recordBlink 1.25s infinite;background-color:var(--color);border-radius:50%;content:\" \";display:block;height:6px;width:6px}.peer-typing-choosing-sticker{align-items:center;display:flex;flex:0 0 auto;height:16px;margin-right:.375rem}.peer-typing-choosing-sticker-eye{animation:eye 1.8s ease-in-out infinite;border:1px solid var(--color);border-radius:50%;display:inline-block;height:14px;margin:0 .0625rem;position:relative;vertical-align:middle;width:8px}.peer-typing-choosing-sticker-eye:before{animation:eye-move 1.8s ease-in-out infinite;background-color:var(--color);border-radius:50%;content:\" \";display:block;height:.25rem;position:absolute;top:50%;transform:translate(-1px,-50%);width:.25rem}@keyframes dotFirst{0%{opacity:.8;transform:scale(.6666666667)}50%{opacity:.8;transform:scale(.6666666667)}75%{opacity:1;transform:scale(1)}to{opacity:.8;transform:scale(.6666666667)}}@keyframes dotMiddle{0%{opacity:.9;transform:scale(.8333333333)}12.5%{opacity:.8;transform:scale(.6666666667)}62.5%{opacity:.8;transform:scale(.6666666667)}87.5%{opacity:1;transform:scale(1)}to{opacity:.9;transform:scale(.8333333333)}}@keyframes dotLast{0%{opacity:1;transform:scale(1)}25%{opacity:.8;transform:scale(.6666666667)}75%{opacity:.8;transform:scale(.6666666667)}to{opacity:1;transform:scale(1)}}@keyframes upload{0%{transform:translateX(-13px)}to{transform:translate(13px)}}@keyframes eye{0%{transform:scale(1.1) translateX(-.75px)}12.5%{transform:scale(1) translateX(0)}25%{transform:scale(1.1) translateX(.375px)}50%{transform:scale(1.1) translateX(.75px)}62.5%{transform:scale(1) translateX(0)}75%{transform:scale(1.1) translateX(-.375px)}to{transform:scale(1.1) translateX(-.75px)}}@keyframes eye-move{0%{transform:translate(-1px,-50%)}25%{transform:translate(3px,-50%)}50%{transform:translate(3px,-50%)}75%{transform:translate(-1px,-50%)}to{transform:translate(-1px,-50%)}}poll-element{color:var(--primary-text-color);display:block;margin-top:-1px;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:330px}@media only screen and (max-width:600px){poll-element{max-width:100%;width:240px}}poll-element:not(.is-closed):not(.is-voted) .poll-answer{cursor:pointer}poll-element .poll-title{font-weight:var(--font-weight-bold)}@media only screen and (max-width:600px){poll-element .poll-title{max-width:88%;white-space:normal}}poll-element .poll-desc{align-items:center;color:var(--secondary-text-color);display:flex;font-size:14px;margin-bottom:5px;margin-top:2px;position:relative}poll-element .poll-type{margin-top:2px}poll-element .poll-hint{color:var(--primary-color);cursor:pointer;font-size:1.5rem;position:absolute;right:2px;top:-4px;transform:scale(1)}body.animation-level-2 poll-element .poll-hint{transition:transform .2s ease}poll-element .poll-hint.active{pointer-events:none;transform:scale(0)}poll-element .poll-send-vote{cursor:default}poll-element .poll-avatars{cursor:pointer;display:flex;margin-left:18px}poll-element .poll-avatar{border:1px solid var(--border-color);cursor:pointer;height:18px;width:18px}poll-element .poll-answer{display:flex;margin-top:1px;padding-bottom:20px;padding-left:28px;position:relative}poll-element .poll-answer-text{margin-left:12px;margin-top:6px}[dir=ltr] poll-element .poll-answer-percents{text-align:right}[dir=rtl] poll-element .poll-answer-percents{text-align:left}poll-element .poll-answer-percents{font-size:14px;font-weight:var(--font-weight-bold);left:0;margin-left:-9px;margin-top:7px;opacity:0;position:absolute;top:0;width:40px}poll-element .poll-answer-selected{align-items:center;background:var(--primary-color);border-radius:50%;bottom:1px;color:#fff;display:flex;font-size:.75rem;font-weight:var(--font-weight-bold);height:16px;justify-content:center;left:15px;opacity:1;position:absolute;width:16px}poll-element .poll-answer-selected:before{content:\"๎ค€\";font-weight:var(--font-weight-bold)}html.no-touch poll-element .poll-answer:active .animation-ring,html.no-touch poll-element .poll-answer:hover .animation-ring{transform:scale(1);visibility:visible}poll-element .poll-answer.is-voting .progress-ring__circle{stroke-dashoffset:-19.792;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:var(--secondary-text-color);font-size:.875rem;margin-top:-.5rem}poll-element .poll-line{stroke-dashoffset:0;stroke-dasharray:0,485.9;bottom:2px;height:35px;left:10px;position:absolute}poll-element .poll-line use{stroke-width:4px;stroke-linecap:round;stroke:var(--primary-color);fill:none}poll-element .poll-footer{height:2.875rem;margin:-.375rem -.5rem -.375rem -.625rem;text-align:center}poll-element .poll-footer-button{border-top-left-radius:0!important;border-top-right-radius:0!important;color:var(--primary-color);cursor:pointer;font-size:1rem;font-weight:var(--font-weight-bold);height:100%;overflow:hidden;width:100%}poll-element .poll-footer,poll-element .poll-footer-button{align-items:center;display:flex;justify-content:center}poll-element .poll-quiz-timer{stroke:#a3adb6;fill:none;stroke-linecap:round;height:32px;position:absolute;right:-2px;top:-7px;transform:rotate(270deg);width:32px}poll-element .poll-time{color:#a3adb6;font-size:12px;font-weight:var(--font-weight-bold);position:absolute;right:27px}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) use{stroke:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected{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{align-items:center;display:flex;height:34px;justify-content:center;left:-1px;position:absolute;top:-1px;transform:scale(1);width:34px}poll-element .circle-hover .poll-answer-selected{animation:none;display:flex!important;font-size:20px;height:20px;left:50%;line-height:16px;opacity:0;top:50%;transform:translate(-50%,-50%);width:20px}body.animation-level-2 poll-element .circle-hover .poll-answer-selected{transition:opacity .2s ease}poll-element .animation-ring{background-color:var(--light-secondary-text-color);border-radius:50%;display:block;height:34px;transform:scale(.1);visibility:hidden;width:34px}body.animation-level-2 poll-element .animation-ring{transition:transform .12s ease}poll-element .progress-ring{height:26px;left:auto;top:auto;width:26px}poll-element .progress-ring__circle{stroke-dasharray:56.5487,56.5487;stroke-dashoffset:0;stroke-opacity:1;stroke-width:2;stroke:var(--poll-circle-color);fill:transparent;transform:rotate(-90deg);transform-origin:center}poll-element.is-voted .animation-ring,poll-element.is-voted .circle-hover{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 forwards .1s ease}poll-element.animating.is-retracting .poll-answer-selected{transition-delay:0s}poll-element.animating .poll-answer-percents{transition:opacity .34s}poll-element.animating .progress-ring__circle{transition:stroke-dashoffset .15s}poll-element.animating .circle-hover{transition:transform .1s}poll-element.is-multiple .poll-desc{margin-bottom:.5rem}poll-element .c-ripple__circle{background-color:var(--light-primary-color)}@keyframes pollAnswerRotate{to{transform:rotate(270deg)}}.transition>.transition-item{animation-fill-mode:forwards!important;height:100%;left:0;position:absolute;top:0;width:100%}.transition>.transition-item:not(.active):not(.from):not(.to){display:none!important}.transition.zoom-fade>.from{opacity:1;transform:scale(1);transform-origin:center}.transition.zoom-fade>.to{opacity:0;transform-origin:center}.transition.zoom-fade.animating>.from{animation:fade-out-opacity .15s ease}.transition.zoom-fade.animating>.to{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(.95)}.transition.zoom-fade.backwards.animating>.from{animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease}.transition.zoom-fade.backwards.animating>.to{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{opacity:1;transform:translateX(0);transform-origin:left center}.transition.slide-fade>.to{opacity:0;transform:translateX(1.5rem);transform-origin:left center}.transition.slide-fade.animating>.from{animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s}.transition.slide-fade.animating>.to{animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s}.transition.slide-fade.backwards>.from{opacity:1;transform:translateX(0)}.transition.slide-fade.backwards>.to{opacity:0;transform:translateX(-1.5rem)}.transition.slide-fade.backwards.animating>.from{animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s}.transition.slide-fade.backwards.animating>.to{animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s}@keyframes zoom-fade-in-move{0%{transform:scale(1.1)}to{transform:scale(1)}}@keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}to{transform:scale(1.1)}}@keyframes zoom-fade-out-backwards-move{0%{transform:scale(.95)}to{transform:scale(1)}}@keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}to{transform:translateX(0)}}@keyframes slide-fade-out-move{0%{transform:translateX(0)}to{transform:translateX(-1.5rem)}}@keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}to{transform:translateX(1.5rem)}}@keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}to{transform:translateX(0)}}.row{display:flex;flex-direction:column;justify-content:center;min-height:3.5rem;padding:.4375rem 1rem;position:relative}.row.no-subtitle,.row.row-small{min-height:3rem;padding-bottom:.1875rem;padding-top:.1875rem}body.animation-level-2 .row{transition:opacity var(--transition-standard-in)}.row.is-disabled{opacity:var(--disabled-opacity);pointer-events:none!important}.row.no-wrap{padding-bottom:0!important;padding-top:0!important}.row a{pointer-events:all;position:relative;z-index:1}.row-title-row,.row>.row-title{order:0}[dir=ltr] .row-big{padding-left:1rem;padding-right:.75rem}[dir=rtl] .row-big{padding-left:.75rem;padding-right:1rem}.row-big{min-height:4.5rem;padding-bottom:.5625rem;padding-top:.5625rem}.row-row{align-items:center;display:flex;justify-content:space-between}.row-row .row-subtitle,.row-row .row-title{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.row-subtitle-row,.row>.row-subtitle{order:1}.row-title{color:var(--primary-text-color);font-size:var(--font-size);line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;word-break:break-word}.row-title-right-secondary{color:var(--secondary-text-color)}[dir=ltr] .row-subtitle-right,[dir=ltr] .row-title-right{margin-left:1rem}[dir=rtl] .row-subtitle-right,[dir=rtl] .row-title-right{margin-right:1rem}.row-subtitle-right,.row-title-right{flex:0 0 auto!important}.row-midtitle,.row-subtitle,.row-title{pointer-events:none;position:relative}.row-midtitle{font-size:var(--font-size-14);margin-top:.125rem;order:1}[dir=ltr] .row-with-padding{padding-left:4.5rem}[dir=rtl] .row-with-padding{padding-right:4.5rem}@media only screen and (max-width:600px){[dir=ltr] .row-with-padding{padding-left:4rem}[dir=rtl] .row-with-padding{padding-right:4rem}}[dir=ltr] .row-with-padding.tgico:before{left:1rem}[dir=rtl] .row-with-padding.tgico:before{right:1rem}.row-with-padding.tgico:before{color:var(--secondary-text-color);font-size:1.5rem;pointer-events:none;position:absolute;top:50%;transform:translateY(-50%);z-index:1}.row-with-padding:not(.row-with-icon):before{display:none}.row-clickable{cursor:pointer;overflow:hidden}@media only screen and (min-width:601px){.row-clickable{border-radius:10px}}[dir=ltr] .row-sortable .row-subtitle,[dir=ltr] .row-sortable .row-title{padding-right:2.5rem}[dir=rtl] .row-sortable .row-subtitle,[dir=rtl] .row-sortable .row-title{padding-left:2.5rem}[dir=ltr] .row-sortable-icon{right:.75rem}[dir=rtl] .row-sortable-icon{left:.75rem}.row-sortable-icon{color:var(--secondary-text-color);font-size:1.5rem;height:1.5rem;line-height:1;opacity:0;pointer-events:none;position:absolute;top:50%;transform:translateY(-50%)}.row-sortable.cant-sort .row-sortable-icon{display:none}.row-sortable.is-dragging{background-color:var(--surface-color)!important;z-index:1}html.no-touch .row-sortable.is-dragging:active,html.no-touch .row-sortable.is-dragging:hover{background-color:var(--light-filled-secondary-text-color)!important}html.no-touch .row-sortable:active .row-sortable-icon,html.no-touch .row-sortable:hover .row-sortable-icon{opacity:1}body.animation-level-2 .is-reordering .row-sortable{transition:transform var(--transition-standard-in)}[dir=ltr] .row .checkbox-field,[dir=ltr] .row .radio-field-main{padding-left:3.375rem}[dir=rtl] .row .checkbox-field,[dir=rtl] .row .radio-field-main{padding-right:3.375rem}[dir=ltr] .row .checkbox-field,[dir=ltr] .row .radio-field-main{margin-left:-3.375rem}[dir=rtl] .row .checkbox-field,[dir=rtl] .row .radio-field-main{margin-right:-3.375rem}.row .checkbox-field,.row .radio-field,.row .radio-field:not(.radio-field-right) .radio-field-main{position:static}.row .checkbox-field,.row .radio-field{--offset-left:1rem}.row .radio-field{margin-bottom:0;margin-top:0}[dir=ltr] .row .checkbox-field{margin-right:0}[dir=rtl] .row .checkbox-field{margin-left:0}.row .checkbox-field{height:auto;margin-bottom:0;margin-top:0}[dir=ltr] .row .checkbox-field .checkbox-caption{padding-left:0}[dir=rtl] .row .checkbox-field .checkbox-caption{padding-right:0}.row .checkbox-field .checkbox-caption{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.row .checkbox-field-toggle{margin-left:.125rem;margin-right:.125rem;padding:0}.row-subtitle{color:var(--secondary-text-color)!important;font-size:var(--font-size-14)!important;line-height:var(--line-height-14);margin-top:.1875rem}.row-subtitle:empty{display:none}[dir=ltr] .row-media{left:.75rem}[dir=rtl] .row-media{right:.75rem}.row-media{align-items:center;display:flex;height:2.25rem!important;justify-content:center;margin:0!important;pointer-events:none;position:absolute!important;width:2.25rem!important}[dir=ltr] .row-media-small{left:.75rem!important}[dir=rtl] .row-media-small{right:.75rem!important}.row-media-small{height:2rem!important;width:2rem!important}[dir=ltr] .row-media-abitbigger{left:.75rem!important}[dir=rtl] .row-media-abitbigger{right:.75rem!important}.row-media-abitbigger{height:2.625rem!important;width:2.625rem!important}[dir=ltr] .row-media-big{left:.5rem!important}[dir=rtl] .row-media-big{right:.5rem!important}.row-media-big{height:3rem!important;width:3rem!important}[dir=ltr] .row-media-bigger{left:.5625rem!important}[dir=rtl] .row-media-bigger{right:.5625rem!important}.row-media-bigger{height:3.375rem!important;width:3.375rem!important}.row.menu-open{background-color:var(--light-secondary-text-color)}[dir=ltr] .row>.btn-primary{right:1rem}[dir=rtl] .row>.btn-primary{left:1rem}.row>.btn-primary{border-radius:.9375rem;font-size:.9375rem;height:1.875rem;line-height:1.875rem;margin:0;padding-left:.75rem;padding-right:.75rem;position:absolute;top:50%;transform:translateY(-50%);width:auto}body.animation-level-2 .row>.btn-primary{transition:width .2s,background-color .2s,color .2s}.row>.btn-primary.active{background-color:var(--light-primary-color)!important;color:var(--primary-color)}.color-picker{margin:1.1875rem auto .25rem;max-width:100%;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:380px}@media only screen and (max-width:600px){.color-picker{padding:0 .75rem}}.color-picker-box{height:198px;width:100%}.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: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:var(--surface-color);border-radius:10px;bottom:calc(100% + .625rem);box-shadow:0 5px 10px 5px rgba(16,35,47,.14);display:flex!important;flex-direction:column;max-height:26.25rem;max-width:100%;opacity:0;overflow:hidden;padding:0!important;position:absolute!important;right:0;transform:scale(0);transform-origin:bottom right;transition:transform var(--esg-transition),opacity var(--esg-transition);width:26.25rem!important;z-index:3}@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{background-color:transparent;border:2px solid var(--primary-color);border-radius:.375rem;color:var(--primary-color);font-size:.9375rem;font-weight:var(--font-weight-bold);height:3rem;text-align:center;width:100%}body.animation-level-2 .reply-keyboard-button{transition:color .15s,background-color .15s}html.no-touch .reply-keyboard-button:active,html.no-touch .reply-keyboard-button:hover{background-color:var(--primary-color);color:#fff}.reply-keyboard-button+.reply-keyboard-button{margin-left:.3125rem}.reply-keyboard .scrollable-y{bottom:auto;height:auto;left:auto;max-height:100%;padding:.625rem!important;position:relative;right:auto;top:auto}.peoplenearby-container div.text.nearby-description{color:var(--primary-text-color);margin-top:15px;text-align:center}.peoplenearby-container div.text.nearby-error{color:var(--gc-secondary-text-color);margin-top:10px;text-align:center}.peoplenearby-container .locating-animation-container{align-items:center;display:flex;justify-content:center;min-height:140px;width:100%}.peoplenearby-container .locating-animation-container .tgico.tgico-location{align-items:center;background:var(--avatar-color-bottom);border-radius:50%;display:flex;height:140px;justify-content:center;padding:50px;width:140px}.peoplenearby-container .locating-animation-container .tgico.tgico-location:before{color:#fff;font-size:58px}.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{animation:waves-animation 3s infinite;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%);height:50px;margin-left:36px;width:50px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-2,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{animation:waves-animation 5s infinite;animation-delay:2s;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%);height:71px;margin-left:51px;margin-top:1px;width:66px}.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)}@keyframes waves-animation{0%{opacity:1}50%{opacity:0}to{opacity:1}}.spoiler{--anim:.4s ease;background-color:var(--spoiler-background-color)}.spoiler-text{opacity:0}.spoilers-container .custom-emoji-canvas{z-index:-1}.spoilers-container.is-spoiler-visible.animating .spoiler{transition:background-color var(--anim)}.spoilers-container.is-spoiler-visible.animating .spoiler-text{transition:opacity var(--anim)}.spoilers-container.is-spoiler-visible:not(.backwards) .spoiler{background-color:transparent}.spoilers-container.is-spoiler-visible:not(.backwards) .spoiler-text{opacity:1}.spoilers-container:not(.is-spoiler-visible) .spoiler{cursor:pointer}.spoilers-container:not(.is-spoiler-visible) .spoiler-text{pointer-events:none}.emoji-animation,.emoji-animation-container{pointer-events:none;position:absolute}.emoji-animation-container{bottom:0;left:0;overflow:hidden;right:0;top:0;z-index:3}.reactions-block{display:flex;flex-wrap:wrap;-webkit-user-select:none;-moz-user-select:none;user-select:none}.reactions-block.has-no-reactions{display:inline;display:initial}.reactions-inline{display:inline-flex}.reactions-inline:not(:empty){margin-right:.125rem}.reaction,.reaction-sticker{align-items:center;display:flex}.reaction-sticker{--custom-emoji-size:var(--reaction-size);height:var(--reaction-size);justify-content:center;position:relative;width:var(--reaction-size)}.reaction-sticker-activate{bottom:var(--reaction-offset);left:var(--reaction-offset);position:absolute;right:var(--reaction-offset);top:var(--reaction-offset);z-index:1}.reaction-sticker.has-animation>.media-sticker{opacity:0}.reaction-sticker:not(.is-static):not(.is-custom) .media-sticker{--size:calc(var(--reaction-size) + var(--reaction-offset)*-2);bottom:auto;height:var(--size)!important;left:auto;max-height:var(--size);max-width:var(--size);right:auto;top:auto;width:var(--size)!important}.reaction-sticker.is-custom{border-radius:.3125rem}.reaction-sticker.is-custom .custom-emoji,.reaction-sticker.is-custom .media-sticker{border-radius:inherit}.reaction-sticker.is-custom .custom-emoji-canvas{z-index:auto}.reaction-inline{--reaction-size:.875rem;--reaction-offset:-.4375rem;min-height:var(--reaction-size);min-width:var(--reaction-size)}.reaction-inline .reaction-counter{font-size:inherit!important;margin-right:.0625rem!important;order:-1}.reaction-block{--additional-height:.5rem;--margin:.375rem;--reaction-size:1.375rem;--reaction-offset:-.5625rem;--background-color:var(--message-highlightning-color);--chosen-background-color:var(--message-primary-color);--counter-color:#fff;--reaction-total-size:calc(var(--reaction-size) + var(--additional-height));background-color:var(--background-color);border-radius:var(--reaction-total-size);color:var(--counter-color);cursor:pointer;height:var(--reaction-total-size);margin-right:var(--margin);margin-top:var(--margin);padding:0 .5rem;position:relative}html.no-touch .reaction-block:active:after,html.no-touch .reaction-block:hover:after{background-color:var(--chosen-background-color);border-radius:inherit;bottom:0;content:\" \";left:0;opacity:.08;position:absolute;right:0;top:0}.reaction-block .reaction-counter,.reaction-block .reaction-sticker{z-index:1}.reaction-block:last-child{margin-right:0}.reaction-block:before{background-color:var(--chosen-background-color);border-radius:inherit;bottom:0;content:\" \";left:0;opacity:0;position:absolute;right:0;top:0;transform:scale(0)}.reaction-block.is-chosen:not(.backwards):before{opacity:1;transform:scale(1)}.reaction-block.is-chosen:not(.backwards) .stacked-avatars{--border-color:var(--chosen-background-color)}.reaction-block.is-chosen.animating:before{transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.reaction-block.is-chosen.animating .reaction-counter{transition:color var(--transition-standard-in)}.reaction-block.is-chosen.animating .stacked-avatars-avatar-container{transition:border-color var(--transition-standard-in)}.reaction-block .stacked-avatars{--border-color:transparent;--border-size:.125rem;--margin-right:-.875rem;margin-left:.1875rem}.reaction-block .reaction-counter{font-size:.9375rem!important;font-weight:var(--font-weight-bold);line-height:1.125rem;margin:0 .0625rem 0 .375rem;position:relative}.stacked-avatars{--border-color:var(--surface-color);--border-size:1px;--margin-right:-.3125rem;--avatar-size:1rem;--avatar-total-size:calc(var(--avatar-size) + var(--border-size)*2);display:flex;flex-direction:row-reverse}.stacked-avatars-avatar{height:var(--avatar-size);width:var(--avatar-size);z-index:0}.stacked-avatars-avatar-container{align-items:center;border:var(--border-size) solid var(--border-color);border-radius:50%;display:flex;height:var(--avatar-total-size);justify-content:center;position:relative;width:var(--avatar-total-size)}.stacked-avatars-avatar-container:not(:first-child){margin-right:var(--margin-right)}.sticker-viewer{align-items:center;bottom:0;display:flex;justify-content:center;left:0;pointer-events:none;position:fixed;right:0;top:0;z-index:4}.sticker-viewer:before{background-color:rgba(0,0,0,.6);bottom:0;content:\" \";left:0;opacity:0;position:absolute;right:0;top:0}body.animation-level-2 .sticker-viewer:before{transition:opacity var(--sticker-viewer-open-transition-out)}.sticker-viewer.is-visible:not(.backwards):before{opacity:1}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards):before{transition:opacity var(--sticker-viewer-open-transition-in)}.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-transformer:not(.is-switching){transform:translateX(var(--translateX)) scale(1)!important}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-transformer:not(.is-switching){transition:transform var(--sticker-viewer-open-transition-in)}.sticker-viewer.is-visible:not(.backwards) .emoji-animation,.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-emoji,.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker{opacity:1}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .emoji-animation,body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-emoji,body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker{transition:opacity var(--sticker-viewer-open-transition-in)}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker:not(.is-overflow){transition:opacity 0s}.sticker-viewer-transformer{--translateX:0;align-items:center;display:flex;height:360px;justify-content:center;position:absolute;width:360px}.sticker-viewer-transformer.has-effect{height:280px;width:280px}.sticker-viewer-transformer.has-effect .sticker-viewer-emoji{top:-5.5rem}body.animation-level-2 .sticker-viewer-transformer{transition:transform var(--sticker-viewer-open-transition-out)}.sticker-viewer-transformer.is-switching{opacity:1!important;transform:translateX(var(--translateX)) scale(1)!important}body.animation-level-2 .sticker-viewer-transformer.is-switching{transition:transform var(--sticker-viewer-switch-transition),opacity var(--sticker-viewer-switch-transition)!important}.sticker-viewer-transformer.is-switching:not(.backwards){opacity:0!important;transform:scale(.4) translateX(var(--translateX))!important}.sticker-viewer-emoji{position:absolute;top:-3rem;transform:translateX(var(--translateX)) scale(2)}.sticker-viewer-sticker{position:absolute}.sticker-viewer .emoji-animation,.sticker-viewer-emoji,.sticker-viewer-sticker{opacity:0}body.animation-level-2 .sticker-viewer .emoji-animation,body.animation-level-2 .sticker-viewer-emoji,body.animation-level-2 .sticker-viewer-sticker{transition:opacity var(--sticker-viewer-open-transition-out)}.custom-emoji{display:inline;height:var(--custom-emoji-size)!important;min-height:var(--custom-emoji-size)!important;min-width:var(--custom-emoji-size)!important;position:relative;width:var(--custom-emoji-size)!important}.custom-emoji:before{content:\"ย \";display:inline-block;height:inherit;min-height:inherit;min-width:inherit;width:inherit}.custom-emoji .media-sticker,.custom-emoji .rlottie{height:inherit!important;margin:0;max-height:inherit!important;max-width:inherit!important;pointer-events:none;text-indent:-9999px;width:inherit!important}.custom-emoji-canvas{height:100%;width:100%}.custom-emoji-canvas,.custom-emoji-renderer{bottom:0;left:0;position:absolute;right:0;top:0}.custom-emoji-renderer{pointer-events:none}.custom-emoji-placeholder{display:inline;height:var(--messages-custom-emoji-size);margin-top:-.125rem;vertical-align:middle;width:var(--messages-custom-emoji-size)}.usernames-username-icon{background-color:var(--secondary-color);border-radius:50%;color:#fff;font-size:1.25rem}.usernames-username-icon:before{content:\"๎ฅฅ\"}.usernames-username.active .usernames-username-status{color:var(--primary-color)!important}.usernames-username.active .usernames-username-icon{background-color:var(--primary-color)}.topics-slider{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0}.topics-container{--offset:0;--width:100%;background-color:var(--surface-color)!important;width:var(--width)!important}.topics-container.is-floating{--offset:5.0625rem;--width:calc(var(--left-column-width) - var(--offset));border-left:1px solid var(--border-color);bottom:0;overflow:visible!important;overflow:initial!important;pointer-events:all;position:absolute;right:0;top:0;transform:translateX(var(--width));z-index:3}.topics-container.is-visible:not(.backwards){transform:translateX(0)}.topics-container.is-visible.animating{transition:transform var(--transition-standard-in)}.topics-container.is-visible.animating.backwards{transition:transform var(--transition-standard-out)}.topics-container .sidebar-header{padding:0 .75rem}.topics-container .sidebar-header__rows{flex:1 1 auto;overflow:hidden;padding-left:.5rem}.topics-container .sidebar-header__rows .sidebar-header__title{font-size:var(--font-size-16);line-height:var(--line-height-16);margin-bottom:.125rem;padding-left:0!important}.topics-container .sidebar-header__subtitle,.topics-container .sidebar-header__title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.topics-container .sidebar-header__subtitle{color:var(--secondary-text-color);font-size:var(--font-size-14);line-height:var(--line-height-14)}.topics-container .chatlist-chat{min-height:4rem;padding-left:.75rem}.topic-name .topic-icon{margin-right:.25rem}.topic-name-button{--color:var(--primary-color);align-items:center;color:var(--color);cursor:pointer;display:flex;font-weight:var(--font-weight-bold);height:1.5rem;justify-content:center;max-width:100%;padding:0 .5rem;position:relative;text-decoration:none!important}.topic-name-button-container{align-items:flex-start;display:flex!important;justify-content:flex-start}.topic-name-button .peer-title,.topic-name-button .topic-name{position:relative}.topic-name-button:before{background-color:var(--color);border-radius:1.5rem;bottom:0;content:\" \";left:0;opacity:.08;position:absolute;right:0;top:0}html.no-touch .topic-name-button:active:before,html.no-touch .topic-name-button:hover:before{opacity:.16}.topic-icon{--size:1.25rem;--custom-emoji-size:var(--size);display:inline-flex;font-size:calc(var(--size)/2);justify-content:center;line-height:1.875!important;position:relative;vertical-align:middle}.topic-icon-general{fill:var(--secondary-color);height:var(--size);width:var(--size)}.topic-icon-svg{height:inherit;position:absolute;width:inherit}.topic-icon-content{position:relative}.edit-topic-container .scrollable-y{display:flex;flex-direction:column}.edit-topic-icon{position:absolute}.edit-topic-icon .topic-icon{--size:4rem}.edit-topic-icon-container{align-items:center;cursor:pointer;display:flex;height:100px;justify-content:center;margin:0 auto;position:relative;width:100px}.edit-topic-emoticons-container{flex:1 1 auto}.edit-topic-emoticons-container .sidebar-left-section{height:100%;padding:0!important}.edit-topic-emoticons-container .emoji-padding{display:flex;flex-direction:column}.edit-topic-emoticons-container .super-emoji-topic-icon .topic-icon{--size:var(--esg-emoji-size);--custom-emoji-size:inherit;margin-left:calc((var(--custom-emoji-size) - var(--esg-emoji-size))/2)}.themes-container{align-items:center;display:flex;height:6.5rem;position:relative}@media only screen and (min-width:601px){.themes-container{margin:0 -.5rem;padding:0;width:calc(100% + 1rem)}}.themes-container:after,.themes-container:before{content:\" \";display:block;flex:0 0 auto;height:.5rem;width:.5rem}.theme-container{border-radius:10px;cursor:pointer;display:flex;flex:0 0 auto;height:calc(100% - .5rem);justify-content:center;margin:0 .25rem;position:relative;width:4.5rem}.theme-container:before{border:2px solid var(--primary-color);border-radius:14px;bottom:-4px;content:\" \";left:-4px;opacity:0;position:absolute;right:-4px;top:-4px;transform:scale(.86)}html.is-safari .theme-container:before{transform:none!important}body.animation-level-2 .theme-container:before{transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.theme-container.active{pointer-events:none}.theme-container.active:before{opacity:1;transform:scale(1)}.theme-container .background-item{border-radius:inherit;height:100%;left:0;pointer-events:none;position:absolute;top:0;width:100%}.theme-emoticon{bottom:.5rem;height:1.75rem;pointer-events:none;position:absolute;width:1.75rem;z-index:1}html:not(.is-safari) .theme-emoticon{transform:scale(1);transform-origin:center bottom}body.animation-level-2 .theme-emoticon{transition:transform var(--transition-standard-in)}.theme-bubble{background-color:#fff;border-radius:1.75rem;height:1.25rem;pointer-events:none;position:absolute;width:2.5rem}.theme-bubble.is-out{background-color:var(--light-filled-message-out-primary-color);right:.375rem;top:.5rem}.theme-bubble.is-in{background-color:var(--message-background-color);left:.375rem;top:2rem}.popup{background-color:rgba(0,0,0,.3);bottom:0;box-shadow:none;display:flex;left:0;margin:0;max-width:none;opacity:0;overflow:auto;padding:1.875rem;position:fixed!important;right:0;top:0;transition-delay:0s,var(--popup-transition-time);transition-duration:var(--popup-transition-time),0s;transition-property:opacity,visibility;transition-timing-function:var(--popup-transition-function);-webkit-user-select:none;-moz-user-select:none;user-select:none;visibility:hidden;z-index:3}.popup.no-overlay{background-color:transparent;overflow:visible;padding:0}body.animation-level-0 .popup{transition:none}.popup.active{opacity:1;transition-delay:0s,0s;visibility:visible;z-index:4}.popup.active .popup-container,.popup.hiding .popup-container{transform:translate3d(var(--translateX),0,0)}[dir=ltr] .popup-title{padding-left:1.5rem;padding-right:1rem}[dir=rtl] .popup-title{padding-left:1rem;padding-right:1.5rem}.popup-title{flex:1;font-size:1.25rem;font-weight:var(--font-weight-bold);line-height:1;margin:0}.popup-title:first-child{padding-left:0}.popup-container{--translateX:0;-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:var(--surface-color);border-radius:10px;display:flex;flex-direction:column;margin:auto;overflow:hidden;padding:1rem;position:relative;transform:translate3d(var(--translateX),3rem,0);transition:transform var(--popup-transition-time) var(--popup-transition-function)}body.animation-level-0 .popup-container{transition:none}.popup-description .peer-title{font-weight:var(--font-weight-bold)}.popup-centerer{margin:auto}.popup-close{flex:0 0 auto;justify-self:center;z-index:3}.popup-header{align-items:center;display:flex;flex:0 0 auto;margin-bottom:2rem;position:relative}.popup-body{display:flex;flex:1 1 auto;flex-direction:column;overflow:hidden}.popup-body .scrollable{position:relative}.popup-buttons{align-items:center;display:flex;flex-direction:row-reverse;height:3rem;justify-content:flex-start;padding:0 .5rem}.popup-buttons .btn{border-radius:10px;font-weight:var(--font-weight-bold);height:2.5rem;max-width:100%;overflow:hidden;padding:0 1rem;position:relative;text-overflow:ellipsis;text-transform:uppercase;white-space:nowrap}[dir=ltr] .popup-buttons .btn+.btn{margin-right:.625rem}[dir=rtl] .popup-buttons .btn+.btn{margin-left:.625rem}.popup-avatar .popup-container{max-width:600px;padding:15px 16px 16px 24px}.popup-avatar .popup-container>button{bottom:20px;position:absolute;right:20px}.popup-avatar .popup-close{font-size:1.5rem;margin-top:4px}.popup-avatar .popup-header{margin-bottom:1px}[dir=ltr] .popup-avatar h6{text-align:left}[dir=rtl] .popup-avatar h6{text-align:right}.popup-avatar h6{font-size:1.25rem;margin:0 0 0 2rem}.popup-avatar .crop{border-radius:8px;max-height:100%;max-width:100%;padding:24px 54px 46px 46px}.popup-avatar .crop>img{display:none}.popup-avatar .crop img{border-radius:8px}.popup-new-media .popup-container{max-height:100%;max-width:420px;padding:12px 20px 32.5px;width:420px}.popup-new-media .popup-container img,.popup-new-media .popup-container video{border-radius:inherit}.popup-new-media .popup-header{align-items:center;flex:0 0 auto;flex-wrap:wrap;justify-content:space-between;margin-bottom:9px;padding:12px 20px 15px;position:relative}.popup-new-media .popup-header .btn-primary{border-radius:10px;font-size:var(--font-size-14);height:2.25rem;line-height:2.25rem;padding:0 1.375rem;text-transform:uppercase;width:auto}.popup-new-media .popup-close{margin:-1px 0 0 -4px}.popup-new-media .popup-photo{border-radius:10px;max-width:100%;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.popup-new-media .scrollable{position:relative}.popup-new-media .input-field{flex:0 0 auto;margin-top:25px;width:100%}.popup-new-media .input-field-input{border-radius:10px;font-size:1rem}.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{top:calc(100% + .25rem);z-index:4}.popup-new-media.popup-send-photo .popup-container{max-width:25rem;padding:0;width:25rem}.popup-new-media.popup-send-photo .popup-container.border-top-offset .popup-input-container{overflow:visible;overflow:initial}.popup-new-media.popup-send-photo .popup-container.border-top-offset .popup-input-container:before{top:-8px}.popup-new-media.popup-send-photo .menu-send{bottom:3.5rem;right:.5rem;top:auto}.popup-new-media.popup-send-photo .popup-header{height:3.5rem;margin:0;padding:0 1rem}[dir=ltr] .popup-new-media.popup-send-photo .popup-title{padding-left:1.5rem}[dir=rtl] .popup-new-media.popup-send-photo .popup-title{padding-right:1.5rem}.popup-new-media.popup-send-photo .popup-close{margin:0}.popup-new-media.popup-send-photo .popup-body{position:relative}.popup-new-media.popup-send-photo .popup-body .scrollable{padding:0 .5rem}.popup-new-media.popup-send-photo .input-message-container{max-height:inherit;min-height:inherit}.popup-new-media.popup-send-photo .input-message-input{max-height:inherit!important}.popup-new-media.popup-send-photo .btn-primary{flex:0 0 auto;height:2.5rem;line-height:2.5rem;margin-bottom:.5rem;padding:0 1rem;text-transform:uppercase;width:auto}.popup-new-media.popup-send-photo .popup-input-container{--height:3.5rem;--max-height:8.375rem;align-items:flex-end;display:flex;flex:0 0 auto;justify-content:space-between;max-height:var(--max-height);min-height:var(--height);overflow:hidden;padding:0 .5rem;position:relative}.popup-new-media.popup-send-photo .popup-input-container:before{background-color:var(--border-color);content:\" \";height:1px;left:0;opacity:0;position:absolute;right:0;top:0}body.animation-level-2 .popup-new-media.popup-send-photo .popup-input-container:before{transition:opacity var(--transition-standard-in)}.popup-new-media.popup-send-photo .popup-input-container.has-border-top:before{opacity:1}.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{height:100%;-o-object-fit:cover;object-fit:cover;width: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{border-radius:inherit;overflow:hidden;position:relative}.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{--padding:.25rem;--icon-size:4.5rem;--icon-margin:.5rem;border-radius:10px;cursor:default;height:5rem;margin:0 .25rem;max-width:100%;overflow:hidden}.popup-new-media.popup-send-photo .document-name{line-height:1.5;margin-bottom:.125rem;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.popup-new-media.popup-send-photo .document-ico{border-radius:5px;font-size:16px;font-weight:400;letter-spacing:0;line-height:11px}html.no-touch .popup-new-media.popup-send-photo .document:active,html.no-touch .popup-new-media.popup-send-photo .document:hover{background-color:var(--light-secondary-text-color)}.popup-create-contact .name-fields{display:flex;flex-direction:column;margin-top:1rem;padding-left:116px;position:relative}.popup-create-contact .name-fields .input-field:first-child{margin-top:0}.popup-create-contact .avatar-placeholder{left:0;position:absolute;top:50%;transform:translateY(-50%)}.popup-peer .popup-header{align-items:center;display:flex;height:2.5rem;margin:0;padding:0 1rem;width:-moz-max-content;width:max-content}.popup-peer .popup-container{max-width:min(400px,100%);min-width:min(100%,17.5rem);padding:.75rem .5rem;width:-moz-min-content;width:min-content}.popup-peer .popup-title{font-size:1.25rem;font-weight:var(--font-weight-bold)}.popup-peer .popup-title:not(:first-child){padding-left:1rem}.popup-peer .popup-description{line-height:var(--line-height);margin-bottom:0;margin-top:0;max-width:-moz-fit-content;max-width:fit-content;min-width:min(100%,15rem);overflow:hidden;padding:.625rem 1rem .5rem;text-overflow:ellipsis;word-break:break-word}.popup-peer .checkbox-field{align-items:center;display:flex;height:3rem;margin:0;padding:0 1.125rem}.popup-peer .checkbox-field .checkbox-box{left:auto}.popup-stickers{-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-stickers .sticker-set-footer{color:var(--primary-color);text-align:center}.popup-stickers .sticker-set-footer .btn-primary{height:44px;line-height:44px;padding:0 1.0625rem;text-transform:uppercase;width:auto}.popup-stickers .scrollable.is-loading{min-height:9rem;position:relative}.popup-stickers .sticker-set-footer{padding:8px 0}.popup-stickers .super-emojis{padding:0 .5rem}.popup-stickers .popup-container{max-height:420px;max-width:420px;padding:0;width:420px}[dir=ltr] .popup-stickers .popup-close{margin-left:1rem}[dir=rtl] .popup-stickers .popup-close{margin-right:1rem}.popup-stickers .popup-close{font-size:1.5rem}.popup-stickers .popup-header{flex:0 0 auto;margin:.625rem 0}.popup-stickers .sticker-set{margin:.0625rem 0}.popup-stickers .sticker-set .row-title{font-weight:var(--font-weight-bold)}.popup-stickers .sticker-set-stickers{--per-row:5;--item-size:var(--popup-sticker-size);display:grid;grid-template-columns:repeat(var(--per-row),1fr);padding:0 5px;position:relative}@media only screen and (max-width:600px){.popup-stickers .sticker-set-stickers{--per-row:4}}.popup-stickers .sticker-set-stickers .media-sticker-wrapper{cursor:pointer;height:var(--item-size);justify-self:center;margin-bottom:2px;position:relative;width:var(--item-size)}@media only screen and (max-width:600px){.popup-stickers .sticker-set-stickers .media-sticker-wrapper{margin-bottom:8px}}.popup-stickers .sticker-set-stickers .media-sticker-wrapper:hover{background-color:var(--light-secondary-text-color);border-radius:12px}.popup-date-picker{-webkit-user-select:none;-moz-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-bottom:1.375rem;margin-left:6px;margin-top:4px}.popup-date-picker .popup-title{font-size:20px;font-weight:var(--font-weight-bold)}.popup-date-picker .popup-buttons{margin-right:-2px;order:2}.popup-date-picker .popup-buttons button+button{margin-left:9px;margin-top:0}.popup-date-picker .date-picker-controls{align-items:center;display:flex;justify-content:space-between}.popup-date-picker .date-picker-controls .date-picker-month-title{font-size:14px;font-weight:var(--font-weight-bold)}.popup-date-picker .date-picker-prev{transform:rotate(90deg)}.popup-date-picker .date-picker-next{transform:rotate(-90deg)}.popup-date-picker .date-picker-next:disabled,.popup-date-picker .date-picker-prev:disabled{visibility:hidden}.popup-date-picker .date-picker-months{margin-bottom:1.5rem;margin-top:7px;-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-date-picker .date-picker-month{display:grid;grid-template-columns:repeat(7,1fr);justify-content:center;width:100%}.popup-date-picker .date-picker-month .btn-icon{align-items:center;color:var(--secondary-text-color);display:flex;font-size:12px;height:38px;justify-content:center;justify-self:center;width:38px}.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:var(--primary-text-color)}.popup-date-picker .date-picker-month .btn-icon.active{background-color:var(--primary-color)!important;border-radius:50%;color:var(--badge-text-color)}.popup-schedule .popup-header{justify-content:space-between;margin-bottom:17px;margin-left:0;margin-top:5px}@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;padding:4px 16px 16px;width:420px}@media only screen and (max-width:600px){.popup-schedule .popup-container{min-width:312px;padding:4px 14px 14px;width:312px}}.popup-schedule .popup-container[data-lines=\"5\"]{top:-16px}.popup-schedule .popup-container[data-lines=\"7\"]{top:16px}.popup-schedule .date-picker-month{margin-left:2px;margin-right:-20px;width:auto}@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-size:20px;font-weight:var(--font-weight-bold);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{font-size:14px;font-weight:var(--font-weight-bold);height:36px;justify-self:auto;margin-top:-4px;width:36px}.popup-schedule .date-picker-month-date:disabled{color:#9ba3a8!important}.popup-schedule .date-picker-month-day{color:var(--primary-text-color)!important;font-size:14px!important;font-weight:var(--font-weight-bold)}.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:400}@media only screen and (max-width:600px){.popup-schedule .btn-primary{widtH:280px;height:50px;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{opacity:0!important;pointer-events:none}.popup-create-poll .input-field .btn-icon{opacity:1;position:absolute;right:.4375rem;top:.4375rem;transition:opacity .2s ease;z-index:1}@media only screen and (max-width:600px){.popup-create-poll .input-field .btn-icon{right:.3125rem;top:.3125rem}}.popup-create-poll .caption{color:var(--secondary-text-color);font-weight:var(--font-weight-bold);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{font-size:.875rem;line-height:1.2;margin-top:.875rem}.popup-create-poll .btn-primary{width:94px}.popup-create-poll .menu-send{right:20px;top:54px}.popup-create-poll hr:not(.hide){display:block!important}.popup-forward .popup-container{height:40.625rem;max-height:min(40.625rem,100%);max-width:420px;padding:7px 0 0;width:420px}.popup-forward .popup-header{flex:0 0 auto;margin-bottom:7px;padding:0 1rem}@media only screen and (max-width:600px){.popup-forward .popup-header{padding-left:.8125rem}}.popup-forward .popup-title{flex-grow:1;height:100%;padding:0}.popup-forward .chatlist-container,.popup-forward .selector{display:flex;flex:1 1 auto;flex-direction:row;height:auto;overflow:hidden;width:100%}.popup-forward .selector-search-input{font-size:var(--font-size-20);height:100%;line-height:1;padding:.5rem 1.5rem;width:100%}@media only screen and (max-width:600px){.popup-forward .selector-search-input{padding-left:1.1875rem}}.popup-forward .selector .chatlist{margin-top:0!important}.popup-forward .gradient-delimiter{display:none}.popup-forward .sidebar-left-section{margin-bottom:0!important;padding-top:0!important}.popup-instance-deactivated{background-color:rgba(0,0,0,.6)}.popup-instance-deactivated .instance-deactivated-container{margin:auto;pointer-events:none;text-align:center}.popup-instance-deactivated .header{color:#fff;font-size:2rem}.popup-instance-deactivated .subtitle{color:#fff;font-size:1.5rem;line-height:var(--line-height);opacity:.6}.popup-join-chat-invite{-webkit-user-select:none;-moz-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:var(--font-weight-bold);line-height:var(--line-height);margin:.75rem 0 .25rem}.popup-join-chat-invite .chat-participants-count{color:var(--secondary-text-color);font-size:.875rem;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;user-select:none}.popup-report-messages-confirm .media-sticker-wrapper{height:100px;margin:0 auto;position:relative;width:100px}.popup-report-messages-confirm .popup-body{margin:1rem 0 .375rem;overflow:visible;overflow:initial}.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-call .popup-header{justify-content:space-between;width:100%}.popup-call .popup-title{flex:1 1 auto}.call{align-items:center;color:#fff;height:100%;width:100%}.call.is-full-screen,html.is-mobile .call{border-radius:0}.call.is-full-screen:not(.show-controls){cursor:none}.call.no-video .call-button,.call.no-video .call-button-text,.call.no-video .call-emojis,.call.no-video .call-party-state,.call.no-video .call-subtitle,.call.no-video .call-title,.call.no-video .popup-header,.call.show-controls .call-button,.call.show-controls .call-button-text,.call.show-controls .call-emojis,.call.show-controls .call-party-state,.call.show-controls .call-subtitle,.call.show-controls .call-title,.call.show-controls .popup-header{opacity:1}.call.show-controls .call-video{opacity:.8}.call.show-controls .call-video-blur{opacity:.56}.call .popup-header .btn-icon{color:#fff}.call .popup-header .call-emojis{margin-right:1rem;transform:scale(1.3125)}.call-avatar{border-radius:inherit;bottom:0;left:0;opacity:.7;position:absolute;right:0;top:0;z-index:-1}.call-avatar .avatar-full{font-size:6rem}.call-title{font-size:1.25rem;font-weight:var(--font-weight-bold)}.call-subtitle{font-size:1rem}.call .popup-header,.call-emojis,.call-subtitle,.call-title{opacity:0}body.animation-level-2 .call .popup-header,body.animation-level-2 .call-emojis,body.animation-level-2 .call-subtitle,body.animation-level-2 .call-title{transition:opacity var(--transition-standard-in)}.call-buttons{align-items:center;align-self:center;bottom:1.75rem;display:flex;pointer-events:none;position:absolute;z-index:1}.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 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 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(var(--call-button-size)*-.5 + var(--call-button-margin)*-.5))}.call-buttons.is-second{--margin-length:2}.call-buttons.is-second .call-button,.call-buttons.is-second .call-button-text{transform:translateX(calc(var(--call-button-size)*2 + var(--call-button-margin)*var(--margin-length)))}.call.no-screen .call-buttons.is-second{--margin-length:.656875}.call-button{background-color:hsla(0,0%,100%,.1)}.call-button-red{background-color:var(--danger-color)!important}.call-button-green{background-color:var(--gc-green-text-color)!important}.call-button.active{background-color:#fff!important}.call-button.active:before{color:#9e9e9e}.call-button,.call-button-text{opacity:0}.call-video{border-radius:inherit;height:100%;-o-object-fit:contain;object-fit:contain;opacity:1;position:absolute;width:100%}.call-video-container{align-items:center;background-color:#000;bottom:0;display:flex;left:0;position:absolute;right:0;top:0;z-index:-1}.call-video-container.small{border-radius:10px;bottom:8rem;cursor:pointer;left:auto;right:1rem;top:auto;z-index:1}.call-video-blur{border-radius:inherit;height:100%;opacity:.7;position:absolute;width:100%}body.animation-level-2 .call-video,body.animation-level-2 .call-video-blur{transition:opacity var(--transition-standard-in)}.call .call-emojis{transform:scale(1.125)}.call .call-emojis .emoji{margin:0 .125rem}.call-party-states{align-items:center;bottom:calc(4.25rem + var(--call-button-size));display:flex;flex-direction:column;padding:0 1rem;pointer-events:none;position:absolute;width:100%;z-index:2}.call-party-state{align-items:center;-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);background-color:hsla(0,0%,100%,.2);border-radius:1.625rem;color:#fff;display:flex;font-size:.875rem;font-weight:var(--font-weight-bold);height:1.625rem;line-height:1.625rem;margin-top:1rem;max-width:100%;opacity:0;padding:0 .625rem;transform:scale(0) translateY(0)}body.animation-level-2 .call-party-state{transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-party-state .rlottie-icon{flex:0 0 auto;height:1.875rem!important;margin-left:-.25rem;margin-right:.25rem;width:1.875rem!important}.call-party-state.is-visible:not(.backwards){transform:scale(1) translateY(0)}.call-party-state-text,.call-title{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.call.two-button-rows .call-buttons.is-first .call-button,.call.two-button-rows .call-buttons.is-first .call-button-text{transform:translateY(calc(var(--call-button-size)*-1 + var(--call-button-margin)*-1 + -1.125rem))}.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-group-call:not(.movable-element){top:7rem}.popup-group-call:not(.movable-element) .group-call{border-bottom-left-radius:0;border-bottom-right-radius:0}.popup-group-call .popup-body{justify-content:space-between}.popup-group-call .popup-container{background-color:var(--gc-background-color);color:var(--gc-primary-text-color)}.popup-group-call .popup{z-index:6}.group-call{--call-button-margin:1.25rem;height:100%;padding:0 .5rem;width:100%}.group-call:after{background:linear-gradient(180deg,rgba(33,33,33,0) 0,rgba(33,33,33,.65) 48.54%,var(--gc-background-color) 100%);bottom:0;content:\" \";height:7.5rem;left:0;position:absolute;right:0}.group-call-header{height:3.5rem;margin-bottom:.125rem;padding:0 .5rem}.group-call-header .btn-icon{color:inherit;flex:0 0 auto}.group-call-header-info{flex:1 1 auto;margin-left:1.5rem;overflow:hidden}.group-call-header-title{font-weight:var(--font-weight-bold)}.group-call-header-subtitle,.group-call-header-title{font-size:var(--font-size-16);line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-header-subtitle{color:var(--gc-secondary-text-color);font-size:.875rem}.group-call-buttons{align-items:center;align-self:center;bottom:1.75rem;display:flex;justify-content:space-between;position:absolute;z-index:1}.group-call-button{background-color:var(--gc-button-unmuted-color);color:var(--gc-primary-text-color);opacity:1}.group-call[data-mic-state=muted] .group-call-button{background-color:var(--gc-button-muted-color)}.group-call[data-mic-state=hand] .group-call-button{background-color:var(--gc-button-hand-color)}.group-call:not(.is-big-layout)[data-mic-state=unmuted] .group-call-button{background-color:var(--gc-button-unmuted-fill-color)}.group-call-button-red{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{padding-right:.5rem}.group-call-participant-status-icon{display:inline-block;font-size:1.125rem;height:1.125rem;line-height:1;margin-right:6px;vertical-align:middle;width:1.125rem}.group-call-participant-status-container{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-participant .dialog-subtitle,.group-call-participant .dialog-title{padding-right:2.5rem}.group-call-participant-muted-icon-container{position:absolute!important;right:.5rem}.group-call-participant-video-container{align-items:center;background-color:#000;border-radius:10px;cursor:pointer;display:flex;flex:1 1 auto;height:15rem;margin:.25rem;overflow:hidden;position:relative;width:100%;width:33%}.group-call-participant-video-container:after{background:linear-gradient(180deg,transparent 55.62%,rgba(0,0,0,.5) 86.46%);bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.group-call-participant-video-container .group-call-participant-status-icon{font-size:1.25rem;height:1.25rem;width:1.25rem}.group-call-participant-video-container:after,.group-call-participant-video-header,.group-call-participant-video-info{opacity:0}body.animation-level-2 .group-call-participant-video-container:after,body.animation-level-2 .group-call-participant-video-header,body.animation-level-2 .group-call-participant-video-info{transition:opacity var(--transition-standard-in)}.group-call-participant-video-header,.group-call-participant-video-info{align-items:center;bottom:.25rem;display:flex;justify-content:space-between;left:0;padding:0 .5rem 0 .75rem;position:absolute;right:0;z-index:1}.group-call-participant-video-header{bottom:auto;justify-content:flex-end;padding-right:.75rem;padding-top:.875rem;top:0}.group-call-participant-video-header .group-call-pin-icon{font-size:1.5rem;height:1.5rem;width:1.5rem}.group-call-participant-video-info .peer-title{font-weight:var(--font-weight-bold)}.group-call-participant-video-info .peer-title,.group-call-participant-video-info-left{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-participant-video-info .group-call-participant-status-container{margin-top:-1px;opacity:.6}.group-call-participant-video-info-left{flex:1 1 auto}.group-call-participant-video-info-right{flex:0 0 auto;height:2rem;margin-left:.75rem;width:2rem}.group-call-participant .is-speaking{color:var(--gc-green-text-color)}.group-call-participant .is-waiting{color:var(--gc-blue-text-color)}.group-call-participants{border-radius:10px;flex:1 1 auto;overflow:hidden}.group-call-participants-scrollable{border-radius:inherit;height:auto;padding-bottom:6rem;position:relative}.group-call-participants-video-container{display:flex;flex-wrap:wrap;margin:-.25rem -.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=\"3\"] .group-call-participant-video-container:nth-child(n+2),.group-call-participants-video-container[data-layout=\"4\"] .group-call-participant-video-container{flex:1 0 auto;height:auto}.group-call-participants-video-container[data-layout=\"3\"] .group-call-participant-video-container:nth-child(n+2):before,.group-call-participants-video-container[data-layout=\"4\"] .group-call-participant-video-container: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-header,.group-call-participants-video-container.show-controls .group-call-participant-video-info{opacity:1}.group-call-participants .chatlist{background:none;margin:0 auto;max-width:600px;padding:0}.group-call-participants .user-title{color:var(--gc-primary-text-color)}.group-call-participants .user-last-message{color:var(--gc-secondary-text-color)}.group-call-big-video-container{position:relative}.group-call-big-video-container .group-call-participants-video-container{margin-bottom:.25rem;min-height:100%}.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,.group-call:not(.is-big-layout) .group-call-big-video-container,.group-call:not(.is-big-layout) .popup-body .group-call-header,.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:active,html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:hover{background-color:hsla(207,4%,46%,.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% - var(--gc-right-column-width))}.group-call.is-big-layout.is-right-column-shown .group-call-buttons{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{background-color:var(--gc-background-color);bottom:0;padding:inherit;position:absolute;right:calc(var(--gc-right-column-width)*-1);top:0;width:var(--gc-right-column-width)}.group-call.is-big-layout .group-call-buttons{bottom:2.5rem;padding:.75rem}body.animation-level-2 .group-call.is-big-layout .group-call-buttons{transition:opacity var(--transition-standard-in)}.group-call.is-big-layout .group-call-buttons:before{-webkit-backdrop-filter:blur(100px);backdrop-filter:blur(100px);background:rgba(0,0,0,.5);border-radius:1.25rem;bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.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 var(--transition-standard-in)}body.animation-level-2 .group-call.is-big-layout .group-call-buttons .group-call-button{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-sponsored .scrollable-y{margin:0 -1.5rem;max-height:25rem;padding:.5rem 1.5rem;position:relative;-webkit-user-select:text;-moz-user-select:text;user-select:text;width:calc(100% + 3rem)}.popup-mute .popup-container{min-width:16rem}.popup-reacted-list{--size:1.5rem;--custom-emoji-size:var(--size)}.popup-reacted-list .popup-container{height:600px;max-height:600px;padding:0;width:25rem}.popup-reacted-list .popup-header{border-bottom:1px solid var(--border-color);margin:0;min-height:3.5625rem;padding:.25rem .75rem .75rem}.popup-reacted-list .popup-close{height:40px;margin-right:.5rem;margin-top:.375rem;order:-1}.popup-reacted-list .reaction{--reaction-size:var(--size);--additional-height:.75rem;--margin:.5rem;--background-color:var(--light-filled-primary-color);--counter-color:var(--primary-color);flex:1 0 auto;justify-content:space-evenly}.popup-reacted-list .reaction.is-chosen:not(.backwards){--counter-color:#fff}.popup-reacted-list .reaction-sticker-icon{align-items:center;display:flex;font-size:1.25rem!important;margin:0}.popup-reacted-list .sidebar-left-section{margin-bottom:0!important}.popup-reacted-list .tabs-container{flex:1 1 auto;overflow:hidden}.popup-reacted-list .tabs-tab{background-color:var(--surface-color)}.popup-reacted-list .reacted-list-reaction-icon{display:flex;height:var(--size);position:absolute;right:1rem;top:50%;transform:translateY(-50%);width:var(--size)}.popup-reacted-list .chatlist-chat{padding-right:3.25rem!important}.popup-payment .popup-container{border-radius:16px;max-height:min(100%,43.5rem);max-width:26.25rem;padding:0;width:26.25rem}.popup-payment .popup-header{height:3.5rem;margin:0;padding:0 1rem}.popup-payment.is-loading .popup-container{min-height:26.25rem}.popup-payment .scrollable{display:flex;flex:1 1 auto;flex-direction:column}.popup-payment hr{display:block!important;margin:.5rem 0!important;padding:0!important}.popup-payment .input-field{--height:3rem;margin:.75rem .5rem 0}.popup-payment .input-field-input{--padding:.75rem}.popup-payment .input-fields-row .input-field{margin-top:1.25rem}.popup-payment .sidebar-left-section{padding:0!important}.popup-payment .sidebar-left-section-name+.input-field,.popup-payment .sidebar-left-section-name+.input-fields-row .input-field{margin-top:.75rem}.popup-payment .sidebar-left-section .row{margin-top:.5rem}.popup-payment .sidebar-left-section-content{margin:0 .5rem!important}.popup-payment .select-wrapper{box-shadow:var(--menu-box-shadow);max-height:10rem}.popup-payment .select-wrapper li{grid-template-columns:calc(26px + 2rem) 1fr;height:3rem}.popup-payment .payment-verification{border:none;flex:1 1 auto;height:40rem;max-height:100%;width:100%}.popup-payment .row{border-radius:10px}.payment-item{padding:0 1.25rem;width:100%}.payment-item-details{display:flex;flex:0 0 auto;justify-content:space-between;margin-bottom:1rem;overflow:hidden}.payment-item-details:last-child{margin-bottom:0}.payment-item-details-photo{border-radius:10px;flex:0 0 auto;height:6.25rem;margin-right:1rem;width:6.25rem}.payment-item-details-photo .media-photo{border-radius:inherit}.payment-item-details-lines{display:flex;flex:1 1 auto;flex-direction:column}.payment-item-details-lines-title{font-size:var(--font-size-16);font-weight:var(--font-weight-bold);line-height:var(--line-height-16)}.payment-item-details-lines-bot-name,.payment-item-details-lines-description{font-size:var(--font-size-14);line-height:1.25rem}.payment-item-details-lines-bot-name{color:var(--secondary-text-color)}.payment-item-prices{display:flex;flex-direction:column;margin:1rem .25rem .5rem}.payment-item-prices-price{color:var(--secondary-text-color);display:flex;font-weight:500;justify-content:space-between;line-height:1.1875rem}.payment-item-prices-price+.payment-item-prices-price{margin-top:1.5rem}.payment-item-prices-price.is-total{color:var(--primary-text-color)}.payment-item-tips{display:flex;justify-content:space-between;margin:.75rem -.5rem 1.5rem}.payment-item-tips-tip{--background-intensity:.1;background-color:rgba(84,190,97,var(--background-intensity));border-radius:1.25rem;color:#3ba748;flex:1 1 auto;font-size:var(--font-size-16);font-weight:var(--font-weight-bold);height:2.5rem;line-height:2.5rem;text-align:center}body.animation-level-2 .payment-item-tips-tip{transition:color .1s ease-in-out,background-color .1s ease-in-out}.payment-item-tips-tip+.payment-item-tips-tip{margin-left:.5rem}html.no-touch .payment-item-tips-tip:not(.active):active,html.no-touch .payment-item-tips-tip:not(.active):hover{--background-intensity:.3}.payment-item-tips-tip.active{--background-intensity:1;color:#fff}.payment-item-tips-input{color:inherit!important;display:inline;font-weight:inherit!important}.payment-item-row{margin:0 .5rem;padding-bottom:0;padding-top:0}.payment-item-method-row .media-photo{border-radius:10px}.payment-item-pay{flex:0 0 auto;height:3rem;margin:1rem;text-transform:uppercase;width:auto}.payment-item-preloader-container{flex:1 1 auto;position:relative}.popup-payment-shipping-methods .popup-container{min-height:auto}.popup-payment-shipping-methods .row{margin-top:0!important}.popup-payment-verification .popup-header:after{background-color:var(--border-color);bottom:-1px;content:\" \";height:1px;left:0;position:absolute;right:0}.popup-payment-card-confirmation .popup-container{min-height:auto}.popup-payment-card-confirmation .input-field-password{margin-top:.5rem!important}.popup-limit .popup-container{min-width:min(100%,22.5rem)}.popup-limit-line{align-items:center;display:flex;flex-direction:column;margin:.75rem 0}.popup-limit-hint{align-items:center;color:#fff;display:flex;font-weight:var(--font-weight-bold);justify-content:center;transform:scale(.6) translate(-280px,16px) rotate(-30deg)}body.animation-level-2 .popup-limit-hint{transition:transform .3s cubic-bezier(.12,1.1,.56,1.2)}.popup-limit-hint.active{transform:scale(1) translate(0) rotate(0)}.popup-limit-hint-icon{display:flex;font-size:1.25rem;margin-right:.25rem}.popup-limit-button.primary{align-items:center;background:linear-gradient(88.39deg,#6c93ff -2.56%,#976fff 51.27%,#df69d1 107.39%);color:#fff!important;display:flex}.popup-limit-button-icon{display:flex;font-size:1.5rem;margin-left:.625rem}.popup-limit .limit-line{align-self:stretch;margin:1rem .5rem 0}.popup-limit:not(.is-locked) .popup-limit-hint{background:linear-gradient(73.4deg,#6c93ff -7.21%,#976fff 114.57%,#df69d1 241.52%);background-size:200px 2rem;border-radius:1rem;height:2rem;padding:0 .75rem;position:relative}.popup-limit:not(.is-locked) .popup-limit-hint:after{background:inherit;background-position-x:calc(-50% - 86px);background-repeat:no-repeat;background-size:inherit;bottom:-9px;-webkit-clip-path:path(\"M0 0H26H24.4853C22.894 0 21.3679 0.632141 20.2426 1.75736L14.4142 7.58579C13.6332 8.36684 12.3668 8.36683 11.5858 7.58579L5.75736 1.75736C4.63214 0.632139 3.10602 0 1.51472 0H0Z\");clip-path:path(\"M0 0H26H24.4853C22.894 0 21.3679 0.632141 20.2426 1.75736L14.4142 7.58579C13.6332 8.36684 12.3668 8.36683 11.5858 7.58579L5.75736 1.75736C4.63214 0.632139 3.10602 0 1.51472 0H0Z\");content:\" \";display:block;height:9px;left:50%;margin-left:-13px;position:absolute;width:100%}.popup-limit.is-locked .popup-limit-hint{background-color:var(--primary-color);border-radius:1.375rem;height:2.75rem;margin-right:-.25rem;padding:0 1.25rem 0 1rem}.popup-limit.is-premium .popup-limit-hint{align-self:flex-end;background:linear-gradient(84.4deg,#6c93ff -4.85%,#976fff 51.72%,#df69d1 110.7%);background-position-x:100%;background-size:200px 2rem;border-bottom-right-radius:0;margin-right:.5rem}body.animation-level-2 .popup-limit.is-premium .popup-limit-hint{transition:transform .3s cubic-bezier(.12,1.1,.56,1.1)}.popup-limit.is-premium .popup-limit-hint:after{background-position-x:134%;bottom:-11.3px;-webkit-clip-path:path(\"M8.44528 0.5H20.5V10.1943C20.5 10.9154 19.9154 11.5 19.1943 11.5C18.8178 11.5 18.4597 11.3375 18.2117 11.0541L10.2274 1.92918C9.75146 1.38523 9.18812 0.924478 8.56057 0.565879L8.44528 0.5Z\");clip-path:path(\"M8.44528 0.5H20.5V10.1943C20.5 10.9154 19.9154 11.5 19.1943 11.5C18.8178 11.5 18.4597 11.3375 18.2117 11.0541L10.2274 1.92918C9.75146 1.38523 9.18812 0.924478 8.56057 0.565879L8.44528 0.5Z\");height:12px;left:100%;margin-left:-20.6px}#auth-pages{background:var(--surface-color);max-width:100%;overflow:hidden}#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;padding:0 16px;width:100%}}#auth-pages .auth-image,#auth-pages .input-wrapper,#auth-pages .subtitle{flex:0 0 auto}#auth-pages>.scrollable{display:flex;flex-direction:column;margin:0 auto;max-width:720px;position:relative}#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{margin:0 auto;max-width:720px;min-width:auto;position:relative}#auth-pages .tabs-container .tabs-tab{background-color:var(--surface-color)}#auth-pages .tabs-container .tabs-tab .container{display:flex;flex:1 1 auto;flex-direction:column;height:810px;padding:0;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-bottom:.5rem;margin-top:.5rem}.page-sign .auth-image,.page-signUp .auth-image{height:7.5rem;margin-bottom:1.5rem;width:7.5rem}@media only screen and (min-width:601px){.page-sign .auth-image,.page-signUp .auth-image{height:10rem;margin-bottom:1.5rem;width:10rem}}.page-authCode .phone-wrapper{flex:0 0 auto}.sign-logo{fill:var(--primary-color);max-height:100%;max-width:100%}.page-sign .btn-secondary,.page-signQR .btn-secondary{font-weight:400}.page-sign .qr,.page-signQR .qr{margin-top:1.5rem}.page-signQR{overflow:visible!important;overflow:initial!important}.page-signQR .auth-image{align-items:center;display:flex;height:240px!important;justify-content:center;width:240px!important}.page-signQR .auth-image .preloader{left:auto;top:auto;transform:none}.page-signQR .auth-image .qr-canvas{height:100%;width: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}[dir=ltr] .page-signQR .qr-description{text-align:left}[dir=rtl] .page-signQR .qr-description{text-align:right}.page-signQR .qr-description{line-height:var(--line-height);margin:1rem auto;max-width:480px}.page-signQR .qr-description li{margin-top:.5rem}.page-signUp .auth-image{margin-bottom:14px;margin-top:10px}@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 var(--transition-standard-in)}.page-authCode .auth-image{transform:translateY(12px)}.page-authCode .phone-wrapper{align-items:center;display:flex;justify-content:center;margin:1.375rem 0 .875rem}.page-authCode .phone-wrapper h4[contenteditable]{border:none;border-bottom:2px solid var(--primary-color);outline:none;padding:0 1rem}.page-authCode .phone-wrapper .phone.error{border-color:var(--danger-color)!important}.page-authCode .phone-wrapper .phone{margin:0}.page-authCode .subtitle{margin:0 auto!important;max-width:300px}.page-chats{display:flex;max-width:1682px!important}.page-chats .avatar-edit .tgico-cameraadd{top:52%}.page-chats #main-columns{height:100%;max-height:100%;min-height:100%;overflow:hidden;position:relative;width:100%}@media only screen and (max-width:600px){.page-chats .main-column{display:flex!important;width:100%;z-index:1}}@media only screen and (min-width:601px){.page-chats #column-center{background-color:#e6ebee;display:flex!important;width:100%}.page-chats #column-right{display:flex!important}.page-chats .main-column{height:100%;max-height:100%;min-height:100%;position:relative}.page-chats #main-columns{display:flex}}.page-chats #search-container,.page-chats .sidebar-search{flex-direction:column;height:100%;left:0;max-height:100%;overflow:hidden;position:absolute;top:0;width:100%;z-index:3}@media only screen and (min-width:1681px){.page-chats{border-color:var(--border-color);border-style:solid;border-width:0 1px}}.page-chats .avatar-edit{flex:0 0 auto;height:120px;margin:1rem auto 2rem;width:120px}body.animation-level-2 .page-chats .main-column{transition:transform var(--tabs-transition),filter var(--tabs-transition)}body,html{height:100%;margin:0;overflow:hidden;padding:0;width:100%}@media only screen and (max-width:600px){body,html{height:calc(var(--vh, 1vh)*100)}}html.is-ios{-webkit-touch-callout:none;position:fixed;-webkit-user-select:none}html.no-backdrop{--menu-background-color:var(--surface-color);--menu-backdrop-filter:none}@supports(padding:max(0px)){html{padding:0 min(16px,env(safe-area-inset-right)) 0 min(16px,env(safe-area-inset-left))}}html{-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);font-size:16px}body{background-color:var(--body-background-color);color:var(--primary-text-color)}body.deactivated{animation:grayscale-in var(--transition-standard-in) forwards}body.deactivated-backwards{animation:grayscale-out var(--transition-standard-out) forwards}@keyframes grayscale-in{0%{filter:grayscale(0)}to{filter:grayscale(1)}}@keyframes grayscale-out{0%{filter:grayscale(1)}to{filter:grayscale(0)}}a{color:var(--link-color)}button,html,input,optgroup,select,textarea{font-family:Roboto,-apple-system,apple color emoji,BlinkMacSystemFont,Segoe UI,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif}a,button,div,input,select,textarea{-webkit-tap-highlight-color:rgba(0,0,0,0)}code,kbd,pre,samp{font-family:var(--font-monospace)}.whole{height:100%;margin:0 auto;max-width:1680px;min-height:100%;width: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:var(--font-weight-bold)}h4{font-size:2rem;line-height:110%;margin:22px 0 14px}@media only screen and (max-width:600px){h4{font-size:20px;margin:2px 0 8px}}[contenteditable=true],input{background-color:transparent;caret-color:var(--primary-color);color:var(--primary-text-color)}input,textarea{-webkit-appearance:none}input::-webkit-contacts-auto-fill-button,input::-webkit-credentials-auto-fill-button{position:absolute;right:0;visibility:hidden}input:-webkit-autofill:first-line{font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,Helvetica Neue,Arial;font-size:16px}.subtitle{color:var(--secondary-text-color);line-height:1.35}.danger{color:var(--danger-color)!important}.danger .c-ripple__circle{background-color:var(--light-danger-color)}.blue,.primary{color:var(--primary-color)!important}.blue .c-ripple__circle,.primary .c-ripple__circle{background-color:var(--light-primary-color)}.primary-text{color:var(--primary-text-color)!important}.color-premium{-webkit-text-fill-color:transparent;background:var(--premium-gradient);-webkit-background-clip:text}.blue:before,.danger:before,.primary:before{color:inherit!important}.bg-warning{background:#fed85a!important}.contextmenu{bottom:auto!important;position:fixed!important;right:auto!important;width:auto!important;z-index:4!important}.preloader{height:50px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:50px}.preloader .preloader-path{stroke:var(--primary-color)}@keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-in-backwards-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-out-backwards-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}.toast{-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);background-color:rgba(0,0,0,.66);border-radius:10px;color:#fff;font-size:1rem;left:50%;max-width:min(30rem,calc(100vw - 2rem));opacity:0;padding:.5rem 1rem;position:fixed;top:50%;transform:translate(-50%,-50%);z-index:5}.toast.is-visible{opacity:1}body.animation-level-2 .toast{transition:opacity var(--transition-standard-in)}.toast b{color:inherit}.toast a{color:#60a5e9!important;cursor:pointer}hr{border:none;border-top:1px solid var(--border-color);margin:0;padding-bottom:.5rem;width:100%}b{font-weight:var(--font-weight-bold)}.avatar-edit{border-radius:50%;cursor:pointer;overflow:hidden;position:relative}.avatar-edit.is-forum{border-radius:var(--avatar-border-radius-forum)}.avatar-edit-canvas{background:linear-gradient(var(--avatar-color-top),var(--avatar-color-bottom));height:100%;max-height:100%;max-width:100%;width:100%}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{color:#fff;font-size:3rem;height:3rem;left:50%;line-height:1;position:absolute;top:50%;transform:translateY(-50%) translateX(-50%);width:3rem;z-index:2}.avatar-edit .avatar-placeholder{filter:brightness(.7);height:100%;left:0;position:absolute;top:0;width:100%}.missing-icon{height:1.5rem;width:1.5rem}.missing-icon-path{fill:currentColor}.select-wrapper{background-color:var(--surface-color);border-radius:10px;display:flex;flex-direction:column;flex-wrap:wrap;left:0;max-height:23.5rem;opacity:0;overflow:hidden;position:absolute;top:calc(100% + .5rem);transform:scale(.95);transform-origin:top center;transition:opacity .2s ease-out,transform .2s ease-out;width:100%;z-index:3}.select-wrapper.active{opacity:1;transform:scale(1)}.select-wrapper ul{margin:.5rem 0}[dir=ltr] .select-wrapper li{text-align:left}[dir=rtl] .select-wrapper li{text-align:right}.select-wrapper li{align-items:center;cursor:pointer;display:grid;grid-template-columns:calc(26px + 2rem) 1fr 80px;height:3.5rem;justify-content:space-between;padding:0 1rem}html.no-touch .select-wrapper li:active,html.no-touch .select-wrapper li:hover{background-color:var(--light-secondary-text-color)}.select-wrapper .emoji{font-size:26px;height:26px;line-height:1;width:26px}.select-wrapper .scrollable{position:relative}[dir=ltr] .phone-code{text-align:right}[dir=rtl] .phone-code{text-align:left}.phone-code{color:#9e9e9e}.auth-image{height:166px;margin:0 auto 18px;position:relative;width:166px}@media only screen and (max-width:600px){.auth-image{height:120px;width:120px}}[dir=ltr] .phone-edit{margin-left:.4rem}[dir=rtl] .phone-edit{margin-right:.4rem}.phone-edit{cursor:pointer;font-size:1.5rem;height:1.5rem;line-height:1;opacity:.5;transition:opacity .2s;width:1.5rem}html.no-touch .phone-edit:active,html.no-touch .phone-edit:hover{opacity:1}span.emoji{display:inline!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;vertical-align:baseline!important;vertical-align:initial!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[dir=ltr]:not(.is-safari) span.emoji{margin-right:5px!important}html[dir=rtl]:not(.is-safari) span.emoji{margin-left:5px!important}html[dir=ltr]:not(.is-safari) avatar-element span.emoji{margin-right:0!important}html[dir=rtl]:not(.is-safari) avatar-element span.emoji{margin-left:0!important}}img.emoji{display:inline-block;height:18px;max-height:100%;max-width:100%;vertical-align:middle;width:18px}[contenteditable=true]{cursor:text;outline:none;-webkit-user-select:text;-moz-user-select:text;user-select:text;white-space:pre-wrap}[contenteditable=true] .custom-emoji{display:inline-block;margin-bottom:-2px}[contenteditable=true] .custom-emoji:before{content:none}[contenteditable=true] [style*=markup]{font-family:inherit!important}[contenteditable=true] [style*=bold]{font-weight:700}[contenteditable=true] [style*=italic]{font-style:italic}[contenteditable=true] [style*=underline]{text-decoration-line:underline}[contenteditable=true] [style*=strikethrough]{text-decoration-line:line-through}[contenteditable=true] [style*=underline][style*=strikethrough]{text-decoration-line:underline line-through}[contenteditable=true] [style*=monospace]{font-family:var(--font-monospace)!important}[contenteditable=true] [style*=spoiler]{background-color:var(--spoiler-draft-background-color)}[contenteditable][data-placeholder]:before{color:#a2acb4;content:attr(data-placeholder);display:block;opacity:0;pointer-events:none;position:absolute}body.animation-level-2 [contenteditable][data-placeholder]:before{transform:translateX(1.75rem);transition:opacity var(--input-transition) .01s,transform var(--input-transition) .01s}[contenteditable][data-placeholder]:empty:before{opacity:1}body.animation-level-2 [contenteditable][data-placeholder]:empty:before{transform:translateX(0)}.sticky_sentinel{left:0;pointer-events:none;position:absolute;right:0;visibility:hidden}.super-stickers{display:grid;grid-template-columns:repeat(auto-fill,var(--esg-sticker-size));justify-content:space-between;width:100%}html.no-touch .super-sticker:active,html.no-touch .super-sticker:hover{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{cursor:pointer;padding-bottom:13px;padding-top:13px;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (min-width:601px){[dir=ltr] .show-more{padding-left:8px}[dir=rtl] .show-more{padding-right:8px}}[dir=ltr] .show-more .tgico-down{padding-left:1rem;padding-right:2rem}[dir=rtl] .show-more .tgico-down{padding-left:2rem;padding-right:1rem}.show-more .tgico-down{float:left;font-size:24px}.content-empty,.show-more .tgico-down{color:var(--secondary-text-color)}::-moz-selection{background:var(--selection-background-color)}.selection:after,::selection{background:var(--selection-background-color)}.selection:after{bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.input-something{display:inline-block}.input-selectable{position:relative}@keyframes grow-icon{0%{opacity:.8;transform:scale(.5)}50%{opacity:1;transform:scale(1.1)}to{transform:scale(1)}}@keyframes hide-icon{0%{opacity:.4;transform:scale(1)}to{opacity:0;transform:scale(.5)}}.popup-disable-password .popup-description,.popup-skip-email .popup-description{max-width:284px}.grid{grid-gap:.25rem;display:grid;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr);width:100%}.grid-item{cursor:pointer;height:0;padding-bottom:100%;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.grid-item-media{height:100%;left:0;-o-object-fit:cover;object-fit:cover;position:absolute;top:0;width:100%}.animated-super-row{--translateY:100%;bottom:0;left:0;position:absolute;right:0;top:0;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{bottom:0;left:0;position:absolute;right:0;top:0}middle-ellipsis-element{display:block;overflow:hidden;width:100%}.album-item-media{height:100%;width:100%}html.no-touch .hover-effect:active,html.no-touch .hover-effect:hover{background-color:var(--light-secondary-text-color)}.progress-ring{left:0;pointer-events:none;position:absolute;top:0}.progress-ring__circle{stroke-linecap:round;transition:stroke-dashoffset}.rlottie,.rlottie-vector{bottom:0;height:100%;left:0;max-height:100%;max-width:100%;position:absolute;right:0;top:0;width:100%}.rlottie-icon{pointer-events:none;position:relative}body.animation-level-2 .rlottie.fade-in{animation:fade-in-opacity .2s ease-in-out forwards}.rlottie-vector{fill:rgba(0,0,0,.08)}.canvas-thumbnail{height:100%;position:absolute;width:100%}.media-container-contain{position:relative}.media-container-contain .media-photo{max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain}.media-container-cover{position:relative}.media-container-cover .media-photo{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.media-photo,.media-poster,.media-round,.media-sticker,.media-video{bottom:0;left:0;position:absolute;right:0;top:0}body.animation-level-2 .media-photo.fade-in,body.animation-level-2 .media-poster.fade-in,body.animation-level-2 .media-round.fade-in,body.animation-level-2 .media-sticker.fade-in,body.animation-level-2 .media-video.fade-in{animation:fade-in-opacity .2s ease-in-out forwards}body.animation-level-2 .media-photo.fade-out,body.animation-level-2 .media-poster.fade-out,body.animation-level-2 .media-round.fade-out,body.animation-level-2 .media-sticker.fade-out,body.animation-level-2 .media-video.fade-out{animation:fade-out-opacity .2s ease-in-out forwards}.media-video{z-index:1}.media-sticker{height:100%;margin:auto;max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain;width:100%}.media-sticker-wrapper.is-premium-sticker:before{align-items:center;background:rgba(0,0,0,.2);background-image:var(--lock-url);background-repeat:no-repeat;background-size:cover;border-radius:50%;bottom:.125rem;color:#fff;display:flex;height:1.25rem;justify-content:center;left:50%;position:absolute;transform:translateX(-50%);width:1.25rem;z-index:1}body.is-premium .media-sticker-wrapper.is-premium-sticker:after,body.is-premium .media-sticker-wrapper.is-premium-sticker:before{content:none}.media-round{max-height:var(--round-video-size);max-width:var(--round-video-size);z-index:1}.media-round canvas{border-radius:50%;height:100%;position:relative;width:100%}.media-round .video-time{background-color:var(--message-highlightning-color)!important;padding:0 .375rem}[dir=ltr] .media-round .video-time:after,[dir=ltr] .media-round .video-time:before{margin-left:.25rem}[dir=rtl] .media-round .video-time:after,[dir=rtl] .media-round .video-time:before{margin-right:.25rem}.media-round.is-unread .video-time:before{background-color:#fff;border-radius:50%;content:\" \";height:.5rem;order:1;width:.5rem}.media-round.is-paused .video-time:after{align-items:center;content:\"๎ฆƒ\";display:flex;font-size:1.125rem;order:2}.gradient-delimiter{background-color:var(--background-color-true);height:.75rem;position:relative;width:100%}.gradient-delimiter:before{background:linear-gradient(180deg,rgba(0,0,0,.06),transparent 20%,transparent 94%,rgba(0,0,0,.06));bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.sidebar-left-section{background-color:var(--surface-color);box-shadow:0 1px 3px 0 var(--section-box-shadow-color);margin-bottom:.75rem;padding:.5rem 0!important}.sidebar-left-section.no-shadow{box-shadow:none!important}.sidebar-left-section-name{padding:.5rem 1rem}.sidebar-left-section-caption{font-size:var(--font-size-14);line-height:var(--line-height-14);margin:-.1875rem 0 1rem;padding:0 1.5rem}.sidebar-left-section-caption:first-child{margin-bottom:.8125rem;margin-top:.8125rem}@media only screen and (max-width:600px){.sidebar-left-section-caption{padding:0 1rem}}.sidebar-left-section-container{-webkit-user-select:none;-moz-user-select:none;user-select:none}.sidebar-left-section-container a{cursor:pointer}hr{display:none!important}.tgico-admin:before,.tgico-fontsize:before{font-size:20px!important;padding:2px}.tgico-endcall_filled,.tgico-phone_filled{font-size:26px!important}.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}.navigable-list .active{background-color:var(--light-secondary-text-color);border-radius:inherit}.super-emojis{--esg-emoji-total-size:calc(var(--esg-emoji-size) + 0.5rem);--custom-emoji-size:var(--esg-emoji-size);grid-column-gap:2.44px;--esg-emoji-size:2.125rem;--esg-emoji-total-size:2.625rem;--custom-emoji-size:2.25rem;-moz-column-gap:2.44px;column-gap:2.44px;-moz-column-gap:.25rem;column-gap:.25rem;display:grid;font-size:var(--esg-emoji-size);grid-template-columns:repeat(auto-fill,var(--esg-emoji-total-size));justify-content:space-between;line-height:var(--esg-emoji-size);position:relative}.super-emojis .super-emoji{border-radius:8px;cursor:pointer;display:inline-block;height:var(--esg-emoji-total-size);line-height:inherit;margin-left:.0625rem;margin-right:.0625rem;padding:.25rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;width:var(--esg-emoji-total-size)}.super-emojis .super-emoji .emoji-placeholder{background-color:var(--light-secondary-text-color);border-radius:50%;height:1.75rem;left:7px;pointer-events:none;position:absolute;top:7px;width:1.75rem}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{height:100%;margin:0;vertical-align:baseline;vertical-align:initial;width:100%}.super-emojis .super-emoji.active,html.no-touch .super-emojis .super-emoji:active,html.no-touch .super-emojis .super-emoji:hover{background-color:var(--light-secondary-text-color)}.super-emojis.not-local .super-emoji{padding:.1875rem}.super-emojis .super-emoji{margin:0}.super-emojis:not(.not-local) .super-emoji{overflow:hidden}html.native-emoji .super-emojis:not(.not-local) .super-emoji{padding-bottom:.3125rem;padding-top:.3125rem}.super-emojis .custom-emoji{display:block}.super-emojis .custom-emoji-renderer{z-index:1}.super-emojis .custom-emoji:before{content:none}.tgico-char:before{font-family:Roboto!important;font-weight:var(--font-weight-bold);text-align:center;width:1.5rem}.tgico-char.z:before{content:\"Z\"}.tgico-char.w:before{content:\"W\"}.sending-status:empty{display:none}.sending-status .tgico-sendingerror{color:var(--danger-color)}.sending-status-icon{line-height:1!important;position:absolute}.quick-reaction-title{align-items:center;display:flex}.quick-reaction-sticker{height:32px!important;margin:0 .5rem 0 0!important;position:relative!important;width:32px!important}.verified-icon-svg{height:1rem;width:1rem}.verified-icon-check{fill:#fff}.verified-icon-background{fill:var(--primary-color)}[dir=ltr] .emoji-status,[dir=ltr] .premium-icon,[dir=ltr] .verified-icon{margin-left:.125rem}[dir=rtl] .emoji-status,[dir=rtl] .premium-icon,[dir=rtl] .verified-icon{margin-right:.125rem}.emoji-status,.premium-icon,.verified-icon{align-items:center;display:flex;flex:0 0 auto;font-size:1rem;height:1.25rem;justify-content:center;width:1.25rem}[dir=ltr] .emoji-status{margin-left:.25rem}[dir=rtl] .emoji-status{margin-right:.25rem}.emoji-status{height:1.125rem;position:relative;width:1.125rem}.premium-icon{color:var(--primary-color);margin-top:-.0625rem}.badge-fake{border:1px solid var(--danger-color);border-radius:.185rem;color:var(--danger-color);flex:0 0 auto;font-size:.625rem;font-weight:var(--font-weight-bold);line-height:1!important;margin-left:.25rem;margin-right:.25rem;padding:.125rem .25rem}.peer-title.with-icons{align-items:center;display:flex;overflow:hidden}.peer-title-inner{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.limit-line{display:flex;font-weight:var(--font-weight-bold);height:2rem}.limit-line-free{color:#000}.limit-line-premium{color:#fff}.limit-line-free{background-color:#f1f3f5;border-bottom-left-radius:10px;border-top-left-radius:10px}.limit-line-premium{background:linear-gradient(84.4deg,#6c93ff -4.85%,#976fff 51.72%,#df69d1 110.7%);border-bottom-right-radius:10px;border-top-right-radius:10px}.limit-line-free,.limit-line-premium{align-items:center;display:flex;flex:1 1 0;justify-content:space-between;padding:0 .75rem}.movable-element{--size:.5rem;position:relative}.movable-element-resize-handler{position:absolute}.movable-element-resize-handler-side-n,.movable-element-resize-handler-side-s{cursor:row-resize;height:var(--size);left:0;right:0}.movable-element-resize-handler-side-e,.movable-element-resize-handler-side-w{bottom:0;cursor:col-resize;top:0;width:var(--size)}.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-ne,.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-se,.movable-element-resize-handler-side-sw{height:var(--size);width: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-nw,.movable-element-resize-handler-side-se{cursor:nwse-resize}.movable-element-resize-handler-side-ne{right:0;top:0}.movable-element-resize-handler-side-se{bottom:0;right:0}.movable-element-resize-handler-side-sw{bottom:0;left:0}.movable-element-resize-handler-side-nw{left:0;top:0}[dir=ltr] .chatlist-chat.row-with-padding{padding-left:4.5rem!important}[dir=rtl] .chatlist-chat.row-with-padding{padding-right:4.5rem!important}.chatlist-chat span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chatlist-chat .row-title{font-size:var(--font-size-16)!important;line-height:1.375rem}.chatlist-chat .row-title-right-secondary{font-size:var(--font-size-12)!important;line-height:var(--line-height-12)!important;margin-top:-.4375rem}.chatlist-chat .row-subtitle{display:block!important}.chatlist-chat .row-row{height:1.375rem}.chatlist-chat.chatlist-chat-abitbigger .row-subtitle{margin-top:0}.chatlist-chat.chatlist-chat-bigger .row-subtitle{font-size:var(--font-size-16)!important;line-height:1.375rem;margin-top:0}.chatlist-chat.chatlist-chat-bigger .row-subtitle-row{margin-top:.125rem}.chatlist-chat.chatlist-chat-bigger .row-title .peer-title{font-weight:var(--font-weight-bold)}.username-purchase-help b{color:var(--danger-color)!important;font-weight:var(--font-weight-normal)!important}.media-spoiler-container{border-radius:inherit;bottom:0;left:0;position:absolute;right:0;top:0;z-index:1}.media-spoiler-container.is-revealing{opacity:1}.media-spoiler-container.is-revealing:not(.backwards){opacity:0}.media-spoiler-container.is-revealing.animating{transition:opacity var(--transition-standard-out)}.media-spoiler .canvas-thumbnail,.media-spoiler-thumbnail{height:100%;-o-object-fit:initial!important;object-fit:fill!important;position:absolute;width:100%}"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/public/mtproto.worker.e3a23c58261a5160e0d7.chunk.js b/public/mtproto.worker.5211e33b3f0c47c582c8.chunk.js similarity index 99% rename from public/mtproto.worker.e3a23c58261a5160e0d7.chunk.js rename to public/mtproto.worker.5211e33b3f0c47c582c8.chunk.js index 8aeb7c5f..1db25e25 100644 --- a/public/mtproto.worker.e3a23c58261a5160e0d7.chunk.js +++ b/public/mtproto.worker.5211e33b3f0c47c582c8.chunk.js @@ -1,2 +1,2 @@ -(()=>{"use strict";var e,t,a={410:(e,t,a)=>{a.d(t,{GO:()=>n,ZP:()=>i});const s=a(1267).Z.debug,n="undefined"!=typeof window?window:self,i=s},3447:(e,t,a)=>{a.d(t,{Z:()=>i});const s={14:{"1f6dd":4867,"1f6de":4916,"1f6df":4923,"1f7f0":62832,"1f979":183,"1f9cc":1557,"1fa7b":61332,"1fa7c":61330,"1faa9":51093,"1faaa":61364,"1faab":61189,"1faac":51085,"1fab7":2651,"1fab8":2631,"1fab9":2672,"1faba":2673,"1fac3":1520,"1fac4":1521,"1fac5":1505,"1fad7":3793,"1fad8":3707,"1fad9":3804,"1fae0":111,"1fae1":136,"1fae2":132,"1fae3":133,"1fae4":174,"1fae5":142,"1fae6":1385,"1fae7":61353,"1faf0":1341,"1faf1":1332,"1faf2":1333,"1faf3":1334,"1faf4":1335,"1faf5":1351,"1faf6":1360,"1faf1-1f3fb-200d-1faf2-1f3fc":0,"1faf1-1f3fb-200d-1faf2-1f3fd":0,"1faf1-1f3fb-200d-1faf2-1f3fe":0,"1faf1-1f3fb-200d-1faf2-1f3ff":0,"1faf1-1f3fc-200d-1faf2-1f3fb":0,"1faf1-1f3fc-200d-1faf2-1f3fd":0,"1faf1-1f3fc-200d-1faf2-1f3fe":0,"1faf1-1f3fc-200d-1faf2-1f3ff":0,"1faf1-1f3fd-200d-1faf2-1f3fb":0,"1faf1-1f3fd-200d-1faf2-1f3fc":0,"1faf1-1f3fd-200d-1faf2-1f3fe":0,"1faf1-1f3fd-200d-1faf2-1f3ff":0,"1faf1-1f3fe-200d-1faf2-1f3fb":0,"1faf1-1f3fe-200d-1faf2-1f3fc":0,"1faf1-1f3fe-200d-1faf2-1f3fd":0,"1faf1-1f3fe-200d-1faf2-1f3ff":0,"1faf1-1f3ff-200d-1faf2-1f3fb":0,"1faf1-1f3ff-200d-1faf2-1f3fc":0,"1faf1-1f3ff-200d-1faf2-1f3fd":0,"1faf1-1f3ff-200d-1faf2-1f3fe":0,"1fac3-1f3fb":0,"1fac3-1f3fc":0,"1fac3-1f3fd":0,"1fac3-1f3fe":0,"1fac3-1f3ff":0,"1fac4-1f3fb":0,"1fac4-1f3fc":0,"1fac4-1f3fd":0,"1fac4-1f3fe":0,"1fac4-1f3ff":0,"1fac5-1f3fb":0,"1fac5-1f3fc":0,"1fac5-1f3fd":0,"1fac5-1f3fe":0,"1fac5-1f3ff":0,"1faf0-1f3fb":0,"1faf0-1f3fc":0,"1faf0-1f3fd":0,"1faf0-1f3fe":0,"1faf0-1f3ff":0,"1faf1-1f3fb":0,"1faf1-1f3fc":0,"1faf1-1f3fd":0,"1faf1-1f3fe":0,"1faf1-1f3ff":0,"1faf2-1f3fb":0,"1faf2-1f3fc":0,"1faf2-1f3fd":0,"1faf2-1f3fe":0,"1faf2-1f3ff":0,"1faf3-1f3fb":0,"1faf3-1f3fc":0,"1faf3-1f3fd":0,"1faf3-1f3fe":0,"1faf3-1f3ff":0,"1faf4-1f3fb":0,"1faf4-1f3fc":0,"1faf4-1f3fd":0,"1faf4-1f3fe":0,"1faf4-1f3ff":0,"1faf5-1f3fb":0,"1faf5-1f3fc":0,"1faf5-1f3fd":0,"1faf5-1f3fe":0,"1faf5-1f3ff":0,"1faf6-1f3fb":0,"1faf6-1f3fc":0,"1faf6-1f3fd":0,"1faf6-1f3fe":0,"1faf6-1f3ff":0},"":{2049:62835,2122:62863,2139:62888,2194:62764,2195:62763,2196:62762,2197:62756,2198:62758,2199:62760,2328:61194,2600:4990,2601:4998,2602:41013,2603:41018,2604:41020,2611:62851,2614:41014,2615:3781,2618:2667,2620:1106,2622:62753,2623:62754,2626:62783,2638:62780,2639:177,2648:62788,2649:62789,2650:62796,2651:62797,2652:62798,2653:62799,2660:51095,2663:51098,2665:51096,2666:51097,2668:4865,2692:61297,2693:4922,2694:61300,2696:61311,2697:61319,2699:61309,2702:61284,2705:62850,2708:4931,2709:61245,2712:61259,2714:62852,2716:62828,2721:62779,2728:51029,2733:62858,2734:62859,2744:41017,2747:62860,2753:62836,2754:62837,2755:62838,2757:62839,2763:1137,2764:1141,2795:62829,2796:62830,2797:62831,2934:62767,2935:62768,3030:62840,3297:62912,3299:62913,"0023-20e3":62864,"002a-20e3":62865,"0030-20e3":62866,"0031-20e3":62867,"0032-20e3":62868,"0033-20e3":62869,"0034-20e3":62870,"0035-20e3":62871,"0036-20e3":62872,"0037-20e3":62873,"0038-20e3":62874,"0039-20e3":62875,"00a9":62861,"00ae":62862,"1f004":51101,"1f0cf":51100,"1f170":62882,"1f171":62884,"1f17e":62893,"1f17f":62895,"1f18e":62883,"1f191":62885,"1f192":62886,"1f193":62887,"1f194":62889,"1f195":62891,"1f196":62892,"1f197":62894,"1f198":62896,"1f199":62897,"1f19a":62898,"1f1e6-1f1e8":71594,"1f1e6-1f1e9":71595,"1f1e6-1f1ea":71596,"1f1e6-1f1eb":71597,"1f1e6-1f1ec":71598,"1f1e6-1f1ee":71599,"1f1e6-1f1f1":71600,"1f1e6-1f1f2":71601,"1f1e6-1f1f4":71602,"1f1e6-1f1f6":71603,"1f1e6-1f1f7":71604,"1f1e6-1f1f8":71605,"1f1e6-1f1f9":71606,"1f1e6-1f1fa":71607,"1f1e6-1f1fc":71608,"1f1e6-1f1fd":71609,"1f1e6-1f1ff":71610,"1f1e7-1f1e6":71611,"1f1e7-1f1e7":71612,"1f1e7-1f1e9":71613,"1f1e7-1f1ea":71614,"1f1e7-1f1eb":71615,"1f1e7-1f1ec":71616,"1f1e7-1f1ed":71617,"1f1e7-1f1ee":71618,"1f1e7-1f1ef":71619,"1f1e7-1f1f1":71620,"1f1e7-1f1f2":71621,"1f1e7-1f1f3":71622,"1f1e7-1f1f4":71623,"1f1e7-1f1f6":71624,"1f1e7-1f1f7":71625,"1f1e7-1f1f8":71626,"1f1e7-1f1f9":71627,"1f1e7-1f1fb":71628,"1f1e7-1f1fc":71629,"1f1e7-1f1fe":71630,"1f1e7-1f1ff":71631,"1f1e8-1f1e6":71632,"1f1e8-1f1e8":71633,"1f1e8-1f1e9":71634,"1f1e8-1f1eb":71635,"1f1e8-1f1ec":71636,"1f1e8-1f1ed":71637,"1f1e8-1f1ee":71638,"1f1e8-1f1f0":71639,"1f1e8-1f1f1":71640,"1f1e8-1f1f2":71641,"1f1e8-1f1f3":71642,"1f1e8-1f1f4":71643,"1f1e8-1f1f5":71644,"1f1e8-1f1f7":71645,"1f1e8-1f1fa":71646,"1f1e8-1f1fb":71647,"1f1e8-1f1fc":71648,"1f1e8-1f1fd":71649,"1f1e8-1f1fe":71650,"1f1e8-1f1ff":71651,"1f1e9-1f1ea":71652,"1f1e9-1f1ec":71653,"1f1e9-1f1ef":71654,"1f1e9-1f1f0":71655,"1f1e9-1f1f2":71656,"1f1e9-1f1f4":71657,"1f1e9-1f1ff":71658,"1f1ea-1f1e6":71659,"1f1ea-1f1e8":71660,"1f1ea-1f1ea":71661,"1f1ea-1f1ec":71662,"1f1ea-1f1ed":71663,"1f1ea-1f1f7":71664,"1f1ea-1f1f8":71665,"1f1ea-1f1f9":71666,"1f1ea-1f1fa":71667,"1f1eb-1f1ee":71668,"1f1eb-1f1ef":71669,"1f1eb-1f1f0":71670,"1f1eb-1f1f2":71671,"1f1eb-1f1f4":71672,"1f1eb-1f1f7":71673,"1f1ec-1f1e6":71674,"1f1ec-1f1e7":71675,"1f1ec-1f1e9":71676,"1f1ec-1f1ea":71677,"1f1ec-1f1eb":71678,"1f1ec-1f1ec":71679,"1f1ec-1f1ed":71680,"1f1ec-1f1ee":71681,"1f1ec-1f1f1":71682,"1f1ec-1f1f2":71683,"1f1ec-1f1f3":71684,"1f1ec-1f1f5":71685,"1f1ec-1f1f6":71686,"1f1ec-1f1f7":71687,"1f1ec-1f1f8":71688,"1f1ec-1f1f9":71689,"1f1ec-1f1fa":71690,"1f1ec-1f1fc":71691,"1f1ec-1f1fe":71692,"1f1ed-1f1f0":71693,"1f1ed-1f1f2":71694,"1f1ed-1f1f3":71695,"1f1ed-1f1f7":71696,"1f1ed-1f1f9":71697,"1f1ed-1f1fa":71698,"1f1ee-1f1e8":71699,"1f1ee-1f1e9":71700,"1f1ee-1f1ea":71701,"1f1ee-1f1f1":71702,"1f1ee-1f1f2":71703,"1f1ee-1f1f3":71704,"1f1ee-1f1f4":71705,"1f1ee-1f1f6":71706,"1f1ee-1f1f7":71707,"1f1ee-1f1f8":71708,"1f1ee-1f1f9":71709,"1f1ef-1f1ea":71710,"1f1ef-1f1f2":71711,"1f1ef-1f1f4":71712,"1f1ef-1f1f5":71713,"1f1f0-1f1ea":71714,"1f1f0-1f1ec":71715,"1f1f0-1f1ed":71716,"1f1f0-1f1ee":71717,"1f1f0-1f1f2":71718,"1f1f0-1f1f3":71719,"1f1f0-1f1f5":71720,"1f1f0-1f1f7":71721,"1f1f0-1f1fc":71722,"1f1f0-1f1fe":71723,"1f1f0-1f1ff":71724,"1f1f1-1f1e6":71725,"1f1f1-1f1e7":71726,"1f1f1-1f1e8":71727,"1f1f1-1f1ee":71728,"1f1f1-1f1f0":71729,"1f1f1-1f1f7":71730,"1f1f1-1f1f8":71731,"1f1f1-1f1f9":71732,"1f1f1-1f1fa":71733,"1f1f1-1f1fb":71734,"1f1f1-1f1fe":71735,"1f1f2-1f1e6":71736,"1f1f2-1f1e8":71737,"1f1f2-1f1e9":71738,"1f1f2-1f1ea":71739,"1f1f2-1f1eb":71740,"1f1f2-1f1ec":71741,"1f1f2-1f1ed":71742,"1f1f2-1f1f0":71743,"1f1f2-1f1f1":71744,"1f1f2-1f1f2":71745,"1f1f2-1f1f3":71746,"1f1f2-1f1f4":71747,"1f1f2-1f1f5":71748,"1f1f2-1f1f6":71749,"1f1f2-1f1f7":71750,"1f1f2-1f1f8":71751,"1f1f2-1f1f9":71752,"1f1f2-1f1fa":71753,"1f1f2-1f1fb":71754,"1f1f2-1f1fc":71755,"1f1f2-1f1fd":71756,"1f1f2-1f1fe":71757,"1f1f2-1f1ff":71758,"1f1f3-1f1e6":71759,"1f1f3-1f1e8":71760,"1f1f3-1f1ea":71761,"1f1f3-1f1eb":71762,"1f1f3-1f1ec":71763,"1f1f3-1f1ee":71764,"1f1f3-1f1f1":71765,"1f1f3-1f1f4":71766,"1f1f3-1f1f5":71767,"1f1f3-1f1f7":71768,"1f1f3-1f1fa":71769,"1f1f3-1f1ff":71770,"1f1f4-1f1f2":71771,"1f1f5-1f1e6":71772,"1f1f5-1f1ea":71773,"1f1f5-1f1eb":71774,"1f1f5-1f1ec":71775,"1f1f5-1f1ed":71776,"1f1f5-1f1f0":71777,"1f1f5-1f1f1":71778,"1f1f5-1f1f2":71779,"1f1f5-1f1f3":71780,"1f1f5-1f1f7":71781,"1f1f5-1f1f8":71782,"1f1f5-1f1f9":71783,"1f1f5-1f1fc":71784,"1f1f5-1f1fe":71785,"1f1f6-1f1e6":71786,"1f1f7-1f1ea":71787,"1f1f7-1f1f4":71788,"1f1f7-1f1f8":71789,"1f1f7-1f1fa":71790,"1f1f7-1f1fc":71791,"1f1f8-1f1e6":71792,"1f1f8-1f1e7":71793,"1f1f8-1f1e8":71794,"1f1f8-1f1e9":71795,"1f1f8-1f1ea":71796,"1f1f8-1f1ec":71797,"1f1f8-1f1ed":71798,"1f1f8-1f1ee":71799,"1f1f8-1f1ef":71800,"1f1f8-1f1f0":71801,"1f1f8-1f1f1":71802,"1f1f8-1f1f2":71803,"1f1f8-1f1f3":71804,"1f1f8-1f1f4":71805,"1f1f8-1f1f7":71806,"1f1f8-1f1f8":71807,"1f1f8-1f1f9":71808,"1f1f8-1f1fb":71809,"1f1f8-1f1fd":71810,"1f1f8-1f1fe":71811,"1f1f8-1f1ff":71812,"1f1f9-1f1e6":71813,"1f1f9-1f1e8":71814,"1f1f9-1f1e9":71815,"1f1f9-1f1eb":71816,"1f1f9-1f1ec":71817,"1f1f9-1f1ed":71818,"1f1f9-1f1ef":71819,"1f1f9-1f1f0":71820,"1f1f9-1f1f1":71821,"1f1f9-1f1f2":71822,"1f1f9-1f1f3":71823,"1f1f9-1f1f4":71824,"1f1f9-1f1f7":71825,"1f1f9-1f1f9":71826,"1f1f9-1f1fb":71827,"1f1f9-1f1fc":71828,"1f1f9-1f1ff":71829,"1f1fa-1f1e6":71830,"1f1fa-1f1ec":71831,"1f1fa-1f1f2":71832,"1f1fa-1f1f3":71833,"1f1fa-1f1f8":71834,"1f1fa-1f1fe":71835,"1f1fa-1f1ff":71836,"1f1fb-1f1e6":71837,"1f1fb-1f1e8":71838,"1f1fb-1f1ea":71839,"1f1fb-1f1ec":71840,"1f1fb-1f1ee":71841,"1f1fb-1f1f3":71842,"1f1fb-1f1fa":71843,"1f1fc-1f1eb":71844,"1f1fc-1f1f8":71845,"1f1fd-1f1f0":71846,"1f1fe-1f1ea":71847,"1f1fe-1f1f9":71848,"1f1ff-1f1e6":71849,"1f1ff-1f1f2":71850,"1f1ff-1f1fc":71851,"1f201":62899,"1f202":62900,"1f21a":62906,"1f22f":62903,"1f232":62907,"1f233":62911,"1f234":62910,"1f235":62915,"1f236":62902,"1f237":62901,"1f238":62909,"1f239":62905,"1f23a":62914,"1f250":62904,"1f251":62908,"1f300":41010,"1f301":4857,"1f302":41012,"1f303":4858,"1f304":4860,"1f305":4861,"1f306":4862,"1f307":4863,"1f308":41011,"1f309":4864,"1f30a":41023,"1f30b":4815,"1f30c":4997,"1f30d":4806,"1f30e":4807,"1f30f":4808,"1f310":4809,"1f311":4977,"1f312":4978,"1f313":4979,"1f314":4980,"1f315":4981,"1f316":4982,"1f317":4983,"1f318":4984,"1f319":4985,"1f31a":4986,"1f31b":4987,"1f31c":4988,"1f31d":4991,"1f31e":4992,"1f31f":4995,"1f320":4996,"1f321":4989,"1f324":41001,"1f325":41002,"1f326":41003,"1f327":41004,"1f328":41005,"1f329":41006,"1f32a":41007,"1f32b":41008,"1f32c":41009,"1f32d":3725,"1f32e":3727,"1f32f":3728,"1f330":3708,"1f331":2659,"1f332":2661,"1f333":2662,"1f334":2663,"1f335":2664,"1f336":3698,"1f337":2658,"1f338":2649,"1f339":2653,"1f33a":2655,"1f33b":2656,"1f33c":2657,"1f33d":3697,"1f33e":2665,"1f33f":2666,"1f340":2668,"1f341":2669,"1f342":2670,"1f343":2671,"1f344":3705,"1f345":3690,"1f346":3694,"1f347":3674,"1f348":3675,"1f349":3676,"1f34a":3677,"1f34b":3678,"1f34c":3679,"1f34d":3680,"1f34e":3682,"1f34f":3683,"1f350":3684,"1f351":3685,"1f352":3686,"1f353":3687,"1f354":3722,"1f355":3724,"1f356":3718,"1f357":3719,"1f358":3744,"1f359":3745,"1f35a":3746,"1f35b":3747,"1f35c":3748,"1f35d":3749,"1f35e":3709,"1f35f":3723,"1f360":3750,"1f361":3756,"1f362":3751,"1f363":3752,"1f364":3753,"1f365":3754,"1f366":3765,"1f367":3766,"1f368":3767,"1f369":3768,"1f36a":3769,"1f36b":3774,"1f36c":3775,"1f36d":3776,"1f36e":3777,"1f36f":3778,"1f370":3771,"1f371":3743,"1f372":3735,"1f373":3733,"1f374":3801,"1f375":3783,"1f376":3784,"1f377":3786,"1f378":3787,"1f379":3788,"1f37a":3789,"1f37b":3790,"1f37c":3779,"1f37d":3800,"1f37e":3785,"1f37f":3739,"1f380":51040,"1f381":51041,"1f382":3770,"1f383":51024,"1f384":51025,"1f385":1527,"1f386":51026,"1f387":51027,"1f388":51030,"1f389":51031,"1f38a":51032,"1f38b":51033,"1f38c":71588,"1f38d":51034,"1f38e":51035,"1f38f":51036,"1f390":51037,"1f391":51038,"1f392":61134,"1f393":61147,"1f396":51045,"1f397":51042,"1f399":61167,"1f39a":61168,"1f39b":61169,"1f39e":61203,"1f39f":51043,"1f3a0":4866,"1f3a1":4868,"1f3a2":4869,"1f3a3":51072,"1f3a4":61170,"1f3a5":61202,"1f3a6":62819,"1f3a7":61171,"1f3a8":51105,"1f3a9":61146,"1f3aa":4871,"1f3ab":51044,"1f3ac":61205,"1f3ad":51103,"1f3ae":51086,"1f3af":51078,"1f3b0":51088,"1f3b1":51081,"1f3b2":51089,"1f3b3":51060,"1f3b4":51102,"1f3b5":61165,"1f3b6":61166,"1f3b7":61173,"1f3b8":61175,"1f3b9":61176,"1f3ba":61177,"1f3bb":61178,"1f3bc":61164,"1f3bd":51074,"1f3be":51058,"1f3bf":51075,"1f3c0":51054,"1f3c1":71586,"1f3c2":1600,"1f3c3-200d-2640":1584,"1f3c3-200d-2642":1583,"1f3c3":1582,"1f3c4-200d-2640":1606,"1f3c4-200d-2642":1605,"1f3c4":1604,"1f3c5":51047,"1f3c6":51046,"1f3c7":1598,"1f3c8":51056,"1f3c9":51057,"1f3ca-200d-2640":1612,"1f3ca-200d-2642":1611,"1f3ca":1610,"1f3cb-200d-2640":1618,"1f3cb-200d-2642":1617,"1f3cb":1616,"1f3cc-200d-2640":1603,"1f3cc-200d-2642":1602,"1f3cc":1601,"1f3cd":4902,"1f3ce":4901,"1f3cf":51061,"1f3d0":51055,"1f3d1":51062,"1f3d2":51063,"1f3d3":51065,"1f3d4":4813,"1f3d5":4817,"1f3d6":4818,"1f3d7":4824,"1f3d8":4829,"1f3d9":4859,"1f3da":4830,"1f3db":4823,"1f3dc":4819,"1f3dd":4820,"1f3de":4821,"1f3df":4822,"1f3e0":4831,"1f3e1":4832,"1f3e2":4833,"1f3e3":4834,"1f3e4":4835,"1f3e5":4836,"1f3e6":4837,"1f3e7":62729,"1f3e8":4838,"1f3e9":4839,"1f3ea":4840,"1f3eb":4841,"1f3ec":4842,"1f3ed":4843,"1f3ee":61216,"1f3ef":4844,"1f3f0":4845,"1f3f3-200d-1f308":71591,"1f3f3-200d-26a7":71592,"1f3f3":71590,"1f3f4-200d-2620":71593,"1f3f4-e0067-e0062-e0065-e006e-e0067-e007f":71852,"1f3f4-e0067-e0062-e0073-e0063-e0074-e007f":71853,"1f3f4-e0067-e0062-e0077-e006c-e0073-e007f":71854,"1f3f4":71589,"1f3f5":2652,"1f3f7":61234,"1f3f8":51066,"1f3f9":61303,"1f3fa":3805,"1f3fb":9525,"1f3fc":9526,"1f3fd":9527,"1f3fe":9528,"1f3ff":9529,"1f400":2576,"1f401":2575,"1f402":2556,"1f403":2557,"1f404":2558,"1f405":2547,"1f406":2548,"1f407":2579,"1f408-200d-2b1b":2544,"1f408":2543,"1f409":2618,"1f40a":2613,"1f40b":2622,"1f40c":2632,"1f40d":2616,"1f40e":2550,"1f40f":2563,"1f410":2565,"1f411":2564,"1f412":2531,"1f413":2596,"1f414":2595,"1f415-200d-1f9ba":2537,"1f415":2535,"1f416":2560,"1f417":2561,"1f418":2570,"1f419":2629,"1f41a":2630,"1f41b":2634,"1f41c":2635,"1f41d":2636,"1f41e":2638,"1f41f":2625,"1f420":2626,"1f421":2627,"1f422":2614,"1f423":2597,"1f424":2598,"1f425":2599,"1f426":2600,"1f427":2601,"1f428":2586,"1f429":2538,"1f42a":2566,"1f42b":2567,"1f42c":2623,"1f42d":2574,"1f42e":2555,"1f42f":2546,"1f430":2578,"1f431":2542,"1f432":2617,"1f433":2621,"1f434":2549,"1f435":2530,"1f436":2534,"1f437":2559,"1f438":2612,"1f439":2577,"1f43a":2539,"1f43b-200d-2744":2585,"1f43b":2584,"1f43c":2587,"1f43d":2562,"1f43e":2593,"1f43f":2580,"1f440":1381,"1f441-200d-1f5e8":1159,"1f441":1382,"1f442":1373,"1f443":1375,"1f444":1384,"1f445":1383,"1f446":1347,"1f447":1349,"1f448":1345,"1f449":1346,"1f44a":1355,"1f44b":1327,"1f44c":1336,"1f44d":1352,"1f44e":1353,"1f44f":1358,"1f450":1361,"1f451":61144,"1f452":61145,"1f453":61110,"1f454":61115,"1f455":61116,"1f456":61117,"1f457":61122,"1f458":61123,"1f459":61128,"1f45a":61129,"1f45b":61130,"1f45c":61131,"1f45d":61132,"1f45e":61136,"1f45f":61137,"1f460":61140,"1f461":61141,"1f462":61143,"1f463":1687,"1f464":1684,"1f465":1685,"1f466":1388,"1f467":1389,"1f468-200d-1f33e":1457,"1f468-200d-1f373":1460,"1f468-200d-1f37c":1524,"1f468-200d-1f393":1448,"1f468-200d-1f3a4":1478,"1f468-200d-1f3a8":1481,"1f468-200d-1f3eb":1451,"1f468-200d-1f3ed":1466,"1f468-200d-1f466-200d-1f466":1674,"1f468-200d-1f466":1673,"1f468-200d-1f467-200d-1f466":1676,"1f468-200d-1f467-200d-1f467":1677,"1f468-200d-1f467":1675,"1f468-200d-1f468-200d-1f466":1663,"1f468-200d-1f468-200d-1f466-200d-1f466":1666,"1f468-200d-1f468-200d-1f467":1664,"1f468-200d-1f468-200d-1f467-200d-1f466":1665,"1f468-200d-1f468-200d-1f467-200d-1f467":1667,"1f468-200d-1f469-200d-1f466":1658,"1f468-200d-1f469-200d-1f466-200d-1f466":1661,"1f468-200d-1f469-200d-1f467":1659,"1f468-200d-1f469-200d-1f467-200d-1f466":1660,"1f468-200d-1f469-200d-1f467-200d-1f467":1662,"1f468-200d-1f4bb":1475,"1f468-200d-1f4bc":1469,"1f468-200d-1f527":1463,"1f468-200d-1f52c":1472,"1f468-200d-1f680":1487,"1f468-200d-1f692":1490,"1f468-200d-1f9af":1574,"1f468-200d-1f9b0":1396,"1f468-200d-1f9b1":1397,"1f468-200d-1f9b2":1399,"1f468-200d-1f9b3":1398,"1f468-200d-1f9bc":1577,"1f468-200d-1f9bd":1580,"1f468-200d-2695":1445,"1f468-200d-2696":1454,"1f468-200d-2708":1484,"1f468-200d-2764-200d-1f468":1655,"1f468-200d-2764-200d-1f48b-200d-1f468":1651,"1f468":1392,"1f469-200d-1f33e":1458,"1f469-200d-1f373":1461,"1f469-200d-1f37c":1523,"1f469-200d-1f393":1449,"1f469-200d-1f3a4":1479,"1f469-200d-1f3a8":1482,"1f469-200d-1f3eb":1452,"1f469-200d-1f3ed":1467,"1f469-200d-1f466-200d-1f466":1679,"1f469-200d-1f466":1678,"1f469-200d-1f467-200d-1f466":1681,"1f469-200d-1f467-200d-1f467":1682,"1f469-200d-1f467":1680,"1f469-200d-1f469-200d-1f466":1668,"1f469-200d-1f469-200d-1f466-200d-1f466":1671,"1f469-200d-1f469-200d-1f467":1669,"1f469-200d-1f469-200d-1f467-200d-1f466":1670,"1f469-200d-1f469-200d-1f467-200d-1f467":1672,"1f469-200d-1f4bb":1476,"1f469-200d-1f4bc":1470,"1f469-200d-1f527":1464,"1f469-200d-1f52c":1473,"1f469-200d-1f680":1488,"1f469-200d-1f692":1491,"1f469-200d-1f9af":1575,"1f469-200d-1f9b0":1401,"1f469-200d-1f9b1":1403,"1f469-200d-1f9b2":1407,"1f469-200d-1f9b3":1405,"1f469-200d-1f9bc":1578,"1f469-200d-1f9bd":1581,"1f469-200d-2695":1446,"1f469-200d-2696":1455,"1f469-200d-2708":1485,"1f469-200d-2764-200d-1f468":1654,"1f469-200d-2764-200d-1f469":1656,"1f469-200d-2764-200d-1f48b-200d-1f468":1650,"1f469-200d-2764-200d-1f48b-200d-1f469":1652,"1f469":1400,"1f46a":1657,"1f46b":1647,"1f46c":1648,"1f46d":1646,"1f46e-200d-2640":1494,"1f46e-200d-2642":1493,"1f46e":1492,"1f46f-200d-2640":1590,"1f46f-200d-2642":1589,"1f46f":1588,"1f470-200d-2640":1518,"1f470-200d-2642":1517,"1f470":1516,"1f471-200d-2640":1409,"1f471-200d-2642":1410,"1f471":1391,"1f472":1511,"1f473-200d-2640":1510,"1f473-200d-2642":1509,"1f473":1508,"1f474":1412,"1f475":1413,"1f476":1386,"1f477-200d-2640":1504,"1f477-200d-2642":1503,"1f477":1502,"1f478":1507,"1f479":1109,"1f47a":1110,"1f47b":1111,"1f47c":1526,"1f47d":1112,"1f47e":1113,"1f47f":1104,"1f480":1105,"1f481-200d-2640":1428,"1f481-200d-2642":1427,"1f481":1426,"1f482-200d-2640":1500,"1f482-200d-2642":1499,"1f482":1498,"1f483":1585,"1f484":61152,"1f485":1366,"1f486-200d-2640":1560,"1f486-200d-2642":1559,"1f486":1558,"1f487-200d-2640":1563,"1f487-200d-2642":1562,"1f487":1561,"1f488":4870,"1f489":61326,"1f48a":61328,"1f48b":1127,"1f48c":1128,"1f48d":61153,"1f48e":61154,"1f48f":1649,"1f490":2648,"1f491":1653,"1f492":4846,"1f493":1133,"1f494":1138,"1f495":1135,"1f496":1131,"1f497":1132,"1f498":1129,"1f499":1145,"1f49a":1144,"1f49b":1143,"1f49c":1146,"1f49d":1130,"1f49e":1134,"1f49f":1136,"1f4a0":62946,"1f4a1":61214,"1f4a2":1151,"1f4a3":1157,"1f4a4":1163,"1f4a5":1152,"1f4a6":1154,"1f4a7":41022,"1f4a8":1155,"1f4a9":1107,"1f4aa":1368,"1f4ab":1153,"1f4ac":1158,"1f4ad":1162,"1f4ae":2650,"1f4af":1150,"1f4b0":61235,"1f4b1":62841,"1f4b2":62842,"1f4b3":61242,"1f4b4":61237,"1f4b5":61238,"1f4b6":61239,"1f4b7":61240,"1f4b8":61241,"1f4b9":61244,"1f4ba":4936,"1f4bb":61191,"1f4bc":61265,"1f4bd":61197,"1f4be":61198,"1f4bf":61199,"1f4c0":61200,"1f4c1":61266,"1f4c2":61267,"1f4c3":61227,"1f4c4":61229,"1f4c5":61269,"1f4c6":61270,"1f4c7":61273,"1f4c8":61274,"1f4c9":61275,"1f4ca":61276,"1f4cb":61277,"1f4cc":61278,"1f4cd":61279,"1f4ce":61280,"1f4cf":61282,"1f4d0":61283,"1f4d1":61232,"1f4d2":61226,"1f4d3":61225,"1f4d4":61218,"1f4d5":61219,"1f4d6":61220,"1f4d7":61221,"1f4d8":61222,"1f4d9":61223,"1f4da":61224,"1f4db":62847,"1f4dc":61228,"1f4dd":61264,"1f4de":61185,"1f4df":61186,"1f4e0":61187,"1f4e1":61325,"1f4e2":61159,"1f4e3":61160,"1f4e4":61249,"1f4e5":61250,"1f4e6":61251,"1f4e7":61246,"1f4e8":61247,"1f4e9":61248,"1f4ea":61253,"1f4eb":61252,"1f4ec":61254,"1f4ed":61255,"1f4ee":61256,"1f4ef":61161,"1f4f0":61230,"1f4f1":61182,"1f4f2":61183,"1f4f3":62823,"1f4f4":62824,"1f4f5":62751,"1f4f6":62822,"1f4f7":61207,"1f4f8":61208,"1f4f9":61209,"1f4fa":61206,"1f4fb":61172,"1f4fc":61210,"1f4fd":61204,"1f4ff":61151,"1f500":62801,"1f501":62802,"1f502":62803,"1f503":62769,"1f504":62770,"1f505":62820,"1f506":62821,"1f507":61155,"1f508":61156,"1f509":61157,"1f50a":61158,"1f50b":61188,"1f50c":61190,"1f50d":61211,"1f50e":61212,"1f50f":61290,"1f510":61291,"1f511":61292,"1f512":61288,"1f513":61289,"1f514":61162,"1f515":61163,"1f516":61233,"1f517":61313,"1f518":62947,"1f519":62771,"1f51a":62772,"1f51b":62773,"1f51c":62774,"1f51d":62775,"1f51e":62752,"1f51f":62876,"1f520":62877,"1f521":62878,"1f522":62879,"1f523":62880,"1f524":62881,"1f525":41021,"1f526":61215,"1f527":61306,"1f528":61294,"1f529":61308,"1f52a":3803,"1f52b":61301,"1f52c":61323,"1f52d":61324,"1f52e":51082,"1f52f":62787,"1f530":62848,"1f531":62846,"1f532":62949,"1f533":62948,"1f534":62916,"1f535":62920,"1f536":62940,"1f537":62941,"1f538":62942,"1f539":62943,"1f53a":62944,"1f53b":62945,"1f53c":62811,"1f53d":62813,"1f549":62778,"1f54a":2602,"1f54b":4854,"1f54c":4850,"1f54d":4852,"1f54e":62786,"1f550":4955,"1f551":4957,"1f552":4959,"1f553":4961,"1f554":4963,"1f555":4965,"1f556":4967,"1f557":4969,"1f558":4971,"1f559":4973,"1f55a":4975,"1f55b":4953,"1f55c":4956,"1f55d":4958,"1f55e":4960,"1f55f":4962,"1f560":4964,"1f561":4966,"1f562":4968,"1f563":4970,"1f564":4972,"1f565":4974,"1f566":4976,"1f567":4954,"1f56f":61213,"1f570":4952,"1f573":1156,"1f574":1587,"1f575-200d-2640":1497,"1f575-200d-2642":1496,"1f575":1495,"1f576":61111,"1f577":2641,"1f578":2642,"1f579":51087,"1f57a":1586,"1f587":61281,"1f58a":61261,"1f58b":61260,"1f58c":61262,"1f58d":61263,"1f590":1329,"1f595":1348,"1f596":1331,"1f5a4":1148,"1f5a5":61192,"1f5a8":61193,"1f5b1":61195,"1f5b2":61196,"1f5bc":51104,"1f5c2":61268,"1f5c3":61285,"1f5c4":61286,"1f5d1":61287,"1f5d2":61271,"1f5d3":61272,"1f5dc":61310,"1f5dd":61293,"1f5de":61231,"1f5e1":61299,"1f5e3":1683,"1f5e8":1160,"1f5ef":1161,"1f5f3":61257,"1f5fa":4810,"1f5fb":4816,"1f5fc":4847,"1f5fd":4848,"1f5fe":4811,"1f5ff":61362,"1f600":11,"1f601":14,"1f602":18,"1f603":12,"1f604":13,"1f605":16,"1f606":15,"1f607":114,"1f608":1103,"1f609":112,"1f60a":113,"1f60b":124,"1f60c":150,"1f60d":116,"1f60e":170,"1f60f":144,"1f610":139,"1f611":140,"1f612":145,"1f613":195,"1f614":151,"1f615":173,"1f616":192,"1f617":119,"1f618":118,"1f619":122,"1f61a":121,"1f61b":125,"1f61c":126,"1f61d":128,"1f61e":194,"1f61f":175,"1f620":1101,"1f621":1100,"1f622":189,"1f623":193,"1f624":199,"1f625":188,"1f626":184,"1f627":185,"1f628":186,"1f629":196,"1f62a":152,"1f62b":197,"1f62c":147,"1f62d":190,"1f62e-200d-1f4a8":148,"1f62e":178,"1f62f":179,"1f630":187,"1f631":191,"1f632":180,"1f633":181,"1f634":154,"1f635-200d-1f4ab":165,"1f635":164,"1f636-200d-1f32b":143,"1f636":141,"1f637":155,"1f638":1116,"1f639":1117,"1f63a":1115,"1f63b":1118,"1f63c":1119,"1f63d":1120,"1f63e":1123,"1f63f":1122,"1f640":1121,"1f641":176,"1f642":19,"1f643":110,"1f644":146,"1f645-200d-2640":1422,"1f645-200d-2642":1421,"1f645":1420,"1f646-200d-2640":1425,"1f646-200d-2642":1424,"1f646":1423,"1f647-200d-2640":1437,"1f647-200d-2642":1436,"1f647":1435,"1f648":1124,"1f649":1125,"1f64a":1126,"1f64b-200d-2640":1431,"1f64b-200d-2642":1430,"1f64b":1429,"1f64c":1359,"1f64d-200d-2640":1416,"1f64d-200d-2642":1415,"1f64d":1414,"1f64e-200d-2640":1419,"1f64e-200d-2642":1418,"1f64e":1417,"1f64f":1364,"1f680":4942,"1f681":4937,"1f682":4872,"1f683":4873,"1f684":4874,"1f685":4875,"1f686":4876,"1f687":4877,"1f688":4878,"1f689":4879,"1f68a":4880,"1f68b":4883,"1f68c":4884,"1f68d":4885,"1f68e":4886,"1f68f":4911,"1f690":4887,"1f691":4888,"1f692":4889,"1f693":4890,"1f694":4891,"1f695":4892,"1f696":4893,"1f697":4894,"1f698":4895,"1f699":4896,"1f69a":4898,"1f69b":4899,"1f69c":4900,"1f69d":4881,"1f69e":4882,"1f69f":4938,"1f6a0":4939,"1f6a1":4940,"1f6a2":4930,"1f6a3-200d-2640":1609,"1f6a3-200d-2642":1608,"1f6a3":1607,"1f6a4":4926,"1f6a5":4918,"1f6a6":4919,"1f6a7":4921,"1f6a8":4917,"1f6a9":71587,"1f6aa":61333,"1f6ab":62745,"1f6ac":61358,"1f6ad":62747,"1f6ae":62730,"1f6af":62748,"1f6b0":62731,"1f6b1":62749,"1f6b2":4907,"1f6b3":62746,"1f6b4-200d-2640":1621,"1f6b4-200d-2642":1620,"1f6b4":1619,"1f6b5-200d-2640":1624,"1f6b5-200d-2642":1623,"1f6b5":1622,"1f6b6-200d-2640":1566,"1f6b6-200d-2642":1565,"1f6b6":1564,"1f6b7":62750,"1f6b8":62743,"1f6b9":62733,"1f6ba":62734,"1f6bb":62735,"1f6bc":62736,"1f6bd":61340,"1f6be":62737,"1f6bf":61342,"1f6c0":1643,"1f6c1":61343,"1f6c2":62738,"1f6c3":62739,"1f6c4":62740,"1f6c5":62741,"1f6cb":61338,"1f6cc":1644,"1f6cd":61133,"1f6ce":4944,"1f6cf":61337,"1f6d0":62776,"1f6d1":4920,"1f6d2":61357,"1f6d5":4851,"1f6d6":4828,"1f6d7":61334,"1f6e0":61298,"1f6e1":61304,"1f6e2":4914,"1f6e3":4912,"1f6e4":4913,"1f6e5":4929,"1f6e9":4932,"1f6eb":4933,"1f6ec":4934,"1f6f0":4941,"1f6f3":4927,"1f6f4":4908,"1f6f5":4903,"1f6f6":4925,"1f6f7":51076,"1f6f8":4943,"1f6f9":4909,"1f6fa":4906,"1f6fb":4897,"1f6fc":4910,"1f7e0":62917,"1f7e1":62918,"1f7e2":62919,"1f7e3":62921,"1f7e4":62922,"1f7e5":62925,"1f7e6":62929,"1f7e7":62926,"1f7e8":62927,"1f7e9":62928,"1f7ea":62930,"1f7eb":62931,"1f90c":1337,"1f90d":1149,"1f90e":1147,"1f90f":1338,"1f910":137,"1f911":129,"1f912":156,"1f913":171,"1f914":135,"1f915":157,"1f916":1114,"1f917":130,"1f918":1343,"1f919":1344,"1f91a":1328,"1f91b":1356,"1f91c":1357,"1f91d":1363,"1f91e":1340,"1f91f":1342,"1f920":167,"1f921":1108,"1f922":158,"1f923":17,"1f924":153,"1f925":149,"1f926-200d-2640":1440,"1f926-200d-2642":1439,"1f926":1438,"1f927":160,"1f928":138,"1f929":117,"1f92a":127,"1f92b":134,"1f92c":1102,"1f92d":131,"1f92e":159,"1f92f":166,"1f930":1519,"1f931":1522,"1f932":1362,"1f933":1367,"1f934":1506,"1f935-200d-2640":1515,"1f935-200d-2642":1514,"1f935":1513,"1f936":1528,"1f937-200d-2640":1443,"1f937-200d-2642":1442,"1f937":1441,"1f938-200d-2640":1627,"1f938-200d-2642":1626,"1f938":1625,"1f939-200d-2640":1639,"1f939-200d-2642":1638,"1f939":1637,"1f93a":1597,"1f93c-200d-2640":1630,"1f93c-200d-2642":1629,"1f93c":1628,"1f93d-200d-2640":1633,"1f93d-200d-2642":1632,"1f93d":1631,"1f93e-200d-2640":1636,"1f93e-200d-2642":1635,"1f93e":1634,"1f93f":51073,"1f940":2654,"1f941":61180,"1f942":3791,"1f943":3792,"1f944":3802,"1f945":51069,"1f947":51048,"1f948":51049,"1f949":51050,"1f94a":51067,"1f94b":51068,"1f94c":51077,"1f94d":51064,"1f94e":51053,"1f94f":51059,"1f950":3710,"1f951":3693,"1f952":3700,"1f953":3721,"1f954":3695,"1f955":3696,"1f956":3711,"1f957":3738,"1f958":3734,"1f959":3730,"1f95a":3732,"1f95b":3780,"1f95c":3706,"1f95d":3689,"1f95e":3715,"1f95f":3757,"1f960":3758,"1f961":3759,"1f962":3799,"1f963":3737,"1f964":3794,"1f965":3692,"1f966":3702,"1f967":3773,"1f968":3713,"1f969":3720,"1f96a":3726,"1f96b":3742,"1f96c":3701,"1f96d":3681,"1f96e":3755,"1f96f":3714,"1f970":115,"1f971":198,"1f972":123,"1f973":168,"1f974":163,"1f975":161,"1f976":162,"1f977":1501,"1f978":169,"1f97a":182,"1f97b":61124,"1f97c":61113,"1f97d":61112,"1f97e":61138,"1f97f":61139,"1f980":3760,"1f981":2545,"1f982":2643,"1f983":2594,"1f984":2551,"1f985":2603,"1f986":2604,"1f987":2583,"1f988":2628,"1f989":2606,"1f98a":2540,"1f98b":2633,"1f98c":2553,"1f98d":2532,"1f98e":2615,"1f98f":2572,"1f990":3762,"1f991":3763,"1f992":2569,"1f993":2552,"1f994":2582,"1f995":2619,"1f996":2620,"1f997":2639,"1f998":2591,"1f999":2568,"1f99a":2610,"1f99b":2573,"1f99c":2611,"1f99d":2541,"1f99e":3761,"1f99f":2644,"1f9a0":2647,"1f9a1":2592,"1f9a2":2605,"1f9a3":2571,"1f9a4":2607,"1f9a5":2588,"1f9a6":2589,"1f9a7":2533,"1f9a8":2590,"1f9a9":2609,"1f9aa":3764,"1f9ab":2581,"1f9ac":2554,"1f9ad":2624,"1f9ae":2536,"1f9af":61312,"1f9b4":1380,"1f9b5":1371,"1f9b6":1372,"1f9b7":1379,"1f9b8-200d-2640":1532,"1f9b8-200d-2642":1531,"1f9b8":1530,"1f9b9-200d-2640":1535,"1f9b9-200d-2642":1534,"1f9b9":1533,"1f9ba":61114,"1f9bb":1374,"1f9bc":4905,"1f9bd":4904,"1f9be":1369,"1f9bf":1370,"1f9c0":3717,"1f9c1":3772,"1f9c2":3741,"1f9c3":3796,"1f9c4":3703,"1f9c5":3704,"1f9c6":3731,"1f9c7":3716,"1f9c8":3740,"1f9c9":3797,"1f9ca":3798,"1f9cb":3795,"1f9cd-200d-2640":1569,"1f9cd-200d-2642":1568,"1f9cd":1567,"1f9ce-200d-2640":1572,"1f9ce-200d-2642":1571,"1f9ce":1570,"1f9cf-200d-2640":1434,"1f9cf-200d-2642":1433,"1f9cf":1432,"1f9d0":172,"1f9d1-200d-1f33e":1456,"1f9d1-200d-1f373":1459,"1f9d1-200d-1f37c":1525,"1f9d1-200d-1f384":1529,"1f9d1-200d-1f393":1447,"1f9d1-200d-1f3a4":1477,"1f9d1-200d-1f3a8":1480,"1f9d1-200d-1f3eb":1450,"1f9d1-200d-1f3ed":1465,"1f9d1-200d-1f4bb":1474,"1f9d1-200d-1f4bc":1468,"1f9d1-200d-1f527":1462,"1f9d1-200d-1f52c":1471,"1f9d1-200d-1f680":1486,"1f9d1-200d-1f692":1489,"1f9d1-200d-1f91d-200d-1f9d1":1645,"1f9d1-200d-1f9af":1573,"1f9d1-200d-1f9b0":1402,"1f9d1-200d-1f9b1":1404,"1f9d1-200d-1f9b2":1408,"1f9d1-200d-1f9b3":1406,"1f9d1-200d-1f9bc":1576,"1f9d1-200d-1f9bd":1579,"1f9d1-200d-2695":1444,"1f9d1-200d-2696":1453,"1f9d1-200d-2708":1483,"1f9d1":1390,"1f9d2":1387,"1f9d3":1411,"1f9d4-200d-2640":1395,"1f9d4-200d-2642":1394,"1f9d4":1393,"1f9d5":1512,"1f9d6-200d-2640":1593,"1f9d6-200d-2642":1592,"1f9d6":1591,"1f9d7-200d-2640":1596,"1f9d7-200d-2642":1595,"1f9d7":1594,"1f9d8-200d-2640":1642,"1f9d8-200d-2642":1641,"1f9d8":1640,"1f9d9-200d-2640":1538,"1f9d9-200d-2642":1537,"1f9d9":1536,"1f9da-200d-2640":1541,"1f9da-200d-2642":1540,"1f9da":1539,"1f9db-200d-2640":1544,"1f9db-200d-2642":1543,"1f9db":1542,"1f9dc-200d-2640":1547,"1f9dc-200d-2642":1546,"1f9dc":1545,"1f9dd-200d-2640":1550,"1f9dd-200d-2642":1549,"1f9dd":1548,"1f9de-200d-2640":1553,"1f9de-200d-2642":1552,"1f9de":1551,"1f9df-200d-2640":1556,"1f9df-200d-2642":1555,"1f9df":1554,"1f9e0":1376,"1f9e1":1142,"1f9e2":61148,"1f9e3":61118,"1f9e4":61119,"1f9e5":61120,"1f9e6":61121,"1f9e7":51039,"1f9e8":51028,"1f9e9":51090,"1f9ea":61320,"1f9eb":61321,"1f9ec":61322,"1f9ed":4812,"1f9ee":61201,"1f9ef":61356,"1f9f0":61316,"1f9f1":4825,"1f9f2":61317,"1f9f3":4945,"1f9f4":61346,"1f9f5":51106,"1f9f6":51108,"1f9f7":61347,"1f9f8":51091,"1f9f9":61348,"1f9fa":61349,"1f9fb":61350,"1f9fc":61352,"1f9fd":61355,"1f9fe":61243,"1f9ff":51084,"1fa70":61142,"1fa71":61125,"1fa72":61126,"1fa73":61127,"1fa74":61135,"1fa78":61327,"1fa79":61329,"1fa7a":61331,"1fa80":51079,"1fa81":51080,"1fa82":4935,"1fa83":61302,"1fa84":51083,"1fa85":51092,"1fa86":51094,"1fa90":4993,"1fa91":61339,"1fa92":61345,"1fa93":61295,"1fa94":61217,"1fa95":61179,"1fa96":61149,"1fa97":61174,"1fa98":61181,"1fa99":61236,"1fa9a":61305,"1fa9b":61307,"1fa9c":61318,"1fa9d":61315,"1fa9e":61335,"1fa9f":61336,"1faa0":61341,"1faa1":51107,"1faa2":51109,"1faa3":61351,"1faa4":61344,"1faa5":61354,"1faa6":61360,"1faa7":61363,"1faa8":4826,"1fab0":2645,"1fab1":2646,"1fab2":2637,"1fab3":2640,"1fab4":2660,"1fab5":4827,"1fab6":2608,"1fac0":1377,"1fac1":1378,"1fac2":1686,"1fad0":3688,"1fad1":3699,"1fad2":3691,"1fad3":3712,"1fad4":3729,"1fad5":3736,"1fad6":3782,"203c":62834,"21a9":62765,"21aa":62766,"231a":4948,"231b":4946,"23cf":62818,"23e9":62805,"23ea":62809,"23eb":62812,"23ec":62814,"23ed":62806,"23ee":62810,"23ef":62807,"23f0":4949,"23f1":4950,"23f2":4951,"23f3":4947,"23f8":62815,"23f9":62816,"23fa":62817,"24c2":62890,"25aa":62938,"25ab":62939,"25b6":62804,"25c0":62808,"25fb":62935,"25fc":62934,"25fd":62937,"25fe":62936,"260e":61184,"261d":1350,"262a":62784,"262e":62785,"262f":62781,"263a":120,"264a":62790,"264b":62791,"264c":62792,"264d":62793,"264e":62794,"264f":62795,"265f":51099,"267b":62844,"267e":62833,"267f":62732,"269b":62777,"269c":62845,"26a0":62742,"26a1":41016,"26a7":62827,"26aa":62924,"26ab":62923,"26b0":61359,"26b1":61361,"26bd":51051,"26be":51052,"26c4":41019,"26c5":4999,"26c8":41e3,"26ce":62800,"26cf":61296,"26d1":61150,"26d3":61314,"26d4":62744,"26e9":4853,"26ea":4849,"26f0":4814,"26f1":41015,"26f2":4855,"26f3":51070,"26f4":4928,"26f5":4924,"26f7":1599,"26f8":51071,"26f9-200d-2640":1615,"26f9-200d-2642":1614,"26f9":1613,"26fa":4856,"26fd":4915,"270a":1354,"270b":1330,"270c":1339,"270d":1365,"270f":61258,"271d":62782,"274c":62853,"274e":62854,"2764-200d-1f525":1139,"2764-200d-1fa79":1140,"27a1":62757,"27b0":62855,"27bf":62856,"2b05":62761,"2b06":62755,"2b07":62759,"2b1b":62932,"2b1c":62933,"2b50":4994,"2b55":62849,"303d":62857,"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-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff":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-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3ff":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,"1f48f-1f3fb":0,"1f48f-1f3fc":0,"1f48f-1f3fd":0,"1f48f-1f3fe":0,"1f48f-1f3ff":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f491-1f3fb":0,"1f491-1f3fc":0,"1f491-1f3fd":0,"1f491-1f3fe":0,"1f491-1f3ff":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fe":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,"1f91d-1f3fb":0,"1f91d-1f3fc":0,"1f91d-1f3fd":0,"1f91d-1f3fe":0,"1f91d-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-200d-2640":0,"1f9d4-1f3fc-200d-2640":0,"1f9d4-1f3fd-200d-2640":0,"1f9d4-1f3fe-200d-2640":0,"1f9d4-1f3ff-200d-2640":0,"1f9d4-1f3fb-200d-2642":0,"1f9d4-1f3fc-200d-2642":0,"1f9d4-1f3fd-200d-2642":0,"1f9d4-1f3fe-200d-2642":0,"1f9d4-1f3ff-200d-2642":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}},n=s[""];for(const e in s)e&&Object.assign(n,s[e]);const i=n},4762:(e,t,a)=>{a.d(t,{IS_FIREFOX:()=>r,IS_SAFARI:()=>i});var s=a(6761);const n=navigator?navigator.userAgent:null,i=(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)&&s.Z.MSStream,!!("safari"in s.Z)||!(!n||!(/\b(iPad|iPhone|iPod)\b/.test(n)||n.match("Safari")&&!n.match("Chrome")))),r=navigator.userAgent.toLowerCase().indexOf("firefox")>-1;(void 0===navigator.maxTouchPoints||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)},467:(e,t,a)=>{a.d(t,{ZP:()=>o,gV:()=>p});var s=a(5813);const n=/[`~!@#$%^&*()\-_=+\[\]\\|{}'";:\/?.>,<]+/g,i=/^\s+|\s$/g,r={ะน:"q",ั†:"w",ัƒ:"e",ะบ:"r",ะต:"t",ะฝ:"y",ะณ:"u",ัˆ:"i",ั‰:"o",ะท:"p",ั…:"[",ัŠ:"]",ั„:"a",ั‹:"s",ะฒ:"d",ะฐ:"f",ะฟ:"g",ั€:"h",ะพ:"j",ะป:"k",ะด:"l",ะถ:";",ั:"'",ั:"z",ั‡:"x",ั:"c",ะผ:"v",ะธ:"b",ั‚:"n",ัŒ:"m",ะฑ:",",ัŽ:".",".":"/"};function o(e,t=!0){return p(e,{clearBadChars:!0,latinize:t,ignoreCase:!0})}function p(e,t={}){const a=t.includeTag&&"%"===e.charAt(0),o=e;return t.clearBadChars&&(e=function(e){return e.replace(n,"").replace(i,"")}(e)),t.latinize&&(e=function(e){return e.replace(/[^A-Za-z0-9]/g,(e=>{const t=s.Z[e];return null!=t?t:e}))}(e)),t.ignoreCase&&(e=e.toLowerCase()),a&&(e="%"+e),t.latinize&&(e+=""+function(e){return e.toLowerCase().replace(/[\wะฐ-ั]/g,(e=>{const t=r[e];return null!=t?t:e}))}(o)),e}},8801:(e,t,a)=>{a.d(t,{P:()=>n,q:()=>i});const s="_";function n(e,t){const a=""["".length-1]||"";let n;switch(e._){case"inputPhotoFileLocation":n=["photo",""[0],e.id,e.thumb_size].filter(Boolean).join(s);break;case"inputDocumentFileLocation":n=["document",""[0],e.id,e.thumb_size].filter(Boolean).join(s);break;case"inputPeerPhotoFileLocation":n=["peerPhoto",e.photo_id,e.pFlags.big?"big":"small"].join(s);break;case"inputStickerSetThumb":n=["stickerSetThumb",e.stickerset.id||e.stickerset.short_name||e.stickerset.emoticon||e.stickerset._,e.thumb_version].join(s);break;case"inputFileLocation":n=[e.volume_id,e.local_id].join(s);break;case"inputWebFileLocation":n=["webFile",e.url].join(s);break;default:console.error("Unrecognized location:",e),n=""}return n+((null==t?void 0:t.downloadId)?"_download":"")+(a?"."+a:a)}function i(e,t){return e+"/"+encodeURIComponent(JSON.stringify(t))}},677:(e,t,a)=>{a.d(t,{Ki:()=>o,RP:()=>i,X:()=>r});const s=new Set(["all","web","webk"]),n=new Set;function i(e){return e.find((e=>s.has(e.platform)&&!n.has(e.reason)))}function r(e){return!!i(e)}function o(e){n.clear(),e.forEach((e=>{n.add(e)}))}},2946:(e,t,a)=>{a.d(t,{Z:()=>i});var s=a(5880),n=a(1507);function i(e){if(void 0!==e&&e.isPeerId&&e.isPeerId())return e;if((0,s.Z)(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):n.NM}if(!e)return n.NM;const t="u"===e.charAt(0),a=e.substr(1).split("_");return t?a[0].toPeerId():(a[0]||"").toPeerId(!0)}},6666:(e,t,a)=>{a.d(t,{C:()=>o,Z:()=>p});var s=a(1267),n=a(5471),i=a(5953),r=a(5003);class o{constructor(e){(0,i.Z)(this,e),s.Z.test&&(this.name+="_test"),this.storageIsAvailable=!0,this.log=(0,r.kg)(["IDB",e.name].join("-")),this.log("constructor"),this.openDatabase(!0),o.INSTANCES.push(this)}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;const t=(e,t)=>{var a;const s=Array.from(e.indexNames);for(const t of s)e.deleteIndex(t);if(null===(a=t.indexes)||void 0===a?void 0:a.length)for(const a of t.indexes)e.indexNames.contains(a.indexName)||e.createIndex(a.indexName,a.keyPath,a.objectParameters)};try{var a=indexedDB.open(this.name,this.version);if(!a)return Promise.reject()}catch(e){return this.log.error("error opening db",e.message),this.storageIsAvailable=!1,Promise.reject(e)}let s=!1;return setTimeout((()=>{s||a.onerror((0,n.Z)("IDB_CREATE_TIMEOUT"))}),3e3),this.openDbPromise=new Promise(((e,n)=>{a.onsuccess=t=>{s=!0;const i=a.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)},a.onerror=e=>{s=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),n(e)},a.onupgradeneeded=e=>{s=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);const a=e.target,n=a.result;this.stores.forEach((e=>{if(n.objectStoreNames.contains(e.name)){const s=a.transaction.objectStore(e.name);t(s,e)}else((e,a)=>{const s=e.createObjectStore(a.name);t(s,a)})(n,e)}))}}))}static create(e){var t;return null!==(t=this.INSTANCES.find((t=>t.name===e.name)))&&void 0!==t?t:new o(e)}static closeDatabases(e){this.INSTANCES.forEach((t=>{if(e&&e===t)return;const a=t.db;a&&(a.onclose=()=>{},a.close())}))}}o.INSTANCES=[];class p{constructor(e,t){this.storeName=t,this.log=(0,r.kg)(["IDB",e.name,t].join("-")),this.idb=o.create(e)}delete(e,t){const a=Array.isArray(e);return a||(e=[].concat(e)),this.getObjectStore("readwrite",(t=>{const s=e.map((e=>t.delete(e)));return a?s:s[0]}),"",t)}clear(e){return this.getObjectStore("readwrite",(e=>e.clear()),"",e)}save(e,t,a){const s=Array.isArray(e);return s||(e=[].concat(e),t=[].concat(t)),this.getObjectStore("readwrite",(a=>{const n=e.map(((e,s)=>a.put(t[s],e)));return s?n:n[0]}),"",a)}get(e,t){const a=Array.isArray(e);if(a){if(!e.length)return Promise.resolve([])}else{if(!e)return;e=[].concat(e)}return this.getObjectStore("readonly",(t=>{const s=e.map((e=>t.get(e)));return a?s:s[0]}),"",t)}getObjectStore(e,t,a,s=this.storeName){let n;return a&&(n=performance.now(),this.log(a+": start")),this.idb.openDatabase().then((i=>new Promise(((r,o)=>{const p=i.transaction([s],e),d=()=>{clearTimeout(l),o(p.error)},f=()=>{clearTimeout(l),a&&this.log(a+": end",performance.now()-n);const e=h.map((e=>e.result));r(g?e:e[0])};p.onerror=d;const c="readwrite"===e;c&&(p.oncomplete=()=>f());const l=setTimeout((()=>{this.log.error("transaction not finished",p,a)}),1e4),m=t(p.objectStore(s)),g=Array.isArray(m),h=g?m:[].concat(m);if(c)return;const u=h.length;let y=u;const _=()=>{p.error||--y||f()};for(let e=0;ee.getAll()),"",e)}}},9092:(e,t,a)=>{a.d(t,{r:()=>zs,H:()=>Ws}),a(690),a(4110);var s=a(8630);let n;function i(){return n}function r(e){return n=e}var o=a(1507),p=a(3241),d=a(410),f=a(3206),c=a(1352);class l extends p.Z{constructor(){super(),this.myId=o.NM,this.connectionStatus={},this.premium=!1,this.addEventListener("user_auth",(({id:e})=>{this.myId=e.toPeerId()})),this.addEventListener("premium_toggle_private",(({isNew:e,isPremium:t})=>{this.premium=t,e||this.dispatchEventSingle("premium_toggle",t)})),this.addEventListener("connection_status_change",(e=>{this.connectionStatus[e.name]=e})),this.dispatchEvent=(e,...t)=>{super.dispatchEvent(e,...t),f.Z.getInstance().invokeVoid("event",{name:e,args:t})},c.kC||this.addEventListener("settings_updated",(({settings:e})=>{this.settings=e}))}getConnectionStatus(){return this.connectionStatus}getPremium(){return this.premium}dispatchEventSingle(...e){super.dispatchEvent(...e)}}const m=new l;d.GO.rootScope=m;const g=m;var h=a(7922),u=a(9750);const y=new class{constructor(){this.state={},this.storage=h.Z}getState(){return Promise.resolve(this.state)}setByKey(e,t){!function(e,t,a){const s=t.split(".");(0,u.Z)(e,s.slice(0,-1).join("."))[s.pop()]=a}(this.state,e,t);const a=e.split(".")[0];"settings"===a&&g.dispatchEvent("settings_updated",{key:e,value:t,settings:this.state.settings}),this.pushToState(a,this.state[a])}pushToState(e,t,a=!0,s){a&&(this.state[e]=t),this.setKeyValueToStorage(e,t,s)}setKeyValueToStorage(e,t=this.state[e],a){f.Z.getInstance().invokeVoid("mirror",{name:"state",key:e,value:t}),this.storage.set({[e]:t},a)}};var _=a(4159),v=a(3725),P=a(5418),b=a(1267),M=a(1655),I=a(5003);class S{constructor(e,t,a){this.dcId=e,this.url=t,this.pending=[],this.debug=b.Z.debug&&!1;let s=I.v9.Error|I.v9.Log;this.debug&&(s|=I.v9.Debug),this.log=(0,I.kg)(`HTTP-${e}`+a,s),this.log("constructor"),this.connected=!1}_send(e,t){const a=e.length;return this.debug&&this.log.debug("-> body length to send:",a),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,Z.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 e=this,t=void 0,s=function*(){if(!this.releasing){this.releasing=!0;for(let e=0;e{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=e=>{this.log("closed",e),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 s=I.v9.Error|I.v9.Log;return this.debug&&(s|=I.v9.Debug),this.log=(0,I.kg)(`WS-${e}`+a,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(e){}this.handleClose()}}}function w(e){if(!crypto||!("getRandomValues"in crypto))throw new Error("NO_SECURE_RANDOM");return crypto.getRandomValues(e),e}var k=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 A{constructor(){this._process=(e,t)=>s.Z.invokeCryptoNew({method:"aes-ctr-process",args:[{id:this.id,data:e,operation:t}],transfer:[e.buffer]})}init(e){return k(this,void 0,void 0,(function*(){void 0!==this.idPromise&&this.release();const t=new Uint8Array(64);for(w(t);;){const e=t[3]<<24|t[2]<<16|t[1]<<8|t[0],a=t[7]<<24|t[6]<<16|t[5]<<8|t[4];if(239!==t[0]&&1145128264!==e&&1414745936!==e&&542393671!==e&&1230262351!==e&&4008636142!==e&&3722304989!==e&&0!==a)break;w(t)}const a=t.slice().reverse(),n=t.slice(8,40),i=t.slice(40,56),r=a.slice(8,40),o=a.slice(40,56),p=this.idPromise=s.Z.invokeCrypto("aes-ctr-prepare",{encKey:n,encIv:i,decKey:r,decIv:o});this.process=(e,t)=>k(this,void 0,void 0,(function*(){return yield p,this._process(e,t)})),this.id=yield p,this.process=this._process,t.set(e.obfuscateTag,56);const d=yield this.encode(t.slice());return t.set(d.slice(56,64),56),t}))}encode(e){return this.process(e,"encrypt")}decode(e){return this.process(e,"decrypt")}release(){return k(this,void 0,void 0,(function*(){const e=this.idPromise;if(void 0===e)return;this.id=void 0,this.idPromise=void 0;const t=yield e;s.Z.invokeCrypto("aes-ctr-destroy",t)}))}destroy(){this.release()}}const D=new class{constructor(){this.tag=239,this.obfuscateTag=new Uint8Array([this.tag,this.tag,this.tag,this.tag])}encodePacket(e){const t=e.byteLength>>2;let a;return a=t<127?new Uint8Array([t]):new Uint8Array([127,255&t,t>>8&255,t>>16&255]),a.concat(e)}readPacket(e){let t=e[0];return t>=127?(t=e[1]|e[2]<<8|e[3]<<16,e.slice(4,t<<3)):e.slice(1,t<<3)}};var U=a(9174);function T(e){const t=e.length,a=new Array(t);for(let s=0;sF(this,void 0,void 0,(function*(){this.connected=!0,Z.setTransportOpened("websocket");const e=yield this.obfuscation.init(this.codec);this.connected&&(this.connection.send(e),this.networker&&(this.pending.length=0,this.networker.setConnectionStatus(U.Q.Connected),this.networker.cleanupSent(),this.networker.resend()),setTimeout((()=>{this.releasePending()}),0))})),this.onMessage=e=>F(this,void 0,void 0,(function*(){let t=yield 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(t))})),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(U.Q.Connecting);else for(const e of this.pending)e.bodySent&&(e.bodySent=!1);this.connect()}};let i=I.v9.Error|I.v9.Log;this.debug&&(i|=I.v9.Debug),this.log=(0,I.kg)(`TCP-${t}`+s,i),this.log("constructor"),this.connect()}clear(){this.connected&&Z.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.obfuscation&&this.obfuscation.destroy(),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)}changeUrl(e){this.url!==e&&(this.url=e,this.forceReconnect())}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=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(){var e;return F(this,void 0,void 0,(function*(){if(!this.connected||this.releasingPending)return;this.releasingPending=!0;let t=this.pending.length,a=!1;for(let s=0;s body length to send:",i.length);const r=null!==(e=n.encoded)&&void 0!==e?e:n.encoded=yield this.encodeBody(i);if(!this.connected)break;this.connection.send(r),n.resolve?n.bodySent=!0:(this.pending.splice(s--,1),t--),a=!0}}this.releasingPending=void 0,this.pending.length&&a&&this.releasePending()}))}}const x=b.Z.test?"_test":"";function B(e){return"client"===e?"":"-1"}function V(e,t,a){const s=B(t),n="client"!==t?"apiws"+x+(a?"_premium":""):"apiws"+x;return`wss://${_.Z.suffix.toLowerCase()}ws${e}${s}.web.telegram.org/${n}`}class O{constructor(){this.sslSubdomains=["pluto","venus","aurora","vesta","flora"],this.dcOptions=b.Z.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 s=V(e,t,a);let n;return n=C,new R(n,e,s,"upload"===t?"-U":"download"===t?"-D":"",1e4)},this.transportHTTP=(e,t,a)=>{let s;if(b.Z.ssl||!b.Z.http){const a=B(t);s="https://"+(this.sslSubdomains[e-1]+a)+".web.telegram.org/"+(b.Z.test?"apiw_test1":"apiw1")}else for(const t of this.dcOptions)if(t.id===e){s="http://"+t.host+(80!==t.port?":"+t.port:"")+"/apiw1";break}return new S(e,s,"upload"===t?"-U":"download"===t?"-D":"")}}chooseServer(e,t="client",a=b.Z.transport,s=!0,n){this.chosenServers.hasOwnProperty(a)||(this.chosenServers[a]={client:{},download:{},upload:{}});const i=this.chosenServers[a][t];e in i||(i[e]=[]);const r=i[e];if(!r.length||!s){let i;return i=("websocket"===a?this.transportSocket:this.transportHTTP)(e,t,n),i?(s&&r.push(i),i):(console.error("No chosenServer!",e),null)}return r[0]}static removeTransport(e,t){for(const a in e)for(const s in e[a])for(const n in e[a][s]){const i=e[a][s][n];(0,M.Z)(i,t)}}}var L=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 N extends p.Z{constructor(){super(!0),this.opened=new Map,this.addEventListener("change",(e=>{e.get("websocket")||this.waitForWebSocket()}))}pingTransports(){var e;return L(this,void 0,void 0,(function*(){const t=null!==(e=this.dcConfigurator)&&void 0!==e?e:this.dcConfigurator=new O,a=this.transports={https:t.chooseServer(_.Z.baseDcId,"client","https",!1),websocket:t.chooseServer(_.Z.baseDcId,"client","websocket",!1)},s=(0,v.Z)();this.transports.https._send(new Uint8Array,"no-cors").then((()=>s.resolve(!0)),(()=>s.resolve(!1))),setTimeout((()=>s.resolve(!1)),2e3);const n=(0,v.Z)(),i=a.websocket;i.setAutoReconnect(!1),i.connection.addEventListener("close",(()=>n.resolve(!1)),{once:!0}),i.connection.addEventListener("open",(()=>n.resolve(!0)),{once:!0}),setTimeout((()=>{n.isFulfilled||n.isRejected||(i.connection&&i.connection.close(),n.resolve(!1))}),2e3);const[r,o]=yield Promise.all([s,n]);for(const e in a)a[e].destroy();return{https:r||this.opened.get("https")>0,websocket:o||this.opened.get("websocket")>0}}))}waitForWebSocket(){return L(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(0,P.Z)(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)}}const Z=new N,j=(0,v.Z)();var q=a(6654);class G{setManagers(e){Object.assign(this,e)}}var H=a(3127),W=a(3989),z=a(5466);let K;function J(e){return null!=K?K:K=function(e){return t=this,a=void 0,n=function*(){const t=(0,z.$)((0,I.kg)("STORAGES-LOADER")),a=Object.keys(e),s=a.map((a=>{const s=e[a].getAll();return t(s,"storage "+a)})),n={},i=yield Promise.all(s);for(let e=0,t=a.length;e({storage:this.storages[e],results:t[e]})))},new((s=void 0)||(s=Promise))((function(e,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(r,o)}p((n=n.apply(t,a||[])).next())}));var t,a,s,n}}class Q extends G{getState(){return this.apiManager.invokeApi("account.getPassword").then((e=>e))}updateSettings(e={}){return this.getState().then((t=>{let a,s;const n={password:null,new_settings:{_:"account.passwordInputSettings",hint:e.hint,email:e.email}};a=e.currentPassword?this.cryptoWorker.invokeCrypto("computeSRP",e.currentPassword,t,!1):Promise.resolve({_:"inputCheckPasswordEmpty"});const i=t.new_algo,r=new Uint8Array(i.salt1.length+32);return w(r),r.set(i.salt1,0),i.salt1=r,s=e.newPassword?this.cryptoWorker.invokeCrypto("computeSRP",e.newPassword,t,!0):Promise.resolve(new Uint8Array),Promise.all([a,s]).then((e=>(n.password=e[0],n.new_settings.new_algo=i,n.new_settings.new_password_hash=e[1],this.apiManager.invokeApi("account.updatePasswordSettings",n))))}))}getInputCheckPassword(e,t){return this.cryptoWorker.invokeCrypto("computeSRP",e,t,!1)}check(e,t,a={}){return this.getInputCheckPassword(e,t).then((e=>this.apiManager.invokeApi("auth.checkPassword",{password:e},a).then((e=>("auth.authorization"===e._&&this.apiManager.setUser(e.user),e)))))}confirmPasswordEmail(e){return this.apiManager.invokeApi("account.confirmPasswordEmail",{code:e})}resendPasswordEmail(){return this.apiManager.invokeApi("account.resendPasswordEmail")}cancelPasswordEmail(){return this.apiManager.invokeApi("account.cancelPasswordEmail")}}var Y=a(6848),X=a(5471);class ee extends G{constructor(){super(...arguments),this.contexts=new Map,this.links={},this.log=(0,I.kg)("RD",void 0,!0)}saveContext(e,t,a){[a,e]=this.getContexts(e),a||(a=new Set,this.contexts.set(e,a)),this.links[T(e)]=e;for(const e of a)if((0,Y.Z)(e,t))return;a.add(t)}getReferenceByLink(e){return this.links[T(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((0,Y.Z)(s,t))return a.delete(s),a.size||(this.contexts.delete(e),delete this.links[T(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=this.appMessagesManager.reloadMessages(t.peerId,t.messageId,!0);break;case"emojiesSounds":a=this.refreshEmojiesSoundsPromise||this.appStickersManager.getAnimatedEmojiSounds(!0).then((()=>{this.refreshEmojiesSoundsPromise=void 0}));break;case"userFull":a=Promise.resolve(this.appProfileManager.getProfile(t.userId,!0));break;case"customEmoji":a=this.appEmojiManager.getCustomEmojiDocuments([t.docId]);break;case"attachMenuBotIcon":a=this.appAttachMenuBotsManager.getAttachMenuBot(t.botId,!0);break;case"wallPaper":a=this.appThemesManager.getWallPaperById(t.wallPaperId);break;default:return this.log.warn("refreshReference: not implemented context",t),Promise.reject()}const s=T(e);return this.log("refreshReference: refreshing reference:",s),a.then((()=>{const a=T(e);if(this.log("refreshReference: refreshed, reference before:",s,"after:",a),s!==a)return e;this.deleteContext(e,t);const n=this.getContext(e);if(n)return this.refreshReference(e,n[0]);throw this.log.error("refreshReference: no new context, reference before:",s,"after:",a,t),(0,X.Z)("NO_NEW_CONTEXT")}))}}var te=a(7298),ae=a(7381),se=a(252),ne=a(7625),ie=a(6519);function re(e,t){if(!e)return t;for(var a in e)t.hasOwnProperty(a)||delete e[a];for(var a in t)e[a]=t[a];return e}var oe=a(2790),pe=a(3781),de=a(3385),fe=a(5880),ce=a(8050),le=a(2946);function me(e){var t,a;const s=[e.fromId,e.viaBotId,e.fwdFromId],n=e.media;if(n){const e=n.user_id;void 0!==e&&s.push(e.toPeerId());const t=n.results,a=null==t?void 0:t.recent_voters;(null==a?void 0:a.length)&&s.push(...a.map((e=>e.toPeerId())))}const i=null===(t=e.reactions)||void 0===t?void 0:t.recent_reactions;(null==i?void 0:i.length)&&s.push(...i.map((e=>(0,le.Z)(e.peer_id))));const r=e.action;if(r){const e=[...r.users||[],r.user_id,r.inviter_id];s.push(...e.filter(Boolean).map((e=>e.toPeerId())));const t=[r.channel_id,r.chat_id];s.push(...t.filter(Boolean).map((e=>e.toPeerId(!0))))}const o=null===(a=e.replies)||void 0===a?void 0:a.recent_repliers;return(null==o?void 0:o.length)&&s.push(...o.map((e=>(0,le.Z)(e)))),new Set(s.filter(Boolean))}var ge=a(8027);function he(e,t,a){return e[t]=a}var ue=a(8938);const ye=void 0;class _e extends G{constructor(){super(...arguments),this.clear=(e=!1)=>{if(e){this.allDialogsLoaded={},this.pinnedOrders={};for(const e of o.DZ)this.pinnedOrders[e]=[]}else{this.storage.clear(),this.allDialogsLoaded={},this.saveAllDialogsLoaded(),this.pinnedOrders=Object.assign({},this.pinnedOrders);for(const e of o.DZ)this.resetPinnedOrder(e);this.savePinnedOrders()}this.forumTopics=new Map,this.folders={},this.dialogsOffsetDate={},this.dialogsNum=0,this.dialogsIndex=new ae.Z({clearBadChars:!0,ignoreCase:!0,latinize:!0,includeTag:!0}),this.cachedResults={query:"",count:0,dialogs:[],folderId:0}},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({dialog:i})),this.appMessagesManager.scheduleHandleNewDialogs(n,i)}))},this.onUpdateDialogPinned=e=>{var t;const a=null!==(t=e.folder_id)&&void 0!==t?t:o.J$,s=this.appPeersManager.getPeerId(e.peer.peer),n=this.getDialogOnly(s);this.handleDialogTogglePinned(n,e.pFlags.pinned,a)},this.onUpdateChannelPinnedTopic=e=>{const t=e.channel_id.toPeerId(!0),a=(0,pe.Z)(e.topic_id),s=this.getForumTopic(t,a);s&&this.handleDialogTogglePinned(s,e.pFlags.pinned,this.getFilterIdForForum(s))},this.onUpdatePinnedDialogs=e=>{var t;const a=null!==(t=e.folder_id)&&void 0!==t?t:o.J$;e.order?this.handleDialogsPinned(a,e.order.map((e=>this.appPeersManager.getPeerId(e.peer)))):this.apiManager.invokeApi("messages.getPinnedDialogs",{folder_id:a}).then((e=>{this.applyDialogs(e),this.handleDialogsPinned(a,e.dialogs.map((e=>e.peerId)))}))},this.onUpdateChannelPinnedTopics=e=>{return t=this,a=void 0,n=function*(){const t=e.channel_id.toPeerId(!0);if(!this.forumTopics.get(t))return;const a=t;if(e.order){const t=e.order.map((e=>(0,pe.Z)(e)));this.handleDialogsPinned(a,t)}else{const e=yield this.apiManager.getLimit("topicPin",!0),s=this.apiManager.invokeApi("channels.getForumTopics",{channel:this.appChatsManager.getChannelInput(t.toChatId()),limit:e,offset_date:0,offset_id:0,offset_topic:0}),n=(yield this.processTopics(t,s)).topics.filter((e=>e.pFlags.pinned));this.handleDialogsPinned(a,n.map((e=>e.id)))}},new((s=void 0)||(s=Promise))((function(e,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(r,o)}p((n=n.apply(t,a||[])).next())}));var t,a,s,n}}after(){this.clear(!0),this.rootScope.addEventListener("language_change",(()=>{const e=this.appUsersManager.getSelf().id.toPeerId(!1);if(this.getDialogOnly(e)){const t=this.appPeersManager.getPeerSearchText(e);this.dialogsIndex.indexObject(e,t)}}));const e=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=this.getDialogIndexKeyByFilterId(e.id);for(let e=0;e{this.processChangedUnreadOrUnmuted(e.peerId)})),this.rootScope.addEventListener("chat_update",(e=>{const t=this.appChatsManager.getChat(e),a=e.toPeerId(!0);t.pFlags.left&&this.getDialogOnly(a)&&this.dropDialogOnDeletion(a)})),this.rootScope.addEventListener("chat_toggle_forum",(({chatId:e,enabled:t})=>{const a=e.toPeerId(!0);t||this.flushForumTopicsCache(a),this.processChangedUnreadOrUnmuted(a)})),this.apiUpdatesManager.addMultipleEventsListeners({updateFolderPeers:this.onUpdateFolderPeers,updateDialogPinned:this.onUpdateDialogPinned,updateChannelPinnedTopic:this.onUpdateChannelPinnedTopic,updatePinnedDialogs:this.onUpdatePinnedDialogs,updateChannelPinnedTopics:this.onUpdateChannelPinnedTopics}),Promise.all([this.appStateManager.getState(),this.appStoragesManager.loadStorage("dialogs")]).then((([e,{results:t,storage:a}])=>{this.storage=a,this.dialogs=this.storage.getCache();for(const t of o.DZ){const a=e.pinnedOrders[t];if(!a)continue;const s=this.getPinnedOrders(t);s.splice(0,s.length,...a)}t.length&&W.Z.freezeSaving(this.setDialogsFromState.bind(this,t),["chats","dialogs","messages","users"]),this.allDialogsLoaded=e.allDialogsLoaded||{},t.length&&this.appDraftsManager.addMissedDialogs()}))}setDialogsFromState(e){for(let t=0,a=e.length;tthis.allDialogsLoaded[e]))&&(this.allDialogsLoaded[void 0]=!0),this.saveAllDialogsLoaded())}saveAllDialogsLoaded(){this.appStateManager.pushToState("allDialogsLoaded",this.allDialogsLoaded)}handleDialogUnpinning(e,t){delete e.pFlags.pinned,(0,M.Z)(this.getPinnedOrders(t),this.isFilterIdForForum(t)?e.id:e.peerId),this.savePinnedOrders()}savePinnedOrders(){this.appStateManager.pushToState("pinnedOrders",this.pinnedOrders)}resetPinnedOrder(e){this.getPinnedOrders(e).length=0}getPinnedOrders(e){let t=this.pinnedOrders[e];return!t&&this.isFilterIdForForum(e)&&((0,ge.Z)(this.pinnedOrders,[e]),t=this.pinnedOrders[e]=[]),t}isDialogPinned(e,t){const a=this.filtersStorage.getFilter(t);let s;return s=a?-1!==a.pinnedPeerIds.indexOf(e):!!this.getDialogOnly(e).pFlags.pinned,s}getOffsetDate(e){const t=this.dialogsOffsetDate[e]||0;return e!==ye||t?t:Math.min(...Array.from(o.DZ).sort(((e,t)=>e-t)))}generateFolder(e){const t={dialogs:[],id:e,unreadMessagesCount:0,unreadPeerIds:new Set,unreadUnmutedPeerIds:new Set};return(0,ge.Z)(t,["dispatchUnreadTimeout"]),t}getFolder(e){var t,a;return null!==(t=(a=this.folders)[e])&&void 0!==t?t:a[e]=this.generateFolder(e)}isFilterIdForForum(e){return e&&e<0}getFilterIdForForum(e){return e.peerId}getDialogKey(e){return this.isTopic(e)?e.id:e.peerId}getFolderDialogs(e,t=!0){if(e===ye)return this.getCachedDialogs(t);const a=this.getFolder(e);return this.isFilterIdForForum(e)?t?a.dialogs.filter((e=>!e.pFlags.hidden)):a.dialogs:t?a.dialogs.filter((e=>void 0===e.migratedTo)):a.dialogs}getNextDialog(e,t,a){const s=this.getFolderDialogs(a,!0);let n;if(e){const a=s.findIndex((t=>t.peerId===e));-1!==a&&(n=s[t?a+1:a-1])}else t&&(n=s[0]);return n}getDialogIndexKeyByFilterId(e){if(this.isFilterIdForForum(e))return(0,de.Z)();if(o.DZ.has(e))return(0,de.Z)(e);const t=this.filtersStorage.getFilter(e);return(0,de.Z)(t.localId)}isDialogUnmuted(e){return!this.appNotificationsManager.isPeerLocalMuted({peerId:e.peerId,respectType:!0,threadId:this.isTopic(e)?e.id:void 0})}getFolderUnreadCount(e){const t=this.getFolder(e);return{unreadUnmutedCount:t.unreadUnmutedPeerIds.size,unreadCount:t.unreadPeerIds.size}}getCachedDialogs(e){const t=Array.from(o.DZ).map((t=>this.getFolderDialogs(t,e)));return[].concat(...t)}setDialogIndexInFilter(e,t,a){var s,n;let i;const r=this.isTopic(e),p=r||o.DZ.has(a.id);if(this.filtersStorage.testDialogForFilter(e,a)){const t=r?this.getPinnedOrders(this.getFilterIdForForum(e)):a.pinnedPeerIds,o=this.getDialogKey(e),d=t.indexOf(o);i=-1!==d?this.generateDialogIndex(this.generateDialogPinnedDateByIndex(t.length-1-d),!0):(null===(s=e.pFlags)||void 0===s?void 0:s.pinned)||p?this.generateIndexForDialog(e,!0,void 0,!p):null!==(n=(0,ce.Z)(e))&&void 0!==n?n:this.generateIndexForDialog(e,!0)}return he(e,t,i)}getDialog(e,t,a,s=!0){const n=[];a&&(t=e),void 0===t?n.push(...Array.from(o.DZ).map((e=>this.getFolder(e).dialogs))):n.push(this.getFolderDialogs(t,!1));const i=a?e=>e.id===a:t=>t.peerId===e;for(const e of n){let t=0,a=0;for(let n=e.length;tt.id===e.id:t=>t.peerId===e.peerId,d=r.findIndex(p),f=r[d],c=this.getDialogIndex(f,i);a&&n>o.Zi&&(a=void 0);const l=a?void 0:this.setDialogIndexInFilter(e,i,t);return c!==l&&(!!c!=!!l&&this.prepareFolderUnreadCountModifyingByDialog(n,e,!!l),-1!==d&&r.splice(d,1),l&&(0,ie.Z)(r,e,(e=>this.getDialogIndex(e,i)),-1),!0)}prepareDialogUnreadCountModifying(e,t){const a=this.isTopic(e),s=[],n=a?this.getFilterIdForForum(e):e.folder_id;if(s.push(this.prepareFolderUnreadCountModifyingByDialog(n,e,t)),!a){const a=this.filtersStorage.getFilters();for(const n in a){const i=a[n];this.filtersStorage.testDialogForFilter(e,i)&&s.push(this.prepareFolderUnreadCountModifyingByDialog(i.id,e,t))}}return()=>!t&&s.forEach((e=>e()))}prepareFolderUnreadCountModifyingByDialog(e,t,a){const s=this.appMessagesManager.getDialogUnreadCount(t),n=this.isDialogUnmuted(t);if(void 0===a)return()=>{const a=this.appMessagesManager.getDialogUnreadCount(t),n=this.isDialogUnmuted(t),i=a-s;this.modifyFolderUnreadCount(e,i,!!a,a&&n,t)};{const i=a?s:-s;this.modifyFolderUnreadCount(e,i,!!s,s&&n,t)}}modifyFolderUnreadCount(e,t,a,s,n){var i;const{peerId:r}=n,o=this.appPeersManager.isForum(r),p=this.isTopic(n);if(o&&!p){const i=this.getForumUnreadCount(r);if(i instanceof Promise)return void i.then((({count:t,hasUnmuted:a})=>{n=this.getDialogOnly(r);const s=this.getFolder(e);n&&this.appPeersManager.isForum(r)&&s&&s.dialogs.some((e=>e.peerId===r))&&this.modifyFolderUnreadCount(e,0,!1,!1,n)}));t=0,a=i.count>0,s=i.hasUnmuted}const d=this.getFolder(e);t&&(d.unreadMessagesCount=Math.max(0,d.unreadMessagesCount+t));const f=this.getDialogKey(n);a?d.unreadPeerIds.add(f):d.unreadPeerIds.delete(f),s?d.unreadUnmutedPeerIds.add(f):d.unreadUnmutedPeerIds.delete(f),null!==(i=d.dispatchUnreadTimeout)&&void 0!==i||(d.dispatchUnreadTimeout=E.Z.setTimeout((()=>{d.dispatchUnreadTimeout=void 0;const e=Object.assign({},d);delete e.dialogs,this.rootScope.dispatchEvent("folder_unread",e),p&&this.processChangedUnreadOrUnmuted(r)}),0))}processChangedUnreadOrUnmuted(e){const t=this.getDialogOnly(e);t&&(this.processDialogForFilters(t),this.prepareDialogUnreadCountModifying(t)(),this.rootScope.dispatchEvent("dialog_unread",{peerId:e,dialog:t}))}generateIndexForDialog(e,t,a,s){var n;if(!t)return;const i=this.isTopic(e);let r,o=0;if(e.pFlags.hidden)o=this.generateDialogPinnedDateByIndex(4095),r=!0;else if(e.pFlags.pinned&&!s)o=this.generateDialogPinnedDate(e),r=!0;else{if(a||(a=this.appMessagesManager.getMessageByPeer(e.peerId,e.top_message)),o=(null==a?void 0:a.date)||o,!i){const t=this.appPeersManager.isChannel(e.peerId)&&e.peerId.toChatId();if(t){const e=this.appChatsManager.getChat(t);(!o||e.date&&e.date>o)&&(o=e.date)}}"draftMessage"===(null===(n=e.draft)||void 0===n?void 0:n._)&&e.draft.date>o&&(o=e.draft.date)}o||(o=(0,te.Z)(!0));const p=this.generateDialogIndex(o,r);if(t)return p;he(e,(0,de.Z)(e.folder_id),p)}generateDialogPinnedDateByIndex(e){return 2147418112+(65535&e)}generateDialogPinnedDate(e){const t=this.isTopic(e),a=this.getPinnedOrders(t?this.getFilterIdForForum(e):e.folder_id),s=this.getDialogKey(e);let n=a.indexOf(s);return-1===n&&(a.unshift(s),n=0,t||this.savePinnedOrders()),this.generateDialogPinnedDateByIndex(a.length-1-n)}setDialogToState(e){if(this.isTopic(e))return;const{peerId:t,pts:a}=e,s=this.appMessagesManager.getHistoryStorage(t),n=this.appMessagesManager.getHistoryMessagesStorage(t),i=s.history.slice;let r;for(let e=0,a=i.length;e{"dialogFolder"===t._&&e.dialogs.splice(a,1)})),(0,ue.Z)(s),this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.appMessagesManager.saveMessages(e.messages);const n=new Map;s.forEach((e=>{var t,s;const i=this.appPeersManager.getPeerId(e.peer);let r=e.top_message;const o=this.appMessagesManager.pendingTopMsgs[i];if(o){const t=this.appMessagesManager.getMessageByPeer(i,o),a=this.appMessagesManager.getMessageByPeer(i,r);(!r||t&&(!a||(null==t?void 0:t.date)>(null==a?void 0:a.date)))&&(e.top_message=r=o,this.appMessagesManager.getHistoryStorage(i).maxId=o)}if(r||"draftMessage"===(null===(t=e.draft)||void 0===t?void 0:t._)){if(this.saveDialog({dialog:e})){const t=(e=>{let t=n.get(e);return t||n.set(e,t={}),t})(i);a?(null!==(s=t.topics)&&void 0!==s?s:t.topics=new Map).set(e.id,e):t.dialog=e}}else this.dropDialogWithEvent(i,a?this.getDialogKey(e):void 0);const p=this.appMessagesManager.getUpdateAfterReloadKey(i,a?this.getDialogKey(e):void 0),d=this.appMessagesManager.newUpdatesAfterReloadToHandle[p];if(void 0!==d){for(const e of d)d.delete(e),this.apiUpdatesManager.saveUpdate(e);d.size||delete this.appMessagesManager.newUpdatesAfterReloadToHandle[p]}})),n.size&&this.rootScope.dispatchEvent("dialogs_multiupdate",n)}getDialogOffsetDate(e){const t=this.appMessagesManager.getMessageByPeer(e.peerId,e.top_message);return(null==t?void 0:t.date)||0}canSaveDialogByPeerId(e){if(e.isAnyChat()){const t=this.appChatsManager.getChat(e.toChatId());if("channelForbidden"===t._||t.pFlags.left)return!1}return!0}saveDialog({dialog:e,folderId:t,ignoreOffsetDate:a,saveGlobalOffset:s}){var n,i;const r=this.isTopic(e),p=!r,d=r?e.id=(0,pe.Z)(e.id):void 0;r||null!=t||(t=null!==(n=e.folder_id)&&void 0!==n?n:o.J$);const f=this.appPeersManager.getPeerId(e.peer);if(!f)return console.error("saveConversation no peerId???",e,t),!1;if(r||"dialog"===e._||console.error("saveConversation not regular dialog",e,Object.assign({},e)),p&&!this.canSaveDialogByPeerId(f))return!1;const c=this.appPeersManager.isChannel(f)?f.toChatId():o.NM;if(p){const e=this.appPeersManager.getPeerSearchText(f);this.dialogsIndex.indexObject(f,e)}const l=this.getDialogOrTopic(f,d);let m,g;if(e.top_message){m=(0,pe.Z)(e.top_message);const t=(null==l?void 0:l.top_message)&&this.appMessagesManager.getMessageByPeer(f,l.top_message);(null===(i=null==t?void 0:t.pFlags)||void 0===i?void 0:i.is_outgoing)&&l.top_message>=m&&(m=l.top_message),g=this.appMessagesManager.getMessageByPeer(f,m)}else m=this.appMessagesManager.generateTempMessageId(f),g={_:"message",id:m,mid:m,from_id:this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId(!1)),peer_id:this.appPeersManager.getOutputPeer(f),deleted:!0,pFlags:{out:!0},date:0,message:""},this.appMessagesManager.saveMessages([g],{isOutgoing:!0});if((null==g?void 0:g.pFlags)||this.appMessagesManager.log.error("saveConversation no message:",e,g),p&&!c&&f.isAnyChat()){const t=this.appChatsManager.getChat(f.toChatId());if(t&&t.migrated_to&&t.pFlags.deactivated){const a=this.appPeersManager.getPeerId(t.migrated_to);this.appMessagesManager.migratedFromTo[f]=a,this.appMessagesManager.migratedToFrom[a]=f,e.migratedTo=a}}if(e.top_message=m,e.read_inbox_max_id=(0,pe.Z)(l&&!e.read_inbox_max_id?l.read_inbox_max_id:e.read_inbox_max_id),e.read_outbox_max_id=(0,pe.Z)(l&&!e.read_outbox_max_id?l.read_outbox_max_id:e.read_outbox_max_id),p&&void 0===e.folder_id&&"dialog"===e._&&(e.folder_id=l?l.folder_id:t),e.draft=this.appDraftsManager.saveDraft({peerId:f,threadId:d,draft:e.draft}),e.peerId=f,g&&g.pFlags.is_outgoing){const t=g.pFlags.out;m>e[t?"read_outbox_max_id":"read_inbox_max_id"]?(g.pFlags.unread=!0,e.unread_count||t||++e.unread_count):delete g.pFlags.unread}const h=this.appMessagesManager.getHistoryStorage(f,d),u=h.history.slice;if(u.length?u.isEnd(se.D.Bottom)||(h.history.insertSlice([m]).setEnd(se.D.Bottom),h.count||(h.count=1),this.appMessagesManager.mergeReplyKeyboard(h,g)&&this.rootScope.dispatchEvent("history_reply_markup",{peerId:f})):(h.history.unshift(m),h.count||(h.count=1),this.appMessagesManager.mergeReplyKeyboard(h,g)&&this.rootScope.dispatchEvent("history_reply_markup",{peerId:f})),h.maxId=m,h.readMaxId=e.read_inbox_max_id,h.readOutboxMaxId=e.read_outbox_max_id,this.appNotificationsManager.savePeerSettings({peerId:f,threadId:r?e.id:void 0,settings:e.notify_settings}),p&&c&&e.pts&&this.apiUpdatesManager.addChannelState(c,e.pts),this.generateIndexForDialog(e),l){const t=this.dialogsStorage.prepareDialogUnreadCountModifying(l);re(l,e),t()}return this.pushDialog({dialog:e,offsetDate:null==g?void 0:g.date,ignoreOffsetDate:a,saveGlobalOffset:s}),r&&this.processTopicUpdate(e,l),!0}processTopicUpdate(e,t){if(!t)return;const{peerId:a,id:s}=e,n=e.icon_emoji_id!==t.icon_emoji_id,i=e.title!==t.title,r=n||i;n&&this.rootScope.dispatchEvent("avatar_update",{peerId:a,threadId:s}),r&&this.rootScope.dispatchEvent("peer_title_edit",{peerId:a,threadId:s})}getDialogs(e){const{query:t="",offsetIndex:a,limit:s=20,filterId:n=o.J$,skipMigrated:i=!1}=e,r=this.isFilterIdForForum(n);if(!r&&!o.DZ.has(n)){const t=[],a=this.appUsersManager.fillContacts();a.cached||t.push(a.promise);const s=this.filtersStorage.reloadMissingPeerIds(n);if(s&&t.push(s),t.length)return Promise.all(t).then((()=>this.getDialogs(e)))}const p=o.DZ.has(n)&&!this.getOffsetDate(n)||r?n:ye;let d=this.getFolderDialogs(n,i);const f=this.getDialogIndexKeyByFilterId(n);if(t&&!r){if(!s||this.cachedResults.query!==t||this.cachedResults.folderId!==n){this.cachedResults.query=t,this.cachedResults.folderId=n;const e=this.dialogsIndex.search(t),a=[];for(const t in this.dialogs){const s=this.dialogs[t];e.has(s.peerId)&&s.folder_id===n&&a.push(s)}a.sort(((e,t)=>this.getDialogIndex(t,f)-this.getDialogIndex(e,f))),this.cachedResults.dialogs=a,this.cachedResults.count=a.length}d=this.cachedResults.dialogs}else this.cachedResults.query="";let c=0;if(a>0)for(let e=d.length;cthis.getDialogIndex(d[c],f));++c);const l=this.isDialogsLoaded(p),m=d.length>=c+s;if(t||l||m){const e=d.slice(c,c+s);return{dialogs:e,count:l?d.length:null,isTopEnd:d.length&&(e[0]&&e[0]===d[0]||this.getDialogIndex(d[0],f)=d.length}}return this.appMessagesManager.getTopMessages({limit:s,folderId:p}).then((e=>{if(i&&(d=this.getFolderDialogs(n,i)),c=0,a>0)for(let e=d.length;cthis.getDialogIndex(d[c],f));++c);const t=d.slice(c,c+s);return{dialogs:t,count:void 0===e.count?d.length:e.count,isTopEnd:d.length&&(t[0]&&t[0]===d[0]||this.getDialogIndex(d[0],f){const t={},a=[];for(const[e,n]of s.getTopicPromises)t[e]=n,a.push((0,oe.Z)(e));s.getTopicPromises.clear();const n=()=>{for(const e in t)t[e].resolve(void 0),s.deletedTopics.add(+e)};if(this.getForumTopicsCache(e)===s)return this.apiManager.invokeApi("channels.getForumTopicsByID",{channel:this.appChatsManager.getChannelInput(e.toChatId()),topics:a}).then((a=>{if(this.getForumTopicsCache(e)===s)return this.applyDialogs(a,e),a.topics.forEach((a=>{"forumTopic"===a._&&(t[a.id].resolve(a),delete t[e])})),a}),(()=>{})).then((()=>{n(),s.getTopicsPromise=void 0,s.getTopicPromises.size&&this.getForumTopicById(e)}));n()}))),n||s.getTopicsPromise}getForumTopic(e,t){var a;const s=this.forumTopics.get(e);return null===(a=null==s?void 0:s.topics)||void 0===a?void 0:a.get(t)}getForumTopicOrReload(e,t){var a;const s=this.getForumTopic(e,t);if(s)return s;const n=this.getForumTopicsCache(e);return(null===(a=null==n?void 0:n.deletedTopics)||void 0===a?void 0:a.has(t))?void 0:this.getForumTopicById(e,t)}processTopics(e,t){return(0,q.Z)(t,(t=>{"pts"in t&&this.apiUpdatesManager.addChannelState(e.toChatId(),t.pts);const a=this.appPeersManager.getOutputPeer(e);return t.topics=t.topics.map((e=>{if("forumTopicDeleted"!==e._)return e.peer=a,e.id=(0,pe.Z)(e.id),e})).filter(Boolean),t}))}processTopicsPromise(e,t){return t.then((t=>(this.processTopics(e,t),t)))}getForumUnreadCount(e){if(!this.appPeersManager.isForum(e))return;const t=this.getFolder(e),a=t.dialogs.length>=20||this.isDialogsLoaded(e)?t.dialogs.slice(0,20):(0,q.Z)(this.getDialogs({filterId:e,limit:20}),(e=>e.dialogs));return(0,q.Z)(a,(e=>({count:e.reduce(((e,t)=>e+ +!!t.unread_count),0),hasUnmuted:e.some((e=>e.unread_count&&this.isDialogUnmuted(e)))})))}handleDialogTogglePinned(e,t,a){e&&(t?e.pFlags.pinned=!0:this.handleDialogUnpinning(e,a),this.generateIndexForDialog(e)),this.appMessagesManager.scheduleHandleNewDialogs(e.peerId,e)}handleDialogsPinned(e,t){const a=this.isFilterIdForForum(e);this.resetPinnedOrder(e),this.getPinnedOrders(e).push(...t),this.savePinnedOrders(),t.reverse();const s={};t.forEach((t=>{s[t]=!0;const n=a?e:t,i=a?t:void 0,r=this.getDialogOrTopic(n,i);this.appMessagesManager.scheduleHandleNewDialogs(n,r),r&&(r.pFlags.pinned=!0,this.generateIndexForDialog(r))}));const n=this.getFolderDialogs(e,!1);for(const e of n){if(!e.pFlags.pinned)break;s[this.getDialogKey(e)]||(delete e.pFlags.pinned,this.generateIndexForDialog(e),this.appMessagesManager.scheduleHandleNewDialogs(e.peerId,e))}}}var ve=a(8479),Pe=a(4064),be=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 Me=[["pinned_peers","pinnedPeerIds"],["exclude_peers","excludePeerIds"],["include_peers","includePeerIds"]],Ie=o.DZ.size,Se={_:"dialogFilter",pFlags:{},flags:0,id:0,title:"",exclude_peers:[],include_peers:[],pinned_peers:[],excludePeerIds:[],includePeerIds:[],pinnedPeerIds:[]};class Ce extends G{constructor(){super(...arguments),this.clear=e=>{if(e){this.filters={},this.filtersArr=[],this.reloadedPeerIds=new Set,this.localFilters={};for(const e of o.DZ)this.localFilters[e]=this.generateLocalFilter(e)}else this.reloadedPeerIds.clear(),this.clearFilters();this.localId=o.Gu},this.onUpdateDialogFilter=e=>{e.filter?this.saveDialogFilter(e.filter):this.filters[e.id]&&(this.rootScope.dispatchEvent("filter_delete",this.filters[e.id]),delete this.filters[e.id],(0,Pe.Z)(this.filtersArr,(t=>t.id===e.id))),this.pushToState()},this.onUpdateDialogFilters=e=>{const t=(0,ve.Z)(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))})}))},this.onUpdateDialogFilterOrder=e=>{const t=e.order.slice();t.includes(o.Zi)||t.splice(t[0]===o.J$?1:0,0,o.Zi),this.localId=o.Gu,t.forEach((e=>{const t=this.filters[e];delete t.localId,this.setLocalId(t)})),this.rootScope.dispatchEvent("filter_order",t),this.pushToState()}}after(){return this.clear(!0),this.apiUpdatesManager.addMultipleEventsListeners({updateDialogFilter:this.onUpdateDialogFilter,updateDialogFilters:this.onUpdateDialogFilters,updateDialogFilterOrder:this.onUpdateDialogFilterOrder}),this.rootScope.addEventListener("premium_toggle",(()=>{this.onUpdateDialogFilters({_:"updateDialogFilters"})})),this.appStateManager.getState().then((e=>{this.prependFilters(e.filtersArr).map((e=>{this.saveDialogFilter(e,!1,!0)}))}))}prependFilters(e){e=e.slice();const t=this.localFilters[o.J$],a=this.localFilters[o.Zi],s=e.findIndex((e=>"dialogFilterDefault"===e._||e.id===o.J$));return-1!==s?e[s]=t:e.unshift(t),(0,Pe.Z)(e,(e=>e.id===o.Zi)),e.splice(e[0]===t?1:0,0,a),this.localId=o.Gu,e.forEach((e=>{delete e.localId})),e}generateLocalFilter(e){const t=Object.assign(Object.assign({},(0,ve.Z)(Se)),{id:e});return e===o.J$?t.pFlags.exclude_archived=!0:e===o.Zi&&(t.pFlags.exclude_unarchived=!0),o.DZ.has(e)&&(t.pinnedPeerIds=this.dialogsStorage.getPinnedOrders(e)),t}pushToState(){this.appStateManager.pushToState("filtersArr",this.filtersArr)}testDialogForFilter(e,t){if(!t)return!0;if(o.DZ.has(t.id))return e.folder_id===t.id&&this.dialogsStorage.canSaveDialogByPeerId(e.peerId);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&&e.folder_id===o.Zi)return!1;if(s.exclude_read&&!this.appMessagesManager.isDialogUnread(e))return!1;if(s.exclude_muted&&this.appNotificationsManager.isPeerLocalMuted({peerId: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]}getFilters(){return this.filters}clearFilters(){const e=this.getFilters();for(const t in e)o.DZ.has(+t)||this.onUpdateDialogFilter({_:"updateDialogFilter",id:+t})}toggleDialogPin(e,t){return be(this,void 0,void 0,(function*(){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>=(yield this.apiManager.getConfig()).pinned_infolder_count_max)return Promise.reject((0,X.Z)("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=(0,ve.Z)(e)).id=a+1,this.updateDialogFilter(e,void 0,t)}updateDialogFilter(e,t=!1,a=!1){const s=t?0:1;return this.apiManager.invokeApi("messages.updateDialogFilter",{flags:s,id:e.id,filter:t?void 0:this.getOutputDialogFilter(e)}).then((s=>{if(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.localId,t.push(a)}e.localId=o.Gu;const a=t.sort(((e,t)=>e.localId-t.localId)).map((e=>e.id));this.onUpdateDialogFilterOrder({_:"updateDialogFilterOrder",order:a})}}))}updateDialogFiltersOrder(e){return this.apiManager.invokeApi("messages.updateDialogFiltersOrder",{order:e}).then((()=>{this.onUpdateDialogFilterOrder({_:"updateDialogFilterOrder",order:e})}))}getOutputDialogFilter(e){const t=(0,ve.Z)(e);return this.filterIncludedPinnedPeers(e),t}filterIncludedPinnedPeers(e){(0,ne.Z)(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=this.getFilter(e),s=null==a?void 0:a[t];if(!(null==s?void 0:s.length))return;const n=s.filter((e=>{const t=this.appPeersManager.getPeerId(e),a=this.reloadedPeerIds.has(t),s=this.appMessagesManager.getDialogOnly(t);return!a&&!s}));if(!n.length)return;const i=n.map((e=>{const t=this.appPeersManager.getPeerId(e);return this.appMessagesManager.reloadConversation(e).then((e=>(this.reloadedPeerIds.add(t),e?void 0:t)))}));return Promise.all(i).then((e=>{(e=e.filter(Boolean)).length}))}getDialogFilters(e=!1){return be(this,void 0,void 0,(function*(){const t=Object.keys(this.filters);if(t.length>Ie&&!e)return t.map((e=>this.filters[e])).sort(((e,t)=>e.localId-t.localId));const a=yield this.apiManager.invokeApiSingle("messages.getDialogFilters");return this.prependFilters(a).map((t=>this.saveDialogFilter(t,e))).filter(Boolean)}))}getSuggestedDialogsFilters(){return this.apiManager.invokeApi("messages.getSuggestedDialogFilters")}saveDialogFilter(e,t=!0,a){"dialogFilterDefault"===e._&&(e=this.localFilters[o.J$]),(0,ue.Z)(e),o.DZ.has(e.id)||(Me.forEach((([t,a])=>{(0,ue.Z)(e),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 s=this.filters[e.id];return s?Object.assign(s,e):this.filters[e.id]=e,this.setLocalId(e),a||(t?this.rootScope.dispatchEvent("filter_update",e):s||this.rootScope.dispatchEvent("filter_new",e)),e}setLocalId(e){void 0!==e.localId?e.localId>=this.localId&&(this.localId=e.localId+1):(e.localId=this.localId++,(0,Pe.Z)(this.filtersArr,(t=>t.id===e.id)),this.filtersArr.push(e),this.pushToState())}isFilterIdAvailable(e){return be(this,void 0,void 0,(function*(){if(o.DZ.has(e))return!0;const t=yield this.apiManager.getLimit("folders");return this.filtersArr.filter((e=>!o.DZ.has(e.id))).slice(0,t).some((t=>t.id===e))}))}}var we=a(6690),ke=a(2821);function Ae(e,t){t.forEach((t=>{Object.getOwnPropertyNames(t.prototype).forEach((a=>{const s=Object.getOwnPropertyDescriptor(t.prototype,a)||Object.create(null);"constructor"!==a&&Object.defineProperty(e.prototype,a,s)}))}))}class De{constructor(){this.updatesState={pendingPtsUpdates:[],pendingSeqUpdates:{},syncPending:null,syncLoading:null},this.channelStates={},this.attached=!1,this.log=(0,I.kg)("UPDATES",I.v9.Error|I.v9.Warn|I.v9.Log),this.debug=d.ZP,this.subscriptions={},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":{(0,ue.Z)(e),this.debug&&this.log.debug("updateShortMessage | updateShortChatMessage",Object.assign({},e));const t=e.pFlags.out,s=e.from_id||(t?this.appPeersManager.peerId:e.user_id),n=e.chat_id?e.chat_id.toPeerId(!0):e.user_id.toPeerId(!1)||this.appPeersManager.peerId;this.processUpdate({_:"updateNewMessage",message:{_:"message",pFlags:e.pFlags,id:e.id,from_id:this.appPeersManager.getOutputPeer(s.toPeerId()),peer_id:this.appPeersManager.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":this.appUsersManager.saveApiUsers(e.users,t.override),this.appChatsManager.saveApiChats(e.chats,t.override),e.updates.forEach((e=>{this.processUpdate(e,a)}));break;default:this.log.warn("Unknown update message",e)}},this._constructor(!1)}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;this.appStateManager.pushToState("updates",{seq:e.seq,pts:e.pts,date:e.date})}popPendingSeqUpdate(){var e;const t=this.updatesState,a=t.seq+1,s=t.pendingSeqUpdates[a];if(!s)return!1;const n=s.updates;for(let e=0,t=n.length;e=t.syncPending.seqAwaiting&&(t.syncPending.ptsAwaiting?delete t.syncPending.seqAwaiting:this.clearStatePendingSync(t)),!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:this.clearStatePendingSync(t)),!0}forceGetDifference(){this.updatesState.syncLoading||this.getDifference()}processLocalUpdate(e){this.processUpdateMessage({_:"updateShort",update:e})}getDifference(e=!1){const t=this.updatesState,a=t.syncLoading;a||(t.pendingSeqUpdates={},t.pendingPtsUpdates=[]),this.clearStatePendingSync(t);const s=this.apiManager.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&&this.rootScope.dispatchEvent("state_synchronizing"),"updates.differenceTooLong"!==a._){this.appUsersManager.saveApiUsers(a.users),this.appChatsManager.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)+this.timeManager.getServerTimeOffset(),delete t.seq,this.channelStates={},this.log.warn("getDifference:",a._),this.onDifferenceTooLong();if("updates.differenceSlice"===a._)return this.getDifference();this.debug&&this.log.debug("finished get diff")}));return a||this.justAName(t,s),s}clearStatePendingSync(e){e.syncPending&&(clearTimeout(e.syncPending.timeout),e.syncPending=null)}getChannelDifference(e){const t=this.getChannelState(e),a=t.syncLoading;a||(t.pendingPtsUpdates=[]),this.clearStatePendingSync(t);const s=this.debug?this.log.bindPrefix("getChannelDifference-"+e):void 0,n=this.apiManager.invokeApi("updates.getChannelDifference",{channel:this.appChatsManager.getChannelInput(e),filter:{_:"channelMessagesFilterEmpty"},pts:t.pts,limit:1e3},{timeout:2147483647}).then((a=>{if(null==s||s.debug("diff result",a),t.pts="pts"in a?a.pts:void 0,t.lastDifferenceTime=Date.now(),"updates.channelDifferenceEmpty"!==a._){if("updates.channelDifferenceTooLong"===a._)return delete this.channelStates[e],void this.saveUpdate({_:"updateChannelReload",channel_id:e});if(this.appUsersManager.saveApiUsers(a.users),this.appChatsManager.saveApiChats(a.chats),null==s||s.debug("applying",a.other_updates.length,"channel other updates"),a.other_updates.forEach((e=>{this.saveUpdate(e)})),null==s||s.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})})),null==s||s.debug("apply channel diff",t.pts),"updates.channelDifference"===a._&&!a.pFlags.final)return this.getChannelDifference(e);null==s||s.debug("finished channel get diff")}}));return a||this.justAName(t,n,e),n}onDifferenceTooLong(){this.appUsersManager.clear(),this.appChatsManager.clear(),this.appMessagesManager.clear(),this.rootScope.dispatchEvent("state_cleared")}justAName(e,t,a){e.syncLoading=t,this.rootScope.dispatchEvent("state_synchronizing",a),t.then((()=>{e.syncLoading=null,this.rootScope.dispatchEvent("state_synchronized",a)}),(()=>{e.syncLoading=null}))}addChannelState(e,t){var a,s;if(!t)throw new Error("Add channel state without pts "+e);return null!==(a=(s=this.channelStates)[e])&&void 0!==a?a:s[e]={pts:t,pendingPtsUpdates:[],syncPending:null,syncLoading:null}}getChannelState(e,t){return void 0===this.channelStates[e]&&this.addChannelState(e,t),this.channelStates[e]}processUpdate(e,t={}){var a,s,n,i;let r;switch(e._){case"updateNewChannelMessage":case"updateEditChannelMessage":r=this.appPeersManager.getPeerId(e.message.peer_id).toChatId();break;case"updateChannelTooLong":if(r=e.channel_id,!(r in this.channelStates))return!1;break;default:"channel_id"in e&&"pts"in e&&(r=e.channel_id)}const{pts:o,pts_count:p}=e,d=r?this.getChannelState(r,o):this.updatesState;if(d.syncLoading)return!1;if("updateChannelTooLong"===e._)return(!d.lastPtsUpdateTime||d.lastPtsUpdateTime{d.syncPending=null,d.syncLoading||(r?this.getChannelDifference(r):this.getDifference())}),6)}),d.syncPending.ptsAwaiting=!0,!1;if(o>d.pts)d.pts=o,f=!0,d.lastPtsUpdateTime=Date.now();else if(p)return!1;r&&t.date&&this.updatesState.date0){const a=t.seq,r=t.seqStart||a;if(r!==d.seq+1&&r>d.seq)return this.debug&&this.log.warn("Seq hole",d,null===(s=d.syncPending)||void 0===s?void 0:s.seqAwaiting),null!==(n=(i=d.pendingSeqUpdates)[r])&&void 0!==n||(i[r]={seq:a,date:t.date,updates:[]}),d.pendingSeqUpdates[r].updates.push(e),d.syncPending||(d.syncPending={timeout:E.Z.setTimeout((()=>{d.syncPending=null,d.syncLoading||this.getDifference()}),6)}),(!d.syncPending.seqAwaiting||d.syncPending.seqAwaiting{const t=this.getChannelState(e);t.syncLoading||t.lastDifferenceTime&&!(Date.now()-t.lastDifferenceTime>2500)||this.getChannelDifference(e)};null!==(a=n.interval)&&void 0!==a||(n.interval=E.Z.setInterval(i,3e3)),i()}unsubscribeFromChannelUpdates(e,t){const a=this.subscriptions[e];!(null==a?void 0:a.interval)||--a.count&&!t||(clearInterval(a.interval),a.interval=void 0,delete this.subscriptions[e])}attach(e){this.attached||(this.log("attach"),this.attached=!0,this.appStateManager.getState().then((({updates:t})=>{const a=this.appStateManager.newVersion;t&&t.pts&&t.date?(Object.assign(this.updatesState,t),this.log("will get difference",Object.assign({},t)),this.getDifference(!0)):(this.log("will get new state"),this.updatesState.syncLoading=new Promise((e=>{this.apiManager.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()}))}))),this.apiManager.setUpdatesProcessor(this.processUpdateMessage),this.setProxy(),a&&this.updatesState.syncLoading.then((()=>{return t=this,s=void 0,i=function*(){const t={en:"was updated to version",ru:"ะพะฑะฝะพะฒะปั‘ะฝ ะดะพ ะฒะตั€ัะธะธ"},s=e=>{fetch(`changelogs/${e}_${a.split(" ")[0]}.md`).then((e=>200===e.status&&e.ok&&e.text()||Promise.reject())).then((s=>{const n=t[e]||t.en;s=`**Telegram Web${_.Z.suffix} ${n} ${a}**\n\n`+s;const i=[],r={_:"updateServiceNotification",entities:i,message:(0,ke.Z)(s,i),type:"local",pFlags:{},inbox_date:Date.now()/1e3|0,media:void 0};this.processLocalUpdate(r)}))},n=(0,we.Z)([e,"en"]);for(const e of n)try{yield s(e);break}catch(e){}},new((n=void 0)||(n=Promise))((function(e,a){function r(e){try{p(i.next(e))}catch(e){a(e)}}function o(e){try{p(i.throw(e))}catch(e){a(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof n?a:new n((function(e){e(a)}))).then(r,o)}p((i=i.apply(t,s||[])).next())}));var t,s,n,i}))})))}}Ae(De,[p.Z,G]);class Ue extends G{constructor(){super(...arguments),this.savedAvatarURLs={}}after(){this.rootScope.addEventListener("avatar_update",(({peerId:e,threadId:t})=>{t||this.removeFromAvatarsCache(e)}))}isAvatarCached(e,t){const a=this.savedAvatarURLs[e];return void 0===t?!!a:!(!a||!a[t]||a[t]instanceof Promise)}removeFromAvatarsCache(e){this.savedAvatarURLs[e]&&delete this.savedAvatarURLs[e]}loadAvatar(e,t,a){var s,n;const i=null!==(s=(n=this.savedAvatarURLs)[e])&&void 0!==s?s:n[e]={};if(i[a])return i[a];{const s={_:"inputPeerPhotoFileLocation",pFlags:{},peer:this.appPeersManager.getInputPeerById(e),photo_id:t.photo_id},n={dcId:t.dc_id,location:s};"photo_big"===a&&(s.pFlags.big=!0,n.limitPart=524288);const r=this.apiFileManager.download(n);return i[a]=r.then((e=>i[a]=URL.createObjectURL(e)))}}}var Te=a(144),Ee=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 Fe extends G{after(){this.calls=new Map,i().IS_CALL_SUPPORTED&&this.apiUpdatesManager.addMultipleEventsListeners({updatePhoneCall:e=>{this.saveCall(e.phone_call)},updatePhoneCallSignalingData:e=>{this.rootScope.dispatchEvent("call_signaling",{callId:e.phone_call_id,data:e.data})}})}computeKey(e,t,a){return this.cryptoWorker.invokeCrypto("compute-dh-key",e,t,a)}saveCall(e){const t="phoneCallDiscarded"===e._,a=this.calls.get(e.id);return a?(re(a,e),t&&this.calls.delete(e.id),e=a):t||this.calls.set(e.id,e),this.rootScope.dispatchEvent("call_update",e),e}getCall(e){return this.calls.get(e)}getCallInput(e){const t=this.getCall(e);return{_:"inputPhoneCall",id:t.id,access_hash:t.access_hash}}savePhonePhoneCall(e){return this.appUsersManager.saveApiUsers(e.users),this.saveCall(e.phone_call)}generateDh(){return this.apiManager.invokeApi("messages.getDhConfig",{version:0,random_length:256}).then((e=>this.cryptoWorker.invokeCrypto("generate-dh",e)))}requestCall(e,t,a,s){return Ee(this,void 0,void 0,(function*(){const n=yield this.apiManager.invokeApi("phone.requestCall",{user_id:this.appUsersManager.getUserInput(e),protocol:t,video:s,random_id:(0,Te.d)(32),g_a_hash:a});return this.savePhonePhoneCall(n)}))}discardCall(e,t,a,s){return Ee(this,void 0,void 0,(function*(){if(!this.getCall(e))return;const n=yield this.apiManager.invokeApi("phone.discardCall",{video:s,peer:this.getCallInput(e),duration:t,reason:{_:a},connection_id:"0"});this.apiUpdatesManager.processUpdateMessage(n)}))}}var Re=a(7120),xe=a(2566);class Be extends G{constructor(){super(...arguments),this.clear=(e=!1)=>{if(e)this.chats={};else for(const e in this.chats)if(e&&!this.peersStorage.isPeerNeeded(e.toPeerId(!0))){const t=this.chats[e];this.appUsersManager.modifyUsernamesCache(t,!1),this.storage.delete(e),delete this.chats[e]}},this.onChatUpdated=(e,t)=>{var a;this.apiUpdatesManager.processUpdateMessage(t),(null===(a=null==t?void 0:t.updates)||void 0===a?void 0:a.length)&&this.isChannel(e)&&this.rootScope.dispatchEvent("invalidate_participants",e)}}after(){return this.clear(!0),this.apiUpdatesManager.addMultipleEventsListeners({updateChannelParticipant:e=>{this.apiManager.clearCache("channels.getParticipants",(t=>t.channel.channel_id===e.channel_id))},updateChatDefaultBannedRights:e=>{const t=this.appPeersManager.getPeerId(e.peer).toChatId(),a=this.chats[t];a&&(a.default_banned_rights=e.default_banned_rights,this.rootScope.dispatchEvent("chat_update",t))}}),Promise.all([this.appStateManager.getState(),this.appStoragesManager.loadStorage("chats")]).then((([e,{results:t,storage:a}])=>{this.storage=a,this.saveApiChats(t),this.peersStorage.addEventListener("peerNeeded",(e=>{e.isUser()||this.storage.getFromCache(e.toChatId())||this.storage.set({[e.toChatId()]:this.getChat(e.toChatId())})})),this.peersStorage.addEventListener("peerUnneeded",(e=>{!e.isUser()&&this.storage.getFromCache(e.toChatId())&&this.storage.delete(e.toChatId())}))}))}saveApiChats(e,t){e.saved||(e.saved=!0,e.forEach((e=>this.saveApiChat(e,t))))}saveApiChat(e,t){var a,s,n,i,r;if(!e||"chatEmpty"===e._)return;const o=this.chats[e.id];if(null!==(a=(r=e).pFlags)&&void 0!==a||(r.pFlags={}),e.pFlags.min&&void 0!==o)return;"channel"===e._&&void 0===e.participants_count&&void 0!==o&&o.participants_count&&(e.participants_count=o.participants_count),"chatPhotoEmpty"===(null===(s=e.photo)||void 0===s?void 0:s._)&&delete e.photo;const p=this.appUsersManager.setUsernameToCache(e,o),d=e.id.toPeerId(!0);if(void 0===o)this.chats[e.id]=e;else{const t=null===(n=o.photo)||void 0===n?void 0:n.photo_id,a=null===(i=e.photo)||void 0===i?void 0:i.photo_id,s=o.pFlags.forum!==e.pFlags.forum,r=t!==a||s,f=o.title!==e.title||p,c=o.pFlags.verified!==e.pFlags.verified||o.pFlags.scam!==e.pFlags.scam||o.pFlags.fake!==e.pFlags.fake;re(o,e),this.rootScope.dispatchEvent("chat_update",e.id),r&&this.rootScope.dispatchEvent("avatar_update",{peerId:d}),(f||c)&&this.rootScope.dispatchEvent("peer_title_edit",{peerId:d}),s&&this.rootScope.dispatchEvent("chat_toggle_forum",{chatId:e.id,enabled:!!e.pFlags.forum})}this.peersStorage.isPeerNeeded(d)&&this.storage.set({[e.id]:e})}getChat(e){return this.chats[e]}hasRights(e,t,a,s){return(0,Re.Z)(this.getChat(e),t,a,s)}editChatDefaultBannedRights(e,t){const a=this.getChat(e);return a.default_banned_rights&&a.default_banned_rights.until_date===t.until_date&&(0,Y.Z)(a.default_banned_rights.pFlags,t.pFlags)?Promise.resolve():this.apiManager.invokeApi("messages.editChatDefaultBannedRights",{peer:this.appPeersManager.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){var t;const a=this.chats[e];return!!(null===(t=null==a?void 0:a.pFlags)||void 0===t?void 0:t.megagroup)}isForum(e){var t;const a=this.chats[e];return!!(null===(t=null==a?void 0:a.pFlags)||void 0===t?void 0:t.forum)}isBroadcast(e){return this.isChannel(e)&&!this.isMegagroup(e)}isInChat(e){let t=!0;const a=this.getChat(e);return(!a||"channelForbidden"===a._||"chatForbidden"===a._||"chatEmpty"===a._||a.pFlags.left||a.pFlags.deactivated)&&(t=!1),t}getChannelInput(e){const t=this.getChat(e);return 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(0,fe.Z)(a)&&(t||!a.pFlags.min)}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 this.apiManager.invokeApi("channels.createChannel",e).then((e=>(this.apiUpdatesManager.processUpdateMessage(e),e.chats[0].id)))}inviteToChannel(e,t){const a=this.getChannelInput(e),s=t.map((e=>this.appUsersManager.getUserInput(e)));return this.apiManager.invokeApi("channels.inviteToChannel",{channel:a,users:s}).then(this.onChatUpdated.bind(this,e))}createChat(e,t){return this.apiManager.invokeApi("messages.createChat",{users:t.map((e=>this.appUsersManager.getUserInput(e))),title:e}).then((e=>(this.apiUpdatesManager.processUpdateMessage(e),e.chats[0].id)))}leaveChannel(e){return this.apiManager.invokeApi("channels.leaveChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}joinChannel(e){return this.apiManager.invokeApi("channels.joinChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}addChatUser(e,t,a=100){return this.apiManager.invokeApi("messages.addChatUser",{chat_id:e,user_id:this.appUsersManager.getUserInput(t),fwd_limit:a}).then(this.onChatUpdated.bind(this,e))}deleteChatUser(e,t){return this.apiManager.invokeApi("messages.deleteChatUser",{chat_id:e,user_id:this.appUsersManager.getUserInput(t)}).then(this.onChatUpdated.bind(this,e))}leaveChat(e){return this.deleteChatUser(e,this.appUsersManager.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 this.apiManager.invokeApi("channels.deleteChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}deleteChat(e){return this.apiManager.invokeApi("messages.deleteChat",{chat_id:e})}migrateChat(e){const t=this.getChat(e);return"channel"===t._?Promise.resolve(t.id):this.apiManager.invokeApi("messages.migrateChat",{chat_id:e}).then((t=>(this.onChatUpdated(e,t),t.updates.find((e=>"updateChannel"===e._)).channel_id)))}updateUsername(e,t,a){const s=this.apiManager.invokeApi("channels.updateUsername",{channel:this.getChannelInput(e),username:t});return this.refreshChatAfterRequest(e,s,a)}editPhoto(e,t){const a={_:"inputChatUploadedPhoto",file:t};let s;return s=this.isChannel(e)?this.apiManager.invokeApi("channels.editPhoto",{channel:this.getChannelInput(e),photo:a}):this.apiManager.invokeApi("messages.editChatPhoto",{chat_id:e,photo:a}),s.then(this.onChatUpdated.bind(this,e))}editTitle(e,t){let a;return a=this.isChannel(e)?this.apiManager.invokeApi("channels.editTitle",{channel:this.getChannelInput(e),title:t}):this.apiManager.invokeApi("messages.editChatTitle",{chat_id:e,title:t}),a.then(this.onChatUpdated.bind(this,e))}editAbout(e,t){const a=e.toPeerId(!0);return this.apiManager.invokeApi("messages.editChatAbout",{peer:this.appPeersManager.getInputPeerById(a),about:t}).then((e=>(e&&this.rootScope.dispatchEvent("peer_bio_edit",a),e)))}editBanned(e,t,a){const s="object"!=typeof t?t:(0,xe.Z)(t);return this.apiManager.invokeApi("channels.editBanned",{channel:this.getChannelInput(e),participant:this.appPeersManager.getInputPeerById(s),banned_rights:a}).then((n=>{if(this.onChatUpdated(e,n),"object"==typeof t){const n=Date.now()/1e3|0;this.apiUpdatesManager.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:this.appUsersManager.getSelf().id,peer:this.appPeersManager.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 this.apiManager.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=>this.apiManager.invokeApi("channels.togglePreHistoryHidden",{channel:this.getChannelInput(e),enabled:t}).then(this.onChatUpdated.bind(this,e))))}toggleSignatures(e,t){return this.apiManager.invokeApi("channels.toggleSignatures",{channel:this.getChannelInput(e),enabled:t}).then(this.onChatUpdated.bind(this,e))}toggleNoForwards(e,t){return this.apiManager.invokeApi("messages.toggleNoForwards",{peer:this.getInputPeer(e),enabled:t}).then(this.onChatUpdated.bind(this,e))}setChatAvailableReactions(e,t){const a=this.appProfileManager.getCachedFullChat(e);return a&&(a.available_reactions=t,this.rootScope.dispatchEvent("chat_full_update",e)),this.apiManager.invokeApi("messages.setChatAvailableReactions",{peer:this.getInputPeer(e),available_reactions:t}).then(this.onChatUpdated.bind(this,e))}getSendAs(e){return this.apiManager.invokeApiSingleProcess({method:"channels.getSendAs",params:{peer:this.getChannelInputPeer(e)},processResult:e=>(this.appUsersManager.saveApiUsers(e.users),this.saveApiChats(e.chats),e.peers)})}importChatInvite(e){return this.apiManager.invokeApi("messages.importChatInvite",{hash:e}).then((e=>(this.apiUpdatesManager.processUpdateMessage(e),e.chats[0].id)))}checkUsername(e,t){return this.apiManager.invokeApi("channels.checkUsername",{channel:this.getChannelInput(e),username:t})}getSponsoredMessage(e){return this.apiManager.invokeApiCacheable("channels.getSponsoredMessages",{channel:this.getChannelInput(e)},{cacheSeconds:300}).then((e=>{if("messages.sponsoredMessages"===e._){this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats);const t=e.messages.shift();e.messages.push(t)}return e}))}viewSponsoredMessage(e,t){return this.apiManager.invokeApiSingle("channels.viewSponsoredMessage",{channel:this.getChannelInput(e),random_id:t})}checkChatInvite(e){return this.apiManager.invokeApi("messages.checkChatInvite",{hash:e}).then((e=>(e.chat&&this.saveApiChat(e.chat,!0),e)))}toggleUsername(e,t,a){const s=this.apiManager.invokeApi("channels.toggleUsername",{channel:this.getChannelInput(e),username:t,active:a});return this.refreshChatAfterRequest(e,s)}reorderUsernames(e,t){const a=this.apiManager.invokeApi("channels.reorderUsernames",{channel:this.getChannelInput(e),order:t});return this.refreshChatAfterRequest(e,a)}deactivateAllUsernames(e,t){const a=this.apiManager.invokeApi("channels.deactivateAllUsernames",{channel:this.getChannelInput(e)});return this.refreshChatAfterRequest(e,a,t)}makeChannelPrivate(e){const t=[this.updateUsername(e,"",!0),this.deactivateAllUsernames(e,!0)],a=Promise.all(t).then((()=>!0));return this.refreshChatAfterRequest(e,a)}refreshChatAfterRequest(e,t,a){return a?t:t.then((t=>this.getChannels([e]).then((()=>t))))}getChannels(e){return this.apiManager.invokeApi("channels.getChannels",{id:e.map((e=>this.getChannelInput(e)))}).then((e=>{this.saveApiChats(e.chats)}))}toggleForum(e,t){return this.migrateChat(e).then((e=>this.apiManager.invokeApi("channels.toggleForum",{channel:this.getChannelInput(e),enabled:t}).then(this.onChatUpdated.bind(this,e))))}editForumTopic(e){const{chatId:t,topicId:a,title:s,iconEmojiId:n,closed:i,hidden:r}=e;return this.apiManager.invokeApi("channels.editForumTopic",{channel:this.getChannelInput(t),topic_id:(0,oe.Z)(a),title:s,icon_emoji_id:n,closed:i,hidden:r}).then(this.onChatUpdated.bind(this,t))}createForumTopic(e){return t=this,a=void 0,n=function*(){const{chatId:t,title:a,iconColor:s,iconEmojiId:n}=e,i=yield this.appProfileManager.getChannelFull(t),r=i.default_send_as&&this.appPeersManager.getInputPeerById(this.appPeersManager.getPeerId(i.default_send_as));return this.apiManager.invokeApi("channels.createForumTopic",{channel:this.getChannelInput(t),title:a,icon_color:s,icon_emoji_id:n,random_id:(0,Te.a)(),send_as:r}).then((e=>{this.onChatUpdated(t,e);const a=e.updates.find((e=>"updateNewChannelMessage"===e._));return(0,pe.Z)(a.message.id)}))},new((s=void 0)||(s=Promise))((function(e,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(r,o)}p((n=n.apply(t,a||[])).next())}));var t,a,s,n}updatePinnedForumTopic(e,t,a){return this.apiManager.invokeApi("channels.updatePinnedForumTopic",{channel:this.getChannelInput(e),topic_id:(0,oe.Z)(t),pinned:a}).then(this.onChatUpdated.bind(this,e))}}a(4762);var Ve,Oe=a(5953),Le=a(9005),Ne=a(6637),Ze=a(2423);function je(e,t){(0,Ne.Z)(e)||(e="https://"+e);const a={url:e};let s,n,i,r;if(s=e.match(/^(?:https?:\/\/)?(?:(.+?)\.)?(?:(?:web|k|z)\.)?t(?:elegram)?\.me(?:\/(.+))?/)){const t=new URL(e);let a=s[1];a&&o.BX.has(s[1])&&(a=void 0),a&&(t.pathname=a+("/"===t.pathname?"":t.pathname));const n=t.pathname.slice(1),i=n.split("/");if(i[0]&&"$"===i[0][0]&&i[0].length>1)r="invoice";else if(/^\W/.test(n)&&!Ze.kO.test(n))r="joinchat";else switch(i[0]){case"joinchat":case"addstickers":case"addemoji":case"voicechat":case"invoice":if(1!==i.length&&!a){r=i[0];break}default:if(i[1]&&i[1].match(/^\d+(?:\?(?:comment|thread)=\d+)?$/)||1===i.length){r="im";break}}}else(n=e.match(/^(?:https?:\/\/)?telesco\.pe\/([^/?]+)\/(\d+)/))?r="im":(i=e.match(/tg:(?:\/\/)?(.+?)(?:\?|$)/))&&(r="tg_"+i[1]);return window[r]||(r=void 0),a.onclick=r,a}d.GO&&(d.GO.wrapUrl=je),function(e){let t,s;function n(t){e.lastRequestedLangCode=t,e.lastRequestedNormalizedLangCode=t.split("-")[0]}function i(){if("h12"===e.timeFormat)try{const t=P({hour:"numeric",minute:"numeric",hour12:!0}),a=new Date;a.setHours(0);const s=t.format(a);e.amPmCache.am=s.split(/\s/)[1],a.setHours(12);const n=t.format(a);e.amPmCache.pm=n.split(/\s/)[1]}catch(t){console.error("cannot get am/pm",t),e.amPmCache={am:"AM",pm:"PM"}}}function r(){const e=_.Z.langPackCode;return n(e),Promise.all([a.e(104).then(a.bind(a,9104)),a.e(301).then(a.bind(a,9301)),a.e(8).then(a.bind(a,9179))]).then((([t,a,s])=>{const n=[];return p(t.default,n),p(a.default,n),f({_:"langPackDifference",from_version:0,lang_code:e,strings:n,version:0,local:!0,countries:s.default})}))}function o(t,s){e.requestedServerLanguage=!0;const n=g.managers;return Promise.all([n.apiManager.invokeApiCacheable("langpack.getLangPack",{lang_code:t,lang_pack:"web"}),!1,a.e(104).then(a.bind(a,9104)),a.e(301).then(a.bind(a,9301)),n.apiManager.invokeApiCacheable("help.getCountriesList",{lang_code:t,hash:0}),e.polyfillPromise])}function p(e,t=[]){for(const a in e){const s=e[a];"string"==typeof s?t.push({_:"langPackString",key:a,value:s}):t.push(Object.assign({_:"langPackStringPluralized",key:a},s))}return t}function f(e){return e.appVersion=_.Z.langPackVersion,h.Z.set({langPack:e}).then((()=>(c(e),e)))}function c(a){const s=e.lastRequestedLangCode;if(a.lang_code===s){try{t=new Intl.PluralRules(e.lastRequestedNormalizedLangCode)}catch(a){console.error("pluralRules error",a),t=new Intl.PluralRules(e.lastRequestedNormalizedLangCode.split("-",1)[0])}try{t=new Intl.PluralRules(a.lang_code)}catch(e){console.error("pluralRules error",e),t=new Intl.PluralRules(a.lang_code.split("-",1)[0])}e.strings.clear();for(const t of a.strings)e.strings.set(t.key,t);a.countries&&(e.countriesList.length=0,e.countriesList.push(...a.countries.countries),a.countries.countries.forEach((t=>{if(t.name){const a=t.default_name;e.strings.set(a,{_:"langPackString",key:a,value:t.name})}}))),e.lastAppliedLangCode!==s&&(g.dispatchEvent("language_change",s),e.lastAppliedLangCode=s,v.clear(),i()),Array.from(document.querySelectorAll(".i18n")).forEach((t=>{const a=e.weakMap.get(t);a&&a.update()}))}}function l(e,t,a={i:0}){const s=[];let n=0;return e.replace(/(\*\*|__)(.+?)\1|(\n)|(\[.+?\]\(.*?\))|un\d|%\d\$.|%./g,((e,i,r,o,p,d,f)=>{if(s.push(f.slice(n,d)),i){let e;switch(i){case"**":e=document.createElement("b");break;case"__":e=document.createElement("i")}e.append(...l(r,t,a)),s.push(e)}else if(o)s.push(document.createElement("br"));else if(p){const e=p.lastIndexOf("]"),n=p.slice(1,e),i=p.slice(e+2,p.length-1);let r;if(i&&(0,Ne.Z)(i)){r=document.createElement("a");const e=je(i);r.href=e.url,e.onclick&&r.setAttribute("onclick",e.onclick),r.target="_blank"}else r=t[a.i++],r instanceof DocumentFragment&&(r=r.firstChild),r.textContent="";r.append(...l(n,t,a)),s.push(r)}else t&&function(e,t,a){const s=t[a.i++];Array.isArray(s)?e.push(...s):e.push(s)}(s,t,a);return n=d+e.length,""})),n!==e.length&&s.push(e.slice(n)),s}function m(a,s=!1,n){const i=e.strings.get(a);let r;if(i)if("langPackStringPluralized"===i._&&(null==n?void 0:n.length)){let e=n[0];"string"==typeof e&&(e=+e.replace(/\D/g,"")),r=i[t.select(e)+"_value"]||i.other_value}else r="langPackString"===i._?i.value:a;else r=a;const o=l(r,n);return s?o.map((e=>e instanceof Node?e.textContent:e)).join(""):o}e.strings=new Map,e.countriesList=[],e.requestedServerLanguage=!1,e.isRTL=!1,e.setRTL=function(t){e.isRTL=t},e.getCacheLangPack=function(){return s||(s=Promise.all([h.Z.get("langPack"),e.polyfillPromise]).then((([t])=>t?(d.ZP,e.lastRequestedLangCode||n(t.lang_code),c(t),t):r())).finally((()=>{s=void 0})))},e.setTimeFormat=function(t,a=!!e.timeFormat&&e.timeFormat!==t){e.timeFormat=t,i(),a&&(v.clear(),Array.from(document.querySelectorAll(".i18n")).forEach((t=>{const a=e.weakMap.get(t);a instanceof b&&a.update()})))},e.loadLocalLangPack=r,e.loadLangPack=o,e.getStrings=function(e,t){return g.managers.apiManager.invokeApi("langpack.getStrings",{lang_pack:_.Z.langPack,lang_code:e,keys:t})},e.formatLocalStrings=p,e.getLangPack=function(e,t){return n(e),o(e).then((([e,t,a,s,n,i])=>{let r=[];return[a,s].forEach((e=>{p(e.default,r)})),r=r.concat(...[e.strings,t.strings].filter(Boolean)),e.strings=r,e.countries=n,f(e)}))},e.saveLangPack=f,e.polyfillPromise="undefined"!=typeof Intl&&void 0!==Intl.PluralRules?Promise.resolve():a.e(642).then(a.bind(a,4642)).then((e=>{window.Intl=Object.assign("undefined"!=typeof Intl?Intl:{},e.default)})),e.applyLangPack=c,e.superFormatter=l,e.format=m,e.weakMap=new WeakMap;class u{constructor(t){this.element=(null==t?void 0:t.element)||document.createElement("span"),this.element.classList.add("i18n"),this.property=null==t?void 0:t.property,t&&(t.key||t.date)&&this.update(t),e.weakMap.set(this.element,this)}}class y extends u{constructor(e={}){var t;super(Object.assign(Object.assign({},e),{property:null!==(t=e.property)&&void 0!==t?t:"innerHTML"}))}update(e){if((0,Oe.Z)(this,e),"innerHTML"===this.property)this.element.textContent="",this.element.append(...m(this.key,!1,this.args));else{const e=this.element[this.property],t=m(this.key,!0,this.args);void 0===e?this.element.dataset[this.property]=t:this.element[this.property]=t}}compareAndUpdate(e){if(this.key!==e.key||!(0,Y.Z)(this.args,e.args))return this.update(e)}}e.IntlElement=y;const v=new Map;function P(t={}){const a=JSON.stringify(t);let s=v.get(a);return s||(s=new Intl.DateTimeFormat(e.lastRequestedNormalizedLangCode+"-u-hc-"+e.timeFormat,t),v.set(a,s)),s}e.amPmCache={am:"AM",pm:"PM"};class b extends u{constructor(e){var t;super(Object.assign(Object.assign({},e),{property:null!==(t=e.property)&&void 0!==t?t:"textContent"})),this.element.setAttribute("dir","auto")}update(t){let a;if((0,Oe.Z)(this,t),this.options.hour&&this.options.minute&&2===Object.keys(this.options).length){const t=this.date.getHours();a=("0"+("h12"===e.timeFormat?t%12||12:t)).slice(-2)+":"+("0"+this.date.getMinutes()).slice(-2),"h12"===e.timeFormat&&(a+=" "+(t<12?e.amPmCache.am:e.amPmCache.pm))}else{const e=P(this.options);a=(0,Le.Z)(e.format(this.date))}this.element[this.property]=a}}e.IntlDateElement=b,e.i18n=function(e,t){return new y({key:e,args:t}).element},e.i18n_=function(e){return new y(e).element},e._i18n=function(e,t,a,s){return new y({element:e,key:t,args:a,property:s}).element}}(Ve||(Ve={}));const qe=Ve;Ve.i18n,Ve.i18n_,Ve._i18n,d.GO.I18n=Ve;const Ge=["January","February","March","April","May","June","July","August","September","October","November","December"],He=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],We=e=>{const t=new Date(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate())),a=t.getUTCDay()||7;t.setUTCDate(t.getUTCDate()+4-a);const s=new Date(Date.UTC(t.getUTCFullYear(),0,1));return Math.ceil(((t.getTime()-s.getTime())/86400+1)/7)};d.GO&&(d.GO.formatDateAccordingToTodayNew=function(e){const t=new Date,a=t.getTime()/1e3|0,s=e.getTime()/1e3|0,n={};return a-s<86400&&t.getDate()===e.getDate()?n.hour=n.minute="2-digit":t.getFullYear()!==e.getFullYear()?(n.year=n.day="numeric",n.month="2-digit"):a-s<604800&&We(t)===We(e)?n.weekday="short":(n.month="short",n.day="numeric"),new qe.IntlDateElement({date:e,options:n}).element});const ze=2013,Ke=new RegExp("20[0-9]{1,2}"),Je=new RegExp("(\\w{3,}) ([0-9]{0,4})","i"),$e=new RegExp("([0-9]{0,4}) (\\w{2,})","i"),Qe=new RegExp("^([0-9]{1,4})(\\.| |/|\\-)([0-9]{1,4})$","i"),Ye=new RegExp("^([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,4})$","i"),Xe=[31,29,31,30,31,30,31,31,30,31,30,31];function et(e,t,a){const s=(new Date).getFullYear(),n=Date.now();if(a>=ze&&a<=s){const s=new Date;s.setFullYear(a,t,1),s.setHours(0,0,0);const i=s.getTime();if(i>n)return;s.setMonth(s.getMonth()+1);const r=s.getTime()-1;e.push({title:at(i),minDate:i,maxDate:r})}}function tt(e,t,a){if(rt(t,a)){const n=(new Date).getFullYear(),i=Date.now();for(let r=n;r>=ze;r--){if(1===a&&28===t&&((s=r)%4!=0||s%100==0)&&s%400!=0)continue;const o=new Date;o.setFullYear(r,a,t+1),o.setHours(0,0,0);const p=o.getTime();if(p>i)continue;o.setFullYear(r,a,t+2),o.setHours(0,0,0);const d=o.getTime()-1;r===n?e.push({title:st(p),minDate:p,maxDate:d}):e.push({title:nt(p),minDate:p,maxDate:d})}}var s}function at(e){const t=new Date(e);return Ge[t.getMonth()].slice(0,3)+" "+t.getFullYear()}function st(e){const t=new Date(e);return Ge[t.getMonth()].slice(0,3)+" "+t.getDate()}function nt(e){const t=new Date(e);return("0"+t.getDate()).slice(-2)+"."+("0"+(t.getMonth()+1)).slice(-2)+"."+t.getFullYear()}function it(e){const t=new Date(e);return He[t.getDay()]}function rt(e,t){return t>=0&&t<12&&e>=0&&e{t[e][s]=a})),a[e]=t[e])}d.GO.fillTipDates=function(e,t){const a=e.trim().toLowerCase();if(a.length<3)return;if(0==="today".indexOf(a)){const e=new Date,a=e.getFullYear(),s=e.getMonth(),n=e.getDate();e.setFullYear(a,s,n),e.setHours(0,0,0);const i=e.getTime();e.setFullYear(a,s,n+1),e.setHours(0,0,0);const r=e.getTime()-1;return void t.push({title:"Today",minDate:i,maxDate:r})}if(0==="yesterday".indexOf(a)){const e=new Date,a=e.getFullYear(),s=e.getMonth(),n=e.getDate();e.setFullYear(a,s,n),e.setHours(0,0,0);const i=e.getTime()-864e5;e.setFullYear(a,s,n+1),e.setHours(0,0,0);const r=e.getTime()-86400001;return void t.push({title:"Yesterday",minDate:i,maxDate:r})}const s=function(e){const t=new Date;if(e.length<=3)return-1;for(let a=0;a<7;a++)if(t.setDate(t.getDate()+1),0===it(t.getTime()).toLowerCase().indexOf(e))return t.getDay();return-1}(a);if(s>=0){const e=new Date,a=e.getTime(),n=s-e.getDay();e.setDate(e.getDate()+n),e.getTime()>a&&e.setTime(e.getTime()-6048e5);const i=e.getFullYear(),r=e.getMonth(),o=e.getDate();e.setFullYear(i,r,o),e.setHours(0,0,0);const p=e.getTime();e.setFullYear(i,r,o+1),e.setHours(0,0,0);const d=e.getTime()-1;return void t.push({title:it(p),minDate:p,maxDate:d})}let n;if(null===(n=Qe.exec(a)))if(null===(n=Ye.exec(a)))if(null===(n=Ke.exec(a))){if(null!==(n=Je.exec(a))){const e=n[1],a=n[2],s=ot(e);if(s>=0){const e=+a;if(e>0&&e<=31)return void tt(t,e-1,s);if(e>=ze)return void et(t,s,e)}}if(null!==(n=$e.exec(a))){const e=n[1],a=ot(n[2]);if(a>=0){const s=+e;if(s>0&&s<=31)return void tt(t,s-1,a);s>=ze&&et(t,a,s)}}}else{let e=+a;const s=(new Date).getFullYear();if(e=e;a--){const e=new Date;e.setFullYear(a,0,1),e.setHours(0,0,0);const s=e.getTime();e.setFullYear(a+1,0,1),e.setHours(0,0,0);const n=e.getTime()-1;t.push({title:""+a,minDate:s,maxDate:n})}}else if(e<=s){const a=new Date;a.setFullYear(e,0,1),a.setHours(0,0,0);const s=a.getTime();a.setFullYear(e+1,0,1),a.setHours(0,0,0);const n=a.getTime()-1;t.push({title:""+e,minDate:s,maxDate:n})}}else{const e=n[1],a=n[3],s=n[5];if(!n[2]===n[4])return;const i=parseInt(e),r=parseInt(a)-1;let o=parseInt(s);o>=10&&o<=99&&(o+=2e3);const p=(new Date).getFullYear();if(rt(i-1,r)&&o>=ze&&o<=p){const e=new Date;e.setFullYear(o,r,i),e.setHours(0,0,0);const a=e.getTime();e.setFullYear(o,r,i+1),e.setHours(0,0,0);const s=e.getTime()-1;return void t.push({title:nt(a),minDate:a,maxDate:s})}}else{const e=n[1],a=n[3],s=parseInt(e),i=parseInt(a);if(s>0&&s<=31){if(i>=ze&&s<=12)return void et(t,s-1,i);i<=12&&tt(t,s-1,i-1)}else s>=ze&&i<=12&&et(t,i-1,s)}};var dt=a(2491),ft=a(7072),ct=a(8801),lt=a(6658);const mt={pdf:"application/pdf",tgv:"application/x-tgwallpattern",tgs:"application/x-tgsticker",json:"application/json",wav:"audio/wav",mp3:"audio/mpeg",ogg:"audio/ogg",jpeg:"image/jpeg",jpg:"image/jpeg",png:"image/png",gif:"image/gif",webp:"image/webp",mp4:"video/mp4",webm:"video/webm",mov:"video/quicktime",svg:"image/svg+xml"},gt={};for(const e in mt)gt[mt[e]]=e;let ht=0;class ut extends G{constructor(){super(...arguments),this.onServiceWorkerFail=()=>{for(const e in this.docs){const t=this.docs[e];t.supportsStreaming&&(delete t.supportsStreaming,this.thumbsStorage.deleteCacheContext(t))}}}after(){this.docs={},this.stickerCachedThumbs={},this.uploadingWallPapers={},f.Z.getInstance().addEventListener("serviceWorkerOnline",(e=>{e||this.onServiceWorkerFail()}))}saveDoc(e,t){if(!e||"documentEmpty"===e._)return;const a=this.docs[e.id];e.file_reference&&(pt("file_reference",a,e),this.referenceDatabase.saveContext(e.file_reference,t)),a||(this.docs[e.id]=e);for(let t=0,a=e.attributes.length;t"documentAttributeFilename"===e._)),a=t&&t.file_name.split(".").pop(),s=((e,t={})=>{const a=t.monthAsNumber?".":" ",s=("0"+e.getHours()).slice(-2)+":"+("0"+e.getMinutes()).slice(-2)+(t.noSeconds?"":":"+("0"+e.getSeconds()).slice(-2));return(t.leadingZero?("0"+e.getDate()).slice(-2):e.getDate())+a+(t.monthAsNumber?("0"+(e.getMonth()+1)).slice(-2):Ge[e.getMonth()])+a+e.getFullYear()+(t.noTime?"":", "+s)})(new Date(1e3*e.date),{monthAsNumber:!0,leadingZero:!0}).replace(/[:\.]/g,"-").replace(", ","_");e.file_name=`${e.type}_${s}${a?"."+a:""}`}return Ws()&&("gif"===e.type&&e.size>8e6||"audio"===e.type||"video"===e.type)?(e.supportsStreaming=!0,this.thumbsStorage.getCacheContext(e).url||this.thumbsStorage.setCacheContextURL(e,void 0,function(e,t=!1,a){let s;return s=t?"download":a?"thumb":e.supportsStreaming?"stream":"document",(0,ct.q)(s,(0,lt.Z)(e,a))}(e),0)):e.supportsStreaming=!1,e.file_name||(e.file_name=""),a?Object.assign(a,e):e}getDoc(e){return(0,fe.Z)(e)?e:this.docs[e]}downloadDoc(e,t,a){return this.apiFileManager.downloadMedia({media:e,queueId:t,onlyCache:a})}getLottieCachedThumb(e,t){const a=this.stickerCachedThumbs[e];return a&&a[t]}saveLottiePreview(e,t,a,s,n){var i,r,o;const p=this.getDoc(e);if(!p)return;const d=null!==(i=(r=this.stickerCachedThumbs)[o=p.id])&&void 0!==i?i:r[o]={},f=d[n];f&&f.w>=a&&f.h>=s||(d[n]={url:URL.createObjectURL(t),w:a,h:s})}saveWebPConvertedStrippedThumb(e,t){const a=this.getDoc(e);if(!a)return;const s=a.thumbs&&a.thumbs.find((e=>"photoStrippedSize"===e._));s&&(a.pFlags.stickerThumbConverted=!0,s.bytes=t)}prepareWallPaperUpload(e){const t="wallpaper-upload-"+ ++ht,a={_:"photoSize",h:0,w:0,location:{},size:e.size,type:o.Pt};let s={_:"document",access_hash:"",attributes:[],dc_id:0,file_reference:[],id:t,mime_type:e.type,size:e.size,date:Date.now()/1e3,pFlags:{},thumbs:[a],file_name:e.name};s=this.saveDoc(s);const n=this.thumbsStorage.setCacheContextURL(s,void 0,URL.createObjectURL(e),e.size),i={_:"wallPaper",access_hash:"",document:s,id:t,slug:t,pFlags:{}};return this.uploadingWallPapers[t]={cacheContext:n,file:e},i}uploadWallPaper(e){const{cacheContext:t,file:a}=this.uploadingWallPapers[e];return delete this.uploadingWallPapers[e],this.apiFileManager.upload({file:a,fileName:a.name}).then((e=>this.apiManager.invokeApi("account.uploadWallPaper",{file:e,mime_type:a.type,settings:{_:"wallPaperSettings",pFlags:{}}}).then((e=>((0,ue.Z)(e),e.document=this.saveDoc(e.document),this.thumbsStorage.setCacheContextURL(e.document,void 0,t.url,t.downloaded),e)))))}getGifs(){return this.apiManager.invokeApiHashable({method:"messages.getSavedGifs",processResult:e=>((0,ue.Z)(e),e.gifs.map((e=>this.saveDoc(e))))})}requestDocPart(e,t,a,s){const n=this.getDoc(e);return n?this.apiFileManager.requestFilePart(t,(0,ft.Z)(n),a,s):Promise.reject((0,X.Z)("NO_DOC"))}}var yt=a(6034);class _t extends G{constructor(){super(...arguments),this.drafts={}}after(){this.apiUpdatesManager.addMultipleEventsListeners({updateDraftMessage:e=>{const t=this.appPeersManager.getPeerId(e.peer);this.saveDraft({peerId:t,threadId:e.threadId,draft:e.draft,notify:!0})}}),h.Z.get("drafts").then((e=>{this.drafts=e||{}}))}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();this.appMessagesManager.getDialogOnly(t)||this.appMessagesManager.reloadConversation(t)}}))}getAllDrafts(){var e;return null!==(e=this.getAllDraftPromise)&&void 0!==e?e:this.getAllDraftPromise=this.apiManager.invokeApi("messages.getAllDrafts").then((e=>{(this.apiUpdatesManager.updatesState.syncLoading||Promise.resolve()).then((()=>{this.apiUpdatesManager.processUpdateMessage(e)}))}))}saveDraft({peerId:e,threadId:t,draft:a,notify:s,force:n}){const i=this.processApiDraft(a),r=this.getKey(e,t);return i?this.drafts[r]=i:delete this.drafts[r],h.Z.set({drafts:this.drafts}),s&&this.rootScope.dispatchEvent("draft_updated",{peerId:e,threadId:t,draft:i,force:n}),i}isEmptyDraft(e){return"draftMessage"!==(null==e?void 0:e._)||!(void 0!==e.reply_to_msg_id&&e.reply_to_msg_id>0)&&!e.message.length}processApiDraft(e){if(e&&"draftMessage"===e._)return e.reply_to_msg_id&&(e.reply_to_msg_id=(0,pe.Z)(e.reply_to_msg_id)),e}syncDraft(e,t,a,s=!0,n=!1){const i=this.getDraft(e,t);if((0,yt.Z)(i,a))return!0;const r={peer:this.appPeersManager.getInputPeerById(e),message:""};let o;if(this.isEmptyDraft(a))o={_:"draftMessageEmpty"};else{(0,ue.Z)(a);const e=a.message,t=a.entities;a.reply_to_msg_id&&(r.reply_to_msg_id=(0,oe.Z)(a.reply_to_msg_id)),(null==t?void 0:t.length)&&(r.entities=this.appMessagesManager.getInputEntities(t)),a.pFlags.no_webpage&&(r.no_webpage=a.pFlags.no_webpage),r.message=e}t&&(r.top_msg_id=(0,oe.Z)(t));const p=o||a;return p.date=(0,te.Z)(!0)+this.timeManager.getServerTimeOffset(),this.saveDraft({peerId:e,threadId:t,draft:p,notify:!0,force:n}),!s||this.apiManager.invokeApi("messages.saveDraft",r)}clearAllDrafts(){return this.apiManager.invokeApi("messages.clearAllDrafts").then((e=>{if(e)for(const e in this.drafts){const[t,a]=e.split("_");this.rootScope.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({peerId:e,threadId:t,draft: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({peerId:e,threadId:t,draft:n,notify:!0,force:!0})}}var vt=a(946),Pt=a(7746);const bt={keywords:{},version:0,langCode:_.Z.langPackCode};class Mt extends G{constructor(){super(...arguments),this.keywordLangPacks={},this.indexedLangPacks={},this.getKeywordsPromises={},this.recent={},this.getRecentEmojisPromises={},this.getCustomEmojiDocumentPromises=new Map}getEmojiKeywords(e=_.Z.langPackCode){const t=this.getKeywordsPromises[e];if(t)return t;const a="emojiKeywords_"+e;return this.getKeywordsPromises[e]=h.Z.get(a).then((t=>((0,fe.Z)(t)||(t={}),(0,vt.Z)(bt,t),t.langCode=e,this.keywordLangPacks[e]=t,this.apiManager.invokeApi("messages.getEmojiKeywordsDifference",{lang_code:t.langCode,from_version:t.version}).then((e=>{t.version=e.version;const s=t.keywords,n=e.keywords;for(let e=0,t=n.length;et)))))}getBothEmojiKeywords(){const e=[this.getEmojiKeywords()];return this.networkerFactory.language!==_.Z.langPackCode&&e.push(this.getEmojiKeywords(this.networkerFactory.language)),this.recent.native||e.push(this.getRecentEmojis("native")),Promise.all(e)}indexEmojis(){this.index||(this.index=new ae.Z(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 a=t[e];this.index.indexObject(a,e)}this.indexedLangPacks[e]=!0}}searchEmojis(e){let t;if(this.indexEmojis(),(e=e.toLowerCase().replace(/_/g," ")).trim()){const a=this.index.search(e);t=Array.from(a).reduce(((e,t)=>e.concat(t)),[])}else t=this.recent.native.concat(Mt.POPULAR_EMOJI).slice(0,32);return t=Array.from(new Set(t)),t}getRecentEmojis(e){var t;const a=this.getRecentEmojisPromises;return null!==(t=a[e])&&void 0!==t?t:a[e]=this.appStateManager.getState().then((t=>{let a=[];if("native"===e){const{recentEmoji:e}=t;a=Array.isArray(e)&&e.length?e:Mt.POPULAR_EMOJI}else{const{recentCustomEmoji:e}=t;a=Array.isArray(e)&&e.length?e:[]}return this.recent[e]=a}))}pushRecentEmoji(e){const t=e.docId?"custom":"native";e.emoji=(0,Pt.Z)(e.emoji),this.getRecentEmojis(t).then((a=>{const s=e.docId||e.emoji;(0,M.Z)(a,s),a.unshift(s),a.splice(32,a.length-32),this.appStateManager.pushToState("custom"===t?"recentCustomEmoji":"recentEmoji",a),this.rootScope.dispatchEvent("emoji_recent",e)}))}getCustomEmojiDocuments(e){return e.length?this.apiManager.invokeApi("messages.getCustomEmojiDocuments",{document_id:e}).then((e=>e.map((e=>this.appDocsManager.saveDoc(e,{type:"customEmoji",docId:e.id}))))):Promise.resolve([])}getCachedCustomEmojiDocuments(e){return e.map((e=>this.appDocsManager.getDoc(e)))}setDebouncedGetCustomEmojiDocuments(){!this.getCustomEmojiDocumentsPromise&&this.getCustomEmojiDocumentPromises.size&&(this.getCustomEmojiDocumentsPromise=(0,P.Z)(0).then((()=>{const e=[...this.getCustomEmojiDocumentPromises.keys()],t=[];do{const a=e.splice(0,100),s=this.getCustomEmojiDocuments(a).then((e=>{e.forEach(((e,t)=>{const s=a[t],n=this.getCustomEmojiDocumentPromises.get(s);this.getCustomEmojiDocumentPromises.delete(s),n.resolve(e)}))}));t.push(s)}while(e.length);return Promise.all(t)})).finally((()=>{this.getCustomEmojiDocumentsPromise=void 0,this.setDebouncedGetCustomEmojiDocuments()})))}getCustomEmojiDocument(e){let t=this.getCustomEmojiDocumentPromises.get(e);if(t)return t;return this.appDocsManager.getDoc(e)||(t=(0,v.Z)(),this.getCustomEmojiDocumentPromises.set(e,t),this.setDebouncedGetCustomEmojiDocuments(),t)}getCustomEmojis(){return this.appStickersManager.getEmojiStickers()}}Mt.POPULAR_EMOJI=["๐Ÿ˜‚","๐Ÿ˜˜","โค๏ธ","๐Ÿ˜","๐Ÿ˜Š","๐Ÿ˜","๐Ÿ‘","โ˜บ๏ธ","๐Ÿ˜”","๐Ÿ˜„","๐Ÿ˜ญ","๐Ÿ’‹","๐Ÿ˜’","๐Ÿ˜ณ","๐Ÿ˜œ","๐Ÿ™ˆ","๐Ÿ˜‰","๐Ÿ˜ƒ","๐Ÿ˜ข","๐Ÿ˜","๐Ÿ˜ฑ","๐Ÿ˜ก","๐Ÿ˜","๐Ÿ˜ž","๐Ÿ˜…","๐Ÿ˜š","๐Ÿ™Š","๐Ÿ˜Œ","๐Ÿ˜€","๐Ÿ˜‹","๐Ÿ˜†","๐Ÿ‘Œ","๐Ÿ˜","๐Ÿ˜•"];var It=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 St extends G{after(){this.log=(0,I.kg)("GROUP-CALLS"),this.groupCalls=new Map,this.participants=new Map,this.nextOffsets=new Map,this.apiUpdatesManager.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)}}),this.rootScope.addEventListener("group_call_update",(e=>{"groupCallDiscarded"===e._&&this.participants.delete(e.id)}))}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 s=this.getCachedParticipants(e),n=(0,le.Z)(t.peer),i=s.get(n),r=t.pFlags.left;if(!i&&r)return;t.pFlags.muted||t.pFlags.can_self_unmute||(t.pFlags.can_self_unmute=!0),i?(re(i,t),t=i):s.set(n,t);const o=this.getGroupCall(e);if("groupCall"===(null==o?void 0:o._)){let e=!1;r?(--o.participants_count,e=!0):!t.pFlags.just_joined||i||t.pFlags.self||(++o.participants_count,e=!0),e&&this.rootScope.dispatchEvent("group_call_update",o)}r&&s.delete(n),this.rootScope.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 It(this,void 0,void 0,(function*(){this.saveApiParticipant(e,t);const s=t.pFlags.self?o.NM:(0,le.Z)(t.peer),n=yield this.apiManager.invokeApiSingle("phone.editGroupCallParticipant",{call:this.getGroupCallInput(e),participant:s===o.NM?this.appPeersManager.getInputPeerSelf():this.appPeersManager.getInputPeerById(s),muted:a.muted,volume:a.volume,raise_hand:a.raiseHand,video_paused:a.videoPaused,video_stopped:a.videoStopped,presentation_paused:a.presentationPaused});this.apiUpdatesManager.processUpdateMessage(n)}))}getGroupCall(e){return this.groupCalls.get(e)}getGroupCallFull(e,t){return It(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 this.apiManager.invokeApiSingleProcess({method:"phone.getGroupCall",params:{call:this.getGroupCallInput(e),limit:s},processResult:t=>{this.appUsersManager.saveApiUsers(t.users),this.appChatsManager.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&&re(a,e),e=a):this.groupCalls.set(e.id,e),s&&this.rootScope.dispatchEvent("group_call_update",e),e}createGroupCall(e,t,a){return It(this,void 0,void 0,(function*(){const s=yield this.apiManager.invokeApi("phone.createGroupCall",{peer:this.appPeersManager.getInputPeerById(e.toPeerId(!0)),random_id:(0,Te.d)(32),schedule_date:t,title:a});return this.apiUpdatesManager.processUpdateMessage(s),s.updates.find((e=>"updateGroupCall"===e._)).call}))}getGroupCallInput(e){const t=this.getGroupCall(e);return{_:"inputGroupCall",id:t.id,access_hash:t.access_hash}}getGroupCallParticipants(e){return It(this,void 0,void 0,(function*(){const{nextOffset:t,setNextOffset:a}=this.prepareToSavingNextOffset(e);return""!==t&&(yield this.apiManager.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;this.appChatsManager.saveApiChats(t.chats),this.appUsersManager.saveApiUsers(t.users),this.saveApiParticipants(e,t.participants),a(s)}})),{participants:this.getCachedParticipants(e),isEnd:""===this.nextOffsets.get(e)}}))}hangUp(e,t){const a=this.getGroupCallInput(e);let s;return s="boolean"==typeof t&&t?this.apiManager.invokeApi("phone.discardGroupCall",{call:a}):"number"==typeof t?this.apiManager.invokeApi("phone.leaveGroupCall",{call:a,source:t}):this.apiManager.invokeApi("phone.joinGroupCall",{call:a,join_as:this.appPeersManager.getInputPeerSelf(),muted:!0,video_stopped:!0,params:{_:"dataJSON",data:""}}),s.then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}joinGroupCall(e,t,a){return It(this,void 0,void 0,(function*(){const s=this.getGroupCallInput(e);let n;if("main"===a.type){const i={call:s,join_as:this.appPeersManager.getInputPeerSelf(),params:t,muted:a.isMuted,video_stopped:!a.joinVideo};n=this.apiManager.invokeApi("phone.joinGroupCall",i),this.log(`[api] joinGroupCall id=${e}`,i)}else{const a={call:s,params:t};n=this.apiManager.invokeApi("phone.joinGroupCallPresentation",a),this.log(`[api] joinGroupCallPresentation id=${e}`,a)}const i=yield n;return this.apiUpdatesManager.processUpdateMessage(i),i.updates.find((e=>"updateGroupCallConnection"===e._))}))}leaveGroupCallPresentation(e){return this.apiManager.invokeApi("phone.leaveGroupCallPresentation",{call:this.getGroupCallInput(e)}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}}function Ct(e){return{_:"inputPhoto",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference}}function wt(e){return{_:"inputMediaPhoto",id:Ct(e),ttl_seconds:0,pFlags:{}}}var kt=a(515);function At(e){return{_:"inputMediaDocument",id:{_:"inputDocument",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference},ttl_seconds:0,pFlags:{}}}class Dt extends G{constructor(){super(...arguments),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,a="",s="",n){return this.apiManager.invokeApi("messages.getInlineBotResults",{bot:this.appUsersManager.getUserInput(t),peer:this.appPeersManager.getInputPeerById(e),query:a,geo_point:n?this.getGeoInput(n):void 0,offset:s},{stopTime:-1,noErrorBox:!0}).then((e=>{const t=e.query_id;return e.results.forEach((e=>{"botInlineMediaResult"===e._&&(e.document&&(e.document=this.appDocsManager.saveDoc(e.document)),e.photo&&(e.photo=this.appPhotosManager.savePhoto(e.photo))),this.inlineResults[(0,kt.Z)(t,e.id)]=e})),e}))}pushPopularBot(e){this.appUsersManager.getTopPeers("bots_inline").then((t=>{const a=e.toPeerId(),s=t.findIndex((e=>e.id===a));let n;n=-1!==s?t[s]:{id:a,rating:0},++n.rating,(0,ie.Z)(t,n,"rating"),this.appStateManager.setKeyValueToStorage("topPeersCache")}))}switchToPM(e,t,a){return this.setHash[t]={peerId:e,time:Date.now()},this.appMessagesManager.startBot(t,void 0,a)}checkSwitchReturn(e){return t=this,a=void 0,n=function*(){const t=this.appUsersManager.getUser(e);if(!t||!t.pFlags.bot||!t.bot_inline_placeholder)return;const a=this.setHash[e];return a&&(delete this.setHash[e],Date.now()-a.time<36e5)?a.peerId:void 0},new((s=void 0)||(s=Promise))((function(e,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(r,o)}p((n=n.apply(t,a||[])).next())}));var t,a,s,n}switchInlineQuery(e,t,a,s){this.appDraftsManager.setDraft(e,t,"@"+this.appPeersManager.getPeerUsername(a.toPeerId())+" "+s)}callbackButtonClick(e,t,a){return this.apiManager.invokeApi("messages.getBotCallbackAnswer",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(t),data:a.data},{stopTime:-1,noErrorBox:!0})}sendInlineResult(e,t,a,s={}){const n=this.inlineResults[a];if(!n)return;this.pushPopularBot(t);const i=a.split("_"),r=i.shift(),o=i.join("_");if(s.viaBotId=t,s.queryId=r,s.resultId=o,n.send_message.reply_markup&&(s.replyMarkup=n.send_message.reply_markup),"botInlineMessageText"===n.send_message._)s.entities=n.send_message.entities,this.appMessagesManager.sendText(e,n.send_message.message,s);else{let t,a,i="";const r=n.send_message;switch(r._){case"botInlineMessageMediaAuto":if(i=r.message,"botInlineMediaResult"===n._){const{document:e,photo:a}=n;t=e?At(e):wt(a)}break;case"botInlineMessageMediaGeo":t={_:"inputMediaGeoPoint",geo_point:this.getGeoInput(r.geo)},s.geoPoint=r.geo;break;case"botInlineMessageMediaVenue":t={_:"inputMediaVenue",geo_point:this.getGeoInput(r.geo),title:r.title,address:r.address,provider:r.provider,venue_id:r.venue_id,venue_type:r.venue_type},s.geoPoint=r.geo;break;case"botInlineMessageMediaContact":t={_:"inputMediaContact",phone_number:r.phone_number,first_name:r.first_name,last_name:r.last_name,vcard:r.vcard};break;case"botInlineMessageMediaInvoice":a={_:"messageMediaInvoice",title:r.title,description:r.description,photo:r.photo,currency:r.currency,total_amount:r.total_amount,pFlags:{shipping_address_requested:r.pFlags.shipping_address_requested,test:r.pFlags.test},start_param:void 0}}!t&&a&&(t={_:"messageMediaPending",messageMedia:a}),this.appMessagesManager.sendOther(e,t,s)}}}var Ut=a(7082);class Tt{constructor(){this.tempNum=0}generateTempMessageId(e){const t=++this.tempNum;return(0,pe.Z)(e)+(t&Ut.o-1)}}var Et=a(4421),Ft=a(3624),Rt=a(7401);function xt(e,t){if(e.length{let o=e.slice(s,r);const p=n++;o.length>t&&(xt(o.slice(t),t).forEach((e=>{i[n++]=e})),o=o.slice(0,t)),s=r,a=0,i[p]=(i[p]||"")+o};let o=0;for(;;){let s=e.indexOf(" ",o);if(-1===s){o!==e.length-1&&r();break}s+=" ".length;const n=s-o;a+n>t&&r(a),o=s,a+=n}return i}var Bt=a(5701),Vt=a(7667),Ot=a(6241),Lt=a(6535),Nt=a(6566),Zt=a(2202),jt=a(319);const qt=new class{constructor(){this.tabs=new Map}start(){f.Z.getInstance().addEventListener("tabState",((e,t)=>{this.tabs.get(t).state=e}))}getTabs(){return[...this.tabs.values()].filter((e=>!!e.state))}addTab(e){const t={source:e,state:void 0};this.tabs.set(e,t)}deleteTab(e){this.tabs.delete(e)}};d.GO&&(d.GO.appTabsManager=qt);const Gt=qt;var Ht=a(2381),Wt=a(13);function zt(e){return{_:"inputDocument",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference}}var Kt=a(5285),Jt=a(5102);function $t(e,t,a){a?e[t]=!0:delete e[t]}var Qt=a(4993),Yt=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 Xt=e=>{e()},ea=!0;class ta extends G{constructor(){super(...arguments),this.pendingByRandomId={},this.pendingByMessageId={},this.pendingAfterMsgs={},this.pendingTopMsgs={},this.tempFinalizeCallbacks={},this.sendSmthLazyLoadQueue=new Et.Z(10),this.needSingleMessages=new Map,this.extendedMedia=new Map,this.maxSeenId=0,this.migratedFromTo={},this.migratedToFrom={},this.newDialogsToHandle=new Map,this.newUpdatesAfterReloadToHandle={},this.notificationsToHandle={},this.reloadConversationsPeers=new Map,this.log=(0,I.kg)("MESSAGES",I.v9.Error|I.v9.Debug|I.v9.Log|I.v9.Warn),this.groupedTempId=0,this.typings={},this.unreadMentions={},this.goToNextMentionPromises={},this.batchUpdates={},this.clear=e=>{this.middleware?this.middleware.clean():(this.middleware=(0,Ft.k)(),this.uploadFilePromises={}),this.messagesStorageByPeerId={},this.groupedMessagesStorage={},this.scheduledMessagesStorage={},this.historiesStorage={},this.threadsStorage={},this.searchesStorage={},this.pinnedMessages={},this.threadsServiceMessagesIdsStorage={},this.threadsToReplies={},this.dialogsStorage&&this.dialogsStorage.clear(e),this.filtersStorage&&this.filtersStorage.clear(e)},this.handleNewDialogs=()=>{let e=0;const t=new Map,a=a=>{var s;const{peerId:n}=a;this.dialogsStorage.pushDialog({dialog:a}),this.appPeersManager.isChannel(n)||(e=Math.max(e,a.top_message||0));let i=t.get(n);i||t.set(n,i={}),"forumTopic"===a._?(null!==(s=i.topics)&&void 0!==s?s:i.topics=new Map).set(a.id,a):i.dialog=a};for(const[e,t]of this.newDialogsToHandle){const s="dialog"in t,{dialog:n,topics:i}=t;s&&(n?this.dialogsStorage.getDialogOnly(e)&&a(n):this.reloadConversation(e.toPeerId())),i&&(null==i||i.forEach(((t,s)=>{t?this.dialogsStorage.getForumTopic(e,s)&&a(t):this.dialogsStorage.getForumTopicById(e,s)})))}0!==e&&this.incrementMaxSeenId(e),this.rootScope.dispatchEvent("dialogs_multiupdate",t),this.newDialogsToHandle.clear()},this.handleNotifications=()=>{E.Z.clearTimeout(this.notificationsHandlePromise),this.notificationsHandlePromise=void 0;for(const e in this.notificationsToHandle){const[t,a]=e.split("_"),s=this.notificationsToHandle[e];this.getNotifyPeerSettings(t.toPeerId(),a?+a:void 0).then((({muted:e,peerTypeNotifySettings:t})=>{const a=s.topMessage;e&&!a.pFlags.mentioned||!a.pFlags.unread||a.pFlags.unread&&this.notifyAboutMessage(a,{fwdCount:s.fwdCount,peerTypeNotifySettings:t})}))}this.notificationsToHandle={}},this.onUpdateMessageId=e=>{const t=e.random_id;if(!this.pendingByRandomId[t])return;const a=(0,pe.Z)(e.id);this.pendingByMessageId[a]=t},this.onUpdateNewMessage=e=>{var t,a,s,n;const i=e.message,r=this.getMessagePeer(i),p=this.getHistoryMessagesStorage(r),d="updateNewDiscussionMessage"===e._;this.saveMessages([i],{storage:this.createMessageStorage(r,"history")});const f=this.appPeersManager.isForum(r),c=this.getThreadKey(i),l=c?+c.split("_")[1]:void 0,m=this.dialogsStorage.getDialogOrTopic(r,d?l:void 0);if((!m||this.reloadConversationsPeers.has(r))&&!d){let t=!0;if(r.isAnyChat()&&(t=this.appChatsManager.isInChat(r.toChatId())),t)return void this.handleNewUpdateAfterReload(r,e)}if(l&&!d){const e=null===(t=this.threadsStorage[r])||void 0===t?void 0:t[l],a={_:"updateNewDiscussionMessage",message:i};this.appChatsManager.isForum(r.toChatId())&&!this.dialogsStorage.getForumTopic(r,l)?this.handleNewUpdateAfterReload(r,a,l):e&&this.onUpdateNewMessage(a)}if("messageService"===i._){const{action:e}=i;if("messageActionPaymentSent"===e._&&i.reply_to&&this.rootScope.dispatchEvent("payment_sent",{peerId:i.reply_to.reply_to_peer_id?this.appPeersManager.getPeerId(i.reply_to.reply_to_peer_id):i.peerId,mid:i.reply_to_mid,receiptMessage:i}),"messageActionTopicEdit"===e._&&!d){const t=this.dialogsStorage.getForumTopic(r,l);if(t){const a=(0,ve.Z)(t);void 0!==e.title&&(t.title=e.title),void 0!==e.closed&&$t(t.pFlags,"closed",e.closed),void 0!==e.hidden&&$t(t.pFlags,"hidden",e.hidden),void 0!==e.icon_emoji_id&&(t.icon_emoji_id=e.icon_emoji_id),this.scheduleHandleNewDialogs(r,t),this.dialogsStorage.processTopicUpdate(t,a)}else this.dialogsStorage.getForumTopicById(r,l)}}this.saveMessages([i],{storage:p}),this.checkPendingMessage(i);const g=this.getHistoryStorage(r,d?l:void 0);d||this.updateMessageRepliesIfNeeded(i);const h=e.ignoreExisting;if(g.history.findSlice(i.mid)){if(!h)return!1}else{const e=g.history.first;if(e.isEnd(se.D.Bottom)){let t=0;for(const a=e.length;te[t]);++t);e.splice(t,0,i.mid)}else g.history.unshift(i.mid);null!==g.count&&++g.count}(!g.maxId||i.mid>g.maxId)&&(g.maxId=i.mid),this.mergeReplyKeyboard(g,i)&&this.rootScope.dispatchEvent("history_reply_markup",{peerId:r});const u=i.fromId;if(u.isUser()&&!i.pFlags.out&&i.from_id){this.appUsersManager.forceUserOnline(u,i.date);const e={_:"sendMessageCancelAction"};let t;t=r.isUser()?{_:"updateUserTyping",action:e,user_id:u}:this.appPeersManager.isChannel(r)?{_:"updateChannelUserTyping",action:e,channel_id:r.toChatId(),from_id:this.appPeersManager.getOutputPeer(u),top_msg_id:l?(0,oe.Z)(l):void 0}:{_:"updateChatUserTyping",action:e,chat_id:r.toChatId(),from_id:this.appPeersManager.getOutputPeer(u)},this.apiUpdatesManager.processLocalUpdate(t)}this.handleNewMessage(i);const y="forumTopic"===(null==m?void 0:m._);if(d&&!y||!m)return;const _=!i.pFlags.out&&i.pFlags.unread;if(_&&i.mid>m.top_message){const e=this.dialogsStorage.prepareDialogUnreadCountModifying(m);++m.unread_count,i.pFlags.mentioned&&(++m.unread_mentions_count,this.modifyCachedMentions(r,i.mid,!0,y?l:void 0)),e()}if(i.mid>=m.top_message&&this.setDialogTopMessage(i,m),(!d&&!f||y)&&_){const e=c||r,t=null!==(a=(n=this.notificationsToHandle)[e])&&void 0!==a?a:n[e]={fwdCount:0,fromId:o.NM};t.fromId!==u&&(t.fromId=u,t.fwdCount=0),i.fwd_from&&++t.fwdCount,t.topMessage=i,null!==(s=this.notificationsHandlePromise)&&void 0!==s||(this.notificationsHandlePromise=E.Z.setTimeout(this.handleNotifications,0))}},this.onUpdateMessageReactions=e=>{const{peer:t,msg_id:a,reactions:s}=e,n=(0,pe.Z)(a),i=this.appPeersManager.getPeerId(t),r=this.getMessageByPeer(i,n);if("message"!==(null==r?void 0:r._))return;const o=null==s?void 0:s.recent_reactions;if((null==o?void 0:o.length)&&r.pFlags.out){const e=o[o.length-1],t=r.reactions,a=null==t?void 0:t.recent_reactions;this.appPeersManager.getPeerId(e.peer_id)===this.appPeersManager.peerId||a&&!(a.length<=o.length)||a&&(0,Y.Z)(e,a[a.length-1])||this.getNotifyPeerSettings(i).then((({muted:t,peerTypeNotifySettings:a})=>{a.show_previews&&this.notifyAboutMessage(r,{peerReaction:e,peerTypeNotifySettings:a})}))}const p=r.peerId+"_"+r.mid;this.pushBatchUpdate("messages_reactions",this.batchUpdateReactions,p,(()=>(0,ve.Z)(r.reactions))),r.reactions=s,e.local||this.setDialogToStateIfMessageIsTop(r)},this.onUpdateDialogUnreadMark=e=>{const t=this.appPeersManager.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(),this.dialogsStorage.setDialogToState(a),this.rootScope.dispatchEvent("dialogs_multiupdate",new Map([[t,{dialog:a}]]))}else this.scheduleHandleNewDialogs(t)},this.onUpdateEditMessage=e=>{var t,a;const s=e.message,n=this.getMessagePeer(s),i=(0,pe.Z)(s.id),r=this.getHistoryMessagesStorage(n);if(!r.has(i))return;const o=this.getMessageFromStorage(r,i);this.saveMessages([s],{storage:r});const p=this.getMessageFromStorage(r,i);this.handleEditedMessage(o,p,r);const d=this.getDialogOnly(n),f=(null==d?void 0:d.top_message)===i;if(s.clear_history)f&&this.rootScope.dispatchEvent("dialog_flush",{peerId:n,dialog:d});else{let e=!0;if("message"===(null==o?void 0:o._)&&!(0,Y.Z)(o.reactions,p.reactions)){const t=p.reactions;p.reactions=o.reactions,this.apiUpdatesManager.processLocalUpdate({_:"updateMessageReactions",peer:this.appPeersManager.getOutputPeer(n),msg_id:s.id,reactions:t}),e=!1}e&&this.rootScope.dispatchEvent("message_edit",{storageKey:r.key,peerId:n,mid:i,message:s}),f&&this.dialogsStorage.setDialogToState(d);const c=new Map,l=()=>{let e=c.get(n);return e||c.set(n,e={}),e};(f||s.grouped_id)&&d&&(l().dialog=d);const m=this.getThreadKey(s);if(m){const e=+m.split("_")[1],s=this.dialogsStorage.getForumTopic(n,e);s&&(null!==(t=(a=l()).topics)&&void 0!==t?t:a.topics=new Map).set(e,s)}c.size&&this.rootScope.dispatchEvent("dialogs_multiupdate",c)}},this.onUpdateReadHistory=e=>{const t=e.channel_id,a=(0,pe.Z)(e.max_id||e.read_max_id),s=(0,pe.Z)(e.top_msg_id),n=t?t.toPeerId(!0):this.appPeersManager.getPeerId(e.peer),i="updateReadHistoryOutbox"===e._||"updateReadChannelOutbox"===e._||"updateReadChannelDiscussionOutbox"===e._||void 0,r=!!t&&this.appChatsManager.isForum(t),o=this.getHistoryMessagesStorage(n),p=(0,Rt.Z)(o,"desc"),d=s&&r?this.dialogsStorage.getForumTopic(n,s):this.getDialogOnly(n),f=e.still_unread_count;let c=0,l=0,m=!1;const g=this.getHistoryStorage(n,s);if(n.isUser()&&i&&this.appUsersManager.forceUserOnline(n.toUserId()),s){const e=this.threadsToReplies[n+"_"+s];if(e){const[t,a]=e.split("_");this.updateMessage(t.toPeerId(),+a,"replies_updated")}}const h=d&&this.dialogsStorage.prepareDialogUnreadCountModifying(d),u=this.getReadMaxIdIfUnread(n,s);for(let e=0,t=p.length;ea)continue;const g=o.get(t);if(g.pFlags.out!==i)continue;const h=(0,Qt.Z)(g,r);if(!s||h===s){if(!(g.pFlags.unread||u&&u=d.top_message||!u?e=0:c&&d.top_message>a&&(e=c),void 0!==e&&(d.unread_count=e),(l<0||!d.unread_count)&&(d.unread_mentions_count=0)}null==h||h(),this.dialogsStorage.processDialogForFilters(d),this.rootScope.dispatchEvent("dialog_unread",{peerId:n,dialog:d}),this.dialogsStorage.setDialogToState(d),m||void 0!==f||i||!d.unread_count||("forumTopic"===d._?this.dialogsStorage.getForumTopicById(n,s):this.reloadConversation(n))}if(m&&this.rootScope.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("_");this.rootScope.dispatchEvent("replies_updated",this.getMessageByPeer(e.toPeerId(),+a))}}},this.onUpdateReadMessagesContents=e=>{const t=e.channel_id,a=e.top_msg_id,s=a?(0,pe.Z)(a):void 0,n=e.messages.map((e=>(0,pe.Z)(e))),i=t?t.toPeerId(!0):this.findPeerIdByMids(n);for(let e=0,t=n.length;e{const t=e.channel_id.toPeerId(!0),a=this.getHistoryStorage(t).history.slice,s=(0,pe.Z)(e.available_min_id),n=a.filter((e=>e<=s));e.messages=n,this.onUpdateDeleteMessages(e)},this.onUpdateDeleteMessages=e=>{var t;const a=e.channel_id,s=e.messages.map((e=>(0,pe.Z)(e))),n=a?a.toPeerId(!0):this.findPeerIdByMids(s);if(!n)return;this.apiManager.clearCache("messages.getSearchCounters",(e=>this.appPeersManager.getPeerId(e.peer)===n));const i=new Set,r=new Map;for(const e of s){const a=this.getMessageByPeer(n,e),s=this.getThreadKey(a);if(!s)continue;const o=+s.split("_")[1];if((null===(t=this.threadsStorage[n])||void 0===t?void 0:t[o])&&(i.add(s),!r.has(o))){const e=this.dialogsStorage.getForumTopic(n,o);e&&r.set(o,e)}}const o=this.handleDeletedMessages(n,this.getHistoryMessagesStorage(n),s),p=Array.from(i).map((e=>{const[t,a]=e.split("_");return this.getHistoryStorage(t.toPeerId(),+a)}));[this.getHistoryStorage(n),...p].forEach((e=>{for(const t of o.msgs)e.history.delete(t);o.count&&e.count&&(e.count=Math.max(0,e.count-o.count))})),this.rootScope.dispatchEvent("history_delete",{peerId:n,msgs:o.msgs});const d=[...r.values()],f=this.getDialogOnly(n);f&&d.unshift(f),d.forEach((e=>{const t="forumTopic"===e._,a=o.unreadMentions||o.unread,s=a&&this.dialogsStorage.prepareDialogUnreadCountModifying(e);if(o.unread&&(e.unread_count=Math.max(0,e.unread_count-o.unread)),o.unreadMentions&&(e.unread_mentions_count=e.unread_count?Math.max(0,e.unread_mentions_count-o.unreadMentions):0),a&&(s(),t||this.rootScope.dispatchEvent("dialog_unread",{peerId:n,dialog:e})),o.msgs.has(e.top_message)){const a=this.getHistoryStorage(e.peerId,t?e.id:void 0).history.first;if(a.isEnd(se.D.Bottom)&&a.length){const t=a[0],s=this.getMessageByPeer(n,t);this.setDialogTopMessage(s,e)}else t?this.dialogsStorage.getForumTopicById(n,e.id):this.reloadConversation(n)}}))},this.onUpdateChannel=e=>{const t=e.channel_id,a=t.toPeerId(!0),s=this.appChatsManager.getChat(t),n=this.appChatsManager.isInChat(t);(!!(0,Jt.Z)(s)[0]||!s.pFlags.left)!=(void 0!==this.historiesStorage[a])&&(delete this.historiesStorage[a],this.rootScope.dispatchEvent("history_forbidden",a)),!!this.getDialogOnly(a)!==n&&(n?this.reloadConversation(a):this.dialogsStorage.dropDialogOnDeletion(a)),this.rootScope.dispatchEvent("channel_update",t)},this.onUpdateChannelReload=e=>{const t=e.channel_id.toPeerId(!0);this.flushStoragesByPeerId(t),Promise.all([this.reloadConversation(t)]).then((()=>{this.rootScope.dispatchEvent("history_reload",t)}))},this.onUpdateChannelMessageViews=e=>{var t;const a=e.views,s=null!==(t=e.peerId)&&void 0!==t?t:e.channel_id.toPeerId(!0),n=(0,pe.Z)(e.id),i=this.getMessageByPeer(s,n);void 0!==(null==i?void 0:i.views)&&i.views{var t;if(null===(t=e.pFlags)||void 0===t?void 0:t.popup)return void this.rootScope.dispatchEvent("service_notification",e);const a=o.yF,s=a,n=this.generateTempMessageId(s),i={_:"message",id:n,from_id:this.appPeersManager.getOutputPeer(a),peer_id:this.appPeersManager.getOutputPeer(s),pFlags:{unread:!0},date:(e.inbox_date||(0,te.Z)(!0))+this.timeManager.getServerTimeOffset(),message:e.message,media:e.media,entities:e.entities};this.appUsersManager.hasUser(a)||this.appUsersManager.saveApiUsers([{_:"user",id:a,pFlags:{verified:!0},access_hash:"0",first_name:"Telegram",phone:"42777"}]),this.saveMessages([i],{isOutgoing:!0}),e.inbox_date&&(this.pendingTopMsgs[s]=n,this.onUpdateNewMessage({_:"updateNewMessage",message:i,pts:void 0,pts_count:void 0}))},this.onUpdatePinnedMessages=e=>{const t="updatePinnedChannelMessages"===e._?e.channel_id:void 0,a=t?t.toPeerId(!0):this.appPeersManager.getPeerId(e.peer),s=e.messages.map((e=>(0,pe.Z)(e))),n=this.getHistoryMessagesStorage(a),i=s.filter((e=>!n.has(e)));(i.length?Promise.all(i.map((e=>this.reloadMessages(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[this.getPinnedMessagesKey(a)],this.appStateManager.getState().then((e=>{delete e.hiddenPinnedMessages[a],this.rootScope.dispatchEvent("peer_pinned_messages",{peerId:a,mids:s,pinned:i})}))}))},this.onUpdateNotifySettings=e=>{const{peer:t,notify_settings:a}=e,s="notifyForumTopic"===t._;if("notifyPeer"!==t._&&!s)return;const n=this.appPeersManager.getPeerId(t.peer),i=this.dialogsStorage.getDialogOrTopic(n,s?(0,pe.Z)(t.top_msg_id):void 0);i&&(i.notify_settings=a,this.rootScope.dispatchEvent("dialog_notify_settings",i),this.dialogsStorage.setDialogToState(i))},this.onUpdateNewScheduledMessage=e=>{const t=e.message,a=this.getMessagePeer(t),s=this.scheduledMessagesStorage[a];if(!s)return;const n=(0,pe.Z)(t.id),i=this.getMessageFromStorage(s,n);this.saveMessages([t],{storage:s,isScheduled:!0});const r=this.getMessageFromStorage(s,n);i?(this.handleEditedMessage(i,r,s),this.rootScope.dispatchEvent("message_edit",{storageKey:s.key,peerId:a,mid:t.mid,message:t})):this.checkPendingMessage(t)||this.rootScope.dispatchEvent("scheduled_new",t)},this.onUpdateDeleteScheduledMessages=e=>{const t=this.appPeersManager.getPeerId(e.peer),a=this.scheduledMessagesStorage[t];if(a){const s=e.messages.map((e=>(0,pe.Z)(e)));this.handleDeletedMessages(t,a,s),this.rootScope.dispatchEvent("scheduled_delete",{peerId:t,mids:s})}},this.onUpdateMessageExtendedMedia=e=>{var t;const a=this.appPeersManager.getPeerId(e.peer),s=(0,pe.Z)(e.msg_id),n=this.getHistoryMessagesStorage(a);if(!n.has(s))return;const i=this.getMessageFromStorage(n,s),r=i.media;"messageExtendedMedia"!==(null===(t=r.extended_media)||void 0===t?void 0:t._)&&(r.extended_media=e.extended_media,this.onUpdateEditMessage({_:"updateEditMessage",message:i,pts:0,pts_count:0}))},this.batchUpdateViews=e=>{const t=[],a=this.getMessagesFromMap(e);for(const[e]of a)t.push({peerId:e.peerId,mid:e.mid,views:e.views});return t},this.batchUpdateReactions=e=>{var t,a,s;const n=[],i=this.getMessagesFromMap(e);for(const[e,r]of i){const i=null!==(a=null===(t=e.reactions)||void 0===t?void 0:t.results)&&void 0!==a?a:[],o=null!==(s=null==r?void 0:r.results)&&void 0!==s?s:[],p=i.filter((t=>{const a=o.find((e=>(0,Kt.Z)(e.reaction,t.reaction)));return e.pFlags.out&&(!a||t.count>a.count)||void 0!==t.chosen_order&&(!a||void 0===a.chosen_order)}));n.push({message:e,changedResults:p})}return n}}after(){return this.clear(!0),this.apiUpdatesManager.addMultipleEventsListeners({updateMessageID:this.onUpdateMessageId,updateNewDiscussionMessage:this.onUpdateNewMessage,updateNewMessage:this.onUpdateNewMessage,updateNewChannelMessage:this.onUpdateNewMessage,updateDialogUnreadMark:this.onUpdateDialogUnreadMark,updateEditMessage:this.onUpdateEditMessage,updateEditChannelMessage:this.onUpdateEditMessage,updateMessageReactions:this.onUpdateMessageReactions,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,updateMessageExtendedMedia:this.onUpdateMessageExtendedMedia}),this.rootScope.addEventListener("notify_peer_type_settings",(({key:e,settings:t})=>{let a;a="notifyUsers"===e?e=>e.peerId.isUser():"notifyBroadcasts"===e?e=>this.appPeersManager.isBroadcast(e.peerId):e=>this.appPeersManager.isAnyGroup(e.peerId),this.dialogsStorage.getFolderDialogs(0).concat(this.dialogsStorage.getFolderDialogs(1)).filter(a).forEach((e=>{this.rootScope.dispatchEvent("dialog_notify_settings",e)}))})),this.rootScope.addEventListener("webpage_updated",(({id:e,msgs:t})=>{t.forEach((({peerId:t,mid:a,isScheduled:s})=>{const n=s?this.getScheduledMessagesStorage(t):this.getHistoryMessagesStorage(t),i=this.getMessageFromStorage(n,a);i&&(i.media={_:"messageMediaWebPage",webpage:this.appWebPagesManager.getCachedWebPage(e)},this.rootScope.dispatchEvent("message_edit",{storageKey:n.key,peerId:t,mid:a,message:i}))}))})),this.rootScope.addEventListener("draft_updated",(({peerId:e,threadId:t,draft:a})=>{const s=this.dialogsStorage.getDialogOrTopic(e,t);if(s){s.draft=a;let t=!1;a||(0,oe.Z)(s.top_message)?(this.dialogsStorage.generateIndexForDialog(s),this.dialogsStorage.pushDialog({dialog:s})):(this.dialogsStorage.dropDialog(e),t=!0),this.rootScope.dispatchEvent("dialog_draft",{peerId:e,dialog:s,drop:t,draft:a})}else if(t){const a=this.appChatsManager.getChat(e.toChatId());a?a.pFlags.forum&&this.dialogsStorage.getForumTopicById(e,t):this.reloadConversation(e)}else this.reloadConversation(e)})),this.rootScope.addEventListener("poll_update",(({poll:e})=>{const t=this.appPollsManager.pollToMessages[e.id];if(t)for(const e of t){const[t,a]=e.split("_"),s=this.getMessageByPeer(t.toPeerId(),+a);s&&this.setDialogToStateIfMessageIsTop(s)}})),this.rootScope.addEventListener("chat_toggle_forum",(({chatId:e,enabled:t})=>{const a=e.toPeerId(!0);if(!t){delete this.threadsStorage[a];for(const e in this.pinnedMessages)+e===a&&e.startsWith(a+"_")&&delete this.pinnedMessages[e]}})),this.batchUpdatesDebounced=(0,Bt.Z)((()=>{for(const e in this.batchUpdates){const t=this.batchUpdates[e];delete this.batchUpdates[e];const a=t.callback(t.batch);!a||a instanceof Array&&!a.length||rootScope.dispatchEvent(e,a)}}),33,!1,!0),this.appStateManager.getState().then((e=>{e.maxSeenMsgId&&(this.maxSeenId=e.maxSeenMsgId)}))}getInputEntities(e){const t=(0,ve.Z)(e);return t.forEach((e=>{"messageEntityMentionName"===e._&&(e._="inputMessageEntityMentionName",e.user_id=this.appUsersManager.getUserInput(e.user_id))})),t}invokeAfterMessageIsSent(e,t,a){var s,n,i;const r=null!==(s=(i=this.tempFinalizeCallbacks)[e])&&void 0!==s?s:i[e]={},o=null!==(n=r[t])&&void 0!==n?n:r[t]={deferred:(0,v.Z)()};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)));const i=a.entities||[];t&&(t=(0,ke.Z)(t,i));const r=a.scheduleDate||(e.pFlags.is_scheduled?e.date:void 0);return this.apiManager.invokeApi("messages.editMessage",{peer:this.appPeersManager.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=>{this.apiUpdatesManager.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={}){var s,n;return Yt(this,void 0,void 0,(function*(){if(!t.trim())return;null!==(s=a.entities)&&void 0!==s||(a.entities=[]),a.threadId&&!a.replyToMsgId&&(a.replyToMsgId=a.threadId);const i=(yield this.apiManager.getConfig()).message_length_max,r=xt(t,i);t=r[0],r.length>1&&("webPage"!==(null===(n=a.webPage)||void 0===n?void 0:n._)||t.includes(a.webPage.url)||delete a.webPage),e=this.appPeersManager.getPeerMigratedTo(e)||e;const o=a.entities;a.viaBotId||(t=(0,ke.Z)(t,o));let p=this.getInputEntities(o);p.length||(p=void 0);const d=this.generateOutgoingMessage(e,a);d.entities=o,d.message=t;const f=a.replyToMsgId?(0,oe.Z)(a.replyToMsgId):void 0,c=this.appPeersManager.isChannel(e);a.webPage&&(d.media={_:"messageMediaWebPage",webpage:a.webPage});const l=e=>{this.onMessagesSendError([d],e),this.rootScope.dispatchEvent("messages_pending")};d.send=()=>{l();const s={};this.pendingAfterMsgs[e]&&(s.afterMessageId=this.pendingAfterMsgs[e].messageId);const n=a.sendAsPeerId?this.appPeersManager.getInputPeerById(a.sendAsPeerId):void 0;let i;return i=a.viaBotId?this.apiManager.invokeApiAfter("messages.sendInlineBotResult",{peer:this.appPeersManager.getInputPeerById(e),random_id:d.random_id,reply_to_msg_id:f||void 0,query_id:a.queryId,id:a.resultId,clear_draft:a.clearDraft,send_as:n},s):this.apiManager.invokeApiAfter("messages.sendMessage",{no_webpage:a.noWebPage,peer:this.appPeersManager.getInputPeerById(e),message:t,random_id:d.random_id,reply_to_msg_id:f||void 0,entities:p,clear_draft:a.clearDraft,schedule_date:a.scheduleDate||void 0,silent:a.silent,send_as:n,update_stickersets_order:ea},s),this.pendingAfterMsgs[e]=s,i.then((e=>{if("updateShortSentMessage"===e._){const t=d.promise;delete d.promise;const s=(0,ve.Z)(d);(0,ge.Z)(d,["promise"]),d.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:d.random_id,id:s.id},{_:a.scheduleDate?"updateNewScheduledMessage":c?"updateNewChannelMessage":"updateNewMessage",message:s,pts:e.pts,pts_count:e.pts_count}]}}else e.updates&&e.updates.forEach((e=>{"updateDraftMessage"===e._&&(e.local=!0)}));this.apiUpdatesManager.processUpdateMessage(e),d.promise.resolve()}),(e=>{throw l(e),d.promise.reject(e),e})).finally((()=>{this.pendingAfterMsgs[e]===s&&delete this.pendingAfterMsgs[e]}))},this.beforeMessageSending(d,{isScheduled:!!a.scheduleDate||void 0,threadId:a.threadId,clearDraft:a.clearDraft,sequential:!0});const m=[d.promise];for(let t=1;t=0){r="audio",p="audio."+("ogg"===d.split("/")[1]?"ogg":"mp3"),P="sendMessageUploadAudioAction",t.isVoiceMessage&&(r="voice",s.pFlags.media_unread=!0);const e={_:"documentAttributeAudio",pFlags:{voice:t.isVoiceMessage||void 0},waveform:t.waveform,duration:t.duration||0};g.push(e)}else if(t.isMedia)if(h){r="photo",p="photo."+d.split("/")[1],P="sendMessageUploadPhotoAction";const e={_:"photoSize",w:t.width,h:t.height,type:o.Pt,location:null,size:a.size};y={_:"photo",id:""+s.id,sizes:[e],w:t.width,h:t.height},u&&y.sizes.unshift(u);const n=this.thumbsStorage.getCacheContext(y,e.type);n.downloaded=a.size,n.url=t.objectURL||"",y=this.appPhotosManager.savePhoto(y)}else if(i().VIDEO_MIME_TYPES_SUPPORTED.has(d)){r="video",p="video.mp4",P="sendMessageUploadVideoAction";const e={_:"documentAttributeVideo",pFlags:{round_message:t.isRoundMessage||void 0,supports_streaming:!0},duration:t.duration,w:t.width,h:t.height};g.push(e),t.noSound&&a.size>10240&&a.size<10485760&&g.push({_:"documentAttributeAnimated"})}else r="document",p="document."+d.split("/")[1],P="sendMessageUploadDocumentAction";else r="document",p="document."+d.split("/")[1],P="sendMessageUploadDocumentAction";if(g.push({_:"documentAttributeFilename",file_name:f||p}),-1!==["document","video","audio","voice"].indexOf(r)&&!c){const e=[];if(_={_:"document",id:""+s.id,duration:t.duration,attributes:g,w:t.width,h:t.height,thumbs:e,mime_type:d,size:a.size},t.objectURL){const e=this.thumbsStorage.getCacheContext(_);e.downloaded=a.size,e.url=t.objectURL}let n;if(h)g.push({_:"documentAttributeImageSize",w:t.width,h:t.height}),n={_:"photoSize",w:t.width,h:t.height,type:o.Pt,size:a.size};else if("video"===r&&t.thumb){n={_:"photoSize",w:t.thumb.size.width,h:t.thumb.size.height,type:"local-thumb",size:t.thumb.blob.size};const e=this.thumbsStorage.getCacheContext(_,n.type);e.downloaded=n.size,e.url=t.thumb.url}n&&e.push(n),u&&e.unshift(u),_=this.appDocsManager.saveDoc(_)}this.log("sendFile",r,p,a.type,t);const b=(0,v.Z)(),M=c?void 0:{_:y?"messageMediaPhoto":"messageMediaDocument",pFlags:{},photo:y,document:_};M&&((0,ge.Z)(M,["promise"]),M.promise=b,t.spoiler&&(M.pFlags.spoiler=!0)),s.entities=m,s.message=l,s.media=c?{_:"messageMediaDocument",pFlags:{},document:a}:M;const I=c?void 0:(0,Zt.Z)(a);s.uploadingFileName=I,I&&(this.uploadFilePromises[I]=b);const S=e=>{this.onMessagesSendError([s],e),this.rootScope.dispatchEvent("messages_pending")};let C=!1,w=null;s.send=()=>{if(c){const e={_:"inputMediaDocument",id:zt(a),pFlags:{}};b.resolve(e)}else if(a instanceof File||a instanceof Blob){const n=()=>{var n;let i;return C&&!s.error||(C=!1,w=this.apiFileManager.upload({file:a,fileName:I}),w.catch((a=>{C||(this.log("cancelling upload",M),this.cancelPendingMessage(s.random_id),this.setTyping(e,{_:"sendMessageCancelAction"},void 0,t.threadId),b.reject(a))})),w.addNotifyListener((a=>{const s=Math.max(1,Math.floor(100*a.done/a.total));P&&this.setTyping(e,{_:P,progress:0|s},void 0,t.threadId),b.notifyAll(a)})),b.notifyAll({done:0,total:a.size})),"video"===r&&t.objectURL&&(null===(n=t.thumb)||void 0===n?void 0:n.blob)&&(i=this.apiFileManager.upload({file:t.thumb.blob})),w&&w.then((e=>Yt(this,void 0,void 0,(function*(){let a;if(e.name=p,C=!0,a="photo"===r?{_:"inputMediaUploadedPhoto",file:e,pFlags:{spoiler:t.spoiler||void 0}}:{_:"inputMediaUploadedDocument",file:e,mime_type:d,pFlags:{force_file:"sendMessageUploadDocumentAction"===P||void 0,spoiler:t.spoiler||void 0},attributes:g},i)try{const e=yield i;a.thumb=e}catch(e){this.log.error("sendFile thumb upload error:",e)}b.resolve(a)}))),(e=>{throw S(e),e})),b};t.isGroupedItem?n():this.sendSmthLazyLoadQueue.push({load:n})}return b},this.beforeMessageSending(s,{isGroupedItem:t.isGroupedItem,isScheduled:!!t.scheduleDate||void 0,threadId:t.threadId,clearDraft:t.clearDraft,processAfter:t.processAfter}),t.isGroupedItem||(b.then((a=>(this.setTyping(e,{_:"sendMessageCancelAction"},void 0,t.threadId),this.apiManager.invokeApi("messages.sendMedia",{background:t.background,peer:this.appPeersManager.getInputPeerById(e),media:a,message:l,random_id:s.random_id,reply_to_msg_id:n,schedule_date:t.scheduleDate,silent:t.silent,entities:m,clear_draft:t.clearDraft,send_as:t.sendAsPeerId?this.appPeersManager.getInputPeerById(t.sendAsPeerId):void 0}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}),(e=>{if("photo"===r&&400===e.code&&("PHOTO_INVALID_DIMENSIONS"===e.type||"PHOTO_SAVE_FILE_INVALID"===e.type))return e.handled=!0,r="document",void s.send();throw S(e),e}))))),b.then(s.promise.resolve,s.promise.reject));const k={message:s};return(0,ge.Z)(k,["promise"]),k.promise=b,k}sendAlbum(e,t){return Yt(this,void 0,void 0,(function*(){if(t.threadId&&!t.replyToMsgId&&(t.replyToMsgId=t.threadId),1===t.sendFileDetails.length)return this.sendFile(e,Object.assign(Object.assign({},t),t.sendFileDetails[0]));e=this.appPeersManager.getPeerMigratedTo(e)||e;const a=t.replyToMsgId?(0,oe.Z)(t.replyToMsgId):void 0;let s=t.caption||"",n=t.entities||[];s&&(s=(0,ke.Z)(s,n)),this.log("sendAlbum",t);const i=""+ ++this.groupedTempId,r=[],o=e=>{r.push(e)},p=t.sendFileDetails.map(((r,p)=>{const d=Object.assign({isGroupedItem:!0,isMedia:t.isMedia,scheduleDate:t.scheduleDate,silent:t.silent,replyToMsgId:a,threadId:t.threadId,sendAsPeerId:t.sendAsPeerId,groupId:i,processAfter:o},r);return 0===p&&(d.caption=s,d.entities=n),this.sendFile(e,d).message}));t.clearDraft&&r.push((()=>{this.appDraftsManager.clearDraft(e,t.threadId)})),r.forEach((e=>{e()}));const d=(e,t)=>{this.onMessagesSendError([e],t),this.rootScope.dispatchEvent("messages_pending")},f=this.appPeersManager.getInputPeerById(e),c=s=>{this.setTyping(e,{_:"sendMessageCancelAction"},void 0,t.threadId);const n=(0,v.Z)();return this.sendSmthLazyLoadQueue.push({load:()=>this.apiManager.invokeApi("messages.sendMultiMedia",{peer:f,multi_media:s,reply_to_msg_id:a,schedule_date:t.scheduleDate,silent:t.silent,clear_draft:t.clearDraft,send_as:t.sendAsPeerId?this.appPeersManager.getInputPeerById(t.sendAsPeerId):void 0,update_stickersets_order:ea}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e),n.resolve()}),(e=>{p.forEach((t=>d(t,e))),n.reject(e)}))}),n},l=p.map((e=>e.send().then((e=>Promise.all([e,this.apiManager.invokeApi("messages.uploadMedia",{peer:f,media:e})]))).then((([t,a])=>{let i;if("messageMediaPhoto"===a._){const e=this.appPhotosManager.savePhoto(a.photo);i=wt(e)}else if("messageMediaDocument"===a._){const e=this.appDocsManager.saveDoc(a.document);i=At(e)}["pFlags","ttl_seconds"].forEach((e=>{var a;i[e]=null!==(a=t[e])&&void 0!==a?a:i[e]}));const r={_:"inputSingleMedia",media:i,random_id:e.random_id,message:s,entities:n};return s&&(s="",n=[]),r})).catch((t=>{throw this.log.error("sendAlbum upload item error:",t,e),d(e,t),t}))));return Promise.all(l).then((e=>c(e.filter(Boolean))))}))}sendContact(e,t){return this.sendOther(e,this.appUsersManager.getContactMediaInput(t))}sendOther(e,t,a={}){var s;e=this.appPeersManager.getPeerMigratedTo(e)||e;const n=this.generateOutgoingMessage(e,a),i=a.replyToMsgId?(0,oe.Z)(a.replyToMsgId):void 0;let r;switch(t._){case"inputMediaPoll":{const e=""+n.id;t.poll.id=e,this.appPollsManager.savePoll(t.poll,{_:"pollResults",flags:4,total_voters:0,pFlags:{},recent_voters:[]});const{poll:a,results:s}=this.appPollsManager.getPoll(e);r={_:"messageMediaPoll",poll:a,results:s};break}case"inputMediaPhoto":r={_:"messageMediaPhoto",photo:this.appPhotosManager.getPhoto(t.id.id),pFlags:{}};break;case"inputMediaDocument":r={_:"messageMediaDocument",document:this.appDocsManager.getDoc(t.id.id),pFlags:{}};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.messageMedia}n.media=r;const o=e=>{this.onMessagesSendError([n],e),this.rootScope.dispatchEvent("messages_pending")};return n.send=()=>{const s={};this.pendingAfterMsgs[e]&&(s.afterMessageId=this.pendingAfterMsgs[e].messageId);const r=a.sendAsPeerId?this.appPeersManager.getInputPeerById(a.sendAsPeerId):void 0;let p;return p=a.viaBotId?this.apiManager.invokeApiAfter("messages.sendInlineBotResult",{peer:this.appPeersManager.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,send_as:r},s):this.apiManager.invokeApiAfter("messages.sendMedia",{peer:this.appPeersManager.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,send_as:r,update_stickersets_order:ea},s),this.pendingAfterMsgs[e]=s,p.then((e=>{e.updates&&e.updates.forEach((e=>{"updateDraftMessage"===e._&&(e.local=!0)})),this.apiUpdatesManager.processUpdateMessage(e)}),(e=>{throw o(e),e})).finally((()=>{this.pendingAfterMsgs[e]===s&&delete this.pendingAfterMsgs[e]}))},this.beforeMessageSending(n,{isScheduled:!!a.scheduleDate||void 0,threadId:a.threadId,clearDraft:a.clearDraft,sequential:!0}),n.promise}beforeMessageSending(e,t={}){const a=e.id,s=this.getMessagePeer(e),n=t.isScheduled?this.getScheduledMessagesStorage(s):this.getHistoryMessagesStorage(s);e.storageKey=n.key;const i=[];if(t.isScheduled)this.saveMessages([e],{storage:n,isScheduled:!0,isOutgoing:!0}),i.push((()=>{this.rootScope.dispatchEvent("scheduled_new",e)}));else{const r=[this.getHistoryStorage(s),t.threadId?this.getHistoryStorage(s,t.threadId):void 0];for(const e of r)e&&e.history.unshift(a);if(this.saveMessages([e],{storage:n,isOutgoing:!0}),this.setDialogTopMessage(e),t.threadId){const a=this.dialogsStorage.getForumTopic(s,t.threadId);a&&this.setDialogTopMessage(e,a)}i.push((()=>{this.rootScope.dispatchEvent("history_append",{storageKey:n.key,message:e})}))}const r=this.pendingByRandomId[e.random_id]={peerId:s,tempId:a,threadId:t.threadId,storage:n,sequential:t.sequential};return this.pendingTopMsgs[s]=a,!t.isGroupedItem&&e.send&&i.push((()=>{t.clearDraft&&this.appDraftsManager.clearDraft(s,t.threadId),e.send()})),i.length&&(t.processAfter||Xt)((()=>{for(const e of i)e()})),r}generateOutgoingMessage(e,t){let a;t.threadId&&!t.replyToMsgId&&(t.replyToMsgId=t.threadId);const s=this.appPeersManager.isBroadcast(e);if(s&&this.appPeersManager.getPeer(e).pFlags.signatures){const e=this.appUsersManager.getSelf();a=e.first_name+(e.last_name?" "+e.last_name:"")}const n={_:"message",id:this.generateTempMessageId(e),from_id:t.sendAsPeerId?this.appPeersManager.getOutputPeer(t.sendAsPeerId):this.generateFromId(e),peer_id:this.appPeersManager.getOutputPeer(e),post_author:a,pFlags:this.generateFlags(e),date:t.scheduleDate||(0,te.Z)(!0)+this.timeManager.getServerTimeOffset(),message:"",grouped_id:t.groupId,random_id:(0,Te.a)(),reply_to:this.generateReplyHeader(e,t.replyToMsgId,t.threadId),via_bot_id:t.viaBotId,reply_markup:t.replyMarkup,replies:this.generateReplies(e),views:s&&1,pending:!0};return(0,ge.Z)(n,["send","promise"]),void 0===t.groupId&&(n.promise=(0,v.Z)()),n}generateReplyHeader(e,t,a){const s=this.appPeersManager.isForum(e);if(s&&!a){const s=this.getMessageByPeer(e,t);s&&(a=(0,Qt.Z)(s,!0))}const n={_:"messageReplyHeader",reply_to_msg_id:t||a,pFlags:{}};return a&&s&&o.Ox!==a&&(n.pFlags.forum_topic=!0),a&&n.reply_to_msg_id!==a&&(n.reply_to_top_id=a),n}generateReplies(e){let t;if(this.appPeersManager.isBroadcast(e)){const a=this.appProfileManager.getCachedFullChat(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 this.appPeersManager.isAnyChat(e)&&(this.appPeersManager.isBroadcast(e)||this.isAnonymousSending(e))?void 0:this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId())}generateFlags(e){const t={};return e!==this.appUsersManager.getSelf().id&&(t.out=!0,this.appPeersManager.isChannel(e)||this.appUsersManager.isBot(e)||(t.unread=!0)),this.appPeersManager.isBroadcast(e)&&(t.post=!0),t}generateForwardHeader(e,t){const a=this.appUsersManager.getSelf().id.toPeerId(),s=t.fromId;if(s===a&&t.peerId===a&&!t.fwd_from)return;const n={_:"messageFwdHeader",flags:0,date:t.date,pFlags:{}};let i=!1;if(t.fwd_from)n.from_id=t.fwd_from.from_id,n.from_name=t.fwd_from.from_name,n.post_author=t.fwd_from.post_author;else{if(n.post_author=t.post_author,s.isUser()){const e=this.appProfileManager.getCachedFullUser(s.toUserId());(null==e?void 0:e.private_forward_name)&&(n.from_name=e.private_forward_name,i=!0)}i||(n.from_id=this.appPeersManager.getOutputPeer(s))}return this.appPeersManager.isBroadcast(t.peerId)&&(t.post_author&&(n.post_author=t.post_author),n.channel_post=t.id),e!==a||i||(n.saved_from_msg_id=t.id,n.saved_from_peer=this.appPeersManager.getOutputPeer(t.peerId)),n}generateFakeAvatarMessage(e,t){const a=Number.MAX_SAFE_INTEGER,s={_:"messageService",pFlags:{},action:{_:"messageActionChannelEditPhoto",photo:t},id:a,peer_id:this.appPeersManager.getOutputPeer(e),mid:a,peerId:e,date:t.date,fromId:e};return this.getHistoryMessagesStorage(e).set(a,s),s}getUploadPromise(e){return this.uploadFilePromises[e]}isAnonymousSending(e){var t,a;return!!e.isAnyChat()&&(null===(a=null===(t=this.appPeersManager.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)){t&&(t.top_message=e.mid,this.getHistoryStorage(e.peerId,"forumTopic"===t._?t.id:void 0).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 this.apiUpdatesManager.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(e){return Yt(this,void 0,void 0,(function*(){const t=this.middleware.get();for(;!this.dialogsStorage.isDialogsLoaded(e);){const a=yield this.getTopMessages({limit:100,folderId:e});if(!t()||a.isEnd)break}}))}getReadMaxIdIfUnread(e,t){var a,s,n;const i=this.getHistoryStorage(e,t);if(t&&!this.appChatsManager.isForum(e.toChatId())){const t=this.getHistoryStorage(e),n=Math.max(null!==(a=t.readMaxId)&&void 0!==a?a:0,i.readMaxId),r=this.getMessageByPeer(e,i.maxId);return!(null===(s=null==r?void 0:r.pFlags)||void 0===s?void 0:s.out)&&n{if(!n()||"messages.dialogsNotModified"===r._)return null;d.ZP&&this.log("messages.getDialogs result:",r),i||s||t===ye||this.dialogsStorage.resetPinnedOrder(t),i||s||this.appDraftsManager.addMissedDialogs(),this.appUsersManager.saveApiUsers(r.users),this.appChatsManager.saveApiChats(r.chats),this.saveMessages(r.messages);let p=!!s,c=!1;const l=new Map,m=t===ye?o.J$:t,g=!!i||t===ye,h=r.dialogs||r.topics;if((0,ne.Z)(h,(e=>{var t,s;if(e)if(i||null!==(t=(s=e).folder_id)&&void 0!==t||(s.folder_id=m),this.dialogsStorage.saveDialog({dialog:e,ignoreOffsetDate:!0,saveGlobalOffset:g}),void 0!==e.peerId)if(p||this.appPeersManager.isChannel(e.peerId||this.appPeersManager.getPeerId(e.peer))||(this.incrementMaxSeenId(e.top_message),p=!0),a&&(0,ce.Z)(e)>a&&(this.scheduleHandleNewDialogs(e.peerId,e),c=!0),i||(0,oe.Z)(e.read_inbox_max_id)||(0,oe.Z)(e.read_outbox_max_id)){if(e.top_message){const t=this.getMessageByPeer(e.peerId,e.top_message);t&&(this.setMessageUnreadByDialog(t,e),this.dialogsStorage.setDialogToState(e))}}else l.set(e.peerId,{dialog:e}),this.log.error("noIdsDialogs",e,f);else this.log.error("bugged dialog?",e)})),l.size){const e=[...l.keys()],t=e.map((e=>this.reloadConversation(e)));Promise.all(t).then((()=>{this.rootScope.dispatchEvent("dialogs_multiupdate",l);for(let t=0;t=u||!h.length;v&&this.dialogsStorage.setDialogsLoaded(t,!0),c?this.scheduleHandleNewDialogs():this.rootScope.dispatchEvent("dialogs_multiupdate",new Map);const P=h,b=100===e?P:P.slice(0,e);return{isEnd:v&&b[b.length-1]===P[P.length-1],count:u,dialogs:b}};let p,f;return p=i?this.apiManager.invokeApiSingleProcess({method:"channels.getForumTopics",params:f={channel:this.appChatsManager.getChannelInput(i.toChatId()),limit:100,offset_date:s,offset_id:0,offset_topic:0},options:{noErrorBox:!0},processResult:e=>(e=this.dialogsStorage.processTopics(i,e),r(e))}):this.apiManager.invokeApiSingleProcess({method:"messages.getDialogs",params:f={folder_id:t,offset_date:s,offset_id:0,offset_peer:this.appPeersManager.getInputPeerById(undefined),limit:100,hash:"0"},options:{noErrorBox:!0},processResult:r}),p}forwardMessages(e,t,a,s={}){return Yt(this,void 0,void 0,(function*(){delete s.replyToMsgId,delete s.threadId,e=this.appPeersManager.getPeerMigratedTo(e)||e;for(let n=0,i=(a=a.slice().sort(((e,t)=>e-t))).length;n{var i,p,d,f,c;const l=this.getMessageByPeer(t,n),m=this.generateOutgoingMessage(e,s);o.push(m.id);const g=["entities","media"];s.dropAuthor||(m.fwd_from=this.generateForwardHeader(e,l),g.push("views","forwards"),(null===(i=m.fwd_from)||void 0===i?void 0:i.from_name)&&e===this.appPeersManager.peerId&&delete m.from_id),s.dropCaptions&&l.media||g.push("message");const h=null===(p=l.reply_to)||void 0===p?void 0:p.reply_to_msg_id,u=a.indexOf(h);if(h&&-1!==u){const e=o[u];m.reply_to={_:"messageReplyHeader",reply_to_msg_id:e,pFlags:{}}}g.forEach((e=>{m[e]=(0,ve.Z)(l[e])}));const y=null===(d=m.media)||void 0===d?void 0:d.document;return y&&(["round","voice"].includes(y.type)&&(m.pFlags.media_unread=!0),y.sticker&&!this.rootScope.premium&&(0,Wt.Z)(y)&&(m.media.pFlags.nopremium=!0)),l.grouped_id&&(null!==(f=r[c=l.grouped_id])&&void 0!==f?f:r[c]={tempId:""+ ++this.groupedTempId,messages:[]}).messages.push(m),m}));for(const e in r){const t=r[e];t.messages.length>1&&t.messages.forEach((e=>{e.grouped_id=t.tempId}))}p.forEach((e=>{this.beforeMessageSending(e,{isScheduled:!!s.scheduleDate||void 0,sequential:!0})}));const d={};this.pendingAfterMsgs[e]&&(d.afterMessageId=this.pendingAfterMsgs[e].messageId);const f=this.apiManager.invokeApiAfter("messages.forwardMessages",{from_peer:this.appPeersManager.getInputPeerById(t),id:a.map((e=>(0,oe.Z)(e))),random_id:p.map((e=>e.random_id)),to_peer:this.appPeersManager.getInputPeerById(e),with_my_score:s.withMyScore,silent:s.silent,schedule_date:s.scheduleDate,drop_author:s.dropAuthor,drop_media_captions:s.dropCaptions,send_as:s.sendAsPeerId?this.appPeersManager.getInputPeerById(s.sendAsPeerId):void 0},d).then((e=>{this.log("forwardMessages updates:",e),this.apiUpdatesManager.processUpdateMessage(e)}),(e=>{throw this.onMessagesSendError(p,e),e})).finally((()=>{this.pendingAfterMsgs[e]===d&&delete this.pendingAfterMsgs[e]}));this.pendingAfterMsgs[e]=d;const c=[f];return i.length&&c.push(this.forwardMessages(e,t,i,s)),Promise.all(c).then(jt.Z)}))}generateEmptyMessage(e){}onMessagesSendError(e,t){e.forEach((e=>{if(e.error!==t)if(t){e.error=t,this.rootScope.dispatchEvent("message_error",{storageKey:e.storageKey,tempId:e.mid,error:t});const a=this.getDialogOnly(e.peerId);a&&this.rootScope.dispatchEvent("dialog_unread",{peerId:e.peerId,dialog:a})}else delete e.error}))}getMessagesStorageByKey(e){const t=e.split("_"),a=+t[0];return"scheduled"===t[1]?this.getScheduledMessagesStorage(a):this.getHistoryMessagesStorage(a)}getMessageFromStorage(e,t){return"string"==typeof e&&(e=this.getMessagesStorageByKey(e)),e&&e.get(t)}createMessageStorage(e,t){const a=new Map;return a.peerId=e,a.type=t,a.key=`${e}_${t}`,a}getHistoryMessagesStorage(e){var t,a;return null!==(t=(a=this.messagesStorageByPeerId)[e])&&void 0!==t?t:a[e]=this.createMessageStorage(e,"history")}getMessagesStorage(e){return"object"==typeof e?e:this.getMessagesStorageByKey(e)}getMessageById(e){for(const t in this.messagesStorageByPeerId){if(this.appPeersManager.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.getHistoryMessagesStorage(e),t):this.getMessageById(t)}getMessagePeer(e){return e.peer_id&&this.appPeersManager.getPeerId(e.peer_id)||o.NM}getDialogOnly(e){return this.dialogsStorage.getDialogOnly(e)}cantForwardDeleteMids(e,t){const a=this.getMessagesStorage(e);let s=!t.length,n=!t.length;for(const e of t){const t=this.getMessageFromStorage(a,e);if(s||(s=!this.canForward(t)),n||(n=!this.canDeleteMessage(t)),s&&n)break}return{cantForward:s,cantDelete:n}}reloadConversationOrTopic(e,t){t?this.dialogsStorage.getForumTopicById(e,t):this.reloadConversation(e)}reloadConversation(e){let t;if(void 0!==e){const a=this.appPeersManager.getPeerId(e);this.log.warn("reloadConversation",a);let s=this.reloadConversationsPeers.get(a);if(s&&(t=s.promise),t)return t;t=(0,v.Z)(),this.reloadConversationsPeers.set(a,s={inputDialogPeer:this.appPeersManager.getInputDialogPeerById(e),promise:t})}return this.reloadConversationsPromise||(this.reloadConversationsPromise=(0,P.Z)(0).then((()=>{const e=[],t={};for(const[a,{inputDialogPeer:s,promise:n}]of this.reloadConversationsPeers)e.push(s),t[a]=n;const a=()=>{for(const e in t)this.reloadConversationsPeers.delete(+e),t[e].resolve(void 0)};return(()=>Yt(this,void 0,void 0,(function*(){for(;;){const t=yield this.apiManager.invokeApi("messages.getPeerDialogs",{peers:e}),a=this.apiUpdatesManager.updatesState,{state:s}=t;if(!a.pts||a.pts===s.pts)return t;yield(0,P.Z)(500)}})))().then((e=>{for(const e in t)this.reloadConversationsPeers.delete(+e);this.dialogsStorage.applyDialogs(e),e.dialogs.forEach((e=>{const a=e.peerId;a&&(t[a].resolve(e),delete t[a])}))}),jt.Z).then((()=>{a(),this.reloadConversationsPromise=null,this.reloadConversationsPeers.size&&this.reloadConversation()}))}))),t||this.reloadConversationsPromise}doFlushHistory(e,t,a,s){let n;const i=n=>(this.apiUpdatesManager.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:n.pts,pts_count:n.pts_count}}),!n.offset||this.doFlushHistory(e,t,a,s));return n=s?this.apiManager.invokeApiSingleProcess({method:"channels.deleteTopicHistory",params:{channel:this.appChatsManager.getChannelInput(e.toChatId()),top_msg_id:(0,oe.Z)(s)},processResult:i}):this.apiManager.invokeApiSingleProcess({method:"messages.deleteHistory",params:{just_clear:t,revoke:a,peer:this.appPeersManager.getInputPeerById(e),max_id:0},processResult:i}),n}flushHistory(e,t,a,s){return Yt(this,void 0,void 0,(function*(){if(this.appPeersManager.isChannel(e)&&!s){const t=this.getHistory(e,0,1),a=yield t,s=e.toChatId(),n=a.history[0]||0;return this.apiManager.invokeApiSingle("channels.deleteHistory",{channel:this.appChatsManager.getChannelInput(s),max_id:(0,oe.Z)(n)}).then((e=>(e&&this.apiUpdatesManager.processLocalUpdate({_:"updateChannelAvailableMessages",channel_id:s,available_min_id:n}),e)))}return this.doFlushHistory(e,t,a,s).then((()=>{if(s||this.flushStoragesByPeerId(e),t)this.rootScope.dispatchEvent("dialog_flush",{peerId:e,dialog:this.getDialogOnly(e)});else{const t=this.getTypingKey(e,s);if(delete this.notificationsToHandle[t],delete this.typings[t],!s){const t=this.reloadConversationsPeers.get(e);t&&(this.reloadConversationsPeers.delete(e),t.promise.resolve(void 0))}this.dialogsStorage.dropDialogOnDeletion(e,s)}}))}))}flushStoragesByPeerId(e){[this.historiesStorage,this.threadsStorage,this.searchesStorage,this.pendingAfterMsgs,this.pendingTopMsgs].forEach((t=>{delete t[e]}));for(const t in this.pinnedMessages)(+t===e||t.startsWith(e+"_"))&&delete this.pinnedMessages[t];const t=this.needSingleMessages.get(e);if(t){for(const[e,a]of t)a.resolve(this.generateEmptyMessage(e));t.clear()}[this.messagesStorageByPeerId,this.scheduledMessagesStorage].forEach((t=>{const a=t[e];a&&a.clear()})),this.dialogsStorage.flushForumTopicsCache(e)}hidePinnedMessages(e){return Promise.all([this.appStateManager.getState(),this.getPinnedMessage(e)]).then((([t,a])=>{t.hiddenPinnedMessages[e]=a.maxId,this.rootScope.dispatchEvent("peer_pinned_hidden",{peerId:e,maxId:a.maxId})}))}getPinnedMessagesKey(e,t){return e+(t?"_"+t:"")}getPinnedMessage(e,t){var a,s,n;const i=null!==(a=(s=this.pinnedMessages)[n=this.getPinnedMessagesKey(e,t)])&&void 0!==a?a:s[n]={};return i.promise?i.promise:i.maxId?Promise.resolve(i):i.promise=this.getSearch({peerId:e,inputFilter:{_:"inputMessagesFilterPinned"},maxId:0,limit:1,threadId:t}).then((e=>{var t;return i.count=e.count,i.maxId=null===(t=e.history[0])||void 0===t?void 0:t.mid,i})).finally((()=>{delete i.promise}))}getPinnedMessagesCount(e,t){var a;return null===(a=this.pinnedMessages[this.getPinnedMessagesKey(e,t)])||void 0===a?void 0:a.count}getPinnedMessagesMaxId(e,t){var a;return null===(a=this.pinnedMessages[this.getPinnedMessagesKey(e,t)])||void 0===a?void 0:a.maxId}updatePinnedMessage(e,t,a,s,n){return this.apiManager.invokeApi("messages.updatePinnedMessage",{peer:this.appPeersManager.getInputPeerById(e),unpin:a,silent:s,pm_oneside:n,id:(0,oe.Z)(t)}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}unpinAllMessages(e){return this.apiManager.invokeApiSingle("messages.unpinAllMessages",{peer:this.appPeersManager.getInputPeerById(e)}).then((t=>(this.apiUpdatesManager.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:t.pts,pts_count:t.pts_count}}),t.offset?this.unpinAllMessages(e):(this.getHistoryMessagesStorage(e).forEach((e=>{e.pFlags.pinned&&delete e.pFlags.pinned})),this.rootScope.dispatchEvent("peer_pinned_messages",{peerId:e,unpinAll:!0}),delete this.pinnedMessages[this.getPinnedMessagesKey(e)],!0))))}getAlbumText(e){const t=this.groupedMessagesStorage[e];return(0,Ht.Z)(Array.from(t.values()))}getGroupsFirstMessage(e){if(!(null==e?void 0:e.grouped_id))return e;const t=this.groupedMessagesStorage[e.grouped_id];let a=Number.MAX_SAFE_INTEGER;for(const[e,s]of t)s.midthis.getMessageFromStorage(a,e)))}getMidsByMessage(e){return e?e.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 this.appMessagesIdsManager.generateTempMessageId((null==t?void 0:t.top_message)||0)}setMessageUnreadByDialog(e,t=this.getDialogOnly(e.peerId)){t&&e.mid&&e.mid>t[e.pFlags.out?"read_outbox_max_id":"read_inbox_max_id"]&&(e.pFlags.unread=!0)}saveMessage(e,t={}){var a,s,n,i,r;if(!e||"messageEmpty"===e._)return;null!==(a=e.pFlags)&&void 0!==a||(e.pFlags={});const p=this.getMessagePeer(e),d=t.storage||this.getHistoryMessagesStorage(p),f="peerChannel"===e.peer_id._,c=f&&this.appChatsManager.isBroadcast(p.toChatId()),l="message"===e._;t.isOutgoing&&(e.pFlags.is_outgoing=!0);const m=(0,pe.Z)(e.id);e.mid=m,l&&(t.isScheduled&&(e.pFlags.is_scheduled=!0),e.grouped_id&&(null!==(s=(i=this.groupedMessagesStorage)[r=e.grouped_id])&&void 0!==s?s:i[r]=this.createMessageStorage(p,"grouped")).set(m,e),e.via_bot_id&&(e.viaBotId=e.via_bot_id));const g=e.reply_to;g&&(g.reply_to_msg_id&&(g.reply_to_msg_id=e.reply_to_mid=(0,pe.Z)(g.reply_to_msg_id)),g.reply_to_top_id&&(g.reply_to_top_id=(0,pe.Z)(g.reply_to_top_id)));const h=l&&e.replies;h&&(h.max_id&&(h.max_id=(0,pe.Z)(h.max_id)),h.read_max_id&&(h.read_max_id=(0,pe.Z)(h.read_max_id)));const u=!!p;u||(e.date-=this.timeManager.getServerTimeOffset());const y=this.appPeersManager.peerId,_=l&&e.fwd_from;if(e.peerId=p,e.fromId=p===y?_?_.from_id?this.appPeersManager.getPeerId(_.from_id):o.NM:y:e.pFlags.post||!e.from_id?p:this.appPeersManager.getPeerId(e.from_id),this.setMessageUnreadByDialog(e),_){_.saved_from_msg_id&&(_.saved_from_msg_id=(0,pe.Z)(_.saved_from_msg_id)),_.channel_post&&(_.channel_post=(0,pe.Z)(_.channel_post));const t=_.saved_from_peer||_.from_id,a=_.saved_from_msg_id||_.channel_post;if(t&&a){const s=this.appPeersManager.getPeerId(t),n=(0,pe.Z)(a);e.savedFrom=s+"_"+n}e.fwdFromId=this.appPeersManager.getPeerId(_.from_id),u||(_.date-=this.timeManager.getServerTimeOffset())}const v={type:"message",peerId:p,messageId:m};let P=!1;const b=l&&e.media;if(b)switch(b._){case"messageMediaEmpty":delete e.media;break;case"messageMediaPhoto":b.ttl_seconds?P=!0:b.photo=this.appPhotosManager.savePhoto(b.photo,v),b.photo||delete e.media;break;case"messageMediaPoll":{const t=this.appPollsManager.savePoll(b.poll,b.results,e);b.poll=t.poll,b.results=t.results;break}case"messageMediaDocument":if(b.ttl_seconds)P=!0;else{const e=b.document;b.document=this.appDocsManager.saveDoc(e,v),b.document||"documentEmpty"===e._||(P=!0)}break;case"messageMediaWebPage":{const a=this.appWebPagesManager.getMessageKeyForPendingWebPage(p,m,t.isScheduled);b.webpage=this.appWebPagesManager.saveWebPage(b.webpage,a,v),b.webpage||delete e.media;break}case"messageMediaInvoice":{b.photo=this.appWebDocsManager.saveWebDocument(b.photo);const e=b.extended_media;if("messageExtendedMedia"===(null==e?void 0:e._)){const t=e.media;t.photo=this.appPhotosManager.savePhoto(t.photo,v),t.document=this.appDocsManager.saveDoc(t.document,v)}break}case"messageMediaUnsupported":P=!0}if(l&&P&&(e.media={_:"messageMediaUnsupported"},e.message="",delete e.entities,delete e.totalEntities),!l&&e.action){const t=e.action,a=e.fromId===this.appUsersManager.getSelf().id?"You":"";let s,i;switch(t.photo&&(t.photo=this.appPhotosManager.savePhoto(t.photo,v)),t.document&&(t.document=this.appDocsManager.saveDoc(t.photo,v)),t._){case"messageActionChatEditPhoto":(null===(n=t.photo)||void 0===n?void 0:n.video_sizes)?t._=c?"messageActionChannelEditVideo":"messageActionChatEditVideo":c&&(t._="messageActionChannelEditPhoto");break;case"messageActionGroupCall":{let e;this.appGroupCallsManager.saveGroupCall(t.call),e=void 0===t.duration?"started":"ended",c||(e+="_by"+a),t.type=e;break}case"messageActionChatEditTitle":c&&(t._="messageActionChannelEditTitle");break;case"messageActionChatDeletePhoto":c&&(t._="messageActionChannelDeletePhoto");break;case"messageActionChatAddUser":1===t.users.length?(t.user_id=t.users[0],e.fromId===t.user_id&&(t._=f?"messageActionChatJoined"+a:"messageActionChatReturn"+a)):t.users.length>1&&(t._="messageActionChatAddUsers");break;case"messageActionChatDeleteUser":e.fromId===t.user_id&&(t._="messageActionChatLeave"+a);break;case"messageActionChannelMigrateFrom":s=t.chat_id.toPeerId(!0),i=p;break;case"messageActionChatMigrateTo":s=p,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")}s&&i&&!this.migratedFromTo[s]&&!this.migratedToFrom[i]&&this.migrateChecks(s,i)}return l&&e.message.length&&!e.totalEntities&&this.wrapMessageEntities(e),d.set(m,e),e}saveMessages(e,t={}){return e.saved||(e.saved=!0,e.forEach(((e,a,s)=>{s[a]=this.saveMessage(e,t)}))),e}getFirstMessageToEdit(e,t){return Yt(this,void 0,void 0,(function*(){const a=this.getHistoryStorage(e,t).history.slice;if(a.isEnd(se.D.Bottom)&&a.length){let t;const s=this.appPeersManager.peerId;for(const n of a){const a=this.getMessageByPeer(e,n);if((s===e?a.fromId===s:a.pFlags.out)&&(yield this.canEditMessage(a,"text"))){t=a;break}}return t}}))}wrapMessageEntities(e){const t=e.entities?e.entities.slice():[];e.message=(0,Pt.Z)(e.message,t);const a=(0,Lt.Z)(e.message);e.totalEntities=(0,Ot.Z)(t,a)}reportMessages(e,t,a,s){return this.apiManager.invokeApiSingle("messages.report",{peer:this.appPeersManager.getInputPeerById(e),id:t.map((e=>(0,oe.Z)(e))),reason:{_:a},message:s})}startBot(e,t,a){const s=t?t.toPeerId(!0):e.toPeerId();if(a){const t=(0,Te.a)();return this.apiManager.invokeApi("messages.startBot",{bot:this.appUsersManager.getUserInput(e),peer:this.appPeersManager.getInputPeerById(s),random_id:t,start_param:a}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}const n="/start";if(t){let a;return a=this.appChatsManager.isChannel(t)?this.appChatsManager.inviteToChannel(t,[e]):this.appChatsManager.addChatUser(t,e,0),a.catch((e=>{if("USER_ALREADY_PARTICIPANT"!=(null==e?void 0:e.type))throw e;e.handled=!0})).then((()=>this.sendText(s,n+"@"+this.appPeersManager.getPeerUsername(e.toPeerId()))))}return this.sendText(s,n)}editPeerFolders(e,t){this.apiManager.invokeApi("folders.editPeerFolders",{folder_peers:e.map((e=>({_:"inputFolderPeer",peer:this.appPeersManager.getInputPeerById(e),folder_id:t})))}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}getFilter(e){return this.filtersStorage.getFilter(e)}toggleDialogPin(e){var t;return Yt(this,void 0,void 0,(function*(){const{peerId:a,topicId:s,filterId:n=(s?a:void 0)}=e;if(void 0===n)throw new Error("No filterId");if(n>1)return this.filtersStorage.toggleDialogPin(a,n);const i=this.dialogsStorage.getDialogOrTopic(a,s);if(!i)throw void 0;const r=!(null===(t=i.pFlags)||void 0===t?void 0:t.pinned)||void 0;if(r){const e=yield this.apiManager.getLimit(s?"topicPin":1===n?"folderPin":"pin");if(this.dialogsStorage.getPinnedOrders(n).length>=e)throw(0,X.Z)(s?"PINNED_TOO_MUCH":"PINNED_DIALOGS_TOO_MUCH")}return s?this.appChatsManager.updatePinnedForumTopic(a.toChatId(),s,r):this.apiManager.invokeApi("messages.toggleDialogPin",{peer:this.appPeersManager.getInputDialogPeerById(a),pinned:r}).then((e=>{const t=r?{pinned:r}:{};this.apiUpdatesManager.saveUpdate({_:"updateDialogPinned",peer:this.appPeersManager.getDialogPeer(a),folder_id:n,pFlags:t})}))}))}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 this.apiManager.invokeApi("messages.markDialogUnread",{peer:this.appPeersManager.getInputDialogPeerById(e),unread:n}).then((t=>{if(t){const t=n?{unread:n}:{};this.onUpdateDialogUnreadMark({_:"updateDialogUnreadMark",peer:this.appPeersManager.getDialogPeer(e),pFlags:t})}}))}migrateChecks(e,t){if(!this.migratedFromTo[e]&&!this.migratedToFrom[t]&&this.appChatsManager.hasChat(t.toChatId())){const a=this.appChatsManager.getChat(e.toChatId());(null==a?void 0:a.migrated_to)&&a.migrated_to.channel_id===t.toChatId()&&(this.migratedFromTo[e]=t,this.migratedToFrom[t]=e,this.rootScope.dispatchEvent("dialog_migrate",{migrateFrom:e,migrateTo:t}),this.dialogsStorage.dropDialogWithEvent(e))}}canMessageBeEdited(e,t){var a,s;if(null===(a=null==e?void 0:e.pFlags)||void 0===a?void 0:a.is_outgoing)return!1;const n=["messageMediaPhoto","messageMediaDocument","messageMediaWebPage"];return"poll"===t&&n.push("messageMediaPoll"),!(!e||"message"!==e._||e.deleted||e.fwd_from||e.via_bot_id||e.media&&-1===n.indexOf(e.media._)||e.fromId&&this.appUsersManager.isBot(e.fromId)||"messageMediaDocument"===(null===(s=e.media)||void 0===s?void 0:s._)&&(e.media.document.sticker||"round"===e.media.document.type))}canEditMessage(e,t="text"){var a;return Yt(this,void 0,void 0,(function*(){return!(!e||!this.canMessageBeEdited(e,t))&&(this.getMessagePeer(e)===this.appUsersManager.getSelf().id||!(!(this.appPeersManager.isBroadcast(e.peerId)?this.appChatsManager.hasRights(e.peerId.toChatId(),"edit_messages"):e.pFlags.out)||"peerChannel"!==e.peer_id._&&e.date<(0,te.Z)(!0)-(yield this.apiManager.getConfig()).edit_time_limit&&"messageMediaPoll"!==(null===(a=e.media)||void 0===a?void 0:a._)))}))}canDeleteMessage(e){return e&&(e.peerId.isUser()||e.pFlags.out||"chat"===this.appChatsManager.getChat(e.peerId.toChatId())._||this.appChatsManager.hasRights(e.peerId.toChatId(),"delete_messages"))&&(!e.pFlags.is_outgoing||!!e.error)}getReplyKeyboard(e){return this.getHistoryStorage(e).replyMarkup}mergeReplyKeyboard(e,t){var a,s;if(!t)return!1;const n=t.reply_markup;if(!n&&!(null===(a=t.pFlags)||void 0===a?void 0:a.out)&&!t.action)return!1;if("replyInlineMarkup"===(null==n?void 0:n._))return!1;const i=e.replyMarkup;if(n)return!(i&&i.mid>=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(0,ue.Z)(t),!("messageActionChatDeleteUser"!==(null===(s=t.action)||void 0===s?void 0:s._)||!(i?t.action.user_id===i.fromId:this.appUsersManager.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,s){return this.appPeersManager.isPeerRestricted(e)?Promise.resolve(t.map((e=>({_:"messages.searchCounter",pFlags:{},filter:e,count:0})))):(a?this.apiManager.invokeApiCacheable:this.apiManager.invokeApi).bind(this.apiManager)("messages.getSearchCounters",{peer:this.appPeersManager.getInputPeerById(e),filters:t,top_msg_id:s?(0,oe.Z)(s):void 0})}filterMessagesByInputFilterFromStorage(e,t,a,s){const n=this.getMessagesStorage(a);return(0,Nt.Z)(e,t.map((e=>n.get(e))),s)}getSearch({peerId:e,query:t,inputFilter:a,maxId:s,limit:n,nextRate:i,backLimit:r,threadId:o,folderId:p,minDate:f,maxDate:c}){if(this.appPeersManager.isPeerRestricted(e))return Promise.resolve({count:0,offset_id_offset:0,next_rate:void 0,history:[]});t||(t=""),a||(a={_:"inputMessagesFilterEmpty"}),void 0===n&&(n=20),i||(i=0),r||(r=0),f=f?f/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.filterMessagesByInputFilterFromStorage(a._,m.history.slice,this.getHistoryMessagesStorage(e),n)),l.length){if(!(l.length{this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.saveMessages(e.messages),d.ZP&&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=this.appChatsManager.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=(0,oe.Z)(Math.max(...this.getMidsByMessage(e))),s={_:"messageService",pFlags:{is_single:!0},id:this.appMessagesIdsManager.generateTempMessageId(a),date:e.date,from_id:{_:"peerUser",user_id:o.NM},peer_id:e.peer_id,action:{_:"messageActionDiscussionStarted"},reply_to:this.generateReplyHeader(e.peerId,e.id)};this.saveMessages([s],{isOutgoing:!0}),this.threadsServiceMessagesIdsStorage[t]=s.mid}getThreadServiceMessageId(e,t){return this.threadsServiceMessagesIdsStorage[e+"_"+t]}getDiscussionMessage(e,t){return this.apiManager.invokeApiSingle("messages.getDiscussionMessage",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(t)}).then((a=>{var s;this.appChatsManager.saveApiChats(a.chats),this.appUsersManager.saveApiUsers(a.users),this.saveMessages(a.messages);const n=this.getMessageWithReplies(a.messages[0]),i=n.peerId+"_"+n.mid;this.generateThreadServiceStartMessage(n);const r=this.getHistoryStorage(n.peerId,n.mid),o=a.max_id=(0,pe.Z)(a.max_id)||0;a.read_inbox_max_id=r.readMaxId=(0,pe.Z)(null!==(s=a.read_inbox_max_id)&&void 0!==s?s:n.mid),a.read_outbox_max_id=r.readOutboxMaxId=(0,pe.Z)(a.read_outbox_max_id)||0;const p=r.history.first;return r.maxId&&r.maxId{this.newDialogsHandlePromise=void 0,this.handleNewDialogs()}))}deleteMessages(e,t,a){var s,n;return Yt(this,void 0,void 0,(function*(){let i;const r=yield this.apiManager.getConfig(),o=t.splice(r.forwarded_count_max,t.length-r.forwarded_count_max),p=t.map((e=>(0,oe.Z)(e)));if(e.isAnyChat()&&this.appPeersManager.isChannel(e)){const a=e.toChatId(),r=this.appChatsManager.getChat(a);if(!r.pFlags.creator&&!(null===(n=null===(s=r.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=this.apiManager.invokeApi("channels.deleteMessages",{channel:this.appChatsManager.getChannelInput(a),id:p}).then((e=>{this.apiUpdatesManager.processLocalUpdate({_:"updateDeleteChannelMessages",channel_id:a,messages:t,pts:e.pts,pts_count:e.pts_count})}))}else i=this.apiManager.invokeApi("messages.deleteMessages",{revoke:a,id:p}).then((e=>{this.apiUpdatesManager.processLocalUpdate({_:"updateDeleteMessages",messages:t,pts:e.pts,pts_count:e.pts_count})}));const d=[i];return o.length&&d.push(this.deleteMessages(e,o,a)),Promise.all(d).then(jt.Z)}))}readHistory(e,t=0,a,s=!1){if(this.log("readHistory:",e,t,a),!this.getReadMaxIdIfUnread(e,a)){if(a&&!s){const t=this.dialogsStorage.getForumTopic(e,a);(0,oe.Z)(t.read_inbox_max_id)||(s=!0)}if(!s){const t=this.appChatsManager.isForum(e.toChatId())&&a?this.dialogsStorage.getForumTopic(e,a):this.getDialogOnly(e);t&&this.isDialogUnread(t)&&(s=!0)}if(!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=this.apiManager.invokeApi("messages.readDiscussion",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(a),read_max_id:(0,oe.Z)(t)})),this.apiUpdatesManager.processLocalUpdate({_:"updateReadChannelDiscussionInbox",channel_id:e.toChatId(),top_msg_id:a,read_max_id:t})):this.appPeersManager.isChannel(e)?(n.readPromise||(i=this.apiManager.invokeApi("channels.readHistory",{channel:this.appChatsManager.getChannelInput(e.toChatId()),max_id:(0,oe.Z)(t)})),this.apiUpdatesManager.processLocalUpdate({_:"updateReadChannelInbox",max_id:t,channel_id:e.toChatId(),still_unread_count:void 0,pts:void 0})):(n.readPromise||(i=this.apiManager.invokeApi("messages.readHistory",{peer:this.appPeersManager.getInputPeerById(e),max_id:(0,oe.Z)(t)}).then((e=>{this.apiUpdatesManager.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:e.pts,pts_count:e.pts_count}})}))),this.apiUpdatesManager.processLocalUpdate({_:"updateReadHistoryInbox",max_id:t,peer:this.appPeersManager.getOutputPeer(e),still_unread_count:void 0,pts:void 0,pts_count:void 0})),this.rootScope.dispatchEvent("notification_reset",this.appPeersManager.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)}getUnreadMentionsKey(e,t){return e+(t?`_${t}`:"")}fixDialogUnreadMentionsIfNoMessage(e,t){const a=this.dialogsStorage.getDialogOrTopic(e,t);(null==a?void 0:a.unread_mentions_count)&&this.reloadConversationOrTopic(e)}modifyCachedMentions(e,t,a,s){const n=this.unreadMentions[this.getUnreadMentionsKey(e,s)];n&&(a?n.first.isEnd(se.D.Top)&&n.insertSlice([t]):n.delete(t))}fixUnreadMentionsCountIfNeeded(e,t,a){const s=this.dialogsStorage.getDialogOrTopic(e,a);!t.length&&(null==s?void 0:s.unread_mentions_count)&&this.reloadConversationOrTopic(e)}goToNextMention(e,t){var a,s;const n=this.getUnreadMentionsKey(e,t),i=this.goToNextMentionPromises[n];if(i)return i;const r=null!==(a=(s=this.unreadMentions)[e])&&void 0!==a?a:s[e]=new se.Z,o=r.length,p=r.first.isEnd(se.D.Top);if(!o&&p)return this.fixUnreadMentionsCountIfNeeded(e,r,t),Promise.resolve();let d=Promise.resolve();return!p&&o<25&&(d=this.loadNextMentions(e,t)),this.goToNextMentionPromises[n]=d.then((()=>{const a=r.last,s=a&&a[a.length-1];if(s)return r.delete(s),s;this.fixUnreadMentionsCountIfNeeded(e,r,t)})).finally((()=>{delete this.goToNextMentionPromises[n]}))}loadNextMentions(e,t){const a=this.unreadMentions[e],s=a.first[0]||1;return this.getUnreadMentions(e,s,-50,50,void 0,void 0,t).then((e=>{this.mergeHistoryResult(a,e,1===s?0:s,50,-50)}))}getUnreadMentions(e,t,a,s,n=0,i=0,r){return this.apiManager.invokeApiSingleProcess({method:"messages.getUnreadMentions",params:{peer:this.appPeersManager.getInputPeerById(e),offset_id:(0,oe.Z)(t),add_offset:a,limit:s,max_id:(0,oe.Z)(n),min_id:(0,oe.Z)(i),top_msg_id:r?(0,oe.Z)(r):void 0},processResult:e=>((0,ue.Z)(e),this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.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=>(0,oe.Z)(e))),e.isAnyChat()&&this.appPeersManager.isChannel(e)){const n=e.toChatId();s={_:"updateChannelReadMessagesContents",channel_id:n,messages:t},a=this.apiManager.invokeApi("channels.readMessageContents",{channel:this.appChatsManager.getChannelInput(n),id:t})}else s={_:"updateReadMessagesContents",messages:t,pts:void 0,pts_count:void 0},a=this.apiManager.invokeApi("messages.readMessageContents",{id:t}).then((e=>{s.pts=e.pts,s.pts_count=e.pts_count,this.apiUpdatesManager.processLocalUpdate(s)}));return this.apiUpdatesManager.processLocalUpdate(s),a}getHistoryStorage(e,t){var a,s,n,i,r,o;return t?null!==(s=(r=null!==(a=(i=this.threadsStorage)[e])&&void 0!==a?a:i[e]={})[t])&&void 0!==s?s:r[t]={count:null,history:new se.Z}:null!==(n=(o=this.historiesStorage)[e])&&void 0!==n?n:o[e]={count:null,history:new se.Z}}getHistoryStorageTransferable(e,t){const a=this.getHistoryStorage(e,t),{count:s,history:n,maxId:i,readMaxId:r,readOutboxMaxId:o,maxOutId:p,replyMarkup:d}=a;return{count:s,history:void 0,historySerialized:n.toJSON(),maxId:i,readMaxId:r,readOutboxMaxId:o,maxOutId:p,replyMarkup:d}}getNotifyPeerSettings(e,t){const a=this.appPeersManager.getInputNotifyPeerById({peerId:e,ignorePeerId:!0,threadId:t});return Promise.all([this.appNotificationsManager.getNotifyPeerTypeSettings(),this.appNotificationsManager.getNotifySettings(a)]).then((([a,s])=>({muted:this.appNotificationsManager.isPeerLocalMuted({peerId:e,respectType:!0,threadId:t}),peerTypeNotifySettings:s})))}getUpdateAfterReloadKey(e,t){return e+(t?"_"+t:"")}handleNewUpdateAfterReload(e,t,a){var s,n,i;const r=null!==(s=(n=this.newUpdatesAfterReloadToHandle)[i=this.getUpdateAfterReloadKey(e,a)])&&void 0!==s?s:n[i]=new Set;r.has(t)?this.log.error("here we go again",e):(t.ignoreExisting=!0,r.add(t),this.scheduleHandleNewDialogs(e,a))}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=null==e?void 0:e.peerId)||void 0===t?void 0:t.isAnyChat()){const t=(0,Qt.Z)(e,this.appChatsManager.isForum(e.peerId.toChatId()));t&&(a=e.peerId+"_"+t)}return a}updateMessage(e,t,a){return this.reloadMessages(e,t,!0).then((()=>{const s=this.getMessageByPeer(e,t);if(s)return a&&this.rootScope.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))&&this.rootScope.dispatchEvent("history_update",{storageKey:s.storage.key,message:e,sequential:s.sequential}),delete this.pendingByMessageId[e.mid]}return a}mutePeer(e){if(!(e=this.appNotificationsManager.validatePeerSettings(e)))return;const{peerId:t,muteUntil:a,threadId:s}=e,n={_:"inputPeerNotifySettings"};n.mute_until=a;const i=this.appPeersManager.getInputPeerById(t);return this.appNotificationsManager.updateNotifySettings(s?{_:"inputNotifyForumTopic",peer:i,top_msg_id:(0,oe.Z)(s)}:{_:"inputNotifyPeer",peer:i},n)}togglePeerMute({peerId:e,mute:t,threadId:a}){return void 0===t&&(t=!this.appNotificationsManager.isPeerLocalMuted({peerId:e,respectType:!1,threadId:a})),this.mutePeer({peerId:e,muteUntil:t?o.rU:0,threadId:a})}findPeerIdByMids(e){for(let t=e.length-1;t>=0;--t){const a=e[t],s=this.getMessageById(a);if(s)return s.peerId}}canSendToPeer(e,t,a="send_messages"){var s;if(this.appPeersManager.isPeerRestricted(e))return!1;if(e.isAnyChat()){const n=e.toChatId();if(t){const a=this.dialogsStorage.getForumTopic(e,t);if((null===(s=null==a?void 0:a.pFlags)||void 0===s?void 0:s.closed)&&!this.appChatsManager.hasRights(n,"manage_topics"))return!1}const i=this.appChatsManager.getChat(n);return this.appChatsManager.hasRights(n,a,void 0,!!t)&&(!i.pFlags.left||!!t)}return this.appUsersManager.canSendToUser(e)}finalizePendingMessage(e,t){const a=this.pendingByRandomId[e];if(!a)return;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&&(delete t.pFlags.is_outgoing,delete t.pending,delete t.error,delete t.random_id,delete t.send),this.rootScope.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){(0,ue.Z)(a);const{photo:e,document:s}=a.media;if(e){const a=this.appPhotosManager.getPhoto(""+t);if(a){const t=e.sizes[e.sizes.length-1],s=this.thumbsStorage.getCacheContext(e,t.type),n=this.thumbsStorage.getCacheContext(a,o.Pt);Object.assign(s,n);const i=e.sizes[e.sizes.length-1],r=(0,Vt.Z)(e,i);(0,ct.P)(r.location)}}else if(s){const e=this.appDocsManager.getDoc(""+t);if(e){const t=this.thumbsStorage.getCacheContext(e);if(e.type&&"sticker"!==e.type&&"image/gif"!==e.mime_type&&t.url){const e=this.thumbsStorage.getCacheContext(s);Object.assign(e,t),n=s,(0,ct.P)((0,ft.Z)(n,undefined),{fileName:n.file_name})}}}else a.media.poll&&(delete this.appPollsManager.polls[t],delete this.appPollsManager.results[t])}var n;const i=this.getMessageFromStorage(e,t);e.delete(t),!i.reply_markup&&a.reply_markup&&setTimeout((()=>{this.getMessageFromStorage(e,a.mid)&&this.rootScope.dispatchEvent("message_edit",{storageKey:e.key,peerId:a.peerId,mid:a.mid,message:a})}),0),this.handleReleasingMessage(i,e),this.rootScope.dispatchEvent("message_sent",{storageKey:e.key,tempId:t,tempMessage:i,mid:a.mid,message:a})}incrementMaxSeenId(e){if(!e||this.maxSeenId&&!(e>this.maxSeenId))return!1;this.maxSeenId=e,this.appStateManager.pushToState("maxSeenMsgId",e),this.apiManager.invokeApi("messages.receivedMessages",{max_id:(0,oe.Z)(e)})}getMessageReactionsListAndReadParticipants(e,t,a,s,n,i){var r,o;return Yt(this,void 0,void 0,(function*(){const p={reactions:[],count:0,next_offset:void 0},d=yield this.canViewMessageReadParticipants(e);return d&&void 0===t?t=100:void 0===t&&(t=50),Promise.all([!d||a||n?[]:this.getMessageReadParticipants(e.peerId,e.mid).catch((()=>[])),(null===(o=null===(r=e.reactions)||void 0===r?void 0:r.recent_reactions)||void 0===o?void 0:o.length)&&!i?this.appReactionsManager.getMessageReactionsList(e.peerId,e.mid,t,a,s).catch((e=>p)):p]).then((([e,t])=>{const a=e.map((e=>e.toPeerId())),s=a.slice();(0,ne.Z)(s,((e,a,s)=>{t.reactions.some((t=>this.appPeersManager.getPeerId(t.peer_id)===e))&&s.splice(a,1)}));let n=t.reactions.map((e=>({peerId:this.appPeersManager.getPeerId(e.peer_id),reaction:e.reaction})));return n=n.concat(s.map((e=>({peerId:e})))),{reactions:t.reactions,reactionsCount:t.count,readParticipants:a,combined:n,nextOffset:t.next_offset}}))}))}getMessageReadParticipants(e,t){return this.apiManager.invokeApiSingle("messages.getMessageReadParticipants",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(t)}).then((e=>e.map((e=>e.toUserId()))))}canViewMessageReadParticipants(e){return Yt(this,void 0,void 0,(function*(){if("message"!==(null==e?void 0:e._)||e.pFlags.is_outgoing||!e.pFlags.out||!this.appPeersManager.isAnyGroup(e.peerId))return!1;const t=this.appChatsManager.getChat(e.peerId.toChatId()),a=yield this.apiManager.getAppConfig();return t.participants_count<=a.chat_read_mark_size_threshold&&(0,te.Z)(!0)-e.date(0,oe.Z)(e))),increment:!0}).then((a=>{const s=new Array(t.length);for(let n=0,i=t.length;n{const{chatPeerIds:t}=e.state;return t[t.length-1]===a}));!n&&s.length&&(s.sort(((e,t)=>e.state.idleStartTime-t.state.idleStartTime)),n=s[0].state.idleStartTime?s[s.length-1]:s[0]),f.Z.getInstance().invokeVoid("notificationBuild",Object.assign({message:e},t),null==n?void 0:n.source)}getScheduledMessagesStorage(e){var t,a;return null!==(t=(a=this.scheduledMessagesStorage)[e])&&void 0!==t?t:a[e]=this.createMessageStorage(e,"scheduled")}getScheduledMessageByPeer(e,t){return this.getMessageFromStorage(this.getScheduledMessagesStorage(e),t)}getScheduledMessages(e){if(!this.canSendToPeer(e))return;const t=this.getScheduledMessagesStorage(e);return t.size?[...t.keys()]:this.apiManager.invokeApiSingle("messages.getScheduledHistory",{peer:this.appPeersManager.getInputPeerById(e),hash:""}).then((t=>{if("messages.messagesNotModified"!==t._){this.appUsersManager.saveApiUsers(t.users),this.appChatsManager.saveApiChats(t.chats);const a=this.getScheduledMessagesStorage(e);return this.saveMessages(t.messages,{storage:a,isScheduled:!0}),[...a.keys()]}return[]}))}sendScheduledMessages(e,t){return this.apiManager.invokeApi("messages.sendScheduledMessages",{peer:this.appPeersManager.getInputPeerById(e),id:t.map((e=>(0,oe.Z)(e)))}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}deleteScheduledMessages(e,t){return this.apiManager.invokeApi("messages.deleteScheduledMessages",{peer:this.appPeersManager.getInputPeerById(e),id:t.map((e=>(0,oe.Z)(e)))}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}getMessageWithReplies(e){return this.filterMessages(e,(e=>!!e.replies))[0]}getMessageWithCommentReplies(e){if(e.peerId!==o.hj){const t=null==(e=this.getMessageWithReplies(e))?void 0:e.replies;if(!t||!t.pFlags.comments||t.channel_id.toChatId()===o.IA)return}return e}isFetchIntervalNeeded(e){return e.isAnyChat()&&(!this.appChatsManager.isInChat(e.toChatId())||this.appChatsManager.isForum(e.toChatId()))}getNewHistory(e,t){var a;return Yt(this,void 0,void 0,(function*(){if(!this.isFetchIntervalNeeded(e))return;const s=this.getHistoryStorage(e,t),n=s.history.slice;if(!n.isEnd(se.D.Bottom))return;delete s.maxId,n.unsetEnd(se.D.Bottom);const i=yield this.getHistory(e,null!==(a=n[0])&&void 0!==a?a:1,0,50,t);for(let t=0,a=i.history.length;t{const e=i.history.sliceMe(t,r,a),s=(null==e?void 0:e.slice)||i.history.constructSlice();return{count:i.count,history:Array.from(s),isEnd:s.getEnds(),offsetIdOffset:(null==e?void 0:e.offsetIdOffset)||i.count}})):{count:i.count,history:Array.from(o.slice),isEnd:o.slice.getEnds(),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&&(0,oe.Z)(a)&&!c.includes(a)&&pc[e]);++e);c.splice(e,0,a)}const l=e.insertSlice(c)||e.slice;return d&&l.setEnd(se.D.Top),f&&l.setEnd(se.D.Bottom),Object.assign({slice:l,mids:c,messages:i},r)}fillHistoryStorage(e,t,a,s,n,i){const r=n.maxId;return this.requestHistory(e,t,a,s,void 0,i).then((i=>{const{count:o,isBottomEnd:p,slice:d,messages:f}=this.mergeHistoryResult(n.history,i,t,a,s);n.count=o;for(let t=0,a=f.length;t{d.ZP&&this.log("requestHistory result:",e,r,t,a,s),this.appUsersManager.saveApiUsers(r.users),this.appChatsManager.saveApiChats(r.chats),this.saveMessages(r.messages),"pts"in r&&this.apiUpdatesManager.addChannelState(e.toChatId(),r.pts);let o=r.messages.length,p=r.count;o&&!r.messages[o-1]&&(r.messages.splice(o-1,1),o--,p--);const f=this.getHistoryStorage(e,i),c=r.messages[o-1];if(o&&c.grouped_id){const t=f.history.findSlice(c.mid);if(t&&t.slice.length+r.messages.lengthr))}return r}),(t=>{if("CHANNEL_PRIVATE"===t.type){let t=this.appChatsManager.getChat(e.toChatId());"channel"===t._&&(t={_:"channelForbidden",id:e.toChatId(),access_hash:t.access_hash,title:t.title,pFlags:t.pFlags}),this.apiUpdatesManager.processUpdateMessage({_:"updates",updates:[{_:"updateChannel",channel_id:e.toChatId()}],chats:[t],users:[]})}throw t}))}fetchSingleMessages(){return this.fetchSingleMessagesPromise?this.fetchSingleMessagesPromise:this.fetchSingleMessagesPromise=(0,P.Z)(0).then((()=>{const e=[];for(const[t,a]of this.needSingleMessages){const s=[...a.keys()],n=s.map((e=>({_:"inputMessageID",id:(0,oe.Z)(e)})));let i;i=t.isAnyChat()&&this.appPeersManager.isChannel(t)?this.apiManager.invokeApiSingle("channels.getMessages",{channel:this.appChatsManager.getChannelInput(t.toChatId()),id:n}):this.apiManager.invokeApiSingle("messages.getMessages",{id:n});const r=i.then((e=>{(0,ue.Z)(e),this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats);const t=this.saveMessages(e.messages);for(let e=0;e{this.rootScope.dispatchEvent("messages_downloaded",{peerId:t,mids:s})}));e.push(r)}return this.needSingleMessages.clear(),Promise.all(e).then(jt.Z,jt.Z).then((()=>{this.fetchSingleMessagesPromise=void 0,this.needSingleMessages.size&&this.fetchSingleMessages()}))}))}reloadMessages(e,t,a){if(Array.isArray(t))return Promise.all(t.map((t=>this.reloadMessages(e,t,a))));const s=this.getMessageByPeer(e,t);if(s&&!a)return this.rootScope.dispatchEvent("messages_downloaded",{peerId:e,mids:[t]}),Promise.resolve(s);{let a=this.needSingleMessages.get(e);a||this.needSingleMessages.set(e,a=new Map);let s=a.get(t);return s||(s=(0,v.Z)(),a.set(t,s),this.fetchSingleMessages(),s)}}getExtendedMedia(e,t){let a=this.extendedMedia.get(e);a||this.extendedMedia.set(e,a=new Map);const s=(0,v.Z)(),n=[],i=t.map((t=>{let i=a.get(t);return i||(a.set(t,i=s),n.push(t),i.then((()=>{a.delete(t),a.size||this.extendedMedia.get(e)!==a||this.extendedMedia.delete(e)}))),i}));return n.length?this.apiManager.invokeApi("messages.getExtendedMedia",{peer:this.appPeersManager.getInputPeerById(e),id:n.map((e=>(0,oe.Z)(e)))}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e),s.resolve()})):s.resolve(),Promise.all(i)}fetchMessageReplyTo(e){if(!e.reply_to_mid)return Promise.resolve(this.generateEmptyMessage(0));const t=e.reply_to.reply_to_peer_id?this.appPeersManager.getPeerId(e.reply_to.reply_to_peer_id):e.peerId;return this.reloadMessages(t,e.reply_to_mid).then((t=>{if(t||delete(e=this.getMessageByPeer(e.peerId,e.mid)).reply_to_mid,"messageService"===e._){const t=e.peerId;this.rootScope.dispatchEvent("message_edit",{storageKey:`${t}_history`,peerId:t,mid:e.mid,message:e}),this.isMessageIsTopMessage(e)&&this.rootScope.dispatchEvent("dialogs_multiupdate",new Map([[t,{dialog:this.getDialogOnly(t)}]]))}return t}))}getTypingKey(e,t){return t?`${e}_${t}`:e}setTyping(e,t,a,s){var n;s&&!this.appPeersManager.isForum(e)&&(s=void 0);const i=this.getTypingKey(e,s);let r=this.typings[i];return e&&this.canSendToPeer(e)&&e!==this.appPeersManager.peerId&&(a||(null===(n=null==r?void 0:r.action)||void 0===n?void 0:n._)!==t._)?((null==r?void 0:r.timeout)&&clearTimeout(r.timeout),r=this.typings[i]={action:t},this.apiManager.invokeApi("messages.setTyping",{peer:this.appPeersManager.getInputPeerById(e),action:t,top_msg_id:s?(0,oe.Z)(s):void 0}).finally((()=>{r===this.typings[i]&&(r.timeout=E.Z.setTimeout((()=>{delete this.typings[i]}),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)&&this.referenceDatabase.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=this.appWebPagesManager.getMessageKeyForPendingWebPage(e.peerId,e.mid,s);this.appWebPagesManager.deleteWebPageFromPending(a.webpage,n)}a.poll&&this.appPollsManager.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){this.fixDialogUnreadMentionsIfNoMessage(e);continue}this.handleReleasingMessage(a,t),this.updateMessageRepliesIfNeeded(a),a.pFlags.out||a.pFlags.is_outgoing||!a.pFlags.unread||(++s.unread,this.rootScope.dispatchEvent("notification_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)}if(s.albums)for(const e in s.albums)this.dispatchAlbumEdit(e,t,[...s.albums[e]]);return s}handleEditedMessage(e,t,a){var s;if("message"===e._){if(null===(s=e.media)||void 0===s?void 0:s.webpage){const t=this.appWebPagesManager.getMessageKeyForPendingWebPage(e.peerId,e.mid,!!e.pFlags.is_scheduled);this.appWebPagesManager.deleteWebPageFromPending(e.media.webpage,t)}const t=e.grouped_id;t&&this.dispatchAlbumEdit(t,a,[])}}dispatchAlbumEdit(e,t,a){const s=this.getMidsByAlbum(e).map((e=>this.getMessageFromStorage(t,e)));this.rootScope.dispatchEvent("album_edit",{peerId:s[0].peerId,groupId:e,deletedMids:a||[],messages:s})}getDialogUnreadCount(e){var t;let a=e.unread_count;if(!this.dialogsStorage.isTopic(e)&&this.appPeersManager.isForum(e.peerId)){const t=this.dialogsStorage.getForumUnreadCount(e.peerId);a=t instanceof Promise?0:t.count}return a||+!!(null===(t=e.pFlags)||void 0===t?void 0:t.unread_mark)}isDialogUnread(e){return!!this.getDialogUnreadCount(e)}canForward(e){return"message"===(null==e?void 0:e._)&&!e.pFlags.noforwards&&!this.appPeersManager.noForwards(e.peerId)}pushBatchUpdate(e,t,a,s){let n=this.batchUpdates[e];n||(n=this.batchUpdates[e]={callback:t,batch:new Map}),n.batch.has(a)||(n.batch.set(a,s?s():void 0),this.batchUpdatesDebounced())}getMessagesFromMap(e){const t=new Map;for(const[a,s]of e){const[e,n]=a.split("_"),i=this.getMessageByPeer(e.toPeerId(),+n);i&&t.set(i,s)}return t}saveDefaultSendAs(e,t){return this.appProfileManager.getCachedFullChat(e.toChatId()).default_send_as=this.appPeersManager.getOutputPeer(t),this.apiManager.invokeApi("messages.saveDefaultSendAs",{peer:this.appPeersManager.getInputPeerById(e),send_as:this.appPeersManager.getInputPeerById(t)})}}var aa=a(6724);function sa(e){const t=e.replace("input","");return t[0].toLowerCase()+t.slice(1)}class na extends G{constructor(){super(...arguments),this.peerSettings={notifyPeer:{},notifyUsers:null,notifyChats:null,notifyBroadcasts:null,notifyForumTopic:{}},this.checkMuteUntil=()=>{void 0!==this.checkMuteUntilTimeout&&(clearTimeout(this.checkMuteUntilTimeout),this.checkMuteUntilTimeout=void 0);const e=(0,te.Z)(!0);let t=o.rU;const a=a=>{if(a instanceof Promise)return!1;const s=a.mute_until;return!!s&&(s<=e?(a.mute_until=0,!0):(s{for(const t in this.peerSettings[e]){const s=this.peerSettings[e][t];if(a(s)){const[e,a]=t.split("_"),n=this.appPeersManager.getOutputPeer(e.toPeerId());this.apiUpdatesManager.saveUpdate({_:"updateNotifySettings",peer:a?{_:"notifyForumTopic",peer:n,top_msg_id:+a}:{_:"notifyPeer",peer:n},notify_settings:s})}}}));const s=Math.min(18e5,1e3*(t-e));this.checkMuteUntilTimeout=E.Z.setTimeout(this.checkMuteUntil,s)}}after(){return this.checkMuteUntilThrottled=(0,aa.Z)(this.checkMuteUntil,1e3,!1),this.apiUpdatesManager.addMultipleEventsListeners({updateNotifySettings:e=>{const{peer:t}=e,a="notifyForumTopic"===t._,s="notifyPeer"===t._||a,n=s&&this.appPeersManager.getPeerId(t.peer),i=s?void 0:t._;this.savePeerSettings({key:i,peerId:n,threadId:a?(0,pe.Z)(t.top_msg_id):void 0,settings:e.notify_settings}),this.rootScope.dispatchEvent("notify_settings",e)}}),this.appStateManager.getState().then((e=>{if(e.notifySettings)for(const t in e.notifySettings)(0,ue.Z)(t),this.savePeerSettings({key:t,settings:e.notifySettings[t]})}))}getNotifySettings(e){let t,a=sa(e._),s=this.peerSettings[a];return"inputNotifyPeer"===e._&&(t=a=this.appPeersManager.getPeerId(e.peer),s=s[a]),s||((s||this.peerSettings)[a]=this.apiManager.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 this.apiManager.invokeApi("account.updateNotifySettings",{peer:e,settings:t}).then((a=>{a&&this.apiUpdatesManager.processLocalUpdate({_:"updateNotifySettings",peer:Object.assign(Object.assign({},e),{_:sa(e._)}),notify_settings:Object.assign(Object.assign({},t),{_:"peerNotifySettings"})})}))}getContactSignUpNotification(){return this.notifyContactsSignUp?this.notifyContactsSignUp:this.notifyContactsSignUp=this.apiManager.invokeApi("account.getContactSignUpNotification")}setContactSignUpNotification(e){this.apiManager.invokeApi("account.setContactSignUpNotification",{silent:e}).then((t=>{this.notifyContactsSignUp=Promise.resolve(!e)}))}getPeerKey(e,t){return e+(t?"_"+t:"")}savePeerSettings({key:e,peerId:t,threadId:a,settings:s}){let n;t&&(e=this.getPeerKey(t,a),n=this.peerSettings[a?"notifyForumTopic":"notifyPeer"]),(n||this.peerSettings)[e]=s,t?this.checkMuteUntilThrottled():(this.rootScope.dispatchEvent("notify_peer_type_settings",{key:e,settings:s}),this.appStateManager.getState().then((t=>{const a=t.notifySettings;a[e]=s,this.appStateManager.pushToState("notifySettings",a)})))}isMuted(e){return"peerNotifySettings"===e._&&(e.silent||void 0!==e.mute_until&&1e3*e.mute_until>(0,te.Z)())}getPeerMuted(e){const t=this.getNotifySettings({_:"inputNotifyPeer",peer:this.appPeersManager.getInputPeerById(e)});return(t instanceof Promise?t:Promise.resolve(t)).then((e=>this.isMuted(e)))}getPeerLocalSettings({peerId:e,respectType:t=!0,threadId:a}){const s={_:"peerNotifySettings"},n=this.getPeerKey(e,a),i=this.peerSettings[a?"notifyForumTopic":"notifyPeer"][n];if(!i||i instanceof Promise||Object.assign(s,i),t){const t=sa(this.appPeersManager.getInputNotifyPeerById({peerId:e,ignorePeerId:!0,threadId:a})._),n=this.peerSettings[t];if(n&&!(n instanceof Promise))for(const e in n)void 0===s[e]&&(s[e]=n[e])}return s}validatePeerSettings(e){if(e.peerId!==this.appPeersManager.peerId)return e.threadId&&!this.appPeersManager.isForum(e.peerId)&&(e.threadId=void 0),e}isPeerLocalMuted(e){if(!(e=this.validatePeerSettings(e)))return!1;if(e.threadId){const t=this.getPeerLocalSettings(Object.assign(Object.assign({},e),{respectType:!1}));return void 0!==t.silent||void 0!==t.mute_until?this.isMuted(t):this.isPeerLocalMuted(Object.assign(Object.assign({},e),{threadId:void 0}))}const t=this.getPeerLocalSettings(e);return this.isMuted(t)}}var ia=a(677),ra=a(617),oa=a(7361),pa=a(7419),da=a(7256);class fa extends G{get peerId(){return this.appUsersManager.userId.toPeerId()}canPinMessage(e){return e.isUser()||this.appChatsManager.hasRights(e.toChatId(),"pin_messages")}getPeerPhoto(e){const t=this.getPeer(e);return(0,da.Z)(t)}getPeerMigratedTo(e){if(e.isUser())return!1;const t=this.appChatsManager.getChat(e.toChatId()),a=null==t?void 0:t.migrated_to;return!(!a||!t.pFlags.deactivated)&&(0,le.Z)(a)}getOutputPeer(e){if(e.isUser())return{_:"peerUser",user_id:e.toUserId()};const t=e.toChatId();return this.appChatsManager.isChannel(t)?{_:"peerChannel",channel_id:t}:{_:"peerChat",chat_id:t}}getPeerString(e){return e.isUser()?this.appUsersManager.getUserString(e.toUserId()):this.appChatsManager.getChatString(e.toChatId())}getPeerUsername(e){return this.getPeerActiveUsernames(e)[0]||""}getPeerActiveUsernames(e){const t=this.getPeer(e);return(0,Jt.Z)(t)}getPeer(e){return e.isUser()?this.appUsersManager.getUser(e.toUserId()):this.appChatsManager.getChat(e.toChatId())}getPeerId(e){return(0,le.Z)(e)||(0,fe.Z)(e)&&"inputPeerSelf"===e._&&this.peerId||o.NM}getDialogPeer(e){return{_:"dialogPeer",peer:this.getOutputPeer(e)}}isChannel(e){return!e.isUser()&&this.appChatsManager.isChannel(e.toChatId())}isMegagroup(e){return!e.isUser()&&this.appChatsManager.isMegagroup(e.toChatId())}isForum(e){return!e.isUser()&&this.appChatsManager.isForum(e.toChatId())}isAnyGroup(e){return!e.isUser()&&!this.appChatsManager.isBroadcast(e.toChatId())}isBroadcast(e){return this.isChannel(e)&&!this.isMegagroup(e)}isBot(e){return e.isUser()&&this.appUsersManager.isBot(e.toUserId())}isContact(e){return e.isUser()&&this.appUsersManager.isContact(e.toUserId())}isUser(e){return(0,ra.Z)(e)}isAnyChat(e){return(0,oa.Z)(e)}isPeerRestricted(e){return(0,pa.Z)(this.getPeer(e))}getRestrictionReasonText(e){const t=this.getPeer(e),a=t.restriction_reason?(0,ia.RP)(t.restriction_reason):void 0;return a?a.text:e.isUser()?"This user is restricted":"This chat is restricted"}getInputNotifyPeerById({peerId:e,ignorePeerId:t,threadId:a}){return t?e.isUser()?{_:"inputNotifyUsers"}:this.isBroadcast(e)?{_:"inputNotifyBroadcasts"}:{_:"inputNotifyChats"}:a?{_:"inputNotifyForumTopic",peer:this.getInputPeerById(e),top_msg_id:(0,oe.Z)(a)}:{_:"inputNotifyPeer",peer:this.getInputPeerById(e)}}getInputPeerById(e){if(!e)return{_:"inputPeerEmpty"};if(!e.isUser()){const t=e.toChatId();return this.appChatsManager.getInputPeer(t)}const t=e.toUserId();return this.appUsersManager.getUserInputPeer(t)}getInputPeerSelf(){return{_:"inputPeerSelf"}}getInputDialogPeerById(e){return{_:"inputDialogPeer",peer:(0,fe.Z)(e)?e:this.getInputPeerById(e)}}getPeerSearchText(e){let t;return t=this.isUser(e)?"%pu "+this.appUsersManager.getUserSearchText(e.toUserId()):"%pg "+(this.appChatsManager.getChat(e.toChatId()).title||""),t}getDialogType(e){return this.isMegagroup(e)?"megagroup":this.isChannel(e)?"channel":this.isUser(e)?e===this.peerId?"saved":"chat":"group"}getDeleteButtonText(e){switch(this.getDialogType(e)){case"channel":return this.appChatsManager.hasRights(e.toChatId(),"delete_chat")?"ChannelDelete":"ChatList.Context.LeaveChannel";case"megagroup":case"group":return this.appChatsManager.hasRights(e.toChatId(),"delete_chat")?"DeleteMega":"ChatList.Context.LeaveGroup";default:return"ChatList.Context.DeleteChat"}}noForwards(e){var t;return!e.isUser()&&!!(null===(t=this.appChatsManager.getChat(e.toChatId()).pFlags)||void 0===t?void 0:t.noforwards)}}class ca extends G{constructor(){super(...arguments),this.photos={}}savePhoto(e,t){var a;if(!e||"photoEmpty"===e._)return;const s=this.photos[e.id];if(e.file_reference&&(pt("file_reference",s,e),this.referenceDatabase.saveContext(e.file_reference,t)),null===(a=e.sizes)||void 0===a?void 0:a.length){e.sizes.sort(((e,t)=>(e.size||(e.sizes?1/0:0))-(t.size||(t.sizes?1/0:0))));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}getUserPhotos(e,t="0",a=20){const s=this.appUsersManager.getUserInput(e);return this.apiManager.invokeApiCacheable("photos.getUserPhotos",{user_id:s,offset:0,limit:a,max_id:t},{cacheSeconds:60}).then((a=>{this.appUsersManager.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}}))}getPhoto(e){return(0,fe.Z)(e)?e:this.photos[e]}}class la extends G{constructor(){super(...arguments),this.polls={},this.results={},this.pollToMessages={},this.log=(0,I.kg)("POLLS",I.v9.Error)}after(){this.apiUpdatesManager.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,this.rootScope.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.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=(0,ke.Z)(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,r=this.appPeersManager.getInputPeerById(i);return e.pFlags.is_outgoing?this.appMessagesManager.invokeAfterMessageIsSent(n,"sendVote",(e=>(this.log("invoke sendVote callback"),this.sendVote(e,t)))):this.apiManager.invokeApi("messages.sendVote",{peer:r,msg_id:(0,oe.Z)(e.mid),options:s}).then((e=>{this.log("sendVote updates:",e),this.apiUpdatesManager.processUpdateMessage(e)}))}getResults(e){const t=this.appPeersManager.getInputPeerById(e.peerId);return this.apiManager.invokeApi("messages.getPollResults",{peer:t,msg_id:(0,oe.Z)(e.mid)}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e),this.log("getResults updates:",e)}))}getVotes(e,t,a,s=20){return this.apiManager.invokeApi("messages.getPollVotes",{peer:this.appPeersManager.getInputPeerById(e.peerId),id:(0,oe.Z)(e.mid),option:t,offset:a,limit:s}).then((e=>(this.log("getPollVotes messages:",e),this.appUsersManager.saveApiUsers(e.users),e)))}stopPoll(e){const t=e.media.poll;if(t.pFlags.closed)return Promise.resolve();const a=(0,ve.Z)(t);return a.pFlags.closed=!0,this.appMessagesManager.editMessage(e,void 0,{newMedia:this.getInputMediaPoll(a)}).then((()=>{}),(e=>{this.log.error("stopPoll error:",e)}))}}class ma extends G{constructor(){super(...arguments),this.privacy={}}after(){this.apiUpdatesManager.addMultipleEventsListeners({updatePrivacy:e=>{const t=e.key._;this.privacy[t]=e.rules,this.rootScope.dispatchEvent("privacy_update",e)}})}setPrivacy(e,t){return this.apiManager.invokeApi("account.setPrivacy",{key:{_:e},rules:t}).then((a=>(this.appUsersManager.saveApiUsers(a.users),this.appChatsManager.saveApiChats(a.chats),this.apiUpdatesManager.processLocalUpdate({_:"updatePrivacy",key:{_:sa(e)},rules:t.map((e=>{const t={};return Object.assign(t,e),t._=sa(t._),t}))}),a.rules)))}getPrivacy(e){const t=sa(e),a=this.privacy[t];return a?Promise.resolve(a):this.privacy[t]=this.apiManager.invokeApi("account.getPrivacy",{key:{_:e}}).then((e=>(this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.privacy[t]=e.rules)))}getGlobalPrivacySettings(){return this.apiManager.invokeApi("account.getGlobalPrivacySettings")}setGlobalPrivacySettings(e){return this.apiManager.invokeApi("account.setGlobalPrivacySettings",{settings:e})}}var ga=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 ha=18e4;class ua extends G{constructor(){super(...arguments),this.usersFull={},this.chatsFull={},this.fullExpiration={},this.onUpdateUserTyping=e=>{var t,a;const s=e.user_id?e.user_id.toPeerId():this.appPeersManager.getPeerId(e.from_id);if(this.appPeersManager.peerId===s||"speakingInGroupCallAction"===e.action._)return;const n=e.top_msg_id,i=n?(0,pe.Z)(n):void 0,r=this.appPeersManager.getPeerId(e),o=this.getTypingsKey(r,i),p=null!==(t=(a=this.typingsInPeer)[o])&&void 0!==t?t:a[o]=[];let d=p.find((e=>e.userId===s));const f=()=>{delete d.timeout;const e=p.indexOf(d);-1!==e&&p.splice(e,1),this.rootScope.dispatchEvent("peer_typings",{peerId:r,threadId:i,typings:p}),p.length||delete this.typingsInPeer[o]};if(void 0!==(null==d?void 0:d.timeout)&&clearTimeout(d.timeout),"sendMessageCancelAction"===e.action._){if(!d)return;return void f()}d||(d={userId:s},p.push(d)),d.action=e.action;const c=this.appUsersManager.hasUser(s);c?this.appUsersManager.forceUserOnline(s):"updateChatUserTyping"===e._&&e.chat_id&&this.appChatsManager.hasChat(e.chat_id)&&!this.appChatsManager.isChannel(e.chat_id)&&Promise.resolve(this.getChatFull(e.chat_id)).then((()=>{void 0!==d.timeout&&this.appUsersManager.hasUser(s)&&this.rootScope.dispatchEvent("peer_typings",{peerId:r,threadId:i,typings:p})})),d.timeout=E.Z.setTimeout(f,6e3),c&&this.rootScope.dispatchEvent("peer_typings",{peerId:r,threadId:i,typings:p})},this.onUpdatePeerBlocked=e=>{const t=this.appPeersManager.getPeerId(e.peer_id);if(this.appPeersManager.isUser(t)){const a=t.toUserId(),s=this.usersFull[a];s&&(e.blocked?s.pFlags.blocked=!0:delete s.pFlags.blocked),this.rootScope.dispatchEvent("user_full_update",a)}this.rootScope.dispatchEvent("peer_block",{peerId:t,blocked:e.blocked})}}after(){this.apiUpdatesManager.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,this.rootScope.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;const s=this.chatsFull[e],n=this.appChatsManager.getChat(e);if(!s||!n)return;let i=!1;!!s.call!=!!(null===(t=n.pFlags)||void 0===t?void 0:t.call_active)&&(i=!0);const{photo:r}=n;if(r){const e="chatPhotoEmpty"!==r._;(e!==!(!s.chat_photo||"photoEmpty"===s.chat_photo._)||e&&r.photo_id!==(null===(a=s.chat_photo)||void 0===a?void 0:a.id))&&(i=!0)}i&&this.refreshFullPeer(e.toPeerId(!0))})),this.rootScope.addEventListener("channel_update",(e=>{this.refreshFullPeer(e.toPeerId(!0))})),this.rootScope.addEventListener("chat_full_update",(e=>{this.rootScope.dispatchEvent("peer_full_update",e.toPeerId(!0))})),this.rootScope.addEventListener("user_full_update",(e=>{this.rootScope.dispatchEvent("peer_full_update",e.toPeerId(!1))})),this.rootScope.addEventListener("invalidate_participants",(e=>{this.invalidateChannelParticipants(e)})),this.typingsInPeer={}}getProfile(e,t){return this.usersFull[e]&&!t&&Date.now(){this.appChatsManager.saveApiChats(t.chats,!0),this.appUsersManager.saveApiUsers(t.users);const a=t.full_user,s=e.toPeerId(!1);a.profile_photo&&(a.profile_photo=this.appPhotosManager.savePhoto(a.profile_photo,{type:"profilePhoto",peerId:s}));const n=a.bot_info;if(n){const t={type:"userFull",userId:e};n.description_document=this.appDocsManager.saveDoc(n.description_document,t),n.description_photo=this.appPhotosManager.savePhoto(n.description_photo,t)}return this.appNotificationsManager.savePeerSettings({peerId:s,settings:a.notify_settings}),this.usersFull[e]=a,this.fullExpiration[s]=Date.now()+ha,this.rootScope.dispatchEvent("user_full_update",e),a}})}getProfileByPeerId(e,t){return this.appPeersManager.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 ga(this,void 0,void 0,(function*(){const t=yield this.getProfileByPeerId(e);switch(t._){case"userFull":return t.profile_photo;case"channelFull":case"chatFull":return t.chat_photo}}))}getChatFull(e,t){if(this.appChatsManager.isChannel(e))return this.getChannelFull(e,t);const a=e.toPeerId(!0),s=this.chatsFull[e];if(s&&!t&&Date.now(){this.appChatsManager.saveApiChats(t.chats,!0),this.appUsersManager.saveApiUsers(t.users);const s=t.full_chat;return s&&s.chat_photo&&s.chat_photo.id&&(s.chat_photo=this.appPhotosManager.savePhoto(s.chat_photo,{type:"profilePhoto",peerId:a})),s.call&&this.appGroupCallsManager.saveGroupCall(s.call,e),this.appNotificationsManager.savePeerSettings({peerId:a,settings:s.notify_settings}),this.chatsFull[e]=s,this.fullExpiration[a]=Date.now()+ha,this.rootScope.dispatchEvent("chat_full_update",e),s}})}getChatInviteLink(e,t){return ga(this,void 0,void 0,(function*(){const a=yield this.getChatFull(e);return!t&&a.exported_invite&&"chatInviteExported"==a.exported_invite._?a.exported_invite.link:this.apiManager.invokeApi("messages.exportChatInvite",{peer:this.appPeersManager.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=this.appChatsManager.getChat(e);if((null==t?void 0:t.pFlags)&&t.pFlags.broadcast&&!t.pFlags.creator&&!t.admin_rights)return Promise.reject()}return this.apiManager.invokeApiCacheable("channels.getParticipants",{channel:this.appChatsManager.getChannelInput(e),filter:t,offset:s,limit:a,hash:"0"},{cacheSeconds:60}).then((e=>(this.appUsersManager.saveApiUsers(e.users),e)))}getChannelParticipant(e,t){return this.apiManager.invokeApiSingle("channels.getParticipant",{channel:this.appChatsManager.getChannelInput(e),participant:this.appPeersManager.getInputPeerById(t)}).then((e=>(this.appUsersManager.saveApiUsers(e.users),e.participant)))}getChannelFull(e,t){const a=e.toPeerId(!0);return void 0!==this.chatsFull[e]&&!t&&Date.now(){this.appChatsManager.saveApiChats(t.chats,!0),this.appUsersManager.saveApiUsers(t.users);const s=t.full_chat;return s&&s.chat_photo.id&&(s.chat_photo=this.appPhotosManager.savePhoto(s.chat_photo,{type:"profilePhoto",peerId:a})),s.call&&this.appGroupCallsManager.saveGroupCall(s.call,e),this.appNotificationsManager.savePeerSettings({peerId:a,settings:s.notify_settings}),this.chatsFull[e]=s,this.fullExpiration[a]=Date.now()+ha,this.rootScope.dispatchEvent("chat_full_update",e),s},processError:t=>{if("CHANNEL_PRIVATE"===t.type){const t=this.appChatsManager.getChat(e);this.apiUpdatesManager.processUpdateMessage({_:"updates",updates:[{_:"updateChannel",channel_id:e}],chats:["channelForbidden"===t._?t:{_:"channelForbidden",id:e,access_hash:t.access_hash,title:t.title,pFlags:t.pFlags}],users:[]})}throw t}})}getMentions(e,t,a){const s=e=>{"@"===t.charAt(0)&&(t=t.slice(1));const a=new ae.Z({ignoreCase:!0}),s=new Map;e.forEach((e=>{a.indexObject(e.id,this.appUsersManager.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};let n;return n=this.appChatsManager.isChannel(e)?this.getChannelParticipants(e,{_:"channelParticipantsMentions",q:t,top_msg_id:(0,oe.Z)(a)},50,0).then((e=>e.participants.map((e=>(0,xe.Z)(e))))):e?Promise.resolve(this.getChatFull(e)).then((e=>e.participants.participants.map((e=>e.user_id.toPeerId())))):Promise.resolve([]),Promise.all([this.appUsersManager.getTopPeers("bots_inline").catch((()=>[])),n]).then((e=>{const t=e[0].concat(e[1].map((e=>({id:e,rating:0}))));return s(t)}))}invalidateChannelParticipants(e){this.apiManager.clearCache("channels.getParticipants",(t=>t.channel.channel_id===e)),this.refreshFullPeer(e.toPeerId(!0))}refreshFullPeer(e){if(e.isUser()){const t=e.toUserId();delete this.usersFull[t],this.rootScope.dispatchEvent("user_full_update",t)}else{const t=e.toChatId();delete this.chatsFull[t],this.rootScope.dispatchEvent("chat_full_update",t)}}updateProfile(e,t,a){return this.apiManager.invokeApi("account.updateProfile",{first_name:e,last_name:t,about:a}).then((e=>{if(this.appUsersManager.saveApiUser(e),void 0!==a){const t=e.id.toPeerId(),s=this.usersFull[e.id];s&&(s.about=a),this.rootScope.dispatchEvent("peer_bio_edit",t)}return this.getProfile(e.id,!0)}))}uploadProfilePhoto(e){return this.apiManager.invokeApi("photos.uploadProfilePhoto",{file:e}).then((e=>{const t=e.photo;if(!e.users.length){const a=t.sizes.find((e=>"photoStrippedSize"===e._));e.users.push(Object.assign(Object.assign({},this.appUsersManager.getSelf()),{photo:{_:"userProfilePhoto",dc_id:t.dc_id,photo_id:t.id,stripped_thumb:null==a?void 0:a.bytes,pFlags:{}}}))}this.appUsersManager.saveApiUsers(e.users);const a=this.appPeersManager.peerId;this.appPhotosManager.savePhoto(e.photo,{type:"profilePhoto",peerId:a});const s=a.toUserId();this.apiUpdatesManager.processLocalUpdate({_:"updateUser",user_id:s})}))}deletePhotos(e){return this.apiManager.invokeApiSingle("photos.deletePhotos",{id:e.map((e=>Ct(this.appPhotosManager.getPhoto(e))))}).then((e=>{}))}verifyParticipantForOnlineCount(e){const t=this.appUsersManager.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 ga(this,void 0,void 0,(function*(){if(this.appChatsManager.isBroadcast(e))return 1;const a=yield this.getChatFull(e);if(this.appChatsManager.isMegagroup(e)){if(a.participants_count<=100){const t=yield this.getChannelParticipants(e,{_:"channelParticipantsRecent"},100);return this.reduceParticipantsForOnlineCount(t.participants)}const s=yield this.apiManager.invokeApiCacheable("messages.getOnlines",{peer:this.appChatsManager.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}))}getTypingsKey(e,t){return e+(t?`_${t}`:"")}getPeerTypings(e,t){return this.typingsInPeer[this.getTypingsKey(e,t)]}}function ya(e,t){return e.some((e=>e instanceof Promise))?Promise.all(e).then(t):t(e)}var _a=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 va=["static_icon","appear_animation","select_animation","activate_animation","effect_animation","around_animation","center_icon"],Pa={type:"reactions"};class ba extends G{after(){this.rootScope.addEventListener("language_change",(()=>{this.availableReactions=void 0,this.getAvailableReactions()})),this.sendReactionPromises=new Map,this.lastSendingTimes=new Map,this.rootScope.addEventListener("user_auth",(()=>{setTimeout((()=>{Promise.resolve(this.getAvailableReactions()).then((e=>_a(this,void 0,void 0,(function*(){for(const t of e)yield Promise.all([t.around_animation&&this.apiFileManager.downloadMedia({media:t.around_animation}),t.static_icon&&this.apiFileManager.downloadMedia({media:t.static_icon}),t.appear_animation&&this.apiFileManager.downloadMedia({media:t.appear_animation}),t.center_icon&&this.apiFileManager.downloadMedia({media:t.center_icon})]),yield(0,P.Z)(1e3)}))))}),7500)}))}getAvailableReactions(){return this.availableReactions?this.availableReactions:this.apiManager.invokeApiSingleProcess({method:"messages.getAvailableReactions",processResult:e=>{(0,ue.Z)(e);const t=this.availableReactions=e.reactions;for(const e of t)for(const t of va)e[t]&&(e[t]=this.appDocsManager.saveDoc(e[t],Pa));return t},params:{hash:0}})}getActiveAvailableReactions(){return(0,q.Z)(this.getAvailableReactions(),(e=>e.filter((e=>!e.pFlags.inactive))))}getAvailableReactionsForPeer(e){const t=this.getActiveAvailableReactions();return e.isUser()?this.unshiftQuickReaction(t):ya([t,this.appProfileManager.getChatFull(e.toChatId()),this.getQuickReaction()],(([e,t,a])=>{var s;const n=null!==(s=t.available_reactions)&&void 0!==s?s:{_:"chatReactionsNone"};let i=[];return"chatReactionsAll"===n._?i=e:"chatReactionsSome"===n._&&(i=n.reactions.map((t=>e.find((e=>e.reaction===t.emoticon)))).filter(Boolean)),this.unshiftQuickReactionInner(i,a)}))}unshiftQuickReactionInner(e,t){if(t&&"reactionEmoji"!==t._&&"availableReaction"!==t._)return e;const a=t.emoticon||t.reaction,s=(0,Pe.Z)(e,(e=>e.reaction===a));return s&&e.unshift(s),e}unshiftQuickReaction(e,t=this.getQuickReaction()){return ya([e,t],(([e,t])=>this.unshiftQuickReactionInner(e,t)))}getAvailableReactionsByMessage(e){var t;if(!e)return[];const a=(null===(t=e.fwd_from)||void 0===t?void 0:t.channel_post)&&this.appPeersManager.isMegagroup(e.peerId)&&e.fwdFromId||e.peerId;return this.getAvailableReactionsForPeer(a)}isReactionActive(e){return!!this.availableReactions&&!!this.availableReactions.find((t=>t.reaction===e))}getQuickReaction(){return ya([this.apiManager.getConfig(),this.getAvailableReactions()],(([e,t])=>{const a=e.reactions_default;return"reactionEmoji"===(null==a?void 0:a._)?t.find((e=>e.reaction===a.emoticon)):a}))}getReactionCached(e){return this.availableReactions.find((t=>t.reaction===e))}getReaction(e){return(0,q.Z)(this.getAvailableReactions(),(()=>this.getReactionCached(e)))}getMessagesReactions(e,t){return this.apiManager.invokeApiSingleProcess({method:"messages.getMessagesReactions",params:{id:t.map((e=>(0,oe.Z)(e))),peer:this.appPeersManager.getInputPeerById(e)},processResult:e=>{this.apiUpdatesManager.processUpdateMessage(e)}})}getMessageReactionsList(e,t,a,s,n){return this.apiManager.invokeApiSingleProcess({method:"messages.getMessageReactionsList",params:{peer:this.appPeersManager.getInputPeerById(e),id:(0,oe.Z)(t),limit:a,reaction:s,offset:n},processResult:e=>(this.appUsersManager.saveApiUsers(e.users),e)})}setDefaultReaction(e){return this.apiManager.invokeApi("messages.setDefaultReaction",{reaction:e}).then((t=>_a(this,void 0,void 0,(function*(){if(t){const t=yield this.apiManager.getConfig();t&&(t.reactions_default=e),this.rootScope.dispatchEvent("quick_reaction",e)}return t}))))}sendReaction(e,t,a){var s,n;return _a(this,void 0,void 0,(function*(){"availableReaction"===t._&&(t={_:"reactionEmoji",emoticon:t.reaction});const i=yield this.apiManager.getLimit("reactions"),r=e.peerId+"_"+e.mid;if(this.lastSendingTimes.get(r))return;this.lastSendingTimes.set(r,Date.now()),setTimeout((()=>{this.lastSendingTimes.delete(r)}),333);const{peerId:o,mid:p}=e,d=this.appPeersManager.peerId,f=e=>{--e.count,delete e.chosen_order,(0,Kt.Z)(t,e.reaction)&&(t=void 0),e.count||(0,M.Z)(l.results,e),l.recent_reactions&&(0,Pe.Z)(l.recent_reactions,(t=>(0,Kt.Z)(t.reaction,e.reaction)&&this.appPeersManager.getPeerId(t.peer_id)===d)),l.results.length||(l=void 0)},c=(null===(n=null===(s=e.reactions)||void 0===s?void 0:s.pFlags)||void 0===n?void 0:n.can_see_list)||!this.appPeersManager.isBroadcast(e.peerId)||e.peerId.isUser();e.reactions||(e.reactions={_:"messageReactions",results:[],recent_reactions:c?[]:void 0,pFlags:{can_see_list:c||void 0}});let l=a?e.reactions:(0,ve.Z)(e.reactions);const m=l.results.filter((e=>void 0!==e.chosen_order));m.sort(((e,t)=>t.chosen_order-e.chosen_order));const g=[],h=m.findIndex((e=>(0,Kt.Z)(e.reaction,t)));-1!==h&&g.push(...m.splice(h,1)),g.push(...m.splice(i-+(-1===h))),g.forEach((e=>{m.forEach((t=>{t.chosen_order>e.chosen_order&&--t.chosen_order})),f(e)}));const u=m.length;if(m.forEach(((e,t)=>{e.chosen_order=u-1-t})),t){l||(l={_:"messageReactions",results:[],pFlags:{}},c&&(l.pFlags.can_see_list=!0));let e=l.results.findIndex((e=>(0,Kt.Z)(e.reaction,t))),a=-1!==e&&l.results[e];if(a||(a={_:"reactionCount",count:0,reaction:t},e=l.results.push(a)-1),++a.count,a.chosen_order=m.length?m[0].chosen_order+1:0,m.unshift(a),!l.recent_reactions&&c&&(l.recent_reactions=[]),l.recent_reactions){const e={_:"messagePeerReaction",reaction:t,peer_id:this.appPeersManager.getOutputPeer(d),pFlags:{}};this.appPeersManager.isMegagroup(o),l.recent_reactions.unshift(e),l.recent_reactions=l.recent_reactions.slice(0,3)}}const y=this.availableReactions;if(l&&(null==y?void 0:y.length)){const e=new Map;y.forEach(((t,a)=>{e.set(t.reaction,a)})),l.results.sort(((t,a)=>{var s,n;const i=t.reaction.document_id||t.reaction.emoticon,r=a.reaction.document_id||a.reaction.emoticon;return a.count-t.count||(null!==(s=e.get(i))&&void 0!==s?s:0)-(null!==(n=e.get(r))&&void 0!==n?n:0)}))}if(a)return e.reactions=l,this.rootScope.dispatchEvent("messages_reactions",[{message:e,changedResults:[]}]),Promise.resolve();this.apiUpdatesManager.processLocalUpdate({_:"updateMessageReactions",peer:e.peer_id,msg_id:e.id,reactions:l,local:!0});const _=[o,p].join("-"),v=(0,oe.Z)(p),P=this.apiManager.invokeApi("messages.sendReaction",{peer:this.appPeersManager.getInputPeerById(o),msg_id:v,reaction:m.map((e=>e.reaction))}).then((e=>{(0,ue.Z)(e);const t=e.updates.findIndex((e=>"updateEditMessage"===e._||"updateEditChannelMessage"===e._));if(-1!==t){const a=e.updates[t];e.updates[t]={_:"updateMessageReactions",msg_id:v,peer:this.appPeersManager.getOutputPeer(o),reactions:a.message.reactions,pts:a.pts,pts_count:a.pts_count}}this.apiUpdatesManager.processUpdateMessage(e)})).catch((t=>{var a;"REACTION_INVALID"===t.type&&this.sendReactionPromises.get(_)===P&&this.sendReaction(e,null===(a=m[0])||void 0===a?void 0:a.reaction,!0)})).finally((()=>{this.sendReactionPromises.get(_)===P&&this.sendReactionPromises.delete(_)}));return this.sendReactionPromises.set(_,P),P}))}}var Ma=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 Ia={EMOJI:"inputStickerSetAnimatedEmoji",EMOJI_ANIMATIONS:"inputStickerSetAnimatedEmojiAnimations",PREMIUM_GIFTS:"inputStickerSetPremiumGifts",GENERIC_ANIMATIONS:"inputStickerSetEmojiGenericAnimations",DEFAULT_STATUSES:"inputStickerSetEmojiDefaultStatuses",DEFAULT_TOPIC_ICONS:"inputStickerSetEmojiDefaultTopicIcons"},Sa=new Set(Object.values(Ia));class Ca extends G{constructor(){super(...arguments),this.storage=new W.Z(H.Z,"stickerSets"),this.processAllStickersResult=e=>((0,ue.Z)(e),(0,ne.Z)(e.sets,((e,t,a)=>{e.pFlags.videos&&!i().IS_WEBM_SUPPORTED&&a.splice(t,1)})),e)}after(){this.getStickerSetPromises={},this.getStickersByEmoticonsPromises={},this.sounds={},this.names={},this.rootScope.addEventListener("user_auth",(()=>{setTimeout((()=>{this.getAnimatedEmojiStickerSet()}),1e3),this.getGreetingStickersPromise||void 0!==this.getGreetingStickersTimeout||(this.getGreetingStickersTimeout=E.Z.setTimeout((()=>{this.getGreetingStickersTimeout=void 0,this.getGreetingSticker(!0)}),5e3))})),this.rootScope.addEventListener("app_config",(()=>this.onStickersUpdated("faved",!0))),this.apiUpdatesManager.addMultipleEventsListeners({updateNewStickerSet:e=>{const t=e.stickerset;this.saveStickerSet(t,t.set.id),this.rootScope.dispatchEvent("stickers_installed",t.set)},updateRecentStickers:()=>this.onStickersUpdated("recent",!0),updateFavedStickers:()=>this.onStickersUpdated("faved",!0),updateMoveStickerSetToTop:e=>{this.rootScope.dispatchEvent("stickers_top",e.stickerset)}})}onStickersUpdated(e,t){return Ma(this,void 0,void 0,(function*(){const a=yield"faved"===e?this.getFavedStickersStickers(t):this.getRecentStickersStickers(t);this.rootScope.dispatchEvent("stickers_updated",{type:e,stickers:a})}))}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)),this.apiFileManager.downloadMedia({media:this.greetingStickers[0]}),t}))}saveStickers(e){(0,ne.Z)(e,((t,a)=>{(t=this.appDocsManager.saveDoc(t))?e[a]=t:e.splice(a,1)}))}canUseStickerSetCache(e,t){var a;return e&&(null===(a=e.documents)||void 0===a?void 0:a.length)&&(Date.now()-e.refreshTime<36e5||t)}getStickerSet(e,t={}){let{id:a}=e;if(e.access_hash||(e=this.names[a]||e,a=e.id),this.getStickerSetPromises[a])return this.getStickerSetPromises[a];if(!t.overwrite){const e=this.storage.getFromCache(a);if(this.canUseStickerSetCache(e,t.useCache))return e}const s=this.getStickerSetPromises[a]=new Promise((n=>Ma(this,void 0,void 0,(function*(){if(!t.overwrite){const e=yield this.storage.get(a);if(this.canUseStickerSetCache(e,t.useCache))return this.saveStickers(e.documents),n(e),void(this.getStickerSetPromises[a]===s&&delete this.getStickerSetPromises[a])}try{const s=yield this.apiManager.invokeApi("messages.getStickerSet",{stickerset:this.getStickerSetInput(e),hash:0}),i=t.saveById?a:s.set.id;this.saveStickerSet(s,i),n(s)}catch(e){n(null)}this.getStickerSetPromises[a]===s&&delete this.getStickerSetPromises[a]}))));return s}getLocalStickerSet(e){return this.getStickerSet({id:e},{saveById:!0})}getAnimatedEmojiStickerSet(){return Promise.all([this.getLocalStickerSet(Ia.EMOJI),this.getLocalStickerSet(Ia.EMOJI_ANIMATIONS),this.getAnimatedEmojiSounds()]).then((([e,t])=>({emoji:e,animations:t})))}getAnimatedEmojiSounds(e){if(this.getAnimatedEmojiSoundsPromise&&!e)return this.getAnimatedEmojiSoundsPromise;const t=this.getAnimatedEmojiSoundsPromise=Promise.all([this.apiManager.getAppConfig(e),this.apiManager.getConfig()]).then((([e,a])=>{if(this.getAnimatedEmojiSoundsPromise===t)for(const t in e.emojies_sounds){const s=e.emojies_sounds[t],n=atob(s.file_reference_base64.replace(/-/g,"+").replace(/_/g,"/")),i=new Uint8Array(n.length);for(let e=0,t=i.length;e((0,ue.Z)(e),this.recentStickers=e.stickers,this.saveStickers(e.stickers),e),overwrite:e})}))}getRecentStickersStickers(e){if(e)this.recentStickers=void 0;else if(this.recentStickers)return this.recentStickers;return this.getRecentStickers(e).then((()=>this.recentStickers))}saveRecentSticker(e,t,a){const s=this.appDocsManager.getDoc(e);if((0,Pe.Z)(this.recentStickers,(t=>t.id===e)),!t){this.recentStickers.unshift(s);const e=(0,Pt.Z)(s.stickerEmojiRaw);for(const t in this.getStickersByEmoticonsPromises)this.getStickersByEmoticonsPromises[t].then((a=>{const n=(0,Pe.Z)(a,(e=>e.id===s.id));n?a.unshift(n):t.includes(e)&&a.unshift(s)}))}return this.rootScope.dispatchEvent("sticker_updated",{type:"recent",faved:!t,document:s}),t&&this.onStickersUpdated("recent",!1),this.apiManager.invokeApi("messages.saveRecentSticker",{id:zt(s),unsave:t,attached:a})}cleanEmoji(e){return e.replace(/\ufe0f/g,"").replace(/๐Ÿป|๐Ÿผ|๐Ÿฝ|๐Ÿพ|๐Ÿฟ/g,"")}getAnimatedEmojiSticker(e,t){const a=t?Ia.EMOJI_ANIMATIONS:Ia.EMOJI,s=this.storage.getFromCache(a);if(!(null==s?void 0:s.documents))return;t&&["๐Ÿงก","๐Ÿ’›","๐Ÿ’š","๐Ÿ’™","๐Ÿ’œ","๐Ÿ–ค","๐Ÿค","๐ŸคŽ"].includes(e)&&(e="โค๏ธ"),e=this.cleanEmoji(e);const n=s.packs.find((t=>t.emoticon===e));return n?this.appDocsManager.getDoc(n.documents[0]):void 0}getAnimatedEmojiSoundDocument(e){return this.sounds[this.cleanEmoji(e)]}preloadAnimatedEmojiSticker(e){const t=this.getAnimatedEmojiStickerSet().then((()=>this.getAnimatedEmojiSticker(e)));return Promise.all([t,this.preloadAnimatedEmojiStickerAnimation(e)]).then((([e,t])=>({doc:e,animation:null==t?void 0:t.doc,sound:null==t?void 0:t.sound})))}preloadAnimatedEmojiStickerAnimation(e){return this.getAnimatedEmojiStickerSet().then((()=>this.getAnimatedEmojiSticker(e,!0))).then((t=>{if(!t)return;const a=this.getAnimatedEmojiSoundDocument(e);return Promise.all([this.preloadSticker(t.id),a?this.preloadSticker(a.id):void 0]).then((()=>({doc:t,sound:a})))}))}preloadSticker(e,t){var a;const s=this.appDocsManager.getDoc(e);return this.apiFileManager.downloadMedia({media:s,thumb:t?null===(a=s.video_thumbs)||void 0===a?void 0:a[0]:void 0})}saveStickerSet(e,t){const a={_:"messages.stickerSet",set:e.set,packs:e.packs,documents:e.documents,keywords:e.keywords};let s=this.storage.getFromCache(t);s?Object.assign(s,a):s=this.storage.setToCache(t,a),s.set.short_name&&(this.names[s.set.short_name]=this.getStickerSetInput(a.set)),this.saveStickers(e.documents);const n=s.set.installed_date||Sa.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 Sa.has(e.id)?{_:e.id}:e.access_hash?{_:"inputStickerSetID",id:e.id,access_hash:e.access_hash}:{_:"inputStickerSetShortName",short_name:""+e.id}}getFeaturedStickers(){return Ma(this,void 0,void 0,(function*(){return(yield this.apiManager.invokeApiHashable({method:"messages.getFeaturedStickers",processResult:e=>((0,ue.Z)(e),(0,ne.Z)(e.sets,((e,t,a)=>{e.set.pFlags.videos&&!i().IS_WEBM_SUPPORTED&&a.splice(t,1)})),e.sets.forEach((e=>{this.saveStickerSet({set:e.set,documents:[],packs:[],keywords:[]},e.set.id)})),e)})).sets}))}getPromoPremiumStickers(){return this.getStickersByEmoticon("โญ๏ธโญ๏ธ",!1)}getPremiumStickers(){return this.getStickersByEmoticon("๐Ÿ“‚โญ๏ธ",!1)}getFavedStickers(e){return this.apiManager.invokeApiHashable({method:"messages.getFavedStickers",processResult:e=>((0,ue.Z)(e),this.saveStickers(e.stickers),this.favedStickers=e.stickers,e),overwrite:e})}getFavedStickersStickers(e){if(e)this.favedStickers=void 0;else if(this.favedStickers)return this.favedStickers;return this.getFavedStickers(e).then((()=>this.favedStickers))}getFavedStickersLimit(){return this.apiManager.getLimit("favedStickers")}faveSticker(e,t){return Ma(this,void 0,void 0,(function*(){this.favedStickers||(yield this.getFavedStickersStickers());const a=yield this.getFavedStickersLimit(),s=this.appDocsManager.getDoc(e);return(0,Pe.Z)(this.favedStickers,(e=>e.id===s.id)),t||(this.favedStickers.unshift(s),this.favedStickers.splice(a,this.favedStickers.length-a)),this.rootScope.dispatchEvent("sticker_updated",{type:"faved",faved:!t,document:s}),this.apiManager.invokeApi("messages.faveSticker",{id:zt(s),unfave:t}).then((()=>{t&&this.onStickersUpdated("faved",!0)}))}))}toggleStickerSet(e){return Ma(this,void 0,void 0,(function*(){if((e=this.storage.getFromCache(e.id).set).installed_date){if(yield this.apiManager.invokeApi("messages.uninstallStickerSet",{stickerset:this.getStickerSetInput(e)}))return delete e.installed_date,this.rootScope.dispatchEvent("stickers_deleted",e),this.storage.delete(e.id,!0),!0}else if(yield this.apiManager.invokeApi("messages.installStickerSet",{stickerset:this.getStickerSetInput(e),archived:!1}))return e.installed_date=Date.now()/1e3|0,this.rootScope.dispatchEvent("stickers_installed",e),!0;return!1}))}toggleStickerSets(e){return Promise.all(e.map((e=>this.toggleStickerSet(e))))}searchStickerSets(e,t=!0){return Ma(this,void 0,void 0,(function*(){const a=t?1:0,s=yield this.apiManager.invokeApiHashable({method:"messages.searchStickerSets",params:{flags:a,exclude_featured:t||void 0,q:e},processResult:e=>((0,ue.Z)(e),(0,ne.Z)(e.sets,((e,t,a)=>{e.set.pFlags.videos&&!i().IS_WEBM_SUPPORTED&&a.splice(t,1)})),e.sets.forEach((e=>{this.saveStickerSet({set:e.set,documents:[],packs:[],keywords:[]},e.set.id)})),e)}),n=[],r=this.storage.getCache();for(const t in r){const{set:a}=r[t];a.title.toLowerCase().includes(e.toLowerCase())&&!s.sets.find((e=>e.set.id===a.id))&&n.push({_:"stickerSetCovered",set:a,cover:null})}return s.sets.concat(n)}))}getAllStickers(){return this.apiManager.invokeApiHashable({method:"messages.getAllStickers",processResult:this.processAllStickersResult})}getEmojiStickers(){return this.apiManager.invokeApiHashable({method:"messages.getEmojiStickers",processResult:this.processAllStickersResult})}preloadStickerSets(){return this.getAllStickers().then((e=>Promise.all(e.sets.map((e=>this.getStickerSet(e,{useCache:!0}))))))}getStickersByEmoticon(e,t=!0){return e=(0,Pt.Z)(e),this.getStickersByEmoticonsPromises[e]?this.getStickersByEmoticonsPromises[e]:this.getStickersByEmoticonsPromises[e]=Promise.all([this.apiManager.invokeApiHashable({method:"messages.getStickers",params:{emoticon:e},processResult:e=>e}),t?this.preloadStickerSets():[],t?this.getRecentStickers():void 0]).then((([t,a,s])=>{const n=t.stickers.map((e=>this.appDocsManager.saveDoc(e))),r=[],o=[],p=t=>{for(const a of t)if((0,Pt.Z)(a.emoticon).includes(e))for(const e of a.documents){const t=this.appDocsManager.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);const d=[...new Set(r.concat(o,n))];return(0,ne.Z)(d,((e,t,a)=>{(3===e.sticker&&!i().IS_WEBM_SUPPORTED||!this.rootScope.premium&&(0,Wt.Z)(e))&&a.splice(t,1)})),d}))}clearRecentStickers(){return this.recentStickers&&(this.recentStickers.length=0,this.onStickersUpdated("recent",!1)),this.apiManager.invokeApi("messages.clearRecentStickers")}}var wa=a(467),ka=a(8493);class Aa extends G{constructor(){super(...arguments),this.clear=(e=!1)=>{if(e)this.users={},this.usernames={};else for(const e in this.users){if(!e)continue;const t=e.toPeerId();if(!this.peersStorage.isPeerNeeded(t)){const t=this.users[e];this.modifyUsernamesCache(t,!1),this.storage.delete(e),delete this.users[e]}}this.getTopPeersPromises={},this.contactsIndex=this.createSearchIndex(),this.contactsFillPromise=void 0,this.contactsList=new Set,this.updatedContactsList=!1},this.updateUsersStatuses=()=>{const e=(0,te.Z)(!0);for(const t in this.users){const a=this.users[t];this.updateUserStatus(a,e)}}}after(){return this.clear(!0),setInterval(this.updateUsersStatuses,6e4),this.rootScope.addEventListener("state_synchronized",this.updateUsersStatuses),this.apiUpdatesManager.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-=this.timeManager.getServerTimeOffset()),"was_online"in a.status&&(a.status.was_online-=this.timeManager.getServerTimeOffset())),this.rootScope.dispatchEvent("user_update",t),this.setUserToStateIfNeeded(a))},updateUserName:e=>{const t=e.user_id,a=this.users[t];a&&(this.forceUserOnline(t),this.saveApiUser(Object.assign(Object.assign({},a),{first_name:e.first_name,last_name:e.last_name,username:void 0,usernames:e.usernames}),!0))}}),this.rootScope.addEventListener("language_change",(e=>{const t=this.getSelf().id;this.contactsIndex.indexObject(t,this.getUserSearchText(t))})),Promise.all([this.appStateManager.getState(),this.appStoragesManager.loadStorage("users")]).then((([e,{results:t,storage:a}])=>{this.storage=a,this.saveApiUsers(t);for(let a=0,s=t.length;a{if(!this.appPeersManager.isUser(e))return;const t=e.toUserId();this.storage.getFromCache(t)||this.storage.set({[t]:this.getUser(t)})})),this.peersStorage.addEventListener("peerUnneeded",(e=>{if(!this.appPeersManager.isUser(e))return;const t=e.toUserId();this.storage.getFromCache(t)&&this.storage.delete(t)}))}))}get userId(){return this.rootScope.myId.toUserId()}onContactsModified(e){e&&this.appStateManager.pushToState("contactsListCachedTime",(0,te.Z)(!0))}pushRecentSearch(e){return this.appStateManager.getState().then((t=>{const a=t.recentSearch||[];if(a[0]!==e){(0,M.Z)(a,e),a.unshift(e),a.length>20&&(a.length=20),this.appStateManager.pushToState("recentSearch",a);for(const e of a)this.peersStorage.requestPeer(e,"recentSearch")}}))}clearRecentSearch(){return this.appStateManager.getState().then((e=>{const t=e.recentSearch||[];for(const e of t)this.peersStorage.releasePeer(e,"recentSearch");t.length=0,this.appStateManager.pushToState("recentSearch",t)}))}fillContacts(){var e;if(this.contactsFillPromise&&this.updatedContactsList)return{cached:this.contactsFillPromise.isFulfilled,promise:this.contactsFillPromise};this.updatedContactsList=!0;const t=(0,v.Z)();return this.apiManager.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(!0),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){"@"===e[0]&&(e=e.slice(1)),e=e.toLowerCase();const t=this.usernames[e];return t?this.appPeersManager.getPeer(t):this.apiManager.invokeApiSingleProcess({method:"contacts.resolveUsername",params:{username:e},processResult:e=>this.processResolvedPeer(e)})}processResolvedPeer(e){return this.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.appPeersManager.getPeer((0,le.Z)(e.peer))}resolvePhone(e){return this.apiManager.invokeApi("contacts.resolvePhone",{phone:e}).then((e=>this.processResolvedPeer(e)))}pushContact(e){this.contactsList.add(e),this.contactsIndex.indexObject(e,this.getUserSearchText(e)),this.peersStorage.requestPeer(e.toPeerId(),"contact")}popContact(e){this.contactsList.delete(e),this.contactsIndex.indexObject(e,""),this.peersStorage.releasePeer(e.toPeerId(),"contact")}getUserSearchText(e){const t=this.users[e];return t?[t.first_name,t.last_name,t.phone,...(0,Jt.Z)(t),t.pFlags.self?"Saved Messages":""].filter(Boolean).join(" "):""}getContacts(e,t=!1,a="name"){return this.fillContacts().promise.then((s=>{let n=[...s];if(e){const t=this.contactsIndex.search(e);n=[...n].filter((e=>t.has(e)))}"name"===a?n.sort(((e,t)=>{const a=(this.users[e]||{}).sortName||"",s=(this.users[t]||{}).sortName||"";return a.localeCompare(s)})):"online"===a&&n.sort(((e,t)=>{const a=this.getUserStatusForSort(this.getUser(e).status);return this.getUserStatusForSort(this.getUser(t).status)-a}));const i=this.userId;return(0,M.Z)(n,i),t&&this.testSelfSearch(e)&&n.unshift(i),n}))}getContactsPeerIds(e,t,a,s){return this.getContacts(e,t,a).then((e=>{const t=e.map((e=>e.toPeerId(!1)));return s?t.slice(0,s):t}))}toggleBlock(e,t){return this.apiManager.invokeApiSingle(t?"contacts.block":"contacts.unblock",{id:this.appPeersManager.getInputPeerById(e)}).then((a=>(a&&this.apiUpdatesManager.processLocalUpdate({_:"updatePeerBlocked",peer_id:this.appPeersManager.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 ae.Z({clearBadChars:!0,ignoreCase:!0,latinize:!0,includeTag:!0})}saveApiUsers(e,t){e.saved||(e.saved=!0,e.forEach((e=>this.saveApiUser(e,t))))}modifyUsernamesCache(e,t){const a=(0,Jt.Z)(e);if(!a.length)return;const s=a.map((e=>function(e){return e&&e.toLowerCase()||""}(e)));t?s.forEach((t=>{this.usernames[t]=e.id.toPeerId("user"!==e._)})):s.forEach((e=>{delete this.usernames[e]}))}setUsernameToCache(e,t){return!(t&&t.username===e.username&&(0,Y.Z)(t.usernames,e.usernames)||(this.modifyUsernamesCache(t,!1),this.modifyUsernamesCache(e,!0),0))}saveApiUser(e,t){var a,s,n,i;if(!e||"userEmpty"===e._)return;const r=e.id,o=this.users[r];if(null!==(a=e.pFlags)&&void 0!==a||(e.pFlags={}),e.pFlags.min&&void 0!==o)return;const p=this.setUsernameToCache(e,o);if(o&&void 0!==o.sortName&&o.first_name===e.first_name&&o.last_name===e.last_name)e.sortName=o.sortName;else{const t=e.first_name+(e.last_name?" "+e.last_name:"");e.sortName=e.pFlags.deleted?"":(0,wa.ZP)(t,!1)}if(e.status&&(e.status.expires&&(e.status.expires-=this.timeManager.getServerTimeOffset()),e.status.was_online&&(e.status.was_online-=this.timeManager.getServerTimeOffset())),"userProfilePhotoEmpty"===(null===(s=e.photo)||void 0===s?void 0:s._)&&delete e.photo,void 0===o)this.users[r]=e;else{const t=e.first_name!==o.first_name||e.last_name!==o.last_name||p,a=(null===(n=o.photo)||void 0===n?void 0:n.photo_id)!==(null===(i=e.photo)||void 0===i?void 0:i.photo_id),s=o.pFlags.premium!==e.pFlags.premium||o.pFlags.verified!==e.pFlags.verified||o.pFlags.scam!==e.pFlags.scam||o.pFlags.fake!==e.pFlags.fake,d=!!o.pFlags.contact,f=!!e.pFlags.contact;re(o,e),this.rootScope.dispatchEvent("user_update",r),d!==f&&this.onContactUpdated(r,f,d),a&&this.rootScope.dispatchEvent("avatar_update",{peerId:e.id.toPeerId()}),(t||s)&&this.rootScope.dispatchEvent("peer_title_edit",{peerId:e.id.toPeerId()})}this.checkPremium(e,o),this.setUserToStateIfNeeded(e)}checkPremium(e,t){if(e.pFlags.self){const a=!!e.pFlags.premium;this.rootScope.premium!==a&&this.rootScope.dispatchEvent("premium_toggle_private",{isNew:!t,isPremium:a})}}setUserToStateIfNeeded(e){this.peersStorage.isPeerNeeded(e.id.toPeerId())&&this.storage.set({[e.id]:e})}isUserOnlineVisible(e){return this.getUserStatusForSort(e)>3}getUserStatusForSort(e){if("object"!=typeof e){const t=this.getUser(e);e=null==t?void 0:t.status}if(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(0,fe.Z)(e)?e:this.users[e]}getUserStatus(e){return this.isRegularUser(e)&&!this.users[e].pFlags.self&&this.users[e].status}getUserPhone(e){return t=this,a=void 0,n=function*(){const t=this.getUser(e);if(!(null==t?void 0:t.phone))return;const a=yield this.apiManager.getAppConfig();return{phone:t.phone,isAnonymous:a.fragment_prefixes.some((e=>t.phone.startsWith(e)))}},new((s=void 0)||(s=Promise))((function(e,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(r,o)}p((n=n.apply(t,a||[])).next())}));var t,a,s,n}getSelf(){return this.getUser(this.userId)}isBot(e){return this.users[e]&&!!this.users[e].pFlags.bot}isAttachMenuBot(e){return this.isBot(e)&&!!this.users[e].pFlags.bot_attach_menu}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!==this.userId}hasUser(e,t){const a=this.users[e];return(0,fe.Z)(a)&&(t||!a.pFlags.min)}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){return{_:"inputPeerUser",user_id:e,access_hash:this.getUser(e).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=(0,te.Z)(!0)){e.status&&"userStatusOnline"===e.status._&&e.status.expires=60)return}else if(this.apiUpdatesManager.updatesState.syncLoading)return;const s=this.getUser(e);!(null==s?void 0:s.status)||"userStatusOnline"===s.status._||"userStatusEmpty"===s.status._||s.pFlags.support||s.pFlags.deleted||(s.status={_:"userStatusOnline",expires:a+60},this.rootScope.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),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]=this.appStateManager.getState().then((t=>{const a=t.topPeersCache[e];return a&&a.cachedTime+864e5>Date.now()&&a.peers?a.peers:this.apiManager.invokeApi("contacts.getTopPeers",{[e]:!0,offset:0,limit:15,hash:"0"}).then((a=>{let s=[];return"contacts.topPeers"===a._&&(this.saveApiUsers(a.users),this.appChatsManager.saveApiChats(a.chats),a.categories.length&&(s=a.categories[0].peers.map((e=>{const t=(0,le.Z)(e.peer);return this.peersStorage.requestPeer(t,"topPeer"),{id:t,rating:e.rating}})))),t.topPeersCache[e]={peers:s,cachedTime:Date.now()},this.appStateManager.pushToState("topPeersCache",t.topPeersCache),s}))}))}getBlocked(e=0,t=0){return this.apiManager.invokeApiSingle("contacts.getBlocked",{offset:e,limit:t}).then((e=>(this.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),{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 this.apiManager.invokeApi("contacts.getLocated",{geo_point:i,background:s}).then((e=>(this.apiUpdatesManager.processUpdateMessage(e),e)))}searchContacts(e,t=20){const a=(0,Lt.Z)(e);if(a.length&&a[0].length===e.trim().length&&"messageEntityUrl"===a[0]._)try{const t=new URL(je(e).url).pathname.slice(1);t&&(e=t)}catch(e){}return this.apiManager.invokeApiCacheable("contacts.search",{q:e,limit:t},{cacheSeconds:60}).then((e=>(this.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),{my_results:(0,we.Z)(e.my_results.map((e=>(0,le.Z)(e)))),results:e.results.map((e=>(0,le.Z)(e)))})))}onContactUpdated(e,t,a=this.isContact(e)){t!==a&&(t?this.pushContact(e):this.popContact(e),this.onContactsModified(),this.rootScope.dispatchEvent("contacts_update",e))}updateUsername(e){return this.apiManager.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:(0,te.Z)(!0)}:{_:"userStatusOnline",expires:(0,te.Z)(!0)+50};a.status=s,this.rootScope.dispatchEvent("user_update",e),this.setUserToStateIfNeeded(a)}}updateMyOnlineStatus(e){return this.setUserStatus(this.getSelf().id,e),this.apiManager.invokeApiSingle("account.updateStatus",{offline:e})}addContact(e,t,a,s,n){return this.apiManager.invokeApi("contacts.addContact",{id:this.getUserInput(e),first_name:t,last_name:a,phone:s,add_phone_privacy_exception:n}).then((t=>{this.apiUpdatesManager.processUpdateMessage(t,{override:!0}),this.onContactUpdated(e,!0)}))}deleteContacts(e){return this.apiManager.invokeApi("contacts.deleteContacts",{id:e.map((e=>this.getUserInput(e)))}).then((t=>{this.apiUpdatesManager.processUpdateMessage(t,{override:!0}),e.forEach((e=>{this.onContactUpdated(e,!1)}))}))}checkUsername(e){return this.apiManager.invokeApi("account.checkUsername",{username:e})}toggleUsername(e,t){return this.apiManager.invokeApi("account.toggleUsername",{username:e,active:t})}reorderUsernames(e){return this.apiManager.invokeApi("account.reorderUsernames",{order:e})}canSendToUser(e){return(0,ka.Z)(this.getUser(e))}}const Da=new Set(["photo","video","gif","document"]);class Ua extends G{constructor(){super(...arguments),this.webpages={},this.pendingWebPages={}}after(){this.apiUpdatesManager.addMultipleEventsListeners({updateWebPage:e=>{this.saveWebPage(e.webpage)}})}saveWebPage(e,t,a){var s,n;if("webPageNotModified"===e._||"webPageEmpty"===e._)return;const{id:i}=e,r=this.webpages[i],o=r&&r._===e._&&r.hash==r.hash;if("webPage"===e._){"photo"===(null===(s=e.photo)||void 0===s?void 0:s._)?e.photo=this.appPhotosManager.savePhoto(e.photo,a):delete e.photo,"document"===(null===(n=e.document)||void 0===n?void 0:n._)?e.document=this.appDocsManager.saveDoc(e.document,a):("document"===e.type&&delete e.type,delete e.document);const t=e.site_name,i=e.title||e.author||t||"";t&&i===t&&delete e.site_name,Da.has(e.type)||e.description||!e.photo||(e.type="photo")}let p=this.pendingWebPages[i];if(t&&(p||(p=this.pendingWebPages[i]=new Set),p.add(t)),void 0===r?this.webpages[i]=e:re(r,e),!t&&void 0!==p&&o){const e=[];p.forEach((t=>{const[a,s,n]=t.split("_");e.push({peerId:a.toPeerId(),mid:+s,isScheduled:!!n})})),this.rootScope.dispatchEvent("webpage_updated",{id:i,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])}getCachedWebPage(e){return this.webpages[e]}getWebPage(e){return this.apiManager.invokeApiHashable({method:"messages.getWebPage",processResult:e=>this.saveWebPage(e),params:{url:e}})}}var Ta=a(5936),Ea=a(3019);function Fa(e){return(0,Ea.Z)(e,"readAsArrayBuffer")}var Ra=a(1243),xa=a(7086);function Ba(e){return encodeURIComponent(e).replace(/['()]/g,escape).replace(/\*/g,"%2A")}class Va{constructor(e,t){this.serviceMessagePort=e,this.downloadId=t,this.serviceMessagePort=zs()}write(e,t){return a=this,s=void 0,i=function*(){return this.serviceMessagePort.invoke("downloadChunk",{id:this.downloadId,chunk:e})},new((n=void 0)||(n=Promise))((function(e,t){function r(e){try{p(i.next(e))}catch(e){t(e)}}function o(e){try{p(i.throw(e))}catch(e){t(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof n?a:new n((function(e){e(a)}))).then(r,o)}p((i=i.apply(a,s||[])).next())}));var a,s,n,i}finalize(e){return this.serviceMessagePort.invoke("downloadFinalize",this.downloadId).then((()=>{}))}}class Oa{getFile(e){return Promise.reject((0,X.Z)("NO_ENTRY_FOUND"))}prepareWriting({fileName:e,downloadId:t,size:a}){const s=Object.assign({"Content-Type":"application/octet-stream; charset=utf-8","Content-Disposition":"attachment; filename*=UTF-8''"+Ba(e)},a?{"Content-Length":a}:{}),n=zs(),i=n.invoke("download",{headers:s,id:t}),r=(0,v.Z)();return r.cancel=()=>{r.reject((0,X.Z)("DOWNLOAD_CANCELED"))},r.catch((()=>{zs().invoke("downloadCancel",t)})),i.then(r.resolve,r.reject),{deferred:r,getWriter:()=>new Va(n,t)}}}var La=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 Na=131072,Za=new Set(["DOWNLOAD_CANCELED","UPLOAD_CANCELED","UNKNOWN","NO_NEW_CONTEXT"]);class ja extends G{constructor(){super(...arguments),this.cacheStorage=new Ta.Z("cachedFiles"),this.downloadStorage=new Oa,this.downloadPromises={},this.uploadPromises={},this.downloadPulls={},this.downloadActives={},this.refreshReferencePromises={},this.log=(0,I.kg)("AFM",I.v9.Error|I.v9.Log),this.tempId=0,this.queueId=0,this.debug=b.Z.debug,this.maxUploadParts=4e3,this.maxDownloadParts=8e3,this.uncompressTGS=(e,t)=>this.cryptoWorker.invokeCrypto("gzipUncompress",e.slice().buffer,!1),this.uncompressTGV=(e,t)=>{const a=e.slice().buffer;return i().IS_FIREFOX?this.cryptoWorker.invokeCrypto("gzipUncompress",a,!0).then((e=>function(e){const t=e.indexOf("/,` width="${n}" height="${i}">`).replace(/[^\x00-\x7F]/g,"")}(e))).then((e=>(new TextEncoder).encode(e))):this.cryptoWorker.invokeCrypto("gzipUncompress",a,!1)},this.convertWebp=(e,t)=>f.Z.getInstance().invoke("convertWebp",{fileName:t,bytes:e}),this.convertOpus=(e,t)=>f.Z.getInstance().invoke("convertOpus",{fileName:t,bytes:e})}after(){setInterval((()=>{for(const e in this.refreshReferencePromises){const{deferred:t}=this.refreshReferencePromises[e];(t.isFulfilled||t.isRejected)&&delete this.refreshReferencePromises[e]}}),18e5),this.rootScope.addEventListener("config",(e=>{this.webFileDcId=e.webfile_dc_id})),this.rootScope.addEventListener("app_config",(e=>{this.maxUploadParts=this.rootScope.premium?e.upload_max_fileparts_premium:e.upload_max_fileparts_default,this.maxDownloadParts=e.upload_max_fileparts_premium}))}downloadRequest(e,t,a,s,n=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:n,cb:a,deferred:{resolve:e,reject:r},activeDelta:s})}));return setTimeout((()=>{this.downloadCheck(e)}),0),r}downloadCheck(e){const t=this.downloadPulls[e],a=this.rootScope.premium?224:36;if(this.downloadActives[e]>=a||!(null==t?void 0:t.length))return!1;const s=(0,Pe.Z)(t,(e=>0===e.queueId))||(0,Pe.Z)(t,(e=>e.queueId===this.queueId))||t.shift(),n=s.activeDelta||1;this.downloadActives[e]+=n;const i=s.cb();i.then((()=>{this.downloadActives[e]-=n,this.downloadCheck(e)}),(t=>{(null==t?void 0:t.type)&&Za.has(t.type)||this.log.error("downloadCheck error:",t),this.downloadActives[e]-=n,this.downloadCheck(e)})).finally((()=>{i.then(s.deferred.resolve,s.deferred.reject)}))}setQueueId(e){this.queueId=e}getFileStorage(){return this.cacheStorage}cancelDownload(e){const t=[this.downloadPromises[e],this.uploadPromises[e]].filter(Boolean);let a=!1;for(let e=0,s=t.length;eLa(this,void 0,void 0,(function*(){if(null==r||r(),"url"in t){const e=t.url;if(this.isLocalWebFile(e))return fetch(e).then((e=>e.arrayBuffer())).then((t=>{const a=e.split(".").pop(),s=mt[a]||"application/octet-stream";return{_:"upload.webFile",size:t.byteLength,mime_type:s,file_type:{_:"storage.fileUnknown"},mtime:0,bytes:new Uint8Array(t)}}))}return this.apiManager.invokeApi("upload.getWebFile",{location:t,offset:a,limit:s},{dcId:e,fileDownload:!0})}))),this.getDelta(s),i)}requestFilePart(e,t,a,s,n=0,i=0,r){return this.downloadRequest(e,n,(()=>La(this,void 0,void 0,(function*(){null==r||r();const n=()=>La(this,void 0,void 0,(function*(){var i;null==r||r();const o=null===(i=t.file_reference)||void 0===i?void 0:i.slice();return this.apiManager.invokeApi("upload.getFile",{location:t,offset:a,limit:s},{dcId:e,fileDownload:!0}).catch((e=>{if(null==r||r(),"FILE_REFERENCE_EXPIRED"===e.type)return this.refreshReference(t,o).then(n);throw e}))}));(0,ue.Z)(t);const i=t.file_reference;if(i&&!t.checkedReference){t.checkedReference=!0;const e=T(i);if(this.refreshReferencePromises[e])return this.refreshReference(t,i).then(n)}return n()}))),this.getDelta(s),i)}getDelta(e){return e/Na}getLimitPart(e,t){if(!e)return 524288;let a=Na;const s=t?this.maxUploadParts:this.maxDownloadParts,n=t?524288:1048576;for(;e/a>s&&a{a===T(t)&&e.reject((0,X.Z)("REFERENCE_IS_NOT_REFRESHED")),e.resolve(t)}),e.reject)}return s.deferred.then((t=>{e.file_reference=t}))}isDownloading(e){return!!this.downloadPromises[e]}getDownload(e){return this.downloadPromises[e]}getUpload(e){return this.uploadPromises[e]}getConvertMethod(e){let t;return"application/x-tgwallpattern"===e?(t=this.uncompressTGV,e="image/svg+xml"):"image/webp"!==e||i().IS_WEBP_SUPPORTED?"application/x-tgsticker"===e?(t=this.uncompressTGS,e="application/json"):"audio/ogg"!==e||i().IS_OPUS_SUPPORTED||(t=this.convertOpus,e="audio/wav"):(t=this.convertWebp,e="image/png"),{mimeType:e,process:t}}allocateDeferredPromises(e,t,a){const s=[];let n,i=e,r=Promise.resolve();do{n=(0,v.Z)(),s.push({offset:i,writePromise:r,writeDeferred:n}),r=n,i+=a}while(i{if(!(null==e?void 0:e.error))for(const a of S)e&&e!==a||(a.error=t,a.deferred.reject(t))},y="inputWebFileLocation"===i._,_=y&&this.isLocalWebFile(i.url),v=this.tempId++,P=_?s:e.limitPart||this.getLimitPart(s,!1);let b,M,I=m.getFile.bind(m);const S=[],C=s||P,w=(e,t)=>{const{deferred:a}=e,s=u.bind(null,e);a.cancel=()=>a.reject((0,X.Z)("DOWNLOAD_CANCELED")),a.catch((t=>{var a,n;s(t),null===(n=null===(a=e.writer)||void 0===a?void 0:a.truncate)||void 0===n||n.call(a)})).finally((()=>{this.downloadPromises[t]===a&&delete this.downloadPromises[t],delete e.writer})),this.downloadPromises[t]=a,S.push(e)};if(m&&(!g||C<=o.Iw)&&(b=m.prepareWriting(l,C,e.mimeType),w(b,l)),g){let t=e.fileName;if(!t){t=l;const a=gt[e.mimeType];a&&(t+="."+a)}M=g.prepareWriting({fileName:t,downloadId:r,size:C}),w(M,c),b&&M.deferred.catch((e=>b.deferred.reject(e)))}h=null!==(a=null==M?void 0:M.deferred)&&void 0!==a?a:b.deferred,g&&f&&(I=g.getFile.bind(g)),I(l).then((e=>La(this,void 0,void 0,(function*(){if(k(),M){const t=M.writer=M.getWriter();k();const a=yield function(e){return Fa(e).then((e=>new Uint8Array(e)))}(e);k(),yield t.write(a),k(),M.deferred.resolve(yield t.finalize())}b&&b.deferred.resolve(e)})))).catch((t=>La(this,void 0,void 0,(function*(){if(e.onlyCache)return void u(null,t);S.forEach((e=>{e.writer=e.getWriter()}));const a=(y?this.requestWebFilePart:this.requestFilePart).bind(this);y&&void 0===this.webFileDcId&&!_&&(yield this.apiManager.getConfig(),k());const r=this.allocateDeferredPromises(0,s,P),p={done:0,offset:0,total:s,fileName:c},d=()=>{try{k(),p.done=g,this.rootScope.dispatchEvent("download_progress",p)}catch(e){}},m=(0,aa.Z)(d,50,!0);let g=0;const h=()=>La(this,void 0,void 0,(function*(){const{offset:t,writePromise:p,writeDeferred:y}=r.shift();try{k();performance.now();const u=yield a(n,i,t,P,v,e.queueId,k),_=(performance.now(),u.bytes);r.length&&h();const b=_.byteLength;this.debug&&this.log("downloadFile requestFilePart result:",c,u);const M=t+P>=s||!b;if(b){g+=b,M?d():m();performance.now();yield p,k(),performance.now(),performance.now(),yield Promise.all(S.map((({writer:e})=>null==e?void 0:e.write(_,t)))),k()}if(M&&(!s||g{var t;return null===(t=null==e?void 0:e.trim)||void 0===t?void 0:t.call(e,g)})),M&&f){const e=S.filter((({writer:e})=>(null==e?void 0:e.getParts)&&e.replaceParts)).map((({writer:e})=>La(this,void 0,void 0,(function*(){const t=e.getParts(),a=yield f(t,l);e.replaceParts(a)}))));yield Promise.all(e),k()}if(y.resolve(),M){const e=g<=o.Iw;S.forEach((t=>{const{deferred:a,writer:s}=t;if(a.isFulfilled||a.isRejected||!s)return;const n=s.finalize(e);a.resolve(n)}))}}catch(e){u(null,e)}}));for(let e=0,t=Math.min(1/0,r.length);e{if(S.reduce(((e,t)=>e+ +!!t.error),0)===S.length)throw S[0].error};return h}downloadMedia(e){let{media:t,thumb:a}=e;const s="photo"===t._;if(s&&!a)return Promise.reject("preloadPhoto photoEmpty!");const n="document"===t._;n?t=this.appDocsManager.getDoc(t.id):s&&(t=this.appPhotosManager.getPhoto(t.id));const{fileName:i,downloadOptions:r}=(0,Ra.Z)(e);let o=this.getDownload(i);return o||(o=this.download(r),n&&!a&&(this.rootScope.dispatchEvent("document_downloading",t.id),o.then((()=>{this.rootScope.dispatchEvent("document_downloaded",t.id)})).catch(jt.Z))),o}downloadMediaURL(e){const{media:t,thumb:a}=e;let s=this.thumbsStorage.getCacheContext(t,null==a?void 0:a.type);return(!a||s.downloaded>=("size"in a?a.size:0))&&s.url?Promise.resolve(s.url):this.downloadMedia(e).then((e=>{if(!s.downloaded||s.downloaded=10485760,n=this.getLimitPart(a,!0),i=this.getDelta(n),r=Math.ceil(a/n),o=(0,Te.a)(),p={_:s?"inputFileBig":"inputFile",id:o,parts:r,name:t,md5_checksum:""},d=(0,v.Z)();if(r>this.maxUploadParts)return d.reject((0,X.Z)("FILE_TOO_BIG")),d;let f=!1,c=!1,l=e=>{"UPLOAD_CANCELED"!==(null==e?void 0:e.type)&&this.log.error("Up Error",e),d.reject(e),f=!0,l=jt.Z};const m=s?"upload.saveBigFilePart":"upload.saveFilePart",g=this.tempId++,h=this,u=function*(){let u=0,y=0;for(let v=0;vLa(this,void 0,void 0,(function*(){_();const i=e.slice(v,v+n),g=yield Fa(i);return _(),h.debug&&h.log("Upload file part, isBig:",s,P,g.byteLength,new Uint8Array(g).length,new Uint8Array(g).slice().length),h.apiManager.invokeApi(m,{file_id:o,file_part:P,file_total_parts:r,bytes:g},{fileUpload:!0}).then((()=>{if(f)return;++y;const e={done:y*n,offset:v,total:a,fileName:t};d.notify(e),y>=r&&(d.resolve(p),c=!0)}),l)}))),i).catch(l)}}(),y=()=>{if(f)return;const e=u.next();e.done||f||e.value.then(y)};for(let e=0,t=Math.min(1/0,r);e{if(f)throw(0,X.Z)("UPLOAD_CANCELED")};return d.cancel=()=>{f||c||(f=!0,l((0,X.Z)("UPLOAD_CANCELED")))},d.notify=e=>{this.rootScope.dispatchEvent("download_progress",e)},d.finally((()=>{this.uploadPromises[t]===d&&delete this.uploadPromises[t]})),this.uploadPromises[t]=d}}var qa=a(7487),Ga=a(6666),Ha=a(3306);class Wa extends G{constructor(){super(),this.hashes={},this.apiPromisesSingleProcess={},this.apiPromisesSingle={},this.apiPromisesCacheable={},this.afterMessageIdTemp=0}setUser(e){return this.setUserAuth(e.id)}invokeApiAfter(e,t={},a={}){let s=a;return s.prepareTempMessageId=""+ ++this.afterMessageIdTemp,s=Object.assign({},a),a.messageId=s.prepareTempMessageId,this.invokeApi(e,t,s)}invokeApiHashable(e){var t,a;null!==(t=e.params)&&void 0!==t||(e.params={}),null!==(a=e.options)&&void 0!==a||(e.options={});const{params:s,options:n,method:i,overwrite:r}=e,o=JSON.stringify(s);let p;return this.hashes[i]&&(p=this.hashes[i][o],p&&(r?(delete this.hashes[i][o],p=void 0):s.hash=p.hash)),this.invokeApiSingleProcess({method:i,processResult:t=>{if(t._.includes("NotModified"))return p.result;if(t.hash){const e=t.hash;this.hashes[i]||(this.hashes[i]={}),p=this.hashes[i][o]={hash:e,result:t}}if(e.processResult){const a=e.processResult(t);return p?p.result=a:a}return t},params:s,options:n})}invokeApiSingle(e,t={},a={}){const s=e+"-"+JSON.stringify(t),n=this.apiPromisesSingle;return n[s]?n[s]:n[s]=this.invokeApi(e,t,a).finally((()=>{delete n[s]}))}invokeApiSingleProcess(e){var t,a,s;null!==(t=e.params)&&void 0!==t||(e.params={}),null!==(a=e.options)&&void 0!==a||(e.options={});const{method:n,processResult:i,processError:r,params:o,options:p}=e,d=this.apiPromisesSingleProcess,f=p.cacheKey||JSON.stringify(o),c=null!==(s=d[n])&&void 0!==s?s:d[n]=new Map,l=c.get(f);if(l)return l;const m=()=>{const e=c.get(f);return e===h?void 0:e},g=this.invokeApi(n,o,p).then((e=>m()||i(e)),(e=>{const t=m();if(t)return t;if(!r)throw e;return r(e)})),h=g.finally((()=>{c.get(f)===h&&(c.delete(f),c.size||delete d[n])}));return c.set(f,h),h}invokeApiCacheable(e,t={},a={}){var s;const n=null!==(s=this.apiPromisesCacheable[e])&&void 0!==s?s:this.apiPromisesCacheable[e]={},i=JSON.stringify(t),r=n[i];if(r&&(!a.override||!r.fulfilled))return r.promise;let o;a.override&&(r&&r.timeout&&(clearTimeout(r.timeout),delete r.timeout),delete a.override),a.cacheSeconds&&(o=E.Z.setTimeout((()=>{delete n[i]}),1e3*a.cacheSeconds),delete a.cacheSeconds);const p=this.invokeApi(e,t,a);return n[i]={timestamp:Date.now(),fulfilled:!1,timeout:o,promise:p,params:t},p}clearCache(e,t){const a=this.apiPromisesCacheable[e];if(a)for(const e in a){const s=a[e];try{t(s.params)&&(s.timeout&&clearTimeout(s.timeout),delete a[e])}catch(e){}}}getConfig(e){return this.config&&!e?this.config:this.invokeApiSingleProcess({method:"help.getConfig",params:{},processResult:e=>(this.config=e,this.rootScope.dispatchEvent("config",e),e),options:{overwrite:e}})}getAppConfig(e){return this.appConfig&&!e?this.appConfig:this.invokeApiSingleProcess({method:"help.getAppConfig",params:{},processResult:e=>{var t;return this.appConfig=e,(0,ia.Ki)(null!==(t=e.ignore_restriction_reasons)&&void 0!==t?t:[]),this.rootScope.dispatchEvent("app_config",e),e},options:{overwrite:e}})}getLimit(e,t){return(0,q.Z)(this.getAppConfig(),(a=>{null!=t||(t=this.rootScope.premium);const s={pin:["dialogs_pinned_limit_default","dialogs_pinned_limit_premium"],folderPin:["dialogs_folder_pinned_limit_default","dialogs_folder_pinned_limit_premium"],folders:["dialog_filters_limit_default","dialog_filters_limit_premium"],favedStickers:["stickers_faved_limit_default","stickers_faved_limit_premium"],reactions:["reactions_user_max_default","reactions_user_max_premium"],bio:["about_length_limit_default","about_length_limit_premium"],topicPin:"topics_pinned_limit",caption:["caption_length_limit_default","caption_length_limit_premium"]}[e];return a[Array.isArray(s)?s[t?1:0]:s]}))}}var za=a(8453),Ka=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 Ja extends Wa{constructor(){super(),this.log=(0,I.kg)("API"),this.cachedNetworkers={},this.cachedExportPromise={},this.gettingNetworkers={},this.baseDcId=0,this.afterMessageTempIds={},this.transportType=b.Z.transport,Z.addEventListener("transport",(e=>{this.changeTransportType(e)})),setInterval((()=>{this.getAppConfig(!0)}),997e4)}after(){this.apiUpdatesManager.addMultipleEventsListeners({updateConfig:()=>{this.getConfig(!0),this.getAppConfig(!0)}}),this.rootScope.addEventListener("user_auth",(()=>{this.config&&this.apiUpdatesManager.processLocalUpdate({_:"updateConfig"})})),this.rootScope.addEventListener("premium_toggle",(e=>{this.iterateNetworkers((({networker:t,connectionType:a,dcId:s,transportType:n})=>{if("client"===a||"websocket"!==n)return;const i=t.transport;if(i){if(i.connection){const t=V(s,a,e);i.changeUrl(t)}}else this.log.error("wow what, no transport?",t)}))}))}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 this.dcConfigurator.chooseServer(e,t,a,"client"===t,this.rootScope.premium)}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);this.changeNetworkerTransport(e.networker,a)}))}getBaseDcId(){return Ka(this,void 0,void 0,(function*(){if(this.baseDcId)return this.baseDcId;const e=yield qa.Z.get("dc");return this.baseDcId||(e?this.baseDcId=e:this.setBaseDcId(_.Z.baseDcId)),this.baseDcId}))}setUserAuth(e){return Ka(this,void 0,void 0,(function*(){if("string"!=typeof e&&"number"!=typeof e||(e={dcID:0,date:Date.now()/1e3|0,id:e.toPeerId(!1)}),this.rootScope.dispatchEvent("user_auth",e),!e.dcID){const t=yield this.getBaseDcId();e.dcID=t}qa.Z.set({user_auth:e})}))}setBaseDcId(e){const t=this.baseDcId;t&&this.getNetworker(t).then((e=>{this.setOnDrainIfNeeded(e)})),this.baseDcId=e,qa.Z.set({dc:this.baseDcId})}logOut(){return Ka(this,void 0,void 0,(function*(){if(this.loggingOut)return;this.loggingOut=!0;const e=[];for(let t=1;t<=5;t++)e.push("dc"+t+"_auth_key");const t=yield Promise.all(e.map((e=>qa.Z.get(e)))),a=[];for(let e=0;eKa(this,void 0,void 0,(function*(){this.baseDcId=void 0,yield(0,za.Z)(!1,!0),Ga.C.closeDatabases(),this.rootScope.dispatchEvent("logging_out")}));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",n=this.getTransportType(a);this.cachedNetworkers[n]||(this.cachedNetworkers[n]={client:{},download:{},upload:{}});const i=this.cachedNetworkers[n][a];e in i||(i[e]=[]);const r=i[e],o="client"===a||"https"===n?1:this.rootScope.premium?6:3;if(r.length>=o){let e=o-1,t=!1;for(;e>=0;--e)if(r[e].isOnline){t=!0;break}const a=r.splice(t?e:o-1,1)[0];return r.unshift(a),Promise.resolve(a)}let p=this.generateNetworkerGetKey(e,n,a);if(this.gettingNetworkers[p])return this.gettingNetworkers[p];const d=`dc${e}_auth_key`,f=`dc${e}_server_salt`;let c=this.chooseServer(e,a,n);return this.gettingNetworkers[p]=Promise.all([d,f].map((e=>qa.Z.get(e)))).then((([i,o])=>Ka(this,void 0,void 0,(function*(){let l,m;if(i&&512===i.length){o&&16===o.length||(o="AAAAAAAAAAAAAAAA");const a=(0,Ha.Z)(i),n=(yield s.Z.invokeCrypto("sha1",a)).slice(-8),r=(0,Ha.Z)(o);l=this.networkerFactory.getNetworker(e,a,n,r,t)}else try{const a=yield this.authorizer.auth(e);qa.Z.set({[d]:T(a.authKey),[f]:T(a.serverSalt)}),l=this.networkerFactory.getNetworker(e,a.authKey,a.authKeyId,a.serverSalt,t)}catch(e){m=e}const g=this.getTransportType(a);if(g!==n&&(p=this.generateNetworkerGetKey(e,g,a),c.destroy(),O.removeTransport(this.dcConfigurator.chosenServers,c),l&&(c=this.chooseServer(e,a,g)),this.log("transport has been changed during authorization from",n,"to",g)),delete this.gettingNetworkers[p],m)throw this.log("get networker error",m,m.stack),m;return this.changeNetworkerTransport(l,c),r.unshift(l),this.setOnDrainIfNeeded(l),l}))))}getNetworkerVoid(e){return this.getNetworker(e).then(jt.Z,jt.Z)}changeNetworkerTransport(e,t){const a=e.transport;a&&O.removeTransport(this.dcConfigurator.chosenServers,a),e.changeTransport(t)}onNetworkerDrain(e){this.log("networker drain",e.dcId),e.onDrain=void 0,this.changeNetworkerTransport(e),e.destroy(),this.networkerFactory.removeNetworker(e),O.removeTransport(this.cachedNetworkers,e)}setOnDrainIfNeeded(e){e.onDrain||(e.isFileNetworker?Promise.resolve(!0):this.getBaseDcId().then((t=>e.dcId!==t))).then((t=>{e.onDrain||t&&(e.onDrain=()=>this.onNetworkerDrain(e),e.setDrainTimeout())}))}setUpdatesProcessor(e){this.updatesProcessor=e,this.networkerFactory.setUpdatesProcessor(e)}invokeApi(e,t={},a={}){const s=(0,v.Z)();let n,i,{afterMessageId:r,prepareTempMessageId:o}=a;if(o&&s.then((()=>{delete this.afterMessageTempIds[o]})),d.GO){const n=Date.now(),r=E.Z.setInterval((()=>{i&&i.isStopped()||this.log.error("Request is still processing:",e,t,a,"time:",(Date.now()-n)/1e3)}),5e3);s.catch(jt.Z).finally((()=>{clearInterval(r)}))}const p=(new Error).stack||"empty stack",f=()=>{if(r){const e=this.afterMessageTempIds[r];e&&(a.afterMessageId=e.messageId)}const p=i.wrapApiCall(e,t,a);return o&&(this.afterMessageTempIds[o]={messageId:a.messageId,promise:s}),p.catch((s=>{var i;if("FILE_REFERENCE_EXPIRED"!==s.type&&this.log.error("Error",s.code,s.type,this.baseDcId,n,e,t),401===s.code&&this.baseDcId===n)throw"SESSION_PASSWORD_NEEDED"!==s.type&&(qa.Z.delete("dc"),qa.Z.delete("user_auth")),s;if(401===s.code&&this.baseDcId&&n!==this.baseDcId){if(void 0===this.cachedExportPromise[n]){const e=new Promise(((e,t)=>{this.invokeApi("auth.exportAuthorization",{dc_id:n},{noErrorBox:!0}).then((a=>{this.invokeApi("auth.importAuthorization",{id:a.id,bytes:a.bytes},{dcId:n,noErrorBox:!0}).then(e,t)}),t)}));this.cachedExportPromise[n]=e}return this.cachedExportPromise[n].then((()=>f()))}if(303!==s.code){if(400===s.code&&0===s.type.indexOf("FILE_MIGRATE")){const i=+s.type.match(/^(FILE_MIGRATE_)(\d+)/)[2];if(i!==n)return a.dcId=i,this.invokeApi(e,t,a);throw s}if(400===s.code&&"CONNECTION_NOT_INITED"===s.type)return this.networkerFactory.unsetConnectionInited(),f();if(a.rawError||420!==s.code){if(!a.rawError&&["MSG_WAIT_FAILED","MSG_WAIT_TIMEOUT"].includes(s.type)){const e=this.afterMessageTempIds[r];return r=void 0,delete a.afterMessageId,e?e.promise.then((()=>f())):f()}if(a.rawError||500!==s.code){if("UNKNOWN"===s.type||"MTPROTO_CLUSTER_INVALID"===s.type)return(0,P.Z)(1e3).then((()=>f()));throw s}{const e=Date.now();if(a.stopTime&&e>=a.stopTime)throw s;return a.waitTime=a.waitTime?Math.min(60,1.5*a.waitTime):1,(0,P.Z)(1e3*a.waitTime).then((()=>f()))}}{const e=+s.type.match(/^FLOOD_WAIT_(\d+)/)[1]||1;if(e>(null!==(i=a.floodMaxTimeout)&&void 0!==i?i:60)&&!a.prepareTempMessageId)throw s;return(0,P.Z)(1e3*e).then((()=>f()))}}{const i=+s.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_)(\d+)/)[2];if(i!==n)return a.dcId?a.dcId=i:this.setBaseDcId(i),this.invokeApi(e,t,a)}}))};let c;return c=(n=a.dcId||this.baseDcId)?this.getNetworker(n,a):this.getBaseDcId().then((e=>this.getNetworker(n=e,a))),c.then((e=>{i=e;const t=f();return i.attachPromise(s,a),t})).then(s.resolve).catch((t=>Ka(this,void 0,void 0,(function*(){if(t?(0,fe.Z)(t)||(t={message:t}):t={type:"ERROR_EMPTY"},(401===t.code&&"SESSION_REVOKED"===t.type||406===t.code&&"AUTH_KEY_DUPLICATED"===t.type)&&this.logOut(),a.ignoreErrors)throw t;throw 406===t.code&&(t.handled=!0),a.noErrorBox||(t.input=e,t.stack=p||t.originalError&&t.originalError.stack||t.stack||(new Error).stack,setTimeout((()=>{t.handled||(401===t.code&&this.logOut(),t.handled=!0)}),100)),t})))).catch(s.reject),s}}class $a{constructor(){this.neededPeers=new Map,this.singlePeerMap=new Map,this._constructor(!1)}after(){this.rootScope.addEventListener("user_auth",(()=>{this.requestPeer(this.appPeersManager.peerId,"self")}))}requestPeer(e,t){let a=this.neededPeers.get(e);a&&a.has(t)||(a||(a=new Set,this.neededPeers.set(e,a)),a.add(t),this.dispatchEvent("peerNeeded",e))}releasePeer(e,t){const a=this.neededPeers.get(e);a&&(a.delete(t),a.size||(this.neededPeers.delete(e),this.dispatchEvent("peerUnneeded",e)))}requestPeersForKey(e,t){Array.isArray(e)&&(e=new Set(e));let a=this.singlePeerMap.get(t);if(a){for(const s of a)e.has(s)||(this.releasePeer(s,t),a.delete(s));if(!a.size&&!e.size)return void this.singlePeerMap.delete(t)}if(e.size){a||(a=new Set,this.singlePeerMap.set(t,a));for(const s of e)a.has(s)||(this.requestPeer(s,t),a.add(s))}}isPeerNeeded(e){return this.neededPeers.has(e)}}Ae($a,[p.Z,G]);const Qa=$a,Ya=o.Pt;class Xa{constructor(){this.thumbsCache={}}getKey(e){var t;return e._+(null!==(t=e.id)&&void 0!==t?t:e.url)}getCacheContext(e,t=Ya){var a,s,n,i;const r=null!==(a=(n=this.thumbsCache)[i=this.getKey(e)])&&void 0!==a?a:n[i]={};return null!==(s=r[t])&&void 0!==s?s:r[t]={downloaded:0,url:"",type:t}}setCacheContextURL(e,t=Ya,a,s=0){const n=this.getCacheContext(e,t);return n.url=a,n.downloaded=s,n}deleteCacheContext(e,t=Ya){const a=this.thumbsCache[this.getKey(e)];a&&delete a[t]}}const es={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:-1182234929,predicate:"inputUserEmpty",params:[],type:"InputUser"},{id:-138301121,predicate:"inputUserSelf",params:[],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:-1771768449,predicate:"inputMediaEmpty",params:[],type:"InputMedia"},{id:505969924,predicate:"inputMediaUploadedPhoto",params:[{name:"flags",type:"#"},{name:"spoiler",type:"flags.2?true"},{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:"spoiler",type:"flags.1?true"},{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: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:1498486562,predicate:"peerUser",params:[{name:"user_id",type:"long"}],type:"Peer"},{id:918946202,predicate:"peerChat",params:[{name:"chat_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:1326562017,predicate:"userProfilePhotoEmpty",params:[],type:"UserProfilePhoto"},{id:-2100168954,predicate:"userProfilePhoto",params:[{name:"flags",type:"#"},{name:"has_video",type:"flags.0?true"},{name:"personal",type:"flags.2?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: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:"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:-908914376,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?ChatReactions"}],type:"ChatFull"},{id:-1070776313,predicate:"chatParticipant",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:"spoiler",type:"flags.3?true"},{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:-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:-712374074,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:"unread_reactions_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"},{name:"ttl_period",type:"flags.5?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: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:-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:-551616469,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?NotificationSound"}],type:"InputPeerNotifySettings"},{id:-1472527322,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:"ios_sound",type:"flags.3?NotificationSound"},{name:"android_sound",type:"flags.4?NotificationSound"},{name:"other_sound",type:"flags.5?NotificationSound"}],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: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:-120378643,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:"voice_messages_forbidden",type:"flags.20?true"},{name:"id",type:"long"},{name:"about",type:"flags.1?string"},{name:"settings",type:"PeerSettings"},{name:"personal_photo",type:"flags.21?Photo"},{name:"profile_photo",type:"flags.2?Photo"},{name:"fallback_photo",type:"flags.22?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"},{name:"bot_group_admin_rights",type:"flags.17?ChatAdminRights"},{name:"bot_broadcast_admin_rights",type:"flags.18?ChatAdminRights"},{name:"premium_gifts",type:"flags.19?Vector"}],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:-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:1694474197,predicate:"messages.chats",params:[{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: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:-1484486364,predicate:"updateUserName",params:[{name:"user_id",type:"long"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"usernames",type:"Vector"}],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:-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:-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: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:"this_port_only",type:"flags.5?true"},{name:"id",type:"int"},{name:"ip_address",type:"string"},{name:"port",type:"int"},{name:"secret",type:"flags.10?bytes"}],type:"DcOption"},{id:589653676,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:"force_try_ipv6",type:"flags.14?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"},{name:"reactions_default",type:"flags.15?Reaction"}],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: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:-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:-1476358952,predicate:"encryptedFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"size",type:"long"},{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:-182231723,predicate:"inputEncryptedFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputFileLocation"},{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:-95482955,predicate:"inputFileBig",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"name",type:"string"}],type:"InputFile"},{id:767652808,predicate:"inputEncryptedFileBigUploaded",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"key_fingerprint",type:"int"}],type:"InputEncryptedFile"},{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:1530447553,predicate:"inputMediaUploadedDocument",params:[{name:"flags",type:"#"},{name:"nosound_video",type:"flags.3?true"},{name:"force_file",type:"flags.4?true"},{name:"spoiler",type:"flags.5?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:"spoiler",type:"flags.2?true"},{name:"id",type:"InputDocument"},{name:"ttl_seconds",type:"flags.0?int"},{name:"query",type:"flags.1?string"}],type:"InputMedia"},{id:-1666158377,predicate:"messageMediaDocument",params:[{name:"flags",type:"#"},{name:"nopremium",type:"flags.3?true"},{name:"spoiler",type:"flags.4?true"},{name:"document",type:"flags.0?Document"},{name:"ttl_seconds",type:"flags.2?int"}],type:"MessageMedia"},{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:-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:922273905,predicate:"documentEmpty",params:[{name:"id",type:"long"}],type:"Document"},{id:-1881881384,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:"long"},{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:-1094555409,predicate:"updateNotifySettings",params:[{name:"peer",type:"NotifyPeer"},{name:"notify_settings",type:"PeerNotifySettings"}],type:"Update"},{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:-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:-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:-496024847,predicate:"userStatusRecently",params:[],type:"UserStatus"},{id:129960444,predicate:"userStatusLastWeek",params:[],type:"UserStatus"},{id:2011940674,predicate:"userStatusLastMonth",params:[],type:"UserStatus"},{id:-298113238,predicate:"updatePrivacy",params:[{name:"key",type:"PrivacyKey"},{name:"rules",type:"Vector"}],type:"Update"},{id:1335282456,predicate:"inputPrivacyKeyStatusTimestamp",params:[],type:"InputPrivacyKey"},{id:-1137792208,predicate:"privacyKeyStatusTimestamp",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:-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: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:88680979,predicate:"updateUserPhone",params:[{name:"user_id",type:"long"},{name:"phone",type:"string"}],type:"Update"},{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:-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:-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:-2066640507,predicate:"messages.affectedMessages",params:[{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"messages.AffectedMessages"},{id:2139689491,predicate:"updateWebPage",params:[{name:"webpage",type:"WebPage"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{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:-1557277184,predicate:"messageMediaWebPage",params:[{name:"webpage",type:"WebPage"}],type:"MessageMedia"},{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:-1787080453,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"},{name:"login_email_pattern",type:"flags.6?string"}],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:-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: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:-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:51520707,predicate:"messageActionChatJoinedByLink",params:[{name:"inviter_id",type:"long"}],type:"MessageAction"},{id:1757493555,predicate:"updateReadMessagesContents",params:[{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{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:768691932,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:"videos",type:"flags.6?true"},{name:"emojis",type:"flags.7?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:"thumb_document_id",type:"flags.8?long"},{name:"count",type:"int"},{name:"hash",type:"int"}],type:"StickerSet"},{id:1846886166,predicate:"messages.stickerSet",params:[{name:"set",type:"StickerSet"},{name:"packs",type:"Vector"},{name:"keywords",type:"Vector"},{name:"documents",type:"Vector"}],type:"messages.StickerSet"},{id:-1885878744,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:"bot_attach_menu",type:"flags.27?true"},{name:"premium",type:"flags.28?true"},{name:"attach_menu_enabled",type:"flags.29?true"},{name:"flags2",type:"#"},{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"},{name:"emoji_status",type:"flags.30?EmojiStatus"},{name:"usernames",type:"flags2.0?Vector"}],type:"User"},{id:-1032140601,predicate:"botCommand",params:[{name:"command",type:"string"},{name:"description",type:"string"}],type:"BotCommand"},{id:-1892676777,predicate:"botInfo",params:[{name:"flags",type:"#"},{name:"user_id",type:"flags.0?long"},{name:"description",type:"flags.1?string"},{name:"description_photo",type:"flags.4?Photo"},{name:"description_document",type:"flags.5?Document"},{name:"commands",type:"flags.2?Vector"},{name:"menu_button",type:"flags.3?BotMenuButton"}],type:"BotInfo"},{id:-1560655744,predicate:"keyboardButton",params:[{name:"text",type:"string"}],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:"persistent",type:"flags.4?true"},{name:"rows",type:"Vector"},{name:"placeholder",type:"flags.3?string"}],type:"ReplyMarkup"},{id:-571955892,predicate:"inputPeerUser",params:[{name:"user_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPeer"},{id:-233744186,predicate:"inputUser",params:[{name:"user_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputUser"},{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:-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:-292807034,predicate:"inputChannelEmpty",params:[],type:"InputChannel"},{id:-212145112,predicate:"inputChannel",params:[{name:"channel_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputChannel"},{id:-1566230754,predicate:"peerChannel",params:[{name:"channel_id",type:"long"}],type:"Peer"},{id:666680316,predicate:"inputPeerChannel",params:[{name:"channel_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPeer"},{id:-2094689180,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:"join_to_send",type:"flags.28?true"},{name:"join_request",type:"flags.29?true"},{name:"forum",type:"flags.30?true"},{name:"flags2",type:"#"},{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"},{name:"usernames",type:"flags2.0?Vector"}],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:2131196633,predicate:"contacts.resolvedPeer",params:[{name:"peer",type:"Peer"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.ResolvedPeer"},{id:-231385849,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:"flags2",type:"#"},{name:"can_delete_channel",type:"flags2.0?true"},{name:"antispam",type:"flags2.1?true"},{name:"participants_hidden",type:"flags2.2?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?ChatReactions"}],type:"ChatFull"},{id:182649427,predicate:"messageRange",params:[{name:"min_id",type:"int"},{name:"max_id",type:"int"}],type:"MessageRange"},{id:-948520370,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:"topics",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Messages"},{id:-1781355374,predicate:"messageActionChannelCreate",params:[{name:"title",type:"string"}],type:"MessageAction"},{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: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:-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:-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:-541588713,predicate:"channels.channelParticipant",params:[{name:"participant",type:"ChannelParticipant"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.ChannelParticipant"},{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:-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:-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:-1328445861,predicate:"channelParticipantsBots",params:[],type:"ChannelParticipantsFilter"},{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: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:"emojis",type:"flags.1?true"},{name:"order",type:"Vector"}],type:"Update"},{id:834816008,predicate:"updateStickerSets",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"emojis",type:"flags.1?true"}],type:"Update"},{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:-1821035490,predicate:"updateSavedGifs",params:[],type:"Update"},{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:-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: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: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:-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: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:1358283666,predicate:"inputMessagesFilterVoice",params:[],type:"MessagesFilter"},{id:928101534,predicate:"inputMessagesFilterMusic",params:[],type:"MessagesFilter"},{id:-1107622874,predicate:"inputPrivacyKeyChatInvite",params:[],type:"InputPrivacyKey"},{id:1343122938,predicate:"privacyKeyChatInvite",params:[],type:"PrivacyKey"},{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:457133559,predicate:"updateEditChannelMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1799538451,predicate:"messageActionPinMessage",params:[],type:"MessageAction"},{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: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: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:1218642516,predicate:"replyInlineMarkup",params:[{name:"rows",type:"Vector"}],type:"ReplyMarkup"},{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:-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:649453030,predicate:"messages.messageEditData",params:[{name:"flags",type:"#"},{name:"caption",type:"flags.0?true"}],type:"messages.MessageEditData"},{id:-469536605,predicate:"updateEditMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{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: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:-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: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:-1995686519,predicate:"inputBotInlineMessageID",params:[{name:"dc_id",type:"int"},{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputBotInlineMessageID"},{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: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:-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:-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:975236280,predicate:"inputMessagesFilterChatPhotos",params:[],type:"MessagesFilter"},{id:-1218471511,predicate:"updateReadChannelOutbox",params:[{name:"channel_id",type:"long"},{name:"max_id",type:"int"}],type:"Update"},{id:457829485,predicate:"updateDraftMessage",params:[{name:"flags",type:"#"},{name:"peer",type:"Peer"},{name:"top_msg_id",type:"flags.0?int"},{name:"draft",type:"DraftMessage"}],type:"Update"},{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:-1615153660,predicate:"messageActionHistoryClear",params:[],type:"MessageAction"},{id:-958657434,predicate:"messages.featuredStickersNotModified",params:[{name:"count",type:"int"}],type:"messages.FeaturedStickers"},{id:-1103615738,predicate:"messages.featuredStickers",params:[{name:"flags",type:"#"},{name:"premium",type:"flags.0?true"},{name:"hash",type:"long"},{name:"count",type:"int"},{name:"sets",type:"Vector"},{name:"unread",type:"Vector"}],type:"messages.FeaturedStickers"},{id:1461528386,predicate:"updateReadFeaturedStickers",params:[],type:"Update"},{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:-1706939360,predicate:"updateRecentStickers",params:[],type:"Update"},{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:-1574314746,predicate:"updateConfig",params:[],type:"Update"},{id:861169551,predicate:"updatePtsChanged",params:[],type:"Update"},{id:-440664550,predicate:"inputMediaPhotoExternal",params:[{name:"flags",type:"#"},{name:"spoiler",type:"flags.1?true"},{name:"url",type:"string"},{name:"ttl_seconds",type:"flags.0?int"}],type:"InputMedia"},{id:-78455655,predicate:"inputMediaDocumentExternal",params:[{name:"flags",type:"#"},{name:"spoiler",type:"flags.1?true"},{name:"url",type:"string"},{name:"ttl_seconds",type:"flags.0?int"}],type:"InputMedia"},{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:-1744710921,predicate:"documentAttributeHasStickers",params:[],type:"DocumentAttribute"},{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:1336154098,predicate:"inputBotInlineResultGame",params:[{name:"id",type:"string"},{name:"short_name",type:"string"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:1262639204,predicate:"inputBotInlineMessageGame",params:[{name:"flags",type:"#"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:-38694904,predicate:"messageMediaGame",params:[{name:"game",type:"Game"}],type:"MessageMedia"},{id:-750828557,predicate:"inputMediaGame",params:[{name:"id",type:"InputGame"}],type:"InputMedia"},{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:1358175439,predicate:"keyboardButtonGame",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:-1834538890,predicate:"messageActionGameScore",params:[{name:"game_id",type:"long"},{name:"score",type:"int"}],type:"MessageAction"},{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:1258196845,predicate:"updates.differenceTooLong",params:[{name:"pts",type:"int"}],type:"updates.Difference"},{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:-1663561404,predicate:"messages.chatsSlice",params:[{name:"count",type:"int"},{name:"chats",type:"Vector"}],type:"messages.Chats"},{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: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:1930545681,predicate:"webPageNotModified",params:[{name:"flags",type:"#"},{name:"cached_page_views",type:"flags.0?int"}],type:"WebPage"},{id:-88417185,predicate:"inputPrivacyKeyPhoneCall",params:[],type:"InputPrivacyKey"},{id:1030105979,predicate:"privacyKeyPhoneCall",params:[],type:"PrivacyKey"},{id:-580219064,predicate:"sendMessageGamePlayAction",params:[],type:"SendMessageAction"},{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: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:2104790276,predicate:"dataJSON",params:[{name:"data",type:"string"}],type:"DataJSON"},{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:-886477832,predicate:"labeledPrice",params:[{name:"label",type:"string"},{name:"amount",type:"long"}],type:"LabeledPrice"},{id:1048946971,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:"recurring",type:"flags.9?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"},{name:"recurring_terms_url",type:"flags.9?string"}],type:"Invoice"},{id:-1900697899,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"},{name:"extended_media",type:"flags.2?InputMedia"}],type:"InputMedia"},{id:-368917890,predicate:"paymentCharge",params:[{name:"id",type:"string"},{name:"provider_charge_id",type:"string"}],type:"PaymentCharge"},{id:-1892568281,predicate:"messageActionPaymentSentMe",params:[{name:"flags",type:"#"},{name:"recurring_init",type:"flags.2?true"},{name:"recurring_used",type:"flags.3?true"},{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:-156940077,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"},{name:"extended_media",type:"flags.4?MessageExtendedMedia"}],type:"MessageMedia"},{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:-1344716869,predicate:"keyboardButtonBuy",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:-1776926890,predicate:"messageActionPaymentSent",params:[{name:"flags",type:"#"},{name:"recurring_init",type:"flags.2?true"},{name:"recurring_used",type:"flags.3?true"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"invoice_slug",type:"flags.0?string"}],type:"MessageAction"},{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:-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: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:-1610250415,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:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.5?WebDocument"},{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:"additional_methods",type:"flags.6?Vector"},{name:"saved_info",type:"flags.0?PaymentRequestedInfo"},{name:"saved_credentials",type:"flags.1?Vector"},{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: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:-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:-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:-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:-1425052898,predicate:"updatePhoneCall",params:[{name:"phone_call",type:"PhoneCall"}],type:"Update"},{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:-1665063993,predicate:"phoneConnection",params:[{name:"flags",type:"#"},{name:"tcp",type:"flags.0?true"},{name:"id",type:"long"},{name:"ip",type:"string"},{name:"ipv6",type:"string"},{name:"port",type:"int"},{name:"peer_tag",type:"bytes"}],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:-2134272152,predicate:"inputMessagesFilterPhoneCalls",params:[{name:"flags",type:"#"},{name:"missed",type:"flags.0?true"}],type:"MessagesFilter"},{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:2054952868,predicate:"inputMessagesFilterRoundVoice",params:[],type:"MessagesFilter"},{id:-1253451181,predicate:"inputMessagesFilterRoundVideo",params:[],type:"MessagesFilter"},{id:-1997373508,predicate:"sendMessageRecordRoundAction",params:[],type:"SendMessageAction"},{id:608050278,predicate:"sendMessageUploadRoundAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{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:-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:-283684427,predicate:"pageBlockChannel",params:[{name:"channel",type:"Chat"}],type:"PageBlock"},{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:1180041828,predicate:"updateLangPackTooLong",params:[{name:"lang_code",type:"string"}],type:"Update"},{id:1442983757,predicate:"updateLangPack",params:[{name:"difference",type:"LangPackDifference"}],type:"Update"},{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:338142689,predicate:"channelParticipantsBanned",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:106343499,predicate:"channelParticipantsSearch",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{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: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"},{name:"forums",type:"flags.17?true"}],type:"ChannelAdminLogEventsFilter"},{id:511092620,predicate:"topPeerCategoryPhoneCalls",params:[],type:"TopPeerCategory"},{id:-2143067670,predicate:"pageBlockAudio",params:[{name:"audio_id",type:"long"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:1558266229,predicate:"popularContact",params:[{name:"client_id",type:"long"},{name:"importers",type:"int"}],type:"PopularContact"},{id:1200788123,predicate:"messageActionScreenshotTaken",params:[],type:"MessageAction"},{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:-451831443,predicate:"updateFavedStickers",params:[],type:"Update"},{id:-366410403,predicate:"updateChannelReadMessagesContents",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"top_msg_id",type:"flags.0?int"},{name:"messages",type:"Vector"}],type:"Update"},{id:-1040652646,predicate:"inputMessagesFilterMyMentions",params:[],type:"MessagesFilter"},{id:1887741886,predicate:"updateContactsReset",params:[],type:"Update"},{id:-1312568665,predicate:"channelAdminLogEventActionChangeStickerSet",params:[{name:"prev_stickerset",type:"InputStickerSet"},{name:"new_stickerset",type:"InputStickerSet"}],type:"ChannelAdminLogEventAction"},{id:-85549226,predicate:"messageActionCustomAction",params:[{name:"message",type:"string"}],type:"MessageAction"},{id:178373535,predicate:"inputPaymentCredentialsApplePay",params:[{name:"payment_data",type:"DataJSON"}],type:"InputPaymentCredentials"},{id:-419271411,predicate:"inputMessagesFilterGeo",params:[],type:"MessagesFilter"},{id:-530392189,predicate:"inputMessagesFilterContacts",params:[],type:"MessagesFilter"},{id:-1304443240,predicate:"updateChannelAvailableMessages",params:[{name:"channel_id",type:"long"},{name:"available_min_id",type:"int"}],type:"Update"},{id:1599903217,predicate:"channelAdminLogEventActionTogglePreHistoryHidden",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{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:-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: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:-266911767,predicate:"channels.channelParticipantsNotModified",params:[],type:"channels.ChannelParticipants"},{id:1951620897,predicate:"messages.messagesNotModified",params:[{name:"count",type:"int"}],type:"messages.Messages"},{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:-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:-1410748418,predicate:"messageActionBotAllowed",params:[{name:"domain",type:"string"}],type:"MessageAction"},{id:-55902537,predicate:"inputDialogPeer",params:[{name:"peer",type:"InputPeer"}],type:"InputDialogPeer"},{id:-445792507,predicate:"dialogPeer",params:[{name:"peer",type:"Peer"}],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:-207944868,predicate:"fileHash",params:[{name:"offset",type:"long"},{name:"limit",type:"int"},{name:"hash",type:"bytes"}],type:"FileHash"},{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: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:-876089816,predicate:"inputSecureFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputFileLocation"},{id:1679398724,predicate:"secureFileEmpty",params:[],type:"SecureFile"},{id:2097791614,predicate:"secureFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"size",type:"long"},{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: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: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: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:700340377,predicate:"inputTakeoutFileLocation",params:[],type:"InputFileLocation"},{id:-513517117,predicate:"updateDialogUnreadMark",params:[{name:"flags",type:"#"},{name:"unread",type:"flags.0?true"},{name:"peer",type:"DialogPeer"}],type:"Update"},{id:-253500010,predicate:"messages.dialogsNotModified",params:[{name:"count",type:"int"}],type:"messages.Dialogs"},{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:-1255369827,predicate:"contacts.topPeersDisabled",params:[],type:"contacts.TopPeers"},{id:-1685456582,predicate:"inputReportReasonCopyright",params:[],type:"ReportReason"},{id:-732254058,predicate:"passwordKdfAlgoUnknown",params:[],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:982592842,predicate:"passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow",params:[{name:"salt1",type:"bytes"},{name:"salt2",type:"bytes"},{name:"g",type:"int"},{name:"p",type:"bytes"}],type:"PasswordKdfAlgo"},{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:-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:-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:-1311015810,predicate:"inputNotifyBroadcasts",params:[],type:"InputNotifyPeer"},{id:-703403793,predicate:"notifyBroadcasts",params:[],type:"NotifyPeer"},{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:504660880,predicate:"pageBlockKicker",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{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:-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: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:-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:-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: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:-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:-610373422,predicate:"inputPrivacyKeyPhoneP2P",params:[],type:"InputPrivacyKey"},{id:961092808,predicate:"privacyKeyPhoneP2P",params:[],type:"PrivacyKey"},{id:894777186,predicate:"textAnchor",params:[{name:"text",type:"RichText"},{name:"name",type:"string"}],type:"RichText"},{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:-202219658,predicate:"messageActionContactSignUp",params:[],type:"MessageAction"},{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: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: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:1272375192,predicate:"messageMediaPoll",params:[{name:"poll",type:"Poll"},{name:"results",type:"PollResults"}],type:"MessageMedia"},{id:-264117680,predicate:"chatOnlines",params:[{name:"onlines",type:"int"}],type:"ChatOnlines"},{id:1202287072,predicate:"statsURL",params:[{name:"url",type:"string"}],type:"StatsURL"},{id:-525288402,predicate:"photoStrippedSize",params:[{name:"type",type:"string"},{name:"bytes",type:"bytes"}],type:"PhotoSize"},{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"},{name:"manage_topics",type:"flags.13?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:"manage_topics",type:"flags.18?true"},{name:"until_date",type:"int"}],type:"ChatBannedRights"},{id:1421875280,predicate:"updateChatDefaultBannedRights",params:[{name:"peer",type:"Peer"},{name:"default_banned_rights",type:"ChatBannedRights"},{name:"version",type:"int"}],type:"Update"},{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:-1150621555,predicate:"channelParticipantsContacts",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{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: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:-1896171181,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:"long"},{name:"file_size_max",type:"long"},{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:-1529000952,predicate:"inputPrivacyKeyForwards",params:[],type:"InputPrivacyKey"},{id:1777096355,predicate:"privacyKeyForwards",params:[],type:"PrivacyKey"},{id:1461304012,predicate:"inputPrivacyKeyProfilePhoto",params:[],type:"InputPrivacyKey"},{id:-1777000467,predicate:"privacyKeyProfilePhoto",params:[],type:"PrivacyKey"},{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:-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: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:1684014375,predicate:"inputDialogPeerFolder",params:[{name:"folder_id",type:"int"}],type:"InputDialogPeer"},{id:1363483106,predicate:"dialogPeerFolder",params:[{name:"folder_id",type:"int"}],type:"DialogPeer"},{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:422972864,predicate:"updateFolderPeers",params:[{name:"folder_peers",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:497305826,predicate:"inputUserFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"user_id",type:"long"}],type:"InputUser"},{id:1536380829,predicate:"inputChannelFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"channel_id",type:"long"}],type:"InputChannel"},{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:55761658,predicate:"inputPrivacyKeyPhoneNumber",params:[],type:"InputPrivacyKey"},{id:-778378131,predicate:"privacyKeyPhoneNumber",params:[],type:"PrivacyKey"},{id:-1472172887,predicate:"topPeerCategoryForwardUsers",params:[],type:"TopPeerCategory"},{id:-68239120,predicate:"topPeerCategoryForwardChats",params:[],type:"TopPeerCategory"},{id:84703944,predicate:"channelAdminLogEventActionChangeLinkedChat",params:[{name:"prev_value",type:"long"},{name:"new_value",type:"long"}],type:"ChannelAdminLogEventAction"},{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: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:-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:-2079962673,predicate:"inputPrivacyValueAllowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"InputPrivacyRule"},{id:-380694650,predicate:"inputPrivacyValueDisallowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"InputPrivacyRule"},{id:1796427406,predicate:"privacyValueAllowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"PrivacyRule"},{id:1103656293,predicate:"privacyValueDisallowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"PrivacyRule"},{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:1786671974,predicate:"updatePeerSettings",params:[{name:"peer",type:"Peer"},{name:"settings",type:"PeerSettings"}],type:"Update"},{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:-1263546448,predicate:"updatePeerLocated",params:[{name:"peers",type:"Vector"}],type:"Update"},{id:241923758,predicate:"channelAdminLogEventActionChangeLocation",params:[{name:"prev_value",type:"ChannelLocation"},{name:"new_value",type:"ChannelLocation"}],type:"ChannelAdminLogEventAction"},{id:-606798099,predicate:"inputReportReasonGeoIrrelevant",params:[],type:"ReportReason"},{id:1401984889,predicate:"channelAdminLogEventActionToggleSlowMode",params:[{name:"prev_value",type:"int"},{name:"new_value",type:"int"}],type:"ChannelAdminLogEventAction"},{id:1148485274,predicate:"auth.authorizationSignUpRequired",params:[{name:"flags",type:"#"},{name:"terms_of_service",type:"flags.0?help.TermsOfService"}],type:"auth.Authorization"},{id:-666824391,predicate:"payments.paymentVerificationNeeded",params:[{name:"url",type:"string"}],type:"payments.PaymentResult"},{id:42402760,predicate:"inputStickerSetAnimatedEmoji",params:[],type:"InputStickerSet"},{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:-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:-2112423005,predicate:"updateTheme",params:[{name:"theme",type:"Theme"}],type:"Update"},{id:-786326563,predicate:"inputPrivacyKeyAddedByPhone",params:[],type:"InputPrivacyKey"},{id:1124062251,predicate:"privacyKeyAddedByPhone",params:[],type:"PrivacyKey"},{id:-2027964103,predicate:"updateGeoLiveViewed",params:[{name:"peer",type:"Peer"},{name:"msg_id",type:"int"}],type:"Update"},{id:1448076945,predicate:"updateLoginToken",params:[],type:"Update"},{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:-1770371538,predicate:"inputWallPaperNoFile",params:[{name:"id",type:"long"}],type:"InputWallPaper"},{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:-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: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: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:-1144565411,predicate:"keyboardButtonRequestPoll",params:[{name:"flags",type:"#"},{name:"quiz",type:"flags.0?Bool"},{name:"text",type:"string"}],type:"KeyboardButton"},{id:1981704948,predicate:"messageEntityBankCard",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{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:-118740917,predicate:"peerSelfLocated",params:[{name:"expires",type:"int"}],type:"PeerLocated"},{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: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:-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:-428884101,predicate:"inputMediaDice",params:[{name:"emoticon",type:"string"}],type:"InputMedia"},{id:1065280907,predicate:"messageMediaDice",params:[{name:"value",type:"int"},{name:"emoticon",type:"string"}],type:"MessageMedia"},{id:-427863538,predicate:"inputStickerSetDice",params:[{name:"emoticon",type:"string"}],type:"InputStickerSet"},{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:643940105,predicate:"updatePhoneCallSignalingData",params:[{name:"phone_call_id",type:"long"},{name:"data",type:"bytes"}],type:"Update"},{id:1634294960,predicate:"chatInvitePeek",params:[{name:"chat",type:"Chat"},{name:"expires",type:"int"}],type:"ChatInvite"},{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: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: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:-761649164,predicate:"updateChannelMessageForwards",params:[{name:"channel_id",type:"long"},{name:"id",type:"int"},{name:"forwards",type:"int"}],type:"Update"},{id:-96535659,predicate:"photoSizeProgressive",params:[{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"sizes",type:"Vector"}],type:"PhotoSize"},{id:-1228606141,predicate:"messages.messageViews",params:[{name:"views",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.MessageViews"},{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:-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_scheduled",type:"flags.2?true"},{name:"forum_topic",type:"flags.3?true"},{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:610945826,predicate:"updatePeerBlocked",params:[{name:"peer_id",type:"Peer"},{name:"blocked",type:"Bool"}],type:"Update"},{id:-386039788,predicate:"peerBlocked",params:[{name:"peer_id",type:"Peer"},{name:"date",type:"int"}],type:"PeerBlocked"},{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:-1392895362,predicate:"inputMessageCallbackQuery",params:[{name:"id",type:"int"},{name:"query_id",type:"long"}],type:"InputMessage"},{id:453242886,predicate:"channelParticipantLeft",params:[{name:"peer",type:"Peer"}],type:"ChannelParticipant"},{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:-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:464520273,predicate:"inputMessagesFilterPinned",params:[],type:"MessagesFilter"},{id:-1986399595,predicate:"stats.messageStats",params:[{name:"views_graph",type:"StatsGraph"}],type:"stats.MessageStats"},{id:-1730095465,predicate:"messageActionGeoProximityReached",params:[{name:"from_id",type:"Peer"},{name:"to_id",type:"Peer"},{name:"distance",type:"int"}],type:"MessageAction"},{id:-668906175,predicate:"photoPathSize",params:[{name:"type",type:"string"},{name:"bytes",type:"bytes"}],type:"PhotoSize"},{id:-651419003,predicate:"speakingInGroupCallAction",params:[],type:"SendMessageAction"},{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:"rtmp_stream",type:"flags.12?true"},{name:"listeners_hidden",type:"flags.13?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: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:-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:-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:-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: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:-1966921727,predicate:"inputPaymentCredentialsGooglePay",params:[{name:"payment_token",type:"DataJSON"}],type:"InputPaymentCredentials"},{id:375566091,predicate:"messages.historyImport",params:[{name:"id",type:"long"}],type:"messages.HistoryImport"},{id:-606432698,predicate:"sendMessageHistoryImportAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{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:-170010905,predicate:"inputReportReasonFake",params:[],type:"ReportReason"},{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:1007897979,predicate:"messageActionSetMessagesTTL",params:[{name:"flags",type:"#"},{name:"period",type:"int"},{name:"auto_setting_from",type:"flags.0?long"}],type:"MessageAction"},{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:-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: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:-1571952873,predicate:"messages.checkedHistoryImportPeer",params:[{name:"confirm_text",type:"string"}],type:"messages.CheckedHistoryImportPeer"},{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:-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:-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: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:-1281329567,predicate:"messageActionGroupCallScheduled",params:[{name:"call",type:"InputGroupCall"},{name:"schedule_date",type:"int"}],type:"MessageAction"},{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:192428418,predicate:"updateGroupCallConnection",params:[{name:"flags",type:"#"},{name:"presentation",type:"flags.0?true"},{name:"params",type:"DataJSON"}],type:"Update"},{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:1299263278,predicate:"updateBotCommands",params:[{name:"peer",type:"Peer"},{name:"bot_id",type:"long"},{name:"commands",type:"Vector"}],type:"Update"},{id:-1434950843,predicate:"messageActionSetChatTheme",params:[{name:"emoticon",type:"string"}],type:"MessageAction"},{id:-1336228175,predicate:"sendMessageChooseStickerAction",params:[],type:"SendMessageAction"},{id:981691896,predicate:"sponsoredMessage",params:[{name:"flags",type:"#"},{name:"recommended",type:"flags.5?true"},{name:"show_peer_photo",type:"flags.6?true"},{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:-907141753,predicate:"messages.sponsoredMessages",params:[{name:"flags",type:"#"},{name:"posts_between",type:"flags.0?int"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.SponsoredMessages"},{id:215889721,predicate:"inputStickerSetAnimatedEmojiAnimations",params:[],type:"InputStickerSet"},{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:-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:-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:-339958837,predicate:"messageActionChatJoinedByRequest",params:[],type:"MessageAction"},{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:-1347021750,predicate:"channelAdminLogEventActionParticipantJoinByRequest",params:[{name:"invite",type:"ExportedChatInvite"},{name:"approved_by",type:"long"}],type:"ChannelAdminLogEventAction"},{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:-191450938,predicate:"channels.sendAsPeers",params:[{name:"peers",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.SendAsPeers"},{id:-886388890,predicate:"channelAdminLogEventActionToggleNoForwards",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:-738646805,predicate:"messages.stickerSetNotModified",params:[],type:"messages.StickerSet"},{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:663693416,predicate:"channelAdminLogEventActionSendMessage",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:-702884114,predicate:"auth.codeTypeMissedCall",params:[],type:"auth.CodeType"},{id:-2113903484,predicate:"auth.sentCodeTypeMissedCall",params:[{name:"prefix",type:"string"},{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:-1012759713,predicate:"auth.loggedOut",params:[{name:"flags",type:"#"},{name:"future_auth_token",type:"flags.0?bytes"}],type:"auth.LoggedOut"},{id:1578843320,predicate:"updateMessageReactions",params:[{name:"flags",type:"#"},{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"top_msg_id",type:"flags.0?int"},{name:"reactions",type:"MessageReactions"}],type:"Update"},{id:-1546531968,predicate:"reactionCount",params:[{name:"flags",type:"#"},{name:"chosen_order",type:"flags.0?int"},{name:"reaction",type:"Reaction"},{name:"count",type:"int"}],type:"ReactionCount"},{id:1328256121,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_reactions",type:"flags.1?Vector"}],type:"MessageReactions"},{id:834488621,predicate:"messages.messageReactionsList",params:[{name:"flags",type:"#"},{name:"count",type:"int"},{name:"reactions",type:"Vector"},{name:"chats",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:"premium",type:"flags.2?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"},{id:852137487,predicate:"messageEntitySpoiler",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1102180616,predicate:"channelAdminLogEventActionChangeAvailableReactions",params:[{name:"prev_value",type:"ChatReactions"},{name:"new_value",type:"ChatReactions"}],type:"ChannelAdminLogEventAction"},{id:1741309751,predicate:"messages.translateNoResult",params:[],type:"messages.TranslatedText"},{id:-1575684144,predicate:"messages.translateResultText",params:[{name:"text",type:"string"}],type:"messages.TranslatedText"},{id:-1319698788,predicate:"messagePeerReaction",params:[{name:"flags",type:"#"},{name:"big",type:"flags.0?true"},{name:"unread",type:"flags.1?true"},{name:"peer_id",type:"Peer"},{name:"reaction",type:"Reaction"}],type:"MessagePeerReaction"},{id:-2132064081,predicate:"groupCallStreamChannel",params:[{name:"channel",type:"int"},{name:"scale",type:"int"},{name:"last_timestamp_ms",type:"long"}],type:"GroupCallStreamChannel"},{id:-790330702,predicate:"phone.groupCallStreamChannels",params:[{name:"channels",type:"Vector"}],type:"phone.GroupCallStreamChannels"},{id:177124030,predicate:"inputReportReasonIllegalDrugs",params:[],type:"ReportReason"},{id:-1631091139,predicate:"inputReportReasonPersonalDetails",params:[],type:"ReportReason"},{id:767505458,predicate:"phone.groupCallStreamRtmpUrl",params:[{name:"url",type:"string"},{name:"key",type:"string"}],type:"phone.GroupCallStreamRtmpUrl"},{id:1165423600,predicate:"attachMenuBotIconColor",params:[{name:"name",type:"string"},{name:"color",type:"int"}],type:"AttachMenuBotIconColor"},{id:-1297663893,predicate:"attachMenuBotIcon",params:[{name:"flags",type:"#"},{name:"name",type:"string"},{name:"icon",type:"Document"},{name:"colors",type:"flags.0?Vector"}],type:"AttachMenuBotIcon"},{id:-928371502,predicate:"attachMenuBot",params:[{name:"flags",type:"#"},{name:"inactive",type:"flags.0?true"},{name:"has_settings",type:"flags.1?true"},{name:"request_write_access",type:"flags.2?true"},{name:"bot_id",type:"long"},{name:"short_name",type:"string"},{name:"peer_types",type:"Vector"},{name:"icons",type:"Vector"}],type:"AttachMenuBot"},{id:-237467044,predicate:"attachMenuBotsNotModified",params:[],type:"AttachMenuBots"},{id:1011024320,predicate:"attachMenuBots",params:[{name:"hash",type:"long"},{name:"bots",type:"Vector"},{name:"users",type:"Vector"}],type:"AttachMenuBots"},{id:-1816172929,predicate:"attachMenuBotsBot",params:[{name:"bot",type:"AttachMenuBot"},{name:"users",type:"Vector"}],type:"AttachMenuBotsBot"},{id:397910539,predicate:"updateAttachMenuBots",params:[],type:"Update"},{id:202659196,predicate:"webViewResultUrl",params:[{name:"query_id",type:"long"},{name:"url",type:"string"}],type:"WebViewResult"},{id:-2010155333,predicate:"simpleWebViewResultUrl",params:[{name:"url",type:"string"}],type:"SimpleWebViewResult"},{id:211046684,predicate:"webViewMessageSent",params:[{name:"flags",type:"#"},{name:"msg_id",type:"flags.0?InputBotInlineMessageID"}],type:"WebViewMessageSent"},{id:361936797,predicate:"updateWebViewResultSent",params:[{name:"query_id",type:"long"}],type:"Update"},{id:326529584,predicate:"keyboardButtonWebView",params:[{name:"text",type:"string"},{name:"url",type:"string"}],type:"KeyboardButton"},{id:-1598009252,predicate:"keyboardButtonSimpleWebView",params:[{name:"text",type:"string"},{name:"url",type:"string"}],type:"KeyboardButton"},{id:1205698681,predicate:"messageActionWebViewDataSentMe",params:[{name:"text",type:"string"},{name:"data",type:"string"}],type:"MessageAction"},{id:-1262252875,predicate:"messageActionWebViewDataSent",params:[{name:"text",type:"string"}],type:"MessageAction"},{id:347625491,predicate:"updateBotMenuButton",params:[{name:"bot_id",type:"long"},{name:"button",type:"BotMenuButton"}],type:"Update"},{id:1966318984,predicate:"botMenuButtonDefault",params:[],type:"BotMenuButton"},{id:1113113093,predicate:"botMenuButtonCommands",params:[],type:"BotMenuButton"},{id:-944407322,predicate:"botMenuButton",params:[{name:"text",type:"string"},{name:"url",type:"string"}],type:"BotMenuButton"},{id:-67704655,predicate:"account.savedRingtonesNotModified",params:[],type:"account.SavedRingtones"},{id:-1041683259,predicate:"account.savedRingtones",params:[{name:"hash",type:"long"},{name:"ringtones",type:"Vector"}],type:"account.SavedRingtones"},{id:1960361625,predicate:"updateSavedRingtones",params:[],type:"Update"},{id:-1746354498,predicate:"notificationSoundDefault",params:[],type:"NotificationSound"},{id:1863070943,predicate:"notificationSoundNone",params:[],type:"NotificationSound"},{id:-2096391452,predicate:"notificationSoundLocal",params:[{name:"title",type:"string"},{name:"data",type:"string"}],type:"NotificationSound"},{id:-9666487,predicate:"notificationSoundRingtone",params:[{name:"id",type:"long"}],type:"NotificationSound"},{id:-1222230163,predicate:"account.savedRingtone",params:[],type:"account.SavedRingtone"},{id:523271863,predicate:"account.savedRingtoneConverted",params:[{name:"document",type:"Document"}],type:"account.SavedRingtone"},{id:2104224014,predicate:"attachMenuPeerTypeSameBotPM",params:[],type:"AttachMenuPeerType"},{id:-1020528102,predicate:"attachMenuPeerTypeBotPM",params:[],type:"AttachMenuPeerType"},{id:-247016673,predicate:"attachMenuPeerTypePM",params:[],type:"AttachMenuPeerType"},{id:84480319,predicate:"attachMenuPeerTypeChat",params:[],type:"AttachMenuPeerType"},{id:2080104188,predicate:"attachMenuPeerTypeBroadcast",params:[],type:"AttachMenuPeerType"},{id:-317687113,predicate:"chatInvitePublicJoinRequests",params:[],type:"ExportedChatInvite"},{id:-977967015,predicate:"inputInvoiceMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"InputInvoice"},{id:-1020867857,predicate:"inputInvoiceSlug",params:[{name:"slug",type:"string"}],type:"InputInvoice"},{id:-1362048039,predicate:"payments.exportedInvoice",params:[{name:"url",type:"string"}],type:"payments.ExportedInvoice"},{id:8703322,predicate:"updateTranscribedAudio",params:[{name:"flags",type:"#"},{name:"pending",type:"flags.0?true"},{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"transcription_id",type:"long"},{name:"text",type:"string"}],type:"Update"},{id:-1821037486,predicate:"messages.transcribedAudio",params:[{name:"flags",type:"#"},{name:"pending",type:"flags.0?true"},{name:"transcription_id",type:"long"},{name:"text",type:"string"}],type:"messages.TranscribedAudio"},{id:909284270,predicate:"dialogFilterDefault",params:[],type:"DialogFilter"},{id:1395946908,predicate:"help.premiumPromo",params:[{name:"status_text",type:"string"},{name:"status_entities",type:"Vector"},{name:"video_sections",type:"Vector"},{name:"videos",type:"Vector"},{name:"period_options",type:"Vector"},{name:"users",type:"Vector"}],type:"help.PremiumPromo"},{id:-925956616,predicate:"messageEntityCustomEmoji",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"document_id",type:"long"}],type:"MessageEntity"},{id:-48981863,predicate:"documentAttributeCustomEmoji",params:[{name:"flags",type:"#"},{name:"free",type:"flags.0?true"},{name:"text_color",type:"flags.1?true"},{name:"alt",type:"string"},{name:"stickerset",type:"InputStickerSet"}],type:"DocumentAttribute"},{id:1087454222,predicate:"stickerSetFullCovered",params:[{name:"set",type:"StickerSet"},{name:"packs",type:"Vector"},{name:"keywords",type:"Vector"},{name:"documents",type:"Vector"}],type:"StickerSetCovered"},{id:-1502273946,predicate:"inputStorePaymentPremiumSubscription",params:[{name:"flags",type:"#"},{name:"restore",type:"flags.0?true"}],type:"InputStorePaymentPurpose"},{id:1634697192,predicate:"inputStorePaymentGiftPremium",params:[{name:"user_id",type:"InputUser"},{name:"currency",type:"string"},{name:"amount",type:"long"}],type:"InputStorePaymentPurpose"},{id:-1415514682,predicate:"messageActionGiftPremium",params:[{name:"currency",type:"string"},{name:"amount",type:"long"},{name:"months",type:"int"}],type:"MessageAction"},{id:1958953753,predicate:"premiumGiftOption",params:[{name:"flags",type:"#"},{name:"months",type:"int"},{name:"currency",type:"string"},{name:"amount",type:"long"},{name:"bot_url",type:"string"},{name:"store_product",type:"flags.0?string"}],type:"PremiumGiftOption"},{id:-930399486,predicate:"inputStickerSetPremiumGifts",params:[],type:"InputStickerSet"},{id:-78886548,predicate:"updateReadFeaturedEmojiStickers",params:[],type:"Update"},{id:-1360618136,predicate:"inputPrivacyKeyVoiceMessages",params:[],type:"InputPrivacyKey"},{id:110621716,predicate:"privacyKeyVoiceMessages",params:[],type:"PrivacyKey"},{id:-1996951013,predicate:"paymentFormMethod",params:[{name:"url",type:"string"},{name:"title",type:"string"}],type:"PaymentFormMethod"},{id:-193992412,predicate:"inputWebFileAudioAlbumThumbLocation",params:[{name:"flags",type:"#"},{name:"small",type:"flags.2?true"},{name:"document",type:"flags.0?InputDocument"},{name:"title",type:"flags.1?string"},{name:"performer",type:"flags.1?string"}],type:"InputWebFileLocation"},{id:769727150,predicate:"emojiStatusEmpty",params:[],type:"EmojiStatus"},{id:-1835310691,predicate:"emojiStatus",params:[{name:"document_id",type:"long"}],type:"EmojiStatus"},{id:-97474361,predicate:"emojiStatusUntil",params:[{name:"document_id",type:"long"},{name:"until",type:"int"}],type:"EmojiStatus"},{id:674706841,predicate:"updateUserEmojiStatus",params:[{name:"user_id",type:"long"},{name:"emoji_status",type:"EmojiStatus"}],type:"Update"},{id:821314523,predicate:"updateRecentEmojiStatuses",params:[],type:"Update"},{id:-796072379,predicate:"account.emojiStatusesNotModified",params:[],type:"account.EmojiStatuses"},{id:-1866176559,predicate:"account.emojiStatuses",params:[{name:"hash",type:"long"},{name:"statuses",type:"Vector"}],type:"account.EmojiStatuses"},{id:2046153753,predicate:"reactionEmpty",params:[],type:"Reaction"},{id:455247544,predicate:"reactionEmoji",params:[{name:"emoticon",type:"string"}],type:"Reaction"},{id:-1992950669,predicate:"reactionCustomEmoji",params:[{name:"document_id",type:"long"}],type:"Reaction"},{id:-352570692,predicate:"chatReactionsNone",params:[],type:"ChatReactions"},{id:1385335754,predicate:"chatReactionsAll",params:[{name:"flags",type:"#"},{name:"allow_custom",type:"flags.0?true"}],type:"ChatReactions"},{id:1713193015,predicate:"chatReactionsSome",params:[{name:"reactions",type:"Vector"}],type:"ChatReactions"},{id:-1334846497,predicate:"messages.reactionsNotModified",params:[],type:"messages.Reactions"},{id:-352454890,predicate:"messages.reactions",params:[{name:"hash",type:"long"},{name:"reactions",type:"Vector"}],type:"messages.Reactions"},{id:1870160884,predicate:"updateRecentReactions",params:[],type:"Update"},{id:-2030252155,predicate:"updateMoveStickerSetToTop",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"emojis",type:"flags.1?true"},{name:"stickerset",type:"long"}],type:"Update"},{id:1511364673,predicate:"auth.sentCodeTypeEmailCode",params:[{name:"flags",type:"#"},{name:"apple_signin_allowed",type:"flags.0?true"},{name:"google_signin_allowed",type:"flags.1?true"},{name:"email_pattern",type:"string"},{name:"length",type:"int"},{name:"next_phone_login_date",type:"flags.2?int"}],type:"auth.SentCodeType"},{id:-1521934870,predicate:"auth.sentCodeTypeSetUpEmailRequired",params:[{name:"flags",type:"#"},{name:"apple_signin_allowed",type:"flags.0?true"},{name:"google_signin_allowed",type:"flags.1?true"}],type:"auth.SentCodeType"},{id:1128644211,predicate:"emailVerifyPurposeLoginSetup",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"}],type:"EmailVerifyPurpose"},{id:1383932651,predicate:"emailVerifyPurposeLoginChange",params:[],type:"EmailVerifyPurpose"},{id:-1141565819,predicate:"emailVerifyPurposePassport",params:[],type:"EmailVerifyPurpose"},{id:-1842457175,predicate:"emailVerificationCode",params:[{name:"code",type:"string"}],type:"EmailVerification"},{id:-611279166,predicate:"emailVerificationGoogle",params:[{name:"token",type:"string"}],type:"EmailVerification"},{id:-1764723459,predicate:"emailVerificationApple",params:[{name:"token",type:"string"}],type:"EmailVerification"},{id:731303195,predicate:"account.emailVerified",params:[{name:"email",type:"string"}],type:"account.EmailVerified"},{id:-507835039,predicate:"account.emailVerifiedLogin",params:[{name:"email",type:"string"},{name:"sent_code",type:"auth.SentCode"}],type:"account.EmailVerified"},{id:-1225711938,predicate:"premiumSubscriptionOption",params:[{name:"flags",type:"#"},{name:"current",type:"flags.1?true"},{name:"can_purchase_upgrade",type:"flags.2?true"},{name:"months",type:"int"},{name:"currency",type:"string"},{name:"amount",type:"long"},{name:"bot_url",type:"string"},{name:"store_product",type:"flags.0?string"}],type:"PremiumSubscriptionOption"},{id:80008398,predicate:"inputStickerSetEmojiGenericAnimations",params:[],type:"InputStickerSet"},{id:701560302,predicate:"inputStickerSetEmojiDefaultStatuses",params:[],type:"InputStickerSet"},{id:-1206095820,predicate:"sendAsPeer",params:[{name:"flags",type:"#"},{name:"premium_required",type:"flags.0?true"},{name:"peer",type:"Peer"}],type:"SendAsPeer"},{id:-1386050360,predicate:"messageExtendedMediaPreview",params:[{name:"flags",type:"#"},{name:"w",type:"flags.0?int"},{name:"h",type:"flags.0?int"},{name:"thumb",type:"flags.1?PhotoSize"},{name:"video_duration",type:"flags.2?int"}],type:"MessageExtendedMedia"},{id:-297296796,predicate:"messageExtendedMedia",params:[{name:"media",type:"MessageMedia"}],type:"MessageExtendedMedia"},{id:1517529484,predicate:"updateMessageExtendedMedia",params:[{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"extended_media",type:"MessageExtendedMedia"}],type:"Update"},{id:-50416996,predicate:"stickerKeyword",params:[{name:"document_id",type:"long"},{name:"keyword",type:"Vector"}],type:"StickerKeyword"},{id:-1274595769,predicate:"username",params:[{name:"flags",type:"#"},{name:"editable",type:"flags.0?true"},{name:"active",type:"flags.1?true"},{name:"username",type:"string"}],type:"Username"},{id:-263212119,predicate:"channelAdminLogEventActionChangeUsernames",params:[{name:"prev_value",type:"Vector"},{name:"new_value",type:"Vector"}],type:"ChannelAdminLogEventAction"},{id:46949251,predicate:"channelAdminLogEventActionToggleForum",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:1483767080,predicate:"channelAdminLogEventActionCreateTopic",params:[{name:"topic",type:"ForumTopic"}],type:"ChannelAdminLogEventAction"},{id:-261103096,predicate:"channelAdminLogEventActionEditTopic",params:[{name:"prev_topic",type:"ForumTopic"},{name:"new_topic",type:"ForumTopic"}],type:"ChannelAdminLogEventAction"},{id:-1374254839,predicate:"channelAdminLogEventActionDeleteTopic",params:[{name:"topic",type:"ForumTopic"}],type:"ChannelAdminLogEventAction"},{id:1569535291,predicate:"channelAdminLogEventActionPinTopic",params:[{name:"flags",type:"#"},{name:"prev_topic",type:"flags.0?ForumTopic"},{name:"new_topic",type:"flags.1?ForumTopic"}],type:"ChannelAdminLogEventAction"},{id:37687451,predicate:"forumTopicDeleted",params:[{name:"id",type:"int"}],type:"ForumTopic"},{id:1903173033,predicate:"forumTopic",params:[{name:"flags",type:"#"},{name:"my",type:"flags.1?true"},{name:"closed",type:"flags.2?true"},{name:"pinned",type:"flags.3?true"},{name:"short",type:"flags.5?true"},{name:"hidden",type:"flags.6?true"},{name:"id",type:"int"},{name:"date",type:"int"},{name:"title",type:"string"},{name:"icon_color",type:"int"},{name:"icon_emoji_id",type:"flags.0?long"},{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:"unread_reactions_count",type:"int"},{name:"from_id",type:"Peer"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"draft",type:"flags.4?DraftMessage"}],type:"ForumTopic"},{id:913709011,predicate:"messages.forumTopics",params:[{name:"flags",type:"#"},{name:"order_by_create_date",type:"flags.0?true"},{name:"count",type:"int"},{name:"topics",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"pts",type:"int"}],type:"messages.ForumTopics"},{id:228168278,predicate:"messageActionTopicCreate",params:[{name:"flags",type:"#"},{name:"title",type:"string"},{name:"icon_color",type:"int"},{name:"icon_emoji_id",type:"flags.0?long"}],type:"MessageAction"},{id:-1064024032,predicate:"messageActionTopicEdit",params:[{name:"flags",type:"#"},{name:"title",type:"flags.0?string"},{name:"icon_emoji_id",type:"flags.1?long"},{name:"closed",type:"flags.2?Bool"},{name:"hidden",type:"flags.3?Bool"}],type:"MessageAction"},{id:422509539,predicate:"updateChannelPinnedTopic",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"channel_id",type:"long"},{name:"topic_id",type:"int"}],type:"Update"},{id:1548122514,predicate:"inputNotifyForumTopic",params:[{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"int"}],type:"InputNotifyPeer"},{id:577659656,predicate:"notifyForumTopic",params:[{name:"peer",type:"Peer"},{name:"top_msg_id",type:"int"}],type:"NotifyPeer"},{id:1153562857,predicate:"inputStickerSetEmojiDefaultTopicIcons",params:[],type:"InputStickerSet"},{id:406407439,predicate:"messages.sponsoredMessagesEmpty",params:[],type:"messages.SponsoredMessages"},{id:-31881726,predicate:"updateChannelPinnedTopics",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"order",type:"flags.0?Vector"}],type:"Update"},{id:1135897376,predicate:"defaultHistoryTTL",params:[{name:"period",type:"int"}],type:"DefaultHistoryTTL"},{id:116234636,predicate:"auth.codeTypeFragmentSms",params:[],type:"auth.CodeType"},{id:-648651719,predicate:"auth.sentCodeTypeFragmentSms",params:[{name:"url",type:"string"},{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:1103040667,predicate:"exportedContactToken",params:[{name:"url",type:"string"},{name:"expires",type:"int"}],type:"ExportedContactToken"},{id:1693675004,predicate:"channelAdminLogEventActionToggleAntiSpam",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:1474192222,predicate:"messageActionSuggestProfilePhoto",params:[{name:"photo",type:"Photo"}],type:"MessageAction"},{id:-404267113,predicate:"messageActionAttachMenuBotAllowed",params:[],type:"MessageAction"},{id:2008112412,predicate:"stickerSetNoCovered",params:[{name:"set",type:"StickerSet"}],type:"StickerSetCovered"},{id:542282808,predicate:"updateUser",params:[{name:"user_id",type:"long"}],type:"Update"}],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:-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:-1923962543,method:"auth.signIn",params:[{name:"flags",type:"#"},{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"flags.0?string"},{name:"email_verification",type:"flags.1?EmailVerification"}],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:-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: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: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: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:482476935,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:"update_stickersets_order",type:"flags.15?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.9?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:1967638886,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:"update_stickersets_order",type:"flags.15?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.9?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:-966673468,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:"top_msg_id",type:"flags.9?int"},{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:3450904,method:"messages.createChat",params:[{name:"flags",type:"#"},{name:"users",type:"Vector"},{name:"title",type:"string"},{name:"ttl_period",type:"flags.0?int"}],type:"Updates"},{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:473782614,method:"photos.updateProfilePhoto",params:[{name:"flags",type:"#"},{name:"fallback",type:"flags.0?true"},{name:"id",type:"InputPhoto"}],type:"photos.Photo"},{id:-1980559511,method:"photos.uploadProfilePhoto",params:[{name:"flags",type:"#"},{name:"fallback",type:"flags.3?true"},{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:-1291540959,method:"upload.saveFilePart",params:[{name:"file_id",type:"long"},{name:"file_part",type:"int"},{name:"bytes",type:"bytes"}],type:"Bool"},{id:-1101843010,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:"long"},{name:"limit",type:"int"}],type:"upload.File"},{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:-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: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:-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:-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:-1663104819,method:"help.getSupport",params:[],type:"help.Support"},{id:916930423,method:"messages.readMessageContents",params:[{name:"id",type:"Vector"}],type:"messages.AffectedMessages"},{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:301470424,method:"contacts.search",params:[{name:"q",type:"string"},{name:"limit",type:"int"}],type:"contacts.Found"},{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:-1564422284,method:"account.deleteAccount",params:[{name:"flags",type:"#"},{name:"reason",type:"string"},{name:"password",type:"flags.0?InputCheckPasswordSRP"}],type:"Bool"},{id:150761757,method:"account.getAccountTTL",params:[],type:"AccountDaysTTL"},{id:608323678,method:"account.setAccountTTL",params:[{name:"ttl",type:"AccountDaysTTL"}],type:"Bool"},{id:-627372787,method:"invokeWithLayer",params:[{name:"layer",type:"int"},{name:"query",type:"!X"}],type:"X"},{id:-113456221,method:"contacts.resolveUsername",params:[{name:"username",type:"string"}],type:"contacts.ResolvedPeer"},{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:-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:954152242,method:"account.updateDeviceLocked",params:[{name:"period",type:"int"}],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:-1956073268,method:"messages.getWebPagePreview",params:[{name:"flags",type:"#"},{name:"message",type:"string"},{name:"entities",type:"flags.3?Vector"}],type:"MessageMedia"},{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:-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:-1080796745,method:"invokeWithoutUpdates",params:[{name:"query",type:"!X"}],type:"X"},{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:-1877938321,method:"help.getAppChangelog",params:[{name:"prev_app_version",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:-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:-1862244601,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"},{name:"ttl_period",type:"flags.4?int"}],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: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:-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:"emojis",type:"flags.1?true"},{name:"order",type:"Vector"}],type:"Bool"},{id:-1309538785,method:"messages.getDocumentByHash",params:[{name:"sha256",type:"bytes"},{name:"size",type:"long"},{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:-738468661,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:"top_msg_id",type:"flags.9?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:-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: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:-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:-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:-462373635,method:"messages.getPeerDialogs",params:[{name:"peers",type:"Vector"}],type:"messages.PeerDialogs"},{id:-1271718337,method:"messages.saveDraft",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.2?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:"emojis",type:"flags.1?true"},{name:"offset_id",type:"long"},{name:"limit",type:"int"}],type:"messages.ArchivedStickers"},{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:-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: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:-1907842680,method:"auth.dropTempAuthKeys",params:[{name:"except_auth_keys",type:"Vector"}],type:"Bool"},{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:-333262899,method:"help.setBotUpdatesStatus",params:[{name:"pending_updates_count",type:"int"},{name:"message",type:"string"}],type:"Bool"},{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:-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:619086221,method:"upload.getWebFile",params:[{name:"location",type:"InputWebFileLocation"},{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"upload.WebFile"},{id:924093883,method:"payments.getPaymentForm",params:[{name:"flags",type:"#"},{name:"invoice",type:"InputInvoice"},{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:-1228345045,method:"payments.validateRequestedInfo",params:[{name:"flags",type:"#"},{name:"save",type:"flags.0?true"},{name:"invoice",type:"InputInvoice"},{name:"info",type:"PaymentRequestedInfo"}],type:"payments.ValidatedRequestedInfo"},{id:755192367,method:"payments.sendPaymentForm",params:[{name:"flags",type:"#"},{name:"form_id",type:"long"},{name:"invoice",type:"InputInvoice"},{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:1151208273,method:"account.getTmpPassword",params:[{name:"password",type:"InputCheckPasswordSRP"},{name:"period",type:"int"}],type:"account.TmpPassword"},{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:-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:-1876841625,method:"stickers.createStickerSet",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"animated",type:"flags.1?true"},{name:"videos",type:"flags.4?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:1369162417,method:"messages.uploadMedia",params:[{name:"peer",type:"InputPeer"},{name:"media",type:"InputMedia"}],type:"MessageMedia"},{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:962554330,method:"upload.getCdnFile",params:[{name:"file_token",type:"bytes"},{name:"offset",type:"long"},{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:1375900482,method:"help.getCdnConfig",params:[],type:"CdnConfig"},{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:-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:-1847836879,method:"upload.getCdnFileHashes",params:[{name:"file_token",type:"bytes"},{name:"offset",type:"long"}],type:"Vector"},{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:-359881479,method:"channels.setStickers",params:[{name:"channel",type:"InputChannel"},{name:"stickerset",type:"InputStickerSet"}],type:"Bool"},{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:-357180360,method:"channels.readMessageContents",params:[{name:"channel",type:"InputChannel"},{name:"id",type:"Vector"}],type:"Bool"},{id:-2020263951,method:"contacts.resetSaved",params:[],type:"Bool"},{id:-251140208,method:"messages.getUnreadMentions",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?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"}],type:"messages.Messages"},{id:-1683319225,method:"channels.deleteHistory",params:[{name:"flags",type:"#"},{name:"for_everyone",type:"flags.0?true"},{name:"channel",type:"InputChannel"},{name:"max_id",type:"int"}],type:"Updates"},{id:1036054804,method:"help.getRecentMeUrls",params:[{name:"referer",type:"string"}],type:"help.RecentMeUrls"},{id:-356796084,method:"channels.togglePreHistoryHidden",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:921026381,method:"messages.readMentions",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"}],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:-1225713124,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:"update_stickersets_order",type:"flags.15?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.9?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: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: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:-1856595926,method:"upload.getFileHashes",params:[{name:"location",type:"InputFileLocation"},{name:"offset",type:"long"}],type:"Vector"},{id:749019089,method:"help.getTermsOfServiceUpdate",params:[],type:"help.TermsOfServiceUpdate"},{id:-294455398,method:"help.acceptTermsOfService",params:[{name:"id",type:"DataJSON"}],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:-1865902923,method:"users.setSecureValueErrors",params:[{name:"id",type:"InputUser"},{name:"errors",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:-1730136133,method:"account.sendVerifyEmailCode",params:[{name:"purpose",type:"EmailVerifyPurpose"},{name:"email",type:"string"}],type:"account.SentEmailCode"},{id:53322959,method:"account.verifyEmail",params:[{name:"purpose",type:"EmailVerifyPurpose"},{name:"verification",type:"EmailVerification"}],type:"account.EmailVerified"},{id:1072547679,method:"help.getDeepLinkInfo",params:[{name:"path",type:"string"}],type:"help.DeepLinkInfo"},{id:-2098076769,method:"contacts.getSaved",params:[],type:"Vector"},{id:-2092831552,method:"channels.getLeftChannels",params:[{name:"offset",type:"int"}],type:"messages.Chats"},{id:-1896617296,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?long"}],type:"account.Takeout"},{id:489050862,method:"account.finishTakeoutSession",params:[{name:"flags",type:"#"},{name:"success",type:"flags.0?true"}],type:"Bool"},{id:486505992,method:"messages.getSplitRanges",params:[],type:"Vector"},{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:-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:-2062238246,method:"contacts.toggleTopPeers",params:[{name:"enabled",type:"Bool"}],type:"Bool"},{id:2119757468,method:"messages.clearAllDrafts",params:[],type:"Bool"},{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:1784243458,method:"langpack.getLanguage",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"}],type:"LangPackLanguage"},{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:-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:-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:-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: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:-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: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: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:11435201,method:"messages.getSearchCounters",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"},{name:"filters",type:"Vector"}],type:"Vector"},{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: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:-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:-1892102881,method:"channels.editCreator",params:[{name:"channel",type:"InputChannel"},{name:"user_id",type:"InputUser"},{name:"password",type:"InputCheckPasswordSRP"}],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: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:-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: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:978872812,method:"account.getTheme",params:[{name:"format",type:"string"},{name:"theme",type:"InputTheme"}],type:"Theme"},{id:1913054296,method:"account.getThemes",params:[{name:"format",type:"string"},{name:"hash",type:"long"}],type:"account.Themes"},{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:-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:300429806,method:"channels.getInactiveChannels",params:[],type:"messages.InactiveChats"},{id:1705865692,method:"account.getMultiWallPapers",params:[{name:"wallpapers",type:"Vector"}],type:"Vector"},{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:779736953,method:"payments.getBankCardData",params:[{name:"number",type:"string"}],type:"payments.BankCardData"},{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:-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:-1707717072,method:"stickers.setStickerSetThumb",params:[{name:"stickerset",type:"InputStickerSet"},{name:"thumb",type:"InputDocument"}],type:"messages.StickerSet"},{id:85399130,method:"bots.setBotCommands",params:[{name:"scope",type:"BotCommandScope"},{name:"lang_code",type:"string"},{name:"commands",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:-1063816159,method:"help.getPromoData",params:[],type:"help.PromoData"},{id:505748629,method:"help.hidePromoData",params:[{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-8744061,method:"phone.sendSignalingData",params:[{name:"peer",type:"InputPhoneCall"},{name:"data",type:"bytes"}],type:"Bool"},{id:-589330937,method:"stats.getMegagroupStats",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"channel",type:"InputChannel"}],type:"stats.MegagroupStats"},{id:-349483786,method:"account.getGlobalPrivacySettings",params:[],type:"GlobalPrivacySettings"},{id:517647042,method:"account.setGlobalPrivacySettings",params:[{name:"settings",type:"GlobalPrivacySettings"}],type:"GlobalPrivacySettings"},{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: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: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: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"},{id:-299714136,method:"messages.unpinAllMessages",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"}],type:"messages.AffectedHistory"},{id:1221445336,method:"phone.createGroupCall",params:[{name:"flags",type:"#"},{name:"rtmp_stream",type:"flags.2?true"},{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: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:-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:187239529,method:"channels.convertToGigagroup",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:1573261059,method:"messages.checkHistoryImportPeer",params:[{name:"peer",type:"InputPeer"}],type:"messages.CheckedHistoryImportPeer"},{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: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: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:-1828139493,method:"account.resetPassword",params:[],type:"account.ResetPasswordResult"},{id:1284770294,method:"account.declinePasswordReset",params:[],type:"Bool"},{id:221691769,method:"auth.checkRecoveryPassword",params:[{name:"code",type:"string"}],type:"Bool"},{id:-700916087,method:"account.getChatThemes",params:[{name:"hash",type:"long"}],type:"account.Themes"},{id:-432283329,method:"messages.setChatTheme",params:[{name:"peer",type:"InputPeer"},{name:"emoticon",type:"string"}],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: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:231174382,method:"channels.getSendAs",params:[{name:"peer",type:"InputPeer"}],type:"channels.SendAsPeers"},{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:913655003,method:"channels.deleteParticipantHistory",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"}],type:"messages.AffectedHistory"},{id:-754091820,method:"messages.sendReaction",params:[{name:"flags",type:"#"},{name:"big",type:"flags.1?true"},{name:"add_to_recent",type:"flags.2?true"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"reaction",type:"flags.0?Vector"}],type:"Updates"},{id:-1950707482,method:"messages.getMessagesReactions",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:1176190792,method:"messages.getMessageReactionsList",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"reaction",type:"flags.0?Reaction"},{name:"offset",type:"flags.1?string"},{name:"limit",type:"int"}],type:"messages.MessageReactionsList"},{id:-21928079,method:"messages.setChatAvailableReactions",params:[{name:"peer",type:"InputPeer"},{name:"available_reactions",type:"ChatReactions"}],type:"Updates"},{id:417243308,method:"messages.getAvailableReactions",params:[{name:"hash",type:"int"}],type:"messages.AvailableReactions"},{id:1330094102,method:"messages.setDefaultReaction",params:[{name:"reaction",type:"Reaction"}],type:"Bool"},{id:617508334,method:"messages.translateText",params:[{name:"flags",type:"#"},{name:"peer",type:"flags.0?InputPeer"},{name:"msg_id",type:"flags.0?int"},{name:"text",type:"flags.1?string"},{name:"from_lang",type:"flags.2?string"},{name:"to_lang",type:"string"}],type:"messages.TranslatedText"},{id:841173339,method:"messages.getUnreadReactions",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?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"}],type:"messages.Messages"},{id:1420459918,method:"messages.readReactions",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"}],type:"messages.AffectedHistory"},{id:-1963375804,method:"contacts.resolvePhone",params:[{name:"phone",type:"string"}],type:"contacts.ResolvedPeer"},{id:447879488,method:"phone.getGroupCallStreamChannels",params:[{name:"call",type:"InputGroupCall"}],type:"phone.GroupCallStreamChannels"},{id:-558650433,method:"phone.getGroupCallStreamRtmpUrl",params:[{name:"peer",type:"InputPeer"},{name:"revoke",type:"Bool"}],type:"phone.GroupCallStreamRtmpUrl"},{id:276705696,method:"messages.searchSentMedia",params:[{name:"q",type:"string"},{name:"filter",type:"MessagesFilter"},{name:"limit",type:"int"}],type:"messages.Messages"},{id:385663691,method:"messages.getAttachMenuBots",params:[{name:"hash",type:"long"}],type:"AttachMenuBots"},{id:1998676370,method:"messages.getAttachMenuBot",params:[{name:"bot",type:"InputUser"}],type:"AttachMenuBotsBot"},{id:1777704297,method:"messages.toggleBotInAttachMenu",params:[{name:"flags",type:"#"},{name:"write_allowed",type:"flags.0?true"},{name:"bot",type:"InputUser"},{name:"enabled",type:"Bool"}],type:"Bool"},{id:395003915,method:"messages.requestWebView",params:[{name:"flags",type:"#"},{name:"from_bot_menu",type:"flags.4?true"},{name:"silent",type:"flags.5?true"},{name:"peer",type:"InputPeer"},{name:"bot",type:"InputUser"},{name:"url",type:"flags.1?string"},{name:"start_param",type:"flags.3?string"},{name:"theme_params",type:"flags.2?DataJSON"},{name:"platform",type:"string"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.9?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"WebViewResult"},{id:2146648841,method:"messages.prolongWebView",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"peer",type:"InputPeer"},{name:"bot",type:"InputUser"},{name:"query_id",type:"long"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.9?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Bool"},{id:698084494,method:"messages.requestSimpleWebView",params:[{name:"flags",type:"#"},{name:"bot",type:"InputUser"},{name:"url",type:"string"},{name:"theme_params",type:"flags.0?DataJSON"},{name:"platform",type:"string"}],type:"SimpleWebViewResult"},{id:172168437,method:"messages.sendWebViewResultMessage",params:[{name:"bot_query_id",type:"string"},{name:"result",type:"InputBotInlineResult"}],type:"WebViewMessageSent"},{id:-603831608,method:"messages.sendWebViewData",params:[{name:"bot",type:"InputUser"},{name:"random_id",type:"long"},{name:"button_text",type:"string"},{name:"data",type:"string"}],type:"Updates"},{id:1157944655,method:"bots.setBotMenuButton",params:[{name:"user_id",type:"InputUser"},{name:"button",type:"BotMenuButton"}],type:"Bool"},{id:-1671369944,method:"bots.getBotMenuButton",params:[{name:"user_id",type:"InputUser"}],type:"BotMenuButton"},{id:-510647672,method:"account.getSavedRingtones",params:[{name:"hash",type:"long"}],type:"account.SavedRingtones"},{id:1038768899,method:"account.saveRingtone",params:[{name:"id",type:"InputDocument"},{name:"unsave",type:"Bool"}],type:"account.SavedRingtone"},{id:-2095414366,method:"account.uploadRingtone",params:[{name:"file",type:"InputFile"},{name:"file_name",type:"string"},{name:"mime_type",type:"string"}],type:"Document"},{id:2021942497,method:"bots.setBotBroadcastDefaultAdminRights",params:[{name:"admin_rights",type:"ChatAdminRights"}],type:"Bool"},{id:-1839281686,method:"bots.setBotGroupDefaultAdminRights",params:[{name:"admin_rights",type:"ChatAdminRights"}],type:"Bool"},{id:1092913030,method:"phone.saveCallLog",params:[{name:"peer",type:"InputPhoneCall"},{name:"file",type:"InputFile"}],type:"Bool"},{id:-456419968,method:"channels.toggleJoinToSend",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:1277789622,method:"channels.toggleJoinRequest",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:261206117,method:"payments.exportInvoice",params:[{name:"invoice_media",type:"InputMedia"}],type:"payments.ExportedInvoice"},{id:647928393,method:"messages.transcribeAudio",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"messages.TranscribedAudio"},{id:2132608815,method:"messages.rateTranscribedAudio",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"transcription_id",type:"long"},{name:"good",type:"Bool"}],type:"Bool"},{id:-2131921795,method:"payments.assignAppStoreTransaction",params:[{name:"receipt",type:"bytes"},{name:"purpose",type:"InputStorePaymentPurpose"}],type:"Updates"},{id:-537046829,method:"payments.assignPlayMarketTransaction",params:[{name:"receipt",type:"DataJSON"},{name:"purpose",type:"InputStorePaymentPurpose"}],type:"Updates"},{id:-1614700874,method:"payments.canPurchasePremium",params:[{name:"purpose",type:"InputStorePaymentPurpose"}],type:"Bool"},{id:-1206152236,method:"help.getPremiumPromo",params:[],type:"help.PremiumPromo"},{id:-643100844,method:"messages.getCustomEmojiDocuments",params:[{name:"document_id",type:"Vector"}],type:"Vector"},{id:-67329649,method:"messages.getEmojiStickers",params:[{name:"hash",type:"long"}],type:"messages.AllStickers"},{id:248473398,method:"messages.getFeaturedEmojiStickers",params:[{name:"hash",type:"long"}],type:"messages.FeaturedStickers"},{id:-70001045,method:"account.updateEmojiStatus",params:[{name:"emoji_status",type:"EmojiStatus"}],type:"Bool"},{id:-696962170,method:"account.getDefaultEmojiStatuses",params:[{name:"hash",type:"long"}],type:"account.EmojiStatuses"},{id:257392901,method:"account.getRecentEmojiStatuses",params:[{name:"hash",type:"long"}],type:"account.EmojiStatuses"},{id:404757166,method:"account.clearRecentEmojiStatuses",params:[],type:"Bool"},{id:1063567478,method:"messages.reportReaction",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"reaction_peer",type:"InputPeer"}],type:"Bool"},{id:-1149164102,method:"messages.getTopReactions",params:[{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.Reactions"},{id:960896434,method:"messages.getRecentReactions",params:[{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.Reactions"},{id:-1644236876,method:"messages.clearRecentReactions",params:[],type:"Bool"},{id:-2064119788,method:"messages.getExtendedMedia",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:767062953,method:"auth.importWebTokenAuthorization",params:[{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"web_auth_token",type:"string"}],type:"auth.Authorization"},{id:-279966037,method:"account.reorderUsernames",params:[{name:"order",type:"Vector"}],type:"Bool"},{id:1490465654,method:"account.toggleUsername",params:[{name:"username",type:"string"},{name:"active",type:"Bool"}],type:"Bool"},{id:-1268978403,method:"channels.reorderUsernames",params:[{name:"channel",type:"InputChannel"},{name:"order",type:"Vector"}],type:"Bool"},{id:1358053637,method:"channels.toggleUsername",params:[{name:"channel",type:"InputChannel"},{name:"username",type:"string"},{name:"active",type:"Bool"}],type:"Bool"},{id:170155475,method:"channels.deactivateAllUsernames",params:[{name:"channel",type:"InputChannel"}],type:"Bool"},{id:-1540781271,method:"channels.toggleForum",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:-200539612,method:"channels.createForumTopic",params:[{name:"flags",type:"#"},{name:"channel",type:"InputChannel"},{name:"title",type:"string"},{name:"icon_color",type:"flags.0?int"},{name:"icon_emoji_id",type:"flags.3?long"},{name:"random_id",type:"long"},{name:"send_as",type:"flags.2?InputPeer"}],type:"Updates"},{id:233136337,method:"channels.getForumTopics",params:[{name:"flags",type:"#"},{name:"channel",type:"InputChannel"},{name:"q",type:"flags.0?string"},{name:"offset_date",type:"int"},{name:"offset_id",type:"int"},{name:"offset_topic",type:"int"},{name:"limit",type:"int"}],type:"messages.ForumTopics"},{id:-1333584199,method:"channels.getForumTopicsByID",params:[{name:"channel",type:"InputChannel"},{name:"topics",type:"Vector"}],type:"messages.ForumTopics"},{id:-186670715,method:"channels.editForumTopic",params:[{name:"flags",type:"#"},{name:"channel",type:"InputChannel"},{name:"topic_id",type:"int"},{name:"title",type:"flags.0?string"},{name:"icon_emoji_id",type:"flags.1?long"},{name:"closed",type:"flags.2?Bool"},{name:"hidden",type:"flags.3?Bool"}],type:"Updates"},{id:1814925350,method:"channels.updatePinnedForumTopic",params:[{name:"channel",type:"InputChannel"},{name:"topic_id",type:"int"},{name:"pinned",type:"Bool"}],type:"Updates"},{id:876830509,method:"channels.deleteTopicHistory",params:[{name:"channel",type:"InputChannel"},{name:"top_msg_id",type:"int"}],type:"messages.AffectedHistory"},{id:693150095,method:"channels.reorderPinnedForumTopics",params:[{name:"flags",type:"#"},{name:"force",type:"flags.0?true"},{name:"channel",type:"InputChannel"},{name:"order",type:"Vector"}],type:"Updates"},{id:1760814315,method:"channels.toggleAntiSpam",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:-1471109485,method:"channels.reportAntiSpamFalsePositive",params:[{name:"channel",type:"InputChannel"},{name:"msg_id",type:"int"}],type:"Bool"},{id:-1632299963,method:"messages.setDefaultHistoryTTL",params:[{name:"period",type:"int"}],type:"Bool"},{id:1703637384,method:"messages.getDefaultHistoryTTL",params:[],type:"DefaultHistoryTTL"},{id:-127582169,method:"contacts.exportContactToken",params:[],type:"ExportedContactToken"},{id:318789512,method:"contacts.importContactToken",params:[{name:"token",type:"string"}],type:"User"},{id:-1189444673,method:"photos.uploadContactProfilePhoto",params:[{name:"flags",type:"#"},{name:"suggest",type:"flags.3?true"},{name:"save",type:"flags.4?true"},{name:"user_id",type:"InputUser"},{name:"file",type:"flags.0?InputFile"},{name:"video",type:"flags.1?InputFile"},{name:"video_start_ts",type:"flags.2?double"}],type:"photos.Photo"},{id:1785624660,method:"channels.toggleParticipantsHidden",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"}]},layer:151};var ts=a(745),as=a.n(ts),ss=a(4736),ns=a.n(ss);function is(e){return e>>>0}function rs(e,t){return e=is(e),t=is(t),ns()(e).shiftLeft(32).add(ns()(t))}const os=ns()(Number.MAX_SAFE_INTEGER),ps=ns()(ns()[2]).pow(64),ds=ps.divide(ns()[2]);function fs(e,t=256){return ns().fromArray(e instanceof Uint8Array?[...e]:e,t)}const cs=+es.API.constructors.find((e=>"boolFalse"===e.predicate)).id,ls=+es.API.constructors.find((e=>"boolTrue"===e.predicate)).id,ms=+es.API.constructors.find((e=>"vector"===e.predicate)).id,gs=+es.MTProto.constructors.find((e=>"gzip_packed"===e.predicate)).id,hs="slice";class us{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(ls,(t||"")+":bool"):this.writeInt(cs,(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);const a=(s=ns()(e)).isNegative()?ps.add(s):s;var s;const{quotient:n,remainder:i}=a.divmod(4294967296),r=n.toJSNumber(),o=i.toJSNumber();this.writeInt(o,(t||"")+":long[low]"),this.writeInt(r,(t||"")+":long[high]")}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>>",T(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(">>>",T(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(">>>",T(e),t||""),this.checkLength(a),this.byteView.set(e,this.offset),this.offset+=a}storeMethod(e,t){const a=(this.mtproto?es.MTProto:es.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(const 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(ms,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(const t in p)this.intView[p[t]]=e[t];return r.type}}class ys{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),T(this.byteView.slice(this.offset-16,this.offset+16))),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]");let a=rs(this.readInt((e||"")+":long[high]"),t);var s;return this.mtproto||(a=(s=a).greater(ds)?s.minus(ps):s),!this.mtproto&&os.greaterOrEquals(a.abs())?a.toJSNumber():a.toString(10)}fetchBool(e){const t=this.readInt((e||"")+":bool");return t===ls||t!==cs&&(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[hs](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 r=this.readInt(t+"[id]");if(r===gs){const a=(i=this.fetchBytes(t+"[packed_string]"),as().inflate(i,void 0));return new ys(a).fetchObject(e,t)}if(r===ms)return this.fetchVector(e,t);let o=a.constructorsIndex;if(!o){a.constructorsIndex=o={};for(let e=0,t=a.constructors.length;e0&&r{var e;if(this.pingDelayDisconnectDeferred||!this.transport||!this.transport.connected)return;const t=this.pingDelayDisconnectDeferred=(0,v.Z)(),a=this.delays,s=this.delays.pingMaxTime,n=Math.min(null!==(e=this.lastPingTime)&&void 0!==e?e:0,s),i=Math.round(a.disconnectDelayMin+n/s*(a.disconnectDelayMax-a.disconnectDelayMin)),r=1e3*i,o=this.lastPingStartTime=Date.now(),p=this.lastPingDelayDisconnectId=(0,Te.a)(),d={notContentRelated:!0};this.wrapMtpCall("ping_delay_disconnect",{ping_id:p,disconnect_delay:i},d);const f=this.log.bindPrefix("sendPingDelayDisconnect");this.debug&&f.debug(`ping, timeout=${r}, lastPingTime=${this.lastPingTime}, msgId=${d.messageId}, pingId=${p}`);const c=E.Z.setTimeout(t.reject,r);t.then((e=>{clearTimeout(c);const t=Date.now()-o;if(this.lastPingTime=t/1e3,this.debug&&f.debug(`pong, reason='${e}', time=${n}, msgId=${d.messageId}`),t>r)throw void 0;return(0,P.Z)(Math.max(0,this.delays.pingInterval-t))})).catch((()=>{clearTimeout(c);const e=this.transport;this.pingDelayDisconnectDeferred===t&&(null==e?void 0:e.connection)&&(f.error("catch, closing connection",this.lastPingTime,d.messageId),e.connection.close())})).finally((()=>{this.pingDelayDisconnectDeferred===t&&(this.pingDelayDisconnectDeferred=void 0,this.sendPingDelayDisconnect())}))},this.checkLongPoll=()=>{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 us({mtproto:!0}),a=(0,Te.a)();t.storeMethod("ping",{ping_id:a});const s={msg_id:this.timeManager.generateId(),seq_no:this.generateSeqNo(!0),body:t.getBytes(!0)};this.offline&&this.setConnectionStatus(U.Q.Connecting),this.sendEncryptedRequest(s).then((()=>{this.toggleOffline(!1)}),(()=>{this.debug&&this.log("Delay",1e3*this.checkConnectionPeriod),this.checkConnectionTimeout=E.Z.setTimeout((()=>this.checkConnection("from failed checkConnection request")),1e3*this.checkConnectionPeriod|0),this.checkConnectionPeriod=Math.min(60,1.5*this.checkConnectionPeriod)}))},this.authKeyUint8=(0,bs.Z)(this.authKey),this.serverSalt=(0,bs.Z)(i),this.isFileUpload=!!r.fileUpload,this.isFileDownload=!!r.fileDownload,this.isFileNetworker=this.isFileUpload||this.isFileDownload,this.delays=this.isFileNetworker?Is.file:Is.client;const o=this.isFileUpload?"-U":this.isFileDownload?"-D":"";this.name="NET-"+a+o,this.log=(0,I.kg)(this.name+(o?"":"-C")+"-"+ws++,I.v9.Log|I.v9.Error|I.v9.Warn),this.log("constructor"),this.updateSession()}updateSession(){this.seqNo=0,this.prevSessionId=this.sessionId,this.sessionId=w(new Uint8Array(8))}updateSentMessage(e){const t=this.sentMessages[e];return!!t&&(t.container&&(0,ne.Z)(t.inner,((e,a)=>{const s=this.updateSentMessage(e);s?t.inner[a]=s.msg_id:t.inner.splice(a,1)})),t.msg_id=this.timeManager.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 us({mtproto:!0});s.storeMethod(e,t);const n=this.timeManager.generateId(),i=this.generateSeqNo(),r={msg_id:n,seq_no:i,body:s.getBytes(!0)};return b.Z.debug&&this.log("MT call",e,t,n,i),this.pushMessage(r,a)}wrapMtpMessage(e,t){const a=new us({mtproto:!0});a.storeObject(e,"Object");const s=this.timeManager.generateId(),n=this.generateSeqNo(t.notContentRelated),i={msg_id:s,seq_no:n,body:a.getBytes(!0)};return b.Z.debug&&this.log("MT message",e,s,n),this.pushMessage(i,t)}wrapApiCall(e,t={},a={}){const s=new us(a);if(!this.connectionInited){const e=es.API.methods.find((e=>"invokeWithLayer"===e.method));if(!e)throw new Error("no invokeWithLayer!");s.storeInt(+e.id,"invokeWithLayer"),s.storeInt(es.layer,"layer");const t=es.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(_.Z.id,"api_id"),s.storeString(i().USER_AGENT||"Unknown UserAgent","device_model"),s.storeString(navigator.platform||"Unknown Platform","system_version"),s.storeString(_.Z.version+(_.Z.isMainDomain?" "+_.Z.suffix:""),"app_version"),s.storeString(navigator.language||"en","system_lang_code"),s.storeString(_.Z.langPack,"lang_pack"),s.storeString(this.networkerFactory.language,"lang_code")}if(a.afterMessageId){if(void 0===Cs){const e=es.API.methods.find((e=>"invokeAfterMsg"===e.method));Cs=e?+e.id:0}Cs?(s.storeInt(Cs,"invokeAfterMsg"),s.storeLong(a.afterMessageId,"msg_id")):this.log.error("no invokeAfterMsg!")}a.resultType=s.storeMethod(e,t);const n={msg_id:this.timeManager.generateId(),seq_no:this.generateSeqNo(),body:s.getBytes(!0),isAPI:!0};return b.Z.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(),this.nextReqTimeout&&(clearTimeout(this.nextReqTimeout),this.nextReqTimeout=0,this.nextReq=0),this.connectionInited=!1,void 0!==this.longPollInterval&&(clearInterval(this.longPollInterval),this.longPollInterval=void 0),this.clearCheckConnectionTimeout()),this.log("change transport",e,t),this.clearPingDelayDisconnect(),this.transport=e,e&&(e.networker=this,e instanceof S&&(this.longPollInterval=E.Z.setInterval(this.checkLongPoll,1e4),this.checkLongPoll(),this.checkConnection("changed transport")),e.connection&&e.connected&&this.setConnectionStatus(U.Q.Connected),this.resend())}destroy(){this.log("destroy")}forceReconnectTimeout(){this.transport.reconnect?this.transport.reconnect():this.resend()}forceReconnect(){this.transport.forceReconnect?this.transport.forceReconnect():this.checkConnection("force reconnect")}clearPingDelayDisconnect(){const e=this.pingDelayDisconnectDeferred;this.pingDelayDisconnectDeferred=void 0,this.lastPingDelayDisconnectId=void 0,e&&e.reject()}sendLongPoll(){this.sendingLongPoll||(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(U.Q.Closed,this.checkConnectionRetryAt),this.checkConnectionTimeout=E.Z.setTimeout((()=>this.checkConnection("from toggleOfline")),e),this.checkConnectionPeriod=Math.min(30,1.5*(1+this.checkConnectionPeriod))}else this.setConnectionStatus(U.Q.Connected),this.checkLongPoll(),this.scheduleRequest();this.setConnectionStatus(e?U.Q.Closed:U.Q.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=>{const t=this.sentMessages;a.forEach((a=>{const s=t[a];if(s){const n=s.deferred;delete t[a],delete this.pendingMessages[a],e?n.resolve():n.reject()}}))}))}pushMessage(e,t){let a;return t.notContentRelated&&!t.noResponse||(a=(0,v.Z)()),this.sentMessages[e.msg_id]=Object.assign(e,t,a?{deferred:a}:void 0),this.pendingMessages[e.msg_id]=0,t.noSchedule||this.scheduleRequest(),(0,fe.Z)(t)&&(t.messageId=e.msg_id),a}attachPromise(e,t){const a=setTimeout((()=>{this.lastResponseTime&&Date.now()-this.lastResponseTime{clearTimeout(a),this.setConnectionStatus(U.Q.Connected),--this.activeRequests,this.setDrainTimeout()})),++this.activeRequests,void 0!==this.onDrainTimeout&&(clearTimeout(this.onDrainTimeout),this.onDrainTimeout=void 0)}setDrainTimeout(){!this.activeRequests&&this.onDrain&&void 0===this.onDrainTimeout&&(this.onDrainTimeout=E.Z.setTimeout((()=>{this.onDrainTimeout=void 0,this.log("drain"),this.onDrain()}),1e4))}setConnectionStatus(e,t){var a;const s=e===U.Q.Connected,n=this.status!==e;this.isOnline=s,this.status=e,n&&(this.networkerFactory.onConnectionStatusChange&&this.networkerFactory.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(),(null===(a=this.transport)||void 0===a?void 0:a.connection)&&(this.clearPingDelayDisconnect(),this.sendPingDelayDisconnect()))}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 Ms(this,void 0,void 0,(function*(){const a=t?0:8,n=(0,_s.Z)(this.authKeyUint8.subarray(88+a,88+a+32),e),i=yield s.Z.invokeCrypto("sha256",n);return new Uint8Array(i).subarray(8,24)}))}getAesKeyIv(e,t){const a=t?0:8,n=new Uint8Array(52),i=new Uint8Array(52),r=[];return n.set(e,0),n.set(this.authKeyUint8.subarray(a,a+36),16),r.push(s.Z.invokeCrypto("sha256",n)),i.set(this.authKeyUint8.subarray(40+a,40+a+36),0),i.set(e,36),r.push(s.Z.invokeCrypto("sha256",i)),Promise.all(r).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 this.networkerFactory.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})}const e=this.pendingResendReq.length;if(e){const t=Object.assign({},Ss),a=this.pendingResendReq.splice(0,e);this.wrapMtpMessage({_:"msg_resend_req",msg_ids:a},t),this.log("resend: resending requests",t.messageId,a)}let t;const a=[];let s=0,n=!1,i=!1,r=!1;const o=Object.keys(this.pendingMessages).map((e=>ns()(e))).sort(((e,t)=>e.compare(t))).map((e=>e.toString(10)));for(const e of o){const o=this.sentMessages[e];if(o&&o.body){const e=o.body.length+32;if(s+e>655360&&(this.log.warn("lengthOverflow",o,a),r=!0,t))break;a.push(o),s+=e,o.isAPI?n=!0:o.longPoll&&(i=!0),t=o}delete this.pendingMessages[e]}if(this.transport instanceof S&&n&&!i){const e=new us({mtproto:!0});e.storeMethod("http_wait",{max_delay:500,wait_after:150,max_wait:3e3}),a.push({msg_id:this.timeManager.generateId(),seq_no:this.generateSeqNo(),body:e.getBytes(!0)})}if(!a.length)return;const p=a.filter((e=>e.noResponse)).map((e=>e.msg_id));if(a.length>1){const e=this.generateContainerMessage(s,a);t=e.messageWithBody,this.sentMessages[t.msg_id]=e.message}else this.sentMessages[t.msg_id]=t;this.pendingAcks=[];const d=this.sendEncryptedRequest(t);this.transport instanceof S&&this.handleSentEncryptedRequestHTTP(d,t,p),this.transport instanceof S||this.cleanupSent(),r&&this.scheduleRequest()}generateContainerMessage(e,t){const a=new us({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:this.timeManager.generateId(),seq_no:this.generateSeqNo(!0),container:!0,inner:s};return b.Z.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 Ms(this,void 0,void 0,(function*(){const t=yield this.getMsgKey(e,!0),a=yield this.getAesKeyIv(t,!0);return{bytes:yield s.Z.invokeCrypto("aes-encrypt",e,a[0],a[1]),msgKey:t}}))}getDecryptedMessage(e,t){return this.getAesKeyIv(e,!1).then((e=>s.Z.invokeCrypto("aes-decrypt",t,e[0],e[1])))}getEncryptedOutput(e){const t=new us({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+(0,Te.d)(8)%5),n=w(new Uint8Array(s)),i=(0,_s.Z)(a,n);return this.getEncryptedMessage(i).then((e=>{const t=new us({startMaxLength:e.bytes.length+256});return t.storeIntBytes(this.authKeyId,64,"auth_key_id"),t.storeIntBytes(e.msgKey,128,"msg_key"),t.storeRawBytes(e.bytes,"encrypted_data"),t.getBytes(!0)}))}sendEncryptedRequest(e){return Ms(this,void 0,void 0,(function*(){const t=yield this.getEncryptedOutput(e);this.transport||this.log.error("trying to send something when offline",this.transport,this),this.debug&&this.log.debug("sending:",e,[e.msg_id].concat(e.inner||[]),t.length);const a=this.transport?this.transport.send(t):Promise.reject({});if(!(this.transport instanceof S))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 ys(e),a=t.fetchIntBytes(64,!0,"auth_key_id");if(!(0,Ps.Z)(a,this.authKeyId))throw new Error("[MT] Invalid server auth_key_id: "+T(a));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(!(0,Ps.Z)(s,t))throw this.log.warn("[MT] msg_keys",s,t),this.updateSession(),new Error("[MT] server msgKey mismatch, updating session");let a=new ys(e,{mtproto:!0});a.fetchIntBytes(64,!0,"salt");const n=a.fetchIntBytes(64,!0,"session_id"),i=a.fetchLong("message_id");if(!((0,Ps.Z)(n,this.sessionId)||this.prevSessionId&&(0,Ps.Z)(n,this.prevSessionId)))throw this.log.warn("Sessions",n,this.sessionId,this.prevSessionId,e),new Error("[MT] Invalid server session_id: "+T(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 f=a.fetchRawBytes(p,!0,"message_data");d=a.getOffset();const c=o-d;if(c<12||c>1024)throw new Error("[MT] Invalid padding length: "+c);return a=new ys(f,{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]"))}}}),{response:a.fetchObject("","INPUT"),messageId:i,sessionId:n,seqNo:r}}))))}applyServerSalt(e){const t=(a=e,vs((s=ns()(a),new Uint8Array(s.toArray(256).value)).reverse(),8,!0,!1,!1));var a,s;qa.Z.set({["dc"+this.dcId+"_server_salt"]:T(t)}),this.serverSalt=new Uint8Array(t)}scheduleRequest(e){this.transport instanceof S&&(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 S&&this.offline||this.performScheduledRequest()};this.nextReq=t,void 0!==e?this.nextReqTimeout=E.Z.setTimeout(a,e):a()}ackMessage(e){let t;this.pendingAcks.push(e),this.transport instanceof S&&(t=3e4),this.scheduleRequest(t)}reqResend(e){this.debug&&this.log.debug("Req resend",e),this.pendingResendReq.push(e),this.scheduleRequest(100)}cleanupSent(){let e=!1;const t=this.sentMessages;return Object.keys(t).forEach((a=>{const s=t[a];if(s.notContentRelated&&void 0===this.pendingMessages[a])delete t[a];else if(s.container){for(const a of s.inner)if(void 0!==t[a])return void(e=!0);delete t[a]}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(){const e=this.sentMessages;for(const t in e){const a=e[t];(a.body||a.container)&&this.pushResend(t)}this.transport.connection&&(this.clearPingDelayDisconnect(),this.sendPingDelayDisconnect())}applyServerTime(e){const t=ns()(e).shiftRight(32).toJSNumber();return this.log("applying server time",t),this.timeManager.applyServerTime(t)}processMessage(e,t,a){if("messageEmpty"!==e._)if(parseInt(t.substr(0,-10),10)%2)this.log.warn("Server even message id: ",t,e);else switch(this.debug&&this.log.debug("process message",e,t),this.pingDelayDisconnectDeferred&&this.pingDelayDisconnectDeferred.resolve("any message"),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=this.applyServerTime(t);(17===e.error_code||a)&&(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),qa.Z.get("dc").then((t=>{t===this.dcId&&!this.isFileNetworker&&this.networkerFactory.updatesProcessor&&this.networkerFactory.updatesProcessor(e)}));break;case"msgs_ack":this.debug&&this.log("got acks",e.msg_ids);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(-1!==this.pendingAcks.indexOf(e.answer_msg_id))break;this.reqResend(e.answer_msg_id);break;case"msgs_state_info":{this.ackMessage(e.answer_msg_id);const t=[[this.lastResendReq,this.pendingResendReq]];for(const[a,s]of t)if((null==a?void 0:a.reqMsgId)===e.req_msg_id&&s.length)for(const e of a.msgIds){const t=s.indexOf(e);-1!==t&&s.splice(t,1)}break}case"rpc_result":{this.ackMessage(t);const a=e.req_msg_id,s=this.sentMessages[a];if(this.debug&&this.log("Rpc response",e.result,s),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.ping_id;if(this.lastPingDelayDisconnectId===t){const e=this.pingDelayDisconnectDeferred;e?e.resolve("pong"):this.log("ping deferred deleted",t)}break}default:this.ackMessage(t),null!==this.networkerFactory.updatesProcessor&&this.networkerFactory.updatesProcessor(e)}else this.log.warn("processMessage: messageEmpty",e,t)}}class As extends G{constructor(){super(...arguments),this.networkers=[],this.language=navigator.language||_.Z.langPackCode,this.updatesProcessor=null,this.akStopped=!1}onConnectionStatusChange(e){this.rootScope.dispatchEvent("connection_status_change",e)}removeNetworker(e){(0,M.Z)(this.networkers,e)}setUpdatesProcessor(e){this.updatesProcessor=e}getNetworker(e,t,a,s,n){const i=new ks(this,this.timeManager,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)}unsetConnectionInited(){for(const e of this.networkers)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}}}const Ds=new class{constructor(){this.testPublicKeysHex=[{modulus:"c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5",exponent:"010001"}],this.publisKeysHex=[{modulus:"e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3",exponent:"010001"}],this.publicKeysParsed={},this.prepared=!1,this.preparePromise=null,b.Z.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 us;t.storeBytes((0,Ha.Z)(e.modulus),"n"),t.storeBytes((0,Ha.Z)(e.exponent),"e");const a=t.getBuffer();return s.Z.invokeCrypto("sha1",a).then((t=>{const a=t.slice(-8);a.reverse(),this.publicKeysParsed[T(a).toLowerCase()]={modulus:e.modulus,exponent:e.exponent}}))}))).then((()=>{this.prepared=!0,this.preparePromise=null}))}select(e){return t=this,a=void 0,n=function*(){yield this.prepare();for(let t=0;t{if(d.ZP&&this.log("mtpSendPlainRequest: in good sector",e),!e||!e.byteLength)throw o;try{const t=new ys(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){throw this.log.error("mtpSendPlainRequest: deserialization went bad",e),Object.assign(o,{originalError:e})}}),(e=>{throw e.message||e.type||(e=Object.assign(o,{originalError:e})),e}))}sendReqPQ(e){return Ts(this,void 0,void 0,(function*(){const t=new us({mtproto:!0});let a;t.storeMethod("req_pq_multi",{nonce:e.nonce}),d.ZP&&this.log("Send req_pq",T(e.nonce));try{const s=this.sendPlainRequest(e.dcId,t.getBytes(!0));Ds.prepare(),a=yield s}catch(e){throw this.log.error("req_pq error",e.message),e}const n=a.fetchObject("ResPQ");if("resPQ"!==n._)throw new Error("[MT] resPQ response invalid: "+n._);if(!(0,Ps.Z)(e.nonce,n.nonce))throw this.log.error(e.nonce,n.nonce),new Error("[MT] resPQ nonce mismatch");e.serverNonce=n.server_nonce,e.pq=n.pq,e.fingerprints=n.server_public_key_fingerprints,d.ZP&&this.log("Got ResPQ",T(e.serverNonce),T(e.pq),e.fingerprints);const i=yield Ds.select(e.fingerprints);if(!i)throw new Error("[MT] No public key found");e.publicKey=i,d.ZP&&this.log("PQ factorization start",e.pq);try{var r=yield s.Z.invokeCrypto("factorize",e.pq)}catch(e){throw this.log.error("worker error factorize",e),e}return e.p=r[0],e.q=r[1],d.ZP&&this.log("PQ factorization done",r),this.sendReqDhParams(e)}))}sendReqDhParams(e){return Ts(this,void 0,void 0,(function*(){e.newNonce=w(new Uint8Array(32));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 us({mtproto:!0});a.storeObject(t,"P_Q_inner_data","DECRYPTED_DATA");const n=a.getBytes(!0);if(n.length>144)throw"DH_params: data is more than 144 bytes!";const i=vs(n,192,!1,!0,!1),r=i.slice().reverse(),o=yield(()=>Ts(this,void 0,void 0,(function*(){for(;;){const t=w(new Uint8Array(32)),a=r.concat(yield s.Z.invokeCrypto("sha256",t.concat(i)));if(224!==a.length)throw"DH_params: dataWithHash !== 224 bytes!";const n=yield s.Z.invokeCrypto("aes-encrypt",a,t,new Uint8Array([0])),o=Us(t,yield s.Z.invokeCrypto("sha256",n)).concat(n),p=fs(o),d=ns()(e.publicKey.modulus,16);if(-1===p.compare(d))return o}})))(),p=vs(yield s.Z.invokeCrypto("rsa-encrypt",o,e.publicKey),256,!0,!0,!0),f={nonce:e.nonce,server_nonce:e.serverNonce,p:e.p,q:e.q,public_key_fingerprint:e.publicKey.fingerprint,encrypted_data:p},c=new us({mtproto:!0});c.storeMethod("req_DH_params",f);const l=c.getBytes(!0);let m;d.ZP&&this.log("Send req_DH_params",f);try{m=yield this.sendPlainRequest(e.dcId,l)}catch(e){throw this.log.error("Send req_DH_params FAIL!",e),e}const g=m.fetchObject("Server_DH_Params","RESPONSE");if(d.ZP&&this.log("Sent req_DH_params, response:",g),"server_DH_params_fail"!==g._&&"server_DH_params_ok"!==g._)throw new Error("[MT] Server_DH_Params response invalid: "+g._);if(!(0,Ps.Z)(e.nonce,g.nonce))throw new Error("[MT] Server_DH_Params nonce mismatch");if(!(0,Ps.Z)(e.serverNonce,g.server_nonce))throw new Error("[MT] Server_DH_Params server_nonce mismatch");if("server_DH_params_fail"===g._){const t=(yield s.Z.invokeCrypto("sha1",e.newNonce)).slice(-16);if(!(0,Ps.Z)(t,g.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,g.encrypted_answer)}catch(e){throw this.log.error("mtpDecryptServerDhDataAnswer FAILED!",e),e}return this.sendSetClientDhParams(e)}))}decryptServerDhDataAnswer(e,t){return Ts(this,void 0,void 0,(function*(){e.localTime=Date.now(),e.tmpAesKey=(yield s.Z.invokeCrypto("sha1",e.newNonce.concat(e.serverNonce))).concat((yield s.Z.invokeCrypto("sha1",e.serverNonce.concat(e.newNonce))).slice(0,12)),e.tmpAesIv=(yield s.Z.invokeCrypto("sha1",e.serverNonce.concat(e.newNonce))).slice(12).concat(yield s.Z.invokeCrypto("sha1",e.newNonce.concat(e.newNonce)),e.newNonce.slice(0,4));const a=new Uint8Array(yield s.Z.invokeCrypto("aes-decrypt",t,e.tmpAesKey,e.tmpAesIv)),n=a.slice(0,20),i=a.slice(20),r=new ys(i,{mtproto:!0}),o=r.fetchObject("Server_DH_inner_data");if("server_DH_inner_data"!==o._)throw new Error("[MT] server_DH_inner_data response invalid: "+o);if(!(0,Ps.Z)(e.nonce,o.nonce))throw new Error("[MT] server_DH_inner_data nonce mismatch");if(!(0,Ps.Z)(e.serverNonce,o.server_nonce))throw new Error("[MT] server_DH_inner_data serverNonce mismatch");d.ZP&&this.log("Done decrypting answer"),e.g=o.g,e.dhPrime=o.dh_prime,e.gA=o.g_a,e.serverTime=o.server_time,e.retry=0,this.verifyDhParams(e.g,e.dhPrime,e.gA);const p=r.getOffset();if(!(0,Ps.Z)(n,yield s.Z.invokeCrypto("sha1",i.slice(0,p))))throw new Error("[MT] server_DH_inner_data SHA1 mismatch");this.timeManager.applyServerTime(e.serverTime,e.localTime)}))}verifyDhParams(e,t,a){d.ZP&&this.log("Verifying DH params",e,t,a);const s=T(t);if(3!==e||"c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b"!==s)throw new Error("[MT] DH params are not verified: unknown dhPrime");d.ZP&&this.log("dhPrime cmp OK");const n=fs(a),i=ns()(s,16);if(n.compare(ns().one)<=0)throw new Error("[MT] DH params are not verified: gA <= 1");if(n.compare(i.subtract(ns().one))>=0)throw new Error("[MT] DH params are not verified: gA >= dhPrime - 1");d.ZP&&this.log("1 < gA < dhPrime-1 OK");const r=ns()(2).pow(1984);if(n.compare(r)<0)throw new Error("[MT] DH params are not verified: gA < 2^{2048-64}");if(n.compare(i.subtract(r))>=0)throw new Error("[MT] DH params are not verified: gA > dhPrime - 2^{2048-64}");return d.ZP&&this.log("2^{2048-64} < gA < dhPrime-2^{2048-64} OK"),!0}sendSetClientDhParams(e){return Ts(this,void 0,void 0,(function*(){const t=(0,Ha.Z)(e.g.toString(16));e.b=w(new Uint8Array(256));try{var a=yield s.Z.invokeCrypto("mod-pow",t,e.b,e.dhPrime)}catch(e){throw e}const n=new us({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 i=(yield s.Z.invokeCrypto("sha1",n.getBuffer())).concat(n.getBytes(!0)),r=yield s.Z.invokeCrypto("aes-encrypt",i,e.tmpAesKey,e.tmpAesIv),o=new us({mtproto:!0});let p;o.storeMethod("set_client_DH_params",{nonce:e.nonce,server_nonce:e.serverNonce,encrypted_data:r}),d.ZP&&this.log("Send set_client_DH_params");try{p=yield this.sendPlainRequest(e.dcId,o.getBytes(!0))}catch(e){throw e}const f=p.fetchObject("Set_client_DH_params_answer");if("dh_gen_ok"!==f._&&"dh_gen_retry"!==f._&&"dh_gen_fail"!==f._)throw new Error("[MT] Set_client_DH_params_answer response invalid: "+f._);if(!(0,Ps.Z)(e.nonce,f.nonce))throw new Error("[MT] Set_client_DH_params_answer nonce mismatch");if(!(0,Ps.Z)(e.serverNonce,f.server_nonce))throw new Error("[MT] Set_client_DH_params_answer server_nonce mismatch");try{var c=yield s.Z.invokeCrypto("mod-pow",e.gA,e.b,e.dhPrime)}catch(e){throw c}const l=yield s.Z.invokeCrypto("sha1",c),m=l.slice(0,8),g=l.slice(-8);switch(d.ZP&&this.log("Got Set_client_DH_params_answer",f._,c),f._){case"dh_gen_ok":{const t=(yield s.Z.invokeCrypto("sha1",e.newNonce.concat([1],m))).slice(-16);if(!(0,Ps.Z)(t,f.new_nonce_hash1))throw this.log.error("Set_client_DH_params_answer new_nonce_hash1 mismatch",t,f),new Error("new_nonce_hash1 mismatch");const a=Us(e.newNonce.slice(0,8),e.serverNonce.slice(0,8));return d.ZP&&this.log("Auth successfull!",g,c,a),e.authKeyId=g,e.authKey=c,e.serverSalt=a,e}case"dh_gen_retry":{const t=(yield s.Z.invokeCrypto("sha1",e.newNonce.concat([2],m))).slice(-16);if(!(0,Ps.Z)(t,f.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 s.Z.invokeCrypto("sha1",e.newNonce.concat([3],m))).slice(-16);if(!(0,Ps.Z)(t,f.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=Z.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)=>Ts(this,void 0,void 0,(function*(){let s;yield this.getTransportType();let n=1;for(;n++<=3;)try{const a={dcId:e,nonce:w(new Uint8Array(16))},s=this.sendReqPQ(a);return void t(yield s)}catch(e){s=e}a(s)})))),this.cached[e]=t)}}class Fs extends G{after(){this.lastMessageId=[0,0],this.timeOffset=0,qa.Z.get("server_time_offset").then((e=>{e&&(this.timeOffset=e)}))}getServerTimeOffset(){return this.timeOffset}generateId(){const e=Date.now();let t=[Math.floor(e/1e3)+this.timeOffset,e%1e3<<21|(0,Te.d)(16)<<3|4];return(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,rs(t[0],t[1]).toString(10)}applyServerTime(e,t){const a=e-(t=(t||Date.now())/1e3|0),s=Math.abs(this.timeOffset-a)>10;return this.lastMessageId=[0,0],this.timeOffset!==a&&(qa.Z.set({server_time_offset:a}),this.timeOffset=a),s}}class Rs{saveWebDocument(e){if(!e)return;const t=e.attributes.find((e=>"documentAttributeImageSize"===e._));return t&&(e.w=t.w,e.h=t.h),e}}class xs extends G{getInputInvoiceBySlug(e){return{_:"inputInvoiceSlug",slug:e}}getInputInvoiceByPeerId(e,t){return{_:"inputInvoiceMessage",peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(t)}}getPaymentForm(e){return this.apiManager.invokeApi("payments.getPaymentForm",{invoice:e}).then((e=>(this.appUsersManager.saveApiUsers(e.users),e)))}getPaymentReceipt(e,t){return this.apiManager.invokeApi("payments.getPaymentReceipt",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(t)}).then((e=>(this.appUsersManager.saveApiUsers(e.users),e)))}validateRequestedInfo(e,t,a){return this.apiManager.invokeApi("payments.validateRequestedInfo",{save:a,invoice:e,info:t})}sendPaymentForm(e,t,a,s,n,i){return this.apiManager.invokeApi("payments.sendPaymentForm",{form_id:t,invoice:e,requested_info_id:a,shipping_option_id:s,credentials:n,tip_amount:i||void 0}).then((e=>("payments.paymentResult"===e._&&this.apiUpdatesManager.processUpdateMessage(e.updates),e)))}clearSavedInfo(e,t){return this.apiManager.invokeApi("payments.clearSavedInfo",{info:e,credentials:t})}}var Bs=a(8794);class Vs extends G{constructor(){super(...arguments),this.clear=(e=!1)=>{e?this.attachMenuBots=new Map:(this.attachMenuBots.clear(),this.attachMenuBotsArr=void 0)},this.onUpdateAttachMenuBots=e=>{this.clear(),this.getAttachMenuBots()}}after(){this.clear(!0),this.apiUpdatesManager.addMultipleEventsListeners({updateAttachMenuBots:this.onUpdateAttachMenuBots})}saveAttachMenuBot(e){this.attachMenuBots.set(e.bot_id,e);const t=(0,Bs.Z)(e);return t.icon=this.appDocsManager.saveDoc(t.icon,{type:"attachMenuBotIcon",botId:e.bot_id}),e}saveAttachMenuBots(e){e.saved||(e.saved=!0,e.forEach((e=>this.saveAttachMenuBot(e))))}getAttachMenuBots(){var e;return null!==(e=this.attachMenuBotsArr)&&void 0!==e?e:this.apiManager.invokeApiSingleProcess({method:"messages.getAttachMenuBots",processResult:e=>((0,ue.Z)(e),this.appUsersManager.saveApiUsers(e.users),this.saveAttachMenuBots(e.bots),this.attachMenuBotsArr=e.bots.slice(0,0))})}getAttachMenuBotCached(e){return this.attachMenuBots.get(e)}getAttachMenuBot(e,t){throw this.appUsersManager.isAttachMenuBot(e),(0,X.Z)("BOT_INVALID")}requestWebView(e){const{botId:t,peerId:a,url:s,fromBotMenu:n,themeParams:i,replyToMsgId:r,silent:o,sendAsPeerId:p,startParam:d,threadId:f}=e;return this.apiManager.invokeApiSingleProcess({method:"messages.requestWebView",params:{peer:this.appPeersManager.getInputPeerById(a),bot:this.appUsersManager.getUserInput(t),silent:o,platform:"web",url:s,reply_to_msg_id:r?(0,oe.Z)(r):void 0,from_bot_menu:n,theme_params:i,send_as:p?this.appPeersManager.getInputPeerById(p):void 0,start_param:d,top_msg_id:f?(0,oe.Z)(f):void 0},processResult:e=>(console.log(e),e)})}prolongWebView(e){return this.apiManager.invokeApiSingleProcess({method:"messages.prolongWebView",params:{peer:this.appPeersManager.getInputPeerById(e.peerId),bot:this.appUsersManager.getUserInput(e.botId),query_id:e.queryId,silent:e.silent,reply_to_msg_id:e.replyToMsgId?(0,oe.Z)(e.replyToMsgId):void 0,send_as:e.sendAsPeerId?this.appPeersManager.getInputPeerById(e.sendAsPeerId):void 0,top_msg_id:e.threadId?(0,oe.Z)(e.threadId):void 0},processResult:e=>{console.log(e)}})}}class Os extends G{requestUrlAuth(e,t,a,s){return this.apiManager.invokeApi("messages.requestUrlAuth",{button_id:s,msg_id:a?(0,oe.Z)(a):void 0,peer:t?this.appPeersManager.getInputPeerById(t):void 0,url:e}).then((e=>("urlAuthResultRequest"===e._&&this.appUsersManager.saveApiUser(e.bot),e)))}acceptUrlAuth(e,t,a,s,n){return this.apiManager.invokeApi("messages.acceptUrlAuth",{button_id:s,msg_id:a?(0,oe.Z)(a):void 0,peer:t?this.appPeersManager.getInputPeerById(t):void 0,url:e,write_allowed:n}).then((e=>e))}getWebAuthorizations(){return this.apiManager.invokeApi("account.getWebAuthorizations").then((e=>(this.appUsersManager.saveApiUsers(e.users),e.authorizations)))}resetWebAuthorization(e){return this.apiManager.invokeApi("account.resetWebAuthorization",{hash:e})}resetWebAuthorizations(){return this.apiManager.invokeApi("account.resetWebAuthorizations")}}class Ls extends G{after(){this.wallPapers={}}saveWallPaper(e){return e?("wallPaperNoFile"!==e._&&(e.document=this.appDocsManager.saveDoc(e.document,{type:"wallPaper",wallPaperId:e.id})),this.wallPapers[e.id]=e,e):e}getWallPaper(e){return this.apiManager.invokeApiSingleProcess({method:"account.getWallPaper",params:{wallpaper:e},processResult:e=>this.saveWallPaper(e)})}getInputWallPaper(e){return"string"==typeof e?{_:"inputWallPaperSlug",slug:e}:"wallPaperNoFile"===e._?{_:"inputWallPaperNoFile",id:e.id}:{_:"inputWallPaper",id:e.id,access_hash:e.access_hash}}getWallPaperById(e){const t=this.wallPapers[e];return this.getWallPaper(this.getInputWallPaper(t))}getThemes(){return this.apiManager.invokeApiSingleProcess({method:"account.getThemes",params:{format:"macos",hash:0},processResult:e=>((0,ue.Z)(e),e.themes.forEach((e=>{e.settings&&e.settings.forEach((e=>{e.wallpaper=this.saveWallPaper(e.wallpaper)}))})),e.themes)})}getWallPapers(){return this.apiManager.invokeApiHashable({method:"account.getWallPapers"}).then((e=>{const t=e.wallpapers;return t.forEach(((e,t,a)=>{a[t]=this.saveWallPaper(e)})),t}))}}const Ns=new class{constructor(){this.cryptoWorkersURLs=[],this.cryptoPortsAttached=0,this.cryptoPortPromise=(0,v.Z)(),this.cryptoPortPromise.then((()=>{this.cryptoPortPromise=void 0}))}start(){const e=f.Z.getInstance();e.addEventListener("manager",(({name:e,method:t,args:a})=>(0,q.Z)(this.getManagers(),(s=>{const n=s[e];return n[t].apply(n,a)})))),e.addEventListener("cryptoPort",((e,t,a)=>{var n;const i=a.ports[0];this.cryptoPortsAttached>=this.cryptoWorkersURLs.length?i.close():(++this.cryptoPortsAttached,s.Z.attachPort(i),null===(n=this.cryptoPortPromise)||void 0===n||n.resolve())})),e.addEventListener("createProxyWorkerURLs",(({originalUrl:e,blob:t})=>{let a=this.cryptoWorkersURLs.length;a||(this.cryptoWorkersURLs.push(e),++a);const s=_.Z.cryptoWorkers;if(a===s)return this.cryptoWorkersURLs;const n=new Array(s-a).fill(void 0).map((()=>URL.createObjectURL(t)));return this.cryptoWorkersURLs.push(...n),this.cryptoWorkersURLs}))}createManagers(){return e=this,t=void 0,n=function*(){const e=new $;yield Promise.all([e.loadStorages(),this.cryptoPortPromise]);const t=yield function(e,t){const a={appPeersManager:new fa,appChatsManager:new Be,appDocsManager:new ut,appPhotosManager:new ca,appPollsManager:new la,appUsersManager:new Aa,appWebPagesManager:new Ua,appDraftsManager:new _t,appProfileManager:new ua,appNotificationsManager:new na,apiUpdatesManager:new De,appAvatarsManager:new Ue,appGroupCallsManager:new St,appCallsManager:new Fe,appReactionsManager:new ba,appMessagesManager:new ta,appMessagesIdsManager:new Tt,appPrivacyManager:new ma,appInlineBotsManager:new Dt,appStickersManager:new Ca,referenceDatabase:new ee,appEmojiManager:new Mt,filtersStorage:new Ce,dialogsStorage:new _e,apiManager:new Ja,cryptoWorker:s.Z,passwordManager:new Q,apiFileManager:new ja,peersStorage:new Qa,thumbsStorage:new Xa,networkerFactory:new As,rootScope:new l,authorizer:new Es,dcConfigurator:new O,timeManager:new Fs,appStoragesManager:e,appStateManager:y,appWebDocsManager:new Rs,appPaymentsManager:new xs,appAttachMenuBotsManager:new Vs,appSeamlessLoginManager:new Os,appThemesManager:new Ls};for(const e in a){const t=a[e];t&&(t.setManagers&&(t.setManagers(a),delete t.setManagers),E.Z[e]=t)}const n=[];let i=Object.keys(a);i.unshift("appUsersManager","appChatsManager","appNotificationsManager","appMessagesManager","dialogsStorage"),i=(0,we.Z)(i);for(const e of i){const t=a[e];if(null==t?void 0:t.after){const e=t.after();n.push(e)}}return t&&a.apiManager.setUserAuth(t),Promise.all(n).then((()=>a))}(e,y.userId);return this.managers=t},new((a=void 0)||(a=Promise))((function(s,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((n=n.apply(e,t||[])).next())}));var e,t,a,n}getManagers(){var e;return null!==(e=this.managers)&&void 0!==e?e:this.managers=this.createManagers()}};d.GO&&(d.GO.appManagersManager=Ns);const Zs=Ns;var js=a(3655);let qs,Gs,Hs=!0;function Ws(){return Hs}function zs(){return Hs?qs:void 0}const Ks=(0,I.kg)("MTPROTO"),Js=new f.Z;Js.addMultipleEventsListeners({environment:e=>{r(e),Z.waitForWebSocket()},crypto:({method:e,args:t})=>s.Z.invokeCrypto(e,...t),state:({state:e,resetStorages:t,pushedKeys:a,newVersion:s,oldVersion:n,userId:i})=>{Ks("got state",e,a),y.userId=i,y.newVersion=s,y.oldVersion=n,Object.keys(e).forEach((t=>{y.pushToState(t,e[t],!0,!a.includes(t))})),j.resolve(t)},toggleStorages:({enabled:e,clearWrite:t})=>(0,za.Z)(e,t),event:(e,t)=>{Ks("will redirect event",e,t),Js.invokeExceptSource("event",e,t)},serviceWorkerOnline:e=>{Hs=e},serviceWorkerPort:(e,t,a)=>{qs?(qs.detachPort(Gs),Gs=void 0):(qs=new js.Z,qs.addMultipleEventsListeners({requestFilePart:e=>(0,q.Z)(Zs.getManagers(),(t=>{const{docId:a,dcId:s,offset:n,limit:i}=e;return t.appDocsManager.requestDocPart(a,s,n,i)}))})),(Gs=a.ports[0])&&qs.attachPort(Gs)},createObjectURL:e=>URL.createObjectURL(e)}),Ks("MTProto start"),Zs.start(),Zs.getManagers(),Gt.start(),function(e,t,a){const s=(a,s)=>{e.attachListenPort(a),s&&e.attachSendPort(s),null==t||t(a)};e.setOnPortDisconnect((e=>{Gt.deleteTab(e)})),"undefined"!=typeof SharedWorkerGlobalScope?E.Z.addEventListener("connect",(e=>s(e.source,e.source))):"undefined"!=typeof ServiceWorkerGlobalScope?s(E.Z,null):s(E.Z,E.Z)}(Js,(e=>{Gt.addTab(e)}))},1507:(e,t,a)=>{a.d(t,{BP:()=>f,BX:()=>l,DZ:()=>h,Gu:()=>u,IA:()=>i,Iw:()=>p,J$:()=>m,NM:()=>s,Ox:()=>c,Pt:()=>d,Zi:()=>g,hj:()=>n,rU:()=>o,yF:()=>r});const s=0,n=1271266957,i=777,r=777e3,o=2147483647,p=20971520,d="",f="default_static",c=4295032831,l=new Set(["web","k","z"]),m=0,g=1,h=new Set([m,g]),u=Math.max(...Array.from(h))+1},2423:(e,t,a)=>{a.d(t,{$2:()=>l,E:()=>m,QB:()=>g,SC:()=>h,bu:()=>d,it:()=>p,kO:()=>y,tY:()=>u});var s=a(1229);const n="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",i="0-9_"+n,r="["+n+"0-9]",o="((?:https?|ftp)://|mailto:)?",p=o+"(?:"+r+"{1,64}(?::"+r+"{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}|"+r+"["+n+"ยท0-9-]{0,64}(?:\\."+r+"["+n+"ยท0-9-]{0,64}){0,10}(?:\\.(xn--[0-9a-z]{2,16}|["+n+"]{2,24})))(?::\\d{2,5})?(?:/(?:\\S{0,255}[^\\s.;,(\\[\\]{}<>\"'])?)?",d=(new RegExp("^"+o.slice(0,-1),"i"),/^((?:[^\/]+?):\/\/|mailto:)/),f="[a-zA-Z\\d_]{5,32}",c="\\/([a-zA-Z\\d_]{1,32})(?:@("+f+"))?(\\b|$)",l=new RegExp("(^| )(@)("+f+")|("+p+")|(\\n)|("+s.Z+")|(^|[\\s\\(\\]])(#["+i+"]{2,64})|(^|\\s)"+c,"i"),m=/^(([^<>()[\]\\.,;:\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,}))$/,g=/(^|\s|\n)(````?)([\s\S]+?)(````?)([\s\n\.,:?!;]|$)|(^|\s|\x01)(`|~~|\*\*|__|_-_|\|\|)([^\n]+?)\7([\x01\s\.,:?!;]|$)|@(\d+)\s*\((.+?)\)|(\[(.+?)\]\((.+?)\))/m,h={"`":"messageEntityCode","``":"messageEntityPre","**":"messageEntityBold",__:"messageEntityItalic","~~":"messageEntityStrike","_-_":"messageEntityUnderline","||":"messageEntitySpoiler"},u=new Set(["messageEntityEmoji","messageEntityLinebreak","messageEntityCaret"]);for(const e in h)u.add(h[e]);const y=/^\+\d+$/},671:(e,t,a)=>{function s(e){return function(e){const t=[];let a=0,s=0,n=0;for(;n55296&&a<=56319?s=a:t.push(a.toString(16));return t.length&&2===t[0].length&&(t[0]="00"+t[0]),t}(r(e)).join("-")}a.d(t,{N0:()=>s});const n=/\uFE0F/g,i=String.fromCharCode(8205),r=e=>e.indexOf(i)<0?e.replace(n,""):e;new Map([["FT","๐Ÿดโ€โ˜ "]])}},s={};function n(e){var t=s[e];if(void 0!==t)return t.exports;var i=s[e]={id:e,loaded:!1,exports:{}};return a[e].call(i.exports,i,i.exports,n),i.loaded=!0,i.exports}n.m=a,n.x=()=>{var e=n.O(void 0,[699,211,147,85,110],(()=>n(9092)));return n.O(e)},e=[],n.O=(t,a,s,i)=>{if(!a){var r=1/0;for(f=0;f=i)&&Object.keys(n.O).every((e=>n.O[e](a[p])))?a.splice(p--,1):(o=!1,i0&&e[f-1][2]>i;f--)e[f]=e[f-1];e[f]=[a,s,i]},n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var a in t)n.o(t,a)&&!n.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},n.f={},n.e=e=>Promise.all(Object.keys(n.f).reduce(((t,a)=>(n.f[a](e,t),t)),[])),n.u=e=>85===e?"85.887945ef5f43bc205112.bundle.js":110===e?"110.22ad5bfa72c27ec78066.bundle.js":({211:"npm.big-integer",699:"npm.pako"}[e]||e)+"."+{8:"93d2f33af815eb0455aa",104:"476c2f411510266c35de",147:"4eb614e56f1d9fbfd1e7",211:"363d763daad0ee4e2741",301:"95838a8203f23dd1ce8f",642:"be93122d1116ecdc9322",699:"89deb457201f16c93925"}[e]+".chunk.js",n.miniCssF=e=>{},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),(()=>{var e;n.g.importScripts&&(e=n.g.location+"");var t=n.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var a=t.getElementsByTagName("script");a.length&&(e=a[a.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),n.p=e})(),(()=>{if(void 0!==n){var e=n.u,t=n.e,a={},s={};n.u=function(t){return e(t)+(a.hasOwnProperty(t)?"?"+a[t]:"")},n.e=function(i){return t(i).catch((function(t){var r=s.hasOwnProperty(i)?s[i]:999999;if(r<1){var o=e(i);throw t.message="Loading chunk "+i+" failed after 999999 retries.\n("+o+")",t.request=o,t}return new Promise((function(e){setTimeout((function(){var t=Date.now();a[i]=t,s[i]=r-1,e(n.e(i))}),3e3)}))}))}}})(),(()=>{var e={678:1};n.f.i=(t,a)=>{e[t]||importScripts(n.p+n.u(t))};var t=this.webpackChunktweb=this.webpackChunktweb||[],a=t.push.bind(t);t.push=t=>{var[s,i,r]=t;for(var o in i)n.o(i,o)&&(n.m[o]=i[o]);for(r&&r(n);s.length;)e[s.pop()]=1;a(t)}})(),t=n.x,n.x=()=>Promise.all([699,211,147,85,110].map(n.e,n)).then(t),n.x()})(); -//# sourceMappingURL=mtproto.worker.e3a23c58261a5160e0d7.chunk.js.map \ No newline at end of file +(()=>{"use strict";var e,t,a={410:(e,t,a)=>{a.d(t,{GO:()=>n,ZP:()=>i});const s=a(1267).Z.debug,n="undefined"!=typeof window?window:self,i=s},3447:(e,t,a)=>{a.d(t,{Z:()=>i});const s={14:{"1f6dd":4867,"1f6de":4916,"1f6df":4923,"1f7f0":62832,"1f979":183,"1f9cc":1557,"1fa7b":61332,"1fa7c":61330,"1faa9":51093,"1faaa":61364,"1faab":61189,"1faac":51085,"1fab7":2651,"1fab8":2631,"1fab9":2672,"1faba":2673,"1fac3":1520,"1fac4":1521,"1fac5":1505,"1fad7":3793,"1fad8":3707,"1fad9":3804,"1fae0":111,"1fae1":136,"1fae2":132,"1fae3":133,"1fae4":174,"1fae5":142,"1fae6":1385,"1fae7":61353,"1faf0":1341,"1faf1":1332,"1faf2":1333,"1faf3":1334,"1faf4":1335,"1faf5":1351,"1faf6":1360,"1faf1-1f3fb-200d-1faf2-1f3fc":0,"1faf1-1f3fb-200d-1faf2-1f3fd":0,"1faf1-1f3fb-200d-1faf2-1f3fe":0,"1faf1-1f3fb-200d-1faf2-1f3ff":0,"1faf1-1f3fc-200d-1faf2-1f3fb":0,"1faf1-1f3fc-200d-1faf2-1f3fd":0,"1faf1-1f3fc-200d-1faf2-1f3fe":0,"1faf1-1f3fc-200d-1faf2-1f3ff":0,"1faf1-1f3fd-200d-1faf2-1f3fb":0,"1faf1-1f3fd-200d-1faf2-1f3fc":0,"1faf1-1f3fd-200d-1faf2-1f3fe":0,"1faf1-1f3fd-200d-1faf2-1f3ff":0,"1faf1-1f3fe-200d-1faf2-1f3fb":0,"1faf1-1f3fe-200d-1faf2-1f3fc":0,"1faf1-1f3fe-200d-1faf2-1f3fd":0,"1faf1-1f3fe-200d-1faf2-1f3ff":0,"1faf1-1f3ff-200d-1faf2-1f3fb":0,"1faf1-1f3ff-200d-1faf2-1f3fc":0,"1faf1-1f3ff-200d-1faf2-1f3fd":0,"1faf1-1f3ff-200d-1faf2-1f3fe":0,"1fac3-1f3fb":0,"1fac3-1f3fc":0,"1fac3-1f3fd":0,"1fac3-1f3fe":0,"1fac3-1f3ff":0,"1fac4-1f3fb":0,"1fac4-1f3fc":0,"1fac4-1f3fd":0,"1fac4-1f3fe":0,"1fac4-1f3ff":0,"1fac5-1f3fb":0,"1fac5-1f3fc":0,"1fac5-1f3fd":0,"1fac5-1f3fe":0,"1fac5-1f3ff":0,"1faf0-1f3fb":0,"1faf0-1f3fc":0,"1faf0-1f3fd":0,"1faf0-1f3fe":0,"1faf0-1f3ff":0,"1faf1-1f3fb":0,"1faf1-1f3fc":0,"1faf1-1f3fd":0,"1faf1-1f3fe":0,"1faf1-1f3ff":0,"1faf2-1f3fb":0,"1faf2-1f3fc":0,"1faf2-1f3fd":0,"1faf2-1f3fe":0,"1faf2-1f3ff":0,"1faf3-1f3fb":0,"1faf3-1f3fc":0,"1faf3-1f3fd":0,"1faf3-1f3fe":0,"1faf3-1f3ff":0,"1faf4-1f3fb":0,"1faf4-1f3fc":0,"1faf4-1f3fd":0,"1faf4-1f3fe":0,"1faf4-1f3ff":0,"1faf5-1f3fb":0,"1faf5-1f3fc":0,"1faf5-1f3fd":0,"1faf5-1f3fe":0,"1faf5-1f3ff":0,"1faf6-1f3fb":0,"1faf6-1f3fc":0,"1faf6-1f3fd":0,"1faf6-1f3fe":0,"1faf6-1f3ff":0},"":{2049:62835,2122:62863,2139:62888,2194:62764,2195:62763,2196:62762,2197:62756,2198:62758,2199:62760,2328:61194,2600:4990,2601:4998,2602:41013,2603:41018,2604:41020,2611:62851,2614:41014,2615:3781,2618:2667,2620:1106,2622:62753,2623:62754,2626:62783,2638:62780,2639:177,2648:62788,2649:62789,2650:62796,2651:62797,2652:62798,2653:62799,2660:51095,2663:51098,2665:51096,2666:51097,2668:4865,2692:61297,2693:4922,2694:61300,2696:61311,2697:61319,2699:61309,2702:61284,2705:62850,2708:4931,2709:61245,2712:61259,2714:62852,2716:62828,2721:62779,2728:51029,2733:62858,2734:62859,2744:41017,2747:62860,2753:62836,2754:62837,2755:62838,2757:62839,2763:1137,2764:1141,2795:62829,2796:62830,2797:62831,2934:62767,2935:62768,3030:62840,3297:62912,3299:62913,"0023-20e3":62864,"002a-20e3":62865,"0030-20e3":62866,"0031-20e3":62867,"0032-20e3":62868,"0033-20e3":62869,"0034-20e3":62870,"0035-20e3":62871,"0036-20e3":62872,"0037-20e3":62873,"0038-20e3":62874,"0039-20e3":62875,"00a9":62861,"00ae":62862,"1f004":51101,"1f0cf":51100,"1f170":62882,"1f171":62884,"1f17e":62893,"1f17f":62895,"1f18e":62883,"1f191":62885,"1f192":62886,"1f193":62887,"1f194":62889,"1f195":62891,"1f196":62892,"1f197":62894,"1f198":62896,"1f199":62897,"1f19a":62898,"1f1e6-1f1e8":71594,"1f1e6-1f1e9":71595,"1f1e6-1f1ea":71596,"1f1e6-1f1eb":71597,"1f1e6-1f1ec":71598,"1f1e6-1f1ee":71599,"1f1e6-1f1f1":71600,"1f1e6-1f1f2":71601,"1f1e6-1f1f4":71602,"1f1e6-1f1f6":71603,"1f1e6-1f1f7":71604,"1f1e6-1f1f8":71605,"1f1e6-1f1f9":71606,"1f1e6-1f1fa":71607,"1f1e6-1f1fc":71608,"1f1e6-1f1fd":71609,"1f1e6-1f1ff":71610,"1f1e7-1f1e6":71611,"1f1e7-1f1e7":71612,"1f1e7-1f1e9":71613,"1f1e7-1f1ea":71614,"1f1e7-1f1eb":71615,"1f1e7-1f1ec":71616,"1f1e7-1f1ed":71617,"1f1e7-1f1ee":71618,"1f1e7-1f1ef":71619,"1f1e7-1f1f1":71620,"1f1e7-1f1f2":71621,"1f1e7-1f1f3":71622,"1f1e7-1f1f4":71623,"1f1e7-1f1f6":71624,"1f1e7-1f1f7":71625,"1f1e7-1f1f8":71626,"1f1e7-1f1f9":71627,"1f1e7-1f1fb":71628,"1f1e7-1f1fc":71629,"1f1e7-1f1fe":71630,"1f1e7-1f1ff":71631,"1f1e8-1f1e6":71632,"1f1e8-1f1e8":71633,"1f1e8-1f1e9":71634,"1f1e8-1f1eb":71635,"1f1e8-1f1ec":71636,"1f1e8-1f1ed":71637,"1f1e8-1f1ee":71638,"1f1e8-1f1f0":71639,"1f1e8-1f1f1":71640,"1f1e8-1f1f2":71641,"1f1e8-1f1f3":71642,"1f1e8-1f1f4":71643,"1f1e8-1f1f5":71644,"1f1e8-1f1f7":71645,"1f1e8-1f1fa":71646,"1f1e8-1f1fb":71647,"1f1e8-1f1fc":71648,"1f1e8-1f1fd":71649,"1f1e8-1f1fe":71650,"1f1e8-1f1ff":71651,"1f1e9-1f1ea":71652,"1f1e9-1f1ec":71653,"1f1e9-1f1ef":71654,"1f1e9-1f1f0":71655,"1f1e9-1f1f2":71656,"1f1e9-1f1f4":71657,"1f1e9-1f1ff":71658,"1f1ea-1f1e6":71659,"1f1ea-1f1e8":71660,"1f1ea-1f1ea":71661,"1f1ea-1f1ec":71662,"1f1ea-1f1ed":71663,"1f1ea-1f1f7":71664,"1f1ea-1f1f8":71665,"1f1ea-1f1f9":71666,"1f1ea-1f1fa":71667,"1f1eb-1f1ee":71668,"1f1eb-1f1ef":71669,"1f1eb-1f1f0":71670,"1f1eb-1f1f2":71671,"1f1eb-1f1f4":71672,"1f1eb-1f1f7":71673,"1f1ec-1f1e6":71674,"1f1ec-1f1e7":71675,"1f1ec-1f1e9":71676,"1f1ec-1f1ea":71677,"1f1ec-1f1eb":71678,"1f1ec-1f1ec":71679,"1f1ec-1f1ed":71680,"1f1ec-1f1ee":71681,"1f1ec-1f1f1":71682,"1f1ec-1f1f2":71683,"1f1ec-1f1f3":71684,"1f1ec-1f1f5":71685,"1f1ec-1f1f6":71686,"1f1ec-1f1f7":71687,"1f1ec-1f1f8":71688,"1f1ec-1f1f9":71689,"1f1ec-1f1fa":71690,"1f1ec-1f1fc":71691,"1f1ec-1f1fe":71692,"1f1ed-1f1f0":71693,"1f1ed-1f1f2":71694,"1f1ed-1f1f3":71695,"1f1ed-1f1f7":71696,"1f1ed-1f1f9":71697,"1f1ed-1f1fa":71698,"1f1ee-1f1e8":71699,"1f1ee-1f1e9":71700,"1f1ee-1f1ea":71701,"1f1ee-1f1f1":71702,"1f1ee-1f1f2":71703,"1f1ee-1f1f3":71704,"1f1ee-1f1f4":71705,"1f1ee-1f1f6":71706,"1f1ee-1f1f7":71707,"1f1ee-1f1f8":71708,"1f1ee-1f1f9":71709,"1f1ef-1f1ea":71710,"1f1ef-1f1f2":71711,"1f1ef-1f1f4":71712,"1f1ef-1f1f5":71713,"1f1f0-1f1ea":71714,"1f1f0-1f1ec":71715,"1f1f0-1f1ed":71716,"1f1f0-1f1ee":71717,"1f1f0-1f1f2":71718,"1f1f0-1f1f3":71719,"1f1f0-1f1f5":71720,"1f1f0-1f1f7":71721,"1f1f0-1f1fc":71722,"1f1f0-1f1fe":71723,"1f1f0-1f1ff":71724,"1f1f1-1f1e6":71725,"1f1f1-1f1e7":71726,"1f1f1-1f1e8":71727,"1f1f1-1f1ee":71728,"1f1f1-1f1f0":71729,"1f1f1-1f1f7":71730,"1f1f1-1f1f8":71731,"1f1f1-1f1f9":71732,"1f1f1-1f1fa":71733,"1f1f1-1f1fb":71734,"1f1f1-1f1fe":71735,"1f1f2-1f1e6":71736,"1f1f2-1f1e8":71737,"1f1f2-1f1e9":71738,"1f1f2-1f1ea":71739,"1f1f2-1f1eb":71740,"1f1f2-1f1ec":71741,"1f1f2-1f1ed":71742,"1f1f2-1f1f0":71743,"1f1f2-1f1f1":71744,"1f1f2-1f1f2":71745,"1f1f2-1f1f3":71746,"1f1f2-1f1f4":71747,"1f1f2-1f1f5":71748,"1f1f2-1f1f6":71749,"1f1f2-1f1f7":71750,"1f1f2-1f1f8":71751,"1f1f2-1f1f9":71752,"1f1f2-1f1fa":71753,"1f1f2-1f1fb":71754,"1f1f2-1f1fc":71755,"1f1f2-1f1fd":71756,"1f1f2-1f1fe":71757,"1f1f2-1f1ff":71758,"1f1f3-1f1e6":71759,"1f1f3-1f1e8":71760,"1f1f3-1f1ea":71761,"1f1f3-1f1eb":71762,"1f1f3-1f1ec":71763,"1f1f3-1f1ee":71764,"1f1f3-1f1f1":71765,"1f1f3-1f1f4":71766,"1f1f3-1f1f5":71767,"1f1f3-1f1f7":71768,"1f1f3-1f1fa":71769,"1f1f3-1f1ff":71770,"1f1f4-1f1f2":71771,"1f1f5-1f1e6":71772,"1f1f5-1f1ea":71773,"1f1f5-1f1eb":71774,"1f1f5-1f1ec":71775,"1f1f5-1f1ed":71776,"1f1f5-1f1f0":71777,"1f1f5-1f1f1":71778,"1f1f5-1f1f2":71779,"1f1f5-1f1f3":71780,"1f1f5-1f1f7":71781,"1f1f5-1f1f8":71782,"1f1f5-1f1f9":71783,"1f1f5-1f1fc":71784,"1f1f5-1f1fe":71785,"1f1f6-1f1e6":71786,"1f1f7-1f1ea":71787,"1f1f7-1f1f4":71788,"1f1f7-1f1f8":71789,"1f1f7-1f1fa":71790,"1f1f7-1f1fc":71791,"1f1f8-1f1e6":71792,"1f1f8-1f1e7":71793,"1f1f8-1f1e8":71794,"1f1f8-1f1e9":71795,"1f1f8-1f1ea":71796,"1f1f8-1f1ec":71797,"1f1f8-1f1ed":71798,"1f1f8-1f1ee":71799,"1f1f8-1f1ef":71800,"1f1f8-1f1f0":71801,"1f1f8-1f1f1":71802,"1f1f8-1f1f2":71803,"1f1f8-1f1f3":71804,"1f1f8-1f1f4":71805,"1f1f8-1f1f7":71806,"1f1f8-1f1f8":71807,"1f1f8-1f1f9":71808,"1f1f8-1f1fb":71809,"1f1f8-1f1fd":71810,"1f1f8-1f1fe":71811,"1f1f8-1f1ff":71812,"1f1f9-1f1e6":71813,"1f1f9-1f1e8":71814,"1f1f9-1f1e9":71815,"1f1f9-1f1eb":71816,"1f1f9-1f1ec":71817,"1f1f9-1f1ed":71818,"1f1f9-1f1ef":71819,"1f1f9-1f1f0":71820,"1f1f9-1f1f1":71821,"1f1f9-1f1f2":71822,"1f1f9-1f1f3":71823,"1f1f9-1f1f4":71824,"1f1f9-1f1f7":71825,"1f1f9-1f1f9":71826,"1f1f9-1f1fb":71827,"1f1f9-1f1fc":71828,"1f1f9-1f1ff":71829,"1f1fa-1f1e6":71830,"1f1fa-1f1ec":71831,"1f1fa-1f1f2":71832,"1f1fa-1f1f3":71833,"1f1fa-1f1f8":71834,"1f1fa-1f1fe":71835,"1f1fa-1f1ff":71836,"1f1fb-1f1e6":71837,"1f1fb-1f1e8":71838,"1f1fb-1f1ea":71839,"1f1fb-1f1ec":71840,"1f1fb-1f1ee":71841,"1f1fb-1f1f3":71842,"1f1fb-1f1fa":71843,"1f1fc-1f1eb":71844,"1f1fc-1f1f8":71845,"1f1fd-1f1f0":71846,"1f1fe-1f1ea":71847,"1f1fe-1f1f9":71848,"1f1ff-1f1e6":71849,"1f1ff-1f1f2":71850,"1f1ff-1f1fc":71851,"1f201":62899,"1f202":62900,"1f21a":62906,"1f22f":62903,"1f232":62907,"1f233":62911,"1f234":62910,"1f235":62915,"1f236":62902,"1f237":62901,"1f238":62909,"1f239":62905,"1f23a":62914,"1f250":62904,"1f251":62908,"1f300":41010,"1f301":4857,"1f302":41012,"1f303":4858,"1f304":4860,"1f305":4861,"1f306":4862,"1f307":4863,"1f308":41011,"1f309":4864,"1f30a":41023,"1f30b":4815,"1f30c":4997,"1f30d":4806,"1f30e":4807,"1f30f":4808,"1f310":4809,"1f311":4977,"1f312":4978,"1f313":4979,"1f314":4980,"1f315":4981,"1f316":4982,"1f317":4983,"1f318":4984,"1f319":4985,"1f31a":4986,"1f31b":4987,"1f31c":4988,"1f31d":4991,"1f31e":4992,"1f31f":4995,"1f320":4996,"1f321":4989,"1f324":41001,"1f325":41002,"1f326":41003,"1f327":41004,"1f328":41005,"1f329":41006,"1f32a":41007,"1f32b":41008,"1f32c":41009,"1f32d":3725,"1f32e":3727,"1f32f":3728,"1f330":3708,"1f331":2659,"1f332":2661,"1f333":2662,"1f334":2663,"1f335":2664,"1f336":3698,"1f337":2658,"1f338":2649,"1f339":2653,"1f33a":2655,"1f33b":2656,"1f33c":2657,"1f33d":3697,"1f33e":2665,"1f33f":2666,"1f340":2668,"1f341":2669,"1f342":2670,"1f343":2671,"1f344":3705,"1f345":3690,"1f346":3694,"1f347":3674,"1f348":3675,"1f349":3676,"1f34a":3677,"1f34b":3678,"1f34c":3679,"1f34d":3680,"1f34e":3682,"1f34f":3683,"1f350":3684,"1f351":3685,"1f352":3686,"1f353":3687,"1f354":3722,"1f355":3724,"1f356":3718,"1f357":3719,"1f358":3744,"1f359":3745,"1f35a":3746,"1f35b":3747,"1f35c":3748,"1f35d":3749,"1f35e":3709,"1f35f":3723,"1f360":3750,"1f361":3756,"1f362":3751,"1f363":3752,"1f364":3753,"1f365":3754,"1f366":3765,"1f367":3766,"1f368":3767,"1f369":3768,"1f36a":3769,"1f36b":3774,"1f36c":3775,"1f36d":3776,"1f36e":3777,"1f36f":3778,"1f370":3771,"1f371":3743,"1f372":3735,"1f373":3733,"1f374":3801,"1f375":3783,"1f376":3784,"1f377":3786,"1f378":3787,"1f379":3788,"1f37a":3789,"1f37b":3790,"1f37c":3779,"1f37d":3800,"1f37e":3785,"1f37f":3739,"1f380":51040,"1f381":51041,"1f382":3770,"1f383":51024,"1f384":51025,"1f385":1527,"1f386":51026,"1f387":51027,"1f388":51030,"1f389":51031,"1f38a":51032,"1f38b":51033,"1f38c":71588,"1f38d":51034,"1f38e":51035,"1f38f":51036,"1f390":51037,"1f391":51038,"1f392":61134,"1f393":61147,"1f396":51045,"1f397":51042,"1f399":61167,"1f39a":61168,"1f39b":61169,"1f39e":61203,"1f39f":51043,"1f3a0":4866,"1f3a1":4868,"1f3a2":4869,"1f3a3":51072,"1f3a4":61170,"1f3a5":61202,"1f3a6":62819,"1f3a7":61171,"1f3a8":51105,"1f3a9":61146,"1f3aa":4871,"1f3ab":51044,"1f3ac":61205,"1f3ad":51103,"1f3ae":51086,"1f3af":51078,"1f3b0":51088,"1f3b1":51081,"1f3b2":51089,"1f3b3":51060,"1f3b4":51102,"1f3b5":61165,"1f3b6":61166,"1f3b7":61173,"1f3b8":61175,"1f3b9":61176,"1f3ba":61177,"1f3bb":61178,"1f3bc":61164,"1f3bd":51074,"1f3be":51058,"1f3bf":51075,"1f3c0":51054,"1f3c1":71586,"1f3c2":1600,"1f3c3-200d-2640":1584,"1f3c3-200d-2642":1583,"1f3c3":1582,"1f3c4-200d-2640":1606,"1f3c4-200d-2642":1605,"1f3c4":1604,"1f3c5":51047,"1f3c6":51046,"1f3c7":1598,"1f3c8":51056,"1f3c9":51057,"1f3ca-200d-2640":1612,"1f3ca-200d-2642":1611,"1f3ca":1610,"1f3cb-200d-2640":1618,"1f3cb-200d-2642":1617,"1f3cb":1616,"1f3cc-200d-2640":1603,"1f3cc-200d-2642":1602,"1f3cc":1601,"1f3cd":4902,"1f3ce":4901,"1f3cf":51061,"1f3d0":51055,"1f3d1":51062,"1f3d2":51063,"1f3d3":51065,"1f3d4":4813,"1f3d5":4817,"1f3d6":4818,"1f3d7":4824,"1f3d8":4829,"1f3d9":4859,"1f3da":4830,"1f3db":4823,"1f3dc":4819,"1f3dd":4820,"1f3de":4821,"1f3df":4822,"1f3e0":4831,"1f3e1":4832,"1f3e2":4833,"1f3e3":4834,"1f3e4":4835,"1f3e5":4836,"1f3e6":4837,"1f3e7":62729,"1f3e8":4838,"1f3e9":4839,"1f3ea":4840,"1f3eb":4841,"1f3ec":4842,"1f3ed":4843,"1f3ee":61216,"1f3ef":4844,"1f3f0":4845,"1f3f3-200d-1f308":71591,"1f3f3-200d-26a7":71592,"1f3f3":71590,"1f3f4-200d-2620":71593,"1f3f4-e0067-e0062-e0065-e006e-e0067-e007f":71852,"1f3f4-e0067-e0062-e0073-e0063-e0074-e007f":71853,"1f3f4-e0067-e0062-e0077-e006c-e0073-e007f":71854,"1f3f4":71589,"1f3f5":2652,"1f3f7":61234,"1f3f8":51066,"1f3f9":61303,"1f3fa":3805,"1f3fb":9525,"1f3fc":9526,"1f3fd":9527,"1f3fe":9528,"1f3ff":9529,"1f400":2576,"1f401":2575,"1f402":2556,"1f403":2557,"1f404":2558,"1f405":2547,"1f406":2548,"1f407":2579,"1f408-200d-2b1b":2544,"1f408":2543,"1f409":2618,"1f40a":2613,"1f40b":2622,"1f40c":2632,"1f40d":2616,"1f40e":2550,"1f40f":2563,"1f410":2565,"1f411":2564,"1f412":2531,"1f413":2596,"1f414":2595,"1f415-200d-1f9ba":2537,"1f415":2535,"1f416":2560,"1f417":2561,"1f418":2570,"1f419":2629,"1f41a":2630,"1f41b":2634,"1f41c":2635,"1f41d":2636,"1f41e":2638,"1f41f":2625,"1f420":2626,"1f421":2627,"1f422":2614,"1f423":2597,"1f424":2598,"1f425":2599,"1f426":2600,"1f427":2601,"1f428":2586,"1f429":2538,"1f42a":2566,"1f42b":2567,"1f42c":2623,"1f42d":2574,"1f42e":2555,"1f42f":2546,"1f430":2578,"1f431":2542,"1f432":2617,"1f433":2621,"1f434":2549,"1f435":2530,"1f436":2534,"1f437":2559,"1f438":2612,"1f439":2577,"1f43a":2539,"1f43b-200d-2744":2585,"1f43b":2584,"1f43c":2587,"1f43d":2562,"1f43e":2593,"1f43f":2580,"1f440":1381,"1f441-200d-1f5e8":1159,"1f441":1382,"1f442":1373,"1f443":1375,"1f444":1384,"1f445":1383,"1f446":1347,"1f447":1349,"1f448":1345,"1f449":1346,"1f44a":1355,"1f44b":1327,"1f44c":1336,"1f44d":1352,"1f44e":1353,"1f44f":1358,"1f450":1361,"1f451":61144,"1f452":61145,"1f453":61110,"1f454":61115,"1f455":61116,"1f456":61117,"1f457":61122,"1f458":61123,"1f459":61128,"1f45a":61129,"1f45b":61130,"1f45c":61131,"1f45d":61132,"1f45e":61136,"1f45f":61137,"1f460":61140,"1f461":61141,"1f462":61143,"1f463":1687,"1f464":1684,"1f465":1685,"1f466":1388,"1f467":1389,"1f468-200d-1f33e":1457,"1f468-200d-1f373":1460,"1f468-200d-1f37c":1524,"1f468-200d-1f393":1448,"1f468-200d-1f3a4":1478,"1f468-200d-1f3a8":1481,"1f468-200d-1f3eb":1451,"1f468-200d-1f3ed":1466,"1f468-200d-1f466-200d-1f466":1674,"1f468-200d-1f466":1673,"1f468-200d-1f467-200d-1f466":1676,"1f468-200d-1f467-200d-1f467":1677,"1f468-200d-1f467":1675,"1f468-200d-1f468-200d-1f466":1663,"1f468-200d-1f468-200d-1f466-200d-1f466":1666,"1f468-200d-1f468-200d-1f467":1664,"1f468-200d-1f468-200d-1f467-200d-1f466":1665,"1f468-200d-1f468-200d-1f467-200d-1f467":1667,"1f468-200d-1f469-200d-1f466":1658,"1f468-200d-1f469-200d-1f466-200d-1f466":1661,"1f468-200d-1f469-200d-1f467":1659,"1f468-200d-1f469-200d-1f467-200d-1f466":1660,"1f468-200d-1f469-200d-1f467-200d-1f467":1662,"1f468-200d-1f4bb":1475,"1f468-200d-1f4bc":1469,"1f468-200d-1f527":1463,"1f468-200d-1f52c":1472,"1f468-200d-1f680":1487,"1f468-200d-1f692":1490,"1f468-200d-1f9af":1574,"1f468-200d-1f9b0":1396,"1f468-200d-1f9b1":1397,"1f468-200d-1f9b2":1399,"1f468-200d-1f9b3":1398,"1f468-200d-1f9bc":1577,"1f468-200d-1f9bd":1580,"1f468-200d-2695":1445,"1f468-200d-2696":1454,"1f468-200d-2708":1484,"1f468-200d-2764-200d-1f468":1655,"1f468-200d-2764-200d-1f48b-200d-1f468":1651,"1f468":1392,"1f469-200d-1f33e":1458,"1f469-200d-1f373":1461,"1f469-200d-1f37c":1523,"1f469-200d-1f393":1449,"1f469-200d-1f3a4":1479,"1f469-200d-1f3a8":1482,"1f469-200d-1f3eb":1452,"1f469-200d-1f3ed":1467,"1f469-200d-1f466-200d-1f466":1679,"1f469-200d-1f466":1678,"1f469-200d-1f467-200d-1f466":1681,"1f469-200d-1f467-200d-1f467":1682,"1f469-200d-1f467":1680,"1f469-200d-1f469-200d-1f466":1668,"1f469-200d-1f469-200d-1f466-200d-1f466":1671,"1f469-200d-1f469-200d-1f467":1669,"1f469-200d-1f469-200d-1f467-200d-1f466":1670,"1f469-200d-1f469-200d-1f467-200d-1f467":1672,"1f469-200d-1f4bb":1476,"1f469-200d-1f4bc":1470,"1f469-200d-1f527":1464,"1f469-200d-1f52c":1473,"1f469-200d-1f680":1488,"1f469-200d-1f692":1491,"1f469-200d-1f9af":1575,"1f469-200d-1f9b0":1401,"1f469-200d-1f9b1":1403,"1f469-200d-1f9b2":1407,"1f469-200d-1f9b3":1405,"1f469-200d-1f9bc":1578,"1f469-200d-1f9bd":1581,"1f469-200d-2695":1446,"1f469-200d-2696":1455,"1f469-200d-2708":1485,"1f469-200d-2764-200d-1f468":1654,"1f469-200d-2764-200d-1f469":1656,"1f469-200d-2764-200d-1f48b-200d-1f468":1650,"1f469-200d-2764-200d-1f48b-200d-1f469":1652,"1f469":1400,"1f46a":1657,"1f46b":1647,"1f46c":1648,"1f46d":1646,"1f46e-200d-2640":1494,"1f46e-200d-2642":1493,"1f46e":1492,"1f46f-200d-2640":1590,"1f46f-200d-2642":1589,"1f46f":1588,"1f470-200d-2640":1518,"1f470-200d-2642":1517,"1f470":1516,"1f471-200d-2640":1409,"1f471-200d-2642":1410,"1f471":1391,"1f472":1511,"1f473-200d-2640":1510,"1f473-200d-2642":1509,"1f473":1508,"1f474":1412,"1f475":1413,"1f476":1386,"1f477-200d-2640":1504,"1f477-200d-2642":1503,"1f477":1502,"1f478":1507,"1f479":1109,"1f47a":1110,"1f47b":1111,"1f47c":1526,"1f47d":1112,"1f47e":1113,"1f47f":1104,"1f480":1105,"1f481-200d-2640":1428,"1f481-200d-2642":1427,"1f481":1426,"1f482-200d-2640":1500,"1f482-200d-2642":1499,"1f482":1498,"1f483":1585,"1f484":61152,"1f485":1366,"1f486-200d-2640":1560,"1f486-200d-2642":1559,"1f486":1558,"1f487-200d-2640":1563,"1f487-200d-2642":1562,"1f487":1561,"1f488":4870,"1f489":61326,"1f48a":61328,"1f48b":1127,"1f48c":1128,"1f48d":61153,"1f48e":61154,"1f48f":1649,"1f490":2648,"1f491":1653,"1f492":4846,"1f493":1133,"1f494":1138,"1f495":1135,"1f496":1131,"1f497":1132,"1f498":1129,"1f499":1145,"1f49a":1144,"1f49b":1143,"1f49c":1146,"1f49d":1130,"1f49e":1134,"1f49f":1136,"1f4a0":62946,"1f4a1":61214,"1f4a2":1151,"1f4a3":1157,"1f4a4":1163,"1f4a5":1152,"1f4a6":1154,"1f4a7":41022,"1f4a8":1155,"1f4a9":1107,"1f4aa":1368,"1f4ab":1153,"1f4ac":1158,"1f4ad":1162,"1f4ae":2650,"1f4af":1150,"1f4b0":61235,"1f4b1":62841,"1f4b2":62842,"1f4b3":61242,"1f4b4":61237,"1f4b5":61238,"1f4b6":61239,"1f4b7":61240,"1f4b8":61241,"1f4b9":61244,"1f4ba":4936,"1f4bb":61191,"1f4bc":61265,"1f4bd":61197,"1f4be":61198,"1f4bf":61199,"1f4c0":61200,"1f4c1":61266,"1f4c2":61267,"1f4c3":61227,"1f4c4":61229,"1f4c5":61269,"1f4c6":61270,"1f4c7":61273,"1f4c8":61274,"1f4c9":61275,"1f4ca":61276,"1f4cb":61277,"1f4cc":61278,"1f4cd":61279,"1f4ce":61280,"1f4cf":61282,"1f4d0":61283,"1f4d1":61232,"1f4d2":61226,"1f4d3":61225,"1f4d4":61218,"1f4d5":61219,"1f4d6":61220,"1f4d7":61221,"1f4d8":61222,"1f4d9":61223,"1f4da":61224,"1f4db":62847,"1f4dc":61228,"1f4dd":61264,"1f4de":61185,"1f4df":61186,"1f4e0":61187,"1f4e1":61325,"1f4e2":61159,"1f4e3":61160,"1f4e4":61249,"1f4e5":61250,"1f4e6":61251,"1f4e7":61246,"1f4e8":61247,"1f4e9":61248,"1f4ea":61253,"1f4eb":61252,"1f4ec":61254,"1f4ed":61255,"1f4ee":61256,"1f4ef":61161,"1f4f0":61230,"1f4f1":61182,"1f4f2":61183,"1f4f3":62823,"1f4f4":62824,"1f4f5":62751,"1f4f6":62822,"1f4f7":61207,"1f4f8":61208,"1f4f9":61209,"1f4fa":61206,"1f4fb":61172,"1f4fc":61210,"1f4fd":61204,"1f4ff":61151,"1f500":62801,"1f501":62802,"1f502":62803,"1f503":62769,"1f504":62770,"1f505":62820,"1f506":62821,"1f507":61155,"1f508":61156,"1f509":61157,"1f50a":61158,"1f50b":61188,"1f50c":61190,"1f50d":61211,"1f50e":61212,"1f50f":61290,"1f510":61291,"1f511":61292,"1f512":61288,"1f513":61289,"1f514":61162,"1f515":61163,"1f516":61233,"1f517":61313,"1f518":62947,"1f519":62771,"1f51a":62772,"1f51b":62773,"1f51c":62774,"1f51d":62775,"1f51e":62752,"1f51f":62876,"1f520":62877,"1f521":62878,"1f522":62879,"1f523":62880,"1f524":62881,"1f525":41021,"1f526":61215,"1f527":61306,"1f528":61294,"1f529":61308,"1f52a":3803,"1f52b":61301,"1f52c":61323,"1f52d":61324,"1f52e":51082,"1f52f":62787,"1f530":62848,"1f531":62846,"1f532":62949,"1f533":62948,"1f534":62916,"1f535":62920,"1f536":62940,"1f537":62941,"1f538":62942,"1f539":62943,"1f53a":62944,"1f53b":62945,"1f53c":62811,"1f53d":62813,"1f549":62778,"1f54a":2602,"1f54b":4854,"1f54c":4850,"1f54d":4852,"1f54e":62786,"1f550":4955,"1f551":4957,"1f552":4959,"1f553":4961,"1f554":4963,"1f555":4965,"1f556":4967,"1f557":4969,"1f558":4971,"1f559":4973,"1f55a":4975,"1f55b":4953,"1f55c":4956,"1f55d":4958,"1f55e":4960,"1f55f":4962,"1f560":4964,"1f561":4966,"1f562":4968,"1f563":4970,"1f564":4972,"1f565":4974,"1f566":4976,"1f567":4954,"1f56f":61213,"1f570":4952,"1f573":1156,"1f574":1587,"1f575-200d-2640":1497,"1f575-200d-2642":1496,"1f575":1495,"1f576":61111,"1f577":2641,"1f578":2642,"1f579":51087,"1f57a":1586,"1f587":61281,"1f58a":61261,"1f58b":61260,"1f58c":61262,"1f58d":61263,"1f590":1329,"1f595":1348,"1f596":1331,"1f5a4":1148,"1f5a5":61192,"1f5a8":61193,"1f5b1":61195,"1f5b2":61196,"1f5bc":51104,"1f5c2":61268,"1f5c3":61285,"1f5c4":61286,"1f5d1":61287,"1f5d2":61271,"1f5d3":61272,"1f5dc":61310,"1f5dd":61293,"1f5de":61231,"1f5e1":61299,"1f5e3":1683,"1f5e8":1160,"1f5ef":1161,"1f5f3":61257,"1f5fa":4810,"1f5fb":4816,"1f5fc":4847,"1f5fd":4848,"1f5fe":4811,"1f5ff":61362,"1f600":11,"1f601":14,"1f602":18,"1f603":12,"1f604":13,"1f605":16,"1f606":15,"1f607":114,"1f608":1103,"1f609":112,"1f60a":113,"1f60b":124,"1f60c":150,"1f60d":116,"1f60e":170,"1f60f":144,"1f610":139,"1f611":140,"1f612":145,"1f613":195,"1f614":151,"1f615":173,"1f616":192,"1f617":119,"1f618":118,"1f619":122,"1f61a":121,"1f61b":125,"1f61c":126,"1f61d":128,"1f61e":194,"1f61f":175,"1f620":1101,"1f621":1100,"1f622":189,"1f623":193,"1f624":199,"1f625":188,"1f626":184,"1f627":185,"1f628":186,"1f629":196,"1f62a":152,"1f62b":197,"1f62c":147,"1f62d":190,"1f62e-200d-1f4a8":148,"1f62e":178,"1f62f":179,"1f630":187,"1f631":191,"1f632":180,"1f633":181,"1f634":154,"1f635-200d-1f4ab":165,"1f635":164,"1f636-200d-1f32b":143,"1f636":141,"1f637":155,"1f638":1116,"1f639":1117,"1f63a":1115,"1f63b":1118,"1f63c":1119,"1f63d":1120,"1f63e":1123,"1f63f":1122,"1f640":1121,"1f641":176,"1f642":19,"1f643":110,"1f644":146,"1f645-200d-2640":1422,"1f645-200d-2642":1421,"1f645":1420,"1f646-200d-2640":1425,"1f646-200d-2642":1424,"1f646":1423,"1f647-200d-2640":1437,"1f647-200d-2642":1436,"1f647":1435,"1f648":1124,"1f649":1125,"1f64a":1126,"1f64b-200d-2640":1431,"1f64b-200d-2642":1430,"1f64b":1429,"1f64c":1359,"1f64d-200d-2640":1416,"1f64d-200d-2642":1415,"1f64d":1414,"1f64e-200d-2640":1419,"1f64e-200d-2642":1418,"1f64e":1417,"1f64f":1364,"1f680":4942,"1f681":4937,"1f682":4872,"1f683":4873,"1f684":4874,"1f685":4875,"1f686":4876,"1f687":4877,"1f688":4878,"1f689":4879,"1f68a":4880,"1f68b":4883,"1f68c":4884,"1f68d":4885,"1f68e":4886,"1f68f":4911,"1f690":4887,"1f691":4888,"1f692":4889,"1f693":4890,"1f694":4891,"1f695":4892,"1f696":4893,"1f697":4894,"1f698":4895,"1f699":4896,"1f69a":4898,"1f69b":4899,"1f69c":4900,"1f69d":4881,"1f69e":4882,"1f69f":4938,"1f6a0":4939,"1f6a1":4940,"1f6a2":4930,"1f6a3-200d-2640":1609,"1f6a3-200d-2642":1608,"1f6a3":1607,"1f6a4":4926,"1f6a5":4918,"1f6a6":4919,"1f6a7":4921,"1f6a8":4917,"1f6a9":71587,"1f6aa":61333,"1f6ab":62745,"1f6ac":61358,"1f6ad":62747,"1f6ae":62730,"1f6af":62748,"1f6b0":62731,"1f6b1":62749,"1f6b2":4907,"1f6b3":62746,"1f6b4-200d-2640":1621,"1f6b4-200d-2642":1620,"1f6b4":1619,"1f6b5-200d-2640":1624,"1f6b5-200d-2642":1623,"1f6b5":1622,"1f6b6-200d-2640":1566,"1f6b6-200d-2642":1565,"1f6b6":1564,"1f6b7":62750,"1f6b8":62743,"1f6b9":62733,"1f6ba":62734,"1f6bb":62735,"1f6bc":62736,"1f6bd":61340,"1f6be":62737,"1f6bf":61342,"1f6c0":1643,"1f6c1":61343,"1f6c2":62738,"1f6c3":62739,"1f6c4":62740,"1f6c5":62741,"1f6cb":61338,"1f6cc":1644,"1f6cd":61133,"1f6ce":4944,"1f6cf":61337,"1f6d0":62776,"1f6d1":4920,"1f6d2":61357,"1f6d5":4851,"1f6d6":4828,"1f6d7":61334,"1f6e0":61298,"1f6e1":61304,"1f6e2":4914,"1f6e3":4912,"1f6e4":4913,"1f6e5":4929,"1f6e9":4932,"1f6eb":4933,"1f6ec":4934,"1f6f0":4941,"1f6f3":4927,"1f6f4":4908,"1f6f5":4903,"1f6f6":4925,"1f6f7":51076,"1f6f8":4943,"1f6f9":4909,"1f6fa":4906,"1f6fb":4897,"1f6fc":4910,"1f7e0":62917,"1f7e1":62918,"1f7e2":62919,"1f7e3":62921,"1f7e4":62922,"1f7e5":62925,"1f7e6":62929,"1f7e7":62926,"1f7e8":62927,"1f7e9":62928,"1f7ea":62930,"1f7eb":62931,"1f90c":1337,"1f90d":1149,"1f90e":1147,"1f90f":1338,"1f910":137,"1f911":129,"1f912":156,"1f913":171,"1f914":135,"1f915":157,"1f916":1114,"1f917":130,"1f918":1343,"1f919":1344,"1f91a":1328,"1f91b":1356,"1f91c":1357,"1f91d":1363,"1f91e":1340,"1f91f":1342,"1f920":167,"1f921":1108,"1f922":158,"1f923":17,"1f924":153,"1f925":149,"1f926-200d-2640":1440,"1f926-200d-2642":1439,"1f926":1438,"1f927":160,"1f928":138,"1f929":117,"1f92a":127,"1f92b":134,"1f92c":1102,"1f92d":131,"1f92e":159,"1f92f":166,"1f930":1519,"1f931":1522,"1f932":1362,"1f933":1367,"1f934":1506,"1f935-200d-2640":1515,"1f935-200d-2642":1514,"1f935":1513,"1f936":1528,"1f937-200d-2640":1443,"1f937-200d-2642":1442,"1f937":1441,"1f938-200d-2640":1627,"1f938-200d-2642":1626,"1f938":1625,"1f939-200d-2640":1639,"1f939-200d-2642":1638,"1f939":1637,"1f93a":1597,"1f93c-200d-2640":1630,"1f93c-200d-2642":1629,"1f93c":1628,"1f93d-200d-2640":1633,"1f93d-200d-2642":1632,"1f93d":1631,"1f93e-200d-2640":1636,"1f93e-200d-2642":1635,"1f93e":1634,"1f93f":51073,"1f940":2654,"1f941":61180,"1f942":3791,"1f943":3792,"1f944":3802,"1f945":51069,"1f947":51048,"1f948":51049,"1f949":51050,"1f94a":51067,"1f94b":51068,"1f94c":51077,"1f94d":51064,"1f94e":51053,"1f94f":51059,"1f950":3710,"1f951":3693,"1f952":3700,"1f953":3721,"1f954":3695,"1f955":3696,"1f956":3711,"1f957":3738,"1f958":3734,"1f959":3730,"1f95a":3732,"1f95b":3780,"1f95c":3706,"1f95d":3689,"1f95e":3715,"1f95f":3757,"1f960":3758,"1f961":3759,"1f962":3799,"1f963":3737,"1f964":3794,"1f965":3692,"1f966":3702,"1f967":3773,"1f968":3713,"1f969":3720,"1f96a":3726,"1f96b":3742,"1f96c":3701,"1f96d":3681,"1f96e":3755,"1f96f":3714,"1f970":115,"1f971":198,"1f972":123,"1f973":168,"1f974":163,"1f975":161,"1f976":162,"1f977":1501,"1f978":169,"1f97a":182,"1f97b":61124,"1f97c":61113,"1f97d":61112,"1f97e":61138,"1f97f":61139,"1f980":3760,"1f981":2545,"1f982":2643,"1f983":2594,"1f984":2551,"1f985":2603,"1f986":2604,"1f987":2583,"1f988":2628,"1f989":2606,"1f98a":2540,"1f98b":2633,"1f98c":2553,"1f98d":2532,"1f98e":2615,"1f98f":2572,"1f990":3762,"1f991":3763,"1f992":2569,"1f993":2552,"1f994":2582,"1f995":2619,"1f996":2620,"1f997":2639,"1f998":2591,"1f999":2568,"1f99a":2610,"1f99b":2573,"1f99c":2611,"1f99d":2541,"1f99e":3761,"1f99f":2644,"1f9a0":2647,"1f9a1":2592,"1f9a2":2605,"1f9a3":2571,"1f9a4":2607,"1f9a5":2588,"1f9a6":2589,"1f9a7":2533,"1f9a8":2590,"1f9a9":2609,"1f9aa":3764,"1f9ab":2581,"1f9ac":2554,"1f9ad":2624,"1f9ae":2536,"1f9af":61312,"1f9b4":1380,"1f9b5":1371,"1f9b6":1372,"1f9b7":1379,"1f9b8-200d-2640":1532,"1f9b8-200d-2642":1531,"1f9b8":1530,"1f9b9-200d-2640":1535,"1f9b9-200d-2642":1534,"1f9b9":1533,"1f9ba":61114,"1f9bb":1374,"1f9bc":4905,"1f9bd":4904,"1f9be":1369,"1f9bf":1370,"1f9c0":3717,"1f9c1":3772,"1f9c2":3741,"1f9c3":3796,"1f9c4":3703,"1f9c5":3704,"1f9c6":3731,"1f9c7":3716,"1f9c8":3740,"1f9c9":3797,"1f9ca":3798,"1f9cb":3795,"1f9cd-200d-2640":1569,"1f9cd-200d-2642":1568,"1f9cd":1567,"1f9ce-200d-2640":1572,"1f9ce-200d-2642":1571,"1f9ce":1570,"1f9cf-200d-2640":1434,"1f9cf-200d-2642":1433,"1f9cf":1432,"1f9d0":172,"1f9d1-200d-1f33e":1456,"1f9d1-200d-1f373":1459,"1f9d1-200d-1f37c":1525,"1f9d1-200d-1f384":1529,"1f9d1-200d-1f393":1447,"1f9d1-200d-1f3a4":1477,"1f9d1-200d-1f3a8":1480,"1f9d1-200d-1f3eb":1450,"1f9d1-200d-1f3ed":1465,"1f9d1-200d-1f4bb":1474,"1f9d1-200d-1f4bc":1468,"1f9d1-200d-1f527":1462,"1f9d1-200d-1f52c":1471,"1f9d1-200d-1f680":1486,"1f9d1-200d-1f692":1489,"1f9d1-200d-1f91d-200d-1f9d1":1645,"1f9d1-200d-1f9af":1573,"1f9d1-200d-1f9b0":1402,"1f9d1-200d-1f9b1":1404,"1f9d1-200d-1f9b2":1408,"1f9d1-200d-1f9b3":1406,"1f9d1-200d-1f9bc":1576,"1f9d1-200d-1f9bd":1579,"1f9d1-200d-2695":1444,"1f9d1-200d-2696":1453,"1f9d1-200d-2708":1483,"1f9d1":1390,"1f9d2":1387,"1f9d3":1411,"1f9d4-200d-2640":1395,"1f9d4-200d-2642":1394,"1f9d4":1393,"1f9d5":1512,"1f9d6-200d-2640":1593,"1f9d6-200d-2642":1592,"1f9d6":1591,"1f9d7-200d-2640":1596,"1f9d7-200d-2642":1595,"1f9d7":1594,"1f9d8-200d-2640":1642,"1f9d8-200d-2642":1641,"1f9d8":1640,"1f9d9-200d-2640":1538,"1f9d9-200d-2642":1537,"1f9d9":1536,"1f9da-200d-2640":1541,"1f9da-200d-2642":1540,"1f9da":1539,"1f9db-200d-2640":1544,"1f9db-200d-2642":1543,"1f9db":1542,"1f9dc-200d-2640":1547,"1f9dc-200d-2642":1546,"1f9dc":1545,"1f9dd-200d-2640":1550,"1f9dd-200d-2642":1549,"1f9dd":1548,"1f9de-200d-2640":1553,"1f9de-200d-2642":1552,"1f9de":1551,"1f9df-200d-2640":1556,"1f9df-200d-2642":1555,"1f9df":1554,"1f9e0":1376,"1f9e1":1142,"1f9e2":61148,"1f9e3":61118,"1f9e4":61119,"1f9e5":61120,"1f9e6":61121,"1f9e7":51039,"1f9e8":51028,"1f9e9":51090,"1f9ea":61320,"1f9eb":61321,"1f9ec":61322,"1f9ed":4812,"1f9ee":61201,"1f9ef":61356,"1f9f0":61316,"1f9f1":4825,"1f9f2":61317,"1f9f3":4945,"1f9f4":61346,"1f9f5":51106,"1f9f6":51108,"1f9f7":61347,"1f9f8":51091,"1f9f9":61348,"1f9fa":61349,"1f9fb":61350,"1f9fc":61352,"1f9fd":61355,"1f9fe":61243,"1f9ff":51084,"1fa70":61142,"1fa71":61125,"1fa72":61126,"1fa73":61127,"1fa74":61135,"1fa78":61327,"1fa79":61329,"1fa7a":61331,"1fa80":51079,"1fa81":51080,"1fa82":4935,"1fa83":61302,"1fa84":51083,"1fa85":51092,"1fa86":51094,"1fa90":4993,"1fa91":61339,"1fa92":61345,"1fa93":61295,"1fa94":61217,"1fa95":61179,"1fa96":61149,"1fa97":61174,"1fa98":61181,"1fa99":61236,"1fa9a":61305,"1fa9b":61307,"1fa9c":61318,"1fa9d":61315,"1fa9e":61335,"1fa9f":61336,"1faa0":61341,"1faa1":51107,"1faa2":51109,"1faa3":61351,"1faa4":61344,"1faa5":61354,"1faa6":61360,"1faa7":61363,"1faa8":4826,"1fab0":2645,"1fab1":2646,"1fab2":2637,"1fab3":2640,"1fab4":2660,"1fab5":4827,"1fab6":2608,"1fac0":1377,"1fac1":1378,"1fac2":1686,"1fad0":3688,"1fad1":3699,"1fad2":3691,"1fad3":3712,"1fad4":3729,"1fad5":3736,"1fad6":3782,"203c":62834,"21a9":62765,"21aa":62766,"231a":4948,"231b":4946,"23cf":62818,"23e9":62805,"23ea":62809,"23eb":62812,"23ec":62814,"23ed":62806,"23ee":62810,"23ef":62807,"23f0":4949,"23f1":4950,"23f2":4951,"23f3":4947,"23f8":62815,"23f9":62816,"23fa":62817,"24c2":62890,"25aa":62938,"25ab":62939,"25b6":62804,"25c0":62808,"25fb":62935,"25fc":62934,"25fd":62937,"25fe":62936,"260e":61184,"261d":1350,"262a":62784,"262e":62785,"262f":62781,"263a":120,"264a":62790,"264b":62791,"264c":62792,"264d":62793,"264e":62794,"264f":62795,"265f":51099,"267b":62844,"267e":62833,"267f":62732,"269b":62777,"269c":62845,"26a0":62742,"26a1":41016,"26a7":62827,"26aa":62924,"26ab":62923,"26b0":61359,"26b1":61361,"26bd":51051,"26be":51052,"26c4":41019,"26c5":4999,"26c8":41e3,"26ce":62800,"26cf":61296,"26d1":61150,"26d3":61314,"26d4":62744,"26e9":4853,"26ea":4849,"26f0":4814,"26f1":41015,"26f2":4855,"26f3":51070,"26f4":4928,"26f5":4924,"26f7":1599,"26f8":51071,"26f9-200d-2640":1615,"26f9-200d-2642":1614,"26f9":1613,"26fa":4856,"26fd":4915,"270a":1354,"270b":1330,"270c":1339,"270d":1365,"270f":61258,"271d":62782,"274c":62853,"274e":62854,"2764-200d-1f525":1139,"2764-200d-1fa79":1140,"27a1":62757,"27b0":62855,"27bf":62856,"2b05":62761,"2b06":62755,"2b07":62759,"2b1b":62932,"2b1c":62933,"2b50":4994,"2b55":62849,"303d":62857,"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-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff":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-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3ff":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,"1f48f-1f3fb":0,"1f48f-1f3fc":0,"1f48f-1f3fd":0,"1f48f-1f3fe":0,"1f48f-1f3ff":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f491-1f3fb":0,"1f491-1f3fc":0,"1f491-1f3fd":0,"1f491-1f3fe":0,"1f491-1f3ff":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fe":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,"1f91d-1f3fb":0,"1f91d-1f3fc":0,"1f91d-1f3fd":0,"1f91d-1f3fe":0,"1f91d-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-200d-2640":0,"1f9d4-1f3fc-200d-2640":0,"1f9d4-1f3fd-200d-2640":0,"1f9d4-1f3fe-200d-2640":0,"1f9d4-1f3ff-200d-2640":0,"1f9d4-1f3fb-200d-2642":0,"1f9d4-1f3fc-200d-2642":0,"1f9d4-1f3fd-200d-2642":0,"1f9d4-1f3fe-200d-2642":0,"1f9d4-1f3ff-200d-2642":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}},n=s[""];for(const e in s)e&&Object.assign(n,s[e]);const i=n},4762:(e,t,a)=>{a.d(t,{IS_FIREFOX:()=>r,IS_SAFARI:()=>i});var s=a(6761);const n=navigator?navigator.userAgent:null,i=(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)&&s.Z.MSStream,!!("safari"in s.Z)||!(!n||!(/\b(iPad|iPhone|iPod)\b/.test(n)||n.match("Safari")&&!n.match("Chrome")))),r=navigator.userAgent.toLowerCase().indexOf("firefox")>-1;(void 0===navigator.maxTouchPoints||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)},467:(e,t,a)=>{a.d(t,{ZP:()=>o,gV:()=>p});var s=a(5813);const n=/[`~!@#$%^&*()\-_=+\[\]\\|{}'";:\/?.>,<]+/g,i=/^\s+|\s$/g,r={ะน:"q",ั†:"w",ัƒ:"e",ะบ:"r",ะต:"t",ะฝ:"y",ะณ:"u",ัˆ:"i",ั‰:"o",ะท:"p",ั…:"[",ัŠ:"]",ั„:"a",ั‹:"s",ะฒ:"d",ะฐ:"f",ะฟ:"g",ั€:"h",ะพ:"j",ะป:"k",ะด:"l",ะถ:";",ั:"'",ั:"z",ั‡:"x",ั:"c",ะผ:"v",ะธ:"b",ั‚:"n",ัŒ:"m",ะฑ:",",ัŽ:".",".":"/"};function o(e,t=!0){return p(e,{clearBadChars:!0,latinize:t,ignoreCase:!0})}function p(e,t={}){const a=t.includeTag&&"%"===e.charAt(0),o=e;return t.clearBadChars&&(e=function(e){return e.replace(n,"").replace(i,"")}(e)),t.latinize&&(e=function(e){return e.replace(/[^A-Za-z0-9]/g,(e=>{const t=s.Z[e];return null!=t?t:e}))}(e)),t.ignoreCase&&(e=e.toLowerCase()),a&&(e="%"+e),t.latinize&&(e+=""+function(e){return e.toLowerCase().replace(/[\wะฐ-ั]/g,(e=>{const t=r[e];return null!=t?t:e}))}(o)),e}},8801:(e,t,a)=>{a.d(t,{P:()=>n,q:()=>i});const s="_";function n(e,t){const a=""["".length-1]||"";let n;switch(e._){case"inputPhotoFileLocation":n=["photo",""[0],e.id,e.thumb_size].filter(Boolean).join(s);break;case"inputDocumentFileLocation":n=["document",""[0],e.id,e.thumb_size].filter(Boolean).join(s);break;case"inputPeerPhotoFileLocation":n=["peerPhoto",e.photo_id,e.pFlags.big?"big":"small"].join(s);break;case"inputStickerSetThumb":n=["stickerSetThumb",e.stickerset.id||e.stickerset.short_name||e.stickerset.emoticon||e.stickerset._,e.thumb_version].join(s);break;case"inputFileLocation":n=[e.volume_id,e.local_id].join(s);break;case"inputWebFileLocation":n=["webFile",e.url].join(s);break;default:console.error("Unrecognized location:",e),n=""}return n+((null==t?void 0:t.downloadId)?"_download":"")+(a?"."+a:a)}function i(e,t){return e+"/"+encodeURIComponent(JSON.stringify(t))}},677:(e,t,a)=>{a.d(t,{Ki:()=>o,RP:()=>i,X:()=>r});const s=new Set(["all","web","webk"]),n=new Set;function i(e){return e.find((e=>s.has(e.platform)&&!n.has(e.reason)))}function r(e){return!!i(e)}function o(e){n.clear(),e.forEach((e=>{n.add(e)}))}},2946:(e,t,a)=>{a.d(t,{Z:()=>i});var s=a(5880),n=a(1507);function i(e){if(void 0!==e&&e.isPeerId&&e.isPeerId())return e;if((0,s.Z)(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):n.NM}if(!e)return n.NM;const t="u"===e.charAt(0),a=e.substr(1).split("_");return t?a[0].toPeerId():(a[0]||"").toPeerId(!0)}},6666:(e,t,a)=>{a.d(t,{C:()=>o,Z:()=>p});var s=a(1267),n=a(5471),i=a(5953),r=a(5003);class o{constructor(e){(0,i.Z)(this,e),s.Z.test&&(this.name+="_test"),this.storageIsAvailable=!0,this.log=(0,r.kg)(["IDB",e.name].join("-")),this.log("constructor"),this.openDatabase(!0),o.INSTANCES.push(this)}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;const t=(e,t)=>{var a;const s=Array.from(e.indexNames);for(const t of s)e.deleteIndex(t);if(null===(a=t.indexes)||void 0===a?void 0:a.length)for(const a of t.indexes)e.indexNames.contains(a.indexName)||e.createIndex(a.indexName,a.keyPath,a.objectParameters)};try{var a=indexedDB.open(this.name,this.version);if(!a)return Promise.reject()}catch(e){return this.log.error("error opening db",e.message),this.storageIsAvailable=!1,Promise.reject(e)}let s=!1;return setTimeout((()=>{s||a.onerror((0,n.Z)("IDB_CREATE_TIMEOUT"))}),3e3),this.openDbPromise=new Promise(((e,n)=>{a.onsuccess=t=>{s=!0;const i=a.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)},a.onerror=e=>{s=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),n(e)},a.onupgradeneeded=e=>{s=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);const a=e.target,n=a.result;this.stores.forEach((e=>{if(n.objectStoreNames.contains(e.name)){const s=a.transaction.objectStore(e.name);t(s,e)}else((e,a)=>{const s=e.createObjectStore(a.name);t(s,a)})(n,e)}))}}))}static create(e){var t;return null!==(t=this.INSTANCES.find((t=>t.name===e.name)))&&void 0!==t?t:new o(e)}static closeDatabases(e){this.INSTANCES.forEach((t=>{if(e&&e===t)return;const a=t.db;a&&(a.onclose=()=>{},a.close())}))}}o.INSTANCES=[];class p{constructor(e,t){this.storeName=t,this.log=(0,r.kg)(["IDB",e.name,t].join("-")),this.idb=o.create(e)}delete(e,t){const a=Array.isArray(e);return a||(e=[].concat(e)),this.getObjectStore("readwrite",(t=>{const s=e.map((e=>t.delete(e)));return a?s:s[0]}),"",t)}clear(e){return this.getObjectStore("readwrite",(e=>e.clear()),"",e)}save(e,t,a){const s=Array.isArray(e);return s||(e=[].concat(e),t=[].concat(t)),this.getObjectStore("readwrite",(a=>{const n=e.map(((e,s)=>a.put(t[s],e)));return s?n:n[0]}),"",a)}get(e,t){const a=Array.isArray(e);if(a){if(!e.length)return Promise.resolve([])}else{if(!e)return;e=[].concat(e)}return this.getObjectStore("readonly",(t=>{const s=e.map((e=>t.get(e)));return a?s:s[0]}),"",t)}getObjectStore(e,t,a,s=this.storeName){let n;return a&&(n=performance.now(),this.log(a+": start")),this.idb.openDatabase().then((i=>new Promise(((r,o)=>{const p=i.transaction([s],e),d=()=>{clearTimeout(l),o(p.error)},f=()=>{clearTimeout(l),a&&this.log(a+": end",performance.now()-n);const e=h.map((e=>e.result));r(g?e:e[0])};p.onerror=d;const c="readwrite"===e;c&&(p.oncomplete=()=>f());const l=setTimeout((()=>{this.log.error("transaction not finished",p,a)}),1e4),m=t(p.objectStore(s)),g=Array.isArray(m),h=g?m:[].concat(m);if(c)return;const u=h.length;let y=u;const _=()=>{p.error||--y||f()};for(let e=0;ee.getAll()),"",e)}}},9092:(e,t,a)=>{a.d(t,{r:()=>zs,H:()=>Ws}),a(690),a(4110);var s=a(8630);let n;function i(){return n}function r(e){return n=e}var o=a(1507),p=a(3241),d=a(410),f=a(3206),c=a(1352);class l extends p.Z{constructor(){super(),this.myId=o.NM,this.connectionStatus={},this.premium=!1,this.addEventListener("user_auth",(({id:e})=>{this.myId=e.toPeerId()})),this.addEventListener("premium_toggle_private",(({isNew:e,isPremium:t})=>{this.premium=t,e||this.dispatchEventSingle("premium_toggle",t)})),this.addEventListener("connection_status_change",(e=>{this.connectionStatus[e.name]=e})),this.dispatchEvent=(e,...t)=>{super.dispatchEvent(e,...t),f.Z.getInstance().invokeVoid("event",{name:e,args:t})},c.kC||this.addEventListener("settings_updated",(({settings:e})=>{this.settings=e}))}getConnectionStatus(){return this.connectionStatus}getPremium(){return this.premium}dispatchEventSingle(...e){super.dispatchEvent(...e)}}const m=new l;d.GO.rootScope=m;const g=m;var h=a(7922),u=a(9750);const y=new class{constructor(){this.state={},this.storage=h.Z}getState(){return Promise.resolve(this.state)}setByKey(e,t){!function(e,t,a){const s=t.split(".");(0,u.Z)(e,s.slice(0,-1).join("."))[s.pop()]=a}(this.state,e,t);const a=e.split(".")[0];"settings"===a&&g.dispatchEvent("settings_updated",{key:e,value:t,settings:this.state.settings}),this.pushToState(a,this.state[a])}pushToState(e,t,a=!0,s){a&&(this.state[e]=t),this.setKeyValueToStorage(e,t,s)}setKeyValueToStorage(e,t=this.state[e],a){f.Z.getInstance().invokeVoid("mirror",{name:"state",key:e,value:t}),this.storage.set({[e]:t},a)}};var _=a(4159),v=a(3725),P=a(5418),b=a(1267),M=a(1655),I=a(5003);class S{constructor(e,t,a){this.dcId=e,this.url=t,this.pending=[],this.debug=b.Z.debug&&!1;let s=I.v9.Error|I.v9.Log;this.debug&&(s|=I.v9.Debug),this.log=(0,I.kg)(`HTTP-${e}`+a,s),this.log("constructor"),this.connected=!1}_send(e,t){const a=e.length;return this.debug&&this.log.debug("-> body length to send:",a),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,Z.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 e=this,t=void 0,s=function*(){if(!this.releasing){this.releasing=!0;for(let e=0;e{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=e=>{this.log("closed",e),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 s=I.v9.Error|I.v9.Log;return this.debug&&(s|=I.v9.Debug),this.log=(0,I.kg)(`WS-${e}`+a,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(e){}this.handleClose()}}}function w(e){if(!crypto||!("getRandomValues"in crypto))throw new Error("NO_SECURE_RANDOM");return crypto.getRandomValues(e),e}var k=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 A{constructor(){this._process=(e,t)=>s.Z.invokeCryptoNew({method:"aes-ctr-process",args:[{id:this.id,data:e,operation:t}],transfer:[e.buffer]})}init(e){return k(this,void 0,void 0,(function*(){void 0!==this.idPromise&&this.release();const t=new Uint8Array(64);for(w(t);;){const e=t[3]<<24|t[2]<<16|t[1]<<8|t[0],a=t[7]<<24|t[6]<<16|t[5]<<8|t[4];if(239!==t[0]&&1145128264!==e&&1414745936!==e&&542393671!==e&&1230262351!==e&&4008636142!==e&&3722304989!==e&&0!==a)break;w(t)}const a=t.slice().reverse(),n=t.slice(8,40),i=t.slice(40,56),r=a.slice(8,40),o=a.slice(40,56),p=this.idPromise=s.Z.invokeCrypto("aes-ctr-prepare",{encKey:n,encIv:i,decKey:r,decIv:o});this.process=(e,t)=>k(this,void 0,void 0,(function*(){return yield p,this._process(e,t)})),this.id=yield p,this.process=this._process,t.set(e.obfuscateTag,56);const d=yield this.encode(t.slice());return t.set(d.slice(56,64),56),t}))}encode(e){return this.process(e,"encrypt")}decode(e){return this.process(e,"decrypt")}release(){return k(this,void 0,void 0,(function*(){const e=this.idPromise;if(void 0===e)return;this.id=void 0,this.idPromise=void 0;const t=yield e;s.Z.invokeCrypto("aes-ctr-destroy",t)}))}destroy(){this.release()}}const D=new class{constructor(){this.tag=239,this.obfuscateTag=new Uint8Array([this.tag,this.tag,this.tag,this.tag])}encodePacket(e){const t=e.byteLength>>2;let a;return a=t<127?new Uint8Array([t]):new Uint8Array([127,255&t,t>>8&255,t>>16&255]),a.concat(e)}readPacket(e){let t=e[0];return t>=127?(t=e[1]|e[2]<<8|e[3]<<16,e.slice(4,t<<3)):e.slice(1,t<<3)}};var U=a(9174);function T(e){const t=e.length,a=new Array(t);for(let s=0;sF(this,void 0,void 0,(function*(){this.connected=!0,Z.setTransportOpened("websocket");const e=yield this.obfuscation.init(this.codec);this.connected&&(this.connection.send(e),this.networker&&(this.pending.length=0,this.networker.setConnectionStatus(U.Q.Connected),this.networker.cleanupSent(),this.networker.resend()),setTimeout((()=>{this.releasePending()}),0))})),this.onMessage=e=>F(this,void 0,void 0,(function*(){let t=yield 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(t))})),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(U.Q.Connecting);else for(const e of this.pending)e.bodySent&&(e.bodySent=!1);this.connect()}};let i=I.v9.Error|I.v9.Log;this.debug&&(i|=I.v9.Debug),this.log=(0,I.kg)(`TCP-${t}`+s,i),this.log("constructor"),this.connect()}clear(){this.connected&&Z.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.obfuscation&&this.obfuscation.destroy(),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)}changeUrl(e){this.url!==e&&(this.url=e,this.forceReconnect())}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=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(){var e;return F(this,void 0,void 0,(function*(){if(!this.connected||this.releasingPending)return;this.releasingPending=!0;let t=this.pending.length,a=!1;for(let s=0;s body length to send:",i.length);const r=null!==(e=n.encoded)&&void 0!==e?e:n.encoded=yield this.encodeBody(i);if(!this.connected)break;this.connection.send(r),n.resolve?n.bodySent=!0:(this.pending.splice(s--,1),t--),a=!0}}this.releasingPending=void 0,this.pending.length&&a&&this.releasePending()}))}}const x=b.Z.test?"_test":"";function B(e){return"client"===e?"":"-1"}function V(e,t,a){const s=B(t),n="client"!==t?"apiws"+x+(a?"_premium":""):"apiws"+x;return`wss://${_.Z.suffix.toLowerCase()}ws${e}${s}.web.telegram.org/${n}`}class O{constructor(){this.sslSubdomains=["pluto","venus","aurora","vesta","flora"],this.dcOptions=b.Z.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 s=V(e,t,a);let n;return n=C,new R(n,e,s,"upload"===t?"-U":"download"===t?"-D":"",1e4)},this.transportHTTP=(e,t,a)=>{let s;if(b.Z.ssl||!b.Z.http){const a=B(t);s="https://"+(this.sslSubdomains[e-1]+a)+".web.telegram.org/"+(b.Z.test?"apiw_test1":"apiw1")}else for(const t of this.dcOptions)if(t.id===e){s="http://"+t.host+(80!==t.port?":"+t.port:"")+"/apiw1";break}return new S(e,s,"upload"===t?"-U":"download"===t?"-D":"")}}chooseServer(e,t="client",a=b.Z.transport,s=!0,n){this.chosenServers.hasOwnProperty(a)||(this.chosenServers[a]={client:{},download:{},upload:{}});const i=this.chosenServers[a][t];e in i||(i[e]=[]);const r=i[e];if(!r.length||!s){let i;return i=("websocket"===a?this.transportSocket:this.transportHTTP)(e,t,n),i?(s&&r.push(i),i):(console.error("No chosenServer!",e),null)}return r[0]}static removeTransport(e,t){for(const a in e)for(const s in e[a])for(const n in e[a][s]){const i=e[a][s][n];(0,M.Z)(i,t)}}}var L=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 N extends p.Z{constructor(){super(!0),this.opened=new Map,this.addEventListener("change",(e=>{e.get("websocket")||this.waitForWebSocket()}))}pingTransports(){var e;return L(this,void 0,void 0,(function*(){const t=null!==(e=this.dcConfigurator)&&void 0!==e?e:this.dcConfigurator=new O,a=this.transports={https:t.chooseServer(_.Z.baseDcId,"client","https",!1),websocket:t.chooseServer(_.Z.baseDcId,"client","websocket",!1)},s=(0,v.Z)();this.transports.https._send(new Uint8Array,"no-cors").then((()=>s.resolve(!0)),(()=>s.resolve(!1))),setTimeout((()=>s.resolve(!1)),2e3);const n=(0,v.Z)(),i=a.websocket;i.setAutoReconnect(!1),i.connection.addEventListener("close",(()=>n.resolve(!1)),{once:!0}),i.connection.addEventListener("open",(()=>n.resolve(!0)),{once:!0}),setTimeout((()=>{n.isFulfilled||n.isRejected||(i.connection&&i.connection.close(),n.resolve(!1))}),2e3);const[r,o]=yield Promise.all([s,n]);for(const e in a)a[e].destroy();return{https:r||this.opened.get("https")>0,websocket:o||this.opened.get("websocket")>0}}))}waitForWebSocket(){return L(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(0,P.Z)(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)}}const Z=new N,j=(0,v.Z)();var q=a(6654);class G{setManagers(e){Object.assign(this,e)}}var H=a(3127),W=a(3989),z=a(5466);let K;function J(e){return null!=K?K:K=function(e){return t=this,a=void 0,n=function*(){const t=(0,z.$)((0,I.kg)("STORAGES-LOADER")),a=Object.keys(e),s=a.map((a=>{const s=e[a].getAll();return t(s,"storage "+a)})),n={},i=yield Promise.all(s);for(let e=0,t=a.length;e({storage:this.storages[e],results:t[e]})))},new((s=void 0)||(s=Promise))((function(e,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(r,o)}p((n=n.apply(t,a||[])).next())}));var t,a,s,n}}class Q extends G{getState(){return this.apiManager.invokeApi("account.getPassword").then((e=>e))}updateSettings(e={}){return this.getState().then((t=>{let a,s;const n={password:null,new_settings:{_:"account.passwordInputSettings",hint:e.hint,email:e.email}};a=e.currentPassword?this.cryptoWorker.invokeCrypto("computeSRP",e.currentPassword,t,!1):Promise.resolve({_:"inputCheckPasswordEmpty"});const i=t.new_algo,r=new Uint8Array(i.salt1.length+32);return w(r),r.set(i.salt1,0),i.salt1=r,s=e.newPassword?this.cryptoWorker.invokeCrypto("computeSRP",e.newPassword,t,!0):Promise.resolve(new Uint8Array),Promise.all([a,s]).then((e=>(n.password=e[0],n.new_settings.new_algo=i,n.new_settings.new_password_hash=e[1],this.apiManager.invokeApi("account.updatePasswordSettings",n))))}))}getInputCheckPassword(e,t){return this.cryptoWorker.invokeCrypto("computeSRP",e,t,!1)}check(e,t,a={}){return this.getInputCheckPassword(e,t).then((e=>this.apiManager.invokeApi("auth.checkPassword",{password:e},a).then((e=>("auth.authorization"===e._&&this.apiManager.setUser(e.user),e)))))}confirmPasswordEmail(e){return this.apiManager.invokeApi("account.confirmPasswordEmail",{code:e})}resendPasswordEmail(){return this.apiManager.invokeApi("account.resendPasswordEmail")}cancelPasswordEmail(){return this.apiManager.invokeApi("account.cancelPasswordEmail")}}var Y=a(6848),X=a(5471);class ee extends G{constructor(){super(...arguments),this.contexts=new Map,this.links={},this.log=(0,I.kg)("RD",void 0,!0)}saveContext(e,t,a){[a,e]=this.getContexts(e),a||(a=new Set,this.contexts.set(e,a)),this.links[T(e)]=e;for(const e of a)if((0,Y.Z)(e,t))return;a.add(t)}getReferenceByLink(e){return this.links[T(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((0,Y.Z)(s,t))return a.delete(s),a.size||(this.contexts.delete(e),delete this.links[T(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=this.appMessagesManager.reloadMessages(t.peerId,t.messageId,!0);break;case"emojiesSounds":a=this.refreshEmojiesSoundsPromise||this.appStickersManager.getAnimatedEmojiSounds(!0).then((()=>{this.refreshEmojiesSoundsPromise=void 0}));break;case"userFull":a=Promise.resolve(this.appProfileManager.getProfile(t.userId,!0));break;case"customEmoji":a=this.appEmojiManager.getCustomEmojiDocuments([t.docId]);break;case"attachMenuBotIcon":a=this.appAttachMenuBotsManager.getAttachMenuBot(t.botId,!0);break;case"wallPaper":a=this.appThemesManager.getWallPaperById(t.wallPaperId);break;default:return this.log.warn("refreshReference: not implemented context",t),Promise.reject()}const s=T(e);return this.log("refreshReference: refreshing reference:",s),a.then((()=>{const a=T(e);if(this.log("refreshReference: refreshed, reference before:",s,"after:",a),s!==a)return e;this.deleteContext(e,t);const n=this.getContext(e);if(n)return this.refreshReference(e,n[0]);throw this.log.error("refreshReference: no new context, reference before:",s,"after:",a,t),(0,X.Z)("NO_NEW_CONTEXT")}))}}var te=a(7298),ae=a(7381),se=a(252),ne=a(7625),ie=a(6519);function re(e,t){if(!e)return t;for(var a in e)t.hasOwnProperty(a)||delete e[a];for(var a in t)e[a]=t[a];return e}var oe=a(2790),pe=a(3781),de=a(3385),fe=a(5880),ce=a(8050),le=a(2946);function me(e){var t,a;const s=[e.fromId,e.viaBotId,e.fwdFromId],n=e.media;if(n){const e=n.user_id;void 0!==e&&s.push(e.toPeerId());const t=n.results,a=null==t?void 0:t.recent_voters;(null==a?void 0:a.length)&&s.push(...a.map((e=>e.toPeerId())))}const i=null===(t=e.reactions)||void 0===t?void 0:t.recent_reactions;(null==i?void 0:i.length)&&s.push(...i.map((e=>(0,le.Z)(e.peer_id))));const r=e.action;if(r){const e=[...r.users||[],r.user_id,r.inviter_id];s.push(...e.filter(Boolean).map((e=>e.toPeerId())));const t=[r.channel_id,r.chat_id];s.push(...t.filter(Boolean).map((e=>e.toPeerId(!0))))}const o=null===(a=e.replies)||void 0===a?void 0:a.recent_repliers;return(null==o?void 0:o.length)&&s.push(...o.map((e=>(0,le.Z)(e)))),new Set(s.filter(Boolean))}var ge=a(8027);function he(e,t,a){return e[t]=a}var ue=a(8938);const ye=void 0;class _e extends G{constructor(){super(...arguments),this.clear=(e=!1)=>{if(e){this.allDialogsLoaded={},this.pinnedOrders={};for(const e of o.DZ)this.pinnedOrders[e]=[]}else{this.storage.clear(),this.allDialogsLoaded={},this.saveAllDialogsLoaded(),this.pinnedOrders=Object.assign({},this.pinnedOrders);for(const e of o.DZ)this.resetPinnedOrder(e);this.savePinnedOrders()}this.forumTopics=new Map,this.folders={},this.dialogsOffsetDate={},this.dialogsNum=0,this.dialogsIndex=new ae.Z({clearBadChars:!0,ignoreCase:!0,latinize:!0,includeTag:!0}),this.cachedResults={query:"",count:0,dialogs:[],folderId:0}},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({dialog:i})),this.appMessagesManager.scheduleHandleNewDialogs(n,i)}))},this.onUpdateDialogPinned=e=>{var t;const a=null!==(t=e.folder_id)&&void 0!==t?t:o.J$,s=this.appPeersManager.getPeerId(e.peer.peer),n=this.getDialogOnly(s);this.handleDialogTogglePinned(n,e.pFlags.pinned,a)},this.onUpdateChannelPinnedTopic=e=>{const t=e.channel_id.toPeerId(!0),a=(0,pe.Z)(e.topic_id),s=this.getForumTopic(t,a);s&&this.handleDialogTogglePinned(s,e.pFlags.pinned,this.getFilterIdForForum(s))},this.onUpdatePinnedDialogs=e=>{var t;const a=null!==(t=e.folder_id)&&void 0!==t?t:o.J$;e.order?this.handleDialogsPinned(a,e.order.map((e=>this.appPeersManager.getPeerId(e.peer)))):this.apiManager.invokeApi("messages.getPinnedDialogs",{folder_id:a}).then((e=>{this.applyDialogs(e),this.handleDialogsPinned(a,e.dialogs.map((e=>e.peerId)))}))},this.onUpdateChannelPinnedTopics=e=>{return t=this,a=void 0,n=function*(){const t=e.channel_id.toPeerId(!0);if(!this.forumTopics.get(t))return;const a=t;if(e.order){const t=e.order.map((e=>(0,pe.Z)(e)));this.handleDialogsPinned(a,t)}else{const e=yield this.apiManager.getLimit("topicPin",!0),s=this.apiManager.invokeApi("channels.getForumTopics",{channel:this.appChatsManager.getChannelInput(t.toChatId()),limit:e,offset_date:0,offset_id:0,offset_topic:0}),n=(yield this.processTopics(t,s)).topics.filter((e=>e.pFlags.pinned));this.handleDialogsPinned(a,n.map((e=>e.id)))}},new((s=void 0)||(s=Promise))((function(e,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(r,o)}p((n=n.apply(t,a||[])).next())}));var t,a,s,n}}after(){this.clear(!0),this.rootScope.addEventListener("language_change",(()=>{const e=this.appUsersManager.getSelf().id.toPeerId(!1);if(this.getDialogOnly(e)){const t=this.appPeersManager.getPeerSearchText(e);this.dialogsIndex.indexObject(e,t)}}));const e=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=this.getDialogIndexKeyByFilterId(e.id);for(let e=0;e{this.processChangedUnreadOrUnmuted(e.peerId)})),this.rootScope.addEventListener("chat_update",(e=>{const t=this.appChatsManager.getChat(e),a=e.toPeerId(!0);t.pFlags.left&&this.getDialogOnly(a)&&this.dropDialogOnDeletion(a)})),this.rootScope.addEventListener("chat_toggle_forum",(({chatId:e,enabled:t})=>{const a=e.toPeerId(!0);t||this.flushForumTopicsCache(a),this.processChangedUnreadOrUnmuted(a)})),this.apiUpdatesManager.addMultipleEventsListeners({updateFolderPeers:this.onUpdateFolderPeers,updateDialogPinned:this.onUpdateDialogPinned,updateChannelPinnedTopic:this.onUpdateChannelPinnedTopic,updatePinnedDialogs:this.onUpdatePinnedDialogs,updateChannelPinnedTopics:this.onUpdateChannelPinnedTopics}),Promise.all([this.appStateManager.getState(),this.appStoragesManager.loadStorage("dialogs")]).then((([e,{results:t,storage:a}])=>{this.storage=a,this.dialogs=this.storage.getCache();for(const t of o.DZ){const a=e.pinnedOrders[t];if(!a)continue;const s=this.getPinnedOrders(t);s.splice(0,s.length,...a)}t.length&&W.Z.freezeSaving(this.setDialogsFromState.bind(this,t),["chats","dialogs","messages","users"]),this.allDialogsLoaded=e.allDialogsLoaded||{},t.length&&this.appDraftsManager.addMissedDialogs()}))}setDialogsFromState(e){for(let t=0,a=e.length;tthis.allDialogsLoaded[e]))&&(this.allDialogsLoaded[void 0]=!0),this.saveAllDialogsLoaded())}saveAllDialogsLoaded(){this.appStateManager.pushToState("allDialogsLoaded",this.allDialogsLoaded)}handleDialogUnpinning(e,t){delete e.pFlags.pinned,(0,M.Z)(this.getPinnedOrders(t),this.isFilterIdForForum(t)?e.id:e.peerId),this.savePinnedOrders()}savePinnedOrders(){this.appStateManager.pushToState("pinnedOrders",this.pinnedOrders)}resetPinnedOrder(e){this.getPinnedOrders(e).length=0}getPinnedOrders(e){let t=this.pinnedOrders[e];return!t&&this.isFilterIdForForum(e)&&((0,ge.Z)(this.pinnedOrders,[e]),t=this.pinnedOrders[e]=[]),t}isDialogPinned(e,t){const a=this.filtersStorage.getFilter(t);let s;return s=a?-1!==a.pinnedPeerIds.indexOf(e):!!this.getDialogOnly(e).pFlags.pinned,s}getOffsetDate(e){const t=this.dialogsOffsetDate[e]||0;return e!==ye||t?t:Math.min(...Array.from(o.DZ).sort(((e,t)=>e-t)))}generateFolder(e){const t={dialogs:[],id:e,unreadMessagesCount:0,unreadPeerIds:new Set,unreadUnmutedPeerIds:new Set};return(0,ge.Z)(t,["dispatchUnreadTimeout"]),t}getFolder(e){var t,a;return null!==(t=(a=this.folders)[e])&&void 0!==t?t:a[e]=this.generateFolder(e)}isFilterIdForForum(e){return e&&e<0}getFilterIdForForum(e){return e.peerId}getDialogKey(e){return this.isTopic(e)?e.id:e.peerId}getFolderDialogs(e,t=!0){if(e===ye)return this.getCachedDialogs(t);const a=this.getFolder(e);return this.isFilterIdForForum(e)?t?a.dialogs.filter((e=>!e.pFlags.hidden)):a.dialogs:t?a.dialogs.filter((e=>void 0===e.migratedTo)):a.dialogs}getNextDialog(e,t,a){const s=this.getFolderDialogs(a,!0);let n;if(e){const a=s.findIndex((t=>t.peerId===e));-1!==a&&(n=s[t?a+1:a-1])}else t&&(n=s[0]);return n}getDialogIndexKeyByFilterId(e){if(this.isFilterIdForForum(e))return(0,de.Z)();if(o.DZ.has(e))return(0,de.Z)(e);const t=this.filtersStorage.getFilter(e);return(0,de.Z)(t.localId)}isDialogUnmuted(e){return!this.appNotificationsManager.isPeerLocalMuted({peerId:e.peerId,respectType:!0,threadId:this.isTopic(e)?e.id:void 0})}getFolderUnreadCount(e){const t=this.getFolder(e);return{unreadUnmutedCount:t.unreadUnmutedPeerIds.size,unreadCount:t.unreadPeerIds.size}}getCachedDialogs(e){const t=Array.from(o.DZ).map((t=>this.getFolderDialogs(t,e)));return[].concat(...t)}setDialogIndexInFilter(e,t,a){var s,n;let i;const r=this.isTopic(e),p=r||o.DZ.has(a.id);if(this.filtersStorage.testDialogForFilter(e,a)){const t=r?this.getPinnedOrders(this.getFilterIdForForum(e)):a.pinnedPeerIds,o=this.getDialogKey(e),d=t.indexOf(o);i=-1!==d?this.generateDialogIndex(this.generateDialogPinnedDateByIndex(t.length-1-d),!0):(null===(s=e.pFlags)||void 0===s?void 0:s.pinned)||p?this.generateIndexForDialog(e,!0,void 0,!p):null!==(n=(0,ce.Z)(e))&&void 0!==n?n:this.generateIndexForDialog(e,!0)}return he(e,t,i)}getDialog(e,t,a,s=!0){const n=[];a&&(t=e),void 0===t?n.push(...Array.from(o.DZ).map((e=>this.getFolder(e).dialogs))):n.push(this.getFolderDialogs(t,!1));const i=a?e=>e.id===a:t=>t.peerId===e;for(const e of n){let t=0,a=0;for(let n=e.length;tt.id===e.id:t=>t.peerId===e.peerId,d=r.findIndex(p),f=r[d],c=this.getDialogIndex(f,i);a&&n>o.Zi&&(a=void 0);const l=a?void 0:this.setDialogIndexInFilter(e,i,t);return c!==l&&(!!c!=!!l&&this.prepareFolderUnreadCountModifyingByDialog(n,e,!!l),-1!==d&&r.splice(d,1),l&&(0,ie.Z)(r,e,(e=>this.getDialogIndex(e,i)),-1),!0)}prepareDialogUnreadCountModifying(e,t){const a=this.isTopic(e),s=[],n=a?this.getFilterIdForForum(e):e.folder_id;if(s.push(this.prepareFolderUnreadCountModifyingByDialog(n,e,t)),!a){const a=this.filtersStorage.getFilters();for(const n in a){const i=a[n];this.filtersStorage.testDialogForFilter(e,i)&&s.push(this.prepareFolderUnreadCountModifyingByDialog(i.id,e,t))}}return()=>!t&&s.forEach((e=>e()))}prepareFolderUnreadCountModifyingByDialog(e,t,a){const s=this.appMessagesManager.getDialogUnreadCount(t),n=this.isDialogUnmuted(t);if(void 0===a)return()=>{const a=this.appMessagesManager.getDialogUnreadCount(t),n=this.isDialogUnmuted(t),i=a-s;this.modifyFolderUnreadCount(e,i,!!a,a&&n,t)};{const i=a?s:-s;this.modifyFolderUnreadCount(e,i,!!s,s&&n,t)}}modifyFolderUnreadCount(e,t,a,s,n){var i;const{peerId:r}=n,o=this.appPeersManager.isForum(r),p=this.isTopic(n);if(o&&!p){const i=this.getForumUnreadCount(r);if(i instanceof Promise)return void i.then((({count:t,hasUnmuted:a})=>{n=this.getDialogOnly(r);const s=this.getFolder(e);n&&this.appPeersManager.isForum(r)&&s&&s.dialogs.some((e=>e.peerId===r))&&this.modifyFolderUnreadCount(e,0,!1,!1,n)}));t=0,a=i.count>0,s=i.hasUnmuted}const d=this.getFolder(e);t&&(d.unreadMessagesCount=Math.max(0,d.unreadMessagesCount+t));const f=this.getDialogKey(n);a?d.unreadPeerIds.add(f):d.unreadPeerIds.delete(f),s?d.unreadUnmutedPeerIds.add(f):d.unreadUnmutedPeerIds.delete(f),null!==(i=d.dispatchUnreadTimeout)&&void 0!==i||(d.dispatchUnreadTimeout=E.Z.setTimeout((()=>{d.dispatchUnreadTimeout=void 0;const e=Object.assign({},d);delete e.dialogs,this.rootScope.dispatchEvent("folder_unread",e),p&&this.processChangedUnreadOrUnmuted(r)}),0))}processChangedUnreadOrUnmuted(e){const t=this.getDialogOnly(e);t&&(this.processDialogForFilters(t),this.prepareDialogUnreadCountModifying(t)(),this.rootScope.dispatchEvent("dialog_unread",{peerId:e,dialog:t}))}generateIndexForDialog(e,t,a,s){var n;if(!t)return;const i=this.isTopic(e);let r,o=0;if(e.pFlags.hidden)o=this.generateDialogPinnedDateByIndex(4095),r=!0;else if(e.pFlags.pinned&&!s)o=this.generateDialogPinnedDate(e),r=!0;else{if(a||(a=this.appMessagesManager.getMessageByPeer(e.peerId,e.top_message)),o=(null==a?void 0:a.date)||o,!i){const t=this.appPeersManager.isChannel(e.peerId)&&e.peerId.toChatId();if(t){const e=this.appChatsManager.getChat(t);(!o||e.date&&e.date>o)&&(o=e.date)}}"draftMessage"===(null===(n=e.draft)||void 0===n?void 0:n._)&&e.draft.date>o&&(o=e.draft.date)}o||(o=(0,te.Z)(!0));const p=this.generateDialogIndex(o,r);if(t)return p;he(e,(0,de.Z)(e.folder_id),p)}generateDialogPinnedDateByIndex(e){return 2147418112+(65535&e)}generateDialogPinnedDate(e){const t=this.isTopic(e),a=this.getPinnedOrders(t?this.getFilterIdForForum(e):e.folder_id),s=this.getDialogKey(e);let n=a.indexOf(s);return-1===n&&(a.unshift(s),n=0,t||this.savePinnedOrders()),this.generateDialogPinnedDateByIndex(a.length-1-n)}setDialogToState(e){if(this.isTopic(e))return;const{peerId:t,pts:a}=e,s=this.appMessagesManager.getHistoryStorage(t),n=this.appMessagesManager.getHistoryMessagesStorage(t),i=s.history.slice;let r;for(let e=0,a=i.length;e{"dialogFolder"===t._&&e.dialogs.splice(a,1)})),(0,ue.Z)(s),this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.appMessagesManager.saveMessages(e.messages);const n=new Map;s.forEach((e=>{var t,s;const i=this.appPeersManager.getPeerId(e.peer);let r=e.top_message;const o=this.appMessagesManager.pendingTopMsgs[i];if(o){const t=this.appMessagesManager.getMessageByPeer(i,o),a=this.appMessagesManager.getMessageByPeer(i,r);(!r||t&&(!a||(null==t?void 0:t.date)>(null==a?void 0:a.date)))&&(e.top_message=r=o,this.appMessagesManager.getHistoryStorage(i).maxId=o)}if(r||"draftMessage"===(null===(t=e.draft)||void 0===t?void 0:t._)){if(this.saveDialog({dialog:e})){const t=(e=>{let t=n.get(e);return t||n.set(e,t={}),t})(i);a?(null!==(s=t.topics)&&void 0!==s?s:t.topics=new Map).set(e.id,e):t.dialog=e}}else this.dropDialogWithEvent(i,a?this.getDialogKey(e):void 0);const p=this.appMessagesManager.getUpdateAfterReloadKey(i,a?this.getDialogKey(e):void 0),d=this.appMessagesManager.newUpdatesAfterReloadToHandle[p];if(void 0!==d){for(const e of d)d.delete(e),this.apiUpdatesManager.saveUpdate(e);d.size||delete this.appMessagesManager.newUpdatesAfterReloadToHandle[p]}})),n.size&&this.rootScope.dispatchEvent("dialogs_multiupdate",n)}getDialogOffsetDate(e){const t=this.appMessagesManager.getMessageByPeer(e.peerId,e.top_message);return(null==t?void 0:t.date)||0}canSaveDialogByPeerId(e){if(e.isAnyChat()){const t=this.appChatsManager.getChat(e.toChatId());if("channelForbidden"===t._||t.pFlags.left)return!1}return!0}saveDialog({dialog:e,folderId:t,ignoreOffsetDate:a,saveGlobalOffset:s}){var n,i;const r=this.isTopic(e),p=!r,d=r?e.id=(0,pe.Z)(e.id):void 0;r||null!=t||(t=null!==(n=e.folder_id)&&void 0!==n?n:o.J$);const f=this.appPeersManager.getPeerId(e.peer);if(!f)return console.error("saveConversation no peerId???",e,t),!1;if(r||"dialog"===e._||console.error("saveConversation not regular dialog",e,Object.assign({},e)),p&&!this.canSaveDialogByPeerId(f))return!1;const c=this.appPeersManager.isChannel(f)?f.toChatId():o.NM;if(p){const e=this.appPeersManager.getPeerSearchText(f);this.dialogsIndex.indexObject(f,e)}const l=this.getDialogOrTopic(f,d);let m,g;if(e.top_message){m=(0,pe.Z)(e.top_message);const t=(null==l?void 0:l.top_message)&&this.appMessagesManager.getMessageByPeer(f,l.top_message);(null===(i=null==t?void 0:t.pFlags)||void 0===i?void 0:i.is_outgoing)&&l.top_message>=m&&(m=l.top_message),g=this.appMessagesManager.getMessageByPeer(f,m)}else m=this.appMessagesManager.generateTempMessageId(f),g={_:"message",id:m,mid:m,from_id:this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId(!1)),peer_id:this.appPeersManager.getOutputPeer(f),deleted:!0,pFlags:{out:!0},date:0,message:""},this.appMessagesManager.saveMessages([g],{isOutgoing:!0});if((null==g?void 0:g.pFlags)||this.appMessagesManager.log.error("saveConversation no message:",e,g),p&&!c&&f.isAnyChat()){const t=this.appChatsManager.getChat(f.toChatId());if(t&&t.migrated_to&&t.pFlags.deactivated){const a=this.appPeersManager.getPeerId(t.migrated_to);this.appMessagesManager.migratedFromTo[f]=a,this.appMessagesManager.migratedToFrom[a]=f,e.migratedTo=a}}if(e.top_message=m,e.read_inbox_max_id=(0,pe.Z)(l&&!e.read_inbox_max_id?l.read_inbox_max_id:e.read_inbox_max_id),e.read_outbox_max_id=(0,pe.Z)(l&&!e.read_outbox_max_id?l.read_outbox_max_id:e.read_outbox_max_id),p&&void 0===e.folder_id&&"dialog"===e._&&(e.folder_id=l?l.folder_id:t),e.draft=this.appDraftsManager.saveDraft({peerId:f,threadId:d,draft:e.draft}),e.peerId=f,g&&g.pFlags.is_outgoing){const t=g.pFlags.out;m>e[t?"read_outbox_max_id":"read_inbox_max_id"]?(g.pFlags.unread=!0,e.unread_count||t||++e.unread_count):delete g.pFlags.unread}const h=this.appMessagesManager.getHistoryStorage(f,d),u=h.history.slice;if(u.length?u.isEnd(se.D.Bottom)||(h.history.insertSlice([m]).setEnd(se.D.Bottom),h.count||(h.count=1),this.appMessagesManager.mergeReplyKeyboard(h,g)&&this.rootScope.dispatchEvent("history_reply_markup",{peerId:f})):(h.history.unshift(m),h.count||(h.count=1),this.appMessagesManager.mergeReplyKeyboard(h,g)&&this.rootScope.dispatchEvent("history_reply_markup",{peerId:f})),h.maxId=m,h.readMaxId=e.read_inbox_max_id,h.readOutboxMaxId=e.read_outbox_max_id,this.appNotificationsManager.savePeerSettings({peerId:f,threadId:r?e.id:void 0,settings:e.notify_settings}),p&&c&&e.pts&&this.apiUpdatesManager.addChannelState(c,e.pts),this.generateIndexForDialog(e),l){const t=this.dialogsStorage.prepareDialogUnreadCountModifying(l);re(l,e),t()}return this.pushDialog({dialog:e,offsetDate:null==g?void 0:g.date,ignoreOffsetDate:a,saveGlobalOffset:s}),r&&this.processTopicUpdate(e,l),!0}processTopicUpdate(e,t){if(!t)return;const{peerId:a,id:s}=e,n=e.icon_emoji_id!==t.icon_emoji_id,i=e.title!==t.title,r=n||i;n&&this.rootScope.dispatchEvent("avatar_update",{peerId:a,threadId:s}),r&&this.rootScope.dispatchEvent("peer_title_edit",{peerId:a,threadId:s})}getDialogs(e){const{query:t="",offsetIndex:a,limit:s=20,filterId:n=o.J$,skipMigrated:i=!1}=e,r=this.isFilterIdForForum(n);if(!r&&!o.DZ.has(n)){const t=[],a=this.appUsersManager.fillContacts();a.cached||t.push(a.promise);const s=this.filtersStorage.reloadMissingPeerIds(n);if(s&&t.push(s),t.length)return Promise.all(t).then((()=>this.getDialogs(e)))}const p=o.DZ.has(n)&&!this.getOffsetDate(n)||r?n:ye;let d=this.getFolderDialogs(n,i);const f=this.getDialogIndexKeyByFilterId(n);if(t&&!r){if(!s||this.cachedResults.query!==t||this.cachedResults.folderId!==n){this.cachedResults.query=t,this.cachedResults.folderId=n;const e=this.dialogsIndex.search(t),a=[];for(const t in this.dialogs){const s=this.dialogs[t];e.has(s.peerId)&&s.folder_id===n&&a.push(s)}a.sort(((e,t)=>this.getDialogIndex(t,f)-this.getDialogIndex(e,f))),this.cachedResults.dialogs=a,this.cachedResults.count=a.length}d=this.cachedResults.dialogs}else this.cachedResults.query="";let c=0;if(a>0)for(let e=d.length;cthis.getDialogIndex(d[c],f));++c);const l=this.isDialogsLoaded(p),m=d.length>=c+s;if(t||l||m){const e=d.slice(c,c+s);return{dialogs:e,count:l?d.length:null,isTopEnd:d.length&&(e[0]&&e[0]===d[0]||this.getDialogIndex(d[0],f)=d.length}}return this.appMessagesManager.getTopMessages({limit:s,folderId:p}).then((e=>{if(i&&(d=this.getFolderDialogs(n,i)),c=0,a>0)for(let e=d.length;cthis.getDialogIndex(d[c],f));++c);const t=d.slice(c,c+s);return{dialogs:t,count:void 0===e.count?d.length:e.count,isTopEnd:d.length&&(t[0]&&t[0]===d[0]||this.getDialogIndex(d[0],f){const t={},a=[];for(const[e,n]of s.getTopicPromises)t[e]=n,a.push((0,oe.Z)(e));s.getTopicPromises.clear();const n=()=>{for(const e in t)t[e].resolve(void 0),s.deletedTopics.add(+e)};if(this.getForumTopicsCache(e)===s)return this.apiManager.invokeApi("channels.getForumTopicsByID",{channel:this.appChatsManager.getChannelInput(e.toChatId()),topics:a}).then((a=>{if(this.getForumTopicsCache(e)===s)return this.applyDialogs(a,e),a.topics.forEach((a=>{"forumTopic"===a._&&(t[a.id].resolve(a),delete t[e])})),a}),(()=>{})).then((()=>{n(),s.getTopicsPromise=void 0,s.getTopicPromises.size&&this.getForumTopicById(e)}));n()}))),n||s.getTopicsPromise}getForumTopic(e,t){var a;const s=this.forumTopics.get(e);return null===(a=null==s?void 0:s.topics)||void 0===a?void 0:a.get(t)}getForumTopicOrReload(e,t){var a;const s=this.getForumTopic(e,t);if(s)return s;const n=this.getForumTopicsCache(e);return(null===(a=null==n?void 0:n.deletedTopics)||void 0===a?void 0:a.has(t))?void 0:this.getForumTopicById(e,t)}processTopics(e,t){return(0,q.Z)(t,(t=>{"pts"in t&&this.apiUpdatesManager.addChannelState(e.toChatId(),t.pts);const a=this.appPeersManager.getOutputPeer(e);return t.topics=t.topics.map((e=>{if("forumTopicDeleted"!==e._)return e.peer=a,e.id=(0,pe.Z)(e.id),e})).filter(Boolean),t}))}processTopicsPromise(e,t){return t.then((t=>(this.processTopics(e,t),t)))}getForumUnreadCount(e){if(!this.appPeersManager.isForum(e))return;const t=this.getFolder(e),a=t.dialogs.length>=20||this.isDialogsLoaded(e)?t.dialogs.slice(0,20):(0,q.Z)(this.getDialogs({filterId:e,limit:20}),(e=>e.dialogs));return(0,q.Z)(a,(e=>({count:e.reduce(((e,t)=>e+ +!!t.unread_count),0),hasUnmuted:e.some((e=>e.unread_count&&this.isDialogUnmuted(e)))})))}handleDialogTogglePinned(e,t,a){e&&(t?e.pFlags.pinned=!0:this.handleDialogUnpinning(e,a),this.generateIndexForDialog(e)),this.appMessagesManager.scheduleHandleNewDialogs(e.peerId,e)}handleDialogsPinned(e,t){const a=this.isFilterIdForForum(e);this.resetPinnedOrder(e),this.getPinnedOrders(e).push(...t),this.savePinnedOrders(),t.reverse();const s={};t.forEach((t=>{s[t]=!0;const n=a?e:t,i=a?t:void 0,r=this.getDialogOrTopic(n,i);this.appMessagesManager.scheduleHandleNewDialogs(n,r),r&&(r.pFlags.pinned=!0,this.generateIndexForDialog(r))}));const n=this.getFolderDialogs(e,!1);for(const e of n){if(!e.pFlags.pinned)break;s[this.getDialogKey(e)]||(delete e.pFlags.pinned,this.generateIndexForDialog(e),this.appMessagesManager.scheduleHandleNewDialogs(e.peerId,e))}}}var ve=a(8479),Pe=a(4064),be=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 Me=[["pinned_peers","pinnedPeerIds"],["exclude_peers","excludePeerIds"],["include_peers","includePeerIds"]],Ie=o.DZ.size,Se={_:"dialogFilter",pFlags:{},flags:0,id:0,title:"",exclude_peers:[],include_peers:[],pinned_peers:[],excludePeerIds:[],includePeerIds:[],pinnedPeerIds:[]};class Ce extends G{constructor(){super(...arguments),this.clear=e=>{if(e){this.filters={},this.filtersArr=[],this.reloadedPeerIds=new Set,this.localFilters={};for(const e of o.DZ)this.localFilters[e]=this.generateLocalFilter(e)}else this.reloadedPeerIds.clear(),this.clearFilters();this.localId=o.Gu},this.onUpdateDialogFilter=e=>{e.filter?this.saveDialogFilter(e.filter):this.filters[e.id]&&(this.rootScope.dispatchEvent("filter_delete",this.filters[e.id]),delete this.filters[e.id],(0,Pe.Z)(this.filtersArr,(t=>t.id===e.id))),this.pushToState()},this.onUpdateDialogFilters=e=>{const t=(0,ve.Z)(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))})}))},this.onUpdateDialogFilterOrder=e=>{const t=e.order.slice();t.includes(o.Zi)||t.splice(t[0]===o.J$?1:0,0,o.Zi),this.localId=o.Gu,t.forEach((e=>{const t=this.filters[e];delete t.localId,this.setLocalId(t)})),this.rootScope.dispatchEvent("filter_order",t),this.pushToState()}}after(){return this.clear(!0),this.apiUpdatesManager.addMultipleEventsListeners({updateDialogFilter:this.onUpdateDialogFilter,updateDialogFilters:this.onUpdateDialogFilters,updateDialogFilterOrder:this.onUpdateDialogFilterOrder}),this.rootScope.addEventListener("premium_toggle",(()=>{this.onUpdateDialogFilters({_:"updateDialogFilters"})})),this.appStateManager.getState().then((e=>{this.prependFilters(e.filtersArr).map((e=>{this.saveDialogFilter(e,!1,!0)}))}))}prependFilters(e){e=e.slice();const t=this.localFilters[o.J$],a=this.localFilters[o.Zi],s=e.findIndex((e=>"dialogFilterDefault"===e._||e.id===o.J$));return-1!==s?e[s]=t:e.unshift(t),(0,Pe.Z)(e,(e=>e.id===o.Zi)),e.splice(e[0]===t?1:0,0,a),this.localId=o.Gu,e.forEach((e=>{delete e.localId})),e}generateLocalFilter(e){const t=Object.assign(Object.assign({},(0,ve.Z)(Se)),{id:e});return e===o.J$?t.pFlags.exclude_archived=!0:e===o.Zi&&(t.pFlags.exclude_unarchived=!0),o.DZ.has(e)&&(t.pinnedPeerIds=this.dialogsStorage.getPinnedOrders(e)),t}pushToState(){this.appStateManager.pushToState("filtersArr",this.filtersArr)}testDialogForFilter(e,t){if(!t)return!0;if(o.DZ.has(t.id))return e.folder_id===t.id&&this.dialogsStorage.canSaveDialogByPeerId(e.peerId);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&&e.folder_id===o.Zi)return!1;if(s.exclude_read&&!this.appMessagesManager.isDialogUnread(e))return!1;if(s.exclude_muted&&this.appNotificationsManager.isPeerLocalMuted({peerId: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]}getFilters(){return this.filters}clearFilters(){const e=this.getFilters();for(const t in e)o.DZ.has(+t)||this.onUpdateDialogFilter({_:"updateDialogFilter",id:+t})}toggleDialogPin(e,t){return be(this,void 0,void 0,(function*(){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>=(yield this.apiManager.getConfig()).pinned_infolder_count_max)return Promise.reject((0,X.Z)("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=(0,ve.Z)(e)).id=a+1,this.updateDialogFilter(e,void 0,t)}updateDialogFilter(e,t=!1,a=!1){const s=t?0:1;return this.apiManager.invokeApi("messages.updateDialogFilter",{flags:s,id:e.id,filter:t?void 0:this.getOutputDialogFilter(e)}).then((s=>{if(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.localId,t.push(a)}e.localId=o.Gu;const a=t.sort(((e,t)=>e.localId-t.localId)).map((e=>e.id));this.onUpdateDialogFilterOrder({_:"updateDialogFilterOrder",order:a})}}))}updateDialogFiltersOrder(e){return this.apiManager.invokeApi("messages.updateDialogFiltersOrder",{order:e}).then((()=>{this.onUpdateDialogFilterOrder({_:"updateDialogFilterOrder",order:e})}))}getOutputDialogFilter(e){const t=(0,ve.Z)(e);return this.filterIncludedPinnedPeers(e),t}filterIncludedPinnedPeers(e){(0,ne.Z)(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=this.getFilter(e),s=null==a?void 0:a[t];if(!(null==s?void 0:s.length))return;const n=s.filter((e=>{const t=this.appPeersManager.getPeerId(e),a=this.reloadedPeerIds.has(t),s=this.appMessagesManager.getDialogOnly(t);return!a&&!s}));if(!n.length)return;const i=n.map((e=>{const t=this.appPeersManager.getPeerId(e);return this.appMessagesManager.reloadConversation(e).then((e=>(this.reloadedPeerIds.add(t),e?void 0:t)))}));return Promise.all(i).then((e=>{(e=e.filter(Boolean)).length}))}getDialogFilters(e=!1){return be(this,void 0,void 0,(function*(){const t=Object.keys(this.filters);if(t.length>Ie&&!e)return t.map((e=>this.filters[e])).sort(((e,t)=>e.localId-t.localId));const a=yield this.apiManager.invokeApiSingle("messages.getDialogFilters");return this.prependFilters(a).map((t=>this.saveDialogFilter(t,e))).filter(Boolean)}))}getSuggestedDialogsFilters(){return this.apiManager.invokeApi("messages.getSuggestedDialogFilters")}saveDialogFilter(e,t=!0,a){"dialogFilterDefault"===e._&&(e=this.localFilters[o.J$]),(0,ue.Z)(e),o.DZ.has(e.id)||(Me.forEach((([t,a])=>{(0,ue.Z)(e),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 s=this.filters[e.id];return s?Object.assign(s,e):this.filters[e.id]=e,this.setLocalId(e),a||(t?this.rootScope.dispatchEvent("filter_update",e):s||this.rootScope.dispatchEvent("filter_new",e)),e}setLocalId(e){void 0!==e.localId?e.localId>=this.localId&&(this.localId=e.localId+1):(e.localId=this.localId++,(0,Pe.Z)(this.filtersArr,(t=>t.id===e.id)),this.filtersArr.push(e),this.pushToState())}isFilterIdAvailable(e){return be(this,void 0,void 0,(function*(){if(o.DZ.has(e))return!0;const t=yield this.apiManager.getLimit("folders");return this.filtersArr.filter((e=>!o.DZ.has(e.id))).slice(0,t).some((t=>t.id===e))}))}}var we=a(6690),ke=a(2821);function Ae(e,t){t.forEach((t=>{Object.getOwnPropertyNames(t.prototype).forEach((a=>{const s=Object.getOwnPropertyDescriptor(t.prototype,a)||Object.create(null);"constructor"!==a&&Object.defineProperty(e.prototype,a,s)}))}))}class De{constructor(){this.updatesState={pendingPtsUpdates:[],pendingSeqUpdates:{},syncPending:null,syncLoading:null},this.channelStates={},this.attached=!1,this.log=(0,I.kg)("UPDATES",I.v9.Error|I.v9.Warn|I.v9.Log),this.debug=d.ZP,this.subscriptions={},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":{(0,ue.Z)(e),this.debug&&this.log.debug("updateShortMessage | updateShortChatMessage",Object.assign({},e));const t=e.pFlags.out,s=e.from_id||(t?this.appPeersManager.peerId:e.user_id),n=e.chat_id?e.chat_id.toPeerId(!0):e.user_id.toPeerId(!1)||this.appPeersManager.peerId;this.processUpdate({_:"updateNewMessage",message:{_:"message",pFlags:e.pFlags,id:e.id,from_id:this.appPeersManager.getOutputPeer(s.toPeerId()),peer_id:this.appPeersManager.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":this.appUsersManager.saveApiUsers(e.users,t.override),this.appChatsManager.saveApiChats(e.chats,t.override),e.updates.forEach((e=>{this.processUpdate(e,a)}));break;default:this.log.warn("Unknown update message",e)}},this._constructor(!1)}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;this.appStateManager.pushToState("updates",{seq:e.seq,pts:e.pts,date:e.date})}popPendingSeqUpdate(){var e;const t=this.updatesState,a=t.seq+1,s=t.pendingSeqUpdates[a];if(!s)return!1;const n=s.updates;for(let e=0,t=n.length;e=t.syncPending.seqAwaiting&&(t.syncPending.ptsAwaiting?delete t.syncPending.seqAwaiting:this.clearStatePendingSync(t)),!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:this.clearStatePendingSync(t)),!0}forceGetDifference(){this.updatesState.syncLoading||this.getDifference()}processLocalUpdate(e){this.processUpdateMessage({_:"updateShort",update:e})}getDifference(e=!1){const t=this.updatesState,a=t.syncLoading;a||(t.pendingSeqUpdates={},t.pendingPtsUpdates=[]),this.clearStatePendingSync(t);const s=this.apiManager.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&&this.rootScope.dispatchEvent("state_synchronizing"),"updates.differenceTooLong"!==a._){this.appUsersManager.saveApiUsers(a.users),this.appChatsManager.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)+this.timeManager.getServerTimeOffset(),delete t.seq,this.channelStates={},this.log.warn("getDifference:",a._),this.onDifferenceTooLong();if("updates.differenceSlice"===a._)return this.getDifference();this.debug&&this.log.debug("finished get diff")}));return a||this.justAName(t,s),s}clearStatePendingSync(e){e.syncPending&&(clearTimeout(e.syncPending.timeout),e.syncPending=null)}getChannelDifference(e){const t=this.getChannelState(e),a=t.syncLoading;a||(t.pendingPtsUpdates=[]),this.clearStatePendingSync(t);const s=this.debug?this.log.bindPrefix("getChannelDifference-"+e):void 0,n=this.apiManager.invokeApi("updates.getChannelDifference",{channel:this.appChatsManager.getChannelInput(e),filter:{_:"channelMessagesFilterEmpty"},pts:t.pts,limit:1e3},{timeout:2147483647}).then((a=>{if(null==s||s.debug("diff result",a),t.pts="pts"in a?a.pts:void 0,t.lastDifferenceTime=Date.now(),"updates.channelDifferenceEmpty"!==a._){if("updates.channelDifferenceTooLong"===a._)return delete this.channelStates[e],void this.saveUpdate({_:"updateChannelReload",channel_id:e});if(this.appUsersManager.saveApiUsers(a.users),this.appChatsManager.saveApiChats(a.chats),null==s||s.debug("applying",a.other_updates.length,"channel other updates"),a.other_updates.forEach((e=>{this.saveUpdate(e)})),null==s||s.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})})),null==s||s.debug("apply channel diff",t.pts),"updates.channelDifference"===a._&&!a.pFlags.final)return this.getChannelDifference(e);null==s||s.debug("finished channel get diff")}}));return a||this.justAName(t,n,e),n}onDifferenceTooLong(){this.appUsersManager.clear(),this.appChatsManager.clear(),this.appMessagesManager.clear(),this.rootScope.dispatchEvent("state_cleared")}justAName(e,t,a){e.syncLoading=t,this.rootScope.dispatchEvent("state_synchronizing",a),t.then((()=>{e.syncLoading=null,this.rootScope.dispatchEvent("state_synchronized",a)}),(()=>{e.syncLoading=null}))}addChannelState(e,t){var a,s;if(!t)throw new Error("Add channel state without pts "+e);return null!==(a=(s=this.channelStates)[e])&&void 0!==a?a:s[e]={pts:t,pendingPtsUpdates:[],syncPending:null,syncLoading:null}}getChannelState(e,t){return void 0===this.channelStates[e]&&this.addChannelState(e,t),this.channelStates[e]}processUpdate(e,t={}){var a,s,n,i;let r;switch(e._){case"updateNewChannelMessage":case"updateEditChannelMessage":r=this.appPeersManager.getPeerId(e.message.peer_id).toChatId();break;case"updateChannelTooLong":if(r=e.channel_id,!(r in this.channelStates))return!1;break;default:"channel_id"in e&&"pts"in e&&(r=e.channel_id)}const{pts:o,pts_count:p}=e,d=r?this.getChannelState(r,o):this.updatesState;if(d.syncLoading)return!1;if("updateChannelTooLong"===e._)return(!d.lastPtsUpdateTime||d.lastPtsUpdateTime{d.syncPending=null,d.syncLoading||(r?this.getChannelDifference(r):this.getDifference())}),6)}),d.syncPending.ptsAwaiting=!0,!1;if(o>d.pts)d.pts=o,f=!0,d.lastPtsUpdateTime=Date.now();else if(p)return!1;r&&t.date&&this.updatesState.date0){const a=t.seq,r=t.seqStart||a;if(r!==d.seq+1&&r>d.seq)return this.debug&&this.log.warn("Seq hole",d,null===(s=d.syncPending)||void 0===s?void 0:s.seqAwaiting),null!==(n=(i=d.pendingSeqUpdates)[r])&&void 0!==n||(i[r]={seq:a,date:t.date,updates:[]}),d.pendingSeqUpdates[r].updates.push(e),d.syncPending||(d.syncPending={timeout:E.Z.setTimeout((()=>{d.syncPending=null,d.syncLoading||this.getDifference()}),6)}),(!d.syncPending.seqAwaiting||d.syncPending.seqAwaiting{const t=this.getChannelState(e);t.syncLoading||t.lastDifferenceTime&&!(Date.now()-t.lastDifferenceTime>2500)||this.getChannelDifference(e)};null!==(a=n.interval)&&void 0!==a||(n.interval=E.Z.setInterval(i,3e3)),i()}unsubscribeFromChannelUpdates(e,t){const a=this.subscriptions[e];!(null==a?void 0:a.interval)||--a.count&&!t||(clearInterval(a.interval),a.interval=void 0,delete this.subscriptions[e])}attach(e){this.attached||(this.log("attach"),this.attached=!0,this.appStateManager.getState().then((({updates:t})=>{const a=this.appStateManager.newVersion;t&&t.pts&&t.date?(Object.assign(this.updatesState,t),this.log("will get difference",Object.assign({},t)),this.getDifference(!0)):(this.log("will get new state"),this.updatesState.syncLoading=new Promise((e=>{this.apiManager.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()}))}))),this.apiManager.setUpdatesProcessor(this.processUpdateMessage),this.setProxy(),a&&this.updatesState.syncLoading.then((()=>{return t=this,s=void 0,i=function*(){const t={en:"was updated to version",ru:"ะพะฑะฝะพะฒะปั‘ะฝ ะดะพ ะฒะตั€ัะธะธ"},s=e=>{fetch(`changelogs/${e}_${a.split(" ")[0]}.md`).then((e=>200===e.status&&e.ok&&e.text()||Promise.reject())).then((s=>{const n=t[e]||t.en;s=`**Telegram Web${_.Z.suffix} ${n} ${a}**\n\n`+s;const i=[],r={_:"updateServiceNotification",entities:i,message:(0,ke.Z)(s,i),type:"local",pFlags:{},inbox_date:Date.now()/1e3|0,media:void 0};this.processLocalUpdate(r)}))},n=(0,we.Z)([e,"en"]);for(const e of n)try{yield s(e);break}catch(e){}},new((n=void 0)||(n=Promise))((function(e,a){function r(e){try{p(i.next(e))}catch(e){a(e)}}function o(e){try{p(i.throw(e))}catch(e){a(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof n?a:new n((function(e){e(a)}))).then(r,o)}p((i=i.apply(t,s||[])).next())}));var t,s,n,i}))})))}}Ae(De,[p.Z,G]);class Ue extends G{constructor(){super(...arguments),this.savedAvatarURLs={}}after(){this.rootScope.addEventListener("avatar_update",(({peerId:e,threadId:t})=>{t||this.removeFromAvatarsCache(e)}))}isAvatarCached(e,t){const a=this.savedAvatarURLs[e];return void 0===t?!!a:!(!a||!a[t]||a[t]instanceof Promise)}removeFromAvatarsCache(e){this.savedAvatarURLs[e]&&delete this.savedAvatarURLs[e]}loadAvatar(e,t,a){var s,n;const i=null!==(s=(n=this.savedAvatarURLs)[e])&&void 0!==s?s:n[e]={};if(i[a])return i[a];{const s={_:"inputPeerPhotoFileLocation",pFlags:{},peer:this.appPeersManager.getInputPeerById(e),photo_id:t.photo_id},n={dcId:t.dc_id,location:s};"photo_big"===a&&(s.pFlags.big=!0,n.limitPart=524288);const r=this.apiFileManager.download(n);return i[a]=r.then((e=>i[a]=URL.createObjectURL(e)))}}}var Te=a(144),Ee=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 Fe extends G{after(){this.calls=new Map,i().IS_CALL_SUPPORTED&&this.apiUpdatesManager.addMultipleEventsListeners({updatePhoneCall:e=>{this.saveCall(e.phone_call)},updatePhoneCallSignalingData:e=>{this.rootScope.dispatchEvent("call_signaling",{callId:e.phone_call_id,data:e.data})}})}computeKey(e,t,a){return this.cryptoWorker.invokeCrypto("compute-dh-key",e,t,a)}saveCall(e){const t="phoneCallDiscarded"===e._,a=this.calls.get(e.id);return a?(re(a,e),t&&this.calls.delete(e.id),e=a):t||this.calls.set(e.id,e),this.rootScope.dispatchEvent("call_update",e),e}getCall(e){return this.calls.get(e)}getCallInput(e){const t=this.getCall(e);return{_:"inputPhoneCall",id:t.id,access_hash:t.access_hash}}savePhonePhoneCall(e){return this.appUsersManager.saveApiUsers(e.users),this.saveCall(e.phone_call)}generateDh(){return this.apiManager.invokeApi("messages.getDhConfig",{version:0,random_length:256}).then((e=>this.cryptoWorker.invokeCrypto("generate-dh",e)))}requestCall(e,t,a,s){return Ee(this,void 0,void 0,(function*(){const n=yield this.apiManager.invokeApi("phone.requestCall",{user_id:this.appUsersManager.getUserInput(e),protocol:t,video:s,random_id:(0,Te.d)(32),g_a_hash:a});return this.savePhonePhoneCall(n)}))}discardCall(e,t,a,s){return Ee(this,void 0,void 0,(function*(){if(!this.getCall(e))return;const n=yield this.apiManager.invokeApi("phone.discardCall",{video:s,peer:this.getCallInput(e),duration:t,reason:{_:a},connection_id:"0"});this.apiUpdatesManager.processUpdateMessage(n)}))}}var Re=a(7120),xe=a(2566);class Be extends G{constructor(){super(...arguments),this.clear=(e=!1)=>{if(e)this.chats={};else for(const e in this.chats)if(e&&!this.peersStorage.isPeerNeeded(e.toPeerId(!0))){const t=this.chats[e];this.appUsersManager.modifyUsernamesCache(t,!1),this.storage.delete(e),delete this.chats[e]}},this.onChatUpdated=(e,t)=>{var a;this.apiUpdatesManager.processUpdateMessage(t),(null===(a=null==t?void 0:t.updates)||void 0===a?void 0:a.length)&&this.isChannel(e)&&this.rootScope.dispatchEvent("invalidate_participants",e)}}after(){return this.clear(!0),this.apiUpdatesManager.addMultipleEventsListeners({updateChannelParticipant:e=>{this.apiManager.clearCache("channels.getParticipants",(t=>t.channel.channel_id===e.channel_id))},updateChatDefaultBannedRights:e=>{const t=this.appPeersManager.getPeerId(e.peer).toChatId(),a=this.chats[t];a&&(a.default_banned_rights=e.default_banned_rights,this.rootScope.dispatchEvent("chat_update",t))}}),Promise.all([this.appStateManager.getState(),this.appStoragesManager.loadStorage("chats")]).then((([e,{results:t,storage:a}])=>{this.storage=a,this.saveApiChats(t),this.peersStorage.addEventListener("peerNeeded",(e=>{e.isUser()||this.storage.getFromCache(e.toChatId())||this.storage.set({[e.toChatId()]:this.getChat(e.toChatId())})})),this.peersStorage.addEventListener("peerUnneeded",(e=>{!e.isUser()&&this.storage.getFromCache(e.toChatId())&&this.storage.delete(e.toChatId())}))}))}saveApiChats(e,t){e.saved||(e.saved=!0,e.forEach((e=>this.saveApiChat(e,t))))}saveApiChat(e,t){var a,s,n,i,r;if(!e||"chatEmpty"===e._)return;const o=this.chats[e.id];if(null!==(a=(r=e).pFlags)&&void 0!==a||(r.pFlags={}),e.pFlags.min&&void 0!==o)return;"channel"===e._&&void 0===e.participants_count&&void 0!==o&&o.participants_count&&(e.participants_count=o.participants_count),"chatPhotoEmpty"===(null===(s=e.photo)||void 0===s?void 0:s._)&&delete e.photo;const p=this.appUsersManager.setUsernameToCache(e,o),d=e.id.toPeerId(!0);if(void 0===o)this.chats[e.id]=e;else{const t=null===(n=o.photo)||void 0===n?void 0:n.photo_id,a=null===(i=e.photo)||void 0===i?void 0:i.photo_id,s=o.pFlags.forum!==e.pFlags.forum,r=t!==a||s,f=o.title!==e.title||p,c=o.pFlags.verified!==e.pFlags.verified||o.pFlags.scam!==e.pFlags.scam||o.pFlags.fake!==e.pFlags.fake;re(o,e),this.rootScope.dispatchEvent("chat_update",e.id),r&&this.rootScope.dispatchEvent("avatar_update",{peerId:d}),(f||c)&&this.rootScope.dispatchEvent("peer_title_edit",{peerId:d}),s&&this.rootScope.dispatchEvent("chat_toggle_forum",{chatId:e.id,enabled:!!e.pFlags.forum})}this.peersStorage.isPeerNeeded(d)&&this.storage.set({[e.id]:e})}getChat(e){return this.chats[e]}hasRights(e,t,a,s){return(0,Re.Z)(this.getChat(e),t,a,s)}editChatDefaultBannedRights(e,t){const a=this.getChat(e);return a.default_banned_rights&&a.default_banned_rights.until_date===t.until_date&&(0,Y.Z)(a.default_banned_rights.pFlags,t.pFlags)?Promise.resolve():this.apiManager.invokeApi("messages.editChatDefaultBannedRights",{peer:this.appPeersManager.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){var t;const a=this.chats[e];return!!(null===(t=null==a?void 0:a.pFlags)||void 0===t?void 0:t.megagroup)}isForum(e){var t;const a=this.chats[e];return!!(null===(t=null==a?void 0:a.pFlags)||void 0===t?void 0:t.forum)}isBroadcast(e){return this.isChannel(e)&&!this.isMegagroup(e)}isInChat(e){let t=!0;const a=this.getChat(e);return(!a||"channelForbidden"===a._||"chatForbidden"===a._||"chatEmpty"===a._||a.pFlags.left||a.pFlags.deactivated)&&(t=!1),t}getChannelInput(e){const t=this.getChat(e);return 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(0,fe.Z)(a)&&(t||!a.pFlags.min)}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 this.apiManager.invokeApi("channels.createChannel",e).then((e=>(this.apiUpdatesManager.processUpdateMessage(e),e.chats[0].id)))}inviteToChannel(e,t){const a=this.getChannelInput(e),s=t.map((e=>this.appUsersManager.getUserInput(e)));return this.apiManager.invokeApi("channels.inviteToChannel",{channel:a,users:s}).then(this.onChatUpdated.bind(this,e))}createChat(e,t){return this.apiManager.invokeApi("messages.createChat",{users:t.map((e=>this.appUsersManager.getUserInput(e))),title:e}).then((e=>(this.apiUpdatesManager.processUpdateMessage(e),e.chats[0].id)))}leaveChannel(e){return this.apiManager.invokeApi("channels.leaveChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}joinChannel(e){return this.apiManager.invokeApi("channels.joinChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}addChatUser(e,t,a=100){return this.apiManager.invokeApi("messages.addChatUser",{chat_id:e,user_id:this.appUsersManager.getUserInput(t),fwd_limit:a}).then(this.onChatUpdated.bind(this,e))}deleteChatUser(e,t){return this.apiManager.invokeApi("messages.deleteChatUser",{chat_id:e,user_id:this.appUsersManager.getUserInput(t)}).then(this.onChatUpdated.bind(this,e))}leaveChat(e){return this.deleteChatUser(e,this.appUsersManager.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 this.apiManager.invokeApi("channels.deleteChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}deleteChat(e){return this.apiManager.invokeApi("messages.deleteChat",{chat_id:e})}migrateChat(e){const t=this.getChat(e);return"channel"===t._?Promise.resolve(t.id):this.apiManager.invokeApi("messages.migrateChat",{chat_id:e}).then((t=>(this.onChatUpdated(e,t),t.updates.find((e=>"updateChannel"===e._)).channel_id)))}updateUsername(e,t,a){const s=this.apiManager.invokeApi("channels.updateUsername",{channel:this.getChannelInput(e),username:t});return this.refreshChatAfterRequest(e,s,a)}editPhoto(e,t){const a={_:"inputChatUploadedPhoto",file:t};let s;return s=this.isChannel(e)?this.apiManager.invokeApi("channels.editPhoto",{channel:this.getChannelInput(e),photo:a}):this.apiManager.invokeApi("messages.editChatPhoto",{chat_id:e,photo:a}),s.then(this.onChatUpdated.bind(this,e))}editTitle(e,t){let a;return a=this.isChannel(e)?this.apiManager.invokeApi("channels.editTitle",{channel:this.getChannelInput(e),title:t}):this.apiManager.invokeApi("messages.editChatTitle",{chat_id:e,title:t}),a.then(this.onChatUpdated.bind(this,e))}editAbout(e,t){const a=e.toPeerId(!0);return this.apiManager.invokeApi("messages.editChatAbout",{peer:this.appPeersManager.getInputPeerById(a),about:t}).then((e=>(e&&this.rootScope.dispatchEvent("peer_bio_edit",a),e)))}editBanned(e,t,a){const s="object"!=typeof t?t:(0,xe.Z)(t);return this.apiManager.invokeApi("channels.editBanned",{channel:this.getChannelInput(e),participant:this.appPeersManager.getInputPeerById(s),banned_rights:a}).then((n=>{if(this.onChatUpdated(e,n),"object"==typeof t){const n=Date.now()/1e3|0;this.apiUpdatesManager.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:this.appUsersManager.getSelf().id,peer:this.appPeersManager.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 this.apiManager.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=>this.apiManager.invokeApi("channels.togglePreHistoryHidden",{channel:this.getChannelInput(e),enabled:t}).then(this.onChatUpdated.bind(this,e))))}toggleSignatures(e,t){return this.apiManager.invokeApi("channels.toggleSignatures",{channel:this.getChannelInput(e),enabled:t}).then(this.onChatUpdated.bind(this,e))}toggleNoForwards(e,t){return this.apiManager.invokeApi("messages.toggleNoForwards",{peer:this.getInputPeer(e),enabled:t}).then(this.onChatUpdated.bind(this,e))}setChatAvailableReactions(e,t){const a=this.appProfileManager.getCachedFullChat(e);return a&&(a.available_reactions=t,this.rootScope.dispatchEvent("chat_full_update",e)),this.apiManager.invokeApi("messages.setChatAvailableReactions",{peer:this.getInputPeer(e),available_reactions:t}).then(this.onChatUpdated.bind(this,e))}getSendAs(e){return this.apiManager.invokeApiSingleProcess({method:"channels.getSendAs",params:{peer:this.getChannelInputPeer(e)},processResult:e=>(this.appUsersManager.saveApiUsers(e.users),this.saveApiChats(e.chats),e.peers)})}importChatInvite(e){return this.apiManager.invokeApi("messages.importChatInvite",{hash:e}).then((e=>(this.apiUpdatesManager.processUpdateMessage(e),e.chats[0].id)))}checkUsername(e,t){return this.apiManager.invokeApi("channels.checkUsername",{channel:this.getChannelInput(e),username:t})}getSponsoredMessage(e){return this.apiManager.invokeApiCacheable("channels.getSponsoredMessages",{channel:this.getChannelInput(e)},{cacheSeconds:300}).then((e=>{if("messages.sponsoredMessages"===e._){this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats);const t=e.messages.shift();e.messages.push(t)}return e}))}viewSponsoredMessage(e,t){return this.apiManager.invokeApiSingle("channels.viewSponsoredMessage",{channel:this.getChannelInput(e),random_id:t})}checkChatInvite(e){return this.apiManager.invokeApi("messages.checkChatInvite",{hash:e}).then((e=>(e.chat&&this.saveApiChat(e.chat,!0),e)))}toggleUsername(e,t,a){const s=this.apiManager.invokeApi("channels.toggleUsername",{channel:this.getChannelInput(e),username:t,active:a});return this.refreshChatAfterRequest(e,s)}reorderUsernames(e,t){const a=this.apiManager.invokeApi("channels.reorderUsernames",{channel:this.getChannelInput(e),order:t});return this.refreshChatAfterRequest(e,a)}deactivateAllUsernames(e,t){const a=this.apiManager.invokeApi("channels.deactivateAllUsernames",{channel:this.getChannelInput(e)});return this.refreshChatAfterRequest(e,a,t)}makeChannelPrivate(e){const t=[this.updateUsername(e,"",!0),this.deactivateAllUsernames(e,!0)],a=Promise.all(t).then((()=>!0));return this.refreshChatAfterRequest(e,a)}refreshChatAfterRequest(e,t,a){return a?t:t.then((t=>this.getChannels([e]).then((()=>t))))}getChannels(e){return this.apiManager.invokeApi("channels.getChannels",{id:e.map((e=>this.getChannelInput(e)))}).then((e=>{this.saveApiChats(e.chats)}))}toggleForum(e,t){return this.migrateChat(e).then((e=>this.apiManager.invokeApi("channels.toggleForum",{channel:this.getChannelInput(e),enabled:t}).then(this.onChatUpdated.bind(this,e))))}editForumTopic(e){const{chatId:t,topicId:a,title:s,iconEmojiId:n,closed:i,hidden:r}=e;return this.apiManager.invokeApi("channels.editForumTopic",{channel:this.getChannelInput(t),topic_id:(0,oe.Z)(a),title:s,icon_emoji_id:n,closed:i,hidden:r}).then(this.onChatUpdated.bind(this,t))}createForumTopic(e){return t=this,a=void 0,n=function*(){const{chatId:t,title:a,iconColor:s,iconEmojiId:n}=e,i=yield this.appProfileManager.getChannelFull(t),r=i.default_send_as&&this.appPeersManager.getInputPeerById(this.appPeersManager.getPeerId(i.default_send_as));return this.apiManager.invokeApi("channels.createForumTopic",{channel:this.getChannelInput(t),title:a,icon_color:s,icon_emoji_id:n,random_id:(0,Te.a)(),send_as:r}).then((e=>{this.onChatUpdated(t,e);const a=e.updates.find((e=>"updateNewChannelMessage"===e._));return(0,pe.Z)(a.message.id)}))},new((s=void 0)||(s=Promise))((function(e,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(r,o)}p((n=n.apply(t,a||[])).next())}));var t,a,s,n}updatePinnedForumTopic(e,t,a){return this.apiManager.invokeApi("channels.updatePinnedForumTopic",{channel:this.getChannelInput(e),topic_id:(0,oe.Z)(t),pinned:a}).then(this.onChatUpdated.bind(this,e))}}a(4762);var Ve,Oe=a(5953),Le=a(9005),Ne=a(6637),Ze=a(2423);function je(e,t){(0,Ne.Z)(e)||(e="https://"+e);const a={url:e};let s,n,i,r;if(s=e.match(/^(?:https?:\/\/)?(?:(.+?)\.)?(?:(?:web|k|z)\.)?t(?:elegram)?\.me(?:\/(.+))?/)){const t=new URL(e);let a=s[1];a&&o.BX.has(s[1])&&(a=void 0),a&&(t.pathname=a+("/"===t.pathname?"":t.pathname));const n=t.pathname.slice(1),i=n.split("/");if(i[0]&&"$"===i[0][0]&&i[0].length>1)r="invoice";else if(/^\W/.test(n)&&!Ze.kO.test(n))r="joinchat";else switch(i[0]){case"joinchat":case"addstickers":case"addemoji":case"voicechat":case"invoice":if(1!==i.length&&!a){r=i[0];break}default:if(i[1]&&i[1].match(/^\d+(?:\?(?:comment|thread)=\d+)?$/)||1===i.length){r="im";break}}}else(n=e.match(/^(?:https?:\/\/)?telesco\.pe\/([^/?]+)\/(\d+)/))?r="im":(i=e.match(/tg:(?:\/\/)?(.+?)(?:\?|$)/))&&(r="tg_"+i[1]);return window[r]||(r=void 0),a.onclick=r,a}d.GO&&(d.GO.wrapUrl=je),function(e){let t,s;function n(t){e.lastRequestedLangCode=t,e.lastRequestedNormalizedLangCode=t.split("-")[0]}function i(){if("h12"===e.timeFormat)try{const t=P({hour:"numeric",minute:"numeric",hour12:!0}),a=new Date;a.setHours(0);const s=t.format(a);e.amPmCache.am=s.split(/\s/)[1],a.setHours(12);const n=t.format(a);e.amPmCache.pm=n.split(/\s/)[1]}catch(t){console.error("cannot get am/pm",t),e.amPmCache={am:"AM",pm:"PM"}}}function r(){const e=_.Z.langPackCode;return n(e),Promise.all([a.e(104).then(a.bind(a,9104)),a.e(301).then(a.bind(a,9301)),a.e(8).then(a.bind(a,9179))]).then((([t,a,s])=>{const n=[];return p(t.default,n),p(a.default,n),f({_:"langPackDifference",from_version:0,lang_code:e,strings:n,version:0,local:!0,countries:s.default})}))}function o(t,s){e.requestedServerLanguage=!0;const n=g.managers;return Promise.all([n.apiManager.invokeApiCacheable("langpack.getLangPack",{lang_code:t,lang_pack:"web"}),!1,a.e(104).then(a.bind(a,9104)),a.e(301).then(a.bind(a,9301)),n.apiManager.invokeApiCacheable("help.getCountriesList",{lang_code:t,hash:0}),e.polyfillPromise])}function p(e,t=[]){for(const a in e){const s=e[a];"string"==typeof s?t.push({_:"langPackString",key:a,value:s}):t.push(Object.assign({_:"langPackStringPluralized",key:a},s))}return t}function f(e){return e.appVersion=_.Z.langPackVersion,h.Z.set({langPack:e}).then((()=>(c(e),e)))}function c(a){const s=e.lastRequestedLangCode;if(a.lang_code===s){try{t=new Intl.PluralRules(e.lastRequestedNormalizedLangCode)}catch(a){console.error("pluralRules error",a),t=new Intl.PluralRules(e.lastRequestedNormalizedLangCode.split("-",1)[0])}try{t=new Intl.PluralRules(a.lang_code)}catch(e){console.error("pluralRules error",e),t=new Intl.PluralRules(a.lang_code.split("-",1)[0])}e.strings.clear();for(const t of a.strings)e.strings.set(t.key,t);a.countries&&(e.countriesList.length=0,e.countriesList.push(...a.countries.countries),a.countries.countries.forEach((t=>{if(t.name){const a=t.default_name;e.strings.set(a,{_:"langPackString",key:a,value:t.name})}}))),e.lastAppliedLangCode!==s&&(g.dispatchEvent("language_change",s),e.lastAppliedLangCode=s,v.clear(),i()),Array.from(document.querySelectorAll(".i18n")).forEach((t=>{const a=e.weakMap.get(t);a&&a.update()}))}}function l(e,t,a={i:0}){const s=[];let n=0;return e.replace(/(\*\*|__)(.+?)\1|(\n)|(\[.+?\]\(.*?\))|un\d|%\d\$.|%./g,((e,i,r,o,p,d,f)=>{if(s.push(f.slice(n,d)),i){let e;switch(i){case"**":e=document.createElement("b");break;case"__":e=document.createElement("i")}e.append(...l(r,t,a)),s.push(e)}else if(o)s.push(document.createElement("br"));else if(p){const e=p.lastIndexOf("]"),n=p.slice(1,e),i=p.slice(e+2,p.length-1);let r;if(i&&(0,Ne.Z)(i)){r=document.createElement("a");const e=je(i);r.href=e.url,e.onclick&&r.setAttribute("onclick",e.onclick),r.target="_blank"}else r=t[a.i++],r instanceof DocumentFragment&&(r=r.firstChild),r.textContent="";r.append(...l(n,t,a)),s.push(r)}else t&&function(e,t,a){const s=t[a.i++];Array.isArray(s)?e.push(...s):e.push(s)}(s,t,a);return n=d+e.length,""})),n!==e.length&&s.push(e.slice(n)),s}function m(a,s=!1,n){const i=e.strings.get(a);let r;if(i)if("langPackStringPluralized"===i._&&(null==n?void 0:n.length)){let e=n[0];"string"==typeof e&&(e=+e.replace(/\D/g,"")),r=i[t.select(e)+"_value"]||i.other_value}else r="langPackString"===i._?i.value:a;else r=a;const o=l(r,n);return s?o.map((e=>e instanceof Node?e.textContent:e)).join(""):o}e.strings=new Map,e.countriesList=[],e.requestedServerLanguage=!1,e.isRTL=!1,e.setRTL=function(t){e.isRTL=t},e.getCacheLangPack=function(){return s||(s=Promise.all([h.Z.get("langPack"),e.polyfillPromise]).then((([t])=>t?(d.ZP,e.lastRequestedLangCode||n(t.lang_code),c(t),t):r())).finally((()=>{s=void 0})))},e.setTimeFormat=function(t,a=!!e.timeFormat&&e.timeFormat!==t){e.timeFormat=t,i(),a&&(v.clear(),Array.from(document.querySelectorAll(".i18n")).forEach((t=>{const a=e.weakMap.get(t);a instanceof b&&a.update()})))},e.loadLocalLangPack=r,e.loadLangPack=o,e.getStrings=function(e,t){return g.managers.apiManager.invokeApi("langpack.getStrings",{lang_pack:_.Z.langPack,lang_code:e,keys:t})},e.formatLocalStrings=p,e.getLangPack=function(e,t){return n(e),o(e).then((([e,t,a,s,n,i])=>{let r=[];return[a,s].forEach((e=>{p(e.default,r)})),r=r.concat(...[e.strings,t.strings].filter(Boolean)),e.strings=r,e.countries=n,f(e)}))},e.saveLangPack=f,e.polyfillPromise="undefined"!=typeof Intl&&void 0!==Intl.PluralRules?Promise.resolve():a.e(642).then(a.bind(a,4642)).then((e=>{window.Intl=Object.assign("undefined"!=typeof Intl?Intl:{},e.default)})),e.applyLangPack=c,e.superFormatter=l,e.format=m,e.weakMap=new WeakMap;class u{constructor(t){this.element=(null==t?void 0:t.element)||document.createElement("span"),this.element.classList.add("i18n"),this.property=null==t?void 0:t.property,t&&(t.key||t.date)&&this.update(t),e.weakMap.set(this.element,this)}}class y extends u{constructor(e={}){var t;super(Object.assign(Object.assign({},e),{property:null!==(t=e.property)&&void 0!==t?t:"innerHTML"}))}update(e){if((0,Oe.Z)(this,e),"innerHTML"===this.property)this.element.textContent="",this.element.append(...m(this.key,!1,this.args));else{const e=this.element[this.property],t=m(this.key,!0,this.args);void 0===e?this.element.dataset[this.property]=t:this.element[this.property]=t}}compareAndUpdate(e){if(this.key!==e.key||!(0,Y.Z)(this.args,e.args))return this.update(e)}}e.IntlElement=y;const v=new Map;function P(t={}){const a=JSON.stringify(t);let s=v.get(a);return s||(s=new Intl.DateTimeFormat(e.lastRequestedNormalizedLangCode+"-u-hc-"+e.timeFormat,t),v.set(a,s)),s}e.amPmCache={am:"AM",pm:"PM"};class b extends u{constructor(e){var t;super(Object.assign(Object.assign({},e),{property:null!==(t=e.property)&&void 0!==t?t:"textContent"})),this.element.setAttribute("dir","auto")}update(t){let a;if((0,Oe.Z)(this,t),this.options.hour&&this.options.minute&&2===Object.keys(this.options).length){const t=this.date.getHours();a=("0"+("h12"===e.timeFormat?t%12||12:t)).slice(-2)+":"+("0"+this.date.getMinutes()).slice(-2),"h12"===e.timeFormat&&(a+=" "+(t<12?e.amPmCache.am:e.amPmCache.pm))}else{const e=P(this.options);a=(0,Le.Z)(e.format(this.date))}this.element[this.property]=a}}e.IntlDateElement=b,e.i18n=function(e,t){return new y({key:e,args:t}).element},e.i18n_=function(e){return new y(e).element},e._i18n=function(e,t,a,s){return new y({element:e,key:t,args:a,property:s}).element}}(Ve||(Ve={}));const qe=Ve;Ve.i18n,Ve.i18n_,Ve._i18n,d.GO.I18n=Ve;const Ge=["January","February","March","April","May","June","July","August","September","October","November","December"],He=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],We=e=>{const t=new Date(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate())),a=t.getUTCDay()||7;t.setUTCDate(t.getUTCDate()+4-a);const s=new Date(Date.UTC(t.getUTCFullYear(),0,1));return Math.ceil(((t.getTime()-s.getTime())/86400+1)/7)};d.GO&&(d.GO.formatDateAccordingToTodayNew=function(e){const t=new Date,a=t.getTime()/1e3|0,s=e.getTime()/1e3|0,n={};return a-s<86400&&t.getDate()===e.getDate()?n.hour=n.minute="2-digit":t.getFullYear()!==e.getFullYear()?(n.year=n.day="numeric",n.month="2-digit"):a-s<604800&&We(t)===We(e)?n.weekday="short":(n.month="short",n.day="numeric"),new qe.IntlDateElement({date:e,options:n}).element});const ze=2013,Ke=new RegExp("20[0-9]{1,2}"),Je=new RegExp("(\\w{3,}) ([0-9]{0,4})","i"),$e=new RegExp("([0-9]{0,4}) (\\w{2,})","i"),Qe=new RegExp("^([0-9]{1,4})(\\.| |/|\\-)([0-9]{1,4})$","i"),Ye=new RegExp("^([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,4})$","i"),Xe=[31,29,31,30,31,30,31,31,30,31,30,31];function et(e,t,a){const s=(new Date).getFullYear(),n=Date.now();if(a>=ze&&a<=s){const s=new Date;s.setFullYear(a,t,1),s.setHours(0,0,0);const i=s.getTime();if(i>n)return;s.setMonth(s.getMonth()+1);const r=s.getTime()-1;e.push({title:at(i),minDate:i,maxDate:r})}}function tt(e,t,a){if(rt(t,a)){const n=(new Date).getFullYear(),i=Date.now();for(let r=n;r>=ze;r--){if(1===a&&28===t&&((s=r)%4!=0||s%100==0)&&s%400!=0)continue;const o=new Date;o.setFullYear(r,a,t+1),o.setHours(0,0,0);const p=o.getTime();if(p>i)continue;o.setFullYear(r,a,t+2),o.setHours(0,0,0);const d=o.getTime()-1;r===n?e.push({title:st(p),minDate:p,maxDate:d}):e.push({title:nt(p),minDate:p,maxDate:d})}}var s}function at(e){const t=new Date(e);return Ge[t.getMonth()].slice(0,3)+" "+t.getFullYear()}function st(e){const t=new Date(e);return Ge[t.getMonth()].slice(0,3)+" "+t.getDate()}function nt(e){const t=new Date(e);return("0"+t.getDate()).slice(-2)+"."+("0"+(t.getMonth()+1)).slice(-2)+"."+t.getFullYear()}function it(e){const t=new Date(e);return He[t.getDay()]}function rt(e,t){return t>=0&&t<12&&e>=0&&e{t[e][s]=a})),a[e]=t[e])}d.GO.fillTipDates=function(e,t){const a=e.trim().toLowerCase();if(a.length<3)return;if(0==="today".indexOf(a)){const e=new Date,a=e.getFullYear(),s=e.getMonth(),n=e.getDate();e.setFullYear(a,s,n),e.setHours(0,0,0);const i=e.getTime();e.setFullYear(a,s,n+1),e.setHours(0,0,0);const r=e.getTime()-1;return void t.push({title:"Today",minDate:i,maxDate:r})}if(0==="yesterday".indexOf(a)){const e=new Date,a=e.getFullYear(),s=e.getMonth(),n=e.getDate();e.setFullYear(a,s,n),e.setHours(0,0,0);const i=e.getTime()-864e5;e.setFullYear(a,s,n+1),e.setHours(0,0,0);const r=e.getTime()-86400001;return void t.push({title:"Yesterday",minDate:i,maxDate:r})}const s=function(e){const t=new Date;if(e.length<=3)return-1;for(let a=0;a<7;a++)if(t.setDate(t.getDate()+1),0===it(t.getTime()).toLowerCase().indexOf(e))return t.getDay();return-1}(a);if(s>=0){const e=new Date,a=e.getTime(),n=s-e.getDay();e.setDate(e.getDate()+n),e.getTime()>a&&e.setTime(e.getTime()-6048e5);const i=e.getFullYear(),r=e.getMonth(),o=e.getDate();e.setFullYear(i,r,o),e.setHours(0,0,0);const p=e.getTime();e.setFullYear(i,r,o+1),e.setHours(0,0,0);const d=e.getTime()-1;return void t.push({title:it(p),minDate:p,maxDate:d})}let n;if(null===(n=Qe.exec(a)))if(null===(n=Ye.exec(a)))if(null===(n=Ke.exec(a))){if(null!==(n=Je.exec(a))){const e=n[1],a=n[2],s=ot(e);if(s>=0){const e=+a;if(e>0&&e<=31)return void tt(t,e-1,s);if(e>=ze)return void et(t,s,e)}}if(null!==(n=$e.exec(a))){const e=n[1],a=ot(n[2]);if(a>=0){const s=+e;if(s>0&&s<=31)return void tt(t,s-1,a);s>=ze&&et(t,a,s)}}}else{let e=+a;const s=(new Date).getFullYear();if(e=e;a--){const e=new Date;e.setFullYear(a,0,1),e.setHours(0,0,0);const s=e.getTime();e.setFullYear(a+1,0,1),e.setHours(0,0,0);const n=e.getTime()-1;t.push({title:""+a,minDate:s,maxDate:n})}}else if(e<=s){const a=new Date;a.setFullYear(e,0,1),a.setHours(0,0,0);const s=a.getTime();a.setFullYear(e+1,0,1),a.setHours(0,0,0);const n=a.getTime()-1;t.push({title:""+e,minDate:s,maxDate:n})}}else{const e=n[1],a=n[3],s=n[5];if(!n[2]===n[4])return;const i=parseInt(e),r=parseInt(a)-1;let o=parseInt(s);o>=10&&o<=99&&(o+=2e3);const p=(new Date).getFullYear();if(rt(i-1,r)&&o>=ze&&o<=p){const e=new Date;e.setFullYear(o,r,i),e.setHours(0,0,0);const a=e.getTime();e.setFullYear(o,r,i+1),e.setHours(0,0,0);const s=e.getTime()-1;return void t.push({title:nt(a),minDate:a,maxDate:s})}}else{const e=n[1],a=n[3],s=parseInt(e),i=parseInt(a);if(s>0&&s<=31){if(i>=ze&&s<=12)return void et(t,s-1,i);i<=12&&tt(t,s-1,i-1)}else s>=ze&&i<=12&&et(t,i-1,s)}};var dt=a(2491),ft=a(7072),ct=a(8801),lt=a(6658);const mt={pdf:"application/pdf",tgv:"application/x-tgwallpattern",tgs:"application/x-tgsticker",json:"application/json",wav:"audio/wav",mp3:"audio/mpeg",ogg:"audio/ogg",jpeg:"image/jpeg",jpg:"image/jpeg",png:"image/png",gif:"image/gif",webp:"image/webp",mp4:"video/mp4",webm:"video/webm",mov:"video/quicktime",svg:"image/svg+xml"},gt={};for(const e in mt)gt[mt[e]]=e;let ht=0;class ut extends G{constructor(){super(...arguments),this.onServiceWorkerFail=()=>{for(const e in this.docs){const t=this.docs[e];t.supportsStreaming&&(delete t.supportsStreaming,this.thumbsStorage.deleteCacheContext(t))}}}after(){this.docs={},this.stickerCachedThumbs={},this.uploadingWallPapers={},f.Z.getInstance().addEventListener("serviceWorkerOnline",(e=>{e||this.onServiceWorkerFail()}))}saveDoc(e,t){if(!e||"documentEmpty"===e._)return;const a=this.docs[e.id];e.file_reference&&(pt("file_reference",a,e),this.referenceDatabase.saveContext(e.file_reference,t)),a||(this.docs[e.id]=e);for(let t=0,a=e.attributes.length;t"documentAttributeFilename"===e._)),a=t&&t.file_name.split(".").pop(),s=((e,t={})=>{const a=t.monthAsNumber?".":" ",s=("0"+e.getHours()).slice(-2)+":"+("0"+e.getMinutes()).slice(-2)+(t.noSeconds?"":":"+("0"+e.getSeconds()).slice(-2));return(t.leadingZero?("0"+e.getDate()).slice(-2):e.getDate())+a+(t.monthAsNumber?("0"+(e.getMonth()+1)).slice(-2):Ge[e.getMonth()])+a+e.getFullYear()+(t.noTime?"":", "+s)})(new Date(1e3*e.date),{monthAsNumber:!0,leadingZero:!0}).replace(/[:\.]/g,"-").replace(", ","_");e.file_name=`${e.type}_${s}${a?"."+a:""}`}return Ws()&&("gif"===e.type&&e.size>8e6||"audio"===e.type||"video"===e.type)?(e.supportsStreaming=!0,this.thumbsStorage.getCacheContext(e).url||this.thumbsStorage.setCacheContextURL(e,void 0,function(e,t=!1,a){let s;return s=t?"download":a?"thumb":e.supportsStreaming?"stream":"document",(0,ct.q)(s,(0,lt.Z)(e,a))}(e),0)):e.supportsStreaming=!1,e.file_name||(e.file_name=""),a?Object.assign(a,e):e}getDoc(e){return(0,fe.Z)(e)?e:this.docs[e]}downloadDoc(e,t,a){return this.apiFileManager.downloadMedia({media:e,queueId:t,onlyCache:a})}getLottieCachedThumb(e,t){const a=this.stickerCachedThumbs[e];return a&&a[t]}saveLottiePreview(e,t,a,s,n){var i,r,o;const p=this.getDoc(e);if(!p)return;const d=null!==(i=(r=this.stickerCachedThumbs)[o=p.id])&&void 0!==i?i:r[o]={},f=d[n];f&&f.w>=a&&f.h>=s||(d[n]={url:URL.createObjectURL(t),w:a,h:s})}saveWebPConvertedStrippedThumb(e,t){const a=this.getDoc(e);if(!a)return;const s=a.thumbs&&a.thumbs.find((e=>"photoStrippedSize"===e._));s&&(a.pFlags.stickerThumbConverted=!0,s.bytes=t)}prepareWallPaperUpload(e){const t="wallpaper-upload-"+ ++ht,a={_:"photoSize",h:0,w:0,location:{},size:e.size,type:o.Pt};let s={_:"document",access_hash:"",attributes:[],dc_id:0,file_reference:[],id:t,mime_type:e.type,size:e.size,date:Date.now()/1e3,pFlags:{},thumbs:[a],file_name:e.name};s=this.saveDoc(s);const n=this.thumbsStorage.setCacheContextURL(s,void 0,URL.createObjectURL(e),e.size),i={_:"wallPaper",access_hash:"",document:s,id:t,slug:t,pFlags:{}};return this.uploadingWallPapers[t]={cacheContext:n,file:e},i}uploadWallPaper(e){const{cacheContext:t,file:a}=this.uploadingWallPapers[e];return delete this.uploadingWallPapers[e],this.apiFileManager.upload({file:a,fileName:a.name}).then((e=>this.apiManager.invokeApi("account.uploadWallPaper",{file:e,mime_type:a.type,settings:{_:"wallPaperSettings",pFlags:{}}}).then((e=>((0,ue.Z)(e),e.document=this.saveDoc(e.document),this.thumbsStorage.setCacheContextURL(e.document,void 0,t.url,t.downloaded),e)))))}getGifs(){return this.apiManager.invokeApiHashable({method:"messages.getSavedGifs",processResult:e=>((0,ue.Z)(e),e.gifs.map((e=>this.saveDoc(e))))})}requestDocPart(e,t,a,s){const n=this.getDoc(e);return n?this.apiFileManager.requestFilePart(t,(0,ft.Z)(n),a,s):Promise.reject((0,X.Z)("NO_DOC"))}}var yt=a(6034);class _t extends G{constructor(){super(...arguments),this.drafts={}}after(){this.apiUpdatesManager.addMultipleEventsListeners({updateDraftMessage:e=>{const t=this.appPeersManager.getPeerId(e.peer);this.saveDraft({peerId:t,threadId:e.threadId,draft:e.draft,notify:!0})}}),h.Z.get("drafts").then((e=>{this.drafts=e||{}}))}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();this.appMessagesManager.getDialogOnly(t)||this.appMessagesManager.reloadConversation(t)}}))}getAllDrafts(){var e;return null!==(e=this.getAllDraftPromise)&&void 0!==e?e:this.getAllDraftPromise=this.apiManager.invokeApi("messages.getAllDrafts").then((e=>{(this.apiUpdatesManager.updatesState.syncLoading||Promise.resolve()).then((()=>{this.apiUpdatesManager.processUpdateMessage(e)}))}))}saveDraft({peerId:e,threadId:t,draft:a,notify:s,force:n}){const i=this.processApiDraft(a),r=this.getKey(e,t);return i?this.drafts[r]=i:delete this.drafts[r],h.Z.set({drafts:this.drafts}),s&&this.rootScope.dispatchEvent("draft_updated",{peerId:e,threadId:t,draft:i,force:n}),i}isEmptyDraft(e){return"draftMessage"!==(null==e?void 0:e._)||!(void 0!==e.reply_to_msg_id&&e.reply_to_msg_id>0)&&!e.message.length}processApiDraft(e){if(e&&"draftMessage"===e._)return e.reply_to_msg_id&&(e.reply_to_msg_id=(0,pe.Z)(e.reply_to_msg_id)),e}syncDraft(e,t,a,s=!0,n=!1){const i=this.getDraft(e,t);if((0,yt.Z)(i,a))return!0;const r={peer:this.appPeersManager.getInputPeerById(e),message:""};let o;if(this.isEmptyDraft(a))o={_:"draftMessageEmpty"};else{(0,ue.Z)(a);const e=a.message,t=a.entities;a.reply_to_msg_id&&(r.reply_to_msg_id=(0,oe.Z)(a.reply_to_msg_id)),(null==t?void 0:t.length)&&(r.entities=this.appMessagesManager.getInputEntities(t)),a.pFlags.no_webpage&&(r.no_webpage=a.pFlags.no_webpage),r.message=e}t&&(r.top_msg_id=(0,oe.Z)(t));const p=o||a;return p.date=(0,te.Z)(!0)+this.timeManager.getServerTimeOffset(),this.saveDraft({peerId:e,threadId:t,draft:p,notify:!0,force:n}),!s||this.apiManager.invokeApi("messages.saveDraft",r)}clearAllDrafts(){return this.apiManager.invokeApi("messages.clearAllDrafts").then((e=>{if(e)for(const e in this.drafts){const[t,a]=e.split("_");this.rootScope.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({peerId:e,threadId:t,draft: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({peerId:e,threadId:t,draft:n,notify:!0,force:!0})}}var vt=a(946),Pt=a(7746);const bt={keywords:{},version:0,langCode:_.Z.langPackCode};class Mt extends G{constructor(){super(...arguments),this.keywordLangPacks={},this.indexedLangPacks={},this.getKeywordsPromises={},this.recent={},this.getRecentEmojisPromises={},this.getCustomEmojiDocumentPromises=new Map}getEmojiKeywords(e=_.Z.langPackCode){const t=this.getKeywordsPromises[e];if(t)return t;const a="emojiKeywords_"+e;return this.getKeywordsPromises[e]=h.Z.get(a).then((t=>((0,fe.Z)(t)||(t={}),(0,vt.Z)(bt,t),t.langCode=e,this.keywordLangPacks[e]=t,this.apiManager.invokeApi("messages.getEmojiKeywordsDifference",{lang_code:t.langCode,from_version:t.version}).then((e=>{t.version=e.version;const s=t.keywords,n=e.keywords;for(let e=0,t=n.length;et)))))}getBothEmojiKeywords(){const e=[this.getEmojiKeywords()];return this.networkerFactory.language!==_.Z.langPackCode&&e.push(this.getEmojiKeywords(this.networkerFactory.language)),this.recent.native||e.push(this.getRecentEmojis("native")),Promise.all(e)}indexEmojis(){this.index||(this.index=new ae.Z(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 a=t[e];this.index.indexObject(a,e)}this.indexedLangPacks[e]=!0}}searchEmojis(e){let t;if(this.indexEmojis(),(e=e.toLowerCase().replace(/_/g," ")).trim()){const a=this.index.search(e);t=Array.from(a).reduce(((e,t)=>e.concat(t)),[])}else t=this.recent.native.concat(Mt.POPULAR_EMOJI).slice(0,32);return t=Array.from(new Set(t)),t}getRecentEmojis(e){var t;const a=this.getRecentEmojisPromises;return null!==(t=a[e])&&void 0!==t?t:a[e]=this.appStateManager.getState().then((t=>{let a=[];if("native"===e){const{recentEmoji:e}=t;a=Array.isArray(e)&&e.length?e:Mt.POPULAR_EMOJI}else{const{recentCustomEmoji:e}=t;a=Array.isArray(e)&&e.length?e:[]}return this.recent[e]=a}))}pushRecentEmoji(e){const t=e.docId?"custom":"native";e.emoji=(0,Pt.Z)(e.emoji),this.getRecentEmojis(t).then((a=>{const s=e.docId||e.emoji;(0,M.Z)(a,s),a.unshift(s),a.splice(32,a.length-32),this.appStateManager.pushToState("custom"===t?"recentCustomEmoji":"recentEmoji",a),this.rootScope.dispatchEvent("emoji_recent",e)}))}getCustomEmojiDocuments(e){return e.length?this.apiManager.invokeApi("messages.getCustomEmojiDocuments",{document_id:e}).then((e=>e.map((e=>this.appDocsManager.saveDoc(e,{type:"customEmoji",docId:e.id}))))):Promise.resolve([])}getCachedCustomEmojiDocuments(e){return e.map((e=>this.appDocsManager.getDoc(e)))}setDebouncedGetCustomEmojiDocuments(){!this.getCustomEmojiDocumentsPromise&&this.getCustomEmojiDocumentPromises.size&&(this.getCustomEmojiDocumentsPromise=(0,P.Z)(0).then((()=>{const e=[...this.getCustomEmojiDocumentPromises.keys()],t=[];do{const a=e.splice(0,100),s=this.getCustomEmojiDocuments(a).then((e=>{e.forEach(((e,t)=>{const s=a[t],n=this.getCustomEmojiDocumentPromises.get(s);this.getCustomEmojiDocumentPromises.delete(s),n.resolve(e)}))}));t.push(s)}while(e.length);return Promise.all(t)})).finally((()=>{this.getCustomEmojiDocumentsPromise=void 0,this.setDebouncedGetCustomEmojiDocuments()})))}getCustomEmojiDocument(e){let t=this.getCustomEmojiDocumentPromises.get(e);if(t)return t;return this.appDocsManager.getDoc(e)||(t=(0,v.Z)(),this.getCustomEmojiDocumentPromises.set(e,t),this.setDebouncedGetCustomEmojiDocuments(),t)}getCustomEmojis(){return this.appStickersManager.getEmojiStickers()}}Mt.POPULAR_EMOJI=["๐Ÿ˜‚","๐Ÿ˜˜","โค๏ธ","๐Ÿ˜","๐Ÿ˜Š","๐Ÿ˜","๐Ÿ‘","โ˜บ๏ธ","๐Ÿ˜”","๐Ÿ˜„","๐Ÿ˜ญ","๐Ÿ’‹","๐Ÿ˜’","๐Ÿ˜ณ","๐Ÿ˜œ","๐Ÿ™ˆ","๐Ÿ˜‰","๐Ÿ˜ƒ","๐Ÿ˜ข","๐Ÿ˜","๐Ÿ˜ฑ","๐Ÿ˜ก","๐Ÿ˜","๐Ÿ˜ž","๐Ÿ˜…","๐Ÿ˜š","๐Ÿ™Š","๐Ÿ˜Œ","๐Ÿ˜€","๐Ÿ˜‹","๐Ÿ˜†","๐Ÿ‘Œ","๐Ÿ˜","๐Ÿ˜•"];var It=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 St extends G{after(){this.log=(0,I.kg)("GROUP-CALLS"),this.groupCalls=new Map,this.participants=new Map,this.nextOffsets=new Map,this.apiUpdatesManager.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)}}),this.rootScope.addEventListener("group_call_update",(e=>{"groupCallDiscarded"===e._&&this.participants.delete(e.id)}))}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 s=this.getCachedParticipants(e),n=(0,le.Z)(t.peer),i=s.get(n),r=t.pFlags.left;if(!i&&r)return;t.pFlags.muted||t.pFlags.can_self_unmute||(t.pFlags.can_self_unmute=!0),i?(re(i,t),t=i):s.set(n,t);const o=this.getGroupCall(e);if("groupCall"===(null==o?void 0:o._)){let e=!1;r?(--o.participants_count,e=!0):!t.pFlags.just_joined||i||t.pFlags.self||(++o.participants_count,e=!0),e&&this.rootScope.dispatchEvent("group_call_update",o)}r&&s.delete(n),this.rootScope.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 It(this,void 0,void 0,(function*(){this.saveApiParticipant(e,t);const s=t.pFlags.self?o.NM:(0,le.Z)(t.peer),n=yield this.apiManager.invokeApiSingle("phone.editGroupCallParticipant",{call:this.getGroupCallInput(e),participant:s===o.NM?this.appPeersManager.getInputPeerSelf():this.appPeersManager.getInputPeerById(s),muted:a.muted,volume:a.volume,raise_hand:a.raiseHand,video_paused:a.videoPaused,video_stopped:a.videoStopped,presentation_paused:a.presentationPaused});this.apiUpdatesManager.processUpdateMessage(n)}))}getGroupCall(e){return this.groupCalls.get(e)}getGroupCallFull(e,t){return It(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 this.apiManager.invokeApiSingleProcess({method:"phone.getGroupCall",params:{call:this.getGroupCallInput(e),limit:s},processResult:t=>{this.appUsersManager.saveApiUsers(t.users),this.appChatsManager.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&&re(a,e),e=a):this.groupCalls.set(e.id,e),s&&this.rootScope.dispatchEvent("group_call_update",e),e}createGroupCall(e,t,a){return It(this,void 0,void 0,(function*(){const s=yield this.apiManager.invokeApi("phone.createGroupCall",{peer:this.appPeersManager.getInputPeerById(e.toPeerId(!0)),random_id:(0,Te.d)(32),schedule_date:t,title:a});return this.apiUpdatesManager.processUpdateMessage(s),s.updates.find((e=>"updateGroupCall"===e._)).call}))}getGroupCallInput(e){const t=this.getGroupCall(e);return{_:"inputGroupCall",id:t.id,access_hash:t.access_hash}}getGroupCallParticipants(e){return It(this,void 0,void 0,(function*(){const{nextOffset:t,setNextOffset:a}=this.prepareToSavingNextOffset(e);return""!==t&&(yield this.apiManager.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;this.appChatsManager.saveApiChats(t.chats),this.appUsersManager.saveApiUsers(t.users),this.saveApiParticipants(e,t.participants),a(s)}})),{participants:this.getCachedParticipants(e),isEnd:""===this.nextOffsets.get(e)}}))}hangUp(e,t){const a=this.getGroupCallInput(e);let s;return s="boolean"==typeof t&&t?this.apiManager.invokeApi("phone.discardGroupCall",{call:a}):"number"==typeof t?this.apiManager.invokeApi("phone.leaveGroupCall",{call:a,source:t}):this.apiManager.invokeApi("phone.joinGroupCall",{call:a,join_as:this.appPeersManager.getInputPeerSelf(),muted:!0,video_stopped:!0,params:{_:"dataJSON",data:""}}),s.then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}joinGroupCall(e,t,a){return It(this,void 0,void 0,(function*(){const s=this.getGroupCallInput(e);let n;if("main"===a.type){const i={call:s,join_as:this.appPeersManager.getInputPeerSelf(),params:t,muted:a.isMuted,video_stopped:!a.joinVideo};n=this.apiManager.invokeApi("phone.joinGroupCall",i),this.log(`[api] joinGroupCall id=${e}`,i)}else{const a={call:s,params:t};n=this.apiManager.invokeApi("phone.joinGroupCallPresentation",a),this.log(`[api] joinGroupCallPresentation id=${e}`,a)}const i=yield n;return this.apiUpdatesManager.processUpdateMessage(i),i.updates.find((e=>"updateGroupCallConnection"===e._))}))}leaveGroupCallPresentation(e){return this.apiManager.invokeApi("phone.leaveGroupCallPresentation",{call:this.getGroupCallInput(e)}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}}function Ct(e){return{_:"inputPhoto",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference}}function wt(e){return{_:"inputMediaPhoto",id:Ct(e),ttl_seconds:0,pFlags:{}}}var kt=a(515);function At(e){return{_:"inputMediaDocument",id:{_:"inputDocument",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference},ttl_seconds:0,pFlags:{}}}class Dt extends G{constructor(){super(...arguments),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,a="",s="",n){return this.apiManager.invokeApi("messages.getInlineBotResults",{bot:this.appUsersManager.getUserInput(t),peer:this.appPeersManager.getInputPeerById(e),query:a,geo_point:n?this.getGeoInput(n):void 0,offset:s},{stopTime:-1,noErrorBox:!0}).then((e=>{const t=e.query_id;return e.results.forEach((e=>{"botInlineMediaResult"===e._&&(e.document&&(e.document=this.appDocsManager.saveDoc(e.document)),e.photo&&(e.photo=this.appPhotosManager.savePhoto(e.photo))),this.inlineResults[(0,kt.Z)(t,e.id)]=e})),e}))}pushPopularBot(e){this.appUsersManager.getTopPeers("bots_inline").then((t=>{const a=e.toPeerId(),s=t.findIndex((e=>e.id===a));let n;n=-1!==s?t[s]:{id:a,rating:0},++n.rating,(0,ie.Z)(t,n,"rating"),this.appStateManager.setKeyValueToStorage("topPeersCache")}))}switchToPM(e,t,a){return this.setHash[t]={peerId:e,time:Date.now()},this.appMessagesManager.startBot(t,void 0,a)}checkSwitchReturn(e){return t=this,a=void 0,n=function*(){const t=this.appUsersManager.getUser(e);if(!t||!t.pFlags.bot||!t.bot_inline_placeholder)return;const a=this.setHash[e];return a&&(delete this.setHash[e],Date.now()-a.time<36e5)?a.peerId:void 0},new((s=void 0)||(s=Promise))((function(e,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(r,o)}p((n=n.apply(t,a||[])).next())}));var t,a,s,n}switchInlineQuery(e,t,a,s){this.appDraftsManager.setDraft(e,t,"@"+this.appPeersManager.getPeerUsername(a.toPeerId())+" "+s)}callbackButtonClick(e,t,a){return this.apiManager.invokeApi("messages.getBotCallbackAnswer",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(t),data:a.data},{stopTime:-1,noErrorBox:!0})}sendInlineResult(e,t,a,s={}){const n=this.inlineResults[a];if(!n)return;this.pushPopularBot(t);const i=a.split("_"),r=i.shift(),o=i.join("_");if(s.viaBotId=t,s.queryId=r,s.resultId=o,n.send_message.reply_markup&&(s.replyMarkup=n.send_message.reply_markup),"botInlineMessageText"===n.send_message._)s.entities=n.send_message.entities,this.appMessagesManager.sendText(e,n.send_message.message,s);else{let t,a,i="";const r=n.send_message;switch(r._){case"botInlineMessageMediaAuto":if(i=r.message,"botInlineMediaResult"===n._){const{document:e,photo:a}=n;t=e?At(e):wt(a)}break;case"botInlineMessageMediaGeo":t={_:"inputMediaGeoPoint",geo_point:this.getGeoInput(r.geo)},s.geoPoint=r.geo;break;case"botInlineMessageMediaVenue":t={_:"inputMediaVenue",geo_point:this.getGeoInput(r.geo),title:r.title,address:r.address,provider:r.provider,venue_id:r.venue_id,venue_type:r.venue_type},s.geoPoint=r.geo;break;case"botInlineMessageMediaContact":t={_:"inputMediaContact",phone_number:r.phone_number,first_name:r.first_name,last_name:r.last_name,vcard:r.vcard};break;case"botInlineMessageMediaInvoice":a={_:"messageMediaInvoice",title:r.title,description:r.description,photo:r.photo,currency:r.currency,total_amount:r.total_amount,pFlags:{shipping_address_requested:r.pFlags.shipping_address_requested,test:r.pFlags.test},start_param:void 0}}!t&&a&&(t={_:"messageMediaPending",messageMedia:a}),this.appMessagesManager.sendOther(e,t,s)}}}var Ut=a(7082);class Tt{constructor(){this.tempNum=0}generateTempMessageId(e){const t=++this.tempNum;return(0,pe.Z)(e)+(t&Ut.o-1)}}var Et=a(4421),Ft=a(3624),Rt=a(7401);function xt(e,t){if(e.length{let o=e.slice(s,r);const p=n++;o.length>t&&(xt(o.slice(t),t).forEach((e=>{i[n++]=e})),o=o.slice(0,t)),s=r,a=0,i[p]=(i[p]||"")+o};let o=0;for(;;){let s=e.indexOf(" ",o);if(-1===s){o!==e.length-1&&r();break}s+=" ".length;const n=s-o;a+n>t&&r(a),o=s,a+=n}return i}var Bt=a(5701),Vt=a(7667),Ot=a(6241),Lt=a(6535),Nt=a(6566),Zt=a(2202),jt=a(319);const qt=new class{constructor(){this.tabs=new Map}start(){f.Z.getInstance().addEventListener("tabState",((e,t)=>{this.tabs.get(t).state=e}))}getTabs(){return[...this.tabs.values()].filter((e=>!!e.state))}addTab(e){const t={source:e,state:void 0};this.tabs.set(e,t)}deleteTab(e){this.tabs.delete(e)}};d.GO&&(d.GO.appTabsManager=qt);const Gt=qt;var Ht=a(2381),Wt=a(13);function zt(e){return{_:"inputDocument",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference}}var Kt=a(5285),Jt=a(5102);function $t(e,t,a){a?e[t]=!0:delete e[t]}var Qt=a(4993),Yt=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 Xt=e=>{e()},ea=!0;class ta extends G{constructor(){super(...arguments),this.pendingByRandomId={},this.pendingByMessageId={},this.pendingAfterMsgs={},this.pendingTopMsgs={},this.tempFinalizeCallbacks={},this.sendSmthLazyLoadQueue=new Et.Z(10),this.needSingleMessages=new Map,this.extendedMedia=new Map,this.maxSeenId=0,this.migratedFromTo={},this.migratedToFrom={},this.newDialogsToHandle=new Map,this.newUpdatesAfterReloadToHandle={},this.notificationsToHandle={},this.reloadConversationsPeers=new Map,this.log=(0,I.kg)("MESSAGES",I.v9.Error|I.v9.Debug|I.v9.Log|I.v9.Warn),this.groupedTempId=0,this.typings={},this.unreadMentions={},this.goToNextMentionPromises={},this.batchUpdates={},this.clear=e=>{this.middleware?this.middleware.clean():(this.middleware=(0,Ft.k)(),this.uploadFilePromises={}),this.messagesStorageByPeerId={},this.groupedMessagesStorage={},this.scheduledMessagesStorage={},this.historiesStorage={},this.threadsStorage={},this.searchesStorage={},this.pinnedMessages={},this.threadsServiceMessagesIdsStorage={},this.threadsToReplies={},this.dialogsStorage&&this.dialogsStorage.clear(e),this.filtersStorage&&this.filtersStorage.clear(e)},this.handleNewDialogs=()=>{let e=0;const t=new Map,a=a=>{var s;const{peerId:n}=a;this.dialogsStorage.pushDialog({dialog:a}),this.appPeersManager.isChannel(n)||(e=Math.max(e,a.top_message||0));let i=t.get(n);i||t.set(n,i={}),"forumTopic"===a._?(null!==(s=i.topics)&&void 0!==s?s:i.topics=new Map).set(a.id,a):i.dialog=a};for(const[e,t]of this.newDialogsToHandle){const s="dialog"in t,{dialog:n,topics:i}=t;s&&(n?this.dialogsStorage.getDialogOnly(e)&&a(n):this.reloadConversation(e.toPeerId())),i&&(null==i||i.forEach(((t,s)=>{t?this.dialogsStorage.getForumTopic(e,s)&&a(t):this.dialogsStorage.getForumTopicById(e,s)})))}0!==e&&this.incrementMaxSeenId(e),this.rootScope.dispatchEvent("dialogs_multiupdate",t),this.newDialogsToHandle.clear()},this.handleNotifications=()=>{E.Z.clearTimeout(this.notificationsHandlePromise),this.notificationsHandlePromise=void 0;for(const e in this.notificationsToHandle){const[t,a]=e.split("_"),s=this.notificationsToHandle[e];this.getNotifyPeerSettings(t.toPeerId(),a?+a:void 0).then((({muted:e,peerTypeNotifySettings:t})=>{const a=s.topMessage;e&&!a.pFlags.mentioned||!a.pFlags.unread||a.pFlags.unread&&this.notifyAboutMessage(a,{fwdCount:s.fwdCount,peerTypeNotifySettings:t})}))}this.notificationsToHandle={}},this.onUpdateMessageId=e=>{const t=e.random_id;if(!this.pendingByRandomId[t])return;const a=(0,pe.Z)(e.id);this.pendingByMessageId[a]=t},this.onUpdateNewMessage=e=>{var t,a,s,n;const i=e.message,r=this.getMessagePeer(i),p=this.getHistoryMessagesStorage(r),d="updateNewDiscussionMessage"===e._;this.saveMessages([i],{storage:this.createMessageStorage(r,"history")});const f=this.appPeersManager.isForum(r),c=this.getThreadKey(i),l=c?+c.split("_")[1]:void 0,m=this.dialogsStorage.getDialogOrTopic(r,d?l:void 0);if((!m||this.reloadConversationsPeers.has(r))&&!d){let t=!0;if(r.isAnyChat()&&(t=this.appChatsManager.isInChat(r.toChatId())),t)return void this.handleNewUpdateAfterReload(r,e)}if(l&&!d){const e=null===(t=this.threadsStorage[r])||void 0===t?void 0:t[l],a={_:"updateNewDiscussionMessage",message:i};this.appChatsManager.isForum(r.toChatId())&&!this.dialogsStorage.getForumTopic(r,l)?this.handleNewUpdateAfterReload(r,a,l):e&&this.onUpdateNewMessage(a)}if("messageService"===i._){const{action:e}=i;if("messageActionPaymentSent"===e._&&i.reply_to&&this.rootScope.dispatchEvent("payment_sent",{peerId:i.reply_to.reply_to_peer_id?this.appPeersManager.getPeerId(i.reply_to.reply_to_peer_id):i.peerId,mid:i.reply_to_mid,receiptMessage:i}),"messageActionTopicEdit"===e._&&!d){const t=this.dialogsStorage.getForumTopic(r,l);if(t){const a=(0,ve.Z)(t);void 0!==e.title&&(t.title=e.title),void 0!==e.closed&&$t(t.pFlags,"closed",e.closed),void 0!==e.hidden&&$t(t.pFlags,"hidden",e.hidden),void 0!==e.icon_emoji_id&&(t.icon_emoji_id=e.icon_emoji_id),this.scheduleHandleNewDialogs(r,t),this.dialogsStorage.processTopicUpdate(t,a)}else this.dialogsStorage.getForumTopicById(r,l)}}this.saveMessages([i],{storage:p}),this.checkPendingMessage(i);const g=this.getHistoryStorage(r,d?l:void 0);d||this.updateMessageRepliesIfNeeded(i);const h=e.ignoreExisting;if(g.history.findSlice(i.mid)){if(!h)return!1}else{const e=g.history.first;if(e.isEnd(se.D.Bottom)){let t=0;for(const a=e.length;te[t]);++t);e.splice(t,0,i.mid)}else g.history.unshift(i.mid);null!==g.count&&++g.count}(!g.maxId||i.mid>g.maxId)&&(g.maxId=i.mid),this.mergeReplyKeyboard(g,i)&&this.rootScope.dispatchEvent("history_reply_markup",{peerId:r});const u=i.fromId;if(u.isUser()&&!i.pFlags.out&&i.from_id){this.appUsersManager.forceUserOnline(u,i.date);const e={_:"sendMessageCancelAction"};let t;t=r.isUser()?{_:"updateUserTyping",action:e,user_id:u}:this.appPeersManager.isChannel(r)?{_:"updateChannelUserTyping",action:e,channel_id:r.toChatId(),from_id:this.appPeersManager.getOutputPeer(u),top_msg_id:l?(0,oe.Z)(l):void 0}:{_:"updateChatUserTyping",action:e,chat_id:r.toChatId(),from_id:this.appPeersManager.getOutputPeer(u)},this.apiUpdatesManager.processLocalUpdate(t)}this.handleNewMessage(i);const y="forumTopic"===(null==m?void 0:m._);if(d&&!y||!m)return;const _=!i.pFlags.out&&i.pFlags.unread;if(_&&i.mid>m.top_message){const e=this.dialogsStorage.prepareDialogUnreadCountModifying(m);++m.unread_count,i.pFlags.mentioned&&(++m.unread_mentions_count,this.modifyCachedMentions(r,i.mid,!0,y?l:void 0)),e()}if(i.mid>=m.top_message&&this.setDialogTopMessage(i,m),(!d&&!f||y)&&_){const e=c||r,t=null!==(a=(n=this.notificationsToHandle)[e])&&void 0!==a?a:n[e]={fwdCount:0,fromId:o.NM};t.fromId!==u&&(t.fromId=u,t.fwdCount=0),i.fwd_from&&++t.fwdCount,t.topMessage=i,null!==(s=this.notificationsHandlePromise)&&void 0!==s||(this.notificationsHandlePromise=E.Z.setTimeout(this.handleNotifications,0))}},this.onUpdateMessageReactions=e=>{const{peer:t,msg_id:a,reactions:s}=e,n=(0,pe.Z)(a),i=this.appPeersManager.getPeerId(t),r=this.getMessageByPeer(i,n);if("message"!==(null==r?void 0:r._))return;const o=null==s?void 0:s.recent_reactions;if((null==o?void 0:o.length)&&r.pFlags.out){const e=o[o.length-1],t=r.reactions,a=null==t?void 0:t.recent_reactions;this.appPeersManager.getPeerId(e.peer_id)===this.appPeersManager.peerId||a&&!(a.length<=o.length)||a&&(0,Y.Z)(e,a[a.length-1])||this.getNotifyPeerSettings(i).then((({muted:t,peerTypeNotifySettings:a})=>{a.show_previews&&this.notifyAboutMessage(r,{peerReaction:e,peerTypeNotifySettings:a})}))}const p=r.peerId+"_"+r.mid;this.pushBatchUpdate("messages_reactions",this.batchUpdateReactions,p,(()=>(0,ve.Z)(r.reactions))),r.reactions=s,e.local||this.setDialogToStateIfMessageIsTop(r)},this.onUpdateDialogUnreadMark=e=>{const t=this.appPeersManager.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(),this.dialogsStorage.setDialogToState(a),this.rootScope.dispatchEvent("dialogs_multiupdate",new Map([[t,{dialog:a}]]))}else this.scheduleHandleNewDialogs(t)},this.onUpdateEditMessage=e=>{var t,a;const s=e.message,n=this.getMessagePeer(s),i=(0,pe.Z)(s.id),r=this.getHistoryMessagesStorage(n);if(!r.has(i))return;const o=this.getMessageFromStorage(r,i);this.saveMessages([s],{storage:r});const p=this.getMessageFromStorage(r,i);this.handleEditedMessage(o,p,r);const d=this.getDialogOnly(n),f=(null==d?void 0:d.top_message)===i;if(s.clear_history)f&&this.rootScope.dispatchEvent("dialog_flush",{peerId:n,dialog:d});else{let e=!0;if("message"===(null==o?void 0:o._)&&!(0,Y.Z)(o.reactions,p.reactions)){const t=p.reactions;p.reactions=o.reactions,this.apiUpdatesManager.processLocalUpdate({_:"updateMessageReactions",peer:this.appPeersManager.getOutputPeer(n),msg_id:s.id,reactions:t}),e=!1}e&&this.rootScope.dispatchEvent("message_edit",{storageKey:r.key,peerId:n,mid:i,message:s}),f&&this.dialogsStorage.setDialogToState(d);const c=new Map,l=()=>{let e=c.get(n);return e||c.set(n,e={}),e};(f||s.grouped_id)&&d&&(l().dialog=d);const m=this.getThreadKey(s);if(m){const e=+m.split("_")[1],s=this.dialogsStorage.getForumTopic(n,e);s&&(null!==(t=(a=l()).topics)&&void 0!==t?t:a.topics=new Map).set(e,s)}c.size&&this.rootScope.dispatchEvent("dialogs_multiupdate",c)}},this.onUpdateReadHistory=e=>{const t=e.channel_id,a=(0,pe.Z)(e.max_id||e.read_max_id),s=(0,pe.Z)(e.top_msg_id),n=t?t.toPeerId(!0):this.appPeersManager.getPeerId(e.peer),i="updateReadHistoryOutbox"===e._||"updateReadChannelOutbox"===e._||"updateReadChannelDiscussionOutbox"===e._||void 0,r=!!t&&this.appChatsManager.isForum(t),o=this.getHistoryMessagesStorage(n),p=(0,Rt.Z)(o,"desc"),d=s&&r?this.dialogsStorage.getForumTopic(n,s):this.getDialogOnly(n),f=e.still_unread_count;let c=0,l=0,m=!1;const g=this.getHistoryStorage(n,s);if(n.isUser()&&i&&this.appUsersManager.forceUserOnline(n.toUserId()),s){const e=this.threadsToReplies[n+"_"+s];if(e){const[t,a]=e.split("_");this.updateMessage(t.toPeerId(),+a,"replies_updated")}}const h=d&&this.dialogsStorage.prepareDialogUnreadCountModifying(d),u=this.getReadMaxIdIfUnread(n,s);for(let e=0,t=p.length;ea)continue;const g=o.get(t);if(g.pFlags.out!==i)continue;const h=(0,Qt.Z)(g,r);if(!s||h===s){if(!(g.pFlags.unread||u&&u=d.top_message||!u?e=0:c&&d.top_message>a&&(e=c),void 0!==e&&(d.unread_count=e),(l<0||!d.unread_count)&&(d.unread_mentions_count=0)}null==h||h(),this.dialogsStorage.processDialogForFilters(d),this.rootScope.dispatchEvent("dialog_unread",{peerId:n,dialog:d}),this.dialogsStorage.setDialogToState(d),m||void 0!==f||i||!d.unread_count||("forumTopic"===d._?this.dialogsStorage.getForumTopicById(n,s):this.reloadConversation(n))}if(m&&this.rootScope.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("_");this.rootScope.dispatchEvent("replies_updated",this.getMessageByPeer(e.toPeerId(),+a))}}},this.onUpdateReadMessagesContents=e=>{const t=e.channel_id,a=e.top_msg_id,s=a?(0,pe.Z)(a):void 0,n=e.messages.map((e=>(0,pe.Z)(e))),i=t?t.toPeerId(!0):this.findPeerIdByMids(n);for(let e=0,t=n.length;e{const t=e.channel_id.toPeerId(!0),a=this.getHistoryStorage(t).history.slice,s=(0,pe.Z)(e.available_min_id),n=a.filter((e=>e<=s));e.messages=n,this.onUpdateDeleteMessages(e)},this.onUpdateDeleteMessages=e=>{var t;const a=e.channel_id,s=e.messages.map((e=>(0,pe.Z)(e))),n=a?a.toPeerId(!0):this.findPeerIdByMids(s);if(!n)return;this.apiManager.clearCache("messages.getSearchCounters",(e=>this.appPeersManager.getPeerId(e.peer)===n));const i=new Set,r=new Map;for(const e of s){const a=this.getMessageByPeer(n,e),s=this.getThreadKey(a);if(!s)continue;const o=+s.split("_")[1];if((null===(t=this.threadsStorage[n])||void 0===t?void 0:t[o])&&(i.add(s),!r.has(o))){const e=this.dialogsStorage.getForumTopic(n,o);e&&r.set(o,e)}}const o=this.handleDeletedMessages(n,this.getHistoryMessagesStorage(n),s),p=Array.from(i).map((e=>{const[t,a]=e.split("_");return this.getHistoryStorage(t.toPeerId(),+a)}));[this.getHistoryStorage(n),...p].forEach((e=>{for(const t of o.msgs)e.history.delete(t);o.count&&e.count&&(e.count=Math.max(0,e.count-o.count))})),this.rootScope.dispatchEvent("history_delete",{peerId:n,msgs:o.msgs});const d=[...r.values()],f=this.getDialogOnly(n);f&&d.unshift(f),d.forEach((e=>{const t="forumTopic"===e._,a=o.unreadMentions||o.unread,s=a&&this.dialogsStorage.prepareDialogUnreadCountModifying(e);if(o.unread&&(e.unread_count=Math.max(0,e.unread_count-o.unread)),o.unreadMentions&&(e.unread_mentions_count=e.unread_count?Math.max(0,e.unread_mentions_count-o.unreadMentions):0),a&&(s(),t||this.rootScope.dispatchEvent("dialog_unread",{peerId:n,dialog:e})),o.msgs.has(e.top_message)){const a=this.getHistoryStorage(e.peerId,t?e.id:void 0).history.first;if(a.isEnd(se.D.Bottom)&&a.length){const t=a[0],s=this.getMessageByPeer(n,t);this.setDialogTopMessage(s,e)}else t?this.dialogsStorage.getForumTopicById(n,e.id):this.reloadConversation(n)}}))},this.onUpdateChannel=e=>{const t=e.channel_id,a=t.toPeerId(!0),s=this.appChatsManager.getChat(t),n=this.appChatsManager.isInChat(t);(!!(0,Jt.Z)(s)[0]||!s.pFlags.left)!=(void 0!==this.historiesStorage[a])&&(delete this.historiesStorage[a],this.rootScope.dispatchEvent("history_forbidden",a)),!!this.getDialogOnly(a)!==n&&(n?this.reloadConversation(a):this.dialogsStorage.dropDialogOnDeletion(a)),this.rootScope.dispatchEvent("channel_update",t)},this.onUpdateChannelReload=e=>{const t=e.channel_id.toPeerId(!0);this.flushStoragesByPeerId(t),Promise.all([this.reloadConversation(t)]).then((()=>{this.rootScope.dispatchEvent("history_reload",t)}))},this.onUpdateChannelMessageViews=e=>{var t;const a=e.views,s=null!==(t=e.peerId)&&void 0!==t?t:e.channel_id.toPeerId(!0),n=(0,pe.Z)(e.id),i=this.getMessageByPeer(s,n);void 0!==(null==i?void 0:i.views)&&i.views{var t;if(null===(t=e.pFlags)||void 0===t?void 0:t.popup)return void this.rootScope.dispatchEvent("service_notification",e);const a=o.yF,s=a,n=this.generateTempMessageId(s),i={_:"message",id:n,from_id:this.appPeersManager.getOutputPeer(a),peer_id:this.appPeersManager.getOutputPeer(s),pFlags:{unread:!0},date:(e.inbox_date||(0,te.Z)(!0))+this.timeManager.getServerTimeOffset(),message:e.message,media:e.media,entities:e.entities};this.appUsersManager.hasUser(a)||this.appUsersManager.saveApiUsers([{_:"user",id:a,pFlags:{verified:!0},access_hash:"0",first_name:"Telegram",phone:"42777"}]),this.saveMessages([i],{isOutgoing:!0}),e.inbox_date&&(this.pendingTopMsgs[s]=n,this.onUpdateNewMessage({_:"updateNewMessage",message:i,pts:void 0,pts_count:void 0}))},this.onUpdatePinnedMessages=e=>{const t="updatePinnedChannelMessages"===e._?e.channel_id:void 0,a=t?t.toPeerId(!0):this.appPeersManager.getPeerId(e.peer),s=e.messages.map((e=>(0,pe.Z)(e))),n=this.getHistoryMessagesStorage(a),i=s.filter((e=>!n.has(e)));(i.length?Promise.all(i.map((e=>this.reloadMessages(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[this.getPinnedMessagesKey(a)],this.appStateManager.getState().then((e=>{delete e.hiddenPinnedMessages[a],this.rootScope.dispatchEvent("peer_pinned_messages",{peerId:a,mids:s,pinned:i})}))}))},this.onUpdateNotifySettings=e=>{const{peer:t,notify_settings:a}=e,s="notifyForumTopic"===t._;if("notifyPeer"!==t._&&!s)return;const n=this.appPeersManager.getPeerId(t.peer),i=this.dialogsStorage.getDialogOrTopic(n,s?(0,pe.Z)(t.top_msg_id):void 0);i&&(i.notify_settings=a,this.rootScope.dispatchEvent("dialog_notify_settings",i),this.dialogsStorage.setDialogToState(i))},this.onUpdateNewScheduledMessage=e=>{const t=e.message,a=this.getMessagePeer(t),s=this.scheduledMessagesStorage[a];if(!s)return;const n=(0,pe.Z)(t.id),i=this.getMessageFromStorage(s,n);this.saveMessages([t],{storage:s,isScheduled:!0});const r=this.getMessageFromStorage(s,n);i?(this.handleEditedMessage(i,r,s),this.rootScope.dispatchEvent("message_edit",{storageKey:s.key,peerId:a,mid:t.mid,message:t})):this.checkPendingMessage(t)||this.rootScope.dispatchEvent("scheduled_new",t)},this.onUpdateDeleteScheduledMessages=e=>{const t=this.appPeersManager.getPeerId(e.peer),a=this.scheduledMessagesStorage[t];if(a){const s=e.messages.map((e=>(0,pe.Z)(e)));this.handleDeletedMessages(t,a,s),this.rootScope.dispatchEvent("scheduled_delete",{peerId:t,mids:s})}},this.onUpdateMessageExtendedMedia=e=>{var t;const a=this.appPeersManager.getPeerId(e.peer),s=(0,pe.Z)(e.msg_id),n=this.getHistoryMessagesStorage(a);if(!n.has(s))return;const i=this.getMessageFromStorage(n,s),r=i.media;"messageExtendedMedia"!==(null===(t=r.extended_media)||void 0===t?void 0:t._)&&(r.extended_media=e.extended_media,this.onUpdateEditMessage({_:"updateEditMessage",message:i,pts:0,pts_count:0}))},this.batchUpdateViews=e=>{const t=[],a=this.getMessagesFromMap(e);for(const[e]of a)t.push({peerId:e.peerId,mid:e.mid,views:e.views});return t},this.batchUpdateReactions=e=>{var t,a,s;const n=[],i=this.getMessagesFromMap(e);for(const[e,r]of i){const i=null!==(a=null===(t=e.reactions)||void 0===t?void 0:t.results)&&void 0!==a?a:[],o=null!==(s=null==r?void 0:r.results)&&void 0!==s?s:[],p=i.filter((t=>{const a=o.find((e=>(0,Kt.Z)(e.reaction,t.reaction)));return e.pFlags.out&&(!a||t.count>a.count)||void 0!==t.chosen_order&&(!a||void 0===a.chosen_order)}));n.push({message:e,changedResults:p})}return n}}after(){return this.clear(!0),this.apiUpdatesManager.addMultipleEventsListeners({updateMessageID:this.onUpdateMessageId,updateNewDiscussionMessage:this.onUpdateNewMessage,updateNewMessage:this.onUpdateNewMessage,updateNewChannelMessage:this.onUpdateNewMessage,updateDialogUnreadMark:this.onUpdateDialogUnreadMark,updateEditMessage:this.onUpdateEditMessage,updateEditChannelMessage:this.onUpdateEditMessage,updateMessageReactions:this.onUpdateMessageReactions,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,updateMessageExtendedMedia:this.onUpdateMessageExtendedMedia}),this.rootScope.addEventListener("notify_peer_type_settings",(({key:e,settings:t})=>{let a;a="notifyUsers"===e?e=>e.peerId.isUser():"notifyBroadcasts"===e?e=>this.appPeersManager.isBroadcast(e.peerId):e=>this.appPeersManager.isAnyGroup(e.peerId),this.dialogsStorage.getFolderDialogs(0).concat(this.dialogsStorage.getFolderDialogs(1)).filter(a).forEach((e=>{this.rootScope.dispatchEvent("dialog_notify_settings",e)}))})),this.rootScope.addEventListener("webpage_updated",(({id:e,msgs:t})=>{t.forEach((({peerId:t,mid:a,isScheduled:s})=>{const n=s?this.getScheduledMessagesStorage(t):this.getHistoryMessagesStorage(t),i=this.getMessageFromStorage(n,a);i&&(i.media={_:"messageMediaWebPage",webpage:this.appWebPagesManager.getCachedWebPage(e)},this.rootScope.dispatchEvent("message_edit",{storageKey:n.key,peerId:t,mid:a,message:i}))}))})),this.rootScope.addEventListener("draft_updated",(({peerId:e,threadId:t,draft:a})=>{const s=this.dialogsStorage.getDialogOrTopic(e,t);if(s){s.draft=a;let t=!1;a||(0,oe.Z)(s.top_message)?(this.dialogsStorage.generateIndexForDialog(s),this.dialogsStorage.pushDialog({dialog:s})):(this.dialogsStorage.dropDialog(e),t=!0),this.rootScope.dispatchEvent("dialog_draft",{peerId:e,dialog:s,drop:t,draft:a})}else if(t){const a=this.appChatsManager.getChat(e.toChatId());a?a.pFlags.forum&&this.dialogsStorage.getForumTopicById(e,t):this.reloadConversation(e)}else this.reloadConversation(e)})),this.rootScope.addEventListener("poll_update",(({poll:e})=>{const t=this.appPollsManager.pollToMessages[e.id];if(t)for(const e of t){const[t,a]=e.split("_"),s=this.getMessageByPeer(t.toPeerId(),+a);s&&this.setDialogToStateIfMessageIsTop(s)}})),this.rootScope.addEventListener("chat_toggle_forum",(({chatId:e,enabled:t})=>{const a=e.toPeerId(!0);if(!t){delete this.threadsStorage[a];for(const e in this.pinnedMessages)+e===a&&e.startsWith(a+"_")&&delete this.pinnedMessages[e]}})),this.batchUpdatesDebounced=(0,Bt.Z)((()=>{for(const e in this.batchUpdates){const t=this.batchUpdates[e];delete this.batchUpdates[e];const a=t.callback(t.batch);!a||a instanceof Array&&!a.length||rootScope.dispatchEvent(e,a)}}),33,!1,!0),this.appStateManager.getState().then((e=>{e.maxSeenMsgId&&(this.maxSeenId=e.maxSeenMsgId)}))}getInputEntities(e){const t=(0,ve.Z)(e);return t.forEach((e=>{"messageEntityMentionName"===e._&&(e._="inputMessageEntityMentionName",e.user_id=this.appUsersManager.getUserInput(e.user_id))})),t}invokeAfterMessageIsSent(e,t,a){var s,n,i;const r=null!==(s=(i=this.tempFinalizeCallbacks)[e])&&void 0!==s?s:i[e]={},o=null!==(n=r[t])&&void 0!==n?n:r[t]={deferred:(0,v.Z)()};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)));const i=a.entities||[];t&&(t=(0,ke.Z)(t,i));const r=a.scheduleDate||(e.pFlags.is_scheduled?e.date:void 0);return this.apiManager.invokeApi("messages.editMessage",{peer:this.appPeersManager.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=>{this.apiUpdatesManager.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={}){var s,n;return Yt(this,void 0,void 0,(function*(){if(!t.trim())return;null!==(s=a.entities)&&void 0!==s||(a.entities=[]),a.threadId&&!a.replyToMsgId&&(a.replyToMsgId=a.threadId);const i=(yield this.apiManager.getConfig()).message_length_max,r=xt(t,i);t=r[0],r.length>1&&("webPage"!==(null===(n=a.webPage)||void 0===n?void 0:n._)||t.includes(a.webPage.url)||delete a.webPage),e=this.appPeersManager.getPeerMigratedTo(e)||e;const o=a.entities;a.viaBotId||(t=(0,ke.Z)(t,o));let p=this.getInputEntities(o);p.length||(p=void 0);const d=this.generateOutgoingMessage(e,a);d.entities=o,d.message=t;const f=a.replyToMsgId?(0,oe.Z)(a.replyToMsgId):void 0,c=this.appPeersManager.isChannel(e);a.webPage&&(d.media={_:"messageMediaWebPage",webpage:a.webPage});const l=e=>{this.onMessagesSendError([d],e),this.rootScope.dispatchEvent("messages_pending")};d.send=()=>{l();const s={};this.pendingAfterMsgs[e]&&(s.afterMessageId=this.pendingAfterMsgs[e].messageId);const n=a.sendAsPeerId?this.appPeersManager.getInputPeerById(a.sendAsPeerId):void 0;let i;return i=a.viaBotId?this.apiManager.invokeApiAfter("messages.sendInlineBotResult",{peer:this.appPeersManager.getInputPeerById(e),random_id:d.random_id,reply_to_msg_id:f||void 0,query_id:a.queryId,id:a.resultId,clear_draft:a.clearDraft,send_as:n},s):this.apiManager.invokeApiAfter("messages.sendMessage",{no_webpage:a.noWebPage,peer:this.appPeersManager.getInputPeerById(e),message:t,random_id:d.random_id,reply_to_msg_id:f||void 0,entities:p,clear_draft:a.clearDraft,schedule_date:a.scheduleDate||void 0,silent:a.silent,send_as:n,update_stickersets_order:ea},s),this.pendingAfterMsgs[e]=s,i.then((e=>{if("updateShortSentMessage"===e._){const t=d.promise;delete d.promise;const s=(0,ve.Z)(d);(0,ge.Z)(d,["promise"]),d.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:d.random_id,id:s.id},{_:a.scheduleDate?"updateNewScheduledMessage":c?"updateNewChannelMessage":"updateNewMessage",message:s,pts:e.pts,pts_count:e.pts_count}]}}else e.updates&&e.updates.forEach((e=>{"updateDraftMessage"===e._&&(e.local=!0)}));this.apiUpdatesManager.processUpdateMessage(e),d.promise.resolve()}),(e=>{throw l(e),d.promise.reject(e),e})).finally((()=>{this.pendingAfterMsgs[e]===s&&delete this.pendingAfterMsgs[e]}))},this.beforeMessageSending(d,{isScheduled:!!a.scheduleDate||void 0,threadId:a.threadId,clearDraft:a.clearDraft,sequential:!0});const m=[d.promise];for(let t=1;t=0){r="audio",p="audio."+("ogg"===d.split("/")[1]?"ogg":"mp3"),P="sendMessageUploadAudioAction",t.isVoiceMessage&&(r="voice",s.pFlags.media_unread=!0);const e={_:"documentAttributeAudio",pFlags:{voice:t.isVoiceMessage||void 0},waveform:t.waveform,duration:t.duration||0};g.push(e)}else if(t.isMedia)if(h){r="photo",p="photo."+d.split("/")[1],P="sendMessageUploadPhotoAction";const e={_:"photoSize",w:t.width,h:t.height,type:o.Pt,location:null,size:a.size};y={_:"photo",id:""+s.id,sizes:[e],w:t.width,h:t.height},u&&y.sizes.unshift(u);const n=this.thumbsStorage.getCacheContext(y,e.type);n.downloaded=a.size,n.url=t.objectURL||"",y=this.appPhotosManager.savePhoto(y)}else if(i().VIDEO_MIME_TYPES_SUPPORTED.has(d)){r="video",p="video.mp4",P="sendMessageUploadVideoAction";const e={_:"documentAttributeVideo",pFlags:{round_message:t.isRoundMessage||void 0,supports_streaming:!0},duration:t.duration,w:t.width,h:t.height};g.push(e),t.noSound&&a.size>10240&&a.size<10485760&&g.push({_:"documentAttributeAnimated"})}else r="document",p="document."+d.split("/")[1],P="sendMessageUploadDocumentAction";else r="document",p="document."+d.split("/")[1],P="sendMessageUploadDocumentAction";if(g.push({_:"documentAttributeFilename",file_name:f||p}),-1!==["document","video","audio","voice"].indexOf(r)&&!c){const e=[];if(_={_:"document",id:""+s.id,duration:t.duration,attributes:g,w:t.width,h:t.height,thumbs:e,mime_type:d,size:a.size},t.objectURL){const e=this.thumbsStorage.getCacheContext(_);e.downloaded=a.size,e.url=t.objectURL}let n;if(h)g.push({_:"documentAttributeImageSize",w:t.width,h:t.height}),n={_:"photoSize",w:t.width,h:t.height,type:o.Pt,size:a.size};else if("video"===r&&t.thumb){n={_:"photoSize",w:t.thumb.size.width,h:t.thumb.size.height,type:"local-thumb",size:t.thumb.blob.size};const e=this.thumbsStorage.getCacheContext(_,n.type);e.downloaded=n.size,e.url=t.thumb.url}n&&e.push(n),u&&e.unshift(u),_=this.appDocsManager.saveDoc(_)}this.log("sendFile",r,p,a.type,t);const b=(0,v.Z)(),M=c?void 0:{_:y?"messageMediaPhoto":"messageMediaDocument",pFlags:{},photo:y,document:_};M&&((0,ge.Z)(M,["promise"]),M.promise=b,t.spoiler&&(M.pFlags.spoiler=!0)),s.entities=m,s.message=l,s.media=c?{_:"messageMediaDocument",pFlags:{},document:a}:M;const I=c?void 0:(0,Zt.Z)(a);s.uploadingFileName=I,I&&(this.uploadFilePromises[I]=b);const S=e=>{this.onMessagesSendError([s],e),this.rootScope.dispatchEvent("messages_pending")};let C=!1,w=null;s.send=()=>{if(c){const e={_:"inputMediaDocument",id:zt(a),pFlags:{}};b.resolve(e)}else if(a instanceof File||a instanceof Blob){const n=()=>{var n;let i;return C&&!s.error||(C=!1,w=this.apiFileManager.upload({file:a,fileName:I}),w.catch((a=>{C||(this.log("cancelling upload",M),this.cancelPendingMessage(s.random_id),this.setTyping(e,{_:"sendMessageCancelAction"},void 0,t.threadId),b.reject(a))})),w.addNotifyListener((a=>{const s=Math.max(1,Math.floor(100*a.done/a.total));P&&this.setTyping(e,{_:P,progress:0|s},void 0,t.threadId),b.notifyAll(a)})),b.notifyAll({done:0,total:a.size})),"video"===r&&t.objectURL&&(null===(n=t.thumb)||void 0===n?void 0:n.blob)&&(i=this.apiFileManager.upload({file:t.thumb.blob})),w&&w.then((e=>Yt(this,void 0,void 0,(function*(){let a;if(e.name=p,C=!0,a="photo"===r?{_:"inputMediaUploadedPhoto",file:e,pFlags:{spoiler:t.spoiler||void 0}}:{_:"inputMediaUploadedDocument",file:e,mime_type:d,pFlags:{force_file:"sendMessageUploadDocumentAction"===P||void 0,spoiler:t.spoiler||void 0},attributes:g},i)try{const e=yield i;a.thumb=e}catch(e){this.log.error("sendFile thumb upload error:",e)}b.resolve(a)}))),(e=>{throw S(e),e})),b};t.isGroupedItem?n():this.sendSmthLazyLoadQueue.push({load:n})}return b},this.beforeMessageSending(s,{isGroupedItem:t.isGroupedItem,isScheduled:!!t.scheduleDate||void 0,threadId:t.threadId,clearDraft:t.clearDraft,processAfter:t.processAfter}),t.isGroupedItem||(b.then((a=>(this.setTyping(e,{_:"sendMessageCancelAction"},void 0,t.threadId),this.apiManager.invokeApi("messages.sendMedia",{background:t.background,peer:this.appPeersManager.getInputPeerById(e),media:a,message:l,random_id:s.random_id,reply_to_msg_id:n,schedule_date:t.scheduleDate,silent:t.silent,entities:m,clear_draft:t.clearDraft,send_as:t.sendAsPeerId?this.appPeersManager.getInputPeerById(t.sendAsPeerId):void 0}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}),(e=>{if("photo"===r&&400===e.code&&("PHOTO_INVALID_DIMENSIONS"===e.type||"PHOTO_SAVE_FILE_INVALID"===e.type))return e.handled=!0,r="document",void s.send();throw S(e),e}))))),b.then(s.promise.resolve,s.promise.reject));const k={message:s};return(0,ge.Z)(k,["promise"]),k.promise=b,k}sendAlbum(e,t){return Yt(this,void 0,void 0,(function*(){if(t.threadId&&!t.replyToMsgId&&(t.replyToMsgId=t.threadId),1===t.sendFileDetails.length)return this.sendFile(e,Object.assign(Object.assign({},t),t.sendFileDetails[0]));e=this.appPeersManager.getPeerMigratedTo(e)||e;const a=t.replyToMsgId?(0,oe.Z)(t.replyToMsgId):void 0;let s=t.caption||"",n=t.entities||[];s&&(s=(0,ke.Z)(s,n)),this.log("sendAlbum",t);const i=""+ ++this.groupedTempId,r=[],o=e=>{r.push(e)},p=t.sendFileDetails.map(((r,p)=>{const d=Object.assign({isGroupedItem:!0,isMedia:t.isMedia,scheduleDate:t.scheduleDate,silent:t.silent,replyToMsgId:a,threadId:t.threadId,sendAsPeerId:t.sendAsPeerId,groupId:i,processAfter:o},r);return 0===p&&(d.caption=s,d.entities=n),this.sendFile(e,d).message}));t.clearDraft&&r.push((()=>{this.appDraftsManager.clearDraft(e,t.threadId)})),r.forEach((e=>{e()}));const d=(e,t)=>{this.onMessagesSendError([e],t),this.rootScope.dispatchEvent("messages_pending")},f=this.appPeersManager.getInputPeerById(e),c=s=>{this.setTyping(e,{_:"sendMessageCancelAction"},void 0,t.threadId);const n=(0,v.Z)();return this.sendSmthLazyLoadQueue.push({load:()=>this.apiManager.invokeApi("messages.sendMultiMedia",{peer:f,multi_media:s,reply_to_msg_id:a,schedule_date:t.scheduleDate,silent:t.silent,clear_draft:t.clearDraft,send_as:t.sendAsPeerId?this.appPeersManager.getInputPeerById(t.sendAsPeerId):void 0,update_stickersets_order:ea}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e),n.resolve()}),(e=>{p.forEach((t=>d(t,e))),n.reject(e)}))}),n},l=p.map((e=>e.send().then((e=>Promise.all([e,this.apiManager.invokeApi("messages.uploadMedia",{peer:f,media:e})]))).then((([t,a])=>{let i;if("messageMediaPhoto"===a._){const e=this.appPhotosManager.savePhoto(a.photo);i=wt(e)}else if("messageMediaDocument"===a._){const e=this.appDocsManager.saveDoc(a.document);i=At(e)}["pFlags","ttl_seconds"].forEach((e=>{var a;i[e]=null!==(a=t[e])&&void 0!==a?a:i[e]}));const r={_:"inputSingleMedia",media:i,random_id:e.random_id,message:s,entities:n};return s&&(s="",n=[]),r})).catch((t=>{throw this.log.error("sendAlbum upload item error:",t,e),d(e,t),t}))));return Promise.all(l).then((e=>c(e.filter(Boolean))))}))}sendContact(e,t){return this.sendOther(e,this.appUsersManager.getContactMediaInput(t))}sendOther(e,t,a={}){var s;e=this.appPeersManager.getPeerMigratedTo(e)||e;const n=this.generateOutgoingMessage(e,a),i=a.replyToMsgId?(0,oe.Z)(a.replyToMsgId):void 0;let r;switch(t._){case"inputMediaPoll":{const e=""+n.id;t.poll.id=e,this.appPollsManager.savePoll(t.poll,{_:"pollResults",flags:4,total_voters:0,pFlags:{},recent_voters:[]});const{poll:a,results:s}=this.appPollsManager.getPoll(e);r={_:"messageMediaPoll",poll:a,results:s};break}case"inputMediaPhoto":r={_:"messageMediaPhoto",photo:this.appPhotosManager.getPhoto(t.id.id),pFlags:{}};break;case"inputMediaDocument":r={_:"messageMediaDocument",document:this.appDocsManager.getDoc(t.id.id),pFlags:{}};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.messageMedia}n.media=r;const o=e=>{this.onMessagesSendError([n],e),this.rootScope.dispatchEvent("messages_pending")};return n.send=()=>{const s={};this.pendingAfterMsgs[e]&&(s.afterMessageId=this.pendingAfterMsgs[e].messageId);const r=a.sendAsPeerId?this.appPeersManager.getInputPeerById(a.sendAsPeerId):void 0;let p;return p=a.viaBotId?this.apiManager.invokeApiAfter("messages.sendInlineBotResult",{peer:this.appPeersManager.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,send_as:r},s):this.apiManager.invokeApiAfter("messages.sendMedia",{peer:this.appPeersManager.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,send_as:r,update_stickersets_order:ea},s),this.pendingAfterMsgs[e]=s,p.then((e=>{e.updates&&e.updates.forEach((e=>{"updateDraftMessage"===e._&&(e.local=!0)})),this.apiUpdatesManager.processUpdateMessage(e)}),(e=>{throw o(e),e})).finally((()=>{this.pendingAfterMsgs[e]===s&&delete this.pendingAfterMsgs[e]}))},this.beforeMessageSending(n,{isScheduled:!!a.scheduleDate||void 0,threadId:a.threadId,clearDraft:a.clearDraft,sequential:!0}),n.promise}beforeMessageSending(e,t={}){const a=e.id,s=this.getMessagePeer(e),n=t.isScheduled?this.getScheduledMessagesStorage(s):this.getHistoryMessagesStorage(s);e.storageKey=n.key;const i=[];if(t.isScheduled)this.saveMessages([e],{storage:n,isScheduled:!0,isOutgoing:!0}),i.push((()=>{this.rootScope.dispatchEvent("scheduled_new",e)}));else{const r=[this.getHistoryStorage(s),t.threadId?this.getHistoryStorage(s,t.threadId):void 0];for(const e of r)e&&e.history.unshift(a);if(this.saveMessages([e],{storage:n,isOutgoing:!0}),this.setDialogTopMessage(e),t.threadId){const a=this.dialogsStorage.getForumTopic(s,t.threadId);a&&this.setDialogTopMessage(e,a)}i.push((()=>{this.rootScope.dispatchEvent("history_append",{storageKey:n.key,message:e})}))}const r=this.pendingByRandomId[e.random_id]={peerId:s,tempId:a,threadId:t.threadId,storage:n,sequential:t.sequential};return this.pendingTopMsgs[s]=a,!t.isGroupedItem&&e.send&&i.push((()=>{t.clearDraft&&this.appDraftsManager.clearDraft(s,t.threadId),e.send()})),i.length&&(t.processAfter||Xt)((()=>{for(const e of i)e()})),r}generateOutgoingMessage(e,t){let a;t.threadId&&!t.replyToMsgId&&(t.replyToMsgId=t.threadId);const s=this.appPeersManager.isBroadcast(e);if(s&&this.appPeersManager.getPeer(e).pFlags.signatures){const e=this.appUsersManager.getSelf();a=e.first_name+(e.last_name?" "+e.last_name:"")}const n={_:"message",id:this.generateTempMessageId(e),from_id:t.sendAsPeerId?this.appPeersManager.getOutputPeer(t.sendAsPeerId):this.generateFromId(e),peer_id:this.appPeersManager.getOutputPeer(e),post_author:a,pFlags:this.generateFlags(e),date:t.scheduleDate||(0,te.Z)(!0)+this.timeManager.getServerTimeOffset(),message:"",grouped_id:t.groupId,random_id:(0,Te.a)(),reply_to:this.generateReplyHeader(e,t.replyToMsgId,t.threadId),via_bot_id:t.viaBotId,reply_markup:t.replyMarkup,replies:this.generateReplies(e),views:s&&1,pending:!0};return(0,ge.Z)(n,["send","promise"]),void 0===t.groupId&&(n.promise=(0,v.Z)()),n}generateReplyHeader(e,t,a){const s=this.appPeersManager.isForum(e);if(s&&!a){const s=this.getMessageByPeer(e,t);s&&(a=(0,Qt.Z)(s,!0))}const n={_:"messageReplyHeader",reply_to_msg_id:t||a,pFlags:{}};return a&&s&&o.Ox!==a&&(n.pFlags.forum_topic=!0),a&&n.reply_to_msg_id!==a&&(n.reply_to_top_id=a),n}generateReplies(e){let t;if(this.appPeersManager.isBroadcast(e)){const a=this.appProfileManager.getCachedFullChat(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 this.appPeersManager.isAnyChat(e)&&(this.appPeersManager.isBroadcast(e)||this.isAnonymousSending(e))?void 0:this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId())}generateFlags(e){const t={};return e!==this.appUsersManager.getSelf().id&&(t.out=!0,this.appPeersManager.isChannel(e)||this.appUsersManager.isBot(e)||(t.unread=!0)),this.appPeersManager.isBroadcast(e)&&(t.post=!0),t}generateForwardHeader(e,t){const a=this.appUsersManager.getSelf().id.toPeerId(),s=t.fromId;if(s===a&&t.peerId===a&&!t.fwd_from)return;const n={_:"messageFwdHeader",flags:0,date:t.date,pFlags:{}};let i=!1;if(t.fwd_from)n.from_id=t.fwd_from.from_id,n.from_name=t.fwd_from.from_name,n.post_author=t.fwd_from.post_author;else{if(n.post_author=t.post_author,s.isUser()){const e=this.appProfileManager.getCachedFullUser(s.toUserId());(null==e?void 0:e.private_forward_name)&&(n.from_name=e.private_forward_name,i=!0)}i||(n.from_id=this.appPeersManager.getOutputPeer(s))}return this.appPeersManager.isBroadcast(t.peerId)&&(t.post_author&&(n.post_author=t.post_author),n.channel_post=t.id),e!==a||i||(n.saved_from_msg_id=t.id,n.saved_from_peer=this.appPeersManager.getOutputPeer(t.peerId)),n}generateFakeAvatarMessage(e,t){const a=Number.MAX_SAFE_INTEGER,s={_:"messageService",pFlags:{},action:{_:"messageActionChannelEditPhoto",photo:t},id:a,peer_id:this.appPeersManager.getOutputPeer(e),mid:a,peerId:e,date:t.date,fromId:e};return this.getHistoryMessagesStorage(e).set(a,s),s}getUploadPromise(e){return this.uploadFilePromises[e]}isAnonymousSending(e){var t,a;return!!e.isAnyChat()&&(null===(a=null===(t=this.appPeersManager.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)){t&&(t.top_message=e.mid,this.getHistoryStorage(e.peerId,"forumTopic"===t._?t.id:void 0).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 this.apiUpdatesManager.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(e){return Yt(this,void 0,void 0,(function*(){const t=this.middleware.get();for(;!this.dialogsStorage.isDialogsLoaded(e);){const a=yield this.getTopMessages({limit:100,folderId:e});if(!t()||a.isEnd)break}}))}getReadMaxIdIfUnread(e,t){var a,s,n;const i=this.getHistoryStorage(e,t);if(t&&!this.appChatsManager.isForum(e.toChatId())){const t=this.getHistoryStorage(e),n=Math.max(null!==(a=t.readMaxId)&&void 0!==a?a:0,i.readMaxId),r=this.getMessageByPeer(e,i.maxId);return!(null===(s=null==r?void 0:r.pFlags)||void 0===s?void 0:s.out)&&n{if(!n()||"messages.dialogsNotModified"===r._)return null;d.ZP&&this.log("messages.getDialogs result:",r),i||s||t===ye||this.dialogsStorage.resetPinnedOrder(t),i||s||this.appDraftsManager.addMissedDialogs(),this.appUsersManager.saveApiUsers(r.users),this.appChatsManager.saveApiChats(r.chats),this.saveMessages(r.messages);let p=!!s,c=!1;const l=new Map,m=t===ye?o.J$:t,g=!!i||t===ye,h=r.dialogs||r.topics;if((0,ne.Z)(h,(e=>{var t,s;if(e)if(i||null!==(t=(s=e).folder_id)&&void 0!==t||(s.folder_id=m),this.dialogsStorage.saveDialog({dialog:e,ignoreOffsetDate:!0,saveGlobalOffset:g}),void 0!==e.peerId)if(p||this.appPeersManager.isChannel(e.peerId||this.appPeersManager.getPeerId(e.peer))||(this.incrementMaxSeenId(e.top_message),p=!0),a&&(0,ce.Z)(e)>a&&(this.scheduleHandleNewDialogs(e.peerId,e),c=!0),i||(0,oe.Z)(e.read_inbox_max_id)||(0,oe.Z)(e.read_outbox_max_id)){if(e.top_message){const t=this.getMessageByPeer(e.peerId,e.top_message);t&&(this.setMessageUnreadByDialog(t,e),this.dialogsStorage.setDialogToState(e))}}else l.set(e.peerId,{dialog:e}),this.log.error("noIdsDialogs",e,f);else this.log.error("bugged dialog?",e)})),l.size){const e=[...l.keys()],t=e.map((e=>this.reloadConversation(e)));Promise.all(t).then((()=>{this.rootScope.dispatchEvent("dialogs_multiupdate",l);for(let t=0;t=u||!h.length;v&&this.dialogsStorage.setDialogsLoaded(t,!0),c?this.scheduleHandleNewDialogs():this.rootScope.dispatchEvent("dialogs_multiupdate",new Map);const P=h,b=100===e?P:P.slice(0,e);return{isEnd:v&&b[b.length-1]===P[P.length-1],count:u,dialogs:b}};let p,f;return p=i?this.apiManager.invokeApiSingleProcess({method:"channels.getForumTopics",params:f={channel:this.appChatsManager.getChannelInput(i.toChatId()),limit:100,offset_date:s,offset_id:0,offset_topic:0},options:{noErrorBox:!0},processResult:e=>(e=this.dialogsStorage.processTopics(i,e),r(e))}):this.apiManager.invokeApiSingleProcess({method:"messages.getDialogs",params:f={folder_id:t,offset_date:s,offset_id:0,offset_peer:this.appPeersManager.getInputPeerById(undefined),limit:100,hash:"0"},options:{noErrorBox:!0},processResult:r}),p}forwardMessages(e,t,a,s={}){return Yt(this,void 0,void 0,(function*(){delete s.replyToMsgId,delete s.threadId,e=this.appPeersManager.getPeerMigratedTo(e)||e;for(let n=0,i=(a=a.slice().sort(((e,t)=>e-t))).length;n{var i,p,d,f,c;const l=this.getMessageByPeer(t,n),m=this.generateOutgoingMessage(e,s);o.push(m.id);const g=["entities","media"];s.dropAuthor||(m.fwd_from=this.generateForwardHeader(e,l),g.push("views","forwards"),(null===(i=m.fwd_from)||void 0===i?void 0:i.from_name)&&e===this.appPeersManager.peerId&&delete m.from_id),s.dropCaptions&&l.media||g.push("message");const h=null===(p=l.reply_to)||void 0===p?void 0:p.reply_to_msg_id,u=a.indexOf(h);if(h&&-1!==u){const e=o[u];m.reply_to={_:"messageReplyHeader",reply_to_msg_id:e,pFlags:{}}}g.forEach((e=>{m[e]=(0,ve.Z)(l[e])}));const y=null===(d=m.media)||void 0===d?void 0:d.document;return y&&(["round","voice"].includes(y.type)&&(m.pFlags.media_unread=!0),y.sticker&&!this.rootScope.premium&&(0,Wt.Z)(y)&&(m.media.pFlags.nopremium=!0)),l.grouped_id&&(null!==(f=r[c=l.grouped_id])&&void 0!==f?f:r[c]={tempId:""+ ++this.groupedTempId,messages:[]}).messages.push(m),m}));for(const e in r){const t=r[e];t.messages.length>1&&t.messages.forEach((e=>{e.grouped_id=t.tempId}))}p.forEach((e=>{this.beforeMessageSending(e,{isScheduled:!!s.scheduleDate||void 0,sequential:!0})}));const d={};this.pendingAfterMsgs[e]&&(d.afterMessageId=this.pendingAfterMsgs[e].messageId);const f=this.apiManager.invokeApiAfter("messages.forwardMessages",{from_peer:this.appPeersManager.getInputPeerById(t),id:a.map((e=>(0,oe.Z)(e))),random_id:p.map((e=>e.random_id)),to_peer:this.appPeersManager.getInputPeerById(e),with_my_score:s.withMyScore,silent:s.silent,schedule_date:s.scheduleDate,drop_author:s.dropAuthor,drop_media_captions:s.dropCaptions,send_as:s.sendAsPeerId?this.appPeersManager.getInputPeerById(s.sendAsPeerId):void 0},d).then((e=>{this.log("forwardMessages updates:",e),this.apiUpdatesManager.processUpdateMessage(e)}),(e=>{throw this.onMessagesSendError(p,e),e})).finally((()=>{this.pendingAfterMsgs[e]===d&&delete this.pendingAfterMsgs[e]}));this.pendingAfterMsgs[e]=d;const c=[f];return i.length&&c.push(this.forwardMessages(e,t,i,s)),Promise.all(c).then(jt.Z)}))}generateEmptyMessage(e){}onMessagesSendError(e,t){e.forEach((e=>{if(e.error!==t)if(t){e.error=t,this.rootScope.dispatchEvent("message_error",{storageKey:e.storageKey,tempId:e.mid,error:t});const a=this.getDialogOnly(e.peerId);a&&this.rootScope.dispatchEvent("dialog_unread",{peerId:e.peerId,dialog:a})}else delete e.error}))}getMessagesStorageByKey(e){const t=e.split("_"),a=+t[0];return"scheduled"===t[1]?this.getScheduledMessagesStorage(a):this.getHistoryMessagesStorage(a)}getMessageFromStorage(e,t){return"string"==typeof e&&(e=this.getMessagesStorageByKey(e)),e&&e.get(t)}createMessageStorage(e,t){const a=new Map;return a.peerId=e,a.type=t,a.key=`${e}_${t}`,a}getHistoryMessagesStorage(e){var t,a;return null!==(t=(a=this.messagesStorageByPeerId)[e])&&void 0!==t?t:a[e]=this.createMessageStorage(e,"history")}getMessagesStorage(e){return"object"==typeof e?e:this.getMessagesStorageByKey(e)}getMessageById(e){for(const t in this.messagesStorageByPeerId){if(this.appPeersManager.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.getHistoryMessagesStorage(e),t):this.getMessageById(t)}getMessagePeer(e){return e.peer_id&&this.appPeersManager.getPeerId(e.peer_id)||o.NM}getDialogOnly(e){return this.dialogsStorage.getDialogOnly(e)}cantForwardDeleteMids(e,t){const a=this.getMessagesStorage(e);let s=!t.length,n=!t.length;for(const e of t){const t=this.getMessageFromStorage(a,e);if(s||(s=!this.canForward(t)),n||(n=!this.canDeleteMessage(t)),s&&n)break}return{cantForward:s,cantDelete:n}}reloadConversationOrTopic(e,t){t?this.dialogsStorage.getForumTopicById(e,t):this.reloadConversation(e)}reloadConversation(e){let t;if(void 0!==e){const a=this.appPeersManager.getPeerId(e);this.log.warn("reloadConversation",a);let s=this.reloadConversationsPeers.get(a);if(s&&(t=s.promise),t)return t;t=(0,v.Z)(),this.reloadConversationsPeers.set(a,s={inputDialogPeer:this.appPeersManager.getInputDialogPeerById(e),promise:t})}return this.reloadConversationsPromise||(this.reloadConversationsPromise=(0,P.Z)(0).then((()=>{const e=[],t={};for(const[a,{inputDialogPeer:s,promise:n}]of this.reloadConversationsPeers)e.push(s),t[a]=n;const a=()=>{for(const e in t)this.reloadConversationsPeers.delete(+e),t[e].resolve(void 0)};return(()=>Yt(this,void 0,void 0,(function*(){for(;;){const t=yield this.apiManager.invokeApi("messages.getPeerDialogs",{peers:e}),a=this.apiUpdatesManager.updatesState,{state:s}=t;if(!a.pts||a.pts===s.pts)return t;yield(0,P.Z)(500)}})))().then((e=>{for(const e in t)this.reloadConversationsPeers.delete(+e);this.dialogsStorage.applyDialogs(e),e.dialogs.forEach((e=>{const a=e.peerId;a&&(t[a].resolve(e),delete t[a])}))}),jt.Z).then((()=>{a(),this.reloadConversationsPromise=null,this.reloadConversationsPeers.size&&this.reloadConversation()}))}))),t||this.reloadConversationsPromise}doFlushHistory(e,t,a,s){let n;const i=n=>(this.apiUpdatesManager.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:n.pts,pts_count:n.pts_count}}),!n.offset||this.doFlushHistory(e,t,a,s));return n=s?this.apiManager.invokeApiSingleProcess({method:"channels.deleteTopicHistory",params:{channel:this.appChatsManager.getChannelInput(e.toChatId()),top_msg_id:(0,oe.Z)(s)},processResult:i}):this.apiManager.invokeApiSingleProcess({method:"messages.deleteHistory",params:{just_clear:t,revoke:a,peer:this.appPeersManager.getInputPeerById(e),max_id:0},processResult:i}),n}flushHistory(e,t,a,s){return Yt(this,void 0,void 0,(function*(){if(this.appPeersManager.isChannel(e)&&!s){const t=this.getHistory(e,0,1),a=yield t,s=e.toChatId(),n=a.history[0]||0;return this.apiManager.invokeApiSingle("channels.deleteHistory",{channel:this.appChatsManager.getChannelInput(s),max_id:(0,oe.Z)(n)}).then((e=>(e&&this.apiUpdatesManager.processLocalUpdate({_:"updateChannelAvailableMessages",channel_id:s,available_min_id:n}),e)))}return this.doFlushHistory(e,t,a,s).then((()=>{if(s||this.flushStoragesByPeerId(e),t)this.rootScope.dispatchEvent("dialog_flush",{peerId:e,dialog:this.getDialogOnly(e)});else{const t=this.getTypingKey(e,s);if(delete this.notificationsToHandle[t],delete this.typings[t],!s){const t=this.reloadConversationsPeers.get(e);t&&(this.reloadConversationsPeers.delete(e),t.promise.resolve(void 0))}this.dialogsStorage.dropDialogOnDeletion(e,s)}}))}))}flushStoragesByPeerId(e){[this.historiesStorage,this.threadsStorage,this.searchesStorage,this.pendingAfterMsgs,this.pendingTopMsgs].forEach((t=>{delete t[e]}));for(const t in this.pinnedMessages)(+t===e||t.startsWith(e+"_"))&&delete this.pinnedMessages[t];const t=this.needSingleMessages.get(e);if(t){for(const[e,a]of t)a.resolve(this.generateEmptyMessage(e));t.clear()}[this.messagesStorageByPeerId,this.scheduledMessagesStorage].forEach((t=>{const a=t[e];a&&a.clear()})),this.dialogsStorage.flushForumTopicsCache(e)}hidePinnedMessages(e){return Promise.all([this.appStateManager.getState(),this.getPinnedMessage(e)]).then((([t,a])=>{t.hiddenPinnedMessages[e]=a.maxId,this.rootScope.dispatchEvent("peer_pinned_hidden",{peerId:e,maxId:a.maxId})}))}getPinnedMessagesKey(e,t){return e+(t?"_"+t:"")}getPinnedMessage(e,t){var a,s,n;const i=null!==(a=(s=this.pinnedMessages)[n=this.getPinnedMessagesKey(e,t)])&&void 0!==a?a:s[n]={};return i.promise?i.promise:i.maxId?Promise.resolve(i):i.promise=this.getSearch({peerId:e,inputFilter:{_:"inputMessagesFilterPinned"},maxId:0,limit:1,threadId:t}).then((e=>{var t;return i.count=e.count,i.maxId=null===(t=e.history[0])||void 0===t?void 0:t.mid,i})).finally((()=>{delete i.promise}))}getPinnedMessagesCount(e,t){var a;return null===(a=this.pinnedMessages[this.getPinnedMessagesKey(e,t)])||void 0===a?void 0:a.count}getPinnedMessagesMaxId(e,t){var a;return null===(a=this.pinnedMessages[this.getPinnedMessagesKey(e,t)])||void 0===a?void 0:a.maxId}updatePinnedMessage(e,t,a,s,n){return this.apiManager.invokeApi("messages.updatePinnedMessage",{peer:this.appPeersManager.getInputPeerById(e),unpin:a,silent:s,pm_oneside:n,id:(0,oe.Z)(t)}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}unpinAllMessages(e){return this.apiManager.invokeApiSingle("messages.unpinAllMessages",{peer:this.appPeersManager.getInputPeerById(e)}).then((t=>(this.apiUpdatesManager.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:t.pts,pts_count:t.pts_count}}),t.offset?this.unpinAllMessages(e):(this.getHistoryMessagesStorage(e).forEach((e=>{e.pFlags.pinned&&delete e.pFlags.pinned})),this.rootScope.dispatchEvent("peer_pinned_messages",{peerId:e,unpinAll:!0}),delete this.pinnedMessages[this.getPinnedMessagesKey(e)],!0))))}getAlbumText(e){const t=this.groupedMessagesStorage[e];return(0,Ht.Z)(Array.from(t.values()))}getGroupsFirstMessage(e){if(!(null==e?void 0:e.grouped_id))return e;const t=this.groupedMessagesStorage[e.grouped_id];let a=Number.MAX_SAFE_INTEGER;for(const[e,s]of t)s.midthis.getMessageFromStorage(a,e)))}getMidsByMessage(e){return e?e.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 this.appMessagesIdsManager.generateTempMessageId((null==t?void 0:t.top_message)||0)}setMessageUnreadByDialog(e,t=this.getDialogOnly(e.peerId)){t&&e.mid&&e.mid>t[e.pFlags.out?"read_outbox_max_id":"read_inbox_max_id"]&&(e.pFlags.unread=!0)}saveMessage(e,t={}){var a,s,n,i,r;if(!e||"messageEmpty"===e._)return;null!==(a=e.pFlags)&&void 0!==a||(e.pFlags={});const p=this.getMessagePeer(e),d=t.storage||this.getHistoryMessagesStorage(p),f="peerChannel"===e.peer_id._,c=f&&this.appChatsManager.isBroadcast(p.toChatId()),l="message"===e._;t.isOutgoing&&(e.pFlags.is_outgoing=!0);const m=(0,pe.Z)(e.id);e.mid=m,l&&(t.isScheduled&&(e.pFlags.is_scheduled=!0),e.grouped_id&&(null!==(s=(i=this.groupedMessagesStorage)[r=e.grouped_id])&&void 0!==s?s:i[r]=this.createMessageStorage(p,"grouped")).set(m,e),e.via_bot_id&&(e.viaBotId=e.via_bot_id));const g=e.reply_to;g&&(g.reply_to_msg_id&&(g.reply_to_msg_id=e.reply_to_mid=(0,pe.Z)(g.reply_to_msg_id)),g.reply_to_top_id&&(g.reply_to_top_id=(0,pe.Z)(g.reply_to_top_id)));const h=l&&e.replies;h&&(h.max_id&&(h.max_id=(0,pe.Z)(h.max_id)),h.read_max_id&&(h.read_max_id=(0,pe.Z)(h.read_max_id)));const u=!!p;u||(e.date-=this.timeManager.getServerTimeOffset());const y=this.appPeersManager.peerId,_=l&&e.fwd_from;if(e.peerId=p,e.fromId=p===y?_?_.from_id?this.appPeersManager.getPeerId(_.from_id):o.NM:y:e.pFlags.post||!e.from_id?p:this.appPeersManager.getPeerId(e.from_id),this.setMessageUnreadByDialog(e),_){_.saved_from_msg_id&&(_.saved_from_msg_id=(0,pe.Z)(_.saved_from_msg_id)),_.channel_post&&(_.channel_post=(0,pe.Z)(_.channel_post));const t=_.saved_from_peer||_.from_id,a=_.saved_from_msg_id||_.channel_post;if(t&&a){const s=this.appPeersManager.getPeerId(t),n=(0,pe.Z)(a);e.savedFrom=s+"_"+n}e.fwdFromId=this.appPeersManager.getPeerId(_.from_id),u||(_.date-=this.timeManager.getServerTimeOffset())}const v={type:"message",peerId:p,messageId:m};let P=!1;const b=l&&e.media;if(b)switch(b._){case"messageMediaEmpty":delete e.media;break;case"messageMediaPhoto":b.ttl_seconds?P=!0:b.photo=this.appPhotosManager.savePhoto(b.photo,v),b.photo||delete e.media;break;case"messageMediaPoll":{const t=this.appPollsManager.savePoll(b.poll,b.results,e);b.poll=t.poll,b.results=t.results;break}case"messageMediaDocument":if(b.ttl_seconds)P=!0;else{const e=b.document;b.document=this.appDocsManager.saveDoc(e,v),b.document||"documentEmpty"===e._||(P=!0)}break;case"messageMediaWebPage":{const a=this.appWebPagesManager.getMessageKeyForPendingWebPage(p,m,t.isScheduled);b.webpage=this.appWebPagesManager.saveWebPage(b.webpage,a,v),b.webpage||delete e.media;break}case"messageMediaInvoice":{b.photo=this.appWebDocsManager.saveWebDocument(b.photo);const e=b.extended_media;if("messageExtendedMedia"===(null==e?void 0:e._)){const t=e.media;t.photo=this.appPhotosManager.savePhoto(t.photo,v),t.document=this.appDocsManager.saveDoc(t.document,v)}break}case"messageMediaUnsupported":P=!0}if(l&&P&&(e.media={_:"messageMediaUnsupported"},e.message="",delete e.entities,delete e.totalEntities),!l&&e.action){const t=e.action,a=e.fromId===this.appUsersManager.getSelf().id?"You":"";let s,i;switch(t.photo&&(t.photo=this.appPhotosManager.savePhoto(t.photo,v)),t.document&&(t.document=this.appDocsManager.saveDoc(t.photo,v)),t._){case"messageActionChatEditPhoto":(null===(n=t.photo)||void 0===n?void 0:n.video_sizes)?t._=c?"messageActionChannelEditVideo":"messageActionChatEditVideo":c&&(t._="messageActionChannelEditPhoto");break;case"messageActionGroupCall":{let e;this.appGroupCallsManager.saveGroupCall(t.call),e=void 0===t.duration?"started":"ended",c||(e+="_by"+a),t.type=e;break}case"messageActionChatEditTitle":c&&(t._="messageActionChannelEditTitle");break;case"messageActionChatDeletePhoto":c&&(t._="messageActionChannelDeletePhoto");break;case"messageActionChatAddUser":1===t.users.length?(t.user_id=t.users[0],e.fromId===t.user_id&&(t._=f?"messageActionChatJoined"+a:"messageActionChatReturn"+a)):t.users.length>1&&(t._="messageActionChatAddUsers");break;case"messageActionChatDeleteUser":e.fromId===t.user_id&&(t._="messageActionChatLeave"+a);break;case"messageActionChannelMigrateFrom":s=t.chat_id.toPeerId(!0),i=p;break;case"messageActionChatMigrateTo":s=p,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")}s&&i&&!this.migratedFromTo[s]&&!this.migratedToFrom[i]&&this.migrateChecks(s,i)}return l&&e.message.length&&!e.totalEntities&&this.wrapMessageEntities(e),d.set(m,e),e}saveMessages(e,t={}){return e.saved||(e.saved=!0,e.forEach(((e,a,s)=>{s[a]=this.saveMessage(e,t)}))),e}getFirstMessageToEdit(e,t){return Yt(this,void 0,void 0,(function*(){const a=this.getHistoryStorage(e,t).history.slice;if(a.isEnd(se.D.Bottom)&&a.length){let t;const s=this.appPeersManager.peerId;for(const n of a){const a=this.getMessageByPeer(e,n);if((s===e?a.fromId===s:a.pFlags.out)&&(yield this.canEditMessage(a,"text"))){t=a;break}}return t}}))}wrapMessageEntities(e){const t=e.entities?e.entities.slice():[];e.message=(0,Pt.Z)(e.message,t);const a=(0,Lt.Z)(e.message);e.totalEntities=(0,Ot.Z)(t,a)}reportMessages(e,t,a,s){return this.apiManager.invokeApiSingle("messages.report",{peer:this.appPeersManager.getInputPeerById(e),id:t.map((e=>(0,oe.Z)(e))),reason:{_:a},message:s})}startBot(e,t,a){const s=t?t.toPeerId(!0):e.toPeerId();if(a){const t=(0,Te.a)();return this.apiManager.invokeApi("messages.startBot",{bot:this.appUsersManager.getUserInput(e),peer:this.appPeersManager.getInputPeerById(s),random_id:t,start_param:a}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}const n="/start";if(t){let a;return a=this.appChatsManager.isChannel(t)?this.appChatsManager.inviteToChannel(t,[e]):this.appChatsManager.addChatUser(t,e,0),a.catch((e=>{if("USER_ALREADY_PARTICIPANT"!=(null==e?void 0:e.type))throw e;e.handled=!0})).then((()=>this.sendText(s,n+"@"+this.appPeersManager.getPeerUsername(e.toPeerId()))))}return this.sendText(s,n)}editPeerFolders(e,t){this.apiManager.invokeApi("folders.editPeerFolders",{folder_peers:e.map((e=>({_:"inputFolderPeer",peer:this.appPeersManager.getInputPeerById(e),folder_id:t})))}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}getFilter(e){return this.filtersStorage.getFilter(e)}toggleDialogPin(e){var t;return Yt(this,void 0,void 0,(function*(){const{peerId:a,topicId:s,filterId:n=(s?a:void 0)}=e;if(void 0===n)throw new Error("No filterId");if(n>1)return this.filtersStorage.toggleDialogPin(a,n);const i=this.dialogsStorage.getDialogOrTopic(a,s);if(!i)throw void 0;const r=!(null===(t=i.pFlags)||void 0===t?void 0:t.pinned)||void 0;if(r){const e=yield this.apiManager.getLimit(s?"topicPin":1===n?"folderPin":"pin");if(this.dialogsStorage.getPinnedOrders(n).length>=e)throw(0,X.Z)(s?"PINNED_TOO_MUCH":"PINNED_DIALOGS_TOO_MUCH")}return s?this.appChatsManager.updatePinnedForumTopic(a.toChatId(),s,r):this.apiManager.invokeApi("messages.toggleDialogPin",{peer:this.appPeersManager.getInputDialogPeerById(a),pinned:r}).then((e=>{const t=r?{pinned:r}:{};this.apiUpdatesManager.saveUpdate({_:"updateDialogPinned",peer:this.appPeersManager.getDialogPeer(a),folder_id:n,pFlags:t})}))}))}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 this.apiManager.invokeApi("messages.markDialogUnread",{peer:this.appPeersManager.getInputDialogPeerById(e),unread:n}).then((t=>{if(t){const t=n?{unread:n}:{};this.onUpdateDialogUnreadMark({_:"updateDialogUnreadMark",peer:this.appPeersManager.getDialogPeer(e),pFlags:t})}}))}migrateChecks(e,t){if(!this.migratedFromTo[e]&&!this.migratedToFrom[t]&&this.appChatsManager.hasChat(t.toChatId())){const a=this.appChatsManager.getChat(e.toChatId());(null==a?void 0:a.migrated_to)&&a.migrated_to.channel_id===t.toChatId()&&(this.migratedFromTo[e]=t,this.migratedToFrom[t]=e,this.rootScope.dispatchEvent("dialog_migrate",{migrateFrom:e,migrateTo:t}),this.dialogsStorage.dropDialogWithEvent(e))}}canMessageBeEdited(e,t){var a,s;if(null===(a=null==e?void 0:e.pFlags)||void 0===a?void 0:a.is_outgoing)return!1;const n=["messageMediaPhoto","messageMediaDocument","messageMediaWebPage"];return"poll"===t&&n.push("messageMediaPoll"),!(!e||"message"!==e._||e.deleted||e.fwd_from||e.via_bot_id||e.media&&-1===n.indexOf(e.media._)||e.fromId&&this.appUsersManager.isBot(e.fromId)||"messageMediaDocument"===(null===(s=e.media)||void 0===s?void 0:s._)&&(e.media.document.sticker||"round"===e.media.document.type))}canEditMessage(e,t="text"){var a;return Yt(this,void 0,void 0,(function*(){return!(!e||!this.canMessageBeEdited(e,t))&&(this.getMessagePeer(e)===this.appUsersManager.getSelf().id||!(!(this.appPeersManager.isBroadcast(e.peerId)?this.appChatsManager.hasRights(e.peerId.toChatId(),"edit_messages"):e.pFlags.out)||"peerChannel"!==e.peer_id._&&e.date<(0,te.Z)(!0)-(yield this.apiManager.getConfig()).edit_time_limit&&"messageMediaPoll"!==(null===(a=e.media)||void 0===a?void 0:a._)))}))}canDeleteMessage(e){return e&&(e.peerId.isUser()||e.pFlags.out||"chat"===this.appChatsManager.getChat(e.peerId.toChatId())._||this.appChatsManager.hasRights(e.peerId.toChatId(),"delete_messages"))&&(!e.pFlags.is_outgoing||!!e.error)}getReplyKeyboard(e){return this.getHistoryStorage(e).replyMarkup}mergeReplyKeyboard(e,t){var a,s;if(!t)return!1;const n=t.reply_markup;if(!n&&!(null===(a=t.pFlags)||void 0===a?void 0:a.out)&&!t.action)return!1;if("replyInlineMarkup"===(null==n?void 0:n._))return!1;const i=e.replyMarkup;if(n)return!(i&&i.mid>=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(0,ue.Z)(t),!("messageActionChatDeleteUser"!==(null===(s=t.action)||void 0===s?void 0:s._)||!(i?t.action.user_id===i.fromId:this.appUsersManager.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,s){return this.appPeersManager.isPeerRestricted(e)?Promise.resolve(t.map((e=>({_:"messages.searchCounter",pFlags:{},filter:e,count:0})))):(a?this.apiManager.invokeApiCacheable:this.apiManager.invokeApi).bind(this.apiManager)("messages.getSearchCounters",{peer:this.appPeersManager.getInputPeerById(e),filters:t,top_msg_id:s?(0,oe.Z)(s):void 0})}filterMessagesByInputFilterFromStorage(e,t,a,s){const n=this.getMessagesStorage(a);return(0,Nt.Z)(e,t.map((e=>n.get(e))),s)}getSearch({peerId:e,query:t,inputFilter:a,maxId:s,limit:n,nextRate:i,backLimit:r,threadId:o,folderId:p,minDate:f,maxDate:c}){if(this.appPeersManager.isPeerRestricted(e))return Promise.resolve({count:0,offset_id_offset:0,next_rate:void 0,history:[]});t||(t=""),a||(a={_:"inputMessagesFilterEmpty"}),void 0===n&&(n=20),i||(i=0),r||(r=0),f=f?f/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.filterMessagesByInputFilterFromStorage(a._,m.history.slice,this.getHistoryMessagesStorage(e),n)),l.length){if(!(l.length{this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.saveMessages(e.messages),d.ZP&&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=this.appChatsManager.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=(0,oe.Z)(Math.max(...this.getMidsByMessage(e))),s={_:"messageService",pFlags:{is_single:!0},id:this.appMessagesIdsManager.generateTempMessageId(a),date:e.date,from_id:{_:"peerUser",user_id:o.NM},peer_id:e.peer_id,action:{_:"messageActionDiscussionStarted"},reply_to:this.generateReplyHeader(e.peerId,e.id)};this.saveMessages([s],{isOutgoing:!0}),this.threadsServiceMessagesIdsStorage[t]=s.mid}getThreadServiceMessageId(e,t){return this.threadsServiceMessagesIdsStorage[e+"_"+t]}getDiscussionMessage(e,t){return this.apiManager.invokeApiSingle("messages.getDiscussionMessage",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(t)}).then((a=>{var s;this.appChatsManager.saveApiChats(a.chats),this.appUsersManager.saveApiUsers(a.users),this.saveMessages(a.messages);const n=this.getMessageWithReplies(a.messages[0]),i=n.peerId+"_"+n.mid;this.generateThreadServiceStartMessage(n);const r=this.getHistoryStorage(n.peerId,n.mid),o=a.max_id=(0,pe.Z)(a.max_id)||0;a.read_inbox_max_id=r.readMaxId=(0,pe.Z)(null!==(s=a.read_inbox_max_id)&&void 0!==s?s:n.mid),a.read_outbox_max_id=r.readOutboxMaxId=(0,pe.Z)(a.read_outbox_max_id)||0;const p=r.history.first;return r.maxId&&r.maxId{this.newDialogsHandlePromise=void 0,this.handleNewDialogs()}))}deleteMessages(e,t,a){var s,n;return Yt(this,void 0,void 0,(function*(){let i;const r=yield this.apiManager.getConfig(),o=t.splice(r.forwarded_count_max,t.length-r.forwarded_count_max),p=t.map((e=>(0,oe.Z)(e)));if(e.isAnyChat()&&this.appPeersManager.isChannel(e)){const a=e.toChatId(),r=this.appChatsManager.getChat(a);if(!r.pFlags.creator&&!(null===(n=null===(s=r.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=this.apiManager.invokeApi("channels.deleteMessages",{channel:this.appChatsManager.getChannelInput(a),id:p}).then((e=>{this.apiUpdatesManager.processLocalUpdate({_:"updateDeleteChannelMessages",channel_id:a,messages:t,pts:e.pts,pts_count:e.pts_count})}))}else i=this.apiManager.invokeApi("messages.deleteMessages",{revoke:a,id:p}).then((e=>{this.apiUpdatesManager.processLocalUpdate({_:"updateDeleteMessages",messages:t,pts:e.pts,pts_count:e.pts_count})}));const d=[i];return o.length&&d.push(this.deleteMessages(e,o,a)),Promise.all(d).then(jt.Z)}))}readHistory(e,t=0,a,s=!1){if(this.log("readHistory:",e,t,a),!this.getReadMaxIdIfUnread(e,a)){if(a&&!s){const t=this.dialogsStorage.getForumTopic(e,a);(0,oe.Z)(t.read_inbox_max_id)||(s=!0)}if(!s){const t=this.appChatsManager.isForum(e.toChatId())&&a?this.dialogsStorage.getForumTopic(e,a):this.getDialogOnly(e);t&&this.isDialogUnread(t)&&(s=!0)}if(!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=this.apiManager.invokeApi("messages.readDiscussion",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(a),read_max_id:(0,oe.Z)(t)})),this.apiUpdatesManager.processLocalUpdate({_:"updateReadChannelDiscussionInbox",channel_id:e.toChatId(),top_msg_id:a,read_max_id:t})):this.appPeersManager.isChannel(e)?(n.readPromise||(i=this.apiManager.invokeApi("channels.readHistory",{channel:this.appChatsManager.getChannelInput(e.toChatId()),max_id:(0,oe.Z)(t)})),this.apiUpdatesManager.processLocalUpdate({_:"updateReadChannelInbox",max_id:t,channel_id:e.toChatId(),still_unread_count:void 0,pts:void 0})):(n.readPromise||(i=this.apiManager.invokeApi("messages.readHistory",{peer:this.appPeersManager.getInputPeerById(e),max_id:(0,oe.Z)(t)}).then((e=>{this.apiUpdatesManager.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:e.pts,pts_count:e.pts_count}})}))),this.apiUpdatesManager.processLocalUpdate({_:"updateReadHistoryInbox",max_id:t,peer:this.appPeersManager.getOutputPeer(e),still_unread_count:void 0,pts:void 0,pts_count:void 0})),this.rootScope.dispatchEvent("notification_reset",this.appPeersManager.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)}getUnreadMentionsKey(e,t){return e+(t?`_${t}`:"")}fixDialogUnreadMentionsIfNoMessage(e,t){const a=this.dialogsStorage.getDialogOrTopic(e,t);(null==a?void 0:a.unread_mentions_count)&&this.reloadConversationOrTopic(e)}modifyCachedMentions(e,t,a,s){const n=this.unreadMentions[this.getUnreadMentionsKey(e,s)];n&&(a?n.first.isEnd(se.D.Top)&&n.insertSlice([t]):n.delete(t))}fixUnreadMentionsCountIfNeeded(e,t,a){const s=this.dialogsStorage.getDialogOrTopic(e,a);!t.length&&(null==s?void 0:s.unread_mentions_count)&&this.reloadConversationOrTopic(e)}goToNextMention(e,t){var a,s;const n=this.getUnreadMentionsKey(e,t),i=this.goToNextMentionPromises[n];if(i)return i;const r=null!==(a=(s=this.unreadMentions)[e])&&void 0!==a?a:s[e]=new se.Z,o=r.length,p=r.first.isEnd(se.D.Top);if(!o&&p)return this.fixUnreadMentionsCountIfNeeded(e,r,t),Promise.resolve();let d=Promise.resolve();return!p&&o<25&&(d=this.loadNextMentions(e,t)),this.goToNextMentionPromises[n]=d.then((()=>{const a=r.last,s=a&&a[a.length-1];if(s)return r.delete(s),s;this.fixUnreadMentionsCountIfNeeded(e,r,t)})).finally((()=>{delete this.goToNextMentionPromises[n]}))}loadNextMentions(e,t){const a=this.unreadMentions[e],s=a.first[0]||1;return this.getUnreadMentions(e,s,-50,50,void 0,void 0,t).then((e=>{this.mergeHistoryResult(a,e,1===s?0:s,50,-50)}))}getUnreadMentions(e,t,a,s,n=0,i=0,r){return this.apiManager.invokeApiSingleProcess({method:"messages.getUnreadMentions",params:{peer:this.appPeersManager.getInputPeerById(e),offset_id:(0,oe.Z)(t),add_offset:a,limit:s,max_id:(0,oe.Z)(n),min_id:(0,oe.Z)(i),top_msg_id:r?(0,oe.Z)(r):void 0},processResult:e=>((0,ue.Z)(e),this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.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=>(0,oe.Z)(e))),e.isAnyChat()&&this.appPeersManager.isChannel(e)){const n=e.toChatId();s={_:"updateChannelReadMessagesContents",channel_id:n,messages:t},a=this.apiManager.invokeApi("channels.readMessageContents",{channel:this.appChatsManager.getChannelInput(n),id:t})}else s={_:"updateReadMessagesContents",messages:t,pts:void 0,pts_count:void 0},a=this.apiManager.invokeApi("messages.readMessageContents",{id:t}).then((e=>{s.pts=e.pts,s.pts_count=e.pts_count,this.apiUpdatesManager.processLocalUpdate(s)}));return this.apiUpdatesManager.processLocalUpdate(s),a}getHistoryStorage(e,t){var a,s,n,i,r,o;return t?null!==(s=(r=null!==(a=(i=this.threadsStorage)[e])&&void 0!==a?a:i[e]={})[t])&&void 0!==s?s:r[t]={count:null,history:new se.Z}:null!==(n=(o=this.historiesStorage)[e])&&void 0!==n?n:o[e]={count:null,history:new se.Z}}getHistoryStorageTransferable(e,t){const a=this.getHistoryStorage(e,t),{count:s,history:n,maxId:i,readMaxId:r,readOutboxMaxId:o,maxOutId:p,replyMarkup:d}=a;return{count:s,history:void 0,historySerialized:n.toJSON(),maxId:i,readMaxId:r,readOutboxMaxId:o,maxOutId:p,replyMarkup:d}}getNotifyPeerSettings(e,t){const a=this.appPeersManager.getInputNotifyPeerById({peerId:e,ignorePeerId:!0,threadId:t});return Promise.all([this.appNotificationsManager.getNotifyPeerTypeSettings(),this.appNotificationsManager.getNotifySettings(a)]).then((([a,s])=>({muted:this.appNotificationsManager.isPeerLocalMuted({peerId:e,respectType:!0,threadId:t}),peerTypeNotifySettings:s})))}getUpdateAfterReloadKey(e,t){return e+(t?"_"+t:"")}handleNewUpdateAfterReload(e,t,a){var s,n,i;const r=null!==(s=(n=this.newUpdatesAfterReloadToHandle)[i=this.getUpdateAfterReloadKey(e,a)])&&void 0!==s?s:n[i]=new Set;r.has(t)?this.log.error("here we go again",e):(t.ignoreExisting=!0,r.add(t),this.scheduleHandleNewDialogs(e,a))}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=null==e?void 0:e.peerId)||void 0===t?void 0:t.isAnyChat()){const t=(0,Qt.Z)(e,this.appChatsManager.isForum(e.peerId.toChatId()));t&&(a=e.peerId+"_"+t)}return a}updateMessage(e,t,a){return this.reloadMessages(e,t,!0).then((()=>{const s=this.getMessageByPeer(e,t);if(s)return a&&this.rootScope.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))&&this.rootScope.dispatchEvent("history_update",{storageKey:s.storage.key,message:e,sequential:s.sequential}),delete this.pendingByMessageId[e.mid]}return a}mutePeer(e){if(!(e=this.appNotificationsManager.validatePeerSettings(e)))return;const{peerId:t,muteUntil:a,threadId:s}=e,n={_:"inputPeerNotifySettings"};n.mute_until=a;const i=this.appPeersManager.getInputPeerById(t);return this.appNotificationsManager.updateNotifySettings(s?{_:"inputNotifyForumTopic",peer:i,top_msg_id:(0,oe.Z)(s)}:{_:"inputNotifyPeer",peer:i},n)}togglePeerMute({peerId:e,mute:t,threadId:a}){return void 0===t&&(t=!this.appNotificationsManager.isPeerLocalMuted({peerId:e,respectType:!1,threadId:a})),this.mutePeer({peerId:e,muteUntil:t?o.rU:0,threadId:a})}findPeerIdByMids(e){for(let t=e.length-1;t>=0;--t){const a=e[t],s=this.getMessageById(a);if(s)return s.peerId}}canSendToPeer(e,t,a="send_messages"){var s;if(this.appPeersManager.isPeerRestricted(e))return!1;if(e.isAnyChat()){const n=e.toChatId();if(t){const a=this.dialogsStorage.getForumTopic(e,t);if((null===(s=null==a?void 0:a.pFlags)||void 0===s?void 0:s.closed)&&!this.appChatsManager.hasRights(n,"manage_topics"))return!1}const i=this.appChatsManager.getChat(n);return this.appChatsManager.hasRights(n,a,void 0,!!t)&&(!i.pFlags.left||!!t)}return this.appUsersManager.canSendToUser(e)}finalizePendingMessage(e,t){const a=this.pendingByRandomId[e];if(!a)return;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&&(delete t.pFlags.is_outgoing,delete t.pending,delete t.error,delete t.random_id,delete t.send),this.rootScope.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){(0,ue.Z)(a);const{photo:e,document:s}=a.media;if(e){const a=this.appPhotosManager.getPhoto(""+t);if(a){const t=e.sizes[e.sizes.length-1],s=this.thumbsStorage.getCacheContext(e,t.type),n=this.thumbsStorage.getCacheContext(a,o.Pt);Object.assign(s,n);const i=e.sizes[e.sizes.length-1],r=(0,Vt.Z)(e,i);(0,ct.P)(r.location)}}else if(s){const e=this.appDocsManager.getDoc(""+t);if(e){const t=this.thumbsStorage.getCacheContext(e);if(e.type&&"sticker"!==e.type&&"image/gif"!==e.mime_type&&t.url){const e=this.thumbsStorage.getCacheContext(s);Object.assign(e,t),n=s,(0,ct.P)((0,ft.Z)(n,undefined),{fileName:n.file_name})}}}else a.media.poll&&(delete this.appPollsManager.polls[t],delete this.appPollsManager.results[t])}var n;const i=this.getMessageFromStorage(e,t);e.delete(t),!i.reply_markup&&a.reply_markup&&setTimeout((()=>{this.getMessageFromStorage(e,a.mid)&&this.rootScope.dispatchEvent("message_edit",{storageKey:e.key,peerId:a.peerId,mid:a.mid,message:a})}),0),this.handleReleasingMessage(i,e),this.rootScope.dispatchEvent("message_sent",{storageKey:e.key,tempId:t,tempMessage:i,mid:a.mid,message:a})}incrementMaxSeenId(e){if(!e||this.maxSeenId&&!(e>this.maxSeenId))return!1;this.maxSeenId=e,this.appStateManager.pushToState("maxSeenMsgId",e),this.apiManager.invokeApi("messages.receivedMessages",{max_id:(0,oe.Z)(e)})}getMessageReactionsListAndReadParticipants(e,t,a,s,n,i){var r,o;return Yt(this,void 0,void 0,(function*(){const p={reactions:[],count:0,next_offset:void 0},d=yield this.canViewMessageReadParticipants(e);return d&&void 0===t?t=100:void 0===t&&(t=50),Promise.all([!d||a||n?[]:this.getMessageReadParticipants(e.peerId,e.mid).catch((()=>[])),(null===(o=null===(r=e.reactions)||void 0===r?void 0:r.recent_reactions)||void 0===o?void 0:o.length)&&!i?this.appReactionsManager.getMessageReactionsList(e.peerId,e.mid,t,a,s).catch((e=>p)):p]).then((([e,t])=>{const a=e.map((e=>e.toPeerId())),s=a.slice();(0,ne.Z)(s,((e,a,s)=>{t.reactions.some((t=>this.appPeersManager.getPeerId(t.peer_id)===e))&&s.splice(a,1)}));let n=t.reactions.map((e=>({peerId:this.appPeersManager.getPeerId(e.peer_id),reaction:e.reaction})));return n=n.concat(s.map((e=>({peerId:e})))),{reactions:t.reactions,reactionsCount:t.count,readParticipants:a,combined:n,nextOffset:t.next_offset}}))}))}getMessageReadParticipants(e,t){return this.apiManager.invokeApiSingle("messages.getMessageReadParticipants",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(t)}).then((e=>e.map((e=>e.toUserId()))))}canViewMessageReadParticipants(e){return Yt(this,void 0,void 0,(function*(){if("message"!==(null==e?void 0:e._)||e.pFlags.is_outgoing||!e.pFlags.out||!this.appPeersManager.isAnyGroup(e.peerId))return!1;const t=this.appChatsManager.getChat(e.peerId.toChatId()),a=yield this.apiManager.getAppConfig();return t.participants_count<=a.chat_read_mark_size_threshold&&(0,te.Z)(!0)-e.date(0,oe.Z)(e))),increment:!0}).then((a=>{const s=new Array(t.length);for(let n=0,i=t.length;n{const{chatPeerIds:t}=e.state;return t[t.length-1]===a}));!n&&s.length&&(s.sort(((e,t)=>e.state.idleStartTime-t.state.idleStartTime)),n=s[0].state.idleStartTime?s[s.length-1]:s[0]),f.Z.getInstance().invokeVoid("notificationBuild",Object.assign({message:e},t),null==n?void 0:n.source)}getScheduledMessagesStorage(e){var t,a;return null!==(t=(a=this.scheduledMessagesStorage)[e])&&void 0!==t?t:a[e]=this.createMessageStorage(e,"scheduled")}getScheduledMessageByPeer(e,t){return this.getMessageFromStorage(this.getScheduledMessagesStorage(e),t)}getScheduledMessages(e){if(!this.canSendToPeer(e))return;const t=this.getScheduledMessagesStorage(e);return t.size?[...t.keys()]:this.apiManager.invokeApiSingle("messages.getScheduledHistory",{peer:this.appPeersManager.getInputPeerById(e),hash:""}).then((t=>{if("messages.messagesNotModified"!==t._){this.appUsersManager.saveApiUsers(t.users),this.appChatsManager.saveApiChats(t.chats);const a=this.getScheduledMessagesStorage(e);return this.saveMessages(t.messages,{storage:a,isScheduled:!0}),[...a.keys()]}return[]}))}sendScheduledMessages(e,t){return this.apiManager.invokeApi("messages.sendScheduledMessages",{peer:this.appPeersManager.getInputPeerById(e),id:t.map((e=>(0,oe.Z)(e)))}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}deleteScheduledMessages(e,t){return this.apiManager.invokeApi("messages.deleteScheduledMessages",{peer:this.appPeersManager.getInputPeerById(e),id:t.map((e=>(0,oe.Z)(e)))}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}getMessageWithReplies(e){return this.filterMessages(e,(e=>!!e.replies))[0]}getMessageWithCommentReplies(e){if(e.peerId!==o.hj){const t=null==(e=this.getMessageWithReplies(e))?void 0:e.replies;if(!t||!t.pFlags.comments||t.channel_id.toChatId()===o.IA)return}return e}isFetchIntervalNeeded(e){return e.isAnyChat()&&(!this.appChatsManager.isInChat(e.toChatId())||this.appChatsManager.isForum(e.toChatId()))}getNewHistory(e,t){var a;return Yt(this,void 0,void 0,(function*(){if(!this.isFetchIntervalNeeded(e))return;const s=this.getHistoryStorage(e,t),n=s.history.slice;if(!n.isEnd(se.D.Bottom))return;delete s.maxId,n.unsetEnd(se.D.Bottom);const i=yield this.getHistory(e,null!==(a=n[0])&&void 0!==a?a:1,0,50,t);for(let t=0,a=i.history.length;t{const e=i.history.sliceMe(t,r,a),s=(null==e?void 0:e.slice)||i.history.constructSlice();return{count:i.count,history:Array.from(s),isEnd:s.getEnds(),offsetIdOffset:(null==e?void 0:e.offsetIdOffset)||i.count}})):{count:i.count,history:Array.from(o.slice),isEnd:o.slice.getEnds(),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&&(0,oe.Z)(a)&&!c.includes(a)&&pc[e]);++e);c.splice(e,0,a)}const l=e.insertSlice(c)||e.slice;return d&&l.setEnd(se.D.Top),f&&l.setEnd(se.D.Bottom),Object.assign({slice:l,mids:c,messages:i},r)}fillHistoryStorage(e,t,a,s,n,i){const r=n.maxId;return this.requestHistory(e,t,a,s,void 0,i).then((i=>{const{count:o,isBottomEnd:p,slice:d,messages:f}=this.mergeHistoryResult(n.history,i,t,a,s);n.count=o;for(let t=0,a=f.length;t{d.ZP&&this.log("requestHistory result:",e,r,t,a,s),this.appUsersManager.saveApiUsers(r.users),this.appChatsManager.saveApiChats(r.chats),this.saveMessages(r.messages),"pts"in r&&this.apiUpdatesManager.addChannelState(e.toChatId(),r.pts);let o=r.messages.length,p=r.count;o&&!r.messages[o-1]&&(r.messages.splice(o-1,1),o--,p--);const f=this.getHistoryStorage(e,i),c=r.messages[o-1];if(o&&c.grouped_id){const t=f.history.findSlice(c.mid);if(t&&t.slice.length+r.messages.lengthr))}return r}),(t=>{if("CHANNEL_PRIVATE"===t.type){let t=this.appChatsManager.getChat(e.toChatId());"channel"===t._&&(t={_:"channelForbidden",id:e.toChatId(),access_hash:t.access_hash,title:t.title,pFlags:t.pFlags}),this.apiUpdatesManager.processUpdateMessage({_:"updates",updates:[{_:"updateChannel",channel_id:e.toChatId()}],chats:[t],users:[]})}throw t}))}fetchSingleMessages(){return this.fetchSingleMessagesPromise?this.fetchSingleMessagesPromise:this.fetchSingleMessagesPromise=(0,P.Z)(0).then((()=>{const e=[];for(const[t,a]of this.needSingleMessages){const s=[...a.keys()],n=s.map((e=>({_:"inputMessageID",id:(0,oe.Z)(e)})));let i;i=t.isAnyChat()&&this.appPeersManager.isChannel(t)?this.apiManager.invokeApiSingle("channels.getMessages",{channel:this.appChatsManager.getChannelInput(t.toChatId()),id:n}):this.apiManager.invokeApiSingle("messages.getMessages",{id:n});const r=i.then((e=>{(0,ue.Z)(e),this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats);const t=this.saveMessages(e.messages);for(let e=0;e{this.rootScope.dispatchEvent("messages_downloaded",{peerId:t,mids:s})}));e.push(r)}return this.needSingleMessages.clear(),Promise.all(e).then(jt.Z,jt.Z).then((()=>{this.fetchSingleMessagesPromise=void 0,this.needSingleMessages.size&&this.fetchSingleMessages()}))}))}reloadMessages(e,t,a){if(Array.isArray(t))return Promise.all(t.map((t=>this.reloadMessages(e,t,a))));const s=this.getMessageByPeer(e,t);if(s&&!a)return this.rootScope.dispatchEvent("messages_downloaded",{peerId:e,mids:[t]}),Promise.resolve(s);{let a=this.needSingleMessages.get(e);a||this.needSingleMessages.set(e,a=new Map);let s=a.get(t);return s||(s=(0,v.Z)(),a.set(t,s),this.fetchSingleMessages(),s)}}getExtendedMedia(e,t){let a=this.extendedMedia.get(e);a||this.extendedMedia.set(e,a=new Map);const s=(0,v.Z)(),n=[],i=t.map((t=>{let i=a.get(t);return i||(a.set(t,i=s),n.push(t),i.then((()=>{a.delete(t),a.size||this.extendedMedia.get(e)!==a||this.extendedMedia.delete(e)}))),i}));return n.length?this.apiManager.invokeApi("messages.getExtendedMedia",{peer:this.appPeersManager.getInputPeerById(e),id:n.map((e=>(0,oe.Z)(e)))}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e),s.resolve()})):s.resolve(),Promise.all(i)}fetchMessageReplyTo(e){if(!e.reply_to_mid)return Promise.resolve(this.generateEmptyMessage(0));const t=e.reply_to.reply_to_peer_id?this.appPeersManager.getPeerId(e.reply_to.reply_to_peer_id):e.peerId;return this.reloadMessages(t,e.reply_to_mid).then((t=>{if(t||delete(e=this.getMessageByPeer(e.peerId,e.mid)).reply_to_mid,"messageService"===e._){const t=e.peerId;this.rootScope.dispatchEvent("message_edit",{storageKey:`${t}_history`,peerId:t,mid:e.mid,message:e}),this.isMessageIsTopMessage(e)&&this.rootScope.dispatchEvent("dialogs_multiupdate",new Map([[t,{dialog:this.getDialogOnly(t)}]]))}return t}))}getTypingKey(e,t){return t?`${e}_${t}`:e}setTyping(e,t,a,s){var n;s&&!this.appPeersManager.isForum(e)&&(s=void 0);const i=this.getTypingKey(e,s);let r=this.typings[i];return e&&this.canSendToPeer(e)&&e!==this.appPeersManager.peerId&&(a||(null===(n=null==r?void 0:r.action)||void 0===n?void 0:n._)!==t._)?((null==r?void 0:r.timeout)&&clearTimeout(r.timeout),r=this.typings[i]={action:t},this.apiManager.invokeApi("messages.setTyping",{peer:this.appPeersManager.getInputPeerById(e),action:t,top_msg_id:s?(0,oe.Z)(s):void 0}).finally((()=>{r===this.typings[i]&&(r.timeout=E.Z.setTimeout((()=>{delete this.typings[i]}),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)&&this.referenceDatabase.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=this.appWebPagesManager.getMessageKeyForPendingWebPage(e.peerId,e.mid,s);this.appWebPagesManager.deleteWebPageFromPending(a.webpage,n)}a.poll&&this.appPollsManager.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){this.fixDialogUnreadMentionsIfNoMessage(e);continue}this.handleReleasingMessage(a,t),this.updateMessageRepliesIfNeeded(a),a.pFlags.out||a.pFlags.is_outgoing||!a.pFlags.unread||(++s.unread,this.rootScope.dispatchEvent("notification_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)}if(s.albums)for(const e in s.albums)this.dispatchAlbumEdit(e,t,[...s.albums[e]]);return s}handleEditedMessage(e,t,a){var s;if("message"===e._){if(null===(s=e.media)||void 0===s?void 0:s.webpage){const t=this.appWebPagesManager.getMessageKeyForPendingWebPage(e.peerId,e.mid,!!e.pFlags.is_scheduled);this.appWebPagesManager.deleteWebPageFromPending(e.media.webpage,t)}const t=e.grouped_id;t&&this.dispatchAlbumEdit(t,a,[])}}dispatchAlbumEdit(e,t,a){const s=this.getMidsByAlbum(e).map((e=>this.getMessageFromStorage(t,e)));this.rootScope.dispatchEvent("album_edit",{peerId:s[0].peerId,groupId:e,deletedMids:a||[],messages:s})}getDialogUnreadCount(e){var t;let a=e.unread_count;if(!this.dialogsStorage.isTopic(e)&&this.appPeersManager.isForum(e.peerId)){const t=this.dialogsStorage.getForumUnreadCount(e.peerId);a=t instanceof Promise?0:t.count}return a||+!!(null===(t=e.pFlags)||void 0===t?void 0:t.unread_mark)}isDialogUnread(e){return!!this.getDialogUnreadCount(e)}canForward(e){return"message"===(null==e?void 0:e._)&&!e.pFlags.noforwards&&!this.appPeersManager.noForwards(e.peerId)}pushBatchUpdate(e,t,a,s){let n=this.batchUpdates[e];n||(n=this.batchUpdates[e]={callback:t,batch:new Map}),n.batch.has(a)||(n.batch.set(a,s?s():void 0),this.batchUpdatesDebounced())}getMessagesFromMap(e){const t=new Map;for(const[a,s]of e){const[e,n]=a.split("_"),i=this.getMessageByPeer(e.toPeerId(),+n);i&&t.set(i,s)}return t}saveDefaultSendAs(e,t){return this.appProfileManager.getCachedFullChat(e.toChatId()).default_send_as=this.appPeersManager.getOutputPeer(t),this.apiManager.invokeApi("messages.saveDefaultSendAs",{peer:this.appPeersManager.getInputPeerById(e),send_as:this.appPeersManager.getInputPeerById(t)})}}var aa=a(6724);function sa(e){const t=e.replace("input","");return t[0].toLowerCase()+t.slice(1)}class na extends G{constructor(){super(...arguments),this.peerSettings={notifyPeer:{},notifyUsers:null,notifyChats:null,notifyBroadcasts:null,notifyForumTopic:{}},this.checkMuteUntil=()=>{void 0!==this.checkMuteUntilTimeout&&(clearTimeout(this.checkMuteUntilTimeout),this.checkMuteUntilTimeout=void 0);const e=(0,te.Z)(!0);let t=o.rU;const a=a=>{if(a instanceof Promise)return!1;const s=a.mute_until;return!!s&&(s<=e?(a.mute_until=0,!0):(s{for(const t in this.peerSettings[e]){const s=this.peerSettings[e][t];if(a(s)){const[e,a]=t.split("_"),n=this.appPeersManager.getOutputPeer(e.toPeerId());this.apiUpdatesManager.saveUpdate({_:"updateNotifySettings",peer:a?{_:"notifyForumTopic",peer:n,top_msg_id:+a}:{_:"notifyPeer",peer:n},notify_settings:s})}}}));const s=Math.min(18e5,1e3*(t-e));this.checkMuteUntilTimeout=E.Z.setTimeout(this.checkMuteUntil,s)}}after(){return this.checkMuteUntilThrottled=(0,aa.Z)(this.checkMuteUntil,1e3,!1),this.apiUpdatesManager.addMultipleEventsListeners({updateNotifySettings:e=>{const{peer:t}=e,a="notifyForumTopic"===t._,s="notifyPeer"===t._||a,n=s&&this.appPeersManager.getPeerId(t.peer),i=s?void 0:t._;this.savePeerSettings({key:i,peerId:n,threadId:a?(0,pe.Z)(t.top_msg_id):void 0,settings:e.notify_settings}),this.rootScope.dispatchEvent("notify_settings",e)}}),this.appStateManager.getState().then((e=>{if(e.notifySettings)for(const t in e.notifySettings)(0,ue.Z)(t),this.savePeerSettings({key:t,settings:e.notifySettings[t]})}))}getNotifySettings(e){let t,a=sa(e._),s=this.peerSettings[a];return"inputNotifyPeer"===e._&&(t=a=this.appPeersManager.getPeerId(e.peer),s=s[a]),s||((s||this.peerSettings)[a]=this.apiManager.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 this.apiManager.invokeApi("account.updateNotifySettings",{peer:e,settings:t}).then((a=>{a&&this.apiUpdatesManager.processLocalUpdate({_:"updateNotifySettings",peer:Object.assign(Object.assign({},e),{_:sa(e._)}),notify_settings:Object.assign(Object.assign({},t),{_:"peerNotifySettings"})})}))}getContactSignUpNotification(){return this.notifyContactsSignUp?this.notifyContactsSignUp:this.notifyContactsSignUp=this.apiManager.invokeApi("account.getContactSignUpNotification")}setContactSignUpNotification(e){this.apiManager.invokeApi("account.setContactSignUpNotification",{silent:e}).then((t=>{this.notifyContactsSignUp=Promise.resolve(!e)}))}getPeerKey(e,t){return e+(t?"_"+t:"")}savePeerSettings({key:e,peerId:t,threadId:a,settings:s}){let n;t&&(e=this.getPeerKey(t,a),n=this.peerSettings[a?"notifyForumTopic":"notifyPeer"]),(n||this.peerSettings)[e]=s,t?this.checkMuteUntilThrottled():(this.rootScope.dispatchEvent("notify_peer_type_settings",{key:e,settings:s}),this.appStateManager.getState().then((t=>{const a=t.notifySettings;a[e]=s,this.appStateManager.pushToState("notifySettings",a)})))}isMuted(e){return"peerNotifySettings"===e._&&(e.silent||void 0!==e.mute_until&&1e3*e.mute_until>(0,te.Z)())}getPeerMuted(e){const t=this.getNotifySettings({_:"inputNotifyPeer",peer:this.appPeersManager.getInputPeerById(e)});return(t instanceof Promise?t:Promise.resolve(t)).then((e=>this.isMuted(e)))}getPeerLocalSettings({peerId:e,respectType:t=!0,threadId:a}){const s={_:"peerNotifySettings"},n=this.getPeerKey(e,a),i=this.peerSettings[a?"notifyForumTopic":"notifyPeer"][n];if(!i||i instanceof Promise||Object.assign(s,i),t){const t=sa(this.appPeersManager.getInputNotifyPeerById({peerId:e,ignorePeerId:!0,threadId:a})._),n=this.peerSettings[t];if(n&&!(n instanceof Promise))for(const e in n)void 0===s[e]&&(s[e]=n[e])}return s}validatePeerSettings(e){if(e.peerId!==this.appPeersManager.peerId)return e.threadId&&!this.appPeersManager.isForum(e.peerId)&&(e.threadId=void 0),e}isPeerLocalMuted(e){if(!(e=this.validatePeerSettings(e)))return!1;if(e.threadId){const t=this.getPeerLocalSettings(Object.assign(Object.assign({},e),{respectType:!1}));return void 0!==t.silent||void 0!==t.mute_until?this.isMuted(t):this.isPeerLocalMuted(Object.assign(Object.assign({},e),{threadId:void 0}))}const t=this.getPeerLocalSettings(e);return this.isMuted(t)}}var ia=a(677),ra=a(617),oa=a(7361),pa=a(7419),da=a(7256);class fa extends G{get peerId(){return this.appUsersManager.userId.toPeerId()}canPinMessage(e){return e.isUser()||this.appChatsManager.hasRights(e.toChatId(),"pin_messages")}getPeerPhoto(e){const t=this.getPeer(e);return(0,da.Z)(t)}getPeerMigratedTo(e){if(e.isUser())return!1;const t=this.appChatsManager.getChat(e.toChatId()),a=null==t?void 0:t.migrated_to;return!(!a||!t.pFlags.deactivated)&&(0,le.Z)(a)}getOutputPeer(e){if(e.isUser())return{_:"peerUser",user_id:e.toUserId()};const t=e.toChatId();return this.appChatsManager.isChannel(t)?{_:"peerChannel",channel_id:t}:{_:"peerChat",chat_id:t}}getPeerString(e){return e.isUser()?this.appUsersManager.getUserString(e.toUserId()):this.appChatsManager.getChatString(e.toChatId())}getPeerUsername(e){return this.getPeerActiveUsernames(e)[0]||""}getPeerActiveUsernames(e){const t=this.getPeer(e);return(0,Jt.Z)(t)}getPeer(e){return e.isUser()?this.appUsersManager.getUser(e.toUserId()):this.appChatsManager.getChat(e.toChatId())}getPeerId(e){return(0,le.Z)(e)||(0,fe.Z)(e)&&"inputPeerSelf"===e._&&this.peerId||o.NM}getDialogPeer(e){return{_:"dialogPeer",peer:this.getOutputPeer(e)}}isChannel(e){return!e.isUser()&&this.appChatsManager.isChannel(e.toChatId())}isMegagroup(e){return!e.isUser()&&this.appChatsManager.isMegagroup(e.toChatId())}isForum(e){return!e.isUser()&&this.appChatsManager.isForum(e.toChatId())}isAnyGroup(e){return!e.isUser()&&!this.appChatsManager.isBroadcast(e.toChatId())}isBroadcast(e){return this.isChannel(e)&&!this.isMegagroup(e)}isBot(e){return e.isUser()&&this.appUsersManager.isBot(e.toUserId())}isContact(e){return e.isUser()&&this.appUsersManager.isContact(e.toUserId())}isUser(e){return(0,ra.Z)(e)}isAnyChat(e){return(0,oa.Z)(e)}isPeerRestricted(e){return(0,pa.Z)(this.getPeer(e))}getRestrictionReasonText(e){const t=this.getPeer(e),a=t.restriction_reason?(0,ia.RP)(t.restriction_reason):void 0;return a?a.text:e.isUser()?"This user is restricted":"This chat is restricted"}getInputNotifyPeerById({peerId:e,ignorePeerId:t,threadId:a}){return t?e.isUser()?{_:"inputNotifyUsers"}:this.isBroadcast(e)?{_:"inputNotifyBroadcasts"}:{_:"inputNotifyChats"}:a?{_:"inputNotifyForumTopic",peer:this.getInputPeerById(e),top_msg_id:(0,oe.Z)(a)}:{_:"inputNotifyPeer",peer:this.getInputPeerById(e)}}getInputPeerById(e){if(!e)return{_:"inputPeerEmpty"};if(!e.isUser()){const t=e.toChatId();return this.appChatsManager.getInputPeer(t)}const t=e.toUserId();return this.appUsersManager.getUserInputPeer(t)}getInputPeerSelf(){return{_:"inputPeerSelf"}}getInputDialogPeerById(e){return{_:"inputDialogPeer",peer:(0,fe.Z)(e)?e:this.getInputPeerById(e)}}getPeerSearchText(e){let t;return t=this.isUser(e)?"%pu "+this.appUsersManager.getUserSearchText(e.toUserId()):"%pg "+(this.appChatsManager.getChat(e.toChatId()).title||""),t}getDialogType(e){return this.isMegagroup(e)?"megagroup":this.isChannel(e)?"channel":this.isUser(e)?e===this.peerId?"saved":"chat":"group"}getDeleteButtonText(e){switch(this.getDialogType(e)){case"channel":return this.appChatsManager.hasRights(e.toChatId(),"delete_chat")?"ChannelDelete":"ChatList.Context.LeaveChannel";case"megagroup":case"group":return this.appChatsManager.hasRights(e.toChatId(),"delete_chat")?"DeleteMega":"ChatList.Context.LeaveGroup";default:return"ChatList.Context.DeleteChat"}}noForwards(e){var t;return!e.isUser()&&!!(null===(t=this.appChatsManager.getChat(e.toChatId()).pFlags)||void 0===t?void 0:t.noforwards)}}class ca extends G{constructor(){super(...arguments),this.photos={}}savePhoto(e,t){var a;if(!e||"photoEmpty"===e._)return;const s=this.photos[e.id];if(e.file_reference&&(pt("file_reference",s,e),this.referenceDatabase.saveContext(e.file_reference,t)),null===(a=e.sizes)||void 0===a?void 0:a.length){e.sizes.sort(((e,t)=>(e.size||(e.sizes?1/0:0))-(t.size||(t.sizes?1/0:0))));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}getUserPhotos(e,t="0",a=20){const s=this.appUsersManager.getUserInput(e);return this.apiManager.invokeApiCacheable("photos.getUserPhotos",{user_id:s,offset:0,limit:a,max_id:t},{cacheSeconds:60}).then((a=>{this.appUsersManager.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}}))}getPhoto(e){return(0,fe.Z)(e)?e:this.photos[e]}}class la extends G{constructor(){super(...arguments),this.polls={},this.results={},this.pollToMessages={},this.log=(0,I.kg)("POLLS",I.v9.Error)}after(){this.apiUpdatesManager.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,this.rootScope.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.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=(0,ke.Z)(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,r=this.appPeersManager.getInputPeerById(i);return e.pFlags.is_outgoing?this.appMessagesManager.invokeAfterMessageIsSent(n,"sendVote",(e=>(this.log("invoke sendVote callback"),this.sendVote(e,t)))):this.apiManager.invokeApi("messages.sendVote",{peer:r,msg_id:(0,oe.Z)(e.mid),options:s}).then((e=>{this.log("sendVote updates:",e),this.apiUpdatesManager.processUpdateMessage(e)}))}getResults(e){const t=this.appPeersManager.getInputPeerById(e.peerId);return this.apiManager.invokeApi("messages.getPollResults",{peer:t,msg_id:(0,oe.Z)(e.mid)}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e),this.log("getResults updates:",e)}))}getVotes(e,t,a,s=20){return this.apiManager.invokeApi("messages.getPollVotes",{peer:this.appPeersManager.getInputPeerById(e.peerId),id:(0,oe.Z)(e.mid),option:t,offset:a,limit:s}).then((e=>(this.log("getPollVotes messages:",e),this.appUsersManager.saveApiUsers(e.users),e)))}stopPoll(e){const t=e.media.poll;if(t.pFlags.closed)return Promise.resolve();const a=(0,ve.Z)(t);return a.pFlags.closed=!0,this.appMessagesManager.editMessage(e,void 0,{newMedia:this.getInputMediaPoll(a)}).then((()=>{}),(e=>{this.log.error("stopPoll error:",e)}))}}class ma extends G{constructor(){super(...arguments),this.privacy={}}after(){this.apiUpdatesManager.addMultipleEventsListeners({updatePrivacy:e=>{const t=e.key._;this.privacy[t]=e.rules,this.rootScope.dispatchEvent("privacy_update",e)}})}setPrivacy(e,t){return this.apiManager.invokeApi("account.setPrivacy",{key:{_:e},rules:t}).then((a=>(this.appUsersManager.saveApiUsers(a.users),this.appChatsManager.saveApiChats(a.chats),this.apiUpdatesManager.processLocalUpdate({_:"updatePrivacy",key:{_:sa(e)},rules:t.map((e=>{const t={};return Object.assign(t,e),t._=sa(t._),t}))}),a.rules)))}getPrivacy(e){const t=sa(e),a=this.privacy[t];return a?Promise.resolve(a):this.privacy[t]=this.apiManager.invokeApi("account.getPrivacy",{key:{_:e}}).then((e=>(this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.privacy[t]=e.rules)))}getGlobalPrivacySettings(){return this.apiManager.invokeApi("account.getGlobalPrivacySettings")}setGlobalPrivacySettings(e){return this.apiManager.invokeApi("account.setGlobalPrivacySettings",{settings:e})}}var ga=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 ha=18e4;class ua extends G{constructor(){super(...arguments),this.usersFull={},this.chatsFull={},this.fullExpiration={},this.onUpdateUserTyping=e=>{var t,a;const s=e.user_id?e.user_id.toPeerId():this.appPeersManager.getPeerId(e.from_id);if(this.appPeersManager.peerId===s||"speakingInGroupCallAction"===e.action._)return;const n=e.top_msg_id,i=n?(0,pe.Z)(n):void 0,r=this.appPeersManager.getPeerId(e),o=this.getTypingsKey(r,i),p=null!==(t=(a=this.typingsInPeer)[o])&&void 0!==t?t:a[o]=[];let d=p.find((e=>e.userId===s));const f=()=>{delete d.timeout;const e=p.indexOf(d);-1!==e&&p.splice(e,1),this.rootScope.dispatchEvent("peer_typings",{peerId:r,threadId:i,typings:p}),p.length||delete this.typingsInPeer[o]};if(void 0!==(null==d?void 0:d.timeout)&&clearTimeout(d.timeout),"sendMessageCancelAction"===e.action._){if(!d)return;return void f()}d||(d={userId:s},p.push(d)),d.action=e.action;const c=this.appUsersManager.hasUser(s);c?this.appUsersManager.forceUserOnline(s):"updateChatUserTyping"===e._&&e.chat_id&&this.appChatsManager.hasChat(e.chat_id)&&!this.appChatsManager.isChannel(e.chat_id)&&Promise.resolve(this.getChatFull(e.chat_id)).then((()=>{void 0!==d.timeout&&this.appUsersManager.hasUser(s)&&this.rootScope.dispatchEvent("peer_typings",{peerId:r,threadId:i,typings:p})})),d.timeout=E.Z.setTimeout(f,6e3),c&&this.rootScope.dispatchEvent("peer_typings",{peerId:r,threadId:i,typings:p})},this.onUpdatePeerBlocked=e=>{const t=this.appPeersManager.getPeerId(e.peer_id);if(this.appPeersManager.isUser(t)){const a=t.toUserId(),s=this.usersFull[a];s&&(e.blocked?s.pFlags.blocked=!0:delete s.pFlags.blocked),this.rootScope.dispatchEvent("user_full_update",a)}this.rootScope.dispatchEvent("peer_block",{peerId:t,blocked:e.blocked})}}after(){this.apiUpdatesManager.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,this.rootScope.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;const s=this.chatsFull[e],n=this.appChatsManager.getChat(e);if(!s||!n)return;let i=!1;!!s.call!=!!(null===(t=n.pFlags)||void 0===t?void 0:t.call_active)&&(i=!0);const{photo:r}=n;if(r){const e="chatPhotoEmpty"!==r._;(e!==!(!s.chat_photo||"photoEmpty"===s.chat_photo._)||e&&r.photo_id!==(null===(a=s.chat_photo)||void 0===a?void 0:a.id))&&(i=!0)}i&&this.refreshFullPeer(e.toPeerId(!0))})),this.rootScope.addEventListener("channel_update",(e=>{this.refreshFullPeer(e.toPeerId(!0))})),this.rootScope.addEventListener("chat_full_update",(e=>{this.rootScope.dispatchEvent("peer_full_update",e.toPeerId(!0))})),this.rootScope.addEventListener("user_full_update",(e=>{this.rootScope.dispatchEvent("peer_full_update",e.toPeerId(!1))})),this.rootScope.addEventListener("invalidate_participants",(e=>{this.invalidateChannelParticipants(e)})),this.typingsInPeer={}}getProfile(e,t){return this.usersFull[e]&&!t&&Date.now(){this.appChatsManager.saveApiChats(t.chats,!0),this.appUsersManager.saveApiUsers(t.users);const a=t.full_user,s=e.toPeerId(!1);a.profile_photo&&(a.profile_photo=this.appPhotosManager.savePhoto(a.profile_photo,{type:"profilePhoto",peerId:s}));const n=a.bot_info;if(n){const t={type:"userFull",userId:e};n.description_document=this.appDocsManager.saveDoc(n.description_document,t),n.description_photo=this.appPhotosManager.savePhoto(n.description_photo,t)}return this.appNotificationsManager.savePeerSettings({peerId:s,settings:a.notify_settings}),this.usersFull[e]=a,this.fullExpiration[s]=Date.now()+ha,this.rootScope.dispatchEvent("user_full_update",e),a}})}getProfileByPeerId(e,t){return this.appPeersManager.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 ga(this,void 0,void 0,(function*(){const t=yield this.getProfileByPeerId(e);switch(t._){case"userFull":return t.profile_photo;case"channelFull":case"chatFull":return t.chat_photo}}))}getChatFull(e,t){if(this.appChatsManager.isChannel(e))return this.getChannelFull(e,t);const a=e.toPeerId(!0),s=this.chatsFull[e];if(s&&!t&&Date.now(){this.appChatsManager.saveApiChats(t.chats,!0),this.appUsersManager.saveApiUsers(t.users);const s=t.full_chat;return s&&s.chat_photo&&s.chat_photo.id&&(s.chat_photo=this.appPhotosManager.savePhoto(s.chat_photo,{type:"profilePhoto",peerId:a})),s.call&&this.appGroupCallsManager.saveGroupCall(s.call,e),this.appNotificationsManager.savePeerSettings({peerId:a,settings:s.notify_settings}),this.chatsFull[e]=s,this.fullExpiration[a]=Date.now()+ha,this.rootScope.dispatchEvent("chat_full_update",e),s}})}getChatInviteLink(e,t){return ga(this,void 0,void 0,(function*(){const a=yield this.getChatFull(e);return!t&&a.exported_invite&&"chatInviteExported"==a.exported_invite._?a.exported_invite.link:this.apiManager.invokeApi("messages.exportChatInvite",{peer:this.appPeersManager.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=this.appChatsManager.getChat(e);if((null==t?void 0:t.pFlags)&&t.pFlags.broadcast&&!t.pFlags.creator&&!t.admin_rights)return Promise.reject()}return this.apiManager.invokeApiCacheable("channels.getParticipants",{channel:this.appChatsManager.getChannelInput(e),filter:t,offset:s,limit:a,hash:"0"},{cacheSeconds:60}).then((e=>(this.appUsersManager.saveApiUsers(e.users),e)))}getChannelParticipant(e,t){return this.apiManager.invokeApiSingle("channels.getParticipant",{channel:this.appChatsManager.getChannelInput(e),participant:this.appPeersManager.getInputPeerById(t)}).then((e=>(this.appUsersManager.saveApiUsers(e.users),e.participant)))}getChannelFull(e,t){const a=e.toPeerId(!0);return void 0!==this.chatsFull[e]&&!t&&Date.now(){this.appChatsManager.saveApiChats(t.chats,!0),this.appUsersManager.saveApiUsers(t.users);const s=t.full_chat;return s&&s.chat_photo.id&&(s.chat_photo=this.appPhotosManager.savePhoto(s.chat_photo,{type:"profilePhoto",peerId:a})),s.call&&this.appGroupCallsManager.saveGroupCall(s.call,e),this.appNotificationsManager.savePeerSettings({peerId:a,settings:s.notify_settings}),this.chatsFull[e]=s,this.fullExpiration[a]=Date.now()+ha,this.rootScope.dispatchEvent("chat_full_update",e),s},processError:t=>{if("CHANNEL_PRIVATE"===t.type){const t=this.appChatsManager.getChat(e);this.apiUpdatesManager.processUpdateMessage({_:"updates",updates:[{_:"updateChannel",channel_id:e}],chats:["channelForbidden"===t._?t:{_:"channelForbidden",id:e,access_hash:t.access_hash,title:t.title,pFlags:t.pFlags}],users:[]})}throw t}})}getMentions(e,t,a){const s=e=>{"@"===t.charAt(0)&&(t=t.slice(1));const a=new ae.Z({ignoreCase:!0}),s=new Map;e.forEach((e=>{a.indexObject(e.id,this.appUsersManager.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};let n;return n=this.appChatsManager.isChannel(e)?this.getChannelParticipants(e,{_:"channelParticipantsMentions",q:t,top_msg_id:(0,oe.Z)(a)},50,0).then((e=>e.participants.map((e=>(0,xe.Z)(e))))):e?Promise.resolve(this.getChatFull(e)).then((e=>e.participants.participants.map((e=>e.user_id.toPeerId())))):Promise.resolve([]),Promise.all([this.appUsersManager.getTopPeers("bots_inline").catch((()=>[])),n]).then((e=>{const t=e[0].concat(e[1].map((e=>({id:e,rating:0}))));return s(t)}))}invalidateChannelParticipants(e){this.apiManager.clearCache("channels.getParticipants",(t=>t.channel.channel_id===e)),this.refreshFullPeer(e.toPeerId(!0))}refreshFullPeer(e){if(e.isUser()){const t=e.toUserId();delete this.usersFull[t],this.rootScope.dispatchEvent("user_full_update",t)}else{const t=e.toChatId();delete this.chatsFull[t],this.rootScope.dispatchEvent("chat_full_update",t)}}updateProfile(e,t,a){return this.apiManager.invokeApi("account.updateProfile",{first_name:e,last_name:t,about:a}).then((e=>{if(this.appUsersManager.saveApiUser(e),void 0!==a){const t=e.id.toPeerId(),s=this.usersFull[e.id];s&&(s.about=a),this.rootScope.dispatchEvent("peer_bio_edit",t)}return this.getProfile(e.id,!0)}))}uploadProfilePhoto(e){return this.apiManager.invokeApi("photos.uploadProfilePhoto",{file:e}).then((e=>{const t=e.photo;if(!e.users.length){const a=t.sizes.find((e=>"photoStrippedSize"===e._));e.users.push(Object.assign(Object.assign({},this.appUsersManager.getSelf()),{photo:{_:"userProfilePhoto",dc_id:t.dc_id,photo_id:t.id,stripped_thumb:null==a?void 0:a.bytes,pFlags:{}}}))}this.appUsersManager.saveApiUsers(e.users);const a=this.appPeersManager.peerId;this.appPhotosManager.savePhoto(e.photo,{type:"profilePhoto",peerId:a});const s=a.toUserId();this.apiUpdatesManager.processLocalUpdate({_:"updateUser",user_id:s})}))}deletePhotos(e){return this.apiManager.invokeApiSingle("photos.deletePhotos",{id:e.map((e=>Ct(this.appPhotosManager.getPhoto(e))))}).then((e=>{}))}verifyParticipantForOnlineCount(e){const t=this.appUsersManager.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 ga(this,void 0,void 0,(function*(){if(this.appChatsManager.isBroadcast(e))return 1;const a=yield this.getChatFull(e);if(this.appChatsManager.isMegagroup(e)){if(a.participants_count<=100){const t=yield this.getChannelParticipants(e,{_:"channelParticipantsRecent"},100);return this.reduceParticipantsForOnlineCount(t.participants)}const s=yield this.apiManager.invokeApiCacheable("messages.getOnlines",{peer:this.appChatsManager.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}))}getTypingsKey(e,t){return e+(t?`_${t}`:"")}getPeerTypings(e,t){return this.typingsInPeer[this.getTypingsKey(e,t)]}}function ya(e,t){return e.some((e=>e instanceof Promise))?Promise.all(e).then(t):t(e)}var _a=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 va=["static_icon","appear_animation","select_animation","activate_animation","effect_animation","around_animation","center_icon"],Pa={type:"reactions"};class ba extends G{after(){this.rootScope.addEventListener("language_change",(()=>{this.availableReactions=void 0,this.getAvailableReactions()})),this.sendReactionPromises=new Map,this.lastSendingTimes=new Map,this.rootScope.addEventListener("user_auth",(()=>{setTimeout((()=>{Promise.resolve(this.getAvailableReactions()).then((e=>_a(this,void 0,void 0,(function*(){for(const t of e)yield Promise.all([t.around_animation&&this.apiFileManager.downloadMedia({media:t.around_animation}),t.static_icon&&this.apiFileManager.downloadMedia({media:t.static_icon}),t.appear_animation&&this.apiFileManager.downloadMedia({media:t.appear_animation}),t.center_icon&&this.apiFileManager.downloadMedia({media:t.center_icon})]),yield(0,P.Z)(1e3)}))))}),7500)}))}getAvailableReactions(){return this.availableReactions?this.availableReactions:this.apiManager.invokeApiSingleProcess({method:"messages.getAvailableReactions",processResult:e=>{(0,ue.Z)(e);const t=this.availableReactions=e.reactions;for(const e of t)for(const t of va)e[t]&&(e[t]=this.appDocsManager.saveDoc(e[t],Pa));return t},params:{hash:0}})}getActiveAvailableReactions(){return(0,q.Z)(this.getAvailableReactions(),(e=>e.filter((e=>!e.pFlags.inactive))))}getAvailableReactionsForPeer(e){const t=this.getActiveAvailableReactions();return e.isUser()?this.unshiftQuickReaction(t):ya([t,this.appProfileManager.getChatFull(e.toChatId()),this.getQuickReaction()],(([e,t,a])=>{var s;const n=null!==(s=t.available_reactions)&&void 0!==s?s:{_:"chatReactionsNone"};let i=[];return"chatReactionsAll"===n._?i=e:"chatReactionsSome"===n._&&(i=n.reactions.map((t=>e.find((e=>e.reaction===t.emoticon)))).filter(Boolean)),this.unshiftQuickReactionInner(i,a)}))}unshiftQuickReactionInner(e,t){if(t&&"reactionEmoji"!==t._&&"availableReaction"!==t._)return e;const a=t.emoticon||t.reaction,s=(0,Pe.Z)(e,(e=>e.reaction===a));return s&&e.unshift(s),e}unshiftQuickReaction(e,t=this.getQuickReaction()){return ya([e,t],(([e,t])=>this.unshiftQuickReactionInner(e,t)))}getAvailableReactionsByMessage(e){var t;if(!e)return[];const a=(null===(t=e.fwd_from)||void 0===t?void 0:t.channel_post)&&this.appPeersManager.isMegagroup(e.peerId)&&e.fwdFromId||e.peerId;return this.getAvailableReactionsForPeer(a)}isReactionActive(e){return!!this.availableReactions&&!!this.availableReactions.find((t=>t.reaction===e))}getQuickReaction(){return ya([this.apiManager.getConfig(),this.getAvailableReactions()],(([e,t])=>{const a=e.reactions_default;return"reactionEmoji"===(null==a?void 0:a._)?t.find((e=>e.reaction===a.emoticon)):a}))}getReactionCached(e){return this.availableReactions.find((t=>t.reaction===e))}getReaction(e){return(0,q.Z)(this.getAvailableReactions(),(()=>this.getReactionCached(e)))}getMessagesReactions(e,t){return this.apiManager.invokeApiSingleProcess({method:"messages.getMessagesReactions",params:{id:t.map((e=>(0,oe.Z)(e))),peer:this.appPeersManager.getInputPeerById(e)},processResult:e=>{this.apiUpdatesManager.processUpdateMessage(e)}})}getMessageReactionsList(e,t,a,s,n){return this.apiManager.invokeApiSingleProcess({method:"messages.getMessageReactionsList",params:{peer:this.appPeersManager.getInputPeerById(e),id:(0,oe.Z)(t),limit:a,reaction:s,offset:n},processResult:e=>(this.appUsersManager.saveApiUsers(e.users),e)})}setDefaultReaction(e){return this.apiManager.invokeApi("messages.setDefaultReaction",{reaction:e}).then((t=>_a(this,void 0,void 0,(function*(){if(t){const t=yield this.apiManager.getConfig();t&&(t.reactions_default=e),this.rootScope.dispatchEvent("quick_reaction",e)}return t}))))}sendReaction(e,t,a){var s,n;return _a(this,void 0,void 0,(function*(){"availableReaction"===t._&&(t={_:"reactionEmoji",emoticon:t.reaction});const i=yield this.apiManager.getLimit("reactions"),r=e.peerId+"_"+e.mid;if(this.lastSendingTimes.get(r))return;this.lastSendingTimes.set(r,Date.now()),setTimeout((()=>{this.lastSendingTimes.delete(r)}),333);const{peerId:o,mid:p}=e,d=this.appPeersManager.peerId,f=e=>{--e.count,delete e.chosen_order,(0,Kt.Z)(t,e.reaction)&&(t=void 0),e.count||(0,M.Z)(l.results,e),l.recent_reactions&&(0,Pe.Z)(l.recent_reactions,(t=>(0,Kt.Z)(t.reaction,e.reaction)&&this.appPeersManager.getPeerId(t.peer_id)===d)),l.results.length||(l=void 0)},c=(null===(n=null===(s=e.reactions)||void 0===s?void 0:s.pFlags)||void 0===n?void 0:n.can_see_list)||!this.appPeersManager.isBroadcast(e.peerId)||e.peerId.isUser();e.reactions||(e.reactions={_:"messageReactions",results:[],recent_reactions:c?[]:void 0,pFlags:{can_see_list:c||void 0}});let l=a?e.reactions:(0,ve.Z)(e.reactions);const m=l.results.filter((e=>void 0!==e.chosen_order));m.sort(((e,t)=>t.chosen_order-e.chosen_order));const g=[],h=m.findIndex((e=>(0,Kt.Z)(e.reaction,t)));-1!==h&&g.push(...m.splice(h,1)),g.push(...m.splice(i-+(-1===h))),g.forEach((e=>{m.forEach((t=>{t.chosen_order>e.chosen_order&&--t.chosen_order})),f(e)}));const u=m.length;if(m.forEach(((e,t)=>{e.chosen_order=u-1-t})),t){l||(l={_:"messageReactions",results:[],pFlags:{}},c&&(l.pFlags.can_see_list=!0));let e=l.results.findIndex((e=>(0,Kt.Z)(e.reaction,t))),a=-1!==e&&l.results[e];if(a||(a={_:"reactionCount",count:0,reaction:t},e=l.results.push(a)-1),++a.count,a.chosen_order=m.length?m[0].chosen_order+1:0,m.unshift(a),!l.recent_reactions&&c&&(l.recent_reactions=[]),l.recent_reactions){const e={_:"messagePeerReaction",reaction:t,peer_id:this.appPeersManager.getOutputPeer(d),pFlags:{}};this.appPeersManager.isMegagroup(o),l.recent_reactions.unshift(e),l.recent_reactions=l.recent_reactions.slice(0,3)}}const y=this.availableReactions;if(l&&(null==y?void 0:y.length)){const e=new Map;y.forEach(((t,a)=>{e.set(t.reaction,a)})),l.results.sort(((t,a)=>{var s,n;const i=t.reaction.document_id||t.reaction.emoticon,r=a.reaction.document_id||a.reaction.emoticon;return a.count-t.count||(null!==(s=e.get(i))&&void 0!==s?s:0)-(null!==(n=e.get(r))&&void 0!==n?n:0)}))}if(a)return e.reactions=l,this.rootScope.dispatchEvent("messages_reactions",[{message:e,changedResults:[]}]),Promise.resolve();this.apiUpdatesManager.processLocalUpdate({_:"updateMessageReactions",peer:e.peer_id,msg_id:e.id,reactions:l,local:!0});const _=[o,p].join("-"),v=(0,oe.Z)(p),P=this.apiManager.invokeApi("messages.sendReaction",{peer:this.appPeersManager.getInputPeerById(o),msg_id:v,reaction:m.map((e=>e.reaction))}).then((e=>{(0,ue.Z)(e);const t=e.updates.findIndex((e=>"updateEditMessage"===e._||"updateEditChannelMessage"===e._));if(-1!==t){const a=e.updates[t];e.updates[t]={_:"updateMessageReactions",msg_id:v,peer:this.appPeersManager.getOutputPeer(o),reactions:a.message.reactions,pts:a.pts,pts_count:a.pts_count}}this.apiUpdatesManager.processUpdateMessage(e)})).catch((t=>{var a;"REACTION_INVALID"===t.type&&this.sendReactionPromises.get(_)===P&&this.sendReaction(e,null===(a=m[0])||void 0===a?void 0:a.reaction,!0)})).finally((()=>{this.sendReactionPromises.get(_)===P&&this.sendReactionPromises.delete(_)}));return this.sendReactionPromises.set(_,P),P}))}}var Ma=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 Ia={EMOJI:"inputStickerSetAnimatedEmoji",EMOJI_ANIMATIONS:"inputStickerSetAnimatedEmojiAnimations",PREMIUM_GIFTS:"inputStickerSetPremiumGifts",GENERIC_ANIMATIONS:"inputStickerSetEmojiGenericAnimations",DEFAULT_STATUSES:"inputStickerSetEmojiDefaultStatuses",DEFAULT_TOPIC_ICONS:"inputStickerSetEmojiDefaultTopicIcons"},Sa=new Set(Object.values(Ia));class Ca extends G{constructor(){super(...arguments),this.storage=new W.Z(H.Z,"stickerSets"),this.processAllStickersResult=e=>((0,ue.Z)(e),(0,ne.Z)(e.sets,((e,t,a)=>{e.pFlags.videos&&!i().IS_WEBM_SUPPORTED&&a.splice(t,1)})),e)}after(){this.getStickerSetPromises={},this.getStickersByEmoticonsPromises={},this.sounds={},this.names={},this.rootScope.addEventListener("user_auth",(()=>{setTimeout((()=>{this.getAnimatedEmojiStickerSet()}),1e3),this.getGreetingStickersPromise||void 0!==this.getGreetingStickersTimeout||(this.getGreetingStickersTimeout=E.Z.setTimeout((()=>{this.getGreetingStickersTimeout=void 0,this.getGreetingSticker(!0)}),5e3))})),this.rootScope.addEventListener("app_config",(()=>this.onStickersUpdated("faved",!0))),this.apiUpdatesManager.addMultipleEventsListeners({updateNewStickerSet:e=>{const t=e.stickerset;this.saveStickerSet(t,t.set.id),this.rootScope.dispatchEvent("stickers_installed",t.set)},updateRecentStickers:()=>this.onStickersUpdated("recent",!0),updateFavedStickers:()=>this.onStickersUpdated("faved",!0),updateMoveStickerSetToTop:e=>{this.rootScope.dispatchEvent("stickers_top",e.stickerset)}})}onStickersUpdated(e,t){return Ma(this,void 0,void 0,(function*(){const a=yield"faved"===e?this.getFavedStickersStickers(t):this.getRecentStickersStickers(t);this.rootScope.dispatchEvent("stickers_updated",{type:e,stickers:a})}))}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)),this.apiFileManager.downloadMedia({media:this.greetingStickers[0]}),t}))}saveStickers(e){(0,ne.Z)(e,((t,a)=>{(t=this.appDocsManager.saveDoc(t))?e[a]=t:e.splice(a,1)}))}canUseStickerSetCache(e,t){var a;return e&&(null===(a=e.documents)||void 0===a?void 0:a.length)&&(Date.now()-e.refreshTime<36e5||t)}getStickerSet(e,t={}){let{id:a}=e;if(e.access_hash||(e=this.names[a]||e,a=e.id),this.getStickerSetPromises[a])return this.getStickerSetPromises[a];if(!t.overwrite){const e=this.storage.getFromCache(a);if(this.canUseStickerSetCache(e,t.useCache))return e}const s=this.getStickerSetPromises[a]=new Promise((n=>Ma(this,void 0,void 0,(function*(){if(!t.overwrite){const e=yield this.storage.get(a);if(this.canUseStickerSetCache(e,t.useCache))return this.saveStickers(e.documents),n(e),void(this.getStickerSetPromises[a]===s&&delete this.getStickerSetPromises[a])}try{const s=yield this.apiManager.invokeApi("messages.getStickerSet",{stickerset:this.getStickerSetInput(e),hash:0}),i=t.saveById?a:s.set.id;this.saveStickerSet(s,i),n(s)}catch(e){n(null)}this.getStickerSetPromises[a]===s&&delete this.getStickerSetPromises[a]}))));return s}getLocalStickerSet(e){return this.getStickerSet({id:e},{saveById:!0})}getAnimatedEmojiStickerSet(){return Promise.all([this.getLocalStickerSet(Ia.EMOJI),this.getLocalStickerSet(Ia.EMOJI_ANIMATIONS),this.getAnimatedEmojiSounds()]).then((([e,t])=>({emoji:e,animations:t})))}getAnimatedEmojiSounds(e){if(this.getAnimatedEmojiSoundsPromise&&!e)return this.getAnimatedEmojiSoundsPromise;const t=this.getAnimatedEmojiSoundsPromise=Promise.all([this.apiManager.getAppConfig(e),this.apiManager.getConfig()]).then((([e,a])=>{if(this.getAnimatedEmojiSoundsPromise===t)for(const t in e.emojies_sounds){const s=e.emojies_sounds[t],n=atob(s.file_reference_base64.replace(/-/g,"+").replace(/_/g,"/")),i=new Uint8Array(n.length);for(let e=0,t=i.length;e((0,ue.Z)(e),this.recentStickers=e.stickers,this.saveStickers(e.stickers),e),overwrite:e})}))}getRecentStickersStickers(e){if(e)this.recentStickers=void 0;else if(this.recentStickers)return this.recentStickers;return this.getRecentStickers(e).then((()=>this.recentStickers))}saveRecentSticker(e,t,a){const s=this.appDocsManager.getDoc(e);if((0,Pe.Z)(this.recentStickers,(t=>t.id===e)),!t){this.recentStickers.unshift(s);const e=(0,Pt.Z)(s.stickerEmojiRaw);for(const t in this.getStickersByEmoticonsPromises)this.getStickersByEmoticonsPromises[t].then((a=>{const n=(0,Pe.Z)(a,(e=>e.id===s.id));n?a.unshift(n):t.includes(e)&&a.unshift(s)}))}return this.rootScope.dispatchEvent("sticker_updated",{type:"recent",faved:!t,document:s}),t&&this.onStickersUpdated("recent",!1),this.apiManager.invokeApi("messages.saveRecentSticker",{id:zt(s),unsave:t,attached:a})}cleanEmoji(e){return e.replace(/\ufe0f/g,"").replace(/๐Ÿป|๐Ÿผ|๐Ÿฝ|๐Ÿพ|๐Ÿฟ/g,"")}getAnimatedEmojiSticker(e,t){const a=t?Ia.EMOJI_ANIMATIONS:Ia.EMOJI,s=this.storage.getFromCache(a);if(!(null==s?void 0:s.documents))return;t&&["๐Ÿงก","๐Ÿ’›","๐Ÿ’š","๐Ÿ’™","๐Ÿ’œ","๐Ÿ–ค","๐Ÿค","๐ŸคŽ"].includes(e)&&(e="โค๏ธ"),e=this.cleanEmoji(e);const n=s.packs.find((t=>t.emoticon===e));return n?this.appDocsManager.getDoc(n.documents[0]):void 0}getAnimatedEmojiSoundDocument(e){return this.sounds[this.cleanEmoji(e)]}preloadAnimatedEmojiSticker(e){const t=this.getAnimatedEmojiStickerSet().then((()=>this.getAnimatedEmojiSticker(e)));return Promise.all([t,this.preloadAnimatedEmojiStickerAnimation(e)]).then((([e,t])=>({doc:e,animation:null==t?void 0:t.doc,sound:null==t?void 0:t.sound})))}preloadAnimatedEmojiStickerAnimation(e){return this.getAnimatedEmojiStickerSet().then((()=>this.getAnimatedEmojiSticker(e,!0))).then((t=>{if(!t)return;const a=this.getAnimatedEmojiSoundDocument(e);return Promise.all([this.preloadSticker(t.id),a?this.preloadSticker(a.id):void 0]).then((()=>({doc:t,sound:a})))}))}preloadSticker(e,t){var a;const s=this.appDocsManager.getDoc(e);return this.apiFileManager.downloadMedia({media:s,thumb:t?null===(a=s.video_thumbs)||void 0===a?void 0:a[0]:void 0})}saveStickerSet(e,t){const a={_:"messages.stickerSet",set:e.set,packs:e.packs,documents:e.documents,keywords:e.keywords};let s=this.storage.getFromCache(t);s?Object.assign(s,a):s=this.storage.setToCache(t,a),s.set.short_name&&(this.names[s.set.short_name]=this.getStickerSetInput(a.set)),this.saveStickers(e.documents);const n=s.set.installed_date||Sa.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 Sa.has(e.id)?{_:e.id}:e.access_hash?{_:"inputStickerSetID",id:e.id,access_hash:e.access_hash}:{_:"inputStickerSetShortName",short_name:""+e.id}}getFeaturedStickers(){return Ma(this,void 0,void 0,(function*(){return(yield this.apiManager.invokeApiHashable({method:"messages.getFeaturedStickers",processResult:e=>((0,ue.Z)(e),(0,ne.Z)(e.sets,((e,t,a)=>{e.set.pFlags.videos&&!i().IS_WEBM_SUPPORTED&&a.splice(t,1)})),e.sets.forEach((e=>{this.saveStickerSet({set:e.set,documents:[],packs:[],keywords:[]},e.set.id)})),e)})).sets}))}getPromoPremiumStickers(){return this.getStickersByEmoticon("โญ๏ธโญ๏ธ",!1)}getPremiumStickers(){return this.getStickersByEmoticon("๐Ÿ“‚โญ๏ธ",!1)}getFavedStickers(e){return this.apiManager.invokeApiHashable({method:"messages.getFavedStickers",processResult:e=>((0,ue.Z)(e),this.saveStickers(e.stickers),this.favedStickers=e.stickers,e),overwrite:e})}getFavedStickersStickers(e){if(e)this.favedStickers=void 0;else if(this.favedStickers)return this.favedStickers;return this.getFavedStickers(e).then((()=>this.favedStickers))}getFavedStickersLimit(){return this.apiManager.getLimit("favedStickers")}faveSticker(e,t){return Ma(this,void 0,void 0,(function*(){this.favedStickers||(yield this.getFavedStickersStickers());const a=yield this.getFavedStickersLimit(),s=this.appDocsManager.getDoc(e);return(0,Pe.Z)(this.favedStickers,(e=>e.id===s.id)),t||(this.favedStickers.unshift(s),this.favedStickers.splice(a,this.favedStickers.length-a)),this.rootScope.dispatchEvent("sticker_updated",{type:"faved",faved:!t,document:s}),this.apiManager.invokeApi("messages.faveSticker",{id:zt(s),unfave:t}).then((()=>{t&&this.onStickersUpdated("faved",!0)}))}))}toggleStickerSet(e){return Ma(this,void 0,void 0,(function*(){if((e=this.storage.getFromCache(e.id).set).installed_date){if(yield this.apiManager.invokeApi("messages.uninstallStickerSet",{stickerset:this.getStickerSetInput(e)}))return delete e.installed_date,this.rootScope.dispatchEvent("stickers_deleted",e),this.storage.delete(e.id,!0),!0}else if(yield this.apiManager.invokeApi("messages.installStickerSet",{stickerset:this.getStickerSetInput(e),archived:!1}))return e.installed_date=Date.now()/1e3|0,this.rootScope.dispatchEvent("stickers_installed",e),!0;return!1}))}toggleStickerSets(e){return Promise.all(e.map((e=>this.toggleStickerSet(e))))}searchStickerSets(e,t=!0){return Ma(this,void 0,void 0,(function*(){const a=t?1:0,s=yield this.apiManager.invokeApiHashable({method:"messages.searchStickerSets",params:{flags:a,exclude_featured:t||void 0,q:e},processResult:e=>((0,ue.Z)(e),(0,ne.Z)(e.sets,((e,t,a)=>{e.set.pFlags.videos&&!i().IS_WEBM_SUPPORTED&&a.splice(t,1)})),e.sets.forEach((e=>{this.saveStickerSet({set:e.set,documents:[],packs:[],keywords:[]},e.set.id)})),e)}),n=[],r=this.storage.getCache();for(const t in r){const{set:a}=r[t];a.title.toLowerCase().includes(e.toLowerCase())&&!s.sets.find((e=>e.set.id===a.id))&&n.push({_:"stickerSetCovered",set:a,cover:null})}return s.sets.concat(n)}))}getAllStickers(){return this.apiManager.invokeApiHashable({method:"messages.getAllStickers",processResult:this.processAllStickersResult})}getEmojiStickers(){return this.apiManager.invokeApiHashable({method:"messages.getEmojiStickers",processResult:this.processAllStickersResult})}preloadStickerSets(){return this.getAllStickers().then((e=>Promise.all(e.sets.map((e=>this.getStickerSet(e,{useCache:!0}))))))}getStickersByEmoticon(e,t=!0){return e=(0,Pt.Z)(e),this.getStickersByEmoticonsPromises[e]?this.getStickersByEmoticonsPromises[e]:this.getStickersByEmoticonsPromises[e]=Promise.all([this.apiManager.invokeApiHashable({method:"messages.getStickers",params:{emoticon:e},processResult:e=>e}),t?this.preloadStickerSets():[],t?this.getRecentStickers():void 0]).then((([t,a,s])=>{const n=t.stickers.map((e=>this.appDocsManager.saveDoc(e))),r=[],o=[],p=t=>{for(const a of t)if((0,Pt.Z)(a.emoticon).includes(e))for(const e of a.documents){const t=this.appDocsManager.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);const d=[...new Set(r.concat(o,n))];return(0,ne.Z)(d,((e,t,a)=>{(3===e.sticker&&!i().IS_WEBM_SUPPORTED||!this.rootScope.premium&&(0,Wt.Z)(e))&&a.splice(t,1)})),d}))}clearRecentStickers(){return this.recentStickers&&(this.recentStickers.length=0,this.onStickersUpdated("recent",!1)),this.apiManager.invokeApi("messages.clearRecentStickers")}}var wa=a(467),ka=a(8493);class Aa extends G{constructor(){super(...arguments),this.clear=(e=!1)=>{if(e)this.users={},this.usernames={};else for(const e in this.users){if(!e)continue;const t=e.toPeerId();if(!this.peersStorage.isPeerNeeded(t)){const t=this.users[e];this.modifyUsernamesCache(t,!1),this.storage.delete(e),delete this.users[e]}}this.getTopPeersPromises={},this.contactsIndex=this.createSearchIndex(),this.contactsFillPromise=void 0,this.contactsList=new Set,this.updatedContactsList=!1},this.updateUsersStatuses=()=>{const e=(0,te.Z)(!0);for(const t in this.users){const a=this.users[t];this.updateUserStatus(a,e)}}}after(){return this.clear(!0),setInterval(this.updateUsersStatuses,6e4),this.rootScope.addEventListener("state_synchronized",this.updateUsersStatuses),this.apiUpdatesManager.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-=this.timeManager.getServerTimeOffset()),"was_online"in a.status&&(a.status.was_online-=this.timeManager.getServerTimeOffset())),this.rootScope.dispatchEvent("user_update",t),this.setUserToStateIfNeeded(a))},updateUserName:e=>{const t=e.user_id,a=this.users[t];a&&(this.forceUserOnline(t),this.saveApiUser(Object.assign(Object.assign({},a),{first_name:e.first_name,last_name:e.last_name,username:void 0,usernames:e.usernames}),!0))}}),this.rootScope.addEventListener("language_change",(e=>{const t=this.getSelf().id;this.contactsIndex.indexObject(t,this.getUserSearchText(t))})),Promise.all([this.appStateManager.getState(),this.appStoragesManager.loadStorage("users")]).then((([e,{results:t,storage:a}])=>{this.storage=a,this.saveApiUsers(t);for(let a=0,s=t.length;a{if(!this.appPeersManager.isUser(e))return;const t=e.toUserId();this.storage.getFromCache(t)||this.storage.set({[t]:this.getUser(t)})})),this.peersStorage.addEventListener("peerUnneeded",(e=>{if(!this.appPeersManager.isUser(e))return;const t=e.toUserId();this.storage.getFromCache(t)&&this.storage.delete(t)}))}))}get userId(){return this.rootScope.myId.toUserId()}onContactsModified(e){e&&this.appStateManager.pushToState("contactsListCachedTime",(0,te.Z)(!0))}pushRecentSearch(e){return this.appStateManager.getState().then((t=>{const a=t.recentSearch||[];if(a[0]!==e){(0,M.Z)(a,e),a.unshift(e),a.length>20&&(a.length=20),this.appStateManager.pushToState("recentSearch",a);for(const e of a)this.peersStorage.requestPeer(e,"recentSearch")}}))}clearRecentSearch(){return this.appStateManager.getState().then((e=>{const t=e.recentSearch||[];for(const e of t)this.peersStorage.releasePeer(e,"recentSearch");t.length=0,this.appStateManager.pushToState("recentSearch",t)}))}fillContacts(){var e;if(this.contactsFillPromise&&this.updatedContactsList)return{cached:this.contactsFillPromise.isFulfilled,promise:this.contactsFillPromise};this.updatedContactsList=!0;const t=(0,v.Z)();return this.apiManager.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(!0),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){"@"===e[0]&&(e=e.slice(1)),e=e.toLowerCase();const t=this.usernames[e];return t?this.appPeersManager.getPeer(t):this.apiManager.invokeApiSingleProcess({method:"contacts.resolveUsername",params:{username:e},processResult:e=>this.processResolvedPeer(e)})}processResolvedPeer(e){return this.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.appPeersManager.getPeer((0,le.Z)(e.peer))}resolvePhone(e){return this.apiManager.invokeApi("contacts.resolvePhone",{phone:e}).then((e=>this.processResolvedPeer(e)))}pushContact(e){this.contactsList.add(e),this.contactsIndex.indexObject(e,this.getUserSearchText(e)),this.peersStorage.requestPeer(e.toPeerId(),"contact")}popContact(e){this.contactsList.delete(e),this.contactsIndex.indexObject(e,""),this.peersStorage.releasePeer(e.toPeerId(),"contact")}getUserSearchText(e){const t=this.users[e];return t?[t.first_name,t.last_name,t.phone,...(0,Jt.Z)(t),t.pFlags.self?"Saved Messages":""].filter(Boolean).join(" "):""}getContacts(e,t=!1,a="name"){return this.fillContacts().promise.then((s=>{let n=[...s];if(e){const t=this.contactsIndex.search(e);n=[...n].filter((e=>t.has(e)))}"name"===a?n.sort(((e,t)=>{const a=(this.users[e]||{}).sortName||"",s=(this.users[t]||{}).sortName||"";return a.localeCompare(s)})):"online"===a&&n.sort(((e,t)=>{const a=this.getUserStatusForSort(this.getUser(e).status);return this.getUserStatusForSort(this.getUser(t).status)-a}));const i=this.userId;return(0,M.Z)(n,i),t&&this.testSelfSearch(e)&&n.unshift(i),n}))}getContactsPeerIds(e,t,a,s){return this.getContacts(e,t,a).then((e=>{const t=e.map((e=>e.toPeerId(!1)));return s?t.slice(0,s):t}))}toggleBlock(e,t){return this.apiManager.invokeApiSingle(t?"contacts.block":"contacts.unblock",{id:this.appPeersManager.getInputPeerById(e)}).then((a=>(a&&this.apiUpdatesManager.processLocalUpdate({_:"updatePeerBlocked",peer_id:this.appPeersManager.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 ae.Z({clearBadChars:!0,ignoreCase:!0,latinize:!0,includeTag:!0})}saveApiUsers(e,t){e.saved||(e.saved=!0,e.forEach((e=>this.saveApiUser(e,t))))}modifyUsernamesCache(e,t){const a=(0,Jt.Z)(e);if(!a.length)return;const s=a.map((e=>function(e){return e&&e.toLowerCase()||""}(e)));t?s.forEach((t=>{this.usernames[t]=e.id.toPeerId("user"!==e._)})):s.forEach((e=>{delete this.usernames[e]}))}setUsernameToCache(e,t){return!(t&&t.username===e.username&&(0,Y.Z)(t.usernames,e.usernames)||(this.modifyUsernamesCache(t,!1),this.modifyUsernamesCache(e,!0),0))}saveApiUser(e,t){var a,s,n,i;if(!e||"userEmpty"===e._)return;const r=e.id,o=this.users[r];if(null!==(a=e.pFlags)&&void 0!==a||(e.pFlags={}),e.pFlags.min&&void 0!==o)return;const p=this.setUsernameToCache(e,o);if(o&&void 0!==o.sortName&&o.first_name===e.first_name&&o.last_name===e.last_name)e.sortName=o.sortName;else{const t=e.first_name+(e.last_name?" "+e.last_name:"");e.sortName=e.pFlags.deleted?"":(0,wa.ZP)(t,!1)}if(e.status&&(e.status.expires&&(e.status.expires-=this.timeManager.getServerTimeOffset()),e.status.was_online&&(e.status.was_online-=this.timeManager.getServerTimeOffset())),"userProfilePhotoEmpty"===(null===(s=e.photo)||void 0===s?void 0:s._)&&delete e.photo,void 0===o)this.users[r]=e;else{const t=e.first_name!==o.first_name||e.last_name!==o.last_name||p,a=(null===(n=o.photo)||void 0===n?void 0:n.photo_id)!==(null===(i=e.photo)||void 0===i?void 0:i.photo_id),s=o.pFlags.premium!==e.pFlags.premium||o.pFlags.verified!==e.pFlags.verified||o.pFlags.scam!==e.pFlags.scam||o.pFlags.fake!==e.pFlags.fake,d=!!o.pFlags.contact,f=!!e.pFlags.contact;re(o,e),this.rootScope.dispatchEvent("user_update",r),d!==f&&this.onContactUpdated(r,f,d),a&&this.rootScope.dispatchEvent("avatar_update",{peerId:e.id.toPeerId()}),(t||s)&&this.rootScope.dispatchEvent("peer_title_edit",{peerId:e.id.toPeerId()})}this.checkPremium(e,o),this.setUserToStateIfNeeded(e)}checkPremium(e,t){if(e.pFlags.self){const a=!!e.pFlags.premium;this.rootScope.premium!==a&&this.rootScope.dispatchEvent("premium_toggle_private",{isNew:!t,isPremium:a})}}setUserToStateIfNeeded(e){this.peersStorage.isPeerNeeded(e.id.toPeerId())&&this.storage.set({[e.id]:e})}isUserOnlineVisible(e){return this.getUserStatusForSort(e)>3}getUserStatusForSort(e){if("object"!=typeof e){const t=this.getUser(e);e=null==t?void 0:t.status}if(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(0,fe.Z)(e)?e:this.users[e]}getUserStatus(e){return this.isRegularUser(e)&&!this.users[e].pFlags.self&&this.users[e].status}getUserPhone(e){return t=this,a=void 0,n=function*(){const t=this.getUser(e);if(!(null==t?void 0:t.phone))return;const a=yield this.apiManager.getAppConfig();return{phone:t.phone,isAnonymous:a.fragment_prefixes.some((e=>t.phone.startsWith(e)))}},new((s=void 0)||(s=Promise))((function(e,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(r,o)}p((n=n.apply(t,a||[])).next())}));var t,a,s,n}getSelf(){return this.getUser(this.userId)}isBot(e){return this.users[e]&&!!this.users[e].pFlags.bot}isAttachMenuBot(e){return this.isBot(e)&&!!this.users[e].pFlags.bot_attach_menu}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!==this.userId}hasUser(e,t){const a=this.users[e];return(0,fe.Z)(a)&&(t||!a.pFlags.min)}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){return{_:"inputPeerUser",user_id:e,access_hash:this.getUser(e).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=(0,te.Z)(!0)){e.status&&"userStatusOnline"===e.status._&&e.status.expires=60)return}else if(this.apiUpdatesManager.updatesState.syncLoading)return;const s=this.getUser(e);!(null==s?void 0:s.status)||"userStatusOnline"===s.status._||"userStatusEmpty"===s.status._||s.pFlags.support||s.pFlags.deleted||(s.status={_:"userStatusOnline",expires:a+60},this.rootScope.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),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]=this.appStateManager.getState().then((t=>{const a=t.topPeersCache[e];return a&&a.cachedTime+864e5>Date.now()&&a.peers?a.peers:this.apiManager.invokeApi("contacts.getTopPeers",{[e]:!0,offset:0,limit:15,hash:"0"}).then((a=>{let s=[];return"contacts.topPeers"===a._&&(this.saveApiUsers(a.users),this.appChatsManager.saveApiChats(a.chats),a.categories.length&&(s=a.categories[0].peers.map((e=>{const t=(0,le.Z)(e.peer);return this.peersStorage.requestPeer(t,"topPeer"),{id:t,rating:e.rating}})))),t.topPeersCache[e]={peers:s,cachedTime:Date.now()},this.appStateManager.pushToState("topPeersCache",t.topPeersCache),s}))}))}getBlocked(e=0,t=0){return this.apiManager.invokeApiSingle("contacts.getBlocked",{offset:e,limit:t}).then((e=>(this.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),{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 this.apiManager.invokeApi("contacts.getLocated",{geo_point:i,background:s}).then((e=>(this.apiUpdatesManager.processUpdateMessage(e),e)))}searchContacts(e,t=20){const a=(0,Lt.Z)(e);if(a.length&&a[0].length===e.trim().length&&"messageEntityUrl"===a[0]._)try{const t=new URL(je(e).url).pathname.slice(1);t&&(e=t)}catch(e){}return this.apiManager.invokeApiCacheable("contacts.search",{q:e,limit:t},{cacheSeconds:60}).then((e=>(this.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),{my_results:(0,we.Z)(e.my_results.map((e=>(0,le.Z)(e)))),results:e.results.map((e=>(0,le.Z)(e)))})))}onContactUpdated(e,t,a=this.isContact(e)){t!==a&&(t?this.pushContact(e):this.popContact(e),this.onContactsModified(),this.rootScope.dispatchEvent("contacts_update",e))}updateUsername(e){return this.apiManager.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:(0,te.Z)(!0)}:{_:"userStatusOnline",expires:(0,te.Z)(!0)+50};a.status=s,this.rootScope.dispatchEvent("user_update",e),this.setUserToStateIfNeeded(a)}}updateMyOnlineStatus(e){return this.setUserStatus(this.getSelf().id,e),this.apiManager.invokeApiSingle("account.updateStatus",{offline:e})}addContact(e,t,a,s,n){return this.apiManager.invokeApi("contacts.addContact",{id:this.getUserInput(e),first_name:t,last_name:a,phone:s,add_phone_privacy_exception:n}).then((t=>{this.apiUpdatesManager.processUpdateMessage(t,{override:!0}),this.onContactUpdated(e,!0)}))}deleteContacts(e){return this.apiManager.invokeApi("contacts.deleteContacts",{id:e.map((e=>this.getUserInput(e)))}).then((t=>{this.apiUpdatesManager.processUpdateMessage(t,{override:!0}),e.forEach((e=>{this.onContactUpdated(e,!1)}))}))}checkUsername(e){return this.apiManager.invokeApi("account.checkUsername",{username:e})}toggleUsername(e,t){return this.apiManager.invokeApi("account.toggleUsername",{username:e,active:t})}reorderUsernames(e){return this.apiManager.invokeApi("account.reorderUsernames",{order:e})}canSendToUser(e){return(0,ka.Z)(this.getUser(e))}}const Da=new Set(["photo","video","gif","document"]);class Ua extends G{constructor(){super(...arguments),this.webpages={},this.pendingWebPages={}}after(){this.apiUpdatesManager.addMultipleEventsListeners({updateWebPage:e=>{this.saveWebPage(e.webpage)}})}saveWebPage(e,t,a){var s,n;if("webPageNotModified"===e._||"webPageEmpty"===e._)return;const{id:i}=e,r=this.webpages[i],o=r&&r._===e._&&r.hash==r.hash;if("webPage"===e._){"photo"===(null===(s=e.photo)||void 0===s?void 0:s._)?e.photo=this.appPhotosManager.savePhoto(e.photo,a):delete e.photo,"document"===(null===(n=e.document)||void 0===n?void 0:n._)?e.document=this.appDocsManager.saveDoc(e.document,a):("document"===e.type&&delete e.type,delete e.document);const t=e.site_name,i=e.title||e.author||t||"";t&&i===t&&delete e.site_name,Da.has(e.type)||e.description||!e.photo||(e.type="photo")}let p=this.pendingWebPages[i];if(t&&(p||(p=this.pendingWebPages[i]=new Set),p.add(t)),void 0===r?this.webpages[i]=e:re(r,e),!t&&void 0!==p&&o){const e=[];p.forEach((t=>{const[a,s,n]=t.split("_");e.push({peerId:a.toPeerId(),mid:+s,isScheduled:!!n})})),this.rootScope.dispatchEvent("webpage_updated",{id:i,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])}getCachedWebPage(e){return this.webpages[e]}getWebPage(e){return this.apiManager.invokeApiHashable({method:"messages.getWebPage",processResult:e=>this.saveWebPage(e),params:{url:e}})}}var Ta=a(5936),Ea=a(3019);function Fa(e){return(0,Ea.Z)(e,"readAsArrayBuffer")}var Ra=a(1243),xa=a(7086);function Ba(e){return encodeURIComponent(e).replace(/['()]/g,escape).replace(/\*/g,"%2A")}class Va{constructor(e,t){this.serviceMessagePort=e,this.downloadId=t,this.serviceMessagePort=zs()}write(e,t){return a=this,s=void 0,i=function*(){return this.serviceMessagePort.invoke("downloadChunk",{id:this.downloadId,chunk:e})},new((n=void 0)||(n=Promise))((function(e,t){function r(e){try{p(i.next(e))}catch(e){t(e)}}function o(e){try{p(i.throw(e))}catch(e){t(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof n?a:new n((function(e){e(a)}))).then(r,o)}p((i=i.apply(a,s||[])).next())}));var a,s,n,i}finalize(e){return this.serviceMessagePort.invoke("downloadFinalize",this.downloadId).then((()=>{}))}}class Oa{getFile(e){return Promise.reject((0,X.Z)("NO_ENTRY_FOUND"))}prepareWriting({fileName:e,downloadId:t,size:a}){const s=Object.assign({"Content-Type":"application/octet-stream; charset=utf-8","Content-Disposition":"attachment; filename*=UTF-8''"+Ba(e)},a?{"Content-Length":a}:{}),n=zs(),i=n.invoke("download",{headers:s,id:t}),r=(0,v.Z)();return r.cancel=()=>{r.reject((0,X.Z)("DOWNLOAD_CANCELED"))},r.catch((()=>{zs().invoke("downloadCancel",t)})),i.then(r.resolve,r.reject),{deferred:r,getWriter:()=>new Va(n,t)}}}var La=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 Na=131072,Za=new Set(["DOWNLOAD_CANCELED","UPLOAD_CANCELED","UNKNOWN","NO_NEW_CONTEXT"]);class ja extends G{constructor(){super(...arguments),this.cacheStorage=new Ta.Z("cachedFiles"),this.downloadStorage=new Oa,this.downloadPromises={},this.uploadPromises={},this.downloadPulls={},this.downloadActives={},this.refreshReferencePromises={},this.log=(0,I.kg)("AFM",I.v9.Error|I.v9.Log),this.tempId=0,this.queueId=0,this.debug=b.Z.debug,this.maxUploadParts=4e3,this.maxDownloadParts=8e3,this.uncompressTGS=(e,t)=>this.cryptoWorker.invokeCrypto("gzipUncompress",e.slice().buffer,!1),this.uncompressTGV=(e,t)=>{const a=e.slice().buffer;return i().IS_FIREFOX?this.cryptoWorker.invokeCrypto("gzipUncompress",a,!0).then((e=>function(e){const t=e.indexOf("/,` width="${n}" height="${i}">`).replace(/[^\x00-\x7F]/g,"")}(e))).then((e=>(new TextEncoder).encode(e))):this.cryptoWorker.invokeCrypto("gzipUncompress",a,!1)},this.convertWebp=(e,t)=>f.Z.getInstance().invoke("convertWebp",{fileName:t,bytes:e}),this.convertOpus=(e,t)=>f.Z.getInstance().invoke("convertOpus",{fileName:t,bytes:e})}after(){setInterval((()=>{for(const e in this.refreshReferencePromises){const{deferred:t}=this.refreshReferencePromises[e];(t.isFulfilled||t.isRejected)&&delete this.refreshReferencePromises[e]}}),18e5),this.rootScope.addEventListener("config",(e=>{this.webFileDcId=e.webfile_dc_id})),this.rootScope.addEventListener("app_config",(e=>{this.maxUploadParts=this.rootScope.premium?e.upload_max_fileparts_premium:e.upload_max_fileparts_default,this.maxDownloadParts=e.upload_max_fileparts_premium}))}downloadRequest(e,t,a,s,n=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:n,cb:a,deferred:{resolve:e,reject:r},activeDelta:s})}));return setTimeout((()=>{this.downloadCheck(e)}),0),r}downloadCheck(e){const t=this.downloadPulls[e],a=this.rootScope.premium?224:36;if(this.downloadActives[e]>=a||!(null==t?void 0:t.length))return!1;const s=(0,Pe.Z)(t,(e=>0===e.queueId))||(0,Pe.Z)(t,(e=>e.queueId===this.queueId))||t.shift(),n=s.activeDelta||1;this.downloadActives[e]+=n;const i=s.cb();i.then((()=>{this.downloadActives[e]-=n,this.downloadCheck(e)}),(t=>{(null==t?void 0:t.type)&&Za.has(t.type)||this.log.error("downloadCheck error:",t),this.downloadActives[e]-=n,this.downloadCheck(e)})).finally((()=>{i.then(s.deferred.resolve,s.deferred.reject)}))}setQueueId(e){this.queueId=e}getFileStorage(){return this.cacheStorage}cancelDownload(e){const t=[this.downloadPromises[e],this.uploadPromises[e]].filter(Boolean);let a=!1;for(let e=0,s=t.length;eLa(this,void 0,void 0,(function*(){if(null==r||r(),"url"in t){const e=t.url;if(this.isLocalWebFile(e))return fetch(e).then((e=>e.arrayBuffer())).then((t=>{const a=e.split(".").pop(),s=mt[a]||"application/octet-stream";return{_:"upload.webFile",size:t.byteLength,mime_type:s,file_type:{_:"storage.fileUnknown"},mtime:0,bytes:new Uint8Array(t)}}))}return this.apiManager.invokeApi("upload.getWebFile",{location:t,offset:a,limit:s},{dcId:e,fileDownload:!0})}))),this.getDelta(s),i)}requestFilePart(e,t,a,s,n=0,i=0,r){return this.downloadRequest(e,n,(()=>La(this,void 0,void 0,(function*(){null==r||r();const n=()=>La(this,void 0,void 0,(function*(){var i;null==r||r();const o=null===(i=t.file_reference)||void 0===i?void 0:i.slice();return this.apiManager.invokeApi("upload.getFile",{location:t,offset:a,limit:s},{dcId:e,fileDownload:!0}).catch((e=>{if(null==r||r(),"FILE_REFERENCE_EXPIRED"===e.type)return this.refreshReference(t,o).then(n);throw e}))}));(0,ue.Z)(t);const i=t.file_reference;if(i&&!t.checkedReference){t.checkedReference=!0;const e=T(i);if(this.refreshReferencePromises[e])return this.refreshReference(t,i).then(n)}return n()}))),this.getDelta(s),i)}getDelta(e){return e/Na}getLimitPart(e,t){if(!e)return 524288;let a=Na;const s=t?this.maxUploadParts:this.maxDownloadParts,n=t?524288:1048576;for(;e/a>s&&a{a===T(t)&&e.reject((0,X.Z)("REFERENCE_IS_NOT_REFRESHED")),e.resolve(t)}),e.reject)}return s.deferred.then((t=>{e.file_reference=t}))}isDownloading(e){return!!this.downloadPromises[e]}getDownload(e){return this.downloadPromises[e]}getUpload(e){return this.uploadPromises[e]}getConvertMethod(e){let t;return"application/x-tgwallpattern"===e?(t=this.uncompressTGV,e="image/svg+xml"):"image/webp"!==e||i().IS_WEBP_SUPPORTED?"application/x-tgsticker"===e?(t=this.uncompressTGS,e="application/json"):"audio/ogg"!==e||i().IS_OPUS_SUPPORTED||(t=this.convertOpus,e="audio/wav"):(t=this.convertWebp,e="image/png"),{mimeType:e,process:t}}allocateDeferredPromises(e,t,a){const s=[];let n,i=e,r=Promise.resolve();do{n=(0,v.Z)(),s.push({offset:i,writePromise:r,writeDeferred:n}),r=n,i+=a}while(i{if(!(null==e?void 0:e.error))for(const a of S)e&&e!==a||(a.error=t,a.deferred.reject(t))},y="inputWebFileLocation"===i._,_=y&&this.isLocalWebFile(i.url),v=this.tempId++,P=_?s:e.limitPart||this.getLimitPart(s,!1);let b,M,I=m.getFile.bind(m);const S=[],C=s||P,w=(e,t)=>{const{deferred:a}=e,s=u.bind(null,e);a.cancel=()=>a.reject((0,X.Z)("DOWNLOAD_CANCELED")),a.catch((t=>{var a,n;s(t),null===(n=null===(a=e.writer)||void 0===a?void 0:a.truncate)||void 0===n||n.call(a)})).finally((()=>{this.downloadPromises[t]===a&&delete this.downloadPromises[t],delete e.writer})),this.downloadPromises[t]=a,S.push(e)};if(m&&(!g||C<=o.Iw)&&(b=m.prepareWriting(l,C,e.mimeType),w(b,l)),g){let t=e.fileName;if(!t){t=l;const a=gt[e.mimeType];a&&(t+="."+a)}M=g.prepareWriting({fileName:t,downloadId:r,size:C}),w(M,c),b&&M.deferred.catch((e=>b.deferred.reject(e)))}h=null!==(a=null==M?void 0:M.deferred)&&void 0!==a?a:b.deferred,g&&f&&(I=g.getFile.bind(g)),I(l).then((e=>La(this,void 0,void 0,(function*(){if(k(),M){const t=M.writer=M.getWriter();k();const a=yield function(e){return Fa(e).then((e=>new Uint8Array(e)))}(e);k(),yield t.write(a),k(),M.deferred.resolve(yield t.finalize())}b&&b.deferred.resolve(e)})))).catch((t=>La(this,void 0,void 0,(function*(){if(e.onlyCache)return void u(null,t);S.forEach((e=>{e.writer=e.getWriter()}));const a=(y?this.requestWebFilePart:this.requestFilePart).bind(this);y&&void 0===this.webFileDcId&&!_&&(yield this.apiManager.getConfig(),k());const r=this.allocateDeferredPromises(0,s,P),p={done:0,offset:0,total:s,fileName:c},d=()=>{try{k(),p.done=g,this.rootScope.dispatchEvent("download_progress",p)}catch(e){}},m=(0,aa.Z)(d,50,!0);let g=0;const h=()=>La(this,void 0,void 0,(function*(){const{offset:t,writePromise:p,writeDeferred:y}=r.shift();try{k();performance.now();const u=yield a(n,i,t,P,v,e.queueId,k),_=(performance.now(),u.bytes);r.length&&h();const b=_.byteLength;this.debug&&this.log("downloadFile requestFilePart result:",c,u);const M=t+P>=s||!b;if(b){g+=b,M?d():m();performance.now();yield p,k(),performance.now(),performance.now(),yield Promise.all(S.map((({writer:e})=>null==e?void 0:e.write(_,t)))),k()}if(M&&(!s||g{var t;return null===(t=null==e?void 0:e.trim)||void 0===t?void 0:t.call(e,g)})),M&&f){const e=S.filter((({writer:e})=>(null==e?void 0:e.getParts)&&e.replaceParts)).map((({writer:e})=>La(this,void 0,void 0,(function*(){const t=e.getParts(),a=yield f(t,l);e.replaceParts(a)}))));yield Promise.all(e),k()}if(y.resolve(),M){const e=g<=o.Iw;S.forEach((t=>{const{deferred:a,writer:s}=t;if(a.isFulfilled||a.isRejected||!s)return;const n=s.finalize(e);a.resolve(n)}))}}catch(e){u(null,e)}}));for(let e=0,t=Math.min(1/0,r.length);e{if(S.reduce(((e,t)=>e+ +!!t.error),0)===S.length)throw S[0].error};return h}downloadMedia(e){let{media:t,thumb:a}=e;const s="photo"===t._;if(s&&!a)return Promise.reject("preloadPhoto photoEmpty!");const n="document"===t._;n?t=this.appDocsManager.getDoc(t.id):s&&(t=this.appPhotosManager.getPhoto(t.id));const{fileName:i,downloadOptions:r}=(0,Ra.Z)(e);let o=this.getDownload(i);return o||(o=this.download(r),n&&!a&&(this.rootScope.dispatchEvent("document_downloading",t.id),o.then((()=>{this.rootScope.dispatchEvent("document_downloaded",t.id)})).catch(jt.Z))),o}downloadMediaURL(e){const{media:t,thumb:a}=e;let s=this.thumbsStorage.getCacheContext(t,null==a?void 0:a.type);return(!a||s.downloaded>=("size"in a?a.size:0))&&s.url?Promise.resolve(s.url):this.downloadMedia(e).then((e=>{if(!s.downloaded||s.downloaded=10485760,n=this.getLimitPart(a,!0),i=this.getDelta(n),r=Math.ceil(a/n),o=(0,Te.a)(),p={_:s?"inputFileBig":"inputFile",id:o,parts:r,name:t,md5_checksum:""},d=(0,v.Z)();if(r>this.maxUploadParts)return d.reject((0,X.Z)("FILE_TOO_BIG")),d;let f=!1,c=!1,l=e=>{"UPLOAD_CANCELED"!==(null==e?void 0:e.type)&&this.log.error("Up Error",e),d.reject(e),f=!0,l=jt.Z};const m=s?"upload.saveBigFilePart":"upload.saveFilePart",g=this.tempId++,h=this,u=function*(){let u=0,y=0;for(let v=0;vLa(this,void 0,void 0,(function*(){_();const i=e.slice(v,v+n),g=yield Fa(i);return _(),h.debug&&h.log("Upload file part, isBig:",s,P,g.byteLength,new Uint8Array(g).length,new Uint8Array(g).slice().length),h.apiManager.invokeApi(m,{file_id:o,file_part:P,file_total_parts:r,bytes:g},{fileUpload:!0}).then((()=>{if(f)return;++y;const e={done:y*n,offset:v,total:a,fileName:t};d.notify(e),y>=r&&(d.resolve(p),c=!0)}),l)}))),i).catch(l)}}(),y=()=>{if(f)return;const e=u.next();e.done||f||e.value.then(y)};for(let e=0,t=Math.min(1/0,r);e{if(f)throw(0,X.Z)("UPLOAD_CANCELED")};return d.cancel=()=>{f||c||(f=!0,l((0,X.Z)("UPLOAD_CANCELED")))},d.notify=e=>{this.rootScope.dispatchEvent("download_progress",e)},d.finally((()=>{this.uploadPromises[t]===d&&delete this.uploadPromises[t]})),this.uploadPromises[t]=d}}var qa=a(7487),Ga=a(6666),Ha=a(3306);class Wa extends G{constructor(){super(),this.hashes={},this.apiPromisesSingleProcess={},this.apiPromisesSingle={},this.apiPromisesCacheable={},this.afterMessageIdTemp=0}setUser(e){return this.setUserAuth(e.id)}invokeApiAfter(e,t={},a={}){let s=a;return s.prepareTempMessageId=""+ ++this.afterMessageIdTemp,s=Object.assign({},a),a.messageId=s.prepareTempMessageId,this.invokeApi(e,t,s)}invokeApiHashable(e){var t,a;null!==(t=e.params)&&void 0!==t||(e.params={}),null!==(a=e.options)&&void 0!==a||(e.options={});const{params:s,options:n,method:i,overwrite:r}=e,o=JSON.stringify(s);let p;return this.hashes[i]&&(p=this.hashes[i][o],p&&(r?(delete this.hashes[i][o],p=void 0):s.hash=p.hash)),this.invokeApiSingleProcess({method:i,processResult:t=>{if(t._.includes("NotModified"))return p.result;if(t.hash){const e=t.hash;this.hashes[i]||(this.hashes[i]={}),p=this.hashes[i][o]={hash:e,result:t}}if(e.processResult){const a=e.processResult(t);return p?p.result=a:a}return t},params:s,options:n})}invokeApiSingle(e,t={},a={}){const s=e+"-"+JSON.stringify(t),n=this.apiPromisesSingle;return n[s]?n[s]:n[s]=this.invokeApi(e,t,a).finally((()=>{delete n[s]}))}invokeApiSingleProcess(e){var t,a,s;null!==(t=e.params)&&void 0!==t||(e.params={}),null!==(a=e.options)&&void 0!==a||(e.options={});const{method:n,processResult:i,processError:r,params:o,options:p}=e,d=this.apiPromisesSingleProcess,f=p.cacheKey||JSON.stringify(o),c=null!==(s=d[n])&&void 0!==s?s:d[n]=new Map,l=c.get(f);if(l)return l;const m=()=>{const e=c.get(f);return e===h?void 0:e},g=this.invokeApi(n,o,p).then((e=>m()||i(e)),(e=>{const t=m();if(t)return t;if(!r)throw e;return r(e)})),h=g.finally((()=>{c.get(f)===h&&(c.delete(f),c.size||delete d[n])}));return c.set(f,h),h}invokeApiCacheable(e,t={},a={}){var s;const n=null!==(s=this.apiPromisesCacheable[e])&&void 0!==s?s:this.apiPromisesCacheable[e]={},i=JSON.stringify(t),r=n[i];if(r&&(!a.override||!r.fulfilled))return r.promise;let o;a.override&&(r&&r.timeout&&(clearTimeout(r.timeout),delete r.timeout),delete a.override),a.cacheSeconds&&(o=E.Z.setTimeout((()=>{delete n[i]}),1e3*a.cacheSeconds),delete a.cacheSeconds);const p=this.invokeApi(e,t,a);return n[i]={timestamp:Date.now(),fulfilled:!1,timeout:o,promise:p,params:t},p}clearCache(e,t){const a=this.apiPromisesCacheable[e];if(a)for(const e in a){const s=a[e];try{t(s.params)&&(s.timeout&&clearTimeout(s.timeout),delete a[e])}catch(e){}}}getConfig(e){return this.config&&!e?this.config:this.invokeApiSingleProcess({method:"help.getConfig",params:{},processResult:e=>(this.config=e,this.rootScope.dispatchEvent("config",e),e),options:{overwrite:e}})}getAppConfig(e){return this.appConfig&&!e?this.appConfig:this.invokeApiSingleProcess({method:"help.getAppConfig",params:{},processResult:e=>{var t;return this.appConfig=e,(0,ia.Ki)(null!==(t=e.ignore_restriction_reasons)&&void 0!==t?t:[]),this.rootScope.dispatchEvent("app_config",e),e},options:{overwrite:e}})}getLimit(e,t){return(0,q.Z)(this.getAppConfig(),(a=>{null!=t||(t=this.rootScope.premium);const s={pin:["dialogs_pinned_limit_default","dialogs_pinned_limit_premium"],folderPin:["dialogs_folder_pinned_limit_default","dialogs_folder_pinned_limit_premium"],folders:["dialog_filters_limit_default","dialog_filters_limit_premium"],favedStickers:["stickers_faved_limit_default","stickers_faved_limit_premium"],reactions:["reactions_user_max_default","reactions_user_max_premium"],bio:["about_length_limit_default","about_length_limit_premium"],topicPin:"topics_pinned_limit",caption:["caption_length_limit_default","caption_length_limit_premium"]}[e];return a[Array.isArray(s)?s[t?1:0]:s]}))}}var za=a(8453),Ka=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 Ja extends Wa{constructor(){super(),this.log=(0,I.kg)("API"),this.cachedNetworkers={},this.cachedExportPromise={},this.gettingNetworkers={},this.baseDcId=0,this.afterMessageTempIds={},this.transportType=b.Z.transport,Z.addEventListener("transport",(e=>{this.changeTransportType(e)})),setInterval((()=>{this.getAppConfig(!0)}),997e4)}after(){this.apiUpdatesManager.addMultipleEventsListeners({updateConfig:()=>{this.getConfig(!0),this.getAppConfig(!0)}}),this.rootScope.addEventListener("user_auth",(()=>{this.config&&this.apiUpdatesManager.processLocalUpdate({_:"updateConfig"})})),this.rootScope.addEventListener("premium_toggle",(e=>{this.iterateNetworkers((({networker:t,connectionType:a,dcId:s,transportType:n})=>{if("client"===a||"websocket"!==n)return;const i=t.transport;if(i){if(i.connection){const t=V(s,a,e);i.changeUrl(t)}}else this.log.error("wow what, no transport?",t)}))}))}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 this.dcConfigurator.chooseServer(e,t,a,"client"===t,this.rootScope.premium)}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);this.changeNetworkerTransport(e.networker,a)}))}getBaseDcId(){return Ka(this,void 0,void 0,(function*(){if(this.baseDcId)return this.baseDcId;const e=yield qa.Z.get("dc");return this.baseDcId||(e?this.baseDcId=e:this.setBaseDcId(_.Z.baseDcId)),this.baseDcId}))}setUserAuth(e){return Ka(this,void 0,void 0,(function*(){if("string"!=typeof e&&"number"!=typeof e||(e={dcID:0,date:Date.now()/1e3|0,id:e.toPeerId(!1)}),this.rootScope.dispatchEvent("user_auth",e),!e.dcID){const t=yield this.getBaseDcId();e.dcID=t}qa.Z.set({user_auth:e})}))}setBaseDcId(e){const t=this.baseDcId;t&&this.getNetworker(t).then((e=>{this.setOnDrainIfNeeded(e)})),this.baseDcId=e,qa.Z.set({dc:this.baseDcId})}logOut(){return Ka(this,void 0,void 0,(function*(){if(this.loggingOut)return;this.loggingOut=!0;const e=[];for(let t=1;t<=5;t++)e.push("dc"+t+"_auth_key");const t=yield Promise.all(e.map((e=>qa.Z.get(e)))),a=[];for(let e=0;eKa(this,void 0,void 0,(function*(){this.baseDcId=void 0,yield(0,za.Z)(!1,!0),Ga.C.closeDatabases(),this.rootScope.dispatchEvent("logging_out")}));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",n=this.getTransportType(a);this.cachedNetworkers[n]||(this.cachedNetworkers[n]={client:{},download:{},upload:{}});const i=this.cachedNetworkers[n][a];e in i||(i[e]=[]);const r=i[e],o="client"===a||"https"===n?1:this.rootScope.premium?6:3;if(r.length>=o){let e=o-1,t=!1;for(;e>=0;--e)if(r[e].isOnline){t=!0;break}const a=r.splice(t?e:o-1,1)[0];return r.unshift(a),Promise.resolve(a)}let p=this.generateNetworkerGetKey(e,n,a);if(this.gettingNetworkers[p])return this.gettingNetworkers[p];const d=`dc${e}_auth_key`,f=`dc${e}_server_salt`;let c=this.chooseServer(e,a,n);return this.gettingNetworkers[p]=Promise.all([d,f].map((e=>qa.Z.get(e)))).then((([i,o])=>Ka(this,void 0,void 0,(function*(){let l,m;if(i&&512===i.length){o&&16===o.length||(o="AAAAAAAAAAAAAAAA");const a=(0,Ha.Z)(i),n=(yield s.Z.invokeCrypto("sha1",a)).slice(-8),r=(0,Ha.Z)(o);l=this.networkerFactory.getNetworker(e,a,n,r,t)}else try{const a=yield this.authorizer.auth(e);qa.Z.set({[d]:T(a.authKey),[f]:T(a.serverSalt)}),l=this.networkerFactory.getNetworker(e,a.authKey,a.authKeyId,a.serverSalt,t)}catch(e){m=e}const g=this.getTransportType(a);if(g!==n&&(p=this.generateNetworkerGetKey(e,g,a),c.destroy(),O.removeTransport(this.dcConfigurator.chosenServers,c),l&&(c=this.chooseServer(e,a,g)),this.log("transport has been changed during authorization from",n,"to",g)),delete this.gettingNetworkers[p],m)throw this.log("get networker error",m,m.stack),m;return this.changeNetworkerTransport(l,c),r.unshift(l),this.setOnDrainIfNeeded(l),l}))))}getNetworkerVoid(e){return this.getNetworker(e).then(jt.Z,jt.Z)}changeNetworkerTransport(e,t){const a=e.transport;a&&O.removeTransport(this.dcConfigurator.chosenServers,a),e.changeTransport(t)}onNetworkerDrain(e){this.log("networker drain",e.dcId),e.onDrain=void 0,this.changeNetworkerTransport(e),e.destroy(),this.networkerFactory.removeNetworker(e),O.removeTransport(this.cachedNetworkers,e)}setOnDrainIfNeeded(e){e.onDrain||(e.isFileNetworker?Promise.resolve(!0):this.getBaseDcId().then((t=>e.dcId!==t))).then((t=>{e.onDrain||t&&(e.onDrain=()=>this.onNetworkerDrain(e),e.setDrainTimeout())}))}setUpdatesProcessor(e){this.updatesProcessor=e,this.networkerFactory.setUpdatesProcessor(e)}invokeApi(e,t={},a={}){const s=(0,v.Z)();let n,i,{afterMessageId:r,prepareTempMessageId:o}=a;if(o&&s.then((()=>{delete this.afterMessageTempIds[o]})),d.GO){const n=Date.now(),r=E.Z.setInterval((()=>{i&&i.isStopped()||this.log.error("Request is still processing:",e,t,a,"time:",(Date.now()-n)/1e3)}),5e3);s.catch(jt.Z).finally((()=>{clearInterval(r)}))}const p=(new Error).stack||"empty stack",f=()=>{if(r){const e=this.afterMessageTempIds[r];e&&(a.afterMessageId=e.messageId)}const p=i.wrapApiCall(e,t,a);return o&&(this.afterMessageTempIds[o]={messageId:a.messageId,promise:s}),p.catch((s=>{var i;if("FILE_REFERENCE_EXPIRED"!==s.type&&this.log.error("Error",s.code,s.type,this.baseDcId,n,e,t),401===s.code&&this.baseDcId===n)throw"SESSION_PASSWORD_NEEDED"!==s.type&&(qa.Z.delete("dc"),qa.Z.delete("user_auth")),s;if(401===s.code&&this.baseDcId&&n!==this.baseDcId){if(void 0===this.cachedExportPromise[n]){const e=new Promise(((e,t)=>{this.invokeApi("auth.exportAuthorization",{dc_id:n},{noErrorBox:!0}).then((a=>{this.invokeApi("auth.importAuthorization",{id:a.id,bytes:a.bytes},{dcId:n,noErrorBox:!0}).then(e,t)}),t)}));this.cachedExportPromise[n]=e}return this.cachedExportPromise[n].then((()=>f()))}if(303!==s.code){if(400===s.code&&0===s.type.indexOf("FILE_MIGRATE")){const i=+s.type.match(/^(FILE_MIGRATE_)(\d+)/)[2];if(i!==n)return a.dcId=i,this.invokeApi(e,t,a);throw s}if(400===s.code&&"CONNECTION_NOT_INITED"===s.type)return this.networkerFactory.unsetConnectionInited(),f();if(a.rawError||420!==s.code){if(!a.rawError&&["MSG_WAIT_FAILED","MSG_WAIT_TIMEOUT"].includes(s.type)){const e=this.afterMessageTempIds[r];return r=void 0,delete a.afterMessageId,e?e.promise.then((()=>f())):f()}if(a.rawError||500!==s.code){if("UNKNOWN"===s.type||"MTPROTO_CLUSTER_INVALID"===s.type)return(0,P.Z)(1e3).then((()=>f()));throw s}{const e=Date.now();if(a.stopTime&&e>=a.stopTime)throw s;return a.waitTime=a.waitTime?Math.min(60,1.5*a.waitTime):1,(0,P.Z)(1e3*a.waitTime).then((()=>f()))}}{const e=+s.type.match(/^FLOOD_WAIT_(\d+)/)[1]||1;if(e>(null!==(i=a.floodMaxTimeout)&&void 0!==i?i:60)&&!a.prepareTempMessageId)throw s;return(0,P.Z)(1e3*e).then((()=>f()))}}{const i=+s.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_)(\d+)/)[2];if(i!==n)return a.dcId?a.dcId=i:this.setBaseDcId(i),this.invokeApi(e,t,a)}}))};let c;return c=(n=a.dcId||this.baseDcId)?this.getNetworker(n,a):this.getBaseDcId().then((e=>this.getNetworker(n=e,a))),c.then((e=>{i=e;const t=f();return i.attachPromise(s,a),t})).then(s.resolve).catch((t=>Ka(this,void 0,void 0,(function*(){if(t?(0,fe.Z)(t)||(t={message:t}):t={type:"ERROR_EMPTY"},(401===t.code&&"SESSION_REVOKED"===t.type||406===t.code&&"AUTH_KEY_DUPLICATED"===t.type)&&this.logOut(),a.ignoreErrors)throw t;throw 406===t.code&&(t.handled=!0),a.noErrorBox||(t.input=e,t.stack=p||t.originalError&&t.originalError.stack||t.stack||(new Error).stack,setTimeout((()=>{t.handled||(401===t.code&&this.logOut(),t.handled=!0)}),100)),t})))).catch(s.reject),s}}class $a{constructor(){this.neededPeers=new Map,this.singlePeerMap=new Map,this._constructor(!1)}after(){this.rootScope.addEventListener("user_auth",(()=>{this.requestPeer(this.appPeersManager.peerId,"self")}))}requestPeer(e,t){let a=this.neededPeers.get(e);a&&a.has(t)||(a||(a=new Set,this.neededPeers.set(e,a)),a.add(t),this.dispatchEvent("peerNeeded",e))}releasePeer(e,t){const a=this.neededPeers.get(e);a&&(a.delete(t),a.size||(this.neededPeers.delete(e),this.dispatchEvent("peerUnneeded",e)))}requestPeersForKey(e,t){Array.isArray(e)&&(e=new Set(e));let a=this.singlePeerMap.get(t);if(a){for(const s of a)e.has(s)||(this.releasePeer(s,t),a.delete(s));if(!a.size&&!e.size)return void this.singlePeerMap.delete(t)}if(e.size){a||(a=new Set,this.singlePeerMap.set(t,a));for(const s of e)a.has(s)||(this.requestPeer(s,t),a.add(s))}}isPeerNeeded(e){return this.neededPeers.has(e)}}Ae($a,[p.Z,G]);const Qa=$a,Ya=o.Pt;class Xa{constructor(){this.thumbsCache={}}getKey(e){var t;return e._+(null!==(t=e.id)&&void 0!==t?t:e.url)}getCacheContext(e,t=Ya){var a,s,n,i;const r=null!==(a=(n=this.thumbsCache)[i=this.getKey(e)])&&void 0!==a?a:n[i]={};return null!==(s=r[t])&&void 0!==s?s:r[t]={downloaded:0,url:"",type:t}}setCacheContextURL(e,t=Ya,a,s=0){const n=this.getCacheContext(e,t);return n.url=a,n.downloaded=s,n}deleteCacheContext(e,t=Ya){const a=this.thumbsCache[this.getKey(e)];a&&delete a[t]}}const es={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:-1182234929,predicate:"inputUserEmpty",params:[],type:"InputUser"},{id:-138301121,predicate:"inputUserSelf",params:[],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:-1771768449,predicate:"inputMediaEmpty",params:[],type:"InputMedia"},{id:505969924,predicate:"inputMediaUploadedPhoto",params:[{name:"flags",type:"#"},{name:"spoiler",type:"flags.2?true"},{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:"spoiler",type:"flags.1?true"},{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: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:1498486562,predicate:"peerUser",params:[{name:"user_id",type:"long"}],type:"Peer"},{id:918946202,predicate:"peerChat",params:[{name:"chat_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:1326562017,predicate:"userProfilePhotoEmpty",params:[],type:"UserProfilePhoto"},{id:-2100168954,predicate:"userProfilePhoto",params:[{name:"flags",type:"#"},{name:"has_video",type:"flags.0?true"},{name:"personal",type:"flags.2?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: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:"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:-908914376,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?ChatReactions"}],type:"ChatFull"},{id:-1070776313,predicate:"chatParticipant",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:"spoiler",type:"flags.3?true"},{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:-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:-712374074,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:"unread_reactions_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"},{name:"ttl_period",type:"flags.5?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: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:-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:-551616469,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?NotificationSound"}],type:"InputPeerNotifySettings"},{id:-1472527322,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:"ios_sound",type:"flags.3?NotificationSound"},{name:"android_sound",type:"flags.4?NotificationSound"},{name:"other_sound",type:"flags.5?NotificationSound"}],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: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:-120378643,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:"voice_messages_forbidden",type:"flags.20?true"},{name:"id",type:"long"},{name:"about",type:"flags.1?string"},{name:"settings",type:"PeerSettings"},{name:"personal_photo",type:"flags.21?Photo"},{name:"profile_photo",type:"flags.2?Photo"},{name:"fallback_photo",type:"flags.22?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"},{name:"bot_group_admin_rights",type:"flags.17?ChatAdminRights"},{name:"bot_broadcast_admin_rights",type:"flags.18?ChatAdminRights"},{name:"premium_gifts",type:"flags.19?Vector"}],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:-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:1694474197,predicate:"messages.chats",params:[{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: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:-1484486364,predicate:"updateUserName",params:[{name:"user_id",type:"long"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"usernames",type:"Vector"}],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:-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:-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: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:"this_port_only",type:"flags.5?true"},{name:"id",type:"int"},{name:"ip_address",type:"string"},{name:"port",type:"int"},{name:"secret",type:"flags.10?bytes"}],type:"DcOption"},{id:589653676,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:"force_try_ipv6",type:"flags.14?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"},{name:"reactions_default",type:"flags.15?Reaction"}],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: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:-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:-1476358952,predicate:"encryptedFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"size",type:"long"},{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:-182231723,predicate:"inputEncryptedFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputFileLocation"},{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:-95482955,predicate:"inputFileBig",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"name",type:"string"}],type:"InputFile"},{id:767652808,predicate:"inputEncryptedFileBigUploaded",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"key_fingerprint",type:"int"}],type:"InputEncryptedFile"},{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:1530447553,predicate:"inputMediaUploadedDocument",params:[{name:"flags",type:"#"},{name:"nosound_video",type:"flags.3?true"},{name:"force_file",type:"flags.4?true"},{name:"spoiler",type:"flags.5?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:"spoiler",type:"flags.2?true"},{name:"id",type:"InputDocument"},{name:"ttl_seconds",type:"flags.0?int"},{name:"query",type:"flags.1?string"}],type:"InputMedia"},{id:-1666158377,predicate:"messageMediaDocument",params:[{name:"flags",type:"#"},{name:"nopremium",type:"flags.3?true"},{name:"spoiler",type:"flags.4?true"},{name:"document",type:"flags.0?Document"},{name:"ttl_seconds",type:"flags.2?int"}],type:"MessageMedia"},{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:-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:922273905,predicate:"documentEmpty",params:[{name:"id",type:"long"}],type:"Document"},{id:-1881881384,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:"long"},{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:-1094555409,predicate:"updateNotifySettings",params:[{name:"peer",type:"NotifyPeer"},{name:"notify_settings",type:"PeerNotifySettings"}],type:"Update"},{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:-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:-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:-496024847,predicate:"userStatusRecently",params:[],type:"UserStatus"},{id:129960444,predicate:"userStatusLastWeek",params:[],type:"UserStatus"},{id:2011940674,predicate:"userStatusLastMonth",params:[],type:"UserStatus"},{id:-298113238,predicate:"updatePrivacy",params:[{name:"key",type:"PrivacyKey"},{name:"rules",type:"Vector"}],type:"Update"},{id:1335282456,predicate:"inputPrivacyKeyStatusTimestamp",params:[],type:"InputPrivacyKey"},{id:-1137792208,predicate:"privacyKeyStatusTimestamp",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:-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: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:88680979,predicate:"updateUserPhone",params:[{name:"user_id",type:"long"},{name:"phone",type:"string"}],type:"Update"},{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:-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:-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:-2066640507,predicate:"messages.affectedMessages",params:[{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"messages.AffectedMessages"},{id:2139689491,predicate:"updateWebPage",params:[{name:"webpage",type:"WebPage"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{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:-1557277184,predicate:"messageMediaWebPage",params:[{name:"webpage",type:"WebPage"}],type:"MessageMedia"},{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:-1787080453,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"},{name:"login_email_pattern",type:"flags.6?string"}],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:-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: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:-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:51520707,predicate:"messageActionChatJoinedByLink",params:[{name:"inviter_id",type:"long"}],type:"MessageAction"},{id:1757493555,predicate:"updateReadMessagesContents",params:[{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{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:768691932,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:"videos",type:"flags.6?true"},{name:"emojis",type:"flags.7?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:"thumb_document_id",type:"flags.8?long"},{name:"count",type:"int"},{name:"hash",type:"int"}],type:"StickerSet"},{id:1846886166,predicate:"messages.stickerSet",params:[{name:"set",type:"StickerSet"},{name:"packs",type:"Vector"},{name:"keywords",type:"Vector"},{name:"documents",type:"Vector"}],type:"messages.StickerSet"},{id:-1885878744,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:"bot_attach_menu",type:"flags.27?true"},{name:"premium",type:"flags.28?true"},{name:"attach_menu_enabled",type:"flags.29?true"},{name:"flags2",type:"#"},{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"},{name:"emoji_status",type:"flags.30?EmojiStatus"},{name:"usernames",type:"flags2.0?Vector"}],type:"User"},{id:-1032140601,predicate:"botCommand",params:[{name:"command",type:"string"},{name:"description",type:"string"}],type:"BotCommand"},{id:-1892676777,predicate:"botInfo",params:[{name:"flags",type:"#"},{name:"user_id",type:"flags.0?long"},{name:"description",type:"flags.1?string"},{name:"description_photo",type:"flags.4?Photo"},{name:"description_document",type:"flags.5?Document"},{name:"commands",type:"flags.2?Vector"},{name:"menu_button",type:"flags.3?BotMenuButton"}],type:"BotInfo"},{id:-1560655744,predicate:"keyboardButton",params:[{name:"text",type:"string"}],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:"persistent",type:"flags.4?true"},{name:"rows",type:"Vector"},{name:"placeholder",type:"flags.3?string"}],type:"ReplyMarkup"},{id:-571955892,predicate:"inputPeerUser",params:[{name:"user_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPeer"},{id:-233744186,predicate:"inputUser",params:[{name:"user_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputUser"},{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:-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:-292807034,predicate:"inputChannelEmpty",params:[],type:"InputChannel"},{id:-212145112,predicate:"inputChannel",params:[{name:"channel_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputChannel"},{id:-1566230754,predicate:"peerChannel",params:[{name:"channel_id",type:"long"}],type:"Peer"},{id:666680316,predicate:"inputPeerChannel",params:[{name:"channel_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPeer"},{id:-2094689180,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:"join_to_send",type:"flags.28?true"},{name:"join_request",type:"flags.29?true"},{name:"forum",type:"flags.30?true"},{name:"flags2",type:"#"},{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"},{name:"usernames",type:"flags2.0?Vector"}],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:2131196633,predicate:"contacts.resolvedPeer",params:[{name:"peer",type:"Peer"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.ResolvedPeer"},{id:-231385849,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:"flags2",type:"#"},{name:"can_delete_channel",type:"flags2.0?true"},{name:"antispam",type:"flags2.1?true"},{name:"participants_hidden",type:"flags2.2?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?ChatReactions"}],type:"ChatFull"},{id:182649427,predicate:"messageRange",params:[{name:"min_id",type:"int"},{name:"max_id",type:"int"}],type:"MessageRange"},{id:-948520370,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:"topics",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Messages"},{id:-1781355374,predicate:"messageActionChannelCreate",params:[{name:"title",type:"string"}],type:"MessageAction"},{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: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:-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:-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:-541588713,predicate:"channels.channelParticipant",params:[{name:"participant",type:"ChannelParticipant"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.ChannelParticipant"},{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:-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:-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:-1328445861,predicate:"channelParticipantsBots",params:[],type:"ChannelParticipantsFilter"},{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: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:"emojis",type:"flags.1?true"},{name:"order",type:"Vector"}],type:"Update"},{id:834816008,predicate:"updateStickerSets",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"emojis",type:"flags.1?true"}],type:"Update"},{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:-1821035490,predicate:"updateSavedGifs",params:[],type:"Update"},{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:-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: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: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:-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: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:1358283666,predicate:"inputMessagesFilterVoice",params:[],type:"MessagesFilter"},{id:928101534,predicate:"inputMessagesFilterMusic",params:[],type:"MessagesFilter"},{id:-1107622874,predicate:"inputPrivacyKeyChatInvite",params:[],type:"InputPrivacyKey"},{id:1343122938,predicate:"privacyKeyChatInvite",params:[],type:"PrivacyKey"},{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:457133559,predicate:"updateEditChannelMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1799538451,predicate:"messageActionPinMessage",params:[],type:"MessageAction"},{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: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: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:1218642516,predicate:"replyInlineMarkup",params:[{name:"rows",type:"Vector"}],type:"ReplyMarkup"},{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:-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:649453030,predicate:"messages.messageEditData",params:[{name:"flags",type:"#"},{name:"caption",type:"flags.0?true"}],type:"messages.MessageEditData"},{id:-469536605,predicate:"updateEditMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{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: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:-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: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:-1995686519,predicate:"inputBotInlineMessageID",params:[{name:"dc_id",type:"int"},{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputBotInlineMessageID"},{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: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:-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:-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:975236280,predicate:"inputMessagesFilterChatPhotos",params:[],type:"MessagesFilter"},{id:-1218471511,predicate:"updateReadChannelOutbox",params:[{name:"channel_id",type:"long"},{name:"max_id",type:"int"}],type:"Update"},{id:457829485,predicate:"updateDraftMessage",params:[{name:"flags",type:"#"},{name:"peer",type:"Peer"},{name:"top_msg_id",type:"flags.0?int"},{name:"draft",type:"DraftMessage"}],type:"Update"},{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:-1615153660,predicate:"messageActionHistoryClear",params:[],type:"MessageAction"},{id:-958657434,predicate:"messages.featuredStickersNotModified",params:[{name:"count",type:"int"}],type:"messages.FeaturedStickers"},{id:-1103615738,predicate:"messages.featuredStickers",params:[{name:"flags",type:"#"},{name:"premium",type:"flags.0?true"},{name:"hash",type:"long"},{name:"count",type:"int"},{name:"sets",type:"Vector"},{name:"unread",type:"Vector"}],type:"messages.FeaturedStickers"},{id:1461528386,predicate:"updateReadFeaturedStickers",params:[],type:"Update"},{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:-1706939360,predicate:"updateRecentStickers",params:[],type:"Update"},{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:-1574314746,predicate:"updateConfig",params:[],type:"Update"},{id:861169551,predicate:"updatePtsChanged",params:[],type:"Update"},{id:-440664550,predicate:"inputMediaPhotoExternal",params:[{name:"flags",type:"#"},{name:"spoiler",type:"flags.1?true"},{name:"url",type:"string"},{name:"ttl_seconds",type:"flags.0?int"}],type:"InputMedia"},{id:-78455655,predicate:"inputMediaDocumentExternal",params:[{name:"flags",type:"#"},{name:"spoiler",type:"flags.1?true"},{name:"url",type:"string"},{name:"ttl_seconds",type:"flags.0?int"}],type:"InputMedia"},{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:-1744710921,predicate:"documentAttributeHasStickers",params:[],type:"DocumentAttribute"},{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:1336154098,predicate:"inputBotInlineResultGame",params:[{name:"id",type:"string"},{name:"short_name",type:"string"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:1262639204,predicate:"inputBotInlineMessageGame",params:[{name:"flags",type:"#"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:-38694904,predicate:"messageMediaGame",params:[{name:"game",type:"Game"}],type:"MessageMedia"},{id:-750828557,predicate:"inputMediaGame",params:[{name:"id",type:"InputGame"}],type:"InputMedia"},{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:1358175439,predicate:"keyboardButtonGame",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:-1834538890,predicate:"messageActionGameScore",params:[{name:"game_id",type:"long"},{name:"score",type:"int"}],type:"MessageAction"},{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:1258196845,predicate:"updates.differenceTooLong",params:[{name:"pts",type:"int"}],type:"updates.Difference"},{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:-1663561404,predicate:"messages.chatsSlice",params:[{name:"count",type:"int"},{name:"chats",type:"Vector"}],type:"messages.Chats"},{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: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:1930545681,predicate:"webPageNotModified",params:[{name:"flags",type:"#"},{name:"cached_page_views",type:"flags.0?int"}],type:"WebPage"},{id:-88417185,predicate:"inputPrivacyKeyPhoneCall",params:[],type:"InputPrivacyKey"},{id:1030105979,predicate:"privacyKeyPhoneCall",params:[],type:"PrivacyKey"},{id:-580219064,predicate:"sendMessageGamePlayAction",params:[],type:"SendMessageAction"},{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: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:2104790276,predicate:"dataJSON",params:[{name:"data",type:"string"}],type:"DataJSON"},{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:-886477832,predicate:"labeledPrice",params:[{name:"label",type:"string"},{name:"amount",type:"long"}],type:"LabeledPrice"},{id:1048946971,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:"recurring",type:"flags.9?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"},{name:"recurring_terms_url",type:"flags.9?string"}],type:"Invoice"},{id:-1900697899,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"},{name:"extended_media",type:"flags.2?InputMedia"}],type:"InputMedia"},{id:-368917890,predicate:"paymentCharge",params:[{name:"id",type:"string"},{name:"provider_charge_id",type:"string"}],type:"PaymentCharge"},{id:-1892568281,predicate:"messageActionPaymentSentMe",params:[{name:"flags",type:"#"},{name:"recurring_init",type:"flags.2?true"},{name:"recurring_used",type:"flags.3?true"},{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:-156940077,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"},{name:"extended_media",type:"flags.4?MessageExtendedMedia"}],type:"MessageMedia"},{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:-1344716869,predicate:"keyboardButtonBuy",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:-1776926890,predicate:"messageActionPaymentSent",params:[{name:"flags",type:"#"},{name:"recurring_init",type:"flags.2?true"},{name:"recurring_used",type:"flags.3?true"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"invoice_slug",type:"flags.0?string"}],type:"MessageAction"},{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:-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: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:-1610250415,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:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.5?WebDocument"},{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:"additional_methods",type:"flags.6?Vector"},{name:"saved_info",type:"flags.0?PaymentRequestedInfo"},{name:"saved_credentials",type:"flags.1?Vector"},{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: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:-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:-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:-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:-1425052898,predicate:"updatePhoneCall",params:[{name:"phone_call",type:"PhoneCall"}],type:"Update"},{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:-1665063993,predicate:"phoneConnection",params:[{name:"flags",type:"#"},{name:"tcp",type:"flags.0?true"},{name:"id",type:"long"},{name:"ip",type:"string"},{name:"ipv6",type:"string"},{name:"port",type:"int"},{name:"peer_tag",type:"bytes"}],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:-2134272152,predicate:"inputMessagesFilterPhoneCalls",params:[{name:"flags",type:"#"},{name:"missed",type:"flags.0?true"}],type:"MessagesFilter"},{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:2054952868,predicate:"inputMessagesFilterRoundVoice",params:[],type:"MessagesFilter"},{id:-1253451181,predicate:"inputMessagesFilterRoundVideo",params:[],type:"MessagesFilter"},{id:-1997373508,predicate:"sendMessageRecordRoundAction",params:[],type:"SendMessageAction"},{id:608050278,predicate:"sendMessageUploadRoundAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{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:-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:-283684427,predicate:"pageBlockChannel",params:[{name:"channel",type:"Chat"}],type:"PageBlock"},{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:1180041828,predicate:"updateLangPackTooLong",params:[{name:"lang_code",type:"string"}],type:"Update"},{id:1442983757,predicate:"updateLangPack",params:[{name:"difference",type:"LangPackDifference"}],type:"Update"},{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:338142689,predicate:"channelParticipantsBanned",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:106343499,predicate:"channelParticipantsSearch",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{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: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"},{name:"forums",type:"flags.17?true"}],type:"ChannelAdminLogEventsFilter"},{id:511092620,predicate:"topPeerCategoryPhoneCalls",params:[],type:"TopPeerCategory"},{id:-2143067670,predicate:"pageBlockAudio",params:[{name:"audio_id",type:"long"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:1558266229,predicate:"popularContact",params:[{name:"client_id",type:"long"},{name:"importers",type:"int"}],type:"PopularContact"},{id:1200788123,predicate:"messageActionScreenshotTaken",params:[],type:"MessageAction"},{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:-451831443,predicate:"updateFavedStickers",params:[],type:"Update"},{id:-366410403,predicate:"updateChannelReadMessagesContents",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"top_msg_id",type:"flags.0?int"},{name:"messages",type:"Vector"}],type:"Update"},{id:-1040652646,predicate:"inputMessagesFilterMyMentions",params:[],type:"MessagesFilter"},{id:1887741886,predicate:"updateContactsReset",params:[],type:"Update"},{id:-1312568665,predicate:"channelAdminLogEventActionChangeStickerSet",params:[{name:"prev_stickerset",type:"InputStickerSet"},{name:"new_stickerset",type:"InputStickerSet"}],type:"ChannelAdminLogEventAction"},{id:-85549226,predicate:"messageActionCustomAction",params:[{name:"message",type:"string"}],type:"MessageAction"},{id:178373535,predicate:"inputPaymentCredentialsApplePay",params:[{name:"payment_data",type:"DataJSON"}],type:"InputPaymentCredentials"},{id:-419271411,predicate:"inputMessagesFilterGeo",params:[],type:"MessagesFilter"},{id:-530392189,predicate:"inputMessagesFilterContacts",params:[],type:"MessagesFilter"},{id:-1304443240,predicate:"updateChannelAvailableMessages",params:[{name:"channel_id",type:"long"},{name:"available_min_id",type:"int"}],type:"Update"},{id:1599903217,predicate:"channelAdminLogEventActionTogglePreHistoryHidden",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{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:-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: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:-266911767,predicate:"channels.channelParticipantsNotModified",params:[],type:"channels.ChannelParticipants"},{id:1951620897,predicate:"messages.messagesNotModified",params:[{name:"count",type:"int"}],type:"messages.Messages"},{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:-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:-1410748418,predicate:"messageActionBotAllowed",params:[{name:"domain",type:"string"}],type:"MessageAction"},{id:-55902537,predicate:"inputDialogPeer",params:[{name:"peer",type:"InputPeer"}],type:"InputDialogPeer"},{id:-445792507,predicate:"dialogPeer",params:[{name:"peer",type:"Peer"}],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:-207944868,predicate:"fileHash",params:[{name:"offset",type:"long"},{name:"limit",type:"int"},{name:"hash",type:"bytes"}],type:"FileHash"},{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: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:-876089816,predicate:"inputSecureFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputFileLocation"},{id:1679398724,predicate:"secureFileEmpty",params:[],type:"SecureFile"},{id:2097791614,predicate:"secureFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"size",type:"long"},{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: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: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: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:700340377,predicate:"inputTakeoutFileLocation",params:[],type:"InputFileLocation"},{id:-513517117,predicate:"updateDialogUnreadMark",params:[{name:"flags",type:"#"},{name:"unread",type:"flags.0?true"},{name:"peer",type:"DialogPeer"}],type:"Update"},{id:-253500010,predicate:"messages.dialogsNotModified",params:[{name:"count",type:"int"}],type:"messages.Dialogs"},{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:-1255369827,predicate:"contacts.topPeersDisabled",params:[],type:"contacts.TopPeers"},{id:-1685456582,predicate:"inputReportReasonCopyright",params:[],type:"ReportReason"},{id:-732254058,predicate:"passwordKdfAlgoUnknown",params:[],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:982592842,predicate:"passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow",params:[{name:"salt1",type:"bytes"},{name:"salt2",type:"bytes"},{name:"g",type:"int"},{name:"p",type:"bytes"}],type:"PasswordKdfAlgo"},{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:-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:-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:-1311015810,predicate:"inputNotifyBroadcasts",params:[],type:"InputNotifyPeer"},{id:-703403793,predicate:"notifyBroadcasts",params:[],type:"NotifyPeer"},{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:504660880,predicate:"pageBlockKicker",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{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:-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: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:-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:-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: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:-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:-610373422,predicate:"inputPrivacyKeyPhoneP2P",params:[],type:"InputPrivacyKey"},{id:961092808,predicate:"privacyKeyPhoneP2P",params:[],type:"PrivacyKey"},{id:894777186,predicate:"textAnchor",params:[{name:"text",type:"RichText"},{name:"name",type:"string"}],type:"RichText"},{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:-202219658,predicate:"messageActionContactSignUp",params:[],type:"MessageAction"},{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: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: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:1272375192,predicate:"messageMediaPoll",params:[{name:"poll",type:"Poll"},{name:"results",type:"PollResults"}],type:"MessageMedia"},{id:-264117680,predicate:"chatOnlines",params:[{name:"onlines",type:"int"}],type:"ChatOnlines"},{id:1202287072,predicate:"statsURL",params:[{name:"url",type:"string"}],type:"StatsURL"},{id:-525288402,predicate:"photoStrippedSize",params:[{name:"type",type:"string"},{name:"bytes",type:"bytes"}],type:"PhotoSize"},{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"},{name:"manage_topics",type:"flags.13?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:"manage_topics",type:"flags.18?true"},{name:"until_date",type:"int"}],type:"ChatBannedRights"},{id:1421875280,predicate:"updateChatDefaultBannedRights",params:[{name:"peer",type:"Peer"},{name:"default_banned_rights",type:"ChatBannedRights"},{name:"version",type:"int"}],type:"Update"},{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:-1150621555,predicate:"channelParticipantsContacts",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{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: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:-1896171181,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:"long"},{name:"file_size_max",type:"long"},{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:-1529000952,predicate:"inputPrivacyKeyForwards",params:[],type:"InputPrivacyKey"},{id:1777096355,predicate:"privacyKeyForwards",params:[],type:"PrivacyKey"},{id:1461304012,predicate:"inputPrivacyKeyProfilePhoto",params:[],type:"InputPrivacyKey"},{id:-1777000467,predicate:"privacyKeyProfilePhoto",params:[],type:"PrivacyKey"},{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:-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: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:1684014375,predicate:"inputDialogPeerFolder",params:[{name:"folder_id",type:"int"}],type:"InputDialogPeer"},{id:1363483106,predicate:"dialogPeerFolder",params:[{name:"folder_id",type:"int"}],type:"DialogPeer"},{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:422972864,predicate:"updateFolderPeers",params:[{name:"folder_peers",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:497305826,predicate:"inputUserFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"user_id",type:"long"}],type:"InputUser"},{id:1536380829,predicate:"inputChannelFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"channel_id",type:"long"}],type:"InputChannel"},{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:55761658,predicate:"inputPrivacyKeyPhoneNumber",params:[],type:"InputPrivacyKey"},{id:-778378131,predicate:"privacyKeyPhoneNumber",params:[],type:"PrivacyKey"},{id:-1472172887,predicate:"topPeerCategoryForwardUsers",params:[],type:"TopPeerCategory"},{id:-68239120,predicate:"topPeerCategoryForwardChats",params:[],type:"TopPeerCategory"},{id:84703944,predicate:"channelAdminLogEventActionChangeLinkedChat",params:[{name:"prev_value",type:"long"},{name:"new_value",type:"long"}],type:"ChannelAdminLogEventAction"},{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: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:-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:-2079962673,predicate:"inputPrivacyValueAllowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"InputPrivacyRule"},{id:-380694650,predicate:"inputPrivacyValueDisallowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"InputPrivacyRule"},{id:1796427406,predicate:"privacyValueAllowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"PrivacyRule"},{id:1103656293,predicate:"privacyValueDisallowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"PrivacyRule"},{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:1786671974,predicate:"updatePeerSettings",params:[{name:"peer",type:"Peer"},{name:"settings",type:"PeerSettings"}],type:"Update"},{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:-1263546448,predicate:"updatePeerLocated",params:[{name:"peers",type:"Vector"}],type:"Update"},{id:241923758,predicate:"channelAdminLogEventActionChangeLocation",params:[{name:"prev_value",type:"ChannelLocation"},{name:"new_value",type:"ChannelLocation"}],type:"ChannelAdminLogEventAction"},{id:-606798099,predicate:"inputReportReasonGeoIrrelevant",params:[],type:"ReportReason"},{id:1401984889,predicate:"channelAdminLogEventActionToggleSlowMode",params:[{name:"prev_value",type:"int"},{name:"new_value",type:"int"}],type:"ChannelAdminLogEventAction"},{id:1148485274,predicate:"auth.authorizationSignUpRequired",params:[{name:"flags",type:"#"},{name:"terms_of_service",type:"flags.0?help.TermsOfService"}],type:"auth.Authorization"},{id:-666824391,predicate:"payments.paymentVerificationNeeded",params:[{name:"url",type:"string"}],type:"payments.PaymentResult"},{id:42402760,predicate:"inputStickerSetAnimatedEmoji",params:[],type:"InputStickerSet"},{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:-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:-2112423005,predicate:"updateTheme",params:[{name:"theme",type:"Theme"}],type:"Update"},{id:-786326563,predicate:"inputPrivacyKeyAddedByPhone",params:[],type:"InputPrivacyKey"},{id:1124062251,predicate:"privacyKeyAddedByPhone",params:[],type:"PrivacyKey"},{id:-2027964103,predicate:"updateGeoLiveViewed",params:[{name:"peer",type:"Peer"},{name:"msg_id",type:"int"}],type:"Update"},{id:1448076945,predicate:"updateLoginToken",params:[],type:"Update"},{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:-1770371538,predicate:"inputWallPaperNoFile",params:[{name:"id",type:"long"}],type:"InputWallPaper"},{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:-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: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: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:-1144565411,predicate:"keyboardButtonRequestPoll",params:[{name:"flags",type:"#"},{name:"quiz",type:"flags.0?Bool"},{name:"text",type:"string"}],type:"KeyboardButton"},{id:1981704948,predicate:"messageEntityBankCard",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{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:-118740917,predicate:"peerSelfLocated",params:[{name:"expires",type:"int"}],type:"PeerLocated"},{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: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:-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:-428884101,predicate:"inputMediaDice",params:[{name:"emoticon",type:"string"}],type:"InputMedia"},{id:1065280907,predicate:"messageMediaDice",params:[{name:"value",type:"int"},{name:"emoticon",type:"string"}],type:"MessageMedia"},{id:-427863538,predicate:"inputStickerSetDice",params:[{name:"emoticon",type:"string"}],type:"InputStickerSet"},{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:643940105,predicate:"updatePhoneCallSignalingData",params:[{name:"phone_call_id",type:"long"},{name:"data",type:"bytes"}],type:"Update"},{id:1634294960,predicate:"chatInvitePeek",params:[{name:"chat",type:"Chat"},{name:"expires",type:"int"}],type:"ChatInvite"},{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: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: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:-761649164,predicate:"updateChannelMessageForwards",params:[{name:"channel_id",type:"long"},{name:"id",type:"int"},{name:"forwards",type:"int"}],type:"Update"},{id:-96535659,predicate:"photoSizeProgressive",params:[{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"sizes",type:"Vector"}],type:"PhotoSize"},{id:-1228606141,predicate:"messages.messageViews",params:[{name:"views",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.MessageViews"},{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:-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_scheduled",type:"flags.2?true"},{name:"forum_topic",type:"flags.3?true"},{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:610945826,predicate:"updatePeerBlocked",params:[{name:"peer_id",type:"Peer"},{name:"blocked",type:"Bool"}],type:"Update"},{id:-386039788,predicate:"peerBlocked",params:[{name:"peer_id",type:"Peer"},{name:"date",type:"int"}],type:"PeerBlocked"},{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:-1392895362,predicate:"inputMessageCallbackQuery",params:[{name:"id",type:"int"},{name:"query_id",type:"long"}],type:"InputMessage"},{id:453242886,predicate:"channelParticipantLeft",params:[{name:"peer",type:"Peer"}],type:"ChannelParticipant"},{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:-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:464520273,predicate:"inputMessagesFilterPinned",params:[],type:"MessagesFilter"},{id:-1986399595,predicate:"stats.messageStats",params:[{name:"views_graph",type:"StatsGraph"}],type:"stats.MessageStats"},{id:-1730095465,predicate:"messageActionGeoProximityReached",params:[{name:"from_id",type:"Peer"},{name:"to_id",type:"Peer"},{name:"distance",type:"int"}],type:"MessageAction"},{id:-668906175,predicate:"photoPathSize",params:[{name:"type",type:"string"},{name:"bytes",type:"bytes"}],type:"PhotoSize"},{id:-651419003,predicate:"speakingInGroupCallAction",params:[],type:"SendMessageAction"},{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:"rtmp_stream",type:"flags.12?true"},{name:"listeners_hidden",type:"flags.13?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: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:-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:-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:-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: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:-1966921727,predicate:"inputPaymentCredentialsGooglePay",params:[{name:"payment_token",type:"DataJSON"}],type:"InputPaymentCredentials"},{id:375566091,predicate:"messages.historyImport",params:[{name:"id",type:"long"}],type:"messages.HistoryImport"},{id:-606432698,predicate:"sendMessageHistoryImportAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{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:-170010905,predicate:"inputReportReasonFake",params:[],type:"ReportReason"},{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:1007897979,predicate:"messageActionSetMessagesTTL",params:[{name:"flags",type:"#"},{name:"period",type:"int"},{name:"auto_setting_from",type:"flags.0?long"}],type:"MessageAction"},{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:-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: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:-1571952873,predicate:"messages.checkedHistoryImportPeer",params:[{name:"confirm_text",type:"string"}],type:"messages.CheckedHistoryImportPeer"},{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:-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:-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: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:-1281329567,predicate:"messageActionGroupCallScheduled",params:[{name:"call",type:"InputGroupCall"},{name:"schedule_date",type:"int"}],type:"MessageAction"},{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:192428418,predicate:"updateGroupCallConnection",params:[{name:"flags",type:"#"},{name:"presentation",type:"flags.0?true"},{name:"params",type:"DataJSON"}],type:"Update"},{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:1299263278,predicate:"updateBotCommands",params:[{name:"peer",type:"Peer"},{name:"bot_id",type:"long"},{name:"commands",type:"Vector"}],type:"Update"},{id:-1434950843,predicate:"messageActionSetChatTheme",params:[{name:"emoticon",type:"string"}],type:"MessageAction"},{id:-1336228175,predicate:"sendMessageChooseStickerAction",params:[],type:"SendMessageAction"},{id:981691896,predicate:"sponsoredMessage",params:[{name:"flags",type:"#"},{name:"recommended",type:"flags.5?true"},{name:"show_peer_photo",type:"flags.6?true"},{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:-907141753,predicate:"messages.sponsoredMessages",params:[{name:"flags",type:"#"},{name:"posts_between",type:"flags.0?int"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.SponsoredMessages"},{id:215889721,predicate:"inputStickerSetAnimatedEmojiAnimations",params:[],type:"InputStickerSet"},{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:-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:-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:-339958837,predicate:"messageActionChatJoinedByRequest",params:[],type:"MessageAction"},{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:-1347021750,predicate:"channelAdminLogEventActionParticipantJoinByRequest",params:[{name:"invite",type:"ExportedChatInvite"},{name:"approved_by",type:"long"}],type:"ChannelAdminLogEventAction"},{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:-191450938,predicate:"channels.sendAsPeers",params:[{name:"peers",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.SendAsPeers"},{id:-886388890,predicate:"channelAdminLogEventActionToggleNoForwards",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:-738646805,predicate:"messages.stickerSetNotModified",params:[],type:"messages.StickerSet"},{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:663693416,predicate:"channelAdminLogEventActionSendMessage",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:-702884114,predicate:"auth.codeTypeMissedCall",params:[],type:"auth.CodeType"},{id:-2113903484,predicate:"auth.sentCodeTypeMissedCall",params:[{name:"prefix",type:"string"},{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:-1012759713,predicate:"auth.loggedOut",params:[{name:"flags",type:"#"},{name:"future_auth_token",type:"flags.0?bytes"}],type:"auth.LoggedOut"},{id:1578843320,predicate:"updateMessageReactions",params:[{name:"flags",type:"#"},{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"top_msg_id",type:"flags.0?int"},{name:"reactions",type:"MessageReactions"}],type:"Update"},{id:-1546531968,predicate:"reactionCount",params:[{name:"flags",type:"#"},{name:"chosen_order",type:"flags.0?int"},{name:"reaction",type:"Reaction"},{name:"count",type:"int"}],type:"ReactionCount"},{id:1328256121,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_reactions",type:"flags.1?Vector"}],type:"MessageReactions"},{id:834488621,predicate:"messages.messageReactionsList",params:[{name:"flags",type:"#"},{name:"count",type:"int"},{name:"reactions",type:"Vector"},{name:"chats",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:"premium",type:"flags.2?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"},{id:852137487,predicate:"messageEntitySpoiler",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1102180616,predicate:"channelAdminLogEventActionChangeAvailableReactions",params:[{name:"prev_value",type:"ChatReactions"},{name:"new_value",type:"ChatReactions"}],type:"ChannelAdminLogEventAction"},{id:1741309751,predicate:"messages.translateNoResult",params:[],type:"messages.TranslatedText"},{id:-1575684144,predicate:"messages.translateResultText",params:[{name:"text",type:"string"}],type:"messages.TranslatedText"},{id:-1319698788,predicate:"messagePeerReaction",params:[{name:"flags",type:"#"},{name:"big",type:"flags.0?true"},{name:"unread",type:"flags.1?true"},{name:"peer_id",type:"Peer"},{name:"reaction",type:"Reaction"}],type:"MessagePeerReaction"},{id:-2132064081,predicate:"groupCallStreamChannel",params:[{name:"channel",type:"int"},{name:"scale",type:"int"},{name:"last_timestamp_ms",type:"long"}],type:"GroupCallStreamChannel"},{id:-790330702,predicate:"phone.groupCallStreamChannels",params:[{name:"channels",type:"Vector"}],type:"phone.GroupCallStreamChannels"},{id:177124030,predicate:"inputReportReasonIllegalDrugs",params:[],type:"ReportReason"},{id:-1631091139,predicate:"inputReportReasonPersonalDetails",params:[],type:"ReportReason"},{id:767505458,predicate:"phone.groupCallStreamRtmpUrl",params:[{name:"url",type:"string"},{name:"key",type:"string"}],type:"phone.GroupCallStreamRtmpUrl"},{id:1165423600,predicate:"attachMenuBotIconColor",params:[{name:"name",type:"string"},{name:"color",type:"int"}],type:"AttachMenuBotIconColor"},{id:-1297663893,predicate:"attachMenuBotIcon",params:[{name:"flags",type:"#"},{name:"name",type:"string"},{name:"icon",type:"Document"},{name:"colors",type:"flags.0?Vector"}],type:"AttachMenuBotIcon"},{id:-928371502,predicate:"attachMenuBot",params:[{name:"flags",type:"#"},{name:"inactive",type:"flags.0?true"},{name:"has_settings",type:"flags.1?true"},{name:"request_write_access",type:"flags.2?true"},{name:"bot_id",type:"long"},{name:"short_name",type:"string"},{name:"peer_types",type:"Vector"},{name:"icons",type:"Vector"}],type:"AttachMenuBot"},{id:-237467044,predicate:"attachMenuBotsNotModified",params:[],type:"AttachMenuBots"},{id:1011024320,predicate:"attachMenuBots",params:[{name:"hash",type:"long"},{name:"bots",type:"Vector"},{name:"users",type:"Vector"}],type:"AttachMenuBots"},{id:-1816172929,predicate:"attachMenuBotsBot",params:[{name:"bot",type:"AttachMenuBot"},{name:"users",type:"Vector"}],type:"AttachMenuBotsBot"},{id:397910539,predicate:"updateAttachMenuBots",params:[],type:"Update"},{id:202659196,predicate:"webViewResultUrl",params:[{name:"query_id",type:"long"},{name:"url",type:"string"}],type:"WebViewResult"},{id:-2010155333,predicate:"simpleWebViewResultUrl",params:[{name:"url",type:"string"}],type:"SimpleWebViewResult"},{id:211046684,predicate:"webViewMessageSent",params:[{name:"flags",type:"#"},{name:"msg_id",type:"flags.0?InputBotInlineMessageID"}],type:"WebViewMessageSent"},{id:361936797,predicate:"updateWebViewResultSent",params:[{name:"query_id",type:"long"}],type:"Update"},{id:326529584,predicate:"keyboardButtonWebView",params:[{name:"text",type:"string"},{name:"url",type:"string"}],type:"KeyboardButton"},{id:-1598009252,predicate:"keyboardButtonSimpleWebView",params:[{name:"text",type:"string"},{name:"url",type:"string"}],type:"KeyboardButton"},{id:1205698681,predicate:"messageActionWebViewDataSentMe",params:[{name:"text",type:"string"},{name:"data",type:"string"}],type:"MessageAction"},{id:-1262252875,predicate:"messageActionWebViewDataSent",params:[{name:"text",type:"string"}],type:"MessageAction"},{id:347625491,predicate:"updateBotMenuButton",params:[{name:"bot_id",type:"long"},{name:"button",type:"BotMenuButton"}],type:"Update"},{id:1966318984,predicate:"botMenuButtonDefault",params:[],type:"BotMenuButton"},{id:1113113093,predicate:"botMenuButtonCommands",params:[],type:"BotMenuButton"},{id:-944407322,predicate:"botMenuButton",params:[{name:"text",type:"string"},{name:"url",type:"string"}],type:"BotMenuButton"},{id:-67704655,predicate:"account.savedRingtonesNotModified",params:[],type:"account.SavedRingtones"},{id:-1041683259,predicate:"account.savedRingtones",params:[{name:"hash",type:"long"},{name:"ringtones",type:"Vector"}],type:"account.SavedRingtones"},{id:1960361625,predicate:"updateSavedRingtones",params:[],type:"Update"},{id:-1746354498,predicate:"notificationSoundDefault",params:[],type:"NotificationSound"},{id:1863070943,predicate:"notificationSoundNone",params:[],type:"NotificationSound"},{id:-2096391452,predicate:"notificationSoundLocal",params:[{name:"title",type:"string"},{name:"data",type:"string"}],type:"NotificationSound"},{id:-9666487,predicate:"notificationSoundRingtone",params:[{name:"id",type:"long"}],type:"NotificationSound"},{id:-1222230163,predicate:"account.savedRingtone",params:[],type:"account.SavedRingtone"},{id:523271863,predicate:"account.savedRingtoneConverted",params:[{name:"document",type:"Document"}],type:"account.SavedRingtone"},{id:2104224014,predicate:"attachMenuPeerTypeSameBotPM",params:[],type:"AttachMenuPeerType"},{id:-1020528102,predicate:"attachMenuPeerTypeBotPM",params:[],type:"AttachMenuPeerType"},{id:-247016673,predicate:"attachMenuPeerTypePM",params:[],type:"AttachMenuPeerType"},{id:84480319,predicate:"attachMenuPeerTypeChat",params:[],type:"AttachMenuPeerType"},{id:2080104188,predicate:"attachMenuPeerTypeBroadcast",params:[],type:"AttachMenuPeerType"},{id:-317687113,predicate:"chatInvitePublicJoinRequests",params:[],type:"ExportedChatInvite"},{id:-977967015,predicate:"inputInvoiceMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"InputInvoice"},{id:-1020867857,predicate:"inputInvoiceSlug",params:[{name:"slug",type:"string"}],type:"InputInvoice"},{id:-1362048039,predicate:"payments.exportedInvoice",params:[{name:"url",type:"string"}],type:"payments.ExportedInvoice"},{id:8703322,predicate:"updateTranscribedAudio",params:[{name:"flags",type:"#"},{name:"pending",type:"flags.0?true"},{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"transcription_id",type:"long"},{name:"text",type:"string"}],type:"Update"},{id:-1821037486,predicate:"messages.transcribedAudio",params:[{name:"flags",type:"#"},{name:"pending",type:"flags.0?true"},{name:"transcription_id",type:"long"},{name:"text",type:"string"}],type:"messages.TranscribedAudio"},{id:909284270,predicate:"dialogFilterDefault",params:[],type:"DialogFilter"},{id:1395946908,predicate:"help.premiumPromo",params:[{name:"status_text",type:"string"},{name:"status_entities",type:"Vector"},{name:"video_sections",type:"Vector"},{name:"videos",type:"Vector"},{name:"period_options",type:"Vector"},{name:"users",type:"Vector"}],type:"help.PremiumPromo"},{id:-925956616,predicate:"messageEntityCustomEmoji",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"document_id",type:"long"}],type:"MessageEntity"},{id:-48981863,predicate:"documentAttributeCustomEmoji",params:[{name:"flags",type:"#"},{name:"free",type:"flags.0?true"},{name:"text_color",type:"flags.1?true"},{name:"alt",type:"string"},{name:"stickerset",type:"InputStickerSet"}],type:"DocumentAttribute"},{id:1087454222,predicate:"stickerSetFullCovered",params:[{name:"set",type:"StickerSet"},{name:"packs",type:"Vector"},{name:"keywords",type:"Vector"},{name:"documents",type:"Vector"}],type:"StickerSetCovered"},{id:-1502273946,predicate:"inputStorePaymentPremiumSubscription",params:[{name:"flags",type:"#"},{name:"restore",type:"flags.0?true"}],type:"InputStorePaymentPurpose"},{id:1634697192,predicate:"inputStorePaymentGiftPremium",params:[{name:"user_id",type:"InputUser"},{name:"currency",type:"string"},{name:"amount",type:"long"}],type:"InputStorePaymentPurpose"},{id:-1415514682,predicate:"messageActionGiftPremium",params:[{name:"currency",type:"string"},{name:"amount",type:"long"},{name:"months",type:"int"}],type:"MessageAction"},{id:1958953753,predicate:"premiumGiftOption",params:[{name:"flags",type:"#"},{name:"months",type:"int"},{name:"currency",type:"string"},{name:"amount",type:"long"},{name:"bot_url",type:"string"},{name:"store_product",type:"flags.0?string"}],type:"PremiumGiftOption"},{id:-930399486,predicate:"inputStickerSetPremiumGifts",params:[],type:"InputStickerSet"},{id:-78886548,predicate:"updateReadFeaturedEmojiStickers",params:[],type:"Update"},{id:-1360618136,predicate:"inputPrivacyKeyVoiceMessages",params:[],type:"InputPrivacyKey"},{id:110621716,predicate:"privacyKeyVoiceMessages",params:[],type:"PrivacyKey"},{id:-1996951013,predicate:"paymentFormMethod",params:[{name:"url",type:"string"},{name:"title",type:"string"}],type:"PaymentFormMethod"},{id:-193992412,predicate:"inputWebFileAudioAlbumThumbLocation",params:[{name:"flags",type:"#"},{name:"small",type:"flags.2?true"},{name:"document",type:"flags.0?InputDocument"},{name:"title",type:"flags.1?string"},{name:"performer",type:"flags.1?string"}],type:"InputWebFileLocation"},{id:769727150,predicate:"emojiStatusEmpty",params:[],type:"EmojiStatus"},{id:-1835310691,predicate:"emojiStatus",params:[{name:"document_id",type:"long"}],type:"EmojiStatus"},{id:-97474361,predicate:"emojiStatusUntil",params:[{name:"document_id",type:"long"},{name:"until",type:"int"}],type:"EmojiStatus"},{id:674706841,predicate:"updateUserEmojiStatus",params:[{name:"user_id",type:"long"},{name:"emoji_status",type:"EmojiStatus"}],type:"Update"},{id:821314523,predicate:"updateRecentEmojiStatuses",params:[],type:"Update"},{id:-796072379,predicate:"account.emojiStatusesNotModified",params:[],type:"account.EmojiStatuses"},{id:-1866176559,predicate:"account.emojiStatuses",params:[{name:"hash",type:"long"},{name:"statuses",type:"Vector"}],type:"account.EmojiStatuses"},{id:2046153753,predicate:"reactionEmpty",params:[],type:"Reaction"},{id:455247544,predicate:"reactionEmoji",params:[{name:"emoticon",type:"string"}],type:"Reaction"},{id:-1992950669,predicate:"reactionCustomEmoji",params:[{name:"document_id",type:"long"}],type:"Reaction"},{id:-352570692,predicate:"chatReactionsNone",params:[],type:"ChatReactions"},{id:1385335754,predicate:"chatReactionsAll",params:[{name:"flags",type:"#"},{name:"allow_custom",type:"flags.0?true"}],type:"ChatReactions"},{id:1713193015,predicate:"chatReactionsSome",params:[{name:"reactions",type:"Vector"}],type:"ChatReactions"},{id:-1334846497,predicate:"messages.reactionsNotModified",params:[],type:"messages.Reactions"},{id:-352454890,predicate:"messages.reactions",params:[{name:"hash",type:"long"},{name:"reactions",type:"Vector"}],type:"messages.Reactions"},{id:1870160884,predicate:"updateRecentReactions",params:[],type:"Update"},{id:-2030252155,predicate:"updateMoveStickerSetToTop",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"emojis",type:"flags.1?true"},{name:"stickerset",type:"long"}],type:"Update"},{id:1511364673,predicate:"auth.sentCodeTypeEmailCode",params:[{name:"flags",type:"#"},{name:"apple_signin_allowed",type:"flags.0?true"},{name:"google_signin_allowed",type:"flags.1?true"},{name:"email_pattern",type:"string"},{name:"length",type:"int"},{name:"next_phone_login_date",type:"flags.2?int"}],type:"auth.SentCodeType"},{id:-1521934870,predicate:"auth.sentCodeTypeSetUpEmailRequired",params:[{name:"flags",type:"#"},{name:"apple_signin_allowed",type:"flags.0?true"},{name:"google_signin_allowed",type:"flags.1?true"}],type:"auth.SentCodeType"},{id:1128644211,predicate:"emailVerifyPurposeLoginSetup",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"}],type:"EmailVerifyPurpose"},{id:1383932651,predicate:"emailVerifyPurposeLoginChange",params:[],type:"EmailVerifyPurpose"},{id:-1141565819,predicate:"emailVerifyPurposePassport",params:[],type:"EmailVerifyPurpose"},{id:-1842457175,predicate:"emailVerificationCode",params:[{name:"code",type:"string"}],type:"EmailVerification"},{id:-611279166,predicate:"emailVerificationGoogle",params:[{name:"token",type:"string"}],type:"EmailVerification"},{id:-1764723459,predicate:"emailVerificationApple",params:[{name:"token",type:"string"}],type:"EmailVerification"},{id:731303195,predicate:"account.emailVerified",params:[{name:"email",type:"string"}],type:"account.EmailVerified"},{id:-507835039,predicate:"account.emailVerifiedLogin",params:[{name:"email",type:"string"},{name:"sent_code",type:"auth.SentCode"}],type:"account.EmailVerified"},{id:-1225711938,predicate:"premiumSubscriptionOption",params:[{name:"flags",type:"#"},{name:"current",type:"flags.1?true"},{name:"can_purchase_upgrade",type:"flags.2?true"},{name:"months",type:"int"},{name:"currency",type:"string"},{name:"amount",type:"long"},{name:"bot_url",type:"string"},{name:"store_product",type:"flags.0?string"}],type:"PremiumSubscriptionOption"},{id:80008398,predicate:"inputStickerSetEmojiGenericAnimations",params:[],type:"InputStickerSet"},{id:701560302,predicate:"inputStickerSetEmojiDefaultStatuses",params:[],type:"InputStickerSet"},{id:-1206095820,predicate:"sendAsPeer",params:[{name:"flags",type:"#"},{name:"premium_required",type:"flags.0?true"},{name:"peer",type:"Peer"}],type:"SendAsPeer"},{id:-1386050360,predicate:"messageExtendedMediaPreview",params:[{name:"flags",type:"#"},{name:"w",type:"flags.0?int"},{name:"h",type:"flags.0?int"},{name:"thumb",type:"flags.1?PhotoSize"},{name:"video_duration",type:"flags.2?int"}],type:"MessageExtendedMedia"},{id:-297296796,predicate:"messageExtendedMedia",params:[{name:"media",type:"MessageMedia"}],type:"MessageExtendedMedia"},{id:1517529484,predicate:"updateMessageExtendedMedia",params:[{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"extended_media",type:"MessageExtendedMedia"}],type:"Update"},{id:-50416996,predicate:"stickerKeyword",params:[{name:"document_id",type:"long"},{name:"keyword",type:"Vector"}],type:"StickerKeyword"},{id:-1274595769,predicate:"username",params:[{name:"flags",type:"#"},{name:"editable",type:"flags.0?true"},{name:"active",type:"flags.1?true"},{name:"username",type:"string"}],type:"Username"},{id:-263212119,predicate:"channelAdminLogEventActionChangeUsernames",params:[{name:"prev_value",type:"Vector"},{name:"new_value",type:"Vector"}],type:"ChannelAdminLogEventAction"},{id:46949251,predicate:"channelAdminLogEventActionToggleForum",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:1483767080,predicate:"channelAdminLogEventActionCreateTopic",params:[{name:"topic",type:"ForumTopic"}],type:"ChannelAdminLogEventAction"},{id:-261103096,predicate:"channelAdminLogEventActionEditTopic",params:[{name:"prev_topic",type:"ForumTopic"},{name:"new_topic",type:"ForumTopic"}],type:"ChannelAdminLogEventAction"},{id:-1374254839,predicate:"channelAdminLogEventActionDeleteTopic",params:[{name:"topic",type:"ForumTopic"}],type:"ChannelAdminLogEventAction"},{id:1569535291,predicate:"channelAdminLogEventActionPinTopic",params:[{name:"flags",type:"#"},{name:"prev_topic",type:"flags.0?ForumTopic"},{name:"new_topic",type:"flags.1?ForumTopic"}],type:"ChannelAdminLogEventAction"},{id:37687451,predicate:"forumTopicDeleted",params:[{name:"id",type:"int"}],type:"ForumTopic"},{id:1903173033,predicate:"forumTopic",params:[{name:"flags",type:"#"},{name:"my",type:"flags.1?true"},{name:"closed",type:"flags.2?true"},{name:"pinned",type:"flags.3?true"},{name:"short",type:"flags.5?true"},{name:"hidden",type:"flags.6?true"},{name:"id",type:"int"},{name:"date",type:"int"},{name:"title",type:"string"},{name:"icon_color",type:"int"},{name:"icon_emoji_id",type:"flags.0?long"},{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:"unread_reactions_count",type:"int"},{name:"from_id",type:"Peer"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"draft",type:"flags.4?DraftMessage"}],type:"ForumTopic"},{id:913709011,predicate:"messages.forumTopics",params:[{name:"flags",type:"#"},{name:"order_by_create_date",type:"flags.0?true"},{name:"count",type:"int"},{name:"topics",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"pts",type:"int"}],type:"messages.ForumTopics"},{id:228168278,predicate:"messageActionTopicCreate",params:[{name:"flags",type:"#"},{name:"title",type:"string"},{name:"icon_color",type:"int"},{name:"icon_emoji_id",type:"flags.0?long"}],type:"MessageAction"},{id:-1064024032,predicate:"messageActionTopicEdit",params:[{name:"flags",type:"#"},{name:"title",type:"flags.0?string"},{name:"icon_emoji_id",type:"flags.1?long"},{name:"closed",type:"flags.2?Bool"},{name:"hidden",type:"flags.3?Bool"}],type:"MessageAction"},{id:422509539,predicate:"updateChannelPinnedTopic",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"channel_id",type:"long"},{name:"topic_id",type:"int"}],type:"Update"},{id:1548122514,predicate:"inputNotifyForumTopic",params:[{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"int"}],type:"InputNotifyPeer"},{id:577659656,predicate:"notifyForumTopic",params:[{name:"peer",type:"Peer"},{name:"top_msg_id",type:"int"}],type:"NotifyPeer"},{id:1153562857,predicate:"inputStickerSetEmojiDefaultTopicIcons",params:[],type:"InputStickerSet"},{id:406407439,predicate:"messages.sponsoredMessagesEmpty",params:[],type:"messages.SponsoredMessages"},{id:-31881726,predicate:"updateChannelPinnedTopics",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"order",type:"flags.0?Vector"}],type:"Update"},{id:1135897376,predicate:"defaultHistoryTTL",params:[{name:"period",type:"int"}],type:"DefaultHistoryTTL"},{id:116234636,predicate:"auth.codeTypeFragmentSms",params:[],type:"auth.CodeType"},{id:-648651719,predicate:"auth.sentCodeTypeFragmentSms",params:[{name:"url",type:"string"},{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:1103040667,predicate:"exportedContactToken",params:[{name:"url",type:"string"},{name:"expires",type:"int"}],type:"ExportedContactToken"},{id:1693675004,predicate:"channelAdminLogEventActionToggleAntiSpam",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:1474192222,predicate:"messageActionSuggestProfilePhoto",params:[{name:"photo",type:"Photo"}],type:"MessageAction"},{id:-404267113,predicate:"messageActionAttachMenuBotAllowed",params:[],type:"MessageAction"},{id:2008112412,predicate:"stickerSetNoCovered",params:[{name:"set",type:"StickerSet"}],type:"StickerSetCovered"},{id:542282808,predicate:"updateUser",params:[{name:"user_id",type:"long"}],type:"Update"}],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:-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:-1923962543,method:"auth.signIn",params:[{name:"flags",type:"#"},{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"flags.0?string"},{name:"email_verification",type:"flags.1?EmailVerification"}],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:-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: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: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: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:482476935,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:"update_stickersets_order",type:"flags.15?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.9?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:1967638886,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:"update_stickersets_order",type:"flags.15?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.9?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:-966673468,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:"top_msg_id",type:"flags.9?int"},{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:3450904,method:"messages.createChat",params:[{name:"flags",type:"#"},{name:"users",type:"Vector"},{name:"title",type:"string"},{name:"ttl_period",type:"flags.0?int"}],type:"Updates"},{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:473782614,method:"photos.updateProfilePhoto",params:[{name:"flags",type:"#"},{name:"fallback",type:"flags.0?true"},{name:"id",type:"InputPhoto"}],type:"photos.Photo"},{id:-1980559511,method:"photos.uploadProfilePhoto",params:[{name:"flags",type:"#"},{name:"fallback",type:"flags.3?true"},{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:-1291540959,method:"upload.saveFilePart",params:[{name:"file_id",type:"long"},{name:"file_part",type:"int"},{name:"bytes",type:"bytes"}],type:"Bool"},{id:-1101843010,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:"long"},{name:"limit",type:"int"}],type:"upload.File"},{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:-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: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:-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:-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:-1663104819,method:"help.getSupport",params:[],type:"help.Support"},{id:916930423,method:"messages.readMessageContents",params:[{name:"id",type:"Vector"}],type:"messages.AffectedMessages"},{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:301470424,method:"contacts.search",params:[{name:"q",type:"string"},{name:"limit",type:"int"}],type:"contacts.Found"},{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:-1564422284,method:"account.deleteAccount",params:[{name:"flags",type:"#"},{name:"reason",type:"string"},{name:"password",type:"flags.0?InputCheckPasswordSRP"}],type:"Bool"},{id:150761757,method:"account.getAccountTTL",params:[],type:"AccountDaysTTL"},{id:608323678,method:"account.setAccountTTL",params:[{name:"ttl",type:"AccountDaysTTL"}],type:"Bool"},{id:-627372787,method:"invokeWithLayer",params:[{name:"layer",type:"int"},{name:"query",type:"!X"}],type:"X"},{id:-113456221,method:"contacts.resolveUsername",params:[{name:"username",type:"string"}],type:"contacts.ResolvedPeer"},{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:-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:954152242,method:"account.updateDeviceLocked",params:[{name:"period",type:"int"}],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:-1956073268,method:"messages.getWebPagePreview",params:[{name:"flags",type:"#"},{name:"message",type:"string"},{name:"entities",type:"flags.3?Vector"}],type:"MessageMedia"},{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:-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:-1080796745,method:"invokeWithoutUpdates",params:[{name:"query",type:"!X"}],type:"X"},{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:-1877938321,method:"help.getAppChangelog",params:[{name:"prev_app_version",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:-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:-1862244601,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"},{name:"ttl_period",type:"flags.4?int"}],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: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:-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:"emojis",type:"flags.1?true"},{name:"order",type:"Vector"}],type:"Bool"},{id:-1309538785,method:"messages.getDocumentByHash",params:[{name:"sha256",type:"bytes"},{name:"size",type:"long"},{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:-738468661,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:"top_msg_id",type:"flags.9?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:-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: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:-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:-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:-462373635,method:"messages.getPeerDialogs",params:[{name:"peers",type:"Vector"}],type:"messages.PeerDialogs"},{id:-1271718337,method:"messages.saveDraft",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.2?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:"emojis",type:"flags.1?true"},{name:"offset_id",type:"long"},{name:"limit",type:"int"}],type:"messages.ArchivedStickers"},{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:-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: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:-1907842680,method:"auth.dropTempAuthKeys",params:[{name:"except_auth_keys",type:"Vector"}],type:"Bool"},{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:-333262899,method:"help.setBotUpdatesStatus",params:[{name:"pending_updates_count",type:"int"},{name:"message",type:"string"}],type:"Bool"},{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:-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:619086221,method:"upload.getWebFile",params:[{name:"location",type:"InputWebFileLocation"},{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"upload.WebFile"},{id:924093883,method:"payments.getPaymentForm",params:[{name:"flags",type:"#"},{name:"invoice",type:"InputInvoice"},{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:-1228345045,method:"payments.validateRequestedInfo",params:[{name:"flags",type:"#"},{name:"save",type:"flags.0?true"},{name:"invoice",type:"InputInvoice"},{name:"info",type:"PaymentRequestedInfo"}],type:"payments.ValidatedRequestedInfo"},{id:755192367,method:"payments.sendPaymentForm",params:[{name:"flags",type:"#"},{name:"form_id",type:"long"},{name:"invoice",type:"InputInvoice"},{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:1151208273,method:"account.getTmpPassword",params:[{name:"password",type:"InputCheckPasswordSRP"},{name:"period",type:"int"}],type:"account.TmpPassword"},{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:-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:-1876841625,method:"stickers.createStickerSet",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"animated",type:"flags.1?true"},{name:"videos",type:"flags.4?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:1369162417,method:"messages.uploadMedia",params:[{name:"peer",type:"InputPeer"},{name:"media",type:"InputMedia"}],type:"MessageMedia"},{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:962554330,method:"upload.getCdnFile",params:[{name:"file_token",type:"bytes"},{name:"offset",type:"long"},{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:1375900482,method:"help.getCdnConfig",params:[],type:"CdnConfig"},{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:-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:-1847836879,method:"upload.getCdnFileHashes",params:[{name:"file_token",type:"bytes"},{name:"offset",type:"long"}],type:"Vector"},{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:-359881479,method:"channels.setStickers",params:[{name:"channel",type:"InputChannel"},{name:"stickerset",type:"InputStickerSet"}],type:"Bool"},{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:-357180360,method:"channels.readMessageContents",params:[{name:"channel",type:"InputChannel"},{name:"id",type:"Vector"}],type:"Bool"},{id:-2020263951,method:"contacts.resetSaved",params:[],type:"Bool"},{id:-251140208,method:"messages.getUnreadMentions",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?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"}],type:"messages.Messages"},{id:-1683319225,method:"channels.deleteHistory",params:[{name:"flags",type:"#"},{name:"for_everyone",type:"flags.0?true"},{name:"channel",type:"InputChannel"},{name:"max_id",type:"int"}],type:"Updates"},{id:1036054804,method:"help.getRecentMeUrls",params:[{name:"referer",type:"string"}],type:"help.RecentMeUrls"},{id:-356796084,method:"channels.togglePreHistoryHidden",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:921026381,method:"messages.readMentions",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"}],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:-1225713124,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:"update_stickersets_order",type:"flags.15?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.9?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: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: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:-1856595926,method:"upload.getFileHashes",params:[{name:"location",type:"InputFileLocation"},{name:"offset",type:"long"}],type:"Vector"},{id:749019089,method:"help.getTermsOfServiceUpdate",params:[],type:"help.TermsOfServiceUpdate"},{id:-294455398,method:"help.acceptTermsOfService",params:[{name:"id",type:"DataJSON"}],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:-1865902923,method:"users.setSecureValueErrors",params:[{name:"id",type:"InputUser"},{name:"errors",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:-1730136133,method:"account.sendVerifyEmailCode",params:[{name:"purpose",type:"EmailVerifyPurpose"},{name:"email",type:"string"}],type:"account.SentEmailCode"},{id:53322959,method:"account.verifyEmail",params:[{name:"purpose",type:"EmailVerifyPurpose"},{name:"verification",type:"EmailVerification"}],type:"account.EmailVerified"},{id:1072547679,method:"help.getDeepLinkInfo",params:[{name:"path",type:"string"}],type:"help.DeepLinkInfo"},{id:-2098076769,method:"contacts.getSaved",params:[],type:"Vector"},{id:-2092831552,method:"channels.getLeftChannels",params:[{name:"offset",type:"int"}],type:"messages.Chats"},{id:-1896617296,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?long"}],type:"account.Takeout"},{id:489050862,method:"account.finishTakeoutSession",params:[{name:"flags",type:"#"},{name:"success",type:"flags.0?true"}],type:"Bool"},{id:486505992,method:"messages.getSplitRanges",params:[],type:"Vector"},{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:-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:-2062238246,method:"contacts.toggleTopPeers",params:[{name:"enabled",type:"Bool"}],type:"Bool"},{id:2119757468,method:"messages.clearAllDrafts",params:[],type:"Bool"},{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:1784243458,method:"langpack.getLanguage",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"}],type:"LangPackLanguage"},{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:-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:-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:-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: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:-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: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: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:11435201,method:"messages.getSearchCounters",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"},{name:"filters",type:"Vector"}],type:"Vector"},{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: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:-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:-1892102881,method:"channels.editCreator",params:[{name:"channel",type:"InputChannel"},{name:"user_id",type:"InputUser"},{name:"password",type:"InputCheckPasswordSRP"}],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: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:-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: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:978872812,method:"account.getTheme",params:[{name:"format",type:"string"},{name:"theme",type:"InputTheme"}],type:"Theme"},{id:1913054296,method:"account.getThemes",params:[{name:"format",type:"string"},{name:"hash",type:"long"}],type:"account.Themes"},{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:-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:300429806,method:"channels.getInactiveChannels",params:[],type:"messages.InactiveChats"},{id:1705865692,method:"account.getMultiWallPapers",params:[{name:"wallpapers",type:"Vector"}],type:"Vector"},{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:779736953,method:"payments.getBankCardData",params:[{name:"number",type:"string"}],type:"payments.BankCardData"},{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:-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:-1707717072,method:"stickers.setStickerSetThumb",params:[{name:"stickerset",type:"InputStickerSet"},{name:"thumb",type:"InputDocument"}],type:"messages.StickerSet"},{id:85399130,method:"bots.setBotCommands",params:[{name:"scope",type:"BotCommandScope"},{name:"lang_code",type:"string"},{name:"commands",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:-1063816159,method:"help.getPromoData",params:[],type:"help.PromoData"},{id:505748629,method:"help.hidePromoData",params:[{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-8744061,method:"phone.sendSignalingData",params:[{name:"peer",type:"InputPhoneCall"},{name:"data",type:"bytes"}],type:"Bool"},{id:-589330937,method:"stats.getMegagroupStats",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"channel",type:"InputChannel"}],type:"stats.MegagroupStats"},{id:-349483786,method:"account.getGlobalPrivacySettings",params:[],type:"GlobalPrivacySettings"},{id:517647042,method:"account.setGlobalPrivacySettings",params:[{name:"settings",type:"GlobalPrivacySettings"}],type:"GlobalPrivacySettings"},{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: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: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: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"},{id:-299714136,method:"messages.unpinAllMessages",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"}],type:"messages.AffectedHistory"},{id:1221445336,method:"phone.createGroupCall",params:[{name:"flags",type:"#"},{name:"rtmp_stream",type:"flags.2?true"},{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: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:-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:187239529,method:"channels.convertToGigagroup",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:1573261059,method:"messages.checkHistoryImportPeer",params:[{name:"peer",type:"InputPeer"}],type:"messages.CheckedHistoryImportPeer"},{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: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: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:-1828139493,method:"account.resetPassword",params:[],type:"account.ResetPasswordResult"},{id:1284770294,method:"account.declinePasswordReset",params:[],type:"Bool"},{id:221691769,method:"auth.checkRecoveryPassword",params:[{name:"code",type:"string"}],type:"Bool"},{id:-700916087,method:"account.getChatThemes",params:[{name:"hash",type:"long"}],type:"account.Themes"},{id:-432283329,method:"messages.setChatTheme",params:[{name:"peer",type:"InputPeer"},{name:"emoticon",type:"string"}],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: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:231174382,method:"channels.getSendAs",params:[{name:"peer",type:"InputPeer"}],type:"channels.SendAsPeers"},{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:913655003,method:"channels.deleteParticipantHistory",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"}],type:"messages.AffectedHistory"},{id:-754091820,method:"messages.sendReaction",params:[{name:"flags",type:"#"},{name:"big",type:"flags.1?true"},{name:"add_to_recent",type:"flags.2?true"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"reaction",type:"flags.0?Vector"}],type:"Updates"},{id:-1950707482,method:"messages.getMessagesReactions",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:1176190792,method:"messages.getMessageReactionsList",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"reaction",type:"flags.0?Reaction"},{name:"offset",type:"flags.1?string"},{name:"limit",type:"int"}],type:"messages.MessageReactionsList"},{id:-21928079,method:"messages.setChatAvailableReactions",params:[{name:"peer",type:"InputPeer"},{name:"available_reactions",type:"ChatReactions"}],type:"Updates"},{id:417243308,method:"messages.getAvailableReactions",params:[{name:"hash",type:"int"}],type:"messages.AvailableReactions"},{id:1330094102,method:"messages.setDefaultReaction",params:[{name:"reaction",type:"Reaction"}],type:"Bool"},{id:617508334,method:"messages.translateText",params:[{name:"flags",type:"#"},{name:"peer",type:"flags.0?InputPeer"},{name:"msg_id",type:"flags.0?int"},{name:"text",type:"flags.1?string"},{name:"from_lang",type:"flags.2?string"},{name:"to_lang",type:"string"}],type:"messages.TranslatedText"},{id:841173339,method:"messages.getUnreadReactions",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?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"}],type:"messages.Messages"},{id:1420459918,method:"messages.readReactions",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"}],type:"messages.AffectedHistory"},{id:-1963375804,method:"contacts.resolvePhone",params:[{name:"phone",type:"string"}],type:"contacts.ResolvedPeer"},{id:447879488,method:"phone.getGroupCallStreamChannels",params:[{name:"call",type:"InputGroupCall"}],type:"phone.GroupCallStreamChannels"},{id:-558650433,method:"phone.getGroupCallStreamRtmpUrl",params:[{name:"peer",type:"InputPeer"},{name:"revoke",type:"Bool"}],type:"phone.GroupCallStreamRtmpUrl"},{id:276705696,method:"messages.searchSentMedia",params:[{name:"q",type:"string"},{name:"filter",type:"MessagesFilter"},{name:"limit",type:"int"}],type:"messages.Messages"},{id:385663691,method:"messages.getAttachMenuBots",params:[{name:"hash",type:"long"}],type:"AttachMenuBots"},{id:1998676370,method:"messages.getAttachMenuBot",params:[{name:"bot",type:"InputUser"}],type:"AttachMenuBotsBot"},{id:1777704297,method:"messages.toggleBotInAttachMenu",params:[{name:"flags",type:"#"},{name:"write_allowed",type:"flags.0?true"},{name:"bot",type:"InputUser"},{name:"enabled",type:"Bool"}],type:"Bool"},{id:395003915,method:"messages.requestWebView",params:[{name:"flags",type:"#"},{name:"from_bot_menu",type:"flags.4?true"},{name:"silent",type:"flags.5?true"},{name:"peer",type:"InputPeer"},{name:"bot",type:"InputUser"},{name:"url",type:"flags.1?string"},{name:"start_param",type:"flags.3?string"},{name:"theme_params",type:"flags.2?DataJSON"},{name:"platform",type:"string"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.9?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"WebViewResult"},{id:2146648841,method:"messages.prolongWebView",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"peer",type:"InputPeer"},{name:"bot",type:"InputUser"},{name:"query_id",type:"long"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.9?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Bool"},{id:698084494,method:"messages.requestSimpleWebView",params:[{name:"flags",type:"#"},{name:"bot",type:"InputUser"},{name:"url",type:"string"},{name:"theme_params",type:"flags.0?DataJSON"},{name:"platform",type:"string"}],type:"SimpleWebViewResult"},{id:172168437,method:"messages.sendWebViewResultMessage",params:[{name:"bot_query_id",type:"string"},{name:"result",type:"InputBotInlineResult"}],type:"WebViewMessageSent"},{id:-603831608,method:"messages.sendWebViewData",params:[{name:"bot",type:"InputUser"},{name:"random_id",type:"long"},{name:"button_text",type:"string"},{name:"data",type:"string"}],type:"Updates"},{id:1157944655,method:"bots.setBotMenuButton",params:[{name:"user_id",type:"InputUser"},{name:"button",type:"BotMenuButton"}],type:"Bool"},{id:-1671369944,method:"bots.getBotMenuButton",params:[{name:"user_id",type:"InputUser"}],type:"BotMenuButton"},{id:-510647672,method:"account.getSavedRingtones",params:[{name:"hash",type:"long"}],type:"account.SavedRingtones"},{id:1038768899,method:"account.saveRingtone",params:[{name:"id",type:"InputDocument"},{name:"unsave",type:"Bool"}],type:"account.SavedRingtone"},{id:-2095414366,method:"account.uploadRingtone",params:[{name:"file",type:"InputFile"},{name:"file_name",type:"string"},{name:"mime_type",type:"string"}],type:"Document"},{id:2021942497,method:"bots.setBotBroadcastDefaultAdminRights",params:[{name:"admin_rights",type:"ChatAdminRights"}],type:"Bool"},{id:-1839281686,method:"bots.setBotGroupDefaultAdminRights",params:[{name:"admin_rights",type:"ChatAdminRights"}],type:"Bool"},{id:1092913030,method:"phone.saveCallLog",params:[{name:"peer",type:"InputPhoneCall"},{name:"file",type:"InputFile"}],type:"Bool"},{id:-456419968,method:"channels.toggleJoinToSend",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:1277789622,method:"channels.toggleJoinRequest",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:261206117,method:"payments.exportInvoice",params:[{name:"invoice_media",type:"InputMedia"}],type:"payments.ExportedInvoice"},{id:647928393,method:"messages.transcribeAudio",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"messages.TranscribedAudio"},{id:2132608815,method:"messages.rateTranscribedAudio",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"transcription_id",type:"long"},{name:"good",type:"Bool"}],type:"Bool"},{id:-2131921795,method:"payments.assignAppStoreTransaction",params:[{name:"receipt",type:"bytes"},{name:"purpose",type:"InputStorePaymentPurpose"}],type:"Updates"},{id:-537046829,method:"payments.assignPlayMarketTransaction",params:[{name:"receipt",type:"DataJSON"},{name:"purpose",type:"InputStorePaymentPurpose"}],type:"Updates"},{id:-1614700874,method:"payments.canPurchasePremium",params:[{name:"purpose",type:"InputStorePaymentPurpose"}],type:"Bool"},{id:-1206152236,method:"help.getPremiumPromo",params:[],type:"help.PremiumPromo"},{id:-643100844,method:"messages.getCustomEmojiDocuments",params:[{name:"document_id",type:"Vector"}],type:"Vector"},{id:-67329649,method:"messages.getEmojiStickers",params:[{name:"hash",type:"long"}],type:"messages.AllStickers"},{id:248473398,method:"messages.getFeaturedEmojiStickers",params:[{name:"hash",type:"long"}],type:"messages.FeaturedStickers"},{id:-70001045,method:"account.updateEmojiStatus",params:[{name:"emoji_status",type:"EmojiStatus"}],type:"Bool"},{id:-696962170,method:"account.getDefaultEmojiStatuses",params:[{name:"hash",type:"long"}],type:"account.EmojiStatuses"},{id:257392901,method:"account.getRecentEmojiStatuses",params:[{name:"hash",type:"long"}],type:"account.EmojiStatuses"},{id:404757166,method:"account.clearRecentEmojiStatuses",params:[],type:"Bool"},{id:1063567478,method:"messages.reportReaction",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"reaction_peer",type:"InputPeer"}],type:"Bool"},{id:-1149164102,method:"messages.getTopReactions",params:[{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.Reactions"},{id:960896434,method:"messages.getRecentReactions",params:[{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.Reactions"},{id:-1644236876,method:"messages.clearRecentReactions",params:[],type:"Bool"},{id:-2064119788,method:"messages.getExtendedMedia",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:767062953,method:"auth.importWebTokenAuthorization",params:[{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"web_auth_token",type:"string"}],type:"auth.Authorization"},{id:-279966037,method:"account.reorderUsernames",params:[{name:"order",type:"Vector"}],type:"Bool"},{id:1490465654,method:"account.toggleUsername",params:[{name:"username",type:"string"},{name:"active",type:"Bool"}],type:"Bool"},{id:-1268978403,method:"channels.reorderUsernames",params:[{name:"channel",type:"InputChannel"},{name:"order",type:"Vector"}],type:"Bool"},{id:1358053637,method:"channels.toggleUsername",params:[{name:"channel",type:"InputChannel"},{name:"username",type:"string"},{name:"active",type:"Bool"}],type:"Bool"},{id:170155475,method:"channels.deactivateAllUsernames",params:[{name:"channel",type:"InputChannel"}],type:"Bool"},{id:-1540781271,method:"channels.toggleForum",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:-200539612,method:"channels.createForumTopic",params:[{name:"flags",type:"#"},{name:"channel",type:"InputChannel"},{name:"title",type:"string"},{name:"icon_color",type:"flags.0?int"},{name:"icon_emoji_id",type:"flags.3?long"},{name:"random_id",type:"long"},{name:"send_as",type:"flags.2?InputPeer"}],type:"Updates"},{id:233136337,method:"channels.getForumTopics",params:[{name:"flags",type:"#"},{name:"channel",type:"InputChannel"},{name:"q",type:"flags.0?string"},{name:"offset_date",type:"int"},{name:"offset_id",type:"int"},{name:"offset_topic",type:"int"},{name:"limit",type:"int"}],type:"messages.ForumTopics"},{id:-1333584199,method:"channels.getForumTopicsByID",params:[{name:"channel",type:"InputChannel"},{name:"topics",type:"Vector"}],type:"messages.ForumTopics"},{id:-186670715,method:"channels.editForumTopic",params:[{name:"flags",type:"#"},{name:"channel",type:"InputChannel"},{name:"topic_id",type:"int"},{name:"title",type:"flags.0?string"},{name:"icon_emoji_id",type:"flags.1?long"},{name:"closed",type:"flags.2?Bool"},{name:"hidden",type:"flags.3?Bool"}],type:"Updates"},{id:1814925350,method:"channels.updatePinnedForumTopic",params:[{name:"channel",type:"InputChannel"},{name:"topic_id",type:"int"},{name:"pinned",type:"Bool"}],type:"Updates"},{id:876830509,method:"channels.deleteTopicHistory",params:[{name:"channel",type:"InputChannel"},{name:"top_msg_id",type:"int"}],type:"messages.AffectedHistory"},{id:693150095,method:"channels.reorderPinnedForumTopics",params:[{name:"flags",type:"#"},{name:"force",type:"flags.0?true"},{name:"channel",type:"InputChannel"},{name:"order",type:"Vector"}],type:"Updates"},{id:1760814315,method:"channels.toggleAntiSpam",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:-1471109485,method:"channels.reportAntiSpamFalsePositive",params:[{name:"channel",type:"InputChannel"},{name:"msg_id",type:"int"}],type:"Bool"},{id:-1632299963,method:"messages.setDefaultHistoryTTL",params:[{name:"period",type:"int"}],type:"Bool"},{id:1703637384,method:"messages.getDefaultHistoryTTL",params:[],type:"DefaultHistoryTTL"},{id:-127582169,method:"contacts.exportContactToken",params:[],type:"ExportedContactToken"},{id:318789512,method:"contacts.importContactToken",params:[{name:"token",type:"string"}],type:"User"},{id:-1189444673,method:"photos.uploadContactProfilePhoto",params:[{name:"flags",type:"#"},{name:"suggest",type:"flags.3?true"},{name:"save",type:"flags.4?true"},{name:"user_id",type:"InputUser"},{name:"file",type:"flags.0?InputFile"},{name:"video",type:"flags.1?InputFile"},{name:"video_start_ts",type:"flags.2?double"}],type:"photos.Photo"},{id:1785624660,method:"channels.toggleParticipantsHidden",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"}]},layer:151};var ts=a(745),as=a.n(ts),ss=a(4736),ns=a.n(ss);function is(e){return e>>>0}function rs(e,t){return e=is(e),t=is(t),ns()(e).shiftLeft(32).add(ns()(t))}const os=ns()(Number.MAX_SAFE_INTEGER),ps=ns()(ns()[2]).pow(64),ds=ps.divide(ns()[2]);function fs(e,t=256){return ns().fromArray(e instanceof Uint8Array?[...e]:e,t)}const cs=+es.API.constructors.find((e=>"boolFalse"===e.predicate)).id,ls=+es.API.constructors.find((e=>"boolTrue"===e.predicate)).id,ms=+es.API.constructors.find((e=>"vector"===e.predicate)).id,gs=+es.MTProto.constructors.find((e=>"gzip_packed"===e.predicate)).id,hs="slice";class us{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(ls,(t||"")+":bool"):this.writeInt(cs,(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);const a=(s=ns()(e)).isNegative()?ps.add(s):s;var s;const{quotient:n,remainder:i}=a.divmod(4294967296),r=n.toJSNumber(),o=i.toJSNumber();this.writeInt(o,(t||"")+":long[low]"),this.writeInt(r,(t||"")+":long[high]")}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>>",T(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(">>>",T(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(">>>",T(e),t||""),this.checkLength(a),this.byteView.set(e,this.offset),this.offset+=a}storeMethod(e,t){const a=(this.mtproto?es.MTProto:es.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(const 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(ms,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(const t in p)this.intView[p[t]]=e[t];return r.type}}class ys{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),T(this.byteView.slice(this.offset-16,this.offset+16))),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]");let a=rs(this.readInt((e||"")+":long[high]"),t);var s;return this.mtproto||(a=(s=a).greater(ds)?s.minus(ps):s),!this.mtproto&&os.greaterOrEquals(a.abs())?a.toJSNumber():a.toString(10)}fetchBool(e){const t=this.readInt((e||"")+":bool");return t===ls||t!==cs&&(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[hs](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 r=this.readInt(t+"[id]");if(r===gs){const a=(i=this.fetchBytes(t+"[packed_string]"),as().inflate(i,void 0));return new ys(a).fetchObject(e,t)}if(r===ms)return this.fetchVector(e,t);let o=a.constructorsIndex;if(!o){a.constructorsIndex=o={};for(let e=0,t=a.constructors.length;e0&&r{var e;if(this.pingDelayDisconnectDeferred||!this.transport||!this.transport.connected)return;const t=this.pingDelayDisconnectDeferred=(0,v.Z)(),a=this.delays,s=this.delays.pingMaxTime,n=Math.min(null!==(e=this.lastPingTime)&&void 0!==e?e:0,s),i=Math.round(a.disconnectDelayMin+n/s*(a.disconnectDelayMax-a.disconnectDelayMin)),r=1e3*i,o=this.lastPingStartTime=Date.now(),p=this.lastPingDelayDisconnectId=(0,Te.a)(),d={notContentRelated:!0};this.wrapMtpCall("ping_delay_disconnect",{ping_id:p,disconnect_delay:i},d);const f=this.log.bindPrefix("sendPingDelayDisconnect");this.debug&&f.debug(`ping, timeout=${r}, lastPingTime=${this.lastPingTime}, msgId=${d.messageId}, pingId=${p}`);const c=E.Z.setTimeout(t.reject,r);t.then((e=>{clearTimeout(c);const t=Date.now()-o;if(this.lastPingTime=t/1e3,this.debug&&f.debug(`pong, reason='${e}', time=${n}, msgId=${d.messageId}`),t>r)throw void 0;return(0,P.Z)(Math.max(0,this.delays.pingInterval-t))})).catch((()=>{clearTimeout(c);const e=this.transport;this.pingDelayDisconnectDeferred===t&&(null==e?void 0:e.connection)&&(f.error("catch, closing connection",this.lastPingTime,d.messageId),e.connection.close())})).finally((()=>{this.pingDelayDisconnectDeferred===t&&(this.pingDelayDisconnectDeferred=void 0,this.sendPingDelayDisconnect())}))},this.checkLongPoll=()=>{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 us({mtproto:!0}),a=(0,Te.a)();t.storeMethod("ping",{ping_id:a});const s={msg_id:this.timeManager.generateId(),seq_no:this.generateSeqNo(!0),body:t.getBytes(!0)};this.offline&&this.setConnectionStatus(U.Q.Connecting),this.sendEncryptedRequest(s).then((()=>{this.toggleOffline(!1)}),(()=>{this.debug&&this.log("Delay",1e3*this.checkConnectionPeriod),this.checkConnectionTimeout=E.Z.setTimeout((()=>this.checkConnection("from failed checkConnection request")),1e3*this.checkConnectionPeriod|0),this.checkConnectionPeriod=Math.min(60,1.5*this.checkConnectionPeriod)}))},this.authKeyUint8=(0,bs.Z)(this.authKey),this.serverSalt=(0,bs.Z)(i),this.isFileUpload=!!r.fileUpload,this.isFileDownload=!!r.fileDownload,this.isFileNetworker=this.isFileUpload||this.isFileDownload,this.delays=this.isFileNetworker?Is.file:Is.client;const o=this.isFileUpload?"-U":this.isFileDownload?"-D":"";this.name="NET-"+a+o,this.log=(0,I.kg)(this.name+(o?"":"-C")+"-"+ws++,I.v9.Log|I.v9.Error|I.v9.Warn),this.log("constructor"),this.updateSession()}updateSession(){this.seqNo=0,this.prevSessionId=this.sessionId,this.sessionId=w(new Uint8Array(8))}updateSentMessage(e){const t=this.sentMessages[e];return!!t&&(t.container&&(0,ne.Z)(t.inner,((e,a)=>{const s=this.updateSentMessage(e);s?t.inner[a]=s.msg_id:t.inner.splice(a,1)})),t.msg_id=this.timeManager.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 us({mtproto:!0});s.storeMethod(e,t);const n=this.timeManager.generateId(),i=this.generateSeqNo(),r={msg_id:n,seq_no:i,body:s.getBytes(!0)};return b.Z.debug&&this.log("MT call",e,t,n,i),this.pushMessage(r,a)}wrapMtpMessage(e,t){const a=new us({mtproto:!0});a.storeObject(e,"Object");const s=this.timeManager.generateId(),n=this.generateSeqNo(t.notContentRelated),i={msg_id:s,seq_no:n,body:a.getBytes(!0)};return b.Z.debug&&this.log("MT message",e,s,n),this.pushMessage(i,t)}wrapApiCall(e,t={},a={}){const s=new us(a);if(!this.connectionInited){const e=es.API.methods.find((e=>"invokeWithLayer"===e.method));if(!e)throw new Error("no invokeWithLayer!");s.storeInt(+e.id,"invokeWithLayer"),s.storeInt(es.layer,"layer");const t=es.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(_.Z.id,"api_id"),s.storeString(i().USER_AGENT||"Unknown UserAgent","device_model"),s.storeString(navigator.platform||"Unknown Platform","system_version"),s.storeString(_.Z.version+(_.Z.isMainDomain?" "+_.Z.suffix:""),"app_version"),s.storeString(navigator.language||"en","system_lang_code"),s.storeString(_.Z.langPack,"lang_pack"),s.storeString(this.networkerFactory.language,"lang_code")}if(a.afterMessageId){if(void 0===Cs){const e=es.API.methods.find((e=>"invokeAfterMsg"===e.method));Cs=e?+e.id:0}Cs?(s.storeInt(Cs,"invokeAfterMsg"),s.storeLong(a.afterMessageId,"msg_id")):this.log.error("no invokeAfterMsg!")}a.resultType=s.storeMethod(e,t);const n={msg_id:this.timeManager.generateId(),seq_no:this.generateSeqNo(),body:s.getBytes(!0),isAPI:!0};return b.Z.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(),this.nextReqTimeout&&(clearTimeout(this.nextReqTimeout),this.nextReqTimeout=0,this.nextReq=0),this.connectionInited=!1,void 0!==this.longPollInterval&&(clearInterval(this.longPollInterval),this.longPollInterval=void 0),this.clearCheckConnectionTimeout()),this.log("change transport",e,t),this.clearPingDelayDisconnect(),this.transport=e,e&&(e.networker=this,e instanceof S&&(this.longPollInterval=E.Z.setInterval(this.checkLongPoll,1e4),this.checkLongPoll(),this.checkConnection("changed transport")),e.connection&&e.connected&&this.setConnectionStatus(U.Q.Connected),this.resend())}destroy(){this.log("destroy")}forceReconnectTimeout(){this.transport.reconnect?this.transport.reconnect():this.resend()}forceReconnect(){this.transport.forceReconnect?this.transport.forceReconnect():this.checkConnection("force reconnect")}clearPingDelayDisconnect(){const e=this.pingDelayDisconnectDeferred;this.pingDelayDisconnectDeferred=void 0,this.lastPingDelayDisconnectId=void 0,e&&e.reject()}sendLongPoll(){this.sendingLongPoll||(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(U.Q.Closed,this.checkConnectionRetryAt),this.checkConnectionTimeout=E.Z.setTimeout((()=>this.checkConnection("from toggleOfline")),e),this.checkConnectionPeriod=Math.min(30,1.5*(1+this.checkConnectionPeriod))}else this.setConnectionStatus(U.Q.Connected),this.checkLongPoll(),this.scheduleRequest();this.setConnectionStatus(e?U.Q.Closed:U.Q.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=>{const t=this.sentMessages;a.forEach((a=>{const s=t[a];if(s){const n=s.deferred;delete t[a],delete this.pendingMessages[a],e?n.resolve():n.reject()}}))}))}pushMessage(e,t){let a;return t.notContentRelated&&!t.noResponse||(a=(0,v.Z)()),this.sentMessages[e.msg_id]=Object.assign(e,t,a?{deferred:a}:void 0),this.pendingMessages[e.msg_id]=0,t.noSchedule||this.scheduleRequest(),(0,fe.Z)(t)&&(t.messageId=e.msg_id),a}attachPromise(e,t){const a=setTimeout((()=>{this.lastResponseTime&&Date.now()-this.lastResponseTime{clearTimeout(a),this.setConnectionStatus(U.Q.Connected),--this.activeRequests,this.setDrainTimeout()})),++this.activeRequests,void 0!==this.onDrainTimeout&&(clearTimeout(this.onDrainTimeout),this.onDrainTimeout=void 0)}setDrainTimeout(){!this.activeRequests&&this.onDrain&&void 0===this.onDrainTimeout&&(this.onDrainTimeout=E.Z.setTimeout((()=>{this.onDrainTimeout=void 0,this.log("drain"),this.onDrain()}),1e4))}setConnectionStatus(e,t){var a;const s=e===U.Q.Connected,n=this.status!==e;this.isOnline=s,this.status=e,n&&(this.networkerFactory.onConnectionStatusChange&&this.networkerFactory.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(),(null===(a=this.transport)||void 0===a?void 0:a.connection)&&(this.clearPingDelayDisconnect(),this.sendPingDelayDisconnect()))}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 Ms(this,void 0,void 0,(function*(){const a=t?0:8,n=(0,_s.Z)(this.authKeyUint8.subarray(88+a,88+a+32),e),i=yield s.Z.invokeCrypto("sha256",n);return new Uint8Array(i).subarray(8,24)}))}getAesKeyIv(e,t){const a=t?0:8,n=new Uint8Array(52),i=new Uint8Array(52),r=[];return n.set(e,0),n.set(this.authKeyUint8.subarray(a,a+36),16),r.push(s.Z.invokeCrypto("sha256",n)),i.set(this.authKeyUint8.subarray(40+a,40+a+36),0),i.set(e,36),r.push(s.Z.invokeCrypto("sha256",i)),Promise.all(r).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 this.networkerFactory.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})}const e=this.pendingResendReq.length;if(e){const t=Object.assign({},Ss),a=this.pendingResendReq.splice(0,e);this.wrapMtpMessage({_:"msg_resend_req",msg_ids:a},t),this.log("resend: resending requests",t.messageId,a)}let t;const a=[];let s=0,n=!1,i=!1,r=!1;const o=Object.keys(this.pendingMessages).map((e=>ns()(e))).sort(((e,t)=>e.compare(t))).map((e=>e.toString(10)));for(const e of o){const o=this.sentMessages[e];if(o&&o.body){const e=o.body.length+32;if(s+e>655360&&(this.log.warn("lengthOverflow",o,a),r=!0,t))break;a.push(o),s+=e,o.isAPI?n=!0:o.longPoll&&(i=!0),t=o}delete this.pendingMessages[e]}if(this.transport instanceof S&&n&&!i){const e=new us({mtproto:!0});e.storeMethod("http_wait",{max_delay:500,wait_after:150,max_wait:3e3}),a.push({msg_id:this.timeManager.generateId(),seq_no:this.generateSeqNo(),body:e.getBytes(!0)})}if(!a.length)return;const p=a.filter((e=>e.noResponse)).map((e=>e.msg_id));if(a.length>1){const e=this.generateContainerMessage(s,a);t=e.messageWithBody,this.sentMessages[t.msg_id]=e.message}else this.sentMessages[t.msg_id]=t;this.pendingAcks=[];const d=this.sendEncryptedRequest(t);this.transport instanceof S&&this.handleSentEncryptedRequestHTTP(d,t,p),this.transport instanceof S||this.cleanupSent(),r&&this.scheduleRequest()}generateContainerMessage(e,t){const a=new us({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:this.timeManager.generateId(),seq_no:this.generateSeqNo(!0),container:!0,inner:s};return b.Z.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 Ms(this,void 0,void 0,(function*(){const t=yield this.getMsgKey(e,!0),a=yield this.getAesKeyIv(t,!0);return{bytes:yield s.Z.invokeCrypto("aes-encrypt",e,a[0],a[1]),msgKey:t}}))}getDecryptedMessage(e,t){return this.getAesKeyIv(e,!1).then((e=>s.Z.invokeCrypto("aes-decrypt",t,e[0],e[1])))}getEncryptedOutput(e){const t=new us({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+(0,Te.d)(8)%5),n=w(new Uint8Array(s)),i=(0,_s.Z)(a,n);return this.getEncryptedMessage(i).then((e=>{const t=new us({startMaxLength:e.bytes.length+256});return t.storeIntBytes(this.authKeyId,64,"auth_key_id"),t.storeIntBytes(e.msgKey,128,"msg_key"),t.storeRawBytes(e.bytes,"encrypted_data"),t.getBytes(!0)}))}sendEncryptedRequest(e){return Ms(this,void 0,void 0,(function*(){const t=yield this.getEncryptedOutput(e);this.transport||this.log.error("trying to send something when offline",this.transport,this),this.debug&&this.log.debug("sending:",e,[e.msg_id].concat(e.inner||[]),t.length);const a=this.transport?this.transport.send(t):Promise.reject({});if(!(this.transport instanceof S))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 ys(e),a=t.fetchIntBytes(64,!0,"auth_key_id");if(!(0,Ps.Z)(a,this.authKeyId))throw new Error("[MT] Invalid server auth_key_id: "+T(a));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(!(0,Ps.Z)(s,t))throw this.log.warn("[MT] msg_keys",s,t),this.updateSession(),new Error("[MT] server msgKey mismatch, updating session");let a=new ys(e,{mtproto:!0});a.fetchIntBytes(64,!0,"salt");const n=a.fetchIntBytes(64,!0,"session_id"),i=a.fetchLong("message_id");if(!((0,Ps.Z)(n,this.sessionId)||this.prevSessionId&&(0,Ps.Z)(n,this.prevSessionId)))throw this.log.warn("Sessions",n,this.sessionId,this.prevSessionId,e),new Error("[MT] Invalid server session_id: "+T(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 f=a.fetchRawBytes(p,!0,"message_data");d=a.getOffset();const c=o-d;if(c<12||c>1024)throw new Error("[MT] Invalid padding length: "+c);return a=new ys(f,{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]"))}}}),{response:a.fetchObject("","INPUT"),messageId:i,sessionId:n,seqNo:r}}))))}applyServerSalt(e){const t=(a=e,vs((s=ns()(a),new Uint8Array(s.toArray(256).value)).reverse(),8,!0,!1,!1));var a,s;qa.Z.set({["dc"+this.dcId+"_server_salt"]:T(t)}),this.serverSalt=new Uint8Array(t)}scheduleRequest(e){this.transport instanceof S&&(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 S&&this.offline||this.performScheduledRequest()};this.nextReq=t,void 0!==e?this.nextReqTimeout=E.Z.setTimeout(a,e):a()}ackMessage(e){let t;this.pendingAcks.push(e),this.transport instanceof S&&(t=3e4),this.scheduleRequest(t)}reqResend(e){this.debug&&this.log.debug("Req resend",e),this.pendingResendReq.push(e),this.scheduleRequest(100)}cleanupSent(){let e=!1;const t=this.sentMessages;return Object.keys(t).forEach((a=>{const s=t[a];if(s.notContentRelated&&void 0===this.pendingMessages[a])delete t[a];else if(s.container){for(const a of s.inner)if(void 0!==t[a])return void(e=!0);delete t[a]}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(){const e=this.sentMessages;for(const t in e){const a=e[t];(a.body||a.container)&&this.pushResend(t)}this.transport.connection&&(this.clearPingDelayDisconnect(),this.sendPingDelayDisconnect())}applyServerTime(e){const t=ns()(e).shiftRight(32).toJSNumber();return this.log("applying server time",t),this.timeManager.applyServerTime(t)}processMessage(e,t,a){if("messageEmpty"!==e._)if(parseInt(t.substr(0,-10),10)%2)this.log.warn("Server even message id: ",t,e);else switch(this.debug&&this.log.debug("process message",e,t),this.pingDelayDisconnectDeferred&&this.pingDelayDisconnectDeferred.resolve("any message"),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=this.applyServerTime(t);(17===e.error_code||a)&&(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),qa.Z.get("dc").then((t=>{t===this.dcId&&!this.isFileNetworker&&this.networkerFactory.updatesProcessor&&this.networkerFactory.updatesProcessor(e)}));break;case"msgs_ack":this.debug&&this.log("got acks",e.msg_ids);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(-1!==this.pendingAcks.indexOf(e.answer_msg_id))break;this.reqResend(e.answer_msg_id);break;case"msgs_state_info":{this.ackMessage(e.answer_msg_id);const t=[[this.lastResendReq,this.pendingResendReq]];for(const[a,s]of t)if((null==a?void 0:a.reqMsgId)===e.req_msg_id&&s.length)for(const e of a.msgIds){const t=s.indexOf(e);-1!==t&&s.splice(t,1)}break}case"rpc_result":{this.ackMessage(t);const a=e.req_msg_id,s=this.sentMessages[a];if(this.debug&&this.log("Rpc response",e.result,s),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.ping_id;if(this.lastPingDelayDisconnectId===t){const e=this.pingDelayDisconnectDeferred;e?e.resolve("pong"):this.log("ping deferred deleted",t)}break}default:this.ackMessage(t),null!==this.networkerFactory.updatesProcessor&&this.networkerFactory.updatesProcessor(e)}else this.log.warn("processMessage: messageEmpty",e,t)}}class As extends G{constructor(){super(...arguments),this.networkers=[],this.language=navigator.language||_.Z.langPackCode,this.updatesProcessor=null,this.akStopped=!1}onConnectionStatusChange(e){this.rootScope.dispatchEvent("connection_status_change",e)}removeNetworker(e){(0,M.Z)(this.networkers,e)}setUpdatesProcessor(e){this.updatesProcessor=e}getNetworker(e,t,a,s,n){const i=new ks(this,this.timeManager,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)}unsetConnectionInited(){for(const e of this.networkers)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}}}const Ds=new class{constructor(){this.testPublicKeysHex=[{modulus:"c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5",exponent:"010001"}],this.publisKeysHex=[{modulus:"e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3",exponent:"010001"}],this.publicKeysParsed={},this.prepared=!1,this.preparePromise=null,b.Z.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 us;t.storeBytes((0,Ha.Z)(e.modulus),"n"),t.storeBytes((0,Ha.Z)(e.exponent),"e");const a=t.getBuffer();return s.Z.invokeCrypto("sha1",a).then((t=>{const a=t.slice(-8);a.reverse(),this.publicKeysParsed[T(a).toLowerCase()]={modulus:e.modulus,exponent:e.exponent}}))}))).then((()=>{this.prepared=!0,this.preparePromise=null}))}select(e){return t=this,a=void 0,n=function*(){yield this.prepare();for(let t=0;t{if(d.ZP&&this.log("mtpSendPlainRequest: in good sector",e),!e||!e.byteLength)throw o;try{const t=new ys(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){throw this.log.error("mtpSendPlainRequest: deserialization went bad",e),Object.assign(o,{originalError:e})}}),(e=>{throw e.message||e.type||(e=Object.assign(o,{originalError:e})),e}))}sendReqPQ(e){return Ts(this,void 0,void 0,(function*(){const t=new us({mtproto:!0});let a;t.storeMethod("req_pq_multi",{nonce:e.nonce}),d.ZP&&this.log("Send req_pq",T(e.nonce));try{const s=this.sendPlainRequest(e.dcId,t.getBytes(!0));Ds.prepare(),a=yield s}catch(e){throw this.log.error("req_pq error",e.message),e}const n=a.fetchObject("ResPQ");if("resPQ"!==n._)throw new Error("[MT] resPQ response invalid: "+n._);if(!(0,Ps.Z)(e.nonce,n.nonce))throw this.log.error(e.nonce,n.nonce),new Error("[MT] resPQ nonce mismatch");e.serverNonce=n.server_nonce,e.pq=n.pq,e.fingerprints=n.server_public_key_fingerprints,d.ZP&&this.log("Got ResPQ",T(e.serverNonce),T(e.pq),e.fingerprints);const i=yield Ds.select(e.fingerprints);if(!i)throw new Error("[MT] No public key found");e.publicKey=i,d.ZP&&this.log("PQ factorization start",e.pq);try{var r=yield s.Z.invokeCrypto("factorize",e.pq)}catch(e){throw this.log.error("worker error factorize",e),e}return e.p=r[0],e.q=r[1],d.ZP&&this.log("PQ factorization done",r),this.sendReqDhParams(e)}))}sendReqDhParams(e){return Ts(this,void 0,void 0,(function*(){e.newNonce=w(new Uint8Array(32));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 us({mtproto:!0});a.storeObject(t,"P_Q_inner_data","DECRYPTED_DATA");const n=a.getBytes(!0);if(n.length>144)throw"DH_params: data is more than 144 bytes!";const i=vs(n,192,!1,!0,!1),r=i.slice().reverse(),o=yield(()=>Ts(this,void 0,void 0,(function*(){for(;;){const t=w(new Uint8Array(32)),a=r.concat(yield s.Z.invokeCrypto("sha256",t.concat(i)));if(224!==a.length)throw"DH_params: dataWithHash !== 224 bytes!";const n=yield s.Z.invokeCrypto("aes-encrypt",a,t,new Uint8Array([0])),o=Us(t,yield s.Z.invokeCrypto("sha256",n)).concat(n),p=fs(o),d=ns()(e.publicKey.modulus,16);if(-1===p.compare(d))return o}})))(),p=vs(yield s.Z.invokeCrypto("rsa-encrypt",o,e.publicKey),256,!0,!0,!0),f={nonce:e.nonce,server_nonce:e.serverNonce,p:e.p,q:e.q,public_key_fingerprint:e.publicKey.fingerprint,encrypted_data:p},c=new us({mtproto:!0});c.storeMethod("req_DH_params",f);const l=c.getBytes(!0);let m;d.ZP&&this.log("Send req_DH_params",f);try{m=yield this.sendPlainRequest(e.dcId,l)}catch(e){throw this.log.error("Send req_DH_params FAIL!",e),e}const g=m.fetchObject("Server_DH_Params","RESPONSE");if(d.ZP&&this.log("Sent req_DH_params, response:",g),"server_DH_params_fail"!==g._&&"server_DH_params_ok"!==g._)throw new Error("[MT] Server_DH_Params response invalid: "+g._);if(!(0,Ps.Z)(e.nonce,g.nonce))throw new Error("[MT] Server_DH_Params nonce mismatch");if(!(0,Ps.Z)(e.serverNonce,g.server_nonce))throw new Error("[MT] Server_DH_Params server_nonce mismatch");if("server_DH_params_fail"===g._){const t=(yield s.Z.invokeCrypto("sha1",e.newNonce)).slice(-16);if(!(0,Ps.Z)(t,g.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,g.encrypted_answer)}catch(e){throw this.log.error("mtpDecryptServerDhDataAnswer FAILED!",e),e}return this.sendSetClientDhParams(e)}))}decryptServerDhDataAnswer(e,t){return Ts(this,void 0,void 0,(function*(){e.localTime=Date.now(),e.tmpAesKey=(yield s.Z.invokeCrypto("sha1",e.newNonce.concat(e.serverNonce))).concat((yield s.Z.invokeCrypto("sha1",e.serverNonce.concat(e.newNonce))).slice(0,12)),e.tmpAesIv=(yield s.Z.invokeCrypto("sha1",e.serverNonce.concat(e.newNonce))).slice(12).concat(yield s.Z.invokeCrypto("sha1",e.newNonce.concat(e.newNonce)),e.newNonce.slice(0,4));const a=new Uint8Array(yield s.Z.invokeCrypto("aes-decrypt",t,e.tmpAesKey,e.tmpAesIv)),n=a.slice(0,20),i=a.slice(20),r=new ys(i,{mtproto:!0}),o=r.fetchObject("Server_DH_inner_data");if("server_DH_inner_data"!==o._)throw new Error("[MT] server_DH_inner_data response invalid: "+o);if(!(0,Ps.Z)(e.nonce,o.nonce))throw new Error("[MT] server_DH_inner_data nonce mismatch");if(!(0,Ps.Z)(e.serverNonce,o.server_nonce))throw new Error("[MT] server_DH_inner_data serverNonce mismatch");d.ZP&&this.log("Done decrypting answer"),e.g=o.g,e.dhPrime=o.dh_prime,e.gA=o.g_a,e.serverTime=o.server_time,e.retry=0,this.verifyDhParams(e.g,e.dhPrime,e.gA);const p=r.getOffset();if(!(0,Ps.Z)(n,yield s.Z.invokeCrypto("sha1",i.slice(0,p))))throw new Error("[MT] server_DH_inner_data SHA1 mismatch");this.timeManager.applyServerTime(e.serverTime,e.localTime)}))}verifyDhParams(e,t,a){d.ZP&&this.log("Verifying DH params",e,t,a);const s=T(t);if(3!==e||"c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b"!==s)throw new Error("[MT] DH params are not verified: unknown dhPrime");d.ZP&&this.log("dhPrime cmp OK");const n=fs(a),i=ns()(s,16);if(n.compare(ns().one)<=0)throw new Error("[MT] DH params are not verified: gA <= 1");if(n.compare(i.subtract(ns().one))>=0)throw new Error("[MT] DH params are not verified: gA >= dhPrime - 1");d.ZP&&this.log("1 < gA < dhPrime-1 OK");const r=ns()(2).pow(1984);if(n.compare(r)<0)throw new Error("[MT] DH params are not verified: gA < 2^{2048-64}");if(n.compare(i.subtract(r))>=0)throw new Error("[MT] DH params are not verified: gA > dhPrime - 2^{2048-64}");return d.ZP&&this.log("2^{2048-64} < gA < dhPrime-2^{2048-64} OK"),!0}sendSetClientDhParams(e){return Ts(this,void 0,void 0,(function*(){const t=(0,Ha.Z)(e.g.toString(16));e.b=w(new Uint8Array(256));try{var a=yield s.Z.invokeCrypto("mod-pow",t,e.b,e.dhPrime)}catch(e){throw e}const n=new us({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 i=(yield s.Z.invokeCrypto("sha1",n.getBuffer())).concat(n.getBytes(!0)),r=yield s.Z.invokeCrypto("aes-encrypt",i,e.tmpAesKey,e.tmpAesIv),o=new us({mtproto:!0});let p;o.storeMethod("set_client_DH_params",{nonce:e.nonce,server_nonce:e.serverNonce,encrypted_data:r}),d.ZP&&this.log("Send set_client_DH_params");try{p=yield this.sendPlainRequest(e.dcId,o.getBytes(!0))}catch(e){throw e}const f=p.fetchObject("Set_client_DH_params_answer");if("dh_gen_ok"!==f._&&"dh_gen_retry"!==f._&&"dh_gen_fail"!==f._)throw new Error("[MT] Set_client_DH_params_answer response invalid: "+f._);if(!(0,Ps.Z)(e.nonce,f.nonce))throw new Error("[MT] Set_client_DH_params_answer nonce mismatch");if(!(0,Ps.Z)(e.serverNonce,f.server_nonce))throw new Error("[MT] Set_client_DH_params_answer server_nonce mismatch");try{var c=yield s.Z.invokeCrypto("mod-pow",e.gA,e.b,e.dhPrime)}catch(e){throw c}const l=yield s.Z.invokeCrypto("sha1",c),m=l.slice(0,8),g=l.slice(-8);switch(d.ZP&&this.log("Got Set_client_DH_params_answer",f._,c),f._){case"dh_gen_ok":{const t=(yield s.Z.invokeCrypto("sha1",e.newNonce.concat([1],m))).slice(-16);if(!(0,Ps.Z)(t,f.new_nonce_hash1))throw this.log.error("Set_client_DH_params_answer new_nonce_hash1 mismatch",t,f),new Error("new_nonce_hash1 mismatch");const a=Us(e.newNonce.slice(0,8),e.serverNonce.slice(0,8));return d.ZP&&this.log("Auth successfull!",g,c,a),e.authKeyId=g,e.authKey=c,e.serverSalt=a,e}case"dh_gen_retry":{const t=(yield s.Z.invokeCrypto("sha1",e.newNonce.concat([2],m))).slice(-16);if(!(0,Ps.Z)(t,f.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 s.Z.invokeCrypto("sha1",e.newNonce.concat([3],m))).slice(-16);if(!(0,Ps.Z)(t,f.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=Z.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)=>Ts(this,void 0,void 0,(function*(){let s;yield this.getTransportType();let n=1;for(;n++<=3;)try{const a={dcId:e,nonce:w(new Uint8Array(16))},s=this.sendReqPQ(a);return void t(yield s)}catch(e){s=e}a(s)})))),this.cached[e]=t)}}class Fs extends G{after(){this.lastMessageId=[0,0],this.timeOffset=0,qa.Z.get("server_time_offset").then((e=>{e&&(this.timeOffset=e)}))}getServerTimeOffset(){return this.timeOffset}generateId(){const e=Date.now();let t=[Math.floor(e/1e3)+this.timeOffset,e%1e3<<21|(0,Te.d)(16)<<3|4];return(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,rs(t[0],t[1]).toString(10)}applyServerTime(e,t){const a=e-(t=(t||Date.now())/1e3|0),s=Math.abs(this.timeOffset-a)>10;return this.lastMessageId=[0,0],this.timeOffset!==a&&(qa.Z.set({server_time_offset:a}),this.timeOffset=a),s}}class Rs{saveWebDocument(e){if(!e)return;const t=e.attributes.find((e=>"documentAttributeImageSize"===e._));return t&&(e.w=t.w,e.h=t.h),e}}class xs extends G{getInputInvoiceBySlug(e){return{_:"inputInvoiceSlug",slug:e}}getInputInvoiceByPeerId(e,t){return{_:"inputInvoiceMessage",peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(t)}}getPaymentForm(e){return this.apiManager.invokeApi("payments.getPaymentForm",{invoice:e}).then((e=>(this.appUsersManager.saveApiUsers(e.users),e)))}getPaymentReceipt(e,t){return this.apiManager.invokeApi("payments.getPaymentReceipt",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(t)}).then((e=>(this.appUsersManager.saveApiUsers(e.users),e)))}validateRequestedInfo(e,t,a){return this.apiManager.invokeApi("payments.validateRequestedInfo",{save:a,invoice:e,info:t})}sendPaymentForm(e,t,a,s,n,i){return this.apiManager.invokeApi("payments.sendPaymentForm",{form_id:t,invoice:e,requested_info_id:a,shipping_option_id:s,credentials:n,tip_amount:i||void 0}).then((e=>("payments.paymentResult"===e._&&this.apiUpdatesManager.processUpdateMessage(e.updates),e)))}clearSavedInfo(e,t){return this.apiManager.invokeApi("payments.clearSavedInfo",{info:e,credentials:t})}}var Bs=a(8794);class Vs extends G{constructor(){super(...arguments),this.clear=(e=!1)=>{e?this.attachMenuBots=new Map:(this.attachMenuBots.clear(),this.attachMenuBotsArr=void 0)},this.onUpdateAttachMenuBots=e=>{this.clear(),this.getAttachMenuBots()}}after(){this.clear(!0),this.apiUpdatesManager.addMultipleEventsListeners({updateAttachMenuBots:this.onUpdateAttachMenuBots})}saveAttachMenuBot(e){this.attachMenuBots.set(e.bot_id,e);const t=(0,Bs.Z)(e);return t.icon=this.appDocsManager.saveDoc(t.icon,{type:"attachMenuBotIcon",botId:e.bot_id}),e}saveAttachMenuBots(e){e.saved||(e.saved=!0,e.forEach((e=>this.saveAttachMenuBot(e))))}getAttachMenuBots(){var e;return null!==(e=this.attachMenuBotsArr)&&void 0!==e?e:this.apiManager.invokeApiSingleProcess({method:"messages.getAttachMenuBots",processResult:e=>((0,ue.Z)(e),this.appUsersManager.saveApiUsers(e.users),this.saveAttachMenuBots(e.bots),this.attachMenuBotsArr=e.bots.slice(0,0))})}getAttachMenuBotCached(e){return this.attachMenuBots.get(e)}getAttachMenuBot(e,t){throw this.appUsersManager.isAttachMenuBot(e),(0,X.Z)("BOT_INVALID")}requestWebView(e){const{botId:t,peerId:a,url:s,fromBotMenu:n,themeParams:i,replyToMsgId:r,silent:o,sendAsPeerId:p,startParam:d,threadId:f}=e;return this.apiManager.invokeApiSingleProcess({method:"messages.requestWebView",params:{peer:this.appPeersManager.getInputPeerById(a),bot:this.appUsersManager.getUserInput(t),silent:o,platform:"web",url:s,reply_to_msg_id:r?(0,oe.Z)(r):void 0,from_bot_menu:n,theme_params:i,send_as:p?this.appPeersManager.getInputPeerById(p):void 0,start_param:d,top_msg_id:f?(0,oe.Z)(f):void 0},processResult:e=>(console.log(e),e)})}prolongWebView(e){return this.apiManager.invokeApiSingleProcess({method:"messages.prolongWebView",params:{peer:this.appPeersManager.getInputPeerById(e.peerId),bot:this.appUsersManager.getUserInput(e.botId),query_id:e.queryId,silent:e.silent,reply_to_msg_id:e.replyToMsgId?(0,oe.Z)(e.replyToMsgId):void 0,send_as:e.sendAsPeerId?this.appPeersManager.getInputPeerById(e.sendAsPeerId):void 0,top_msg_id:e.threadId?(0,oe.Z)(e.threadId):void 0},processResult:e=>{console.log(e)}})}}class Os extends G{requestUrlAuth(e,t,a,s){return this.apiManager.invokeApi("messages.requestUrlAuth",{button_id:s,msg_id:a?(0,oe.Z)(a):void 0,peer:t?this.appPeersManager.getInputPeerById(t):void 0,url:e}).then((e=>("urlAuthResultRequest"===e._&&this.appUsersManager.saveApiUser(e.bot),e)))}acceptUrlAuth(e,t,a,s,n){return this.apiManager.invokeApi("messages.acceptUrlAuth",{button_id:s,msg_id:a?(0,oe.Z)(a):void 0,peer:t?this.appPeersManager.getInputPeerById(t):void 0,url:e,write_allowed:n}).then((e=>e))}getWebAuthorizations(){return this.apiManager.invokeApi("account.getWebAuthorizations").then((e=>(this.appUsersManager.saveApiUsers(e.users),e.authorizations)))}resetWebAuthorization(e){return this.apiManager.invokeApi("account.resetWebAuthorization",{hash:e})}resetWebAuthorizations(){return this.apiManager.invokeApi("account.resetWebAuthorizations")}}class Ls extends G{after(){this.wallPapers={}}saveWallPaper(e){return e?("wallPaperNoFile"!==e._&&(e.document=this.appDocsManager.saveDoc(e.document,{type:"wallPaper",wallPaperId:e.id})),this.wallPapers[e.id]=e,e):e}getWallPaper(e){return this.apiManager.invokeApiSingleProcess({method:"account.getWallPaper",params:{wallpaper:e},processResult:e=>this.saveWallPaper(e)})}getInputWallPaper(e){return"string"==typeof e?{_:"inputWallPaperSlug",slug:e}:"wallPaperNoFile"===e._?{_:"inputWallPaperNoFile",id:e.id}:{_:"inputWallPaper",id:e.id,access_hash:e.access_hash}}getWallPaperById(e){const t=this.wallPapers[e];return this.getWallPaper(this.getInputWallPaper(t))}getThemes(){return this.apiManager.invokeApiSingleProcess({method:"account.getThemes",params:{format:"macos",hash:0},processResult:e=>((0,ue.Z)(e),e.themes.forEach((e=>{e.settings&&e.settings.forEach((e=>{e.wallpaper=this.saveWallPaper(e.wallpaper)}))})),e.themes)})}getWallPapers(){return this.apiManager.invokeApiHashable({method:"account.getWallPapers"}).then((e=>{const t=e.wallpapers;return t.forEach(((e,t,a)=>{a[t]=this.saveWallPaper(e)})),t}))}}const Ns=new class{constructor(){this.cryptoWorkersURLs=[],this.cryptoPortsAttached=0,this.cryptoPortPromise=(0,v.Z)(),this.cryptoPortPromise.then((()=>{this.cryptoPortPromise=void 0}))}start(){const e=f.Z.getInstance();e.addEventListener("manager",(({name:e,method:t,args:a})=>(0,q.Z)(this.getManagers(),(s=>{const n=s[e];return n[t].apply(n,a)})))),e.addEventListener("cryptoPort",((e,t,a)=>{var n;const i=a.ports[0];this.cryptoPortsAttached>=this.cryptoWorkersURLs.length?i.close():(++this.cryptoPortsAttached,s.Z.attachPort(i),null===(n=this.cryptoPortPromise)||void 0===n||n.resolve())})),e.addEventListener("createProxyWorkerURLs",(({originalUrl:e,blob:t})=>{let a=this.cryptoWorkersURLs.length;a||(this.cryptoWorkersURLs.push(e),++a);const s=_.Z.cryptoWorkers;if(a===s)return this.cryptoWorkersURLs;const n=new Array(s-a).fill(void 0).map((()=>URL.createObjectURL(t)));return this.cryptoWorkersURLs.push(...n),this.cryptoWorkersURLs}))}createManagers(){return e=this,t=void 0,n=function*(){const e=new $;yield Promise.all([e.loadStorages(),this.cryptoPortPromise]);const t=yield function(e,t){const a={appPeersManager:new fa,appChatsManager:new Be,appDocsManager:new ut,appPhotosManager:new ca,appPollsManager:new la,appUsersManager:new Aa,appWebPagesManager:new Ua,appDraftsManager:new _t,appProfileManager:new ua,appNotificationsManager:new na,apiUpdatesManager:new De,appAvatarsManager:new Ue,appGroupCallsManager:new St,appCallsManager:new Fe,appReactionsManager:new ba,appMessagesManager:new ta,appMessagesIdsManager:new Tt,appPrivacyManager:new ma,appInlineBotsManager:new Dt,appStickersManager:new Ca,referenceDatabase:new ee,appEmojiManager:new Mt,filtersStorage:new Ce,dialogsStorage:new _e,apiManager:new Ja,cryptoWorker:s.Z,passwordManager:new Q,apiFileManager:new ja,peersStorage:new Qa,thumbsStorage:new Xa,networkerFactory:new As,rootScope:new l,authorizer:new Es,dcConfigurator:new O,timeManager:new Fs,appStoragesManager:e,appStateManager:y,appWebDocsManager:new Rs,appPaymentsManager:new xs,appAttachMenuBotsManager:new Vs,appSeamlessLoginManager:new Os,appThemesManager:new Ls};for(const e in a){const t=a[e];t&&(t.setManagers&&(t.setManagers(a),delete t.setManagers),E.Z[e]=t)}const n=[];let i=Object.keys(a);i.unshift("appUsersManager","appChatsManager","appNotificationsManager","appMessagesManager","dialogsStorage"),i=(0,we.Z)(i);for(const e of i){const t=a[e];if(null==t?void 0:t.after){const e=t.after();n.push(e)}}return t&&a.apiManager.setUserAuth(t),Promise.all(n).then((()=>a))}(e,y.userId);return this.managers=t},new((a=void 0)||(a=Promise))((function(s,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((n=n.apply(e,t||[])).next())}));var e,t,a,n}getManagers(){var e;return null!==(e=this.managers)&&void 0!==e?e:this.managers=this.createManagers()}};d.GO&&(d.GO.appManagersManager=Ns);const Zs=Ns;var js=a(3655);let qs,Gs,Hs=!0;function Ws(){return Hs}function zs(){return Hs?qs:void 0}const Ks=(0,I.kg)("MTPROTO"),Js=new f.Z;Js.addMultipleEventsListeners({environment:e=>{r(e),Z.waitForWebSocket()},crypto:({method:e,args:t})=>s.Z.invokeCrypto(e,...t),state:({state:e,resetStorages:t,pushedKeys:a,newVersion:s,oldVersion:n,userId:i})=>{Ks("got state",e,a),y.userId=i,y.newVersion=s,y.oldVersion=n,Object.keys(e).forEach((t=>{y.pushToState(t,e[t],!0,!a.includes(t))})),j.resolve(t)},toggleStorages:({enabled:e,clearWrite:t})=>(0,za.Z)(e,t),event:(e,t)=>{Ks("will redirect event",e,t),Js.invokeExceptSource("event",e,t)},serviceWorkerOnline:e=>{Hs=e},serviceWorkerPort:(e,t,a)=>{qs?(qs.detachPort(Gs),Gs=void 0):(qs=new js.Z,qs.addMultipleEventsListeners({requestFilePart:e=>(0,q.Z)(Zs.getManagers(),(t=>{const{docId:a,dcId:s,offset:n,limit:i}=e;return t.appDocsManager.requestDocPart(a,s,n,i)}))})),(Gs=a.ports[0])&&qs.attachPort(Gs)},createObjectURL:e=>URL.createObjectURL(e)}),Ks("MTProto start"),Zs.start(),Zs.getManagers(),Gt.start(),function(e,t,a){const s=(a,s)=>{e.attachListenPort(a),s&&e.attachSendPort(s),null==t||t(a)};e.setOnPortDisconnect((e=>{Gt.deleteTab(e)})),"undefined"!=typeof SharedWorkerGlobalScope?E.Z.addEventListener("connect",(e=>s(e.source,e.source))):"undefined"!=typeof ServiceWorkerGlobalScope?s(E.Z,null):s(E.Z,E.Z)}(Js,(e=>{Gt.addTab(e)}))},1507:(e,t,a)=>{a.d(t,{BP:()=>f,BX:()=>l,DZ:()=>h,Gu:()=>u,IA:()=>i,Iw:()=>p,J$:()=>m,NM:()=>s,Ox:()=>c,Pt:()=>d,Zi:()=>g,hj:()=>n,rU:()=>o,yF:()=>r});const s=0,n=1271266957,i=777,r=777e3,o=2147483647,p=20971520,d="",f="default_static",c=4295032831,l=new Set(["web","k","z"]),m=0,g=1,h=new Set([m,g]),u=Math.max(...Array.from(h))+1},2423:(e,t,a)=>{a.d(t,{$2:()=>l,E:()=>m,QB:()=>g,SC:()=>h,bu:()=>d,it:()=>p,kO:()=>y,tY:()=>u});var s=a(1229);const n="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",i="0-9_"+n,r="["+n+"0-9]",o="((?:https?|ftp)://|mailto:)?",p=o+"(?:"+r+"{1,64}(?::"+r+"{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}|"+r+"["+n+"ยท0-9-]{0,64}(?:\\."+r+"["+n+"ยท0-9-]{0,64}){0,10}(?:\\.(xn--[0-9a-z]{2,16}|["+n+"]{2,24})))(?::\\d{2,5})?(?:/(?:\\S{0,255}[^\\s.;,(\\[\\]{}<>\"'])?)?",d=(new RegExp("^"+o.slice(0,-1),"i"),/^((?:[^\/]+?):\/\/|mailto:)/),f="[a-zA-Z\\d_]{5,32}",c="\\/([a-zA-Z\\d_]{1,32})(?:@("+f+"))?(\\b|$)",l=new RegExp("(^| )(@)("+f+")|("+p+")|(\\n)|("+s.Z+")|(^|[\\s\\(\\]])(#["+i+"]{2,64})|(^|\\s)"+c,"i"),m=/^(([^<>()[\]\\.,;:\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,}))$/,g=/(^|\s|\n)(````?)([\s\S]+?)(````?)([\s\n\.,:?!;]|$)|(^|\s|\x01)(`|~~|\*\*|__|_-_|\|\|)([^\n]+?)\7([\x01\s\.,:?!;]|$)|@(\d+)\s*\((.+?)\)|(\[(.+?)\]\((.+?)\))/m,h={"`":"messageEntityCode","``":"messageEntityPre","**":"messageEntityBold",__:"messageEntityItalic","~~":"messageEntityStrike","_-_":"messageEntityUnderline","||":"messageEntitySpoiler"},u=new Set(["messageEntityEmoji","messageEntityLinebreak","messageEntityCaret"]);for(const e in h)u.add(h[e]);const y=/^\+\d+$/},671:(e,t,a)=>{function s(e){return function(e){const t=[];let a=0,s=0,n=0;for(;n55296&&a<=56319?s=a:t.push(a.toString(16));return t.length&&2===t[0].length&&(t[0]="00"+t[0]),t}(r(e)).join("-")}a.d(t,{N0:()=>s});const n=/\uFE0F/g,i=String.fromCharCode(8205),r=e=>e.indexOf(i)<0?e.replace(n,""):e;new Map([["FT","๐Ÿดโ€โ˜ "]])}},s={};function n(e){var t=s[e];if(void 0!==t)return t.exports;var i=s[e]={id:e,loaded:!1,exports:{}};return a[e].call(i.exports,i,i.exports,n),i.loaded=!0,i.exports}n.m=a,n.x=()=>{var e=n.O(void 0,[699,211,147,85,110],(()=>n(9092)));return n.O(e)},e=[],n.O=(t,a,s,i)=>{if(!a){var r=1/0;for(f=0;f=i)&&Object.keys(n.O).every((e=>n.O[e](a[p])))?a.splice(p--,1):(o=!1,i0&&e[f-1][2]>i;f--)e[f]=e[f-1];e[f]=[a,s,i]},n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var a in t)n.o(t,a)&&!n.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},n.f={},n.e=e=>Promise.all(Object.keys(n.f).reduce(((t,a)=>(n.f[a](e,t),t)),[])),n.u=e=>85===e?"85.887945ef5f43bc205112.bundle.js":110===e?"110.745cc657737d24b5aea0.bundle.js":({211:"npm.big-integer",699:"npm.pako"}[e]||e)+"."+{8:"93d2f33af815eb0455aa",104:"476c2f411510266c35de",147:"4eb614e56f1d9fbfd1e7",211:"363d763daad0ee4e2741",301:"95838a8203f23dd1ce8f",642:"be93122d1116ecdc9322",699:"89deb457201f16c93925"}[e]+".chunk.js",n.miniCssF=e=>{},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),(()=>{var e;n.g.importScripts&&(e=n.g.location+"");var t=n.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var a=t.getElementsByTagName("script");a.length&&(e=a[a.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),n.p=e})(),(()=>{if(void 0!==n){var e=n.u,t=n.e,a={},s={};n.u=function(t){return e(t)+(a.hasOwnProperty(t)?"?"+a[t]:"")},n.e=function(i){return t(i).catch((function(t){var r=s.hasOwnProperty(i)?s[i]:999999;if(r<1){var o=e(i);throw t.message="Loading chunk "+i+" failed after 999999 retries.\n("+o+")",t.request=o,t}return new Promise((function(e){setTimeout((function(){var t=Date.now();a[i]=t,s[i]=r-1,e(n.e(i))}),3e3)}))}))}}})(),(()=>{var e={678:1};n.f.i=(t,a)=>{e[t]||importScripts(n.p+n.u(t))};var t=this.webpackChunktweb=this.webpackChunktweb||[],a=t.push.bind(t);t.push=t=>{var[s,i,r]=t;for(var o in i)n.o(i,o)&&(n.m[o]=i[o]);for(r&&r(n);s.length;)e[s.pop()]=1;a(t)}})(),t=n.x,n.x=()=>Promise.all([699,211,147,85,110].map(n.e,n)).then(t),n.x()})(); +//# sourceMappingURL=mtproto.worker.5211e33b3f0c47c582c8.chunk.js.map \ No newline at end of file diff --git a/public/mtproto.worker.e3a23c58261a5160e0d7.chunk.js.map b/public/mtproto.worker.5211e33b3f0c47c582c8.chunk.js.map similarity index 99% rename from public/mtproto.worker.e3a23c58261a5160e0d7.chunk.js.map rename to public/mtproto.worker.5211e33b3f0c47c582c8.chunk.js.map index 226445ea..ece5d892 100644 --- a/public/mtproto.worker.e3a23c58261a5160e0d7.chunk.js.map +++ b/public/mtproto.worker.5211e33b3f0c47c582c8.chunk.js.map @@ -1 +1 @@ -{"version":3,"file":"mtproto.worker.e3a23c58261a5160e0d7.chunk.js","mappings":"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Ac,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,MAAO,kBAAkB,MAAO,QAAQ,MAAO,kBAAkB,MAAO,4CAA4C,MAAO,4CAA4C,MAAO,4CAA4C,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,6BAA6B,KAAM,wCAAwC,KAAM,QAAQ,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,6BAA6B,KAAM,6BAA6B,KAAM,wCAAwC,KAAM,wCAAwC,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,GAAI,QAAQ,IAAK,QAAQ,IAAK,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,GAAI,QAAQ,IAAK,QAAQ,IAAK,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,IAAK,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,IAAK,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,iBAAiB,KAAM,iBAAiB,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/startup chunk dependencies","webpack://tweb/./src/config/debug.ts","webpack://tweb/./src/config/emoji.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/helpers/cleanSearchText.ts","webpack://tweb/./src/helpers/fileName.ts","webpack://tweb/./src/helpers/restrictions.ts","webpack://tweb/./src/lib/appManagers/utils/peers/getPeerId.ts","webpack://tweb/./src/lib/files/idb.ts","webpack://tweb/./src/environment/utils.ts","webpack://tweb/./src/lib/rootScope.ts","webpack://tweb/./src/lib/appManagers/appStateManager.ts","webpack://tweb/./src/helpers/object/setDeepProperty.ts","webpack://tweb/./src/lib/mtproto/transports/http.ts","webpack://tweb/./src/lib/mtproto/transports/websocket.ts","webpack://tweb/./src/helpers/array/randomize.ts","webpack://tweb/./src/lib/mtproto/transports/obfuscation.ts","webpack://tweb/./src/lib/mtproto/transports/abridged.ts","webpack://tweb/./src/helpers/bytes/bytesToHex.ts","webpack://tweb/./src/lib/mtproto/transports/tcpObfuscated.ts","webpack://tweb/./src/lib/mtproto/dcConfigurator.ts","webpack://tweb/./src/lib/mtproto/transports/controller.ts","webpack://tweb/./src/lib/appManagers/utils/storages/resetStoragesPromise.ts","webpack://tweb/./src/lib/appManagers/manager.ts","webpack://tweb/./src/lib/appManagers/utils/storages/loadStorages.ts","webpack://tweb/./src/lib/appManagers/appStoragesManager.ts","webpack://tweb/./src/lib/appManagers/utils/storages/createStorages.ts","webpack://tweb/./src/lib/mtproto/passwordManager.ts","webpack://tweb/./src/lib/mtproto/referenceDatabase.ts","webpack://tweb/./src/helpers/object/safeReplaceObject.ts","webpack://tweb/./src/lib/appManagers/utils/messages/getPeerIdsFromMessage.ts","webpack://tweb/./src/lib/appManagers/utils/dialogs/setDialogIndex.ts","webpack://tweb/./src/lib/storages/dialogs.ts","webpack://tweb/./src/lib/storages/filters.ts","webpack://tweb/./src/helpers/applyMixins.ts","webpack://tweb/./src/lib/appManagers/apiUpdatesManager.ts","webpack://tweb/./src/lib/appManagers/appAvatarsManager.ts","webpack://tweb/./src/lib/appManagers/appCallsManager.ts","webpack://tweb/./src/lib/appManagers/appChatsManager.ts","webpack://tweb/./src/lib/langPack.ts","webpack://tweb/./src/lib/richTextProcessor/wrapUrl.ts","webpack://tweb/./src/helpers/dom/setInnerHTML.ts","webpack://tweb/./src/helpers/date.ts","webpack://tweb/./src/helpers/object/safeReplaceArrayInObject.ts","webpack://tweb/./src/environment/mimeTypeMap.ts","webpack://tweb/./src/lib/appManagers/appDocsManager.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentURL.ts","webpack://tweb/./src/lib/appManagers/appDraftsManager.ts","webpack://tweb/./src/lib/appManagers/appEmojiManager.ts","webpack://tweb/./src/lib/appManagers/appGroupCallsManager.ts","webpack://tweb/./src/lib/appManagers/utils/photos/getPhotoInput.ts","webpack://tweb/./src/lib/appManagers/utils/photos/getPhotoMediaInput.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentMediaInput.ts","webpack://tweb/./src/lib/appManagers/appInlineBotsManager.ts","webpack://tweb/./src/lib/appManagers/appMessagesIdsManager.ts","webpack://tweb/./src/helpers/string/splitStringByLength.ts","webpack://tweb/./src/lib/appManagers/appTabsManager.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentInput.ts","webpack://tweb/./src/helpers/object/setBooleanFlag.ts","webpack://tweb/./src/lib/appManagers/appMessagesManager.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentInputFileName.ts","webpack://tweb/./src/helpers/string/convertInputKeyToKey.ts","webpack://tweb/./src/lib/appManagers/appNotificationsManager.ts","webpack://tweb/./src/lib/appManagers/appPeersManager.ts","webpack://tweb/./src/lib/appManagers/appPhotosManager.ts","webpack://tweb/./src/lib/appManagers/appPollsManager.ts","webpack://tweb/./src/lib/appManagers/appPrivacyManager.ts","webpack://tweb/./src/lib/appManagers/appProfileManager.ts","webpack://tweb/./src/helpers/callbackifyAll.ts","webpack://tweb/./src/lib/appManagers/appReactionsManager.ts","webpack://tweb/./src/lib/appManagers/appStickersManager.ts","webpack://tweb/./src/helpers/fixBase64String.ts","webpack://tweb/./src/lib/appManagers/appUsersManager.ts","webpack://tweb/./src/helpers/cleanUsername.ts","webpack://tweb/./src/lib/appManagers/appWebPagesManager.ts","webpack://tweb/./src/helpers/blob/readBlobAsArrayBuffer.ts","webpack://tweb/./src/helpers/string/fileNameRFC.ts","webpack://tweb/./src/lib/files/downloadWriter.ts","webpack://tweb/./src/lib/files/downloadStorage.ts","webpack://tweb/./src/lib/mtproto/apiFileManager.ts","webpack://tweb/./src/helpers/fixFirefoxSvg.ts","webpack://tweb/./src/helpers/blob/readBlobAsUint8Array.ts","webpack://tweb/./src/lib/mtproto/api_methods.ts","webpack://tweb/./src/lib/mtproto/apiManager.ts","webpack://tweb/./src/lib/storages/peers.ts","webpack://tweb/./src/lib/storages/thumbs.ts","webpack://tweb/./src/lib/mtproto/schema.ts","webpack://tweb/./src/helpers/number/intToUint.ts","webpack://tweb/./src/helpers/long/ulongFromInts.ts","webpack://tweb/./src/helpers/bigInt/bigIntConstants.ts","webpack://tweb/./src/helpers/bigInt/bigIntConversion.ts","webpack://tweb/./src/lib/mtproto/tl_utils.ts","webpack://tweb/./src/helpers/gzipUncompress.ts","webpack://tweb/./src/helpers/bytes/addPadding.ts","webpack://tweb/./src/lib/mtproto/networker.ts","webpack://tweb/./src/helpers/long/sortLongsArray.ts","webpack://tweb/./src/helpers/long/longToBytes.ts","webpack://tweb/./src/lib/mtproto/networkerFactory.ts","webpack://tweb/./src/lib/mtproto/rsaKeysManager.ts","webpack://tweb/./src/helpers/bytes/bytesXor.ts","webpack://tweb/./src/lib/mtproto/authorizer.ts","webpack://tweb/./src/lib/mtproto/timeManager.ts","webpack://tweb/./src/lib/appManagers/appWebDocsManager.ts","webpack://tweb/./src/lib/appManagers/appPaymentsManager.ts","webpack://tweb/./src/lib/appManagers/appAttachMenuBotsManager.ts","webpack://tweb/./src/lib/appManagers/appSeamlessLoginManager.ts","webpack://tweb/./src/lib/appManagers/appThemesManager.ts","webpack://tweb/./src/lib/appManagers/appManagersManager.ts","webpack://tweb/./src/lib/appManagers/createManagers.ts","webpack://tweb/./src/lib/mtproto/mtproto.worker.ts","webpack://tweb/./src/helpers/listenMessagePort.ts","webpack://tweb/./src/lib/mtproto/mtproto_config.ts","webpack://tweb/./src/lib/richTextProcessor/index.ts","webpack://tweb/./src/vendor/emoji/index.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/compat get default export","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/make namespace object","webpack://tweb/webpack/runtime/node module decorator","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/importScripts chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn Promise.all([699,211,147,85,110].map(__webpack_require__.e, __webpack_require__)).then(next);\n};","/*\n * 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 './modes';\n\nexport const IS_BETA = process.env.NODE_ENV !== 'production';\nexport const DEBUG = (IS_BETA || Modes.debug)/* && false */;\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\nexport default DEBUG;\n\n// let m = DEBUG;\n/* if(!DEBUG) {\n ctx.sandpitTurtle = () => {\n //if(!m) {\n for(let i in MOUNT_CLASS_TO) {\n ctx[i] = MOUNT_CLASS_TO[i];\n }\n //m = true;\n //}\n\n //DEBUG = !DEBUG;\n };\n} */\n\n/* export const superDebug = (object: any, key: string) => {\n var d = object[key];\n var beforeStr = '', afterStr = '';\n for(var r of d) {\n beforeStr += r.before.hex + '\\n';\n afterStr += r.after.hex + '\\n';\n }\n\n beforeStr = beforeStr.trim();\n afterStr = afterStr.trim();\n //var beforeStr = d.map((r) => r.before.hex).join('\\n');\n //var afterStr = d.map((r) => r.after.hex).join('\\n');\n\n var dada = (name: string, str: string) => {\n var a = document.createElement('a');\n a.target = '_blank';\n a.download = name + '.txt';\n a.href = URL.createObjectURL(new Blob([str], {\n type: 'text/plain'\n }));\n document.body.append(a);\n a.click();\n };\n\n dada(key + '_' + 'before', beforeStr);\n dada(key + '_' + 'after', afterStr);\n}\n\nMOUNT_CLASS_TO.superDebug = superDebug; */\n","/*\n * 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 {EMOJI_VERSION} from '../environment/emojiVersionsSupport';\n\nexport const EmojiVersions: {[version in EMOJI_VERSION]: {[emoji: string]: number}} = {'14':{'1f6dd':4867, '1f6de':4916, '1f6df':4923, '1f7f0':62832, '1f979':183, '1f9cc':1557, '1fa7b':61332, '1fa7c':61330, '1faa9':51093, '1faaa':61364, '1faab':61189, '1faac':51085, '1fab7':2651, '1fab8':2631, '1fab9':2672, '1faba':2673, '1fac3':1520, '1fac4':1521, '1fac5':1505, '1fad7':3793, '1fad8':3707, '1fad9':3804, '1fae0':111, '1fae1':136, '1fae2':132, '1fae3':133, '1fae4':174, '1fae5':142, '1fae6':1385, '1fae7':61353, '1faf0':1341, '1faf1':1332, '1faf2':1333, '1faf3':1334, '1faf4':1335, '1faf5':1351, '1faf6':1360, '1faf1-1f3fb-200d-1faf2-1f3fc':0, '1faf1-1f3fb-200d-1faf2-1f3fd':0, '1faf1-1f3fb-200d-1faf2-1f3fe':0, '1faf1-1f3fb-200d-1faf2-1f3ff':0, '1faf1-1f3fc-200d-1faf2-1f3fb':0, '1faf1-1f3fc-200d-1faf2-1f3fd':0, '1faf1-1f3fc-200d-1faf2-1f3fe':0, '1faf1-1f3fc-200d-1faf2-1f3ff':0, '1faf1-1f3fd-200d-1faf2-1f3fb':0, '1faf1-1f3fd-200d-1faf2-1f3fc':0, '1faf1-1f3fd-200d-1faf2-1f3fe':0, '1faf1-1f3fd-200d-1faf2-1f3ff':0, '1faf1-1f3fe-200d-1faf2-1f3fb':0, '1faf1-1f3fe-200d-1faf2-1f3fc':0, '1faf1-1f3fe-200d-1faf2-1f3fd':0, '1faf1-1f3fe-200d-1faf2-1f3ff':0, '1faf1-1f3ff-200d-1faf2-1f3fb':0, '1faf1-1f3ff-200d-1faf2-1f3fc':0, '1faf1-1f3ff-200d-1faf2-1f3fd':0, '1faf1-1f3ff-200d-1faf2-1f3fe':0, '1fac3-1f3fb':0, '1fac3-1f3fc':0, '1fac3-1f3fd':0, '1fac3-1f3fe':0, '1fac3-1f3ff':0, '1fac4-1f3fb':0, '1fac4-1f3fc':0, '1fac4-1f3fd':0, '1fac4-1f3fe':0, '1fac4-1f3ff':0, '1fac5-1f3fb':0, '1fac5-1f3fc':0, '1fac5-1f3fd':0, '1fac5-1f3fe':0, '1fac5-1f3ff':0, '1faf0-1f3fb':0, '1faf0-1f3fc':0, '1faf0-1f3fd':0, '1faf0-1f3fe':0, '1faf0-1f3ff':0, '1faf1-1f3fb':0, '1faf1-1f3fc':0, '1faf1-1f3fd':0, '1faf1-1f3fe':0, '1faf1-1f3ff':0, '1faf2-1f3fb':0, '1faf2-1f3fc':0, '1faf2-1f3fd':0, '1faf2-1f3fe':0, '1faf2-1f3ff':0, '1faf3-1f3fb':0, '1faf3-1f3fc':0, '1faf3-1f3fd':0, '1faf3-1f3fe':0, '1faf3-1f3ff':0, '1faf4-1f3fb':0, '1faf4-1f3fc':0, '1faf4-1f3fd':0, '1faf4-1f3fe':0, '1faf4-1f3ff':0, '1faf5-1f3fb':0, '1faf5-1f3fc':0, '1faf5-1f3fd':0, '1faf5-1f3fe':0, '1faf5-1f3ff':0, '1faf6-1f3fb':0, '1faf6-1f3fc':0, '1faf6-1f3fd':0, '1faf6-1f3fe':0, '1faf6-1f3ff':0}, '':{'2049':62835, '2122':62863, '2139':62888, '2194':62764, '2195':62763, '2196':62762, '2197':62756, '2198':62758, '2199':62760, '2328':61194, '2600':4990, '2601':4998, '2602':41013, '2603':41018, '2604':41020, '2611':62851, '2614':41014, '2615':3781, '2618':2667, '2620':1106, '2622':62753, '2623':62754, '2626':62783, '2638':62780, '2639':177, '2648':62788, '2649':62789, '2650':62796, '2651':62797, '2652':62798, '2653':62799, '2660':51095, '2663':51098, '2665':51096, '2666':51097, '2668':4865, '2692':61297, '2693':4922, '2694':61300, '2696':61311, '2697':61319, '2699':61309, '2702':61284, '2705':62850, '2708':4931, '2709':61245, '2712':61259, '2714':62852, '2716':62828, '2721':62779, '2728':51029, '2733':62858, '2734':62859, '2744':41017, '2747':62860, '2753':62836, '2754':62837, '2755':62838, '2757':62839, '2763':1137, '2764':1141, '2795':62829, '2796':62830, '2797':62831, '2934':62767, '2935':62768, '3030':62840, '3297':62912, '3299':62913, '0023-20e3':62864, '002a-20e3':62865, '0030-20e3':62866, '0031-20e3':62867, '0032-20e3':62868, '0033-20e3':62869, '0034-20e3':62870, '0035-20e3':62871, '0036-20e3':62872, '0037-20e3':62873, '0038-20e3':62874, '0039-20e3':62875, '00a9':62861, '00ae':62862, '1f004':51101, '1f0cf':51100, '1f170':62882, '1f171':62884, '1f17e':62893, '1f17f':62895, '1f18e':62883, '1f191':62885, '1f192':62886, '1f193':62887, '1f194':62889, '1f195':62891, '1f196':62892, '1f197':62894, '1f198':62896, '1f199':62897, '1f19a':62898, '1f1e6-1f1e8':71594, '1f1e6-1f1e9':71595, '1f1e6-1f1ea':71596, '1f1e6-1f1eb':71597, '1f1e6-1f1ec':71598, '1f1e6-1f1ee':71599, '1f1e6-1f1f1':71600, '1f1e6-1f1f2':71601, '1f1e6-1f1f4':71602, '1f1e6-1f1f6':71603, '1f1e6-1f1f7':71604, '1f1e6-1f1f8':71605, '1f1e6-1f1f9':71606, '1f1e6-1f1fa':71607, '1f1e6-1f1fc':71608, '1f1e6-1f1fd':71609, '1f1e6-1f1ff':71610, '1f1e7-1f1e6':71611, '1f1e7-1f1e7':71612, '1f1e7-1f1e9':71613, '1f1e7-1f1ea':71614, '1f1e7-1f1eb':71615, '1f1e7-1f1ec':71616, '1f1e7-1f1ed':71617, '1f1e7-1f1ee':71618, '1f1e7-1f1ef':71619, '1f1e7-1f1f1':71620, '1f1e7-1f1f2':71621, '1f1e7-1f1f3':71622, '1f1e7-1f1f4':71623, '1f1e7-1f1f6':71624, '1f1e7-1f1f7':71625, '1f1e7-1f1f8':71626, '1f1e7-1f1f9':71627, '1f1e7-1f1fb':71628, '1f1e7-1f1fc':71629, '1f1e7-1f1fe':71630, '1f1e7-1f1ff':71631, '1f1e8-1f1e6':71632, '1f1e8-1f1e8':71633, '1f1e8-1f1e9':71634, '1f1e8-1f1eb':71635, '1f1e8-1f1ec':71636, '1f1e8-1f1ed':71637, '1f1e8-1f1ee':71638, '1f1e8-1f1f0':71639, '1f1e8-1f1f1':71640, '1f1e8-1f1f2':71641, '1f1e8-1f1f3':71642, '1f1e8-1f1f4':71643, '1f1e8-1f1f5':71644, '1f1e8-1f1f7':71645, '1f1e8-1f1fa':71646, '1f1e8-1f1fb':71647, '1f1e8-1f1fc':71648, '1f1e8-1f1fd':71649, '1f1e8-1f1fe':71650, '1f1e8-1f1ff':71651, '1f1e9-1f1ea':71652, '1f1e9-1f1ec':71653, '1f1e9-1f1ef':71654, '1f1e9-1f1f0':71655, '1f1e9-1f1f2':71656, '1f1e9-1f1f4':71657, '1f1e9-1f1ff':71658, '1f1ea-1f1e6':71659, '1f1ea-1f1e8':71660, '1f1ea-1f1ea':71661, '1f1ea-1f1ec':71662, '1f1ea-1f1ed':71663, '1f1ea-1f1f7':71664, '1f1ea-1f1f8':71665, '1f1ea-1f1f9':71666, '1f1ea-1f1fa':71667, '1f1eb-1f1ee':71668, '1f1eb-1f1ef':71669, '1f1eb-1f1f0':71670, '1f1eb-1f1f2':71671, '1f1eb-1f1f4':71672, '1f1eb-1f1f7':71673, '1f1ec-1f1e6':71674, '1f1ec-1f1e7':71675, '1f1ec-1f1e9':71676, '1f1ec-1f1ea':71677, '1f1ec-1f1eb':71678, '1f1ec-1f1ec':71679, '1f1ec-1f1ed':71680, '1f1ec-1f1ee':71681, '1f1ec-1f1f1':71682, '1f1ec-1f1f2':71683, '1f1ec-1f1f3':71684, '1f1ec-1f1f5':71685, '1f1ec-1f1f6':71686, '1f1ec-1f1f7':71687, '1f1ec-1f1f8':71688, '1f1ec-1f1f9':71689, '1f1ec-1f1fa':71690, '1f1ec-1f1fc':71691, '1f1ec-1f1fe':71692, '1f1ed-1f1f0':71693, '1f1ed-1f1f2':71694, '1f1ed-1f1f3':71695, '1f1ed-1f1f7':71696, '1f1ed-1f1f9':71697, '1f1ed-1f1fa':71698, '1f1ee-1f1e8':71699, '1f1ee-1f1e9':71700, '1f1ee-1f1ea':71701, '1f1ee-1f1f1':71702, '1f1ee-1f1f2':71703, '1f1ee-1f1f3':71704, '1f1ee-1f1f4':71705, '1f1ee-1f1f6':71706, '1f1ee-1f1f7':71707, '1f1ee-1f1f8':71708, '1f1ee-1f1f9':71709, '1f1ef-1f1ea':71710, '1f1ef-1f1f2':71711, '1f1ef-1f1f4':71712, '1f1ef-1f1f5':71713, '1f1f0-1f1ea':71714, '1f1f0-1f1ec':71715, '1f1f0-1f1ed':71716, '1f1f0-1f1ee':71717, '1f1f0-1f1f2':71718, '1f1f0-1f1f3':71719, '1f1f0-1f1f5':71720, '1f1f0-1f1f7':71721, '1f1f0-1f1fc':71722, '1f1f0-1f1fe':71723, '1f1f0-1f1ff':71724, '1f1f1-1f1e6':71725, '1f1f1-1f1e7':71726, '1f1f1-1f1e8':71727, '1f1f1-1f1ee':71728, '1f1f1-1f1f0':71729, '1f1f1-1f1f7':71730, '1f1f1-1f1f8':71731, '1f1f1-1f1f9':71732, '1f1f1-1f1fa':71733, '1f1f1-1f1fb':71734, '1f1f1-1f1fe':71735, '1f1f2-1f1e6':71736, '1f1f2-1f1e8':71737, '1f1f2-1f1e9':71738, '1f1f2-1f1ea':71739, '1f1f2-1f1eb':71740, '1f1f2-1f1ec':71741, '1f1f2-1f1ed':71742, '1f1f2-1f1f0':71743, '1f1f2-1f1f1':71744, '1f1f2-1f1f2':71745, '1f1f2-1f1f3':71746, '1f1f2-1f1f4':71747, '1f1f2-1f1f5':71748, '1f1f2-1f1f6':71749, '1f1f2-1f1f7':71750, '1f1f2-1f1f8':71751, '1f1f2-1f1f9':71752, '1f1f2-1f1fa':71753, '1f1f2-1f1fb':71754, '1f1f2-1f1fc':71755, '1f1f2-1f1fd':71756, '1f1f2-1f1fe':71757, '1f1f2-1f1ff':71758, '1f1f3-1f1e6':71759, '1f1f3-1f1e8':71760, '1f1f3-1f1ea':71761, '1f1f3-1f1eb':71762, '1f1f3-1f1ec':71763, '1f1f3-1f1ee':71764, '1f1f3-1f1f1':71765, '1f1f3-1f1f4':71766, '1f1f3-1f1f5':71767, '1f1f3-1f1f7':71768, '1f1f3-1f1fa':71769, '1f1f3-1f1ff':71770, '1f1f4-1f1f2':71771, '1f1f5-1f1e6':71772, '1f1f5-1f1ea':71773, '1f1f5-1f1eb':71774, '1f1f5-1f1ec':71775, '1f1f5-1f1ed':71776, '1f1f5-1f1f0':71777, '1f1f5-1f1f1':71778, '1f1f5-1f1f2':71779, '1f1f5-1f1f3':71780, '1f1f5-1f1f7':71781, '1f1f5-1f1f8':71782, '1f1f5-1f1f9':71783, '1f1f5-1f1fc':71784, '1f1f5-1f1fe':71785, '1f1f6-1f1e6':71786, '1f1f7-1f1ea':71787, '1f1f7-1f1f4':71788, '1f1f7-1f1f8':71789, '1f1f7-1f1fa':71790, '1f1f7-1f1fc':71791, '1f1f8-1f1e6':71792, '1f1f8-1f1e7':71793, '1f1f8-1f1e8':71794, '1f1f8-1f1e9':71795, '1f1f8-1f1ea':71796, '1f1f8-1f1ec':71797, '1f1f8-1f1ed':71798, '1f1f8-1f1ee':71799, '1f1f8-1f1ef':71800, '1f1f8-1f1f0':71801, '1f1f8-1f1f1':71802, '1f1f8-1f1f2':71803, '1f1f8-1f1f3':71804, '1f1f8-1f1f4':71805, '1f1f8-1f1f7':71806, '1f1f8-1f1f8':71807, '1f1f8-1f1f9':71808, '1f1f8-1f1fb':71809, '1f1f8-1f1fd':71810, '1f1f8-1f1fe':71811, '1f1f8-1f1ff':71812, '1f1f9-1f1e6':71813, '1f1f9-1f1e8':71814, '1f1f9-1f1e9':71815, '1f1f9-1f1eb':71816, '1f1f9-1f1ec':71817, '1f1f9-1f1ed':71818, '1f1f9-1f1ef':71819, '1f1f9-1f1f0':71820, '1f1f9-1f1f1':71821, '1f1f9-1f1f2':71822, '1f1f9-1f1f3':71823, '1f1f9-1f1f4':71824, '1f1f9-1f1f7':71825, '1f1f9-1f1f9':71826, '1f1f9-1f1fb':71827, '1f1f9-1f1fc':71828, '1f1f9-1f1ff':71829, '1f1fa-1f1e6':71830, '1f1fa-1f1ec':71831, '1f1fa-1f1f2':71832, '1f1fa-1f1f3':71833, '1f1fa-1f1f8':71834, '1f1fa-1f1fe':71835, '1f1fa-1f1ff':71836, '1f1fb-1f1e6':71837, '1f1fb-1f1e8':71838, '1f1fb-1f1ea':71839, '1f1fb-1f1ec':71840, '1f1fb-1f1ee':71841, '1f1fb-1f1f3':71842, '1f1fb-1f1fa':71843, '1f1fc-1f1eb':71844, '1f1fc-1f1f8':71845, '1f1fd-1f1f0':71846, '1f1fe-1f1ea':71847, '1f1fe-1f1f9':71848, '1f1ff-1f1e6':71849, '1f1ff-1f1f2':71850, '1f1ff-1f1fc':71851, '1f201':62899, '1f202':62900, '1f21a':62906, '1f22f':62903, '1f232':62907, '1f233':62911, '1f234':62910, '1f235':62915, '1f236':62902, '1f237':62901, '1f238':62909, '1f239':62905, '1f23a':62914, '1f250':62904, '1f251':62908, '1f300':41010, '1f301':4857, '1f302':41012, '1f303':4858, '1f304':4860, '1f305':4861, '1f306':4862, '1f307':4863, '1f308':41011, '1f309':4864, '1f30a':41023, '1f30b':4815, '1f30c':4997, '1f30d':4806, '1f30e':4807, '1f30f':4808, '1f310':4809, '1f311':4977, '1f312':4978, '1f313':4979, '1f314':4980, '1f315':4981, '1f316':4982, '1f317':4983, '1f318':4984, '1f319':4985, '1f31a':4986, '1f31b':4987, '1f31c':4988, '1f31d':4991, '1f31e':4992, '1f31f':4995, '1f320':4996, '1f321':4989, '1f324':41001, '1f325':41002, '1f326':41003, '1f327':41004, '1f328':41005, '1f329':41006, '1f32a':41007, '1f32b':41008, '1f32c':41009, '1f32d':3725, '1f32e':3727, '1f32f':3728, '1f330':3708, '1f331':2659, '1f332':2661, '1f333':2662, '1f334':2663, '1f335':2664, '1f336':3698, '1f337':2658, '1f338':2649, '1f339':2653, '1f33a':2655, '1f33b':2656, '1f33c':2657, '1f33d':3697, '1f33e':2665, '1f33f':2666, '1f340':2668, '1f341':2669, '1f342':2670, '1f343':2671, '1f344':3705, '1f345':3690, '1f346':3694, '1f347':3674, '1f348':3675, '1f349':3676, '1f34a':3677, '1f34b':3678, '1f34c':3679, '1f34d':3680, '1f34e':3682, '1f34f':3683, '1f350':3684, '1f351':3685, '1f352':3686, '1f353':3687, '1f354':3722, '1f355':3724, '1f356':3718, '1f357':3719, '1f358':3744, '1f359':3745, '1f35a':3746, '1f35b':3747, '1f35c':3748, '1f35d':3749, '1f35e':3709, '1f35f':3723, '1f360':3750, '1f361':3756, '1f362':3751, '1f363':3752, '1f364':3753, '1f365':3754, '1f366':3765, '1f367':3766, '1f368':3767, '1f369':3768, '1f36a':3769, '1f36b':3774, '1f36c':3775, '1f36d':3776, '1f36e':3777, '1f36f':3778, '1f370':3771, '1f371':3743, '1f372':3735, '1f373':3733, '1f374':3801, '1f375':3783, '1f376':3784, '1f377':3786, '1f378':3787, '1f379':3788, '1f37a':3789, '1f37b':3790, '1f37c':3779, '1f37d':3800, '1f37e':3785, '1f37f':3739, '1f380':51040, '1f381':51041, '1f382':3770, '1f383':51024, '1f384':51025, '1f385':1527, '1f386':51026, '1f387':51027, '1f388':51030, '1f389':51031, '1f38a':51032, '1f38b':51033, '1f38c':71588, '1f38d':51034, '1f38e':51035, '1f38f':51036, '1f390':51037, '1f391':51038, '1f392':61134, '1f393':61147, '1f396':51045, '1f397':51042, '1f399':61167, '1f39a':61168, '1f39b':61169, '1f39e':61203, '1f39f':51043, '1f3a0':4866, '1f3a1':4868, '1f3a2':4869, '1f3a3':51072, '1f3a4':61170, '1f3a5':61202, '1f3a6':62819, '1f3a7':61171, '1f3a8':51105, '1f3a9':61146, '1f3aa':4871, '1f3ab':51044, '1f3ac':61205, '1f3ad':51103, '1f3ae':51086, '1f3af':51078, '1f3b0':51088, '1f3b1':51081, '1f3b2':51089, '1f3b3':51060, '1f3b4':51102, '1f3b5':61165, '1f3b6':61166, '1f3b7':61173, '1f3b8':61175, '1f3b9':61176, '1f3ba':61177, '1f3bb':61178, '1f3bc':61164, '1f3bd':51074, '1f3be':51058, '1f3bf':51075, '1f3c0':51054, '1f3c1':71586, '1f3c2':1600, '1f3c3-200d-2640':1584, '1f3c3-200d-2642':1583, '1f3c3':1582, '1f3c4-200d-2640':1606, '1f3c4-200d-2642':1605, '1f3c4':1604, '1f3c5':51047, '1f3c6':51046, '1f3c7':1598, '1f3c8':51056, '1f3c9':51057, '1f3ca-200d-2640':1612, '1f3ca-200d-2642':1611, '1f3ca':1610, '1f3cb-200d-2640':1618, '1f3cb-200d-2642':1617, '1f3cb':1616, '1f3cc-200d-2640':1603, '1f3cc-200d-2642':1602, '1f3cc':1601, '1f3cd':4902, '1f3ce':4901, '1f3cf':51061, '1f3d0':51055, '1f3d1':51062, '1f3d2':51063, '1f3d3':51065, '1f3d4':4813, '1f3d5':4817, '1f3d6':4818, '1f3d7':4824, '1f3d8':4829, '1f3d9':4859, '1f3da':4830, '1f3db':4823, '1f3dc':4819, '1f3dd':4820, '1f3de':4821, '1f3df':4822, '1f3e0':4831, '1f3e1':4832, '1f3e2':4833, '1f3e3':4834, '1f3e4':4835, '1f3e5':4836, '1f3e6':4837, '1f3e7':62729, '1f3e8':4838, '1f3e9':4839, '1f3ea':4840, '1f3eb':4841, '1f3ec':4842, '1f3ed':4843, '1f3ee':61216, '1f3ef':4844, '1f3f0':4845, '1f3f3-200d-1f308':71591, '1f3f3-200d-26a7':71592, '1f3f3':71590, '1f3f4-200d-2620':71593, '1f3f4-e0067-e0062-e0065-e006e-e0067-e007f':71852, '1f3f4-e0067-e0062-e0073-e0063-e0074-e007f':71853, '1f3f4-e0067-e0062-e0077-e006c-e0073-e007f':71854, '1f3f4':71589, '1f3f5':2652, '1f3f7':61234, '1f3f8':51066, '1f3f9':61303, '1f3fa':3805, '1f3fb':9525, '1f3fc':9526, '1f3fd':9527, '1f3fe':9528, '1f3ff':9529, '1f400':2576, '1f401':2575, '1f402':2556, '1f403':2557, '1f404':2558, '1f405':2547, '1f406':2548, '1f407':2579, '1f408-200d-2b1b':2544, '1f408':2543, '1f409':2618, '1f40a':2613, '1f40b':2622, '1f40c':2632, '1f40d':2616, '1f40e':2550, '1f40f':2563, '1f410':2565, '1f411':2564, '1f412':2531, '1f413':2596, '1f414':2595, '1f415-200d-1f9ba':2537, '1f415':2535, '1f416':2560, '1f417':2561, '1f418':2570, '1f419':2629, '1f41a':2630, '1f41b':2634, '1f41c':2635, '1f41d':2636, '1f41e':2638, '1f41f':2625, '1f420':2626, '1f421':2627, '1f422':2614, '1f423':2597, '1f424':2598, '1f425':2599, '1f426':2600, '1f427':2601, '1f428':2586, '1f429':2538, '1f42a':2566, '1f42b':2567, '1f42c':2623, '1f42d':2574, '1f42e':2555, '1f42f':2546, '1f430':2578, '1f431':2542, '1f432':2617, '1f433':2621, '1f434':2549, '1f435':2530, '1f436':2534, '1f437':2559, '1f438':2612, '1f439':2577, '1f43a':2539, '1f43b-200d-2744':2585, '1f43b':2584, '1f43c':2587, '1f43d':2562, '1f43e':2593, '1f43f':2580, '1f440':1381, '1f441-200d-1f5e8':1159, '1f441':1382, '1f442':1373, '1f443':1375, '1f444':1384, '1f445':1383, '1f446':1347, '1f447':1349, '1f448':1345, '1f449':1346, '1f44a':1355, '1f44b':1327, '1f44c':1336, '1f44d':1352, '1f44e':1353, '1f44f':1358, '1f450':1361, '1f451':61144, '1f452':61145, '1f453':61110, '1f454':61115, '1f455':61116, '1f456':61117, '1f457':61122, '1f458':61123, '1f459':61128, '1f45a':61129, '1f45b':61130, '1f45c':61131, '1f45d':61132, '1f45e':61136, '1f45f':61137, '1f460':61140, '1f461':61141, '1f462':61143, '1f463':1687, '1f464':1684, '1f465':1685, '1f466':1388, '1f467':1389, '1f468-200d-1f33e':1457, '1f468-200d-1f373':1460, '1f468-200d-1f37c':1524, '1f468-200d-1f393':1448, '1f468-200d-1f3a4':1478, '1f468-200d-1f3a8':1481, '1f468-200d-1f3eb':1451, '1f468-200d-1f3ed':1466, '1f468-200d-1f466-200d-1f466':1674, '1f468-200d-1f466':1673, '1f468-200d-1f467-200d-1f466':1676, '1f468-200d-1f467-200d-1f467':1677, '1f468-200d-1f467':1675, '1f468-200d-1f468-200d-1f466':1663, '1f468-200d-1f468-200d-1f466-200d-1f466':1666, '1f468-200d-1f468-200d-1f467':1664, '1f468-200d-1f468-200d-1f467-200d-1f466':1665, '1f468-200d-1f468-200d-1f467-200d-1f467':1667, '1f468-200d-1f469-200d-1f466':1658, '1f468-200d-1f469-200d-1f466-200d-1f466':1661, '1f468-200d-1f469-200d-1f467':1659, '1f468-200d-1f469-200d-1f467-200d-1f466':1660, '1f468-200d-1f469-200d-1f467-200d-1f467':1662, '1f468-200d-1f4bb':1475, '1f468-200d-1f4bc':1469, '1f468-200d-1f527':1463, '1f468-200d-1f52c':1472, '1f468-200d-1f680':1487, '1f468-200d-1f692':1490, '1f468-200d-1f9af':1574, '1f468-200d-1f9b0':1396, '1f468-200d-1f9b1':1397, '1f468-200d-1f9b2':1399, '1f468-200d-1f9b3':1398, '1f468-200d-1f9bc':1577, '1f468-200d-1f9bd':1580, '1f468-200d-2695':1445, '1f468-200d-2696':1454, '1f468-200d-2708':1484, '1f468-200d-2764-200d-1f468':1655, '1f468-200d-2764-200d-1f48b-200d-1f468':1651, '1f468':1392, '1f469-200d-1f33e':1458, '1f469-200d-1f373':1461, '1f469-200d-1f37c':1523, '1f469-200d-1f393':1449, '1f469-200d-1f3a4':1479, '1f469-200d-1f3a8':1482, '1f469-200d-1f3eb':1452, '1f469-200d-1f3ed':1467, '1f469-200d-1f466-200d-1f466':1679, '1f469-200d-1f466':1678, '1f469-200d-1f467-200d-1f466':1681, '1f469-200d-1f467-200d-1f467':1682, '1f469-200d-1f467':1680, '1f469-200d-1f469-200d-1f466':1668, '1f469-200d-1f469-200d-1f466-200d-1f466':1671, '1f469-200d-1f469-200d-1f467':1669, '1f469-200d-1f469-200d-1f467-200d-1f466':1670, '1f469-200d-1f469-200d-1f467-200d-1f467':1672, '1f469-200d-1f4bb':1476, '1f469-200d-1f4bc':1470, '1f469-200d-1f527':1464, '1f469-200d-1f52c':1473, '1f469-200d-1f680':1488, '1f469-200d-1f692':1491, '1f469-200d-1f9af':1575, '1f469-200d-1f9b0':1401, '1f469-200d-1f9b1':1403, '1f469-200d-1f9b2':1407, '1f469-200d-1f9b3':1405, '1f469-200d-1f9bc':1578, '1f469-200d-1f9bd':1581, '1f469-200d-2695':1446, '1f469-200d-2696':1455, '1f469-200d-2708':1485, '1f469-200d-2764-200d-1f468':1654, '1f469-200d-2764-200d-1f469':1656, '1f469-200d-2764-200d-1f48b-200d-1f468':1650, '1f469-200d-2764-200d-1f48b-200d-1f469':1652, '1f469':1400, '1f46a':1657, '1f46b':1647, '1f46c':1648, '1f46d':1646, '1f46e-200d-2640':1494, '1f46e-200d-2642':1493, '1f46e':1492, '1f46f-200d-2640':1590, '1f46f-200d-2642':1589, '1f46f':1588, '1f470-200d-2640':1518, '1f470-200d-2642':1517, '1f470':1516, '1f471-200d-2640':1409, '1f471-200d-2642':1410, '1f471':1391, '1f472':1511, '1f473-200d-2640':1510, '1f473-200d-2642':1509, '1f473':1508, '1f474':1412, '1f475':1413, '1f476':1386, '1f477-200d-2640':1504, '1f477-200d-2642':1503, '1f477':1502, '1f478':1507, '1f479':1109, '1f47a':1110, '1f47b':1111, '1f47c':1526, '1f47d':1112, '1f47e':1113, '1f47f':1104, '1f480':1105, '1f481-200d-2640':1428, '1f481-200d-2642':1427, '1f481':1426, '1f482-200d-2640':1500, '1f482-200d-2642':1499, '1f482':1498, '1f483':1585, '1f484':61152, '1f485':1366, '1f486-200d-2640':1560, '1f486-200d-2642':1559, '1f486':1558, '1f487-200d-2640':1563, '1f487-200d-2642':1562, '1f487':1561, '1f488':4870, '1f489':61326, '1f48a':61328, '1f48b':1127, '1f48c':1128, '1f48d':61153, '1f48e':61154, '1f48f':1649, '1f490':2648, '1f491':1653, '1f492':4846, '1f493':1133, '1f494':1138, '1f495':1135, '1f496':1131, '1f497':1132, '1f498':1129, '1f499':1145, '1f49a':1144, '1f49b':1143, '1f49c':1146, '1f49d':1130, '1f49e':1134, '1f49f':1136, '1f4a0':62946, '1f4a1':61214, '1f4a2':1151, '1f4a3':1157, '1f4a4':1163, '1f4a5':1152, '1f4a6':1154, '1f4a7':41022, '1f4a8':1155, '1f4a9':1107, '1f4aa':1368, '1f4ab':1153, '1f4ac':1158, '1f4ad':1162, '1f4ae':2650, '1f4af':1150, '1f4b0':61235, '1f4b1':62841, '1f4b2':62842, '1f4b3':61242, '1f4b4':61237, '1f4b5':61238, '1f4b6':61239, '1f4b7':61240, '1f4b8':61241, '1f4b9':61244, '1f4ba':4936, '1f4bb':61191, '1f4bc':61265, '1f4bd':61197, '1f4be':61198, '1f4bf':61199, '1f4c0':61200, '1f4c1':61266, '1f4c2':61267, '1f4c3':61227, '1f4c4':61229, '1f4c5':61269, '1f4c6':61270, '1f4c7':61273, '1f4c8':61274, '1f4c9':61275, '1f4ca':61276, '1f4cb':61277, '1f4cc':61278, '1f4cd':61279, '1f4ce':61280, '1f4cf':61282, '1f4d0':61283, '1f4d1':61232, '1f4d2':61226, '1f4d3':61225, '1f4d4':61218, '1f4d5':61219, '1f4d6':61220, '1f4d7':61221, '1f4d8':61222, '1f4d9':61223, '1f4da':61224, '1f4db':62847, '1f4dc':61228, '1f4dd':61264, '1f4de':61185, '1f4df':61186, '1f4e0':61187, '1f4e1':61325, '1f4e2':61159, '1f4e3':61160, '1f4e4':61249, '1f4e5':61250, '1f4e6':61251, '1f4e7':61246, '1f4e8':61247, '1f4e9':61248, '1f4ea':61253, '1f4eb':61252, '1f4ec':61254, '1f4ed':61255, '1f4ee':61256, '1f4ef':61161, '1f4f0':61230, '1f4f1':61182, '1f4f2':61183, '1f4f3':62823, '1f4f4':62824, '1f4f5':62751, '1f4f6':62822, '1f4f7':61207, '1f4f8':61208, '1f4f9':61209, '1f4fa':61206, '1f4fb':61172, '1f4fc':61210, '1f4fd':61204, '1f4ff':61151, '1f500':62801, '1f501':62802, '1f502':62803, '1f503':62769, '1f504':62770, '1f505':62820, '1f506':62821, '1f507':61155, '1f508':61156, '1f509':61157, '1f50a':61158, '1f50b':61188, '1f50c':61190, '1f50d':61211, '1f50e':61212, '1f50f':61290, '1f510':61291, '1f511':61292, '1f512':61288, '1f513':61289, '1f514':61162, '1f515':61163, '1f516':61233, '1f517':61313, '1f518':62947, '1f519':62771, '1f51a':62772, '1f51b':62773, '1f51c':62774, '1f51d':62775, '1f51e':62752, '1f51f':62876, '1f520':62877, '1f521':62878, '1f522':62879, '1f523':62880, '1f524':62881, '1f525':41021, '1f526':61215, '1f527':61306, '1f528':61294, '1f529':61308, '1f52a':3803, '1f52b':61301, '1f52c':61323, '1f52d':61324, '1f52e':51082, '1f52f':62787, '1f530':62848, '1f531':62846, '1f532':62949, '1f533':62948, '1f534':62916, '1f535':62920, '1f536':62940, '1f537':62941, '1f538':62942, '1f539':62943, '1f53a':62944, '1f53b':62945, '1f53c':62811, '1f53d':62813, '1f549':62778, '1f54a':2602, '1f54b':4854, '1f54c':4850, '1f54d':4852, '1f54e':62786, '1f550':4955, '1f551':4957, '1f552':4959, '1f553':4961, '1f554':4963, '1f555':4965, '1f556':4967, '1f557':4969, '1f558':4971, '1f559':4973, '1f55a':4975, '1f55b':4953, '1f55c':4956, '1f55d':4958, '1f55e':4960, '1f55f':4962, '1f560':4964, '1f561':4966, '1f562':4968, '1f563':4970, '1f564':4972, '1f565':4974, '1f566':4976, '1f567':4954, '1f56f':61213, '1f570':4952, '1f573':1156, '1f574':1587, '1f575-200d-2640':1497, '1f575-200d-2642':1496, '1f575':1495, '1f576':61111, '1f577':2641, '1f578':2642, '1f579':51087, '1f57a':1586, '1f587':61281, '1f58a':61261, '1f58b':61260, '1f58c':61262, '1f58d':61263, '1f590':1329, '1f595':1348, '1f596':1331, '1f5a4':1148, '1f5a5':61192, '1f5a8':61193, '1f5b1':61195, '1f5b2':61196, '1f5bc':51104, '1f5c2':61268, '1f5c3':61285, '1f5c4':61286, '1f5d1':61287, '1f5d2':61271, '1f5d3':61272, '1f5dc':61310, '1f5dd':61293, '1f5de':61231, '1f5e1':61299, '1f5e3':1683, '1f5e8':1160, '1f5ef':1161, '1f5f3':61257, '1f5fa':4810, '1f5fb':4816, '1f5fc':4847, '1f5fd':4848, '1f5fe':4811, '1f5ff':61362, '1f600':11, '1f601':14, '1f602':18, '1f603':12, '1f604':13, '1f605':16, '1f606':15, '1f607':114, '1f608':1103, '1f609':112, '1f60a':113, '1f60b':124, '1f60c':150, '1f60d':116, '1f60e':170, '1f60f':144, '1f610':139, '1f611':140, '1f612':145, '1f613':195, '1f614':151, '1f615':173, '1f616':192, '1f617':119, '1f618':118, '1f619':122, '1f61a':121, '1f61b':125, '1f61c':126, '1f61d':128, '1f61e':194, '1f61f':175, '1f620':1101, '1f621':1100, '1f622':189, '1f623':193, '1f624':199, '1f625':188, '1f626':184, '1f627':185, '1f628':186, '1f629':196, '1f62a':152, '1f62b':197, '1f62c':147, '1f62d':190, '1f62e-200d-1f4a8':148, '1f62e':178, '1f62f':179, '1f630':187, '1f631':191, '1f632':180, '1f633':181, '1f634':154, '1f635-200d-1f4ab':165, '1f635':164, '1f636-200d-1f32b':143, '1f636':141, '1f637':155, '1f638':1116, '1f639':1117, '1f63a':1115, '1f63b':1118, '1f63c':1119, '1f63d':1120, '1f63e':1123, '1f63f':1122, '1f640':1121, '1f641':176, '1f642':19, '1f643':110, '1f644':146, '1f645-200d-2640':1422, '1f645-200d-2642':1421, '1f645':1420, '1f646-200d-2640':1425, '1f646-200d-2642':1424, '1f646':1423, '1f647-200d-2640':1437, '1f647-200d-2642':1436, '1f647':1435, '1f648':1124, '1f649':1125, '1f64a':1126, '1f64b-200d-2640':1431, '1f64b-200d-2642':1430, '1f64b':1429, '1f64c':1359, '1f64d-200d-2640':1416, '1f64d-200d-2642':1415, '1f64d':1414, '1f64e-200d-2640':1419, '1f64e-200d-2642':1418, '1f64e':1417, '1f64f':1364, '1f680':4942, '1f681':4937, '1f682':4872, '1f683':4873, '1f684':4874, '1f685':4875, '1f686':4876, '1f687':4877, '1f688':4878, '1f689':4879, '1f68a':4880, '1f68b':4883, '1f68c':4884, '1f68d':4885, '1f68e':4886, '1f68f':4911, '1f690':4887, '1f691':4888, '1f692':4889, '1f693':4890, '1f694':4891, '1f695':4892, '1f696':4893, '1f697':4894, '1f698':4895, '1f699':4896, '1f69a':4898, '1f69b':4899, '1f69c':4900, '1f69d':4881, '1f69e':4882, '1f69f':4938, '1f6a0':4939, '1f6a1':4940, '1f6a2':4930, '1f6a3-200d-2640':1609, '1f6a3-200d-2642':1608, '1f6a3':1607, '1f6a4':4926, '1f6a5':4918, '1f6a6':4919, '1f6a7':4921, '1f6a8':4917, '1f6a9':71587, '1f6aa':61333, '1f6ab':62745, '1f6ac':61358, '1f6ad':62747, '1f6ae':62730, '1f6af':62748, '1f6b0':62731, '1f6b1':62749, '1f6b2':4907, '1f6b3':62746, '1f6b4-200d-2640':1621, '1f6b4-200d-2642':1620, '1f6b4':1619, '1f6b5-200d-2640':1624, '1f6b5-200d-2642':1623, '1f6b5':1622, '1f6b6-200d-2640':1566, '1f6b6-200d-2642':1565, '1f6b6':1564, '1f6b7':62750, '1f6b8':62743, '1f6b9':62733, '1f6ba':62734, '1f6bb':62735, '1f6bc':62736, '1f6bd':61340, '1f6be':62737, '1f6bf':61342, '1f6c0':1643, '1f6c1':61343, '1f6c2':62738, '1f6c3':62739, '1f6c4':62740, '1f6c5':62741, '1f6cb':61338, '1f6cc':1644, '1f6cd':61133, '1f6ce':4944, '1f6cf':61337, '1f6d0':62776, '1f6d1':4920, '1f6d2':61357, '1f6d5':4851, '1f6d6':4828, '1f6d7':61334, '1f6e0':61298, '1f6e1':61304, '1f6e2':4914, '1f6e3':4912, '1f6e4':4913, '1f6e5':4929, '1f6e9':4932, '1f6eb':4933, '1f6ec':4934, '1f6f0':4941, '1f6f3':4927, '1f6f4':4908, '1f6f5':4903, '1f6f6':4925, '1f6f7':51076, '1f6f8':4943, '1f6f9':4909, '1f6fa':4906, '1f6fb':4897, '1f6fc':4910, '1f7e0':62917, '1f7e1':62918, '1f7e2':62919, '1f7e3':62921, '1f7e4':62922, '1f7e5':62925, '1f7e6':62929, '1f7e7':62926, '1f7e8':62927, '1f7e9':62928, '1f7ea':62930, '1f7eb':62931, '1f90c':1337, '1f90d':1149, '1f90e':1147, '1f90f':1338, '1f910':137, '1f911':129, '1f912':156, '1f913':171, '1f914':135, '1f915':157, '1f916':1114, '1f917':130, '1f918':1343, '1f919':1344, '1f91a':1328, '1f91b':1356, '1f91c':1357, '1f91d':1363, '1f91e':1340, '1f91f':1342, '1f920':167, '1f921':1108, '1f922':158, '1f923':17, '1f924':153, '1f925':149, '1f926-200d-2640':1440, '1f926-200d-2642':1439, '1f926':1438, '1f927':160, '1f928':138, '1f929':117, '1f92a':127, '1f92b':134, '1f92c':1102, '1f92d':131, '1f92e':159, '1f92f':166, '1f930':1519, '1f931':1522, '1f932':1362, '1f933':1367, '1f934':1506, '1f935-200d-2640':1515, '1f935-200d-2642':1514, '1f935':1513, '1f936':1528, '1f937-200d-2640':1443, '1f937-200d-2642':1442, '1f937':1441, '1f938-200d-2640':1627, '1f938-200d-2642':1626, '1f938':1625, '1f939-200d-2640':1639, '1f939-200d-2642':1638, '1f939':1637, '1f93a':1597, '1f93c-200d-2640':1630, '1f93c-200d-2642':1629, '1f93c':1628, '1f93d-200d-2640':1633, '1f93d-200d-2642':1632, '1f93d':1631, '1f93e-200d-2640':1636, '1f93e-200d-2642':1635, '1f93e':1634, '1f93f':51073, '1f940':2654, '1f941':61180, '1f942':3791, '1f943':3792, '1f944':3802, '1f945':51069, '1f947':51048, '1f948':51049, '1f949':51050, '1f94a':51067, '1f94b':51068, '1f94c':51077, '1f94d':51064, '1f94e':51053, '1f94f':51059, '1f950':3710, '1f951':3693, '1f952':3700, '1f953':3721, '1f954':3695, '1f955':3696, '1f956':3711, '1f957':3738, '1f958':3734, '1f959':3730, '1f95a':3732, '1f95b':3780, '1f95c':3706, '1f95d':3689, '1f95e':3715, '1f95f':3757, '1f960':3758, '1f961':3759, '1f962':3799, '1f963':3737, '1f964':3794, '1f965':3692, '1f966':3702, '1f967':3773, '1f968':3713, '1f969':3720, '1f96a':3726, '1f96b':3742, '1f96c':3701, '1f96d':3681, '1f96e':3755, '1f96f':3714, '1f970':115, '1f971':198, '1f972':123, '1f973':168, '1f974':163, '1f975':161, '1f976':162, '1f977':1501, '1f978':169, '1f97a':182, '1f97b':61124, '1f97c':61113, '1f97d':61112, '1f97e':61138, '1f97f':61139, '1f980':3760, '1f981':2545, '1f982':2643, '1f983':2594, '1f984':2551, '1f985':2603, '1f986':2604, '1f987':2583, '1f988':2628, '1f989':2606, '1f98a':2540, '1f98b':2633, '1f98c':2553, '1f98d':2532, '1f98e':2615, '1f98f':2572, '1f990':3762, '1f991':3763, '1f992':2569, '1f993':2552, '1f994':2582, '1f995':2619, '1f996':2620, '1f997':2639, '1f998':2591, '1f999':2568, '1f99a':2610, '1f99b':2573, '1f99c':2611, '1f99d':2541, '1f99e':3761, '1f99f':2644, '1f9a0':2647, '1f9a1':2592, '1f9a2':2605, '1f9a3':2571, '1f9a4':2607, '1f9a5':2588, '1f9a6':2589, '1f9a7':2533, '1f9a8':2590, '1f9a9':2609, '1f9aa':3764, '1f9ab':2581, '1f9ac':2554, '1f9ad':2624, '1f9ae':2536, '1f9af':61312, '1f9b4':1380, '1f9b5':1371, '1f9b6':1372, '1f9b7':1379, '1f9b8-200d-2640':1532, '1f9b8-200d-2642':1531, '1f9b8':1530, '1f9b9-200d-2640':1535, '1f9b9-200d-2642':1534, '1f9b9':1533, '1f9ba':61114, '1f9bb':1374, '1f9bc':4905, '1f9bd':4904, '1f9be':1369, '1f9bf':1370, '1f9c0':3717, '1f9c1':3772, '1f9c2':3741, '1f9c3':3796, '1f9c4':3703, '1f9c5':3704, '1f9c6':3731, '1f9c7':3716, '1f9c8':3740, '1f9c9':3797, '1f9ca':3798, '1f9cb':3795, '1f9cd-200d-2640':1569, '1f9cd-200d-2642':1568, '1f9cd':1567, '1f9ce-200d-2640':1572, '1f9ce-200d-2642':1571, '1f9ce':1570, '1f9cf-200d-2640':1434, '1f9cf-200d-2642':1433, '1f9cf':1432, '1f9d0':172, '1f9d1-200d-1f33e':1456, '1f9d1-200d-1f373':1459, '1f9d1-200d-1f37c':1525, '1f9d1-200d-1f384':1529, '1f9d1-200d-1f393':1447, '1f9d1-200d-1f3a4':1477, '1f9d1-200d-1f3a8':1480, '1f9d1-200d-1f3eb':1450, '1f9d1-200d-1f3ed':1465, '1f9d1-200d-1f4bb':1474, '1f9d1-200d-1f4bc':1468, '1f9d1-200d-1f527':1462, '1f9d1-200d-1f52c':1471, '1f9d1-200d-1f680':1486, '1f9d1-200d-1f692':1489, '1f9d1-200d-1f91d-200d-1f9d1':1645, '1f9d1-200d-1f9af':1573, '1f9d1-200d-1f9b0':1402, '1f9d1-200d-1f9b1':1404, '1f9d1-200d-1f9b2':1408, '1f9d1-200d-1f9b3':1406, '1f9d1-200d-1f9bc':1576, '1f9d1-200d-1f9bd':1579, '1f9d1-200d-2695':1444, '1f9d1-200d-2696':1453, '1f9d1-200d-2708':1483, '1f9d1':1390, '1f9d2':1387, '1f9d3':1411, '1f9d4-200d-2640':1395, '1f9d4-200d-2642':1394, '1f9d4':1393, '1f9d5':1512, '1f9d6-200d-2640':1593, '1f9d6-200d-2642':1592, '1f9d6':1591, '1f9d7-200d-2640':1596, '1f9d7-200d-2642':1595, '1f9d7':1594, '1f9d8-200d-2640':1642, '1f9d8-200d-2642':1641, '1f9d8':1640, '1f9d9-200d-2640':1538, '1f9d9-200d-2642':1537, '1f9d9':1536, '1f9da-200d-2640':1541, '1f9da-200d-2642':1540, '1f9da':1539, '1f9db-200d-2640':1544, '1f9db-200d-2642':1543, '1f9db':1542, '1f9dc-200d-2640':1547, '1f9dc-200d-2642':1546, '1f9dc':1545, '1f9dd-200d-2640':1550, '1f9dd-200d-2642':1549, '1f9dd':1548, '1f9de-200d-2640':1553, '1f9de-200d-2642':1552, '1f9de':1551, '1f9df-200d-2640':1556, '1f9df-200d-2642':1555, '1f9df':1554, '1f9e0':1376, '1f9e1':1142, '1f9e2':61148, '1f9e3':61118, '1f9e4':61119, '1f9e5':61120, '1f9e6':61121, '1f9e7':51039, '1f9e8':51028, '1f9e9':51090, '1f9ea':61320, '1f9eb':61321, '1f9ec':61322, '1f9ed':4812, '1f9ee':61201, '1f9ef':61356, '1f9f0':61316, '1f9f1':4825, '1f9f2':61317, '1f9f3':4945, '1f9f4':61346, '1f9f5':51106, '1f9f6':51108, '1f9f7':61347, '1f9f8':51091, '1f9f9':61348, '1f9fa':61349, '1f9fb':61350, '1f9fc':61352, '1f9fd':61355, '1f9fe':61243, '1f9ff':51084, '1fa70':61142, '1fa71':61125, '1fa72':61126, '1fa73':61127, '1fa74':61135, '1fa78':61327, '1fa79':61329, '1fa7a':61331, '1fa80':51079, '1fa81':51080, '1fa82':4935, '1fa83':61302, '1fa84':51083, '1fa85':51092, '1fa86':51094, '1fa90':4993, '1fa91':61339, '1fa92':61345, '1fa93':61295, '1fa94':61217, '1fa95':61179, '1fa96':61149, '1fa97':61174, '1fa98':61181, '1fa99':61236, '1fa9a':61305, '1fa9b':61307, '1fa9c':61318, '1fa9d':61315, '1fa9e':61335, '1fa9f':61336, '1faa0':61341, '1faa1':51107, '1faa2':51109, '1faa3':61351, '1faa4':61344, '1faa5':61354, '1faa6':61360, '1faa7':61363, '1faa8':4826, '1fab0':2645, '1fab1':2646, '1fab2':2637, '1fab3':2640, '1fab4':2660, '1fab5':4827, '1fab6':2608, '1fac0':1377, '1fac1':1378, '1fac2':1686, '1fad0':3688, '1fad1':3699, '1fad2':3691, '1fad3':3712, '1fad4':3729, '1fad5':3736, '1fad6':3782, '203c':62834, '21a9':62765, '21aa':62766, '231a':4948, '231b':4946, '23cf':62818, '23e9':62805, '23ea':62809, '23eb':62812, '23ec':62814, '23ed':62806, '23ee':62810, '23ef':62807, '23f0':4949, '23f1':4950, '23f2':4951, '23f3':4947, '23f8':62815, '23f9':62816, '23fa':62817, '24c2':62890, '25aa':62938, '25ab':62939, '25b6':62804, '25c0':62808, '25fb':62935, '25fc':62934, '25fd':62937, '25fe':62936, '260e':61184, '261d':1350, '262a':62784, '262e':62785, '262f':62781, '263a':120, '264a':62790, '264b':62791, '264c':62792, '264d':62793, '264e':62794, '264f':62795, '265f':51099, '267b':62844, '267e':62833, '267f':62732, '269b':62777, '269c':62845, '26a0':62742, '26a1':41016, '26a7':62827, '26aa':62924, '26ab':62923, '26b0':61359, '26b1':61361, '26bd':51051, '26be':51052, '26c4':41019, '26c5':4999, '26c8':41000, '26ce':62800, '26cf':61296, '26d1':61150, '26d3':61314, '26d4':62744, '26e9':4853, '26ea':4849, '26f0':4814, '26f1':41015, '26f2':4855, '26f3':51070, '26f4':4928, '26f5':4924, '26f7':1599, '26f8':51071, '26f9-200d-2640':1615, '26f9-200d-2642':1614, '26f9':1613, '26fa':4856, '26fd':4915, '270a':1354, '270b':1330, '270c':1339, '270d':1365, '270f':61258, '271d':62782, '274c':62853, '274e':62854, '2764-200d-1f525':1139, '2764-200d-1fa79':1140, '27a1':62757, '27b0':62855, '27bf':62856, '2b05':62761, '2b06':62755, '2b07':62759, '2b1b':62932, '2b1c':62933, '2b50':4994, '2b55':62849, '303d':62857, '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-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff':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-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3ff':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, '1f48f-1f3fb':0, '1f48f-1f3fc':0, '1f48f-1f3fd':0, '1f48f-1f3fe':0, '1f48f-1f3ff':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f491-1f3fb':0, '1f491-1f3fc':0, '1f491-1f3fd':0, '1f491-1f3fe':0, '1f491-1f3ff':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fe':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fe':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fe':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fe':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, '1f91d-1f3fb':0, '1f91d-1f3fc':0, '1f91d-1f3fd':0, '1f91d-1f3fe':0, '1f91d-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-200d-2640':0, '1f9d4-1f3fc-200d-2640':0, '1f9d4-1f3fd-200d-2640':0, '1f9d4-1f3fe-200d-2640':0, '1f9d4-1f3ff-200d-2640':0, '1f9d4-1f3fb-200d-2642':0, '1f9d4-1f3fc-200d-2642':0, '1f9d4-1f3fd-200d-2642':0, '1f9d4-1f3fe-200d-2642':0, '1f9d4-1f3ff-200d-2642':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}};\n\nconst Emoji: {[emoji: string]: number} = EmojiVersions[''];\nfor(const version in EmojiVersions) {\n if(version) {\n Object.assign(Emoji, EmojiVersions[version as EMOJI_VERSION]);\n }\n}\n\nexport default Emoji;\n\n/* Emoji[\"00a9-fe0f\"] = 6362;\nEmoji[\"00ae-fe0f\"] = 6363;\nEmoji[\"2122-fe0f\"] = 6364; */\n","/*\n * 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 './ctx';\n\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\n\n// https://stackoverflow.com/a/58065241\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\n !(ctx as any).MSStream;\n\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 */;\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\n\nexport const IS_MOBILE = (navigator.maxTouchPoints === undefined || 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;\n","/*\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 LatinizeMap from '../config/latinizeMap';\n\nexport const badCharsRe = /[`~!@#$%^&*()\\-_=+\\[\\]\\\\|{}'\";:\\/?.>,<]+/g;\nconst trimRe = /^\\s+|\\s$/g;\n\nconst C2L: {[k: string]: string} = {\n 'ะน': 'q',\n 'ั†': 'w',\n 'ัƒ': 'e',\n 'ะบ': 'r',\n 'ะต': 't',\n 'ะฝ': 'y',\n 'ะณ': 'u',\n 'ัˆ': 'i',\n 'ั‰': 'o',\n 'ะท': 'p',\n 'ั…': '[',\n 'ัŠ': ']',\n 'ั„': 'a',\n 'ั‹': 's',\n 'ะฒ': 'd',\n 'ะฐ': 'f',\n 'ะฟ': 'g',\n 'ั€': 'h',\n 'ะพ': 'j',\n 'ะป': 'k',\n 'ะด': 'l',\n 'ะถ': ';',\n 'ั': '\\'',\n 'ั': 'z',\n 'ั‡': 'x',\n 'ั': 'c',\n 'ะผ': 'v',\n 'ะธ': 'b',\n 'ั‚': 'n',\n 'ัŒ': 'm',\n 'ะฑ': ',',\n 'ัŽ': '.',\n '.': '/'\n};\n\nexport function clearBadCharsAndTrim(text: string) {\n return text.replace(badCharsRe, '').replace(trimRe, '');\n}\n\nexport function fixCyrillic(text: string) {\n return text.toLowerCase().replace(/[\\wะฐ-ั]/g, (ch) => {\n const latinizeCh = C2L[ch];\n return latinizeCh ?? ch;\n });\n}\n\nexport function latinizeString(text: string) {\n return text.replace(/[^A-Za-z0-9]/g, (ch) => {\n const latinizeCh = LatinizeMap[ch];\n return latinizeCh ?? ch;\n });\n}\n\nexport default function cleanSearchText(text: string, latinize = true) {\n return processSearchText(text, {\n clearBadChars: true,\n latinize,\n ignoreCase: true\n });\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 const originalText = text;\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 if(options.latinize) text += '\\x01' + fixCyrillic(originalText);\n return text;\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 {InputFileLocation, InputStickerSet, InputWebFileLocation} from '../layer';\nimport type {DownloadOptions} from '../lib/mtproto/apiFileManager';\n\nconst FILENAME_JOINER = '_';\n\nexport function getFileNameByLocation(location: InputFileLocation | InputWebFileLocation, options?: Partial<{\n fileName: string,\n downloadId: string\n}>) {\n const fileName = '';// (options?.fileName || '').split('.');\n const ext = fileName[fileName.length - 1] || '';\n\n let str: string;\n switch(location._) {\n case 'inputPhotoFileLocation': {\n str = ['photo', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\n break;\n }\n\n case 'inputDocumentFileLocation': {\n str = ['document', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\n break;\n }\n\n case 'inputPeerPhotoFileLocation':\n str = ['peerPhoto', location.photo_id, location.pFlags.big ? 'big' : 'small'].join(FILENAME_JOINER);\n break;\n\n case 'inputStickerSetThumb': {\n const id = (location.stickerset as InputStickerSet.inputStickerSetID).id ||\n (location.stickerset as InputStickerSet.inputStickerSetShortName).short_name ||\n (location.stickerset as InputStickerSet.inputStickerSetDice).emoticon ||\n location.stickerset._;\n str = ['stickerSetThumb', id, location.thumb_version].join(FILENAME_JOINER);\n break;\n }\n\n case 'inputFileLocation': {\n str = [location.volume_id, location.local_id].join(FILENAME_JOINER);\n break;\n }\n\n case 'inputWebFileLocation': {\n str = ['webFile', location.url].join(FILENAME_JOINER);\n break;\n }\n\n default: {\n console.error('Unrecognized location:', location);\n str = '';\n break;\n }\n }\n\n return str + (options?.downloadId ? '_download' : '') + (ext ? '.' + ext : ext);\n}\n\nexport type FileURLType = 'photo' | 'thumb' | 'document' | 'stream' | 'download';\nexport function getFileURL(type: FileURLType, options: DownloadOptions) {\n // console.log('getFileURL', location);\n // const perf = performance.now();\n const encoded = encodeURIComponent(JSON.stringify(options));\n // console.log('getFileURL encode:', performance.now() - perf, encoded);\n\n return /* '/' + */type + '/' + encoded;\n}\n","import {RestrictionReason} from '../layer';\n\nconst platforms = new Set([\n 'all',\n 'web',\n 'webk'\n]);\n\nconst ignore = new Set();\n\nexport function getRestrictionReason(reasons: RestrictionReason[]) {\n // return reasons[0];\n return reasons.find((reason) => platforms.has(reason.platform) && !ignore.has(reason.reason));\n}\n\nexport function isRestricted(reasons: RestrictionReason[]) {\n return !!getRestrictionReason(reasons);\n}\n\nexport function ignoreRestrictionReasons(reasons: string[]) {\n ignore.clear();\n reasons.forEach((reason) => {\n ignore.add(reason);\n });\n}\n","import isObject from '../../../../helpers/object/isObject';\nimport {InputChannel, InputPeer, Peer} from '../../../../layer';\nimport {NULL_PEER_ID} from '../../../mtproto/mtproto_config';\n\nexport default function getPeerId(peerId: {user_id: UserId} | {channel_id: ChatId} | {chat_id: ChatId} | InputPeer | InputChannel | PeerId | string): PeerId {\n if(peerId !== undefined && ((peerId as string).isPeerId ? (peerId as string).isPeerId() : false)) return peerId as PeerId;\n // if(typeof(peerId) === 'string' && /^[uc]/.test(peerId)) return peerId as PeerId;\n // if(typeof(peerId) === 'number') return peerId;\n else if(isObject(peerId)) {\n const userId = (peerId as Peer.peerUser).user_id;\n if(userId !== undefined) {\n return userId.toPeerId(false);\n }\n\n const chatId = (peerId as Peer.peerChannel).channel_id || (peerId as Peer.peerChat).chat_id;\n if(chatId !== undefined) {\n return chatId.toPeerId(true);\n }\n\n return NULL_PEER_ID; // maybe it is an inputPeerSelf\n // } else if(!peerId) return 'u0';\n } else if(!peerId) return NULL_PEER_ID;\n\n const isUser = (peerId as string).charAt(0) === 'u';\n const peerParams = (peerId as string).substr(1).split('_');\n\n return isUser ? peerParams[0].toPeerId() : (peerParams[0] || '').toPeerId(true);\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 {Database} from '../../config/databases';\nimport Modes from '../../config/modes';\nimport makeError from '../../helpers/makeError';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {logger} from '../logger';\n\n/**\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\n */\nexport type IDBIndex = {\n indexName: string,\n keyPath: string,\n objectParameters: IDBIndexParameters\n};\n\nexport type IDBStore = {\n name: string,\n indexes?: IDBIndex[]\n};\n\nexport type IDBOptions = {\n name?: string,\n storeName: string,\n stores?: IDBStore[],\n version?: number\n};\n\nconst DEBUG = false;\n\nexport class IDB {\n private static INSTANCES: IDB[] = [];\n private openDbPromise: Promise;\n private db: IDBDatabase;\n private storageIsAvailable: boolean;\n private log: ReturnType;\n private name: string;\n private version: number;\n private stores: IDBStore[];\n\n constructor(db: Database) {\n safeAssign(this, db);\n\n if(Modes.test) {\n this.name += '_test';\n }\n\n this.storageIsAvailable = true;\n this.log = logger(['IDB', db.name].join('-'));\n this.log('constructor');\n\n this.openDatabase(true);\n\n IDB.INSTANCES.push(this);\n }\n\n public isAvailable() {\n return this.storageIsAvailable;\n }\n\n public openDatabase(createNew = false): Promise {\n if(this.openDbPromise && !createNew) {\n return this.openDbPromise;\n }\n\n const createIndexes = (os: IDBObjectStore, store: IDBStore) => {\n const indexNames = Array.from(os.indexNames);\n for(const indexName of indexNames) {\n os.deleteIndex(indexName);\n }\n\n if(!store.indexes?.length) {\n return;\n }\n\n for(const index of store.indexes) {\n if(os.indexNames.contains(index.indexName)) {\n continue;\n }\n\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\n }\n };\n\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\n const os = db.createObjectStore(store.name);\n createIndexes(os, store);\n };\n\n try {\n var request = indexedDB.open(this.name, this.version);\n\n if(!request) {\n return Promise.reject();\n }\n } catch(error) {\n this.log.error('error opening db', (error as Error).message);\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n let finished = false;\n setTimeout(() => {\n if(!finished) {\n request.onerror(makeError('IDB_CREATE_TIMEOUT') as Event);\n }\n }, 3000);\n\n return this.openDbPromise = new Promise((resolve, reject) => {\n request.onsuccess = (event) => {\n finished = true;\n const db = request.result;\n let calledNew = false;\n\n this.log('Opened');\n\n db.onerror = (error) => {\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', error);\n reject(error);\n };\n\n db.onclose = (e) => {\n this.log.error('closed:', e);\n !calledNew && this.openDatabase();\n };\n\n db.onabort = (e) => {\n this.log.error('abort:', e);\n const transaction = e.target as IDBTransaction;\n\n this.openDatabase(calledNew = true);\n\n if(transaction.onerror) {\n transaction.onerror(e);\n }\n\n db.close();\n };\n\n db.onversionchange = (e) => {\n this.log.error('onversionchange, lol?');\n };\n\n resolve(this.db = db);\n };\n\n request.onerror = (event) => {\n finished = true;\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', event);\n reject(event);\n };\n\n request.onupgradeneeded = (event) => {\n finished = true;\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\n\n const target = event.target as IDBOpenDBRequest;\n const db = target.result;\n this.stores.forEach((store) => {\n /* if(db.objectStoreNames.contains(store.name)) {\n //if(event.oldVersion === 1) {\n db.deleteObjectStore(store.name);\n //}\n } */\n\n if(!db.objectStoreNames.contains(store.name)) {\n createObjectStore(db, store);\n } else {\n const txn = target.transaction;\n const os = txn.objectStore(store.name);\n createIndexes(os, store);\n }\n });\n };\n });\n }\n\n public static create>(db: T) {\n return this.INSTANCES.find((instance) => instance.name === db.name) ?? new IDB(db);\n }\n\n public static closeDatabases(preserve?: IDB) {\n this.INSTANCES.forEach((storage) => {\n if(preserve && preserve === storage) {\n return;\n }\n\n const db = storage.db;\n if(db) {\n db.onclose = () => {};\n db.close();\n }\n });\n }\n}\n\nexport default class IDBStorage, StoreName extends string = T['stores'][0]['name']> {\n private log: ReturnType;\n private storeName: T['stores'][0]['name'];\n private idb: IDB;\n\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\n this.storeName = storeName;\n this.log = logger(['IDB', db.name, storeName].join('-'));\n this.idb = IDB.create(db);\n }\n\n /**\n * ! WARNING ! function requires at least one opened connection\n */\n /* public static clearObjectStores() {\n const storage = this.STORAGES[0];\n this.closeDatabases(storage);\n\n const names = Array.from(storage.db.objectStoreNames);\n const promises = names.map((name) => storage.clear(name));\n return Promise.all(promises);\n } */\n\n /* public static deleteDatabase() {\n this.closeDatabases();\n\n const storages = this.STORAGES;\n const dbNames = Array.from(new Set(storages.map((storage) => storage.name)));\n const promises = dbNames.map((dbName) => {\n return new Promise((resolve, reject) => {\n const deleteRequest = indexedDB.deleteDatabase(dbName);\n\n deleteRequest.onerror = () => {\n reject();\n };\n\n deleteRequest.onsuccess = () => {\n resolve();\n };\n });\n });\n\n return Promise.all(promises);\n } */\n\n public delete(entryName: string | string[], storeName?: StoreName): Promise {\n // return Promise.resolve();\n const isArray = Array.isArray(entryName);\n if(!isArray) {\n entryName = [].concat(entryName);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n const promises = (entryName as string[]).map((entryName) => objectStore.delete(entryName));\n return isArray ? promises : promises[0];\n }, DEBUG ? 'delete: ' + (entryName as string[]).join(', ') : '', storeName);\n }\n\n public clear(storeName?: StoreName): Promise {\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\n }\n\n public save(entryName: string | string[], value: any | any[], storeName?: StoreName) {\n // const handleError = (error: Error) => {\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\n // setTimeout(() => {\n // this.save(entryName, value);\n // }, 2e3);\n // } else {\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\n // }\n // };\n\n const isArray = Array.isArray(entryName);\n if(!isArray) {\n entryName = [].concat(entryName);\n value = [].concat(value);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n const promises = (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\n return isArray ? promises : promises[0];\n }, DEBUG ? 'save: ' + (entryName as string[]).join(', ') : '', storeName);\n }\n\n // public saveFile(fileName: string, blob: Blob | Uint8Array) {\n // //return Promise.resolve(blobConstruct([blob]));\n // if(!(blob instanceof Blob)) {\n // blob = blobConstruct(blob);\n // }\n\n // return this.save(fileName, blob);\n // }\n\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\n return Promise.reject();\n }\n\n if(!(blob instanceof Blob)) {\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\n return this.storagePutB64String(db, fileName, address).then(() => {\n return blob;\n });\n }\n\n try {\n var reader = new FileReader();\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n let promise = new Promise((resolve, reject) => {\n reader.onloadend = () => {\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\n resolve(blob);\n }, reject);\n }\n\n reader.onerror = reject;\n });\n\n\n try {\n reader.readAsDataURL(blob);\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n return promise;\n }\n\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\n try {\n var objectStore = db.transaction([this.storeName], 'readwrite')\n .objectStore(this.storeName);\n var request = objectStore.put(b64string, fileName);\n } catch(error) {\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n resolve();\n };\n\n request.onerror = reject;\n });\n }\n\n public getBlobSize(blob: any) {\n return blob.size || blob.byteLength || blob.length;\n } */\n\n public get(entryName: string[], storeName?: StoreName): Promise;\n public get(entryName: string, storeName?: StoreName): Promise;\n public get(entryName: string | string[], storeName?: StoreName): Promise | Promise {\n // return Promise.reject();\n\n const isArray = Array.isArray(entryName);\n if(!isArray) {\n if(!entryName) {\n return undefined;\n }\n\n entryName = [].concat(entryName);\n } else if(!entryName.length) {\n return Promise.resolve([]) as any;\n }\n\n return this.getObjectStore('readonly', (objectStore) => {\n const promises = (entryName as string[]).map((entryName) => objectStore.get(entryName));\n return isArray ? promises : promises[0];\n }, DEBUG ? 'get: ' + (entryName as string[]).join(', ') : '', storeName);\n }\n\n private getObjectStore(\n mode: IDBTransactionMode,\n callback: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[],\n log?: string,\n storeName = this.storeName\n ) {\n let perf: number;\n\n if(log) {\n perf = performance.now();\n this.log(log + ': start');\n }\n\n return this.idb.openDatabase().then((db) => {\n return new Promise((resolve, reject) => {\n /* if(mode === 'readwrite') {\n return;\n } */\n\n const transaction = db.transaction([storeName], mode);\n\n const onError = () => {\n clearTimeout(timeout);\n reject(transaction.error);\n };\n\n // let resolved = false;\n const onComplete = (/* what: string */) => {\n clearTimeout(timeout);\n\n if(log) {\n this.log(log + ': end', performance.now() - perf/* , what */);\n }\n\n // if(resolved) {\n // return;\n // }\n\n // resolved = true;\n const results = requests.map((r) => r.result);\n resolve(isArray ? results : results[0]);\n };\n\n transaction.onerror = onError;\n\n // * have to wait while clearing or setting something\n const waitForTransactionComplete = mode === 'readwrite';\n if(waitForTransactionComplete) {\n transaction.oncomplete = () => onComplete(/* 'transaction' */);\n }\n\n const timeout = setTimeout(() => {\n this.log.error('transaction not finished', transaction, log);\n }, 10000);\n\n /* transaction.addEventListener('abort', (e) => {\n //handleError();\n this.log.error('IndexedDB: transaction abort!', transaction.error);\n }); */\n\n const callbackResult = callback(transaction.objectStore(storeName));\n\n const isArray = Array.isArray(callbackResult);\n const requests: IDBRequest[] = isArray ? callbackResult : [].concat(callbackResult) as any;\n\n if(waitForTransactionComplete) {\n return;\n }\n\n const length = requests.length;\n let left = length;\n\n const onRequestFinished = () => {\n if(transaction.error) {\n return;\n }\n\n if(!--left) {\n onComplete(/* 'requests' */);\n }\n };\n\n for(let i = 0; i < length; ++i) {\n const request = requests[i];\n request.onerror = onError;\n request.onsuccess = onRequestFinished;\n }\n });\n });\n }\n\n public getAll(storeName?: StoreName): Promise {\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '', storeName);\n }\n\n /* public getAllKeys(): Promise> {\n console.time('getAllEntries');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.getAllKeys();\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var result = event.target.result;\n resolve(result);\n console.timeEnd('getAllEntries');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public isFileExists(fileName: string): Promise {\n console.time('isFileExists');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.openCursor(fileName);\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var cursor = event.target.result;\n resolve(!!cursor);\n console.timeEnd('isFileExists');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public getFileWriter(fileName: string, mimeType: string) {\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\n return this.saveFile(fileName, blob);\n });\n\n return Promise.resolve(fakeWriter);\n } */\n}\n","import type ENVIRONMENT from '.';\n\nlet environment: typeof ENVIRONMENT;\nexport function getEnvironment() {\n return environment;\n}\n\nexport function setEnvironment(env: typeof environment) {\n return environment = env;\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 {Message, StickerSet, Update, NotifyPeer, PeerNotifySettings, PollResults, Poll, WebPage, GroupCall, GroupCallParticipant, ReactionCount, MessagePeerReaction, PhoneCall, Config, Reaction} from '../layer';\nimport type {Dialog, ForumTopic, MessagesStorageKey, MyMessage} from './appManagers/appMessagesManager';\nimport type {MyDialogFilter} from './storages/filters';\nimport type {Folder} from './storages/dialogs';\nimport type {UserTyping} from './appManagers/appProfileManager';\nimport type {MyDraftMessage} from './appManagers/appDraftsManager';\nimport type {ConnectionStatusChange} from './mtproto/connectionStatus';\nimport type {GroupCallId} from './appManagers/appGroupCallsManager';\nimport type {AppManagers} from './appManagers/managers';\nimport type {State} from '../config/state';\nimport type {Progress} from './appManagers/appDownloadManager';\nimport type {CallId} from './appManagers/appCallsManager';\nimport type {MyDocument} from './appManagers/appDocsManager';\nimport type {MTAppConfig} from './mtproto/appConfig';\nimport {NULL_PEER_ID, UserAuth} from './mtproto/mtproto_config';\nimport EventListenerBase from '../helpers/eventListenerBase';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport MTProtoMessagePort from './mtproto/mtprotoMessagePort';\nimport {IS_WORKER} from '../helpers/context';\n\nexport type BroadcastEvents = {\n 'chat_full_update': ChatId,\n 'chat_update': ChatId,\n 'chat_toggle_forum': {chatId: ChatId, enabled: boolean},\n\n 'channel_update': ChatId,\n\n 'user_update': UserId,\n 'user_auth': UserAuth,\n 'user_full_update': UserId,\n\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, threadId?: number, typings: UserTyping[]},\n 'peer_block': {peerId: PeerId, blocked: boolean},\n 'peer_title_edit': {peerId: PeerId, threadId?: number},\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': Omit,\n\n 'dialog_draft': {peerId: PeerId, dialog: Dialog | ForumTopic, drop: boolean, draft: MyDraftMessage | undefined},\n 'dialog_unread': {peerId: PeerId, dialog: Dialog | ForumTopic},\n 'dialog_flush': {peerId: PeerId, dialog: Dialog},\n 'dialog_drop': Dialog | ForumTopic,\n 'dialog_migrate': {migrateFrom: PeerId, migrateTo: PeerId},\n // 'dialog_top': Dialog,\n 'dialog_notify_settings': Dialog | ForumTopic,\n // 'dialog_order': {dialog: Dialog, pos: number},\n 'dialogs_multiupdate': Map}>,\n\n 'history_append': {storageKey: MessagesStorageKey, message: Message.message},\n 'history_update': {storageKey: MessagesStorageKey, message: MyMessage, sequential?: boolean},\n 'history_reply_markup': {peerId: PeerId},\n 'history_multiappend': MyMessage,\n 'history_delete': {peerId: PeerId, msgs: Set},\n 'history_forbidden': PeerId,\n 'history_reload': PeerId,\n // 'history_request': void,\n\n 'message_edit': {storageKey: MessagesStorageKey, peerId: PeerId, mid: number, message: MyMessage},\n 'message_sent': {storageKey: MessagesStorageKey, tempId: number, tempMessage: any, mid: number, message: MyMessage},\n 'message_error': {storageKey: MessagesStorageKey, tempId: number, error: ApiError},\n 'messages_views': {peerId: PeerId, mid: number, views: number}[],\n 'messages_reactions': {message: Message.message, changedResults: ReactionCount[]}[],\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': Message.message,\n 'scheduled_delete': {peerId: PeerId, mids: number[]},\n\n 'album_edit': {peerId: PeerId, groupId: string, deletedMids: number[], messages: Message.message[]},\n\n 'stickers_installed': StickerSet.stickerSet,\n 'stickers_deleted': StickerSet.stickerSet,\n 'stickers_updated': {type: 'recent' | 'faved', stickers: MyDocument[]},\n 'stickers_top': Long,\n 'sticker_updated': {type: 'recent' | 'faved', document: MyDocument, faved: boolean},\n\n 'state_cleared': void,\n 'state_synchronized': ChatId | void,\n 'state_synchronizing': ChatId | void,\n\n 'contacts_update': UserId,\n 'avatar_update': {peerId: PeerId, threadId?: number},\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, settings: State['settings']},\n 'draft_updated': {peerId: PeerId, threadId: number, draft: MyDraftMessage | undefined, force?: 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 'notification_reset': string,\n 'notification_cancel': string,\n\n 'language_change': string,\n\n 'theme_change': void,\n\n 'media_play': void,\n\n 'emoji_recent': AppEmoji,\n\n 'download_progress': Progress,\n 'document_downloading': DocId,\n 'document_downloaded': DocId,\n\n 'choosing_sticker': boolean\n\n 'group_call_update': GroupCall,\n 'group_call_participant': {groupCallId: GroupCallId, participant: GroupCallParticipant},\n // 'group_call_video_track_added': {instance: GroupCallInstance}\n\n 'call_update': PhoneCall,\n 'call_signaling': {callId: CallId, data: Uint8Array},\n\n 'quick_reaction': Reaction,\n\n 'service_notification': Update.updateServiceNotification,\n\n 'logging_out': void,\n\n 'payment_sent': {peerId: PeerId, mid: number, receiptMessage: Message.messageService}\n\n 'premium_toggle': boolean,\n 'premium_toggle_private': {isNew: boolean, isPremium: boolean},\n\n 'config': Config,\n 'app_config': MTAppConfig\n};\n\nexport type BroadcastEventsListeners = {\n [name in keyof BroadcastEvents]: (e: BroadcastEvents[name]) => void\n};\n\nexport class RootScope extends EventListenerBase {\n public myId: PeerId;\n private connectionStatus: {[name: string]: ConnectionStatusChange};\n public settings: State['settings'];\n public managers: AppManagers;\n public premium: boolean;\n\n constructor() {\n super();\n\n this.myId = NULL_PEER_ID;\n this.connectionStatus = {};\n this.premium = false;\n\n this.addEventListener('user_auth', ({id}) => {\n this.myId = id.toPeerId();\n });\n\n this.addEventListener('premium_toggle_private', ({isNew, isPremium}) => {\n this.premium = isPremium;\n\n if(!isNew) {\n this.dispatchEventSingle('premium_toggle', isPremium);\n }\n });\n\n this.addEventListener('connection_status_change', (status) => {\n this.connectionStatus[status.name] = status;\n });\n\n this.dispatchEvent = (e, ...args) => {\n super.dispatchEvent(e, ...args);\n MTProtoMessagePort.getInstance().invokeVoid('event', {name: e as string, args});\n };\n\n if(!IS_WORKER) {\n this.addEventListener('settings_updated', ({settings}) => {\n this.settings = settings;\n });\n }\n }\n\n public getConnectionStatus() {\n return this.connectionStatus;\n }\n\n public getPremium() {\n return this.premium;\n }\n\n public dispatchEventSingle(...args: any[]) {\n // @ts-ignore\n super.dispatchEvent(...args);\n }\n}\n\nconst rootScope = new RootScope();\nMOUNT_CLASS_TO.rootScope = rootScope;\nexport default rootScope;\n","/*\n * 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 {State} from '../../config/state';\nimport rootScope from '../rootScope';\nimport stateStorage from '../stateStorage';\nimport setDeepProperty from '../../helpers/object/setDeepProperty';\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\n\nexport class AppStateManager {\n private state: State = {} as any;\n private storage = stateStorage;\n\n // ! for mtproto worker use only\n public newVersion: string;\n public oldVersion: string;\n public userId: UserId;\n\n public getState() {\n return Promise.resolve(this.state);\n }\n\n public setByKey(key: string, value: any) {\n setDeepProperty(this.state, key, value);\n\n const first = key.split('.')[0] as keyof State;\n if(first === 'settings') {\n rootScope.dispatchEvent('settings_updated', {key, value, settings: this.state.settings});\n }\n\n this.pushToState(first, this.state[first]);\n }\n\n public pushToState(key: T, value: State[T], direct = true, onlyLocal?: boolean) {\n if(direct) {\n this.state[key] = value;\n }\n\n this.setKeyValueToStorage(key, value, onlyLocal);\n }\n\n public setKeyValueToStorage(key: T, value: State[T] = this.state[key], onlyLocal?: boolean) {\n MTProtoMessagePort.getInstance().invokeVoid('mirror', {name: 'state', key, value});\n\n this.storage.set({\n [key]: value\n }, onlyLocal);\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\nconst appStateManager = new AppStateManager();\nexport default appStateManager;\n","import getDeepProperty from './getDeepProperty';\n\nexport default function setDeepProperty(object: any, key: string, value: any) {\n const splitted = key.split('.');\n getDeepProperty(object, splitted.slice(0, -1).join('.'))[splitted.pop()] = value;\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 pause from '../../../helpers/schedulers/pause';\nimport {DcId} from '../../../types';\nimport {logger, LogTypes} from '../../logger';\nimport type MTPNetworker from '../networker';\nimport MTTransport from './transport';\nimport Modes from '../../../config/modes';\n\n \nimport transportController from './controller';\n// import networkStats from '../networkStats';\n \n\nexport default class HTTP implements MTTransport {\n public networker: MTPNetworker;\n private log: ReturnType;\n\n private pending: Array<{\n resolve: (body: Uint8Array) => void,\n reject: any,\n body: Uint8Array\n }> = [];\n private releasing: boolean;\n\n public connected: boolean;\n private destroyed: boolean;\n private debug: boolean;\n\n constructor(protected dcId: DcId, protected url: string, logSuffix: string) {\n this.debug = Modes.debug && false;\n\n let logTypes = LogTypes.Error | LogTypes.Log;\n if(this.debug) logTypes |= LogTypes.Debug;\n\n this.log = logger(`HTTP-${dcId}` + logSuffix, logTypes);\n this.log('constructor');\n\n this.connected = false;\n }\n\n public _send(body: Uint8Array, mode?: RequestMode) {\n const length = body.length;\n this.debug && this.log.debug('-> body length to send:', length);\n\n // networkStats.addSent(this.dcId, length);\n return fetch(this.url, {method: 'POST', body, mode}).then((response) => {\n if(response.status !== 200 && !mode) {\n response.arrayBuffer().then((buffer) => {\n this.log.error('not 200',\n new TextDecoder('utf-8').decode(new Uint8Array(buffer)));\n });\n\n throw response;\n }\n\n this.setConnected(true);\n\n // * test resending by dropping random request\n // if(Math.random() > .5) {\n // throw 'asd';\n // }\n\n return response.arrayBuffer().then((buffer) => {\n // networkStats.addReceived(this.dcId, buffer.byteLength);\n return new Uint8Array(buffer);\n });\n }, (err) => {\n this.setConnected(false);\n throw err;\n });\n }\n\n private setConnected(connected: boolean) {\n if(this.connected === connected || this.destroyed) {\n return;\n }\n\n this.connected = connected;\n\n \n transportController.setTransportValue('https', connected);\n \n }\n\n public destroy() {\n this.setConnected(false);\n this.destroyed = true;\n this.pending.forEach((pending) => pending.reject());\n this.pending.length = 0;\n }\n\n public send(body: Uint8Array) {\n if(this.networker) {\n return this._send(body);\n } else {\n const promise = new Promise((resolve, reject) => {\n this.pending.push({resolve, reject, body});\n });\n\n this.releasePending();\n\n return promise;\n }\n }\n\n private async releasePending() {\n if(this.releasing) return;\n\n this.releasing = true;\n // this.log('-> messages to send:', this.pending.length);\n for(let i = 0; i < this.pending.length; ++i) {\n const pending = this.pending[i];\n const {body, resolve} = pending;\n\n try {\n const result = await this._send(body);\n resolve(result);\n this.pending.splice(i, 1);\n } catch(err) {\n this.log.error('Send plain request error:', err);\n await pause(5000);\n }\n\n --i;\n }\n\n this.releasing = false;\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, LogTypes} from '../../logger';\nimport Modes from '../../../config/modes';\nimport EventListenerBase from '../../../helpers/eventListenerBase';\nimport {MTConnection} from './transport';\n\n// let closeSocketBefore = Date.now() + 30e3;\n// let closeSocketAfter = Date.now() + 10e3;\n\nexport default class Socket extends EventListenerBase<{\n open: () => void,\n message: (buffer: ArrayBuffer) => any,\n close: () => void,\n}> implements MTConnection {\n private ws: WebSocket;\n private log: ReturnType;\n private debug = Modes.debug && false;\n\n constructor(protected dcId: number, protected url: string, logSuffix: string) {\n super();\n\n let logTypes = LogTypes.Error | LogTypes.Log;\n if(this.debug) logTypes |= LogTypes.Debug;\n this.log = logger(`WS-${dcId}` + logSuffix, logTypes);\n this.log('constructor');\n this.connect();\n\n return this;\n }\n\n private removeListeners() {\n if(!this.ws) {\n return;\n }\n\n this.ws.removeEventListener('open', this.handleOpen);\n this.ws.removeEventListener('close', this.handleClose);\n this.ws.removeEventListener('error', this.handleError);\n this.ws.removeEventListener('message', this.handleMessage);\n this.ws = undefined;\n }\n\n private connect() {\n this.ws = new WebSocket(this.url, 'binary');\n this.ws.binaryType = 'arraybuffer';\n this.ws.addEventListener('open', this.handleOpen);\n this.ws.addEventListener('close', this.handleClose);\n this.ws.addEventListener('error', this.handleError);\n this.ws.addEventListener('message', this.handleMessage);\n\n // if(Date.now() < closeSocketBefore) {\n // if(Date.now() >= closeSocketAfter) {\n // this.ws.close();\n // }\n }\n\n public close() {\n if(!this.ws) {\n return;\n }\n\n this.log('close execution');\n\n try {\n this.ws.close();\n } catch(err) {\n\n }\n this.handleClose();\n }\n\n private handleOpen = () => {\n this.log('opened');\n\n this.debug && this.log.debug('sending init packet');\n this.dispatchEvent('open');\n };\n\n private handleError = (e: Event) => {\n this.log.error('handleError', e);\n this.close();\n };\n\n private handleClose = (e?: CloseEvent) => {\n this.log('closed', e/* , this.pending, this.ws.bufferedAmount */);\n\n this.removeListeners();\n this.dispatchEvent('close');\n };\n\n private handleMessage = (event: MessageEvent) => {\n this.debug && this.log.debug('<-', 'handleMessage', /* event, */event.data.byteLength);\n\n this.dispatchEvent('message', event.data as ArrayBuffer);\n };\n\n public send = (body: Uint8Array) => {\n this.debug && this.log.debug('-> body length to send:', body.length);\n\n this.ws.send(body);\n };\n}\n","export default function randomize(arr: T) {\n if(crypto && 'getRandomValues' in crypto) {\n crypto.getRandomValues(arr);\n } else {\n throw new Error('NO_SECURE_RANDOM');\n }\n\n return arr;\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 aesjs from 'aes-js';\nimport randomize from '../../../helpers/array/randomize';\nimport cryptoMessagePort from '../../crypto/cryptoMessagePort';\nimport {Codec} from './codec';\n\n/*\n@cryptography/aes ะฝะต ั€ะฐะฑะพั‚ะฐะตั‚ ั ะผะฐััะธะฒะฐะผะธ ะบะพั‚ะพั€ั‹ะต ะฝะต ะบั€ะฐั‚ะฝั‹ 4, ะฟะพัั‚ะพะผัƒ ะธัะฟะพะปัŒะทัƒัŽ intermediate ะฐ ะฝะต abridged\n*/\nexport default class Obfuscation {\n /* private enc: aesjs.ModeOfOperation.ModeOfOperationCTR;\n private dec: aesjs.ModeOfOperation.ModeOfOperationCTR; */\n\n private id: number;\n private idPromise: Promise;\n private process: (data: Uint8Array, operation: 'encrypt' | 'decrypt') => ReturnType;\n\n // private cryptoEncKey: CryptoKey;\n // private cryptoDecKey: CryptoKey;\n // private cryptoKey: CryptoKey;\n\n // private encIv: Uint8Array;\n // private decIv: Uint8Array;\n\n // private decIvCounter: Counter;\n\n public async init(codec: Codec) {\n if(this.idPromise !== undefined) {\n this.release();\n }\n\n const initPayload = new Uint8Array(64);\n randomize(initPayload);\n\n while(true) {\n const val = (initPayload[3] << 24) | (initPayload[2] << 16) | (initPayload[1] << 8) | initPayload[0];\n const val2 = (initPayload[7] << 24) | (initPayload[6] << 16) | (initPayload[5] << 8) | initPayload[4];\n if(initPayload[0] !== 0xef &&\n val !== 0x44414548 &&\n val !== 0x54534f50 &&\n val !== 0x20544547 &&\n val !== 0x4954504f &&\n val !== 0xeeeeeeee &&\n val !== 0xdddddddd &&\n val2 !== 0x00000000) {\n // initPayload[56] = initPayload[57] = initPayload[58] = initPayload[59] = transport;\n break;\n }\n randomize(initPayload);\n }\n\n // //////////////////////initPayload.subarray(60, 62).hex = dcId;\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]));\n console.log('initPayload', initPayload); */\n\n const reversedPayload = initPayload.slice().reverse();\n\n const encKey = initPayload.slice(8, 40);\n const encIv = /* this.encIv = */initPayload.slice(40, 56);\n const decKey = reversedPayload.slice(8, 40);\n const decIv = /* this.decIv = */reversedPayload.slice(40, 56);\n\n /* this.enc = new aesjs.ModeOfOperation.ctr(encKey, new aesjs.Counter(encIv as any));\n this.dec = new aesjs.ModeOfOperation.ctr(decKey, new aesjs.Counter(decIv as any)); */\n\n // console.log('encKey', encKey.hex, encIv.hex);\n // console.log('decKey', decKey.hex, decIv.hex);\n\n const idPromise = this.idPromise = cryptoMessagePort.invokeCrypto('aes-ctr-prepare', {\n encKey,\n encIv,\n decKey,\n decIv\n });\n\n this.process = async(data, operation) => {\n await idPromise;\n return this._process(data, operation);\n };\n\n this.id = await idPromise;\n\n this.process = this._process;\n\n // this.decIvCounter = new Counter(this.decIv);\n /* const key = this.cryptoEncKey = await subtle.importKey(\n 'raw',\n encKey,\n {name: 'AES-CTR'},\n false,\n ['encrypt']\n ); */\n\n // this.cryptoDecKey = await subtle.importKey(\n // 'raw',\n // decKey,\n // {name: 'AES-CTR'},\n // false,\n // ['encrypt']\n // );\n\n // this.cryptoKey = await subtle.importKey(\n // 'raw',\n // encKey,\n // {name: 'AES-CTR'},\n // false,\n // ['encrypt', 'decrypt']\n // );\n\n initPayload.set(codec.obfuscateTag, 56);\n const encrypted = await this.encode(initPayload.slice());\n\n // console.log('encrypted', encrypted);\n\n initPayload.set(encrypted.slice(56, 64), 56);\n\n return initPayload;\n }\n\n /* public encode(payload: Uint8Array) {\n let startTime = performance.now();\n let res = this.enc.encrypt(payload);\n let time = performance.now() - startTime;\n\n try {\n startTime = performance.now();\n let arr = this.encNew.encrypt(payload);\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\n let resNew = new Uint8Array(bytesFromWordss(arr));\n let time2 = performance.now() - startTime;\n console.log('Obfuscation: encode comparison:', res, arr, resNew, res.hex === resNew.hex, time2 < time);\n } catch(err) {\n console.error('Obfuscation: error:', err);\n }\n\n return res;\n }\n\n public decode(payload: Uint8Array) {\n let res = this.dec.encrypt(payload);\n\n try {\n let arr = this.decNew.decrypt(payload);\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\n let resNew = new Uint8Array(bytesFromWordss(arr));\n console.log('Obfuscation: decode comparison:', res, arr, resNew, res.hex === resNew.hex);\n } catch(err) {\n console.error('Obfuscation: error:', err);\n }\n\n return res;\n } */\n\n private _process = (data: Uint8Array, operation: 'encrypt' | 'decrypt') => {\n return cryptoMessagePort.invokeCryptoNew({\n method: 'aes-ctr-process',\n args: [{id: this.id, data, operation}],\n transfer: [data.buffer]\n }) as Promise;\n };\n\n public encode(payload: Uint8Array) {\n /* return subtle.encrypt({\n name: 'AES-CTR',\n counter: this.encIv,\n length: 64\n },\n this.cryptoEncKey,\n payload\n ); */\n return this.process(payload, 'encrypt');\n }\n\n public decode(payload: Uint8Array) {\n return this.process(payload, 'decrypt');\n }\n\n public async release() {\n const idPromise = this.idPromise;\n if(idPromise === undefined) {\n return;\n }\n\n this.id = undefined;\n this.idPromise = undefined;\n\n const id = await idPromise;\n cryptoMessagePort.invokeCrypto('aes-ctr-destroy', id);\n }\n\n public destroy() {\n this.release();\n }\n\n // public encode(payload: Uint8Array) {\n // let res = this.encNew.encrypt(payload);\n // let bytes = new Uint8Array(bytesFromWordss(res));\n\n // return bytes;\n // }\n\n // public async decode(payload: Uint8Array) {\n // const counter = this.decIvCounter.counter.slice();\n // this.decIvCounter.increment();\n\n // const n: ArrayBuffer = await subtle.encrypt({\n // name: 'AES-CTR',\n // counter: counter,\n // length: 64\n // },\n // this.cryptoDecKey,\n // payload\n // );\n\n // const decoded = this.decNew.update(payload);\n\n // console.log('decode', bytesToHex(decoded), 'new', n, bytesToHex(new Uint8Array(n)));\n\n // return decoded;\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 { bytesFromHex, addPadding } from \"../../bin_utils\";\nimport {Codec} from './codec';\n\nclass AbridgedPacketCodec implements Codec {\n public tag = 0xef;\n public obfuscateTag = new Uint8Array([this.tag, this.tag, this.tag, this.tag]);\n\n public encodePacket(data: Uint8Array) {\n const len = data.byteLength >> 2;\n let header: Uint8Array;\n if(len < 127) {\n header = new Uint8Array([len]);\n } else { // Length: payload length, divided by four, and encoded as 3 length bytes (little endian)\n // header = new Uint8Array([0x7f, ...addPadding(bytesFromHex(len.toString(16)).reverse(), 3, true)/* .reverse() */]);\n header = new Uint8Array([0x7f, len & 0xFF, (len >> 8) & 0xFF, (len >> 16) & 0xFF]);\n // console.log('got nobody cause im braindead', header, len);\n }\n\n return header.concat(data);\n // return new Uint8Array([...header, ...data]);\n }\n\n public readPacket(data: Uint8Array) {\n let length = data[0];\n if(length >= 127) { // 0x7f\n length = data[1] | (data[2] << 8) | (data[3] << 16);\n\n return data.slice(4, length << 2 + 1); // need +1\n }\n\n return data.slice(1, length << 2 + 1); // need +1\n }\n}\n\nexport default new AbridgedPacketCodec();\n","export default function bytesToHex(bytes: ArrayLike) {\n const length = bytes.length;\n const arr: string[] = new Array(length);\n for(let i = 0; i < length; ++i) {\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\n }\n return arr.join('');\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 Modes from '../../../config/modes';\nimport {logger, LogTypes} from '../../logger';\nimport MTPNetworker from '../networker';\nimport Obfuscation from './obfuscation';\nimport MTTransport, {MTConnection, MTConnectionConstructable} from './transport';\n// import intermediatePacketCodec from './intermediate';\nimport abridgedPacketCodec from './abridged';\n// import paddedIntermediatePacketCodec from './padded';\nimport {ConnectionStatus} from '../connectionStatus';\n\n \nimport transportController from './controller';\nimport bytesToHex from '../../../helpers/bytes/bytesToHex';\n// import networkStats from '../networkStats';\nimport ctx from '../../../environment/ctx';\n \n\nexport default class TcpObfuscated implements MTTransport {\n private codec = abridgedPacketCodec;\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 private releasingPending: boolean;\n\n // private debugPayloads: MTPNetworker['debugRequests'] = [];\n\n constructor(\n 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 = async() => {\n this.connected = true;\n\n \n transportController.setTransportOpened('websocket');\n \n\n const initPayload = await this.obfuscation.init(this.codec);\n if(!this.connected) {\n return;\n }\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 = async(buffer: ArrayBuffer) => {\n // networkStats.addReceived(this.dcId, buffer.byteLength);\n\n let data = await 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:', bytesToHex(data));\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 = ctx.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 if(this.obfuscation) {\n this.obfuscation.destroy();\n }\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 public changeUrl(url: string) {\n if(this.url === url) {\n return;\n }\n\n this.url = url;\n this.forceReconnect();\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 async releasePending(/* tt = false */) {\n if(!this.connected || this.releasingPending) {\n // this.connect();\n return;\n }\n\n this.releasingPending = true;\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 let sent = false;\n // for(let i = length - 1; i >= 0; --i) {\n for(let i = 0; i < length; ++i) {\n const pending = this.pending[i];\n if(!pending) {\n break;\n }\n\n const {body, bodySent} = pending;\n if(body && !bodySent) {\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 const encoded = pending.encoded ??= await this.encodeBody(body);\n if(!this.connected) {\n break;\n }\n\n // networkStats.addSent(this.dcId, encoded.byteLength);\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 sent = true;\n // delete pending.body;\n }\n }\n\n this.releasingPending = undefined;\n\n if(this.pending.length && sent) {\n this.releasePending();\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/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport MTTransport, {MTConnectionConstructable} from './transports/transport';\nimport Modes from '../../config/modes';\nimport App from '../../config/app';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\n\n \nimport HTTP from './transports/http';\n \n\n \nimport Socket from './transports/websocket';\nimport TcpObfuscated from './transports/tcpObfuscated';\nimport {IS_WEB_WORKER} from '../../helpers/context';\nimport {DcId} from '../../types';\nimport {getEnvironment} from '../../environment/utils';\n\n \n \n \n\n \n\nexport type TransportType = 'websocket' | 'https' | 'http';\nexport type ConnectionType = 'client' | 'download' | 'upload';\ntype Servers = {\n [transportType in TransportType]: {\n [connectionType in ConnectionType]: {\n [dcId: DcId]: MTTransport[]\n }\n }\n};\n\nconst TEST_SUFFIX = Modes.test ? '_test' : '';\nconst PREMIUM_SUFFIX = '_premium';\n\nexport function getTelegramConnectionSuffix(connectionType: ConnectionType) {\n return connectionType === 'client' ? '' : '-1';\n}\n\n \nexport function constructTelegramWebSocketUrl(dcId: DcId, connectionType: ConnectionType, premium?: boolean) {\n const suffix = getTelegramConnectionSuffix(connectionType);\n const path = connectionType !== 'client' ? 'apiws' + TEST_SUFFIX + (premium ? PREMIUM_SUFFIX : '') : ('apiws' + TEST_SUFFIX);\n const chosenServer = `wss://${App.suffix.toLowerCase()}ws${dcId}${suffix}.web.telegram.org/${path}`;\n\n return chosenServer;\n}\n \n\nexport class DcConfigurator {\n private sslSubdomains = ['pluto', 'venus', 'aurora', 'vesta', 'flora'];\n\n private dcOptions = Modes.test ?\n [\n {id: 1, host: '149.154.175.10', port: 80},\n {id: 2, host: '149.154.167.40', port: 80},\n {id: 3, host: '149.154.175.117', port: 80}\n ] :\n [\n {id: 1, host: '149.154.175.50', port: 80},\n {id: 2, host: '149.154.167.50', port: 80},\n {id: 3, host: '149.154.175.100', port: 80},\n {id: 4, host: '149.154.167.91', port: 80},\n {id: 5, host: '149.154.171.5', port: 80}\n ];\n\n public chosenServers: Servers = {} as any;\n\n \n private transportSocket = (dcId: DcId, connectionType: ConnectionType, premium?: boolean) => {\n const chosenServer = constructTelegramWebSocketUrl(dcId, connectionType, premium);\n const logSuffix = connectionType === 'upload' ? '-U' : connectionType === 'download' ? '-D' : '';\n\n const retryTimeout = connectionType === 'client' ? 10000 : 10000;\n\n let oooohLetMeLive: MTConnectionConstructable;\n \n oooohLetMeLive = Socket;\n \n \n \n\n return new TcpObfuscated(oooohLetMeLive, dcId, chosenServer, logSuffix, retryTimeout);\n };\n \n\n \n private transportHTTP = (dcId: DcId, connectionType: ConnectionType, premium?: boolean) => {\n let chosenServer: string;\n if(Modes.ssl || !Modes.http) {\n const suffix = getTelegramConnectionSuffix(connectionType);\n const subdomain = this.sslSubdomains[dcId - 1] + suffix;\n const path = Modes.test ? 'apiw_test1' : 'apiw1';\n chosenServer = 'https://' + subdomain + '.web.telegram.org/' + path;\n } else {\n for(const dcOption of this.dcOptions) {\n if(dcOption.id === dcId) {\n chosenServer = 'http://' + dcOption.host + (dcOption.port !== 80 ? ':' + dcOption.port : '') + '/apiw1';\n break;\n }\n }\n }\n\n const logSuffix = connectionType === 'upload' ? '-U' : connectionType === 'download' ? '-D' : '';\n return new HTTP(dcId, chosenServer, logSuffix);\n };\n \n\n public chooseServer(\n dcId: DcId,\n connectionType: ConnectionType = 'client',\n transportType: TransportType = Modes.transport,\n reuse = true,\n premium?: boolean\n ) {\n /* if(transportType === 'websocket' && !Modes.multipleConnections) {\n connectionType = 'client';\n } */\n\n if(!this.chosenServers.hasOwnProperty(transportType)) {\n this.chosenServers[transportType] = {\n client: {},\n download: {},\n upload: {}\n };\n }\n\n const servers = this.chosenServers[transportType][connectionType];\n\n if(!(dcId in servers)) {\n servers[dcId] = [];\n }\n\n const transports = servers[dcId];\n\n if(!transports.length || !reuse/* || (upload && transports.length < 1) */) {\n let transport: MTTransport;\n\n \n transport = (transportType === 'websocket' ? this.transportSocket : this.transportHTTP)(dcId, connectionType, premium);\n \n \n \n \n \n\n if(!transport) {\n console.error('No chosenServer!', dcId);\n return null;\n }\n\n if(reuse) {\n transports.push(transport);\n }\n\n return transport;\n }\n\n return transports[0];\n }\n\n public static removeTransport(obj: any, transport: T) {\n for(const transportType in obj) {\n // @ts-ignore\n for(const connectionType in obj[transportType]) {\n // @ts-ignore\n for(const dcId in obj[transportType][connectionType]) {\n // @ts-ignore\n const transports: T[] = obj[transportType][connectionType][dcId];\n indexOfAndSplice(transports, transport);\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 App from '../../../config/app';\nimport deferredPromise from '../../../helpers/cancellablePromise';\nimport EventListenerBase from '../../../helpers/eventListenerBase';\nimport pause from '../../../helpers/schedulers/pause';\nimport {TransportType, DcConfigurator} 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 private dcConfigurator: DcConfigurator;\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 dcConfigurator = this.dcConfigurator ??= new DcConfigurator();\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(() => {\n if(websocketPromise.isFulfilled || websocketPromise.isRejected) {\n return;\n }\n\n if(socket.connection) {\n socket.connection.close();\n }\n\n websocketPromise.resolve(false);\n }, 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","/*\n * 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, {CancellablePromise} from '../../../../helpers/cancellablePromise';\nimport type {StoragesResults} from './loadStorages';\n\nconst RESET_STORAGES_PROMISE: CancellablePromise> = deferredPromise();\nexport default RESET_STORAGES_PROMISE;\n","/*\n * 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 {CryptoMessagePort} from '../crypto/cryptoMessagePort';\nimport type {ApiFileManager} from '../mtproto/apiFileManager';\nimport type {ApiManager} from '../mtproto/apiManager';\nimport type {Authorizer} from '../mtproto/authorizer';\nimport type {DcConfigurator} from '../mtproto/dcConfigurator';\nimport type {NetworkerFactory} from '../mtproto/networkerFactory';\nimport type {PasswordManager} from '../mtproto/passwordManager';\nimport type {ReferenceDatabase} from '../mtproto/referenceDatabase';\nimport type {TimeManager} from '../mtproto/timeManager';\nimport type {RootScope} from '../rootScope';\nimport type DialogsStorage from '../storages/dialogs';\nimport type FiltersStorage from '../storages/filters';\nimport type PeersStorage from '../storages/peers';\nimport type ThumbsStorage from '../storages/thumbs';\nimport type {ApiUpdatesManager} from './apiUpdatesManager';\nimport type {AppAvatarsManager} from './appAvatarsManager';\nimport type {AppCallsManager} from './appCallsManager';\nimport type {AppChatsManager} from './appChatsManager';\nimport type {AppDocsManager} from './appDocsManager';\nimport type {AppDraftsManager} from './appDraftsManager';\nimport type {AppEmojiManager} from './appEmojiManager';\nimport type {AppGroupCallsManager} from './appGroupCallsManager';\nimport type {AppInlineBotsManager} from './appInlineBotsManager';\nimport type {AppMessagesIdsManager} from './appMessagesIdsManager';\nimport type {AppMessagesManager} from './appMessagesManager';\nimport type {AppNotificationsManager} from './appNotificationsManager';\nimport type AppPaymentsManager from './appPaymentsManager';\nimport type {AppPeersManager} from './appPeersManager';\nimport type {AppPhotosManager} from './appPhotosManager';\nimport type {AppPollsManager} from './appPollsManager';\nimport type {AppPrivacyManager} from './appPrivacyManager';\nimport type {AppProfileManager} from './appProfileManager';\nimport type {AppReactionsManager} from './appReactionsManager';\nimport type {AppStateManager} from './appStateManager';\nimport type {AppStickersManager} from './appStickersManager';\nimport type {AppStoragesManager} from './appStoragesManager';\nimport type {AppUsersManager} from './appUsersManager';\nimport type AppWebDocsManager from './appWebDocsManager';\nimport type {AppWebPagesManager} from './appWebPagesManager';\nimport type AppAttachMenuBotsManager from './appAttachMenuBotsManager';\nimport type AppSeamlessLoginManager from './appSeamlessLoginManager';\nimport type AppThemesManager from './appThemesManager';\nimport type {AppManagers} from './managers';\n\nexport class AppManager {\n protected appPeersManager: AppPeersManager;\n protected appChatsManager: AppChatsManager;\n protected appDocsManager: AppDocsManager;\n protected appPhotosManager: AppPhotosManager;\n protected appPollsManager: AppPollsManager;\n protected appUsersManager: AppUsersManager;\n protected appWebPagesManager: AppWebPagesManager;\n protected appDraftsManager: AppDraftsManager;\n protected appProfileManager: AppProfileManager;\n protected appNotificationsManager: AppNotificationsManager;\n protected apiUpdatesManager: ApiUpdatesManager;\n protected appAvatarsManager: AppAvatarsManager;\n protected appGroupCallsManager: AppGroupCallsManager;\n protected appCallsManager: AppCallsManager;\n protected appReactionsManager: AppReactionsManager;\n protected appMessagesManager: AppMessagesManager;\n protected appMessagesIdsManager: AppMessagesIdsManager;\n protected appPrivacyManager: AppPrivacyManager;\n protected appInlineBotsManager: AppInlineBotsManager;\n protected appStickersManager: AppStickersManager;\n protected referenceDatabase: ReferenceDatabase;\n protected appEmojiManager: AppEmojiManager;\n protected dialogsStorage: DialogsStorage;\n protected filtersStorage: FiltersStorage;\n protected apiManager: ApiManager;\n // protected apiManager: ApiManagerProxy;\n protected passwordManager: PasswordManager;\n protected cryptoWorker: CryptoMessagePort;\n protected apiFileManager: ApiFileManager;\n protected peersStorage: PeersStorage;\n protected thumbsStorage: ThumbsStorage;\n protected networkerFactory: NetworkerFactory;\n protected rootScope: RootScope;\n protected authorizer: Authorizer;\n protected dcConfigurator: DcConfigurator;\n protected timeManager: TimeManager;\n protected appStoragesManager: AppStoragesManager;\n protected appStateManager: AppStateManager;\n protected appWebDocsManager: AppWebDocsManager;\n protected appPaymentsManager: AppPaymentsManager;\n protected appAttachMenuBotsManager: AppAttachMenuBotsManager;\n protected appSeamlessLoginManager: AppSeamlessLoginManager;\n protected appThemesManager: AppThemesManager;\n\n public clear: (init?: boolean) => void;\n\n public setManagers(managers: AppManagers) {\n Object.assign(this, managers);\n // this.after();\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 '../../../../layer';\nimport type{Dialog} from '../../appMessagesManager';\nimport type{User} from '../../appUsersManager';\nimport type {StoragesStorages} from './createStorages';\nimport {recordPromiseBound} from '../../../../helpers/recordPromise';\nimport {Awaited} from '../../../../types';\nimport {logger} from '../../../logger';\nimport RESET_STORAGES_PROMISE from './resetStoragesPromise';\n\nexport type StoragesResults = Awaited>;\n\nasync function loadStoragesInner(storages: StoragesStorages) {\n const recordPromise = recordPromiseBound(logger('STORAGES-LOADER'));\n const storagesKeys = Object.keys(storages) as Array;\n const storagesPromises: Promise[] = storagesKeys.map((key) => {\n const promise = storages[key].getAll();\n return recordPromise(promise, 'storage ' + (key as any as string));\n });\n\n const storagesResults: {\n users: User[],\n chats: Chat[],\n dialogs: Dialog[]\n } = {} as any;\n const arr = await Promise.all(storagesPromises);\n for(let i = 0, length = storagesKeys.length; i < length; ++i) {\n storagesResults[storagesKeys[i]] = arr[i] as any;\n }\n\n arr.splice(0, storagesKeys.length);\n\n const resetStorages = await RESET_STORAGES_PROMISE;\n if(resetStorages.size) {\n for(const key of resetStorages) {\n storagesResults[key].length = 0;\n }\n\n resetStorages.clear();\n }\n\n return storagesResults;\n}\n\nlet promise: ReturnType;\nexport default function loadStorages(storages: StoragesStorages) {\n return promise ??= loadStoragesInner(storages);\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} from '../logger';\nimport {AppManager} from './manager';\nimport createStorages from './utils/storages/createStorages';\nimport loadStorages from './utils/storages/loadStorages';\n\nexport class AppStoragesManager extends AppManager {\n private storages: ReturnType;\n\n // private loadPromise: CancellablePromise;\n\n private log: ReturnType;\n\n constructor() {\n super();\n\n this.log = logger('STORAGES');\n this.storages = createStorages();\n // this.loadPromise = deferredPromise();\n }\n\n public loadStorages() {\n return loadStorages(this.storages);\n // loadStorages(this.storages).then((storagesResults) => {\n // this.loadPromise.resolve(storagesResults);\n // });\n\n // return this.loadPromise;\n }\n\n // public setStoragesResults(storagesResults: StoragesResults) {\n // this.loadPromise.resolve(storagesResults);\n // }\n\n public async loadStorage(name: T) {\n return this.loadStorages().then((storagesResults) => {\n return {\n storage: this.storages[name],\n results: storagesResults[name]\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 {Chat} from '../../../../layer';\nimport type {Dialog} from '../../appMessagesManager';\nimport type {User} from '../../appUsersManager';\nimport DATABASE_STATE from '../../../../config/databases/state';\nimport AppStorage from '../../../storage';\n\nexport type StoragesStorages = {\n users: AppStorage, typeof DATABASE_STATE>,\n chats: AppStorage, typeof DATABASE_STATE>,\n dialogs: AppStorage, typeof DATABASE_STATE>\n};\n\nexport default function createStorages() {\n const names: (keyof StoragesStorages)[] = ['users', 'chats', 'dialogs'];\n const storages: StoragesStorages = {} as any;\n for(const name of names) {\n // @ts-ignore\n storages[name] = new AppStorage(DATABASE_STATE, name);\n }\n\n return storages;\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 type {AccountPassword, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo} from '../../layer';\nimport randomize from '../../helpers/array/randomize';\nimport {AppManager} from '../appManagers/manager';\n\nexport class PasswordManager extends AppManager {\n public getState(): Promise {\n return this.apiManager.invokeApi('account.getPassword').then((result) => {\n return result;\n });\n }\n\n public updateSettings(settings: {\n hint?: string,\n email?: string,\n newPassword?: string,\n currentPassword?: string\n } = {}) {\n // state = Object.assign({}, state);\n // state.new_algo = Object.assign({}, state.new_algo);\n\n return this.getState().then((state) => {\n let currentHashPromise: Promise;\n let newHashPromise: Promise;\n const params: AccountUpdatePasswordSettings = {\n password: null,\n new_settings: {\n _: 'account.passwordInputSettings',\n hint: settings.hint,\n email: settings.email\n }\n };\n\n if(settings.currentPassword) {\n currentHashPromise = this.cryptoWorker.invokeCrypto('computeSRP', settings.currentPassword, state, false) as any;\n } else {\n currentHashPromise = Promise.resolve({\n _: 'inputCheckPasswordEmpty'\n });\n }\n\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\n randomize(salt1);\n salt1.set(newAlgo.salt1, 0);\n newAlgo.salt1 = salt1;\n\n if(settings.newPassword) {\n newHashPromise = this.cryptoWorker.invokeCrypto('computeSRP', settings.newPassword, state, true) as any;\n } else {\n newHashPromise = Promise.resolve(new Uint8Array());\n }\n\n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\n params.password = hashes[0];\n params.new_settings.new_algo = newAlgo;\n params.new_settings.new_password_hash = hashes[1];\n\n return this.apiManager.invokeApi('account.updatePasswordSettings', params);\n });\n });\n }\n\n public getInputCheckPassword(password: string, state: AccountPassword) {\n return this.cryptoWorker.invokeCrypto('computeSRP', password, state, false) as Promise;\n }\n\n public check(password: string, state: AccountPassword, options: any = {}) {\n return this.getInputCheckPassword(password, state).then((inputCheckPassword) => {\n // console.log('SRP', inputCheckPassword);\n return this.apiManager.invokeApi('auth.checkPassword', {\n password: inputCheckPassword as InputCheckPasswordSRP.inputCheckPasswordSRP\n }, options).then((auth) => {\n if(auth._ === 'auth.authorization') {\n this.apiManager.setUser(auth.user);\n }\n\n return auth;\n });\n });\n }\n\n public confirmPasswordEmail(code: string) {\n return this.apiManager.invokeApi('account.confirmPasswordEmail', {code});\n }\n\n public resendPasswordEmail() {\n return this.apiManager.invokeApi('account.resendPasswordEmail');\n }\n\n public cancelPasswordEmail() {\n return this.apiManager.invokeApi('account.cancelPasswordEmail');\n }\n\n /* public requestRecovery(options: any = {}) {\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\n }\n\n public recover(code: any, options: any = {}) {\n return apiManager.invokeApi('auth.recoverPassword', {\n code\n }, options);\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 {Photo, WallPaper} from '../../layer';\nimport {logger} from '../logger';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport {AppManager} from '../appManagers/manager';\nimport makeError from '../../helpers/makeError';\n\nexport type ReferenceContext = ReferenceContext.referenceContextProfilePhoto | ReferenceContext.referenceContextMessage | ReferenceContext.referenceContextEmojiesSounds | ReferenceContext.referenceContextReactions | ReferenceContext.referenceContextUserFull | ReferenceContext.referenceContextCustomEmoji | ReferenceContext.referenceContextAttachMenuBotIcon | ReferenceContext.referenceContextWallPaper;\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 export type referenceContextReactions = {\n type: 'reactions'\n };\n\n export type referenceContextUserFull = {\n type: 'userFull',\n userId: UserId\n };\n\n export type referenceContextCustomEmoji = {\n type: 'customEmoji',\n docId: DocId\n };\n\n export type referenceContextAttachMenuBotIcon = {\n type: 'attachMenuBotIcon',\n botId: BotId\n };\n\n export type referenceContextWallPaper = {\n type: 'wallPaper',\n wallPaperId: WallPaper['id']\n };\n}\n\nexport type ReferenceBytes = Photo.photo['file_reference'];\nexport type ReferenceContexts = Set;\n\n// type ReferenceBytes = Uint8Array;\n\nexport class ReferenceDatabase extends AppManager {\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 // super();\n\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 = this.appMessagesManager.reloadMessages(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 || this.appStickersManager.getAnimatedEmojiSounds(true).then(() => {\n this.refreshEmojiesSoundsPromise = undefined;\n });\n break;\n }\n\n case 'userFull': {\n promise = Promise.resolve(this.appProfileManager.getProfile(context.userId, true));\n break;\n }\n\n case 'customEmoji': {\n promise = this.appEmojiManager.getCustomEmojiDocuments([context.docId]);\n break;\n }\n\n case 'attachMenuBotIcon': {\n promise = this.appAttachMenuBotsManager.getAttachMenuBot(context.botId, true) as any;\n break;\n }\n\n case 'wallPaper': {\n promise = this.appThemesManager.getWallPaperById(context.wallPaperId);\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 makeError('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","export default function safeReplaceObject(wasObject: any, newObject: any) {\n if(!wasObject) {\n return newObject;\n }\n\n for(var key in wasObject) {\n if(!newObject.hasOwnProperty(key)) {\n delete wasObject[key];\n }\n }\n\n for(var key in newObject) {\n // if (newObject.hasOwnProperty(key)) { // useless\n wasObject[key] = newObject[key];\n // }\n }\n\n return wasObject;\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, MessageAction, MessageMedia} from '../../../../layer';\nimport getPeerId from '../peers/getPeerId';\n\nexport default function getPeerIdsFromMessage(message: Message.message | Message.messageService) {\n const peerIds: number[] = [\n message.fromId,\n message.viaBotId,\n (message as Message.message).fwdFromId\n ];\n\n const media = (message as Message.message).media;\n if(media) {\n const contactUserId = (media as MessageMedia.messageMediaContact).user_id;\n if(contactUserId !== undefined) {\n peerIds.push(contactUserId.toPeerId());\n }\n\n const results = (media as MessageMedia.messageMediaPoll).results;\n const recentVoters = results?.recent_voters;\n if(recentVoters?.length) {\n peerIds.push(...recentVoters.map((userId) => userId.toPeerId()));\n }\n }\n\n const recentReactions = ((message as Message.message).reactions)?.recent_reactions;\n if(recentReactions?.length) {\n peerIds.push(...recentReactions.map((reaction) => getPeerId(reaction.peer_id)));\n }\n\n const action = (message as Message.messageService).action;\n if(action) {\n const userIds: UserId[] = [\n ...((action as MessageAction.messageActionChatAddUser).users || []),\n (action as MessageAction.messageActionChatDeleteUser).user_id,\n (action as MessageAction.messageActionChatJoinedByLink).inviter_id\n ];\n peerIds.push(...userIds.filter(Boolean).map((userId) => userId.toPeerId()));\n\n const chatIds: ChatId[] = [\n (action as MessageAction.messageActionChatMigrateTo).channel_id,\n (action as MessageAction.messageActionChannelMigrateFrom).chat_id\n ];\n peerIds.push(...chatIds.filter(Boolean).map((chatId) => chatId.toPeerId(true)));\n }\n\n const recentRepliers = ((message as Message.message).replies)?.recent_repliers;\n if(recentRepliers?.length) {\n peerIds.push(...recentRepliers.map((reply) => getPeerId(reply)));\n }\n\n return new Set(peerIds.filter(Boolean));\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 {ForumTopic} from '../../../../layer';\nimport type {Dialog} from '../../appMessagesManager';\nimport type getDialogIndexKey from './getDialogIndexKey';\n\nexport default function setDialogIndex(\n dialog: Dialog | ForumTopic.forumTopic,\n indexKey: ReturnType,\n index: number\n) {\n return (dialog as Dialog)[indexKey] = index;\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 type {Chat, ForumTopic as MTForumTopic, DialogPeer, Message, MessageAction, MessageMedia, MessagesForumTopics, MessagesPeerDialogs, Update} from '../../layer';\nimport type {Dialog, ForumTopic, MyMessage} from '../appManagers/appMessagesManager';\nimport tsNow from '../../helpers/tsNow';\nimport SearchIndex from '../searchIndex';\nimport {SliceEnd} from '../../helpers/slicedArray';\nimport {MyDialogFilter} from './filters';\nimport {FOLDER_ID_ALL, FOLDER_ID_ARCHIVE, NULL_PEER_ID, REAL_FOLDERS, REAL_FOLDER_ID} from '../mtproto/mtproto_config';\nimport {MaybePromise, NoneToVoidFunction} from '../../types';\nimport ctx from '../../environment/ctx';\nimport AppStorage from '../storage';\nimport type DATABASE_STATE from '../../config/databases/state';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport insertInDescendSortedArray from '../../helpers/array/insertInDescendSortedArray';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport getServerMessageId from '../appManagers/utils/messageId/getServerMessageId';\nimport generateMessageId from '../appManagers/utils/messageId/generateMessageId';\nimport {AppManager} from '../appManagers/manager';\nimport getDialogIndexKey from '../appManagers/utils/dialogs/getDialogIndexKey';\nimport isObject from '../../helpers/object/isObject';\nimport getDialogIndex from '../appManagers/utils/dialogs/getDialogIndex';\nimport getPeerIdsFromMessage from '../appManagers/utils/messages/getPeerIdsFromMessage';\nimport {AppStoragesManager} from '../appManagers/appStoragesManager';\nimport defineNotNumerableProperties from '../../helpers/object/defineNotNumerableProperties';\nimport setDialogIndex from '../appManagers/utils/dialogs/setDialogIndex';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport pause from '../../helpers/schedulers/pause';\nimport {BroadcastEvents} from '../rootScope';\nimport assumeType from '../../helpers/assumeType';\nimport makeError from '../../helpers/makeError';\nimport callbackify from '../../helpers/callbackify';\n\nexport type FolderDialog = {\n dialog: Dialog,\n index: number\n};\n\nexport type Folder = {\n dialogs: (Dialog | ForumTopic)[],\n id: number,\n unreadMessagesCount: number,\n unreadPeerIds: Set,\n unreadUnmutedPeerIds: Set,\n dispatchUnreadTimeout?: number\n};\n\nexport const GLOBAL_FOLDER_ID: REAL_FOLDER_ID = undefined;\n\n// let spentTime = 0;\nexport default class DialogsStorage extends AppManager {\n private storage: AppStoragesManager['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 private forumTopics: Map,\n deletedTopics: Set,\n getTopicPromises: Map>,\n getTopicsPromise?: Promise\n }>;\n\n protected after() {\n this.clear(true);\n\n this.rootScope.addEventListener('language_change', () => {\n const peerId = this.appUsersManager.getSelf().id.toPeerId(false);\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n const peerText = this.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 this.rootScope.addEventListener('filter_order', () => {\n const dialogs = this.getCachedDialogs(false);\n // const indexKeys: ReturnType[] = [];\n for(const filterId in this.folders) {\n if(+filterId > 1) {\n delete this.folders[filterId];\n }\n\n // indexKeys.push(this.getDialogIndexKey(+filterId));\n }\n\n for(let i = 0; i < dialogs.length; ++i) {\n const dialog = dialogs[i];\n // for(const indexKey of indexKeys) {\n // delete dialog[indexKey];\n // }\n\n this.processDialogForFilters(dialog);\n }\n });\n\n this.rootScope.addEventListener('filter_update', onFilterUpdate);\n this.rootScope.addEventListener('filter_new', onFilterUpdate);\n\n this.rootScope.addEventListener('filter_delete', (filter) => {\n const dialogs = this.getCachedDialogs(false);\n\n const indexKey = this.getDialogIndexKeyByFilterId(filter.id);\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 this.rootScope.addEventListener('dialog_notify_settings', (dialog) => {\n this.processChangedUnreadOrUnmuted(dialog.peerId);\n });\n\n this.rootScope.addEventListener('chat_update', (chatId) => {\n const chat = this.appChatsManager.getChat(chatId);\n\n const peerId = chatId.toPeerId(true);\n if((chat as Chat.chat).pFlags.left && this.getDialogOnly(peerId)) {\n this.dropDialogOnDeletion(peerId);\n }\n });\n\n this.rootScope.addEventListener('chat_toggle_forum', ({chatId, enabled}) => {\n const peerId = chatId.toPeerId(true);\n if(!enabled) {\n this.flushForumTopicsCache(peerId);\n }\n\n this.processChangedUnreadOrUnmuted(peerId);\n });\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateFolderPeers: this.onUpdateFolderPeers,\n\n updateDialogPinned: this.onUpdateDialogPinned,\n\n updateChannelPinnedTopic: this.onUpdateChannelPinnedTopic,\n\n updatePinnedDialogs: this.onUpdatePinnedDialogs,\n\n updateChannelPinnedTopics: this.onUpdateChannelPinnedTopics\n });\n\n return Promise.all([\n this.appStateManager.getState(),\n this.appStoragesManager.loadStorage('dialogs')\n ]).then(([state, {results: dialogs, storage}]) => {\n this.storage = storage;\n this.dialogs = this.storage.getCache();\n\n for(const folderId of REAL_FOLDERS) {\n const order = state.pinnedOrders[folderId];\n if(!order) {\n continue;\n }\n\n const _order = this.getPinnedOrders(folderId);\n _order.splice(0, _order.length, ...order);\n }\n\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 if(dialogs.length) {\n this.appDraftsManager.addMissedDialogs();\n }\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 continue;\n }\n\n // if(dialog.peerId !== SERVICE_PEER_ID) {\n dialog.top_message = 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 <= 21; ++i) {\n const indexKey: ReturnType = `index_${i}` as any;\n delete dialog[indexKey];\n }\n // delete dialog.indexes;\n\n this.saveDialog({\n dialog,\n ignoreOffsetDate: true\n });\n\n // ! WARNING, ัƒะฑั€ะฐั‚ัŒ ัั‚ะพ ะบะพะณะดะฐ ะฝัƒะถะฝะพ ะฑัƒะดะตั‚ ะดะตะปะฐั‚ัŒ ั‡ั‚ะพะฑั‹ pending ัะพะพะฑั‰ะตะฝะธั ัะพั…ั€ะฐะฝัะปะธััŒ\n const message = this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n if(!message) {\n this.appMessagesManager.reloadConversation(dialog.peerId);\n }\n }\n }\n\n public isDialogsLoaded(folderId: number) {\n return !!this.allDialogsLoaded[folderId];\n }\n\n public setDialogsLoaded(folderId: number, loaded: boolean) {\n const isForum = this.isFilterIdForForum(folderId);\n\n if(folderId === GLOBAL_FOLDER_ID && loaded) {\n this.allDialogsLoaded[FOLDER_ID_ALL] = loaded;\n this.allDialogsLoaded[FOLDER_ID_ARCHIVE] = loaded;\n } else {\n if(isForum) {\n defineNotNumerableProperties(this.allDialogsLoaded, [folderId]);\n }\n\n this.allDialogsLoaded[folderId] = loaded;\n }\n\n if(isForum) {\n return;\n }\n\n if(Array.from(REAL_FOLDERS).every((folderId) => this.allDialogsLoaded[folderId])) {\n this.allDialogsLoaded[GLOBAL_FOLDER_ID] = true;\n }\n\n this.saveAllDialogsLoaded();\n }\n\n private saveAllDialogsLoaded() {\n this.appStateManager.pushToState('allDialogsLoaded', this.allDialogsLoaded);\n }\n\n public clear = (init = false) => {\n if(!init) {\n this.storage.clear();\n\n this.allDialogsLoaded = {};\n this.saveAllDialogsLoaded();\n\n // * clear not numerable properties\n this.pinnedOrders = Object.assign({}, this.pinnedOrders);\n for(const folderId of REAL_FOLDERS) {\n this.resetPinnedOrder(folderId);\n }\n this.savePinnedOrders();\n } else {\n this.allDialogsLoaded = {};\n this.pinnedOrders = {};\n for(const folderId of REAL_FOLDERS) {\n this.pinnedOrders[folderId] = [];\n }\n }\n\n this.forumTopics = new Map();\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 | ForumTopic, folderId: number) {\n delete dialog.pFlags.pinned;\n indexOfAndSplice(this.getPinnedOrders(folderId), this.isFilterIdForForum(folderId) ? (dialog as ForumTopic).id : 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.getPinnedOrders(folderId).length = 0;\n }\n\n public getPinnedOrders(folderId: number) {\n let orders = this.pinnedOrders[folderId];\n if(!orders && this.isFilterIdForForum(folderId)) {\n defineNotNumerableProperties(this.pinnedOrders, [folderId]);\n orders = this.pinnedOrders[folderId] = [];\n }\n\n return orders;\n }\n\n public isDialogPinned(peerId: PeerId, folderId: number) {\n const filter = this.filtersStorage.getFilter(folderId);\n let isPinned: boolean;\n if(filter) {\n isPinned = filter.pinnedPeerIds.indexOf(peerId) !== -1;\n } else {\n isPinned = !!this.getDialogOnly(peerId).pFlags.pinned;\n }\n\n return isPinned;\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(...Array.from(REAL_FOLDERS).sort((a, b) => a - b));\n }\n\n return offsetDate;\n }\n\n private generateFolder(id: number) {\n const folder: Folder = {\n dialogs: [],\n id,\n unreadMessagesCount: 0,\n unreadPeerIds: new Set(),\n unreadUnmutedPeerIds: new Set()\n };\n\n defineNotNumerableProperties(folder, ['dispatchUnreadTimeout']);\n\n return folder;\n }\n\n public getFolder(id: number) {\n return this.folders[id] ??= this.generateFolder(id);\n }\n\n public isFilterIdForForum(filterId: number) {\n return filterId && filterId < 0;\n }\n\n public getFilterIdForForum(forumTopic: ForumTopic) {\n return forumTopic.peerId;\n }\n\n public getDialogKey(dialog: Dialog | ForumTopic) {\n return this.isTopic(dialog) ? dialog.id : dialog.peerId;\n }\n\n public getFolderDialogs(id: number, skipMigrated = true): Folder['dialogs'] {\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 if(this.isFilterIdForForum(id)) {\n return skipMigrated ? folder.dialogs.filter((forumTopic) => !(forumTopic as ForumTopic).pFlags.hidden) : folder.dialogs;\n }\n\n return skipMigrated ? folder.dialogs.filter((dialog) => (dialog as Dialog).migratedTo === undefined) : folder.dialogs;\n }\n\n public getNextDialog(currentPeerId: PeerId, next: boolean, filterId: number) {\n const folder = this.getFolderDialogs(filterId, true);\n let dialog: Folder['dialogs'][0];\n if(!currentPeerId) {\n if(next) {\n dialog = folder[0];\n }\n } else {\n const idx = folder.findIndex((dialog) => dialog.peerId === currentPeerId);\n if(idx !== -1) {\n const nextIndex = next ? idx + 1 : idx - 1;\n dialog = folder[nextIndex];\n }\n }\n\n return dialog;\n }\n\n public getDialogIndexKeyByFilterId(filterId: number) {\n if(this.isFilterIdForForum(filterId)) return getDialogIndexKey();\n if(REAL_FOLDERS.has(filterId)) return getDialogIndexKey(filterId as REAL_FOLDER_ID);\n const filter = this.filtersStorage.getFilter(filterId);\n return getDialogIndexKey(filter.localId);\n }\n\n private isDialogUnmuted(dialog: Dialog | ForumTopic) {\n return !this.appNotificationsManager.isPeerLocalMuted({\n peerId: dialog.peerId,\n respectType: true,\n threadId: this.isTopic(dialog) ? (dialog as ForumTopic).id : undefined\n });\n }\n\n public getFolderUnreadCount(filterId: number) {\n const folder = this.getFolder(filterId);\n return {unreadUnmutedCount: folder.unreadUnmutedPeerIds.size, unreadCount: folder.unreadPeerIds.size};\n }\n\n public getCachedDialogs(skipMigrated?: boolean) {\n const arrays = Array.from(REAL_FOLDERS).map((folderId) => this.getFolderDialogs(folderId, skipMigrated));\n return [].concat(...arrays) as Dialog[];\n }\n\n private setDialogIndexInFilter(\n dialog: Dialog | ForumTopic,\n indexKey: ReturnType,\n filter?: MyDialogFilter\n ) {\n // if(this.isTopic(dialog)) {\n // return dialog['index_0'];\n // }\n\n let index: number;\n\n const isTopic = this.isTopic(dialog);\n const isRealFolder = isTopic || REAL_FOLDERS.has(filter.id);\n /* if(isRealFolder) {\n // index = getDialogIndex(dialog, indexKey);\n index = this.generateIndexForDialog(dialog, true);\n } else */if(this.filtersStorage.testDialogForFilter(dialog, filter)) {\n const pinnedIds = isTopic ?\n this.getPinnedOrders(this.getFilterIdForForum(dialog)) :\n filter.pinnedPeerIds;\n\n const pinnedKey = this.getDialogKey(dialog);\n const pinnedIndex = pinnedIds.indexOf(pinnedKey);\n\n if(pinnedIndex !== -1) {\n index = this.generateDialogIndex(this.generateDialogPinnedDateByIndex(pinnedIds.length - 1 - pinnedIndex), true);\n } else if(dialog.pFlags?.pinned || isRealFolder) {\n index = this.generateIndexForDialog(dialog, true, undefined, !isRealFolder);\n } else {\n index = getDialogIndex(dialog) ?? this.generateIndexForDialog(dialog, true);\n }\n }\n\n // if(!dialog.hasOwnProperty(indexKey)) {\n // defineNotNumerableProperties(dialog, [indexKey]);\n // }\n\n return setDialogIndex(dialog, indexKey, index);\n }\n\n public getDialog(peerId: PeerId, folderId?: number, topicId?: number, skipMigrated = true): [Folder['dialogs'][0], number] | [] {\n const folders: Folder['dialogs'][] = [];\n\n if(topicId) {\n folderId = peerId;\n // skipMigrated = false;\n }\n\n if(folderId === undefined) {\n folders.push(...Array.from(REAL_FOLDERS).map((folderId) => this.getFolder(folderId).dialogs as Dialog[]));\n } else {\n folders.push(this.getFolderDialogs(folderId, false) as Dialog[]);\n }\n\n const verify: (d: Folder['dialogs'][0]) => boolean = topicId ?\n (d) => (d as ForumTopic).id === topicId :\n (d) => (d as Dialog).peerId === peerId;\n for(const 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(verify(dialog)) {\n return [dialog, i - skipped];\n } else if(skipMigrated && ((dialog as ForumTopic).pFlags.hidden || (dialog as 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 public getDialogOrTopic(peerId: PeerId, topicId?: number) {\n return topicId ? this.getForumTopic(peerId, topicId) : this.dialogs[peerId];\n }\n\n public getDialogIndex(\n peerId: PeerId | Parameters[0],\n indexKey: ReturnType,\n topicId?: number\n ) {\n const dialog = isObject(peerId) ? peerId : this.getDialogOrTopic(peerId, topicId);\n return getDialogIndex(dialog, indexKey);\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 date ??= tsNow(true) + this.timeManager.getServerTimeOffset();\n return (date * 0x10000) + (isPinned ? 0 : (++this.dialogsNum & 0xFFFF));\n }\n\n // public makeFilterForTopics(id: number): MyDialogFilter {\n // return {\n // _: 'dialogFilter',\n // id,\n\n // };\n // }\n\n public isTopic(dialog: Dialog | ForumTopic): dialog is ForumTopic {\n return 'id' in dialog;\n }\n\n public processDialogForFilters(dialog: Dialog | ForumTopic, noIndex?: boolean) {\n // let perf = performance.now();\n if(this.isTopic(dialog)) {\n this.processDialogForFilter(dialog, undefined, noIndex);\n return;\n }\n\n const filters = this.filtersStorage.getFilters();\n for(const id in filters) {\n const filter = filters[id];\n this.processDialogForFilter(dialog, filter, noIndex);\n }\n // spentTime += (performance.now() - perf);\n // console.log('generate index time:', spentTime);\n }\n\n public processDialogForFilter(\n dialog: Dialog | ForumTopic,\n filter?: MyDialogFilter,\n noIndex?: boolean\n ) {\n const isTopic = this.isTopic(dialog);\n const folderId = isTopic ? this.getFilterIdForForum(dialog) : filter.id;\n\n const indexKey = isTopic ? 'index_0' : this.getDialogIndexKeyByFilterId(folderId);\n const folder = this.getFolder(folderId);\n const dialogs = folder.dialogs;\n\n const cmp: (d: typeof dialog) => boolean = isTopic ?\n ((d: ForumTopic) => d.id === dialog.id) as any :\n ((d: Dialog) => d.peerId === dialog.peerId) as any;\n const wasIndex = dialogs.findIndex(cmp);\n const wasDialog = dialogs[wasIndex];\n const wasDialogIndex = this.getDialogIndex(wasDialog, indexKey);\n\n if(noIndex && folderId > FOLDER_ID_ARCHIVE) {\n noIndex = undefined;\n }\n\n const newDialogIndex = noIndex ? undefined : this.setDialogIndexInFilter(dialog, indexKey, filter);\n\n if(wasDialogIndex === newDialogIndex) {\n return false;\n }\n\n if(!!wasDialogIndex !== !!newDialogIndex) {\n this.prepareFolderUnreadCountModifyingByDialog(folderId, dialog, !!newDialogIndex);\n }\n\n if(wasIndex !== -1) {\n dialogs.splice(wasIndex, 1);\n }\n\n if(newDialogIndex) {\n insertInDescendSortedArray(dialogs, dialog, (dialog) => this.getDialogIndex(dialog, indexKey), -1);\n }\n\n return true;\n }\n\n public prepareDialogUnreadCountModifying(dialog: Dialog | ForumTopic, toggle?: boolean) {\n const isTopic = this.isTopic(dialog);\n const callbacks: NoneToVoidFunction[] = [];\n\n const folderId = isTopic ? this.getFilterIdForForum(dialog) : dialog.folder_id;\n callbacks.push(this.prepareFolderUnreadCountModifyingByDialog(folderId, dialog, toggle));\n\n if(!isTopic) {\n const filters = this.filtersStorage.getFilters();\n for(const id in filters) {\n const filter = filters[id];\n if(this.filtersStorage.testDialogForFilter(dialog, filter)) {\n callbacks.push(this.prepareFolderUnreadCountModifyingByDialog(filter.id, dialog, toggle));\n }\n }\n }\n\n return () => !toggle && callbacks.forEach((callback) => callback());\n }\n\n public prepareFolderUnreadCountModifyingByDialog(folderId: number, dialog: Dialog | ForumTopic, toggle?: boolean) {\n const wasUnreadCount = this.appMessagesManager.getDialogUnreadCount(dialog);\n const wasUnmuted = this.isDialogUnmuted(dialog);\n\n if(toggle !== undefined) {\n const addMessagesCount = toggle ? wasUnreadCount : -wasUnreadCount;\n this.modifyFolderUnreadCount(folderId, addMessagesCount, !!wasUnreadCount, wasUnreadCount && wasUnmuted, dialog);\n return;\n }\n\n return () => {\n const newUnreadCount = this.appMessagesManager.getDialogUnreadCount(dialog);\n const newUnmuted = this.isDialogUnmuted(dialog);\n\n const addMessagesCount = newUnreadCount - wasUnreadCount;\n this.modifyFolderUnreadCount(folderId, addMessagesCount, !!newUnreadCount, newUnreadCount && newUnmuted, dialog);\n };\n }\n\n public modifyFolderUnreadCount(\n folderId: number,\n addMessagesCount: number,\n toggleDialog: boolean,\n toggleUnmuted: boolean,\n dialog: Dialog | ForumTopic\n ) {\n const {peerId} = dialog;\n const isForum = this.appPeersManager.isForum(peerId);\n const isTopic = this.isTopic(dialog);\n if(isForum && !isTopic) {\n const forumUnreadCount = this.getForumUnreadCount(peerId);\n if(forumUnreadCount instanceof Promise) {\n forumUnreadCount.then(({count, hasUnmuted}) => {\n dialog = this.getDialogOnly(peerId);\n const folder = this.getFolder(folderId);\n if(\n !dialog ||\n !this.appPeersManager.isForum(peerId) ||\n !folder ||\n !folder.dialogs.some((dialog) => dialog.peerId === peerId)\n ) {\n return;\n }\n\n this.modifyFolderUnreadCount(folderId, 0, false, false, dialog);\n });\n\n return;\n } else {\n addMessagesCount = 0;\n toggleDialog = forumUnreadCount.count > 0;\n toggleUnmuted = forumUnreadCount.hasUnmuted;\n }\n }\n\n const folder = this.getFolder(folderId);\n if(addMessagesCount) {\n folder.unreadMessagesCount = Math.max(0, folder.unreadMessagesCount + addMessagesCount);\n }\n\n const key = this.getDialogKey(dialog);\n if(toggleDialog) {\n folder.unreadPeerIds.add(key);\n } else {\n folder.unreadPeerIds.delete(key);\n }\n\n if(toggleUnmuted) {\n folder.unreadUnmutedPeerIds.add(key);\n } else {\n folder.unreadUnmutedPeerIds.delete(key);\n }\n\n folder.dispatchUnreadTimeout ??= ctx.setTimeout(() => {\n folder.dispatchUnreadTimeout = undefined;\n const _folder = {...folder};\n delete _folder.dialogs;\n this.rootScope.dispatchEvent('folder_unread', _folder);\n\n if(isTopic) { // * refresh forum dialog unread count\n this.processChangedUnreadOrUnmuted(peerId);\n }\n }, 0);\n }\n\n public processChangedUnreadOrUnmuted(peerId: PeerId) {\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n this.processDialogForFilters(dialog);\n this.prepareDialogUnreadCountModifying(dialog)();\n this.rootScope.dispatchEvent('dialog_unread', {\n peerId,\n dialog\n });\n }\n }\n\n public generateIndexForDialog(\n dialog: Dialog | ForumTopic,\n justReturn?: boolean,\n message?: MyMessage,\n noPinnedOrderUpdate?: boolean\n ) {\n if(!justReturn/* && !isTopic */) {\n return;\n }\n\n const isTopic = this.isTopic(dialog);\n let topDate = 0, isPinned: boolean;\n if((dialog as ForumTopic).pFlags.hidden) { // general topic must be first\n topDate = this.generateDialogPinnedDateByIndex(0xFFF);\n isPinned = true;\n } else if(dialog.pFlags.pinned && !noPinnedOrderUpdate) {\n topDate = this.generateDialogPinnedDate(dialog);\n isPinned = true;\n } else {\n message ||= this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n\n topDate = (message as Message.message)?.date || topDate;\n\n if(!isTopic) {\n const channelId = this.appPeersManager.isChannel(dialog.peerId) && dialog.peerId.toChatId();\n if(channelId) {\n const channel = this.appChatsManager.getChat(channelId) as Chat.channel;\n if(!topDate || (channel.date && channel.date > topDate)) {\n topDate = channel.date;\n }\n }\n }\n\n if(dialog.draft?._ === 'draftMessage' && dialog.draft.date > topDate) {\n topDate = dialog.draft.date;\n }\n }\n\n topDate ||= tsNow(true);\n\n const index = this.generateDialogIndex(topDate, isPinned);\n if(justReturn) {\n return index;\n }\n\n const indexKey = getDialogIndexKey((dialog as Dialog).folder_id);\n setDialogIndex(dialog, indexKey, index);\n }\n\n public generateDialogPinnedDateByIndex(pinnedIndex: number) {\n return 0x7fff0000 + (pinnedIndex & 0xFFFF); // 0xFFFF - ะฟะพั‚ะพะผัƒ ั‡ั‚ะพ ะฒ ะฟะฐะฟะบะฐั… ะผะพะถะตั‚ ะฑั‹ั‚ัŒ ะฑะตัะบะพะฝะตั‡ะฝะพะต ั‡ะธัะปะพ ะฟะธะฝะฝะตะดะพะฒ\n }\n\n public generateDialogPinnedDate(dialog: Dialog | ForumTopic) {\n const isTopic = this.isTopic(dialog);\n const order = this.getPinnedOrders(isTopic ? this.getFilterIdForForum(dialog) : dialog.folder_id);\n\n const dialogKey = this.getDialogKey(dialog);\n let pinnedIndex = order.indexOf(dialogKey);\n if(pinnedIndex === -1) {\n order.unshift(dialogKey);\n pinnedIndex = 0;\n\n if(!isTopic) {\n this.savePinnedOrders();\n }\n }\n\n return this.generateDialogPinnedDateByIndex(order.length - 1 - 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 | ForumTopic) {\n if(this.isTopic(dialog)) {\n return;\n }\n\n const {peerId, pts} = dialog;\n const historyStorage = this.appMessagesManager.getHistoryStorage(peerId);\n const messagesStorage = this.appMessagesManager.getHistoryMessagesStorage(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 && !message.pFlags.is_outgoing/* || peerId === SERVICE_PEER_ID */) {\n incomingMessage = message;\n\n const peerIds = getPeerIdsFromMessage(message);\n this.peersStorage.requestPeersForKey(peerIds, `topMessage_${peerId}`);\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.peersStorage.requestPeer(peerId, 'dialog');\n\n /* for(let id in this.filtersStorage.filters) {\n const filter = this.filtersStorage.filters[id];\n\n if(this.filtersStorage.testDialogForFilter(dialog, filter)) {\n\n }\n } */\n }\n\n public pushDialog({dialog, offsetDate, ignoreOffsetDate, saveGlobalOffset}: {\n dialog: Dialog | ForumTopic,\n offsetDate?: number,\n ignoreOffsetDate?: boolean,\n saveGlobalOffset?: boolean\n }) {\n const isTopic = this.isTopic(dialog);\n const {folder_id, peerId} = dialog as Dialog;\n\n if(isTopic) {\n const forumTopics = this.getForumTopicsCache(peerId);\n forumTopics.topics.set(dialog.id, dialog);\n } else {\n this.dialogs[peerId] = dialog;\n }\n\n offsetDate ??= this.getDialogOffsetDate(dialog);\n\n // if(!isTopic) {\n this.processDialogForFilters(dialog);\n // }\n\n if(offsetDate && !dialog.pFlags.pinned) {\n if(!isTopic && 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 folderId = isTopic ? this.getFilterIdForForum(dialog) : folder_id;\n const savedOffsetDate = this.dialogsOffsetDate[folderId];\n if(!savedOffsetDate || offsetDate < savedOffsetDate) {\n // if(pos !== -1) {\n if(!ignoreOffsetDate && !this.isDialogsLoaded(folderId)) {\n this.dropDialog(peerId, isTopic ? this.getDialogKey(dialog) : undefined, true);\n return;\n }\n\n this.dialogsOffsetDate[folderId] = offsetDate;\n }\n }\n\n this.setDialogToState(dialog);\n\n // if(pos === -1) {\n // this.prepareFolderUnreadCountModifyingByDialog(folder_id, dialog, true);\n // }\n\n // const indexKey = getDialogIndexKey(folder_id);\n // /* const newPos = */insertInDescendSortedArray(dialogs, dialog, (dialog) => getDialogIndex(dialog, indexKey), -1);\n /* if(pos !== -1 && pos !== newPos) {\n rootScope.dispatchEvent('dialog_order', {dialog, pos: newPos});\n } */\n }\n\n public dropDialogFromFolders(peerId: PeerId, topicId?: number) {\n const foundDialog = this.getDialog(peerId, undefined, topicId, false);\n const [dialog, index] = foundDialog;\n if(dialog) {\n const filterId = topicId ?\n this.getFilterIdForForum(dialog as ForumTopic) :\n (dialog as Dialog).folder_id;\n\n // const folder = this.getFolder(filterId);\n // folder.dialogs.splice(index, 1);\n const wasPinned = indexOfAndSplice(this.getPinnedOrders(filterId), this.getDialogKey(dialog)) !== undefined;\n\n this.processDialogForFilters(dialog, true);\n\n this.dialogsIndex.indexObject(peerId, '');\n\n if(wasPinned) {\n this.savePinnedOrders();\n }\n }\n\n return foundDialog;\n }\n\n public dropDialog(peerId: PeerId, topicId?: number, keepLocal?: boolean) {\n const dialog = this.getDialogOrTopic(peerId, topicId);\n const foundDialog = this.dropDialogFromFolders(peerId, topicId);\n if(dialog) {\n if(!keepLocal) {\n if(topicId) {\n this.getForumTopicsCache(peerId).topics.delete(topicId);\n } else {\n delete this.dialogs[peerId];\n }\n }\n\n this.clearDialogFromState(dialog, keepLocal);\n }\n\n return foundDialog;\n }\n\n public clearDialogFromState(dialog: Dialog | ForumTopic, keepLocal: boolean) {\n if(dialog._ === 'forumTopic') {\n return;\n }\n\n const {peerId} = dialog;\n this.peersStorage.requestPeersForKey([], `topMessage_${peerId}`);\n this.peersStorage.releasePeer(peerId, 'dialog');\n this.storage.delete(peerId, keepLocal);\n }\n\n public dropDialogWithEvent(peerId: PeerId, topicId?: number) {\n const dropped = this.dropDialog(peerId, topicId);\n if(dropped.length) {\n this.rootScope.dispatchEvent('dialog_drop', dropped[0]);\n }\n\n return dropped;\n }\n\n /**\n * leaving chat, leaving channel, deleting private dialog\n */\n public dropDialogOnDeletion(peerId: PeerId, topicId?: number) {\n this.dropDialogWithEvent(peerId, topicId);\n this.rootScope.dispatchEvent('peer_deleted', peerId);\n }\n\n public applyDialogs(result: MessagesPeerDialogs | MessagesForumTopics, peerId?: PeerId) {\n // * ะ’ ัั‚ัƒ ั„ัƒะฝะบั†ะธัŽ ะฟะพะฟะฐะดัƒั‚ ั‚ะพะปัŒะบะพ ั‚ะต ะดะธะฐะปะพะณะธ, ะฒ ะบะพั‚ะพั€ั‹ั… ะตัั‚ัŒ read_inbox_max_id ะธ read_outbox_max_id, ะฒ ะพั‚ะปะธั‡ะธะต ะพั‚ ั‚ะตั…, ั‡ั‚ะพ ะฑัƒะดัƒั‚ ะฒ getTopMessages\n\n const isForum = result._ === 'messages.forumTopics';\n const items = (result as MessagesPeerDialogs).dialogs || (result as MessagesForumTopics).topics;\n if(!isForum) {\n // ! fix 'dialogFolder', maybe there is better way to do it, this only can happen by 'messages.getPinnedDialogs' by folder_id: 0\n forEachReverse(result.dialogs, (dialog, idx) => {\n if(dialog._ === 'dialogFolder') {\n result.dialogs.splice(idx, 1);\n }\n });\n } else {\n this.processTopics(peerId, result);\n }\n\n assumeType(items);\n\n this.appUsersManager.saveApiUsers(result.users);\n this.appChatsManager.saveApiChats(result.chats);\n this.appMessagesManager.saveMessages(result.messages);\n\n // this.appMessagesManager.log('applyConversation', dialogsResult);\n\n const updatedDialogs: BroadcastEvents['dialogs_multiupdate'] = new Map();\n const getUpdateCache = (peerId: PeerId) => {\n let cache = updatedDialogs.get(peerId);\n if(!cache) {\n updatedDialogs.set(peerId, cache = {});\n }\n\n return cache;\n };\n\n items.forEach((dialog) => {\n const peerId = this.appPeersManager.getPeerId(dialog.peer);\n let topMid = dialog.top_message;\n\n const topPendingMid = this.appMessagesManager.pendingTopMsgs[peerId];\n if(topPendingMid) {\n const topPendingMessage = this.appMessagesManager.getMessageByPeer(peerId, topPendingMid) as MyMessage;\n const topMessage = this.appMessagesManager.getMessageByPeer(peerId, topMid) as MyMessage;\n if(!topMid || (topPendingMessage && (!topMessage || topPendingMessage?.date > topMessage?.date))) {\n dialog.top_message = topMid = topPendingMid;\n this.appMessagesManager.getHistoryStorage(peerId).maxId = topPendingMid;\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(topMid || dialog.draft?._ === 'draftMessage') {\n if(this.saveDialog({dialog})) {\n const cache = getUpdateCache(peerId);\n\n if(isForum) {\n (cache.topics ??= new Map()).set(\n (dialog as ForumTopic).id,\n dialog as ForumTopic\n );\n } else {\n cache.dialog = dialog as Dialog;\n }\n }\n } else {\n this.dropDialogWithEvent(peerId, isForum ? this.getDialogKey(dialog) : undefined);\n }\n\n const key = this.appMessagesManager.getUpdateAfterReloadKey(peerId, isForum ? this.getDialogKey(dialog) : undefined);\n const updates = this.appMessagesManager.newUpdatesAfterReloadToHandle[key];\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[key];\n }\n }\n });\n\n if(updatedDialogs.size) {\n this.rootScope.dispatchEvent('dialogs_multiupdate', updatedDialogs);\n }\n }\n\n private getDialogOffsetDate(dialog: Dialog | ForumTopic) {\n const message = this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n return message?.date || 0;\n }\n\n public canSaveDialogByPeerId(peerId: PeerId) {\n if(peerId.isAnyChat()) {\n const chat: Chat = this.appChatsManager.getChat(peerId.toChatId());\n // ! chatForbidden stays for chat where you're kicked\n if(\n chat._ === 'channelForbidden' ||\n // || chat._ === 'chatForbidden'\n (chat as Chat.chat).pFlags.left\n // || (chat as any).pFlags.kicked\n ) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Won't save migrated from peer, forbidden peers, left and kicked\n */\n public saveDialog({\n dialog,\n folderId,\n ignoreOffsetDate,\n saveGlobalOffset\n }: {\n dialog: Dialog | ForumTopic,\n folderId?: REAL_FOLDER_ID,\n ignoreOffsetDate?: boolean,\n saveGlobalOffset?: boolean\n }) {\n const isTopic = this.isTopic(dialog);\n const isDialog = !isTopic;\n\n const topicId = isTopic ? dialog.id = generateMessageId(dialog.id) : undefined;\n if(!isTopic) {\n folderId ??= dialog.folder_id ?? FOLDER_ID_ALL;\n }\n\n const peerId = this.appPeersManager.getPeerId(dialog.peer);\n if(!peerId) {\n console.error('saveConversation no peerId???', dialog, folderId);\n return false;\n }\n\n if(!isTopic && dialog._ !== 'dialog'/* || peerId === 239602833 */) {\n console.error('saveConversation not regular dialog', dialog, Object.assign({}, dialog));\n }\n\n if(isDialog && !this.canSaveDialogByPeerId(peerId)) {\n return false;\n }\n\n const channelId = this.appPeersManager.isChannel(peerId) ? peerId.toChatId() : NULL_PEER_ID;\n\n if(isDialog) {\n const peerText = this.appPeersManager.getPeerSearchText(peerId);\n this.dialogsIndex.indexObject(peerId, peerText);\n }\n\n const wasDialogBefore = this.getDialogOrTopic(peerId, topicId);\n\n let mid: number, message: MyMessage;\n if(dialog.top_message) {\n mid = 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(isDialog && !channelId && peerId.isAnyChat()) {\n const chat = this.appChatsManager.getChat(peerId.toChatId()) as Chat.chat;\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 === getServerMessageId(wasDialogBefore.read_inbox_max_id) ? wasDialogBefore.unread_count : dialog.unread_count;\n dialog.read_inbox_max_id = generateMessageId(wasDialogBefore && !dialog.read_inbox_max_id ? wasDialogBefore.read_inbox_max_id : dialog.read_inbox_max_id);\n dialog.read_outbox_max_id = generateMessageId(wasDialogBefore && !dialog.read_outbox_max_id ? wasDialogBefore.read_outbox_max_id : dialog.read_outbox_max_id);\n\n if(isDialog && dialog.folder_id === undefined) {\n if(dialog._ === 'dialog') {\n // ! ะกะ›ะžะ–ะะž ! ะกะœะžะขะ ะ˜ ะ’ getTopMessages\n dialog.folder_id = wasDialogBefore ? (wasDialogBefore as typeof dialog).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, threadId: topicId, draft: dialog.draft});\n dialog.peerId = peerId;\n // dialog.indexes ??= {} as any;\n\n // Because we saved message without dialog present\n if(message && 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, topicId);\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 this.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 this.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 threadId: isTopic ? dialog.id : undefined,\n settings: dialog.notify_settings\n });\n\n if(isDialog && channelId && dialog.pts) {\n this.apiUpdatesManager.addChannelState(channelId, dialog.pts);\n }\n\n this.generateIndexForDialog(dialog);\n\n if(wasDialogBefore) {\n // fix unread count\n const releaseUnreadCount = this.dialogsStorage.prepareDialogUnreadCountModifying(wasDialogBefore);\n safeReplaceObject(wasDialogBefore, dialog);\n releaseUnreadCount();\n }\n\n this.pushDialog({\n dialog,\n offsetDate: message?.date,\n ignoreOffsetDate,\n saveGlobalOffset\n });\n\n if(isTopic) {\n this.processTopicUpdate(dialog, wasDialogBefore as ForumTopic);\n }\n\n return true;\n }\n\n public processTopicUpdate(topic: ForumTopic, oldTopic?: ForumTopic) {\n if(!oldTopic) {\n return;\n }\n\n const {peerId, id: threadId} = topic;\n const isIconChanged = topic.icon_emoji_id !== (oldTopic as ForumTopic).icon_emoji_id;\n const isTitleChanged = topic.title !== (oldTopic as ForumTopic).title;\n const isChanged = isIconChanged || isTitleChanged;\n\n if(isIconChanged) {\n this.rootScope.dispatchEvent('avatar_update', {peerId, threadId});\n }\n\n if(isChanged) {\n this.rootScope.dispatchEvent('peer_title_edit', {peerId, threadId});\n }\n }\n\n public getDialogs(options: {\n query?: string,\n offsetIndex?: number,\n limit?: number,\n filterId?: number,\n skipMigrated?: boolean\n }): MaybePromise<{\n dialogs: Folder['dialogs'],\n count: number,\n isTopEnd: boolean,\n isEnd: boolean\n }> {\n const {\n query = '',\n offsetIndex,\n limit = 20,\n filterId = FOLDER_ID_ALL,\n skipMigrated = false\n } = options;\n\n const isForum = this.isFilterIdForForum(filterId);\n if(!isForum && !REAL_FOLDERS.has(filterId)) {\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.filtersStorage.reloadMissingPeerIds(filterId);\n if(reloadMissingDialogsPromise) {\n promises.push(reloadMissingDialogsPromise);\n }\n\n if(promises.length) {\n return Promise.all(promises).then(() => {\n return this.getDialogs(options);\n });\n }\n }\n\n // let's load only first pages by certain folderId. next pages will load without folder filtering\n const realFolderId/* : REAL_FOLDER_ID */ =\n (!REAL_FOLDERS.has(filterId) || this.getOffsetDate(filterId)) && !isForum ?\n GLOBAL_FOLDER_ID :\n filterId/* as REAL_FOLDER_ID */;\n let curDialogStorage = this.getFolderDialogs(filterId, skipMigrated);\n\n const indexKey = this.getDialogIndexKeyByFilterId(filterId);\n\n if(query && !isForum) {\n if(!limit || this.cachedResults.query !== query || this.cachedResults.folderId !== filterId) {\n this.cachedResults.query = query;\n this.cachedResults.folderId = filterId;\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 === filterId) {\n dialogs.push(dialog);\n }\n }\n\n dialogs.sort((d1, d2) => this.getDialogIndex(d2, indexKey) - this.getDialogIndex(d1, indexKey));\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 > this.getDialogIndex(curDialogStorage[offset], indexKey)) {\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 return {\n dialogs,\n count: loadedAll ? curDialogStorage.length : null,\n isTopEnd: curDialogStorage.length && ((dialogs[0] && dialogs[0] === curDialogStorage[0]) || this.getDialogIndex(curDialogStorage[0], indexKey) < offsetIndex),\n isEnd: (query || loadedAll) && (offset + limit) >= curDialogStorage.length\n };\n }\n\n return this.appMessagesManager.getTopMessages({limit, folderId: realFolderId}).then((result) => {\n // const curDialogStorage = this[folderId];\n if(skipMigrated) {\n curDialogStorage = this.getFolderDialogs(filterId, skipMigrated);\n }\n\n offset = 0;\n if(offsetIndex > 0) {\n for(let length = curDialogStorage.length; offset < length; ++offset) {\n if(offsetIndex > this.getDialogIndex(curDialogStorage[offset], indexKey)) {\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]) || this.getDialogIndex(curDialogStorage[0], indexKey) < offsetIndex),\n // isEnd: this.isDialogsLoaded(realFolderId) && (offset + limit) >= curDialogStorage.length\n isEnd: result.isEnd\n };\n });\n }\n\n // * FORUMS SECTION\n\n public flushForumTopicsCache(peerId: PeerId) {\n const cache = this.forumTopics.get(peerId);\n if(!cache) {\n return;\n }\n\n const folder = this.folders[peerId];\n if(folder) {\n if(folder.dispatchUnreadTimeout) {\n clearTimeout(folder.dispatchUnreadTimeout);\n }\n\n delete this.allDialogsLoaded[peerId];\n delete this.pinnedOrders[peerId];\n delete this.dialogsOffsetDate[peerId];\n delete this.folders[peerId];\n }\n\n cache.topics.clear();\n\n // for permanent delete\n // this.forumTopics.delete(peerId);\n }\n\n public getForumTopicsCache(peerId: PeerId) {\n let forumTopics = this.forumTopics.get(peerId);\n if(!forumTopics) {\n forumTopics = {\n topics: new Map(),\n deletedTopics: new Set(),\n getTopicPromises: new Map()\n };\n\n this.forumTopics.set(peerId, forumTopics);\n }\n\n return forumTopics;\n }\n\n public getForumTopicById(peerId: PeerId, topicId?: number): Promise {\n if(!this.appPeersManager.isForum(peerId)) {\n return Promise.reject(makeError('CHANNEL_FORUM_MISSING'));\n }\n\n const cache = this.getForumTopicsCache(peerId);\n let promise: CancellablePromise;\n if(topicId) {\n promise = cache.getTopicPromises.get(topicId);\n if(promise) {\n return promise;\n }\n\n if(cache.deletedTopics.has(topicId)) {\n return Promise.resolve(undefined);\n }\n\n cache.getTopicPromises.set(topicId, promise = deferredPromise());\n }\n\n cache.getTopicsPromise ??= pause(0).then(() => {\n const promises: {[topicId: number]: typeof promise} = {};\n const ids: number[] = [];\n for(const [topicId, promise] of cache.getTopicPromises) {\n promises[topicId] = promise;\n ids.push(getServerMessageId(topicId));\n }\n\n cache.getTopicPromises.clear();\n\n const fullfillLeft = () => {\n for(const topicId in promises) {\n promises[topicId].resolve(undefined);\n cache.deletedTopics.add(+topicId);\n }\n };\n\n if(this.getForumTopicsCache(peerId) !== cache) {\n fullfillLeft();\n return;\n }\n\n return this.apiManager.invokeApi('channels.getForumTopicsByID', {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n topics: ids\n }).then((messagesForumTopics) => {\n if(this.getForumTopicsCache(peerId) !== cache) {\n return;\n }\n\n this.applyDialogs(messagesForumTopics, peerId);\n\n messagesForumTopics.topics.forEach((forumTopic) => {\n if(forumTopic._ === 'forumTopic') {\n promises[forumTopic.id].resolve(forumTopic);\n delete promises[peerId];\n }\n });\n\n return messagesForumTopics;\n }, () => {}).then(() => {\n fullfillLeft();\n\n cache.getTopicsPromise = undefined;\n if(cache.getTopicPromises.size) {\n this.getForumTopicById(peerId);\n }\n });\n });\n\n return promise || cache.getTopicsPromise;\n }\n\n // public getForumTopicById(peerId: PeerId, topicId: number) {\n // return this.getForumTopicsByID(peerId, topicId).then((result) => result.topics[0]);\n // }\n\n public getForumTopic(peerId: PeerId, topicId: number) {\n const forumTopics = this.forumTopics.get(peerId);\n return forumTopics?.topics?.get(topicId);\n }\n\n public getForumTopicOrReload(peerId: PeerId, topicId: number) {\n const forumTopic = this.getForumTopic(peerId, topicId);\n if(forumTopic) {\n return forumTopic;\n }\n\n const cache = this.getForumTopicsCache(peerId);\n return cache?.deletedTopics?.has(topicId) ? undefined : this.getForumTopicById(peerId, topicId);\n }\n\n public processTopics>(peerId: PeerId, result: T) {\n return callbackify(result, (result) => {\n if('pts' in result) {\n this.apiUpdatesManager.addChannelState(peerId.toChatId(), result.pts);\n }\n\n const peer = this.appPeersManager.getOutputPeer(peerId);\n result.topics = result.topics.map((topic) => {\n if(topic._ === 'forumTopicDeleted') {\n return;\n }\n\n (topic as ForumTopic).peer = peer;\n topic.id = generateMessageId(topic.id);\n return topic;\n }).filter(Boolean);\n\n return result;\n });\n }\n\n public processTopicsPromise[1]>>(peerId: PeerId, promise: T): T {\n return promise.then((result) => {\n this.processTopics(peerId, result);\n return result;\n }) as any;\n }\n\n public getForumUnreadCount(peerId: PeerId) {\n if(!this.appPeersManager.isForum(peerId)) {\n return;\n }\n\n const folder = this.getFolder(peerId);\n\n const f = folder.dialogs.length >= 20 || this.isDialogsLoaded(peerId) ?\n folder.dialogs.slice(0, 20) :\n callbackify(this.getDialogs({filterId: peerId, limit: 20}), (result) => {\n return result.dialogs;\n });\n\n return callbackify(f, (dialogs) => {\n return {\n count: dialogs.reduce((acc, v) => acc + +!!v.unread_count, 0),\n hasUnmuted: dialogs.some((dialog) => dialog.unread_count && this.isDialogUnmuted(dialog))\n };\n });\n }\n\n // * FORUMS SECTION END\n\n private handleDialogTogglePinned(dialog: Dialog | ForumTopic, pinned: boolean, folderId: number) {\n if(dialog) {\n if(!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(dialog.peerId, dialog);\n }\n\n private handleDialogsPinned(folderId: number, order: (Dialog['peerId'] | ForumTopic['id'])[]) {\n const isForum = this.isFilterIdForForum(folderId);\n this.resetPinnedOrder(folderId);\n this.getPinnedOrders(folderId).push(...order);\n this.savePinnedOrders();\n order.reverse(); // index must be higher\n const newPinned: {[id: typeof order[0]]: true} = {};\n order.forEach((id) => {\n newPinned[id] = true;\n\n const peerId = isForum ? folderId : id;\n const topicId = isForum ? id : undefined;\n\n const dialog = this.getDialogOrTopic(peerId, topicId);\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 if(!newPinned[this.getDialogKey(dialog)]) {\n delete dialog.pFlags.pinned;\n this.generateIndexForDialog(dialog);\n this.appMessagesManager.scheduleHandleNewDialogs(dialog.peerId, dialog);\n }\n }\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 as Dialog).folder_id = folder_id as REAL_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 ?? FOLDER_ID_ALL;\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 this.handleDialogTogglePinned(dialog, update.pFlags.pinned, folderId);\n };\n\n private onUpdateChannelPinnedTopic = (update: Update.updateChannelPinnedTopic) => {\n const peerId = update.channel_id.toPeerId(true);\n const topicId = generateMessageId(update.topic_id);\n const topic = this.getForumTopic(peerId, topicId);\n if(!topic) {\n return;\n }\n\n this.handleDialogTogglePinned(topic, update.pFlags.pinned, this.getFilterIdForForum(topic));\n };\n\n private onUpdatePinnedDialogs = (update: Update.updatePinnedDialogs) => {\n const folderId = update.folder_id ?? FOLDER_ID_ALL;\n\n if(update.order) {\n this.handleDialogsPinned(folderId, update.order.map((peer) => this.appPeersManager.getPeerId((peer as DialogPeer.dialogPeer).peer)));\n } else {\n this.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 this.handleDialogsPinned(folderId, dialogsResult.dialogs.map((d) => d.peerId));\n });\n }\n };\n\n private onUpdateChannelPinnedTopics = async(update: Update.updateChannelPinnedTopics) => {\n const peerId = update.channel_id.toPeerId(true);\n const forumTopics = this.forumTopics.get(peerId);\n if(!forumTopics) {\n return;\n }\n\n const filterId = peerId;\n if(update.order) {\n const order = update.order.map((topicId) => generateMessageId(topicId));\n this.handleDialogsPinned(filterId, order);\n } else {\n const limit = await this.apiManager.getLimit('topicPin', true);\n\n const promise = this.apiManager.invokeApi('channels.getForumTopics', {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n limit,\n offset_date: 0,\n offset_id: 0,\n offset_topic: 0\n });\n\n const result = await this.processTopics(peerId, promise);\n\n const topics = result.topics as ForumTopic[];\n const pinned = topics.filter((topic) => topic.pFlags.pinned);\n this.handleDialogsPinned(filterId, pinned.map((topic) => topic.id));\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 {DialogFilter, ForumTopic, Update} from '../../layer';\nimport type {Dialog} from '../appManagers/appMessagesManager';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport copy from '../../helpers/object/copy';\nimport {AppManager} from '../appManagers/manager';\nimport findAndSplice from '../../helpers/array/findAndSplice';\nimport assumeType from '../../helpers/assumeType';\nimport {FOLDER_ID_ALL, FOLDER_ID_ARCHIVE, REAL_FOLDERS, REAL_FOLDER_ID, START_LOCAL_ID} from '../mtproto/mtproto_config';\nimport makeError from '../../helpers/makeError';\n\nexport type MyDialogFilter = DialogFilter.dialogFilter;\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\nconst PREPENDED_FILTERS = REAL_FOLDERS.size;\n\nconst LOCAL_FILTER: MyDialogFilter = {\n _: 'dialogFilter',\n pFlags: {},\n flags: 0,\n id: 0,\n title: '',\n exclude_peers: [],\n include_peers: [],\n pinned_peers: [],\n excludePeerIds: [],\n includePeerIds: [],\n pinnedPeerIds: []\n};\n\nexport default class FiltersStorage extends AppManager {\n private filters: {[filterId: string]: MyDialogFilter};\n private filtersArr: Array;\n private localFilters: {[filterId: string]: MyDialogFilter};\n private localId: number;\n private reloadedPeerIds: Set;\n\n protected after() {\n this.clear(true);\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateDialogFilter: this.onUpdateDialogFilter,\n\n updateDialogFilters: this.onUpdateDialogFilters,\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(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 this.rootScope.addEventListener('premium_toggle', () => {\n this.onUpdateDialogFilters({_: 'updateDialogFilters'});\n });\n\n return this.appStateManager.getState().then((state) => {\n const filtersArr = this.prependFilters(state.filtersArr);\n filtersArr.map((filter) => {\n this.saveDialogFilter(filter, false, true);\n });\n });\n }\n\n /**\n * ! use it only with saving\n */\n private prependFilters(filters: DialogFilter[]) {\n filters = filters.slice();\n\n const allChatsFilter = this.localFilters[FOLDER_ID_ALL];\n const archiveFilter = this.localFilters[FOLDER_ID_ARCHIVE];\n\n const allChatsFilterIndex = filters.findIndex((filter) => filter._ === 'dialogFilterDefault' || filter.id === FOLDER_ID_ALL);\n if(allChatsFilterIndex !== -1) filters[allChatsFilterIndex] = allChatsFilter;\n else filters.unshift(allChatsFilter);\n\n findAndSplice(filters, (filter) => (filter as MyDialogFilter).id === FOLDER_ID_ARCHIVE);\n filters.splice(/* 1 */filters[0] === allChatsFilter ? 1 : 0, 0, archiveFilter);\n\n this.localId = START_LOCAL_ID;\n filters.forEach((filter) => {\n delete filter.localId;\n });\n\n return filters;\n }\n\n private generateLocalFilter(id: REAL_FOLDER_ID) {\n const filter: MyDialogFilter = {...copy(LOCAL_FILTER), id};\n if(id === FOLDER_ID_ALL) {\n filter.pFlags.exclude_archived = true;\n } else if(id === FOLDER_ID_ARCHIVE) {\n filter.pFlags.exclude_unarchived = true;\n }\n\n if(REAL_FOLDERS.has(id)) {\n filter.pinnedPeerIds = this.dialogsStorage.getPinnedOrders(id);\n }\n\n return filter;\n }\n\n // private getLocalFilter(id: number) {\n // return this.filters[id] ??= this.generateLocalFilter(id);\n // }\n\n public clear = (init?: boolean) => {\n if(!init) {\n // safeReplaceObject(this.filters, {});\n this.reloadedPeerIds.clear();\n this.clearFilters();\n } else {\n this.filters = {};\n this.filtersArr = [];\n this.reloadedPeerIds = new Set();\n\n this.localFilters = {};\n for(const filterId of REAL_FOLDERS) {\n this.localFilters[filterId] = this.generateLocalFilter(filterId as REAL_FOLDER_ID);\n }\n }\n\n this.localId = START_LOCAL_ID;\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 findAndSplice(this.filtersArr, (filter) => (filter as DialogFilter.dialogFilter).id === update.id);\n }\n\n this.pushToState();\n };\n\n private onUpdateDialogFilters = (update: Update.updateDialogFilters) => {\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 private onUpdateDialogFilterOrder = (update: Update.updateDialogFilterOrder) => {\n // console.log('updateDialogFilterOrder', update);\n\n const order = update.order.slice();\n if(!order.includes(FOLDER_ID_ARCHIVE)) {\n order.splice(order[0] === FOLDER_ID_ALL ? 1 : 0, 0, FOLDER_ID_ARCHIVE);\n }\n\n this.localId = START_LOCAL_ID;\n order.forEach((filterId) => {\n const filter = this.filters[filterId];\n delete filter.localId;\n this.setLocalId(filter);\n });\n\n this.rootScope.dispatchEvent('filter_order', order);\n\n this.pushToState();\n };\n\n private pushToState() {\n this.appStateManager.pushToState('filtersArr', this.filtersArr);\n }\n\n public testDialogForFilter(dialog: Dialog | ForumTopic.forumTopic, filter?: MyDialogFilter) {\n if(!filter) {\n return true;\n }\n\n if(REAL_FOLDERS.has(filter.id)) {\n return (dialog as Dialog).folder_id === filter.id && this.dialogsStorage.canSaveDialogByPeerId(dialog.peerId);\n }\n\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 as Dialog).folder_id === FOLDER_ID_ARCHIVE) {\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 getFilters() {\n return this.filters;\n }\n\n public clearFilters() {\n const filters = this.getFilters();\n for(const filterId in filters) { // delete filters\n if(REAL_FOLDERS.has(+filterId)) {\n continue;\n }\n\n this.onUpdateDialogFilter({\n _: 'updateDialogFilter',\n id: +filterId\n });\n }\n }\n\n public async 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 >= (await this.apiManager.getConfig()).pinned_infolder_count_max) {\n return Promise.reject(makeError('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 this.apiManager.invokeApi('messages.updateDialogFilter', {\n flags,\n id: filter.id,\n filter: remove ? undefined : this.getOutputDialogFilter(filter)\n }).then((bool) => { // ะฒะพะทะผะพะถะฝะพ ะฝัƒะถะฝะฐ ะฟั€ะพะฒะตั€ะบะฐ ะธ ะพั‚ะบะฐั‚, ะตัะปะธ ั€ะตะทัƒะปัŒั‚ะฐั‚ ะฝะต ะขะ ะฃ\n // console.log('updateDialogFilter bool:', bool);\n\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.localId;\n f.push(filter);\n }\n\n filter.localId = START_LOCAL_ID;\n\n const order = f.sort((a, b) => a.localId - b.localId).map((filter) => filter.id);\n this.onUpdateDialogFilterOrder({\n _: 'updateDialogFilterOrder',\n order\n });\n }\n });\n }\n\n public updateDialogFiltersOrder(order: number[]) {\n return this.apiManager.invokeApi('messages.updateDialogFiltersOrder', {\n order\n }).then(() => {\n this.onUpdateDialogFilterOrder({\n _: 'updateDialogFilterOrder',\n order\n });\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 // private spliceMissingPeerIds(filterId: number, type: ArgumentTypes[1], missingPeerIds: PeerId[]) {\n // const filter = this.getFilter(filterId);\n // const peers = filter && filter[type];\n // if(!peers?.length) {\n // return;\n // }\n\n // let spliced = false;\n // missingPeerIds.forEach((peerId) => {\n // const inputPeer = findAndSplice(peers, (inputPeer) => getPeerId(inputPeer) === peerId);\n // if(inputPeer) {\n // spliced = true;\n // }\n // });\n\n // if(spliced) {\n // this.onUpdateDialogFilter({\n // _: 'updateDialogFilter',\n // id: filterId,\n // filter\n // });\n // }\n // }\n\n public reloadMissingPeerIds(\n filterId: number,\n type: 'pinned_peers' | 'include_peers' | 'exclude_peers' = 'pinned_peers'\n ) {\n const filter = this.getFilter(filterId);\n const peers = filter?.[type];\n if(!peers?.length) {\n return;\n }\n\n // const missingPeerIds: PeerId[] = [];\n const reloadDialogs = peers.filter((inputPeer) => {\n const peerId = this.appPeersManager.getPeerId(inputPeer);\n const isAlreadyReloaded = this.reloadedPeerIds.has(peerId);\n const dialog = this.appMessagesManager.getDialogOnly(peerId);\n // if(isAlreadyReloaded && !dialog) {\n // missingPeerIds.push(peerId);\n // }\n\n const reload = !isAlreadyReloaded && !dialog;\n return reload;\n });\n\n if(!reloadDialogs.length) {\n // if(missingPeerIds.length) {\n // this.spliceMissingPeerIds(filterId, type, missingPeerIds);\n // }\n\n return;\n }\n\n const reloadPromises = reloadDialogs.map((inputPeer) => {\n const peerId = this.appPeersManager.getPeerId(inputPeer);\n const promise = this.appMessagesManager.reloadConversation(inputPeer)\n .then((dialog) => {\n this.reloadedPeerIds.add(peerId);\n\n return dialog ? undefined : peerId;\n });\n\n return promise;\n });\n\n const reloadPromise = Promise.all(reloadPromises).then((missingPeerIds) => {\n missingPeerIds = missingPeerIds.filter(Boolean);\n if(!missingPeerIds.length) {\n return;\n }\n\n // this.spliceMissingPeerIds(filterId, type, missingPeerIds);\n });\n\n return reloadPromise;\n }\n\n public async getDialogFilters(overwrite = false): Promise {\n const keys = Object.keys(this.filters);\n if(keys.length > PREPENDED_FILTERS && !overwrite) {\n return keys.map((filterId) => this.filters[filterId]).sort((a, b) => a.localId - b.localId);\n }\n\n const filters = await this.apiManager.invokeApiSingle('messages.getDialogFilters');\n const prepended = this.prependFilters(filters);\n return prepended.map((filter) => this.saveDialogFilter(filter, overwrite)).filter(Boolean);\n }\n\n public getSuggestedDialogsFilters() {\n return this.apiManager.invokeApi('messages.getSuggestedDialogFilters');\n }\n\n public saveDialogFilter(filter: DialogFilter, update = true, silent?: boolean) {\n // defineNotNumerableProperties(filter, ['includePeerIds', 'excludePeerIds', 'pinnedPeerIds']);\n\n if(filter._ === 'dialogFilterDefault') {\n filter = this.localFilters[FOLDER_ID_ALL];\n }\n\n assumeType(filter);\n if(!REAL_FOLDERS.has(filter.id)) {\n convertment.forEach(([from, to]) => {\n assumeType(filter);\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\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.setLocalId(filter);\n\n if(!silent) {\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 return filter;\n }\n\n private setLocalId(filter: MyDialogFilter) {\n if(filter.localId !== undefined) {\n if(filter.localId >= this.localId) {\n this.localId = filter.localId + 1;\n }\n } else {\n filter.localId = this.localId++ as MyDialogFilter['localId'];\n findAndSplice(this.filtersArr, (_filter) => _filter.id === filter.id);\n this.filtersArr.push(filter);\n this.pushToState();\n }\n }\n\n public async isFilterIdAvailable(filterId: number) {\n if(REAL_FOLDERS.has(filterId)) {\n return true;\n }\n\n const limit = await this.apiManager.getLimit('folders');\n const isFolderAvailable = this.filtersArr.filter((filter) => !REAL_FOLDERS.has(filter.id)).slice(0, limit).some((filter) => filter.id === filterId);\n\n return isFolderAvailable;\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 applyMixins(derivedCtor: any, constructors: any[]) {\n // const callbacks: Array<(...args: any[]) => any> = [];\n\n constructors.forEach((baseCtor) => {\n Object.getOwnPropertyNames(baseCtor.prototype).forEach((name) => {\n const value: PropertyDescriptor = Object.getOwnPropertyDescriptor(baseCtor.prototype, name) || Object.create(null);\n /* if(name === '_constructor') {\n callbacks.push(value.value);\n return;\n } else */if(name === 'constructor') {\n return;\n }\n\n Object.defineProperty(\n derivedCtor.prototype,\n name,\n value\n );\n });\n });\n\n // if(callbacks.length) {\n // function c(...args: any[]): any {\n // callbacks.forEach((cb, idx) => {\n // // @ts-ignore\n // cb.apply(this, args[idx] || []);\n // });\n // };\n\n // Object.defineProperty(derivedCtor.prototype, 'superConstructor', {\n // configurable: true,\n // enumerable: true,\n // value: c,\n // writable: true\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/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport DEBUG from '../../config/debug';\nimport {ConstructorDeclMap, Message, MessageEntity, MessageFwdHeader, Peer, Update, Updates} from '../../layer';\nimport {logger, LogTypes} from '../logger';\nimport assumeType from '../../helpers/assumeType';\nimport App from '../../config/app';\nimport filterUnique from '../../helpers/array/filterUnique';\nimport {AppManager} from './manager';\nimport parseMarkdown from '../richTextProcessor/parseMarkdown';\nimport ctx from '../../environment/ctx';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport applyMixins from '../../helpers/applyMixins';\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?: boolean,\n timeout: number\n },\n syncLoading: Promise,\n\n seq?: number,\n pts?: number,\n date?: number,\n lastPtsUpdateTime?: number,\n lastDifferenceTime?: number\n};\n\nconst SYNC_DELAY = 6;\n\nclass 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 subscriptions: {[channelId: ChatId]: {count: number, interval?: number}} = {};\n\n constructor() {\n this._constructor(false);\n }\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 this.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?.seqAwaiting &&\n state.seq >= state.syncPending.seqAwaiting) {\n if(!state.syncPending.ptsAwaiting) {\n this.clearStatePendingSync(state);\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 this.clearStatePendingSync(curState);\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 ? this.appPeersManager.peerId : (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) || this.appPeersManager.peerId);\n\n this.processUpdate({\n _: 'updateNewMessage',\n message: {\n _: 'message',\n pFlags: updateMessage.pFlags,\n id: updateMessage.id,\n from_id: this.appPeersManager.getOutputPeer(fromId.toPeerId()),\n peer_id: this.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 this.appUsersManager.saveApiUsers(updateMessage.users, options.override);\n this.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 const wasSyncing = updatesState.syncLoading;\n if(!wasSyncing) {\n updatesState.pendingSeqUpdates = {};\n updatesState.pendingPtsUpdates = [];\n }\n\n this.clearStatePendingSync(updatesState);\n\n const promise = this.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 this.rootScope.dispatchEvent('state_synchronizing');\n }\n\n if(differenceResult._ !== 'updates.differenceTooLong') {\n this.appUsersManager.saveApiUsers(differenceResult.users);\n this.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) + this.timeManager.getServerTimeOffset();\n delete updatesState.seq;\n\n this.channelStates = {};\n\n this.log.warn('getDifference:', differenceResult._);\n this.onDifferenceTooLong();\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 clearStatePendingSync(state: UpdatesState) {\n if(state.syncPending) {\n clearTimeout(state.syncPending.timeout);\n state.syncPending = null;\n }\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 this.clearStatePendingSync(channelState);\n\n const log = this.debug ? this.log.bindPrefix('getChannelDifference-' + channelId) : undefined;\n // this.log.trace('Get channel diff', appChatsManager.getChat(channelId), channelState.pts);\n const promise = this.apiManager.invokeApi('updates.getChannelDifference', {\n channel: this.appChatsManager.getChannelInput(channelId),\n filter: {_: 'channelMessagesFilterEmpty'},\n pts: channelState.pts,\n limit: 1000\n }, {timeout: 0x7fffffff}).then((differenceResult) => {\n log?.debug('diff result', differenceResult)\n channelState.pts = 'pts' in differenceResult ? differenceResult.pts : undefined;\n channelState.lastDifferenceTime = Date.now();\n\n if(differenceResult._ === 'updates.channelDifferenceEmpty') {\n // log?.debug('apply channel empty diff', differenceResult);\n return;\n }\n\n if(differenceResult._ === 'updates.channelDifferenceTooLong') {\n // 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 this.appUsersManager.saveApiUsers(differenceResult.users);\n this.appChatsManager.saveApiChats(differenceResult.chats);\n\n // Should be first because of updateMessageID\n log?.debug('applying', differenceResult.other_updates.length, 'channel other updates');\n differenceResult.other_updates.forEach((update) => {\n this.saveUpdate(update);\n });\n\n 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 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 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 onDifferenceTooLong() {\n this.appUsersManager.clear();\n this.appChatsManager.clear();\n this.appMessagesManager.clear();\n\n this.rootScope.dispatchEvent('state_cleared');\n }\n\n private justAName(state: UpdatesState, promise: UpdatesState['syncLoading'], channelId?: ChatId) {\n state.syncLoading = promise;\n this.rootScope.dispatchEvent('state_synchronizing', channelId);\n\n promise.then(() => {\n state.syncLoading = null;\n this.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 return this.channelStates[channelId] ??= {\n pts,\n pendingPtsUpdates: [],\n syncPending: null,\n syncLoading: null\n };\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 = this.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 = this.appPeersManager.getPeerId(message.peer_id);\n const fwdHeader: MessageFwdHeader.messageFwdHeader = message.fwd_from || {} as any;\n let reason: string;\n if(message.from_id && !this.appUsersManager.hasUser(this.appPeersManager.getPeerId(message.from_id), message.pFlags.post/* || channelId*/) && (reason = 'author') ||\n fwdHeader.from_id && !this.appUsersManager.hasUser(this.appPeersManager.getPeerId(fwdHeader.from_id), !!(fwdHeader.from_id as Peer.peerChannel).channel_id) && (reason = 'fwdAuthor') ||\n (fwdHeader.from_id as Peer.peerChannel)?.channel_id && !this.appChatsManager.hasChat((fwdHeader.from_id as Peer.peerChannel).channel_id, true) && (reason = 'fwdChannel') ||\n toPeerId.isUser() && !this.appUsersManager.hasUser(toPeerId) && (reason = 'toPeer User') ||\n toPeerId.isAnyChat() && !this.appChatsManager.hasChat(toPeerId.toChatId()) && (reason = 'toPeer Chat')) {\n this.log.warn('Not enough data for message update', toPeerId, reason, message);\n if(channelId && this.appChatsManager.hasChat(channelId)) {\n this.getChannelDifference(channelId);\n } else {\n this.forceGetDifference();\n }\n return false;\n }\n } else if(channelId && !this.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 && this.appChatsManager.getChat(channelId));\n curState.pendingPtsUpdates.push(update as Update.updateNewMessage);\n if(!curState.syncPending && !curState.syncLoading) {\n curState.syncPending = {\n timeout: ctx.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?.seqAwaiting);\n\n curState.pendingSeqUpdates[seqStart] ??= {seq, date: options.date, updates: []};\n curState.pendingSeqUpdates[seqStart].updates.push(update);\n\n if(!curState.syncPending) {\n curState.syncPending = {\n timeout: ctx.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 this.dispatchEvent(update._, update as any);\n }\n\n public subscribeToChannelUpdates(channelId: ChatId) {\n const subscription = this.subscriptions[channelId] ??= {count: 0};\n ++subscription.count;\n\n const cb = () => {\n const state = this.getChannelState(channelId);\n if(!state.syncLoading && (!state.lastDifferenceTime || (Date.now() - state.lastDifferenceTime) > 2500)) {\n this.getChannelDifference(channelId);\n }\n };\n\n subscription.interval ??= ctx.setInterval(cb, 3000);\n cb();\n }\n\n public unsubscribeFromChannelUpdates(channelId: ChatId, force?: boolean) {\n const subscription = this.subscriptions[channelId];\n if(!subscription?.interval || (--subscription.count && !force)) {\n return;\n }\n\n clearInterval(subscription.interval);\n subscription.interval = undefined;\n delete this.subscriptions[channelId];\n }\n\n public attach(langCode?: string) {\n if(this.attached) return;\n\n // return;\n\n this.log('attach');\n\n this.attached = true;\n\n this.appStateManager.getState().then(({updates: state}) => {\n const newVersion = this.appStateManager.newVersion/* || '1.6.0' */;\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 this.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 this.apiManager.setUpdatesProcessor(this.processUpdateMessage);\n\n // this.updatesState.syncLoading.then(() => {\n this.setProxy();\n // });\n\n if(newVersion) {\n this.updatesState.syncLoading.then(async() => {\n const strs: Record = {\n en: 'was updated to version',\n ru: 'ะพะฑะฝะพะฒะปั‘ะฝ ะดะพ ะฒะตั€ัะธะธ'\n };\n\n const getChangelog = (lang: string) => {\n fetch(`changelogs/${lang}_${newVersion.split(' ')[0]}.md`)\n .then((res) => (res.status === 200 && res.ok && res.text()) || Promise.reject())\n .then((text) => {\n const langStr = strs[lang] || strs.en;\n const pre = `**Telegram Web${App.suffix} ${langStr} ${newVersion}**\\n\\n`;\n\n text = pre + text;\n\n const entities: MessageEntity[] = [];\n const message = 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\n this.processLocalUpdate(update);\n });\n };\n\n const languages = filterUnique([langCode, 'en']);\n for(const language of languages) {\n try {\n await getChangelog(language);\n break;\n } catch(err) {\n\n }\n }\n });\n }\n });\n }\n}\n\ninterface ApiUpdatesManager extends EventListenerBase<{\n [name in Update['_']]: (update: ConstructorDeclMap[name]) => void\n}>, AppManager {}\napplyMixins(ApiUpdatesManager, [EventListenerBase, AppManager]);\n\nexport {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\nimport {UserProfilePhoto, ChatPhoto, InputFileLocation} from '../../layer';\nimport {DownloadOptions} from '../mtproto/apiFileManager';\nimport {AppManager} from './manager';\n\nexport type PeerPhotoSize = 'photo_small' | 'photo_big';\n\nexport class AppAvatarsManager extends AppManager {\n private savedAvatarURLs: {\n [peerId: PeerId]: {\n [size in PeerPhotoSize]?: string | Promise\n }\n } = {};\n\n protected after() {\n this.rootScope.addEventListener('avatar_update', ({peerId, threadId}) => {\n if(threadId) {\n return;\n }\n\n this.removeFromAvatarsCache(peerId);\n });\n }\n\n public isAvatarCached(peerId: PeerId, size?: PeerPhotoSize) {\n const saved = this.savedAvatarURLs[peerId];\n if(size === undefined) {\n return !!saved;\n }\n\n return !!(saved && saved[size] && !(saved[size] instanceof Promise));\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 saved = this.savedAvatarURLs[peerId] ??= {};\n if(!saved[size]) {\n // console.warn('will invoke downloadSmallFile:', peerId);\n const peerPhotoFileLocation: InputFileLocation.inputPeerPhotoFileLocation = {\n _: 'inputPeerPhotoFileLocation',\n pFlags: {},\n peer: this.appPeersManager.getInputPeerById(peerId),\n photo_id: photo.photo_id\n };\n\n const downloadOptions: DownloadOptions = {dcId: photo.dc_id, location: peerPhotoFileLocation};\n if(size === 'photo_big') {\n peerPhotoFileLocation.pFlags.big = true;\n downloadOptions.limitPart = 512 * 1024;\n }\n\n /* let str: string;\n const time = Date.now();\n if(peerId === 0) {\n str = `download avatar ${peerId}`;\n } */\n\n const promise = this.apiFileManager.download(downloadOptions);\n return 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 {\n return saved[size];\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 {getEnvironment} from '../../environment/utils';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport {nextRandomUint} from '../../helpers/random';\nimport {InputPhoneCall, MessagesDhConfig, PhoneCall, PhoneCallDiscardReason, PhoneCallProtocol, PhonePhoneCall} from '../../layer';\nimport {AppManager} from './manager';\n\nexport type CallId = PhoneCall['id'];\n\nexport type MyPhoneCall = Exclude;\n\nexport class AppCallsManager extends AppManager {\n private calls: Map;\n\n protected after() {\n this.calls = new Map();\n\n if(!getEnvironment().IS_CALL_SUPPORTED) {\n return;\n }\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updatePhoneCall: (update) => {\n this.saveCall(update.phone_call);\n },\n\n updatePhoneCallSignalingData: (update) => {\n this.rootScope.dispatchEvent('call_signaling', {callId: update.phone_call_id, data: update.data});\n }\n });\n }\n\n public computeKey(g_b: Uint8Array, a: Uint8Array, p: Uint8Array) {\n return this.cryptoWorker.invokeCrypto('compute-dh-key', g_b, a, p);\n }\n\n public saveCall(call: PhoneCall) {\n const isDiscarded = call._ === 'phoneCallDiscarded';\n const oldCall = this.calls.get(call.id);\n if(oldCall) {\n // if(shouldUpdate) {\n safeReplaceObject(oldCall, call);\n // }\n\n if(isDiscarded) {\n this.calls.delete(call.id);\n }\n\n call = oldCall;\n } else if(!isDiscarded) {\n this.calls.set(call.id, call as any);\n }\n\n this.rootScope.dispatchEvent('call_update', call);\n\n return call;\n }\n\n public getCall(callId: CallId) {\n return this.calls.get(callId);\n }\n\n public getCallInput(id: CallId): InputPhoneCall {\n const call = this.getCall(id);\n return {\n _: 'inputPhoneCall',\n id: call.id,\n access_hash: call.access_hash\n };\n }\n\n public savePhonePhoneCall(phonePhoneCall: PhonePhoneCall) {\n this.appUsersManager.saveApiUsers(phonePhoneCall.users);\n return this.saveCall(phonePhoneCall.phone_call);\n }\n\n public generateDh() {\n return this.apiManager.invokeApi('messages.getDhConfig', {\n version: 0,\n random_length: 256\n }).then((dhConfig) => {\n return this.cryptoWorker.invokeCrypto('generate-dh', dhConfig as MessagesDhConfig.messagesDhConfig);\n });\n }\n\n // private verifyProtocolCompatibility(protocol: PhoneCallProtocol) {\n // const my = getCallProtocol();\n // const myVersion = my.library_versions[0];\n // return !protocol.library_versions.find((version) => {\n // return compareVersion(myVersion, version) > 0;\n // });\n // }\n\n public async requestCall(userId: UserId, protocol: PhoneCallProtocol, g_a_hash: Uint8Array, video?: boolean) {\n const phonePhoneCall = await this.apiManager.invokeApi('phone.requestCall', {\n user_id: this.appUsersManager.getUserInput(userId),\n protocol: protocol,\n video: video,\n random_id: nextRandomUint(32),\n g_a_hash: g_a_hash\n });\n\n return this.savePhonePhoneCall(phonePhoneCall);\n }\n\n public async discardCall(callId: CallId, duration: number, reason: PhoneCallDiscardReason['_'], video?: boolean) {\n if(!this.getCall(callId)) {\n return;\n }\n\n const updates = await this.apiManager.invokeApi('phone.discardCall', {\n video,\n peer: this.getCallInput(callId),\n duration,\n reason: {\n _: reason\n },\n connection_id: '0'\n });\n\n this.apiUpdatesManager.processUpdateMessage(updates);\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 deepEqual from '../../helpers/object/deepEqual';\nimport isObject from '../../helpers/object/isObject';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport {ChannelParticipant, ChannelsCreateChannel, Chat, ChatAdminRights, ChatBannedRights, ChatInvite, ChatPhoto, ChatReactions, InputChannel, InputChatPhoto, InputFile, InputPeer, MessagesSponsoredMessages, SponsoredMessage, Update, Updates} from '../../layer';\nimport {isRestricted} from '../../helpers/restrictions';\nimport {AppManager} from './manager';\nimport hasRights from './utils/chats/hasRights';\nimport getParticipantPeerId from './utils/chats/getParticipantPeerId';\nimport {AppStoragesManager} from './appStoragesManager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport {randomLong} from '../../helpers/random';\nimport generateMessageId from './utils/messageId/generateMessageId';\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 extends AppManager {\n private storage: AppStoragesManager['storages']['chats'];\n\n private chats: {[id: ChatId]: Exclude};\n // private usernames: any;\n // private channelAccess: any;\n // private megagroups: {[id: number]: true};\n\n protected after() {\n this.clear(true);\n\n this.apiUpdatesManager.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 this.apiManager.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 = this.appPeersManager.getPeerId(update.peer).toChatId();\n const chat = this.chats[chatId] as Chat.chat;\n if(chat) {\n chat.default_banned_rights = update.default_banned_rights;\n this.rootScope.dispatchEvent('chat_update', chatId);\n }\n }\n });\n\n return Promise.all([\n this.appStateManager.getState(),\n this.appStoragesManager.loadStorage('chats')\n ]).then(([state, {results: chats, storage}]) => {\n this.storage = storage;\n\n this.saveApiChats(chats);\n\n this.peersStorage.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 this.peersStorage.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 for(const chatId in this.chats) {\n if(!chatId) continue;\n if(!this.peersStorage.isPeerNeeded(chatId.toPeerId(true))) {\n const chat = this.chats[chatId];\n this.appUsersManager.modifyUsernamesCache(chat, false);\n\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 || 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 = this.chats[chat.id];\n\n /* if(oldChat && !override) {\n return;\n } */\n\n (chat as Chat.chat).pFlags ??= {};\n\n if((chat as Chat.channel).pFlags.min && oldChat !== undefined) {\n return;\n }\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 as Chat.channel).photo?._ === 'chatPhotoEmpty') {\n delete (chat as Chat.channel).photo;\n }\n\n const changedUsername = this.appUsersManager.setUsernameToCache(chat, oldChat);\n\n /* if(chat.username) {\n let searchUsername = searchIndexManager.cleanUsername(chat.username);\n this.usernames[searchUsername] = chat.id;\n } */\n\n const peerId = chat.id.toPeerId(true);\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 const toggledForum = (oldChat as Chat.channel).pFlags.forum !== (chat as Chat.channel).pFlags.forum;\n const changedPhoto = oldPhotoId !== newPhotoId || toggledForum;\n\n const changedTitle = oldChat.title !== chat.title || changedUsername;\n\n const changedAnyBadge = (oldChat as Chat.channel).pFlags.verified !== (chat as Chat.channel).pFlags.verified ||\n (oldChat as Chat.channel).pFlags.scam !== (chat as Chat.channel).pFlags.scam ||\n (oldChat as Chat.channel).pFlags.fake !== (chat as Chat.channel).pFlags.fake;\n\n safeReplaceObject(oldChat, chat);\n this.rootScope.dispatchEvent('chat_update', chat.id);\n\n if(changedPhoto) {\n this.rootScope.dispatchEvent('avatar_update', {peerId});\n }\n\n if(changedTitle || changedAnyBadge) {\n this.rootScope.dispatchEvent('peer_title_edit', {peerId});\n }\n\n if(toggledForum) {\n this.rootScope.dispatchEvent('chat_toggle_forum', {chatId: chat.id, enabled: !!(chat as Chat.channel).pFlags.forum});\n }\n }\n\n if(this.peersStorage.isPeerNeeded(peerId)) {\n this.storage.set({\n [chat.id]: chat\n });\n }\n }\n\n public getChat(id: ChatId) {\n return this.chats[id];\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 return hasRights(this.getChat(id), action, rights, isThread);\n }\n\n public editChatDefaultBannedRights(id: ChatId, banned_rights: ChatBannedRights) {\n const chat = this.getChat(id) as Chat.chat;\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 this.apiManager.invokeApi('messages.editChatDefaultBannedRights', {\n peer: this.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 as Chat.channel)?.pFlags?.megagroup;\n }\n\n public isForum(id: ChatId) {\n const chat = this.chats[id];\n return !!(chat as Chat.channel)?.pFlags?.forum;\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 ||\n chat._ === 'channelForbidden' ||\n chat._ === 'chatForbidden' ||\n (chat as any as Chat.chatEmpty)._ === 'chatEmpty' ||\n (chat as Chat.chat).pFlags.left ||\n // || (chat as any).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 || !(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) as Chat.channel).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 as Chat.channel).pFlags.min);\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 as Chat.channel).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 = 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 this.apiManager.invokeApi('channels.createChannel', options).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n const channelId = (updates as any).chats[0].id;\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) => this.appUsersManager.getUserInput(u));\n\n return this.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 this.apiManager.invokeApi('messages.createChat', {\n users: userIds.map((u) => this.appUsersManager.getUserInput(u)),\n title\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n const chatId = (updates as any as Updates.updates).chats[0].id;\n return chatId;\n });\n }\n\n private onChatUpdated = (chatId: ChatId, updates?: Updates) => {\n // console.log('onChatUpdated', chatId, updates);\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n if((updates as Updates.updates)?.updates?.length && this.isChannel(chatId)) {\n this.rootScope.dispatchEvent('invalidate_participants', chatId);\n }\n };\n\n public leaveChannel(id: ChatId) {\n return this.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 this.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 this.apiManager.invokeApi('messages.addChatUser', {\n chat_id: id,\n user_id: this.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 this.apiManager.invokeApi('messages.deleteChatUser', {\n chat_id: id,\n user_id: this.appUsersManager.getUserInput(userId)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public leaveChat(id: ChatId) {\n return this.deleteChatUser(id, this.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 this.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 this.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 this.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, doNotRefresh?: boolean) {\n const promise = this.apiManager.invokeApi('channels.updateUsername', {\n channel: this.getChannelInput(id),\n username\n });\n\n return this.refreshChatAfterRequest(id, promise, doNotRefresh);\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 = this.apiManager.invokeApi('channels.editPhoto', {\n channel: this.getChannelInput(id),\n photo: inputChatPhoto\n });\n } else {\n promise = this.apiManager.invokeApi('messages.editChatPhoto', {\n chat_id: id,\n photo: inputChatPhoto\n });\n }\n\n return promise.then(this.onChatUpdated.bind(this, id));\n }\n\n public editTitle(id: ChatId, title: string) {\n let promise: any;\n\n if(this.isChannel(id)) {\n promise = this.apiManager.invokeApi('channels.editTitle', {\n channel: this.getChannelInput(id),\n title\n });\n } else {\n promise = this.apiManager.invokeApi('messages.editChatTitle', {\n chat_id: id,\n title\n });\n }\n\n return promise.then(this.onChatUpdated.bind(this, id));\n }\n\n public editAbout(id: ChatId, about: string) {\n const peerId = id.toPeerId(true);\n return this.apiManager.invokeApi('messages.editChatAbout', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n about\n }).then((bool) => {\n if(bool) {\n this.rootScope.dispatchEvent('peer_bio_edit', peerId);\n }\n\n return bool;\n });\n }\n\n public editBanned(id: ChatId, participant: PeerId | ChannelParticipant, banned_rights: ChatBannedRights) {\n const peerId = typeof(participant) !== 'object' ? participant : getParticipantPeerId(participant);\n return this.apiManager.invokeApi('channels.editBanned', {\n channel: this.getChannelInput(id),\n participant: this.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 this.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: this.appUsersManager.getSelf().id,\n peer: this.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 this.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 this.apiManager.invokeApi('channels.togglePreHistoryHidden', {\n channel: this.getChannelInput(channelId),\n enabled\n }).then(this.onChatUpdated.bind(this, channelId));\n });\n }\n\n public toggleSignatures(id: ChatId, enabled: boolean) {\n return this.apiManager.invokeApi('channels.toggleSignatures', {\n channel: this.getChannelInput(id),\n enabled\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public toggleNoForwards(id: ChatId, enabled: boolean) {\n return this.apiManager.invokeApi('messages.toggleNoForwards', {\n peer: this.getInputPeer(id),\n enabled\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public setChatAvailableReactions(id: ChatId, reactions: ChatReactions) {\n const chatFull = this.appProfileManager.getCachedFullChat(id);\n if(chatFull) {\n chatFull.available_reactions = reactions;\n this.rootScope.dispatchEvent('chat_full_update', id);\n }\n\n return this.apiManager.invokeApi('messages.setChatAvailableReactions', {\n peer: this.getInputPeer(id),\n available_reactions: reactions\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public getSendAs(channelId: ChatId) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'channels.getSendAs',\n params: {\n peer: this.getChannelInputPeer(channelId)\n },\n processResult: (sendAsPeers) => {\n this.appUsersManager.saveApiUsers(sendAsPeers.users);\n this.saveApiChats(sendAsPeers.chats);\n\n return sendAsPeers.peers;\n }\n });\n }\n\n public importChatInvite(hash: string) {\n return this.apiManager.invokeApi('messages.importChatInvite', {hash})\n .then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n const chat = (updates as Updates.updates).chats[0];\n return chat.id;\n });\n }\n\n public checkUsername(chatId: ChatId, username: string) {\n return this.apiManager.invokeApi('channels.checkUsername', {\n channel: this.getChannelInput(chatId),\n username\n });\n }\n\n public getSponsoredMessage(chatId: ChatId) {\n // const s: MessagesSponsoredMessages.messagesSponsoredMessages = {\n // '_': 'messages.sponsoredMessages',\n // 'messages': [\n // {\n // '_': 'sponsoredMessage',\n // 'pFlags': {},\n // 'flags': 9,\n // 'random_id': new Uint8Array([\n // 80,\n // 5,\n // 249,\n // 174,\n // 44,\n // 73,\n // 173,\n // 14,\n // 246,\n // 81,\n // 187,\n // 182,\n // 223,\n // 5,\n // 4,\n // 128\n // ]),\n // 'from_id': {\n // '_': 'peerUser',\n // 'user_id': 983000232\n // },\n // 'start_param': 'GreatMinds',\n // 'message': 'This is a long sponsored message. In fact, it has the maximum length allowed on the platform โ€“ย 160 characters ๐Ÿ˜ฌ๐Ÿ˜ฌ. It\\'s promoting a bot with a start parameter.' + chatId\n // }\n // ],\n // 'chats': [],\n // 'users': [\n // {\n // '_': 'user',\n // 'pFlags': {\n // 'bot': true,\n // 'verified': true,\n // 'apply_min_photo': true\n // },\n // 'flags': 34226219,\n // 'id': 983000232,\n // 'access_hash': '-294959558742535650',\n // 'first_name': 'Quiz Bot',\n // 'username': 'QuizBot',\n // 'photo': {\n // '_': 'userProfilePhoto',\n // 'pFlags': {},\n // 'flags': 2,\n // 'photo_id': '4221953848856651689',\n // 'stripped_thumb': new Uint8Array([\n // 1,\n // 8,\n // 8,\n // 155,\n // 247,\n // 95,\n // 103,\n // 255,\n // 0,\n // 110,\n // 138,\n // 40,\n // 174,\n // 132,\n // 142,\n // 6,\n // 238,\n // 127\n // ]),\n // 'dc_id': 2\n // },\n // 'bot_info_version': 11,\n // 'bot_inline_placeholder': 'Search a quiz...',\n // 'sortName': 'quiz bot'\n // }\n // ]\n // };\n\n // const promise = Promise.resolve(s);\n const promise = this.apiManager.invokeApiCacheable('channels.getSponsoredMessages', {\n channel: this.getChannelInput(chatId)\n }, {cacheSeconds: 300});\n\n return promise.then((sponsoredMessages) => {\n if(sponsoredMessages._ === 'messages.sponsoredMessages') {\n this.appUsersManager.saveApiUsers(sponsoredMessages.users);\n this.appChatsManager.saveApiChats(sponsoredMessages.chats);\n\n const sponsoredMessage = sponsoredMessages.messages.shift();\n sponsoredMessages.messages.push(sponsoredMessage);\n }\n\n return sponsoredMessages;\n });\n }\n\n public viewSponsoredMessage(chatId: ChatId, randomId: SponsoredMessage['random_id']) {\n return this.apiManager.invokeApiSingle('channels.viewSponsoredMessage', {\n channel: this.getChannelInput(chatId),\n random_id: randomId\n });\n }\n\n public checkChatInvite(hash: string) {\n return this.apiManager.invokeApi('messages.checkChatInvite', {\n hash: hash\n }).then((chatInvite) => {\n if((chatInvite as ChatInvite.chatInvitePeek).chat) {\n this.saveApiChat((chatInvite as ChatInvite.chatInvitePeek).chat, true);\n }\n\n return chatInvite;\n });\n }\n\n public toggleUsername(chatId: ChatId, username: string, active: boolean) {\n const promise = this.apiManager.invokeApi('channels.toggleUsername', {\n channel: this.getChannelInput(chatId),\n username,\n active\n });\n\n return this.refreshChatAfterRequest(chatId, promise);\n }\n\n public reorderUsernames(chatId: ChatId, order: string[]) {\n const promise = this.apiManager.invokeApi('channels.reorderUsernames', {\n channel: this.getChannelInput(chatId),\n order\n });\n\n return this.refreshChatAfterRequest(chatId, promise);\n }\n\n public deactivateAllUsernames(chatId: ChatId, doNotRefresh?: boolean) {\n const promise = this.apiManager.invokeApi('channels.deactivateAllUsernames', {\n channel: this.getChannelInput(chatId)\n });\n\n return this.refreshChatAfterRequest(chatId, promise, doNotRefresh);\n }\n\n public makeChannelPrivate(chatId: ChatId) {\n const promises: Promise[] = [\n this.updateUsername(chatId, '', true),\n this.deactivateAllUsernames(chatId, true)\n ];\n\n const promise = Promise.all(promises).then(() => true);\n return this.refreshChatAfterRequest(chatId, promise);\n }\n\n public refreshChatAfterRequest>(chatId: ChatId, promise: T, doNotRefresh?: boolean): T {\n if(doNotRefresh) {\n return promise;\n }\n\n return promise.then((value) => {\n return this.getChannels([chatId]).then(() => value);\n }) as T;\n }\n\n public getChannels(chatIds: ChatId[]) {\n return this.apiManager.invokeApi('channels.getChannels', {\n id: chatIds.map((chatId) => this.getChannelInput(chatId))\n }).then((messagesChats) => {\n this.saveApiChats(messagesChats.chats);\n });\n }\n\n public toggleForum(chatId: ChatId, enabled: boolean) {\n return this.migrateChat(chatId).then((channelId) => {\n return this.apiManager.invokeApi('channels.toggleForum', {\n channel: this.getChannelInput(channelId),\n enabled\n }).then(this.onChatUpdated.bind(this, channelId));\n });\n }\n\n public editForumTopic(options: {\n chatId: ChatId,\n topicId: number,\n title?: string,\n iconEmojiId?: DocId,\n closed?: boolean,\n hidden?: boolean\n }) {\n const {chatId, topicId, title, iconEmojiId, closed, hidden} = options;\n return this.apiManager.invokeApi('channels.editForumTopic', {\n channel: this.getChannelInput(chatId),\n topic_id: getServerMessageId(topicId),\n title,\n icon_emoji_id: iconEmojiId,\n closed,\n hidden\n }).then(this.onChatUpdated.bind(this, chatId));\n }\n\n public async createForumTopic(options: {\n chatId: ChatId,\n title: string,\n iconColor: number,\n iconEmojiId: DocId\n }) {\n const {chatId, title, iconColor, iconEmojiId} = options;\n\n const channelFull = await this.appProfileManager.getChannelFull(chatId);\n const sendAsInputPeer = channelFull.default_send_as && this.appPeersManager.getInputPeerById(this.appPeersManager.getPeerId(channelFull.default_send_as));\n\n return this.apiManager.invokeApi('channels.createForumTopic', {\n channel: this.getChannelInput(chatId),\n title,\n icon_color: iconColor,\n icon_emoji_id: iconEmojiId,\n random_id: randomLong(),\n send_as: sendAsInputPeer\n }).then((updates) => {\n this.onChatUpdated(chatId, updates);\n\n const update = (updates as Updates.updates).updates.find((update) => update._ === 'updateNewChannelMessage') as Update.updateNewChannelMessage;\n return generateMessageId(update.message.id);\n });\n }\n\n public updatePinnedForumTopic(chatId: ChatId, topicId: number, pinned: boolean) {\n return this.apiManager.invokeApi('channels.updatePinnedForumTopic', {\n channel: this.getChannelInput(chatId),\n topic_id: getServerMessageId(topicId),\n pinned\n }).then(this.onChatUpdated.bind(this, chatId));\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 lang from '../lang';\nimport type langSign from '../langSign';\nimport type {State} from '../config/state';\nimport DEBUG, {MOUNT_CLASS_TO} from '../config/debug';\nimport {HelpCountriesList, HelpCountry, LangPackDifference, LangPackString} from '../layer';\nimport stateStorage from './stateStorage';\nimport App from '../config/app';\nimport rootScope from './rootScope';\nimport {IS_MOBILE} from '../environment/userAgent';\nimport deepEqual from '../helpers/object/deepEqual';\nimport safeAssign from '../helpers/object/safeAssign';\nimport capitalizeFirstLetter from '../helpers/string/capitalizeFirstLetter';\nimport matchUrlProtocol from './richTextProcessor/matchUrlProtocol';\nimport wrapUrl from './richTextProcessor/wrapUrl';\nimport {setDirection} from '../helpers/dom/setInnerHTML';\n\nexport const langPack: {[actionType: string]: LangPackKey} = {\n 'messageActionChatCreate': 'ActionCreateGroup',\n 'messageActionChatCreateYou': 'ActionYouCreateGroup',\n 'messageActionChatEditTitle': 'ActionChangedTitle',\n 'messageActionChatEditPhoto': 'ActionChangedPhoto',\n 'messageActionChatEditVideo': 'ActionChangedVideo',\n 'messageActionChatDeletePhoto': 'ActionRemovedPhoto',\n 'messageActionChatReturn': 'ActionAddUserSelf',\n 'messageActionChatReturnYou': 'ActionAddUserSelfYou',\n 'messageActionChatJoined': 'ActionAddUserSelfMega',\n 'messageActionChatJoinedYou': 'ChannelMegaJoined',\n 'messageActionChatAddUser': 'ActionAddUser',\n 'messageActionChatAddUsers': 'ActionAddUser',\n 'messageActionChatLeave': 'ActionLeftUser',\n 'messageActionChatLeaveYou': 'YouLeft',\n 'messageActionChatDeleteUser': 'ActionKickUser',\n 'messageActionChatJoinedByLink': 'ActionInviteUser',\n 'messageActionPinMessage': 'Chat.Service.Group.UpdatedPinnedMessage',\n 'messageActionContactSignUp': 'Chat.Service.PeerJoinedTelegram',\n 'messageActionChannelCreate': 'ActionCreateChannel',\n 'messageActionChannelEditTitle': 'Chat.Service.Channel.UpdatedTitle',\n 'messageActionChannelEditPhoto': 'Chat.Service.Channel.UpdatedPhoto',\n 'messageActionChannelEditVideo': 'Chat.Service.Channel.UpdatedVideo',\n 'messageActionChannelDeletePhoto': 'Chat.Service.Channel.RemovedPhoto',\n 'messageActionHistoryClear': 'HistoryCleared',\n 'messageActionDiscussionStarted': 'DiscussionStarted',\n\n 'messageActionChannelMigrateFrom': 'ActionMigrateFromGroup',\n\n 'messageActionPhoneCall.video_in_ok': 'ChatList.Service.VideoCall.incoming',\n 'messageActionPhoneCall.video_out_ok': 'ChatList.Service.VideoCall.outgoing',\n 'messageActionPhoneCall.video_missed': 'ChatList.Service.VideoCall.Missed',\n 'messageActionPhoneCall.video_cancelled': 'ChatList.Service.VideoCall.Cancelled',\n 'messageActionPhoneCall.in_ok': 'ChatList.Service.Call.incoming',\n 'messageActionPhoneCall.out_ok': 'ChatList.Service.Call.outgoing',\n 'messageActionPhoneCall.missed': 'ChatList.Service.Call.Missed',\n 'messageActionPhoneCall.cancelled': 'ChatList.Service.Call.Cancelled',\n\n 'messageActionGroupCall.started': 'Chat.Service.VoiceChatStarted.Channel',\n 'messageActionGroupCall.started_by': 'Chat.Service.VoiceChatStarted',\n 'messageActionGroupCall.started_byYou': 'Chat.Service.VoiceChatStartedYou',\n 'messageActionGroupCall.ended': 'Chat.Service.VoiceChatFinished.Channel',\n 'messageActionGroupCall.ended_by': 'Chat.Service.VoiceChatFinished',\n 'messageActionGroupCall.ended_byYou': 'Chat.Service.VoiceChatFinishedYou',\n\n '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 export const strings: Map = new Map();\n export const countriesList: HelpCountry[] = [];\n let pluralRules: Intl.PluralRules;\n\n let cacheLangPackPromise: Promise;\n export let lastRequestedLangCode: string;\n export let lastRequestedNormalizedLangCode: string;\n export let lastAppliedLangCode: string;\n export let requestedServerLanguage = false;\n export let timeFormat: State['settings']['timeFormat'];\n export let isRTL = false;\n\n export function setRTL(rtl: boolean) {\n isRTL = rtl;\n }\n\n function setLangCode(langCode: string) {\n lastRequestedLangCode = langCode;\n lastRequestedNormalizedLangCode = langCode.split('-')[0];\n }\n\n export function getCacheLangPack(): Promise {\n if(cacheLangPackPromise) return cacheLangPackPromise;\n return cacheLangPackPromise = Promise.all([\n stateStorage.get('langPack') as Promise,\n polyfillPromise\n ]).then(([langPack]) => {\n if(!langPack/* || true */) {\n return loadLocalLangPack();\n } else if(DEBUG && false) {\n return getLangPack(langPack.lang_code);\n }/* else if(langPack.appVersion !== App.langPackVersion) {\n return getLangPack(langPack.lang_code);\n } */\n\n if(!lastRequestedLangCode) {\n setLangCode(langPack.lang_code);\n }\n\n applyLangPack(langPack);\n return langPack;\n }).finally(() => {\n cacheLangPackPromise = undefined;\n });\n }\n\n function updateAmPm() {\n if(timeFormat === 'h12') {\n try {\n const dateTimeFormat = getDateTimeFormat({hour: 'numeric', minute: 'numeric', hour12: true});\n const date = new Date();\n date.setHours(0);\n const amText = dateTimeFormat.format(date);\n amPmCache.am = amText.split(/\\s/)[1];\n date.setHours(12);\n const pmText = dateTimeFormat.format(date);\n amPmCache.pm = pmText.split(/\\s/)[1];\n } catch(err) {\n console.error('cannot get am/pm', err);\n amPmCache = {am: 'AM', pm: 'PM'};\n }\n }\n }\n\n export function setTimeFormat(\n format: State['settings']['timeFormat'],\n haveToUpdate = !!timeFormat && timeFormat !== format\n ) {\n timeFormat = format;\n\n updateAmPm();\n\n if(haveToUpdate) {\n cachedDateTimeFormats.clear();\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 export function loadLocalLangPack() {\n const defaultCode = App.langPackCode;\n setLangCode(defaultCode);\n return Promise.all([\n import('../lang'),\n import('../langSign'),\n import('../countries')\n ]).then(([lang, langSign, countries]) => {\n const strings: LangPackString[] = [];\n formatLocalStrings(lang.default, strings);\n formatLocalStrings(langSign.default, strings);\n\n const langPack: LangPackDifference = {\n _: 'langPackDifference',\n from_version: 0,\n lang_code: defaultCode,\n strings,\n version: 0,\n local: true,\n countries: countries.default\n };\n return saveLangPack(langPack);\n });\n }\n\n export function loadLangPack(langCode: string, web?: boolean) {\n web = true;\n requestedServerLanguage = true;\n const managers = rootScope.managers;\n return Promise.all([\n managers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n lang_code: langCode,\n lang_pack: web ? 'web' : App.langPack\n }),\n !web && managers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n lang_code: langCode,\n lang_pack: 'android'\n }),\n import('../lang'),\n import('../langSign'),\n managers.apiManager.invokeApiCacheable('help.getCountriesList', {\n lang_code: langCode,\n hash: 0\n }) as Promise,\n polyfillPromise\n ]);\n }\n\n export function getStrings(langCode: string, strings: string[]) {\n return rootScope.managers.apiManager.invokeApi('langpack.getStrings', {\n lang_pack: App.langPack,\n lang_code: langCode,\n keys: strings\n });\n }\n\n export function formatLocalStrings(strings: any, pushTo: LangPackString[] = []) {\n for(const i in strings) {\n // @ts-ignore\n const v = strings[i];\n if(typeof(v) === 'string') {\n pushTo.push({\n _: 'langPackString',\n key: i,\n value: v\n });\n } else {\n pushTo.push({\n _: 'langPackStringPluralized',\n key: i,\n ...v\n });\n }\n }\n\n return pushTo;\n }\n\n export function getLangPack(langCode: string, web?: boolean) {\n setLangCode(langCode);\n return loadLangPack(langCode, web).then(([langPack1, langPack2, localLangPack1, localLangPack2, countries, _]) => {\n let strings: LangPackString[] = [];\n\n [localLangPack1, localLangPack2].forEach((l) => {\n formatLocalStrings(l.default as any, strings);\n });\n\n strings = strings.concat(...[langPack1.strings, langPack2.strings].filter(Boolean));\n\n langPack1.strings = strings;\n langPack1.countries = countries;\n return saveLangPack(langPack1);\n });\n }\n\n export function saveLangPack(langPack: LangPackDifference) {\n langPack.appVersion = App.langPackVersion;\n\n return stateStorage.set({langPack}).then(() => {\n applyLangPack(langPack);\n return langPack;\n });\n }\n\n export const polyfillPromise = (function checkIfPolyfillNeeded() {\n if(typeof(Intl) !== 'undefined' && typeof(Intl.PluralRules) !== 'undefined'/* && false */) {\n return Promise.resolve();\n } else {\n return import('./pluralPolyfill').then((_Intl) => {\n (window as any).Intl = Object.assign(typeof(Intl) !== 'undefined' ? Intl : {}, _Intl.default);\n });\n }\n })();\n\n export function applyLangPack(langPack: LangPackDifference) {\n const currentLangCode = lastRequestedLangCode;\n if(langPack.lang_code !== currentLangCode) {\n return;\n }\n\n try {\n pluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode);\n } catch(err) {\n console.error('pluralRules error', err);\n pluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode.split('-', 1)[0]);\n }\n\n try {\n pluralRules = new Intl.PluralRules(langPack.lang_code);\n } catch(err) {\n console.error('pluralRules error', err);\n pluralRules = new Intl.PluralRules(langPack.lang_code.split('-', 1)[0]);\n }\n\n strings.clear();\n\n for(const string of langPack.strings) {\n strings.set(string.key as LangPackKey, string);\n }\n\n if(langPack.countries) {\n countriesList.length = 0;\n countriesList.push(...langPack.countries.countries);\n\n langPack.countries.countries.forEach((country) => {\n if(country.name) {\n const langPackKey: any = country.default_name;\n strings.set(langPackKey, {\n _: 'langPackString',\n key: langPackKey,\n value: country.name\n });\n }\n });\n }\n\n if(lastAppliedLangCode !== currentLangCode) {\n rootScope.dispatchEvent('language_change', currentLangCode);\n lastAppliedLangCode = currentLangCode;\n cachedDateTimeFormats.clear();\n updateAmPm();\n }\n\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n elements.forEach((element) => {\n const instance = weakMap.get(element);\n\n if(instance) {\n instance.update();\n }\n });\n }\n\n function pushNextArgument(out: ReturnType, args: FormatterArguments, indexHolder: {i: number}) {\n const arg = args[indexHolder.i++];\n if(Array.isArray(arg)) {\n out.push(...arg as any);\n } else {\n out.push(arg);\n }\n }\n\n export function superFormatter(input: string, args?: FormatterArguments, indexHolder = {i: 0}): Exclude[] {\n const out: ReturnType = [];\n const regExp = /(\\*\\*|__)(.+?)\\1|(\\n)|(\\[.+?\\]\\(.*?\\))|un\\d|%\\d\\$.|%./g;\n\n let lastIndex = 0;\n input.replace(regExp, (match, p1: any, p2: any, p3: any, p4: string, offset: number, string: string) => {\n // console.table({match, p1, p2, offset, string});\n\n out.push(string.slice(lastIndex, offset));\n\n if(p1) {\n // offset += p1.length;\n let element: HTMLElement;\n switch(p1) {\n case '**': {\n element = document.createElement('b');\n break;\n }\n\n case '__': {\n element = document.createElement('i');\n break;\n }\n }\n\n element.append(...superFormatter(p2, args, indexHolder) as any);\n out.push(element);\n } else if(p3) {\n out.push(document.createElement('br'));\n } else if(p4) {\n const idx = p4.lastIndexOf(']');\n const text = p4.slice(1, idx);\n\n const url = p4.slice(idx + 2, p4.length - 1);\n let a: HTMLAnchorElement;\n if(url && matchUrlProtocol(url)) {\n a = document.createElement('a');\n const wrappedUrl = wrapUrl(url);\n a.href = wrappedUrl.url;\n if(wrappedUrl.onclick) a.setAttribute('onclick', wrappedUrl.onclick);\n a.target = '_blank';\n } else {\n a = args[indexHolder.i++] as HTMLAnchorElement;\n\n if(a instanceof DocumentFragment) { // right after wrapRichText\n a = a.firstChild as any;\n }\n\n a.textContent = ''; // reset content\n }\n\n a.append(...superFormatter(text, args, indexHolder) as any);\n\n out.push(a);\n } else if(args) {\n pushNextArgument(out, args, indexHolder);\n }\n\n lastIndex = offset + match.length;\n return '';\n });\n\n if(lastIndex !== input.length) {\n out.push(input.slice(lastIndex));\n }\n\n return out;\n }\n\n export function format(key: LangPackKey, plain: true, args?: FormatterArguments): string;\n export function format(key: LangPackKey, plain?: false, args?: FormatterArguments): ReturnType;\n export function format(key: LangPackKey, plain = false, args?: FormatterArguments): ReturnType | string {\n const str = strings.get(key);\n let input: string;\n if(str) {\n if(str._ === 'langPackStringPluralized' && args?.length) {\n let v = args[0] as number | string;\n if(typeof(v) === 'string') v = +v.replace(/\\D/g, '');\n const s = pluralRules.select(v);\n // @ts-ignore\n input = str[s + '_value'] || str['other_value'];\n } else if(str._ === 'langPackString') {\n input = str.value;\n } else {\n // input = '[' + key + ']';\n input = key;\n }\n } else {\n // input = '[' + key + ']';\n input = key;\n }\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\n /* if(plain) {\n if(args?.length) {\n const regExp = /un\\d|%\\d\\$.|%./g;\n let i = 0;\n input = input.replace(regExp, (match, offset, string) => {\n return '' + args[i++];\n });\n }\n\n return input;\n } else {\n return superFormatter(input, args);\n } */\n }\n\n export const weakMap: WeakMap> = new WeakMap();\n\n export type IntlElementBaseOptions = {\n element?: HTMLElement,\n property?: 'innerText' | 'innerHTML' | 'placeholder' | 'textContent',\n };\n\n abstract class IntlElementBase {\n public element: IntlElementBaseOptions['element'];\n public property: IntlElementBaseOptions['property'];\n\n constructor(options?: Options) {\n this.element = options?.element || document.createElement('span');\n this.element.classList.add('i18n');\n\n this.property = options?.property;\n if(options && ((options as any as IntlElementOptions).key || (options as any as IntlDateElementOptions).date)) {\n this.update(options);\n }\n\n weakMap.set(this.element, this);\n }\n\n abstract update(options?: Options): void;\n }\n\n export type IntlElementOptions = IntlElementBaseOptions & {\n key?: LangPackKey,\n args?: FormatterArguments\n };\n export class IntlElement extends IntlElementBase {\n public key: IntlElementOptions['key'];\n public args: IntlElementOptions['args'];\n\n constructor(options: IntlElementOptions = {}) {\n super({...options, property: options.property ?? 'innerHTML'});\n }\n\n public update(options?: IntlElementOptions) {\n safeAssign(this, options);\n\n if(this.property === 'innerHTML') {\n this.element.textContent = '';\n this.element.append(...format(this.key, false, this.args) as any);\n } else {\n // @ts-ignore\n const v = this.element[this.property];\n const formatted = format(this.key, true, this.args);\n\n // * hasOwnProperty won't work here\n if(v === undefined) this.element.dataset[this.property] = formatted;\n else (this.element as HTMLInputElement)[this.property] = formatted;\n }\n }\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 }\n\n const cachedDateTimeFormats: Map = new Map();\n function getDateTimeFormat(options: Intl.DateTimeFormatOptions = {}) {\n const json = JSON.stringify(options);\n let dateTimeFormat = cachedDateTimeFormats.get(json);\n if(!dateTimeFormat) {\n dateTimeFormat = new Intl.DateTimeFormat(lastRequestedNormalizedLangCode + '-u-hc-' + timeFormat, options);\n cachedDateTimeFormats.set(json, dateTimeFormat);\n }\n\n return dateTimeFormat;\n }\n\n export let amPmCache = {am: 'AM', pm: 'PM'};\n export type IntlDateElementOptions = IntlElementBaseOptions & {\n date?: Date,\n options: Intl.DateTimeFormatOptions\n };\n export class IntlDateElement extends IntlElementBase {\n public date: IntlDateElementOptions['date'];\n public options: IntlDateElementOptions['options'];\n\n constructor(options: IntlDateElementOptions) {\n super({...options, property: options.property ?? 'textContent'});\n setDirection(this.element);\n }\n\n public update(options?: IntlDateElementOptions) {\n safeAssign(this, options);\n\n let text: string;\n if(this.options.hour && this.options.minute && Object.keys(this.options).length === 2/* && false */) {\n const hours = this.date.getHours();\n text = ('0' + (timeFormat === 'h12' ? (hours % 12) || 12 : hours)).slice(-2) + ':' + ('0' + this.date.getMinutes()).slice(-2);\n // if(this.options.second) {\n // text += ':' + ('0' + this.date.getSeconds()).slice(-2);\n // }\n\n if(timeFormat === 'h12') {\n text += ' ' + (hours < 12 ? amPmCache.am : amPmCache.pm);\n }\n } else {\n // * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/hourCycle#adding_an_hour_cycle_via_the_locale_string\n const dateTimeFormat = getDateTimeFormat(this.options);\n text = capitalizeFirstLetter(dateTimeFormat.format(this.date));\n }\n\n (this.element as any)[this.property] = text;\n }\n }\n\n export function i18n(key: LangPackKey, args?: FormatterArguments) {\n return new IntlElement({key, args}).element;\n }\n\n export function i18n_(options: IntlElementOptions) {\n return new IntlElement(options).element;\n }\n\n export function _i18n(element: HTMLElement, key: LangPackKey, args?: FormatterArguments, property?: IntlElementOptions['property']) {\n return new IntlElement({element, key, args, property}).element;\n }\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 const 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 return 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 const joined = joinElementsWith(elements, (isLast) => {\n const langPackKey: LangPackKey = isLast && useLast ? 'AutoDownloadSettings.LastDelimeter' : 'AutoDownloadSettings.Delimeter';\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","/*\n * 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 addAnchorListener from '../../helpers/addAnchorListener';\nimport {PHONE_NUMBER_REG_EXP} from '.';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport matchUrlProtocol from './matchUrlProtocol';\nimport {T_ME_PREFIXES} from '../mtproto/mtproto_config';\n\nexport default function wrapUrl(url: string, unsafe?: number | boolean) {\n if(!matchUrlProtocol(url)) {\n url = 'https://' + url;\n }\n\n const out: {url: string, onclick?: Parameters[0]['name']} = {url};\n let tgMeMatch, telescoPeMatch, tgMatch;\n let onclick: typeof out['onclick'];\n /* if(unsafe === 2) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } else */if((tgMeMatch = url.match(/^(?:https?:\\/\\/)?(?:(.+?)\\.)?(?:(?:web|k|z)\\.)?t(?:elegram)?\\.me(?:\\/(.+))?/))) {\n const u = new URL(url);\n let prefix = tgMeMatch[1];\n if(prefix && T_ME_PREFIXES.has(tgMeMatch[1])) {\n prefix = undefined;\n }\n\n if(prefix) {\n u.pathname = prefix + (u.pathname === '/' ? '' : u.pathname);\n }\n\n const fullPath = u.pathname.slice(1);\n const path = fullPath.split('/');\n\n if(path[0] && path[0][0] === '$' && path[0].length > 1) {\n onclick = 'invoice';\n } else if(/^\\W/.test(fullPath) && !PHONE_NUMBER_REG_EXP.test(fullPath)) { // second regexp is for phone numbers (t.me/+38050...)\n onclick = 'joinchat';\n } else switch(path[0]) {\n case 'joinchat':\n case 'addstickers':\n case 'addemoji':\n case 'voicechat':\n case 'invoice':\n if(path.length !== 1 && !prefix) {\n onclick = path[0];\n break;\n }\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] as any;\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 out.onclick = onclick;\n return out;\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.wrapUrl = wrapUrl);\n","/*\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 I18n from '../../lib/langPack';\n\nexport default function setInnerHTML(elem: Element, html: string | DocumentFragment | Element) {\n setDirection(elem);\n if(typeof(html) === 'string') {\n if(!html) elem.replaceChildren();\n else elem.innerHTML = html;\n } else {\n elem.replaceChildren(html);\n }\n}\n\nexport function setDirection(elem: Element) {\n // if(!I18n.isRTL) {\n elem.setAttribute('dir', 'auto');\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 {MOUNT_CLASS_TO} from '../config/debug';\nimport I18n, {i18n} from '../lib/langPack';\n\nexport const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\nexport const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n\nexport const ONE_DAY = 86400;\n\n// https://stackoverflow.com/a/6117889\nexport const getWeekNumber = (date: Date) => {\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\n const dayNum = d.getUTCDay() || 7;\n d.setUTCDate(d.getUTCDate() + 4 - dayNum);\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\n return Math.ceil((((d.getTime() - yearStart.getTime()) / ONE_DAY) + 1) / 7);\n};\n\nexport function formatDateAccordingToTodayNew(time: Date) {\n const today = new Date();\n const now = today.getTime() / 1000 | 0;\n const timestamp = time.getTime() / 1000 | 0;\n\n const options: Intl.DateTimeFormatOptions = {};\n if((now - timestamp) < ONE_DAY && today.getDate() === time.getDate()) { // if the same day\n options.hour = options.minute = '2-digit';\n } else if(today.getFullYear() !== time.getFullYear()) { // different year\n options.year = options.day = 'numeric';\n options.month = '2-digit';\n } else if((now - timestamp) < (ONE_DAY * 7) && getWeekNumber(today) === getWeekNumber(time)) { // current week\n options.weekday = 'short';\n } else { // same year\n options.month = 'short';\n options.day = 'numeric';\n }\n\n return new I18n.IntlDateElement({\n date: time,\n options\n }).element;\n}\n\nexport function formatFullSentTimeRaw(timestamp: number, options: {\n capitalize?: boolean\n} = {}) {\n const date = new Date();\n const time = new Date(timestamp * 1000);\n const now = date.getTime() / 1000;\n\n const timeEl = formatTime(time);\n\n let dateEl: Node | string;\n if((now - timestamp) < ONE_DAY && date.getDate() === time.getDate()) { // if the same day\n dateEl = i18n(options.capitalize ? 'Date.Today' : 'Peer.Status.Today');\n } else if((now - timestamp) < (ONE_DAY * 2) && (date.getDate() - 1) === time.getDate()) { // yesterday\n dateEl = i18n(options.capitalize ? 'Yesterday' : 'Peer.Status.Yesterday');\n\n if(options.capitalize) {\n (dateEl as HTMLElement).style.textTransform = 'capitalize';\n }\n } else if(date.getFullYear() !== time.getFullYear()) { // different year\n dateEl = new I18n.IntlDateElement({\n date: time,\n options: {\n month: 'short',\n day: 'numeric',\n year: 'numeric'\n }\n }).element;\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate() + ', ' + time.getFullYear();\n } else {\n dateEl = new I18n.IntlDateElement({\n date: time,\n options: {\n month: 'short',\n day: 'numeric'\n }\n }).element;\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate();\n }\n\n return {dateEl, timeEl};\n}\n\nexport function formatFullSentTime(timestamp: number) {\n const {dateEl, timeEl} = formatFullSentTimeRaw(timestamp, {\n capitalize: true\n });\n\n const fragment = document.createDocumentFragment();\n fragment.append(dateEl, ' ', i18n('ScheduleController.at'), ' ', timeEl);\n return fragment;\n}\n\nexport function formatTime(date: Date) {\n return new I18n.IntlDateElement({\n date,\n options: {\n hour: '2-digit',\n minute: '2-digit'\n }\n }).element;\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.formatDateAccordingToTodayNew = formatDateAccordingToTodayNew);\n\nexport const getFullDate = (date: Date, options: Partial<{\n noTime: true,\n noSeconds: true,\n monthAsNumber: true,\n leadingZero: true\n}> = {}) => {\n const joiner = options.monthAsNumber ? '.' : ' ';\n const time = ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2) + (options.noSeconds ? '' : ':' + ('0' + date.getSeconds()).slice(-2));\n\n return (options.leadingZero ? ('0' + date.getDate()).slice(-2) : date.getDate()) +\n joiner + (options.monthAsNumber ? ('0' + (date.getMonth() + 1)).slice(-2) : months[date.getMonth()]) +\n joiner + date.getFullYear() +\n (options.noTime ? '' : ', ' + time);\n};\n\n// https://github.com/DrKLO/Telegram/blob/d52b2c921abd3c1e8d6368858313ad0cb0468c07/TMessagesProj/src/main/java/org/telegram/ui/Adapters/FiltersView.java\nconst minYear = 2013;\nconst yearPattern = new RegExp('20[0-9]{1,2}');\nconst monthYearOrDayPattern = new RegExp('(\\\\w{3,}) ([0-9]{0,4})', 'i');\nconst yearOrDayAndMonthPattern = new RegExp('([0-9]{0,4}) (\\\\w{2,})', 'i');\nconst shortDate = new RegExp('^([0-9]{1,4})(\\\\.| |/|\\\\-)([0-9]{1,4})$', 'i');\nconst longDate = new RegExp('^([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,4})$', 'i');\nconst numberOfDaysEachMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\nexport type DateData = {\n title: string,\n minDate: number,\n maxDate: number,\n};\nexport function fillTipDates(query: string, dates: DateData[]) {\n const q = query.trim().toLowerCase();\n\n if(q.length < 3) {\n return;\n }\n\n if('today'.indexOf(q) === 0) {\n const date = new Date();\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: 'Today',\n minDate,\n maxDate\n });\n return;\n }\n\n if('yesterday'.indexOf(q) === 0) {\n const date = new Date();\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime() - 86400000;\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 86400001;\n dates.push({\n title: 'Yesterday',\n minDate,\n maxDate\n });\n return;\n }\n\n const dayOfWeek = getDayOfWeek(q);\n if(dayOfWeek >= 0) {\n const date = new Date();\n const now = date.getTime();\n const currentDay = date.getDay();\n const distance = dayOfWeek - currentDay;\n date.setDate(date.getDate() + distance);\n if(date.getTime() > now) {\n date.setTime(date.getTime() - 604800000);\n }\n const year = date.getFullYear()\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: formatWeekLong(minDate),\n minDate,\n maxDate\n });\n return;\n }\n\n let matches: any[];\n if((matches = shortDate.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[3];\n const k = parseInt(g1);\n const k1 = parseInt(g2);\n if(k > 0 && k <= 31) {\n if(k1 >= minYear && k <= 12) {\n const selectedYear = k1;\n const month = k - 1;\n createForMonthYear(dates, month, selectedYear);\n return;\n } else if(k1 <= 12) {\n const day = k - 1;\n const month = k1 - 1;\n createForDayMonth(dates, day, month);\n }\n } else if(k >= minYear && k1 <= 12) {\n const selectedYear = k;\n const month = k1 - 1;\n createForMonthYear(dates, month, selectedYear);\n }\n\n return;\n }\n\n if((matches = longDate.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[3];\n const g3 = matches[5];\n if(!matches[2] === matches[4]) {\n return;\n }\n\n const day = parseInt(g1);\n const month = parseInt(g2) - 1;\n let year = parseInt(g3);\n if(year >= 10 && year <= 99) {\n year += 2000;\n }\n\n const currentYear = new Date().getFullYear();\n if(validDateForMonth(day - 1, month) && year >= minYear && year <= currentYear) {\n const date = new Date();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: formatterYearMax(minDate),\n minDate,\n maxDate\n });\n return;\n }\n\n return;\n }\n\n if((matches = yearPattern.exec(q)) !== null) {\n let selectedYear = +q;\n const currentYear = new Date().getFullYear();\n if(selectedYear < minYear) {\n selectedYear = minYear;\n for(let i = currentYear; i >= selectedYear; i--) {\n const date = new Date();\n date.setFullYear(i, 0, 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(i + 1, 0, 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: '' + i,\n minDate,\n maxDate\n });\n }\n } else if(selectedYear <= currentYear) {\n const date = new Date();\n date.setFullYear(selectedYear, 0, 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(selectedYear + 1, 0, 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: '' + selectedYear,\n minDate,\n maxDate\n });\n }\n\n return;\n }\n\n if((matches = monthYearOrDayPattern.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[2];\n const month = getMonth(g1);\n if(month >= 0) {\n const k = +g2;\n if(k > 0 && k <= 31) {\n const day = k - 1;\n createForDayMonth(dates, day, month);\n return;\n } else if(k >= minYear) {\n const selectedYear = k;\n createForMonthYear(dates, month, selectedYear);\n return;\n }\n }\n }\n\n if((matches = yearOrDayAndMonthPattern.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[2];\n const month = getMonth(g2);\n if(month >= 0) {\n const k = +g1;\n if(k > 0 && k <= 31) {\n const day = k - 1;\n createForDayMonth(dates, day, month);\n return;\n } else if(k >= minYear) {\n const selectedYear = k;\n createForMonthYear(dates, month, selectedYear);\n }\n }\n }\n}\n\nfunction createForMonthYear(dates: DateData[], month: number, selectedYear: number) {\n const currentYear = new Date().getFullYear();\n const today = Date.now();\n if(selectedYear >= minYear && selectedYear <= currentYear) {\n const date = new Date();\n date.setFullYear(selectedYear, month, 1);\n date.setHours(0, 0, 0);\n const minDate = date.getTime();\n if(minDate > today) {\n return;\n }\n date.setMonth(date.getMonth() + 1);\n const maxDate = date.getTime() - 1;\n\n dates.push({\n title: formatterMonthYear(minDate),\n minDate,\n maxDate\n });\n }\n}\n\nfunction createForDayMonth(dates: DateData[], day: number, month: number) {\n if(validDateForMonth(day, month)) {\n const currentYear = new Date().getFullYear();\n const today = Date.now();\n\n for(let i = currentYear; i >= minYear; i--) {\n if(month === 1 && day === 28 && !isLeapYear(i)) {\n continue;\n }\n\n const date = new Date();\n date.setFullYear(i, month, day + 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n if(minDate > today) {\n continue;\n }\n\n date.setFullYear(i, month, day + 2);\n date.setHours(0, 0, 0);\n const maxDate = date.getTime() - 1;\n if(i === currentYear) {\n dates.push({\n title: formatterDayMonth(minDate),\n minDate,\n maxDate\n });\n } else {\n dates.push({\n title: formatterYearMax(minDate),\n minDate,\n maxDate\n });\n }\n }\n }\n}\n\nfunction formatterMonthYear(timestamp: number) {\n const date = new Date(timestamp);\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getFullYear();\n}\n\nfunction formatterDayMonth(timestamp: number) {\n const date = new Date(timestamp);\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getDate();\n}\n\nfunction formatterYearMax(timestamp: number) {\n const date = new Date(timestamp);\n return ('0' + date.getDate()).slice(-2) + '.' + ('0' + (date.getMonth() + 1)).slice(-2) + '.' + date.getFullYear();\n}\n\nfunction formatWeekLong(timestamp: number) {\n const date = new Date(timestamp);\n return days[date.getDay()];\n}\n\nfunction validDateForMonth(day: number, month: number) {\n if(month >= 0 && month < 12) {\n if(day >= 0 && day < numberOfDaysEachMonth[month]) {\n return true;\n }\n }\n return false;\n}\n\nfunction isLeapYear(year: number) {\n return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);\n}\n\nfunction getMonth(q: string) {\n /* String[] months = new String[]{\n LocaleController.getString(\"January\", R.string.January).toLowerCase(),\n LocaleController.getString(\"February\", R.string.February).toLowerCase(),\n LocaleController.getString(\"March\", R.string.March).toLowerCase(),\n LocaleController.getString(\"April\", R.string.April).toLowerCase(),\n LocaleController.getString(\"May\", R.string.May).toLowerCase(),\n LocaleController.getString(\"June\", R.string.June).toLowerCase(),\n LocaleController.getString(\"July\", R.string.July).toLowerCase(),\n LocaleController.getString(\"August\", R.string.August).toLowerCase(),\n LocaleController.getString(\"September\", R.string.September).toLowerCase(),\n LocaleController.getString(\"October\", R.string.October).toLowerCase(),\n LocaleController.getString(\"November\", R.string.November).toLowerCase(),\n LocaleController.getString(\"December\", R.string.December).toLowerCase()\n }; */\n\n /* String[] monthsEng = new String[12];\n Calendar c = Calendar.getInstance();\n for (int i = 1; i <= 12; i++) {\n c.set(0, 0, 0, 0, 0, 0);\n c.set(Calendar.MONTH, i);\n monthsEng[i - 1] = c.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH).toLowerCase();\n } */\n\n q = q.toLowerCase();\n for(let i = 0; i < 12; i++) {\n const month = months[i].toLowerCase();\n if(month.indexOf(q) === 0) {\n return i;\n }\n }\n return -1;\n}\n\nfunction getDayOfWeek(q: string) {\n const c = new Date();\n if(q.length <= 3) {\n return -1;\n }\n\n for(let i = 0; i < 7; i++) {\n c.setDate(c.getDate() + 1);\n\n if(formatWeekLong(c.getTime()).toLowerCase().indexOf(q) === 0) {\n return c.getDay();\n }\n }\n return -1;\n}\n\nMOUNT_CLASS_TO.fillTipDates = fillTipDates;\n","/**\n * Will be used for FILE_REFERENCE_EXPIRED\n * @param key\n * @param wasObject\n * @param newObject\n */\nexport default function safeReplaceArrayInObject(key: K, wasObject: any, newObject: any) {\n if('byteLength' in newObject[key]) { // Uint8Array\n newObject[key] = [...newObject[key]];\n }\n\n if(wasObject && wasObject[key] !== newObject[key]) {\n wasObject[key].length = newObject[key].length;\n (newObject[key] as any[]).forEach((v, i) => {\n wasObject[key][i] = v;\n });\n\n /* wasObject[key].set(newObject[key]); */\n newObject[key] = wasObject[key];\n }\n}\n","export const EXTENSION_MIME_TYPE_MAP: {[ext in MTFileExtension]: MTMimeType} = {\n pdf: 'application/pdf',\n tgv: 'application/x-tgwallpattern',\n tgs: 'application/x-tgsticker',\n json: 'application/json',\n wav: 'audio/wav',\n mp3: 'audio/mpeg',\n ogg: 'audio/ogg',\n jpeg: 'image/jpeg',\n jpg: 'image/jpeg',\n png: 'image/png',\n gif: 'image/gif',\n webp: 'image/webp',\n mp4: 'video/mp4',\n webm: 'video/webm',\n mov: 'video/quicktime',\n svg: 'image/svg+xml'\n};\n\nexport const MIME_TYPE_EXTENSION_MAP: {[mimeType in MTMimeType]?: MTFileExtension} = {};\n\nfor(const ext in EXTENSION_MIME_TYPE_MAP) {\n MIME_TYPE_EXTENSION_MAP[EXTENSION_MIME_TYPE_MAP[ext as MTFileExtension]] = ext as MTFileExtension;\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 type {ThumbCache} from '../storages/thumbs';\nimport {AccountWallPapers, Document, DocumentAttribute, MessagesSavedGifs, PhotoSize, WallPaper} from '../../layer';\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport {getFullDate} from '../../helpers/date';\nimport isObject from '../../helpers/object/isObject';\nimport safeReplaceArrayInObject from '../../helpers/object/safeReplaceArrayInObject';\nimport {AppManager} from './manager';\nimport wrapPlainText from '../richTextProcessor/wrapPlainText';\nimport assumeType from '../../helpers/assumeType';\nimport {getEnvironment} from '../../environment/utils';\nimport {isServiceWorkerOnline} from '../mtproto/mtproto.worker';\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\nimport getDocumentInputFileLocation from './utils/docs/getDocumentInputFileLocation';\nimport getDocumentURL from './utils/docs/getDocumentURL';\nimport makeError from '../../helpers/makeError';\nimport {EXTENSION_MIME_TYPE_MAP} from '../../environment/mimeTypeMap';\nimport {THUMB_TYPE_FULL} from '../mtproto/mtproto_config';\n\nexport type MyDocument = Document.document;\n\n// TODO: ะตัะปะธ ะทะฐะปะธั‚ัŒ ะบะฐั€ั‚ะธะฝะบัƒ ั„ะฐะนะปะพะผ, ะฐ ะฟะพั‚ะพะผ ะฟะตั€ะตะทะฐะนั‚ะธ ะฒ ะดะธะฐะปะพะณ - ะฟั€ะตะฒัŒัŽัˆะบะฐ ะทะฐะฝะพะฒะพ ัะบะฐั‡ะฐะตั‚ัั\n\ntype WallPaperId = WallPaper.wallPaper['id'];\n\nlet uploadWallPaperTempId = 0;\n\nexport class AppDocsManager extends AppManager {\n private docs: {[docId: DocId]: MyDocument};\n\n private stickerCachedThumbs: {[docId: DocId]: {[toneIndex: number]: {url: string, w: number, h: number}}};\n\n private uploadingWallPapers: {[id: WallPaperId]: {cacheContext: ThumbCache, file: File}};\n\n protected after() {\n this.docs = {};\n this.stickerCachedThumbs = {};\n this.uploadingWallPapers = {};\n\n MTProtoMessagePort.getInstance().addEventListener('serviceWorkerOnline', (online) => {\n if(!online) {\n this.onServiceWorkerFail();\n }\n });\n }\n\n private onServiceWorkerFail = () => {\n for(const id in this.docs) {\n const doc = this.docs[id];\n\n if(doc.supportsStreaming) {\n delete doc.supportsStreaming;\n this.thumbsStorage.deleteCacheContext(doc);\n }\n }\n };\n\n public saveDoc(doc: Document, context?: ReferenceContext): MyDocument {\n if(!doc || doc._ === 'documentEmpty') {\n return;\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 this.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 for(let i = 0, length = doc.attributes.length; i < length; ++i) {\n const attribute = doc.attributes[i];\n switch(attribute._) {\n case 'documentAttributeFilename': {\n doc.file_name = wrapPlainText(attribute.file_name);\n break;\n }\n\n case 'documentAttributeAudio': {\n if(doc.type === 'round') {\n break;\n }\n\n doc.duration = attribute.duration;\n doc.type = attribute.pFlags.voice && doc.mime_type === 'audio/ogg' ? 'voice' : 'audio';\n break;\n }\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\n case 'documentAttributeCustomEmoji':\n case 'documentAttributeSticker': {\n if(attribute.alt !== undefined) {\n doc.stickerEmojiRaw = attribute.alt;\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 || getEnvironment().IS_WEBP_SUPPORTED)) {\n doc.type = 'sticker';\n doc.sticker = 1;\n } else if(doc.mime_type === 'video/webm') {\n if(!getEnvironment().IS_WEBM_SUPPORTED) {\n break;\n }\n\n doc.type = 'sticker';\n doc.sticker = 3;\n doc.animated = true;\n }\n break;\n }\n\n case 'documentAttributeImageSize': {\n doc.type = 'photo';\n doc.w = attribute.w;\n doc.h = attribute.h;\n break;\n }\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\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 } else 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.type === 'voice' || doc.type === 'round') {\n // browser will identify extension\n const attribute = doc.attributes.find((attribute) => attribute._ === 'documentAttributeFilename') as DocumentAttribute.documentAttributeFilename;\n const ext = attribute && attribute.file_name.split('.').pop();\n const date = getFullDate(new Date(doc.date * 1000), {monthAsNumber: true, leadingZero: true}).replace(/[:\\.]/g, '-').replace(', ', '_');\n doc.file_name = `${doc.type}_${date}${ext ? '.' + ext : ''}`;\n }\n\n if(isServiceWorkerOnline() && ((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 = this.thumbsStorage.getCacheContext(doc);\n if(!cacheContext.url) {\n this.thumbsStorage.setCacheContextURL(doc, undefined, getDocumentURL(doc), 0);\n }\n } else {\n doc.supportsStreaming = false;\n }\n\n // for testing purposes\n // doc.supportsStreaming = false;\n // doc.url = ''; // * this will break upload urls\n\n doc.file_name ||= '';\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 downloadDoc(doc: MyDocument, queueId?: number, onlyCache?: boolean) {\n return this.apiFileManager.downloadMedia({\n media: doc,\n queueId,\n onlyCache\n });\n }\n\n public getLottieCachedThumb(docId: DocId, toneIndex: number) {\n const cached = this.stickerCachedThumbs[docId];\n return cached && cached[toneIndex];\n }\n\n public saveLottiePreview(docId: DocId, blob: Blob, width: number, height: number, toneIndex: number) {\n const doc = this.getDoc(docId);\n if(!doc) {\n return;\n }\n\n const cached = this.stickerCachedThumbs[doc.id] ??= {};\n\n const thumb = cached[toneIndex];\n if(thumb && thumb.w >= width && thumb.h >= height) {\n return;\n }\n\n cached[toneIndex] = {\n url: URL.createObjectURL(blob),\n w: width,\n h: height\n };\n }\n\n public saveWebPConvertedStrippedThumb(docId: DocId, bytes: Uint8Array) {\n const doc = this.getDoc(docId);\n if(!doc) {\n return;\n }\n\n const thumb = doc.thumbs && doc.thumbs.find((thumb) => thumb._ === 'photoStrippedSize') as PhotoSize.photoStrippedSize;\n if(!thumb) {\n return;\n }\n\n doc.pFlags.stickerThumbConverted = true;\n thumb.bytes = bytes;\n }\n\n public prepareWallPaperUpload(file: File) {\n const id = 'wallpaper-upload-' + ++uploadWallPaperTempId;\n\n const thumb = {\n _: 'photoSize',\n h: 0,\n w: 0,\n location: {} as any,\n size: file.size,\n type: THUMB_TYPE_FULL\n } as PhotoSize.photoSize;\n let document: MyDocument = {\n _: 'document',\n access_hash: '',\n attributes: [],\n dc_id: 0,\n file_reference: [],\n id,\n mime_type: file.type as MTMimeType,\n size: file.size,\n date: Date.now() / 1000,\n pFlags: {},\n thumbs: [thumb],\n file_name: file.name\n };\n\n document = this.saveDoc(document);\n\n const cacheContext = this.thumbsStorage.setCacheContextURL(document, undefined, URL.createObjectURL(file), file.size);\n\n const wallpaper: WallPaper.wallPaper = {\n _: 'wallPaper',\n access_hash: '',\n document: document,\n id,\n slug: id,\n pFlags: {}\n };\n\n this.uploadingWallPapers[id] = {\n cacheContext,\n file\n };\n\n return wallpaper;\n }\n\n public uploadWallPaper(id: WallPaperId) {\n const {cacheContext, file} = this.uploadingWallPapers[id];\n delete this.uploadingWallPapers[id];\n\n const upload = this.apiFileManager.upload({file, fileName: file.name});\n return upload.then((inputFile) => {\n return this.apiManager.invokeApi('account.uploadWallPaper', {\n file: inputFile,\n mime_type: file.type,\n settings: {\n _: 'wallPaperSettings',\n pFlags: {}\n }\n }).then((wallPaper) => {\n assumeType(wallPaper);\n wallPaper.document = this.saveDoc(wallPaper.document);\n this.thumbsStorage.setCacheContextURL(wallPaper.document, undefined, cacheContext.url, cacheContext.downloaded);\n\n return wallPaper;\n });\n });\n }\n\n public getGifs() {\n return this.apiManager.invokeApiHashable({\n method: 'messages.getSavedGifs',\n processResult: (res) => {\n assumeType(res);\n return res.gifs.map((doc) => this.saveDoc(doc));\n }\n });\n }\n\n public requestDocPart(docId: DocId, dcId: number, offset: number, limit: number) {\n const doc = this.getDoc(docId);\n if(!doc) return Promise.reject(makeError('NO_DOC'));\n return this.apiFileManager.requestFilePart(dcId, getDocumentInputFileLocation(doc), offset, limit);\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 {FileURLType, getFileURL} from '../../../../helpers/fileName';\nimport {Document, PhotoSize} from '../../../../layer';\nimport getDocumentDownloadOptions from './getDocumentDownloadOptions';\n\nexport default function getDocumentURL(doc: Document.document, 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, getDocumentDownloadOptions(doc, thumb));\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 {MessageEntity, DraftMessage, MessagesSaveDraft} from '../../layer';\nimport tsNow from '../../helpers/tsNow';\nimport stateStorage from '../stateStorage';\nimport assumeType from '../../helpers/assumeType';\nimport {AppManager} from './manager';\nimport generateMessageId from './utils/messageId/generateMessageId';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport draftsAreEqual from './utils/drafts/draftsAreEqual';\n\nexport type MyDraftMessage = DraftMessage.draftMessage;\n\nexport class AppDraftsManager extends AppManager {\n private drafts: {[peerIdAndThreadId: string]: MyDraftMessage} = {};\n private getAllDraftPromise: Promise;\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateDraftMessage: (update) => {\n const peerId = this.appPeersManager.getPeerId(update.peer);\n this.saveDraft({\n peerId,\n threadId: update.threadId,\n draft: update.draft,\n notify: true\n });\n }\n });\n\n /* return */stateStorage.get('drafts').then((drafts) => {\n this.drafts = drafts || {};\n });\n }\n\n private getKey(peerId: PeerId, threadId?: number) {\n return '' + peerId + (threadId ? '_' + threadId : '');\n }\n\n public getDraft(peerId: PeerId, threadId?: number) {\n return this.drafts[this.getKey(peerId, threadId)];\n }\n\n public addMissedDialogs() {\n return this.getAllDrafts().then(() => {\n for(const key in this.drafts) {\n if(key.indexOf('_') !== -1) { // exclude threads\n continue;\n }\n\n const peerId = key.toPeerId();\n const dialog = this.appMessagesManager.getDialogOnly(peerId);\n if(!dialog) {\n this.appMessagesManager.reloadConversation(peerId);\n /* const dialog = appMessagesManager.generateDialog(peerId);\n dialog.draft = this.drafts[key];\n appMessagesManager.saveConversation(dialog);\n appMessagesManager.newDialogsToHandle[peerId] = dialog;\n appMessagesManager.scheduleHandleNewDialogs(); */\n }\n }\n });\n }\n\n private getAllDrafts() {\n return this.getAllDraftPromise ??= this.apiManager.invokeApi('messages.getAllDrafts')\n .then((updates) => {\n const p = this.apiUpdatesManager.updatesState.syncLoading || Promise.resolve();\n p.then(() => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n });\n }\n\n public saveDraft({peerId, threadId, draft: apiDraft, notify, force}: {\n peerId: PeerId,\n threadId?: number,\n draft: DraftMessage,\n notify?: boolean,\n force?: boolean\n }) {\n const draft = this.processApiDraft(apiDraft);\n\n const key = this.getKey(peerId, threadId);\n if(draft) {\n this.drafts[key] = draft;\n } else {\n delete this.drafts[key];\n }\n\n stateStorage.set({\n drafts: this.drafts\n });\n\n if(notify) {\n // console.warn(dT(), 'save draft', peerId, apiDraft, options)\n this.rootScope.dispatchEvent('draft_updated', {\n peerId,\n threadId,\n draft,\n force\n });\n }\n\n return draft;\n }\n\n private isEmptyDraft(draft: DraftMessage) {\n if(draft?._ !== 'draftMessage') {\n return true;\n }\n\n if(draft.reply_to_msg_id !== undefined && draft.reply_to_msg_id > 0) {\n return false;\n }\n\n if(!draft.message.length) {\n return true;\n }\n\n return false;\n }\n\n private processApiDraft(draft: DraftMessage): MyDraftMessage {\n if(!draft || draft._ !== 'draftMessage') {\n return undefined;\n }\n\n if(draft.reply_to_msg_id) {\n draft.reply_to_msg_id = generateMessageId(draft.reply_to_msg_id);\n }\n\n return draft;\n }\n\n public syncDraft(peerId: PeerId, threadId: number, localDraft?: DraftMessage, saveOnServer = true, force = false) {\n // console.warn(dT(), 'sync draft', peerID)\n const serverDraft = this.getDraft(peerId, threadId);\n if(draftsAreEqual(serverDraft, localDraft)) {\n // console.warn(dT(), 'equal drafts', localDraft, serverDraft)\n return true;\n }\n\n // console.warn(dT(), 'changed draft', localDraft, serverDraft)\n const params: MessagesSaveDraft = {\n peer: this.appPeersManager.getInputPeerById(peerId),\n message: ''\n };\n\n let draftObj: DraftMessage;\n if(this.isEmptyDraft(localDraft)) {\n draftObj = {_: 'draftMessageEmpty'};\n } else {\n assumeType(localDraft);\n const message = localDraft.message;\n const entities: MessageEntity[] = localDraft.entities;\n\n if(localDraft.reply_to_msg_id) {\n params.reply_to_msg_id = getServerMessageId(localDraft.reply_to_msg_id);\n }\n\n if(entities?.length) {\n params.entities = this.appMessagesManager.getInputEntities(entities);\n }\n\n if(localDraft.pFlags.no_webpage) {\n params.no_webpage = localDraft.pFlags.no_webpage;\n }\n\n params.message = message;\n }\n\n if(threadId) {\n params.top_msg_id = getServerMessageId(threadId);\n }\n\n const saveLocalDraft = draftObj || localDraft;\n saveLocalDraft.date = tsNow(true) + this.timeManager.getServerTimeOffset();\n\n this.saveDraft({\n peerId,\n threadId,\n draft: saveLocalDraft,\n notify: true,\n force\n });\n\n if(saveOnServer) {\n return this.apiManager.invokeApi('messages.saveDraft', params);\n }\n\n return true;\n }\n\n public clearAllDrafts() {\n return this.apiManager.invokeApi('messages.clearAllDrafts').then((bool) => {\n if(!bool) {\n return;\n }\n\n for(const combined in this.drafts) {\n const [peerId, threadId] = combined.split('_');\n this.rootScope.dispatchEvent('draft_updated', {\n peerId: peerId.toPeerId(),\n threadId: threadId ? +threadId : undefined,\n draft: undefined\n });\n }\n });\n }\n\n public clearDraft(peerId: PeerId, threadId: number) {\n const emptyDraft: DraftMessage.draftMessageEmpty = {\n _: 'draftMessageEmpty'\n };\n\n if(threadId) {\n this.syncDraft(peerId, threadId, emptyDraft as any, false, true);\n } else {\n this.saveDraft({\n peerId,\n threadId,\n draft: emptyDraft,\n notify: true,\n force: true\n });\n }\n }\n\n public setDraft(peerId: PeerId, threadId: number, message: string, entities?: MessageEntity[]) {\n const draft: DraftMessage.draftMessage = {\n _: 'draftMessage',\n date: Date.now() / 1000 | 0,\n message,\n pFlags: {},\n entities\n };\n\n if(threadId) {\n this.syncDraft(peerId, threadId, draft, false, true);\n } else {\n this.saveDraft({\n peerId,\n threadId,\n draft,\n notify: true,\n force: true\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 {MyDocument} from './appDocsManager';\nimport App from '../../config/app';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport isObject from '../../helpers/object/isObject';\nimport validateInitObject from '../../helpers/object/validateInitObject';\nimport fixEmoji from '../richTextProcessor/fixEmoji';\nimport SearchIndex from '../searchIndex';\nimport stateStorage from '../stateStorage';\nimport {AppManager} from './manager';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport pause from '../../helpers/schedulers/pause';\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 = 32;\n\ntype EmojiType = 'native' | 'custom';\n\nexport class AppEmojiManager extends AppManager {\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: {native?: string[], custom?: DocId[]} = {};\n private getRecentEmojisPromises: {native?: Promise, custom?: Promise} = {};\n\n private getCustomEmojiDocumentsPromise: Promise;\n private getCustomEmojiDocumentPromises: Map> = new Map();\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 this.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(this.networkerFactory.language !== App.langPackCode) {\n promises.push(this.getEmojiKeywords(this.networkerFactory.language));\n }\n\n if(!this.recent.native) {\n promises.push(this.getRecentEmojis('native'));\n }\n\n return Promise.all(promises);\n }\n\n private 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.native.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(type: 'custom'): Promise;\n public getRecentEmojis(type: 'native'): Promise;\n public getRecentEmojis(type: T): Promise {\n const promises = this.getRecentEmojisPromises;\n return promises[type] ??= this.appStateManager.getState().then((state) => {\n let recent: string[] | DocId[] = [];\n if(type === 'native') {\n const {recentEmoji} = state;\n recent = Array.isArray(recentEmoji) && recentEmoji.length ? recentEmoji : AppEmojiManager.POPULAR_EMOJI;\n } else {\n const {recentCustomEmoji} = state;\n recent = Array.isArray(recentCustomEmoji) && recentCustomEmoji.length ? recentCustomEmoji : [];\n }\n\n return this.recent[type] = recent as any;\n }) as any;\n }\n\n public pushRecentEmoji(emoji: AppEmoji) {\n const type: EmojiType = emoji.docId ? 'custom' : 'native';\n emoji.emoji = fixEmoji(emoji.emoji);\n // @ts-ignore\n this.getRecentEmojis(type).then((recent) => {\n const i = emoji.docId || emoji.emoji;\n indexOfAndSplice(recent, i);\n recent.unshift(i);\n recent.splice(RECENT_MAX_LENGTH, recent.length - RECENT_MAX_LENGTH);\n\n this.appStateManager.pushToState(type === 'custom' ? 'recentCustomEmoji' : 'recentEmoji', recent);\n this.rootScope.dispatchEvent('emoji_recent', emoji);\n });\n }\n\n public getCustomEmojiDocuments(docIds: DocId[]) {\n if(!docIds.length) return Promise.resolve([] as MyDocument[]);\n return this.apiManager.invokeApi('messages.getCustomEmojiDocuments', {document_id: docIds}).then((documents) => {\n return documents.map((doc) => {\n return this.appDocsManager.saveDoc(doc, {\n type: 'customEmoji',\n docId: doc.id\n });\n });\n });\n }\n\n public getCachedCustomEmojiDocuments(docIds: DocId[]) {\n return docIds.map((docId) => this.appDocsManager.getDoc(docId));\n }\n\n private setDebouncedGetCustomEmojiDocuments() {\n if(this.getCustomEmojiDocumentsPromise || !this.getCustomEmojiDocumentPromises.size) {\n return;\n }\n\n this.getCustomEmojiDocumentsPromise = pause(0).then(() => {\n const allIds = [...this.getCustomEmojiDocumentPromises.keys()];\n const promises: Promise[] = [];\n do {\n const ids = allIds.splice(0, 100);\n const promise = this.getCustomEmojiDocuments(ids).then((docs) => {\n docs.forEach((doc, idx) => {\n const docId = ids[idx];\n const deferred = this.getCustomEmojiDocumentPromises.get(docId);\n this.getCustomEmojiDocumentPromises.delete(docId);\n deferred.resolve(doc);\n });\n });\n\n promises.push(promise);\n } while(allIds.length);\n\n return Promise.all(promises);\n }).finally(() => {\n this.getCustomEmojiDocumentsPromise = undefined;\n this.setDebouncedGetCustomEmojiDocuments();\n });\n }\n\n public getCustomEmojiDocument(id: DocId) {\n let promise = this.getCustomEmojiDocumentPromises.get(id);\n if(promise) {\n return promise;\n }\n\n const doc = this.appDocsManager.getDoc(id);\n if(doc) {\n return doc;\n }\n\n promise = deferredPromise();\n this.getCustomEmojiDocumentPromises.set(id, promise);\n\n this.setDebouncedGetCustomEmojiDocuments();\n\n return promise;\n }\n\n public getCustomEmojis() {\n return this.appStickersManager.getEmojiStickers();\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 type GroupCallConnectionInstance from '../calls/groupCallConnectionInstance';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport {nextRandomUint} from '../../helpers/random';\nimport {DataJSON, GroupCall, GroupCallParticipant, GroupCallParticipantVideoSourceGroup, InputGroupCall, PhoneJoinGroupCall, PhoneJoinGroupCallPresentation, Update, Updates} from '../../layer';\nimport {logger} from '../logger';\nimport {NULL_PEER_ID} from '../mtproto/mtproto_config';\nimport {AppManager} from './manager';\nimport getPeerId from './utils/peers/getPeerId';\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\nexport type GroupCallOutputSource = 'main' | 'presentation' | number;\n\nexport class AppGroupCallsManager extends AppManager {\n private log: ReturnType;\n\n private groupCalls: Map;\n private participants: Map>;\n private nextOffsets: Map;\n\n // private doNotDispatchParticipantUpdate: PeerId;\n\n protected after() {\n this.log = logger('GROUP-CALLS');\n\n this.groupCalls = new Map();\n this.participants = new Map();\n this.nextOffsets = new Map();\n\n this.apiUpdatesManager.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 this.rootScope.addEventListener('group_call_update', (groupCall) => {\n if(groupCall._ === 'groupCallDiscarded') {\n this.participants.delete(groupCall.id);\n }\n });\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 participants = this.getCachedParticipants(groupCallId);\n\n const peerId = 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 if(oldParticipant) {\n safeReplaceObject(oldParticipant, participant);\n participant = oldParticipant;\n } else {\n participants.set(peerId, participant);\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 this.rootScope.dispatchEvent('group_call_update', groupCall);\n }\n }\n // }\n\n if(hasLeft) {\n participants.delete(peerId);\n }\n\n if(oldParticipant || true/* && this.doNotDispatchParticipantUpdate !== peerId */) {\n this.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 this.saveApiParticipant(groupCallId, participant);\n\n const peerId = participant.pFlags.self ? NULL_PEER_ID : getPeerId(participant.peer);\n const updates = await this.apiManager.invokeApiSingle('phone.editGroupCallParticipant', {\n call: this.getGroupCallInput(groupCallId),\n participant: peerId === NULL_PEER_ID ? this.appPeersManager.getInputPeerSelf() : this.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 = getPeerId(participant.peer);\n this.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 this.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 this.appUsersManager.saveApiUsers(groupCall.users);\n this.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 this.rootScope.dispatchEvent('group_call_update', call as any);\n }\n\n return call;\n }\n\n public async createGroupCall(chatId: ChatId, scheduleDate?: number, title?: string) {\n const updates = await this.apiManager.invokeApi('phone.createGroupCall', {\n peer: this.appPeersManager.getInputPeerById(chatId.toPeerId(true)),\n random_id: nextRandomUint(32),\n schedule_date: scheduleDate,\n title\n });\n\n this.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 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 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: this.appPeersManager.getOutputPeer(rootScope.myId)\n // };\n // }\n\n public async getGroupCallParticipants(id: GroupCallId) {\n const {nextOffset, setNextOffset} = this.prepareToSavingNextOffset(id);\n\n if(nextOffset !== '') {\n await this.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 this.appChatsManager.saveApiChats(groupCallParticipants.chats);\n this.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 hangUp(id: GroupCallId, discard?: boolean | number) {\n const groupCallInput = this.getGroupCallInput(id);\n let promise: Promise;\n if(typeof(discard) === 'boolean' && discard) {\n promise = this.apiManager.invokeApi('phone.discardGroupCall', {\n call: groupCallInput\n });\n } else if(typeof(discard) === 'number') {\n promise = this.apiManager.invokeApi('phone.leaveGroupCall', {\n call: groupCallInput,\n source: discard\n });\n } else {\n promise = this.apiManager.invokeApi('phone.joinGroupCall', {\n call: groupCallInput,\n join_as: this.appPeersManager.getInputPeerSelf(),\n muted: true,\n video_stopped: true,\n params: {\n _: 'dataJSON',\n data: ''\n }\n });\n }\n\n return promise.then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public async joinGroupCall(groupCallId: GroupCallId, params: DataJSON, options: GroupCallConnectionInstance['options']) {\n const groupCallInput = this.getGroupCallInput(groupCallId);\n let promise: Promise;\n if(options.type === 'main') {\n const request: PhoneJoinGroupCall = {\n call: groupCallInput,\n join_as: this.appPeersManager.getInputPeerSelf(),\n params,\n muted: options.isMuted,\n video_stopped: !options.joinVideo\n };\n\n promise = this.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 = this.apiManager.invokeApi('phone.joinGroupCallPresentation', request);\n this.log(`[api] joinGroupCallPresentation id=${groupCallId}`, request);\n }\n\n const updates = await promise;\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n const update = (updates as Updates.updates).updates.find((update) => update._ === 'updateGroupCallConnection') as Update.updateGroupCallConnection;\n return update;\n }\n\n public leaveGroupCallPresentation(groupCallId: GroupCallId) {\n return this.apiManager.invokeApi('phone.leaveGroupCallPresentation', {\n call: this.getGroupCallInput(groupCallId)\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\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 {InputPhoto} from '../../../../layer';\nimport {MyPhoto} from '../../appPhotosManager';\n\nexport default function getPhotoInput(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 * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {InputMedia} from '../../../../layer';\nimport {MyPhoto} from '../../appPhotosManager';\nimport getPhotoInput from './getPhotoInput';\n\nexport default function getPhotoMediaInput(photo: MyPhoto): InputMedia.inputMediaPhoto {\n return {\n _: 'inputMediaPhoto',\n id: getPhotoInput(photo),\n ttl_seconds: 0,\n pFlags: {}\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 {Document, InputMedia} from '../../../../layer';\n\nexport default function getMediaInput(doc: Document.document): 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 pFlags: {}\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 type {MyDocument} from './appDocsManager';\nimport type {MyPhoto} from './appPhotosManager';\nimport type {MyTopPeer} from './appUsersManager';\nimport type {AppMessagesManager, MessageSendingParams} from './appMessagesManager';\nimport {BotInlineResult, GeoPoint, InputGeoPoint, InputMedia, MessageEntity, MessageMedia, MessagesBotResults, ReplyMarkup} from '../../layer';\nimport insertInDescendSortedArray from '../../helpers/array/insertInDescendSortedArray';\nimport {AppManager} from './manager';\nimport getPhotoMediaInput from './utils/photos/getPhotoMediaInput';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport generateQId from './utils/inlineBots/generateQId';\nimport getDocumentMediaInput from './utils/docs/getDocumentMediaInput';\n\nexport class AppInlineBotsManager extends AppManager {\n private inlineResults: {[queryAndResultIds: string]: BotInlineResult} = {};\n private setHash: {\n [botId: UserId]: {\n peerId: PeerId,\n time: number\n }\n } = {};\n\n public getGeoInput(geo: GeoPoint): InputGeoPoint {\n return geo._ === 'geoPoint' ? {\n _: 'inputGeoPoint',\n lat: geo.lat,\n long: geo.long,\n accuracy_radius: geo.accuracy_radius\n } : {\n _: 'inputGeoPointEmpty'\n };\n }\n\n public getInlineResults(peerId: PeerId, botId: BotId, query = '', offset = '', geo?: GeoPoint) {\n return this.apiManager.invokeApi('messages.getInlineBotResults', {\n bot: this.appUsersManager.getUserInput(botId),\n peer: this.appPeersManager.getInputPeerById(peerId),\n query,\n geo_point: geo ? this.getGeoInput(geo) : undefined,\n offset\n }, {/* timeout: 1, */stopTime: -1, noErrorBox: true}).then((botResults) => {\n const queryId = botResults.query_id;\n\n /* if(botResults.switch_pm) {\n botResults.switch_pm.rText = wrapRichText(botResults.switch_pm.text, {noLinebreaks: true, noLinks: true});\n } */\n\n botResults.results.forEach((result) => {\n if(result._ === 'botInlineMediaResult') {\n if(result.document) {\n result.document = this.appDocsManager.saveDoc(result.document);\n }\n\n if(result.photo) {\n result.photo = this.appPhotosManager.savePhoto(result.photo);\n }\n }\n\n this.inlineResults[generateQId(queryId, result.id)] = result;\n });\n\n return botResults;\n });\n }\n\n private pushPopularBot(botId: BotId) {\n this.appUsersManager.getTopPeers('bots_inline').then((topPeers) => {\n const botPeerId = botId.toPeerId();\n const index = topPeers.findIndex((topPeer) => topPeer.id === botPeerId);\n let topPeer: MyTopPeer;\n if(index !== -1) {\n topPeer = topPeers[index];\n } else {\n topPeer = {\n id: botPeerId,\n rating: 0\n };\n }\n\n ++topPeer.rating;\n insertInDescendSortedArray(topPeers, topPeer, 'rating');\n\n this.appStateManager.setKeyValueToStorage('topPeersCache');\n\n // rootScope.$broadcast('inline_bots_popular')\n });\n }\n\n public switchToPM(fromPeerId: PeerId, botId: BotId, startParam: string) {\n this.setHash[botId] = {peerId: fromPeerId, time: Date.now()};\n return this.appMessagesManager.startBot(botId, undefined, startParam);\n }\n\n /*\n function resolveInlineMention (username) {\n return AppPeersManager.resolveUsername(username).then(function (peerId) {\n if (peerId.isUser()) {\n var bot = AppUsersManager.getUser(peerId)\n if (bot.pFlags.bot && bot.bot_inline_placeholder !== undefined) {\n var resolvedBot = {\n username: username,\n id: peerId,\n placeholder: bot.bot_inline_placeholder\n }\n if (bot.pFlags.bot_inline_geo &&\n GeoLocationManager.isAvailable()) {\n return checkGeoLocationAccess(peerId).then(function () {\n return GeoLocationManager.getPosition().then(function (coords) {\n resolvedBot.geo = coords\n return qSync.when(resolvedBot)\n })\n })['catch'](function () {\n return qSync.when(resolvedBot)\n })\n }\n return qSync.when(resolvedBot)\n }\n }\n return $q.reject()\n }, function (error) {\n error.handled = true\n return $q.reject(error)\n })\n }\n\n function regroupWrappedResults (results, rowW, rowH) {\n if (!results ||\n !results[0] ||\n ['photo', 'gif', 'sticker'].indexOf(results[0].type) === -1) {\n return\n }\n var ratios = []\n angular.forEach(results, function (result) {\n var w\n var h, doc\n var photo\n if (result._ === 'botInlineMediaResult') {\n if (doc = result.document) {\n w = result.document.w\n h = result.document.h\n }\n else if (photo = result.photo) {\n var photoSize = (photo.sizes || [])[0]\n w = photoSize && photoSize.w\n h = photoSize && photoSize.h\n }\n }else {\n w = result.w\n h = result.h\n }\n if (!w || !h) {\n w = h = 1\n }\n ratios.push(w / h)\n })\n\n var rows = []\n var curCnt = 0\n var curW = 0\n angular.forEach(ratios, function (ratio) {\n var w = ratio * rowH\n curW += w\n if (!curCnt || curCnt < 4 && curW < (rowW * 1.1)) {\n curCnt++\n } else {\n rows.push(curCnt)\n curCnt = 1\n curW = w\n }\n })\n if (curCnt) {\n rows.push(curCnt)\n }\n\n var i = 0\n var thumbs = []\n var lastRowI = rows.length - 1\n angular.forEach(rows, function (rowCnt, rowI) {\n var lastRow = rowI === lastRowI\n var curRatios = ratios.slice(i, i + rowCnt)\n var sumRatios = 0\n angular.forEach(curRatios, function (ratio) {\n sumRatios += ratio\n })\n angular.forEach(curRatios, function (ratio, j) {\n var thumbH = rowH\n var thumbW = rowW * ratio / sumRatios\n var realW = thumbH * ratio\n if (lastRow && thumbW > realW) {\n thumbW = realW\n }\n var result = results[i + j]\n result.thumbW = Math.floor(thumbW) - 2\n result.thumbH = Math.floor(thumbH) - 2\n })\n\n i += rowCnt\n })\n } */\n\n public async checkSwitchReturn(botId: BotId) {\n const bot = this.appUsersManager.getUser(botId);\n if(!bot || !bot.pFlags.bot || !bot.bot_inline_placeholder) {\n return;\n }\n\n const peerData = this.setHash[botId];\n if(peerData) {\n delete this.setHash[botId];\n if((Date.now() - peerData.time) < 3600e3) {\n return peerData.peerId;\n }\n }\n }\n\n public switchInlineQuery(peerId: PeerId, threadId: number, botId: BotId, query: string) {\n this.appDraftsManager.setDraft(peerId, threadId, '@' + this.appPeersManager.getPeerUsername(botId.toPeerId()) + ' ' + query);\n }\n\n public callbackButtonClick(peerId: PeerId, mid: number, button: any) {\n return this.apiManager.invokeApi('messages.getBotCallbackAnswer', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(mid),\n data: button.data\n }, {/* timeout: 1, */stopTime: -1, noErrorBox: true});\n }\n\n /* function gameButtonClick (id) {\n var message = AppMessagesManager.getMessage(id)\n var peerId = AppMessagesManager.getMessagePeer(message)\n\n return MtpApiManager.invokeApi('messages.getBotCallbackAnswer', {\n peer: AppPeersManager.getInputPeerByID(peerId),\n msg_id: AppMessagesIDsManager.getMessageLocalID(id)\n }, {timeout: 1, stopTime: -1, noErrorBox: true}).then(function (callbackAnswer) {\n if (typeof callbackAnswer.message === 'string' &&\n callbackAnswer.message.length) {\n showCallbackMessage(callbackAnswer.message, callbackAnswer.pFlags.alert)\n }\n else if (typeof callbackAnswer.url === 'string') {\n AppGamesManager.openGame(message.media.game.id, id, callbackAnswer.url)\n }\n })\n } */\n\n public sendInlineResult(peerId: PeerId, botId: BotId, queryAndResultIds: string, options: MessageSendingParams & Partial<{\n viaBotId: BotId,\n queryId: string,\n resultId: string,\n replyMarkup: ReplyMarkup,\n entities: MessageEntity[],\n clearDraft: true,\n geoPoint: GeoPoint\n }> = {}) {\n const inlineResult = this.inlineResults[queryAndResultIds];\n if(!inlineResult) {\n return;\n }\n\n this.pushPopularBot(botId);\n const splitted = queryAndResultIds.split('_');\n const queryID = splitted.shift();\n const resultID = splitted.join('_');\n options.viaBotId = botId;\n options.queryId = queryID;\n options.resultId = resultID;\n if(inlineResult.send_message.reply_markup) {\n options.replyMarkup = inlineResult.send_message.reply_markup;\n }\n\n if(inlineResult.send_message._ === 'botInlineMessageText') {\n options.entities = inlineResult.send_message.entities;\n this.appMessagesManager.sendText(peerId, inlineResult.send_message.message, options);\n } else {\n let caption = '';\n let inputMedia: Parameters[1], messageMedia: MessageMedia;\n const sendMessage = inlineResult.send_message;\n switch(sendMessage._) {\n case 'botInlineMessageMediaAuto': {\n caption = sendMessage.message;\n\n if(inlineResult._ === 'botInlineMediaResult') {\n const {document, photo} = inlineResult;\n if(document) {\n inputMedia = getDocumentMediaInput(document as MyDocument);\n } else {\n inputMedia = getPhotoMediaInput(photo as MyPhoto);\n }\n }\n\n break;\n }\n\n case 'botInlineMessageMediaGeo': {\n inputMedia = {\n _: 'inputMediaGeoPoint',\n geo_point: this.getGeoInput(sendMessage.geo)\n };\n\n options.geoPoint = sendMessage.geo;\n\n break;\n }\n\n case 'botInlineMessageMediaVenue': {\n inputMedia = {\n _: 'inputMediaVenue',\n geo_point: this.getGeoInput(sendMessage.geo),\n title: sendMessage.title,\n address: sendMessage.address,\n provider: sendMessage.provider,\n venue_id: sendMessage.venue_id,\n venue_type: sendMessage.venue_type\n };\n\n options.geoPoint = sendMessage.geo;\n\n break;\n }\n\n case 'botInlineMessageMediaContact': {\n inputMedia = {\n _: 'inputMediaContact',\n phone_number: sendMessage.phone_number,\n first_name: sendMessage.first_name,\n last_name: sendMessage.last_name,\n vcard: sendMessage.vcard\n };\n\n break;\n }\n\n case 'botInlineMessageMediaInvoice': {\n // const photo = sendMessage.photo;\n // inputMedia = {\n // _: 'inputMediaInvoice',\n // description: sendMessage.description,\n // title: sendMessage.title,\n // photo: photo && {\n // _: 'inputWebDocument',\n // attributes: photo.attributes,\n // mime_type: photo.mime_type,\n // size: photo.size,\n // url: photo.url\n // },\n // invoice: undefined,\n // payload: undefined,\n // provider: undefined,\n // provider_data: undefined,\n // start_param: undefined\n // };\n\n messageMedia = {\n _: 'messageMediaInvoice',\n title: sendMessage.title,\n description: sendMessage.description,\n photo: sendMessage.photo,\n currency: sendMessage.currency,\n total_amount: sendMessage.total_amount,\n pFlags: {\n shipping_address_requested: sendMessage.pFlags.shipping_address_requested,\n test: sendMessage.pFlags.test\n },\n start_param: undefined\n };\n\n break;\n }\n }\n\n if(!inputMedia && messageMedia) {\n inputMedia = {\n _: 'messageMediaPending',\n messageMedia\n };\n }\n\n this.appMessagesManager.sendOther(peerId, inputMedia, options);\n }\n }\n\n /* function checkGeoLocationAccess (botID) {\n var key = 'bot_access_geo' + botID\n return Storage.get(key).then(function (geoAccess) {\n if (geoAccess && geoAccess.granted) {\n return true\n }\n return ErrorService.confirm({\n type: 'BOT_ACCESS_GEO_INLINE'\n }).then(function () {\n var setHash = {}\n setHash[key] = {granted: true, time: tsNow()}\n Storage.set(setHash)\n return true\n }, function () {\n var setHash = {}\n setHash[key] = {denied: true, time: tsNow()}\n Storage.set(setHash)\n return $q.reject()\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 {MESSAGE_ID_INCREMENT} from './utils/messageId';\nimport generateMessageId from './utils/messageId/generateMessageId';\n\nexport class AppMessagesIdsManager {\n private tempNum = 0;\n\n public generateTempMessageId(messageId: number) {\n const num = ++this.tempNum;\n return generateMessageId(messageId) + (num & (MESSAGE_ID_INCREMENT - 1));\n }\n}\n","export default function splitStringByLength(str: string, maxLength: number) {\n if(str.length < maxLength) return [str];\n let length = 0, lastSliceStartIndex = 0, arrayIndex = 0;\n const delimiter = ' ';// '\\n';\n const out: string[] = [];\n\n const cut = (end?: number) => {\n let part = str.slice(lastSliceStartIndex, end);\n const _arrayIndex = arrayIndex++;\n if(part.length > maxLength) {\n const overflowPart = part.slice(maxLength);\n const splitted = splitStringByLength(overflowPart, maxLength);\n splitted.forEach((part) => {\n out[arrayIndex++] = part;\n });\n\n part = part.slice(0, maxLength);\n }\n\n lastSliceStartIndex = end;\n length = 0;\n out[_arrayIndex] = (out[_arrayIndex] || '') + part;\n };\n\n let lastIndex = 0;\n do {\n let index = str.indexOf(delimiter, lastIndex);\n if(index === -1) {\n if(lastIndex !== (str.length - 1)) {\n cut();\n }\n\n break;\n }\n\n index += delimiter.length;\n\n const partLength = index - lastIndex;\n if((length + partLength) > maxLength) {\n cut(length);\n }\n\n lastIndex = index;\n length += partLength;\n } while(true);\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\nimport type {TabState} from '../mtproto/mtprotoworker';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\n\ntype Tab = {\n source: MessageEventSource,\n state: TabState\n};\n\nexport class AppTabsManager {\n private tabs: Map;\n\n constructor() {\n this.tabs = new Map();\n }\n\n public start() {\n const port = MTProtoMessagePort.getInstance();\n\n port.addEventListener('tabState', (state, source) => {\n const tab = this.tabs.get(source);\n tab.state = state;\n });\n }\n\n public getTabs() {\n return [...this.tabs.values()].filter((tab) => !!tab.state);\n }\n\n public addTab(source: MessageEventSource) {\n const tab: Tab = {\n source,\n state: undefined\n };\n\n this.tabs.set(source, tab);\n }\n\n public deleteTab(source: MessageEventSource) {\n this.tabs.delete(source);\n }\n}\n\nconst appTabsManager = new AppTabsManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appTabsManager = appTabsManager);\nexport default appTabsManager;\n","import {InputDocument} from '../../../../layer';\nimport type {MyDocument} from '../../appDocsManager';\n\nexport default function getDocumentInput(doc: MyDocument): InputDocument {\n return {\n _: 'inputDocument',\n id: doc.id,\n access_hash: doc.access_hash,\n file_reference: doc.file_reference\n };\n}\n","export default function setBooleanFlag(obj: T, key: keyof T, value: boolean) {\n // @ts-ignore\n if(value) obj[key] = true;\n else delete obj[key];\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 type {ApiFileManager} from '../mtproto/apiFileManager';\nimport type {MediaSize} from '../../helpers/mediaSize';\nimport type {Progress} from './appDownloadManager';\nimport type {VIDEO_MIME_TYPE} from '../../environment/videoMimeTypesSupport';\nimport LazyLoadQueueBase from '../../components/lazyLoadQueueBase';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport tsNow from '../../helpers/tsNow';\nimport {randomLong} from '../../helpers/random';\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, ReactionCount, MessagePeerReaction, MessagesSearchCounter, Peer, MessageReactions, Document, InputFile, Reaction, ForumTopic as MTForumTopic, MessagesForumTopics, MessagesGetReplies, MessagesGetHistory, MessagesAffectedHistory, UrlAuthResult} from '../../layer';\nimport {ArgumentTypes, InvokeApiOptions} from '../../types';\nimport {logger, LogTypes} from '../logger';\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport DialogsStorage, {GLOBAL_FOLDER_ID} from '../storages/dialogs';\nimport {ChatRights} from './appChatsManager';\nimport {MyDocument} from './appDocsManager';\nimport {MyPhoto} from './appPhotosManager';\nimport {getFileNameByLocation} from '../../helpers/fileName';\nimport DEBUG from '../../config/debug';\nimport SlicedArray, {Slice, SliceEnd} from '../../helpers/slicedArray';\nimport {FOLDER_ID_ALL, GENERAL_TOPIC_ID, MUTE_UNTIL, NULL_PEER_ID, REAL_FOLDER_ID, REPLIES_HIDDEN_CHANNEL_ID, REPLIES_PEER_ID, SERVICE_PEER_ID, THUMB_TYPE_FULL} from '../mtproto/mtproto_config';\n// import telegramMeWebManager from '../mtproto/telegramMeWebManager';\nimport {getMiddleware} from '../../helpers/middleware';\nimport assumeType from '../../helpers/assumeType';\nimport copy from '../../helpers/object/copy';\nimport getObjectKeysAndSort from '../../helpers/object/getObjectKeysAndSort';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport splitStringByLength from '../../helpers/string/splitStringByLength';\nimport debounce from '../../helpers/schedulers/debounce';\nimport {AppManager} from './manager';\nimport getPhotoMediaInput from './utils/photos/getPhotoMediaInput';\nimport getPhotoDownloadOptions from './utils/photos/getPhotoDownloadOptions';\nimport fixEmoji from '../richTextProcessor/fixEmoji';\nimport mergeEntities from '../richTextProcessor/mergeEntities';\nimport parseEntities from '../richTextProcessor/parseEntities';\nimport parseMarkdown from '../richTextProcessor/parseMarkdown';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport generateMessageId from './utils/messageId/generateMessageId';\nimport filterMessagesByInputFilter from './utils/messages/filterMessagesByInputFilter';\nimport ctx from '../../environment/ctx';\nimport {getEnvironment} from '../../environment/utils';\nimport getDialogIndex from './utils/dialogs/getDialogIndex';\nimport defineNotNumerableProperties from '../../helpers/object/defineNotNumerableProperties';\nimport getDocumentMediaInput from './utils/docs/getDocumentMediaInput';\nimport getDocumentInputFileName from './utils/docs/getDocumentInputFileName';\nimport getFileNameForUpload from '../../helpers/getFileNameForUpload';\nimport noop from '../../helpers/noop';\nimport appTabsManager from './appTabsManager';\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\nimport getAlbumText from './utils/messages/getAlbumText';\nimport pause from '../../helpers/schedulers/pause';\nimport makeError from '../../helpers/makeError';\nimport getStickerEffectThumb from './utils/stickers/getStickerEffectThumb';\nimport getDocumentInput from './utils/docs/getDocumentInput';\nimport reactionsEqual from './utils/reactions/reactionsEqual';\nimport getPeerActiveUsernames from './utils/peers/getPeerActiveUsernames';\nimport {BroadcastEvents} from '../rootScope';\nimport setBooleanFlag from '../../helpers/object/setBooleanFlag';\nimport getMessageThreadId from './utils/messages/getMessageThreadId';\n\n// console.trace('include');\n// TODO: ะตัะปะธ ัƒะดะฐะปะธั‚ัŒ ะดะธะฐะปะพะณ ะฝะฐั…ะพะดัััŒ ะฒ ะฟะฐะฟะบะต, ั‚ะพ ะพะฝ ะฝะต ัƒะดะฐะปะธั‚ัั ะธะท ะฟะฐะฟะบะธ ะธ ะฑัƒะดะตั‚ ะฒะธะดะตะฝ ะฒ ะฝะฐัั‚ั€ะพะนะบะฐั…\n\nconst APITIMEOUT = 0;\nconst DO_NOT_READ_HISTORY = false;\n\nexport type SendFileDetails = {\n file: File | Blob | MyDocument,\n} & Partial<{\n duration: number,\n width: number,\n height: number,\n objectURL: string,\n thumb: {\n blob: Blob,\n url: string,\n size: MediaSize\n },\n strippedBytes: PhotoSize.photoStrippedSize['bytes'],\n spoiler: boolean\n}>;\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: number[],\n isEnd: ReturnType['getEnds']>,\n offsetIdOffset?: number,\n};\n\nexport type Dialog = MTDialog.dialog;\nexport type ForumTopic = MTForumTopic.forumTopic;\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 & {peerId: PeerId, type: MessagesStorageType, key: MessagesStorageKey};\nexport type MessagesStorageType = 'scheduled' | 'history' | 'grouped';\nexport type MessagesStorageKey = `${PeerId}_${MessagesStorageType}`;\n\nexport type MyMessageActionType = Message.messageService['action']['_'];\n\ntype PendingAfterMsg = Partial;\n\ntype MapValueType = A extends Map ? V : never;\n\nexport type BatchUpdates = {\n 'messages_reactions': AppMessagesManager['batchUpdateReactions'],\n 'messages_views': AppMessagesManager['batchUpdateViews']\n};\n\ntype PendingMessageDetails = {\n peerId: PeerId,\n tempId: number,\n threadId: number,\n storage: MessagesStorage,\n sequential?: boolean\n};\n\nconst processAfter = (cb: () => void) => {\n // setTimeout(cb, 0);\n cb();\n};\n\nconst UPDATE_STICKERSET_ORDER = true;\n\nexport type MessageSendingParams = Partial<{\n threadId: number,\n replyToMsgId: number,\n scheduleDate: number,\n silent: boolean,\n sendAsPeerId: number,\n}>;\n\nexport class AppMessagesManager extends AppManager {\n private messagesStorageByPeerId: {[peerId: string]: MessagesStorage};\n private 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 private pinnedMessages: {[key: string]: PinnedStorage};\n\n private threadsServiceMessagesIdsStorage: {[peerId_threadId: string]: number};\n private threadsToReplies: {\n [peerId_threadId: string]: string;\n };\n\n private pendingByRandomId: {\n [randomId: string]: PendingMessageDetails\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: MyMessage) => Promise\n }>\n }\n } = {};\n\n private sendSmthLazyLoadQueue = new LazyLoadQueueBase(10);\n\n private needSingleMessages: Map>> = new Map();\n private fetchSingleMessagesPromise: Promise;\n private extendedMedia: Map>> = new Map();\n\n private maxSeenId = 0;\n\n public migratedFromTo: {[peerId: PeerId]: PeerId} = {};\n public migratedToFrom: {[peerId: PeerId]: PeerId} = {};\n\n private newDialogsHandlePromise: Promise;\n private newDialogsToHandle: Map}> = new Map();\n public newUpdatesAfterReloadToHandle: {[key: string]: Set} = {};\n\n private notificationsHandlePromise: number;\n private notificationsToHandle: {[key: string]: {\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 private groupedTempId = 0;\n\n private typings: {[key: string]: {action: SendMessageAction, timeout?: number}} = {};\n\n private middleware: ReturnType;\n\n private unreadMentions: {[key: string]: SlicedArray} = {};\n private goToNextMentionPromises: {[key: string]: Promise} = {};\n\n private batchUpdates: {\n [k in keyof BatchUpdates]?: {\n callback: BatchUpdates[k],\n batch: ArgumentTypes[0]\n }\n } = {};\n private batchUpdatesDebounced: () => Promise;\n\n private uploadFilePromises: {[fileName: string]: CancellablePromise};\n\n protected after() {\n this.clear(true);\n\n this.apiUpdatesManager.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 updateMessageReactions: this.onUpdateMessageReactions,\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 updateMessageExtendedMedia: this.onUpdateMessageExtendedMedia\n });\n\n // ! Invalidate notify settings, can optimize though\n this.rootScope.addEventListener('notify_peer_type_settings', ({key, settings}) => {\n const dialogs = this.dialogsStorage.getFolderDialogs(0).concat(this.dialogsStorage.getFolderDialogs(1));\n let filterFunc: (dialog: typeof dialogs[0]) => boolean;\n if(key === 'notifyUsers') filterFunc = (dialog) => dialog.peerId.isUser();\n else if(key === 'notifyBroadcasts') filterFunc = (dialog) => this.appPeersManager.isBroadcast(dialog.peerId);\n else filterFunc = (dialog) => this.appPeersManager.isAnyGroup(dialog.peerId);\n\n dialogs\n .filter(filterFunc)\n .forEach((dialog) => {\n this.rootScope.dispatchEvent('dialog_notify_settings', dialog);\n });\n });\n\n this.rootScope.addEventListener('webpage_updated', ({id, msgs}) => {\n msgs.forEach(({peerId, mid, isScheduled}) => {\n const storage = isScheduled ? this.getScheduledMessagesStorage(peerId) : this.getHistoryMessagesStorage(peerId);\n const message = this.getMessageFromStorage(storage, mid) as Message.message;\n if(!message) return;\n message.media = {\n _: 'messageMediaWebPage',\n webpage: this.appWebPagesManager.getCachedWebPage(id)\n };\n\n this.rootScope.dispatchEvent('message_edit', {\n storageKey: storage.key,\n peerId,\n mid,\n message\n });\n });\n });\n\n this.rootScope.addEventListener('draft_updated', ({peerId, threadId, draft}) => {\n const dialog = this.dialogsStorage.getDialogOrTopic(peerId, threadId);\n if(dialog) {\n dialog.draft = draft;\n\n let drop = false;\n if(!draft && !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 this.rootScope.dispatchEvent('dialog_draft', {\n peerId,\n dialog,\n drop,\n draft\n });\n } else if(threadId) {\n const chat = this.appChatsManager.getChat(peerId.toChatId());\n if(!chat) {\n this.reloadConversation(peerId);\n } else if((chat as Chat.channel).pFlags.forum) {\n this.dialogsStorage.getForumTopicById(peerId, threadId);\n }\n } else {\n this.reloadConversation(peerId);\n }\n });\n\n this.rootScope.addEventListener('poll_update', ({poll}) => {\n const set = this.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 if(message) {\n this.setDialogToStateIfMessageIsTop(message);\n }\n }\n }\n });\n\n // * clear forum cache\n this.rootScope.addEventListener('chat_toggle_forum', ({chatId, enabled}) => {\n const peerId = chatId.toPeerId(true);\n if(!enabled) {\n delete this.threadsStorage[peerId];\n\n for(const key in this.pinnedMessages) {\n if(+key === peerId && key.startsWith(peerId + '_')) {\n delete this.pinnedMessages[key];\n }\n }\n }\n });\n\n this.batchUpdatesDebounced = debounce(() => {\n for(const event in this.batchUpdates) {\n const details = this.batchUpdates[event as keyof BatchUpdates];\n delete this.batchUpdates[event as keyof BatchUpdates];\n\n // @ts-ignore\n const result = details.callback(details.batch);\n if(result && (!(result instanceof Array) || result.length)) {\n // @ts-ignore\n rootScope.dispatchEvent(event as keyof BatchUpdates, result);\n }\n }\n }, 33, false, true);\n\n return this.appStateManager.getState().then((state) => {\n if(state.maxSeenMsgId) {\n this.maxSeenId = state.maxSeenMsgId;\n }\n });\n }\n\n public clear = (init?: boolean) => {\n if(this.middleware) {\n this.middleware.clean();\n } else {\n this.middleware = getMiddleware();\n this.uploadFilePromises = {};\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(init);\n this.filtersStorage && this.filtersStorage.clear(init);\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 = this.appUsersManager.getUserInput(entity.user_id);\n }\n });\n return sendEntites;\n }\n\n public invokeAfterMessageIsSent(tempId: number, callbackName: string, callback: (message: MyMessage) => Promise) {\n const finalize = this.tempFinalizeCallbacks[tempId] ??= {};\n const obj = 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 const entities = options.entities || [];\n if(text) {\n text = parseMarkdown(text, entities);\n }\n\n const schedule_date = options.scheduleDate || (message.pFlags.is_scheduled ? message.date : undefined);\n return this.apiManager.invokeApi('messages.editMessage', {\n peer: this.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 this.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 async sendText(peerId: PeerId, text: string, options: MessageSendingParams & Partial<{\n entities: MessageEntity[],\n viaBotId: BotId,\n queryId: string,\n resultId: string,\n noWebPage: true,\n replyMarkup: ReplyMarkup,\n clearDraft: true,\n webPage: WebPage,\n }> = {}): Promise {\n if(!text.trim()) {\n return;\n }\n\n options.entities ??= [];\n\n // this.checkSendOptions(options);\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n const config = await this.apiManager.getConfig();\n const MAX_LENGTH = config.message_length_max;\n const splitted = splitStringByLength(text, MAX_LENGTH);\n text = splitted[0];\n if(splitted.length > 1) {\n if(options.webPage?._ === 'webPage' && !text.includes(options.webPage.url)) {\n delete options.webPage;\n }\n }\n\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n const entities = options.entities;\n if(!options.viaBotId) {\n text = parseMarkdown(text, entities);\n // entities = mergeEntities(entities, 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 ? getServerMessageId(options.replyToMsgId) : undefined;\n const isChannel = this.appPeersManager.isChannel(peerId);\n\n if(options.webPage) {\n message.media = {\n _: 'messageMediaWebPage',\n webpage: options.webPage\n };\n }\n\n const toggleError = (error?: ApiError) => {\n this.onMessagesSendError([message], error);\n this.rootScope.dispatchEvent('messages_pending');\n };\n\n message.send = () => {\n toggleError();\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n const sendAs = options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined\n let apiPromise: any;\n if(options.viaBotId) {\n apiPromise = this.apiManager.invokeApiAfter('messages.sendInlineBotResult', {\n peer: this.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 send_as: sendAs\n }, sentRequestOptions);\n } else {\n apiPromise = this.apiManager.invokeApiAfter('messages.sendMessage', {\n no_webpage: options.noWebPage,\n peer: this.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 send_as: sendAs,\n update_stickersets_order: UPDATE_STICKERSET_ORDER\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 defineNotNumerableProperties(message, ['promise']);\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\n // this.reloadConversation(peerId);\n\n // setTimeout(() => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n // }, 5000);\n message.promise.resolve();\n }, (error: ApiError) => {\n toggleError(error);\n message.promise.reject(error);\n throw 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 sequential: true\n });\n\n const promises: ReturnType[] = [message.promise];\n for(let i = 1; i < splitted.length; ++i) {\n promises.push(this.sendText(peerId, splitted[i], options));\n }\n\n return Promise.all(promises).then(noop);\n }\n\n public sendFile(peerId: PeerId, options: MessageSendingParams & SendFileDetails & Partial<{\n isRoundMessage: boolean,\n isVoiceMessage: boolean,\n isGroupedItem: boolean,\n isMedia: boolean,\n\n groupId: string,\n caption: string,\n entities: MessageEntity[],\n background: boolean,\n clearDraft: boolean,\n noSound: boolean,\n\n waveform: Uint8Array,\n\n // ! only for internal use\n processAfter?: typeof processAfter\n }>) {\n const file = options.file;\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n // this.checkSendOptions(options);\n\n const message = this.generateOutgoingMessage(peerId, options);\n const replyToMsgId = options.replyToMsgId ? 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 = parseMarkdown(caption, entities);\n }\n\n const attributes: DocumentAttribute[] = [];\n\n const isPhoto = getEnvironment().IMAGE_MIME_TYPES_SUPPORTED.has(fileType);\n\n const strippedPhotoSize: PhotoSize.photoStrippedSize = options.strippedBytes && {\n _: 'photoStrippedSize',\n bytes: options.strippedBytes,\n type: 'i'\n };\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 const attribute: DocumentAttribute.documentAttributeAudio = {\n _: 'documentAttributeAudio',\n pFlags: {\n voice: options.isVoiceMessage || undefined\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: THUMB_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 if(strippedPhotoSize) {\n photo.sizes.unshift(strippedPhotoSize);\n }\n\n const cacheContext = this.thumbsStorage.getCacheContext(photo, photoSize.type);\n cacheContext.downloaded = file.size;\n cacheContext.url = options.objectURL || '';\n\n photo = this.appPhotosManager.savePhoto(photo);\n } else if(getEnvironment().VIDEO_MIME_TYPES_SUPPORTED.has(fileType as VIDEO_MIME_TYPE)) {\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 || undefined,\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 if(options.objectURL) {\n const cacheContext = this.thumbsStorage.getCacheContext(document);\n cacheContext.downloaded = file.size;\n cacheContext.url = options.objectURL;\n }\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: THUMB_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 = this.thumbsStorage.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(strippedPhotoSize) {\n thumbs.unshift(strippedPhotoSize);\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 = this.appDocsManager.saveDoc(document);\n }\n\n this.log('sendFile', attachType, apiFileName, file.type, options);\n\n const sentDeferred = deferredPromise();\n // sentDeferred.cancel = () => {\n // const error = new Error('Download canceled');\n // error.name = 'AbortError';\n // sentDeferred.reject(error);\n\n // if(uploadPromise?.cancel) {\n // uploadPromise.cancel();\n // }\n // };\n\n const media: MessageMedia = isDocument ? undefined : {\n _: photo ? 'messageMediaPhoto' : 'messageMediaDocument',\n pFlags: {},\n // preloader,\n photo,\n document\n };\n\n if(media) {\n defineNotNumerableProperties(media as any, ['promise']);\n (media as any).promise = sentDeferred;\n\n if(options.spoiler) {\n (media as MessageMedia.messageMediaPhoto).pFlags.spoiler = true;\n }\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;\n\n const uploadingFileName = !isDocument ? getFileNameForUpload(file) : undefined;\n message.uploadingFileName = uploadingFileName;\n\n if(uploadingFileName) {\n this.uploadFilePromises[uploadingFileName] = sentDeferred;\n }\n\n const toggleError = (error?: ApiError) => {\n this.onMessagesSendError([message], error);\n this.rootScope.dispatchEvent('messages_pending');\n };\n\n let uploaded = false,\n uploadPromise: ReturnType = null;\n\n message.send = () => {\n if(isDocument) {\n const inputMedia: InputMedia = {\n _: 'inputMediaDocument',\n id: getDocumentInput(file),\n pFlags: {}\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\n uploadPromise = this.apiFileManager.upload({file, fileName: uploadingFileName});\n uploadPromise.catch((err) => {\n if(!uploaded) {\n this.log('cancelling upload', media);\n\n this.cancelPendingMessage(message.random_id);\n this.setTyping(peerId, {_: 'sendMessageCancelAction'}, undefined, options.threadId);\n sentDeferred.reject(err);\n }\n });\n\n uploadPromise.addNotifyListener((progress: Progress) => {\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}, undefined, options.threadId);\n }\n sentDeferred.notifyAll(progress);\n });\n\n sentDeferred.notifyAll({done: 0, total: file.size});\n }\n\n let thumbUploadPromise: typeof uploadPromise;\n if(attachType === 'video' && options.objectURL && options.thumb?.blob) {\n thumbUploadPromise = this.apiFileManager.upload({file: options.thumb.blob});\n }\n\n uploadPromise && uploadPromise.then(async(inputFile) => {\n /* if(DEBUG) {\n this.log('appMessagesManager: sendFile uploaded:', inputFile);\n } */\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 pFlags: {\n spoiler: options.spoiler || undefined\n }\n };\n break;\n\n default:\n inputMedia = {\n _: 'inputMediaUploadedDocument',\n file: inputFile,\n mime_type: fileType,\n pFlags: {\n force_file: actionName === 'sendMessageUploadDocumentAction' || undefined,\n spoiler: options.spoiler || 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: ApiError) => {\n toggleError(error);\n throw error;\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 processAfter: options.processAfter\n });\n\n if(!options.isGroupedItem) {\n sentDeferred.then((inputMedia) => {\n this.setTyping(peerId, {_: 'sendMessageCancelAction'}, undefined, options.threadId);\n\n return this.apiManager.invokeApi('messages.sendMedia', {\n background: options.background,\n peer: this.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 send_as: options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n }, (error: ApiError) => {\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(error);\n throw error;\n });\n });\n\n sentDeferred.then(message.promise.resolve, message.promise.reject);\n }\n\n const ret: {\n message: typeof message,\n promise: typeof sentDeferred\n } = {\n message\n } as any;\n\n defineNotNumerableProperties(ret, ['promise']);\n ret.promise = sentDeferred;\n\n return ret;\n }\n\n public async sendAlbum(peerId: PeerId, options: MessageSendingParams & {\n isMedia?: boolean,\n entities?: MessageEntity[],\n caption?: string,\n sendFileDetails: SendFileDetails[],\n clearDraft?: boolean\n }) {\n // this.checkSendOptions(options);\n\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n if(options.sendFileDetails.length === 1) {\n return this.sendFile(peerId, {...options, ...options.sendFileDetails[0]});\n }\n\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\n const replyToMsgId = options.replyToMsgId ? getServerMessageId(options.replyToMsgId) : undefined;\n\n let caption = options.caption || '';\n let entities = options.entities || [];\n if(caption) {\n caption = parseMarkdown(caption, entities);\n }\n\n this.log('sendAlbum', options);\n\n const groupId = '' + ++this.groupedTempId;\n\n const callbacks: Array<() => void> = [];\n const processAfter = (cb: () => void) => {\n callbacks.push(cb);\n };\n\n const messages = options.sendFileDetails.map((details, idx) => {\n const o: Parameters[1] = {\n isGroupedItem: true,\n isMedia: options.isMedia,\n scheduleDate: options.scheduleDate,\n silent: options.silent,\n replyToMsgId,\n threadId: options.threadId,\n sendAsPeerId: options.sendAsPeerId,\n groupId,\n processAfter,\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, o).message;\n });\n\n if(options.clearDraft) {\n callbacks.push(() => {\n this.appDraftsManager.clearDraft(peerId, options.threadId);\n });\n }\n\n callbacks.forEach((callback) => {\n callback();\n });\n\n // * test pending\n // return;\n\n const toggleError = (message: Message.message, error?: ApiError) => {\n this.onMessagesSendError([message], error);\n this.rootScope.dispatchEvent('messages_pending');\n };\n\n const inputPeer = this.appPeersManager.getInputPeerById(peerId);\n const invoke = (multiMedia: InputSingleMedia[]) => {\n this.setTyping(peerId, {_: 'sendMessageCancelAction'}, undefined, options.threadId);\n\n const deferred = deferredPromise();\n this.sendSmthLazyLoadQueue.push({\n load: () => {\n return this.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 send_as: options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined,\n update_stickersets_order: UPDATE_STICKERSET_ORDER\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n deferred.resolve();\n }, (error: ApiError) => {\n messages.forEach((message) => toggleError(message, error));\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 Promise.all([\n inputMedia,\n this.apiManager.invokeApi('messages.uploadMedia', {\n peer: inputPeer,\n media: inputMedia\n })\n ]);\n })\n .then(([originalInputMedia, messageMedia]) => {\n let inputMedia: InputMedia;\n if(messageMedia._ === 'messageMediaPhoto') {\n const photo = this.appPhotosManager.savePhoto(messageMedia.photo);\n inputMedia = getPhotoMediaInput(photo);\n } else if(messageMedia._ === 'messageMediaDocument') {\n const doc = this.appDocsManager.saveDoc(messageMedia.document);\n inputMedia = getDocumentMediaInput(doc);\n }\n\n // copy original flags\n const copyProperties: (keyof InputMedia.inputMediaPhoto)[] = [\n 'pFlags',\n 'ttl_seconds'\n ];\n\n copyProperties.forEach((property) => {\n // @ts-ignore\n inputMedia[property] = originalInputMedia[property] ?? inputMedia[property];\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: ApiError) => {\n this.log.error('sendAlbum upload item error:', err, message);\n toggleError(message, err);\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, this.appUsersManager.getContactMediaInput(contactPeerId));\n }\n\n public sendOther(\n peerId: PeerId,\n inputMedia: InputMedia | {_: 'messageMediaPending', messageMedia: MessageMedia},\n options: MessageSendingParams & Partial<{\n viaBotId: BotId,\n replyMarkup: ReplyMarkup,\n clearDraft: true,\n queryId: string\n resultId: string,\n geoPoint: GeoPoint\n }> = {}\n ) {\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n // this.checkSendOptions(options);\n const message = this.generateOutgoingMessage(peerId, options);\n const replyToMsgId = options.replyToMsgId ? 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 this.appPollsManager.savePoll(inputMedia.poll, {\n _: 'pollResults',\n flags: 4,\n total_voters: 0,\n pFlags: {},\n recent_voters: []\n });\n\n const {poll, results} = this.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: this.appPhotosManager.getPhoto((inputMedia.id as InputPhoto.inputPhoto).id),\n pFlags: {}\n };\n break;\n }\n\n case 'inputMediaDocument': {\n const doc = this.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 pFlags: {}\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 case 'messageMediaPending': {\n media = (inputMedia as any).messageMedia;\n break;\n }\n }\n\n message.media = media;\n\n const toggleError = (error?: ApiError) => {\n this.onMessagesSendError([message], error);\n this.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 const sendAs = options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined;\n let apiPromise: Promise;\n if(options.viaBotId) {\n apiPromise = this.apiManager.invokeApiAfter('messages.sendInlineBotResult', {\n peer: this.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 send_as: sendAs\n }, sentRequestOptions);\n } else {\n apiPromise = this.apiManager.invokeApiAfter('messages.sendMedia', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n media: inputMedia as 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 send_as: sendAs,\n update_stickersets_order: UPDATE_STICKERSET_ORDER\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 this.apiUpdatesManager.processUpdateMessage(updates);\n }, (error: ApiError) => {\n toggleError(error);\n throw 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 sequential: true\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: Pick & Partial<{\n isGroupedItem: boolean,\n isScheduled: boolean,\n clearDraft: boolean,\n sequential: boolean,\n processAfter?: (cb: () => void) => void\n }> = {}) {\n const messageId = message.id;\n const peerId = this.getMessagePeer(message);\n const storage = options.isScheduled ? this.getScheduledMessagesStorage(peerId) : this.getHistoryMessagesStorage(peerId);\n message.storageKey = storage.key;\n const callbacks: Array<() => void> = [];\n if(options.isScheduled) {\n // if(!options.isGroupedItem) {\n this.saveMessages([message], {storage, isScheduled: true, isOutgoing: true});\n callbacks.push(() => {\n this.rootScope.dispatchEvent('scheduled_new', message);\n });\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 this.saveMessages([message], {storage, isOutgoing: true});\n this.setDialogTopMessage(message);\n\n if(options.threadId) {\n const forumTopic = this.dialogsStorage.getForumTopic(peerId, options.threadId);\n if(forumTopic) {\n this.setDialogTopMessage(message, forumTopic);\n }\n }\n\n callbacks.push(() => {\n this.rootScope.dispatchEvent('history_append', {storageKey: storage.key, message});\n });\n }\n\n const pending: PendingMessageDetails = this.pendingByRandomId[message.random_id] = {\n peerId,\n tempId: messageId,\n threadId: options.threadId,\n storage,\n sequential: options.sequential\n };\n\n this.pendingTopMsgs[peerId] = messageId;\n\n if(!options.isGroupedItem && message.send) {\n callbacks.push(() => {\n if(options.clearDraft) {\n this.appDraftsManager.clearDraft(peerId, options.threadId);\n }\n\n message.send();\n });\n }\n\n if(callbacks.length) {\n (options.processAfter || processAfter)(() => {\n for(const callback of callbacks) {\n callback();\n }\n });\n }\n\n return pending;\n }\n\n private generateOutgoingMessage(peerId: PeerId, options: MessageSendingParams & Partial<{\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 = this.appPeersManager.isBroadcast(peerId);\n if(isBroadcast) {\n const chat = this.appPeersManager.getPeer(peerId) as Chat.channel;\n if(chat.pFlags.signatures) {\n const user = this.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: options.sendAsPeerId ? this.appPeersManager.getOutputPeer(options.sendAsPeerId) : this.generateFromId(peerId),\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n post_author: postAuthor,\n pFlags: this.generateFlags(peerId),\n date: options.scheduleDate || (tsNow(true) + this.timeManager.getServerTimeOffset()),\n message: '',\n grouped_id: options.groupId,\n random_id: randomLong(),\n reply_to: this.generateReplyHeader(peerId, 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 };\n\n defineNotNumerableProperties(message, ['send', 'promise']);\n if(options.groupId === undefined) {\n message.promise = deferredPromise();\n }\n\n return message;\n }\n\n private generateReplyHeader(peerId: PeerId, replyToMsgId: number, replyToTopId?: number) {\n const isForum = this.appPeersManager.isForum(peerId);\n if(isForum && !replyToTopId) {\n const originalMessage = this.getMessageByPeer(peerId, replyToMsgId);\n if(originalMessage) {\n replyToTopId = getMessageThreadId(originalMessage, true);\n }\n }\n\n const header: MessageReplyHeader = {\n _: 'messageReplyHeader',\n reply_to_msg_id: replyToMsgId || replyToTopId,\n pFlags: {}\n };\n\n if(replyToTopId && isForum && GENERAL_TOPIC_ID !== replyToTopId) {\n header.pFlags.forum_topic = true;\n }\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(this.appPeersManager.isBroadcast(peerId)) {\n const channelFull = this.appProfileManager.getCachedFullChat(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(this.appPeersManager.isAnyChat(peerId) && (this.appPeersManager.isBroadcast(peerId) || this.isAnonymousSending(peerId))) {\n return undefined;\n } else {\n return this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId());\n }\n }\n\n private generateFlags(peerId: PeerId) {\n const pFlags: Message.message['pFlags'] = {};\n const fromId = this.appUsersManager.getSelf().id;\n if(peerId !== fromId) {\n pFlags.out = true;\n\n if(!this.appPeersManager.isChannel(peerId) && !this.appUsersManager.isBot(peerId)) {\n pFlags.unread = true;\n }\n }\n\n if(this.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 = this.appUsersManager.getSelf().id.toPeerId();\n const fromId = originalMessage.fromId;\n if(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 pFlags: {}\n };\n\n let isUserHidden = false;\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.post_author = originalMessage.post_author;\n\n if(fromId.isUser()) {\n const userFull = this.appProfileManager.getCachedFullUser(fromId.toUserId());\n if(userFull?.private_forward_name) {\n fwdHeader.from_name = userFull.private_forward_name;\n isUserHidden = true;\n }\n }\n\n if(!isUserHidden) {\n fwdHeader.from_id = this.appPeersManager.getOutputPeer(fromId);\n }\n }\n\n if(this.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 if(peerId === myId && !isUserHidden) {\n fwdHeader.saved_from_msg_id = originalMessage.id;\n fwdHeader.saved_from_peer = this.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: Message.messageService = {\n _: 'messageService',\n pFlags: {},\n action: {\n _: 'messageActionChannelEditPhoto',\n photo\n },\n id: maxId,\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n mid: maxId,\n peerId,\n date: (photo as Photo.photo).date,\n fromId: peerId\n };\n\n this.getHistoryMessagesStorage(peerId).set(maxId, message);\n return message;\n }\n\n public getUploadPromise(uploadFileName: string) {\n return this.uploadFilePromises[uploadFileName];\n }\n\n public isAnonymousSending(peerId: PeerId): boolean {\n if(!peerId.isAnyChat()) {\n return false;\n }\n\n const chat = this.appPeersManager.getPeer(peerId);\n return (chat as Chat.channel).admin_rights?.pFlags?.anonymous;\n }\n\n public setDialogTopMessage(\n message: MyMessage,\n dialog: MTDialog.dialog | ForumTopic = this.getDialogOnly(message.peerId)\n ) {\n if(!dialog) {\n return;\n }\n\n dialog.top_message = message.mid;\n\n const historyStorage = this.getHistoryStorage(message.peerId, dialog._ === 'forumTopic' ? dialog.id : undefined);\n historyStorage.maxId = message.mid;\n\n this.dialogsStorage.generateIndexForDialog(dialog, false, message);\n\n this.scheduleHandleNewDialogs(message.peerId, dialog);\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 this.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 = getPeerId(dialog.peer);\n const mid = 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(folderId = GLOBAL_FOLDER_ID): Promise {\n const middleware = this.middleware.get();\n while(!this.dialogsStorage.isDialogsLoaded(folderId)) {\n const result = await this.getTopMessages({limit: 100, folderId});\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 getReadMaxIdIfUnread(peerId: PeerId, threadId?: number) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n if(threadId && !this.appChatsManager.isForum(peerId.toChatId())) {\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 // readMaxId can be 4294967295 (0)\n return !message?.pFlags?.out && readMaxId < historyStorage.maxId && getServerMessageId(readMaxId) ? readMaxId : 0;\n }\n }\n\n // public lolSet = new Set();\n public getTopMessages({limit, folderId}: {\n limit: number,\n folderId: number\n }) {\n // const dialogs = this.dialogsStorage.getFolder(folderId);\n const offsetId = 0;\n let offsetPeerId: PeerId;\n let offsetIndex = 0;\n\n let offsetDate = this.dialogsStorage.getOffsetDate(folderId);\n if(offsetDate) {\n offsetIndex = offsetDate * 0x10000;\n offsetDate += this.timeManager.getServerTimeOffset();\n }\n\n const useLimit = 100;\n const middleware = this.middleware.get();\n const peerId = this.dialogsStorage.isFilterIdForForum(folderId) ? folderId : undefined;\n\n const processResult = (result: MessagesDialogs | MessagesForumTopics) => {\n if(!middleware() || result._ === 'messages.dialogsNotModified') return null;\n\n if(DEBUG) {\n this.log('messages.getDialogs result:', result);\n }\n\n // can reset pinned order here\n if(!peerId && !offsetId && !offsetDate && !offsetPeerId && folderId !== GLOBAL_FOLDER_ID) {\n this.dialogsStorage.resetPinnedOrder(folderId);\n }\n\n if(!peerId && !offsetDate) {\n // telegramMeWebManager.setAuthorized(true);\n this.appDraftsManager.addMissedDialogs();\n }\n\n this.appUsersManager.saveApiUsers(result.users);\n this.appChatsManager.saveApiChats(result.chats);\n this.saveMessages(result.messages);\n\n let maxSeenIdIncremented = offsetDate ? true : false;\n let hasPrepend = false;\n const noIdsDialogs: BroadcastEvents['dialogs_multiupdate'] = new Map();\n const setFolderId: REAL_FOLDER_ID = folderId === GLOBAL_FOLDER_ID ? FOLDER_ID_ALL : folderId as REAL_FOLDER_ID;\n const saveGlobalOffset = !!peerId || folderId === GLOBAL_FOLDER_ID;\n const items: Array =\n (result as MessagesDialogs.messagesDialogsSlice).dialogs as Dialog[] ||\n (result as MessagesForumTopics).topics as ForumTopic[];\n forEachReverse(items, (dialog) => {\n if(!dialog) {\n return;\n }\n\n // const d = Object.assign({}, dialog);\n // ! ะฝัƒะถะฝะพ ะฟะตั€ะตะดะฐะฒะฐั‚ัŒ folderId, ั‚ะฐะบ ะบะฐะบ ะฟะพ ะฟะฐะฟะบะต !== 0 ะฝะตั‚ ัะฒะพะนัั‚ะฒะฐ folder_id\n if(!peerId) {\n (dialog as Dialog).folder_id ??= setFolderId;\n }\n\n this.dialogsStorage.saveDialog({\n dialog,\n ignoreOffsetDate: true,\n saveGlobalOffset\n });\n\n if(dialog.peerId === undefined) {\n this.log.error('bugged dialog?', dialog);\n debugger;\n return;\n }\n\n if(!maxSeenIdIncremented &&\n !this.appPeersManager.isChannel(dialog.peerId || this.appPeersManager.getPeerId(dialog.peer))) {\n this.incrementMaxSeenId(dialog.top_message);\n maxSeenIdIncremented = true;\n }\n\n // if(!folderId && !dialog.folder_id) {\n // this.lolSet.add(dialog.peerId);\n // }\n\n if(offsetIndex && getDialogIndex(dialog) > offsetIndex) {\n this.scheduleHandleNewDialogs(dialog.peerId, dialog);\n hasPrepend = true;\n }\n\n // ! ัั‚ะพ ะผะพะถะตั‚ ัะปัƒั‡ะธั‚ัŒัั, ะตัะปะธ ะทะฐะฟั€ะพั ะธะดั‘ั‚ ะฝะต ะฟะพ ะฟะฐะฟะบะต 0, ะฐ ะฟะพ 1. ะฟะพั‡ะตะผัƒ-ั‚ะพ read'ะพะฒ ะฝะตั‚\n // ! ะฒ ะธั‚ะพะณะต, ั‡ั‚ะพะฑั‹ ะฟะพะปัƒั‡ะธั‚ัŒ 1 ะดะธะฐะปะพะณ, ะดะตะปะฐะตั‚ัั ะฟะตั€ะฒั‹ะน ะทะฐะฟั€ะพั ะฟะพ ะฟะฐะฟะบะต 0, ะฟะพั‚ะพะผ ะทะฐะฟั€ะพั ะดะปั ะฐั€ั…ะธะฒะฝั‹ั… ะฟะพ ะฟะฐะฟะบะต 1, ะธ ะฟะพั‚ะพะผ ะตั‰ั‘ ะฟะตั€ะตะทะฐะณั€ัƒะทะบะฐ ะฐั€ั…ะธะฒะฝะพะณะพ ะดะธะฐะปะพะณะฐ\n if(!peerId && !getServerMessageId(dialog.read_inbox_max_id) && !getServerMessageId(dialog.read_outbox_max_id)) {\n noIdsDialogs.set(dialog.peerId, {dialog: dialog as Dialog});\n\n this.log.error('noIdsDialogs', dialog, params);\n } else if(dialog.top_message) { // * fix sending status\n const topMessage = this.getMessageByPeer(dialog.peerId, dialog.top_message);\n if(topMessage) {\n this.setMessageUnreadByDialog(topMessage, dialog);\n this.dialogsStorage.setDialogToState(dialog);\n }\n }\n });\n\n if(noIdsDialogs.size) {\n // setTimeout(() => { // test bad situation\n const peerIds = [...noIdsDialogs.keys()];\n const promises = peerIds.map((peerId) => this.reloadConversation(peerId));\n Promise.all(promises).then(() => {\n this.rootScope.dispatchEvent('dialogs_multiupdate', noIdsDialogs);\n\n for(let i = 0; i < peerIds.length; ++i) {\n const peerId = peerIds[i];\n this.rootScope.dispatchEvent('dialog_unread', {\n peerId,\n dialog: this.getDialogOnly(peerId)\n });\n }\n });\n // }, 10e3);\n }\n\n const count = (result 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 const dialog = folderDialogs[i];\n if(getServerMessageId(dialog.top_message)) {\n ++dialogsLength;\n } else {\n this.log.error('something strange with dialog', dialog);\n }\n }\n\n const isEnd = /* limit > dialogsResult.dialogs.length || */\n !count ||\n dialogsLength >= count ||\n !items.length;\n if(isEnd) {\n this.dialogsStorage.setDialogsLoaded(folderId, true);\n }\n\n if(hasPrepend) {\n this.scheduleHandleNewDialogs();\n } else {\n this.rootScope.dispatchEvent('dialogs_multiupdate', new Map());\n }\n\n const dialogs = items;\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 let promise: Promise>, params: any;\n if(peerId) {\n promise = this.apiManager.invokeApiSingleProcess({\n method: 'channels.getForumTopics',\n params: params = {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n limit: useLimit,\n offset_date: offsetDate,\n offset_id: offsetId,\n offset_topic: 0\n },\n options: {\n // timeout: APITIMEOUT,\n noErrorBox: true\n },\n processResult: (result) => {\n result = this.dialogsStorage.processTopics(peerId, result);\n return processResult(result);\n }\n });\n } else {\n // ! ะ’ะะ˜ะœะะะ˜ะ•: ะžะงะ•ะะฌ ะกะ›ะžะ–ะะะฏ ะ›ะžะ“ะ˜ะšะ:\n // ! ะตัะปะธ ะดะตะปะฐั‚ัŒ ะทะฐะฟั€ะพั ัะฝะฐั‡ะฐะปะฐ ะฟะพ ะฟะฐะฟะบะต 0, ะฟะพั‚ะพะผ ะฟะพ ะฟะฐะฟะบะต 1, ะฟะพ ะธะฝะดะตะบััƒ 0 ะฒ ะผะฐััะธะฒะต ะฑัƒะดะตั‚ ะพะดะธะฝ ะธ ั‚ะพั‚ ะถะต ะดะธะฐะปะพะณ, ั dialog.pFlags.pinned, ะ›ะžะ›???\n // ! ั‚.ะต., ั ะทะฐะฟั€ะพัะพะผ folder_id: 1, ะธ exclude_pinned: 0, ะฒ ั€ะตะทัƒะปัŒั‚ะฐั‚ะต ะฑัƒะดัƒั‚ ะตั‰ั‘ ะธ ะทะฐะบั€ะตะฟะปั‘ะฝะฝั‹ะต ั ะฟะฐะฟะบะธ 0\n promise = this.apiManager.invokeApiSingleProcess({\n method: 'messages.getDialogs',\n params: params = {\n folder_id: folderId,\n offset_date: offsetDate,\n offset_id: offsetId,\n offset_peer: this.appPeersManager.getInputPeerById(offsetPeerId),\n limit: useLimit,\n hash: '0'\n },\n options: {\n // timeout: APITIMEOUT,\n noErrorBox: true\n },\n processResult\n });\n }\n\n return promise;\n }\n\n public async forwardMessages(peerId: PeerId, fromPeerId: PeerId, mids: number[], options: MessageSendingParams & Partial<{\n withMyScore: true,\n dropAuthor: boolean,\n dropCaptions: boolean\n }> = {}) {\n delete options.replyToMsgId;\n delete options.threadId;\n\n peerId = this.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 = this.getMessageByPeer(fromPeerId, mid) as Message.message;\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 --length;\n }\n }\n\n if(!mids.length) {\n return Promise.resolve();\n }\n\n const config = await this.apiManager.getConfig();\n const overflowMids = mids.splice(config.forwarded_count_max, mids.length - config.forwarded_count_max);\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 newMids: number[] = [];\n const newMessages = mids.map((mid) => {\n const originalMessage = this.getMessageByPeer(fromPeerId, mid) as Message.message;\n const message: Message.message = this.generateOutgoingMessage(peerId, options);\n newMids.push(message.id);\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 if(message.fwd_from?.from_name && peerId === this.appPeersManager.peerId) {\n delete message.from_id;\n }\n }\n\n if(!options.dropCaptions || !originalMessage.media) {\n keys.push('message');\n }\n\n const replyToMid = originalMessage.reply_to?.reply_to_msg_id;\n const replyToMessageIdx = mids.indexOf(replyToMid);\n if(replyToMid && replyToMessageIdx !== -1) {\n const newReplyToMid = newMids[replyToMessageIdx];\n message.reply_to = {\n _: 'messageReplyHeader',\n reply_to_msg_id: newReplyToMid,\n pFlags: {}\n };\n\n /* this.invokeAfterMessageIsSent(newReplyToMid, 'reply', async(originalMessage) => {\n message.reply_to.reply_to_msg_id = originalMessage.mid;\n }); */\n }\n\n keys.forEach((key) => {\n // @ts-ignore\n message[key] = copy(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 if(document.sticker && !this.rootScope.premium) {\n const effectThumb = getStickerEffectThumb(document);\n if(effectThumb) {\n (message.media as MessageMedia.messageMediaDocument).pFlags.nopremium = true;\n }\n }\n }\n\n if(originalMessage.grouped_id) {\n const group = 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 sequential: true\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() : */this.apiManager.invokeApiAfter('messages.forwardMessages', {\n from_peer: this.appPeersManager.getInputPeerById(fromPeerId),\n id: mids.map((mid) => getServerMessageId(mid)),\n random_id: newMessages.map((message) => message.random_id),\n to_peer: this.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 send_as: options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined\n }, sentRequestOptions).then((updates) => {\n this.log('forwardMessages updates:', updates);\n this.apiUpdatesManager.processUpdateMessage(updates);\n }, (error: ApiError) => {\n this.onMessagesSendError(newMessages, error);\n throw error;\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n\n const promises: (typeof promise)[] = [promise];\n if(overflowMids.length) {\n promises.push(this.forwardMessages(peerId, fromPeerId, overflowMids, options));\n }\n\n return Promise.all(promises).then(noop);\n }\n\n public generateEmptyMessage(mid: number): Message.message | Message.messageService {\n return undefined;\n // return {\n // _: 'messageEmpty',\n // id: getServerMessageId(mid),\n // mid,\n // deleted: true,\n // pFlags: {}\n // };\n }\n\n private onMessagesSendError(messages: Message.message[], error?: ApiError) {\n messages.forEach((message) => {\n if(message.error === error) {\n return;\n }\n\n if(error) {\n message.error = error;\n this.rootScope.dispatchEvent('message_error', {storageKey: message.storageKey, tempId: message.mid, error});\n\n const dialog = this.getDialogOnly(message.peerId);\n if(dialog) {\n this.rootScope.dispatchEvent('dialog_unread', {peerId: message.peerId, dialog});\n }\n } else {\n delete message.error;\n }\n });\n }\n\n public getMessagesStorageByKey(key: MessagesStorageKey) {\n const s = key.split('_');\n const peerId: PeerId = +s[0];\n const type: MessagesStorageType = s[1] as any;\n return type === 'scheduled' ? this.getScheduledMessagesStorage(peerId) : this.getHistoryMessagesStorage(peerId);\n }\n\n public getMessageFromStorage(storage: MessagesStorage | MessagesStorageKey, mid: number) {\n if(typeof(storage) === 'string') {\n storage = this.getMessagesStorageByKey(storage);\n }\n\n return storage && storage.get(mid)/* || this.generateEmptyMessage(mid) */;\n }\n\n private createMessageStorage(peerId: PeerId, type: MessagesStorageType) {\n const storage: MessagesStorage = new Map() as any;\n storage.peerId = peerId;\n storage.type = type;\n storage.key = `${peerId}_${type}`;\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 getHistoryMessagesStorage(peerId: PeerId) {\n return this.messagesStorageByPeerId[peerId] ??= this.createMessageStorage(peerId, 'history');\n }\n\n public getMessagesStorage(key: MessagesStorageKey | MessagesStorage): MessagesStorage {\n if(typeof(key) === 'object') {\n return key;\n } else {\n return this.getMessagesStorageByKey(key);\n }\n }\n\n public getMessageById(messageId: number) {\n for(const peerId in this.messagesStorageByPeerId) {\n if(this.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.getHistoryMessagesStorage(peerId), messageId);\n }\n\n public getMessagePeer(message: any): PeerId {\n const toId = message.peer_id && this.appPeersManager.getPeerId(message.peer_id) || NULL_PEER_ID;\n\n return toId;\n }\n\n public getDialogOnly(peerId: PeerId) {\n return this.dialogsStorage.getDialogOnly(peerId);\n }\n\n public cantForwardDeleteMids(storageKey: MessagesStorageKey, mids: number[]) {\n const storage = this.getMessagesStorage(storageKey);\n let cantForward = !mids.length, cantDelete = !mids.length;\n for(const mid of mids) {\n const message = this.getMessageFromStorage(storage, mid);\n if(!cantForward) {\n cantForward = !this.canForward(message);\n }\n\n if(!cantDelete) {\n cantDelete = !this.canDeleteMessage(message);\n }\n\n if(cantForward && cantDelete) break;\n }\n\n return {cantForward, cantDelete};\n }\n\n public reloadConversationOrTopic(peerId: PeerId, threadId?: number) {\n if(threadId) {\n this.dialogsStorage.getForumTopicById(peerId, threadId);\n } else {\n this.reloadConversation(peerId);\n }\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 = this.appPeersManager.getPeerId(inputPeer);\n this.log.warn('reloadConversation', peerId);\n\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: this.appPeersManager.getInputDialogPeerById(inputPeer),\n promise\n });\n }\n\n if(this.reloadConversationsPromise) {\n return promise || this.reloadConversationsPromise;\n }\n\n this.reloadConversationsPromise = pause(0).then(() => {\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 const fullfillLeft = () => {\n for(const peerId in promises) {\n this.reloadConversationsPeers.delete(+peerId);\n promises[peerId].resolve(undefined);\n }\n };\n\n const invoke = async() => {\n for(;;) {\n const result = await this.apiManager.invokeApi('messages.getPeerDialogs', {peers: inputDialogPeers});\n const currentState = this.apiUpdatesManager.updatesState;\n const {state} = result;\n if(currentState.pts && currentState.pts !== state.pts) {\n await pause(500);\n continue;\n }\n\n return result;\n }\n };\n\n return invoke().then((result) => {\n for(const peerId in promises) {\n this.reloadConversationsPeers.delete(+peerId);\n }\n\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 }, noop).then(() => {\n fullfillLeft();\n\n this.reloadConversationsPromise = null;\n if(this.reloadConversationsPeers.size) {\n this.reloadConversation();\n }\n });\n });\n\n return promise || this.reloadConversationsPromise;\n }\n\n private doFlushHistory(peerId: PeerId, just_clear?: boolean, revoke?: boolean, threadId?: number): Promise {\n let promise: Promise;\n const processResult = (affectedHistory: MessagesAffectedHistory) => {\n this.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(peerId, just_clear, revoke, threadId);\n };\n\n if(!threadId) {\n promise = this.apiManager.invokeApiSingleProcess({\n method: 'messages.deleteHistory',\n params: {\n just_clear,\n revoke,\n peer: this.appPeersManager.getInputPeerById(peerId),\n max_id: 0\n },\n processResult\n });\n } else {\n promise = this.apiManager.invokeApiSingleProcess({\n method: 'channels.deleteTopicHistory',\n params: {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n top_msg_id: getServerMessageId(threadId)\n },\n processResult\n });\n }\n\n return promise;\n }\n\n public async flushHistory(peerId: PeerId, justClear?: boolean, revoke?: boolean, threadId?: number) {\n if(this.appPeersManager.isChannel(peerId) && !threadId) {\n const promise = this.getHistory(peerId, 0, 1);\n\n const historyResult = await promise;\n\n const channelId = peerId.toChatId();\n const maxId = historyResult.history[0] || 0;\n return this.apiManager.invokeApiSingle('channels.deleteHistory', {\n channel: this.appChatsManager.getChannelInput(channelId),\n max_id: getServerMessageId(maxId)\n }).then((bool) => {\n if(bool) {\n this.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(peerId, justClear, revoke, threadId).then(() => {\n if(!threadId) {\n this.flushStoragesByPeerId(peerId);\n }\n\n if(justClear) {\n this.rootScope.dispatchEvent('dialog_flush', {peerId, dialog: this.getDialogOnly(peerId)});\n } else {\n const key = this.getTypingKey(peerId, threadId);\n delete this.notificationsToHandle[key];\n delete this.typings[key];\n\n if(!threadId) {\n const c = this.reloadConversationsPeers.get(peerId);\n if(c) {\n this.reloadConversationsPeers.delete(peerId);\n c.promise.resolve(undefined);\n }\n }\n\n this.dialogsStorage.dropDialogOnDeletion(peerId, threadId);\n }\n });\n }\n\n private flushStoragesByPeerId(peerId: PeerId) {\n [\n this.historiesStorage,\n this.threadsStorage,\n this.searchesStorage,\n this.pendingAfterMsgs,\n this.pendingTopMsgs\n ].forEach((s) => {\n delete s[peerId];\n });\n\n for(const key in this.pinnedMessages) {\n if(+key === peerId || key.startsWith(peerId + '_')) {\n delete this.pinnedMessages[key];\n }\n }\n\n const needSingleMessages = this.needSingleMessages.get(peerId);\n if(needSingleMessages) {\n for(const [mid, promise] of needSingleMessages) {\n promise.resolve(this.generateEmptyMessage(mid));\n }\n\n needSingleMessages.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 this.dialogsStorage.flushForumTopicsCache(peerId);\n }\n\n public hidePinnedMessages(peerId: PeerId) {\n return Promise.all([\n this.appStateManager.getState(),\n this.getPinnedMessage(peerId)\n ])\n .then(([state, pinned]) => {\n state.hiddenPinnedMessages[peerId] = pinned.maxId;\n this.rootScope.dispatchEvent('peer_pinned_hidden', {peerId, maxId: pinned.maxId});\n });\n }\n\n public getPinnedMessagesKey(peerId: PeerId, threadId?: number) {\n return peerId + (threadId ? '_' + threadId : '');\n }\n\n public getPinnedMessage(peerId: PeerId, threadId?: number) {\n const p = this.pinnedMessages[this.getPinnedMessagesKey(peerId, threadId)] ??= {};\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 threadId\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 getPinnedMessagesCount(peerId: PeerId, threadId?: number) {\n return this.pinnedMessages[this.getPinnedMessagesKey(peerId, threadId)]?.count;\n }\n\n public getPinnedMessagesMaxId(peerId: PeerId, threadId?: number) {\n return this.pinnedMessages[this.getPinnedMessagesKey(peerId, threadId)]?.maxId;\n }\n\n public updatePinnedMessage(peerId: PeerId, mid: number, unpin?: boolean, silent?: boolean, pm_oneside?: boolean) {\n return this.apiManager.invokeApi('messages.updatePinnedMessage', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n unpin,\n silent,\n pm_oneside,\n id: getServerMessageId(mid)\n }).then((updates) => {\n // this.log('pinned updates:', updates);\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public unpinAllMessages(peerId: PeerId): Promise {\n return this.apiManager.invokeApiSingle('messages.unpinAllMessages', {\n peer: this.appPeersManager.getInputPeerById(peerId)\n }).then((affectedHistory) => {\n this.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.getHistoryMessagesStorage(peerId);\n storage.forEach((message) => {\n if((message as Message.message).pFlags.pinned) {\n delete (message as Message.message).pFlags.pinned;\n }\n });\n\n this.rootScope.dispatchEvent('peer_pinned_messages', {peerId, unpinAll: true});\n delete this.pinnedMessages[this.getPinnedMessagesKey(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 return getAlbumText(Array.from(group.values()) as Message.message[]);\n }\n\n public getGroupsFirstMessage(message: Message.message) {\n if(!message?.grouped_id) return message;\n\n const storage = this.groupedMessagesStorage[message.grouped_id];\n let minMid = Number.MAX_SAFE_INTEGER;\n for(const [mid, message] of storage) {\n if(message.mid < minMid) {\n minMid = message.mid;\n }\n }\n\n return this.getMessageFromStorage(storage, minMid) as Message.message;\n }\n\n public getMidsByAlbum(groupedId: string, sort: 'asc' | 'desc' = 'asc') {\n return getObjectKeysAndSort(this.groupedMessagesStorage[groupedId], sort);\n }\n\n public getMessagesByAlbum(groupedId: string) {\n const mids = this.getMidsByAlbum(groupedId, 'asc');\n const storage = this.groupedMessagesStorage[groupedId];\n return mids.map((mid) => this.getMessageFromStorage(storage, mid) as Message.message);\n }\n\n public getMidsByMessage(message: Message) {\n if(!message) return [];\n else 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: MyMessage, verify: (message: MyMessage) => boolean) {\n const out: MyMessage[] = [];\n if((message as Message.message).grouped_id) {\n const storage = this.groupedMessagesStorage[(message as Message.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 this.appMessagesIdsManager.generateTempMessageId(dialog?.top_message || 0);\n }\n\n public setMessageUnreadByDialog(message: MyMessage, dialog: Dialog | ForumTopic = this.getDialogOnly(message.peerId)) {\n if(dialog && message.mid) {\n if(message.mid > dialog[message.pFlags.out ?\n 'read_outbox_max_id' :\n 'read_inbox_max_id']) {\n message.pFlags.unread = true;\n }\n }\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 || message._ === 'messageEmpty') {\n return;\n }\n\n message.pFlags ??= {};\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.getHistoryMessagesStorage(peerId);\n const isChannel = message.peer_id._ === 'peerChannel';\n const isBroadcast = isChannel && this.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 = 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.createMessageStorage(peerId, 'grouped');\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 // this.log(dT(), 'msg unread', mid, apiMessage.pFlags.out, dialog && dialog[apiMessage.pFlags.out ? 'read_outbox_max_id' : 'read_inbox_max_id'])\n\n const replyTo = message.reply_to;\n if(replyTo) {\n if(replyTo.reply_to_msg_id) {\n replyTo.reply_to_msg_id = message.reply_to_mid = generateMessageId(replyTo.reply_to_msg_id);\n }\n\n if(replyTo.reply_to_top_id) {\n replyTo.reply_to_top_id = generateMessageId(replyTo.reply_to_top_id);\n }\n }\n\n const replies = isMessage && message.replies;\n if(replies) {\n if(replies.max_id) replies.max_id = generateMessageId(replies.max_id);\n if(replies.read_max_id) replies.read_max_id = generateMessageId(replies.read_max_id);\n }\n\n const overwriting = !!peerId;\n if(!overwriting) {\n message.date -= this.timeManager.getServerTimeOffset();\n }\n\n // storage.generateIndex(message);\n const myId = this.appPeersManager.peerId;\n\n const fwdHeader = isMessage && (message as Message.message).fwd_from;\n\n message.peerId = peerId;\n if(peerId === myId/* && !message.from_id && !message.fwd_from */) {\n message.fromId = fwdHeader ? (fwdHeader.from_id ? this.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 : this.appPeersManager.getPeerId(message.from_id);\n }\n\n this.setMessageUnreadByDialog(message);\n\n if(fwdHeader) {\n // if(peerId === myID) {\n if(fwdHeader.saved_from_msg_id) fwdHeader.saved_from_msg_id = generateMessageId(fwdHeader.saved_from_msg_id);\n if(fwdHeader.channel_post) fwdHeader.channel_post = 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 = this.appPeersManager.getPeerId(peer);\n const savedFromMid = 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 = this.appPeersManager.getPeerId(fwdHeader.from_id);\n\n if(!overwriting) {\n fwdHeader.date -= this.timeManager.getServerTimeOffset();\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 let unsupported = false;\n const media = isMessage && message.media;\n if(media) {\n switch(media._) {\n case 'messageMediaEmpty': {\n delete message.media;\n break;\n }\n\n case 'messageMediaPhoto': {\n if(media.ttl_seconds) {\n unsupported = true;\n } else {\n media.photo = this.appPhotosManager.savePhoto(media.photo, mediaContext);\n }\n\n if(!(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 = this.appPollsManager.savePoll(media.poll, media.results, message);\n media.poll = result.poll;\n media.results = result.results;\n break;\n }\n\n case 'messageMediaDocument': {\n if(media.ttl_seconds) {\n unsupported = true;\n } else {\n const originalDoc = media.document;\n media.document = this.appDocsManager.saveDoc(originalDoc, mediaContext); // 11.04.2020 warning\n\n if(!media.document && originalDoc._ !== 'documentEmpty') {\n unsupported = true;\n }\n }\n\n break;\n }\n\n case 'messageMediaWebPage': {\n const messageKey = this.appWebPagesManager.getMessageKeyForPendingWebPage(peerId, mid, options.isScheduled);\n media.webpage = this.appWebPagesManager.saveWebPage(media.webpage, messageKey, mediaContext);\n\n if(!media.webpage) {\n delete message.media;\n }\n\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 media.photo = this.appWebDocsManager.saveWebDocument(media.photo);\n const extendedMedia = media.extended_media;\n if(extendedMedia?._ === 'messageExtendedMedia') {\n const extendedMediaMedia = extendedMedia.media;\n (extendedMediaMedia as MessageMedia.messageMediaPhoto).photo = this.appPhotosManager.savePhoto((extendedMediaMedia as MessageMedia.messageMediaPhoto).photo, mediaContext);\n (extendedMediaMedia as MessageMedia.messageMediaDocument).document = this.appDocsManager.saveDoc((extendedMediaMedia as MessageMedia.messageMediaDocument).document, mediaContext);\n }\n break;\n }\n\n case 'messageMediaUnsupported': {\n unsupported = true;\n break;\n }\n }\n }\n\n // if(isMessage && !unsupported && message.entities) {\n // unsupported = message.entities.some((entity) => entity._ === 'messageEntityCustomEmoji');\n // }\n\n if(isMessage && unsupported) {\n message.media = {_: 'messageMediaUnsupported'};\n message.message = '';\n delete message.entities;\n delete message.totalEntities;\n }\n\n if(!isMessage && message.action) {\n const action = message.action as MessageAction;\n const suffix = message.fromId === this.appUsersManager.getSelf().id ? 'You' : '';\n let migrateFrom: PeerId, migrateTo: PeerId;\n\n if((action as MessageAction.messageActionChatEditPhoto).photo) {\n (action as MessageAction.messageActionChatEditPhoto).photo = this.appPhotosManager.savePhoto((action as MessageAction.messageActionChatEditPhoto).photo, mediaContext);\n }\n\n if((action as any).document) {\n (action as any).document = this.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 this.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 return 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 }> = {}): (Message.message | Message.messageService)[] {\n if((messages as any).saved) return messages;\n (messages as any).saved = true;\n messages.forEach((message, idx, arr) => {\n arr[idx] = this.saveMessage(message, options);\n });\n\n return messages;\n }\n\n public async getFirstMessageToEdit(peerId: PeerId, threadId?: number) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const slice = historyStorage.history.slice;\n if(slice.isEnd(SliceEnd.Bottom) && slice.length) {\n let goodMessage: Message.message | Message.messageService;\n const myPeerId = this.appPeersManager.peerId;\n for(const mid of slice) {\n const message = this.getMessageByPeer(peerId, mid);\n const good = myPeerId === peerId ? message.fromId === myPeerId : message.pFlags.out;\n\n if(good) {\n if(await this.canEditMessage(message, 'text')) {\n goodMessage = message;\n break;\n }\n\n // * this check will allow editing only last message\n // break;\n }\n }\n\n return goodMessage;\n }\n }\n\n private wrapMessageEntities(message: Message.message) {\n const apiEntities = message.entities ? message.entities.slice() : [];\n message.message = fixEmoji(message.message, apiEntities);\n\n const myEntities = parseEntities(message.message);\n message.totalEntities = mergeEntities(apiEntities, myEntities); // ! only in this order, otherwise bold and emoji formatting won't work\n }\n\n public reportMessages(peerId: PeerId, mids: number[], reason: ReportReason['_'], message?: string) {\n return this.apiManager.invokeApiSingle('messages.report', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: mids.map((mid) => 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 this.apiManager.invokeApi('messages.startBot', {\n bot: this.appUsersManager.getUserInput(botId),\n peer: this.appPeersManager.getInputPeerById(peerId),\n random_id: randomId,\n start_param: startParam\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n const str = '/start';\n if(chatId) {\n let promise: Promise;\n if(this.appChatsManager.isChannel(chatId)) {\n promise = this.appChatsManager.inviteToChannel(chatId, [botId]);\n } else {\n promise = this.appChatsManager.addChatUser(chatId, botId, 0);\n }\n\n return promise.catch((error: ApiError) => {\n if(error?.type == 'USER_ALREADY_PARTICIPANT') {\n error.handled = true;\n return;\n }\n\n throw error;\n }).then(() => {\n return this.sendText(peerId, str + '@' + this.appPeersManager.getPeerUsername(botId.toPeerId()));\n });\n }\n\n return this.sendText(peerId, str);\n }\n\n public editPeerFolders(peerIds: PeerId[], folderId: number) {\n this.apiManager.invokeApi('folders.editPeerFolders', {\n folder_peers: peerIds.map((peerId) => {\n return {\n _: 'inputFolderPeer',\n peer: this.appPeersManager.getInputPeerById(peerId),\n folder_id: folderId\n };\n })\n }).then((updates) => {\n // this.log('editPeerFolders updates:', updates);\n this.apiUpdatesManager.processUpdateMessage(updates); // WARNING! ะฒะพะทะผะพะถะฝะพ ั‚ัƒั‚ ะฝัƒะถะฝะพ ะดะพะฑะฐะฒะปัั‚ัŒ channelId, ะธ ะฒั‹ะทั‹ะฒะฐั‚ัŒ ะฐะฟะดะตะนั‚ ะดะปั ะบะฐะถะดะพะณะพ ะบะฐะฝะฐะปะฐ ะพั‚ะดะตะปัŒะฝะพ\n });\n }\n\n public getFilter(filterId: number) {\n return this.filtersStorage.getFilter(filterId);\n }\n\n public async toggleDialogPin(options: {\n peerId: PeerId,\n filterId?: number,\n topicId?: number\n }) {\n const {peerId, topicId, filterId = topicId ? peerId : undefined} = options;\n if(filterId === undefined) {\n throw new Error('No filterId');\n }\n\n if(filterId > 1) {\n return this.filtersStorage.toggleDialogPin(peerId, filterId);\n }\n\n const dialog = this.dialogsStorage.getDialogOrTopic(peerId, topicId);\n if(!dialog) throw undefined;\n\n const pinned = dialog.pFlags?.pinned ? undefined : true;\n\n if(pinned) {\n const max = await this.apiManager.getLimit(topicId ? 'topicPin' : (filterId === 1 ? 'folderPin' : 'pin'));\n if(this.dialogsStorage.getPinnedOrders(filterId).length >= max) {\n throw makeError(topicId ? 'PINNED_TOO_MUCH' : 'PINNED_DIALOGS_TOO_MUCH');\n }\n }\n\n if(topicId) {\n return this.appChatsManager.updatePinnedForumTopic(peerId.toChatId(), topicId, pinned);\n }\n\n return this.apiManager.invokeApi('messages.toggleDialogPin', {\n peer: this.appPeersManager.getInputDialogPeerById(peerId),\n pinned\n }).then((bool) => {\n const pFlags: Update.updateDialogPinned['pFlags'] = pinned ? {pinned} : {};\n this.apiUpdatesManager.saveUpdate({\n _: 'updateDialogPinned',\n peer: this.appPeersManager.getDialogPeer(peerId),\n folder_id: filterId,\n pFlags\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 this.apiManager.invokeApi('messages.markDialogUnread', {\n peer: this.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: this.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 this.appChatsManager.hasChat(migrateTo.toChatId())) {\n const fromChat = this.appChatsManager.getChat(migrateFrom.toChatId()) as Chat.chat;\n if(fromChat?.migrated_to && (fromChat.migrated_to as InputChannel.inputChannel).channel_id === migrateTo.toChatId()) {\n this.migratedFromTo[migrateFrom] = migrateTo;\n this.migratedToFrom[migrateTo] = migrateFrom;\n\n this.rootScope.dispatchEvent('dialog_migrate', {migrateFrom, migrateTo});\n\n this.dialogsStorage.dropDialogWithEvent(migrateFrom);\n }\n }\n }\n\n private canMessageBeEdited(message: Message, kind: 'text' | 'poll') {\n if((message as Message.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 ||\n 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 && this.appUsersManager.isBot(message.fromId)) {\n return false;\n }\n\n if(message.media?._ === 'messageMediaDocument' &&\n ((message.media.document as Document.document).sticker || (message.media.document as Document.document).type === 'round')) {\n return false;\n }\n\n return true;\n }\n\n public async 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) === this.appUsersManager.getSelf().id) {\n return true;\n }\n\n const canEditMessageInPeer = this.appPeersManager.isBroadcast(message.peerId) ?\n this.appChatsManager.hasRights(message.peerId.toChatId(), 'edit_messages') :\n message.pFlags.out;\n\n if(\n !canEditMessageInPeer || (\n message.peer_id._ !== 'peerChannel' &&\n message.date < (tsNow(true) - (await this.apiManager.getConfig()).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.pFlags.out ||\n this.appChatsManager.getChat(message.peerId.toChatId())._ === 'chat' ||\n this.appChatsManager.hasRights(message.peerId.toChatId(), 'delete_messages')\n ) && (!message.pFlags.is_outgoing || !!message.error);\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 if(!message) {\n return false;\n }\n\n const 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 = this.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 this.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(\n peerId: PeerId,\n filters: MessagesFilter[],\n canCache = true,\n threadId?: number\n ): Promise {\n if(this.appPeersManager.isPeerRestricted(peerId)) {\n return Promise.resolve(filters.map((filter) => {\n return {\n _: 'messages.searchCounter',\n pFlags: {},\n filter: filter,\n count: 0\n };\n }));\n }\n\n const func = (canCache ? this.apiManager.invokeApiCacheable : this.apiManager.invokeApi).bind(this.apiManager);\n return func('messages.getSearchCounters', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n filters,\n top_msg_id: threadId ? getServerMessageId(threadId) : undefined\n });\n }\n\n public filterMessagesByInputFilterFromStorage(inputFilter: MyInputMessagesFilter, history: number[], storage: MessagesStorage | MessagesStorageKey, limit: number) {\n const _storage = this.getMessagesStorage(storage);\n return filterMessagesByInputFilter(inputFilter, history.map((mid) => _storage.get(mid)), limit);\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(this.appPeersManager.isPeerRestricted(peerId)/* || true */) {\n return Promise.resolve({\n count: 0,\n offset_id_offset: 0,\n next_rate: undefined,\n history: []\n });\n }\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.filterMessagesByInputFilterFromStorage(inputFilter._, storage.history.slice, this.getHistoryMessagesStorage(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 ? this.apiManager.invokeApiCacheable : this.apiManager.invokeApi).bind(this.apiManager);\n\n let apiPromise: Promise;\n if(peerId && !nextRate && folderId === undefined/* || !query */) {\n apiPromise = method('messages.search', {\n peer: this.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: getServerMessageId(maxId) || 0,\n add_offset: backLimit ? -backLimit : 0,\n max_id: 0,\n min_id: 0,\n hash: '',\n top_msg_id: 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 const offsetMessage = maxId && this.getMessageByPeer(peerId, maxId);\n\n if(offsetMessage && offsetMessage.date) {\n // offsetDate = offsetMessage.date + timeManager.getServerTimeOffset();\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: this.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 this.appUsersManager.saveApiUsers(searchResult.users);\n this.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 = this.appChatsManager.getChat(peerId.toChatId()) as Chat.chat;\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 = getServerMessageId(Math.max(...this.getMidsByMessage(message)));\n const serviceStartMessage: Message.messageService = {\n _: 'messageService',\n pFlags: {\n is_single: true\n },\n id: this.appMessagesIdsManager.generateTempMessageId(maxMessageId),\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.peerId, message.id)\n };\n\n this.saveMessages([serviceStartMessage], {isOutgoing: true});\n this.threadsServiceMessagesIdsStorage[threadKey] = serviceStartMessage.mid;\n }\n\n public getThreadServiceMessageId(peerId: PeerId, threadId: number) {\n return this.threadsServiceMessagesIdsStorage[peerId + '_' + threadId];\n }\n\n public getDiscussionMessage(peerId: PeerId, mid: number) {\n return this.apiManager.invokeApiSingle('messages.getDiscussionMessage', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(mid)\n }).then((result) => {\n this.appChatsManager.saveApiChats(result.chats);\n this.appUsersManager.saveApiUsers(result.users);\n this.saveMessages(result.messages);\n\n const message = this.getMessageWithReplies(result.messages[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 const newMaxId = result.max_id = generateMessageId(result.max_id) || 0;\n result.read_inbox_max_id = historyStorage.readMaxId = generateMessageId(result.read_inbox_max_id ?? message.mid);\n result.read_outbox_max_id = historyStorage.readOutboxMaxId = generateMessageId(result.read_outbox_max_id) || 0;\n\n const first = historyStorage.history.first;\n if(historyStorage.maxId && historyStorage.maxId < newMaxId && first.isEnd(SliceEnd.Bottom)) {\n first.unsetEnd(SliceEnd.Bottom);\n }\n historyStorage.maxId = newMaxId;\n\n this.threadsToReplies[threadKey] = peerId + '_' + mid;\n\n return message;\n });\n }\n\n private handleNewMessage(message: MyMessage) {\n this.rootScope.dispatchEvent('history_multiappend', message);\n }\n\n private handleNewDialogs = () => {\n let newMaxSeenId = 0;\n const updateMap: BroadcastEvents['dialogs_multiupdate']= new Map();\n\n const processDialog = (dialog: MTDialog.dialog | ForumTopic) => {\n const {peerId} = dialog;\n this.dialogsStorage.pushDialog({dialog});\n if(!this.appPeersManager.isChannel(peerId)) {\n newMaxSeenId = Math.max(newMaxSeenId, dialog.top_message || 0);\n }\n\n let cache = updateMap.get(peerId);\n if(!cache) {\n updateMap.set(peerId, cache = {});\n }\n\n if(dialog._ === 'forumTopic') {\n (cache.topics ??= new Map()).set(dialog.id, dialog);\n } else {\n cache.dialog = dialog;\n }\n };\n\n for(const [peerId, obj] of this.newDialogsToHandle) {\n const isDialogDefined = 'dialog' in obj;\n const {dialog, topics} = obj;\n\n if(isDialogDefined) {\n if(!dialog) {\n this.reloadConversation(peerId.toPeerId());\n } else if(this.dialogsStorage.getDialogOnly(peerId)) { // * can be already dropped\n processDialog(dialog);\n }\n }\n\n if(topics) {\n topics?.forEach((topic, id) => {\n if(!topic) {\n this.dialogsStorage.getForumTopicById(peerId, id);\n } else if(this.dialogsStorage.getForumTopic(peerId, id)) { // * can be already dropped\n processDialog(topic);\n }\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 this.rootScope.dispatchEvent('dialogs_multiupdate', updateMap);\n this.newDialogsToHandle.clear();\n };\n\n public scheduleHandleNewDialogs(peerId?: PeerId, dialog?: Dialog | ForumTopic | ForumTopic['id']) {\n if(peerId !== undefined) {\n let obj = this.newDialogsToHandle.get(peerId);\n if(!obj) {\n this.newDialogsToHandle.set(peerId, obj = {});\n }\n\n const isObject = typeof(dialog) === 'object';\n if(!dialog || (isObject && dialog._ === 'dialog')) {\n obj.dialog = dialog as Dialog;\n } else {\n obj.topics ??= new Map();\n if(isObject) {\n obj.topics.set((dialog as ForumTopic).id, dialog as ForumTopic);\n } else {\n obj.topics.set(dialog as number, undefined);\n }\n }\n }\n\n return this.newDialogsHandlePromise ??= pause(0).then(() => {\n this.newDialogsHandlePromise = undefined;\n this.handleNewDialogs();\n });\n }\n\n public async deleteMessages(peerId: PeerId, mids: number[], revoke?: boolean) {\n let promise: Promise;\n\n const config = await this.apiManager.getConfig();\n const overflowMids = mids.splice(config.forwarded_count_max, mids.length - config.forwarded_count_max);\n\n const localMessageIds = mids.map((mid) => getServerMessageId(mid));\n\n if(peerId.isAnyChat() && this.appPeersManager.isChannel(peerId)) {\n const channelId = peerId.toChatId();\n const channel = this.appChatsManager.getChat(channelId) as Chat.channel;\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 = this.apiManager.invokeApi('channels.deleteMessages', {\n channel: this.appChatsManager.getChannelInput(channelId),\n id: localMessageIds\n }).then((affectedMessages) => {\n this.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 = this.apiManager.invokeApi('messages.deleteMessages', {\n revoke,\n id: localMessageIds\n }).then((affectedMessages) => {\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteMessages',\n messages: mids,\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n });\n });\n }\n\n const promises: (typeof promise)[] = [promise];\n if(overflowMids.length) {\n promises.push(this.deleteMessages(peerId, overflowMids, revoke));\n }\n\n return Promise.all(promises).then(noop);\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 const readMaxId = this.getReadMaxIdIfUnread(peerId, threadId);\n if(!readMaxId) {\n if(threadId && !force) {\n const forumTopic = this.dialogsStorage.getForumTopic(peerId, threadId);\n if(!getServerMessageId(forumTopic.read_inbox_max_id)) {\n force = true;\n }\n }\n\n if(!force) {\n const dialog = this.appChatsManager.isForum(peerId.toChatId()) && threadId ?\n this.dialogsStorage.getForumTopic(peerId, threadId) :\n this.getDialogOnly(peerId);\n if(dialog && this.isDialogUnread(dialog)) {\n force = true;\n }\n }\n\n if(!force) {\n this.log('readHistory: isn\\'t unread');\n return Promise.resolve();\n }\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 = this.apiManager.invokeApi('messages.readDiscussion', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(threadId),\n read_max_id: getServerMessageId(maxId)\n });\n // apiPromise = new Promise((resolve) => resolve());\n }\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateReadChannelDiscussionInbox',\n channel_id: peerId.toChatId(),\n top_msg_id: threadId,\n read_max_id: maxId\n });\n } else if(this.appPeersManager.isChannel(peerId)) {\n if(!historyStorage.readPromise) {\n apiPromise = this.apiManager.invokeApi('channels.readHistory', {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n max_id: getServerMessageId(maxId)\n });\n }\n\n this.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 = this.apiManager.invokeApi('messages.readHistory', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n max_id: getServerMessageId(maxId)\n }).then((affectedMessages) => {\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n }\n });\n });\n }\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateReadHistoryInbox',\n max_id: maxId,\n peer: this.appPeersManager.getOutputPeer(peerId),\n still_unread_count: undefined,\n pts: undefined,\n pts_count: undefined\n });\n }\n\n this.rootScope.dispatchEvent('notification_reset', this.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 private getUnreadMentionsKey(peerId: PeerId, threadId?: number) {\n return peerId + (threadId ? `_${threadId}` : '');\n }\n\n private fixDialogUnreadMentionsIfNoMessage(peerId: PeerId, threadId?: number) {\n const dialog = this.dialogsStorage.getDialogOrTopic(peerId, threadId);\n if(dialog?.unread_mentions_count) {\n this.reloadConversationOrTopic(peerId);\n }\n }\n\n private modifyCachedMentions(peerId: PeerId, mid: number, add: boolean, threadId?: number) {\n const slicedArray = this.unreadMentions[this.getUnreadMentionsKey(peerId, threadId)];\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, threadId?: number) {\n const dialog = this.dialogsStorage.getDialogOrTopic(peerId, threadId);\n if(!slicedArray.length && dialog?.unread_mentions_count) {\n this.reloadConversationOrTopic(peerId);\n }\n }\n\n public goToNextMention(peerId: PeerId, threadId?: number) {\n /* this.getUnreadMentions(peerId, 1, 2, 0).then((messages) => {\n console.log(messages);\n }); */\n\n const key = this.getUnreadMentionsKey(peerId, threadId);\n const promise = this.goToNextMentionPromises[key];\n if(promise) {\n return promise;\n }\n\n const slicedArray = 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, threadId);\n return Promise.resolve();\n }\n\n let loadNextPromise = Promise.resolve();\n if(!isTopEnd && length < 25) {\n loadNextPromise = this.loadNextMentions(peerId, threadId);\n }\n\n return this.goToNextMentionPromises[key] = loadNextPromise.then(() => {\n const last = slicedArray.last;\n const mid = last && last[last.length - 1];\n if(mid) {\n slicedArray.delete(mid);\n return mid;\n } else {\n this.fixUnreadMentionsCountIfNeeded(peerId, slicedArray, threadId);\n }\n }).finally(() => {\n delete this.goToNextMentionPromises[key];\n });\n }\n\n private loadNextMentions(peerId: PeerId, threadId?: number) {\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, undefined, undefined, threadId)\n .then((messages) => {\n this.mergeHistoryResult(slicedArray, messages, maxId === 1 ? 0 : maxId, limit, add_offset);\n });\n }\n\n private getUnreadMentions(\n peerId: PeerId,\n offsetId: number,\n add_offset: number,\n limit: number,\n maxId = 0,\n minId = 0,\n threadId?: number\n ) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.getUnreadMentions',\n params: {\n peer: this.appPeersManager.getInputPeerById(peerId),\n offset_id: getServerMessageId(offsetId),\n add_offset,\n limit,\n max_id: getServerMessageId(maxId),\n min_id: getServerMessageId(minId),\n top_msg_id: threadId ? getServerMessageId(threadId) : undefined\n },\n processResult: (messagesMessages) => {\n assumeType>(messagesMessages);\n this.appUsersManager.saveApiUsers(messagesMessages.users);\n this.appChatsManager.saveApiChats(messagesMessages.chats);\n this.saveMessages(messagesMessages.messages);\n\n return messagesMessages;\n }\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) => getServerMessageId(mid));\n let promise: Promise, update: Update.updateChannelReadMessagesContents | Update.updateReadMessagesContents;\n if(peerId.isAnyChat() && this.appPeersManager.isChannel(peerId)) {\n const channelId = peerId.toChatId();\n\n update = {\n _: 'updateChannelReadMessagesContents',\n channel_id: channelId,\n messages: msgIds\n };\n\n promise = this.apiManager.invokeApi('channels.readMessageContents', {\n channel: this.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 = this.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 this.apiUpdatesManager.processLocalUpdate(update);\n });\n }\n\n this.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 return (this.threadsStorage[peerId] ??= {})[threadId] ??= {count: null, history: new SlicedArray()};\n }\n\n return this.historiesStorage[peerId] ??= {count: null, history: new SlicedArray()};\n }\n\n public getHistoryStorageTransferable(peerId: PeerId, threadId?: number) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const {\n count,\n history,\n maxId,\n readMaxId,\n readOutboxMaxId,\n maxOutId,\n replyMarkup\n } = historyStorage;\n\n return {\n count,\n history: undefined as HistoryStorage,\n historySerialized: history.toJSON(),\n maxId,\n readMaxId,\n readOutboxMaxId,\n maxOutId,\n replyMarkup\n };\n }\n\n private getNotifyPeerSettings(peerId: PeerId, threadId?: number) {\n const inputNotifyPeer = this.appPeersManager.getInputNotifyPeerById({peerId, ignorePeerId: true, threadId});\n return Promise.all([\n this.appNotificationsManager.getNotifyPeerTypeSettings(),\n this.appNotificationsManager.getNotifySettings(inputNotifyPeer)\n ]).then(([_, peerTypeNotifySettings]) => {\n return {\n muted: this.appNotificationsManager.isPeerLocalMuted({peerId, respectType: true, threadId}),\n peerTypeNotifySettings\n };\n });\n }\n\n private handleNotifications = () => {\n ctx.clearTimeout(this.notificationsHandlePromise);\n this.notificationsHandlePromise = undefined;\n\n // var timeout = $rootScope.idle.isIDLE && StatusManager.isOtherDeviceActive() ? 30000 : 1000;\n // const timeout = 1000;\n\n for(const key in this.notificationsToHandle) {\n const [peerId, threadId] = key.split('_');\n // if(rootScope.peerId === peerId && !rootScope.idle.isIDLE) {\n // continue;\n // }\n\n const notifyPeerToHandle = this.notificationsToHandle[key];\n this.getNotifyPeerSettings(peerId.toPeerId(), threadId ? +threadId : undefined)\n .then(({muted, peerTypeNotifySettings}) => {\n const topMessage = notifyPeerToHandle.topMessage;\n if((muted && !topMessage.pFlags.mentioned) || !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 public getUpdateAfterReloadKey(peerId: PeerId, threadId?: number) {\n return peerId + (threadId ? '_' + threadId : '');\n }\n\n private handleNewUpdateAfterReload(peerId: PeerId, update: Update, threadId?: number) {\n const set = this.newUpdatesAfterReloadToHandle[this.getUpdateAfterReloadKey(peerId, threadId)] ??= 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, threadId);\n }\n\n private onUpdateMessageId = (update: Update.updateMessageID) => {\n const randomId = update.random_id;\n const pendingData = this.pendingByRandomId[randomId];\n if(!pendingData) {\n return;\n }\n\n const mid = generateMessageId(update.id);\n this.pendingByMessageId[mid] = randomId;\n // const {storage} = pendingData;\n // const message = this.getMessageFromStorage(storage, mid);\n // if(message) { // if message somehow already exists\n // this.checkPendingMessage(message);\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.getHistoryMessagesStorage(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: this.createMessageStorage(peerId, 'history')});\n\n // * check if sent message is already in storage\n // const oldMessage = this.getMessageFromStorage(storage, message.mid);\n // if(\n // (message as Message.message).pFlags.is_outgoing &&\n // oldMessage &&\n // !(oldMessage as Message.message).pFlags.is_outgoing\n // ) {\n // this.checkPendingMessage(message);\n // return;\n // }\n\n const isForum = this.appPeersManager.isForum(peerId);\n const threadKey = this.getThreadKey(message);\n const threadId = threadKey ? +threadKey.split('_')[1] : undefined;\n const dialog = this.dialogsStorage.getDialogOrTopic(peerId, isLocalThreadUpdate ? threadId : undefined);\n\n if((!dialog || this.reloadConversationsPeers.has(peerId)) && !isLocalThreadUpdate) {\n let good = true;\n if(peerId.isAnyChat()) {\n good = this.appChatsManager.isInChat(peerId.toChatId());\n }\n\n if(good) {\n this.handleNewUpdateAfterReload(peerId, update);\n return;\n }\n\n // return;\n }\n\n if(threadId && !isLocalThreadUpdate) {\n const threadStorage = this.threadsStorage[peerId]?.[threadId];\n const update = {\n _: 'updateNewDiscussionMessage',\n message\n } as Update.updateNewDiscussionMessage;\n\n if(this.appChatsManager.isForum(peerId.toChatId()) && !this.dialogsStorage.getForumTopic(peerId, threadId)) {\n // this.dialogsStorage.getForumTopicById(peerId, threadId);\n this.handleNewUpdateAfterReload(peerId, update, threadId);\n } else if(threadStorage) {\n this.onUpdateNewMessage(update);\n }\n }\n\n if(message._ === 'messageService') {\n const {action} = message;\n if(action._ === 'messageActionPaymentSent' && message.reply_to) {\n this.rootScope.dispatchEvent('payment_sent', {\n peerId: message.reply_to.reply_to_peer_id ?\n this.appPeersManager.getPeerId(message.reply_to.reply_to_peer_id) :\n message.peerId,\n mid: message.reply_to_mid,\n receiptMessage: message\n });\n }\n\n if(action._ === 'messageActionTopicEdit' && !isLocalThreadUpdate) {\n const topic = this.dialogsStorage.getForumTopic(peerId, threadId);\n if(!topic) {\n this.dialogsStorage.getForumTopicById(peerId, threadId);\n } else {\n const oldTopic = copy(topic);\n\n if(action.title !== undefined) {\n topic.title = action.title;\n }\n\n if(action.closed !== undefined) {\n setBooleanFlag(topic.pFlags, 'closed', action.closed);\n }\n\n if(action.hidden !== undefined) {\n setBooleanFlag(topic.pFlags, 'hidden', action.hidden);\n }\n\n if(action.icon_emoji_id !== undefined) {\n topic.icon_emoji_id = action.icon_emoji_id;\n }\n\n this.scheduleHandleNewDialogs(peerId, topic);\n\n this.dialogsStorage.processTopicUpdate(topic, oldTopic);\n }\n }\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 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(!historyStorage.maxId || message.mid > historyStorage.maxId) {\n historyStorage.maxId = message.mid;\n }\n\n if(this.mergeReplyKeyboard(historyStorage, message)) {\n this.rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n\n const fromId = message.fromId;\n if(fromId.isUser() && !message.pFlags.out && message.from_id) {\n this.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(this.appPeersManager.isChannel(peerId)) {\n update = {\n _: 'updateChannelUserTyping',\n action,\n channel_id: peerId.toChatId(),\n from_id: this.appPeersManager.getOutputPeer(fromId),\n top_msg_id: threadId ? getServerMessageId(threadId) : undefined\n };\n } else {\n update = {\n _: 'updateChatUserTyping',\n action,\n chat_id: peerId.toChatId(),\n from_id: this.appPeersManager.getOutputPeer(fromId)\n };\n }\n\n this.apiUpdatesManager.processLocalUpdate(update);\n }\n\n // commented to render the message if it's been sent faster than history_append came to main thread\n // if(!pendingMessage) {\n this.handleNewMessage(message);\n // }\n\n const isTopic = dialog?._ === 'forumTopic';\n if((isLocalThreadUpdate && !isTopic) || !dialog) {\n return;\n }\n\n const inboxUnread = !message.pFlags.out && message.pFlags.unread;\n\n {\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, isTopic ? threadId : undefined);\n }\n\n releaseUnreadCount();\n }\n\n if(message.mid >= dialog.top_message) {\n this.setDialogTopMessage(message, dialog);\n }\n }\n\n if(((!isLocalThreadUpdate && !isForum) || isTopic) && inboxUnread) {\n const notifyPeer = threadKey || peerId;\n const notifyPeerToHandle = this.notificationsToHandle[notifyPeer] ??= {\n fwdCount: 0,\n fromId: NULL_PEER_ID\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 this.notificationsHandlePromise ??= ctx.setTimeout(this.handleNotifications, 0);\n }\n };\n\n private onUpdateMessageReactions = (update: Update.updateMessageReactions) => {\n const {peer, msg_id, reactions} = update;\n const mid = generateMessageId(msg_id);\n const peerId = this.appPeersManager.getPeerId(peer);\n const message: MyMessage = this.getMessageByPeer(peerId, mid);\n\n if(message?._ !== 'message') {\n return;\n }\n\n const recentReactions = reactions?.recent_reactions;\n if(recentReactions?.length && message.pFlags.out) {\n const recentReaction = recentReactions[recentReactions.length - 1];\n const previousReactions = message.reactions;\n const previousRecentReactions = previousReactions?.recent_reactions;\n if(\n this.appPeersManager.getPeerId(recentReaction.peer_id) !== this.appPeersManager.peerId && (\n !previousRecentReactions ||\n previousRecentReactions.length <= recentReactions.length\n ) && (\n !previousRecentReactions ||\n !deepEqual(recentReaction, previousRecentReactions[previousRecentReactions.length - 1])\n )\n ) {\n this.getNotifyPeerSettings(peerId).then(({muted, peerTypeNotifySettings}) => {\n if(/* muted || */!peerTypeNotifySettings.show_previews) return;\n this.notifyAboutMessage(message, {\n peerReaction: recentReaction,\n peerTypeNotifySettings\n });\n });\n }\n }\n\n const key = message.peerId + '_' + message.mid;\n this.pushBatchUpdate('messages_reactions', this.batchUpdateReactions, key, () => copy(message.reactions));\n\n message.reactions = reactions;\n\n if(!update.local) {\n this.setDialogToStateIfMessageIsTop(message);\n }\n };\n\n private onUpdateDialogUnreadMark = (update: Update.updateDialogUnreadMark) => {\n // this.log('updateDialogUnreadMark', update);\n const peerId = this.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 this.dialogsStorage.setDialogToState(dialog);\n this.rootScope.dispatchEvent('dialogs_multiupdate', new Map([[peerId, {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 = generateMessageId(message.id);\n const storage = this.getHistoryMessagesStorage(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, storage);\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?.top_message === mid;\n if((message as Message.messageService).clear_history) {\n if(isTopMessage) {\n this.rootScope.dispatchEvent('dialog_flush', {peerId, dialog});\n }\n } else {\n let dispatchEditEvent = true;\n // no sense in dispatching message_edit since only reactions have changed\n if(oldMessage?._ === 'message' && !deepEqual(oldMessage.reactions, (newMessage as Message.message).reactions)) {\n const newReactions = (newMessage as Message.message).reactions;\n (newMessage as Message.message).reactions = oldMessage.reactions;\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateMessageReactions',\n peer: this.appPeersManager.getOutputPeer(peerId),\n msg_id: message.id,\n reactions: newReactions\n });\n\n dispatchEditEvent = false;\n }\n\n dispatchEditEvent && this.rootScope.dispatchEvent('message_edit', {\n storageKey: storage.key,\n peerId,\n mid,\n message\n });\n\n if(isTopMessage) {\n this.dialogsStorage.setDialogToState(dialog);\n }\n\n const map: BroadcastEvents['dialogs_multiupdate'] = new Map();\n const getUpdateCache = () => {\n let cache = map.get(peerId);\n if(!cache) {\n map.set(peerId, cache = {});\n }\n\n return cache;\n };\n\n if((isTopMessage || (message as Message.message).grouped_id) && dialog) {\n getUpdateCache().dialog = dialog;\n }\n\n const threadKey = this.getThreadKey(message);\n if(threadKey) {\n const topicId = +threadKey.split('_')[1];\n const topic = this.dialogsStorage.getForumTopic(peerId, topicId);\n if(topic) {\n (getUpdateCache().topics ??= new Map()).set(topicId, topic);\n }\n }\n\n if(map.size) {\n this.rootScope.dispatchEvent('dialogs_multiupdate', map);\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 = generateMessageId((update as Update.updateReadChannelInbox).max_id || (update as Update.updateReadChannelDiscussionInbox).read_max_id);\n const threadId = generateMessageId((update as Update.updateReadChannelDiscussionInbox).top_msg_id);\n const peerId = channelId ? channelId.toPeerId(true) : this.appPeersManager.getPeerId((update as Update.updateReadHistoryInbox).peer);\n\n const isOut = update._ === 'updateReadHistoryOutbox' ||\n update._ === 'updateReadChannelOutbox' ||\n update._ === 'updateReadChannelDiscussionOutbox' ? true : undefined;\n\n const isForum = channelId ? this.appChatsManager.isForum(channelId) : false;\n const storage = this.getHistoryMessagesStorage(peerId);\n const history = getObjectKeysAndSort(storage, 'desc');\n const foundDialog = threadId && isForum ?\n this.dialogsStorage.getForumTopic(peerId, threadId) :\n 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 this.appUsersManager.forceUserOnline(peerId.toUserId());\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 = foundDialog && this.dialogsStorage.prepareDialogUnreadCountModifying(foundDialog);\n const readMaxId = this.getReadMaxIdIfUnread(peerId, threadId);\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 const messageThreadId = getMessageThreadId(message, isForum);\n if(threadId && messageThreadId !== threadId) {\n continue;\n }\n\n const isUnread = message.pFlags.unread || (readMaxId && readMaxId < mid);\n\n if(!isUnread) {\n break;\n }\n\n // this.log.warn('read', messageId, isUnread, message)\n delete message.pFlags.unread;\n foundAffected ||= true;\n\n if(!message.pFlags.out && 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 this.rootScope.dispatchEvent('notification_cancel', 'msg' + mid);\n }\n\n if(isOut) historyStorage.readOutboxMaxId = maxId;\n else historyStorage.readMaxId = maxId;\n\n if(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(\n newUnreadCount < 0 ||\n maxId >= foundDialog.top_message ||\n !readMaxId\n ) {\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 releaseUnreadCount?.();\n\n this.dialogsStorage.processDialogForFilters(foundDialog);\n\n this.rootScope.dispatchEvent('dialog_unread', {peerId, dialog: foundDialog});\n this.dialogsStorage.setDialogToState(foundDialog);\n\n if(!foundAffected && stillUnreadCount === undefined && !isOut && foundDialog.unread_count) {\n if(foundDialog._ === 'forumTopic') {\n this.dialogsStorage.getForumTopicById(peerId, threadId);\n } else {\n this.reloadConversation(peerId);\n }\n }\n }\n\n if(foundAffected) {\n this.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 this.rootScope.dispatchEvent('replies_updated', this.getMessageByPeer(peerId.toPeerId(), +mid) as Message.message);\n }\n }\n }\n };\n\n private onUpdateReadMessagesContents = (update: Update.updateChannelReadMessagesContents | Update.updateReadMessagesContents) => {\n const channelId = (update as Update.updateChannelReadMessagesContents).channel_id;\n const topMsgId = (update as Update.updateChannelReadMessagesContents).top_msg_id;\n const threadId = topMsgId ? generateMessageId(topMsgId) : undefined;\n const mids = (update as Update.updateReadMessagesContents).messages.map((id) => generateMessageId(id));\n const peerId = channelId ? channelId.toPeerId(true) : this.findPeerIdByMids(mids);\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) {\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, threadId);\n }\n }\n } else {\n this.fixDialogUnreadMentionsIfNoMessage(peerId, threadId);\n }\n }\n\n this.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 = 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) => generateMessageId(id));\n const peerId: PeerId = channelId ? channelId.toPeerId(true) : this.findPeerIdByMids(messages);\n\n if(!peerId) {\n return;\n }\n\n this.apiManager.clearCache('messages.getSearchCounters', (params) => {\n return this.appPeersManager.getPeerId(params.peer) === peerId;\n });\n\n const threadKeys: Set = new Set(), topics: Map = new Map();\n for(const mid of messages) {\n const message = this.getMessageByPeer(peerId, mid);\n const threadKey = this.getThreadKey(message);\n if(!threadKey) {\n continue;\n }\n\n const threadId = +threadKey.split('_')[1];\n if(this.threadsStorage[peerId]?.[threadId]) {\n threadKeys.add(threadKey);\n\n if(!topics.has(threadId)) {\n const topic = this.dialogsStorage.getForumTopic(peerId, threadId);\n if(topic) {\n topics.set(threadId, topic);\n }\n }\n }\n }\n\n const historyUpdated = this.handleDeletedMessages(\n peerId,\n this.getHistoryMessagesStorage(peerId),\n messages\n );\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 historyStorages = [\n this.getHistoryStorage(peerId),\n ...threadsStorages\n ];\n historyStorages.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 this.rootScope.dispatchEvent('history_delete', {peerId, msgs: historyUpdated.msgs});\n\n const dialogs: (MTDialog.dialog | ForumTopic)[] = [\n ...topics.values()\n ];\n\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n dialogs.unshift(dialog);\n }\n\n dialogs.forEach((dialog) => {\n const isTopic = dialog._ === 'forumTopic';\n const affected = historyUpdated.unreadMentions || historyUpdated.unread;\n const releaseUnreadCount = affected && this.dialogsStorage.prepareDialogUnreadCountModifying(dialog);\n\n if(historyUpdated.unread) {\n dialog.unread_count = Math.max(0, dialog.unread_count - historyUpdated.unread);\n }\n\n if(historyUpdated.unreadMentions) {\n dialog.unread_mentions_count = !dialog.unread_count ? 0 : Math.max(0, dialog.unread_mentions_count - historyUpdated.unreadMentions);\n }\n\n if(affected) {\n releaseUnreadCount();\n\n if(!isTopic) {\n this.rootScope.dispatchEvent('dialog_unread', {peerId, dialog});\n }\n }\n\n if(historyUpdated.msgs.has(dialog.top_message)) {\n const historyStorage = this.getHistoryStorage(dialog.peerId, isTopic ? dialog.id : undefined);\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, dialog);\n } else if(isTopic) {\n this.dialogsStorage.getForumTopicById(peerId, dialog.id);\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 = this.appChatsManager.getChat(channelId) as Chat.channel;\n\n const needDialog = this.appChatsManager.isInChat(channelId);\n\n const canViewHistory = !!getPeerActiveUsernames(channel)[0] || !channel.pFlags.left;\n const hasHistory = this.historiesStorage[peerId] !== undefined;\n\n if(canViewHistory !== hasHistory) {\n delete this.historiesStorage[peerId];\n this.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 this.rootScope.dispatchEvent('channel_update', channelId);\n };\n\n private onUpdateChannelReload = (update: Update.updateChannelReload) => {\n const peerId = update.channel_id.toPeerId(true);\n\n // if(this.appPeersManager.isForum(peerId)) {\n // const cache = this.dialogsStorage.getForumTopicsCache(peerId);\n // if(cache.topics.size) {\n\n // }\n // }\n\n this.flushStoragesByPeerId(peerId);\n Promise.all([\n this.reloadConversation(peerId)\n ]).then(() => {\n this.rootScope.dispatchEvent('history_reload', peerId);\n });\n };\n\n private onUpdateChannelMessageViews = (update: Update.updateChannelMessageViews) => {\n const views = update.views;\n const peerId = update.peerId ?? update.channel_id.toPeerId(true);\n const mid = generateMessageId(update.id);\n const message = this.getMessageByPeer(peerId, mid) as Message.message;\n if(message?.views !== undefined && message.views < views) {\n message.views = views;\n this.pushBatchUpdate('messages_views', this.batchUpdateViews, message.peerId + '_' + message.mid);\n this.setDialogToStateIfMessageIsTop(message);\n }\n };\n\n private onUpdateServiceNotification = (update: Update.updateServiceNotification) => {\n // this.log('updateServiceNotification', update);\n if(update.pFlags?.popup) {\n this.rootScope.dispatchEvent('service_notification', update);\n return;\n }\n\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: this.appPeersManager.getOutputPeer(fromId),\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n pFlags: {unread: true},\n date: (update.inbox_date || tsNow(true)) + this.timeManager.getServerTimeOffset(),\n message: update.message,\n media: update.media,\n entities: update.entities\n };\n if(!this.appUsersManager.hasUser(fromId)) {\n this.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) : this.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) => generateMessageId(id));\n\n const storage = this.getHistoryMessagesStorage(peerId);\n const missingMessages = messages.filter((mid) => !storage.has(mid));\n const getMissingPromise = missingMessages.length ? Promise.all(missingMessages.map((mid) => this.reloadMessages(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) as Message.message;\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) as Message.message;\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[this.getPinnedMessagesKey(peerId)];\n this.appStateManager.getState().then((state) => {\n delete state.hiddenPinnedMessages[peerId];\n this.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 const isTopic = peer._ === 'notifyForumTopic';\n const isPeerType = peer._ === 'notifyPeer' || isTopic;\n if(!isPeerType) {\n return;\n }\n\n const peerId = this.appPeersManager.getPeerId(peer.peer);\n const dialog = this.dialogsStorage.getDialogOrTopic(peerId, isTopic ? generateMessageId(peer.top_msg_id) : undefined);\n if(!dialog) {\n return;\n }\n\n dialog.notify_settings = notify_settings;\n this.rootScope.dispatchEvent('dialog_notify_settings', dialog);\n this.dialogsStorage.setDialogToState(dialog);\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 return;\n }\n\n const mid = 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) {\n this.handleEditedMessage(oldMessage, newMessage, storage);\n this.rootScope.dispatchEvent('message_edit', {storageKey: storage.key, peerId, mid: message.mid, message});\n } else {\n const pendingMessage = this.checkPendingMessage(message);\n if(!pendingMessage) {\n this.rootScope.dispatchEvent('scheduled_new', message as Message.message);\n }\n }\n };\n\n private onUpdateDeleteScheduledMessages = (update: Update.updateDeleteScheduledMessages) => {\n const peerId = this.appPeersManager.getPeerId(update.peer);\n\n const storage = this.scheduledMessagesStorage[peerId];\n if(storage) {\n const mids = update.messages.map((id) => generateMessageId(id));\n this.handleDeletedMessages(peerId, storage, mids);\n\n this.rootScope.dispatchEvent('scheduled_delete', {peerId, mids});\n }\n };\n\n private onUpdateMessageExtendedMedia = (update: Update.updateMessageExtendedMedia) => {\n const peerId = this.appPeersManager.getPeerId(update.peer);\n const mid = generateMessageId(update.msg_id);\n const storage = this.getHistoryMessagesStorage(peerId);\n if(!storage.has(mid)) {\n // this.fixDialogUnreadMentionsIfNoMessage(peerId);\n return;\n }\n\n const message = this.getMessageFromStorage(storage, mid) as Message.message;\n const messageMedia = message.media as MessageMedia.messageMediaInvoice;\n if(messageMedia.extended_media?._ === 'messageExtendedMedia') {\n return;\n }\n\n messageMedia.extended_media = update.extended_media;\n this.onUpdateEditMessage({\n _: 'updateEditMessage',\n message,\n pts: 0,\n pts_count: 0\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()) {\n const threadId = getMessageThreadId(threadMessage, this.appChatsManager.isForum(threadMessage.peerId.toChatId()));\n if(threadId) {\n threadKey = threadMessage.peerId + '_' + threadId;\n }\n }\n\n return threadKey;\n }\n\n public updateMessage(peerId: PeerId, mid: number, broadcastEventName?: 'replies_updated'): Promise {\n const promise: Promise = this.reloadMessages(peerId, mid, true).then(() => {\n const message = this.getMessageByPeer(peerId, mid) as Message.message;\n if(!message) {\n return;\n }\n\n if(broadcastEventName) {\n this.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 this.rootScope.dispatchEvent('history_update', {\n storageKey: pendingData.storage.key,\n message,\n sequential: pendingData.sequential\n });\n }\n\n delete this.pendingByMessageId[message.mid];\n }\n\n return pendingMessage;\n }\n\n public mutePeer(options: {peerId: PeerId, muteUntil: number, threadId?: number}) {\n if(!(options = this.appNotificationsManager.validatePeerSettings(options))) {\n return;\n }\n\n const {peerId, muteUntil, threadId} = options;\n const settings: InputPeerNotifySettings = {\n _: 'inputPeerNotifySettings'\n };\n\n settings.mute_until = muteUntil;\n\n const peer = this.appPeersManager.getInputPeerById(peerId);\n return this.appNotificationsManager.updateNotifySettings(threadId ? {\n _: 'inputNotifyForumTopic',\n peer,\n top_msg_id: getServerMessageId(threadId)\n } : {\n _: 'inputNotifyPeer',\n peer\n }, settings);\n }\n\n public togglePeerMute({peerId, mute, threadId}: {peerId: PeerId, mute?: boolean, threadId?: number}) {\n if(mute === undefined) {\n mute = !this.appNotificationsManager.isPeerLocalMuted({peerId, respectType: false, threadId});\n }\n\n return this.mutePeer({peerId, muteUntil: mute ? MUTE_UNTIL : 0, threadId});\n }\n\n private findPeerIdByMids(mids: number[]) {\n for(let length = mids.length, i = length - 1; i >= 0; --i) {\n const mid = mids[i];\n const message = this.getMessageById(mid);\n if(message) {\n return message.peerId;\n }\n }\n }\n\n public canSendToPeer(peerId: PeerId, threadId?: number, action: ChatRights = 'send_messages') {\n if(this.appPeersManager.isPeerRestricted(peerId)) {\n return false;\n }\n\n if(peerId.isAnyChat()) {\n const chatId = peerId.toChatId();\n if(threadId) {\n const topic = this.dialogsStorage.getForumTopic(peerId, threadId);\n if(topic?.pFlags?.closed && !this.appChatsManager.hasRights(chatId, 'manage_topics')) {\n return false;\n }\n }\n\n // const isChannel = appPeersManager.isChannel(peerId);\n const chat = this.appChatsManager.getChat(chatId) as Chat.chat;\n const hasRights = /* isChannel && */this.appChatsManager.hasRights(chatId, action, undefined, !!threadId);\n return /* !isChannel || */hasRights && (!chat.pFlags.left || !!threadId);\n } else {\n return this.appUsersManager.canSendToUser(peerId);\n }\n }\n\n public finalizePendingMessage(randomId: Long, finalMessage: MyMessage) {\n const pendingData = this.pendingByRandomId[randomId];\n if(!pendingData) {\n return;\n }\n\n const {peerId, tempId, threadId, storage} = pendingData;\n\n [\n this.getHistoryStorage(peerId),\n threadId ? this.getHistoryStorage(peerId, threadId) : undefined\n ]\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) {\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 this.rootScope.dispatchEvent('messages_pending');\n\n delete this.pendingByRandomId[randomId];\n\n this.finalizePendingMessageCallbacks(storage, tempId, finalMessage);\n\n return tempMessage;\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 = this.appPhotosManager.getPhoto('' + tempId);\n if(/* photo._ !== 'photoEmpty' */photo) {\n const newPhotoSize = newPhoto.sizes[newPhoto.sizes.length - 1];\n const cacheContext = this.thumbsStorage.getCacheContext(newPhoto, newPhotoSize.type);\n const oldCacheContext = this.thumbsStorage.getCacheContext(photo, THUMB_TYPE_FULL);\n Object.assign(cacheContext, oldCacheContext);\n\n const photoSize = newPhoto.sizes[newPhoto.sizes.length - 1] as PhotoSize.photoSize;\n\n const downloadOptions = getPhotoDownloadOptions(newPhoto, photoSize);\n const fileName = getFileNameByLocation(downloadOptions.location);\n // this.appDownloadManager.fakeDownload(fileName, oldCacheContext.url);\n }\n } else if(newDoc) {\n const oldDoc = this.appDocsManager.getDoc('' + tempId);\n if(oldDoc) {\n const oldCacheContext = this.thumbsStorage.getCacheContext(oldDoc);\n if(\n /* doc._ !== 'documentEmpty' && */\n oldDoc.type &&\n oldDoc.type !== 'sticker' &&\n oldDoc.mime_type !== 'image/gif' &&\n oldCacheContext.url\n ) {\n const cacheContext = this.thumbsStorage.getCacheContext(newDoc);\n Object.assign(cacheContext, oldCacheContext);\n\n const fileName = getDocumentInputFileName(newDoc);\n // this.appDownloadManager.fakeDownload(fileName, oldCacheContext.url);\n }\n }\n } else if((message.media as MessageMedia.messageMediaPoll).poll) {\n delete this.appPollsManager.polls[tempId];\n delete this.appPollsManager.results[tempId];\n }\n }\n\n const tempMessage = this.getMessageFromStorage(storage, tempId);\n storage.delete(tempId);\n\n if(!(tempMessage as Message.message).reply_markup && (message as Message.message).reply_markup) {\n setTimeout(() => { // TODO: refactor it to normal buttons adding\n if(!this.getMessageFromStorage(storage, message.mid)) {\n return;\n }\n\n this.rootScope.dispatchEvent('message_edit', {storageKey: storage.key, peerId: message.peerId, mid: message.mid, message});\n }, 0);\n }\n\n this.handleReleasingMessage(tempMessage, storage);\n\n this.rootScope.dispatchEvent('message_sent', {storageKey: storage.key, 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 this.appStateManager.pushToState('maxSeenMsgId', maxId);\n\n this.apiManager.invokeApi('messages.receivedMessages', {\n max_id: getServerMessageId(maxId)\n });\n }\n\n public async getMessageReactionsListAndReadParticipants(\n message: Message.message,\n limit?: number,\n reaction?: Reaction,\n offset?: string,\n skipReadParticipants?: boolean,\n skipReactionsList?: boolean\n ) {\n const emptyMessageReactionsList = {\n reactions: [] as MessagePeerReaction[],\n count: 0,\n next_offset: undefined as string\n };\n\n const canViewMessageReadParticipants = await this.canViewMessageReadParticipants(message);\n if(canViewMessageReadParticipants && limit === undefined) {\n limit = 100;\n } else if(limit === undefined) {\n limit = 50;\n }\n\n return Promise.all([\n canViewMessageReadParticipants && !reaction && !skipReadParticipants ? this.getMessageReadParticipants(message.peerId, message.mid).catch(() => [] as UserId[]) : [] as UserId[],\n\n message.reactions?.recent_reactions?.length && !skipReactionsList ? this.appReactionsManager.getMessageReactionsList(message.peerId, message.mid, limit, reaction, offset).catch((err) => emptyMessageReactionsList) : emptyMessageReactionsList\n ]).then(([userIds, messageReactionsList]) => {\n const readParticipantsPeerIds = userIds.map((userId) => userId.toPeerId());\n\n const filteredReadParticipants = readParticipantsPeerIds.slice();\n forEachReverse(filteredReadParticipants, (peerId, idx, arr) => {\n if(messageReactionsList.reactions.some((reaction) => this.appPeersManager.getPeerId(reaction.peer_id) === peerId)) {\n arr.splice(idx, 1);\n }\n });\n\n let combined: {peerId: PeerId, reaction?: Reaction}[] = messageReactionsList.reactions.map((reaction) => ({peerId: this.appPeersManager.getPeerId(reaction.peer_id), reaction: reaction.reaction}));\n combined = combined.concat(filteredReadParticipants.map((readPeerId) => ({peerId: readPeerId})));\n\n return {\n reactions: messageReactionsList.reactions,\n reactionsCount: messageReactionsList.count,\n readParticipants: readParticipantsPeerIds,\n combined: combined,\n nextOffset: messageReactionsList.next_offset\n };\n });\n }\n\n public getMessageReadParticipants(peerId: PeerId, mid: number): Promise {\n return this.apiManager.invokeApiSingle('messages.getMessageReadParticipants', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(mid)\n }).then((userIds) => { // ! convert long to number\n return userIds.map((userId) => userId.toUserId());\n });\n }\n\n public async canViewMessageReadParticipants(message: Message) {\n if(\n message?._ !== 'message' ||\n message.pFlags.is_outgoing ||\n !message.pFlags.out ||\n !this.appPeersManager.isAnyGroup(message.peerId)\n ) {\n return false;\n }\n\n const chat = this.appChatsManager.getChat(message.peerId.toChatId()) as Chat.chat | Chat.channel;\n const appConfig = await this.apiManager.getAppConfig();\n return chat.participants_count <= appConfig.chat_read_mark_size_threshold &&\n (tsNow(true) - message.date) < appConfig.chat_read_mark_expire_period;\n }\n\n public incrementMessageViews(peerId: PeerId, mids: number[]) {\n if(!mids.length) {\n return;\n }\n\n return this.apiManager.invokeApiSingle('messages.getMessagesViews', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: mids.map((mid) => getServerMessageId(mid)),\n increment: true\n }).then((views) => {\n const updates: Update[] = new Array(mids.length);\n for(let i = 0, length = mids.length; i < length; ++i) {\n updates[i] = {\n _: 'updateChannelMessageViews',\n channel_id: NULL_PEER_ID,\n peerId,\n id: mids[i],\n views: views.views[i].views\n };\n }\n\n this.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 peerReaction: MessagePeerReaction,\n peerTypeNotifySettings: PeerNotifySettings\n }> = {}) {\n const peerId = this.getMessagePeer(message);\n\n if(this.appPeersManager.isPeerRestricted(peerId)) {\n return;\n }\n\n const tabs = appTabsManager.getTabs();\n let tab = tabs.find((tab) => {\n const {chatPeerIds} = tab.state;\n return chatPeerIds[chatPeerIds.length - 1] === peerId;\n });\n\n if(!tab && tabs.length) {\n tabs.sort((a, b) => a.state.idleStartTime - b.state.idleStartTime);\n tab = !tabs[0].state.idleStartTime ? tabs[0] : tabs[tabs.length - 1];\n }\n\n const port = MTProtoMessagePort.getInstance();\n port.invokeVoid('notificationBuild', {\n message,\n ...options\n }, tab?.source);\n }\n\n public getScheduledMessagesStorage(peerId: PeerId) {\n return this.scheduledMessagesStorage[peerId] ??= this.createMessageStorage(peerId, 'scheduled');\n }\n\n public getScheduledMessageByPeer(peerId: PeerId, mid: number) {\n return this.getMessageFromStorage(this.getScheduledMessagesStorage(peerId), mid);\n }\n\n public getScheduledMessages(peerId: PeerId) {\n if(!this.canSendToPeer(peerId)) return;\n\n const storage = this.getScheduledMessagesStorage(peerId);\n if(storage.size) {\n return [...storage.keys()];\n }\n\n return this.apiManager.invokeApiSingle('messages.getScheduledHistory', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n hash: ''\n }).then((historyResult) => {\n if(historyResult._ !== 'messages.messagesNotModified') {\n this.appUsersManager.saveApiUsers(historyResult.users);\n this.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 this.apiManager.invokeApi('messages.sendScheduledMessages', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: mids.map((mid) => getServerMessageId(mid))\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public deleteScheduledMessages(peerId: PeerId, mids: number[]) {\n return this.apiManager.invokeApi('messages.deleteScheduledMessages', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: mids.map((mid) => getServerMessageId(mid))\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public getMessageWithReplies(message: Message.message) {\n return this.filterMessages(message, (message) => !!(message as Message.message).replies)[0] as any;\n }\n\n public getMessageWithCommentReplies(message: Message.message) {\n if(message.peerId !== REPLIES_PEER_ID) {\n message = this.getMessageWithReplies(message);\n const replies = message?.replies;\n if(!(replies && replies.pFlags.comments && replies.channel_id.toChatId() !== REPLIES_HIDDEN_CHANNEL_ID)) {\n return;\n }\n }\n\n return message;\n }\n\n public isFetchIntervalNeeded(peerId: PeerId) {\n return peerId.isAnyChat() && (\n !this.appChatsManager.isInChat(peerId.toChatId()) ||\n this.appChatsManager.isForum(peerId.toChatId())\n );\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 const historyResult = await this.getHistory(peerId, slice[0] ?? 1, 0, 50, threadId);\n for(let i = 0, length = historyResult.history.length; i < length; ++i) {\n this.handleNewMessage(this.getMessageByPeer(peerId, historyResult.history[i]));\n }\n\n return {isBottomEnd: historyStorage.history.slice.isEnd(SliceEnd.Bottom)};\n }\n\n /**\n * * https://core.telegram.org/api/offsets, offset_id is inclusive\n */\n // public getHistory(peerId: PeerId, maxId?: number, limit?: number, backLimit?: number, threadId?: number, onlyCache?: false): Promise | HistoryResult;\n // public getHistory(peerId: PeerId, maxId?: number, limit?: number, backLimit?: number, threadId?: number, onlyCache?: true): HistoryResult;\n public getHistory(peerId: PeerId, maxId: number = 0, limit?: number, backLimit?: number, threadId?: number/* , onlyCache?: boolean */): Promise | HistoryResult {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n if(this.appPeersManager.isPeerRestricted(peerId)) {\n const first = historyStorage.history.first;\n first.setEnd(SliceEnd.Both);\n\n const slice = first.slice(0, 0);\n slice.setEnd(SliceEnd.Both);\n\n return {\n count: 0,\n history: Array.from(slice),\n isEnd: slice.getEnds(),\n offsetIdOffset: 0\n };\n }\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: Array.from(haveSlice.slice),\n isEnd: haveSlice.slice.getEnds(),\n offsetIdOffset: haveSlice.offsetIdOffset\n };\n }\n\n // if(onlyCache) {\n // return;\n // }\n\n return this.fillHistoryStorage(peerId, maxId, limit, offset, historyStorage, threadId).then(() => {\n const slice = historyStorage.history.sliceMe(maxId, offset, limit);\n const f = slice?.slice || historyStorage.history.constructSlice();\n return {\n count: historyStorage.count,\n history: Array.from(f),\n isEnd: f.getEnds(),\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(\n slicedArray: SlicedArray,\n historyResult: Parameters[0],\n offset_id: number,\n limit: number,\n add_offset: number\n ) {\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 && 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 const wasMaxId = historyStorage.maxId;\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 this.rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n }\n\n if(isBottomEnd) {\n const newMaxId = slice[0];\n\n if(historyStorage.maxId === wasMaxId) {\n const first = historyStorage.history.first;\n if(first !== slice) {\n historyStorage.history.deleteSlice(first);\n }\n\n if(historyStorage.maxId !== newMaxId) {\n historyStorage.maxId = slice[0]; // ! WARNING\n\n this.reloadConversation(peerId); // when top_message is deleted but cached\n }\n }\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: MessagesGetReplies | MessagesGetHistory = {\n peer: this.appPeersManager.getInputPeerById(peerId),\n offset_id: 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 as MessagesGetReplies).msg_id = getServerMessageId(threadId) || 0;\n }\n\n const promise: ReturnType = this.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 this.appUsersManager.saveApiUsers(historyResult.users);\n this.appChatsManager.saveApiChats(historyResult.chats);\n this.saveMessages(historyResult.messages);\n\n if('pts' in historyResult) {\n this.apiUpdatesManager.addChannelState(peerId.toChatId(), historyResult.pts);\n }\n\n let length = historyResult.messages.length, count = (historyResult as MessagesMessages.messagesMessagesSlice).count;\n if(length && !historyResult.messages[length - 1]) {\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 = this.appChatsManager.getChat(peerId.toChatId());\n if(channel._ === 'channel') {\n channel = {\n _: 'channelForbidden',\n id: peerId.toChatId(),\n access_hash: channel.access_hash,\n title: channel.title,\n pFlags: channel.pFlags\n };\n }\n\n this.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 = pause(0).then(() => {\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: getServerMessageId(mid)\n };\n });\n\n let promise: Promise;\n if(peerId.isAnyChat() && this.appPeersManager.isChannel(peerId)) {\n promise = this.apiManager.invokeApiSingle('channels.getMessages', {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n id: msgIds\n });\n } else {\n promise = this.apiManager.invokeApiSingle('messages.getMessages', {\n id: msgIds\n });\n }\n\n const after = promise.then((getMessagesResult) => {\n assumeType>(getMessagesResult);\n\n this.appUsersManager.saveApiUsers(getMessagesResult.users);\n this.appChatsManager.saveApiChats(getMessagesResult.chats);\n const messages = this.saveMessages(getMessagesResult.messages);\n\n for(let i = 0; i < messages.length; ++i) {\n const message = messages[i];\n if(!message) {\n continue;\n }\n\n const mid = generateMessageId(message.id);\n const promise = map.get(mid);\n promise.resolve(message);\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 this.rootScope.dispatchEvent('messages_downloaded', {peerId, mids});\n });\n\n requestPromises.push(after);\n }\n\n this.needSingleMessages.clear();\n\n return Promise.all(requestPromises).then(noop, noop).then(() => {\n this.fetchSingleMessagesPromise = undefined;\n if(this.needSingleMessages.size) this.fetchSingleMessages();\n });\n });\n }\n\n public reloadMessages(peerId: PeerId, mid: number, overwrite?: boolean): Promise;\n public reloadMessages(peerId: PeerId, mid: number[], overwrite?: boolean): Promise;\n public reloadMessages(peerId: PeerId, mid: number | number[], overwrite?: boolean): Promise {\n if(Array.isArray(mid)) {\n return Promise.all(mid.map((mid) => {\n return this.reloadMessages(peerId, mid, overwrite);\n }));\n }\n\n const message = this.getMessageByPeer(peerId, mid);\n if(message && !overwrite) {\n this.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 getExtendedMedia(peerId: PeerId, mids: number[]) {\n let map = this.extendedMedia.get(peerId);\n if(!map) {\n this.extendedMedia.set(peerId, map = new Map());\n }\n\n const deferred = deferredPromise();\n const toRequest: number[] = [];\n const promises = mids.map((mid) => {\n let promise = map.get(mid);\n if(!promise) {\n map.set(mid, promise = deferred);\n toRequest.push(mid);\n\n promise.then(() => {\n map.delete(mid);\n if(!map.size && this.extendedMedia.get(peerId) === map) {\n this.extendedMedia.delete(peerId);\n }\n });\n }\n\n return promise;\n });\n\n if(!toRequest.length) {\n deferred.resolve();\n } else {\n this.apiManager.invokeApi('messages.getExtendedMedia', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: toRequest.map((mid) => getServerMessageId(mid))\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n deferred.resolve();\n });\n }\n\n return Promise.all(promises);\n }\n\n public fetchMessageReplyTo(message: MyMessage) {\n if(!message.reply_to_mid) return Promise.resolve(this.generateEmptyMessage(0));\n const replyToPeerId = message.reply_to.reply_to_peer_id ? this.appPeersManager.getPeerId(message.reply_to.reply_to_peer_id) : message.peerId;\n return this.reloadMessages(replyToPeerId, message.reply_to_mid).then((originalMessage) => {\n if(!originalMessage) { // ! break the infinite loop\n message = this.getMessageByPeer(message.peerId, message.mid); // message can come from other thread\n delete message.reply_to_mid; // ! WARNING!\n }\n\n if(message._ === 'messageService') {\n const peerId = message.peerId;\n this.rootScope.dispatchEvent('message_edit', {\n storageKey: `${peerId}_history`,\n peerId: peerId,\n mid: message.mid,\n message\n });\n\n if(this.isMessageIsTopMessage(message)) {\n this.rootScope.dispatchEvent('dialogs_multiupdate', new Map([[peerId, {dialog: this.getDialogOnly(peerId)}]]));\n }\n }\n\n return originalMessage;\n });\n }\n\n private getTypingKey(peerId: PeerId, threadId?: number) {\n return threadId ? `${peerId}_${threadId}` : peerId;\n }\n\n public setTyping(\n peerId: PeerId,\n action: SendMessageAction,\n force?: boolean,\n threadId?: number\n ): Promise {\n if(threadId && !this.appPeersManager.isForum(peerId)) {\n threadId = undefined;\n }\n\n const key = this.getTypingKey(peerId, threadId);\n let typing = this.typings[key];\n if(\n !peerId ||\n !this.canSendToPeer(peerId) ||\n peerId === this.appPeersManager.peerId ||\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[key] = {\n action\n };\n\n return this.apiManager.invokeApi('messages.setTyping', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n action,\n top_msg_id: threadId ? getServerMessageId(threadId) : undefined\n }).finally(() => {\n if(typing === this.typings[key]) {\n typing.timeout = ctx.setTimeout(() => {\n delete this.typings[key];\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 this.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 = this.appWebPagesManager.getMessageKeyForPendingWebPage(message.peerId, message.mid, isScheduled);\n this.appWebPagesManager.deleteWebPageFromPending(media.webpage, messageKey);\n }\n\n if((media as MessageMedia.messageMediaPoll).poll) {\n this.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) {\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 this.rootScope.dispatchEvent('notification_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\n if(history.albums) {\n for(const groupedId in history.albums) {\n this.dispatchAlbumEdit(groupedId, storage, [...history.albums[groupedId]]);\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, storage: MessagesStorage) {\n if(oldMessage._ === 'message') {\n if((oldMessage.media as MessageMedia.messageMediaWebPage)?.webpage) {\n const messageKey = this.appWebPagesManager.getMessageKeyForPendingWebPage(oldMessage.peerId, oldMessage.mid, !!oldMessage.pFlags.is_scheduled);\n this.appWebPagesManager.deleteWebPageFromPending((oldMessage.media as MessageMedia.messageMediaWebPage).webpage, messageKey);\n }\n\n const groupedId = oldMessage.grouped_id;\n if(groupedId) {\n this.dispatchAlbumEdit(groupedId, storage, []);\n }\n }\n }\n\n private dispatchAlbumEdit(groupedId: string, storage: MessagesStorage, deletedMids?: number[]) {\n const mids = this.getMidsByAlbum(groupedId);\n const messages = mids.map((mid) => this.getMessageFromStorage(storage, mid)) as Message.message[];\n this.rootScope.dispatchEvent('album_edit', {peerId: messages[0].peerId, groupId: groupedId, deletedMids: deletedMids || [], messages});\n }\n\n public getDialogUnreadCount(dialog: Dialog | ForumTopic) {\n let unreadCount = dialog.unread_count;\n if(!this.dialogsStorage.isTopic(dialog) && this.appPeersManager.isForum(dialog.peerId)) {\n const forumUnreadCount = this.dialogsStorage.getForumUnreadCount(dialog.peerId);\n if(forumUnreadCount instanceof Promise) {\n unreadCount = 0;\n } else {\n unreadCount = forumUnreadCount.count;\n }\n }\n\n return unreadCount || +!!(dialog as Dialog).pFlags?.unread_mark;\n }\n\n public isDialogUnread(dialog: Dialog | ForumTopic) {\n return !!this.getDialogUnreadCount(dialog);\n }\n\n public canForward(message: Message.message | Message.messageService) {\n return message?._ === 'message' && !(message as Message.message).pFlags.noforwards && !this.appPeersManager.noForwards(message.peerId);\n }\n\n private pushBatchUpdate(\n event: E,\n callback: C,\n key: string,\n getElementCallback?: () => MapValueType[0]>\n ) {\n let details = this.batchUpdates[event];\n if(!details) {\n // @ts-ignore\n details = this.batchUpdates[event] = {\n callback,\n batch: new Map()\n };\n }\n\n if(!details.batch.has(key)) {\n // @ts-ignore\n details.batch.set(key, getElementCallback ? getElementCallback() : undefined);\n this.batchUpdatesDebounced();\n }\n }\n\n private getMessagesFromMap>(map: T) {\n const newMap: Map> = new Map();\n for(const [key, value] of map) {\n const [peerIdStr, mid] = key.split('_');\n const message = this.getMessageByPeer(peerIdStr.toPeerId(), +mid) as Message.message;\n if(!message) {\n continue;\n }\n\n newMap.set(message, value);\n }\n\n return newMap;\n }\n\n private batchUpdateViews = (batch: Map) => {\n const toDispatch: {peerId: PeerId, mid: number, views: number}[] = [];\n\n const map = this.getMessagesFromMap(batch);\n for(const [message] of map) {\n toDispatch.push({\n peerId: message.peerId,\n mid: message.mid,\n views: message.views\n })\n }\n\n return toDispatch;\n };\n\n private batchUpdateReactions = (batch: Map) => {\n const toDispatch: {message: Message.message, changedResults: ReactionCount.reactionCount[]}[] = [];\n\n const map = this.getMessagesFromMap(batch);\n for(const [message, previousReactions] of map) {\n const results = message.reactions?.results ?? [];\n const previousResults = previousReactions?.results ?? [];\n const changedResults = results.filter((reactionCount) => {\n const previousReactionCount = previousResults.find((_reactionCount) => reactionsEqual(_reactionCount.reaction, reactionCount.reaction));\n return (\n message.pFlags.out && (\n !previousReactionCount ||\n reactionCount.count > previousReactionCount.count\n )\n ) || (\n reactionCount.chosen_order !== undefined && (\n !previousReactionCount ||\n previousReactionCount.chosen_order === undefined\n )\n );\n });\n\n toDispatch.push({message, changedResults});\n }\n\n return toDispatch;\n };\n\n public saveDefaultSendAs(peerId: PeerId, sendAsPeerId: PeerId) {\n const channelFull = this.appProfileManager.getCachedFullChat(peerId.toChatId()) as ChatFull.channelFull;\n channelFull.default_send_as = this.appPeersManager.getOutputPeer(sendAsPeerId);\n return this.apiManager.invokeApi('messages.saveDefaultSendAs', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n send_as: this.appPeersManager.getInputPeerById(sendAsPeerId)\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 {getFileNameByLocation} from '../../../../helpers/fileName';\nimport {Document} from '../../../../layer';\nimport getDocumentInputFileLocation from './getDocumentInputFileLocation';\n\nexport default function getDocumentInputFileName(doc: Document.document, thumbSize?: string) {\n return getFileNameByLocation(getDocumentInputFileLocation(doc, thumbSize), {fileName: doc.file_name});\n}\n","export default function convertInputKeyToKey(inputKey: string) {\n const str = inputKey.replace('input', '');\n return (str[0].toLowerCase() + str.slice(1)) as T;\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 tsNow from '../../helpers/tsNow';\nimport {InputNotifyPeer, InputPeerNotifySettings, NotifyPeer, PeerNotifySettings, Update} from '../../layer';\nimport {MUTE_UNTIL} from '../mtproto/mtproto_config';\nimport throttle from '../../helpers/schedulers/throttle';\nimport convertInputKeyToKey from '../../helpers/string/convertInputKeyToKey';\nimport {AppManager} from './manager';\nimport ctx from '../../environment/ctx';\nimport assumeType from '../../helpers/assumeType';\nimport generateMessageId from './utils/messageId/generateMessageId';\n\ntype ImSadAboutIt = Promise | PeerNotifySettings;\ntype MyNotifyPeer = Exclude;\ntype MyInputNotifyPeer = Exclude;\nexport class AppNotificationsManager extends AppManager {\n private peerSettings = {\n notifyPeer: {} as {[peerId: string]: ImSadAboutIt},\n notifyUsers: null as ImSadAboutIt,\n notifyChats: null as ImSadAboutIt,\n notifyBroadcasts: null as ImSadAboutIt,\n notifyForumTopic: {} as {[peerId_threadId: string]: ImSadAboutIt}\n };\n // private exceptions: {[peerId: string]: PeerNotifySettings} = {};\n\n private getNotifyPeerTypePromise: Promise;\n\n private checkMuteUntilTimeout: number;\n private checkMuteUntilThrottled: () => void;\n\n private notifyContactsSignUp: Promise;\n\n protected after() {\n this.checkMuteUntilThrottled = throttle(this.checkMuteUntil, 1000, false);\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateNotifySettings: (update) => {\n const {peer} = update;\n const isTopic = peer._ === 'notifyForumTopic';\n const isPeerType = peer._ === 'notifyPeer' || isTopic;\n const peerId = isPeerType && this.appPeersManager.getPeerId(peer.peer);\n const key = !isPeerType ? peer._ : undefined;\n this.savePeerSettings({\n key,\n peerId,\n threadId: isTopic ? generateMessageId(peer.top_msg_id) : undefined,\n settings: update.notify_settings\n });\n this.rootScope.dispatchEvent('notify_settings', update);\n }\n });\n\n return this.appStateManager.getState().then((state) => {\n if(state.notifySettings) {\n for(const key in state.notifySettings) {\n assumeType(key);\n this.savePeerSettings({\n key,\n settings: state.notifySettings[key]\n });\n }\n }\n });\n }\n\n public getNotifySettings(peer: InputNotifyPeer): ImSadAboutIt {\n let key: any = convertInputKeyToKey(peer._);\n let obj: any = this.peerSettings[key as MyNotifyPeer];\n\n let peerId: PeerId;\n if(peer._ === 'inputNotifyPeer') {\n peerId = key = this.appPeersManager.getPeerId(peer.peer);\n obj = obj[key];\n }\n\n if(obj) {\n return obj;\n }\n\n return (obj || this.peerSettings)[key] = this.apiManager.invokeApi('account.getNotifySettings', {peer})\n .then((settings) => {\n this.savePeerSettings({\n key,\n peerId,\n settings\n });\n\n return settings;\n });\n }\n\n public getNotifyPeerTypeSettings() {\n if(this.getNotifyPeerTypePromise) return this.getNotifyPeerTypePromise;\n\n const promises = (['inputNotifyBroadcasts', 'inputNotifyUsers', 'inputNotifyChats'] as MyInputNotifyPeer[])\n .map((inputKey) => {\n return this.getNotifySettings({_: inputKey});\n });\n\n return this.getNotifyPeerTypePromise = Promise.all(promises);\n }\n\n public updateNotifySettings(peer: InputNotifyPeer, settings: InputPeerNotifySettings) {\n // this.savePeerSettings(peerId, settings);\n\n /* const inputSettings: InputPeerNotifySettings = copy(settings) as any;\n inputSettings._ = 'inputPeerNotifySettings'; */\n\n return this.apiManager.invokeApi('account.updateNotifySettings', {\n peer,\n settings\n }).then((value) => {\n if(value) {\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateNotifySettings',\n peer: {\n ...peer as any,\n _: convertInputKeyToKey(peer._)\n },\n notify_settings: { // ! WOW, IT WORKS !\n ...settings,\n _: 'peerNotifySettings'\n }\n });\n }\n });\n }\n\n // public getNotifyExceptions() {\n // apiManager.invokeApi('account.getNotifyExceptions', {compare_sound: true})\n // .then((updates) => {\n // apiUpdatesManager.processUpdateMessage(updates);\n // });\n // }\n\n public getContactSignUpNotification() {\n if(this.notifyContactsSignUp) return this.notifyContactsSignUp;\n return this.notifyContactsSignUp = this.apiManager.invokeApi('account.getContactSignUpNotification');\n }\n\n public setContactSignUpNotification(silent: boolean) {\n this.apiManager.invokeApi('account.setContactSignUpNotification', {silent})\n .then((value) => {\n this.notifyContactsSignUp = Promise.resolve(!silent);\n });\n }\n\n private checkMuteUntil = () => {\n if(this.checkMuteUntilTimeout !== undefined) {\n clearTimeout(this.checkMuteUntilTimeout);\n this.checkMuteUntilTimeout = undefined;\n }\n\n const timestamp = tsNow(true);\n let closestMuteUntil = MUTE_UNTIL;\n\n const p = (peerNotifySettings: ImSadAboutIt): peerNotifySettings is PeerNotifySettings => {\n if(peerNotifySettings instanceof Promise) {\n return false;\n }\n\n const muteUntil = peerNotifySettings.mute_until;\n if(!muteUntil) {\n return false;\n }\n\n if(muteUntil <= timestamp) {\n // ! do not delete it because peer's unique settings will be overwritten in getPeerLocalSettings with type's settings\n peerNotifySettings.mute_until = 0;\n return true;\n } else if(muteUntil < closestMuteUntil) {\n closestMuteUntil = muteUntil;\n }\n\n return false;\n };\n\n [\n 'notifyPeer' as const,\n 'notifyForumTopic' as const\n ].forEach((typeKey) => {\n for(const key in this.peerSettings[typeKey]) {\n const peerNotifySettings = this.peerSettings[typeKey][key];\n if(p(peerNotifySettings)) {\n const [peerId, topicId] = key.split('_');\n const peer = this.appPeersManager.getOutputPeer(peerId.toPeerId());\n this.apiUpdatesManager.saveUpdate({\n _: 'updateNotifySettings',\n peer: topicId ? {\n _: 'notifyForumTopic',\n peer,\n top_msg_id: +topicId\n } : {\n _: 'notifyPeer',\n peer\n },\n notify_settings: peerNotifySettings\n });\n }\n }\n });\n\n const timeout = Math.min(1800e3, (closestMuteUntil - timestamp) * 1000);\n this.checkMuteUntilTimeout = ctx.setTimeout(this.checkMuteUntil, timeout);\n };\n\n public getPeerKey(peerId: PeerId, threadId?: number) {\n return peerId + (threadId ? '_' + threadId : '');\n }\n\n public savePeerSettings({key, peerId, threadId, settings}: {\n key?: Exclude,\n peerId?: PeerId,\n threadId?: number,\n settings: PeerNotifySettings\n }) {\n let obj: any;\n if(peerId) {\n key = this.getPeerKey(peerId, threadId) as any;\n obj = this.peerSettings[threadId ? 'notifyForumTopic' : 'notifyPeer'];\n }\n\n (obj || this.peerSettings)[key] = settings;\n\n if(!peerId) {\n this.rootScope.dispatchEvent('notify_peer_type_settings', {key, settings});\n this.appStateManager.getState().then((state) => {\n const notifySettings = state.notifySettings;\n notifySettings[key] = settings;\n this.appStateManager.pushToState('notifySettings', notifySettings);\n });\n } else {\n this.checkMuteUntilThrottled();\n }\n\n // rootScope.broadcast('notify_settings', {peerId: peerId});\n }\n\n public isMuted(peerNotifySettings: PeerNotifySettings) {\n return peerNotifySettings._ === 'peerNotifySettings' &&\n (peerNotifySettings.silent || (peerNotifySettings.mute_until !== undefined && (peerNotifySettings.mute_until * 1000) > tsNow()));\n }\n\n private getPeerMuted(peerId: PeerId) {\n const ret = this.getNotifySettings({_: 'inputNotifyPeer', peer: this.appPeersManager.getInputPeerById(peerId)});\n return (ret instanceof Promise ? ret : Promise.resolve(ret))\n .then((peerNotifySettings) => this.isMuted(peerNotifySettings));\n }\n\n private getPeerLocalSettings({\n peerId,\n respectType = true,\n threadId\n }: {\n peerId: PeerId,\n respectType?: boolean,\n threadId?: number\n }): PeerNotifySettings {\n const n: PeerNotifySettings = {\n _: 'peerNotifySettings'\n };\n\n const peerKey = this.getPeerKey(peerId, threadId);\n const notifySettings = this.peerSettings[threadId ? 'notifyForumTopic' : 'notifyPeer'][peerKey];\n // if(!notifySettings || (notifySettings instanceof Promise)) return false;\n if(notifySettings && !(notifySettings instanceof Promise)) {\n Object.assign(n, notifySettings);\n }\n\n if(respectType) {\n const inputNotify = this.appPeersManager.getInputNotifyPeerById({peerId, ignorePeerId: true, threadId});\n const key = convertInputKeyToKey(inputNotify._);\n const typeNotifySettings = this.peerSettings[key as MyNotifyPeer];\n if(typeNotifySettings && !(typeNotifySettings instanceof Promise)) {\n for(const i in typeNotifySettings) {\n // @ts-ignore\n if(n[i] === undefined) {\n // @ts-ignore\n n[i] = typeNotifySettings[i];\n }\n }\n }\n }\n\n return n;\n }\n\n public validatePeerSettings[0]>(options: T): T {\n if(options.peerId === this.appPeersManager.peerId) return;\n if(options.threadId && !this.appPeersManager.isForum(options.peerId)) options.threadId = undefined;\n return options;\n }\n\n public isPeerLocalMuted(options: Parameters[0]): boolean {\n if(!(options = this.validatePeerSettings(options))) return false;\n\n if(options.threadId) {\n const notifySettings = this.getPeerLocalSettings({...options, respectType: false});\n if(notifySettings.silent !== undefined || notifySettings.mute_until !== undefined) {\n return this.isMuted(notifySettings);\n } else {\n return this.isPeerLocalMuted({...options, threadId: undefined});\n }\n }\n\n const notifySettings = this.getPeerLocalSettings(options);\n const isMuted = this.isMuted(notifySettings);\n return isMuted;\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 type {Chat, ChatPhoto, DialogPeer, InputChannel, InputDialogPeer, InputNotifyPeer, InputPeer, Peer, Update, User, UserProfilePhoto} from '../../layer';\nimport type {LangPackKey} from '../langPack';\nimport {getRestrictionReason} from '../../helpers/restrictions';\nimport isObject from '../../helpers/object/isObject';\nimport {AppManager} from './manager';\nimport getPeerId from './utils/peers/getPeerId';\nimport isUser from './utils/peers/isUser';\nimport isAnyChat from './utils/peers/isAnyChat';\nimport {NULL_PEER_ID} from '../mtproto/mtproto_config';\nimport getPeerActiveUsernames from './utils/peers/getPeerActiveUsernames';\nimport isPeerRestricted from './utils/peers/isPeerRestricted';\nimport getPeerPhoto from './utils/peers/getPeerPhoto';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\n\nexport type PeerType = 'channel' | 'chat' | 'megagroup' | 'group' | 'saved';\nexport class AppPeersManager extends AppManager {\n public get peerId() {\n return this.appUsersManager.userId.toPeerId();\n }\n /* public savePeerInstance(peerId: PeerId, instance: any) {\n if(peerId < 0) appChatsManager.saveApiChat(instance);\n else appUsersManager.saveApiUser(instance);\n } */\n\n public canPinMessage(peerId: PeerId) {\n return peerId.isUser() || this.appChatsManager.hasRights(peerId.toChatId(), 'pin_messages');\n }\n\n public getPeerPhoto(peerId: PeerId) {\n const peer = this.getPeer(peerId) as User.user | Chat.channel;\n return getPeerPhoto(peer);\n }\n\n public getPeerMigratedTo(peerId: PeerId) {\n if(peerId.isUser()) {\n return false;\n }\n\n const chat = this.appChatsManager.getChat(peerId.toChatId()) as Chat.chat;\n const migratedTo = chat?.migrated_to;\n if(migratedTo && chat.pFlags.deactivated) {\n return getPeerId(migratedTo);\n }\n\n return false;\n }\n\n public getOutputPeer(peerId: PeerId): Peer {\n if(peerId.isUser()) {\n return {_: 'peerUser', user_id: peerId.toUserId()};\n }\n\n const chatId = peerId.toChatId();\n if(this.appChatsManager.isChannel(chatId)) {\n return {_: 'peerChannel', channel_id: chatId};\n }\n\n return {_: 'peerChat', chat_id: chatId};\n }\n\n public getPeerString(peerId: PeerId) {\n if(peerId.isUser()) {\n return this.appUsersManager.getUserString(peerId.toUserId());\n }\n return this.appChatsManager.getChatString(peerId.toChatId());\n }\n\n public getPeerUsername(peerId: PeerId) {\n return this.getPeerActiveUsernames(peerId)[0] || '';\n }\n\n public getPeerActiveUsernames(peerId: PeerId) {\n const peer = this.getPeer(peerId);\n return getPeerActiveUsernames(peer);\n }\n\n public getPeer(peerId: PeerId) {\n return peerId.isUser() ?\n this.appUsersManager.getUser(peerId.toUserId()) :\n this.appChatsManager.getChat(peerId.toChatId());\n }\n\n public getPeerId(peerId: Parameters[0]) {\n return getPeerId(peerId) || (isObject(peerId) && peerId._ === 'inputPeerSelf' && this.peerId) || NULL_PEER_ID;\n }\n\n public getDialogPeer(peerId: PeerId): DialogPeer {\n return {\n _: 'dialogPeer',\n peer: this.getOutputPeer(peerId)\n };\n }\n\n public isChannel(peerId: PeerId): boolean {\n return !peerId.isUser() && this.appChatsManager.isChannel(peerId.toChatId());\n }\n\n public isMegagroup(peerId: PeerId) {\n return !peerId.isUser() && this.appChatsManager.isMegagroup(peerId.toChatId());\n }\n\n public isForum(peerId: PeerId) {\n return !peerId.isUser() && this.appChatsManager.isForum(peerId.toChatId());\n }\n\n public isAnyGroup(peerId: PeerId): boolean {\n return !peerId.isUser() && !this.appChatsManager.isBroadcast(peerId.toChatId());\n }\n\n public isBroadcast(peerId: PeerId): boolean {\n return this.isChannel(peerId) && !this.isMegagroup(peerId);\n }\n\n public isBot(peerId: PeerId): boolean {\n return peerId.isUser() && this.appUsersManager.isBot(peerId.toUserId());\n }\n\n public isContact(peerId: PeerId): boolean {\n return peerId.isUser() && this.appUsersManager.isContact(peerId.toUserId());\n }\n\n public isUser(peerId: PeerId)/* : peerId is UserId */ {\n return isUser(peerId);\n }\n\n public isAnyChat(peerId: PeerId) {\n return isAnyChat(peerId);\n }\n\n public isPeerRestricted(peerId: PeerId) {\n return isPeerRestricted(this.getPeer(peerId));\n }\n\n public getRestrictionReasonText(peerId: PeerId) {\n const peer = this.getPeer(peerId) as Chat.channel | User.user;\n const reason = peer.restriction_reason ? getRestrictionReason(peer.restriction_reason) : undefined;\n if(reason) {\n return reason.text;\n } else {\n return peerId.isUser() ? 'This user is restricted' : 'This chat is restricted';\n }\n }\n\n /* public getInputPeer(peerString: string): InputPeer {\n var firstChar = peerString.charAt(0);\n var peerParams = peerString.substr(1).split('_');\n let id = +peerParams[0];\n\n if(firstChar === 'u') {\n //appUsersManager.saveUserAccess(id, peerParams[1]);\n\n return {\n _: 'inputPeerUser',\n user_id: id,\n access_hash: peerParams[1]\n };\n } else if(firstChar === 'c' || firstChar === 's') {\n //appChatsManager.saveChannelAccess(id, peerParams[1]);\n if(firstChar === 's') {\n appChatsManager.saveIsMegagroup(id);\n }\n\n return {\n _: 'inputPeerChannel',\n channel_id: id,\n access_hash: peerParams[1] || '0'\n };\n } else {\n return {\n _: 'inputPeerChat',\n chat_id: id\n };\n }\n } */\n\n // public getInputNotifyPeerById(peerId: PeerId, ignorePeerId: true): Exclude;\n // public getInputNotifyPeerById(peerId: PeerId, ignorePeerId?: false): InputNotifyPeer.inputNotifyPeer;\n // public getInputNotifyPeerById(peerId: PeerId, ignorePeerId?: boolean): InputNotifyPeer {\n public getInputNotifyPeerById({\n peerId,\n ignorePeerId,\n threadId\n }: T): T['ignorePeerId'] extends true ? Exclude : (T['threadId'] extends number ? InputNotifyPeer.inputNotifyForumTopic : InputNotifyPeer.inputNotifyPeer) {\n if(ignorePeerId) {\n if(peerId.isUser()) {\n return {_: 'inputNotifyUsers'} as any;\n } else {\n if(this.isBroadcast(peerId)) {\n return {_: 'inputNotifyBroadcasts'} as any;\n } else {\n return {_: 'inputNotifyChats'} as any;\n }\n }\n } else if(threadId) {\n return {\n _: 'inputNotifyForumTopic',\n peer: this.getInputPeerById(peerId),\n top_msg_id: getServerMessageId(threadId)\n } as any;\n } else {\n return {\n _: 'inputNotifyPeer',\n peer: this.getInputPeerById(peerId)\n } as any;\n }\n }\n\n public getInputPeerById(peerId: PeerId): InputPeer {\n if(!peerId) {\n return {_: 'inputPeerEmpty'};\n }\n\n if(!peerId.isUser()) {\n const chatId = peerId.toChatId();\n return this.appChatsManager.getInputPeer(chatId);\n }\n\n const userId = peerId.toUserId();\n return this.appUsersManager.getUserInputPeer(userId);\n }\n\n /**\n * ! use it only in safe places like requests\n */\n public getInputPeerSelf(): InputPeer.inputPeerSelf {\n return {_: 'inputPeerSelf'};\n }\n\n public getInputDialogPeerById(peerId: PeerId | InputPeer): InputDialogPeer {\n return {\n _: 'inputDialogPeer',\n peer: isObject(peerId) ? peerId : this.getInputPeerById(peerId)\n };\n }\n\n public getPeerSearchText(peerId: PeerId) {\n let text: string;\n if(this.isUser(peerId)) {\n text = '%pu ' + this.appUsersManager.getUserSearchText(peerId.toUserId());\n } else {\n const chat = this.appChatsManager.getChat(peerId.toChatId());\n text = '%pg ' + (chat.title || '');\n }\n\n return text;\n }\n\n public getDialogType(peerId: PeerId): PeerType {\n if(this.isMegagroup(peerId)) {\n return 'megagroup';\n } else if(this.isChannel(peerId)) {\n return 'channel';\n } else if(!this.isUser(peerId)) {\n return 'group';\n } else {\n return peerId === this.peerId ? 'saved' : 'chat';\n }\n }\n\n public getDeleteButtonText(peerId: PeerId): Extract {\n switch(this.getDialogType(peerId)) {\n case 'channel':\n return this.appChatsManager.hasRights(peerId.toChatId(), 'delete_chat') ? 'ChannelDelete' : 'ChatList.Context.LeaveChannel';\n\n case 'megagroup':\n case 'group':\n return this.appChatsManager.hasRights(peerId.toChatId(), 'delete_chat') ? 'DeleteMega' : 'ChatList.Context.LeaveGroup';\n\n default:\n return 'ChatList.Context.DeleteChat';\n }\n }\n\n public noForwards(peerId: PeerId) {\n if(peerId.isUser()) return false;\n else {\n const chat = this.appChatsManager.getChat(peerId.toChatId());\n return !!(chat as Chat.chat).pFlags?.noforwards;\n }\n }\n}\n\nexport type IsPeerType = 'isChannel' | 'isMegagroup' | 'isAnyGroup' | 'isBroadcast' | 'isBot' | 'isContact' | 'isUser' | 'isAnyChat';\n","/*\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 {Photo, PhotoSize, PhotosPhotos} from '../../layer';\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport isObject from '../../helpers/object/isObject';\nimport safeReplaceArrayInObject from '../../helpers/object/safeReplaceArrayInObject';\nimport {AppManager} from './manager';\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 extends AppManager {\n private photos: {\n [id: string]: MyPhoto\n } = {};\n\n public savePhoto(photo: Photo, context?: ReferenceContext) {\n if(!photo || photo._ === 'photoEmpty') return;\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 this.referenceDatabase.saveContext(photo.file_reference, context);\n }\n\n if(photo.sizes?.length) {\n // * sometimes photoStrippedSize can be the last item\n photo.sizes.sort((a, b) => {\n return ((a as PhotoSize.photoSize).size || ((a as PhotoSize.photoSizeProgressive).sizes ? Infinity : 0)) - ((b as PhotoSize.photoSize).size || ((b as PhotoSize.photoSizeProgressive).sizes ? Infinity : 0));\n });\n\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 getUserPhotos(userId: UserId, maxId: Photo.photo['id'] = '0', limit: number = 20) {\n const inputUser = this.appUsersManager.getUserInput(userId);\n return this.apiManager.invokeApiCacheable('photos.getUserPhotos', {\n user_id: inputUser,\n offset: 0,\n limit,\n max_id: maxId\n }, {cacheSeconds: 60}).then((photosResult) => {\n this.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 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 getPhoto(photoId: any/* MyPhoto | string */): MyPhoto {\n return isObject(photoId) ? photoId as MyPhoto : this.photos[photoId as any as string];\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 from '../../helpers/object/copy';\nimport {InputMedia, Message, MessageEntity, MessageMedia, Poll, PollResults} from '../../layer';\nimport {logger, LogTypes} from '../logger';\nimport parseMarkdown from '../richTextProcessor/parseMarkdown';\nimport {AppManager} from './manager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\n\ntype PollId = Poll['id'];\n\nexport class AppPollsManager extends AppManager {\n public polls: {[id: PollId]: Poll} = {};\n public results: {[id: PollId]: PollResults} = {};\n public pollToMessages: {[id: PollId]: Set} = {};\n\n private log = logger('POLLS', LogTypes.Error);\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateMessagePoll: (update) => {\n this.log('updateMessagePoll:', update);\n\n let poll: Poll = update.poll || this.polls[update.poll_id];\n if(!poll) {\n return;\n }\n\n let results = update.results;\n const ret = this.savePoll(poll, results as any);\n poll = ret.poll;\n results = ret.results;\n\n this.rootScope.dispatchEvent('poll_update', {poll, results: results as any});\n }\n });\n }\n\n public savePoll(poll: Poll, results: PollResults, message?: Message.message) {\n if(message) {\n this.updatePollToMessage(message, true);\n }\n\n const id = poll.id;\n if(this.polls[id]) {\n poll = Object.assign(this.polls[id], poll);\n results = this.saveResults(poll, results);\n } else {\n this.polls[id] = poll;\n\n poll.chosenIndexes = [];\n results = this.saveResults(poll, results);\n }\n\n return {poll, results};\n }\n\n public saveResults(poll: Poll, results: PollResults) {\n if(this.results[poll.id]) {\n results = Object.assign(this.results[poll.id], results);\n } else {\n this.results[poll.id] = results;\n }\n\n if(!results.pFlags.min) { // ! https://core.telegram.org/constructor/pollResults - min\n poll.chosenIndexes.length = 0;\n if(results?.results?.length) {\n results.results.forEach((answer, idx) => {\n if(answer.pFlags?.chosen) {\n poll.chosenIndexes.push(idx);\n }\n });\n }\n }\n\n return results;\n }\n\n public getPoll(pollId: PollId): {poll: Poll, results: PollResults} {\n return {\n poll: this.polls[pollId],\n results: this.results[pollId]\n };\n }\n\n public getInputMediaPoll(poll: Poll, correctAnswers?: Uint8Array[], solution?: string, solutionEntities?: MessageEntity[]): InputMedia.inputMediaPoll {\n if(solution) {\n if(!solutionEntities) {\n solutionEntities = [];\n }\n\n solution = parseMarkdown(solution, solutionEntities);\n } else {\n solution = undefined; // can be string here\n }\n\n return {\n _: 'inputMediaPoll',\n poll,\n correct_answers: correctAnswers,\n solution,\n solution_entities: solution ? solutionEntities : undefined\n };\n }\n\n public updatePollToMessage(message: Message.message, add: boolean) {\n const {id} = (message.media as MessageMedia.messageMediaPoll).poll;\n let set = this.pollToMessages[id];\n\n if(!add && !set) {\n return;\n }\n\n if(!set) {\n set = this.pollToMessages[id] = new Set();\n }\n\n const key = message.peerId + '_' + message.mid;\n if(add) set.add(key);\n else set.delete(key);\n\n if(!add && !set.size) {\n delete this.polls[id];\n delete this.results[id];\n delete this.pollToMessages[id];\n }\n }\n\n public sendVote(message: Message.message, optionIds: number[]): Promise {\n const poll: Poll = (message.media as MessageMedia.messageMediaPoll).poll;\n\n const options: Uint8Array[] = optionIds.map((index) => {\n return poll.answers[index].option;\n });\n\n const messageId = message.mid;\n const peerId = message.peerId;\n const inputPeer = this.appPeersManager.getInputPeerById(peerId);\n\n if(message.pFlags.is_outgoing) {\n return this.appMessagesManager.invokeAfterMessageIsSent(messageId, 'sendVote', (message) => {\n this.log('invoke sendVote callback');\n return this.sendVote(message as Message.message, optionIds);\n });\n }\n\n return this.apiManager.invokeApi('messages.sendVote', {\n peer: inputPeer,\n msg_id: getServerMessageId(message.mid),\n options\n }).then((updates) => {\n this.log('sendVote updates:', updates);\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public getResults(message: Message.message) {\n const inputPeer = this.appPeersManager.getInputPeerById(message.peerId);\n\n return this.apiManager.invokeApi('messages.getPollResults', {\n peer: inputPeer,\n msg_id: getServerMessageId(message.mid)\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n this.log('getResults updates:', updates);\n });\n }\n\n public getVotes(message: Message.message, option?: Uint8Array, offset?: string, limit = 20) {\n return this.apiManager.invokeApi('messages.getPollVotes', {\n peer: this.appPeersManager.getInputPeerById(message.peerId),\n id: getServerMessageId(message.mid),\n option,\n offset,\n limit\n }).then((votesList) => {\n this.log('getPollVotes messages:', votesList);\n\n this.appUsersManager.saveApiUsers(votesList.users);\n\n return votesList;\n });\n }\n\n public stopPoll(message: Message.message) {\n const poll: Poll = (message.media as MessageMedia.messageMediaPoll).poll;\n\n if(poll.pFlags.closed) return Promise.resolve();\n\n const newPoll = copy(poll);\n newPoll.pFlags.closed = true;\n return this.appMessagesManager.editMessage(message, undefined, {\n newMedia: this.getInputMediaPoll(newPoll)\n }).then(() => {\n // console.log('stopped poll');\n }, err => {\n this.log.error('stopPoll error:', err);\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 {InputPrivacyKey, InputPrivacyRule, PrivacyRule, PrivacyKey, GlobalPrivacySettings} from '../../layer';\nimport convertInputKeyToKey from '../../helpers/string/convertInputKeyToKey';\nimport {AppManager} from './manager';\n\nexport class AppPrivacyManager extends AppManager {\n private privacy: Partial<{\n [key in PrivacyKey['_']]: PrivacyRule[] | Promise\n }> = {};\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updatePrivacy: (update) => {\n const key = update.key._;\n this.privacy[key] = update.rules;\n this.rootScope.dispatchEvent('privacy_update', update);\n }\n });\n }\n\n public setPrivacy(inputKey: InputPrivacyKey['_'], rules: InputPrivacyRule[]) {\n return this.apiManager.invokeApi('account.setPrivacy', {\n key: {\n _: inputKey\n },\n rules\n }).then((privacyRules) => {\n this.appUsersManager.saveApiUsers(privacyRules.users);\n this.appChatsManager.saveApiChats(privacyRules.chats);\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updatePrivacy',\n key: {\n _: convertInputKeyToKey(inputKey)\n },\n rules: rules.map((inputRule) => {\n const rule: PrivacyRule = {} as any;\n Object.assign(rule, inputRule);\n rule._ = convertInputKeyToKey(rule._) as any;\n return rule;\n })\n });\n\n // console.log('privacy rules', inputKey, privacyRules, privacyRules.rules);\n\n return privacyRules.rules;\n });\n }\n\n public getPrivacy(inputKey: InputPrivacyKey['_']) {\n const privacyKey: PrivacyKey['_'] = convertInputKeyToKey(inputKey) as any;\n const rules = this.privacy[privacyKey];\n if(rules) {\n return Promise.resolve(rules);\n }\n\n return this.privacy[privacyKey] = this.apiManager.invokeApi('account.getPrivacy', {\n key: {\n _: inputKey\n }\n }).then((privacyRules) => {\n this.appUsersManager.saveApiUsers(privacyRules.users);\n this.appChatsManager.saveApiChats(privacyRules.chats);\n\n // console.log('privacy rules', inputKey, privacyRules, privacyRules.rules);\n\n return this.privacy[privacyKey] = privacyRules.rules;\n });\n }\n\n public getGlobalPrivacySettings() {\n return this.apiManager.invokeApi('account.getGlobalPrivacySettings');\n }\n\n public setGlobalPrivacySettings(settings: GlobalPrivacySettings) {\n return this.apiManager.invokeApi('account.setGlobalPrivacySettings', {settings});\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 type {MyTopPeer} from './appUsersManager';\nimport tsNow from '../../helpers/tsNow';\nimport {ChannelParticipantsFilter, ChannelsChannelParticipants, ChannelParticipant, Chat, ChatFull, ChatParticipants, ChatPhoto, ExportedChatInvite, InputChannel, InputFile, SendMessageAction, Update, UserFull, Photo, PhotoSize, Updates} from '../../layer';\nimport SearchIndex from '../searchIndex';\nimport {AppManager} from './manager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport getPhotoInput from './utils/photos/getPhotoInput';\nimport getParticipantPeerId from './utils/chats/getParticipantPeerId';\nimport ctx from '../../environment/ctx';\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport generateMessageId from './utils/messageId/generateMessageId';\n\nexport type UserTyping = Partial<{userId: UserId, action: SendMessageAction, timeout: number}>;\n\nconst PEER_FULL_TTL = 3 * 60e3;\n\nexport class AppProfileManager extends AppManager {\n // private botInfos: any = {};\n private usersFull: {[id: UserId]: UserFull.userFull} = {};\n private chatsFull: {[id: ChatId]: ChatFull} = {};\n private fullExpiration: {[peerId: PeerId]: number} = {};\n private typingsInPeer: {[key: string]: UserTyping[]};\n\n protected after() {\n this.apiUpdatesManager.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 this.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 this.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 this.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 this.rootScope.addEventListener('chat_update', (chatId) => {\n const fullChat = this.chatsFull[chatId];\n const chat: Chat.chat | Chat.channel | Chat.chatForbidden | Chat.channelForbidden = this.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 && fullChat.chat_photo._ !== 'photoEmpty'); // chat_photo can be missing\n if(\n hasChatPhoto !== hasFullChatPhoto || (\n hasChatPhoto &&\n photo.photo_id !== fullChat.chat_photo?.id\n )\n ) {\n updated = true;\n }\n }\n\n if(updated) {\n this.refreshFullPeer(chatId.toPeerId(true));\n }\n });\n\n this.rootScope.addEventListener('channel_update', (chatId) => {\n this.refreshFullPeer(chatId.toPeerId(true));\n });\n\n // * genius\n this.rootScope.addEventListener('chat_full_update', (chatId) => {\n this.rootScope.dispatchEvent('peer_full_update', chatId.toPeerId(true));\n });\n\n // * genius\n this.rootScope.addEventListener('user_full_update', (userId) => {\n this.rootScope.dispatchEvent('peer_full_update', userId.toPeerId(false));\n });\n\n this.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) {\n if(this.usersFull[id] && !override && Date.now() < this.fullExpiration[id.toPeerId()]) {\n return this.usersFull[id];\n }\n\n return this.apiManager.invokeApiSingleProcess({\n method: 'users.getFullUser',\n params: {\n id: this.appUsersManager.getUserInput(id)\n },\n processResult: (usersUserFull) => {\n this.appChatsManager.saveApiChats(usersUserFull.chats, true);\n this.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 = this.appPhotosManager.savePhoto(userFull.profile_photo, {type: 'profilePhoto', peerId});\n }\n\n const botInfo = userFull.bot_info;\n if(botInfo) {\n const referenceContext: ReferenceContext = {type: 'userFull', userId: id};\n botInfo.description_document = this.appDocsManager.saveDoc(botInfo.description_document, referenceContext);\n botInfo.description_photo = this.appPhotosManager.savePhoto(botInfo.description_photo, referenceContext);\n }\n\n this.appNotificationsManager.savePeerSettings({\n peerId,\n settings: userFull.notify_settings\n });\n\n this.usersFull[id] = userFull;\n this.fullExpiration[peerId] = Date.now() + PEER_FULL_TTL;\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 this.rootScope.dispatchEvent('user_full_update', id);\n return userFull;\n }\n });\n }\n\n public getProfileByPeerId(peerId: PeerId, override?: true) {\n if(this.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 async getFullPhoto(peerId: PeerId) {\n const profile = await this.getProfileByPeerId(peerId);\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 /* 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) {\n if(this.appChatsManager.isChannel(id)) {\n return this.getChannelFull(id, override);\n }\n\n const peerId = id.toPeerId(true);\n const fullChat = this.chatsFull[id] as ChatFull.chatFull;\n if(fullChat && !override && Date.now() < this.fullExpiration[peerId]) {\n const chat = this.appChatsManager.getChat(id) as Chat.chat;\n if(\n chat.pFlags.left ||\n chat.pFlags.deactivated ||\n chat.version === (fullChat.participants as ChatParticipants.chatParticipants).version\n ) {\n return fullChat as ChatFull;\n }\n }\n\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.getFullChat',\n params: {\n chat_id: id\n },\n processResult: (result) => {\n this.appChatsManager.saveApiChats(result.chats, true);\n this.appUsersManager.saveApiUsers(result.users);\n const chatFull = result.full_chat as ChatFull.chatFull;\n if(chatFull && chatFull.chat_photo && chatFull.chat_photo.id) {\n chatFull.chat_photo = this.appPhotosManager.savePhoto(chatFull.chat_photo, {type: 'profilePhoto', peerId});\n }\n\n if(chatFull.call) {\n this.appGroupCallsManager.saveGroupCall(chatFull.call, id);\n }\n\n // appMessagesManager.savePinnedMessage(peerId, fullChat.pinned_msg_id);\n this.appNotificationsManager.savePeerSettings({\n peerId,\n settings: chatFull.notify_settings\n });\n\n this.chatsFull[id] = chatFull;\n this.fullExpiration[peerId] = Date.now() + PEER_FULL_TTL;\n this.rootScope.dispatchEvent('chat_full_update', id);\n\n return chatFull;\n }\n });\n }\n\n public async getChatInviteLink(id: ChatId, force?: boolean) {\n const chatFull = await this.getChatFull(id);\n if(!force &&\n chatFull.exported_invite &&\n chatFull.exported_invite._ == 'chatInviteExported') {\n return chatFull.exported_invite.link;\n }\n\n return this.apiManager.invokeApi('messages.exportChatInvite', {\n peer: this.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 public getChannelParticipants(id: ChatId, filter: ChannelParticipantsFilter = {_: 'channelParticipantsRecent'}, limit = 200, offset = 0) {\n if(filter._ === 'channelParticipantsRecent') {\n const chat = this.appChatsManager.getChat(id);\n if(chat?.pFlags && (\n // chat.pFlags.kicked ||\n (chat as Chat.channel).pFlags.broadcast &&\n !(chat as Chat.channel).pFlags.creator &&\n !(chat as Chat.channel).admin_rights\n )) {\n return Promise.reject();\n }\n }\n\n return this.apiManager.invokeApiCacheable('channels.getParticipants', {\n channel: this.appChatsManager.getChannelInput(id),\n filter,\n offset,\n limit,\n hash: '0'\n }, {cacheSeconds: 60}).then((result) => {\n this.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 this.apiManager.invokeApiSingle('channels.getParticipant', {\n channel: this.appChatsManager.getChannelInput(id),\n participant: this.appPeersManager.getInputPeerById(peerId)\n }).then((channelParticipant) => {\n this.appUsersManager.saveApiUsers(channelParticipant.users);\n return channelParticipant.participant;\n });\n }\n\n public getChannelFull(id: ChatId, override?: true) {\n const peerId = id.toPeerId(true);\n if(this.chatsFull[id] !== undefined && !override && Date.now() < this.fullExpiration[peerId]) {\n return this.chatsFull[id] as ChatFull.channelFull;\n }\n\n return this.apiManager.invokeApiSingleProcess({\n method: 'channels.getFullChannel',\n params: {\n channel: this.appChatsManager.getChannelInput(id)\n },\n processResult: (result) => {\n this.appChatsManager.saveApiChats(result.chats, true);\n this.appUsersManager.saveApiUsers(result.users);\n const fullChannel = result.full_chat as ChatFull.channelFull;\n if(fullChannel && fullChannel.chat_photo.id) {\n fullChannel.chat_photo = this.appPhotosManager.savePhoto(fullChannel.chat_photo, {type: 'profilePhoto', peerId});\n // appPhotosManager.savePhoto(fullChannel.chat_photo);\n }\n\n if(fullChannel.call) {\n this.appGroupCallsManager.saveGroupCall(fullChannel.call, id);\n }\n\n this.appNotificationsManager.savePeerSettings({\n peerId,\n settings: fullChannel.notify_settings\n });\n\n this.chatsFull[id] = fullChannel;\n this.fullExpiration[peerId] = Date.now() + PEER_FULL_TTL;\n this.rootScope.dispatchEvent('chat_full_update', id);\n\n return fullChannel;\n },\n processError: (error) => {\n switch(error.type) {\n case 'CHANNEL_PRIVATE':\n const channel = this.appChatsManager.getChat(id) as Chat.channel | Chat.channelForbidden;\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates: [{\n _: 'updateChannel',\n channel_id: id\n }],\n chats: [channel._ === 'channelForbidden' ? channel : {\n _: 'channelForbidden',\n id,\n access_hash: channel.access_hash,\n title: channel.title,\n pFlags: channel.pFlags\n }],\n users: []\n } as Updates.updates);\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, this.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(this.appChatsManager.isChannel(chatId)) {\n promise = this.getChannelParticipants(chatId, {\n _: 'channelParticipantsMentions',\n q: query,\n top_msg_id: getServerMessageId(threadId)\n }, 50, 0).then((cP) => {\n return cP.participants.map((p) => getParticipantPeerId(p));\n });\n } else if(chatId) {\n promise = Promise.resolve(this.getChatFull(chatId)).then((chatFull) => {\n return ((chatFull as ChatFull.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 this.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 private invalidateChannelParticipants(id: ChatId) {\n this.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()) {\n const userId = peerId.toUserId();\n delete this.usersFull[userId];\n this.rootScope.dispatchEvent('user_full_update', userId);\n } else {\n const chatId = peerId.toChatId();\n delete this.chatsFull[chatId];\n this.rootScope.dispatchEvent('chat_full_update', chatId);\n }\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 this.apiManager.invokeApi('account.updateProfile', {\n first_name,\n last_name,\n about\n }).then((user) => {\n this.appUsersManager.saveApiUser(user);\n\n if(about !== undefined) {\n const peerId = user.id.toPeerId();\n const userFull = this.usersFull[user.id];\n if(userFull) {\n userFull.about = about;\n }\n\n this.rootScope.dispatchEvent('peer_bio_edit', peerId);\n }\n\n return this.getProfile(user.id, true);\n });\n }\n\n public uploadProfilePhoto(inputFile: InputFile) {\n return this.apiManager.invokeApi('photos.uploadProfilePhoto', {\n file: inputFile\n }).then((updateResult) => {\n // ! sometimes can have no user in users\n const photo = updateResult.photo as Photo.photo;\n if(!updateResult.users.length) {\n const strippedThumb = photo.sizes.find((size) => size._ === 'photoStrippedSize') as PhotoSize.photoStrippedSize;\n updateResult.users.push({\n ...this.appUsersManager.getSelf(),\n photo: {\n _: 'userProfilePhoto',\n dc_id: photo.dc_id,\n photo_id: photo.id,\n stripped_thumb: strippedThumb?.bytes,\n pFlags: {\n\n }\n }\n });\n }\n this.appUsersManager.saveApiUsers(updateResult.users);\n\n const myId = this.appPeersManager.peerId;\n this.appPhotosManager.savePhoto(updateResult.photo, {\n type: 'profilePhoto',\n peerId: myId\n });\n\n const userId = myId.toUserId();\n // this.apiUpdatesManager.processLocalUpdate({\n // _: 'updateUserPhoto',\n // user_id: userId,\n // date: tsNow(true),\n // photo: this.appUsersManager.getUser(userId).photo,\n // previous: true\n // });\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateUser',\n user_id: userId\n });\n });\n }\n\n public deletePhotos(photoIds: string[]) {\n return this.apiManager.invokeApiSingle('photos.deletePhotos', {\n id: photoIds.map((photoId) => {\n const photo = this.appPhotosManager.getPhoto(photoId);\n return getPhotoInput(photo);\n })\n }).then((deletedList) => {\n\n });\n }\n\n private verifyParticipantForOnlineCount(participant: {user_id: UserId}) {\n const user = this.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(this.appChatsManager.isBroadcast(id)) {\n return minOnline;\n }\n\n const chatInfo = await this.getChatFull(id);\n if(this.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 this.apiManager.invokeApiCacheable('messages.getOnlines', {\n peer: this.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 getTypingsKey(peerId: PeerId, threadId?: number) {\n return peerId + (threadId ? `_${threadId}` : '');\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 this.appPeersManager.getPeerId((update as Update.updateChatUserTyping).from_id);\n if(this.appPeersManager.peerId === fromId || update.action._ === 'speakingInGroupCallAction') {\n return;\n }\n\n const topMsgId = (update as Update.updateChannelUserTyping).top_msg_id;\n const threadId = topMsgId ? generateMessageId(topMsgId) : undefined;\n const peerId = this.appPeersManager.getPeerId(update);\n const key = this.getTypingsKey(peerId, threadId);\n const typings = this.typingsInPeer[key] ??= [];\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 this.rootScope.dispatchEvent('peer_typings', {peerId, threadId, typings});\n\n if(!typings.length) {\n delete this.typingsInPeer[key];\n }\n };\n\n if(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 = this.appUsersManager.hasUser(fromId);\n if(!hasUser) {\n // let's load user here\n if(update._ === 'updateChatUserTyping') {\n if(update.chat_id && this.appChatsManager.hasChat(update.chat_id) && !this.appChatsManager.isChannel(update.chat_id)) {\n Promise.resolve(this.getChatFull(update.chat_id)).then(() => {\n if(typing.timeout !== undefined && this.appUsersManager.hasUser(fromId)) {\n this.rootScope.dispatchEvent('peer_typings', {peerId, threadId, typings});\n }\n });\n }\n }\n\n // return;\n } else {\n this.appUsersManager.forceUserOnline(fromId);\n }\n\n typing.timeout = ctx.setTimeout(cancelAction, 6000);\n if(hasUser) {\n this.rootScope.dispatchEvent('peer_typings', {peerId, threadId, typings});\n }\n };\n\n private onUpdatePeerBlocked = (update: Update.updatePeerBlocked) => {\n const peerId = this.appPeersManager.getPeerId(update.peer_id);\n if(this.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 this.rootScope.dispatchEvent('user_full_update', userId);\n }\n\n this.rootScope.dispatchEvent('peer_block', {peerId, blocked: update.blocked});\n };\n\n public getPeerTypings(peerId: PeerId, threadId?: number) {\n return this.typingsInPeer[this.getTypingsKey(peerId, threadId)];\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 {Awaited} from '../types';\n\nexport default function callbackifyAll(\n values: T,\n callback: (result: { -readonly [P in keyof T]: Awaited }) => R\n): Promise> | R {\n if(values.some((value) => value instanceof Promise)) {\n return Promise.all(values).then(callback as any);\n } else {\n return callback(values as any);\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 findAndSplice from '../../helpers/array/findAndSplice';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport assumeType from '../../helpers/assumeType';\nimport callbackify from '../../helpers/callbackify';\nimport callbackifyAll from '../../helpers/callbackifyAll';\nimport copy from '../../helpers/object/copy';\nimport pause from '../../helpers/schedulers/pause';\nimport {AvailableReaction, Message, MessagePeerReaction, MessagesAvailableReactions, Reaction, ReactionCount, Update, Updates} from '../../layer';\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport {AppManager} from './manager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport reactionsEqual from './utils/reactions/reactionsEqual';\n\nconst SAVE_DOC_KEYS = [\n 'static_icon' as const,\n 'appear_animation' as const,\n 'select_animation' as const,\n 'activate_animation' as const,\n 'effect_animation' as const,\n 'around_animation' as const,\n 'center_icon' as const\n];\n\nconst REFERENCE_CONTEXT: ReferenceContext = {\n type: 'reactions'\n};\n\nexport class AppReactionsManager extends AppManager {\n private availableReactions: AvailableReaction[];\n private sendReactionPromises: Map>;\n private lastSendingTimes: Map;\n\n protected after() {\n this.rootScope.addEventListener('language_change', () => {\n this.availableReactions = undefined;\n this.getAvailableReactions();\n });\n\n this.sendReactionPromises = new Map();\n this.lastSendingTimes = new Map();\n\n this.rootScope.addEventListener('user_auth', () => {\n setTimeout(() => {\n Promise.resolve(this.getAvailableReactions()).then(async(availableReactions) => {\n for(const availableReaction of availableReactions) {\n await Promise.all([\n availableReaction.around_animation && this.apiFileManager.downloadMedia({media: availableReaction.around_animation}),\n availableReaction.static_icon && this.apiFileManager.downloadMedia({media: availableReaction.static_icon}),\n availableReaction.appear_animation && this.apiFileManager.downloadMedia({media: availableReaction.appear_animation}),\n availableReaction.center_icon && this.apiFileManager.downloadMedia({media: availableReaction.center_icon})\n ]);\n\n await pause(1000);\n }\n });\n }, 7.5e3);\n });\n }\n\n public getAvailableReactions() {\n if(this.availableReactions) return this.availableReactions;\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.getAvailableReactions',\n processResult: (messagesAvailableReactions) => {\n assumeType(messagesAvailableReactions);\n\n const availableReactions = this.availableReactions = messagesAvailableReactions.reactions;\n for(const reaction of availableReactions) {\n for(const key of SAVE_DOC_KEYS) {\n if(!reaction[key]) {\n continue;\n }\n\n reaction[key] = this.appDocsManager.saveDoc(reaction[key], REFERENCE_CONTEXT);\n }\n }\n\n return availableReactions;\n },\n params: {\n hash: 0\n }\n });\n }\n\n public getActiveAvailableReactions() {\n return callbackify(this.getAvailableReactions(), (availableReactions) => {\n return availableReactions.filter((availableReaction) => !availableReaction.pFlags.inactive);\n });\n }\n\n public getAvailableReactionsForPeer(peerId: PeerId) {\n const activeAvailableReactions = this.getActiveAvailableReactions();\n if(peerId.isUser()) {\n return this.unshiftQuickReaction(activeAvailableReactions);\n }\n\n const chatFull = this.appProfileManager.getChatFull(peerId.toChatId());\n return callbackifyAll([activeAvailableReactions, chatFull, this.getQuickReaction()], ([activeAvailableReactions, chatFull, quickReaction]) => {\n const chatAvailableReactions = chatFull.available_reactions ?? {_: 'chatReactionsNone'};\n\n let filteredChatAvailableReactions: AvailableReaction[] = [];\n if(chatAvailableReactions._ === 'chatReactionsAll') {\n filteredChatAvailableReactions = activeAvailableReactions;\n } else if(chatAvailableReactions._ === 'chatReactionsSome') {\n filteredChatAvailableReactions = chatAvailableReactions.reactions.map((reaction) => {\n return activeAvailableReactions.find((availableReaction) => availableReaction.reaction === (reaction as Reaction.reactionEmoji).emoticon);\n }).filter(Boolean);\n }\n\n return this.unshiftQuickReactionInner(filteredChatAvailableReactions, quickReaction);\n });\n }\n\n private unshiftQuickReactionInner(availableReactions: AvailableReaction[], quickReaction: Reaction | AvailableReaction) {\n if(quickReaction && quickReaction._ !== 'reactionEmoji' && quickReaction._ !== 'availableReaction') return availableReactions;\n const emoticon = (quickReaction as Reaction.reactionEmoji).emoticon || (quickReaction as AvailableReaction).reaction;\n const availableReaction = findAndSplice(availableReactions, (availableReaction) => availableReaction.reaction === emoticon);\n if(availableReaction) {\n availableReactions.unshift(availableReaction);\n }\n\n return availableReactions;\n }\n\n private unshiftQuickReaction(\n availableReactions: AvailableReaction[] | PromiseLike,\n quickReaction: ReturnType = this.getQuickReaction()\n ) {\n return callbackifyAll([\n availableReactions,\n quickReaction\n ], ([availableReactions, quickReaction]) => {\n return this.unshiftQuickReactionInner(availableReactions, quickReaction);\n });\n }\n\n public getAvailableReactionsByMessage(message: Message.message) {\n if(!message) return [];\n const peerId = (message.fwd_from?.channel_post && this.appPeersManager.isMegagroup(message.peerId) && message.fwdFromId) || message.peerId;\n return this.getAvailableReactionsForPeer(peerId);\n }\n\n public isReactionActive(reaction: string) {\n if(!this.availableReactions) return false;\n return !!this.availableReactions.find((availableReaction) => availableReaction.reaction === reaction);\n }\n\n public getQuickReaction() {\n return callbackifyAll([\n this.apiManager.getConfig(),\n this.getAvailableReactions()\n ], ([config, availableReactions]) => {\n const reaction = config.reactions_default;\n if(reaction?._ === 'reactionEmoji') {\n return availableReactions.find((availableReaction) => availableReaction.reaction === reaction.emoticon);\n }\n\n return reaction as Reaction.reactionCustomEmoji;\n });\n }\n\n public getReactionCached(reaction: string) {\n return this.availableReactions.find((availableReaction) => availableReaction.reaction === reaction);\n }\n\n public getReaction(reaction: string) {\n return callbackify(this.getAvailableReactions(), () => {\n return this.getReactionCached(reaction);\n });\n }\n\n public getMessagesReactions(peerId: PeerId, mids: number[]) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.getMessagesReactions',\n params: {\n id: mids.map((mid) => getServerMessageId(mid)),\n peer: this.appPeersManager.getInputPeerById(peerId)\n },\n processResult: (updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n // const update = (updates as Updates.updates).updates.find((update) => update._ === 'updateMessageReactions') as Update.updateMessageReactions;\n // return update.reactions;\n }\n });\n }\n\n public getMessageReactionsList(peerId: PeerId, mid: number, limit: number, reaction?: Reaction, offset?: string) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.getMessageReactionsList',\n params: {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: getServerMessageId(mid),\n limit,\n reaction,\n offset\n },\n processResult: (messageReactionsList) => {\n this.appUsersManager.saveApiUsers(messageReactionsList.users);\n return messageReactionsList;\n }\n });\n }\n\n public setDefaultReaction(reaction: Reaction) {\n return this.apiManager.invokeApi('messages.setDefaultReaction', {reaction}).then(async(value) => {\n if(value) {\n const appConfig = await this.apiManager.getConfig();\n if(appConfig) {\n appConfig.reactions_default = reaction;\n }/* else { // if no config or loading it - overwrite\n this.apiManager.getAppConfig(true);\n } */\n\n this.rootScope.dispatchEvent('quick_reaction', reaction);\n }\n\n return value;\n });\n }\n\n public async sendReaction(message: Message.message, reaction?: Reaction | AvailableReaction, onlyLocal?: boolean) {\n if(reaction._ === 'availableReaction') {\n reaction = {\n _: 'reactionEmoji',\n emoticon: reaction.reaction\n };\n }\n\n const limit = await this.apiManager.getLimit('reactions');\n\n const lastSendingTimeKey = message.peerId + '_' + message.mid;\n const lastSendingTime = this.lastSendingTimes.get(lastSendingTimeKey);\n if(lastSendingTime) {\n return;\n } else {\n this.lastSendingTimes.set(lastSendingTimeKey, Date.now());\n setTimeout(() => {\n this.lastSendingTimes.delete(lastSendingTimeKey);\n }, 333);\n }\n\n const {peerId, mid} = message;\n const myPeerId = this.appPeersManager.peerId;\n\n const unsetReactionCount = (reactionCount: ReactionCount) => {\n --reactionCount.count;\n delete reactionCount.chosen_order;\n\n if(reactionsEqual(reaction as Reaction, reactionCount.reaction)) {\n reaction = undefined as Reaction;\n }\n\n if(!reactionCount.count) {\n indexOfAndSplice(reactions.results, reactionCount);\n }/* else {\n insertInDescendSortedArray(reactions.results, chosenReaction, 'count', chosenReactionIdx);\n } */\n\n if(reactions.recent_reactions) {\n findAndSplice(reactions.recent_reactions, (recentReaction) => reactionsEqual(recentReaction.reaction, reactionCount.reaction) && this.appPeersManager.getPeerId(recentReaction.peer_id) === myPeerId);\n }\n\n if(!reactions.results.length) {\n reactions = undefined;\n }\n };\n\n const canSeeList = message.reactions?.pFlags?.can_see_list || !this.appPeersManager.isBroadcast(message.peerId) || message.peerId.isUser();\n if(!message.reactions) {\n message.reactions = {\n _: 'messageReactions',\n results: [],\n recent_reactions: canSeeList ? [] : undefined,\n pFlags: {\n can_see_list: canSeeList || undefined\n }\n };\n }\n\n let reactions = onlyLocal ? message.reactions : copy(message.reactions);\n const chosenReactions = reactions.results.filter((reactionCount) => reactionCount.chosen_order !== undefined);\n chosenReactions.sort((a, b) => b.chosen_order - a.chosen_order);\n const unsetReactions: ReactionCount[] = [];\n const chosenReactionIdx = chosenReactions.findIndex((reactionCount) => reactionsEqual(reactionCount.reaction, reaction as Reaction));\n if(chosenReactionIdx !== -1) unsetReactions.push(...chosenReactions.splice(chosenReactionIdx, 1));\n unsetReactions.push(...chosenReactions.splice(limit - +(chosenReactionIdx === -1)));\n unsetReactions.forEach((reactionCount) => {\n chosenReactions.forEach((chosenReactionCount) => {\n if(chosenReactionCount.chosen_order > reactionCount.chosen_order) {\n --chosenReactionCount.chosen_order;\n }\n });\n\n unsetReactionCount(reactionCount);\n });\n\n const chosenReactionsLength = chosenReactions.length;\n chosenReactions.forEach((reactionCount, idx) => {\n reactionCount.chosen_order = chosenReactionsLength - 1 - idx;\n });\n\n if(reaction) {\n if(!reactions) {\n reactions/* = message.reactions */ = {\n _: 'messageReactions',\n results: [],\n pFlags: {}\n };\n\n if(canSeeList) {\n reactions.pFlags.can_see_list = true;\n }\n }\n\n let reactionCountIdx = reactions.results.findIndex((reactionCount) => reactionsEqual(reactionCount.reaction, reaction as Reaction));\n let reactionCount = reactionCountIdx !== -1 && reactions.results[reactionCountIdx];\n if(!reactionCount) {\n reactionCount = {\n _: 'reactionCount',\n count: 0,\n reaction\n };\n\n reactionCountIdx = reactions.results.push(reactionCount) - 1;\n }\n\n ++reactionCount.count;\n reactionCount.chosen_order = chosenReactions.length ? chosenReactions[0].chosen_order + 1 : 0;\n chosenReactions.unshift(reactionCount);\n\n if(!reactions.recent_reactions && canSeeList) {\n reactions.recent_reactions = [];\n }\n\n if(reactions.recent_reactions) {\n const peerReaction: MessagePeerReaction = {\n _: 'messagePeerReaction',\n reaction,\n peer_id: this.appPeersManager.getOutputPeer(myPeerId),\n pFlags: {}\n };\n\n if(!this.appPeersManager.isMegagroup(peerId) && false) {\n reactions.recent_reactions.push(peerReaction);\n reactions.recent_reactions = reactions.recent_reactions.slice(-3);\n } else {\n reactions.recent_reactions.unshift(peerReaction);\n reactions.recent_reactions = reactions.recent_reactions.slice(0, 3);\n }\n }\n\n // insertInDescendSortedArray(reactions.results, reactionCount, 'count', reactionCountIdx);\n }\n\n const availableReactions = this.availableReactions;\n if(reactions && availableReactions?.length) {\n const indexes: Map = new Map();\n availableReactions.forEach((availableReaction, idx) => {\n indexes.set(availableReaction.reaction, idx);\n });\n\n reactions.results.sort((a, b) => {\n const id1 = (a.reaction as Reaction.reactionCustomEmoji).document_id || (a.reaction as Reaction.reactionEmoji).emoticon;\n const id2 = (b.reaction as Reaction.reactionCustomEmoji).document_id || (b.reaction as Reaction.reactionEmoji).emoticon;\n return (b.count - a.count) || ((indexes.get(id1) ?? 0) - (indexes.get(id2) ?? 0));\n });\n }\n\n if(onlyLocal) {\n message.reactions = reactions;\n this.rootScope.dispatchEvent('messages_reactions', [{message, changedResults: []}]);\n return Promise.resolve();\n }\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateMessageReactions',\n peer: message.peer_id,\n msg_id: message.id,\n reactions: reactions,\n local: true\n });\n\n const promiseKey = [peerId, mid].join('-');\n const msgId = getServerMessageId(mid);\n const promise = this.apiManager.invokeApi('messages.sendReaction', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: msgId,\n reaction: chosenReactions.map((reactionCount) => reactionCount.reaction)\n }).then((updates) => {\n assumeType(updates);\n\n const editMessageUpdateIdx = updates.updates.findIndex((update) => update._ === 'updateEditMessage' || update._ === 'updateEditChannelMessage');\n if(editMessageUpdateIdx !== -1) {\n const editMessageUpdate = updates.updates[editMessageUpdateIdx] as Update.updateEditMessage | Update.updateEditChannelMessage;\n updates.updates[editMessageUpdateIdx] = {\n _: 'updateMessageReactions',\n msg_id: msgId,\n peer: this.appPeersManager.getOutputPeer(peerId),\n reactions: (editMessageUpdate.message as Message.message).reactions,\n pts: editMessageUpdate.pts,\n pts_count: editMessageUpdate.pts_count\n };\n }\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n }).catch((err) => {\n if(err.type === 'REACTION_INVALID' && this.sendReactionPromises.get(promiseKey) === promise) {\n this.sendReaction(message, chosenReactions[0]?.reaction, true);\n }\n }).finally(() => {\n if(this.sendReactionPromises.get(promiseKey) === promise) {\n this.sendReactionPromises.delete(promiseKey);\n }\n });\n\n this.sendReactionPromises.set(promiseKey, promise);\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 {MyDocument} from './appDocsManager';\nimport type {DownloadOptions} from '../mtproto/apiFileManager';\nimport {Document, InputFileLocation, InputStickerSet, MessagesAllStickers, MessagesFavedStickers, MessagesFeaturedStickers, MessagesFoundStickerSets, MessagesRecentStickers, MessagesStickers, MessagesStickerSet, PhotoSize, StickerPack, StickerSet, StickerSetCovered, Update} from '../../layer';\nimport {Modify} from '../../types';\nimport AppStorage from '../storage';\nimport DATABASE_STATE from '../../config/databases/state';\nimport assumeType from '../../helpers/assumeType';\nimport fixBase64String from '../../helpers/fixBase64String';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport findAndSplice from '../../helpers/array/findAndSplice';\nimport {AppManager} from './manager';\nimport fixEmoji from '../richTextProcessor/fixEmoji';\nimport ctx from '../../environment/ctx';\nimport {getEnvironment} from '../../environment/utils';\nimport getDocumentInput from './utils/docs/getDocumentInput';\nimport getStickerEffectThumb from './utils/stickers/getStickerEffectThumb';\n\nconst CACHE_TIME = 3600e3;\n\ntype LOCAL_STICKER_SET_ID = Extract<\n InputStickerSet['_'],\n 'inputStickerSetAnimatedEmoji' | 'inputStickerSetAnimatedEmojiAnimations' |\n 'inputStickerSetPremiumGifts' | 'inputStickerSetEmojiGenericAnimations' |\n 'inputStickerSetEmojiDefaultStatuses' | 'inputStickerSetEmojiDefaultTopicIcons'\n>;\n\ntype LOCAL_ID = 'EMOJI' | 'EMOJI_ANIMATIONS' | 'PREMIUM_GIFTS' | 'GENERIC_ANIMATIONS' | 'DEFAULT_STATUSES' | 'DEFAULT_TOPIC_ICONS';\n\nconst LOCAL_IDS: {[key in LOCAL_ID]: LOCAL_STICKER_SET_ID} = {\n EMOJI: 'inputStickerSetAnimatedEmoji',\n EMOJI_ANIMATIONS: 'inputStickerSetAnimatedEmojiAnimations',\n PREMIUM_GIFTS: 'inputStickerSetPremiumGifts',\n GENERIC_ANIMATIONS: 'inputStickerSetEmojiGenericAnimations',\n DEFAULT_STATUSES: 'inputStickerSetEmojiDefaultStatuses',\n DEFAULT_TOPIC_ICONS: 'inputStickerSetEmojiDefaultTopicIcons'\n}\n\nconst LOCAL_IDS_SET: Set = new Set(Object.values(LOCAL_IDS) as any);\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 extends AppManager {\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: MyDocument[];\n private getGreetingStickersTimeout: number;\n private getGreetingStickersPromise: Promise;\n\n private sounds: Record;\n private getAnimatedEmojiSoundsPromise: Promise;\n\n private favedStickers: MyDocument[];\n private recentStickers: MyDocument[];\n\n private names: Record;\n\n protected after() {\n this.getStickerSetPromises = {};\n this.getStickersByEmoticonsPromises = {};\n this.sounds = {};\n this.names = {};\n\n this.rootScope.addEventListener('user_auth', () => {\n setTimeout(() => {\n this.getAnimatedEmojiStickerSet();\n // this.getFavedStickersStickers();\n }, 1000);\n\n if(!this.getGreetingStickersPromise && this.getGreetingStickersTimeout === undefined) {\n this.getGreetingStickersTimeout = ctx.setTimeout(() => {\n this.getGreetingStickersTimeout = undefined;\n this.getGreetingSticker(true);\n }, 5000);\n }\n });\n\n this.rootScope.addEventListener('app_config', () => this.onStickersUpdated('faved', true));\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateNewStickerSet: (update) => {\n const stickerSet = update.stickerset as MyMessagesStickerSet;\n this.saveStickerSet(stickerSet, stickerSet.set.id);\n this.rootScope.dispatchEvent('stickers_installed', stickerSet.set);\n },\n\n updateRecentStickers: () => this.onStickersUpdated('recent', true),\n\n updateFavedStickers: () => this.onStickersUpdated('faved', true),\n\n updateMoveStickerSetToTop: (update) => {\n this.rootScope.dispatchEvent('stickers_top', update.stickerset);\n }\n });\n }\n\n private async onStickersUpdated(type: 'faved' | 'recent', overwrite: boolean) {\n const stickers = await (type === 'faved' ? this.getFavedStickersStickers(overwrite) : this.getRecentStickersStickers(overwrite));\n this.rootScope.dispatchEvent('stickers_updated', {\n type,\n stickers\n });\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 this.apiFileManager.downloadMedia({media: this.greetingStickers[0]}); // preload next sticker\n\n return doc;\n });\n }\n\n private saveStickers(docs: Document[]) {\n forEachReverse(docs, (doc, idx) => {\n doc = this.appDocsManager.saveDoc(doc);\n\n if(!doc) docs.splice(idx, 1);\n else docs[idx] = doc;\n });\n }\n\n private canUseStickerSetCache(set: MyMessagesStickerSet, useCache?: boolean) {\n return set && set.documents?.length && ((Date.now() - set.refreshTime) < CACHE_TIME || useCache);\n }\n\n public getStickerSet(set: MyStickerSetInput, params: Partial<{\n overwrite: boolean,\n useCache: boolean,\n saveById: boolean\n }> = {}): Promise | MyMessagesStickerSet {\n let {id} = set;\n if(!set.access_hash) {\n set = this.names[id] || set;\n id = set.id;\n }\n\n if(this.getStickerSetPromises[id]) {\n return this.getStickerSetPromises[id];\n }\n\n if(!params.overwrite) {\n const cachedSet = this.storage.getFromCache(id);\n if(this.canUseStickerSetCache(cachedSet, params.useCache)) {\n return cachedSet;\n }\n }\n\n const promise = this.getStickerSetPromises[id] = new Promise(async(resolve) => {\n if(!params.overwrite) {\n const cachedSet = await this.storage.get(id);\n if(this.canUseStickerSetCache(cachedSet, params.useCache)) {\n this.saveStickers(cachedSet.documents);\n resolve(cachedSet);\n\n if(this.getStickerSetPromises[id] === promise) {\n delete this.getStickerSetPromises[id];\n }\n\n return;\n }\n }\n\n try {\n const stickerSet = await this.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 if(this.getStickerSetPromises[id] === promise) {\n delete this.getStickerSetPromises[id];\n }\n });\n\n return promise;\n }\n\n public getLocalStickerSet(id: LOCAL_STICKER_SET_ID) {\n return this.getStickerSet({id}, {saveById: true});\n }\n\n public getAnimatedEmojiStickerSet() {\n return Promise.all([\n this.getLocalStickerSet(LOCAL_IDS.EMOJI),\n this.getLocalStickerSet(LOCAL_IDS.EMOJI_ANIMATIONS),\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 const promise = this.getAnimatedEmojiSoundsPromise = Promise.all([\n this.apiManager.getAppConfig(overwrite),\n this.apiManager.getConfig()\n ]).then(([appConfig, config]) => {\n if(this.getAnimatedEmojiSoundsPromise !== promise) {\n return;\n }\n\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 = this.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: config.this_dc,\n file_reference: bytes,\n mime_type: 'audio/ogg'\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 return promise;\n }\n\n public async getRecentStickers(overwrite?: boolean): Promise> {\n const res = await this.apiManager.invokeApiHashable({\n method: 'messages.getRecentStickers',\n processResult: (res) => {\n assumeType(res);\n\n this.recentStickers = res.stickers as MyDocument[];\n this.saveStickers(res.stickers);\n return res;\n },\n overwrite\n });\n\n return res;\n }\n\n public getRecentStickersStickers(overwrite?: boolean) {\n if(overwrite) this.recentStickers = undefined;\n else if(this.recentStickers) return this.recentStickers;\n return this.getRecentStickers(overwrite).then(() => this.recentStickers);\n }\n\n public saveRecentSticker(docId: DocId, unsave?: boolean, attached?: boolean) {\n const doc = this.appDocsManager.getDoc(docId);\n\n findAndSplice(this.recentStickers, (_doc) => _doc.id === docId);\n if(!unsave) {\n this.recentStickers.unshift(doc);\n\n const docEmoticon = fixEmoji(doc.stickerEmojiRaw);\n for(const emoticon in this.getStickersByEmoticonsPromises) {\n const promise = this.getStickersByEmoticonsPromises[emoticon];\n promise.then((stickers) => {\n const _doc = findAndSplice(stickers, (_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 this.rootScope.dispatchEvent('sticker_updated', {type: 'recent', faved: !unsave, document: doc});\n\n if(unsave) {\n this.onStickersUpdated('recent', false);\n }\n\n return this.apiManager.invokeApi('messages.saveRecentSticker', {\n id: getDocumentInput(doc),\n unsave,\n attached\n });\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 id = isAnimation ? LOCAL_IDS.EMOJI_ANIMATIONS : LOCAL_IDS.EMOJI;\n const stickerSet = this.storage.getFromCache(id);\n // const stickerSet = await this.getStickerSet({id});\n if(!stickerSet?.documents) return;\n\n if(isAnimation) {\n if(['๐Ÿงก', '๐Ÿ’›', '๐Ÿ’š', '๐Ÿ’™', '๐Ÿ’œ', '๐Ÿ–ค', '๐Ÿค', '๐ŸคŽ'].includes(emoji)) {\n emoji = 'โค๏ธ';\n }\n }\n\n emoji = this.cleanEmoji(emoji);\n const pack = stickerSet.packs.find((p) => p.emoticon === emoji);\n return pack ? this.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) {\n const preloadEmojiPromise = this.getAnimatedEmojiStickerSet().then(() => {\n return this.getAnimatedEmojiSticker(emoji);\n });\n\n return Promise.all([\n preloadEmojiPromise,\n this.preloadAnimatedEmojiStickerAnimation(emoji)\n ]).then(([doc, a]) => {\n return {\n doc: doc,\n animation: a?.doc,\n sound: a?.sound\n };\n });\n }\n\n public preloadAnimatedEmojiStickerAnimation(emoji: string) {\n return this.getAnimatedEmojiStickerSet().then(() => {\n return this.getAnimatedEmojiSticker(emoji, true);\n }).then((doc) => {\n if(!doc) {\n return;\n }\n\n const sound = this.getAnimatedEmojiSoundDocument(emoji);\n return Promise.all([\n this.preloadSticker(doc.id),\n sound ? this.preloadSticker(sound.id) : undefined\n ]).then(() => {\n return {doc, sound};\n });\n });\n }\n\n public preloadSticker(docId: DocId, isPremiumEffect?: boolean) {\n const doc = this.appDocsManager.getDoc(docId);\n return this.apiFileManager.downloadMedia({media: doc, thumb: isPremiumEffect ? doc.video_thumbs?.[0] : undefined});\n }\n\n private saveStickerSet(res: Omit, id: DocId) {\n const newSet: MessagesStickerSet = {\n _: 'messages.stickerSet',\n set: res.set,\n packs: res.packs,\n documents: res.documents as Document[],\n keywords: res.keywords\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 if(stickerSet.set.short_name) {\n this.names[stickerSet.set.short_name] = this.getStickerSetInput(newSet.set) as any;\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): DownloadOptions {\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(LOCAL_IDS_SET.has(set.id as any)) {\n return {\n _: set.id as any\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 this.apiManager.invokeApiHashable({\n method: 'messages.getFeaturedStickers',\n processResult: (res) => {\n assumeType(res);\n\n forEachReverse(res.sets, (covered, idx, arr) => {\n if(covered.set.pFlags.videos && !getEnvironment().IS_WEBM_SUPPORTED) {\n arr.splice(idx, 1);\n }\n });\n\n res.sets.forEach((covered) => {\n this.saveStickerSet({set: covered.set, documents: [], packs: [], keywords: []}, covered.set.id);\n });\n\n return res;\n }\n });\n\n return res.sets;\n }\n\n public getPromoPremiumStickers() {\n return this.getStickersByEmoticon('โญ๏ธโญ๏ธ', false);\n }\n\n public getPremiumStickers() {\n return this.getStickersByEmoticon('๐Ÿ“‚โญ๏ธ', false);\n }\n\n public getFavedStickers(overwrite?: boolean) {\n return this.apiManager.invokeApiHashable({\n method: 'messages.getFavedStickers',\n processResult: (favedStickers) => {\n assumeType(favedStickers);\n this.saveStickers(favedStickers.stickers);\n this.favedStickers = favedStickers.stickers as MyDocument[];\n return favedStickers;\n },\n overwrite\n });\n }\n\n public getFavedStickersStickers(overwrite?: boolean) {\n if(overwrite) this.favedStickers = undefined;\n else if(this.favedStickers) return this.favedStickers;\n return this.getFavedStickers(overwrite).then(() => this.favedStickers);\n }\n\n public getFavedStickersLimit() {\n return this.apiManager.getLimit('favedStickers');\n }\n\n public async faveSticker(docId: DocId, unfave?: boolean) {\n if(!this.favedStickers) {\n await this.getFavedStickersStickers();\n }\n\n const limit = await this.getFavedStickersLimit();\n\n const doc = this.appDocsManager.getDoc(docId);\n findAndSplice(this.favedStickers, (_doc) => _doc.id === doc.id);\n\n if(!unfave) {\n this.favedStickers.unshift(doc);\n const spliced = this.favedStickers.splice(limit, this.favedStickers.length - limit);\n }\n\n this.rootScope.dispatchEvent('sticker_updated', {type: 'faved', faved: !unfave, document: doc});\n\n return this.apiManager.invokeApi('messages.faveSticker', {\n id: getDocumentInput(doc),\n unfave\n }).then(() => {\n if(unfave) {\n this.onStickersUpdated('faved', true);\n }\n });\n }\n\n public async toggleStickerSet(set: StickerSet.stickerSet) {\n set = this.storage.getFromCache(set.id).set;\n\n if(set.installed_date) {\n const res = await this.apiManager.invokeApi('messages.uninstallStickerSet', {\n stickerset: this.getStickerSetInput(set)\n });\n\n if(res) {\n delete set.installed_date;\n this.rootScope.dispatchEvent('stickers_deleted', set);\n this.storage.delete(set.id, true);\n return true;\n }\n } else {\n const res = await this.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 this.rootScope.dispatchEvent('stickers_installed', set);\n return true;\n }\n }\n\n return false;\n }\n\n public toggleStickerSets(sets: StickerSet.stickerSet[]) {\n return Promise.all(sets.map((set) => this.toggleStickerSet(set)));\n }\n\n public async searchStickerSets(query: string, excludeFeatured = true) {\n const flags = excludeFeatured ? 1 : 0;\n const res = await this.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 forEachReverse(res.sets, (covered, idx, arr) => {\n if(covered.set.pFlags.videos && !getEnvironment().IS_WEBM_SUPPORTED) {\n arr.splice(idx, 1);\n }\n });\n\n res.sets.forEach((covered) => {\n this.saveStickerSet({set: covered.set, documents: [], packs: [], keywords: []}, covered.set.id);\n });\n\n return res;\n }\n });\n\n const foundSaved: StickerSetCovered[] = [];\n const cache = this.storage.getCache();\n for(const 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 private processAllStickersResult = (allStickers: MessagesAllStickers) => {\n assumeType(allStickers);\n\n forEachReverse(allStickers.sets, (stickerSet, idx, arr) => {\n if(stickerSet.pFlags.videos && !getEnvironment().IS_WEBM_SUPPORTED) {\n arr.splice(idx, 1);\n }\n });\n\n return allStickers;\n };\n\n public getAllStickers() {\n return this.apiManager.invokeApiHashable({\n method: 'messages.getAllStickers',\n processResult: this.processAllStickersResult\n });\n }\n\n public getEmojiStickers() {\n return this.apiManager.invokeApiHashable({\n method: 'messages.getEmojiStickers',\n processResult: this.processAllStickersResult\n });\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 = fixEmoji(emoticon);\n if(this.getStickersByEmoticonsPromises[emoticon]) return this.getStickersByEmoticonsPromises[emoticon];\n\n return this.getStickersByEmoticonsPromises[emoticon] = Promise.all([\n this.apiManager.invokeApiHashable({\n method: 'messages.getStickers',\n params: {\n emoticon\n },\n processResult: (stickers) => stickers\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) => this.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 = fixEmoji(pack.emoticon);\n if(packEmoticon.includes(emoticon)) {\n for(const docId of pack.documents) {\n const doc = this.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 = parseEntities(emoticon);\n if(entities.length === 1) {\n [cachedStickersAnimated, cachedStickersStatic].forEach((s) => {\n forEachReverse(s, (doc, idx) => {\n const docEmoticon = 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 forEachReverse(stickers, (sticker, idx, arr) => {\n if((sticker.sticker === 3 && !getEnvironment().IS_WEBM_SUPPORTED) ||\n (!this.rootScope.premium && getStickerEffectThumb(sticker))) {\n arr.splice(idx, 1);\n }\n });\n\n return stickers;\n });\n }\n\n public clearRecentStickers() {\n if(this.recentStickers) {\n this.recentStickers.length = 0;\n this.onStickersUpdated('recent', false);\n }\n\n return this.apiManager.invokeApi('messages.clearRecentStickers');\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 * 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 filterUnique from '../../helpers/array/filterUnique';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport cleanSearchText from '../../helpers/cleanSearchText';\nimport cleanUsername from '../../helpers/cleanUsername';\nimport tsNow from '../../helpers/tsNow';\nimport isObject from '../../helpers/object/isObject';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport {isRestricted} from '../../helpers/restrictions';\nimport {Chat, ContactsResolvedPeer, InputContact, InputGeoPoint, InputMedia, InputPeer, InputUser, User as MTUser, UserProfilePhoto, UserStatus} from '../../layer';\nimport parseEntities from '../richTextProcessor/parseEntities';\nimport wrapUrl from '../richTextProcessor/wrapUrl';\nimport SearchIndex from '../searchIndex';\nimport {AppManager} from './manager';\nimport getPeerId from './utils/peers/getPeerId';\nimport canSendToUser from './utils/users/canSendToUser';\nimport {AppStoragesManager} from './appStoragesManager';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport getPeerActiveUsernames from './utils/peers/getPeerActiveUsernames';\n\nexport type User = MTUser.user;\nexport type TopPeerType = 'correspondents' | 'bots_inline';\nexport type MyTopPeer = {id: PeerId, rating: number};\n\nexport class AppUsersManager extends AppManager {\n private storage: AppStoragesManager['storages']['users'];\n\n private users: {[userId: UserId]: User};\n private usernames: {[username: string]: PeerId};\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 protected after() {\n this.clear(true);\n\n setInterval(this.updateUsersStatuses, 60000);\n\n this.rootScope.addEventListener('state_synchronized', this.updateUsersStatuses);\n\n this.apiUpdatesManager.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 -= this.timeManager.getServerTimeOffset();\n }\n\n if('was_online' in user.status) {\n user.status.was_online -= this.timeManager.getServerTimeOffset();\n }\n }\n\n // user.sortStatus = this.getUserStatusForSort(user.status);\n this.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 // this.rootScope.dispatchEvent('user_update', userId);\n // this.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({\n ...user,\n first_name: update.first_name,\n last_name: update.last_name,\n username: undefined,\n usernames: update.usernames\n }, true);\n }\n }\n });\n\n /* case 'updateContactLink':\n this.onContactUpdated(update.user_id, update.my_link._ === 'contactLinkContact');\n break; */\n\n this.rootScope.addEventListener('language_change', (e) => {\n const userId = this.getSelf().id;\n this.contactsIndex.indexObject(userId, this.getUserSearchText(userId));\n });\n\n return Promise.all([\n this.appStateManager.getState(),\n this.appStoragesManager.loadStorage('users')\n ]).then(([state, {results: users, storage}]) => {\n this.storage = storage;\n\n this.saveApiUsers(users);\n for(let i = 0, length = users.length; i < length; ++i) {\n const user = users[i];\n if(!user) {\n continue;\n }\n\n if(state.contactsListCachedTime && (user.pFlags.contact || user.pFlags.mutual_contact)) {\n this.pushContact(user.id);\n\n if(!this.contactsFillPromise) {\n this.contactsFillPromise = deferredPromise();\n this.contactsFillPromise.resolve(this.contactsList);\n }\n }\n }\n\n // const contactsList = state.contactsList;\n // if(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 const recentSearch = state.recentSearch || [];\n for(let i = 0, length = recentSearch.length; i < length; ++i) {\n this.peersStorage.requestPeer(recentSearch[i], 'recentSearch');\n }\n\n this.peersStorage.addEventListener('peerNeeded', (peerId) => {\n if(!this.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 this.peersStorage.addEventListener('peerUnneeded', (peerId) => {\n if(!this.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 for(const userId in this.users) {\n // const userId = +userId;\n if(!userId) continue;\n const peerId = userId.toPeerId();\n if(!this.peersStorage.isPeerNeeded(peerId)) {\n const user = this.users[userId];\n this.modifyUsernamesCache(user, false);\n\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 public get userId() {\n return this.rootScope.myId.toUserId();\n }\n\n private onContactsModified(fromServer?: boolean) {\n // const contactsList = [...this.contactsList];\n // this.appStateManager.pushToState('contactsList', contactsList);\n\n if(fromServer) {\n this.appStateManager.pushToState('contactsListCachedTime', tsNow(true));\n }\n }\n\n public pushRecentSearch(peerId: PeerId) {\n return this.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 this.appStateManager.pushToState('recentSearch', recentSearch);\n for(const peerId of recentSearch) {\n this.peersStorage.requestPeer(peerId, 'recentSearch');\n }\n }\n });\n }\n\n public clearRecentSearch() {\n return this.appStateManager.getState().then((state) => {\n const recentSearch = state.recentSearch || [];\n for(const peerId of recentSearch) {\n this.peersStorage.releasePeer(peerId, 'recentSearch');\n }\n\n recentSearch.length = 0;\n this.appStateManager.pushToState('recentSearch', recentSearch);\n });\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 this.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(true);\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 ||= promise\n };\n }\n\n public resolveUsername(username: string): Promise | Chat | User {\n if(username[0] === '@') {\n username = username.slice(1);\n }\n\n username = username.toLowerCase();\n const peerId = this.usernames[username];\n if(peerId) {\n return this.appPeersManager.getPeer(peerId);\n }\n\n return this.apiManager.invokeApiSingleProcess({\n method: 'contacts.resolveUsername',\n params: {username},\n processResult: (resolvedPeer) => this.processResolvedPeer(resolvedPeer)\n });\n }\n\n private processResolvedPeer(resolvedPeer: ContactsResolvedPeer.contactsResolvedPeer) {\n this.saveApiUsers(resolvedPeer.users);\n this.appChatsManager.saveApiChats(resolvedPeer.chats);\n\n return this.appPeersManager.getPeer(getPeerId(resolvedPeer.peer)) as Chat | User;\n }\n\n public resolvePhone(phone: string) {\n return this.apiManager.invokeApi('contacts.resolvePhone', {phone}).then((resolvedPeer) => {\n return this.processResolvedPeer(resolvedPeer) as User;\n });\n }\n\n private pushContact(id: UserId) {\n this.contactsList.add(id);\n this.contactsIndex.indexObject(id, this.getUserSearchText(id));\n this.peersStorage.requestPeer(id.toPeerId(), 'contact');\n }\n\n private popContact(id: UserId) {\n this.contactsList.delete(id);\n this.contactsIndex.indexObject(id, ''); // delete search index\n this.peersStorage.releasePeer(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 ...getPeerActiveUsernames(user),\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 = this.getUserStatusForSort(this.getUser(userId1).status);\n const status2 = this.getUserStatusForSort(this.getUser(userId2).status);\n return status2 - status1;\n });\n }\n\n const myUserId = this.userId;\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 limit?: number\n ) {\n return this.getContacts(query, includeSaved, sortBy).then((userIds) => {\n const peerIds = userIds.map((userId) => userId.toPeerId(false));\n if(limit) {\n return peerIds.slice(0, limit);\n }\n\n return peerIds;\n });\n }\n\n public toggleBlock(peerId: PeerId, block: boolean) {\n return this.apiManager.invokeApiSingle(block ? 'contacts.block' : 'contacts.unblock', {\n id: this.appPeersManager.getInputPeerById(peerId)\n }).then((value) => {\n if(value) {\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updatePeerBlocked',\n peer_id: this.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 public modifyUsernamesCache(peer: Parameters[0], save: boolean) {\n const usernames = getPeerActiveUsernames(peer);\n if(!usernames.length) {\n return;\n }\n\n const cleanedUsernames = usernames.map((username) => cleanUsername(username));\n if(save) {\n cleanedUsernames.forEach((searchUsername) => {\n this.usernames[searchUsername] = peer.id.toPeerId(peer._ !== 'user');\n });\n } else {\n cleanedUsernames.forEach((searchUsername) => {\n delete this.usernames[searchUsername];\n });\n }\n }\n\n public setUsernameToCache(peer: Parameters[0], oldPeer?: typeof peer) {\n if(\n !oldPeer ||\n (oldPeer as MTUser.user).username !== (peer as MTUser.user).username ||\n !deepEqual((oldPeer as MTUser.user).usernames, (peer as MTUser.user).usernames)\n ) {\n this.modifyUsernamesCache(oldPeer, false);\n this.modifyUsernamesCache(peer, true);\n\n return true;\n }\n\n return false;\n }\n\n public saveApiUser(user: MTUser, override?: boolean) {\n if(!user || 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 user.pFlags ??= {};\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 const changedUsername = this.setUsernameToCache(user, oldUser);\n\n if(!oldUser ||\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 } else {\n user.sortName = oldUser.sortName;\n }\n\n if(user.status) {\n if((user.status as UserStatus.userStatusOnline).expires) {\n (user.status as UserStatus.userStatusOnline).expires -= this.timeManager.getServerTimeOffset();\n }\n\n if((user.status as UserStatus.userStatusOffline).was_online) {\n (user.status as UserStatus.userStatusOffline).was_online -= this.timeManager.getServerTimeOffset();\n }\n }\n\n if((user as User).photo?._ === 'userProfilePhotoEmpty') {\n delete (user as User).photo;\n }\n\n // user.sortStatus = user.pFlags.bot ? -1 : this.getUserStatusForSort(user.status);\n\n // if(!user.username && user.usernames) {\n // user.username = user.usernames.find((username) => username.pFlags.active).username;\n // }\n\n if(oldUser === undefined) {\n this.users[userId] = user;\n } else {\n const changedTitle = user.first_name !== oldUser.first_name ||\n user.last_name !== oldUser.last_name ||\n changedUsername;\n\n const oldPhotoId = (oldUser.photo as UserProfilePhoto.userProfilePhoto)?.photo_id;\n const newPhotoId = (user.photo as UserProfilePhoto.userProfilePhoto)?.photo_id;\n const changedPhoto = oldPhotoId !== newPhotoId;\n\n const changedAnyBadge = oldUser.pFlags.premium !== user.pFlags.premium ||\n oldUser.pFlags.verified !== user.pFlags.verified ||\n oldUser.pFlags.scam !== user.pFlags.scam ||\n oldUser.pFlags.fake !== user.pFlags.fake;\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 this.rootScope.dispatchEvent('user_update', userId);\n\n if(wasContact !== newContact) {\n this.onContactUpdated(userId, newContact, wasContact);\n }\n\n if(changedPhoto) {\n this.rootScope.dispatchEvent('avatar_update', {peerId: user.id.toPeerId()});\n }\n\n if(changedTitle || changedAnyBadge) {\n this.rootScope.dispatchEvent('peer_title_edit', {peerId: user.id.toPeerId()});\n }\n }\n\n this.checkPremium(user, oldUser);\n this.setUserToStateIfNeeded(user);\n }\n\n private checkPremium(user: User, oldUser: User) {\n if(user.pFlags.self) {\n const isPremium = !!user.pFlags.premium;\n if(this.rootScope.premium !== isPremium) {\n this.rootScope.dispatchEvent('premium_toggle_private', {isNew: !oldUser, isPremium});\n }\n }\n }\n\n private setUserToStateIfNeeded(user: User) {\n if(this.peersStorage.isPeerNeeded(user.id.toPeerId())) {\n this.storage.set({\n [user.id]: user\n });\n }\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 const user = this.getUser(status);\n status = user?.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];\n }\n\n public getUserStatus(id: UserId) {\n return this.isRegularUser(id) && !this.users[id].pFlags.self && this.users[id].status;\n }\n\n public async getUserPhone(id: UserId) {\n const user = this.getUser(id);\n if(!user?.phone) {\n return;\n }\n\n const appConfig = await this.apiManager.getAppConfig();\n return {\n phone: user.phone,\n isAnonymous: appConfig.fragment_prefixes.some((prefix) => user.phone.startsWith(prefix))\n };\n }\n\n public getSelf() {\n return this.getUser(this.userId);\n }\n\n public isBot(id: UserId) {\n return this.users[id] && !!this.users[id].pFlags.bot;\n }\n\n public isAttachMenuBot(id: UserId) {\n return this.isBot(id) && !!this.users[id].pFlags.bot_attach_menu;\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 !== this.userId;\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 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 // ! do not use it, there are places that don't support it. need explicit peer id\n // if(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 private 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 private 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 this.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(this.apiUpdatesManager.updatesState.syncLoading) {\n return;\n }\n\n const user = this.getUser(id);\n if(user?.status &&\n user.status._ !== 'userStatusOnline' &&\n user.status._ !== 'userStatusEmpty' &&\n !user.pFlags.support &&\n !user.pFlags.deleted) {\n user.status = {\n _: 'userStatusOnline',\n expires: timestamp + onlineTimeFor\n };\n\n // user.sortStatus = this.getUserStatusForSort(user.status);\n this.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 this.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] = this.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 this.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 this.appChatsManager.saveApiChats(result.chats);\n\n if(result.categories.length) {\n topPeers = result.categories[0].peers.map((topPeer) => {\n const peerId = getPeerId(topPeer.peer);\n this.peersStorage.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 this.appStateManager.pushToState('topPeersCache', state.topPeersCache);\n\n return topPeers;\n });\n });\n }\n\n public getBlocked(offset = 0, limit = 0) {\n return this.apiManager.invokeApiSingle('contacts.getBlocked', {offset, limit}).then((contactsBlocked) => {\n this.saveApiUsers(contactsBlocked.users);\n this.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 this.apiManager.invokeApi('contacts.getLocated', {\n geo_point,\n background\n }).then((updates) => {\n this.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 // handle 't.me/username' as 'username'\n const entities = parseEntities(query);\n if(entities.length && entities[0].length === query.trim().length && entities[0]._ === 'messageEntityUrl') {\n try {\n const url = new URL(wrapUrl(query).url);\n const path = url.pathname.slice(1);\n if(path) {\n query = path;\n }\n } catch(err) {}\n }\n\n return this.apiManager.invokeApiCacheable('contacts.search', {\n q: query,\n limit\n }, {cacheSeconds: 60}).then((peers) => {\n this.saveApiUsers(peers.users);\n this.appChatsManager.saveApiChats(peers.chats);\n\n const out = {\n my_results: filterUnique(peers.my_results.map((p) => getPeerId(p))), // ! contacts.search returns duplicates in my_results\n results: peers.results.map((p) => 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 this.rootScope.dispatchEvent('contacts_update', userId);\n }\n }\n\n public updateUsername(username: string) {\n return this.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 this.rootScope.dispatchEvent('user_update', userId);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public updateMyOnlineStatus(offline: boolean) {\n this.setUserStatus(this.getSelf().id, offline);\n return this.apiManager.invokeApiSingle('account.updateStatus', {offline});\n }\n\n public addContact(userId: UserId, first_name: string, last_name: string, phone: string, addPhonePrivacyException?: boolean) {\n /* if(!userId) {\n return this.importContacts([{\n first_name,\n last_name,\n phones: [phone]\n }]);\n } */\n\n return this.apiManager.invokeApi('contacts.addContact', {\n id: this.getUserInput(userId),\n first_name,\n last_name,\n phone,\n add_phone_privacy_exception: addPhonePrivacyException\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates, {override: true});\n\n this.onContactUpdated(userId, true);\n });\n }\n\n public deleteContacts(userIds: UserId[]) {\n return this.apiManager.invokeApi('contacts.deleteContacts', {\n id: userIds.map((userId) => this.getUserInput(userId))\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates, {override: true});\n\n userIds.forEach((userId) => {\n this.onContactUpdated(userId, false);\n });\n });\n }\n\n public checkUsername(username: string) {\n return this.apiManager.invokeApi('account.checkUsername', {username});\n }\n\n public toggleUsername(username: string, active: boolean) {\n return this.apiManager.invokeApi('account.toggleUsername', {username, active});\n }\n\n public reorderUsernames(usernames: string[]) {\n return this.apiManager.invokeApi('account.reorderUsernames', {order: usernames});\n }\n\n public canSendToUser(userId: UserId) {\n return canSendToUser(this.getUser(userId));\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\nexport default function cleanUsername(username: string) {\n return username && username.toLowerCase() || '';\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 {ReferenceContext} from '../mtproto/referenceDatabase';\nimport {WebPage} from '../../layer';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport {AppManager} from './manager';\n\nconst photoTypeSet = new Set(['photo', 'video', 'gif', 'document']);\n\ntype WebPageMessageKey = `${PeerId}_${number}`;\n\nexport class AppWebPagesManager extends AppManager {\n private webpages: {\n [webPageId: string]: WebPage\n } = {};\n private pendingWebPages: {\n [webPageId: string]: Set\n } = {};\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateWebPage: (update) => {\n this.saveWebPage(update.webpage);\n }\n });\n }\n\n public saveWebPage(apiWebPage: WebPage, messageKey?: WebPageMessageKey, mediaContext?: ReferenceContext) {\n if(apiWebPage._ === 'webPageNotModified' || apiWebPage._ === 'webPageEmpty') return;\n const {id} = apiWebPage;\n\n const oldWebPage = this.webpages[id];\n const isUpdated = oldWebPage &&\n oldWebPage._ === apiWebPage._ &&\n (oldWebPage as WebPage.webPage).hash === (oldWebPage as WebPage.webPage).hash;\n\n if(apiWebPage._ === 'webPage') {\n if(apiWebPage.photo?._ === 'photo') {\n apiWebPage.photo = this.appPhotosManager.savePhoto(apiWebPage.photo, mediaContext);\n } else {\n delete apiWebPage.photo;\n }\n\n if(apiWebPage.document?._ === 'document') {\n apiWebPage.document = this.appDocsManager.saveDoc(apiWebPage.document, mediaContext);\n } else {\n if(apiWebPage.type === 'document') {\n delete apiWebPage.type;\n }\n\n delete apiWebPage.document;\n }\n\n const siteName = apiWebPage.site_name;\n const shortTitle = apiWebPage.title || apiWebPage.author || siteName || '';\n if(siteName && shortTitle === siteName) {\n delete apiWebPage.site_name;\n }\n\n // delete apiWebPage.description\n\n if(!photoTypeSet.has(apiWebPage.type) &&\n !apiWebPage.description &&\n apiWebPage.photo) {\n apiWebPage.type = 'photo';\n }\n }\n\n let pendingSet = this.pendingWebPages[id];\n if(messageKey) {\n if(!pendingSet) pendingSet = this.pendingWebPages[id] = new Set();\n pendingSet.add(messageKey);\n }\n\n if(oldWebPage === undefined) {\n this.webpages[id] = apiWebPage;\n } else {\n safeReplaceObject(oldWebPage, apiWebPage);\n }\n\n if(!messageKey && pendingSet !== undefined && isUpdated) {\n const msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[] = [];\n pendingSet.forEach((value) => {\n const [peerId, mid, isScheduled] = value.split('_');\n msgs.push({\n peerId: peerId.toPeerId(),\n mid: +mid,\n isScheduled: !!isScheduled\n });\n });\n\n this.rootScope.dispatchEvent('webpage_updated', {\n id,\n msgs\n });\n }\n\n return apiWebPage;\n }\n\n public getMessageKeyForPendingWebPage(peerId: PeerId, mid: number, isScheduled?: boolean): WebPageMessageKey {\n return peerId + '_' + mid + (isScheduled ? '_s' : '') as any;\n }\n\n public deleteWebPageFromPending(webPage: WebPage, messageKey: WebPageMessageKey) {\n const id = (webPage as WebPage.webPage).id;\n if(!id) return;\n\n const set = this.pendingWebPages[id];\n if(set && set.has(messageKey)) {\n set.delete(messageKey);\n\n if(!set.size) {\n delete this.pendingWebPages[id];\n }\n }\n }\n\n public getCachedWebPage(id: WebPage.webPage['id']) {\n return this.webpages[id];\n }\n\n public getWebPage(url: string) {\n return this.apiManager.invokeApiHashable({\n method: 'messages.getWebPage',\n processResult: (webPage) => {\n return this.saveWebPage(webPage);\n },\n params: {\n url\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 readBlobAs from './readBlobAs';\n\nexport default function readBlobAsArrayBuffer(blob: Blob) {\n return readBlobAs(blob, 'readAsArrayBuffer');\n}\n","export default function fileNameRFC(fileName: string) {\n // Make filename RFC5987 compatible\n return encodeURIComponent(fileName).replace(/['()]/g, escape).replace(/\\*/g, '%2A');\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 {getServiceMessagePort} from '../mtproto/mtproto.worker';\nimport ServiceMessagePort from '../serviceWorker/serviceMessagePort';\nimport StreamWriter from './streamWriter';\n\nexport default class DownloadWriter implements StreamWriter {\n constructor(\n private serviceMessagePort: ServiceMessagePort,\n private downloadId: string\n ) {\n this.serviceMessagePort = getServiceMessagePort();\n }\n\n public async write(part: Uint8Array, offset?: number) {\n return this.serviceMessagePort.invoke('downloadChunk', {\n id: this.downloadId,\n chunk: part\n });\n }\n\n public finalize(saveToStorage?: boolean): Promise {\n return this.serviceMessagePort.invoke('downloadFinalize', this.downloadId).then(() => undefined);\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 deferredPromise from '../../helpers/cancellablePromise';\nimport makeError from '../../helpers/makeError';\nimport fileNameRFC from '../../helpers/string/fileNameRFC';\nimport {getServiceMessagePort} from '../mtproto/mtproto.worker';\nimport DownloadWriter from './downloadWriter';\nimport FileStorage from './fileStorage';\n\nexport default class DownloadStorage implements FileStorage {\n public getFile(fileName: string): Promise {\n return Promise.reject(makeError('NO_ENTRY_FOUND'));\n }\n\n public prepareWriting({fileName, downloadId, size}: {\n fileName: string,\n downloadId: string,\n size: number\n }) {\n const headers = {\n 'Content-Type': 'application/octet-stream; charset=utf-8',\n 'Content-Disposition': 'attachment; filename*=UTF-8\\'\\'' + fileNameRFC(fileName),\n ...(size ? {'Content-Length': size} : {})\n };\n\n const serviceMessagePort = getServiceMessagePort();\n const promise = serviceMessagePort.invoke('download', {\n headers,\n id: downloadId\n });\n\n const deferred = deferredPromise();\n deferred.cancel = () => {\n deferred.reject(makeError('DOWNLOAD_CANCELED'));\n };\n\n deferred.catch(() => {\n getServiceMessagePort().invoke('downloadCancel', downloadId);\n });\n\n promise.then(deferred.resolve, deferred.reject);\n\n return {\n deferred,\n getWriter: () => {\n return new DownloadWriter(serviceMessagePort, downloadId);\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 * 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 {ReferenceBytes} from './referenceDatabase';\nimport Modes from '../../config/modes';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport {randomLong} from '../../helpers/random';\nimport {Document, InputFile, InputFileLocation, InputWebFileLocation, Photo, PhotoSize, UploadFile, UploadWebFile, VideoSize, WebDocument} from '../../layer';\nimport {DcId} from '../../types';\nimport CacheStorageController from '../files/cacheStorage';\nimport {logger, LogTypes} from '../logger';\nimport assumeType from '../../helpers/assumeType';\nimport noop from '../../helpers/noop';\nimport readBlobAsArrayBuffer from '../../helpers/blob/readBlobAsArrayBuffer';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport findAndSplice from '../../helpers/array/findAndSplice';\nimport fixFirefoxSvg from '../../helpers/fixFirefoxSvg';\nimport {AppManager} from '../appManagers/manager';\nimport {getEnvironment} from '../../environment/utils';\nimport MTProtoMessagePort from './mtprotoMessagePort';\nimport getFileNameForUpload from '../../helpers/getFileNameForUpload';\nimport type {Progress} from '../appManagers/appDownloadManager';\nimport getDownloadMediaDetails from '../appManagers/utils/download/getDownloadMediaDetails';\n// import networkStats from './networkStats';\nimport getDownloadFileNameFromOptions from '../appManagers/utils/download/getDownloadFileNameFromOptions';\nimport StreamWriter from '../files/streamWriter';\nimport FileStorage from '../files/fileStorage';\nimport {MAX_FILE_SAVE_SIZE} from './mtproto_config';\nimport throttle from '../../helpers/schedulers/throttle';\nimport makeError from '../../helpers/makeError';\nimport readBlobAsUint8Array from '../../helpers/blob/readBlobAsUint8Array';\nimport DownloadStorage from '../files/downloadStorage';\nimport copy from '../../helpers/object/copy';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport {EXTENSION_MIME_TYPE_MAP, MIME_TYPE_EXTENSION_MAP} from '../../environment/mimeTypeMap';\nimport {getServiceMessagePort} from './mtproto.worker';\n\ntype Delayed = {\n offset: number,\n writePromise: CancellablePromise,\n writeDeferred: CancellablePromise\n};\n\nexport type DownloadOptions = {\n dcId: DcId,\n location: InputFileLocation | InputWebFileLocation,\n size?: number,\n fileName?: string,\n mimeType?: MTMimeType,\n limitPart?: number,\n queueId?: number,\n onlyCache?: boolean,\n downloadId?: string\n // getFileMethod: Parameters[1]\n};\n\nexport type DownloadMediaOptions = {\n media: Photo.photo | Document.document | WebDocument,\n thumb?: PhotoSize | VideoSize,\n queueId?: number,\n onlyCache?: boolean,\n downloadId?: string\n};\n\ntype DownloadPromise = CancellablePromise;\n\nexport type MyUploadFile = UploadFile.uploadFile | UploadWebFile.uploadWebFile;\n\n// export interface RefreshReferenceTask extends WorkerTaskVoidTemplate {\n// type: 'refreshReference',\n// payload: ReferenceBytes,\n// };\n\n// export interface RefreshReferenceTaskResponse extends WorkerTaskVoidTemplate {\n// type: 'refreshReference',\n// payload: ReferenceBytes,\n// originalPayload: ReferenceBytes\n// };\n\nconst MAX_DOWNLOAD_FILE_PART_SIZE = 1 * 1024 * 1024;\nconst MAX_UPLOAD_FILE_PART_SIZE = 512 * 1024;\nconst MIN_PART_SIZE = 128 * 1024;\nconst AVG_PART_SIZE = 512 * 1024;\n\nconst REGULAR_DOWNLOAD_DELTA = (9 * 512 * 1024) / MIN_PART_SIZE;\n// const PREMIUM_DOWNLOAD_DELTA = REGULAR_DOWNLOAD_DELTA * 2;\nconst PREMIUM_DOWNLOAD_DELTA = (56 * 512 * 1024) / MIN_PART_SIZE;\n\nconst IGNORE_ERRORS: Set = new Set([\n 'DOWNLOAD_CANCELED',\n 'UPLOAD_CANCELED',\n 'UNKNOWN',\n 'NO_NEW_CONTEXT'\n]);\n\nexport class ApiFileManager extends AppManager {\n private cacheStorage = new CacheStorageController('cachedFiles');\n private downloadStorage = new DownloadStorage();\n\n private downloadPromises: {\n [fileName: string]: DownloadPromise\n } = {};\n\n // private downloadToDiscPromises: {\n // [fileName: string]: DownloadPromise\n // } = {};\n\n private uploadPromises: {\n [fileName: string]: CancellablePromise\n } = {};\n\n private downloadPulls: {\n [dcId: string]: Array<{\n id: number,\n queueId: number,\n cb: () => Promise,\n deferred: {\n resolve: (...args: any[]) => void,\n reject: (...args: any[]) => void\n },\n activeDelta: number\n }>\n } = {};\n private downloadActives: {[dcId: string]: number} = {};\n\n public refreshReferencePromises: {\n [referenceHex: string]: {\n deferred: CancellablePromise,\n timeout?: number\n }\n } = {};\n\n private log: ReturnType = logger('AFM', LogTypes.Error | LogTypes.Log);\n private tempId = 0;\n private queueId = 0;\n private debug = Modes.debug;\n\n private maxUploadParts = 4000;\n private maxDownloadParts = 8000;\n private webFileDcId: DcId;\n\n protected after() {\n setInterval(() => { // clear old promises\n for(const hex in this.refreshReferencePromises) {\n const {deferred} = this.refreshReferencePromises[hex];\n if(deferred.isFulfilled || deferred.isRejected) {\n delete this.refreshReferencePromises[hex];\n }\n }\n }, 1800e3);\n\n this.rootScope.addEventListener('config', (config) => {\n this.webFileDcId = config.webfile_dc_id;\n });\n\n this.rootScope.addEventListener('app_config', (appConfig) => {\n this.maxUploadParts = this.rootScope.premium ? appConfig.upload_max_fileparts_premium : appConfig.upload_max_fileparts_default;\n this.maxDownloadParts = appConfig.upload_max_fileparts_premium;\n });\n }\n\n private downloadRequest(dcId: 'upload', id: number, cb: () => Promise, activeDelta: number, queueId?: number): Promise;\n private downloadRequest(dcId: number, id: number, cb: () => Promise, activeDelta: number, queueId?: number): Promise;\n private downloadRequest(dcId: number | string, id: number, cb: () => Promise, activeDelta: number, queueId: number = 0) {\n if(this.downloadPulls[dcId] === undefined) {\n this.downloadPulls[dcId] = [];\n this.downloadActives[dcId] = 0;\n }\n\n const downloadPull = this.downloadPulls[dcId];\n\n const promise = new Promise((resolve, reject) => {\n downloadPull.push({id, queueId, cb, deferred: {resolve, reject}, activeDelta});\n });\n\n setTimeout(() => {\n this.downloadCheck(dcId);\n }, 0);\n\n return promise;\n }\n\n private downloadCheck(dcId: string | number) {\n const downloadPull = this.downloadPulls[dcId];\n const downloadLimit = /* dcId === 'upload' ? 24 : */(this.rootScope.premium ? PREMIUM_DOWNLOAD_DELTA : REGULAR_DOWNLOAD_DELTA);\n // const downloadLimit = Infinity;\n\n if(this.downloadActives[dcId] >= downloadLimit || !downloadPull?.length) {\n return false;\n }\n\n // const data = downloadPull.shift();\n const data = findAndSplice(downloadPull, (d) => d.queueId === 0) || findAndSplice(downloadPull, (d) => d.queueId === this.queueId) || downloadPull.shift();\n const activeDelta = data.activeDelta || 1;\n\n this.downloadActives[dcId] += activeDelta;\n\n const promise = data.cb();\n // const networkPromise = networkStats.waitForChunk(dcId as DcId, activeDelta * MIN_PART_SIZE);\n /* Promise.race([\n promise\n // networkPromise\n ]) */promise.then(() => {\n this.downloadActives[dcId] -= activeDelta;\n this.downloadCheck(dcId);\n\n // networkPromise.resolve();\n }, (error: ApiError) => {\n if(!error?.type || !IGNORE_ERRORS.has(error.type)) {\n this.log.error('downloadCheck error:', error);\n }\n\n this.downloadActives[dcId] -= activeDelta;\n this.downloadCheck(dcId);\n\n // networkPromise.reject(error);\n }).finally(() => {\n promise.then(data.deferred.resolve, data.deferred.reject);\n });\n }\n\n public setQueueId(queueId: number) {\n // this.log.error('setQueueId', queueId);\n this.queueId = queueId;\n }\n\n private getFileStorage() {\n return this.cacheStorage;\n }\n\n public cancelDownload(fileName: string) {\n const promises = [this.downloadPromises[fileName], this.uploadPromises[fileName]].filter(Boolean);\n let canceled = false;\n for(let i = 0, length = promises.length; i < length; ++i) {\n const promise = promises[i];\n if(promise && !promise.isRejected && !promise.isFulfilled) {\n promise.cancel();\n canceled = true;\n }\n }\n\n return canceled;\n }\n\n public requestWebFilePart(\n dcId: DcId,\n location: InputWebFileLocation,\n offset: number,\n limit: number,\n id = 0,\n queueId = 0,\n checkCancel?: () => void\n ) {\n return this.downloadRequest(dcId, id, async() => { // do not remove async, because checkCancel will throw an error\n checkCancel?.();\n\n if('url' in location) {\n const url = location.url;\n if(this.isLocalWebFile(url)) {\n return fetch(url)\n .then((response) => response.arrayBuffer())\n .then((arrayBuffer) => {\n const extension = url.split('.').pop() as MTFileExtension;\n const mimeType = EXTENSION_MIME_TYPE_MAP[extension] || 'application/octet-stream';\n return {\n _: 'upload.webFile',\n size: arrayBuffer.byteLength,\n mime_type: mimeType,\n file_type: {_: 'storage.fileUnknown'},\n mtime: 0,\n bytes: new Uint8Array(arrayBuffer)\n };\n });\n }\n }\n\n return this.apiManager.invokeApi('upload.getWebFile', {\n location,\n offset,\n limit\n }, {\n dcId,\n fileDownload: true\n });\n }, this.getDelta(limit), queueId);\n }\n\n public requestFilePart(\n dcId: DcId,\n location: InputFileLocation,\n offset: number,\n limit: number,\n id = 0,\n queueId = 0,\n checkCancel?: () => void\n ) {\n return this.downloadRequest(dcId, id, async() => { // do not remove async, because checkCancel will throw an error\n checkCancel?.();\n\n const invoke = async(): Promise => {\n checkCancel?.(); // do not remove async, because checkCancel will throw an error\n\n // * IMPORTANT: reference can be changed in previous request\n const reference = (location as InputFileLocation.inputDocumentFileLocation).file_reference?.slice();\n\n const promise = // pause(offset > (100 * 1024 * 1024) ? 10000000 : 0).then(() =>\n this.apiManager.invokeApi('upload.getFile', {\n location,\n offset,\n limit\n }, {\n dcId,\n fileDownload: true\n }) as Promise/* ) */;\n\n return promise.catch((err: ApiError) => {\n checkCancel?.();\n\n if(err.type === 'FILE_REFERENCE_EXPIRED') {\n return this.refreshReference(location as InputFileLocation.inputDocumentFileLocation, reference).then(invoke);\n }\n\n throw err;\n });\n };\n\n assumeType(location);\n const reference = location.file_reference;\n if(reference && !location.checkedReference) { // check stream's location because it's new every call\n location.checkedReference = true;\n const hex = bytesToHex(reference);\n if(this.refreshReferencePromises[hex]) {\n return this.refreshReference(location, reference).then(invoke);\n }\n }\n\n return invoke();\n }, this.getDelta(limit), queueId);\n }\n\n /* private convertBlobToBytes(blob: Blob) {\n return blob.arrayBuffer().then((buffer) => new Uint8Array(buffer));\n } */\n\n private getDelta(bytes: number) {\n return bytes / MIN_PART_SIZE;\n }\n\n private getLimitPart(size: number, isUpload: boolean): number {\n if(!size) { // * sometimes size can be 0 (e.g. avatars, webDocuments)\n return AVG_PART_SIZE;\n }\n\n // return 1 * 1024 * 1024;\n\n let bytes = MIN_PART_SIZE;\n\n const maxParts = isUpload ? this.maxUploadParts : this.maxDownloadParts;\n const maxPartSize = isUpload ? MAX_UPLOAD_FILE_PART_SIZE : MAX_DOWNLOAD_FILE_PART_SIZE;\n // usually it will stick to 512Kb size if the file is too big\n while((size / bytes) > maxParts && bytes < maxPartSize) {\n bytes *= 2;\n }\n /* if(size < 1e6 || !size) bytes = 512;\n else if(size < 3e6) bytes = 256;\n else bytes = 128; */\n\n return bytes;\n }\n\n private uncompressTGS = (bytes: Uint8Array, fileName: string) => {\n // this.log('uncompressTGS', bytes, bytes.slice().buffer);\n // slice ะฝัƒะถะตะฝ ะฟะพั‚ะพะผัƒ ั‡ั‚ะพ ะฒ uint8array - 5053 length, ะฒ arraybuffer - 5084\n return this.cryptoWorker.invokeCrypto('gzipUncompress', bytes.slice().buffer, false) as Promise;\n };\n\n private uncompressTGV = (bytes: Uint8Array, fileName: string) => {\n // this.log('uncompressTGS', bytes, bytes.slice().buffer);\n // slice ะฝัƒะถะตะฝ ะฟะพั‚ะพะผัƒ ั‡ั‚ะพ ะฒ uint8array - 5053 length, ะฒ arraybuffer - 5084\n const buffer = bytes.slice().buffer;\n if(getEnvironment().IS_FIREFOX) {\n return this.cryptoWorker.invokeCrypto('gzipUncompress', buffer, true).then((text) => {\n return fixFirefoxSvg(text as string);\n }).then((text) => {\n const textEncoder = new TextEncoder();\n return textEncoder.encode(text);\n });\n }\n\n return this.cryptoWorker.invokeCrypto('gzipUncompress', buffer, false) as Promise;\n };\n\n private convertWebp = (bytes: Uint8Array, fileName: string) => {\n const instance = MTProtoMessagePort.getInstance();\n return instance.invoke('convertWebp', {fileName, bytes});\n };\n\n private convertOpus = (bytes: Uint8Array, fileName: string) => {\n const instance = MTProtoMessagePort.getInstance();\n return instance.invoke('convertOpus', {fileName, bytes});\n };\n\n private refreshReference(\n inputFileLocation: InputFileLocation.inputDocumentFileLocation,\n reference: typeof inputFileLocation['file_reference'],\n hex = bytesToHex(reference)\n ) {\n let r = this.refreshReferencePromises[hex];\n if(!r) {\n const deferred = deferredPromise();\n\n r = this.refreshReferencePromises[hex] = {\n deferred\n\n // ! I don't remember what it was for...\n // timeout: ctx.setTimeout(() => {\n // this.log.error('Didn\\'t refresh the reference:', inputFileLocation);\n // deferred.reject(makeError('REFERENCE_IS_NOT_REFRESHED'));\n // }, 60000)\n };\n\n // deferred.catch(noop).finally(() => {\n // clearTimeout(r.timeout);\n // });\n\n this.referenceDatabase.refreshReference(reference).then((reference) => {\n if(hex === bytesToHex(reference)) {\n deferred.reject(makeError('REFERENCE_IS_NOT_REFRESHED'));\n }\n\n deferred.resolve(reference);\n }, deferred.reject);\n }\n\n // have to replace file_reference in any way, because location can be different everytime if it's stream\n return r.deferred.then((reference) => {\n inputFileLocation.file_reference = reference;\n });\n }\n\n public isDownloading(fileName: string) {\n return !!this.downloadPromises[fileName];\n }\n\n public getDownload(fileName: string) {\n return this.downloadPromises[fileName];\n }\n\n public getUpload(fileName: string) {\n return this.uploadPromises[fileName];\n }\n\n private getConvertMethod(mimeType: MTMimeType) {\n let process: ApiFileManager['uncompressTGS'] | ApiFileManager['convertWebp'];\n if(mimeType === 'application/x-tgwallpattern') {\n process = this.uncompressTGV;\n mimeType = 'image/svg+xml';\n } else if(mimeType === 'image/webp' && !getEnvironment().IS_WEBP_SUPPORTED) {\n process = this.convertWebp;\n mimeType = 'image/png';\n } else if(mimeType === 'application/x-tgsticker') {\n process = this.uncompressTGS;\n mimeType = 'application/json';\n } else if(mimeType === 'audio/ogg' && !getEnvironment().IS_OPUS_SUPPORTED) {\n process = this.convertOpus;\n mimeType = 'audio/wav';\n }\n\n return {mimeType, process};\n }\n\n private allocateDeferredPromises(startOffset: number, size: number, limitPart: number) {\n const delayed: Delayed[] = [];\n let offset = startOffset;\n let writePromise: CancellablePromise = Promise.resolve(),\n writeDeferred: CancellablePromise;\n do {\n writeDeferred = deferredPromise();\n delayed.push({offset, writePromise, writeDeferred});\n writePromise = writeDeferred;\n offset += limitPart;\n } while(offset < size);\n\n return delayed;\n }\n\n private isLocalWebFile(url: string) {\n return url.startsWith('assets/');\n }\n\n public download(options: DownloadOptions): DownloadPromise {\n const size = options.size ?? 0;\n const {dcId, location} = options;\n let {downloadId} = options;\n if(downloadId && !getServiceMessagePort()) {\n this.log.error('download fallback to blob', options);\n downloadId = undefined;\n }\n\n const originalMimeType = options.mimeType;\n const convertMethod = this.getConvertMethod(originalMimeType);\n const {process} = convertMethod;\n options.mimeType = convertMethod.mimeType || 'image/jpeg';\n\n const fileName = getDownloadFileNameFromOptions(options);\n const cacheFileName = downloadId ? getDownloadFileNameFromOptions({...copy(options), downloadId: undefined}) : fileName;\n const cacheStorage: FileStorage = this.getFileStorage();\n const downloadStorage: FileStorage = downloadId ? this.downloadStorage : undefined;\n let deferred: DownloadPromise = downloadId ? undefined : this.downloadPromises[fileName];\n\n this.debug && this.log('downloadFile', fileName, options);\n\n if(deferred) {\n return deferred;\n }\n\n // if(deferred) {\n // if(size) {\n // return deferred.then(async(blob) => {\n // if(blob instanceof Blob && blob.size < size) {\n // this.debug && this.log('downloadFile need to deleteFile, wrong size:', blob.size, size);\n\n // try {\n // await this.delete(fileName);\n // } finally {\n // return this.download(options);\n // }\n // } else {\n // return blob;\n // }\n // });\n // } else {\n // return deferred;\n // }\n // }\n\n const errorHandler = (item: typeof cachePrepared, error: ApiError) => {\n if(item?.error) {\n return;\n }\n\n for(const p of prepared) {\n if(item && item !== p) {\n continue;\n }\n\n p.error = error;\n p.deferred.reject(error);\n }\n };\n\n const isWebFile = location._ === 'inputWebFileLocation';\n const isLocalWebFile = isWebFile && this.isLocalWebFile(location.url);\n const id = this.tempId++;\n const limitPart = isLocalWebFile ?\n size :\n options.limitPart || this.getLimitPart(size, false);\n\n let getFile: FileStorage['getFile'] = cacheStorage.getFile.bind(cacheStorage);\n\n let cachePrepared: ReturnType & {writer?: StreamWriter, error?: ApiError},\n downloadPrepared: typeof cachePrepared;\n const prepared: (typeof cachePrepared)[] = [];\n const possibleSize = size || limitPart;\n\n const getErrorsCount = () => prepared.reduce((acc, item) => acc + +!!item.error, 0);\n\n const attach = (item: typeof cachePrepared, fileName: string) => {\n const {deferred} = item;\n const _errorHandler = errorHandler.bind(null, item);\n\n deferred.cancel = () => deferred.reject(makeError('DOWNLOAD_CANCELED'));\n deferred.catch((error) => {\n _errorHandler(error);\n item.writer?.truncate?.();\n }).finally(() => {\n if(this.downloadPromises[fileName] === deferred) {\n delete this.downloadPromises[fileName];\n }\n\n delete item.writer;\n // indexOfAndSplice(prepared, item);\n });\n\n this.downloadPromises[fileName] = deferred;\n\n prepared.push(item);\n };\n\n if(cacheStorage && (!downloadStorage || possibleSize <= MAX_FILE_SAVE_SIZE)) {\n cachePrepared = cacheStorage.prepareWriting(cacheFileName, possibleSize, options.mimeType)\n attach(cachePrepared, cacheFileName);\n }\n\n if(downloadStorage) {\n let downloadFileName = options.fileName; // it's doc file_name\n if(!downloadFileName) {\n downloadFileName = cacheFileName;\n const ext = MIME_TYPE_EXTENSION_MAP[options.mimeType];\n if(ext) {\n downloadFileName += '.' + ext;\n }\n }\n\n downloadPrepared = downloadStorage.prepareWriting({\n fileName: downloadFileName,\n downloadId,\n size: possibleSize\n });\n attach(downloadPrepared, fileName);\n\n if(cachePrepared) { // cancel cache too\n downloadPrepared.deferred.catch((err) => cachePrepared.deferred.reject(err));\n }\n\n // this.downloadToDiscPromises[cacheFileName] = deferred;\n // deferred.catch(noop).finally(() => {\n // if(this.downloadToDiscPromises[cacheFileName] === deferred) {\n // delete this.downloadToDiscPromises[cacheFileName];\n // }\n // });\n }\n\n deferred = downloadPrepared?.deferred ?? cachePrepared.deferred;\n\n if(downloadStorage && process) { // then have to load file again\n getFile = downloadStorage.getFile.bind(downloadStorage);\n }\n\n getFile(cacheFileName).then(async(blob: Blob) => {\n checkCancel();\n\n // if(blob.size < size) {\n // if(!options.onlyCache) {\n // await this.delete(cacheFileName);\n // checkCancel();\n // }\n\n // throw makeError('NO_ENTRY_FOUND');\n // }\n\n if(downloadPrepared) {\n const writer = downloadPrepared.writer = downloadPrepared.getWriter();\n checkCancel();\n\n const arr = await readBlobAsUint8Array(blob);\n checkCancel();\n await writer.write(arr);\n checkCancel();\n\n downloadPrepared.deferred.resolve(await writer.finalize());\n }\n\n if(cachePrepared) {\n cachePrepared.deferred.resolve(blob);\n }\n }).catch(async(err: ApiError) => {\n if(options.onlyCache) {\n errorHandler(null, err);\n return;\n }\n\n prepared.forEach((p) => {\n p.writer = p.getWriter();\n });\n\n const maxRequests = Infinity;\n\n const requestPart = (isWebFile ? this.requestWebFilePart : this.requestFilePart).bind(this);\n\n if(isWebFile && this.webFileDcId === undefined && !isLocalWebFile) {\n await this.apiManager.getConfig();\n checkCancel();\n }\n\n const delayed = this.allocateDeferredPromises(0, size, limitPart);\n\n const progress: Progress = {done: 0, offset: 0, total: size, fileName};\n const dispatchProgress = () => {\n try {\n checkCancel();\n progress.done = done;\n this.rootScope.dispatchEvent('download_progress', progress);\n } catch(err) {}\n };\n\n const throttledDispatchProgress = throttle(dispatchProgress, 50, true);\n\n let done = 0;\n const superpuper = async() => {\n const {offset, writePromise, writeDeferred} = delayed.shift();\n try {\n checkCancel();\n\n const requestPerf = performance.now();\n const result = await requestPart(dcId, location as any, offset, limitPart, id, options.queueId, checkCancel);\n const requestTime = performance.now() - requestPerf;\n\n const bytes = result.bytes;\n\n if(delayed.length) {\n superpuper();\n }\n\n const byteLength = bytes.byteLength;\n this.debug && this.log('downloadFile requestFilePart result:', fileName, result);\n const isFinal = (offset + limitPart) >= size || !byteLength;\n if(byteLength) {\n done += byteLength;\n\n if(isFinal) {\n dispatchProgress();\n } else {\n throttledDispatchProgress();\n }\n\n const writeQueuePerf = performance.now();\n await writePromise;\n checkCancel();\n const writeQueueTime = performance.now() - writeQueuePerf;\n\n const perf = performance.now();\n await Promise.all(prepared.map(({writer}) => writer?.write(bytes, offset)));\n checkCancel();\n // downloadId && this.log('write time', performance.now() - perf, 'request time', requestTime, 'queue time', writeQueueTime);\n }\n\n if(isFinal) {\n if(!size || done < size) {\n prepared.forEach(({writer}) => writer?.trim?.(done));\n }\n }\n\n if(isFinal && process) {\n const promises = prepared\n .filter(({writer}) => writer?.getParts && writer.replaceParts)\n .map(async({writer}) => {\n const bytes = writer.getParts();\n const processedResult = await process(bytes, cacheFileName);\n writer.replaceParts(processedResult);\n });\n\n await Promise.all(promises);\n checkCancel();\n }\n\n writeDeferred.resolve();\n\n if(isFinal) {\n const saveToStorage = done <= MAX_FILE_SAVE_SIZE;\n prepared.forEach((item) => {\n const {deferred, writer} = item;\n if(deferred.isFulfilled || deferred.isRejected || !writer) {\n return;\n }\n\n const result = writer.finalize(saveToStorage);\n deferred.resolve(result);\n });\n }\n } catch(err) {\n errorHandler(null, err as ApiError);\n }\n };\n\n for(let i = 0, length = Math.min(maxRequests, delayed.length); i < length; ++i) {\n superpuper();\n }\n }).catch(noop);\n\n const checkCancel = () => {\n if(getErrorsCount() === prepared.length) {\n throw prepared[0].error;\n }\n };\n\n return deferred;\n }\n\n public downloadMedia(options: DownloadMediaOptions): DownloadPromise {\n let {media, thumb} = options;\n const isPhoto = media._ === 'photo';\n if(isPhoto && !thumb) {\n return Promise.reject('preloadPhoto photoEmpty!');\n }\n\n // get original instance with correct file_reference instead of using copies\n const isDocument = media._ === 'document';\n // const isWebDocument = media._ === 'webDocument';\n if(isDocument) media = this.appDocsManager.getDoc((media as Document.document).id);\n else if(isPhoto) media = this.appPhotosManager.getPhoto((media as Photo.photo).id);\n\n const {fileName, downloadOptions} = getDownloadMediaDetails(options);\n\n let promise = this.getDownload(fileName);\n if(!promise) {\n promise = this.download(downloadOptions);\n\n if(isDocument && !thumb) {\n this.rootScope.dispatchEvent('document_downloading', (media as Document.document).id);\n promise.then(() => {\n this.rootScope.dispatchEvent('document_downloaded', (media as Document.document).id);\n }).catch(noop);\n }\n }\n\n return promise;\n }\n\n public downloadMediaURL(options: DownloadMediaOptions): Promise {\n const {media, thumb} = options;\n\n let cacheContext = this.thumbsStorage.getCacheContext(media as any, thumb?.type);\n if((thumb ? (cacheContext.downloaded >= ('size' in thumb ? thumb.size : 0)) : true) && cacheContext.url) {\n return Promise.resolve(cacheContext.url);\n }\n\n return this.downloadMedia(options).then((blob) => {\n if(!cacheContext.downloaded || cacheContext.downloaded < blob.size) {\n const url = URL.createObjectURL(blob);\n cacheContext = this.thumbsStorage.setCacheContextURL(media as any, cacheContext.type, url, blob.size);\n }\n\n return cacheContext.url;\n });\n }\n\n public downloadMediaVoid(options: DownloadMediaOptions) {\n return this.downloadMedia(options).then(noop);\n }\n\n private delete(fileName: string) {\n delete this.downloadPromises[fileName];\n return this.getFileStorage().delete(fileName);\n }\n\n public upload({file, fileName}: {file: Blob | File, fileName?: string}) {\n fileName ||= getFileNameForUpload(file);\n\n const fileSize = file.size;\n const isBigFile = fileSize >= 10485760;\n const partSize = this.getLimitPart(fileSize, true);\n const activeDelta = this.getDelta(partSize);\n const totalParts = Math.ceil(fileSize / partSize);\n const fileId = randomLong();\n const resultInputFile: InputFile = {\n _: isBigFile ? 'inputFileBig' : 'inputFile',\n id: fileId as any,\n parts: totalParts,\n name: fileName,\n md5_checksum: ''\n };\n\n const deferred = deferredPromise();\n if(totalParts > this.maxUploadParts) {\n deferred.reject(makeError('FILE_TOO_BIG'));\n return deferred;\n }\n\n let canceled = false, resolved = false;\n let errorHandler = (error: ApiError) => {\n if(error?.type !== 'UPLOAD_CANCELED') {\n this.log.error('Up Error', error);\n }\n\n deferred.reject(error);\n canceled = true;\n errorHandler = noop;\n };\n\n const method = isBigFile ? 'upload.saveBigFilePart' : 'upload.saveFilePart';\n const id = this.tempId++;\n\n const self = this;\n function* generator() {\n let _part = 0, doneParts = 0;\n for(let offset = 0; offset < fileSize; offset += partSize) {\n const part = _part++; // 0, 1\n yield self.downloadRequest('upload', id, async() => {\n checkCancel();\n\n const blob = file.slice(offset, offset + partSize);\n const buffer = await readBlobAsArrayBuffer(blob);\n checkCancel();\n\n self.debug && self.log('Upload file part, isBig:', isBigFile, part, buffer.byteLength, new Uint8Array(buffer).length, new Uint8Array(buffer).slice().length);\n\n return self.apiManager.invokeApi(method, {\n file_id: fileId,\n file_part: part,\n file_total_parts: totalParts,\n bytes: buffer\n } as any, {\n fileUpload: true\n }).then(() => {\n if(canceled) {\n return;\n }\n\n ++doneParts;\n const progress: Progress = {done: doneParts * partSize, offset, total: fileSize, fileName};\n deferred.notify(progress);\n\n if(doneParts >= totalParts) {\n deferred.resolve(resultInputFile);\n resolved = true;\n }\n }, errorHandler);\n }, activeDelta).catch(errorHandler);\n }\n }\n\n const it = generator();\n const process = () => {\n if(canceled) return;\n const r = it.next();\n if(r.done || canceled) return;\n (r.value as Promise).then(process);\n };\n\n const maxRequests = Infinity;\n for(let i = 0, length = Math.min(maxRequests, totalParts); i < length; ++i) {\n process();\n }\n\n const checkCancel = () => {\n if(canceled) {\n throw makeError('UPLOAD_CANCELED');\n }\n };\n\n deferred.cancel = () => {\n if(!canceled && !resolved) {\n canceled = true;\n errorHandler(makeError('UPLOAD_CANCELED'));\n }\n };\n\n deferred.notify = (progress: Progress) => {\n this.rootScope.dispatchEvent('download_progress', progress);\n };\n\n deferred.finally(() => {\n if(this.uploadPromises[fileName] === deferred) {\n delete this.uploadPromises[fileName];\n }\n });\n\n return this.uploadPromises[fileName] = deferred;\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 fixFirefoxSvg(text: string) {\n const svgIndex = text.indexOf('/, ` width=\"${width}\" height=\"${height}\">`).replace(/[^\\x00-\\x7F]/g, '');\n return text;\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 readBlobAsArrayBuffer from './readBlobAsArrayBuffer';\n\nexport default function readBlobAsUint8Array(blob: Blob) {\n return readBlobAsArrayBuffer(blob).then((buffer) => new Uint8Array(buffer));\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 callbackify from '../../helpers/callbackify';\nimport {ignoreRestrictionReasons} from '../../helpers/restrictions';\nimport {Config, MethodDeclMap, User} from '../../layer';\nimport {InvokeApiOptions} from '../../types';\nimport {AppManager} from '../appManagers/manager';\nimport {MTAppConfig} from './appConfig';\nimport {UserAuth} from './mtproto_config';\nimport {MTMessage} from './networker';\n\ntype HashResult = {\n hash: number,\n result: any\n};\n\ntype HashOptions = {\n [queryJSON: string]: HashResult\n};\n\nexport type ApiLimitType = 'pin' | 'folderPin' | 'folders' |\n 'favedStickers' | 'reactions' | 'bio' | 'topicPin' | 'caption';\n\nexport default abstract class ApiManagerMethods extends AppManager {\n private afterMessageIdTemp: number;\n private hashes: {[method: string]: HashOptions} = {};\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 protected config: Config;\n protected appConfig: MTAppConfig;\n\n constructor() {\n super();\n this.afterMessageIdTemp = 0;\n }\n\n abstract setUserAuth(userAuth: UserAuth | UserId): Promise;\n\n public setUser(user: User) {\n // appUsersManager.saveApiUser(user);\n return this.setUserAuth(user.id);\n }\n\n abstract invokeApi(method: T, params?: MethodDeclMap[T]['req'], options?: InvokeApiOptions): Promise;\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 overwrite?: boolean\n }) {\n // @ts-ignore\n o.params ??= {};\n o.options ??= {};\n // console.log('will invokeApi:', method, params, options);\n\n const {params, options, method, overwrite} = 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 if(overwrite) {\n delete this.hashes[method][queryJSON];\n cached = undefined;\n } else {\n (params as any).hash = cached.hash;\n }\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 cached = this.hashes[method][queryJSON] = {\n hash,\n result\n };\n }\n\n if(o.processResult) {\n const newResult = o.processResult(result);\n return cached ? cached.result = newResult : newResult;\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, overwrite?: boolean}\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 getNewPromise = () => {\n const promise = map.get(cacheKey);\n return promise === p ? undefined : promise;\n }\n\n const originalPromise = this.invokeApi(method, params, options);\n const newPromise: Promise> = originalPromise.then((result) => {\n return getNewPromise() || processResult(result);\n }, (error) => {\n const promise = getNewPromise();\n if(promise) {\n return promise;\n }\n\n if(!processError) {\n throw error;\n }\n\n return processError(error);\n });\n\n const p = newPromise.finally(() => {\n if(map.get(cacheKey) !== p) {\n return;\n }\n\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 = ctx.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 public getConfig(overwrite?: boolean) {\n if(this.config && !overwrite) {\n return this.config;\n }\n\n return this.invokeApiSingleProcess({\n method: 'help.getConfig',\n params: {},\n processResult: (config) => {\n this.config = config;\n this.rootScope.dispatchEvent('config', config);\n return config;\n },\n options: {overwrite}\n });\n }\n\n public getAppConfig(overwrite?: boolean) {\n if(this.appConfig && !overwrite) {\n return this.appConfig;\n }\n\n return this.invokeApiSingleProcess({\n method: 'help.getAppConfig',\n params: {},\n processResult: (config: MTAppConfig) => {\n this.appConfig = config;\n ignoreRestrictionReasons(config.ignore_restriction_reasons ?? []);\n this.rootScope.dispatchEvent('app_config', config);\n return config;\n },\n options: {overwrite}\n });\n }\n\n public getLimit(type: ApiLimitType, isPremium?: boolean) {\n return callbackify(this.getAppConfig(), (appConfig) => {\n const map: {[type in ApiLimitType]: [keyof MTAppConfig, keyof MTAppConfig] | keyof MTAppConfig} = {\n pin: ['dialogs_pinned_limit_default', 'dialogs_pinned_limit_premium'],\n folderPin: ['dialogs_folder_pinned_limit_default', 'dialogs_folder_pinned_limit_premium'],\n folders: ['dialog_filters_limit_default', 'dialog_filters_limit_premium'],\n favedStickers: ['stickers_faved_limit_default', 'stickers_faved_limit_premium'],\n reactions: ['reactions_user_max_default', 'reactions_user_max_premium'],\n bio: ['about_length_limit_default', 'about_length_limit_premium'],\n topicPin: 'topics_pinned_limit',\n caption: ['caption_length_limit_default', 'caption_length_limit_premium']\n };\n\n isPremium ??= this.rootScope.premium;\n\n const a = map[type];\n const key = Array.isArray(a) ? a[isPremium ? 1 : 0] : a;\n return appConfig[key] as number;\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/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n \nimport transportController from './transports/controller';\nimport MTTransport from './transports/transport';\n \n\nimport type {UserAuth} from './mtproto_config';\nimport type {DcAuthKey, DcId, DcServerSalt, InvokeApiOptions} from '../../types';\nimport type {MethodDeclMap} from '../../layer';\nimport type TcpObfuscated from './transports/tcpObfuscated';\nimport sessionStorage from '../sessionStorage';\nimport MTPNetworker, {MTMessage} from './networker';\nimport {ConnectionType, constructTelegramWebSocketUrl, DcConfigurator, TransportType} from './dcConfigurator';\nimport {logger} from '../logger';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport App from '../../config/app';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {IDB} from '../files/idb';\nimport CryptoWorker from '../crypto/cryptoMessagePort';\nimport ctx from '../../environment/ctx';\nimport noop from '../../helpers/noop';\nimport Modes from '../../config/modes';\nimport bytesFromHex from '../../helpers/bytes/bytesFromHex';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport isObject from '../../helpers/object/isObject';\nimport pause from '../../helpers/schedulers/pause';\nimport ApiManagerMethods from './api_methods';\nimport {getEnvironment} from '../../environment/utils';\nimport toggleStorages from '../../helpers/toggleStorages';\n\n/* class RotatableArray {\n public array: Array = [];\n private lastIndex = -1;\n\n public get() {\n this.lastIndex = clamp(this.lastIndex + 1, 0, this.array.length - 1);\n return this.array[this.lastIndex];\n }\n} */\n\nconst PREMIUM_FILE_NETWORKERS_COUNT = 6;\nconst REGULAR_FILE_NETWORKERS_COUNT = 3;\n\nexport class ApiManager extends ApiManagerMethods {\n private cachedNetworkers: {\n [transportType in TransportType]: {\n [connectionType in ConnectionType]: {\n [dcId: DcId]: MTPNetworker[]\n }\n }\n };\n\n private cachedExportPromise: {[x: number]: Promise};\n private gettingNetworkers: {[dcIdAndType: string]: Promise};\n private baseDcId: DcId;\n\n // public telegramMeNotified = false;\n\n private log: ReturnType;\n\n private afterMessageTempIds: {\n [tempId: string]: {\n messageId: string,\n promise: Promise\n }\n };\n\n private transportType: TransportType;\n\n private updatesProcessor: (obj: any) => void;\n\n private loggingOut: boolean;\n\n constructor() {\n super();\n this.log = logger('API');\n\n this.cachedNetworkers = {} as any;\n this.cachedExportPromise = {};\n this.gettingNetworkers = {};\n this.baseDcId = 0;\n this.afterMessageTempIds = {};\n\n this.transportType = Modes.transport;\n\n \n transportController.addEventListener('transport', (transportType) => {\n this.changeTransportType(transportType);\n });\n \n\n // * Make sure that the used autologin_token is no more than 10000 seconds old\n // * https://core.telegram.org/api/url-authorization\n const REFRESH_APP_CONFIG_INTERVAL = (10000 - 30) * 1000;\n setInterval(() => {\n this.getAppConfig(true);\n }, REFRESH_APP_CONFIG_INTERVAL);\n }\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateConfig: () => {\n this.getConfig(true);\n this.getAppConfig(true);\n }\n });\n\n this.rootScope.addEventListener('user_auth', () => {\n if(this.config) { // refresh configs if had a config during authorization\n this.apiUpdatesManager.processLocalUpdate({_: 'updateConfig'});\n }\n });\n\n this.rootScope.addEventListener('premium_toggle', (isPremium) => {\n this.iterateNetworkers(({networker, connectionType, dcId, transportType}) => {\n if(connectionType === 'client' || transportType !== 'websocket') {\n return;\n }\n\n const transport = networker.transport;\n if(!transport) {\n this.log.error('wow what, no transport?', networker);\n return;\n }\n\n if((transport as TcpObfuscated).connection) {\n const url = constructTelegramWebSocketUrl(dcId, connectionType, isPremium);\n (transport as TcpObfuscated).changeUrl(url);\n }\n });\n });\n }\n\n // private lol = false;\n\n // constructor() {\n // MtpSingleInstanceService.start();\n\n /* AppStorage.get('dc').then((dcId) => {\n if(dcId) {\n this.baseDcId = dcId;\n }\n }); */\n // }\n\n /* public telegramMeNotify(newValue: boolean) {\n if(this.telegramMeNotified !== newValue) {\n this.telegramMeNotified = newValue;\n //telegramMeWebService.setAuthorized(this.telegramMeNotified);\n }\n } */\n\n private getTransportType(connectionType: ConnectionType) {\n \n \n \n \n \n // @ts-ignore\n const transportType: TransportType = this.transportType;\n \n\n return transportType;\n }\n\n private iterateNetworkers(callback: (o: {networker: MTPNetworker, dcId: DcId, connectionType: ConnectionType, transportType: TransportType, index: number, array: MTPNetworker[]}) => void) {\n for(const transportType in this.cachedNetworkers) {\n const connections = this.cachedNetworkers[transportType as TransportType];\n for(const connectionType in connections) {\n const dcs = connections[connectionType as ConnectionType];\n for(const dcId in dcs) {\n const networkers = dcs[dcId as any as DcId];\n networkers.forEach((networker, idx, arr) => {\n callback({\n networker,\n dcId: +dcId as DcId,\n connectionType: connectionType as ConnectionType,\n transportType: transportType as TransportType,\n index: idx,\n array: arr\n });\n });\n }\n }\n }\n }\n\n private chooseServer(dcId: DcId, connectionType: ConnectionType, transportType: TransportType) {\n return this.dcConfigurator.chooseServer(dcId, connectionType, transportType, connectionType === 'client', this.rootScope.premium);\n }\n\n public changeTransportType(transportType: TransportType) {\n const oldTransportType = this.transportType;\n if(oldTransportType === transportType) {\n return;\n }\n\n this.log('changing transport from', oldTransportType, 'to', transportType);\n\n const oldObject = this.cachedNetworkers[oldTransportType];\n const newObject = this.cachedNetworkers[transportType];\n this.cachedNetworkers[transportType] = oldObject;\n this.cachedNetworkers[oldTransportType] = newObject;\n\n this.transportType = transportType;\n\n for(const oldGetKey in this.gettingNetworkers) {\n const promise = this.gettingNetworkers[oldGetKey];\n delete this.gettingNetworkers[oldGetKey];\n\n const newGetKey = oldGetKey.replace(oldTransportType, transportType);\n this.gettingNetworkers[newGetKey] = promise;\n\n this.log('changed networker getKey from', oldGetKey, 'to', newGetKey)\n }\n\n this.iterateNetworkers((info) => {\n const transportType = this.getTransportType(info.connectionType);\n const transport = this.chooseServer(info.dcId, info.connectionType, transportType);\n this.changeNetworkerTransport(info.networker, transport);\n });\n }\n\n public async getBaseDcId() {\n if(this.baseDcId) {\n return this.baseDcId;\n }\n\n const baseDcId = await sessionStorage.get('dc');\n if(!this.baseDcId) {\n if(!baseDcId) {\n this.setBaseDcId(App.baseDcId);\n } else {\n this.baseDcId = baseDcId;\n }\n }\n\n return this.baseDcId;\n }\n\n public async 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 this.rootScope.dispatchEvent('user_auth', userAuth);\n\n if(!userAuth.dcID) {\n const baseDcId = await this.getBaseDcId();\n userAuth.dcID = baseDcId;\n }\n\n sessionStorage.set({\n user_auth: userAuth\n });\n\n // this.telegramMeNotify(true);\n }\n\n public setBaseDcId(dcId: DcId) {\n const wasDcId = this.baseDcId;\n if(wasDcId) { // if migrated set ondrain\n this.getNetworker(wasDcId).then((networker) => {\n this.setOnDrainIfNeeded(networker);\n });\n }\n\n this.baseDcId = dcId;\n\n sessionStorage.set({\n dc: this.baseDcId\n });\n }\n\n public async logOut() {\n if(this.loggingOut) {\n return;\n }\n\n this.loggingOut = true;\n const storageKeys: Array = [];\n\n const prefix = 'dc';\n for(let dcId = 1; dcId <= 5; dcId++) {\n storageKeys.push(prefix + dcId + '_auth_key' as any);\n }\n\n // WebPushApiManager.forceUnsubscribe(); // WARNING // moved to worker's master\n const storageResult = await Promise.all(storageKeys.map((key) => sessionStorage.get(key)));\n\n const logoutPromises: Promise[] = [];\n for(let i = 0; i < storageResult.length; i++) {\n if(storageResult[i]) {\n logoutPromises.push(this.invokeApi('auth.logOut', {}, {dcId: (i + 1) as DcId, ignoreErrors: true}));\n }\n }\n\n const clear = async() => {\n this.baseDcId = undefined;\n // this.telegramMeNotify(false);\n await toggleStorages(false, true);\n IDB.closeDatabases();\n this.rootScope.dispatchEvent('logging_out');\n };\n\n setTimeout(clear, 1e3);\n\n // return;\n\n return Promise.all(logoutPromises).catch((error) => {\n error.handled = true;\n }).finally(clear)/* .then(() => {\n location.pathname = '/';\n }) */;\n }\n\n private generateNetworkerGetKey(dcId: DcId, transportType: TransportType, connectionType: ConnectionType) {\n return [dcId, transportType, connectionType].join('-');\n }\n\n public getNetworker(dcId: DcId, options: InvokeApiOptions = {}): Promise {\n const connectionType: ConnectionType = options.fileDownload ? 'download' : (options.fileUpload ? 'upload' : 'client');\n // const connectionType: ConnectionType = 'client';\n\n const transportType = this.getTransportType(connectionType);\n if(!this.cachedNetworkers[transportType]) {\n this.cachedNetworkers[transportType] = {\n client: {},\n download: {},\n upload: {}\n };\n }\n\n const cache = this.cachedNetworkers[transportType][connectionType];\n if(!(dcId in cache)) {\n cache[dcId] = [];\n }\n\n const networkers = cache[dcId];\n // @ts-ignore\n const maxNetworkers = connectionType === 'client' || transportType === 'https' ? 1 : (this.rootScope.premium ? PREMIUM_FILE_NETWORKERS_COUNT : REGULAR_FILE_NETWORKERS_COUNT);\n if(networkers.length >= maxNetworkers) {\n let i = maxNetworkers - 1, found = false;\n for(; i >= 0; --i) {\n if(networkers[i].isOnline) {\n found = true;\n break;\n }\n }\n\n const networker = networkers.splice(found ? i : maxNetworkers - 1, 1)[0];\n networkers.unshift(networker);\n return Promise.resolve(networker);\n }\n\n let getKey = this.generateNetworkerGetKey(dcId, transportType, connectionType);\n if(this.gettingNetworkers[getKey]) {\n return this.gettingNetworkers[getKey];\n }\n\n const ak: DcAuthKey = `dc${dcId}_auth_key` as any;\n const ss: DcServerSalt = `dc${dcId}_server_salt` as any;\n\n let transport = this.chooseServer(dcId, connectionType, transportType);\n return this.gettingNetworkers[getKey] = Promise.all([ak, ss].map((key) => sessionStorage.get(key)))\n .then(async([authKeyHex, serverSaltHex]) => {\n let networker: MTPNetworker, error: any;\n if(authKeyHex && authKeyHex.length === 512) {\n if(!serverSaltHex || serverSaltHex.length !== 16) {\n serverSaltHex = 'AAAAAAAAAAAAAAAA';\n }\n\n const authKey = bytesFromHex(authKeyHex);\n const authKeyId = (await CryptoWorker.invokeCrypto('sha1', authKey)).slice(-8);\n const serverSalt = bytesFromHex(serverSaltHex);\n\n networker = this.networkerFactory.getNetworker(dcId, authKey, authKeyId, serverSalt, options);\n } else {\n try { // if no saved state\n const auth = await this.authorizer.auth(dcId);\n\n sessionStorage.set({\n [ak]: bytesToHex(auth.authKey),\n [ss]: bytesToHex(auth.serverSalt)\n });\n\n networker = this.networkerFactory.getNetworker(dcId, auth.authKey, auth.authKeyId, auth.serverSalt, options);\n } catch(_error) {\n error = _error;\n }\n }\n\n // ! cannot get it before this promise because simultaneous changeTransport will change nothing\n const newTransportType = this.getTransportType(connectionType);\n if(newTransportType !== transportType) {\n getKey = this.generateNetworkerGetKey(dcId, newTransportType, connectionType);\n transport.destroy();\n DcConfigurator.removeTransport(this.dcConfigurator.chosenServers, transport);\n\n if(networker) {\n transport = this.chooseServer(dcId, connectionType, newTransportType);\n }\n\n this.log('transport has been changed during authorization from', transportType, 'to', newTransportType);\n }\n\n /* networker.onConnectionStatusChange = (online) => {\n console.log('status:', online);\n }; */\n\n delete this.gettingNetworkers[getKey];\n\n if(error) {\n this.log('get networker error', error, (error as Error).stack);\n throw error;\n }\n\n this.changeNetworkerTransport(networker, transport);\n networkers.unshift(networker);\n this.setOnDrainIfNeeded(networker);\n return networker;\n });\n }\n\n public getNetworkerVoid(dcId: DcId) {\n return this.getNetworker(dcId).then(noop, noop);\n }\n\n private changeNetworkerTransport(networker: MTPNetworker, transport?: MTTransport) {\n const oldTransport = networker.transport;\n if(oldTransport) {\n DcConfigurator.removeTransport(this.dcConfigurator.chosenServers, oldTransport);\n }\n\n networker.changeTransport(transport);\n }\n\n private onNetworkerDrain(networker: MTPNetworker) {\n this.log('networker drain', networker.dcId);\n networker.onDrain = undefined;\n this.changeNetworkerTransport(networker);\n networker.destroy();\n this.networkerFactory.removeNetworker(networker);\n DcConfigurator.removeTransport(this.cachedNetworkers, networker);\n }\n\n public setOnDrainIfNeeded(networker: MTPNetworker) {\n if(networker.onDrain) {\n return;\n }\n\n const checkPromise: Promise = networker.isFileNetworker ?\n Promise.resolve(true) :\n this.getBaseDcId().then((baseDcId) => networker.dcId !== baseDcId);\n checkPromise.then((canRelease) => {\n if(networker.onDrain) {\n return;\n }\n\n if(canRelease) {\n networker.onDrain = () => this.onNetworkerDrain(networker);\n networker.setDrainTimeout();\n }\n });\n }\n\n public setUpdatesProcessor(callback: (obj: any) => void) {\n this.updatesProcessor = callback;\n this.networkerFactory.setUpdatesProcessor(callback);\n }\n\n public invokeApi(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): CancellablePromise {\n // /////this.log('Invoke api', method, params, options);\n\n /* if(!this.lol) {\n networkerFactory.updatesProcessor({_: 'new_session_created'}, true);\n this.lol = true;\n } */\n\n const deferred = deferredPromise();\n\n let {afterMessageId, prepareTempMessageId} = options;\n if(prepareTempMessageId) {\n deferred.then(() => {\n delete this.afterMessageTempIds[prepareTempMessageId];\n });\n }\n\n if(MOUNT_CLASS_TO) {\n const startTime = Date.now();\n const interval = ctx.setInterval(() => {\n if(!cachedNetworker || !cachedNetworker.isStopped()) {\n this.log.error('Request is still processing:', method, params, options, 'time:', (Date.now() - startTime) / 1000);\n }\n // this.cachedUploadNetworkers[2].requestMessageStatus();\n }, 5e3);\n\n deferred.catch(noop).finally(() => {\n clearInterval(interval);\n });\n }\n\n const rejectPromise = async(error: ApiError) => {\n if(!error) {\n error = {type: 'ERROR_EMPTY'};\n } else if(!isObject(error)) {\n error = {message: error};\n }\n\n if((error.code === 401 && error.type === 'SESSION_REVOKED') ||\n (error.code === 406 && error.type === 'AUTH_KEY_DUPLICATED')) {\n this.logOut();\n }\n\n if(options.ignoreErrors) {\n throw error;\n }\n\n if(error.code === 406) {\n error.handled = true;\n }\n\n if(!options.noErrorBox) {\n error.input = method;\n error.stack = stack || (error.originalError && error.originalError.stack) || error.stack || (new Error()).stack;\n setTimeout(() => {\n if(!error.handled) {\n if(error.code === 401) {\n this.logOut();\n } else {\n // ErrorService.show({error: error}); // WARNING\n }\n\n error.handled = true;\n }\n }, 100);\n }\n\n throw error;\n };\n\n let dcId: DcId;\n\n let cachedNetworker: MTPNetworker;\n const stack = (new Error()).stack || 'empty stack';\n const performRequest = (): Promise => {\n if(afterMessageId) {\n const after = this.afterMessageTempIds[afterMessageId];\n if(after) {\n options.afterMessageId = after.messageId;\n }\n }\n\n const promise = cachedNetworker.wrapApiCall(method, params, options);\n\n if(prepareTempMessageId) {\n this.afterMessageTempIds[prepareTempMessageId] = {\n messageId: (options as MTMessage).messageId,\n promise: deferred\n };\n }\n\n return promise.catch((error: ApiError) => {\n // if(!options.ignoreErrors) {\n if(error.type !== 'FILE_REFERENCE_EXPIRED'/* && error.type !== 'MSG_WAIT_FAILED' */) {\n this.log.error('Error', error.code, error.type, this.baseDcId, dcId, method, params);\n }\n\n if(error.code === 401 && this.baseDcId === dcId) {\n if(error.type !== 'SESSION_PASSWORD_NEEDED') {\n sessionStorage.delete('dc')\n sessionStorage.delete('user_auth'); // ! ะฒะพะทะผะพะถะฝะพ ั‚ัƒั‚ ะฒะพะพะฑั‰ะต ะฝะต ะฝัƒะถะฝะพ ัั‚ะพ ะดะตะปะฐั‚ัŒ, ะฝะพ ะฝัƒะถะฝะพ ะฟั€ะพะฒะตั€ะธั‚ัŒ ัะปัƒั‡ะฐะน ั USER_DEACTIVATED (https://core.telegram.org/api/errors)\n // this.telegramMeNotify(false);\n }\n\n throw error;\n } else if(error.code === 401 && this.baseDcId && dcId !== this.baseDcId) {\n if(this.cachedExportPromise[dcId] === undefined) {\n const promise = new Promise((exportResolve, exportReject) => {\n this.invokeApi('auth.exportAuthorization', {dc_id: dcId}, {noErrorBox: true}).then((exportedAuth) => {\n this.invokeApi('auth.importAuthorization', {\n id: exportedAuth.id,\n bytes: exportedAuth.bytes\n }, {dcId, noErrorBox: true}).then(exportResolve, exportReject);\n }, exportReject);\n });\n\n this.cachedExportPromise[dcId] = promise;\n }\n\n return this.cachedExportPromise[dcId].then(() => performRequest());\n } else if(error.code === 303) {\n const newDcId = +error.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_)(\\d+)/)[2] as DcId;\n if(newDcId !== dcId) {\n if(options.dcId) {\n options.dcId = newDcId;\n } else {\n this.setBaseDcId(newDcId);\n }\n\n return this.invokeApi(method, params, options);\n }\n } else if(error.code === 400 && error.type.indexOf('FILE_MIGRATE') === 0) {\n const newDcId = +error.type.match(/^(FILE_MIGRATE_)(\\d+)/)[2] as DcId;\n if(newDcId !== dcId) {\n options.dcId = newDcId;\n return this.invokeApi(method, params, options);\n } else {\n throw error;\n }\n } else if(error.code === 400 && error.type === 'CONNECTION_NOT_INITED') {\n this.networkerFactory.unsetConnectionInited();\n return performRequest();\n } else if(!options.rawError && error.code === 420) {\n const waitTime = +error.type.match(/^FLOOD_WAIT_(\\d+)/)[1] || 1;\n\n if(waitTime > (options.floodMaxTimeout ?? 60) && !options.prepareTempMessageId) {\n throw error;\n }\n\n return pause(waitTime/* (waitTime + 5) */ * 1000).then(() => performRequest());\n } else if(!options.rawError && ['MSG_WAIT_FAILED', 'MSG_WAIT_TIMEOUT'].includes(error.type)) {\n const after = this.afterMessageTempIds[afterMessageId];\n\n afterMessageId = undefined;\n delete options.afterMessageId;\n\n if(after) return after.promise.then(() => performRequest());\n else return performRequest();\n } else if(!options.rawError && error.code === 500) {\n const now = Date.now();\n if(options.stopTime) {\n if(now >= options.stopTime) {\n throw error;\n }\n }\n\n options.waitTime = options.waitTime ? Math.min(60, options.waitTime * 1.5) : 1;\n return pause(options.waitTime * 1000).then(() => performRequest());\n } else if(error.type === 'UNKNOWN' || error.type === 'MTPROTO_CLUSTER_INVALID') { // cluster invalid - request from regular user to premium endpoint\n return pause(1000).then(() => performRequest());\n } else {\n throw error;\n }\n });\n }\n\n let p: Promise;\n if(dcId = (options.dcId || this.baseDcId)) {\n p = this.getNetworker(dcId, options);\n } else {\n p = this.getBaseDcId().then((baseDcId) => this.getNetworker(dcId = baseDcId, options));\n }\n\n p.then((networker) => {\n cachedNetworker = networker;\n const promise = performRequest();\n cachedNetworker.attachPromise(deferred, options as MTMessage);\n return promise;\n })\n .then(deferred.resolve)\n .catch(rejectPromise)\n .catch(deferred.reject);\n\n return deferred;\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 applyMixins from '../../helpers/applyMixins';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport {AppManager} from '../appManagers/manager';\n\nexport type StatePeerType = 'recentSearch' | 'topPeer' | 'dialog' | 'contact' | 'topMessage' | 'self';\n\ntype PeersStorageKey = `${StatePeerType}_${string | PeerId}` | StatePeerType;\n\nclass PeersStorage {\n private neededPeers: Map> = new Map();\n private singlePeerMap: Map> = new Map();\n\n constructor() {\n this._constructor(false);\n }\n\n protected after() {\n this.rootScope.addEventListener('user_auth', () => {\n this.requestPeer(this.appPeersManager.peerId, 'self');\n });\n }\n\n public requestPeer(peerId: PeerId, key: PeersStorageKey) {\n let set = this.neededPeers.get(peerId);\n if(set && set.has(key)) {\n return;\n }\n\n if(!set) {\n set = new Set();\n this.neededPeers.set(peerId, set);\n }\n\n set.add(key);\n\n this.dispatchEvent('peerNeeded', peerId);\n }\n\n public releasePeer(peerId: PeerId, key: PeersStorageKey) {\n const set = this.neededPeers.get(peerId);\n if(!set) {\n return;\n }\n\n set.delete(key);\n\n if(!set.size) {\n this.neededPeers.delete(peerId);\n this.dispatchEvent('peerUnneeded', peerId);\n }\n }\n\n public requestPeersForKey(peerIds: Set | number[], key: PeersStorageKey) {\n if(Array.isArray(peerIds)) {\n peerIds = new Set(peerIds);\n }\n\n let set = this.singlePeerMap.get(key);\n if(set) {\n for(const peerId of set) {\n if(peerIds.has(peerId)) {\n continue;\n }\n\n this.releasePeer(peerId, key);\n set.delete(peerId);\n }\n\n if(!set.size && !peerIds.size) {\n this.singlePeerMap.delete(key);\n return;\n }\n }\n\n if(peerIds.size) {\n if(!set) {\n set = new Set();\n this.singlePeerMap.set(key, set);\n }\n\n for(const peerId of peerIds) {\n if(set.has(peerId)) {\n continue;\n }\n\n this.requestPeer(peerId, key);\n set.add(peerId);\n }\n }\n }\n\n public isPeerNeeded(peerId: PeerId) {\n return this.neededPeers.has(peerId);\n }\n}\n\ninterface PeersStorage extends EventListenerBase<{\n peerNeeded: (peerId: PeerId) => void,\n peerUnneeded: (peerId: PeerId) => void,\n}>, AppManager {}\napplyMixins(PeersStorage, [EventListenerBase, AppManager]);\n\nexport default PeersStorage;\n","/*\n * 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 {WebDocument} from '../../layer';\nimport type {MyDocument} from '../appManagers/appDocsManager';\nimport type {MyPhoto} from '../appManagers/appPhotosManager';\nimport {THUMB_TYPE_FULL} from '../mtproto/mtproto_config';\n\nexport type ThumbCache = {\n downloaded: number,\n url: string,\n type: string\n};\n\nexport type ThumbsCache = {\n [key: string]: {\n [size: string]: ThumbCache\n }\n};\n\nconst thumbFullSize = THUMB_TYPE_FULL;\n\nexport type ThumbStorageMedia = MyPhoto | MyDocument | WebDocument;\n\nexport default class ThumbsStorage {\n private thumbsCache: ThumbsCache = {};\n\n private getKey(media: ThumbStorageMedia) {\n return media._ + ((media as MyPhoto).id ?? (media as WebDocument).url);\n }\n\n public getCacheContext(media: ThumbStorageMedia, thumbSize: string = thumbFullSize): ThumbCache {\n /* if(media._ === 'photo' && thumbSize !== 'i') {\n thumbSize = thumbFullSize;\n } */\n\n const cache = this.thumbsCache[this.getKey(media)] ??= {};\n return cache[thumbSize] ??= {downloaded: 0, url: '', type: thumbSize};\n }\n\n public setCacheContextURL(media: ThumbStorageMedia, thumbSize: string = thumbFullSize, url: string, downloaded: number = 0) {\n const cacheContext = this.getCacheContext(media, thumbSize);\n cacheContext.url = url;\n cacheContext.downloaded = downloaded;\n return cacheContext;\n }\n\n public deleteCacheContext(media: ThumbStorageMedia, thumbSize: string = thumbFullSize) {\n const cache = this.thumbsCache[this.getKey(media)];\n if(cache) {\n delete cache[thumbSize];\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 type MTProtoConstructor = {\n id: number,\n predicate: string,\n params: Array<{\n name: string,\n type: string\n }>,\n type: string\n};\n\nexport type MTProtoMethod = {\n id: number,\n method: string,\n params: Array<{\n name: string,\n type: string\n }>,\n type: string\n};\n\n// eslint-disable-next-line quotes, comma-spacing\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\":-1182234929,\"predicate\":\"inputUserEmpty\",\"params\":[],\"type\":\"InputUser\"},{\"id\":-138301121,\"predicate\":\"inputUserSelf\",\"params\":[],\"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\":-1771768449,\"predicate\":\"inputMediaEmpty\",\"params\":[],\"type\":\"InputMedia\"},{\"id\":505969924,\"predicate\":\"inputMediaUploadedPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"spoiler\",\"type\":\"flags.2?true\"},{\"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\":\"spoiler\",\"type\":\"flags.1?true\"},{\"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\":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\":1498486562,\"predicate\":\"peerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":918946202,\"predicate\":\"peerChat\",\"params\":[{\"name\":\"chat_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\":1326562017,\"predicate\":\"userProfilePhotoEmpty\",\"params\":[],\"type\":\"UserProfilePhoto\"},{\"id\":-2100168954,\"predicate\":\"userProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_video\",\"type\":\"flags.0?true\"},{\"name\":\"personal\",\"type\":\"flags.2?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\":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\":\"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\":-908914376,\"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?ChatReactions\"}],\"type\":\"ChatFull\"},{\"id\":-1070776313,\"predicate\":\"chatParticipant\",\"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\":\"spoiler\",\"type\":\"flags.3?true\"},{\"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\":-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\":-712374074,\"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\":\"unread_reactions_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\"},{\"name\":\"ttl_period\",\"type\":\"flags.5?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\":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\":-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\":-551616469,\"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?NotificationSound\"}],\"type\":\"InputPeerNotifySettings\"},{\"id\":-1472527322,\"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\":\"ios_sound\",\"type\":\"flags.3?NotificationSound\"},{\"name\":\"android_sound\",\"type\":\"flags.4?NotificationSound\"},{\"name\":\"other_sound\",\"type\":\"flags.5?NotificationSound\"}],\"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\":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\":-120378643,\"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\":\"voice_messages_forbidden\",\"type\":\"flags.20?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"flags.1?string\"},{\"name\":\"settings\",\"type\":\"PeerSettings\"},{\"name\":\"personal_photo\",\"type\":\"flags.21?Photo\"},{\"name\":\"profile_photo\",\"type\":\"flags.2?Photo\"},{\"name\":\"fallback_photo\",\"type\":\"flags.22?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\"},{\"name\":\"bot_group_admin_rights\",\"type\":\"flags.17?ChatAdminRights\"},{\"name\":\"bot_broadcast_admin_rights\",\"type\":\"flags.18?ChatAdminRights\"},{\"name\":\"premium_gifts\",\"type\":\"flags.19?Vector\"}],\"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\":-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\":1694474197,\"predicate\":\"messages.chats\",\"params\":[{\"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\":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\":-1484486364,\"predicate\":\"updateUserName\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"usernames\",\"type\":\"Vector\"}],\"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\":-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\":-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\":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\":\"this_port_only\",\"type\":\"flags.5?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"ip_address\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"flags.10?bytes\"}],\"type\":\"DcOption\"},{\"id\":589653676,\"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\":\"force_try_ipv6\",\"type\":\"flags.14?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\"},{\"name\":\"reactions_default\",\"type\":\"flags.15?Reaction\"}],\"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\":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\":-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\":-1476358952,\"predicate\":\"encryptedFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"long\"},{\"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\":-182231723,\"predicate\":\"inputEncryptedFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"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\":-95482955,\"predicate\":\"inputFileBig\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"InputFile\"},{\"id\":767652808,\"predicate\":\"inputEncryptedFileBigUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"InputEncryptedFile\"},{\"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\":1530447553,\"predicate\":\"inputMediaUploadedDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"nosound_video\",\"type\":\"flags.3?true\"},{\"name\":\"force_file\",\"type\":\"flags.4?true\"},{\"name\":\"spoiler\",\"type\":\"flags.5?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\":\"spoiler\",\"type\":\"flags.2?true\"},{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"},{\"name\":\"query\",\"type\":\"flags.1?string\"}],\"type\":\"InputMedia\"},{\"id\":-1666158377,\"predicate\":\"messageMediaDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"nopremium\",\"type\":\"flags.3?true\"},{\"name\":\"spoiler\",\"type\":\"flags.4?true\"},{\"name\":\"document\",\"type\":\"flags.0?Document\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.2?int\"}],\"type\":\"MessageMedia\"},{\"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\":-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\":922273905,\"predicate\":\"documentEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Document\"},{\"id\":-1881881384,\"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\":\"long\"},{\"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\":-1094555409,\"predicate\":\"updateNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"NotifyPeer\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"}],\"type\":\"Update\"},{\"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\":-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\":-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\":-496024847,\"predicate\":\"userStatusRecently\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":129960444,\"predicate\":\"userStatusLastWeek\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":2011940674,\"predicate\":\"userStatusLastMonth\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":-298113238,\"predicate\":\"updatePrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"PrivacyKey\"},{\"name\":\"rules\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":1335282456,\"predicate\":\"inputPrivacyKeyStatusTimestamp\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-1137792208,\"predicate\":\"privacyKeyStatusTimestamp\",\"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\":-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\":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\":88680979,\"predicate\":\"updateUserPhone\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"Update\"},{\"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\":-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\":-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\":-2066640507,\"predicate\":\"messages.affectedMessages\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":2139689491,\"predicate\":\"updateWebPage\",\"params\":[{\"name\":\"webpage\",\"type\":\"WebPage\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"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\":-1557277184,\"predicate\":\"messageMediaWebPage\",\"params\":[{\"name\":\"webpage\",\"type\":\"WebPage\"}],\"type\":\"MessageMedia\"},{\"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\":-1787080453,\"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\"},{\"name\":\"login_email_pattern\",\"type\":\"flags.6?string\"}],\"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\":-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\":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\":-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\":51520707,\"predicate\":\"messageActionChatJoinedByLink\",\"params\":[{\"name\":\"inviter_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":1757493555,\"predicate\":\"updateReadMessagesContents\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"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\":768691932,\"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\":\"videos\",\"type\":\"flags.6?true\"},{\"name\":\"emojis\",\"type\":\"flags.7?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\":\"thumb_document_id\",\"type\":\"flags.8?long\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"StickerSet\"},{\"id\":1846886166,\"predicate\":\"messages.stickerSet\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"keywords\",\"type\":\"Vector\"},{\"name\":\"documents\",\"type\":\"Vector\"}],\"type\":\"messages.StickerSet\"},{\"id\":-1885878744,\"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\":\"bot_attach_menu\",\"type\":\"flags.27?true\"},{\"name\":\"premium\",\"type\":\"flags.28?true\"},{\"name\":\"attach_menu_enabled\",\"type\":\"flags.29?true\"},{\"name\":\"flags2\",\"type\":\"#\"},{\"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\"},{\"name\":\"emoji_status\",\"type\":\"flags.30?EmojiStatus\"},{\"name\":\"usernames\",\"type\":\"flags2.0?Vector\"}],\"type\":\"User\"},{\"id\":-1032140601,\"predicate\":\"botCommand\",\"params\":[{\"name\":\"command\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"}],\"type\":\"BotCommand\"},{\"id\":-1892676777,\"predicate\":\"botInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_id\",\"type\":\"flags.0?long\"},{\"name\":\"description\",\"type\":\"flags.1?string\"},{\"name\":\"description_photo\",\"type\":\"flags.4?Photo\"},{\"name\":\"description_document\",\"type\":\"flags.5?Document\"},{\"name\":\"commands\",\"type\":\"flags.2?Vector\"},{\"name\":\"menu_button\",\"type\":\"flags.3?BotMenuButton\"}],\"type\":\"BotInfo\"},{\"id\":-1560655744,\"predicate\":\"keyboardButton\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"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\":\"persistent\",\"type\":\"flags.4?true\"},{\"name\":\"rows\",\"type\":\"Vector\"},{\"name\":\"placeholder\",\"type\":\"flags.3?string\"}],\"type\":\"ReplyMarkup\"},{\"id\":-571955892,\"predicate\":\"inputPeerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-233744186,\"predicate\":\"inputUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputUser\"},{\"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\":-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\":-292807034,\"predicate\":\"inputChannelEmpty\",\"params\":[],\"type\":\"InputChannel\"},{\"id\":-212145112,\"predicate\":\"inputChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputChannel\"},{\"id\":-1566230754,\"predicate\":\"peerChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":666680316,\"predicate\":\"inputPeerChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-2094689180,\"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\":\"join_to_send\",\"type\":\"flags.28?true\"},{\"name\":\"join_request\",\"type\":\"flags.29?true\"},{\"name\":\"forum\",\"type\":\"flags.30?true\"},{\"name\":\"flags2\",\"type\":\"#\"},{\"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\"},{\"name\":\"usernames\",\"type\":\"flags2.0?Vector\"}],\"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\":2131196633,\"predicate\":\"contacts.resolvedPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":-231385849,\"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\":\"flags2\",\"type\":\"#\"},{\"name\":\"can_delete_channel\",\"type\":\"flags2.0?true\"},{\"name\":\"antispam\",\"type\":\"flags2.1?true\"},{\"name\":\"participants_hidden\",\"type\":\"flags2.2?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?ChatReactions\"}],\"type\":\"ChatFull\"},{\"id\":182649427,\"predicate\":\"messageRange\",\"params\":[{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"MessageRange\"},{\"id\":-948520370,\"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\":\"topics\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":-1781355374,\"predicate\":\"messageActionChannelCreate\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"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\":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\":-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\":-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\":-541588713,\"predicate\":\"channels.channelParticipant\",\"params\":[{\"name\":\"participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.ChannelParticipant\"},{\"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\":-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\":-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\":-1328445861,\"predicate\":\"channelParticipantsBots\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"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\":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\":\"emojis\",\"type\":\"flags.1?true\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":834816008,\"predicate\":\"updateStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"emojis\",\"type\":\"flags.1?true\"}],\"type\":\"Update\"},{\"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\":-1821035490,\"predicate\":\"updateSavedGifs\",\"params\":[],\"type\":\"Update\"},{\"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\":-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\":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\":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\":-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\":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\":1358283666,\"predicate\":\"inputMessagesFilterVoice\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":928101534,\"predicate\":\"inputMessagesFilterMusic\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1107622874,\"predicate\":\"inputPrivacyKeyChatInvite\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1343122938,\"predicate\":\"privacyKeyChatInvite\",\"params\":[],\"type\":\"PrivacyKey\"},{\"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\":457133559,\"predicate\":\"updateEditChannelMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1799538451,\"predicate\":\"messageActionPinMessage\",\"params\":[],\"type\":\"MessageAction\"},{\"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\":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\":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\":1218642516,\"predicate\":\"replyInlineMarkup\",\"params\":[{\"name\":\"rows\",\"type\":\"Vector\"}],\"type\":\"ReplyMarkup\"},{\"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\":-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\":649453030,\"predicate\":\"messages.messageEditData\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"caption\",\"type\":\"flags.0?true\"}],\"type\":\"messages.MessageEditData\"},{\"id\":-469536605,\"predicate\":\"updateEditMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"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\":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\":-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\":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\":-1995686519,\"predicate\":\"inputBotInlineMessageID\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputBotInlineMessageID\"},{\"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\":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\":-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\":-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\":975236280,\"predicate\":\"inputMessagesFilterChatPhotos\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1218471511,\"predicate\":\"updateReadChannelOutbox\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":457829485,\"predicate\":\"updateDraftMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"draft\",\"type\":\"DraftMessage\"}],\"type\":\"Update\"},{\"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\":-1615153660,\"predicate\":\"messageActionHistoryClear\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-958657434,\"predicate\":\"messages.featuredStickersNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":-1103615738,\"predicate\":\"messages.featuredStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"premium\",\"type\":\"flags.0?true\"},{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"sets\",\"type\":\"Vector\"},{\"name\":\"unread\",\"type\":\"Vector\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":1461528386,\"predicate\":\"updateReadFeaturedStickers\",\"params\":[],\"type\":\"Update\"},{\"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\":-1706939360,\"predicate\":\"updateRecentStickers\",\"params\":[],\"type\":\"Update\"},{\"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\":-1574314746,\"predicate\":\"updateConfig\",\"params\":[],\"type\":\"Update\"},{\"id\":861169551,\"predicate\":\"updatePtsChanged\",\"params\":[],\"type\":\"Update\"},{\"id\":-440664550,\"predicate\":\"inputMediaPhotoExternal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"spoiler\",\"type\":\"flags.1?true\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":-78455655,\"predicate\":\"inputMediaDocumentExternal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"spoiler\",\"type\":\"flags.1?true\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"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\":-1744710921,\"predicate\":\"documentAttributeHasStickers\",\"params\":[],\"type\":\"DocumentAttribute\"},{\"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\":1336154098,\"predicate\":\"inputBotInlineResultGame\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":1262639204,\"predicate\":\"inputBotInlineMessageGame\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-38694904,\"predicate\":\"messageMediaGame\",\"params\":[{\"name\":\"game\",\"type\":\"Game\"}],\"type\":\"MessageMedia\"},{\"id\":-750828557,\"predicate\":\"inputMediaGame\",\"params\":[{\"name\":\"id\",\"type\":\"InputGame\"}],\"type\":\"InputMedia\"},{\"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\":1358175439,\"predicate\":\"keyboardButtonGame\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-1834538890,\"predicate\":\"messageActionGameScore\",\"params\":[{\"name\":\"game_id\",\"type\":\"long\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"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\":1258196845,\"predicate\":\"updates.differenceTooLong\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"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\":-1663561404,\"predicate\":\"messages.chatsSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"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\":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\":1930545681,\"predicate\":\"webPageNotModified\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"cached_page_views\",\"type\":\"flags.0?int\"}],\"type\":\"WebPage\"},{\"id\":-88417185,\"predicate\":\"inputPrivacyKeyPhoneCall\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1030105979,\"predicate\":\"privacyKeyPhoneCall\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-580219064,\"predicate\":\"sendMessageGamePlayAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"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\":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\":2104790276,\"predicate\":\"dataJSON\",\"params\":[{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"DataJSON\"},{\"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\":-886477832,\"predicate\":\"labeledPrice\",\"params\":[{\"name\":\"label\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"}],\"type\":\"LabeledPrice\"},{\"id\":1048946971,\"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\":\"recurring\",\"type\":\"flags.9?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\"},{\"name\":\"recurring_terms_url\",\"type\":\"flags.9?string\"}],\"type\":\"Invoice\"},{\"id\":-1900697899,\"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\"},{\"name\":\"extended_media\",\"type\":\"flags.2?InputMedia\"}],\"type\":\"InputMedia\"},{\"id\":-368917890,\"predicate\":\"paymentCharge\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"provider_charge_id\",\"type\":\"string\"}],\"type\":\"PaymentCharge\"},{\"id\":-1892568281,\"predicate\":\"messageActionPaymentSentMe\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"recurring_init\",\"type\":\"flags.2?true\"},{\"name\":\"recurring_used\",\"type\":\"flags.3?true\"},{\"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\":-156940077,\"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\"},{\"name\":\"extended_media\",\"type\":\"flags.4?MessageExtendedMedia\"}],\"type\":\"MessageMedia\"},{\"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\":-1344716869,\"predicate\":\"keyboardButtonBuy\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-1776926890,\"predicate\":\"messageActionPaymentSent\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"recurring_init\",\"type\":\"flags.2?true\"},{\"name\":\"recurring_used\",\"type\":\"flags.3?true\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"invoice_slug\",\"type\":\"flags.0?string\"}],\"type\":\"MessageAction\"},{\"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\":-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\":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\":-1610250415,\"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\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.5?WebDocument\"},{\"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\":\"additional_methods\",\"type\":\"flags.6?Vector\"},{\"name\":\"saved_info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"saved_credentials\",\"type\":\"flags.1?Vector\"},{\"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\":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\":-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\":-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\":-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\":-1425052898,\"predicate\":\"updatePhoneCall\",\"params\":[{\"name\":\"phone_call\",\"type\":\"PhoneCall\"}],\"type\":\"Update\"},{\"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\":-1665063993,\"predicate\":\"phoneConnection\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"tcp\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"ipv6\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"peer_tag\",\"type\":\"bytes\"}],\"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\":-2134272152,\"predicate\":\"inputMessagesFilterPhoneCalls\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"missed\",\"type\":\"flags.0?true\"}],\"type\":\"MessagesFilter\"},{\"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\":2054952868,\"predicate\":\"inputMessagesFilterRoundVoice\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1253451181,\"predicate\":\"inputMessagesFilterRoundVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1997373508,\"predicate\":\"sendMessageRecordRoundAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":608050278,\"predicate\":\"sendMessageUploadRoundAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"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\":-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\":-283684427,\"predicate\":\"pageBlockChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"Chat\"}],\"type\":\"PageBlock\"},{\"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\":1180041828,\"predicate\":\"updateLangPackTooLong\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":1442983757,\"predicate\":\"updateLangPack\",\"params\":[{\"name\":\"difference\",\"type\":\"LangPackDifference\"}],\"type\":\"Update\"},{\"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\":338142689,\"predicate\":\"channelParticipantsBanned\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":106343499,\"predicate\":\"channelParticipantsSearch\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"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\":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\"},{\"name\":\"forums\",\"type\":\"flags.17?true\"}],\"type\":\"ChannelAdminLogEventsFilter\"},{\"id\":511092620,\"predicate\":\"topPeerCategoryPhoneCalls\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-2143067670,\"predicate\":\"pageBlockAudio\",\"params\":[{\"name\":\"audio_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":1558266229,\"predicate\":\"popularContact\",\"params\":[{\"name\":\"client_id\",\"type\":\"long\"},{\"name\":\"importers\",\"type\":\"int\"}],\"type\":\"PopularContact\"},{\"id\":1200788123,\"predicate\":\"messageActionScreenshotTaken\",\"params\":[],\"type\":\"MessageAction\"},{\"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\":-451831443,\"predicate\":\"updateFavedStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":-366410403,\"predicate\":\"updateChannelReadMessagesContents\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"messages\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-1040652646,\"predicate\":\"inputMessagesFilterMyMentions\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":1887741886,\"predicate\":\"updateContactsReset\",\"params\":[],\"type\":\"Update\"},{\"id\":-1312568665,\"predicate\":\"channelAdminLogEventActionChangeStickerSet\",\"params\":[{\"name\":\"prev_stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"new_stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-85549226,\"predicate\":\"messageActionCustomAction\",\"params\":[{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":178373535,\"predicate\":\"inputPaymentCredentialsApplePay\",\"params\":[{\"name\":\"payment_data\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":-419271411,\"predicate\":\"inputMessagesFilterGeo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-530392189,\"predicate\":\"inputMessagesFilterContacts\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1304443240,\"predicate\":\"updateChannelAvailableMessages\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"available_min_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1599903217,\"predicate\":\"channelAdminLogEventActionTogglePreHistoryHidden\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"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\":-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\":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\":-266911767,\"predicate\":\"channels.channelParticipantsNotModified\",\"params\":[],\"type\":\"channels.ChannelParticipants\"},{\"id\":1951620897,\"predicate\":\"messages.messagesNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"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\":-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\":-1410748418,\"predicate\":\"messageActionBotAllowed\",\"params\":[{\"name\":\"domain\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-55902537,\"predicate\":\"inputDialogPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"InputDialogPeer\"},{\"id\":-445792507,\"predicate\":\"dialogPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"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\":-207944868,\"predicate\":\"fileHash\",\"params\":[{\"name\":\"offset\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"FileHash\"},{\"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\":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\":-876089816,\"predicate\":\"inputSecureFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":1679398724,\"predicate\":\"secureFileEmpty\",\"params\":[],\"type\":\"SecureFile\"},{\"id\":2097791614,\"predicate\":\"secureFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"long\"},{\"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\":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\":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\":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\":700340377,\"predicate\":\"inputTakeoutFileLocation\",\"params\":[],\"type\":\"InputFileLocation\"},{\"id\":-513517117,\"predicate\":\"updateDialogUnreadMark\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"unread\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"DialogPeer\"}],\"type\":\"Update\"},{\"id\":-253500010,\"predicate\":\"messages.dialogsNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.Dialogs\"},{\"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\":-1255369827,\"predicate\":\"contacts.topPeersDisabled\",\"params\":[],\"type\":\"contacts.TopPeers\"},{\"id\":-1685456582,\"predicate\":\"inputReportReasonCopyright\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-732254058,\"predicate\":\"passwordKdfAlgoUnknown\",\"params\":[],\"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\":982592842,\"predicate\":\"passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow\",\"params\":[{\"name\":\"salt1\",\"type\":\"bytes\"},{\"name\":\"salt2\",\"type\":\"bytes\"},{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"p\",\"type\":\"bytes\"}],\"type\":\"PasswordKdfAlgo\"},{\"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\":-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\":-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\":-1311015810,\"predicate\":\"inputNotifyBroadcasts\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":-703403793,\"predicate\":\"notifyBroadcasts\",\"params\":[],\"type\":\"NotifyPeer\"},{\"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\":504660880,\"predicate\":\"pageBlockKicker\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"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\":-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\":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\":-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\":-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\":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\":-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\":-610373422,\"predicate\":\"inputPrivacyKeyPhoneP2P\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":961092808,\"predicate\":\"privacyKeyPhoneP2P\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":894777186,\"predicate\":\"textAnchor\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"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\":-202219658,\"predicate\":\"messageActionContactSignUp\",\"params\":[],\"type\":\"MessageAction\"},{\"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\":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\":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\":1272375192,\"predicate\":\"messageMediaPoll\",\"params\":[{\"name\":\"poll\",\"type\":\"Poll\"},{\"name\":\"results\",\"type\":\"PollResults\"}],\"type\":\"MessageMedia\"},{\"id\":-264117680,\"predicate\":\"chatOnlines\",\"params\":[{\"name\":\"onlines\",\"type\":\"int\"}],\"type\":\"ChatOnlines\"},{\"id\":1202287072,\"predicate\":\"statsURL\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"StatsURL\"},{\"id\":-525288402,\"predicate\":\"photoStrippedSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"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\"},{\"name\":\"manage_topics\",\"type\":\"flags.13?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\":\"manage_topics\",\"type\":\"flags.18?true\"},{\"name\":\"until_date\",\"type\":\"int\"}],\"type\":\"ChatBannedRights\"},{\"id\":1421875280,\"predicate\":\"updateChatDefaultBannedRights\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"default_banned_rights\",\"type\":\"ChatBannedRights\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"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\":-1150621555,\"predicate\":\"channelParticipantsContacts\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"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\":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\":-1896171181,\"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\":\"long\"},{\"name\":\"file_size_max\",\"type\":\"long\"},{\"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\":-1529000952,\"predicate\":\"inputPrivacyKeyForwards\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1777096355,\"predicate\":\"privacyKeyForwards\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1461304012,\"predicate\":\"inputPrivacyKeyProfilePhoto\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-1777000467,\"predicate\":\"privacyKeyProfilePhoto\",\"params\":[],\"type\":\"PrivacyKey\"},{\"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\":-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\":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\":1684014375,\"predicate\":\"inputDialogPeerFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"InputDialogPeer\"},{\"id\":1363483106,\"predicate\":\"dialogPeerFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"DialogPeer\"},{\"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\":422972864,\"predicate\":\"updateFolderPeers\",\"params\":[{\"name\":\"folder_peers\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":497305826,\"predicate\":\"inputUserFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"InputUser\"},{\"id\":1536380829,\"predicate\":\"inputChannelFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"InputChannel\"},{\"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\":55761658,\"predicate\":\"inputPrivacyKeyPhoneNumber\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-778378131,\"predicate\":\"privacyKeyPhoneNumber\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-1472172887,\"predicate\":\"topPeerCategoryForwardUsers\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-68239120,\"predicate\":\"topPeerCategoryForwardChats\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":84703944,\"predicate\":\"channelAdminLogEventActionChangeLinkedChat\",\"params\":[{\"name\":\"prev_value\",\"type\":\"long\"},{\"name\":\"new_value\",\"type\":\"long\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"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\":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\":-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\":-2079962673,\"predicate\":\"inputPrivacyValueAllowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":-380694650,\"predicate\":\"inputPrivacyValueDisallowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":1796427406,\"predicate\":\"privacyValueAllowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":1103656293,\"predicate\":\"privacyValueDisallowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"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\":1786671974,\"predicate\":\"updatePeerSettings\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"settings\",\"type\":\"PeerSettings\"}],\"type\":\"Update\"},{\"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\":-1263546448,\"predicate\":\"updatePeerLocated\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":241923758,\"predicate\":\"channelAdminLogEventActionChangeLocation\",\"params\":[{\"name\":\"prev_value\",\"type\":\"ChannelLocation\"},{\"name\":\"new_value\",\"type\":\"ChannelLocation\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-606798099,\"predicate\":\"inputReportReasonGeoIrrelevant\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":1401984889,\"predicate\":\"channelAdminLogEventActionToggleSlowMode\",\"params\":[{\"name\":\"prev_value\",\"type\":\"int\"},{\"name\":\"new_value\",\"type\":\"int\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1148485274,\"predicate\":\"auth.authorizationSignUpRequired\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"terms_of_service\",\"type\":\"flags.0?help.TermsOfService\"}],\"type\":\"auth.Authorization\"},{\"id\":-666824391,\"predicate\":\"payments.paymentVerificationNeeded\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"payments.PaymentResult\"},{\"id\":42402760,\"predicate\":\"inputStickerSetAnimatedEmoji\",\"params\":[],\"type\":\"InputStickerSet\"},{\"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\":-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\":-2112423005,\"predicate\":\"updateTheme\",\"params\":[{\"name\":\"theme\",\"type\":\"Theme\"}],\"type\":\"Update\"},{\"id\":-786326563,\"predicate\":\"inputPrivacyKeyAddedByPhone\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1124062251,\"predicate\":\"privacyKeyAddedByPhone\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-2027964103,\"predicate\":\"updateGeoLiveViewed\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1448076945,\"predicate\":\"updateLoginToken\",\"params\":[],\"type\":\"Update\"},{\"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\":-1770371538,\"predicate\":\"inputWallPaperNoFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"InputWallPaper\"},{\"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\":-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\":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\":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\":-1144565411,\"predicate\":\"keyboardButtonRequestPoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"quiz\",\"type\":\"flags.0?Bool\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":1981704948,\"predicate\":\"messageEntityBankCard\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"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\":-118740917,\"predicate\":\"peerSelfLocated\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"PeerLocated\"},{\"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\":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\":-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\":-428884101,\"predicate\":\"inputMediaDice\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":1065280907,\"predicate\":\"messageMediaDice\",\"params\":[{\"name\":\"value\",\"type\":\"int\"},{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":-427863538,\"predicate\":\"inputStickerSetDice\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"InputStickerSet\"},{\"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\":643940105,\"predicate\":\"updatePhoneCallSignalingData\",\"params\":[{\"name\":\"phone_call_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"Update\"},{\"id\":1634294960,\"predicate\":\"chatInvitePeek\",\"params\":[{\"name\":\"chat\",\"type\":\"Chat\"},{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"ChatInvite\"},{\"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\":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\":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\":-761649164,\"predicate\":\"updateChannelMessageForwards\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"forwards\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-96535659,\"predicate\":\"photoSizeProgressive\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"sizes\",\"type\":\"Vector\"}],\"type\":\"PhotoSize\"},{\"id\":-1228606141,\"predicate\":\"messages.messageViews\",\"params\":[{\"name\":\"views\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.MessageViews\"},{\"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\":-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_scheduled\",\"type\":\"flags.2?true\"},{\"name\":\"forum_topic\",\"type\":\"flags.3?true\"},{\"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\":610945826,\"predicate\":\"updatePeerBlocked\",\"params\":[{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"blocked\",\"type\":\"Bool\"}],\"type\":\"Update\"},{\"id\":-386039788,\"predicate\":\"peerBlocked\",\"params\":[{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"PeerBlocked\"},{\"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\":-1392895362,\"predicate\":\"inputMessageCallbackQuery\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"query_id\",\"type\":\"long\"}],\"type\":\"InputMessage\"},{\"id\":453242886,\"predicate\":\"channelParticipantLeft\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"ChannelParticipant\"},{\"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\":-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\":464520273,\"predicate\":\"inputMessagesFilterPinned\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1986399595,\"predicate\":\"stats.messageStats\",\"params\":[{\"name\":\"views_graph\",\"type\":\"StatsGraph\"}],\"type\":\"stats.MessageStats\"},{\"id\":-1730095465,\"predicate\":\"messageActionGeoProximityReached\",\"params\":[{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"to_id\",\"type\":\"Peer\"},{\"name\":\"distance\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-668906175,\"predicate\":\"photoPathSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":-651419003,\"predicate\":\"speakingInGroupCallAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"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\":\"rtmp_stream\",\"type\":\"flags.12?true\"},{\"name\":\"listeners_hidden\",\"type\":\"flags.13?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\":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\":-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\":-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\":-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\":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\":-1966921727,\"predicate\":\"inputPaymentCredentialsGooglePay\",\"params\":[{\"name\":\"payment_token\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":375566091,\"predicate\":\"messages.historyImport\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"messages.HistoryImport\"},{\"id\":-606432698,\"predicate\":\"sendMessageHistoryImportAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"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\":-170010905,\"predicate\":\"inputReportReasonFake\",\"params\":[],\"type\":\"ReportReason\"},{\"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\":1007897979,\"predicate\":\"messageActionSetMessagesTTL\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"period\",\"type\":\"int\"},{\"name\":\"auto_setting_from\",\"type\":\"flags.0?long\"}],\"type\":\"MessageAction\"},{\"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\":-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\":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\":-1571952873,\"predicate\":\"messages.checkedHistoryImportPeer\",\"params\":[{\"name\":\"confirm_text\",\"type\":\"string\"}],\"type\":\"messages.CheckedHistoryImportPeer\"},{\"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\":-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\":-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\":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\":-1281329567,\"predicate\":\"messageActionGroupCallScheduled\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"schedule_date\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"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\":192428418,\"predicate\":\"updateGroupCallConnection\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"presentation\",\"type\":\"flags.0?true\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Update\"},{\"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\":1299263278,\"predicate\":\"updateBotCommands\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"commands\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-1434950843,\"predicate\":\"messageActionSetChatTheme\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-1336228175,\"predicate\":\"sendMessageChooseStickerAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":981691896,\"predicate\":\"sponsoredMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"recommended\",\"type\":\"flags.5?true\"},{\"name\":\"show_peer_photo\",\"type\":\"flags.6?true\"},{\"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\":-907141753,\"predicate\":\"messages.sponsoredMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"posts_between\",\"type\":\"flags.0?int\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.SponsoredMessages\"},{\"id\":215889721,\"predicate\":\"inputStickerSetAnimatedEmojiAnimations\",\"params\":[],\"type\":\"InputStickerSet\"},{\"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\":-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\":-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\":-339958837,\"predicate\":\"messageActionChatJoinedByRequest\",\"params\":[],\"type\":\"MessageAction\"},{\"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\":-1347021750,\"predicate\":\"channelAdminLogEventActionParticipantJoinByRequest\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"approved_by\",\"type\":\"long\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"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\":-191450938,\"predicate\":\"channels.sendAsPeers\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.SendAsPeers\"},{\"id\":-886388890,\"predicate\":\"channelAdminLogEventActionToggleNoForwards\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-738646805,\"predicate\":\"messages.stickerSetNotModified\",\"params\":[],\"type\":\"messages.StickerSet\"},{\"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\":663693416,\"predicate\":\"channelAdminLogEventActionSendMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-702884114,\"predicate\":\"auth.codeTypeMissedCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":-2113903484,\"predicate\":\"auth.sentCodeTypeMissedCall\",\"params\":[{\"name\":\"prefix\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1012759713,\"predicate\":\"auth.loggedOut\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"future_auth_token\",\"type\":\"flags.0?bytes\"}],\"type\":\"auth.LoggedOut\"},{\"id\":1578843320,\"predicate\":\"updateMessageReactions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"reactions\",\"type\":\"MessageReactions\"}],\"type\":\"Update\"},{\"id\":-1546531968,\"predicate\":\"reactionCount\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chosen_order\",\"type\":\"flags.0?int\"},{\"name\":\"reaction\",\"type\":\"Reaction\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"ReactionCount\"},{\"id\":1328256121,\"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_reactions\",\"type\":\"flags.1?Vector\"}],\"type\":\"MessageReactions\"},{\"id\":834488621,\"predicate\":\"messages.messageReactionsList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"reactions\",\"type\":\"Vector\"},{\"name\":\"chats\",\"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\":\"premium\",\"type\":\"flags.2?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\"},{\"id\":852137487,\"predicate\":\"messageEntitySpoiler\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1102180616,\"predicate\":\"channelAdminLogEventActionChangeAvailableReactions\",\"params\":[{\"name\":\"prev_value\",\"type\":\"ChatReactions\"},{\"name\":\"new_value\",\"type\":\"ChatReactions\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1741309751,\"predicate\":\"messages.translateNoResult\",\"params\":[],\"type\":\"messages.TranslatedText\"},{\"id\":-1575684144,\"predicate\":\"messages.translateResultText\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"messages.TranslatedText\"},{\"id\":-1319698788,\"predicate\":\"messagePeerReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"big\",\"type\":\"flags.0?true\"},{\"name\":\"unread\",\"type\":\"flags.1?true\"},{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"reaction\",\"type\":\"Reaction\"}],\"type\":\"MessagePeerReaction\"},{\"id\":-2132064081,\"predicate\":\"groupCallStreamChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"int\"},{\"name\":\"scale\",\"type\":\"int\"},{\"name\":\"last_timestamp_ms\",\"type\":\"long\"}],\"type\":\"GroupCallStreamChannel\"},{\"id\":-790330702,\"predicate\":\"phone.groupCallStreamChannels\",\"params\":[{\"name\":\"channels\",\"type\":\"Vector\"}],\"type\":\"phone.GroupCallStreamChannels\"},{\"id\":177124030,\"predicate\":\"inputReportReasonIllegalDrugs\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1631091139,\"predicate\":\"inputReportReasonPersonalDetails\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":767505458,\"predicate\":\"phone.groupCallStreamRtmpUrl\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"key\",\"type\":\"string\"}],\"type\":\"phone.GroupCallStreamRtmpUrl\"},{\"id\":1165423600,\"predicate\":\"attachMenuBotIconColor\",\"params\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"color\",\"type\":\"int\"}],\"type\":\"AttachMenuBotIconColor\"},{\"id\":-1297663893,\"predicate\":\"attachMenuBotIcon\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"icon\",\"type\":\"Document\"},{\"name\":\"colors\",\"type\":\"flags.0?Vector\"}],\"type\":\"AttachMenuBotIcon\"},{\"id\":-928371502,\"predicate\":\"attachMenuBot\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inactive\",\"type\":\"flags.0?true\"},{\"name\":\"has_settings\",\"type\":\"flags.1?true\"},{\"name\":\"request_write_access\",\"type\":\"flags.2?true\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"peer_types\",\"type\":\"Vector\"},{\"name\":\"icons\",\"type\":\"Vector\"}],\"type\":\"AttachMenuBot\"},{\"id\":-237467044,\"predicate\":\"attachMenuBotsNotModified\",\"params\":[],\"type\":\"AttachMenuBots\"},{\"id\":1011024320,\"predicate\":\"attachMenuBots\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"bots\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"AttachMenuBots\"},{\"id\":-1816172929,\"predicate\":\"attachMenuBotsBot\",\"params\":[{\"name\":\"bot\",\"type\":\"AttachMenuBot\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"AttachMenuBotsBot\"},{\"id\":397910539,\"predicate\":\"updateAttachMenuBots\",\"params\":[],\"type\":\"Update\"},{\"id\":202659196,\"predicate\":\"webViewResultUrl\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"WebViewResult\"},{\"id\":-2010155333,\"predicate\":\"simpleWebViewResultUrl\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"SimpleWebViewResult\"},{\"id\":211046684,\"predicate\":\"webViewMessageSent\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"msg_id\",\"type\":\"flags.0?InputBotInlineMessageID\"}],\"type\":\"WebViewMessageSent\"},{\"id\":361936797,\"predicate\":\"updateWebViewResultSent\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":326529584,\"predicate\":\"keyboardButtonWebView\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-1598009252,\"predicate\":\"keyboardButtonSimpleWebView\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":1205698681,\"predicate\":\"messageActionWebViewDataSentMe\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-1262252875,\"predicate\":\"messageActionWebViewDataSent\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":347625491,\"predicate\":\"updateBotMenuButton\",\"params\":[{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"button\",\"type\":\"BotMenuButton\"}],\"type\":\"Update\"},{\"id\":1966318984,\"predicate\":\"botMenuButtonDefault\",\"params\":[],\"type\":\"BotMenuButton\"},{\"id\":1113113093,\"predicate\":\"botMenuButtonCommands\",\"params\":[],\"type\":\"BotMenuButton\"},{\"id\":-944407322,\"predicate\":\"botMenuButton\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"BotMenuButton\"},{\"id\":-67704655,\"predicate\":\"account.savedRingtonesNotModified\",\"params\":[],\"type\":\"account.SavedRingtones\"},{\"id\":-1041683259,\"predicate\":\"account.savedRingtones\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"ringtones\",\"type\":\"Vector\"}],\"type\":\"account.SavedRingtones\"},{\"id\":1960361625,\"predicate\":\"updateSavedRingtones\",\"params\":[],\"type\":\"Update\"},{\"id\":-1746354498,\"predicate\":\"notificationSoundDefault\",\"params\":[],\"type\":\"NotificationSound\"},{\"id\":1863070943,\"predicate\":\"notificationSoundNone\",\"params\":[],\"type\":\"NotificationSound\"},{\"id\":-2096391452,\"predicate\":\"notificationSoundLocal\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"NotificationSound\"},{\"id\":-9666487,\"predicate\":\"notificationSoundRingtone\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"NotificationSound\"},{\"id\":-1222230163,\"predicate\":\"account.savedRingtone\",\"params\":[],\"type\":\"account.SavedRingtone\"},{\"id\":523271863,\"predicate\":\"account.savedRingtoneConverted\",\"params\":[{\"name\":\"document\",\"type\":\"Document\"}],\"type\":\"account.SavedRingtone\"},{\"id\":2104224014,\"predicate\":\"attachMenuPeerTypeSameBotPM\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":-1020528102,\"predicate\":\"attachMenuPeerTypeBotPM\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":-247016673,\"predicate\":\"attachMenuPeerTypePM\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":84480319,\"predicate\":\"attachMenuPeerTypeChat\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":2080104188,\"predicate\":\"attachMenuPeerTypeBroadcast\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":-317687113,\"predicate\":\"chatInvitePublicJoinRequests\",\"params\":[],\"type\":\"ExportedChatInvite\"},{\"id\":-977967015,\"predicate\":\"inputInvoiceMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"InputInvoice\"},{\"id\":-1020867857,\"predicate\":\"inputInvoiceSlug\",\"params\":[{\"name\":\"slug\",\"type\":\"string\"}],\"type\":\"InputInvoice\"},{\"id\":-1362048039,\"predicate\":\"payments.exportedInvoice\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"payments.ExportedInvoice\"},{\"id\":8703322,\"predicate\":\"updateTranscribedAudio\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pending\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"transcription_id\",\"type\":\"long\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":-1821037486,\"predicate\":\"messages.transcribedAudio\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pending\",\"type\":\"flags.0?true\"},{\"name\":\"transcription_id\",\"type\":\"long\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"messages.TranscribedAudio\"},{\"id\":909284270,\"predicate\":\"dialogFilterDefault\",\"params\":[],\"type\":\"DialogFilter\"},{\"id\":1395946908,\"predicate\":\"help.premiumPromo\",\"params\":[{\"name\":\"status_text\",\"type\":\"string\"},{\"name\":\"status_entities\",\"type\":\"Vector\"},{\"name\":\"video_sections\",\"type\":\"Vector\"},{\"name\":\"videos\",\"type\":\"Vector\"},{\"name\":\"period_options\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"help.PremiumPromo\"},{\"id\":-925956616,\"predicate\":\"messageEntityCustomEmoji\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"document_id\",\"type\":\"long\"}],\"type\":\"MessageEntity\"},{\"id\":-48981863,\"predicate\":\"documentAttributeCustomEmoji\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"free\",\"type\":\"flags.0?true\"},{\"name\":\"text_color\",\"type\":\"flags.1?true\"},{\"name\":\"alt\",\"type\":\"string\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"DocumentAttribute\"},{\"id\":1087454222,\"predicate\":\"stickerSetFullCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"keywords\",\"type\":\"Vector\"},{\"name\":\"documents\",\"type\":\"Vector\"}],\"type\":\"StickerSetCovered\"},{\"id\":-1502273946,\"predicate\":\"inputStorePaymentPremiumSubscription\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"restore\",\"type\":\"flags.0?true\"}],\"type\":\"InputStorePaymentPurpose\"},{\"id\":1634697192,\"predicate\":\"inputStorePaymentGiftPremium\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"}],\"type\":\"InputStorePaymentPurpose\"},{\"id\":-1415514682,\"predicate\":\"messageActionGiftPremium\",\"params\":[{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"},{\"name\":\"months\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":1958953753,\"predicate\":\"premiumGiftOption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"months\",\"type\":\"int\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"},{\"name\":\"bot_url\",\"type\":\"string\"},{\"name\":\"store_product\",\"type\":\"flags.0?string\"}],\"type\":\"PremiumGiftOption\"},{\"id\":-930399486,\"predicate\":\"inputStickerSetPremiumGifts\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-78886548,\"predicate\":\"updateReadFeaturedEmojiStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":-1360618136,\"predicate\":\"inputPrivacyKeyVoiceMessages\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":110621716,\"predicate\":\"privacyKeyVoiceMessages\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-1996951013,\"predicate\":\"paymentFormMethod\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"PaymentFormMethod\"},{\"id\":-193992412,\"predicate\":\"inputWebFileAudioAlbumThumbLocation\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"small\",\"type\":\"flags.2?true\"},{\"name\":\"document\",\"type\":\"flags.0?InputDocument\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"performer\",\"type\":\"flags.1?string\"}],\"type\":\"InputWebFileLocation\"},{\"id\":769727150,\"predicate\":\"emojiStatusEmpty\",\"params\":[],\"type\":\"EmojiStatus\"},{\"id\":-1835310691,\"predicate\":\"emojiStatus\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"}],\"type\":\"EmojiStatus\"},{\"id\":-97474361,\"predicate\":\"emojiStatusUntil\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"},{\"name\":\"until\",\"type\":\"int\"}],\"type\":\"EmojiStatus\"},{\"id\":674706841,\"predicate\":\"updateUserEmojiStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"emoji_status\",\"type\":\"EmojiStatus\"}],\"type\":\"Update\"},{\"id\":821314523,\"predicate\":\"updateRecentEmojiStatuses\",\"params\":[],\"type\":\"Update\"},{\"id\":-796072379,\"predicate\":\"account.emojiStatusesNotModified\",\"params\":[],\"type\":\"account.EmojiStatuses\"},{\"id\":-1866176559,\"predicate\":\"account.emojiStatuses\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"statuses\",\"type\":\"Vector\"}],\"type\":\"account.EmojiStatuses\"},{\"id\":2046153753,\"predicate\":\"reactionEmpty\",\"params\":[],\"type\":\"Reaction\"},{\"id\":455247544,\"predicate\":\"reactionEmoji\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"Reaction\"},{\"id\":-1992950669,\"predicate\":\"reactionCustomEmoji\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"}],\"type\":\"Reaction\"},{\"id\":-352570692,\"predicate\":\"chatReactionsNone\",\"params\":[],\"type\":\"ChatReactions\"},{\"id\":1385335754,\"predicate\":\"chatReactionsAll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"allow_custom\",\"type\":\"flags.0?true\"}],\"type\":\"ChatReactions\"},{\"id\":1713193015,\"predicate\":\"chatReactionsSome\",\"params\":[{\"name\":\"reactions\",\"type\":\"Vector\"}],\"type\":\"ChatReactions\"},{\"id\":-1334846497,\"predicate\":\"messages.reactionsNotModified\",\"params\":[],\"type\":\"messages.Reactions\"},{\"id\":-352454890,\"predicate\":\"messages.reactions\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"reactions\",\"type\":\"Vector\"}],\"type\":\"messages.Reactions\"},{\"id\":1870160884,\"predicate\":\"updateRecentReactions\",\"params\":[],\"type\":\"Update\"},{\"id\":-2030252155,\"predicate\":\"updateMoveStickerSetToTop\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"emojis\",\"type\":\"flags.1?true\"},{\"name\":\"stickerset\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":1511364673,\"predicate\":\"auth.sentCodeTypeEmailCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"apple_signin_allowed\",\"type\":\"flags.0?true\"},{\"name\":\"google_signin_allowed\",\"type\":\"flags.1?true\"},{\"name\":\"email_pattern\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"next_phone_login_date\",\"type\":\"flags.2?int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1521934870,\"predicate\":\"auth.sentCodeTypeSetUpEmailRequired\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"apple_signin_allowed\",\"type\":\"flags.0?true\"},{\"name\":\"google_signin_allowed\",\"type\":\"flags.1?true\"}],\"type\":\"auth.SentCodeType\"},{\"id\":1128644211,\"predicate\":\"emailVerifyPurposeLoginSetup\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"}],\"type\":\"EmailVerifyPurpose\"},{\"id\":1383932651,\"predicate\":\"emailVerifyPurposeLoginChange\",\"params\":[],\"type\":\"EmailVerifyPurpose\"},{\"id\":-1141565819,\"predicate\":\"emailVerifyPurposePassport\",\"params\":[],\"type\":\"EmailVerifyPurpose\"},{\"id\":-1842457175,\"predicate\":\"emailVerificationCode\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"EmailVerification\"},{\"id\":-611279166,\"predicate\":\"emailVerificationGoogle\",\"params\":[{\"name\":\"token\",\"type\":\"string\"}],\"type\":\"EmailVerification\"},{\"id\":-1764723459,\"predicate\":\"emailVerificationApple\",\"params\":[{\"name\":\"token\",\"type\":\"string\"}],\"type\":\"EmailVerification\"},{\"id\":731303195,\"predicate\":\"account.emailVerified\",\"params\":[{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"account.EmailVerified\"},{\"id\":-507835039,\"predicate\":\"account.emailVerifiedLogin\",\"params\":[{\"name\":\"email\",\"type\":\"string\"},{\"name\":\"sent_code\",\"type\":\"auth.SentCode\"}],\"type\":\"account.EmailVerified\"},{\"id\":-1225711938,\"predicate\":\"premiumSubscriptionOption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"current\",\"type\":\"flags.1?true\"},{\"name\":\"can_purchase_upgrade\",\"type\":\"flags.2?true\"},{\"name\":\"months\",\"type\":\"int\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"},{\"name\":\"bot_url\",\"type\":\"string\"},{\"name\":\"store_product\",\"type\":\"flags.0?string\"}],\"type\":\"PremiumSubscriptionOption\"},{\"id\":80008398,\"predicate\":\"inputStickerSetEmojiGenericAnimations\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":701560302,\"predicate\":\"inputStickerSetEmojiDefaultStatuses\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-1206095820,\"predicate\":\"sendAsPeer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"premium_required\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"SendAsPeer\"},{\"id\":-1386050360,\"predicate\":\"messageExtendedMediaPreview\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"w\",\"type\":\"flags.0?int\"},{\"name\":\"h\",\"type\":\"flags.0?int\"},{\"name\":\"thumb\",\"type\":\"flags.1?PhotoSize\"},{\"name\":\"video_duration\",\"type\":\"flags.2?int\"}],\"type\":\"MessageExtendedMedia\"},{\"id\":-297296796,\"predicate\":\"messageExtendedMedia\",\"params\":[{\"name\":\"media\",\"type\":\"MessageMedia\"}],\"type\":\"MessageExtendedMedia\"},{\"id\":1517529484,\"predicate\":\"updateMessageExtendedMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"extended_media\",\"type\":\"MessageExtendedMedia\"}],\"type\":\"Update\"},{\"id\":-50416996,\"predicate\":\"stickerKeyword\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"},{\"name\":\"keyword\",\"type\":\"Vector\"}],\"type\":\"StickerKeyword\"},{\"id\":-1274595769,\"predicate\":\"username\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"editable\",\"type\":\"flags.0?true\"},{\"name\":\"active\",\"type\":\"flags.1?true\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Username\"},{\"id\":-263212119,\"predicate\":\"channelAdminLogEventActionChangeUsernames\",\"params\":[{\"name\":\"prev_value\",\"type\":\"Vector\"},{\"name\":\"new_value\",\"type\":\"Vector\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":46949251,\"predicate\":\"channelAdminLogEventActionToggleForum\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1483767080,\"predicate\":\"channelAdminLogEventActionCreateTopic\",\"params\":[{\"name\":\"topic\",\"type\":\"ForumTopic\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-261103096,\"predicate\":\"channelAdminLogEventActionEditTopic\",\"params\":[{\"name\":\"prev_topic\",\"type\":\"ForumTopic\"},{\"name\":\"new_topic\",\"type\":\"ForumTopic\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1374254839,\"predicate\":\"channelAdminLogEventActionDeleteTopic\",\"params\":[{\"name\":\"topic\",\"type\":\"ForumTopic\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1569535291,\"predicate\":\"channelAdminLogEventActionPinTopic\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"prev_topic\",\"type\":\"flags.0?ForumTopic\"},{\"name\":\"new_topic\",\"type\":\"flags.1?ForumTopic\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":37687451,\"predicate\":\"forumTopicDeleted\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"ForumTopic\"},{\"id\":1903173033,\"predicate\":\"forumTopic\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"my\",\"type\":\"flags.1?true\"},{\"name\":\"closed\",\"type\":\"flags.2?true\"},{\"name\":\"pinned\",\"type\":\"flags.3?true\"},{\"name\":\"short\",\"type\":\"flags.5?true\"},{\"name\":\"hidden\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"icon_color\",\"type\":\"int\"},{\"name\":\"icon_emoji_id\",\"type\":\"flags.0?long\"},{\"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\":\"unread_reactions_count\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"draft\",\"type\":\"flags.4?DraftMessage\"}],\"type\":\"ForumTopic\"},{\"id\":913709011,\"predicate\":\"messages.forumTopics\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"order_by_create_date\",\"type\":\"flags.0?true\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"topics\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"messages.ForumTopics\"},{\"id\":228168278,\"predicate\":\"messageActionTopicCreate\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"icon_color\",\"type\":\"int\"},{\"name\":\"icon_emoji_id\",\"type\":\"flags.0?long\"}],\"type\":\"MessageAction\"},{\"id\":-1064024032,\"predicate\":\"messageActionTopicEdit\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"icon_emoji_id\",\"type\":\"flags.1?long\"},{\"name\":\"closed\",\"type\":\"flags.2?Bool\"},{\"name\":\"hidden\",\"type\":\"flags.3?Bool\"}],\"type\":\"MessageAction\"},{\"id\":422509539,\"predicate\":\"updateChannelPinnedTopic\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"topic_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1548122514,\"predicate\":\"inputNotifyForumTopic\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"int\"}],\"type\":\"InputNotifyPeer\"},{\"id\":577659656,\"predicate\":\"notifyForumTopic\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_msg_id\",\"type\":\"int\"}],\"type\":\"NotifyPeer\"},{\"id\":1153562857,\"predicate\":\"inputStickerSetEmojiDefaultTopicIcons\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":406407439,\"predicate\":\"messages.sponsoredMessagesEmpty\",\"params\":[],\"type\":\"messages.SponsoredMessages\"},{\"id\":-31881726,\"predicate\":\"updateChannelPinnedTopics\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"order\",\"type\":\"flags.0?Vector\"}],\"type\":\"Update\"},{\"id\":1135897376,\"predicate\":\"defaultHistoryTTL\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"DefaultHistoryTTL\"},{\"id\":116234636,\"predicate\":\"auth.codeTypeFragmentSms\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":-648651719,\"predicate\":\"auth.sentCodeTypeFragmentSms\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":1103040667,\"predicate\":\"exportedContactToken\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"ExportedContactToken\"},{\"id\":1693675004,\"predicate\":\"channelAdminLogEventActionToggleAntiSpam\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1474192222,\"predicate\":\"messageActionSuggestProfilePhoto\",\"params\":[{\"name\":\"photo\",\"type\":\"Photo\"}],\"type\":\"MessageAction\"},{\"id\":-404267113,\"predicate\":\"messageActionAttachMenuBotAllowed\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":2008112412,\"predicate\":\"stickerSetNoCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"}],\"type\":\"StickerSetCovered\"},{\"id\":542282808,\"predicate\":\"updateUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"Update\"}],\"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\":-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\":-1923962543,\"method\":\"auth.signIn\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"flags.0?string\"},{\"name\":\"email_verification\",\"type\":\"flags.1?EmailVerification\"}],\"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\":-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\":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\":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\":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\":482476935,\"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\":\"update_stickersets_order\",\"type\":\"flags.15?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.9?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\":1967638886,\"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\":\"update_stickersets_order\",\"type\":\"flags.15?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.9?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\":-966673468,\"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\":\"top_msg_id\",\"type\":\"flags.9?int\"},{\"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\":3450904,\"method\":\"messages.createChat\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"ttl_period\",\"type\":\"flags.0?int\"}],\"type\":\"Updates\"},{\"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\":473782614,\"method\":\"photos.updateProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"fallback\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"photos.Photo\"},{\"id\":-1980559511,\"method\":\"photos.uploadProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"fallback\",\"type\":\"flags.3?true\"},{\"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\":-1291540959,\"method\":\"upload.saveFilePart\",\"params\":[{\"name\":\"file_id\",\"type\":\"long\"},{\"name\":\"file_part\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-1101843010,\"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\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.File\"},{\"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\":-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\":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\":-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\":-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\":-1663104819,\"method\":\"help.getSupport\",\"params\":[],\"type\":\"help.Support\"},{\"id\":916930423,\"method\":\"messages.readMessageContents\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedMessages\"},{\"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\":301470424,\"method\":\"contacts.search\",\"params\":[{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"contacts.Found\"},{\"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\":-1564422284,\"method\":\"account.deleteAccount\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reason\",\"type\":\"string\"},{\"name\":\"password\",\"type\":\"flags.0?InputCheckPasswordSRP\"}],\"type\":\"Bool\"},{\"id\":150761757,\"method\":\"account.getAccountTTL\",\"params\":[],\"type\":\"AccountDaysTTL\"},{\"id\":608323678,\"method\":\"account.setAccountTTL\",\"params\":[{\"name\":\"ttl\",\"type\":\"AccountDaysTTL\"}],\"type\":\"Bool\"},{\"id\":-627372787,\"method\":\"invokeWithLayer\",\"params\":[{\"name\":\"layer\",\"type\":\"int\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-113456221,\"method\":\"contacts.resolveUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"contacts.ResolvedPeer\"},{\"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\":-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\":954152242,\"method\":\"account.updateDeviceLocked\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"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\":-1956073268,\"method\":\"messages.getWebPagePreview\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"}],\"type\":\"MessageMedia\"},{\"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\":-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\":-1080796745,\"method\":\"invokeWithoutUpdates\",\"params\":[{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"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\":-1877938321,\"method\":\"help.getAppChangelog\",\"params\":[{\"name\":\"prev_app_version\",\"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\":-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\":-1862244601,\"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\"},{\"name\":\"ttl_period\",\"type\":\"flags.4?int\"}],\"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\":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\":-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\":\"emojis\",\"type\":\"flags.1?true\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1309538785,\"method\":\"messages.getDocumentByHash\",\"params\":[{\"name\":\"sha256\",\"type\":\"bytes\"},{\"name\":\"size\",\"type\":\"long\"},{\"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\":-738468661,\"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\":\"top_msg_id\",\"type\":\"flags.9?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\":-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\":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\":-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\":-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\":-462373635,\"method\":\"messages.getPeerDialogs\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-1271718337,\"method\":\"messages.saveDraft\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.2?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\":\"emojis\",\"type\":\"flags.1?true\"},{\"name\":\"offset_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ArchivedStickers\"},{\"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\":-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\":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\":-1907842680,\"method\":\"auth.dropTempAuthKeys\",\"params\":[{\"name\":\"except_auth_keys\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"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\":-333262899,\"method\":\"help.setBotUpdatesStatus\",\"params\":[{\"name\":\"pending_updates_count\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"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\":-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\":619086221,\"method\":\"upload.getWebFile\",\"params\":[{\"name\":\"location\",\"type\":\"InputWebFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.WebFile\"},{\"id\":924093883,\"method\":\"payments.getPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"invoice\",\"type\":\"InputInvoice\"},{\"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\":-1228345045,\"method\":\"payments.validateRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"save\",\"type\":\"flags.0?true\"},{\"name\":\"invoice\",\"type\":\"InputInvoice\"},{\"name\":\"info\",\"type\":\"PaymentRequestedInfo\"}],\"type\":\"payments.ValidatedRequestedInfo\"},{\"id\":755192367,\"method\":\"payments.sendPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"form_id\",\"type\":\"long\"},{\"name\":\"invoice\",\"type\":\"InputInvoice\"},{\"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\":1151208273,\"method\":\"account.getTmpPassword\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"},{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"account.TmpPassword\"},{\"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\":-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\":-1876841625,\"method\":\"stickers.createStickerSet\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"animated\",\"type\":\"flags.1?true\"},{\"name\":\"videos\",\"type\":\"flags.4?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\":1369162417,\"method\":\"messages.uploadMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"media\",\"type\":\"InputMedia\"}],\"type\":\"MessageMedia\"},{\"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\":962554330,\"method\":\"upload.getCdnFile\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"long\"},{\"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\":1375900482,\"method\":\"help.getCdnConfig\",\"params\":[],\"type\":\"CdnConfig\"},{\"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\":-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\":-1847836879,\"method\":\"upload.getCdnFileHashes\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"long\"}],\"type\":\"Vector\"},{\"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\":-359881479,\"method\":\"channels.setStickers\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"Bool\"},{\"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\":-357180360,\"method\":\"channels.readMessageContents\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-2020263951,\"method\":\"contacts.resetSaved\",\"params\":[],\"type\":\"Bool\"},{\"id\":-251140208,\"method\":\"messages.getUnreadMentions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?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\"}],\"type\":\"messages.Messages\"},{\"id\":-1683319225,\"method\":\"channels.deleteHistory\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"for_everyone\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1036054804,\"method\":\"help.getRecentMeUrls\",\"params\":[{\"name\":\"referer\",\"type\":\"string\"}],\"type\":\"help.RecentMeUrls\"},{\"id\":-356796084,\"method\":\"channels.togglePreHistoryHidden\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":921026381,\"method\":\"messages.readMentions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"}],\"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\":-1225713124,\"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\":\"update_stickersets_order\",\"type\":\"flags.15?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.9?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\":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\":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\":-1856595926,\"method\":\"upload.getFileHashes\",\"params\":[{\"name\":\"location\",\"type\":\"InputFileLocation\"},{\"name\":\"offset\",\"type\":\"long\"}],\"type\":\"Vector\"},{\"id\":749019089,\"method\":\"help.getTermsOfServiceUpdate\",\"params\":[],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":-294455398,\"method\":\"help.acceptTermsOfService\",\"params\":[{\"name\":\"id\",\"type\":\"DataJSON\"}],\"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\":-1865902923,\"method\":\"users.setSecureValueErrors\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"},{\"name\":\"errors\",\"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\":-1730136133,\"method\":\"account.sendVerifyEmailCode\",\"params\":[{\"name\":\"purpose\",\"type\":\"EmailVerifyPurpose\"},{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"account.SentEmailCode\"},{\"id\":53322959,\"method\":\"account.verifyEmail\",\"params\":[{\"name\":\"purpose\",\"type\":\"EmailVerifyPurpose\"},{\"name\":\"verification\",\"type\":\"EmailVerification\"}],\"type\":\"account.EmailVerified\"},{\"id\":1072547679,\"method\":\"help.getDeepLinkInfo\",\"params\":[{\"name\":\"path\",\"type\":\"string\"}],\"type\":\"help.DeepLinkInfo\"},{\"id\":-2098076769,\"method\":\"contacts.getSaved\",\"params\":[],\"type\":\"Vector\"},{\"id\":-2092831552,\"method\":\"channels.getLeftChannels\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"messages.Chats\"},{\"id\":-1896617296,\"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?long\"}],\"type\":\"account.Takeout\"},{\"id\":489050862,\"method\":\"account.finishTakeoutSession\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"success\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":486505992,\"method\":\"messages.getSplitRanges\",\"params\":[],\"type\":\"Vector\"},{\"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\":-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\":-2062238246,\"method\":\"contacts.toggleTopPeers\",\"params\":[{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":2119757468,\"method\":\"messages.clearAllDrafts\",\"params\":[],\"type\":\"Bool\"},{\"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\":1784243458,\"method\":\"langpack.getLanguage\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"LangPackLanguage\"},{\"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\":-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\":-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\":-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\":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\":-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\":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\":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\":11435201,\"method\":\"messages.getSearchCounters\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"filters\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"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\":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\":-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\":-1892102881,\"method\":\"channels.editCreator\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"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\":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\":-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\":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\":978872812,\"method\":\"account.getTheme\",\"params\":[{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"theme\",\"type\":\"InputTheme\"}],\"type\":\"Theme\"},{\"id\":1913054296,\"method\":\"account.getThemes\",\"params\":[{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.Themes\"},{\"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\":-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\":300429806,\"method\":\"channels.getInactiveChannels\",\"params\":[],\"type\":\"messages.InactiveChats\"},{\"id\":1705865692,\"method\":\"account.getMultiWallPapers\",\"params\":[{\"name\":\"wallpapers\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"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\":779736953,\"method\":\"payments.getBankCardData\",\"params\":[{\"name\":\"number\",\"type\":\"string\"}],\"type\":\"payments.BankCardData\"},{\"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\":-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\":-1707717072,\"method\":\"stickers.setStickerSetThumb\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"thumb\",\"type\":\"InputDocument\"}],\"type\":\"messages.StickerSet\"},{\"id\":85399130,\"method\":\"bots.setBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"commands\",\"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\":-1063816159,\"method\":\"help.getPromoData\",\"params\":[],\"type\":\"help.PromoData\"},{\"id\":505748629,\"method\":\"help.hidePromoData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-8744061,\"method\":\"phone.sendSignalingData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-589330937,\"method\":\"stats.getMegagroupStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"stats.MegagroupStats\"},{\"id\":-349483786,\"method\":\"account.getGlobalPrivacySettings\",\"params\":[],\"type\":\"GlobalPrivacySettings\"},{\"id\":517647042,\"method\":\"account.setGlobalPrivacySettings\",\"params\":[{\"name\":\"settings\",\"type\":\"GlobalPrivacySettings\"}],\"type\":\"GlobalPrivacySettings\"},{\"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\":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\":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\":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\"},{\"id\":-299714136,\"method\":\"messages.unpinAllMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1221445336,\"method\":\"phone.createGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"rtmp_stream\",\"type\":\"flags.2?true\"},{\"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\":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\":-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\":187239529,\"method\":\"channels.convertToGigagroup\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":1573261059,\"method\":\"messages.checkHistoryImportPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.CheckedHistoryImportPeer\"},{\"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\":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\":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\":-1828139493,\"method\":\"account.resetPassword\",\"params\":[],\"type\":\"account.ResetPasswordResult\"},{\"id\":1284770294,\"method\":\"account.declinePasswordReset\",\"params\":[],\"type\":\"Bool\"},{\"id\":221691769,\"method\":\"auth.checkRecoveryPassword\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-700916087,\"method\":\"account.getChatThemes\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.Themes\"},{\"id\":-432283329,\"method\":\"messages.setChatTheme\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"emoticon\",\"type\":\"string\"}],\"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\":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\":231174382,\"method\":\"channels.getSendAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"channels.SendAsPeers\"},{\"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\":913655003,\"method\":\"channels.deleteParticipantHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":-754091820,\"method\":\"messages.sendReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"big\",\"type\":\"flags.1?true\"},{\"name\":\"add_to_recent\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"reaction\",\"type\":\"flags.0?Vector\"}],\"type\":\"Updates\"},{\"id\":-1950707482,\"method\":\"messages.getMessagesReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":1176190792,\"method\":\"messages.getMessageReactionsList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"reaction\",\"type\":\"flags.0?Reaction\"},{\"name\":\"offset\",\"type\":\"flags.1?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.MessageReactionsList\"},{\"id\":-21928079,\"method\":\"messages.setChatAvailableReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"available_reactions\",\"type\":\"ChatReactions\"}],\"type\":\"Updates\"},{\"id\":417243308,\"method\":\"messages.getAvailableReactions\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.AvailableReactions\"},{\"id\":1330094102,\"method\":\"messages.setDefaultReaction\",\"params\":[{\"name\":\"reaction\",\"type\":\"Reaction\"}],\"type\":\"Bool\"},{\"id\":617508334,\"method\":\"messages.translateText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"flags.0?InputPeer\"},{\"name\":\"msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"text\",\"type\":\"flags.1?string\"},{\"name\":\"from_lang\",\"type\":\"flags.2?string\"},{\"name\":\"to_lang\",\"type\":\"string\"}],\"type\":\"messages.TranslatedText\"},{\"id\":841173339,\"method\":\"messages.getUnreadReactions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?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\"}],\"type\":\"messages.Messages\"},{\"id\":1420459918,\"method\":\"messages.readReactions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":-1963375804,\"method\":\"contacts.resolvePhone\",\"params\":[{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":447879488,\"method\":\"phone.getGroupCallStreamChannels\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"phone.GroupCallStreamChannels\"},{\"id\":-558650433,\"method\":\"phone.getGroupCallStreamRtmpUrl\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"revoke\",\"type\":\"Bool\"}],\"type\":\"phone.GroupCallStreamRtmpUrl\"},{\"id\":276705696,\"method\":\"messages.searchSentMedia\",\"params\":[{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":385663691,\"method\":\"messages.getAttachMenuBots\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"AttachMenuBots\"},{\"id\":1998676370,\"method\":\"messages.getAttachMenuBot\",\"params\":[{\"name\":\"bot\",\"type\":\"InputUser\"}],\"type\":\"AttachMenuBotsBot\"},{\"id\":1777704297,\"method\":\"messages.toggleBotInAttachMenu\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"write_allowed\",\"type\":\"flags.0?true\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":395003915,\"method\":\"messages.requestWebView\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"from_bot_menu\",\"type\":\"flags.4?true\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"url\",\"type\":\"flags.1?string\"},{\"name\":\"start_param\",\"type\":\"flags.3?string\"},{\"name\":\"theme_params\",\"type\":\"flags.2?DataJSON\"},{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.9?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"WebViewResult\"},{\"id\":2146648841,\"method\":\"messages.prolongWebView\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.9?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Bool\"},{\"id\":698084494,\"method\":\"messages.requestSimpleWebView\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"theme_params\",\"type\":\"flags.0?DataJSON\"},{\"name\":\"platform\",\"type\":\"string\"}],\"type\":\"SimpleWebViewResult\"},{\"id\":172168437,\"method\":\"messages.sendWebViewResultMessage\",\"params\":[{\"name\":\"bot_query_id\",\"type\":\"string\"},{\"name\":\"result\",\"type\":\"InputBotInlineResult\"}],\"type\":\"WebViewMessageSent\"},{\"id\":-603831608,\"method\":\"messages.sendWebViewData\",\"params\":[{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"button_text\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":1157944655,\"method\":\"bots.setBotMenuButton\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"button\",\"type\":\"BotMenuButton\"}],\"type\":\"Bool\"},{\"id\":-1671369944,\"method\":\"bots.getBotMenuButton\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"BotMenuButton\"},{\"id\":-510647672,\"method\":\"account.getSavedRingtones\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.SavedRingtones\"},{\"id\":1038768899,\"method\":\"account.saveRingtone\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"account.SavedRingtone\"},{\"id\":-2095414366,\"method\":\"account.uploadRingtone\",\"params\":[{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"file_name\",\"type\":\"string\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":2021942497,\"method\":\"bots.setBotBroadcastDefaultAdminRights\",\"params\":[{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"}],\"type\":\"Bool\"},{\"id\":-1839281686,\"method\":\"bots.setBotGroupDefaultAdminRights\",\"params\":[{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"}],\"type\":\"Bool\"},{\"id\":1092913030,\"method\":\"phone.saveCallLog\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"file\",\"type\":\"InputFile\"}],\"type\":\"Bool\"},{\"id\":-456419968,\"method\":\"channels.toggleJoinToSend\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":1277789622,\"method\":\"channels.toggleJoinRequest\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":261206117,\"method\":\"payments.exportInvoice\",\"params\":[{\"name\":\"invoice_media\",\"type\":\"InputMedia\"}],\"type\":\"payments.ExportedInvoice\"},{\"id\":647928393,\"method\":\"messages.transcribeAudio\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"messages.TranscribedAudio\"},{\"id\":2132608815,\"method\":\"messages.rateTranscribedAudio\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"transcription_id\",\"type\":\"long\"},{\"name\":\"good\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-2131921795,\"method\":\"payments.assignAppStoreTransaction\",\"params\":[{\"name\":\"receipt\",\"type\":\"bytes\"},{\"name\":\"purpose\",\"type\":\"InputStorePaymentPurpose\"}],\"type\":\"Updates\"},{\"id\":-537046829,\"method\":\"payments.assignPlayMarketTransaction\",\"params\":[{\"name\":\"receipt\",\"type\":\"DataJSON\"},{\"name\":\"purpose\",\"type\":\"InputStorePaymentPurpose\"}],\"type\":\"Updates\"},{\"id\":-1614700874,\"method\":\"payments.canPurchasePremium\",\"params\":[{\"name\":\"purpose\",\"type\":\"InputStorePaymentPurpose\"}],\"type\":\"Bool\"},{\"id\":-1206152236,\"method\":\"help.getPremiumPromo\",\"params\":[],\"type\":\"help.PremiumPromo\"},{\"id\":-643100844,\"method\":\"messages.getCustomEmojiDocuments\",\"params\":[{\"name\":\"document_id\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-67329649,\"method\":\"messages.getEmojiStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.AllStickers\"},{\"id\":248473398,\"method\":\"messages.getFeaturedEmojiStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":-70001045,\"method\":\"account.updateEmojiStatus\",\"params\":[{\"name\":\"emoji_status\",\"type\":\"EmojiStatus\"}],\"type\":\"Bool\"},{\"id\":-696962170,\"method\":\"account.getDefaultEmojiStatuses\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.EmojiStatuses\"},{\"id\":257392901,\"method\":\"account.getRecentEmojiStatuses\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.EmojiStatuses\"},{\"id\":404757166,\"method\":\"account.clearRecentEmojiStatuses\",\"params\":[],\"type\":\"Bool\"},{\"id\":1063567478,\"method\":\"messages.reportReaction\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"reaction_peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-1149164102,\"method\":\"messages.getTopReactions\",\"params\":[{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Reactions\"},{\"id\":960896434,\"method\":\"messages.getRecentReactions\",\"params\":[{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Reactions\"},{\"id\":-1644236876,\"method\":\"messages.clearRecentReactions\",\"params\":[],\"type\":\"Bool\"},{\"id\":-2064119788,\"method\":\"messages.getExtendedMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":767062953,\"method\":\"auth.importWebTokenAuthorization\",\"params\":[{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"web_auth_token\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":-279966037,\"method\":\"account.reorderUsernames\",\"params\":[{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":1490465654,\"method\":\"account.toggleUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"},{\"name\":\"active\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-1268978403,\"method\":\"channels.reorderUsernames\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":1358053637,\"method\":\"channels.toggleUsername\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"username\",\"type\":\"string\"},{\"name\":\"active\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":170155475,\"method\":\"channels.deactivateAllUsernames\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Bool\"},{\"id\":-1540781271,\"method\":\"channels.toggleForum\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":-200539612,\"method\":\"channels.createForumTopic\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"icon_color\",\"type\":\"flags.0?int\"},{\"name\":\"icon_emoji_id\",\"type\":\"flags.3?long\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"send_as\",\"type\":\"flags.2?InputPeer\"}],\"type\":\"Updates\"},{\"id\":233136337,\"method\":\"channels.getForumTopics\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"q\",\"type\":\"flags.0?string\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_topic\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ForumTopics\"},{\"id\":-1333584199,\"method\":\"channels.getForumTopicsByID\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"topics\",\"type\":\"Vector\"}],\"type\":\"messages.ForumTopics\"},{\"id\":-186670715,\"method\":\"channels.editForumTopic\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"topic_id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"icon_emoji_id\",\"type\":\"flags.1?long\"},{\"name\":\"closed\",\"type\":\"flags.2?Bool\"},{\"name\":\"hidden\",\"type\":\"flags.3?Bool\"}],\"type\":\"Updates\"},{\"id\":1814925350,\"method\":\"channels.updatePinnedForumTopic\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"topic_id\",\"type\":\"int\"},{\"name\":\"pinned\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":876830509,\"method\":\"channels.deleteTopicHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"top_msg_id\",\"type\":\"int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":693150095,\"method\":\"channels.reorderPinnedForumTopics\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"force\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":1760814315,\"method\":\"channels.toggleAntiSpam\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":-1471109485,\"method\":\"channels.reportAntiSpamFalsePositive\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-1632299963,\"method\":\"messages.setDefaultHistoryTTL\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1703637384,\"method\":\"messages.getDefaultHistoryTTL\",\"params\":[],\"type\":\"DefaultHistoryTTL\"},{\"id\":-127582169,\"method\":\"contacts.exportContactToken\",\"params\":[],\"type\":\"ExportedContactToken\"},{\"id\":318789512,\"method\":\"contacts.importContactToken\",\"params\":[{\"name\":\"token\",\"type\":\"string\"}],\"type\":\"User\"},{\"id\":-1189444673,\"method\":\"photos.uploadContactProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"suggest\",\"type\":\"flags.3?true\"},{\"name\":\"save\",\"type\":\"flags.4?true\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"file\",\"type\":\"flags.0?InputFile\"},{\"name\":\"video\",\"type\":\"flags.1?InputFile\"},{\"name\":\"video_start_ts\",\"type\":\"flags.2?double\"}],\"type\":\"photos.Photo\"},{\"id\":1785624660,\"method\":\"channels.toggleParticipantsHidden\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"}]},\"layer\":151} as {\n MTProto: {\n constructors: MTProtoConstructor[],\n methods: MTProtoMethod[],\n constructorsIndex?: {[id: number]: number}\n },\n API: {\n constructors: MTProtoConstructor[],\n methods: MTProtoMethod[],\n constructorsIndex?: {[id: number]: number}\n },\n layer: number,\n};\n","export default 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","import bigInt from 'big-integer';\nimport intToUint from '../number/intToUint';\n\nexport default function ulongFromInts(high: number, low: number) {\n high = intToUint(high), low = intToUint(low);\n return bigInt(high).shiftLeft(32).add(bigInt(low));\n}\n","import bigInt from 'big-integer';\n\nexport const safeBigInt = bigInt(Number.MAX_SAFE_INTEGER);\nexport const ulongBigInt = bigInt(bigInt[2]).pow(64);\nexport const longBigInt = ulongBigInt.divide(bigInt[2]);\n","import bigInt from 'big-integer';\nimport { longBigInt, ulongBigInt } from './bigIntConstants';\n\nexport function bigIntFromBytes(bytes: Uint8Array | number[], base = 256) {\n return bigInt.fromArray(bytes instanceof Uint8Array ? [...bytes] : bytes, base);\n}\n\nexport function bigIntToBytes(bigInt: bigInt.BigInteger) {\n return new Uint8Array(bigInt.toArray(256).value);\n}\n\nexport function bigIntToSigned(bigInt: bigInt.BigInteger) {\n return bigInt.greater(longBigInt) ? bigInt.minus(ulongBigInt) : bigInt;\n}\n\nexport function bigIntToUnsigned(bigInt: bigInt.BigInteger) {\n return bigInt.isNegative() ? ulongBigInt.add(bigInt) : bigInt;\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 Schema, {MTProtoConstructor} from './schema';\nimport {JSONValue} from '../../layer';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport isObject from '../../helpers/object/isObject';\nimport gzipUncompress from '../../helpers/gzipUncompress';\nimport bigInt from 'big-integer';\nimport ulongFromInts from '../../helpers/long/ulongFromInts';\nimport {safeBigInt} from '../../helpers/bigInt/bigIntConstants';\nimport {bigIntToSigned, bigIntToUnsigned} from '../../helpers/bigInt/bigIntConversion';\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// * using slice to have a new buffer, otherwise the buffer will be copied to main thread\nconst sliceMethod: 'slice' | 'subarray' = 'slice'; // subarray\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 const _bigInt = bigIntToUnsigned(bigInt(sLong as string));\n const {quotient, remainder} = _bigInt.divmod(0x100000000);\n const high = quotient.toJSNumber();\n const low = remainder.toJSNumber();\n\n this.writeInt(low, (field || '') + ':long[low]');\n this.writeInt(high, (field || '') + ':long[high]');\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(const 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(const 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 /* public setMtproto(mtproto: boolean) {\n this.mtproto = mtproto;\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 bytesToHex(this.byteView.slice(this.offset - 16, this.offset + 16)));\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 // ! it should've been signed\n public fetchLong(field?: string): FetchLongAs {\n const iLow = this.readInt((field || '') + ':long[low]');\n const iHigh = this.readInt((field || '') + ':long[high]');\n\n let ulong = ulongFromInts(iHigh, iLow);\n if(/* !unsigned && */!this.mtproto) { // make it signed\n ulong = bigIntToSigned(ulong);\n }\n\n if(!this.mtproto) {\n if(safeBigInt.greaterOrEquals(ulong.abs())) {\n // @ts-ignore\n return ulong.toJSNumber();\n }\n }\n\n // @ts-ignore\n return ulong.toString(10);\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[sliceMethod](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[sliceMethod](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[sliceMethod](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 continue;\n }\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 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","// export function gzipUncompress(bytes: ArrayBuffer, toString: true): string;\n\n// @ts-ignore\nimport pako from 'pako/dist/pako_inflate.min.js';\n// import dT from './dT';\n\n// export function gzipUncompress(bytes: ArrayBuffer, toString?: false): Uint8Array;\nexport default 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","import randomize from '../array/randomize';\nimport bufferConcats from './bufferConcats';\n\nexport default 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 randomize(padding);\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 * 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 {TLDeserialization, TLSerialization} from './tl_utils';\nimport CryptoWorker from '../crypto/cryptoMessagePort';\nimport sessionStorage from '../sessionStorage';\nimport Schema from './schema';\nimport {NetworkerFactory} from './networkerFactory';\nimport {logger, LogTypes} from '../logger';\nimport {InvokeApiOptions} from '../../types';\nimport longToBytes from '../../helpers/long/longToBytes';\nimport MTTransport from './transports/transport';\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 bigInt from 'big-integer';\nimport {ConnectionStatus} from './connectionStatus';\nimport ctx from '../../environment/ctx';\nimport bufferConcats from '../../helpers/bytes/bufferConcats';\nimport bytesCmp from '../../helpers/bytes/bytesCmp';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport convertToUint8Array from '../../helpers/bytes/convertToUint8Array';\nimport isObject from '../../helpers/object/isObject';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport sortLongsArray from '../../helpers/long/sortLongsArray';\nimport randomize from '../../helpers/array/randomize';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport pause from '../../helpers/schedulers/pause';\nimport {getEnvironment} from '../../environment/utils';\nimport {TimeManager} from './timeManager';\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 // withResult: 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?: CancellablePromise,\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 DRAIN_TIMEOUT = 10000;\nconst delays: {\n [k in 'client' | 'file']: {\n disconnectDelayMin: number,\n disconnectDelayMax: number,\n pingInterval: number,\n pingMaxTime: number,\n connectionTimeout: number\n }\n} = {\n client: {\n disconnectDelayMin: 7,\n disconnectDelayMax: 20,\n pingInterval: 2000,\n pingMaxTime: 5,\n connectionTimeout: 5000\n },\n file: {\n disconnectDelayMin: 10,\n disconnectDelayMax: 24,\n pingInterval: 3000,\n pingMaxTime: 7,\n connectionTimeout: 7500\n }\n};\nconst RESEND_OPTIONS: MTMessageOptions = {\n noSchedule: true,\n notContentRelated: true\n};\nlet invokeAfterMsgConstructor: number;\nlet networkerTempId = 0;\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 pendingResendReq: MTLong[] = [];\n // private pendingResendAnsReq: MTLong[] = [];\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 reqMsgId: MTLong,\n msgIds: MTPNetworker['pendingResendReq']\n };\n // private lastResendAnsReq: MTPNetworker['lastResendReq'];\n\n private name: string;\n private log: ReturnType;\n\n public isOnline = false;\n private 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 \n private pingDelayDisconnectDeferred: CancellablePromise;\n private pingPromise: Promise;\n // private pingInterval: number;\n private lastPingTime: number;\n private lastPingStartTime: number;\n private lastPingDelayDisconnectId: string;\n \n // public onConnectionStatusChange: (online: boolean) => void;\n\n // private debugRequests: Array<{before: Uint8Array, after: Uint8Array}> = [];\n\n private delays: typeof delays[keyof typeof delays];\n // private getNewTimeOffset: boolean;\n\n constructor(\n private networkerFactory: NetworkerFactory,\n private timeManager: TimeManager,\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 this.delays = this.isFileNetworker ? delays.file : delays.client;\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 + (suffix ? '' : '-C') + '-' + networkerTempId++, LogTypes.Log/* | LogTypes.Debug */ | LogTypes.Error | LogTypes.Warn);\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\n private updateSession() {\n this.seqNo = 0;\n this.prevSessionId = this.sessionId;\n this.sessionId = randomize(new Uint8Array(8));\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 = this.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 = this.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 = this.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(getEnvironment().USER_AGENT || '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(this.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 = this.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 if(this.nextReqTimeout) {\n clearTimeout(this.nextReqTimeout);\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n }\n\n this.connectionInited = false;\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.log('change transport', transport, oldTransport);\n\n \n this.clearPingDelayDisconnect();\n\n // if(this.pingInterval !== undefined) {\n // clearInterval(this.pingInterval);\n // this.pingInterval = undefined;\n // }\n\n // this.clearPing();\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 \n // * handle outcoming dead socket, server will close the connection\n if((transport as TcpObfuscated).connection) {\n // this.sendPingDelayDisconnect();\n\n if(transport.connected) {\n this.setConnectionStatus(ConnectionStatus.Connected);\n }\n\n // this.pingInterval = ctx.setInterval(this.sendPing, PING_INTERVAL);\n // this.sendPing();\n }\n \n\n this.resend();\n }\n\n public destroy() {\n this.log('destroy');\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 clearPing() {\n if(this.pingPromise) {\n this.pingPromise = undefined;\n }\n\n this.lastPingTime = undefined;\n }\n\n private sendPing = () => {\n // return;\n\n // if(!(this.transport as TcpObfuscated).connected) {\n // this.clearPing();\n // return;\n // }\n\n if(this.pingPromise) {\n return;\n }\n\n const startTime = Date.now();\n this.log('sendPing: ping', startTime);\n const promise = this.pingPromise = this.wrapMtpCall('ping', {\n ping_id: randomLong()\n }, {\n notContentRelated: true\n }).then(() => {\n const elapsedTime = Date.now() - startTime;\n this.lastPingTime = elapsedTime / 1000;\n this.log('sendPing: pong', elapsedTime);\n\n setTimeout(() => {\n if(this.pingPromise !== promise) {\n return;\n }\n\n this.pingPromise = undefined;\n this.sendPing();\n }, Math.max(0, PING_INTERVAL - elapsedTime));\n });\n }; */\n\n private clearPingDelayDisconnect() {\n const deferred = this.pingDelayDisconnectDeferred;\n this.pingDelayDisconnectDeferred = undefined;\n this.lastPingDelayDisconnectId = undefined;\n\n if(deferred) {\n deferred.reject();\n }\n }\n\n private sendPingDelayDisconnect = () => {\n // return;\n\n if(this.pingDelayDisconnectDeferred || !this.transport || !this.transport.connected) 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.pingDelayDisconnectDeferred = deferredPromise();\n const delays = this.delays;\n const pingMaxTime = this.delays.pingMaxTime;\n const lastPingTime = Math.min(this.lastPingTime ?? 0, pingMaxTime);\n const disconnectDelay = Math.round(delays.disconnectDelayMin + lastPingTime / pingMaxTime * (delays.disconnectDelayMax - delays.disconnectDelayMin));\n const timeoutTime = disconnectDelay * 1000;\n const startTime = this.lastPingStartTime = Date.now();\n const pingId = this.lastPingDelayDisconnectId = randomLong();\n const options: MTMessageOptions = {notContentRelated: true};\n this.wrapMtpCall('ping_delay_disconnect', {\n ping_id: pingId,\n disconnect_delay: disconnectDelay\n }, options);\n\n const log = this.log.bindPrefix('sendPingDelayDisconnect');\n this.debug && log.debug(`ping, timeout=${timeoutTime}, lastPingTime=${this.lastPingTime}, msgId=${options.messageId}, pingId=${pingId}`);\n const rejectTimeout = ctx.setTimeout(deferred.reject, timeoutTime);\n\n const onResolved = (reason: string) => {\n clearTimeout(rejectTimeout);\n const elapsedTime = Date.now() - startTime;\n this.lastPingTime = elapsedTime / 1000;\n this.debug && log.debug(`pong, reason='${reason}', time=${lastPingTime}, msgId=${options.messageId}`);\n if(elapsedTime > timeoutTime) {\n throw undefined;\n } else {\n return pause(Math.max(0, this.delays.pingInterval - elapsedTime/* timeoutTime - elapsedTime - PING_INTERVAL */));\n }\n };\n\n const onTimeout = () => {\n clearTimeout(rejectTimeout);\n const transport = this.transport as TcpObfuscated;\n if(this.pingDelayDisconnectDeferred !== deferred || !transport?.connection) {\n return;\n }\n\n log.error('catch, closing connection', this.lastPingTime, options.messageId);\n transport.connection.close();\n };\n\n const onFinally = () => {\n if(this.pingDelayDisconnectDeferred !== deferred) {\n return;\n }\n\n this.pingDelayDisconnectDeferred = undefined;\n this.sendPingDelayDisconnect();\n };\n\n deferred\n .then(onResolved)\n .catch(onTimeout)\n .finally(onFinally);\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 // notContentRelated: 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: this.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 const sentMessages = this.sentMessages;\n noResponseMsgs.forEach((msgId) => {\n const sentMessage = sentMessages[msgId];\n if(sentMessage) {\n const deferred = sentMessage.deferred;\n delete 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 let promise: CancellablePromise;\n if(!options.notContentRelated || options.noResponse) {\n promise = deferredPromise();\n }\n\n this.sentMessages[message.msg_id] = Object.assign(\n message,\n options,\n promise ? {deferred: promise} : undefined\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 return promise;\n }\n\n public attachPromise(promise: Promise, message: MTMessage) {\n const canIncrement = true;\n const timeout = setTimeout(() => {\n if(this.lastResponseTime && (Date.now() - this.lastResponseTime) < this.delays.connectionTimeout) {\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 }, this.delays.connectionTimeout);\n\n promise.catch(noop).finally(() => {\n clearTimeout(timeout);\n this.setConnectionStatus(ConnectionStatus.Connected);\n\n if(canIncrement) {\n --this.activeRequests;\n this.setDrainTimeout();\n }\n });\n\n if(canIncrement) {\n ++this.activeRequests;\n if(this.onDrainTimeout !== undefined) {\n clearTimeout(this.onDrainTimeout);\n this.onDrainTimeout = undefined;\n }\n }\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(this.networkerFactory.onConnectionStatusChange) {\n this.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)?.connection) {\n this.clearPingDelayDisconnect();\n this.sendPingDelayDisconnect();\n }\n\n // this.getNewTimeOffset = true;\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', 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', 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', 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 this.networkerFactory.akStopped && !this.isFileNetworker;\n }\n\n private performScheduledRequest() {\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 const pendingResendReqLength = this.pendingResendReq.length;\n if(pendingResendReqLength) {\n const options: MTMessageOptions = {...RESEND_OPTIONS};\n const msgIds = this.pendingResendReq.splice(0, pendingResendReqLength);\n this.wrapMtpMessage({\n _: 'msg_resend_req',\n msg_ids: msgIds\n }, options);\n\n this.log('resend: resending requests', options.messageId, msgIds);\n /* this.lastResendReq = {\n reqMsgId: options.messageId,\n msgIds: msgIds\n }; */\n\n // this.pendingResendReq.length = 0;\n }\n\n // if(this.pendingResendAnsReq.length) {\n // const options: MTMessageOptions = {...RESEND_OPTIONS};\n // const msgIds = this.pendingResendAnsReq.slice();\n // this.wrapMtpMessage({\n // _: 'msg_resend_ans_req',\n // msg_ids: msgIds\n // }, options);\n\n // this.log('resend: requesting answers', options.messageId, msgIds);\n // this.lastResendAnsReq = {\n // reqMsgId: options.messageId,\n // msgIds: msgIds\n // };\n\n // // this.pendingResendAnsReq.length = 0;\n // }\n\n let outMessage: MTMessage;\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: this.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: this.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 || */randomize(new Uint8Array(paddingLength))/* .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 async sendEncryptedRequest(message: MTMessage) {\n const requestData = await this.getEncryptedOutput(message);\n\n if(!this.transport) {\n this.log.error('trying to send something when offline', this.transport, this);\n }\n\n this.debug && this.log.debug('sending:', message, [message.msg_id].concat(message.inner || []), requestData.length);\n const promise: Promise = this.transport ? this.transport.send(requestData) as any : Promise.reject({});\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: ApiError = {\n code: 406,\n type: 'NETWORK_BAD_RESPONSE',\n // @ts-ignore\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 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: ' + bytesToHex(authKeyId));\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 // deserializer.setMtproto(false);\n result.result = deserializer.fetchObject(type, field + '[result]');\n // deserializer.setMtproto(true);\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 = ctx.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 reqResend(msgId: MTLong/* , isAnswer?: boolean */) {\n if(this.debug) {\n this.log.debug('Req resend', msgId/* , isAnswer */);\n }\n\n // (isAnswer ? this.pendingResendAnsReq : this.pendingResendReq).push(msgId);\n this.pendingResendReq.push(msgId);\n this.scheduleRequest(100);\n }\n\n public cleanupSent() {\n let notEmpty = false;\n const sentMessages = this.sentMessages;\n // this.log('clean start', this.dcId/*, sentMessages*/)\n Object.keys(sentMessages).forEach((msgId) => {\n const message = 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 sentMessages[msgId];\n } else if(message.container) {\n for(const innerMsgId of message.inner) {\n if(sentMessages[innerMsgId] !== undefined) {\n // this.log('clean failed, found', msgID, message.inner[i], sentMessages[message.inner[i]].seq_no)\n notEmpty = true;\n return;\n }\n }\n // this.log('clean container', msgID)\n delete 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}): ApiError {\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] as any || '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 const sentMessages = this.sentMessages;\n for(const id in sentMessages) {\n const msg = sentMessages[id];\n if(msg.body || msg.container) {\n this.pushResend(id);\n }\n }\n\n if((this.transport as TcpObfuscated).connection) {\n this.clearPingDelayDisconnect();\n this.sendPingDelayDisconnect();\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 private applyServerTime(messageId: string) {\n const serverTime = bigInt(messageId).shiftRight(32).toJSNumber();\n this.log('applying server time', serverTime);\n return this.timeManager.applyServerTime(serverTime);\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.debug('process message', message, messageId);\n }\n\n if(this.pingDelayDisconnectDeferred) {\n this.pingDelayDisconnectDeferred.resolve('any message');\n }\n\n // let changedTimeOffset: boolean;\n // if(this.getNewTimeOffset) {\n // changedTimeOffset = this.applyServerTime(messageId);\n // this.getNewTimeOffset = undefined;\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 // if(changedTimeOffset === undefined) {\n // changedTimeOffset = this.applyServerTime(messageId);\n // }\n\n const changedTimeOffset = this.applyServerTime(messageId);\n if(message.error_code === 17 || changedTimeOffset) {\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 && this.networkerFactory.updatesProcessor) {\n this.networkerFactory.updatesProcessor(message);\n }\n });\n break;\n }\n\n case 'msgs_ack': {\n this.debug && this.log('got acks', message.msg_ids);\n for(const msgId of message.msg_ids) {\n this.processMessageAck(msgId);\n }\n\n break;\n }\n\n case 'msg_detailed_info': {\n const sentMessage = this.sentMessages[message.msg_id];\n if(!sentMessage) {\n this.ackMessage(message.answer_msg_id);\n break;\n }/* else if(sentMessage.acked) {\n this.reqResend(message.answer_msg_id, true);\n }\n\n break; */\n }\n\n case 'msg_new_detailed_info': {\n if(this.pendingAcks.indexOf(message.answer_msg_id) !== -1) {\n break;\n }\n\n this.reqResend(message.answer_msg_id);\n break;\n }\n\n case 'msgs_state_info': {\n this.ackMessage(message.answer_msg_id);\n const arr = [\n [this.lastResendReq, this.pendingResendReq] as const\n // [this.lastResendAnsReq, this.pendingResendAnsReq] as const\n ];\n\n for(const [lastResend, pendingResend] of arr) {\n if(lastResend?.reqMsgId === message.req_msg_id && pendingResend.length) {\n for(const badMsgId of lastResend.msgIds) {\n const pos = pendingResend.indexOf(badMsgId);\n if(pos !== -1) {\n pendingResend.splice(pos, 1);\n }\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 if(this.debug) {\n this.log('Rpc response', message.result, sentMessage);\n }\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 deferred.resolve(message.result);\n }\n\n if(sentMessage.isAPI && !this.connectionInited) {\n this.connectionInited = true;\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 const pingId = message.ping_id;\n if(this.lastPingDelayDisconnectId === pingId) {\n const deferred = this.pingDelayDisconnectDeferred;\n if(deferred) {\n deferred.resolve('pong');\n } else {\n this.log('ping deferred deleted', pingId);\n }\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(this.networkerFactory.updatesProcessor !== null) {\n this.networkerFactory.updatesProcessor(message);\n }\n break;\n }\n }\n}\n","import bigInt from 'big-integer';\n\nexport default function sortLongsArray(arr: string[]) {\n return arr.map((long) => {\n return bigInt(long);\n }).sort((a, b) => {\n return a.compare(b);\n }).map((bigInt) => {\n return bigInt.toString(10);\n });\n}\n","import addPadding from '../bytes/addPadding';\nimport bigInt from 'big-integer';\nimport {bigIntToBytes} from '../bigInt/bigIntConversion';\n\nexport default function longToBytes(sLong: string) {\n const bigIntBytes = bigIntToBytes(bigInt(sLong)).reverse();\n const bytes = addPadding(bigIntBytes, 8, true, false, false);\n // console.log('longToBytes', bytes, bigIntBytes);\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 * 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 {ConnectionStatusChange} from './connectionStatus';\nimport MTPNetworker from './networker';\nimport {InvokeApiOptions} from '../../types';\nimport App from '../../config/app';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport {AppManager} from '../appManagers/manager';\n\nexport class NetworkerFactory extends AppManager {\n private networkers: MTPNetworker[] = [];\n public language = navigator.language || App.langPackCode;\n public updatesProcessor: (obj: any) => void = null;\n // public onConnectionStatusChange: (status: ConnectionStatusChange) => void = null;\n public akStopped = false;\n\n public onConnectionStatusChange(status: ConnectionStatusChange) {\n this.rootScope.dispatchEvent('connection_status_change', status);\n // ({type: 'connectionStatusChange', payload: status});\n }\n\n public removeNetworker(networker: MTPNetworker) {\n indexOfAndSplice(this.networkers, networker);\n }\n\n public setUpdatesProcessor(callback: (obj: any) => void) {\n this.updatesProcessor = callback;\n }\n\n public getNetworker(dcId: number, authKey: Uint8Array, authKeyId: Uint8Array, serverSalt: Uint8Array, options: InvokeApiOptions) {\n // console.log('NetworkerFactory: creating new instance of MTPNetworker:', dcId, options);\n const networker = new MTPNetworker(this, this.timeManager, dcId, authKey, authKeyId, serverSalt, options);\n this.networkers.push(networker);\n return networker;\n }\n\n public startAll() {\n if(this.akStopped) {\n const stoppedNetworkers = this.networkers.filter((networker) => networker.isStopped());\n\n this.akStopped = false;\n this.updatesProcessor && this.updatesProcessor({_: 'new_session_created'});\n\n for(const networker of stoppedNetworkers) {\n networker.scheduleRequest();\n }\n }\n }\n\n public stopAll() {\n this.akStopped = true;\n }\n\n public setLanguage(langCode: string) {\n this.language = langCode;\n for(const networker of this.networkers) {\n if(!networker.isFileNetworker) {\n networker.connectionInited = false;\n }\n }\n }\n\n public unsetConnectionInited() {\n for(const networker of this.networkers) {\n networker.connectionInited = false;\n }\n }\n\n public forceReconnectTimeout() {\n for(const networker of this.networkers) {\n networker.forceReconnectTimeout();\n }\n }\n\n public forceReconnect() {\n for(const networker of this.networkers) {\n if(!networker.isFileNetworker) {\n networker.forceReconnect();\n break;\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 * 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} from './tl_utils';\nimport cryptoWorker from '../crypto/cryptoMessagePort';\nimport Modes from '../../config/modes';\nimport bytesFromHex from '../../helpers/bytes/bytesFromHex';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport bigInt from 'big-integer';\n\nexport type RSAPublicKeyHex = {\n modulus: string,\n exponent: string\n};\n\nexport class RSAKeysManager {\n /**\n * Server public key, obtained from here: https://core.telegram.org/api/obtaining_api_id\n *\n *\n * -----BEGIN RSA PUBLIC KEY-----\n * MIIBCgKCAQEA6LszBcC1LGzyr992NzE0ieY+BSaOW622Aa9Bd4ZHLl+TuFQ4lo4g\n * 5nKaMBwK/BIb9xUfg0Q29/2mgIR6Zr9krM7HjuIcCzFvDtr+L0GQjae9H0pRB2OO\n * 62cECs5HKhT5DZ98K33vmWiLowc621dQuwKWSQKjWf50XYFw42h21P2KXUGyp2y/\n * +aEyZ+uVgLLQbRA1dEjSDZ2iGRy12Mk5gpYc397aYp438fsJoHIgJ2lgMv5h7WY9\n * t6N/byY9Nw9p21Og3AoXSL2q/2IJ1WRUhebgAdGVMlV1fkuOQoEzR7EdpqtQD9Cs\n * 5+bfo3Nhmcyvk5ftB0WkJ9z6bNZ7yxrP8wIDAQAB\n * -----END RSA PUBLIC KEY-----\n *\n * -----BEGIN RSA PUBLIC KEY-----\n * MIIBCgKCAQEBadMIUYSKhyznMh+Pg+OxTLyDZrWEjQIPZC3oJCtuZX7qUxgcWqFX\n * Q1952TSY8S8NYuz12sK9Fvp+lil1hIG0U/cuPsK08VB1hB4VA+p0S46fGwVsRovq\n * 4qUiUIzQSjSHDASuXTOinlYEHwmg/GaLc5G7qhePWa0p9YmqYR5Ha3xHJywcXZrn\n * yE3nC9igL96Aanqv+Prbu1N+r9vAgZeHh9cfbtbV8WWwruOANOTEv2ctQLR0dfr9\n * MwQXNePTPQlYsO9HNIGS1LWe7hZFtGBAVJH92F7Kig68WqHM3PIZ6Sq7N0VSzfzL\n * b11Z/YHz2UXYtXADwL/m5pTpKBUtJBXkOQIDAQAB\n * -----END RSA PUBLIC KEY-----\n *\n * Bytes can be got via\n * $ openssl rsa -in rsa.pem -RSAPublicKey_in -pubout > pub.pem\n * $ openssl rsa -pubin -in pub.pem -text -noout\n */\n\n /* private publisKeysHex = [{\n modulus: 'c150023e2f70db7985ded064759cfecf0af328e69a41daf4d6f01b538135a6f91f8f8b2a0ec9ba9720ce352efcf6c5680ffc424bd634864902de0b4bd6d49f4e580230e3ae97d95c8b19442b3c0a10d8f5633fecedd6926a7f6dab0ddb7d457f9ea81b8465fcd6fffeed114011df91c059caedaf97625f6c96ecc74725556934ef781d866b34f011fce4d835a090196e9a5f0e4449af7eb697ddb9076494ca5f81104a305b6dd27665722c46b60e5df680fb16b210607ef217652e60236c255f6a28315f4083a96791d7214bf64c1df4fd0db1944fb26a2a57031b32eee64ad15a8ba68885cde74a5bfc920f6abf59ba5c75506373e7130f9042da922179251f',\n exponent: '010001'\n }, {\n modulus: 'aeec36c8ffc109cb099624685b97815415657bd76d8c9c3e398103d7ad16c9bba6f525ed0412d7ae2c2de2b44e77d72cbf4b7438709a4e646a05c43427c7f184debf72947519680e651500890c6832796dd11f772c25ff8f576755afe055b0a3752c696eb7d8da0d8be1faf38c9bdd97ce0a77d3916230c4032167100edd0f9e7a3a9b602d04367b689536af0d64b613ccba7962939d3b57682beb6dae5b608130b2e52aca78ba023cf6ce806b1dc49c72cf928a7199d22e3d7ac84e47bc9427d0236945d10dbd15177bab413fbf0edfda09f014c7a7da088dde9759702ca760af2b8e4e97cc055c617bd74c3d97008635b98dc4d621b4891da9fb0473047927',\n exponent: '010001'\n }, {\n modulus: 'bdf2c77d81f6afd47bd30f29ac76e55adfe70e487e5e48297e5a9055c9c07d2b93b4ed3994d3eca5098bf18d978d54f8b7c713eb10247607e69af9ef44f38e28f8b439f257a11572945cc0406fe3f37bb92b79112db69eedf2dc71584a661638ea5becb9e23585074b80d57d9f5710dd30d2da940e0ada2f1b878397dc1a72b5ce2531b6f7dd158e09c828d03450ca0ff8a174deacebcaa22dde84ef66ad370f259d18af806638012da0ca4a70baa83d9c158f3552bc9158e69bf332a45809e1c36905a5caa12348dd57941a482131be7b2355a5f4635374f3bd3ddf5ff925bf4809ee27c1e67d9120c5fe08a9de458b1b4a3c5d0a428437f2beca81f4e2d5ff',\n exponent: '010001'\n }, {\n modulus: 'b3f762b739be98f343eb1921cf0148cfa27ff7af02b6471213fed9daa0098976e667750324f1abcea4c31e43b7d11f1579133f2b3d9fe27474e462058884e5e1b123be9cbbc6a443b2925c08520e7325e6f1a6d50e117eb61ea49d2534c8bb4d2ae4153fabe832b9edf4c5755fdd8b19940b81d1d96cf433d19e6a22968a85dc80f0312f596bd2530c1cfb28b5fe019ac9bc25cd9c2a5d8a0f3a1c0c79bcca524d315b5e21b5c26b46babe3d75d06d1cd33329ec782a0f22891ed1db42a1d6c0dea431428bc4d7aabdcf3e0eb6fda4e23eb7733e7727e9a1915580796c55188d2596d2665ad1182ba7abf15aaa5a8b779ea996317a20ae044b820bff35b6e8a1',\n exponent: '010001'\n }, {\n modulus: 'be6a71558ee577ff03023cfa17aab4e6c86383cff8a7ad38edb9fafe6f323f2d5106cbc8cafb83b869cffd1ccf121cd743d509e589e68765c96601e813dc5b9dfc4be415c7a6526132d0035ca33d6d6075d4f535122a1cdfe017041f1088d1419f65c8e5490ee613e16dbf662698c0f54870f0475fa893fc41eb55b08ff1ac211bc045ded31be27d12c96d8d3cfc6a7ae8aa50bf2ee0f30ed507cc2581e3dec56de94f5dc0a7abee0be990b893f2887bd2c6310a1e0a9e3e38bd34fded2541508dc102a9c9b4c95effd9dd2dfe96c29be647d6c69d66ca500843cfaed6e440196f1dbe0e2e22163c61ca48c79116fa77216726749a976a1c4b0944b5121e8c01',\n exponent: '010001'\n }]; */\n\n private testPublicKeysHex: RSAPublicKeyHex[] = [{\n modulus: 'c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5',\n exponent: '010001'\n }];\n\n private publisKeysHex: RSAPublicKeyHex[] = [{\n // modulus: '00e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\n modulus: 'e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\n exponent: '010001'\n }];\n\n private publicKeysParsed: {\n [hex: string]: RSAPublicKeyHex\n } = {};\n private prepared = false;\n private preparePromise: Promise = null;\n\n constructor() {\n if(Modes.test) {\n this.publisKeysHex = this.testPublicKeysHex;\n }\n }\n\n public prepare(): Promise {\n if(this.preparePromise) return this.preparePromise;\n else if(this.prepared) {\n return Promise.resolve();\n }\n\n return this.preparePromise = Promise.all(this.publisKeysHex.map((keyParsed) => {\n const RSAPublicKey = new TLSerialization();\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.modulus), 'n');\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.exponent), 'e');\n\n const buffer = RSAPublicKey.getBuffer();\n\n return cryptoWorker.invokeCrypto('sha1', buffer).then((bytes) => {\n const fingerprintBytes = bytes.slice(-8);\n fingerprintBytes.reverse();\n\n this.publicKeysParsed[bytesToHex(fingerprintBytes).toLowerCase()] = {\n modulus: keyParsed.modulus,\n exponent: keyParsed.exponent\n };\n });\n })).then(() => {\n this.prepared = true;\n\n // console.log('[MT] Prepared keys');\n this.preparePromise = null;\n });\n }\n\n public async select(fingerprints: Array) {\n await this.prepare();\n\n for(let i = 0; i < fingerprints.length; ++i) {\n let fingerprintHex = bigInt(fingerprints[i]).toString(16).toLowerCase();\n\n if(fingerprintHex.length < 16) {\n fingerprintHex = new Array(16 - fingerprintHex.length).fill('0').join('') + fingerprintHex;\n }\n\n // console.log(fingerprintHex, this.publicKeysParsed);\n const foundKey = this.publicKeysParsed[fingerprintHex];\n if(foundKey) {\n return Object.assign({\n fingerprint: fingerprints[i]\n }, foundKey);\n }\n }\n }\n}\n\nexport default new RSAKeysManager();\n","export default function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\n const len = bytes1.length;\n const bytes = new Uint8Array(len);\n\n for(let i = 0; i < len; ++i) {\n bytes[i] = bytes1[i] ^ bytes2[i];\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 * 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 \nimport transportController from './transports/controller';\n \n\nimport {TLSerialization, TLDeserialization} from './tl_utils';\nimport {TransportType} from './dcConfigurator';\nimport rsaKeysManager from './rsaKeysManager';\n\nimport CryptoWorker from '../crypto/cryptoMessagePort';\n\nimport {logger, LogTypes} from '../logger';\nimport DEBUG from '../../config/debug';\nimport {Awaited, DcId} from '../../types';\nimport addPadding from '../../helpers/bytes/addPadding';\nimport bytesCmp from '../../helpers/bytes/bytesCmp';\nimport bytesFromHex from '../../helpers/bytes/bytesFromHex';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport bytesXor from '../../helpers/bytes/bytesXor';\nimport {bigIntFromBytes} from '../../helpers/bigInt/bigIntConversion';\nimport bigInt from 'big-integer';\nimport randomize from '../../helpers/array/randomize';\nimport {AppManager} from '../appManagers/manager';\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 extends AppManager {\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 protected after() {\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(this.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 = this.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', bytesToHex(auth.nonce));\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 = randomize(new Uint8Array(32));\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 = randomize(new Uint8Array(32));\n const dataWithHash = dataPadReversed.concat(await CryptoWorker.invokeCrypto('sha256', 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', aesEncrypted));\n const keyAesEncrypted = tempKeyXor.concat(aesEncrypted);\n\n const keyAesEncryptedBigInt = bigIntFromBytes(keyAesEncrypted);\n const publicKeyModulusBigInt = bigInt(auth.publicKey.modulus, 16);\n\n if(keyAesEncryptedBigInt.compare(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', 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', auth.newNonce.concat(auth.serverNonce)))\n .concat((await CryptoWorker.invokeCrypto('sha1', auth.serverNonce.concat(auth.newNonce))).slice(0, 12));\n\n auth.tmpAesIv = (await CryptoWorker.invokeCrypto('sha1', auth.serverNonce.concat(auth.newNonce))).slice(12)\n .concat(await CryptoWorker.invokeCrypto('sha1', 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', answerWithPadding.slice(0, offset)))) {\n throw new Error('[MT] server_DH_inner_data SHA1 mismatch');\n }\n\n this.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 = bigIntFromBytes(gA);\n const dhPrimeBigInt = bigInt(dhPrimeHex, 16);\n\n if(gABigInt.compare(bigInt.one) <= 0) {\n throw new Error('[MT] DH params are not verified: gA <= 1');\n }\n\n if(gABigInt.compare(dhPrimeBigInt.subtract(bigInt.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 twoPow = bigInt(2).pow(2048 - 64);\n\n if(gABigInt.compare(twoPow) < 0) {\n throw new Error('[MT] DH params are not verified: gA < 2^{2048-64}');\n }\n if(gABigInt.compare(dhPrimeBigInt.subtract(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 = randomize(new Uint8Array(256));\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', 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', 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', 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', 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', 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: randomize(new Uint8Array(16))\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","/*\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 {nextRandomUint} from '../../helpers/random';\nimport {WorkerTaskVoidTemplate} from '../../types';\nimport ulongFromInts from '../../helpers/long/ulongFromInts';\nimport {AppManager} from '../appManagers/manager';\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 extends AppManager {\n private lastMessageId: [number, number];\n private timeOffset: number;\n\n /* private midnightNoOffset: number;\n private midnightOffseted: Date;\n\n private midnightOffset: number; */\n\n /* private timeParams: {\n midnightOffset: number,\n serverTimeOffset: number\n }; */\n\n protected after() {\n this.lastMessageId = [0, 0];\n this.timeOffset = 0;\n\n sessionStorage.get('server_time_offset').then((to) => {\n if(to) {\n this.timeOffset = to;\n }\n });\n\n\n // * migrated from ServerTimeManager\n /* const timestampNow = tsNow(true);\n this.midnightNoOffset = timestampNow - (timestampNow % 86400);\n this.midnightOffseted = new Date();\n this.midnightOffseted.setHours(0, 0, 0, 0);\n\n this.midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000)); */\n\n /* this.timeParams = {\n midnightOffset: this.midnightOffset,\n serverTimeOffset: this.serverTimeOffset\n }; */\n }\n\n public getServerTimeOffset() {\n return this.timeOffset;\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 = ulongFromInts(messageId[0], messageId[1]).toString(10);\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 this.lastMessageId = [0, 0];\n\n if(this.timeOffset !== newTimeOffset) {\n sessionStorage.set({\n server_time_offset: newTimeOffset\n });\n\n this.timeOffset = newTimeOffset;\n }\n\n // console.log('[TimeManager]: Apply server time', serverTime, localTime, newTimeOffset, changed);\n\n return changed;\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 {DocumentAttribute, WebDocument} from '../../layer';\n\nexport default class AppWebDocsManager {\n public saveWebDocument(webDocument: WebDocument) {\n if(!webDocument) {\n return;\n }\n\n const attribute: DocumentAttribute.documentAttributeImageSize = webDocument.attributes.find((attribute) => attribute._ === 'documentAttributeImageSize') as any;\n if(attribute) {\n webDocument.w = attribute.w;\n webDocument.h = attribute.h;\n }\n\n return webDocument;\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 {InputInvoice, InputPaymentCredentials, PaymentRequestedInfo, PaymentsPaymentForm} from '../../layer';\nimport {AppManager} from './manager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\n\nexport default class AppPaymentsManager extends AppManager {\n public getInputInvoiceBySlug(slug: string): InputInvoice.inputInvoiceSlug {\n return {\n _: 'inputInvoiceSlug',\n slug\n };\n }\n\n public getInputInvoiceByPeerId(peerId: PeerId, mid: number): InputInvoice.inputInvoiceMessage {\n return {\n _: 'inputInvoiceMessage',\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(mid)\n };\n }\n\n public getPaymentForm(invoice: InputInvoice) {\n return this.apiManager.invokeApi('payments.getPaymentForm', {\n invoice\n }).then((paymentForm) => {\n this.appUsersManager.saveApiUsers(paymentForm.users);\n\n return paymentForm;\n });\n }\n\n public getPaymentReceipt(peerId: PeerId, mid: number) {\n return this.apiManager.invokeApi('payments.getPaymentReceipt', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(mid)\n }).then((paymentForm) => {\n this.appUsersManager.saveApiUsers(paymentForm.users);\n\n return paymentForm;\n });\n }\n\n public validateRequestedInfo(invoice: InputInvoice, info: PaymentRequestedInfo, save?: boolean) {\n return this.apiManager.invokeApi('payments.validateRequestedInfo', {\n save,\n invoice,\n info\n });\n }\n\n public sendPaymentForm(\n invoice: InputInvoice,\n formId: PaymentsPaymentForm['form_id'],\n requestedInfoId: string,\n shippingOptionId: string,\n credentials: InputPaymentCredentials,\n tipAmount?: number\n ) {\n return this.apiManager.invokeApi('payments.sendPaymentForm', {\n form_id: formId,\n invoice,\n requested_info_id: requestedInfoId,\n shipping_option_id: shippingOptionId,\n credentials,\n tip_amount: tipAmount || undefined\n }).then((result) => {\n if(result._ === 'payments.paymentResult') {\n this.apiUpdatesManager.processUpdateMessage(result.updates);\n }\n\n return result;\n });\n }\n\n public clearSavedInfo(info?: boolean, credentials?: boolean) {\n return this.apiManager.invokeApi('payments.clearSavedInfo', {\n info,\n credentials\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 {MessageSendingParams} from './appMessagesManager';\nimport {AppManager} from './manager';\nimport {AttachMenuBots, AttachMenuBot, Update, DataJSON} from '../../layer';\nimport assumeType from '../../helpers/assumeType';\nimport makeError from '../../helpers/makeError';\nimport getAttachMenuBotIcon from './utils/attachMenuBots/getAttachMenuBotIcon';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\n\nexport default class AppAttachMenuBotsManager extends AppManager {\n private attachMenuBots: Map;\n private attachMenuBotsArr: AttachMenuBot[];\n\n protected after() {\n this.clear(true);\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateAttachMenuBots: this.onUpdateAttachMenuBots\n });\n }\n\n public clear = (init = false) => {\n if(!init) {\n this.attachMenuBots.clear();\n this.attachMenuBotsArr = undefined;\n } else {\n this.attachMenuBots = new Map();\n }\n };\n\n private onUpdateAttachMenuBots = (update: Update.updateAttachMenuBots) => {\n this.clear();\n this.getAttachMenuBots();\n };\n\n public saveAttachMenuBot(attachMenuBot: AttachMenuBot) {\n this.attachMenuBots.set(attachMenuBot.bot_id, attachMenuBot);\n const icon = getAttachMenuBotIcon(attachMenuBot);\n icon.icon = this.appDocsManager.saveDoc(icon.icon, {type: 'attachMenuBotIcon', botId: attachMenuBot.bot_id});\n return attachMenuBot;\n }\n\n public saveAttachMenuBots(attachMenuBots: AttachMenuBot[]) {\n if((attachMenuBots as any).saved) return;\n (attachMenuBots as any).saved = true;\n attachMenuBots.forEach((user) => this.saveAttachMenuBot(user));\n }\n\n public getAttachMenuBots() {\n return this.attachMenuBotsArr ?? this.apiManager.invokeApiSingleProcess({\n method: 'messages.getAttachMenuBots',\n processResult: (attachMenuBots) => {\n assumeType(attachMenuBots);\n this.appUsersManager.saveApiUsers(attachMenuBots.users);\n this.saveAttachMenuBots(attachMenuBots.bots);\n // ! temporary\n return this.attachMenuBotsArr = attachMenuBots.bots.slice(0, 0);\n }\n });\n }\n\n public getAttachMenuBotCached(botId: BotId) {\n return this.attachMenuBots.get(botId);\n }\n\n public getAttachMenuBot(botId: BotId, overwrite?: boolean) {\n if(!this.appUsersManager.isAttachMenuBot(botId) || true) {\n throw makeError('BOT_INVALID');\n }\n\n return (!overwrite && this.getAttachMenuBotCached(botId)) ?? this.apiManager.invokeApiSingleProcess({\n method: 'messages.getAttachMenuBot',\n params: {\n bot: this.appUsersManager.getUserInput(botId)\n },\n processResult: (attachMenuBotsBot) => {\n this.appUsersManager.saveApiUsers(attachMenuBotsBot.users);\n const attachMenuBot = this.saveAttachMenuBot(attachMenuBotsBot.bot);\n return attachMenuBot;\n }\n });\n }\n\n public requestWebView(options: MessageSendingParams & {\n botId: BotId,\n peerId: PeerId,\n // platform: string,\n startParam?: string,\n fromBotMenu?: boolean,\n url?: string,\n themeParams?: DataJSON\n }) {\n const {\n botId,\n peerId,\n url,\n fromBotMenu,\n themeParams,\n // platform,\n replyToMsgId,\n silent,\n sendAsPeerId,\n startParam,\n threadId\n } = options;\n\n const platform = 'web';\n\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.requestWebView',\n params: {\n peer: this.appPeersManager.getInputPeerById(peerId),\n bot: this.appUsersManager.getUserInput(botId),\n silent,\n platform,\n url,\n reply_to_msg_id: replyToMsgId ? getServerMessageId(replyToMsgId) : undefined,\n from_bot_menu: fromBotMenu,\n theme_params: themeParams,\n send_as: sendAsPeerId ? this.appPeersManager.getInputPeerById(sendAsPeerId) : undefined,\n start_param: startParam,\n top_msg_id: threadId ? getServerMessageId(threadId) : undefined\n },\n processResult: (result) => {\n console.log(result);\n return result;\n }\n });\n }\n\n public prolongWebView(options: MessageSendingParams & {\n peerId: PeerId,\n botId: BotId,\n queryId: string | number\n }) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.prolongWebView',\n params: {\n peer: this.appPeersManager.getInputPeerById(options.peerId),\n bot: this.appUsersManager.getUserInput(options.botId),\n query_id: options.queryId,\n silent: options.silent,\n reply_to_msg_id: options.replyToMsgId ? getServerMessageId(options.replyToMsgId) : undefined,\n send_as: options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined,\n top_msg_id: options.threadId ? getServerMessageId(options.threadId) : undefined\n },\n processResult: (result) => {\n console.log(result);\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 {UrlAuthResult} from '../../layer';\nimport {AppManager} from './manager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\n\nexport default class AppSeamlessLoginManager extends AppManager {\n public requestUrlAuth(url: string, peerId?: PeerId, mid?: number, buttonId?: number) {\n return this.apiManager.invokeApi('messages.requestUrlAuth', {\n button_id: buttonId,\n msg_id: mid ? getServerMessageId(mid) : undefined,\n peer: peerId ? this.appPeersManager.getInputPeerById(peerId) : undefined,\n url\n }).then((urlAuthResult) => {\n if(urlAuthResult._ === 'urlAuthResultRequest') {\n this.appUsersManager.saveApiUser(urlAuthResult.bot);\n }\n\n return urlAuthResult;\n });\n }\n\n public acceptUrlAuth(url: string, peerId?: PeerId, mid?: number, buttonId?: number, writeAllowed?: boolean) {\n return this.apiManager.invokeApi('messages.acceptUrlAuth', {\n button_id: buttonId,\n msg_id: mid ? getServerMessageId(mid) : undefined,\n peer: peerId ? this.appPeersManager.getInputPeerById(peerId) : undefined,\n url,\n write_allowed: writeAllowed\n }).then((urlAuthResult) => {\n return urlAuthResult as Exclude;\n });\n }\n\n public getWebAuthorizations() {\n return this.apiManager.invokeApi('account.getWebAuthorizations').then((webAuthorizations) => {\n this.appUsersManager.saveApiUsers(webAuthorizations.users);\n return webAuthorizations.authorizations;\n });\n }\n\n public resetWebAuthorization(hash: Long) {\n return this.apiManager.invokeApi('account.resetWebAuthorization', {\n hash\n });\n }\n\n public resetWebAuthorizations() {\n return this.apiManager.invokeApi('account.resetWebAuthorizations');\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 assumeType from '../../helpers/assumeType';\nimport {AccountThemes, AccountWallPapers, InputWallPaper, WallPaper} from '../../layer';\nimport {AppManager} from './manager';\n\ntype WallPaperId = WallPaper['id'];\n\nexport default class AppThemesManager extends AppManager {\n private wallPapers: {[id: WallPaperId]: WallPaper};\n\n protected after() {\n this.wallPapers = {};\n }\n\n private saveWallPaper(wallPaper: WallPaper) {\n if(!wallPaper) {\n return wallPaper;\n }\n // const oldWallPaper = this.wallPapers[wallPaper.id];\n\n // ! IT'S BROKEN NOW. SERVER RETURNS SAME ID FOR DIFFERENT WALLPAPERS\n // if(oldWallPaper) {\n // console.log('rewrite', {...oldWallPaper}, {...wallPaper});\n // }\n\n if(wallPaper._ !== 'wallPaperNoFile') {\n wallPaper.document = this.appDocsManager.saveDoc(wallPaper.document, {type: 'wallPaper', wallPaperId: wallPaper.id});\n }\n\n // if(oldWallPaper) {\n // return Object.assign(oldWallPaper, wallPaper);\n // } else {\n this.wallPapers[wallPaper.id] = wallPaper;\n // }\n\n return wallPaper;\n }\n\n public getWallPaper(inputWallPaper: InputWallPaper) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'account.getWallPaper',\n params: {wallpaper: inputWallPaper},\n processResult: (wallPaper) => {\n return this.saveWallPaper(wallPaper);\n }\n });\n }\n\n public getInputWallPaper(wallPaper: WallPaper | string): InputWallPaper {\n if(typeof(wallPaper) === 'string') {\n return {_: 'inputWallPaperSlug', slug: wallPaper};\n } else if(wallPaper._ === 'wallPaperNoFile') {\n return {_: 'inputWallPaperNoFile', id: wallPaper.id};\n } else {\n return {_: 'inputWallPaper', id: wallPaper.id, access_hash: wallPaper.access_hash};\n }\n }\n\n public getWallPaperById(id: WallPaperId) {\n const wallPaper = this.wallPapers[id];\n return this.getWallPaper(this.getInputWallPaper(wallPaper));\n }\n\n public getThemes() {\n return this.apiManager.invokeApiSingleProcess({\n method: 'account.getThemes',\n params: {format: 'macos', hash: 0},\n processResult: (accountThemes) => {\n assumeType(accountThemes);\n\n accountThemes.themes.forEach((theme) => {\n if(!theme.settings) {\n return;\n }\n\n theme.settings.forEach((themeSettings) => {\n themeSettings.wallpaper = this.saveWallPaper(themeSettings.wallpaper);\n });\n });\n\n return accountThemes.themes;\n }\n });\n }\n\n public getWallPapers() {\n return this.apiManager.invokeApiHashable({method: 'account.getWallPapers'}).then((accountWallpapers) => {\n const wallPapers = (accountWallpapers as AccountWallPapers.accountWallPapers).wallpapers;\n wallPapers.forEach((wallPaper, idx, arr) => {\n arr[idx] = this.saveWallPaper(wallPaper);\n });\n\n return wallPapers;\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 App from '../../config/app';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport callbackify from '../../helpers/callbackify';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport cryptoMessagePort from '../crypto/cryptoMessagePort';\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\nimport appStateManager from './appStateManager';\nimport {AppStoragesManager} from './appStoragesManager';\nimport createManagers from './createManagers';\n\ntype Managers = Awaited>;\n\nexport class AppManagersManager {\n private managers: Managers | Promise;\n private cryptoWorkersURLs: string[];\n private cryptoPortsAttached: number;\n private cryptoPortPromise: CancellablePromise;\n\n constructor() {\n this.cryptoWorkersURLs = [];\n this.cryptoPortsAttached = 0;\n this.cryptoPortPromise = deferredPromise();\n this.cryptoPortPromise.then(() => {\n this.cryptoPortPromise = undefined;\n });\n }\n\n public start() {\n const port = MTProtoMessagePort.getInstance();\n\n port.addEventListener('manager', ({name, method, args}) => {\n return callbackify(this.getManagers(), (managers) => {\n // @ts-ignore\n const manager = managers[name];\n return manager[method].apply(manager, args);\n });\n });\n\n port.addEventListener('cryptoPort', (payload, source, event) => {\n const port = event.ports[0];\n if(this.cryptoPortsAttached >= this.cryptoWorkersURLs.length) {\n port.close();\n return;\n }\n\n ++this.cryptoPortsAttached;\n cryptoMessagePort.attachPort(port);\n this.cryptoPortPromise?.resolve();\n });\n\n port.addEventListener('createProxyWorkerURLs', ({originalUrl, blob}) => {\n let length = this.cryptoWorkersURLs.length;\n if(!length) {\n this.cryptoWorkersURLs.push(originalUrl);\n ++length;\n }\n\n const maxLength = App.cryptoWorkers;\n if(length === maxLength) {\n return this.cryptoWorkersURLs;\n }\n\n const newURLs = new Array(maxLength - length).fill(undefined).map(() => URL.createObjectURL(blob));\n this.cryptoWorkersURLs.push(...newURLs);\n return this.cryptoWorkersURLs;\n });\n }\n\n public async createManagers() {\n const appStoragesManager = new AppStoragesManager();\n\n await Promise.all([\n // new Promise(() => {}),\n appStoragesManager.loadStorages(),\n this.cryptoPortPromise\n ]);\n\n const managers = await createManagers(appStoragesManager, appStateManager.userId);\n return this.managers = managers;\n }\n\n public getManagers() {\n return this.managers ??= this.createManagers();\n }\n}\n\nconst appManagersManager = new AppManagersManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appManagersManager = appManagersManager);\nexport default appManagersManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {PasswordManager} from '../mtproto/passwordManager';\nimport {ReferenceDatabase} from '../mtproto/referenceDatabase';\nimport DialogsStorage from '../storages/dialogs';\nimport FiltersStorage from '../storages/filters';\nimport {ApiUpdatesManager} from './apiUpdatesManager';\nimport {AppAvatarsManager} from './appAvatarsManager';\nimport {AppCallsManager} from './appCallsManager';\nimport {AppChatsManager} from './appChatsManager';\nimport {AppDocsManager} from './appDocsManager';\nimport {AppDraftsManager} from './appDraftsManager';\nimport {AppEmojiManager} from './appEmojiManager';\nimport {AppGroupCallsManager} from './appGroupCallsManager';\nimport {AppInlineBotsManager} from './appInlineBotsManager';\nimport {AppMessagesIdsManager} from './appMessagesIdsManager';\nimport {AppMessagesManager} from './appMessagesManager';\nimport {AppNotificationsManager} from './appNotificationsManager';\nimport {AppPeersManager} from './appPeersManager';\nimport {AppPhotosManager} from './appPhotosManager';\nimport {AppPollsManager} from './appPollsManager';\nimport {AppPrivacyManager} from './appPrivacyManager';\nimport {AppProfileManager} from './appProfileManager';\nimport {AppReactionsManager} from './appReactionsManager';\nimport {AppStickersManager} from './appStickersManager';\nimport {AppUsersManager} from './appUsersManager';\nimport {AppWebPagesManager} from './appWebPagesManager';\nimport {ApiFileManager} from '../mtproto/apiFileManager';\nimport {ApiManager} from '../mtproto/apiManager';\nimport ctx from '../../environment/ctx';\nimport PeersStorage from '../storages/peers';\nimport ThumbsStorage from '../storages/thumbs';\nimport {NetworkerFactory} from '../mtproto/networkerFactory';\nimport {RootScope} from '../rootScope';\nimport {Authorizer} from '../mtproto/authorizer';\nimport {DcConfigurator} from '../mtproto/dcConfigurator';\nimport {TimeManager} from '../mtproto/timeManager';\nimport {AppStoragesManager} from './appStoragesManager';\nimport cryptoMessagePort from '../crypto/cryptoMessagePort';\nimport appStateManager from './appStateManager';\nimport filterUnique from '../../helpers/array/filterUnique';\nimport AppWebDocsManager from './appWebDocsManager';\nimport AppPaymentsManager from './appPaymentsManager';\nimport AppAttachMenuBotsManager from './appAttachMenuBotsManager';\nimport AppSeamlessLoginManager from './appSeamlessLoginManager';\nimport AppThemesManager from './appThemesManager';\n\nexport default function createManagers(appStoragesManager: AppStoragesManager, userId: UserId) {\n const managers = {\n appPeersManager: new AppPeersManager,\n appChatsManager: new AppChatsManager,\n appDocsManager: new AppDocsManager,\n appPhotosManager: new AppPhotosManager,\n appPollsManager: new AppPollsManager,\n appUsersManager: new AppUsersManager,\n appWebPagesManager: new AppWebPagesManager,\n appDraftsManager: new AppDraftsManager,\n appProfileManager: new AppProfileManager,\n appNotificationsManager: new AppNotificationsManager,\n apiUpdatesManager: new ApiUpdatesManager,\n appAvatarsManager: new AppAvatarsManager,\n appGroupCallsManager: new AppGroupCallsManager,\n appCallsManager: new AppCallsManager,\n appReactionsManager: new AppReactionsManager,\n appMessagesManager: new AppMessagesManager,\n appMessagesIdsManager: new AppMessagesIdsManager,\n appPrivacyManager: new AppPrivacyManager,\n appInlineBotsManager: new AppInlineBotsManager,\n appStickersManager: new AppStickersManager,\n referenceDatabase: new ReferenceDatabase,\n appEmojiManager: new AppEmojiManager,\n filtersStorage: new FiltersStorage,\n dialogsStorage: new DialogsStorage,\n apiManager: new ApiManager,\n cryptoWorker: cryptoMessagePort,\n passwordManager: new PasswordManager,\n apiFileManager: new ApiFileManager,\n peersStorage: new PeersStorage,\n thumbsStorage: new ThumbsStorage,\n networkerFactory: new NetworkerFactory,\n rootScope: new RootScope,\n authorizer: new Authorizer,\n dcConfigurator: new DcConfigurator,\n timeManager: new TimeManager,\n appStoragesManager: appStoragesManager,\n appStateManager: appStateManager,\n appWebDocsManager: new AppWebDocsManager,\n appPaymentsManager: new AppPaymentsManager,\n appAttachMenuBotsManager: new AppAttachMenuBotsManager,\n appSeamlessLoginManager: new AppSeamlessLoginManager,\n appThemesManager: new AppThemesManager\n };\n\n type T = typeof managers;\n\n for(const name in managers) {\n const manager = managers[name as keyof T];\n if(!manager) {\n continue;\n }\n\n if((manager as AppMessagesManager).setManagers) {\n (manager as AppMessagesManager).setManagers(managers as any);\n delete (manager as AppMessagesManager).setManagers;\n }\n\n // @ts-ignore\n ctx[name] = manager;\n }\n\n const promises: Array void) | void> | void>[] = [];\n let names = Object.keys(managers) as (keyof T)[];\n names.unshift('appUsersManager', 'appChatsManager', 'appNotificationsManager', 'appMessagesManager', 'dialogsStorage');\n names = filterUnique(names);\n for(const name of names) {\n const manager = managers[name];\n if((manager as any)?.after) {\n // console.log('injecting after', name);\n const result = (manager as any).after();\n promises.push(result);\n\n // if(result instanceof Promise) {\n // result.then(() => {\n // console.log('injected after', name);\n // });\n // }\n }\n }\n\n if(userId) {\n managers.apiManager.setUserAuth(userId);\n }\n\n return Promise.all(promises).then(() => managers);\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// just to include\nimport '../polyfill';\nimport '../../helpers/peerIdPolyfill';\n\nimport cryptoWorker from '../crypto/cryptoMessagePort';\nimport {setEnvironment} from '../../environment/utils';\nimport appStateManager from '../appManagers/appStateManager';\nimport transportController from './transports/controller';\nimport MTProtoMessagePort from './mtprotoMessagePort';\nimport RESET_STORAGES_PROMISE from '../appManagers/utils/storages/resetStoragesPromise';\nimport appManagersManager from '../appManagers/appManagersManager';\nimport listenMessagePort from '../../helpers/listenMessagePort';\nimport {logger} from '../logger';\nimport {State} from '../../config/state';\nimport toggleStorages from '../../helpers/toggleStorages';\nimport appTabsManager from '../appManagers/appTabsManager';\nimport ServiceMessagePort from '../serviceWorker/serviceMessagePort';\nimport callbackify from '../../helpers/callbackify';\n\nlet _isServiceWorkerOnline = true;\nexport function isServiceWorkerOnline() {\n return _isServiceWorkerOnline;\n}\n\nlet serviceMessagePort: ServiceMessagePort, _serviceMessagePort: MessagePort;\nexport function getServiceMessagePort() {\n return _isServiceWorkerOnline ? serviceMessagePort : undefined;\n}\n\nconst log = logger('MTPROTO');\n// let haveState = false;\n\nconst port = new MTProtoMessagePort();\nport.addMultipleEventsListeners({\n environment: (environment) => {\n setEnvironment(environment);\n\n transportController.waitForWebSocket();\n },\n\n crypto: ({method, args}) => {\n return cryptoWorker.invokeCrypto(method as any, ...args as any);\n },\n\n state: ({state, resetStorages, pushedKeys, newVersion, oldVersion, userId}) => {\n // if(haveState) {\n // return;\n // }\n\n log('got state', state, pushedKeys);\n\n appStateManager.userId = userId;\n appStateManager.newVersion = newVersion;\n appStateManager.oldVersion = oldVersion;\n\n (Object.keys(state) as any as (keyof State)[]).forEach((key) => {\n appStateManager.pushToState(key, state[key], true, !pushedKeys.includes(key));\n });\n\n RESET_STORAGES_PROMISE.resolve(resetStorages);\n // haveState = true;\n },\n\n toggleStorages: ({enabled, clearWrite}) => {\n return toggleStorages(enabled, clearWrite);\n },\n\n event: (payload, source) => {\n log('will redirect event', payload, source);\n port.invokeExceptSource('event', payload, source);\n },\n\n serviceWorkerOnline: (online) => {\n _isServiceWorkerOnline = online;\n },\n\n serviceWorkerPort: (payload, source, event) => {\n if(serviceMessagePort) {\n serviceMessagePort.detachPort(_serviceMessagePort);\n _serviceMessagePort = undefined;\n } else {\n serviceMessagePort = new ServiceMessagePort();\n serviceMessagePort.addMultipleEventsListeners({\n requestFilePart: (payload) => {\n return callbackify(appManagersManager.getManagers(), (managers) => {\n const {docId, dcId, offset, limit} = payload;\n return managers.appDocsManager.requestDocPart(docId, dcId, offset, limit);\n });\n }\n });\n }\n\n // * port can be undefined in the future\n if(_serviceMessagePort = event.ports[0]) {\n serviceMessagePort.attachPort(_serviceMessagePort);\n }\n },\n\n createObjectURL: (blob) => {\n return URL.createObjectURL(blob);\n }\n\n // socketProxy: (task) => {\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\nlog('MTProto start');\n\nappManagersManager.start();\nappManagersManager.getManagers();\nappTabsManager.start();\n\n// let sentHello = false;\nlistenMessagePort(port, (source) => {\n appTabsManager.addTab(source);\n\n // port.invokeVoid('hello', undefined, source);\n // if(!sentHello) {\n // port.invokeVoid('hello', undefined, source);\n // sentHello = true;\n // }\n}, (source) => {\n appTabsManager.deleteTab(source);\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 SuperMessagePort from '../lib/mtproto/superMessagePort';\nimport ctx from '../environment/ctx';\n\nexport default function listenMessagePort(\n messagePort: SuperMessagePort,\n onConnect?: (source: MessageEventSource) => void,\n onDisconnect?: (source: MessageEventSource) => void\n) {\n const attachPort = (listenPort: any, sendPort: any) => {\n messagePort.attachListenPort(listenPort);\n sendPort && messagePort.attachSendPort(sendPort);\n onConnect?.(listenPort);\n };\n\n messagePort.setOnPortDisconnect(onDisconnect);\n\n if(typeof(SharedWorkerGlobalScope) !== 'undefined') {\n (ctx as any as SharedWorkerGlobalScope).addEventListener('connect', (e) => attachPort(e.source, e.source));\n } else if(typeof(ServiceWorkerGlobalScope) !== 'undefined') {\n attachPort(ctx, null);\n } else {\n attachPort(ctx, ctx);\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 {MyDialogFilter} from '../storages/filters';\n\n/**\n * Legacy Webogram's format, don't change dcID to camelCase. date is timestamp\n */\nexport type UserAuth = {dcID: number | string, date: number, id: PeerId};\nexport type REAL_FOLDER_ID = 0 | 1;\n\nexport const NULL_PEER_ID: PeerId = 0;\nexport const REPLIES_PEER_ID: PeerId = 1271266957;\nexport const REPLIES_HIDDEN_CHANNEL_ID: ChatId = 777;\nexport const SERVICE_PEER_ID: PeerId = 777000;\nexport const MUTE_UNTIL = 0x7FFFFFFF;\nexport const BOT_START_PARAM = '';\nexport const MAX_FILE_SAVE_SIZE = 20 * 1024 * 1024;\nexport const THUMB_TYPE_FULL = '';\nexport const TOPIC_COLORS = [0x6FB9F0, 0xFFD67E, 0xCB86DB, 0x8EEE98, 0xFF93B2, 0xFB6F5F];\nexport const ATTACH_MENU_BOT_ICON_NAME = 'default_static';\nexport const GENERAL_TOPIC_ID = 4295032831;\nexport const T_ME_PREFIXES = new Set(['web', 'k', 'z']);\n\nexport const FOLDER_ID_ALL: REAL_FOLDER_ID = 0;\nexport const FOLDER_ID_ARCHIVE: REAL_FOLDER_ID = 1;\nexport const REAL_FOLDERS: Set = new Set([FOLDER_ID_ALL, FOLDER_ID_ARCHIVE]);\nexport const START_LOCAL_ID = Math.max(...Array.from(REAL_FOLDERS)) + 1 as MyDialogFilter['localId'];\n","/*\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 emojiRegExp from '../../vendor/emoji/regex';\nimport {MessageEntity} from '../../layer';\n\nconst EmojiHelper = {\n emojiMap: (code: string) => { return code; },\n shortcuts: [] as any,\n emojis: [] as any\n};\n\nexport const ALPHA_CHARS_REG_EXP = '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)\nexport const ALPHA_NUMERIC_REG_EXP = '0-9\\_' + ALPHA_CHARS_REG_EXP;\nexport const DOMAIN_ADD_CHARS = '\\u00b7';\n// Based on Regular Expression for URL validation by Diego Perini\nexport const URL_ALPHANUMERIC_REG_EXP_PART = '[' + ALPHA_CHARS_REG_EXP + '0-9]';\nexport const URL_PROTOCOL_REG_EXP_PART = '((?:https?|ftp)://|mailto:)?';\nexport const URL_REG_EXP = URL_PROTOCOL_REG_EXP_PART +\n // user:pass authentication\n '(?:' + URL_ALPHANUMERIC_REG_EXP_PART + '{1,64}(?::' + URL_ALPHANUMERIC_REG_EXP_PART + '{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 URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}' +\n // domain name\n '(?:\\\\.' + URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}){0,10}' +\n // TLD identifier\n '(?:\\\\.(xn--[0-9a-z]{2,16}|[' + ALPHA_CHARS_REG_EXP + ']{2,24}))' +\n ')' +\n // port number\n '(?::\\\\d{2,5})?' +\n // resource path\n '(?:/(?:\\\\S{0,255}[^\\\\s.;,(\\\\[\\\\]{}<>\"\\'])?)?';\nexport const URL_PROTOCOL_REG_EXP = new RegExp('^' + URL_PROTOCOL_REG_EXP_PART.slice(0, -1), 'i');\nexport const URL_ANY_PROTOCOL_REG_EXP = /^((?:[^\\/]+?):\\/\\/|mailto:)/;\nexport const USERNAME_REG_EXP = '[a-zA-Z\\\\d_]{5,32}';\nexport const BOT_COMMAND_REG_EXP = '\\\\/([a-zA-Z\\\\d_]{1,32})(?:@(' + USERNAME_REG_EXP + '))?(\\\\b|$)';\nexport const FULL_REG_EXP = new RegExp('(^| )(@)(' + USERNAME_REG_EXP + ')|(' + URL_REG_EXP + ')|(\\\\n)|(' + emojiRegExp + ')|(^|[\\\\s\\\\(\\\\]])(#[' + ALPHA_NUMERIC_REG_EXP + ']{2,64})|(^|\\\\s)' + BOT_COMMAND_REG_EXP, 'i');\nexport const EMAIL_REG_EXP = /^(([^<>()[\\]\\\\.,;:\\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 = /[`_*@~]/;\nexport const MARKDOWN_REG_EXP = /(^|\\s|\\n)(````?)([\\s\\S]+?)(````?)([\\s\\n\\.,:?!;]|$)|(^|\\s|\\x01)(`|~~|\\*\\*|__|_-_|\\|\\|)([^\\n]+?)\\7([\\x01\\s\\.,:?!;]|$)|@(\\d+)\\s*\\((.+?)\\)|(\\[(.+?)\\]\\((.+?)\\))/m;\nexport const SITE_HASHTAGS: {[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\n// export const SITE_MENTIONS: {[siteName in 'Telegram' | 'Twitter' | 'Instagram' | 'GitHub']: string} = {\n// Telegram: '#{1}',\n// Twitter: 'https://twitter.com/{1}',\n// Instagram: 'https://instagram.com/{1}/',\n// GitHub: 'https://github.com/{1}'\n// };\n\nexport const MARKDOWN_ENTITIES: {[markdown: string]: MessageEntity['_']} = {\n '`': 'messageEntityCode',\n '``': 'messageEntityPre',\n '**': 'messageEntityBold',\n '__': 'messageEntityItalic',\n '~~': 'messageEntityStrike',\n '_-_': 'messageEntityUnderline',\n '||': 'messageEntitySpoiler'\n};\n\nexport const PASS_CONFLICTING_ENTITIES: Set = new Set([\n 'messageEntityEmoji',\n 'messageEntityLinebreak',\n 'messageEntityCaret'\n]);\nfor(const i in MARKDOWN_ENTITIES) {\n PASS_CONFLICTING_ENTITIES.add(MARKDOWN_ENTITIES[i]);\n}\n\nexport const PHONE_NUMBER_REG_EXP = /^\\+\\d+$/;\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\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","// https://github.com/twitter/twemoji-parser/blob/master/src/lib/regex.js\n\nexport function encodeEmoji(emojiText: string) {\n const codepoints = toCodePoints(removeVS16s(emojiText)).join('-');\n return codepoints;\n}\n\nconst vs16RegExp = /\\uFE0F/g;\n// avoid using a string literal like '\\u200D' here because minifiers expand it inline\nconst zeroWidthJoiner = String.fromCharCode(0x200d);\n\nconst removeVS16s = (rawEmoji: string) => (rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, '') : rawEmoji);\n\nexport function toCodePoints(unicodeSurrogates: string): Array {\n const points = [];\n let char = 0;\n let previous = 0;\n let i = 0;\n while(i < unicodeSurrogates.length) {\n char = unicodeSurrogates.charCodeAt(i++);\n if(previous) {\n points.push((0x10000 + ((previous - 0xd800) << 10) + (char - 0xdc00)).toString(16));\n previous = 0;\n } else if(char > 0xd800 && char <= 0xdbff) {\n previous = char;\n } else {\n points.push(char.toString(16));\n }\n }\n\n if(points.length && points[0].length === 2) {\n points[0] = '00' + points[0];\n }\n\n return points;\n}\n\nexport function getEmojiToneIndex(input: string) {\n const match = input.match(/[\\uDFFB-\\uDFFF]/);\n return match ? 5 - (57343 - match[0].charCodeAt(0)) : 0;\n}\n\nconst VIRTUAL_COUNTRIES_EMOJIS: Map = new Map([\n ['FT', '๐Ÿดโ€โ˜ ']\n]);\n\nexport function getCountryEmoji(iso2: string) {\n return VIRTUAL_COUNTRIES_EMOJIS.get(iso2) ??\n String.fromCharCode(55356, 56741 + iso2.charCodeAt(0), 55356, 56741 + iso2.charCodeAt(1));\n}\n\nexport function emojiFromCodePoints(codePoints: string) {\n return codePoints.split('-').reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [699,211,147,85,110], () => (__webpack_require__(9092)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames not based on template\n\tif (chunkId === 85) return \"85.887945ef5f43bc205112.bundle.js\";\n\tif (chunkId === 110) return \"110.22ad5bfa72c27ec78066.bundle.js\";\n\t// return url for filenames based on template\n\treturn \"\" + ({\"211\":\"npm.big-integer\",\"699\":\"npm.pako\"}[chunkId] || chunkId) + \".\" + {\"8\":\"93d2f33af815eb0455aa\",\"104\":\"476c2f411510266c35de\",\"147\":\"4eb614e56f1d9fbfd1e7\",\"211\":\"363d763daad0ee4e2741\",\"301\":\"95838a8203f23dd1ce8f\",\"642\":\"be93122d1116ecdc9322\",\"699\":\"89deb457201f16c93925\"}[chunkId] + \".chunk.js\";\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = {};\n var countMap = {};\n var getRetryDelay = function () {\n return 3000;\n };\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result +\n (queryMap.hasOwnProperty(chunkId) ? '?' + queryMap[chunkId] : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.hasOwnProperty(chunkId)\n ? countMap[chunkId]\n : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n var retryAttempt = 999999 - retries + 1;\n setTimeout(function () {\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap[chunkId] = cacheBust;\n countMap[chunkId] = retries - 1;\n resolve(__webpack_require__.e(chunkId));\n }, getRetryDelay(retryAttempt));\n });\n });\n };\n }\n})();\n","// no baseURI\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t678: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","next","DEBUG","MOUNT_CLASS_TO","window","self","EmojiVersions","Emoji","version","Object","assign","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","IS_FIREFOX","undefined","badCharsRe","trimRe","C2L","cleanSearchText","text","latinize","processSearchText","clearBadChars","ignoreCase","options","hasTag","includeTag","charAt","originalText","replace","clearBadCharsAndTrim","ch","latinizeCh","latinizeString","fixCyrillic","FILENAME_JOINER","getFileNameByLocation","location","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","downloadId","getFileURL","type","encodeURIComponent","JSON","stringify","platforms","Set","ignore","getRestrictionReason","reasons","find","reason","has","isRestricted","ignoreRestrictionReasons","clear","forEach","add","getPeerId","peerId","isPeerId","userId","user_id","toPeerId","chatId","channel_id","chat_id","isUser","peerParams","substr","split","IDB","constructor","db","this","name","storageIsAvailable","log","openDatabase","INSTANCES","push","isAvailable","createNew","openDbPromise","createIndexes","os","store","indexNames","Array","from","indexName","deleteIndex","indexes","index","contains","createIndex","keyPath","objectParameters","request","indexedDB","open","Promise","reject","message","finished","setTimeout","onerror","resolve","onsuccess","event","result","calledNew","onclose","e","onabort","transaction","target","close","onversionchange","onupgradeneeded","warn","oldVersion","newVersion","stores","objectStoreNames","objectStore","createObjectStore","static","instance","preserve","storage","IDBStorage","storeName","idb","create","delete","entryName","isArray","concat","getObjectStore","promises","map","save","value","idx","put","get","mode","callback","perf","performance","now","then","onError","clearTimeout","timeout","onComplete","results","requests","r","waitForTransactionComplete","oncomplete","callbackResult","left","onRequestFinished","i","getAll","environment","getEnvironment","setEnvironment","env","RootScope","super","myId","connectionStatus","premium","addEventListener","isNew","isPremium","dispatchEventSingle","status","dispatchEvent","args","invokeVoid","settings","getConnectionStatus","getPremium","state","stateStorage","getState","setByKey","key","object","splitted","getDeepProperty","slice","pop","setDeepProperty","first","pushToState","direct","onlyLocal","setKeyValueToStorage","set","HTTP","dcId","logSuffix","pending","debug","logTypes","Log","logger","connected","_send","body","fetch","method","response","arrayBuffer","buffer","TextDecoder","decode","Uint8Array","setConnected","err","destroyed","destroy","send","networker","promise","releasePending","releasing","splice","pause","Socket","handleOpen","handleError","handleClose","removeListeners","handleMessage","data","byteLength","ws","connect","removeEventListener","WebSocket","binaryType","randomize","arr","crypto","Error","getRandomValues","Obfuscation","_process","operation","cryptoMessagePort","transfer","init","codec","idPromise","release","initPayload","val","val2","reversedPayload","reverse","encKey","encIv","decKey","decIv","process","obfuscateTag","encrypted","encode","payload","tag","encodePacket","len","header","readPacket","bytesToHex","bytes","toString","TcpObfuscated","Connection","retryTimeout","abridged","obfuscation","autoReconnect","onOpen","connection","setConnectionStatus","cleanupSent","resend","onMessage","parseResponse","processMessage","messageId","sessionId","catch","shift","onClose","needTimeout","retryAt","time","Date","diff","lastCloseTime","isNaN","reconnectTimeout","ctx","reconnect","bodySent","forceReconnect","setAutoReconnect","once","enable","changeUrl","encodeBody","toEncode","encoded","releasingPending","sent","TEST_SUFFIX","getTelegramConnectionSuffix","connectionType","constructTelegramWebSocketUrl","suffix","path","DcConfigurator","sslSubdomains","dcOptions","host","port","chosenServers","transportSocket","chosenServer","oooohLetMeLive","transportHTTP","dcOption","chooseServer","transportType","reuse","hasOwnProperty","client","download","upload","servers","transports","transport","obj","indexOfAndSplice","MTTransportController","opened","Map","waitForWebSocket","pingTransports","dcConfigurator","https","websocket","httpPromise","websocketPromise","socket","isFulfilled","isRejected","isHttpAvailable","isWebSocketAvailable","all","pinging","setTransportValue","setTransportOpened","setTransportClosed","AppManager","setManagers","managers","loadStorages","storages","recordPromise","storagesKeys","keys","storagesPromises","storagesResults","resetStorages","size","loadStoragesInner","AppStoragesManager","names","createStorages","loadStorage","PasswordManager","apiManager","invokeApi","updateSettings","currentHashPromise","newHashPromise","params","password","new_settings","hint","email","currentPassword","cryptoWorker","invokeCrypto","newAlgo","new_algo","salt1","newPassword","hashes","new_password_hash","getInputCheckPassword","check","inputCheckPassword","auth","setUser","user","confirmPasswordEmail","code","resendPasswordEmail","cancelPasswordEmail","ReferenceDatabase","contexts","links","saveContext","reference","context","getContexts","_context","deepEqual","getReferenceByLink","getContext","values","deleteContext","refreshReference","c","appMessagesManager","reloadMessages","refreshEmojiesSoundsPromise","appStickersManager","getAnimatedEmojiSounds","appProfileManager","getProfile","appEmojiManager","getCustomEmojiDocuments","docId","appAttachMenuBotsManager","getAttachMenuBot","botId","appThemesManager","getWallPaperById","wallPaperId","hex","newHex","newContext","makeError","safeReplaceObject","wasObject","newObject","getPeerIdsFromMessage","peerIds","fromId","viaBotId","fwdFromId","media","contactUserId","recentVoters","recent_voters","recentReactions","recent_reactions","reaction","peer_id","action","userIds","users","inviter_id","chatIds","recentRepliers","recent_repliers","reply","setDialogIndex","dialog","indexKey","GLOBAL_FOLDER_ID","DialogsStorage","allDialogsLoaded","pinnedOrders","folderId","saveAllDialogsLoaded","resetPinnedOrder","savePinnedOrders","forumTopics","folders","dialogsOffsetDate","dialogsNum","dialogsIndex","cachedResults","query","count","dialogs","onUpdateFolderPeers","update","folder_peers","folderPeer","folder_id","peer","appPeersManager","dropDialog","pinned","handleDialogUnpinning","generateIndexForDialog","pushDialog","scheduleHandleNewDialogs","onUpdateDialogPinned","getDialogOnly","handleDialogTogglePinned","onUpdateChannelPinnedTopic","topicId","generateMessageId","topic_id","topic","getForumTopic","getFilterIdForForum","onUpdatePinnedDialogs","order","handleDialogsPinned","dialogsResult","applyDialogs","d","onUpdateChannelPinnedTopics","filterId","limit","getLimit","channel","appChatsManager","getChannelInput","toChatId","offset_date","offset_id","offset_topic","processTopics","topics","after","rootScope","appUsersManager","getSelf","peerText","getPeerSearchText","indexObject","onFilterUpdate","getCachedDialogs","processDialogForFilter","processDialogForFilters","getDialogIndexKeyByFilterId","processChangedUnreadOrUnmuted","chat","getChat","dropDialogOnDeletion","enabled","flushForumTopicsCache","apiUpdatesManager","addMultipleEventsListeners","updateFolderPeers","updateDialogPinned","updateChannelPinnedTopic","updatePinnedDialogs","updateChannelPinnedTopics","appStateManager","appStoragesManager","getCache","_order","getPinnedOrders","setDialogsFromState","bind","appDraftsManager","addMissedDialogs","top_message","getServerMessageId","topMessage","saveMessages","saveDialog","ignoreOffsetDate","getMessageByPeer","reloadConversation","isDialogsLoaded","setDialogsLoaded","loaded","isForum","isFilterIdForForum","defineNotNumerableProperties","every","orders","isDialogPinned","filtersStorage","getFilter","isPinned","pinnedPeerIds","getOffsetDate","offsetDate","Math","min","sort","a","b","generateFolder","folder","unreadMessagesCount","unreadPeerIds","unreadUnmutedPeerIds","getFolder","forumTopic","getDialogKey","isTopic","getFolderDialogs","skipMigrated","hidden","migratedTo","getNextDialog","currentPeerId","findIndex","getDialogIndexKey","localId","isDialogUnmuted","appNotificationsManager","isPeerLocalMuted","respectType","threadId","getFolderUnreadCount","unreadUnmutedCount","unreadCount","arrays","setDialogIndexInFilter","isRealFolder","testDialogForFilter","pinnedIds","pinnedKey","pinnedIndex","generateDialogIndex","generateDialogPinnedDateByIndex","getDialogIndex","getDialog","verify","skipped","getDialogOrTopic","isObject","date","tsNow","timeManager","getServerTimeOffset","noIndex","filters","getFilters","cmp","wasIndex","wasDialog","wasDialogIndex","newDialogIndex","prepareFolderUnreadCountModifyingByDialog","insertInDescendSortedArray","prepareDialogUnreadCountModifying","toggle","callbacks","wasUnreadCount","getDialogUnreadCount","wasUnmuted","newUnreadCount","newUnmuted","addMessagesCount","modifyFolderUnreadCount","toggleDialog","toggleUnmuted","forumUnreadCount","getForumUnreadCount","hasUnmuted","some","max","dispatchUnreadTimeout","_folder","justReturn","noPinnedOrderUpdate","topDate","generateDialogPinnedDate","channelId","isChannel","draft","dialogKey","unshift","setDialogToState","pts","historyStorage","getHistoryStorage","messagesStorage","getHistoryMessagesStorage","history","incomingMessage","mid","getMessageFromStorage","is_outgoing","peersStorage","requestPeersForKey","isAnyChat","newPts","getChannelState","requestPeer","saveGlobalOffset","getForumTopicsCache","getDialogOffsetDate","savedGlobalOffsetDate","savedOffsetDate","dropDialogFromFolders","foundDialog","wasPinned","keepLocal","clearDialogFromState","releasePeer","dropDialogWithEvent","dropped","items","forEachReverse","assumeType","saveApiUsers","saveApiChats","chats","messages","updatedDialogs","topMid","topPendingMid","pendingTopMsgs","topPendingMessage","maxId","cache","getUpdateCache","getUpdateAfterReloadKey","updates","newUpdatesAfterReloadToHandle","saveUpdate","canSaveDialogByPeerId","isDialog","wasDialogBefore","wasTopMessage","generateTempMessageId","from_id","getOutputPeer","deleted","out","isOutgoing","migrated_to","deactivated","migratedToPeer","migratedFromTo","migratedToFrom","read_inbox_max_id","read_outbox_max_id","saveDraft","isOut","unread","unread_count","isEnd","insertSlice","setEnd","mergeReplyKeyboard","readMaxId","readOutboxMaxId","savePeerSettings","notify_settings","addChannelState","releaseUnreadCount","dialogsStorage","processTopicUpdate","oldTopic","isIconChanged","icon_emoji_id","isTitleChanged","title","isChanged","getDialogs","offsetIndex","fillContactsResult","fillContacts","cached","reloadMissingDialogsPromise","reloadMissingPeerIds","realFolderId","curDialogStorage","d1","d2","offset","loadedAll","isEnoughDialogs","isTopEnd","getTopMessages","deletedTopics","getTopicPromises","getForumTopicById","getTopicsPromise","ids","fullfillLeft","messagesForumTopics","getForumTopicOrReload","callbackify","processTopicsPromise","f","reduce","acc","v","newPinned","convertment","PREPENDED_FILTERS","LOCAL_FILTER","flags","exclude_peers","include_peers","pinned_peers","excludePeerIds","includePeerIds","FiltersStorage","filtersArr","reloadedPeerIds","localFilters","generateLocalFilter","clearFilters","onUpdateDialogFilter","saveDialogFilter","findAndSplice","onUpdateDialogFilters","oldFilters","copy","getDialogFilters","_filterId","onUpdateDialogFilterOrder","includes","setLocalId","updateDialogFilter","updateDialogFilters","updateDialogFilterOrder","prependFilters","allChatsFilter","archiveFilter","allChatsFilterIndex","exclude_archived","exclude_unarchived","exclude_read","isDialogUnread","exclude_muted","unread_mentions_count","broadcasts","isBroadcast","groups","isAnyGroup","toUserId","isBot","bots","non_contacts","isContact","contacts","testDialogForFilterId","toggleDialogPin","getConfig","pinned_infolder_count_max","getInputPeerById","createDialogFilter","prepend","remove","getOutputDialogFilter","bool","updateDialogFiltersOrder","filterIncludedPinnedPeers","peers","reloadDialogs","inputPeer","isAlreadyReloaded","reloadPromises","missingPeerIds","overwrite","invokeApiSingle","getSuggestedDialogsFilters","silent","to","oldFilter","_filter","isFilterIdAvailable","applyMixins","derivedCtor","constructors","baseCtor","getOwnPropertyNames","prototype","getOwnPropertyDescriptor","defineProperty","ApiUpdatesManager","updatesState","pendingPtsUpdates","pendingSeqUpdates","syncPending","syncLoading","channelStates","attached","subscriptions","processUpdateMessage","updateMessage","processOpts","seq","seqStart","seq_start","forceGetDifference","processUpdate","toId","fwd_from","reply_to","entities","pts_count","override","_constructor","setProxy","Proxy","saveUpdatesState","us","popPendingSeqUpdate","nextSeq","pendingUpdatesData","seqAwaiting","ptsAwaiting","clearStatePendingSync","popPendingPtsUpdate","curState","curPts","goodPts","goodIndex","getDifference","processLocalUpdate","wasSyncing","pts_total_limit","qts","differenceResult","other_updates","new_messages","apiMessage","nextState","intermediate_state","onDifferenceTooLong","justAName","getChannelDifference","channelState","bindPrefix","lastDifferenceTime","final","lastPtsUpdateTime","fwdHeader","hasUser","post","hasChat","popPts","popSeq","subscribeToChannelUpdates","subscription","cb","interval","unsubscribeFromChannelUpdates","force","clearInterval","attach","langCode","noErrorBox","stateResult","setUpdatesProcessor","strs","en","ru","getChangelog","lang","res","ok","langStr","parseMarkdown","inbox_date","languages","filterUnique","language","AppAvatarsManager","savedAvatarURLs","removeFromAvatarsCache","isAvatarCached","saved","loadAvatar","photo","peerPhotoFileLocation","downloadOptions","dc_id","limitPart","apiFileManager","blob","URL","createObjectURL","AppCallsManager","calls","IS_CALL_SUPPORTED","updatePhoneCall","saveCall","phone_call","updatePhoneCallSignalingData","callId","phone_call_id","computeKey","g_b","p","call","isDiscarded","oldCall","getCall","getCallInput","access_hash","savePhonePhoneCall","phonePhoneCall","generateDh","random_length","dhConfig","requestCall","protocol","g_a_hash","video","getUserInput","random_id","discardCall","duration","connection_id","AppChatsManager","isPeerNeeded","modifyUsernamesCache","onChatUpdated","updateChannelParticipant","clearCache","updateChatDefaultBannedRights","default_banned_rights","getFromCache","apiChats","saveApiChat","oldChat","participants_count","changedUsername","setUsernameToCache","oldPhotoId","newPhotoId","toggledForum","forum","changedPhoto","changedTitle","changedAnyBadge","verified","scam","fake","hasRights","rights","isThread","editChatDefaultBannedRights","banned_rights","until_date","isMegagroup","megagroup","isInChat","good","getInputPeer","getChannelInputPeer","getChatInputPeer","allowMin","getChatString","createChannel","inviteToChannel","input","usersInputs","u","createChat","leaveChannel","joinChannel","addChatUser","fwdLimit","fwd_limit","deleteChatUser","leaveChat","leave","deleteChannel","deleteChat","migrateChat","updateUsername","username","doNotRefresh","refreshChatAfterRequest","editPhoto","inputFile","inputChatPhoto","file","editTitle","editAbout","about","editBanned","participant","getParticipantPeerId","timestamp","actor_id","prev_participant","new_participant","kicked_by","clearChannelParticipantBannedRights","kickFromChannel","view_messages","kickFromChat","resolveChannel","messagesChats","togglePreHistoryHidden","toggleSignatures","toggleNoForwards","setChatAvailableReactions","reactions","chatFull","getCachedFullChat","available_reactions","getSendAs","invokeApiSingleProcess","processResult","sendAsPeers","importChatInvite","hash","checkUsername","getSponsoredMessage","invokeApiCacheable","cacheSeconds","sponsoredMessages","sponsoredMessage","viewSponsoredMessage","randomId","checkChatInvite","chatInvite","toggleUsername","active","reorderUsernames","deactivateAllUsernames","makeChannelPrivate","getChannels","toggleForum","editForumTopic","iconEmojiId","closed","createForumTopic","iconColor","channelFull","getChannelFull","sendAsInputPeer","default_send_as","icon_color","send_as","updatePinnedForumTopic","wrapUrl","unsafe","matchUrlProtocol","tgMeMatch","telescoPeMatch","tgMatch","onclick","prefix","pathname","fullPath","I18n","pluralRules","cacheLangPackPromise","setLangCode","lastRequestedLangCode","lastRequestedNormalizedLangCode","updateAmPm","timeFormat","dateTimeFormat","getDateTimeFormat","hour","minute","hour12","setHours","amText","format","amPmCache","am","pmText","pm","loadLocalLangPack","defaultCode","langSign","countries","strings","formatLocalStrings","default","saveLangPack","from_version","lang_code","local","loadLangPack","web","requestedServerLanguage","lang_pack","polyfillPromise","pushTo","langPack","appVersion","applyLangPack","currentLangCode","Intl","PluralRules","string","countriesList","country","langPackKey","default_name","lastAppliedLangCode","cachedDateTimeFormats","document","querySelectorAll","element","weakMap","superFormatter","indexHolder","lastIndex","p1","p2","p3","p4","createElement","append","lastIndexOf","wrappedUrl","href","setAttribute","DocumentFragment","firstChild","textContent","arg","pushNextArgument","plain","select","item","Node","isRTL","setRTL","rtl","getCacheLangPack","finally","setTimeFormat","haveToUpdate","IntlDateElement","getStrings","getLangPack","langPack1","langPack2","localLangPack1","localLangPack2","l","_Intl","WeakMap","IntlElementBase","classList","property","IntlElement","safeAssign","formatted","dataset","compareAndUpdate","json","DateTimeFormat","hours","getHours","getMinutes","capitalizeFirstLetter","i18n","i18n_","_i18n","months","days","getWeekNumber","UTC","getFullYear","getMonth","getDate","dayNum","getUTCDay","setUTCDate","getUTCDate","yearStart","getUTCFullYear","ceil","getTime","today","year","day","month","weekday","minYear","yearPattern","RegExp","monthYearOrDayPattern","yearOrDayAndMonthPattern","shortDate","longDate","numberOfDaysEachMonth","createForMonthYear","dates","selectedYear","currentYear","setFullYear","minDate","setMonth","maxDate","formatterMonthYear","createForDayMonth","validDateForMonth","formatterDayMonth","formatterYearMax","formatWeekLong","getDay","q","safeReplaceArrayInObject","trim","dayOfWeek","setDate","getDayOfWeek","distance","setTime","matches","exec","g1","g2","k","g3","parseInt","k1","EXTENSION_MIME_TYPE_MAP","pdf","tgv","tgs","wav","mp3","ogg","jpeg","jpg","png","gif","webp","mp4","webm","mov","svg","MIME_TYPE_EXTENSION_MAP","uploadWallPaperTempId","AppDocsManager","onServiceWorkerFail","docs","doc","supportsStreaming","thumbsStorage","deleteCacheContext","stickerCachedThumbs","uploadingWallPapers","online","saveDoc","oldDoc","file_reference","referenceDatabase","attributes","attribute","file_name","wrapPlainText","voice","mime_type","w","h","round_message","alt","stickerEmojiRaw","stickerSetInput","thumbs","IS_WEBP_SUPPORTED","sticker","IS_WEBM_SUPPORTED","animated","mappedMimeType","joiner","monthAsNumber","noSeconds","getSeconds","leadingZero","noTime","getFullDate","isServiceWorkerOnline","getCacheContext","setCacheContextURL","thumb","getDocumentDownloadOptions","getDocumentURL","getDoc","downloadDoc","queueId","onlyCache","downloadMedia","getLottieCachedThumb","toneIndex","saveLottiePreview","width","height","saveWebPConvertedStrippedThumb","stickerThumbConverted","prepareWallPaperUpload","cacheContext","wallpaper","slug","uploadWallPaper","fileName","wallPaper","downloaded","getGifs","invokeApiHashable","gifs","requestDocPart","requestFilePart","getDocumentInputFileLocation","AppDraftsManager","drafts","updateDraftMessage","notify","getKey","getDraft","getAllDrafts","getAllDraftPromise","apiDraft","processApiDraft","isEmptyDraft","reply_to_msg_id","syncDraft","localDraft","saveOnServer","serverDraft","draftsAreEqual","draftObj","getInputEntities","no_webpage","top_msg_id","saveLocalDraft","clearAllDrafts","combined","clearDraft","emptyDraft","setDraft","EMOJI_LANG_PACK","keywords","AppEmojiManager","keywordLangPacks","indexedLangPacks","getKeywordsPromises","recent","getRecentEmojisPromises","getCustomEmojiDocumentPromises","getEmojiKeywords","storageKey","pack","validateInitObject","keywordsDifference","packKeywords","keyword","emoticons","getBothEmojiKeywords","networkerFactory","native","getRecentEmojis","indexEmojis","searchEmojis","emojis","POPULAR_EMOJI","recentEmoji","recentCustomEmoji","pushRecentEmoji","emoji","fixEmoji","docIds","document_id","documents","appDocsManager","getCachedCustomEmojiDocuments","setDebouncedGetCustomEmojiDocuments","getCustomEmojiDocumentsPromise","allIds","getCustomEmojiDocument","getCustomEmojis","getEmojiStickers","AppGroupCallsManager","groupCalls","participants","nextOffsets","updateGroupCall","saveGroupCall","updateGroupCallParticipants","groupCallId","saveApiParticipants","groupCall","getCachedParticipants","prepareToSavingNextOffset","nextOffsetsMap","nextOffset","setNextOffset","newNextOffset","saveApiParticipant","skipCounterUpdating","oldParticipant","hasLeft","muted","can_self_unmute","getGroupCall","modified","just_joined","apiParticipants","editParticipant","getGroupCallInput","getInputPeerSelf","volume","raise_hand","raiseHand","video_paused","videoPaused","video_stopped","videoStopped","presentation_paused","presentationPaused","getGroupCallFull","participants_next_offset","shouldUpdate","createGroupCall","scheduleDate","schedule_date","getGroupCallParticipants","sources","groupCallParticipants","next_offset","hangUp","discard","groupCallInput","source","join_as","joinGroupCall","isMuted","joinVideo","leaveGroupCallPresentation","getPhotoInput","getPhotoMediaInput","ttl_seconds","getMediaInput","AppInlineBotsManager","inlineResults","setHash","getGeoInput","geo","lat","long","accuracy_radius","getInlineResults","bot","geo_point","stopTime","botResults","queryId","query_id","appPhotosManager","savePhoto","generateQId","pushPopularBot","getTopPeers","topPeers","botPeerId","topPeer","rating","switchToPM","fromPeerId","startParam","startBot","checkSwitchReturn","getUser","bot_inline_placeholder","peerData","switchInlineQuery","getPeerUsername","callbackButtonClick","button","msg_id","sendInlineResult","queryAndResultIds","inlineResult","queryID","resultID","resultId","send_message","reply_markup","replyMarkup","sendText","inputMedia","messageMedia","caption","sendMessage","geoPoint","address","provider","venue_id","venue_type","phone_number","first_name","last_name","vcard","description","currency","total_amount","shipping_address_requested","start_param","sendOther","AppMessagesIdsManager","tempNum","num","splitStringByLength","maxLength","lastSliceStartIndex","arrayIndex","cut","end","part","_arrayIndex","partLength","appTabsManager","tabs","start","getTabs","tab","addTab","deleteTab","getDocumentInput","setBooleanFlag","processAfter","UPDATE_STICKERSET_ORDER","AppMessagesManager","pendingByRandomId","pendingByMessageId","pendingAfterMsgs","tempFinalizeCallbacks","sendSmthLazyLoadQueue","needSingleMessages","extendedMedia","maxSeenId","newDialogsToHandle","notificationsToHandle","reloadConversationsPeers","groupedTempId","typings","unreadMentions","goToNextMentionPromises","batchUpdates","middleware","clean","uploadFilePromises","messagesStorageByPeerId","groupedMessagesStorage","scheduledMessagesStorage","historiesStorage","threadsStorage","searchesStorage","pinnedMessages","threadsServiceMessagesIdsStorage","threadsToReplies","handleNewDialogs","newMaxSeenId","updateMap","processDialog","isDialogDefined","incrementMaxSeenId","handleNotifications","notificationsHandlePromise","notifyPeerToHandle","getNotifyPeerSettings","peerTypeNotifySettings","mentioned","notifyAboutMessage","fwdCount","onUpdateMessageId","onUpdateNewMessage","getMessagePeer","isLocalThreadUpdate","createMessageStorage","threadKey","getThreadKey","handleNewUpdateAfterReload","threadStorage","reply_to_peer_id","reply_to_mid","receiptMessage","checkPendingMessage","updateMessageRepliesIfNeeded","ignoreExisting","findSlice","firstSlice","forceUserOnline","handleNewMessage","inboxUnread","modifyCachedMentions","setDialogTopMessage","notifyPeer","onUpdateMessageReactions","recentReaction","previousReactions","previousRecentReactions","show_previews","peerReaction","pushBatchUpdate","batchUpdateReactions","setDialogToStateIfMessageIsTop","onUpdateDialogUnreadMark","unread_mark","onUpdateEditMessage","oldMessage","newMessage","handleEditedMessage","isTopMessage","clear_history","dispatchEditEvent","newReactions","grouped_id","onUpdateReadHistory","max_id","read_max_id","getObjectKeysAndSort","stillUnreadCount","still_unread_count","newUnreadMentionsCount","foundAffected","repliesKey","getReadMaxIdIfUnread","messageThreadId","getMessageThreadId","setCount","threadKeyPart","onUpdateReadMessagesContents","topMsgId","mids","findPeerIdByMids","media_unread","fixDialogUnreadMentionsIfNoMessage","onUpdateChannelAvailableMessages","availableMinId","available_min_id","onUpdateDeleteMessages","threadKeys","historyUpdated","handleDeletedMessages","threadsStorages","msgs","affected","onUpdateChannel","needDialog","getPeerActiveUsernames","onUpdateChannelReload","flushStoragesByPeerId","onUpdateChannelMessageViews","views","batchUpdateViews","onUpdateServiceNotification","popup","phone","onUpdatePinnedMessages","missingMessages","werePinned","getPinnedMessagesKey","hiddenPinnedMessages","onUpdateNotifySettings","onUpdateNewScheduledMessage","isScheduled","onUpdateDeleteScheduledMessages","onUpdateMessageExtendedMedia","extended_media","batch","toDispatch","getMessagesFromMap","previousResults","changedResults","reactionCount","previousReactionCount","_reactionCount","reactionsEqual","chosen_order","updateMessageID","updateNewDiscussionMessage","updateNewMessage","updateNewChannelMessage","updateDialogUnreadMark","updateEditMessage","updateEditChannelMessage","updateMessageReactions","updateReadChannelDiscussionInbox","updateReadChannelDiscussionOutbox","updateReadHistoryInbox","updateReadHistoryOutbox","updateReadChannelInbox","updateReadChannelOutbox","updateChannelReadMessagesContents","updateReadMessagesContents","updateChannelAvailableMessages","updateDeleteMessages","updateDeleteChannelMessages","updateChannel","updateChannelReload","updateChannelMessageViews","updateServiceNotification","updatePinnedMessages","updatePinnedChannelMessages","updateNotifySettings","updateNewScheduledMessage","updateDeleteScheduledMessages","updateMessageExtendedMedia","filterFunc","getScheduledMessagesStorage","webpage","appWebPagesManager","getCachedWebPage","drop","poll","appPollsManager","pollToMessages","startsWith","batchUpdatesDebounced","debounce","details","maxSeenMsgId","sendEntites","entity","invokeAfterMessageIsSent","tempId","callbackName","finalize","editMessage","is_scheduled","newMedia","noWebPage","handled","replyToMsgId","MAX_LENGTH","message_length_max","webPage","getPeerMigratedTo","generateOutgoingMessage","toggleError","onMessagesSendError","sentRequestOptions","afterMessageId","sendAs","sendAsPeerId","apiPromise","invokeApiAfter","clear_draft","update_stickersets_order","wrapMessageEntities","beforeMessageSending","sequential","noop","sendFile","attachType","apiFileName","fileType","File","isDocument","Blob","isPhoto","IMAGE_MIME_TYPES_SUPPORTED","strippedPhotoSize","strippedBytes","actionName","isVoiceMessage","waveform","isMedia","photoSize","sizes","objectURL","VIDEO_MIME_TYPES_SUPPORTED","videoAttribute","isRoundMessage","supports_streaming","noSound","thumbCacheContext","sentDeferred","spoiler","uploadingFileName","getFileNameForUpload","uploaded","uploadPromise","load","thumbUploadPromise","cancelPendingMessage","setTyping","addNotifyListener","progress","percents","floor","done","total","notifyAll","force_file","isGroupedItem","background","ret","sendAlbum","sendFileDetails","groupId","o","invoke","multiMedia","multi_media","originalInputMedia","inputSingleMedia","inputs","sendContact","contactPeerId","getContactMediaInput","pollId","savePoll","total_voters","getPoll","getPhoto","postAuthor","getPeer","signatures","generateFromId","post_author","generateFlags","generateReplyHeader","via_bot_id","replies","generateReplies","replyToTopId","originalMessage","forum_topic","reply_to_top_id","linked_chat_id","comments","replies_pts","isAnonymousSending","generateForwardHeader","isUserHidden","from_name","userFull","getCachedFullUser","private_forward_name","channel_post","saved_from_msg_id","saved_from_peer","generateFakeAvatarMessage","Number","MAX_SAFE_INTEGER","getUploadPromise","uploadFileName","admin_rights","anonymous","pendingData","fillConversations","chatHistoryStorage","maxSeenIdIncremented","hasPrepend","noIdsDialogs","setFolderId","setMessageUnreadByDialog","folderDialogs","dialogsLength","slicedDialogs","offset_peer","offsetPeerId","forwardMessages","config","overflowMids","forwarded_count_max","dropCaptions","dropAuthor","newMids","newMessages","replyToMid","replyToMessageIdx","newReplyToMid","getStickerEffectThumb","nopremium","group","from_peer","to_peer","with_my_score","withMyScore","drop_author","drop_media_captions","generateEmptyMessage","getMessagesStorageByKey","s","getMessagesStorage","getMessageById","cantForwardDeleteMids","cantForward","cantDelete","canForward","canDeleteMessage","reloadConversationOrTopic","inputDialogPeer","getInputDialogPeerById","reloadConversationsPromise","inputDialogPeers","currentState","doFlushHistory","just_clear","revoke","affectedHistory","flushHistory","justClear","getHistory","historyResult","getTypingKey","ss","hidePinnedMessages","getPinnedMessage","getSearch","inputFilter","getPinnedMessagesCount","getPinnedMessagesMaxId","updatePinnedMessage","unpin","pm_oneside","unpinAllMessages","unpinAll","getAlbumText","getGroupsFirstMessage","minMid","getMidsByAlbum","groupedId","getMessagesByAlbum","getMidsByMessage","filterMessages","appMessagesIdsManager","saveMessage","isMessage","replyTo","overwriting","msgId","savedFromPeerId","savedFromMid","savedFrom","mediaContext","unsupported","originalDoc","messageKey","getMessageKeyForPendingWebPage","saveWebPage","appWebDocsManager","saveWebDocument","extendedMediaMedia","totalEntities","migrateFrom","migrateTo","video_sizes","appGroupCallsManager","migrateChecks","getFirstMessageToEdit","goodMessage","myPeerId","canEditMessage","apiEntities","myEntities","parseEntities","mergeEntities","reportMessages","editPeerFolders","getDialogPeer","markDialogUnread","read","fromChat","canMessageBeEdited","kind","goodMedias","edit_time_limit","getReplyKeyboard","messageReplyMarkup","lastReplyMarkup","selective","maxOutId","single_use","getSearchStorage","getSearchCounters","canCache","isPeerRestricted","func","filterMessagesByInputFilterFromStorage","_storage","filterMessagesByInputFilter","nextRate","backLimit","offset_id_offset","next_rate","foundMsgs","min_date","max_date","add_offset","min_id","offsetId","offsetMessage","offset_rate","searchResult","foundCount","subscribeRepliesThread","getDiscussionMessage","generateThreadServiceStartMessage","maxMessageId","serviceStartMessage","is_single","getThreadServiceMessageId","getMessageWithReplies","newMaxId","unsetEnd","newDialogsHandlePromise","deleteMessages","localMessageIds","creator","delete_messages","affectedMessages","readHistory","triedToReadMaxId","readPromise","getPeerString","readAllHistory","getUnreadMentionsKey","slicedArray","fixUnreadMentionsCountIfNeeded","goToNextMention","loadNextPromise","loadNextMentions","last","getUnreadMentions","mergeHistoryResult","minId","messagesMessages","readMessages","msgIds","getHistoryStorageTransferable","historySerialized","toJSON","inputNotifyPeer","getInputNotifyPeerById","ignorePeerId","getNotifyPeerTypeSettings","getNotifySettings","isMessageIsTopMessage","threadMessage","broadcastEventName","pendingMessage","finalizePendingMessage","mutePeer","validatePeerSettings","muteUntil","mute_until","togglePeerMute","mute","canSendToPeer","canSendToUser","finalMessage","tempMessage","finalizePendingMessageCallbacks","newPhoto","newDoc","newPhotoSize","oldCacheContext","getPhotoDownloadOptions","thumbSize","polls","handleReleasingMessage","getMessageReactionsListAndReadParticipants","skipReadParticipants","skipReactionsList","emptyMessageReactionsList","canViewMessageReadParticipants","getMessageReadParticipants","appReactionsManager","getMessageReactionsList","messageReactionsList","readParticipantsPeerIds","filteredReadParticipants","readPeerId","reactionsCount","readParticipants","appConfig","getAppConfig","chat_read_mark_size_threshold","chat_read_mark_expire_period","incrementMessageViews","increment","chatPeerIds","idleStartTime","getScheduledMessageByPeer","getScheduledMessages","sendScheduledMessages","deleteScheduledMessages","getMessageWithCommentReplies","isFetchIntervalNeeded","getNewHistory","isBottomEnd","getEnds","offsetIdOffset","haveSlice","sliceMe","fulfilled","fillHistoryStorage","constructSlice","isHistoryResultEnd","topWasMeantToLoad","wasMaxId","requestHistory","deleteSlice","oldestMessage","foundSlice","_historyResult","fetchSingleMessages","fetchSingleMessagesPromise","requestPromises","getMessagesResult","getExtendedMedia","toRequest","fetchMessageReplyTo","replyToPeerId","typing","smth","deleteWebPageFromPending","updatePollToMessage","groupedStorage","albums","dispatchAlbumEdit","deletedMids","noforwards","noForwards","getElementCallback","newMap","peerIdStr","saveDefaultSendAs","convertInputKeyToKey","inputKey","AppNotificationsManager","peerSettings","notifyUsers","notifyChats","notifyBroadcasts","notifyForumTopic","checkMuteUntil","checkMuteUntilTimeout","closestMuteUntil","peerNotifySettings","typeKey","checkMuteUntilThrottled","throttle","isPeerType","notifySettings","getNotifyPeerTypePromise","getContactSignUpNotification","notifyContactsSignUp","setContactSignUpNotification","getPeerKey","getPeerMuted","getPeerLocalSettings","n","peerKey","typeNotifySettings","AppPeersManager","canPinMessage","getPeerPhoto","getUserString","getRestrictionReasonText","restriction_reason","getUserInputPeer","getUserSearchText","getDialogType","getDeleteButtonText","AppPhotosManager","photos","oldPhoto","Infinity","getUserPhotos","inputUser","photosResult","photoIds","photoId","AppPollsManager","updateMessagePoll","poll_id","saveResults","chosenIndexes","answer","chosen","getInputMediaPoll","correctAnswers","solution","solutionEntities","correct_answers","solution_entities","sendVote","optionIds","answers","option","getResults","getVotes","votesList","stopPoll","newPoll","AppPrivacyManager","privacy","updatePrivacy","rules","setPrivacy","privacyRules","inputRule","rule","getPrivacy","privacyKey","getGlobalPrivacySettings","setGlobalPrivacySettings","PEER_FULL_TTL","AppProfileManager","usersFull","chatsFull","fullExpiration","onUpdateUserTyping","getTypingsKey","typingsInPeer","t","cancelAction","getChatFull","onUpdatePeerBlocked","blocked","updateChatParticipants","updateChatParticipantAdd","_participants","updateChatParticipantDelete","updateUserTyping","updateChatUserTyping","updateChannelUserTyping","updatePeerBlocked","fullChat","updated","call_active","hasChatPhoto","chat_photo","refreshFullPeer","invalidateChannelParticipants","usersUserFull","full_user","profile_photo","botInfo","bot_info","referenceContext","description_document","description_photo","getProfileByPeerId","getCachedProfileByPeerId","getFullPhoto","profile","full_chat","getChatInviteLink","exported_invite","link","exportedInvite","getChannelParticipants","broadcast","getChannelParticipant","channelParticipant","fullChannel","processError","getMentions","processUserIds","ratingMap","cP","updateProfile","saveApiUser","uploadProfilePhoto","updateResult","strippedThumb","stripped_thumb","deletePhotos","deletedList","verifyParticipantForOnlineCount","reduceParticipantsForOnlineCount","getOnlines","chatInfo","channelParticipants","onlines","getPeerTypings","callbackifyAll","SAVE_DOC_KEYS","REFERENCE_CONTEXT","AppReactionsManager","availableReactions","getAvailableReactions","sendReactionPromises","lastSendingTimes","availableReaction","around_animation","static_icon","appear_animation","center_icon","messagesAvailableReactions","getActiveAvailableReactions","inactive","getAvailableReactionsForPeer","activeAvailableReactions","unshiftQuickReaction","getQuickReaction","quickReaction","chatAvailableReactions","filteredChatAvailableReactions","unshiftQuickReactionInner","getAvailableReactionsByMessage","isReactionActive","reactions_default","getReactionCached","getReaction","getMessagesReactions","setDefaultReaction","sendReaction","lastSendingTimeKey","unsetReactionCount","canSeeList","can_see_list","chosenReactions","unsetReactions","chosenReactionIdx","chosenReactionCount","chosenReactionsLength","reactionCountIdx","id1","id2","promiseKey","editMessageUpdateIdx","editMessageUpdate","LOCAL_IDS","EMOJI","EMOJI_ANIMATIONS","PREMIUM_GIFTS","GENERIC_ANIMATIONS","DEFAULT_STATUSES","DEFAULT_TOPIC_ICONS","LOCAL_IDS_SET","AppStickersManager","processAllStickersResult","allStickers","sets","stickerSet","videos","getStickerSetPromises","getStickersByEmoticonsPromises","sounds","getAnimatedEmojiStickerSet","getGreetingStickersPromise","getGreetingStickersTimeout","getGreetingSticker","onStickersUpdated","updateNewStickerSet","saveStickerSet","updateRecentStickers","updateFavedStickers","updateMoveStickerSetToTop","stickers","getFavedStickersStickers","getRecentStickersStickers","justPreload","getStickersByEmoticon","greetingStickers","random","saveStickers","canUseStickerSetCache","useCache","refreshTime","getStickerSet","cachedSet","getStickerSetInput","saveById","getLocalStickerSet","animations","getAnimatedEmojiSoundsPromise","emojies_sounds","sound","bytesStr","atob","file_reference_base64","charCodeAt","this_dc","getRecentStickers","recentStickers","saveRecentSticker","unsave","_doc","docEmoticon","faved","cleanEmoji","getAnimatedEmojiSticker","isAnimation","packs","getAnimatedEmojiSoundDocument","preloadAnimatedEmojiSticker","preloadEmojiPromise","preloadAnimatedEmojiStickerAnimation","animation","preloadSticker","isPremiumEffect","video_thumbs","newSet","setToCache","needSave","installed_date","getStickerSetThumbDownloadOptions","thumb_dc_id","isAnimated","mimeType","getFeaturedStickers","covered","getPromoPremiumStickers","getPremiumStickers","getFavedStickers","favedStickers","getFavedStickersLimit","faveSticker","unfave","toggleStickerSet","archived","toggleStickerSets","searchStickerSets","excludeFeatured","exclude_featured","foundSaved","cover","getAllStickers","preloadStickerSets","includeOurStickers","messagesStickers","installedSets","foundStickers","cachedStickersAnimated","cachedStickersStatic","iteratePacks","clearRecentStickers","AppUsersManager","usernames","getTopPeersPromises","contactsIndex","createSearchIndex","contactsFillPromise","contactsList","updatedContactsList","updateUsersStatuses","timestampNow","updateUserStatus","setInterval","expires","was_online","setUserToStateIfNeeded","updateUserName","contactsListCachedTime","contact","mutual_contact","pushContact","recentSearch","onContactsModified","fromServer","pushRecentSearch","clearRecentSearch","resolveUsername","resolvedPeer","processResolvedPeer","resolvePhone","popContact","getContacts","includeSaved","sortBy","_contactsList","userId1","userId2","sortName1","sortName","sortName2","localeCompare","status1","getUserStatusForSort","myUserId","testSelfSearch","getContactsPeerIds","toggleBlock","block","apiUsers","cleanedUsernames","cleanUsername","searchUsername","oldPeer","oldUser","fullName","wasContact","newContact","onContactUpdated","checkPremium","isUserOnlineVisible","getUserStatus","isRegularUser","getUserPhone","isAnonymous","fragment_prefixes","isAttachMenuBot","bot_attach_menu","support","isNonContactUser","eventTimestamp","importContact","importContacts","phones","inputContacts","j","client_id","importedContactsResult","imported","importedContact","topPeersCache","cachedTime","categories","getBlocked","contactsBlocked","getLocated","self_expires","searchContacts","my_results","curIsContact","setUserStatus","offline","updateMyOnlineStatus","addContact","addPhonePrivacyException","add_phone_privacy_exception","deleteContacts","photoTypeSet","AppWebPagesManager","webpages","pendingWebPages","updateWebPage","apiWebPage","oldWebPage","isUpdated","siteName","site_name","shortTitle","author","pendingSet","getWebPage","readBlobAsArrayBuffer","readBlobAs","fileNameRFC","escape","DownloadWriter","serviceMessagePort","getServiceMessagePort","write","chunk","saveToStorage","DownloadStorage","getFile","prepareWriting","headers","cancel","getWriter","MIN_PART_SIZE","IGNORE_ERRORS","ApiFileManager","cacheStorage","downloadStorage","downloadPromises","uploadPromises","downloadPulls","downloadActives","refreshReferencePromises","maxUploadParts","maxDownloadParts","uncompressTGS","uncompressTGV","svgIndex","__","fixFirefoxSvg","TextEncoder","convertWebp","convertOpus","webFileDcId","webfile_dc_id","upload_max_fileparts_premium","upload_max_fileparts_default","downloadRequest","activeDelta","downloadPull","downloadCheck","downloadLimit","setQueueId","getFileStorage","cancelDownload","canceled","requestWebFilePart","checkCancel","isLocalWebFile","extension","file_type","mtime","fileDownload","getDelta","checkedReference","getLimitPart","isUpload","maxParts","maxPartSize","inputFileLocation","isDownloading","getDownload","getUpload","getConvertMethod","IS_OPUS_SUPPORTED","allocateDeferredPromises","startOffset","delayed","writeDeferred","writePromise","originalMimeType","convertMethod","getDownloadFileNameFromOptions","cacheFileName","errorHandler","prepared","isWebFile","cachePrepared","downloadPrepared","possibleSize","_errorHandler","writer","truncate","downloadFileName","readBlobAsUint8Array","requestPart","dispatchProgress","throttledDispatchProgress","superpuper","isFinal","getParts","replaceParts","processedResult","getDownloadMediaDetails","downloadMediaURL","downloadMediaVoid","fileSize","isBigFile","partSize","totalParts","fileId","resultInputFile","parts","md5_checksum","resolved","it","_part","doneParts","file_id","file_part","file_total_parts","fileUpload","generator","ApiManagerMethods","apiPromisesSingleProcess","apiPromisesSingle","apiPromisesCacheable","afterMessageIdTemp","setUserAuth","prepareTempMessageId","queryJSON","newResult","cacheKey","oldPromise","getNewPromise","newPromise","ignore_restriction_reasons","pin","folderPin","bio","topicPin","ApiManager","cachedNetworkers","cachedExportPromise","gettingNetworkers","baseDcId","afterMessageTempIds","changeTransportType","updateConfig","iterateNetworkers","getTransportType","connections","dcs","array","oldTransportType","oldObject","oldGetKey","newGetKey","info","changeNetworkerTransport","getBaseDcId","sessionStorage","setBaseDcId","userAuth","dcID","user_auth","wasDcId","getNetworker","setOnDrainIfNeeded","dc","logOut","loggingOut","storageKeys","storageResult","logoutPromises","ignoreErrors","toggleStorages","generateNetworkerGetKey","networkers","maxNetworkers","found","isOnline","ak","authKeyHex","serverSaltHex","authKey","bytesFromHex","authKeyId","serverSalt","authorizer","_error","newTransportType","removeTransport","stack","getNetworkerVoid","oldTransport","changeTransport","onNetworkerDrain","onDrain","removeNetworker","isFileNetworker","canRelease","setDrainTimeout","updatesProcessor","cachedNetworker","startTime","isStopped","performRequest","wrapApiCall","exportResolve","exportReject","exportedAuth","newDcId","unsetConnectionInited","rawError","waitTime","floodMaxTimeout","attachPromise","originalError","PeersStorage","neededPeers","singlePeerMap","thumbFullSize","ThumbsStorage","thumbsCache","intToUint","ulongFromInts","high","low","shiftLeft","safeBigInt","ulongBigInt","pow","longBigInt","divide","bigIntFromBytes","base","boolFalse","predicate","boolTrue","vector","gzipPacked","sliceMethod","TLSerialization","mtproto","startMaxLength","createBuffer","ArrayBuffer","intView","Int32Array","byteView","getArray","resultBuffer","resultInt32","subarray","getBuffer","getBytes","typed","resultArray","getOffset","checkLength","needBytes","previousBuffer","previousArray","writeInt","field","storeInt","storeBool","storeLongP","iHigh","iLow","storeLong","sLong","storeIntBytes","_bigInt","bigInt","isNegative","quotient","remainder","divmod","toJSNumber","storeDouble","Float64Array","storeString","sUTF8","unescape","storeBytes","bits","storeRawBytes","storeMethod","methodName","methodData","methods","m","flagsOffsets","param","condType","fieldBit","storeObject","paramName","itemType","schema","isBare","constructorData","TLDeserialization","readInt","fetchInt","fetchDouble","doubleView","fetchLong","ulong","greater","minus","greaterOrEquals","abs","fetchBool","fetchObject","fetchString","String","fromCharCode","decodeURIComponent","fetchBytes","fetchIntBytes","fetchRawBytes","fetchVector","fallback","checkType","constructorCmp","uncompressed","constructorsIndex","schemaFallback","int1","int2","overrideKey","isCond","formatJSONValue","jsonValue","objectValues","objectValue","setOffset","addPadding","blockSize","zeroes","blockSizeAsTotalLength","needPadding","padding","bufferConcats","delays","disconnectDelayMin","disconnectDelayMax","pingInterval","pingMaxTime","connectionTimeout","RESEND_OPTIONS","noSchedule","notContentRelated","invokeAfterMsgConstructor","networkerTempId","MTPNetworker","lastServerMessages","sentMessages","pendingMessages","pendingAcks","pendingResendReq","nextReq","checkConnectionPeriod","lastResponseTime","activeRequests","sendPingDelayDisconnect","pingDelayDisconnectDeferred","lastPingTime","disconnectDelay","round","timeoutTime","lastPingStartTime","pingId","lastPingDelayDisconnectId","wrapMtpCall","ping_id","disconnect_delay","rejectTimeout","elapsedTime","checkLongPoll","isClean","longPollPending","sleepAfter","sendLongPoll","checkConnection","clearCheckConnectionTimeout","serializer","pingMessage","generateId","seq_no","generateSeqNo","sendEncryptedRequest","toggleOffline","checkConnectionTimeout","authKeyUint8","convertToUint8Array","isFileUpload","isFileDownload","updateSession","seqNo","prevSessionId","updateSentMessage","sentMessageId","sentMessage","container","inner","innerSentMessageId","innerSentMessage","pushMessage","wrapMtpMessage","connectionInited","invokeWithLayer","initConnection","resultType","isAPI","nextReqTimeout","longPollInterval","clearPingDelayDisconnect","forceReconnectTimeout","sendingLongPoll","max_delay","wait_after","max_wait","noResponse","longPoll","delay","checkConnectionRetryAt","scheduleRequest","handleSentEncryptedRequestHTTP","noResponseMsgs","sqrt","pushResend","shouldResolve","onDrainTimeout","willChange","onConnectionStatusChange","innerMsgId","acked","getMsgKey","dataWithPadding","x","msgKeyLargePlain","msgKeyLarge","getAesKeyIv","msgKey","sha2aText","sha2bText","aesKey","aesIv","sha2a","sha2b","akStopped","performScheduledRequest","ackMsgIds","msg_ids","pendingResendReqLength","outMessage","messagesByteLen","hasApiCall","hasHttpWait","lengthOverflow","compare","messageByteLength","generateContainerMessage","messageWithBody","innerMessages","getEncryptedMessage","keyIv","getDecryptedMessage","encryptedData","getEncryptedOutput","dataBuffer","paddingLength","encryptedResult","requestData","baseError","responseBuffer","deserializer","bytesCmp","calcMsgKey","totalLength","messageBodyLength","messageBody","mt_message","seqno","mt_rpc_result","req_msg_id","applyServerSalt","newServerSalt","toArray","ackMessage","reqResend","notEmpty","processMessageAck","error_message","error_code","msg","applyServerTime","serverTime","shiftRight","innerMessage","new_server_salt","bad_msg_id","changedTimeOffset","badMessage","first_msg_id","server_salt","answer_msg_id","lastResendReq","lastResend","pendingResend","reqMsgId","badMsgId","pos","NetworkerFactory","startAll","stoppedNetworkers","stopAll","setLanguage","testPublicKeysHex","modulus","exponent","publisKeysHex","publicKeysParsed","preparePromise","prepare","keyParsed","RSAPublicKey","fingerprintBytes","fingerprints","fingerprintHex","fill","foundKey","fingerprint","bytesXor","bytes1","bytes2","Authorizer","sendPlainRequest","requestArray","requestLength","headerArray","errorCode","auth_key_id","msg_len","sendReqPQ","nonce","rsaKeysManager","serverNonce","server_nonce","pq","server_public_key_fingerprints","publicKey","pAndQ","sendReqDhParams","newNonce","p_q_inner_data_dc","new_nonce","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","localTime","tmpAesKey","tmpAesIv","answerWithHash","answerWithPadding","g","dhPrime","dh_prime","gA","g_a","server_time","retry","verifyDhParams","dhPrimeHex","gABigInt","dhPrimeBigInt","subtract","twoPow","gBytes","gB","retry_id","authKeyHash","authKeyAux","newNonceHash1","new_nonce_hash1","newNonceHash2","new_nonce_hash2","newNonceHash3","new_nonce_hash3","getTransportTypePromise","_try","TimeManager","lastMessageId","timeOffset","timeTicks","newTimeOffset","changed","server_time_offset","AppWebDocsManager","webDocument","AppPaymentsManager","getInputInvoiceBySlug","getInputInvoiceByPeerId","getPaymentForm","invoice","paymentForm","getPaymentReceipt","validateRequestedInfo","sendPaymentForm","formId","requestedInfoId","shippingOptionId","credentials","tipAmount","form_id","requested_info_id","shipping_option_id","tip_amount","clearSavedInfo","AppAttachMenuBotsManager","attachMenuBots","attachMenuBotsArr","onUpdateAttachMenuBots","getAttachMenuBots","updateAttachMenuBots","saveAttachMenuBot","attachMenuBot","bot_id","icon","getAttachMenuBotIcon","saveAttachMenuBots","getAttachMenuBotCached","requestWebView","fromBotMenu","themeParams","from_bot_menu","theme_params","prolongWebView","AppSeamlessLoginManager","requestUrlAuth","buttonId","button_id","urlAuthResult","acceptUrlAuth","writeAllowed","write_allowed","getWebAuthorizations","webAuthorizations","authorizations","resetWebAuthorization","resetWebAuthorizations","AppThemesManager","wallPapers","saveWallPaper","getWallPaper","inputWallPaper","getInputWallPaper","getThemes","accountThemes","themes","theme","themeSettings","getWallPapers","accountWallpapers","wallpapers","appManagersManager","cryptoWorkersURLs","cryptoPortsAttached","cryptoPortPromise","getManagers","manager","apply","ports","originalUrl","newURLs","createManagers","appAvatarsManager","appCallsManager","appPrivacyManager","appInlineBotsManager","passwordManager","appPaymentsManager","appSeamlessLoginManager","_serviceMessagePort","_isServiceWorkerOnline","pushedKeys","clearWrite","invokeExceptSource","serviceWorkerOnline","serviceWorkerPort","detachPort","attachPort","messagePort","onConnect","onDisconnect","listenPort","sendPort","attachListenPort","attachSendPort","setOnPortDisconnect","listenMessagePort","NULL_PEER_ID","REPLIES_PEER_ID","REPLIES_HIDDEN_CHANNEL_ID","SERVICE_PEER_ID","MUTE_UNTIL","MAX_FILE_SAVE_SIZE","THUMB_TYPE_FULL","ATTACH_MENU_BOT_ICON_NAME","GENERAL_TOPIC_ID","T_ME_PREFIXES","FOLDER_ID_ALL","FOLDER_ID_ARCHIVE","REAL_FOLDERS","START_LOCAL_ID","ALPHA_CHARS_REG_EXP","ALPHA_NUMERIC_REG_EXP","URL_ALPHANUMERIC_REG_EXP_PART","URL_PROTOCOL_REG_EXP_PART","URL_REG_EXP","URL_ANY_PROTOCOL_REG_EXP","USERNAME_REG_EXP","BOT_COMMAND_REG_EXP","FULL_REG_EXP","EMAIL_REG_EXP","MARKDOWN_REG_EXP","MARKDOWN_ENTITIES","PASS_CONFLICTING_ENTITIES","PHONE_NUMBER_REG_EXP","encodeEmoji","emojiText","unicodeSurrogates","points","char","previous","toCodePoints","removeVS16s","vs16RegExp","zeroWidthJoiner","rawEmoji","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","__webpack_exports__","O","chunkIds","fn","priority","notFulfilled","getter","__esModule","definition","enumerable","chunkId","miniCssF","globalThis","Function","prop","Symbol","toStringTag","nmd","paths","children","scriptUrl","importScripts","currentScript","src","scripts","getElementsByTagName","oldGetScript","oldLoadScript","queryMap","countMap","retries","realSrc","cacheBust","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","moreModules","runtime"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"mtproto.worker.5211e33b3f0c47c582c8.chunk.js","mappings":"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Ac,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,MAAO,kBAAkB,MAAO,QAAQ,MAAO,kBAAkB,MAAO,4CAA4C,MAAO,4CAA4C,MAAO,4CAA4C,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,6BAA6B,KAAM,wCAAwC,KAAM,QAAQ,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,6BAA6B,KAAM,6BAA6B,KAAM,wCAAwC,KAAM,wCAAwC,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,GAAI,QAAQ,IAAK,QAAQ,IAAK,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,GAAI,QAAQ,IAAK,QAAQ,IAAK,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,IAAK,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,IAAK,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,iBAAiB,KAAM,iBAAiB,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,IAEp35EC,EAAmCD,EAAc,IACvD,IAAI,MAAME,KAAWF,EAChBE,GACDC,OAAOC,OAAOH,EAAOD,EAAcE,IAIvC,S,yECTO,MAAMG,EAAaC,UAAYA,UAAUC,UAAY,KAU/CC,GATWF,UAAUC,UAAUE,OAAO,yBACzBH,UAAUC,UAAUG,cAAcC,QAAQ,WACzC,SAASC,KAAKN,UAAUC,YAAc,aAAaK,KAAKN,UAAUO,SAG7D,mBAAmBD,KAAKN,UAAUQ,WACxC,aAAvBR,UAAUQ,UAA2BR,UAAUS,eAAiB,IAC/D,gBAEwB,oBAAuBV,KAAe,yBAAyBO,KAAKP,IAAkBA,EAAWW,MAAM,YAAcX,EAAWW,MAAM,aACrJC,EAAaX,UAAUC,UAAUG,cAAcC,QAAQ,YAAc,QAI3BO,IAA7BZ,UAAUS,gBAAgCT,UAAUS,eAAiB,IAAMT,UAAUC,UAAUE,OAAO,iH,yDCVzH,MAAMU,EAAa,4CACpBC,EAAS,YAETC,EAA6B,CACjC,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,IAAK,KAqBQ,SAASC,EAAgBC,EAAcC,GAAW,GAC/D,OAAOC,EAAkBF,EAAM,CAC7BG,eAAe,EACfF,WACAG,YAAY,GAEhB,CASO,SAASF,EAAkBF,EAAcK,EAAoC,CAAC,GACnF,MAAMC,EAASD,EAAQE,YAAiC,MAAnBP,EAAKQ,OAAO,GAC3CC,EAAeT,EAMrB,OALGK,EAAQF,gBAAeH,EApCrB,SAA8BA,GACnC,OAAOA,EAAKU,QAAQd,EAAY,IAAIc,QAAQb,EAAQ,GACtD,CAkCmCc,CAAqBX,IACnDK,EAAQJ,WAAUD,EA1BhB,SAAwBA,GAC7B,OAAOA,EAAKU,QAAQ,iBAAkBE,IACpC,MAAMC,EAAa,IAAYD,GAC/B,OAAOC,QAAAA,EAAcD,CAAE,GAE3B,CAqB8BE,CAAed,IACxCK,EAAQD,aAAYJ,EAAOA,EAAKb,eAChCmB,IAAQN,EAAO,IAAMA,GACrBK,EAAQJ,WAAUD,GAAQ,IApCxB,SAAqBA,GAC1B,OAAOA,EAAKb,cAAcuB,QAAQ,YAAaE,IAC7C,MAAMC,EAAaf,EAAIc,GACvB,OAAOC,QAAAA,EAAcD,CAAE,GAE3B,CA+BwCG,CAAYN,IAC3CT,CACT,C,0CCrFA,MAAMgB,EAAkB,IAEjB,SAASC,EAAsBC,EAAoDb,GAIxF,MACMc,EADW,MACaC,OAAS,IAAM,GAE7C,IAAIC,EACJ,OAAOH,EAASI,GACd,IAAK,yBACHD,EAAM,CAAC,QANM,GAMY,GAAIH,EAASK,GAAIL,EAASM,YAAYC,OAAOC,SAASC,KAAKX,GACpF,MAGF,IAAK,4BACHK,EAAM,CAAC,WAXM,GAWe,GAAIH,EAASK,GAAIL,EAASM,YAAYC,OAAOC,SAASC,KAAKX,GACvF,MAGF,IAAK,6BACHK,EAAM,CAAC,YAAaH,EAASU,SAAUV,EAASW,OAAOC,IAAM,MAAQ,SAASH,KAAKX,GACnF,MAEF,IAAK,uBAKHK,EAAM,CAAC,kBAJKH,EAASa,WAAiDR,IACnEL,EAASa,WAAwDC,YACjEd,EAASa,WAAmDE,UAC7Df,EAASa,WAAWT,EACQJ,EAASgB,eAAeP,KAAKX,GAC3D,MAGF,IAAK,oBACHK,EAAM,CAACH,EAASiB,UAAWjB,EAASkB,UAAUT,KAAKX,GACnD,MAGF,IAAK,uBACHK,EAAM,CAAC,UAAWH,EAASmB,KAAKV,KAAKX,GACrC,MAGF,QACEsB,QAAQC,MAAM,yBAA0BrB,GACxCG,EAAM,GAKV,OAAOA,IAAOhB,aAAO,EAAPA,EAASmC,YAAa,YAAc,KAAOrB,EAAM,IAAMA,EAAMA,EAC7E,CAGO,SAASsB,EAAWC,EAAmBrC,GAM5C,OAAmBqC,EAAO,IAHVC,mBAAmBC,KAAKC,UAAUxC,GAIpD,C,mDCrEA,MAAMyC,EAAY,IAAIC,IAAI,CACxB,MACA,MACA,SAGIC,EAAS,IAAID,IAEZ,SAASE,EAAqBC,GAEnC,OAAOA,EAAQC,MAAMC,GAAWN,EAAUO,IAAID,EAAO7D,YAAcyD,EAAOK,IAAID,EAAOA,SACvF,CAEO,SAASE,EAAaJ,GAC3B,QAASD,EAAqBC,EAChC,CAEO,SAASK,EAAyBL,GACvCF,EAAOQ,QACPN,EAAQO,SAASL,IACfJ,EAAOU,IAAIN,EAAO,GAEtB,C,0DCpBe,SAASO,EAAUC,GAChC,QAAcjE,IAAXiE,GAA0BA,EAAkBC,UAAYD,EAAkBC,WAAqB,OAAOD,EAGpG,IAAG,OAASA,GAAS,CACxB,MAAME,EAAUF,EAAyBG,QACzC,QAAcpE,IAAXmE,EACD,OAAOA,EAAOE,UAAS,GAGzB,MAAMC,EAAUL,EAA4BM,YAAeN,EAAyBO,QACpF,YAAcxE,IAAXsE,EACMA,EAAOD,UAAS,GAGlB,I,CAEF,IAAIJ,EAAQ,OAAO,KAE1B,MAAMQ,EAA0C,MAAhCR,EAAkBpD,OAAO,GACnC6D,EAAcT,EAAkBU,OAAO,GAAGC,MAAM,KAEtD,OAAOH,EAASC,EAAW,GAAGL,YAAcK,EAAW,IAAM,IAAIL,UAAS,EAC5E,C,sFCaO,MAAMQ,EAUXC,YAAYC,IACV,OAAWC,KAAMD,GAEd,WACDC,KAAKC,MAAQ,SAGfD,KAAKE,oBAAqB,EAC1BF,KAAKG,KAAM,QAAO,CAAC,MAAOJ,EAAGE,MAAMjD,KAAK,MACxCgD,KAAKG,IAAI,eAETH,KAAKI,cAAa,GAElBP,EAAIQ,UAAUC,KAAKN,KACrB,CAEOO,cACL,OAAOP,KAAKE,kBACd,CAEOE,aAAaI,GAAY,GAC9B,GAAGR,KAAKS,gBAAkBD,EACxB,OAAOR,KAAKS,cAGd,MAAMC,EAAgB,CAACC,EAAoBC,K,MACzC,MAAMC,EAAaC,MAAMC,KAAKJ,EAAGE,YACjC,IAAI,MAAMG,KAAaH,EACrBF,EAAGM,YAAYD,GAGjB,GAAiB,QAAb,EAAAJ,EAAMM,eAAO,eAAEzE,OAInB,IAAI,MAAM0E,KAASP,EAAMM,QACpBP,EAAGE,WAAWO,SAASD,EAAMH,YAIhCL,EAAGU,YAAYF,EAAMH,UAAWG,EAAMG,QAASH,EAAMI,iB,EASzD,IACE,IAAIC,EAAUC,UAAUC,KAAK1B,KAAKC,KAAMD,KAAKhG,SAE7C,IAAIwH,EACF,OAAOG,QAAQC,Q,CAEjB,MAAMhE,GAGN,OAFAoC,KAAKG,IAAIvC,MAAM,mBAAqBA,EAAgBiE,SACpD7B,KAAKE,oBAAqB,EACnByB,QAAQC,OAAOhE,E,CAGxB,IAAIkE,GAAW,EAOf,OANAC,YAAW,KACLD,GACFN,EAAQQ,SAAQ,OAAU,sB,GAE3B,KAEIhC,KAAKS,cAAgB,IAAIkB,SAAqB,CAACM,EAASL,KAC7DJ,EAAQU,UAAaC,IACnBL,GAAW,EACX,MAAM/B,EAAKyB,EAAQY,OACnB,IAAIC,GAAY,EAEhBrC,KAAKG,IAAI,UAETJ,EAAGiC,QAAWpE,IACZoC,KAAKE,oBAAqB,EAC1BF,KAAKG,IAAIvC,MAAM,8CAA+CA,GAC9DgE,EAAOhE,EAAM,EAGfmC,EAAGuC,QAAWC,IACZvC,KAAKG,IAAIvC,MAAM,UAAW2E,IACzBF,GAAarC,KAAKI,cAAc,EAGnCL,EAAGyC,QAAWD,IACZvC,KAAKG,IAAIvC,MAAM,SAAU2E,GACzB,MAAME,EAAcF,EAAEG,OAEtB1C,KAAKI,aAAaiC,GAAY,GAE3BI,EAAYT,SACbS,EAAYT,QAAQO,GAGtBxC,EAAG4C,OAAO,EAGZ5C,EAAG6C,gBAAmBL,IACpBvC,KAAKG,IAAIvC,MAAM,wBAAwB,EAGzCqE,EAAQjC,KAAKD,GAAKA,EAAG,EAGvByB,EAAQQ,QAAWG,IACjBL,GAAW,EACX9B,KAAKE,oBAAqB,EAC1BF,KAAKG,IAAIvC,MAAM,8CAA+CuE,GAC9DP,EAAOO,EAAM,EAGfX,EAAQqB,gBAAmBV,IACzBL,GAAW,EACX9B,KAAKG,IAAI2C,KAAK,8BAA+BX,EAAMY,WAAY,KAAMZ,EAAMa,YAE3E,MAAMN,EAASP,EAAMO,OACf3C,EAAK2C,EAAON,OAClBpC,KAAKiD,OAAOnE,SAAS8B,IAOnB,GAAIb,EAAGmD,iBAAiB9B,SAASR,EAAMX,MAEhC,CACL,MACMU,EADM+B,EAAOD,YACJU,YAAYvC,EAAMX,MACjCS,EAAcC,EAAIC,E,KAxFA,EAACb,EAAiBa,KAC1C,MAAMD,EAAKZ,EAAGqD,kBAAkBxC,EAAMX,MACtCS,EAAcC,EAAIC,EAAM,EAkFlBwC,CAAkBrD,EAAIa,E,GAMxB,CACH,GAEL,CAEOyC,cAAuCtD,G,MAC5C,OAAmE,QAA5D,EAAAC,KAAKK,UAAU7B,MAAM8E,GAAaA,EAASrD,OAASF,EAAGE,cAAK,QAAI,IAAIJ,EAAIE,EACjF,CAEOsD,sBAAsBE,GAC3BvD,KAAKK,UAAUvB,SAAS0E,IACtB,GAAGD,GAAYA,IAAaC,EAC1B,OAGF,MAAMzD,EAAKyD,EAAQzD,GAChBA,IACDA,EAAGuC,QAAU,OACbvC,EAAG4C,Q,GAGT,EApKe,EAAAtC,UAAmB,GAuKrB,MAAMoD,EAKnB3D,YAAYC,EAAO2D,GACjB1D,KAAK0D,UAAYA,EACjB1D,KAAKG,KAAM,QAAO,CAAC,MAAOJ,EAAGE,KAAMyD,GAAW1G,KAAK,MACnDgD,KAAK2D,IAAM9D,EAAI+D,OAAO7D,EACxB,CAoCO8D,OAAOC,EAA8BJ,GAE1C,MAAMK,EAAUjD,MAAMiD,QAAQD,GAK9B,OAJIC,IACFD,EAAY,GAAGE,OAAOF,IAGjB9D,KAAKiE,eAAe,aAAcd,IACvC,MAAMe,EAAYJ,EAAuBK,KAAKL,GAAcX,EAAYU,OAAOC,KAC/E,OAAOC,EAAUG,EAAWA,EAAS,EAAE,GACoB,GAAIR,EACnE,CAEO7E,MAAM6E,GACX,OAAO1D,KAAKiE,eAAe,aAAcd,GAAgBA,EAAYtE,SAA2B,GAAI6E,EACtG,CAEOU,KAAKN,EAA8BO,EAAoBX,GAY5D,MAAMK,EAAUjD,MAAMiD,QAAQD,GAM9B,OALIC,IACFD,EAAY,GAAGE,OAAOF,GACtBO,EAAQ,GAAGL,OAAOK,IAGbrE,KAAKiE,eAAe,aAAcd,IACvC,MAAMe,EAAYJ,EAAuBK,KAAI,CAACL,EAAWQ,IAAQnB,EAAYoB,IAAIF,EAAMC,GAAMR,KAC7F,OAAOC,EAAUG,EAAWA,EAAS,EAAE,GACkB,GAAIR,EACjE,CA6EOc,IAAOV,EAA8BJ,GAG1C,MAAMK,EAAUjD,MAAMiD,QAAQD,GAC9B,GAAIC,GAMG,IAAID,EAAUrH,OACnB,OAAOkF,QAAQM,QAAQ,QAPZ,CACX,IAAI6B,EACF,OAGFA,EAAY,GAAGE,OAAOF,E,CAKxB,OAAO9D,KAAKiE,eAAkB,YAAad,IACzC,MAAMe,EAAYJ,EAAuBK,KAAKL,GAAcX,EAAYqB,IAAIV,KAC5E,OAAOC,EAAUG,EAAWA,EAAS,EAAE,GACiB,GAAIR,EAChE,CAEQO,eACNQ,EACAC,EACAvE,EACAuD,EAAY1D,KAAK0D,WAEjB,IAAIiB,EAOJ,OALGxE,IACDwE,EAAOC,YAAYC,MACnB7E,KAAKG,IAAIA,EAAM,YAGVH,KAAK2D,IAAIvD,eAAe0E,MAAM/E,GAC5B,IAAI4B,SAAW,CAACM,EAASL,KAK9B,MAAMa,EAAc1C,EAAG0C,YAAY,CAACiB,GAAYe,GAE1CM,EAAU,KACdC,aAAaC,GACbrD,EAAOa,EAAY7E,MAAM,EAIrBsH,EAAa,KACjBF,aAAaC,GAEV9E,GACDH,KAAKG,IAAIA,EAAM,QAASyE,YAAYC,MAAQF,GAQ9C,MAAMQ,EAAUC,EAASjB,KAAKkB,GAAMA,EAAEjD,SACtCH,EAAQ8B,EAAUoB,EAAUA,EAAQ,GAAG,EAGzC1C,EAAYT,QAAU+C,EAGtB,MAAMO,EAAsC,cAATb,EAChCa,IACD7C,EAAY8C,WAAa,IAAML,KAGjC,MAAMD,EAAUlD,YAAW,KACzB/B,KAAKG,IAAIvC,MAAM,2BAA4B6E,EAAatC,EAAI,GAC3D,KAOGqF,EAAiBd,EAASjC,EAAYU,YAAYO,IAElDK,EAAUjD,MAAMiD,QAAQyB,GACxBJ,EAAyBrB,EAAUyB,EAAiB,GAAGxB,OAAOwB,GAEpE,GAAGF,EACD,OAGF,MAAM7I,EAAS2I,EAAS3I,OACxB,IAAIgJ,EAAOhJ,EAEX,MAAMiJ,EAAoB,KACrBjD,EAAY7E,SAIT6H,GACJP,G,EAIJ,IAAI,IAAIS,EAAI,EAAGA,EAAIlJ,IAAUkJ,EAAG,CAC9B,MAAMnE,EAAU4D,EAASO,GACzBnE,EAAQQ,QAAU+C,EAClBvD,EAAQU,UAAYwD,C,MAI5B,CAEOE,OAAUlC,GACf,OAAO1D,KAAKiE,eAAoB,YAAad,GAAgBA,EAAYyC,UAA6B,GAAIlC,EAC5G,E,yECheF,IAAImC,EACG,SAASC,IACd,OAAOD,CACT,CAEO,SAASE,EAAeC,GAC7B,OAAOH,EAAcG,CACvB,C,qDCuJO,MAAMC,UAAkB,IAO7BnG,cACEoG,QAEAlG,KAAKmG,KAAO,KACZnG,KAAKoG,iBAAmB,CAAC,EACzBpG,KAAKqG,SAAU,EAEfrG,KAAKsG,iBAAiB,aAAa,EAAE1J,SACnCoD,KAAKmG,KAAOvJ,EAAGyC,UAAU,IAG3BW,KAAKsG,iBAAiB,0BAA0B,EAAEC,QAAOC,gBACvDxG,KAAKqG,QAAUG,EAEXD,GACFvG,KAAKyG,oBAAoB,iBAAkBD,E,IAI/CxG,KAAKsG,iBAAiB,4BAA6BI,IACjD1G,KAAKoG,iBAAiBM,EAAOzG,MAAQyG,CAAM,IAG7C1G,KAAK2G,cAAgB,CAACpE,KAAMqE,KAC1BV,MAAMS,cAAcpE,KAAMqE,GAC1B,kBAAiCC,WAAW,QAAS,CAAC5G,KAAMsC,EAAaqE,QAAM,EAG7E,MACF5G,KAAKsG,iBAAiB,oBAAoB,EAAEQ,eAC1C9G,KAAK8G,SAAWA,CAAQ,GAG9B,CAEOC,sBACL,OAAO/G,KAAKoG,gBACd,CAEOY,aACL,OAAOhH,KAAKqG,OACd,CAEOI,uBAAuBG,GAE5BV,MAAMS,iBAAiBC,EACzB,EAGF,MAAM,EAAY,IAAIX,EACtB,eAA2B,EAC3B,U,wBC3JA,MACA,EADwB,IAnDjB,MAAP,cACU,KAAAgB,MAAe,CAAC,EAChB,KAAAzD,QAAU0D,EAAA,CA+CpB,CAxCSC,WACL,OAAOxF,QAAQM,QAAQjC,KAAKiH,MAC9B,CAEOG,SAASC,EAAahD,ICvBhB,SAAyBiD,EAAaD,EAAahD,GAChE,MAAMkD,EAAWF,EAAIzH,MAAM,MAC3B,EAAA4H,EAAA,GAAgBF,EAAQC,EAASE,MAAM,GAAI,GAAGzK,KAAK,MAAMuK,EAASG,OAASrD,CAC7E,CDqBIsD,CAAgB3H,KAAKiH,MAAOI,EAAKhD,GAEjC,MAAMuD,EAAQP,EAAIzH,MAAM,KAAK,GAChB,aAAVgI,GACD,gBAAwB,mBAAoB,CAACP,MAAKhD,QAAOyC,SAAU9G,KAAKiH,MAAMH,WAGhF9G,KAAK6H,YAAYD,EAAO5H,KAAKiH,MAAMW,GACrC,CAEOC,YAAmCR,EAAQhD,EAAiByD,GAAS,EAAMC,GAC7ED,IACD9H,KAAKiH,MAAMI,GAAOhD,GAGpBrE,KAAKgI,qBAAqBX,EAAKhD,EAAO0D,EACxC,CAEOC,qBAA4CX,EAAQhD,EAAkBrE,KAAKiH,MAAMI,GAAMU,GAC5F,kBAAwClB,WAAW,SAAU,CAAC5G,KAAM,QAASoH,MAAKhD,UAElFrE,KAAKwD,QAAQyE,IAAI,CACf,CAACZ,GAAMhD,GACN0D,EACL,G,gEEhCa,MAAMG,EAenBpI,YAAsBqI,EAAsBzK,EAAa0K,GAAnC,KAAAD,KAAAA,EAAsB,KAAAzK,IAAAA,EAXpC,KAAA2K,QAIH,GAQHrI,KAAKsI,MAAQ,YAAe,EAE5B,IAAIC,EAAW,WAAiB,KAAAC,IAC7BxI,KAAKsI,QAAOC,GAAY,YAE3BvI,KAAKG,KAAM,EAAAsI,EAAA,IAAO,QAAQN,IAASC,EAAWG,GAC9CvI,KAAKG,IAAI,eAETH,KAAK0I,WAAY,CACnB,CAEOC,MAAMC,EAAkBnE,GAC7B,MAAMhI,EAASmM,EAAKnM,OAIpB,OAHAuD,KAAKsI,OAAStI,KAAKG,IAAImI,MAAM,0BAA2B7L,GAGjDoM,MAAM7I,KAAKtC,IAAK,CAACoL,OAAQ,OAAQF,OAAMnE,SAAOK,MAAMiE,IACzD,GAAuB,MAApBA,EAASrC,SAAmBjC,EAM7B,MALAsE,EAASC,cAAclE,MAAMmE,IAC3BjJ,KAAKG,IAAIvC,MAAM,UACb,IAAIsL,YAAY,SAASC,OAAO,IAAIC,WAAWH,IAAS,IAGtDF,EAUR,OAPA/I,KAAKqJ,cAAa,GAOXN,EAASC,cAAclE,MAAMmE,GAE3B,IAAIG,WAAWH,IACtB,IACAK,IAEF,MADAtJ,KAAKqJ,cAAa,GACZC,CAAG,GAEb,CAEQD,aAAaX,GAChB1I,KAAK0I,YAAcA,GAAa1I,KAAKuJ,YAIxCvJ,KAAK0I,UAAYA,EAGjB,oBAAsC,QAASA,GAEjD,CAEOc,UACLxJ,KAAKqJ,cAAa,GAClBrJ,KAAKuJ,WAAY,EACjBvJ,KAAKqI,QAAQvJ,SAASuJ,GAAYA,EAAQzG,WAC1C5B,KAAKqI,QAAQ5L,OAAS,CACxB,CAEOgN,KAAKb,GACV,GAAG5I,KAAK0J,UACN,OAAO1J,KAAK2I,MAAMC,GACb,CACL,MAAMe,EAAU,IAAIhI,SAAqB,CAACM,EAASL,KACjD5B,KAAKqI,QAAQ/H,KAAK,CAAC2B,UAASL,SAAQgH,QAAM,IAK5C,OAFA5I,KAAK4J,iBAEED,C,CAEX,CAEcC,iB,qCACZ,IAAG5J,KAAK6J,UAAR,CAEA7J,KAAK6J,WAAY,EAEjB,IAAI,IAAIlE,EAAI,EAAGA,EAAI3F,KAAKqI,QAAQ5L,SAAUkJ,EAAG,CAC3C,MAAM0C,EAAUrI,KAAKqI,QAAQ1C,IACvB,KAACiD,EAAI,QAAE3G,GAAWoG,EAExB,IAEEpG,QADqBjC,KAAK2I,MAAMC,IAEhC5I,KAAKqI,QAAQyB,OAAOnE,EAAG,E,CACvB,MAAM2D,GACNtJ,KAAKG,IAAIvC,MAAM,4BAA6B0L,SACtC,EAAAS,EAAA,GAAM,I,GAGZpE,C,CAGJ3F,KAAK6J,WAAY,CApBQ,CAqB3B,E,gSCtHa,MAAMG,UAAe,IASlClK,YAAsBqI,EAAwBzK,EAAa0K,GACzDlC,QADoB,KAAAiC,KAAAA,EAAwB,KAAAzK,IAAAA,EAFtC,KAAA4K,MAAQ,YAAe,EAuDvB,KAAA2B,WAAa,KACnBjK,KAAKG,IAAI,UAETH,KAAKsI,OAAStI,KAAKG,IAAImI,MAAM,uBAC7BtI,KAAK2G,cAAc,OAAO,EAGpB,KAAAuD,YAAe3H,IACrBvC,KAAKG,IAAIvC,MAAM,cAAe2E,GAC9BvC,KAAK2C,OAAO,EAGN,KAAAwH,YAAe5H,IACrBvC,KAAKG,IAAI,SAAUoC,GAEnBvC,KAAKoK,kBACLpK,KAAK2G,cAAc,QAAQ,EAGrB,KAAA0D,cAAiBlI,IACvBnC,KAAKsI,OAAStI,KAAKG,IAAImI,MAAM,KAAM,gBAA8BnG,EAAMmI,KAAKC,YAE5EvK,KAAK2G,cAAc,UAAWxE,EAAMmI,KAAoB,EAGnD,KAAAb,KAAQb,IACb5I,KAAKsI,OAAStI,KAAKG,IAAImI,MAAM,0BAA2BM,EAAKnM,QAE7DuD,KAAKwK,GAAGf,KAAKb,EAAK,EA9ElB,IAAIL,EAAW,WAAiB,KAAAC,IAMhC,OALGxI,KAAKsI,QAAOC,GAAY,YAC3BvI,KAAKG,KAAM,EAAAsI,EAAA,IAAO,MAAMN,IAASC,EAAWG,GAC5CvI,KAAKG,IAAI,eACTH,KAAKyK,UAEEzK,IACT,CAEQoK,kBACFpK,KAAKwK,KAITxK,KAAKwK,GAAGE,oBAAoB,OAAQ1K,KAAKiK,YACzCjK,KAAKwK,GAAGE,oBAAoB,QAAS1K,KAAKmK,aAC1CnK,KAAKwK,GAAGE,oBAAoB,QAAS1K,KAAKkK,aAC1ClK,KAAKwK,GAAGE,oBAAoB,UAAW1K,KAAKqK,eAC5CrK,KAAKwK,QAAKxP,EACZ,CAEQyP,UACNzK,KAAKwK,GAAK,IAAIG,UAAU3K,KAAKtC,IAAK,UAClCsC,KAAKwK,GAAGI,WAAa,cACrB5K,KAAKwK,GAAGlE,iBAAiB,OAAQtG,KAAKiK,YACtCjK,KAAKwK,GAAGlE,iBAAiB,QAAStG,KAAKmK,aACvCnK,KAAKwK,GAAGlE,iBAAiB,QAAStG,KAAKkK,aACvClK,KAAKwK,GAAGlE,iBAAiB,UAAWtG,KAAKqK,cAM3C,CAEO1H,QACL,GAAI3C,KAAKwK,GAAT,CAIAxK,KAAKG,IAAI,mBAET,IACEH,KAAKwK,GAAG7H,O,CACR,MAAM2G,G,CAGRtJ,KAAKmK,a,CACP,EC1Ea,SAASU,EAAqCC,GAC3D,IAAGC,UAAU,oBAAqBA,QAGhC,MAAM,IAAIC,MAAM,oBAGlB,OALED,OAAOE,gBAAgBH,GAKlBA,CACT,C,0SCMe,MAAMI,EAArB,cAgJU,KAAAC,SAAW,CAACb,EAAkBc,IAC7BC,EAAA,kBAAkC,CACvCvC,OAAQ,kBACRlC,KAAM,CAAC,CAAChK,GAAIoD,KAAKpD,GAAI0N,OAAMc,cAC3BE,SAAU,CAAChB,EAAKrB,SA+DtB,CAlMesC,KAAKC,G,8CACMxQ,IAAnBgF,KAAKyL,WACNzL,KAAK0L,UAGP,MAAMC,EAAc,IAAIvC,WAAW,IAGnC,IAFAyB,EAAUc,KAEE,CACV,MAAMC,EAAOD,EAAY,IAAM,GAAOA,EAAY,IAAM,GAAOA,EAAY,IAAM,EAAKA,EAAY,GAC5FE,EAAQF,EAAY,IAAM,GAAOA,EAAY,IAAM,GAAOA,EAAY,IAAM,EAAKA,EAAY,GACnG,GAAsB,MAAnBA,EAAY,IACH,aAARC,GACQ,aAARA,GACQ,YAARA,GACQ,aAARA,GACQ,aAARA,GACQ,aAARA,GACS,IAATC,EAEF,MAEFhB,EAAUc,E,CAOZ,MAAMG,EAAkBH,EAAYlE,QAAQsE,UAEtCC,EAASL,EAAYlE,MAAM,EAAG,IAC9BwE,EAA2BN,EAAYlE,MAAM,GAAI,IACjDyE,EAASJ,EAAgBrE,MAAM,EAAG,IAClC0E,EAA2BL,EAAgBrE,MAAM,GAAI,IAQrDgE,EAAYzL,KAAKyL,UAAYJ,EAAA,eAA+B,kBAAmB,CACnFW,SACAC,QACAC,SACAC,UAGFnM,KAAKoM,QAAU,CAAM9B,EAAMc,IAAc,kCAEvC,aADMK,EACCzL,KAAKmL,SAASb,EAAMc,EAC7B,IAEApL,KAAKpD,SAAW6O,EAEhBzL,KAAKoM,QAAUpM,KAAKmL,SA2BpBQ,EAAY1D,IAAIuD,EAAMa,aAAc,IACpC,MAAMC,QAAkBtM,KAAKuM,OAAOZ,EAAYlE,SAMhD,OAFAkE,EAAY1D,IAAIqE,EAAU7E,MAAM,GAAI,IAAK,IAElCkE,CACT,G,CA4COY,OAAOC,GASZ,OAAOxM,KAAKoM,QAAQI,EAAS,UAC/B,CAEOrD,OAAOqD,GACZ,OAAOxM,KAAKoM,QAAQI,EAAS,UAC/B,CAEad,U,yCACX,MAAMD,EAAYzL,KAAKyL,UACvB,QAAiBzQ,IAAdyQ,EACD,OAGFzL,KAAKpD,QAAK5B,EACVgF,KAAKyL,eAAYzQ,EAEjB,MAAM4B,QAAW6O,EACjBJ,EAAA,eAA+B,kBAAmBzO,EACpD,G,CAEO4M,UACLxJ,KAAK0L,SACP,EC7JF,YA/BA,oBACS,KAAAe,IAAM,IACN,KAAAJ,aAAe,IAAIjD,WAAW,CAACpJ,KAAKyM,IAAKzM,KAAKyM,IAAKzM,KAAKyM,IAAKzM,KAAKyM,KA2B3E,CAzBSC,aAAapC,GAClB,MAAMqC,EAAMrC,EAAKC,YAAc,EAC/B,IAAIqC,EASJ,OAPEA,EADCD,EAAM,IACE,IAAIvD,WAAW,CAACuD,IAGhB,IAAIvD,WAAW,CAAC,IAAY,IAANuD,EAAaA,GAAO,EAAK,IAAOA,GAAO,GAAM,MAIvEC,EAAO5I,OAAOsG,EAEvB,CAEOuC,WAAWvC,GAChB,IAAI7N,EAAS6N,EAAK,GAClB,OAAG7N,GAAU,KACXA,EAAS6N,EAAK,GAAMA,EAAK,IAAM,EAAMA,EAAK,IAAM,GAEzCA,EAAK7C,MAAM,EAAGhL,GAAU,IAG1B6N,EAAK7C,MAAM,EAAGhL,GAAU,EACjC,G,cCrCa,SAASqQ,EAAWC,GACjC,MAAMtQ,EAASsQ,EAAMtQ,OACfqO,EAAgB,IAAIhK,MAAMrE,GAChC,IAAI,IAAIkJ,EAAI,EAAGA,EAAIlJ,IAAUkJ,EAC3BmF,EAAInF,IAAMoH,EAAMpH,GAAK,GAAK,IAAM,KAAOoH,EAAMpH,IAAM,GAAGqH,SAAS,IAEjE,OAAOlC,EAAI9N,KAAK,GAClB,C,oTCgBe,MAAMiQ,EAyBnBnN,YACUoN,EACA/E,EACAzK,EACA0K,EACA+E,GAJA,KAAAD,WAAAA,EACA,KAAA/E,KAAAA,EACA,KAAAzK,IAAAA,EACA,KAAA0K,UAAAA,EACA,KAAA+E,aAAAA,EA7BF,KAAA3B,MAAQ4B,EACR,KAAAC,YAAc,IAAInC,EAGlB,KAAA7C,QAMF,GAEE,KAAAC,MAAQ,YAAe,EAExB,KAAAI,WAAY,EAIX,KAAA4E,eAAgB,EAqBhB,KAAAC,OAAS,IAAW,kCAC1BvN,KAAK0I,WAAY,EAGjB,qBAAuC,aAGvC,MAAMiD,QAAoB3L,KAAKqN,YAAY9B,KAAKvL,KAAKwL,OACjDxL,KAAK0I,YAIT1I,KAAKwN,WAAW/D,KAAKkC,GAElB3L,KAAK0J,YACN1J,KAAKqI,QAAQ5L,OAAS,EACtBuD,KAAK0J,UAAU+D,oBAAoB,eACnCzN,KAAK0J,UAAUgE,cACf1N,KAAK0J,UAAUiE,UASjB5L,YAAW,KACT/B,KAAK4J,gBAAgB,GACpB,GACL,IAEQ,KAAAgE,UAAkB3E,GAAwB,kCAGhD,IAAIqB,QAAatK,KAAKqN,YAAYlE,OAAO,IAAIC,WAAWH,IAGxD,GAFAqB,EAAOtK,KAAKwL,MAAMqB,WAAWvC,GAE1BtK,KAAK0J,UAmBN,OAhBA1J,KAAKsI,OAAStI,KAAKG,IAAImI,MAAM,2BAA4BgC,EAAK7N,aAC9DuD,KAAK0J,UAAUmE,cAAcvD,GAAMxF,MAAMiE,IACvC/I,KAAKsI,OAAStI,KAAKG,IAAImI,MAAM,qCAAsCS,GAEnE,IACE/I,KAAK0J,UAAUoE,eAAe/E,EAASA,SAAUA,EAASgF,UAAWhF,EAASiF,U,CAC9E,MAAM1E,GACNtJ,KAAKG,IAAIvC,MAAM,+CAAgD0L,E,KAIhE2E,OAAO3E,IACRtJ,KAAKG,IAAIvC,MAAM,8CAA+C0L,EAAI,IAQtE,MAAMjB,EAAUrI,KAAKqI,QAAQ6F,QACzB7F,EAKJA,EAAQpG,QAAQqI,GAJdtK,KAAKsI,OAAStI,KAAKG,IAAImI,MAAM,sBAAuBwE,EAAWxC,GAKnE,IAEQ,KAAA6D,QAAU,KAGhB,IAAIC,EAAqBC,EACzB,GAHArO,KAAKnB,QAGFmB,KAAKsN,cAAe,CACrB,MAAMgB,EAAOC,KAAK1J,MACZ2J,EAAOF,EAAOtO,KAAKyO,cACzBL,GAAeM,MAAMF,IAASA,EAAOxO,KAAKmN,aAAenN,KAAKmN,aAAeqB,EAAO,EACpFH,EAAUC,EAAOF,C,CAGhBpO,KAAK0J,YACN1J,KAAK0J,UAAU+D,oBAAoB,WAAyBY,GAC5DrO,KAAKqI,QAAQ5L,OAAS,GAGrBuD,KAAKsN,eACNtN,KAAKG,IAAI,uCAAwCiO,EAAc,KAC/DpO,KAAK2O,iBAAmBC,EAAA,aAAe5O,KAAK6O,UAAWT,IAEvDpO,KAAKG,IAAI,yB,EAwBN,KAAA0O,UAAY,KAMjB,QAL6B7T,IAA1BgF,KAAK2O,mBACN3J,aAAahF,KAAK2O,kBAClB3O,KAAK2O,sBAAmB3T,IAGvBgF,KAAKwN,WAAR,CAOA,GAHAxN,KAAKG,IAAI,0BACTH,KAAKyO,cAAgBF,KAAK1J,MAEtB7E,KAAK0J,UAOP1J,KAAK0J,UAAU+D,oBAAoB,qBANnC,IAAI,MAAMpF,KAAWrI,KAAKqI,QACrBA,EAAQyG,WACTzG,EAAQyG,UAAW,GAOzB9O,KAAKyK,S,CAAS,EAjJd,IAAIlC,EAAW,WAAiB,KAAAC,IAC7BxI,KAAKsI,QAAOC,GAAY,YAC3BvI,KAAKG,KAAM,EAAAsI,EAAA,IAAO,OAAON,IAASC,EAAWG,GAC7CvI,KAAKG,IAAI,eAETH,KAAKyK,SACP,CAgGO5L,QAEFmB,KAAK0I,WACN,qBAAuC,aAIzC1I,KAAK0I,WAAY,EAEd1I,KAAKwN,aACNxN,KAAKwN,WAAW9C,oBAAoB,OAAQ1K,KAAKuN,QACjDvN,KAAKwN,WAAW9C,oBAAoB,QAAS1K,KAAKmO,SAClDnO,KAAKwN,WAAW9C,oBAAoB,UAAW1K,KAAK4N,WACpD5N,KAAKwN,gBAAaxS,EAEtB,CA+BO+T,iBACL/O,KAAK2C,QACL3C,KAAK6O,WACP,CAEOrF,UACLxJ,KAAKgP,kBAAiB,GACtBhP,KAAK2C,QAEF3C,KAAKqN,aACNrN,KAAKqN,YAAY7D,UAGnBxJ,KAAKqI,QAAQvJ,SAASuJ,IACjBA,EAAQzG,QACTyG,EAAQzG,Q,IAGZ5B,KAAKqI,QAAQ5L,OAAS,CACxB,CAEOkG,QACL,MAAM6K,EAAaxN,KAAKwN,WACxB,GAAGA,EAAY,CACb,MAAM9E,EAAY1I,KAAK0I,UACvB1I,KAAKnB,QACF6J,IACD8E,EAAWlH,iBAAiB,UAAWtG,KAAK4N,WAC5CJ,EAAWlH,iBAAiB,SAAS,KACnCkH,EAAW9C,oBAAoB,UAAW1K,KAAK4N,UAAU,GACxD,CAACqB,MAAM,IACVzB,EAAW7K,Q,CAGjB,CAMOqM,iBAAiBE,GACtBlP,KAAKsN,cAAgB4B,EAEjBA,EAKOlP,KAAKwN,iBAAwCxS,IAA1BgF,KAAK2O,kBACjC3O,KAAK6O,iBALwB7T,IAA1BgF,KAAK2O,mBACN3J,aAAahF,KAAK2O,kBAClB3O,KAAK2O,sBAAmB3T,EAK9B,CAEQyP,UACHzK,KAAKwN,YACNxN,KAAK2C,QAGP3C,KAAKwN,WAAa,IAAIxN,KAAKkN,WAAWlN,KAAKmI,KAAMnI,KAAKtC,IAAKsC,KAAKoI,WAChEpI,KAAKwN,WAAWlH,iBAAiB,OAAQtG,KAAKuN,QAC9CvN,KAAKwN,WAAWlH,iBAAiB,QAAStG,KAAKmO,SAC/CnO,KAAKwN,WAAWlH,iBAAiB,UAAWtG,KAAK4N,UACnD,CAEOuB,UAAUzR,GACZsC,KAAKtC,MAAQA,IAIhBsC,KAAKtC,IAAMA,EACXsC,KAAK+O,iBACP,CAEQK,WAAWxG,GACjB,MAAMyG,EAAWrP,KAAKwL,MAAMkB,aAAa9D,GAMzC,OAHgB5I,KAAKqN,YAAYd,OAAO8C,EAI1C,CAEO5F,KAAKb,GACV5I,KAAKsI,OAAStI,KAAKG,IAAImI,MAAM,6BAA8BM,EAAKnM,QAEhE,MAAM6S,OAAsEtU,EAI5E,IAAGgF,KAAK0J,UAGD,CACL,MAAMC,EAAU,IAAIhI,SAAqB,CAACM,EAASL,KACjD5B,KAAKqI,QAAQ/H,KAAK,CAAC2B,UAASL,SAAQgH,OAAM0G,WAAS,IAKrD,OAFAtP,KAAK4J,iBAEED,C,CATP3J,KAAKqI,QAAQ/H,KAAK,CAACsI,OAAM0G,YACzBtP,KAAK4J,gBAUT,CAEcA,iB,+CACZ,IAAI5J,KAAK0I,WAAa1I,KAAKuP,iBAEzB,OAGFvP,KAAKuP,kBAAmB,EAQxB,IAAI9S,EAASuD,KAAKqI,QAAQ5L,OACtB+S,GAAO,EAEX,IAAI,IAAI7J,EAAI,EAAGA,EAAIlJ,IAAUkJ,EAAG,CAC9B,MAAM0C,EAAUrI,KAAKqI,QAAQ1C,GAC7B,IAAI0C,EACF,MAGF,MAAM,KAACO,EAAI,SAAEkG,GAAYzG,EACzB,GAAGO,IAASkG,EAAU,CAGpB9O,KAAKsI,OAAStI,KAAKG,IAAImI,MAAM,0BAA2BM,EAAKnM,QAM7D,MAAM6S,EAAyB,QAAlB,EAAGjH,EAAQiH,eAAO,QAAfjH,EAAQiH,cAAkBtP,KAAKoP,WAAWxG,GAC1D,IAAI5I,KAAK0I,UACP,MAIF1I,KAAKwN,WAAW/D,KAAK6F,GAEjBjH,EAAQpG,QAIVoG,EAAQyG,UAAW,GAHnB9O,KAAKqI,QAAQyB,OAAOnE,IAAK,GACzBlJ,KAKF+S,GAAO,C,EAKXxP,KAAKuP,sBAAmBvU,EAErBgF,KAAKqI,QAAQ5L,QAAU+S,GACxBxP,KAAK4J,gB,KChUX,MAAM6F,EAAc,SAAa,QAAU,GAGpC,SAASC,EAA4BC,GAC1C,MAA0B,WAAnBA,EAA8B,GAAK,IAC5C,CAGO,SAASC,EAA8BzH,EAAYwH,EAAgCtJ,GACxF,MAAMwJ,EAASH,EAA4BC,GACrCG,EAA0B,WAAnBH,EAA8B,QAAUF,GAAepJ,EAT/C,WAS0E,IAAO,QAAUoJ,EAGhH,MAFqB,SAAS,6BAA6BtH,IAAO0H,sBAA2BC,GAG/F,CAGO,MAAMC,EAAb,cACU,KAAAC,cAAgB,CAAC,QAAS,QAAS,SAAU,QAAS,SAEtD,KAAAC,UAAY,SAClB,CACE,CAACrT,GAAI,EAAGsT,KAAM,iBAAmBC,KAAM,IACvC,CAACvT,GAAI,EAAGsT,KAAM,iBAAmBC,KAAM,IACvC,CAACvT,GAAI,EAAGsT,KAAM,kBAAmBC,KAAM,KAEzC,CACE,CAACvT,GAAI,EAAGsT,KAAM,iBAAmBC,KAAM,IACvC,CAACvT,GAAI,EAAGsT,KAAM,iBAAmBC,KAAM,IACvC,CAACvT,GAAI,EAAGsT,KAAM,kBAAmBC,KAAM,IACvC,CAACvT,GAAI,EAAGsT,KAAM,iBAAmBC,KAAM,IACvC,CAACvT,GAAI,EAAGsT,KAAM,gBAAmBC,KAAM,KAGpC,KAAAC,cAAyB,CAAC,EAGzB,KAAAC,gBAAkB,CAAClI,EAAYwH,EAAgCtJ,KACrE,MAAMiK,EAAeV,EAA8BzH,EAAMwH,EAAgBtJ,GAKzE,IAAIkK,EAOJ,OALAA,EAAiBvG,EAKV,IAAIiD,EAAcsD,EAAgBpI,EAAMmI,EAXV,WAAnBX,EAA8B,KAA0B,aAAnBA,EAAgC,KAAO,GAE3C,IASkC,EAK/E,KAAAa,cAAgB,CAACrI,EAAYwH,EAAgCtJ,KACnE,IAAIiK,EACJ,GAAG,UAAc,SAAY,CAC3B,MAAMT,EAASH,EAA4BC,GAG3CW,EAAe,YAFGtQ,KAAKgQ,cAAc7H,EAAO,GAAK0H,GAET,sBAD3B,SAAa,aAAe,Q,MAGzC,IAAI,MAAMY,KAAYzQ,KAAKiQ,UACzB,GAAGQ,EAAS7T,KAAOuL,EAAM,CACvBmI,EAAe,UAAYG,EAASP,MAA0B,KAAlBO,EAASN,KAAc,IAAMM,EAASN,KAAO,IAAM,SAC/F,K,CAMN,OAAO,IAAIjI,EAAKC,EAAMmI,EADe,WAAnBX,EAA8B,KAA0B,aAAnBA,EAAgC,KAAO,GAChD,CAsElD,CAlESe,aACLvI,EACAwH,EAAiC,SACjCgB,EAA+B,cAC/BC,GAAQ,EACRvK,GAMIrG,KAAKoQ,cAAcS,eAAeF,KACpC3Q,KAAKoQ,cAAcO,GAAiB,CAClCG,OAAQ,CAAC,EACTC,SAAU,CAAC,EACXC,OAAQ,CAAC,IAIb,MAAMC,EAAUjR,KAAKoQ,cAAcO,GAAehB,GAE7CxH,KAAQ8I,IACXA,EAAQ9I,GAAQ,IAGlB,MAAM+I,EAAaD,EAAQ9I,GAE3B,IAAI+I,EAAWzU,SAAWmU,EAAkD,CAC1E,IAAIO,EAUJ,OAPAA,GAA+B,cAAlBR,EAAgC3Q,KAAKqQ,gBAAkBrQ,KAAKwQ,eAAerI,EAAMwH,EAAgBtJ,GAO1G8K,GAKDP,GACDM,EAAW5Q,KAAK6Q,GAGXA,IARLxT,QAAQC,MAAM,mBAAoBuK,GAC3B,K,CAUX,OAAO+I,EAAW,EACpB,CAEO7N,uBAA0B+N,EAAUD,GACzC,IAAI,MAAMR,KAAiBS,EAEzB,IAAI,MAAMzB,KAAkByB,EAAIT,GAE9B,IAAI,MAAMxI,KAAQiJ,EAAIT,GAAehB,GAAiB,CAEpD,MAAMuB,EAAkBE,EAAIT,GAAehB,GAAgBxH,IAC3D,EAAAkJ,EAAA,GAAiBH,EAAYC,E,CAIrC,E,0SCzKK,MAAMG,UAA8B,IASzCxR,cACEoG,OAAM,GAENlG,KAAKuR,OAAS,IAAIC,IAKlBxR,KAAKsG,iBAAiB,UAAWiL,IAC3BA,EAAO/M,IAAI,cACbxE,KAAKyR,kB,GAOX,CAEaC,iB,+CACX,MAAMC,EAAoC,QAAtB,EAAG3R,KAAK2R,sBAAc,QAAnB3R,KAAK2R,eAAmB,IAAI5B,EAE7CmB,EAAmDlR,KAAKkR,WAAa,CACzEU,MAAOD,EAAejB,aAAa,aAAc,SAAU,SAAS,GACpEmB,UAAWF,EAAejB,aAAa,aAAc,SAAU,aAAa,IAGxEoB,GAAc,SAClB9R,KAAKkR,WAAWU,MAAejJ,MAAM,IAAIS,WAAc,WACxDtE,MAAK,IAAMgN,EAAY7P,SAAQ,KAAO,IAAM6P,EAAY7P,SAAQ,KACjEF,YAAW,IAAM+P,EAAY7P,SAAQ,IATrB,KAWhB,MAAM8P,GAAmB,SACnBC,EAASd,EAAWW,UAC1BG,EAAOhD,kBAAiB,GACxBgD,EAAOxE,WAAWlH,iBAAiB,SAAS,IAAMyL,EAAiB9P,SAAQ,IAAQ,CAACgN,MAAM,IAC1F+C,EAAOxE,WAAWlH,iBAAiB,QAAQ,IAAMyL,EAAiB9P,SAAQ,IAAO,CAACgN,MAAM,IACxFlN,YAAW,KACNgQ,EAAiBE,aAAeF,EAAiBG,aAIjDF,EAAOxE,YACRwE,EAAOxE,WAAW7K,QAGpBoP,EAAiB9P,SAAQ,GAAM,GAzBjB,KA4BhB,MAAOkQ,EAAiBC,SAA8BzQ,QAAQ0Q,IAAI,CAACP,EAAaC,IAEhF,IAAI,MAAMpB,KAAiBO,EACPA,EAAWP,GACnBnH,UASZ,MANe,CACboI,MAAOO,GAAmBnS,KAAKuR,OAAO/M,IAAI,SAAW,EACrDqN,UAAWO,GAAwBpS,KAAKuR,OAAO/M,IAAI,aAAe,E,IAOzDiN,mB,yCACX,IAAGzR,KAAKsS,QAAR,CAGA,IAFAtS,KAAKsS,SAAU,IAEH,CACV,MAAM,MAACV,EAAK,UAAEC,SAAmB7R,KAAK0R,iBAKtC,IAJGE,GAASC,IACV7R,KAAK2G,cAAc,YAAakL,IAAcD,EAAQ,YAAc,SAGnEC,EACD,YAGI,EAAA9H,EAAA,GAAM,I,CAGd/J,KAAKsS,SAAU,CAhBQ,CAiBzB,G,CAEOC,kBAAkBxU,EAAqBsG,GAC5C,IAAI5H,EAASuD,KAAKuR,OAAO/M,IAAIzG,IAAS,EACtCtB,GAAU4H,EAAQ,GAAK,EAEvBrE,KAAKuR,OAAOtJ,IAAIlK,EAAMtB,GACtBuD,KAAK2G,cAAc,SAAU3G,KAAKuR,OACpC,CAEOiB,mBAAmBzU,GACxB,OAAOiC,KAAKuS,kBAAkBxU,GAAM,EACtC,CAEO0U,mBAAmB1U,GACxB,OAAOiC,KAAKuS,kBAAkBxU,GAAM,EACtC,EAGF,MACA,EAD4B,IAAIuT,ECpHhC,GAD+E,S,cCyCxE,MAAMoB,EA+CJC,YAAYC,GACjB3Y,OAAOC,OAAO8F,KAAM4S,EAEtB,E,kCCnDF,IAAIjJ,EACW,SAASkJ,EAAaC,GACnC,OAAOnJ,QAAAA,EAAAA,EAlCT,SAAiCmJ,G,qCAC/B,MAAMC,GAAgB,QAAmB,EAAAtK,EAAA,IAAO,oBAC1CuK,EAAe/Y,OAAOgZ,KAAKH,GAC3BI,EAAmCF,EAAa7O,KAAKkD,IACzD,MAAMsC,EAAUmJ,EAASzL,GAAKzB,SAC9B,OAAOmN,EAAcpJ,EAAS,WAActC,EAAsB,IAG9D8L,EAIF,CAAC,EACCrI,QAAYnJ,QAAQ0Q,IAAIa,GAC9B,IAAI,IAAIvN,EAAI,EAAGlJ,EAASuW,EAAavW,OAAQkJ,EAAIlJ,IAAUkJ,EACzDwN,EAAgBH,EAAarN,IAAMmF,EAAInF,GAGzCmF,EAAIhB,OAAO,EAAGkJ,EAAavW,QAE3B,MAAM2W,QAAsB,EAC5B,GAAGA,EAAcC,KAAM,CACrB,IAAI,MAAMhM,KAAO+L,EACfD,EAAgB9L,GAAK5K,OAAS,EAGhC2W,EAAcvU,O,CAGhB,OAAOsU,CACT,E,+RAIqBG,CAAkBR,EACvC,CCzCO,MAAMS,UAA2Bb,EAOtC5S,cACEoG,QAEAlG,KAAKG,KAAM,EAAAsI,EAAA,IAAO,YAClBzI,KAAK8S,SCJM,WACb,MAAMU,EAAoC,CAAC,QAAS,QAAS,WACvDV,EAA6B,CAAC,EACpC,IAAI,MAAM7S,KAAQuT,EAEhBV,EAAS7S,GAAQ,IAAI,IAAW,IAAgBA,GAGlD,OAAO6S,CACT,CDLoBW,EAElB,CAEOZ,eACL,OAAOA,EAAa7S,KAAK8S,SAM3B,CAMaY,YAA4DzT,G,qCACvE,OAAOD,KAAK6S,eAAe/N,MAAMqO,IACxB,CACL3P,QAASxD,KAAK8S,SAAS7S,GACvBkF,QAASgO,EAAgBlT,MAG/B,E,gSE/BK,MAAM0T,UAAwBjB,EAC5BvL,WACL,OAAOnH,KAAK4T,WAAWC,UAAU,uBAAuB/O,MAAM1C,GACrDA,GAEX,CAEO0R,eAAehN,EAKlB,CAAC,GAIH,OAAO9G,KAAKmH,WAAWrC,MAAMmC,IAC3B,IAAI8M,EACAC,EACJ,MAAMC,EAAwC,CAC5CC,SAAU,KACVC,aAAc,CACZxX,EAAG,gCACHyX,KAAMtN,EAASsN,KACfC,MAAOvN,EAASuN,QAKlBN,EADCjN,EAASwN,gBACWtU,KAAKuU,aAAaC,aAAa,aAAc1N,EAASwN,gBAAiBrN,GAAO,GAE9EtF,QAAQM,QAAQ,CACnCtF,EAAG,4BAKP,MAAM8X,EAAUxN,EAAMyN,SAChBC,EAAQ,IAAIvL,WAAWqL,EAAQE,MAAMlY,OAAS,IAWpD,OAVAoO,EAAU8J,GACVA,EAAM1M,IAAIwM,EAAQE,MAAO,GACzBF,EAAQE,MAAQA,EAGdX,EADClN,EAAS8N,YACO5U,KAAKuU,aAAaC,aAAa,aAAc1N,EAAS8N,YAAa3N,GAAO,GAE1EtF,QAAQM,QAAQ,IAAImH,YAGhCzH,QAAQ0Q,IAAI,CAAC0B,EAAoBC,IAAiBlP,MAAM+P,IAC7DZ,EAAOC,SAAWW,EAAO,GACzBZ,EAAOE,aAAaO,SAAWD,EAC/BR,EAAOE,aAAaW,kBAAoBD,EAAO,GAExC7U,KAAK4T,WAAWC,UAAU,iCAAkCI,KACnE,GAEN,CAEOc,sBAAsBb,EAAkBjN,GAC7C,OAAOjH,KAAKuU,aAAaC,aAAa,aAAcN,EAAUjN,GAAO,EACvE,CAEO+N,MAAMd,EAAkBjN,EAAwBvL,EAAe,CAAC,GACrE,OAAOsE,KAAK+U,sBAAsBb,EAAUjN,GAAOnC,MAAMmQ,GAEhDjV,KAAK4T,WAAWC,UAAU,qBAAsB,CACrDK,SAAUe,GACTvZ,GAASoJ,MAAMoQ,IACF,uBAAXA,EAAKvY,GACNqD,KAAK4T,WAAWuB,QAAQD,EAAKE,MAGxBF,MAGb,CAEOG,qBAAqBC,GAC1B,OAAOtV,KAAK4T,WAAWC,UAAU,+BAAgC,CAACyB,QACpE,CAEOC,sBACL,OAAOvV,KAAK4T,WAAWC,UAAU,8BACnC,CAEO2B,sBACL,OAAOxV,KAAK4T,WAAWC,UAAU,8BACnC,E,wBC3CK,MAAM4B,WAA0B/C,EAAvC,c,oBACU,KAAAgD,SAAmD,IAAIlE,IAEvD,KAAAmE,MAAyC,CAAC,EAC1C,KAAAxV,KAAM,EAAAsI,EAAA,IAAO,UAAMzN,GAAW,EAyJxC,CArIS4a,YAAYC,EAA2BC,EAA2BJ,IACtEA,EAAUG,GAAa7V,KAAK+V,YAAYF,GACrCH,IACFA,EAAW,IAAItX,IACf4B,KAAK0V,SAASzN,IAAI4N,EAAWH,IAG/B1V,KAAK2V,MAAM7I,EAAW+I,IAAcA,EACpC,IAAI,MAAMG,KAAYN,EACpB,IAAG,EAAAO,EAAA,GAAUD,EAAUF,GACrB,OAIJJ,EAAS3W,IAAI+W,EACf,CAEOI,mBAAmBL,GACxB,OAAO7V,KAAK2V,MAAM7I,EAAW+I,GAC/B,CAEOE,YAAYF,GAEjB,MAAO,CADU7V,KAAK0V,SAASlR,IAAIqR,KAAeA,EAAY7V,KAAKkW,mBAAmBL,IAAcA,EAAW7V,KAAK0V,SAASlR,IAAIqR,IAC/GA,EACpB,CAEOM,WAAWN,GAChB,MAAMH,EAAW1V,KAAK+V,YAAYF,GAClC,OAAOH,EAAS,GAAK,CAACA,EAAS,GAAGU,SAAS3c,OAAO4K,MAAOqR,EAAS,SAAM1a,CAC1E,CAEOqb,cAAcR,EAA2BC,EAA2BJ,GAEzE,IADCA,EAAUG,GAAa7V,KAAK+V,YAAYF,GACtCH,EACD,IAAI,MAAMM,KAAYN,EACpB,IAAG,EAAAO,EAAA,GAAUD,EAAUF,GAMrB,OALAJ,EAAS7R,OAAOmS,GACZN,EAASrC,OACXrT,KAAK0V,SAAS7R,OAAOgS,UACd7V,KAAK2V,MAAM7I,EAAW+I,MAExB,EAKb,OAAO,CACT,CAEOS,iBAAiBT,EAA2BC,GAEjD,GADA9V,KAAKG,IAAI,0BAA2B0V,EAAUpO,QAASqO,IACnDA,EAAS,CACX,MAAMS,EAAIvW,KAAKmW,WAAWN,GAC1B,IAAIU,EAEF,OADAvW,KAAKG,IAAI,kDAAmD0V,EAAUpO,SAC/D9F,QAAQC,OAAO,eAGvBkU,EAASD,GAAaU,C,CAGzB,IAAI5M,EACJ,OAAOmM,aAAO,EAAPA,EAAS/X,MACd,IAAK,UACH4L,EAAU3J,KAAKwW,mBAAmBC,eAAeX,EAAQ7W,OAAQ6W,EAAQ/H,WAAW,GACpF,MAMF,IAAK,gBACHpE,EAAU3J,KAAK0W,6BAA+B1W,KAAK2W,mBAAmBC,wBAAuB,GAAM9R,MAAK,KACtG9E,KAAK0W,iCAA8B1b,CAAS,IAE9C,MAGF,IAAK,WACH2O,EAAUhI,QAAQM,QAAQjC,KAAK6W,kBAAkBC,WAAWhB,EAAQ3W,QAAQ,IAC5E,MAGF,IAAK,cACHwK,EAAU3J,KAAK+W,gBAAgBC,wBAAwB,CAAClB,EAAQmB,QAChE,MAGF,IAAK,oBACHtN,EAAU3J,KAAKkX,yBAAyBC,iBAAiBrB,EAAQsB,OAAO,GACxE,MAGF,IAAK,YACHzN,EAAU3J,KAAKqX,iBAAiBC,iBAAiBxB,EAAQyB,aACzD,MAGF,QAEE,OADAvX,KAAKG,IAAI2C,KAAK,4CAA6CgT,GACpDnU,QAAQC,SAInB,MAAM4V,EAAM1K,EAAW+I,GAEvB,OADA7V,KAAKG,IAAI,0CAA2CqX,GAC7C7N,EAAQ7E,MAAK,KAClB,MAAM2S,EAAS3K,EAAW+I,GAE1B,GADA7V,KAAKG,IAAI,iDAAkDqX,EAAK,SAAUC,GACvED,IAAQC,EACT,OAAO5B,EAGT7V,KAAKqW,cAAcR,EAAWC,GAE9B,MAAM4B,EAAa1X,KAAKmW,WAAWN,GACnC,GAAG6B,EACD,OAAO1X,KAAKsW,iBAAiBT,EAAW6B,EAAW,IAKrD,MAFA1X,KAAKG,IAAIvC,MAAM,sDAAuD4Z,EAAK,SAAUC,EAAQ3B,IAEvF,EAAA6B,EAAA,GAAU,iBAAiB,GAErC,E,0DChNa,SAASC,GAAkBC,EAAgBC,GACxD,IAAID,EACF,OAAOC,EAGT,IAAI,IAAIzQ,KAAOwQ,EACTC,EAAUjH,eAAexJ,WACpBwQ,EAAUxQ,GAIrB,IAAI,IAAIA,KAAOyQ,EAEbD,EAAUxQ,GAAOyQ,EAAUzQ,GAI7B,OAAOwQ,CACT,C,sECTe,SAASE,GAAsBlW,G,QAC5C,MAAMmW,EAAoB,CACxBnW,EAAQoW,OACRpW,EAAQqW,SACPrW,EAA4BsW,WAGzBC,EAASvW,EAA4BuW,MAC3C,GAAGA,EAAO,CACR,MAAMC,EAAiBD,EAA2ChZ,aAC7CpE,IAAlBqd,GACDL,EAAQ1X,KAAK+X,EAAchZ,YAG7B,MAAM8F,EAAWiT,EAAwCjT,QACnDmT,EAAenT,aAAO,EAAPA,EAASoT,eAC3BD,aAAY,EAAZA,EAAc7b,SACfub,EAAQ1X,QAAQgY,EAAanU,KAAKhF,GAAWA,EAAOE,a,CAIxD,MAAMmZ,EAA0D,QAAvC,EAAC3W,EAAqC,iBAAC,eAAE4W,kBAC/DD,aAAe,EAAfA,EAAiB/b,SAClBub,EAAQ1X,QAAQkY,EAAgBrU,KAAKuU,IAAa,EAAA1Z,GAAA,GAAU0Z,EAASC,YAGvE,MAAMC,EAAU/W,EAAmC+W,OACnD,GAAGA,EAAQ,CACT,MAAMC,EAAoB,IACnBD,EAAkDE,OAAS,GAC/DF,EAAqDxZ,QACrDwZ,EAAuDG,YAE1Df,EAAQ1X,QAAQuY,EAAQ/b,OAAOC,SAASoH,KAAKhF,GAAWA,EAAOE,cAE/D,MAAM2Z,EAAoB,CACvBJ,EAAoDrZ,WACpDqZ,EAAyDpZ,SAE5DwY,EAAQ1X,QAAQ0Y,EAAQlc,OAAOC,SAASoH,KAAK7E,GAAWA,EAAOD,UAAS,K,CAG1E,MAAM4Z,EAAuD,QAArC,EAACpX,EAAmC,eAAC,eAAEqX,gBAK/D,OAJGD,aAAc,EAAdA,EAAgBxc,SACjBub,EAAQ1X,QAAQ2Y,EAAe9U,KAAKgV,IAAU,EAAAna,GAAA,GAAUma,MAGnD,IAAI/a,IAAI4Z,EAAQlb,OAAOC,SAChC,C,eC/Ce,SAASqc,GACtBC,EACAC,EACAnY,GAEA,OAAQkY,EAAkBC,GAAYnY,CACxC,C,eCyCO,MAAMoY,QAAmCve,EAGjC,MAAMwe,WAAuB9G,EAA5C,c,oBAqNS,KAAA7T,MAAQ,CAAC0M,GAAO,KACrB,GAAIA,EAYG,CACLvL,KAAKyZ,iBAAmB,CAAC,EACzBzZ,KAAK0Z,aAAe,CAAC,EACrB,IAAI,MAAMC,KAAY,KACpB3Z,KAAK0Z,aAAaC,GAAY,E,KAhBxB,CACR3Z,KAAKwD,QAAQ3E,QAEbmB,KAAKyZ,iBAAmB,CAAC,EACzBzZ,KAAK4Z,uBAGL5Z,KAAK0Z,aAAezf,OAAOC,OAAO,CAAC,EAAG8F,KAAK0Z,cAC3C,IAAI,MAAMC,KAAY,KACpB3Z,KAAK6Z,iBAAiBF,GAExB3Z,KAAK8Z,kB,CASP9Z,KAAK+Z,YAAc,IAAIvI,IACvBxR,KAAKga,QAAU,CAAC,EAChBha,KAAKia,kBAAoB,CAAC,EAC1Bja,KAAKka,WAAa,EAClBla,KAAKma,aAAe,IAAI,KAAY,CAClC3e,eAAe,EACfC,YAAY,EACZH,UAAU,EACVM,YAAY,IAEdoE,KAAKoa,cAAgB,CACnBC,MAAO,GACPC,MAAO,EACPC,QAAS,GACTZ,SAAU,EACX,EAg1CK,KAAAa,oBAAuBC,IAEfA,EAAOC,aAEf5b,SAAS6b,I,MACb,MAAM,UAACC,EAAS,KAAEC,GAAQF,EAEpB1b,EAASe,KAAK8a,gBAAgB9b,UAAU6b,GACxCxB,EAASrZ,KAAK+a,WAAW9b,GAAQ,GACpCoa,KACe,QAAb,EAAAA,EAAOnc,cAAM,eAAE8d,SAChBhb,KAAKib,sBAAsB5B,EAAQuB,GAGpCvB,EAAkBuB,UAAYA,EAC/B5a,KAAKkb,uBAAuB7B,GAC5BrZ,KAAKmb,WAAW,CAAC9B,YAGnBrZ,KAAKwW,mBAAmB4E,yBAAyBnc,EAAQoa,EAAO,GAChE,EAGI,KAAAgC,qBAAwBZ,I,MAC9B,MAAMd,EAA2B,QAAhB,EAAAc,EAAOG,iBAAS,QAAI,KAE/B3b,EAASe,KAAK8a,gBAAgB9b,UAAWyb,EAAOI,KAA+BA,MAC/ExB,EAASrZ,KAAKsb,cAAcrc,GAYlCe,KAAKub,yBAAyBlC,EAAQoB,EAAOvd,OAAO8d,OAAQrB,EAAS,EAG/D,KAAA6B,2BAA8Bf,IACpC,MAAMxb,EAASwb,EAAOlb,WAAWF,UAAS,GACpCoc,GAAU,EAAAC,GAAA,GAAkBjB,EAAOkB,UACnCC,EAAQ5b,KAAK6b,cAAc5c,EAAQwc,GACrCG,GAIJ5b,KAAKub,yBAAyBK,EAAOnB,EAAOvd,OAAO8d,OAAQhb,KAAK8b,oBAAoBF,GAAO,EAGrF,KAAAG,sBAAyBtB,I,MAC/B,MAAMd,EAA2B,QAAhB,EAAAc,EAAOG,iBAAS,QAAI,KAElCH,EAAOuB,MACRhc,KAAKic,oBAAoBtC,EAAUc,EAAOuB,MAAM7X,KAAK0W,GAAS7a,KAAK8a,gBAAgB9b,UAAW6b,EAA+BA,SAE7H7a,KAAK4T,WAAWC,UAAU,4BAA6B,CACrD+G,UAAWjB,IACV7U,MAAMoX,IAIPlc,KAAKmc,aAAaD,GAElBlc,KAAKic,oBAAoBtC,EAAUuC,EAAc3B,QAAQpW,KAAKiY,GAAMA,EAAEnd,SAAQ,G,EAK5E,KAAAod,4BAAoC5B,IAA6C,O,EAAA,K,OAAA,E,EAAA,YACvF,MAAMxb,EAASwb,EAAOlb,WAAWF,UAAS,GAE1C,IADoBW,KAAK+Z,YAAYvV,IAAIvF,GAEvC,OAGF,MAAMqd,EAAWrd,EACjB,GAAGwb,EAAOuB,MAAO,CACf,MAAMA,EAAQvB,EAAOuB,MAAM7X,KAAKsX,IAAY,EAAAC,GAAA,GAAkBD,KAC9Dzb,KAAKic,oBAAoBK,EAAUN,E,KAC9B,CACL,MAAMO,QAAcvc,KAAK4T,WAAW4I,SAAS,YAAY,GAEnD7S,EAAU3J,KAAK4T,WAAWC,UAAU,0BAA2B,CACnE4I,QAASzc,KAAK0c,gBAAgBC,gBAAgB1d,EAAO2d,YACrDL,QACAM,YAAa,EACbC,UAAW,EACXC,aAAc,IAMV/B,SAHehb,KAAKgd,cAAc/d,EAAQ0K,IAE1BsT,OACAngB,QAAQ8e,GAAUA,EAAM1e,OAAO8d,SACrDhb,KAAKic,oBAAoBK,EAAUtB,EAAO7W,KAAKyX,GAAUA,EAAMhf,K,CAEnE,E,YA5ByF,K,6QA4BxF,CACH,CAlpDYsgB,QACRld,KAAKnB,OAAM,GAEXmB,KAAKmd,UAAU7W,iBAAiB,mBAAmB,KACjD,MAAMrH,EAASe,KAAKod,gBAAgBC,UAAUzgB,GAAGyC,UAAS,GAE1D,GADeW,KAAKsb,cAAcrc,GACvB,CACT,MAAMqe,EAAWtd,KAAK8a,gBAAgByC,kBAAkBte,GACxDe,KAAKma,aAAaqD,YAAYve,EAAQqe,E,KAI1C,MAAMG,EAAkB3gB,IACtB,MAAMyd,EAAUva,KAAK0d,kBAAiB,GACtC,IAAI,IAAI/X,EAAI,EAAGA,EAAI4U,EAAQ9d,SAAUkJ,EACnC3F,KAAK2d,uBAAuBpD,EAAQ5U,GAAI7I,E,EA0E5C,OAtEAkD,KAAKmd,UAAU7W,iBAAiB,gBAAgB,KAC9C,MAAMiU,EAAUva,KAAK0d,kBAAiB,GAEtC,IAAI,MAAMpB,KAAYtc,KAAKga,SACrBsC,EAAW,UACNtc,KAAKga,QAAQsC,GAMxB,IAAI,IAAI3W,EAAI,EAAGA,EAAI4U,EAAQ9d,SAAUkJ,EAAG,CACtC,MAAM0T,EAASkB,EAAQ5U,GAKvB3F,KAAK4d,wBAAwBvE,E,KAIjCrZ,KAAKmd,UAAU7W,iBAAiB,gBAAiBmX,GACjDzd,KAAKmd,UAAU7W,iBAAiB,aAAcmX,GAE9Czd,KAAKmd,UAAU7W,iBAAiB,iBAAkBxJ,IAChD,MAAMyd,EAAUva,KAAK0d,kBAAiB,GAEhCpE,EAAWtZ,KAAK6d,4BAA4B/gB,EAAOF,IACzD,IAAI,IAAI+I,EAAI,EAAGA,EAAI4U,EAAQ9d,SAAUkJ,SACpB4U,EAAQ5U,GACT2T,UAGTtZ,KAAKga,QAAQld,EAAOF,GAAG,IAGhCoD,KAAKmd,UAAU7W,iBAAiB,0BAA2B+S,IACzDrZ,KAAK8d,8BAA8BzE,EAAOpa,OAAO,IAGnDe,KAAKmd,UAAU7W,iBAAiB,eAAgBhH,IAC9C,MAAMye,EAAO/d,KAAK0c,gBAAgBsB,QAAQ1e,GAEpCL,EAASK,EAAOD,UAAS,GAC3B0e,EAAmB7gB,OAAOuI,MAAQzF,KAAKsb,cAAcrc,IACvDe,KAAKie,qBAAqBhf,E,IAI9Be,KAAKmd,UAAU7W,iBAAiB,qBAAqB,EAAEhH,SAAQ4e,cAC7D,MAAMjf,EAASK,EAAOD,UAAS,GAC3B6e,GACFle,KAAKme,sBAAsBlf,GAG7Be,KAAK8d,8BAA8B7e,EAAO,IAG5Ce,KAAKoe,kBAAkBC,2BAA2B,CAChDC,kBAAmBte,KAAKwa,oBAExB+D,mBAAoBve,KAAKqb,qBAEzBmD,yBAA0Bxe,KAAKwb,2BAE/BiD,oBAAqBze,KAAK+b,sBAE1B2C,0BAA2B1e,KAAKqc,8BAG3B1a,QAAQ0Q,IAAI,CACjBrS,KAAK2e,gBAAgBxX,WACrBnH,KAAK4e,mBAAmBlL,YAAY,aACnC5O,MAAK,EAAEmC,GAAQ9B,QAASoV,EAAS/W,eAClCxD,KAAKwD,QAAUA,EACfxD,KAAKua,QAAUva,KAAKwD,QAAQqb,WAE5B,IAAI,MAAMlF,KAAY,KAAc,CAClC,MAAMqC,EAAQ/U,EAAMyS,aAAaC,GACjC,IAAIqC,EACF,SAGF,MAAM8C,EAAS9e,KAAK+e,gBAAgBpF,GACpCmF,EAAOhV,OAAO,EAAGgV,EAAOriB,UAAWuf,E,CAGlCzB,EAAQ9d,QACT,iBAA+CuD,KAAKgf,oBAAoBC,KAAKjf,KAAMua,GAAU,CAAC,QAAS,UAAW,WAAY,UAGhIva,KAAKyZ,iBAAmBxS,EAAMwS,kBAAoB,CAAC,EAEhDc,EAAQ9d,QACTuD,KAAKkf,iBAAiBC,kB,GAG5B,CAEQH,oBAAoBzE,GAC1B,IAAI,IAAI5U,EAAI,EAAGlJ,EAAS8d,EAAQ9d,OAAQkJ,EAAIlJ,IAAUkJ,EAAG,CACvD,MAAM0T,EAASkB,EAAQ5U,GACvB,GAAI0T,EAAJ,CAKAA,EAAO+F,aAAc,EAAAC,GAAA,GAAmBhG,EAAO+F,aAG5C/F,EAAOiG,YACRtf,KAAKwW,mBAAmB+I,aAAa,CAAClG,EAAOiG,aAG/C,IAAI,IAAI3Z,EAAI,EAAGA,GAAK,KAAMA,SAEjB0T,EADgD,SAAS1T,KAKlE3F,KAAKwf,WAAW,CACdnG,SACAoG,kBAAkB,IAIJzf,KAAKwW,mBAAmBkJ,iBAAiBrG,EAAOpa,OAAQoa,EAAO+F,cAE7Epf,KAAKwW,mBAAmBmJ,mBAAmBtG,EAAOpa,O,EAGxD,CAEO2gB,gBAAgBjG,GACrB,QAAS3Z,KAAKyZ,iBAAiBE,EACjC,CAEOkG,iBAAiBlG,EAAkBmG,GACxC,MAAMC,EAAU/f,KAAKggB,mBAAmBrG,GAErCA,IAAaJ,IAAoBuG,GAClC9f,KAAKyZ,iBAAiB,MAAiBqG,EACvC9f,KAAKyZ,iBAAiB,MAAqBqG,IAExCC,IACD,EAAAE,GAAA,GAA6BjgB,KAAKyZ,iBAAkB,CAACE,IAGvD3Z,KAAKyZ,iBAAiBE,GAAYmG,GAGjCC,IAIAjf,MAAMC,KAAK,MAAcmf,OAAOvG,GAAa3Z,KAAKyZ,iBAAiBE,OACpE3Z,KAAKyZ,sBAAiBF,IAAoB,GAG5CvZ,KAAK4Z,uBACP,CAEQA,uBACN5Z,KAAK2e,gBAAgB9W,YAAY,mBAAoB7H,KAAKyZ,iBAC5D,CAyCOwB,sBAAsB5B,EAA6BM,UACjDN,EAAOnc,OAAO8d,QACrB,EAAA3J,EAAA,GAAiBrR,KAAK+e,gBAAgBpF,GAAW3Z,KAAKggB,mBAAmBrG,GAAaN,EAAsBzc,GAAKyc,EAAOpa,QACxHe,KAAK8Z,kBACP,CAEOA,mBACL9Z,KAAK2e,gBAAgB9W,YAAY,eAAgB7H,KAAK0Z,aACxD,CAEOG,iBAAiBF,GACtB3Z,KAAK+e,gBAAgBpF,GAAUld,OAAS,CAC1C,CAEOsiB,gBAAgBpF,GACrB,IAAIwG,EAASngB,KAAK0Z,aAAaC,GAM/B,OALIwG,GAAUngB,KAAKggB,mBAAmBrG,MACpC,EAAAsG,GAAA,GAA6BjgB,KAAK0Z,aAAc,CAACC,IACjDwG,EAASngB,KAAK0Z,aAAaC,GAAY,IAGlCwG,CACT,CAEOC,eAAenhB,EAAgB0a,GACpC,MAAM7c,EAASkD,KAAKqgB,eAAeC,UAAU3G,GAC7C,IAAI4G,EAOJ,OALEA,EADCzjB,GACoD,IAA1CA,EAAO0jB,cAAc/lB,QAAQwE,KAE3Be,KAAKsb,cAAcrc,GAAQ/B,OAAO8d,OAG1CuF,CACT,CAEOE,cAAc9G,GACnB,MAAM+G,EAAa1gB,KAAKia,kBAAkBN,IAAa,EACvD,OAAGA,IAAaJ,IAAqBmH,EAI9BA,EAHEC,KAAKC,OAAO9f,MAAMC,KAAK,MAAc8f,MAAK,CAACC,EAAGC,IAAMD,EAAIC,IAInE,CAEQC,eAAepkB,GACrB,MAAMqkB,EAAiB,CACrB1G,QAAS,GACT3d,KACAskB,oBAAqB,EACrBC,cAAe,IAAI/iB,IACnBgjB,qBAAsB,IAAIhjB,KAK5B,OAFA,EAAA6hB,GAAA,GAA6BgB,EAAQ,CAAC,0BAE/BA,CACT,CAEOI,UAAUzkB,G,QACf,OAAsB,QAAtB,KAAOoD,KAAKga,SAAQpd,UAAE,UAAFA,GAAQoD,KAAKghB,eAAepkB,EAClD,CAEOojB,mBAAmB1D,GACxB,OAAOA,GAAYA,EAAW,CAChC,CAEOR,oBAAoBwF,GACzB,OAAOA,EAAWriB,MACpB,CAEOsiB,aAAalI,GAClB,OAAOrZ,KAAKwhB,QAAQnI,GAAUA,EAAOzc,GAAKyc,EAAOpa,MACnD,CAEOwiB,iBAAiB7kB,EAAY8kB,GAAe,GACjD,GAAG9kB,IAAO2c,GACR,OAAOvZ,KAAK0d,iBAAiBgE,GAG/B,MAAMT,EAASjhB,KAAKqhB,UAAUzkB,GAC9B,OAAGoD,KAAKggB,mBAAmBpjB,GAClB8kB,EAAeT,EAAO1G,QAAQzd,QAAQwkB,IAAiBA,EAA0BpkB,OAAOykB,SAAUV,EAAO1G,QAG3GmH,EAAeT,EAAO1G,QAAQzd,QAAQuc,QAA6Cre,IAAjCqe,EAAkBuI,aAA4BX,EAAO1G,OAChH,CAEOsH,cAAcC,EAAuBroB,EAAe6iB,GACzD,MAAM2E,EAASjhB,KAAKyhB,iBAAiBnF,GAAU,GAC/C,IAAIjD,EACJ,GAAIyI,EAIG,CACL,MAAMxd,EAAM2c,EAAOc,WAAW1I,GAAWA,EAAOpa,SAAW6iB,KAC/C,IAATxd,IAED+U,EAAS4H,EADSxnB,EAAO6K,EAAM,EAAIA,EAAM,G,MANxC7K,IACD4f,EAAS4H,EAAO,IAUpB,OAAO5H,CACT,CAEOwE,4BAA4BvB,GACjC,GAAGtc,KAAKggB,mBAAmB1D,GAAW,OAAO,EAAA0F,GAAA,KAC7C,GAAG,SAAiB1F,GAAW,OAAO,EAAA0F,GAAA,GAAkB1F,GACxD,MAAMxf,EAASkD,KAAKqgB,eAAeC,UAAUhE,GAC7C,OAAO,EAAA0F,GAAA,GAAkBllB,EAAOmlB,QAClC,CAEQC,gBAAgB7I,GACtB,OAAQrZ,KAAKmiB,wBAAwBC,iBAAiB,CACpDnjB,OAAQoa,EAAOpa,OACfojB,aAAa,EACbC,SAAUtiB,KAAKwhB,QAAQnI,GAAWA,EAAsBzc,QAAK5B,GAEjE,CAEOunB,qBAAqBjG,GAC1B,MAAM2E,EAASjhB,KAAKqhB,UAAU/E,GAC9B,MAAO,CAACkG,mBAAoBvB,EAAOG,qBAAqB/N,KAAMoP,YAAaxB,EAAOE,cAAc9N,KAClG,CAEOqK,iBAAiBgE,GACtB,MAAMgB,EAAS5hB,MAAMC,KAAK,MAAcoD,KAAKwV,GAAa3Z,KAAKyhB,iBAAiB9H,EAAU+H,KAC1F,MAAO,GAAG1d,UAAU0e,EACtB,CAEQC,uBACNtJ,EACAC,EACAxc,G,QAMA,IAAIqE,EAEJ,MAAMqgB,EAAUxhB,KAAKwhB,QAAQnI,GACvBuJ,EAAepB,GAAW,SAAiB1kB,EAAOF,IAI9C,GAAGoD,KAAKqgB,eAAewC,oBAAoBxJ,EAAQvc,GAAS,CACpE,MAAMgmB,EAAYtB,EAChBxhB,KAAK+e,gBAAgB/e,KAAK8b,oBAAoBzC,IAC9Cvc,EAAO0jB,cAEHuC,EAAY/iB,KAAKuhB,aAAalI,GAC9B2J,EAAcF,EAAUroB,QAAQsoB,GAGpC5hB,GADkB,IAAjB6hB,EACOhjB,KAAKijB,oBAAoBjjB,KAAKkjB,gCAAgCJ,EAAUrmB,OAAS,EAAIumB,IAAc,IACtF,QAAb,EAAA3J,EAAOnc,cAAM,eAAE8d,SAAU4H,EACzB5iB,KAAKkb,uBAAuB7B,GAAQ,OAAMre,GAAY4nB,GAEhC,QAAtB,KAAAO,GAAA,GAAe9J,UAAO,QAAIrZ,KAAKkb,uBAAuB7B,GAAQ,E,CAQ1E,OAAOD,GAAeC,EAAQC,EAAUnY,EAC1C,CAEOiiB,UAAUnkB,EAAgB0a,EAAmB8B,EAAkBiG,GAAe,GACnF,MAAM1H,EAA+B,GAElCyB,IACD9B,EAAW1a,QAIGjE,IAAb2e,EACDK,EAAQ1Z,QAAQQ,MAAMC,KAAK,MAAcoD,KAAKwV,GAAa3Z,KAAKqhB,UAAU1H,GAAUY,WAEpFP,EAAQ1Z,KAAKN,KAAKyhB,iBAAiB9H,GAAU,IAG/C,MAAM0J,EAA+C5H,EAClDW,GAAOA,EAAiBxf,KAAO6e,EAC/BW,GAAOA,EAAand,SAAWA,EAClC,IAAI,MAAMgiB,KAAUjH,EAAS,CAC3B,IAAIrU,EAAI,EAAG2d,EAAU,EACrB,IAAI,IAAI7mB,EAASwkB,EAAOxkB,OAAQkJ,EAAIlJ,IAAUkJ,EAAG,CAC/C,MAAM0T,EAAS4H,EAAOtb,GACtB,GAAG0d,EAAOhK,GACR,MAAO,CAACA,EAAQ1T,EAAI2d,GACZ5B,IAAkBrI,EAAsBnc,OAAOykB,aAA4C3mB,IAAjCqe,EAAkBuI,eAClF0B,C,EAKR,MAAO,EACT,CAEOhI,cAAcrc,GACnB,OAAOe,KAAKua,QAAQtb,EACtB,CAEOskB,iBAAiBtkB,EAAgBwc,GACtC,OAAOA,EAAUzb,KAAK6b,cAAc5c,EAAQwc,GAAWzb,KAAKua,QAAQtb,EACtE,CAEOkkB,eACLlkB,EACAqa,EACAmC,GAEA,MAAMpC,GAAS,EAAAmK,GAAA,GAASvkB,GAAUA,EAASe,KAAKujB,iBAAiBtkB,EAAQwc,GACzE,OAAO,EAAA0H,GAAA,GAAe9J,EAAQC,EAChC,CAUO2J,oBAAoBQ,EAAelD,GAExC,OADAkD,UAAAA,GAAS,EAAAC,GAAA,IAAM,GAAQ1jB,KAAK2jB,YAAYC,uBACzB,MAAPH,GAAmBlD,EAAW,EAAyB,QAAlBvgB,KAAKka,WACpD,CAUOsH,QAAQnI,GACb,MAAO,OAAQA,CACjB,CAEOuE,wBAAwBvE,EAA6BwK,GAE1D,GAAG7jB,KAAKwhB,QAAQnI,GAEd,YADArZ,KAAK2d,uBAAuBtE,OAAQre,EAAW6oB,GAIjD,MAAMC,EAAU9jB,KAAKqgB,eAAe0D,aACpC,IAAI,MAAMnnB,KAAMknB,EAAS,CACvB,MAAMhnB,EAASgnB,EAAQlnB,GACvBoD,KAAK2d,uBAAuBtE,EAAQvc,EAAQ+mB,E,CAIhD,CAEOlG,uBACLtE,EACAvc,EACA+mB,GAEA,MAAMrC,EAAUxhB,KAAKwhB,QAAQnI,GACvBM,EAAW6H,EAAUxhB,KAAK8b,oBAAoBzC,GAAUvc,EAAOF,GAE/D0c,EAAWkI,EAAU,UAAYxhB,KAAK6d,4BAA4BlE,GAElEY,EADSva,KAAKqhB,UAAU1H,GACPY,QAEjByJ,EAAqCxC,EACvCpF,GAAkBA,EAAExf,KAAOyc,EAAOzc,GAClCwf,GAAcA,EAAEnd,SAAWoa,EAAOpa,OAChCglB,EAAW1J,EAAQwH,UAAUiC,GAC7BE,EAAY3J,EAAQ0J,GACpBE,EAAiBnkB,KAAKmjB,eAAee,EAAW5K,GAEnDuK,GAAWlK,EAAW,OACvBkK,OAAU7oB,GAGZ,MAAMopB,EAAiBP,OAAU7oB,EAAYgF,KAAK2iB,uBAAuBtJ,EAAQC,EAAUxc,GAE3F,OAAGqnB,IAAmBC,MAIjBD,KAAqBC,GACxBpkB,KAAKqkB,0CAA0C1K,EAAUN,IAAU+K,IAGpD,IAAdH,GACD1J,EAAQzQ,OAAOma,EAAU,GAGxBG,IACD,EAAAE,GAAA,GAA2B/J,EAASlB,GAASA,GAAWrZ,KAAKmjB,eAAe9J,EAAQC,KAAY,IAG3F,EACT,CAEOiL,kCAAkClL,EAA6BmL,GACpE,MAAMhD,EAAUxhB,KAAKwhB,QAAQnI,GACvBoL,EAAkC,GAElC9K,EAAW6H,EAAUxhB,KAAK8b,oBAAoBzC,GAAUA,EAAOuB,UAGrE,GAFA6J,EAAUnkB,KAAKN,KAAKqkB,0CAA0C1K,EAAUN,EAAQmL,KAE5EhD,EAAS,CACX,MAAMsC,EAAU9jB,KAAKqgB,eAAe0D,aACpC,IAAI,MAAMnnB,KAAMknB,EAAS,CACvB,MAAMhnB,EAASgnB,EAAQlnB,GACpBoD,KAAKqgB,eAAewC,oBAAoBxJ,EAAQvc,IACjD2nB,EAAUnkB,KAAKN,KAAKqkB,0CAA0CvnB,EAAOF,GAAIyc,EAAQmL,G,EAKvF,MAAO,KAAOA,GAAUC,EAAU3lB,SAAS4F,GAAaA,KAC1D,CAEO2f,0CAA0C1K,EAAkBN,EAA6BmL,GAC9F,MAAME,EAAiB1kB,KAAKwW,mBAAmBmO,qBAAqBtL,GAC9DuL,EAAa5kB,KAAKkiB,gBAAgB7I,GAExC,QAAcre,IAAXwpB,EAMH,MAAO,KACL,MAAMK,EAAiB7kB,KAAKwW,mBAAmBmO,qBAAqBtL,GAC9DyL,EAAa9kB,KAAKkiB,gBAAgB7I,GAElC0L,EAAmBF,EAAiBH,EAC1C1kB,KAAKglB,wBAAwBrL,EAAUoL,IAAoBF,EAAgBA,GAAkBC,EAAYzL,EAAO,EAXlH,CACE,MAAM0L,EAAmBP,EAASE,GAAkBA,EACpD1kB,KAAKglB,wBAAwBrL,EAAUoL,IAAoBL,EAAgBA,GAAkBE,EAAYvL,E,CAW7G,CAEO2L,wBACLrL,EACAoL,EACAE,EACAC,EACA7L,G,MAEA,MAAM,OAACpa,GAAUoa,EACX0G,EAAU/f,KAAK8a,gBAAgBiF,QAAQ9gB,GACvCuiB,EAAUxhB,KAAKwhB,QAAQnI,GAC7B,GAAG0G,IAAYyB,EAAS,CACtB,MAAM2D,EAAmBnlB,KAAKolB,oBAAoBnmB,GAClD,GAAGkmB,aAA4BxjB,QAgB7B,YAfAwjB,EAAiBrgB,MAAK,EAAEwV,QAAO+K,iBAC7BhM,EAASrZ,KAAKsb,cAAcrc,GAC5B,MAAMgiB,EAASjhB,KAAKqhB,UAAU1H,GAE3BN,GACArZ,KAAK8a,gBAAgBiF,QAAQ9gB,IAC7BgiB,GACAA,EAAO1G,QAAQ+K,MAAMjM,GAAWA,EAAOpa,SAAWA,KAKrDe,KAAKglB,wBAAwBrL,EAAU,GAAG,GAAO,EAAON,EAAO,IAKjE0L,EAAmB,EACnBE,EAAeE,EAAiB7K,MAAQ,EACxC4K,EAAgBC,EAAiBE,U,CAIrC,MAAMpE,EAASjhB,KAAKqhB,UAAU1H,GAC3BoL,IACD9D,EAAOC,oBAAsBP,KAAK4E,IAAI,EAAGtE,EAAOC,oBAAsB6D,IAGxE,MAAM1d,EAAMrH,KAAKuhB,aAAalI,GAC3B4L,EACDhE,EAAOE,cAAcpiB,IAAIsI,GAEzB4Z,EAAOE,cAActd,OAAOwD,GAG3B6d,EACDjE,EAAOG,qBAAqBriB,IAAIsI,GAEhC4Z,EAAOG,qBAAqBvd,OAAOwD,GAGT,QAA5B,EAAA4Z,EAAOuE,6BAAqB,QAA5BvE,EAAOuE,sBAA0B5W,EAAA,cAAe,KAC9CqS,EAAOuE,2BAAwBxqB,EAC/B,MAAMyqB,EAAU,OAAH,UAAOxE,UACbwE,EAAQlL,QACfva,KAAKmd,UAAUxW,cAAc,gBAAiB8e,GAE3CjE,GACDxhB,KAAK8d,8BAA8B7e,E,GAEpC,GACL,CAEO6e,8BAA8B7e,GACnC,MAAMoa,EAASrZ,KAAKsb,cAAcrc,GAC/Boa,IACDrZ,KAAK4d,wBAAwBvE,GAC7BrZ,KAAKukB,kCAAkClL,EAAvCrZ,GACAA,KAAKmd,UAAUxW,cAAc,gBAAiB,CAC5C1H,SACAoa,WAGN,CAEO6B,uBACL7B,EACAqM,EACA7jB,EACA8jB,G,MAEA,IAAID,EACF,OAGF,MAAMlE,EAAUxhB,KAAKwhB,QAAQnI,GAC7B,IAAiBkH,EAAbqF,EAAU,EACd,GAAIvM,EAAsBnc,OAAOykB,OAC/BiE,EAAU5lB,KAAKkjB,gCAAgC,MAC/C3C,GAAW,OACN,GAAGlH,EAAOnc,OAAO8d,SAAW2K,EACjCC,EAAU5lB,KAAK6lB,yBAAyBxM,GACxCkH,GAAW,MACN,CAKL,GAJA1e,IAAAA,EAAY7B,KAAKwW,mBAAmBkJ,iBAAiBrG,EAAOpa,OAAQoa,EAAO+F,cAE3EwG,GAAW/jB,aAAO,EAAPA,EAA6B4hB,OAAQmC,GAE5CpE,EAAS,CACX,MAAMsE,EAAY9lB,KAAK8a,gBAAgBiL,UAAU1M,EAAOpa,SAAWoa,EAAOpa,OAAO2d,WACjF,GAAGkJ,EAAW,CACZ,MAAMrJ,EAAUzc,KAAK0c,gBAAgBsB,QAAQ8H,KACzCF,GAAYnJ,EAAQgH,MAAQhH,EAAQgH,KAAOmC,KAC7CA,EAAUnJ,EAAQgH,K,EAKD,kBAAR,QAAZ,EAAApK,EAAO2M,aAAK,eAAErpB,IAAwB0c,EAAO2M,MAAMvC,KAAOmC,IAC3DA,EAAUvM,EAAO2M,MAAMvC,K,CAI3BmC,IAAAA,GAAY,EAAAlC,GAAA,IAAM,IAElB,MAAMviB,EAAQnB,KAAKijB,oBAAoB2C,EAASrF,GAChD,GAAGmF,EACD,OAAOvkB,EAITiY,GAAeC,GADE,EAAA2I,GAAA,GAAmB3I,EAAkBuB,WACrBzZ,EACnC,CAEO+hB,gCAAgCF,GACrC,OAAO,YAA4B,MAAdA,EACvB,CAEO6C,yBAAyBxM,GAC9B,MAAMmI,EAAUxhB,KAAKwhB,QAAQnI,GACvB2C,EAAQhc,KAAK+e,gBAAgByC,EAAUxhB,KAAK8b,oBAAoBzC,GAAUA,EAAOuB,WAEjFqL,EAAYjmB,KAAKuhB,aAAalI,GACpC,IAAI2J,EAAchH,EAAMvhB,QAAQwrB,GAUhC,OAToB,IAAjBjD,IACDhH,EAAMkK,QAAQD,GACdjD,EAAc,EAEVxB,GACFxhB,KAAK8Z,oBAIF9Z,KAAKkjB,gCAAgClH,EAAMvf,OAAS,EAAIumB,EACjE,CAoBOmD,iBAAiB9M,GACtB,GAAGrZ,KAAKwhB,QAAQnI,GACd,OAGF,MAAM,OAACpa,EAAM,IAAEmnB,GAAO/M,EAChBgN,EAAiBrmB,KAAKwW,mBAAmB8P,kBAAkBrnB,GAC3DsnB,EAAkBvmB,KAAKwW,mBAAmBgQ,0BAA0BvnB,GACpEwnB,EAAUJ,EAAeI,QAAQhf,MACvC,IAAIif,EACJ,IAAI,IAAI/gB,EAAI,EAAGlJ,EAASgqB,EAAQhqB,OAAQkJ,EAAIlJ,IAAUkJ,EAAG,CACvD,MAAMghB,EAAMF,EAAQ9gB,GACd9D,EAAqB7B,KAAKwW,mBAAmBoQ,sBAAsBL,EAAiBI,GAC1F,GAAG9kB,IAAYA,EAAQ3E,OAAO2pB,YAAiD,CAC7EH,EAAkB7kB,EAElB,MAAMmW,EAAUD,GAAsBlW,GACtC7B,KAAK8mB,aAAaC,mBAAmB/O,EAAS,cAAc/Y,KAE5D,K,EAgBJ,GAZAoa,EAAOiG,WAAaoH,EAYjBznB,EAAO+nB,aAAeZ,EAAK,CAC5B,MAAMa,EAASjnB,KAAKoe,kBAAkB8I,gBAAgBjoB,EAAO2d,WAAYwJ,GAAKA,IAC9E/M,EAAO+M,IAAMa,C,CAGfjnB,KAAKwD,QAAQyE,IAAI,CACf,CAAChJ,GAASoa,IAGZrZ,KAAK8mB,aAAaK,YAAYloB,EAAQ,SASxC,CAEOkc,YAAW,OAAC9B,EAAM,WAAEqH,EAAU,iBAAEjB,EAAgB,iBAAE2H,IAMvD,MAAM5F,EAAUxhB,KAAKwhB,QAAQnI,IACvB,UAACuB,EAAS,OAAE3b,GAAUoa,EAe5B,GAbGmI,EACmBxhB,KAAKqnB,oBAAoBpoB,GACjCge,OAAOhV,IAAIoR,EAAOzc,GAAIyc,GAElCrZ,KAAKua,QAAQtb,GAAUoa,EAGzBqH,UAAAA,EAAe1gB,KAAKsnB,oBAAoBjO,IAGxCrZ,KAAK4d,wBAAwBvE,GAG1BqH,IAAerH,EAAOnc,OAAO8d,OAAQ,CACtC,IAAIwG,GAAW4F,EAAkB,CAC/B,MAAMG,EAAwBvnB,KAAKia,uBAAkBV,KACjDgO,GAAyB7G,EAAa6G,KACxCvnB,KAAKia,uBAAkBV,GAAoBmH,E,CAI/C,MAAM/G,EAAW6H,EAAUxhB,KAAK8b,oBAAoBzC,GAAUuB,EACxD4M,EAAkBxnB,KAAKia,kBAAkBN,GAC/C,IAAI6N,GAAmB9G,EAAa8G,EAAiB,CAEnD,IAAI/H,IAAqBzf,KAAK4f,gBAAgBjG,GAE5C,YADA3Z,KAAK+a,WAAW9b,EAAQuiB,EAAUxhB,KAAKuhB,aAAalI,QAAUre,GAAW,GAI3EgF,KAAKia,kBAAkBN,GAAY+G,C,EAIvC1gB,KAAKmmB,iBAAiB9M,EAWxB,CAEOoO,sBAAsBxoB,EAAgBwc,GAC3C,MAAMiM,EAAc1nB,KAAKojB,UAAUnkB,OAAQjE,EAAWygB,GAAS,IACxDpC,EAAQlY,GAASumB,EACxB,GAAGrO,EAAQ,CACT,MAAMiD,EAAWb,EACfzb,KAAK8b,oBAAoBzC,GACxBA,EAAkBuB,UAIf+M,OAA4F3sB,KAAhF,EAAAqW,EAAA,GAAiBrR,KAAK+e,gBAAgBzC,GAAWtc,KAAKuhB,aAAalI,IAErFrZ,KAAK4d,wBAAwBvE,GAAQ,GAErCrZ,KAAKma,aAAaqD,YAAYve,EAAQ,IAEnC0oB,GACD3nB,KAAK8Z,kB,CAIT,OAAO4N,CACT,CAEO3M,WAAW9b,EAAgBwc,EAAkBmM,GAClD,MAAMvO,EAASrZ,KAAKujB,iBAAiBtkB,EAAQwc,GACvCiM,EAAc1nB,KAAKynB,sBAAsBxoB,EAAQwc,GAavD,OAZGpC,IACGuO,IACCnM,EACDzb,KAAKqnB,oBAAoBpoB,GAAQge,OAAOpZ,OAAO4X,UAExCzb,KAAKua,QAAQtb,IAIxBe,KAAK6nB,qBAAqBxO,EAAQuO,IAG7BF,CACT,CAEOG,qBAAqBxO,EAA6BuO,GACvD,GAAgB,eAAbvO,EAAO1c,EACR,OAGF,MAAM,OAACsC,GAAUoa,EACjBrZ,KAAK8mB,aAAaC,mBAAmB,GAAI,cAAc9nB,KACvDe,KAAK8mB,aAAagB,YAAY7oB,EAAQ,UACtCe,KAAKwD,QAAQK,OAAO5E,EAAQ2oB,EAC9B,CAEOG,oBAAoB9oB,EAAgBwc,GACzC,MAAMuM,EAAUhoB,KAAK+a,WAAW9b,EAAQwc,GAKxC,OAJGuM,EAAQvrB,QACTuD,KAAKmd,UAAUxW,cAAc,cAAeqhB,EAAQ,IAG/CA,CACT,CAKO/J,qBAAqBhf,EAAgBwc,GAC1Czb,KAAK+nB,oBAAoB9oB,EAAQwc,GACjCzb,KAAKmd,UAAUxW,cAAc,eAAgB1H,EAC/C,CAEOkd,aAAa/Z,EAAmDnD,GAGrE,MAAM8gB,EAAuB,yBAAb3d,EAAOzF,EACjBsrB,EAAS7lB,EAA+BmY,SAAYnY,EAA+B6a,OACrF8C,EAQF/f,KAAKgd,cAAc/d,EAAQmD,IAN3B,EAAA8lB,GAAA,GAAe9lB,EAAOmY,SAAS,CAAClB,EAAQ/U,KACtB,iBAAb+U,EAAO1c,GACRyF,EAAOmY,QAAQzQ,OAAOxF,EAAK,E,KAOjC,EAAA6jB,GAAA,GAA8BF,GAE9BjoB,KAAKod,gBAAgBgL,aAAahmB,EAAO0W,OACzC9Y,KAAK0c,gBAAgB2L,aAAajmB,EAAOkmB,OACzCtoB,KAAKwW,mBAAmB+I,aAAand,EAAOmmB,UAI5C,MAAMC,EAAyD,IAAIhX,IAUnEyW,EAAMnpB,SAASua,I,QACb,MAAMpa,EAASe,KAAK8a,gBAAgB9b,UAAUqa,EAAOwB,MACrD,IAAI4N,EAASpP,EAAO+F,YAEpB,MAAMsJ,EAAgB1oB,KAAKwW,mBAAmBmS,eAAe1pB,GAC7D,GAAGypB,EAAe,CAChB,MAAME,EAAoB5oB,KAAKwW,mBAAmBkJ,iBAAiBzgB,EAAQypB,GACrEpJ,EAAatf,KAAKwW,mBAAmBkJ,iBAAiBzgB,EAAQwpB,KAChEA,GAAWG,KAAuBtJ,IAAcsJ,aAAiB,EAAjBA,EAAmBnF,OAAOnE,aAAU,EAAVA,EAAYmE,UACxFpK,EAAO+F,YAAcqJ,EAASC,EAC9B1oB,KAAKwW,mBAAmB8P,kBAAkBrnB,GAAQ4pB,MAAQH,E,CAS9D,GAAGD,GAA8B,kBAAR,QAAZ,EAAApP,EAAO2M,aAAK,eAAErpB,IACzB,GAAGqD,KAAKwf,WAAW,CAACnG,WAAU,CAC5B,MAAMyP,EA9BW,CAAC7pB,IACtB,IAAI6pB,EAAQN,EAAehkB,IAAIvF,GAK/B,OAJI6pB,GACFN,EAAevgB,IAAIhJ,EAAQ6pB,EAAQ,CAAC,GAG/BA,CAAK,EAwBMC,CAAe9pB,GAE1B8gB,GACY,QAAb,EAAC+I,EAAM7L,cAAM,QAAZ6L,EAAM7L,OAAW,IAAIzL,KAAOvJ,IAC1BoR,EAAsBzc,GACvByc,GAGFyP,EAAMzP,OAASA,C,OAInBrZ,KAAK+nB,oBAAoB9oB,EAAQ8gB,EAAU/f,KAAKuhB,aAAalI,QAAUre,GAGzE,MAAMqM,EAAMrH,KAAKwW,mBAAmBwS,wBAAwB/pB,EAAQ8gB,EAAU/f,KAAKuhB,aAAalI,QAAUre,GACpGiuB,EAAUjpB,KAAKwW,mBAAmB0S,8BAA8B7hB,GACtE,QAAerM,IAAZiuB,EAAuB,CACxB,IAAI,MAAMxO,KAAUwO,EAClBA,EAAQplB,OAAO4W,GACfza,KAAKoe,kBAAkB+K,WAAW1O,GAGhCwO,EAAQ5V,aACHrT,KAAKwW,mBAAmB0S,8BAA8B7hB,E,KAKhEmhB,EAAenV,MAChBrT,KAAKmd,UAAUxW,cAAc,sBAAuB6hB,EAExD,CAEQlB,oBAAoBjO,GAC1B,MAAMxX,EAAU7B,KAAKwW,mBAAmBkJ,iBAAiBrG,EAAOpa,OAAQoa,EAAO+F,aAC/E,OAAOvd,aAAO,EAAPA,EAAS4hB,OAAQ,CAC1B,CAEO2F,sBAAsBnqB,GAC3B,GAAGA,EAAO+nB,YAAa,CACrB,MAAMjJ,EAAa/d,KAAK0c,gBAAgBsB,QAAQ/e,EAAO2d,YAEvD,GACa,qBAAXmB,EAAKphB,GAEJohB,EAAmB7gB,OAAOuI,KAG3B,OAAO,C,CAIX,OAAO,CACT,CAKO+Z,YAAW,OAChBnG,EAAM,SACNM,EAAQ,iBACR8F,EAAgB,iBAChB2H,I,QAOA,MAAM5F,EAAUxhB,KAAKwhB,QAAQnI,GACvBgQ,GAAY7H,EAEZ/F,EAAU+F,EAAUnI,EAAOzc,IAAK,EAAA8e,GAAA,GAAkBrC,EAAOzc,SAAM5B,EACjEwmB,GACF7H,UAAAA,EAA6B,QAAhB,EAAAN,EAAOuB,iBAAS,QAAI,MAGnC,MAAM3b,EAASe,KAAK8a,gBAAgB9b,UAAUqa,EAAOwB,MACrD,IAAI5b,EAEF,OADAtB,QAAQC,MAAM,gCAAiCyb,EAAQM,IAChD,EAOT,GAJI6H,GAAwB,WAAbnI,EAAO1c,GACpBgB,QAAQC,MAAM,sCAAuCyb,EAAQpf,OAAOC,OAAO,CAAC,EAAGmf,IAG9EgQ,IAAarpB,KAAKopB,sBAAsBnqB,GACzC,OAAO,EAGT,MAAM6mB,EAAY9lB,KAAK8a,gBAAgBiL,UAAU9mB,GAAUA,EAAO2d,WAAa,KAE/E,GAAGyM,EAAU,CACX,MAAM/L,EAAWtd,KAAK8a,gBAAgByC,kBAAkBte,GACxDe,KAAKma,aAAaqD,YAAYve,EAAQqe,E,CAGxC,MAAMgM,EAAkBtpB,KAAKujB,iBAAiBtkB,EAAQwc,GAEtD,IAAIkL,EAAa9kB,EACjB,GAAGwX,EAAO+F,YAAa,CACrBuH,GAAM,EAAAjL,GAAA,GAAkBrC,EAAO+F,aAG/B,MAAMmK,GAAgBD,aAAe,EAAfA,EAAiBlK,cAAepf,KAAKwW,mBAAmBkJ,iBAAiBzgB,EAAQqqB,EAAgBlK,cAC/F,QAArB,EAAAmK,aAAa,EAAbA,EAAersB,cAAM,eAAE2pB,cAAeyC,EAAgBlK,aAAeuH,IACtEA,EAAM2C,EAAgBlK,aAGxBvd,EAAU7B,KAAKwW,mBAAmBkJ,iBAAiBzgB,EAAQ0nB,E,MAE3DA,EAAM3mB,KAAKwW,mBAAmBgT,sBAAsBvqB,GACpD4C,EAAU,CACRlF,EAAG,UACHC,GAAI+pB,EACJA,MACA8C,QAASzpB,KAAK8a,gBAAgB4O,cAAc1pB,KAAKod,gBAAgBC,UAAUzgB,GAAGyC,UAAS,IACvFsZ,QAAS3Y,KAAK8a,gBAAgB4O,cAAczqB,GAC5C0qB,SAAS,EACTzsB,OAAQ,CAAC0sB,KAAK,GACdnG,KAAM,EACN5hB,QAAS,IAEX7B,KAAKwW,mBAAmB+I,aAAa,CAAC1d,GAAU,CAACgoB,YAAY,IAO/D,IAJIhoB,aAAO,EAAPA,EAAS3E,SACX8C,KAAKwW,mBAAmBrW,IAAIvC,MAAM,+BAAgCyb,EAAQxX,GAGzEwnB,IAAavD,GAAa7mB,EAAO+nB,YAAa,CAC/C,MAAMjJ,EAAO/d,KAAK0c,gBAAgBsB,QAAQ/e,EAAO2d,YACjD,GAAGmB,GAAQA,EAAK+L,aAAe/L,EAAK7gB,OAAO6sB,YAAa,CACtD,MAAMC,EAAiBhqB,KAAK8a,gBAAgB9b,UAAU+e,EAAK+L,aAC3D9pB,KAAKwW,mBAAmByT,eAAehrB,GAAU+qB,EACjDhqB,KAAKwW,mBAAmB0T,eAAeF,GAAkB/qB,EACzDoa,EAAOuI,WAAaoI,C,EAwBxB,GAnBA3Q,EAAO+F,YAAcuH,EAErBtN,EAAO8Q,mBAAoB,EAAAzO,GAAA,GAAkB4N,IAAoBjQ,EAAO8Q,kBAAoBb,EAAgBa,kBAAoB9Q,EAAO8Q,mBACvI9Q,EAAO+Q,oBAAqB,EAAA1O,GAAA,GAAkB4N,IAAoBjQ,EAAO+Q,mBAAqBd,EAAgBc,mBAAqB/Q,EAAO+Q,oBAEvIf,QAAiCruB,IAArBqe,EAAOuB,WACJ,WAAbvB,EAAO1c,IAER0c,EAAOuB,UAAY0O,EAAmBA,EAAkC1O,UAAYjB,GAMxFN,EAAO2M,MAAQhmB,KAAKkf,iBAAiBmL,UAAU,CAACprB,SAAQqjB,SAAU7G,EAASuK,MAAO3M,EAAO2M,QACzF3M,EAAOpa,OAASA,EAIb4C,GAAWA,EAAQ3E,OAAO2pB,YAAa,CACxC,MAAMyD,EAAQzoB,EAAQ3E,OAAO0sB,IAC1BjD,EAAMtN,EAAOiR,EAAQ,qBAAuB,sBAC7CzoB,EAAQ3E,OAAOqtB,QAAS,EAEpBlR,EAAOmR,cAAiBF,KACxBjR,EAAOmR,qBAGJ3oB,EAAQ3E,OAAOqtB,M,CAI1B,MAAMlE,EAAiBrmB,KAAKwW,mBAAmB8P,kBAAkBrnB,EAAQwc,GACnEhU,EAAQ4e,EAAeI,QAAQhf,MAkCrC,GA/BcA,EAAMhL,OAMTgL,EAAMgjB,MAAM,eACPpE,EAAeI,QAAQiE,YAAY,CAAC/D,IAC5CgE,OAAO,aACbtE,EAAe/L,QAAf+L,EAAe/L,MAAU,GACtBta,KAAKwW,mBAAmBoU,mBAAmBvE,EAAgBxkB,IAC5D7B,KAAKmd,UAAUxW,cAAc,uBAAwB,CAAC1H,aAVxDonB,EAAeI,QAAQP,QAAQS,GAC/BN,EAAe/L,QAAf+L,EAAe/L,MAAU,GACtBta,KAAKwW,mBAAmBoU,mBAAmBvE,EAAgBxkB,IAC5D7B,KAAKmd,UAAUxW,cAAc,uBAAwB,CAAC1H,YAW1DonB,EAAewC,MAAQlC,EACvBN,EAAewE,UAAYxR,EAAO8Q,kBAClC9D,EAAeyE,gBAAkBzR,EAAO+Q,mBAExCpqB,KAAKmiB,wBAAwB4I,iBAAiB,CAC5C9rB,SACAqjB,SAAUd,EAAUnI,EAAOzc,QAAK5B,EAChC8L,SAAUuS,EAAO2R,kBAGhB3B,GAAYvD,GAAazM,EAAO+M,KACjCpmB,KAAKoe,kBAAkB6M,gBAAgBnF,EAAWzM,EAAO+M,KAG3DpmB,KAAKkb,uBAAuB7B,GAEzBiQ,EAAiB,CAElB,MAAM4B,EAAqBlrB,KAAKmrB,eAAe5G,kCAAkC+E,GACjF1R,GAAkB0R,EAAiBjQ,GACnC6R,G,CAcF,OAXAlrB,KAAKmb,WAAW,CACd9B,SACAqH,WAAY7e,aAAO,EAAPA,EAAS4hB,KACrBhE,mBACA2H,qBAGC5F,GACDxhB,KAAKorB,mBAAmB/R,EAAQiQ,IAG3B,CACT,CAEO8B,mBAAmBxP,EAAmByP,GAC3C,IAAIA,EACF,OAGF,MAAM,OAACpsB,EAAQrC,GAAI0lB,GAAY1G,EACzB0P,EAAgB1P,EAAM2P,gBAAmBF,EAAwBE,cACjEC,EAAiB5P,EAAM6P,QAAWJ,EAAwBI,MAC1DC,EAAYJ,GAAiBE,EAEhCF,GACDtrB,KAAKmd,UAAUxW,cAAc,gBAAiB,CAAC1H,SAAQqjB,aAGtDoJ,GACD1rB,KAAKmd,UAAUxW,cAAc,kBAAmB,CAAC1H,SAAQqjB,YAE7D,CAEOqJ,WAAWjwB,GAYhB,MAAM,MACJ2e,EAAQ,GAAE,YACVuR,EAAW,MACXrP,EAAQ,GAAE,SACVD,EAAW,KAAa,aACxBoF,GAAe,GACbhmB,EAEEqkB,EAAU/f,KAAKggB,mBAAmB1D,GACxC,IAAIyD,IAAY,SAAiBzD,GAAW,CAC1C,MAAMpY,EAA2B,GAE3B2nB,EAAqB7rB,KAAKod,gBAAgB0O,eAC5CD,EAAmBE,QACrB7nB,EAAS5D,KAAKurB,EAAmBliB,SAGnC,MAAMqiB,EAA8BhsB,KAAKqgB,eAAe4L,qBAAqB3P,GAK7E,GAJG0P,GACD9nB,EAAS5D,KAAK0rB,GAGb9nB,EAASzH,OACV,OAAOkF,QAAQ0Q,IAAInO,GAAUY,MAAK,IACzB9E,KAAK2rB,WAAWjwB,I,CAM7B,MAAMwwB,EACF,SAAiB5P,KAAatc,KAAKygB,cAAcnE,IAAeyD,EAEhEzD,EADA/C,GAEJ,IAAI4S,EAAmBnsB,KAAKyhB,iBAAiBnF,EAAUoF,GAEvD,MAAMpI,EAAWtZ,KAAK6d,4BAA4BvB,GAElD,GAAGjC,IAAU0F,EAAS,CACpB,IAAIxD,GAASvc,KAAKoa,cAAcC,QAAUA,GAASra,KAAKoa,cAAcT,WAAa2C,EAAU,CAC3Ftc,KAAKoa,cAAcC,MAAQA,EAC3Bra,KAAKoa,cAAcT,SAAW2C,EAE9B,MAAMnX,EAAUnF,KAAKma,aAAa5f,OAAO8f,GAEnCE,EAAoB,GAC1B,IAAI,MAAMtb,KAAUe,KAAKua,QAAS,CAChC,MAAMlB,EAASrZ,KAAKua,QAAQtb,GACzBkG,EAAQzG,IAAI2a,EAAOpa,SAAWoa,EAAOuB,YAAc0B,GACpD/B,EAAQja,KAAK+Y,E,CAIjBkB,EAAQsG,MAAK,CAACuL,EAAIC,IAAOrsB,KAAKmjB,eAAekJ,EAAI/S,GAAYtZ,KAAKmjB,eAAeiJ,EAAI9S,KACrFtZ,KAAKoa,cAAcG,QAAUA,EAC7Bva,KAAKoa,cAAcE,MAAQC,EAAQ9d,M,CAGrC0vB,EAAmBnsB,KAAKoa,cAAcG,O,MAEtCva,KAAKoa,cAAcC,MAAQ,GAG7B,IAAIiS,EAAS,EACb,GAAGV,EAAc,EACf,IAAI,IAAInvB,EAAS0vB,EAAiB1vB,OAAQ6vB,EAAS7vB,KAC9CmvB,EAAc5rB,KAAKmjB,eAAegJ,EAAiBG,GAAShT,MADJgT,GAO/D,MAAMC,EAAYvsB,KAAK4f,gBAAgBsM,GACjCM,EAAkBL,EAAiB1vB,QAAW6vB,EAAS/P,EAC7D,GAAGlC,GAASkS,GAAaC,EAAiB,CACxC,MAAMjS,EAAU4R,EAAiB1kB,MAAM6kB,EAAQA,EAAS/P,GACxD,MAAO,CACLhC,UACAD,MAAOiS,EAAYJ,EAAiB1vB,OAAS,KAC7CgwB,SAAUN,EAAiB1vB,SAAY8d,EAAQ,IAAMA,EAAQ,KAAO4R,EAAiB,IAAOnsB,KAAKmjB,eAAegJ,EAAiB,GAAI7S,GAAYsS,GACjJnB,OAAQpQ,GAASkS,IAAeD,EAAS/P,GAAU4P,EAAiB1vB,O,CAIxE,OAAOuD,KAAKwW,mBAAmBkW,eAAe,CAACnQ,QAAO5C,SAAUuS,IAAepnB,MAAM1C,IAOnF,GALGsf,IACDyK,EAAmBnsB,KAAKyhB,iBAAiBnF,EAAUoF,IAGrD4K,EAAS,EACNV,EAAc,EACf,IAAI,IAAInvB,EAAS0vB,EAAiB1vB,OAAQ6vB,EAAS7vB,KAC9CmvB,EAAc5rB,KAAKmjB,eAAegJ,EAAiBG,GAAShT,MADJgT,GAS/D,MAAM/R,EAAU4R,EAAiB1kB,MAAM6kB,EAAQA,EAAS/P,GACxD,MAAO,CACLhC,UACAD,WAAwBtf,IAAjBoH,EAAOkY,MAAsB6R,EAAiB1vB,OAAS2F,EAAOkY,MACrEmS,SAAUN,EAAiB1vB,SAAY8d,EAAQ,IAAMA,EAAQ,KAAO4R,EAAiB,IAAOnsB,KAAKmjB,eAAegJ,EAAiB,GAAI7S,GAAYsS,GAEjJnB,MAAOroB,EAAOqoB,MACf,GAEL,CAIOtM,sBAAsBlf,GAC3B,MAAM6pB,EAAQ9oB,KAAK+Z,YAAYvV,IAAIvF,GACnC,IAAI6pB,EACF,OAGF,MAAM7H,EAASjhB,KAAKga,QAAQ/a,GACzBgiB,IACEA,EAAOuE,uBACRxgB,aAAaic,EAAOuE,8BAGfxlB,KAAKyZ,iBAAiBxa,UACtBe,KAAK0Z,aAAaza,UAClBe,KAAKia,kBAAkBhb,UACvBe,KAAKga,QAAQ/a,IAGtB6pB,EAAM7L,OAAOpe,OAIf,CAEOwoB,oBAAoBpoB,GACzB,IAAI8a,EAAc/Z,KAAK+Z,YAAYvV,IAAIvF,GAWvC,OAVI8a,IACFA,EAAc,CACZkD,OAAQ,IAAIzL,IACZmb,cAAe,IAAIvuB,IACnBwuB,iBAAkB,IAAIpb,KAGxBxR,KAAK+Z,YAAY9R,IAAIhJ,EAAQ8a,IAGxBA,CACT,CAEO8S,kBAAkB5tB,EAAgBwc,G,MACvC,IAAIzb,KAAK8a,gBAAgBiF,QAAQ9gB,GAC/B,OAAO0C,QAAQC,QAAO,EAAA+V,EAAA,GAAU,0BAGlC,MAAMmR,EAAQ9oB,KAAKqnB,oBAAoBpoB,GACvC,IAAI0K,EACJ,GAAG8R,EAAS,CAEV,GADA9R,EAAUmf,EAAM8D,iBAAiBpoB,IAAIiX,GAClC9R,EACD,OAAOA,EAGT,GAAGmf,EAAM6D,cAAcjuB,IAAI+c,GACzB,OAAO9Z,QAAQM,aAAQjH,GAGzB8tB,EAAM8D,iBAAiB3kB,IAAIwT,EAAS9R,GAAU,S,CAqDhD,OAlDsB,QAAtB,EAAAmf,EAAMgE,wBAAgB,QAAtBhE,EAAMgE,kBAAqB,EAAA/iB,EAAA,GAAM,GAAGjF,MAAK,KACvC,MAAMZ,EAAgD,CAAC,EACjD6oB,EAAgB,GACtB,IAAI,MAAOtR,EAAS9R,KAAYmf,EAAM8D,iBACpC1oB,EAASuX,GAAW9R,EACpBojB,EAAIzsB,MAAK,EAAA+e,GAAA,GAAmB5D,IAG9BqN,EAAM8D,iBAAiB/tB,QAEvB,MAAMmuB,EAAe,KACnB,IAAI,MAAMvR,KAAWvX,EACnBA,EAASuX,GAASxZ,aAAQjH,GAC1B8tB,EAAM6D,cAAc5tB,KAAK0c,E,EAI7B,GAAGzb,KAAKqnB,oBAAoBpoB,KAAY6pB,EAKxC,OAAO9oB,KAAK4T,WAAWC,UAAU,8BAA+B,CAC9D4I,QAASzc,KAAK0c,gBAAgBC,gBAAgB1d,EAAO2d,YACrDK,OAAQ8P,IACPjoB,MAAMmoB,IACP,GAAGjtB,KAAKqnB,oBAAoBpoB,KAAY6pB,EAaxC,OATA9oB,KAAKmc,aAAa8Q,EAAqBhuB,GAEvCguB,EAAoBhQ,OAAOne,SAASwiB,IACd,eAAjBA,EAAW3kB,IACZuH,EAASod,EAAW1kB,IAAIqF,QAAQqf,UACzBpd,EAASjF,G,IAIbguB,CAAmB,IACzB,SAAUnoB,MAAK,KAChBkoB,IAEAlE,EAAMgE,sBAAmB9xB,EACtB8tB,EAAM8D,iBAAiBvZ,MACxBrT,KAAK6sB,kBAAkB5tB,E,IA3BzB+tB,GA6BA,KAGGrjB,GAAWmf,EAAMgE,gBAC1B,CAMOjR,cAAc5c,EAAgBwc,G,MACnC,MAAM1B,EAAc/Z,KAAK+Z,YAAYvV,IAAIvF,GACzC,OAA0B,QAAnB,EAAA8a,aAAW,EAAXA,EAAakD,cAAM,eAAEzY,IAAIiX,EAClC,CAEOyR,sBAAsBjuB,EAAgBwc,G,MAC3C,MAAM6F,EAAathB,KAAK6b,cAAc5c,EAAQwc,GAC9C,GAAG6F,EACD,OAAOA,EAGT,MAAMwH,EAAQ9oB,KAAKqnB,oBAAoBpoB,GACvC,OAA2B,QAApB,EAAA6pB,aAAK,EAALA,EAAO6D,qBAAa,eAAEjuB,IAAI+c,SAAWzgB,EAAYgF,KAAK6sB,kBAAkB5tB,EAAQwc,EACzF,CAEOuB,cAA8E/d,EAAgBmD,GACnG,OAAO,EAAA+qB,EAAA,GAAY/qB,GAASA,IACvB,QAASA,GACVpC,KAAKoe,kBAAkB6M,gBAAgBhsB,EAAO2d,WAAYxa,EAAOgkB,KAGnE,MAAMvL,EAAO7a,KAAK8a,gBAAgB4O,cAAczqB,GAWhD,OAVAmD,EAAO6a,OAAS7a,EAAO6a,OAAO9Y,KAAKyX,IACjC,GAAe,sBAAZA,EAAMjf,EAMT,OAFCif,EAAqBf,KAAOA,EAC7Be,EAAMhf,IAAK,EAAA8e,GAAA,GAAkBE,EAAMhf,IAC5Bgf,CAAK,IACX9e,OAAOC,SAEHqF,CAAM,GAEjB,CAEOgrB,qBAAwFnuB,EAAgB0K,GAC7G,OAAOA,EAAQ7E,MAAM1C,IACnBpC,KAAKgd,cAAc/d,EAAQmD,GACpBA,IAEX,CAEOgjB,oBAAoBnmB,GACzB,IAAIe,KAAK8a,gBAAgBiF,QAAQ9gB,GAC/B,OAGF,MAAMgiB,EAASjhB,KAAKqhB,UAAUpiB,GAExBouB,EAAIpM,EAAO1G,QAAQ9d,QAAU,IAAMuD,KAAK4f,gBAAgB3gB,GAC5DgiB,EAAO1G,QAAQ9S,MAAM,EAAG,KACxB,EAAA0lB,EAAA,GAAYntB,KAAK2rB,WAAW,CAACrP,SAAUrd,EAAQsd,MAAO,MAAOna,GACpDA,EAAOmY,UAGlB,OAAO,EAAA4S,EAAA,GAAYE,GAAI9S,IACd,CACLD,MAAOC,EAAQ+S,QAAO,CAACC,EAAKC,IAAMD,MAASC,EAAEhD,cAAc,GAC3DnF,WAAY9K,EAAQ+K,MAAMjM,GAAWA,EAAOmR,cAAgBxqB,KAAKkiB,gBAAgB7I,QAGvF,CAIQkC,yBAAyBlC,EAA6B2B,EAAiBrB,GAC1EN,IACG2B,EAGF3B,EAAOnc,OAAO8d,QAAS,EAFvBhb,KAAKib,sBAAsB5B,EAAQM,GAKrC3Z,KAAKkb,uBAAuB7B,IAG9BrZ,KAAKwW,mBAAmB4E,yBAAyB/B,EAAOpa,OAAQoa,EAClE,CAEQ4C,oBAAoBtC,EAAkBqC,GAC5C,MAAM+D,EAAU/f,KAAKggB,mBAAmBrG,GACxC3Z,KAAK6Z,iBAAiBF,GACtB3Z,KAAK+e,gBAAgBpF,GAAUrZ,QAAQ0b,GACvChc,KAAK8Z,mBACLkC,EAAMjQ,UACN,MAAM0hB,EAA2C,CAAC,EAClDzR,EAAMld,SAASlC,IACb6wB,EAAU7wB,IAAM,EAEhB,MAAMqC,EAAS8gB,EAAUpG,EAAW/c,EAC9B6e,EAAUsE,EAAUnjB,OAAK5B,EAEzBqe,EAASrZ,KAAKujB,iBAAiBtkB,EAAQwc,GAC7Czb,KAAKwW,mBAAmB4E,yBAAyBnc,EAAQoa,GACrDA,IAIJA,EAAOnc,OAAO8d,QAAS,EACvBhb,KAAKkb,uBAAuB7B,GAAO,IAGrC,MAAMkB,EAAUva,KAAKyhB,iBAAiB9H,GAAU,GAChD,IAAI,MAAMN,KAAUkB,EAAS,CAC3B,IAAIlB,EAAOnc,OAAO8d,OAChB,MAGEyS,EAAUztB,KAAKuhB,aAAalI,aACvBA,EAAOnc,OAAO8d,OACrBhb,KAAKkb,uBAAuB7B,GAC5BrZ,KAAKwW,mBAAmB4E,yBAAyB/B,EAAOpa,OAAQoa,G,CAGtE,E,iUChnDF,MAAMqU,GAAc,CAClB,CAAC,eAAgB,iBACjB,CAAC,gBAAiB,kBAClB,CAAC,gBAAiB,mBAGdC,GAAoB,UAEpBC,GAA+B,CACnCjxB,EAAG,eACHO,OAAQ,CAAC,EACT2wB,MAAO,EACPjxB,GAAI,EACJ6uB,MAAO,GACPqC,cAAe,GACfC,cAAe,GACfC,aAAc,GACdC,eAAgB,GAChBC,eAAgB,GAChB1N,cAAe,IAGF,MAAM2N,WAAuBzb,EAA5C,c,oBA6FS,KAAA7T,MAAS0M,IACd,GAAIA,EAIG,CACLvL,KAAK8jB,QAAU,CAAC,EAChB9jB,KAAKouB,WAAa,GAClBpuB,KAAKquB,gBAAkB,IAAIjwB,IAE3B4B,KAAKsuB,aAAe,CAAC,EACrB,IAAI,MAAMhS,KAAY,KACpBtc,KAAKsuB,aAAahS,GAAYtc,KAAKuuB,oBAAoBjS,E,MATzDtc,KAAKquB,gBAAgBxvB,QACrBmB,KAAKwuB,eAYPxuB,KAAKiiB,QAAU,IAAc,EAGvB,KAAAwM,qBAAwBhU,IAC3BA,EAAO3d,OACRkD,KAAK0uB,iBAAiBjU,EAAO3d,QACrBkD,KAAK8jB,QAAQrJ,EAAO7d,MAE5BoD,KAAKmd,UAAUxW,cAAc,gBAAiB3G,KAAK8jB,QAAQrJ,EAAO7d,YAC3DoD,KAAK8jB,QAAQrJ,EAAO7d,KAC3B,EAAA+xB,GAAA,GAAc3uB,KAAKouB,YAAatxB,GAAYA,EAAqCF,KAAO6d,EAAO7d,MAGjGoD,KAAK6H,aAAa,EAGZ,KAAA+mB,sBAAyBnU,IAG/B,MAAMoU,GAAa,EAAAC,GAAA,GAAK9uB,KAAK8jB,SAE7B9jB,KAAK+uB,kBAAiB,GAAMjqB,MAAMgf,IAChC,IAAI,MAAMkL,KAAaH,EAAY,CACjC,MAAMvS,GAAY0S,EACdlL,EAAQtlB,MAAM1B,GAAWA,EAAOF,KAAO0f,KACzCtc,KAAKyuB,qBAAqB,CAAC9xB,EAAG,qBAAsBC,GAAI0f,G,CAI5Dtc,KAAKivB,0BAA0B,CAACtyB,EAAG,0BAA2Bqf,MAAO8H,EAAQ3f,KAAKrH,GAAWA,EAAOF,MAAK,GACzG,EAGI,KAAAqyB,0BAA6BxU,IAGnC,MAAMuB,EAAQvB,EAAOuB,MAAMvU,QACvBuU,EAAMkT,SAAS,OACjBlT,EAAMlS,OAAOkS,EAAM,KAAO,KAAgB,EAAI,EAAG,EAAG,MAGtDhc,KAAKiiB,QAAU,KACfjG,EAAMld,SAASwd,IACb,MAAMxf,EAASkD,KAAK8jB,QAAQxH,UACrBxf,EAAOmlB,QACdjiB,KAAKmvB,WAAWryB,EAAO,IAGzBkD,KAAKmd,UAAUxW,cAAc,eAAgBqV,GAE7Chc,KAAK6H,aAAa,CA+WtB,CAvgBYqV,QAmCR,OAlCAld,KAAKnB,OAAM,GAEXmB,KAAKoe,kBAAkBC,2BAA2B,CAChD+Q,mBAAoBpvB,KAAKyuB,qBAEzBY,oBAAqBrvB,KAAK4uB,sBAE1BU,wBAAyBtvB,KAAKivB,4BAuBhCjvB,KAAKmd,UAAU7W,iBAAiB,kBAAkB,KAChDtG,KAAK4uB,sBAAsB,CAACjyB,EAAG,uBAAuB,IAGjDqD,KAAK2e,gBAAgBxX,WAAWrC,MAAMmC,IACxBjH,KAAKuvB,eAAetoB,EAAMmnB,YAClCjqB,KAAKrH,IACdkD,KAAK0uB,iBAAiB5xB,GAAQ,GAAO,EAAK,GAC1C,GAEN,CAKQyyB,eAAezL,GACrBA,EAAUA,EAAQrc,QAElB,MAAM+nB,EAAiBxvB,KAAKsuB,aAAa,MACnCmB,EAAgBzvB,KAAKsuB,aAAa,MAElCoB,EAAsB5L,EAAQ/B,WAAWjlB,GAAwB,wBAAbA,EAAOH,GAA+BG,EAAOF,KAAO,OAY9G,OAX4B,IAAzB8yB,EAA4B5L,EAAQ4L,GAAuBF,EACzD1L,EAAQoC,QAAQsJ,IAErB,EAAAb,GAAA,GAAc7K,GAAUhnB,GAAYA,EAA0BF,KAAO,OACrEknB,EAAQha,OAAcga,EAAQ,KAAO0L,EAAiB,EAAI,EAAG,EAAGC,GAEhEzvB,KAAKiiB,QAAU,KACf6B,EAAQhlB,SAAShC,WACRA,EAAOmlB,OAAO,IAGhB6B,CACT,CAEQyK,oBAAoB3xB,GAC1B,MAAME,EAAM,gCAAuB,EAAAgyB,GAAA,GAAKlB,KAAa,CAAEhxB,OAWvD,OAVGA,IAAO,KACRE,EAAOI,OAAOyyB,kBAAmB,EACzB/yB,IAAO,OACfE,EAAOI,OAAO0yB,oBAAqB,GAGlC,SAAiBhzB,KAClBE,EAAO0jB,cAAgBxgB,KAAKmrB,eAAepM,gBAAgBniB,IAGtDE,CACT,CA2EQ+K,cACN7H,KAAK2e,gBAAgB9W,YAAY,aAAc7H,KAAKouB,WACtD,CAEOvL,oBAAoBxJ,EAAwCvc,GACjE,IAAIA,EACF,OAAO,EAGT,GAAG,SAAiBA,EAAOF,IACzB,OAAQyc,EAAkBuB,YAAc9d,EAAOF,IAAMoD,KAAKmrB,eAAe/B,sBAAsB/P,EAAOpa,QAGxG,MAAMA,EAASoa,EAAOpa,OAGtB,IAAIe,KAAKwW,mBAAmB8E,cAAcrc,GACxC,OAAO,EAIT,GAAGnC,EAAOmxB,eAAeiB,SAASjwB,GAChC,OAAO,EAIT,GAAGnC,EAAOoxB,eAAegB,SAASjwB,GAChC,OAAO,EAGT,MAAM/B,EAASJ,EAAOI,OAGtB,GAAGA,EAAOyyB,kBAAqBtW,EAAkBuB,YAAc,KAC7D,OAAO,EAIT,GAAG1d,EAAO2yB,eAAiB7vB,KAAKwW,mBAAmBsZ,eAAezW,GAChE,OAAO,EAIT,GAAGnc,EAAO6yB,eAAiB/vB,KAAKmiB,wBAAwBC,iBAAiB,CAACnjB,cAAcoa,EAAO2W,wBAAyB3W,EAAOmR,cAC7H,OAAO,EAGT,GAAGxqB,KAAK8a,gBAAgBkM,UAAU/nB,GAAS,CAEzC,GAAG/B,EAAO+yB,YAAcjwB,KAAK8a,gBAAgBoV,YAAYjxB,GACvD,OAAO,EAIT,GAAG/B,EAAOizB,QAAUnwB,KAAK8a,gBAAgBsV,WAAWnxB,GAClD,OAAO,C,KAEJ,CACL,MAAME,EAASF,EAAOoxB,WAGtB,GAAGrwB,KAAKod,gBAAgBkT,MAAMnxB,GAC5B,QAASjC,EAAOqzB,KAIlB,GAAGrzB,EAAOszB,eAAiBxwB,KAAKod,gBAAgBqT,UAAUtxB,GACxD,OAAO,EAIT,GAAGjC,EAAOwzB,UAAY1wB,KAAKod,gBAAgBqT,UAAUtxB,GACnD,OAAO,C,CAIX,OAAO,CACT,CAEOwxB,sBAAsBtX,EAAgBiD,GAC3C,OAAOtc,KAAK6iB,oBAAoBxJ,EAAQrZ,KAAK8jB,QAAQxH,GACvD,CAEOgE,UAAUhE,GACf,OAAOtc,KAAK8jB,QAAQxH,EACtB,CAEOyH,aACL,OAAO/jB,KAAK8jB,OACd,CAEO0K,eACL,MAAM1K,EAAU9jB,KAAK+jB,aACrB,IAAI,MAAMzH,KAAYwH,EACjB,UAAkBxH,IAIrBtc,KAAKyuB,qBAAqB,CACxB9xB,EAAG,qBACHC,IAAK0f,GAGX,CAEasU,gBAAgB3xB,EAAgBqd,G,0CAC3C,MAAMxf,EAASkD,KAAK8jB,QAAQxH,GAEtBnb,EAAQrE,EAAO0jB,cAAc/lB,QAAQwE,GACrC0oB,GAAuB,IAAXxmB,EAOlB,GALGwmB,IACD7qB,EAAOkxB,aAAalkB,OAAO3I,EAAO,GAClCrE,EAAO0jB,cAAc1W,OAAO3I,EAAO,KAGjCwmB,EAAW,CACb,GAAG7qB,EAAOkxB,aAAavxB,eAAiBuD,KAAK4T,WAAWid,aAAaC,0BACnE,OAAOnvB,QAAQC,QAAO,EAAA+V,EAAA,GAAU,4BAGlC7a,EAAOkxB,aAAa9H,QAAQlmB,KAAK8a,gBAAgBiW,iBAAiB9xB,IAClEnC,EAAO0jB,cAAc0F,QAAQjnB,E,CAG/B,OAAOe,KAAKovB,mBAAmBtyB,EACjC,G,CAEOk0B,mBAAmBl0B,EAAwBm0B,GAChD,MAAMpI,EAAQlI,KAAK4E,IAAI,KAAMtrB,OAAOgZ,KAAKjT,KAAK8jB,SAAS3f,KAAKwB,IAAOA,KAGnE,OAFA7I,GAAS,EAAAgyB,GAAA,GAAKhyB,IACPF,GAAKisB,EAAQ,EACb7oB,KAAKovB,mBAAmBtyB,OAAQ9B,EAAWi2B,EACpD,CAEO7B,mBAAmBtyB,EAAwBo0B,GAAS,EAAOD,GAAU,GAC1E,MAAMpD,EAAQqD,EAAS,EAAI,EAE3B,OAAOlxB,KAAK4T,WAAWC,UAAU,8BAA+B,CAC9Dga,QACAjxB,GAAIE,EAAOF,GACXE,OAAQo0B,OAASl2B,EAAYgF,KAAKmxB,sBAAsBr0B,KACvDgI,MAAMssB,IAeP,GANApxB,KAAKyuB,qBAAqB,CACxB9xB,EAAG,qBACHC,GAAIE,EAAOF,GACXE,OAAQo0B,OAASl2B,EAAY8B,IAG5Bm0B,EAAS,CACV,MAAM5D,EAAsB,GAC5B,IAAI,MAAM/Q,KAAYtc,KAAK8jB,QAAS,CAClC,MAAMhnB,EAASkD,KAAK8jB,QAAQxH,KAC1Bxf,EAAOmlB,QACToL,EAAE/sB,KAAKxD,E,CAGTA,EAAOmlB,QAAU,KAEjB,MAAMjG,EAAQqR,EAAExM,MAAK,CAACC,EAAGC,IAAMD,EAAEmB,QAAUlB,EAAEkB,UAAS9d,KAAKrH,GAAWA,EAAOF,KAC7EoD,KAAKivB,0BAA0B,CAC7BtyB,EAAG,0BACHqf,S,IAIR,CAEOqV,yBAAyBrV,GAC9B,OAAOhc,KAAK4T,WAAWC,UAAU,oCAAqC,CACpEmI,UACClX,MAAK,KACN9E,KAAKivB,0BAA0B,CAC7BtyB,EAAG,0BACHqf,SACA,GAEN,CAEOmV,sBAAsBr0B,GAC3B,MAAMyZ,GAAI,EAAAuY,GAAA,GAAKhyB,GAOf,OAFAkD,KAAKsxB,0BAA0Bx0B,GAExByZ,CACT,CAEQ+a,0BAA0Bx0B,IAChC,EAAAorB,GAAA,GAAeprB,EAAOoxB,gBAAgB,CAACjvB,EAAQqF,KAC1CxH,EAAO0jB,cAAc0O,SAASjwB,KAC/BnC,EAAOixB,cAAcjkB,OAAOxF,EAAK,GACjCxH,EAAOoxB,eAAepkB,OAAOxF,EAAK,G,GAGxC,CA0BO2nB,qBACL3P,EACAve,EAA2D,gBAE3D,MAAMjB,EAASkD,KAAKsgB,UAAUhE,GACxBiV,EAAQz0B,aAAM,EAANA,EAASiB,GACvB,KAAIwzB,aAAK,EAALA,EAAO90B,QACT,OAIF,MAAM+0B,EAAgBD,EAAMz0B,QAAQ20B,IAClC,MAAMxyB,EAASe,KAAK8a,gBAAgB9b,UAAUyyB,GACxCC,EAAoB1xB,KAAKquB,gBAAgB3vB,IAAIO,GAC7Coa,EAASrZ,KAAKwW,mBAAmB8E,cAAcrc,GAMrD,OADgByyB,IAAsBrY,CACzB,IAGf,IAAImY,EAAc/0B,OAKhB,OAGF,MAAMk1B,EAAiBH,EAAcrtB,KAAKstB,IACxC,MAAMxyB,EAASe,KAAK8a,gBAAgB9b,UAAUyyB,GAQ9C,OAPgBzxB,KAAKwW,mBAAmBmJ,mBAAmB8R,GAC1D3sB,MAAMuU,IACLrZ,KAAKquB,gBAAgBtvB,IAAIE,GAElBoa,OAASre,EAAYiE,IAGhB,IAYhB,OATsB0C,QAAQ0Q,IAAIsf,GAAgB7sB,MAAM8sB,KACtDA,EAAiBA,EAAe90B,OAAOC,UACpBN,M,GAQvB,CAEasyB,iBAAiB8C,GAAY,G,0CACxC,MAAM5e,EAAOhZ,OAAOgZ,KAAKjT,KAAK8jB,SAC9B,GAAG7Q,EAAKxW,OAASkxB,KAAsBkE,EACrC,OAAO5e,EAAK9O,KAAKmY,GAAatc,KAAK8jB,QAAQxH,KAAWuE,MAAK,CAACC,EAAGC,IAAMD,EAAEmB,QAAUlB,EAAEkB,UAGrF,MAAM6B,QAAgB9jB,KAAK4T,WAAWke,gBAAgB,6BAEtD,OADkB9xB,KAAKuvB,eAAezL,GACrB3f,KAAKrH,GAAWkD,KAAK0uB,iBAAiB5xB,EAAQ+0B,KAAY/0B,OAAOC,QACpF,G,CAEOg1B,6BACL,OAAO/xB,KAAK4T,WAAWC,UAAU,qCACnC,CAEO6a,iBAAiB5xB,EAAsB2d,GAAS,EAAMuX,GAG3C,wBAAbl1B,EAAOH,IACRG,EAASkD,KAAKsuB,aAAa,QAG7B,EAAAnG,GAAA,GAA2BrrB,GACvB,SAAiBA,EAAOF,MAC1B8wB,GAAY5uB,SAAQ,EAAEiC,EAAMkxB,OAC1B,EAAA9J,GAAA,GAA2BrrB,GAC3BA,EAAOm1B,GAAMn1B,EAAOiE,GAAMoD,KAAK0W,GAAS7a,KAAK8a,gBAAgB9b,UAAU6b,IAAM,IAG/E7a,KAAKsxB,0BAA0Bx0B,GAE/BA,EAAOixB,cAAgBjxB,EAAOkxB,aAAahqB,OAAOlH,EAAOixB,eACzDjxB,EAAOoxB,eAAiBpxB,EAAO0jB,cAAcxc,OAAOlH,EAAOoxB,iBAG7D,MAAMgE,EAAYlyB,KAAK8jB,QAAQhnB,EAAOF,IAiBtC,OAhBGs1B,EACDj4B,OAAOC,OAAOg4B,EAAWp1B,GAEzBkD,KAAK8jB,QAAQhnB,EAAOF,IAAME,EAG5BkD,KAAKmvB,WAAWryB,GAEZk1B,IACCvX,EACDza,KAAKmd,UAAUxW,cAAc,gBAAiB7J,GACrCo1B,GACTlyB,KAAKmd,UAAUxW,cAAc,aAAc7J,IAIxCA,CACT,CAEQqyB,WAAWryB,QACK9B,IAAnB8B,EAAOmlB,QACLnlB,EAAOmlB,SAAWjiB,KAAKiiB,UACxBjiB,KAAKiiB,QAAUnlB,EAAOmlB,QAAU,IAGlCnlB,EAAOmlB,QAAUjiB,KAAKiiB,WACtB,EAAA0M,GAAA,GAAc3uB,KAAKouB,YAAa+D,GAAYA,EAAQv1B,KAAOE,EAAOF,KAClEoD,KAAKouB,WAAW9tB,KAAKxD,GACrBkD,KAAK6H,cAET,CAEauqB,oBAAoB9V,G,0CAC/B,GAAG,SAAiBA,GAClB,OAAO,EAGT,MAAMC,QAAcvc,KAAK4T,WAAW4I,SAAS,WAG7C,OAF0Bxc,KAAKouB,WAAWtxB,QAAQA,IAAY,SAAiBA,EAAOF,MAAK6K,MAAM,EAAG8U,GAAO+I,MAAMxoB,GAAWA,EAAOF,KAAO0f,GAG5I,G,4BC/iBa,SAAS+V,GAAYC,EAAkBC,GAGpDA,EAAazzB,SAAS0zB,IACpBv4B,OAAOw4B,oBAAoBD,EAASE,WAAW5zB,SAASmB,IACtD,MAAMoE,EAA4BpK,OAAO04B,yBAAyBH,EAASE,UAAWzyB,IAAShG,OAAO2J,OAAO,MAIvF,gBAAT3D,GAIbhG,OAAO24B,eACLN,EAAYI,UACZzyB,EACAoE,EACD,GACD,GAkBN,CCAA,MAAMwuB,GAgBJ/yB,cAfO,KAAAgzB,aAA6B,CAClCC,kBAAmB,GACnBC,kBAAmB,CAAC,EACpBC,YAAa,KACbC,YAAa,MAGP,KAAAC,cAAqD,CAAC,EACtD,KAAAC,UAAW,EAEX,KAAAjzB,KAAM,EAAAsI,EAAA,IAAO,UAAW,WAAiB,UAAgB,KAAAD,KACzD,KAAAF,MAAQ,KAER,KAAA+qB,cAA2E,CAAC,EAyH7E,KAAAC,qBAAuB,CAACC,EAAoB73B,EAE9C,CAAC,KAEJ,MAAM83B,EAAc,CAClB/P,KAAM8P,EAAc9P,KACpBgQ,IAAKF,EAAcE,IACnBC,SAAUH,EAAcI,WAM1B,OAFA3zB,KAAKsI,OAAStI,KAAKG,IAAImI,MAAM,uBAAwBirB,GAE9CA,EAAc52B,GACnB,IAAK,iBACL,IAAK,sBACHqD,KAAK4zB,qBACL,MAEF,IAAK,cACH5zB,KAAK6zB,cAAcN,EAAc9Y,OAAQ+Y,GACzC,MAEF,IAAK,qBACL,IAAK,yBAA0B,EAC7B,EAAArL,GAAA,GAAwEoL,GACxEvzB,KAAKsI,OAAStI,KAAKG,IAAImI,MAAM,8CAA+C,OAAF,UAAMirB,IAChF,MAAMjJ,EAAQiJ,EAAcr2B,OAAO0sB,IAC7B3R,EAAUsb,EAAiD9J,UAAYa,EAAQtqB,KAAK8a,gBAAgB7b,OAAUs0B,EAA6Cn0B,SAC3J00B,EAAQP,EAAiD/zB,QAC5D+zB,EAAiD/zB,QAAQH,UAAS,GACjEk0B,EAA6Cn0B,QAAQC,UAAS,IAAUW,KAAK8a,gBAAgB7b,OAEjGe,KAAK6zB,cAAc,CACjBl3B,EAAG,mBACHkF,QAAS,CACPlF,EAAG,UACHO,OAAQq2B,EAAcr2B,OACtBN,GAAI22B,EAAc32B,GAClB6sB,QAASzpB,KAAK8a,gBAAgB4O,cAAczR,EAAO5Y,YACnDsZ,QAAS3Y,KAAK8a,gBAAgB4O,cAAcoK,GAC5CrQ,KAAM8P,EAAc9P,KACpB5hB,QAAS0xB,EAAc1xB,QACvBkyB,SAAUR,EAAcQ,SACxBC,SAAUT,EAAcS,SACxBC,SAAUV,EAAcU,UAE1B7N,IAAKmN,EAAcnN,IACnB8N,UAAWX,EAAcW,WACxBV,GACH,K,CAGF,IAAK,kBACL,IAAK,UACHxzB,KAAKod,gBAAgBgL,aAAamL,EAAcza,MAAOpd,EAAQy4B,UAC/Dn0B,KAAK0c,gBAAgB2L,aAAakL,EAAcjL,MAAO5sB,EAAQy4B,UAE/DZ,EAActK,QAAQnqB,SAAS2b,IAC7Bza,KAAK6zB,cAAcpZ,EAAQ+Y,EAAY,IAEzC,MAEF,QACExzB,KAAKG,IAAI2C,KAAK,yBAA0BywB,G,EAtL5CvzB,KAAKo0B,cAAa,EACpB,CAEQC,WACN,MAAMx6B,EAAOmG,KACbA,KAAK8yB,aAAe,IAAIwB,MAAMt0B,KAAK8yB,aAAc,CAC/C7qB,IAAK,SAASvF,EAA2C2E,EAA8ChD,GAIrG,OAFA3B,EAAO2E,GAAOhD,EACdxK,EAAK06B,oBACE,CACT,GAEJ,CAEOA,mBACL,MAAMC,EAAKx0B,KAAK8yB,aAChB9yB,KAAK2e,gBAAgB9W,YAAY,UAAW,CAC1C4rB,IAAKe,EAAGf,IACRrN,IAAKoO,EAAGpO,IACR3C,KAAM+Q,EAAG/Q,MAEb,CAEQgR,sB,MACN,MAAMxtB,EAAQjH,KAAK8yB,aACb4B,EAAUztB,EAAMwsB,IAAM,EACtBkB,EAAqB1tB,EAAM+rB,kBAAkB0B,GACnD,IAAIC,EACF,OAAO,EAGT,MAAM1L,EAAU0L,EAAmB1L,QACnC,IAAI,IAAItjB,EAAI,EAAGlJ,EAASwsB,EAAQxsB,OAAQkJ,EAAIlJ,IAAUkJ,EACpD3F,KAAKmpB,WAAWF,EAAQtjB,IAmB1B,OAhBAsB,EAAMwsB,IAAMkB,EAAmBlB,IAC5BkB,EAAmBlR,MAAQxc,EAAMwc,KAAOkR,EAAmBlR,OAC5Dxc,EAAMwc,KAAOkR,EAAmBlR,aAE3Bxc,EAAM+rB,kBAAkB0B,IAE3B10B,KAAKy0B,wBACU,QAAjB,EAAAxtB,EAAMgsB,mBAAW,eAAE2B,cACnB3tB,EAAMwsB,KAAOxsB,EAAMgsB,YAAY2B,cAC3B3tB,EAAMgsB,YAAY4B,mBAGb5tB,EAAMgsB,YAAY2B,YAFzB50B,KAAK80B,sBAAsB7tB,KAMxB,CACT,CAEQ8tB,oBAAoBjP,GAC1B,MAAMkP,EAAWlP,EAAY9lB,KAAKknB,gBAAgBpB,GAAa9lB,KAAK8yB,aACpE,IAAIkC,EAASjC,kBAAkBt2B,OAC7B,OAAO,EAGTu4B,EAASjC,kBAAkBlS,MAAK,CAACC,EAAGC,IAC3BD,EAAEsF,IAAMrF,EAAEqF,MAInB,IAAI6O,EAASD,EAAS5O,IAClB8O,EAAU,EACVC,EAAY,EAChB,IAAI,IAAIxvB,EAAI,EAAGlJ,EAASu4B,EAASjC,kBAAkBt2B,OAAQkJ,EAAIlJ,IAAUkJ,EAAG,CAC1E,MAAM8U,EAASua,EAASjC,kBAAkBptB,GAC1CsvB,GAAUxa,EAAOyZ,UACde,GAAUxa,EAAO2L,MAClB8O,EAAUza,EAAO2L,IACjB+O,EAAYxvB,E,CAIhB,IAAIuvB,EACF,OAAO,EAGTl1B,KAAKsI,OAAStI,KAAKG,IAAImI,MAAM,0BAA2B4sB,EAASF,EAASjC,kBAAkBtrB,MAAM,EAAG0tB,EAAY,IAEjHH,EAAS5O,IAAM8O,EACf,IAAI,IAAIvvB,EAAI,EAAGA,GAAKwvB,IAAaxvB,EAAG,CAClC,MAAM8U,EAASua,EAASjC,kBAAkBptB,GAG1C3F,KAAKmpB,WAAW1O,E,CAYlB,OAVAua,EAASjC,kBAAkBjpB,OAAO,EAAGqrB,EAAY,IAE7CH,EAASjC,kBAAkBt2B,QAAUu4B,EAAS/B,cAC5C+B,EAAS/B,YAAY2B,mBAGhBI,EAAS/B,YAAY4B,YAF5B70B,KAAK80B,sBAAsBE,KAMxB,CACT,CAEOpB,qBACD5zB,KAAK8yB,aAAaI,aACpBlzB,KAAKo1B,eAET,CAEOC,mBAAmB5a,GACxBza,KAAKszB,qBAAqB,CACxB32B,EAAG,cACH8d,UAEJ,CAsEQ2a,cAAcxtB,GAAQ,GAE5B,MAAMkrB,EAAe9yB,KAAK8yB,aACpBwC,EAAaxC,EAAaI,YAC5BoC,IACFxC,EAAaE,kBAAoB,CAAC,EAClCF,EAAaC,kBAAoB,IAGnC/yB,KAAK80B,sBAAsBhC,GAE3B,MAAMnpB,EAAU3J,KAAK4T,WAAWC,UAAU,wBAAyB,CACjEuS,IAAK0M,EAAa1M,IAClBmP,gBAAiB3tB,EAA+B,UAAO5M,EACvDyoB,KAAMqP,EAAarP,KACnB+R,KAAM,GACL,CACDvwB,QAAS,aACRH,MAAM2wB,IAGP,GAFAz1B,KAAKsI,OAAStI,KAAKG,IAAImI,MAAM,kBAAmBmtB,GAEtB,4BAAvBA,EAAiB94B,EAIlB,OAHAqD,KAAKsI,OAAStI,KAAKG,IAAImI,MAAM,mBAAoBmtB,EAAiBhC,KAClEX,EAAarP,KAAOgS,EAAiBhS,UACrCqP,EAAaW,IAAMgC,EAAiBhC,KAStC,GAJG7rB,GACD5H,KAAKmd,UAAUxW,cAAc,uBAGL,8BAAvB8uB,EAAiB94B,EAAmC,CACrDqD,KAAKod,gBAAgBgL,aAAaqN,EAAiB3c,OACnD9Y,KAAK0c,gBAAgB2L,aAAaoN,EAAiBnN,OAKnDmN,EAAiBC,cAAc52B,SAAS2b,IACtC,OAAOA,EAAO9d,GACZ,IAAK,uBACL,IAAK,0BACL,IAAK,2BAEH,YADAqD,KAAK6zB,cAAcpZ,GAIvBza,KAAKmpB,WAAW1O,EAAO,IAIzBgb,EAAiBE,aAAa72B,SAAS82B,IACrC51B,KAAKmpB,WAAW,CACdxsB,EAAG,mBACHkF,QAAS+zB,EACTxP,IAAK0M,EAAa1M,IAClB8N,UAAW,GACX,IAGJ,MAAM2B,EAAmC,uBAAvBJ,EAAiB94B,EAA6B84B,EAAiBxuB,MAAQwuB,EAAiBK,mBAC1GhD,EAAaW,IAAMoC,EAAUpC,IAC7BX,EAAa1M,IAAMyP,EAAUzP,IAC7B0M,EAAarP,KAAOoS,EAAUpS,I,MAE9BqP,EAAa1M,IAAMqP,EAAiBrP,IACpC0M,EAAarP,MAAQlV,KAAK1J,MAAQ,IAAO,GAAK7E,KAAK2jB,YAAYC,6BACxDkP,EAAaW,IAEpBzzB,KAAKmzB,cAAgB,CAAC,EAEtBnzB,KAAKG,IAAI2C,KAAK,iBAAkB2yB,EAAiB94B,GACjDqD,KAAK+1B,sBAKP,GAA0B,4BAAvBN,EAAiB94B,EAClB,OAAOqD,KAAKo1B,gBAEZp1B,KAAKsI,OAAStI,KAAKG,IAAImI,MAAM,oB,IAQjC,OAJIgtB,GACFt1B,KAAKg2B,UAAUlD,EAAcnpB,GAGxBA,CACT,CAEQmrB,sBAAsB7tB,GACzBA,EAAMgsB,cACPjuB,aAAaiC,EAAMgsB,YAAYhuB,SAC/BgC,EAAMgsB,YAAc,KAExB,CAEQgD,qBAAqBnQ,GAC3B,MAAMoQ,EAAel2B,KAAKknB,gBAAgBpB,GACpCwP,EAAaY,EAAahD,YAC5BoC,IACFY,EAAanD,kBAAoB,IAGnC/yB,KAAK80B,sBAAsBoB,GAE3B,MAAM/1B,EAAMH,KAAKsI,MAAQtI,KAAKG,IAAIg2B,WAAW,wBAA0BrQ,QAAa9qB,EAE9E2O,EAAU3J,KAAK4T,WAAWC,UAAU,+BAAgC,CACxE4I,QAASzc,KAAK0c,gBAAgBC,gBAAgBmJ,GAC9ChpB,OAAQ,CAACH,EAAG,8BACZypB,IAAK8P,EAAa9P,IAClB7J,MAAO,KACN,CAACtX,QAAS,aAAaH,MAAM2wB,IAK9B,GAJAt1B,SAAAA,EAAKmI,MAAM,cAAemtB,GAC1BS,EAAa9P,IAAM,QAASqP,EAAmBA,EAAiBrP,SAAMprB,EACtEk7B,EAAaE,mBAAqB7nB,KAAK1J,MAEb,mCAAvB4wB,EAAiB94B,EAApB,CAKA,GAA0B,qCAAvB84B,EAAiB94B,EAKlB,cAHOqD,KAAKmzB,cAAcrN,QAE1B9lB,KAAKmpB,WAAW,CAACxsB,EAAG,sBAAuB4C,WAAYumB,IAyBzD,GArBA9lB,KAAKod,gBAAgBgL,aAAaqN,EAAiB3c,OACnD9Y,KAAK0c,gBAAgB2L,aAAaoN,EAAiBnN,OAGnDnoB,SAAAA,EAAKmI,MAAM,WAAYmtB,EAAiBC,cAAcj5B,OAAQ,yBAC9Dg5B,EAAiBC,cAAc52B,SAAS2b,IACtCza,KAAKmpB,WAAW1O,EAAO,IAGzBta,SAAAA,EAAKmI,MAAM,WAAYmtB,EAAiBE,aAAal5B,OAAQ,wBAC7Dg5B,EAAiBE,aAAa72B,SAAS82B,IACrC51B,KAAKmpB,WAAW,CACdxsB,EAAG,0BACHkF,QAAS+zB,EACTxP,IAAK8P,EAAa9P,IAClB8N,UAAW,GACX,IAGJ/zB,SAAAA,EAAKmI,MAAM,qBAAsB4tB,EAAa9P,KAEpB,8BAAvBqP,EAAiB94B,IACjB84B,EAAiBv4B,OAAOm5B,MACzB,OAAOr2B,KAAKi2B,qBAAqBnQ,GAEjC3lB,SAAAA,EAAKmI,MAAM,4B,KAQf,OAJIgtB,GACFt1B,KAAKg2B,UAAUE,EAAcvsB,EAASmc,GAGjCnc,CACT,CAEQosB,sBACN/1B,KAAKod,gBAAgBve,QACrBmB,KAAK0c,gBAAgB7d,QACrBmB,KAAKwW,mBAAmB3X,QAExBmB,KAAKmd,UAAUxW,cAAc,gBAC/B,CAEQqvB,UAAU/uB,EAAqB0C,EAAsCmc,GAC3E7e,EAAMisB,YAAcvpB,EACpB3J,KAAKmd,UAAUxW,cAAc,sBAAuBmf,GAEpDnc,EAAQ7E,MAAK,KACXmC,EAAMisB,YAAc,KACpBlzB,KAAKmd,UAAUxW,cAAc,qBAAsBmf,EAAU,IAC5D,KACD7e,EAAMisB,YAAc,IAAI,GAE5B,CAEOjI,gBAAgBnF,EAAmBM,G,QACxC,IAAIA,EACF,MAAM,IAAIpb,MAAM,iCAAmC8a,GAGrD,OAAmC,QAAnC,KAAO9lB,KAAKmzB,eAAcrN,UAAS,UAATA,GAAe,CACvCM,MACA2M,kBAAmB,GACnBE,YAAa,KACbC,YAAa,KAEjB,CAEOhM,gBAAgBpB,EAAmBM,GAKxC,YAJqCprB,IAAlCgF,KAAKmzB,cAAcrN,IACpB9lB,KAAKirB,gBAAgBnF,EAAWM,GAG3BpmB,KAAKmzB,cAAcrN,EAC5B,CAEQ+N,cAAcpZ,EAAgB/e,EAKjC,CAAC,G,YACJ,IAAIoqB,EACJ,OAAOrL,EAAO9d,GACZ,IAAK,0BACL,IAAK,2BACHmpB,EAAY9lB,KAAK8a,gBAAgB9b,UAAUyb,EAAO5Y,QAAQ8W,SAASiE,WACnE,MAIF,IAAK,uBAEH,GADAkJ,EAAYrL,EAAOlb,aACdumB,KAAa9lB,KAAKmzB,eACrB,OAAO,EAET,MACF,QACK,eAAgB1Y,GAAU,QAASA,IACpCqL,EAAYrL,EAAOlb,YAKzB,MAAM,IAAC6mB,EAAG,UAAE8N,GAAazZ,EACnBua,EAAWlP,EAAY9lB,KAAKknB,gBAAgBpB,EAAWM,GAAOpmB,KAAK8yB,aAIzE,GAAGkC,EAAS9B,YACV,OAAO,EAGT,GAAgB,yBAAbzY,EAAO9d,EAMR,QALIq4B,EAASsB,mBACTtB,EAASsB,kBAAqB/nB,KAAK1J,MAvc1B,IAycX7E,KAAKi2B,qBAAqBnQ,IAErB,EAGT,GAAgB,qBAAbrL,EAAO9d,GACO,sBAAb8d,EAAO9d,GACM,4BAAb8d,EAAO9d,GACM,6BAAb8d,EAAO9d,EAAkC,CAC3C,MAAMkF,EAAU4Y,EAAO5Y,QACjBxC,EAAWW,KAAK8a,gBAAgB9b,UAAU6C,EAAQ8W,SAClD4d,EAA+C10B,EAAQkyB,UAAY,CAAC,EAC1E,IAAIt1B,EACJ,GAAGoD,EAAQ4nB,UAAYzpB,KAAKod,gBAAgBoZ,QAAQx2B,KAAK8a,gBAAgB9b,UAAU6C,EAAQ4nB,SAAU5nB,EAAQ3E,OAAOu5B,QAA2Bh4B,EAAS,WACpJ83B,EAAU9M,UAAYzpB,KAAKod,gBAAgBoZ,QAAQx2B,KAAK8a,gBAAgB9b,UAAUu3B,EAAU9M,WAAa8M,EAAU9M,QAA6BlqB,cAAgBd,EAAS,eAClI,QAAvC,EAAC83B,EAAU9M,eAA4B,eAAElqB,cAAeS,KAAK0c,gBAAgBga,QAASH,EAAU9M,QAA6BlqB,YAAY,KAAUd,EAAS,eAC5JY,EAASI,WAAaO,KAAKod,gBAAgBoZ,QAAQn3B,KAAcZ,EAAS,gBAC1EY,EAAS2nB,cAAgBhnB,KAAK0c,gBAAgBga,QAAQr3B,EAASud,cAAgBne,EAAS,eAO1F,OANAuB,KAAKG,IAAI2C,KAAK,qCAAsCzD,EAAUZ,EAAQoD,GACnEikB,GAAa9lB,KAAK0c,gBAAgBga,QAAQ5Q,GAC3C9lB,KAAKi2B,qBAAqBnQ,GAE1B9lB,KAAK4zB,sBAEA,C,MAEJ,GAAG9N,IAAc9lB,KAAK0c,gBAAgBga,QAAQ5Q,GAEnD,OAAO,EAGT,IAAI6Q,EACAC,EAEJ,GAAGxQ,EAAK,CAEN,GADe4O,EAAS5O,KAAO8N,GAAa,GAChC9N,EAsBV,OArBApmB,KAAKsI,OAAStI,KAAKG,IAAI2C,KAAK,WAAYkyB,EAAUva,EAAQqL,GAAa9lB,KAAK0c,gBAAgBsB,QAAQ8H,IACpGkP,EAASjC,kBAAkBzyB,KAAKma,GAC5Bua,EAAS/B,aAAgB+B,EAAS9B,cACpC8B,EAAS/B,YAAc,CACrBhuB,QAAS2J,EAAA,cAAe,KACtBomB,EAAS/B,YAAc,KAEpB+B,EAAS9B,cAITpN,EACD9lB,KAAKi2B,qBAAqBnQ,GAE1B9lB,KAAKo1B,gB,GA5fF,KAkgBXJ,EAAS/B,YAAY4B,aAAc,GAC5B,EAGT,GAAGzO,EAAM4O,EAAS5O,IAChB4O,EAAS5O,IAAMA,EACfuQ,GAAS,EAET3B,EAASsB,kBAAoB/nB,KAAK1J,WAC7B,GAAGqvB,EAER,OAAO,EAGNpO,GAAapqB,EAAQ+nB,MAAQzjB,KAAK8yB,aAAarP,KAAO/nB,EAAQ+nB,OAC/DzjB,KAAK8yB,aAAarP,KAAO/nB,EAAQ+nB,K,MAE9B,IAAIqC,GAAapqB,EAAQ+3B,IAAM,EAAG,CACvC,MAAMA,EAAM/3B,EAAQ+3B,IACdC,EAAWh4B,EAAQg4B,UAAYD,EAErC,GAAGC,IAAasB,EAASvB,IAAM,GAC1BC,EAAWsB,EAASvB,IAwBrB,OAvBAzzB,KAAKsI,OAAStI,KAAKG,IAAI2C,KAAK,WAAYkyB,EAA8B,QAApB,EAAAA,EAAS/B,mBAAW,eAAE2B,aAErC,QAAnC,KAAAI,EAAShC,mBAAkBU,UAAQ,UAARA,GAAc,CAACD,MAAKhQ,KAAM/nB,EAAQ+nB,KAAMwF,QAAS,KAC5E+L,EAAShC,kBAAkBU,GAAUzK,QAAQ3oB,KAAKma,GAE9Cua,EAAS/B,cACX+B,EAAS/B,YAAc,CACrBhuB,QAAS2J,EAAA,cAAe,KACtBomB,EAAS/B,YAAc,KAEpB+B,EAAS9B,aAIZlzB,KAAKo1B,eAAe,GAviBjB,OA4iBLJ,EAAS/B,YAAY2B,aACvBI,EAAS/B,YAAY2B,YAAclB,KACnCsB,EAAS/B,YAAY2B,YAAclB,IAE9B,EAIRsB,EAASvB,MAAQA,IAClBuB,EAASvB,IAAMA,EACZ/3B,EAAQ+nB,MAAQuR,EAASvR,KAAO/nB,EAAQ+nB,OACzCuR,EAASvR,KAAO/nB,EAAQ+nB,MAG1BmT,GAAS,E,CAIb52B,KAAKmpB,WAAW1O,GAEbkc,EACD32B,KAAK+0B,oBAAoBjP,GACjB8Q,GACR52B,KAAKy0B,qBAET,CAEOtL,WAAW1O,GAEhBza,KAAK2G,cAAc8T,EAAO9d,EAAG8d,EAC/B,CAEOoc,0BAA0B/Q,G,UAC/B,MAAMgR,EAA2C,QAA/B,KAAG92B,KAAKqzB,eAAcvN,UAAS,UAATA,GAAe,CAACxL,MAAO,KAC7Dwc,EAAaxc,MAEf,MAAMyc,EAAK,KACT,MAAM9vB,EAAQjH,KAAKknB,gBAAgBpB,GAC/B7e,EAAMisB,aAAiBjsB,EAAMmvB,sBAAuB7nB,KAAK1J,MAAQoC,EAAMmvB,mBAAsB,OAC/Fp2B,KAAKi2B,qBAAqBnQ,E,EAIT,QAArB,EAAAgR,EAAaE,gBAAQ,QAArBF,EAAaE,SAAapoB,EAAA,cAAgBmoB,EAAI,MAC9CA,GACF,CAEOE,8BAA8BnR,EAAmBoR,GACtD,MAAMJ,EAAe92B,KAAKqzB,cAAcvN,KACpCgR,aAAY,EAAZA,EAAcE,aAAeF,EAAaxc,QAAU4c,IAIxDC,cAAcL,EAAaE,UAC3BF,EAAaE,cAAWh8B,SACjBgF,KAAKqzB,cAAcvN,GAC5B,CAEOsR,OAAOC,GACTr3B,KAAKozB,WAIRpzB,KAAKG,IAAI,UAETH,KAAKozB,UAAW,EAEhBpzB,KAAK2e,gBAAgBxX,WAAWrC,MAAK,EAAEmkB,QAAShiB,MAC9C,MAAMjE,EAAahD,KAAK2e,gBAAgB3b,WAGpCiE,GAAUA,EAAMmf,KAAQnf,EAAMwc,MAiChCxpB,OAAOC,OAAO8F,KAAK8yB,aAAc7rB,GAEjCjH,KAAKG,IAAI,sBAAuBlG,OAAOC,OAAO,CAAC,EAAG+M,IAElDjH,KAAKo1B,eAAc,KApCnBp1B,KAAKG,IAAI,sBAETH,KAAK8yB,aAAaI,YAAc,IAAIvxB,SAASM,IAC3CjC,KAAK4T,WAAWC,UAAU,mBAAoB,CAAC,EAAG,CAACyjB,YAAY,IAAOxyB,MAAMyyB,IAC1Ev3B,KAAK8yB,aAAaW,IAAM8D,EAAY9D,IACpCzzB,KAAK8yB,aAAa1M,IAAMmR,EAAYnR,IACpCpmB,KAAK8yB,aAAarP,KAAO8T,EAAY9T,KACrCzjB,KAAKu0B,mBAELv0B,KAAK8yB,aAAaI,YAAc,KAChCjxB,GAAS,GAST,KAwBNjC,KAAK4T,WAAW4jB,oBAAoBx3B,KAAKszB,sBAGzCtzB,KAAKq0B,WAGFrxB,GACDhD,KAAK8yB,aAAaI,YAAYpuB,MAAK,KAAW,O,EAAA,K,OAAA,E,EAAA,YAC5C,MAAM2yB,EAA+B,CACnCC,GAAI,yBACJC,GAAI,sBAGAC,EAAgBC,IACpBhvB,MAAM,cAAcgvB,KAAQ70B,EAAWpD,MAAM,KAAK,SACjDkF,MAAMgzB,GAAwB,MAAfA,EAAIpxB,QAAkBoxB,EAAIC,IAAMD,EAAIz8B,QAAWsG,QAAQC,WACtEkD,MAAMzJ,IACL,MAAM28B,EAAUP,EAAKI,IAASJ,EAAKC,GAGnCr8B,EAFY,iBAAiB,cAAc28B,KAAWh1B,UAEzC3H,EAEb,MAAM44B,EAA4B,GAG5BxZ,EAA2C,CAC/C9d,EAAG,4BACHs3B,WACApyB,SALc,EAAAo2B,GAAA,GAAc58B,EAAM44B,GAMlCl2B,KAAM,QACNb,OAAQ,CAAC,EACTg7B,WAAY3pB,KAAK1J,MAAQ,IAAO,EAChCuT,WAAOpd,GAGTgF,KAAKq1B,mBAAmB5a,EAAO,GAC/B,EAGE0d,GAAY,EAAAC,GAAA,GAAa,CAACf,EAAU,OAC1C,IAAI,MAAMgB,KAAYF,EACpB,UACQP,EAAaS,GACnB,K,CACA,MAAM/uB,G,CAIZ,E,YAzC8C,K,6QAyC5C,G,IAGR,EAMF+oB,GAAYQ,GAAmB,CAAC,IAAmBngB,ICpvB5C,MAAM4lB,WAA0B5lB,EAAvC,c,oBACU,KAAA6lB,gBAIJ,CAAC,CA8DP,CA5DYrb,QACRld,KAAKmd,UAAU7W,iBAAiB,iBAAiB,EAAErH,SAAQqjB,eACtDA,GAIHtiB,KAAKw4B,uBAAuBv5B,EAAO,GAEvC,CAEOw5B,eAAex5B,EAAgBoU,GACpC,MAAMqlB,EAAQ14B,KAAKu4B,gBAAgBt5B,GACnC,YAAYjE,IAATqY,IACQqlB,KAGDA,IAASA,EAAMrlB,IAAWqlB,EAAMrlB,aAAiB1R,QAC7D,CAEO62B,uBAAuBv5B,GACzBe,KAAKu4B,gBAAgBt5B,WACfe,KAAKu4B,gBAAgBt5B,EAEhC,CAEO05B,WAAW15B,EAAgB25B,EAAgEvlB,G,QAChG,MAAMqlB,EAAmC,QAA9B,KAAG14B,KAAKu4B,iBAAgBt5B,UAAM,UAANA,GAAY,CAAC,EAChD,GAAIy5B,EAAMrlB,GA8BR,OAAOqlB,EAAMrlB,GA9BE,CAEf,MAAMwlB,EAAsE,CAC1El8B,EAAG,6BACHO,OAAQ,CAAC,EACT2d,KAAM7a,KAAK8a,gBAAgBiW,iBAAiB9xB,GAC5ChC,SAAU27B,EAAM37B,UAGZ67B,EAAmC,CAAC3wB,KAAMywB,EAAMG,MAAOx8B,SAAUs8B,GAC3D,cAATxlB,IACDwlB,EAAsB37B,OAAOC,KAAM,EACnC27B,EAAgBE,UAAY,QAS9B,MAAMrvB,EAAU3J,KAAKi5B,eAAeloB,SAAS+nB,GAC7C,OAAOJ,EAAMrlB,GAAQ1J,EAAQ7E,MAAMo0B,GAC1BR,EAAMrlB,GAAQ8lB,IAAIC,gBAAgBF,I,CAS/C,E,qTC9DK,MAAMG,WAAwB3mB,EAGzBwK,QACRld,KAAKs5B,MAAQ,IAAI9nB,IAEb1L,IAAiByzB,mBAIrBv5B,KAAKoe,kBAAkBC,2BAA2B,CAChDmb,gBAAkB/e,IAChBza,KAAKy5B,SAAShf,EAAOif,WAAW,EAGlCC,6BAA+Blf,IAC7Bza,KAAKmd,UAAUxW,cAAc,iBAAkB,CAACizB,OAAQnf,EAAOof,cAAevvB,KAAMmQ,EAAOnQ,MAAM,GAGvG,CAEOwvB,WAAWC,EAAiBjZ,EAAekZ,GAChD,OAAOh6B,KAAKuU,aAAaC,aAAa,iBAAkBulB,EAAKjZ,EAAGkZ,EAClE,CAEOP,SAASQ,GACd,MAAMC,EAAyB,uBAAXD,EAAKt9B,EACnBw9B,EAAUn6B,KAAKs5B,MAAM90B,IAAIy1B,EAAKr9B,IAiBpC,OAhBGu9B,GAEDviB,GAAkBuiB,EAASF,GAGxBC,GACDl6B,KAAKs5B,MAAMz1B,OAAOo2B,EAAKr9B,IAGzBq9B,EAAOE,GACED,GACTl6B,KAAKs5B,MAAMrxB,IAAIgyB,EAAKr9B,GAAIq9B,GAG1Bj6B,KAAKmd,UAAUxW,cAAc,cAAeszB,GAErCA,CACT,CAEOG,QAAQR,GACb,OAAO55B,KAAKs5B,MAAM90B,IAAIo1B,EACxB,CAEOS,aAAaz9B,GAClB,MAAMq9B,EAAOj6B,KAAKo6B,QAAQx9B,GAC1B,MAAO,CACLD,EAAG,iBACHC,GAAIq9B,EAAKr9B,GACT09B,YAAaL,EAAKK,YAEtB,CAEOC,mBAAmBC,GAExB,OADAx6B,KAAKod,gBAAgBgL,aAAaoS,EAAe1hB,OAC1C9Y,KAAKy5B,SAASe,EAAed,WACtC,CAEOe,aACL,OAAOz6B,KAAK4T,WAAWC,UAAU,uBAAwB,CACvD7Z,QAAS,EACT0gC,cAAe,MACd51B,MAAM61B,GACA36B,KAAKuU,aAAaC,aAAa,cAAemmB,IAEzD,CAUaC,YAAYz7B,EAAgB07B,EAA6BC,EAAsBC,G,0CAC1F,MAAMP,QAAuBx6B,KAAK4T,WAAWC,UAAU,oBAAqB,CAC1EzU,QAASY,KAAKod,gBAAgB4d,aAAa77B,GAC3C07B,SAAUA,EACVE,MAAOA,EACPE,WAAW,QAAe,IAC1BH,SAAUA,IAGZ,OAAO96B,KAAKu6B,mBAAmBC,EACjC,G,CAEaU,YAAYtB,EAAgBuB,EAAkB18B,EAAqCs8B,G,0CAC9F,IAAI/6B,KAAKo6B,QAAQR,GACf,OAGF,MAAM3Q,QAAgBjpB,KAAK4T,WAAWC,UAAU,oBAAqB,CACnEknB,QACAlgB,KAAM7a,KAAKq6B,aAAaT,GACxBuB,WACA18B,OAAQ,CACN9B,EAAG8B,GAEL28B,cAAe,MAGjBp7B,KAAKoe,kBAAkBkV,qBAAqBrK,EAC9C,G,4BCnGK,MAAMoS,WAAwB3oB,EAArC,c,oBA8DS,KAAA7T,MAAQ,CAAC0M,GAAO,KACrB,GAAIA,EAYFvL,KAAKsoB,MAAQ,CAAC,OAXd,IAAI,MAAMhpB,KAAUU,KAAKsoB,MACvB,GAAIhpB,IACAU,KAAK8mB,aAAawU,aAAah8B,EAAOD,UAAS,IAAQ,CACzD,MAAM0e,EAAO/d,KAAKsoB,MAAMhpB,GACxBU,KAAKod,gBAAgBme,qBAAqBxd,GAAM,GAEhD/d,KAAKwD,QAAQK,OAAOvE,UACbU,KAAKsoB,MAAMhpB,E,GA8SlB,KAAAk8B,cAAgB,CAACl8B,EAAgB2pB,K,MAGvCjpB,KAAKoe,kBAAkBkV,qBAAqBrK,IACJ,QAArC,EAACA,aAAO,EAAPA,EAA6BA,eAAO,eAAExsB,SAAUuD,KAAK+lB,UAAUzmB,IACjEU,KAAKmd,UAAUxW,cAAc,0BAA2BrH,E,CAqf9D,CAv2BY4d,QA0BR,OAzBAld,KAAKnB,OAAM,GAEXmB,KAAKoe,kBAAkBC,2BAA2B,CAOhDod,yBAA2BhhB,IACzBza,KAAK4T,WAAW8nB,WAAW,4BAA6BznB,GAC9CA,EAAOwI,QAAsCld,aAAekb,EAAOlb,YAC3E,EAGJo8B,8BAAgClhB,IAC9B,MAAMnb,EAASU,KAAK8a,gBAAgB9b,UAAUyb,EAAOI,MAAM+B,WACrDmB,EAAO/d,KAAKsoB,MAAMhpB,GACrBye,IACDA,EAAK6d,sBAAwBnhB,EAAOmhB,sBACpC57B,KAAKmd,UAAUxW,cAAc,cAAerH,G,IAK3CqC,QAAQ0Q,IAAI,CACjBrS,KAAK2e,gBAAgBxX,WACrBnH,KAAK4e,mBAAmBlL,YAAY,WACnC5O,MAAK,EAAEmC,GAAQ9B,QAASmjB,EAAO9kB,eAChCxD,KAAKwD,QAAUA,EAEfxD,KAAKqoB,aAAaC,GAElBtoB,KAAK8mB,aAAaxgB,iBAAiB,cAAerH,IAC7CA,EAAOQ,UAAYO,KAAKwD,QAAQq4B,aAAa58B,EAAO2d,aAIvD5c,KAAKwD,QAAQyE,IAAI,CACf,CAAChJ,EAAO2d,YAAa5c,KAAKge,QAAQ/e,EAAO2d,aACzC,IAGJ5c,KAAK8mB,aAAaxgB,iBAAiB,gBAAiBrH,KAC/CA,EAAOQ,UAAaO,KAAKwD,QAAQq4B,aAAa58B,EAAO2d,aAIxD5c,KAAKwD,QAAQK,OAAO5E,EAAO2d,WAAW,GACtC,GAEN,CAmBOyL,aAAayT,EAAiB3H,GAC/B2H,EAAiBpD,QACpBoD,EAAiBpD,OAAQ,EAC1BoD,EAASh9B,SAASif,GAAS/d,KAAK+7B,YAAYhe,EAAMoW,KACpD,CAEO4H,YAAYhe,EAAYoW,G,cAC7B,IAAIpW,GAAmB,cAAXA,EAAKphB,EAAmB,OAQpC,MAAMq/B,EAAUh8B,KAAKsoB,MAAMvK,EAAKnhB,IAQhC,GAF0B,QAAzB,GAAD,EAACmhB,GAAmB7gB,cAAM,UAANA,OAAW,CAAC,GAE5B6gB,EAAsB7gB,OAAO0jB,UAAmB5lB,IAAZghC,EACtC,OAGY,YAAXje,EAAKphB,QACwB3B,IAA5B+iB,EAAKke,yBACOjhC,IAAZghC,GACCA,EAAyBC,qBAC5Ble,EAAKke,mBAAsBD,EAAyBC,oBAGf,oBAAR,QAA5B,EAACle,EAAsB6a,aAAK,eAAEj8B,WACvBohB,EAAsB6a,MAGhC,MAAMsD,EAAkBl8B,KAAKod,gBAAgB+e,mBAAmBpe,EAAMie,GAOhE/8B,EAAS8e,EAAKnhB,GAAGyC,UAAS,GAChC,QAAerE,IAAZghC,EACDh8B,KAAKsoB,MAAMvK,EAAKnhB,IAAMmhB,MACjB,CACL,MAAMqe,EAAkE,QAApD,EAACJ,EAAsBpD,aAA6B,eAAE37B,SACpEo/B,EAA+D,QAAjD,EAACte,EAAmB6a,aAA6B,eAAE37B,SACjEq/B,EAAgBN,EAAyB9+B,OAAOq/B,QAAWxe,EAAsB7gB,OAAOq/B,MACxFC,EAAeJ,IAAeC,GAAcC,EAE5CG,EAAeT,EAAQvQ,QAAU1N,EAAK0N,OAASyQ,EAE/CQ,EAAmBV,EAAyB9+B,OAAOy/B,WAAc5e,EAAsB7gB,OAAOy/B,UACjGX,EAAyB9+B,OAAO0/B,OAAU7e,EAAsB7gB,OAAO0/B,MACvEZ,EAAyB9+B,OAAO2/B,OAAU9e,EAAsB7gB,OAAO2/B,KAE1EjlB,GAAkBokB,EAASje,GAC3B/d,KAAKmd,UAAUxW,cAAc,cAAeoX,EAAKnhB,IAE9C4/B,GACDx8B,KAAKmd,UAAUxW,cAAc,gBAAiB,CAAC1H,YAG9Cw9B,GAAgBC,IACjB18B,KAAKmd,UAAUxW,cAAc,kBAAmB,CAAC1H,WAGhDq9B,GACDt8B,KAAKmd,UAAUxW,cAAc,oBAAqB,CAACrH,OAAQye,EAAKnhB,GAAIshB,UAAYH,EAAsB7gB,OAAOq/B,O,CAI9Gv8B,KAAK8mB,aAAawU,aAAar8B,IAChCe,KAAKwD,QAAQyE,IAAI,CACf,CAAC8V,EAAKnhB,IAAKmhB,GAGjB,CAEOC,QAAQphB,GACb,OAAOoD,KAAKsoB,MAAM1rB,EACpB,CAUOkgC,UAAUlgC,EAAYgc,EAAoBmkB,EAA6CC,GAC5F,OAAO,EAAAF,GAAA,GAAU98B,KAAKge,QAAQphB,GAAKgc,EAAQmkB,EAAQC,EACrD,CAEOC,4BAA4BrgC,EAAYsgC,GAC7C,MAAMnf,EAAO/d,KAAKge,QAAQphB,GAC1B,OAAGmhB,EAAK6d,uBACH7d,EAAK6d,sBAAsBuB,aAAeD,EAAcC,aAAc,EAAAlnB,EAAA,GAAU8H,EAAK6d,sBAAsB1+B,OAAQggC,EAAchgC,QAC3HyE,QAAQM,UAIZjC,KAAK4T,WAAWC,UAAU,uCAAwC,CACvEgH,KAAM7a,KAAK8a,gBAAgBiW,iBAAiBn0B,EAAGyC,UAAS,IACxD69B,kBACCp4B,KAAK9E,KAAKw7B,cAAcvc,KAAKjf,KAAMpD,GACxC,CAcOmpB,UAAUnpB,GACf,MAAMmhB,EAAO/d,KAAKsoB,MAAM1rB,GACxB,SAAUmhB,GAAoB,YAAXA,EAAKphB,GAA8B,qBAAXohB,EAAKphB,EAClD,CAEOygC,YAAYxgC,G,MAKjB,MAAMmhB,EAAa/d,KAAKsoB,MAAM1rB,GAC9B,SAAuC,QAA9B,EAACmhB,aAAI,EAAJA,EAAuB7gB,cAAM,eAAEmgC,UAC3C,CAEOtd,QAAQnjB,G,MACb,MAAMmhB,EAAO/d,KAAKsoB,MAAM1rB,GACxB,SAAuC,QAA9B,EAACmhB,aAAI,EAAJA,EAAuB7gB,cAAM,eAAEq/B,MAC3C,CAEOrM,YAAYtzB,GACjB,OAAOoD,KAAK+lB,UAAUnpB,KAAQoD,KAAKo9B,YAAYxgC,EACjD,CAEO0gC,SAAS1gC,GACd,IAAI2gC,GAAO,EACX,MAAMxf,EAAa/d,KAAKge,QAAQphB,GAWhC,QAVImhB,GACS,qBAAXA,EAAKphB,GACM,kBAAXohB,EAAKphB,GACiC,cAArCohB,EAA+BphB,GAC/BohB,EAAmB7gB,OAAOuI,MAE1BsY,EAAmB7gB,OAAO6sB,eAC3BwT,GAAO,GAGFA,CACT,CAEO5gB,gBAAgB/f,GACrB,MAAMmhB,EAAa/d,KAAKge,QAAQphB,GAChC,OAAImhB,GAAUA,EAAsBuc,YAK3B,CACL39B,EAAG,eACH4C,WAAY3C,EACZ09B,YAAcvc,EAAsBuc,aAA+C,KAP9E,CACL39B,EAAG,oBAST,CAEO6gC,aAAa5gC,GAClB,OAAOoD,KAAK+lB,UAAUnpB,GAAMoD,KAAKy9B,oBAAoB7gC,GAAMoD,KAAK09B,iBAAiB9gC,EACnF,CAEO8gC,iBAAiB9gC,GACtB,MAAO,CACLD,EAAG,gBACH6C,QAAS5C,EAEb,CAEO6gC,oBAAoB7gC,GACzB,MAAO,CACLD,EAAG,mBACH4C,WAAY3C,EACZ09B,YAAct6B,KAAKge,QAAQphB,GAAqB09B,aAA+C,EAEnG,CAEO5D,QAAQ95B,EAAY+gC,GACzB,MAAM5f,EAAO/d,KAAKsoB,MAAM1rB,GACxB,OAAO,EAAA4mB,GAAA,GAASzF,KAAU4f,IAAc5f,EAAsB7gB,OAAO0jB,IACvE,CAEOgd,cAAchhC,GACnB,MAAMmhB,EAAO/d,KAAKge,QAAQphB,GAC1B,OAAGoD,KAAK+lB,UAAUnpB,IACRoD,KAAKo9B,YAAYxgC,GAAM,IAAM,KAAOA,EAAK,IAAOmhB,EAAsBuc,YAEzE,IAAM19B,CACf,CAsDOihC,cAAcniC,GACnB,OAAOsE,KAAK4T,WAAWC,UAAU,yBAA0BnY,GAASoJ,MAAMmkB,IACxEjpB,KAAKoe,kBAAkBkV,qBAAqBrK,GAEzBA,EAAgBX,MAAM,GAAG1rB,KAGhD,CAEOkhC,gBAAgBlhC,EAAYic,GACjC,MAAMklB,EAAQ/9B,KAAK2c,gBAAgB/f,GAC7BohC,EAAcnlB,EAAQ1U,KAAK85B,GAAMj+B,KAAKod,gBAAgB4d,aAAaiD,KAEzE,OAAOj+B,KAAK4T,WAAWC,UAAU,2BAA4B,CAC3D4I,QAASshB,EACTjlB,MAAOklB,IACNl5B,KAAK9E,KAAKw7B,cAAcvc,KAAKjf,KAAMpD,GACxC,CAEOshC,WAAWzS,EAAe5S,GAC/B,OAAO7Y,KAAK4T,WAAWC,UAAU,sBAAuB,CACtDiF,MAAOD,EAAQ1U,KAAK85B,GAAMj+B,KAAKod,gBAAgB4d,aAAaiD,KAC5DxS,UACC3mB,MAAMmkB,IACPjpB,KAAKoe,kBAAkBkV,qBAAqBrK,GAE5BA,EAAmCX,MAAM,GAAG1rB,KAGhE,CAWOuhC,aAAavhC,GAClB,OAAOoD,KAAK4T,WAAWC,UAAU,wBAAyB,CACxD4I,QAASzc,KAAK2c,gBAAgB/f,KAC7BkI,KAAK9E,KAAKw7B,cAAcvc,KAAKjf,KAAMpD,GACxC,CAEOwhC,YAAYxhC,GACjB,OAAOoD,KAAK4T,WAAWC,UAAU,uBAAwB,CACvD4I,QAASzc,KAAK2c,gBAAgB/f,KAC7BkI,KAAK9E,KAAKw7B,cAAcvc,KAAKjf,KAAMpD,GACxC,CAEOyhC,YAAYzhC,EAAYuC,EAAgBm/B,EAAW,KACxD,OAAOt+B,KAAK4T,WAAWC,UAAU,uBAAwB,CACvDrU,QAAS5C,EACTwC,QAASY,KAAKod,gBAAgB4d,aAAa77B,GAC3Co/B,UAAWD,IACVx5B,KAAK9E,KAAKw7B,cAAcvc,KAAKjf,KAAMpD,GACxC,CAEO4hC,eAAe5hC,EAAYuC,GAChC,OAAOa,KAAK4T,WAAWC,UAAU,0BAA2B,CAC1DrU,QAAS5C,EACTwC,QAASY,KAAKod,gBAAgB4d,aAAa77B,KAC1C2F,KAAK9E,KAAKw7B,cAAcvc,KAAKjf,KAAMpD,GACxC,CAEO6hC,UAAU7hC,GACf,OAAOoD,KAAKw+B,eAAe5hC,EAAIoD,KAAKod,gBAAgBC,UAAUzgB,GAChE,CAEO8hC,MAAM9hC,GACX,OAAOoD,KAAK+lB,UAAUnpB,GAAMoD,KAAKm+B,aAAavhC,GAAMoD,KAAKy+B,UAAU7hC,EACrE,CAEOiH,OAAOjH,GACZ,OAAOoD,KAAK+lB,UAAUnpB,GAAMoD,KAAK2+B,cAAc/hC,GAAMoD,KAAK4+B,WAAWhiC,EACvE,CAEO+hC,cAAc/hC,GACnB,OAAOoD,KAAK4T,WAAWC,UAAU,yBAA0B,CACzD4I,QAASzc,KAAK2c,gBAAgB/f,KAC7BkI,KAAK9E,KAAKw7B,cAAcvc,KAAKjf,KAAMpD,GACxC,CAEOgiC,WAAWhiC,GAEhB,OAAOoD,KAAK4T,WAAWC,UAAU,sBAAuB,CACtDrU,QAAS5C,GAGb,CAEOiiC,YAAYjiC,GACjB,MAAMmhB,EAAa/d,KAAKge,QAAQphB,GAChC,MAAc,YAAXmhB,EAAKphB,EAAwBgF,QAAQM,QAAQ8b,EAAKnhB,IAC9CoD,KAAK4T,WAAWC,UAAU,uBAAwB,CACvDrU,QAAS5C,IACRkI,MAAMmkB,IACPjpB,KAAKw7B,cAAc5+B,EAAIqsB,GACeA,EAA4BA,QAAQzqB,MAAMy/B,GAAc,kBAARA,EAAEthC,IAC1E4C,aAElB,CAEOu/B,eAAeliC,EAAYmiC,EAAkBC,GAClD,MAAMr1B,EAAU3J,KAAK4T,WAAWC,UAAU,0BAA2B,CACnE4I,QAASzc,KAAK2c,gBAAgB/f,GAC9BmiC,aAGF,OAAO/+B,KAAKi/B,wBAAwBriC,EAAI+M,EAASq1B,EACnD,CAEOE,UAAUtiC,EAAYuiC,GAC3B,MAAMC,EAAiC,CACrCziC,EAAG,yBACH0iC,KAAMF,GAGR,IAAIx1B,EAaJ,OAXEA,EADC3J,KAAK+lB,UAAUnpB,GACNoD,KAAK4T,WAAWC,UAAU,qBAAsB,CACxD4I,QAASzc,KAAK2c,gBAAgB/f,GAC9Bg8B,MAAOwG,IAGCp/B,KAAK4T,WAAWC,UAAU,yBAA0B,CAC5DrU,QAAS5C,EACTg8B,MAAOwG,IAIJz1B,EAAQ7E,KAAK9E,KAAKw7B,cAAcvc,KAAKjf,KAAMpD,GACpD,CAEO0iC,UAAU1iC,EAAY6uB,GAC3B,IAAI9hB,EAcJ,OAXEA,EADC3J,KAAK+lB,UAAUnpB,GACNoD,KAAK4T,WAAWC,UAAU,qBAAsB,CACxD4I,QAASzc,KAAK2c,gBAAgB/f,GAC9B6uB,UAGQzrB,KAAK4T,WAAWC,UAAU,yBAA0B,CAC5DrU,QAAS5C,EACT6uB,UAIG9hB,EAAQ7E,KAAK9E,KAAKw7B,cAAcvc,KAAKjf,KAAMpD,GACpD,CAEO2iC,UAAU3iC,EAAY4iC,GAC3B,MAAMvgC,EAASrC,EAAGyC,UAAS,GAC3B,OAAOW,KAAK4T,WAAWC,UAAU,yBAA0B,CACzDgH,KAAM7a,KAAK8a,gBAAgBiW,iBAAiB9xB,GAC5CugC,UACC16B,MAAMssB,IACJA,GACDpxB,KAAKmd,UAAUxW,cAAc,gBAAiB1H,GAGzCmyB,IAEX,CAEOqO,WAAW7iC,EAAY8iC,EAA0CxC,GACtE,MAAMj+B,EAAiC,iBAAlB,EAA6BygC,GAAc,EAAAC,GAAA,GAAqBD,GACrF,OAAO1/B,KAAK4T,WAAWC,UAAU,sBAAuB,CACtD4I,QAASzc,KAAK2c,gBAAgB/f,GAC9B8iC,YAAa1/B,KAAK8a,gBAAgBiW,iBAAiB9xB,GACnDi+B,kBACCp4B,MAAMmkB,IAGP,GAFAjpB,KAAKw7B,cAAc5+B,EAAIqsB,GAEI,iBAAlB,EAA4B,CACnC,MAAM2W,EAAYrxB,KAAK1J,MAAQ,IAAO,EACtC7E,KAAKoe,kBAAkBiX,mBAAmB,CACxC14B,EAAG,2BACH4C,WAAY3C,EACZ6mB,KAAMmc,EACNC,cAAU7kC,EACVw6B,SAAKx6B,EACLoE,QAASH,EACT6gC,iBAAkBJ,EAClBK,gBAAiB9lC,OAAOgZ,KAAKiqB,EAAchgC,QAAQT,OAAS,CAC1DE,EAAG,2BACH8mB,KAAMmc,EACN1C,gBACA8C,UAAWhgC,KAAKod,gBAAgBC,UAAUzgB,GAC1Cie,KAAM7a,KAAK8a,gBAAgB4O,cAAczqB,GACzC/B,OAAQ,CAAC,QACPlC,G,IAIZ,CAEOilC,oCAAoCrjC,EAAY8iC,GACrD,OAAO1/B,KAAKy/B,WAAW7iC,EAAI8iC,EAAa,CACtC/iC,EAAG,mBACHwgC,WAAY,EACZjgC,OAAQ,CAAC,GAEb,CAEOgjC,gBAAgBtjC,EAAY8iC,GACjC,OAAO1/B,KAAKy/B,WAAW7iC,EAAI8iC,EAAa,CACtC/iC,EAAG,mBACHwgC,WAAY,EACZjgC,OAAQ,CACNijC,eAAe,IAGrB,CAEOC,aAAaxjC,EAAY8iC,GAC9B,OAAG1/B,KAAK+lB,UAAUnpB,GAAYoD,KAAKkgC,gBAAgBtjC,EAAI8iC,GAC3C1/B,KAAKw+B,eAAe5hC,EAAK8iC,EAAuBrP,WAC9D,CAEOgQ,eAAezjC,GACpB,OAAOoD,KAAK4T,WAAWke,gBAAgB,uBAAwB,CAC7Dl1B,GAAI,CAAC,CACHD,EAAG,eACH4C,WAAY3C,EACZ09B,YAAa,QAEdx1B,MAAMw7B,IACPtgC,KAAKqoB,aAAaiY,EAAchY,MAAM,GAE1C,CAEOiY,uBAAuB3jC,EAAYshB,GACxC,OAAOle,KAAK6+B,YAAYjiC,GAAIkI,MAAMghB,GACzB9lB,KAAK4T,WAAWC,UAAU,kCAAmC,CAClE4I,QAASzc,KAAK2c,gBAAgBmJ,GAC9B5H,YACCpZ,KAAK9E,KAAKw7B,cAAcvc,KAAKjf,KAAM8lB,KAE1C,CAEO0a,iBAAiB5jC,EAAYshB,GAClC,OAAOle,KAAK4T,WAAWC,UAAU,4BAA6B,CAC5D4I,QAASzc,KAAK2c,gBAAgB/f,GAC9BshB,YACCpZ,KAAK9E,KAAKw7B,cAAcvc,KAAKjf,KAAMpD,GACxC,CAEO6jC,iBAAiB7jC,EAAYshB,GAClC,OAAOle,KAAK4T,WAAWC,UAAU,4BAA6B,CAC5DgH,KAAM7a,KAAKw9B,aAAa5gC,GACxBshB,YACCpZ,KAAK9E,KAAKw7B,cAAcvc,KAAKjf,KAAMpD,GACxC,CAEO8jC,0BAA0B9jC,EAAY+jC,GAC3C,MAAMC,EAAW5gC,KAAK6W,kBAAkBgqB,kBAAkBjkC,GAM1D,OALGgkC,IACDA,EAASE,oBAAsBH,EAC/B3gC,KAAKmd,UAAUxW,cAAc,mBAAoB/J,IAG5CoD,KAAK4T,WAAWC,UAAU,qCAAsC,CACrEgH,KAAM7a,KAAKw9B,aAAa5gC,GACxBkkC,oBAAqBH,IACpB77B,KAAK9E,KAAKw7B,cAAcvc,KAAKjf,KAAMpD,GACxC,CAEOmkC,UAAUjb,GACf,OAAO9lB,KAAK4T,WAAWotB,uBAAuB,CAC5Cl4B,OAAQ,qBACRmL,OAAQ,CACN4G,KAAM7a,KAAKy9B,oBAAoB3X,IAEjCmb,cAAgBC,IACdlhC,KAAKod,gBAAgBgL,aAAa8Y,EAAYpoB,OAC9C9Y,KAAKqoB,aAAa6Y,EAAY5Y,OAEvB4Y,EAAY3P,QAGzB,CAEO4P,iBAAiBC,GACtB,OAAOphC,KAAK4T,WAAWC,UAAU,4BAA6B,CAACutB,SAC9Dt8B,MAAMmkB,IACLjpB,KAAKoe,kBAAkBkV,qBAAqBrK,GAC9BA,EAA4BX,MAAM,GACpC1rB,KAEhB,CAEOykC,cAAc/hC,EAAgBy/B,GACnC,OAAO/+B,KAAK4T,WAAWC,UAAU,yBAA0B,CACzD4I,QAASzc,KAAK2c,gBAAgBrd,GAC9By/B,YAEJ,CAEOuC,oBAAoBhiC,GAuFzB,OAJgBU,KAAK4T,WAAW2tB,mBAAmB,gCAAiC,CAClF9kB,QAASzc,KAAK2c,gBAAgBrd,IAC7B,CAACkiC,aAAc,MAEH18B,MAAM28B,IACnB,GAA2B,+BAAxBA,EAAkB9kC,EAAoC,CACvDqD,KAAKod,gBAAgBgL,aAAaqZ,EAAkB3oB,OACpD9Y,KAAK0c,gBAAgB2L,aAAaoZ,EAAkBnZ,OAEpD,MAAMoZ,EAAmBD,EAAkBlZ,SAASra,QACpDuzB,EAAkBlZ,SAASjoB,KAAKohC,E,CAGlC,OAAOD,CAAiB,GAE5B,CAEOE,qBAAqBriC,EAAgBsiC,GAC1C,OAAO5hC,KAAK4T,WAAWke,gBAAgB,gCAAiC,CACtErV,QAASzc,KAAK2c,gBAAgBrd,GAC9B27B,UAAW2G,GAEf,CAEOC,gBAAgBT,GACrB,OAAOphC,KAAK4T,WAAWC,UAAU,2BAA4B,CAC3DutB,KAAMA,IACLt8B,MAAMg9B,IACHA,EAAyC/jB,MAC3C/d,KAAK+7B,YAAa+F,EAAyC/jB,MAAM,GAG5D+jB,IAEX,CAEOC,eAAeziC,EAAgBy/B,EAAkBiD,GACtD,MAAMr4B,EAAU3J,KAAK4T,WAAWC,UAAU,0BAA2B,CACnE4I,QAASzc,KAAK2c,gBAAgBrd,GAC9By/B,WACAiD,WAGF,OAAOhiC,KAAKi/B,wBAAwB3/B,EAAQqK,EAC9C,CAEOs4B,iBAAiB3iC,EAAgB0c,GACtC,MAAMrS,EAAU3J,KAAK4T,WAAWC,UAAU,4BAA6B,CACrE4I,QAASzc,KAAK2c,gBAAgBrd,GAC9B0c,UAGF,OAAOhc,KAAKi/B,wBAAwB3/B,EAAQqK,EAC9C,CAEOu4B,uBAAuB5iC,EAAgB0/B,GAC5C,MAAMr1B,EAAU3J,KAAK4T,WAAWC,UAAU,kCAAmC,CAC3E4I,QAASzc,KAAK2c,gBAAgBrd,KAGhC,OAAOU,KAAKi/B,wBAAwB3/B,EAAQqK,EAASq1B,EACvD,CAEOmD,mBAAmB7iC,GACxB,MAAM4E,EAA+B,CACnClE,KAAK8+B,eAAex/B,EAAQ,IAAI,GAChCU,KAAKkiC,uBAAuB5iC,GAAQ,IAGhCqK,EAAUhI,QAAQ0Q,IAAInO,GAAUY,MAAK,KAAM,IACjD,OAAO9E,KAAKi/B,wBAAwB3/B,EAAQqK,EAC9C,CAEOs1B,wBAAgD3/B,EAAgBqK,EAAYq1B,GACjF,OAAGA,EACMr1B,EAGFA,EAAQ7E,MAAMT,GACZrE,KAAKoiC,YAAY,CAAC9iC,IAASwF,MAAK,IAAMT,KAEjD,CAEO+9B,YAAYppB,GACjB,OAAOhZ,KAAK4T,WAAWC,UAAU,uBAAwB,CACvDjX,GAAIoc,EAAQ7U,KAAK7E,GAAWU,KAAK2c,gBAAgBrd,OAChDwF,MAAMw7B,IACPtgC,KAAKqoB,aAAaiY,EAAchY,MAAM,GAE1C,CAEO+Z,YAAY/iC,EAAgB4e,GACjC,OAAOle,KAAK6+B,YAAYv/B,GAAQwF,MAAMghB,GAC7B9lB,KAAK4T,WAAWC,UAAU,uBAAwB,CACvD4I,QAASzc,KAAK2c,gBAAgBmJ,GAC9B5H,YACCpZ,KAAK9E,KAAKw7B,cAAcvc,KAAKjf,KAAM8lB,KAE1C,CAEOwc,eAAe5mC,GAQpB,MAAM,OAAC4D,EAAM,QAAEmc,EAAO,MAAEgQ,EAAK,YAAE8W,EAAW,OAAEC,EAAM,OAAE7gB,GAAUjmB,EAC9D,OAAOsE,KAAK4T,WAAWC,UAAU,0BAA2B,CAC1D4I,QAASzc,KAAK2c,gBAAgBrd,GAC9Bqc,UAAU,EAAA0D,GAAA,GAAmB5D,GAC7BgQ,QACAF,cAAegX,EACfC,SACA7gB,WACC7c,KAAK9E,KAAKw7B,cAAcvc,KAAKjf,KAAMV,GACxC,CAEamjC,iBAAiB/mC,G,qCAM5B,MAAM,OAAC4D,EAAM,MAAEmsB,EAAK,UAAEiX,EAAS,YAAEH,GAAe7mC,EAE1CinC,QAAoB3iC,KAAK6W,kBAAkB+rB,eAAetjC,GAC1DujC,EAAkBF,EAAYG,iBAAmB9iC,KAAK8a,gBAAgBiW,iBAAiB/wB,KAAK8a,gBAAgB9b,UAAU2jC,EAAYG,kBAExI,OAAO9iC,KAAK4T,WAAWC,UAAU,4BAA6B,CAC5D4I,QAASzc,KAAK2c,gBAAgBrd,GAC9BmsB,QACAsX,WAAYL,EACZnX,cAAegX,EACftH,WAAW,UACX+H,QAASH,IACR/9B,MAAMmkB,IACPjpB,KAAKw7B,cAAcl8B,EAAQ2pB,GAE3B,MAAMxO,EAAUwO,EAA4BA,QAAQzqB,MAAMic,GAAwB,4BAAbA,EAAO9d,IAC5E,OAAO,EAAA+e,GAAA,GAAkBjB,EAAO5Y,QAAQjF,GAAG,GAE/C,E,+RAEOqmC,uBAAuB3jC,EAAgBmc,EAAiBT,GAC7D,OAAOhb,KAAK4T,WAAWC,UAAU,kCAAmC,CAClE4I,QAASzc,KAAK2c,gBAAgBrd,GAC9Bqc,UAAU,EAAA0D,GAAA,GAAmB5D,GAC7BT,WACClW,KAAK9E,KAAKw7B,cAAcvc,KAAKjf,KAAMV,GACxC,E,YC5zBQ,G,4CCjEK,SAAS4jC,GAAQxlC,EAAaylC,IACvC,EAAAC,GAAA,GAAiB1lC,KACnBA,EAAM,WAAaA,GAGrB,MAAMksB,EAAgF,CAAClsB,OACvF,IAAI2lC,EAAWC,EAAgBC,EAC3BC,EAGM,GAAIH,EAAY3lC,EAAI5C,MAAM,+EAAiF,CACnH,MAAMmjC,EAAI,IAAI9E,IAAIz7B,GAClB,IAAI+lC,EAASJ,EAAU,GACpBI,GAAU,SAAkBJ,EAAU,MACvCI,OAASzoC,GAGRyoC,IACDxF,EAAEyF,SAAWD,GAAyB,MAAfxF,EAAEyF,SAAmB,GAAKzF,EAAEyF,WAGrD,MAAMC,EAAW1F,EAAEyF,SAASj8B,MAAM,GAC5BqI,EAAO6zB,EAAS/jC,MAAM,KAE5B,GAAGkQ,EAAK,IAAqB,MAAfA,EAAK,GAAG,IAAcA,EAAK,GAAGrT,OAAS,EACnD+mC,EAAU,eACL,GAAG,MAAM9oC,KAAKipC,KAAc,WAA0BA,GAC3DH,EAAU,gBACL,OAAO1zB,EAAK,IACjB,IAAK,WACL,IAAK,cACL,IAAK,WACL,IAAK,YACL,IAAK,UACH,GAAmB,IAAhBA,EAAKrT,SAAiBgnC,EAAQ,CAC/BD,EAAU1zB,EAAK,GACf,K,CAGJ,QACE,GAAIA,EAAK,IAAMA,EAAK,GAAGhV,MAAM,uCAA0D,IAAhBgV,EAAKrT,OAAc,CACxF+mC,EAAU,KACV,K,QAKGF,EAAiB5lC,EAAI5C,MAAM,kDACpC0oC,EAAU,MACDD,EAAU7lC,EAAI5C,MAAM,gCAC7B0oC,EAAU,MAAQD,EAAQ,IAU5B,OALK3pC,OAAe4pC,KAClBA,OAAUxoC,GAGZ4uB,EAAI4Z,QAAUA,EACP5Z,CACT,CAEA,OAAmB,aAAyBsZ,IDE5C,SAAUU,GAGR,IAAIC,EAEAC,EAYJ,SAASC,EAAY1M,GACnB,EAAA2M,sBAAwB3M,EACxB,EAAA4M,gCAAkC5M,EAASz3B,MAAM,KAAK,EACxD,CA2BA,SAASskC,IACP,GAAkB,QAAf,EAAAC,WACD,IACE,MAAMC,EAAiBC,EAAkB,CAACC,KAAM,UAAWC,OAAQ,UAAWC,QAAQ,IAChF/gB,EAAO,IAAIlV,KACjBkV,EAAKghB,SAAS,GACd,MAAMC,EAASN,EAAeO,OAAOlhB,GACrC,EAAAmhB,UAAUC,GAAKH,EAAO9kC,MAAM,MAAM,GAClC6jB,EAAKghB,SAAS,IACd,MAAMK,EAASV,EAAeO,OAAOlhB,GACrC,EAAAmhB,UAAUG,GAAKD,EAAOllC,MAAM,MAAM,E,CAClC,MAAM0J,GACN3L,QAAQC,MAAM,mBAAoB0L,GAClC,EAAAs7B,UAAY,CAACC,GAAI,KAAME,GAAI,K,CAGjC,CAuBA,SAAgBC,IACd,MAAMC,EAAc,iBAEpB,OADAlB,EAAYkB,GACLtjC,QAAQ0Q,IAAI,CACjB,8BACA,8BACA,8BACCvN,MAAK,EAAE+yB,EAAMqN,EAAUC,MACxB,MAAMC,EAA4B,GAalC,OAZAC,EAAmBxN,EAAKyN,QAASF,GACjCC,EAAmBH,EAASI,QAASF,GAW9BG,EAT8B,CACnC5oC,EAAG,qBACH6oC,aAAc,EACdC,UAAWR,EACXG,UACAprC,QAAS,EACT0rC,OAAO,EACPP,UAAWA,EAAUG,SAEM,GAEjC,CAEA,SAAgBK,EAAatO,EAAkBuO,GAE7C,EAAAC,yBAA0B,EAC1B,MAAMjzB,EAAW,WACjB,OAAOjR,QAAQ0Q,IAAI,CACjBO,EAASgB,WAAW2tB,mBAAmB,uBAAwB,CAC7DkE,UAAWpO,EACXyO,UAAiB,SAEnB,EAIA,8BACA,8BACAlzB,EAASgB,WAAW2tB,mBAAmB,wBAAyB,CAC9DkE,UAAWpO,EACX+J,KAAM,IAER,EAAA2E,iBAEJ,CAUA,SAAgBV,EAAmBD,EAAcY,EAA2B,IAC1E,IAAI,MAAMrgC,KAAKy/B,EAAS,CAEtB,MAAM5X,EAAI4X,EAAQz/B,GACD,iBAAR,EACPqgC,EAAO1lC,KAAK,CACV3D,EAAG,iBACH0K,IAAK1B,EACLtB,MAAOmpB,IAGTwY,EAAO1lC,KAAK,OAAD,QACT3D,EAAG,2BACH0K,IAAK1B,GACF6nB,G,CAKT,OAAOwY,CACT,CAmBA,SAAgBT,EAAaU,GAG3B,OAFAA,EAASC,WAAa,oBAEfh/B,EAAA,MAAiB,CAAC++B,aAAWnhC,MAAK,KACvCqhC,EAAcF,GACPA,IAEX,CAYA,SAAgBE,EAAcF,GAC5B,MAAMG,EAAkB,EAAApC,sBACxB,GAAGiC,EAASR,YAAcW,EAA1B,CAIA,IACEvC,EAAc,IAAIwC,KAAKC,YAAY,EAAArC,gC,CACnC,MAAM36B,GACN3L,QAAQC,MAAM,oBAAqB0L,GACnCu6B,EAAc,IAAIwC,KAAKC,YAAY,EAAArC,gCAAgCrkC,MAAM,IAAK,GAAG,G,CAGnF,IACEikC,EAAc,IAAIwC,KAAKC,YAAYL,EAASR,U,CAC5C,MAAMn8B,GACN3L,QAAQC,MAAM,oBAAqB0L,GACnCu6B,EAAc,IAAIwC,KAAKC,YAAYL,EAASR,UAAU7lC,MAAM,IAAK,GAAG,G,CAGtE,EAAAwlC,QAAQvmC,QAER,IAAI,MAAM0nC,KAAUN,EAASb,QAC3B,EAAAA,QAAQn9B,IAAIs+B,EAAOl/B,IAAoBk/B,GAGtCN,EAASd,YACV,EAAAqB,cAAc/pC,OAAS,EACvB,EAAA+pC,cAAclmC,QAAQ2lC,EAASd,UAAUA,WAEzCc,EAASd,UAAUA,UAAUrmC,SAAS2nC,IACpC,GAAGA,EAAQxmC,KAAM,CACf,MAAMymC,EAAmBD,EAAQE,aACjC,EAAAvB,QAAQn9B,IAAIy+B,EAAa,CACvB/pC,EAAG,iBACH0K,IAAKq/B,EACLriC,MAAOoiC,EAAQxmC,M,MAMpB,EAAA2mC,sBAAwBR,IACzB,gBAAwB,kBAAmBA,GAC3C,EAAAQ,oBAAsBR,EACtBS,EAAsBhoC,QACtBqlC,KAGepjC,MAAMC,KAAK+lC,SAASC,iBAAiB,UAC7CjoC,SAASkoC,IAChB,MAAM1jC,EAAW,EAAA2jC,QAAQziC,IAAIwiC,GAE1B1jC,GACDA,EAASmX,Q,IAGf,CAWA,SAAgBysB,EAAenJ,EAAen3B,EAA2BugC,EAAc,CAACxhC,EAAG,IACzF,MAAMikB,EAAyC,GAG/C,IAAIwd,EAAY,EA8DhB,OA7DArJ,EAAMhiC,QAHS,0DAGO,CAACjB,EAAOusC,EAASC,EAASC,EAASC,EAAYlb,EAAgBia,KAKnF,GAFA3c,EAAItpB,KAAKimC,EAAO9+B,MAAM2/B,EAAW9a,IAE9B+a,EAAI,CAEL,IAAIL,EACJ,OAAOK,GACL,IAAK,KACHL,EAAUF,SAASW,cAAc,KACjC,MAGF,IAAK,KACHT,EAAUF,SAASW,cAAc,KAKrCT,EAAQU,UAAUR,EAAeI,EAAI1gC,EAAMugC,IAC3Cvd,EAAItpB,KAAK0mC,E,MACJ,GAAGO,EACR3d,EAAItpB,KAAKwmC,SAASW,cAAc,YAC3B,GAAGD,EAAI,CACZ,MAAMljC,EAAMkjC,EAAGG,YAAY,KACrBtsC,EAAOmsC,EAAG//B,MAAM,EAAGnD,GAEnB5G,EAAM8pC,EAAG//B,MAAMnD,EAAM,EAAGkjC,EAAG/qC,OAAS,GAC1C,IAAIqkB,EACJ,GAAGpjB,IAAO,EAAA0lC,GAAA,GAAiB1lC,GAAM,CAC/BojB,EAAIgmB,SAASW,cAAc,KAC3B,MAAMG,EAAa1E,GAAQxlC,GAC3BojB,EAAE+mB,KAAOD,EAAWlqC,IACjBkqC,EAAWpE,SAAS1iB,EAAEgnB,aAAa,UAAWF,EAAWpE,SAC5D1iB,EAAEpe,OAAS,Q,MAEXoe,EAAIla,EAAKugC,EAAYxhC,KAElBmb,aAAainB,mBACdjnB,EAAIA,EAAEknB,YAGRlnB,EAAEmnB,YAAc,GAGlBnnB,EAAE4mB,UAAUR,EAAe7rC,EAAMuL,EAAMugC,IAEvCvd,EAAItpB,KAAKwgB,E,MACDla,GA/Dd,SAA0BgjB,EAAwChjB,EAA0BugC,GAC1F,MAAMe,EAAMthC,EAAKugC,EAAYxhC,KAC1B7E,MAAMiD,QAAQmkC,GACfte,EAAItpB,QAAQ4nC,GAEZte,EAAItpB,KAAK4nC,EAEb,CAyDMC,CAAiBve,EAAKhjB,EAAMugC,GAI9B,OADAC,EAAY9a,EAASxxB,EAAM2B,OACpB,EAAE,IAGR2qC,IAAcrJ,EAAMthC,QACrBmtB,EAAItpB,KAAKy9B,EAAMt2B,MAAM2/B,IAGhBxd,CACT,CAIA,SAAgB+a,EAAOt9B,EAAkB+gC,GAAQ,EAAOxhC,GACtD,MAAMlK,EAAM,EAAA0oC,QAAQ5gC,IAAI6C,GACxB,IAAI02B,EACJ,GAAGrhC,EACD,GAAa,6BAAVA,EAAIC,IAAoCiK,aAAI,EAAJA,EAAMnK,QAAQ,CACvD,IAAI+wB,EAAI5mB,EAAK,GACI,iBAAR,IAAkB4mB,GAAKA,EAAEzxB,QAAQ,MAAO,KAGjDgiC,EAAQrhC,EAFEmnC,EAAYwE,OAAO7a,GAEb,WAAa9wB,EAAiB,W,MAE9CqhC,EADkB,mBAAVrhC,EAAIC,EACJD,EAAI2H,MAGJgD,OAIV02B,EAAQ12B,EAGV,MAAMjF,EAAS8kC,EAAenJ,EAAOn3B,GACrC,OAAGwhC,EACMhmC,EAAO+B,KAAKmkC,GAASA,aAAgBC,KAAOD,EAAKL,YAAcK,IAAMtrC,KAAK,IAE1EoF,CAgBX,CA3Xa,EAAAgjC,QAA4C,IAAI5zB,IAChD,EAAAg1B,cAA+B,GAOjC,EAAAX,yBAA0B,EAE1B,EAAA2C,OAAQ,EAEH,EAAAC,OAAhB,SAAuBC,GACrB,EAAAF,MAAQE,CACV,EAOgB,EAAAC,iBAAhB,WACE,OAAG7E,IACIA,EAAuBniC,QAAQ0Q,IAAI,CACxCnL,EAAA,MAAiB,YACjB,EAAA6+B,kBACCjhC,MAAK,EAAEmhC,KACJA,GAEM,KAMN,EAAAjC,uBACFD,EAAYkC,EAASR,WAGvBU,EAAcF,GACPA,GAZEjB,MAaR4D,SAAQ,KACT9E,OAAuB9oC,CAAS,IAEpC,EAoBgB,EAAA6tC,cAAhB,SACElE,EACAmE,IAAiB,EAAA3E,YAAc,EAAAA,aAAeQ,GAE9C,EAAAR,WAAaQ,EAEbT,IAEG4E,IACDjC,EAAsBhoC,QACLiC,MAAMC,KAAK+lC,SAASC,iBAAiB,UAC7CjoC,SAASkoC,IAChB,MAAM1jC,EAAW,EAAA2jC,QAAQziC,IAAIwiC,GAE1B1jC,aAAoBylC,GACrBzlC,EAASmX,Q,IAIjB,EAEgB,EAAAuqB,kBAAiB,EAyBjB,EAAAW,aAAY,EAuBZ,EAAAqD,WAAhB,SAA2B3R,EAAkB+N,GAC3C,OAAO,gCAAwC,sBAAuB,CACpEU,UAAW,aACXL,UAAWpO,EACXpkB,KAAMmyB,GAEV,EAEgB,EAAAC,mBAAkB,EAsBlB,EAAA4D,YAAhB,SAA4B5R,EAAkBuO,GAE5C,OADA7B,EAAY1M,GACLsO,EAAatO,GAAevyB,MAAK,EAAEokC,EAAWC,EAAWC,EAAgBC,EAAgBlE,EAAWxoC,MACzG,IAAIyoC,EAA4B,GAUhC,MARA,CAACgE,EAAgBC,GAAgBvqC,SAASwqC,IACxCjE,EAAmBiE,EAAEhE,QAAgBF,EAAQ,IAG/CA,EAAUA,EAAQphC,UAAU,CAACklC,EAAU9D,QAAS+D,EAAU/D,SAAStoC,OAAOC,UAE1EmsC,EAAU9D,QAAUA,EACpB8D,EAAU/D,UAAYA,EACfI,EAAa2D,EAAU,GAElC,EAEgB,EAAA3D,aAAY,EASf,EAAAQ,gBACS,oBAAX,WAAuD,IAAtBM,KAAgB,YACjD1kC,QAAQM,UAER,8BAA2B6C,MAAMykC,IACrC3vC,OAAeysC,KAAOpsC,OAAOC,OAAwB,oBAAX,KAAyBmsC,KAAO,CAAC,EAAGkD,EAAMjE,QAAQ,IAKnF,EAAAa,cAAa,EAoEb,EAAAe,eAAc,EAuEd,EAAAvC,OAAM,EA2CT,EAAAsC,QAAyE,IAAIuC,QAO1F,MAAeC,EAIb3pC,YAAYpE,GACVsE,KAAKgnC,SAAUtrC,aAAO,EAAPA,EAASsrC,UAAWF,SAASW,cAAc,QAC1DznC,KAAKgnC,QAAQ0C,UAAU3qC,IAAI,QAE3BiB,KAAK2pC,SAAWjuC,aAAO,EAAPA,EAASiuC,SACtBjuC,IAAaA,EAAsC2L,KAAQ3L,EAA0C+nB,OACtGzjB,KAAKya,OAAO/e,GAGd,EAAAurC,QAAQh/B,IAAIjI,KAAKgnC,QAAShnC,KAC5B,EASF,MAAa4pC,UAAoBH,EAI/B3pC,YAAYpE,EAA8B,CAAC,G,MACzCwK,MAAM,OAAD,wBAAKxK,GAAO,CAAEiuC,SAA0B,QAAhB,EAAAjuC,EAAQiuC,gBAAQ,QAAI,cACnD,CAEOlvB,OAAO/e,GAGZ,IAFA,EAAAmuC,GAAA,GAAW7pC,KAAMtE,GAEI,cAAlBsE,KAAK2pC,SACN3pC,KAAKgnC,QAAQiB,YAAc,GAC3BjoC,KAAKgnC,QAAQU,UAAU/C,EAAO3kC,KAAKqH,KAAK,EAAOrH,KAAK4G,WAC/C,CAEL,MAAM4mB,EAAIxtB,KAAKgnC,QAAQhnC,KAAK2pC,UACtBG,EAAYnF,EAAO3kC,KAAKqH,KAAK,EAAMrH,KAAK4G,WAGrC5L,IAANwyB,EAAiBxtB,KAAKgnC,QAAQ+C,QAAQ/pC,KAAK2pC,UAAYG,EACpD9pC,KAAKgnC,QAA6BhnC,KAAK2pC,UAAYG,C,CAE7D,CAEOE,iBAAiBtuC,GACtB,GAAGsE,KAAKqH,MAAQ3L,EAAQ2L,OAAO,EAAA4O,EAAA,GAAUjW,KAAK4G,KAAMlL,EAAQkL,MAI5D,OAAO5G,KAAKya,OAAO/e,EACrB,EA/BW,EAAAkuC,YAAW,EAkCxB,MAAM/C,EAA0D,IAAIr1B,IACpE,SAAS6yB,EAAkB3oC,EAAsC,CAAC,GAChE,MAAMuuC,EAAOhsC,KAAKC,UAAUxC,GAC5B,IAAI0oC,EAAiByC,EAAsBriC,IAAIylC,GAM/C,OALI7F,IACFA,EAAiB,IAAIiC,KAAK6D,eAAe,EAAAjG,gCAAkC,SAAW,EAAAE,WAAYzoC,GAClGmrC,EAAsB5+B,IAAIgiC,EAAM7F,IAG3BA,CACT,CAEW,EAAAQ,UAAY,CAACC,GAAI,KAAME,GAAI,MAKtC,MAAagE,UAAwBU,EAInC3pC,YAAYpE,G,MACVwK,MAAM,OAAD,wBAAKxK,GAAO,CAAEiuC,SAA0B,QAAhB,EAAAjuC,EAAQiuC,gBAAQ,QAAI,iBACpC3pC,KAAKgnC,QE9gBjBc,aAAa,MAAO,OF+gBvB,CAEOrtB,OAAO/e,GAGZ,IAAIL,EACJ,IAHA,EAAAwuC,GAAA,GAAW7pC,KAAMtE,GAGdsE,KAAKtE,QAAQ4oC,MAAQtkC,KAAKtE,QAAQ6oC,QAA+C,IAArCtqC,OAAOgZ,KAAKjT,KAAKtE,SAASe,OAA6B,CACpG,MAAM0tC,EAAQnqC,KAAKyjB,KAAK2mB,WACxB/uC,GAAQ,KAAsB,QAAf,EAAA8oC,WAAwBgG,EAAQ,IAAO,GAAKA,IAAQ1iC,OAAO,GAAK,KAAO,IAAMzH,KAAKyjB,KAAK4mB,cAAc5iC,OAAO,GAKzG,QAAf,EAAA08B,aACD9oC,GAAQ,KAAO8uC,EAAQ,GAAK,EAAAvF,UAAUC,GAAK,EAAAD,UAAUG,I,KAElD,CAEL,MAAMX,EAAiBC,EAAkBrkC,KAAKtE,SAC9CL,GAAO,EAAAivC,GAAA,GAAsBlG,EAAeO,OAAO3kC,KAAKyjB,M,CAGzDzjB,KAAKgnC,QAAgBhnC,KAAK2pC,UAAYtuC,CACzC,EA9BW,EAAA0tC,gBAAe,EAiCZ,EAAAwB,KAAhB,SAAqBljC,EAAkBT,GACrC,OAAO,IAAIgjC,EAAY,CAACviC,MAAKT,SAAOogC,OACtC,EAEgB,EAAAwD,MAAhB,SAAsB9uC,GACpB,OAAO,IAAIkuC,EAAYluC,GAASsrC,OAClC,EAEgB,EAAAyD,MAAhB,SAAsBzD,EAAsB3/B,EAAkBT,EAA2B+iC,GACvF,OAAO,IAAIC,EAAY,CAAC5C,UAAS3/B,MAAKT,OAAM+iC,aAAW3C,OACzD,CACD,CA3fD,CAAU,QAAI,KA8fd,YAEa,GAAKuD,KAGJ,GAAKC,MAGL,GAAKC,MA2BnB,UAAsB,GGrmBf,MAAMC,GAAS,CAAC,UAAW,WAAY,QAAS,QAAS,MAAO,OAAQ,OAAQ,SAAU,YAAa,UAAW,WAAY,YACxHC,GAAO,CAAC,SAAU,SAAU,UAAW,YAAa,WAAY,SAAU,YAK1EC,GAAiBnnB,IAC5B,MAAMrH,EAAI,IAAI7N,KAAKA,KAAKs8B,IAAIpnB,EAAKqnB,cAAernB,EAAKsnB,WAAYtnB,EAAKunB,YAChEC,EAAS7uB,EAAE8uB,aAAe,EAChC9uB,EAAE+uB,WAAW/uB,EAAEgvB,aAAe,EAAIH,GAClC,MAAMI,EAAY,IAAI98B,KAAKA,KAAKs8B,IAAIzuB,EAAEkvB,iBAAkB,EAAG,IAC3D,OAAO3qB,KAAK4qB,OAAQnvB,EAAEovB,UAAYH,EAAUG,WARvB,MAQ+C,GAAK,EAAE,EAyF7E,OAAmB,mCAtFZ,SAAuCl9B,GAC5C,MAAMm9B,EAAQ,IAAIl9B,KACZ1J,EAAM4mC,EAAMD,UAAY,IAAO,EAC/B5L,EAAYtxB,EAAKk9B,UAAY,IAAO,EAEpC9vC,EAAsC,CAAC,EAa7C,OAZImJ,EAAM+6B,EAjBW,OAiBa6L,EAAMT,YAAc18B,EAAK08B,UACzDtvC,EAAQ4oC,KAAO5oC,EAAQ6oC,OAAS,UACxBkH,EAAMX,gBAAkBx8B,EAAKw8B,eACrCpvC,EAAQgwC,KAAOhwC,EAAQiwC,IAAM,UAC7BjwC,EAAQkwC,MAAQ,WACP/mC,EAAM+6B,EAAa,QAAiBgL,GAAca,KAAWb,GAAct8B,GACpF5S,EAAQmwC,QAAU,SAElBnwC,EAAQkwC,MAAQ,QAChBlwC,EAAQiwC,IAAM,WAGT,IAAI,mBAAqB,CAC9BloB,KAAMnV,EACN5S,YACCsrC,OACL,GAkEO,MAgBD8E,GAAU,KACVC,GAAc,IAAIC,OAAO,gBACzBC,GAAwB,IAAID,OAAO,yBAA0B,KAC7DE,GAA2B,IAAIF,OAAO,yBAA0B,KAChEG,GAAY,IAAIH,OAAO,0CAA2C,KAClEI,GAAW,IAAIJ,OAAO,mEAAoE,KAC1FK,GAAwB,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAgO3E,SAASC,GAAmBC,EAAmBX,EAAeY,GAC5D,MAAMC,GAAc,IAAIl+B,MAAOu8B,cACzBW,EAAQl9B,KAAK1J,MACnB,GAAG2nC,GAAgBV,IAAWU,GAAgBC,EAAa,CACzD,MAAMhpB,EAAO,IAAIlV,KACjBkV,EAAKipB,YAAYF,EAAcZ,EAAO,GACtCnoB,EAAKghB,SAAS,EAAG,EAAG,GACpB,MAAMkI,EAAUlpB,EAAK+nB,UACrB,GAAGmB,EAAUlB,EACX,OAEFhoB,EAAKmpB,SAASnpB,EAAKsnB,WAAa,GAChC,MAAM8B,EAAUppB,EAAK+nB,UAAY,EAEjCe,EAAMjsC,KAAK,CACTmrB,MAAOqhB,GAAmBH,GAC1BA,UACAE,W,CAGN,CAEA,SAASE,GAAkBR,EAAmBZ,EAAaC,GACzD,GAAGoB,GAAkBrB,EAAKC,GAAQ,CAChC,MAAMa,GAAc,IAAIl+B,MAAOu8B,cACzBW,EAAQl9B,KAAK1J,MAEnB,IAAI,IAAIc,EAAI8mC,EAAa9mC,GAAKmmC,GAASnmC,IAAK,CAC1C,GAAa,IAAVimC,GAAuB,KAARD,KA8DJD,EA9D8B/lC,GA+DhC,GAAM,GAAO+lC,EAAO,KAAQ,IAAQA,EAAO,KAAQ,EA9D7D,SAGF,MAAMjoB,EAAO,IAAIlV,KACjBkV,EAAKipB,YAAY/mC,EAAGimC,EAAOD,EAAM,GACjCloB,EAAKghB,SAAS,EAAG,EAAG,GAEpB,MAAMkI,EAAUlpB,EAAK+nB,UACrB,GAAGmB,EAAUlB,EACX,SAGFhoB,EAAKipB,YAAY/mC,EAAGimC,EAAOD,EAAM,GACjCloB,EAAKghB,SAAS,EAAG,EAAG,GACpB,MAAMoI,EAAUppB,EAAK+nB,UAAY,EAC9B7lC,IAAM8mC,EACPF,EAAMjsC,KAAK,CACTmrB,MAAOwhB,GAAkBN,GACzBA,UACAE,YAGFN,EAAMjsC,KAAK,CACTmrB,MAAOyhB,GAAiBP,GACxBA,UACAE,W,EAoCV,IAAoBnB,CA/BpB,CAEA,SAASoB,GAAmBlN,GAC1B,MAAMnc,EAAO,IAAIlV,KAAKqxB,GACtB,OAAO8K,GAAOjnB,EAAKsnB,YAAYtjC,MAAM,EAAG,GAAK,IAAMgc,EAAKqnB,aAC1D,CAEA,SAASmC,GAAkBrN,GACzB,MAAMnc,EAAO,IAAIlV,KAAKqxB,GACtB,OAAO8K,GAAOjnB,EAAKsnB,YAAYtjC,MAAM,EAAG,GAAK,IAAMgc,EAAKunB,SAC1D,CAEA,SAASkC,GAAiBtN,GACxB,MAAMnc,EAAO,IAAIlV,KAAKqxB,GACtB,OAAQ,IAAMnc,EAAKunB,WAAWvjC,OAAO,GAAK,KAAO,KAAOgc,EAAKsnB,WAAa,IAAItjC,OAAO,GAAK,IAAMgc,EAAKqnB,aACvG,CAEA,SAASqC,GAAevN,GACtB,MAAMnc,EAAO,IAAIlV,KAAKqxB,GACtB,OAAO+K,GAAKlnB,EAAK2pB,SACnB,CAEA,SAASJ,GAAkBrB,EAAaC,GACtC,OAAGA,GAAS,GAAKA,EAAQ,IACpBD,GAAO,GAAKA,EAAMU,GAAsBT,EAK/C,CAMA,SAASb,GAASsC,GAwBhBA,EAAIA,EAAE7yC,cACN,IAAI,IAAImL,EAAI,EAAGA,EAAI,GAAIA,IAErB,GAAwB,IADV+kC,GAAO/kC,GAAGnL,cACfC,QAAQ4yC,GACf,OAAO1nC,EAGX,OAAQ,CACV,CC7de,SAAS2nC,GAA4BjmC,EAAQwQ,EAAgBC,GACvE,eAAgBA,EAAUzQ,KAC3ByQ,EAAUzQ,GAAO,IAAIyQ,EAAUzQ,KAG9BwQ,GAAaA,EAAUxQ,KAASyQ,EAAUzQ,KAC3CwQ,EAAUxQ,GAAK5K,OAASqb,EAAUzQ,GAAK5K,OACtCqb,EAAUzQ,GAAevI,SAAQ,CAAC0uB,EAAG7nB,KACpCkS,EAAUxQ,GAAK1B,GAAK6nB,CAAC,IAIvB1V,EAAUzQ,GAAOwQ,EAAUxQ,GAE/B,CDieA,kBA1WO,SAAsBgT,EAAekyB,GAC1C,MAAMc,EAAIhzB,EAAMkzB,OAAO/yC,cAEvB,GAAG6yC,EAAE5wC,OAAS,EACZ,OAGF,GAA0B,IAAvB,QAAQhC,QAAQ4yC,GAAU,CAC3B,MAAM5pB,EAAO,IAAIlV,KACXm9B,EAAOjoB,EAAKqnB,cACZc,EAAQnoB,EAAKsnB,WACbY,EAAMloB,EAAKunB,UACjBvnB,EAAKipB,YAAYhB,EAAME,EAAOD,GAC9BloB,EAAKghB,SAAS,EAAG,EAAG,GAEpB,MAAMkI,EAAUlpB,EAAK+nB,UACrB/nB,EAAKipB,YAAYhB,EAAME,EAAOD,EAAM,GACpCloB,EAAKghB,SAAS,EAAG,EAAG,GAEpB,MAAMoI,EAAUppB,EAAK+nB,UAAY,EAMjC,YALAe,EAAMjsC,KAAK,CACTmrB,MAAO,QACPkhB,UACAE,W,CAKJ,GAA8B,IAA3B,YAAYpyC,QAAQ4yC,GAAU,CAC/B,MAAM5pB,EAAO,IAAIlV,KACXm9B,EAAOjoB,EAAKqnB,cACZc,EAAQnoB,EAAKsnB,WACbY,EAAMloB,EAAKunB,UACjBvnB,EAAKipB,YAAYhB,EAAME,EAAOD,GAC9BloB,EAAKghB,SAAS,EAAG,EAAG,GAEpB,MAAMkI,EAAUlpB,EAAK+nB,UAAY,MACjC/nB,EAAKipB,YAAYhB,EAAME,EAAOD,EAAM,GACpCloB,EAAKghB,SAAS,EAAG,EAAG,GAEpB,MAAMoI,EAAUppB,EAAK+nB,UAAY,SAMjC,YALAe,EAAMjsC,KAAK,CACTmrB,MAAO,YACPkhB,UACAE,W,CAKJ,MAAMW,EAySR,SAAsBH,GACpB,MAAM92B,EAAI,IAAIhI,KACd,GAAG8+B,EAAE5wC,QAAU,EACb,OAAQ,EAGV,IAAI,IAAIkJ,EAAI,EAAGA,EAAI,EAAGA,IAGpB,GAFA4Q,EAAEk3B,QAAQl3B,EAAEy0B,UAAY,GAEoC,IAAzDmC,GAAe52B,EAAEi1B,WAAWhxC,cAAcC,QAAQ4yC,GACnD,OAAO92B,EAAE62B,SAGb,OAAQ,CACV,CAvToBM,CAAaL,GAC/B,GAAGG,GAAa,EAAG,CACjB,MAAM/pB,EAAO,IAAIlV,KACX1J,EAAM4e,EAAK+nB,UAEXmC,EAAWH,EADE/pB,EAAK2pB,SAExB3pB,EAAKgqB,QAAQhqB,EAAKunB,UAAY2C,GAC3BlqB,EAAK+nB,UAAY3mC,GAClB4e,EAAKmqB,QAAQnqB,EAAK+nB,UAAY,QAEhC,MAAME,EAAOjoB,EAAKqnB,cACZc,EAAQnoB,EAAKsnB,WACbY,EAAMloB,EAAKunB,UACjBvnB,EAAKipB,YAAYhB,EAAME,EAAOD,GAC9BloB,EAAKghB,SAAS,EAAG,EAAG,GAEpB,MAAMkI,EAAUlpB,EAAK+nB,UACrB/nB,EAAKipB,YAAYhB,EAAME,EAAOD,EAAM,GACpCloB,EAAKghB,SAAS,EAAG,EAAG,GAEpB,MAAMoI,EAAUppB,EAAK+nB,UAAY,EAMjC,YALAe,EAAMjsC,KAAK,CACTmrB,MAAO0hB,GAAeR,GACtBA,UACAE,W,CAKJ,IAAIgB,EACJ,GAAqC,QAAjCA,EAAU1B,GAAU2B,KAAKT,IAyB7B,GAAoC,QAAhCQ,EAAUzB,GAAS0B,KAAKT,IAqC5B,GAAuC,QAAnCQ,EAAU9B,GAAY+B,KAAKT,IAA/B,CAyCA,GAAiD,QAA7CQ,EAAU5B,GAAsB6B,KAAKT,IAAc,CACrD,MAAMU,EAAKF,EAAQ,GACbG,EAAKH,EAAQ,GACbjC,EAAQb,GAASgD,GACvB,GAAGnC,GAAS,EAAG,CACb,MAAMqC,GAAKD,EACX,GAAGC,EAAI,GAAKA,GAAK,GAGf,YADAlB,GAAkBR,EADN0B,EAAI,EACcrC,GAEzB,GAAGqC,GAAKnC,GAGb,YADAQ,GAAmBC,EAAOX,EADLqC,E,EAO3B,GAAoD,QAAhDJ,EAAU3B,GAAyB4B,KAAKT,IAAc,CACxD,MAAMU,EAAKF,EAAQ,GAEbjC,EAAQb,GADH8C,EAAQ,IAEnB,GAAGjC,GAAS,EAAG,CACb,MAAMqC,GAAKF,EACX,GAAGE,EAAI,GAAKA,GAAK,GAGf,YADAlB,GAAkBR,EADN0B,EAAI,EACcrC,GAEtBqC,GAAKnC,IAEbQ,GAAmBC,EAAOX,EADLqC,E,OAtE3B,CACE,IAAIzB,GAAgBa,EACpB,MAAMZ,GAAc,IAAIl+B,MAAOu8B,cAC/B,GAAG0B,EAAeV,GAAS,CACzBU,EAAeV,GACf,IAAI,IAAInmC,EAAI8mC,EAAa9mC,GAAK6mC,EAAc7mC,IAAK,CAC/C,MAAM8d,EAAO,IAAIlV,KACjBkV,EAAKipB,YAAY/mC,EAAG,EAAG,GACvB8d,EAAKghB,SAAS,EAAG,EAAG,GAEpB,MAAMkI,EAAUlpB,EAAK+nB,UACrB/nB,EAAKipB,YAAY/mC,EAAI,EAAG,EAAG,GAC3B8d,EAAKghB,SAAS,EAAG,EAAG,GAEpB,MAAMoI,EAAUppB,EAAK+nB,UAAY,EACjCe,EAAMjsC,KAAK,CACTmrB,MAAO,GAAK9lB,EACZgnC,UACAE,W,OAGC,GAAGL,GAAgBC,EAAa,CACrC,MAAMhpB,EAAO,IAAIlV,KACjBkV,EAAKipB,YAAYF,EAAc,EAAG,GAClC/oB,EAAKghB,SAAS,EAAG,EAAG,GAEpB,MAAMkI,EAAUlpB,EAAK+nB,UACrB/nB,EAAKipB,YAAYF,EAAe,EAAG,EAAG,GACtC/oB,EAAKghB,SAAS,EAAG,EAAG,GAEpB,MAAMoI,EAAUppB,EAAK+nB,UAAY,EACjCe,EAAMjsC,KAAK,CACTmrB,MAAO,GAAK+gB,EACZG,UACAE,W,MAvEN,CACE,MAAMkB,EAAKF,EAAQ,GACbG,EAAKH,EAAQ,GACbK,EAAKL,EAAQ,GACnB,IAAIA,EAAQ,KAAOA,EAAQ,GACzB,OAGF,MAAMlC,EAAMwC,SAASJ,GACfnC,EAAQuC,SAASH,GAAM,EAC7B,IAAItC,EAAOyC,SAASD,GACjBxC,GAAQ,IAAMA,GAAQ,KACvBA,GAAQ,KAGV,MAAMe,GAAc,IAAIl+B,MAAOu8B,cAC/B,GAAGkC,GAAkBrB,EAAM,EAAGC,IAAUF,GAAQI,IAAWJ,GAAQe,EAAa,CAC9E,MAAMhpB,EAAO,IAAIlV,KACjBkV,EAAKipB,YAAYhB,EAAME,EAAOD,GAC9BloB,EAAKghB,SAAS,EAAG,EAAG,GAEpB,MAAMkI,EAAUlpB,EAAK+nB,UACrB/nB,EAAKipB,YAAYhB,EAAME,EAAOD,EAAM,GACpCloB,EAAKghB,SAAS,EAAG,EAAG,GAEpB,MAAMoI,EAAUppB,EAAK+nB,UAAY,EAMjC,YALAe,EAAMjsC,KAAK,CACTmrB,MAAOyhB,GAAiBP,GACxBA,UACAE,W,MAtDN,CACE,MAAMkB,EAAKF,EAAQ,GACbG,EAAKH,EAAQ,GACbI,EAAIE,SAASJ,GACbK,EAAKD,SAASH,GACpB,GAAGC,EAAI,GAAKA,GAAK,GAAI,CACnB,GAAGG,GAAMtC,IAAWmC,GAAK,GAIvB,YADA3B,GAAmBC,EADL0B,EAAI,EADGG,GAIbA,GAAM,IAGdrB,GAAkBR,EAFN0B,EAAI,EACFG,EAAK,E,MAGbH,GAAKnC,IAAWsC,GAAM,IAG9B9B,GAAmBC,EADL6B,EAAK,EADEH,E,CAwH3B,E,gDEnWO,MAAMI,GAAkE,CAC7EC,IAAK,kBACLC,IAAK,8BACLC,IAAK,0BACLvE,KAAM,mBACNwE,IAAK,YACLC,IAAK,aACLC,IAAK,YACLC,KAAM,aACNC,IAAK,aACLC,IAAK,YACLC,IAAK,YACLC,KAAM,aACNC,IAAK,YACLC,KAAM,aACNC,IAAK,kBACLC,IAAK,iBAGMC,GAAwE,CAAC,EAEtF,IAAI,MAAM7yC,KAAO6xC,GACfgB,GAAwBhB,GAAwB7xC,IAA2BA,ECa7E,IAAI8yC,GAAwB,EAErB,MAAMC,WAAuB78B,EAApC,c,oBAmBU,KAAA88B,oBAAsB,KAC5B,IAAI,MAAM5yC,KAAMoD,KAAKyvC,KAAM,CACzB,MAAMC,EAAM1vC,KAAKyvC,KAAK7yC,GAEnB8yC,EAAIC,2BACED,EAAIC,kBACX3vC,KAAK4vC,cAAcC,mBAAmBH,G,EAgV9C,CAlWYxyB,QACRld,KAAKyvC,KAAO,CAAC,EACbzvC,KAAK8vC,oBAAsB,CAAC,EAC5B9vC,KAAK+vC,oBAAsB,CAAC,EAE5B,kBAAwCzpC,iBAAiB,uBAAwB0pC,IAC3EA,GACFhwC,KAAKwvC,qB,GAGX,CAaOS,QAAQP,EAAe55B,GAC5B,IAAI45B,GAAiB,kBAAVA,EAAI/yC,EACb,OAGF,MAAMuzC,EAASlwC,KAAKyvC,KAAKC,EAAI9yC,IAE1B8yC,EAAIS,iBACL7C,GAAyB,iBAAkB4C,EAAQR,GACnD1vC,KAAKowC,kBAAkBx6B,YAAY85B,EAAIS,eAAgBr6B,IAuBrDo6B,IACFlwC,KAAKyvC,KAAKC,EAAI9yC,IAAM8yC,GAStB,IAAI,IAAI/pC,EAAI,EAAGlJ,EAASizC,EAAIW,WAAW5zC,OAAQkJ,EAAIlJ,IAAUkJ,EAAG,CAC9D,MAAM2qC,EAAYZ,EAAIW,WAAW1qC,GACjC,OAAO2qC,EAAU3zC,GACf,IAAK,4BACH+yC,EAAIa,WAAY,EAAAC,GAAA,GAAcF,EAAUC,WACxC,MAGF,IAAK,yBACH,GAAgB,UAAbb,EAAI3xC,KACL,MAGF2xC,EAAIvU,SAAWmV,EAAUnV,SACzBuU,EAAI3xC,KAAOuyC,EAAUpzC,OAAOuzC,OAA2B,cAAlBf,EAAIgB,UAA4B,QAAU,QAC/E,MAGF,IAAK,yBACHhB,EAAIvU,SAAWmV,EAAUnV,SACzBuU,EAAIiB,EAAIL,EAAUK,EAClBjB,EAAIkB,EAAIN,EAAUM,EAEQN,EAAUpzC,OAAO2zC,cACzCnB,EAAI3xC,KAAO,QAEX2xC,EAAI3xC,KAAO,QAEb,MAGF,IAAK,+BACL,IAAK,2BAcH,QAbqB/C,IAAlBs1C,EAAUQ,MACXpB,EAAIqB,gBAAkBT,EAAUQ,KAG/BR,EAAUlzC,aACmB,yBAA3BkzC,EAAUlzC,WAAWT,SACf2zC,EAAUlzC,WACkB,sBAA3BkzC,EAAUlzC,WAAWT,IAC7B+yC,EAAIsB,gBAAkBV,EAAUlzC,aAKQ,eAAlBsyC,EAAIgB,YAA+BhB,EAAIuB,QAAUnrC,IAAiBorC,mBAC1FxB,EAAI3xC,KAAO,UACX2xC,EAAIyB,QAAU,OACT,GAAqB,eAAlBzB,EAAIgB,UAA4B,CACxC,IAAI5qC,IAAiBsrC,kBACnB,MAGF1B,EAAI3xC,KAAO,UACX2xC,EAAIyB,QAAU,EACdzB,EAAI2B,UAAW,C,CAEjB,MAGF,IAAK,6BACH3B,EAAI3xC,KAAO,QACX2xC,EAAIiB,EAAIL,EAAUK,EAClBjB,EAAIkB,EAAIN,EAAUM,EAClB,MAGF,IAAK,4BACmB,cAAlBlB,EAAIgB,WAA+C,cAAlBhB,EAAIgB,YACvChB,EAAI3xC,KAAO,OAGb2xC,EAAI2B,UAAW,E,CAMrB,GAAI3B,EAAIgB,UA2BEhB,EAAIgB,YAAcrC,GAAwBC,IAClDoB,EAAI3xC,KAAO,MACH2xC,EAAIgB,YAAcrC,GAAwBU,IAClDW,EAAI3xC,KAAO,MACe,4BAAlB2xC,EAAIgB,WAA6D,wBAAlBhB,EAAIa,YAC3Db,EAAI3xC,KAAO,UACX2xC,EAAI2B,UAAW,EACf3B,EAAIyB,QAAU,OAlCG,CACjB,MAAM30C,GAAOkzC,EAAIa,WAAa,IAAI3wC,MAAM,KAAK8H,MAEvC4pC,EAAiB90C,GAAO6xC,GAAwB7xC,EAAIhC,eAC1D,GAAG82C,EACD5B,EAAIgB,UAAYY,OAEhB,OAAO5B,EAAI3xC,MACT,IAAK,MACL,IAAK,QACL,IAAK,QACH2xC,EAAIgB,UAAY,YAChB,MACF,IAAK,UACHhB,EAAIgB,UAAY,aAChB,MACF,IAAK,QACHhB,EAAIgB,UAAY,aAChB,MACF,IAAK,QACHhB,EAAIgB,UAAY,YAChB,MACF,QACEhB,EAAIgB,UAAY,2B,CAcxB,GAAgB,UAAbhB,EAAI3xC,MAAiC,UAAb2xC,EAAI3xC,KAAkB,CAE/C,MAAMuyC,EAAYZ,EAAIW,WAAW7xC,MAAM8xC,GAA8B,8BAAhBA,EAAU3zC,IACzDH,EAAM8zC,GAAaA,EAAUC,UAAU3wC,MAAM,KAAK8H,MAClD+b,EHtHe,EAACA,EAAY/nB,EAKnC,CAAC,KACJ,MAAM61C,EAAS71C,EAAQ81C,cAAgB,IAAM,IACvCljC,GAAQ,IAAMmV,EAAK2mB,YAAY3iC,OAAO,GAAK,KAAO,IAAMgc,EAAK4mB,cAAc5iC,OAAO,IAAM/L,EAAQ+1C,UAAY,GAAK,KAAO,IAAMhuB,EAAKiuB,cAAcjqC,OAAO,IAE9J,OAAQ/L,EAAQi2C,aAAe,IAAMluB,EAAKunB,WAAWvjC,OAAO,GAAKgc,EAAKunB,WACpEuG,GAAU71C,EAAQ81C,eAAiB,KAAO/tB,EAAKsnB,WAAa,IAAItjC,OAAO,GAAKijC,GAAOjnB,EAAKsnB,aACxFwG,EAAS9tB,EAAKqnB,eACbpvC,EAAQk2C,OAAS,GAAK,KAAOtjC,EAAK,EG0GpBujC,CAAY,IAAItjC,KAAgB,IAAXmhC,EAAIjsB,MAAc,CAAC+tB,eAAe,EAAMG,aAAa,IAAO51C,QAAQ,SAAU,KAAKA,QAAQ,KAAM,KACnI2zC,EAAIa,UAAY,GAAGb,EAAI3xC,QAAQ0lB,IAAOjnB,EAAM,IAAMA,EAAM,I,CAwB1D,OArBGs1C,OAA0C,QAAbpC,EAAI3xC,MAAkB2xC,EAAIr8B,KAAO,KAAqB,UAAbq8B,EAAI3xC,MAAiC,UAAb2xC,EAAI3xC,OACnG2xC,EAAIC,mBAAoB,EAEH3vC,KAAK4vC,cAAcmC,gBAAgBrC,GACvChyC,KACfsC,KAAK4vC,cAAcoC,mBAAmBtC,OAAK10C,ECpOpC,SAAwB00C,EAAwB3+B,GAAW,EAAOkhC,GAC/E,IAAIl0C,EAWJ,OATEA,EADCgT,EACM,WACCkhC,EACD,QACCvC,EAAIC,kBACL,SAEA,YAGF,QAAW5xC,GAAM,EAAAm0C,GAAA,GAA2BxC,EAAKuC,GAC1D,CDuN8DE,CAAezC,GAAM,IAG7EA,EAAIC,mBAAoB,EAO1BD,EAAIa,YAAJb,EAAIa,UAAc,IAMfL,EACMj2C,OAAOC,OAAOg2C,EAAQR,GAGxBA,CACT,CAEO0C,OAAOn7B,GACZ,OAAO,EAAAuM,GAAA,GAAqBvM,GAASA,EAAQjX,KAAKyvC,KAAKx4B,EACzD,CAEOo7B,YAAY3C,EAAiB4C,EAAkBC,GACpD,OAAOvyC,KAAKi5B,eAAeuZ,cAAc,CACvCp6B,MAAOs3B,EACP4C,UACAC,aAEJ,CAEOE,qBAAqBx7B,EAAcy7B,GACxC,MAAM3mB,EAAS/rB,KAAK8vC,oBAAoB74B,GACxC,OAAO8U,GAAUA,EAAO2mB,EAC1B,CAEOC,kBAAkB17B,EAAciiB,EAAY0Z,EAAeC,EAAgBH,G,UAChF,MAAMhD,EAAM1vC,KAAKoyC,OAAOn7B,GACxB,IAAIy4B,EACF,OAGF,MAAM3jB,EAAwC,QAAlC,KAAG/rB,KAAK8vC,qBAAmB,EAACJ,EAAI9yC,WAAE,aAAM,CAAC,EAE/Cq1C,EAAQlmB,EAAO2mB,GAClBT,GAASA,EAAMtB,GAAKiC,GAASX,EAAMrB,GAAKiC,IAI3C9mB,EAAO2mB,GAAa,CAClBh1C,IAAKy7B,IAAIC,gBAAgBF,GACzByX,EAAGiC,EACHhC,EAAGiC,GAEP,CAEOC,+BAA+B77B,EAAclK,GAClD,MAAM2iC,EAAM1vC,KAAKoyC,OAAOn7B,GACxB,IAAIy4B,EACF,OAGF,MAAMuC,EAAQvC,EAAIuB,QAAUvB,EAAIuB,OAAOzyC,MAAMyzC,GAAsB,sBAAZA,EAAMt1C,IACzDs1C,IAIJvC,EAAIxyC,OAAO61C,uBAAwB,EACnCd,EAAMllC,MAAQA,EAChB,CAEOimC,uBAAuB3T,GAC5B,MAAMziC,EAAK,uBAAwB0yC,GAE7B2C,EAAQ,CACZt1C,EAAG,YACHi0C,EAAG,EACHD,EAAG,EACHp0C,SAAU,CAAC,EACX8W,KAAMgsB,EAAKhsB,KACXtV,KAAM,MAER,IAAI+oC,EAAuB,CACzBnqC,EAAG,WACH29B,YAAa,GACb+V,WAAY,GACZtX,MAAO,EACPoX,eAAgB,GAChBvzC,KACA8zC,UAAWrR,EAAKthC,KAChBsV,KAAMgsB,EAAKhsB,KACXoQ,KAAMlV,KAAK1J,MAAQ,IACnB3H,OAAQ,CAAC,EACT+zC,OAAQ,CAACgB,GACT1B,UAAWlR,EAAKp/B,MAGlB6mC,EAAW9mC,KAAKiwC,QAAQnJ,GAExB,MAAMmM,EAAejzC,KAAK4vC,cAAcoC,mBAAmBlL,OAAU9rC,EAAWm+B,IAAIC,gBAAgBiG,GAAOA,EAAKhsB,MAE1G6/B,EAAiC,CACrCv2C,EAAG,YACH29B,YAAa,GACbwM,SAAUA,EACVlqC,KACAu2C,KAAMv2C,EACNM,OAAQ,CAAC,GAQX,OALA8C,KAAK+vC,oBAAoBnzC,GAAM,CAC7Bq2C,eACA5T,QAGK6T,CACT,CAEOE,gBAAgBx2C,GACrB,MAAM,aAACq2C,EAAY,KAAE5T,GAAQr/B,KAAK+vC,oBAAoBnzC,GAItD,cAHOoD,KAAK+vC,oBAAoBnzC,GAEjBoD,KAAKi5B,eAAejoB,OAAO,CAACquB,OAAMgU,SAAUhU,EAAKp/B,OAClD6E,MAAMq6B,GACXn/B,KAAK4T,WAAWC,UAAU,0BAA2B,CAC1DwrB,KAAMF,EACNuR,UAAWrR,EAAKthC,KAChB+I,SAAU,CACRnK,EAAG,oBACHO,OAAQ,CAAC,KAEV4H,MAAMwuC,KACP,EAAAnrB,GAAA,GAAgCmrB,GAChCA,EAAUxM,SAAW9mC,KAAKiwC,QAAQqD,EAAUxM,UAC5C9mC,KAAK4vC,cAAcoC,mBAAmBsB,EAAUxM,cAAU9rC,EAAWi4C,EAAav1C,IAAKu1C,EAAaM,YAE7FD,MAGb,CAEOE,UACL,OAAOxzC,KAAK4T,WAAW6/B,kBAAkB,CACvC3qC,OAAQ,wBACRm4B,cAAgBnJ,KACd,EAAA3P,GAAA,GAAgD2P,GACzCA,EAAI4b,KAAKvvC,KAAKurC,GAAQ1vC,KAAKiwC,QAAQP,OAGhD,CAEOiE,eAAe18B,EAAc9O,EAAcmkB,EAAgB/P,GAChE,MAAMmzB,EAAM1vC,KAAKoyC,OAAOn7B,GACxB,OAAIy4B,EACG1vC,KAAKi5B,eAAe2a,gBAAgBzrC,GAAM,EAAA0rC,GAAA,GAA6BnE,GAAMpjB,EAAQ/P,GAD5E5a,QAAQC,QAAO,EAAA+V,EAAA,GAAU,UAE3C,E,eEvXK,MAAMm8B,WAAyBphC,EAAtC,c,oBACU,KAAAqhC,OAAwD,CAAC,CA4OnE,CAzOY72B,QACRld,KAAKoe,kBAAkBC,2BAA2B,CAChD21B,mBAAqBv5B,IACnB,MAAMxb,EAASe,KAAK8a,gBAAgB9b,UAAUyb,EAAOI,MACrD7a,KAAKqqB,UAAU,CACbprB,SACAqjB,SAAU7H,EAAO6H,SACjB0D,MAAOvL,EAAOuL,MACdiuB,QAAQ,GACR,IAIO/sC,EAAA,MAAiB,UAAUpC,MAAMivC,IAC5C/zC,KAAK+zC,OAASA,GAAU,CAAC,CAAC,GAE9B,CAEQG,OAAOj1C,EAAgBqjB,GAC7B,OAAYrjB,GAAUqjB,EAAW,IAAMA,EAAW,GACpD,CAEO6xB,SAASl1C,EAAgBqjB,GAC9B,OAAOtiB,KAAK+zC,OAAO/zC,KAAKk0C,OAAOj1C,EAAQqjB,GACzC,CAEOnD,mBACL,OAAOnf,KAAKo0C,eAAetvC,MAAK,KAC9B,IAAI,MAAMuC,KAAOrH,KAAK+zC,OAAQ,CAC5B,IAAyB,IAAtB1sC,EAAI5M,QAAQ,KACb,SAGF,MAAMwE,EAASoI,EAAIhI,WACJW,KAAKwW,mBAAmB8E,cAAcrc,IAEnDe,KAAKwW,mBAAmBmJ,mBAAmB1gB,E,IASnD,CAEQm1C,e,MACN,OAA8B,QAA9B,EAAOp0C,KAAKq0C,0BAAkB,QAAvBr0C,KAAKq0C,mBAAuBr0C,KAAK4T,WAAWC,UAAU,yBAC5D/O,MAAMmkB,KACKjpB,KAAKoe,kBAAkB0U,aAAaI,aAAevxB,QAAQM,WACnE6C,MAAK,KACL9E,KAAKoe,kBAAkBkV,qBAAqBrK,EAAQ,GACpD,GAEN,CAEOoB,WAAU,OAACprB,EAAM,SAAEqjB,EAAU0D,MAAOsuB,EAAQ,OAAEL,EAAM,MAAE/c,IAO3D,MAAMlR,EAAQhmB,KAAKu0C,gBAAgBD,GAE7BjtC,EAAMrH,KAAKk0C,OAAOj1C,EAAQqjB,GAqBhC,OApBG0D,EACDhmB,KAAK+zC,OAAO1sC,GAAO2e,SAEZhmB,KAAK+zC,OAAO1sC,GAGrBH,EAAA,MAAiB,CACf6sC,OAAQ/zC,KAAK+zC,SAGZE,GAEDj0C,KAAKmd,UAAUxW,cAAc,gBAAiB,CAC5C1H,SACAqjB,WACA0D,QACAkR,UAIGlR,CACT,CAEQwuB,aAAaxuB,GACnB,MAAgB,kBAAbA,aAAK,EAALA,EAAOrpB,WAImB3B,IAA1BgrB,EAAMyuB,iBAAiCzuB,EAAMyuB,gBAAkB,KAI9DzuB,EAAMnkB,QAAQpF,MAKpB,CAEQ83C,gBAAgBvuB,GACtB,GAAIA,GAAqB,iBAAZA,EAAMrpB,EAQnB,OAJGqpB,EAAMyuB,kBACPzuB,EAAMyuB,iBAAkB,EAAA/4B,GAAA,GAAkBsK,EAAMyuB,kBAG3CzuB,CACT,CAEO0uB,UAAUz1C,EAAgBqjB,EAAkBqyB,EAA2BC,GAAe,EAAM1d,GAAQ,GAEzG,MAAM2d,EAAc70C,KAAKm0C,SAASl1C,EAAQqjB,GAC1C,IAAG,EAAAwyB,GAAA,GAAeD,EAAaF,GAE7B,OAAO,EAIT,MAAM1gC,EAA4B,CAChC4G,KAAM7a,KAAK8a,gBAAgBiW,iBAAiB9xB,GAC5C4C,QAAS,IAGX,IAAIkzC,EACJ,GAAG/0C,KAAKw0C,aAAaG,GACnBI,EAAW,CAACp4C,EAAG,yBACV,EACL,EAAAwrB,GAAA,GAAsCwsB,GACtC,MAAM9yC,EAAU8yC,EAAW9yC,QACrBoyB,EAA4B0gB,EAAW1gB,SAE1C0gB,EAAWF,kBACZxgC,EAAOwgC,iBAAkB,EAAAp1B,GAAA,GAAmBs1B,EAAWF,mBAGtDxgB,aAAQ,EAARA,EAAUx3B,UACXwX,EAAOggB,SAAWj0B,KAAKwW,mBAAmBw+B,iBAAiB/gB,IAG1D0gB,EAAWz3C,OAAO+3C,aACnBhhC,EAAOghC,WAAaN,EAAWz3C,OAAO+3C,YAGxChhC,EAAOpS,QAAUA,C,CAGhBygB,IACDrO,EAAOihC,YAAa,EAAA71B,GAAA,GAAmBiD,IAGzC,MAAM6yB,EAAiBJ,GAAYJ,EAWnC,OAVAQ,EAAe1xB,MAAO,EAAAC,GAAA,IAAM,GAAQ1jB,KAAK2jB,YAAYC,sBAErD5jB,KAAKqqB,UAAU,CACbprB,SACAqjB,WACA0D,MAAOmvB,EACPlB,QAAQ,EACR/c,WAGC0d,GACM50C,KAAK4T,WAAWC,UAAU,qBAAsBI,EAI3D,CAEOmhC,iBACL,OAAOp1C,KAAK4T,WAAWC,UAAU,2BAA2B/O,MAAMssB,IAChE,GAAIA,EAIJ,IAAI,MAAMikB,KAAYr1C,KAAK+zC,OAAQ,CACjC,MAAO90C,EAAQqjB,GAAY+yB,EAASz1C,MAAM,KAC1CI,KAAKmd,UAAUxW,cAAc,gBAAiB,CAC5C1H,OAAQA,EAAOI,WACfijB,SAAUA,GAAYA,OAAWtnB,EACjCgrB,WAAOhrB,G,IAIf,CAEOs6C,WAAWr2C,EAAgBqjB,GAChC,MAAMizB,EAA6C,CACjD54C,EAAG,qBAGF2lB,EACDtiB,KAAK00C,UAAUz1C,EAAQqjB,EAAUizB,GAAmB,GAAO,GAE3Dv1C,KAAKqqB,UAAU,CACbprB,SACAqjB,WACA0D,MAAOuvB,EACPtB,QAAQ,EACR/c,OAAO,GAGb,CAEOse,SAASv2C,EAAgBqjB,EAAkBzgB,EAAiBoyB,GACjE,MAAMjO,EAAmC,CACvCrpB,EAAG,eACH8mB,KAAMlV,KAAK1J,MAAQ,IAAO,EAC1BhD,UACA3E,OAAQ,CAAC,EACT+2B,YAGC3R,EACDtiB,KAAK00C,UAAUz1C,EAAQqjB,EAAU0D,GAAO,GAAO,GAE/ChmB,KAAKqqB,UAAU,CACbprB,SACAqjB,WACA0D,QACAiuB,QAAQ,EACR/c,OAAO,GAGb,E,yBCxOF,MAAMue,GAAiC,CACrCC,SAAU,CAAC,EACX17C,QAAS,EACTq9B,SAAU,kBAOL,MAAMse,WAAwBjjC,EAArC,c,oBAEU,KAAAkjC,iBAEJ,CAAC,EAGG,KAAAC,iBAAkD,CAAC,EAEnD,KAAAC,oBAAoE,CAAC,EAErE,KAAAC,OAAgD,CAAC,EACjD,KAAAC,wBAAmF,CAAC,EAGpF,KAAAC,+BAA6E,IAAIzkC,GA4Q3F,CA9MS0kC,iBAAiB7e,EAAmB,kBACzC,MAAM1tB,EAAU3J,KAAK81C,oBAAoBze,GACzC,GAAG1tB,EACD,OAAOA,EAGT,MAAMwsC,EAAkB,iBAAmB9e,EAC3C,OAAOr3B,KAAK81C,oBAAoBze,GAAYnwB,EAAA,MAAiBivC,GAAYrxC,MAAMsxC,KACzE,EAAA5yB,GAAA,GAAS4yB,KACXA,EAAO,CAAC,IAGV,EAAAC,GAAA,GAAmBZ,GAAiBW,GAGpCA,EAAK/e,SAAWA,EAChBr3B,KAAK41C,iBAAiBve,GAAY+e,EAE3Bp2C,KAAK4T,WAAWC,UAAU,sCAAuC,CACtE4xB,UAAW2Q,EAAK/e,SAChBmO,aAAc4Q,EAAKp8C,UAClB8K,MAAMwxC,IACPF,EAAKp8C,QAAUs8C,EAAmBt8C,QAElC,MAAMu8C,EAAeH,EAAKV,SACpBA,EAAWY,EAAmBZ,SACpC,IAAI,IAAI/vC,EAAI,EAAGlJ,EAASi5C,EAASj5C,OAAQkJ,EAAIlJ,IAAUkJ,EAAG,CACxD,MAAM,QAAC6wC,EAAO,UAAEC,GAAaf,EAAS/vC,GACtC4wC,EAAaC,GAAWC,C,CAO1B,OAJAvvC,EAAA,MAAiB,CACf,CAACivC,GAAaC,IAGTA,CAAI,IACV,IACMA,MAGb,CAEOM,uBACL,MAAMxyC,EAA2B,CAC/BlE,KAAKk2C,oBAWP,OARGl2C,KAAK22C,iBAAiBte,WAAa,kBACpCn0B,EAAS5D,KAAKN,KAAKk2C,iBAAiBl2C,KAAK22C,iBAAiBte,WAGxDr4B,KAAK+1C,OAAOa,QACd1yC,EAAS5D,KAAKN,KAAK62C,gBAAgB,WAG9Bl1C,QAAQ0Q,IAAInO,EACrB,CAEQ4yC,cACF92C,KAAKmB,QACPnB,KAAKmB,MAAQ,IAAI,UAAYnG,EAAW,IAG1C,IAAI,MAAMq8B,KAAYr3B,KAAK41C,iBAAkB,CAC3C,GAAG51C,KAAK61C,iBAAiBxe,GACvB,SAGF,MACMqe,EADO11C,KAAK41C,iBAAiBve,GACbqe,SAEtB,IAAI,MAAMc,KAAWd,EAAU,CAC7B,MAAMe,EAAYf,EAASc,GAC3Bx2C,KAAKmB,MAAMqc,YAAYi5B,EAAWD,E,CAGpCx2C,KAAK61C,iBAAiBxe,IAAY,C,CAEtC,CAEO0f,aAAa1J,GAMlB,IAAI2J,EACJ,GANAh3C,KAAK82C,eAELzJ,EAAIA,EAAE7yC,cAAcuB,QAAQ,KAAM,MAI7BwxC,OAAQ,CACX,MAAMtlC,EAAMjI,KAAKmB,MAAM5G,OAAO8yC,GAC9B2J,EAASl2C,MAAMC,KAAKkH,GAAKqlB,QAAO,CAACC,EAAKC,IAAMD,EAAIvpB,OAAOwpB,IAAI,G,MAE3DwpB,EAASh3C,KAAK+1C,OAAOa,OAAO5yC,OAAO2xC,GAAgBsB,eAAexvC,MAAM,EA5KpD,IAwLtB,OATAuvC,EAASl2C,MAAMC,KAAK,IAAI3C,IAAI44C,IASrBA,CACT,CAIOH,gBAAqC94C,G,MAC1C,MAAMmG,EAAWlE,KAAKg2C,wBACtB,OAAoB,QAApB,EAAO9xC,EAASnG,UAAI,QAAbmG,EAASnG,GAAUiC,KAAK2e,gBAAgBxX,WAAWrC,MAAMmC,IAC9D,IAAI8uC,EAA6B,GACjC,GAAY,WAATh4C,EAAmB,CACpB,MAAM,YAACm5C,GAAejwC,EACtB8uC,EAASj1C,MAAMiD,QAAQmzC,IAAgBA,EAAYz6C,OAASy6C,EAAcvB,GAAgBsB,a,KACrF,CACL,MAAM,kBAACE,GAAqBlwC,EAC5B8uC,EAASj1C,MAAMiD,QAAQozC,IAAsBA,EAAkB16C,OAAS06C,EAAoB,E,CAG9F,OAAOn3C,KAAK+1C,OAAOh4C,GAAQg4C,CAAa,GAE5C,CAEOqB,gBAAgBC,GACrB,MAAMt5C,EAAkBs5C,EAAMpgC,MAAQ,SAAW,SACjDogC,EAAMA,OAAQ,EAAAC,GAAA,GAASD,EAAMA,OAE7Br3C,KAAK62C,gBAAgB94C,GAAM+G,MAAMixC,IAC/B,MAAMpwC,EAAI0xC,EAAMpgC,OAASogC,EAAMA,OAC/B,EAAAhmC,EAAA,GAAiB0kC,EAAQpwC,GACzBowC,EAAO7vB,QAAQvgB,GACfowC,EAAOjsC,OArNa,GAqNaisC,EAAOt5C,OArNpB,IAuNpBuD,KAAK2e,gBAAgB9W,YAAqB,WAAT9J,EAAoB,oBAAsB,cAAeg4C,GAC1F/1C,KAAKmd,UAAUxW,cAAc,eAAgB0wC,EAAM,GAEvD,CAEOrgC,wBAAwBugC,GAC7B,OAAIA,EAAO96C,OACJuD,KAAK4T,WAAWC,UAAU,mCAAoC,CAAC2jC,YAAaD,IAASzyC,MAAM2yC,GACzFA,EAAUtzC,KAAKurC,GACb1vC,KAAK03C,eAAezH,QAAQP,EAAK,CACtC3xC,KAAM,cACNkZ,MAAOy4B,EAAI9yC,SALS+E,QAAQM,QAAQ,GAS5C,CAEO01C,8BAA8BJ,GACnC,OAAOA,EAAOpzC,KAAK8S,GAAUjX,KAAK03C,eAAetF,OAAOn7B,IAC1D,CAEQ2gC,uCACH53C,KAAK63C,gCAAmC73C,KAAKi2C,+BAA+B5iC,OAI/ErT,KAAK63C,gCAAiC,EAAA9tC,EAAA,GAAM,GAAGjF,MAAK,KAClD,MAAMgzC,EAAS,IAAI93C,KAAKi2C,+BAA+BhjC,QACjD/O,EAA2B,GACjC,EAAG,CACD,MAAM6oB,EAAM+qB,EAAOhuC,OAAO,EAAG,KACvBH,EAAU3J,KAAKgX,wBAAwB+V,GAAKjoB,MAAM2qC,IACtDA,EAAK3wC,SAAQ,CAAC4wC,EAAKprC,KACjB,MAAM2S,EAAQ8V,EAAIzoB,GACZ9K,EAAWwG,KAAKi2C,+BAA+BzxC,IAAIyS,GACzDjX,KAAKi2C,+BAA+BpyC,OAAOoT,GAC3Czd,EAASyI,QAAQytC,EAAI,GACrB,IAGJxrC,EAAS5D,KAAKqJ,E,OACRmuC,EAAOr7C,QAEf,OAAOkF,QAAQ0Q,IAAInO,EAAS,IAC3B0kC,SAAQ,KACT5oC,KAAK63C,oCAAiC78C,EACtCgF,KAAK43C,qCAAqC,IAE9C,CAEOG,uBAAuBn7C,GAC5B,IAAI+M,EAAU3J,KAAKi2C,+BAA+BzxC,IAAI5H,GACtD,GAAG+M,EACD,OAAOA,EAIT,OADY3J,KAAK03C,eAAetF,OAAOx1C,KAKvC+M,GAAU,SACV3J,KAAKi2C,+BAA+BhuC,IAAIrL,EAAI+M,GAE5C3J,KAAK43C,sCAEEjuC,EACT,CAEOquC,kBACL,OAAOh4C,KAAK2W,mBAAmBshC,kBACjC,EAzRe,GAAAhB,cAAgB,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,M,2SCIjO,MAAMiB,WAA6BxlC,EAS9BwK,QACRld,KAAKG,KAAM,EAAAsI,EAAA,IAAO,eAElBzI,KAAKm4C,WAAa,IAAI3mC,IACtBxR,KAAKo4C,aAAe,IAAI5mC,IACxBxR,KAAKq4C,YAAc,IAAI7mC,IAEvBxR,KAAKoe,kBAAkBC,2BAA2B,CAChDi6B,gBAAkB79B,IAChBza,KAAKu4C,cAAc99B,EAAOwf,KAAMxf,EAAOjb,QAAQ,EAGjDg5C,4BAA8B/9B,IAC5Bza,KAAKu4C,cAAc99B,EAAOwf,MAI1B,MAAMwe,EAAch+B,EAAOwf,KAAKr9B,GAChCoD,KAAK04C,oBAAoBD,EAAah+B,EAAO29B,aAAa,IAI9Dp4C,KAAKmd,UAAU7W,iBAAiB,qBAAsBqyC,IACjC,uBAAhBA,EAAUh8C,GACXqD,KAAKo4C,aAAav0C,OAAO80C,EAAU/7C,G,GAGzC,CAEOg8C,sBAAsBH,GAC3B,IAAIL,EAAep4C,KAAKo4C,aAAa5zC,IAAIi0C,GAKzC,OAJIL,GACFp4C,KAAKo4C,aAAanwC,IAAIwwC,EAAaL,EAAe,IAAI5mC,KAGjD4mC,CACT,CAEQS,0BAA0BJ,GAChC,MAAMK,EAAiB94C,KAAKq4C,YAQtBU,EAAaD,EAAet0C,IAAIi0C,GACtC,MAAO,CACLM,aACAC,cATqBC,IAClBH,EAAet0C,IAAIi0C,KAAiBM,GACrCD,EAAe7wC,IAAIwwC,EAAaQ,E,EAStC,CAEOC,mBAAmBT,EAA0B/Y,EAAmCyZ,GACrF,MAAMf,EAAep4C,KAAK44C,sBAAsBH,GAE1Cx5C,GAAS,EAAAD,GAAA,GAAU0gC,EAAY7kB,MAE/Bu+B,EAAiBhB,EAAa5zC,IAAIvF,GAClCo6C,EAAU3Z,EAAYxiC,OAAOuI,KACnC,IAAI2zC,GAAkBC,EACpB,OAIE3Z,EAAYxiC,OAAOo8C,OAAU5Z,EAAYxiC,OAAOq8C,kBAClD7Z,EAAYxiC,OAAOq8C,iBAAkB,GAGpCH,GACDxhC,GAAkBwhC,EAAgB1Z,GAClCA,EAAc0Z,GAEdhB,EAAanwC,IAAIhJ,EAAQygC,GAI3B,MAAMiZ,EAAY34C,KAAKw5C,aAAaf,GACpC,GAAoB,eAAjBE,aAAS,EAATA,EAAWh8C,GAAmB,CAC/B,IAAI88C,GAAW,EACZJ,KACCV,EAAU1c,mBACZwd,GAAW,IACH/Z,EAAYxiC,OAAOw8C,aAAgBN,GAAmB1Z,EAAYxiC,OAAOrD,SAC/E8+C,EAAU1c,mBACZwd,GAAW,GAGVA,GACDz5C,KAAKmd,UAAUxW,cAAc,oBAAqBgyC,E,CAKnDU,GACDjB,EAAav0C,OAAO5E,GAIpBe,KAAKmd,UAAUxW,cAAc,yBAA0B,CACrD8xC,cACA/Y,eAGN,CAEOgZ,oBAAoBD,EAA0BkB,EAAyCR,GACxFQ,EAAwBjhB,QAC3BihB,EAAwBjhB,OAAQ,EACjCihB,EAAgB76C,SAASk7B,GAAMh6B,KAAKk5C,mBAAmBT,EAAaze,EAAGmf,KACzE,CAEaS,gBAAgBnB,EAA0B/Y,EAAmChkC,G,0CAQxFsE,KAAKk5C,mBAAmBT,EAAa/Y,GAErC,MAAMzgC,EAASygC,EAAYxiC,OAAOrD,KAAO,MAAe,EAAAmF,GAAA,GAAU0gC,EAAY7kB,MACxEoO,QAAgBjpB,KAAK4T,WAAWke,gBAAgB,iCAAkC,CACtFmI,KAAMj6B,KAAK65C,kBAAkBpB,GAC7B/Y,YAAazgC,IAAW,KAAee,KAAK8a,gBAAgBg/B,mBAAqB95C,KAAK8a,gBAAgBiW,iBAAiB9xB,GACvHq6C,MAAO59C,EAAQ49C,MACfS,OAAQr+C,EAAQq+C,OAChBC,WAAYt+C,EAAQu+C,UACpBC,aAAcx+C,EAAQy+C,YACtBC,cAAe1+C,EAAQ2+C,aACvBC,oBAAqB5+C,EAAQ6+C,qBAK/Bv6C,KAAKoe,kBAAkBkV,qBAAqBrK,EAE9C,G,CAEOuwB,aAAa58C,GAClB,OAAOoD,KAAKm4C,WAAW3zC,IAAI5H,EAC7B,CAEa49C,iBAAiB59C,EAAiBu3B,G,0CAC7C,MAAM8F,EAAOj6B,KAAKw5C,aAAa58C,GAC/B,GAAGq9B,GAAmB,mBAAXA,EAAKt9B,IAA2Bw3B,EACzC,OAAO8F,EAGT,MAAM1d,EAAQvc,KAAK44C,sBAAsBh8C,GAAIyW,KAAO,EApKzB,IAqK3B,OAAOrT,KAAK4T,WAAWotB,uBAAuB,CAC5Cl4B,OAAQ,qBACRmL,OAAQ,CACNgmB,KAAMj6B,KAAK65C,kBAAkBj9C,GAC7B2f,SAEF0kB,cAAgB0X,IAEd34C,KAAKod,gBAAgBgL,aAAauwB,EAAU7/B,OAC5C9Y,KAAK0c,gBAAgB2L,aAAaswB,EAAUrwB,OAC5CtoB,KAAK04C,oBAAoB97C,EAAI+7C,EAAUP,cAAc,GACrD,MAAMne,EAAOj6B,KAAKu4C,cAAcI,EAAU1e,MAM1C,OAJG1d,QAAsCvhB,IAA7BgF,KAAKq4C,YAAY7zC,IAAI5H,IAC/BoD,KAAKq4C,YAAYpwC,IAAIrL,EAAI+7C,EAAU8B,0BAG9BxgB,CAAI,GAGjB,G,CAEOse,cAActe,EAAmB36B,GACtC,MAAM66B,EAAUn6B,KAAKm4C,WAAW3zC,IAAIy1B,EAAKr9B,IACnC89C,EAA0B,mBAAXzgB,EAAKt9B,KAA4Bw9B,GAAyB,uBAAdA,EAAQx9B,GAezE,OAdGw9B,GACEugB,GACD9iC,GAAkBuiB,EAASF,GAG7BA,EAAOE,GAEPn6B,KAAKm4C,WAAWlwC,IAAIgyB,EAAKr9B,GAAIq9B,GAG5BygB,GACD16C,KAAKmd,UAAUxW,cAAc,oBAAqBszB,GAG7CA,CACT,CAEa0gB,gBAAgBr7C,EAAgBs7C,EAAuBnvB,G,0CAClE,MAAMxC,QAAgBjpB,KAAK4T,WAAWC,UAAU,wBAAyB,CACvEgH,KAAM7a,KAAK8a,gBAAgBiW,iBAAiBzxB,EAAOD,UAAS,IAC5D47B,WAAW,QAAe,IAC1B4f,cAAeD,EACfnvB,UAMF,OAHAzrB,KAAKoe,kBAAkBkV,qBAAqBrK,GAE5BA,EAA4BA,QAAQzqB,MAAMic,GAAwB,oBAAbA,EAAO9d,IAC9Ds9B,IAChB,G,CAEO4f,kBAAkBj9C,GACvB,MAAM+7C,EAAY34C,KAAKw5C,aAAa58C,GACpC,MAAO,CACLD,EAAG,iBACHC,GAAI+7C,EAAU/7C,GACd09B,YAAaqe,EAAUre,YAE3B,CAmBawgB,yBAAyBl+C,G,0CACpC,MAAM,WAACm8C,EAAU,cAAEC,GAAiBh5C,KAAK64C,0BAA0Bj8C,GAwBnE,MAtBkB,KAAfm8C,UACK/4C,KAAK4T,WAAWotB,uBAAuB,CAC3Cl4B,OAAQ,6BACRmL,OAAQ,CACNgmB,KAAMj6B,KAAK65C,kBAAkBj9C,GAC7BmwB,IAAK,GACLguB,QAAS,GACTzuB,OAAQysB,GAAc,GACtBx8B,MAlQqB,KAoQvB0kB,cAAgB+Z,IACd,MAAM/B,EAAgB+B,EAAsB1gC,QAAU0gC,EAAsB5C,aAAa37C,OAAS,GAAKu+C,EAAsBC,YAE7Hj7C,KAAK0c,gBAAgB2L,aAAa2yB,EAAsB1yB,OACxDtoB,KAAKod,gBAAgBgL,aAAa4yB,EAAsBliC,OACxD9Y,KAAK04C,oBAAoB97C,EAAIo+C,EAAsB5C,cAEnDY,EAAcC,EAAc,KAK3B,CACLb,aAAcp4C,KAAK44C,sBAAsBh8C,GACzC6tB,MAAoC,KAA7BzqB,KAAKq4C,YAAY7zC,IAAI5H,GAEhC,G,CAEOs+C,OAAOt+C,EAAiBu+C,GAC7B,MAAMC,EAAiBp7C,KAAK65C,kBAAkBj9C,GAC9C,IAAI+M,EAuBJ,OArBEA,EADqB,kBAAd,GAA2BwxC,EACxBn7C,KAAK4T,WAAWC,UAAU,yBAA0B,CAC5DomB,KAAMmhB,IAEoB,iBAAd,EACJp7C,KAAK4T,WAAWC,UAAU,uBAAwB,CAC1DomB,KAAMmhB,EACNC,OAAQF,IAGAn7C,KAAK4T,WAAWC,UAAU,sBAAuB,CACzDomB,KAAMmhB,EACNE,QAASt7C,KAAK8a,gBAAgBg/B,mBAC9BR,OAAO,EACPc,eAAe,EACfnmC,OAAQ,CACNtX,EAAG,WACH2N,KAAM,MAKLX,EAAQ7E,MAAMmkB,IACnBjpB,KAAKoe,kBAAkBkV,qBAAqBrK,EAAQ,GAExD,CAEasyB,cAAc9C,EAA0BxkC,EAAkBvY,G,0CACrE,MAAM0/C,EAAiBp7C,KAAK65C,kBAAkBpB,GAC9C,IAAI9uC,EACJ,GAAoB,SAAjBjO,EAAQqC,KAAiB,CAC1B,MAAMyD,EAA8B,CAClCy4B,KAAMmhB,EACNE,QAASt7C,KAAK8a,gBAAgBg/B,mBAC9B7lC,SACAqlC,MAAO59C,EAAQ8/C,QACfpB,eAAgB1+C,EAAQ+/C,WAG1B9xC,EAAU3J,KAAK4T,WAAWC,UAAU,sBAAuBrS,GAC3DxB,KAAKG,IAAI,0BAA0Bs4C,IAAej3C,E,KAC7C,CACL,MAAMA,EAA0C,CAC9Cy4B,KAAMmhB,EACNnnC,UAGFtK,EAAU3J,KAAK4T,WAAWC,UAAU,kCAAmCrS,GACvExB,KAAKG,IAAI,sCAAsCs4C,IAAej3C,E,CAGhE,MAAMynB,QAAgBtf,EAItB,OAHA3J,KAAKoe,kBAAkBkV,qBAAqBrK,GAE5BA,EAA4BA,QAAQzqB,MAAMic,GAAwB,8BAAbA,EAAO9d,GAE9E,G,CAEO++C,2BAA2BjD,GAChC,OAAOz4C,KAAK4T,WAAWC,UAAU,mCAAoC,CACnEomB,KAAMj6B,KAAK65C,kBAAkBpB,KAC5B3zC,MAAMmkB,IACPjpB,KAAKoe,kBAAkBkV,qBAAqBrK,EAAQ,GAExD,ECrXa,SAAS0yB,GAAc/iB,GACpC,MAAO,CACLj8B,EAAG,aACHC,GAAIg8B,EAAMh8B,GACV09B,YAAa1B,EAAM0B,YACnB6V,eAAgBvX,EAAMuX,eAE1B,CCNe,SAASyL,GAAmBhjB,GACzC,MAAO,CACLj8B,EAAG,kBACHC,GAAI++C,GAAc/iB,GAClBijB,YAAa,EACb3+C,OAAQ,CAAC,EAEb,C,cCTe,SAAS4+C,GAAcpM,GACpC,MAAO,CACL/yC,EAAG,qBACHC,GAAI,CACFD,EAAG,gBACHC,GAAI8yC,EAAI9yC,GACR09B,YAAaoV,EAAIpV,YACjB6V,eAAgBT,EAAIS,gBAEtB0L,YAAa,EACb3+C,OAAQ,CAAC,EAEb,CCGO,MAAM6+C,WAA6BrpC,EAA1C,c,oBACU,KAAAspC,cAAgE,CAAC,EACjE,KAAAC,QAKJ,CAAC,CA8XP,CA5XSC,YAAYC,GACjB,MAAiB,aAAVA,EAAIx/C,EAAmB,CAC5BA,EAAG,gBACHy/C,IAAKD,EAAIC,IACTC,KAAMF,EAAIE,KACVC,gBAAiBH,EAAIG,iBACnB,CACF3/C,EAAG,qBAEP,CAEO4/C,iBAAiBt9C,EAAgBmY,EAAciD,EAAQ,GAAIiS,EAAS,GAAI6vB,GAC7E,OAAOn8C,KAAK4T,WAAWC,UAAU,+BAAgC,CAC/D2oC,IAAKx8C,KAAKod,gBAAgB4d,aAAa5jB,GACvCyD,KAAM7a,KAAK8a,gBAAgBiW,iBAAiB9xB,GAC5Cob,QACAoiC,UAAWN,EAAMn8C,KAAKk8C,YAAYC,QAAOnhD,EACzCsxB,UACC,CAAmBowB,UAAW,EAAGplB,YAAY,IAAOxyB,MAAM63C,IAC3D,MAAMC,EAAUD,EAAWE,SAoB3B,OAdAF,EAAWx3C,QAAQrG,SAASsD,IACV,yBAAbA,EAAOzF,IACLyF,EAAO0kC,WACR1kC,EAAO0kC,SAAW9mC,KAAK03C,eAAezH,QAAQ7tC,EAAO0kC,WAGpD1kC,EAAOw2B,QACRx2B,EAAOw2B,MAAQ54B,KAAK88C,iBAAiBC,UAAU36C,EAAOw2B,SAI1D54B,KAAKg8C,eAAc,EAAAgB,GAAA,GAAYJ,EAASx6C,EAAOxF,KAAOwF,CAAM,IAGvDu6C,CAAU,GAErB,CAEQM,eAAe7lC,GACrBpX,KAAKod,gBAAgB8/B,YAAY,eAAep4C,MAAMq4C,IACpD,MAAMC,EAAYhmC,EAAM/X,WAClB8B,EAAQg8C,EAASp7B,WAAWs7B,GAAYA,EAAQzgD,KAAOwgD,IAC7D,IAAIC,EAEFA,GADY,IAAXl8C,EACSg8C,EAASh8C,GAET,CACRvE,GAAIwgD,EACJE,OAAQ,KAIVD,EAAQC,QACV,EAAAh5B,GAAA,GAA2B64B,EAAUE,EAAS,UAE9Cr9C,KAAK2e,gBAAgB3W,qBAAqB,gBAAgB,GAI9D,CAEOu1C,WAAWC,EAAoBpmC,EAAcqmC,GAElD,OADAz9C,KAAKi8C,QAAQ7kC,GAAS,CAACnY,OAAQu+C,EAAYlvC,KAAMC,KAAK1J,OAC/C7E,KAAKwW,mBAAmBknC,SAAStmC,OAAOpc,EAAWyiD,EAC5D,CA6GaE,kBAAkBvmC,G,qCAC7B,MAAMolC,EAAMx8C,KAAKod,gBAAgBwgC,QAAQxmC,GACzC,IAAIolC,IAAQA,EAAIt/C,OAAOs/C,MAAQA,EAAIqB,uBACjC,OAGF,MAAMC,EAAW99C,KAAKi8C,QAAQ7kC,GAC9B,OAAG0mC,WACM99C,KAAKi8C,QAAQ7kC,GAChB7I,KAAK1J,MAAQi5C,EAASxvC,KAAQ,MACzBwvC,EAAS7+C,YAHpB,CAMF,E,+RAEO8+C,kBAAkB9+C,EAAgBqjB,EAAkBlL,EAAciD,GACvEra,KAAKkf,iBAAiBs2B,SAASv2C,EAAQqjB,EAAU,IAAMtiB,KAAK8a,gBAAgBkjC,gBAAgB5mC,EAAM/X,YAAc,IAAMgb,EACxH,CAEO4jC,oBAAoBh/C,EAAgB0nB,EAAau3B,GACtD,OAAOl+C,KAAK4T,WAAWC,UAAU,gCAAiC,CAChEgH,KAAM7a,KAAK8a,gBAAgBiW,iBAAiB9xB,GAC5Ck/C,QAAQ,EAAA9+B,GAAA,GAAmBsH,GAC3Brc,KAAM4zC,EAAO5zC,MACZ,CAAmBoyC,UAAW,EAAGplB,YAAY,GAClD,CAoBO8mB,iBAAiBn/C,EAAgBmY,EAAcinC,EAA2B3iD,EAQ5E,CAAC,GACJ,MAAM4iD,EAAet+C,KAAKg8C,cAAcqC,GACxC,IAAIC,EACF,OAGFt+C,KAAKi9C,eAAe7lC,GACpB,MAAM7P,EAAW82C,EAAkBz+C,MAAM,KACnC2+C,EAAUh3C,EAAS2G,QACnBswC,EAAWj3C,EAASvK,KAAK,KAQ/B,GAPAtB,EAAQwc,SAAWd,EACnB1b,EAAQkhD,QAAU2B,EAClB7iD,EAAQ+iD,SAAWD,EAChBF,EAAaI,aAAaC,eAC3BjjD,EAAQkjD,YAAcN,EAAaI,aAAaC,cAGf,yBAAhCL,EAAaI,aAAa/hD,EAC3BjB,EAAQu4B,SAAWqqB,EAAaI,aAAazqB,SAC7Cj0B,KAAKwW,mBAAmBqoC,SAAS5/C,EAAQq/C,EAAaI,aAAa78C,QAASnG,OACvE,CACL,IACIojD,EAA4DC,EAD5DC,EAAU,GAEd,MAAMC,EAAcX,EAAaI,aACjC,OAAOO,EAAYtiD,GACjB,IAAK,4BAGH,GAFAqiD,EAAUC,EAAYp9C,QAEA,yBAAnBy8C,EAAa3hD,EAA8B,CAC5C,MAAM,SAACmqC,EAAQ,MAAElO,GAAS0lB,EAExBQ,EADChY,EACY,GAAsBA,GAEtB8U,GAAmBhjB,E,CAIpC,MAGF,IAAK,2BACHkmB,EAAa,CACXniD,EAAG,qBACH8/C,UAAWz8C,KAAKk8C,YAAY+C,EAAY9C,MAG1CzgD,EAAQwjD,SAAWD,EAAY9C,IAE/B,MAGF,IAAK,6BACH2C,EAAa,CACXniD,EAAG,kBACH8/C,UAAWz8C,KAAKk8C,YAAY+C,EAAY9C,KACxC1wB,MAAOwzB,EAAYxzB,MACnB0zB,QAASF,EAAYE,QACrBC,SAAUH,EAAYG,SACtBC,SAAUJ,EAAYI,SACtBC,WAAYL,EAAYK,YAG1B5jD,EAAQwjD,SAAWD,EAAY9C,IAE/B,MAGF,IAAK,+BACH2C,EAAa,CACXniD,EAAG,oBACH4iD,aAAcN,EAAYM,aAC1BC,WAAYP,EAAYO,WACxBC,UAAWR,EAAYQ,UACvBC,MAAOT,EAAYS,OAGrB,MAGF,IAAK,+BAoBHX,EAAe,CACbpiD,EAAG,sBACH8uB,MAAOwzB,EAAYxzB,MACnBk0B,YAAaV,EAAYU,YACzB/mB,MAAOqmB,EAAYrmB,MACnBgnB,SAAUX,EAAYW,SACtBC,aAAcZ,EAAYY,aAC1B3iD,OAAQ,CACN4iD,2BAA4Bb,EAAY/hD,OAAO4iD,2BAC/CplD,KAAMukD,EAAY/hD,OAAOxC,MAE3BqlD,iBAAa/kD,IAOf8jD,GAAcC,IAChBD,EAAa,CACXniD,EAAG,sBACHoiD,iBAIJ/+C,KAAKwW,mBAAmBwpC,UAAU/gD,EAAQ6/C,EAAYpjD,E,CAE1D,E,eC5XK,MAAMukD,GAAb,cACU,KAAAC,QAAU,CAMpB,CAJS12B,sBAAsBzb,GAC3B,MAAMoyC,IAAQngD,KAAKkgD,QACnB,OAAO,EAAAxkC,GAAA,GAAkB3N,IAAcoyC,EAAO,KAAuB,EACvE,E,qCCfa,SAASC,GAAoB1jD,EAAa2jD,GACvD,GAAG3jD,EAAID,OAAS4jD,EAAW,MAAO,CAAC3jD,GACnC,IAAID,EAAS,EAAG6jD,EAAsB,EAAGC,EAAa,EACtD,MACM32B,EAAgB,GAEhB42B,EAAOC,IACX,IAAIC,EAAOhkD,EAAI+K,MAAM64C,EAAqBG,GAC1C,MAAME,EAAcJ,IACjBG,EAAKjkD,OAAS4jD,IAEED,GADIM,EAAKj5C,MAAM44C,GACmBA,GAC1CvhD,SAAS4hD,IAChB92B,EAAI22B,KAAgBG,CAAI,IAG1BA,EAAOA,EAAKj5C,MAAM,EAAG44C,IAGvBC,EAAsBG,EACtBhkD,EAAS,EACTmtB,EAAI+2B,IAAgB/2B,EAAI+2B,IAAgB,IAAMD,CAAI,EAGpD,IAAItZ,EAAY,EAChB,OAAG,CACD,IAAIjmC,EAAQzE,EAAIjC,QAvBA,IAuBmB2sC,GACnC,IAAc,IAAXjmC,EAAc,CACZimC,IAAe1qC,EAAID,OAAS,GAC7B+jD,IAGF,K,CAGFr/C,GAhCgB,IAgCG1E,OAEnB,MAAMmkD,EAAaz/C,EAAQimC,EACvB3qC,EAASmkD,EAAcP,GACzBG,EAAI/jD,GAGN2qC,EAAYjmC,EACZ1E,GAAUmkD,C,CAGZ,OAAOh3B,CACT,C,gFCEA,MAAMi3B,GAAiB,IAlChB,MAGL/gD,cACEE,KAAK8gD,KAAO,IAAItvC,GAClB,CAEOuvC,QACQ,kBAERz6C,iBAAiB,YAAY,CAACW,EAAOo0C,KAC5Br7C,KAAK8gD,KAAKt8C,IAAI62C,GACtBp0C,MAAQA,CAAK,GAErB,CAEO+5C,UACL,MAAO,IAAIhhD,KAAK8gD,KAAK1qC,UAAUtZ,QAAQmkD,KAAUA,EAAIh6C,OACvD,CAEOi6C,OAAO7F,GACZ,MAAM4F,EAAW,CACf5F,SACAp0C,WAAOjM,GAGTgF,KAAK8gD,KAAK74C,IAAIozC,EAAQ4F,EACxB,CAEOE,UAAU9F,GACfr7C,KAAK8gD,KAAKj9C,OAAOw3C,EACnB,GAIF,OAAmB,oBAAgCwF,IACnD,Y,wBChDe,SAASO,GAAiB1R,GACvC,MAAO,CACL/yC,EAAG,gBACHC,GAAI8yC,EAAI9yC,GACR09B,YAAaoV,EAAIpV,YACjB6V,eAAgBT,EAAIS,eAExB,C,0BCVe,SAASkR,GAA8BjwC,EAAQ/J,EAAchD,GAEvEA,EAAO+M,EAAI/J,IAAO,SACT+J,EAAI/J,EAClB,C,sTCsEA,MAyFMi6C,GAAgBvqB,IAEpBA,GAAI,EAGAwqB,IAA0B,EAUzB,MAAMC,WAA2B9uC,EAAxC,c,oBA2BU,KAAA+uC,kBAEJ,CAAC,EACG,KAAAC,mBAA4C,CAAC,EAC7C,KAAAC,iBAAwD,CAAC,EAC1D,KAAAh5B,eAA6C,CAAC,EAC7C,KAAAi5B,sBAOJ,CAAC,EAEG,KAAAC,sBAAwB,IAAI,KAAkB,IAE9C,KAAAC,mBAA6G,IAAItwC,IAEjH,KAAAuwC,cAAoE,IAAIvwC,IAExE,KAAAwwC,UAAY,EAEb,KAAA/3B,eAA6C,CAAC,EAC9C,KAAAC,eAA6C,CAAC,EAG7C,KAAA+3B,mBAAuF,IAAIzwC,IAC5F,KAAA0X,8BAA8D,CAAC,EAG9D,KAAAg5B,sBAIH,CAAC,EAGE,KAAAC,yBAAiH,IAAI3wC,IAEtH,KAAArR,KAAM,EAAAsI,EAAA,IAAO,WAAY,WAAiB,WAAiB,KAAAD,IAAe,WAEzE,KAAA45C,cAAgB,EAEhB,KAAAC,QAA0E,CAAC,EAI3E,KAAAC,eAAuD,CAAC,EACxD,KAAAC,wBAA4D,CAAC,EAE7D,KAAAC,aAKJ,CAAC,EA4KE,KAAA3jD,MAAS0M,IACXvL,KAAKyiD,WACNziD,KAAKyiD,WAAWC,SAEhB1iD,KAAKyiD,YAAa,UAClBziD,KAAK2iD,mBAAqB,CAAC,GAG7B3iD,KAAK4iD,wBAA0B,CAAC,EAChC5iD,KAAK6iD,uBAAyB,CAAC,EAC/B7iD,KAAK8iD,yBAA2B,CAAC,EACjC9iD,KAAK+iD,iBAAmB,CAAC,EACzB/iD,KAAKgjD,eAAiB,CAAC,EACvBhjD,KAAKijD,gBAAkB,CAAC,EACxBjjD,KAAKkjD,eAAiB,CAAC,EACvBljD,KAAKmjD,iCAAmC,CAAC,EACzCnjD,KAAKojD,iBAAmB,CAAC,EAEzBpjD,KAAKmrB,gBAAkBnrB,KAAKmrB,eAAetsB,MAAM0M,GACjDvL,KAAKqgB,gBAAkBrgB,KAAKqgB,eAAexhB,MAAM0M,EAAK,EA+wGhD,KAAA83C,iBAAmB,KACzB,IAAIC,EAAe,EACnB,MAAMC,EAAmD,IAAI/xC,IAEvDgyC,EAAiBnqC,I,MACrB,MAAM,OAACpa,GAAUoa,EACjBrZ,KAAKmrB,eAAehQ,WAAW,CAAC9B,WAC5BrZ,KAAK8a,gBAAgBiL,UAAU9mB,KACjCqkD,EAAe3iC,KAAK4E,IAAI+9B,EAAcjqC,EAAO+F,aAAe,IAG9D,IAAI0J,EAAQy6B,EAAU/+C,IAAIvF,GACtB6pB,GACFy6B,EAAUt7C,IAAIhJ,EAAQ6pB,EAAQ,CAAC,GAGjB,eAAbzP,EAAO1c,GACK,QAAb,EAACmsB,EAAM7L,cAAM,QAAZ6L,EAAM7L,OAAW,IAAIzL,KAAOvJ,IAAIoR,EAAOzc,GAAIyc,GAE5CyP,EAAMzP,OAASA,C,EAInB,IAAI,MAAOpa,EAAQmS,KAAQpR,KAAKiiD,mBAAoB,CAClD,MAAMwB,EAAkB,WAAYryC,GAC9B,OAACiI,EAAM,OAAE4D,GAAU7L,EAEtBqyC,IACGpqC,EAEMrZ,KAAKmrB,eAAe7P,cAAcrc,IAC1CukD,EAAcnqC,GAFdrZ,KAAK2f,mBAAmB1gB,EAAOI,aAMhC4d,IACDA,SAAAA,EAAQne,SAAQ,CAAC8c,EAAOhf,KAClBgf,EAEM5b,KAAKmrB,eAAetP,cAAc5c,EAAQrC,IAClD4mD,EAAc5nC,GAFd5b,KAAKmrB,eAAe0B,kBAAkB5tB,EAAQrC,E,KAUlC,IAAjB0mD,GACDtjD,KAAK0jD,mBAAmBJ,GAG1BtjD,KAAKmd,UAAUxW,cAAc,sBAAuB48C,GACpDvjD,KAAKiiD,mBAAmBpjD,OAAO,EA+ZzB,KAAA8kD,oBAAsB,KAC5B/0C,EAAA,eAAiB5O,KAAK4jD,4BACtB5jD,KAAK4jD,gCAA6B5oD,EAKlC,IAAI,MAAMqM,KAAOrH,KAAKkiD,sBAAuB,CAC3C,MAAOjjD,EAAQqjB,GAAYjb,EAAIzH,MAAM,KAK/BikD,EAAqB7jD,KAAKkiD,sBAAsB76C,GACtDrH,KAAK8jD,sBAAsB7kD,EAAOI,WAAYijB,GAAYA,OAAWtnB,GACpE8J,MAAK,EAAEw0C,QAAOyK,6BACb,MAAMzkC,EAAaukC,EAAmBvkC,WAClCg6B,IAAUh6B,EAAWpiB,OAAO8mD,YAAe1kC,EAAWpiB,OAAOqtB,QAK9DjL,EAAWpiB,OAAOqtB,QACnBvqB,KAAKikD,mBAAmB3kC,EAAY,CAClC4kC,SAAUL,EAAmBK,SAC7BH,0B,IAOR/jD,KAAKkiD,sBAAwB,CAAC,CAAC,EAmBzB,KAAAiC,kBAAqB1pC,IAC3B,MAAMmnB,EAAWnnB,EAAOwgB,UAExB,IADoBj7B,KAAKyhD,kBAAkB7f,GAEzC,OAGF,MAAMjb,GAAM,EAAAjL,GAAA,GAAkBjB,EAAO7d,IACrCoD,KAAK0hD,mBAAmB/6B,GAAOib,CAAQ,EAQjC,KAAAwiB,mBAAsB3pC,I,YAC5B,MAAM5Y,EAAU4Y,EAAO5Y,QACjB5C,EAASe,KAAKqkD,eAAexiD,GAC7B2B,EAAUxD,KAAKwmB,0BAA0BvnB,GAGzCqlD,EAAmC,+BAAb7pC,EAAO9d,EAGnCqD,KAAKuf,aAAa,CAAC1d,GAAU,CAAC2B,QAASxD,KAAKukD,qBAAqBtlD,EAAQ,aAazE,MAAM8gB,EAAU/f,KAAK8a,gBAAgBiF,QAAQ9gB,GACvCulD,EAAYxkD,KAAKykD,aAAa5iD,GAC9BygB,EAAWkiC,GAAaA,EAAU5kD,MAAM,KAAK,QAAK5E,EAClDqe,EAASrZ,KAAKmrB,eAAe5H,iBAAiBtkB,EAAQqlD,EAAsBhiC,OAAWtnB,GAE7F,KAAKqe,GAAUrZ,KAAKmiD,yBAAyBzjD,IAAIO,MAAaqlD,EAAqB,CACjF,IAAI/mB,GAAO,EAKX,GAJGt+B,EAAO+nB,cACRuW,EAAOv9B,KAAK0c,gBAAgB4gB,SAASr+B,EAAO2d,aAG3C2gB,EAED,YADAv9B,KAAK0kD,2BAA2BzlD,EAAQwb,E,CAO5C,GAAG6H,IAAagiC,EAAqB,CACnC,MAAMK,EAA2C,QAA3B,EAAA3kD,KAAKgjD,eAAe/jD,UAAO,eAAGqjB,GAC9C7H,EAAS,CACb9d,EAAG,6BACHkF,WAGC7B,KAAK0c,gBAAgBqD,QAAQ9gB,EAAO2d,cAAgB5c,KAAKmrB,eAAetP,cAAc5c,EAAQqjB,GAE/FtiB,KAAK0kD,2BAA2BzlD,EAAQwb,EAAQ6H,GACxCqiC,GACR3kD,KAAKokD,mBAAmB3pC,E,CAI5B,GAAiB,mBAAd5Y,EAAQlF,EAAwB,CACjC,MAAM,OAACic,GAAU/W,EAWjB,GAVgB,6BAAb+W,EAAOjc,GAAoCkF,EAAQmyB,UACpDh0B,KAAKmd,UAAUxW,cAAc,eAAgB,CAC3C1H,OAAQ4C,EAAQmyB,SAAS4wB,iBACvB5kD,KAAK8a,gBAAgB9b,UAAU6C,EAAQmyB,SAAS4wB,kBAChD/iD,EAAQ5C,OACV0nB,IAAK9kB,EAAQgjD,aACbC,eAAgBjjD,IAIJ,2BAAb+W,EAAOjc,IAAmC2nD,EAAqB,CAChE,MAAM1oC,EAAQ5b,KAAKmrB,eAAetP,cAAc5c,EAAQqjB,GACxD,GAAI1G,EAEG,CACL,MAAMyP,GAAW,EAAAyD,GAAA,GAAKlT,QAEF5gB,IAAjB4d,EAAO6S,QACR7P,EAAM6P,MAAQ7S,EAAO6S,YAGFzwB,IAAlB4d,EAAO4pB,QACR6e,GAAezlC,EAAM1e,OAAQ,SAAU0b,EAAO4pB,aAG3BxnC,IAAlB4d,EAAO+I,QACR0/B,GAAezlC,EAAM1e,OAAQ,SAAU0b,EAAO+I,aAGpB3mB,IAAzB4d,EAAO2S,gBACR3P,EAAM2P,cAAgB3S,EAAO2S,eAG/BvrB,KAAKob,yBAAyBnc,EAAQ2c,GAEtC5b,KAAKmrB,eAAeC,mBAAmBxP,EAAOyP,E,MAtB9CrrB,KAAKmrB,eAAe0B,kBAAkB5tB,EAAQqjB,E,EAkCpDtiB,KAAKuf,aAAa,CAAC1d,GAAU,CAAC2B,YAO9BxD,KAAK+kD,oBAAoBljD,GACzB,MAAMwkB,EAAiBrmB,KAAKsmB,kBAAkBrnB,EAAQqlD,EAAsBhiC,OAAWtnB,GAEnFspD,GACFtkD,KAAKglD,6BAA6BnjD,GAIpC,MAAMojD,EAA2BxqC,EAAewqC,eAEhD,GADqB5+B,EAAeI,QAAQy+B,UAAUrjD,EAAQ8kB,MAE5D,IAAIs+B,EACF,OAAO,MAEJ,CAEL,MAAME,EAAa9+B,EAAeI,QAAQ7e,MAC1C,GAAGu9C,EAAW16B,MAAM,aAAkB,CACpC,IAAI9kB,EAAI,EACR,IAAI,MAAMlJ,EAAS0oD,EAAW1oD,OAAQkJ,EAAIlJ,KACrCoF,EAAQ8kB,IAAMw+B,EAAWx/C,MADsBA,GAMpDw/C,EAAWr7C,OAAOnE,EAAG,EAAG9D,EAAQ8kB,I,MAEhCN,EAAeI,QAAQP,QAAQrkB,EAAQ8kB,KAGb,OAAzBN,EAAe/L,SACd+L,EAAe/L,K,GAIjB+L,EAAewC,OAAShnB,EAAQ8kB,IAAMN,EAAewC,SACvDxC,EAAewC,MAAQhnB,EAAQ8kB,KAG9B3mB,KAAK4qB,mBAAmBvE,EAAgBxkB,IACzC7B,KAAKmd,UAAUxW,cAAc,uBAAwB,CAAC1H,WAGxD,MAAMgZ,EAASpW,EAAQoW,OACvB,GAAGA,EAAOxY,WAAaoC,EAAQ3E,OAAO0sB,KAAO/nB,EAAQ4nB,QAAS,CAC5DzpB,KAAKod,gBAAgBgoC,gBAAgBntC,EAAQpW,EAAQ4hB,MAErD,MAAM7K,EAA4B,CAChCjc,EAAG,2BAGL,IAAI8d,EAEFA,EADCxb,EAAOQ,SACC,CACP9C,EAAG,mBACHic,SACAxZ,QAAS6Y,GAEHjY,KAAK8a,gBAAgBiL,UAAU9mB,GAC9B,CACPtC,EAAG,0BACHic,SACArZ,WAAYN,EAAO2d,WACnB6M,QAASzpB,KAAK8a,gBAAgB4O,cAAczR,GAC5Ci9B,WAAY5yB,GAAW,EAAAjD,GAAA,GAAmBiD,QAAYtnB,GAG/C,CACP2B,EAAG,uBACHic,SACApZ,QAASP,EAAO2d,WAChB6M,QAASzpB,KAAK8a,gBAAgB4O,cAAczR,IAIhDjY,KAAKoe,kBAAkBiX,mBAAmB5a,E,CAK5Cza,KAAKqlD,iBAAiBxjD,GAGtB,MAAM2f,EAAwB,gBAAdnI,aAAM,EAANA,EAAQ1c,GACxB,GAAI2nD,IAAwB9iC,IAAanI,EACvC,OAGF,MAAMisC,GAAezjD,EAAQ3E,OAAO0sB,KAAO/nB,EAAQ3E,OAAOqtB,OAGxD,GAAG+6B,GAAezjD,EAAQ8kB,IAAMtN,EAAO+F,YAAa,CAClD,MAAM8L,EAAqBlrB,KAAKmrB,eAAe5G,kCAAkClL,KAE/EA,EAAOmR,aACN3oB,EAAQ3E,OAAO8mD,cACd3qC,EAAO2W,sBACThwB,KAAKulD,qBAAqBtmD,EAAQ4C,EAAQ8kB,KAAK,EAAMnF,EAAUc,OAAWtnB,IAG5EkwB,G,CAQJ,GALKrpB,EAAQ8kB,KAAOtN,EAAO+F,aACvBpf,KAAKwlD,oBAAoB3jD,EAASwX,KAIhCirC,IAAwBvkC,GAAYyB,IAAY8jC,EAAa,CACjE,MAAMG,EAAajB,GAAavlD,EAC1B4kD,EAA0D,QAAxC,KAAG7jD,KAAKkiD,uBAAsBuD,UAAU,UAAVA,GAAgB,CACpEvB,SAAU,EACVjsC,OAAQ,MAGP4rC,EAAmB5rC,SAAWA,IAC/B4rC,EAAmB5rC,OAASA,EAC5B4rC,EAAmBK,SAAW,GAG5BriD,EAA4BkyB,YAC5B8vB,EAAmBK,SAGvBL,EAAmBvkC,WAAazd,EAED,QAA/B,EAAA7B,KAAK4jD,kCAA0B,QAA/B5jD,KAAK4jD,2BAA+Bh1C,EAAA,aAAe5O,KAAK2jD,oBAAqB,G,GAIzE,KAAA+B,yBAA4BjrC,IAClC,MAAM,KAACI,EAAI,OAAEsjC,EAAM,UAAExd,GAAalmB,EAC5BkM,GAAM,EAAAjL,GAAA,GAAkByiC,GACxBl/C,EAASe,KAAK8a,gBAAgB9b,UAAU6b,GACxChZ,EAAqB7B,KAAK0f,iBAAiBzgB,EAAQ0nB,GAEzD,GAAkB,aAAf9kB,aAAO,EAAPA,EAASlF,GACV,OAGF,MAAM6b,EAAkBmoB,aAAS,EAATA,EAAWloB,iBACnC,IAAGD,aAAe,EAAfA,EAAiB/b,SAAUoF,EAAQ3E,OAAO0sB,IAAK,CAChD,MAAM+7B,EAAiBntC,EAAgBA,EAAgB/b,OAAS,GAC1DmpD,EAAoB/jD,EAAQ8+B,UAC5BklB,EAA0BD,aAAiB,EAAjBA,EAAmBntC,iBAEjDzY,KAAK8a,gBAAgB9b,UAAU2mD,EAAehtC,WAAa3Y,KAAK8a,gBAAgB7b,QAC7E4mD,KACDA,EAAwBppD,QAAU+b,EAAgB/b,SAEjDopD,IACA,EAAA5vC,EAAA,GAAU0vC,EAAgBE,EAAwBA,EAAwBppD,OAAS,KAGtFuD,KAAK8jD,sBAAsB7kD,GAAQ6F,MAAK,EAAEw0C,QAAOyK,6BAC5BA,EAAuB+B,eAC1C9lD,KAAKikD,mBAAmBpiD,EAAS,CAC/BkkD,aAAcJ,EACd5B,0BACA,G,CAKR,MAAM18C,EAAMxF,EAAQ5C,OAAS,IAAM4C,EAAQ8kB,IAC3C3mB,KAAKgmD,gBAAgB,qBAAsBhmD,KAAKimD,qBAAsB5+C,GAAK,KAAM,EAAAynB,GAAA,GAAKjtB,EAAQ8+B,aAE9F9+B,EAAQ8+B,UAAYA,EAEhBlmB,EAAOirB,OACT1lC,KAAKkmD,+BAA+BrkD,E,EAIhC,KAAAskD,yBAA4B1rC,IAElC,MAAMxb,EAASe,KAAK8a,gBAAgB9b,UAAWyb,EAAOI,KAA+BA,MAC/ExB,EAASrZ,KAAKsb,cAAcrc,GAElC,GAAIoa,EAEG,CACL,MAAM6R,EAAqBlrB,KAAKmrB,eAAe5G,kCAAkClL,GAE7EoB,EAAOvd,OAAOqtB,OAGhBlR,EAAOnc,OAAOkpD,aAAc,SAFrB/sC,EAAOnc,OAAOkpD,YAKvBl7B,IACAlrB,KAAKmrB,eAAehF,iBAAiB9M,GACrCrZ,KAAKmd,UAAUxW,cAAc,sBAAuB,IAAI6K,IAAI,CAAC,CAACvS,EAAQ,CAACoa,a,MAZvErZ,KAAKob,yBAAyBnc,E,EAgB1B,KAAAonD,oBAAuB5rC,I,QAC7B,MAAM5Y,EAAU4Y,EAAO5Y,QACjB5C,EAASe,KAAKqkD,eAAexiD,GAC7B8kB,GAAM,EAAAjL,GAAA,GAAkB7Z,EAAQjF,IAChC4G,EAAUxD,KAAKwmB,0BAA0BvnB,GAC/C,IAAIuE,EAAQ9E,IAAIioB,GAEd,OAKF,MAAM2/B,EAAsBtmD,KAAK4mB,sBAAsBpjB,EAASmjB,GAChE3mB,KAAKuf,aAAa,CAAC1d,GAAU,CAAC2B,YAC9B,MAAM+iD,EAAsBvmD,KAAK4mB,sBAAsBpjB,EAASmjB,GAEhE3mB,KAAKwmD,oBAAoBF,EAAYC,EAAY/iD,GAEjD,MAAM6V,EAASrZ,KAAKsb,cAAcrc,GAQ5BwnD,GAAeptC,aAAM,EAANA,EAAQ+F,eAAgBuH,EAC7C,GAAI9kB,EAAmC6kD,cAClCD,GACDzmD,KAAKmd,UAAUxW,cAAc,eAAgB,CAAC1H,SAAQoa,eAEnD,CACL,IAAIstC,GAAoB,EAExB,GAAqB,aAAlBL,aAAU,EAAVA,EAAY3pD,MAAoB,EAAAsZ,EAAA,GAAUqwC,EAAW3lB,UAAY4lB,EAA+B5lB,WAAY,CAC7G,MAAMimB,EAAgBL,EAA+B5lB,UACpD4lB,EAA+B5lB,UAAY2lB,EAAW3lB,UACvD3gC,KAAKoe,kBAAkBiX,mBAAmB,CACxC14B,EAAG,yBACHke,KAAM7a,KAAK8a,gBAAgB4O,cAAczqB,GACzCk/C,OAAQt8C,EAAQjF,GAChB+jC,UAAWimB,IAGbD,GAAoB,C,CAGtBA,GAAqB3mD,KAAKmd,UAAUxW,cAAc,eAAgB,CAChEwvC,WAAY3yC,EAAQ6D,IACpBpI,SACA0nB,MACA9kB,YAGC4kD,GACDzmD,KAAKmrB,eAAehF,iBAAiB9M,GAGvC,MAAMlV,EAA8C,IAAIqN,IAClDuX,EAAiB,KACrB,IAAID,EAAQ3kB,EAAIK,IAAIvF,GAKpB,OAJI6pB,GACF3kB,EAAI8D,IAAIhJ,EAAQ6pB,EAAQ,CAAC,GAGpBA,CAAK,GAGV29B,GAAiB5kD,EAA4BglD,aAAextC,IAC9D0P,IAAiB1P,OAASA,GAG5B,MAAMmrC,EAAYxkD,KAAKykD,aAAa5iD,GACpC,GAAG2iD,EAAW,CACZ,MAAM/oC,GAAW+oC,EAAU5kD,MAAM,KAAK,GAChCgc,EAAQ5b,KAAKmrB,eAAetP,cAAc5c,EAAQwc,GACrDG,IACuB,QAAxB,KAACmN,KAAiB9L,cAAM,UAANA,OAAW,IAAIzL,KAAOvJ,IAAIwT,EAASG,E,CAItDzX,EAAIkP,MACLrT,KAAKmd,UAAUxW,cAAc,sBAAuBxC,E,GAKlD,KAAA2iD,oBAAuBrsC,IAG7B,MAAMqL,EAAarL,EAAyClb,WACtDspB,GAAQ,EAAAnN,GAAA,GAAmBjB,EAAyCssC,QAAWtsC,EAAmDusC,aAClI1kC,GAAW,EAAA5G,GAAA,GAAmBjB,EAAmDy6B,YACjFj2C,EAAS6mB,EAAYA,EAAUzmB,UAAS,GAAQW,KAAK8a,gBAAgB9b,UAAWyb,EAAyCI,MAEzHyP,EAAqB,4BAAb7P,EAAO9d,GACN,4BAAb8d,EAAO9d,GACM,sCAAb8d,EAAO9d,QAAmD3B,EAEtD+kB,IAAU+F,GAAY9lB,KAAK0c,gBAAgBqD,QAAQ+F,GACnDtiB,EAAUxD,KAAKwmB,0BAA0BvnB,GACzCwnB,GAAU,EAAAwgC,GAAA,GAAqBzjD,EAAS,QACxCkkB,EAAcpF,GAAYvC,EAC9B/f,KAAKmrB,eAAetP,cAAc5c,EAAQqjB,GAC1CtiB,KAAKsb,cAAcrc,GACfioD,EAAoBzsC,EAAyC0sC,mBACnE,IAAItiC,EAAiB,EACjBuiC,EAAyB,EACzBC,GAAgB,EAIpB,MAAMhhC,EAAiBrmB,KAAKsmB,kBAAkBrnB,EAAQqjB,GAMtD,GAJGrjB,EAAOQ,UAAY6qB,GACpBtqB,KAAKod,gBAAgBgoC,gBAAgBnmD,EAAOoxB,YAG3C/N,EAAU,CACX,MAAMglC,EAAatnD,KAAKojD,iBAAiBnkD,EAAS,IAAMqjB,GACxD,GAAGglC,EAAY,CACb,MAAOroD,EAAQ0nB,GAAO2gC,EAAW1nD,MAAM,KACvCI,KAAKuzB,cAAct0B,EAAOI,YAAasnB,EAAK,kB,EAIhD,MAAMuE,EAAqBxD,GAAe1nB,KAAKmrB,eAAe5G,kCAAkCmD,GAC1FmD,EAAY7qB,KAAKunD,qBAAqBtoD,EAAQqjB,GAEpD,IAAI,IAAI3c,EAAI,EAAGlJ,EAASgqB,EAAQhqB,OAAQkJ,EAAIlJ,EAAQkJ,IAAK,CACvD,MAAMghB,EAAMF,EAAQ9gB,GACpB,GAAGghB,EAAMkC,EACP,SAGF,MAAMhnB,EAAqB2B,EAAQgB,IAAImiB,GAEvC,GAAG9kB,EAAQ3E,OAAO0sB,MAAQU,EACxB,SAGF,MAAMk9B,GAAkB,EAAAC,GAAA,GAAmB5lD,EAASke,GACpD,IAAGuC,GAAYklC,IAAoBllC,EAAnC,CAMA,KAFiBzgB,EAAQ3E,OAAOqtB,QAAWM,GAAaA,EAAYlE,GAGlE,aAIK9kB,EAAQ3E,OAAOqtB,OACtB88B,IAAAA,GAAkB,IAEdxlD,EAAQ3E,OAAO0sB,KAAOlC,SACA1sB,IAArBksD,IACDriC,IAAmB6C,EAAY8C,cAG9B3oB,EAAQ3E,OAAO8mD,YAChBoD,IAA2B1/B,EAAYsI,sBACvChwB,KAAKulD,qBAAqBtmD,EAAQ4C,EAAQ8kB,KAAK,KAInD3mB,KAAKmd,UAAUxW,cAAc,sBAAuB,MAAQggB,E,EAM9D,GAHG2D,EAAOjE,EAAeyE,gBAAkBjC,EACtCxC,EAAewE,UAAYhC,EAE7BnB,EAAa,CAId,GAHG4C,EAAO5C,EAAY0C,mBAAqBvB,EACtCnB,EAAYyC,kBAAoBtB,GAEjCyB,EAAO,CACT,IAAIo9B,OACoB1sD,IAArBksD,EACDQ,EAAWR,EAEXriC,EAAiB,GACjBgE,GAASnB,EAAYtI,cACpByL,EAED68B,EAAW,EACH7iC,GAAkB6C,EAAYtI,YAAcyJ,IACpD6+B,EAAW7iC,QAGG7pB,IAAb0sD,IACDhgC,EAAY8C,aAAek9B,IAG1BN,EAAyB,IAAM1/B,EAAY8C,gBAC5C9C,EAAYsI,sBAAwB,E,CAIxC9E,SAAAA,IAEAlrB,KAAKmrB,eAAevN,wBAAwB8J,GAE5C1nB,KAAKmd,UAAUxW,cAAc,gBAAiB,CAAC1H,SAAQoa,OAAQqO,IAC/D1nB,KAAKmrB,eAAehF,iBAAiBuB,GAEjC2/B,QAAsCrsD,IAArBksD,GAAmC58B,IAAS5C,EAAY8C,eACtD,eAAlB9C,EAAY/qB,EACbqD,KAAKmrB,eAAe0B,kBAAkB5tB,EAAQqjB,GAE9CtiB,KAAK2f,mBAAmB1gB,G,CAS9B,GAJGooD,GACDrnD,KAAKmd,UAAUxW,cAAc,kBAG3B2b,GAAYwD,EAAW,CACzB,MAAM6hC,EAAgB1oD,EAAS,IAC/B,IAAI,MAAMulD,KAAaxkD,KAAKojD,iBAC1B,GAAwC,IAArCoB,EAAU/pD,QAAQktD,GAAsB,CACzC,MAAO1oD,EAAQ0nB,GAAO3mB,KAAKojD,iBAAiBoB,GAAW5kD,MAAM,KAC7DI,KAAKmd,UAAUxW,cAAc,kBAAmB3G,KAAK0f,iBAAiBzgB,EAAOI,YAAasnB,G,IAM1F,KAAAihC,6BAAgCntC,IACtC,MAAMqL,EAAarL,EAAoDlb,WACjEsoD,EAAYptC,EAAoDy6B,WAChE5yB,EAAWulC,GAAW,EAAAnsC,GAAA,GAAkBmsC,QAAY7sD,EACpD8sD,EAAQrtC,EAA6C8N,SAASpkB,KAAKvH,IAAO,EAAA8e,GAAA,GAAkB9e,KAC5FqC,EAAS6mB,EAAYA,EAAUzmB,UAAS,GAAQW,KAAK+nD,iBAAiBD,GAC5E,IAAI,IAAIniD,EAAI,EAAGlJ,EAASqrD,EAAKrrD,OAAQkJ,EAAIlJ,IAAUkJ,EAAG,CACpD,MAAMghB,EAAMmhC,EAAKniD,GACX9D,EAAqB7B,KAAK0f,iBAAiBzgB,EAAQ0nB,GACtD9kB,EACEA,EAAQ3E,OAAO8qD,sBACTnmD,EAAQ3E,OAAO8qD,aACtBhoD,KAAKkmD,+BAA+BrkD,IAEhCA,EAAQ3E,OAAO0sB,KAAO/nB,EAAQ3E,OAAO8mD,WACvChkD,KAAKulD,qBAAqBtmD,EAAQ0nB,GAAK,EAAOrE,IAIlDtiB,KAAKioD,mCAAmChpD,EAAQqjB,E,CAIpDtiB,KAAKmd,UAAUxW,cAAc,sBAAuB,CAAC1H,SAAQ6oD,QAAM,EAG7D,KAAAI,iCAAoCztC,IAC1C,MAAMxb,EAASwb,EAAOlb,WAAWF,UAAS,GACpConB,EAAUzmB,KAAKsmB,kBAAkBrnB,GAAQwnB,QAAQhf,MACjD0gD,GAAiB,EAAAzsC,GAAA,GAAkBjB,EAAO2tC,kBAC1C7/B,EAAW9B,EAAQ3pB,QAAQ6pB,GAAQA,GAAOwhC,IAE/C1tC,EAAqD8N,SAAWA,EACjEvoB,KAAKqoD,uBAAuB5tC,EAAoD,EAG1E,KAAA4tC,uBAA0B5tC,I,MAChC,MAAMqL,EAAarL,EAA8Clb,WAE3DgpB,EAAY9N,EAAqD8N,SAASpkB,KAAKvH,IAAO,EAAA8e,GAAA,GAAkB9e,KACxGqC,EAAiB6mB,EAAYA,EAAUzmB,UAAS,GAAQW,KAAK+nD,iBAAiBx/B,GAEpF,IAAItpB,EACF,OAGFe,KAAK4T,WAAW8nB,WAAW,8BAA+BznB,GACjDjU,KAAK8a,gBAAgB9b,UAAUiV,EAAO4G,QAAU5b,IAGzD,MAAMqpD,EAA0B,IAAIlqD,IAAO6e,EAAkC,IAAIzL,IACjF,IAAI,MAAMmV,KAAO4B,EAAU,CACzB,MAAM1mB,EAAU7B,KAAK0f,iBAAiBzgB,EAAQ0nB,GACxC69B,EAAYxkD,KAAKykD,aAAa5iD,GACpC,IAAI2iD,EACF,SAGF,MAAMliC,GAAYkiC,EAAU5kD,MAAM,KAAK,GACvC,IAA8B,QAA3B,EAAAI,KAAKgjD,eAAe/jD,UAAO,eAAGqjB,MAC/BgmC,EAAWvpD,IAAIylD,IAEXvnC,EAAOve,IAAI4jB,IAAW,CACxB,MAAM1G,EAAQ5b,KAAKmrB,eAAetP,cAAc5c,EAAQqjB,GACrD1G,GACDqB,EAAOhV,IAAIqa,EAAU1G,E,EAM7B,MAAM2sC,EAAiBvoD,KAAKwoD,sBAC1BvpD,EACAe,KAAKwmB,0BAA0BvnB,GAC/BspB,GAGIkgC,EAAkB3nD,MAAMC,KAAKunD,GAAYnkD,KAAKqgD,IAClD,MAAOvlD,EAAQ0nB,GAAO69B,EAAU5kD,MAAM,KACtC,OAAOI,KAAKsmB,kBAAkBrnB,EAAOI,YAAasnB,EAAI,IAGhC,CACtB3mB,KAAKsmB,kBAAkBrnB,MACpBwpD,GAEW3pD,SAASunB,IACvB,IAAI,MAAMM,KAAO4hC,EAAeG,KAC9BriC,EAAeI,QAAQ5iB,OAAO8iB,GAG7B4hC,EAAejuC,OAAS+L,EAAe/L,QACxC+L,EAAe/L,MAAQqG,KAAK4E,IAAI,EAAGc,EAAe/L,MAAQiuC,EAAejuC,O,IAI7Eta,KAAKmd,UAAUxW,cAAc,iBAAkB,CAAC1H,SAAQypD,KAAMH,EAAeG,OAE7E,MAAMnuC,EAA4C,IAC7C0C,EAAO7G,UAGNiD,EAASrZ,KAAKsb,cAAcrc,GAC/Boa,GACDkB,EAAQ2L,QAAQ7M,GAGlBkB,EAAQzb,SAASua,IACf,MAAMmI,EAAuB,eAAbnI,EAAO1c,EACjBgsD,EAAWJ,EAAejG,gBAAkBiG,EAAeh+B,OAC3DW,EAAqBy9B,GAAY3oD,KAAKmrB,eAAe5G,kCAAkClL,GAkB7F,GAhBGkvC,EAAeh+B,SAChBlR,EAAOmR,aAAe7J,KAAK4E,IAAI,EAAGlM,EAAOmR,aAAe+9B,EAAeh+B,SAGtEg+B,EAAejG,iBAChBjpC,EAAO2W,sBAAyB3W,EAAOmR,aAAmB7J,KAAK4E,IAAI,EAAGlM,EAAO2W,sBAAwBu4B,EAAejG,gBAA9D,GAGrDqG,IACDz9B,IAEI1J,GACFxhB,KAAKmd,UAAUxW,cAAc,gBAAiB,CAAC1H,SAAQoa,YAIxDkvC,EAAeG,KAAKhqD,IAAI2a,EAAO+F,aAAc,CAC9C,MACM3X,EADiBzH,KAAKsmB,kBAAkBjN,EAAOpa,OAAQuiB,EAAUnI,EAAOzc,QAAK5B,GACtDyrB,QAAQ7e,MACrC,GAAGH,EAAMgjB,MAAM,cAAoBhjB,EAAMhL,OAAQ,CAC/C,MAAMkqB,EAAMlf,EAAM,GACZ5F,EAAU7B,KAAK0f,iBAAiBzgB,EAAQ0nB,GAC9C3mB,KAAKwlD,oBAAoB3jD,EAASwX,E,MAC1BmI,EACRxhB,KAAKmrB,eAAe0B,kBAAkB5tB,EAAQoa,EAAOzc,IAErDoD,KAAK2f,mBAAmB1gB,E,IAG5B,EAGI,KAAA2pD,gBAAmBnuC,IACzB,MAAMqL,EAAYrL,EAAOlb,WACnBN,EAAS6mB,EAAUzmB,UAAS,GAC5Bod,EAAUzc,KAAK0c,gBAAgBsB,QAAQ8H,GAEvC+iC,EAAa7oD,KAAK0c,gBAAgB4gB,SAASxX,OAExB,EAAAgjC,GAAA,GAAuBrsC,GAAS,KAAOA,EAAQvf,OAAOuI,aAC1BzK,IAAlCgF,KAAK+iD,iBAAiB9jD,aAGhCe,KAAK+iD,iBAAiB9jD,GAC7Be,KAAKmd,UAAUxW,cAAc,oBAAqB1H,MAGrCe,KAAKsb,cAAcrc,KAClB4pD,IACXA,EACD7oD,KAAK2f,mBAAmB1gB,GAExBe,KAAKmrB,eAAelN,qBAAqBhf,IAI7Ce,KAAKmd,UAAUxW,cAAc,iBAAkBmf,EAAU,EAGnD,KAAAijC,sBAAyBtuC,IAC/B,MAAMxb,EAASwb,EAAOlb,WAAWF,UAAS,GAS1CW,KAAKgpD,sBAAsB/pD,GAC3B0C,QAAQ0Q,IAAI,CACVrS,KAAK2f,mBAAmB1gB,KACvB6F,MAAK,KACN9E,KAAKmd,UAAUxW,cAAc,iBAAkB1H,EAAO,GACtD,EAGI,KAAAgqD,4BAA+BxuC,I,MACrC,MAAMyuC,EAAQzuC,EAAOyuC,MACfjqD,EAAsB,QAAb,EAAAwb,EAAOxb,cAAM,QAAIwb,EAAOlb,WAAWF,UAAS,GACrDsnB,GAAM,EAAAjL,GAAA,GAAkBjB,EAAO7d,IAC/BiF,EAAU7B,KAAK0f,iBAAiBzgB,EAAQ0nB,QACxB3rB,KAAnB6G,aAAO,EAAPA,EAASqnD,QAAuBrnD,EAAQqnD,MAAQA,IACjDrnD,EAAQqnD,MAAQA,EAChBlpD,KAAKgmD,gBAAgB,iBAAkBhmD,KAAKmpD,iBAAkBtnD,EAAQ5C,OAAS,IAAM4C,EAAQ8kB,KAC7F3mB,KAAKkmD,+BAA+BrkD,G,EAIhC,KAAAunD,4BAA+B3uC,I,MAErC,GAAgB,QAAb,EAAAA,EAAOvd,cAAM,eAAEmsD,MAEhB,YADArpD,KAAKmd,UAAUxW,cAAc,uBAAwB8T,GAIvD,MAAMxC,EAAS,KACThZ,EAASgZ,EACTlK,EAAY/N,KAAKwpB,sBAAsBvqB,GACvC4C,EAA2B,CAC/BlF,EAAG,UACHC,GAAImR,EACJ0b,QAASzpB,KAAK8a,gBAAgB4O,cAAczR,GAC5CU,QAAS3Y,KAAK8a,gBAAgB4O,cAAczqB,GAC5C/B,OAAQ,CAACqtB,QAAQ,GACjB9G,MAAOhJ,EAAOyd,aAAc,EAAAxU,GAAA,IAAM,IAAS1jB,KAAK2jB,YAAYC,sBAC5D/hB,QAAS4Y,EAAO5Y,QAChBuW,MAAOqC,EAAOrC,MACd6b,SAAUxZ,EAAOwZ,UAEfj0B,KAAKod,gBAAgBoZ,QAAQve,IAC/BjY,KAAKod,gBAAgBgL,aAAa,CAAC,CACjCzrB,EAAG,OACHC,GAAIqb,EACJ/a,OAAQ,CAACy/B,UAAU,GACnBrC,YAAa,IACbklB,WAAY,WACZ8J,MAAO,WAGXtpD,KAAKuf,aAAa,CAAC1d,GAAU,CAACgoB,YAAY,IAEvCpP,EAAOyd,aACRl4B,KAAK2oB,eAAe1pB,GAAU8O,EAC9B/N,KAAKokD,mBAAmB,CACtBznD,EAAG,mBACHkF,UACAukB,SAAKprB,EACLk5B,eAAWl5B,I,EAKT,KAAAuuD,uBAA0B9uC,IAChC,MAAMqL,EAAyB,gCAAbrL,EAAO9d,EAAsC8d,EAAOlb,gBAAavE,EAC7EiE,EAAS6mB,EAAYA,EAAUzmB,UAAS,GAAQW,KAAK8a,gBAAgB9b,UAAWyb,EAAuCI,MAYvH0N,EAAW9N,EAAO8N,SAASpkB,KAAKvH,IAAO,EAAA8e,GAAA,GAAkB9e,KAEzD4G,EAAUxD,KAAKwmB,0BAA0BvnB,GACzCuqD,EAAkBjhC,EAASzrB,QAAQ6pB,IAASnjB,EAAQ9E,IAAIioB,MACpC6iC,EAAgB/sD,OAASkF,QAAQ0Q,IAAIm3C,EAAgBrlD,KAAKwiB,GAAQ3mB,KAAKyW,eAAexX,EAAQ0nB,MAAShlB,QAAQM,WACvH2mC,SAAQ,K,MACxB,MAAM6gB,EAA0B,QAAb,EAAAhvC,EAAOvd,cAAM,eAAE8d,OAClC,GAAGyuC,EACD,IAAI,MAAM9iC,KAAO4B,EAEC/kB,EAAQgB,IAAImiB,GACpBzpB,OAAO8d,QAAS,OAU1B,IAAI,MAAM2L,KAAO4B,SAEC/kB,EAAQgB,IAAImiB,GACbzpB,OAAO8d,cASnBhb,KAAKkjD,eAAeljD,KAAK0pD,qBAAqBzqD,IACrDe,KAAK2e,gBAAgBxX,WAAWrC,MAAMmC,WAC7BA,EAAM0iD,qBAAqB1qD,GAClCe,KAAKmd,UAAUxW,cAAc,uBAAwB,CAAC1H,SAAQ6oD,KAAMv/B,EAAUvN,OAAQyuC,GAAY,GAClG,GACF,EAGI,KAAAG,uBAA0BnvC,IAChC,MAAM,KAACI,EAAI,gBAAEmQ,GAAmBvQ,EAC1B+G,EAAqB,qBAAX3G,EAAKle,EAErB,GAD8B,eAAXke,EAAKle,IAAsB6kB,EAE5C,OAGF,MAAMviB,EAASe,KAAK8a,gBAAgB9b,UAAU6b,EAAKA,MAC7CxB,EAASrZ,KAAKmrB,eAAe5H,iBAAiBtkB,EAAQuiB,GAAU,EAAA9F,GAAA,GAAkBb,EAAKq6B,iBAAcl6C,GACvGqe,IAIJA,EAAO2R,gBAAkBA,EACzBhrB,KAAKmd,UAAUxW,cAAc,yBAA0B0S,GACvDrZ,KAAKmrB,eAAehF,iBAAiB9M,GAAO,EAGtC,KAAAwwC,4BAA+BpvC,IACrC,MAAM5Y,EAAU4Y,EAAO5Y,QACjB5C,EAASe,KAAKqkD,eAAexiD,GAE7B2B,EAAUxD,KAAK8iD,yBAAyB7jD,GAC9C,IAAIuE,EACF,OAGF,MAAMmjB,GAAM,EAAAjL,GAAA,GAAkB7Z,EAAQjF,IAEhC0pD,EAAatmD,KAAK4mB,sBAAsBpjB,EAASmjB,GACvD3mB,KAAKuf,aAAa,CAAC1d,GAAU,CAAC2B,UAASsmD,aAAa,IACpD,MAAMvD,EAAavmD,KAAK4mB,sBAAsBpjB,EAASmjB,GAEpD2/B,GACDtmD,KAAKwmD,oBAAoBF,EAAYC,EAAY/iD,GACjDxD,KAAKmd,UAAUxW,cAAc,eAAgB,CAACwvC,WAAY3yC,EAAQ6D,IAAKpI,SAAQ0nB,IAAK9kB,EAAQ8kB,IAAK9kB,aAE1E7B,KAAK+kD,oBAAoBljD,IAE9C7B,KAAKmd,UAAUxW,cAAc,gBAAiB9E,E,EAK5C,KAAAkoD,gCAAmCtvC,IACzC,MAAMxb,EAASe,KAAK8a,gBAAgB9b,UAAUyb,EAAOI,MAE/CrX,EAAUxD,KAAK8iD,yBAAyB7jD,GAC9C,GAAGuE,EAAS,CACV,MAAMskD,EAAOrtC,EAAO8N,SAASpkB,KAAKvH,IAAO,EAAA8e,GAAA,GAAkB9e,KAC3DoD,KAAKwoD,sBAAsBvpD,EAAQuE,EAASskD,GAE5C9nD,KAAKmd,UAAUxW,cAAc,mBAAoB,CAAC1H,SAAQ6oD,Q,GAItD,KAAAkC,6BAAgCvvC,I,MACtC,MAAMxb,EAASe,KAAK8a,gBAAgB9b,UAAUyb,EAAOI,MAC/C8L,GAAM,EAAAjL,GAAA,GAAkBjB,EAAO0jC,QAC/B36C,EAAUxD,KAAKwmB,0BAA0BvnB,GAC/C,IAAIuE,EAAQ9E,IAAIioB,GAEd,OAGF,MAAM9kB,EAAU7B,KAAK4mB,sBAAsBpjB,EAASmjB,GAC9Co4B,EAAel9C,EAAQuW,MACS,0BAAR,QAA3B,EAAA2mC,EAAakL,sBAAc,eAAEttD,KAIhCoiD,EAAakL,eAAiBxvC,EAAOwvC,eACrCjqD,KAAKqmD,oBAAoB,CACvB1pD,EAAG,oBACHkF,UACAukB,IAAK,EACL8N,UAAW,IACX,EAkrCI,KAAAi1B,iBAAoBe,IAC1B,MAAMC,EAA6D,GAE7DhmD,EAAMnE,KAAKoqD,mBAAmBF,GACpC,IAAI,MAAOroD,KAAYsC,EACrBgmD,EAAW7pD,KAAK,CACdrB,OAAQ4C,EAAQ5C,OAChB0nB,IAAK9kB,EAAQ8kB,IACbuiC,MAAOrnD,EAAQqnD,QAInB,OAAOiB,CAAU,EAGX,KAAAlE,qBAAwBiE,I,UAC9B,MAAMC,EAA0F,GAE1FhmD,EAAMnE,KAAKoqD,mBAAmBF,GACpC,IAAI,MAAOroD,EAAS+jD,KAAsBzhD,EAAK,CAC7C,MAAMgB,EAAoC,QAA1B,EAAiB,QAAjB,EAAAtD,EAAQ8+B,iBAAS,eAAEx7B,eAAO,QAAI,GACxCklD,EAA4C,QAA1B,EAAAzE,aAAiB,EAAjBA,EAAmBzgD,eAAO,QAAI,GAChDmlD,EAAiBnlD,EAAQrI,QAAQytD,IACrC,MAAMC,EAAwBH,EAAgB7rD,MAAMisD,IAAmB,EAAAC,GAAA,GAAeD,EAAe/xC,SAAU6xC,EAAc7xC,YAC7H,OACE7W,EAAQ3E,OAAO0sB,OACZ4gC,GACDD,EAAcjwC,MAAQkwC,EAAsBlwC,aAGftf,IAA/BuvD,EAAcI,gBACXH,QACsCxvD,IAAvCwvD,EAAsBG,aAEzB,IAGHR,EAAW7pD,KAAK,CAACuB,UAASyoD,kB,CAG5B,OAAOH,CAAU,CAWrB,CA1lMYjtC,QAgKR,OA/JAld,KAAKnB,OAAM,GAEXmB,KAAKoe,kBAAkBC,2BAA2B,CAChDusC,gBAAiB5qD,KAAKmkD,kBAEtB0G,2BAA4B7qD,KAAKokD,mBACjC0G,iBAAkB9qD,KAAKokD,mBACvB2G,wBAAyB/qD,KAAKokD,mBAE9B4G,uBAAwBhrD,KAAKmmD,yBAE7B8E,kBAAmBjrD,KAAKqmD,oBACxB6E,yBAA0BlrD,KAAKqmD,oBAE/B8E,uBAAwBnrD,KAAK0lD,yBAE7B0F,iCAAkCprD,KAAK8mD,oBACvCuE,kCAAmCrrD,KAAK8mD,oBACxCwE,uBAAwBtrD,KAAK8mD,oBAC7ByE,wBAAyBvrD,KAAK8mD,oBAC9B0E,uBAAwBxrD,KAAK8mD,oBAC7B2E,wBAAyBzrD,KAAK8mD,oBAE9B4E,kCAAmC1rD,KAAK4nD,6BACxC+D,2BAA4B3rD,KAAK4nD,6BAEjCgE,+BAAgC5rD,KAAKkoD,iCAErC2D,qBAAsB7rD,KAAKqoD,uBAC3ByD,4BAA6B9rD,KAAKqoD,uBAElC0D,cAAe/rD,KAAK4oD,gBAEpBoD,oBAAqBhsD,KAAK+oD,sBAE1BkD,0BAA2BjsD,KAAKipD,4BAEhCiD,0BAA2BlsD,KAAKopD,4BAEhC+C,qBAAsBnsD,KAAKupD,uBAC3B6C,4BAA6BpsD,KAAKupD,uBAElC8C,qBAAsBrsD,KAAK4pD,uBAE3B0C,0BAA2BtsD,KAAK6pD,4BAEhC0C,8BAA+BvsD,KAAK+pD,gCAEpCyC,2BAA4BxsD,KAAKgqD,+BAInChqD,KAAKmd,UAAU7W,iBAAiB,6BAA6B,EAAEe,MAAKP,eAElE,IAAI2lD,EACsBA,EAAf,gBAARplD,EAAqCgS,GAAWA,EAAOpa,OAAOQ,SACjD,qBAAR4H,EAA0CgS,GAAWrZ,KAAK8a,gBAAgBoV,YAAY7W,EAAOpa,QAClFoa,GAAWrZ,KAAK8a,gBAAgBsV,WAAW/W,EAAOpa,QAJrDe,KAAKmrB,eAAe1J,iBAAiB,GAAGzd,OAAOhE,KAAKmrB,eAAe1J,iBAAiB,IAOnG3kB,OAAO2vD,GACP3tD,SAASua,IACRrZ,KAAKmd,UAAUxW,cAAc,yBAA0B0S,EAAO,GAC9D,IAGJrZ,KAAKmd,UAAU7W,iBAAiB,mBAAmB,EAAE1J,KAAI8rD,WACvDA,EAAK5pD,SAAQ,EAAEG,SAAQ0nB,MAAKmjC,kBAC1B,MAAMtmD,EAAUsmD,EAAc9pD,KAAK0sD,4BAA4BztD,GAAUe,KAAKwmB,0BAA0BvnB,GAClG4C,EAAU7B,KAAK4mB,sBAAsBpjB,EAASmjB,GAChD9kB,IACJA,EAAQuW,MAAQ,CACdzb,EAAG,sBACHgwD,QAAS3sD,KAAK4sD,mBAAmBC,iBAAiBjwD,IAGpDoD,KAAKmd,UAAUxW,cAAc,eAAgB,CAC3CwvC,WAAY3yC,EAAQ6D,IACpBpI,SACA0nB,MACA9kB,YACA,GACF,IAGJ7B,KAAKmd,UAAU7W,iBAAiB,iBAAiB,EAAErH,SAAQqjB,WAAU0D,YACnE,MAAM3M,EAASrZ,KAAKmrB,eAAe5H,iBAAiBtkB,EAAQqjB,GAC5D,GAAGjJ,EAAQ,CACTA,EAAO2M,MAAQA,EAEf,IAAI8mC,GAAO,EACP9mC,IAAU,EAAA3G,GAAA,GAAmBhG,EAAO+F,cAItCpf,KAAKmrB,eAAejQ,uBAAuB7B,GAC3CrZ,KAAKmrB,eAAehQ,WAAW,CAAC9B,aAJhCrZ,KAAKmrB,eAAepQ,WAAW9b,GAC/B6tD,GAAO,GAMT9sD,KAAKmd,UAAUxW,cAAc,eAAgB,CAC3C1H,SACAoa,SACAyzC,OACA9mC,S,MAEG,GAAG1D,EAAU,CAClB,MAAMvE,EAAO/d,KAAK0c,gBAAgBsB,QAAQ/e,EAAO2d,YAC7CmB,EAEOA,EAAsB7gB,OAAOq/B,OACtCv8B,KAAKmrB,eAAe0B,kBAAkB5tB,EAAQqjB,GAF9CtiB,KAAK2f,mBAAmB1gB,E,MAK1Be,KAAK2f,mBAAmB1gB,E,IAI5Be,KAAKmd,UAAU7W,iBAAiB,eAAe,EAAEymD,WAC/C,MAAM9kD,EAAMjI,KAAKgtD,gBAAgBC,eAAeF,EAAKnwD,IACrD,GAAGqL,EACD,IAAI,MAAMZ,KAAOY,EAAK,CACpB,MAAOhJ,EAAQ0nB,GAAOtf,EAAIzH,MAAM,KAE1BiC,EAAU7B,KAAK0f,iBAAiBzgB,EAAOI,YAAasnB,GACvD9kB,GACD7B,KAAKkmD,+BAA+BrkD,E,KAO5C7B,KAAKmd,UAAU7W,iBAAiB,qBAAqB,EAAEhH,SAAQ4e,cAC7D,MAAMjf,EAASK,EAAOD,UAAS,GAC/B,IAAI6e,EAAS,QACJle,KAAKgjD,eAAe/jD,GAE3B,IAAI,MAAMoI,KAAOrH,KAAKkjD,gBAChB77C,IAAQpI,GAAUoI,EAAI6lD,WAAWjuD,EAAS,aACrCe,KAAKkjD,eAAe77C,E,KAMnCrH,KAAKmtD,uBAAwB,EAAAC,GAAA,IAAS,KACpC,IAAI,MAAMjrD,KAASnC,KAAKwiD,aAAc,CACpC,MAAM6K,EAAUrtD,KAAKwiD,aAAargD,UAC3BnC,KAAKwiD,aAAargD,GAGzB,MAAMC,EAASirD,EAAQ3oD,SAAS2oD,EAAQnD,QACrC9nD,GAAaA,aAAkBtB,QAAUsB,EAAO3F,QAEjD0gB,UAAUxW,cAAcxE,EAA6BC,E,IAGxD,IAAI,GAAO,GAEPpC,KAAK2e,gBAAgBxX,WAAWrC,MAAMmC,IACxCA,EAAMqmD,eACPttD,KAAKgiD,UAAY/6C,EAAMqmD,a,GAG7B,CAwBOtY,iBAAiB/gB,GACtB,MAAMs5B,GAAc,EAAAz+B,GAAA,GAAKmF,GAOzB,OANAs5B,EAAYzuD,SAAS0uD,IACH,6BAAbA,EAAO7wD,IACP6wD,EAA8D7wD,EAAI,gCAClE6wD,EAA8DpuD,QAAUY,KAAKod,gBAAgB4d,aAAawyB,EAAOpuD,S,IAG/GmuD,CACT,CAEOE,yBAAyBC,EAAgBC,EAAsBjpD,G,UACpE,MAAMkpD,EAA4C,QAApC,KAAG5tD,KAAK4hD,uBAAsB8L,UAAM,UAANA,GAAY,CAAC,EACnDt8C,EAA2B,QAAxB,EAAGw8C,EAASD,UAAY,QAArBC,EAASD,GAAkB,CAACn0D,UAAU,UAIlD,OAFA4X,EAAI1M,SAAWA,EAER0M,EAAI5X,QACb,CAEOq0D,YAAYhsD,EAAcxG,EAAcK,EAK1C,CAAC,GAKJ,MAAM,IAACirB,EAAG,OAAE1nB,GAAU4C,EAEtB,GAAGA,EAAQ3E,OAAO2pB,YAChB,OAAO7mB,KAAKytD,yBAAyB9mC,EAAK,QAAS9kB,GAE1C7B,KAAK6tD,YAAYhsD,EAASxG,EAAMK,KAI3C,MAAMu4B,EAAWv4B,EAAQu4B,UAAY,GAClC54B,IACDA,GAAO,EAAA48B,GAAA,GAAc58B,EAAM44B,IAG7B,MAAM4mB,EAAgBn/C,EAAQk/C,eAAiB/4C,EAAQ3E,OAAO4wD,aAAejsD,EAAQ4hB,UAAOzoB,GAC5F,OAAOgF,KAAK4T,WAAWC,UAAU,uBAAwB,CACvDgH,KAAM7a,KAAK8a,gBAAgBiW,iBAAiB9xB,GAC5CrC,GAAIiF,EAAQjF,GACZiF,QAASxG,EACT+c,MAAO1c,EAAQqyD,SACf95B,SAAUA,EAASx3B,OAASuD,KAAKg1C,iBAAiB/gB,QAAYj5B,EAC9Di6C,WAAYv5C,EAAQsyD,UACpBnT,kBACC/1C,MAAMmkB,IACPjpB,KAAKoe,kBAAkBkV,qBAAqBrK,EAAQ,IAClDrrB,IAGF,GAFAoC,KAAKG,IAAIvC,MAAM,qBAAsBA,IAElCA,GAAwB,yBAAfA,EAAMG,KAOlB,OAHGH,GAAwB,kBAAfA,EAAMG,OAChBH,EAAMqwD,SAAU,GAEXtsD,QAAQC,OAAOhE,GANpBA,EAAMqwD,SAAU,CAMU,GAEhC,CAEapP,SAAS5/C,EAAgB5D,EAAcK,EAS/C,CAAC,G,kDACJ,IAAIL,EAAKkyC,OACP,OAGc,QAAhB,EAAA7xC,EAAQu4B,gBAAQ,QAAhBv4B,EAAQu4B,SAAa,IAGlBv4B,EAAQ4mB,WAAa5mB,EAAQwyD,eAC9BxyD,EAAQwyD,aAAexyD,EAAQ4mB,UAGjC,MACM6rC,SADenuD,KAAK4T,WAAWid,aACXu9B,mBACpB7mD,EAAW64C,GAAoB/kD,EAAM8yD,GAC3C9yD,EAAOkM,EAAS,GACbA,EAAS9K,OAAS,IACO,aAAR,QAAf,EAAAf,EAAQ2yD,eAAO,eAAE1xD,IAAoBtB,EAAK6zB,SAASxzB,EAAQ2yD,QAAQ3wD,aAC7DhC,EAAQ2yD,SAInBpvD,EAASe,KAAK8a,gBAAgBwzC,kBAAkBrvD,IAAWA,EAE3D,MAAMg1B,EAAWv4B,EAAQu4B,SACrBv4B,EAAQwc,WACV7c,GAAO,EAAA48B,GAAA,GAAc58B,EAAM44B,IAI7B,IAAIs5B,EAAcvtD,KAAKg1C,iBAAiB/gB,GACpCs5B,EAAY9wD,SACd8wD,OAAcvyD,GAGhB,MAAM6G,EAAU7B,KAAKuuD,wBAAwBtvD,EAAQvD,GACrDmG,EAAQoyB,SAAWA,EACnBpyB,EAAQA,QAAUxG,EAElB,MAAM6yD,EAAexyD,EAAQwyD,cAAe,EAAA7uC,GAAA,GAAmB3jB,EAAQwyD,mBAAgBlzD,EACjF+qB,EAAY/lB,KAAK8a,gBAAgBiL,UAAU9mB,GAE9CvD,EAAQ2yD,UACTxsD,EAAQuW,MAAQ,CACdzb,EAAG,sBACHgwD,QAASjxD,EAAQ2yD,UAIrB,MAAMG,EAAe5wD,IACnBoC,KAAKyuD,oBAAoB,CAAC5sD,GAAUjE,GACpCoC,KAAKmd,UAAUxW,cAAc,mBAAmB,EAGlD9E,EAAQ4H,KAAO,KACb+kD,IACA,MAAME,EAAsC,CAAC,EAC1C1uD,KAAK2hD,iBAAiB1iD,KACvByvD,EAAmBC,eAAiB3uD,KAAK2hD,iBAAiB1iD,GAAQ8O,WAGpE,MAAM6gD,EAASlzD,EAAQmzD,aAAe7uD,KAAK8a,gBAAgBiW,iBAAiBr1B,EAAQmzD,mBAAgB7zD,EACpG,IAAI8zD,EAkCJ,OAhCEA,EADCpzD,EAAQwc,SACIlY,KAAK4T,WAAWm7C,eAAe,+BAAgC,CAC1El0C,KAAM7a,KAAK8a,gBAAgBiW,iBAAiB9xB,GAC5Cg8B,UAAWp5B,EAAQo5B,UACnBwZ,gBAAiByZ,QAAgBlzD,EACjC6hD,SAAUnhD,EAAQkhD,QAClBhgD,GAAIlB,EAAQ+iD,SACZuQ,YAAatzD,EAAQ45C,WACrBtS,QAAS4rB,GACRF,GAEU1uD,KAAK4T,WAAWm7C,eAAe,uBAAwB,CAClE9Z,WAAYv5C,EAAQsyD,UACpBnzC,KAAM7a,KAAK8a,gBAAgBiW,iBAAiB9xB,GAC5C4C,QAASxG,EACT4/B,UAAWp5B,EAAQo5B,UACnBwZ,gBAAiByZ,QAAgBlzD,EACjCi5B,SAAUs5B,EACVyB,YAAatzD,EAAQ45C,WACrBuF,cAAen/C,EAAQk/C,mBAAgB5/C,EACvCg3B,OAAQt2B,EAAQs2B,OAChBgR,QAAS4rB,EACTK,yBAA0B1N,IACzBmN,GAQL1uD,KAAK2hD,iBAAiB1iD,GAAUyvD,EAEzBI,EAAWhqD,MAAMmkB,IAGtB,GAAiB,2BAAdA,EAAQtsB,EAAgC,CAIzC,MAAMgN,EAAU9H,EAAQ8H,eACjB9H,EAAQ8H,QACf,MAAM48C,GAAa,EAAAz3B,GAAA,GAAKjtB,IACxB,EAAAoe,GAAA,GAA6Bpe,EAAS,CAAC,YACvCA,EAAQ8H,QAAUA,EAElB48C,EAAW9iC,KAAOwF,EAAQxF,KAC1B8iC,EAAW3pD,GAAKqsB,EAAQrsB,GACxB2pD,EAAWnuC,MAAQ6Q,EAAQ7Q,MAC3BmuC,EAAWtyB,SAAWhL,EAAQgL,SAC9Bj0B,KAAKkvD,oBAAoB3I,GACtBt9B,EAAQ/rB,OAAO0sB,MAChB28B,EAAWrpD,OAAO0sB,KAAM,GAI1BX,EAAU,CACRtsB,EAAG,UACHmc,MAAO,GACPwP,MAAO,GACPmL,IAAK,EACLhQ,UAAMzoB,EACNiuB,QAAS,CAAC,CACRtsB,EAAG,kBACHs+B,UAAWp5B,EAAQo5B,UACnBr+B,GAAI2pD,EAAW3pD,IACd,CACDD,EAAGjB,EAAQk/C,aAAe,4BAA+B70B,EAAY,0BAA4B,mBACjGlkB,QAAS0kD,EACTngC,IAAK6C,EAAQ7C,IACb8N,UAAWjL,EAAQiL,Y,MAGdjL,EAA4BA,SACpCA,EAA4BA,QAAQnqB,SAAS2b,IAC5B,uBAAbA,EAAO9d,IACR8d,EAAOirB,OAAQ,E,IAQrB1lC,KAAKoe,kBAAkBkV,qBAAqBrK,GAE5CpnB,EAAQ8H,QAAQ1H,SAAS,IACvBrE,IAGF,MAFA4wD,EAAY5wD,GACZiE,EAAQ8H,QAAQ/H,OAAOhE,GACjBA,CAAK,IACVgrC,SAAQ,KACN5oC,KAAK2hD,iBAAiB1iD,KAAYyvD,UAC5B1uD,KAAK2hD,iBAAiB1iD,E,GAE/B,EAGJe,KAAKmvD,qBAAqBttD,EAAS,CACjCioD,cAAepuD,EAAQk/C,mBAAgB5/C,EACvCsnB,SAAU5mB,EAAQ4mB,SAClBgzB,WAAY55C,EAAQ45C,WACpB8Z,YAAY,IAGd,MAAMlrD,EAAyD,CAACrC,EAAQ8H,SACxE,IAAI,IAAIhE,EAAI,EAAGA,EAAI4B,EAAS9K,SAAUkJ,EACpCzB,EAAS5D,KAAKN,KAAK6+C,SAAS5/C,EAAQsI,EAAS5B,GAAIjK,IAGnD,OAAOiG,QAAQ0Q,IAAInO,GAAUY,KAAKuqD,GAAA,E,IAG7BC,SAASrwD,EAAgBvD,GAkB9B,MAAM2jC,EAAO3jC,EAAQ2jC,KACrBpgC,EAASe,KAAK8a,gBAAgBwzC,kBAAkBrvD,IAAWA,EAI3D,MAAM4C,EAAU7B,KAAKuuD,wBAAwBtvD,EAAQvD,GAC/CwyD,EAAexyD,EAAQwyD,cAAe,EAAA7uC,GAAA,GAAmB3jB,EAAQwyD,mBAAgBlzD,EAEvF,IAAIu0D,EAAgEC,EAEpE,MAAMC,EAAW,cAAepwB,EAAOA,EAAKqR,UAAYrR,EAAKthC,KACvDs1C,EAAWhU,aAAgBqwB,KAAOrwB,EAAKp/B,KAAO,GAC9C0vD,IAAetwB,aAAgBqwB,MAAWrwB,aAAgBuwB,MAChE,IAAI5Q,EAAUtjD,EAAQsjD,SAAW,GAEjCh/C,KAAKG,IAAI,WAAYk/B,EAAMowB,GAE3B,MAAMx7B,EAAWv4B,EAAQu4B,UAAY,GAClC+qB,IACDA,GAAU,EAAA/mB,GAAA,GAAc+mB,EAAS/qB,IAGnC,MAAMoc,EAAkC,GAElCwf,EAAU/pD,IAAiBgqD,2BAA2BpxD,IAAI+wD,GAE1DM,EAAiDr0D,EAAQs0D,eAAiB,CAC9ErzD,EAAG,oBACHoQ,MAAOrR,EAAQs0D,cACfjyD,KAAM,KAGR,IAAI66B,EAAgBkO,EAEhBmpB,EACJ,GAAGN,EACDJ,EAAa,WACbC,EAAc,QACT,GAAkC,IAA/BC,EAASh1D,QAAQ,WAAmB,CAAC,aAAaA,QAAQg1D,IAAa,EAAG,CAClFF,EAAa,QACbC,EAAc,UAAuC,QAA3BC,EAAS7vD,MAAM,KAAK,GAAe,MAAQ,OACrEqwD,EAAa,+BAEVv0D,EAAQw0D,iBACTX,EAAa,QACb1tD,EAAQ3E,OAAO8qD,cAAe,GAGhC,MAAM1X,EAAsD,CAC1D3zC,EAAG,yBACHO,OAAQ,CACNuzC,MAAO/0C,EAAQw0D,qBAAkBl1D,GAEnCm1D,SAAUz0D,EAAQy0D,SAClBh1B,SAAUz/B,EAAQy/B,UAAY,GAGhCkV,EAAW/vC,KAAKgwC,E,MACX,GAAI50C,EAAQ00D,QAIZ,GAAGP,EAAS,CACjBN,EAAa,QACbC,EAAc,SAAWC,EAAS7vD,MAAM,KAAK,GAC7CqwD,EAAa,+BAEb,MAAMI,EAAY,CAChB1zD,EAAG,YACHg0C,EAAGj1C,EAAQk3C,MACXhC,EAAGl1C,EAAQm3C,OACX90C,KAAM,KACNxB,SAAU,KACV8W,KAAMgsB,EAAKhsB,MAGbulB,EAAQ,CACNj8B,EAAG,QACHC,GAAI,GAAKiF,EAAQjF,GACjB0zD,MAAO,CAACD,GACR1f,EAAGj1C,EAAQk3C,MACXhC,EAAGl1C,EAAQm3C,QAGVkd,GACDn3B,EAAM03B,MAAMpqC,QAAQ6pC,GAGtB,MAAM9c,EAAejzC,KAAK4vC,cAAcmC,gBAAgBnZ,EAAOy3B,EAAUtyD,MACzEk1C,EAAaM,WAAalU,EAAKhsB,KAC/B4/B,EAAav1C,IAAMhC,EAAQ60D,WAAa,GAExC33B,EAAQ54B,KAAK88C,iBAAiBC,UAAUnkB,E,MACnC,GAAG9yB,IAAiB0qD,2BAA2B9xD,IAAI+wD,GAA8B,CACtFF,EAAa,QACbC,EAAc,YACdS,EAAa,+BAEb,MAAMQ,EAA2D,CAC/D9zD,EAAG,yBACHO,OAAQ,CACN2zC,cAAen1C,EAAQg1D,qBAAkB11D,EACzC21D,oBAAoB,GAEtBx1B,SAAUz/B,EAAQy/B,SAClBwV,EAAGj1C,EAAQk3C,MACXhC,EAAGl1C,EAAQm3C,QAGbxC,EAAW/vC,KAAKmwD,GAGb/0D,EAAQk1D,SACTvxB,EAAKhsB,KAAO,OACZgsB,EAAKhsB,KAAO,UACZg9B,EAAW/vC,KAAK,CACd3D,EAAG,6B,MAIP4yD,EAAa,WACbC,EAAc,YAAcC,EAAS7vD,MAAM,KAAK,GAChDqwD,EAAa,uCA/DbV,EAAa,WACbC,EAAc,YAAcC,EAAS7vD,MAAM,KAAK,GAChDqwD,EAAa,kCAkEf,GAFA5f,EAAW/vC,KAAK,CAAC3D,EAAG,4BAA6B4zC,UAAW8C,GAAYmc,KAEuB,IAA3F,CAAC,WAAY,QAAS,QAAS,SAAmC/0D,QAAQ80D,KAAuBI,EAAY,CAC/G,MAAM1e,EAAsB,GAa5B,GAZAnK,EAAW,CACTnqC,EAAG,WACHC,GAAI,GAAKiF,EAAQjF,GACjBu+B,SAAUz/B,EAAQy/B,SAClBkV,aACAM,EAAGj1C,EAAQk3C,MACXhC,EAAGl1C,EAAQm3C,OACX5B,SACAP,UAAW+e,EACXp8C,KAAMgsB,EAAKhsB,MAGV3X,EAAQ60D,UAAW,CACpB,MAAMtd,EAAejzC,KAAK4vC,cAAcmC,gBAAgBjL,GACxDmM,EAAaM,WAAalU,EAAKhsB,KAC/B4/B,EAAav1C,IAAMhC,EAAQ60D,S,CAG7B,IAAIte,EACJ,GAAG4d,EACDxf,EAAW/vC,KAAK,CACd3D,EAAG,6BACHg0C,EAAGj1C,EAAQk3C,MACXhC,EAAGl1C,EAAQm3C,SAGbZ,EAAQ,CACNt1C,EAAG,YACHg0C,EAAGj1C,EAAQk3C,MACXhC,EAAGl1C,EAAQm3C,OACX90C,KAAM,KACNsV,KAAMgsB,EAAKhsB,WAER,GAAkB,UAAfk8C,GACL7zD,EAAQu2C,MAAO,CAChBA,EAAQ,CACNt1C,EAAG,YACHg0C,EAAGj1C,EAAQu2C,MAAM5+B,KAAKu/B,MACtBhC,EAAGl1C,EAAQu2C,MAAM5+B,KAAKw/B,OACtB90C,KAAM,cACNsV,KAAM3X,EAAQu2C,MAAM/Y,KAAK7lB,MAG3B,MAAMw9C,EAAoB7wD,KAAK4vC,cAAcmC,gBAAgBjL,EAAUmL,EAAMl0C,MAC7E8yD,EAAkBtd,WAAatB,EAAM5+B,KACrCw9C,EAAkBnzD,IAAMhC,EAAQu2C,MAAMv0C,G,CAIvCu0C,GACDhB,EAAO3wC,KAAK2xC,GAGX8d,GACD9e,EAAO/qB,QAAQ6pC,GAUjBjpB,EAAW9mC,KAAK03C,eAAezH,QAAQnJ,E,CAGzC9mC,KAAKG,IAAI,WAAYovD,EAAYC,EAAanwB,EAAKthC,KAAMrC,GAEzD,MAAMo1D,GAAe,SAWf14C,EAAsBu3C,OAAa30D,EAAY,CACnD2B,EAAGi8B,EAAQ,oBAAsB,uBACjC17B,OAAQ,CAAC,EAET07B,QACAkO,YAGC1uB,KACD,EAAA6H,GAAA,GAA6B7H,EAAc,CAAC,YAC3CA,EAAczO,QAAUmnD,EAEtBp1D,EAAQq1D,UACR34C,EAAyClb,OAAO6zD,SAAU,IAI/DlvD,EAAQoyB,SAAWA,EACnBpyB,EAAQA,QAAUm9C,EAClBn9C,EAAQuW,MAAQu3C,EAAa,CAC3BhzD,EAAG,uBACHO,OAAQ,CAAC,EACT4pC,SAAUzH,GAC6BjnB,EAEzC,MAAM44C,EAAqBrB,OAA0C30D,GAA7B,EAAAi2D,GAAA,GAAqB5xB,GAC7Dx9B,EAAQmvD,kBAAoBA,EAEzBA,IACDhxD,KAAK2iD,mBAAmBqO,GAAqBF,GAG/C,MAAMtC,EAAe5wD,IACnBoC,KAAKyuD,oBAAoB,CAAC5sD,GAAUjE,GACpCoC,KAAKmd,UAAUxW,cAAc,mBAAmB,EAGlD,IAAIuqD,GAAW,EACbC,EAAsD,KAExDtvD,EAAQ4H,KAAO,KACb,GAAGkmD,EAAY,CACb,MAAM7Q,EAAyB,CAC7BniD,EAAG,qBACHC,GAAIwkD,GAAiB/hB,GACrBniC,OAAQ,CAAC,GAGX4zD,EAAa7uD,QAAQ68C,E,MAChB,GAAGzf,aAAgBqwB,MAAQrwB,aAAgBuwB,KAAM,CACtD,MAAMwB,EAAO,K,MA8BX,IAAIC,EAqDJ,OAlFIH,IAAYrvD,EAAQjE,QACtBszD,GAAW,EAEXC,EAAgBnxD,KAAKi5B,eAAejoB,OAAO,CAACquB,OAAMgU,SAAU2d,IAC5DG,EAAcljD,OAAO3E,IACf4nD,IACFlxD,KAAKG,IAAI,oBAAqBiY,GAE9BpY,KAAKsxD,qBAAqBzvD,EAAQo5B,WAClCj7B,KAAKuxD,UAAUtyD,EAAQ,CAACtC,EAAG,gCAA4B3B,EAAWU,EAAQ4mB,UAC1EwuC,EAAalvD,OAAO0H,G,IAIxB6nD,EAAcK,mBAAmBC,IAK/B,MAAMC,EAAW/wC,KAAK4E,IAAI,EAAG5E,KAAKgxC,MAAM,IAAMF,EAASG,KAAOH,EAASI,QACpE5B,GACDjwD,KAAKuxD,UAAUtyD,EAAQ,CAACtC,EAAGszD,EAAYwB,SAAqB,EAAXC,QAAe12D,EAAWU,EAAQ4mB,UAErFwuC,EAAagB,UAAUL,EAAS,IAGlCX,EAAagB,UAAU,CAACF,KAAM,EAAGC,MAAOxyB,EAAKhsB,QAI7B,UAAfk8C,GAA0B7zD,EAAQ60D,YAA0B,QAAb,EAAA70D,EAAQu2C,aAAK,eAAE/Y,QAC/Dm4B,EAAqBrxD,KAAKi5B,eAAejoB,OAAO,CAACquB,KAAM3jC,EAAQu2C,MAAM/Y,QAGvEi4B,GAAiBA,EAAcrsD,MAAWq6B,GAAc,mCAOtD,IAAI2f,EA0BJ,GA5BA3f,EAAUl/B,KAAOuvD,EACjB0B,GAAW,EAIPpS,EADG,UADAyQ,EAEU,CACX5yD,EAAG,0BACH0iC,KAAMF,EACNjiC,OAAQ,CACN6zD,QAASr1D,EAAQq1D,cAAW/1D,IAMnB,CACX2B,EAAG,6BACH0iC,KAAMF,EACNuR,UAAW+e,EACXvyD,OAAQ,CACN60D,WAA2B,oCAAf9B,QAAoDj1D,EAChE+1D,QAASr1D,EAAQq1D,cAAW/1D,GAG9Bq1C,cAIHghB,EACD,IACE,MAAMlyB,QAAkBkyB,EACvBvS,EAAqD7M,MAAQ9S,C,CAC9D,MAAM71B,GACNtJ,KAAKG,IAAIvC,MAAM,+BAAgC0L,E,CAInDwnD,EAAa7uD,QAAQ68C,EACvB,MAAIlhD,IAEF,MADA4wD,EAAY5wD,GACNA,CAAK,IAGNkzD,CAAY,EAGlBp1D,EAAQs2D,cACTZ,IAEApxD,KAAK6hD,sBAAsBvhD,KAAK,CAC9B8wD,Q,CAKN,OAAON,CAAY,EAGrB9wD,KAAKmvD,qBAAqBttD,EAAS,CACjCmwD,cAAet2D,EAAQs2D,cACvBlI,cAAepuD,EAAQk/C,mBAAgB5/C,EACvCsnB,SAAU5mB,EAAQ4mB,SAClBgzB,WAAY55C,EAAQ45C,WACpBgM,aAAc5lD,EAAQ4lD,eAGpB5lD,EAAQs2D,gBACVlB,EAAahsD,MAAMg6C,IACjB9+C,KAAKuxD,UAAUtyD,EAAQ,CAACtC,EAAG,gCAA4B3B,EAAWU,EAAQ4mB,UAEnEtiB,KAAK4T,WAAWC,UAAU,qBAAsB,CACrDo+C,WAAYv2D,EAAQu2D,WACpBp3C,KAAM7a,KAAK8a,gBAAgBiW,iBAAiB9xB,GAC5CmZ,MAAO0mC,EACPj9C,QAASm9C,EACT/jB,UAAWp5B,EAAQo5B,UACnBwZ,gBAAiByZ,EACjBrT,cAAen/C,EAAQk/C,aACvB5oB,OAAQt2B,EAAQs2B,OAChBiC,WACA+6B,YAAatzD,EAAQ45C,WACrBtS,QAAStnC,EAAQmzD,aAAe7uD,KAAK8a,gBAAgBiW,iBAAiBr1B,EAAQmzD,mBAAgB7zD,IAC7F8J,MAAMmkB,IACPjpB,KAAKoe,kBAAkBkV,qBAAqBrK,EAAQ,IAClDrrB,IACF,GAAkB,UAAf2xD,GACc,MAAf3xD,EAAM0X,OACU,6BAAf1X,EAAMG,MACQ,4BAAfH,EAAMG,MAIN,OAHAH,EAAMqwD,SAAU,EAChBsB,EAAa,gBACb1tD,EAAQ4H,OAKV,MADA+kD,EAAY5wD,GACNA,CAAK,OAIfkzD,EAAahsD,KAAKjD,EAAQ8H,QAAQ1H,QAASJ,EAAQ8H,QAAQ/H,SAG7D,MAAMswD,EAGF,CACFrwD,WAMF,OAHA,EAAAoe,GAAA,GAA6BiyC,EAAK,CAAC,YACnCA,EAAIvoD,QAAUmnD,EAEPoB,CACT,CAEaC,UAAUlzD,EAAgBvD,G,0CAarC,GAJGA,EAAQ4mB,WAAa5mB,EAAQwyD,eAC9BxyD,EAAQwyD,aAAexyD,EAAQ4mB,UAGK,IAAnC5mB,EAAQ02D,gBAAgB31D,OACzB,OAAOuD,KAAKsvD,SAASrwD,EAAQ,OAAF,wBAAMvD,GAAYA,EAAQ02D,gBAAgB,KAGvEnzD,EAASe,KAAK8a,gBAAgBwzC,kBAAkBrvD,IAAWA,EAC3D,MAAMivD,EAAexyD,EAAQwyD,cAAe,EAAA7uC,GAAA,GAAmB3jB,EAAQwyD,mBAAgBlzD,EAEvF,IAAIgkD,EAAUtjD,EAAQsjD,SAAW,GAC7B/qB,EAAWv4B,EAAQu4B,UAAY,GAChC+qB,IACDA,GAAU,EAAA/mB,GAAA,GAAc+mB,EAAS/qB,IAGnCj0B,KAAKG,IAAI,YAAazE,GAEtB,MAAM22D,EAAU,MAAOryD,KAAKoiD,cAEtB39B,EAA+B,GAC/B68B,EAAgBvqB,IACpBtS,EAAUnkB,KAAKy2B,EAAG,EAGdxO,EAAW7sB,EAAQ02D,gBAAgBjuD,KAAI,CAACkpD,EAAS/oD,KACrD,MAAMguD,EAAC,eACLN,eAAe,EACf5B,QAAS10D,EAAQ00D,QACjBxV,aAAcl/C,EAAQk/C,aACtB5oB,OAAQt2B,EAAQs2B,OAChBk8B,eACA5rC,SAAU5mB,EAAQ4mB,SAClBusC,aAAcnzD,EAAQmzD,aACtBwD,UACA/Q,gBACG+L,GASL,OANW,IAAR/oD,IACDguD,EAAEtT,QAAUA,EACZsT,EAAEr+B,SAAWA,GAIRj0B,KAAKsvD,SAASrwD,EAAQqzD,GAAGzwD,OAAO,IAGtCnG,EAAQ45C,YACT7wB,EAAUnkB,MAAK,KACbN,KAAKkf,iBAAiBo2B,WAAWr2C,EAAQvD,EAAQ4mB,SAAS,IAI9DmC,EAAU3lB,SAAS4F,IACjBA,GAAU,IAMZ,MAAM8pD,EAAc,CAAC3sD,EAA0BjE,KAC7CoC,KAAKyuD,oBAAoB,CAAC5sD,GAAUjE,GACpCoC,KAAKmd,UAAUxW,cAAc,mBAAmB,EAG5C8qB,EAAYzxB,KAAK8a,gBAAgBiW,iBAAiB9xB,GAClDszD,EAAUC,IACdxyD,KAAKuxD,UAAUtyD,EAAQ,CAACtC,EAAG,gCAA4B3B,EAAWU,EAAQ4mB,UAE1E,MAAM9oB,GAAW,SAsBjB,OArBAwG,KAAK6hD,sBAAsBvhD,KAAK,CAC9B8wD,KAAM,IACGpxD,KAAK4T,WAAWC,UAAU,0BAA2B,CAC1DgH,KAAM4W,EACNghC,YAAaD,EACb/d,gBAAiByZ,EACjBrT,cAAen/C,EAAQk/C,aACvB5oB,OAAQt2B,EAAQs2B,OAChBg9B,YAAatzD,EAAQ45C,WACrBtS,QAAStnC,EAAQmzD,aAAe7uD,KAAK8a,gBAAgBiW,iBAAiBr1B,EAAQmzD,mBAAgB7zD,EAC9Fi0D,yBAA0B1N,KACzBz8C,MAAMmkB,IACPjpB,KAAKoe,kBAAkBkV,qBAAqBrK,GAC5CzvB,EAASyI,SAAS,IAChBrE,IACF2qB,EAASzpB,SAAS+C,GAAY2sD,EAAY3sD,EAASjE,KACnDpE,EAASoI,OAAOhE,EAAM,MAKrBpE,CAAQ,EAGX0K,EAAwCqkB,EAASpkB,KAAKtC,GAClDA,EAAQ4H,OAA+B3E,MAAMg6C,GAC5Cn9C,QAAQ0Q,IAAI,CACjBysC,EACA9+C,KAAK4T,WAAWC,UAAU,uBAAwB,CAChDgH,KAAM4W,EACNrZ,MAAO0mC,QAIZh6C,MAAK,EAAE4tD,EAAoB3T,MAC1B,IAAID,EACJ,GAAsB,sBAAnBC,EAAapiD,EAA2B,CACzC,MAAMi8B,EAAQ54B,KAAK88C,iBAAiBC,UAAUgC,EAAanmB,OAC3DkmB,EAAalD,GAAmBhjB,E,MAC3B,GAAsB,yBAAnBmmB,EAAapiD,EAA8B,CACnD,MAAM+yC,EAAM1vC,KAAK03C,eAAezH,QAAQ8O,EAAajY,UACrDgY,EAAa,GAAsBpP,E,CAIwB,CAC3D,SACA,eAGa5wC,SAAS6qC,I,MAEtBmV,EAAWnV,GAAwC,QAA5B,EAAA+oB,EAAmB/oB,UAAS,QAAImV,EAAWnV,EAAS,IAG7E,MAAMgpB,EAAqC,CACzCh2D,EAAG,mBACHyb,MAAO0mC,EACP7jB,UAAWp5B,EAAQo5B,UACnBp5B,QAASm9C,EACT/qB,YASF,OALG+qB,IACDA,EAAU,GACV/qB,EAAW,IAGN0+B,CAAgB,IACtB1kD,OAAO3E,IAGR,MAFAtJ,KAAKG,IAAIvC,MAAM,+BAAgC0L,EAAKzH,GACpD2sD,EAAY3sD,EAASyH,GACfA,CAAG,MAIb,OAAO3H,QAAQ0Q,IAAInO,GAAUY,MAAM8tD,GAC1BL,EAAOK,EAAO91D,OAAOC,WAEhC,G,CAEO81D,YAAY5zD,EAAgB6zD,GACjC,OAAO9yD,KAAKggD,UAAU/gD,EAAQe,KAAKod,gBAAgB21C,qBAAqBD,GAC1E,CAEO9S,UACL/gD,EACA6/C,EACApjD,EAOK,CAAC,G,MAENuD,EAASe,KAAK8a,gBAAgBwzC,kBAAkBrvD,IAAWA,EAG3D,MAAM4C,EAAU7B,KAAKuuD,wBAAwBtvD,EAAQvD,GAC/CwyD,EAAexyD,EAAQwyD,cAAe,EAAA7uC,GAAA,GAAmB3jB,EAAQwyD,mBAAgBlzD,EAEvF,IAAIod,EACJ,OAAO0mC,EAAWniD,GAChB,IAAK,iBAAkB,CACrB,MAAMq2D,EAAS,GAAKnxD,EAAQjF,GAC5BkiD,EAAWiO,KAAKnwD,GAAKo2D,EACrBhzD,KAAKgtD,gBAAgBiG,SAASnU,EAAWiO,KAAM,CAC7CpwD,EAAG,cACHkxB,MAAO,EACPqlC,aAAc,EACdh2D,OAAQ,CAAC,EACTqb,cAAe,KAGjB,MAAM,KAACw0C,EAAI,QAAE5nD,GAAWnF,KAAKgtD,gBAAgBmG,QAAQH,GACrD56C,EAAQ,CACNzb,EAAG,mBACHowD,OACA5nD,WAGF,K,CAGF,IAAK,kBACHiT,EAAQ,CACNzb,EAAG,oBACHi8B,MAAO54B,KAAK88C,iBAAiBsW,SAAUtU,EAAWliD,GAA6BA,IAC/EM,OAAQ,CAAC,GAEX,MAGF,IAAK,qBAKHkb,EAAQ,CACNzb,EAAG,uBACHmqC,SANU9mC,KAAK03C,eAAetF,OAAQ0M,EAAWliD,GAAmCA,IAOpFM,OAAQ,CAAC,GAEX,MAGF,IAAK,oBACHkb,EAAQ,CACNzb,EAAG,sBACH4iD,aAAcT,EAAWS,aACzBC,WAAYV,EAAWU,WACvBC,UAAWX,EAAWW,UACtBrgD,QAA2B,QAAlB,EAAA0/C,EAAW1/C,eAAO,QAAI,IAC/BsgD,MAAOZ,EAAWY,OAEpB,MAGF,IAAK,qBACHtnC,EAAQ,CACNzb,EAAG,kBACHw/C,IAAKzgD,EAAQwjD,UAEf,MAGF,IAAK,kBACH9mC,EAAQ,CACNzb,EAAG,oBACHw/C,IAAKzgD,EAAQwjD,SACbzzB,MAAOqzB,EAAWrzB,MAClB0zB,QAASL,EAAWK,QACpBC,SAAUN,EAAWM,SACrBC,SAAUP,EAAWO,SACrBC,WAAYR,EAAWQ,YAEzB,MAGF,IAAK,sBACHlnC,EAAS0mC,EAAmBC,aAKhCl9C,EAAQuW,MAAQA,EAEhB,MAAMo2C,EAAe5wD,IACnBoC,KAAKyuD,oBAAoB,CAAC5sD,GAAUjE,GACpCoC,KAAKmd,UAAUxW,cAAc,mBAAmB,EAmElD,OAhEA9E,EAAQ4H,KAAO,KACb,MAAMilD,EAAsC,CAAC,EAC1C1uD,KAAK2hD,iBAAiB1iD,KACvByvD,EAAmBC,eAAiB3uD,KAAK2hD,iBAAiB1iD,GAAQ8O,WAGpE,MAAM6gD,EAASlzD,EAAQmzD,aAAe7uD,KAAK8a,gBAAgBiW,iBAAiBr1B,EAAQmzD,mBAAgB7zD,EACpG,IAAI8zD,EA8BJ,OA5BEA,EADCpzD,EAAQwc,SACIlY,KAAK4T,WAAWm7C,eAAe,+BAAgC,CAC1El0C,KAAM7a,KAAK8a,gBAAgBiW,iBAAiB9xB,GAC5Cg8B,UAAWp5B,EAAQo5B,UACnBwZ,gBAAiByZ,QAAgBlzD,EACjC6hD,SAAUnhD,EAAQkhD,QAClBhgD,GAAIlB,EAAQ+iD,SACZuQ,YAAatzD,EAAQ45C,WACrBuF,cAAen/C,EAAQk/C,aACvB5oB,OAAQt2B,EAAQs2B,OAChBgR,QAAS4rB,GACRF,GAEU1uD,KAAK4T,WAAWm7C,eAAe,qBAAsB,CAChEl0C,KAAM7a,KAAK8a,gBAAgBiW,iBAAiB9xB,GAC5CmZ,MAAO0mC,EACP7jB,UAAWp5B,EAAQo5B,UACnBwZ,gBAAiByZ,QAAgBlzD,EACjC6G,QAAS,GACTmtD,YAAatzD,EAAQ45C,WACrBuF,cAAen/C,EAAQk/C,aACvB5oB,OAAQt2B,EAAQs2B,OAChBgR,QAAS4rB,EACTK,yBAA0B1N,IACzBmN,GAGL1uD,KAAK2hD,iBAAiB1iD,GAAUyvD,EAEzBI,EAAWhqD,MAAMmkB,IACnBA,EAAQA,SACTA,EAAQA,QAAQnqB,SAAS2b,IACP,uBAAbA,EAAO9d,IACR8d,EAAOirB,OAAQ,E,IAKrB1lC,KAAKoe,kBAAkBkV,qBAAqBrK,EAAQ,IAClDrrB,IAEF,MADA4wD,EAAY5wD,GACNA,CAAK,IACVgrC,SAAQ,KACN5oC,KAAK2hD,iBAAiB1iD,KAAYyvD,UAC5B1uD,KAAK2hD,iBAAiB1iD,E,GAE/B,EAGJe,KAAKmvD,qBAAqBttD,EAAS,CACjCioD,cAAepuD,EAAQk/C,mBAAgB5/C,EACvCsnB,SAAU5mB,EAAQ4mB,SAClBgzB,WAAY55C,EAAQ45C,WACpB8Z,YAAY,IAGPvtD,EAAQ8H,OACjB,CAaQwlD,qBAAqBttD,EAA0BnG,EAMlD,CAAC,GACJ,MAAMqS,EAAYlM,EAAQjF,GACpBqC,EAASe,KAAKqkD,eAAexiD,GAC7B2B,EAAU9H,EAAQouD,YAAc9pD,KAAK0sD,4BAA4BztD,GAAUe,KAAKwmB,0BAA0BvnB,GAChH4C,EAAQs0C,WAAa3yC,EAAQ6D,IAC7B,MAAMod,EAA+B,GACrC,GAAG/oB,EAAQouD,YAET9pD,KAAKuf,aAAa,CAAC1d,GAAU,CAAC2B,UAASsmD,aAAa,EAAMjgC,YAAY,IACtEpF,EAAUnkB,MAAK,KACbN,KAAKmd,UAAUxW,cAAc,gBAAiB9E,EAAQ,QAEnD,CAIL,MAAMiR,EAA6B,CACjC9S,KAAKsmB,kBAAkBrnB,GACvBvD,EAAQ4mB,SAAWtiB,KAAKsmB,kBAAkBrnB,EAAQvD,EAAQ4mB,eAAYtnB,GAGxE,IAAI,MAAMwI,KAAWsP,EAChBtP,GACDA,EAAQijB,QAAQP,QAAQnY,GAO5B,GAHA/N,KAAKuf,aAAa,CAAC1d,GAAU,CAAC2B,UAASqmB,YAAY,IACnD7pB,KAAKwlD,oBAAoB3jD,GAEtBnG,EAAQ4mB,SAAU,CACnB,MAAMhB,EAAathB,KAAKmrB,eAAetP,cAAc5c,EAAQvD,EAAQ4mB,UAClEhB,GACDthB,KAAKwlD,oBAAoB3jD,EAASyf,E,CAItCmD,EAAUnkB,MAAK,KACbN,KAAKmd,UAAUxW,cAAc,iBAAkB,CAACwvC,WAAY3yC,EAAQ6D,IAAKxF,WAAS,G,CAItF,MAAMwG,EAAiCrI,KAAKyhD,kBAAkB5/C,EAAQo5B,WAAa,CACjFh8B,SACAyuD,OAAQ3/C,EACRuU,SAAU5mB,EAAQ4mB,SAClB9e,UACA4rD,WAAY1zD,EAAQ0zD,YAuBtB,OApBApvD,KAAK2oB,eAAe1pB,GAAU8O,GAE1BrS,EAAQs2D,eAAiBnwD,EAAQ4H,MACnCgb,EAAUnkB,MAAK,KACV5E,EAAQ45C,YACTt1C,KAAKkf,iBAAiBo2B,WAAWr2C,EAAQvD,EAAQ4mB,UAGnDzgB,EAAQ4H,MAAM,IAIfgb,EAAUhoB,SACVf,EAAQ4lD,cAAgBA,KAAc,KACrC,IAAI,MAAM58C,KAAY+f,EACpB/f,G,IAKC2D,CACT,CAEQkmD,wBAAwBtvD,EAAgBvD,GAS9C,IAAI23D,EAJD33D,EAAQ4mB,WAAa5mB,EAAQwyD,eAC9BxyD,EAAQwyD,aAAexyD,EAAQ4mB,UAIjC,MAAM4N,EAAclwB,KAAK8a,gBAAgBoV,YAAYjxB,GACrD,GAAGixB,GACYlwB,KAAK8a,gBAAgBw4C,QAAQr0D,GAClC/B,OAAOq2D,WAAY,CACzB,MAAMn+C,EAAOpV,KAAKod,gBAAgBC,UAElCg2C,EADiBj+C,EAAKoqC,YAAcpqC,EAAKqqC,UAAY,IAAMrqC,EAAKqqC,UAAY,G,CAKhF,MAAM59C,EAA2B,CAC/BlF,EAAG,UACHC,GAAIoD,KAAKwpB,sBAAsBvqB,GAC/BwqB,QAAS/tB,EAAQmzD,aAAe7uD,KAAK8a,gBAAgB4O,cAAchuB,EAAQmzD,cAAgB7uD,KAAKwzD,eAAev0D,GAC/G0Z,QAAS3Y,KAAK8a,gBAAgB4O,cAAczqB,GAC5Cw0D,YAAaJ,EACbn2D,OAAQ8C,KAAK0zD,cAAcz0D,GAC3BwkB,KAAM/nB,EAAQk/C,eAAiB,EAAAl3B,GAAA,IAAM,GAAQ1jB,KAAK2jB,YAAYC,sBAC9D/hB,QAAS,GACTglD,WAAYnrD,EAAQ22D,QACpBp3B,WAAW,UACXjH,SAAUh0B,KAAK2zD,oBAAoB10D,EAAQvD,EAAQwyD,aAAcxyD,EAAQ4mB,UACzEsxC,WAAYl4D,EAAQwc,SACpBymC,aAAcjjD,EAAQkjD,YACtBiV,QAAS7zD,KAAK8zD,gBAAgB70D,GAC9BiqD,MAAOh5B,GAAe,EACtB7nB,SAAS,GAQX,OALA,EAAA4X,GAAA,GAA6Bpe,EAAS,CAAC,OAAQ,iBACxB7G,IAApBU,EAAQ22D,UACTxwD,EAAQ8H,SAAU,UAGb9H,CACT,CAEQ8xD,oBAAoB10D,EAAgBivD,EAAsB6F,GAChE,MAAMh0C,EAAU/f,KAAK8a,gBAAgBiF,QAAQ9gB,GAC7C,GAAG8gB,IAAYg0C,EAAc,CAC3B,MAAMC,EAAkBh0D,KAAK0f,iBAAiBzgB,EAAQivD,GACnD8F,IACDD,GAAe,EAAAtM,GAAA,GAAmBuM,GAAiB,G,CAIvD,MAAMpnD,EAA6B,CACjCjQ,EAAG,qBACH83C,gBAAiByZ,GAAgB6F,EACjC72D,OAAQ,CAAC,GAWX,OARG62D,GAAgBh0C,GAAW,OAAqBg0C,IACjDnnD,EAAO1P,OAAO+2D,aAAc,GAG3BF,GAAgBnnD,EAAO6nC,kBAAoBsf,IAC5CnnD,EAAOsnD,gBAAkBH,GAGpBnnD,CACT,CAEQknD,gBAAgB70D,GACtB,IAAI40D,EACJ,GAAG7zD,KAAK8a,gBAAgBoV,YAAYjxB,GAAS,CAC3C,MAAM0jC,EAAc3iC,KAAK6W,kBAAkBgqB,kBAAkB5hC,EAAO2d,aACjE+lB,aAAW,EAAXA,EAAawxB,kBACdN,EAAU,CACRl3D,EAAG,iBACHkxB,MAAO,EACP3wB,OAAQ,CACNk3D,UAAU,GAEZ70D,WAAYojC,EAAYwxB,eACxBN,QAAS,EACTQ,YAAa,G,CAKnB,OAAOR,CACT,CAKQL,eAAev0D,GACrB,OAAGe,KAAK8a,gBAAgBkM,UAAU/nB,KAAYe,KAAK8a,gBAAgBoV,YAAYjxB,IAAWe,KAAKs0D,mBAAmBr1D,SAChH,EAEOe,KAAK8a,gBAAgB4O,cAAc1pB,KAAKod,gBAAgBC,UAAUzgB,GAAGyC,WAEhF,CAEQq0D,cAAcz0D,GACpB,MAAM/B,EAAoC,CAAC,EAc3C,OAZG+B,IADYe,KAAKod,gBAAgBC,UAAUzgB,KAE5CM,EAAO0sB,KAAM,EAET5pB,KAAK8a,gBAAgBiL,UAAU9mB,IAAYe,KAAKod,gBAAgBkT,MAAMrxB,KACxE/B,EAAOqtB,QAAS,IAIjBvqB,KAAK8a,gBAAgBoV,YAAYjxB,KAClC/B,EAAOu5B,MAAO,GAGTv5B,CACT,CAEQq3D,sBAAsBt1D,EAAgB+0D,GAC5C,MAAM7tD,EAAOnG,KAAKod,gBAAgBC,UAAUzgB,GAAGyC,WACzC4Y,EAAS+7C,EAAgB/7C,OAC/B,GAAGA,IAAW9R,GAAQ6tD,EAAgB/0D,SAAWkH,IAAS6tD,EAAgBjgC,SACxE,OAGF,MAAMwC,EAA+C,CACnD55B,EAAG,mBACHkxB,MAAO,EACPpK,KAAMuwC,EAAgBvwC,KACtBvmB,OAAQ,CAAC,GAGX,IAAIs3D,GAAe,EACnB,GAAGR,EAAgBjgC,SACjBwC,EAAU9M,QAAUuqC,EAAgBjgC,SAAStK,QAC7C8M,EAAUk+B,UAAYT,EAAgBjgC,SAAS0gC,UAC/Cl+B,EAAUk9B,YAAcO,EAAgBjgC,SAAS0/B,gBAC5C,CAGL,GAFAl9B,EAAUk9B,YAAcO,EAAgBP,YAErCx7C,EAAOxY,SAAU,CAClB,MAAMi1D,EAAW10D,KAAK6W,kBAAkB89C,kBAAkB18C,EAAOoY,aAC9DqkC,aAAQ,EAARA,EAAUE,wBACXr+B,EAAUk+B,UAAYC,EAASE,qBAC/BJ,GAAe,E,CAIfA,IACFj+B,EAAU9M,QAAUzpB,KAAK8a,gBAAgB4O,cAAczR,G,CAiB3D,OAbGjY,KAAK8a,gBAAgBoV,YAAY8jC,EAAgB/0D,UAC/C+0D,EAAgBP,cACjBl9B,EAAUk9B,YAAcO,EAAgBP,aAG1Cl9B,EAAUs+B,aAAeb,EAAgBp3D,IAGxCqC,IAAWkH,GAASquD,IACrBj+B,EAAUu+B,kBAAoBd,EAAgBp3D,GAC9C25B,EAAUw+B,gBAAkB/0D,KAAK8a,gBAAgB4O,cAAcsqC,EAAgB/0D,SAG1Es3B,CACT,CAEOy+B,0BAA0B/1D,EAAgB25B,GAC/C,MAAM/P,EAAQosC,OAAOC,iBACfrzD,EAAkC,CACtClF,EAAG,iBACHO,OAAQ,CAAC,EACT0b,OAAQ,CACNjc,EAAG,gCACHi8B,SAEFh8B,GAAIisB,EACJlQ,QAAS3Y,KAAK8a,gBAAgB4O,cAAczqB,GAC5C0nB,IAAKkC,EACL5pB,SACAwkB,KAAOmV,EAAsBnV,KAC7BxL,OAAQhZ,GAIV,OADAe,KAAKwmB,0BAA0BvnB,GAAQgJ,IAAI4gB,EAAOhnB,GAC3CA,CACT,CAEOszD,iBAAiBC,GACtB,OAAOp1D,KAAK2iD,mBAAmByS,EACjC,CAEOd,mBAAmBr1D,G,QACxB,QAAIA,EAAO+nB,cAKuC,QAA1C,EAAkC,QAAnC,EADMhnB,KAAK8a,gBAAgBw4C,QAAQr0D,GACZo2D,oBAAY,eAAEn4D,cAAM,eAAEo4D,UACtD,CAEO9P,oBACL3jD,EACAwX,EAAuCrZ,KAAKsb,cAAczZ,EAAQ5C,SAE9Doa,IAIJA,EAAO+F,YAAcvd,EAAQ8kB,IAEN3mB,KAAKsmB,kBAAkBzkB,EAAQ5C,OAAqB,eAAboa,EAAO1c,EAAqB0c,EAAOzc,QAAK5B,GACvF6tB,MAAQhnB,EAAQ8kB,IAE/B3mB,KAAKmrB,eAAejQ,uBAAuB7B,GAAQ,EAAOxX,GAE1D7B,KAAKob,yBAAyBvZ,EAAQ5C,OAAQoa,GAChD,CAEOi4C,qBAAqB1vB,GAC1B,MAAM2zB,EAAcv1D,KAAKyhD,kBAAkB7f,GAM3C,GAAG2zB,EAAa,CACd,MAAM,OAACt2D,EAAM,OAAEyuD,EAAM,QAAElqD,GAAW+xD,EAC5BlvC,EAAiBrmB,KAAKsmB,kBAAkBrnB,GAc9C,OAZAe,KAAKoe,kBAAkBiX,mBAAmB,CACxC14B,EAAG,uBACH4rB,SAAU,CAACmlC,GACXtnC,SAAKprB,EACLk5B,eAAWl5B,IAGbqrB,EAAeI,QAAQ5iB,OAAO6pD,UAEvB1tD,KAAKyhD,kBAAkB7f,GAC9Bp+B,EAAQK,OAAO6pD,IAER,C,CAGT,OAAO,CACT,CAuCa8H,kBAAkB77C,G,0CAC7B,MAAM8oC,EAAaziD,KAAKyiD,WAAWj+C,MACnC,MAAOxE,KAAKmrB,eAAevL,gBAAgBjG,IAAW,CACpD,MAAMvX,QAAepC,KAAK0sB,eAAe,CAACnQ,MAAO,IAAK5C,aACtD,IAAI8oC,KAAgBrgD,EAAOqoB,MACzB,K,CAGN,G,CAqBO88B,qBAAqBtoD,EAAgBqjB,G,UAC1C,MAAM+D,EAAiBrmB,KAAKsmB,kBAAkBrnB,EAAQqjB,GACtD,GAAGA,IAAatiB,KAAK0c,gBAAgBqD,QAAQ9gB,EAAO2d,YAAa,CAC/D,MAAM64C,EAAqBz1D,KAAKsmB,kBAAkBrnB,GAC5C4rB,EAAYlK,KAAK4E,IAAgC,QAA5B,EAAAkwC,EAAmB5qC,iBAAS,QAAI,EAAGxE,EAAewE,WACvEhpB,EAAU7B,KAAK0f,iBAAiBzgB,EAAQonB,EAAewC,OAC7D,QAAuB,QAAf,EAAAhnB,aAAO,EAAPA,EAAS3E,cAAM,eAAE0sB,MAAOiB,EAAYxE,EAAewC,MAAQgC,EAAY,C,CAC1E,CACL,MAAMhpB,EAAU7B,KAAK0f,iBAAiBzgB,EAAQonB,EAAewC,OACvDgC,EAAY5rB,EAAOQ,SAAWkhB,KAAK4E,IAAIc,EAAewE,UAAWxE,EAAeyE,iBAAmBzE,EAAewE,UAExH,QAAuB,QAAf,EAAAhpB,aAAO,EAAPA,EAAS3E,cAAM,eAAE0sB,MAAOiB,EAAYxE,EAAewC,QAAS,EAAAxJ,GAAA,GAAmBwL,GAAaA,EAAY,C,CAEpH,CAGO6B,gBAAe,MAACnQ,EAAK,SAAE5C,IAM5B,IACIiS,EAAc,EAEdlL,EAAa1gB,KAAKmrB,eAAe1K,cAAc9G,GAChD+G,IACDkL,EAA2B,MAAblL,EACdA,GAAc1gB,KAAK2jB,YAAYC,uBAGjC,MACM6+B,EAAaziD,KAAKyiD,WAAWj+C,MAC7BvF,EAASe,KAAKmrB,eAAenL,mBAAmBrG,GAAYA,OAAW3e,EAEvEimC,EAAiB7+B,IACrB,IAAIqgD,KAA6B,gCAAbrgD,EAAOzF,EAAqC,OAAO,KAEpE,MACDqD,KAAKG,IAAI,8BAA+BiC,GAItCnD,GAAwByhB,GAA+B/G,IAAaJ,IACtEvZ,KAAKmrB,eAAetR,iBAAiBF,GAGnC1a,GAAWyhB,GAEb1gB,KAAKkf,iBAAiBC,mBAGxBnf,KAAKod,gBAAgBgL,aAAahmB,EAAO0W,OACzC9Y,KAAK0c,gBAAgB2L,aAAajmB,EAAOkmB,OACzCtoB,KAAKuf,aAAand,EAAOmmB,UAEzB,IAAImtC,IAAuBh1C,EACvBi1C,GAAa,EACjB,MAAMC,EAAuD,IAAIpkD,IAC3DqkD,EAA8Bl8C,IAAaJ,GAAmB,KAAgBI,EAC9EyN,IAAqBnoB,GAAU0a,IAAaJ,GAC5C0O,EACH7lB,EAAgDmY,SAChDnY,EAA+B6a,OAsDlC,IArDA,EAAAiL,GAAA,GAAeD,GAAQ5O,I,QACrB,GAAIA,EAgBJ,GAVIpa,GAC0B,QAA3B,GAAD,EAACoa,GAAkBuB,iBAAS,UAATA,UAAci7C,GAGnC71D,KAAKmrB,eAAe3L,WAAW,CAC7BnG,SACAoG,kBAAkB,EAClB2H,0BAGmBpsB,IAAlBqe,EAAOpa,OAuBV,GAjBIy2D,GACD11D,KAAK8a,gBAAgBiL,UAAU1M,EAAOpa,QAAUe,KAAK8a,gBAAgB9b,UAAUqa,EAAOwB,SACvF7a,KAAK0jD,mBAAmBrqC,EAAO+F,aAC/Bs2C,GAAuB,GAOtB9pC,IAAe,EAAAzI,GAAA,GAAe9J,GAAUuS,IACzC5rB,KAAKob,yBAAyB/B,EAAOpa,OAAQoa,GAC7Cs8C,GAAa,GAKX12D,IAAW,EAAAogB,GAAA,GAAmBhG,EAAO8Q,qBAAuB,EAAA9K,GAAA,GAAmBhG,EAAO+Q,qBAInF,GAAG/Q,EAAO+F,YAAa,CAC5B,MAAME,EAAatf,KAAK0f,iBAAiBrG,EAAOpa,OAAQoa,EAAO+F,aAC5DE,IACDtf,KAAK81D,yBAAyBx2C,EAAYjG,GAC1CrZ,KAAKmrB,eAAehF,iBAAiB9M,G,OAPvCu8C,EAAa3tD,IAAIoR,EAAOpa,OAAQ,CAACoa,OAAQA,IAEzCrZ,KAAKG,IAAIvC,MAAM,eAAgByb,EAAQpF,QAzBvCjU,KAAKG,IAAIvC,MAAM,iBAAkByb,E,IAmClCu8C,EAAaviD,KAAM,CAEpB,MAAM2E,EAAU,IAAI49C,EAAa3iD,QAC3B/O,EAAW8T,EAAQ7T,KAAKlF,GAAWe,KAAK2f,mBAAmB1gB,KACjE0C,QAAQ0Q,IAAInO,GAAUY,MAAK,KACzB9E,KAAKmd,UAAUxW,cAAc,sBAAuBivD,GAEpD,IAAI,IAAIjwD,EAAI,EAAGA,EAAIqS,EAAQvb,SAAUkJ,EAAG,CACtC,MAAM1G,EAAS+Y,EAAQrS,GACvB3F,KAAKmd,UAAUxW,cAAc,gBAAiB,CAC5C1H,SACAoa,OAAQrZ,KAAKsb,cAAcrc,I,KAOnC,MAAMqb,EAASlY,EAAgDkY,MAGzDy7C,EAAgB/1D,KAAKmrB,eAAe1J,iBAAiB9H,GAAU,GACrE,IAAIq8C,EAAgB,EACpB,IAAI,IAAIrwD,EAAI,EAAGlJ,EAASs5D,EAAct5D,OAAQkJ,EAAIlJ,IAAUkJ,EAAG,CAC7D,MAAM0T,EAAS08C,EAAcpwD,IAC1B,EAAA0Z,GAAA,GAAmBhG,EAAO+F,eACzB42C,EAEFh2D,KAAKG,IAAIvC,MAAM,gCAAiCyb,E,CAIpD,MAAMoR,GACHnQ,GACD07C,GAAiB17C,IAChB2N,EAAMxrB,OACNguB,GACDzqB,KAAKmrB,eAAetL,iBAAiBlG,GAAU,GAG9Cg8C,EACD31D,KAAKob,2BAELpb,KAAKmd,UAAUxW,cAAc,sBAAuB,IAAI6K,KAG1D,MAAM+I,EAAU0N,EACVguC,EArIS,MAqIO15C,EAAqBhC,EAAUA,EAAQ9S,MAAM,EAAG8U,GACtE,MAAO,CACLkO,MAAOA,GAASwrC,EAAcA,EAAcx5D,OAAS,KAAO8d,EAAQA,EAAQ9d,OAAS,GACrF6d,QACAC,QAAS07C,EACV,EAGH,IAAItsD,EAAoDsK,EA0CxD,OAxCEtK,EADC1K,EACSe,KAAK4T,WAAWotB,uBAAuB,CAC/Cl4B,OAAQ,0BACRmL,OAAQA,EAAS,CACfwI,QAASzc,KAAK0c,gBAAgBC,gBAAgB1d,EAAO2d,YACrDL,MAnJW,IAoJXM,YAAa6D,EACb5D,UA/JW,EAgKXC,aAAc,GAEhBrhB,QAAS,CAEP47B,YAAY,GAEd2J,cAAgB7+B,IACdA,EAASpC,KAAKmrB,eAAenO,cAAc/d,EAAQmD,GAC5C6+B,EAAc7+B,MAOfpC,KAAK4T,WAAWotB,uBAAuB,CAC/Cl4B,OAAQ,sBACRmL,OAAQA,EAAS,CACf2G,UAAWjB,EACXkD,YAAa6D,EACb5D,UApLW,EAqLXo5C,YAAal2D,KAAK8a,gBAAgBiW,iBApLpColC,WAqLE55C,MA5KW,IA6KX6kB,KAAM,KAER1lC,QAAS,CAEP47B,YAAY,GAEd2J,kBAIGt3B,CACT,CAEaysD,gBAAgBn3D,EAAgBu+C,EAAoBsK,EAAgBpsD,EAI5E,CAAC,G,iDACGA,EAAQwyD,oBACRxyD,EAAQ4mB,SAEfrjB,EAASe,KAAK8a,gBAAgBwzC,kBAAkBrvD,IAAWA,EAG3D,IAAI,IAAI0G,EAAI,EAAGlJ,GAFfqrD,EAAOA,EAAKrgD,QAAQoZ,MAAK,CAACC,EAAGC,IAAMD,EAAIC,KAEVtkB,OAAQkJ,EAAIlJ,IAAUkJ,EAAG,CACpD,MAAMghB,EAAMmhC,EAAKniD,GACXquD,EAAkBh0D,KAAK0f,iBAAiB89B,EAAY72B,GACvDqtC,EAAgB92D,OAAO2pB,cACxB7mB,KAAK6+C,SAAS5/C,EAAQ+0D,EAAgBnyD,QAAS,CAC7CoyB,SAAU+/B,EAAgB//B,SAC1B2mB,aAAcl/C,EAAQk/C,aACtB5oB,OAAQt2B,EAAQs2B,SAGlB81B,EAAKh+C,OAAOnE,IAAK,KACflJ,E,CAIN,IAAIqrD,EAAKrrD,OACP,OAAOkF,QAAQM,UAGjB,MAAMo0D,QAAer2D,KAAK4T,WAAWid,YAC/BylC,EAAexO,EAAKh+C,OAAOusD,EAAOE,oBAAqBzO,EAAKrrD,OAAS45D,EAAOE,qBAE/E76D,EAAQ86D,eACT96D,EAAQ+6D,YAAa,GAGvB,MAAMtmC,EAKF,CAAC,EAECumC,EAAoB,GACpBC,EAAc7O,EAAK3jD,KAAKwiB,I,cAC5B,MAAMqtC,EAAkBh0D,KAAK0f,iBAAiB89B,EAAY72B,GACpD9kB,EAA2B7B,KAAKuuD,wBAAwBtvD,EAAQvD,GACtEg7D,EAAQp2D,KAAKuB,EAAQjF,IAErB,MAAMqW,EAAqC,CACzC,WACA,SAIEvX,EAAQ+6D,aACV50D,EAAQkyB,SAAW/zB,KAAKu0D,sBAAsBt1D,EAAQ+0D,GACtD/gD,EAAK3S,KAAK,QAAS,aAEA,QAAhB,EAAAuB,EAAQkyB,gBAAQ,eAAE0gC,YAAax1D,IAAWe,KAAK8a,gBAAgB7b,eACzD4C,EAAQ4nB,SAIf/tB,EAAQ86D,cAAiBxC,EAAgB57C,OAC3CnF,EAAK3S,KAAK,WAGZ,MAAMs2D,EAAqC,QAAxB,EAAA5C,EAAgBhgC,gBAAQ,eAAEygB,gBACvCoiB,EAAoB/O,EAAKrtD,QAAQm8D,GACvC,GAAGA,IAAqC,IAAvBC,EAA0B,CACzC,MAAMC,EAAgBJ,EAAQG,GAC9Bh1D,EAAQmyB,SAAW,CACjBr3B,EAAG,qBACH83C,gBAAiBqiB,EACjB55D,OAAQ,CAAC,E,CAQb+V,EAAKnU,SAASuI,IAEZxF,EAAQwF,IAAO,EAAAynB,GAAA,GAAKklC,EAAgB3sD,GAAK,IAG3C,MAAMy/B,EAA+D,QAAnD,EAAAjlC,EAAQuW,aAA2C,eAAE0uB,SAoBvE,OAnBGA,IACmC,CAAC,QAAS,SACrC5X,SAAS4X,EAAS/oC,QACxB8D,EAAsB3E,OAAO8qD,cAAe,GAG5ClhB,EAASqK,UAAYnxC,KAAKmd,UAAU9W,UACjB,EAAA0wD,GAAA,GAAsBjwB,KAEvCjlC,EAAQuW,MAA4Clb,OAAO85D,WAAY,IAK3EhD,EAAgBnN,aAC8B,QAApC,EAAG12B,EAAO,EAAA6jC,EAAgBnN,mBAAU,QAAjC12B,EAAO,GAAgC,CAACu9B,OAAQ,MAAO1tD,KAAKoiD,cAAe75B,SAAU,KAC7FA,SAASjoB,KAAKuB,GAGfA,CAAO,IAGhB,IAAI,MAAMwwD,KAAWliC,EAAQ,CAC3B,MAAM8mC,EAAQ9mC,EAAOkiC,GAClB4E,EAAM1uC,SAAS9rB,OAAS,GACzBw6D,EAAM1uC,SAASzpB,SAAS+C,IACtBA,EAAQglD,WAAaoQ,EAAMvJ,MAAM,G,CAKvCiJ,EAAY73D,SAAS+C,IACnB7B,KAAKmvD,qBAAqBttD,EAAS,CACjCioD,cAAepuD,EAAQk/C,mBAAgB5/C,EACvCo0D,YAAY,GACZ,IAGJ,MAAMV,EAAsC,CAAC,EAC1C1uD,KAAK2hD,iBAAiB1iD,KACvByvD,EAAmBC,eAAiB3uD,KAAK2hD,iBAAiB1iD,GAAQ8O,WAGpE,MAAMpE,EAA2C3J,KAAK4T,WAAWm7C,eAAe,2BAA4B,CAC1GmI,UAAWl3D,KAAK8a,gBAAgBiW,iBAAiBysB,GACjD5gD,GAAIkrD,EAAK3jD,KAAKwiB,IAAQ,EAAAtH,GAAA,GAAmBsH,KACzCsU,UAAW07B,EAAYxyD,KAAKtC,GAAYA,EAAQo5B,YAChDk8B,QAASn3D,KAAK8a,gBAAgBiW,iBAAiB9xB,GAC/Cm4D,cAAe17D,EAAQ27D,YACvBrlC,OAAQt2B,EAAQs2B,OAChB6oB,cAAen/C,EAAQk/C,aACvB0c,YAAa57D,EAAQ+6D,WACrBc,oBAAqB77D,EAAQ86D,aAC7BxzB,QAAStnC,EAAQmzD,aAAe7uD,KAAK8a,gBAAgBiW,iBAAiBr1B,EAAQmzD,mBAAgB7zD,GAC7F0zD,GAAoB5pD,MAAMmkB,IAC3BjpB,KAAKG,IAAI,2BAA4B8oB,GACrCjpB,KAAKoe,kBAAkBkV,qBAAqBrK,EAAQ,IAClDrrB,IAEF,MADAoC,KAAKyuD,oBAAoBkI,EAAa/4D,GAChCA,CAAK,IACVgrC,SAAQ,KACN5oC,KAAK2hD,iBAAiB1iD,KAAYyvD,UAC5B1uD,KAAK2hD,iBAAiB1iD,E,IAIjCe,KAAK2hD,iBAAiB1iD,GAAUyvD,EAEhC,MAAMxqD,EAA+B,CAACyF,GAKtC,OAJG2sD,EAAa75D,QACdyH,EAAS5D,KAAKN,KAAKo2D,gBAAgBn3D,EAAQu+C,EAAY8Y,EAAc56D,IAGhEiG,QAAQ0Q,IAAInO,GAAUY,KAAKuqD,GAAA,EACpC,G,CAEOmI,qBAAqB7wC,GAS5B,CAEQ8nC,oBAAoBlmC,EAA6B3qB,GACvD2qB,EAASzpB,SAAS+C,IAChB,GAAGA,EAAQjE,QAAUA,EAIrB,GAAGA,EAAO,CACRiE,EAAQjE,MAAQA,EAChBoC,KAAKmd,UAAUxW,cAAc,gBAAiB,CAACwvC,WAAYt0C,EAAQs0C,WAAYuX,OAAQ7rD,EAAQ8kB,IAAK/oB,UAEpG,MAAMyb,EAASrZ,KAAKsb,cAAczZ,EAAQ5C,QACvCoa,GACDrZ,KAAKmd,UAAUxW,cAAc,gBAAiB,CAAC1H,OAAQ4C,EAAQ5C,OAAQoa,U,aAGlExX,EAAQjE,K,GAGrB,CAEO65D,wBAAwBpwD,GAC7B,MAAMqwD,EAAIrwD,EAAIzH,MAAM,KACdX,GAAkBy4D,EAAE,GAE1B,MAAgB,cADkBA,EAAE,GACN13D,KAAK0sD,4BAA4BztD,GAAUe,KAAKwmB,0BAA0BvnB,EAC1G,CAEO2nB,sBAAsBpjB,EAA+CmjB,GAK1E,MAJuB,iBAAd,IACPnjB,EAAUxD,KAAKy3D,wBAAwBj0D,IAGlCA,GAAWA,EAAQgB,IAAImiB,EAChC,CAEQ49B,qBAAqBtlD,EAAgBlB,GAC3C,MAAMyF,EAA2B,IAAIgO,IAqBrC,OApBAhO,EAAQvE,OAASA,EACjBuE,EAAQzF,KAAOA,EACfyF,EAAQ6D,IAAM,GAAGpI,KAAUlB,IAkBpByF,CACT,CAEOgjB,0BAA0BvnB,G,QAC/B,OAA0C,QAA1C,KAAOe,KAAK4iD,yBAAwB3jD,UAAM,UAANA,GAAYe,KAAKukD,qBAAqBtlD,EAAQ,UACpF,CAEO04D,mBAAmBtwD,GACxB,MAAmB,iBAAV,EACAA,EAEArH,KAAKy3D,wBAAwBpwD,EAExC,CAEOuwD,eAAe7pD,GACpB,IAAI,MAAM9O,KAAUe,KAAK4iD,wBAAyB,CAChD,GAAG5iD,KAAK8a,gBAAgBiL,UAAU9mB,EAAOI,YACvC,SAGF,MAAMwC,EAAU7B,KAAK4iD,wBAAwB3jD,GAAQuF,IAAIuJ,GACzD,GAAGlM,EACD,OAAOA,C,CAIX,OAAO7B,KAAK4mB,sBAAsB,KAAM7Y,EAC1C,CAEO2R,iBAAiBzgB,EAAgB8O,GACtC,OAAI9O,EAIGe,KAAK4mB,sBAAsB5mB,KAAKwmB,0BAA0BvnB,GAAS8O,GAHjE/N,KAAK43D,eAAe7pD,EAI/B,CAEOs2C,eAAexiD,GAGpB,OAFaA,EAAQ8W,SAAW3Y,KAAK8a,gBAAgB9b,UAAU6C,EAAQ8W,UAAY,IAGrF,CAEO2C,cAAcrc,GACnB,OAAOe,KAAKmrB,eAAe7P,cAAcrc,EAC3C,CAEO44D,sBAAsB1hB,EAAgC2R,GAC3D,MAAMtkD,EAAUxD,KAAK23D,mBAAmBxhB,GACxC,IAAI2hB,GAAehQ,EAAKrrD,OAAQs7D,GAAcjQ,EAAKrrD,OACnD,IAAI,MAAMkqB,KAAOmhC,EAAM,CACrB,MAAMjmD,EAAU7B,KAAK4mB,sBAAsBpjB,EAASmjB,GASpD,GARImxC,IACFA,GAAe93D,KAAKg4D,WAAWn2D,IAG7Bk2D,IACFA,GAAc/3D,KAAKi4D,iBAAiBp2D,IAGnCi2D,GAAeC,EAAY,K,CAGhC,MAAO,CAACD,cAAaC,aACvB,CAEOG,0BAA0Bj5D,EAAgBqjB,GAC5CA,EACDtiB,KAAKmrB,eAAe0B,kBAAkB5tB,EAAQqjB,GAE9CtiB,KAAK2f,mBAAmB1gB,EAE5B,CAGO0gB,mBAAmB8R,GACxB,IAAI9nB,EACJ,QAAiB3O,IAAdy2B,EAAyB,CAC1B,MAAMxyB,EAASe,KAAK8a,gBAAgB9b,UAAUyyB,GAC9CzxB,KAAKG,IAAI2C,KAAK,qBAAsB7D,GAEpC,IAAImS,EAAMpR,KAAKmiD,yBAAyB39C,IAAIvF,GAK5C,GAJGmS,IACDzH,EAAUyH,EAAIzH,SAGbA,EACD,OAAOA,EAGTA,GAAU,SACV3J,KAAKmiD,yBAAyBl6C,IAAIhJ,EAAQmS,EAAM,CAC9C+mD,gBAAiBn4D,KAAK8a,gBAAgBs9C,uBAAuB3mC,GAC7D9nB,W,CAIJ,OAAG3J,KAAKq4D,6BAIRr4D,KAAKq4D,4BAA6B,EAAAtuD,EAAA,GAAM,GAAGjF,MAAK,KAC9C,MAAMwzD,EAAsC,GACtCp0D,EAA+C,CAAC,EACtD,IAAI,MAAOjF,GAAQ,gBAACk5D,EAAe,QAAExuD,MAAa3J,KAAKmiD,yBACrDmW,EAAiBh4D,KAAK63D,GACtBj0D,EAASjF,GAAU0K,EAGrB,MAAMqjB,EAAe,KACnB,IAAI,MAAM/tB,KAAUiF,EAClBlE,KAAKmiD,yBAAyBt+C,QAAQ5E,GACtCiF,EAASjF,GAAQgD,aAAQjH,E,EAkB7B,MAde,KAAW,mCACxB,OAAQ,CACN,MAAMoH,QAAepC,KAAK4T,WAAWC,UAAU,0BAA2B,CAAC0d,MAAO+mC,IAC5EC,EAAev4D,KAAKoe,kBAAkB0U,cACtC,MAAC7rB,GAAS7E,EAChB,IAAGm2D,EAAanyC,KAAOmyC,EAAanyC,MAAQnf,EAAMmf,IAKlD,OAAOhkB,QAJC,EAAA2H,EAAA,GAAM,I,CAMlB,IAEOwoD,GAASztD,MAAM1C,IACpB,IAAI,MAAMnD,KAAUiF,EAClBlE,KAAKmiD,yBAAyBt+C,QAAQ5E,GAGxCe,KAAKmrB,eAAehP,aAAa/Z,GAEjCA,EAAOmY,QAAQzb,SAASua,IACtB,MAAMpa,EAASoa,EAAOpa,OACnBA,IACDiF,EAASjF,GAAQgD,QAAQoX,UAClBnV,EAASjF,G,GAElB,GACDowD,GAAA,GAAMvqD,MAAK,KACZkoB,IAEAhtB,KAAKq4D,2BAA6B,KAC/Br4D,KAAKmiD,yBAAyB9uC,MAC/BrT,KAAK2f,oB,GAEP,KArDKhW,GAAW3J,KAAKq4D,0BAyD3B,CAEQG,eAAev5D,EAAgBw5D,EAAsBC,EAAkBp2C,GAC7E,IAAI3Y,EACJ,MAAMs3B,EAAiB03B,IACrB34D,KAAKoe,kBAAkBkV,qBAAqB,CAC1C32B,EAAG,cACH8d,OAAQ,CACN9d,EAAG,YACHypB,IAAKuyC,EAAgBvyC,IACrB8N,UAAWykC,EAAgBzkC,cAI3BykC,EAAgBrsC,QAIbtsB,KAAKw4D,eAAev5D,EAAQw5D,EAAYC,EAAQp2C,IAyBzD,OAVE3Y,EAZE2Y,EAYQtiB,KAAK4T,WAAWotB,uBAAuB,CAC/Cl4B,OAAQ,8BACRmL,OAAQ,CACNwI,QAASzc,KAAK0c,gBAAgBC,gBAAgB1d,EAAO2d,YACrDs4B,YAAY,EAAA71B,GAAA,GAAmBiD,IAEjC2e,kBAjBQjhC,KAAK4T,WAAWotB,uBAAuB,CAC/Cl4B,OAAQ,yBACRmL,OAAQ,CACNwkD,aACAC,SACA79C,KAAM7a,KAAK8a,gBAAgBiW,iBAAiB9xB,GAC5C8nD,OAAQ,GAEV9lB,kBAaGt3B,CACT,CAEaivD,aAAa35D,EAAgB45D,EAAqBH,EAAkBp2C,G,0CAC/E,GAAGtiB,KAAK8a,gBAAgBiL,UAAU9mB,KAAYqjB,EAAU,CACtD,MAAM3Y,EAAU3J,KAAK84D,WAAW75D,EAAQ,EAAG,GAErC85D,QAAsBpvD,EAEtBmc,EAAY7mB,EAAO2d,WACnBiM,EAAQkwC,EAActyC,QAAQ,IAAM,EAC1C,OAAOzmB,KAAK4T,WAAWke,gBAAgB,yBAA0B,CAC/DrV,QAASzc,KAAK0c,gBAAgBC,gBAAgBmJ,GAC9CihC,QAAQ,EAAA1nC,GAAA,GAAmBwJ,KAC1B/jB,MAAMssB,IACJA,GACDpxB,KAAKoe,kBAAkBiX,mBAAmB,CACxC14B,EAAG,iCACH4C,WAAYumB,EACZsiC,iBAAkBv/B,IAIfuI,I,CAIX,OAAOpxB,KAAKw4D,eAAev5D,EAAQ45D,EAAWH,EAAQp2C,GAAUxd,MAAK,KAKnE,GAJIwd,GACFtiB,KAAKgpD,sBAAsB/pD,GAG1B45D,EACD74D,KAAKmd,UAAUxW,cAAc,eAAgB,CAAC1H,SAAQoa,OAAQrZ,KAAKsb,cAAcrc,SAC5E,CACL,MAAMoI,EAAMrH,KAAKg5D,aAAa/5D,EAAQqjB,GAItC,UAHOtiB,KAAKkiD,sBAAsB76C,UAC3BrH,KAAKqiD,QAAQh7C,IAEhBib,EAAU,CACZ,MAAM/L,EAAIvW,KAAKmiD,yBAAyB39C,IAAIvF,GACzCsX,IACDvW,KAAKmiD,yBAAyBt+C,OAAO5E,GACrCsX,EAAE5M,QAAQ1H,aAAQjH,G,CAItBgF,KAAKmrB,eAAelN,qBAAqBhf,EAAQqjB,E,IAGvD,G,CAEQ0mC,sBAAsB/pD,GAC5B,CACEe,KAAK+iD,iBACL/iD,KAAKgjD,eACLhjD,KAAKijD,gBACLjjD,KAAK2hD,iBACL3hD,KAAK2oB,gBACL7pB,SAAS44D,WACFA,EAAEz4D,EAAO,IAGlB,IAAI,MAAMoI,KAAOrH,KAAKkjD,iBAChB77C,IAAQpI,GAAUoI,EAAI6lD,WAAWjuD,EAAS,cACrCe,KAAKkjD,eAAe77C,GAI/B,MAAMy6C,EAAqB9hD,KAAK8hD,mBAAmBt9C,IAAIvF,GACvD,GAAG6iD,EAAoB,CACrB,IAAI,MAAOn7B,EAAKhd,KAAYm4C,EAC1Bn4C,EAAQ1H,QAAQjC,KAAKw3D,qBAAqB7wC,IAG5Cm7B,EAAmBjjD,O,CAGrB,CACEmB,KAAK4iD,wBACL5iD,KAAK8iD,0BACLhkD,SAAS44D,IACT,MAAMuB,EAAKvB,EAAEz4D,GACVg6D,GACDA,EAAGp6D,O,IAIPmB,KAAKmrB,eAAehN,sBAAsBlf,EAC5C,CAEOi6D,mBAAmBj6D,GACxB,OAAO0C,QAAQ0Q,IAAI,CACjBrS,KAAK2e,gBAAgBxX,WACrBnH,KAAKm5D,iBAAiBl6D,KAEvB6F,MAAK,EAAEmC,EAAO+T,MACb/T,EAAM0iD,qBAAqB1qD,GAAU+b,EAAO6N,MAC5C7oB,KAAKmd,UAAUxW,cAAc,qBAAsB,CAAC1H,SAAQ4pB,MAAO7N,EAAO6N,OAAO,GAErF,CAEO6gC,qBAAqBzqD,EAAgBqjB,GAC1C,OAAOrjB,GAAUqjB,EAAW,IAAMA,EAAW,GAC/C,CAEO62C,iBAAiBl6D,EAAgBqjB,G,UACtC,MAAM0X,EAAmE,QAAlE,KAAGh6B,KAAKkjD,gBAAc,EAACljD,KAAK0pD,qBAAqBzqD,EAAQqjB,WAAS,aAAM,CAAC,EAChF,OAAG0X,EAAErwB,QAAgBqwB,EAAErwB,QACfqwB,EAAEnR,MAAclnB,QAAQM,QAAQ+3B,GAEjCA,EAAErwB,QAAU3J,KAAKo5D,UAAU,CAChCn6D,SACAo6D,YAAa,CAAC18D,EAAG,6BACjBksB,MAAO,EACPtM,MAAO,EACP+F,aACCxd,MAAM1C,I,MAGP,OAFA43B,EAAE1f,MAAQlY,EAAOkY,MACjB0f,EAAEnR,MAAyB,QAAjB,EAAAzmB,EAAOqkB,QAAQ,UAAE,eAAEE,IACtBqT,CAAC,IACP4O,SAAQ,YACF5O,EAAErwB,OAAO,GAEpB,CAEO2vD,uBAAuBr6D,EAAgBqjB,G,MAC5C,OAAuE,QAAhE,EAAAtiB,KAAKkjD,eAAeljD,KAAK0pD,qBAAqBzqD,EAAQqjB,WAAU,eAAEhI,KAC3E,CAEOi/C,uBAAuBt6D,EAAgBqjB,G,MAC5C,OAAuE,QAAhE,EAAAtiB,KAAKkjD,eAAeljD,KAAK0pD,qBAAqBzqD,EAAQqjB,WAAU,eAAEuG,KAC3E,CAEO2wC,oBAAoBv6D,EAAgB0nB,EAAa8yC,EAAiBznC,EAAkB0nC,GACzF,OAAO15D,KAAK4T,WAAWC,UAAU,+BAAgC,CAC/DgH,KAAM7a,KAAK8a,gBAAgBiW,iBAAiB9xB,GAC5Cw6D,QACAznC,SACA0nC,aACA98D,IAAI,EAAAyiB,GAAA,GAAmBsH,KACtB7hB,MAAMmkB,IAEPjpB,KAAKoe,kBAAkBkV,qBAAqBrK,EAAQ,GAExD,CAEO0wC,iBAAiB16D,GACtB,OAAOe,KAAK4T,WAAWke,gBAAgB,4BAA6B,CAClEjX,KAAM7a,KAAK8a,gBAAgBiW,iBAAiB9xB,KAC3C6F,MAAM6zD,IACP34D,KAAKoe,kBAAkBkV,qBAAqB,CAC1C32B,EAAG,cACH8d,OAAQ,CACN9d,EAAG,YACHypB,IAAKuyC,EAAgBvyC,IACrB8N,UAAWykC,EAAgBzkC,aAI3BykC,EAAgBrsC,OAcbtsB,KAAK25D,iBAAiB16D,IAbXe,KAAKwmB,0BAA0BvnB,GACvCH,SAAS+C,IACXA,EAA4B3E,OAAO8d,eAC7BnZ,EAA4B3E,OAAO8d,M,IAI/Chb,KAAKmd,UAAUxW,cAAc,uBAAwB,CAAC1H,SAAQ26D,UAAU,WACjE55D,KAAKkjD,eAAeljD,KAAK0pD,qBAAqBzqD,KAE9C,KAKb,CAEO46D,aAAahT,GAClB,MAAMoQ,EAAQj3D,KAAK6iD,uBAAuBgE,GAC1C,OAAO,EAAAgT,GAAA,GAAa/4D,MAAMC,KAAKk2D,EAAM7gD,UACvC,CAEO0jD,sBAAsBj4D,GAC3B,KAAIA,aAAO,EAAPA,EAASglD,YAAY,OAAOhlD,EAEhC,MAAM2B,EAAUxD,KAAK6iD,uBAAuBhhD,EAAQglD,YACpD,IAAIkT,EAAS9E,OAAOC,iBACpB,IAAI,MAAOvuC,EAAK9kB,KAAY2B,EACvB3B,EAAQ8kB,IAAMozC,IACfA,EAASl4D,EAAQ8kB,KAIrB,OAAO3mB,KAAK4mB,sBAAsBpjB,EAASu2D,EAC7C,CAEOC,eAAeC,EAAmBp5C,EAAuB,OAC9D,OAAO,EAAAomC,GAAA,GAAqBjnD,KAAK6iD,uBAAuBoX,GAAYp5C,EACtE,CAEOq5C,mBAAmBD,GACxB,MAAMnS,EAAO9nD,KAAKg6D,eAAeC,EAAW,OACtCz2D,EAAUxD,KAAK6iD,uBAAuBoX,GAC5C,OAAOnS,EAAK3jD,KAAKwiB,GAAQ3mB,KAAK4mB,sBAAsBpjB,EAASmjB,IAC/D,CAEOwzC,iBAAiBt4D,GACtB,OAAIA,EACKA,EAA4BglD,WAAmB7mD,KAAKg6D,eAAgBn4D,EAA4BglD,YAC7F,CAAChlD,EAAQ8kB,KAFD,EAGtB,CAEOyzC,eAAev4D,EAAoBwhB,GACxC,MAAMuG,EAAmB,GACzB,GAAI/nB,EAA4BglD,WAAY,CAC1C,MAAMrjD,EAAUxD,KAAK6iD,uBAAwBhhD,EAA4BglD,YACzE,IAAI,MAAOlgC,EAAK9kB,KAAY2B,EACvB6f,EAAOxhB,IACR+nB,EAAItpB,KAAKuB,E,MAIVwhB,EAAOxhB,IACR+nB,EAAItpB,KAAKuB,GAIb,OAAO+nB,CACT,CAEOJ,sBAAsBvqB,GAC3B,MAAMoa,EAASrZ,KAAKsb,cAAcrc,GAClC,OAAOe,KAAKq6D,sBAAsB7wC,uBAAsBnQ,aAAM,EAANA,EAAQ+F,cAAe,EACjF,CAEO02C,yBAAyBj0D,EAAoBwX,EAA8BrZ,KAAKsb,cAAczZ,EAAQ5C,SACxGoa,GAAUxX,EAAQ8kB,KAChB9kB,EAAQ8kB,IAAMtN,EAAOxX,EAAQ3E,OAAO0sB,IACrC,qBACA,uBACA/nB,EAAQ3E,OAAOqtB,QAAS,EAG9B,CAEO+vC,YAAYz4D,EAAkBnG,EAKhC,CAAC,G,cACJ,IAAImG,GAAyB,iBAAdA,EAAQlF,EACrB,OAGY,QAAd,EAAAkF,EAAQ3E,cAAM,QAAd2E,EAAQ3E,OAAW,CAAC,GAKpB,MAAM+B,EAASe,KAAKqkD,eAAexiD,GAC7B2B,EAAU9H,EAAQ8H,SAAWxD,KAAKwmB,0BAA0BvnB,GAC5D8mB,EAAkC,gBAAtBlkB,EAAQ8W,QAAQhc,EAC5BuzB,EAAcnK,GAAa/lB,KAAK0c,gBAAgBwT,YAAYjxB,EAAO2d,YACnE29C,EAA0B,YAAd14D,EAAQlF,EAEvBjB,EAAQmuB,aACThoB,EAAQ3E,OAAO2pB,aAAc,GAG/B,MAAMF,GAAM,EAAAjL,GAAA,GAAkB7Z,EAAQjF,IACtCiF,EAAQ8kB,IAAMA,EAEX4zC,IACE7+D,EAAQouD,cACTjoD,EAAQ3E,OAAO4wD,cAAe,GAG7BjsD,EAAQglD,aACqD,QAAjD,KAAG7mD,KAAK6iD,wBAAsB,EAAChhD,EAAQglD,mBAAU,aAAM7mD,KAAKukD,qBAAqBtlD,EAAQ,YAC9FgJ,IAAI0e,EAAK9kB,GAGhBA,EAAQ+xD,aAET/xD,EAAQqW,SAAWrW,EAAQ+xD,aAM/B,MAAM4G,EAAU34D,EAAQmyB,SACrBwmC,IACEA,EAAQ/lB,kBACT+lB,EAAQ/lB,gBAAkB5yC,EAAQgjD,cAAe,EAAAnpC,GAAA,GAAkB8+C,EAAQ/lB,kBAG1E+lB,EAAQtG,kBACTsG,EAAQtG,iBAAkB,EAAAx4C,GAAA,GAAkB8+C,EAAQtG,mBAIxD,MAAML,EAAU0G,GAAa14D,EAAQgyD,QAClCA,IACEA,EAAQ9M,SAAQ8M,EAAQ9M,QAAS,EAAArrC,GAAA,GAAkBm4C,EAAQ9M,SAC3D8M,EAAQ7M,cAAa6M,EAAQ7M,aAAc,EAAAtrC,GAAA,GAAkBm4C,EAAQ7M,eAG1E,MAAMyT,IAAgBx7D,EAClBw7D,IACF54D,EAAQ4hB,MAAQzjB,KAAK2jB,YAAYC,uBAInC,MAAMzd,EAAOnG,KAAK8a,gBAAgB7b,OAE5Bs3B,EAAYgkC,GAAc14D,EAA4BkyB,SAY5D,GAVAlyB,EAAQ5C,OAASA,EAEf4C,EAAQoW,OADPhZ,IAAWkH,EACKowB,EAAaA,EAAU9M,QAAUzpB,KAAK8a,gBAAgB9b,UAAUu3B,EAAU9M,SAAW,KAAgBtjB,EAGrGtE,EAAQ3E,OAAOu5B,OAAS50B,EAAQ4nB,QAAUxqB,EAASe,KAAK8a,gBAAgB9b,UAAU6C,EAAQ4nB,SAG7GzpB,KAAK81D,yBAAyBj0D,GAE3B00B,EAAW,CAETA,EAAUu+B,oBAAmBv+B,EAAUu+B,mBAAoB,EAAAp5C,GAAA,GAAkB6a,EAAUu+B,oBACvFv+B,EAAUs+B,eAAct+B,EAAUs+B,cAAe,EAAAn5C,GAAA,GAAkB6a,EAAUs+B,eAEhF,MAAMh6C,EAAO0b,EAAUw+B,iBAAmBx+B,EAAU9M,QAC9CixC,EAAQnkC,EAAUu+B,mBAAqBv+B,EAAUs+B,aACvD,GAAGh6C,GAAQ6/C,EAAO,CAChB,MAAMC,EAAkB36D,KAAK8a,gBAAgB9b,UAAU6b,GACjD+/C,GAAe,EAAAl/C,GAAA,GAAkBg/C,GACvC74D,EAAQg5D,UAAYF,EAAkB,IAAMC,C,CAU9C/4D,EAAQsW,UAAYnY,KAAK8a,gBAAgB9b,UAAUu3B,EAAU9M,SAEzDgxC,IACFlkC,EAAU9S,MAAQzjB,KAAK2jB,YAAYC,sB,CAIvC,MAAMk3C,EAAiC,CACrC/8D,KAAM,UACNkB,SACA8O,UAAW4Y,GAUb,IAAIo0C,GAAc,EAClB,MAAM3iD,EAAQmiD,GAAa14D,EAAQuW,MACnC,GAAGA,EACD,OAAOA,EAAMzb,GACX,IAAK,2BACIkF,EAAQuW,MACf,MAGF,IAAK,oBACAA,EAAMyjC,YACPkf,GAAc,EAEd3iD,EAAMwgB,MAAQ54B,KAAK88C,iBAAiBC,UAAU3kC,EAAMwgB,MAAOkiC,GAGxD1iD,EAAyCwgB,cACrC/2B,EAAQuW,MAGjB,MAGF,IAAK,mBAAoB,CACvB,MAAMhW,EAASpC,KAAKgtD,gBAAgBiG,SAAS76C,EAAM20C,KAAM30C,EAAMjT,QAAStD,GACxEuW,EAAM20C,KAAO3qD,EAAO2qD,KACpB30C,EAAMjT,QAAU/C,EAAO+C,QACvB,K,CAGF,IAAK,uBACH,GAAGiT,EAAMyjC,YACPkf,GAAc,MACT,CACL,MAAMC,EAAc5iD,EAAM0uB,SAC1B1uB,EAAM0uB,SAAW9mC,KAAK03C,eAAezH,QAAQ+qB,EAAaF,GAEtD1iD,EAAM0uB,UAA8B,kBAAlBk0B,EAAYr+D,IAChCo+D,GAAc,E,CAIlB,MAGF,IAAK,sBAAuB,CAC1B,MAAME,EAAaj7D,KAAK4sD,mBAAmBsO,+BAA+Bj8D,EAAQ0nB,EAAKjrB,EAAQouD,aAC/F1xC,EAAMu0C,QAAU3sD,KAAK4sD,mBAAmBuO,YAAY/iD,EAAMu0C,QAASsO,EAAYH,GAE3E1iD,EAAMu0C,gBACD9qD,EAAQuW,MAGjB,K,CAQF,IAAK,sBAAuB,CAC1BA,EAAMwgB,MAAQ54B,KAAKo7D,kBAAkBC,gBAAgBjjD,EAAMwgB,OAC3D,MAAMmpB,EAAgB3pC,EAAM6xC,eAC5B,GAAwB,0BAArBlI,aAAa,EAAbA,EAAeplD,GAA8B,CAC9C,MAAM2+D,EAAqBvZ,EAAc3pC,MACxCkjD,EAAsD1iC,MAAQ54B,KAAK88C,iBAAiBC,UAAWue,EAAsD1iC,MAAOkiC,GAC5JQ,EAAyDx0B,SAAW9mC,KAAK03C,eAAezH,QAASqrB,EAAyDx0B,SAAUg0B,E,CAEvK,K,CAGF,IAAK,0BACHC,GAAc,EAiBpB,GAPGR,GAAaQ,IACdl5D,EAAQuW,MAAQ,CAACzb,EAAG,2BACpBkF,EAAQA,QAAU,UACXA,EAAQoyB,gBACRpyB,EAAQ05D,gBAGbhB,GAAa14D,EAAQ+W,OAAQ,CAC/B,MAAMA,EAAS/W,EAAQ+W,OACjB/I,EAAShO,EAAQoW,SAAWjY,KAAKod,gBAAgBC,UAAUzgB,GAAK,MAAQ,GAC9E,IAAI4+D,EAAqBC,EAUzB,OARI7iD,EAAoDggB,QACrDhgB,EAAoDggB,MAAQ54B,KAAK88C,iBAAiBC,UAAWnkC,EAAoDggB,MAAOkiC,IAGvJliD,EAAekuB,WAChBluB,EAAekuB,SAAW9mC,KAAK03C,eAAezH,QAASr3B,EAAeggB,MAAOkiC,IAGzEliD,EAAOjc,GAEZ,IAAK,8BAE6B,QAA5B,EAAAic,EAAOggB,aAAqB,eAAE8iC,aAEhC9iD,EAAOjc,EAAIuzB,EAAc,gCAAkC,6BAExDA,IAEDtX,EAAOjc,EAAI,iCAGf,MAEF,IAAK,yBAA0B,CAK7B,IAAIoB,EAFJiC,KAAK27D,qBAAqBpjB,cAAc3/B,EAAOqhB,MAI7Cl8B,OADqB/C,IAApB4d,EAAOuiB,SACD,UAEA,QAGLjL,IACFnyB,GAAQ,MAAQ8R,GAIlB+I,EAAO7a,KAAOA,EAEd,K,CAGF,IAAK,6BAOAmyB,IAEDtX,EAAOjc,EAAI,iCAEb,MAEF,IAAK,+BACAuzB,IAEDtX,EAAOjc,EAAI,mCAEb,MAEF,IAAK,2BACwB,IAAxBic,EAAOE,MAAMrc,QAEdmc,EAAOxZ,QAAUwZ,EAAOE,MAAM,GAE3BjX,EAAQoW,SAAWW,EAAOxZ,UAGzBwZ,EAAOjc,EAFNopB,EAEU,0BAA4BlW,EAG5B,0BAA4BA,IAGnC+I,EAAOE,MAAMrc,OAAS,IAE9Bmc,EAAOjc,EAAI,6BAEb,MAEF,IAAK,8BACAkF,EAAQoW,SAAWW,EAAOxZ,UAE3BwZ,EAAOjc,EAAI,yBAA2BkT,GAExC,MAEF,IAAK,kCACH2rD,EAAc5iD,EAAOpZ,QAAQH,UAAS,GACtCo8D,EAAYx8D,EACZ,MAEF,IAAK,6BACHu8D,EAAcv8D,EACdw8D,EAAY7iD,EAAOrZ,WAAWF,UAAS,GACvC,MAEF,IAAK,4BAEHwC,EAAQ6kD,eAAgB,SACjB7kD,EAAQ3E,OAAO0sB,WACf/nB,EAAQ3E,OAAOqtB,OACtB,MAEF,IAAK,yBAEH3R,EAAO7a,MACJ6a,EAAO1b,OAAO69B,MAAQ,SAAW,UACb//B,IAApB4d,EAAOuiB,SAA0Bt5B,EAAQ3E,OAAO0sB,IAAM,OAAS,MAAS,UAEnD5uB,IAApB4d,EAAOuiB,SAAyB,KACV,iCAApBviB,EAAOna,OAAO9B,EACZ,SACA,aAMT6+D,GACCC,IACCz7D,KAAKiqB,eAAeuxC,KACpBx7D,KAAKkqB,eAAeuxC,IACvBz7D,KAAK47D,cAAcJ,EAAaC,E,CAoBpC,OANGlB,GAAa14D,EAAQA,QAAQpF,SAAWoF,EAAQ05D,eACjDv7D,KAAKkvD,oBAAoBrtD,GAG3B2B,EAAQyE,IAAI0e,EAAK9kB,GAEVA,CACT,CAEO0d,aAAagJ,EAAiB7sB,EAKhC,CAAC,GACJ,OAAI6sB,EAAiBmQ,QACpBnQ,EAAiBmQ,OAAQ,EAC1BnQ,EAASzpB,SAAQ,CAAC+C,EAASyC,EAAKwG,KAC9BA,EAAIxG,GAAOtE,KAAKs6D,YAAYz4D,EAASnG,EAAQ,KAHZ6sB,CAOrC,CAEaszC,sBAAsB58D,EAAgBqjB,G,0CACjD,MACM7a,EADiBzH,KAAKsmB,kBAAkBrnB,EAAQqjB,GACzBmE,QAAQhf,MACrC,GAAGA,EAAMgjB,MAAM,cAAoBhjB,EAAMhL,OAAQ,CAC/C,IAAIq/D,EACJ,MAAMC,EAAW/7D,KAAK8a,gBAAgB7b,OACtC,IAAI,MAAM0nB,KAAOlf,EAAO,CACtB,MAAM5F,EAAU7B,KAAK0f,iBAAiBzgB,EAAQ0nB,GAG9C,IAFao1C,IAAa98D,EAAS4C,EAAQoW,SAAW8jD,EAAWl6D,EAAQ3E,OAAO0sB,aAGrE5pB,KAAKg8D,eAAen6D,EAAS,SAAS,CAC7Ci6D,EAAcj6D,EACd,K,EAQN,OAAOi6D,C,CAEX,G,CAEQ5M,oBAAoBrtD,GAC1B,MAAMo6D,EAAcp6D,EAAQoyB,SAAWpyB,EAAQoyB,SAASxsB,QAAU,GAClE5F,EAAQA,SAAU,EAAAy1C,GAAA,GAASz1C,EAAQA,QAASo6D,GAE5C,MAAMC,GAAa,EAAAC,GAAA,GAAct6D,EAAQA,SACzCA,EAAQ05D,eAAgB,EAAAa,GAAA,GAAcH,EAAaC,EACrD,CAEOG,eAAep9D,EAAgB6oD,EAAgBrpD,EAA2BoD,GAC/E,OAAO7B,KAAK4T,WAAWke,gBAAgB,kBAAmB,CACxDjX,KAAM7a,KAAK8a,gBAAgBiW,iBAAiB9xB,GAC5CrC,GAAIkrD,EAAK3jD,KAAKwiB,IAAQ,EAAAtH,GAAA,GAAmBsH,KACzCloB,OAAQ,CACN9B,EAAG8B,GAELoD,WAEJ,CAEO67C,SAAStmC,EAAc9X,EAAiBm+C,GAC7C,MAAMx+C,EAASK,EAASA,EAAOD,UAAS,GAAQ+X,EAAM/X,WACtD,GAAGo+C,EAAY,CACb,MAAM7b,GAAW,UAEjB,OAAO5hC,KAAK4T,WAAWC,UAAU,oBAAqB,CACpD2oC,IAAKx8C,KAAKod,gBAAgB4d,aAAa5jB,GACvCyD,KAAM7a,KAAK8a,gBAAgBiW,iBAAiB9xB,GAC5Cg8B,UAAW2G,EACXme,YAAatC,IACZ34C,MAAMmkB,IACPjpB,KAAKoe,kBAAkBkV,qBAAqBrK,EAAQ,G,CAIxD,MAAMvsB,EAAM,SACZ,GAAG4C,EAAQ,CACT,IAAIqK,EAOJ,OALEA,EADC3J,KAAK0c,gBAAgBqJ,UAAUzmB,GACtBU,KAAK0c,gBAAgBohB,gBAAgBx+B,EAAQ,CAAC8X,IAE9CpX,KAAK0c,gBAAgB2hB,YAAY/+B,EAAQ8X,EAAO,GAGrDzN,EAAQsE,OAAOrQ,IACpB,GAAkB,6BAAfA,aAAK,EAALA,EAAOG,MAKV,MAAMH,EAJJA,EAAMqwD,SAAU,CAIP,IACVnpD,MAAK,IACC9E,KAAK6+C,SAAS5/C,EAAQvC,EAAM,IAAMsD,KAAK8a,gBAAgBkjC,gBAAgB5mC,EAAM/X,c,CAIxF,OAAOW,KAAK6+C,SAAS5/C,EAAQvC,EAC/B,CAEO4/D,gBAAgBtkD,EAAmB2B,GACxC3Z,KAAK4T,WAAWC,UAAU,0BAA2B,CACnD6G,aAAc1C,EAAQ7T,KAAKlF,IAClB,CACLtC,EAAG,kBACHke,KAAM7a,KAAK8a,gBAAgBiW,iBAAiB9xB,GAC5C2b,UAAWjB,QAGd7U,MAAMmkB,IAEPjpB,KAAKoe,kBAAkBkV,qBAAqBrK,EAAQ,GAExD,CAEO3I,UAAUhE,GACf,OAAOtc,KAAKqgB,eAAeC,UAAUhE,EACvC,CAEasU,gBAAgBl1B,G,gDAK3B,MAAM,OAACuD,EAAM,QAAEwc,EAAO,SAAEa,GAAWb,EAAUxc,OAASjE,IAAaU,EACnE,QAAgBV,IAAbshB,EACD,MAAM,IAAItR,MAAM,eAGlB,GAAGsR,EAAW,EACZ,OAAOtc,KAAKqgB,eAAeuQ,gBAAgB3xB,EAAQqd,GAGrD,MAAMjD,EAASrZ,KAAKmrB,eAAe5H,iBAAiBtkB,EAAQwc,GAC5D,IAAIpC,EAAQ,WAAMre,EAElB,MAAMggB,IAAsB,QAAb,EAAA3B,EAAOnc,cAAM,eAAE8d,cAAShgB,EAEvC,GAAGggB,EAAQ,CACT,MAAMuK,QAAYvlB,KAAK4T,WAAW4I,SAASf,EAAU,WAA2B,IAAba,EAAiB,YAAc,OAClG,GAAGtc,KAAKmrB,eAAepM,gBAAgBzC,GAAU7f,QAAU8oB,EACzD,MAAM,EAAA5N,EAAA,GAAU8D,EAAU,kBAAoB,0B,CAIlD,OAAGA,EACMzb,KAAK0c,gBAAgBumB,uBAAuBhkC,EAAO2d,WAAYnB,EAAST,GAG1Ehb,KAAK4T,WAAWC,UAAU,2BAA4B,CAC3DgH,KAAM7a,KAAK8a,gBAAgBs9C,uBAAuBn5D,GAClD+b,WACClW,MAAMssB,IACP,MAAMl0B,EAA8C8d,EAAS,CAACA,UAAU,CAAC,EACzEhb,KAAKoe,kBAAkB+K,WAAW,CAChCxsB,EAAG,qBACHke,KAAM7a,KAAK8a,gBAAgByhD,cAAct9D,GACzC2b,UAAW0B,EACXpf,UACA,G,IAICs/D,iBAAiBv9D,EAAgBw9D,G,MACtC,MAAMpjD,EAASrZ,KAAKsb,cAAcrc,GAClC,IAAIoa,EAAQ,OAAO1X,QAAQC,SAE3B,MAAM2oB,GAASkyC,KAAqB,QAAb,EAAApjD,EAAOnc,cAAM,eAAEkpD,mBAAcprD,EACpD,OAAOgF,KAAK4T,WAAWC,UAAU,4BAA6B,CAC5DgH,KAAM7a,KAAK8a,gBAAgBs9C,uBAAuBn5D,GAClDsrB,WACCzlB,MAAMssB,IACP,GAAGA,EAAM,CACP,MAAMl0B,EAAkDqtB,EAAS,CAACA,UAAU,CAAC,EAC7EvqB,KAAKmmD,yBAAyB,CAC5BxpD,EAAG,yBACHke,KAAM7a,KAAK8a,gBAAgByhD,cAAct9D,GACzC/B,U,IAIR,CAEO0+D,cAAcJ,EAAqBC,GACxC,IAAIz7D,KAAKiqB,eAAeuxC,KACrBx7D,KAAKkqB,eAAeuxC,IACrBz7D,KAAK0c,gBAAgBga,QAAQ+kC,EAAU7+C,YAAa,CACpD,MAAM8/C,EAAW18D,KAAK0c,gBAAgBsB,QAAQw9C,EAAY5+C,aACvD8/C,aAAQ,EAARA,EAAU5yC,cAAgB4yC,EAAS5yC,YAA0CvqB,aAAek8D,EAAU7+C,aACvG5c,KAAKiqB,eAAeuxC,GAAeC,EACnCz7D,KAAKkqB,eAAeuxC,GAAaD,EAEjCx7D,KAAKmd,UAAUxW,cAAc,iBAAkB,CAAC60D,cAAaC,cAE7Dz7D,KAAKmrB,eAAepD,oBAAoByzC,G,CAG9C,CAEQmB,mBAAmB96D,EAAkB+6D,G,QAC3C,GAAuC,QAAnC,EAAA/6D,aAAO,EAAPA,EAA6B3E,cAAM,eAAE2pB,YACvC,OAAO,EAGT,MAAMg2C,EAAa,CACjB,oBACA,uBACA,uBAOF,MAJY,SAATD,GACDC,EAAWv8D,KAAK,uBAGduB,GACc,YAAdA,EAAQlF,GACRkF,EAAQ8nB,SACR9nB,EAAQkyB,UACRlyB,EAAQ+xD,YACR/xD,EAAQuW,QAAkD,IAAzCykD,EAAWpiE,QAAQoH,EAAQuW,MAAMzb,IAClDkF,EAAQoW,QAAUjY,KAAKod,gBAAgBkT,MAAMzuB,EAAQoW,SAIjC,0BAAR,QAAb,EAAApW,EAAQuW,aAAK,eAAEzb,KACZkF,EAAQuW,MAAM0uB,SAA+BqK,SAAkE,UAAtDtvC,EAAQuW,MAAM0uB,SAA+B/oC,MAK9G,CAEai+D,eAAen6D,EAAmD+6D,EAAwB,Q,gDACrG,SAAI/6D,IAAY7B,KAAK28D,mBAAmB96D,EAAS+6D,MAKlB58D,KAAKqkD,eAAexiD,KAAa7B,KAAKod,gBAAgBC,UAAUzgB,QAIlEoD,KAAK8a,gBAAgBoV,YAAYruB,EAAQ5C,QACpEe,KAAK0c,gBAAgBogB,UAAUj7B,EAAQ5C,OAAO2d,WAAY,iBAC1D/a,EAAQ3E,OAAO0sB,MAIS,gBAAtB/nB,EAAQ8W,QAAQhc,GAChBkF,EAAQ4hB,MAAQ,EAAAC,GAAA,IAAM,UAAe1jB,KAAK4T,WAAWid,aAAaisC,iBACxB,sBAAR,QAAlC,EAACj7D,EAA4BuW,aAAK,eAAEzb,I,IASnCs7D,iBAAiBp2D,GACtB,OAAOA,IACLA,EAAQ5C,OAAOQ,UACfoC,EAAQ3E,OAAO0sB,KAC+C,SAA9D5pB,KAAK0c,gBAAgBsB,QAAQnc,EAAQ5C,OAAO2d,YAAYjgB,GACxDqD,KAAK0c,gBAAgBogB,UAAUj7B,EAAQ5C,OAAO2d,WAAY,uBACrD/a,EAAQ3E,OAAO2pB,eAAiBhlB,EAAQjE,MACjD,CAEOm/D,iBAAiB99D,GACtB,OAAOe,KAAKsmB,kBAAkBrnB,GAAQ2/C,WACxC,CAEOh0B,mBAAmBvE,EAAgCxkB,G,QAExD,IAAIA,EACF,OAAO,EAGT,MAAMm7D,EAAsBn7D,EAA4B88C,aACxD,IAAIqe,KACa,QAAd,EAAAn7D,EAAQ3E,cAAM,eAAE0sB,OACf/nB,EAAmC+W,OACrC,OAAO,EAGT,GAA6B,uBAA1BokD,aAAkB,EAAlBA,EAAoBrgE,GACrB,OAAO,EAGT,MAAMsgE,EAAkB52C,EAAeu4B,YACvC,GAAGoe,EACD,QAAGC,GAAmBA,EAAgBt2C,KAAO9kB,EAAQ8kB,KAIlDq2C,EAAmB9/D,OAAOggE,YAI1B72C,EAAe82C,UAChBt7D,EAAQ8kB,IAAMN,EAAe82C,UAC5BH,EAA6F9/D,OAAOkgE,aACpGJ,EAA6F9/D,OAAOykB,QAAS,GAGhHq7C,EAAmBr2C,IAAM9kB,EAAQ8kB,IAKL,sBAAzBq2C,EAAmBrgE,IACpBqgE,EAAmB/kD,OAASjY,KAAK8a,gBAAgB9b,UAAU6C,EAAQ4nB,UAGrEpD,EAAeu4B,YAAcoe,EAEtB,IAGT,GAAGn7D,EAAQ3E,OAAO0sB,IAChB,GAAGqzC,GAED,IADA,EAAA90C,GAAA,GAA4C80C,GACzCA,EAAgB//D,OAAOkgE,aACvBH,EAAgB//D,OAAOykB,SACvB9f,EAAQ8kB,IAAMs2C,EAAgBt2C,KAAO9kB,EAAQ3E,OAAO2pB,cACpDhlB,EAA4BA,QAG7B,OAFAo7D,EAAgB//D,OAAOykB,QAAS,GAEzB,QAEA0E,EAAe82C,UACxBt7D,EAAQ8kB,IAAMN,EAAe82C,YAC7B92C,EAAe82C,SAAWt7D,EAAQ8kB,KAKtC,OADA,EAAAwB,GAAA,GAAmCtmB,KACV,iCAAR,QAAd,EAAAA,EAAQ+W,cAAM,eAAEjc,MAChBsgE,EACCp7D,EAAQ+W,OAAOxZ,UAAa69D,EAAoDhlD,OAChFjY,KAAKod,gBAAgBkT,MAAMzuB,EAAQ+W,OAAOxZ,YAG5CinB,EAAeu4B,YAAc,CAC3BjiD,EAAG,oBACHgqB,IAAK9kB,EAAQ8kB,IACbzpB,OAAQ,CAAC,GAGJ,GAIX,CAEOmgE,iBAAiBp+D,EAAgBo6D,GAGtC,OAFIr5D,KAAKijD,gBAAgBhkD,KAASe,KAAKijD,gBAAgBhkD,GAAU,CAAC,GAC9De,KAAKijD,gBAAgBhkD,GAAQo6D,KAAcr5D,KAAKijD,gBAAgBhkD,GAAQo6D,GAAe,CAAC5yC,QAAS,KAC9FzmB,KAAKijD,gBAAgBhkD,GAAQo6D,EACtC,CAEOiE,kBACLr+D,EACA6kB,EACAy5C,GAAW,EACXj7C,GAEA,OAAGtiB,KAAK8a,gBAAgB0iD,iBAAiBv+D,GAChC0C,QAAQM,QAAQ6hB,EAAQ3f,KAAKrH,IAC3B,CACLH,EAAG,yBACHO,OAAQ,CAAC,EACTJ,OAAQA,EACRwd,MAAO,QAKCijD,EAAWv9D,KAAK4T,WAAW2tB,mBAAqBvhC,KAAK4T,WAAWC,WAAWoL,KAAKjf,KAAK4T,WAC5F6pD,CAAK,6BAA8B,CACxC5iD,KAAM7a,KAAK8a,gBAAgBiW,iBAAiB9xB,GAC5C6kB,UACAoxB,WAAY5yB,GAAW,EAAAjD,GAAA,GAAmBiD,QAAYtnB,GAE1D,CAEO0iE,uCAAuCrE,EAAoC5yC,EAAmBjjB,EAA+C+Y,GAClJ,MAAMohD,EAAW39D,KAAK23D,mBAAmBn0D,GACzC,OAAO,EAAAo6D,GAAA,GAA4BvE,EAAa5yC,EAAQtiB,KAAKwiB,GAAQg3C,EAASn5D,IAAImiB,KAAOpK,EAC3F,CAEO68C,WAAU,OAACn6D,EAAM,MAAEob,EAAK,YAAEg/C,EAAW,MAAExwC,EAAK,MAAEtM,EAAK,SAAEshD,EAAQ,UAAEC,EAAS,SAAEx7C,EAAQ,SAAE3I,EAAQ,QAAEgzB,EAAO,QAAEE,IAoB5G,GAAG7sC,KAAK8a,gBAAgB0iD,iBAAiBv+D,GACvC,OAAO0C,QAAQM,QAAQ,CACrBqY,MAAO,EACPyjD,iBAAkB,EAClBC,eAAWhjE,EACXyrB,QAAS,KAITpM,IAAOA,EAAQ,IACfg/C,IAAaA,EAAc,CAAC18D,EAAG,kCACtB3B,IAAVuhB,IAAqBA,EAAQ,IAC5BshD,IAAUA,EAAW,GACrBC,IAAWA,EAAY,GAE3BnxB,EAAUA,EAAUA,EAAU,IAAO,EAAI,EACzCE,EAAUA,EAAUA,EAAU,IAAO,EAAI,EAEzC,IAAIoxB,EAAyB,GAI1BH,IACDvhD,GAASuhD,GAMX,IAAIt6D,EAaJ,IAPGvE,GAAW6+D,GAAcj1C,GAAUxO,GAAmB,IAAVkC,GAAgB+F,IAC7D9e,EAEExD,KAAKsmB,kBAAkBrnB,GACzBg/D,EAAYj+D,KAAK09D,uCAAuCrE,EAAY18D,EAAG6G,EAAQijB,QAAQhf,MAAOzH,KAAKwmB,0BAA0BvnB,GAASsd,IAGrI0hD,EAAUxhE,OAAQ,CACnB,KAAGwhE,EAAUxhE,OAAS8f,GAIpB,OAAO5a,QAAQM,QAAQ,CACrBqY,MAA8B,EAC9B0jD,UAAW,EACXD,iBAAkB,EAClBt3C,QAASw3C,IAPXp1C,EAAQo1C,EAAUA,EAAUxhE,OAAS,GAAGkqB,IACxCpK,GAAgB0hD,EAAUxhE,M,CAkB9B,MACMqM,EAA0D9I,KAAK4T,WAAWC,UAAWoL,KAAKjf,KAAK4T,YAErG,IAAIk7C,EACJ,GAAG7vD,IAAW4+D,QAAyB7iE,IAAb2e,EACxBm1C,EAAahmD,EAAO,kBAAmB,CACrC+R,KAAM7a,KAAK8a,gBAAgBiW,iBAAiB9xB,GAC5CouC,EAAGhzB,GAAS,GACZvd,OAAQu8D,EACR6E,SAAUvxB,EACVwxB,SAAUtxB,EACVtwB,QACAO,WAAW,EAAAuC,GAAA,GAAmBwJ,IAAU,EACxCu1C,WAAYN,GAAaA,EAAY,EACrC/W,OAAQ,EACRsX,OAAQ,EACRj9B,KAAM,GACN8T,YAAY,EAAA71B,GAAA,GAAmBiD,IAAa,GAC3C,CAEDgV,YAAY,QAET,CAEL,IAAI6+B,EACAmI,EAAW,EACf,MAAMC,EAAgB11C,GAAS7oB,KAAK0f,iBAAiBzgB,EAAQ4pB,GAE1D01C,GAAiBA,EAAc96C,OAEhC66C,EAAWC,EAAc3hE,GACzBu5D,EAAen2D,KAAKqkD,eAAeka,IAGrCzP,EAAahmD,EAAO,wBAAyB,CAC3CukC,EAAGhzB,EACHvd,OAAQu8D,EACR6E,SAAUvxB,EACVwxB,SAAUtxB,EACV2xB,YAAaX,EACb3H,YAAal2D,KAAK8a,gBAAgBiW,iBAAiBolC,GACnDr5C,UAAWwhD,EACX/hD,QACA3B,UAAWjB,GACV,CAED2d,YAAY,G,CAIhB,OAAOw3B,EAAWhqD,MAAM25D,IACtBz+D,KAAKod,gBAAgBgL,aAAaq2C,EAAa3lD,OAC/C9Y,KAAK0c,gBAAgB2L,aAAao2C,EAAan2C,OAC/CtoB,KAAKuf,aAAak/C,EAAal2C,UAU5B,MACDvoB,KAAKG,IAAI,oBAAqBk5D,EAAaoF,GAG7C,MAAMC,EAAqBD,EAAankD,OAAU2jD,EAAUxhE,OAASgiE,EAAal2C,SAAS9rB,OAc3F,OAZAgiE,EAAal2C,SAASzpB,SAAS+C,IAC7B,MAAM5C,EAASe,KAAKqkD,eAAexiD,GACnC,GAAG5C,EAAO+nB,YAAa,CACrB,MAAMjJ,EAAO/d,KAAK0c,gBAAgBsB,QAAQ/e,EAAO2d,YAC9CmB,EAAK+L,aACN9pB,KAAK47D,cAAc38D,EAAS8e,EAAK+L,YAA0CvqB,WAAWF,UAAS,G,CAInG4+D,EAAU39D,KAAKuB,EAAQ,IAGlB,CACLyY,MAAOokD,EACPX,iBAAkBU,EAAaV,kBAAoB,EACnDC,UAAWS,EAAaT,UACxBv3C,QAASw3C,EACV,GAEL,CAEOU,uBAAuB1/D,EAAgB0nB,GAC5C,MAAM2gC,EAAaroD,EAAS,IAAM0nB,EAClC,IAAI,MAAM69B,KAAaxkD,KAAKojD,iBAC1B,GAAGpjD,KAAKojD,iBAAiBoB,KAAe8C,EAAY,OAGtDtnD,KAAK4+D,qBAAqB3/D,EAAQ0nB,EACpC,CAEOk4C,kCAAkCh9D,GACvC,MAAM2iD,EAAY3iD,EAAQ5C,OAAS,IAAM4C,EAAQ8kB,IACjD,GAAG3mB,KAAKmjD,iCAAiCqB,GAAY,OAErD,MAAMsa,GAAe,EAAAz/C,GAAA,GAAmBsB,KAAK4E,OAAOvlB,KAAKm6D,iBAAiBt4D,KACpEk9D,EAA8C,CAClDpiE,EAAG,iBACHO,OAAQ,CACN8hE,WAAW,GAEbpiE,GAAIoD,KAAKq6D,sBAAsB7wC,sBAAsBs1C,GACrDr7C,KAAM5hB,EAAQ4hB,KACdgG,QAAS,CAAC9sB,EAAG,WAAYyC,QAAS,MAClCuZ,QAAS9W,EAAQ8W,QACjBC,OAAQ,CACNjc,EAAG,kCAELq3B,SAAUh0B,KAAK2zD,oBAAoB9xD,EAAQ5C,OAAQ4C,EAAQjF,KAG7DoD,KAAKuf,aAAa,CAACw/C,GAAsB,CAACl1C,YAAY,IACtD7pB,KAAKmjD,iCAAiCqB,GAAaua,EAAoBp4C,GACzE,CAEOs4C,0BAA0BhgE,EAAgBqjB,GAC/C,OAAOtiB,KAAKmjD,iCAAiClkD,EAAS,IAAMqjB,EAC9D,CAEOs8C,qBAAqB3/D,EAAgB0nB,GAC1C,OAAO3mB,KAAK4T,WAAWke,gBAAgB,gCAAiC,CACtEjX,KAAM7a,KAAK8a,gBAAgBiW,iBAAiB9xB,GAC5Ck/C,QAAQ,EAAA9+B,GAAA,GAAmBsH,KAC1B7hB,MAAM1C,I,MACPpC,KAAK0c,gBAAgB2L,aAAajmB,EAAOkmB,OACzCtoB,KAAKod,gBAAgBgL,aAAahmB,EAAO0W,OACzC9Y,KAAKuf,aAAand,EAAOmmB,UAEzB,MAAM1mB,EAAU7B,KAAKk/D,sBAAsB98D,EAAOmmB,SAAS,IACrDi8B,EAAY3iD,EAAQ5C,OAAS,IAAM4C,EAAQ8kB,IAEjD3mB,KAAK6+D,kCAAkCh9D,GAEvC,MAAMwkB,EAAiBrmB,KAAKsmB,kBAAkBzkB,EAAQ5C,OAAQ4C,EAAQ8kB,KAChEw4C,EAAW/8D,EAAO2kD,QAAS,EAAArrC,GAAA,GAAkBtZ,EAAO2kD,SAAW,EACrE3kD,EAAO+nB,kBAAoB9D,EAAewE,WAAY,EAAAnP,GAAA,GAA0C,QAAxB,EAAAtZ,EAAO+nB,yBAAiB,QAAItoB,EAAQ8kB,KAC5GvkB,EAAOgoB,mBAAqB/D,EAAeyE,iBAAkB,EAAApP,GAAA,GAAkBtZ,EAAOgoB,qBAAuB,EAE7G,MAAMxiB,EAAQye,EAAeI,QAAQ7e,MAQrC,OAPGye,EAAewC,OAASxC,EAAewC,MAAQs2C,GAAYv3D,EAAM6iB,MAAM,cACxE7iB,EAAMw3D,SAAS,aAEjB/4C,EAAewC,MAAQs2C,EAEvBn/D,KAAKojD,iBAAiBoB,GAAavlD,EAAS,IAAM0nB,EAE3C9kB,CAAO,GAElB,CAEQwjD,iBAAiBxjD,GACvB7B,KAAKmd,UAAUxW,cAAc,sBAAuB9E,EACtD,CA0DOuZ,yBAAyBnc,EAAiBoa,G,QAC/C,QAAcre,IAAXiE,EAAsB,CACvB,IAAImS,EAAMpR,KAAKiiD,mBAAmBz9C,IAAIvF,GAClCmS,GACFpR,KAAKiiD,mBAAmBh6C,IAAIhJ,EAAQmS,EAAM,CAAC,GAG7C,MAAMoS,EAA8B,iBAAb,GACnBnK,GAAWmK,GAAyB,WAAbnK,EAAO1c,EAChCyU,EAAIiI,OAASA,GAEH,QAAV,EAAAjI,EAAI6L,cAAM,QAAV7L,EAAI6L,OAAW,IAAIzL,KAChBgS,EACDpS,EAAI6L,OAAOhV,IAAKoR,EAAsBzc,GAAIyc,GAE1CjI,EAAI6L,OAAOhV,IAAIoR,OAAkBre,G,CAKvC,OAAmC,QAAnC,EAAOgF,KAAKq/D,+BAAuB,QAA5Br/D,KAAKq/D,yBAA4B,EAAAt1D,EAAA,GAAM,GAAGjF,MAAK,KACpD9E,KAAKq/D,6BAA0BrkE,EAC/BgF,KAAKqjD,kBAAkB,GAE3B,CAEaic,eAAergE,EAAgB6oD,EAAgB4Q,G,kDAC1D,IAAI/uD,EAEJ,MAAM0sD,QAAer2D,KAAK4T,WAAWid,YAC/BylC,EAAexO,EAAKh+C,OAAOusD,EAAOE,oBAAqBzO,EAAKrrD,OAAS45D,EAAOE,qBAE5EgJ,EAAkBzX,EAAK3jD,KAAKwiB,IAAQ,EAAAtH,GAAA,GAAmBsH,KAE7D,GAAG1nB,EAAO+nB,aAAehnB,KAAK8a,gBAAgBiL,UAAU9mB,GAAS,CAC/D,MAAM6mB,EAAY7mB,EAAO2d,WACnBH,EAAUzc,KAAK0c,gBAAgBsB,QAAQ8H,GAC7C,IAAIrJ,EAAQvf,OAAOsiE,WAAwC,QAA5B,EAAoB,QAApB,EAAA/iD,EAAQ44C,oBAAY,eAAEn4D,cAAM,eAAEuiE,oBAC3D3X,EAAOA,EAAKhrD,QAAQ6pB,KACF3mB,KAAK0f,iBAAiBzgB,EAAQ0nB,GAC7BzpB,OAAO0sB,OAGjBntB,OACP,OAIJkN,EAAU3J,KAAK4T,WAAWC,UAAU,0BAA2B,CAC7D4I,QAASzc,KAAK0c,gBAAgBC,gBAAgBmJ,GAC9ClpB,GAAI2iE,IACHz6D,MAAM46D,IACP1/D,KAAKoe,kBAAkBiX,mBAAmB,CACxC14B,EAAG,8BACH4C,WAAYumB,EACZyC,SAAUu/B,EACV1hC,IAAKs5C,EAAiBt5C,IACtB8N,UAAWwrC,EAAiBxrC,WAC5B,G,MAGJvqB,EAAU3J,KAAK4T,WAAWC,UAAU,0BAA2B,CAC7D6kD,SACA97D,GAAI2iE,IACHz6D,MAAM46D,IACP1/D,KAAKoe,kBAAkBiX,mBAAmB,CACxC14B,EAAG,uBACH4rB,SAAUu/B,EACV1hC,IAAKs5C,EAAiBt5C,IACtB8N,UAAWwrC,EAAiBxrC,WAC5B,IAIN,MAAMhwB,EAA+B,CAACyF,GAKtC,OAJG2sD,EAAa75D,QACdyH,EAAS5D,KAAKN,KAAKs/D,eAAergE,EAAQq3D,EAAcoC,IAGnD/2D,QAAQ0Q,IAAInO,GAAUY,KAAKuqD,GAAA,E,IAG7BsQ,YAAY1gE,EAAgB4pB,EAAQ,EAAGvG,EAAmB4U,GAAQ,GAQvE,GAFAl3B,KAAKG,IAAI,eAAgBlB,EAAQ4pB,EAAOvG,IACtBtiB,KAAKunD,qBAAqBtoD,EAAQqjB,GACrC,CACb,GAAGA,IAAa4U,EAAO,CACrB,MAAM5V,EAAathB,KAAKmrB,eAAetP,cAAc5c,EAAQqjB,IACzD,EAAAjD,GAAA,GAAmBiC,EAAW6I,qBAChC+M,GAAQ,E,CAIZ,IAAIA,EAAO,CACT,MAAM7d,EAASrZ,KAAK0c,gBAAgBqD,QAAQ9gB,EAAO2d,aAAe0F,EAChEtiB,KAAKmrB,eAAetP,cAAc5c,EAAQqjB,GAC1CtiB,KAAKsb,cAAcrc,GAClBoa,GAAUrZ,KAAK8vB,eAAezW,KAC/B6d,GAAQ,E,CAIZ,IAAIA,EAEF,OADAl3B,KAAKG,IAAI,6BACFwB,QAAQM,S,CAInB,MAAMokB,EAAiBrmB,KAAKsmB,kBAAkBrnB,EAAQqjB,GAEtD,GAAG+D,EAAeu5C,kBAAoB/2C,EACpC,OAAOlnB,QAAQM,UAGjB,IAAI6sD,EA6DJ,OA5DGxsC,GACG+D,EAAew5C,cACjB/Q,EAAa9uD,KAAK4T,WAAWC,UAAU,0BAA2B,CAChEgH,KAAM7a,KAAK8a,gBAAgBiW,iBAAiB9xB,GAC5Ck/C,QAAQ,EAAA9+B,GAAA,GAAmBiD,GAC3B0kC,aAAa,EAAA3nC,GAAA,GAAmBwJ,MAKpC7oB,KAAKoe,kBAAkBiX,mBAAmB,CACxC14B,EAAG,mCACH4C,WAAYN,EAAO2d,WACnBs4B,WAAY5yB,EACZ0kC,YAAan+B,KAEP7oB,KAAK8a,gBAAgBiL,UAAU9mB,IACnConB,EAAew5C,cACjB/Q,EAAa9uD,KAAK4T,WAAWC,UAAU,uBAAwB,CAC7D4I,QAASzc,KAAK0c,gBAAgBC,gBAAgB1d,EAAO2d,YACrDmqC,QAAQ,EAAA1nC,GAAA,GAAmBwJ,MAI/B7oB,KAAKoe,kBAAkBiX,mBAAmB,CACxC14B,EAAG,yBACHoqD,OAAQl+B,EACRtpB,WAAYN,EAAO2d,WACnBuqC,wBAAoBnsD,EACpBorB,SAAKprB,MAGHqrB,EAAew5C,cACjB/Q,EAAa9uD,KAAK4T,WAAWC,UAAU,uBAAwB,CAC7DgH,KAAM7a,KAAK8a,gBAAgBiW,iBAAiB9xB,GAC5C8nD,QAAQ,EAAA1nC,GAAA,GAAmBwJ,KAC1B/jB,MAAM46D,IACP1/D,KAAKoe,kBAAkBkV,qBAAqB,CAC1C32B,EAAG,cACH8d,OAAQ,CACN9d,EAAG,YACHypB,IAAKs5C,EAAiBt5C,IACtB8N,UAAWwrC,EAAiBxrC,YAE9B,KAINl0B,KAAKoe,kBAAkBiX,mBAAmB,CACxC14B,EAAG,yBACHoqD,OAAQl+B,EACRhO,KAAM7a,KAAK8a,gBAAgB4O,cAAczqB,GACzCkoD,wBAAoBnsD,EACpBorB,SAAKprB,EACLk5B,eAAWl5B,KAIfgF,KAAKmd,UAAUxW,cAAc,qBAAsB3G,KAAK8a,gBAAgBglD,cAAc7gE,IAEnFonB,EAAew5C,YACTx5C,EAAew5C,aAGxBx5C,EAAeu5C,iBAAmB/2C,EAElCimC,EAAWlmB,SAAQ,YACVviB,EAAew5C,YAEtB,MAAM,UAACh1C,GAAaxE,EACpBrmB,KAAKG,IAAI,+BAAgC0oB,EAAOgC,GAE7CA,EAAYhC,GACb7oB,KAAK2/D,YAAY1gE,EAAQ4rB,EAAWvI,GAAU,E,IAI3C+D,EAAew5C,YAAc/Q,EACtC,CAEOiR,eAAe9gE,EAAgBqjB,EAAmB4U,GAAQ,GAC/D,MAAM7Q,EAAiBrmB,KAAKsmB,kBAAkBrnB,EAAQqjB,GACnD+D,EAAewC,OAChB7oB,KAAK2/D,YAAY1gE,EAAQonB,EAAewC,MAAOvG,EAAU4U,EAE7D,CAEQ8oC,qBAAqB/gE,EAAgBqjB,GAC3C,OAAOrjB,GAAUqjB,EAAW,IAAIA,IAAa,GAC/C,CAEQ2lC,mCAAmChpD,EAAgBqjB,GACzD,MAAMjJ,EAASrZ,KAAKmrB,eAAe5H,iBAAiBtkB,EAAQqjB,IACzDjJ,aAAM,EAANA,EAAQ2W,wBACThwB,KAAKk4D,0BAA0Bj5D,EAEnC,CAEQsmD,qBAAqBtmD,EAAgB0nB,EAAa5nB,EAAcujB,GACtE,MAAM29C,EAAcjgE,KAAKsiD,eAAetiD,KAAKggE,qBAAqB/gE,EAAQqjB,IACtE29C,IAEDlhE,EACEkhE,EAAYr4D,MAAM6iB,MAAM,WACzBw1C,EAAYv1C,YAAY,CAAC/D,IAG3Bs5C,EAAYp8D,OAAO8iB,GAEvB,CAEQu5C,+BAA+BjhE,EAAgBghE,EAAkC39C,GACvF,MAAMjJ,EAASrZ,KAAKmrB,eAAe5H,iBAAiBtkB,EAAQqjB,IACxD29C,EAAYxjE,SAAU4c,aAAM,EAANA,EAAQ2W,wBAChChwB,KAAKk4D,0BAA0Bj5D,EAEnC,CAEOkhE,gBAAgBlhE,EAAgBqjB,G,QAKrC,MAAMjb,EAAMrH,KAAKggE,qBAAqB/gE,EAAQqjB,GACxC3Y,EAAU3J,KAAKuiD,wBAAwBl7C,GAC7C,GAAGsC,EACD,OAAOA,EAGT,MAAMs2D,EAAwC,QAA7B,KAAGjgE,KAAKsiD,gBAAerjD,UAAM,UAANA,GAAY,IAAI,KAClDxC,EAASwjE,EAAYxjE,OACrBgwB,EAAWwzC,EAAYr4D,MAAM6iB,MAAM,UACzC,IAAIhuB,GAAUgwB,EAEZ,OADAzsB,KAAKkgE,+BAA+BjhE,EAAQghE,EAAa39C,GAClD3gB,QAAQM,UAGjB,IAAIm+D,EAAkBz+D,QAAQM,UAK9B,OAJIwqB,GAAYhwB,EAAS,KACvB2jE,EAAkBpgE,KAAKqgE,iBAAiBphE,EAAQqjB,IAG3CtiB,KAAKuiD,wBAAwBl7C,GAAO+4D,EAAgBt7D,MAAK,KAC9D,MAAMw7D,EAAOL,EAAYK,KACnB35C,EAAM25C,GAAQA,EAAKA,EAAK7jE,OAAS,GACvC,GAAGkqB,EAED,OADAs5C,EAAYp8D,OAAO8iB,GACZA,EAEP3mB,KAAKkgE,+BAA+BjhE,EAAQghE,EAAa39C,E,IAE1DsmB,SAAQ,YACF5oC,KAAKuiD,wBAAwBl7C,EAAI,GAE5C,CAEQg5D,iBAAiBphE,EAAgBqjB,GACvC,MAAM29C,EAAcjgE,KAAKsiD,eAAerjD,GAClC4pB,EAAQo3C,EAAYr4D,MAAM,IAAM,EAKtC,OAAO5H,KAAKugE,kBAAkBthE,EAAQ4pB,GAFnB,GADD,QAG8C7tB,OAAWA,EAAWsnB,GACrFxd,MAAMyjB,IACLvoB,KAAKwgE,mBAAmBP,EAAa13C,EAAoB,IAAVM,EAAc,EAAIA,EALjD,IACC,GAIyE,GAE9F,CAEQ03C,kBACNthE,EACAq/D,EACAF,EACA7hD,EACAsM,EAAQ,EACR43C,EAAQ,EACRn+C,GAEA,OAAOtiB,KAAK4T,WAAWotB,uBAAuB,CAC5Cl4B,OAAQ,6BACRmL,OAAQ,CACN4G,KAAM7a,KAAK8a,gBAAgBiW,iBAAiB9xB,GAC5C6d,WAAW,EAAAuC,GAAA,GAAmBi/C,GAC9BF,aACA7hD,QACAwqC,QAAQ,EAAA1nC,GAAA,GAAmBwJ,GAC3Bw1C,QAAQ,EAAAh/C,GAAA,GAAmBohD,GAC3BvrB,WAAY5yB,GAAW,EAAAjD,GAAA,GAAmBiD,QAAYtnB,GAExDimC,cAAgBy/B,KACd,EAAAv4C,GAAA,GAAoFu4C,GACpF1gE,KAAKod,gBAAgBgL,aAAas4C,EAAiB5nD,OACnD9Y,KAAK0c,gBAAgB2L,aAAaq4C,EAAiBp4C,OACnDtoB,KAAKuf,aAAamhD,EAAiBn4C,UAE5Bm4C,IAGb,CAEOC,aAAa1hE,EAAgB2hE,GAKlC,IAAIA,EAAOnkE,OACT,OAAOkF,QAAQM,UAIjB,IAAI0H,EAAuB8Q,EAC3B,GAFAmmD,EAASA,EAAOz8D,KAAKwiB,IAAQ,EAAAtH,GAAA,GAAmBsH,KAE7C1nB,EAAO+nB,aAAehnB,KAAK8a,gBAAgBiL,UAAU9mB,GAAS,CAC/D,MAAM6mB,EAAY7mB,EAAO2d,WAEzBnC,EAAS,CACP9d,EAAG,oCACH4C,WAAYumB,EACZyC,SAAUq4C,GAGZj3D,EAAU3J,KAAK4T,WAAWC,UAAU,+BAAgC,CAClE4I,QAASzc,KAAK0c,gBAAgBC,gBAAgBmJ,GAC9ClpB,GAAIgkE,G,MAGNnmD,EAAS,CACP9d,EAAG,6BACH4rB,SAAUq4C,EACVx6C,SAAKprB,EACLk5B,eAAWl5B,GAGb2O,EAAU3J,KAAK4T,WAAWC,UAAU,+BAAgC,CAClEjX,GAAIgkE,IACH97D,MAAM46D,IACNjlD,EAA6C2L,IAAMs5C,EAAiBt5C,IACpE3L,EAA6CyZ,UAAYwrC,EAAiBxrC,UAC3El0B,KAAKoe,kBAAkBiX,mBAAmB5a,EAAO,IAMrD,OAFAza,KAAKoe,kBAAkBiX,mBAAmB5a,GAEnC9Q,CACT,CAEO2c,kBAAkBrnB,EAAgBqjB,G,gBACvC,OAAGA,EAEmD,QAA5C,GAAR,EAAkC,QAA3B,KAACtiB,KAAKgjD,gBAAe/jD,UAAM,UAANA,GAAY,CAAC,GAAGqjB,UAAQ,UAARA,GAAc,CAAChI,MAAO,KAAMmM,QAAS,IAAI,MAGpD,QAAnC,KAAOzmB,KAAK+iD,kBAAiB9jD,UAAM,UAANA,GAAY,CAACqb,MAAO,KAAMmM,QAAS,IAAI,KACtE,CAEOo6C,8BAA8B5hE,EAAgBqjB,GACnD,MAAM+D,EAAiBrmB,KAAKsmB,kBAAkBrnB,EAAQqjB,IAChD,MACJhI,EAAK,QACLmM,EAAO,MACPoC,EAAK,UACLgC,EAAS,gBACTC,EAAe,SACfqyC,EAAQ,YACRve,GACEv4B,EAEJ,MAAO,CACL/L,QACAmM,aAASzrB,EACT8lE,kBAAmBr6C,EAAQs6C,SAC3Bl4C,QACAgC,YACAC,kBACAqyC,WACAve,cAEJ,CAEQkF,sBAAsB7kD,EAAgBqjB,GAC5C,MAAM0+C,EAAkBhhE,KAAK8a,gBAAgBmmD,uBAAuB,CAAChiE,SAAQiiE,cAAc,EAAM5+C,aACjG,OAAO3gB,QAAQ0Q,IAAI,CACjBrS,KAAKmiB,wBAAwBg/C,4BAC7BnhE,KAAKmiB,wBAAwBi/C,kBAAkBJ,KAC9Cl8D,MAAK,EAAEnI,EAAGonD,MACJ,CACLzK,MAAOt5C,KAAKmiB,wBAAwBC,iBAAiB,CAACnjB,SAAQojB,aAAa,EAAMC,aACjFyhC,4BAGN,CAqCO/6B,wBAAwB/pB,EAAgBqjB,GAC7C,OAAOrjB,GAAUqjB,EAAW,IAAMA,EAAW,GAC/C,CAEQoiC,2BAA2BzlD,EAAgBwb,EAAgB6H,G,UACjE,MAAMra,EAAuF,QAApF,KAAGjI,KAAKkpB,+BAA6B,EAAClpB,KAAKgpB,wBAAwB/pB,EAAQqjB,WAAS,aAAM,IAAIlkB,IACpG6J,EAAIvJ,IAAI+b,GACTza,KAAKG,IAAIvC,MAAM,mBAAoBqB,IAIpCwb,EAAewqC,gBAAiB,EACjCh9C,EAAIlJ,IAAI0b,GACRza,KAAKob,yBAAyBnc,EAAQqjB,GACxC,CA06BO4jC,+BAA+BrkD,GACjC7B,KAAKqhE,sBAAsBx/D,IAC5B7B,KAAKmrB,eAAehF,iBAAiBnmB,KAAKsb,cAAczZ,EAAQ5C,QAEpE,CAEOoiE,sBAAsBx/D,GAC3B,MAAMwX,EAASrZ,KAAKsb,cAAczZ,EAAQ5C,QAC1C,OAAOoa,GAAUA,EAAO+F,cAAgBvd,EAAQ8kB,GAClD,CAEQq+B,6BAA6Bsc,GACnC,IACE,MAAM9c,EAAYxkD,KAAKykD,aAAa6c,GACpC,GAAG9c,EAAW,CACZ,MAAM8C,EAAatnD,KAAKojD,iBAAiBoB,GACzC,GAAG8C,EAAY,CACb,MAAOroD,EAAQ0nB,GAAO2gC,EAAW1nD,MAAM,KAEvCI,KAAKuzB,cAAct0B,EAAOI,YAAasnB,EAAK,kB,GAGhD,MAAMrd,GACNtJ,KAAKG,IAAIvC,MAAM,8BAA+B0L,EAAKg4D,E,CAEvD,CAEQ7c,aAAa6c,G,MACnB,IAAI9c,EAAY,GAChB,GAAwB,QAArB,EAAA8c,aAAa,EAAbA,EAAeriE,cAAM,eAAE+nB,YAAa,CACrC,MAAM1E,GAAW,EAAAmlC,GAAA,GAAmB6Z,EAAethE,KAAK0c,gBAAgBqD,QAAQuhD,EAAcriE,OAAO2d,aAClG0F,IACDkiC,EAAY8c,EAAcriE,OAAS,IAAMqjB,E,CAI7C,OAAOkiC,CACT,CAEOjxB,cAAct0B,EAAgB0nB,EAAa46C,GAchD,OAb0CvhE,KAAKyW,eAAexX,EAAQ0nB,GAAK,GAAM7hB,MAAK,KACpF,MAAMjD,EAAU7B,KAAK0f,iBAAiBzgB,EAAQ0nB,GAC9C,GAAI9kB,EAQJ,OAJG0/D,GACDvhE,KAAKmd,UAAUxW,cAAc46D,EAAoB1/D,GAG5CA,CAAO,GAIlB,CAEQkjD,oBAAoBljD,GAC1B,MAAM+/B,EAAW5hC,KAAK0hD,mBAAmB7/C,EAAQ8kB,KACjD,IAAI66C,EACJ,GAAG5/B,EAAU,CACX,MAAM2zB,EAAcv1D,KAAKyhD,kBAAkB7f,IACxC4/B,EAAiBxhE,KAAKyhE,uBAAuB7/B,EAAU//B,KACxD7B,KAAKmd,UAAUxW,cAAc,iBAAkB,CAC7CwvC,WAAYof,EAAY/xD,QAAQ6D,IAChCxF,UACAutD,WAAYmG,EAAYnG,oBAIrBpvD,KAAK0hD,mBAAmB7/C,EAAQ8kB,I,CAGzC,OAAO66C,CACT,CAEOE,SAAShmE,GACd,KAAKA,EAAUsE,KAAKmiB,wBAAwBw/C,qBAAqBjmE,IAC/D,OAGF,MAAM,OAACuD,EAAM,UAAE2iE,EAAS,SAAEt/C,GAAY5mB,EAChCoL,EAAoC,CACxCnK,EAAG,2BAGLmK,EAAS+6D,WAAaD,EAEtB,MAAM/mD,EAAO7a,KAAK8a,gBAAgBiW,iBAAiB9xB,GACnD,OAAOe,KAAKmiB,wBAAwBkqC,qBAAqB/pC,EAAW,CAClE3lB,EAAG,wBACHke,OACAq6B,YAAY,EAAA71B,GAAA,GAAmBiD,IAC7B,CACF3lB,EAAG,kBACHke,QACC/T,EACL,CAEOg7D,gBAAe,OAAC7iE,EAAM,KAAE8iE,EAAI,SAAEz/C,IAKnC,YAJYtnB,IAAT+mE,IACDA,GAAQ/hE,KAAKmiB,wBAAwBC,iBAAiB,CAACnjB,SAAQojB,aAAa,EAAOC,cAG9EtiB,KAAK0hE,SAAS,CAACziE,SAAQ2iE,UAAWG,EAAO,KAAa,EAAGz/C,YAClE,CAEQylC,iBAAiBD,GACvB,IAAI,IAA0BniD,EAAbmiD,EAAKrrD,OAAqB,EAAGkJ,GAAK,IAAKA,EAAG,CACzD,MAAMghB,EAAMmhC,EAAKniD,GACX9D,EAAU7B,KAAK43D,eAAejxC,GACpC,GAAG9kB,EACD,OAAOA,EAAQ5C,M,CAGrB,CAEO+iE,cAAc/iE,EAAgBqjB,EAAmB1J,EAAqB,iB,MAC3E,GAAG5Y,KAAK8a,gBAAgB0iD,iBAAiBv+D,GACvC,OAAO,EAGT,GAAGA,EAAO+nB,YAAa,CACrB,MAAM1nB,EAASL,EAAO2d,WACtB,GAAG0F,EAAU,CACX,MAAM1G,EAAQ5b,KAAKmrB,eAAetP,cAAc5c,EAAQqjB,GACxD,IAAgB,QAAb,EAAA1G,aAAK,EAALA,EAAO1e,cAAM,eAAEslC,UAAWxiC,KAAK0c,gBAAgBogB,UAAUx9B,EAAQ,iBAClE,OAAO,C,CAKX,MAAMye,EAAO/d,KAAK0c,gBAAgBsB,QAAQ1e,GAE1C,OADqCU,KAAK0c,gBAAgBogB,UAAUx9B,EAAQsZ,OAAQ5d,IAAasnB,MACvDvE,EAAK7gB,OAAOuI,QAAU6c,E,CAEhE,OAAOtiB,KAAKod,gBAAgB6kD,cAAchjE,EAE9C,CAEOwiE,uBAAuB7/B,EAAgBsgC,GAC5C,MAAM3M,EAAcv1D,KAAKyhD,kBAAkB7f,GAC3C,IAAI2zB,EACF,OAGF,MAAM,OAACt2D,EAAM,OAAEyuD,EAAM,SAAEprC,EAAQ,QAAE9e,GAAW+xD,EAE5C,CACEv1D,KAAKsmB,kBAAkBrnB,GACvBqjB,EAAWtiB,KAAKsmB,kBAAkBrnB,EAAQqjB,QAAYtnB,GAEvD8B,OAAOC,SACP+B,SAAS0E,IACRA,EAAQijB,QAAQ5iB,OAAO6pD,EAAO,IAKhC,MAAMyU,EAAyBniE,KAAK4mB,sBAAsBpjB,EAASkqD,GAenE,OAdGyU,WACMD,EAAahlE,OAAO2pB,mBACpBq7C,EAAa75D,eACb65D,EAAatkE,aACbskE,EAAajnC,iBACbinC,EAAaz4D,MAGtBzJ,KAAKmd,UAAUxW,cAAc,2BAEtB3G,KAAKyhD,kBAAkB7f,GAE9B5hC,KAAKoiE,gCAAgC5+D,EAASkqD,EAAQwU,GAE/CC,CACT,CAEOC,gCAAgC5+D,EAA0BkqD,EAAgB7rD,GAC/E,MAAM4iB,EAAYzkB,KAAK4hD,sBAAsB8L,GAE7C,QAAiB1yD,IAAdypB,EAAyB,CAC1B,IAAI,MAAMxkB,KAAQwkB,EAAW,CAC3B,MAAM,SAACjrB,EAAQ,SAAEkL,GAAY+f,EAAUxkB,GAEvCyE,EAAS7C,GAASiD,KAAKtL,EAASyI,QAASzI,EAASoI,O,QAG7C5B,KAAK4hD,sBAAsB8L,E,CAIpC,GAAI7rD,EAA4BuW,MAAO,EACrC,EAAA+P,GAAA,GAA4BtmB,GAC5B,MAAO+2B,MAAOypC,EAAUv7B,SAAUw7B,GAAUzgE,EAAQuW,MACpD,GAAGiqD,EAAU,CACX,MAAMzpC,EAAQ54B,KAAK88C,iBAAiBsW,SAAS,GAAK1F,GAClD,GAAiC90B,EAAO,CACtC,MAAM2pC,EAAeF,EAAS/R,MAAM+R,EAAS/R,MAAM7zD,OAAS,GACtDw2C,EAAejzC,KAAK4vC,cAAcmC,gBAAgBswB,EAAUE,EAAaxkE,MACzEykE,EAAkBxiE,KAAK4vC,cAAcmC,gBAAgBnZ,EAAO,MAClE3+B,OAAOC,OAAO+4C,EAAcuvB,GAE5B,MAAMnS,EAAYgS,EAAS/R,MAAM+R,EAAS/R,MAAM7zD,OAAS,GAEnDq8B,GAAkB,EAAA2pC,GAAA,GAAwBJ,EAAUhS,IACzC,QAAsBv3B,EAAgBv8B,S,OAGpD,GAAG+lE,EAAQ,CAChB,MAAMpyB,EAASlwC,KAAK03C,eAAetF,OAAO,GAAKsb,GAC/C,GAAGxd,EAAQ,CACT,MAAMsyB,EAAkBxiE,KAAK4vC,cAAcmC,gBAAgB7B,GAC3D,GAEEA,EAAOnyC,MACS,YAAhBmyC,EAAOnyC,MACc,cAArBmyC,EAAOQ,WACP8xB,EAAgB9kE,IAChB,CACA,MAAMu1C,EAAejzC,KAAK4vC,cAAcmC,gBAAgBuwB,GACxDroE,OAAOC,OAAO+4C,EAAcuvB,GCn1KS9yB,EDq1KK4yB,GCp1K7C,SAAsB,EAAAzuB,GAAA,GAA6BnE,EADagzB,WACI,CAACrvB,SAAU3D,EAAIa,W,QDw1K3E1uC,EAAQuW,MAAwC20C,cAClD/sD,KAAKgtD,gBAAgB2V,MAAMjV,UAC3B1tD,KAAKgtD,gBAAgB7nD,QAAQuoD,G,CC31K7B,IAAkChe,ED+1K7C,MAAMyyB,EAAcniE,KAAK4mB,sBAAsBpjB,EAASkqD,GACxDlqD,EAAQK,OAAO6pD,IAEVyU,EAAgCxjB,cAAiB98C,EAA4B88C,cAChF58C,YAAW,KACL/B,KAAK4mB,sBAAsBpjB,EAAS3B,EAAQ8kB,MAIhD3mB,KAAKmd,UAAUxW,cAAc,eAAgB,CAACwvC,WAAY3yC,EAAQ6D,IAAKpI,OAAQ4C,EAAQ5C,OAAQ0nB,IAAK9kB,EAAQ8kB,IAAK9kB,WAAS,GACzH,GAGL7B,KAAK4iE,uBAAuBT,EAAa3+D,GAEzCxD,KAAKmd,UAAUxW,cAAc,eAAgB,CAACwvC,WAAY3yC,EAAQ6D,IAAKqmD,SAAQyU,cAAax7C,IAAK9kB,EAAQ8kB,IAAK9kB,WAChH,CAEO6hD,mBAAmB76B,GACxB,IAAIA,GAAY7oB,KAAKgiD,aAAan5B,EAAQ7oB,KAAKgiD,WAC7C,OAAO,EAGThiD,KAAKgiD,UAAYn5B,EACjB7oB,KAAK2e,gBAAgB9W,YAAY,eAAgBghB,GAEjD7oB,KAAK4T,WAAWC,UAAU,4BAA6B,CACrDkzC,QAAQ,EAAA1nC,GAAA,GAAmBwJ,IAE/B,CAEag6C,2CACXhhE,EACA0a,EACA7D,EACA4T,EACAw2C,EACAC,G,kDAEA,MAAMC,EAA4B,CAChCriC,UAAW,GACXrmB,MAAO,EACP2gC,iBAAajgD,GAGTioE,QAAuCjjE,KAAKijE,+BAA+BphE,GAOjF,OANGohE,QAA4CjoE,IAAVuhB,EACnCA,EAAQ,SACUvhB,IAAVuhB,IACRA,EAAQ,IAGH5a,QAAQ0Q,IAAI,EACjB4wD,GAAmCvqD,GAAaoqD,EAAkH,GAA3F9iE,KAAKkjE,2BAA2BrhE,EAAQ5C,OAAQ4C,EAAQ8kB,KAAK1Y,OAAM,IAAM,MAE7G,QAAnC,EAAiB,QAAjB,EAAApM,EAAQ8+B,iBAAS,eAAEloB,wBAAgB,eAAEhc,UAAWsmE,EAAoB/iE,KAAKmjE,oBAAoBC,wBAAwBvhE,EAAQ5C,OAAQ4C,EAAQ8kB,IAAKpK,EAAO7D,EAAU4T,GAAQre,OAAO3E,GAAQ05D,IAA6BA,IACtNl+D,MAAK,EAAE+T,EAASwqD,MACjB,MAAMC,EAA0BzqD,EAAQ1U,KAAKhF,GAAWA,EAAOE,aAEzDkkE,EAA2BD,EAAwB77D,SACzD,EAAAygB,GAAA,GAAeq7C,GAA0B,CAACtkE,EAAQqF,EAAKwG,KAClDu4D,EAAqB1iC,UAAUrb,MAAM5M,GAAa1Y,KAAK8a,gBAAgB9b,UAAU0Z,EAASC,WAAa1Z,KACxG6L,EAAIhB,OAAOxF,EAAK,E,IAIpB,IAAI+wC,EAAoDguB,EAAqB1iC,UAAUx8B,KAAKuU,IAAa,CAAEzZ,OAAQe,KAAK8a,gBAAgB9b,UAAU0Z,EAASC,SAAUD,SAAUA,EAASA,aAGxL,OAFA28B,EAAWA,EAASrxC,OAAOu/D,EAAyBp/D,KAAKq/D,IAAe,CAAEvkE,OAAQukE,OAE3E,CACL7iC,UAAW0iC,EAAqB1iC,UAChC8iC,eAAgBJ,EAAqB/oD,MACrCopD,iBAAkBJ,EAClBjuB,SAAUA,EACV0D,WAAYsqB,EAAqBpoB,YAClC,G,IAIEioB,2BAA2BjkE,EAAgB0nB,GAChD,OAAO3mB,KAAK4T,WAAWke,gBAAgB,sCAAuC,CAC5EjX,KAAM7a,KAAK8a,gBAAgBiW,iBAAiB9xB,GAC5Ck/C,QAAQ,EAAA9+B,GAAA,GAAmBsH,KAC1B7hB,MAAM+T,GACAA,EAAQ1U,KAAKhF,GAAWA,EAAOkxB,cAE1C,CAEa4yC,+BAA+BphE,G,0CAC1C,GACiB,aAAfA,aAAO,EAAPA,EAASlF,IACTkF,EAAQ3E,OAAO2pB,cACdhlB,EAAQ3E,OAAO0sB,MACf5pB,KAAK8a,gBAAgBsV,WAAWvuB,EAAQ5C,QAEzC,OAAO,EAGT,MAAM8e,EAAO/d,KAAK0c,gBAAgBsB,QAAQnc,EAAQ5C,OAAO2d,YACnD+mD,QAAkB3jE,KAAK4T,WAAWgwD,eACxC,OAAO7lD,EAAKke,oBAAsB0nC,EAAUE,gCACzC,EAAAngD,GAAA,IAAM,GAAQ7hB,EAAQ4hB,KAAQkgD,EAAUG,4BAC7C,G,CAEOC,sBAAsB9kE,EAAgB6oD,GAC3C,GAAIA,EAAKrrD,OAIT,OAAOuD,KAAK4T,WAAWke,gBAAgB,4BAA6B,CAClEjX,KAAM7a,KAAK8a,gBAAgBiW,iBAAiB9xB,GAC5CrC,GAAIkrD,EAAK3jD,KAAKwiB,IAAQ,EAAAtH,GAAA,GAAmBsH,KACzCq9C,WAAW,IACVl/D,MAAMokD,IACP,MAAMjgC,EAAoB,IAAInoB,MAAMgnD,EAAKrrD,QACzC,IAAI,IAAIkJ,EAAI,EAAGlJ,EAASqrD,EAAKrrD,OAAQkJ,EAAIlJ,IAAUkJ,EACjDsjB,EAAQtjB,GAAK,CACXhJ,EAAG,4BACH4C,WAAY,KACZN,SACArC,GAAIkrD,EAAKniD,GACTujD,MAAOA,EAAMA,MAAMvjD,GAAGujD,OAI1BlpD,KAAKoe,kBAAkBkV,qBAAqB,CAC1C32B,EAAG,UACHssB,UACAX,MAAO4gC,EAAM5gC,MACbxP,MAAOowC,EAAMpwC,OACb,GAEN,CAEQmrC,mBAAmBpiD,EAAoBnG,EAI1C,CAAC,GACJ,MAAMuD,EAASe,KAAKqkD,eAAexiD,GAEnC,GAAG7B,KAAK8a,gBAAgB0iD,iBAAiBv+D,GACvC,OAGF,MAAM6hD,EAAO,aACb,IAAIG,EAAMH,EAAKtiD,MAAMyiD,IACnB,MAAM,YAACgjB,GAAehjB,EAAIh6C,MAC1B,OAAOg9D,EAAYA,EAAYxnE,OAAS,KAAOwC,CAAM,KAGnDgiD,GAAOH,EAAKrkD,SACdqkD,EAAKjgC,MAAK,CAACC,EAAGC,IAAMD,EAAE7Z,MAAMi9D,cAAgBnjD,EAAE9Z,MAAMi9D,gBACpDjjB,EAAOH,EAAK,GAAG75C,MAAMi9D,cAA0BpjB,EAAKA,EAAKrkD,OAAS,GAA7BqkD,EAAK,IAG/B,kBACRj6C,WAAW,oBAAqB,OAAF,QACjChF,WACGnG,GACFulD,aAAG,EAAHA,EAAK5F,OACV,CAEOqR,4BAA4BztD,G,QACjC,OAA2C,QAA3C,KAAOe,KAAK8iD,0BAAyB7jD,UAAM,UAANA,GAAYe,KAAKukD,qBAAqBtlD,EAAQ,YACrF,CAEOklE,0BAA0BllE,EAAgB0nB,GAC/C,OAAO3mB,KAAK4mB,sBAAsB5mB,KAAK0sD,4BAA4BztD,GAAS0nB,EAC9E,CAEOy9C,qBAAqBnlE,GAC1B,IAAIe,KAAKgiE,cAAc/iE,GAAS,OAEhC,MAAMuE,EAAUxD,KAAK0sD,4BAA4BztD,GACjD,OAAGuE,EAAQ6P,KACF,IAAI7P,EAAQyP,QAGdjT,KAAK4T,WAAWke,gBAAgB,+BAAgC,CACrEjX,KAAM7a,KAAK8a,gBAAgBiW,iBAAiB9xB,GAC5CmiC,KAAM,KACLt8B,MAAMi0D,IACP,GAAuB,iCAApBA,EAAcp8D,EAAsC,CACrDqD,KAAKod,gBAAgBgL,aAAa2wC,EAAcjgD,OAChD9Y,KAAK0c,gBAAgB2L,aAAa0wC,EAAczwC,OAEhD,MAAM9kB,EAAUxD,KAAK0sD,4BAA4BztD,GAEjD,OADAe,KAAKuf,aAAaw5C,EAAcxwC,SAAU,CAAC/kB,UAASsmD,aAAa,IAC1D,IAAItmD,EAAQyP,O,CAGrB,MAAO,EAAE,GAEb,CAEOoxD,sBAAsBplE,EAAgB6oD,GAC3C,OAAO9nD,KAAK4T,WAAWC,UAAU,iCAAkC,CACjEgH,KAAM7a,KAAK8a,gBAAgBiW,iBAAiB9xB,GAC5CrC,GAAIkrD,EAAK3jD,KAAKwiB,IAAQ,EAAAtH,GAAA,GAAmBsH,OACxC7hB,MAAMmkB,IACPjpB,KAAKoe,kBAAkBkV,qBAAqBrK,EAAQ,GAExD,CAEOq7C,wBAAwBrlE,EAAgB6oD,GAC7C,OAAO9nD,KAAK4T,WAAWC,UAAU,mCAAoC,CACnEgH,KAAM7a,KAAK8a,gBAAgBiW,iBAAiB9xB,GAC5CrC,GAAIkrD,EAAK3jD,KAAKwiB,IAAQ,EAAAtH,GAAA,GAAmBsH,OACxC7hB,MAAMmkB,IACPjpB,KAAKoe,kBAAkBkV,qBAAqBrK,EAAQ,GAExD,CAEOi2C,sBAAsBr9D,GAC3B,OAAO7B,KAAKo6D,eAAev4D,GAAUA,KAAeA,EAA4BgyD,UAAS,EAC3F,CAEO0Q,6BAA6B1iE,GAClC,GAAGA,EAAQ5C,SAAW,KAAiB,CAErC,MAAM40D,EAAUhyD,OADhBA,EAAU7B,KAAKk/D,sBAAsBr9D,SACd,EAAPA,EAASgyD,QACzB,IAAKA,IAAWA,EAAQ32D,OAAOk3D,UAAYP,EAAQt0D,WAAWqd,aAAe,KAC3E,M,CAIJ,OAAO/a,CACT,CAEO2iE,sBAAsBvlE,GAC3B,OAAOA,EAAO+nB,eACXhnB,KAAK0c,gBAAgB4gB,SAASr+B,EAAO2d,aACtC5c,KAAK0c,gBAAgBqD,QAAQ9gB,EAAO2d,YAExC,CAEa6nD,cAAcxlE,EAAgBqjB,G,gDACzC,IAAItiB,KAAKwkE,sBAAsBvlE,GAC7B,OAGF,MAAMonB,EAAiBrmB,KAAKsmB,kBAAkBrnB,EAAQqjB,GAChD7a,EAAQ4e,EAAeI,QAAQhf,MACrC,IAAIA,EAAMgjB,MAAM,aACd,cAGKpE,EAAewC,MACtBphB,EAAM23D,SAAS,aAGf,MAAMrG,QAAsB/4D,KAAK84D,WAAW75D,EAAgB,QAAR,EAAAwI,EAAM,UAAE,QAAI,EAAG,EAAG,GAAI6a,GAC1E,IAAI,IAAI3c,EAAI,EAAGlJ,EAASs8D,EAActyC,QAAQhqB,OAAQkJ,EAAIlJ,IAAUkJ,EAClE3F,KAAKqlD,iBAAiBrlD,KAAK0f,iBAAiBzgB,EAAQ85D,EAActyC,QAAQ9gB,KAG5E,MAAO,CAAC++D,YAAar+C,EAAeI,QAAQhf,MAAMgjB,MAAM,a,IAQnDquC,WAAW75D,EAAgB4pB,EAAgB,EAAGtM,EAAgBuhD,EAAoBx7C,GACvF,MAAM+D,EAAiBrmB,KAAKsmB,kBAAkBrnB,EAAQqjB,GAEtD,GAAGtiB,KAAK8a,gBAAgB0iD,iBAAiBv+D,GAAS,CAChD,MAAM2I,EAAQye,EAAeI,QAAQ7e,MACrCA,EAAM+iB,OAAO,WAEb,MAAMljB,EAAQG,EAAMH,MAAM,EAAG,GAG7B,OAFAA,EAAMkjB,OAAO,WAEN,CACLrQ,MAAO,EACPmM,QAAS3lB,MAAMC,KAAK0G,GACpBgjB,MAAOhjB,EAAMk9D,UACbC,eAAgB,E,CAIpB,IAAIt4C,EAAS,EAsCVwxC,IACDxxC,GAAUwxC,EACVvhD,GAASuhD,GAcX,MAAM+G,EAAYx+C,EAAeI,QAAQq+C,QAAQj8C,EAAOyD,EAAQ/P,GAChE,OAAGsoD,GAAcA,EAAUp9D,MAAMhL,SAAW8f,IAAUsoD,EAAUE,UAAY,aAAmB,UAaxF/kE,KAAKglE,mBAAmB/lE,EAAQ4pB,EAAOtM,EAAO+P,EAAQjG,EAAgB/D,GAAUxd,MAAK,KAC1F,MAAM2C,EAAQ4e,EAAeI,QAAQq+C,QAAQj8C,EAAOyD,EAAQ/P,GACtD8Q,GAAI5lB,aAAK,EAALA,EAAOA,QAAS4e,EAAeI,QAAQw+C,iBACjD,MAAO,CACL3qD,MAAO+L,EAAe/L,MACtBmM,QAAS3lB,MAAMC,KAAKssB,GACpB5C,MAAO4C,EAAEs3C,UACTC,gBAAgBn9D,aAAK,EAALA,EAAOm9D,iBAAkBv+C,EAAe/L,MACzD,IApBM,CACLA,MAAO+L,EAAe/L,MACtBmM,QAAS3lB,MAAMC,KAAK8jE,EAAUp9D,OAC9BgjB,MAAOo6C,EAAUp9D,MAAMk9D,UACvBC,eAAgBC,EAAUD,eAkBhC,CAEOM,mBAAmBnM,EAAwFx8C,EAAe6hD,GAC/H,MAAM,iBAACL,EAAgB,SAAEx1C,GAAYwwC,EAE/Bz+C,EAASy+C,EAAyDz+C,OAASiO,EAAS9rB,OACpFmoE,EAAiB7G,GAAoB,EAErCoH,EAAoB/G,EAAa,EAAI7hD,EAAQ6hD,EAAa7hD,EAKhE,MAAO,CAACjC,QAAOsqD,iBAAgBn4C,SAHdm4C,GAAmBtqD,EAAQ6qD,GAAsB7qD,EAAQ6qD,EAGjCT,aAFpBE,GAAmBxG,EAAa,GAAMwG,EAAiBxG,GAAe,EAG7F,CAEOoC,mBACLP,EACAlH,EACAj8C,EACAP,EACA6hD,GAEA,MAAM,SAAC71C,GAAYwwC,EACbtuC,EAAQzqB,KAAKklE,mBAAmBnM,EAAex8C,EAAO6hD,IACtD,MAAC9jD,EAAK,eAAEsqD,EAAc,SAAEn4C,EAAQ,YAAEi4C,GAAej6C,EACjDq9B,EAAOv/B,EAASpkB,KAAKtC,GACjBA,EAAsB8kB,MAMhC,GAAG7J,IAAa,EAAAuC,GAAA,GAAmBvC,KAAegrC,EAAK54B,SAASpS,IAAc8nD,EAAiBtqD,EAAO,CACpG,IAAI3U,EAAI,EACR,IAAI,MAAMlJ,EAASqrD,EAAKrrD,OAAQkJ,EAAIlJ,KAC/BqgB,EAAYgrC,EAAKniD,MADwBA,GAM9CmiD,EAAKh+C,OAAOnE,EAAG,EAAGmX,E,CAGpB,MAAMrV,EAAQw4D,EAAYv1C,YAAYo9B,IAASmY,EAAYx4D,MAS3D,OARGglB,GACDhlB,EAAMkjB,OAAO,UAGZ+5C,GACDj9D,EAAMkjB,OAAO,aAGR,OAAP,QAAQljB,QAAOqgD,OAAMv/B,YAAakC,EACpC,CAEOu6C,mBAAmB/lE,EAAgB6d,EAAmBP,EAAe6hD,EAAoB/3C,EAAgC/D,GAC9H,MAAM8iD,EAAW/+C,EAAewC,MAChC,OAAO7oB,KAAKqlE,eAAepmE,EAAQ6d,EAAWP,EAAO6hD,OAAYpjE,EAAWsnB,GAAUxd,MAAMi0D,IAC1F,MAAM,MAACz+C,EAAK,YAAEoqD,EAAW,MAAEj9D,EAAK,SAAE8gB,GAAYvoB,KAAKwgE,mBAAmBn6C,EAAeI,QAASsyC,EAAej8C,EAAWP,EAAO6hD,GAE/H/3C,EAAe/L,MAAQA,EAQvB,IAAI,IAAI3U,EAAI,EAAGlJ,EAAS8rB,EAAS9rB,OAAQkJ,EAAIlJ,IAAUkJ,EAAG,CACxD,MAAM9D,EAAU0mB,EAAS5iB,GACtB3F,KAAK4qB,mBAAmBvE,EAAgBxkB,IACzC7B,KAAKmd,UAAUxW,cAAc,uBAAwB,CAAC1H,U,CAI1D,GAAGylE,EAAa,CACd,MAAMvF,EAAW13D,EAAM,GAEvB,GAAG4e,EAAewC,QAAUu8C,EAAU,CACpC,MAAMx9D,EAAQye,EAAeI,QAAQ7e,MAClCA,IAAUH,GACX4e,EAAeI,QAAQ6+C,YAAY19D,GAGlCye,EAAewC,QAAUs2C,IAC1B94C,EAAewC,MAAQphB,EAAM,GAE7BzH,KAAK2f,mBAAmB1gB,G,KAwClC,CAEOomE,eAAepmE,EAAgB4pB,EAAetM,EAAQ,EAAG+P,EAAS,EAAG5L,EAAa,EAAG4B,EAAW,GAKrG,MAAM5mB,EAAmD,CACvDmf,KAAM7a,KAAK8a,gBAAgBiW,iBAAiB9xB,GAC5C6d,WAAW,EAAAuC,GAAA,GAAmBwJ,IAAU,EACxChM,YAAa6D,EACb09C,WAAY9xC,EACZ/P,QACAwqC,OAAQ,EACRsX,OAAQ,EACRj9B,KAAM,GAYR,OATG9e,IACA5mB,EAA+ByiD,QAAS,EAAA9+B,GAAA,GAAmBiD,IAAa,GAGTtiB,KAAK4T,WAAWke,gBAAgBxP,EAAW,sBAAwB,sBAAuB5mB,EAAS,CAEnK47B,YAAY,IAGCxyB,MAAMi0D,IAChB,MACD/4D,KAAKG,IAAI,yBAA0BlB,EAAQ85D,EAAelwC,EAAOtM,EAAO+P,GAG1EtsB,KAAKod,gBAAgBgL,aAAa2wC,EAAcjgD,OAChD9Y,KAAK0c,gBAAgB2L,aAAa0wC,EAAczwC,OAChDtoB,KAAKuf,aAAaw5C,EAAcxwC,UAE7B,QAASwwC,GACV/4D,KAAKoe,kBAAkB6M,gBAAgBhsB,EAAO2d,WAAYm8C,EAAc3yC,KAG1E,IAAI3pB,EAASs8D,EAAcxwC,SAAS9rB,OAAQ6d,EAASy+C,EAAyDz+C,MAC3G7d,IAAWs8D,EAAcxwC,SAAS9rB,EAAS,KAC5Cs8D,EAAcxwC,SAASze,OAAOrN,EAAS,EAAG,GAC1CA,IACA6d,KAKF,MAAM+L,EAAiBrmB,KAAKsmB,kBAAkBrnB,EAAQqjB,GAChDijD,EAAiCxM,EAAcxwC,SAAS9rB,EAAS,GACvE,GAAGA,GAAU8oE,EAAc1e,WAAY,CACrC,MAAM2e,EAAan/C,EAAeI,QAAQy+B,UAAUqgB,EAAc5+C,KAClE,GAAG6+C,GAAeA,EAAW/9D,MAAMhL,OAASs8D,EAAcxwC,SAAS9rB,OAAU6d,EAC3E,OAAOta,KAAKqlE,eAAepmE,EAAQsmE,EAAc5+C,IAAK,GAAI,EAAGjG,EAAY4B,GAAUxd,MAAM2gE,GAChF1M,G,CAKb,OAAOA,CAAa,IAClBn7D,IACF,GACO,oBADAA,EAAMG,KACX,CACE,IAAI0e,EAAUzc,KAAK0c,gBAAgBsB,QAAQ/e,EAAO2d,YACjC,YAAdH,EAAQ9f,IACT8f,EAAU,CACR9f,EAAG,mBACHC,GAAIqC,EAAO2d,WACX0d,YAAa7d,EAAQ6d,YACrB7O,MAAOhP,EAAQgP,MACfvuB,OAAQuf,EAAQvf,SAIpB8C,KAAKoe,kBAAkBkV,qBAAqB,CAC1C32B,EAAG,UACHssB,QAAS,CAAC,CACRtsB,EAAG,gBACH4C,WAAYN,EAAO2d,aAErB0L,MAAO,CAAC7L,GACR3D,MAAO,IAEJ,CAGT,MAAMlb,CAAK,GAEf,CAEO8nE,sBACL,OAAG1lE,KAAK2lE,2BACC3lE,KAAK2lE,2BAGP3lE,KAAK2lE,4BAA6B,EAAA57D,EAAA,GAAM,GAAGjF,MAAK,KACrD,MAAM8gE,EAAmC,GAEzC,IAAI,MAAO3mE,EAAQkF,KAAQnE,KAAK8hD,mBAAoB,CAClD,MAAMgG,EAAO,IAAI3jD,EAAI8O,QACf2tD,EAAyB9Y,EAAK3jD,KAAKwiB,IAChC,CACLhqB,EAAG,iBACHC,IAAI,EAAAyiB,GAAA,GAAmBsH,OAI3B,IAAIhd,EAEFA,EADC1K,EAAO+nB,aAAehnB,KAAK8a,gBAAgBiL,UAAU9mB,GAC5Ce,KAAK4T,WAAWke,gBAAgB,uBAAwB,CAChErV,QAASzc,KAAK0c,gBAAgBC,gBAAgB1d,EAAO2d,YACrDhgB,GAAIgkE,IAGI5gE,KAAK4T,WAAWke,gBAAgB,uBAAwB,CAChEl1B,GAAIgkE,IAIR,MAAM1jD,EAAQvT,EAAQ7E,MAAM+gE,KAC1B,EAAA19C,GAAA,GAAqG09C,GAErG7lE,KAAKod,gBAAgBgL,aAAay9C,EAAkB/sD,OACpD9Y,KAAK0c,gBAAgB2L,aAAaw9C,EAAkBv9C,OACpD,MAAMC,EAAWvoB,KAAKuf,aAAasmD,EAAkBt9C,UAErD,IAAI,IAAI5iB,EAAI,EAAGA,EAAI4iB,EAAS9rB,SAAUkJ,EAAG,CACvC,MAAM9D,EAAU0mB,EAAS5iB,GACzB,IAAI9D,EACF,SAGF,MAAM8kB,GAAM,EAAAjL,GAAA,GAAkB7Z,EAAQjF,IACtBuH,EAAIK,IAAImiB,GAChB1kB,QAAQJ,GAChBsC,EAAIN,OAAO8iB,E,CAGb,GAAGxiB,EAAIkP,KACL,IAAI,MAAOsT,EAAKhd,KAAYxF,EAC1BwF,EAAQ1H,QAAQjC,KAAKw3D,qBAAqB7wC,G,IAG7CiiB,SAAQ,KACT5oC,KAAKmd,UAAUxW,cAAc,sBAAuB,CAAC1H,SAAQ6oD,QAAM,IAGrE8d,EAAgBtlE,KAAK4c,E,CAKvB,OAFAld,KAAK8hD,mBAAmBjjD,QAEjB8C,QAAQ0Q,IAAIuzD,GAAiB9gE,KAAKuqD,GAAA,EAAMA,GAAA,GAAMvqD,MAAK,KACxD9E,KAAK2lE,gCAA6B3qE,EAC/BgF,KAAK8hD,mBAAmBzuC,MAAMrT,KAAK0lE,qBAAqB,GAC3D,GAEN,CAIOjvD,eAAexX,EAAgB0nB,EAAwBkL,GAC5D,GAAG/wB,MAAMiD,QAAQ4iB,GACf,OAAOhlB,QAAQ0Q,IAAIsU,EAAIxiB,KAAKwiB,GACnB3mB,KAAKyW,eAAexX,EAAQ0nB,EAAKkL,MAI5C,MAAMhwB,EAAU7B,KAAK0f,iBAAiBzgB,EAAQ0nB,GAC9C,GAAG9kB,IAAYgwB,EAEb,OADA7xB,KAAKmd,UAAUxW,cAAc,sBAAuB,CAAC1H,SAAQ6oD,KAAM,CAACnhC,KAC7DhlB,QAAQM,QAAQJ,GAClB,CACL,IAAIsC,EAAMnE,KAAK8hD,mBAAmBt9C,IAAIvF,GAClCkF,GACFnE,KAAK8hD,mBAAmB75C,IAAIhJ,EAAQkF,EAAM,IAAIqN,KAGhD,IAAI7H,EAAUxF,EAAIK,IAAImiB,GACtB,OAAGhd,IAIHA,GAAU,SACVxF,EAAI8D,IAAI0e,EAAKhd,GACb3J,KAAK0lE,sBACE/7D,E,CAEX,CAEOm8D,iBAAiB7mE,EAAgB6oD,GACtC,IAAI3jD,EAAMnE,KAAK+hD,cAAcv9C,IAAIvF,GAC7BkF,GACFnE,KAAK+hD,cAAc95C,IAAIhJ,EAAQkF,EAAM,IAAIqN,KAG3C,MAAMhY,GAAW,SACXusE,EAAsB,GACtB7hE,EAAW4jD,EAAK3jD,KAAKwiB,IACzB,IAAIhd,EAAUxF,EAAIK,IAAImiB,GAatB,OAZIhd,IACFxF,EAAI8D,IAAI0e,EAAKhd,EAAUnQ,GACvBusE,EAAUzlE,KAAKqmB,GAEfhd,EAAQ7E,MAAK,KACXX,EAAIN,OAAO8iB,GACPxiB,EAAIkP,MAAQrT,KAAK+hD,cAAcv9C,IAAIvF,KAAYkF,GACjDnE,KAAK+hD,cAAcl+C,OAAO5E,E,KAKzB0K,CAAO,IAehB,OAZIo8D,EAAUtpE,OAGZuD,KAAK4T,WAAWC,UAAU,4BAA6B,CACrDgH,KAAM7a,KAAK8a,gBAAgBiW,iBAAiB9xB,GAC5CrC,GAAImpE,EAAU5hE,KAAKwiB,IAAQ,EAAAtH,GAAA,GAAmBsH,OAC7C7hB,MAAMmkB,IACPjpB,KAAKoe,kBAAkBkV,qBAAqBrK,GAC5CzvB,EAASyI,SAAS,IAPpBzI,EAASyI,UAWJN,QAAQ0Q,IAAInO,EACrB,CAEO8hE,oBAAoBnkE,GACzB,IAAIA,EAAQgjD,aAAc,OAAOljD,QAAQM,QAAQjC,KAAKw3D,qBAAqB,IAC3E,MAAMyO,EAAgBpkE,EAAQmyB,SAAS4wB,iBAAmB5kD,KAAK8a,gBAAgB9b,UAAU6C,EAAQmyB,SAAS4wB,kBAAoB/iD,EAAQ5C,OACtI,OAAOe,KAAKyW,eAAewvD,EAAepkE,EAAQgjD,cAAc//C,MAAMkvD,IAMpE,GALIA,UACFnyD,EAAU7B,KAAK0f,iBAAiB7d,EAAQ5C,OAAQ4C,EAAQ8kB,MACzCk+B,aAGA,mBAAdhjD,EAAQlF,EAAwB,CACjC,MAAMsC,EAAS4C,EAAQ5C,OACvBe,KAAKmd,UAAUxW,cAAc,eAAgB,CAC3CwvC,WAAY,GAAGl3C,YACfA,OAAQA,EACR0nB,IAAK9kB,EAAQ8kB,IACb9kB,YAGC7B,KAAKqhE,sBAAsBx/D,IAC5B7B,KAAKmd,UAAUxW,cAAc,sBAAuB,IAAI6K,IAAI,CAAC,CAACvS,EAAQ,CAACoa,OAAQrZ,KAAKsb,cAAcrc,O,CAItG,OAAO+0D,CAAe,GAE1B,CAEQgF,aAAa/5D,EAAgBqjB,GACnC,OAAOA,EAAW,GAAGrjB,KAAUqjB,IAAarjB,CAC9C,CAEOsyD,UACLtyD,EACA2Z,EACAse,EACA5U,G,MAEGA,IAAatiB,KAAK8a,gBAAgBiF,QAAQ9gB,KAC3CqjB,OAAWtnB,GAGb,MAAMqM,EAAMrH,KAAKg5D,aAAa/5D,EAAQqjB,GACtC,IAAI4jD,EAASlmE,KAAKqiD,QAAQh7C,GAC1B,OACGpI,GACAe,KAAKgiE,cAAc/iE,IACpBA,IAAWe,KAAK8a,gBAAgB7b,SAE9Bi4B,IAAuB,QAAd,EAAAgvC,aAAM,EAANA,EAAQttD,cAAM,eAAEjc,KAAMic,EAAOjc,KAKvCupE,aAAM,EAANA,EAAQjhE,UACTD,aAAakhE,EAAOjhE,SAGtBihE,EAASlmE,KAAKqiD,QAAQh7C,GAAO,CAC3BuR,UAGK5Y,KAAK4T,WAAWC,UAAU,qBAAsB,CACrDgH,KAAM7a,KAAK8a,gBAAgBiW,iBAAiB9xB,GAC5C2Z,SACAs8B,WAAY5yB,GAAW,EAAAjD,GAAA,GAAmBiD,QAAYtnB,IACrD4tC,SAAQ,KACNs9B,IAAWlmE,KAAKqiD,QAAQh7C,KACzB6+D,EAAOjhE,QAAU2J,EAAA,cAAe,YACvB5O,KAAKqiD,QAAQh7C,EAAI,GACvB,K,KAnBE1F,QAAQM,SAAQ,EAsB3B,CAEQ2gE,uBAAuB/gE,EAAoB2B,GACjD,MAAM4U,EAASvW,EAA4BuW,MAC3C,GAAGA,EAAO,CACR,MAAM7B,EAAK6B,EAA2Cu0C,SAA8Bv0C,EAC9E+tD,EAAkC5vD,EAAqCqiB,OAAiBriB,EAAwCuwB,SAMtI,IAJGq/B,aAAI,EAAJA,EAAMh2B,iBACPnwC,KAAKowC,kBAAkB/5B,cAAc8vD,EAAKh2B,eAAgB,CAACpyC,KAAM,UAAWkB,OAAQ4C,EAAQ5C,OAAQ8O,UAAWlM,EAAQ8kB,MAGtH,YAAavO,GAASA,EAAMu0C,QAAS,CACtC,MAAM7C,EAAc9pD,KAAK0sD,4BAA4B7qD,EAAQ5C,UAAYuE,EACnEy3D,EAAaj7D,KAAK4sD,mBAAmBsO,+BAA+Br5D,EAAQ5C,OAAQ4C,EAAQ8kB,IAAKmjC,GACvG9pD,KAAK4sD,mBAAmBwZ,yBAAyBhuD,EAAMu0C,QAASsO,E,CAG9D7iD,EAAwC20C,MAC1C/sD,KAAKgtD,gBAAgBqZ,oBAAoBxkE,GAA4B,E,CAG3E,CAEQ2mD,sBAAsBvpD,EAAgBuE,EAA0B+kB,GACtE,MAAM9B,EAMF,CACFnM,MAAO,EACPiQ,OAAQ,EACR+3B,eAAgB,EAChBoG,KAAM,IAAItqD,KAGZ,IAAI,MAAMuoB,KAAO4B,EAAU,CACzB,MAAM1mB,EAAqB7B,KAAK4mB,sBAAsBpjB,EAASmjB,GAC/D,IAAI9kB,EAAS,CACX7B,KAAKioD,mCAAmChpD,GACxC,Q,CAGFe,KAAK4iE,uBAAuB/gE,EAAS2B,GAErCxD,KAAKglD,6BAA6BnjD,GAE9BA,EAAQ3E,OAAO0sB,KAAQ/nB,EAAQ3E,OAAO2pB,cAAehlB,EAAQ3E,OAAOqtB,WACpE9D,EAAQ8D,OACVvqB,KAAKmd,UAAUxW,cAAc,sBAAuB,MAAQggB,GAEzD9kB,EAAQ3E,OAAO8mD,cACdv9B,EAAQ67B,eACVtiD,KAAKulD,qBAAqBtmD,EAAQ0nB,GAAK,OAIzCF,EAAQnM,MACVmM,EAAQiiC,KAAK3pD,IAAI4nB,GAEjB9kB,EAAQ8nB,SAAU,EAElB,MAAMswC,EAAap4D,EAA4BglD,WAC/C,GAAGoT,EAAW,CACZ,MAAMqM,EAAiBtmE,KAAK6iD,uBAAuBoX,GAChDqM,IACDA,EAAeziE,OAAO8iB,GAElBF,EAAQ8/C,SAAQ9/C,EAAQ8/C,OAAS,CAAC,IACrC9/C,EAAQ8/C,OAAOtM,KAAexzC,EAAQ8/C,OAAOtM,GAAa,IAAI77D,MAAQW,IAAI4nB,GAEvE2/C,EAAejzD,cACVoT,EAAQ8/C,cACRvmE,KAAK6iD,uBAAuBoX,I,CAKzCz2D,EAAQK,OAAO8iB,E,CAGjB,GAAGF,EAAQ8/C,OACT,IAAI,MAAMtM,KAAaxzC,EAAQ8/C,OAC7BvmE,KAAKwmE,kBAAkBvM,EAAWz2D,EAAS,IAAIijB,EAAQ8/C,OAAOtM,KASlE,OAAOxzC,CACT,CAEQ+/B,oBAAoBF,EAAqBC,EAAqB/iD,G,MACpE,GAAoB,YAAjB8iD,EAAW3pD,EAAiB,CAC7B,GAAyD,QAArD,EAAA2pD,EAAWluC,aAA0C,eAAEu0C,QAAS,CAClE,MAAMsO,EAAaj7D,KAAK4sD,mBAAmBsO,+BAA+B5U,EAAWrnD,OAAQqnD,EAAW3/B,MAAO2/B,EAAWppD,OAAO4wD,cACjI9tD,KAAK4sD,mBAAmBwZ,yBAA0B9f,EAAWluC,MAA2Cu0C,QAASsO,E,CAGnH,MAAMhB,EAAY3T,EAAWO,WAC1BoT,GACDj6D,KAAKwmE,kBAAkBvM,EAAWz2D,EAAS,G,CAGjD,CAEQgjE,kBAAkBvM,EAAmBz2D,EAA0BijE,GACrE,MACMl+C,EADOvoB,KAAKg6D,eAAeC,GACX91D,KAAKwiB,GAAQ3mB,KAAK4mB,sBAAsBpjB,EAASmjB,KACvE3mB,KAAKmd,UAAUxW,cAAc,aAAc,CAAC1H,OAAQspB,EAAS,GAAGtpB,OAAQozD,QAAS4H,EAAWwM,YAAaA,GAAe,GAAIl+C,YAC9H,CAEO5D,qBAAqBtL,G,MAC1B,IAAIoJ,EAAcpJ,EAAOmR,aACzB,IAAIxqB,KAAKmrB,eAAe3J,QAAQnI,IAAWrZ,KAAK8a,gBAAgBiF,QAAQ1G,EAAOpa,QAAS,CACtF,MAAMkmB,EAAmBnlB,KAAKmrB,eAAe/F,oBAAoB/L,EAAOpa,QAEtEwjB,EADC0C,aAA4BxjB,QACf,EAEAwjB,EAAiB7K,K,CAInC,OAAOmI,OAA2C,QAAzB,EAACpJ,EAAkBnc,cAAM,eAAEkpD,YACtD,CAEOt2B,eAAezW,GACpB,QAASrZ,KAAK2kB,qBAAqBtL,EACrC,CAEO2+C,WAAWn2D,GAChB,MAAsB,aAAfA,aAAO,EAAPA,EAASlF,KAAqBkF,EAA4B3E,OAAOwpE,aAAe1mE,KAAK8a,gBAAgB6rD,WAAW9kE,EAAQ5C,OACjI,CAEQ+mD,gBACN7jD,EACAuC,EACA2C,EACAu/D,GAEA,IAAIvZ,EAAUrtD,KAAKwiD,aAAargD,GAC5BkrD,IAEFA,EAAUrtD,KAAKwiD,aAAargD,GAAS,CACnCuC,WACAwlD,MAAO,IAAI14C,MAIX67C,EAAQnD,MAAMxrD,IAAI2I,KAEpBgmD,EAAQnD,MAAMjiD,IAAIZ,EAAKu/D,EAAqBA,SAAuB5rE,GACnEgF,KAAKmtD,wBAET,CAEQ/C,mBAA4CjmD,GAClD,MAAM0iE,EAAgD,IAAIr1D,IAC1D,IAAI,MAAOnK,EAAKhD,KAAUF,EAAK,CAC7B,MAAO2iE,EAAWngD,GAAOtf,EAAIzH,MAAM,KAC7BiC,EAAU7B,KAAK0f,iBAAiBonD,EAAUznE,YAAasnB,GACzD9kB,GAIJglE,EAAO5+D,IAAIpG,EAASwC,E,CAGtB,OAAOwiE,CACT,CA6COE,kBAAkB9nE,EAAgB4vD,GAGvC,OAFoB7uD,KAAK6W,kBAAkBgqB,kBAAkB5hC,EAAO2d,YACxDkmB,gBAAkB9iC,KAAK8a,gBAAgB4O,cAAcmlC,GAC1D7uD,KAAK4T,WAAWC,UAAU,6BAA8B,CAC7DgH,KAAM7a,KAAK8a,gBAAgBiW,iBAAiB9xB,GAC5C+jC,QAAShjC,KAAK8a,gBAAgBiW,iBAAiB89B,IAEnD,E,eEn2Ma,SAASmY,GAAuCC,GAC7D,MAAMvqE,EAAMuqE,EAASlrE,QAAQ,QAAS,IACtC,OAAQW,EAAI,GAAGlC,cAAgBkC,EAAI+K,MAAM,EAC3C,CCqBO,MAAMy/D,WAAgCx0D,EAA7C,c,oBACU,KAAAy0D,aAAe,CACrB1hB,WAAY,CAAC,EACb2hB,YAAa,KACbC,YAAa,KACbC,iBAAkB,KAClBC,iBAAkB,CAAC,GA8Hb,KAAAC,eAAiB,UACWxsE,IAA/BgF,KAAKynE,wBACNziE,aAAahF,KAAKynE,uBAClBznE,KAAKynE,2BAAwBzsE,GAG/B,MAAM4kC,GAAY,EAAAlc,GAAA,IAAM,GACxB,IAAIgkD,EAAmB,KAEvB,MAAM1tC,EAAK2tC,IACT,GAAGA,aAA8BhmE,QAC/B,OAAO,EAGT,MAAMigE,EAAY+F,EAAmB9F,WACrC,QAAID,IAIDA,GAAahiC,GAEd+nC,EAAmB9F,WAAa,GACzB,IACCD,EAAY8F,IACpBA,EAAmB9F,IAGd,GAAK,EAGd,CACE,aACA,oBACA9iE,SAAS8oE,IACT,IAAI,MAAMvgE,KAAOrH,KAAKmnE,aAAaS,GAAU,CAC3C,MAAMD,EAAqB3nE,KAAKmnE,aAAaS,GAASvgE,GACtD,GAAG2yB,EAAE2tC,GAAqB,CACxB,MAAO1oE,EAAQwc,GAAWpU,EAAIzH,MAAM,KAC9Bib,EAAO7a,KAAK8a,gBAAgB4O,cAAczqB,EAAOI,YACvDW,KAAKoe,kBAAkB+K,WAAW,CAChCxsB,EAAG,uBACHke,KAAMY,EAAU,CACd9e,EAAG,mBACHke,OACAq6B,YAAaz5B,GACX,CACF9e,EAAG,aACHke,QAEFmQ,gBAAiB28C,G,MAMzB,MAAM1iE,EAAU0b,KAAKC,IAAI,KAAyC,KAAhC8mD,EAAmB9nC,IACrD5/B,KAAKynE,sBAAwB74D,EAAA,aAAe5O,KAAKwnE,eAAgBviE,EAAQ,CA0G7E,CArRYiY,QAoBR,OAnBAld,KAAK6nE,yBAA0B,EAAAC,GAAA,GAAS9nE,KAAKwnE,eAAgB,KAAM,GAEnExnE,KAAKoe,kBAAkBC,2BAA2B,CAChDguC,qBAAuB5xC,IACrB,MAAM,KAACI,GAAQJ,EACT+G,EAAqB,qBAAX3G,EAAKle,EACforE,EAAwB,eAAXltD,EAAKle,GAAsB6kB,EACxCviB,EAAS8oE,GAAc/nE,KAAK8a,gBAAgB9b,UAAU6b,EAAKA,MAC3DxT,EAAO0gE,OAAsB/sE,EAAT6f,EAAKle,EAC/BqD,KAAK+qB,iBAAiB,CACpB1jB,MACApI,SACAqjB,SAAUd,GAAU,EAAA9F,GAAA,GAAkBb,EAAKq6B,iBAAcl6C,EACzD8L,SAAU2T,EAAOuQ,kBAEnBhrB,KAAKmd,UAAUxW,cAAc,kBAAmB8T,EAAO,IAIpDza,KAAK2e,gBAAgBxX,WAAWrC,MAAMmC,IAC3C,GAAGA,EAAM+gE,eACP,IAAI,MAAM3gE,KAAOJ,EAAM+gE,gBACrB,EAAA7/C,GAAA,GAAyB9gB,GACzBrH,KAAK+qB,iBAAiB,CACpB1jB,MACAP,SAAUG,EAAM+gE,eAAe3gE,I,GAKzC,CAEO+5D,kBAAkBvmD,GACvB,IAGI5b,EAHAoI,EAAW2/D,GAAqBnsD,EAAKle,GACrCyU,EAAWpR,KAAKmnE,aAAa9/D,GAQjC,MALc,oBAAXwT,EAAKle,IACNsC,EAASoI,EAAMrH,KAAK8a,gBAAgB9b,UAAU6b,EAAKA,MACnDzJ,EAAMA,EAAI/J,IAGT+J,KAIKA,GAAOpR,KAAKmnE,cAAc9/D,GAAOrH,KAAK4T,WAAWC,UAAU,4BAA6B,CAACgH,SAChG/V,MAAMgC,IACL9G,KAAK+qB,iBAAiB,CACpB1jB,MACApI,SACA6H,aAGKA,KAEX,CAEOq6D,4BACL,GAAGnhE,KAAKioE,yBAA0B,OAAOjoE,KAAKioE,yBAE9C,MAAM/jE,EAAY,CAAC,wBAAyB,mBAAoB,oBAC/DC,KAAK8iE,GACGjnE,KAAKohE,kBAAkB,CAACzkE,EAAGsqE,MAGpC,OAAOjnE,KAAKioE,yBAA2BtmE,QAAQ0Q,IAAInO,EACrD,CAEOmoD,qBAAqBxxC,EAAuB/T,GAMjD,OAAO9G,KAAK4T,WAAWC,UAAU,+BAAgC,CAC/DgH,OACA/T,aACChC,MAAMT,IACJA,GACDrE,KAAKoe,kBAAkBiX,mBAAmB,CACxC14B,EAAG,uBACHke,KAAM,OAAF,wBACCA,GAAW,CACdle,EAAGqqE,GAAqBnsD,EAAKle,KAE/BquB,gBAAiB,OAAF,wBACVlkB,GAAQ,CACXnK,EAAG,wB,GAKb,CASOurE,+BACL,OAAGloE,KAAKmoE,qBAA6BnoE,KAAKmoE,qBACnCnoE,KAAKmoE,qBAAuBnoE,KAAK4T,WAAWC,UAAU,uCAC/D,CAEOu0D,6BAA6Bp2C,GAClChyB,KAAK4T,WAAWC,UAAU,uCAAwC,CAACme,WAClEltB,MAAMT,IACLrE,KAAKmoE,qBAAuBxmE,QAAQM,SAAS+vB,EAAO,GAExD,CA6DOq2C,WAAWppE,EAAgBqjB,GAChC,OAAOrjB,GAAUqjB,EAAW,IAAMA,EAAW,GAC/C,CAEOyI,kBAAiB,IAAC1jB,EAAG,OAAEpI,EAAM,SAAEqjB,EAAQ,SAAExb,IAM9C,IAAIsK,EACDnS,IACDoI,EAAMrH,KAAKqoE,WAAWppE,EAAQqjB,GAC9BlR,EAAMpR,KAAKmnE,aAAa7kD,EAAW,mBAAqB,gBAGzDlR,GAAOpR,KAAKmnE,cAAc9/D,GAAOP,EAE9B7H,EAQFe,KAAK6nE,2BAPL7nE,KAAKmd,UAAUxW,cAAc,4BAA6B,CAACU,MAAKP,aAChE9G,KAAK2e,gBAAgBxX,WAAWrC,MAAMmC,IACpC,MAAM+gE,EAAiB/gE,EAAM+gE,eAC7BA,EAAe3gE,GAAOP,EACtB9G,KAAK2e,gBAAgB9W,YAAY,iBAAkBmgE,EAAe,IAOxE,CAEOxsB,QAAQmsB,GACb,MAAgC,uBAAzBA,EAAmBhrE,IACvBgrE,EAAmB31C,aAA6Ch3B,IAAlC2sE,EAAmB9F,YAA6D,IAAhC8F,EAAmB9F,YAAqB,EAAAn+C,GAAA,KAC3H,CAEQ4kD,aAAarpE,GACnB,MAAMizD,EAAMlyD,KAAKohE,kBAAkB,CAACzkE,EAAG,kBAAmBke,KAAM7a,KAAK8a,gBAAgBiW,iBAAiB9xB,KACtG,OAAQizD,aAAevwD,QAAUuwD,EAAMvwD,QAAQM,QAAQiwD,IACtDptD,MAAM6iE,GAAuB3nE,KAAKw7C,QAAQmsB,IAC7C,CAEQY,sBAAqB,OAC3BtpE,EAAM,YACNojB,GAAc,EAAI,SAClBC,IAMA,MAAMkmD,EAAwB,CAC5B7rE,EAAG,sBAGC8rE,EAAUzoE,KAAKqoE,WAAWppE,EAAQqjB,GAClC0lD,EAAiBhoE,KAAKmnE,aAAa7kD,EAAW,mBAAqB,cAAcmmD,GAMvF,IAJGT,GAAoBA,aAA0BrmE,SAC/C1H,OAAOC,OAAOsuE,EAAGR,GAGhB3lD,EAAa,CACd,MACMhb,EAAM2/D,GADQhnE,KAAK8a,gBAAgBmmD,uBAAuB,CAAChiE,SAAQiiE,cAAc,EAAM5+C,aAChD3lB,GACvC+rE,EAAqB1oE,KAAKmnE,aAAa9/D,GAC7C,GAAGqhE,KAAwBA,aAA8B/mE,SACvD,IAAI,MAAMgE,KAAK+iE,OAED1tE,IAATwtE,EAAE7iE,KAEH6iE,EAAE7iE,GAAK+iE,EAAmB/iE,G,CAMlC,OAAO6iE,CACT,CAEO7G,qBAA+FjmE,GACpG,GAAGA,EAAQuD,SAAWe,KAAK8a,gBAAgB7b,OAE3C,OADGvD,EAAQ4mB,WAAatiB,KAAK8a,gBAAgBiF,QAAQrkB,EAAQuD,UAASvD,EAAQ4mB,cAAWtnB,GAClFU,CACT,CAEO0mB,iBAAiB1mB,GACtB,KAAKA,EAAUsE,KAAK2hE,qBAAqBjmE,IAAW,OAAO,EAE3D,GAAGA,EAAQ4mB,SAAU,CACnB,MAAM0lD,EAAiBhoE,KAAKuoE,qBAAqB,OAAD,wBAAK7sE,GAAO,CAAE2mB,aAAa,KAC3E,YAA6BrnB,IAA1BgtE,EAAeh2C,aAAsDh3B,IAA9BgtE,EAAenG,WAChD7hE,KAAKw7C,QAAQwsB,GAEbhoE,KAAKoiB,iBAAiB,OAAD,wBAAK1mB,GAAO,CAAE4mB,cAAUtnB,I,CAIxD,MAAMgtE,EAAiBhoE,KAAKuoE,qBAAqB7sE,GAEjD,OADgBsE,KAAKw7C,QAAQwsB,EAE/B,E,yDCnSK,MAAMW,WAAwBj2D,EACxBzT,aACT,OAAOe,KAAKod,gBAAgBje,OAAOE,UACrC,CAMOupE,cAAc3pE,GACnB,OAAOA,EAAOQ,UAAYO,KAAK0c,gBAAgBogB,UAAU79B,EAAO2d,WAAY,eAC9E,CAEOisD,aAAa5pE,GAClB,MAAM4b,EAAO7a,KAAKszD,QAAQr0D,GAC1B,OAAO,EAAA4pE,GAAA,GAAahuD,EACtB,CAEOyzC,kBAAkBrvD,GACvB,GAAGA,EAAOQ,SACR,OAAO,EAGT,MAAMse,EAAO/d,KAAK0c,gBAAgBsB,QAAQ/e,EAAO2d,YAC3CgF,EAAa7D,aAAI,EAAJA,EAAM+L,YACzB,SAAGlI,IAAc7D,EAAK7gB,OAAO6sB,eACpB,EAAA/qB,GAAA,GAAU4iB,EAIrB,CAEO8H,cAAczqB,GACnB,GAAGA,EAAOQ,SACR,MAAO,CAAC9C,EAAG,WAAYyC,QAASH,EAAOoxB,YAGzC,MAAM/wB,EAASL,EAAO2d,WACtB,OAAG5c,KAAK0c,gBAAgBqJ,UAAUzmB,GACzB,CAAC3C,EAAG,cAAe4C,WAAYD,GAGjC,CAAC3C,EAAG,WAAY6C,QAASF,EAClC,CAEOwgE,cAAc7gE,GACnB,OAAGA,EAAOQ,SACDO,KAAKod,gBAAgB0rD,cAAc7pE,EAAOoxB,YAE5CrwB,KAAK0c,gBAAgBkhB,cAAc3+B,EAAO2d,WACnD,CAEOohC,gBAAgB/+C,GACrB,OAAOe,KAAK8oD,uBAAuB7pD,GAAQ,IAAM,EACnD,CAEO6pD,uBAAuB7pD,GAC5B,MAAM4b,EAAO7a,KAAKszD,QAAQr0D,GAC1B,OAAO,EAAA6pD,GAAA,GAAuBjuC,EAChC,CAEOy4C,QAAQr0D,GACb,OAAOA,EAAOQ,SACZO,KAAKod,gBAAgBwgC,QAAQ3+C,EAAOoxB,YACpCrwB,KAAK0c,gBAAgBsB,QAAQ/e,EAAO2d,WACxC,CAEO5d,UAAUC,GACf,OAAO,EAAAD,GAAA,GAAUC,KAAY,EAAAukB,GAAA,GAAoBvkB,IAAwB,kBAAbA,EAAOtC,GAAyBqD,KAAKf,QAAW,IAC9G,CAEOs9D,cAAct9D,GACnB,MAAO,CACLtC,EAAG,aACHke,KAAM7a,KAAK0pB,cAAczqB,GAE7B,CAEO8mB,UAAU9mB,GACf,OAAQA,EAAOQ,UAAYO,KAAK0c,gBAAgBqJ,UAAU9mB,EAAO2d,WACnE,CAEOwgB,YAAYn+B,GACjB,OAAQA,EAAOQ,UAAYO,KAAK0c,gBAAgB0gB,YAAYn+B,EAAO2d,WACrE,CAEOmD,QAAQ9gB,GACb,OAAQA,EAAOQ,UAAYO,KAAK0c,gBAAgBqD,QAAQ9gB,EAAO2d,WACjE,CAEOwT,WAAWnxB,GAChB,OAAQA,EAAOQ,WAAaO,KAAK0c,gBAAgBwT,YAAYjxB,EAAO2d,WACtE,CAEOsT,YAAYjxB,GACjB,OAAOe,KAAK+lB,UAAU9mB,KAAYe,KAAKo9B,YAAYn+B,EACrD,CAEOqxB,MAAMrxB,GACX,OAAOA,EAAOQ,UAAYO,KAAKod,gBAAgBkT,MAAMrxB,EAAOoxB,WAC9D,CAEOI,UAAUxxB,GACf,OAAOA,EAAOQ,UAAYO,KAAKod,gBAAgBqT,UAAUxxB,EAAOoxB,WAClE,CAEO5wB,OAAOR,GACZ,OAAO,EAAAQ,GAAA,GAAOR,EAChB,CAEO+nB,UAAU/nB,GACf,OAAO,EAAA+nB,GAAA,GAAU/nB,EACnB,CAEOu+D,iBAAiBv+D,GACtB,OAAO,EAAAu+D,GAAA,GAAiBx9D,KAAKszD,QAAQr0D,GACvC,CAEO8pE,yBAAyB9pE,GAC9B,MAAM4b,EAAO7a,KAAKszD,QAAQr0D,GACpBR,EAASoc,EAAKmuD,oBAAqB,SAAqBnuD,EAAKmuD,yBAAsBhuE,EACzF,OAAGyD,EACMA,EAAOpD,KAEP4D,EAAOQ,SAAW,0BAA4B,yBAEzD,CAqCOwhE,wBAIJ,OACDhiE,EAAM,aACNiiE,EAAY,SACZ5+C,IAEA,OAAG4+C,EACEjiE,EAAOQ,SACD,CAAC9C,EAAG,oBAERqD,KAAKkwB,YAAYjxB,GACX,CAACtC,EAAG,yBAEJ,CAACA,EAAG,oBAGP2lB,EACD,CACL3lB,EAAG,wBACHke,KAAM7a,KAAK+wB,iBAAiB9xB,GAC5Bi2C,YAAY,EAAA71B,GAAA,GAAmBiD,IAG1B,CACL3lB,EAAG,kBACHke,KAAM7a,KAAK+wB,iBAAiB9xB,GAGlC,CAEO8xB,iBAAiB9xB,GACtB,IAAIA,EACF,MAAO,CAACtC,EAAG,kBAGb,IAAIsC,EAAOQ,SAAU,CACnB,MAAMH,EAASL,EAAO2d,WACtB,OAAO5c,KAAK0c,gBAAgB8gB,aAAal+B,E,CAG3C,MAAMH,EAASF,EAAOoxB,WACtB,OAAOrwB,KAAKod,gBAAgB6rD,iBAAiB9pE,EAC/C,CAKO26C,mBACL,MAAO,CAACn9C,EAAG,gBACb,CAEOy7D,uBAAuBn5D,GAC5B,MAAO,CACLtC,EAAG,kBACHke,MAAM,EAAA2I,GAAA,GAAoBvkB,GAAUA,EAASe,KAAK+wB,iBAAiB9xB,GAEvE,CAEOse,kBAAkBte,GACvB,IAAI5D,EAQJ,OANEA,EADC2E,KAAKP,OAAOR,GACN,OAASe,KAAKod,gBAAgB8rD,kBAAkBjqE,EAAOoxB,YAGvD,QADMrwB,KAAK0c,gBAAgBsB,QAAQ/e,EAAO2d,YAC3B6O,OAAS,IAG1BpwB,CACT,CAEO8tE,cAAclqE,GACnB,OAAGe,KAAKo9B,YAAYn+B,GACX,YACCe,KAAK+lB,UAAU9mB,GAChB,UACEe,KAAKP,OAAOR,GAGdA,IAAWe,KAAKf,OAAS,QAAU,OAFnC,OAIX,CAEOmqE,oBAAoBnqE,GACzB,OAAOe,KAAKmpE,cAAclqE,IACxB,IAAK,UACH,OAAOe,KAAK0c,gBAAgBogB,UAAU79B,EAAO2d,WAAY,eAAiB,gBAAkB,gCAE9F,IAAK,YACL,IAAK,QACH,OAAO5c,KAAK0c,gBAAgBogB,UAAU79B,EAAO2d,WAAY,eAAiB,aAAe,8BAE3F,QACE,MAAO,8BAEb,CAEO+pD,WAAW1nE,G,MAChB,OAAGA,EAAOQ,aAG2B,QAA1B,EADIO,KAAK0c,gBAAgBsB,QAAQ/e,EAAO2d,YACpB1f,cAAM,eAAEwpE,WAEzC,EChRK,MAAM2C,WAAyB32D,EAAtC,c,oBACU,KAAA42D,OAEJ,CAAC,CA4FP,CA1FSvsB,UAAUnkB,EAAc9iB,G,MAC7B,IAAI8iB,GAAqB,eAAZA,EAAMj8B,EAAoB,OAYvC,MAAM4sE,EAAWvpE,KAAKspE,OAAO1wC,EAAMh8B,IAMnC,GALGg8B,EAAMuX,iBACP7C,GAAyB,iBAAkBi8B,EAAU3wC,GACrD54B,KAAKowC,kBAAkBx6B,YAAYgjB,EAAMuX,eAAgBr6B,IAG7C,QAAX,EAAA8iB,EAAM03B,aAAK,eAAE7zD,OAAQ,CAEtBm8B,EAAM03B,MAAMzvC,MAAK,CAACC,EAAGC,KACVD,EAA0BzN,OAAUyN,EAAqCwvC,MAAQkZ,IAAW,KAAQzoD,EAA0B1N,OAAU0N,EAAqCuvC,MAAQkZ,IAAW,MAG3M,MAAMn2D,EAAOulB,EAAM03B,MAAM13B,EAAM03B,MAAM7zD,OAAS,GAChC,yBAAX4W,EAAK1W,IACN0W,EAAKA,KAAOA,EAAKi9C,MAAMj9C,EAAKi9C,MAAM7zD,OAAS,G,CAI/C,OAAG8sE,EACMtvE,OAAOC,OAAOqvE,EAAU3wC,GAG1B54B,KAAKspE,OAAO1wC,EAAMh8B,IAAMg8B,CACjC,CAEO6wC,cAActqE,EAAgB0pB,EAA2B,IAAKtM,EAAgB,IACnF,MAAMmtD,EAAY1pE,KAAKod,gBAAgB4d,aAAa77B,GACpD,OAAOa,KAAK4T,WAAW2tB,mBAAmB,uBAAwB,CAChEniC,QAASsqE,EACTp9C,OAAQ,EACR/P,QACAwqC,OAAQl+B,GACP,CAAC2Y,aAAc,KAAK18B,MAAM6kE,IAC3B3pE,KAAKod,gBAAgBgL,aAAauhD,EAAa7wD,OAC/C,MAAM8wD,EAAWD,EAAaL,OAAOnlE,KAAI,CAACy0B,EAAOt0B,KAC/CqlE,EAAaL,OAAOhlE,GAAOtE,KAAK+8C,UAAUnkB,EAAO,CAAC76B,KAAM,eAAgBkB,OAAQE,EAAOE,aAChFu5B,EAAMh8B,MAIf,GAAa,MAAVisB,GAAiBA,EAAO,CACzB,MAAMvkB,EAAMslE,EAASnvE,QAAQouB,IACjB,IAATvkB,GACDslE,EAAS9/D,OAAOxF,EAAK,E,CAIzB,MAAO,CACLgW,MAAQqvD,EAAgDrvD,OAASsvD,EAASntE,OAC1E6sE,OAAQM,EACT,GAEL,CAsBOxW,SAASyW,GACd,OAAO,EAAArmD,GAAA,GAASqmD,GAAWA,EAAqB7pE,KAAKspE,OAAOO,EAC9D,ECrGK,MAAMC,WAAwBp3D,EAArC,c,oBACS,KAAAiwD,MAA8B,CAAC,EAC/B,KAAAx9D,QAAuC,CAAC,EACxC,KAAA8nD,eAA8C,CAAC,EAE9C,KAAA9sD,KAAM,EAAAsI,EAAA,IAAO,QAAS,WAuLhC,CArLYyU,QACRld,KAAKoe,kBAAkBC,2BAA2B,CAChD0rD,kBAAoBtvD,IAClBza,KAAKG,IAAI,qBAAsBsa,GAE/B,IAAIsyC,EAAatyC,EAAOsyC,MAAQ/sD,KAAK2iE,MAAMloD,EAAOuvD,SAClD,IAAIjd,EACF,OAGF,IAAI5nD,EAAUsV,EAAOtV,QACrB,MAAM+sD,EAAMlyD,KAAKizD,SAASlG,EAAM5nD,GAChC4nD,EAAOmF,EAAInF,KACX5nD,EAAU+sD,EAAI/sD,QAEdnF,KAAKmd,UAAUxW,cAAc,cAAe,CAAComD,OAAM5nD,QAASA,GAAgB,GAGlF,CAEO8tD,SAASlG,EAAY5nD,EAAsBtD,GAC7CA,GACD7B,KAAKqmE,oBAAoBxkE,GAAS,GAGpC,MAAMjF,EAAKmwD,EAAKnwD,GAWhB,OAVGoD,KAAK2iE,MAAM/lE,IACZmwD,EAAO9yD,OAAOC,OAAO8F,KAAK2iE,MAAM/lE,GAAKmwD,GACrC5nD,EAAUnF,KAAKiqE,YAAYld,EAAM5nD,KAEjCnF,KAAK2iE,MAAM/lE,GAAMmwD,EAEjBA,EAAKmd,cAAgB,GACrB/kE,EAAUnF,KAAKiqE,YAAYld,EAAM5nD,IAG5B,CAAC4nD,OAAM5nD,UAChB,CAEO8kE,YAAYld,EAAY5nD,G,MAkB7B,OAjBGnF,KAAKmF,QAAQ4nD,EAAKnwD,IACnBuI,EAAUlL,OAAOC,OAAO8F,KAAKmF,QAAQ4nD,EAAKnwD,IAAKuI,GAE/CnF,KAAKmF,QAAQ4nD,EAAKnwD,IAAMuI,EAGtBA,EAAQjI,OAAO0jB,MACjBmsC,EAAKmd,cAAcztE,OAAS,GACT,QAAhB,EAAA0I,aAAO,EAAPA,EAASA,eAAO,eAAE1I,SACnB0I,EAAQA,QAAQrG,SAAQ,CAACqrE,EAAQ7lE,K,OACf,QAAb,EAAA6lE,EAAOjtE,cAAM,eAAEktE,SAChBrd,EAAKmd,cAAc5pE,KAAKgE,E,KAMzBa,CACT,CAEOguD,QAAQH,GACb,MAAO,CACLjG,KAAM/sD,KAAK2iE,MAAM3P,GACjB7tD,QAASnF,KAAKmF,QAAQ6tD,GAE1B,CAEOqX,kBAAkBtd,EAAYud,EAA+BC,EAAmBC,GAWrF,OAVGD,GACGC,IACFA,EAAmB,IAGrBD,GAAW,EAAAtyC,GAAA,GAAcsyC,EAAUC,IAEnCD,OAAWvvE,EAGN,CACL2B,EAAG,iBACHowD,OACA0d,gBAAiBH,EACjBC,WACAG,kBAAmBH,EAAWC,OAAmBxvE,EAErD,CAEOqrE,oBAAoBxkE,EAA0B9C,GACnD,MAAM,GAACnC,GAAOiF,EAAQuW,MAAwC20C,KAC9D,IAAI9kD,EAAMjI,KAAKitD,eAAerwD,GAE9B,IAAImC,IAAQkJ,EACV,OAGEA,IACFA,EAAMjI,KAAKitD,eAAerwD,GAAM,IAAIwB,KAGtC,MAAMiJ,EAAMxF,EAAQ5C,OAAS,IAAM4C,EAAQ8kB,IACxC5nB,EAAKkJ,EAAIlJ,IAAIsI,GACXY,EAAIpE,OAAOwD,GAEZtI,GAAQkJ,EAAIoL,cACPrT,KAAK2iE,MAAM/lE,UACXoD,KAAKmF,QAAQvI,UACboD,KAAKitD,eAAerwD,GAE/B,CAEO+tE,SAAS9oE,EAA0B+oE,GACxC,MAAM7d,EAAclrD,EAAQuW,MAAwC20C,KAE9DrxD,EAAwBkvE,EAAUzmE,KAAKhD,GACpC4rD,EAAK8d,QAAQ1pE,GAAO2pE,SAGvB/8D,EAAYlM,EAAQ8kB,IACpB1nB,EAAS4C,EAAQ5C,OACjBwyB,EAAYzxB,KAAK8a,gBAAgBiW,iBAAiB9xB,GAExD,OAAG4C,EAAQ3E,OAAO2pB,YACT7mB,KAAKwW,mBAAmBi3C,yBAAyB1/C,EAAW,YAAalM,IAC9E7B,KAAKG,IAAI,4BACFH,KAAK2qE,SAAS9oE,EAA4B+oE,MAI9C5qE,KAAK4T,WAAWC,UAAU,oBAAqB,CACpDgH,KAAM4W,EACN0sB,QAAQ,EAAA9+B,GAAA,GAAmBxd,EAAQ8kB,KACnCjrB,YACCoJ,MAAMmkB,IACPjpB,KAAKG,IAAI,oBAAqB8oB,GAC9BjpB,KAAKoe,kBAAkBkV,qBAAqBrK,EAAQ,GAExD,CAEO8hD,WAAWlpE,GAChB,MAAM4vB,EAAYzxB,KAAK8a,gBAAgBiW,iBAAiBlvB,EAAQ5C,QAEhE,OAAOe,KAAK4T,WAAWC,UAAU,0BAA2B,CAC1DgH,KAAM4W,EACN0sB,QAAQ,EAAA9+B,GAAA,GAAmBxd,EAAQ8kB,OAClC7hB,MAAMmkB,IACPjpB,KAAKoe,kBAAkBkV,qBAAqBrK,GAC5CjpB,KAAKG,IAAI,sBAAuB8oB,EAAQ,GAE5C,CAEO+hD,SAASnpE,EAA0BipE,EAAqBx+C,EAAiB/P,EAAQ,IACtF,OAAOvc,KAAK4T,WAAWC,UAAU,wBAAyB,CACxDgH,KAAM7a,KAAK8a,gBAAgBiW,iBAAiBlvB,EAAQ5C,QACpDrC,IAAI,EAAAyiB,GAAA,GAAmBxd,EAAQ8kB,KAC/BmkD,SACAx+C,SACA/P,UACCzX,MAAMmmE,IACPjrE,KAAKG,IAAI,yBAA0B8qE,GAEnCjrE,KAAKod,gBAAgBgL,aAAa6iD,EAAUnyD,OAErCmyD,IAEX,CAEOC,SAASrpE,GACd,MAAMkrD,EAAclrD,EAAQuW,MAAwC20C,KAEpE,GAAGA,EAAK7vD,OAAOslC,OAAQ,OAAO7gC,QAAQM,UAEtC,MAAMkpE,GAAU,EAAAr8C,GAAA,GAAKi+B,GAErB,OADAoe,EAAQjuE,OAAOslC,QAAS,EACjBxiC,KAAKwW,mBAAmBq3C,YAAYhsD,OAAS7G,EAAW,CAC7D+yD,SAAU/tD,KAAKqqE,kBAAkBc,KAChCrmE,MAAK,SAELwE,IACDtJ,KAAKG,IAAIvC,MAAM,kBAAmB0L,EAAI,GAE1C,EChMK,MAAM8hE,WAA0B14D,EAAvC,c,oBACU,KAAA24D,QAEH,CAAC,CAqER,CAnEYnuD,QACRld,KAAKoe,kBAAkBC,2BAA2B,CAChDitD,cAAgB7wD,IACd,MAAMpT,EAAMoT,EAAOpT,IAAI1K,EACvBqD,KAAKqrE,QAAQhkE,GAAOoT,EAAO8wD,MAC3BvrE,KAAKmd,UAAUxW,cAAc,iBAAkB8T,EAAO,GAG5D,CAEO+wD,WAAWvE,EAAgCsE,GAChD,OAAOvrE,KAAK4T,WAAWC,UAAU,qBAAsB,CACrDxM,IAAK,CACH1K,EAAGsqE,GAELsE,UACCzmE,MAAM2mE,IACPzrE,KAAKod,gBAAgBgL,aAAaqjD,EAAa3yD,OAC/C9Y,KAAK0c,gBAAgB2L,aAAaojD,EAAanjD,OAE/CtoB,KAAKoe,kBAAkBiX,mBAAmB,CACxC14B,EAAG,gBACH0K,IAAK,CACH1K,EAAGqqE,GAAqBC,IAE1BsE,MAAOA,EAAMpnE,KAAKunE,IAChB,MAAMC,EAAoB,CAAC,EAG3B,OAFA1xE,OAAOC,OAAOyxE,EAAMD,GACpBC,EAAKhvE,EAAIqqE,GAAqB2E,EAAKhvE,GAC5BgvE,CAAI,MAMRF,EAAaF,QAExB,CAEOK,WAAW3E,GAChB,MAAM4E,EAA8B7E,GAAqBC,GACnDsE,EAAQvrE,KAAKqrE,QAAQQ,GAC3B,OAAGN,EACM5pE,QAAQM,QAAQspE,GAGlBvrE,KAAKqrE,QAAQQ,GAAc7rE,KAAK4T,WAAWC,UAAU,qBAAsB,CAChFxM,IAAK,CACH1K,EAAGsqE,KAEJniE,MAAM2mE,IACPzrE,KAAKod,gBAAgBgL,aAAaqjD,EAAa3yD,OAC/C9Y,KAAK0c,gBAAgB2L,aAAaojD,EAAanjD,OAIxCtoB,KAAKqrE,QAAQQ,GAAcJ,EAAaF,QAEnD,CAEOO,2BACL,OAAO9rE,KAAK4T,WAAWC,UAAU,mCACnC,CAEOk4D,yBAAyBjlE,GAC9B,OAAO9G,KAAK4T,WAAWC,UAAU,mCAAoC,CAAC/M,YACxE,E,2SCxDF,MAAMklE,GAAgB,KAEf,MAAMC,WAA0Bv5D,EAAvC,c,oBAEU,KAAAw5D,UAA+C,CAAC,EAChD,KAAAC,UAAsC,CAAC,EACvC,KAAAC,eAA6C,CAAC,EA0mB9C,KAAAC,mBAAsB5xD,I,QAC5B,MAAMxC,EAAUwC,EAAmCrb,QAChDqb,EAAmCrb,QAAQC,WAC5CW,KAAK8a,gBAAgB9b,UAAWyb,EAAuCgP,SACzE,GAAGzpB,KAAK8a,gBAAgB7b,SAAWgZ,GAA8B,8BAApBwC,EAAO7B,OAAOjc,EACzD,OAGF,MAAMkrD,EAAYptC,EAA0Cy6B,WACtD5yB,EAAWulC,GAAW,EAAAnsC,GAAA,GAAkBmsC,QAAY7sD,EACpDiE,EAASe,KAAK8a,gBAAgB9b,UAAUyb,GACxCpT,EAAMrH,KAAKssE,cAAcrtE,EAAQqjB,GACjC+/B,EAAgC,QAAzB,KAAGriD,KAAKusE,eAAcllE,UAAG,UAAHA,GAAS,GAC5C,IAAI6+D,EAAS7jB,EAAQ7jD,MAAMguE,GAAMA,EAAErtE,SAAW8Y,IAE9C,MAAMw0D,EAAe,YACZvG,EAAOjhE,QAEd,MAAMX,EAAM+9C,EAAQ5nD,QAAQyrE,IAChB,IAAT5hE,GACD+9C,EAAQv4C,OAAOxF,EAAK,GAGtBtE,KAAKmd,UAAUxW,cAAc,eAAgB,CAAC1H,SAAQqjB,WAAU+/B,YAE5DA,EAAQ5lD,eACHuD,KAAKusE,cAAcllE,E,EAQ9B,QAJuBrM,KAApBkrE,aAAM,EAANA,EAAQjhE,UACTD,aAAakhE,EAAOjhE,SAGC,4BAApBwV,EAAO7B,OAAOjc,EAAiC,CAChD,IAAIupE,EACF,OAIF,YADAuG,G,CAIEvG,IACFA,EAAS,CACP/mE,OAAQ8Y,GAGVoqC,EAAQ/hD,KAAK4lE,IAKfA,EAAOttD,OAAS6B,EAAO7B,OAEvB,MAAM4d,EAAUx2B,KAAKod,gBAAgBoZ,QAAQve,GACzCue,EAcFx2B,KAAKod,gBAAgBgoC,gBAAgBntC,GAZrB,yBAAbwC,EAAO9d,GACL8d,EAAOjb,SAAWQ,KAAK0c,gBAAgBga,QAAQjc,EAAOjb,WAAaQ,KAAK0c,gBAAgBqJ,UAAUtL,EAAOjb,UAC1GmC,QAAQM,QAAQjC,KAAK0sE,YAAYjyD,EAAOjb,UAAUsF,MAAK,UAC/B9J,IAAnBkrE,EAAOjhE,SAAyBjF,KAAKod,gBAAgBoZ,QAAQve,IAC9DjY,KAAKmd,UAAUxW,cAAc,eAAgB,CAAC1H,SAAQqjB,WAAU+/B,W,IAW1E6jB,EAAOjhE,QAAU2J,EAAA,aAAe69D,EAAc,KAC3Cj2C,GACDx2B,KAAKmd,UAAUxW,cAAc,eAAgB,CAAC1H,SAAQqjB,WAAU+/B,W,EAI5D,KAAAsqB,oBAAuBlyD,IAC7B,MAAMxb,EAASe,KAAK8a,gBAAgB9b,UAAUyb,EAAO9B,SACrD,GAAG3Y,KAAK8a,gBAAgBrb,OAAOR,GAAS,CACtC,MAAME,EAASF,EAAOoxB,WAChBqkC,EAAW10D,KAAKksE,UAAU/sE,GAC7Bu1D,IACEj6C,EAAOmyD,QAASlY,EAASx3D,OAAO0vE,SAAU,SACjClY,EAASx3D,OAAO0vE,SAG9B5sE,KAAKmd,UAAUxW,cAAc,mBAAoBxH,E,CAGnDa,KAAKmd,UAAUxW,cAAc,aAAc,CAAC1H,SAAQ2tE,QAASnyD,EAAOmyD,SAAS,CAMjF,CAzsBY1vD,QACRld,KAAKoe,kBAAkBC,2BAA2B,CAChDwuD,uBAAyBpyD,IACvB,MAAM29B,EAAe39B,EAAO29B,aAC5B,GAAsB,qBAAnBA,EAAaz7C,EAA0B,CACxC,MAAM2C,EAAS84C,EAAa54C,QACtBohC,EAAW5gC,KAAKmsE,UAAU7sE,QAChBtE,IAAb4lC,IACDA,EAASwX,aAAeA,EACxBp4C,KAAKmd,UAAUxW,cAAc,mBAAoBrH,G,GAKvDwtE,yBAA2BryD,IACzB,MAAMmmB,EAAW5gC,KAAKmsE,UAAU1xD,EAAOjb,SACvC,QAAgBxE,IAAb4lC,EAAwB,CACzB,MAAMmsC,EAAgBnsC,EAASwX,aACzBA,EAAe20B,EAAc30B,cAAgB,GACnD,IAAI,IAAIzyC,EAAI,EAAGlJ,EAAS27C,EAAa37C,OAAQkJ,EAAIlJ,EAAQkJ,IACvD,GAAGyyC,EAAazyC,GAAGvG,UAAYqb,EAAOrb,QACpC,OAIJg5C,EAAa93C,KAAK,CAChB3D,EAAG,kBACHyC,QAASqb,EAAOrb,QAChB2Z,WAAY0B,EAAO1B,WACnB0K,MAAM,EAAAC,GAAA,IAAM,KAGdqpD,EAAc/yE,QAAUygB,EAAOzgB,QAC/BgG,KAAKmd,UAAUxW,cAAc,mBAAoB8T,EAAOjb,Q,GAI5DwtE,4BAA8BvyD,IAC5B,MAAMmmB,EAAW5gC,KAAKmsE,UAAU1xD,EAAOjb,SACvC,QAAgBxE,IAAb4lC,EAAwB,CACzB,MAAMmsC,EAAgBnsC,EAASwX,aACzBA,EAAe20B,EAAc30B,cAAgB,GACnD,IAAI,IAAIzyC,EAAI,EAAGlJ,EAAS27C,EAAa37C,OAAQkJ,EAAIlJ,EAAQkJ,IACvD,GAAGyyC,EAAazyC,GAAGvG,UAAYqb,EAAOrb,QAIpC,OAHAg5C,EAAatuC,OAAOnE,EAAG,GACvBonE,EAAc/yE,QAAUygB,EAAOzgB,aAC/BgG,KAAKmd,UAAUxW,cAAc,mBAAoB8T,EAAOjb,Q,GAOhEytE,iBAAkBjtE,KAAKqsE,mBACvBa,qBAAsBltE,KAAKqsE,mBAC3Bc,wBAAyBntE,KAAKqsE,mBAE9Be,kBAAmBptE,KAAK2sE,sBAG1B3sE,KAAKmd,UAAU7W,iBAAiB,eAAgBhH,I,QAC9C,MAAM+tE,EAAWrtE,KAAKmsE,UAAU7sE,GAC1Bye,EAA8E/d,KAAK0c,gBAAgBsB,QAAQ1e,GACjH,IAAI+tE,IAAatvD,EACf,OAGF,IAAIuvD,GAAU,IACTD,EAASpzC,SAAqC,QAA1B,EAAClc,EAAmB7gB,cAAM,eAAEqwE,eACnDD,GAAU,GAGZ,MAAM,MAAC10C,GAAS7a,EAChB,GAAG6a,EAAO,CACR,MAAM40C,EAA2B,mBAAZ50C,EAAMj8B,GAGzB6wE,OAF0BH,EAASI,YAAwC,eAA1BJ,EAASI,WAAW9wE,IAGnE6wE,GACA50C,EAAM37B,YAAgC,QAAnB,EAAAowE,EAASI,kBAAU,eAAE7wE,OAG1C0wE,GAAU,E,CAIXA,GACDttE,KAAK0tE,gBAAgBpuE,EAAOD,UAAS,G,IAIzCW,KAAKmd,UAAU7W,iBAAiB,kBAAmBhH,IACjDU,KAAK0tE,gBAAgBpuE,EAAOD,UAAS,GAAM,IAI7CW,KAAKmd,UAAU7W,iBAAiB,oBAAqBhH,IACnDU,KAAKmd,UAAUxW,cAAc,mBAAoBrH,EAAOD,UAAS,GAAM,IAIzEW,KAAKmd,UAAU7W,iBAAiB,oBAAqBnH,IACnDa,KAAKmd,UAAUxW,cAAc,mBAAoBxH,EAAOE,UAAS,GAAO,IAG1EW,KAAKmd,UAAU7W,iBAAiB,2BAA4BhH,IAC1DU,KAAK2tE,8BAA8BruE,EAAO,IAG5CU,KAAKusE,cAAgB,CAAC,CACxB,CAsBOz1D,WAAWla,EAAYu3B,GAC5B,OAAGn0B,KAAKksE,UAAUtvE,KAAQu3B,GAAY5lB,KAAK1J,MAAQ7E,KAAKosE,eAAexvE,EAAGyC,YACjEW,KAAKksE,UAAUtvE,GAGjBoD,KAAK4T,WAAWotB,uBAAuB,CAC5Cl4B,OAAQ,oBACRmL,OAAQ,CACNrX,GAAIoD,KAAKod,gBAAgB4d,aAAap+B,IAExCqkC,cAAgB2sC,IACd5tE,KAAK0c,gBAAgB2L,aAAaulD,EAActlD,OAAO,GACvDtoB,KAAKod,gBAAgBgL,aAAawlD,EAAc90D,OAEhD,MAAM47C,EAAWkZ,EAAcC,UACzB5uE,EAASrC,EAAGyC,UAAS,GACxBq1D,EAASoZ,gBACVpZ,EAASoZ,cAAgB9tE,KAAK88C,iBAAiBC,UAAU2X,EAASoZ,cAAe,CAAC/vE,KAAM,eAAgBkB,YAG1G,MAAM8uE,EAAUrZ,EAASsZ,SACzB,GAAGD,EAAS,CACV,MAAME,EAAqC,CAAClwE,KAAM,WAAYoB,OAAQvC,GACtEmxE,EAAQG,qBAAuBluE,KAAK03C,eAAezH,QAAQ89B,EAAQG,qBAAsBD,GACzFF,EAAQI,kBAAoBnuE,KAAK88C,iBAAiBC,UAAUgxB,EAAQI,kBAAmBF,E,CAkBzF,OAfAjuE,KAAKmiB,wBAAwB4I,iBAAiB,CAC5C9rB,SACA6H,SAAU4tD,EAAS1pC,kBAGrBhrB,KAAKksE,UAAUtvE,GAAM83D,EACrB10D,KAAKosE,eAAentE,GAAUsP,KAAK1J,MAAQmnE,GAQ3ChsE,KAAKmd,UAAUxW,cAAc,mBAAoB/J,GAC1C83D,CAAQ,GAGrB,CAEO0Z,mBAAmBnvE,EAAgBk1B,GACxC,OAAGn0B,KAAK8a,gBAAgBkM,UAAU/nB,GAAgBe,KAAK0sE,YAAYztE,EAAO2d,WAAYuX,GAC1En0B,KAAK8W,WAAW7X,EAAOoxB,WAAY8D,EACjD,CAEO0M,kBAAkBvhC,GACvB,OAAOU,KAAKmsE,UAAU7sE,EACxB,CAEOq1D,kBAAkBx1D,GACvB,OAAOa,KAAKksE,UAAU/sE,EACxB,CAEOkvE,yBAAyBpvE,GAC9B,OAAOA,EAAOQ,SAAWO,KAAK20D,kBAAkB11D,EAAOoxB,YAAcrwB,KAAK6gC,kBAAkB5hC,EAAO2d,WACrG,CAEa0xD,aAAarvE,G,0CACxB,MAAMsvE,QAAgBvuE,KAAKouE,mBAAmBnvE,GAC9C,OAAOsvE,EAAQ5xE,GACb,IAAK,WACH,OAAO4xE,EAAQT,cACjB,IAAK,cACL,IAAK,WACH,OAAOS,EAAQd,WAErB,G,CA0BOf,YAAY9vE,EAAYu3B,GAC7B,GAAGn0B,KAAK0c,gBAAgBqJ,UAAUnpB,GAChC,OAAOoD,KAAK4iC,eAAehmC,EAAIu3B,GAGjC,MAAMl1B,EAASrC,EAAGyC,UAAS,GACrBguE,EAAWrtE,KAAKmsE,UAAUvvE,GAChC,GAAGywE,IAAal5C,GAAY5lB,KAAK1J,MAAQ7E,KAAKosE,eAAentE,GAAS,CACpE,MAAM8e,EAAO/d,KAAK0c,gBAAgBsB,QAAQphB,GAC1C,GACEmhB,EAAK7gB,OAAOuI,MACZsY,EAAK7gB,OAAO6sB,aACZhM,EAAK/jB,UAAaqzE,EAASj1B,aAAmDp+C,QAE9E,OAAOqzE,C,CAIX,OAAOrtE,KAAK4T,WAAWotB,uBAAuB,CAC5Cl4B,OAAQ,uBACRmL,OAAQ,CACNzU,QAAS5C,GAEXqkC,cAAgB7+B,IACdpC,KAAK0c,gBAAgB2L,aAAajmB,EAAOkmB,OAAO,GAChDtoB,KAAKod,gBAAgBgL,aAAahmB,EAAO0W,OACzC,MAAM8nB,EAAWx+B,EAAOosE,UAmBxB,OAlBG5tC,GAAYA,EAAS6sC,YAAc7sC,EAAS6sC,WAAW7wE,KACxDgkC,EAAS6sC,WAAaztE,KAAK88C,iBAAiBC,UAAUnc,EAAS6sC,WAAY,CAAC1vE,KAAM,eAAgBkB,YAGjG2hC,EAAS3G,MACVj6B,KAAK27D,qBAAqBpjB,cAAc3X,EAAS3G,KAAMr9B,GAIzDoD,KAAKmiB,wBAAwB4I,iBAAiB,CAC5C9rB,SACA6H,SAAU85B,EAAS5V,kBAGrBhrB,KAAKmsE,UAAUvvE,GAAMgkC,EACrB5gC,KAAKosE,eAAentE,GAAUsP,KAAK1J,MAAQmnE,GAC3ChsE,KAAKmd,UAAUxW,cAAc,mBAAoB/J,GAE1CgkC,CAAQ,GAGrB,CAEa6tC,kBAAkB7xE,EAAYs6B,G,0CACzC,MAAM0J,QAAiB5gC,KAAK0sE,YAAY9vE,GACxC,OAAIs6B,GACF0J,EAAS8tC,iBACqB,sBAA9B9tC,EAAS8tC,gBAAgB/xE,EAClBikC,EAAS8tC,gBAAgBC,KAG3B3uE,KAAK4T,WAAWC,UAAU,4BAA6B,CAC5DgH,KAAM7a,KAAK8a,gBAAgBiW,iBAAiBn0B,EAAGyC,UAAS,MACvDyF,MAAM8pE,SACmB5zE,IAAvBgF,KAAKmsE,UAAUvvE,KAChBoD,KAAKmsE,UAAUvvE,GAAI8xE,gBAAkBE,GAG/BA,EAAyDD,OAErE,G,CAEOE,uBAAuBjyE,EAAYE,EAAoC,CAACH,EAAG,6BAA8B4f,EAAQ,IAAK+P,EAAS,GACpI,GAAgB,8BAAbxvB,EAAOH,EAAmC,CAC3C,MAAMohB,EAAO/d,KAAK0c,gBAAgBsB,QAAQphB,GAC1C,IAAGmhB,aAAI,EAAJA,EAAM7gB,SAEN6gB,EAAsB7gB,OAAO4xE,YAC1B/wD,EAAsB7gB,OAAOsiE,UAC7BzhD,EAAsBs3C,aAE1B,OAAO1zD,QAAQC,Q,CAInB,OAAO5B,KAAK4T,WAAW2tB,mBAAmB,2BAA4B,CACpE9kB,QAASzc,KAAK0c,gBAAgBC,gBAAgB/f,GAC9CE,SACAwvB,SACA/P,QACA6kB,KAAM,KACL,CAACI,aAAc,KAAK18B,MAAM1C,IAC3BpC,KAAKod,gBAAgBgL,aAAchmB,EAAmE0W,OAC/F1W,IA2BX,CAEO2sE,sBAAsBnyE,EAAYqC,GACvC,OAAOe,KAAK4T,WAAWke,gBAAgB,0BAA2B,CAChErV,QAASzc,KAAK0c,gBAAgBC,gBAAgB/f,GAC9C8iC,YAAa1/B,KAAK8a,gBAAgBiW,iBAAiB9xB,KAClD6F,MAAMkqE,IACPhvE,KAAKod,gBAAgBgL,aAAa4mD,EAAmBl2D,OAC9Ck2D,EAAmBtvC,cAE9B,CAEOkD,eAAehmC,EAAYu3B,GAChC,MAAMl1B,EAASrC,EAAGyC,UAAS,GAC3B,YAA0BrE,IAAvBgF,KAAKmsE,UAAUvvE,KAAsBu3B,GAAY5lB,KAAK1J,MAAQ7E,KAAKosE,eAAentE,GAC5Ee,KAAKmsE,UAAUvvE,GAGjBoD,KAAK4T,WAAWotB,uBAAuB,CAC5Cl4B,OAAQ,0BACRmL,OAAQ,CACNwI,QAASzc,KAAK0c,gBAAgBC,gBAAgB/f,IAEhDqkC,cAAgB7+B,IACdpC,KAAK0c,gBAAgB2L,aAAajmB,EAAOkmB,OAAO,GAChDtoB,KAAKod,gBAAgBgL,aAAahmB,EAAO0W,OACzC,MAAMm2D,EAAc7sE,EAAOosE,UAmB3B,OAlBGS,GAAeA,EAAYxB,WAAW7wE,KACvCqyE,EAAYxB,WAAaztE,KAAK88C,iBAAiBC,UAAUkyB,EAAYxB,WAAY,CAAC1vE,KAAM,eAAgBkB,YAIvGgwE,EAAYh1C,MACbj6B,KAAK27D,qBAAqBpjB,cAAc02B,EAAYh1C,KAAMr9B,GAG5DoD,KAAKmiB,wBAAwB4I,iBAAiB,CAC5C9rB,SACA6H,SAAUmoE,EAAYjkD,kBAGxBhrB,KAAKmsE,UAAUvvE,GAAMqyE,EACrBjvE,KAAKosE,eAAentE,GAAUsP,KAAK1J,MAAQmnE,GAC3ChsE,KAAKmd,UAAUxW,cAAc,mBAAoB/J,GAE1CqyE,CAAW,EAEpBC,aAAetxE,IACb,GACO,oBADAA,EAAMG,KACX,CACE,MAAM0e,EAAUzc,KAAK0c,gBAAgBsB,QAAQphB,GAC7CoD,KAAKoe,kBAAkBkV,qBAAqB,CAC1C32B,EAAG,UACHssB,QAAS,CAAC,CACRtsB,EAAG,gBACH4C,WAAY3C,IAEd0rB,MAAO,CAAe,qBAAd7L,EAAQ9f,EAA2B8f,EAAU,CACnD9f,EAAG,mBACHC,KACA09B,YAAa7d,EAAQ6d,YACrB7O,MAAOhP,EAAQgP,MACfvuB,OAAQuf,EAAQvf,SAElB4b,MAAO,IAEJ,CAGT,MAAMlb,CAAK,GAGjB,CAEOuxE,YAAY7vE,EAAgB+a,EAAeiI,GAChD,MAAM8sD,EAAkBjyB,IACmB,MAApB9iC,EAAMxe,OAAO,KACjBwe,EAAQA,EAAM5S,MAAM,IAKrC,MAAMtG,EAAQ,IAAI,KAAoB,CACpC1F,YAAY,IAGR4zE,EAAiC,IAAI79D,IAC3C2rC,EAASr+C,SAAS+b,IAChB1Z,EAAMqc,YAAY3C,EAAKje,GAAIoD,KAAKod,gBAAgB8rD,kBAAkBruD,EAAKje,KACvEyyE,EAAUpnE,IAAI4S,EAAKje,GAAIie,EAAKyiC,OAAO,IAGrC,MAAMtlC,EAAUlX,MAAMC,KAAKI,EAAM5G,OAAO8f,IAExC,OADArC,EAAQ6I,MAAK,CAACC,EAAGC,IAAMsuD,EAAU7qE,IAAIuc,GAAKsuD,EAAU7qE,IAAIsc,KACjD9I,CAAO,EAGhB,IAAIrO,EAiBJ,OAfEA,EADC3J,KAAK0c,gBAAgBqJ,UAAUzmB,GACtBU,KAAK6uE,uBAAuBvvE,EAAQ,CAC5C3C,EAAG,8BACH0wC,EAAGhzB,EACH66B,YAAY,EAAA71B,GAAA,GAAmBiD,IAC9B,GAAI,GAAGxd,MAAMwqE,GACPA,EAAGl3B,aAAaj0C,KAAK61B,IAAM,EAAA2F,GAAA,GAAqB3F,OAEjD16B,EACEqC,QAAQM,QAAQjC,KAAK0sE,YAAYptE,IAASwF,MAAM87B,GAC/CA,EAA+BwX,aAAmDA,aAAaj0C,KAAK61B,GAAMA,EAAE56B,QAAQC,eAGrHsC,QAAQM,QAAQ,IAGrBN,QAAQ0Q,IAAI,CAEjBrS,KAAKod,gBAAgB8/B,YAAY,eAAejvC,OAAM,IAAM,KAC5DtE,IACC7E,MAAMK,IACP,MAAMosB,EAAQpsB,EAAQ,GAAGnB,OAAOmB,EAAQ,GAAGhB,KAAKlF,IAAW,CAAErC,GAAIqC,EAAQq+C,OAAQ,OAEjF,OAAO8xB,EAAe79C,EAAM,GAEhC,CAEQo8C,8BAA8B/wE,GACpCoD,KAAK4T,WAAW8nB,WAAW,4BAA6BznB,GAAYA,EAAOwI,QAAsCld,aAAe3C,IAChIoD,KAAK0tE,gBAAgB9wE,EAAGyC,UAAS,GACnC,CAEQquE,gBAAgBzuE,GACtB,GAAGA,EAAOQ,SAAU,CAClB,MAAMN,EAASF,EAAOoxB,kBACfrwB,KAAKksE,UAAU/sE,GACtBa,KAAKmd,UAAUxW,cAAc,mBAAoBxH,E,KAC5C,CACL,MAAMG,EAASL,EAAO2d,kBACf5c,KAAKmsE,UAAU7sE,GACtBU,KAAKmd,UAAUxW,cAAc,mBAAoBrH,E,CAMrD,CAEOiwE,cAAc/vB,EAAqBC,EAAoBjgB,GAC5D,OAAOx/B,KAAK4T,WAAWC,UAAU,wBAAyB,CACxD2rC,aACAC,YACAjgB,UACC16B,MAAMsQ,IAGP,GAFApV,KAAKod,gBAAgBoyD,YAAYp6D,QAEpBpa,IAAVwkC,EAAqB,CACtB,MAAMvgC,EAASmW,EAAKxY,GAAGyC,WACjBq1D,EAAW10D,KAAKksE,UAAU92D,EAAKxY,IAClC83D,IACDA,EAASl1B,MAAQA,GAGnBx/B,KAAKmd,UAAUxW,cAAc,gBAAiB1H,E,CAGhD,OAAOe,KAAK8W,WAAW1B,EAAKxY,IAAI,EAAK,GAEzC,CAEO6yE,mBAAmBtwC,GACxB,OAAOn/B,KAAK4T,WAAWC,UAAU,4BAA6B,CAC5DwrB,KAAMF,IACLr6B,MAAM4qE,IAEP,MAAM92C,EAAQ82C,EAAa92C,MAC3B,IAAI82C,EAAa52D,MAAMrc,OAAQ,CAC7B,MAAMkzE,EAAgB/2C,EAAM03B,MAAM9xD,MAAM6U,GAAoB,sBAAXA,EAAK1W,IACtD+yE,EAAa52D,MAAMxY,KAAK,OAAD,wBAClBN,KAAKod,gBAAgBC,WAAS,CACjCub,MAAO,CACLj8B,EAAG,mBACHo8B,MAAOH,EAAMG,MACb97B,SAAU27B,EAAMh8B,GAChBgzE,eAAgBD,aAAa,EAAbA,EAAe5iE,MAC/B7P,OAAQ,CAAC,K,CAMf8C,KAAKod,gBAAgBgL,aAAasnD,EAAa52D,OAE/C,MAAM3S,EAAOnG,KAAK8a,gBAAgB7b,OAClCe,KAAK88C,iBAAiBC,UAAU2yB,EAAa92C,MAAO,CAClD76B,KAAM,eACNkB,OAAQkH,IAGV,MAAMhH,EAASgH,EAAKkqB,WAQpBrwB,KAAKoe,kBAAkBiX,mBAAmB,CACxC14B,EAAG,aACHyC,QAASD,GACT,GAEN,CAEO0wE,aAAajG,GAClB,OAAO5pE,KAAK4T,WAAWke,gBAAgB,sBAAuB,CAC5Dl1B,GAAIgtE,EAASzlE,KAAK0lE,GAETluB,GADO37C,KAAK88C,iBAAiBsW,SAASyW,QAG9C/kE,MAAMgrE,IAAD,GAGV,CAEQC,gCAAgCrwC,GACtC,MAAMtqB,EAAOpV,KAAKod,gBAAgBwgC,QAAQle,EAAYtgC,SACtD,SAAUgW,IAAQA,EAAK1O,QAA4B,qBAAlB0O,EAAK1O,OAAO/J,EAC/C,CAEQqzE,iCAAiC53B,GACvC,OAAOA,EAAa9qB,QAAO,CAACC,EAAKmS,IACxBnS,IAAOvtB,KAAK+vE,gCAAgCrwC,IAClD,EACL,CAEauwC,WAAWrzE,G,gDAEtB,GAAGoD,KAAK0c,gBAAgBwT,YAAYtzB,GAClC,OAFgB,EAKlB,MAAMszE,QAAiBlwE,KAAK0sE,YAAY9vE,GACxC,GAAGoD,KAAK0c,gBAAgB0gB,YAAYxgC,GAAK,CACvC,GAAIszE,EAAkCj0C,oBAAsB,IAAK,CAC/D,MAAMk0C,QAA4BnwE,KAAK6uE,uBAAuBjyE,EAAI,CAACD,EAAG,6BAA8B,KACpG,OAAOqD,KAAKgwE,iCAAiCG,EAAoB/3B,a,CAGnE,MAAMtgB,QAAY93B,KAAK4T,WAAW2tB,mBAAmB,sBAAuB,CAC1E1mB,KAAM7a,KAAK0c,gBAAgB+gB,oBAAoB7gC,IAC9C,CAAC4kC,aAAc,KAGlB,OAD2B,QAAX,EAAA1J,EAAIs4C,eAAO,QAhBX,C,CAoBlB,MAAMrD,EAAiBmD,EAA+B93B,aACtD,OAAG20B,aAAa,EAAbA,EAAe30B,cACTp4C,KAAKgwE,iCAAiCjD,EAAc30B,cAtB3C,C,IA4BZk0B,cAAcrtE,EAAgBqjB,GACpC,OAAOrjB,GAAUqjB,EAAW,IAAIA,IAAa,GAC/C,CAiGO+tD,eAAepxE,EAAgBqjB,GACpC,OAAOtiB,KAAKusE,cAAcvsE,KAAKssE,cAAcrtE,EAAQqjB,GACvD,ECluBa,SAASguD,GACtBl6D,EACA1R,GAEA,OAAG0R,EAAOkP,MAAMjhB,GAAUA,aAAiB1C,UAClCA,QAAQ0Q,IAAI+D,GAAQtR,KAAKJ,GAEzBA,EAAS0R,EAEpB,C,2SCEA,MAAMm6D,GAAgB,CACpB,cACA,mBACA,mBACA,qBACA,mBACA,mBACA,eAGIC,GAAsC,CAC1CzyE,KAAM,aAGD,MAAM0yE,WAA4B/9D,EAK7BwK,QACRld,KAAKmd,UAAU7W,iBAAiB,mBAAmB,KACjDtG,KAAK0wE,wBAAqB11E,EAC1BgF,KAAK2wE,uBAAuB,IAG9B3wE,KAAK4wE,qBAAuB,IAAIp/D,IAChCxR,KAAK6wE,iBAAmB,IAAIr/D,IAE5BxR,KAAKmd,UAAU7W,iBAAiB,aAAa,KAC3CvE,YAAW,KACTJ,QAAQM,QAAQjC,KAAK2wE,yBAAyB7rE,MAAW4rE,GAAuB,mCAC9E,IAAI,MAAMI,KAAqBJ,QACvB/uE,QAAQ0Q,IAAI,CAChBy+D,EAAkBC,kBAAoB/wE,KAAKi5B,eAAeuZ,cAAc,CAACp6B,MAAO04D,EAAkBC,mBAClGD,EAAkBE,aAAehxE,KAAKi5B,eAAeuZ,cAAc,CAACp6B,MAAO04D,EAAkBE,cAC7FF,EAAkBG,kBAAoBjxE,KAAKi5B,eAAeuZ,cAAc,CAACp6B,MAAO04D,EAAkBG,mBAClGH,EAAkBI,aAAelxE,KAAKi5B,eAAeuZ,cAAc,CAACp6B,MAAO04D,EAAkBI,sBAGzF,EAAAnnE,EAAA,GAAM,IAEhB,KAAE,GACD,KAAM,GAEb,CAEO4mE,wBACL,OAAG3wE,KAAK0wE,mBAA2B1wE,KAAK0wE,mBACjC1wE,KAAK4T,WAAWotB,uBAAuB,CAC5Cl4B,OAAQ,iCACRm4B,cAAgBkwC,KACd,EAAAhpD,GAAA,GAAkEgpD,GAElE,MAAMT,EAAqB1wE,KAAK0wE,mBAAqBS,EAA2BxwC,UAChF,IAAI,MAAMjoB,KAAYg4D,EACpB,IAAI,MAAMrpE,KAAOkpE,GACX73D,EAASrR,KAIbqR,EAASrR,GAAOrH,KAAK03C,eAAezH,QAAQv3B,EAASrR,GAAMmpE,KAI/D,OAAOE,CAAkB,EAE3Bz8D,OAAQ,CACNmtB,KAAM,IAGZ,CAEOgwC,8BACL,OAAO,EAAAjkD,EAAA,GAAYntB,KAAK2wE,yBAA0BD,GACzCA,EAAmB5zE,QAAQg0E,IAAuBA,EAAkB5zE,OAAOm0E,YAEtF,CAEOC,6BAA6BryE,GAClC,MAAMsyE,EAA2BvxE,KAAKoxE,8BACtC,OAAGnyE,EAAOQ,SACDO,KAAKwxE,qBAAqBD,GAI5BjB,GAAe,CAACiB,EADNvxE,KAAK6W,kBAAkB61D,YAAYztE,EAAO2d,YACA5c,KAAKyxE,qBAAqB,EAAEF,EAA0B3wC,EAAU8wC,M,MACzH,MAAMC,EAAqD,QAA5B,EAAA/wC,EAASE,2BAAmB,QAAI,CAACnkC,EAAG,qBAEnE,IAAIi1E,EAAsD,GAS1D,MARgC,qBAA7BD,EAAuBh1E,EACxBi1E,EAAiCL,EACI,sBAA7BI,EAAuBh1E,IAC/Bi1E,EAAiCD,EAAuBhxC,UAAUx8B,KAAKuU,GAC9D64D,EAAyB/yE,MAAMsyE,GAAsBA,EAAkBp4D,WAAcA,EAAoCpb,aAC/HR,OAAOC,UAGLiD,KAAK6xE,0BAA0BD,EAAgCF,EAAc,GAExF,CAEQG,0BAA0BnB,EAAyCgB,GACzE,GAAGA,GAAqC,kBAApBA,EAAc/0E,GAA6C,sBAApB+0E,EAAc/0E,EAA2B,OAAO+zE,EAC3G,MAAMpzE,EAAYo0E,EAAyCp0E,UAAao0E,EAAoCh5D,SACtGo4D,GAAoB,EAAAniD,GAAA,GAAc+hD,GAAqBI,GAAsBA,EAAkBp4D,WAAapb,IAKlH,OAJGwzE,GACDJ,EAAmBxqD,QAAQ4qD,GAGtBJ,CACT,CAEQc,qBACNd,EACAgB,EAAqE1xE,KAAKyxE,oBAE1E,OAAOnB,GAAe,CACpBI,EACAgB,IACC,EAAEhB,EAAoBgB,KAChB1xE,KAAK6xE,0BAA0BnB,EAAoBgB,IAE9D,CAEOI,+BAA+BjwE,G,MACpC,IAAIA,EAAS,MAAO,GACpB,MAAM5C,GAA0B,QAAhB,EAAA4C,EAAQkyB,gBAAQ,eAAE8gC,eAAgB70D,KAAK8a,gBAAgBsiB,YAAYv7B,EAAQ5C,SAAW4C,EAAQsW,WAActW,EAAQ5C,OACpI,OAAOe,KAAKsxE,6BAA6BryE,EAC3C,CAEO8yE,iBAAiBr5D,GACtB,QAAI1Y,KAAK0wE,sBACA1wE,KAAK0wE,mBAAmBlyE,MAAMsyE,GAAsBA,EAAkBp4D,WAAaA,GAC9F,CAEO+4D,mBACL,OAAOnB,GAAe,CACpBtwE,KAAK4T,WAAWid,YAChB7wB,KAAK2wE,0BACJ,EAAEta,EAAQqa,MACX,MAAMh4D,EAAW29C,EAAO2b,kBACxB,MAAmB,mBAAhBt5D,aAAQ,EAARA,EAAU/b,GACJ+zE,EAAmBlyE,MAAMsyE,GAAsBA,EAAkBp4D,WAAaA,EAASpb,WAGzFob,CAAwC,GAEnD,CAEOu5D,kBAAkBv5D,GACvB,OAAO1Y,KAAK0wE,mBAAmBlyE,MAAMsyE,GAAsBA,EAAkBp4D,WAAaA,GAC5F,CAEOw5D,YAAYx5D,GACjB,OAAO,EAAAyU,EAAA,GAAYntB,KAAK2wE,yBAAyB,IACxC3wE,KAAKiyE,kBAAkBv5D,IAElC,CAEOy5D,qBAAqBlzE,EAAgB6oD,GAC1C,OAAO9nD,KAAK4T,WAAWotB,uBAAuB,CAC5Cl4B,OAAQ,gCACRmL,OAAQ,CACNrX,GAAIkrD,EAAK3jD,KAAKwiB,IAAQ,EAAAtH,GAAA,GAAmBsH,KACzC9L,KAAM7a,KAAK8a,gBAAgBiW,iBAAiB9xB,IAE9CgiC,cAAgBhY,IACdjpB,KAAKoe,kBAAkBkV,qBAAqBrK,EAAQ,GAM1D,CAEOm6C,wBAAwBnkE,EAAgB0nB,EAAapK,EAAe7D,EAAqB4T,GAC9F,OAAOtsB,KAAK4T,WAAWotB,uBAAuB,CAC5Cl4B,OAAQ,mCACRmL,OAAQ,CACN4G,KAAM7a,KAAK8a,gBAAgBiW,iBAAiB9xB,GAC5CrC,IAAI,EAAAyiB,GAAA,GAAmBsH,GACvBpK,QACA7D,WACA4T,UAEF2U,cAAgBoiC,IACdrjE,KAAKod,gBAAgBgL,aAAai7C,EAAqBvqD,OAChDuqD,IAGb,CAEO+O,mBAAmB15D,GACxB,OAAO1Y,KAAK4T,WAAWC,UAAU,8BAA+B,CAAC6E,aAAW5T,MAAWT,GAAU,mCAC/F,GAAGA,EAAO,CACR,MAAMs/D,QAAkB3jE,KAAK4T,WAAWid,YACrC8yC,IACDA,EAAUqO,kBAAoBt5D,GAKhC1Y,KAAKmd,UAAUxW,cAAc,iBAAkB+R,E,CAGjD,OAAOrU,CACT,KACF,CAEaguE,aAAaxwE,EAA0B6W,EAAyC3Q,G,kDACzE,sBAAf2Q,EAAS/b,IACV+b,EAAW,CACT/b,EAAG,gBACHW,SAAUob,EAASA,WAIvB,MAAM6D,QAAcvc,KAAK4T,WAAW4I,SAAS,aAEvC81D,EAAqBzwE,EAAQ5C,OAAS,IAAM4C,EAAQ8kB,IAE1D,GADwB3mB,KAAK6wE,iBAAiBrsE,IAAI8tE,GAEhD,OAEAtyE,KAAK6wE,iBAAiB5oE,IAAIqqE,EAAoB/jE,KAAK1J,OACnD9C,YAAW,KACT/B,KAAK6wE,iBAAiBhtE,OAAOyuE,EAAmB,GAC/C,KAGL,MAAM,OAACrzE,EAAM,IAAE0nB,GAAO9kB,EAChBk6D,EAAW/7D,KAAK8a,gBAAgB7b,OAEhCszE,EAAsBhoB,MACxBA,EAAcjwC,aACTiwC,EAAcI,cAElB,EAAAD,GAAA,GAAehyC,EAAsB6xC,EAAc7xC,YACpDA,OAAW1d,GAGTuvD,EAAcjwC,QAChB,EAAAjJ,EAAA,GAAiBsvB,EAAUx7B,QAASolD,GAKnC5pB,EAAUloB,mBACX,EAAAkW,GAAA,GAAcgS,EAAUloB,kBAAmBktC,IAAmB,EAAA+E,GAAA,GAAe/E,EAAejtC,SAAU6xC,EAAc7xC,WAAa1Y,KAAK8a,gBAAgB9b,UAAU2mD,EAAehtC,WAAaojD,IAG1Lp7B,EAAUx7B,QAAQ1I,SACpBkkC,OAAY3lC,E,EAIVw3E,GAAsC,QAAzB,EAAiB,QAAjB,EAAA3wE,EAAQ8+B,iBAAS,eAAEzjC,cAAM,eAAEu1E,gBAAiBzyE,KAAK8a,gBAAgBoV,YAAYruB,EAAQ5C,SAAW4C,EAAQ5C,OAAOQ,SAC9HoC,EAAQ8+B,YACV9+B,EAAQ8+B,UAAY,CAClBhkC,EAAG,mBACHwI,QAAS,GACTsT,iBAAkB+5D,EAAa,QAAKx3E,EACpCkC,OAAQ,CACNu1E,aAAcD,QAAcx3E,KAKlC,IAAI2lC,EAAY54B,EAAYlG,EAAQ8+B,WAAY,EAAA7R,GAAA,GAAKjtB,EAAQ8+B,WAC7D,MAAM+xC,EAAkB/xC,EAAUx7B,QAAQrI,QAAQytD,QAAiDvvD,IAA/BuvD,EAAcI,eAClF+nB,EAAgB7xD,MAAK,CAACC,EAAGC,IAAMA,EAAE4pC,aAAe7pC,EAAE6pC,eAClD,MAAMgoB,EAAkC,GAClCC,EAAoBF,EAAgB3wD,WAAWwoC,IAAkB,EAAAG,GAAA,GAAeH,EAAc7xC,SAAUA,MACpF,IAAvBk6D,GAA0BD,EAAeryE,QAAQoyE,EAAgB5oE,OAAO8oE,EAAmB,IAC9FD,EAAeryE,QAAQoyE,EAAgB5oE,OAAOyS,KAAiC,IAAvBq2D,KACxDD,EAAe7zE,SAASyrD,IACtBmoB,EAAgB5zE,SAAS+zE,IACpBA,EAAoBloB,aAAeJ,EAAcI,gBAChDkoB,EAAoBloB,Y,IAI1B4nB,EAAmBhoB,EAAc,IAGnC,MAAMuoB,EAAwBJ,EAAgBj2E,OAK9C,GAJAi2E,EAAgB5zE,SAAQ,CAACyrD,EAAejmD,KACtCimD,EAAcI,aAAemoB,EAAwB,EAAIxuE,CAAG,IAG3DoU,EAAU,CACPioB,IACFA,EAAsC,CACpChkC,EAAG,mBACHwI,QAAS,GACTjI,OAAQ,CAAC,GAGRs1E,IACD7xC,EAAUzjC,OAAOu1E,cAAe,IAIpC,IAAIM,EAAmBpyC,EAAUx7B,QAAQ4c,WAAWwoC,IAAkB,EAAAG,GAAA,GAAeH,EAAc7xC,SAAUA,KACzG6xC,GAAsC,IAAtBwoB,GAA2BpyC,EAAUx7B,QAAQ4tE,GAmBjE,GAlBIxoB,IACFA,EAAgB,CACd5tD,EAAG,gBACH2d,MAAO,EACP5B,YAGFq6D,EAAmBpyC,EAAUx7B,QAAQ7E,KAAKiqD,GAAiB,KAG3DA,EAAcjwC,MAChBiwC,EAAcI,aAAe+nB,EAAgBj2E,OAASi2E,EAAgB,GAAG/nB,aAAe,EAAI,EAC5F+nB,EAAgBxsD,QAAQqkC,IAEpB5pB,EAAUloB,kBAAoB+5D,IAChC7xC,EAAUloB,iBAAmB,IAG5BkoB,EAAUloB,iBAAkB,CAC7B,MAAMstC,EAAoC,CACxCppD,EAAG,sBACH+b,WACAC,QAAS3Y,KAAK8a,gBAAgB4O,cAAcqyC,GAC5C7+D,OAAQ,CAAC,GAGP8C,KAAK8a,gBAAgBsiB,YAAYn+B,GAInC0hC,EAAUloB,iBAAiByN,QAAQ6/B,GACnCplB,EAAUloB,iBAAmBkoB,EAAUloB,iBAAiBhR,MAAM,EAAG,E,EAOvE,MAAMipE,EAAqB1wE,KAAK0wE,mBAChC,GAAG/vC,IAAa+vC,aAAkB,EAAlBA,EAAoBj0E,QAAQ,CAC1C,MAAMyE,EAAuC,IAAIsQ,IACjDk/D,EAAmB5xE,SAAQ,CAACgyE,EAAmBxsE,KAC7CpD,EAAQ+G,IAAI6oE,EAAkBp4D,SAAUpU,EAAI,IAG9Cq8B,EAAUx7B,QAAQ0b,MAAK,CAACC,EAAGC,K,QACzB,MAAMiyD,EAAOlyD,EAAEpI,SAA0C8+B,aAAgB12B,EAAEpI,SAAoCpb,SACzG21E,EAAOlyD,EAAErI,SAA0C8+B,aAAgBz2B,EAAErI,SAAoCpb,SAC/G,OAAQyjB,EAAEzG,MAAQwG,EAAExG,QAA4B,QAAhB,EAAApZ,EAAQsD,IAAIwuE,UAAI,QAAI,IAAsB,QAAhB,EAAA9xE,EAAQsD,IAAIyuE,UAAI,QAAI,EAAG,G,CAIrF,GAAGlrE,EAGD,OAFAlG,EAAQ8+B,UAAYA,EACpB3gC,KAAKmd,UAAUxW,cAAc,qBAAsB,CAAC,CAAC9E,UAASyoD,eAAgB,MACvE3oD,QAAQM,UAGjBjC,KAAKoe,kBAAkBiX,mBAAmB,CACxC14B,EAAG,yBACHke,KAAMhZ,EAAQ8W,QACdwlC,OAAQt8C,EAAQjF,GAChB+jC,UAAWA,EACX+E,OAAO,IAGT,MAAMwtC,EAAa,CAACj0E,EAAQ0nB,GAAK3pB,KAAK,KAChC09D,GAAQ,EAAAr7C,GAAA,GAAmBsH,GAC3Bhd,EAAU3J,KAAK4T,WAAWC,UAAU,wBAAyB,CACjEgH,KAAM7a,KAAK8a,gBAAgBiW,iBAAiB9xB,GAC5Ck/C,OAAQuc,EACRhiD,SAAUg6D,EAAgBvuE,KAAKomD,GAAkBA,EAAc7xC,aAC9D5T,MAAMmkB,KACP,EAAAd,GAAA,GAA4Bc,GAE5B,MAAMkqD,EAAuBlqD,EAAQA,QAAQlH,WAAWtH,GAAwB,sBAAbA,EAAO9d,GAA0C,6BAAb8d,EAAO9d,IAC9G,IAA6B,IAA1Bw2E,EAA6B,CAC9B,MAAMC,EAAoBnqD,EAAQA,QAAQkqD,GAC1ClqD,EAAQA,QAAQkqD,GAAwB,CACtCx2E,EAAG,yBACHwhD,OAAQuc,EACR7/C,KAAM7a,KAAK8a,gBAAgB4O,cAAczqB,GACzC0hC,UAAYyyC,EAAkBvxE,QAA4B8+B,UAC1Dva,IAAKgtD,EAAkBhtD,IACvB8N,UAAWk/C,EAAkBl/C,U,CAIjCl0B,KAAKoe,kBAAkBkV,qBAAqBrK,EAAQ,IACnDhb,OAAO3E,I,MACQ,qBAAbA,EAAIvL,MAA+BiC,KAAK4wE,qBAAqBpsE,IAAI0uE,KAAgBvpE,GAClF3J,KAAKqyE,aAAaxwE,EAA2B,QAAlB,EAAA6wE,EAAgB,UAAE,eAAEh6D,UAAU,E,IAE1DkwB,SAAQ,KACN5oC,KAAK4wE,qBAAqBpsE,IAAI0uE,KAAgBvpE,GAC/C3J,KAAK4wE,qBAAqB/sE,OAAOqvE,E,IAKrC,OADAlzE,KAAK4wE,qBAAqB3oE,IAAIirE,EAAYvpE,GACnCA,C,gTCjZX,MAWM0pE,GAAuD,CAC3DC,MAAO,+BACPC,iBAAkB,yCAClBC,cAAe,8BACfC,mBAAoB,wCACpBC,iBAAkB,sCAClBC,oBAAqB,yCAGjBC,GAA2C,IAAIx1E,IAAInE,OAAOmc,OAAOi9D,KAWhE,MAAMQ,WAA2BnhE,EAAxC,c,oBACU,KAAAlP,QAAU,IAAI,IAAsE,IAAgB,eA+kBpG,KAAAswE,yBAA4BC,KAClC,EAAA5rD,GAAA,GAAoD4rD,IAEpD,EAAA7rD,GAAA,GAAe6rD,EAAYC,MAAM,CAACC,EAAY3vE,EAAKwG,KAC9CmpE,EAAW/2E,OAAOg3E,SAAWpuE,IAAiBsrC,mBAC/CtmC,EAAIhB,OAAOxF,EAAK,E,IAIbyvE,EAqGX,CA5qBY72D,QACRld,KAAKm0E,sBAAwB,CAAC,EAC9Bn0E,KAAKo0E,+BAAiC,CAAC,EACvCp0E,KAAKq0E,OAAS,CAAC,EACfr0E,KAAKwT,MAAQ,CAAC,EAEdxT,KAAKmd,UAAU7W,iBAAiB,aAAa,KAC3CvE,YAAW,KACT/B,KAAKs0E,4BAA4B,GAEhC,KAECt0E,KAAKu0E,iCAAkEv5E,IAApCgF,KAAKw0E,6BAC1Cx0E,KAAKw0E,2BAA6B5lE,EAAA,cAAe,KAC/C5O,KAAKw0E,gCAA6Bx5E,EAClCgF,KAAKy0E,oBAAmB,EAAK,GAC5B,K,IAIPz0E,KAAKmd,UAAU7W,iBAAiB,cAAc,IAAMtG,KAAK00E,kBAAkB,SAAS,KAEpF10E,KAAKoe,kBAAkBC,2BAA2B,CAChDs2D,oBAAsBl6D,IACpB,MAAMw5D,EAAax5D,EAAOrd,WAC1B4C,KAAK40E,eAAeX,EAAYA,EAAWhsE,IAAIrL,IAC/CoD,KAAKmd,UAAUxW,cAAc,qBAAsBstE,EAAWhsE,IAAI,EAGpE4sE,qBAAsB,IAAM70E,KAAK00E,kBAAkB,UAAU,GAE7DI,oBAAqB,IAAM90E,KAAK00E,kBAAkB,SAAS,GAE3DK,0BAA4Bt6D,IAC1Bza,KAAKmd,UAAUxW,cAAc,eAAgB8T,EAAOrd,WAAW,GAGrE,CAEcs3E,kBAAkB32E,EAA0B8zB,G,0CACxD,MAAMmjD,OAA2B,UAATj3E,EAAmBiC,KAAKi1E,yBAAyBpjD,GAAa7xB,KAAKk1E,0BAA0BrjD,GACrH7xB,KAAKmd,UAAUxW,cAAc,mBAAoB,CAC/C5I,OACAi3E,YAEJ,G,CAEOP,mBAAmBU,GAAc,GActC,OAbGn1E,KAAKw0E,6BACNxvE,aAAahF,KAAKw0E,4BAClBx0E,KAAKw0E,gCAA6Bx5E,GAGhCgF,KAAKu0E,6BACPv0E,KAAKu0E,2BAA6Bv0E,KAAKo1E,sBAAsB,QAAQ,GAAOtwE,MAAM2qC,IAChF,IAAIA,EAAKhzC,OAAQ,KAAM,cACvBuD,KAAKq1E,iBAAmB5lC,EAAKhoC,QAC7BzH,KAAKq1E,iBAAiBx0D,MAAK,CAACC,EAAGC,IAAMJ,KAAK20D,SAAW30D,KAAK20D,UAAS,KAIhEt1E,KAAKu0E,2BAA2BzvE,MAAK,KAC1C,IAAI4qC,EAQJ,OAPIylC,IACFzlC,EAAM1vC,KAAKq1E,iBAAiBnnE,QAC5BlO,KAAKq1E,iBAAiB/0E,KAAKovC,IAG7B1vC,KAAKi5B,eAAeuZ,cAAc,CAACp6B,MAAOpY,KAAKq1E,iBAAiB,KAEzD3lC,CAAG,GAEd,CAEQ6lC,aAAa9lC,IACnB,EAAAvnB,GAAA,GAAeunB,GAAM,CAACC,EAAKprC,MACzBorC,EAAM1vC,KAAK03C,eAAezH,QAAQP,IAG7BD,EAAKnrC,GAAOorC,EADRD,EAAK3lC,OAAOxF,EAAK,EACN,GAExB,CAEQkxE,sBAAsBvtE,EAA2BwtE,G,MACvD,OAAOxtE,IAAoB,QAAb,EAAAA,EAAIwvC,iBAAS,eAAEh7C,UAAY8R,KAAK1J,MAAQoD,EAAIytE,YArI3C,MAqIwED,EACzF,CAEOE,cAAc1tE,EAAwBgM,EAIxC,CAAC,GACJ,IAAI,GAACrX,GAAMqL,EAMX,GALIA,EAAIqyB,cACNryB,EAAMjI,KAAKwT,MAAM5W,IAAOqL,EACxBrL,EAAKqL,EAAIrL,IAGRoD,KAAKm0E,sBAAsBv3E,GAC5B,OAAOoD,KAAKm0E,sBAAsBv3E,GAGpC,IAAIqX,EAAO4d,UAAW,CACpB,MAAM+jD,EAAY51E,KAAKwD,QAAQq4B,aAAaj/B,GAC5C,GAAGoD,KAAKw1E,sBAAsBI,EAAW3hE,EAAOwhE,UAC9C,OAAOG,C,CAIX,MAAMjsE,EAAU3J,KAAKm0E,sBAAsBv3E,GAAM,IAAI+E,SAAcM,GAAY,mCAC7E,IAAIgS,EAAO4d,UAAW,CACpB,MAAM+jD,QAAkB51E,KAAKwD,QAAQgB,IAAI5H,GACzC,GAAGoD,KAAKw1E,sBAAsBI,EAAW3hE,EAAOwhE,UAQ9C,OAPAz1E,KAAKu1E,aAAaK,EAAUn+B,WAC5Bx1C,EAAQ2zE,QAEL51E,KAAKm0E,sBAAsBv3E,KAAQ+M,UAC7B3J,KAAKm0E,sBAAsBv3E,G,CAOxC,IACE,MAAMq3E,QAAmBj0E,KAAK4T,WAAWC,UAAU,yBAA0B,CAC3EzW,WAAY4C,KAAK61E,mBAAmB5tE,GACpCm5B,KAAM,IAGF00C,EAAW7hE,EAAO6hE,SAAWl5E,EAAKq3E,EAAWhsE,IAAIrL,GACvDoD,KAAK40E,eAAeX,EAAY6B,GAEhC7zE,EAAQgyE,E,CACR,MAAM3qE,GACNrH,EAAQ,K,CAGPjC,KAAKm0E,sBAAsBv3E,KAAQ+M,UAC7B3J,KAAKm0E,sBAAsBv3E,EAEtC,MAEA,OAAO+M,CACT,CAEOosE,mBAAmBn5E,GACxB,OAAOoD,KAAK21E,cAAc,CAAC/4E,MAAK,CAACk5E,UAAU,GAC7C,CAEOxB,6BACL,OAAO3yE,QAAQ0Q,IAAI,CACjBrS,KAAK+1E,mBAAmB1C,GAAUC,OAClCtzE,KAAK+1E,mBAAmB1C,GAAUE,kBAClCvzE,KAAK4W,2BACJ9R,MAAK,EAAEuyC,EAAO2+B,MACR,CAAC3+B,QAAO2+B,gBAEnB,CAEOp/D,uBAAuBib,GAC5B,GAAG7xB,KAAKi2E,gCAAkCpkD,EAAW,OAAO7xB,KAAKi2E,8BACjE,MAAMtsE,EAAU3J,KAAKi2E,8BAAgCt0E,QAAQ0Q,IAAI,CAC/DrS,KAAK4T,WAAWgwD,aAAa/xC,GAC7B7xB,KAAK4T,WAAWid,cACf/rB,MAAK,EAAE6+D,EAAWtN,MACnB,GAAGr2D,KAAKi2E,gCAAkCtsE,EAI1C,IAAI,MAAM0tC,KAASssB,EAAUuS,eAAgB,CAC3C,MAAMC,EAAQxS,EAAUuS,eAAe7+B,GACjC++B,EAAWC,KAAqBF,EAAMG,sBChPrCv6E,QAAQ,KAAM,KAAKA,QAAQ,KAAM,MDiPlCgR,EAAQ,IAAI3D,WAAWgtE,EAAS35E,QACtC,IAAI,IAAIkJ,EAAI,EAAGlJ,EAASsQ,EAAMtQ,OAAQkJ,EAAIlJ,IAAUkJ,EAClDoH,EAAMpH,GAAKywE,EAASzwE,GAAG4wE,WAAW,GAQpC,MAAM7mC,EAAM1vC,KAAK03C,eAAezH,QAAQ,CACtCtzC,EAAG,WACHO,OAAQ,CAAC,EACT2wB,MAAO,EACPjxB,GAAIu5E,EAAMv5E,GACV09B,YAAa67C,EAAM77C,YACnB+V,WAAY,CAAC,CACX1zC,EAAG,yBACHw+B,SAAU,EACVj+B,OAAQ,CACNuzC,OAAO,KAGXhtB,KAAM,EACNsV,MAAOs9B,EAAOmgB,QACdrmC,eAAgBpjC,EAChB2jC,UAAW,aAEV,CACD3yC,KAAM,kBAGRiC,KAAKq0E,OAAOh9B,GAAS3H,C,KAQzB,OAAO/lC,CACT,CAEa8sE,kBAAkB5kD,G,0CAe7B,aAZkB7xB,KAAK4T,WAAW6/B,kBAAkB,CAClD3qC,OAAQ,6BACRm4B,cAAgBnJ,KACd,EAAA3P,GAAA,GAA0D2P,GAE1D93B,KAAK02E,eAAiB5+C,EAAIk9C,SAC1Bh1E,KAAKu1E,aAAaz9C,EAAIk9C,UACfl9C,GAETjG,aAIJ,G,CAEOqjD,0BAA0BrjD,GAC/B,GAAGA,EAAW7xB,KAAK02E,oBAAiB17E,OAC/B,GAAGgF,KAAK02E,eAAgB,OAAO12E,KAAK02E,eACzC,OAAO12E,KAAKy2E,kBAAkB5kD,GAAW/sB,MAAK,IAAM9E,KAAK02E,gBAC3D,CAEOC,kBAAkB1/D,EAAc2/D,EAAkBxjD,GACvD,MAAMsc,EAAM1vC,KAAK03C,eAAetF,OAAOn7B,GAGvC,IADA,EAAA0X,GAAA,GAAc3uB,KAAK02E,gBAAiBG,GAASA,EAAKj6E,KAAOqa,KACrD2/D,EAAQ,CACV52E,KAAK02E,eAAexwD,QAAQwpB,GAE5B,MAAMonC,GAAc,EAAAx/B,GAAA,GAAS5H,EAAIqB,iBACjC,IAAI,MAAMzzC,KAAY0C,KAAKo0E,+BACTp0E,KAAKo0E,+BAA+B92E,GAC5CwH,MAAMkwE,IACZ,MAAM6B,GAAO,EAAAloD,GAAA,GAAcqmD,GAAW6B,GAASA,EAAKj6E,KAAO8yC,EAAI9yC,KAC5Di6E,EACD7B,EAAS9uD,QAAQ2wD,GACTv5E,EAAS4xB,SAAS4nD,IAC1B9B,EAAS9uD,QAAQwpB,E,IAYzB,OANA1vC,KAAKmd,UAAUxW,cAAc,kBAAmB,CAAC5I,KAAM,SAAUg5E,OAAQH,EAAQ9vC,SAAU4I,IAExFknC,GACD52E,KAAK00E,kBAAkB,UAAU,GAG5B10E,KAAK4T,WAAWC,UAAU,6BAA8B,CAC7DjX,GAAIwkD,GAAiB1R,GACrBknC,SACAxjD,YAEJ,CAEQ4jD,WAAW3/B,GACjB,OAAOA,EAAMt7C,QAAQ,UAAW,IAAIA,QAAQ,kBAAmB,GACjE,CAEOk7E,wBAAwB5/B,EAAe6/B,GAC5C,MAAMt6E,EAAKs6E,EAAc7D,GAAUE,iBAAmBF,GAAUC,MAC1DW,EAAaj0E,KAAKwD,QAAQq4B,aAAaj/B,GAE7C,KAAIq3E,aAAU,EAAVA,EAAYx8B,WAAW,OAExBy/B,GACE,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAAMhoD,SAASmoB,KAC3DA,EAAQ,MAIZA,EAAQr3C,KAAKg3E,WAAW3/B,GACxB,MAAMjB,EAAO69B,EAAWkD,MAAM34E,MAAMw7B,GAAMA,EAAE18B,WAAa+5C,IACzD,OAAOjB,EAAOp2C,KAAK03C,eAAetF,OAAOgE,EAAKqB,UAAU,SAAMz8C,CAChE,CAEOo8E,8BAA8B//B,GACnC,OAAOr3C,KAAKq0E,OAAOr0E,KAAKg3E,WAAW3/B,GACrC,CAEOggC,4BAA4BhgC,GACjC,MAAMigC,EAAsBt3E,KAAKs0E,6BAA6BxvE,MAAK,IAC1D9E,KAAKi3E,wBAAwB5/B,KAGtC,OAAO11C,QAAQ0Q,IAAI,CACjBilE,EACAt3E,KAAKu3E,qCAAqClgC,KACzCvyC,MAAK,EAAE4qC,EAAK5uB,MACN,CACL4uB,IAAKA,EACL8nC,UAAW12D,aAAC,EAADA,EAAG4uB,IACdymC,MAAOr1D,aAAC,EAADA,EAAGq1D,SAGhB,CAEOoB,qCAAqClgC,GAC1C,OAAOr3C,KAAKs0E,6BAA6BxvE,MAAK,IACrC9E,KAAKi3E,wBAAwB5/B,GAAO,KAC1CvyC,MAAM4qC,IACP,IAAIA,EACF,OAGF,MAAMymC,EAAQn2E,KAAKo3E,8BAA8B//B,GACjD,OAAO11C,QAAQ0Q,IAAI,CACjBrS,KAAKy3E,eAAe/nC,EAAI9yC,IACxBu5E,EAAQn2E,KAAKy3E,eAAetB,EAAMv5E,SAAM5B,IACvC8J,MAAK,KACC,CAAC4qC,MAAKymC,WACb,GAEN,CAEOsB,eAAexgE,EAAcygE,G,MAClC,MAAMhoC,EAAM1vC,KAAK03C,eAAetF,OAAOn7B,GACvC,OAAOjX,KAAKi5B,eAAeuZ,cAAc,CAACp6B,MAAOs3B,EAAKuC,MAAOylC,EAAkC,QAAhB,EAAAhoC,EAAIioC,oBAAY,eAAG,QAAK38E,GACzG,CAEQ45E,eAAe98C,EAAuDl7B,GAC5E,MAAMg7E,EAA6B,CACjCj7E,EAAG,sBACHsL,IAAK6vB,EAAI7vB,IACTkvE,MAAOr/C,EAAIq/C,MACX1/B,UAAW3f,EAAI2f,UACf/B,SAAU5d,EAAI4d,UAGhB,IAAIu+B,EAAaj0E,KAAKwD,QAAQq4B,aAAaj/B,GACxCq3E,EACDh6E,OAAOC,OAAO+5E,EAAY2D,GAE1B3D,EAAaj0E,KAAKwD,QAAQq0E,WAAWj7E,EAAIg7E,GAGxC3D,EAAWhsE,IAAI5K,aAChB2C,KAAKwT,MAAMygE,EAAWhsE,IAAI5K,YAAc2C,KAAK61E,mBAAmB+B,EAAO3vE,MAGzEjI,KAAKu1E,aAAaz9C,EAAI2f,WAGtB,MAAMqgC,EAAW7D,EAAWhsE,IAAI8vE,gBAAkBnE,GAAcl1E,IAAI9B,GACpEq3E,EAAWyB,YAAcnnE,KAAK1J,MAC9B7E,KAAKwD,QAAQyE,IAAI,CAAC,CAACrL,GAAKq3E,IAAc6D,EACxC,CAEOE,kCAAkC/D,G,MACvC,MAAMhiC,EAAQgiC,EAAWhjC,OAAOzyC,MAAMyzC,GAAsB,cAAZA,EAAMt1C,IAChDwL,EAAO8rE,EAAWgE,YAElBC,EAA8B,QAAjB,EAAAjE,EAAW/2E,cAAM,eAAEm0C,SAQtC,MAAO,CAAClpC,OAAM5L,SANwC,CACpDI,EAAG,uBACHS,WAAY4C,KAAK61E,mBAAmB5B,GACpC12E,cAAe02E,EAAW12E,eAGG8V,KAAM4+B,EAAM5+B,KAAM8kE,SAAUD,EAAa,0BAA4B,aACtG,CAqBOrC,mBAAmB5tE,GACxB,OAAG2rE,GAAcl1E,IAAIuJ,EAAIrL,IAChB,CACLD,EAAGsL,EAAIrL,IAEAqL,EAAIqyB,YAMN,CACL39B,EAAG,oBACHC,GAAIqL,EAAIrL,GACR09B,YAAaryB,EAAIqyB,aARZ,CACL39B,EAAG,2BACHU,WAAY,GAAK4K,EAAIrL,GAS3B,CAEaw7E,sB,0CAoBX,aAnBkBp4E,KAAK4T,WAAW6/B,kBAAkB,CAClD3qC,OAAQ,+BACRm4B,cAAgBnJ,KACd,EAAA3P,GAAA,GAA8D2P,IAE9D,EAAA5P,GAAA,GAAe4P,EAAIk8C,MAAM,CAACqE,EAAS/zE,EAAKwG,KACnCutE,EAAQpwE,IAAI/K,OAAOg3E,SAAWpuE,IAAiBsrC,mBAChDtmC,EAAIhB,OAAOxF,EAAK,E,IAIpBwzB,EAAIk8C,KAAKl1E,SAASu5E,IAChBr4E,KAAK40E,eAAe,CAAC3sE,IAAKowE,EAAQpwE,IAAKwvC,UAAW,GAAI0/B,MAAO,GAAIzhC,SAAU,IAAK2iC,EAAQpwE,IAAIrL,GAAG,IAG1Fk7B,MAIAk8C,IACb,G,CAEOsE,0BACL,OAAOt4E,KAAKo1E,sBAAsB,QAAQ,EAC5C,CAEOmD,qBACL,OAAOv4E,KAAKo1E,sBAAsB,QAAQ,EAC5C,CAEOoD,iBAAiB3mD,GACtB,OAAO7xB,KAAK4T,WAAW6/B,kBAAkB,CACvC3qC,OAAQ,4BACRm4B,cAAgBw3C,KACd,EAAAtwD,GAAA,GAAwDswD,GACxDz4E,KAAKu1E,aAAakD,EAAczD,UAChCh1E,KAAKy4E,cAAgBA,EAAczD,SAC5ByD,GAET5mD,aAEJ,CAEOojD,yBAAyBpjD,GAC9B,GAAGA,EAAW7xB,KAAKy4E,mBAAgBz9E,OAC9B,GAAGgF,KAAKy4E,cAAe,OAAOz4E,KAAKy4E,cACxC,OAAOz4E,KAAKw4E,iBAAiB3mD,GAAW/sB,MAAK,IAAM9E,KAAKy4E,eAC1D,CAEOC,wBACL,OAAO14E,KAAK4T,WAAW4I,SAAS,gBAClC,CAEam8D,YAAY1hE,EAAc2hE,G,0CACjC54E,KAAKy4E,sBACDz4E,KAAKi1E,4BAGb,MAAM14D,QAAcvc,KAAK04E,wBAEnBhpC,EAAM1vC,KAAK03C,eAAetF,OAAOn7B,GAUvC,OATA,EAAA0X,GAAA,GAAc3uB,KAAKy4E,eAAgB5B,GAASA,EAAKj6E,KAAO8yC,EAAI9yC,KAExDg8E,IACF54E,KAAKy4E,cAAcvyD,QAAQwpB,GACX1vC,KAAKy4E,cAAc3uE,OAAOyS,EAAOvc,KAAKy4E,cAAch8E,OAAS8f,IAG/Evc,KAAKmd,UAAUxW,cAAc,kBAAmB,CAAC5I,KAAM,QAASg5E,OAAQ6B,EAAQ9xC,SAAU4I,IAEnF1vC,KAAK4T,WAAWC,UAAU,uBAAwB,CACvDjX,GAAIwkD,GAAiB1R,GACrBkpC,WACC9zE,MAAK,KACH8zE,GACD54E,KAAK00E,kBAAkB,SAAS,E,GAGtC,G,CAEamE,iBAAiB5wE,G,0CAG5B,IAFAA,EAAMjI,KAAKwD,QAAQq4B,aAAa5zB,EAAIrL,IAAIqL,KAEjC8vE,gBAKL,SAJkB/3E,KAAK4T,WAAWC,UAAU,+BAAgC,CAC1EzW,WAAY4C,KAAK61E,mBAAmB5tE,KAOpC,cAHOA,EAAI8vE,eACX/3E,KAAKmd,UAAUxW,cAAc,mBAAoBsB,GACjDjI,KAAKwD,QAAQK,OAAOoE,EAAIrL,IAAI,IACrB,OAQT,SALkBoD,KAAK4T,WAAWC,UAAU,6BAA8B,CACxEzW,WAAY4C,KAAK61E,mBAAmB5tE,GACpC6wE,UAAU,IAMV,OAFA7wE,EAAI8vE,eAAiBxpE,KAAK1J,MAAQ,IAAO,EACzC7E,KAAKmd,UAAUxW,cAAc,qBAAsBsB,IAC5C,EAIX,OAAO,CACT,G,CAEO8wE,kBAAkB/E,GACvB,OAAOryE,QAAQ0Q,IAAI2hE,EAAK7vE,KAAK8D,GAAQjI,KAAK64E,iBAAiB5wE,KAC7D,CAEa+wE,kBAAkB3+D,EAAe4+D,GAAkB,G,0CAC9D,MAAMprD,EAAQorD,EAAkB,EAAI,EAC9BnhD,QAAY93B,KAAK4T,WAAW6/B,kBAAkB,CAClD3qC,OAAQ,6BACRmL,OAAQ,CACN4Z,QACAqrD,iBAAkBD,QAAmBj+E,EACrCqyC,EAAGhzB,GAEL4mB,cAAgBnJ,KACd,EAAA3P,GAAA,GAA8D2P,IAE9D,EAAA5P,GAAA,GAAe4P,EAAIk8C,MAAM,CAACqE,EAAS/zE,EAAKwG,KACnCutE,EAAQpwE,IAAI/K,OAAOg3E,SAAWpuE,IAAiBsrC,mBAChDtmC,EAAIhB,OAAOxF,EAAK,E,IAIpBwzB,EAAIk8C,KAAKl1E,SAASu5E,IAChBr4E,KAAK40E,eAAe,CAAC3sE,IAAKowE,EAAQpwE,IAAKwvC,UAAW,GAAI0/B,MAAO,GAAIzhC,SAAU,IAAK2iC,EAAQpwE,IAAIrL,GAAG,IAG1Fk7B,KAILqhD,EAAkC,GAClCrwD,EAAQ9oB,KAAKwD,QAAQqb,WAC3B,IAAI,MAAMjiB,KAAMksB,EAAO,CACrB,MAAM,IAAC7gB,GAAO6gB,EAAMlsB,GAEjBqL,EAAIwjB,MAAMjxB,cAAc00B,SAAS7U,EAAM7f,iBAAmBs9B,EAAIk8C,KAAKx1E,MAAM+X,GAAMA,EAAEtO,IAAIrL,KAAOqL,EAAIrL,MACjGu8E,EAAW74E,KAAK,CAAC3D,EAAG,oBAAqBsL,MAAKmxE,MAAO,M,CAIzD,OAAOthD,EAAIk8C,KAAKhwE,OAAOm1E,EACzB,G,CAcOE,iBACL,OAAOr5E,KAAK4T,WAAW6/B,kBAAkB,CACvC3qC,OAAQ,0BACRm4B,cAAejhC,KAAK8zE,0BAExB,CAEO77B,mBACL,OAAOj4C,KAAK4T,WAAW6/B,kBAAkB,CACvC3qC,OAAQ,4BACRm4B,cAAejhC,KAAK8zE,0BAExB,CAEOwF,qBACL,OAAOt5E,KAAKq5E,iBAAiBv0E,MAAMivE,GAC1BpyE,QAAQ0Q,IAAK0hE,EAAwDC,KAAK7vE,KAAK8D,GAAQjI,KAAK21E,cAAc1tE,EAAK,CAACwtE,UAAU,QAErI,CAGOL,sBAAsB93E,EAAkBi8E,GAAqB,GAElE,OADAj8E,GAAW,EAAAg6C,GAAA,GAASh6C,GACjB0C,KAAKo0E,+BAA+B92E,GAAkB0C,KAAKo0E,+BAA+B92E,GAEtF0C,KAAKo0E,+BAA+B92E,GAAYqE,QAAQ0Q,IAAI,CACjErS,KAAK4T,WAAW6/B,kBAAkB,CAChC3qC,OAAQ,uBACRmL,OAAQ,CACN3W,YAEF2jC,cAAgB+zC,GAAaA,IAE/BuE,EAAqBv5E,KAAKs5E,qBAAuB,GACjDC,EAAqBv5E,KAAKy2E,yBAAsBz7E,IAC/C8J,MAAK,EAAE00E,EAAkBC,EAAe/C,MACzC,MAAMgD,EAAiBF,EAAuDxE,SAAS7wE,KAAKgtC,GAAYnxC,KAAK03C,eAAezH,QAAQkB,KAC9HwoC,EAA8C,GAAIC,EAA4C,GAI9FC,EAAgB1C,IACpB,IAAI,MAAM/gC,KAAQ+gC,EAEhB,IADqB,EAAA7/B,GAAA,GAASlB,EAAK94C,UACnB4xB,SAAS5xB,GACvB,IAAI,MAAM2Z,KAASm/B,EAAKqB,UAAW,CACjC,MAAM/H,EAAM1vC,KAAK03C,eAAetF,OAAOn7B,IACtCy4B,EAAI2B,SAAWsoC,EAAyBC,GAAsBt5E,KAAKovC,E,GAM5E,GAAGgnC,EAAgB,CACjBmD,EAAanD,EAAeS,OAC5B,MAAMnC,EAAW0B,EAAe1B,SAChC,CAAC2E,EAAwBC,GAAsB96E,SAAS44D,IACtDA,EAAE72C,MAAK,CAACC,EAAGC,IAAMi0D,EAASv6E,QAAQqmB,GAAKk0D,EAASv6E,QAAQsmB,IAAG,G,CAI/D,IAAI,MAAM9Y,KAAOwxE,EACfI,EAAa5xE,EAAIkvE,OAenB,MAAMnC,EAAW,IAAI,IAAI52E,IAAIu7E,EAAuB31E,OAAO41E,EAAsBF,KASjF,OAPA,EAAAxxD,GAAA,GAAe8sD,GAAU,CAAC7jC,EAAS7sC,EAAKwG,MACd,IAApBqmC,EAAQA,UAAkBrrC,IAAiBsrC,oBAC3CpxC,KAAKmd,UAAU9W,UAAW,EAAA0wD,GAAA,GAAsB5lB,KAClDrmC,EAAIhB,OAAOxF,EAAK,E,IAIb0wE,CAAQ,GAEnB,CAEO8E,sBAML,OALG95E,KAAK02E,iBACN12E,KAAK02E,eAAej6E,OAAS,EAC7BuD,KAAK00E,kBAAkB,UAAU,IAG5B10E,KAAK4T,WAAWC,UAAU,+BACnC,E,yBEhtBK,MAAMkmE,WAAwBrnE,EAArC,c,oBA4JS,KAAA7T,MAAQ,CAAC0M,GAAO,KACrB,GAAIA,EAcFvL,KAAK8Y,MAAQ,CAAC,EACd9Y,KAAKg6E,UAAY,CAAC,OAdlB,IAAI,MAAM76E,KAAUa,KAAK8Y,MAAO,CAE9B,IAAI3Z,EAAQ,SACZ,MAAMF,EAASE,EAAOE,WACtB,IAAIW,KAAK8mB,aAAawU,aAAar8B,GAAS,CAC1C,MAAMmW,EAAOpV,KAAK8Y,MAAM3Z,GACxBa,KAAKu7B,qBAAqBnmB,GAAM,GAEhCpV,KAAKwD,QAAQK,OAAO1E,UACba,KAAK8Y,MAAM3Z,E,EAQxBa,KAAKi6E,oBAAsB,CAAC,EAC5Bj6E,KAAKk6E,cAAgBl6E,KAAKm6E,oBAC1Bn6E,KAAKo6E,yBAAsBp/E,EAC3BgF,KAAKq6E,aAAe,IAAIj8E,IACxB4B,KAAKs6E,qBAAsB,CAAK,EAugB1B,KAAAC,oBAAsB,KAC5B,MAAMC,GAAe,EAAA92D,GAAA,IAAM,GAC3B,IAAI,MAAM/d,KAAK3F,KAAK8Y,MAAO,CACzB,MAAM1D,EAAOpV,KAAK8Y,MAAMnT,GACxB3F,KAAKy6E,iBAAiBrlE,EAAMolE,E,EAiUlC,CAn/BYt9D,QA8ER,OA7EAld,KAAKnB,OAAM,GAEX67E,YAAY16E,KAAKu6E,oBAAqB,KAEtCv6E,KAAKmd,UAAU7W,iBAAiB,qBAAsBtG,KAAKu6E,qBAE3Dv6E,KAAKoe,kBAAkBC,2BAA2B,CAChDo8D,iBAAmBhgE,IACjB,MAAMtb,EAASsb,EAAOrb,QAChBgW,EAAOpV,KAAK8Y,MAAM3Z,GACrBiW,IACDA,EAAK1O,OAAS+T,EAAO/T,OAClB0O,EAAK1O,SACH,YAAa0O,EAAK1O,SACnB0O,EAAK1O,OAAOi0E,SAAW36E,KAAK2jB,YAAYC,uBAGvC,eAAgBxO,EAAK1O,SACtB0O,EAAK1O,OAAOk0E,YAAc56E,KAAK2jB,YAAYC,wBAK/C5jB,KAAKmd,UAAUxW,cAAc,cAAexH,GAC5Ca,KAAK66E,uBAAuBzlE,G,EA2BhC0lE,eAAiBrgE,IACf,MAAMtb,EAASsb,EAAOrb,QAChBgW,EAAOpV,KAAK8Y,MAAM3Z,GACrBiW,IACDpV,KAAKolD,gBAAgBjmD,GAErBa,KAAKwvE,YAAY,OAAD,wBACXp6D,GAAI,CACPoqC,WAAY/kC,EAAO+kC,WACnBC,UAAWhlC,EAAOglC,UAClB1gB,cAAU/jC,EACVg/E,UAAWv/D,EAAOu/D,aACjB,G,IASTh6E,KAAKmd,UAAU7W,iBAAiB,mBAAoB/D,IAClD,MAAMpD,EAASa,KAAKqd,UAAUzgB,GAC9BoD,KAAKk6E,cAAc18D,YAAYre,EAAQa,KAAKkpE,kBAAkB/pE,GAAQ,IAGjEwC,QAAQ0Q,IAAI,CACjBrS,KAAK2e,gBAAgBxX,WACrBnH,KAAK4e,mBAAmBlL,YAAY,WACnC5O,MAAK,EAAEmC,GAAQ9B,QAAS2T,EAAOtV,eAChCxD,KAAKwD,QAAUA,EAEfxD,KAAKooB,aAAatP,GAClB,IAAI,IAAInT,EAAI,EAAGlJ,EAASqc,EAAMrc,OAAQkJ,EAAIlJ,IAAUkJ,EAAG,CACrD,MAAMyP,EAAO0D,EAAMnT,GACfyP,GAIDnO,EAAM8zE,yBAA2B3lE,EAAKlY,OAAO89E,SAAW5lE,EAAKlY,OAAO+9E,kBACrEj7E,KAAKk7E,YAAY9lE,EAAKxY,IAElBoD,KAAKo6E,sBACPp6E,KAAKo6E,qBAAsB,SAC3Bp6E,KAAKo6E,oBAAoBn4E,QAAQjC,KAAKq6E,e,CAiB5C,MAAMc,EAAel0E,EAAMk0E,cAAgB,GAC3C,IAAI,IAAIx1E,EAAI,EAAGlJ,EAAS0+E,EAAa1+E,OAAQkJ,EAAIlJ,IAAUkJ,EACzD3F,KAAK8mB,aAAaK,YAAYg0D,EAAax1E,GAAI,gBAGjD3F,KAAK8mB,aAAaxgB,iBAAiB,cAAerH,IAChD,IAAIe,KAAK8a,gBAAgBrb,OAAOR,GAC9B,OAGF,MAAME,EAASF,EAAOoxB,WAClBrwB,KAAKwD,QAAQq4B,aAAa18B,IAC5Ba,KAAKwD,QAAQyE,IAAI,CACf,CAAC9I,GAASa,KAAK49C,QAAQz+C,I,IAK7Ba,KAAK8mB,aAAaxgB,iBAAiB,gBAAiBrH,IAClD,IAAIe,KAAK8a,gBAAgBrb,OAAOR,GAC9B,OAGF,MAAME,EAASF,EAAOoxB,WACnBrwB,KAAKwD,QAAQq4B,aAAa18B,IAC3Ba,KAAKwD,QAAQK,OAAO1E,E,GAEtB,GAEN,CA4BWA,aACT,OAAOa,KAAKmd,UAAUhX,KAAKkqB,UAC7B,CAEQ+qD,mBAAmBC,GAItBA,GACDr7E,KAAK2e,gBAAgB9W,YAAY,0BAA0B,EAAA6b,GAAA,IAAM,GAErE,CAEO43D,iBAAiBr8E,GACtB,OAAOe,KAAK2e,gBAAgBxX,WAAWrC,MAAMmC,IAC3C,MAAMk0E,EAAel0E,EAAMk0E,cAAgB,GAC3C,GAAGA,EAAa,KAAOl8E,EAAQ,EAC7B,EAAAoS,EAAA,GAAiB8pE,EAAcl8E,GAC/Bk8E,EAAaj1D,QAAQjnB,GAClBk8E,EAAa1+E,OAAS,KACvB0+E,EAAa1+E,OAAS,IAGxBuD,KAAK2e,gBAAgB9W,YAAY,eAAgBszE,GACjD,IAAI,MAAMl8E,KAAUk8E,EAClBn7E,KAAK8mB,aAAaK,YAAYloB,EAAQ,e,IAI9C,CAEOs8E,oBACL,OAAOv7E,KAAK2e,gBAAgBxX,WAAWrC,MAAMmC,IAC3C,MAAMk0E,EAAel0E,EAAMk0E,cAAgB,GAC3C,IAAI,MAAMl8E,KAAUk8E,EAClBn7E,KAAK8mB,aAAagB,YAAY7oB,EAAQ,gBAGxCk8E,EAAa1+E,OAAS,EACtBuD,KAAK2e,gBAAgB9W,YAAY,eAAgBszE,EAAa,GAElE,CAEOrvD,e,MACL,GAAG9rB,KAAKo6E,qBAAuBp6E,KAAKs6E,oBAClC,MAAO,CACLvuD,OAAQ/rB,KAAKo6E,oBAAoBnoE,YACjCtI,QAAS3J,KAAKo6E,qBAIlBp6E,KAAKs6E,qBAAsB,EAE3B,MAAM3wE,GAAU,SAqBhB,OApBA3J,KAAK4T,WAAWC,UAAU,wBAAwB/O,MAAM1C,IACtC,sBAAbA,EAAOzF,IACRqD,KAAKq6E,aAAax7E,QAElBmB,KAAKooB,aAAahmB,EAAO0W,OAEzB1W,EAAOsuB,SAAS5xB,SAASk8E,IACvBh7E,KAAKk7E,YAAYF,EAAQ57E,QAAQ,IAGnCY,KAAKo7E,oBAAmB,GAExBp7E,KAAKo6E,oBAAsBzwE,GAG7BA,EAAQ1H,QAAQjC,KAAKq6E,aAAa,IACjC,KACDr6E,KAAKs6E,qBAAsB,CAAK,IAG3B,CACLvuD,OAAgC,QAAxB,EAAA/rB,KAAKo6E,2BAAmB,eAAEnoE,YAClCtI,QAAS3J,KAAKo6E,sBAALp6E,KAAKo6E,oBAAwBzwE,GAE1C,CAEO6xE,gBAAgBz8C,GACF,MAAhBA,EAAS,KACVA,EAAWA,EAASt3B,MAAM,IAG5Bs3B,EAAWA,EAASvkC,cACpB,MAAMyE,EAASe,KAAKg6E,UAAUj7C,GAC9B,OAAG9/B,EACMe,KAAK8a,gBAAgBw4C,QAAQr0D,GAG/Be,KAAK4T,WAAWotB,uBAAuB,CAC5Cl4B,OAAQ,2BACRmL,OAAQ,CAAC8qB,YACTkC,cAAgBw6C,GAAiBz7E,KAAK07E,oBAAoBD,IAE9D,CAEQC,oBAAoBD,GAI1B,OAHAz7E,KAAKooB,aAAaqzD,EAAa3iE,OAC/B9Y,KAAK0c,gBAAgB2L,aAAaozD,EAAanzD,OAExCtoB,KAAK8a,gBAAgBw4C,SAAQ,EAAAt0D,GAAA,GAAUy8E,EAAa5gE,MAC7D,CAEO8gE,aAAaryB,GAClB,OAAOtpD,KAAK4T,WAAWC,UAAU,wBAAyB,CAACy1C,UAAQxkD,MAAM22E,GAChEz7E,KAAK07E,oBAAoBD,IAEpC,CAEQP,YAAYt+E,GAClBoD,KAAKq6E,aAAat7E,IAAInC,GACtBoD,KAAKk6E,cAAc18D,YAAY5gB,EAAIoD,KAAKkpE,kBAAkBtsE,IAC1DoD,KAAK8mB,aAAaK,YAAYvqB,EAAGyC,WAAY,UAC/C,CAEQu8E,WAAWh/E,GACjBoD,KAAKq6E,aAAax2E,OAAOjH,GACzBoD,KAAKk6E,cAAc18D,YAAY5gB,EAAI,IACnCoD,KAAK8mB,aAAagB,YAAYlrB,EAAGyC,WAAY,UAC/C,CAEO6pE,kBAAkBtsE,GACvB,MAAMwY,EAAOpV,KAAK8Y,MAAMlc,GACxB,OAAIwY,EAIkB,CACpBA,EAAKoqC,WACLpqC,EAAKqqC,UACLrqC,EAAKk0C,UACF,EAAAR,GAAA,GAAuB1zC,GAE1BA,EAAKlY,OAAOrD,KAAO,iBAAmB,IAG7BiD,OAAOC,SAASC,KAAK,KAZvB,EAaX,CAEO6+E,YAAYxhE,EAAgByhE,GAAe,EAAOC,EAAqC,QAC5F,OAAO/7E,KAAK8rB,eAAeniB,QAAQ7E,MAAMk3E,IACvC,IAAI3B,EAAe,IAAI2B,GACvB,GAAG3hE,EAAO,CACR,MAAMlV,EAAUnF,KAAKk6E,cAAc3/E,OAAO8f,GAG1CggE,EAF6B,IAAIA,GAAcv9E,QAAQF,GAAOuI,EAAQzG,IAAI9B,I,CAK9D,SAAXm/E,EACD1B,EAAax5D,MAAK,CAACo7D,EAASC,KAC1B,MAAMC,GAAan8E,KAAK8Y,MAAMmjE,IAAY,CAAC,GAAGG,UAAY,GACpDC,GAAar8E,KAAK8Y,MAAMojE,IAAY,CAAC,GAAGE,UAAY,GAC1D,OAAOD,EAAUG,cAAcD,EAAU,IAExB,WAAXN,GACR1B,EAAax5D,MAAK,CAACo7D,EAASC,KAC1B,MAAMK,EAAUv8E,KAAKw8E,qBAAqBx8E,KAAK49C,QAAQq+B,GAASv1E,QAEhE,OADgB1G,KAAKw8E,qBAAqBx8E,KAAK49C,QAAQs+B,GAASx1E,QAC/C61E,CAAO,IAI5B,MAAME,EAAWz8E,KAAKb,OAQtB,OAPA,EAAAkS,EAAA,GAAiBgpE,EAAcoC,GAC5BX,GACE97E,KAAK08E,eAAeriE,IACrBggE,EAAan0D,QAAQu2D,GAIlBpC,CAAY,GAEvB,CAEOsC,mBACLtiE,EACAyhE,EACAC,EACAx/D,GAEA,OAAOvc,KAAK67E,YAAYxhE,EAAOyhE,EAAcC,GAAQj3E,MAAM+T,IACzD,MAAMb,EAAUa,EAAQ1U,KAAKhF,GAAWA,EAAOE,UAAS,KACxD,OAAGkd,EACMvE,EAAQvQ,MAAM,EAAG8U,GAGnBvE,CAAO,GAElB,CAEO4kE,YAAY39E,EAAgB49E,GACjC,OAAO78E,KAAK4T,WAAWke,gBAAgB+qD,EAAQ,iBAAmB,mBAAoB,CACpFjgF,GAAIoD,KAAK8a,gBAAgBiW,iBAAiB9xB,KACzC6F,MAAMT,IACJA,GACDrE,KAAKoe,kBAAkBiX,mBAAmB,CACxC14B,EAAG,oBACHgc,QAAS3Y,KAAK8a,gBAAgB4O,cAAczqB,GAC5C2tE,QAASiQ,IAINx4E,IAEX,CAEOq4E,eAAeriE,GACpB,MAAMjF,EAAOpV,KAAKqd,UACZlc,EAAQnB,KAAKm6E,oBAEnB,OADAh5E,EAAMqc,YAAYpI,EAAKxY,GAAIoD,KAAKkpE,kBAAkB9zD,EAAKxY,KAChDuE,EAAM5G,OAAO8f,GAAO3b,IAAI0W,EAAKxY,GACtC,CAEQu9E,oBACN,OAAO,IAAI,KAAoB,CAC7B3+E,eAAe,EACfC,YAAY,EACZH,UAAU,EACVM,YAAY,GAEhB,CAEOwsB,aAAa00D,EAAoB3oD,GAClC2oD,EAAiBpkD,QACpBokD,EAAiBpkD,OAAQ,EAC1BokD,EAASh+E,SAASsW,GAASpV,KAAKwvE,YAAYp6D,EAAM+e,KACpD,CAEOoH,qBAAqB1gB,EAAoDzW,GAC9E,MAAM41E,GAAY,EAAAlxB,GAAA,GAAuBjuC,GACzC,IAAIm/D,EAAUv9E,OACZ,OAGF,MAAMsgF,EAAmB/C,EAAU71E,KAAK46B,GC3b7B,SAAuBA,GACpC,OAAOA,GAAYA,EAASvkC,eAAiB,EAC/C,CDybyDwiF,CAAcj+C,KAChE36B,EACD24E,EAAiBj+E,SAASm+E,IACxBj9E,KAAKg6E,UAAUiD,GAAkBpiE,EAAKje,GAAGyC,SAAoB,SAAXwb,EAAKle,EAAa,IAGtEogF,EAAiBj+E,SAASm+E,WACjBj9E,KAAKg6E,UAAUiD,EAAe,GAG3C,CAEO9gD,mBAAmBthB,EAAoDqiE,GAC5E,QACGA,GACAA,EAAwBn+C,WAAclkB,EAAqBkkB,WAC3D,EAAA9oB,EAAA,GAAWinE,EAAwBlD,UAAYn/D,EAAqBm/D,aAErEh6E,KAAKu7B,qBAAqB2hD,GAAS,GACnCl9E,KAAKu7B,qBAAqB1gB,GAAM,GAEzB,GAIX,CAEO20D,YAAYp6D,EAAc+e,G,YAC/B,IAAI/e,GAAmB,cAAXA,EAAKzY,EAAmB,OAEpC,MAAMwC,EAASiW,EAAKxY,GACdugF,EAAUn9E,KAAK8Y,MAAM3Z,GAU3B,GAFW,QAAX,EAAAiW,EAAKlY,cAAM,QAAXkY,EAAKlY,OAAW,CAAC,GAEdkY,EAAKlY,OAAO0jB,UAAmB5lB,IAAZmiF,EACpB,OAMF,MAAMjhD,EAAkBl8B,KAAKm8B,mBAAmB/mB,EAAM+nE,GAEtD,GAAIA,QACmBniF,IAArBmiF,EAAQf,UACRe,EAAQ39B,aAAepqC,EAAKoqC,YAC5B29B,EAAQ19B,YAAcrqC,EAAKqqC,UAK3BrqC,EAAKgnE,SAAWe,EAAQf,aALc,CACtC,MAAMgB,EAAWhoE,EAAKoqC,YAAcpqC,EAAKqqC,UAAY,IAAMrqC,EAAKqqC,UAAY,IAE5ErqC,EAAKgnE,SAAWhnE,EAAKlY,OAAOysB,QAAU,IAAK,EAAAvuB,GAAA,IAAgBgiF,GAAU,E,CAyBvE,GApBGhoE,EAAK1O,SACF0O,EAAK1O,OAAuCi0E,UAC7CvlE,EAAK1O,OAAuCi0E,SAAW36E,KAAK2jB,YAAYC,uBAGvExO,EAAK1O,OAAwCk0E,aAC9CxlE,EAAK1O,OAAwCk0E,YAAc56E,KAAK2jB,YAAYC,wBAIlD,2BAAR,QAApB,EAACxO,EAAcwjB,aAAK,eAAEj8B,WACfyY,EAAcwjB,WAST59B,IAAZmiF,EACDn9E,KAAK8Y,MAAM3Z,GAAUiW,MAChB,CACL,MAAMqnB,EAAernB,EAAKoqC,aAAe29B,EAAQ39B,YAC/CpqC,EAAKqqC,YAAc09B,EAAQ19B,WAC3BvjB,EAIIM,GAFiE,QAAnD,EAAA2gD,EAAQvkD,aAA2C,eAAE37B,aACL,QAAhD,EAAAmY,EAAKwjB,aAA2C,eAAE37B,UAGhEy/B,EAAkBygD,EAAQjgF,OAAOmJ,UAAY+O,EAAKlY,OAAOmJ,SAC7D82E,EAAQjgF,OAAOy/B,WAAavnB,EAAKlY,OAAOy/B,UACxCwgD,EAAQjgF,OAAO0/B,OAASxnB,EAAKlY,OAAO0/B,MACpCugD,EAAQjgF,OAAO2/B,OAASznB,EAAKlY,OAAO2/B,KAMhCwgD,IAAeF,EAAQjgF,OAAO89E,QAC9BsC,IAAeloE,EAAKlY,OAAO89E,QAEjCpjE,GAAkBulE,EAAS/nE,GAC3BpV,KAAKmd,UAAUxW,cAAc,cAAexH,GAEzCk+E,IAAeC,GAChBt9E,KAAKu9E,iBAAiBp+E,EAAQm+E,EAAYD,GAGzC7gD,GACDx8B,KAAKmd,UAAUxW,cAAc,gBAAiB,CAAC1H,OAAQmW,EAAKxY,GAAGyC,cAG9Do9B,GAAgBC,IACjB18B,KAAKmd,UAAUxW,cAAc,kBAAmB,CAAC1H,OAAQmW,EAAKxY,GAAGyC,Y,CAIrEW,KAAKw9E,aAAapoE,EAAM+nE,GACxBn9E,KAAK66E,uBAAuBzlE,EAC9B,CAEQooE,aAAapoE,EAAY+nE,GAC/B,GAAG/nE,EAAKlY,OAAOrD,KAAM,CACnB,MAAM2M,IAAc4O,EAAKlY,OAAOmJ,QAC7BrG,KAAKmd,UAAU9W,UAAYG,GAC5BxG,KAAKmd,UAAUxW,cAAc,yBAA0B,CAACJ,OAAQ42E,EAAS32E,a,CAG/E,CAEQq0E,uBAAuBzlE,GAC1BpV,KAAK8mB,aAAawU,aAAalmB,EAAKxY,GAAGyC,aACxCW,KAAKwD,QAAQyE,IAAI,CACf,CAACmN,EAAKxY,IAAKwY,GAGjB,CAEOqoE,oBAAoB7gF,GACzB,OAAOoD,KAAKw8E,qBAAqB5/E,GAAM,CACzC,CAEO4/E,qBAAqB91E,GAC1B,GAAsB,iBAAb,EAAuB,CAC9B,MAAM0O,EAAOpV,KAAK49C,QAAQl3C,GAC1BA,EAAS0O,aAAI,EAAJA,EAAM1O,M,CAGjB,GAAGA,EAAQ,CACT,MAAMi0E,EAAuB,qBAAbj0E,EAAO/J,EAA2B+J,EAAOi0E,QAAwB,sBAAbj0E,EAAO/J,EAA4B+J,EAAOk0E,WAAa,EAC3H,GAAGD,EACD,OAAOA,EAYT,OAAOj0E,EAAO/J,GACZ,IAAK,qBACH,OAAO,EACT,IAAK,qBACH,OAAO,EACT,IAAK,sBACH,OAAO,E,CAIb,OAAO,CACT,CAEOihD,QAAQhhD,GACb,OAAG,EAAA4mB,GAAA,GAAe5mB,GACTA,EAGFoD,KAAK8Y,MAAMlc,EACpB,CAEO8gF,cAAc9gF,GACnB,OAAOoD,KAAK29E,cAAc/gF,KAAQoD,KAAK8Y,MAAMlc,GAAIM,OAAOrD,MAAQmG,KAAK8Y,MAAMlc,GAAI8J,MACjF,CAEak3E,aAAahhF,G,qCACxB,MAAMwY,EAAOpV,KAAK49C,QAAQhhD,GAC1B,KAAIwY,aAAI,EAAJA,EAAMk0C,OACR,OAGF,MAAMqa,QAAkB3jE,KAAK4T,WAAWgwD,eACxC,MAAO,CACLta,MAAOl0C,EAAKk0C,MACZu0B,YAAala,EAAUma,kBAAkBx4D,MAAMme,GAAWruB,EAAKk0C,MAAM4D,WAAWzpB,KAEpF,E,+RAEOpmB,UACL,OAAOrd,KAAK49C,QAAQ59C,KAAKb,OAC3B,CAEOmxB,MAAM1zB,GACX,OAAOoD,KAAK8Y,MAAMlc,MAASoD,KAAK8Y,MAAMlc,GAAIM,OAAOs/C,GACnD,CAEOuhC,gBAAgBnhF,GACrB,OAAOoD,KAAKswB,MAAM1zB,MAASoD,KAAK8Y,MAAMlc,GAAIM,OAAO8gF,eACnD,CAEOvtD,UAAU7zB,GACf,OAAOoD,KAAKq6E,aAAa37E,IAAI9B,OAAUoD,KAAK8Y,MAAMlc,KAAOoD,KAAK8Y,MAAMlc,GAAIM,OAAO89E,QACjF,CAEO2C,cAAc/gF,GACnB,MAAMwY,EAAOpV,KAAK8Y,MAAMlc,GACxB,OAAOwY,IAASpV,KAAKswB,MAAM1zB,KAAQwY,EAAKlY,OAAOysB,UAAYvU,EAAKlY,OAAO+gF,OACzE,CAEOC,iBAAiBthF,GACtB,OAAOoD,KAAK29E,cAAc/gF,KAAQoD,KAAKywB,UAAU7zB,IAAOA,IAAOoD,KAAKb,MACtE,CAEOq3B,QAAQ55B,EAAY+gC,GACzB,MAAMvoB,EAAOpV,KAAK8Y,MAAMlc,GACxB,OAAO,EAAA4mB,GAAA,GAASpO,KAAUuoB,IAAavoB,EAAKlY,OAAO0jB,IACrD,CAEOkoD,cAAclsE,GACnB,MAAMwY,EAAOpV,KAAK49C,QAAQhhD,GAC1B,MAAO,IAAMA,GAAMwY,EAAKklB,YAAc,IAAMllB,EAAKklB,YAAc,GACjE,CAEOU,aAAap+B,GAClB,MAAMwY,EAAOpV,KAAK49C,QAAQhhD,GAC1B,OAAGwY,EAAKlY,QAAUkY,EAAKlY,OAAOrD,KACrB,CAAC8C,EAAG,iBAGN,CACLA,EAAG,YACHyC,QAASxC,EACT09B,YAAallB,EAAKklB,YAEtB,CAEO2uC,iBAAiBrsE,GAOtB,MAAO,CACLD,EAAG,gBACHyC,QAASxC,EACT09B,YATWt6B,KAAK49C,QAAQhhD,GASN09B,YAEtB,CAEOy4B,qBAAqBn2D,GAC1B,MAAMwY,EAAOpV,KAAK49C,QAAQhhD,GAE1B,MAAO,CACLD,EAAG,oBACH6iD,WAAYpqC,EAAKoqC,WACjBC,UAAWrqC,EAAKqqC,UAChBF,aAAcnqC,EAAKk0C,MACnB5J,MAAO,GACPtgD,QAASxC,EAEb,CAUQ69E,iBAAiBrlE,EAAmBolE,GAAe,EAAA92D,GAAA,IAAM,IAC5DtO,EAAK1O,QACY,qBAAlB0O,EAAK1O,OAAO/J,GACZyY,EAAK1O,OAAOi0E,QAAUH,IACtBplE,EAAK1O,OAAS,CAAC/J,EAAG,oBAAqBi+E,WAAYxlE,EAAK1O,OAAOi0E,SAC/D36E,KAAKmd,UAAUxW,cAAc,cAAeyO,EAAKxY,IAEjDoD,KAAK66E,uBAAuBzlE,GAEhC,CAEOgwC,gBAAgBxoD,EAAYuhF,GACjC,GAAGn+E,KAAKswB,MAAM1zB,GACZ,OAGF,MAAMgjC,GAAY,EAAAlc,GAAA,IAAM,GAExB,GAAGy6D,GACD,GAAIv+C,EAAYu+C,GAFI,GAGlB,YAEG,GAAGn+E,KAAKoe,kBAAkB0U,aAAaI,YAC5C,OAGF,MAAM9d,EAAOpV,KAAK49C,QAAQhhD,KACvBwY,aAAI,EAAJA,EAAM1O,SACW,qBAAlB0O,EAAK1O,OAAO/J,GACM,oBAAlByY,EAAK1O,OAAO/J,GACXyY,EAAKlY,OAAO+gF,SACZ7oE,EAAKlY,OAAOysB,UACbvU,EAAK1O,OAAS,CACZ/J,EAAG,mBACHg+E,QAAS/6C,EAjBS,IAqBpB5/B,KAAKmd,UAAUxW,cAAc,cAAe/J,GAE5CoD,KAAK66E,uBAAuBzlE,GAEhC,CAEOgpE,cAAc5+B,EAAoBC,EAAmB6J,GAC1D,OAAOtpD,KAAKq+E,eAAe,CAAC,CAC1B7+B,aACAC,YACA6+B,OAAQ,CAACh1B,MACPxkD,MAAM+T,IACR,IAAIA,EAAQpc,OAAQ,CAClB,MAAMmB,EAAQ,IAAIoN,MAElB,MADCpN,EAAcG,KAAO,UAChBH,C,CAGR,OAAOib,EAAQ,EAAE,GAErB,CAEOwlE,eAAe3tD,GACpB,MAAM6tD,EAAgC,GAEtC,IAAI,IAAI54E,EAAI,EAAGA,EAAI+qB,EAASj0B,SAAUkJ,EACpC,IAAI,IAAI64E,EAAI,EAAGA,EAAI9tD,EAAS/qB,GAAG24E,OAAO7hF,SAAU+hF,EAC9CD,EAAcj+E,KAAK,CACjB3D,EAAG,oBACH8hF,WAAY94E,GAAK,GAAK64E,GAAGxxE,SAAS,IAClCs8C,MAAO54B,EAAS/qB,GAAG24E,OAAOE,GAC1Bh/B,WAAY9uB,EAAS/qB,GAAG65C,WACxBC,UAAW/uB,EAAS/qB,GAAG85C,YAK7B,OAAOz/C,KAAK4T,WAAWC,UAAU,0BAA2B,CAC1D6c,SAAU6tD,IACTz5E,MAAM45E,IACP1+E,KAAKooB,aAAas2D,EAAuB5lE,OAEzB4lE,EAAuBC,SAASx6E,KAAKy6E,IACnD5+E,KAAKu9E,iBAAiBqB,EAAgBx/E,SAAS,GACxCw/E,EAAgBx/E,aAK7B,CAEO89C,YAAYn/C,GACjB,OAAGiC,KAAKi6E,oBAAoBl8E,GAAciC,KAAKi6E,oBAAoBl8E,GAE5DiC,KAAKi6E,oBAAoBl8E,GAAQiC,KAAK2e,gBAAgBxX,WAAWrC,MAAMmC,IAC5E,MAAM8kB,EAAS9kB,EAAM43E,cAAc9gF,GACnC,OAAGguB,GAAWA,EAAO+yD,WAAa,MAAWvwE,KAAK1J,OAASknB,EAAOwF,MACzDxF,EAAOwF,MAGTvxB,KAAK4T,WAAWC,UAAU,uBAAwB,CACvD,CAAC9V,IAAO,EACRuuB,OAAQ,EACR/P,MAAO,GACP6kB,KAAM,MACLt8B,MAAM1C,IACP,IAAI+6C,EAAwB,GAqB5B,MApBgB,sBAAb/6C,EAAOzF,IAERqD,KAAKooB,aAAahmB,EAAO0W,OACzB9Y,KAAK0c,gBAAgB2L,aAAajmB,EAAOkmB,OAEtClmB,EAAO28E,WAAWtiF,SACnB0gD,EAAW/6C,EAAO28E,WAAW,GAAGxtD,MAAMptB,KAAKk5C,IACzC,MAAMp+C,GAAS,EAAAD,GAAA,GAAUq+C,EAAQxiC,MAEjC,OADA7a,KAAK8mB,aAAaK,YAAYloB,EAAQ,WAC/B,CAACrC,GAAIqC,EAAQq+C,OAAQD,EAAQC,OAAO,MAKjDr2C,EAAM43E,cAAc9gF,GAAQ,CAC1BwzB,MAAO4rB,EACP2hC,WAAYvwE,KAAK1J,OAEnB7E,KAAK2e,gBAAgB9W,YAAY,gBAAiBZ,EAAM43E,eAEjD1hC,CAAQ,GACf,GAEN,CAEO6hC,WAAW1yD,EAAS,EAAG/P,EAAQ,GACpC,OAAOvc,KAAK4T,WAAWke,gBAAgB,sBAAuB,CAACxF,SAAQ/P,UAAQzX,MAAMm6E,IACnFj/E,KAAKooB,aAAa62D,EAAgBnmE,OAClC9Y,KAAK0c,gBAAgB2L,aAAa42D,EAAgB32D,OAK3C,CAAChO,MAJ4B,qBAAtB2kE,EAAgBtiF,EAA2BsiF,EAAgBnmE,MAAMrc,OAASwiF,EAAgB32D,MAAM7rB,OAASwiF,EAAgB3kE,MAIxHtC,QAFWinE,EAAgBnmE,MAAM3U,KAAK85B,GAAMA,EAAErhC,GAAGyC,aAAY2E,OAAOi7E,EAAgB32D,MAAMnkB,KAAKoS,GAAMA,EAAE3Z,GAAGyC,UAAS,SAItI,CAEO6/E,WACL9iC,EACAC,EACAC,EACA2V,GAAsB,EACtBktB,EAAuB,GAEvB,MAAM1iC,EAA2B,CAC/B9/C,EAAG,gBACHy/C,MACAC,OACAC,mBAGF,OAAOt8C,KAAK4T,WAAWC,UAAU,sBAAuB,CACtD4oC,YACAwV,eACCntD,MAAMmkB,IACPjpB,KAAKoe,kBAAkBkV,qBAAqBrK,GACrCA,IAEX,CA0BOm2D,eAAe/kE,EAAekC,EAAQ,IAE3C,MAAM0X,GAAW,EAAAkoC,GAAA,GAAc9hD,GAC/B,GAAG4Z,EAASx3B,QAAUw3B,EAAS,GAAGx3B,SAAW4d,EAAMkzB,OAAO9wC,QAA4B,qBAAlBw3B,EAAS,GAAGt3B,EAC9E,IACE,MACMmT,EADM,IAAIqpB,IAAI+J,GAAQ7oB,GAAO3c,KAClBgmC,SAASj8B,MAAM,GAC7BqI,IACDuK,EAAQvK,EAEC,CAAX,MAAMxG,GAAK,CAGf,OAAOtJ,KAAK4T,WAAW2tB,mBAAmB,kBAAmB,CAC3D8L,EAAGhzB,EACHkC,SACC,CAACilB,aAAc,KAAK18B,MAAMysB,IAC3BvxB,KAAKooB,aAAamJ,EAAMzY,OACxB9Y,KAAK0c,gBAAgB2L,aAAakJ,EAAMjJ,OAE5B,CACV+2D,YAAY,EAAAjnD,GAAA,GAAa7G,EAAM8tD,WAAWl7E,KAAK61B,IAAM,EAAAh7B,GAAA,GAAUg7B,MAC/D70B,QAASosB,EAAMpsB,QAAQhB,KAAK61B,IAAM,EAAAh7B,GAAA,GAAUg7B,QAKlD,CAEQujD,iBAAiBp+E,EAAgBsxB,EAAoB6uD,EAAet/E,KAAKywB,UAAUtxB,IACtFsxB,IAAc6uD,IACZ7uD,EACDzwB,KAAKk7E,YAAY/7E,GAEjBa,KAAK47E,WAAWz8E,GAGlBa,KAAKo7E,qBAELp7E,KAAKmd,UAAUxW,cAAc,kBAAmBxH,GAEpD,CAEO2/B,eAAeC,GACpB,OAAO/+B,KAAK4T,WAAWC,UAAU,yBAA0B,CACzDkrB,aACCj6B,MAAMsQ,IACPpV,KAAKwvE,YAAYp6D,EAAK,GAE1B,CAEOmqE,cAAcpgF,EAAgBqgF,GACnC,GAAGx/E,KAAKswB,MAAMnxB,GACZ,OAGF,MAAMiW,EAAOpV,KAAK8Y,MAAM3Z,GACxB,GAAGiW,EAAM,CACP,MAAM1O,EAAqB84E,EAAU,CACnC7iF,EAAG,oBACHi+E,YAAY,EAAAl3D,GAAA,IAAM,IAChB,CACF/mB,EAAG,mBACHg+E,SAAS,EAAAj3D,GAAA,IAAM,GAAQ,IAGzBtO,EAAK1O,OAASA,EAEd1G,KAAKmd,UAAUxW,cAAc,cAAexH,GAE5Ca,KAAK66E,uBAAuBzlE,E,CAEhC,CAEOqqE,qBAAqBD,GAE1B,OADAx/E,KAAKu/E,cAAcv/E,KAAKqd,UAAUzgB,GAAI4iF,GAC/Bx/E,KAAK4T,WAAWke,gBAAgB,uBAAwB,CAAC0tD,WAClE,CAEOE,WAAWvgF,EAAgBqgD,EAAoBC,EAAmB6J,EAAeq2B,GAStF,OAAO3/E,KAAK4T,WAAWC,UAAU,sBAAuB,CACtDjX,GAAIoD,KAAKg7B,aAAa77B,GACtBqgD,aACAC,YACA6J,QACAs2B,4BAA6BD,IAC5B76E,MAAMmkB,IACPjpB,KAAKoe,kBAAkBkV,qBAAqBrK,EAAS,CAACkL,UAAU,IAEhEn0B,KAAKu9E,iBAAiBp+E,GAAQ,EAAK,GAEvC,CAEO0gF,eAAehnE,GACpB,OAAO7Y,KAAK4T,WAAWC,UAAU,0BAA2B,CAC1DjX,GAAIic,EAAQ1U,KAAKhF,GAAWa,KAAKg7B,aAAa77B,OAC7C2F,MAAMmkB,IACPjpB,KAAKoe,kBAAkBkV,qBAAqBrK,EAAS,CAACkL,UAAU,IAEhEtb,EAAQ/Z,SAASK,IACfa,KAAKu9E,iBAAiBp+E,GAAQ,EAAM,GACpC,GAEN,CAEOkiC,cAActC,GACnB,OAAO/+B,KAAK4T,WAAWC,UAAU,wBAAyB,CAACkrB,YAC7D,CAEOgD,eAAehD,EAAkBiD,GACtC,OAAOhiC,KAAK4T,WAAWC,UAAU,yBAA0B,CAACkrB,WAAUiD,UACxE,CAEOC,iBAAiB+3C,GACtB,OAAOh6E,KAAK4T,WAAWC,UAAU,2BAA4B,CAACmI,MAAOg+D,GACvE,CAEO/X,cAAc9iE,GACnB,OAAO,EAAA8iE,GAAA,GAAcjiE,KAAK49C,QAAQz+C,GACpC,EEjhCF,MAAM2gF,GAAe,IAAI1hF,IAAI,CAAC,QAAS,QAAS,MAAO,aAIhD,MAAM2hF,WAA2BrtE,EAAxC,c,oBACU,KAAAstE,SAEJ,CAAC,EACG,KAAAC,gBAEJ,CAAC,CAoHP,CAlHY/iE,QACRld,KAAKoe,kBAAkBC,2BAA2B,CAChD6hE,cAAgBzlE,IACdza,KAAKm7D,YAAY1gD,EAAOkyC,QAAQ,GAGtC,CAEOwO,YAAYglB,EAAqBllB,EAAgCH,G,QACtE,GAAoB,uBAAjBqlB,EAAWxjF,GAA+C,iBAAjBwjF,EAAWxjF,EAAsB,OAC7E,MAAM,GAACC,GAAMujF,EAEPC,EAAapgF,KAAKggF,SAASpjF,GAC3ByjF,EAAYD,GAChBA,EAAWzjF,IAAMwjF,EAAWxjF,GAC3ByjF,EAA+Bh/C,MAAUg/C,EAA+Bh/C,KAE3E,GAAoB,YAAjB++C,EAAWxjF,EAAiB,CACF,WAAR,QAAhB,EAAAwjF,EAAWvnD,aAAK,eAAEj8B,GACnBwjF,EAAWvnD,MAAQ54B,KAAK88C,iBAAiBC,UAAUojC,EAAWvnD,MAAOkiC,UAE9DqlB,EAAWvnD,MAGU,cAAR,QAAnB,EAAAunD,EAAWr5C,gBAAQ,eAAEnqC,GACtBwjF,EAAWr5C,SAAW9mC,KAAK03C,eAAezH,QAAQkwC,EAAWr5C,SAAUg0B,IAEhD,aAApBqlB,EAAWpiF,aACLoiF,EAAWpiF,YAGboiF,EAAWr5C,UAGpB,MAAMw5C,EAAWH,EAAWI,UACtBC,EAAaL,EAAW10D,OAAS00D,EAAWM,QAAUH,GAAY,GACrEA,GAAYE,IAAeF,UACrBH,EAAWI,UAKhBT,GAAaphF,IAAIyhF,EAAWpiF,OAC7BoiF,EAAWxgC,cACZwgC,EAAWvnD,QACXunD,EAAWpiF,KAAO,Q,CAItB,IAAI2iF,EAAa1gF,KAAKigF,gBAAgBrjF,GAYtC,GAXGq+D,IACGylB,IAAYA,EAAa1gF,KAAKigF,gBAAgBrjF,GAAM,IAAIwB,KAC5DsiF,EAAW3hF,IAAIk8D,SAGCjgE,IAAfolF,EACDpgF,KAAKggF,SAASpjF,GAAMujF,EAEpBvoE,GAAkBwoE,EAAYD,IAG5BllB,QAA6BjgE,IAAf0lF,GAA4BL,EAAW,CACvD,MAAM33B,EAA8D,GACpEg4B,EAAW5hF,SAASuF,IAClB,MAAOpF,EAAQ0nB,EAAKmjC,GAAezlD,EAAMzE,MAAM,KAC/C8oD,EAAKpoD,KAAK,CACRrB,OAAQA,EAAOI,WACfsnB,KAAMA,EACNmjC,cAAeA,GACf,IAGJ9pD,KAAKmd,UAAUxW,cAAc,kBAAmB,CAC9C/J,KACA8rD,Q,CAIJ,OAAOy3B,CACT,CAEOjlB,+BAA+Bj8D,EAAgB0nB,EAAamjC,GACjE,OAAO7qD,EAAS,IAAM0nB,GAAOmjC,EAAc,KAAO,GACpD,CAEOsc,yBAAyB/X,EAAkB4M,GAChD,MAAMr+D,EAAMyxD,EAA4BzxD,GACxC,IAAIA,EAAI,OAER,MAAMqL,EAAMjI,KAAKigF,gBAAgBrjF,GAC9BqL,GAAOA,EAAIvJ,IAAIu8D,KAChBhzD,EAAIpE,OAAOo3D,GAEPhzD,EAAIoL,aACCrT,KAAKigF,gBAAgBrjF,GAGlC,CAEOiwD,iBAAiBjwD,GACtB,OAAOoD,KAAKggF,SAASpjF,EACvB,CAEO+jF,WAAWjjF,GAChB,OAAOsC,KAAK4T,WAAW6/B,kBAAkB,CACvC3qC,OAAQ,sBACRm4B,cAAgBotB,GACPruD,KAAKm7D,YAAY9M,GAE1Bp6C,OAAQ,CACNvW,QAGN,E,0BCrIa,SAASkjF,GAAsB1nD,GAC5C,OAAO,EAAA2nD,GAAA,GAAW3nD,EAAM,oBAC1B,C,0BCVe,SAAS4nD,GAAYztC,GAElC,OAAOr1C,mBAAmBq1C,GAAUt3C,QAAQ,SAAUglF,QAAQhlF,QAAQ,MAAO,MAC/E,CCOe,MAAMilF,GACnBlhF,YACUmhF,EACApjF,GADA,KAAAojF,mBAAAA,EACA,KAAApjF,WAAAA,EAERmC,KAAKihF,mBAAqBC,IAC5B,CAEaC,MAAMzgC,EAAkBp0B,G,qCACnC,OAAOtsB,KAAKihF,mBAAmB1uB,OAAO,gBAAiB,CACrD31D,GAAIoD,KAAKnC,WACTujF,MAAO1gC,GAEX,E,+RAEOkN,SAASyzB,GACd,OAAOrhF,KAAKihF,mBAAmB1uB,OAAO,mBAAoBvyD,KAAKnC,YAAYiH,MAAK,KAAe,GACjG,ECda,MAAMw8E,GACZC,QAAQluC,GACb,OAAO1xC,QAAQC,QAAO,EAAA+V,EAAA,GAAU,kBAClC,CAEO6pE,gBAAe,SAACnuC,EAAQ,WAAEx1C,EAAU,KAAEwV,IAK3C,MAAMouE,EAAU,OAAH,QACX,eAAgB,0CAChB,sBAAuB,gCAAoCX,GAAYztC,IACnEhgC,EAAO,CAAC,iBAAkBA,GAAQ,CAAC,GAGnC4tE,EAAqBC,KACrBv3E,EAAUs3E,EAAmB1uB,OAAO,WAAY,CACpDkvB,UACA7kF,GAAIiB,IAGArE,GAAW,SAWjB,OAVAA,EAASkoF,OAAS,KAChBloF,EAASoI,QAAO,EAAA+V,EAAA,GAAU,qBAAqB,EAGjDne,EAASyU,OAAM,KACbizE,KAAwB3uB,OAAO,iBAAkB10D,EAAW,IAG9D8L,EAAQ7E,KAAKtL,EAASyI,QAASzI,EAASoI,QAEjC,CACLpI,WACAmoF,UAAW,IACF,IAAIX,GAAeC,EAAoBpjF,GAGpD,E,2SCmCF,MAEM+jF,GAAgB,OAOhBC,GAAgC,IAAIzjF,IAAI,CAC5C,oBACA,kBACA,UACA,mBAGK,MAAM0jF,WAAuBpvE,EAApC,c,oBACU,KAAAqvE,aAAe,IAAI,KAAuB,eAC1C,KAAAC,gBAAkB,IAAIV,GAEtB,KAAAW,iBAEJ,CAAC,EAMG,KAAAC,eAEJ,CAAC,EAEG,KAAAC,cAWJ,CAAC,EACG,KAAAC,gBAA4C,CAAC,EAE9C,KAAAC,yBAKH,CAAC,EAEG,KAAAliF,KAAiC,EAAAsI,EAAA,IAAO,MAAO,WAAiB,KAAAD,KAChE,KAAAklD,OAAS,EACT,KAAApb,QAAU,EACV,KAAAhqC,MAAQ,UAER,KAAAg6E,eAAiB,IACjB,KAAAC,iBAAmB,IAwOnB,KAAAC,cAAgB,CAACz1E,EAAmBsmC,IAGnCrzC,KAAKuU,aAAaC,aAAa,iBAAkBzH,EAAMtF,QAAQwB,QAAQ,GAGxE,KAAAw5E,cAAgB,CAAC11E,EAAmBsmC,KAG1C,MAAMpqC,EAAS8D,EAAMtF,QAAQwB,OAC7B,OAAGnD,IAAiB/K,WACXiF,KAAKuU,aAAaC,aAAa,iBAAkBvL,GAAQ,GAAMnE,MAAMzJ,GC/XnE,SAAuBA,GACpC,MAAMqnF,EAAWrnF,EAAKZ,QAAQ,QACd,IAAbioF,IACDrnF,EAAOA,EAAKoM,MAAMi7E,IAGpB,MAAO/lF,EAAGgmF,EAAI/vC,EAAOC,GAAUx3C,EAAKP,MAAM,mBAAmB,GAAG8E,MAAM,KAEtE,OADOvE,EAAKU,QAAQ,IAAK,WAAW62C,cAAkBC,OAAY92C,QAAQ,gBAAiB,GAE7F,CDuXe6mF,CAAcvnF,KACpByJ,MAAMzJ,IACa,IAAIwnF,aACLt2E,OAAOlR,KAIvB2E,KAAKuU,aAAaC,aAAa,iBAAkBvL,GAAQ,EAA6B,EAGvF,KAAA65E,YAAc,CAAC/1E,EAAmBsmC,IACvB,kBACDkf,OAAO,cAAe,CAAClf,WAAUtmC,UAG3C,KAAAg2E,YAAc,CAACh2E,EAAmBsmC,IACvB,kBACDkf,OAAO,cAAe,CAAClf,WAAUtmC,SAuiBrD,CAzyBYmQ,QACRw9D,aAAY,KACV,IAAI,MAAMljE,KAAOxX,KAAKqiF,yBAA0B,CAC9C,MAAM,SAAC7oF,GAAYwG,KAAKqiF,yBAAyB7qE,IAC9Che,EAASyY,aAAezY,EAAS0Y,oBAC3BlS,KAAKqiF,yBAAyB7qE,E,IAGxC,MAEHxX,KAAKmd,UAAU7W,iBAAiB,UAAW+vD,IACzCr2D,KAAKgjF,YAAc3sB,EAAO4sB,aAAa,IAGzCjjF,KAAKmd,UAAU7W,iBAAiB,cAAeq9D,IAC7C3jE,KAAKsiF,eAAiBtiF,KAAKmd,UAAU9W,QAAUs9D,EAAUuf,6BAA+Bvf,EAAUwf,6BAClGnjF,KAAKuiF,iBAAmB5e,EAAUuf,4BAA4B,GAElE,CAIQE,gBAAgBj7E,EAAuBvL,EAAYm6B,EAAwCssD,EAAqB/wC,EAAkB,QACxGt3C,IAA7BgF,KAAKmiF,cAAch6E,KACpBnI,KAAKmiF,cAAch6E,GAAQ,GAC3BnI,KAAKoiF,gBAAgBj6E,GAAQ,GAG/B,MAAMm7E,EAAetjF,KAAKmiF,cAAch6E,GAElCwB,EAAU,IAAIhI,SAA6B,CAACM,EAASL,KACzD0hF,EAAahjF,KAAK,CAAC1D,KAAI01C,UAASvb,KAAIv9B,SAAU,CAACyI,UAASL,UAASyhF,eAAa,IAOhF,OAJAthF,YAAW,KACT/B,KAAKujF,cAAcp7E,EAAK,GACvB,GAEIwB,CACT,CAEQ45E,cAAcp7E,GACpB,MAAMm7E,EAAetjF,KAAKmiF,cAAch6E,GAClCq7E,EAAgDxjF,KAAKmd,UAAU9W,QAlG1C,IAFA,GAuG3B,GAAGrG,KAAKoiF,gBAAgBj6E,IAASq7E,KAAkBF,aAAY,EAAZA,EAAc7mF,QAC/D,OAAO,EAIT,MAAM6N,GAAO,EAAAqkB,GAAA,GAAc20D,GAAelnE,GAAoB,IAAdA,EAAEk2B,YAAkB,EAAA3jB,GAAA,GAAc20D,GAAelnE,GAAMA,EAAEk2B,UAAYtyC,KAAKsyC,WAAYgxC,EAAap1E,QAC7Im1E,EAAc/4E,EAAK+4E,aAAe,EAExCrjF,KAAKoiF,gBAAgBj6E,IAASk7E,EAE9B,MAAM15E,EAAUW,EAAKysB,KAKhBptB,EAAQ7E,MAAK,KAChB9E,KAAKoiF,gBAAgBj6E,IAASk7E,EAC9BrjF,KAAKujF,cAAcp7E,EAAK,IAGtBvK,KACEA,aAAK,EAALA,EAAOG,OAAS8jF,GAAcnjF,IAAId,EAAMG,OAC1CiC,KAAKG,IAAIvC,MAAM,uBAAwBA,GAGzCoC,KAAKoiF,gBAAgBj6E,IAASk7E,EAC9BrjF,KAAKujF,cAAcp7E,EAAK,IAGvBygC,SAAQ,KACTj/B,EAAQ7E,KAAKwF,EAAK9Q,SAASyI,QAASqI,EAAK9Q,SAASoI,OAAO,GAE7D,CAEO6hF,WAAWnxC,GAEhBtyC,KAAKsyC,QAAUA,CACjB,CAEQoxC,iBACN,OAAO1jF,KAAK+hF,YACd,CAEO4B,eAAetwC,GACpB,MAAMnvC,EAAW,CAAClE,KAAKiiF,iBAAiB5uC,GAAWrzC,KAAKkiF,eAAe7uC,IAAWv2C,OAAOC,SACzF,IAAI6mF,GAAW,EACf,IAAI,IAAIj+E,EAAI,EAAGlJ,EAASyH,EAASzH,OAAQkJ,EAAIlJ,IAAUkJ,EAAG,CACxD,MAAMgE,EAAUzF,EAASyB,IACtBgE,GAAYA,EAAQuI,YAAevI,EAAQsI,cAC5CtI,EAAQ+3E,SACRkC,GAAW,E,CAIf,OAAOA,CACT,CAEOC,mBACL17E,EACA5L,EACA+vB,EACA/P,EACA3f,EAAK,EACL01C,EAAU,EACVwxC,GAEA,OAAO9jF,KAAKojF,gBAAgBj7E,EAAMvL,GAAI,IAAW,mCAG/C,GAFAknF,SAAAA,IAEG,QAASvnF,EAAU,CACpB,MAAMmB,EAAMnB,EAASmB,IACrB,GAAGsC,KAAK+jF,eAAermF,GACrB,OAAOmL,MAAMnL,GACZoH,MAAMiE,GAAaA,EAASC,gBAC5BlE,MAAMkE,IACL,MAAMg7E,EAAYtmF,EAAIkC,MAAM,KAAK8H,MAC3BywE,EAAW9pC,GAAwB21C,IAAc,2BACvD,MAAO,CACLrnF,EAAG,iBACH0W,KAAMrK,EAAYuB,WAClBmmC,UAAWynC,EACX8L,UAAW,CAACtnF,EAAG,uBACfunF,MAAO,EACPn3E,MAAO,IAAI3D,WAAWJ,GACvB,G,CAKP,OAAOhJ,KAAK4T,WAAWC,UAAU,oBAAqB,CACpDtX,WACA+vB,SACA/P,SACC,CACDpU,OACAg8E,cAAc,GAElB,KAAGnkF,KAAKokF,SAAS7nE,GAAQ+1B,EAC3B,CAEOsB,gBACLzrC,EACA5L,EACA+vB,EACA/P,EACA3f,EAAK,EACL01C,EAAU,EACVwxC,GAEA,OAAO9jF,KAAKojF,gBAAgBj7E,EAAMvL,GAAI,IAAW,mCAC/CknF,SAAAA,IAEA,MAAMvxB,EAAS,IAAkC,mC,MAC/CuxB,SAAAA,IAGA,MAAMjuE,EAAoF,QAAvE,EAAAtZ,EAAyD4zC,sBAAc,eAAE1oC,QAY5F,OATAzH,KAAK4T,WAAWC,UAAU,iBAAkB,CAC1CtX,WACA+vB,SACA/P,SACC,CACDpU,OACAg8E,cAAc,IAGDl2E,OAAO3E,IAGpB,GAFAw6E,SAAAA,IAEgB,2BAAbx6E,EAAIvL,KACL,OAAOiC,KAAKsW,iBAAiB/Z,EAAyDsZ,GAAW/Q,KAAKytD,GAGxG,MAAMjpD,CAAG,GAEb,KAEA,EAAA6e,GAAA,GAAwD5rB,GACxD,MAAMsZ,EAAYtZ,EAAS4zC,eAC3B,GAAGt6B,IAActZ,EAAS8nF,iBAAkB,CAC1C9nF,EAAS8nF,kBAAmB,EAC5B,MAAM7sE,EAAM1K,EAAW+I,GACvB,GAAG7V,KAAKqiF,yBAAyB7qE,GAC/B,OAAOxX,KAAKsW,iBAAiB/Z,EAAUsZ,GAAW/Q,KAAKytD,E,CAI3D,OAAOA,GACT,KAAGvyD,KAAKokF,SAAS7nE,GAAQ+1B,EAC3B,CAMQ8xC,SAASr3E,GACf,OAAOA,EAAQ60E,EACjB,CAEQ0C,aAAajxE,EAAckxE,GACjC,IAAIlxE,EACF,OA5QgB,OAiRlB,IAAItG,EAAQ60E,GAEZ,MAAM4C,EAAWD,EAAWvkF,KAAKsiF,eAAiBtiF,KAAKuiF,iBACjDkC,EAAcF,EAtRU,OADE,QAyRhC,KAAOlxE,EAAOtG,EAASy3E,GAAYz3E,EAAQ03E,GACzC13E,GAAS,EAMX,OAAOA,CACT,CAkCQuJ,iBACNouE,EACA7uE,EACA2B,EAAM1K,EAAW+I,IAEjB,IAAIxQ,EAAIrF,KAAKqiF,yBAAyB7qE,GACtC,IAAInS,EAAG,CACL,MAAM7L,GAAW,SAEjB6L,EAAIrF,KAAKqiF,yBAAyB7qE,GAAO,CACvChe,YAaFwG,KAAKowC,kBAAkB95B,iBAAiBT,GAAW/Q,MAAM+Q,IACpD2B,IAAQ1K,EAAW+I,IACpBrc,EAASoI,QAAO,EAAA+V,EAAA,GAAU,+BAG5Bne,EAASyI,QAAQ4T,EAAU,GAC1Brc,EAASoI,O,CAId,OAAOyD,EAAE7L,SAASsL,MAAM+Q,IACtB6uE,EAAkBv0C,eAAiBt6B,CAAS,GAEhD,CAEO8uE,cAActxC,GACnB,QAASrzC,KAAKiiF,iBAAiB5uC,EACjC,CAEOuxC,YAAYvxC,GACjB,OAAOrzC,KAAKiiF,iBAAiB5uC,EAC/B,CAEOwxC,UAAUxxC,GACf,OAAOrzC,KAAKkiF,eAAe7uC,EAC7B,CAEQyxC,iBAAiB3M,GACvB,IAAI/rE,EAeJ,MAdgB,gCAAb+rE,GACD/rE,EAAUpM,KAAKyiF,cACftK,EAAW,iBACU,eAAbA,GAA8BryE,IAAiBorC,kBAGlC,4BAAbinC,GACR/rE,EAAUpM,KAAKwiF,cACfrK,EAAW,oBACU,cAAbA,GAA6BryE,IAAiBi/E,oBACtD34E,EAAUpM,KAAK+iF,YACf5K,EAAW,cAPX/rE,EAAUpM,KAAK8iF,YACf3K,EAAW,aASN,CAACA,WAAU/rE,UACpB,CAEQ44E,yBAAyBC,EAAqB5xE,EAAc2lB,GAClE,MAAMksD,EAAqB,GAC3B,IAEEC,EAFE74D,EAAS24D,EACTG,EAAyCzjF,QAAQM,UAErD,GACEkjF,GAAgB,SAChBD,EAAQ5kF,KAAK,CAACgsB,SAAQ84D,eAAcD,kBACpCC,EAAeD,EACf74D,GAAU0M,QACJ1M,EAASjZ,GAEjB,OAAO6xE,CACT,CAEQnB,eAAermF,GACrB,OAAOA,EAAIwvD,WAAW,UACxB,CAEOn8C,SAASrV,G,QACd,MAAM2X,EAAmB,QAAZ,EAAA3X,EAAQ2X,YAAI,QAAI,GACvB,KAAClL,EAAI,SAAE5L,GAAYb,EACzB,IAAI,WAACmC,GAAcnC,EAChBmC,IAAeqjF,OAChBlhF,KAAKG,IAAIvC,MAAM,4BAA6BlC,GAC5CmC,OAAa7C,GAGf,MAAMqqF,EAAmB3pF,EAAQy8E,SAC3BmN,EAAgBtlF,KAAK8kF,iBAAiBO,IACtC,QAACj5E,GAAWk5E,EAClB5pF,EAAQy8E,SAAWmN,EAAcnN,UAAY,aAE7C,MAAM9kC,GAAW,EAAAkyC,GAAA,GAA+B7pF,GAC1C8pF,EAAgB3nF,GAAa,EAAA0nF,GAAA,GAA+B,OAAD,yBAAK,EAAAz2D,GAAA,GAAKpzB,IAAQ,CAAEmC,gBAAY7C,KAAcq4C,EACzG0uC,EAA4B/hF,KAAK0jF,iBACjC1B,EAA+BnkF,EAAamC,KAAKgiF,qBAAkBhnF,EACzE,IAAIxB,EAA4BqE,OAAa7C,EAAYgF,KAAKiiF,iBAAiB5uC,GAI/E,GAFArzC,KAAKsI,OAAStI,KAAKG,IAAI,eAAgBkzC,EAAU33C,GAE9ClC,EACD,OAAOA,EAuBT,MAAMisF,EAAe,CAACn9C,EAA4B1qC,KAChD,KAAG0qC,aAAI,EAAJA,EAAM1qC,OAIT,IAAI,MAAMo8B,KAAK0rD,EACVp9C,GAAQA,IAAStO,IAIpBA,EAAEp8B,MAAQA,EACVo8B,EAAExgC,SAASoI,OAAOhE,G,EAIhB+nF,EAA2B,yBAAfppF,EAASI,EACrBonF,EAAiB4B,GAAa3lF,KAAK+jF,eAAexnF,EAASmB,KAC3Dd,EAAKoD,KAAK0tD,SACV10B,EAAY+qD,EAChB1wE,EACA3X,EAAQs9B,WAAah5B,KAAKskF,aAAajxE,GAAM,GAE/C,IAEIuyE,EACFC,EAHEtE,EAAkCQ,EAAaR,QAAQtiE,KAAK8iE,GAIhE,MAAM2D,EAAqC,GACrCI,EAAezyE,GAAQ2lB,EAIvB5B,EAAS,CAACkR,EAA4B+K,KAC1C,MAAM,SAAC75C,GAAY8uC,EACby9C,EAAgBN,EAAaxmE,KAAK,KAAMqpB,GAE9C9uC,EAASkoF,OAAS,IAAMloF,EAASoI,QAAO,EAAA+V,EAAA,GAAU,sBAClDne,EAASyU,OAAOrQ,I,QACdmoF,EAAcnoF,GACO,QAArB,EAAW,QAAX,EAAA0qC,EAAK09C,cAAM,eAAEC,gBAAQ,gBAAI,IACxBr9C,SAAQ,KACN5oC,KAAKiiF,iBAAiB5uC,KAAc75C,UAC9BwG,KAAKiiF,iBAAiB5uC,UAGxB/K,EAAK09C,MAAM,IAIpBhmF,KAAKiiF,iBAAiB5uC,GAAY75C,EAElCksF,EAASplF,KAAKgoC,EAAK,EAQrB,GALGy5C,KAAkBC,GAAmB8D,GAAgB,QACtDF,EAAgB7D,EAAaP,eAAegE,EAAeM,EAAcpqF,EAAQy8E,UACjF/gD,EAAOwuD,EAAeJ,IAGrBxD,EAAiB,CAClB,IAAIkE,EAAmBxqF,EAAQ23C,SAC/B,IAAI6yC,EAAkB,CACpBA,EAAmBV,EACnB,MAAMhpF,EAAM6yC,GAAwB3zC,EAAQy8E,UACzC37E,IACD0pF,GAAoB,IAAM1pF,E,CAI9BqpF,EAAmB7D,EAAgBR,eAAe,CAChDnuC,SAAU6yC,EACVroF,aACAwV,KAAMyyE,IAER1uD,EAAOyuD,EAAkBxyC,GAEtBuyC,GACDC,EAAiBrsF,SAASyU,OAAO3E,GAAQs8E,EAAcpsF,SAASoI,OAAO0H,I,CAW3E9P,EAAqC,QAA1B,EAAAqsF,aAAgB,EAAhBA,EAAkBrsF,gBAAQ,QAAIosF,EAAcpsF,SAEpDwoF,GAAmB51E,IACpBm1E,EAAUS,EAAgBT,QAAQtiE,KAAK+iE,IAGzCT,EAAQiE,GAAe1gF,MAAWo0B,GAAe,mCAY/C,GAXA4qD,IAWG+B,EAAkB,CACnB,MAAMG,EAASH,EAAiBG,OAASH,EAAiBlE,YAC1DmC,IAEA,MAAMh5E,QEroBC,SAA8BouB,GAC3C,OAAO0nD,GAAsB1nD,GAAMp0B,MAAMmE,GAAW,IAAIG,WAAWH,IACrE,CFmoB0Bk9E,CAAqBjtD,GACvC4qD,UACMkC,EAAO7E,MAAMr2E,GACnBg5E,IAEA+B,EAAiBrsF,SAASyI,cAAc+jF,EAAOp4B,W,CAG9Cg4B,GACDA,EAAcpsF,SAASyI,QAAQi3B,EAEnC,MAAGjrB,OAAY3E,GAAkB,mCAC/B,GAAG5N,EAAQ62C,UAET,YADAkzC,EAAa,KAAMn8E,GAIrBo8E,EAAS5mF,SAASk7B,IAChBA,EAAEgsD,OAAShsD,EAAE2nD,WAAW,IAG1B,MAEMyE,GAAeT,EAAY3lF,KAAK6jF,mBAAqB7jF,KAAK4zC,iBAAiB30B,KAAKjf,MAEnF2lF,QAAkC3qF,IAArBgF,KAAKgjF,cAA8Be,UAC3C/jF,KAAK4T,WAAWid,YACtBizD,KAGF,MAAMoB,EAAUllF,KAAKglF,yBAAyB,EAAG3xE,EAAM2lB,GAEjDy4B,EAAqB,CAACG,KAAM,EAAGtlC,OAAQ,EAAGulC,MAAOx+C,EAAMggC,YACvDgzC,EAAmB,KACvB,IACEvC,IACAryB,EAASG,KAAOA,EAChB5xD,KAAKmd,UAAUxW,cAAc,oBAAqB8qD,EACvC,CAAX,MAAMnoD,GAAK,GAGTg9E,GAA4B,EAAAxe,GAAA,GAASue,EAAkB,IAAI,GAEjE,IAAIz0B,EAAO,EACX,MAAM20B,EAAa,IAAW,mCAC5B,MAAM,OAACj6D,EAAM,aAAE84D,EAAY,cAAED,GAAiBD,EAAQh3E,QACtD,IACE41E,IAEoBl/E,YAAYC,MAAhC,MACMzC,QAAegkF,EAAYj+E,EAAM5L,EAAiB+vB,EAAQ0M,EAAWp8B,EAAIlB,EAAQ42C,QAASwxC,GAG1F/2E,GAFcnI,YAAYC,MAElBzC,EAAO2K,OAElBm4E,EAAQzoF,QACT8pF,IAGF,MAAMh8E,EAAawC,EAAMxC,WACzBvK,KAAKsI,OAAStI,KAAKG,IAAI,uCAAwCkzC,EAAUjxC,GACzE,MAAMokF,EAAWl6D,EAAS0M,GAAc3lB,IAAS9I,EACjD,GAAGA,EAAY,CACbqnD,GAAQrnD,EAELi8E,EACDH,IAEAC,IAGqB1hF,YAAYC,YAC7BugF,EACNtB,IACuBl/E,YAAYC,MAEtBD,YAAYC,YACnBlD,QAAQ0Q,IAAIqzE,EAASvhF,KAAI,EAAE6hF,YAAYA,aAAM,EAANA,EAAQ7E,MAAMp0E,EAAOuf,MAClEw3D,G,CAUF,GANG0C,KACGnzE,GAAQu+C,EAAOv+C,IACjBqyE,EAAS5mF,SAAQ,EAAEknF,aAAW,MAAC,OAAY,QAAZ,EAAAA,aAAM,EAANA,EAAQz4C,YAAI,sBAAGqkB,EAAK,IAIpD40B,GAAWp6E,EAAS,CACrB,MAAMlI,EAAWwhF,EAChB5oF,QAAO,EAAEkpF,aAAYA,aAAM,EAANA,EAAQS,WAAYT,EAAOU,eAChDviF,KAAI,EAAO6hF,YAAY,mCACtB,MAAMj5E,EAAQi5E,EAAOS,WACfE,QAAwBv6E,EAAQW,EAAOy4E,GAC7CQ,EAAOU,aAAaC,EACtB,YAEMhlF,QAAQ0Q,IAAInO,GAClB4/E,G,CAKF,GAFAqB,EAAcljF,UAEXukF,EAAS,CACV,MAAMnF,EAAgBzvB,GAAQ,KAC9B8zB,EAAS5mF,SAASwpC,IAChB,MAAM,SAAC9uC,EAAQ,OAAEwsF,GAAU19C,EAC3B,GAAG9uC,EAASyY,aAAezY,EAAS0Y,aAAe8zE,EACjD,OAGF,MAAM5jF,EAAS4jF,EAAOp4B,SAASyzB,GAC/B7nF,EAASyI,QAAQG,EAAO,G,EAG5B,MAAMkH,GACNm8E,EAAa,KAAMn8E,E,CAEvB,IAEA,IAAI,IAAI3D,EAAI,EAAGlJ,EAASkkB,KAAKC,IAnGT4oD,IAmG0B0b,EAAQzoF,QAASkJ,EAAIlJ,IAAUkJ,EAC3E4gF,GAEJ,MAAGt4E,MAAMohD,GAAA,GAET,MAAMy0B,EAAc,KAClB,GA9M2B4B,EAASp4D,QAAO,CAACC,EAAK+a,IAAS/a,MAAS+a,EAAK1qC,OAAO,KA8MvD8nF,EAASjpF,OAC/B,MAAMipF,EAAS,GAAG9nF,K,EAItB,OAAOpE,CACT,CAEOg5C,cAAc92C,GACnB,IAAI,MAAC0c,EAAK,MAAE65B,GAASv2C,EACrB,MAAMm0D,EAAsB,UAAZz3C,EAAMzb,EACtB,GAAGkzD,IAAY5d,EACb,OAAOtwC,QAAQC,OAAO,4BAIxB,MAAM+tD,EAAyB,aAAZv3C,EAAMzb,EAEtBgzD,EAAYv3C,EAAQpY,KAAK03C,eAAetF,OAAQh6B,EAA4Bxb,IACvEizD,IAASz3C,EAAQpY,KAAK88C,iBAAiBsW,SAAUh7C,EAAsBxb,KAE/E,MAAM,SAACy2C,EAAQ,gBAAEva,IAAmB,EAAA8tD,GAAA,GAAwBlrF,GAE5D,IAAIiO,EAAU3J,KAAK4kF,YAAYvxC,GAY/B,OAXI1pC,IACFA,EAAU3J,KAAK+Q,SAAS+nB,GAErB62B,IAAe1d,IAChBjyC,KAAKmd,UAAUxW,cAAc,uBAAyByR,EAA4Bxb,IAClF+M,EAAQ7E,MAAK,KACX9E,KAAKmd,UAAUxW,cAAc,sBAAwByR,EAA4Bxb,GAAG,IACnFqR,MAAMohD,GAAA,KAIN1lD,CACT,CAEOk9E,iBAAiBnrF,GACtB,MAAM,MAAC0c,EAAK,MAAE65B,GAASv2C,EAEvB,IAAIu3C,EAAejzC,KAAK4vC,cAAcmC,gBAAgB35B,EAAc65B,aAAK,EAALA,EAAOl0C,MAC3E,QAAIk0C,GAASgB,EAAaM,aAAe,SAAUtB,EAAQA,EAAM5+B,KAAO,KAAe4/B,EAAav1C,IAC3FiE,QAAQM,QAAQgxC,EAAav1C,KAG/BsC,KAAKwyC,cAAc92C,GAASoJ,MAAMo0B,IACvC,IAAI+Z,EAAaM,YAAcN,EAAaM,WAAara,EAAK7lB,KAAM,CAClE,MAAM3V,EAAMy7B,IAAIC,gBAAgBF,GAChC+Z,EAAejzC,KAAK4vC,cAAcoC,mBAAmB55B,EAAc66B,EAAal1C,KAAML,EAAKw7B,EAAK7lB,K,CAGlG,OAAO4/B,EAAav1C,GAAG,GAE3B,CAEOopF,kBAAkBprF,GACvB,OAAOsE,KAAKwyC,cAAc92C,GAASoJ,KAAKuqD,GAAA,EAC1C,CAEQxrD,OAAOwvC,GAEb,cADOrzC,KAAKiiF,iBAAiB5uC,GACtBrzC,KAAK0jF,iBAAiB7/E,OAAOwvC,EACtC,CAEOriC,QAAO,KAACquB,EAAI,SAAEgU,IACnBA,IAAAA,GAAa,EAAA4d,GAAA,GAAqB5xB,IAElC,MAAM0nD,EAAW1nD,EAAKhsB,KAChB2zE,EAAYD,GAAY,SACxBE,EAAWjnF,KAAKskF,aAAayC,GAAU,GACvC1D,EAAcrjF,KAAKokF,SAAS6C,GAC5BC,EAAavmE,KAAK4qB,KAAKw7C,EAAWE,GAClCE,GAAS,UACTC,EAA6B,CACjCzqF,EAAGqqF,EAAY,eAAiB,YAChCpqF,GAAIuqF,EACJE,MAAOH,EACPjnF,KAAMozC,EACNi0C,aAAc,IAGV9tF,GAAW,SACjB,GAAG0tF,EAAalnF,KAAKsiF,eAEnB,OADA9oF,EAASoI,QAAO,EAAA+V,EAAA,GAAU,iBACnBne,EAGT,IAAIoqF,GAAW,EAAO2D,GAAW,EAC7B9B,EAAgB7nF,IACC,qBAAhBA,aAAK,EAALA,EAAOG,OACRiC,KAAKG,IAAIvC,MAAM,WAAYA,GAG7BpE,EAASoI,OAAOhE,GAChBgmF,GAAW,EACX6B,EAAep2B,GAAA,CAAI,EAGrB,MAAMvmD,EAASk+E,EAAY,yBAA2B,sBAChDpqF,EAAKoD,KAAK0tD,SAEV7zD,EAAOmG,KAuCPwnF,EAtCN,YACE,IAAIC,EAAQ,EAAGC,EAAY,EAC3B,IAAI,IAAIp7D,EAAS,EAAGA,EAASy6D,EAAUz6D,GAAU26D,EAAU,CACzD,MAAMvmC,EAAO+mC,UACP5tF,EAAKupF,gBAAgB,SAAUxmF,GAAI,IAAW,mCAClDknF,IAEA,MAAM5qD,EAAOmG,EAAK53B,MAAM6kB,EAAQA,EAAS26D,GACnCh+E,QAAe23E,GAAsB1nD,GAK3C,OAJA4qD,IAEAjqF,EAAKyO,OAASzO,EAAKsG,IAAI,2BAA4B6mF,EAAWtmC,EAAMz3C,EAAOsB,WAAY,IAAInB,WAAWH,GAAQxM,OAAQ,IAAI2M,WAAWH,GAAQxB,QAAQhL,QAE9I5C,EAAK+Z,WAAWC,UAAU/K,EAAQ,CACvC6+E,QAASR,EACTS,UAAWlnC,EACXmnC,iBAAkBX,EAClBn6E,MAAO9D,GACC,CACR6+E,YAAY,IACXhjF,MAAK,KACN,GAAG8+E,EACD,SAGA8D,EACF,MAAMj2B,EAAqB,CAACG,KAAM81B,EAAYT,EAAU36D,SAAQulC,MAAOk1B,EAAU1zC,YACjF75C,EAASy6C,OAAOwd,GAEbi2B,GAAaR,IACd1tF,EAASyI,QAAQmlF,GACjBG,GAAW,E,GAEZ9B,EACL,KAAGpC,GAAap1E,MAAMw3E,E,CAE1B,CAEWsC,GACL37E,EAAU,KACd,GAAGw3E,EAAU,OACb,MAAMv+E,EAAImiF,EAAG/tF,OACV4L,EAAEusD,MAAQgyB,GACZv+E,EAAEhB,MAAwBS,KAAKsH,EAAQ,EAI1C,IAAI,IAAIzG,EAAI,EAAGlJ,EAASkkB,KAAKC,IADT4oD,IAC0B0d,GAAavhF,EAAIlJ,IAAUkJ,EACvEyG,IAGF,MAAM03E,EAAc,KAClB,GAAGF,EACD,MAAM,EAAAjsE,EAAA,GAAU,kB,EAqBpB,OAjBAne,EAASkoF,OAAS,KACZkC,GAAa2D,IACf3D,GAAW,EACX6B,GAAa,EAAA9tE,EAAA,GAAU,oB,EAI3Bne,EAASy6C,OAAUwd,IACjBzxD,KAAKmd,UAAUxW,cAAc,oBAAqB8qD,EAAS,EAG7Dj4D,EAASovC,SAAQ,KACZ5oC,KAAKkiF,eAAe7uC,KAAc75C,UAC5BwG,KAAKkiF,eAAe7uC,E,IAIxBrzC,KAAKkiF,eAAe7uC,GAAY75C,CACzC,E,qCGj6Ba,MAAewuF,WAA0Bt1E,EAwBtD5S,cACEoG,QAvBM,KAAA2O,OAA0C,CAAC,EAC3C,KAAAozE,yBAEJ,CAAC,EACG,KAAAC,kBAEJ,CAAC,EACG,KAAAC,qBAUJ,CAAC,EAOHnoF,KAAKooF,mBAAqB,CAC5B,CAIOjzE,QAAQC,GAEb,OAAOpV,KAAKqoF,YAAYjzE,EAAKxY,GAC/B,CAIOmyD,eAA8CjmD,EAAWmL,EAAkC,CAAC,EAAGvY,EAA4B,CAAC,GACjI,IAAI42D,EAAI52D,EAOR,OANA42D,EAAEg2B,qBAAuB,MAAOtoF,KAAKooF,mBAErC91B,EAAI,OAAH,UAAO52D,GACPA,EAAsBqS,UAAYukD,EAAEg2B,qBAG9BtoF,KAAK6T,UAAU/K,EAAQmL,EAAQq+C,EACxC,CAEO7e,kBAAoD6e,G,QASjD,QAAR,EAAAA,EAAEr+C,cAAM,QAARq+C,EAAEr+C,OAAW,CAAC,GACL,QAAT,EAAAq+C,EAAE52D,eAAO,QAAT42D,EAAE52D,QAAY,CAAC,GAGf,MAAM,OAACuY,EAAM,QAAEvY,EAAO,OAAEoN,EAAM,UAAE+oB,GAAaygC,EAEvCi2B,EAAYtqF,KAAKC,UAAU+V,GACjC,IAAI8X,EAaJ,OAZG/rB,KAAK6U,OAAO/L,KACbijB,EAAS/rB,KAAK6U,OAAO/L,GAAQy/E,GAC1Bx8D,IACE8F,UACM7xB,KAAK6U,OAAO/L,GAAQy/E,GAC3Bx8D,OAAS/wB,GAERiZ,EAAemtB,KAAOrV,EAAOqV,OAK7BphC,KAAKghC,uBAA6B,CACvCl4B,SACAm4B,cAAgB7+B,IACd,GAAGA,EAAOzF,EAAEuyB,SAAS,eAEnB,OAAOnD,EAAO3pB,OAGhB,GAAGA,EAAOg/B,KAA+B,CACvC,MAAMA,EAAOh/B,EAAOg/B,KAEhBphC,KAAK6U,OAAO/L,KAAS9I,KAAK6U,OAAO/L,GAAU,CAAC,GAChDijB,EAAS/rB,KAAK6U,OAAO/L,GAAQy/E,GAAa,CACxCnnD,OACAh/B,S,CAIJ,GAAGkwD,EAAErxB,cAAe,CAClB,MAAMunD,EAAYl2B,EAAErxB,cAAc7+B,GAClC,OAAO2pB,EAASA,EAAO3pB,OAASomF,EAAYA,C,CAG9C,OAAOpmF,CAAM,EAEf6R,SACAvY,WAEJ,CAEOo2B,gBAA+ChpB,EAAWmL,EAAkC,CAAC,EAAUvY,EAA4B,CAAC,GACzI,MAAM2xC,EAAIvkC,EAAS,IAAM7K,KAAKC,UAAU+V,GAClC6U,EAAQ9oB,KAAKkoF,kBACnB,OAAGp/D,EAAMukB,GACAvkB,EAAMukB,GAGRvkB,EAAMukB,GAAKrtC,KAAK6T,UAAU/K,EAAQmL,EAAQvY,GAASktC,SAAQ,YACzD9f,EAAMukB,EAAE,GAEnB,CAEOrM,uBAAyDsxB,G,UAOtD,QAAR,EAAAA,EAAEr+C,cAAM,QAARq+C,EAAEr+C,OAAW,CAAC,GACL,QAAT,EAAAq+C,EAAE52D,eAAO,QAAT42D,EAAE52D,QAAY,CAAC,GAEf,MAAM,OAACoN,EAAM,cAAEm4B,EAAa,aAAEiuC,EAAY,OAAEj7D,EAAM,QAAEvY,GAAW42D,EACzDxpC,EAAQ9oB,KAAKioF,yBACbQ,EAAW/sF,EAAQ+sF,UAAYxqF,KAAKC,UAAU+V,GAC9C9P,EAAmB,QAAb,EAAA2kB,EAAMhgB,UAAO,QAAKggB,EAAMhgB,GAAU,IAAI0I,IAC5Ck3E,EAAavkF,EAAIK,IAAIikF,GAC3B,GAAGC,EACD,OAAOA,EAGT,MAAMC,EAAgB,KACpB,MAAMh/E,EAAUxF,EAAIK,IAAIikF,GACxB,OAAO9+E,IAAYqwB,OAAIh/B,EAAY2O,CAAO,EAItCi/E,EADkB5oF,KAAK6T,UAAU/K,EAAQmL,EAAQvY,GACCoJ,MAAM1C,GACrDumF,KAAmB1nD,EAAc7+B,KACtCxE,IACF,MAAM+L,EAAUg/E,IAChB,GAAGh/E,EACD,OAAOA,EAGT,IAAIulE,EACF,MAAMtxE,EAGR,OAAOsxE,EAAatxE,EAAM,IAGtBo8B,EAAI4uD,EAAWhgD,SAAQ,KACxBzkC,EAAIK,IAAIikF,KAAczuD,IAIzB71B,EAAIN,OAAO4kF,GACPtkF,EAAIkP,aACCyV,EAAMhgB,G,IAKjB,OADA3E,EAAI8D,IAAIwgF,EAAUzuD,GACXA,CACT,CAEOuH,mBAAkDz4B,EAAWmL,EAAkC,CAAC,EAAUvY,EAAiF,CAAC,G,MACjM,MAAMotB,EAAyC,QAAjC,EAAA9oB,KAAKmoF,qBAAqBr/E,UAAO,QAAK9I,KAAKmoF,qBAAqBr/E,GAAU,CAAC,EACnFy/E,EAAYtqF,KAAKC,UAAU+V,GAC3Bq0B,EAAOxf,EAAMy/D,GACnB,GAAGjgD,KAAU5sC,EAAQy4B,WAAamU,EAAKy8B,WACrC,OAAOz8B,EAAK3+B,QAYd,IAAI1E,EATDvJ,EAAQy4B,WACNmU,GAAQA,EAAKrjC,UACdD,aAAasjC,EAAKrjC,gBACXqjC,EAAKrjC,gBAGPvJ,EAAQy4B,UAIdz4B,EAAQ8lC,eACTv8B,EAAU2J,EAAA,cAAe,YAChBka,EAAMy/D,EAAU,GACC,IAAvB7sF,EAAQ8lC,qBACJ9lC,EAAQ8lC,cAGjB,MAAM73B,EAAU3J,KAAK6T,UAAU/K,EAAQmL,EAAQvY,GAU/C,OARAotB,EAAMy/D,GAAa,CACjB3oD,UAAWrxB,KAAK1J,MAChBkgE,WAAW,EACX9/D,UACA0E,UACAsK,UAGKtK,CACT,CAEO+xB,WAA0C5yB,EAAWua,GAC1D,MAAMyF,EAAQ9oB,KAAKmoF,qBAAqBr/E,GACxC,GAAGggB,EACD,IAAI,MAAMy/D,KAAaz/D,EAAO,CAC5B,MAAMwf,EAAOxf,EAAMy/D,GACnB,IACKllE,EAAOilB,EAAKr0B,UACVq0B,EAAKrjC,SACND,aAAasjC,EAAKrjC,gBAGb6jB,EAAMy/D,G,CAEf,MAAMj/E,G,EAKd,CAEOunB,UAAUgB,GACf,OAAG7xB,KAAKq2D,SAAWxkC,EACV7xB,KAAKq2D,OAGPr2D,KAAKghC,uBAAuB,CACjCl4B,OAAQ,iBACRmL,OAAQ,CAAC,EACTgtB,cAAgBo1B,IACdr2D,KAAKq2D,OAASA,EACdr2D,KAAKmd,UAAUxW,cAAc,SAAU0vD,GAChCA,GAET36D,QAAS,CAACm2B,cAEd,CAEO+xC,aAAa/xC,GAClB,OAAG7xB,KAAK2jE,YAAc9xC,EACb7xB,KAAK2jE,UAGP3jE,KAAKghC,uBAAuB,CACjCl4B,OAAQ,oBACRmL,OAAQ,CAAC,EACTgtB,cAAgBo1B,I,MAId,OAHAr2D,KAAK2jE,UAAYtN,GACjB,SAA0D,QAAjC,EAAAA,EAAOwyB,kCAA0B,QAAI,IAC9D7oF,KAAKmd,UAAUxW,cAAc,aAAc0vD,GACpCA,CAAM,EAEf36D,QAAS,CAACm2B,cAEd,CAEOrV,SAASze,EAAoByI,GAClC,OAAO,EAAA2mB,EAAA,GAAYntB,KAAK4jE,gBAAiBD,IAYvCn9D,UAAAA,EAAcxG,KAAKmd,UAAU9W,SAE7B,MAAMya,EAb4F,CAChGgoE,IAAK,CAAC,+BAAgC,gCACtCC,UAAW,CAAC,sCAAuC,uCACnD/uE,QAAS,CAAC,+BAAgC,gCAC1Cy+D,cAAe,CAAC,+BAAgC,gCAChD93C,UAAW,CAAC,6BAA8B,8BAC1CqoD,IAAK,CAAC,6BAA8B,8BACpCC,SAAU,sBACVjqC,QAAS,CAAC,+BAAgC,iCAK9BjhD,GAEd,OAAO4lE,EADK7iE,MAAMiD,QAAQ+c,GAAKA,EAAEta,EAAY,EAAI,GAAKsa,EACvB,GAEnC,E,sTCtQK,MAAMooE,WAAmBlB,GA8B9BloF,cACEoG,QACAlG,KAAKG,KAAM,EAAAsI,EAAA,IAAO,OAElBzI,KAAKmpF,iBAAmB,CAAC,EACzBnpF,KAAKopF,oBAAsB,CAAC,EAC5BppF,KAAKqpF,kBAAoB,CAAC,EAC1BrpF,KAAKspF,SAAW,EAChBtpF,KAAKupF,oBAAsB,CAAC,EAE5BvpF,KAAK2Q,cAAgB,cAGrB,mBAAqC,aAAcA,IACjD3Q,KAAKwpF,oBAAoB74E,EAAc,IAOzC+pE,aAAY,KACV16E,KAAK4jE,cAAa,EAAK,GAFW,MAItC,CAEU1mD,QACRld,KAAKoe,kBAAkBC,2BAA2B,CAChDorE,aAAc,KACZzpF,KAAK6wB,WAAU,GACf7wB,KAAK4jE,cAAa,EAAK,IAI3B5jE,KAAKmd,UAAU7W,iBAAiB,aAAa,KACxCtG,KAAKq2D,QACNr2D,KAAKoe,kBAAkBiX,mBAAmB,CAAC14B,EAAG,gB,IAIlDqD,KAAKmd,UAAU7W,iBAAiB,kBAAmBE,IACjDxG,KAAK0pF,mBAAkB,EAAEhgF,YAAWiG,iBAAgBxH,OAAMwI,oBACxD,GAAsB,WAAnBhB,GAAiD,cAAlBgB,EAChC,OAGF,MAAMQ,EAAYzH,EAAUyH,UAC5B,GAAIA,GAKJ,GAAIA,EAA4B3D,WAAY,CAC1C,MAAM9P,EAAMkS,EAA8BzH,EAAMwH,EAAgBnJ,GAC/D2K,EAA4BhC,UAAUzR,E,OANvCsC,KAAKG,IAAIvC,MAAM,0BAA2B8L,E,GAQ5C,GAEN,CAqBQigF,iBAAiBh6E,GAUvB,OAHqC3P,KAAK2Q,aAI5C,CAEQ+4E,kBAAkBhlF,GACxB,IAAI,MAAMiM,KAAiB3Q,KAAKmpF,iBAAkB,CAChD,MAAMS,EAAc5pF,KAAKmpF,iBAAiBx4E,GAC1C,IAAI,MAAMhB,KAAkBi6E,EAAa,CACvC,MAAMC,EAAMD,EAAYj6E,GACxB,IAAI,MAAMxH,KAAQ0hF,EACGA,EAAI1hF,GACZrJ,SAAQ,CAAC4K,EAAWpF,EAAKwG,KAClCpG,EAAS,CACPgF,YACAvB,MAAOA,EACPwH,eAAgBA,EAChBgB,cAAeA,EACfxP,MAAOmD,EACPwlF,MAAOh/E,GACP,G,EAKZ,CAEQ4F,aAAavI,EAAYwH,EAAgCgB,GAC/D,OAAO3Q,KAAK2R,eAAejB,aAAavI,EAAMwH,EAAgBgB,EAAkC,WAAnBhB,EAA6B3P,KAAKmd,UAAU9W,QAC3H,CAEOmjF,oBAAoB74E,GACzB,MAAMo5E,EAAmB/pF,KAAK2Q,cAC9B,GAAGo5E,IAAqBp5E,EACtB,OAGF3Q,KAAKG,IAAI,0BAA2B4pF,EAAkB,KAAMp5E,GAE5D,MAAMq5E,EAAYhqF,KAAKmpF,iBAAiBY,GAClCjyE,EAAY9X,KAAKmpF,iBAAiBx4E,GACxC3Q,KAAKmpF,iBAAiBx4E,GAAiBq5E,EACvChqF,KAAKmpF,iBAAiBY,GAAoBjyE,EAE1C9X,KAAK2Q,cAAgBA,EAErB,IAAI,MAAMs5E,KAAajqF,KAAKqpF,kBAAmB,CAC7C,MAAM1/E,EAAU3J,KAAKqpF,kBAAkBY,UAChCjqF,KAAKqpF,kBAAkBY,GAE9B,MAAMC,EAAYD,EAAUluF,QAAQguF,EAAkBp5E,GACtD3Q,KAAKqpF,kBAAkBa,GAAavgF,EAEpC3J,KAAKG,IAAI,gCAAiC8pF,EAAW,KAAMC,E,CAG7DlqF,KAAK0pF,mBAAmBS,IACtB,MAAMx5E,EAAgB3Q,KAAK2pF,iBAAiBQ,EAAKx6E,gBAC3CwB,EAAYnR,KAAK0Q,aAAay5E,EAAKhiF,KAAMgiF,EAAKx6E,eAAgBgB,GACpE3Q,KAAKoqF,yBAAyBD,EAAKzgF,UAAWyH,EAAU,GAE5D,CAEak5E,c,0CACX,GAAGrqF,KAAKspF,SACN,OAAOtpF,KAAKspF,SAGd,MAAMA,QAAiBgB,GAAA,MAAmB,MAS1C,OARItqF,KAAKspF,WACHA,EAGFtpF,KAAKspF,SAAWA,EAFhBtpF,KAAKuqF,YAAY,eAMdvqF,KAAKspF,QACd,G,CAEajB,YAAYmC,G,0CAOvB,GANwB,iBAAf,GAAgD,iBAAf,IACxCA,EAAW,CAACC,KAAM,EAAGhnE,KAAMlV,KAAK1J,MAAQ,IAAO,EAAGjI,GAAI4tF,EAASnrF,UAAS,KAG1EW,KAAKmd,UAAUxW,cAAc,YAAa6jF,IAEtCA,EAASC,KAAM,CACjB,MAAMnB,QAAiBtpF,KAAKqqF,cAC5BG,EAASC,KAAOnB,C,CAGlBgB,GAAA,MAAmB,CACjBI,UAAWF,GAIf,G,CAEOD,YAAYpiF,GACjB,MAAMwiF,EAAU3qF,KAAKspF,SAClBqB,GACD3qF,KAAK4qF,aAAaD,GAAS7lF,MAAM4E,IAC/B1J,KAAK6qF,mBAAmBnhF,EAAU,IAItC1J,KAAKspF,SAAWnhF,EAEhBmiF,GAAA,MAAmB,CACjBQ,GAAI9qF,KAAKspF,UAEb,CAEayB,S,0CACX,GAAG/qF,KAAKgrF,WACN,OAGFhrF,KAAKgrF,YAAa,EAClB,MAAMC,EAAgC,GAGtC,IAAI,IAAI9iF,EAAO,EAAGA,GAAQ,EAAGA,IAC3B8iF,EAAY3qF,KAFC,KAEa6H,EAAO,aAInC,MAAM+iF,QAAsBvpF,QAAQ0Q,IAAI44E,EAAY9mF,KAAKkD,GAAQijF,GAAA,MAAmBjjF,MAE9E8jF,EAAiC,GACvC,IAAI,IAAIxlF,EAAI,EAAGA,EAAIulF,EAAczuF,OAAQkJ,IACpCulF,EAAcvlF,IACfwlF,EAAe7qF,KAAKN,KAAK6T,UAAU,cAAe,CAAC,EAAG,CAAC1L,KAAOxC,EAAI,EAAYylF,cAAc,KAIhG,MAAMvsF,EAAQ,IAAW,mCACvBmB,KAAKspF,cAAWtuF,QAEV,EAAAqwF,GAAA,IAAe,GAAO,GAC5B,sBACArrF,KAAKmd,UAAUxW,cAAc,cAC/B,IAMA,OAJA5E,WAAWlD,EAAO,KAIX8C,QAAQ0Q,IAAI84E,GAAgBl9E,OAAOrQ,IACxCA,EAAMqwD,SAAU,CAAI,IACnBrlB,QAAQ/pC,EAGb,G,CAEQysF,wBAAwBnjF,EAAYwI,EAA8BhB,GACxE,MAAO,CAACxH,EAAMwI,EAAehB,GAAgB3S,KAAK,IACpD,CAEO4tF,aAAaziF,EAAYzM,EAA4B,CAAC,GAC3D,MAAMiU,EAAiCjU,EAAQyoF,aAAe,WAAczoF,EAAQosF,WAAa,SAAW,SAGtGn3E,EAAgB3Q,KAAK2pF,iBAAiBh6E,GACxC3P,KAAKmpF,iBAAiBx4E,KACxB3Q,KAAKmpF,iBAAiBx4E,GAAiB,CACrCG,OAAQ,CAAC,EACTC,SAAU,CAAC,EACXC,OAAQ,CAAC,IAIb,MAAM8X,EAAQ9oB,KAAKmpF,iBAAiBx4E,GAAehB,GAC9CxH,KAAQ2gB,IACXA,EAAM3gB,GAAQ,IAGhB,MAAMojF,EAAaziE,EAAM3gB,GAEnBqjF,EAAmC,WAAnB77E,GAAiD,UAAlBgB,EAA4B,EAAK3Q,KAAKmd,UAAU9W,QA5SnE,EACA,EA4SlC,GAAGklF,EAAW9uF,QAAU+uF,EAAe,CACrC,IAAI7lF,EAAI6lF,EAAgB,EAAGC,GAAQ,EACnC,KAAM9lF,GAAK,IAAKA,EACd,GAAG4lF,EAAW5lF,GAAG+lF,SAAU,CACzBD,GAAQ,EACR,K,CAIJ,MAAM/hF,EAAY6hF,EAAWzhF,OAAO2hF,EAAQ9lF,EAAI6lF,EAAgB,EAAG,GAAG,GAEtE,OADAD,EAAWrlE,QAAQxc,GACZ/H,QAAQM,QAAQyH,E,CAGzB,IAAIwqC,EAASl0C,KAAKsrF,wBAAwBnjF,EAAMwI,EAAehB,GAC/D,GAAG3P,KAAKqpF,kBAAkBn1C,GACxB,OAAOl0C,KAAKqpF,kBAAkBn1C,GAGhC,MAAMy3C,EAAgB,KAAKxjF,aACrB8wD,EAAmB,KAAK9wD,gBAE9B,IAAIgJ,EAAYnR,KAAK0Q,aAAavI,EAAMwH,EAAgBgB,GACxD,OAAO3Q,KAAKqpF,kBAAkBn1C,GAAUvyC,QAAQ0Q,IAAI,CAACs5E,EAAI1yB,GAAI90D,KAAKkD,GAAQijF,GAAA,MAAmBjjF,MAC5FvC,MAAK,EAAO8mF,EAAYC,KAAmB,mCAC1C,IAAIniF,EAAyB9L,EAC7B,GAAGguF,GAAoC,MAAtBA,EAAWnvF,OAAgB,CACtCovF,GAA0C,KAAzBA,EAAcpvF,SACjCovF,EAAgB,oBAGlB,MAAMC,GAAU,EAAAC,GAAA,GAAaH,GACvBI,SAAmB,iBAA0B,OAAQF,IAAUrkF,OAAO,GACtEwkF,GAAa,EAAAF,GAAA,GAAaF,GAEhCniF,EAAY1J,KAAK22C,iBAAiBi0C,aAAaziF,EAAM2jF,EAASE,EAAWC,EAAYvwF,E,MAErF,IACE,MAAMwZ,QAAalV,KAAKksF,WAAWh3E,KAAK/M,GAExCmiF,GAAA,MAAmB,CACjB,CAACqB,GAAK7+E,EAAWoI,EAAK42E,SACtB,CAAC7yB,GAAKnsD,EAAWoI,EAAK+2E,cAGxBviF,EAAY1J,KAAK22C,iBAAiBi0C,aAAaziF,EAAM+M,EAAK42E,QAAS52E,EAAK82E,UAAW92E,EAAK+2E,WAAYvwF,E,CACpG,MAAMywF,GACNvuF,EAAQuuF,C,CAKZ,MAAMC,EAAmBpsF,KAAK2pF,iBAAiBh6E,GAmB/C,GAlBGy8E,IAAqBz7E,IACtBujC,EAASl0C,KAAKsrF,wBAAwBnjF,EAAMikF,EAAkBz8E,GAC9DwB,EAAU3H,UACVuG,EAAes8E,gBAAgBrsF,KAAK2R,eAAevB,cAAee,GAE/DzH,IACDyH,EAAYnR,KAAK0Q,aAAavI,EAAMwH,EAAgBy8E,IAGtDpsF,KAAKG,IAAI,uDAAwDwQ,EAAe,KAAMy7E,WAOjFpsF,KAAKqpF,kBAAkBn1C,GAE3Bt2C,EAED,MADAoC,KAAKG,IAAI,sBAAuBvC,EAAQA,EAAgB0uF,OAClD1uF,EAMR,OAHAoC,KAAKoqF,yBAAyB1gF,EAAWyH,GACzCo6E,EAAWrlE,QAAQxc,GACnB1J,KAAK6qF,mBAAmBnhF,GACjBA,CACT,KACF,CAEO6iF,iBAAiBpkF,GACtB,OAAOnI,KAAK4qF,aAAaziF,GAAMrD,KAAKuqD,GAAA,EAAMA,GAAA,EAC5C,CAEQ+6B,yBAAyB1gF,EAAyByH,GACxD,MAAMq7E,EAAe9iF,EAAUyH,UAC5Bq7E,GACDz8E,EAAes8E,gBAAgBrsF,KAAK2R,eAAevB,cAAeo8E,GAGpE9iF,EAAU+iF,gBAAgBt7E,EAC5B,CAEQu7E,iBAAiBhjF,GACvB1J,KAAKG,IAAI,kBAAmBuJ,EAAUvB,MACtCuB,EAAUijF,aAAU3xF,EACpBgF,KAAKoqF,yBAAyB1gF,GAC9BA,EAAUF,UACVxJ,KAAK22C,iBAAiBi2C,gBAAgBljF,GACtCqG,EAAes8E,gBAAgBrsF,KAAKmpF,iBAAkBz/E,EACxD,CAEOmhF,mBAAmBnhF,GACrBA,EAAUijF,UAI0BjjF,EAAUmjF,gBAC/ClrF,QAAQM,SAAQ,GAChBjC,KAAKqqF,cAAcvlF,MAAMwkF,GAAa5/E,EAAUvB,OAASmhF,KAC9CxkF,MAAMgoF,IACdpjF,EAAUijF,SAIVG,IACDpjF,EAAUijF,QAAU,IAAM3sF,KAAK0sF,iBAAiBhjF,GAChDA,EAAUqjF,kB,GAGhB,CAEOv1D,oBAAoB9yB,GACzB1E,KAAKgtF,iBAAmBtoF,EACxB1E,KAAK22C,iBAAiBnf,oBAAoB9yB,EAC5C,CAEOmP,UAAyC/K,EAAWmL,EAAkC,CAAC,EAAGvY,EAA4B,CAAC,GAQ5H,MAAMlC,GAAW,SAEjB,IA4DI2O,EAEA8kF,GA9DA,eAACt+B,EAAc,qBAAE25B,GAAwB5sF,EAO7C,GANG4sF,GACD9uF,EAASsL,MAAK,YACL9E,KAAKupF,oBAAoBjB,EAAqB,IAItD,KAAgB,CACjB,MAAM4E,EAAY3+E,KAAK1J,MACjBmyB,EAAWpoB,EAAA,eAAgB,KAC3Bq+E,GAAoBA,EAAgBE,aACtCntF,KAAKG,IAAIvC,MAAM,+BAAgCkL,EAAQmL,EAAQvY,EAAS,SAAU6S,KAAK1J,MAAQqoF,GAAa,I,GAG7G,KAEH1zF,EAASyU,MAAMohD,GAAA,GAAMzmB,SAAQ,KAC3BzR,cAAcH,EAAS,G,CA8C3B,MAAMs1D,GAAQ,IAAKthF,OAASshF,OAAS,cAC/Bc,EAAiB,KACrB,GAAGz+B,EAAgB,CACjB,MAAMzxC,EAAQld,KAAKupF,oBAAoB56B,GACpCzxC,IACDxhB,EAAQizD,eAAiBzxC,EAAMnP,U,CAInC,MAAMpE,EAAUsjF,EAAgBI,YAAYvkF,EAAQmL,EAAQvY,GAS5D,OAPG4sF,IACDtoF,KAAKupF,oBAAoBjB,GAAwB,CAC/Cv6E,UAAYrS,EAAsBqS,UAClCpE,QAASnQ,IAINmQ,EAAQsE,OAAOrQ,I,MAMpB,GAJkB,2BAAfA,EAAMG,MACPiC,KAAKG,IAAIvC,MAAM,QAASA,EAAM0X,KAAM1X,EAAMG,KAAMiC,KAAKspF,SAAUnhF,EAAMW,EAAQmL,GAG7D,MAAfrW,EAAM0X,MAAgBtV,KAAKspF,WAAanhF,EAOzC,KANkB,4BAAfvK,EAAMG,OACPusF,GAAA,SAAsB,MACtBA,GAAA,SAAsB,cAIlB1sF,EACD,GAAkB,MAAfA,EAAM0X,MAAgBtV,KAAKspF,UAAYnhF,IAASnI,KAAKspF,SAAU,CACvE,QAAsCtuF,IAAnCgF,KAAKopF,oBAAoBjhF,GAAqB,CAC/C,MAAMwB,EAAU,IAAIhI,SAAQ,CAAC2rF,EAAeC,KAC1CvtF,KAAK6T,UAAU,2BAA4B,CAACklB,MAAO5wB,GAAO,CAACmvB,YAAY,IAAOxyB,MAAM0oF,IAClFxtF,KAAK6T,UAAU,2BAA4B,CACzCjX,GAAI4wF,EAAa5wF,GACjBmQ,MAAOygF,EAAazgF,OACnB,CAAC5E,OAAMmvB,YAAY,IAAOxyB,KAAKwoF,EAAeC,EAAa,GAC7DA,EAAa,IAGlBvtF,KAAKopF,oBAAoBjhF,GAAQwB,C,CAGnC,OAAO3J,KAAKopF,oBAAoBjhF,GAAMrD,MAAK,IAAMsoF,K,CAC5C,GAAkB,MAAfxvF,EAAM0X,KAWT,IAAkB,MAAf1X,EAAM0X,MAAuD,IAAvC1X,EAAMG,KAAKtD,QAAQ,gBAAuB,CACxE,MAAMgzF,GAAW7vF,EAAMG,KAAKjD,MAAM,yBAAyB,GAC3D,GAAG2yF,IAAYtlF,EAEb,OADAzM,EAAQyM,KAAOslF,EACRztF,KAAK6T,UAAU/K,EAAQmL,EAAQvY,GAEtC,MAAMkC,C,CAEH,GAAkB,MAAfA,EAAM0X,MAA+B,0BAAf1X,EAAMG,KAEpC,OADAiC,KAAK22C,iBAAiB+2C,wBACfN,IACF,GAAI1xF,EAAQiyF,UAA2B,MAAf/vF,EAAM0X,KAQ9B,KAAI5Z,EAAQiyF,UAAY,CAAC,kBAAmB,oBAAoBz+D,SAAStxB,EAAMG,MAAO,CAC3F,MAAMmf,EAAQld,KAAKupF,oBAAoB56B,GAKvC,OAHAA,OAAiB3zD,SACVU,EAAQizD,eAEZzxC,EAAcA,EAAMvT,QAAQ7E,MAAK,IAAMsoF,MAC9BA,G,CACP,GAAI1xF,EAAQiyF,UAA2B,MAAf/vF,EAAM0X,KAU9B,IAAkB,YAAf1X,EAAMG,MAAqC,4BAAfH,EAAMG,KAC1C,OAAO,EAAAgM,EAAA,GAAM,KAAMjF,MAAK,IAAMsoF,MAE9B,MAAMxvF,C,CAb2C,CACjD,MAAMiH,EAAM0J,KAAK1J,MACjB,GAAGnJ,EAAQghD,UACN73C,GAAOnJ,EAAQghD,SAChB,MAAM9+C,EAKV,OADAlC,EAAQkyF,SAAWlyF,EAAQkyF,SAAWjtE,KAAKC,IAAI,GAAuB,IAAnBllB,EAAQkyF,UAAkB,GACtE,EAAA7jF,EAAA,GAAyB,IAAnBrO,EAAQkyF,UAAiB9oF,MAAK,IAAMsoF,K,EAzBA,CACjD,MAAMQ,GAAYhwF,EAAMG,KAAKjD,MAAM,qBAAqB,IAAM,EAE9D,GAAG8yF,GAAmC,QAAvB,EAAAlyF,EAAQmyF,uBAAe,QAAI,MAAQnyF,EAAQ4sF,qBACxD,MAAM1qF,EAGR,OAAO,EAAAmM,EAAA,GAAqC,IAA/B6jF,GAAqC9oF,MAAK,IAAMsoF,K,EA7BjC,CAC5B,MAAMK,GAAW7vF,EAAMG,KAAKjD,MAAM,yDAAyD,GAC3F,GAAG2yF,IAAYtlF,EAOb,OANGzM,EAAQyM,KACTzM,EAAQyM,KAAOslF,EAEfztF,KAAKuqF,YAAYkD,GAGZztF,KAAK6T,UAAU/K,EAAQmL,EAAQvY,E,IA4C1C,EAGJ,IAAIs+B,EAiBJ,OAfEA,GADC7xB,EAAQzM,EAAQyM,MAAQnI,KAAKspF,UAC1BtpF,KAAK4qF,aAAaziF,EAAMzM,GAExBsE,KAAKqqF,cAAcvlF,MAAMwkF,GAAatpF,KAAK4qF,aAAaziF,EAAOmhF,EAAU5tF,KAG/Es+B,EAAEl1B,MAAM4E,IACNujF,EAAkBvjF,EAClB,MAAMC,EAAUyjF,IAEhB,OADAH,EAAgBa,cAAct0F,EAAUkC,GACjCiO,CAAO,IAEf7E,KAAKtL,EAASyI,SACdgM,OA/J2BrQ,GAAoB,mCAY9C,GAXIA,GAEO,EAAA4lB,GAAA,GAAS5lB,KAClBA,EAAQ,CAACiE,QAASjE,IAFlBA,EAAQ,CAACG,KAAM,gBAKE,MAAfH,EAAM0X,MAA+B,oBAAf1X,EAAMG,MACd,MAAfH,EAAM0X,MAA+B,wBAAf1X,EAAMG,OAC7BiC,KAAK+qF,SAGJrvF,EAAQ0vF,aACT,MAAMxtF,EAuBR,MApBkB,MAAfA,EAAM0X,OACP1X,EAAMqwD,SAAU,GAGdvyD,EAAQ47B,aACV15B,EAAMmgC,MAAQj1B,EACdlL,EAAM0uF,MAAQA,GAAU1uF,EAAMmwF,eAAiBnwF,EAAMmwF,cAAczB,OAAU1uF,EAAM0uF,QAAS,IAAKthF,OAASshF,MAC1GvqF,YAAW,KACLnE,EAAMqwD,UACU,MAAfrwD,EAAM0X,MACPtV,KAAK+qF,SAKPntF,EAAMqwD,SAAU,E,GAEjB,MAGCrwD,CACR,MA2HCqQ,MAAMzU,EAASoI,QAETpI,CACT,ECrpBF,MAAMw0F,GAIJluF,cAHQ,KAAAmuF,YAAiD,IAAIz8E,IACrD,KAAA08E,cAAmD,IAAI18E,IAG7DxR,KAAKo0B,cAAa,EACpB,CAEUlX,QACRld,KAAKmd,UAAU7W,iBAAiB,aAAa,KAC3CtG,KAAKmnB,YAAYnnB,KAAK8a,gBAAgB7b,OAAQ,OAAO,GAEzD,CAEOkoB,YAAYloB,EAAgBoI,GACjC,IAAIY,EAAMjI,KAAKiuF,YAAYzpF,IAAIvF,GAC5BgJ,GAAOA,EAAIvJ,IAAI2I,KAIdY,IACFA,EAAM,IAAI7J,IACV4B,KAAKiuF,YAAYhmF,IAAIhJ,EAAQgJ,IAG/BA,EAAIlJ,IAAIsI,GAERrH,KAAK2G,cAAc,aAAc1H,GACnC,CAEO6oB,YAAY7oB,EAAgBoI,GACjC,MAAMY,EAAMjI,KAAKiuF,YAAYzpF,IAAIvF,GAC7BgJ,IAIJA,EAAIpE,OAAOwD,GAEPY,EAAIoL,OACNrT,KAAKiuF,YAAYpqF,OAAO5E,GACxBe,KAAK2G,cAAc,eAAgB1H,IAEvC,CAEO8nB,mBAAmB/O,EAAiC3Q,GACtDvG,MAAMiD,QAAQiU,KACfA,EAAU,IAAI5Z,IAAI4Z,IAGpB,IAAI/P,EAAMjI,KAAKkuF,cAAc1pF,IAAI6C,GACjC,GAAGY,EAAK,CACN,IAAI,MAAMhJ,KAAUgJ,EACf+P,EAAQtZ,IAAIO,KAIfe,KAAK8nB,YAAY7oB,EAAQoI,GACzBY,EAAIpE,OAAO5E,IAGb,IAAIgJ,EAAIoL,OAAS2E,EAAQ3E,KAEvB,YADArT,KAAKkuF,cAAcrqF,OAAOwD,E,CAK9B,GAAG2Q,EAAQ3E,KAAM,CACXpL,IACFA,EAAM,IAAI7J,IACV4B,KAAKkuF,cAAcjmF,IAAIZ,EAAKY,IAG9B,IAAI,MAAMhJ,KAAU+Y,EACf/P,EAAIvJ,IAAIO,KAIXe,KAAKmnB,YAAYloB,EAAQoI,GACzBY,EAAIlJ,IAAIE,G,CAGd,CAEOq8B,aAAar8B,GAClB,OAAOe,KAAKiuF,YAAYvvF,IAAIO,EAC9B,EAOFozB,GAAY27D,GAAc,CAAC,IAAmBt7E,IAE9C,YCrFMy7E,GAAgB,KAIP,MAAMC,GAArB,cACU,KAAAC,YAA2B,CAAC,CA4BtC,CA1BUn6C,OAAO97B,G,MACb,OAAOA,EAAMzb,GAA0B,QAApB,EAAAyb,EAAkBxb,UAAE,QAAKwb,EAAsB1a,IACpE,CAEOq0C,gBAAgB35B,EAA0BsqD,EAAoByrB,I,YAKnE,MAAMrlE,EAA2C,QAAtC,KAAG9oB,KAAKquF,aAAW,EAACruF,KAAKk0C,OAAO97B,WAAM,aAAM,CAAC,EACxD,OAAsB,QAAtB,EAAO0Q,EAAM45C,UAAS,QAAf55C,EAAM45C,GAAe,CAACnvB,WAAY,EAAG71C,IAAK,GAAIK,KAAM2kE,EAC7D,CAEO1wB,mBAAmB55B,EAA0BsqD,EAAoByrB,GAAezwF,EAAa61C,EAAqB,GACvH,MAAMN,EAAejzC,KAAK+xC,gBAAgB35B,EAAOsqD,GAGjD,OAFAzvB,EAAav1C,IAAMA,EACnBu1C,EAAaM,WAAaA,EACnBN,CACT,CAEOpD,mBAAmBz3B,EAA0BsqD,EAAoByrB,IACtE,MAAMrlE,EAAQ9oB,KAAKquF,YAAYruF,KAAKk0C,OAAO97B,IACxC0Q,UACMA,EAAM45C,EAEjB,EC5BF,UAAgB,QAAU,CAAC,aAAe,CAAC,CAAC,GAAK,UAAU,UAAY,SAAS,OAAS,GAAG,KAAO,YAAY,CAAC,GAAK,SAAS,UAAY,QAAQ,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,KAAK,KAAO,SAAS,CAAC,KAAO,iCAAiC,KAAO,iBAAiB,KAAO,SAAS,CAAC,IAAM,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,SAAS,CAAC,KAAO,IAAI,KAAO,SAAS,CAAC,KAAO,IAAI,KAAO,SAAS,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,KAAK,KAAO,QAAQ,KAAO,kBAAkB,CAAC,GAAK,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,SAAS,CAAC,KAAO,IAAI,KAAO,SAAS,CAAC,KAAO,IAAI,KAAO,SAAS,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,QAAQ,KAAO,kBAAkB,CAAC,IAAM,UAAU,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,mBAAmB,KAAO,UAAU,KAAO,oBAAoB,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,IAAI,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,SAAS,CAAC,KAAO,MAAM,KAAO,SAAS,CAAC,KAAO,cAAc,KAAO,QAAQ,KAAO,wBAAwB,CAAC,GAAK,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,MAAM,KAAO,UAAU,KAAO,wBAAwB,CAAC,GAAK,WAAW,UAAY,YAAY,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,kBAAkB,KAAO,WAAW,KAAO,+BAA+B,CAAC,GAAK,WAAW,UAAY,eAAe,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,kBAAkB,KAAO,WAAW,KAAO,+BAA+B,CAAC,IAAM,WAAW,UAAY,cAAc,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,kBAAkB,KAAO,WAAW,KAAO,+BAA+B,CAAC,GAAK,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,QAAQ,CAAC,KAAO,mBAAmB,KAAO,QAAQ,CAAC,KAAO,mBAAmB,KAAO,QAAQ,CAAC,KAAO,kBAAkB,KAAO,QAAQ,CAAC,KAAO,aAAa,KAAO,QAAQ,KAAO,oBAAoB,CAAC,IAAM,UAAU,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,WAAW,KAAO,aAAa,CAAC,GAAK,UAAU,UAAY,YAAY,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,gBAAgB,KAAO,WAAW,KAAO,YAAY,CAAC,GAAK,WAAW,UAAY,qBAAqB,OAAS,GAAG,KAAO,iBAAiB,CAAC,IAAM,UAAU,UAAY,6BAA6B,OAAS,GAAG,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,iBAAiB,CAAC,GAAK,UAAU,UAAY,cAAc,OAAS,CAAC,CAAC,KAAO,cAAc,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,cAAc,CAAC,IAAM,WAAW,UAAY,eAAe,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,wBAAwB,KAAO,eAAe,CAAC,GAAK,UAAU,UAAY,OAAO,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,QAAQ,CAAC,IAAM,UAAU,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,SAAS,KAAO,qBAAqB,CAAC,GAAK,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,SAAS,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,QAAQ,CAAC,KAAO,YAAY,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,cAAc,CAAC,GAAK,WAAW,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,qBAAqB,KAAO,oBAAoB,CAAC,GAAK,WAAW,UAAY,UAAU,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,WAAW,CAAC,IAAM,UAAU,UAAY,WAAW,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,YAAY,KAAO,eAAe,CAAC,GAAK,UAAU,UAAY,cAAc,OAAS,CAAC,CAAC,KAAO,cAAc,KAAO,UAAU,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,WAAW,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,iBAAiB,KAAO,WAAW,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,gBAAgB,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,QAAQ,KAAO,sBAAsB,CAAC,IAAM,UAAU,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,gBAAgB,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,kBAAkB,KAAO,SAAS,KAAO,sBAAsB,CAAC,GAAK,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,IAAM,UAAU,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,GAAK,SAAS,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,UAAU,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,UAAU,KAAO,eAAe,CAAC,GAAK,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,gBAAgB,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,gBAAgB,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,mBAAmB,CAAC,IAAM,UAAU,UAAY,sBAAsB,OAAS,GAAG,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,wBAAwB,OAAS,GAAG,KAAO,qBAAqB,CAAC,IAAM,UAAU,UAAY,wBAAwB,OAAS,GAAG,KAAO,sBAAsB,QAAU,CAAC,CAAC,IAAM,WAAW,OAAS,eAAe,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,SAAS,CAAC,IAAM,UAAU,OAAS,gBAAgB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,IAAI,KAAO,SAAS,CAAC,KAAO,IAAI,KAAO,SAAS,CAAC,KAAO,yBAAyB,KAAO,QAAQ,CAAC,KAAO,iBAAiB,KAAO,UAAU,KAAO,oBAAoB,CAAC,IAAM,UAAU,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,iBAAiB,KAAO,UAAU,KAAO,+BAA+B,CAAC,GAAK,WAAW,OAAS,kBAAkB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,SAAS,KAAO,iBAAiB,CAAC,IAAM,WAAW,OAAS,mBAAmB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,QAAQ,KAAO,eAAe,CAAC,GAAK,WAAW,OAAS,OAAO,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,mBAAmB,KAAO,QAAQ,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,kBAAkB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,SAAS,KAAO,qBAAqB,CAAC,IAAM,WAAW,OAAS,YAAY,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,QAAQ,KAAO,YAAY,CAAC,IAAM,UAAU,OAAS,mBAAmB,OAAS,GAAG,KAAO,uBAAuB,IAAM,CAAC,aAAe,CAAC,CAAC,IAAM,WAAW,UAAY,YAAY,OAAS,GAAG,KAAO,QAAQ,CAAC,IAAM,WAAW,UAAY,WAAW,OAAS,GAAG,KAAO,QAAQ,CAAC,GAAK,WAAW,UAAY,OAAO,OAAS,GAAG,KAAO,QAAQ,CAAC,GAAK,UAAU,UAAY,SAAS,OAAS,GAAG,KAAO,YAAY,CAAC,IAAM,UAAU,UAAY,QAAQ,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,SAAS,CAAC,GAAK,WAAW,UAAY,OAAO,OAAS,GAAG,KAAO,QAAQ,CAAC,GAAK,WAAW,UAAY,iBAAiB,OAAS,GAAG,KAAO,aAAa,CAAC,GAAK,WAAW,UAAY,gBAAgB,OAAS,GAAG,KAAO,aAAa,CAAC,GAAK,UAAU,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,iBAAiB,OAAS,GAAG,KAAO,aAAa,CAAC,IAAM,UAAU,UAAY,gBAAgB,OAAS,GAAG,KAAO,aAAa,CAAC,IAAM,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,WAAW,KAAO,gBAAgB,CAAC,IAAM,UAAU,UAAY,YAAY,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,WAAW,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,kBAAkB,OAAS,GAAG,KAAO,cAAc,CAAC,GAAK,UAAU,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,WAAW,KAAO,iCAAiC,CAAC,KAAO,cAAc,KAAO,gBAAgB,KAAO,cAAc,CAAC,IAAM,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,cAAc,CAAC,KAAO,cAAc,KAAO,gBAAgB,KAAO,cAAc,CAAC,IAAM,UAAU,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,kBAAkB,KAAO,cAAc,CAAC,IAAM,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,cAAc,CAAC,GAAK,UAAU,UAAY,sBAAsB,OAAS,GAAG,KAAO,kBAAkB,CAAC,IAAM,UAAU,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,qBAAqB,CAAC,KAAO,QAAQ,KAAO,qBAAqB,CAAC,KAAO,iBAAiB,KAAO,mBAAmB,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,eAAe,KAAO,kBAAkB,CAAC,IAAM,UAAU,UAAY,qBAAqB,OAAS,GAAG,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,kBAAkB,KAAO,gBAAgB,KAAO,iBAAiB,CAAC,GAAK,UAAU,UAAY,kBAAkB,OAAS,GAAG,KAAO,cAAc,CAAC,GAAK,WAAW,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,iBAAiB,KAAO,UAAU,KAAO,cAAc,CAAC,IAAM,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,iBAAiB,KAAO,UAAU,KAAO,qBAAqB,CAAC,GAAK,WAAW,UAAY,WAAW,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,QAAQ,CAAC,GAAK,UAAU,UAAY,WAAW,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,QAAQ,CAAC,IAAM,WAAW,UAAY,sBAAsB,OAAS,GAAG,KAAO,oBAAoB,CAAC,GAAK,WAAW,UAAY,sBAAsB,OAAS,GAAG,KAAO,oBAAoB,CAAC,GAAK,QAAQ,UAAY,mBAAmB,OAAS,GAAG,KAAO,oBAAoB,CAAC,IAAM,UAAU,UAAY,kBAAkB,OAAS,GAAG,KAAO,oBAAoB,CAAC,GAAK,UAAU,UAAY,kBAAkB,OAAS,GAAG,KAAO,oBAAoB,CAAC,IAAM,WAAW,UAAY,kBAAkB,OAAS,GAAG,KAAO,oBAAoB,CAAC,GAAK,WAAW,UAAY,kBAAkB,OAAS,GAAG,KAAO,oBAAoB,CAAC,GAAK,WAAW,UAAY,kBAAkB,OAAS,GAAG,KAAO,oBAAoB,CAAC,IAAM,WAAW,UAAY,kBAAkB,OAAS,GAAG,KAAO,oBAAoB,CAAC,GAAK,UAAU,UAAY,mBAAmB,OAAS,GAAG,KAAO,oBAAoB,CAAC,IAAM,UAAU,UAAY,YAAY,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,SAAS,KAAO,QAAQ,CAAC,GAAK,WAAW,UAAY,wBAAwB,OAAS,GAAG,KAAO,oBAAoB,CAAC,IAAM,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,oBAAoB,CAAC,GAAK,UAAU,UAAY,kBAAkB,OAAS,GAAG,KAAO,cAAc,CAAC,IAAM,UAAU,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,KAAO,cAAc,CAAC,GAAK,QAAQ,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,QAAQ,KAAO,cAAc,CAAC,GAAK,UAAU,UAAY,YAAY,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,SAAS,KAAO,QAAQ,CAAC,GAAK,WAAW,UAAY,OAAO,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,iBAAiB,CAAC,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,KAAO,aAAa,KAAO,iBAAiB,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,aAAa,CAAC,KAAO,qBAAqB,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,wBAAwB,CAAC,KAAO,eAAe,KAAO,4BAA4B,CAAC,KAAO,wBAAwB,KAAO,8BAA8B,KAAO,QAAQ,CAAC,GAAK,WAAW,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,QAAQ,CAAC,IAAM,UAAU,UAAY,WAAW,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,mBAAmB,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,oBAAoB,CAAC,KAAO,aAAa,KAAO,iBAAiB,CAAC,KAAO,kBAAkB,KAAO,sBAAsB,CAAC,KAAO,kBAAkB,KAAO,+BAA+B,CAAC,KAAO,WAAW,KAAO,2BAA2B,CAAC,KAAO,gBAAgB,KAAO,eAAe,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,2BAA2B,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,4BAA4B,KAAO,iBAAiB,CAAC,KAAO,iBAAiB,KAAO,mBAAmB,CAAC,KAAO,mBAAmB,KAAO,gBAAgB,CAAC,KAAO,oBAAoB,KAAO,yBAAyB,CAAC,KAAO,sBAAsB,KAAO,2BAA2B,KAAO,YAAY,CAAC,IAAM,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,mBAAmB,KAAO,4BAA4B,KAAO,oBAAoB,CAAC,GAAK,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,eAAe,KAAO,2BAA2B,CAAC,KAAO,UAAU,KAAO,QAAQ,KAAO,oBAAoB,CAAC,GAAK,UAAU,UAAY,iBAAiB,OAAS,GAAG,KAAO,aAAa,CAAC,GAAK,UAAU,UAAY,YAAY,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,eAAe,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,iBAAiB,KAAO,WAAW,CAAC,GAAK,UAAU,UAAY,UAAU,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,MAAM,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,iBAAiB,CAAC,KAAO,OAAO,KAAO,iBAAiB,CAAC,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,KAAO,SAAS,KAAO,iBAAiB,CAAC,KAAO,YAAY,KAAO,iBAAiB,CAAC,KAAO,SAAS,KAAO,iBAAiB,CAAC,KAAO,aAAa,KAAO,iBAAiB,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,4BAA4B,CAAC,KAAO,aAAa,KAAO,iBAAiB,CAAC,KAAO,WAAW,KAAO,8BAA8B,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,wBAAwB,CAAC,KAAO,eAAe,KAAO,uBAAuB,CAAC,KAAO,WAAW,KAAO,iCAAiC,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,2BAA2B,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,mBAAmB,CAAC,KAAO,aAAa,KAAO,iBAAiB,CAAC,KAAO,YAAY,KAAO,6BAA6B,CAAC,KAAO,qBAAqB,KAAO,sCAAsC,CAAC,KAAO,aAAa,KAAO,iBAAiB,KAAO,WAAW,CAAC,GAAK,UAAU,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,MAAM,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,iBAAiB,CAAC,KAAO,OAAO,KAAO,iBAAiB,CAAC,KAAO,SAAS,KAAO,iBAAiB,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,8BAA8B,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,iBAAiB,CAAC,KAAO,aAAa,KAAO,iBAAiB,KAAO,WAAW,CAAC,GAAK,WAAW,UAAY,oBAAoB,OAAS,GAAG,KAAO,gBAAgB,CAAC,GAAK,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,CAAC,KAAO,cAAc,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,GAAK,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,aAAa,KAAO,gBAAgB,CAAC,GAAK,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,gBAAgB,CAAC,IAAM,WAAW,UAAY,0BAA0B,OAAS,GAAG,KAAO,gBAAgB,CAAC,IAAM,WAAW,UAAY,qBAAqB,OAAS,GAAG,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,+BAA+B,OAAS,GAAG,KAAO,iBAAiB,CAAC,GAAK,UAAU,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,iBAAiB,CAAC,IAAM,UAAU,UAAY,SAAS,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,OAAO,CAAC,KAAO,oBAAoB,KAAO,OAAO,CAAC,KAAO,qBAAqB,KAAO,OAAO,CAAC,KAAO,eAAe,KAAO,OAAO,CAAC,KAAO,wBAAwB,KAAO,OAAO,CAAC,KAAO,yBAAyB,KAAO,OAAO,CAAC,KAAO,kBAAkB,KAAO,sBAAsB,CAAC,KAAO,MAAM,KAAO,eAAe,CAAC,KAAO,QAAQ,KAAO,wBAAwB,CAAC,KAAO,YAAY,KAAO,eAAe,CAAC,KAAO,aAAa,KAAO,gBAAgB,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,SAAS,KAAO,SAAS,CAAC,IAAM,SAAS,UAAY,QAAQ,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,iBAAiB,KAAO,SAAS,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,qBAAqB,CAAC,KAAO,cAAc,KAAO,6BAA6B,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,SAAS,CAAC,GAAK,UAAU,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,aAAa,CAAC,GAAK,WAAW,UAAY,YAAY,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,IAAI,KAAO,OAAO,CAAC,KAAO,IAAI,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,aAAa,CAAC,GAAK,SAAS,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,IAAI,KAAO,OAAO,CAAC,KAAO,IAAI,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,UAAU,KAAO,aAAa,CAAC,GAAK,UAAU,UAAY,gBAAgB,OAAS,GAAG,KAAO,YAAY,CAAC,IAAM,WAAW,UAAY,WAAW,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,kBAAkB,KAAO,gBAAgB,KAAO,YAAY,CAAC,GAAK,WAAW,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,qBAAqB,CAAC,KAAO,kBAAkB,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,yBAAyB,CAAC,KAAO,UAAU,KAAO,gBAAgB,KAAO,iBAAiB,CAAC,GAAK,UAAU,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,0BAA0B,KAAO,gBAAgB,CAAC,KAAO,yBAAyB,KAAO,eAAe,CAAC,KAAO,eAAe,KAAO,eAAe,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,sBAAsB,CAAC,IAAM,WAAW,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,UAAU,KAAO,8BAA8B,CAAC,IAAM,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,cAAc,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,mBAAmB,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,WAAW,UAAY,mBAAmB,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,UAAU,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,QAAQ,KAAO,8BAA8B,KAAO,2BAA2B,CAAC,IAAM,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,YAAY,KAAO,6BAA6B,CAAC,KAAO,gBAAgB,KAAO,6BAA6B,CAAC,KAAO,cAAc,KAAO,8BAA8B,KAAO,sBAAsB,CAAC,IAAM,WAAW,UAAY,eAAe,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,0BAA0B,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,KAAO,yBAAyB,KAAO,iBAAiB,CAAC,KAAO,eAAe,KAAO,eAAe,CAAC,KAAO,qBAAqB,KAAO,kBAAkB,CAAC,KAAO,oBAAoB,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,IAAM,WAAW,UAAY,YAAY,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,YAAY,CAAC,KAAO,WAAW,KAAO,8BAA8B,KAAO,aAAa,CAAC,GAAK,WAAW,UAAY,wBAAwB,OAAS,GAAG,KAAO,gBAAgB,CAAC,GAAK,UAAU,UAAY,4BAA4B,OAAS,GAAG,KAAO,gBAAgB,CAAC,GAAK,UAAU,UAAY,+BAA+B,OAAS,GAAG,KAAO,gBAAgB,CAAC,IAAM,WAAW,UAAY,8BAA8B,OAAS,GAAG,KAAO,gBAAgB,CAAC,IAAM,WAAW,UAAY,yBAAyB,OAAS,GAAG,KAAO,gBAAgB,CAAC,IAAM,UAAU,UAAY,WAAW,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,wBAAwB,KAAO,gBAAgB,CAAC,KAAO,sBAAsB,KAAO,gBAAgB,CAAC,KAAO,kBAAkB,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,iBAAiB,CAAC,KAAO,wBAAwB,KAAO,iBAAiB,CAAC,KAAO,2BAA2B,KAAO,iBAAiB,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,iBAAiB,KAAO,kBAAkB,CAAC,KAAO,gBAAgB,KAAO,iBAAiB,CAAC,KAAO,iBAAiB,KAAO,kBAAkB,CAAC,KAAO,kBAAkB,KAAO,sBAAsB,CAAC,KAAO,WAAW,KAAO,mBAAmB,CAAC,KAAO,gBAAgB,KAAO,eAAe,CAAC,KAAO,qBAAqB,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,iBAAiB,KAAO,mBAAmB,CAAC,KAAO,uBAAuB,KAAO,mBAAmB,CAAC,KAAO,yBAAyB,KAAO,4BAA4B,CAAC,KAAO,6BAA6B,KAAO,4BAA4B,CAAC,KAAO,gBAAgB,KAAO,uCAAuC,KAAO,YAAY,CAAC,GAAK,UAAU,UAAY,UAAU,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,SAAS,KAAO,WAAW,CAAC,IAAM,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,YAAY,KAAO,SAAS,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,eAAe,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,+BAA+B,OAAS,GAAG,KAAO,qBAAqB,CAAC,IAAM,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,mBAAmB,CAAC,KAAO,cAAc,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,qBAAqB,CAAC,GAAK,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,2BAA2B,CAAC,KAAO,kBAAkB,KAAO,0BAA0B,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,6BAA6B,CAAC,GAAK,UAAU,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,uBAAuB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,oBAAoB,CAAC,IAAM,UAAU,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,uBAAuB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,oBAAoB,CAAC,GAAK,UAAU,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,kBAAkB,CAAC,KAAO,WAAW,KAAO,mBAAmB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,oBAAoB,CAAC,GAAK,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,kBAAkB,CAAC,KAAO,WAAW,KAAO,mBAAmB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,oBAAoB,CAAC,IAAM,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,mBAAmB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,eAAe,CAAC,KAAO,mBAAmB,KAAO,eAAe,CAAC,KAAO,WAAW,KAAO,mBAAmB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,qBAAqB,CAAC,GAAK,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,kBAAkB,CAAC,IAAM,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,YAAY,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,4BAA4B,CAAC,GAAK,WAAW,UAAY,2BAA2B,OAAS,GAAG,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,GAAG,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,2BAA2B,OAAS,GAAG,KAAO,kBAAkB,CAAC,GAAK,WAAW,UAAY,gCAAgC,OAAS,GAAG,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,8BAA8B,OAAS,GAAG,KAAO,kBAAkB,CAAC,GAAK,WAAW,UAAY,yBAAyB,OAAS,GAAG,KAAO,kBAAkB,CAAC,IAAM,QAAQ,UAAY,yBAAyB,OAAS,GAAG,KAAO,kBAAkB,CAAC,GAAK,UAAU,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,WAAW,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,SAAS,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,eAAe,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,sBAAsB,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,sBAAsB,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,qBAAqB,KAAO,UAAU,CAAC,IAAM,UAAU,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,eAAe,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,aAAa,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,qBAAqB,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,eAAe,KAAO,QAAQ,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,MAAM,KAAO,QAAQ,KAAO,sBAAsB,CAAC,GAAK,SAAS,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,mBAAmB,CAAC,KAAO,yBAAyB,KAAO,4BAA4B,CAAC,KAAO,gBAAgB,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,kBAAkB,KAAO,sBAAsB,CAAC,IAAM,WAAW,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,mBAAmB,CAAC,KAAO,yBAAyB,KAAO,4BAA4B,CAAC,KAAO,gBAAgB,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,qBAAqB,KAAO,kBAAkB,KAAO,sBAAsB,CAAC,IAAM,UAAU,UAAY,iBAAiB,OAAS,GAAG,KAAO,WAAW,CAAC,GAAK,UAAU,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,MAAM,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,iBAAiB,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,4BAA4B,CAAC,KAAO,aAAa,KAAO,iBAAiB,CAAC,KAAO,WAAW,KAAO,8BAA8B,CAAC,KAAO,WAAW,KAAO,iCAAiC,CAAC,KAAO,aAAa,KAAO,iBAAiB,KAAO,WAAW,CAAC,GAAK,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,MAAM,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,iBAAiB,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,4BAA4B,CAAC,KAAO,aAAa,KAAO,iBAAiB,CAAC,KAAO,WAAW,KAAO,8BAA8B,CAAC,KAAO,WAAW,KAAO,iCAAiC,CAAC,KAAO,aAAa,KAAO,iBAAiB,KAAO,WAAW,CAAC,GAAK,WAAW,UAAY,cAAc,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,WAAW,CAAC,GAAK,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,MAAM,KAAO,QAAQ,KAAO,WAAW,CAAC,GAAK,WAAW,UAAY,UAAU,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,MAAM,KAAO,QAAQ,KAAO,WAAW,CAAC,IAAM,WAAW,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,iBAAiB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,GAAK,UAAU,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,iBAAiB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,GAAK,UAAU,UAAY,eAAe,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,SAAS,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,GAAK,UAAU,UAAY,cAAc,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,oBAAoB,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,UAAU,KAAO,eAAe,CAAC,GAAK,UAAU,UAAY,WAAW,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,MAAM,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,mBAAmB,KAAO,YAAY,CAAC,GAAK,UAAU,UAAY,SAAS,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,qBAAqB,KAAO,gBAAgB,CAAC,KAAO,uBAAuB,KAAO,gBAAgB,CAAC,KAAO,4BAA4B,KAAO,gBAAgB,CAAC,KAAO,wBAAwB,KAAO,gBAAgB,CAAC,KAAO,kBAAkB,KAAO,gBAAgB,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,iBAAiB,CAAC,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,oBAAoB,CAAC,KAAO,qBAAqB,KAAO,UAAU,CAAC,KAAO,gBAAgB,KAAO,OAAO,CAAC,KAAO,qBAAqB,KAAO,OAAO,CAAC,KAAO,sBAAsB,KAAO,OAAO,CAAC,KAAO,0BAA0B,KAAO,OAAO,CAAC,KAAO,0BAA0B,KAAO,OAAO,CAAC,KAAO,0BAA0B,KAAO,OAAO,CAAC,KAAO,0BAA0B,KAAO,OAAO,CAAC,KAAO,wBAAwB,KAAO,OAAO,CAAC,KAAO,0BAA0B,KAAO,OAAO,CAAC,KAAO,sBAAsB,KAAO,OAAO,CAAC,KAAO,kBAAkB,KAAO,OAAO,CAAC,KAAO,mBAAmB,KAAO,OAAO,CAAC,KAAO,kBAAkB,KAAO,OAAO,CAAC,KAAO,oBAAoB,KAAO,OAAO,CAAC,KAAO,uBAAuB,KAAO,OAAO,CAAC,KAAO,iBAAiB,KAAO,OAAO,CAAC,KAAO,wBAAwB,KAAO,OAAO,CAAC,KAAO,uBAAuB,KAAO,OAAO,CAAC,KAAO,6BAA6B,KAAO,OAAO,CAAC,KAAO,eAAe,KAAO,eAAe,CAAC,KAAO,2BAA2B,KAAO,OAAO,CAAC,KAAO,4BAA4B,KAAO,OAAO,CAAC,KAAO,0BAA0B,KAAO,OAAO,CAAC,KAAO,uBAAuB,KAAO,OAAO,CAAC,KAAO,0BAA0B,KAAO,OAAO,CAAC,KAAO,yBAAyB,KAAO,OAAO,CAAC,KAAO,gBAAgB,KAAO,UAAU,CAAC,KAAO,wBAAwB,KAAO,kBAAkB,CAAC,KAAO,sBAAsB,KAAO,kBAAkB,CAAC,KAAO,wBAAwB,KAAO,mBAAmB,CAAC,KAAO,sBAAsB,KAAO,mBAAmB,CAAC,KAAO,uBAAuB,KAAO,mBAAmB,CAAC,KAAO,qBAAqB,KAAO,OAAO,CAAC,KAAO,qBAAqB,KAAO,OAAO,CAAC,KAAO,gBAAgB,KAAO,OAAO,CAAC,KAAO,sBAAsB,KAAO,kBAAkB,CAAC,KAAO,oBAAoB,KAAO,eAAe,CAAC,KAAO,yBAAyB,KAAO,eAAe,CAAC,KAAO,oBAAoB,KAAO,sBAAsB,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,YAAY,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,UAAU,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,QAAQ,KAAO,aAAa,CAAC,IAAM,UAAU,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,yBAAyB,CAAC,KAAO,WAAW,KAAO,oBAAoB,CAAC,KAAO,MAAM,KAAO,kBAAkB,CAAC,KAAO,UAAU,KAAO,qBAAqB,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,mBAAmB,OAAS,GAAG,KAAO,kBAAkB,CAAC,GAAK,UAAU,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,WAAW,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,oBAAoB,CAAC,KAAO,MAAM,KAAO,QAAQ,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,iBAAiB,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,iBAAiB,KAAO,SAAS,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,YAAY,KAAO,eAAe,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,iBAAiB,KAAO,QAAQ,CAAC,KAAO,MAAM,KAAO,UAAU,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,iBAAiB,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,SAAS,CAAC,KAAO,kBAAkB,KAAO,SAAS,KAAO,iBAAiB,CAAC,GAAK,UAAU,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,kBAAkB,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,QAAQ,KAAO,iBAAiB,CAAC,IAAM,UAAU,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,sBAAsB,CAAC,IAAM,WAAW,UAAY,qBAAqB,OAAS,GAAG,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,kBAAkB,KAAO,QAAQ,KAAO,iBAAiB,CAAC,GAAK,UAAU,UAAY,0BAA0B,OAAS,GAAG,KAAO,sBAAsB,CAAC,GAAK,WAAW,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,kBAAkB,KAAO,QAAQ,KAAO,sBAAsB,CAAC,GAAK,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,sBAAsB,CAAC,IAAM,UAAU,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,qBAAqB,CAAC,IAAM,UAAU,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,SAAS,CAAC,KAAO,OAAO,KAAO,kBAAkB,KAAO,oBAAoB,CAAC,GAAK,UAAU,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,UAAU,KAAO,oBAAoB,CAAC,IAAM,WAAW,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,UAAU,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,IAAI,KAAO,OAAO,CAAC,KAAO,IAAI,KAAO,SAAS,CAAC,KAAO,UAAU,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,UAAU,KAAO,qBAAqB,CAAC,GAAK,WAAW,UAAY,gCAAgC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,iCAAiC,CAAC,IAAM,WAAW,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,kBAAkB,KAAO,iCAAiC,CAAC,IAAM,SAAS,UAAY,eAAe,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,aAAa,CAAC,GAAK,UAAU,UAAY,gCAAgC,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,kBAAkB,KAAO,QAAQ,KAAO,sBAAsB,CAAC,GAAK,WAAW,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,UAAU,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,qBAAqB,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,QAAQ,KAAO,qBAAqB,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,6BAA6B,CAAC,KAAO,WAAW,KAAO,iCAAiC,CAAC,KAAO,cAAc,KAAO,gBAAgB,KAAO,cAAc,CAAC,GAAK,UAAU,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,iBAAiB,CAAC,KAAO,cAAc,KAAO,eAAe,CAAC,KAAO,QAAQ,KAAO,mBAAmB,KAAO,cAAc,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,oBAAoB,CAAC,KAAO,cAAc,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,GAAK,WAAW,UAAY,qBAAqB,OAAS,GAAG,KAAO,iBAAiB,CAAC,GAAK,UAAU,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,iBAAiB,KAAO,UAAU,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,iBAAiB,KAAO,SAAS,CAAC,KAAO,aAAa,KAAO,WAAW,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,SAAS,KAAO,YAAY,CAAC,IAAM,WAAW,UAAY,WAAW,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,iBAAiB,KAAO,SAAS,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,6BAA6B,CAAC,KAAO,eAAe,KAAO,6BAA6B,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,8BAA8B,KAAO,YAAY,CAAC,GAAK,UAAU,UAAY,eAAe,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,gBAAgB,CAAC,IAAM,WAAW,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,cAAc,CAAC,IAAM,WAAW,UAAY,cAAc,OAAS,GAAG,KAAO,cAAc,CAAC,IAAM,WAAW,UAAY,cAAc,OAAS,GAAG,KAAO,cAAc,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,cAAc,CAAC,KAAO,kBAAkB,KAAO,uBAAuB,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,0BAA0B,OAAS,GAAG,KAAO,qBAAqB,CAAC,IAAM,SAAS,UAAY,0BAA0B,OAAS,GAAG,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,+BAA+B,OAAS,GAAG,KAAO,qBAAqB,CAAC,IAAM,UAAU,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,QAAQ,KAAO,qBAAqB,CAAC,IAAM,UAAU,UAAY,+BAA+B,OAAS,GAAG,KAAO,qBAAqB,CAAC,IAAM,UAAU,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,QAAQ,KAAO,qBAAqB,CAAC,IAAM,UAAU,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,QAAQ,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,kCAAkC,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,QAAQ,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,+BAA+B,OAAS,GAAG,KAAO,qBAAqB,CAAC,GAAK,WAAW,UAAY,iCAAiC,OAAS,GAAG,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,kBAAkB,CAAC,IAAM,UAAU,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,0BAA0B,KAAO,UAAU,CAAC,IAAM,UAAU,UAAY,qBAAqB,OAAS,GAAG,KAAO,cAAc,CAAC,GAAK,UAAU,UAAY,qBAAqB,OAAS,GAAG,KAAO,cAAc,CAAC,GAAK,WAAW,UAAY,sBAAsB,OAAS,GAAG,KAAO,cAAc,CAAC,IAAM,UAAU,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,cAAc,CAAC,KAAO,QAAQ,KAAO,wBAAwB,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,iCAAiC,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,GAAG,KAAO,cAAc,CAAC,GAAK,UAAU,UAAY,iCAAiC,OAAS,GAAG,KAAO,oBAAoB,CAAC,GAAK,UAAU,UAAY,4BAA4B,OAAS,GAAG,KAAO,oBAAoB,CAAC,GAAK,UAAU,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,sBAAsB,KAAO,oBAAoB,CAAC,GAAK,UAAU,UAAY,oCAAoC,OAAS,GAAG,KAAO,oBAAoB,CAAC,IAAM,UAAU,UAAY,+BAA+B,OAAS,GAAG,KAAO,oBAAoB,CAAC,IAAM,WAAW,UAAY,iCAAiC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,sBAAsB,KAAO,oBAAoB,CAAC,IAAM,OAAO,UAAY,4BAA4B,OAAS,GAAG,KAAO,eAAe,CAAC,GAAK,WAAW,UAAY,uBAAuB,OAAS,GAAG,KAAO,eAAe,CAAC,IAAM,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,eAAe,CAAC,IAAM,UAAU,UAAY,+BAA+B,OAAS,GAAG,KAAO,eAAe,CAAC,IAAM,WAAW,UAAY,0BAA0B,OAAS,GAAG,KAAO,eAAe,CAAC,IAAM,UAAU,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,eAAe,CAAC,GAAK,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,uBAAuB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,wBAAwB,CAAC,IAAM,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,kBAAkB,CAAC,GAAK,SAAS,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,IAAI,KAAO,OAAO,CAAC,KAAO,IAAI,KAAO,QAAQ,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,4BAA4B,OAAS,GAAG,KAAO,qBAAqB,CAAC,GAAK,WAAW,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,mBAAmB,CAAC,KAAO,cAAc,KAAO,uBAAuB,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,qBAAqB,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,OAAO,CAAC,KAAO,IAAI,KAAO,OAAO,CAAC,KAAO,IAAI,KAAO,QAAQ,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,iBAAiB,CAAC,KAAO,WAAW,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,YAAY,KAAO,kBAAkB,CAAC,KAAO,WAAW,KAAO,kBAAkB,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,WAAW,KAAO,qBAAqB,CAAC,IAAM,UAAU,UAAY,+BAA+B,OAAS,GAAG,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,qBAAqB,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,cAAc,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,iBAAiB,KAAO,eAAe,CAAC,IAAM,UAAU,UAAY,kCAAkC,OAAS,GAAG,KAAO,wBAAwB,CAAC,IAAM,UAAU,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,uBAAuB,KAAO,wBAAwB,CAAC,IAAM,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,YAAY,KAAO,eAAe,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,qBAAqB,KAAO,OAAO,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,6BAA6B,CAAC,GAAK,WAAW,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,WAAW,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,UAAU,UAAY,eAAe,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,SAAS,KAAO,WAAW,CAAC,IAAM,UAAU,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,WAAW,CAAC,IAAM,UAAU,UAAY,UAAU,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,YAAY,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,cAAc,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,CAAC,KAAO,YAAY,KAAO,kBAAkB,CAAC,KAAO,aAAa,KAAO,kBAAkB,CAAC,KAAO,cAAc,KAAO,eAAe,CAAC,KAAO,eAAe,KAAO,eAAe,CAAC,KAAO,WAAW,KAAO,eAAe,CAAC,KAAO,SAAS,KAAO,kBAAkB,CAAC,KAAO,WAAW,KAAO,oBAAoB,CAAC,KAAO,cAAc,KAAO,iBAAiB,CAAC,KAAO,aAAa,KAAO,sCAAsC,KAAO,WAAW,CAAC,IAAM,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,YAAY,KAAO,gBAAgB,CAAC,IAAM,WAAW,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,mBAAmB,KAAO,gBAAgB,CAAC,KAAO,8BAA8B,KAAO,gBAAgB,CAAC,KAAO,yBAAyB,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,iBAAiB,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,OAAO,CAAC,KAAO,KAAK,KAAO,UAAU,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,WAAW,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,yBAAyB,KAAO,OAAO,CAAC,KAAO,iBAAiB,KAAO,0BAA0B,KAAO,0BAA0B,CAAC,IAAM,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,oBAAoB,KAAO,gBAAgB,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,eAAe,KAAO,2BAA2B,CAAC,KAAO,QAAQ,KAAO,iBAAiB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,4BAA4B,KAAO,kBAAkB,CAAC,KAAO,WAAW,KAAO,mBAAmB,CAAC,KAAO,kBAAkB,KAAO,yBAAyB,CAAC,KAAO,gBAAgB,KAAO,SAAS,CAAC,KAAO,qBAAqB,KAAO,eAAe,CAAC,KAAO,sBAAsB,KAAO,mBAAmB,KAAO,oBAAoB,CAAC,IAAM,WAAW,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,kBAAkB,KAAO,iCAAiC,KAAO,4BAA4B,CAAC,IAAM,WAAW,UAAY,gCAAgC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,2BAA2B,CAAC,KAAO,oBAAoB,KAAO,iBAAiB,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,sBAAsB,KAAO,iCAAiC,KAAO,iCAAiC,CAAC,GAAK,UAAU,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,gBAAgB,KAAO,WAAW,KAAO,yBAAyB,CAAC,IAAM,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,iBAAiB,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,WAAW,KAAO,cAAc,CAAC,GAAK,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,YAAY,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,WAAW,KAAO,gBAAgB,CAAC,IAAM,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,yBAAyB,CAAC,GAAK,UAAU,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,cAAc,KAAO,eAAe,CAAC,KAAO,cAAc,KAAO,eAAe,CAAC,KAAO,QAAQ,KAAO,eAAe,CAAC,KAAO,YAAY,KAAO,eAAe,CAAC,KAAO,QAAQ,KAAO,mBAAmB,KAAO,sBAAsB,CAAC,GAAK,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,cAAc,CAAC,GAAK,UAAU,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,SAAS,CAAC,KAAO,qBAAqB,KAAO,OAAO,CAAC,KAAO,eAAe,KAAO,yBAAyB,KAAO,cAAc,CAAC,GAAK,SAAS,UAAY,gCAAgC,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,SAAS,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,eAAe,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,QAAQ,UAAY,uBAAuB,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,WAAW,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,iBAAiB,KAAO,eAAe,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,6BAA6B,CAAC,KAAO,cAAc,KAAO,eAAe,CAAC,KAAO,gBAAgB,KAAO,eAAe,CAAC,KAAO,oBAAoB,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,cAAc,CAAC,GAAK,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,cAAc,CAAC,KAAO,QAAQ,KAAO,uBAAuB,CAAC,KAAO,WAAW,KAAO,0BAA0B,CAAC,KAAO,YAAY,KAAO,qBAAqB,KAAO,uBAAuB,CAAC,IAAM,WAAW,UAAY,OAAO,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,iBAAiB,CAAC,KAAO,UAAU,KAAO,iBAAiB,CAAC,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,KAAO,UAAU,KAAO,iBAAiB,CAAC,KAAO,MAAM,KAAO,iBAAiB,CAAC,KAAO,mBAAmB,KAAO,iBAAiB,CAAC,KAAO,cAAc,KAAO,iBAAiB,CAAC,KAAO,WAAW,KAAO,iBAAiB,CAAC,KAAO,aAAa,KAAO,iBAAiB,CAAC,KAAO,MAAM,KAAO,iBAAiB,CAAC,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,KAAO,UAAU,KAAO,iBAAiB,CAAC,KAAO,OAAO,KAAO,iBAAiB,CAAC,KAAO,kBAAkB,KAAO,iBAAiB,CAAC,KAAO,OAAO,KAAO,iBAAiB,CAAC,KAAO,kBAAkB,KAAO,iBAAiB,CAAC,KAAO,UAAU,KAAO,iBAAiB,CAAC,KAAO,sBAAsB,KAAO,iBAAiB,CAAC,KAAO,SAAS,KAAO,KAAK,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,kBAAkB,CAAC,KAAO,YAAY,KAAO,kBAAkB,CAAC,KAAO,WAAW,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,4BAA4B,CAAC,KAAO,SAAS,KAAO,sBAAsB,CAAC,KAAO,mBAAmB,KAAO,gBAAgB,CAAC,KAAO,qBAAqB,KAAO,sCAAsC,CAAC,KAAO,yBAAyB,KAAO,mBAAmB,CAAC,KAAO,YAAY,KAAO,mBAAmB,CAAC,KAAO,eAAe,KAAO,wBAAwB,CAAC,KAAO,YAAY,KAAO,8BAA8B,KAAO,QAAQ,CAAC,IAAM,WAAW,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,WAAW,KAAO,cAAc,CAAC,IAAM,WAAW,UAAY,UAAU,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,kBAAkB,CAAC,KAAO,oBAAoB,KAAO,iBAAiB,CAAC,KAAO,uBAAuB,KAAO,oBAAoB,CAAC,KAAO,WAAW,KAAO,8BAA8B,CAAC,KAAO,cAAc,KAAO,0BAA0B,KAAO,WAAW,CAAC,IAAM,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,kBAAkB,CAAC,GAAK,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,2BAA2B,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,YAAY,KAAO,iBAAiB,KAAO,eAAe,CAAC,IAAM,WAAW,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,mBAAmB,KAAO,eAAe,CAAC,IAAM,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,6BAA6B,CAAC,KAAO,cAAc,KAAO,mBAAmB,KAAO,eAAe,CAAC,IAAM,UAAU,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,aAAa,CAAC,IAAM,UAAU,UAAY,YAAY,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,iBAAiB,CAAC,IAAM,UAAU,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,iBAAiB,CAAC,GAAK,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,WAAW,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,MAAM,KAAO,WAAW,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,MAAM,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,wBAAwB,CAAC,KAAO,WAAW,KAAO,iCAAiC,CAAC,KAAO,aAAa,KAAO,iBAAiB,KAAO,WAAW,CAAC,IAAM,UAAU,UAAY,oBAAoB,OAAS,GAAG,KAAO,gBAAgB,CAAC,IAAM,UAAU,UAAY,eAAe,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,gBAAgB,CAAC,IAAM,WAAW,UAAY,cAAc,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,SAAS,KAAO,QAAQ,CAAC,GAAK,UAAU,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,UAAU,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,iBAAiB,CAAC,KAAO,MAAM,KAAO,iBAAiB,CAAC,KAAO,OAAO,KAAO,iBAAiB,CAAC,KAAO,WAAW,KAAO,iBAAiB,CAAC,KAAO,UAAU,KAAO,iBAAiB,CAAC,KAAO,mBAAmB,KAAO,iBAAiB,CAAC,KAAO,cAAc,KAAO,iBAAiB,CAAC,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,KAAO,OAAO,KAAO,iBAAiB,CAAC,KAAO,YAAY,KAAO,iBAAiB,CAAC,KAAO,aAAa,KAAO,iBAAiB,CAAC,KAAO,eAAe,KAAO,iBAAiB,CAAC,KAAO,eAAe,KAAO,iBAAiB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,CAAC,KAAO,SAAS,KAAO,KAAK,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,iBAAiB,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,aAAa,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,qBAAqB,KAAO,qCAAqC,CAAC,KAAO,eAAe,KAAO,4BAA4B,CAAC,KAAO,gBAAgB,KAAO,6BAA6B,CAAC,KAAO,wBAAwB,KAAO,6BAA6B,CAAC,KAAO,qBAAqB,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,8BAA8B,KAAO,QAAQ,CAAC,GAAK,UAAU,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,iBAAiB,KAAO,QAAQ,CAAC,GAAK,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,yBAAyB,CAAC,IAAM,UAAU,UAAY,cAAc,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,wBAAwB,KAAO,gBAAgB,CAAC,KAAO,mBAAmB,KAAO,gBAAgB,CAAC,KAAO,mBAAmB,KAAO,gBAAgB,CAAC,KAAO,oBAAoB,KAAO,iBAAiB,CAAC,KAAO,mBAAmB,KAAO,iBAAiB,CAAC,KAAO,gBAAgB,KAAO,iBAAiB,CAAC,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,KAAO,UAAU,KAAO,iBAAiB,CAAC,KAAO,SAAS,KAAO,KAAK,CAAC,KAAO,qBAAqB,KAAO,iBAAiB,CAAC,KAAO,WAAW,KAAO,iBAAiB,CAAC,KAAO,sBAAsB,KAAO,iBAAiB,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,qBAAqB,KAAO,eAAe,CAAC,KAAO,eAAe,KAAO,eAAe,CAAC,KAAO,eAAe,KAAO,eAAe,CAAC,KAAO,eAAe,KAAO,eAAe,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,oBAAoB,KAAO,OAAO,CAAC,KAAO,qBAAqB,KAAO,OAAO,CAAC,KAAO,eAAe,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,SAAS,CAAC,KAAO,kBAAkB,KAAO,sBAAsB,CAAC,KAAO,kBAAkB,KAAO,+BAA+B,CAAC,KAAO,WAAW,KAAO,mBAAmB,CAAC,KAAO,wBAAwB,KAAO,gBAAgB,CAAC,KAAO,uBAAuB,KAAO,eAAe,CAAC,KAAO,gBAAgB,KAAO,eAAe,CAAC,KAAO,aAAa,KAAO,sBAAsB,CAAC,KAAO,mBAAmB,KAAO,eAAe,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,KAAO,WAAW,KAAO,4BAA4B,CAAC,KAAO,mBAAmB,KAAO,gBAAgB,CAAC,KAAO,0BAA0B,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,2BAA2B,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,sBAAsB,KAAO,2BAA2B,CAAC,KAAO,4BAA4B,KAAO,iBAAiB,CAAC,KAAO,iBAAiB,KAAO,mBAAmB,CAAC,KAAO,mBAAmB,KAAO,gBAAgB,CAAC,KAAO,oBAAoB,KAAO,yBAAyB,CAAC,KAAO,kBAAkB,KAAO,iBAAiB,CAAC,KAAO,sBAAsB,KAAO,2BAA2B,KAAO,YAAY,CAAC,GAAK,UAAU,UAAY,eAAe,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,gBAAgB,CAAC,IAAM,UAAU,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,mBAAmB,KAAO,eAAe,CAAC,KAAO,WAAW,KAAO,mBAAmB,CAAC,KAAO,SAAS,KAAO,sBAAsB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,iBAAiB,CAAC,GAAK,UAAU,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,MAAM,KAAO,gBAAgB,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,SAAS,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,WAAW,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,YAAY,KAAO,eAAe,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,qBAAqB,KAAO,OAAO,CAAC,KAAO,MAAM,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,eAAe,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,UAAU,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,iCAAiC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,gBAAgB,KAAO,6BAA6B,CAAC,IAAM,WAAW,UAAY,mCAAmC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,eAAe,CAAC,KAAO,SAAS,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,mBAAmB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,6BAA6B,CAAC,GAAK,UAAU,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,eAAe,CAAC,KAAO,eAAe,KAAO,mBAAmB,CAAC,KAAO,gBAAgB,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,6BAA6B,CAAC,IAAM,WAAW,UAAY,6BAA6B,OAAS,GAAG,KAAO,yBAAyB,CAAC,IAAM,UAAU,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,uBAAuB,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,yBAAyB,KAAO,yBAAyB,CAAC,IAAM,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,sBAAsB,CAAC,GAAK,UAAU,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,sBAAsB,CAAC,GAAK,UAAU,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,eAAe,KAAO,mBAAmB,CAAC,KAAO,OAAO,KAAO,mBAAmB,KAAO,sBAAsB,CAAC,IAAM,UAAU,UAAY,4BAA4B,OAAS,GAAG,KAAO,6BAA6B,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,GAAG,KAAO,6BAA6B,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,IAAI,KAAO,WAAW,KAAO,6BAA6B,CAAC,IAAM,WAAW,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,eAAe,KAAO,8BAA8B,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,gCAAgC,CAAC,IAAM,UAAU,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,cAAc,KAAO,sBAAsB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,+BAA+B,CAAC,IAAM,UAAU,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,mBAAmB,CAAC,IAAM,UAAU,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,UAAU,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,SAAS,KAAO,iBAAiB,CAAC,IAAM,UAAU,UAAY,kCAAkC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,0BAA0B,OAAS,GAAG,KAAO,6BAA6B,CAAC,GAAK,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,YAAY,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,yBAAyB,CAAC,KAAO,kBAAkB,KAAO,gBAAgB,KAAO,uBAAuB,CAAC,GAAK,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,wBAAwB,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,iBAAiB,KAAO,UAAU,CAAC,IAAM,UAAU,UAAY,gCAAgC,OAAS,GAAG,KAAO,sBAAsB,CAAC,IAAM,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,qBAAqB,KAAO,sBAAsB,CAAC,IAAM,WAAW,UAAY,kBAAkB,OAAS,GAAG,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,iCAAiC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,iCAAiC,CAAC,KAAO,eAAe,KAAO,wBAAwB,KAAO,yBAAyB,CAAC,GAAK,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,iCAAiC,CAAC,KAAO,eAAe,KAAO,wBAAwB,KAAO,yBAAyB,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,KAAK,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,cAAc,KAAO,kBAAkB,CAAC,KAAO,MAAM,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,4BAA4B,CAAC,KAAO,UAAU,KAAO,4BAA4B,CAAC,KAAO,eAAe,KAAO,0BAA0B,KAAO,wBAAwB,CAAC,GAAK,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,iCAAiC,CAAC,KAAO,eAAe,KAAO,wBAAwB,KAAO,oBAAoB,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,iCAAiC,CAAC,KAAO,eAAe,KAAO,wBAAwB,KAAO,oBAAoB,CAAC,GAAK,UAAU,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,KAAK,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,cAAc,KAAO,kBAAkB,CAAC,KAAO,MAAM,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,uBAAuB,CAAC,KAAO,UAAU,KAAO,uBAAuB,CAAC,KAAO,eAAe,KAAO,qBAAqB,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,kBAAkB,CAAC,KAAO,YAAY,KAAO,6BAA6B,CAAC,KAAO,UAAU,KAAO,2BAA2B,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,uBAAuB,CAAC,GAAK,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,MAAM,KAAO,oBAAoB,CAAC,KAAO,YAAY,KAAO,+BAA+B,CAAC,KAAO,SAAS,KAAO,WAAW,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,MAAM,KAAO,oBAAoB,CAAC,KAAO,KAAK,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,oCAAoC,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,2BAA2B,OAAS,GAAG,KAAO,kBAAkB,CAAC,GAAK,UAAU,UAAY,2BAA2B,OAAS,GAAG,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,WAAW,UAAY,uBAAuB,OAAS,GAAG,KAAO,cAAc,CAAC,GAAK,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,uBAAuB,CAAC,GAAK,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,kBAAkB,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,eAAe,KAAO,eAAe,CAAC,KAAO,cAAc,KAAO,kBAAkB,CAAC,KAAO,kBAAkB,KAAO,gBAAgB,CAAC,KAAO,oBAAoB,KAAO,eAAe,CAAC,KAAO,WAAW,KAAO,mBAAmB,KAAO,oBAAoB,CAAC,GAAK,UAAU,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,WAAW,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,0BAA0B,OAAS,GAAG,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,mBAAmB,OAAS,GAAG,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,oBAAoB,OAAS,GAAG,KAAO,iBAAiB,CAAC,GAAK,UAAU,UAAY,yBAAyB,OAAS,GAAG,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,qBAAqB,CAAC,GAAK,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,WAAW,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,MAAM,KAAO,WAAW,KAAO,kBAAkB,CAAC,GAAK,UAAU,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,oBAAoB,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,UAAU,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,kBAAkB,CAAC,IAAM,SAAS,UAAY,mCAAmC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,kBAAkB,CAAC,GAAK,SAAS,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,kBAAkB,CAAC,GAAK,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,8BAA8B,KAAO,eAAe,CAAC,GAAK,UAAU,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,kBAAkB,CAAC,KAAO,MAAM,KAAO,kBAAkB,CAAC,KAAO,aAAa,KAAO,QAAQ,KAAO,8BAA8B,CAAC,IAAM,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,gBAAgB,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,iBAAiB,CAAC,KAAO,kBAAkB,KAAO,mBAAmB,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,iBAAiB,KAAO,4BAA4B,CAAC,IAAM,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,WAAW,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,gCAAgC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,YAAY,KAAO,iBAAiB,CAAC,KAAO,UAAU,KAAO,eAAe,CAAC,KAAO,SAAS,KAAO,eAAe,CAAC,KAAO,gCAAgC,KAAO,eAAe,CAAC,KAAO,eAAe,KAAO,wBAAwB,KAAO,yBAAyB,CAAC,GAAK,WAAW,UAAY,kCAAkC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,YAAY,KAAO,iBAAiB,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,wBAAwB,KAAO,yBAAyB,CAAC,IAAM,WAAW,UAAY,oCAAoC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,wBAAwB,KAAO,yBAAyB,CAAC,GAAK,SAAS,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,MAAM,KAAO,YAAY,CAAC,KAAO,UAAU,KAAO,eAAe,CAAC,KAAO,SAAS,KAAO,eAAe,CAAC,KAAO,gCAAgC,KAAO,eAAe,CAAC,KAAO,eAAe,KAAO,wBAAwB,KAAO,oBAAoB,CAAC,IAAM,WAAW,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,MAAM,KAAO,YAAY,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,wBAAwB,KAAO,oBAAoB,CAAC,GAAK,UAAU,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,wBAAwB,KAAO,oBAAoB,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,cAAc,CAAC,KAAO,eAAe,KAAO,0BAA0B,KAAO,wBAAwB,CAAC,IAAM,OAAO,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,KAAK,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,cAAc,KAAO,kBAAkB,CAAC,KAAO,WAAW,KAAO,iBAAiB,CAAC,KAAO,eAAe,KAAO,0BAA0B,KAAO,wBAAwB,CAAC,GAAK,UAAU,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,KAAK,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,iBAAiB,CAAC,KAAO,WAAW,KAAO,oBAAoB,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,cAAc,KAAO,kBAAkB,CAAC,KAAO,eAAe,KAAO,qBAAqB,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,2BAA2B,CAAC,GAAK,WAAW,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,2BAA2B,CAAC,KAAO,gBAAgB,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,iBAAiB,CAAC,KAAO,kBAAkB,KAAO,mBAAmB,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,WAAW,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,kBAAkB,CAAC,KAAO,WAAW,KAAO,mBAAmB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,kBAAkB,KAAO,wBAAwB,CAAC,IAAM,UAAU,UAAY,UAAU,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,WAAW,KAAO,WAAW,CAAC,IAAM,WAAW,UAAY,wBAAwB,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,4BAA4B,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,gCAAgC,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,wBAAwB,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,0BAA0B,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,SAAS,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,mBAAmB,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,oBAAoB,KAAO,wBAAwB,CAAC,IAAM,UAAU,UAAY,+BAA+B,OAAS,GAAG,KAAO,qBAAqB,CAAC,GAAK,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,gCAAgC,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,qBAAqB,CAAC,IAAM,UAAU,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,iBAAiB,CAAC,GAAK,UAAU,UAAY,gCAAgC,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,cAAc,KAAO,iBAAiB,CAAC,GAAK,UAAU,UAAY,gCAAgC,OAAS,GAAG,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,IAAM,SAAS,UAAY,eAAe,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,kBAAkB,KAAO,eAAe,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,iCAAiC,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,gBAAgB,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,GAAG,KAAO,iBAAiB,CAAC,IAAM,UAAU,UAAY,uCAAuC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,6BAA6B,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,6BAA6B,CAAC,KAAO,SAAS,KAAO,iBAAiB,KAAO,6BAA6B,CAAC,GAAK,WAAW,UAAY,6BAA6B,OAAS,GAAG,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,qCAAqC,OAAS,GAAG,KAAO,2BAA2B,CAAC,IAAM,WAAW,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,uBAAuB,CAAC,KAAO,WAAW,KAAO,oBAAoB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,KAAO,2BAA2B,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,GAAG,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,8BAA8B,KAAO,6BAA6B,CAAC,GAAK,UAAU,UAAY,0CAA0C,OAAS,GAAG,KAAO,oCAAoC,CAAC,GAAK,UAAU,UAAY,0CAA0C,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,8BAA8B,KAAO,oCAAoC,CAAC,GAAK,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,cAAc,CAAC,KAAO,QAAQ,KAAO,aAAa,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,eAAe,OAAS,GAAG,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,mBAAmB,OAAS,GAAG,KAAO,UAAU,CAAC,IAAM,UAAU,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,gBAAgB,KAAO,cAAc,CAAC,IAAM,SAAS,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,gBAAgB,KAAO,cAAc,CAAC,GAAK,UAAU,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,cAAc,CAAC,KAAO,SAAS,KAAO,qBAAqB,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,IAAI,KAAO,OAAO,CAAC,KAAO,IAAI,KAAO,UAAU,CAAC,KAAO,IAAI,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,cAAc,CAAC,IAAM,WAAW,UAAY,+BAA+B,OAAS,GAAG,KAAO,qBAAqB,CAAC,GAAK,WAAW,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,eAAe,KAAO,uBAAuB,CAAC,GAAK,SAAS,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,kBAAkB,KAAO,uBAAuB,CAAC,IAAM,WAAW,UAAY,OAAO,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,aAAa,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,SAAS,CAAC,KAAO,WAAW,KAAO,qBAAqB,KAAO,QAAQ,CAAC,GAAK,WAAW,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,0BAA0B,KAAO,wBAAwB,CAAC,GAAK,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,eAAe,KAAO,wBAAwB,KAAO,yBAAyB,CAAC,IAAM,SAAS,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,gBAAgB,CAAC,IAAM,UAAU,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,cAAc,KAAO,cAAc,CAAC,GAAK,SAAS,UAAY,cAAc,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,aAAa,CAAC,KAAO,aAAa,KAAO,WAAW,KAAO,aAAa,CAAC,GAAK,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,YAAY,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,qBAAqB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,uBAAuB,CAAC,GAAK,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,QAAQ,KAAO,sBAAsB,CAAC,GAAK,UAAU,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,WAAW,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,kBAAkB,CAAC,IAAM,UAAU,UAAY,YAAY,OAAS,GAAG,KAAO,YAAY,CAAC,GAAK,WAAW,UAAY,YAAY,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,YAAY,CAAC,GAAK,WAAW,UAAY,WAAW,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,KAAO,YAAY,CAAC,IAAM,UAAU,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,KAAO,YAAY,CAAC,IAAM,WAAW,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,KAAO,YAAY,CAAC,IAAM,WAAW,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,KAAO,YAAY,CAAC,GAAK,WAAW,UAAY,YAAY,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,KAAO,YAAY,CAAC,GAAK,WAAW,UAAY,UAAU,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,YAAY,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,SAAS,KAAO,YAAY,CAAC,IAAM,UAAU,UAAY,YAAY,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,YAAY,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,YAAY,CAAC,GAAK,WAAW,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,qBAAqB,KAAO,YAAY,CAAC,GAAK,UAAU,UAAY,uBAAuB,OAAS,GAAG,KAAO,aAAa,CAAC,GAAK,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,YAAY,CAAC,KAAO,iBAAiB,KAAO,QAAQ,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,KAAO,aAAa,CAAC,IAAM,UAAU,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,KAAO,aAAa,CAAC,GAAK,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,YAAY,CAAC,KAAO,WAAW,KAAO,WAAW,KAAO,aAAa,CAAC,GAAK,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,KAAO,aAAa,CAAC,IAAM,UAAU,UAAY,mBAAmB,OAAS,GAAG,KAAO,aAAa,CAAC,IAAM,UAAU,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,aAAa,CAAC,IAAM,UAAU,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,yBAAyB,KAAO,aAAa,CAAC,GAAK,UAAU,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,YAAY,CAAC,KAAO,UAAU,KAAO,aAAa,KAAO,aAAa,CAAC,GAAK,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,YAAY,CAAC,KAAO,UAAU,KAAO,aAAa,KAAO,aAAa,CAAC,GAAK,UAAU,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,eAAe,CAAC,KAAO,MAAM,KAAO,kBAAkB,CAAC,KAAO,aAAa,KAAO,iBAAiB,KAAO,aAAa,CAAC,GAAK,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,gBAAgB,KAAO,aAAa,CAAC,GAAK,UAAU,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,cAAc,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,kBAAkB,KAAO,gBAAgB,CAAC,KAAO,MAAM,KAAO,kBAAkB,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,kBAAkB,KAAO,gBAAgB,CAAC,KAAO,IAAI,KAAO,eAAe,CAAC,KAAO,IAAI,KAAO,eAAe,CAAC,KAAO,UAAU,KAAO,gBAAgB,KAAO,aAAa,CAAC,IAAM,UAAU,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,kBAAkB,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,qBAAqB,CAAC,KAAO,UAAU,KAAO,gBAAgB,KAAO,aAAa,CAAC,GAAK,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,qBAAqB,CAAC,KAAO,UAAU,KAAO,gBAAgB,KAAO,aAAa,CAAC,GAAK,SAAS,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,qBAAqB,CAAC,KAAO,UAAU,KAAO,gBAAgB,KAAO,aAAa,CAAC,GAAK,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,oBAAoB,KAAO,gBAAgB,KAAO,WAAW,CAAC,IAAM,SAAS,UAAY,2BAA2B,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,WAAW,UAAY,sBAAsB,OAAS,GAAG,KAAO,cAAc,CAAC,IAAM,UAAU,UAAY,4BAA4B,OAAS,GAAG,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,+BAA+B,OAAS,GAAG,KAAO,0BAA0B,CAAC,IAAM,UAAU,UAAY,mCAAmC,OAAS,GAAG,KAAO,0BAA0B,CAAC,GAAK,WAAW,UAAY,+BAA+B,OAAS,GAAG,KAAO,0BAA0B,CAAC,IAAM,SAAS,UAAY,6BAA6B,OAAS,GAAG,KAAO,0BAA0B,CAAC,GAAK,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,eAAe,CAAC,KAAO,OAAO,KAAO,eAAe,KAAO,UAAU,CAAC,IAAM,SAAS,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,YAAY,KAAO,eAAe,CAAC,KAAO,QAAQ,KAAO,+BAA+B,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,WAAW,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,YAAY,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,YAAY,CAAC,KAAO,UAAU,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,UAAU,UAAY,eAAe,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,SAAS,KAAO,gBAAgB,CAAC,GAAK,WAAW,UAAY,UAAU,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,KAAO,kBAAkB,KAAO,gBAAgB,CAAC,KAAO,kBAAkB,KAAO,gBAAgB,CAAC,KAAO,6BAA6B,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,oBAAoB,KAAO,gBAAgB,CAAC,KAAO,oBAAoB,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,wBAAwB,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,KAAO,wBAAwB,KAAO,wBAAwB,CAAC,KAAO,sBAAsB,KAAO,mBAAmB,KAAO,WAAW,CAAC,IAAM,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,4BAA4B,CAAC,KAAO,UAAU,KAAO,WAAW,CAAC,KAAO,UAAU,KAAO,SAAS,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,gBAAgB,KAAO,YAAY,CAAC,KAAO,cAAc,KAAO,kBAAkB,CAAC,KAAO,iBAAiB,KAAO,uBAAuB,KAAO,cAAc,CAAC,IAAM,UAAU,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,UAAU,CAAC,KAAO,qBAAqB,KAAO,WAAW,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,SAAS,CAAC,KAAO,OAAO,KAAO,gCAAgC,CAAC,KAAO,qBAAqB,KAAO,kBAAkB,CAAC,KAAO,SAAS,KAAO,kBAAkB,KAAO,iBAAiB,CAAC,IAAM,UAAU,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,6BAA6B,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,uBAAuB,CAAC,KAAO,iBAAiB,KAAO,eAAe,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,UAAU,CAAC,KAAO,iBAAiB,KAAO,iCAAiC,KAAO,gBAAgB,CAAC,GAAK,UAAU,UAAY,cAAc,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,WAAW,KAAO,eAAe,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,mBAAmB,KAAO,wBAAwB,KAAO,wBAAwB,CAAC,IAAM,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,QAAQ,CAAC,KAAO,eAAe,KAAO,mBAAmB,KAAO,iBAAiB,CAAC,IAAM,UAAU,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,2BAA2B,CAAC,GAAK,UAAU,UAAY,cAAc,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,8BAA8B,KAAO,eAAe,CAAC,IAAM,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,8BAA8B,KAAO,oBAAoB,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,wBAAwB,CAAC,GAAK,UAAU,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,oBAAoB,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,UAAU,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,uBAAuB,KAAO,gBAAgB,CAAC,KAAO,mBAAmB,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,uBAAuB,CAAC,KAAO,UAAU,KAAO,WAAW,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,kBAAkB,KAAO,kBAAkB,CAAC,KAAO,gBAAgB,KAAO,oBAAoB,CAAC,KAAO,qBAAqB,KAAO,qCAAqC,CAAC,KAAO,aAAa,KAAO,gCAAgC,CAAC,KAAO,oBAAoB,KAAO,2CAA2C,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,wBAAwB,CAAC,IAAM,UAAU,UAAY,kCAAkC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,KAAK,KAAO,kBAAkB,CAAC,KAAO,mBAAmB,KAAO,mCAAmC,KAAO,mCAAmC,CAAC,GAAK,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,YAAY,KAAO,0BAA0B,CAAC,GAAK,WAAW,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,uBAAuB,CAAC,KAAO,UAAU,KAAO,WAAW,CAAC,KAAO,OAAO,KAAO,gCAAgC,CAAC,KAAO,WAAW,KAAO,0BAA0B,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,QAAQ,CAAC,KAAO,oBAAoB,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,2BAA2B,CAAC,IAAM,SAAS,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,wBAAwB,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,iCAAiC,KAAO,sBAAsB,CAAC,IAAM,WAAW,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,UAAU,KAAO,2BAA2B,CAAC,GAAK,UAAU,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,aAAa,KAAO,2BAA2B,CAAC,IAAM,UAAU,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,SAAS,CAAC,KAAO,cAAc,KAAO,QAAQ,KAAO,uBAAuB,CAAC,IAAM,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,yBAAyB,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,SAAS,CAAC,KAAO,mBAAmB,KAAO,gBAAgB,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,SAAS,CAAC,KAAO,OAAO,KAAO,gCAAgC,CAAC,KAAO,qBAAqB,KAAO,kBAAkB,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,SAAS,KAAO,UAAU,CAAC,IAAM,QAAQ,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,iBAAiB,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,uBAAuB,KAAO,uBAAuB,CAAC,IAAM,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,cAAc,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,kBAAkB,CAAC,GAAK,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,SAAS,KAAO,aAAa,CAAC,IAAM,UAAU,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,iBAAiB,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,qBAAqB,CAAC,KAAO,eAAe,KAAO,gBAAgB,KAAO,aAAa,CAAC,GAAK,UAAU,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,iBAAiB,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,SAAS,CAAC,KAAO,WAAW,KAAO,sBAAsB,KAAO,aAAa,CAAC,GAAK,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,iBAAiB,KAAO,QAAQ,CAAC,KAAO,MAAM,KAAO,SAAS,CAAC,KAAO,WAAW,KAAO,sBAAsB,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,YAAY,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,iBAAiB,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,SAAS,CAAC,KAAO,kBAAkB,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,qBAAqB,CAAC,KAAO,cAAc,KAAO,2BAA2B,CAAC,KAAO,aAAa,KAAO,QAAQ,KAAO,aAAa,CAAC,GAAK,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,kCAAkC,CAAC,KAAO,WAAW,KAAO,gBAAgB,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,MAAM,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,KAAK,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,UAAU,KAAO,mBAAmB,CAAC,IAAM,SAAS,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,mBAAmB,KAAO,mBAAmB,KAAO,qBAAqB,CAAC,IAAM,UAAU,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,aAAa,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,gCAAgC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,iBAAiB,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,kCAAkC,CAAC,KAAO,WAAW,KAAO,gBAAgB,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,gCAAgC,OAAS,GAAG,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,gCAAgC,OAAS,GAAG,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,+BAA+B,OAAS,GAAG,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,QAAQ,KAAO,qBAAqB,CAAC,IAAM,UAAU,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,SAAS,CAAC,KAAO,iBAAiB,KAAO,SAAS,CAAC,KAAO,gBAAgB,KAAO,SAAS,CAAC,KAAO,cAAc,KAAO,qBAAqB,KAAO,eAAe,CAAC,IAAM,UAAU,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,gBAAgB,KAAO,UAAU,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,KAAO,kBAAkB,CAAC,IAAM,UAAU,UAAY,eAAe,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,WAAW,KAAO,gBAAgB,CAAC,GAAK,WAAW,UAAY,YAAY,OAAS,CAAC,CAAC,KAAO,cAAc,KAAO,yBAAyB,KAAO,aAAa,CAAC,IAAM,UAAU,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,aAAa,CAAC,IAAM,UAAU,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,kBAAkB,CAAC,GAAK,WAAW,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,kBAAkB,CAAC,KAAO,YAAY,KAAO,kBAAkB,CAAC,KAAO,YAAY,KAAO,kBAAkB,CAAC,KAAO,YAAY,KAAO,kBAAkB,CAAC,KAAO,aAAa,KAAO,kBAAkB,CAAC,KAAO,cAAc,KAAO,WAAW,KAAO,kBAAkB,CAAC,GAAK,UAAU,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,WAAW,KAAO,kBAAkB,CAAC,IAAM,UAAU,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,2BAA2B,KAAO,sBAAsB,CAAC,IAAM,UAAU,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,MAAM,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,iBAAiB,KAAO,kBAAkB,CAAC,KAAO,cAAc,KAAO,UAAU,CAAC,KAAO,gBAAgB,KAAO,OAAO,CAAC,KAAO,mBAAmB,KAAO,OAAO,CAAC,KAAO,mBAAmB,KAAO,WAAW,KAAO,oBAAoB,CAAC,GAAK,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,WAAW,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,uBAAuB,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,eAAe,KAAO,mBAAmB,CAAC,KAAO,OAAO,KAAO,mBAAmB,KAAO,sBAAsB,CAAC,GAAK,WAAW,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,YAAY,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,gBAAgB,KAAO,qBAAqB,KAAO,sBAAsB,CAAC,GAAK,UAAU,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,IAAI,KAAO,WAAW,KAAO,6BAA6B,CAAC,GAAK,UAAU,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,IAAI,KAAO,WAAW,KAAO,6BAA6B,CAAC,IAAM,UAAU,UAAY,wCAAwC,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,WAAW,KAAO,8BAA8B,CAAC,GAAK,WAAW,UAAY,wCAAwC,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,WAAW,KAAO,8BAA8B,CAAC,GAAK,WAAW,UAAY,2CAA2C,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,WAAW,KAAO,8BAA8B,CAAC,GAAK,WAAW,UAAY,wCAAwC,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,SAAS,CAAC,KAAO,YAAY,KAAO,UAAU,KAAO,8BAA8B,CAAC,GAAK,UAAU,UAAY,0CAA0C,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,SAAS,KAAO,8BAA8B,CAAC,GAAK,UAAU,UAAY,6CAA6C,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,SAAS,KAAO,8BAA8B,CAAC,IAAM,UAAU,UAAY,yCAAyC,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,YAAY,KAAO,8BAA8B,CAAC,GAAK,WAAW,UAAY,wCAAwC,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,WAAW,CAAC,KAAO,cAAc,KAAO,YAAY,KAAO,8BAA8B,CAAC,GAAK,WAAW,UAAY,0CAA0C,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,YAAY,KAAO,8BAA8B,CAAC,GAAK,UAAU,UAAY,4CAA4C,OAAS,GAAG,KAAO,8BAA8B,CAAC,IAAM,UAAU,UAAY,6CAA6C,OAAS,GAAG,KAAO,8BAA8B,CAAC,IAAM,UAAU,UAAY,8CAA8C,OAAS,CAAC,CAAC,KAAO,cAAc,KAAO,uBAAuB,KAAO,8BAA8B,CAAC,IAAM,UAAU,UAAY,iDAAiD,OAAS,CAAC,CAAC,KAAO,mBAAmB,KAAO,sBAAsB,CAAC,KAAO,kBAAkB,KAAO,uBAAuB,KAAO,8BAA8B,CAAC,IAAM,UAAU,UAAY,mDAAmD,OAAS,CAAC,CAAC,KAAO,mBAAmB,KAAO,sBAAsB,CAAC,KAAO,kBAAkB,KAAO,uBAAuB,KAAO,8BAA8B,CAAC,GAAK,UAAU,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,+BAA+B,KAAO,wBAAwB,CAAC,IAAM,UAAU,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,gCAAgC,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,4BAA4B,CAAC,IAAM,UAAU,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,MAAM,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,iBAAiB,CAAC,KAAO,SAAS,KAAO,iBAAiB,CAAC,KAAO,OAAO,KAAO,iBAAiB,CAAC,KAAO,SAAS,KAAO,iBAAiB,CAAC,KAAO,aAAa,KAAO,iBAAiB,CAAC,KAAO,UAAU,KAAO,iBAAiB,CAAC,KAAO,OAAO,KAAO,iBAAiB,CAAC,KAAO,SAAS,KAAO,kBAAkB,KAAO,+BAA+B,CAAC,GAAK,UAAU,UAAY,4BAA4B,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,gBAAgB,KAAO,aAAa,CAAC,GAAK,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,QAAQ,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,kBAAkB,CAAC,GAAK,WAAW,UAAY,+BAA+B,OAAS,GAAG,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,oCAAoC,OAAS,GAAG,KAAO,0BAA0B,CAAC,GAAK,UAAU,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,uBAAuB,CAAC,KAAO,WAAW,KAAO,qBAAqB,KAAO,0BAA0B,CAAC,IAAM,UAAU,UAAY,sBAAsB,OAAS,GAAG,KAAO,UAAU,CAAC,IAAM,UAAU,UAAY,oCAAoC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,WAAW,KAAO,gBAAgB,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,gCAAgC,OAAS,GAAG,KAAO,kBAAkB,CAAC,GAAK,WAAW,UAAY,sBAAsB,OAAS,GAAG,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,6CAA6C,OAAS,CAAC,CAAC,KAAO,kBAAkB,KAAO,mBAAmB,CAAC,KAAO,iBAAiB,KAAO,oBAAoB,KAAO,8BAA8B,CAAC,IAAM,SAAS,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,WAAW,KAAO,iBAAiB,CAAC,GAAK,UAAU,UAAY,kCAAkC,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,aAAa,KAAO,2BAA2B,CAAC,IAAM,UAAU,UAAY,yBAAyB,OAAS,GAAG,KAAO,kBAAkB,CAAC,IAAM,UAAU,UAAY,8BAA8B,OAAS,GAAG,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,iCAAiC,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,mBAAmB,KAAO,QAAQ,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,mDAAmD,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,SAAS,KAAO,8BAA8B,CAAC,IAAM,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,iBAAiB,CAAC,KAAO,UAAU,KAAO,eAAe,CAAC,KAAO,SAAS,KAAO,eAAe,CAAC,KAAO,gCAAgC,KAAO,gBAAgB,KAAO,cAAc,CAAC,IAAM,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,MAAM,KAAO,YAAY,CAAC,KAAO,UAAU,KAAO,eAAe,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,gCAAgC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,GAAK,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,WAAW,KAAO,eAAe,CAAC,IAAM,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,eAAe,CAAC,IAAM,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,eAAe,CAAC,IAAM,UAAU,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,eAAe,KAAO,eAAe,CAAC,IAAM,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,MAAM,KAAO,sBAAsB,KAAO,eAAe,CAAC,GAAK,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,uBAAuB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,qBAAqB,CAAC,IAAM,UAAU,UAAY,0CAA0C,OAAS,GAAG,KAAO,gCAAgC,CAAC,GAAK,WAAW,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,cAAc,CAAC,KAAO,YAAY,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,kCAAkC,KAAO,oBAAoB,CAAC,IAAM,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,UAAU,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,OAAO,CAAC,KAAO,KAAK,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,WAAW,KAAO,oBAAoB,CAAC,IAAM,UAAU,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,iBAAiB,KAAO,4BAA4B,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,6BAA6B,CAAC,IAAM,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,KAAO,gBAAgB,CAAC,IAAM,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,KAAO,gBAAgB,CAAC,IAAM,WAAW,UAAY,qBAAqB,OAAS,GAAG,KAAO,gBAAgB,CAAC,IAAM,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,WAAW,KAAO,iBAAiB,CAAC,IAAM,SAAS,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,cAAc,KAAO,mBAAmB,CAAC,IAAM,UAAU,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,cAAc,CAAC,GAAK,UAAU,UAAY,uCAAuC,OAAS,GAAG,KAAO,6BAA6B,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,8BAA8B,KAAO,6BAA6B,CAAC,IAAM,UAAU,UAAY,WAAW,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,UAAU,KAAO,YAAY,CAAC,IAAM,UAAU,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,8BAA8B,KAAO,eAAe,CAAC,GAAK,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,oBAAoB,CAAC,IAAM,UAAU,UAAY,iCAAiC,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,KAAO,6BAA6B,CAAC,GAAK,UAAU,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,OAAO,CAAC,KAAO,mBAAmB,KAAO,wBAAwB,KAAO,6BAA6B,CAAC,GAAK,UAAU,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,SAAS,CAAC,KAAO,SAAS,KAAO,UAAU,KAAO,mBAAmB,CAAC,GAAK,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,mBAAmB,CAAC,IAAM,UAAU,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,qBAAqB,CAAC,GAAK,WAAW,UAAY,kBAAkB,OAAS,GAAG,KAAO,cAAc,CAAC,GAAK,WAAW,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,SAAS,CAAC,KAAO,SAAS,KAAO,UAAU,KAAO,cAAc,CAAC,IAAM,WAAW,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,CAAC,KAAO,YAAY,KAAO,SAAS,CAAC,KAAO,SAAS,KAAO,UAAU,KAAO,cAAc,CAAC,GAAK,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,iCAAiC,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,WAAW,UAAY,0BAA0B,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,+BAA+B,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,8BAA8B,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,kCAAkC,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,UAAU,UAAY,yBAAyB,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,SAAS,UAAY,6BAA6B,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,+BAA+B,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,iCAAiC,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,sCAAsC,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,UAAU,UAAY,uCAAuC,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,cAAc,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,mBAAmB,CAAC,KAAO,OAAO,KAAO,sBAAsB,CAAC,KAAO,aAAa,KAAO,sBAAsB,CAAC,KAAO,eAAe,KAAO,sBAAsB,CAAC,KAAO,SAAS,KAAO,sBAAsB,CAAC,KAAO,cAAc,KAAO,8BAA8B,CAAC,KAAO,QAAQ,KAAO,8BAA8B,CAAC,KAAO,aAAa,KAAO,2BAA2B,CAAC,KAAO,OAAO,KAAO,UAAU,KAAO,eAAe,CAAC,IAAM,UAAU,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,mBAAmB,CAAC,KAAO,OAAO,KAAO,sBAAsB,CAAC,KAAO,aAAa,KAAO,2BAA2B,CAAC,KAAO,eAAe,KAAO,2BAA2B,CAAC,KAAO,SAAS,KAAO,2BAA2B,CAAC,KAAO,cAAc,KAAO,mCAAmC,CAAC,KAAO,QAAQ,KAAO,mCAAmC,CAAC,KAAO,aAAa,KAAO,4BAA4B,KAAO,oBAAoB,CAAC,IAAM,UAAU,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,mBAAmB,CAAC,KAAO,OAAO,KAAO,UAAU,KAAO,mBAAmB,CAAC,IAAM,UAAU,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,mBAAmB,CAAC,KAAO,YAAY,KAAO,SAAS,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,oBAAoB,CAAC,GAAK,SAAS,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,mBAAmB,CAAC,KAAO,YAAY,KAAO,SAAS,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,oBAAoB,CAAC,IAAM,WAAW,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,mBAAmB,CAAC,KAAO,YAAY,KAAO,SAAS,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,oBAAoB,CAAC,IAAM,UAAU,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,mBAAmB,CAAC,KAAO,YAAY,KAAO,SAAS,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,oBAAoB,CAAC,GAAK,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,mBAAmB,CAAC,KAAO,YAAY,KAAO,SAAS,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,oBAAoB,CAAC,GAAK,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,mBAAmB,CAAC,KAAO,YAAY,KAAO,iBAAiB,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,oBAAoB,CAAC,GAAK,UAAU,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,CAAC,KAAO,OAAO,KAAO,SAAS,CAAC,KAAO,SAAS,KAAO,UAAU,KAAO,8BAA8B,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,iBAAiB,KAAO,8BAA8B,CAAC,KAAO,SAAS,KAAO,uBAAuB,CAAC,KAAO,SAAS,KAAO,4BAA4B,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,qBAAqB,KAAO,mBAAmB,KAAO,6BAA6B,CAAC,IAAM,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,gBAAgB,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,yBAAyB,CAAC,GAAK,UAAU,UAAY,kCAAkC,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,uBAAuB,CAAC,KAAO,cAAc,KAAO,+BAA+B,KAAO,iBAAiB,CAAC,IAAM,UAAU,UAAY,gCAAgC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,4BAA4B,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,yBAAyB,OAAS,GAAG,KAAO,qBAAqB,CAAC,GAAK,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,kCAAkC,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,gBAAgB,CAAC,GAAK,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,SAAS,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,2BAA2B,OAAS,GAAG,KAAO,qBAAqB,CAAC,IAAM,UAAU,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,eAAe,KAAO,UAAU,CAAC,IAAM,UAAU,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,oBAAoB,CAAC,IAAM,WAAW,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,iBAAiB,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,IAAI,KAAO,OAAO,CAAC,KAAO,IAAI,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,wBAAwB,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,GAAG,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,6BAA6B,OAAS,GAAG,KAAO,gBAAgB,CAAC,IAAM,UAAU,UAAY,yBAAyB,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,QAAQ,UAAY,+BAA+B,OAAS,GAAG,KAAO,yBAAyB,CAAC,IAAM,WAAW,UAAY,kDAAkD,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,UAAU,KAAO,yBAAyB,CAAC,IAAM,WAAW,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,UAAU,KAAO,yBAAyB,CAAC,GAAK,UAAU,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,cAAc,KAAO,yBAAyB,CAAC,KAAO,gBAAgB,KAAO,SAAS,CAAC,KAAO,mBAAmB,KAAO,SAAS,KAAO,wBAAwB,CAAC,GAAK,UAAU,UAAY,oEAAoE,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,SAAS,CAAC,KAAO,QAAQ,KAAO,SAAS,CAAC,KAAO,IAAI,KAAO,OAAO,CAAC,KAAO,IAAI,KAAO,UAAU,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,0BAA0B,OAAS,GAAG,KAAO,yBAAyB,CAAC,IAAM,UAAU,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,IAAI,KAAO,SAAS,CAAC,KAAO,KAAK,KAAO,UAAU,KAAO,yBAAyB,CAAC,IAAM,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,mBAAmB,CAAC,KAAO,OAAO,KAAO,SAAS,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,oBAAoB,CAAC,IAAM,WAAW,UAAY,kCAAkC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,mBAAmB,CAAC,KAAO,YAAY,KAAO,SAAS,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,oBAAoB,CAAC,GAAK,UAAU,UAAY,mCAAmC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,mBAAmB,CAAC,KAAO,YAAY,KAAO,iBAAiB,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,oBAAoB,CAAC,IAAM,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,kBAAkB,KAAO,gBAAgB,CAAC,KAAO,uBAAuB,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,oBAAoB,KAAO,sBAAsB,CAAC,GAAK,SAAS,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,+BAA+B,KAAO,sBAAsB,CAAC,IAAM,WAAW,UAAY,iCAAiC,OAAS,GAAG,KAAO,uBAAuB,CAAC,IAAM,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,kBAAkB,KAAO,aAAa,KAAO,uBAAuB,CAAC,GAAK,UAAU,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,cAAc,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,cAAc,KAAO,mBAAmB,CAAC,GAAK,WAAW,UAAY,WAAW,OAAS,GAAG,KAAO,aAAa,CAAC,IAAM,UAAU,UAAY,WAAW,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,SAAS,KAAO,aAAa,CAAC,GAAK,UAAU,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,aAAa,CAAC,IAAM,UAAU,UAAY,YAAY,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,sBAAsB,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,4BAA4B,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,wBAAwB,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,UAAU,UAAY,mBAAmB,OAAS,GAAG,KAAO,cAAc,CAAC,IAAM,UAAU,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,KAAO,YAAY,CAAC,IAAM,UAAU,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,KAAO,YAAY,CAAC,GAAK,SAAS,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,KAAO,YAAY,CAAC,GAAK,UAAU,UAAY,YAAY,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,YAAY,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,YAAY,CAAC,GAAK,UAAU,UAAY,YAAY,OAAS,CAAC,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,IAAI,KAAO,OAAO,CAAC,KAAO,IAAI,KAAO,QAAQ,KAAO,YAAY,CAAC,GAAK,UAAU,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,KAAO,aAAa,CAAC,GAAK,UAAU,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,oBAAoB,CAAC,KAAO,UAAU,KAAO,eAAe,CAAC,KAAO,UAAU,KAAO,gBAAgB,KAAO,iBAAiB,CAAC,IAAM,UAAU,UAAY,eAAe,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,0BAA0B,KAAO,gBAAgB,CAAC,IAAM,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,YAAY,CAAC,KAAO,OAAO,KAAO,yBAAyB,KAAO,aAAa,CAAC,GAAK,WAAW,UAAY,cAAc,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,YAAY,CAAC,KAAO,SAAS,KAAO,aAAa,KAAO,eAAe,CAAC,IAAM,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,KAAO,gBAAgB,CAAC,GAAK,UAAU,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,sBAAsB,KAAO,gBAAgB,CAAC,GAAK,WAAW,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,aAAa,KAAO,uBAAuB,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,sBAAsB,KAAO,uBAAuB,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,gCAAgC,KAAO,aAAa,CAAC,GAAK,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,qBAAqB,CAAC,KAAO,QAAQ,KAAO,aAAa,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,cAAc,KAAO,kBAAkB,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,kBAAkB,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,KAAO,sBAAsB,CAAC,GAAK,UAAU,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,YAAY,CAAC,KAAO,WAAW,KAAO,+BAA+B,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,eAAe,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,YAAY,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,IAAI,KAAO,OAAO,CAAC,KAAO,IAAI,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,gBAAgB,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,OAAO,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,MAAM,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,gBAAgB,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,qBAAqB,CAAC,KAAO,SAAS,KAAO,iBAAiB,CAAC,KAAO,YAAY,KAAO,oBAAoB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,KAAO,QAAQ,CAAC,IAAM,UAAU,UAAY,0BAA0B,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,qBAAqB,OAAS,GAAG,KAAO,cAAc,CAAC,GAAK,UAAU,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,YAAY,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,YAAY,CAAC,IAAM,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,oBAAoB,CAAC,IAAM,UAAU,UAAY,qBAAqB,OAAS,GAAG,KAAO,iBAAiB,CAAC,GAAK,SAAS,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,yBAAyB,CAAC,KAAO,SAAS,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,iBAAiB,CAAC,IAAM,UAAU,UAAY,6BAA6B,OAAS,GAAG,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,UAAU,KAAO,cAAc,CAAC,IAAM,WAAW,UAAY,OAAO,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,kBAAkB,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,UAAU,KAAO,sBAAsB,CAAC,KAAO,eAAe,KAAO,eAAe,CAAC,KAAO,aAAa,KAAO,gBAAgB,KAAO,QAAQ,CAAC,GAAK,UAAU,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,SAAS,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,oBAAoB,CAAC,IAAM,UAAU,UAAY,cAAc,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,MAAM,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,oCAAoC,CAAC,KAAO,eAAe,KAAO,eAAe,CAAC,KAAO,gBAAgB,KAAO,wBAAwB,CAAC,KAAO,WAAW,KAAO,kBAAkB,CAAC,KAAO,oBAAoB,KAAO,kCAAkC,KAAO,eAAe,CAAC,GAAK,UAAU,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,kBAAkB,KAAO,yBAAyB,CAAC,KAAO,WAAW,KAAO,kBAAkB,CAAC,KAAO,oBAAoB,KAAO,kCAAkC,KAAO,cAAc,CAAC,GAAK,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,IAAM,UAAU,UAAY,cAAc,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,KAAO,eAAe,CAAC,GAAK,WAAW,UAAY,WAAW,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,WAAW,KAAO,YAAY,CAAC,IAAM,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,UAAU,KAAO,aAAa,CAAC,GAAK,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,kBAAkB,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,iBAAiB,CAAC,KAAO,cAAc,KAAO,iBAAiB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,CAAC,KAAO,gBAAgB,KAAO,kBAAkB,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,iBAAiB,CAAC,KAAO,eAAe,KAAO,iBAAiB,CAAC,KAAO,eAAe,KAAO,iBAAiB,CAAC,KAAO,gBAAgB,KAAO,iBAAiB,CAAC,KAAO,aAAa,KAAO,QAAQ,KAAO,oBAAoB,CAAC,GAAK,WAAW,UAAY,gCAAgC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,wBAAwB,KAAO,oBAAoB,CAAC,KAAO,UAAU,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,UAAU,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,kBAAkB,CAAC,GAAK,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,IAAI,KAAO,WAAW,KAAO,6BAA6B,CAAC,GAAK,UAAU,UAAY,gDAAgD,OAAS,CAAC,CAAC,KAAO,qBAAqB,KAAO,oBAAoB,CAAC,KAAO,oBAAoB,KAAO,qBAAqB,KAAO,8BAA8B,CAAC,IAAM,WAAW,UAAY,qCAAqC,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,YAAY,KAAO,8BAA8B,CAAC,GAAK,UAAU,UAAY,gCAAgC,OAAS,GAAG,KAAO,sBAAsB,CAAC,IAAM,UAAU,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,aAAa,KAAO,sBAAsB,KAAO,sBAAsB,CAAC,IAAM,WAAW,UAAY,eAAe,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,kBAAkB,KAAO,gBAAgB,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,KAAO,oBAAoB,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,0BAA0B,KAAO,gBAAgB,CAAC,GAAK,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,mBAAmB,KAAO,eAAe,CAAC,KAAO,0BAA0B,KAAO,eAAe,CAAC,KAAO,yBAAyB,KAAO,eAAe,CAAC,KAAO,0BAA0B,KAAO,eAAe,CAAC,KAAO,YAAY,KAAO,eAAe,CAAC,KAAO,WAAW,KAAO,gBAAgB,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,sBAAsB,KAAO,gBAAgB,CAAC,KAAO,qBAAqB,KAAO,gBAAgB,CAAC,KAAO,uBAAuB,KAAO,gBAAgB,CAAC,KAAO,iBAAiB,KAAO,OAAO,CAAC,KAAO,iBAAiB,KAAO,QAAQ,CAAC,KAAO,gBAAgB,KAAO,QAAQ,CAAC,KAAO,0BAA0B,KAAO,QAAQ,KAAO,wBAAwB,CAAC,GAAK,WAAW,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,wBAAwB,CAAC,KAAO,SAAS,KAAO,wBAAwB,CAAC,KAAO,OAAO,KAAO,yBAAyB,KAAO,gCAAgC,CAAC,IAAM,UAAU,UAAY,eAAe,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,mBAAmB,KAAO,gBAAgB,CAAC,GAAK,UAAU,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,mBAAmB,KAAO,gBAAgB,CAAC,GAAK,WAAW,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,yBAAyB,KAAO,2BAA2B,CAAC,IAAM,WAAW,UAAY,WAAW,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,WAAW,KAAO,YAAY,CAAC,IAAM,WAAW,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,WAAW,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,0BAA0B,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,WAAW,UAAY,qBAAqB,OAAS,GAAG,KAAO,cAAc,CAAC,GAAK,WAAW,UAAY,8BAA8B,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,yBAAyB,OAAS,GAAG,KAAO,cAAc,CAAC,GAAK,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,iBAAiB,KAAO,SAAS,CAAC,KAAO,aAAa,KAAO,WAAW,KAAO,qBAAqB,CAAC,IAAM,UAAU,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,iBAAiB,KAAO,SAAS,CAAC,KAAO,YAAY,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,SAAS,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,MAAM,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,WAAW,KAAO,SAAS,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,mBAAmB,CAAC,KAAO,gBAAgB,KAAO,QAAQ,KAAO,qBAAqB,CAAC,IAAM,SAAS,UAAY,SAAS,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,0BAA0B,KAAO,gBAAgB,CAAC,KAAO,yBAAyB,KAAO,gBAAgB,CAAC,KAAO,8BAA8B,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,sBAAsB,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,eAAe,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,OAAO,CAAC,KAAO,2BAA2B,KAAO,OAAO,CAAC,KAAO,6BAA6B,KAAO,OAAO,CAAC,KAAO,8BAA8B,KAAO,OAAO,CAAC,KAAO,gCAAgC,KAAO,QAAQ,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,mBAAmB,CAAC,GAAK,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,cAAc,CAAC,IAAM,SAAS,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,mBAAmB,CAAC,IAAM,UAAU,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,cAAc,CAAC,GAAK,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,sBAAsB,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,aAAa,CAAC,GAAK,WAAW,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,SAAS,KAAO,gBAAgB,CAAC,IAAM,WAAW,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,SAAS,KAAO,aAAa,CAAC,GAAK,SAAS,UAAY,6BAA6B,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,UAAU,UAAY,wBAAwB,OAAS,GAAG,KAAO,cAAc,CAAC,IAAM,WAAW,UAAY,8BAA8B,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,SAAS,UAAY,8BAA8B,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,SAAS,UAAY,6CAA6C,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,YAAY,KAAO,SAAS,KAAO,8BAA8B,CAAC,IAAM,UAAU,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,0BAA0B,CAAC,GAAK,UAAU,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,kBAAkB,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,kBAAkB,CAAC,IAAM,UAAU,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,uBAAuB,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,kBAAkB,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,MAAM,KAAO,cAAc,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,uBAAuB,KAAO,gBAAgB,CAAC,KAAO,MAAM,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,WAAW,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,WAAW,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,GAAG,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,yCAAyC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,oBAAoB,CAAC,IAAM,UAAU,UAAY,4CAA4C,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,oBAAoB,CAAC,GAAK,WAAW,UAAY,oCAAoC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,eAAe,CAAC,GAAK,WAAW,UAAY,uCAAuC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,eAAe,CAAC,IAAM,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,iBAAiB,CAAC,GAAK,SAAS,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,iBAAiB,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,YAAY,CAAC,KAAO,UAAU,KAAO,WAAW,KAAO,mBAAmB,CAAC,IAAM,UAAU,UAAY,cAAc,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,QAAQ,KAAO,eAAe,CAAC,IAAM,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,wBAAwB,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,2CAA2C,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,mBAAmB,CAAC,KAAO,YAAY,KAAO,oBAAoB,KAAO,8BAA8B,CAAC,IAAM,UAAU,UAAY,iCAAiC,OAAS,GAAG,KAAO,gBAAgB,CAAC,GAAK,WAAW,UAAY,2CAA2C,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,8BAA8B,CAAC,GAAK,WAAW,UAAY,mCAAmC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,mBAAmB,KAAO,gCAAgC,KAAO,sBAAsB,CAAC,IAAM,UAAU,UAAY,qCAAqC,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,WAAW,KAAO,0BAA0B,CAAC,GAAK,SAAS,UAAY,+BAA+B,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,YAAY,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,gCAAgC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,gBAAgB,KAAO,UAAU,CAAC,IAAM,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,qBAAqB,CAAC,GAAK,WAAW,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,cAAc,CAAC,IAAM,UAAU,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,cAAc,CAAC,IAAM,WAAW,UAAY,QAAQ,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,oBAAoB,CAAC,KAAO,WAAW,KAAO,iCAAiC,CAAC,KAAO,WAAW,KAAO,kBAAkB,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,KAAO,SAAS,CAAC,IAAM,UAAU,UAAY,4BAA4B,OAAS,GAAG,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,kBAAkB,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,cAAc,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,KAAO,UAAU,CAAC,IAAM,UAAU,UAAY,8BAA8B,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,WAAW,UAAY,yBAAyB,OAAS,GAAG,KAAO,cAAc,CAAC,IAAM,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,mBAAmB,OAAS,GAAG,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,UAAU,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,UAAU,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,gBAAgB,KAAO,uBAAuB,KAAO,mBAAmB,CAAC,GAAK,WAAW,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,oBAAoB,KAAO,gBAAgB,CAAC,KAAO,uBAAuB,KAAO,iBAAiB,KAAO,2BAA2B,CAAC,IAAM,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,eAAe,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,0BAA0B,CAAC,IAAM,WAAW,UAAY,mBAAmB,OAAS,GAAG,KAAO,aAAa,CAAC,IAAM,SAAS,UAAY,eAAe,OAAS,GAAG,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,iBAAiB,OAAS,GAAG,KAAO,aAAa,CAAC,GAAK,WAAW,UAAY,kBAAkB,OAAS,GAAG,KAAO,aAAa,CAAC,GAAK,WAAW,UAAY,kBAAkB,OAAS,GAAG,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,SAAS,KAAO,kBAAkB,CAAC,IAAM,UAAU,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,8BAA8B,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,0BAA0B,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,aAAa,CAAC,KAAO,eAAe,KAAO,OAAO,CAAC,KAAO,sBAAsB,KAAO,eAAe,CAAC,KAAO,iBAAiB,KAAO,uBAAuB,CAAC,KAAO,YAAY,KAAO,0BAA0B,CAAC,KAAO,qBAAqB,KAAO,8BAA8B,KAAO,sBAAsB,CAAC,IAAM,SAAS,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,0BAA0B,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,aAAa,CAAC,KAAO,eAAe,KAAO,OAAO,CAAC,KAAO,sBAAsB,KAAO,eAAe,CAAC,KAAO,iBAAiB,KAAO,uBAAuB,CAAC,KAAO,YAAY,KAAO,sBAAsB,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,YAAY,KAAO,4BAA4B,CAAC,KAAO,WAAW,KAAO,0BAA0B,KAAO,oBAAoB,CAAC,GAAK,UAAU,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,iBAAiB,CAAC,KAAO,MAAM,KAAO,QAAQ,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,SAAS,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,mBAAmB,CAAC,GAAK,WAAW,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,iBAAiB,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,2BAA2B,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,mBAAmB,KAAO,sBAAsB,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,kBAAkB,CAAC,GAAK,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,iBAAiB,CAAC,IAAM,UAAU,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,mBAAmB,CAAC,GAAK,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,4BAA4B,KAAO,yBAAyB,CAAC,IAAM,UAAU,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,KAAO,eAAe,CAAC,GAAK,WAAW,UAAY,eAAe,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,iBAAiB,CAAC,KAAO,eAAe,KAAO,iBAAiB,CAAC,KAAO,mBAAmB,KAAO,iBAAiB,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,mBAAmB,CAAC,KAAO,eAAe,KAAO,qBAAqB,CAAC,KAAO,gBAAgB,KAAO,qBAAqB,CAAC,KAAO,gBAAgB,KAAO,sBAAsB,KAAO,gBAAgB,CAAC,GAAK,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,WAAW,KAAO,yBAAyB,CAAC,GAAK,UAAU,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,yBAAyB,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,gBAAgB,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,sBAAsB,OAAS,GAAG,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,QAAQ,KAAO,sBAAsB,CAAC,IAAM,UAAU,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,WAAW,KAAO,wBAAwB,CAAC,IAAM,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,qBAAqB,CAAC,GAAK,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,cAAc,CAAC,IAAM,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,cAAc,CAAC,IAAM,WAAW,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,YAAY,CAAC,KAAO,aAAa,KAAO,mBAAmB,KAAO,cAAc,CAAC,IAAM,WAAW,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,QAAQ,KAAO,8BAA8B,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,sBAAsB,CAAC,KAAO,YAAY,KAAO,wBAAwB,CAAC,KAAO,iBAAiB,KAAO,wBAAwB,CAAC,KAAO,kBAAkB,KAAO,wBAAwB,CAAC,KAAO,wBAAwB,KAAO,qBAAqB,CAAC,KAAO,eAAe,KAAO,cAAc,CAAC,KAAO,kBAAkB,KAAO,cAAc,CAAC,KAAO,aAAa,KAAO,cAAc,CAAC,KAAO,kBAAkB,KAAO,cAAc,CAAC,KAAO,qBAAqB,KAAO,cAAc,CAAC,KAAO,wBAAwB,KAAO,cAAc,CAAC,KAAO,wBAAwB,KAAO,cAAc,CAAC,KAAO,gCAAgC,KAAO,cAAc,CAAC,KAAO,kBAAkB,KAAO,cAAc,CAAC,KAAO,8BAA8B,KAAO,uCAAuC,KAAO,wBAAwB,CAAC,IAAM,UAAU,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,WAAW,KAAO,cAAc,CAAC,GAAK,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,WAAW,KAAO,gBAAgB,CAAC,IAAM,UAAU,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,WAAW,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,kBAAkB,CAAC,KAAO,cAAc,KAAO,mBAAmB,KAAO,kBAAkB,CAAC,IAAM,UAAU,UAAY,YAAY,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,IAAI,KAAO,OAAO,CAAC,KAAO,IAAI,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,iBAAiB,KAAO,mBAAmB,KAAO,aAAa,CAAC,GAAK,UAAU,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,gBAAgB,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,UAAU,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,QAAQ,KAAO,cAAc,CAAC,IAAM,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,uBAAuB,CAAC,IAAM,UAAU,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,sBAAsB,CAAC,GAAK,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,QAAQ,KAAO,wBAAwB,CAAC,IAAM,UAAU,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,sBAAsB,CAAC,KAAO,UAAU,KAAO,wBAAwB,CAAC,KAAO,WAAW,KAAO,wBAAwB,CAAC,KAAO,UAAU,KAAO,wBAAwB,CAAC,KAAO,UAAU,KAAO,wBAAwB,CAAC,KAAO,eAAe,KAAO,cAAc,CAAC,KAAO,gBAAgB,KAAO,cAAc,CAAC,KAAO,8BAA8B,KAAO,cAAc,CAAC,KAAO,kBAAkB,KAAO,cAAc,CAAC,KAAO,iBAAiB,KAAO,cAAc,CAAC,KAAO,gBAAgB,KAAO,cAAc,CAAC,KAAO,kBAAkB,KAAO,cAAc,CAAC,KAAO,iBAAiB,KAAO,cAAc,CAAC,KAAO,cAAc,KAAO,+BAA+B,CAAC,KAAO,aAAa,KAAO,8BAA8B,CAAC,KAAO,eAAe,KAAO,gCAAgC,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,wBAAwB,CAAC,IAAM,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,wCAAwC,KAAO,iBAAiB,KAAO,yBAAyB,CAAC,GAAK,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,KAAK,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,WAAW,KAAO,mBAAmB,CAAC,GAAK,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,0BAA0B,CAAC,KAAO,WAAW,KAAO,2BAA2B,KAAO,oBAAoB,CAAC,IAAM,WAAW,UAAY,eAAe,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,gBAAgB,KAAO,6BAA6B,KAAO,gBAAgB,CAAC,IAAM,WAAW,UAAY,gCAAgC,OAAS,GAAG,KAAO,sBAAsB,CAAC,IAAM,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,wBAAwB,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,sBAAsB,CAAC,GAAK,WAAW,UAAY,eAAe,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,eAAe,CAAC,KAAO,WAAW,KAAO,eAAe,CAAC,KAAO,UAAU,KAAO,2BAA2B,KAAO,gBAAgB,CAAC,IAAM,UAAU,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,SAAS,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,IAAI,KAAO,OAAO,CAAC,KAAO,IAAI,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,gBAAgB,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,wBAAwB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,yBAAyB,CAAC,IAAM,UAAU,UAAY,mCAAmC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,OAAO,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,oCAAoC,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,mBAAmB,CAAC,KAAO,SAAS,KAAO,eAAe,CAAC,KAAO,oBAAoB,KAAO,eAAe,CAAC,KAAO,qBAAqB,KAAO,eAAe,CAAC,KAAO,eAAe,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,8BAA8B,CAAC,IAAM,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,qBAAqB,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,kBAAkB,KAAO,OAAO,CAAC,KAAO,mBAAmB,KAAO,gBAAgB,CAAC,KAAO,kBAAkB,KAAO,gBAAgB,KAAO,sBAAsB,CAAC,IAAM,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,OAAO,CAAC,KAAO,kBAAkB,KAAO,wBAAwB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,eAAe,CAAC,KAAO,cAAc,KAAO,gBAAgB,KAAO,kBAAkB,CAAC,GAAK,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,UAAU,CAAC,IAAM,UAAU,UAAY,cAAc,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,eAAe,CAAC,IAAM,WAAW,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,sBAAsB,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,SAAS,KAAO,gBAAgB,CAAC,GAAK,UAAU,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,sBAAsB,CAAC,IAAM,UAAU,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,IAAI,KAAO,kBAAkB,CAAC,KAAO,aAAa,KAAO,gBAAgB,KAAO,6BAA6B,CAAC,IAAM,UAAU,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,eAAe,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,eAAe,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,4BAA4B,OAAS,GAAG,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,cAAc,KAAO,eAAe,KAAO,sBAAsB,CAAC,IAAM,WAAW,UAAY,mCAAmC,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,QAAQ,KAAO,iBAAiB,CAAC,IAAM,UAAU,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,UAAU,KAAO,aAAa,CAAC,IAAM,UAAU,UAAY,4BAA4B,OAAS,GAAG,KAAO,qBAAqB,CAAC,GAAK,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,QAAQ,KAAO,aAAa,CAAC,IAAM,UAAU,UAAY,YAAY,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,wBAAwB,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,4BAA4B,KAAO,gBAAgB,CAAC,KAAO,kBAAkB,KAAO,gBAAgB,CAAC,KAAO,sBAAsB,KAAO,iBAAiB,CAAC,KAAO,cAAc,KAAO,iBAAiB,CAAC,KAAO,mBAAmB,KAAO,iBAAiB,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,qBAAqB,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,eAAe,KAAO,eAAe,CAAC,KAAO,oBAAoB,KAAO,eAAe,CAAC,KAAO,gBAAgB,KAAO,eAAe,CAAC,KAAO,sBAAsB,KAAO,gBAAgB,CAAC,KAAO,sBAAsB,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,QAAQ,KAAO,aAAa,CAAC,IAAM,UAAU,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,kBAAkB,CAAC,GAAK,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,WAAW,KAAO,gBAAgB,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,iCAAiC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,IAAM,UAAU,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,kBAAkB,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,MAAM,KAAO,gBAAgB,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,kBAAkB,KAAO,iBAAiB,CAAC,KAAO,OAAO,KAAO,iBAAiB,CAAC,KAAO,eAAe,KAAO,iBAAiB,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,eAAe,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,eAAe,CAAC,KAAO,QAAQ,KAAO,mBAAmB,CAAC,KAAO,oBAAoB,KAAO,iBAAiB,CAAC,KAAO,QAAQ,KAAO,qCAAqC,CAAC,KAAO,eAAe,KAAO,uCAAuC,KAAO,wBAAwB,CAAC,IAAM,UAAU,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,UAAU,CAAC,IAAM,UAAU,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,eAAe,KAAO,gCAAgC,CAAC,KAAO,UAAU,KAAO,QAAQ,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,cAAc,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,eAAe,KAAO,gCAAgC,CAAC,KAAO,2BAA2B,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,mBAAmB,CAAC,IAAM,UAAU,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,eAAe,KAAO,gCAAgC,CAAC,KAAO,cAAc,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,QAAQ,KAAO,2BAA2B,CAAC,GAAK,UAAU,UAAY,+BAA+B,OAAS,GAAG,KAAO,uBAAuB,CAAC,IAAM,WAAW,UAAY,wBAAwB,OAAS,GAAG,KAAO,uBAAuB,CAAC,IAAM,UAAU,UAAY,0BAA0B,OAAS,GAAG,KAAO,uBAAuB,CAAC,GAAK,WAAW,UAAY,+BAA+B,OAAS,GAAG,KAAO,uBAAuB,CAAC,GAAK,WAAW,UAAY,+BAA+B,OAAS,GAAG,KAAO,uBAAuB,CAAC,GAAK,UAAU,UAAY,2CAA2C,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,mBAAmB,KAAO,8BAA8B,CAAC,IAAM,UAAU,UAAY,6CAA6C,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,mBAAmB,KAAO,8BAA8B,CAAC,IAAM,UAAU,UAAY,4CAA4C,OAAS,CAAC,CAAC,KAAO,cAAc,KAAO,yBAAyB,KAAO,8BAA8B,CAAC,IAAM,UAAU,UAAY,8CAA8C,OAAS,CAAC,CAAC,KAAO,cAAc,KAAO,yBAAyB,KAAO,8BAA8B,CAAC,GAAK,WAAW,UAAY,mDAAmD,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,SAAS,KAAO,8BAA8B,CAAC,IAAM,WAAW,UAAY,mCAAmC,OAAS,CAAC,CAAC,KAAO,gBAAgB,KAAO,aAAa,KAAO,2BAA2B,CAAC,GAAK,UAAU,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,SAAS,KAAO,0BAA0B,CAAC,IAAM,UAAU,UAAY,iCAAiC,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,QAAQ,KAAO,qBAAqB,CAAC,GAAK,WAAW,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,KAAK,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,mBAAmB,KAAO,gCAAgC,CAAC,IAAM,UAAU,UAAY,wBAAwB,OAAS,GAAG,KAAO,gBAAgB,CAAC,IAAM,UAAU,UAAY,iCAAiC,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,gBAAgB,KAAO,kCAAkC,CAAC,GAAK,WAAW,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,oBAAoB,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,aAAa,KAAO,gBAAgB,KAAO,UAAU,CAAC,IAAM,UAAU,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,mBAAmB,KAAO,2BAA2B,CAAC,KAAO,kBAAkB,KAAO,2BAA2B,CAAC,KAAO,SAAS,KAAO,8BAA8B,CAAC,KAAO,MAAM,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,mBAAmB,KAAO,8BAA8B,CAAC,KAAO,kBAAkB,KAAO,8BAA8B,CAAC,KAAO,SAAS,KAAO,8BAA8B,CAAC,KAAO,MAAM,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,UAAU,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,MAAM,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,cAAc,KAAO,iBAAiB,KAAO,sBAAsB,CAAC,IAAM,WAAW,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,8BAA8B,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,gCAAgC,CAAC,GAAK,UAAU,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,sBAAsB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,+BAA+B,CAAC,GAAK,UAAU,UAAY,sCAAsC,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,sBAAsB,CAAC,KAAO,aAAa,KAAO,sBAAsB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,+BAA+B,CAAC,IAAM,WAAW,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,8BAA8B,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,gCAAgC,CAAC,IAAM,UAAU,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,gBAAgB,KAAO,OAAO,CAAC,KAAO,wBAAwB,KAAO,QAAQ,KAAO,wBAAwB,CAAC,IAAM,WAAW,UAAY,iCAAiC,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,gCAAgC,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,kCAAkC,CAAC,GAAK,WAAW,UAAY,oDAAoD,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,uBAAuB,KAAO,8BAA8B,CAAC,GAAK,WAAW,UAAY,iDAAiD,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,uBAAuB,KAAO,8BAA8B,CAAC,GAAK,WAAW,UAAY,iDAAiD,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,uBAAuB,KAAO,8BAA8B,CAAC,IAAM,UAAU,UAAY,+CAA+C,OAAS,CAAC,CAAC,KAAO,cAAc,KAAO,sBAAsB,CAAC,KAAO,aAAa,KAAO,uBAAuB,KAAO,8BAA8B,CAAC,GAAK,WAAW,UAAY,8CAA8C,OAAS,CAAC,CAAC,KAAO,cAAc,KAAO,yBAAyB,KAAO,8BAA8B,CAAC,GAAK,WAAW,UAAY,6CAA6C,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,8BAA8B,CAAC,IAAM,WAAW,UAAY,oCAAoC,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,WAAW,KAAO,qCAAqC,CAAC,GAAK,SAAS,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,gBAAgB,KAAO,eAAe,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,gCAAgC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,iCAAiC,CAAC,IAAM,UAAU,UAAY,oCAAoC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,4BAA4B,CAAC,KAAO,UAAU,KAAO,WAAW,CAAC,KAAO,UAAU,KAAO,SAAS,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,gBAAgB,KAAO,YAAY,CAAC,KAAO,eAAe,KAAO,wBAAwB,KAAO,yBAAyB,CAAC,GAAK,UAAU,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,6BAA6B,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,uBAAuB,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,QAAQ,CAAC,KAAO,eAAe,KAAO,wBAAwB,KAAO,oBAAoB,CAAC,IAAM,WAAW,UAAY,kCAAkC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,gBAAgB,KAAO,QAAQ,KAAO,iBAAiB,CAAC,IAAM,UAAU,UAAY,uCAAuC,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,UAAU,KAAO,gBAAgB,KAAO,wCAAwC,CAAC,GAAK,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,gBAAgB,KAAO,gDAAgD,CAAC,KAAO,eAAe,KAAO,gBAAgB,KAAO,6BAA6B,CAAC,GAAK,UAAU,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,aAAa,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,WAAW,KAAO,+BAA+B,CAAC,GAAK,UAAU,UAAY,yBAAyB,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,WAAW,UAAY,uBAAuB,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,WAAW,UAAY,uBAAuB,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,UAAU,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,cAAc,KAAO,mBAAmB,CAAC,GAAK,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,cAAc,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,UAAU,KAAO,cAAc,KAAO,mBAAmB,CAAC,IAAM,UAAU,UAAY,kCAAkC,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,QAAQ,KAAO,+BAA+B,CAAC,IAAM,UAAU,UAAY,qCAAqC,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,QAAQ,KAAO,+BAA+B,CAAC,IAAM,UAAU,UAAY,0BAA0B,OAAS,GAAG,KAAO,+BAA+B,CAAC,GAAK,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,uBAAuB,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,WAAW,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,iCAAiC,OAAS,GAAG,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,kBAAkB,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,SAAS,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,sBAAsB,CAAC,KAAO,mBAAmB,KAAO,kBAAkB,CAAC,KAAO,eAAe,KAAO,eAAe,CAAC,KAAO,cAAc,KAAO,kBAAkB,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,kCAAkC,KAAO,oBAAoB,CAAC,IAAM,UAAU,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,gBAAgB,KAAO,eAAe,CAAC,KAAO,WAAW,KAAO,4BAA4B,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,8BAA8B,CAAC,GAAK,UAAU,UAAY,yCAAyC,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,aAAa,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,kCAAkC,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,WAAW,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,2BAA2B,CAAC,IAAM,UAAU,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,+BAA+B,CAAC,GAAK,UAAU,UAAY,iCAAiC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,mBAAmB,KAAO,eAAe,CAAC,KAAO,UAAU,KAAO,uCAAuC,CAAC,KAAO,WAAW,KAAO,mBAAmB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,kCAAkC,CAAC,GAAK,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,yBAAyB,CAAC,GAAK,WAAW,UAAY,kCAAkC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,kCAAkC,KAAO,mCAAmC,CAAC,IAAM,UAAU,UAAY,mCAAmC,OAAS,GAAG,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,mBAAmB,KAAO,OAAO,CAAC,KAAO,oBAAoB,KAAO,iBAAiB,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,sBAAsB,CAAC,KAAO,MAAM,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,qDAAqD,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,sBAAsB,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,8BAA8B,CAAC,IAAM,UAAU,UAAY,iCAAiC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,UAAU,KAAO,cAAc,KAAO,kBAAkB,CAAC,GAAK,UAAU,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,kBAAkB,CAAC,IAAM,UAAU,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,sBAAsB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,wBAAwB,CAAC,IAAM,UAAU,UAAY,6CAA6C,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,SAAS,KAAO,8BAA8B,CAAC,IAAM,UAAU,UAAY,iCAAiC,OAAS,GAAG,KAAO,uBAAuB,CAAC,GAAK,UAAU,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,YAAY,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,kBAAkB,CAAC,GAAK,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,yBAAyB,CAAC,GAAK,UAAU,UAAY,wCAAwC,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,YAAY,KAAO,8BAA8B,CAAC,IAAM,UAAU,UAAY,0BAA0B,OAAS,GAAG,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,oBAAoB,KAAO,kBAAkB,KAAO,kBAAkB,CAAC,GAAK,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,YAAY,KAAO,qBAAqB,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,eAAe,KAAO,eAAe,CAAC,KAAO,WAAW,KAAO,YAAY,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,MAAM,KAAO,gBAAgB,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,yBAAyB,CAAC,KAAO,mBAAmB,KAAO,wCAAwC,KAAO,oBAAoB,CAAC,GAAK,UAAU,UAAY,gCAAgC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,+BAA+B,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,mBAAmB,KAAO,iCAAiC,CAAC,IAAM,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,YAAY,CAAC,KAAO,mBAAmB,KAAO,YAAY,CAAC,KAAO,mBAAmB,KAAO,YAAY,CAAC,KAAO,qBAAqB,KAAO,YAAY,CAAC,KAAO,mBAAmB,KAAO,YAAY,CAAC,KAAO,mBAAmB,KAAO,oBAAoB,CAAC,KAAO,cAAc,KAAO,qBAAqB,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,yCAAyC,OAAS,GAAG,KAAO,+BAA+B,CAAC,GAAK,WAAW,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,8BAA8B,KAAO,+BAA+B,CAAC,GAAK,UAAU,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,qDAAqD,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,iBAAiB,CAAC,KAAO,YAAY,KAAO,kBAAkB,KAAO,8BAA8B,CAAC,GAAK,WAAW,UAAY,6BAA6B,OAAS,GAAG,KAAO,2BAA2B,CAAC,IAAM,WAAW,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,2BAA2B,CAAC,IAAM,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,MAAM,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,aAAa,KAAO,uBAAuB,CAAC,IAAM,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,oBAAoB,KAAO,SAAS,KAAO,0BAA0B,CAAC,IAAM,UAAU,UAAY,gCAAgC,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,mCAAmC,KAAO,iCAAiC,CAAC,GAAK,UAAU,UAAY,gCAAgC,OAAS,GAAG,KAAO,gBAAgB,CAAC,IAAM,WAAW,UAAY,mCAAmC,OAAS,GAAG,KAAO,gBAAgB,CAAC,GAAK,UAAU,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,MAAM,KAAO,WAAW,KAAO,gCAAgC,CAAC,GAAK,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,0BAA0B,CAAC,IAAM,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,YAAY,CAAC,KAAO,SAAS,KAAO,2CAA2C,KAAO,qBAAqB,CAAC,IAAM,UAAU,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,uBAAuB,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,aAAa,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,8BAA8B,CAAC,KAAO,QAAQ,KAAO,8BAA8B,KAAO,iBAAiB,CAAC,IAAM,UAAU,UAAY,4BAA4B,OAAS,GAAG,KAAO,kBAAkB,CAAC,GAAK,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,yBAAyB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,iBAAiB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,uBAAuB,OAAS,GAAG,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,MAAM,KAAO,WAAW,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,WAAW,KAAO,uBAAuB,CAAC,GAAK,UAAU,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,oCAAoC,KAAO,sBAAsB,CAAC,GAAK,UAAU,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,SAAS,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,MAAM,KAAO,WAAW,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,MAAM,KAAO,WAAW,KAAO,kBAAkB,CAAC,GAAK,WAAW,UAAY,iCAAiC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,iBAAiB,CAAC,GAAK,UAAU,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,kBAAkB,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,uBAAuB,OAAS,GAAG,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,wBAAwB,OAAS,GAAG,KAAO,iBAAiB,CAAC,IAAM,UAAU,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,MAAM,KAAO,WAAW,KAAO,iBAAiB,CAAC,IAAM,SAAS,UAAY,oCAAoC,OAAS,GAAG,KAAO,0BAA0B,CAAC,IAAM,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,YAAY,KAAO,qBAAqB,KAAO,0BAA0B,CAAC,GAAK,WAAW,UAAY,uBAAuB,OAAS,GAAG,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,2BAA2B,OAAS,GAAG,KAAO,qBAAqB,CAAC,GAAK,WAAW,UAAY,wBAAwB,OAAS,GAAG,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,qBAAqB,CAAC,IAAM,QAAQ,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,SAAS,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,wBAAwB,OAAS,GAAG,KAAO,yBAAyB,CAAC,GAAK,UAAU,UAAY,iCAAiC,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,aAAa,KAAO,yBAAyB,CAAC,GAAK,WAAW,UAAY,8BAA8B,OAAS,GAAG,KAAO,sBAAsB,CAAC,IAAM,WAAW,UAAY,0BAA0B,OAAS,GAAG,KAAO,sBAAsB,CAAC,IAAM,UAAU,UAAY,uBAAuB,OAAS,GAAG,KAAO,sBAAsB,CAAC,GAAK,SAAS,UAAY,yBAAyB,OAAS,GAAG,KAAO,sBAAsB,CAAC,GAAK,WAAW,UAAY,8BAA8B,OAAS,GAAG,KAAO,sBAAsB,CAAC,IAAM,UAAU,UAAY,+BAA+B,OAAS,GAAG,KAAO,sBAAsB,CAAC,IAAM,UAAU,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,gBAAgB,CAAC,IAAM,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,gBAAgB,CAAC,IAAM,WAAW,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,WAAW,KAAO,4BAA4B,CAAC,GAAK,QAAQ,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,mBAAmB,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,mBAAmB,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,6BAA6B,CAAC,GAAK,UAAU,UAAY,sBAAsB,OAAS,GAAG,KAAO,gBAAgB,CAAC,GAAK,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,cAAc,KAAO,UAAU,CAAC,KAAO,kBAAkB,KAAO,yBAAyB,CAAC,KAAO,iBAAiB,KAAO,kBAAkB,CAAC,KAAO,SAAS,KAAO,oBAAoB,CAAC,KAAO,iBAAiB,KAAO,qCAAqC,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,qBAAqB,CAAC,IAAM,UAAU,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,iBAAiB,CAAC,IAAM,SAAS,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,oBAAoB,KAAO,qBAAqB,CAAC,GAAK,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,cAAc,CAAC,KAAO,QAAQ,KAAO,uBAAuB,CAAC,KAAO,WAAW,KAAO,0BAA0B,CAAC,KAAO,YAAY,KAAO,qBAAqB,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,uCAAuC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,iBAAiB,KAAO,4BAA4B,CAAC,GAAK,WAAW,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,aAAa,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,SAAS,KAAO,4BAA4B,CAAC,IAAM,WAAW,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,gBAAgB,KAAO,mBAAmB,KAAO,qBAAqB,CAAC,IAAM,UAAU,UAAY,8BAA8B,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,SAAS,UAAY,kCAAkC,OAAS,GAAG,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,+BAA+B,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,0BAA0B,OAAS,GAAG,KAAO,cAAc,CAAC,IAAM,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,qBAAqB,CAAC,IAAM,UAAU,UAAY,sCAAsC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,yBAAyB,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,YAAY,KAAO,mBAAmB,KAAO,wBAAwB,CAAC,GAAK,UAAU,UAAY,mBAAmB,OAAS,GAAG,KAAO,eAAe,CAAC,IAAM,WAAW,UAAY,cAAc,OAAS,CAAC,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,eAAe,CAAC,IAAM,SAAS,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,eAAe,CAAC,GAAK,UAAU,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,eAAe,KAAO,gBAAgB,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,4BAA4B,OAAS,GAAG,KAAO,UAAU,CAAC,IAAM,UAAU,UAAY,mCAAmC,OAAS,GAAG,KAAO,yBAAyB,CAAC,IAAM,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,wBAAwB,KAAO,yBAAyB,CAAC,GAAK,WAAW,UAAY,gBAAgB,OAAS,GAAG,KAAO,YAAY,CAAC,GAAK,UAAU,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,WAAW,KAAO,YAAY,CAAC,IAAM,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,YAAY,CAAC,IAAM,UAAU,UAAY,oBAAoB,OAAS,GAAG,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,eAAe,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,qBAAqB,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,gCAAgC,OAAS,GAAG,KAAO,sBAAsB,CAAC,IAAM,UAAU,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,YAAY,KAAO,qBAAqB,KAAO,sBAAsB,CAAC,GAAK,WAAW,UAAY,wBAAwB,OAAS,GAAG,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,SAAS,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,uBAAuB,KAAO,gBAAgB,CAAC,KAAO,wBAAwB,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,wBAAwB,KAAO,gBAAgB,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,sCAAsC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,uBAAuB,KAAO,gBAAgB,CAAC,KAAO,wBAAwB,KAAO,iBAAiB,KAAO,qBAAqB,CAAC,GAAK,WAAW,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,kBAAkB,KAAO,WAAW,KAAO,sBAAsB,CAAC,GAAK,WAAW,UAAY,gCAAgC,OAAS,GAAG,KAAO,sBAAsB,CAAC,IAAM,WAAW,UAAY,6BAA6B,OAAS,GAAG,KAAO,sBAAsB,CAAC,IAAM,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,qBAAqB,CAAC,IAAM,UAAU,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,yBAAyB,CAAC,IAAM,UAAU,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,kBAAkB,KAAO,yBAAyB,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,uBAAuB,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,gBAAgB,KAAO,mBAAmB,KAAO,6BAA6B,CAAC,GAAK,SAAS,UAAY,wCAAwC,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,sCAAsC,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,mBAAmB,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,cAAc,CAAC,IAAM,WAAW,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,IAAI,KAAO,eAAe,CAAC,KAAO,IAAI,KAAO,eAAe,CAAC,KAAO,QAAQ,KAAO,qBAAqB,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,KAAO,wBAAwB,CAAC,IAAM,UAAU,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,wBAAwB,CAAC,GAAK,WAAW,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,iBAAiB,KAAO,yBAAyB,KAAO,UAAU,CAAC,IAAM,SAAS,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,mBAAmB,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,WAAW,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,WAAW,KAAO,YAAY,CAAC,IAAM,UAAU,UAAY,4CAA4C,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,kBAAkB,CAAC,KAAO,YAAY,KAAO,mBAAmB,KAAO,8BAA8B,CAAC,GAAK,SAAS,UAAY,wCAAwC,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,SAAS,KAAO,8BAA8B,CAAC,GAAK,WAAW,UAAY,wCAAwC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,eAAe,KAAO,8BAA8B,CAAC,IAAM,UAAU,UAAY,sCAAsC,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,cAAc,CAAC,KAAO,YAAY,KAAO,eAAe,KAAO,8BAA8B,CAAC,IAAM,WAAW,UAAY,wCAAwC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,eAAe,KAAO,8BAA8B,CAAC,GAAK,WAAW,UAAY,qCAAqC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,aAAa,KAAO,sBAAsB,CAAC,KAAO,YAAY,KAAO,uBAAuB,KAAO,8BAA8B,CAAC,GAAK,SAAS,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,KAAO,cAAc,CAAC,GAAK,WAAW,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,KAAK,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,OAAO,CAAC,KAAO,oBAAoB,KAAO,OAAO,CAAC,KAAO,qBAAqB,KAAO,OAAO,CAAC,KAAO,eAAe,KAAO,OAAO,CAAC,KAAO,wBAAwB,KAAO,OAAO,CAAC,KAAO,yBAAyB,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,kBAAkB,KAAO,sBAAsB,CAAC,KAAO,QAAQ,KAAO,yBAAyB,KAAO,cAAc,CAAC,GAAK,UAAU,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,uBAAuB,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,sBAAsB,CAAC,KAAO,WAAW,KAAO,mBAAmB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,MAAM,KAAO,QAAQ,KAAO,wBAAwB,CAAC,GAAK,UAAU,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,gBAAgB,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,GAAK,UAAU,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,QAAQ,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,aAAa,KAAO,QAAQ,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,aAAa,KAAO,QAAQ,KAAO,cAAc,CAAC,GAAK,WAAW,UAAY,wCAAwC,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,kCAAkC,OAAS,GAAG,KAAO,8BAA8B,CAAC,IAAM,SAAS,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,wBAAwB,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,2BAA2B,OAAS,GAAG,KAAO,iBAAiB,CAAC,IAAM,UAAU,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,qBAAqB,CAAC,GAAK,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,UAAU,KAAO,QAAQ,KAAO,wBAAwB,CAAC,GAAK,WAAW,UAAY,2CAA2C,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,SAAS,KAAO,8BAA8B,CAAC,GAAK,WAAW,UAAY,mCAAmC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,KAAO,iBAAiB,CAAC,IAAM,UAAU,UAAY,oCAAoC,OAAS,GAAG,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,eAAe,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,WAAW,QAAU,CAAC,CAAC,IAAM,UAAU,OAAS,iBAAiB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,OAAO,KAAO,KAAK,CAAC,GAAK,WAAW,OAAS,kBAAkB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,OAAO,KAAO,KAAK,CAAC,IAAM,WAAW,OAAS,gBAAgB,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,IAAM,WAAW,OAAS,cAAc,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,kBAAkB,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,WAAW,KAAO,sBAAsB,CAAC,IAAM,WAAW,OAAS,cAAc,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,kBAAkB,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,kBAAkB,CAAC,KAAO,qBAAqB,KAAO,8BAA8B,KAAO,sBAAsB,CAAC,GAAK,WAAW,OAAS,cAAc,OAAS,GAAG,KAAO,kBAAkB,CAAC,IAAM,WAAW,OAAS,2BAA2B,OAAS,GAAG,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,8BAA8B,CAAC,IAAM,WAAW,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,UAAU,KAAO,sBAAsB,CAAC,IAAM,UAAU,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,mBAAmB,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,QAAQ,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,oBAAoB,KAAO,UAAU,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,SAAS,CAAC,KAAO,aAAa,KAAO,iBAAiB,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,iBAAiB,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,mBAAmB,CAAC,KAAO,WAAW,KAAO,4BAA4B,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,oBAAoB,KAAO,sBAAsB,CAAC,IAAM,UAAU,OAAS,8BAA8B,OAAS,GAAG,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,aAAa,KAAO,kBAAkB,CAAC,KAAO,YAAY,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,mBAAmB,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,sBAAsB,CAAC,IAAM,UAAU,OAAS,qBAAqB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,WAAW,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,iBAAiB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,sBAAsB,KAAO,gBAAgB,CAAC,IAAM,WAAW,OAAS,oBAAoB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,cAAc,KAAO,kBAAkB,CAAC,GAAK,WAAW,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,eAAe,CAAC,IAAM,UAAU,OAAS,uBAAuB,OAAS,GAAG,KAAO,yBAAyB,CAAC,GAAK,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,qBAAqB,CAAC,GAAK,UAAU,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,yBAAyB,KAAO,6BAA6B,CAAC,GAAK,UAAU,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,sBAAsB,KAAO,WAAW,CAAC,GAAK,UAAU,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,mBAAmB,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,iBAAiB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,cAAc,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,mBAAmB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,cAAc,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,oBAAoB,CAAC,GAAK,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,yBAAyB,KAAO,qBAAqB,CAAC,IAAM,WAAW,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,eAAe,CAAC,KAAO,cAAc,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,aAAa,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,oBAAoB,CAAC,GAAK,WAAW,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,qBAAqB,CAAC,IAAM,WAAW,OAAS,kBAAkB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,IAAI,KAAO,UAAU,CAAC,KAAO,UAAU,KAAO,qBAAqB,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,SAAS,KAAO,kBAAkB,CAAC,KAAO,WAAW,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,qBAAqB,CAAC,GAAK,UAAU,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,6BAA6B,CAAC,IAAM,WAAW,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,eAAe,CAAC,KAAO,WAAW,KAAO,gBAAgB,KAAO,4BAA4B,CAAC,IAAM,UAAU,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,gBAAgB,KAAO,6BAA6B,CAAC,GAAK,SAAS,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,iCAAiC,CAAC,GAAK,WAAW,OAAS,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,SAAS,KAAO,sBAAsB,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,iBAAiB,CAAC,KAAO,2BAA2B,KAAO,iBAAiB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,kBAAkB,KAAO,eAAe,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,QAAQ,CAAC,KAAO,eAAe,KAAO,uBAAuB,CAAC,KAAO,WAAW,KAAO,iCAAiC,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,uBAAuB,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,iBAAiB,CAAC,KAAO,2BAA2B,KAAO,iBAAiB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,kBAAkB,KAAO,eAAe,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,QAAQ,KAAO,cAAc,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,QAAQ,CAAC,KAAO,eAAe,KAAO,uBAAuB,CAAC,KAAO,WAAW,KAAO,iCAAiC,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,uBAAuB,KAAO,WAAW,CAAC,IAAM,UAAU,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,iBAAiB,CAAC,KAAO,sBAAsB,KAAO,iBAAiB,CAAC,KAAO,aAAa,KAAO,iBAAiB,CAAC,KAAO,YAAY,KAAO,aAAa,CAAC,KAAO,KAAK,KAAO,eAAe,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,aAAa,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,uBAAuB,KAAO,WAAW,CAAC,IAAM,UAAU,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,cAAc,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,cAAc,KAAO,yBAAyB,CAAC,IAAM,WAAW,OAAS,kBAAkB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,KAAK,KAAO,eAAe,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,WAAW,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,oBAAoB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,iBAAiB,KAAO,kBAAkB,CAAC,IAAM,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,qBAAqB,CAAC,GAAK,WAAW,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,WAAW,CAAC,GAAK,UAAU,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,mBAAmB,KAAO,WAAW,CAAC,IAAM,UAAU,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,aAAa,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,WAAW,CAAC,IAAM,WAAW,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,cAAc,KAAO,WAAW,CAAC,GAAK,QAAQ,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,qBAAqB,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,gBAAgB,KAAO,WAAW,CAAC,IAAM,UAAU,OAAS,mBAAmB,OAAS,GAAG,KAAO,iBAAiB,CAAC,GAAK,UAAU,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,kBAAkB,KAAO,eAAe,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,MAAM,KAAO,QAAQ,KAAO,sBAAsB,CAAC,GAAK,UAAU,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,eAAe,KAAO,gBAAgB,CAAC,IAAM,WAAW,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,qBAAqB,CAAC,KAAO,QAAQ,KAAO,qBAAqB,CAAC,KAAO,iBAAiB,KAAO,mBAAmB,KAAO,gBAAgB,CAAC,IAAM,WAAW,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,uBAAuB,KAAO,gBAAgB,CAAC,IAAM,WAAW,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,UAAU,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,iBAAiB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,qBAAqB,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,eAAe,CAAC,IAAM,UAAU,OAAS,iBAAiB,OAAS,GAAG,KAAO,UAAU,CAAC,GAAK,UAAU,OAAS,oBAAoB,OAAS,GAAG,KAAO,aAAa,CAAC,GAAK,WAAW,OAAS,oBAAoB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,WAAW,KAAO,kBAAkB,CAAC,GAAK,WAAW,OAAS,qBAAqB,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,iBAAiB,CAAC,GAAK,UAAU,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,OAAO,CAAC,KAAO,gBAAgB,KAAO,QAAQ,KAAO,qBAAqB,CAAC,IAAM,UAAU,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,aAAa,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,MAAM,KAAO,UAAU,KAAO,iBAAiB,CAAC,GAAK,WAAW,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,sBAAsB,CAAC,KAAO,MAAM,KAAO,SAAS,CAAC,KAAO,kBAAkB,KAAO,SAAS,KAAO,iBAAiB,CAAC,IAAM,UAAU,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,QAAQ,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,sBAAsB,CAAC,KAAO,SAAS,KAAO,SAAS,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,gCAAgC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,sBAAsB,CAAC,KAAO,WAAW,KAAO,QAAQ,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,sBAAsB,CAAC,KAAO,YAAY,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,UAAU,KAAO,iCAAiC,CAAC,GAAK,WAAW,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,sBAAsB,CAAC,KAAO,YAAY,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,SAAS,CAAC,KAAO,OAAO,KAAO,uBAAuB,KAAO,iCAAiC,CAAC,GAAK,UAAU,OAAS,gCAAgC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,sBAAsB,CAAC,KAAO,YAAY,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,UAAU,KAAO,iCAAiC,CAAC,GAAK,WAAW,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,KAAO,gBAAgB,CAAC,GAAK,WAAW,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,uBAAuB,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,mBAAmB,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,UAAU,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,iBAAiB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,iBAAiB,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,UAAU,CAAC,KAAO,mBAAmB,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,4BAA4B,CAAC,KAAO,SAAS,KAAO,qBAAqB,CAAC,KAAO,QAAQ,KAAO,OAAO,KAAO,KAAK,CAAC,IAAM,WAAW,OAAS,kBAAkB,OAAS,GAAG,KAAO,gBAAgB,CAAC,GAAK,UAAU,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,gBAAgB,KAAO,6BAA6B,CAAC,GAAK,UAAU,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,WAAW,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,WAAW,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,kBAAkB,OAAS,CAAC,CAAC,KAAO,IAAI,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,kBAAkB,CAAC,IAAM,UAAU,OAAS,qBAAqB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,oBAAoB,KAAO,wBAAwB,CAAC,IAAM,UAAU,OAAS,qBAAqB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,mBAAmB,CAAC,KAAO,QAAQ,KAAO,6BAA6B,KAAO,wBAAwB,CAAC,IAAM,WAAW,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,kCAAkC,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,wBAAwB,OAAS,GAAG,KAAO,kBAAkB,CAAC,GAAK,UAAU,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,mBAAmB,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,kBAAkB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,OAAO,KAAO,KAAK,CAAC,IAAM,UAAU,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,WAAW,KAAO,yBAAyB,CAAC,IAAM,WAAW,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,GAAK,WAAW,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,kBAAkB,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,WAAW,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,qBAAqB,CAAC,IAAM,WAAW,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,wBAAwB,CAAC,GAAK,UAAU,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,iBAAiB,KAAO,WAAW,KAAO,sBAAsB,CAAC,IAAM,WAAW,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,kCAAkC,KAAO,gBAAgB,CAAC,IAAM,UAAU,OAAS,4BAA4B,OAAS,GAAG,KAAO,0BAA0B,CAAC,IAAM,UAAU,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,sBAAsB,OAAS,GAAG,KAAO,oBAAoB,CAAC,IAAM,WAAW,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,0BAA0B,KAAO,4BAA4B,CAAC,IAAM,WAAW,OAAS,iCAAiC,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,yBAAyB,CAAC,KAAO,eAAe,KAAO,kCAAkC,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,qBAAqB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,0BAA0B,KAAO,sBAAsB,CAAC,IAAM,UAAU,OAAS,+BAA+B,OAAS,GAAG,KAAO,yBAAyB,CAAC,GAAK,UAAU,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,0CAA0C,KAAO,sBAAsB,CAAC,IAAM,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,OAAO,KAAO,KAAK,CAAC,IAAM,WAAW,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,0BAA0B,KAAO,gBAAgB,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,cAAc,KAAO,eAAe,CAAC,KAAO,cAAc,KAAO,eAAe,CAAC,KAAO,QAAQ,KAAO,mBAAmB,KAAO,sBAAsB,CAAC,GAAK,WAAW,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,cAAc,CAAC,GAAK,WAAW,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,WAAW,CAAC,IAAM,UAAU,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,mBAAmB,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,uBAAuB,CAAC,IAAM,UAAU,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,mBAAmB,CAAC,KAAO,WAAW,KAAO,SAAS,KAAO,oCAAoC,CAAC,IAAM,UAAU,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,oBAAoB,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,oBAAoB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,aAAa,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,YAAY,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,WAAW,KAAO,WAAW,CAAC,IAAM,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,mBAAmB,KAAO,WAAW,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,KAAK,KAAO,eAAe,CAAC,KAAO,YAAY,KAAO,SAAS,KAAO,yBAAyB,CAAC,IAAM,UAAU,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,gBAAgB,KAAO,6BAA6B,CAAC,IAAM,UAAU,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,aAAa,CAAC,KAAO,KAAK,KAAO,gBAAgB,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,yBAAyB,KAAO,qBAAqB,CAAC,GAAK,WAAW,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,6BAA6B,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,gCAAgC,CAAC,IAAM,WAAW,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,cAAc,KAAO,+BAA+B,CAAC,GAAK,UAAU,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,yBAAyB,KAAO,kBAAkB,CAAC,GAAK,UAAU,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,iBAAiB,KAAO,qBAAqB,CAAC,IAAM,WAAW,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,yBAAyB,CAAC,KAAO,UAAU,KAAO,kBAAkB,CAAC,KAAO,aAAa,KAAO,gBAAgB,KAAO,WAAW,CAAC,IAAM,UAAU,OAAS,qBAAqB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,aAAa,CAAC,KAAO,eAAe,KAAO,mBAAmB,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,qBAAqB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,WAAW,CAAC,IAAM,UAAU,OAAS,qBAAqB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,mBAAmB,KAAO,WAAW,CAAC,GAAK,UAAU,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,WAAW,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,WAAW,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,iBAAiB,KAAO,WAAW,CAAC,IAAM,UAAU,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,iBAAiB,KAAO,WAAW,CAAC,GAAK,UAAU,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,sBAAsB,KAAO,WAAW,CAAC,IAAM,WAAW,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,iBAAiB,KAAO,WAAW,CAAC,GAAK,SAAS,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,yBAAyB,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,6BAA6B,CAAC,IAAM,WAAW,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,aAAa,CAAC,KAAO,WAAW,KAAO,SAAS,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,YAAY,KAAO,eAAe,CAAC,KAAO,IAAI,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,kBAAkB,CAAC,KAAO,WAAW,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,aAAa,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,qBAAqB,CAAC,GAAK,WAAW,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,SAAS,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,YAAY,KAAO,WAAW,KAAO,YAAY,CAAC,GAAK,WAAW,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,sBAAsB,CAAC,GAAK,UAAU,OAAS,mBAAmB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,iBAAiB,CAAC,KAAO,SAAS,KAAO,SAAS,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,MAAM,KAAO,aAAa,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,YAAY,KAAO,yBAAyB,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,WAAW,KAAO,uBAAuB,CAAC,IAAM,UAAU,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,gCAAgC,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,kBAAkB,CAAC,KAAO,YAAY,KAAO,8BAA8B,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,iBAAiB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,kBAAkB,KAAO,eAAe,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,YAAY,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,KAAK,KAAO,UAAU,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,uBAAuB,KAAO,WAAW,CAAC,IAAM,UAAU,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,QAAQ,KAAO,uBAAuB,CAAC,GAAK,UAAU,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,kBAAkB,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,kBAAkB,KAAO,WAAW,KAAO,iBAAiB,CAAC,GAAK,UAAU,OAAS,kBAAkB,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,kBAAkB,KAAO,WAAW,KAAO,QAAQ,CAAC,IAAM,SAAS,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,KAAK,KAAO,QAAQ,KAAO,4BAA4B,CAAC,GAAK,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,mBAAmB,CAAC,KAAO,QAAQ,KAAO,uBAAuB,CAAC,KAAO,eAAe,KAAO,uBAAuB,CAAC,KAAO,WAAW,KAAO,iCAAiC,CAAC,KAAO,gBAAgB,KAAO,iBAAiB,KAAO,WAAW,CAAC,IAAM,WAAW,OAAS,gCAAgC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,2BAA2B,CAAC,KAAO,UAAU,KAAO,mBAAmB,CAAC,KAAO,QAAQ,KAAO,uBAAuB,CAAC,KAAO,eAAe,KAAO,uBAAuB,CAAC,KAAO,WAAW,KAAO,kCAAkC,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,gCAAgC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,iBAAiB,CAAC,KAAO,WAAW,KAAO,kCAAkC,KAAO,8BAA8B,CAAC,IAAM,UAAU,OAAS,gCAAgC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,kBAAkB,CAAC,KAAO,MAAM,KAAO,kBAAkB,CAAC,KAAO,aAAa,KAAO,QAAQ,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,iBAAiB,CAAC,KAAO,WAAW,KAAO,iBAAiB,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,qBAAqB,CAAC,GAAK,UAAU,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,mBAAmB,CAAC,KAAO,OAAO,KAAO,cAAc,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,4BAA4B,KAAO,wBAAwB,CAAC,IAAM,WAAW,OAAS,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,kBAAkB,KAAO,eAAe,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,kCAAkC,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,wBAAwB,OAAS,GAAG,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,6BAA6B,CAAC,GAAK,WAAW,OAAS,gCAAgC,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,iBAAiB,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,2BAA2B,CAAC,GAAK,UAAU,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,iBAAiB,CAAC,KAAO,SAAS,KAAO,SAAS,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,iBAAiB,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,6BAA6B,CAAC,GAAK,UAAU,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,GAAK,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,kBAAkB,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,WAAW,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,oCAAoC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,iBAAiB,KAAO,kBAAkB,CAAC,GAAK,WAAW,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,wBAAwB,CAAC,IAAM,UAAU,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,wBAAwB,KAAO,6BAA6B,CAAC,IAAM,WAAW,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,mBAAmB,KAAO,iBAAiB,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,aAAa,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,WAAW,CAAC,GAAK,UAAU,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,2BAA2B,CAAC,KAAO,UAAU,KAAO,aAAa,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,cAAc,KAAO,uBAAuB,CAAC,GAAK,UAAU,OAAS,mCAAmC,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,2BAA2B,CAAC,KAAO,UAAU,KAAO,cAAc,KAAO,uBAAuB,CAAC,IAAM,UAAU,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,kBAAkB,CAAC,IAAM,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,iBAAiB,KAAO,kBAAkB,CAAC,IAAM,UAAU,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,wBAAwB,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,WAAW,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,WAAW,CAAC,IAAM,WAAW,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,oBAAoB,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,gCAAgC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,4BAA4B,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,wBAAwB,CAAC,IAAM,WAAW,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,gBAAgB,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,aAAa,KAAO,YAAY,CAAC,IAAM,UAAU,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,aAAa,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,oBAAoB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,wBAAwB,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,kBAAkB,CAAC,GAAK,UAAU,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,eAAe,KAAO,qBAAqB,KAAO,wBAAwB,CAAC,GAAK,UAAU,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,2BAA2B,CAAC,IAAM,WAAW,OAAS,iCAAiC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,yBAAyB,KAAO,mCAAmC,CAAC,GAAK,UAAU,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,oBAAoB,KAAO,kBAAkB,CAAC,KAAO,qBAAqB,KAAO,kBAAkB,CAAC,KAAO,cAAc,KAAO,2BAA2B,CAAC,KAAO,aAAa,KAAO,iBAAiB,KAAO,0BAA0B,CAAC,GAAK,WAAW,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,yBAAyB,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,uBAAuB,CAAC,GAAK,UAAU,OAAS,wBAAwB,OAAS,GAAG,KAAO,sBAAsB,CAAC,IAAM,UAAU,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,iBAAiB,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,iCAAiC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,mBAAmB,KAAO,mCAAmC,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,oCAAoC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,mBAAmB,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,aAAa,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,yBAAyB,CAAC,KAAO,WAAW,KAAO,+BAA+B,CAAC,KAAO,WAAW,KAAO,mBAAmB,KAAO,uBAAuB,CAAC,IAAM,UAAU,OAAS,gCAAgC,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,kBAAkB,KAAO,uBAAuB,CAAC,IAAM,QAAQ,OAAS,iCAAiC,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,iBAAiB,CAAC,KAAO,WAAW,KAAO,QAAQ,KAAO,uBAAuB,CAAC,IAAM,WAAW,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,mBAAmB,CAAC,KAAO,UAAU,KAAO,wBAAwB,KAAO,uBAAuB,CAAC,GAAK,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,QAAQ,KAAO,eAAe,KAAO,gBAAgB,CAAC,GAAK,WAAW,OAAS,sBAAsB,OAAS,GAAG,KAAO,YAAY,CAAC,GAAK,WAAW,OAAS,oBAAoB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,aAAa,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,SAAS,CAAC,KAAO,WAAW,KAAO,sBAAsB,KAAO,mBAAmB,CAAC,GAAK,WAAW,OAAS,mBAAmB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,MAAM,KAAO,SAAS,CAAC,KAAO,WAAW,KAAO,sBAAsB,KAAO,mBAAmB,CAAC,GAAK,UAAU,OAAS,oBAAoB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,MAAM,KAAO,SAAS,CAAC,KAAO,kBAAkB,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,sBAAsB,KAAO,mBAAmB,CAAC,GAAK,UAAU,OAAS,qBAAqB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,mBAAmB,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,oBAAoB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,WAAW,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,0BAA0B,CAAC,KAAO,gBAAgB,KAAO,SAAS,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,kBAAkB,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,WAAW,KAAO,WAAW,CAAC,GAAK,UAAU,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,aAAa,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,oBAAoB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,SAAS,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,kBAAkB,CAAC,IAAM,WAAW,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,SAAS,CAAC,KAAO,gBAAgB,KAAO,UAAU,KAAO,oBAAoB,CAAC,GAAK,WAAW,OAAS,oBAAoB,OAAS,GAAG,KAAO,aAAa,CAAC,IAAM,UAAU,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,WAAW,KAAO,sBAAsB,CAAC,IAAM,UAAU,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,mBAAmB,KAAO,0BAA0B,CAAC,IAAM,UAAU,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,QAAQ,KAAO,sBAAsB,CAAC,GAAK,WAAW,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,WAAW,KAAO,4BAA4B,CAAC,IAAM,WAAW,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,aAAa,CAAC,KAAO,gBAAgB,KAAO,qBAAqB,KAAO,WAAW,CAAC,GAAK,UAAU,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,IAAI,KAAO,UAAU,CAAC,KAAO,gBAAgB,KAAO,uCAAuC,CAAC,KAAO,SAAS,KAAO,6BAA6B,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,4BAA4B,CAAC,IAAM,WAAW,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,SAAS,CAAC,KAAO,SAAS,KAAO,SAAS,KAAO,oBAAoB,CAAC,IAAM,UAAU,OAAS,sCAAsC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,kBAAkB,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,SAAS,KAAO,WAAW,CAAC,IAAM,UAAU,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,oBAAoB,KAAO,QAAQ,CAAC,GAAK,SAAS,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,0BAA0B,CAAC,IAAM,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,iBAAiB,CAAC,KAAO,SAAS,KAAO,SAAS,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,gBAAgB,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,sBAAsB,OAAS,GAAG,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,qBAAqB,CAAC,IAAM,WAAW,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,WAAW,KAAO,qBAAqB,CAAC,IAAM,UAAU,OAAS,kCAAkC,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,WAAW,CAAC,GAAK,UAAU,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,aAAa,KAAO,gBAAgB,KAAO,4BAA4B,CAAC,GAAK,WAAW,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,qBAAqB,CAAC,IAAM,WAAW,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,iBAAiB,CAAC,KAAO,2BAA2B,KAAO,iBAAiB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,kBAAkB,KAAO,eAAe,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,cAAc,KAAO,4BAA4B,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,uBAAuB,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,sBAAsB,CAAC,KAAO,OAAO,KAAO,uBAAuB,KAAO,iBAAiB,CAAC,GAAK,UAAU,OAAS,+BAA+B,OAAS,GAAG,KAAO,6BAA6B,CAAC,GAAK,UAAU,OAAS,gCAAgC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,iCAAiC,OAAS,GAAG,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,mBAAmB,KAAO,gBAAgB,CAAC,KAAO,IAAI,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,6BAA6B,CAAC,IAAM,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,qBAAqB,CAAC,KAAO,SAAS,KAAO,SAAS,KAAO,oBAAoB,CAAC,GAAK,UAAU,OAAS,+BAA+B,OAAS,GAAG,KAAO,6BAA6B,CAAC,IAAM,UAAU,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,aAAa,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,6BAA6B,OAAS,GAAG,KAAO,uBAAuB,CAAC,GAAK,WAAW,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,4BAA4B,KAAO,uBAAuB,CAAC,IAAM,WAAW,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,oBAAoB,CAAC,KAAO,mBAAmB,KAAO,SAAS,KAAO,eAAe,CAAC,IAAM,WAAW,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,4BAA4B,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,6BAA6B,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,WAAW,KAAO,6BAA6B,CAAC,IAAM,UAAU,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,2BAA2B,CAAC,KAAO,cAAc,KAAO,+BAA+B,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,GAAK,WAAW,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,kBAAkB,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,WAAW,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,sBAAsB,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,yBAAyB,CAAC,GAAK,SAAS,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,sBAAsB,CAAC,KAAO,eAAe,KAAO,sBAAsB,KAAO,yBAAyB,CAAC,GAAK,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,qBAAqB,CAAC,IAAM,WAAW,OAAS,oBAAoB,OAAS,GAAG,KAAO,wBAAwB,CAAC,IAAM,WAAW,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,kBAAkB,CAAC,IAAM,WAAW,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,qBAAqB,KAAO,gBAAgB,CAAC,KAAO,mBAAmB,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,iBAAiB,KAAO,mBAAmB,CAAC,GAAK,UAAU,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,iBAAiB,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,0BAA0B,OAAS,GAAG,KAAO,wBAAwB,CAAC,GAAK,UAAU,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,OAAO,KAAO,KAAK,CAAC,IAAM,WAAW,OAAS,oBAAoB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,OAAO,KAAO,KAAK,CAAC,IAAM,WAAW,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,oBAAoB,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,gCAAgC,OAAS,GAAG,KAAO,sBAAsB,CAAC,IAAM,WAAW,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,0BAA0B,OAAS,GAAG,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,oBAAoB,OAAS,GAAG,KAAO,aAAa,CAAC,GAAK,WAAW,OAAS,kBAAkB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,0BAA0B,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,uBAAuB,CAAC,GAAK,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,WAAW,KAAO,oBAAoB,CAAC,IAAM,UAAU,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,KAAK,KAAO,QAAQ,KAAO,WAAW,CAAC,IAAM,WAAW,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,8BAA8B,OAAS,GAAG,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,8BAA8B,OAAS,GAAG,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,sBAAsB,OAAS,GAAG,KAAO,oBAAoB,CAAC,GAAK,SAAS,OAAS,mBAAmB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,cAAc,KAAO,iBAAiB,CAAC,GAAK,WAAW,OAAS,oBAAoB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,aAAa,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,0BAA0B,KAAO,iBAAiB,CAAC,IAAM,WAAW,OAAS,uCAAuC,OAAS,GAAG,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,uCAAuC,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,SAAS,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,4BAA4B,KAAO,WAAW,CAAC,GAAK,UAAU,OAAS,oBAAoB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,kBAAkB,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,cAAc,KAAO,eAAe,CAAC,IAAM,UAAU,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,uCAAuC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,gBAAgB,KAAO,qBAAqB,KAAO,WAAW,CAAC,IAAM,SAAS,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,mBAAmB,KAAO,aAAa,CAAC,IAAM,UAAU,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,sBAAsB,KAAO,aAAa,CAAC,GAAK,WAAW,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,kBAAkB,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,sBAAsB,KAAO,QAAQ,CAAC,IAAM,SAAS,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,kBAAkB,CAAC,KAAO,WAAW,KAAO,sBAAsB,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,0BAA0B,OAAS,GAAG,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,kCAAkC,OAAS,GAAG,KAAO,gCAAgC,CAAC,GAAK,WAAW,OAAS,mCAAmC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,MAAM,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,yBAAyB,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,WAAW,KAAO,2BAA2B,CAAC,GAAK,UAAU,OAAS,sCAAsC,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,QAAQ,KAAO,2BAA2B,CAAC,GAAK,WAAW,OAAS,qCAAqC,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,mBAAmB,KAAO,yBAAyB,CAAC,IAAM,UAAU,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,WAAW,KAAO,YAAY,CAAC,GAAK,WAAW,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,4BAA4B,KAAO,WAAW,CAAC,GAAK,UAAU,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,WAAW,CAAC,GAAK,SAAS,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,UAAU,KAAO,2BAA2B,KAAO,kCAAkC,CAAC,IAAM,UAAU,OAAS,kCAAkC,OAAS,GAAG,KAAO,kBAAkB,CAAC,GAAK,WAAW,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,qBAAqB,CAAC,KAAO,SAAS,KAAO,eAAe,CAAC,KAAO,YAAY,KAAO,eAAe,CAAC,KAAO,MAAM,KAAO,mBAAmB,KAAO,iBAAiB,CAAC,IAAM,WAAW,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,qBAAqB,CAAC,KAAO,SAAS,KAAO,eAAe,CAAC,KAAO,YAAY,KAAO,eAAe,CAAC,KAAO,MAAM,KAAO,mBAAmB,KAAO,iBAAiB,CAAC,GAAK,WAAW,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,cAAc,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,8BAA8B,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,aAAa,CAAC,KAAO,aAAa,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,WAAW,CAAC,IAAM,UAAU,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,cAAc,KAAO,WAAW,CAAC,IAAM,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,aAAa,CAAC,KAAO,WAAW,KAAO,0BAA0B,KAAO,WAAW,CAAC,IAAM,UAAU,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,iBAAiB,CAAC,KAAO,eAAe,KAAO,gBAAgB,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,iBAAiB,CAAC,KAAO,UAAU,KAAO,WAAW,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,QAAQ,KAAO,WAAW,CAAC,IAAM,UAAU,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,qBAAqB,CAAC,IAAM,WAAW,OAAS,gCAAgC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,KAAK,KAAO,gBAAgB,KAAO,qBAAqB,CAAC,IAAM,WAAW,OAAS,iCAAiC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,KAAK,KAAO,gBAAgB,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,mCAAmC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,KAAK,KAAO,gBAAgB,KAAO,WAAW,CAAC,GAAK,UAAU,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,QAAQ,KAAO,qBAAqB,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,WAAW,KAAO,YAAY,CAAC,GAAK,WAAW,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,yBAAyB,CAAC,KAAO,WAAW,KAAO,uCAAuC,KAAO,SAAS,CAAC,GAAK,UAAU,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,cAAc,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,WAAW,KAAO,yBAAyB,CAAC,KAAO,WAAW,KAAO,uCAAuC,KAAO,SAAS,CAAC,IAAM,UAAU,OAAS,oBAAoB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,cAAc,CAAC,KAAO,SAAS,KAAO,SAAS,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,sBAAsB,CAAC,KAAO,SAAS,KAAO,kBAAkB,CAAC,KAAO,aAAa,KAAO,sBAAsB,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,mBAAmB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,eAAe,KAAO,SAAS,CAAC,GAAK,WAAW,OAAS,oBAAoB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,kBAAkB,CAAC,IAAM,WAAW,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,iBAAiB,KAAO,mBAAmB,CAAC,IAAM,WAAW,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,KAAO,mBAAmB,CAAC,IAAM,UAAU,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,KAAO,iBAAiB,CAAC,IAAM,WAAW,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,oBAAoB,KAAO,iBAAiB,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,6BAA6B,OAAS,GAAG,KAAO,2BAA2B,CAAC,GAAK,UAAU,OAAS,+BAA+B,OAAS,GAAG,KAAO,0BAA0B,CAAC,GAAK,WAAW,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,2BAA2B,KAAO,qBAAqB,CAAC,IAAM,WAAW,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,iBAAiB,CAAC,KAAO,SAAS,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,sBAAsB,CAAC,IAAM,WAAW,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,4BAA4B,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,WAAW,KAAO,yBAAyB,CAAC,IAAM,UAAU,OAAS,4BAA4B,OAAS,GAAG,KAAO,wBAAwB,CAAC,IAAM,WAAW,OAAS,qCAAqC,OAAS,GAAG,KAAO,iCAAiC,CAAC,GAAK,UAAU,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,yBAAyB,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,oCAAoC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,gBAAgB,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,iBAAiB,KAAO,wBAAwB,CAAC,GAAK,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,IAAI,KAAO,iBAAiB,KAAO,cAAc,CAAC,IAAM,WAAW,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,mBAAmB,CAAC,KAAO,QAAQ,KAAO,kBAAkB,KAAO,uBAAuB,CAAC,GAAK,SAAS,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,mBAAmB,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,uBAAuB,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,kCAAkC,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,6BAA6B,CAAC,IAAM,WAAW,OAAS,oBAAoB,OAAS,GAAG,KAAO,kBAAkB,CAAC,GAAK,UAAU,OAAS,qBAAqB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,cAAc,KAAO,QAAQ,CAAC,IAAM,QAAQ,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,OAAO,KAAO,UAAU,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,iBAAiB,KAAO,wBAAwB,CAAC,IAAM,UAAU,OAAS,mCAAmC,OAAS,GAAG,KAAO,yBAAyB,CAAC,GAAK,UAAU,OAAS,mCAAmC,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,0BAA0B,KAAO,yBAAyB,CAAC,IAAM,UAAU,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,aAAa,KAAO,WAAW,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,sBAAsB,CAAC,GAAK,UAAU,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,qBAAqB,CAAC,GAAK,WAAW,OAAS,gCAAgC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,8BAA8B,CAAC,IAAM,UAAU,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,QAAQ,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,iCAAiC,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,aAAa,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,qBAAqB,CAAC,IAAM,WAAW,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,sBAAsB,CAAC,IAAM,UAAU,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,aAAa,KAAO,gBAAgB,KAAO,4BAA4B,CAAC,GAAK,WAAW,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,KAAO,WAAW,CAAC,IAAM,WAAW,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,UAAU,KAAO,aAAa,CAAC,KAAO,cAAc,KAAO,kBAAkB,CAAC,KAAO,SAAS,KAAO,aAAa,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,sBAAsB,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,mBAAmB,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,gCAAgC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,oBAAoB,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,aAAa,KAAO,iBAAiB,KAAO,WAAW,CAAC,GAAK,SAAS,OAAS,qBAAqB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,mBAAmB,CAAC,IAAM,UAAU,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,MAAM,KAAO,qBAAqB,CAAC,KAAO,UAAU,KAAO,eAAe,CAAC,KAAO,SAAS,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,2BAA2B,CAAC,IAAM,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,UAAU,KAAO,gBAAgB,KAAO,eAAe,CAAC,GAAK,WAAW,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,kCAAkC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,iBAAiB,KAAO,kCAAkC,CAAC,GAAK,WAAW,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,cAAc,KAAO,WAAW,KAAO,gCAAgC,CAAC,GAAK,UAAU,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,cAAc,KAAO,QAAQ,KAAO,0BAA0B,CAAC,GAAK,UAAU,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,YAAY,KAAO,QAAQ,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,eAAe,KAAO,gBAAgB,CAAC,IAAM,WAAW,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,YAAY,KAAO,SAAS,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,kCAAkC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,WAAW,KAAO,aAAa,CAAC,KAAO,cAAc,KAAO,eAAe,CAAC,KAAO,cAAc,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,gCAAgC,CAAC,GAAK,WAAW,OAAS,iCAAiC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,+BAA+B,CAAC,IAAM,WAAW,OAAS,kCAAkC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,eAAe,CAAC,KAAO,cAAc,KAAO,eAAe,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,mBAAmB,KAAO,+BAA+B,CAAC,GAAK,WAAW,OAAS,4CAA4C,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,WAAW,KAAO,cAAc,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,oCAAoC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,gCAAgC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,cAAc,KAAO,kCAAkC,CAAC,IAAM,UAAU,OAAS,kCAAkC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,IAAI,KAAO,kBAAkB,CAAC,KAAO,cAAc,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,aAAa,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,gCAAgC,CAAC,IAAM,WAAW,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,WAAW,CAAC,IAAM,SAAS,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,WAAW,KAAO,cAAc,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,WAAW,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,iBAAiB,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,kCAAkC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,cAAc,KAAO,qCAAqC,CAAC,IAAM,UAAU,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,iBAAiB,KAAO,iBAAiB,KAAO,WAAW,CAAC,IAAM,WAAW,OAAS,iCAAiC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,cAAc,KAAO,aAAa,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,eAAe,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,sBAAsB,KAAO,iBAAiB,KAAO,WAAW,CAAC,GAAK,UAAU,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,WAAW,CAAC,IAAM,UAAU,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,cAAc,KAAO,qBAAqB,CAAC,IAAM,UAAU,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,kBAAkB,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,mBAAmB,KAAO,iCAAiC,CAAC,GAAK,UAAU,OAAS,yCAAyC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,aAAa,KAAO,SAAS,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,gCAAgC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,mBAAmB,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,mCAAmC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,UAAU,KAAO,cAAc,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,kCAAkC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,SAAS,KAAO,aAAa,KAAO,WAAW,CAAC,GAAK,UAAU,OAAS,mCAAmC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,mBAAmB,KAAO,WAAW,CAAC,GAAK,UAAU,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,WAAW,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,+BAA+B,CAAC,GAAK,WAAW,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,mBAAmB,CAAC,KAAO,YAAY,KAAO,WAAW,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,mBAAmB,CAAC,KAAO,YAAY,KAAO,WAAW,KAAO,sBAAsB,CAAC,IAAM,WAAW,OAAS,wBAAwB,OAAS,GAAG,KAAO,+BAA+B,CAAC,GAAK,WAAW,OAAS,+BAA+B,OAAS,GAAG,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,kBAAkB,CAAC,IAAM,UAAU,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,CAAC,IAAM,WAAW,OAAS,gCAAgC,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,UAAU,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,gCAAgC,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,iBAAiB,KAAO,8BAA8B,CAAC,GAAK,UAAU,OAAS,sCAAsC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,gBAAgB,CAAC,GAAK,WAAW,OAAS,oCAAoC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,kBAAkB,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,QAAQ,KAAO,kCAAkC,CAAC,GAAK,WAAW,OAAS,qCAAqC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,kBAAkB,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,mCAAmC,CAAC,GAAK,WAAW,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,UAAU,KAAO,cAAc,KAAO,WAAW,CAAC,IAAM,UAAU,OAAS,mCAAmC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,OAAO,KAAO,mBAAmB,KAAO,WAAW,CAAC,IAAM,WAAW,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,WAAW,CAAC,IAAM,UAAU,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,UAAU,KAAO,cAAc,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,qBAAqB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,cAAc,KAAO,wBAAwB,CAAC,IAAM,WAAW,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,yBAAyB,KAAO,QAAQ,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,sCAAsC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,8BAA8B,KAAO,gBAAgB,CAAC,KAAO,yBAAyB,KAAO,iBAAiB,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,oCAAoC,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,cAAc,KAAO,4BAA4B,CAAC,IAAM,UAAU,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,MAAM,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,6BAA6B,KAAO,WAAW,CAAC,IAAM,WAAW,OAAS,gCAAgC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,KAAK,KAAO,gBAAgB,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,mCAAmC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,oBAAoB,CAAC,KAAO,SAAS,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,iCAAiC,CAAC,IAAM,SAAS,OAAS,qCAAqC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,sBAAsB,KAAO,kBAAkB,KAAO,WAAW,CAAC,GAAK,UAAU,OAAS,iCAAiC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,+BAA+B,CAAC,GAAK,WAAW,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,aAAa,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,qBAAqB,CAAC,KAAO,SAAS,KAAO,eAAe,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,YAAY,KAAO,kBAAkB,CAAC,KAAO,UAAU,KAAO,WAAW,KAAO,2BAA2B,CAAC,GAAK,UAAU,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,qBAAqB,CAAC,GAAK,WAAW,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,aAAa,KAAO,gBAAgB,KAAO,4BAA4B,CAAC,IAAM,WAAW,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,yBAAyB,CAAC,GAAK,UAAU,OAAS,mCAAmC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,mBAAmB,KAAO,iCAAiC,CAAC,IAAM,UAAU,OAAS,kCAAkC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,SAAS,KAAO,gCAAgC,CAAC,GAAK,UAAU,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,IAAI,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,qBAAqB,CAAC,GAAK,UAAU,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,kBAAkB,CAAC,GAAK,WAAW,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,cAAc,KAAO,qBAAqB,CAAC,GAAK,WAAW,OAAS,iCAAiC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,MAAM,KAAO,aAAa,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,MAAM,KAAO,aAAa,CAAC,KAAO,MAAM,KAAO,kBAAkB,CAAC,KAAO,cAAc,KAAO,kBAAkB,CAAC,KAAO,eAAe,KAAO,oBAAoB,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,kBAAkB,KAAO,eAAe,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,UAAU,KAAO,uBAAuB,KAAO,iBAAiB,CAAC,GAAK,WAAW,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,MAAM,KAAO,aAAa,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,kBAAkB,KAAO,eAAe,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,UAAU,KAAO,uBAAuB,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,gCAAgC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,MAAM,KAAO,aAAa,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,oBAAoB,CAAC,KAAO,WAAW,KAAO,WAAW,KAAO,uBAAuB,CAAC,GAAK,UAAU,OAAS,oCAAoC,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,yBAAyB,KAAO,sBAAsB,CAAC,IAAM,UAAU,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,aAAa,CAAC,KAAO,YAAY,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,kBAAkB,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,cAAc,KAAO,iBAAiB,CAAC,IAAM,UAAU,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,0BAA0B,CAAC,GAAK,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,iBAAiB,CAAC,KAAO,SAAS,KAAO,SAAS,KAAO,yBAAyB,CAAC,IAAM,WAAW,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,WAAW,KAAO,YAAY,CAAC,GAAK,WAAW,OAAS,yCAAyC,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,oBAAoB,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,qCAAqC,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,oBAAoB,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,oBAAoB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,OAAO,KAAO,cAAc,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,WAAW,CAAC,GAAK,UAAU,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,gBAAgB,KAAO,eAAe,KAAO,4BAA4B,CAAC,GAAK,UAAU,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,6BAA6B,CAAC,GAAK,WAAW,OAAS,gCAAgC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,mBAAmB,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,qCAAqC,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,SAAS,CAAC,KAAO,UAAU,KAAO,6BAA6B,KAAO,WAAW,CAAC,IAAM,UAAU,OAAS,uCAAuC,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,YAAY,CAAC,KAAO,UAAU,KAAO,6BAA6B,KAAO,WAAW,CAAC,IAAM,WAAW,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,6BAA6B,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,uBAAuB,OAAS,GAAG,KAAO,qBAAqB,CAAC,IAAM,UAAU,OAAS,mCAAmC,OAAS,CAAC,CAAC,KAAO,cAAc,KAAO,iBAAiB,KAAO,oBAAoB,CAAC,IAAM,SAAS,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,wBAAwB,CAAC,GAAK,UAAU,OAAS,oCAAoC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,6BAA6B,CAAC,IAAM,SAAS,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,gBAAgB,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,kCAAkC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,yBAAyB,CAAC,GAAK,UAAU,OAAS,iCAAiC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,yBAAyB,CAAC,GAAK,UAAU,OAAS,mCAAmC,OAAS,GAAG,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,gBAAgB,KAAO,cAAc,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,sBAAsB,CAAC,GAAK,UAAU,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,sBAAsB,CAAC,IAAM,WAAW,OAAS,gCAAgC,OAAS,GAAG,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,KAAK,KAAO,gBAAgB,KAAO,WAAW,CAAC,GAAK,UAAU,OAAS,mCAAmC,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,iBAAiB,KAAO,WAAW,KAAO,sBAAsB,CAAC,IAAM,UAAU,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,mBAAmB,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,SAAS,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,mBAAmB,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,SAAS,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,kCAAkC,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,iBAAiB,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,WAAW,CAAC,IAAM,UAAU,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,sBAAsB,KAAO,WAAW,CAAC,GAAK,UAAU,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,IAAI,KAAO,kBAAkB,CAAC,KAAO,cAAc,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,eAAe,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,wBAAwB,CAAC,IAAM,WAAW,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,KAAO,wBAAwB,CAAC,IAAM,UAAU,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,iBAAiB,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,kCAAkC,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,SAAS,KAAO,WAAW,CAAC,GAAK,UAAU,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,QAAQ,KAAO,4BAA4B,CAAC,GAAK,UAAU,OAAS,oCAAoC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,WAAW,CAAC,IAAM,WAAW,OAAS,uCAAuC,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,gCAAgC,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,gCAAgC,OAAS,GAAG,KAAO,qBAAqB,CAAC,IAAM,UAAU,OAAS,8BAA8B,OAAS,GAAG,KAAO,wBAAwB,CAAC,GAAK,UAAU,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,mCAAmC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,aAAa,CAAC,KAAO,OAAO,KAAO,qBAAqB,CAAC,KAAO,QAAQ,KAAO,qBAAqB,CAAC,KAAO,iBAAiB,KAAO,mBAAmB,KAAO,gBAAgB,CAAC,GAAK,WAAW,OAAS,oCAAoC,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,aAAa,MAAQ,K,+CC3BrhqT,SAAS4rB,GAAU1iF,GAEhC,OAAOA,IAAQ,CACjB,CCAe,SAAS2iF,GAAcC,EAAcC,GAElD,OADAD,EAAOF,GAAUE,GAAOC,EAAMH,GAAUG,GACjC,KAAOD,GAAME,UAAU,IAAI3vF,IAAI,KAAO0vF,GAC/C,CCJO,MAAME,GAAa,KAAO15B,OAAOC,kBAC3B05B,GAAc,KAAO,SAAWC,IAAI,IACpCC,GAAaF,GAAYG,OAAO,SCDtC,SAASC,GAAgBjiF,EAA8BkiF,EAAO,KACnE,OAAO,eAAiBliF,aAAiB3D,WAAa,IAAI2D,GAASA,EAAOkiF,EAC5E,CCiBA,MAAMC,IAAa,0BAA8B34E,GAAsB,cAAhBA,EAAE44E,YAA2BvyF,GAC9EwyF,IAAY,0BAA8B74E,GAAsB,aAAhBA,EAAE44E,YAA0BvyF,GAC5EyyF,IAAU,0BAA8B94E,GAAsB,WAAhBA,EAAE44E,YAAwBvyF,GACxE0yF,IAAc,8BAAkC/4E,GAAsB,gBAAhBA,EAAE44E,YAA6BvyF,GAGrF2yF,GAAoC,QAE1C,MAAMC,GAUJ1vF,YAAYpE,EAA4D,CAAC,GATjE,KAAA2kD,UAAY,KACZ,KAAA/zB,OAAS,EACT,KAAAmjE,SAAU,EACV,KAAAnnF,OAAQ,EAOdtI,KAAKqgD,UAAY3kD,EAAQg0F,gBAAkB,KAC3C1vF,KAAKyvF,QAAU/zF,EAAQ+zF,UAAW,EAClCzvF,KAAK2vF,cACP,CAEOA,eACL3vF,KAAKiJ,OAAS,IAAI2mF,YAAY5vF,KAAKqgD,WACnCrgD,KAAK6vF,QAAU,IAAIC,WAAW9vF,KAAKiJ,QACnCjJ,KAAK+vF,SAAW,IAAI3mF,WAAWpJ,KAAKiJ,OACtC,CAEO+mF,WACL,MAAMC,EAAe,IAAIL,YAAY5vF,KAAKssB,QAQpC4jE,EAAc,IAAIJ,WAAWG,GAQnC,OAPAC,EAAYjoF,IAAIjI,KAAK6vF,QAAQM,SAAS,EAAGnwF,KAAKssB,OAAS,IAOhD4jE,CACT,CAEOE,YACL,OAAOpwF,KAAKgwF,WAAW/mF,MACzB,CAIOonF,SAASC,GAAiB,GAC/B,GAAGA,EAAO,CACR,MAAML,EAAe,IAAIL,YAAY5vF,KAAKssB,QACpCikE,EAAc,IAAInnF,WAAW6mF,GAInC,OAFAM,EAAYtoF,IAAIjI,KAAK+vF,SAASI,SAAS,EAAGnwF,KAAKssB,SAExCikE,C,CAGT,MAAMxjF,EAAkB,IAAIjM,MAAMd,KAAKssB,QACvC,IAAI,IAAI3mB,EAAI,EAAGA,EAAI3F,KAAKssB,SAAU3mB,EAChCoH,EAAMpH,GAAK3F,KAAK+vF,SAASpqF,GAE3B,OAAOoH,CACT,CAEOyjF,YACL,OAAOxwF,KAAKssB,MACd,CAEOmkE,YAAYC,GACjB,GAAG1wF,KAAKssB,OAASokE,EAAY1wF,KAAKqgD,UAChC,OAIFrgD,KAAKqgD,UAAwF,EAA5E1/B,KAAK4qB,KAAK5qB,KAAK4E,IAAqB,EAAjBvlB,KAAKqgD,UAAergD,KAAKssB,OAASokE,EAAY,IAAM,GACxF,MAAMC,EAAiB3wF,KAAKiJ,OAEtB2nF,EAAgB,IAAId,WAAWa,GAErC3wF,KAAK2vF,eAEL,IAAIG,WAAW9vF,KAAKiJ,QAAQhB,IAAI2oF,EAGlC,CAEOC,SAASlrF,EAAWmrF,GACzB9wF,KAAKsI,OAAS3K,QAAQwC,IAAI,MAAOwF,EAAEqH,SAAS,IAAKrH,EAAGmrF,GAEpD,MAAMxkE,EAAStsB,KAAKssB,OAAS,EAK7B,OAJAtsB,KAAKywF,YAAY,GACjBzwF,KAAK6vF,QAAQvjE,GAAU3mB,EACvB3F,KAAKssB,QAAU,EAERA,CACT,CAEOykE,SAASprF,EAAWmrF,GACzB,OAAO9wF,KAAK6wF,SAASlrF,GAAImrF,GAAS,IAAM,OAC1C,CAEOE,UAAUrrF,EAAYmrF,GACxBnrF,EACD3F,KAAK6wF,SAASzB,IAAW0B,GAAS,IAAM,SAExC9wF,KAAK6wF,SAAS3B,IAAY4B,GAAS,IAAM,QAE7C,CAEOG,WAAWC,EAAeC,EAAcL,GAC7C9wF,KAAK6wF,SAASM,GAAOL,GAAS,IAAM,cACpC9wF,KAAK6wF,SAASK,GAAQJ,GAAS,IAAM,cACvC,CAEOM,UAAUC,EAAwCP,GACvD,GAAGhwF,MAAMiD,QAAQstF,GACf,OAAoB,IAAjBA,EAAM50F,OACAuD,KAAKixF,WAAWI,EAAM,GAAIA,EAAM,GAAIP,GAEpC9wF,KAAKsxF,cAAcD,EAAO,GAAIP,GAIzC,MAAMS,GD3IuBC,EC2II,KAAOH,ID1I5BI,aAAe7C,GAAY7vF,IAAIyyF,GAAUA,EADlD,IAA0BA,EC4I7B,MAAM,SAACE,EAAQ,UAAEC,GAAaJ,EAAQK,OAAO,YACvCpD,EAAOkD,EAASG,aAChBpD,EAAMkD,EAAUE,aAEtB7xF,KAAK6wF,SAASpC,GAAMqC,GAAS,IAAM,cACnC9wF,KAAK6wF,SAASrC,GAAOsC,GAAS,IAAM,cACtC,CAEOgB,YAAYzkE,EAAQyjE,GACzB,MAAM7nF,EAAS,IAAI2mF,YAAY,GACzBC,EAAU,IAAIC,WAAW7mF,GACZ,IAAI8oF,aAAa9oF,GAEzB,GAAKokB,EAEhBrtB,KAAK6wF,SAAShB,EAAQ,IAAKiB,GAAS,IAAM,gBAC1C9wF,KAAK6wF,SAAShB,EAAQ,IAAKiB,GAAS,IAAM,gBAC5C,CAEOkB,YAAYt6B,EAAWo5B,GAC5B9wF,KAAKsI,OAAS3K,QAAQwC,IAAI,MAAOu3D,GAAIo5B,GAAS,IAAM,gBAE3C91F,IAAN08D,IACDA,EAAI,IAEN,MAAMu6B,EAAQC,SAASl0F,mBAAmB05D,IAE1C13D,KAAKywF,YAAYwB,EAAMx1F,OAAS,GAEhC,MAAMkQ,EAAMslF,EAAMx1F,OACfkQ,GAAO,IACR3M,KAAK+vF,SAAS/vF,KAAKssB,UAAY3f,GAE/B3M,KAAK+vF,SAAS/vF,KAAKssB,UAAY,IAC/BtsB,KAAK+vF,SAAS/vF,KAAKssB,UAAkB,IAAN3f,EAC/B3M,KAAK+vF,SAAS/vF,KAAKssB,WAAmB,MAAN3f,IAAiB,EACjD3M,KAAK+vF,SAAS/vF,KAAKssB,WAAmB,SAAN3f,IAAmB,IAErD,IAAI,IAAIhH,EAAI,EAAGA,EAAIgH,IAAOhH,EACxB3F,KAAK+vF,SAAS/vF,KAAKssB,UAAY2lE,EAAM1b,WAAW5wE,GAIlD,KAAM3F,KAAKssB,OAAS,GAClBtsB,KAAK+vF,SAAS/vF,KAAKssB,UAAY,CAEnC,CAEO6lE,WAAWplF,EAA4C+jF,GACzD/jF,aAAiB6iF,YAClB7iF,EAAQ,IAAI3D,WAAW2D,QACL/R,IAAV+R,IACRA,EAAQ,IAGV/M,KAAKsI,OAAS3K,QAAQwC,IAAI,MAAO2M,EAAWC,IAAqB+jF,GAAS,IAAM,UAGhF,MAAMnkF,EAAOI,EAAqBtQ,OAelC,IAdAuD,KAAKywF,YAAY9jF,EAAM,GACpBA,GAAO,IACR3M,KAAK+vF,SAAS/vF,KAAKssB,UAAY3f,GAE/B3M,KAAK+vF,SAAS/vF,KAAKssB,UAAY,IAC/BtsB,KAAK+vF,SAAS/vF,KAAKssB,UAAkB,IAAN3f,EAC/B3M,KAAK+vF,SAAS/vF,KAAKssB,WAAmB,MAAN3f,IAAiB,EACjD3M,KAAK+vF,SAAS/vF,KAAKssB,WAAmB,SAAN3f,IAAmB,IAGrD3M,KAAK+vF,SAAS9nF,IAAI8E,EAAqB/M,KAAKssB,QAC5CtsB,KAAKssB,QAAU3f,EAGT3M,KAAKssB,OAAS,GAClBtsB,KAAK+vF,SAAS/vF,KAAKssB,UAAY,CAEnC,CAEOglE,cAAcvkF,EAA4CqlF,EAActB,GAC1E/jF,aAAiB6iF,cAClB7iF,EAAQ,IAAI3D,WAAW2D,IAGzB,MAAMJ,EAAOI,EAAqBtQ,OAClC,GAAI21F,EAAO,IAAc,EAANzlF,IAAaylF,EAAM,CACpC,MAAMx0F,EAAQ,IAAIoN,MAAM,iBAAmBonF,EAAO,KAAOzlF,GAEzD,MADAhP,QAAQC,MAAMA,EAAOmP,EAAO+jF,GACtBlzF,C,CAGRoC,KAAKsI,OAAS3K,QAAQwC,IAAI,MAAO2M,EAAWC,IAAuB+jF,GAAS,IAAM,OAASsB,GAC3FpyF,KAAKywF,YAAY9jF,GAEjB3M,KAAK+vF,SAAS9nF,IAAI8E,EAAqB/M,KAAKssB,QAC5CtsB,KAAKssB,QAAU3f,CACjB,CAEO0lF,cAActlF,EAA0B+jF,GAC1C/jF,aAAiB6iF,cAClB7iF,EAAQ,IAAI3D,WAAW2D,IAGzB,MAAMJ,EAAMI,EAAMtQ,OAElBuD,KAAKsI,OAAS3K,QAAQwC,IAAI,MAAO2M,EAAWC,GAAS+jF,GAAS,IAC9D9wF,KAAKywF,YAAY9jF,GAEjB3M,KAAK+vF,SAAS9nF,IAAI8E,EAAO/M,KAAKssB,QAC9BtsB,KAAKssB,QAAU3f,CACjB,CAEO2lF,YAAYC,EAAoBt+E,GACrC,MACMu+E,GADSxyF,KAAKyvF,QAAU,WAAiB,QACrBgD,QAAQj0F,MAAMk0F,GAAMA,EAAE5pF,SAAWypF,IAE3D,IAAIC,EACF,MAAM,IAAIxnF,MAAM,aAAeunF,EAAa,UAG9CvyF,KAAK+wF,SAASyB,EAAW51F,GAAI21F,EAAa,QAE1C,MAAMr1F,EAAS+W,EAAO/W,QAAU+W,EAC1B0+E,EAA8C,CAAC,EAErD,IAAI,MAAMC,KAASJ,EAAWv+E,OAAQ,CACpC,IAAIlW,EAAO60F,EAAM70F,KAEjB,IAA0B,IAAvBA,EAAKtD,QAAQ,KAAa,CAC3B,MAAMo4F,EAAW90F,EAAK6B,MAAM,KACtBkzF,EAAWD,EAAS,GAAGjzF,MAAM,KAEnC,KAAKqU,EAAO6+E,EAAS,IAAO,IAAMA,EAAS,IAAM,CAC/C,KAAmB,SAAhBD,EAAS,GAAgB31F,EAAO01F,EAAM3yF,WAA+BjF,IAAvBiZ,EAAO2+E,EAAM3yF,OAI5D,SAFAgU,EAAO6+E,EAAS,KAAO,IAAMA,EAAS,E,CAO1C/0F,EAAO80F,EAAS,E,CAIlB,MAAMzwF,EAASpC,KAAK+yF,YAAY9+E,EAAO2+E,EAAM3yF,MAAOlC,EAAMw0F,EAAa,IAAMK,EAAM3yF,KAAO,KAE9E,MAATlC,IACDkW,EAAO2+E,EAAM3yF,MAAQgU,EAAO2+E,EAAM3yF,OAAS,EAC3C0yF,EAAaC,EAAM3yF,MAAQmC,E,CAI/B,IAAI,MAAM4wF,KAAaL,EACrB3yF,KAAK6vF,QAAQ8C,EAAaK,IAAc/+E,EAAO++E,GAGjD,OAAOR,EAAWz0F,IACpB,CAEOg1F,YAAY3hF,EAAUrT,EAAc+yF,GAEzC,OAAO/yF,GACL,IAAK,IACHqT,EAAMA,GAAO,EACf,IAAK,MACH,OAAOpR,KAAK+wF,SAAS3/E,EAAK0/E,GAC5B,IAAK,OACH,OAAO9wF,KAAKoxF,UAAUhgF,EAAK0/E,GAC7B,IAAK,SACH,OAAO9wF,KAAKsxF,cAAclgF,EAAK,IAAK0/E,GACtC,IAAK,SACH,OAAO9wF,KAAKsxF,cAAclgF,EAAK,IAAK0/E,GACtC,IAAK,SACH,OAAO9wF,KAAKsxF,cAAclgF,EAAK,IAAK0/E,GACtC,IAAK,SACH,OAAO9wF,KAAKgyF,YAAY5gF,EAAK0/E,GAC/B,IAAK,QACH,OAAO9wF,KAAKmyF,WAAW/gF,EAAK0/E,GAC9B,IAAK,SACH,OAAO9wF,KAAK8xF,YAAY1gF,EAAK0/E,GAC/B,IAAK,OACH,OAAO9wF,KAAKgxF,UAAU5/E,EAAK0/E,GAC7B,IAAK,OACH,OAGJ,GAAGhwF,MAAMiD,QAAQqN,GAAM,CACrB,GAAyB,WAAtBrT,EAAK4B,OAAO,EAAG,GAChBK,KAAK6wF,SAASxB,GAAQyB,EAAQ,aACzB,GAAyB,WAAtB/yF,EAAK4B,OAAO,EAAG,GACvB,MAAM,IAAIqL,MAAM,uBAAyBjN,GAG3C,MAAMk1F,EAAWl1F,EAAK4B,OAAO,EAAG5B,EAAKtB,OAAS,GAC9CuD,KAAK6wF,SAASz/E,EAAI3U,OAAQq0F,EAAQ,WAClC,IAAI,IAAInrF,EAAI,EAAGA,EAAIyL,EAAI3U,SAAUkJ,EAC/B3F,KAAK+yF,YAAY3hF,EAAIzL,GAAIstF,EAAUnC,EAAQ,IAAMnrF,EAAI,KAGvD,OAAO,C,CACF,GAAuC,WAApC5H,EAAK4B,OAAO,EAAG,GAAGnF,cAC1B,MAAM,IAAIwQ,MAAM,yBAGlB,KAAI,EAAAwY,GAAA,GAASpS,GACX,MAAM,IAAIpG,MAAM,2BAA6BjN,GAG/C,MAAMm1F,EAASlzF,KAAKyvF,QAAU,WAAiB,OACzCN,EAAY/9E,EAAO,EACzB,IAAI+hF,GAAS,EACb,MAAMC,EAAsCF,EAAO3gE,aAAa/zB,MAAM+X,GAAMA,EAAE44E,YAAcA,IAM5F,IAJGgE,EAA6B,MAAnBp1F,EAAKlC,OAAO,MACvBkC,EAAOA,EAAK4B,OAAO,KAGjByzF,EACF,MAAM,IAAIpoF,MAAM,gBAAkBmkF,EAAY,UAG7CA,IAAcpxF,IACfo1F,GAAS,GAGPA,GACFnzF,KAAK6wF,SAASuC,EAAgBx2F,GAAIk0F,EAAQ,IAAM3B,EAAY,SAG9D,MAAMjyF,EAASkU,EAAIlU,OACby1F,EAA8C,CAAC,EAErD,IAAI,MAAMC,KAASQ,EAAgBn/E,OAAQ,CACzC,IAAIlW,EAAO60F,EAAM70F,KAGjB,IAA0B,IAAvBA,EAAKtD,QAAQ,KAAa,CAC3B,MAAMo4F,EAAW90F,EAAK6B,MAAM,KACtBkzF,EAAWD,EAAS,GAAGjzF,MAAM,KAInC,KAAKwR,EAAI0hF,EAAS,IAAO,IAAMA,EAAS,IAAM,CAC5C,KAAmB,SAAhBD,EAAS,GAAgB31F,GAAUA,EAAO01F,EAAM3yF,WAA4BjF,IAApBoW,EAAIwhF,EAAM3yF,OAInE,SAFAmR,EAAI0hF,EAAS,KAAO,IAAMA,EAAS,E,CAMvC/0F,EAAO80F,EAAS,E,CAIlB,MAAMzwF,EAASpC,KAAK+yF,YAAY3hF,EAAIwhF,EAAM3yF,MAAOlC,EAAM+yF,EAAQ,IAAM3B,EAAY,KAAOyD,EAAM3yF,KAAO,KAEzF,MAATlC,IACDqT,EAAIwhF,EAAM3yF,MAAQmR,EAAIwhF,EAAM3yF,OAAS,EACrC0yF,EAAaC,EAAM3yF,MAAQmC,E,CAI/B,IAAI,MAAM4wF,KAAaL,EACrB3yF,KAAK6vF,QAAQ8C,EAAaK,IAAc5hF,EAAI4hF,GAG9C,OAAOI,EAAgBr1F,IACzB,EAGF,MAAMs1F,GAYJvzF,YAAYmJ,EAAkCvN,EAAgE,CAAC,GAXvG,KAAA4wB,OAAS,EAQT,KAAAmjE,SAAmB,EAKtBxmF,aAAkB2mF,aACnB5vF,KAAKiJ,OAASA,EACdjJ,KAAK6vF,QAAU,IAAIC,WAAW7mF,GAC9BjJ,KAAK+vF,SAAW,IAAI3mF,WAAWpJ,KAAKiJ,UAEpCjJ,KAAKiJ,OAASA,EAAOA,OACrBjJ,KAAK6vF,QAAU,IAAIC,WAAW7mF,EAAOA,QACrCjJ,KAAK+vF,SAAW9mF,GAKlBjJ,KAAKm0B,SAAWz4B,EAAQy4B,UAAY,CAAC,EACrCn0B,KAAKyvF,UAAY/zF,EAAQ+zF,QACzBzvF,KAAKsI,WAA0BtN,IAAlBU,EAAQ4M,OAAsB5M,EAAQ4M,KACrD,CAMQgrF,QAAQxC,GAEd,GAAI9wF,KAAK+vF,SAAStzF,OAASuD,KAAKssB,OAAU,EAExC,MADA3uB,QAAQC,MAAMoC,KAAK+vF,SAAU/vF,KAAKssB,QAC5B,IAAIthB,MAAM,qBAAuB8lF,GAGzC,MAAMnrF,EAAI3F,KAAK6vF,QAAQ7vF,KAAKssB,OAAS,GAUrC,OAPAtsB,KAAKsI,OACH3K,QAAQwC,IAAI,MAAOwF,EAAEqH,SAAS,IAAKrH,EAAGmrF,EACpC9wF,KAAK+vF,SAAStoF,MAAMzH,KAAKssB,OAAS,GAAItsB,KAAKssB,OAAS,IACpDxf,EAAW9M,KAAK+vF,SAAStoF,MAAMzH,KAAKssB,OAAS,GAAItsB,KAAKssB,OAAS,MAEnEtsB,KAAKssB,QAAU,EAER3mB,CACT,CAEO4tF,SAASzC,GACd,OAAO9wF,KAAKszF,SAASxC,GAAS,IAAM,OACtC,CAEO0C,YAAY1C,GACjB,MAAM7nF,EAAS,IAAI2mF,YAAY,GACzBC,EAAU,IAAIC,WAAW7mF,GACzBwqF,EAAa,IAAI1B,aAAa9oF,GAKpC,OAHA4mF,EAAQ,GAAK7vF,KAAKszF,SAASxC,GAAS,IAAM,gBAC1CjB,EAAQ,GAAK7vF,KAAKszF,SAASxC,GAAS,IAAM,iBAEnC2C,EAAW,EACpB,CAGOC,UAAU5C,GACf,MAAMK,EAAOnxF,KAAKszF,SAASxC,GAAS,IAAM,cAG1C,IAAI6C,EAAQpF,GAFEvuF,KAAKszF,SAASxC,GAAS,IAAM,eAEVK,GD3e9B,IAAwBK,ECgf3B,OAJuBxxF,KAAKyvF,UAC1BkE,GD7eyBnC,EC6eFmC,GD5ebC,QAAQ9E,IAAc0C,EAAOqC,MAAMjF,IAAe4C,IC+e1DxxF,KAAKyvF,SACJd,GAAWmF,gBAAgBH,EAAMI,OAE3BJ,EAAM9B,aAKV8B,EAAM3mF,SAAS,GACxB,CAEOgnF,UAAUlD,GACf,MAAMnrF,EAAI3F,KAAKszF,SAASxC,GAAS,IAAM,SACvC,OAAGnrF,IAAMypF,IAECzpF,IAAMupF,KAIhBlvF,KAAKssB,QAAU,EACRtsB,KAAKi0F,YAAY,SAAUnD,GACpC,CAEOoD,YAAYpD,GACjB,IAAInkF,EAAM3M,KAAK+vF,SAAS/vF,KAAKssB,UAElB,MAAR3f,IACDA,EAAM3M,KAAK+vF,SAAS/vF,KAAKssB,UACtBtsB,KAAK+vF,SAAS/vF,KAAKssB,WAAa,EAChCtsB,KAAK+vF,SAAS/vF,KAAKssB,WAAa,IAGrC,IAUIorC,EAVAu6B,EAAQ,GACZ,IAAI,IAAItsF,EAAI,EAAGA,EAAIgH,IAAOhH,EACxBssF,GAASkC,OAAOC,aAAap0F,KAAK+vF,SAAS/vF,KAAKssB,WAIlD,KAAMtsB,KAAKssB,OAAS,KAChBtsB,KAAKssB,OAIT,IACEorC,EAAI28B,mBAAmBtT,OAAOkR,G,CAC9B,MAAM1vF,GACNm1D,EAAIu6B,C,CAKN,OAFAjyF,KAAKsI,OAAS3K,QAAQwC,IAAI,MAAOu3D,GAAIo5B,GAAS,IAAM,WAE7Cp5B,CACT,CAEO48B,WAAWxD,GAChB,IAAInkF,EAAM3M,KAAK+vF,SAAS/vF,KAAKssB,UAElB,MAAR3f,IACDA,EAAM3M,KAAK+vF,SAAS/vF,KAAKssB,UACtBtsB,KAAK+vF,SAAS/vF,KAAKssB,WAAa,EAChCtsB,KAAK+vF,SAAS/vF,KAAKssB,WAAa,IAGrC,MAAMvf,EAAQ/M,KAAK+vF,SAASR,IAAavvF,KAAKssB,OAAQtsB,KAAKssB,OAAS3f,GAIpE,IAHA3M,KAAKssB,QAAU3f,EAGT3M,KAAKssB,OAAS,KAChBtsB,KAAKssB,OAKT,OAFAtsB,KAAKsI,OAAS3K,QAAQwC,IAAI,MAAO2M,EAAWC,IAAS+jF,GAAS,IAAM,UAE7D/jF,CACT,CAIOwnF,cAAcnC,EAAc9B,GAAiB,EAAMQ,GACxD,GAAGsB,EAAO,GACR,MAAM,IAAIpnF,MAAM,iBAAmBonF,GAGrC,MAAMzlF,EAAMylF,EAAO,EACnB,GAAG9B,EAAO,CACR,MAAMluF,EAASpC,KAAK+vF,SAASR,IAAavvF,KAAKssB,OAAQtsB,KAAKssB,OAAS3f,GAErE,OADA3M,KAAKssB,QAAU3f,EACRvK,C,CAGT,MAAM2K,EAAkB,IAAIjM,MAAM6L,GAClC,IAAI,IAAIhH,EAAI,EAAGA,EAAIgH,IAAOhH,EACxBoH,EAAMpH,GAAK3F,KAAK+vF,SAAS/vF,KAAKssB,UAKhC,OAFAtsB,KAAKsI,OAAS3K,QAAQwC,IAAI,MAAO2M,EAAWC,IAAS+jF,GAAS,IAAM,OAASsB,GAEtErlF,CACT,CAIOynF,cAAc7nF,EAAqB2jF,GAAiB,EAAMQ,GAC/D,IAAW,IAARnkF,IACDA,EAAM3M,KAAKszF,SAASxC,GAAS,IAAM,YAC1B9wF,KAAK+vF,SAASxlF,WACrB,MAAM,IAAIS,MAAM,6BAA+B2B,EAAM,iBAAmB3M,KAAK+vF,SAASxlF,YAI1F,GAAG+lF,EAAO,CACR,MAAMvjF,EAAQ,IAAI3D,WAAWuD,GAG7B,OAFAI,EAAM9E,IAAIjI,KAAK+vF,SAASR,IAAavvF,KAAKssB,OAAQtsB,KAAKssB,OAAS3f,IAChE3M,KAAKssB,QAAU3f,EACRI,C,CAGT,MAAMA,EAAkB,IAAIjM,MAAM6L,GAClC,IAAI,IAAIhH,EAAI,EAAGA,EAAIgH,IAAOhH,EACxBoH,EAAMpH,GAAK3F,KAAK+vF,SAAS/vF,KAAKssB,UAKhC,OAFAtsB,KAAKsI,OAAS3K,QAAQwC,IAAI,MAAO2M,EAAWC,GAAS+jF,GAAS,IAEvD/jF,CACT,CAEQ0nF,YAAY12F,EAAc+yF,GAChC,MAAMnkF,EAAM3M,KAAKszF,QAAQxC,EAAQ,WAC3B1uF,EAAgB,IAAItB,MAAM6L,GAChC,GAAGA,EAAM,EAAG,CACV,MAAMsmF,EAAWl1F,EAAK4B,OAAO,EAAG5B,EAAKtB,OAAS,GAC9C,IAAI,IAAIkJ,EAAI,EAAGA,EAAIgH,IAAOhH,EACxBvD,EAAOuD,GAAK3F,KAAKi0F,YAAYhB,EAAUnC,EAAQ,IAAMnrF,EAAI,I,CAI7D,OAAOvD,CACT,CAEO6xF,YAAYl2F,EAAc+yF,GAC/B,OAAO/yF,GACL,IAAK,IACL,IAAK,MACH,OAAOiC,KAAKuzF,SAASzC,GACvB,IAAK,OACH,OAAO9wF,KAAK0zF,UAAU5C,GACxB,IAAK,SACH,OAAO9wF,KAAKu0F,cAAc,KAAK,EAAMzD,GACvC,IAAK,SACH,OAAO9wF,KAAKu0F,cAAc,KAAK,EAAMzD,GACvC,IAAK,SACH,OAAO9wF,KAAKu0F,cAAc,KAAK,EAAMzD,GACvC,IAAK,SACH,OAAO9wF,KAAKk0F,YAAYpD,GAC1B,IAAK,QACH,OAAO9wF,KAAKs0F,WAAWxD,GACzB,IAAK,SACH,OAAO9wF,KAAKwzF,YAAY1C,GAC1B,IAAK,OACH,OAAO9wF,KAAKg0F,UAAUlD,GACxB,IAAK,OACH,OAAO,EAKX,GAFAA,EAAQA,GAAS/yF,GAAQ,SAEH,MAAnBA,EAAKlC,OAAO,IAAoC,UAAtBkC,EAAK4B,OAAO,EAAG,GAC1C,OAAOK,KAAKy0F,YAAY12F,EAAM+yF,GAGhC,MAAMoC,EAASlzF,KAAKyvF,QAAU,WAAiB,OAC/C,IAAI2D,EAAsC,KACtCsB,GAAW,EAEf,GAAsB,MAAnB32F,EAAKlC,OAAO,GAAY,CACzB,MAAM84F,EAAY52F,EAAK4B,OAAO,GAE9B,GADAyzF,EAAkBF,EAAO3gE,aAAa/zB,MAAM+X,GAAMA,EAAExY,OAAS42F,KACzDvB,EACF,MAAM,IAAIpoF,MAAM,mCAAqCjN,E,KAO/C,CACR,MAAM62F,EAAiB50F,KAAKszF,QAAQxC,EAAQ,QAE5C,GAAG8D,IAAmBtF,GAAY,CAChC,MACMuF,GCnrByB9nF,EDkrBZ/M,KAAKs0F,WAAWxD,EAAQ,mBChrBlC,aAAa/jF,OAAmC/R,IDorBzD,OAFwB,IAAIq4F,GAAkBwB,GAEvBZ,YAAYl2F,EAAM+yF,E,CAG3C,GAAG8D,IAAmBvF,GACpB,OAAOrvF,KAAKy0F,YAAY12F,EAAM+yF,GAGhC,IAAI3vF,EAAQ+xF,EAAO4B,kBACnB,IAAI3zF,EAAO,CACT+xF,EAAO4B,kBAAoB3zF,EAAQ,CAAC,EACpC,IAAI,IAAIwE,EAAI,EAAGgH,EAAMumF,EAAO3gE,aAAa91B,OAAQkJ,EAAIgH,IAAOhH,EAC1DxE,EAAM+xF,EAAO3gE,aAAa5sB,GAAG/I,IAAM+I,C,CAIvC,MAAMA,EAAIxE,EAAMyzF,GAKhB,QAJS55F,IAAN2K,IACDytF,EAAkBF,EAAO3gE,aAAa5sB,KAGpCytF,GAAmBpzF,KAAKyvF,QAAS,CACnC,MAAMsF,EAAiB,OACvB,IAAI,IAAIpvF,EAAI,EAAGgH,EAAMooF,EAAexiE,aAAa91B,OAAQkJ,EAAIgH,IAAOhH,EAClE,IAAIovF,EAAexiE,aAAa5sB,GAAG/I,KAAOg4F,EAAgB,CACxDxB,EAAkB2B,EAAexiE,aAAa5sB,UAEvC3F,KAAKyvF,QACZiF,GAAW,EACX,K,EAKN,IAAItB,EAAiB,CAGnB,IAAI4B,EAAcC,EAFlBt3F,QAAQC,MAAM,yBAA0Bg3F,GAGxC,IACEI,EAAOh1F,KAAKuzF,SAASzC,GACrBmE,EAAOj1F,KAAKuzF,SAASzC,E,CACrB,MAAMxnF,G,CAIR,MAAM,IAAI0B,MAAM,0BAA4B4pF,EAAiB,IAAMI,EAAO,IAAMC,EAAO,IAAMnE,E,ECluBtF,IAAwB/jF,EDsuBnC,MAAMoiF,EAAYiE,EAAgBjE,UAE5B/sF,EAAc,CAAC,EAAK+sF,GACpB+F,GAAel1F,KAAKyvF,QAAU,MAAQ,IAAMN,EAClD,GAAGnvF,KAAKm0B,SAAS+gE,GACfl1F,KAAKm0B,SAAS+gE,GAAa9yF,EAAQ0uF,EAAQ,IAAM3B,EAAY,UAE7D,IAAI,IAAIxpF,EAAI,EAAGgH,EAAMymF,EAAgBn/E,OAAOxX,OAAQkJ,EAAIgH,IAAOhH,EAAG,CAChE,MAAMitF,EAAQQ,EAAgBn/E,OAAOtO,GACrC,IAAI5H,EAAO60F,EAAM70F,KAEL,MAATA,QAAkC/C,IAAlBoH,EAAOlF,SACxBkF,EAAOlF,OAAS,CAAC,GAGnB,MAAMi4F,GAAgC,IAAvBp3F,EAAKtD,QAAQ,KAC5B,GAAG06F,EAAQ,CACT,MAAMtC,EAAW90F,EAAK6B,MAAM,KACtBkzF,EAAWD,EAAS,GAAGjzF,MAAM,KAEnC,KAAKwC,EAAO0wF,EAAS,IAAO,IAAMA,EAAS,IACzC,SAGF/0F,EAAO80F,EAAS,E,CAGlB,MAAMxuF,EAAQrE,KAAKi0F,YAAYl2F,EAAM+yF,EAAQ,IAAM3B,EAAY,KAAOyD,EAAM3yF,KAAO,KAEhFk1F,GAAmB,SAATp3F,EACXqE,EAAOlF,OAAO01F,EAAM3yF,MAAQoE,EAE5BjC,EAAOwwF,EAAM3yF,MAAQoE,C,CAS3B,OAJGqwF,IACD10F,KAAKyvF,SAAU,GAGL,cAAT1xF,EACMiC,KAAKo1F,gBAAgBhzF,GAGvBA,CACT,CAEQgzF,gBAAgBC,GACtB,IAAIA,EAAU14F,EAAG,OAAO04F,EACxB,OAAOA,EAAU14F,GACf,IAAK,WACH,OAAO,KACT,IAAK,aAAc,CACjB,MAAMitB,EAAW,CAAC,EACZ0rE,EAAeD,EAAUhxF,MAC/B,IAAI,IAAIsB,EAAI,EAAGlJ,EAAS64F,EAAa74F,OAAQkJ,EAAIlJ,IAAUkJ,EAAG,CAC5D,MAAM4vF,EAAcD,EAAa3vF,GACjCikB,EAAI2rE,EAAYluF,KAAOrH,KAAKo1F,gBAAgBG,EAAYlxF,M,CAE1D,OAAOulB,C,CAET,QACE,OAAOyrE,EAAUhxF,MAEvB,CAEOmsF,YACL,OAAOxwF,KAAKssB,MACd,CAEOkpE,UAAUlpE,GACftsB,KAAKssB,OAASA,CAChB,EAWF,uBAAmC+mE,GACnC,qBAAiC7D,G,eE/zBlB,SAASiG,GACtB1oF,EACA2oF,EAAoB,GACpBC,EACAC,GAAyB,EACzB3kE,GAAU,GAEV,MAAMtkB,EAAOI,EAAsBxC,YAAewC,EAAqBtQ,OACjEo5F,EAAcD,EAAyBF,EAAY/oF,EAAM+oF,EAAa/oF,EAAM+oF,EAClF,GAAGG,EAAc,GAAKA,EAAcH,EAAW,CAE7C,MAAMI,EAAU,IAAI1sF,WAAWysF,GAC/B,GAAGF,EACD,IAAI,IAAIhwF,EAAI,EAAGA,EAAIkwF,IAAelwF,EAChCmwF,EAAQnwF,GAAK,OAGfkF,EAAUirF,GAGZ,OAAG/oF,aAAiB6iF,aACV3+D,GAAU,EAAA8kE,GAAA,GAAcD,EAAS/oF,IAAS,EAAAgpF,GAAA,GAAchpF,EAAO+oF,IAAU7sF,OACzE8D,aAAiB3D,WACjB6nB,GAAU,EAAA8kE,GAAA,GAAcD,EAAS/oF,IAAS,EAAAgpF,GAAA,GAAchpF,EAAO+oF,GAG/D7kE,EAAU,IAAI6kE,GAAS9xF,OAAO+I,GAASA,EAAM/I,OAAO,IAAI8xF,G,CAIpE,OAAO/oF,CACT,C,iUCkDA,MACMipF,GAQF,CACFllF,OAAQ,CACNmlF,mBAAoB,EACpBC,mBAAoB,GACpBC,aAAc,IACdC,YAAa,EACbC,kBAAmB,KAErBh3D,KAAM,CACJ42D,mBAAoB,GACpBC,mBAAoB,GACpBC,aAAc,IACdC,YAAa,EACbC,kBAAmB,OAGjBC,GAAmC,CACvCC,YAAY,EACZC,mBAAmB,GAErB,IAAIC,GACAC,GAAkB,EAEP,MAAMC,GA2EnB72F,YACU62C,EACAhzB,EACDxb,EACC2jF,EACAE,EACRC,EACAvwF,EAA4B,CAAC,GANrB,KAAAi7C,iBAAAA,EACA,KAAAhzB,YAAAA,EACD,KAAAxb,KAAAA,EACC,KAAA2jF,QAAAA,EACA,KAAAE,UAAAA,EAzEF,KAAA4K,mBAAoC,GAEpC,KAAAC,aAEJ,CAAC,EAEG,KAAAC,gBAA6C,CAAC,EAC9C,KAAAC,YAA6B,GAC7B,KAAAC,iBAA6B,GAK7B,KAAAC,QAAkB,EAOlB,KAAAC,sBAAwB,EAExB,KAAA1X,SAAU,EAkBX,KAAAkM,UAAW,EACV,KAAAhlF,OAA2B,WAC3B,KAAAywF,iBAAmB,EAEnB,KAAA7uF,MAAQ,MAAwB,UAEjC,KAAA8uF,eAAiB,EA2XhB,KAAAC,wBAA0B,K,MAGhC,GAAGr3F,KAAKs3F,8BAAgCt3F,KAAKmR,YAAcnR,KAAKmR,UAAUzI,UAAW,OAUrF,MAAMlP,EAAWwG,KAAKs3F,6BAA8B,SAC9CtB,EAASh2F,KAAKg2F,OACdI,EAAcp2F,KAAKg2F,OAAOI,YAC1BmB,EAAe52E,KAAKC,IAAqB,QAAjB,EAAA5gB,KAAKu3F,oBAAY,QAAI,EAAGnB,GAChDoB,EAAkB72E,KAAK82E,MAAMzB,EAAOC,mBAAqBsB,EAAenB,GAAeJ,EAAOE,mBAAqBF,EAAOC,qBAC1HyB,EAAgC,IAAlBF,EACdtK,EAAYltF,KAAK23F,kBAAoBppF,KAAK1J,MAC1C+yF,EAAS53F,KAAK63F,2BAA4B,UAC1Cn8F,EAA4B,CAAC86F,mBAAmB,GACtDx2F,KAAK83F,YAAY,wBAAyB,CACxCC,QAASH,EACTI,iBAAkBR,GACjB97F,GAEH,MAAMyE,EAAMH,KAAKG,IAAIg2B,WAAW,2BAChCn2B,KAAKsI,OAASnI,EAAImI,MAAM,iBAAiBovF,mBAA6B13F,KAAKu3F,uBAAuB77F,EAAQqS,qBAAqB6pF,KAC/H,MAAMK,EAAgBrpF,EAAA,aAAepV,EAASoI,OAAQ81F,GAkCtDl+F,EACCsL,MAjCmBrG,IAClBuG,aAAaizF,GACb,MAAMC,EAAc3pF,KAAK1J,MAAQqoF,EAGjC,GAFAltF,KAAKu3F,aAAeW,EAAc,IAClCl4F,KAAKsI,OAASnI,EAAImI,MAAM,iBAAiB7J,YAAiB84F,YAAuB77F,EAAQqS,aACtFmqF,EAAcR,EACf,WAAM18F,EAEN,OAAO,EAAA+O,EAAA,GAAM4W,KAAK4E,IAAI,EAAGvlB,KAAKg2F,OAAOG,aAAe+B,G,IA0BvDjqF,OAtBiB,KAChBjJ,aAAaizF,GACb,MAAM9mF,EAAYnR,KAAKmR,UACpBnR,KAAKs3F,8BAAgC99F,IAAa2X,aAAS,EAATA,EAAW3D,cAIhErN,EAAIvC,MAAM,4BAA6BoC,KAAKu3F,aAAc77F,EAAQqS,WAClEoD,EAAU3D,WAAW7K,QAAO,IAe7BimC,SAZiB,KACb5oC,KAAKs3F,8BAAgC99F,IAIxCwG,KAAKs3F,iCAA8Bt8F,EACnCgF,KAAKq3F,0BAAyB,GAMb,EAIb,KAAAc,cAAgB,KACtB,MAAMC,EAAUp4F,KAAK0N,cAErB,GAAI1N,KAAKq4F,iBAAmB9pF,KAAK1J,MAAQ7E,KAAKq4F,iBAC5Cr4F,KAAKw/E,SACLx/E,KAAKmtF,aACLntF,KAAK6sF,gBAEL,OAAO,EAGTvC,GAAA,MAAmB,MAAMxlF,MAAMwkF,IAC1B8O,IACD9O,IAAatpF,KAAKmI,MACfnI,KAAKs4F,YAAc/pF,KAAK1J,MAAQ7E,KAAKs4F,aAM1Ct4F,KAAKu4F,cAAc,GACnB,EA6BI,KAAAC,gBAAmBr2F,IAIzB,GAHAnC,KAAKsI,OAAStI,KAAKG,IAAI,mBAAoBgC,GAC3CnC,KAAKy4F,+BAEDz4F,KAAKmR,UAEP,YADAnR,KAAKG,IAAI2C,KAAK,oCAIhB,MAAM41F,EAAa,IAAIlJ,GAAgB,CAACC,SAAS,IAC3CmI,GAAS,UAEfc,EAAWpG,YAAY,OAAQ,CAC7ByF,QAASH,IAGX,MAAMe,EAAc,CAClBx6C,OAAQn+C,KAAK2jB,YAAYi1E,aACzBC,OAAQ74F,KAAK84F,eAAc,GAC3BlwF,KAAM8vF,EAAWrI,UAAS,IAGzBrwF,KAAKw/E,SACNx/E,KAAKyN,oBAAoB,gBAG3BzN,KAAK+4F,qBAAqBJ,GAAa7zF,MAAK,KAC1C9E,KAAKg5F,eAAc,EAAM,IACxB,KACDh5F,KAAKsI,OAAStI,KAAKG,IAAI,QAAsC,IAA7BH,KAAKk3F,uBACrCl3F,KAAKi5F,uBAAyBrqF,EAAA,cAAe,IAAM5O,KAAKw4F,gBAAgB,wCAAqE,IAA7Bx4F,KAAKk3F,sBAA+B,GACpJl3F,KAAKk3F,sBAAwBv2E,KAAKC,IAAI,GAAiC,IAA7B5gB,KAAKk3F,sBAA4B,GAC3E,EApfFl3F,KAAKk5F,cAAe,EAAAC,GAAA,GAAoBn5F,KAAK8rF,SAC7C9rF,KAAKisF,YAAa,EAAAkN,GAAA,GAAoBlN,GAEtCjsF,KAAKo5F,eAAiB19F,EAAQosF,WAC9B9nF,KAAKq5F,iBAAmB39F,EAAQyoF,aAChCnkF,KAAK6sF,gBAAkB7sF,KAAKo5F,cAAgBp5F,KAAKq5F,eACjDr5F,KAAKg2F,OAASh2F,KAAK6sF,gBAAkBmJ,GAAO32D,KAAO22D,GAAOllF,OAE1D,MAAMjB,EAAS7P,KAAKo5F,aAAe,KAAOp5F,KAAKq5F,eAAiB,KAAO,GACvEr5F,KAAKC,KAAO,OAASkI,EAAO0H,EAE5B7P,KAAKG,KAAM,EAAAsI,EAAA,IAAOzI,KAAKC,MAAQ4P,EAAS,GAAK,MAAQ,IAAM6mF,KAAmB,KAAAluF,IAAsC,WAAiB,WACrIxI,KAAKG,IAAI,eAQTH,KAAKs5F,eAOP,CAEQA,gBACNt5F,KAAKu5F,MAAQ,EACbv5F,KAAKw5F,cAAgBx5F,KAAKgO,UAC1BhO,KAAKgO,UAAYnD,EAAU,IAAIzB,WAAW,GAC5C,CAWQqwF,kBAAkBC,GACxB,MAAMC,EAAc35F,KAAK62F,aAAa6C,GACtC,QAAIC,IAIDA,EAAYC,YACb,EAAA1xE,GAAA,GAAeyxE,EAAYE,OAAO,CAACC,EAAoBx1F,KACrD,MAAMy1F,EAAmB/5F,KAAKy5F,kBAAkBK,GAC5CC,EAGFJ,EAAYE,MAAMv1F,GAAOy1F,EAAiB57C,OAF1Cw7C,EAAYE,MAAM/vF,OAAOxF,EAAK,E,IAOpCq1F,EAAYx7C,OAASn+C,KAAK2jB,YAAYi1E,aACtCe,EAAYd,OAAS74F,KAAK84F,cAAca,EAAYnD,mBAAqBmD,EAAYC,WAElF55F,KAAKsI,OACNtI,KAAKG,IAAI,0BAA0Bu5F,UAAsBC,EAAYx7C,UAGvEn+C,KAAK62F,aAAa8C,EAAYx7C,QAAUw7C,SACjC35F,KAAK62F,aAAa6C,GAElBC,EACT,CAEQb,cAActC,GACpB,IAAI+C,EAAqB,EAAbv5F,KAAKu5F,MAOjB,OALI/C,IACF+C,IACAv5F,KAAKu5F,SAGAA,CACT,CAEOzB,YAAYhvF,EAAgBmL,EAAavY,GAC9C,MAAMg9F,EAAa,IAAIlJ,GAAgB,CAACC,SAAS,IAEjDiJ,EAAWpG,YAAYxpF,EAAQmL,GAE/B,MAAMlG,EAAY/N,KAAK2jB,YAAYi1E,aAC7BW,EAAQv5F,KAAK84F,gBACbj3F,EAAU,CACds8C,OAAQpwC,EACR8qF,OAAQU,EACR3wF,KAAM8vF,EAAWrI,UAAS,IAO5B,OAJG,WACDrwF,KAAKG,IAAI,UAAW2I,EAAQmL,EAAQlG,EAAWwrF,GAG1Cv5F,KAAKg6F,YAAYn4F,EAASnG,EACnC,CAEOu+F,eAAe3yF,EAAa5L,GACjC,MAAMg9F,EAAa,IAAIlJ,GAAgB,CAACC,SAAS,IACjDiJ,EAAW3F,YAAYzrF,EAAQ,UAE/B,MAAMyG,EAAY/N,KAAK2jB,YAAYi1E,aAC7BW,EAAQv5F,KAAK84F,cAAcp9F,EAAQ86F,mBACnC30F,EAAU,CACds8C,OAAQpwC,EACR8qF,OAAQU,EACR3wF,KAAM8vF,EAAWrI,UAAS,IAO5B,OAJG,WACDrwF,KAAKG,IAAI,aAAcmH,EAAQyG,EAAWwrF,GAGrCv5F,KAAKg6F,YAAYn4F,EAASnG,EACnC,CAEO2xF,YAAYvkF,EAAgBmL,EAAc,CAAC,EAAGvY,EAA4B,CAAC,GAChF,MAAMg9F,EAAa,IAAIlJ,GAAgB9zF,GAEvC,IAAIsE,KAAKk6F,iBAAkB,CAGzB,MAAMC,EAAkB,qBAAyBzH,GAAmB,oBAAbA,EAAE5pF,SACzD,IAAIqxF,EAAiB,MAAM,IAAInvF,MAAM,uBACrC0tF,EAAW3H,UAAUoJ,EAAgBv9F,GAAI,mBAGzC87F,EAAW3H,SAAS,SAAc,SAElC,MAAMqJ,EAAiB,qBAAyB1H,GAAmB,mBAAbA,EAAE5pF,SACxD,IAAIsxF,EAAgB,MAAM,IAAIpvF,MAAM,sBAEpC0tF,EAAW3H,UAAUqJ,EAAex9F,GAAI,kBACxC87F,EAAW3H,SAAS,EAAK,SACzB2H,EAAW3H,SAAS,OAAQ,UAC5B2H,EAAW1G,YAAYlsF,IAAiB3L,YAAc,oBAAqB,gBAC3Eu+F,EAAW1G,YAAY53F,UAAUQ,UAAY,mBAAoB,kBACjE89F,EAAW1G,YAAY,aAAe,iBAAmB,IAAM,WAAa,IAAK,eACjF0G,EAAW1G,YAAY53F,UAAUi+B,UAAY,KAAM,oBACnDqgE,EAAW1G,YAAY,aAAc,aACrC0G,EAAW1G,YAAYhyF,KAAK22C,iBAAiBte,SAAU,Y,CAczD,GAAG38B,EAAQizD,eAAgB,CACzB,QAAiC3zD,IAA9By7F,GAAyC,CAC1C,MAAM/D,EAAI,qBAAyBA,GAAmB,mBAAbA,EAAE5pF,SAC3C2tF,GAA4B/D,GAAKA,EAAE91F,GAAK,C,CAGvC65F,IAKDiC,EAAW3H,SAAS0F,GAA2B,kBAC/CiC,EAAWtH,UAAU11F,EAAQizD,eAAgB,WAE7C3uD,KAAKG,IAAIvC,MAAM,qB,CAInBlC,EAAQ2+F,WAAa3B,EAAWpG,YAAYxpF,EAAQmL,GAMpD,MAEMpS,EAAU,CACds8C,OAHgBn+C,KAAK2jB,YAAYi1E,aAIjCC,OAHY74F,KAAK84F,gBAIjBlwF,KAAM8vF,EAAWrI,UAAS,GAC1BiK,OAAO,GAST,OANG,UACDt6F,KAAKG,IAAI,WAAY2I,EAAQjH,EAASoS,EAAQvY,GACtCsE,KAAKsI,OACbtI,KAAKG,IAAI,WAAY2I,EAAQmL,EAAQvY,GAGhCsE,KAAKg6F,YAAYn4F,EAASnG,EACnC,CAEO+wF,gBAAgBt7E,GACrB,MAAMq7E,EAAexsF,KAAKmR,UACvBq7E,IACDA,EAAahjF,UAEVxJ,KAAKu6F,iBACNv1F,aAAahF,KAAKu6F,gBAClBv6F,KAAKu6F,eAAiB,EACtBv6F,KAAKi3F,QAAU,GAGjBj3F,KAAKk6F,kBAAmB,OAGKl/F,IAA1BgF,KAAKw6F,mBACNrjE,cAAcn3B,KAAKw6F,kBACnBx6F,KAAKw6F,sBAAmBx/F,GAG1BgF,KAAKy4F,+BAIPz4F,KAAKG,IAAI,mBAAoBgR,EAAWq7E,GAGxCxsF,KAAKy6F,2BAULz6F,KAAKmR,UAAYA,EACbA,IAIJA,EAAUzH,UAAY1J,KAInBmR,aAAqBjJ,IAEtBlI,KAAKw6F,iBAAmB5rF,EAAA,cAAgB5O,KAAKm4F,cAAe,KAC5Dn4F,KAAKm4F,gBACLn4F,KAAKw4F,gBAAgB,sBAQnBrnF,EAA4B3D,YAG3B2D,EAAUzI,WACX1I,KAAKyN,oBAAoB,eAQ7BzN,KAAK2N,SACP,CAEOnE,UACLxJ,KAAKG,IAAI,UACX,CAEOu6F,wBACD16F,KAAKmR,UAA4BtC,UAClC7O,KAAKmR,UAA4BtC,YAElC7O,KAAK2N,QAET,CAEOoB,iBACD/O,KAAKmR,UAA4BpC,eAClC/O,KAAKmR,UAA4BpC,iBAElC/O,KAAKw4F,gBAAgB,kBAEzB,CA4CQiC,2BACN,MAAMjhG,EAAWwG,KAAKs3F,4BACtBt3F,KAAKs3F,iCAA8Bt8F,EACnCgF,KAAK63F,+BAA4B78F,EAE9BxB,GACDA,EAASoI,QAEb,CAgGQ22F,eACHv4F,KAAK26F,kBACR36F,KAAK26F,iBAAkB,EAGvB36F,KAAKq4F,gBAAkB9pF,KAAK1J,MAFZ,KAGhB7E,KAAKsI,OAAStI,KAAKG,IAAImI,MAAM,eAAgBtI,KAAKq4F,iBAElDr4F,KAAK83F,YAAY,YAAa,CAC5B8C,UAAW,IACXC,WAAY,IACZC,SARc,MASb,CACDC,YAAY,EAEZC,UAAU,IACTl2F,MAAK,KACN9E,KAAKq4F,qBAAkBr9F,EACvB+G,WAAW/B,KAAKm4F,cAAe,EAAE,IAC/Bv6F,IACFoC,KAAKG,IAAI,mBAAoBvC,EAAM,IAClCgrC,SAAQ,KACT5oC,KAAK26F,qBAAkB3/F,CAAS,IAEpC,CAqCQy9F,mCAC6Bz9F,IAAhCgF,KAAKi5F,yBACNj0F,aAAahF,KAAKi5F,wBAClBj5F,KAAKi5F,4BAAyBj+F,EAElC,CAEQg+F,cAAcxZ,GACpB,GAAGx/E,KAAKw/E,UAAYA,EAIlB,GAHAx/E,KAAKw/E,QAAUA,EAEfx/E,KAAKy4F,8BACFjZ,EAAS,CACVx6E,aAAahF,KAAKu6F,gBAClBv6F,KAAKu6F,eAAiB,EACtBv6F,KAAKi3F,QAAU,EAEZj3F,KAAKk3F,sBAAwB,MAC9Bl3F,KAAKk3F,sBAAwB,GAG/B,MAAM+D,EAAqC,IAA7Bj7F,KAAKk3F,sBAA+B,EAClDl3F,KAAKk7F,uBAAyB3sF,KAAK1J,MAAQo2F,EAC3Cj7F,KAAKyN,oBAAoB,WAAyBzN,KAAKk7F,wBACvDl7F,KAAKi5F,uBAAyBrqF,EAAA,cAAe,IAAM5O,KAAKw4F,gBAAgB,sBAAsByC,GAC9Fj7F,KAAKk3F,sBAAwBv2E,KAAKC,IAAI,GAAuC,KAAlC,EAAI5gB,KAAKk3F,uB,MAOpDl3F,KAAKyN,oBAAoB,eACzBzN,KAAKm4F,gBAELn4F,KAAKm7F,kBASTn7F,KAAKyN,oBAAoB+xE,EAAU,WAA0B,cAA4BA,EAAUx/E,KAAKk7F,4BAAyBlgG,EACnI,CAEQogG,+BAA+BzxF,EAA2D9H,EAAoBw5F,GAKpH1xF,EAAQ7E,MAAM1C,IACZpC,KAAKg5F,eAAc,GAEZh5F,KAAK6N,cAAczL,GAAQ0C,MAAMiE,IACtC/I,KAAKsI,OAAStI,KAAKG,IAAImI,MAAM,kBAAmBS,GAEhD/I,KAAK8N,eAAe/E,EAASA,SAAUA,EAASgF,UAAWhF,EAASiF,WAEpEhO,KAAKm4F,gBACLn4F,KAAKk3F,sBAAwBv2E,KAAK4E,IAAI,IAAK5E,KAAK26E,KAAKt7F,KAAKk3F,yBAEnD,QAEPt5F,IACFoC,KAAKG,IAAIvC,MAAM,2BAA4BA,EAAOiE,GAElD7B,KAAKu7F,WAAW15F,EAAQs8C,QACxBn+C,KAAKg5F,eAAc,IAEZ,KACNl0F,MAAM02F,IAEP,MAAM3E,EAAe72F,KAAK62F,aAC1BwE,EAAev8F,SAAS47D,IACtB,MAAMi/B,EAAc9C,EAAan8B,GACjC,GAAGi/B,EAAa,CACd,MAAMngG,EAAWmgG,EAAYngG,gBACtBq9F,EAAan8B,UACb16D,KAAK82F,gBAAgBp8B,GAC5B8gC,EAAgBhiG,EAASyI,UAAYzI,EAASoI,Q,IAEhD,GAEN,CAIQo4F,YAAYn4F,EAKjBnG,GACD,IAAIiO,EAuBJ,OAtBIjO,EAAQ86F,oBAAqB96F,EAAQq/F,aACvCpxF,GAAU,UAGZ3J,KAAK62F,aAAah1F,EAAQs8C,QAAUlkD,OAAOC,OACzC2H,EACAnG,EACAiO,EAAU,CAACnQ,SAAUmQ,QAAW3O,GAKlCgF,KAAK82F,gBAAgBj1F,EAAQs8C,QAAU,EAEnCziD,EAAQ66F,YACVv2F,KAAKm7F,mBAGJ,EAAA33E,GAAA,GAAS9nB,KACVA,EAAQqS,UAAYlM,EAAQs8C,QAGvBx0C,CACT,CAEOmkF,cAAcnkF,EAAuB9H,GAC1C,MACMoD,EAAUlD,YAAW,KACtB/B,KAAKm3F,kBAAqB5oF,KAAK1J,MAAQ7E,KAAKm3F,iBAAoBn3F,KAAKg2F,OAAOK,oBAI/Er2F,KAAKG,IAAIvC,MAAM,UAAWiE,GACvB7B,KAAK0rF,UACN1rF,KAAKyN,oBAAoB,c,GAM1BzN,KAAKg2F,OAAOK,mBAEf1sF,EAAQsE,MAAMohD,GAAA,GAAMzmB,SAAQ,KAC1B5jC,aAAaC,GACbjF,KAAKyN,oBAAoB,iBAGrBzN,KAAKo3F,eACPp3F,KAAK+sF,iB,MAKL/sF,KAAKo3F,oBACoBp8F,IAAxBgF,KAAKy7F,iBACNz2F,aAAahF,KAAKy7F,gBAClBz7F,KAAKy7F,oBAAiBzgG,EAG5B,CAEO+xF,mBACD/sF,KAAKo3F,gBAAkBp3F,KAAK2sF,cAAmC3xF,IAAxBgF,KAAKy7F,iBAC9Cz7F,KAAKy7F,eAAiB7sF,EAAA,cAAe,KACnC5O,KAAKy7F,oBAAiBzgG,EACtBgF,KAAKG,IAAI,SACTH,KAAK2sF,SAAS,GA7wBA,KAgxBpB,CAEOl/E,oBAAoB/G,EAA0B2H,G,MACnD,MAAMq9E,EAAWhlF,IAAW,cACtBg1F,EAAa17F,KAAK0G,SAAWA,EACnC1G,KAAK0rF,SAAWA,EAChB1rF,KAAK0G,OAASA,EAEXg1F,IACE17F,KAAK22C,iBAAiBglD,0BACvB37F,KAAK22C,iBAAiBglD,yBAAyB,CAC7Ch/F,EAAG,kBACH+J,SACAyB,KAAMnI,KAAKmI,KACXlI,KAAMD,KAAKC,KACX4sF,gBAAiB7sF,KAAK6sF,gBACtBwM,eAAgBr5F,KAAKq5F,eACrBD,aAAcp5F,KAAKo5F,aACnB/qF,YAIDrO,KAAK0rF,UACN1rF,KAAKm7F,mBAG6B,QAAhC,EAAAn7F,KAAKmR,iBAA2B,eAAE3D,cACpCxN,KAAKy6F,2BACLz6F,KAAKq3F,2BAQX,CAEQkE,WAAWxtF,EAAmBktF,EAAQ,KAC5C,MAAM52F,EAAQ42F,EAAQ1sF,KAAK1J,MAAQo2F,EAAQ,EACrCtB,EAAc35F,KAAK62F,aAAa9oF,GACtC,GAAG4rF,EAAYC,UACb,IAAI,MAAMgC,KAAcjC,EAAYE,MAClC75F,KAAK82F,gBAAgB8E,GAAcv3F,OAGrCrE,KAAK82F,gBAAgB/oF,GAAa1J,EAGjCs1F,EAAYkC,OACb77F,KAAKG,IAAIvC,MAAM,6BAA8B+7F,GAG5C35F,KAAKsI,OACNtI,KAAKG,IAAImI,MAAM,cAAeyF,EAAW4rF,EAAa35F,KAAK82F,gBAAiBmE,GAG9Ej7F,KAAKm7F,gBAAgBF,EACvB,CAGca,UAAUC,EAA6BzxE,G,0CACnD,MAAM0xE,EAAI1xE,EAAQ,EAAI,EAChB2xE,GAAmB,EAAAlG,GAAA,GAAc/1F,KAAKk5F,aAAa/I,SAAS,GAAK6L,EAAG,GAAKA,EAAI,IAAKD,GAElFG,QAAoB,iBAA0B,SAAUD,GAE9D,OADe,IAAI7yF,WAAW8yF,GAAa/L,SAAS,EAAG,GAEzD,G,CAGQgM,YAAYC,EAAoB9xE,GACtC,MAAM0xE,EAAI1xE,EAAQ,EAAI,EAChB+xE,EAAY,IAAIjzF,WAAW,IAC3BkzF,EAAY,IAAIlzF,WAAW,IAC3BlF,EAAuC,GAU7C,OARAm4F,EAAUp0F,IAAIm0F,EAAQ,GACtBC,EAAUp0F,IAAIjI,KAAKk5F,aAAa/I,SAAS6L,EAAGA,EAAI,IAAK,IACrD93F,EAAS5D,KAAK,iBAA0B,SAAU+7F,IAElDC,EAAUr0F,IAAIjI,KAAKk5F,aAAa/I,SAAS,GAAK6L,EAAG,GAAKA,EAAI,IAAK,GAC/DM,EAAUr0F,IAAIm0F,EAAQ,IACtBl4F,EAAS5D,KAAK,iBAA0B,SAAUg8F,IAE3C36F,QAAQ0Q,IAAInO,GAAUY,MAAMK,IACjC,MAAMo3F,EAAS,IAAInzF,WAAW,IACxBozF,EAAQ,IAAIpzF,WAAW,IACvBqzF,EAAQ,IAAIrzF,WAAWjE,EAAQ,IAC/Bu3F,EAAQ,IAAItzF,WAAWjE,EAAQ,IAUrC,OARAo3F,EAAOt0F,IAAIw0F,EAAMtM,SAAS,EAAG,IAC7BoM,EAAOt0F,IAAIy0F,EAAMvM,SAAS,EAAG,IAAK,GAClCoM,EAAOt0F,IAAIw0F,EAAMtM,SAAS,GAAI,IAAK,IAEnCqM,EAAMv0F,IAAIy0F,EAAMvM,SAAS,EAAG,IAC5BqM,EAAMv0F,IAAIw0F,EAAMtM,SAAS,EAAG,IAAK,GACjCqM,EAAMv0F,IAAIy0F,EAAMvM,SAAS,GAAI,IAAK,IAE3B,CAACoM,EAAQC,EAAM,GAE1B,CAEOrP,YACL,OAAOntF,KAAK22C,iBAAiBgmD,YAAc38F,KAAK6sF,eAClD,CAEQ+P,0BACN,GAAG58F,KAAKmtF,YACN,OAAO,EAGT,GAAGntF,KAAK+2F,YAAYt6F,OAAQ,CAC1B,MAAMogG,EAAY78F,KAAK+2F,YAAYtvF,QAGnCzH,KAAKi6F,eAAe,CAClBt9F,EAAG,WACHmgG,QAASD,GACR,CACDrG,mBAAmB,EACnBD,YAAY,G,CAIhB,MAAMwG,EAAyB/8F,KAAKg3F,iBAAiBv6F,OACrD,GAAGsgG,EAAwB,CACzB,MAAMrhG,EAAO,iBAAyB46F,IAChC11B,EAAS5gE,KAAKg3F,iBAAiBltF,OAAO,EAAGizF,GAC/C/8F,KAAKi6F,eAAe,CAClBt9F,EAAG,iBACHmgG,QAASl8B,GACRllE,GAEHsE,KAAKG,IAAI,6BAA8BzE,EAAQqS,UAAW6yD,E,CA0B5D,IAAIo8B,EACJ,MAAMz0E,EAAgC,GAGtC,IAAI00E,EAAkB,EAGlBC,GAAa,EACbC,GAAc,EAGdC,GAAiB,EAGrB,MAAMnqF,EAAsBhZ,OAAOgZ,KAAKjT,KAAK82F,iBC/gCpC3yF,KAAKk4C,GACP,KAAOA,KACbx7B,MAAK,CAACC,EAAGC,IACHD,EAAEu8E,QAAQt8E,KAChB5c,KAAKqtF,GACCA,EAAOxkF,SAAS,MD2gCvB,IAAI,MAAMe,KAAakF,EAAM,CAI3B,MAAMpR,EAAU7B,KAAK62F,aAAa9oF,GAClC,GAAGlM,GAAWA,EAAQ+G,KAAM,CAK1B,MAAM00F,EAAoBz7F,EAAQ+G,KAAKnM,OAAS,GAEhD,GAAIwgG,EAAkBK,EAAqB,SACzCt9F,KAAKG,IAAI2C,KAAK,iBAAkBjB,EAAS0mB,GACzC60E,GAAiB,EAEdJ,GACD,MAIJz0E,EAASjoB,KAAKuB,GACdo7F,GAAmBK,EAGhBz7F,EAAQy4F,MACT4C,GAAa,EACLr7F,EAAQm5F,WAChBmC,GAAc,GAIhBH,EAAan7F,C,QAKR7B,KAAK82F,gBAAgB/oF,E,CAM9B,GAAG/N,KAAKmR,qBAAqBjJ,GAExBg1F,IAAeC,EAAa,CAC7B,MAAMzE,EAAa,IAAIlJ,GAAgB,CAACC,SAAS,IACjDiJ,EAAWpG,YAAY,YAAa,CAClCsI,UAAW,IACXC,WAAY,IACZC,SAAU,MAGZvyE,EAASjoB,KAAK,CACZ69C,OAAQn+C,KAAK2jB,YAAYi1E,aACzBC,OAAQ74F,KAAK84F,gBACblwF,KAAM8vF,EAAWrI,UAAS,I,CAKhC,IAAI9nE,EAAS9rB,OAEX,OAIF,MAAM4+F,EAAgC9yE,EAASzrB,QAAQ+E,GAAYA,EAAQk5F,aAAY52F,KAAKtC,GAAYA,EAAQs8C,SAGhH,GAAG51B,EAAS9rB,OAAS,EAAG,CACtB,MAAMm9F,EAAY55F,KAAKu9F,yBAAyBN,EAAiB10E,GACjEy0E,EAAapD,EAAU4D,gBAEvBx9F,KAAK62F,aAAamG,EAAW7+C,QAAUy7C,EAAU/3F,O,MAEjD7B,KAAK62F,aAAamG,EAAW7+C,QAAU6+C,EAGzCh9F,KAAK+2F,YAAc,GAEnB,MAAMptF,EAAU3J,KAAK+4F,qBAAqBiE,GAIvCh9F,KAAKmR,qBAAqBjJ,GAE3BlI,KAAKo7F,+BAA+BzxF,EAASqzF,EAAY3B,GAKtDr7F,KAAKmR,qBAAqBjJ,GAE7BlI,KAAK0N,cAGJ0vF,GACDp9F,KAAKm7F,iBAET,CAEQoC,yBAAyBN,EAAyB10E,GACxD,MAAMqxE,EAAY,IAAIpK,GAAgB,CACpCC,SAAS,EACTC,eAAgBuN,EAAkB,KAGpCrD,EAAU7I,SAAS,WAAY,iBAC/B6I,EAAU7I,SAASxoE,EAAS9rB,OAAQ,oBAEpC,MAAMghG,EAA0B,GAChCl1E,EAASzpB,SAAQ,CAAC+C,EAAS8D,KACzB83F,EAAcn9F,KAAKuB,EAAQs8C,QAE3By7C,EAAUxI,UAAUvvF,EAAQs8C,OAAQ,aAAex4C,EAAI,aACvDi0F,EAAU7I,SAASlvF,EAAQg3F,OAAQ,aAAelzF,EAAI,aACtDi0F,EAAU7I,SAASlvF,EAAQ+G,KAAKnM,OAAQ,aAAekJ,EAAI,YAC3Di0F,EAAUvH,cAAcxwF,EAAQ+G,KAAM,aAAejD,EAAI,UAAU,IAGrE,MAAM9D,EAAqB,CACzBs8C,OAAQn+C,KAAK2jB,YAAYi1E,aACzBC,OAAQ74F,KAAK84F,eAAc,GAC3Bc,WAAW,EACXC,MAAO4D,GAOT,OAJG,WACDz9F,KAAKG,IAAI2C,KAAK,YAAa26F,EAAe57F,EAAQs8C,OAAQt8C,EAAQg3F,QAG7D,CACLh3F,UACA27F,gBAAiBvjG,OAAOC,OAAO,CAAC0O,KAAMgxF,EAAUvJ,UAAS,IAAQxuF,GAErE,CAEc67F,oBAAoB3B,G,0CAChC,MAAMK,QAAep8F,KAAK87F,UAAUC,GAAiB,GAC/C4B,QAAc39F,KAAKm8F,YAAYC,GAAQ,GAM7C,MAAO,CACLrvF,YAJ2B,iBAA0B,cAAegvF,EAAiB4B,EAAM,GAAIA,EAAM,IAKrGvB,SAEJ,G,CAEQwB,oBAAoBxB,EAAoByB,GAE9C,OAAO79F,KAAKm8F,YAAYC,GAAQ,GAAOt3F,MAAM64F,GAEpC,iBAA0B,cAAeE,EAAeF,EAAM,GAAIA,EAAM,KAEnF,CAEQG,mBAAmBj8F,GASzB,MAAMyI,EAAO,IAAIklF,GAAgB,CAC/BE,eAAgB7tF,EAAQ+G,KAAKnM,OAAS,OAGxC6N,EAAKgnF,cAActxF,KAAKisF,WAAY,GAAI,QACxC3hF,EAAKgnF,cAActxF,KAAKgO,UAAW,GAAI,cAEvC1D,EAAK8mF,UAAUvvF,EAAQs8C,OAAQ,cAC/B7zC,EAAKymF,SAASlvF,EAAQg3F,OAAQ,UAE9BvuF,EAAKymF,SAASlvF,EAAQ+G,KAAKnM,OAAQ,uBACnC6N,EAAK+nF,cAAcxwF,EAAQ+G,KAAM,gBAmBjC,MAAMm1F,EAAazzF,EAAK8lF,YAMlB4N,EAAiB,GAAM1zF,EAAKkmF,YAAc,GAAO,IAAM,GAAI,QAAe,GAAK,GAC/EsF,EAA4CjrF,EAAU,IAAIzB,WAAW40F,IASrEjC,GAAkB,EAAAhG,GAAA,GAAcgI,EAAYjI,GAalD,OAAO91F,KAAK09F,oBAAoB3B,GAAiBj3F,MAAMm5F,IAKrD,MAAMz8F,EAAU,IAAIguF,GAAgB,CAClCE,eAAgBuO,EAAgBlxF,MAAMtQ,OAAS,MAejD,OAbA+E,EAAQ8vF,cAActxF,KAAKgsF,UAAW,GAAI,eAC1CxqF,EAAQ8vF,cAAc2M,EAAgB7B,OAAQ,IAAK,WACnD56F,EAAQ6wF,cAAc4L,EAAgBlxF,MAAO,kBAEzBvL,EAAQ6uF,UAAS,EASnB,GAEtB,CAEc0I,qBAAqBl3F,G,0CACjC,MAAMq8F,QAAoBl+F,KAAK89F,mBAAmBj8F,GAE9C7B,KAAKmR,WACPnR,KAAKG,IAAIvC,MAAM,wCAAyCoC,KAAKmR,UAAWnR,MAG1EA,KAAKsI,OAAStI,KAAKG,IAAImI,MAAM,WAAYzG,EAAS,CAACA,EAAQs8C,QAAQn6C,OAAOnC,EAAQg4F,OAAS,IAAKqE,EAAYzhG,QAC5G,MAAMkN,EAA+B3J,KAAKmR,UAAYnR,KAAKmR,UAAU1H,KAAKy0F,GAAsBv8F,QAAQC,OAAO,CAAC,GAQhH,KAAK5B,KAAKmR,qBAAqBjJ,GAAO,OAAOyB,EAG7C,MAAMw0F,EAAsB,CAC1B7oF,KAAM,IACNvX,KAAM,uBAENoT,UAAWnR,KAAKmR,WAGlB,OAAOxH,EAAQ7E,MAAM1C,IACnB,KAAIA,aAAM,EAANA,EAAQmI,YACV,MAAM4zF,EAIR,OAAO/7F,CAAM,IACXxE,IAQF,MAPIA,EAAMiE,SAAYjE,EAAMG,OAC1BH,EAAQ3D,OAAOC,OAAOikG,EAAW,CAC/BpgG,KAAM,sBACNgwF,cAAenwF,KAIbA,CAAK,GAGf,G,CAEOiQ,cAAcuwF,GAMnBp+F,KAAKm3F,iBAAmB5oF,KAAK1J,MAE7B,MAAMw5F,EAAe,IAAIhL,GAAkB+K,GAErCpS,EAAYqS,EAAa9J,cAAc,IAAI,EAAM,eACvD,KAAI,EAAA+J,GAAA,GAAStS,EAAWhsF,KAAKgsF,WAC3B,MAAM,IAAIhhF,MAAM,oCAAsC8B,EAAWk/E,IAGnE,MAAMoQ,EAASiC,EAAa9J,cAAc,KAAK,EAAM,WAC/CsJ,EAAgBQ,EAAa7J,cAAc4J,EAAe7zF,WAAa8zF,EAAa7N,aAAa,EAAM,kBAE7G,OAAOxwF,KAAK49F,oBAAoBxB,EAAQyB,GAAe/4F,MAAMi3F,GAEpD/7F,KAAK87F,UAAUC,GAAiB,GAAOj3F,MAAMy5F,IAClD,KAAI,EAAAD,GAAA,GAASlC,EAAQmC,GAGnB,MAFAv+F,KAAKG,IAAI2C,KAAK,gBAAiBs5F,EAAQmC,GACvCv+F,KAAKs5F,gBACC,IAAItuF,MAAM,iDAIlB,IAAIqzF,EAAe,IAAIhL,GAA0B0I,EAAiB,CAACtM,SAAS,IAEzD4O,EAAa9J,cAAc,IAAI,EAAM,QACxD,MAAMvmF,EAAYqwF,EAAa9J,cAAc,IAAI,EAAM,cACjDxmF,EAAYswF,EAAa3K,UAAU,cAEzC,MAAI,EAAA4K,GAAA,GAAStwF,EAAWhO,KAAKgO,YACzBhO,KAAKw5F,gBAAkB,EAAA8E,GAAA,GAAStwF,EAAWhO,KAAKw5F,gBAIlD,MAHAx5F,KAAKG,IAAI2C,KAAK,WAAYkL,EAAWhO,KAAKgO,UAAWhO,KAAKw5F,cAAeuC,GAGnE,IAAI/wF,MAAM,mCAAqC8B,EAAWkB,IAGlE,MAAMurF,EAAQ8E,EAAa9K,SAAS,UAE9BiL,EAAczC,EAAgBxxF,WAE9Bk0F,EAAoBJ,EAAa9K,SAAS,wBAChD,IAAIjnE,EAAS+xE,EAAa7N,YAE1B,GAAIiO,EAAoB,GACtBA,EAAoBD,EAAclyE,EAClC,MAAM,IAAIthB,MAAM,6BAA+ByzF,GAEjD,MAAMC,EAAcL,EAAa7J,cAAciK,GAAmB,EAAM,gBAExEnyE,EAAS+xE,EAAa7N,YACtB,MAAMwN,EAAgBQ,EAAclyE,EACpC,GAAG0xE,EAAgB,IAAMA,EAAgB,KACvC,MAAM,IAAIhzF,MAAM,gCAAkCgzF,GAsDpD,OAlDAK,EAAe,IAAIhL,GAAsCqL,EAAa,CACpEjP,SAAS,EACTt7D,SAAU,CACRwqE,WAAY,CAACv8F,EAAa0uF,KACxB1uF,EAAO+7C,OAASkgD,EAAa3K,UAAU5C,EAAQ,YAC/C1uF,EAAOw8F,MAAQP,EAAa9K,SAASzC,EAAQ,WAC7C1uF,EAAO2K,MAAQsxF,EAAa9K,SAASzC,EAAQ,WAE7C,MAAMxkE,EAAS+xE,EAAa7N,YAI5B,IACEpuF,EAAOwG,KAAOy1F,EAAapK,YAAY,SAAUnD,EAAQ,S,CACzD,MAAMvuF,GACNvC,KAAKG,IAAIvC,MAAM,cAAgB2E,EAAYV,QAAUU,EAAY+pF,OACjElqF,EAAOwG,KAAO,CACZjM,EAAG,cACHiB,MAAO2E,E,CAIR87F,EAAa7N,cAAgBlkE,EAASlqB,EAAO2K,OAG9CsxF,EAAa7I,UAAUlpE,EAASlqB,EAAO2K,M,EAI3C8xF,cAAe,CAACz8F,EAAa0uF,KAC3B1uF,EAAO08F,WAAaT,EAAa3K,UAAU5C,EAAQ,gBAEnD,MAAM6I,EAAc35F,KAAK62F,aAAaz0F,EAAO08F,YACvC/gG,EAAO47F,GAAeA,EAAYU,YAAc,SAEnDj4F,EAAO08F,aAAenF,IAMzBv3F,EAAOA,OAASi8F,EAAapK,YAAYl2F,EAAM+yF,EAAQ,YAAW,KASjE,CACL/nF,SAHes1F,EAAapK,YAAY,GAAI,SAI5ClmF,YACAC,YACAurF,QACD,KAGP,CAEQwF,gBAAgBC,GACtB,MAAM/S,GEr7C0BoF,EFq7CD2N,EEn7CnBvJ,INCcjE,EMFM,KAAOH,GNGlC,IAAIjoF,WAAWooF,EAAOyN,QAAQ,KAAK56F,QMHO0H,UACX,GAAG,GAAM,GAAO,IAFzC,IAAqBslF,ENGNG,EIo7C1BlH,GAAA,MAAmB,CACjB,CAAC,KAAOtqF,KAAKmI,KAAO,gBAAiB2E,EAAWm/E,KAGlDjsF,KAAKisF,WAAa,IAAI7iF,WAAW6iF,EACnC,CAGOkP,gBAAgBF,GAOlBj7F,KAAKmR,qBAAqBjJ,IAExBlI,KAAKw/E,SACNx/E,KAAKw4F,gBAAgB,mBAGvByC,IAAAA,EAAU,IAMZ,MAAMhE,EAAU1oF,KAAK1J,OAASo2F,GAAS,GACvC,GAAGj7F,KAAKi3F,eAAsBj8F,IAAVigG,GAAuBj7F,KAAKi3F,SAAWA,GAEzD,OAUCj3F,KAAKu6F,gBACNv1F,aAAahF,KAAKu6F,gBAGpB,MAAMxjE,EAAK,KAGT/2B,KAAKu6F,eAAiB,EACtBv6F,KAAKi3F,QAAU,EAIZj3F,KAAKmR,qBAAqBjJ,GAExBlI,KAAKw/E,SAMVx/E,KAAK48F,yBAAyB,EAGhC58F,KAAKi3F,QAAUA,OAEFj8F,IAAVigG,EACDj7F,KAAKu6F,eAAiB3rF,EAAA,aAAemoB,EAAIkkE,GAEzClkE,GAEJ,CAEQmoE,WAAWxkC,GAIjB,IAAIugC,EAFJj7F,KAAK+2F,YAAYz2F,KAAKo6D,GAMnB16D,KAAKmR,qBAAqBjJ,IAE3B+yF,EAAQ,KAGVj7F,KAAKm7F,gBAAgBF,EACvB,CAEQkE,UAAUzkC,GACb16D,KAAKsI,OACNtI,KAAKG,IAAImI,MAAM,aAAcoyD,GAI/B16D,KAAKg3F,iBAAiB12F,KAAKo6D,GAC3B16D,KAAKm7F,gBAAgB,IACvB,CAEOztF,cACL,IAAI0xF,GAAW,EACf,MAAMvI,EAAe72F,KAAK62F,aAwB1B,OAtBA58F,OAAOgZ,KAAK4jF,GAAc/3F,SAAS47D,IACjC,MAAM74D,EAAUg1F,EAAan8B,GAG7B,GAAG74D,EAAQ20F,wBAAqDx7F,IAAhCgF,KAAK82F,gBAAgBp8B,UAE5Cm8B,EAAan8B,QACf,GAAG74D,EAAQ+3F,UAAW,CAC3B,IAAI,MAAMgC,KAAc/5F,EAAQg4F,MAC9B,QAAgC7+F,IAA7B67F,EAAa+E,GAGd,YADAwD,GAAW,UAKRvI,EAAan8B,E,MAEpB0kC,GAAW,C,KAIPA,CACV,CAEQC,kBAAkBtxF,GACxB,MAAM4rF,EAAc35F,KAAK62F,aAAa9oF,GACnC4rF,IAAgBA,EAAYkC,QAE7BlC,EAAYkC,OAAQ,EAExB,CAEQ3sB,aAAaye,GACnB,MAAM9/C,GAAW8/C,EAAS2R,eAAiB,IAAIxkG,MAAM,6BAA+B,GAGpF,OAFA6yF,EAAS4R,WAAa5R,EAAS4R,WAExB,CACLjqF,MAAOq4E,EAAS4R,YAAc5R,EAAS4R,YAAc,EAAI,IAAM5R,EAAS4R,WACxExhG,KAAM8vC,EAAQ,IAAa,UAC3B8R,YAAa9R,EAAQ,IAAO,QAAU8/C,EAAS4R,WAAa,IAAM5R,EAAS2R,cAC3EvR,cAAeJ,EAEnB,CAMOhgF,SACL,MAAMkpF,EAAe72F,KAAK62F,aAC1B,IAAI,MAAMj6F,KAAMi6F,EAAc,CAC5B,MAAM2I,EAAM3I,EAAaj6F,IACtB4iG,EAAI52F,MAAQ42F,EAAI5F,YACjB55F,KAAKu7F,WAAW3+F,E,CAIhBoD,KAAKmR,UAA4B3D,aACnCxN,KAAKy6F,2BACLz6F,KAAKq3F,0BAET,CAqBQoI,gBAAgB1xF,GACtB,MAAM2xF,EAAa,KAAO3xF,GAAW4xF,WAAW,IAAI9N,aAEpD,OADA7xF,KAAKG,IAAI,uBAAwBu/F,GAC1B1/F,KAAK2jB,YAAY87E,gBAAgBC,EAC1C,CAGO5xF,eAAejM,EAAckM,EAAmBC,GACrD,GAAiB,iBAAdnM,EAAQlF,EAQX,GADiBwxC,SAASpgC,EAAUpO,OAAO,GAAI,IAAK,IACtC,EACZK,KAAKG,IAAI2C,KAAK,2BAA4BiL,EAAWlM,QAkBvD,OAdG7B,KAAKsI,OACNtI,KAAKG,IAAImI,MAAM,kBAAmBzG,EAASkM,GAG1C/N,KAAKs3F,6BACNt3F,KAAKs3F,4BAA4Br1F,QAAQ,eASpCJ,EAAQlF,GACb,IAAK,gBACH,IAAI,MAAMijG,KAAgB/9F,EAAQ0mB,SAChCvoB,KAAK8N,eAAe8xF,EAAcA,EAAazhD,OAAQnwC,GAGzD,MAGF,IAAK,kBACHhO,KAAKG,IAAI,kBAAmB0B,GAE5B7B,KAAK++F,gBAAgBl9F,EAAQg+F,iBAE1B7/F,KAAK62F,aAAah1F,EAAQi+F,aAC3B9/F,KAAKu7F,WAAW15F,EAAQi+F,YAG1B9/F,KAAKk/F,WAAWnxF,GAWhB,MAGF,IAAK,uBAGH,OAFA/N,KAAKG,IAAIvC,MAAM,uBAAwBiE,GAEhCA,EAAQ09F,YACb,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GAAI,CAKP,MAAMQ,EAAoB//F,KAAKy/F,gBAAgB1xF,IACrB,KAAvBlM,EAAQ09F,YAAqBQ,KAC9B//F,KAAKG,IAAI,kBACTH,KAAKs5F,iBAGP,MAAM0G,EAAahgG,KAAKy5F,kBAAkB53F,EAAQi+F,YAC/CE,GAAYhgG,KAAKu7F,WAAWyE,EAAW7hD,O,EAkB9C,MAGF,IAAK,UACH,IAAmD,IAAhDn+C,KAAK42F,mBAAmBn8F,QAAQsT,GAGjC,YADA/N,KAAKk/F,WAAWnxF,GAIlB/N,KAAK42F,mBAAmBt2F,KAAKyN,GAC1B/N,KAAK42F,mBAAmBn6F,OAAS,KAClCuD,KAAK42F,mBAAmB1oF,QAG1BlO,KAAK8N,eAAejM,EAAQ+G,KAAM/G,EAAQs8C,OAAQnwC,GAClD,MAGF,IAAK,sBACHhO,KAAKk/F,WAAWnxF,GAEb/N,KAAKsI,OACNtI,KAAKG,IAAImI,MAAM,sBAAuBzG,GAIxC7B,KAAKq/F,kBAAkBx9F,EAAQo+F,cAC/BjgG,KAAK++F,gBAAgBl9F,EAAQq+F,aAE7B5V,GAAA,MAAmB,MAAMxlF,MAAMwkF,IAC1BA,IAAatpF,KAAKmI,OAASnI,KAAK6sF,iBAAmB7sF,KAAK22C,iBAAiBq2C,kBAC1EhtF,KAAK22C,iBAAiBq2C,iBAAiBnrF,E,IAG3C,MAGF,IAAK,WACH7B,KAAKsI,OAAStI,KAAKG,IAAI,WAAY0B,EAAQi7F,SAC3C,IAAI,MAAMpiC,KAAS74D,EAAQi7F,QACzB98F,KAAKq/F,kBAAkB3kC,GAGzB,MAGF,IAAK,oBAEH,IADoB16D,KAAK62F,aAAah1F,EAAQs8C,QAC7B,CACfn+C,KAAKk/F,WAAWr9F,EAAQs+F,eACxB,K,CAQJ,IAAK,wBACH,IAAwD,IAArDngG,KAAK+2F,YAAYt8F,QAAQoH,EAAQs+F,eAClC,MAGFngG,KAAKm/F,UAAUt9F,EAAQs+F,eACvB,MAGF,IAAK,kBAAmB,CACtBngG,KAAKk/F,WAAWr9F,EAAQs+F,eACxB,MAAMr1F,EAAM,CACV,CAAC9K,KAAKogG,cAAepgG,KAAKg3F,mBAI5B,IAAI,MAAOqJ,EAAYC,KAAkBx1F,EACvC,IAAGu1F,aAAU,EAAVA,EAAYE,YAAa1+F,EAAQi9F,YAAcwB,EAAc7jG,OAC9D,IAAI,MAAM+jG,KAAYH,EAAWz/B,OAAQ,CACvC,MAAM6/B,EAAMH,EAAc7lG,QAAQ+lG,IACtB,IAATC,GACDH,EAAcx2F,OAAO22F,EAAK,E,CAMlC,K,CAGF,IAAK,aAAc,CACjBzgG,KAAKk/F,WAAWnxF,GAEhB,MAAM2rF,EAAgB73F,EAAQi9F,WACxBnF,EAAc35F,KAAK62F,aAAa6C,GAOtC,GALG15F,KAAKsI,OACNtI,KAAKG,IAAI,eAAgB0B,EAAQO,OAAQu3F,GAG3C35F,KAAKq/F,kBAAkB3F,GACpBC,EAAa,CACd,MAAMngG,EAAWmgG,EAAYngG,SAC7B,GAAwB,cAArBqI,EAAQO,OAAOzF,EAAmB,CACnC,MAAMiB,EAAQoC,KAAKkvE,aAAartE,EAAQO,QACxCpC,KAAKG,IAAI,YAAavC,GACnBpE,GACDA,EAASoI,OAAOhE,E,MAGfpE,GACDA,EAASyI,QAAQJ,EAAQO,QAGxBu3F,EAAYW,QAAUt6F,KAAKk6F,mBAC5Bl6F,KAAKk6F,kBAAmB,UAIrBl6F,KAAK62F,aAAa6C,E,MAEtB15F,KAAKsI,OACNtI,KAAKG,IAAI,kCAAmCu5F,EAAe73F,GAI/D,K,CAGF,IAAK,OAAQ,CAQX,MAAM+1F,EAAS/1F,EAAQk2F,QACvB,GAAG/3F,KAAK63F,4BAA8BD,EAAQ,CAC5C,MAAMp+F,EAAWwG,KAAKs3F,4BACnB99F,EACDA,EAASyI,QAAQ,QAEjBjC,KAAKG,IAAI,wBAAyBy3F,E,CAItC,K,CAGF,QACE53F,KAAKk/F,WAAWnxF,GAM8B,OAA3C/N,KAAK22C,iBAAiBq2C,kBACvBhtF,KAAK22C,iBAAiBq2C,iBAAiBnrF,QA7P3C7B,KAAKG,IAAI2C,KAAK,+BAAgCjB,EAASkM,EAiQ3D,EG52DK,MAAM2yF,WAAyBhuF,EAAtC,c,oBACU,KAAA64E,WAA6B,GAC9B,KAAAlzD,SAAWj+B,UAAUi+B,UAAY,iBACjC,KAAA20D,iBAAuC,KAEvC,KAAA2P,WAAY,CAoErB,CAlEShB,yBAAyBj1F,GAC9B1G,KAAKmd,UAAUxW,cAAc,2BAA4BD,EAE3D,CAEOkmF,gBAAgBljF,IACrB,EAAA2H,EAAA,GAAiBrR,KAAKurF,WAAY7hF,EACpC,CAEO8tB,oBAAoB9yB,GACzB1E,KAAKgtF,iBAAmBtoF,CAC1B,CAEOkmF,aAAaziF,EAAc2jF,EAAqBE,EAAuBC,EAAwBvwF,GAEpG,MAAMgO,EAAY,IAAIitF,GAAa32F,KAAMA,KAAK2jB,YAAaxb,EAAM2jF,EAASE,EAAWC,EAAYvwF,GAEjG,OADAsE,KAAKurF,WAAWjrF,KAAKoJ,GACdA,CACT,CAEOi3F,WACL,GAAG3gG,KAAK28F,UAAW,CACjB,MAAMiE,EAAoB5gG,KAAKurF,WAAWzuF,QAAQ4M,GAAcA,EAAUyjF,cAE1EntF,KAAK28F,WAAY,EACjB38F,KAAKgtF,kBAAoBhtF,KAAKgtF,iBAAiB,CAACrwF,EAAG,wBAEnD,IAAI,MAAM+M,KAAak3F,EACrBl3F,EAAUyxF,iB,CAGhB,CAEO0F,UACL7gG,KAAK28F,WAAY,CACnB,CAEOmE,YAAYzpE,GACjBr3B,KAAKq4B,SAAWhB,EAChB,IAAI,MAAM3tB,KAAa1J,KAAKurF,WACtB7hF,EAAUmjF,kBACZnjF,EAAUwwF,kBAAmB,EAGnC,CAEOxM,wBACL,IAAI,MAAMhkF,KAAa1J,KAAKurF,WAC1B7hF,EAAUwwF,kBAAmB,CAEjC,CAEOQ,wBACL,IAAI,MAAMhxF,KAAa1J,KAAKurF,WAC1B7hF,EAAUgxF,uBAEd,CAEO3rF,iBACL,IAAI,MAAMrF,KAAa1J,KAAKurF,WAC1B,IAAI7hF,EAAUmjF,gBAAiB,CAC7BnjF,EAAUqF,iBACV,K,CAGN,ECoDF,aAvHO,MA8DLjP,cAjBQ,KAAAihG,kBAAuC,CAAC,CAC9CC,QAAS,mgBACTC,SAAU,WAGJ,KAAAC,cAAmC,CAAC,CAE1CF,QAAS,mgBACTC,SAAU,WAGJ,KAAAE,iBAEJ,CAAC,EACG,KAAAzb,UAAW,EACX,KAAA0b,eAAgC,KAGnC,WACDphG,KAAKkhG,cAAgBlhG,KAAK+gG,kBAE9B,CAEOM,UACL,OAAGrhG,KAAKohG,eAAuBphG,KAAKohG,eAC5BphG,KAAK0lF,SACJ/jF,QAAQM,UAGVjC,KAAKohG,eAAiBz/F,QAAQ0Q,IAAIrS,KAAKkhG,cAAc/8F,KAAKm9F,IAC/D,MAAMC,EAAe,IAAI/R,GACzB+R,EAAapP,YAAW,EAAApG,GAAA,GAAauV,EAAUN,SAAU,KACzDO,EAAapP,YAAW,EAAApG,GAAA,GAAauV,EAAUL,UAAW,KAE1D,MAAMh4F,EAASs4F,EAAanR,YAE5B,OAAO,iBAA0B,OAAQnnF,GAAQnE,MAAMiI,IACrD,MAAMy0F,EAAmBz0F,EAAMtF,OAAO,GACtC+5F,EAAiBz1F,UAEjB/L,KAAKmhG,iBAAiBr0F,EAAW00F,GAAkBhnG,eAAiB,CAClEwmG,QAASM,EAAUN,QACnBC,SAAUK,EAAUL,SACrB,GACD,KACAn8F,MAAK,KACP9E,KAAK0lF,UAAW,EAGhB1lF,KAAKohG,eAAiB,IAAI,GAE9B,CAEa/4D,OAAOo5D,G,2CACZzhG,KAAKqhG,UAEX,IAAI,IAAI17F,EAAI,EAAGA,EAAI87F,EAAahlG,SAAUkJ,EAAG,CAC3C,IAAI+7F,EAAiB,KAAOD,EAAa97F,IAAIqH,SAAS,IAAIxS,cAEvDknG,EAAejlG,OAAS,KACzBilG,EAAiB,IAAI5gG,MAAM,GAAK4gG,EAAejlG,QAAQklG,KAAK,KAAK3kG,KAAK,IAAM0kG,GAI9E,MAAME,EAAW5hG,KAAKmhG,iBAAiBO,GACvC,GAAGE,EACD,OAAO3nG,OAAOC,OAAO,CACnB2nG,YAAaJ,EAAa97F,IACzBi8F,E,CAGT,E,iSC3Ia,SAASE,GAASC,EAAoBC,GACnD,MAAMr1F,EAAMo1F,EAAOtlG,OACbsQ,EAAQ,IAAI3D,WAAWuD,GAE7B,IAAI,IAAIhH,EAAI,EAAGA,EAAIgH,IAAOhH,EACxBoH,EAAMpH,GAAKo8F,EAAOp8F,GAAKq8F,EAAOr8F,GAGhC,OAAOoH,CACT,C,2SCkGO,MAAMk1F,WAAmBvvF,EAapBwK,QACRld,KAAK+rB,OAAS,CAAC,EACf/rB,KAAKG,KAAM,EAAAsI,EAAA,IAAO,aAAc,WAAiB,KAAAD,IACnD,CAEQ05F,iBAAiB/5F,EAAYg6F,GACnC,MAAMC,EAAgBD,EAAa53F,WAE7BqC,EAAS,IAAI4iF,GACnB5iF,EAAOqkF,WAAW,EAAG,EAAG,eACxBrkF,EAAOwkF,UAAUpxF,KAAK2jB,YAAYi1E,aAAc,UAChDhsF,EAAOmkF,SAASqR,EAAe,kBAE/B,MAAMC,EAAcz1F,EAAOyjF,UAAS,GAC9BE,EAAc,IAAInnF,WAAWi5F,EAAY93F,WAAa63F,GAC5D7R,EAAYtoF,IAAIo6F,GAChB9R,EAAYtoF,IAAIk6F,EAAcE,EAAY5lG,QAE1C,MAAM0U,EAAYnR,KAAK2R,eAAejB,aAAavI,EAAM,SAAUnI,KAAK2Q,eAClEwtF,EAAY,CAChB7oF,KAAM,IACNvX,KAAM,wBAQR,OALG,MACDiC,KAAKG,IAAI,gDAGKgR,EAAU1H,KAAK8mF,GAChBzrF,MAAM1C,IAKnB,GAJG,MACDpC,KAAKG,IAAI,sCAAuCiC,IAG9CA,IAAWA,EAAOmI,WACpB,MAAM4zF,EAGR,IAIE,MAAME,EAAe,IAAIhL,GAA0BjxF,EAAQ,CAACqtF,SAAS,IAErE,GAAqB,IAAlBrtF,EAAO3F,OAAc,CACtB,MAAM6lG,EAAYjE,EAAa9K,WAE/B,MADAvzF,KAAKG,IAAIvC,MAAM,mDAAoD0kG,GAC7DA,C,CAGR,MAAMC,EAAclE,EAAa3K,UAAU,eACxB,MAAhB6O,GAAqBviG,KAAKG,IAAIvC,MAAM,oBAAqB2kG,GAE5D,MAAMpkD,EAASkgD,EAAa3K,UAAU,UACxB,MAAXv1C,GAAgBn+C,KAAKG,IAAIvC,MAAM,eAAgBugD,GAElD,MAAMqkD,EAAUnE,EAAa9K,SAAS,WAGtC,OAFIiP,GAASxiG,KAAKG,IAAIvC,MAAM,aAAc4kG,GAEnCnE,C,CACP,MAAM97F,GAGN,MAFAvC,KAAKG,IAAIvC,MAAM,gDAAiD2E,GAClDtI,OAAOC,OAAOikG,EAAW,CAACpQ,cAAexrF,G,KAGvD3E,IAOF,MANIA,EAAMiE,SAAYjE,EAAMG,OAC1BH,EAAQ3D,OAAOC,OAAOikG,EAAW,CAC/BpQ,cAAenwF,KAIbA,CAAK,GAEf,CAEc6kG,UAAUvtF,G,0CACtB,MAAM1T,EAAU,IAAIguF,GAAgB,CAACC,SAAS,IAQ9C,IAAI4O,EANJ78F,EAAQ8wF,YAAY,eAAgB,CAACoQ,MAAOxtF,EAAKwtF,QAE9C,MACD1iG,KAAKG,IAAI,cAAe2M,EAAWoI,EAAKwtF,QAI1C,IACE,MAAM/4F,EAAU3J,KAAKkiG,iBAAiBhtF,EAAK/M,KAAM3G,EAAQ6uF,UAAS,IAClEsS,GAAetB,UACfhD,QAAqB10F,C,CACrB,MAAM/L,GAEN,MADAoC,KAAKG,IAAIvC,MAAM,eAAiBA,EAAgBiE,SAC1CjE,C,CAGR,MAAMmL,EAAkBs1F,EAAapK,YAAY,SAEjD,GAAkB,UAAflrF,EAASpM,EACV,MAAM,IAAIqO,MAAM,gCAAkCjC,EAASpM,GAG7D,KAAI,EAAA2hG,GAAA,GAASppF,EAAKwtF,MAAO35F,EAAS25F,OAEhC,MADA1iG,KAAKG,IAAIvC,MAAMsX,EAAKwtF,MAAO35F,EAAS25F,OAC9B,IAAI13F,MAAM,6BAGlBkK,EAAK0tF,YAAc75F,EAAS85F,aAC5B3tF,EAAK4tF,GAAK/5F,EAAS+5F,GACnB5tF,EAAKusF,aAAe14F,EAASg6F,+BAE1B,MACD/iG,KAAKG,IAAI,YAAa2M,EAAWoI,EAAK0tF,aAAc91F,EAAWoI,EAAK4tF,IAAK5tF,EAAKusF,cAGhF,MAAMuB,QAAkBL,GAAet6D,OAAOnzB,EAAKusF,cACnD,IAAIuB,EACF,MAAM,IAAIh4F,MAAM,4BAGlBkK,EAAK8tF,UAAYA,EAEd,MACDhjG,KAAKG,IAAI,yBAA0B+U,EAAK4tF,IAI1C,IACE,IAAIG,QAAc,iBAA0B,YAAa/tF,EAAK4tF,G,CAC9D,MAAMllG,GAEN,MADAoC,KAAKG,IAAIvC,MAAM,yBAA0BA,GACnCA,C,CAUR,OAPAsX,EAAK8kB,EAAIipE,EAAM,GACf/tF,EAAKm4B,EAAI41D,EAAM,GAEZ,MACDjjG,KAAKG,IAAI,wBAAyB8iG,GAG7BjjG,KAAKkjG,gBAAgBhuF,EAC9B,G,CAEcguF,gBAAgBhuF,G,0CAC5BA,EAAKiuF,SAAWt4F,EAAU,IAAIzB,WAAW,KAEzC,MAAMg6F,EAAoC,CACxCzmG,EAAG,oBACHmmG,GAAI5tF,EAAK4tF,GACT9oE,EAAG9kB,EAAK8kB,EACRqT,EAAGn4B,EAAKm4B,EACRq1D,MAAOxtF,EAAKwtF,MACZG,aAAc3tF,EAAK0tF,YACnBS,UAAWnuF,EAAKiuF,SAChBrY,GAAI,GAGAwY,EAA2B,IAAI9T,GAAgB,CAACC,SAAS,IAC/D6T,EAAyBvQ,YAAYqQ,EAAmB,iBAAkB,kBAE1E,MAAM94F,EAAOg5F,EAAyBjT,UAAS,GAC/C,GAAG/lF,EAAK7N,OAAS,IACf,KAAM,0CAGR,MAAMs/F,EAAkBtG,GAAWnrF,EAAM,KAAK,GAAO,GAAM,GACrDi5F,EAAkBxH,EAAgBt0F,QAAQsE,UAuB1Cy3F,OArBqB,KAAW,mCACpC,OAAQ,CACN,MAAMC,EAAU54F,EAAU,IAAIzB,WAAW,KACnCs6F,EAAeH,EAAgBv/F,aAAa,iBAA0B,SAAUy/F,EAAQz/F,OAAO+3F,KACrG,GAA2B,MAAxB2H,EAAajnG,OACd,KAAM,yCAGR,MAAMknG,QAAqB,iBAA0B,cAAeD,EAAcD,EAAS,IAAIr6F,WAAW,CAAC,KAErGo6F,EADa1B,GAAS2B,QAAe,iBAA0B,SAAUE,IAC5C3/F,OAAO2/F,GAEpCC,EAAwB5U,GAAgBwU,GACxCK,EAAyB,KAAO3uF,EAAK8tF,UAAUhC,QAAS,IAE9D,IAA8D,IAA3D4C,EAAsBvG,QAAQwG,GAC/B,OAAOL,C,CAGb,IAE8BM,GACxBjG,EAAgBpI,SAAiB,iBAA0B,cAAe+N,EAAiBtuF,EAAK8tF,WAAY,KAAK,GAAM,GAAM,GAE7He,EAA+B,CACnCrB,MAAOxtF,EAAKwtF,MACZG,aAAc3tF,EAAK0tF,YACnB5oE,EAAG9kB,EAAK8kB,EACRqT,EAAGn4B,EAAKm4B,EACR22D,uBAAwB9uF,EAAK8tF,UAAUnB,YACvCoC,eAAgBpG,GAGZr8F,EAAU,IAAIguF,GAAgB,CAACC,SAAS,IAC9CjuF,EAAQ8wF,YAAY,gBAAiByR,GAErC,MAAMG,EAAe1iG,EAAQ6uF,UAAS,GAMtC,IAAIgO,EAJD,MACDr+F,KAAKG,IAAI,qBAAsB4jG,GAIjC,IACE1F,QAAqBr+F,KAAKkiG,iBAAiBhtF,EAAK/M,KAAM+7F,E,CACtD,MAAMtmG,GAEN,MADAoC,KAAKG,IAAIvC,MAAM,2BAA4BA,GACrCA,C,CAGR,MAAMmL,EAAWs1F,EAAapK,YAAY,mBAAoB,YAM9D,GAJG,MACDj0F,KAAKG,IAAI,gCAAiC4I,GAG1B,0BAAfA,EAASpM,GAAgD,wBAAfoM,EAASpM,EACpD,MAAM,IAAIqO,MAAM,2CAA6CjC,EAASpM,GAGxE,KAAI,EAAA2hG,GAAA,GAASppF,EAAKwtF,MAAO35F,EAAS25F,OAChC,MAAM,IAAI13F,MAAM,wCAGlB,KAAI,EAAAszF,GAAA,GAASppF,EAAK0tF,YAAa75F,EAAS85F,cACtC,MAAM,IAAI73F,MAAM,+CAGlB,GAAkB,0BAAfjC,EAASpM,EAA+B,CACzC,MAAMwnG,SAAsB,iBAA0B,OAAQjvF,EAAKiuF,WAAW17F,OAAO,IACrF,KAAI,EAAA62F,GAAA,GAAS6F,EAAcp7F,EAASq7F,gBAClC,MAAM,IAAIp5F,MAAM,sDAGlB,MAAM,IAAIA,MAAM,6B,CAIlB,UACQhL,KAAKqkG,0BAA0BnvF,EAAMnM,EAASu7F,iB,CACpD,MAAM/hG,GAEN,MADAvC,KAAKG,IAAIvC,MAAM,uCAAwC2E,GACjDA,C,CAKR,OAAOvC,KAAKukG,sBAAsBrvF,EACpC,G,CAEcmvF,0BAA0BnvF,EAAmBsvF,G,0CACzDtvF,EAAKuvF,UAAYl2F,KAAK1J,MAGtBqQ,EAAKwvF,iBAAmB,iBAA0B,OAAQxvF,EAAKiuF,SAASn/F,OAAOkR,EAAK0tF,eACnF5+F,cAAc,iBAA0B,OAAQkR,EAAK0tF,YAAY5+F,OAAOkR,EAAKiuF,YAAY17F,MAAM,EAAG,KAEnGyN,EAAKyvF,gBAAkB,iBAA0B,OAAQzvF,EAAK0tF,YAAY5+F,OAAOkR,EAAKiuF,YAAY17F,MAAM,IACvGzD,aAAa,iBAA0B,OAAQkR,EAAKiuF,SAASn/F,OAAOkR,EAAKiuF,WAAYjuF,EAAKiuF,SAAS17F,MAAM,EAAG,IAE7G,MAAMm9F,EAAiB,IAAIx7F,iBAAiB,iBAA0B,cAAeo7F,EAAiBtvF,EAAKwvF,UAAWxvF,EAAKyvF,WAErHvjE,EAAOwjE,EAAen9F,MAAM,EAAG,IAC/Bo9F,EAAoBD,EAAen9F,MAAM,IAEzC42F,EAAe,IAAIhL,GAA0BwR,EAAmB,CAACpV,SAAS,IAC1E1mF,EAAWs1F,EAAapK,YAAY,wBAE1C,GAAkB,yBAAflrF,EAASpM,EACV,MAAM,IAAIqO,MAAM,+CAAiDjC,GAGnE,KAAI,EAAAu1F,GAAA,GAASppF,EAAKwtF,MAAO35F,EAAS25F,OAChC,MAAM,IAAI13F,MAAM,4CAGlB,KAAI,EAAAszF,GAAA,GAASppF,EAAK0tF,YAAa75F,EAAS85F,cACtC,MAAM,IAAI73F,MAAM,kDAGf,MACDhL,KAAKG,IAAI,0BAEX+U,EAAK4vF,EAAI/7F,EAAS+7F,EAClB5vF,EAAK6vF,QAAUh8F,EAASi8F,SACxB9vF,EAAK+vF,GAAKl8F,EAASm8F,IACnBhwF,EAAKwqF,WAAa32F,EAASo8F,YAC3BjwF,EAAKkwF,MAAQ,EAEbplG,KAAKqlG,eAAenwF,EAAK4vF,EAAG5vF,EAAK6vF,QAAS7vF,EAAK+vF,IAE/C,MAAM34E,EAAS+xE,EAAa7N,YAE5B,KAAI,EAAA8N,GAAA,GAASl9D,QAAY,iBAA0B,OAAQyjE,EAAkBp9F,MAAM,EAAG6kB,KACpF,MAAM,IAAIthB,MAAM,2CAGlBhL,KAAK2jB,YAAY87E,gBAAgBvqF,EAAKwqF,WAAYxqF,EAAKuvF,UACzD,G,CAEQY,eAAeP,EAAWC,EAAqBE,GAClD,MACDjlG,KAAKG,IAAI,sBAAuB2kG,EAAGC,EAASE,GAG9C,MAAMK,EAAax4F,EAAWi4F,GAC9B,GAAS,IAAND,GAA0B,qgBAAfQ,EAEZ,MAAM,IAAIt6F,MAAM,oDAGf,MACDhL,KAAKG,IAAI,kBAGX,MAAMolG,EAAWvW,GAAgBiW,GAC3BO,EAAgB,KAAOF,EAAY,IAEzC,GAAGC,EAASlI,QAAQ,WAAe,EACjC,MAAM,IAAIryF,MAAM,4CAGlB,GAAGu6F,EAASlI,QAAQmI,EAAcC,SAAS,YAAgB,EACzD,MAAM,IAAIz6F,MAAM,sDAGf,MACDhL,KAAKG,IAAI,yBAGX,MAAMulG,EAAS,KAAO,GAAG7W,IAAI,MAE7B,GAAG0W,EAASlI,QAAQqI,GAAU,EAC5B,MAAM,IAAI16F,MAAM,qDAElB,GAAGu6F,EAASlI,QAAQmI,EAAcC,SAASC,KAAY,EACrD,MAAM,IAAI16F,MAAM,+DAOlB,OAJG,MACDhL,KAAKG,IAAI,8CAGJ,CACT,CAEcokG,sBAAsBrvF,G,0CAClC,MAAMywF,GAAS,EAAA5Z,GAAA,GAAa72E,EAAK4vF,EAAE93F,SAAS,KAE5CkI,EAAK6L,EAAIlW,EAAU,IAAIzB,WAAW,MAIlC,IACE,IAAIw8F,QAAW,iBAA0B,UAAWD,EAAQzwF,EAAK6L,EAAG7L,EAAK6vF,Q,CACzE,MAAMnnG,GACN,MAAMA,C,CAGR,MAAM0M,EAAO,IAAIklF,GAAgB,CAACC,SAAS,IAC3CnlF,EAAKyoF,YAAY,CACfp2F,EAAG,uBACH+lG,MAAOxtF,EAAKwtF,MACZG,aAAc3tF,EAAK0tF,YACnBiD,SAAU,CAAC,EAAG3wF,EAAKkwF,SACnBrrE,IAAK6rE,GACJ,wBAEH,MAAMlC,SAAsB,iBAA0B,OAAQp5F,EAAK8lF,cAAcpsF,OAAOsG,EAAK+lF,UAAS,IAChGwN,QAAsB,iBAA0B,cAAe6F,EAAcxuF,EAAKwvF,UAAWxvF,EAAKyvF,UAElGnjG,EAAU,IAAIguF,GAAgB,CAACC,SAAS,IAW9C,IAAI4O,EAVJ78F,EAAQ8wF,YAAY,uBAAwB,CAC1CoQ,MAAOxtF,EAAKwtF,MACZG,aAAc3tF,EAAK0tF,YACnBqB,eAAgBpG,IAGf,MACD79F,KAAKG,IAAI,6BAIX,IACEk+F,QAAqBr+F,KAAKkiG,iBAAiBhtF,EAAK/M,KAAM3G,EAAQ6uF,UAAS,G,CACvE,MAAM/mF,GACN,MAAMA,C,CAGR,MAAMP,EAAWs1F,EAAapK,YAAY,+BAE1C,GAAkB,cAAflrF,EAASpM,GAAoC,iBAAfoM,EAASpM,GAAuC,gBAAfoM,EAASpM,EACzE,MAAM,IAAIqO,MAAM,sDAAwDjC,EAASpM,GAGnF,KAAI,EAAA2hG,GAAA,GAASppF,EAAKwtF,MAAO35F,EAAS25F,OAChC,MAAM,IAAI13F,MAAM,mDAGlB,KAAI,EAAAszF,GAAA,GAASppF,EAAK0tF,YAAa75F,EAAS85F,cACtC,MAAM,IAAI73F,MAAM,0DAIlB,IACE,IAAI8gF,QAAgB,iBAA0B,UAAW52E,EAAK+vF,GAAI/vF,EAAK6L,EAAG7L,EAAK6vF,Q,CAC/E,MAAMz7F,GACN,MAAMwiF,C,CAGR,MAAMga,QAAoB,iBAA0B,OAAQha,GAC1Dia,EAAaD,EAAYr+F,MAAM,EAAG,GAClCukF,EAAY8Z,EAAYr+F,OAAO,GAKjC,OAHG,MACDzH,KAAKG,IAAI,kCAAmC4I,EAASpM,EAAGmvF,GAEnD/iF,EAASpM,GACd,IAAK,YAAa,CAChB,MAAMqpG,SAAuB,iBAA0B,OAAQ9wF,EAAKiuF,SAASn/F,OAAO,CAAC,GAAI+hG,KAAct+F,OAAO,IAE9G,KAAI,EAAA62F,GAAA,GAAS0H,EAAej9F,EAASk9F,iBAEnC,MADAjmG,KAAKG,IAAIvC,MAAM,uDAAwDooG,EAAej9F,GAChF,IAAIiC,MAAM,4BAGlB,MAAMihF,EAAa6V,GAAS5sF,EAAKiuF,SAAS17F,MAAM,EAAG,GAAIyN,EAAK0tF,YAAYn7F,MAAM,EAAG,IASjF,OARG,MACDzH,KAAKG,IAAI,oBAAqB6rF,EAAWF,EAASG,GAGpD/2E,EAAK82E,UAAYA,EACjB92E,EAAK42E,QAAUA,EACf52E,EAAK+2E,WAAaA,EAEX/2E,C,CAGT,IAAK,eAAgB,CACnB,MAAMgxF,SAAuB,iBAA0B,OAAQhxF,EAAKiuF,SAASn/F,OAAO,CAAC,GAAI+hG,KAAct+F,OAAO,IAC9G,KAAI,EAAA62F,GAAA,GAAS4H,EAAen9F,EAASo9F,iBACnC,MAAM,IAAIn7F,MAAM,6DAGlB,OAAOhL,KAAKukG,sBAAsBrvF,E,CAGpC,IAAK,cAAe,CAClB,MAAMkxF,SAAuB,iBAA0B,OAAQlxF,EAAKiuF,SAASn/F,OAAO,CAAC,GAAI+hG,KAAct+F,OAAO,IAC9G,KAAI,EAAA62F,GAAA,GAAS8H,EAAer9F,EAASs9F,iBACnC,MAAM,IAAIr7F,MAAM,6DAGlB,MAAM,IAAIA,MAAM,wC,EAGtB,G,CAGQ2+E,mBACN,OAAG3pF,KAAKsmG,wBAAgCtmG,KAAKsmG,wBACtCtmG,KAAKsmG,wBAA0B,mBAAqCxhG,MAAK,EAAE+M,gBAChF7R,KAAK2Q,cAAgBkB,EAAY,YAAc,QAC/C7R,KAAKG,IAAI,sBAAuBH,KAAK2Q,cAAc,GAEvD,CAGOuE,KAAK/M,GACV,IAAIwB,EAAU3J,KAAK+rB,OAAO5jB,GAC1B,OAAGwB,IAIHA,EAAU,IAAIhI,SAAQ,CAAMM,EAASL,IAAW,mCAK9C,IAAIhE,QAHEoC,KAAK2pF,mBAIX,IAAI4c,EAAO,EACX,KAAMA,KAAU,GACd,IACE,MAAMrxF,EAAoB,CACxB/M,OACAu6F,MAAO73F,EAAU,IAAIzB,WAAW,MAG5BO,EAAU3J,KAAKyiG,UAAUvtF,GAE/B,YADAjT,QAAc0H,E,CAEd,MAAML,GACN1L,EAAQ0L,C,CAIZ1H,EAAOhE,EACT,MAEOoC,KAAK+rB,OAAO5jB,GAAQwB,EAC7B,ECvlBK,MAAM68F,WAAoB9zF,EAcrBwK,QACRld,KAAKymG,cAAgB,CAAC,EAAG,GACzBzmG,KAAK0mG,WAAa,EAElBpc,GAAA,MAAmB,sBAAsBxlF,MAAMmtB,IAC1CA,IACDjyB,KAAK0mG,WAAaz0E,E,GAiBxB,CAEOrO,sBACL,OAAO5jB,KAAK0mG,UACd,CAEO9N,aACL,MAAM+N,EAAYp4F,KAAK1J,MAKvB,IAAIkJ,EAA0C,CAJlC4S,KAAKgxC,MAAMg1C,EAAY,KAAQ3mG,KAAK0mG,WACnCC,EAAY,KAG4C,IAF1D,QAAe,KAE4D,EAAK,GAiB3F,OAhBG3mG,KAAKymG,cAAc,GAAK14F,EAAU,IACnC/N,KAAKymG,cAAc,KAAO14F,EAAU,IAAM/N,KAAKymG,cAAc,IAAM14F,EAAU,MAC7EA,EAAY,CAAC/N,KAAKymG,cAAc,GAAIzmG,KAAKymG,cAAc,GAAK,IAG9DzmG,KAAKymG,cAAgB14F,EAETwgF,GAAcxgF,EAAU,GAAIA,EAAU,IAAIf,SAAS,GAUjE,CAEOyyF,gBAAgBC,EAAoB+E,GAEzC,MAAMmC,EAAgBlH,GADtB+E,GAAaA,GAAal2F,KAAK1J,OAAS,IAAO,GAEzCgiG,EAAUlmF,KAAKozE,IAAI/zF,KAAK0mG,WAAaE,GAAiB,GAa5D,OAZA5mG,KAAKymG,cAAgB,CAAC,EAAG,GAEtBzmG,KAAK0mG,aAAeE,IACrBtc,GAAA,MAAmB,CACjBwc,mBAAoBF,IAGtB5mG,KAAK0mG,WAAaE,GAKbC,CACT,EC3Ga,MAAME,GACZ1rC,gBAAgB2rC,GACrB,IAAIA,EACF,OAGF,MAAM12D,EAA0D02D,EAAY32D,WAAW7xC,MAAM8xC,GAA8B,+BAAhBA,EAAU3zC,IAMrH,OALG2zC,IACD02D,EAAYr2D,EAAIL,EAAUK,EAC1Bq2D,EAAYp2D,EAAIN,EAAUM,GAGrBo2D,CACT,ECXa,MAAMC,WAA2Bv0F,EACvCw0F,sBAAsB/zD,GAC3B,MAAO,CACLx2C,EAAG,mBACHw2C,OAEJ,CAEOg0D,wBAAwBloG,EAAgB0nB,GAC7C,MAAO,CACLhqB,EAAG,sBACHke,KAAM7a,KAAK8a,gBAAgBiW,iBAAiB9xB,GAC5Ck/C,QAAQ,EAAA9+B,GAAA,GAAmBsH,GAE/B,CAEOygF,eAAeC,GACpB,OAAOrnG,KAAK4T,WAAWC,UAAU,0BAA2B,CAC1DwzF,YACCviG,MAAMwiG,IACPtnG,KAAKod,gBAAgBgL,aAAak/E,EAAYxuF,OAEvCwuF,IAEX,CAEOC,kBAAkBtoG,EAAgB0nB,GACvC,OAAO3mB,KAAK4T,WAAWC,UAAU,6BAA8B,CAC7DgH,KAAM7a,KAAK8a,gBAAgBiW,iBAAiB9xB,GAC5Ck/C,QAAQ,EAAA9+B,GAAA,GAAmBsH,KAC1B7hB,MAAMwiG,IACPtnG,KAAKod,gBAAgBgL,aAAak/E,EAAYxuF,OAEvCwuF,IAEX,CAEOE,sBAAsBH,EAAuBld,EAA4B/lF,GAC9E,OAAOpE,KAAK4T,WAAWC,UAAU,iCAAkC,CACjEzP,OACAijG,UACAld,QAEJ,CAEOsd,gBACLJ,EACAK,EACAC,EACAC,EACAC,EACAC,GAEA,OAAO9nG,KAAK4T,WAAWC,UAAU,2BAA4B,CAC3Dk0F,QAASL,EACTL,UACAW,kBAAmBL,EACnBM,mBAAoBL,EACpBC,cACAK,WAAYJ,QAAa9sG,IACxB8J,MAAM1C,IACS,2BAAbA,EAAOzF,GACRqD,KAAKoe,kBAAkBkV,qBAAqBlxB,EAAO6mB,SAG9C7mB,IAEX,CAEO+lG,eAAehe,EAAgB0d,GACpC,OAAO7nG,KAAK4T,WAAWC,UAAU,0BAA2B,CAC1Ds2E,OACA0d,eAEJ,E,eCtEa,MAAMO,WAAiC11F,EAAtD,c,oBAYS,KAAA7T,MAAQ,CAAC0M,GAAO,KACjBA,EAIFvL,KAAKqoG,eAAiB,IAAI72F,KAH1BxR,KAAKqoG,eAAexpG,QACpBmB,KAAKsoG,uBAAoBttG,E,EAMrB,KAAAutG,uBAA0B9tF,IAChCza,KAAKnB,QACLmB,KAAKwoG,mBAAmB,CAuH5B,CA1IYtrF,QACRld,KAAKnB,OAAM,GAEXmB,KAAKoe,kBAAkBC,2BAA2B,CAChDoqF,qBAAsBzoG,KAAKuoG,wBAE/B,CAgBOG,kBAAkBC,GACvB3oG,KAAKqoG,eAAepgG,IAAI0gG,EAAcC,OAAQD,GAC9C,MAAME,GAAO,EAAAC,GAAA,GAAqBH,GAElC,OADAE,EAAKA,KAAO7oG,KAAK03C,eAAezH,QAAQ44D,EAAKA,KAAM,CAAC9qG,KAAM,oBAAqBqZ,MAAOuxF,EAAcC,SAC7FD,CACT,CAEOI,mBAAmBV,GACpBA,EAAuB3vE,QAC1B2vE,EAAuB3vE,OAAQ,EAChC2vE,EAAevpG,SAASsW,GAASpV,KAAK0oG,kBAAkBtzF,KAC1D,CAEOozF,oB,MACL,OAA6B,QAAtB,EAAAxoG,KAAKsoG,yBAAiB,QAAItoG,KAAK4T,WAAWotB,uBAAuB,CACtEl4B,OAAQ,6BACRm4B,cAAgBonE,KACd,EAAAlgF,GAAA,GAA0CkgF,GAC1CroG,KAAKod,gBAAgBgL,aAAaigF,EAAevvF,OACjD9Y,KAAK+oG,mBAAmBV,EAAe93E,MAEhCvwB,KAAKsoG,kBAAoBD,EAAe93E,KAAK9oB,MAAM,EAAG,KAGnE,CAEOuhG,uBAAuB5xF,GAC5B,OAAOpX,KAAKqoG,eAAe7jG,IAAI4S,EACjC,CAEOD,iBAAiBC,EAAcya,GAElC,MADE7xB,KAAKod,gBAAgB2gE,gBAAgB3mE,IACjC,EAAAO,EAAA,GAAU,cAcpB,CAEOsxF,eAAevtG,GASpB,MAAM,MACJ0b,EAAK,OACLnY,EAAM,IACNvB,EAAG,YACHwrG,EAAW,YACXC,EAAW,aAEXj7C,EAAY,OACZl8B,EAAM,aACN68B,EAAY,WACZpR,EAAU,SACVn7B,GACE5mB,EAIJ,OAAOsE,KAAK4T,WAAWotB,uBAAuB,CAC5Cl4B,OAAQ,0BACRmL,OAAQ,CACN4G,KAAM7a,KAAK8a,gBAAgBiW,iBAAiB9xB,GAC5Cu9C,IAAKx8C,KAAKod,gBAAgB4d,aAAa5jB,GACvC4a,SACAp3B,SARa,MASb8C,MACA+2C,gBAAiByZ,GAAe,EAAA7uC,GAAA,GAAmB6uC,QAAgBlzD,EACnEouG,cAAeF,EACfG,aAAcF,EACdnmE,QAAS6rB,EAAe7uD,KAAK8a,gBAAgBiW,iBAAiB89B,QAAgB7zD,EAC9E+kD,YAAatC,EACbvI,WAAY5yB,GAAW,EAAAjD,GAAA,GAAmBiD,QAAYtnB,GAExDimC,cAAgB7+B,IACdzE,QAAQwC,IAAIiC,GACLA,IAGb,CAEOknG,eAAe5tG,GAKpB,OAAOsE,KAAK4T,WAAWotB,uBAAuB,CAC5Cl4B,OAAQ,0BACRmL,OAAQ,CACN4G,KAAM7a,KAAK8a,gBAAgBiW,iBAAiBr1B,EAAQuD,QACpDu9C,IAAKx8C,KAAKod,gBAAgB4d,aAAat/B,EAAQ0b,OAC/CylC,SAAUnhD,EAAQkhD,QAClB5qB,OAAQt2B,EAAQs2B,OAChByiB,gBAAiB/4C,EAAQwyD,cAAe,EAAA7uC,GAAA,GAAmB3jB,EAAQwyD,mBAAgBlzD,EACnFgoC,QAAStnC,EAAQmzD,aAAe7uD,KAAK8a,gBAAgBiW,iBAAiBr1B,EAAQmzD,mBAAgB7zD,EAC9Fk6C,WAAYx5C,EAAQ4mB,UAAW,EAAAjD,GAAA,GAAmB3jB,EAAQ4mB,eAAYtnB,GAExEimC,cAAgB7+B,IACdzE,QAAQwC,IAAIiC,EAAO,GAGzB,ECjJa,MAAMmnG,WAAgC72F,EAC5C82F,eAAe9rG,EAAauB,EAAiB0nB,EAAc8iF,GAChE,OAAOzpG,KAAK4T,WAAWC,UAAU,0BAA2B,CAC1D61F,UAAWD,EACXtrD,OAAQx3B,GAAM,EAAAtH,GAAA,GAAmBsH,QAAO3rB,EACxC6f,KAAM5b,EAASe,KAAK8a,gBAAgBiW,iBAAiB9xB,QAAUjE,EAC/D0C,QACCoH,MAAM6kG,IACgB,yBAApBA,EAAchtG,GACfqD,KAAKod,gBAAgBoyD,YAAYm6B,EAAcntD,KAG1CmtD,IAEX,CAEOC,cAAclsG,EAAauB,EAAiB0nB,EAAc8iF,EAAmBI,GAClF,OAAO7pG,KAAK4T,WAAWC,UAAU,yBAA0B,CACzD61F,UAAWD,EACXtrD,OAAQx3B,GAAM,EAAAtH,GAAA,GAAmBsH,QAAO3rB,EACxC6f,KAAM5b,EAASe,KAAK8a,gBAAgBiW,iBAAiB9xB,QAAUjE,EAC/D0C,MACAosG,cAAeD,IACd/kG,MAAM6kG,GACAA,GAEX,CAEOI,uBACL,OAAO/pG,KAAK4T,WAAWC,UAAU,gCAAgC/O,MAAMklG,IACrEhqG,KAAKod,gBAAgBgL,aAAa4hF,EAAkBlxF,OAC7CkxF,EAAkBC,iBAE7B,CAEOC,sBAAsB9oE,GAC3B,OAAOphC,KAAK4T,WAAWC,UAAU,gCAAiC,CAChEutB,QAEJ,CAEO+oE,yBACL,OAAOnqG,KAAK4T,WAAWC,UAAU,iCACnC,ECzCa,MAAMu2F,WAAyB13F,EAGlCwK,QACRld,KAAKqqG,WAAa,CAAC,CACrB,CAEQC,cAAch3D,GACpB,OAAIA,GAUe,oBAAhBA,EAAU32C,IACX22C,EAAUxM,SAAW9mC,KAAK03C,eAAezH,QAAQqD,EAAUxM,SAAU,CAAC/oC,KAAM,YAAawZ,YAAa+7B,EAAU12C,MAMlHoD,KAAKqqG,WAAW/2D,EAAU12C,IAAM02C,EAGzBA,GAnBEA,CAoBX,CAEOi3D,aAAaC,GAClB,OAAOxqG,KAAK4T,WAAWotB,uBAAuB,CAC5Cl4B,OAAQ,uBACRmL,OAAQ,CAACi/B,UAAWs3D,GACpBvpE,cAAgBqS,GACPtzC,KAAKsqG,cAAch3D,IAGhC,CAEOm3D,kBAAkBn3D,GACvB,MAAyB,iBAAhB,EACA,CAAC32C,EAAG,qBAAsBw2C,KAAMG,GACf,oBAAhBA,EAAU32C,EACX,CAACA,EAAG,uBAAwBC,GAAI02C,EAAU12C,IAE1C,CAACD,EAAG,iBAAkBC,GAAI02C,EAAU12C,GAAI09B,YAAagZ,EAAUhZ,YAE1E,CAEOhjB,iBAAiB1a,GACtB,MAAM02C,EAAYtzC,KAAKqqG,WAAWztG,GAClC,OAAOoD,KAAKuqG,aAAavqG,KAAKyqG,kBAAkBn3D,GAClD,CAEOo3D,YACL,OAAO1qG,KAAK4T,WAAWotB,uBAAuB,CAC5Cl4B,OAAQ,oBACRmL,OAAQ,CAAC0wB,OAAQ,QAASvD,KAAM,GAChCH,cAAgB0pE,KACd,EAAAxiF,GAAA,GAAwCwiF,GAExCA,EAAcC,OAAO9rG,SAAS+rG,IACxBA,EAAM/jG,UAIV+jG,EAAM/jG,SAAShI,SAASgsG,IACtBA,EAAc53D,UAAYlzC,KAAKsqG,cAAcQ,EAAc53D,UAAU,GACrE,IAGGy3D,EAAcC,SAG3B,CAEOG,gBACL,OAAO/qG,KAAK4T,WAAW6/B,kBAAkB,CAAC3qC,OAAQ,0BAA0BhE,MAAMkmG,IAChF,MAAMX,EAAcW,EAA0DC,WAK9E,OAJAZ,EAAWvrG,SAAQ,CAACw0C,EAAWhvC,EAAKwG,KAClCA,EAAIxG,GAAOtE,KAAKsqG,cAAch3D,EAAU,IAGnC+2D,CAAU,GAErB,ECPF,MAAMa,GAAqB,IA1EpB,MAMLprG,cACEE,KAAKmrG,kBAAoB,GACzBnrG,KAAKorG,oBAAsB,EAC3BprG,KAAKqrG,mBAAoB,SACzBrrG,KAAKqrG,kBAAkBvmG,MAAK,KAC1B9E,KAAKqrG,uBAAoBrwG,CAAS,GAEtC,CAEO+lD,QACL,MAAM5wC,EAAO,kBAEbA,EAAK7J,iBAAiB,WAAW,EAAErG,OAAM6I,SAAQlC,WACxC,EAAAumB,EAAA,GAAYntB,KAAKsrG,eAAgB14F,IAEtC,MAAM24F,EAAU34F,EAAS3S,GACzB,OAAOsrG,EAAQziG,GAAQ0iG,MAAMD,EAAS3kG,EAAK,MAI/CuJ,EAAK7J,iBAAiB,cAAc,CAACkG,EAAS6uC,EAAQl5C,K,MACpD,MAAMgO,EAAOhO,EAAMspG,MAAM,GACtBzrG,KAAKorG,qBAAuBprG,KAAKmrG,kBAAkB1uG,OACpD0T,EAAKxN,WAIL3C,KAAKorG,oBACP//F,EAAA,aAA6B8E,GACP,QAAtB,EAAAnQ,KAAKqrG,yBAAiB,SAAEppG,UAAS,IAGnCkO,EAAK7J,iBAAiB,yBAAyB,EAAEolG,cAAaxyE,WAC5D,IAAIz8B,EAASuD,KAAKmrG,kBAAkB1uG,OAChCA,IACFuD,KAAKmrG,kBAAkB7qG,KAAKorG,KAC1BjvG,GAGJ,MAAM4jD,EAAY,kBAClB,GAAG5jD,IAAW4jD,EACZ,OAAOrgD,KAAKmrG,kBAGd,MAAMQ,EAAU,IAAI7qG,MAAMu/C,EAAY5jD,GAAQklG,UAAK3mG,GAAWmJ,KAAI,IAAMg1B,IAAIC,gBAAgBF,KAE5F,OADAl5B,KAAKmrG,kBAAkB7qG,QAAQqrG,GACxB3rG,KAAKmrG,iBAAiB,GAEjC,CAEaS,iB,qCACX,MAAMhtF,EAAqB,IAAIrL,QAEzB5R,QAAQ0Q,IAAI,CAEhBuM,EAAmB/L,eACnB7S,KAAKqrG,oBAGP,MAAMz4F,QChCK,SAAwBgM,EAAwCzf,GAC7E,MAAMyT,EAAW,CACfkI,gBAAiB,IAAI6tD,GACrBjsD,gBAAiB,IAAI2e,GACrBqc,eAAgB,IAAInI,GACpBuN,iBAAkB,IAAIusB,GACtBrc,gBAAiB,IAAI8c,GACrB1sD,gBAAiB,IAAI28D,GACrBntB,mBAAoB,IAAImzB,GACxB7gE,iBAAkB,IAAI40B,GACtBj9B,kBAAmB,IAAIo1D,GACvB9pD,wBAAyB,IAAI+kD,GAC7B9oD,kBAAmB,IAAIyU,GACvBg5E,kBAAmB,IAAIvzE,GACvBqjC,qBAAsB,IAAIzjB,GAC1B4zD,gBAAiB,IAAIzyE,GACrB8pC,oBAAqB,IAAIsN,GACzBj6D,mBAAoB,IAAIgrC,GACxB6Y,sBAAuB,IAAIpa,GAC3B8rD,kBAAmB,IAAI3gC,GACvB4gC,qBAAsB,IAAIjwD,GAC1BplC,mBAAoB,IAAIk9D,GACxBzjC,kBAAmB,IAAI36B,GACvBsB,gBAAiB,IAAI4+B,GACrBt1B,eAAgB,IAAI8N,GACpBhD,eAAgB,IAAI3R,GACpB5F,WAAY,IAAIs1E,GAChB30E,aAAclJ,EAAA,EACd4gG,gBAAiB,IAAIt4F,EACrBslB,eAAgB,IAAI6oD,GACpBh7D,aAAc,IAAI,GAClB8oB,cAAe,IAAIw+C,GACnBz3C,iBAAkB,IAAI+pD,GACtBvjF,UAAW,IAAIlX,EACfimF,WAAY,IAAI+V,GAChBtwF,eAAgB,IAAI5B,EACpB4T,YAAa,IAAI6iF,GACjB5nF,mBAAoBA,EACpBD,gBAAiB,EACjBy8C,kBAAmB,IAAI2rC,GACvBmF,mBAAoB,IAAIjF,GACxB/vF,yBAA0B,IAAIkxF,GAC9B+D,wBAAyB,IAAI5C,GAC7BlyF,iBAAkB,IAAI+yF,IAKxB,IAAI,MAAMnqG,KAAQ2S,EAAU,CAC1B,MAAM24F,EAAU34F,EAAS3S,GACrBsrG,IAIAA,EAA+B54F,cAChC44F,EAA+B54F,YAAYC,UACpC24F,EAA+B54F,aAIzC/D,EAAA,EAAI3O,GAAQsrG,E,CAGd,MAAMrnG,EAAyD,GAC/D,IAAIsP,EAAQvZ,OAAOgZ,KAAKL,GACxBY,EAAM0S,QAAQ,kBAAmB,kBAAmB,0BAA2B,qBAAsB,kBACrG1S,GAAQ,EAAA4kB,GAAA,GAAa5kB,GACrB,IAAI,MAAMvT,KAAQuT,EAAO,CACvB,MAAM+3F,EAAU34F,EAAS3S,GACzB,GAAIsrG,aAAO,EAAPA,EAAiBruF,MAAO,CAE1B,MAAM9a,EAAUmpG,EAAgBruF,QAChChZ,EAAS5D,KAAK8B,E,EAclB,OAJGjD,GACDyT,EAASgB,WAAWy0E,YAAYlpF,GAG3BwC,QAAQ0Q,IAAInO,GAAUY,MAAK,IAAM8N,GAC1C,CDvD2Bg5F,CAAehtF,EAAoB,UAC1D,OAAO5e,KAAK4S,SAAWA,CACzB,E,+RAEO04F,c,MACL,OAAoB,QAApB,EAAOtrG,KAAK4S,gBAAQ,QAAb5S,KAAK4S,SAAa5S,KAAK4rG,gBAChC,GAIF,OAAmB,wBAAoCV,IACvD,Y,eErEA,IAKI,GAA8CkB,GAL9CC,IAAyB,EACtB,SAASv6D,KACd,OAAOu6D,EACT,CAGO,SAASnrB,KACd,OAAOmrB,GAAyB,QAAqBrxG,CACvD,CAEA,MAAMmF,IAAM,EAAAsI,EAAA,IAAO,WAGb0H,GAAO,IAAI,IACjBA,GAAKkO,2BAA2B,CAC9BxY,YAAcA,IACZE,EAAeF,GAEf,oBAAsC,EAGxCkF,OAAQ,EAAEjC,SAAQlC,UACT,iBAA0BkC,KAAkBlC,GAGrDK,MAAO,EAAEA,QAAOmM,gBAAek5F,aAAYtpG,aAAYD,aAAY5D,aAKjEgB,GAAI,YAAa8G,EAAOqlG,GAExB,SAAyBntG,EACzB,aAA6B6D,EAC7B,aAA6BD,EAE5B9I,OAAOgZ,KAAKhM,GAAkCnI,SAASuI,IACtD,cAA4BA,EAAKJ,EAAMI,IAAM,GAAOilG,EAAWp9E,SAAS7nB,GAAK,IAG/E,UAA+B+L,EAAc,EAI/Ci4E,eAAgB,EAAEntE,UAASquF,iBAClB,EAAAlhB,GAAA,GAAentE,EAASquF,GAGjCpqG,MAAO,CAACqK,EAAS6uC,KACfl7C,GAAI,sBAAuBqM,EAAS6uC,GACpClrC,GAAKq8F,mBAAmB,QAAShgG,EAAS6uC,EAAO,EAGnDoxD,oBAAsBz8D,IACpBq8D,GAAyBr8D,CAAM,EAGjC08D,kBAAmB,CAAClgG,EAAS6uC,EAAQl5C,KAChC,IACD,GAAmBwqG,WAAWP,IAC9BA,QAAsBpxG,IAEtB,GAAqB,IAAI,KACzB,GAAmBqjB,2BAA2B,CAC5Cu1B,gBAAkBpnC,IACT,EAAA2gB,EAAA,GAAY,kBAAmCva,IACpD,MAAM,MAACqE,EAAK,KAAE9O,EAAI,OAAEmkB,EAAM,MAAE/P,GAAS/P,EACrC,OAAOoG,EAAS8kC,eAAe/D,eAAe18B,EAAO9O,EAAMmkB,EAAQ/P,EAAM,QAO9E6vF,GAAsBjqG,EAAMspG,MAAM,KACnC,GAAmBmB,WAAWR,G,EAIlChzE,gBAAkBF,GACTC,IAAIC,gBAAgBF,KAmB/B/4B,GAAI,iBAEJ,WACA,iBACA,WCvHe,SACb0sG,EACAC,EACAC,GAEA,MAAMH,EAAa,CAACI,EAAiBC,KACnCJ,EAAYK,iBAAiBF,GAC7BC,GAAYJ,EAAYM,eAAeF,GACvCH,SAAAA,EAAYE,EAAW,EAGzBH,EAAYO,qBDuHV/xD,IACF,aAAyBA,EAAO,ICtHO,oBAA9B,wBACNzsC,EAAA,mBAAwD,WAAYrM,GAAMqqG,EAAWrqG,EAAE84C,OAAQ94C,EAAE84C,UACrD,oBAA/B,yBACduxD,EAAWh+F,EAAA,EAAK,MAEhBg+F,EAAWh+F,EAAA,EAAKA,EAAA,EAEpB,CDsGAy+F,CAAkBl9F,IAAOkrC,IACvB,UAAsBA,EAAO,G,wJEtHxB,MAAMiyD,EAAuB,EACvBC,EAA0B,WAC1BC,EAAoC,IACpCC,EAA0B,MAC1BC,EAAa,WAEbC,EAAqB,SACrBC,EAAkB,GAElBC,EAA4B,iBAC5BC,EAAmB,WACnBC,EAAgB,IAAI3vG,IAAI,CAAC,MAAO,IAAK,MAErC4vG,EAAgC,EAChCC,EAAoC,EACpCC,EAA4B,IAAI9vG,IAAI,CAAC4vG,EAAeC,IACpDE,EAAiBxtF,KAAK4E,OAAOzkB,MAAMC,KAAKmtG,IAAiB,C,+GChBtE,MAMaE,EAAsB,w3BAyBtBC,EAAwB,OAAUD,EAGlCE,EAAgC,IAAMF,EAAsB,OAC5DG,EAA4B,+BAC5BC,EAAcD,EAEzB,MAAQD,EAAgC,aAAeA,EAF9BC,oIAQzBD,EAAgC,IAAMF,EARbG,qBAUdD,EAAgC,IAAMF,EAVxBG,iDAYOH,EAZPG,uEAmBdE,GADuB,IAAIziE,OAAO,IAAMuiE,EAA0B9mG,MAAM,GAAI,GAAI,KACrD,+BAC3BinG,EAAmB,qBACnBC,EAAsB,+BAAiCD,EAAmB,aAC1EE,EAAe,IAAI5iE,OAAO,YAAc0iE,EAAmB,MAAQF,EAAc,YAAc,IAAc,uBAAyBH,EAAwB,mBAAqBM,EAAqB,KACxME,EAAgB,4JAEhBC,EAAmB,+JAenBC,EAA8D,CACzE,IAAK,oBACL,KAAM,mBACN,KAAM,oBACN,GAAM,sBACN,KAAM,sBACN,MAAO,yBACP,KAAM,wBAGKC,EAAqD,IAAI5wG,IAAI,CACxE,qBACA,yBACA,uBAEF,IAAI,MAAMuH,KAAKopG,EACbC,EAA0BjwG,IAAIgwG,EAAkBppG,IAG3C,MAAMspG,EAAuB,S,gBC3G7B,SAASC,EAAYC,GAE1B,OASK,SAAsBC,GAC3B,MAAMC,EAAS,GACf,IAAIC,EAAO,EACPC,EAAW,EACX5pG,EAAI,EACR,KAAMA,EAAIypG,EAAkB3yG,QAC1B6yG,EAAOF,EAAkB74B,WAAW5wE,KACjC4pG,GACDF,EAAO/uG,MAAM,OAAYivG,EAAW,OAAW,KAAOD,EAAO,QAAStiG,SAAS,KAC/EuiG,EAAW,GACHD,EAAO,OAAUA,GAAQ,MACjCC,EAAWD,EAEXD,EAAO/uG,KAAKgvG,EAAKtiG,SAAS,KAQ9B,OAJGqiG,EAAO5yG,QAA+B,IAArB4yG,EAAO,GAAG5yG,SAC5B4yG,EAAO,GAAK,KAAOA,EAAO,IAGrBA,CACT,CAhCqBG,CAAaC,EAAYN,IAAYnyG,KAAK,IAE/D,C,kBAEA,MAAM0yG,EAAa,UAEbC,EAAkBxb,OAAOC,aAAa,MAEtCqb,EAAeG,GAAsBA,EAASn1G,QAAQk1G,GAAmB,EAAIC,EAAS7zG,QAAQ2zG,EAAY,IAAME,EA+BhE,IAAIp+F,IAAI,CAC5D,CAAC,KAAM,S,GC1CLq+F,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqB/0G,IAAjBg1G,EACH,OAAOA,EAAaC,QAGrB,IAAIC,EAASL,EAAyBE,GAAY,CACjDnzG,GAAImzG,EACJjwF,QAAQ,EACRmwF,QAAS,CAAC,GAUX,OANAE,EAAoBJ,GAAU91E,KAAKi2E,EAAOD,QAASC,EAAQA,EAAOD,QAASH,GAG3EI,EAAOpwF,QAAS,EAGTowF,EAAOD,OACf,CAGAH,EAAoBpd,EAAIyd,EAGxBL,EAAoB9T,EAAI,KAGvB,IAAIoU,EAAsBN,EAAoBO,OAAEr1G,EAAW,CAAC,IAAI,IAAI,IAAI,GAAG,MAAM,IAAO80G,EAAoB,QAE5G,OADsBA,EAAoBO,EAAED,EAClB,EnHpCvB52G,EAAW,GACfs2G,EAAoBO,EAAI,CAACjuG,EAAQkuG,EAAUC,EAAIC,KAC9C,IAAGF,EAAH,CAMA,IAAIG,EAAejnC,IACnB,IAAS7jE,EAAI,EAAGA,EAAInM,EAASiD,OAAQkJ,IAAK,CAGzC,IAFA,IAAK2qG,EAAUC,EAAIC,GAAYh3G,EAASmM,GACpCo/D,GAAY,EACPyZ,EAAI,EAAGA,EAAI8xB,EAAS7zG,OAAQ+hF,MACpB,EAAXgyB,GAAsBC,GAAgBD,IAAav2G,OAAOgZ,KAAK68F,EAAoBO,GAAGnwF,OAAO7Y,GAASyoG,EAAoBO,EAAEhpG,GAAKipG,EAAS9xB,MAC9I8xB,EAASxmG,OAAO00E,IAAK,IAErBzZ,GAAY,EACTyrC,EAAWC,IAAcA,EAAeD,IAG7C,GAAGzrC,EAAW,CACbvrE,EAASsQ,OAAOnE,IAAK,GACrB,IAAIN,EAAIkrG,SACEv1G,IAANqK,IAAiBjD,EAASiD,EAC/B,CACD,CACA,OAAOjD,CAnBP,CAJCouG,EAAWA,GAAY,EACvB,IAAI,IAAI7qG,EAAInM,EAASiD,OAAQkJ,EAAI,GAAKnM,EAASmM,EAAI,GAAG,GAAK6qG,EAAU7qG,IAAKnM,EAASmM,GAAKnM,EAASmM,EAAI,GACrGnM,EAASmM,GAAK,CAAC2qG,EAAUC,EAAIC,EAqBjB,EoHzBdV,EAAoBtnC,EAAK0nC,IACxB,IAAIQ,EAASR,GAAUA,EAAOS,WAC7B,IAAOT,EAAiB,QACxB,IAAM,EAEP,OADAJ,EAAoB1zF,EAAEs0F,EAAQ,CAAE5vF,EAAG4vF,IAC5BA,CAAM,ECLdZ,EAAoB1zF,EAAI,CAAC6zF,EAASW,KACjC,IAAI,IAAIvpG,KAAOupG,EACXd,EAAoBx9C,EAAEs+C,EAAYvpG,KAASyoG,EAAoBx9C,EAAE29C,EAAS5oG,IAC5EpN,OAAO24B,eAAeq9E,EAAS5oG,EAAK,CAAEwpG,YAAY,EAAMrsG,IAAKosG,EAAWvpG,IAE1E,ECNDyoG,EAAoBziF,EAAI,CAAC,EAGzByiF,EAAoBvtG,EAAKuuG,GACjBnvG,QAAQ0Q,IAAIpY,OAAOgZ,KAAK68F,EAAoBziF,GAAGC,QAAO,CAACppB,EAAUmD,KACvEyoG,EAAoBziF,EAAEhmB,GAAKypG,EAAS5sG,GAC7BA,IACL,KCNJ4rG,EAAoB7xE,EAAK6yE,GAER,KAAZA,EAAuB,oCACX,MAAZA,EAAwB,sCAEf,CAAC,IAAM,kBAAkB,IAAM,YAAYA,IAAYA,GAAW,IAAM,CAAC,EAAI,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,wBAAwBA,GAAW,YCL5ShB,EAAoBiB,SAAYD,IAEf,ECHjBhB,EAAoBhL,EAAI,WACvB,GAA0B,iBAAfkM,WAAyB,OAAOA,WAC3C,IACC,OAAOhxG,MAAQ,IAAIixG,SAAS,cAAb,EAGhB,CAFE,MAAO1uG,GACR,GAAsB,iBAAX3I,OAAqB,OAAOA,MACxC,CACA,CAPuB,GCAxBk2G,EAAoBx9C,EAAI,CAAClhD,EAAK8/F,IAAUj3G,OAAOy4B,UAAU7hB,eAAeopB,KAAK7oB,EAAK8/F,GCClFpB,EAAoBzqG,EAAK4qG,IACH,oBAAXkB,QAA0BA,OAAOC,aAC1Cn3G,OAAO24B,eAAeq9E,EAASkB,OAAOC,YAAa,CAAE/sG,MAAO,WAE7DpK,OAAO24B,eAAeq9E,EAAS,aAAc,CAAE5rG,OAAO,GAAO,ECL9DyrG,EAAoBuB,IAAOnB,IAC1BA,EAAOoB,MAAQ,GACVpB,EAAOqB,WAAUrB,EAAOqB,SAAW,IACjCrB,G,MCHR,IAAIsB,EACA1B,EAAoBhL,EAAE2M,gBAAeD,EAAY1B,EAAoBhL,EAAEvoG,SAAW,IACtF,IAAIuqC,EAAWgpE,EAAoBhL,EAAEh+D,SACrC,IAAK0qE,GAAa1qE,IACbA,EAAS4qE,gBACZF,EAAY1qE,EAAS4qE,cAAcC,MAC/BH,GAAW,CACf,IAAII,EAAU9qE,EAAS+qE,qBAAqB,UACzCD,EAAQn1G,SAAQ+0G,EAAYI,EAAQA,EAAQn1G,OAAS,GAAGk1G,IAC5D,CAID,IAAKH,EAAW,MAAM,IAAIxmG,MAAM,yDAChCwmG,EAAYA,EAAUz1G,QAAQ,OAAQ,IAAIA,QAAQ,QAAS,IAAIA,QAAQ,YAAa,KACpF+zG,EAAoB91E,EAAIw3E,C,KCfxB,MACE,QAAmC,IAAxB1B,EAAqC,CAC9C,IAAIgC,EAAehC,EAAoB7xE,EACnC8zE,EAAgBjC,EAAoBvtG,EACpCyvG,EAAW,CAAC,EACZC,EAAW,CAAC,EAIhBnC,EAAoB7xE,EAAI,SAAU6yE,GAEhC,OADagB,EAAahB,IAGvBkB,EAASnhG,eAAeigG,GAAW,IAAMkB,EAASlB,GAAW,GAElE,EACAhB,EAAoBvtG,EAAI,SAAUuuG,GAEhC,OADaiB,EAAcjB,GACb7iG,OAAM,SAAUrQ,GAC5B,IAAIs0G,EAAUD,EAASphG,eAAeigG,GAClCmB,EAASnB,GACT,OACJ,GAAIoB,EAAU,EAAG,CACf,IAAIC,EAAUL,EAAahB,GAQ3B,MAPAlzG,EAAMiE,QACJ,iBACAivG,EACA,mCACAqB,EACA,IACFv0G,EAAM4D,QAAU2wG,EACVv0G,CACR,CACA,OAAO,IAAI+D,SAAQ,SAAUM,GAE3BF,YAAW,WACT,IACIqwG,EACK7jG,KAAK1J,MAGdmtG,EAASlB,GAAWsB,EACpBH,EAASnB,GAAWoB,EAAU,EAC9BjwG,EAAQ6tG,EAAoBvtG,EAAEuuG,GAChC,GArCG,IAsCL,GACF,GACF,CACF,CACD,EAjDD,G,MCIA,IAAIuB,EAAkB,CACrB,IAAK,GAgBNvC,EAAoBziF,EAAE1nB,EAAI,CAACmrG,EAAS5sG,KAE/BmuG,EAAgBvB,IAElBW,cAAc3B,EAAoB91E,EAAI81E,EAAoB7xE,EAAE6yE,GAE9D,EAGD,IAAIwB,EAAqBtyG,KAAuB,iBAAIA,KAAuB,kBAAK,GAC5EuyG,EAA6BD,EAAmBhyG,KAAK2e,KAAKqzF,GAC9DA,EAAmBhyG,KAvBCgK,IACnB,IAAKgmG,EAAUkC,EAAaC,GAAWnoG,EACvC,IAAI,IAAIylG,KAAYyC,EAChB1C,EAAoBx9C,EAAEkgD,EAAazC,KACrCD,EAAoBpd,EAAEqd,GAAYyC,EAAYzC,IAIhD,IADG0C,GAASA,EAAQ3C,GACdQ,EAAS7zG,QACd41G,EAAgB/B,EAAS5oG,OAAS,EACnC6qG,EAA2BjoG,EAAK,C,K9HnB7B7Q,EAAOq2G,EAAoB9T,EAC/B8T,EAAoB9T,EAAI,IAChBr6F,QAAQ0Q,IAAI,CAAC,IAAI,IAAI,IAAI,GAAG,KAAKlO,IAAI2rG,EAAoBvtG,EAAGutG,IAAsBhrG,KAAKrL,G+HDrEq2G,EAAoB9T,G","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/startup chunk dependencies","webpack://tweb/./src/config/debug.ts","webpack://tweb/./src/config/emoji.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/helpers/cleanSearchText.ts","webpack://tweb/./src/helpers/fileName.ts","webpack://tweb/./src/helpers/restrictions.ts","webpack://tweb/./src/lib/appManagers/utils/peers/getPeerId.ts","webpack://tweb/./src/lib/files/idb.ts","webpack://tweb/./src/environment/utils.ts","webpack://tweb/./src/lib/rootScope.ts","webpack://tweb/./src/lib/appManagers/appStateManager.ts","webpack://tweb/./src/helpers/object/setDeepProperty.ts","webpack://tweb/./src/lib/mtproto/transports/http.ts","webpack://tweb/./src/lib/mtproto/transports/websocket.ts","webpack://tweb/./src/helpers/array/randomize.ts","webpack://tweb/./src/lib/mtproto/transports/obfuscation.ts","webpack://tweb/./src/lib/mtproto/transports/abridged.ts","webpack://tweb/./src/helpers/bytes/bytesToHex.ts","webpack://tweb/./src/lib/mtproto/transports/tcpObfuscated.ts","webpack://tweb/./src/lib/mtproto/dcConfigurator.ts","webpack://tweb/./src/lib/mtproto/transports/controller.ts","webpack://tweb/./src/lib/appManagers/utils/storages/resetStoragesPromise.ts","webpack://tweb/./src/lib/appManagers/manager.ts","webpack://tweb/./src/lib/appManagers/utils/storages/loadStorages.ts","webpack://tweb/./src/lib/appManagers/appStoragesManager.ts","webpack://tweb/./src/lib/appManagers/utils/storages/createStorages.ts","webpack://tweb/./src/lib/mtproto/passwordManager.ts","webpack://tweb/./src/lib/mtproto/referenceDatabase.ts","webpack://tweb/./src/helpers/object/safeReplaceObject.ts","webpack://tweb/./src/lib/appManagers/utils/messages/getPeerIdsFromMessage.ts","webpack://tweb/./src/lib/appManagers/utils/dialogs/setDialogIndex.ts","webpack://tweb/./src/lib/storages/dialogs.ts","webpack://tweb/./src/lib/storages/filters.ts","webpack://tweb/./src/helpers/applyMixins.ts","webpack://tweb/./src/lib/appManagers/apiUpdatesManager.ts","webpack://tweb/./src/lib/appManagers/appAvatarsManager.ts","webpack://tweb/./src/lib/appManagers/appCallsManager.ts","webpack://tweb/./src/lib/appManagers/appChatsManager.ts","webpack://tweb/./src/lib/langPack.ts","webpack://tweb/./src/lib/richTextProcessor/wrapUrl.ts","webpack://tweb/./src/helpers/dom/setInnerHTML.ts","webpack://tweb/./src/helpers/date.ts","webpack://tweb/./src/helpers/object/safeReplaceArrayInObject.ts","webpack://tweb/./src/environment/mimeTypeMap.ts","webpack://tweb/./src/lib/appManagers/appDocsManager.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentURL.ts","webpack://tweb/./src/lib/appManagers/appDraftsManager.ts","webpack://tweb/./src/lib/appManagers/appEmojiManager.ts","webpack://tweb/./src/lib/appManagers/appGroupCallsManager.ts","webpack://tweb/./src/lib/appManagers/utils/photos/getPhotoInput.ts","webpack://tweb/./src/lib/appManagers/utils/photos/getPhotoMediaInput.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentMediaInput.ts","webpack://tweb/./src/lib/appManagers/appInlineBotsManager.ts","webpack://tweb/./src/lib/appManagers/appMessagesIdsManager.ts","webpack://tweb/./src/helpers/string/splitStringByLength.ts","webpack://tweb/./src/lib/appManagers/appTabsManager.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentInput.ts","webpack://tweb/./src/helpers/object/setBooleanFlag.ts","webpack://tweb/./src/lib/appManagers/appMessagesManager.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentInputFileName.ts","webpack://tweb/./src/helpers/string/convertInputKeyToKey.ts","webpack://tweb/./src/lib/appManagers/appNotificationsManager.ts","webpack://tweb/./src/lib/appManagers/appPeersManager.ts","webpack://tweb/./src/lib/appManagers/appPhotosManager.ts","webpack://tweb/./src/lib/appManagers/appPollsManager.ts","webpack://tweb/./src/lib/appManagers/appPrivacyManager.ts","webpack://tweb/./src/lib/appManagers/appProfileManager.ts","webpack://tweb/./src/helpers/callbackifyAll.ts","webpack://tweb/./src/lib/appManagers/appReactionsManager.ts","webpack://tweb/./src/lib/appManagers/appStickersManager.ts","webpack://tweb/./src/helpers/fixBase64String.ts","webpack://tweb/./src/lib/appManagers/appUsersManager.ts","webpack://tweb/./src/helpers/cleanUsername.ts","webpack://tweb/./src/lib/appManagers/appWebPagesManager.ts","webpack://tweb/./src/helpers/blob/readBlobAsArrayBuffer.ts","webpack://tweb/./src/helpers/string/fileNameRFC.ts","webpack://tweb/./src/lib/files/downloadWriter.ts","webpack://tweb/./src/lib/files/downloadStorage.ts","webpack://tweb/./src/lib/mtproto/apiFileManager.ts","webpack://tweb/./src/helpers/fixFirefoxSvg.ts","webpack://tweb/./src/helpers/blob/readBlobAsUint8Array.ts","webpack://tweb/./src/lib/mtproto/api_methods.ts","webpack://tweb/./src/lib/mtproto/apiManager.ts","webpack://tweb/./src/lib/storages/peers.ts","webpack://tweb/./src/lib/storages/thumbs.ts","webpack://tweb/./src/lib/mtproto/schema.ts","webpack://tweb/./src/helpers/number/intToUint.ts","webpack://tweb/./src/helpers/long/ulongFromInts.ts","webpack://tweb/./src/helpers/bigInt/bigIntConstants.ts","webpack://tweb/./src/helpers/bigInt/bigIntConversion.ts","webpack://tweb/./src/lib/mtproto/tl_utils.ts","webpack://tweb/./src/helpers/gzipUncompress.ts","webpack://tweb/./src/helpers/bytes/addPadding.ts","webpack://tweb/./src/lib/mtproto/networker.ts","webpack://tweb/./src/helpers/long/sortLongsArray.ts","webpack://tweb/./src/helpers/long/longToBytes.ts","webpack://tweb/./src/lib/mtproto/networkerFactory.ts","webpack://tweb/./src/lib/mtproto/rsaKeysManager.ts","webpack://tweb/./src/helpers/bytes/bytesXor.ts","webpack://tweb/./src/lib/mtproto/authorizer.ts","webpack://tweb/./src/lib/mtproto/timeManager.ts","webpack://tweb/./src/lib/appManagers/appWebDocsManager.ts","webpack://tweb/./src/lib/appManagers/appPaymentsManager.ts","webpack://tweb/./src/lib/appManagers/appAttachMenuBotsManager.ts","webpack://tweb/./src/lib/appManagers/appSeamlessLoginManager.ts","webpack://tweb/./src/lib/appManagers/appThemesManager.ts","webpack://tweb/./src/lib/appManagers/appManagersManager.ts","webpack://tweb/./src/lib/appManagers/createManagers.ts","webpack://tweb/./src/lib/mtproto/mtproto.worker.ts","webpack://tweb/./src/helpers/listenMessagePort.ts","webpack://tweb/./src/lib/mtproto/mtproto_config.ts","webpack://tweb/./src/lib/richTextProcessor/index.ts","webpack://tweb/./src/vendor/emoji/index.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/compat get default export","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/make namespace object","webpack://tweb/webpack/runtime/node module decorator","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/importScripts chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn Promise.all([699,211,147,85,110].map(__webpack_require__.e, __webpack_require__)).then(next);\n};","/*\n * 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 './modes';\n\nexport const IS_BETA = process.env.NODE_ENV !== 'production';\nexport const DEBUG = (IS_BETA || Modes.debug)/* && false */;\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\nexport default DEBUG;\n\n// let m = DEBUG;\n/* if(!DEBUG) {\n ctx.sandpitTurtle = () => {\n //if(!m) {\n for(let i in MOUNT_CLASS_TO) {\n ctx[i] = MOUNT_CLASS_TO[i];\n }\n //m = true;\n //}\n\n //DEBUG = !DEBUG;\n };\n} */\n\n/* export const superDebug = (object: any, key: string) => {\n var d = object[key];\n var beforeStr = '', afterStr = '';\n for(var r of d) {\n beforeStr += r.before.hex + '\\n';\n afterStr += r.after.hex + '\\n';\n }\n\n beforeStr = beforeStr.trim();\n afterStr = afterStr.trim();\n //var beforeStr = d.map((r) => r.before.hex).join('\\n');\n //var afterStr = d.map((r) => r.after.hex).join('\\n');\n\n var dada = (name: string, str: string) => {\n var a = document.createElement('a');\n a.target = '_blank';\n a.download = name + '.txt';\n a.href = URL.createObjectURL(new Blob([str], {\n type: 'text/plain'\n }));\n document.body.append(a);\n a.click();\n };\n\n dada(key + '_' + 'before', beforeStr);\n dada(key + '_' + 'after', afterStr);\n}\n\nMOUNT_CLASS_TO.superDebug = superDebug; */\n","/*\n * 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 {EMOJI_VERSION} from '../environment/emojiVersionsSupport';\n\nexport const EmojiVersions: {[version in EMOJI_VERSION]: {[emoji: string]: number}} = {'14':{'1f6dd':4867, '1f6de':4916, '1f6df':4923, '1f7f0':62832, '1f979':183, '1f9cc':1557, '1fa7b':61332, '1fa7c':61330, '1faa9':51093, '1faaa':61364, '1faab':61189, '1faac':51085, '1fab7':2651, '1fab8':2631, '1fab9':2672, '1faba':2673, '1fac3':1520, '1fac4':1521, '1fac5':1505, '1fad7':3793, '1fad8':3707, '1fad9':3804, '1fae0':111, '1fae1':136, '1fae2':132, '1fae3':133, '1fae4':174, '1fae5':142, '1fae6':1385, '1fae7':61353, '1faf0':1341, '1faf1':1332, '1faf2':1333, '1faf3':1334, '1faf4':1335, '1faf5':1351, '1faf6':1360, '1faf1-1f3fb-200d-1faf2-1f3fc':0, '1faf1-1f3fb-200d-1faf2-1f3fd':0, '1faf1-1f3fb-200d-1faf2-1f3fe':0, '1faf1-1f3fb-200d-1faf2-1f3ff':0, '1faf1-1f3fc-200d-1faf2-1f3fb':0, '1faf1-1f3fc-200d-1faf2-1f3fd':0, '1faf1-1f3fc-200d-1faf2-1f3fe':0, '1faf1-1f3fc-200d-1faf2-1f3ff':0, '1faf1-1f3fd-200d-1faf2-1f3fb':0, '1faf1-1f3fd-200d-1faf2-1f3fc':0, '1faf1-1f3fd-200d-1faf2-1f3fe':0, '1faf1-1f3fd-200d-1faf2-1f3ff':0, '1faf1-1f3fe-200d-1faf2-1f3fb':0, '1faf1-1f3fe-200d-1faf2-1f3fc':0, '1faf1-1f3fe-200d-1faf2-1f3fd':0, '1faf1-1f3fe-200d-1faf2-1f3ff':0, '1faf1-1f3ff-200d-1faf2-1f3fb':0, '1faf1-1f3ff-200d-1faf2-1f3fc':0, '1faf1-1f3ff-200d-1faf2-1f3fd':0, '1faf1-1f3ff-200d-1faf2-1f3fe':0, '1fac3-1f3fb':0, '1fac3-1f3fc':0, '1fac3-1f3fd':0, '1fac3-1f3fe':0, '1fac3-1f3ff':0, '1fac4-1f3fb':0, '1fac4-1f3fc':0, '1fac4-1f3fd':0, '1fac4-1f3fe':0, '1fac4-1f3ff':0, '1fac5-1f3fb':0, '1fac5-1f3fc':0, '1fac5-1f3fd':0, '1fac5-1f3fe':0, '1fac5-1f3ff':0, '1faf0-1f3fb':0, '1faf0-1f3fc':0, '1faf0-1f3fd':0, '1faf0-1f3fe':0, '1faf0-1f3ff':0, '1faf1-1f3fb':0, '1faf1-1f3fc':0, '1faf1-1f3fd':0, '1faf1-1f3fe':0, '1faf1-1f3ff':0, '1faf2-1f3fb':0, '1faf2-1f3fc':0, '1faf2-1f3fd':0, '1faf2-1f3fe':0, '1faf2-1f3ff':0, '1faf3-1f3fb':0, '1faf3-1f3fc':0, '1faf3-1f3fd':0, '1faf3-1f3fe':0, '1faf3-1f3ff':0, '1faf4-1f3fb':0, '1faf4-1f3fc':0, '1faf4-1f3fd':0, '1faf4-1f3fe':0, '1faf4-1f3ff':0, '1faf5-1f3fb':0, '1faf5-1f3fc':0, '1faf5-1f3fd':0, '1faf5-1f3fe':0, '1faf5-1f3ff':0, '1faf6-1f3fb':0, '1faf6-1f3fc':0, '1faf6-1f3fd':0, '1faf6-1f3fe':0, '1faf6-1f3ff':0}, '':{'2049':62835, '2122':62863, '2139':62888, '2194':62764, '2195':62763, '2196':62762, '2197':62756, '2198':62758, '2199':62760, '2328':61194, '2600':4990, '2601':4998, '2602':41013, '2603':41018, '2604':41020, '2611':62851, '2614':41014, '2615':3781, '2618':2667, '2620':1106, '2622':62753, '2623':62754, '2626':62783, '2638':62780, '2639':177, '2648':62788, '2649':62789, '2650':62796, '2651':62797, '2652':62798, '2653':62799, '2660':51095, '2663':51098, '2665':51096, '2666':51097, '2668':4865, '2692':61297, '2693':4922, '2694':61300, '2696':61311, '2697':61319, '2699':61309, '2702':61284, '2705':62850, '2708':4931, '2709':61245, '2712':61259, '2714':62852, '2716':62828, '2721':62779, '2728':51029, '2733':62858, '2734':62859, '2744':41017, '2747':62860, '2753':62836, '2754':62837, '2755':62838, '2757':62839, '2763':1137, '2764':1141, '2795':62829, '2796':62830, '2797':62831, '2934':62767, '2935':62768, '3030':62840, '3297':62912, '3299':62913, '0023-20e3':62864, '002a-20e3':62865, '0030-20e3':62866, '0031-20e3':62867, '0032-20e3':62868, '0033-20e3':62869, '0034-20e3':62870, '0035-20e3':62871, '0036-20e3':62872, '0037-20e3':62873, '0038-20e3':62874, '0039-20e3':62875, '00a9':62861, '00ae':62862, '1f004':51101, '1f0cf':51100, '1f170':62882, '1f171':62884, '1f17e':62893, '1f17f':62895, '1f18e':62883, '1f191':62885, '1f192':62886, '1f193':62887, '1f194':62889, '1f195':62891, '1f196':62892, '1f197':62894, '1f198':62896, '1f199':62897, '1f19a':62898, '1f1e6-1f1e8':71594, '1f1e6-1f1e9':71595, '1f1e6-1f1ea':71596, '1f1e6-1f1eb':71597, '1f1e6-1f1ec':71598, '1f1e6-1f1ee':71599, '1f1e6-1f1f1':71600, '1f1e6-1f1f2':71601, '1f1e6-1f1f4':71602, '1f1e6-1f1f6':71603, '1f1e6-1f1f7':71604, '1f1e6-1f1f8':71605, '1f1e6-1f1f9':71606, '1f1e6-1f1fa':71607, '1f1e6-1f1fc':71608, '1f1e6-1f1fd':71609, '1f1e6-1f1ff':71610, '1f1e7-1f1e6':71611, '1f1e7-1f1e7':71612, '1f1e7-1f1e9':71613, '1f1e7-1f1ea':71614, '1f1e7-1f1eb':71615, '1f1e7-1f1ec':71616, '1f1e7-1f1ed':71617, '1f1e7-1f1ee':71618, '1f1e7-1f1ef':71619, '1f1e7-1f1f1':71620, '1f1e7-1f1f2':71621, '1f1e7-1f1f3':71622, '1f1e7-1f1f4':71623, '1f1e7-1f1f6':71624, '1f1e7-1f1f7':71625, '1f1e7-1f1f8':71626, '1f1e7-1f1f9':71627, '1f1e7-1f1fb':71628, '1f1e7-1f1fc':71629, '1f1e7-1f1fe':71630, '1f1e7-1f1ff':71631, '1f1e8-1f1e6':71632, '1f1e8-1f1e8':71633, '1f1e8-1f1e9':71634, '1f1e8-1f1eb':71635, '1f1e8-1f1ec':71636, '1f1e8-1f1ed':71637, '1f1e8-1f1ee':71638, '1f1e8-1f1f0':71639, '1f1e8-1f1f1':71640, '1f1e8-1f1f2':71641, '1f1e8-1f1f3':71642, '1f1e8-1f1f4':71643, '1f1e8-1f1f5':71644, '1f1e8-1f1f7':71645, '1f1e8-1f1fa':71646, '1f1e8-1f1fb':71647, '1f1e8-1f1fc':71648, '1f1e8-1f1fd':71649, '1f1e8-1f1fe':71650, '1f1e8-1f1ff':71651, '1f1e9-1f1ea':71652, '1f1e9-1f1ec':71653, '1f1e9-1f1ef':71654, '1f1e9-1f1f0':71655, '1f1e9-1f1f2':71656, '1f1e9-1f1f4':71657, '1f1e9-1f1ff':71658, '1f1ea-1f1e6':71659, '1f1ea-1f1e8':71660, '1f1ea-1f1ea':71661, '1f1ea-1f1ec':71662, '1f1ea-1f1ed':71663, '1f1ea-1f1f7':71664, '1f1ea-1f1f8':71665, '1f1ea-1f1f9':71666, '1f1ea-1f1fa':71667, '1f1eb-1f1ee':71668, '1f1eb-1f1ef':71669, '1f1eb-1f1f0':71670, '1f1eb-1f1f2':71671, '1f1eb-1f1f4':71672, '1f1eb-1f1f7':71673, '1f1ec-1f1e6':71674, '1f1ec-1f1e7':71675, '1f1ec-1f1e9':71676, '1f1ec-1f1ea':71677, '1f1ec-1f1eb':71678, '1f1ec-1f1ec':71679, '1f1ec-1f1ed':71680, '1f1ec-1f1ee':71681, '1f1ec-1f1f1':71682, '1f1ec-1f1f2':71683, '1f1ec-1f1f3':71684, '1f1ec-1f1f5':71685, '1f1ec-1f1f6':71686, '1f1ec-1f1f7':71687, '1f1ec-1f1f8':71688, '1f1ec-1f1f9':71689, '1f1ec-1f1fa':71690, '1f1ec-1f1fc':71691, '1f1ec-1f1fe':71692, '1f1ed-1f1f0':71693, '1f1ed-1f1f2':71694, '1f1ed-1f1f3':71695, '1f1ed-1f1f7':71696, '1f1ed-1f1f9':71697, '1f1ed-1f1fa':71698, '1f1ee-1f1e8':71699, '1f1ee-1f1e9':71700, '1f1ee-1f1ea':71701, '1f1ee-1f1f1':71702, '1f1ee-1f1f2':71703, '1f1ee-1f1f3':71704, '1f1ee-1f1f4':71705, '1f1ee-1f1f6':71706, '1f1ee-1f1f7':71707, '1f1ee-1f1f8':71708, '1f1ee-1f1f9':71709, '1f1ef-1f1ea':71710, '1f1ef-1f1f2':71711, '1f1ef-1f1f4':71712, '1f1ef-1f1f5':71713, '1f1f0-1f1ea':71714, '1f1f0-1f1ec':71715, '1f1f0-1f1ed':71716, '1f1f0-1f1ee':71717, '1f1f0-1f1f2':71718, '1f1f0-1f1f3':71719, '1f1f0-1f1f5':71720, '1f1f0-1f1f7':71721, '1f1f0-1f1fc':71722, '1f1f0-1f1fe':71723, '1f1f0-1f1ff':71724, '1f1f1-1f1e6':71725, '1f1f1-1f1e7':71726, '1f1f1-1f1e8':71727, '1f1f1-1f1ee':71728, '1f1f1-1f1f0':71729, '1f1f1-1f1f7':71730, '1f1f1-1f1f8':71731, '1f1f1-1f1f9':71732, '1f1f1-1f1fa':71733, '1f1f1-1f1fb':71734, '1f1f1-1f1fe':71735, '1f1f2-1f1e6':71736, '1f1f2-1f1e8':71737, '1f1f2-1f1e9':71738, '1f1f2-1f1ea':71739, '1f1f2-1f1eb':71740, '1f1f2-1f1ec':71741, '1f1f2-1f1ed':71742, '1f1f2-1f1f0':71743, '1f1f2-1f1f1':71744, '1f1f2-1f1f2':71745, '1f1f2-1f1f3':71746, '1f1f2-1f1f4':71747, '1f1f2-1f1f5':71748, '1f1f2-1f1f6':71749, '1f1f2-1f1f7':71750, '1f1f2-1f1f8':71751, '1f1f2-1f1f9':71752, '1f1f2-1f1fa':71753, '1f1f2-1f1fb':71754, '1f1f2-1f1fc':71755, '1f1f2-1f1fd':71756, '1f1f2-1f1fe':71757, '1f1f2-1f1ff':71758, '1f1f3-1f1e6':71759, '1f1f3-1f1e8':71760, '1f1f3-1f1ea':71761, '1f1f3-1f1eb':71762, '1f1f3-1f1ec':71763, '1f1f3-1f1ee':71764, '1f1f3-1f1f1':71765, '1f1f3-1f1f4':71766, '1f1f3-1f1f5':71767, '1f1f3-1f1f7':71768, '1f1f3-1f1fa':71769, '1f1f3-1f1ff':71770, '1f1f4-1f1f2':71771, '1f1f5-1f1e6':71772, '1f1f5-1f1ea':71773, '1f1f5-1f1eb':71774, '1f1f5-1f1ec':71775, '1f1f5-1f1ed':71776, '1f1f5-1f1f0':71777, '1f1f5-1f1f1':71778, '1f1f5-1f1f2':71779, '1f1f5-1f1f3':71780, '1f1f5-1f1f7':71781, '1f1f5-1f1f8':71782, '1f1f5-1f1f9':71783, '1f1f5-1f1fc':71784, '1f1f5-1f1fe':71785, '1f1f6-1f1e6':71786, '1f1f7-1f1ea':71787, '1f1f7-1f1f4':71788, '1f1f7-1f1f8':71789, '1f1f7-1f1fa':71790, '1f1f7-1f1fc':71791, '1f1f8-1f1e6':71792, '1f1f8-1f1e7':71793, '1f1f8-1f1e8':71794, '1f1f8-1f1e9':71795, '1f1f8-1f1ea':71796, '1f1f8-1f1ec':71797, '1f1f8-1f1ed':71798, '1f1f8-1f1ee':71799, '1f1f8-1f1ef':71800, '1f1f8-1f1f0':71801, '1f1f8-1f1f1':71802, '1f1f8-1f1f2':71803, '1f1f8-1f1f3':71804, '1f1f8-1f1f4':71805, '1f1f8-1f1f7':71806, '1f1f8-1f1f8':71807, '1f1f8-1f1f9':71808, '1f1f8-1f1fb':71809, '1f1f8-1f1fd':71810, '1f1f8-1f1fe':71811, '1f1f8-1f1ff':71812, '1f1f9-1f1e6':71813, '1f1f9-1f1e8':71814, '1f1f9-1f1e9':71815, '1f1f9-1f1eb':71816, '1f1f9-1f1ec':71817, '1f1f9-1f1ed':71818, '1f1f9-1f1ef':71819, '1f1f9-1f1f0':71820, '1f1f9-1f1f1':71821, '1f1f9-1f1f2':71822, '1f1f9-1f1f3':71823, '1f1f9-1f1f4':71824, '1f1f9-1f1f7':71825, '1f1f9-1f1f9':71826, '1f1f9-1f1fb':71827, '1f1f9-1f1fc':71828, '1f1f9-1f1ff':71829, '1f1fa-1f1e6':71830, '1f1fa-1f1ec':71831, '1f1fa-1f1f2':71832, '1f1fa-1f1f3':71833, '1f1fa-1f1f8':71834, '1f1fa-1f1fe':71835, '1f1fa-1f1ff':71836, '1f1fb-1f1e6':71837, '1f1fb-1f1e8':71838, '1f1fb-1f1ea':71839, '1f1fb-1f1ec':71840, '1f1fb-1f1ee':71841, '1f1fb-1f1f3':71842, '1f1fb-1f1fa':71843, '1f1fc-1f1eb':71844, '1f1fc-1f1f8':71845, '1f1fd-1f1f0':71846, '1f1fe-1f1ea':71847, '1f1fe-1f1f9':71848, '1f1ff-1f1e6':71849, '1f1ff-1f1f2':71850, '1f1ff-1f1fc':71851, '1f201':62899, '1f202':62900, '1f21a':62906, '1f22f':62903, '1f232':62907, '1f233':62911, '1f234':62910, '1f235':62915, '1f236':62902, '1f237':62901, '1f238':62909, '1f239':62905, '1f23a':62914, '1f250':62904, '1f251':62908, '1f300':41010, '1f301':4857, '1f302':41012, '1f303':4858, '1f304':4860, '1f305':4861, '1f306':4862, '1f307':4863, '1f308':41011, '1f309':4864, '1f30a':41023, '1f30b':4815, '1f30c':4997, '1f30d':4806, '1f30e':4807, '1f30f':4808, '1f310':4809, '1f311':4977, '1f312':4978, '1f313':4979, '1f314':4980, '1f315':4981, '1f316':4982, '1f317':4983, '1f318':4984, '1f319':4985, '1f31a':4986, '1f31b':4987, '1f31c':4988, '1f31d':4991, '1f31e':4992, '1f31f':4995, '1f320':4996, '1f321':4989, '1f324':41001, '1f325':41002, '1f326':41003, '1f327':41004, '1f328':41005, '1f329':41006, '1f32a':41007, '1f32b':41008, '1f32c':41009, '1f32d':3725, '1f32e':3727, '1f32f':3728, '1f330':3708, '1f331':2659, '1f332':2661, '1f333':2662, '1f334':2663, '1f335':2664, '1f336':3698, '1f337':2658, '1f338':2649, '1f339':2653, '1f33a':2655, '1f33b':2656, '1f33c':2657, '1f33d':3697, '1f33e':2665, '1f33f':2666, '1f340':2668, '1f341':2669, '1f342':2670, '1f343':2671, '1f344':3705, '1f345':3690, '1f346':3694, '1f347':3674, '1f348':3675, '1f349':3676, '1f34a':3677, '1f34b':3678, '1f34c':3679, '1f34d':3680, '1f34e':3682, '1f34f':3683, '1f350':3684, '1f351':3685, '1f352':3686, '1f353':3687, '1f354':3722, '1f355':3724, '1f356':3718, '1f357':3719, '1f358':3744, '1f359':3745, '1f35a':3746, '1f35b':3747, '1f35c':3748, '1f35d':3749, '1f35e':3709, '1f35f':3723, '1f360':3750, '1f361':3756, '1f362':3751, '1f363':3752, '1f364':3753, '1f365':3754, '1f366':3765, '1f367':3766, '1f368':3767, '1f369':3768, '1f36a':3769, '1f36b':3774, '1f36c':3775, '1f36d':3776, '1f36e':3777, '1f36f':3778, '1f370':3771, '1f371':3743, '1f372':3735, '1f373':3733, '1f374':3801, '1f375':3783, '1f376':3784, '1f377':3786, '1f378':3787, '1f379':3788, '1f37a':3789, '1f37b':3790, '1f37c':3779, '1f37d':3800, '1f37e':3785, '1f37f':3739, '1f380':51040, '1f381':51041, '1f382':3770, '1f383':51024, '1f384':51025, '1f385':1527, '1f386':51026, '1f387':51027, '1f388':51030, '1f389':51031, '1f38a':51032, '1f38b':51033, '1f38c':71588, '1f38d':51034, '1f38e':51035, '1f38f':51036, '1f390':51037, '1f391':51038, '1f392':61134, '1f393':61147, '1f396':51045, '1f397':51042, '1f399':61167, '1f39a':61168, '1f39b':61169, '1f39e':61203, '1f39f':51043, '1f3a0':4866, '1f3a1':4868, '1f3a2':4869, '1f3a3':51072, '1f3a4':61170, '1f3a5':61202, '1f3a6':62819, '1f3a7':61171, '1f3a8':51105, '1f3a9':61146, '1f3aa':4871, '1f3ab':51044, '1f3ac':61205, '1f3ad':51103, '1f3ae':51086, '1f3af':51078, '1f3b0':51088, '1f3b1':51081, '1f3b2':51089, '1f3b3':51060, '1f3b4':51102, '1f3b5':61165, '1f3b6':61166, '1f3b7':61173, '1f3b8':61175, '1f3b9':61176, '1f3ba':61177, '1f3bb':61178, '1f3bc':61164, '1f3bd':51074, '1f3be':51058, '1f3bf':51075, '1f3c0':51054, '1f3c1':71586, '1f3c2':1600, '1f3c3-200d-2640':1584, '1f3c3-200d-2642':1583, '1f3c3':1582, '1f3c4-200d-2640':1606, '1f3c4-200d-2642':1605, '1f3c4':1604, '1f3c5':51047, '1f3c6':51046, '1f3c7':1598, '1f3c8':51056, '1f3c9':51057, '1f3ca-200d-2640':1612, '1f3ca-200d-2642':1611, '1f3ca':1610, '1f3cb-200d-2640':1618, '1f3cb-200d-2642':1617, '1f3cb':1616, '1f3cc-200d-2640':1603, '1f3cc-200d-2642':1602, '1f3cc':1601, '1f3cd':4902, '1f3ce':4901, '1f3cf':51061, '1f3d0':51055, '1f3d1':51062, '1f3d2':51063, '1f3d3':51065, '1f3d4':4813, '1f3d5':4817, '1f3d6':4818, '1f3d7':4824, '1f3d8':4829, '1f3d9':4859, '1f3da':4830, '1f3db':4823, '1f3dc':4819, '1f3dd':4820, '1f3de':4821, '1f3df':4822, '1f3e0':4831, '1f3e1':4832, '1f3e2':4833, '1f3e3':4834, '1f3e4':4835, '1f3e5':4836, '1f3e6':4837, '1f3e7':62729, '1f3e8':4838, '1f3e9':4839, '1f3ea':4840, '1f3eb':4841, '1f3ec':4842, '1f3ed':4843, '1f3ee':61216, '1f3ef':4844, '1f3f0':4845, '1f3f3-200d-1f308':71591, '1f3f3-200d-26a7':71592, '1f3f3':71590, '1f3f4-200d-2620':71593, '1f3f4-e0067-e0062-e0065-e006e-e0067-e007f':71852, '1f3f4-e0067-e0062-e0073-e0063-e0074-e007f':71853, '1f3f4-e0067-e0062-e0077-e006c-e0073-e007f':71854, '1f3f4':71589, '1f3f5':2652, '1f3f7':61234, '1f3f8':51066, '1f3f9':61303, '1f3fa':3805, '1f3fb':9525, '1f3fc':9526, '1f3fd':9527, '1f3fe':9528, '1f3ff':9529, '1f400':2576, '1f401':2575, '1f402':2556, '1f403':2557, '1f404':2558, '1f405':2547, '1f406':2548, '1f407':2579, '1f408-200d-2b1b':2544, '1f408':2543, '1f409':2618, '1f40a':2613, '1f40b':2622, '1f40c':2632, '1f40d':2616, '1f40e':2550, '1f40f':2563, '1f410':2565, '1f411':2564, '1f412':2531, '1f413':2596, '1f414':2595, '1f415-200d-1f9ba':2537, '1f415':2535, '1f416':2560, '1f417':2561, '1f418':2570, '1f419':2629, '1f41a':2630, '1f41b':2634, '1f41c':2635, '1f41d':2636, '1f41e':2638, '1f41f':2625, '1f420':2626, '1f421':2627, '1f422':2614, '1f423':2597, '1f424':2598, '1f425':2599, '1f426':2600, '1f427':2601, '1f428':2586, '1f429':2538, '1f42a':2566, '1f42b':2567, '1f42c':2623, '1f42d':2574, '1f42e':2555, '1f42f':2546, '1f430':2578, '1f431':2542, '1f432':2617, '1f433':2621, '1f434':2549, '1f435':2530, '1f436':2534, '1f437':2559, '1f438':2612, '1f439':2577, '1f43a':2539, '1f43b-200d-2744':2585, '1f43b':2584, '1f43c':2587, '1f43d':2562, '1f43e':2593, '1f43f':2580, '1f440':1381, '1f441-200d-1f5e8':1159, '1f441':1382, '1f442':1373, '1f443':1375, '1f444':1384, '1f445':1383, '1f446':1347, '1f447':1349, '1f448':1345, '1f449':1346, '1f44a':1355, '1f44b':1327, '1f44c':1336, '1f44d':1352, '1f44e':1353, '1f44f':1358, '1f450':1361, '1f451':61144, '1f452':61145, '1f453':61110, '1f454':61115, '1f455':61116, '1f456':61117, '1f457':61122, '1f458':61123, '1f459':61128, '1f45a':61129, '1f45b':61130, '1f45c':61131, '1f45d':61132, '1f45e':61136, '1f45f':61137, '1f460':61140, '1f461':61141, '1f462':61143, '1f463':1687, '1f464':1684, '1f465':1685, '1f466':1388, '1f467':1389, '1f468-200d-1f33e':1457, '1f468-200d-1f373':1460, '1f468-200d-1f37c':1524, '1f468-200d-1f393':1448, '1f468-200d-1f3a4':1478, '1f468-200d-1f3a8':1481, '1f468-200d-1f3eb':1451, '1f468-200d-1f3ed':1466, '1f468-200d-1f466-200d-1f466':1674, '1f468-200d-1f466':1673, '1f468-200d-1f467-200d-1f466':1676, '1f468-200d-1f467-200d-1f467':1677, '1f468-200d-1f467':1675, '1f468-200d-1f468-200d-1f466':1663, '1f468-200d-1f468-200d-1f466-200d-1f466':1666, '1f468-200d-1f468-200d-1f467':1664, '1f468-200d-1f468-200d-1f467-200d-1f466':1665, '1f468-200d-1f468-200d-1f467-200d-1f467':1667, '1f468-200d-1f469-200d-1f466':1658, '1f468-200d-1f469-200d-1f466-200d-1f466':1661, '1f468-200d-1f469-200d-1f467':1659, '1f468-200d-1f469-200d-1f467-200d-1f466':1660, '1f468-200d-1f469-200d-1f467-200d-1f467':1662, '1f468-200d-1f4bb':1475, '1f468-200d-1f4bc':1469, '1f468-200d-1f527':1463, '1f468-200d-1f52c':1472, '1f468-200d-1f680':1487, '1f468-200d-1f692':1490, '1f468-200d-1f9af':1574, '1f468-200d-1f9b0':1396, '1f468-200d-1f9b1':1397, '1f468-200d-1f9b2':1399, '1f468-200d-1f9b3':1398, '1f468-200d-1f9bc':1577, '1f468-200d-1f9bd':1580, '1f468-200d-2695':1445, '1f468-200d-2696':1454, '1f468-200d-2708':1484, '1f468-200d-2764-200d-1f468':1655, '1f468-200d-2764-200d-1f48b-200d-1f468':1651, '1f468':1392, '1f469-200d-1f33e':1458, '1f469-200d-1f373':1461, '1f469-200d-1f37c':1523, '1f469-200d-1f393':1449, '1f469-200d-1f3a4':1479, '1f469-200d-1f3a8':1482, '1f469-200d-1f3eb':1452, '1f469-200d-1f3ed':1467, '1f469-200d-1f466-200d-1f466':1679, '1f469-200d-1f466':1678, '1f469-200d-1f467-200d-1f466':1681, '1f469-200d-1f467-200d-1f467':1682, '1f469-200d-1f467':1680, '1f469-200d-1f469-200d-1f466':1668, '1f469-200d-1f469-200d-1f466-200d-1f466':1671, '1f469-200d-1f469-200d-1f467':1669, '1f469-200d-1f469-200d-1f467-200d-1f466':1670, '1f469-200d-1f469-200d-1f467-200d-1f467':1672, '1f469-200d-1f4bb':1476, '1f469-200d-1f4bc':1470, '1f469-200d-1f527':1464, '1f469-200d-1f52c':1473, '1f469-200d-1f680':1488, '1f469-200d-1f692':1491, '1f469-200d-1f9af':1575, '1f469-200d-1f9b0':1401, '1f469-200d-1f9b1':1403, '1f469-200d-1f9b2':1407, '1f469-200d-1f9b3':1405, '1f469-200d-1f9bc':1578, '1f469-200d-1f9bd':1581, '1f469-200d-2695':1446, '1f469-200d-2696':1455, '1f469-200d-2708':1485, '1f469-200d-2764-200d-1f468':1654, '1f469-200d-2764-200d-1f469':1656, '1f469-200d-2764-200d-1f48b-200d-1f468':1650, '1f469-200d-2764-200d-1f48b-200d-1f469':1652, '1f469':1400, '1f46a':1657, '1f46b':1647, '1f46c':1648, '1f46d':1646, '1f46e-200d-2640':1494, '1f46e-200d-2642':1493, '1f46e':1492, '1f46f-200d-2640':1590, '1f46f-200d-2642':1589, '1f46f':1588, '1f470-200d-2640':1518, '1f470-200d-2642':1517, '1f470':1516, '1f471-200d-2640':1409, '1f471-200d-2642':1410, '1f471':1391, '1f472':1511, '1f473-200d-2640':1510, '1f473-200d-2642':1509, '1f473':1508, '1f474':1412, '1f475':1413, '1f476':1386, '1f477-200d-2640':1504, '1f477-200d-2642':1503, '1f477':1502, '1f478':1507, '1f479':1109, '1f47a':1110, '1f47b':1111, '1f47c':1526, '1f47d':1112, '1f47e':1113, '1f47f':1104, '1f480':1105, '1f481-200d-2640':1428, '1f481-200d-2642':1427, '1f481':1426, '1f482-200d-2640':1500, '1f482-200d-2642':1499, '1f482':1498, '1f483':1585, '1f484':61152, '1f485':1366, '1f486-200d-2640':1560, '1f486-200d-2642':1559, '1f486':1558, '1f487-200d-2640':1563, '1f487-200d-2642':1562, '1f487':1561, '1f488':4870, '1f489':61326, '1f48a':61328, '1f48b':1127, '1f48c':1128, '1f48d':61153, '1f48e':61154, '1f48f':1649, '1f490':2648, '1f491':1653, '1f492':4846, '1f493':1133, '1f494':1138, '1f495':1135, '1f496':1131, '1f497':1132, '1f498':1129, '1f499':1145, '1f49a':1144, '1f49b':1143, '1f49c':1146, '1f49d':1130, '1f49e':1134, '1f49f':1136, '1f4a0':62946, '1f4a1':61214, '1f4a2':1151, '1f4a3':1157, '1f4a4':1163, '1f4a5':1152, '1f4a6':1154, '1f4a7':41022, '1f4a8':1155, '1f4a9':1107, '1f4aa':1368, '1f4ab':1153, '1f4ac':1158, '1f4ad':1162, '1f4ae':2650, '1f4af':1150, '1f4b0':61235, '1f4b1':62841, '1f4b2':62842, '1f4b3':61242, '1f4b4':61237, '1f4b5':61238, '1f4b6':61239, '1f4b7':61240, '1f4b8':61241, '1f4b9':61244, '1f4ba':4936, '1f4bb':61191, '1f4bc':61265, '1f4bd':61197, '1f4be':61198, '1f4bf':61199, '1f4c0':61200, '1f4c1':61266, '1f4c2':61267, '1f4c3':61227, '1f4c4':61229, '1f4c5':61269, '1f4c6':61270, '1f4c7':61273, '1f4c8':61274, '1f4c9':61275, '1f4ca':61276, '1f4cb':61277, '1f4cc':61278, '1f4cd':61279, '1f4ce':61280, '1f4cf':61282, '1f4d0':61283, '1f4d1':61232, '1f4d2':61226, '1f4d3':61225, '1f4d4':61218, '1f4d5':61219, '1f4d6':61220, '1f4d7':61221, '1f4d8':61222, '1f4d9':61223, '1f4da':61224, '1f4db':62847, '1f4dc':61228, '1f4dd':61264, '1f4de':61185, '1f4df':61186, '1f4e0':61187, '1f4e1':61325, '1f4e2':61159, '1f4e3':61160, '1f4e4':61249, '1f4e5':61250, '1f4e6':61251, '1f4e7':61246, '1f4e8':61247, '1f4e9':61248, '1f4ea':61253, '1f4eb':61252, '1f4ec':61254, '1f4ed':61255, '1f4ee':61256, '1f4ef':61161, '1f4f0':61230, '1f4f1':61182, '1f4f2':61183, '1f4f3':62823, '1f4f4':62824, '1f4f5':62751, '1f4f6':62822, '1f4f7':61207, '1f4f8':61208, '1f4f9':61209, '1f4fa':61206, '1f4fb':61172, '1f4fc':61210, '1f4fd':61204, '1f4ff':61151, '1f500':62801, '1f501':62802, '1f502':62803, '1f503':62769, '1f504':62770, '1f505':62820, '1f506':62821, '1f507':61155, '1f508':61156, '1f509':61157, '1f50a':61158, '1f50b':61188, '1f50c':61190, '1f50d':61211, '1f50e':61212, '1f50f':61290, '1f510':61291, '1f511':61292, '1f512':61288, '1f513':61289, '1f514':61162, '1f515':61163, '1f516':61233, '1f517':61313, '1f518':62947, '1f519':62771, '1f51a':62772, '1f51b':62773, '1f51c':62774, '1f51d':62775, '1f51e':62752, '1f51f':62876, '1f520':62877, '1f521':62878, '1f522':62879, '1f523':62880, '1f524':62881, '1f525':41021, '1f526':61215, '1f527':61306, '1f528':61294, '1f529':61308, '1f52a':3803, '1f52b':61301, '1f52c':61323, '1f52d':61324, '1f52e':51082, '1f52f':62787, '1f530':62848, '1f531':62846, '1f532':62949, '1f533':62948, '1f534':62916, '1f535':62920, '1f536':62940, '1f537':62941, '1f538':62942, '1f539':62943, '1f53a':62944, '1f53b':62945, '1f53c':62811, '1f53d':62813, '1f549':62778, '1f54a':2602, '1f54b':4854, '1f54c':4850, '1f54d':4852, '1f54e':62786, '1f550':4955, '1f551':4957, '1f552':4959, '1f553':4961, '1f554':4963, '1f555':4965, '1f556':4967, '1f557':4969, '1f558':4971, '1f559':4973, '1f55a':4975, '1f55b':4953, '1f55c':4956, '1f55d':4958, '1f55e':4960, '1f55f':4962, '1f560':4964, '1f561':4966, '1f562':4968, '1f563':4970, '1f564':4972, '1f565':4974, '1f566':4976, '1f567':4954, '1f56f':61213, '1f570':4952, '1f573':1156, '1f574':1587, '1f575-200d-2640':1497, '1f575-200d-2642':1496, '1f575':1495, '1f576':61111, '1f577':2641, '1f578':2642, '1f579':51087, '1f57a':1586, '1f587':61281, '1f58a':61261, '1f58b':61260, '1f58c':61262, '1f58d':61263, '1f590':1329, '1f595':1348, '1f596':1331, '1f5a4':1148, '1f5a5':61192, '1f5a8':61193, '1f5b1':61195, '1f5b2':61196, '1f5bc':51104, '1f5c2':61268, '1f5c3':61285, '1f5c4':61286, '1f5d1':61287, '1f5d2':61271, '1f5d3':61272, '1f5dc':61310, '1f5dd':61293, '1f5de':61231, '1f5e1':61299, '1f5e3':1683, '1f5e8':1160, '1f5ef':1161, '1f5f3':61257, '1f5fa':4810, '1f5fb':4816, '1f5fc':4847, '1f5fd':4848, '1f5fe':4811, '1f5ff':61362, '1f600':11, '1f601':14, '1f602':18, '1f603':12, '1f604':13, '1f605':16, '1f606':15, '1f607':114, '1f608':1103, '1f609':112, '1f60a':113, '1f60b':124, '1f60c':150, '1f60d':116, '1f60e':170, '1f60f':144, '1f610':139, '1f611':140, '1f612':145, '1f613':195, '1f614':151, '1f615':173, '1f616':192, '1f617':119, '1f618':118, '1f619':122, '1f61a':121, '1f61b':125, '1f61c':126, '1f61d':128, '1f61e':194, '1f61f':175, '1f620':1101, '1f621':1100, '1f622':189, '1f623':193, '1f624':199, '1f625':188, '1f626':184, '1f627':185, '1f628':186, '1f629':196, '1f62a':152, '1f62b':197, '1f62c':147, '1f62d':190, '1f62e-200d-1f4a8':148, '1f62e':178, '1f62f':179, '1f630':187, '1f631':191, '1f632':180, '1f633':181, '1f634':154, '1f635-200d-1f4ab':165, '1f635':164, '1f636-200d-1f32b':143, '1f636':141, '1f637':155, '1f638':1116, '1f639':1117, '1f63a':1115, '1f63b':1118, '1f63c':1119, '1f63d':1120, '1f63e':1123, '1f63f':1122, '1f640':1121, '1f641':176, '1f642':19, '1f643':110, '1f644':146, '1f645-200d-2640':1422, '1f645-200d-2642':1421, '1f645':1420, '1f646-200d-2640':1425, '1f646-200d-2642':1424, '1f646':1423, '1f647-200d-2640':1437, '1f647-200d-2642':1436, '1f647':1435, '1f648':1124, '1f649':1125, '1f64a':1126, '1f64b-200d-2640':1431, '1f64b-200d-2642':1430, '1f64b':1429, '1f64c':1359, '1f64d-200d-2640':1416, '1f64d-200d-2642':1415, '1f64d':1414, '1f64e-200d-2640':1419, '1f64e-200d-2642':1418, '1f64e':1417, '1f64f':1364, '1f680':4942, '1f681':4937, '1f682':4872, '1f683':4873, '1f684':4874, '1f685':4875, '1f686':4876, '1f687':4877, '1f688':4878, '1f689':4879, '1f68a':4880, '1f68b':4883, '1f68c':4884, '1f68d':4885, '1f68e':4886, '1f68f':4911, '1f690':4887, '1f691':4888, '1f692':4889, '1f693':4890, '1f694':4891, '1f695':4892, '1f696':4893, '1f697':4894, '1f698':4895, '1f699':4896, '1f69a':4898, '1f69b':4899, '1f69c':4900, '1f69d':4881, '1f69e':4882, '1f69f':4938, '1f6a0':4939, '1f6a1':4940, '1f6a2':4930, '1f6a3-200d-2640':1609, '1f6a3-200d-2642':1608, '1f6a3':1607, '1f6a4':4926, '1f6a5':4918, '1f6a6':4919, '1f6a7':4921, '1f6a8':4917, '1f6a9':71587, '1f6aa':61333, '1f6ab':62745, '1f6ac':61358, '1f6ad':62747, '1f6ae':62730, '1f6af':62748, '1f6b0':62731, '1f6b1':62749, '1f6b2':4907, '1f6b3':62746, '1f6b4-200d-2640':1621, '1f6b4-200d-2642':1620, '1f6b4':1619, '1f6b5-200d-2640':1624, '1f6b5-200d-2642':1623, '1f6b5':1622, '1f6b6-200d-2640':1566, '1f6b6-200d-2642':1565, '1f6b6':1564, '1f6b7':62750, '1f6b8':62743, '1f6b9':62733, '1f6ba':62734, '1f6bb':62735, '1f6bc':62736, '1f6bd':61340, '1f6be':62737, '1f6bf':61342, '1f6c0':1643, '1f6c1':61343, '1f6c2':62738, '1f6c3':62739, '1f6c4':62740, '1f6c5':62741, '1f6cb':61338, '1f6cc':1644, '1f6cd':61133, '1f6ce':4944, '1f6cf':61337, '1f6d0':62776, '1f6d1':4920, '1f6d2':61357, '1f6d5':4851, '1f6d6':4828, '1f6d7':61334, '1f6e0':61298, '1f6e1':61304, '1f6e2':4914, '1f6e3':4912, '1f6e4':4913, '1f6e5':4929, '1f6e9':4932, '1f6eb':4933, '1f6ec':4934, '1f6f0':4941, '1f6f3':4927, '1f6f4':4908, '1f6f5':4903, '1f6f6':4925, '1f6f7':51076, '1f6f8':4943, '1f6f9':4909, '1f6fa':4906, '1f6fb':4897, '1f6fc':4910, '1f7e0':62917, '1f7e1':62918, '1f7e2':62919, '1f7e3':62921, '1f7e4':62922, '1f7e5':62925, '1f7e6':62929, '1f7e7':62926, '1f7e8':62927, '1f7e9':62928, '1f7ea':62930, '1f7eb':62931, '1f90c':1337, '1f90d':1149, '1f90e':1147, '1f90f':1338, '1f910':137, '1f911':129, '1f912':156, '1f913':171, '1f914':135, '1f915':157, '1f916':1114, '1f917':130, '1f918':1343, '1f919':1344, '1f91a':1328, '1f91b':1356, '1f91c':1357, '1f91d':1363, '1f91e':1340, '1f91f':1342, '1f920':167, '1f921':1108, '1f922':158, '1f923':17, '1f924':153, '1f925':149, '1f926-200d-2640':1440, '1f926-200d-2642':1439, '1f926':1438, '1f927':160, '1f928':138, '1f929':117, '1f92a':127, '1f92b':134, '1f92c':1102, '1f92d':131, '1f92e':159, '1f92f':166, '1f930':1519, '1f931':1522, '1f932':1362, '1f933':1367, '1f934':1506, '1f935-200d-2640':1515, '1f935-200d-2642':1514, '1f935':1513, '1f936':1528, '1f937-200d-2640':1443, '1f937-200d-2642':1442, '1f937':1441, '1f938-200d-2640':1627, '1f938-200d-2642':1626, '1f938':1625, '1f939-200d-2640':1639, '1f939-200d-2642':1638, '1f939':1637, '1f93a':1597, '1f93c-200d-2640':1630, '1f93c-200d-2642':1629, '1f93c':1628, '1f93d-200d-2640':1633, '1f93d-200d-2642':1632, '1f93d':1631, '1f93e-200d-2640':1636, '1f93e-200d-2642':1635, '1f93e':1634, '1f93f':51073, '1f940':2654, '1f941':61180, '1f942':3791, '1f943':3792, '1f944':3802, '1f945':51069, '1f947':51048, '1f948':51049, '1f949':51050, '1f94a':51067, '1f94b':51068, '1f94c':51077, '1f94d':51064, '1f94e':51053, '1f94f':51059, '1f950':3710, '1f951':3693, '1f952':3700, '1f953':3721, '1f954':3695, '1f955':3696, '1f956':3711, '1f957':3738, '1f958':3734, '1f959':3730, '1f95a':3732, '1f95b':3780, '1f95c':3706, '1f95d':3689, '1f95e':3715, '1f95f':3757, '1f960':3758, '1f961':3759, '1f962':3799, '1f963':3737, '1f964':3794, '1f965':3692, '1f966':3702, '1f967':3773, '1f968':3713, '1f969':3720, '1f96a':3726, '1f96b':3742, '1f96c':3701, '1f96d':3681, '1f96e':3755, '1f96f':3714, '1f970':115, '1f971':198, '1f972':123, '1f973':168, '1f974':163, '1f975':161, '1f976':162, '1f977':1501, '1f978':169, '1f97a':182, '1f97b':61124, '1f97c':61113, '1f97d':61112, '1f97e':61138, '1f97f':61139, '1f980':3760, '1f981':2545, '1f982':2643, '1f983':2594, '1f984':2551, '1f985':2603, '1f986':2604, '1f987':2583, '1f988':2628, '1f989':2606, '1f98a':2540, '1f98b':2633, '1f98c':2553, '1f98d':2532, '1f98e':2615, '1f98f':2572, '1f990':3762, '1f991':3763, '1f992':2569, '1f993':2552, '1f994':2582, '1f995':2619, '1f996':2620, '1f997':2639, '1f998':2591, '1f999':2568, '1f99a':2610, '1f99b':2573, '1f99c':2611, '1f99d':2541, '1f99e':3761, '1f99f':2644, '1f9a0':2647, '1f9a1':2592, '1f9a2':2605, '1f9a3':2571, '1f9a4':2607, '1f9a5':2588, '1f9a6':2589, '1f9a7':2533, '1f9a8':2590, '1f9a9':2609, '1f9aa':3764, '1f9ab':2581, '1f9ac':2554, '1f9ad':2624, '1f9ae':2536, '1f9af':61312, '1f9b4':1380, '1f9b5':1371, '1f9b6':1372, '1f9b7':1379, '1f9b8-200d-2640':1532, '1f9b8-200d-2642':1531, '1f9b8':1530, '1f9b9-200d-2640':1535, '1f9b9-200d-2642':1534, '1f9b9':1533, '1f9ba':61114, '1f9bb':1374, '1f9bc':4905, '1f9bd':4904, '1f9be':1369, '1f9bf':1370, '1f9c0':3717, '1f9c1':3772, '1f9c2':3741, '1f9c3':3796, '1f9c4':3703, '1f9c5':3704, '1f9c6':3731, '1f9c7':3716, '1f9c8':3740, '1f9c9':3797, '1f9ca':3798, '1f9cb':3795, '1f9cd-200d-2640':1569, '1f9cd-200d-2642':1568, '1f9cd':1567, '1f9ce-200d-2640':1572, '1f9ce-200d-2642':1571, '1f9ce':1570, '1f9cf-200d-2640':1434, '1f9cf-200d-2642':1433, '1f9cf':1432, '1f9d0':172, '1f9d1-200d-1f33e':1456, '1f9d1-200d-1f373':1459, '1f9d1-200d-1f37c':1525, '1f9d1-200d-1f384':1529, '1f9d1-200d-1f393':1447, '1f9d1-200d-1f3a4':1477, '1f9d1-200d-1f3a8':1480, '1f9d1-200d-1f3eb':1450, '1f9d1-200d-1f3ed':1465, '1f9d1-200d-1f4bb':1474, '1f9d1-200d-1f4bc':1468, '1f9d1-200d-1f527':1462, '1f9d1-200d-1f52c':1471, '1f9d1-200d-1f680':1486, '1f9d1-200d-1f692':1489, '1f9d1-200d-1f91d-200d-1f9d1':1645, '1f9d1-200d-1f9af':1573, '1f9d1-200d-1f9b0':1402, '1f9d1-200d-1f9b1':1404, '1f9d1-200d-1f9b2':1408, '1f9d1-200d-1f9b3':1406, '1f9d1-200d-1f9bc':1576, '1f9d1-200d-1f9bd':1579, '1f9d1-200d-2695':1444, '1f9d1-200d-2696':1453, '1f9d1-200d-2708':1483, '1f9d1':1390, '1f9d2':1387, '1f9d3':1411, '1f9d4-200d-2640':1395, '1f9d4-200d-2642':1394, '1f9d4':1393, '1f9d5':1512, '1f9d6-200d-2640':1593, '1f9d6-200d-2642':1592, '1f9d6':1591, '1f9d7-200d-2640':1596, '1f9d7-200d-2642':1595, '1f9d7':1594, '1f9d8-200d-2640':1642, '1f9d8-200d-2642':1641, '1f9d8':1640, '1f9d9-200d-2640':1538, '1f9d9-200d-2642':1537, '1f9d9':1536, '1f9da-200d-2640':1541, '1f9da-200d-2642':1540, '1f9da':1539, '1f9db-200d-2640':1544, '1f9db-200d-2642':1543, '1f9db':1542, '1f9dc-200d-2640':1547, '1f9dc-200d-2642':1546, '1f9dc':1545, '1f9dd-200d-2640':1550, '1f9dd-200d-2642':1549, '1f9dd':1548, '1f9de-200d-2640':1553, '1f9de-200d-2642':1552, '1f9de':1551, '1f9df-200d-2640':1556, '1f9df-200d-2642':1555, '1f9df':1554, '1f9e0':1376, '1f9e1':1142, '1f9e2':61148, '1f9e3':61118, '1f9e4':61119, '1f9e5':61120, '1f9e6':61121, '1f9e7':51039, '1f9e8':51028, '1f9e9':51090, '1f9ea':61320, '1f9eb':61321, '1f9ec':61322, '1f9ed':4812, '1f9ee':61201, '1f9ef':61356, '1f9f0':61316, '1f9f1':4825, '1f9f2':61317, '1f9f3':4945, '1f9f4':61346, '1f9f5':51106, '1f9f6':51108, '1f9f7':61347, '1f9f8':51091, '1f9f9':61348, '1f9fa':61349, '1f9fb':61350, '1f9fc':61352, '1f9fd':61355, '1f9fe':61243, '1f9ff':51084, '1fa70':61142, '1fa71':61125, '1fa72':61126, '1fa73':61127, '1fa74':61135, '1fa78':61327, '1fa79':61329, '1fa7a':61331, '1fa80':51079, '1fa81':51080, '1fa82':4935, '1fa83':61302, '1fa84':51083, '1fa85':51092, '1fa86':51094, '1fa90':4993, '1fa91':61339, '1fa92':61345, '1fa93':61295, '1fa94':61217, '1fa95':61179, '1fa96':61149, '1fa97':61174, '1fa98':61181, '1fa99':61236, '1fa9a':61305, '1fa9b':61307, '1fa9c':61318, '1fa9d':61315, '1fa9e':61335, '1fa9f':61336, '1faa0':61341, '1faa1':51107, '1faa2':51109, '1faa3':61351, '1faa4':61344, '1faa5':61354, '1faa6':61360, '1faa7':61363, '1faa8':4826, '1fab0':2645, '1fab1':2646, '1fab2':2637, '1fab3':2640, '1fab4':2660, '1fab5':4827, '1fab6':2608, '1fac0':1377, '1fac1':1378, '1fac2':1686, '1fad0':3688, '1fad1':3699, '1fad2':3691, '1fad3':3712, '1fad4':3729, '1fad5':3736, '1fad6':3782, '203c':62834, '21a9':62765, '21aa':62766, '231a':4948, '231b':4946, '23cf':62818, '23e9':62805, '23ea':62809, '23eb':62812, '23ec':62814, '23ed':62806, '23ee':62810, '23ef':62807, '23f0':4949, '23f1':4950, '23f2':4951, '23f3':4947, '23f8':62815, '23f9':62816, '23fa':62817, '24c2':62890, '25aa':62938, '25ab':62939, '25b6':62804, '25c0':62808, '25fb':62935, '25fc':62934, '25fd':62937, '25fe':62936, '260e':61184, '261d':1350, '262a':62784, '262e':62785, '262f':62781, '263a':120, '264a':62790, '264b':62791, '264c':62792, '264d':62793, '264e':62794, '264f':62795, '265f':51099, '267b':62844, '267e':62833, '267f':62732, '269b':62777, '269c':62845, '26a0':62742, '26a1':41016, '26a7':62827, '26aa':62924, '26ab':62923, '26b0':61359, '26b1':61361, '26bd':51051, '26be':51052, '26c4':41019, '26c5':4999, '26c8':41000, '26ce':62800, '26cf':61296, '26d1':61150, '26d3':61314, '26d4':62744, '26e9':4853, '26ea':4849, '26f0':4814, '26f1':41015, '26f2':4855, '26f3':51070, '26f4':4928, '26f5':4924, '26f7':1599, '26f8':51071, '26f9-200d-2640':1615, '26f9-200d-2642':1614, '26f9':1613, '26fa':4856, '26fd':4915, '270a':1354, '270b':1330, '270c':1339, '270d':1365, '270f':61258, '271d':62782, '274c':62853, '274e':62854, '2764-200d-1f525':1139, '2764-200d-1fa79':1140, '27a1':62757, '27b0':62855, '27bf':62856, '2b05':62761, '2b06':62755, '2b07':62759, '2b1b':62932, '2b1c':62933, '2b50':4994, '2b55':62849, '303d':62857, '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-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff':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-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3ff':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, '1f48f-1f3fb':0, '1f48f-1f3fc':0, '1f48f-1f3fd':0, '1f48f-1f3fe':0, '1f48f-1f3ff':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f491-1f3fb':0, '1f491-1f3fc':0, '1f491-1f3fd':0, '1f491-1f3fe':0, '1f491-1f3ff':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fe':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fe':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fe':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fe':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, '1f91d-1f3fb':0, '1f91d-1f3fc':0, '1f91d-1f3fd':0, '1f91d-1f3fe':0, '1f91d-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-200d-2640':0, '1f9d4-1f3fc-200d-2640':0, '1f9d4-1f3fd-200d-2640':0, '1f9d4-1f3fe-200d-2640':0, '1f9d4-1f3ff-200d-2640':0, '1f9d4-1f3fb-200d-2642':0, '1f9d4-1f3fc-200d-2642':0, '1f9d4-1f3fd-200d-2642':0, '1f9d4-1f3fe-200d-2642':0, '1f9d4-1f3ff-200d-2642':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}};\n\nconst Emoji: {[emoji: string]: number} = EmojiVersions[''];\nfor(const version in EmojiVersions) {\n if(version) {\n Object.assign(Emoji, EmojiVersions[version as EMOJI_VERSION]);\n }\n}\n\nexport default Emoji;\n\n/* Emoji[\"00a9-fe0f\"] = 6362;\nEmoji[\"00ae-fe0f\"] = 6363;\nEmoji[\"2122-fe0f\"] = 6364; */\n","/*\n * 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 './ctx';\n\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\n\n// https://stackoverflow.com/a/58065241\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\n !(ctx as any).MSStream;\n\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 */;\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\n\nexport const IS_MOBILE = (navigator.maxTouchPoints === undefined || 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;\n","/*\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 LatinizeMap from '../config/latinizeMap';\n\nexport const badCharsRe = /[`~!@#$%^&*()\\-_=+\\[\\]\\\\|{}'\";:\\/?.>,<]+/g;\nconst trimRe = /^\\s+|\\s$/g;\n\nconst C2L: {[k: string]: string} = {\n 'ะน': 'q',\n 'ั†': 'w',\n 'ัƒ': 'e',\n 'ะบ': 'r',\n 'ะต': 't',\n 'ะฝ': 'y',\n 'ะณ': 'u',\n 'ัˆ': 'i',\n 'ั‰': 'o',\n 'ะท': 'p',\n 'ั…': '[',\n 'ัŠ': ']',\n 'ั„': 'a',\n 'ั‹': 's',\n 'ะฒ': 'd',\n 'ะฐ': 'f',\n 'ะฟ': 'g',\n 'ั€': 'h',\n 'ะพ': 'j',\n 'ะป': 'k',\n 'ะด': 'l',\n 'ะถ': ';',\n 'ั': '\\'',\n 'ั': 'z',\n 'ั‡': 'x',\n 'ั': 'c',\n 'ะผ': 'v',\n 'ะธ': 'b',\n 'ั‚': 'n',\n 'ัŒ': 'm',\n 'ะฑ': ',',\n 'ัŽ': '.',\n '.': '/'\n};\n\nexport function clearBadCharsAndTrim(text: string) {\n return text.replace(badCharsRe, '').replace(trimRe, '');\n}\n\nexport function fixCyrillic(text: string) {\n return text.toLowerCase().replace(/[\\wะฐ-ั]/g, (ch) => {\n const latinizeCh = C2L[ch];\n return latinizeCh ?? ch;\n });\n}\n\nexport function latinizeString(text: string) {\n return text.replace(/[^A-Za-z0-9]/g, (ch) => {\n const latinizeCh = LatinizeMap[ch];\n return latinizeCh ?? ch;\n });\n}\n\nexport default function cleanSearchText(text: string, latinize = true) {\n return processSearchText(text, {\n clearBadChars: true,\n latinize,\n ignoreCase: true\n });\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 const originalText = text;\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 if(options.latinize) text += '\\x01' + fixCyrillic(originalText);\n return text;\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 {InputFileLocation, InputStickerSet, InputWebFileLocation} from '../layer';\nimport type {DownloadOptions} from '../lib/mtproto/apiFileManager';\n\nconst FILENAME_JOINER = '_';\n\nexport function getFileNameByLocation(location: InputFileLocation | InputWebFileLocation, options?: Partial<{\n fileName: string,\n downloadId: string\n}>) {\n const fileName = '';// (options?.fileName || '').split('.');\n const ext = fileName[fileName.length - 1] || '';\n\n let str: string;\n switch(location._) {\n case 'inputPhotoFileLocation': {\n str = ['photo', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\n break;\n }\n\n case 'inputDocumentFileLocation': {\n str = ['document', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\n break;\n }\n\n case 'inputPeerPhotoFileLocation':\n str = ['peerPhoto', location.photo_id, location.pFlags.big ? 'big' : 'small'].join(FILENAME_JOINER);\n break;\n\n case 'inputStickerSetThumb': {\n const id = (location.stickerset as InputStickerSet.inputStickerSetID).id ||\n (location.stickerset as InputStickerSet.inputStickerSetShortName).short_name ||\n (location.stickerset as InputStickerSet.inputStickerSetDice).emoticon ||\n location.stickerset._;\n str = ['stickerSetThumb', id, location.thumb_version].join(FILENAME_JOINER);\n break;\n }\n\n case 'inputFileLocation': {\n str = [location.volume_id, location.local_id].join(FILENAME_JOINER);\n break;\n }\n\n case 'inputWebFileLocation': {\n str = ['webFile', location.url].join(FILENAME_JOINER);\n break;\n }\n\n default: {\n console.error('Unrecognized location:', location);\n str = '';\n break;\n }\n }\n\n return str + (options?.downloadId ? '_download' : '') + (ext ? '.' + ext : ext);\n}\n\nexport type FileURLType = 'photo' | 'thumb' | 'document' | 'stream' | 'download';\nexport function getFileURL(type: FileURLType, options: DownloadOptions) {\n // console.log('getFileURL', location);\n // const perf = performance.now();\n const encoded = encodeURIComponent(JSON.stringify(options));\n // console.log('getFileURL encode:', performance.now() - perf, encoded);\n\n return /* '/' + */type + '/' + encoded;\n}\n","import {RestrictionReason} from '../layer';\n\nconst platforms = new Set([\n 'all',\n 'web',\n 'webk'\n]);\n\nconst ignore = new Set();\n\nexport function getRestrictionReason(reasons: RestrictionReason[]) {\n // return reasons[0];\n return reasons.find((reason) => platforms.has(reason.platform) && !ignore.has(reason.reason));\n}\n\nexport function isRestricted(reasons: RestrictionReason[]) {\n return !!getRestrictionReason(reasons);\n}\n\nexport function ignoreRestrictionReasons(reasons: string[]) {\n ignore.clear();\n reasons.forEach((reason) => {\n ignore.add(reason);\n });\n}\n","import isObject from '../../../../helpers/object/isObject';\nimport {InputChannel, InputPeer, Peer} from '../../../../layer';\nimport {NULL_PEER_ID} from '../../../mtproto/mtproto_config';\n\nexport default function getPeerId(peerId: {user_id: UserId} | {channel_id: ChatId} | {chat_id: ChatId} | InputPeer | InputChannel | PeerId | string): PeerId {\n if(peerId !== undefined && ((peerId as string).isPeerId ? (peerId as string).isPeerId() : false)) return peerId as PeerId;\n // if(typeof(peerId) === 'string' && /^[uc]/.test(peerId)) return peerId as PeerId;\n // if(typeof(peerId) === 'number') return peerId;\n else if(isObject(peerId)) {\n const userId = (peerId as Peer.peerUser).user_id;\n if(userId !== undefined) {\n return userId.toPeerId(false);\n }\n\n const chatId = (peerId as Peer.peerChannel).channel_id || (peerId as Peer.peerChat).chat_id;\n if(chatId !== undefined) {\n return chatId.toPeerId(true);\n }\n\n return NULL_PEER_ID; // maybe it is an inputPeerSelf\n // } else if(!peerId) return 'u0';\n } else if(!peerId) return NULL_PEER_ID;\n\n const isUser = (peerId as string).charAt(0) === 'u';\n const peerParams = (peerId as string).substr(1).split('_');\n\n return isUser ? peerParams[0].toPeerId() : (peerParams[0] || '').toPeerId(true);\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 {Database} from '../../config/databases';\nimport Modes from '../../config/modes';\nimport makeError from '../../helpers/makeError';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {logger} from '../logger';\n\n/**\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\n */\nexport type IDBIndex = {\n indexName: string,\n keyPath: string,\n objectParameters: IDBIndexParameters\n};\n\nexport type IDBStore = {\n name: string,\n indexes?: IDBIndex[]\n};\n\nexport type IDBOptions = {\n name?: string,\n storeName: string,\n stores?: IDBStore[],\n version?: number\n};\n\nconst DEBUG = false;\n\nexport class IDB {\n private static INSTANCES: IDB[] = [];\n private openDbPromise: Promise;\n private db: IDBDatabase;\n private storageIsAvailable: boolean;\n private log: ReturnType;\n private name: string;\n private version: number;\n private stores: IDBStore[];\n\n constructor(db: Database) {\n safeAssign(this, db);\n\n if(Modes.test) {\n this.name += '_test';\n }\n\n this.storageIsAvailable = true;\n this.log = logger(['IDB', db.name].join('-'));\n this.log('constructor');\n\n this.openDatabase(true);\n\n IDB.INSTANCES.push(this);\n }\n\n public isAvailable() {\n return this.storageIsAvailable;\n }\n\n public openDatabase(createNew = false): Promise {\n if(this.openDbPromise && !createNew) {\n return this.openDbPromise;\n }\n\n const createIndexes = (os: IDBObjectStore, store: IDBStore) => {\n const indexNames = Array.from(os.indexNames);\n for(const indexName of indexNames) {\n os.deleteIndex(indexName);\n }\n\n if(!store.indexes?.length) {\n return;\n }\n\n for(const index of store.indexes) {\n if(os.indexNames.contains(index.indexName)) {\n continue;\n }\n\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\n }\n };\n\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\n const os = db.createObjectStore(store.name);\n createIndexes(os, store);\n };\n\n try {\n var request = indexedDB.open(this.name, this.version);\n\n if(!request) {\n return Promise.reject();\n }\n } catch(error) {\n this.log.error('error opening db', (error as Error).message);\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n let finished = false;\n setTimeout(() => {\n if(!finished) {\n request.onerror(makeError('IDB_CREATE_TIMEOUT') as Event);\n }\n }, 3000);\n\n return this.openDbPromise = new Promise((resolve, reject) => {\n request.onsuccess = (event) => {\n finished = true;\n const db = request.result;\n let calledNew = false;\n\n this.log('Opened');\n\n db.onerror = (error) => {\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', error);\n reject(error);\n };\n\n db.onclose = (e) => {\n this.log.error('closed:', e);\n !calledNew && this.openDatabase();\n };\n\n db.onabort = (e) => {\n this.log.error('abort:', e);\n const transaction = e.target as IDBTransaction;\n\n this.openDatabase(calledNew = true);\n\n if(transaction.onerror) {\n transaction.onerror(e);\n }\n\n db.close();\n };\n\n db.onversionchange = (e) => {\n this.log.error('onversionchange, lol?');\n };\n\n resolve(this.db = db);\n };\n\n request.onerror = (event) => {\n finished = true;\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', event);\n reject(event);\n };\n\n request.onupgradeneeded = (event) => {\n finished = true;\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\n\n const target = event.target as IDBOpenDBRequest;\n const db = target.result;\n this.stores.forEach((store) => {\n /* if(db.objectStoreNames.contains(store.name)) {\n //if(event.oldVersion === 1) {\n db.deleteObjectStore(store.name);\n //}\n } */\n\n if(!db.objectStoreNames.contains(store.name)) {\n createObjectStore(db, store);\n } else {\n const txn = target.transaction;\n const os = txn.objectStore(store.name);\n createIndexes(os, store);\n }\n });\n };\n });\n }\n\n public static create>(db: T) {\n return this.INSTANCES.find((instance) => instance.name === db.name) ?? new IDB(db);\n }\n\n public static closeDatabases(preserve?: IDB) {\n this.INSTANCES.forEach((storage) => {\n if(preserve && preserve === storage) {\n return;\n }\n\n const db = storage.db;\n if(db) {\n db.onclose = () => {};\n db.close();\n }\n });\n }\n}\n\nexport default class IDBStorage, StoreName extends string = T['stores'][0]['name']> {\n private log: ReturnType;\n private storeName: T['stores'][0]['name'];\n private idb: IDB;\n\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\n this.storeName = storeName;\n this.log = logger(['IDB', db.name, storeName].join('-'));\n this.idb = IDB.create(db);\n }\n\n /**\n * ! WARNING ! function requires at least one opened connection\n */\n /* public static clearObjectStores() {\n const storage = this.STORAGES[0];\n this.closeDatabases(storage);\n\n const names = Array.from(storage.db.objectStoreNames);\n const promises = names.map((name) => storage.clear(name));\n return Promise.all(promises);\n } */\n\n /* public static deleteDatabase() {\n this.closeDatabases();\n\n const storages = this.STORAGES;\n const dbNames = Array.from(new Set(storages.map((storage) => storage.name)));\n const promises = dbNames.map((dbName) => {\n return new Promise((resolve, reject) => {\n const deleteRequest = indexedDB.deleteDatabase(dbName);\n\n deleteRequest.onerror = () => {\n reject();\n };\n\n deleteRequest.onsuccess = () => {\n resolve();\n };\n });\n });\n\n return Promise.all(promises);\n } */\n\n public delete(entryName: string | string[], storeName?: StoreName): Promise {\n // return Promise.resolve();\n const isArray = Array.isArray(entryName);\n if(!isArray) {\n entryName = [].concat(entryName);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n const promises = (entryName as string[]).map((entryName) => objectStore.delete(entryName));\n return isArray ? promises : promises[0];\n }, DEBUG ? 'delete: ' + (entryName as string[]).join(', ') : '', storeName);\n }\n\n public clear(storeName?: StoreName): Promise {\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\n }\n\n public save(entryName: string | string[], value: any | any[], storeName?: StoreName) {\n // const handleError = (error: Error) => {\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\n // setTimeout(() => {\n // this.save(entryName, value);\n // }, 2e3);\n // } else {\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\n // }\n // };\n\n const isArray = Array.isArray(entryName);\n if(!isArray) {\n entryName = [].concat(entryName);\n value = [].concat(value);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n const promises = (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\n return isArray ? promises : promises[0];\n }, DEBUG ? 'save: ' + (entryName as string[]).join(', ') : '', storeName);\n }\n\n // public saveFile(fileName: string, blob: Blob | Uint8Array) {\n // //return Promise.resolve(blobConstruct([blob]));\n // if(!(blob instanceof Blob)) {\n // blob = blobConstruct(blob);\n // }\n\n // return this.save(fileName, blob);\n // }\n\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\n return Promise.reject();\n }\n\n if(!(blob instanceof Blob)) {\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\n return this.storagePutB64String(db, fileName, address).then(() => {\n return blob;\n });\n }\n\n try {\n var reader = new FileReader();\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n let promise = new Promise((resolve, reject) => {\n reader.onloadend = () => {\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\n resolve(blob);\n }, reject);\n }\n\n reader.onerror = reject;\n });\n\n\n try {\n reader.readAsDataURL(blob);\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n return promise;\n }\n\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\n try {\n var objectStore = db.transaction([this.storeName], 'readwrite')\n .objectStore(this.storeName);\n var request = objectStore.put(b64string, fileName);\n } catch(error) {\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n resolve();\n };\n\n request.onerror = reject;\n });\n }\n\n public getBlobSize(blob: any) {\n return blob.size || blob.byteLength || blob.length;\n } */\n\n public get(entryName: string[], storeName?: StoreName): Promise;\n public get(entryName: string, storeName?: StoreName): Promise;\n public get(entryName: string | string[], storeName?: StoreName): Promise | Promise {\n // return Promise.reject();\n\n const isArray = Array.isArray(entryName);\n if(!isArray) {\n if(!entryName) {\n return undefined;\n }\n\n entryName = [].concat(entryName);\n } else if(!entryName.length) {\n return Promise.resolve([]) as any;\n }\n\n return this.getObjectStore('readonly', (objectStore) => {\n const promises = (entryName as string[]).map((entryName) => objectStore.get(entryName));\n return isArray ? promises : promises[0];\n }, DEBUG ? 'get: ' + (entryName as string[]).join(', ') : '', storeName);\n }\n\n private getObjectStore(\n mode: IDBTransactionMode,\n callback: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[],\n log?: string,\n storeName = this.storeName\n ) {\n let perf: number;\n\n if(log) {\n perf = performance.now();\n this.log(log + ': start');\n }\n\n return this.idb.openDatabase().then((db) => {\n return new Promise((resolve, reject) => {\n /* if(mode === 'readwrite') {\n return;\n } */\n\n const transaction = db.transaction([storeName], mode);\n\n const onError = () => {\n clearTimeout(timeout);\n reject(transaction.error);\n };\n\n // let resolved = false;\n const onComplete = (/* what: string */) => {\n clearTimeout(timeout);\n\n if(log) {\n this.log(log + ': end', performance.now() - perf/* , what */);\n }\n\n // if(resolved) {\n // return;\n // }\n\n // resolved = true;\n const results = requests.map((r) => r.result);\n resolve(isArray ? results : results[0]);\n };\n\n transaction.onerror = onError;\n\n // * have to wait while clearing or setting something\n const waitForTransactionComplete = mode === 'readwrite';\n if(waitForTransactionComplete) {\n transaction.oncomplete = () => onComplete(/* 'transaction' */);\n }\n\n const timeout = setTimeout(() => {\n this.log.error('transaction not finished', transaction, log);\n }, 10000);\n\n /* transaction.addEventListener('abort', (e) => {\n //handleError();\n this.log.error('IndexedDB: transaction abort!', transaction.error);\n }); */\n\n const callbackResult = callback(transaction.objectStore(storeName));\n\n const isArray = Array.isArray(callbackResult);\n const requests: IDBRequest[] = isArray ? callbackResult : [].concat(callbackResult) as any;\n\n if(waitForTransactionComplete) {\n return;\n }\n\n const length = requests.length;\n let left = length;\n\n const onRequestFinished = () => {\n if(transaction.error) {\n return;\n }\n\n if(!--left) {\n onComplete(/* 'requests' */);\n }\n };\n\n for(let i = 0; i < length; ++i) {\n const request = requests[i];\n request.onerror = onError;\n request.onsuccess = onRequestFinished;\n }\n });\n });\n }\n\n public getAll(storeName?: StoreName): Promise {\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '', storeName);\n }\n\n /* public getAllKeys(): Promise> {\n console.time('getAllEntries');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.getAllKeys();\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var result = event.target.result;\n resolve(result);\n console.timeEnd('getAllEntries');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public isFileExists(fileName: string): Promise {\n console.time('isFileExists');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.openCursor(fileName);\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var cursor = event.target.result;\n resolve(!!cursor);\n console.timeEnd('isFileExists');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public getFileWriter(fileName: string, mimeType: string) {\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\n return this.saveFile(fileName, blob);\n });\n\n return Promise.resolve(fakeWriter);\n } */\n}\n","import type ENVIRONMENT from '.';\n\nlet environment: typeof ENVIRONMENT;\nexport function getEnvironment() {\n return environment;\n}\n\nexport function setEnvironment(env: typeof environment) {\n return environment = env;\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 {Message, StickerSet, Update, NotifyPeer, PeerNotifySettings, PollResults, Poll, WebPage, GroupCall, GroupCallParticipant, ReactionCount, MessagePeerReaction, PhoneCall, Config, Reaction} from '../layer';\nimport type {Dialog, ForumTopic, MessagesStorageKey, MyMessage} from './appManagers/appMessagesManager';\nimport type {MyDialogFilter} from './storages/filters';\nimport type {Folder} from './storages/dialogs';\nimport type {UserTyping} from './appManagers/appProfileManager';\nimport type {MyDraftMessage} from './appManagers/appDraftsManager';\nimport type {ConnectionStatusChange} from './mtproto/connectionStatus';\nimport type {GroupCallId} from './appManagers/appGroupCallsManager';\nimport type {AppManagers} from './appManagers/managers';\nimport type {State} from '../config/state';\nimport type {Progress} from './appManagers/appDownloadManager';\nimport type {CallId} from './appManagers/appCallsManager';\nimport type {MyDocument} from './appManagers/appDocsManager';\nimport type {MTAppConfig} from './mtproto/appConfig';\nimport {NULL_PEER_ID, UserAuth} from './mtproto/mtproto_config';\nimport EventListenerBase from '../helpers/eventListenerBase';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport MTProtoMessagePort from './mtproto/mtprotoMessagePort';\nimport {IS_WORKER} from '../helpers/context';\n\nexport type BroadcastEvents = {\n 'chat_full_update': ChatId,\n 'chat_update': ChatId,\n 'chat_toggle_forum': {chatId: ChatId, enabled: boolean},\n\n 'channel_update': ChatId,\n\n 'user_update': UserId,\n 'user_auth': UserAuth,\n 'user_full_update': UserId,\n\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, threadId?: number, typings: UserTyping[]},\n 'peer_block': {peerId: PeerId, blocked: boolean},\n 'peer_title_edit': {peerId: PeerId, threadId?: number},\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': Omit,\n\n 'dialog_draft': {peerId: PeerId, dialog: Dialog | ForumTopic, drop: boolean, draft: MyDraftMessage | undefined},\n 'dialog_unread': {peerId: PeerId, dialog: Dialog | ForumTopic},\n 'dialog_flush': {peerId: PeerId, dialog: Dialog},\n 'dialog_drop': Dialog | ForumTopic,\n 'dialog_migrate': {migrateFrom: PeerId, migrateTo: PeerId},\n // 'dialog_top': Dialog,\n 'dialog_notify_settings': Dialog | ForumTopic,\n // 'dialog_order': {dialog: Dialog, pos: number},\n 'dialogs_multiupdate': Map}>,\n\n 'history_append': {storageKey: MessagesStorageKey, message: Message.message},\n 'history_update': {storageKey: MessagesStorageKey, message: MyMessage, sequential?: boolean},\n 'history_reply_markup': {peerId: PeerId},\n 'history_multiappend': MyMessage,\n 'history_delete': {peerId: PeerId, msgs: Set},\n 'history_forbidden': PeerId,\n 'history_reload': PeerId,\n // 'history_request': void,\n\n 'message_edit': {storageKey: MessagesStorageKey, peerId: PeerId, mid: number, message: MyMessage},\n 'message_sent': {storageKey: MessagesStorageKey, tempId: number, tempMessage: any, mid: number, message: MyMessage},\n 'message_error': {storageKey: MessagesStorageKey, tempId: number, error: ApiError},\n 'messages_views': {peerId: PeerId, mid: number, views: number}[],\n 'messages_reactions': {message: Message.message, changedResults: ReactionCount[]}[],\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': Message.message,\n 'scheduled_delete': {peerId: PeerId, mids: number[]},\n\n 'album_edit': {peerId: PeerId, groupId: string, deletedMids: number[], messages: Message.message[]},\n\n 'stickers_installed': StickerSet.stickerSet,\n 'stickers_deleted': StickerSet.stickerSet,\n 'stickers_updated': {type: 'recent' | 'faved', stickers: MyDocument[]},\n 'stickers_top': Long,\n 'sticker_updated': {type: 'recent' | 'faved', document: MyDocument, faved: boolean},\n\n 'state_cleared': void,\n 'state_synchronized': ChatId | void,\n 'state_synchronizing': ChatId | void,\n\n 'contacts_update': UserId,\n 'avatar_update': {peerId: PeerId, threadId?: number},\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, settings: State['settings']},\n 'draft_updated': {peerId: PeerId, threadId: number, draft: MyDraftMessage | undefined, force?: 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 'notification_reset': string,\n 'notification_cancel': string,\n\n 'language_change': string,\n\n 'theme_change': void,\n\n 'media_play': void,\n\n 'emoji_recent': AppEmoji,\n\n 'download_progress': Progress,\n 'document_downloading': DocId,\n 'document_downloaded': DocId,\n\n 'choosing_sticker': boolean\n\n 'group_call_update': GroupCall,\n 'group_call_participant': {groupCallId: GroupCallId, participant: GroupCallParticipant},\n // 'group_call_video_track_added': {instance: GroupCallInstance}\n\n 'call_update': PhoneCall,\n 'call_signaling': {callId: CallId, data: Uint8Array},\n\n 'quick_reaction': Reaction,\n\n 'service_notification': Update.updateServiceNotification,\n\n 'logging_out': void,\n\n 'payment_sent': {peerId: PeerId, mid: number, receiptMessage: Message.messageService}\n\n 'premium_toggle': boolean,\n 'premium_toggle_private': {isNew: boolean, isPremium: boolean},\n\n 'config': Config,\n 'app_config': MTAppConfig\n};\n\nexport type BroadcastEventsListeners = {\n [name in keyof BroadcastEvents]: (e: BroadcastEvents[name]) => void\n};\n\nexport class RootScope extends EventListenerBase {\n public myId: PeerId;\n private connectionStatus: {[name: string]: ConnectionStatusChange};\n public settings: State['settings'];\n public managers: AppManagers;\n public premium: boolean;\n\n constructor() {\n super();\n\n this.myId = NULL_PEER_ID;\n this.connectionStatus = {};\n this.premium = false;\n\n this.addEventListener('user_auth', ({id}) => {\n this.myId = id.toPeerId();\n });\n\n this.addEventListener('premium_toggle_private', ({isNew, isPremium}) => {\n this.premium = isPremium;\n\n if(!isNew) {\n this.dispatchEventSingle('premium_toggle', isPremium);\n }\n });\n\n this.addEventListener('connection_status_change', (status) => {\n this.connectionStatus[status.name] = status;\n });\n\n this.dispatchEvent = (e, ...args) => {\n super.dispatchEvent(e, ...args);\n MTProtoMessagePort.getInstance().invokeVoid('event', {name: e as string, args});\n };\n\n if(!IS_WORKER) {\n this.addEventListener('settings_updated', ({settings}) => {\n this.settings = settings;\n });\n }\n }\n\n public getConnectionStatus() {\n return this.connectionStatus;\n }\n\n public getPremium() {\n return this.premium;\n }\n\n public dispatchEventSingle(...args: any[]) {\n // @ts-ignore\n super.dispatchEvent(...args);\n }\n}\n\nconst rootScope = new RootScope();\nMOUNT_CLASS_TO.rootScope = rootScope;\nexport default rootScope;\n","/*\n * 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 {State} from '../../config/state';\nimport rootScope from '../rootScope';\nimport stateStorage from '../stateStorage';\nimport setDeepProperty from '../../helpers/object/setDeepProperty';\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\n\nexport class AppStateManager {\n private state: State = {} as any;\n private storage = stateStorage;\n\n // ! for mtproto worker use only\n public newVersion: string;\n public oldVersion: string;\n public userId: UserId;\n\n public getState() {\n return Promise.resolve(this.state);\n }\n\n public setByKey(key: string, value: any) {\n setDeepProperty(this.state, key, value);\n\n const first = key.split('.')[0] as keyof State;\n if(first === 'settings') {\n rootScope.dispatchEvent('settings_updated', {key, value, settings: this.state.settings});\n }\n\n this.pushToState(first, this.state[first]);\n }\n\n public pushToState(key: T, value: State[T], direct = true, onlyLocal?: boolean) {\n if(direct) {\n this.state[key] = value;\n }\n\n this.setKeyValueToStorage(key, value, onlyLocal);\n }\n\n public setKeyValueToStorage(key: T, value: State[T] = this.state[key], onlyLocal?: boolean) {\n MTProtoMessagePort.getInstance().invokeVoid('mirror', {name: 'state', key, value});\n\n this.storage.set({\n [key]: value\n }, onlyLocal);\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\nconst appStateManager = new AppStateManager();\nexport default appStateManager;\n","import getDeepProperty from './getDeepProperty';\n\nexport default function setDeepProperty(object: any, key: string, value: any) {\n const splitted = key.split('.');\n getDeepProperty(object, splitted.slice(0, -1).join('.'))[splitted.pop()] = value;\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 pause from '../../../helpers/schedulers/pause';\nimport {DcId} from '../../../types';\nimport {logger, LogTypes} from '../../logger';\nimport type MTPNetworker from '../networker';\nimport MTTransport from './transport';\nimport Modes from '../../../config/modes';\n\n \nimport transportController from './controller';\n// import networkStats from '../networkStats';\n \n\nexport default class HTTP implements MTTransport {\n public networker: MTPNetworker;\n private log: ReturnType;\n\n private pending: Array<{\n resolve: (body: Uint8Array) => void,\n reject: any,\n body: Uint8Array\n }> = [];\n private releasing: boolean;\n\n public connected: boolean;\n private destroyed: boolean;\n private debug: boolean;\n\n constructor(protected dcId: DcId, protected url: string, logSuffix: string) {\n this.debug = Modes.debug && false;\n\n let logTypes = LogTypes.Error | LogTypes.Log;\n if(this.debug) logTypes |= LogTypes.Debug;\n\n this.log = logger(`HTTP-${dcId}` + logSuffix, logTypes);\n this.log('constructor');\n\n this.connected = false;\n }\n\n public _send(body: Uint8Array, mode?: RequestMode) {\n const length = body.length;\n this.debug && this.log.debug('-> body length to send:', length);\n\n // networkStats.addSent(this.dcId, length);\n return fetch(this.url, {method: 'POST', body, mode}).then((response) => {\n if(response.status !== 200 && !mode) {\n response.arrayBuffer().then((buffer) => {\n this.log.error('not 200',\n new TextDecoder('utf-8').decode(new Uint8Array(buffer)));\n });\n\n throw response;\n }\n\n this.setConnected(true);\n\n // * test resending by dropping random request\n // if(Math.random() > .5) {\n // throw 'asd';\n // }\n\n return response.arrayBuffer().then((buffer) => {\n // networkStats.addReceived(this.dcId, buffer.byteLength);\n return new Uint8Array(buffer);\n });\n }, (err) => {\n this.setConnected(false);\n throw err;\n });\n }\n\n private setConnected(connected: boolean) {\n if(this.connected === connected || this.destroyed) {\n return;\n }\n\n this.connected = connected;\n\n \n transportController.setTransportValue('https', connected);\n \n }\n\n public destroy() {\n this.setConnected(false);\n this.destroyed = true;\n this.pending.forEach((pending) => pending.reject());\n this.pending.length = 0;\n }\n\n public send(body: Uint8Array) {\n if(this.networker) {\n return this._send(body);\n } else {\n const promise = new Promise((resolve, reject) => {\n this.pending.push({resolve, reject, body});\n });\n\n this.releasePending();\n\n return promise;\n }\n }\n\n private async releasePending() {\n if(this.releasing) return;\n\n this.releasing = true;\n // this.log('-> messages to send:', this.pending.length);\n for(let i = 0; i < this.pending.length; ++i) {\n const pending = this.pending[i];\n const {body, resolve} = pending;\n\n try {\n const result = await this._send(body);\n resolve(result);\n this.pending.splice(i, 1);\n } catch(err) {\n this.log.error('Send plain request error:', err);\n await pause(5000);\n }\n\n --i;\n }\n\n this.releasing = false;\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, LogTypes} from '../../logger';\nimport Modes from '../../../config/modes';\nimport EventListenerBase from '../../../helpers/eventListenerBase';\nimport {MTConnection} from './transport';\n\n// let closeSocketBefore = Date.now() + 30e3;\n// let closeSocketAfter = Date.now() + 10e3;\n\nexport default class Socket extends EventListenerBase<{\n open: () => void,\n message: (buffer: ArrayBuffer) => any,\n close: () => void,\n}> implements MTConnection {\n private ws: WebSocket;\n private log: ReturnType;\n private debug = Modes.debug && false;\n\n constructor(protected dcId: number, protected url: string, logSuffix: string) {\n super();\n\n let logTypes = LogTypes.Error | LogTypes.Log;\n if(this.debug) logTypes |= LogTypes.Debug;\n this.log = logger(`WS-${dcId}` + logSuffix, logTypes);\n this.log('constructor');\n this.connect();\n\n return this;\n }\n\n private removeListeners() {\n if(!this.ws) {\n return;\n }\n\n this.ws.removeEventListener('open', this.handleOpen);\n this.ws.removeEventListener('close', this.handleClose);\n this.ws.removeEventListener('error', this.handleError);\n this.ws.removeEventListener('message', this.handleMessage);\n this.ws = undefined;\n }\n\n private connect() {\n this.ws = new WebSocket(this.url, 'binary');\n this.ws.binaryType = 'arraybuffer';\n this.ws.addEventListener('open', this.handleOpen);\n this.ws.addEventListener('close', this.handleClose);\n this.ws.addEventListener('error', this.handleError);\n this.ws.addEventListener('message', this.handleMessage);\n\n // if(Date.now() < closeSocketBefore) {\n // if(Date.now() >= closeSocketAfter) {\n // this.ws.close();\n // }\n }\n\n public close() {\n if(!this.ws) {\n return;\n }\n\n this.log('close execution');\n\n try {\n this.ws.close();\n } catch(err) {\n\n }\n this.handleClose();\n }\n\n private handleOpen = () => {\n this.log('opened');\n\n this.debug && this.log.debug('sending init packet');\n this.dispatchEvent('open');\n };\n\n private handleError = (e: Event) => {\n this.log.error('handleError', e);\n this.close();\n };\n\n private handleClose = (e?: CloseEvent) => {\n this.log('closed', e/* , this.pending, this.ws.bufferedAmount */);\n\n this.removeListeners();\n this.dispatchEvent('close');\n };\n\n private handleMessage = (event: MessageEvent) => {\n this.debug && this.log.debug('<-', 'handleMessage', /* event, */event.data.byteLength);\n\n this.dispatchEvent('message', event.data as ArrayBuffer);\n };\n\n public send = (body: Uint8Array) => {\n this.debug && this.log.debug('-> body length to send:', body.length);\n\n this.ws.send(body);\n };\n}\n","export default function randomize(arr: T) {\n if(crypto && 'getRandomValues' in crypto) {\n crypto.getRandomValues(arr);\n } else {\n throw new Error('NO_SECURE_RANDOM');\n }\n\n return arr;\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 aesjs from 'aes-js';\nimport randomize from '../../../helpers/array/randomize';\nimport cryptoMessagePort from '../../crypto/cryptoMessagePort';\nimport {Codec} from './codec';\n\n/*\n@cryptography/aes ะฝะต ั€ะฐะฑะพั‚ะฐะตั‚ ั ะผะฐััะธะฒะฐะผะธ ะบะพั‚ะพั€ั‹ะต ะฝะต ะบั€ะฐั‚ะฝั‹ 4, ะฟะพัั‚ะพะผัƒ ะธัะฟะพะปัŒะทัƒัŽ intermediate ะฐ ะฝะต abridged\n*/\nexport default class Obfuscation {\n /* private enc: aesjs.ModeOfOperation.ModeOfOperationCTR;\n private dec: aesjs.ModeOfOperation.ModeOfOperationCTR; */\n\n private id: number;\n private idPromise: Promise;\n private process: (data: Uint8Array, operation: 'encrypt' | 'decrypt') => ReturnType;\n\n // private cryptoEncKey: CryptoKey;\n // private cryptoDecKey: CryptoKey;\n // private cryptoKey: CryptoKey;\n\n // private encIv: Uint8Array;\n // private decIv: Uint8Array;\n\n // private decIvCounter: Counter;\n\n public async init(codec: Codec) {\n if(this.idPromise !== undefined) {\n this.release();\n }\n\n const initPayload = new Uint8Array(64);\n randomize(initPayload);\n\n while(true) {\n const val = (initPayload[3] << 24) | (initPayload[2] << 16) | (initPayload[1] << 8) | initPayload[0];\n const val2 = (initPayload[7] << 24) | (initPayload[6] << 16) | (initPayload[5] << 8) | initPayload[4];\n if(initPayload[0] !== 0xef &&\n val !== 0x44414548 &&\n val !== 0x54534f50 &&\n val !== 0x20544547 &&\n val !== 0x4954504f &&\n val !== 0xeeeeeeee &&\n val !== 0xdddddddd &&\n val2 !== 0x00000000) {\n // initPayload[56] = initPayload[57] = initPayload[58] = initPayload[59] = transport;\n break;\n }\n randomize(initPayload);\n }\n\n // //////////////////////initPayload.subarray(60, 62).hex = dcId;\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]));\n console.log('initPayload', initPayload); */\n\n const reversedPayload = initPayload.slice().reverse();\n\n const encKey = initPayload.slice(8, 40);\n const encIv = /* this.encIv = */initPayload.slice(40, 56);\n const decKey = reversedPayload.slice(8, 40);\n const decIv = /* this.decIv = */reversedPayload.slice(40, 56);\n\n /* this.enc = new aesjs.ModeOfOperation.ctr(encKey, new aesjs.Counter(encIv as any));\n this.dec = new aesjs.ModeOfOperation.ctr(decKey, new aesjs.Counter(decIv as any)); */\n\n // console.log('encKey', encKey.hex, encIv.hex);\n // console.log('decKey', decKey.hex, decIv.hex);\n\n const idPromise = this.idPromise = cryptoMessagePort.invokeCrypto('aes-ctr-prepare', {\n encKey,\n encIv,\n decKey,\n decIv\n });\n\n this.process = async(data, operation) => {\n await idPromise;\n return this._process(data, operation);\n };\n\n this.id = await idPromise;\n\n this.process = this._process;\n\n // this.decIvCounter = new Counter(this.decIv);\n /* const key = this.cryptoEncKey = await subtle.importKey(\n 'raw',\n encKey,\n {name: 'AES-CTR'},\n false,\n ['encrypt']\n ); */\n\n // this.cryptoDecKey = await subtle.importKey(\n // 'raw',\n // decKey,\n // {name: 'AES-CTR'},\n // false,\n // ['encrypt']\n // );\n\n // this.cryptoKey = await subtle.importKey(\n // 'raw',\n // encKey,\n // {name: 'AES-CTR'},\n // false,\n // ['encrypt', 'decrypt']\n // );\n\n initPayload.set(codec.obfuscateTag, 56);\n const encrypted = await this.encode(initPayload.slice());\n\n // console.log('encrypted', encrypted);\n\n initPayload.set(encrypted.slice(56, 64), 56);\n\n return initPayload;\n }\n\n /* public encode(payload: Uint8Array) {\n let startTime = performance.now();\n let res = this.enc.encrypt(payload);\n let time = performance.now() - startTime;\n\n try {\n startTime = performance.now();\n let arr = this.encNew.encrypt(payload);\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\n let resNew = new Uint8Array(bytesFromWordss(arr));\n let time2 = performance.now() - startTime;\n console.log('Obfuscation: encode comparison:', res, arr, resNew, res.hex === resNew.hex, time2 < time);\n } catch(err) {\n console.error('Obfuscation: error:', err);\n }\n\n return res;\n }\n\n public decode(payload: Uint8Array) {\n let res = this.dec.encrypt(payload);\n\n try {\n let arr = this.decNew.decrypt(payload);\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\n let resNew = new Uint8Array(bytesFromWordss(arr));\n console.log('Obfuscation: decode comparison:', res, arr, resNew, res.hex === resNew.hex);\n } catch(err) {\n console.error('Obfuscation: error:', err);\n }\n\n return res;\n } */\n\n private _process = (data: Uint8Array, operation: 'encrypt' | 'decrypt') => {\n return cryptoMessagePort.invokeCryptoNew({\n method: 'aes-ctr-process',\n args: [{id: this.id, data, operation}],\n transfer: [data.buffer]\n }) as Promise;\n };\n\n public encode(payload: Uint8Array) {\n /* return subtle.encrypt({\n name: 'AES-CTR',\n counter: this.encIv,\n length: 64\n },\n this.cryptoEncKey,\n payload\n ); */\n return this.process(payload, 'encrypt');\n }\n\n public decode(payload: Uint8Array) {\n return this.process(payload, 'decrypt');\n }\n\n public async release() {\n const idPromise = this.idPromise;\n if(idPromise === undefined) {\n return;\n }\n\n this.id = undefined;\n this.idPromise = undefined;\n\n const id = await idPromise;\n cryptoMessagePort.invokeCrypto('aes-ctr-destroy', id);\n }\n\n public destroy() {\n this.release();\n }\n\n // public encode(payload: Uint8Array) {\n // let res = this.encNew.encrypt(payload);\n // let bytes = new Uint8Array(bytesFromWordss(res));\n\n // return bytes;\n // }\n\n // public async decode(payload: Uint8Array) {\n // const counter = this.decIvCounter.counter.slice();\n // this.decIvCounter.increment();\n\n // const n: ArrayBuffer = await subtle.encrypt({\n // name: 'AES-CTR',\n // counter: counter,\n // length: 64\n // },\n // this.cryptoDecKey,\n // payload\n // );\n\n // const decoded = this.decNew.update(payload);\n\n // console.log('decode', bytesToHex(decoded), 'new', n, bytesToHex(new Uint8Array(n)));\n\n // return decoded;\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 { bytesFromHex, addPadding } from \"../../bin_utils\";\nimport {Codec} from './codec';\n\nclass AbridgedPacketCodec implements Codec {\n public tag = 0xef;\n public obfuscateTag = new Uint8Array([this.tag, this.tag, this.tag, this.tag]);\n\n public encodePacket(data: Uint8Array) {\n const len = data.byteLength >> 2;\n let header: Uint8Array;\n if(len < 127) {\n header = new Uint8Array([len]);\n } else { // Length: payload length, divided by four, and encoded as 3 length bytes (little endian)\n // header = new Uint8Array([0x7f, ...addPadding(bytesFromHex(len.toString(16)).reverse(), 3, true)/* .reverse() */]);\n header = new Uint8Array([0x7f, len & 0xFF, (len >> 8) & 0xFF, (len >> 16) & 0xFF]);\n // console.log('got nobody cause im braindead', header, len);\n }\n\n return header.concat(data);\n // return new Uint8Array([...header, ...data]);\n }\n\n public readPacket(data: Uint8Array) {\n let length = data[0];\n if(length >= 127) { // 0x7f\n length = data[1] | (data[2] << 8) | (data[3] << 16);\n\n return data.slice(4, length << 2 + 1); // need +1\n }\n\n return data.slice(1, length << 2 + 1); // need +1\n }\n}\n\nexport default new AbridgedPacketCodec();\n","export default function bytesToHex(bytes: ArrayLike) {\n const length = bytes.length;\n const arr: string[] = new Array(length);\n for(let i = 0; i < length; ++i) {\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\n }\n return arr.join('');\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 Modes from '../../../config/modes';\nimport {logger, LogTypes} from '../../logger';\nimport MTPNetworker from '../networker';\nimport Obfuscation from './obfuscation';\nimport MTTransport, {MTConnection, MTConnectionConstructable} from './transport';\n// import intermediatePacketCodec from './intermediate';\nimport abridgedPacketCodec from './abridged';\n// import paddedIntermediatePacketCodec from './padded';\nimport {ConnectionStatus} from '../connectionStatus';\n\n \nimport transportController from './controller';\nimport bytesToHex from '../../../helpers/bytes/bytesToHex';\n// import networkStats from '../networkStats';\nimport ctx from '../../../environment/ctx';\n \n\nexport default class TcpObfuscated implements MTTransport {\n private codec = abridgedPacketCodec;\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 private releasingPending: boolean;\n\n // private debugPayloads: MTPNetworker['debugRequests'] = [];\n\n constructor(\n 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 = async() => {\n this.connected = true;\n\n \n transportController.setTransportOpened('websocket');\n \n\n const initPayload = await this.obfuscation.init(this.codec);\n if(!this.connected) {\n return;\n }\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 = async(buffer: ArrayBuffer) => {\n // networkStats.addReceived(this.dcId, buffer.byteLength);\n\n let data = await 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:', bytesToHex(data));\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 = ctx.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 if(this.obfuscation) {\n this.obfuscation.destroy();\n }\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 public changeUrl(url: string) {\n if(this.url === url) {\n return;\n }\n\n this.url = url;\n this.forceReconnect();\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 async releasePending(/* tt = false */) {\n if(!this.connected || this.releasingPending) {\n // this.connect();\n return;\n }\n\n this.releasingPending = true;\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 let sent = false;\n // for(let i = length - 1; i >= 0; --i) {\n for(let i = 0; i < length; ++i) {\n const pending = this.pending[i];\n if(!pending) {\n break;\n }\n\n const {body, bodySent} = pending;\n if(body && !bodySent) {\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 const encoded = pending.encoded ??= await this.encodeBody(body);\n if(!this.connected) {\n break;\n }\n\n // networkStats.addSent(this.dcId, encoded.byteLength);\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 sent = true;\n // delete pending.body;\n }\n }\n\n this.releasingPending = undefined;\n\n if(this.pending.length && sent) {\n this.releasePending();\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/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport MTTransport, {MTConnectionConstructable} from './transports/transport';\nimport Modes from '../../config/modes';\nimport App from '../../config/app';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\n\n \nimport HTTP from './transports/http';\n \n\n \nimport Socket from './transports/websocket';\nimport TcpObfuscated from './transports/tcpObfuscated';\nimport {IS_WEB_WORKER} from '../../helpers/context';\nimport {DcId} from '../../types';\nimport {getEnvironment} from '../../environment/utils';\n\n \n \n \n\n \n\nexport type TransportType = 'websocket' | 'https' | 'http';\nexport type ConnectionType = 'client' | 'download' | 'upload';\ntype Servers = {\n [transportType in TransportType]: {\n [connectionType in ConnectionType]: {\n [dcId: DcId]: MTTransport[]\n }\n }\n};\n\nconst TEST_SUFFIX = Modes.test ? '_test' : '';\nconst PREMIUM_SUFFIX = '_premium';\n\nexport function getTelegramConnectionSuffix(connectionType: ConnectionType) {\n return connectionType === 'client' ? '' : '-1';\n}\n\n \nexport function constructTelegramWebSocketUrl(dcId: DcId, connectionType: ConnectionType, premium?: boolean) {\n const suffix = getTelegramConnectionSuffix(connectionType);\n const path = connectionType !== 'client' ? 'apiws' + TEST_SUFFIX + (premium ? PREMIUM_SUFFIX : '') : ('apiws' + TEST_SUFFIX);\n const chosenServer = `wss://${App.suffix.toLowerCase()}ws${dcId}${suffix}.web.telegram.org/${path}`;\n\n return chosenServer;\n}\n \n\nexport class DcConfigurator {\n private sslSubdomains = ['pluto', 'venus', 'aurora', 'vesta', 'flora'];\n\n private dcOptions = Modes.test ?\n [\n {id: 1, host: '149.154.175.10', port: 80},\n {id: 2, host: '149.154.167.40', port: 80},\n {id: 3, host: '149.154.175.117', port: 80}\n ] :\n [\n {id: 1, host: '149.154.175.50', port: 80},\n {id: 2, host: '149.154.167.50', port: 80},\n {id: 3, host: '149.154.175.100', port: 80},\n {id: 4, host: '149.154.167.91', port: 80},\n {id: 5, host: '149.154.171.5', port: 80}\n ];\n\n public chosenServers: Servers = {} as any;\n\n \n private transportSocket = (dcId: DcId, connectionType: ConnectionType, premium?: boolean) => {\n const chosenServer = constructTelegramWebSocketUrl(dcId, connectionType, premium);\n const logSuffix = connectionType === 'upload' ? '-U' : connectionType === 'download' ? '-D' : '';\n\n const retryTimeout = connectionType === 'client' ? 10000 : 10000;\n\n let oooohLetMeLive: MTConnectionConstructable;\n \n oooohLetMeLive = Socket;\n \n \n \n\n return new TcpObfuscated(oooohLetMeLive, dcId, chosenServer, logSuffix, retryTimeout);\n };\n \n\n \n private transportHTTP = (dcId: DcId, connectionType: ConnectionType, premium?: boolean) => {\n let chosenServer: string;\n if(Modes.ssl || !Modes.http) {\n const suffix = getTelegramConnectionSuffix(connectionType);\n const subdomain = this.sslSubdomains[dcId - 1] + suffix;\n const path = Modes.test ? 'apiw_test1' : 'apiw1';\n chosenServer = 'https://' + subdomain + '.web.telegram.org/' + path;\n } else {\n for(const dcOption of this.dcOptions) {\n if(dcOption.id === dcId) {\n chosenServer = 'http://' + dcOption.host + (dcOption.port !== 80 ? ':' + dcOption.port : '') + '/apiw1';\n break;\n }\n }\n }\n\n const logSuffix = connectionType === 'upload' ? '-U' : connectionType === 'download' ? '-D' : '';\n return new HTTP(dcId, chosenServer, logSuffix);\n };\n \n\n public chooseServer(\n dcId: DcId,\n connectionType: ConnectionType = 'client',\n transportType: TransportType = Modes.transport,\n reuse = true,\n premium?: boolean\n ) {\n /* if(transportType === 'websocket' && !Modes.multipleConnections) {\n connectionType = 'client';\n } */\n\n if(!this.chosenServers.hasOwnProperty(transportType)) {\n this.chosenServers[transportType] = {\n client: {},\n download: {},\n upload: {}\n };\n }\n\n const servers = this.chosenServers[transportType][connectionType];\n\n if(!(dcId in servers)) {\n servers[dcId] = [];\n }\n\n const transports = servers[dcId];\n\n if(!transports.length || !reuse/* || (upload && transports.length < 1) */) {\n let transport: MTTransport;\n\n \n transport = (transportType === 'websocket' ? this.transportSocket : this.transportHTTP)(dcId, connectionType, premium);\n \n \n \n \n \n\n if(!transport) {\n console.error('No chosenServer!', dcId);\n return null;\n }\n\n if(reuse) {\n transports.push(transport);\n }\n\n return transport;\n }\n\n return transports[0];\n }\n\n public static removeTransport(obj: any, transport: T) {\n for(const transportType in obj) {\n // @ts-ignore\n for(const connectionType in obj[transportType]) {\n // @ts-ignore\n for(const dcId in obj[transportType][connectionType]) {\n // @ts-ignore\n const transports: T[] = obj[transportType][connectionType][dcId];\n indexOfAndSplice(transports, transport);\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 App from '../../../config/app';\nimport deferredPromise from '../../../helpers/cancellablePromise';\nimport EventListenerBase from '../../../helpers/eventListenerBase';\nimport pause from '../../../helpers/schedulers/pause';\nimport {TransportType, DcConfigurator} 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 private dcConfigurator: DcConfigurator;\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 dcConfigurator = this.dcConfigurator ??= new DcConfigurator();\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(() => {\n if(websocketPromise.isFulfilled || websocketPromise.isRejected) {\n return;\n }\n\n if(socket.connection) {\n socket.connection.close();\n }\n\n websocketPromise.resolve(false);\n }, 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","/*\n * 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, {CancellablePromise} from '../../../../helpers/cancellablePromise';\nimport type {StoragesResults} from './loadStorages';\n\nconst RESET_STORAGES_PROMISE: CancellablePromise> = deferredPromise();\nexport default RESET_STORAGES_PROMISE;\n","/*\n * 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 {CryptoMessagePort} from '../crypto/cryptoMessagePort';\nimport type {ApiFileManager} from '../mtproto/apiFileManager';\nimport type {ApiManager} from '../mtproto/apiManager';\nimport type {Authorizer} from '../mtproto/authorizer';\nimport type {DcConfigurator} from '../mtproto/dcConfigurator';\nimport type {NetworkerFactory} from '../mtproto/networkerFactory';\nimport type {PasswordManager} from '../mtproto/passwordManager';\nimport type {ReferenceDatabase} from '../mtproto/referenceDatabase';\nimport type {TimeManager} from '../mtproto/timeManager';\nimport type {RootScope} from '../rootScope';\nimport type DialogsStorage from '../storages/dialogs';\nimport type FiltersStorage from '../storages/filters';\nimport type PeersStorage from '../storages/peers';\nimport type ThumbsStorage from '../storages/thumbs';\nimport type {ApiUpdatesManager} from './apiUpdatesManager';\nimport type {AppAvatarsManager} from './appAvatarsManager';\nimport type {AppCallsManager} from './appCallsManager';\nimport type {AppChatsManager} from './appChatsManager';\nimport type {AppDocsManager} from './appDocsManager';\nimport type {AppDraftsManager} from './appDraftsManager';\nimport type {AppEmojiManager} from './appEmojiManager';\nimport type {AppGroupCallsManager} from './appGroupCallsManager';\nimport type {AppInlineBotsManager} from './appInlineBotsManager';\nimport type {AppMessagesIdsManager} from './appMessagesIdsManager';\nimport type {AppMessagesManager} from './appMessagesManager';\nimport type {AppNotificationsManager} from './appNotificationsManager';\nimport type AppPaymentsManager from './appPaymentsManager';\nimport type {AppPeersManager} from './appPeersManager';\nimport type {AppPhotosManager} from './appPhotosManager';\nimport type {AppPollsManager} from './appPollsManager';\nimport type {AppPrivacyManager} from './appPrivacyManager';\nimport type {AppProfileManager} from './appProfileManager';\nimport type {AppReactionsManager} from './appReactionsManager';\nimport type {AppStateManager} from './appStateManager';\nimport type {AppStickersManager} from './appStickersManager';\nimport type {AppStoragesManager} from './appStoragesManager';\nimport type {AppUsersManager} from './appUsersManager';\nimport type AppWebDocsManager from './appWebDocsManager';\nimport type {AppWebPagesManager} from './appWebPagesManager';\nimport type AppAttachMenuBotsManager from './appAttachMenuBotsManager';\nimport type AppSeamlessLoginManager from './appSeamlessLoginManager';\nimport type AppThemesManager from './appThemesManager';\nimport type {AppManagers} from './managers';\n\nexport class AppManager {\n protected appPeersManager: AppPeersManager;\n protected appChatsManager: AppChatsManager;\n protected appDocsManager: AppDocsManager;\n protected appPhotosManager: AppPhotosManager;\n protected appPollsManager: AppPollsManager;\n protected appUsersManager: AppUsersManager;\n protected appWebPagesManager: AppWebPagesManager;\n protected appDraftsManager: AppDraftsManager;\n protected appProfileManager: AppProfileManager;\n protected appNotificationsManager: AppNotificationsManager;\n protected apiUpdatesManager: ApiUpdatesManager;\n protected appAvatarsManager: AppAvatarsManager;\n protected appGroupCallsManager: AppGroupCallsManager;\n protected appCallsManager: AppCallsManager;\n protected appReactionsManager: AppReactionsManager;\n protected appMessagesManager: AppMessagesManager;\n protected appMessagesIdsManager: AppMessagesIdsManager;\n protected appPrivacyManager: AppPrivacyManager;\n protected appInlineBotsManager: AppInlineBotsManager;\n protected appStickersManager: AppStickersManager;\n protected referenceDatabase: ReferenceDatabase;\n protected appEmojiManager: AppEmojiManager;\n protected dialogsStorage: DialogsStorage;\n protected filtersStorage: FiltersStorage;\n protected apiManager: ApiManager;\n // protected apiManager: ApiManagerProxy;\n protected passwordManager: PasswordManager;\n protected cryptoWorker: CryptoMessagePort;\n protected apiFileManager: ApiFileManager;\n protected peersStorage: PeersStorage;\n protected thumbsStorage: ThumbsStorage;\n protected networkerFactory: NetworkerFactory;\n protected rootScope: RootScope;\n protected authorizer: Authorizer;\n protected dcConfigurator: DcConfigurator;\n protected timeManager: TimeManager;\n protected appStoragesManager: AppStoragesManager;\n protected appStateManager: AppStateManager;\n protected appWebDocsManager: AppWebDocsManager;\n protected appPaymentsManager: AppPaymentsManager;\n protected appAttachMenuBotsManager: AppAttachMenuBotsManager;\n protected appSeamlessLoginManager: AppSeamlessLoginManager;\n protected appThemesManager: AppThemesManager;\n\n public clear: (init?: boolean) => void;\n\n public setManagers(managers: AppManagers) {\n Object.assign(this, managers);\n // this.after();\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 '../../../../layer';\nimport type{Dialog} from '../../appMessagesManager';\nimport type{User} from '../../appUsersManager';\nimport type {StoragesStorages} from './createStorages';\nimport {recordPromiseBound} from '../../../../helpers/recordPromise';\nimport {Awaited} from '../../../../types';\nimport {logger} from '../../../logger';\nimport RESET_STORAGES_PROMISE from './resetStoragesPromise';\n\nexport type StoragesResults = Awaited>;\n\nasync function loadStoragesInner(storages: StoragesStorages) {\n const recordPromise = recordPromiseBound(logger('STORAGES-LOADER'));\n const storagesKeys = Object.keys(storages) as Array;\n const storagesPromises: Promise[] = storagesKeys.map((key) => {\n const promise = storages[key].getAll();\n return recordPromise(promise, 'storage ' + (key as any as string));\n });\n\n const storagesResults: {\n users: User[],\n chats: Chat[],\n dialogs: Dialog[]\n } = {} as any;\n const arr = await Promise.all(storagesPromises);\n for(let i = 0, length = storagesKeys.length; i < length; ++i) {\n storagesResults[storagesKeys[i]] = arr[i] as any;\n }\n\n arr.splice(0, storagesKeys.length);\n\n const resetStorages = await RESET_STORAGES_PROMISE;\n if(resetStorages.size) {\n for(const key of resetStorages) {\n storagesResults[key].length = 0;\n }\n\n resetStorages.clear();\n }\n\n return storagesResults;\n}\n\nlet promise: ReturnType;\nexport default function loadStorages(storages: StoragesStorages) {\n return promise ??= loadStoragesInner(storages);\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} from '../logger';\nimport {AppManager} from './manager';\nimport createStorages from './utils/storages/createStorages';\nimport loadStorages from './utils/storages/loadStorages';\n\nexport class AppStoragesManager extends AppManager {\n private storages: ReturnType;\n\n // private loadPromise: CancellablePromise;\n\n private log: ReturnType;\n\n constructor() {\n super();\n\n this.log = logger('STORAGES');\n this.storages = createStorages();\n // this.loadPromise = deferredPromise();\n }\n\n public loadStorages() {\n return loadStorages(this.storages);\n // loadStorages(this.storages).then((storagesResults) => {\n // this.loadPromise.resolve(storagesResults);\n // });\n\n // return this.loadPromise;\n }\n\n // public setStoragesResults(storagesResults: StoragesResults) {\n // this.loadPromise.resolve(storagesResults);\n // }\n\n public async loadStorage(name: T) {\n return this.loadStorages().then((storagesResults) => {\n return {\n storage: this.storages[name],\n results: storagesResults[name]\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 {Chat} from '../../../../layer';\nimport type {Dialog} from '../../appMessagesManager';\nimport type {User} from '../../appUsersManager';\nimport DATABASE_STATE from '../../../../config/databases/state';\nimport AppStorage from '../../../storage';\n\nexport type StoragesStorages = {\n users: AppStorage, typeof DATABASE_STATE>,\n chats: AppStorage, typeof DATABASE_STATE>,\n dialogs: AppStorage, typeof DATABASE_STATE>\n};\n\nexport default function createStorages() {\n const names: (keyof StoragesStorages)[] = ['users', 'chats', 'dialogs'];\n const storages: StoragesStorages = {} as any;\n for(const name of names) {\n // @ts-ignore\n storages[name] = new AppStorage(DATABASE_STATE, name);\n }\n\n return storages;\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 type {AccountPassword, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo} from '../../layer';\nimport randomize from '../../helpers/array/randomize';\nimport {AppManager} from '../appManagers/manager';\n\nexport class PasswordManager extends AppManager {\n public getState(): Promise {\n return this.apiManager.invokeApi('account.getPassword').then((result) => {\n return result;\n });\n }\n\n public updateSettings(settings: {\n hint?: string,\n email?: string,\n newPassword?: string,\n currentPassword?: string\n } = {}) {\n // state = Object.assign({}, state);\n // state.new_algo = Object.assign({}, state.new_algo);\n\n return this.getState().then((state) => {\n let currentHashPromise: Promise;\n let newHashPromise: Promise;\n const params: AccountUpdatePasswordSettings = {\n password: null,\n new_settings: {\n _: 'account.passwordInputSettings',\n hint: settings.hint,\n email: settings.email\n }\n };\n\n if(settings.currentPassword) {\n currentHashPromise = this.cryptoWorker.invokeCrypto('computeSRP', settings.currentPassword, state, false) as any;\n } else {\n currentHashPromise = Promise.resolve({\n _: 'inputCheckPasswordEmpty'\n });\n }\n\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\n randomize(salt1);\n salt1.set(newAlgo.salt1, 0);\n newAlgo.salt1 = salt1;\n\n if(settings.newPassword) {\n newHashPromise = this.cryptoWorker.invokeCrypto('computeSRP', settings.newPassword, state, true) as any;\n } else {\n newHashPromise = Promise.resolve(new Uint8Array());\n }\n\n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\n params.password = hashes[0];\n params.new_settings.new_algo = newAlgo;\n params.new_settings.new_password_hash = hashes[1];\n\n return this.apiManager.invokeApi('account.updatePasswordSettings', params);\n });\n });\n }\n\n public getInputCheckPassword(password: string, state: AccountPassword) {\n return this.cryptoWorker.invokeCrypto('computeSRP', password, state, false) as Promise;\n }\n\n public check(password: string, state: AccountPassword, options: any = {}) {\n return this.getInputCheckPassword(password, state).then((inputCheckPassword) => {\n // console.log('SRP', inputCheckPassword);\n return this.apiManager.invokeApi('auth.checkPassword', {\n password: inputCheckPassword as InputCheckPasswordSRP.inputCheckPasswordSRP\n }, options).then((auth) => {\n if(auth._ === 'auth.authorization') {\n this.apiManager.setUser(auth.user);\n }\n\n return auth;\n });\n });\n }\n\n public confirmPasswordEmail(code: string) {\n return this.apiManager.invokeApi('account.confirmPasswordEmail', {code});\n }\n\n public resendPasswordEmail() {\n return this.apiManager.invokeApi('account.resendPasswordEmail');\n }\n\n public cancelPasswordEmail() {\n return this.apiManager.invokeApi('account.cancelPasswordEmail');\n }\n\n /* public requestRecovery(options: any = {}) {\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\n }\n\n public recover(code: any, options: any = {}) {\n return apiManager.invokeApi('auth.recoverPassword', {\n code\n }, options);\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 {Photo, WallPaper} from '../../layer';\nimport {logger} from '../logger';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport {AppManager} from '../appManagers/manager';\nimport makeError from '../../helpers/makeError';\n\nexport type ReferenceContext = ReferenceContext.referenceContextProfilePhoto | ReferenceContext.referenceContextMessage | ReferenceContext.referenceContextEmojiesSounds | ReferenceContext.referenceContextReactions | ReferenceContext.referenceContextUserFull | ReferenceContext.referenceContextCustomEmoji | ReferenceContext.referenceContextAttachMenuBotIcon | ReferenceContext.referenceContextWallPaper;\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 export type referenceContextReactions = {\n type: 'reactions'\n };\n\n export type referenceContextUserFull = {\n type: 'userFull',\n userId: UserId\n };\n\n export type referenceContextCustomEmoji = {\n type: 'customEmoji',\n docId: DocId\n };\n\n export type referenceContextAttachMenuBotIcon = {\n type: 'attachMenuBotIcon',\n botId: BotId\n };\n\n export type referenceContextWallPaper = {\n type: 'wallPaper',\n wallPaperId: WallPaper['id']\n };\n}\n\nexport type ReferenceBytes = Photo.photo['file_reference'];\nexport type ReferenceContexts = Set;\n\n// type ReferenceBytes = Uint8Array;\n\nexport class ReferenceDatabase extends AppManager {\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 // super();\n\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 = this.appMessagesManager.reloadMessages(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 || this.appStickersManager.getAnimatedEmojiSounds(true).then(() => {\n this.refreshEmojiesSoundsPromise = undefined;\n });\n break;\n }\n\n case 'userFull': {\n promise = Promise.resolve(this.appProfileManager.getProfile(context.userId, true));\n break;\n }\n\n case 'customEmoji': {\n promise = this.appEmojiManager.getCustomEmojiDocuments([context.docId]);\n break;\n }\n\n case 'attachMenuBotIcon': {\n promise = this.appAttachMenuBotsManager.getAttachMenuBot(context.botId, true) as any;\n break;\n }\n\n case 'wallPaper': {\n promise = this.appThemesManager.getWallPaperById(context.wallPaperId);\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 makeError('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","export default function safeReplaceObject(wasObject: any, newObject: any) {\n if(!wasObject) {\n return newObject;\n }\n\n for(var key in wasObject) {\n if(!newObject.hasOwnProperty(key)) {\n delete wasObject[key];\n }\n }\n\n for(var key in newObject) {\n // if (newObject.hasOwnProperty(key)) { // useless\n wasObject[key] = newObject[key];\n // }\n }\n\n return wasObject;\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, MessageAction, MessageMedia} from '../../../../layer';\nimport getPeerId from '../peers/getPeerId';\n\nexport default function getPeerIdsFromMessage(message: Message.message | Message.messageService) {\n const peerIds: number[] = [\n message.fromId,\n message.viaBotId,\n (message as Message.message).fwdFromId\n ];\n\n const media = (message as Message.message).media;\n if(media) {\n const contactUserId = (media as MessageMedia.messageMediaContact).user_id;\n if(contactUserId !== undefined) {\n peerIds.push(contactUserId.toPeerId());\n }\n\n const results = (media as MessageMedia.messageMediaPoll).results;\n const recentVoters = results?.recent_voters;\n if(recentVoters?.length) {\n peerIds.push(...recentVoters.map((userId) => userId.toPeerId()));\n }\n }\n\n const recentReactions = ((message as Message.message).reactions)?.recent_reactions;\n if(recentReactions?.length) {\n peerIds.push(...recentReactions.map((reaction) => getPeerId(reaction.peer_id)));\n }\n\n const action = (message as Message.messageService).action;\n if(action) {\n const userIds: UserId[] = [\n ...((action as MessageAction.messageActionChatAddUser).users || []),\n (action as MessageAction.messageActionChatDeleteUser).user_id,\n (action as MessageAction.messageActionChatJoinedByLink).inviter_id\n ];\n peerIds.push(...userIds.filter(Boolean).map((userId) => userId.toPeerId()));\n\n const chatIds: ChatId[] = [\n (action as MessageAction.messageActionChatMigrateTo).channel_id,\n (action as MessageAction.messageActionChannelMigrateFrom).chat_id\n ];\n peerIds.push(...chatIds.filter(Boolean).map((chatId) => chatId.toPeerId(true)));\n }\n\n const recentRepliers = ((message as Message.message).replies)?.recent_repliers;\n if(recentRepliers?.length) {\n peerIds.push(...recentRepliers.map((reply) => getPeerId(reply)));\n }\n\n return new Set(peerIds.filter(Boolean));\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 {ForumTopic} from '../../../../layer';\nimport type {Dialog} from '../../appMessagesManager';\nimport type getDialogIndexKey from './getDialogIndexKey';\n\nexport default function setDialogIndex(\n dialog: Dialog | ForumTopic.forumTopic,\n indexKey: ReturnType,\n index: number\n) {\n return (dialog as Dialog)[indexKey] = index;\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 type {Chat, ForumTopic as MTForumTopic, DialogPeer, Message, MessageAction, MessageMedia, MessagesForumTopics, MessagesPeerDialogs, Update} from '../../layer';\nimport type {Dialog, ForumTopic, MyMessage} from '../appManagers/appMessagesManager';\nimport tsNow from '../../helpers/tsNow';\nimport SearchIndex from '../searchIndex';\nimport {SliceEnd} from '../../helpers/slicedArray';\nimport {MyDialogFilter} from './filters';\nimport {FOLDER_ID_ALL, FOLDER_ID_ARCHIVE, NULL_PEER_ID, REAL_FOLDERS, REAL_FOLDER_ID} from '../mtproto/mtproto_config';\nimport {MaybePromise, NoneToVoidFunction} from '../../types';\nimport ctx from '../../environment/ctx';\nimport AppStorage from '../storage';\nimport type DATABASE_STATE from '../../config/databases/state';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport insertInDescendSortedArray from '../../helpers/array/insertInDescendSortedArray';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport getServerMessageId from '../appManagers/utils/messageId/getServerMessageId';\nimport generateMessageId from '../appManagers/utils/messageId/generateMessageId';\nimport {AppManager} from '../appManagers/manager';\nimport getDialogIndexKey from '../appManagers/utils/dialogs/getDialogIndexKey';\nimport isObject from '../../helpers/object/isObject';\nimport getDialogIndex from '../appManagers/utils/dialogs/getDialogIndex';\nimport getPeerIdsFromMessage from '../appManagers/utils/messages/getPeerIdsFromMessage';\nimport {AppStoragesManager} from '../appManagers/appStoragesManager';\nimport defineNotNumerableProperties from '../../helpers/object/defineNotNumerableProperties';\nimport setDialogIndex from '../appManagers/utils/dialogs/setDialogIndex';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport pause from '../../helpers/schedulers/pause';\nimport {BroadcastEvents} from '../rootScope';\nimport assumeType from '../../helpers/assumeType';\nimport makeError from '../../helpers/makeError';\nimport callbackify from '../../helpers/callbackify';\n\nexport type FolderDialog = {\n dialog: Dialog,\n index: number\n};\n\nexport type Folder = {\n dialogs: (Dialog | ForumTopic)[],\n id: number,\n unreadMessagesCount: number,\n unreadPeerIds: Set,\n unreadUnmutedPeerIds: Set,\n dispatchUnreadTimeout?: number\n};\n\nexport const GLOBAL_FOLDER_ID: REAL_FOLDER_ID = undefined;\n\n// let spentTime = 0;\nexport default class DialogsStorage extends AppManager {\n private storage: AppStoragesManager['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 private forumTopics: Map,\n deletedTopics: Set,\n getTopicPromises: Map>,\n getTopicsPromise?: Promise\n }>;\n\n protected after() {\n this.clear(true);\n\n this.rootScope.addEventListener('language_change', () => {\n const peerId = this.appUsersManager.getSelf().id.toPeerId(false);\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n const peerText = this.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 this.rootScope.addEventListener('filter_order', () => {\n const dialogs = this.getCachedDialogs(false);\n // const indexKeys: ReturnType[] = [];\n for(const filterId in this.folders) {\n if(+filterId > 1) {\n delete this.folders[filterId];\n }\n\n // indexKeys.push(this.getDialogIndexKey(+filterId));\n }\n\n for(let i = 0; i < dialogs.length; ++i) {\n const dialog = dialogs[i];\n // for(const indexKey of indexKeys) {\n // delete dialog[indexKey];\n // }\n\n this.processDialogForFilters(dialog);\n }\n });\n\n this.rootScope.addEventListener('filter_update', onFilterUpdate);\n this.rootScope.addEventListener('filter_new', onFilterUpdate);\n\n this.rootScope.addEventListener('filter_delete', (filter) => {\n const dialogs = this.getCachedDialogs(false);\n\n const indexKey = this.getDialogIndexKeyByFilterId(filter.id);\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 this.rootScope.addEventListener('dialog_notify_settings', (dialog) => {\n this.processChangedUnreadOrUnmuted(dialog.peerId);\n });\n\n this.rootScope.addEventListener('chat_update', (chatId) => {\n const chat = this.appChatsManager.getChat(chatId);\n\n const peerId = chatId.toPeerId(true);\n if((chat as Chat.chat).pFlags.left && this.getDialogOnly(peerId)) {\n this.dropDialogOnDeletion(peerId);\n }\n });\n\n this.rootScope.addEventListener('chat_toggle_forum', ({chatId, enabled}) => {\n const peerId = chatId.toPeerId(true);\n if(!enabled) {\n this.flushForumTopicsCache(peerId);\n }\n\n this.processChangedUnreadOrUnmuted(peerId);\n });\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateFolderPeers: this.onUpdateFolderPeers,\n\n updateDialogPinned: this.onUpdateDialogPinned,\n\n updateChannelPinnedTopic: this.onUpdateChannelPinnedTopic,\n\n updatePinnedDialogs: this.onUpdatePinnedDialogs,\n\n updateChannelPinnedTopics: this.onUpdateChannelPinnedTopics\n });\n\n return Promise.all([\n this.appStateManager.getState(),\n this.appStoragesManager.loadStorage('dialogs')\n ]).then(([state, {results: dialogs, storage}]) => {\n this.storage = storage;\n this.dialogs = this.storage.getCache();\n\n for(const folderId of REAL_FOLDERS) {\n const order = state.pinnedOrders[folderId];\n if(!order) {\n continue;\n }\n\n const _order = this.getPinnedOrders(folderId);\n _order.splice(0, _order.length, ...order);\n }\n\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 if(dialogs.length) {\n this.appDraftsManager.addMissedDialogs();\n }\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 continue;\n }\n\n // if(dialog.peerId !== SERVICE_PEER_ID) {\n dialog.top_message = 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 <= 21; ++i) {\n const indexKey: ReturnType = `index_${i}` as any;\n delete dialog[indexKey];\n }\n // delete dialog.indexes;\n\n this.saveDialog({\n dialog,\n ignoreOffsetDate: true\n });\n\n // ! WARNING, ัƒะฑั€ะฐั‚ัŒ ัั‚ะพ ะบะพะณะดะฐ ะฝัƒะถะฝะพ ะฑัƒะดะตั‚ ะดะตะปะฐั‚ัŒ ั‡ั‚ะพะฑั‹ pending ัะพะพะฑั‰ะตะฝะธั ัะพั…ั€ะฐะฝัะปะธััŒ\n const message = this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n if(!message) {\n this.appMessagesManager.reloadConversation(dialog.peerId);\n }\n }\n }\n\n public isDialogsLoaded(folderId: number) {\n return !!this.allDialogsLoaded[folderId];\n }\n\n public setDialogsLoaded(folderId: number, loaded: boolean) {\n const isForum = this.isFilterIdForForum(folderId);\n\n if(folderId === GLOBAL_FOLDER_ID && loaded) {\n this.allDialogsLoaded[FOLDER_ID_ALL] = loaded;\n this.allDialogsLoaded[FOLDER_ID_ARCHIVE] = loaded;\n } else {\n if(isForum) {\n defineNotNumerableProperties(this.allDialogsLoaded, [folderId]);\n }\n\n this.allDialogsLoaded[folderId] = loaded;\n }\n\n if(isForum) {\n return;\n }\n\n if(Array.from(REAL_FOLDERS).every((folderId) => this.allDialogsLoaded[folderId])) {\n this.allDialogsLoaded[GLOBAL_FOLDER_ID] = true;\n }\n\n this.saveAllDialogsLoaded();\n }\n\n private saveAllDialogsLoaded() {\n this.appStateManager.pushToState('allDialogsLoaded', this.allDialogsLoaded);\n }\n\n public clear = (init = false) => {\n if(!init) {\n this.storage.clear();\n\n this.allDialogsLoaded = {};\n this.saveAllDialogsLoaded();\n\n // * clear not numerable properties\n this.pinnedOrders = Object.assign({}, this.pinnedOrders);\n for(const folderId of REAL_FOLDERS) {\n this.resetPinnedOrder(folderId);\n }\n this.savePinnedOrders();\n } else {\n this.allDialogsLoaded = {};\n this.pinnedOrders = {};\n for(const folderId of REAL_FOLDERS) {\n this.pinnedOrders[folderId] = [];\n }\n }\n\n this.forumTopics = new Map();\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 | ForumTopic, folderId: number) {\n delete dialog.pFlags.pinned;\n indexOfAndSplice(this.getPinnedOrders(folderId), this.isFilterIdForForum(folderId) ? (dialog as ForumTopic).id : 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.getPinnedOrders(folderId).length = 0;\n }\n\n public getPinnedOrders(folderId: number) {\n let orders = this.pinnedOrders[folderId];\n if(!orders && this.isFilterIdForForum(folderId)) {\n defineNotNumerableProperties(this.pinnedOrders, [folderId]);\n orders = this.pinnedOrders[folderId] = [];\n }\n\n return orders;\n }\n\n public isDialogPinned(peerId: PeerId, folderId: number) {\n const filter = this.filtersStorage.getFilter(folderId);\n let isPinned: boolean;\n if(filter) {\n isPinned = filter.pinnedPeerIds.indexOf(peerId) !== -1;\n } else {\n isPinned = !!this.getDialogOnly(peerId).pFlags.pinned;\n }\n\n return isPinned;\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(...Array.from(REAL_FOLDERS).sort((a, b) => a - b));\n }\n\n return offsetDate;\n }\n\n private generateFolder(id: number) {\n const folder: Folder = {\n dialogs: [],\n id,\n unreadMessagesCount: 0,\n unreadPeerIds: new Set(),\n unreadUnmutedPeerIds: new Set()\n };\n\n defineNotNumerableProperties(folder, ['dispatchUnreadTimeout']);\n\n return folder;\n }\n\n public getFolder(id: number) {\n return this.folders[id] ??= this.generateFolder(id);\n }\n\n public isFilterIdForForum(filterId: number) {\n return filterId && filterId < 0;\n }\n\n public getFilterIdForForum(forumTopic: ForumTopic) {\n return forumTopic.peerId;\n }\n\n public getDialogKey(dialog: Dialog | ForumTopic) {\n return this.isTopic(dialog) ? dialog.id : dialog.peerId;\n }\n\n public getFolderDialogs(id: number, skipMigrated = true): Folder['dialogs'] {\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 if(this.isFilterIdForForum(id)) {\n return skipMigrated ? folder.dialogs.filter((forumTopic) => !(forumTopic as ForumTopic).pFlags.hidden) : folder.dialogs;\n }\n\n return skipMigrated ? folder.dialogs.filter((dialog) => (dialog as Dialog).migratedTo === undefined) : folder.dialogs;\n }\n\n public getNextDialog(currentPeerId: PeerId, next: boolean, filterId: number) {\n const folder = this.getFolderDialogs(filterId, true);\n let dialog: Folder['dialogs'][0];\n if(!currentPeerId) {\n if(next) {\n dialog = folder[0];\n }\n } else {\n const idx = folder.findIndex((dialog) => dialog.peerId === currentPeerId);\n if(idx !== -1) {\n const nextIndex = next ? idx + 1 : idx - 1;\n dialog = folder[nextIndex];\n }\n }\n\n return dialog;\n }\n\n public getDialogIndexKeyByFilterId(filterId: number) {\n if(this.isFilterIdForForum(filterId)) return getDialogIndexKey();\n if(REAL_FOLDERS.has(filterId)) return getDialogIndexKey(filterId as REAL_FOLDER_ID);\n const filter = this.filtersStorage.getFilter(filterId);\n return getDialogIndexKey(filter.localId);\n }\n\n private isDialogUnmuted(dialog: Dialog | ForumTopic) {\n return !this.appNotificationsManager.isPeerLocalMuted({\n peerId: dialog.peerId,\n respectType: true,\n threadId: this.isTopic(dialog) ? (dialog as ForumTopic).id : undefined\n });\n }\n\n public getFolderUnreadCount(filterId: number) {\n const folder = this.getFolder(filterId);\n return {unreadUnmutedCount: folder.unreadUnmutedPeerIds.size, unreadCount: folder.unreadPeerIds.size};\n }\n\n public getCachedDialogs(skipMigrated?: boolean) {\n const arrays = Array.from(REAL_FOLDERS).map((folderId) => this.getFolderDialogs(folderId, skipMigrated));\n return [].concat(...arrays) as Dialog[];\n }\n\n private setDialogIndexInFilter(\n dialog: Dialog | ForumTopic,\n indexKey: ReturnType,\n filter?: MyDialogFilter\n ) {\n // if(this.isTopic(dialog)) {\n // return dialog['index_0'];\n // }\n\n let index: number;\n\n const isTopic = this.isTopic(dialog);\n const isRealFolder = isTopic || REAL_FOLDERS.has(filter.id);\n /* if(isRealFolder) {\n // index = getDialogIndex(dialog, indexKey);\n index = this.generateIndexForDialog(dialog, true);\n } else */if(this.filtersStorage.testDialogForFilter(dialog, filter)) {\n const pinnedIds = isTopic ?\n this.getPinnedOrders(this.getFilterIdForForum(dialog)) :\n filter.pinnedPeerIds;\n\n const pinnedKey = this.getDialogKey(dialog);\n const pinnedIndex = pinnedIds.indexOf(pinnedKey);\n\n if(pinnedIndex !== -1) {\n index = this.generateDialogIndex(this.generateDialogPinnedDateByIndex(pinnedIds.length - 1 - pinnedIndex), true);\n } else if(dialog.pFlags?.pinned || isRealFolder) {\n index = this.generateIndexForDialog(dialog, true, undefined, !isRealFolder);\n } else {\n index = getDialogIndex(dialog) ?? this.generateIndexForDialog(dialog, true);\n }\n }\n\n // if(!dialog.hasOwnProperty(indexKey)) {\n // defineNotNumerableProperties(dialog, [indexKey]);\n // }\n\n return setDialogIndex(dialog, indexKey, index);\n }\n\n public getDialog(peerId: PeerId, folderId?: number, topicId?: number, skipMigrated = true): [Folder['dialogs'][0], number] | [] {\n const folders: Folder['dialogs'][] = [];\n\n if(topicId) {\n folderId = peerId;\n // skipMigrated = false;\n }\n\n if(folderId === undefined) {\n folders.push(...Array.from(REAL_FOLDERS).map((folderId) => this.getFolder(folderId).dialogs as Dialog[]));\n } else {\n folders.push(this.getFolderDialogs(folderId, false) as Dialog[]);\n }\n\n const verify: (d: Folder['dialogs'][0]) => boolean = topicId ?\n (d) => (d as ForumTopic).id === topicId :\n (d) => (d as Dialog).peerId === peerId;\n for(const 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(verify(dialog)) {\n return [dialog, i - skipped];\n } else if(skipMigrated && ((dialog as ForumTopic).pFlags.hidden || (dialog as 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 public getDialogOrTopic(peerId: PeerId, topicId?: number) {\n return topicId ? this.getForumTopic(peerId, topicId) : this.dialogs[peerId];\n }\n\n public getDialogIndex(\n peerId: PeerId | Parameters[0],\n indexKey: ReturnType,\n topicId?: number\n ) {\n const dialog = isObject(peerId) ? peerId : this.getDialogOrTopic(peerId, topicId);\n return getDialogIndex(dialog, indexKey);\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 date ??= tsNow(true) + this.timeManager.getServerTimeOffset();\n return (date * 0x10000) + (isPinned ? 0 : (++this.dialogsNum & 0xFFFF));\n }\n\n // public makeFilterForTopics(id: number): MyDialogFilter {\n // return {\n // _: 'dialogFilter',\n // id,\n\n // };\n // }\n\n public isTopic(dialog: Dialog | ForumTopic): dialog is ForumTopic {\n return 'id' in dialog;\n }\n\n public processDialogForFilters(dialog: Dialog | ForumTopic, noIndex?: boolean) {\n // let perf = performance.now();\n if(this.isTopic(dialog)) {\n this.processDialogForFilter(dialog, undefined, noIndex);\n return;\n }\n\n const filters = this.filtersStorage.getFilters();\n for(const id in filters) {\n const filter = filters[id];\n this.processDialogForFilter(dialog, filter, noIndex);\n }\n // spentTime += (performance.now() - perf);\n // console.log('generate index time:', spentTime);\n }\n\n public processDialogForFilter(\n dialog: Dialog | ForumTopic,\n filter?: MyDialogFilter,\n noIndex?: boolean\n ) {\n const isTopic = this.isTopic(dialog);\n const folderId = isTopic ? this.getFilterIdForForum(dialog) : filter.id;\n\n const indexKey = isTopic ? 'index_0' : this.getDialogIndexKeyByFilterId(folderId);\n const folder = this.getFolder(folderId);\n const dialogs = folder.dialogs;\n\n const cmp: (d: typeof dialog) => boolean = isTopic ?\n ((d: ForumTopic) => d.id === dialog.id) as any :\n ((d: Dialog) => d.peerId === dialog.peerId) as any;\n const wasIndex = dialogs.findIndex(cmp);\n const wasDialog = dialogs[wasIndex];\n const wasDialogIndex = this.getDialogIndex(wasDialog, indexKey);\n\n if(noIndex && folderId > FOLDER_ID_ARCHIVE) {\n noIndex = undefined;\n }\n\n const newDialogIndex = noIndex ? undefined : this.setDialogIndexInFilter(dialog, indexKey, filter);\n\n if(wasDialogIndex === newDialogIndex) {\n return false;\n }\n\n if(!!wasDialogIndex !== !!newDialogIndex) {\n this.prepareFolderUnreadCountModifyingByDialog(folderId, dialog, !!newDialogIndex);\n }\n\n if(wasIndex !== -1) {\n dialogs.splice(wasIndex, 1);\n }\n\n if(newDialogIndex) {\n insertInDescendSortedArray(dialogs, dialog, (dialog) => this.getDialogIndex(dialog, indexKey), -1);\n }\n\n return true;\n }\n\n public prepareDialogUnreadCountModifying(dialog: Dialog | ForumTopic, toggle?: boolean) {\n const isTopic = this.isTopic(dialog);\n const callbacks: NoneToVoidFunction[] = [];\n\n const folderId = isTopic ? this.getFilterIdForForum(dialog) : dialog.folder_id;\n callbacks.push(this.prepareFolderUnreadCountModifyingByDialog(folderId, dialog, toggle));\n\n if(!isTopic) {\n const filters = this.filtersStorage.getFilters();\n for(const id in filters) {\n const filter = filters[id];\n if(this.filtersStorage.testDialogForFilter(dialog, filter)) {\n callbacks.push(this.prepareFolderUnreadCountModifyingByDialog(filter.id, dialog, toggle));\n }\n }\n }\n\n return () => !toggle && callbacks.forEach((callback) => callback());\n }\n\n public prepareFolderUnreadCountModifyingByDialog(folderId: number, dialog: Dialog | ForumTopic, toggle?: boolean) {\n const wasUnreadCount = this.appMessagesManager.getDialogUnreadCount(dialog);\n const wasUnmuted = this.isDialogUnmuted(dialog);\n\n if(toggle !== undefined) {\n const addMessagesCount = toggle ? wasUnreadCount : -wasUnreadCount;\n this.modifyFolderUnreadCount(folderId, addMessagesCount, !!wasUnreadCount, wasUnreadCount && wasUnmuted, dialog);\n return;\n }\n\n return () => {\n const newUnreadCount = this.appMessagesManager.getDialogUnreadCount(dialog);\n const newUnmuted = this.isDialogUnmuted(dialog);\n\n const addMessagesCount = newUnreadCount - wasUnreadCount;\n this.modifyFolderUnreadCount(folderId, addMessagesCount, !!newUnreadCount, newUnreadCount && newUnmuted, dialog);\n };\n }\n\n public modifyFolderUnreadCount(\n folderId: number,\n addMessagesCount: number,\n toggleDialog: boolean,\n toggleUnmuted: boolean,\n dialog: Dialog | ForumTopic\n ) {\n const {peerId} = dialog;\n const isForum = this.appPeersManager.isForum(peerId);\n const isTopic = this.isTopic(dialog);\n if(isForum && !isTopic) {\n const forumUnreadCount = this.getForumUnreadCount(peerId);\n if(forumUnreadCount instanceof Promise) {\n forumUnreadCount.then(({count, hasUnmuted}) => {\n dialog = this.getDialogOnly(peerId);\n const folder = this.getFolder(folderId);\n if(\n !dialog ||\n !this.appPeersManager.isForum(peerId) ||\n !folder ||\n !folder.dialogs.some((dialog) => dialog.peerId === peerId)\n ) {\n return;\n }\n\n this.modifyFolderUnreadCount(folderId, 0, false, false, dialog);\n });\n\n return;\n } else {\n addMessagesCount = 0;\n toggleDialog = forumUnreadCount.count > 0;\n toggleUnmuted = forumUnreadCount.hasUnmuted;\n }\n }\n\n const folder = this.getFolder(folderId);\n if(addMessagesCount) {\n folder.unreadMessagesCount = Math.max(0, folder.unreadMessagesCount + addMessagesCount);\n }\n\n const key = this.getDialogKey(dialog);\n if(toggleDialog) {\n folder.unreadPeerIds.add(key);\n } else {\n folder.unreadPeerIds.delete(key);\n }\n\n if(toggleUnmuted) {\n folder.unreadUnmutedPeerIds.add(key);\n } else {\n folder.unreadUnmutedPeerIds.delete(key);\n }\n\n folder.dispatchUnreadTimeout ??= ctx.setTimeout(() => {\n folder.dispatchUnreadTimeout = undefined;\n const _folder = {...folder};\n delete _folder.dialogs;\n this.rootScope.dispatchEvent('folder_unread', _folder);\n\n if(isTopic) { // * refresh forum dialog unread count\n this.processChangedUnreadOrUnmuted(peerId);\n }\n }, 0);\n }\n\n public processChangedUnreadOrUnmuted(peerId: PeerId) {\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n this.processDialogForFilters(dialog);\n this.prepareDialogUnreadCountModifying(dialog)();\n this.rootScope.dispatchEvent('dialog_unread', {\n peerId,\n dialog\n });\n }\n }\n\n public generateIndexForDialog(\n dialog: Dialog | ForumTopic,\n justReturn?: boolean,\n message?: MyMessage,\n noPinnedOrderUpdate?: boolean\n ) {\n if(!justReturn/* && !isTopic */) {\n return;\n }\n\n const isTopic = this.isTopic(dialog);\n let topDate = 0, isPinned: boolean;\n if((dialog as ForumTopic).pFlags.hidden) { // general topic must be first\n topDate = this.generateDialogPinnedDateByIndex(0xFFF);\n isPinned = true;\n } else if(dialog.pFlags.pinned && !noPinnedOrderUpdate) {\n topDate = this.generateDialogPinnedDate(dialog);\n isPinned = true;\n } else {\n message ||= this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n\n topDate = (message as Message.message)?.date || topDate;\n\n if(!isTopic) {\n const channelId = this.appPeersManager.isChannel(dialog.peerId) && dialog.peerId.toChatId();\n if(channelId) {\n const channel = this.appChatsManager.getChat(channelId) as Chat.channel;\n if(!topDate || (channel.date && channel.date > topDate)) {\n topDate = channel.date;\n }\n }\n }\n\n if(dialog.draft?._ === 'draftMessage' && dialog.draft.date > topDate) {\n topDate = dialog.draft.date;\n }\n }\n\n topDate ||= tsNow(true);\n\n const index = this.generateDialogIndex(topDate, isPinned);\n if(justReturn) {\n return index;\n }\n\n const indexKey = getDialogIndexKey((dialog as Dialog).folder_id);\n setDialogIndex(dialog, indexKey, index);\n }\n\n public generateDialogPinnedDateByIndex(pinnedIndex: number) {\n return 0x7fff0000 + (pinnedIndex & 0xFFFF); // 0xFFFF - ะฟะพั‚ะพะผัƒ ั‡ั‚ะพ ะฒ ะฟะฐะฟะบะฐั… ะผะพะถะตั‚ ะฑั‹ั‚ัŒ ะฑะตัะบะพะฝะตั‡ะฝะพะต ั‡ะธัะปะพ ะฟะธะฝะฝะตะดะพะฒ\n }\n\n public generateDialogPinnedDate(dialog: Dialog | ForumTopic) {\n const isTopic = this.isTopic(dialog);\n const order = this.getPinnedOrders(isTopic ? this.getFilterIdForForum(dialog) : dialog.folder_id);\n\n const dialogKey = this.getDialogKey(dialog);\n let pinnedIndex = order.indexOf(dialogKey);\n if(pinnedIndex === -1) {\n order.unshift(dialogKey);\n pinnedIndex = 0;\n\n if(!isTopic) {\n this.savePinnedOrders();\n }\n }\n\n return this.generateDialogPinnedDateByIndex(order.length - 1 - 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 | ForumTopic) {\n if(this.isTopic(dialog)) {\n return;\n }\n\n const {peerId, pts} = dialog;\n const historyStorage = this.appMessagesManager.getHistoryStorage(peerId);\n const messagesStorage = this.appMessagesManager.getHistoryMessagesStorage(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 && !message.pFlags.is_outgoing/* || peerId === SERVICE_PEER_ID */) {\n incomingMessage = message;\n\n const peerIds = getPeerIdsFromMessage(message);\n this.peersStorage.requestPeersForKey(peerIds, `topMessage_${peerId}`);\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.peersStorage.requestPeer(peerId, 'dialog');\n\n /* for(let id in this.filtersStorage.filters) {\n const filter = this.filtersStorage.filters[id];\n\n if(this.filtersStorage.testDialogForFilter(dialog, filter)) {\n\n }\n } */\n }\n\n public pushDialog({dialog, offsetDate, ignoreOffsetDate, saveGlobalOffset}: {\n dialog: Dialog | ForumTopic,\n offsetDate?: number,\n ignoreOffsetDate?: boolean,\n saveGlobalOffset?: boolean\n }) {\n const isTopic = this.isTopic(dialog);\n const {folder_id, peerId} = dialog as Dialog;\n\n if(isTopic) {\n const forumTopics = this.getForumTopicsCache(peerId);\n forumTopics.topics.set(dialog.id, dialog);\n } else {\n this.dialogs[peerId] = dialog;\n }\n\n offsetDate ??= this.getDialogOffsetDate(dialog);\n\n // if(!isTopic) {\n this.processDialogForFilters(dialog);\n // }\n\n if(offsetDate && !dialog.pFlags.pinned) {\n if(!isTopic && 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 folderId = isTopic ? this.getFilterIdForForum(dialog) : folder_id;\n const savedOffsetDate = this.dialogsOffsetDate[folderId];\n if(!savedOffsetDate || offsetDate < savedOffsetDate) {\n // if(pos !== -1) {\n if(!ignoreOffsetDate && !this.isDialogsLoaded(folderId)) {\n this.dropDialog(peerId, isTopic ? this.getDialogKey(dialog) : undefined, true);\n return;\n }\n\n this.dialogsOffsetDate[folderId] = offsetDate;\n }\n }\n\n this.setDialogToState(dialog);\n\n // if(pos === -1) {\n // this.prepareFolderUnreadCountModifyingByDialog(folder_id, dialog, true);\n // }\n\n // const indexKey = getDialogIndexKey(folder_id);\n // /* const newPos = */insertInDescendSortedArray(dialogs, dialog, (dialog) => getDialogIndex(dialog, indexKey), -1);\n /* if(pos !== -1 && pos !== newPos) {\n rootScope.dispatchEvent('dialog_order', {dialog, pos: newPos});\n } */\n }\n\n public dropDialogFromFolders(peerId: PeerId, topicId?: number) {\n const foundDialog = this.getDialog(peerId, undefined, topicId, false);\n const [dialog, index] = foundDialog;\n if(dialog) {\n const filterId = topicId ?\n this.getFilterIdForForum(dialog as ForumTopic) :\n (dialog as Dialog).folder_id;\n\n // const folder = this.getFolder(filterId);\n // folder.dialogs.splice(index, 1);\n const wasPinned = indexOfAndSplice(this.getPinnedOrders(filterId), this.getDialogKey(dialog)) !== undefined;\n\n this.processDialogForFilters(dialog, true);\n\n this.dialogsIndex.indexObject(peerId, '');\n\n if(wasPinned) {\n this.savePinnedOrders();\n }\n }\n\n return foundDialog;\n }\n\n public dropDialog(peerId: PeerId, topicId?: number, keepLocal?: boolean) {\n const dialog = this.getDialogOrTopic(peerId, topicId);\n const foundDialog = this.dropDialogFromFolders(peerId, topicId);\n if(dialog) {\n if(!keepLocal) {\n if(topicId) {\n this.getForumTopicsCache(peerId).topics.delete(topicId);\n } else {\n delete this.dialogs[peerId];\n }\n }\n\n this.clearDialogFromState(dialog, keepLocal);\n }\n\n return foundDialog;\n }\n\n public clearDialogFromState(dialog: Dialog | ForumTopic, keepLocal: boolean) {\n if(dialog._ === 'forumTopic') {\n return;\n }\n\n const {peerId} = dialog;\n this.peersStorage.requestPeersForKey([], `topMessage_${peerId}`);\n this.peersStorage.releasePeer(peerId, 'dialog');\n this.storage.delete(peerId, keepLocal);\n }\n\n public dropDialogWithEvent(peerId: PeerId, topicId?: number) {\n const dropped = this.dropDialog(peerId, topicId);\n if(dropped.length) {\n this.rootScope.dispatchEvent('dialog_drop', dropped[0]);\n }\n\n return dropped;\n }\n\n /**\n * leaving chat, leaving channel, deleting private dialog\n */\n public dropDialogOnDeletion(peerId: PeerId, topicId?: number) {\n this.dropDialogWithEvent(peerId, topicId);\n this.rootScope.dispatchEvent('peer_deleted', peerId);\n }\n\n public applyDialogs(result: MessagesPeerDialogs | MessagesForumTopics, peerId?: PeerId) {\n // * ะ’ ัั‚ัƒ ั„ัƒะฝะบั†ะธัŽ ะฟะพะฟะฐะดัƒั‚ ั‚ะพะปัŒะบะพ ั‚ะต ะดะธะฐะปะพะณะธ, ะฒ ะบะพั‚ะพั€ั‹ั… ะตัั‚ัŒ read_inbox_max_id ะธ read_outbox_max_id, ะฒ ะพั‚ะปะธั‡ะธะต ะพั‚ ั‚ะตั…, ั‡ั‚ะพ ะฑัƒะดัƒั‚ ะฒ getTopMessages\n\n const isForum = result._ === 'messages.forumTopics';\n const items = (result as MessagesPeerDialogs).dialogs || (result as MessagesForumTopics).topics;\n if(!isForum) {\n // ! fix 'dialogFolder', maybe there is better way to do it, this only can happen by 'messages.getPinnedDialogs' by folder_id: 0\n forEachReverse(result.dialogs, (dialog, idx) => {\n if(dialog._ === 'dialogFolder') {\n result.dialogs.splice(idx, 1);\n }\n });\n } else {\n this.processTopics(peerId, result);\n }\n\n assumeType(items);\n\n this.appUsersManager.saveApiUsers(result.users);\n this.appChatsManager.saveApiChats(result.chats);\n this.appMessagesManager.saveMessages(result.messages);\n\n // this.appMessagesManager.log('applyConversation', dialogsResult);\n\n const updatedDialogs: BroadcastEvents['dialogs_multiupdate'] = new Map();\n const getUpdateCache = (peerId: PeerId) => {\n let cache = updatedDialogs.get(peerId);\n if(!cache) {\n updatedDialogs.set(peerId, cache = {});\n }\n\n return cache;\n };\n\n items.forEach((dialog) => {\n const peerId = this.appPeersManager.getPeerId(dialog.peer);\n let topMid = dialog.top_message;\n\n const topPendingMid = this.appMessagesManager.pendingTopMsgs[peerId];\n if(topPendingMid) {\n const topPendingMessage = this.appMessagesManager.getMessageByPeer(peerId, topPendingMid) as MyMessage;\n const topMessage = this.appMessagesManager.getMessageByPeer(peerId, topMid) as MyMessage;\n if(!topMid || (topPendingMessage && (!topMessage || topPendingMessage?.date > topMessage?.date))) {\n dialog.top_message = topMid = topPendingMid;\n this.appMessagesManager.getHistoryStorage(peerId).maxId = topPendingMid;\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(topMid || dialog.draft?._ === 'draftMessage') {\n if(this.saveDialog({dialog})) {\n const cache = getUpdateCache(peerId);\n\n if(isForum) {\n (cache.topics ??= new Map()).set(\n (dialog as ForumTopic).id,\n dialog as ForumTopic\n );\n } else {\n cache.dialog = dialog as Dialog;\n }\n }\n } else {\n this.dropDialogWithEvent(peerId, isForum ? this.getDialogKey(dialog) : undefined);\n }\n\n const key = this.appMessagesManager.getUpdateAfterReloadKey(peerId, isForum ? this.getDialogKey(dialog) : undefined);\n const updates = this.appMessagesManager.newUpdatesAfterReloadToHandle[key];\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[key];\n }\n }\n });\n\n if(updatedDialogs.size) {\n this.rootScope.dispatchEvent('dialogs_multiupdate', updatedDialogs);\n }\n }\n\n private getDialogOffsetDate(dialog: Dialog | ForumTopic) {\n const message = this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n return message?.date || 0;\n }\n\n public canSaveDialogByPeerId(peerId: PeerId) {\n if(peerId.isAnyChat()) {\n const chat: Chat = this.appChatsManager.getChat(peerId.toChatId());\n // ! chatForbidden stays for chat where you're kicked\n if(\n chat._ === 'channelForbidden' ||\n // || chat._ === 'chatForbidden'\n (chat as Chat.chat).pFlags.left\n // || (chat as any).pFlags.kicked\n ) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Won't save migrated from peer, forbidden peers, left and kicked\n */\n public saveDialog({\n dialog,\n folderId,\n ignoreOffsetDate,\n saveGlobalOffset\n }: {\n dialog: Dialog | ForumTopic,\n folderId?: REAL_FOLDER_ID,\n ignoreOffsetDate?: boolean,\n saveGlobalOffset?: boolean\n }) {\n const isTopic = this.isTopic(dialog);\n const isDialog = !isTopic;\n\n const topicId = isTopic ? dialog.id = generateMessageId(dialog.id) : undefined;\n if(!isTopic) {\n folderId ??= dialog.folder_id ?? FOLDER_ID_ALL;\n }\n\n const peerId = this.appPeersManager.getPeerId(dialog.peer);\n if(!peerId) {\n console.error('saveConversation no peerId???', dialog, folderId);\n return false;\n }\n\n if(!isTopic && dialog._ !== 'dialog'/* || peerId === 239602833 */) {\n console.error('saveConversation not regular dialog', dialog, Object.assign({}, dialog));\n }\n\n if(isDialog && !this.canSaveDialogByPeerId(peerId)) {\n return false;\n }\n\n const channelId = this.appPeersManager.isChannel(peerId) ? peerId.toChatId() : NULL_PEER_ID;\n\n if(isDialog) {\n const peerText = this.appPeersManager.getPeerSearchText(peerId);\n this.dialogsIndex.indexObject(peerId, peerText);\n }\n\n const wasDialogBefore = this.getDialogOrTopic(peerId, topicId);\n\n let mid: number, message: MyMessage;\n if(dialog.top_message) {\n mid = 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(isDialog && !channelId && peerId.isAnyChat()) {\n const chat = this.appChatsManager.getChat(peerId.toChatId()) as Chat.chat;\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 === getServerMessageId(wasDialogBefore.read_inbox_max_id) ? wasDialogBefore.unread_count : dialog.unread_count;\n dialog.read_inbox_max_id = generateMessageId(wasDialogBefore && !dialog.read_inbox_max_id ? wasDialogBefore.read_inbox_max_id : dialog.read_inbox_max_id);\n dialog.read_outbox_max_id = generateMessageId(wasDialogBefore && !dialog.read_outbox_max_id ? wasDialogBefore.read_outbox_max_id : dialog.read_outbox_max_id);\n\n if(isDialog && dialog.folder_id === undefined) {\n if(dialog._ === 'dialog') {\n // ! ะกะ›ะžะ–ะะž ! ะกะœะžะขะ ะ˜ ะ’ getTopMessages\n dialog.folder_id = wasDialogBefore ? (wasDialogBefore as typeof dialog).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, threadId: topicId, draft: dialog.draft});\n dialog.peerId = peerId;\n // dialog.indexes ??= {} as any;\n\n // Because we saved message without dialog present\n if(message && 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, topicId);\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 this.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 this.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 threadId: isTopic ? dialog.id : undefined,\n settings: dialog.notify_settings\n });\n\n if(isDialog && channelId && dialog.pts) {\n this.apiUpdatesManager.addChannelState(channelId, dialog.pts);\n }\n\n this.generateIndexForDialog(dialog);\n\n if(wasDialogBefore) {\n // fix unread count\n const releaseUnreadCount = this.dialogsStorage.prepareDialogUnreadCountModifying(wasDialogBefore);\n safeReplaceObject(wasDialogBefore, dialog);\n releaseUnreadCount();\n }\n\n this.pushDialog({\n dialog,\n offsetDate: message?.date,\n ignoreOffsetDate,\n saveGlobalOffset\n });\n\n if(isTopic) {\n this.processTopicUpdate(dialog, wasDialogBefore as ForumTopic);\n }\n\n return true;\n }\n\n public processTopicUpdate(topic: ForumTopic, oldTopic?: ForumTopic) {\n if(!oldTopic) {\n return;\n }\n\n const {peerId, id: threadId} = topic;\n const isIconChanged = topic.icon_emoji_id !== (oldTopic as ForumTopic).icon_emoji_id;\n const isTitleChanged = topic.title !== (oldTopic as ForumTopic).title;\n const isChanged = isIconChanged || isTitleChanged;\n\n if(isIconChanged) {\n this.rootScope.dispatchEvent('avatar_update', {peerId, threadId});\n }\n\n if(isChanged) {\n this.rootScope.dispatchEvent('peer_title_edit', {peerId, threadId});\n }\n }\n\n public getDialogs(options: {\n query?: string,\n offsetIndex?: number,\n limit?: number,\n filterId?: number,\n skipMigrated?: boolean\n }): MaybePromise<{\n dialogs: Folder['dialogs'],\n count: number,\n isTopEnd: boolean,\n isEnd: boolean\n }> {\n const {\n query = '',\n offsetIndex,\n limit = 20,\n filterId = FOLDER_ID_ALL,\n skipMigrated = false\n } = options;\n\n const isForum = this.isFilterIdForForum(filterId);\n if(!isForum && !REAL_FOLDERS.has(filterId)) {\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.filtersStorage.reloadMissingPeerIds(filterId);\n if(reloadMissingDialogsPromise) {\n promises.push(reloadMissingDialogsPromise);\n }\n\n if(promises.length) {\n return Promise.all(promises).then(() => {\n return this.getDialogs(options);\n });\n }\n }\n\n // let's load only first pages by certain folderId. next pages will load without folder filtering\n const realFolderId/* : REAL_FOLDER_ID */ =\n (!REAL_FOLDERS.has(filterId) || this.getOffsetDate(filterId)) && !isForum ?\n GLOBAL_FOLDER_ID :\n filterId/* as REAL_FOLDER_ID */;\n let curDialogStorage = this.getFolderDialogs(filterId, skipMigrated);\n\n const indexKey = this.getDialogIndexKeyByFilterId(filterId);\n\n if(query && !isForum) {\n if(!limit || this.cachedResults.query !== query || this.cachedResults.folderId !== filterId) {\n this.cachedResults.query = query;\n this.cachedResults.folderId = filterId;\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 === filterId) {\n dialogs.push(dialog);\n }\n }\n\n dialogs.sort((d1, d2) => this.getDialogIndex(d2, indexKey) - this.getDialogIndex(d1, indexKey));\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 > this.getDialogIndex(curDialogStorage[offset], indexKey)) {\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 return {\n dialogs,\n count: loadedAll ? curDialogStorage.length : null,\n isTopEnd: curDialogStorage.length && ((dialogs[0] && dialogs[0] === curDialogStorage[0]) || this.getDialogIndex(curDialogStorage[0], indexKey) < offsetIndex),\n isEnd: (query || loadedAll) && (offset + limit) >= curDialogStorage.length\n };\n }\n\n return this.appMessagesManager.getTopMessages({limit, folderId: realFolderId}).then((result) => {\n // const curDialogStorage = this[folderId];\n if(skipMigrated) {\n curDialogStorage = this.getFolderDialogs(filterId, skipMigrated);\n }\n\n offset = 0;\n if(offsetIndex > 0) {\n for(let length = curDialogStorage.length; offset < length; ++offset) {\n if(offsetIndex > this.getDialogIndex(curDialogStorage[offset], indexKey)) {\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]) || this.getDialogIndex(curDialogStorage[0], indexKey) < offsetIndex),\n // isEnd: this.isDialogsLoaded(realFolderId) && (offset + limit) >= curDialogStorage.length\n isEnd: result.isEnd\n };\n });\n }\n\n // * FORUMS SECTION\n\n public flushForumTopicsCache(peerId: PeerId) {\n const cache = this.forumTopics.get(peerId);\n if(!cache) {\n return;\n }\n\n const folder = this.folders[peerId];\n if(folder) {\n if(folder.dispatchUnreadTimeout) {\n clearTimeout(folder.dispatchUnreadTimeout);\n }\n\n delete this.allDialogsLoaded[peerId];\n delete this.pinnedOrders[peerId];\n delete this.dialogsOffsetDate[peerId];\n delete this.folders[peerId];\n }\n\n cache.topics.clear();\n\n // for permanent delete\n // this.forumTopics.delete(peerId);\n }\n\n public getForumTopicsCache(peerId: PeerId) {\n let forumTopics = this.forumTopics.get(peerId);\n if(!forumTopics) {\n forumTopics = {\n topics: new Map(),\n deletedTopics: new Set(),\n getTopicPromises: new Map()\n };\n\n this.forumTopics.set(peerId, forumTopics);\n }\n\n return forumTopics;\n }\n\n public getForumTopicById(peerId: PeerId, topicId?: number): Promise {\n if(!this.appPeersManager.isForum(peerId)) {\n return Promise.reject(makeError('CHANNEL_FORUM_MISSING'));\n }\n\n const cache = this.getForumTopicsCache(peerId);\n let promise: CancellablePromise;\n if(topicId) {\n promise = cache.getTopicPromises.get(topicId);\n if(promise) {\n return promise;\n }\n\n if(cache.deletedTopics.has(topicId)) {\n return Promise.resolve(undefined);\n }\n\n cache.getTopicPromises.set(topicId, promise = deferredPromise());\n }\n\n cache.getTopicsPromise ??= pause(0).then(() => {\n const promises: {[topicId: number]: typeof promise} = {};\n const ids: number[] = [];\n for(const [topicId, promise] of cache.getTopicPromises) {\n promises[topicId] = promise;\n ids.push(getServerMessageId(topicId));\n }\n\n cache.getTopicPromises.clear();\n\n const fullfillLeft = () => {\n for(const topicId in promises) {\n promises[topicId].resolve(undefined);\n cache.deletedTopics.add(+topicId);\n }\n };\n\n if(this.getForumTopicsCache(peerId) !== cache) {\n fullfillLeft();\n return;\n }\n\n return this.apiManager.invokeApi('channels.getForumTopicsByID', {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n topics: ids\n }).then((messagesForumTopics) => {\n if(this.getForumTopicsCache(peerId) !== cache) {\n return;\n }\n\n this.applyDialogs(messagesForumTopics, peerId);\n\n messagesForumTopics.topics.forEach((forumTopic) => {\n if(forumTopic._ === 'forumTopic') {\n promises[forumTopic.id].resolve(forumTopic);\n delete promises[peerId];\n }\n });\n\n return messagesForumTopics;\n }, () => {}).then(() => {\n fullfillLeft();\n\n cache.getTopicsPromise = undefined;\n if(cache.getTopicPromises.size) {\n this.getForumTopicById(peerId);\n }\n });\n });\n\n return promise || cache.getTopicsPromise;\n }\n\n // public getForumTopicById(peerId: PeerId, topicId: number) {\n // return this.getForumTopicsByID(peerId, topicId).then((result) => result.topics[0]);\n // }\n\n public getForumTopic(peerId: PeerId, topicId: number) {\n const forumTopics = this.forumTopics.get(peerId);\n return forumTopics?.topics?.get(topicId);\n }\n\n public getForumTopicOrReload(peerId: PeerId, topicId: number) {\n const forumTopic = this.getForumTopic(peerId, topicId);\n if(forumTopic) {\n return forumTopic;\n }\n\n const cache = this.getForumTopicsCache(peerId);\n return cache?.deletedTopics?.has(topicId) ? undefined : this.getForumTopicById(peerId, topicId);\n }\n\n public processTopics>(peerId: PeerId, result: T) {\n return callbackify(result, (result) => {\n if('pts' in result) {\n this.apiUpdatesManager.addChannelState(peerId.toChatId(), result.pts);\n }\n\n const peer = this.appPeersManager.getOutputPeer(peerId);\n result.topics = result.topics.map((topic) => {\n if(topic._ === 'forumTopicDeleted') {\n return;\n }\n\n (topic as ForumTopic).peer = peer;\n topic.id = generateMessageId(topic.id);\n return topic;\n }).filter(Boolean);\n\n return result;\n });\n }\n\n public processTopicsPromise[1]>>(peerId: PeerId, promise: T): T {\n return promise.then((result) => {\n this.processTopics(peerId, result);\n return result;\n }) as any;\n }\n\n public getForumUnreadCount(peerId: PeerId) {\n if(!this.appPeersManager.isForum(peerId)) {\n return;\n }\n\n const folder = this.getFolder(peerId);\n\n const f = folder.dialogs.length >= 20 || this.isDialogsLoaded(peerId) ?\n folder.dialogs.slice(0, 20) :\n callbackify(this.getDialogs({filterId: peerId, limit: 20}), (result) => {\n return result.dialogs;\n });\n\n return callbackify(f, (dialogs) => {\n return {\n count: dialogs.reduce((acc, v) => acc + +!!v.unread_count, 0),\n hasUnmuted: dialogs.some((dialog) => dialog.unread_count && this.isDialogUnmuted(dialog))\n };\n });\n }\n\n // * FORUMS SECTION END\n\n private handleDialogTogglePinned(dialog: Dialog | ForumTopic, pinned: boolean, folderId: number) {\n if(dialog) {\n if(!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(dialog.peerId, dialog);\n }\n\n private handleDialogsPinned(folderId: number, order: (Dialog['peerId'] | ForumTopic['id'])[]) {\n const isForum = this.isFilterIdForForum(folderId);\n this.resetPinnedOrder(folderId);\n this.getPinnedOrders(folderId).push(...order);\n this.savePinnedOrders();\n order.reverse(); // index must be higher\n const newPinned: {[id: typeof order[0]]: true} = {};\n order.forEach((id) => {\n newPinned[id] = true;\n\n const peerId = isForum ? folderId : id;\n const topicId = isForum ? id : undefined;\n\n const dialog = this.getDialogOrTopic(peerId, topicId);\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 if(!newPinned[this.getDialogKey(dialog)]) {\n delete dialog.pFlags.pinned;\n this.generateIndexForDialog(dialog);\n this.appMessagesManager.scheduleHandleNewDialogs(dialog.peerId, dialog);\n }\n }\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 as Dialog).folder_id = folder_id as REAL_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 ?? FOLDER_ID_ALL;\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 this.handleDialogTogglePinned(dialog, update.pFlags.pinned, folderId);\n };\n\n private onUpdateChannelPinnedTopic = (update: Update.updateChannelPinnedTopic) => {\n const peerId = update.channel_id.toPeerId(true);\n const topicId = generateMessageId(update.topic_id);\n const topic = this.getForumTopic(peerId, topicId);\n if(!topic) {\n return;\n }\n\n this.handleDialogTogglePinned(topic, update.pFlags.pinned, this.getFilterIdForForum(topic));\n };\n\n private onUpdatePinnedDialogs = (update: Update.updatePinnedDialogs) => {\n const folderId = update.folder_id ?? FOLDER_ID_ALL;\n\n if(update.order) {\n this.handleDialogsPinned(folderId, update.order.map((peer) => this.appPeersManager.getPeerId((peer as DialogPeer.dialogPeer).peer)));\n } else {\n this.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 this.handleDialogsPinned(folderId, dialogsResult.dialogs.map((d) => d.peerId));\n });\n }\n };\n\n private onUpdateChannelPinnedTopics = async(update: Update.updateChannelPinnedTopics) => {\n const peerId = update.channel_id.toPeerId(true);\n const forumTopics = this.forumTopics.get(peerId);\n if(!forumTopics) {\n return;\n }\n\n const filterId = peerId;\n if(update.order) {\n const order = update.order.map((topicId) => generateMessageId(topicId));\n this.handleDialogsPinned(filterId, order);\n } else {\n const limit = await this.apiManager.getLimit('topicPin', true);\n\n const promise = this.apiManager.invokeApi('channels.getForumTopics', {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n limit,\n offset_date: 0,\n offset_id: 0,\n offset_topic: 0\n });\n\n const result = await this.processTopics(peerId, promise);\n\n const topics = result.topics as ForumTopic[];\n const pinned = topics.filter((topic) => topic.pFlags.pinned);\n this.handleDialogsPinned(filterId, pinned.map((topic) => topic.id));\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 {DialogFilter, ForumTopic, Update} from '../../layer';\nimport type {Dialog} from '../appManagers/appMessagesManager';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport copy from '../../helpers/object/copy';\nimport {AppManager} from '../appManagers/manager';\nimport findAndSplice from '../../helpers/array/findAndSplice';\nimport assumeType from '../../helpers/assumeType';\nimport {FOLDER_ID_ALL, FOLDER_ID_ARCHIVE, REAL_FOLDERS, REAL_FOLDER_ID, START_LOCAL_ID} from '../mtproto/mtproto_config';\nimport makeError from '../../helpers/makeError';\n\nexport type MyDialogFilter = DialogFilter.dialogFilter;\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\nconst PREPENDED_FILTERS = REAL_FOLDERS.size;\n\nconst LOCAL_FILTER: MyDialogFilter = {\n _: 'dialogFilter',\n pFlags: {},\n flags: 0,\n id: 0,\n title: '',\n exclude_peers: [],\n include_peers: [],\n pinned_peers: [],\n excludePeerIds: [],\n includePeerIds: [],\n pinnedPeerIds: []\n};\n\nexport default class FiltersStorage extends AppManager {\n private filters: {[filterId: string]: MyDialogFilter};\n private filtersArr: Array;\n private localFilters: {[filterId: string]: MyDialogFilter};\n private localId: number;\n private reloadedPeerIds: Set;\n\n protected after() {\n this.clear(true);\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateDialogFilter: this.onUpdateDialogFilter,\n\n updateDialogFilters: this.onUpdateDialogFilters,\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(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 this.rootScope.addEventListener('premium_toggle', () => {\n this.onUpdateDialogFilters({_: 'updateDialogFilters'});\n });\n\n return this.appStateManager.getState().then((state) => {\n const filtersArr = this.prependFilters(state.filtersArr);\n filtersArr.map((filter) => {\n this.saveDialogFilter(filter, false, true);\n });\n });\n }\n\n /**\n * ! use it only with saving\n */\n private prependFilters(filters: DialogFilter[]) {\n filters = filters.slice();\n\n const allChatsFilter = this.localFilters[FOLDER_ID_ALL];\n const archiveFilter = this.localFilters[FOLDER_ID_ARCHIVE];\n\n const allChatsFilterIndex = filters.findIndex((filter) => filter._ === 'dialogFilterDefault' || filter.id === FOLDER_ID_ALL);\n if(allChatsFilterIndex !== -1) filters[allChatsFilterIndex] = allChatsFilter;\n else filters.unshift(allChatsFilter);\n\n findAndSplice(filters, (filter) => (filter as MyDialogFilter).id === FOLDER_ID_ARCHIVE);\n filters.splice(/* 1 */filters[0] === allChatsFilter ? 1 : 0, 0, archiveFilter);\n\n this.localId = START_LOCAL_ID;\n filters.forEach((filter) => {\n delete filter.localId;\n });\n\n return filters;\n }\n\n private generateLocalFilter(id: REAL_FOLDER_ID) {\n const filter: MyDialogFilter = {...copy(LOCAL_FILTER), id};\n if(id === FOLDER_ID_ALL) {\n filter.pFlags.exclude_archived = true;\n } else if(id === FOLDER_ID_ARCHIVE) {\n filter.pFlags.exclude_unarchived = true;\n }\n\n if(REAL_FOLDERS.has(id)) {\n filter.pinnedPeerIds = this.dialogsStorage.getPinnedOrders(id);\n }\n\n return filter;\n }\n\n // private getLocalFilter(id: number) {\n // return this.filters[id] ??= this.generateLocalFilter(id);\n // }\n\n public clear = (init?: boolean) => {\n if(!init) {\n // safeReplaceObject(this.filters, {});\n this.reloadedPeerIds.clear();\n this.clearFilters();\n } else {\n this.filters = {};\n this.filtersArr = [];\n this.reloadedPeerIds = new Set();\n\n this.localFilters = {};\n for(const filterId of REAL_FOLDERS) {\n this.localFilters[filterId] = this.generateLocalFilter(filterId as REAL_FOLDER_ID);\n }\n }\n\n this.localId = START_LOCAL_ID;\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 findAndSplice(this.filtersArr, (filter) => (filter as DialogFilter.dialogFilter).id === update.id);\n }\n\n this.pushToState();\n };\n\n private onUpdateDialogFilters = (update: Update.updateDialogFilters) => {\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 private onUpdateDialogFilterOrder = (update: Update.updateDialogFilterOrder) => {\n // console.log('updateDialogFilterOrder', update);\n\n const order = update.order.slice();\n if(!order.includes(FOLDER_ID_ARCHIVE)) {\n order.splice(order[0] === FOLDER_ID_ALL ? 1 : 0, 0, FOLDER_ID_ARCHIVE);\n }\n\n this.localId = START_LOCAL_ID;\n order.forEach((filterId) => {\n const filter = this.filters[filterId];\n delete filter.localId;\n this.setLocalId(filter);\n });\n\n this.rootScope.dispatchEvent('filter_order', order);\n\n this.pushToState();\n };\n\n private pushToState() {\n this.appStateManager.pushToState('filtersArr', this.filtersArr);\n }\n\n public testDialogForFilter(dialog: Dialog | ForumTopic.forumTopic, filter?: MyDialogFilter) {\n if(!filter) {\n return true;\n }\n\n if(REAL_FOLDERS.has(filter.id)) {\n return (dialog as Dialog).folder_id === filter.id && this.dialogsStorage.canSaveDialogByPeerId(dialog.peerId);\n }\n\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 as Dialog).folder_id === FOLDER_ID_ARCHIVE) {\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 getFilters() {\n return this.filters;\n }\n\n public clearFilters() {\n const filters = this.getFilters();\n for(const filterId in filters) { // delete filters\n if(REAL_FOLDERS.has(+filterId)) {\n continue;\n }\n\n this.onUpdateDialogFilter({\n _: 'updateDialogFilter',\n id: +filterId\n });\n }\n }\n\n public async 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 >= (await this.apiManager.getConfig()).pinned_infolder_count_max) {\n return Promise.reject(makeError('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 this.apiManager.invokeApi('messages.updateDialogFilter', {\n flags,\n id: filter.id,\n filter: remove ? undefined : this.getOutputDialogFilter(filter)\n }).then((bool) => { // ะฒะพะทะผะพะถะฝะพ ะฝัƒะถะฝะฐ ะฟั€ะพะฒะตั€ะบะฐ ะธ ะพั‚ะบะฐั‚, ะตัะปะธ ั€ะตะทัƒะปัŒั‚ะฐั‚ ะฝะต ะขะ ะฃ\n // console.log('updateDialogFilter bool:', bool);\n\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.localId;\n f.push(filter);\n }\n\n filter.localId = START_LOCAL_ID;\n\n const order = f.sort((a, b) => a.localId - b.localId).map((filter) => filter.id);\n this.onUpdateDialogFilterOrder({\n _: 'updateDialogFilterOrder',\n order\n });\n }\n });\n }\n\n public updateDialogFiltersOrder(order: number[]) {\n return this.apiManager.invokeApi('messages.updateDialogFiltersOrder', {\n order\n }).then(() => {\n this.onUpdateDialogFilterOrder({\n _: 'updateDialogFilterOrder',\n order\n });\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 // private spliceMissingPeerIds(filterId: number, type: ArgumentTypes[1], missingPeerIds: PeerId[]) {\n // const filter = this.getFilter(filterId);\n // const peers = filter && filter[type];\n // if(!peers?.length) {\n // return;\n // }\n\n // let spliced = false;\n // missingPeerIds.forEach((peerId) => {\n // const inputPeer = findAndSplice(peers, (inputPeer) => getPeerId(inputPeer) === peerId);\n // if(inputPeer) {\n // spliced = true;\n // }\n // });\n\n // if(spliced) {\n // this.onUpdateDialogFilter({\n // _: 'updateDialogFilter',\n // id: filterId,\n // filter\n // });\n // }\n // }\n\n public reloadMissingPeerIds(\n filterId: number,\n type: 'pinned_peers' | 'include_peers' | 'exclude_peers' = 'pinned_peers'\n ) {\n const filter = this.getFilter(filterId);\n const peers = filter?.[type];\n if(!peers?.length) {\n return;\n }\n\n // const missingPeerIds: PeerId[] = [];\n const reloadDialogs = peers.filter((inputPeer) => {\n const peerId = this.appPeersManager.getPeerId(inputPeer);\n const isAlreadyReloaded = this.reloadedPeerIds.has(peerId);\n const dialog = this.appMessagesManager.getDialogOnly(peerId);\n // if(isAlreadyReloaded && !dialog) {\n // missingPeerIds.push(peerId);\n // }\n\n const reload = !isAlreadyReloaded && !dialog;\n return reload;\n });\n\n if(!reloadDialogs.length) {\n // if(missingPeerIds.length) {\n // this.spliceMissingPeerIds(filterId, type, missingPeerIds);\n // }\n\n return;\n }\n\n const reloadPromises = reloadDialogs.map((inputPeer) => {\n const peerId = this.appPeersManager.getPeerId(inputPeer);\n const promise = this.appMessagesManager.reloadConversation(inputPeer)\n .then((dialog) => {\n this.reloadedPeerIds.add(peerId);\n\n return dialog ? undefined : peerId;\n });\n\n return promise;\n });\n\n const reloadPromise = Promise.all(reloadPromises).then((missingPeerIds) => {\n missingPeerIds = missingPeerIds.filter(Boolean);\n if(!missingPeerIds.length) {\n return;\n }\n\n // this.spliceMissingPeerIds(filterId, type, missingPeerIds);\n });\n\n return reloadPromise;\n }\n\n public async getDialogFilters(overwrite = false): Promise {\n const keys = Object.keys(this.filters);\n if(keys.length > PREPENDED_FILTERS && !overwrite) {\n return keys.map((filterId) => this.filters[filterId]).sort((a, b) => a.localId - b.localId);\n }\n\n const filters = await this.apiManager.invokeApiSingle('messages.getDialogFilters');\n const prepended = this.prependFilters(filters);\n return prepended.map((filter) => this.saveDialogFilter(filter, overwrite)).filter(Boolean);\n }\n\n public getSuggestedDialogsFilters() {\n return this.apiManager.invokeApi('messages.getSuggestedDialogFilters');\n }\n\n public saveDialogFilter(filter: DialogFilter, update = true, silent?: boolean) {\n // defineNotNumerableProperties(filter, ['includePeerIds', 'excludePeerIds', 'pinnedPeerIds']);\n\n if(filter._ === 'dialogFilterDefault') {\n filter = this.localFilters[FOLDER_ID_ALL];\n }\n\n assumeType(filter);\n if(!REAL_FOLDERS.has(filter.id)) {\n convertment.forEach(([from, to]) => {\n assumeType(filter);\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\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.setLocalId(filter);\n\n if(!silent) {\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 return filter;\n }\n\n private setLocalId(filter: MyDialogFilter) {\n if(filter.localId !== undefined) {\n if(filter.localId >= this.localId) {\n this.localId = filter.localId + 1;\n }\n } else {\n filter.localId = this.localId++ as MyDialogFilter['localId'];\n findAndSplice(this.filtersArr, (_filter) => _filter.id === filter.id);\n this.filtersArr.push(filter);\n this.pushToState();\n }\n }\n\n public async isFilterIdAvailable(filterId: number) {\n if(REAL_FOLDERS.has(filterId)) {\n return true;\n }\n\n const limit = await this.apiManager.getLimit('folders');\n const isFolderAvailable = this.filtersArr.filter((filter) => !REAL_FOLDERS.has(filter.id)).slice(0, limit).some((filter) => filter.id === filterId);\n\n return isFolderAvailable;\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 applyMixins(derivedCtor: any, constructors: any[]) {\n // const callbacks: Array<(...args: any[]) => any> = [];\n\n constructors.forEach((baseCtor) => {\n Object.getOwnPropertyNames(baseCtor.prototype).forEach((name) => {\n const value: PropertyDescriptor = Object.getOwnPropertyDescriptor(baseCtor.prototype, name) || Object.create(null);\n /* if(name === '_constructor') {\n callbacks.push(value.value);\n return;\n } else */if(name === 'constructor') {\n return;\n }\n\n Object.defineProperty(\n derivedCtor.prototype,\n name,\n value\n );\n });\n });\n\n // if(callbacks.length) {\n // function c(...args: any[]): any {\n // callbacks.forEach((cb, idx) => {\n // // @ts-ignore\n // cb.apply(this, args[idx] || []);\n // });\n // };\n\n // Object.defineProperty(derivedCtor.prototype, 'superConstructor', {\n // configurable: true,\n // enumerable: true,\n // value: c,\n // writable: true\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/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport DEBUG from '../../config/debug';\nimport {ConstructorDeclMap, Message, MessageEntity, MessageFwdHeader, Peer, Update, Updates} from '../../layer';\nimport {logger, LogTypes} from '../logger';\nimport assumeType from '../../helpers/assumeType';\nimport App from '../../config/app';\nimport filterUnique from '../../helpers/array/filterUnique';\nimport {AppManager} from './manager';\nimport parseMarkdown from '../richTextProcessor/parseMarkdown';\nimport ctx from '../../environment/ctx';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport applyMixins from '../../helpers/applyMixins';\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?: boolean,\n timeout: number\n },\n syncLoading: Promise,\n\n seq?: number,\n pts?: number,\n date?: number,\n lastPtsUpdateTime?: number,\n lastDifferenceTime?: number\n};\n\nconst SYNC_DELAY = 6;\n\nclass 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 subscriptions: {[channelId: ChatId]: {count: number, interval?: number}} = {};\n\n constructor() {\n this._constructor(false);\n }\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 this.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?.seqAwaiting &&\n state.seq >= state.syncPending.seqAwaiting) {\n if(!state.syncPending.ptsAwaiting) {\n this.clearStatePendingSync(state);\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 this.clearStatePendingSync(curState);\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 ? this.appPeersManager.peerId : (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) || this.appPeersManager.peerId);\n\n this.processUpdate({\n _: 'updateNewMessage',\n message: {\n _: 'message',\n pFlags: updateMessage.pFlags,\n id: updateMessage.id,\n from_id: this.appPeersManager.getOutputPeer(fromId.toPeerId()),\n peer_id: this.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 this.appUsersManager.saveApiUsers(updateMessage.users, options.override);\n this.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 const wasSyncing = updatesState.syncLoading;\n if(!wasSyncing) {\n updatesState.pendingSeqUpdates = {};\n updatesState.pendingPtsUpdates = [];\n }\n\n this.clearStatePendingSync(updatesState);\n\n const promise = this.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 this.rootScope.dispatchEvent('state_synchronizing');\n }\n\n if(differenceResult._ !== 'updates.differenceTooLong') {\n this.appUsersManager.saveApiUsers(differenceResult.users);\n this.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) + this.timeManager.getServerTimeOffset();\n delete updatesState.seq;\n\n this.channelStates = {};\n\n this.log.warn('getDifference:', differenceResult._);\n this.onDifferenceTooLong();\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 clearStatePendingSync(state: UpdatesState) {\n if(state.syncPending) {\n clearTimeout(state.syncPending.timeout);\n state.syncPending = null;\n }\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 this.clearStatePendingSync(channelState);\n\n const log = this.debug ? this.log.bindPrefix('getChannelDifference-' + channelId) : undefined;\n // this.log.trace('Get channel diff', appChatsManager.getChat(channelId), channelState.pts);\n const promise = this.apiManager.invokeApi('updates.getChannelDifference', {\n channel: this.appChatsManager.getChannelInput(channelId),\n filter: {_: 'channelMessagesFilterEmpty'},\n pts: channelState.pts,\n limit: 1000\n }, {timeout: 0x7fffffff}).then((differenceResult) => {\n log?.debug('diff result', differenceResult)\n channelState.pts = 'pts' in differenceResult ? differenceResult.pts : undefined;\n channelState.lastDifferenceTime = Date.now();\n\n if(differenceResult._ === 'updates.channelDifferenceEmpty') {\n // log?.debug('apply channel empty diff', differenceResult);\n return;\n }\n\n if(differenceResult._ === 'updates.channelDifferenceTooLong') {\n // 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 this.appUsersManager.saveApiUsers(differenceResult.users);\n this.appChatsManager.saveApiChats(differenceResult.chats);\n\n // Should be first because of updateMessageID\n log?.debug('applying', differenceResult.other_updates.length, 'channel other updates');\n differenceResult.other_updates.forEach((update) => {\n this.saveUpdate(update);\n });\n\n 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 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 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 onDifferenceTooLong() {\n this.appUsersManager.clear();\n this.appChatsManager.clear();\n this.appMessagesManager.clear();\n\n this.rootScope.dispatchEvent('state_cleared');\n }\n\n private justAName(state: UpdatesState, promise: UpdatesState['syncLoading'], channelId?: ChatId) {\n state.syncLoading = promise;\n this.rootScope.dispatchEvent('state_synchronizing', channelId);\n\n promise.then(() => {\n state.syncLoading = null;\n this.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 return this.channelStates[channelId] ??= {\n pts,\n pendingPtsUpdates: [],\n syncPending: null,\n syncLoading: null\n };\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 = this.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 = this.appPeersManager.getPeerId(message.peer_id);\n const fwdHeader: MessageFwdHeader.messageFwdHeader = message.fwd_from || {} as any;\n let reason: string;\n if(message.from_id && !this.appUsersManager.hasUser(this.appPeersManager.getPeerId(message.from_id), message.pFlags.post/* || channelId*/) && (reason = 'author') ||\n fwdHeader.from_id && !this.appUsersManager.hasUser(this.appPeersManager.getPeerId(fwdHeader.from_id), !!(fwdHeader.from_id as Peer.peerChannel).channel_id) && (reason = 'fwdAuthor') ||\n (fwdHeader.from_id as Peer.peerChannel)?.channel_id && !this.appChatsManager.hasChat((fwdHeader.from_id as Peer.peerChannel).channel_id, true) && (reason = 'fwdChannel') ||\n toPeerId.isUser() && !this.appUsersManager.hasUser(toPeerId) && (reason = 'toPeer User') ||\n toPeerId.isAnyChat() && !this.appChatsManager.hasChat(toPeerId.toChatId()) && (reason = 'toPeer Chat')) {\n this.log.warn('Not enough data for message update', toPeerId, reason, message);\n if(channelId && this.appChatsManager.hasChat(channelId)) {\n this.getChannelDifference(channelId);\n } else {\n this.forceGetDifference();\n }\n return false;\n }\n } else if(channelId && !this.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 && this.appChatsManager.getChat(channelId));\n curState.pendingPtsUpdates.push(update as Update.updateNewMessage);\n if(!curState.syncPending && !curState.syncLoading) {\n curState.syncPending = {\n timeout: ctx.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?.seqAwaiting);\n\n curState.pendingSeqUpdates[seqStart] ??= {seq, date: options.date, updates: []};\n curState.pendingSeqUpdates[seqStart].updates.push(update);\n\n if(!curState.syncPending) {\n curState.syncPending = {\n timeout: ctx.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 this.dispatchEvent(update._, update as any);\n }\n\n public subscribeToChannelUpdates(channelId: ChatId) {\n const subscription = this.subscriptions[channelId] ??= {count: 0};\n ++subscription.count;\n\n const cb = () => {\n const state = this.getChannelState(channelId);\n if(!state.syncLoading && (!state.lastDifferenceTime || (Date.now() - state.lastDifferenceTime) > 2500)) {\n this.getChannelDifference(channelId);\n }\n };\n\n subscription.interval ??= ctx.setInterval(cb, 3000);\n cb();\n }\n\n public unsubscribeFromChannelUpdates(channelId: ChatId, force?: boolean) {\n const subscription = this.subscriptions[channelId];\n if(!subscription?.interval || (--subscription.count && !force)) {\n return;\n }\n\n clearInterval(subscription.interval);\n subscription.interval = undefined;\n delete this.subscriptions[channelId];\n }\n\n public attach(langCode?: string) {\n if(this.attached) return;\n\n // return;\n\n this.log('attach');\n\n this.attached = true;\n\n this.appStateManager.getState().then(({updates: state}) => {\n const newVersion = this.appStateManager.newVersion/* || '1.6.0' */;\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 this.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 this.apiManager.setUpdatesProcessor(this.processUpdateMessage);\n\n // this.updatesState.syncLoading.then(() => {\n this.setProxy();\n // });\n\n if(newVersion) {\n this.updatesState.syncLoading.then(async() => {\n const strs: Record = {\n en: 'was updated to version',\n ru: 'ะพะฑะฝะพะฒะปั‘ะฝ ะดะพ ะฒะตั€ัะธะธ'\n };\n\n const getChangelog = (lang: string) => {\n fetch(`changelogs/${lang}_${newVersion.split(' ')[0]}.md`)\n .then((res) => (res.status === 200 && res.ok && res.text()) || Promise.reject())\n .then((text) => {\n const langStr = strs[lang] || strs.en;\n const pre = `**Telegram Web${App.suffix} ${langStr} ${newVersion}**\\n\\n`;\n\n text = pre + text;\n\n const entities: MessageEntity[] = [];\n const message = 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\n this.processLocalUpdate(update);\n });\n };\n\n const languages = filterUnique([langCode, 'en']);\n for(const language of languages) {\n try {\n await getChangelog(language);\n break;\n } catch(err) {\n\n }\n }\n });\n }\n });\n }\n}\n\ninterface ApiUpdatesManager extends EventListenerBase<{\n [name in Update['_']]: (update: ConstructorDeclMap[name]) => void\n}>, AppManager {}\napplyMixins(ApiUpdatesManager, [EventListenerBase, AppManager]);\n\nexport {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\nimport {UserProfilePhoto, ChatPhoto, InputFileLocation} from '../../layer';\nimport {DownloadOptions} from '../mtproto/apiFileManager';\nimport {AppManager} from './manager';\n\nexport type PeerPhotoSize = 'photo_small' | 'photo_big';\n\nexport class AppAvatarsManager extends AppManager {\n private savedAvatarURLs: {\n [peerId: PeerId]: {\n [size in PeerPhotoSize]?: string | Promise\n }\n } = {};\n\n protected after() {\n this.rootScope.addEventListener('avatar_update', ({peerId, threadId}) => {\n if(threadId) {\n return;\n }\n\n this.removeFromAvatarsCache(peerId);\n });\n }\n\n public isAvatarCached(peerId: PeerId, size?: PeerPhotoSize) {\n const saved = this.savedAvatarURLs[peerId];\n if(size === undefined) {\n return !!saved;\n }\n\n return !!(saved && saved[size] && !(saved[size] instanceof Promise));\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 saved = this.savedAvatarURLs[peerId] ??= {};\n if(!saved[size]) {\n // console.warn('will invoke downloadSmallFile:', peerId);\n const peerPhotoFileLocation: InputFileLocation.inputPeerPhotoFileLocation = {\n _: 'inputPeerPhotoFileLocation',\n pFlags: {},\n peer: this.appPeersManager.getInputPeerById(peerId),\n photo_id: photo.photo_id\n };\n\n const downloadOptions: DownloadOptions = {dcId: photo.dc_id, location: peerPhotoFileLocation};\n if(size === 'photo_big') {\n peerPhotoFileLocation.pFlags.big = true;\n downloadOptions.limitPart = 512 * 1024;\n }\n\n /* let str: string;\n const time = Date.now();\n if(peerId === 0) {\n str = `download avatar ${peerId}`;\n } */\n\n const promise = this.apiFileManager.download(downloadOptions);\n return 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 {\n return saved[size];\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 {getEnvironment} from '../../environment/utils';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport {nextRandomUint} from '../../helpers/random';\nimport {InputPhoneCall, MessagesDhConfig, PhoneCall, PhoneCallDiscardReason, PhoneCallProtocol, PhonePhoneCall} from '../../layer';\nimport {AppManager} from './manager';\n\nexport type CallId = PhoneCall['id'];\n\nexport type MyPhoneCall = Exclude;\n\nexport class AppCallsManager extends AppManager {\n private calls: Map;\n\n protected after() {\n this.calls = new Map();\n\n if(!getEnvironment().IS_CALL_SUPPORTED) {\n return;\n }\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updatePhoneCall: (update) => {\n this.saveCall(update.phone_call);\n },\n\n updatePhoneCallSignalingData: (update) => {\n this.rootScope.dispatchEvent('call_signaling', {callId: update.phone_call_id, data: update.data});\n }\n });\n }\n\n public computeKey(g_b: Uint8Array, a: Uint8Array, p: Uint8Array) {\n return this.cryptoWorker.invokeCrypto('compute-dh-key', g_b, a, p);\n }\n\n public saveCall(call: PhoneCall) {\n const isDiscarded = call._ === 'phoneCallDiscarded';\n const oldCall = this.calls.get(call.id);\n if(oldCall) {\n // if(shouldUpdate) {\n safeReplaceObject(oldCall, call);\n // }\n\n if(isDiscarded) {\n this.calls.delete(call.id);\n }\n\n call = oldCall;\n } else if(!isDiscarded) {\n this.calls.set(call.id, call as any);\n }\n\n this.rootScope.dispatchEvent('call_update', call);\n\n return call;\n }\n\n public getCall(callId: CallId) {\n return this.calls.get(callId);\n }\n\n public getCallInput(id: CallId): InputPhoneCall {\n const call = this.getCall(id);\n return {\n _: 'inputPhoneCall',\n id: call.id,\n access_hash: call.access_hash\n };\n }\n\n public savePhonePhoneCall(phonePhoneCall: PhonePhoneCall) {\n this.appUsersManager.saveApiUsers(phonePhoneCall.users);\n return this.saveCall(phonePhoneCall.phone_call);\n }\n\n public generateDh() {\n return this.apiManager.invokeApi('messages.getDhConfig', {\n version: 0,\n random_length: 256\n }).then((dhConfig) => {\n return this.cryptoWorker.invokeCrypto('generate-dh', dhConfig as MessagesDhConfig.messagesDhConfig);\n });\n }\n\n // private verifyProtocolCompatibility(protocol: PhoneCallProtocol) {\n // const my = getCallProtocol();\n // const myVersion = my.library_versions[0];\n // return !protocol.library_versions.find((version) => {\n // return compareVersion(myVersion, version) > 0;\n // });\n // }\n\n public async requestCall(userId: UserId, protocol: PhoneCallProtocol, g_a_hash: Uint8Array, video?: boolean) {\n const phonePhoneCall = await this.apiManager.invokeApi('phone.requestCall', {\n user_id: this.appUsersManager.getUserInput(userId),\n protocol: protocol,\n video: video,\n random_id: nextRandomUint(32),\n g_a_hash: g_a_hash\n });\n\n return this.savePhonePhoneCall(phonePhoneCall);\n }\n\n public async discardCall(callId: CallId, duration: number, reason: PhoneCallDiscardReason['_'], video?: boolean) {\n if(!this.getCall(callId)) {\n return;\n }\n\n const updates = await this.apiManager.invokeApi('phone.discardCall', {\n video,\n peer: this.getCallInput(callId),\n duration,\n reason: {\n _: reason\n },\n connection_id: '0'\n });\n\n this.apiUpdatesManager.processUpdateMessage(updates);\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 deepEqual from '../../helpers/object/deepEqual';\nimport isObject from '../../helpers/object/isObject';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport {ChannelParticipant, ChannelsCreateChannel, Chat, ChatAdminRights, ChatBannedRights, ChatInvite, ChatPhoto, ChatReactions, InputChannel, InputChatPhoto, InputFile, InputPeer, MessagesSponsoredMessages, SponsoredMessage, Update, Updates} from '../../layer';\nimport {isRestricted} from '../../helpers/restrictions';\nimport {AppManager} from './manager';\nimport hasRights from './utils/chats/hasRights';\nimport getParticipantPeerId from './utils/chats/getParticipantPeerId';\nimport {AppStoragesManager} from './appStoragesManager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport {randomLong} from '../../helpers/random';\nimport generateMessageId from './utils/messageId/generateMessageId';\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 extends AppManager {\n private storage: AppStoragesManager['storages']['chats'];\n\n private chats: {[id: ChatId]: Exclude};\n // private usernames: any;\n // private channelAccess: any;\n // private megagroups: {[id: number]: true};\n\n protected after() {\n this.clear(true);\n\n this.apiUpdatesManager.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 this.apiManager.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 = this.appPeersManager.getPeerId(update.peer).toChatId();\n const chat = this.chats[chatId] as Chat.chat;\n if(chat) {\n chat.default_banned_rights = update.default_banned_rights;\n this.rootScope.dispatchEvent('chat_update', chatId);\n }\n }\n });\n\n return Promise.all([\n this.appStateManager.getState(),\n this.appStoragesManager.loadStorage('chats')\n ]).then(([state, {results: chats, storage}]) => {\n this.storage = storage;\n\n this.saveApiChats(chats);\n\n this.peersStorage.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 this.peersStorage.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 for(const chatId in this.chats) {\n if(!chatId) continue;\n if(!this.peersStorage.isPeerNeeded(chatId.toPeerId(true))) {\n const chat = this.chats[chatId];\n this.appUsersManager.modifyUsernamesCache(chat, false);\n\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 || 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 = this.chats[chat.id];\n\n /* if(oldChat && !override) {\n return;\n } */\n\n (chat as Chat.chat).pFlags ??= {};\n\n if((chat as Chat.channel).pFlags.min && oldChat !== undefined) {\n return;\n }\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 as Chat.channel).photo?._ === 'chatPhotoEmpty') {\n delete (chat as Chat.channel).photo;\n }\n\n const changedUsername = this.appUsersManager.setUsernameToCache(chat, oldChat);\n\n /* if(chat.username) {\n let searchUsername = searchIndexManager.cleanUsername(chat.username);\n this.usernames[searchUsername] = chat.id;\n } */\n\n const peerId = chat.id.toPeerId(true);\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 const toggledForum = (oldChat as Chat.channel).pFlags.forum !== (chat as Chat.channel).pFlags.forum;\n const changedPhoto = oldPhotoId !== newPhotoId || toggledForum;\n\n const changedTitle = oldChat.title !== chat.title || changedUsername;\n\n const changedAnyBadge = (oldChat as Chat.channel).pFlags.verified !== (chat as Chat.channel).pFlags.verified ||\n (oldChat as Chat.channel).pFlags.scam !== (chat as Chat.channel).pFlags.scam ||\n (oldChat as Chat.channel).pFlags.fake !== (chat as Chat.channel).pFlags.fake;\n\n safeReplaceObject(oldChat, chat);\n this.rootScope.dispatchEvent('chat_update', chat.id);\n\n if(changedPhoto) {\n this.rootScope.dispatchEvent('avatar_update', {peerId});\n }\n\n if(changedTitle || changedAnyBadge) {\n this.rootScope.dispatchEvent('peer_title_edit', {peerId});\n }\n\n if(toggledForum) {\n this.rootScope.dispatchEvent('chat_toggle_forum', {chatId: chat.id, enabled: !!(chat as Chat.channel).pFlags.forum});\n }\n }\n\n if(this.peersStorage.isPeerNeeded(peerId)) {\n this.storage.set({\n [chat.id]: chat\n });\n }\n }\n\n public getChat(id: ChatId) {\n return this.chats[id];\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 return hasRights(this.getChat(id), action, rights, isThread);\n }\n\n public editChatDefaultBannedRights(id: ChatId, banned_rights: ChatBannedRights) {\n const chat = this.getChat(id) as Chat.chat;\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 this.apiManager.invokeApi('messages.editChatDefaultBannedRights', {\n peer: this.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 as Chat.channel)?.pFlags?.megagroup;\n }\n\n public isForum(id: ChatId) {\n const chat = this.chats[id];\n return !!(chat as Chat.channel)?.pFlags?.forum;\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 ||\n chat._ === 'channelForbidden' ||\n chat._ === 'chatForbidden' ||\n (chat as any as Chat.chatEmpty)._ === 'chatEmpty' ||\n (chat as Chat.chat).pFlags.left ||\n // || (chat as any).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 || !(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) as Chat.channel).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 as Chat.channel).pFlags.min);\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 as Chat.channel).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 = 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 this.apiManager.invokeApi('channels.createChannel', options).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n const channelId = (updates as any).chats[0].id;\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) => this.appUsersManager.getUserInput(u));\n\n return this.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 this.apiManager.invokeApi('messages.createChat', {\n users: userIds.map((u) => this.appUsersManager.getUserInput(u)),\n title\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n const chatId = (updates as any as Updates.updates).chats[0].id;\n return chatId;\n });\n }\n\n private onChatUpdated = (chatId: ChatId, updates?: Updates) => {\n // console.log('onChatUpdated', chatId, updates);\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n if((updates as Updates.updates)?.updates?.length && this.isChannel(chatId)) {\n this.rootScope.dispatchEvent('invalidate_participants', chatId);\n }\n };\n\n public leaveChannel(id: ChatId) {\n return this.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 this.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 this.apiManager.invokeApi('messages.addChatUser', {\n chat_id: id,\n user_id: this.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 this.apiManager.invokeApi('messages.deleteChatUser', {\n chat_id: id,\n user_id: this.appUsersManager.getUserInput(userId)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public leaveChat(id: ChatId) {\n return this.deleteChatUser(id, this.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 this.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 this.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 this.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, doNotRefresh?: boolean) {\n const promise = this.apiManager.invokeApi('channels.updateUsername', {\n channel: this.getChannelInput(id),\n username\n });\n\n return this.refreshChatAfterRequest(id, promise, doNotRefresh);\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 = this.apiManager.invokeApi('channels.editPhoto', {\n channel: this.getChannelInput(id),\n photo: inputChatPhoto\n });\n } else {\n promise = this.apiManager.invokeApi('messages.editChatPhoto', {\n chat_id: id,\n photo: inputChatPhoto\n });\n }\n\n return promise.then(this.onChatUpdated.bind(this, id));\n }\n\n public editTitle(id: ChatId, title: string) {\n let promise: any;\n\n if(this.isChannel(id)) {\n promise = this.apiManager.invokeApi('channels.editTitle', {\n channel: this.getChannelInput(id),\n title\n });\n } else {\n promise = this.apiManager.invokeApi('messages.editChatTitle', {\n chat_id: id,\n title\n });\n }\n\n return promise.then(this.onChatUpdated.bind(this, id));\n }\n\n public editAbout(id: ChatId, about: string) {\n const peerId = id.toPeerId(true);\n return this.apiManager.invokeApi('messages.editChatAbout', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n about\n }).then((bool) => {\n if(bool) {\n this.rootScope.dispatchEvent('peer_bio_edit', peerId);\n }\n\n return bool;\n });\n }\n\n public editBanned(id: ChatId, participant: PeerId | ChannelParticipant, banned_rights: ChatBannedRights) {\n const peerId = typeof(participant) !== 'object' ? participant : getParticipantPeerId(participant);\n return this.apiManager.invokeApi('channels.editBanned', {\n channel: this.getChannelInput(id),\n participant: this.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 this.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: this.appUsersManager.getSelf().id,\n peer: this.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 this.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 this.apiManager.invokeApi('channels.togglePreHistoryHidden', {\n channel: this.getChannelInput(channelId),\n enabled\n }).then(this.onChatUpdated.bind(this, channelId));\n });\n }\n\n public toggleSignatures(id: ChatId, enabled: boolean) {\n return this.apiManager.invokeApi('channels.toggleSignatures', {\n channel: this.getChannelInput(id),\n enabled\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public toggleNoForwards(id: ChatId, enabled: boolean) {\n return this.apiManager.invokeApi('messages.toggleNoForwards', {\n peer: this.getInputPeer(id),\n enabled\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public setChatAvailableReactions(id: ChatId, reactions: ChatReactions) {\n const chatFull = this.appProfileManager.getCachedFullChat(id);\n if(chatFull) {\n chatFull.available_reactions = reactions;\n this.rootScope.dispatchEvent('chat_full_update', id);\n }\n\n return this.apiManager.invokeApi('messages.setChatAvailableReactions', {\n peer: this.getInputPeer(id),\n available_reactions: reactions\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public getSendAs(channelId: ChatId) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'channels.getSendAs',\n params: {\n peer: this.getChannelInputPeer(channelId)\n },\n processResult: (sendAsPeers) => {\n this.appUsersManager.saveApiUsers(sendAsPeers.users);\n this.saveApiChats(sendAsPeers.chats);\n\n return sendAsPeers.peers;\n }\n });\n }\n\n public importChatInvite(hash: string) {\n return this.apiManager.invokeApi('messages.importChatInvite', {hash})\n .then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n const chat = (updates as Updates.updates).chats[0];\n return chat.id;\n });\n }\n\n public checkUsername(chatId: ChatId, username: string) {\n return this.apiManager.invokeApi('channels.checkUsername', {\n channel: this.getChannelInput(chatId),\n username\n });\n }\n\n public getSponsoredMessage(chatId: ChatId) {\n // const s: MessagesSponsoredMessages.messagesSponsoredMessages = {\n // '_': 'messages.sponsoredMessages',\n // 'messages': [\n // {\n // '_': 'sponsoredMessage',\n // 'pFlags': {},\n // 'flags': 9,\n // 'random_id': new Uint8Array([\n // 80,\n // 5,\n // 249,\n // 174,\n // 44,\n // 73,\n // 173,\n // 14,\n // 246,\n // 81,\n // 187,\n // 182,\n // 223,\n // 5,\n // 4,\n // 128\n // ]),\n // 'from_id': {\n // '_': 'peerUser',\n // 'user_id': 983000232\n // },\n // 'start_param': 'GreatMinds',\n // 'message': 'This is a long sponsored message. In fact, it has the maximum length allowed on the platform โ€“ย 160 characters ๐Ÿ˜ฌ๐Ÿ˜ฌ. It\\'s promoting a bot with a start parameter.' + chatId\n // }\n // ],\n // 'chats': [],\n // 'users': [\n // {\n // '_': 'user',\n // 'pFlags': {\n // 'bot': true,\n // 'verified': true,\n // 'apply_min_photo': true\n // },\n // 'flags': 34226219,\n // 'id': 983000232,\n // 'access_hash': '-294959558742535650',\n // 'first_name': 'Quiz Bot',\n // 'username': 'QuizBot',\n // 'photo': {\n // '_': 'userProfilePhoto',\n // 'pFlags': {},\n // 'flags': 2,\n // 'photo_id': '4221953848856651689',\n // 'stripped_thumb': new Uint8Array([\n // 1,\n // 8,\n // 8,\n // 155,\n // 247,\n // 95,\n // 103,\n // 255,\n // 0,\n // 110,\n // 138,\n // 40,\n // 174,\n // 132,\n // 142,\n // 6,\n // 238,\n // 127\n // ]),\n // 'dc_id': 2\n // },\n // 'bot_info_version': 11,\n // 'bot_inline_placeholder': 'Search a quiz...',\n // 'sortName': 'quiz bot'\n // }\n // ]\n // };\n\n // const promise = Promise.resolve(s);\n const promise = this.apiManager.invokeApiCacheable('channels.getSponsoredMessages', {\n channel: this.getChannelInput(chatId)\n }, {cacheSeconds: 300});\n\n return promise.then((sponsoredMessages) => {\n if(sponsoredMessages._ === 'messages.sponsoredMessages') {\n this.appUsersManager.saveApiUsers(sponsoredMessages.users);\n this.appChatsManager.saveApiChats(sponsoredMessages.chats);\n\n const sponsoredMessage = sponsoredMessages.messages.shift();\n sponsoredMessages.messages.push(sponsoredMessage);\n }\n\n return sponsoredMessages;\n });\n }\n\n public viewSponsoredMessage(chatId: ChatId, randomId: SponsoredMessage['random_id']) {\n return this.apiManager.invokeApiSingle('channels.viewSponsoredMessage', {\n channel: this.getChannelInput(chatId),\n random_id: randomId\n });\n }\n\n public checkChatInvite(hash: string) {\n return this.apiManager.invokeApi('messages.checkChatInvite', {\n hash: hash\n }).then((chatInvite) => {\n if((chatInvite as ChatInvite.chatInvitePeek).chat) {\n this.saveApiChat((chatInvite as ChatInvite.chatInvitePeek).chat, true);\n }\n\n return chatInvite;\n });\n }\n\n public toggleUsername(chatId: ChatId, username: string, active: boolean) {\n const promise = this.apiManager.invokeApi('channels.toggleUsername', {\n channel: this.getChannelInput(chatId),\n username,\n active\n });\n\n return this.refreshChatAfterRequest(chatId, promise);\n }\n\n public reorderUsernames(chatId: ChatId, order: string[]) {\n const promise = this.apiManager.invokeApi('channels.reorderUsernames', {\n channel: this.getChannelInput(chatId),\n order\n });\n\n return this.refreshChatAfterRequest(chatId, promise);\n }\n\n public deactivateAllUsernames(chatId: ChatId, doNotRefresh?: boolean) {\n const promise = this.apiManager.invokeApi('channels.deactivateAllUsernames', {\n channel: this.getChannelInput(chatId)\n });\n\n return this.refreshChatAfterRequest(chatId, promise, doNotRefresh);\n }\n\n public makeChannelPrivate(chatId: ChatId) {\n const promises: Promise[] = [\n this.updateUsername(chatId, '', true),\n this.deactivateAllUsernames(chatId, true)\n ];\n\n const promise = Promise.all(promises).then(() => true);\n return this.refreshChatAfterRequest(chatId, promise);\n }\n\n public refreshChatAfterRequest>(chatId: ChatId, promise: T, doNotRefresh?: boolean): T {\n if(doNotRefresh) {\n return promise;\n }\n\n return promise.then((value) => {\n return this.getChannels([chatId]).then(() => value);\n }) as T;\n }\n\n public getChannels(chatIds: ChatId[]) {\n return this.apiManager.invokeApi('channels.getChannels', {\n id: chatIds.map((chatId) => this.getChannelInput(chatId))\n }).then((messagesChats) => {\n this.saveApiChats(messagesChats.chats);\n });\n }\n\n public toggleForum(chatId: ChatId, enabled: boolean) {\n return this.migrateChat(chatId).then((channelId) => {\n return this.apiManager.invokeApi('channels.toggleForum', {\n channel: this.getChannelInput(channelId),\n enabled\n }).then(this.onChatUpdated.bind(this, channelId));\n });\n }\n\n public editForumTopic(options: {\n chatId: ChatId,\n topicId: number,\n title?: string,\n iconEmojiId?: DocId,\n closed?: boolean,\n hidden?: boolean\n }) {\n const {chatId, topicId, title, iconEmojiId, closed, hidden} = options;\n return this.apiManager.invokeApi('channels.editForumTopic', {\n channel: this.getChannelInput(chatId),\n topic_id: getServerMessageId(topicId),\n title,\n icon_emoji_id: iconEmojiId,\n closed,\n hidden\n }).then(this.onChatUpdated.bind(this, chatId));\n }\n\n public async createForumTopic(options: {\n chatId: ChatId,\n title: string,\n iconColor: number,\n iconEmojiId: DocId\n }) {\n const {chatId, title, iconColor, iconEmojiId} = options;\n\n const channelFull = await this.appProfileManager.getChannelFull(chatId);\n const sendAsInputPeer = channelFull.default_send_as && this.appPeersManager.getInputPeerById(this.appPeersManager.getPeerId(channelFull.default_send_as));\n\n return this.apiManager.invokeApi('channels.createForumTopic', {\n channel: this.getChannelInput(chatId),\n title,\n icon_color: iconColor,\n icon_emoji_id: iconEmojiId,\n random_id: randomLong(),\n send_as: sendAsInputPeer\n }).then((updates) => {\n this.onChatUpdated(chatId, updates);\n\n const update = (updates as Updates.updates).updates.find((update) => update._ === 'updateNewChannelMessage') as Update.updateNewChannelMessage;\n return generateMessageId(update.message.id);\n });\n }\n\n public updatePinnedForumTopic(chatId: ChatId, topicId: number, pinned: boolean) {\n return this.apiManager.invokeApi('channels.updatePinnedForumTopic', {\n channel: this.getChannelInput(chatId),\n topic_id: getServerMessageId(topicId),\n pinned\n }).then(this.onChatUpdated.bind(this, chatId));\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 lang from '../lang';\nimport type langSign from '../langSign';\nimport type {State} from '../config/state';\nimport DEBUG, {MOUNT_CLASS_TO} from '../config/debug';\nimport {HelpCountriesList, HelpCountry, LangPackDifference, LangPackString} from '../layer';\nimport stateStorage from './stateStorage';\nimport App from '../config/app';\nimport rootScope from './rootScope';\nimport {IS_MOBILE} from '../environment/userAgent';\nimport deepEqual from '../helpers/object/deepEqual';\nimport safeAssign from '../helpers/object/safeAssign';\nimport capitalizeFirstLetter from '../helpers/string/capitalizeFirstLetter';\nimport matchUrlProtocol from './richTextProcessor/matchUrlProtocol';\nimport wrapUrl from './richTextProcessor/wrapUrl';\nimport {setDirection} from '../helpers/dom/setInnerHTML';\n\nexport const langPack: {[actionType: string]: LangPackKey} = {\n 'messageActionChatCreate': 'ActionCreateGroup',\n 'messageActionChatCreateYou': 'ActionYouCreateGroup',\n 'messageActionChatEditTitle': 'ActionChangedTitle',\n 'messageActionChatEditPhoto': 'ActionChangedPhoto',\n 'messageActionChatEditVideo': 'ActionChangedVideo',\n 'messageActionChatDeletePhoto': 'ActionRemovedPhoto',\n 'messageActionChatReturn': 'ActionAddUserSelf',\n 'messageActionChatReturnYou': 'ActionAddUserSelfYou',\n 'messageActionChatJoined': 'ActionAddUserSelfMega',\n 'messageActionChatJoinedYou': 'ChannelMegaJoined',\n 'messageActionChatAddUser': 'ActionAddUser',\n 'messageActionChatAddUsers': 'ActionAddUser',\n 'messageActionChatLeave': 'ActionLeftUser',\n 'messageActionChatLeaveYou': 'YouLeft',\n 'messageActionChatDeleteUser': 'ActionKickUser',\n 'messageActionChatJoinedByLink': 'ActionInviteUser',\n 'messageActionPinMessage': 'Chat.Service.Group.UpdatedPinnedMessage',\n 'messageActionContactSignUp': 'Chat.Service.PeerJoinedTelegram',\n 'messageActionChannelCreate': 'ActionCreateChannel',\n 'messageActionChannelEditTitle': 'Chat.Service.Channel.UpdatedTitle',\n 'messageActionChannelEditPhoto': 'Chat.Service.Channel.UpdatedPhoto',\n 'messageActionChannelEditVideo': 'Chat.Service.Channel.UpdatedVideo',\n 'messageActionChannelDeletePhoto': 'Chat.Service.Channel.RemovedPhoto',\n 'messageActionHistoryClear': 'HistoryCleared',\n 'messageActionDiscussionStarted': 'DiscussionStarted',\n\n 'messageActionChannelMigrateFrom': 'ActionMigrateFromGroup',\n\n 'messageActionPhoneCall.video_in_ok': 'ChatList.Service.VideoCall.incoming',\n 'messageActionPhoneCall.video_out_ok': 'ChatList.Service.VideoCall.outgoing',\n 'messageActionPhoneCall.video_missed': 'ChatList.Service.VideoCall.Missed',\n 'messageActionPhoneCall.video_cancelled': 'ChatList.Service.VideoCall.Cancelled',\n 'messageActionPhoneCall.in_ok': 'ChatList.Service.Call.incoming',\n 'messageActionPhoneCall.out_ok': 'ChatList.Service.Call.outgoing',\n 'messageActionPhoneCall.missed': 'ChatList.Service.Call.Missed',\n 'messageActionPhoneCall.cancelled': 'ChatList.Service.Call.Cancelled',\n\n 'messageActionGroupCall.started': 'Chat.Service.VoiceChatStarted.Channel',\n 'messageActionGroupCall.started_by': 'Chat.Service.VoiceChatStarted',\n 'messageActionGroupCall.started_byYou': 'Chat.Service.VoiceChatStartedYou',\n 'messageActionGroupCall.ended': 'Chat.Service.VoiceChatFinished.Channel',\n 'messageActionGroupCall.ended_by': 'Chat.Service.VoiceChatFinished',\n 'messageActionGroupCall.ended_byYou': 'Chat.Service.VoiceChatFinishedYou',\n\n '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 export const strings: Map = new Map();\n export const countriesList: HelpCountry[] = [];\n let pluralRules: Intl.PluralRules;\n\n let cacheLangPackPromise: Promise;\n export let lastRequestedLangCode: string;\n export let lastRequestedNormalizedLangCode: string;\n export let lastAppliedLangCode: string;\n export let requestedServerLanguage = false;\n export let timeFormat: State['settings']['timeFormat'];\n export let isRTL = false;\n\n export function setRTL(rtl: boolean) {\n isRTL = rtl;\n }\n\n function setLangCode(langCode: string) {\n lastRequestedLangCode = langCode;\n lastRequestedNormalizedLangCode = langCode.split('-')[0];\n }\n\n export function getCacheLangPack(): Promise {\n if(cacheLangPackPromise) return cacheLangPackPromise;\n return cacheLangPackPromise = Promise.all([\n stateStorage.get('langPack') as Promise,\n polyfillPromise\n ]).then(([langPack]) => {\n if(!langPack/* || true */) {\n return loadLocalLangPack();\n } else if(DEBUG && false) {\n return getLangPack(langPack.lang_code);\n }/* else if(langPack.appVersion !== App.langPackVersion) {\n return getLangPack(langPack.lang_code);\n } */\n\n if(!lastRequestedLangCode) {\n setLangCode(langPack.lang_code);\n }\n\n applyLangPack(langPack);\n return langPack;\n }).finally(() => {\n cacheLangPackPromise = undefined;\n });\n }\n\n function updateAmPm() {\n if(timeFormat === 'h12') {\n try {\n const dateTimeFormat = getDateTimeFormat({hour: 'numeric', minute: 'numeric', hour12: true});\n const date = new Date();\n date.setHours(0);\n const amText = dateTimeFormat.format(date);\n amPmCache.am = amText.split(/\\s/)[1];\n date.setHours(12);\n const pmText = dateTimeFormat.format(date);\n amPmCache.pm = pmText.split(/\\s/)[1];\n } catch(err) {\n console.error('cannot get am/pm', err);\n amPmCache = {am: 'AM', pm: 'PM'};\n }\n }\n }\n\n export function setTimeFormat(\n format: State['settings']['timeFormat'],\n haveToUpdate = !!timeFormat && timeFormat !== format\n ) {\n timeFormat = format;\n\n updateAmPm();\n\n if(haveToUpdate) {\n cachedDateTimeFormats.clear();\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 export function loadLocalLangPack() {\n const defaultCode = App.langPackCode;\n setLangCode(defaultCode);\n return Promise.all([\n import('../lang'),\n import('../langSign'),\n import('../countries')\n ]).then(([lang, langSign, countries]) => {\n const strings: LangPackString[] = [];\n formatLocalStrings(lang.default, strings);\n formatLocalStrings(langSign.default, strings);\n\n const langPack: LangPackDifference = {\n _: 'langPackDifference',\n from_version: 0,\n lang_code: defaultCode,\n strings,\n version: 0,\n local: true,\n countries: countries.default\n };\n return saveLangPack(langPack);\n });\n }\n\n export function loadLangPack(langCode: string, web?: boolean) {\n web = true;\n requestedServerLanguage = true;\n const managers = rootScope.managers;\n return Promise.all([\n managers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n lang_code: langCode,\n lang_pack: web ? 'web' : App.langPack\n }),\n !web && managers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n lang_code: langCode,\n lang_pack: 'android'\n }),\n import('../lang'),\n import('../langSign'),\n managers.apiManager.invokeApiCacheable('help.getCountriesList', {\n lang_code: langCode,\n hash: 0\n }) as Promise,\n polyfillPromise\n ]);\n }\n\n export function getStrings(langCode: string, strings: string[]) {\n return rootScope.managers.apiManager.invokeApi('langpack.getStrings', {\n lang_pack: App.langPack,\n lang_code: langCode,\n keys: strings\n });\n }\n\n export function formatLocalStrings(strings: any, pushTo: LangPackString[] = []) {\n for(const i in strings) {\n // @ts-ignore\n const v = strings[i];\n if(typeof(v) === 'string') {\n pushTo.push({\n _: 'langPackString',\n key: i,\n value: v\n });\n } else {\n pushTo.push({\n _: 'langPackStringPluralized',\n key: i,\n ...v\n });\n }\n }\n\n return pushTo;\n }\n\n export function getLangPack(langCode: string, web?: boolean) {\n setLangCode(langCode);\n return loadLangPack(langCode, web).then(([langPack1, langPack2, localLangPack1, localLangPack2, countries, _]) => {\n let strings: LangPackString[] = [];\n\n [localLangPack1, localLangPack2].forEach((l) => {\n formatLocalStrings(l.default as any, strings);\n });\n\n strings = strings.concat(...[langPack1.strings, langPack2.strings].filter(Boolean));\n\n langPack1.strings = strings;\n langPack1.countries = countries;\n return saveLangPack(langPack1);\n });\n }\n\n export function saveLangPack(langPack: LangPackDifference) {\n langPack.appVersion = App.langPackVersion;\n\n return stateStorage.set({langPack}).then(() => {\n applyLangPack(langPack);\n return langPack;\n });\n }\n\n export const polyfillPromise = (function checkIfPolyfillNeeded() {\n if(typeof(Intl) !== 'undefined' && typeof(Intl.PluralRules) !== 'undefined'/* && false */) {\n return Promise.resolve();\n } else {\n return import('./pluralPolyfill').then((_Intl) => {\n (window as any).Intl = Object.assign(typeof(Intl) !== 'undefined' ? Intl : {}, _Intl.default);\n });\n }\n })();\n\n export function applyLangPack(langPack: LangPackDifference) {\n const currentLangCode = lastRequestedLangCode;\n if(langPack.lang_code !== currentLangCode) {\n return;\n }\n\n try {\n pluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode);\n } catch(err) {\n console.error('pluralRules error', err);\n pluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode.split('-', 1)[0]);\n }\n\n try {\n pluralRules = new Intl.PluralRules(langPack.lang_code);\n } catch(err) {\n console.error('pluralRules error', err);\n pluralRules = new Intl.PluralRules(langPack.lang_code.split('-', 1)[0]);\n }\n\n strings.clear();\n\n for(const string of langPack.strings) {\n strings.set(string.key as LangPackKey, string);\n }\n\n if(langPack.countries) {\n countriesList.length = 0;\n countriesList.push(...langPack.countries.countries);\n\n langPack.countries.countries.forEach((country) => {\n if(country.name) {\n const langPackKey: any = country.default_name;\n strings.set(langPackKey, {\n _: 'langPackString',\n key: langPackKey,\n value: country.name\n });\n }\n });\n }\n\n if(lastAppliedLangCode !== currentLangCode) {\n rootScope.dispatchEvent('language_change', currentLangCode);\n lastAppliedLangCode = currentLangCode;\n cachedDateTimeFormats.clear();\n updateAmPm();\n }\n\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n elements.forEach((element) => {\n const instance = weakMap.get(element);\n\n if(instance) {\n instance.update();\n }\n });\n }\n\n function pushNextArgument(out: ReturnType, args: FormatterArguments, indexHolder: {i: number}) {\n const arg = args[indexHolder.i++];\n if(Array.isArray(arg)) {\n out.push(...arg as any);\n } else {\n out.push(arg);\n }\n }\n\n export function superFormatter(input: string, args?: FormatterArguments, indexHolder = {i: 0}): Exclude[] {\n const out: ReturnType = [];\n const regExp = /(\\*\\*|__)(.+?)\\1|(\\n)|(\\[.+?\\]\\(.*?\\))|un\\d|%\\d\\$.|%./g;\n\n let lastIndex = 0;\n input.replace(regExp, (match, p1: any, p2: any, p3: any, p4: string, offset: number, string: string) => {\n // console.table({match, p1, p2, offset, string});\n\n out.push(string.slice(lastIndex, offset));\n\n if(p1) {\n // offset += p1.length;\n let element: HTMLElement;\n switch(p1) {\n case '**': {\n element = document.createElement('b');\n break;\n }\n\n case '__': {\n element = document.createElement('i');\n break;\n }\n }\n\n element.append(...superFormatter(p2, args, indexHolder) as any);\n out.push(element);\n } else if(p3) {\n out.push(document.createElement('br'));\n } else if(p4) {\n const idx = p4.lastIndexOf(']');\n const text = p4.slice(1, idx);\n\n const url = p4.slice(idx + 2, p4.length - 1);\n let a: HTMLAnchorElement;\n if(url && matchUrlProtocol(url)) {\n a = document.createElement('a');\n const wrappedUrl = wrapUrl(url);\n a.href = wrappedUrl.url;\n if(wrappedUrl.onclick) a.setAttribute('onclick', wrappedUrl.onclick);\n a.target = '_blank';\n } else {\n a = args[indexHolder.i++] as HTMLAnchorElement;\n\n if(a instanceof DocumentFragment) { // right after wrapRichText\n a = a.firstChild as any;\n }\n\n a.textContent = ''; // reset content\n }\n\n a.append(...superFormatter(text, args, indexHolder) as any);\n\n out.push(a);\n } else if(args) {\n pushNextArgument(out, args, indexHolder);\n }\n\n lastIndex = offset + match.length;\n return '';\n });\n\n if(lastIndex !== input.length) {\n out.push(input.slice(lastIndex));\n }\n\n return out;\n }\n\n export function format(key: LangPackKey, plain: true, args?: FormatterArguments): string;\n export function format(key: LangPackKey, plain?: false, args?: FormatterArguments): ReturnType;\n export function format(key: LangPackKey, plain = false, args?: FormatterArguments): ReturnType | string {\n const str = strings.get(key);\n let input: string;\n if(str) {\n if(str._ === 'langPackStringPluralized' && args?.length) {\n let v = args[0] as number | string;\n if(typeof(v) === 'string') v = +v.replace(/\\D/g, '');\n const s = pluralRules.select(v);\n // @ts-ignore\n input = str[s + '_value'] || str['other_value'];\n } else if(str._ === 'langPackString') {\n input = str.value;\n } else {\n // input = '[' + key + ']';\n input = key;\n }\n } else {\n // input = '[' + key + ']';\n input = key;\n }\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\n /* if(plain) {\n if(args?.length) {\n const regExp = /un\\d|%\\d\\$.|%./g;\n let i = 0;\n input = input.replace(regExp, (match, offset, string) => {\n return '' + args[i++];\n });\n }\n\n return input;\n } else {\n return superFormatter(input, args);\n } */\n }\n\n export const weakMap: WeakMap> = new WeakMap();\n\n export type IntlElementBaseOptions = {\n element?: HTMLElement,\n property?: 'innerText' | 'innerHTML' | 'placeholder' | 'textContent',\n };\n\n abstract class IntlElementBase {\n public element: IntlElementBaseOptions['element'];\n public property: IntlElementBaseOptions['property'];\n\n constructor(options?: Options) {\n this.element = options?.element || document.createElement('span');\n this.element.classList.add('i18n');\n\n this.property = options?.property;\n if(options && ((options as any as IntlElementOptions).key || (options as any as IntlDateElementOptions).date)) {\n this.update(options);\n }\n\n weakMap.set(this.element, this);\n }\n\n abstract update(options?: Options): void;\n }\n\n export type IntlElementOptions = IntlElementBaseOptions & {\n key?: LangPackKey,\n args?: FormatterArguments\n };\n export class IntlElement extends IntlElementBase {\n public key: IntlElementOptions['key'];\n public args: IntlElementOptions['args'];\n\n constructor(options: IntlElementOptions = {}) {\n super({...options, property: options.property ?? 'innerHTML'});\n }\n\n public update(options?: IntlElementOptions) {\n safeAssign(this, options);\n\n if(this.property === 'innerHTML') {\n this.element.textContent = '';\n this.element.append(...format(this.key, false, this.args) as any);\n } else {\n // @ts-ignore\n const v = this.element[this.property];\n const formatted = format(this.key, true, this.args);\n\n // * hasOwnProperty won't work here\n if(v === undefined) this.element.dataset[this.property] = formatted;\n else (this.element as HTMLInputElement)[this.property] = formatted;\n }\n }\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 }\n\n const cachedDateTimeFormats: Map = new Map();\n function getDateTimeFormat(options: Intl.DateTimeFormatOptions = {}) {\n const json = JSON.stringify(options);\n let dateTimeFormat = cachedDateTimeFormats.get(json);\n if(!dateTimeFormat) {\n dateTimeFormat = new Intl.DateTimeFormat(lastRequestedNormalizedLangCode + '-u-hc-' + timeFormat, options);\n cachedDateTimeFormats.set(json, dateTimeFormat);\n }\n\n return dateTimeFormat;\n }\n\n export let amPmCache = {am: 'AM', pm: 'PM'};\n export type IntlDateElementOptions = IntlElementBaseOptions & {\n date?: Date,\n options: Intl.DateTimeFormatOptions\n };\n export class IntlDateElement extends IntlElementBase {\n public date: IntlDateElementOptions['date'];\n public options: IntlDateElementOptions['options'];\n\n constructor(options: IntlDateElementOptions) {\n super({...options, property: options.property ?? 'textContent'});\n setDirection(this.element);\n }\n\n public update(options?: IntlDateElementOptions) {\n safeAssign(this, options);\n\n let text: string;\n if(this.options.hour && this.options.minute && Object.keys(this.options).length === 2/* && false */) {\n const hours = this.date.getHours();\n text = ('0' + (timeFormat === 'h12' ? (hours % 12) || 12 : hours)).slice(-2) + ':' + ('0' + this.date.getMinutes()).slice(-2);\n // if(this.options.second) {\n // text += ':' + ('0' + this.date.getSeconds()).slice(-2);\n // }\n\n if(timeFormat === 'h12') {\n text += ' ' + (hours < 12 ? amPmCache.am : amPmCache.pm);\n }\n } else {\n // * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/hourCycle#adding_an_hour_cycle_via_the_locale_string\n const dateTimeFormat = getDateTimeFormat(this.options);\n text = capitalizeFirstLetter(dateTimeFormat.format(this.date));\n }\n\n (this.element as any)[this.property] = text;\n }\n }\n\n export function i18n(key: LangPackKey, args?: FormatterArguments) {\n return new IntlElement({key, args}).element;\n }\n\n export function i18n_(options: IntlElementOptions) {\n return new IntlElement(options).element;\n }\n\n export function _i18n(element: HTMLElement, key: LangPackKey, args?: FormatterArguments, property?: IntlElementOptions['property']) {\n return new IntlElement({element, key, args, property}).element;\n }\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 const 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 return 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 const joined = joinElementsWith(elements, (isLast) => {\n const langPackKey: LangPackKey = isLast && useLast ? 'AutoDownloadSettings.LastDelimeter' : 'AutoDownloadSettings.Delimeter';\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","/*\n * 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 addAnchorListener from '../../helpers/addAnchorListener';\nimport {PHONE_NUMBER_REG_EXP} from '.';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport matchUrlProtocol from './matchUrlProtocol';\nimport {T_ME_PREFIXES} from '../mtproto/mtproto_config';\n\nexport default function wrapUrl(url: string, unsafe?: number | boolean) {\n if(!matchUrlProtocol(url)) {\n url = 'https://' + url;\n }\n\n const out: {url: string, onclick?: Parameters[0]['name']} = {url};\n let tgMeMatch, telescoPeMatch, tgMatch;\n let onclick: typeof out['onclick'];\n /* if(unsafe === 2) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } else */if((tgMeMatch = url.match(/^(?:https?:\\/\\/)?(?:(.+?)\\.)?(?:(?:web|k|z)\\.)?t(?:elegram)?\\.me(?:\\/(.+))?/))) {\n const u = new URL(url);\n let prefix = tgMeMatch[1];\n if(prefix && T_ME_PREFIXES.has(tgMeMatch[1])) {\n prefix = undefined;\n }\n\n if(prefix) {\n u.pathname = prefix + (u.pathname === '/' ? '' : u.pathname);\n }\n\n const fullPath = u.pathname.slice(1);\n const path = fullPath.split('/');\n\n if(path[0] && path[0][0] === '$' && path[0].length > 1) {\n onclick = 'invoice';\n } else if(/^\\W/.test(fullPath) && !PHONE_NUMBER_REG_EXP.test(fullPath)) { // second regexp is for phone numbers (t.me/+38050...)\n onclick = 'joinchat';\n } else switch(path[0]) {\n case 'joinchat':\n case 'addstickers':\n case 'addemoji':\n case 'voicechat':\n case 'invoice':\n if(path.length !== 1 && !prefix) {\n onclick = path[0];\n break;\n }\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] as any;\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 out.onclick = onclick;\n return out;\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.wrapUrl = wrapUrl);\n","/*\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 I18n from '../../lib/langPack';\n\nexport default function setInnerHTML(elem: Element, html: string | DocumentFragment | Element) {\n setDirection(elem);\n if(typeof(html) === 'string') {\n if(!html) elem.replaceChildren();\n else elem.innerHTML = html;\n } else {\n elem.replaceChildren(html);\n }\n}\n\nexport function setDirection(elem: Element) {\n // if(!I18n.isRTL) {\n elem.setAttribute('dir', 'auto');\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 {MOUNT_CLASS_TO} from '../config/debug';\nimport I18n, {i18n} from '../lib/langPack';\n\nexport const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\nexport const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n\nexport const ONE_DAY = 86400;\n\n// https://stackoverflow.com/a/6117889\nexport const getWeekNumber = (date: Date) => {\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\n const dayNum = d.getUTCDay() || 7;\n d.setUTCDate(d.getUTCDate() + 4 - dayNum);\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\n return Math.ceil((((d.getTime() - yearStart.getTime()) / ONE_DAY) + 1) / 7);\n};\n\nexport function formatDateAccordingToTodayNew(time: Date) {\n const today = new Date();\n const now = today.getTime() / 1000 | 0;\n const timestamp = time.getTime() / 1000 | 0;\n\n const options: Intl.DateTimeFormatOptions = {};\n if((now - timestamp) < ONE_DAY && today.getDate() === time.getDate()) { // if the same day\n options.hour = options.minute = '2-digit';\n } else if(today.getFullYear() !== time.getFullYear()) { // different year\n options.year = options.day = 'numeric';\n options.month = '2-digit';\n } else if((now - timestamp) < (ONE_DAY * 7) && getWeekNumber(today) === getWeekNumber(time)) { // current week\n options.weekday = 'short';\n } else { // same year\n options.month = 'short';\n options.day = 'numeric';\n }\n\n return new I18n.IntlDateElement({\n date: time,\n options\n }).element;\n}\n\nexport function formatFullSentTimeRaw(timestamp: number, options: {\n capitalize?: boolean\n} = {}) {\n const date = new Date();\n const time = new Date(timestamp * 1000);\n const now = date.getTime() / 1000;\n\n const timeEl = formatTime(time);\n\n let dateEl: Node | string;\n if((now - timestamp) < ONE_DAY && date.getDate() === time.getDate()) { // if the same day\n dateEl = i18n(options.capitalize ? 'Date.Today' : 'Peer.Status.Today');\n } else if((now - timestamp) < (ONE_DAY * 2) && (date.getDate() - 1) === time.getDate()) { // yesterday\n dateEl = i18n(options.capitalize ? 'Yesterday' : 'Peer.Status.Yesterday');\n\n if(options.capitalize) {\n (dateEl as HTMLElement).style.textTransform = 'capitalize';\n }\n } else if(date.getFullYear() !== time.getFullYear()) { // different year\n dateEl = new I18n.IntlDateElement({\n date: time,\n options: {\n month: 'short',\n day: 'numeric',\n year: 'numeric'\n }\n }).element;\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate() + ', ' + time.getFullYear();\n } else {\n dateEl = new I18n.IntlDateElement({\n date: time,\n options: {\n month: 'short',\n day: 'numeric'\n }\n }).element;\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate();\n }\n\n return {dateEl, timeEl};\n}\n\nexport function formatFullSentTime(timestamp: number) {\n const {dateEl, timeEl} = formatFullSentTimeRaw(timestamp, {\n capitalize: true\n });\n\n const fragment = document.createDocumentFragment();\n fragment.append(dateEl, ' ', i18n('ScheduleController.at'), ' ', timeEl);\n return fragment;\n}\n\nexport function formatTime(date: Date) {\n return new I18n.IntlDateElement({\n date,\n options: {\n hour: '2-digit',\n minute: '2-digit'\n }\n }).element;\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.formatDateAccordingToTodayNew = formatDateAccordingToTodayNew);\n\nexport const getFullDate = (date: Date, options: Partial<{\n noTime: true,\n noSeconds: true,\n monthAsNumber: true,\n leadingZero: true\n}> = {}) => {\n const joiner = options.monthAsNumber ? '.' : ' ';\n const time = ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2) + (options.noSeconds ? '' : ':' + ('0' + date.getSeconds()).slice(-2));\n\n return (options.leadingZero ? ('0' + date.getDate()).slice(-2) : date.getDate()) +\n joiner + (options.monthAsNumber ? ('0' + (date.getMonth() + 1)).slice(-2) : months[date.getMonth()]) +\n joiner + date.getFullYear() +\n (options.noTime ? '' : ', ' + time);\n};\n\n// https://github.com/DrKLO/Telegram/blob/d52b2c921abd3c1e8d6368858313ad0cb0468c07/TMessagesProj/src/main/java/org/telegram/ui/Adapters/FiltersView.java\nconst minYear = 2013;\nconst yearPattern = new RegExp('20[0-9]{1,2}');\nconst monthYearOrDayPattern = new RegExp('(\\\\w{3,}) ([0-9]{0,4})', 'i');\nconst yearOrDayAndMonthPattern = new RegExp('([0-9]{0,4}) (\\\\w{2,})', 'i');\nconst shortDate = new RegExp('^([0-9]{1,4})(\\\\.| |/|\\\\-)([0-9]{1,4})$', 'i');\nconst longDate = new RegExp('^([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,4})$', 'i');\nconst numberOfDaysEachMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\nexport type DateData = {\n title: string,\n minDate: number,\n maxDate: number,\n};\nexport function fillTipDates(query: string, dates: DateData[]) {\n const q = query.trim().toLowerCase();\n\n if(q.length < 3) {\n return;\n }\n\n if('today'.indexOf(q) === 0) {\n const date = new Date();\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: 'Today',\n minDate,\n maxDate\n });\n return;\n }\n\n if('yesterday'.indexOf(q) === 0) {\n const date = new Date();\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime() - 86400000;\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 86400001;\n dates.push({\n title: 'Yesterday',\n minDate,\n maxDate\n });\n return;\n }\n\n const dayOfWeek = getDayOfWeek(q);\n if(dayOfWeek >= 0) {\n const date = new Date();\n const now = date.getTime();\n const currentDay = date.getDay();\n const distance = dayOfWeek - currentDay;\n date.setDate(date.getDate() + distance);\n if(date.getTime() > now) {\n date.setTime(date.getTime() - 604800000);\n }\n const year = date.getFullYear()\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: formatWeekLong(minDate),\n minDate,\n maxDate\n });\n return;\n }\n\n let matches: any[];\n if((matches = shortDate.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[3];\n const k = parseInt(g1);\n const k1 = parseInt(g2);\n if(k > 0 && k <= 31) {\n if(k1 >= minYear && k <= 12) {\n const selectedYear = k1;\n const month = k - 1;\n createForMonthYear(dates, month, selectedYear);\n return;\n } else if(k1 <= 12) {\n const day = k - 1;\n const month = k1 - 1;\n createForDayMonth(dates, day, month);\n }\n } else if(k >= minYear && k1 <= 12) {\n const selectedYear = k;\n const month = k1 - 1;\n createForMonthYear(dates, month, selectedYear);\n }\n\n return;\n }\n\n if((matches = longDate.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[3];\n const g3 = matches[5];\n if(!matches[2] === matches[4]) {\n return;\n }\n\n const day = parseInt(g1);\n const month = parseInt(g2) - 1;\n let year = parseInt(g3);\n if(year >= 10 && year <= 99) {\n year += 2000;\n }\n\n const currentYear = new Date().getFullYear();\n if(validDateForMonth(day - 1, month) && year >= minYear && year <= currentYear) {\n const date = new Date();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: formatterYearMax(minDate),\n minDate,\n maxDate\n });\n return;\n }\n\n return;\n }\n\n if((matches = yearPattern.exec(q)) !== null) {\n let selectedYear = +q;\n const currentYear = new Date().getFullYear();\n if(selectedYear < minYear) {\n selectedYear = minYear;\n for(let i = currentYear; i >= selectedYear; i--) {\n const date = new Date();\n date.setFullYear(i, 0, 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(i + 1, 0, 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: '' + i,\n minDate,\n maxDate\n });\n }\n } else if(selectedYear <= currentYear) {\n const date = new Date();\n date.setFullYear(selectedYear, 0, 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(selectedYear + 1, 0, 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: '' + selectedYear,\n minDate,\n maxDate\n });\n }\n\n return;\n }\n\n if((matches = monthYearOrDayPattern.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[2];\n const month = getMonth(g1);\n if(month >= 0) {\n const k = +g2;\n if(k > 0 && k <= 31) {\n const day = k - 1;\n createForDayMonth(dates, day, month);\n return;\n } else if(k >= minYear) {\n const selectedYear = k;\n createForMonthYear(dates, month, selectedYear);\n return;\n }\n }\n }\n\n if((matches = yearOrDayAndMonthPattern.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[2];\n const month = getMonth(g2);\n if(month >= 0) {\n const k = +g1;\n if(k > 0 && k <= 31) {\n const day = k - 1;\n createForDayMonth(dates, day, month);\n return;\n } else if(k >= minYear) {\n const selectedYear = k;\n createForMonthYear(dates, month, selectedYear);\n }\n }\n }\n}\n\nfunction createForMonthYear(dates: DateData[], month: number, selectedYear: number) {\n const currentYear = new Date().getFullYear();\n const today = Date.now();\n if(selectedYear >= minYear && selectedYear <= currentYear) {\n const date = new Date();\n date.setFullYear(selectedYear, month, 1);\n date.setHours(0, 0, 0);\n const minDate = date.getTime();\n if(minDate > today) {\n return;\n }\n date.setMonth(date.getMonth() + 1);\n const maxDate = date.getTime() - 1;\n\n dates.push({\n title: formatterMonthYear(minDate),\n minDate,\n maxDate\n });\n }\n}\n\nfunction createForDayMonth(dates: DateData[], day: number, month: number) {\n if(validDateForMonth(day, month)) {\n const currentYear = new Date().getFullYear();\n const today = Date.now();\n\n for(let i = currentYear; i >= minYear; i--) {\n if(month === 1 && day === 28 && !isLeapYear(i)) {\n continue;\n }\n\n const date = new Date();\n date.setFullYear(i, month, day + 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n if(minDate > today) {\n continue;\n }\n\n date.setFullYear(i, month, day + 2);\n date.setHours(0, 0, 0);\n const maxDate = date.getTime() - 1;\n if(i === currentYear) {\n dates.push({\n title: formatterDayMonth(minDate),\n minDate,\n maxDate\n });\n } else {\n dates.push({\n title: formatterYearMax(minDate),\n minDate,\n maxDate\n });\n }\n }\n }\n}\n\nfunction formatterMonthYear(timestamp: number) {\n const date = new Date(timestamp);\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getFullYear();\n}\n\nfunction formatterDayMonth(timestamp: number) {\n const date = new Date(timestamp);\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getDate();\n}\n\nfunction formatterYearMax(timestamp: number) {\n const date = new Date(timestamp);\n return ('0' + date.getDate()).slice(-2) + '.' + ('0' + (date.getMonth() + 1)).slice(-2) + '.' + date.getFullYear();\n}\n\nfunction formatWeekLong(timestamp: number) {\n const date = new Date(timestamp);\n return days[date.getDay()];\n}\n\nfunction validDateForMonth(day: number, month: number) {\n if(month >= 0 && month < 12) {\n if(day >= 0 && day < numberOfDaysEachMonth[month]) {\n return true;\n }\n }\n return false;\n}\n\nfunction isLeapYear(year: number) {\n return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);\n}\n\nfunction getMonth(q: string) {\n /* String[] months = new String[]{\n LocaleController.getString(\"January\", R.string.January).toLowerCase(),\n LocaleController.getString(\"February\", R.string.February).toLowerCase(),\n LocaleController.getString(\"March\", R.string.March).toLowerCase(),\n LocaleController.getString(\"April\", R.string.April).toLowerCase(),\n LocaleController.getString(\"May\", R.string.May).toLowerCase(),\n LocaleController.getString(\"June\", R.string.June).toLowerCase(),\n LocaleController.getString(\"July\", R.string.July).toLowerCase(),\n LocaleController.getString(\"August\", R.string.August).toLowerCase(),\n LocaleController.getString(\"September\", R.string.September).toLowerCase(),\n LocaleController.getString(\"October\", R.string.October).toLowerCase(),\n LocaleController.getString(\"November\", R.string.November).toLowerCase(),\n LocaleController.getString(\"December\", R.string.December).toLowerCase()\n }; */\n\n /* String[] monthsEng = new String[12];\n Calendar c = Calendar.getInstance();\n for (int i = 1; i <= 12; i++) {\n c.set(0, 0, 0, 0, 0, 0);\n c.set(Calendar.MONTH, i);\n monthsEng[i - 1] = c.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH).toLowerCase();\n } */\n\n q = q.toLowerCase();\n for(let i = 0; i < 12; i++) {\n const month = months[i].toLowerCase();\n if(month.indexOf(q) === 0) {\n return i;\n }\n }\n return -1;\n}\n\nfunction getDayOfWeek(q: string) {\n const c = new Date();\n if(q.length <= 3) {\n return -1;\n }\n\n for(let i = 0; i < 7; i++) {\n c.setDate(c.getDate() + 1);\n\n if(formatWeekLong(c.getTime()).toLowerCase().indexOf(q) === 0) {\n return c.getDay();\n }\n }\n return -1;\n}\n\nMOUNT_CLASS_TO.fillTipDates = fillTipDates;\n","/**\n * Will be used for FILE_REFERENCE_EXPIRED\n * @param key\n * @param wasObject\n * @param newObject\n */\nexport default function safeReplaceArrayInObject(key: K, wasObject: any, newObject: any) {\n if('byteLength' in newObject[key]) { // Uint8Array\n newObject[key] = [...newObject[key]];\n }\n\n if(wasObject && wasObject[key] !== newObject[key]) {\n wasObject[key].length = newObject[key].length;\n (newObject[key] as any[]).forEach((v, i) => {\n wasObject[key][i] = v;\n });\n\n /* wasObject[key].set(newObject[key]); */\n newObject[key] = wasObject[key];\n }\n}\n","export const EXTENSION_MIME_TYPE_MAP: {[ext in MTFileExtension]: MTMimeType} = {\n pdf: 'application/pdf',\n tgv: 'application/x-tgwallpattern',\n tgs: 'application/x-tgsticker',\n json: 'application/json',\n wav: 'audio/wav',\n mp3: 'audio/mpeg',\n ogg: 'audio/ogg',\n jpeg: 'image/jpeg',\n jpg: 'image/jpeg',\n png: 'image/png',\n gif: 'image/gif',\n webp: 'image/webp',\n mp4: 'video/mp4',\n webm: 'video/webm',\n mov: 'video/quicktime',\n svg: 'image/svg+xml'\n};\n\nexport const MIME_TYPE_EXTENSION_MAP: {[mimeType in MTMimeType]?: MTFileExtension} = {};\n\nfor(const ext in EXTENSION_MIME_TYPE_MAP) {\n MIME_TYPE_EXTENSION_MAP[EXTENSION_MIME_TYPE_MAP[ext as MTFileExtension]] = ext as MTFileExtension;\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 type {ThumbCache} from '../storages/thumbs';\nimport {AccountWallPapers, Document, DocumentAttribute, MessagesSavedGifs, PhotoSize, WallPaper} from '../../layer';\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport {getFullDate} from '../../helpers/date';\nimport isObject from '../../helpers/object/isObject';\nimport safeReplaceArrayInObject from '../../helpers/object/safeReplaceArrayInObject';\nimport {AppManager} from './manager';\nimport wrapPlainText from '../richTextProcessor/wrapPlainText';\nimport assumeType from '../../helpers/assumeType';\nimport {getEnvironment} from '../../environment/utils';\nimport {isServiceWorkerOnline} from '../mtproto/mtproto.worker';\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\nimport getDocumentInputFileLocation from './utils/docs/getDocumentInputFileLocation';\nimport getDocumentURL from './utils/docs/getDocumentURL';\nimport makeError from '../../helpers/makeError';\nimport {EXTENSION_MIME_TYPE_MAP} from '../../environment/mimeTypeMap';\nimport {THUMB_TYPE_FULL} from '../mtproto/mtproto_config';\n\nexport type MyDocument = Document.document;\n\n// TODO: ะตัะปะธ ะทะฐะปะธั‚ัŒ ะบะฐั€ั‚ะธะฝะบัƒ ั„ะฐะนะปะพะผ, ะฐ ะฟะพั‚ะพะผ ะฟะตั€ะตะทะฐะนั‚ะธ ะฒ ะดะธะฐะปะพะณ - ะฟั€ะตะฒัŒัŽัˆะบะฐ ะทะฐะฝะพะฒะพ ัะบะฐั‡ะฐะตั‚ัั\n\ntype WallPaperId = WallPaper.wallPaper['id'];\n\nlet uploadWallPaperTempId = 0;\n\nexport class AppDocsManager extends AppManager {\n private docs: {[docId: DocId]: MyDocument};\n\n private stickerCachedThumbs: {[docId: DocId]: {[toneIndex: number]: {url: string, w: number, h: number}}};\n\n private uploadingWallPapers: {[id: WallPaperId]: {cacheContext: ThumbCache, file: File}};\n\n protected after() {\n this.docs = {};\n this.stickerCachedThumbs = {};\n this.uploadingWallPapers = {};\n\n MTProtoMessagePort.getInstance().addEventListener('serviceWorkerOnline', (online) => {\n if(!online) {\n this.onServiceWorkerFail();\n }\n });\n }\n\n private onServiceWorkerFail = () => {\n for(const id in this.docs) {\n const doc = this.docs[id];\n\n if(doc.supportsStreaming) {\n delete doc.supportsStreaming;\n this.thumbsStorage.deleteCacheContext(doc);\n }\n }\n };\n\n public saveDoc(doc: Document, context?: ReferenceContext): MyDocument {\n if(!doc || doc._ === 'documentEmpty') {\n return;\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 this.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 for(let i = 0, length = doc.attributes.length; i < length; ++i) {\n const attribute = doc.attributes[i];\n switch(attribute._) {\n case 'documentAttributeFilename': {\n doc.file_name = wrapPlainText(attribute.file_name);\n break;\n }\n\n case 'documentAttributeAudio': {\n if(doc.type === 'round') {\n break;\n }\n\n doc.duration = attribute.duration;\n doc.type = attribute.pFlags.voice && doc.mime_type === 'audio/ogg' ? 'voice' : 'audio';\n break;\n }\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\n case 'documentAttributeCustomEmoji':\n case 'documentAttributeSticker': {\n if(attribute.alt !== undefined) {\n doc.stickerEmojiRaw = attribute.alt;\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 || getEnvironment().IS_WEBP_SUPPORTED)) {\n doc.type = 'sticker';\n doc.sticker = 1;\n } else if(doc.mime_type === 'video/webm') {\n if(!getEnvironment().IS_WEBM_SUPPORTED) {\n break;\n }\n\n doc.type = 'sticker';\n doc.sticker = 3;\n doc.animated = true;\n }\n break;\n }\n\n case 'documentAttributeImageSize': {\n doc.type = 'photo';\n doc.w = attribute.w;\n doc.h = attribute.h;\n break;\n }\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\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 } else 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.type === 'voice' || doc.type === 'round') {\n // browser will identify extension\n const attribute = doc.attributes.find((attribute) => attribute._ === 'documentAttributeFilename') as DocumentAttribute.documentAttributeFilename;\n const ext = attribute && attribute.file_name.split('.').pop();\n const date = getFullDate(new Date(doc.date * 1000), {monthAsNumber: true, leadingZero: true}).replace(/[:\\.]/g, '-').replace(', ', '_');\n doc.file_name = `${doc.type}_${date}${ext ? '.' + ext : ''}`;\n }\n\n if(isServiceWorkerOnline() && ((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 = this.thumbsStorage.getCacheContext(doc);\n if(!cacheContext.url) {\n this.thumbsStorage.setCacheContextURL(doc, undefined, getDocumentURL(doc), 0);\n }\n } else {\n doc.supportsStreaming = false;\n }\n\n // for testing purposes\n // doc.supportsStreaming = false;\n // doc.url = ''; // * this will break upload urls\n\n doc.file_name ||= '';\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 downloadDoc(doc: MyDocument, queueId?: number, onlyCache?: boolean) {\n return this.apiFileManager.downloadMedia({\n media: doc,\n queueId,\n onlyCache\n });\n }\n\n public getLottieCachedThumb(docId: DocId, toneIndex: number) {\n const cached = this.stickerCachedThumbs[docId];\n return cached && cached[toneIndex];\n }\n\n public saveLottiePreview(docId: DocId, blob: Blob, width: number, height: number, toneIndex: number) {\n const doc = this.getDoc(docId);\n if(!doc) {\n return;\n }\n\n const cached = this.stickerCachedThumbs[doc.id] ??= {};\n\n const thumb = cached[toneIndex];\n if(thumb && thumb.w >= width && thumb.h >= height) {\n return;\n }\n\n cached[toneIndex] = {\n url: URL.createObjectURL(blob),\n w: width,\n h: height\n };\n }\n\n public saveWebPConvertedStrippedThumb(docId: DocId, bytes: Uint8Array) {\n const doc = this.getDoc(docId);\n if(!doc) {\n return;\n }\n\n const thumb = doc.thumbs && doc.thumbs.find((thumb) => thumb._ === 'photoStrippedSize') as PhotoSize.photoStrippedSize;\n if(!thumb) {\n return;\n }\n\n doc.pFlags.stickerThumbConverted = true;\n thumb.bytes = bytes;\n }\n\n public prepareWallPaperUpload(file: File) {\n const id = 'wallpaper-upload-' + ++uploadWallPaperTempId;\n\n const thumb = {\n _: 'photoSize',\n h: 0,\n w: 0,\n location: {} as any,\n size: file.size,\n type: THUMB_TYPE_FULL\n } as PhotoSize.photoSize;\n let document: MyDocument = {\n _: 'document',\n access_hash: '',\n attributes: [],\n dc_id: 0,\n file_reference: [],\n id,\n mime_type: file.type as MTMimeType,\n size: file.size,\n date: Date.now() / 1000,\n pFlags: {},\n thumbs: [thumb],\n file_name: file.name\n };\n\n document = this.saveDoc(document);\n\n const cacheContext = this.thumbsStorage.setCacheContextURL(document, undefined, URL.createObjectURL(file), file.size);\n\n const wallpaper: WallPaper.wallPaper = {\n _: 'wallPaper',\n access_hash: '',\n document: document,\n id,\n slug: id,\n pFlags: {}\n };\n\n this.uploadingWallPapers[id] = {\n cacheContext,\n file\n };\n\n return wallpaper;\n }\n\n public uploadWallPaper(id: WallPaperId) {\n const {cacheContext, file} = this.uploadingWallPapers[id];\n delete this.uploadingWallPapers[id];\n\n const upload = this.apiFileManager.upload({file, fileName: file.name});\n return upload.then((inputFile) => {\n return this.apiManager.invokeApi('account.uploadWallPaper', {\n file: inputFile,\n mime_type: file.type,\n settings: {\n _: 'wallPaperSettings',\n pFlags: {}\n }\n }).then((wallPaper) => {\n assumeType(wallPaper);\n wallPaper.document = this.saveDoc(wallPaper.document);\n this.thumbsStorage.setCacheContextURL(wallPaper.document, undefined, cacheContext.url, cacheContext.downloaded);\n\n return wallPaper;\n });\n });\n }\n\n public getGifs() {\n return this.apiManager.invokeApiHashable({\n method: 'messages.getSavedGifs',\n processResult: (res) => {\n assumeType(res);\n return res.gifs.map((doc) => this.saveDoc(doc));\n }\n });\n }\n\n public requestDocPart(docId: DocId, dcId: number, offset: number, limit: number) {\n const doc = this.getDoc(docId);\n if(!doc) return Promise.reject(makeError('NO_DOC'));\n return this.apiFileManager.requestFilePart(dcId, getDocumentInputFileLocation(doc), offset, limit);\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 {FileURLType, getFileURL} from '../../../../helpers/fileName';\nimport {Document, PhotoSize} from '../../../../layer';\nimport getDocumentDownloadOptions from './getDocumentDownloadOptions';\n\nexport default function getDocumentURL(doc: Document.document, 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, getDocumentDownloadOptions(doc, thumb));\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 {MessageEntity, DraftMessage, MessagesSaveDraft} from '../../layer';\nimport tsNow from '../../helpers/tsNow';\nimport stateStorage from '../stateStorage';\nimport assumeType from '../../helpers/assumeType';\nimport {AppManager} from './manager';\nimport generateMessageId from './utils/messageId/generateMessageId';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport draftsAreEqual from './utils/drafts/draftsAreEqual';\n\nexport type MyDraftMessage = DraftMessage.draftMessage;\n\nexport class AppDraftsManager extends AppManager {\n private drafts: {[peerIdAndThreadId: string]: MyDraftMessage} = {};\n private getAllDraftPromise: Promise;\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateDraftMessage: (update) => {\n const peerId = this.appPeersManager.getPeerId(update.peer);\n this.saveDraft({\n peerId,\n threadId: update.threadId,\n draft: update.draft,\n notify: true\n });\n }\n });\n\n /* return */stateStorage.get('drafts').then((drafts) => {\n this.drafts = drafts || {};\n });\n }\n\n private getKey(peerId: PeerId, threadId?: number) {\n return '' + peerId + (threadId ? '_' + threadId : '');\n }\n\n public getDraft(peerId: PeerId, threadId?: number) {\n return this.drafts[this.getKey(peerId, threadId)];\n }\n\n public addMissedDialogs() {\n return this.getAllDrafts().then(() => {\n for(const key in this.drafts) {\n if(key.indexOf('_') !== -1) { // exclude threads\n continue;\n }\n\n const peerId = key.toPeerId();\n const dialog = this.appMessagesManager.getDialogOnly(peerId);\n if(!dialog) {\n this.appMessagesManager.reloadConversation(peerId);\n /* const dialog = appMessagesManager.generateDialog(peerId);\n dialog.draft = this.drafts[key];\n appMessagesManager.saveConversation(dialog);\n appMessagesManager.newDialogsToHandle[peerId] = dialog;\n appMessagesManager.scheduleHandleNewDialogs(); */\n }\n }\n });\n }\n\n private getAllDrafts() {\n return this.getAllDraftPromise ??= this.apiManager.invokeApi('messages.getAllDrafts')\n .then((updates) => {\n const p = this.apiUpdatesManager.updatesState.syncLoading || Promise.resolve();\n p.then(() => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n });\n }\n\n public saveDraft({peerId, threadId, draft: apiDraft, notify, force}: {\n peerId: PeerId,\n threadId?: number,\n draft: DraftMessage,\n notify?: boolean,\n force?: boolean\n }) {\n const draft = this.processApiDraft(apiDraft);\n\n const key = this.getKey(peerId, threadId);\n if(draft) {\n this.drafts[key] = draft;\n } else {\n delete this.drafts[key];\n }\n\n stateStorage.set({\n drafts: this.drafts\n });\n\n if(notify) {\n // console.warn(dT(), 'save draft', peerId, apiDraft, options)\n this.rootScope.dispatchEvent('draft_updated', {\n peerId,\n threadId,\n draft,\n force\n });\n }\n\n return draft;\n }\n\n private isEmptyDraft(draft: DraftMessage) {\n if(draft?._ !== 'draftMessage') {\n return true;\n }\n\n if(draft.reply_to_msg_id !== undefined && draft.reply_to_msg_id > 0) {\n return false;\n }\n\n if(!draft.message.length) {\n return true;\n }\n\n return false;\n }\n\n private processApiDraft(draft: DraftMessage): MyDraftMessage {\n if(!draft || draft._ !== 'draftMessage') {\n return undefined;\n }\n\n if(draft.reply_to_msg_id) {\n draft.reply_to_msg_id = generateMessageId(draft.reply_to_msg_id);\n }\n\n return draft;\n }\n\n public syncDraft(peerId: PeerId, threadId: number, localDraft?: DraftMessage, saveOnServer = true, force = false) {\n // console.warn(dT(), 'sync draft', peerID)\n const serverDraft = this.getDraft(peerId, threadId);\n if(draftsAreEqual(serverDraft, localDraft)) {\n // console.warn(dT(), 'equal drafts', localDraft, serverDraft)\n return true;\n }\n\n // console.warn(dT(), 'changed draft', localDraft, serverDraft)\n const params: MessagesSaveDraft = {\n peer: this.appPeersManager.getInputPeerById(peerId),\n message: ''\n };\n\n let draftObj: DraftMessage;\n if(this.isEmptyDraft(localDraft)) {\n draftObj = {_: 'draftMessageEmpty'};\n } else {\n assumeType(localDraft);\n const message = localDraft.message;\n const entities: MessageEntity[] = localDraft.entities;\n\n if(localDraft.reply_to_msg_id) {\n params.reply_to_msg_id = getServerMessageId(localDraft.reply_to_msg_id);\n }\n\n if(entities?.length) {\n params.entities = this.appMessagesManager.getInputEntities(entities);\n }\n\n if(localDraft.pFlags.no_webpage) {\n params.no_webpage = localDraft.pFlags.no_webpage;\n }\n\n params.message = message;\n }\n\n if(threadId) {\n params.top_msg_id = getServerMessageId(threadId);\n }\n\n const saveLocalDraft = draftObj || localDraft;\n saveLocalDraft.date = tsNow(true) + this.timeManager.getServerTimeOffset();\n\n this.saveDraft({\n peerId,\n threadId,\n draft: saveLocalDraft,\n notify: true,\n force\n });\n\n if(saveOnServer) {\n return this.apiManager.invokeApi('messages.saveDraft', params);\n }\n\n return true;\n }\n\n public clearAllDrafts() {\n return this.apiManager.invokeApi('messages.clearAllDrafts').then((bool) => {\n if(!bool) {\n return;\n }\n\n for(const combined in this.drafts) {\n const [peerId, threadId] = combined.split('_');\n this.rootScope.dispatchEvent('draft_updated', {\n peerId: peerId.toPeerId(),\n threadId: threadId ? +threadId : undefined,\n draft: undefined\n });\n }\n });\n }\n\n public clearDraft(peerId: PeerId, threadId: number) {\n const emptyDraft: DraftMessage.draftMessageEmpty = {\n _: 'draftMessageEmpty'\n };\n\n if(threadId) {\n this.syncDraft(peerId, threadId, emptyDraft as any, false, true);\n } else {\n this.saveDraft({\n peerId,\n threadId,\n draft: emptyDraft,\n notify: true,\n force: true\n });\n }\n }\n\n public setDraft(peerId: PeerId, threadId: number, message: string, entities?: MessageEntity[]) {\n const draft: DraftMessage.draftMessage = {\n _: 'draftMessage',\n date: Date.now() / 1000 | 0,\n message,\n pFlags: {},\n entities\n };\n\n if(threadId) {\n this.syncDraft(peerId, threadId, draft, false, true);\n } else {\n this.saveDraft({\n peerId,\n threadId,\n draft,\n notify: true,\n force: true\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 {MyDocument} from './appDocsManager';\nimport App from '../../config/app';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport isObject from '../../helpers/object/isObject';\nimport validateInitObject from '../../helpers/object/validateInitObject';\nimport fixEmoji from '../richTextProcessor/fixEmoji';\nimport SearchIndex from '../searchIndex';\nimport stateStorage from '../stateStorage';\nimport {AppManager} from './manager';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport pause from '../../helpers/schedulers/pause';\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 = 32;\n\ntype EmojiType = 'native' | 'custom';\n\nexport class AppEmojiManager extends AppManager {\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: {native?: string[], custom?: DocId[]} = {};\n private getRecentEmojisPromises: {native?: Promise, custom?: Promise} = {};\n\n private getCustomEmojiDocumentsPromise: Promise;\n private getCustomEmojiDocumentPromises: Map> = new Map();\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 this.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(this.networkerFactory.language !== App.langPackCode) {\n promises.push(this.getEmojiKeywords(this.networkerFactory.language));\n }\n\n if(!this.recent.native) {\n promises.push(this.getRecentEmojis('native'));\n }\n\n return Promise.all(promises);\n }\n\n private 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.native.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(type: 'custom'): Promise;\n public getRecentEmojis(type: 'native'): Promise;\n public getRecentEmojis(type: T): Promise {\n const promises = this.getRecentEmojisPromises;\n return promises[type] ??= this.appStateManager.getState().then((state) => {\n let recent: string[] | DocId[] = [];\n if(type === 'native') {\n const {recentEmoji} = state;\n recent = Array.isArray(recentEmoji) && recentEmoji.length ? recentEmoji : AppEmojiManager.POPULAR_EMOJI;\n } else {\n const {recentCustomEmoji} = state;\n recent = Array.isArray(recentCustomEmoji) && recentCustomEmoji.length ? recentCustomEmoji : [];\n }\n\n return this.recent[type] = recent as any;\n }) as any;\n }\n\n public pushRecentEmoji(emoji: AppEmoji) {\n const type: EmojiType = emoji.docId ? 'custom' : 'native';\n emoji.emoji = fixEmoji(emoji.emoji);\n // @ts-ignore\n this.getRecentEmojis(type).then((recent) => {\n const i = emoji.docId || emoji.emoji;\n indexOfAndSplice(recent, i);\n recent.unshift(i);\n recent.splice(RECENT_MAX_LENGTH, recent.length - RECENT_MAX_LENGTH);\n\n this.appStateManager.pushToState(type === 'custom' ? 'recentCustomEmoji' : 'recentEmoji', recent);\n this.rootScope.dispatchEvent('emoji_recent', emoji);\n });\n }\n\n public getCustomEmojiDocuments(docIds: DocId[]) {\n if(!docIds.length) return Promise.resolve([] as MyDocument[]);\n return this.apiManager.invokeApi('messages.getCustomEmojiDocuments', {document_id: docIds}).then((documents) => {\n return documents.map((doc) => {\n return this.appDocsManager.saveDoc(doc, {\n type: 'customEmoji',\n docId: doc.id\n });\n });\n });\n }\n\n public getCachedCustomEmojiDocuments(docIds: DocId[]) {\n return docIds.map((docId) => this.appDocsManager.getDoc(docId));\n }\n\n private setDebouncedGetCustomEmojiDocuments() {\n if(this.getCustomEmojiDocumentsPromise || !this.getCustomEmojiDocumentPromises.size) {\n return;\n }\n\n this.getCustomEmojiDocumentsPromise = pause(0).then(() => {\n const allIds = [...this.getCustomEmojiDocumentPromises.keys()];\n const promises: Promise[] = [];\n do {\n const ids = allIds.splice(0, 100);\n const promise = this.getCustomEmojiDocuments(ids).then((docs) => {\n docs.forEach((doc, idx) => {\n const docId = ids[idx];\n const deferred = this.getCustomEmojiDocumentPromises.get(docId);\n this.getCustomEmojiDocumentPromises.delete(docId);\n deferred.resolve(doc);\n });\n });\n\n promises.push(promise);\n } while(allIds.length);\n\n return Promise.all(promises);\n }).finally(() => {\n this.getCustomEmojiDocumentsPromise = undefined;\n this.setDebouncedGetCustomEmojiDocuments();\n });\n }\n\n public getCustomEmojiDocument(id: DocId) {\n let promise = this.getCustomEmojiDocumentPromises.get(id);\n if(promise) {\n return promise;\n }\n\n const doc = this.appDocsManager.getDoc(id);\n if(doc) {\n return doc;\n }\n\n promise = deferredPromise();\n this.getCustomEmojiDocumentPromises.set(id, promise);\n\n this.setDebouncedGetCustomEmojiDocuments();\n\n return promise;\n }\n\n public getCustomEmojis() {\n return this.appStickersManager.getEmojiStickers();\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 type GroupCallConnectionInstance from '../calls/groupCallConnectionInstance';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport {nextRandomUint} from '../../helpers/random';\nimport {DataJSON, GroupCall, GroupCallParticipant, GroupCallParticipantVideoSourceGroup, InputGroupCall, PhoneJoinGroupCall, PhoneJoinGroupCallPresentation, Update, Updates} from '../../layer';\nimport {logger} from '../logger';\nimport {NULL_PEER_ID} from '../mtproto/mtproto_config';\nimport {AppManager} from './manager';\nimport getPeerId from './utils/peers/getPeerId';\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\nexport type GroupCallOutputSource = 'main' | 'presentation' | number;\n\nexport class AppGroupCallsManager extends AppManager {\n private log: ReturnType;\n\n private groupCalls: Map;\n private participants: Map>;\n private nextOffsets: Map;\n\n // private doNotDispatchParticipantUpdate: PeerId;\n\n protected after() {\n this.log = logger('GROUP-CALLS');\n\n this.groupCalls = new Map();\n this.participants = new Map();\n this.nextOffsets = new Map();\n\n this.apiUpdatesManager.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 this.rootScope.addEventListener('group_call_update', (groupCall) => {\n if(groupCall._ === 'groupCallDiscarded') {\n this.participants.delete(groupCall.id);\n }\n });\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 participants = this.getCachedParticipants(groupCallId);\n\n const peerId = 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 if(oldParticipant) {\n safeReplaceObject(oldParticipant, participant);\n participant = oldParticipant;\n } else {\n participants.set(peerId, participant);\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 this.rootScope.dispatchEvent('group_call_update', groupCall);\n }\n }\n // }\n\n if(hasLeft) {\n participants.delete(peerId);\n }\n\n if(oldParticipant || true/* && this.doNotDispatchParticipantUpdate !== peerId */) {\n this.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 this.saveApiParticipant(groupCallId, participant);\n\n const peerId = participant.pFlags.self ? NULL_PEER_ID : getPeerId(participant.peer);\n const updates = await this.apiManager.invokeApiSingle('phone.editGroupCallParticipant', {\n call: this.getGroupCallInput(groupCallId),\n participant: peerId === NULL_PEER_ID ? this.appPeersManager.getInputPeerSelf() : this.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 = getPeerId(participant.peer);\n this.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 this.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 this.appUsersManager.saveApiUsers(groupCall.users);\n this.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 this.rootScope.dispatchEvent('group_call_update', call as any);\n }\n\n return call;\n }\n\n public async createGroupCall(chatId: ChatId, scheduleDate?: number, title?: string) {\n const updates = await this.apiManager.invokeApi('phone.createGroupCall', {\n peer: this.appPeersManager.getInputPeerById(chatId.toPeerId(true)),\n random_id: nextRandomUint(32),\n schedule_date: scheduleDate,\n title\n });\n\n this.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 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 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: this.appPeersManager.getOutputPeer(rootScope.myId)\n // };\n // }\n\n public async getGroupCallParticipants(id: GroupCallId) {\n const {nextOffset, setNextOffset} = this.prepareToSavingNextOffset(id);\n\n if(nextOffset !== '') {\n await this.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 this.appChatsManager.saveApiChats(groupCallParticipants.chats);\n this.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 hangUp(id: GroupCallId, discard?: boolean | number) {\n const groupCallInput = this.getGroupCallInput(id);\n let promise: Promise;\n if(typeof(discard) === 'boolean' && discard) {\n promise = this.apiManager.invokeApi('phone.discardGroupCall', {\n call: groupCallInput\n });\n } else if(typeof(discard) === 'number') {\n promise = this.apiManager.invokeApi('phone.leaveGroupCall', {\n call: groupCallInput,\n source: discard\n });\n } else {\n promise = this.apiManager.invokeApi('phone.joinGroupCall', {\n call: groupCallInput,\n join_as: this.appPeersManager.getInputPeerSelf(),\n muted: true,\n video_stopped: true,\n params: {\n _: 'dataJSON',\n data: ''\n }\n });\n }\n\n return promise.then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public async joinGroupCall(groupCallId: GroupCallId, params: DataJSON, options: GroupCallConnectionInstance['options']) {\n const groupCallInput = this.getGroupCallInput(groupCallId);\n let promise: Promise;\n if(options.type === 'main') {\n const request: PhoneJoinGroupCall = {\n call: groupCallInput,\n join_as: this.appPeersManager.getInputPeerSelf(),\n params,\n muted: options.isMuted,\n video_stopped: !options.joinVideo\n };\n\n promise = this.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 = this.apiManager.invokeApi('phone.joinGroupCallPresentation', request);\n this.log(`[api] joinGroupCallPresentation id=${groupCallId}`, request);\n }\n\n const updates = await promise;\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n const update = (updates as Updates.updates).updates.find((update) => update._ === 'updateGroupCallConnection') as Update.updateGroupCallConnection;\n return update;\n }\n\n public leaveGroupCallPresentation(groupCallId: GroupCallId) {\n return this.apiManager.invokeApi('phone.leaveGroupCallPresentation', {\n call: this.getGroupCallInput(groupCallId)\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\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 {InputPhoto} from '../../../../layer';\nimport {MyPhoto} from '../../appPhotosManager';\n\nexport default function getPhotoInput(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 * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {InputMedia} from '../../../../layer';\nimport {MyPhoto} from '../../appPhotosManager';\nimport getPhotoInput from './getPhotoInput';\n\nexport default function getPhotoMediaInput(photo: MyPhoto): InputMedia.inputMediaPhoto {\n return {\n _: 'inputMediaPhoto',\n id: getPhotoInput(photo),\n ttl_seconds: 0,\n pFlags: {}\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 {Document, InputMedia} from '../../../../layer';\n\nexport default function getMediaInput(doc: Document.document): 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 pFlags: {}\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 type {MyDocument} from './appDocsManager';\nimport type {MyPhoto} from './appPhotosManager';\nimport type {MyTopPeer} from './appUsersManager';\nimport type {AppMessagesManager, MessageSendingParams} from './appMessagesManager';\nimport {BotInlineResult, GeoPoint, InputGeoPoint, InputMedia, MessageEntity, MessageMedia, MessagesBotResults, ReplyMarkup} from '../../layer';\nimport insertInDescendSortedArray from '../../helpers/array/insertInDescendSortedArray';\nimport {AppManager} from './manager';\nimport getPhotoMediaInput from './utils/photos/getPhotoMediaInput';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport generateQId from './utils/inlineBots/generateQId';\nimport getDocumentMediaInput from './utils/docs/getDocumentMediaInput';\n\nexport class AppInlineBotsManager extends AppManager {\n private inlineResults: {[queryAndResultIds: string]: BotInlineResult} = {};\n private setHash: {\n [botId: UserId]: {\n peerId: PeerId,\n time: number\n }\n } = {};\n\n public getGeoInput(geo: GeoPoint): InputGeoPoint {\n return geo._ === 'geoPoint' ? {\n _: 'inputGeoPoint',\n lat: geo.lat,\n long: geo.long,\n accuracy_radius: geo.accuracy_radius\n } : {\n _: 'inputGeoPointEmpty'\n };\n }\n\n public getInlineResults(peerId: PeerId, botId: BotId, query = '', offset = '', geo?: GeoPoint) {\n return this.apiManager.invokeApi('messages.getInlineBotResults', {\n bot: this.appUsersManager.getUserInput(botId),\n peer: this.appPeersManager.getInputPeerById(peerId),\n query,\n geo_point: geo ? this.getGeoInput(geo) : undefined,\n offset\n }, {/* timeout: 1, */stopTime: -1, noErrorBox: true}).then((botResults) => {\n const queryId = botResults.query_id;\n\n /* if(botResults.switch_pm) {\n botResults.switch_pm.rText = wrapRichText(botResults.switch_pm.text, {noLinebreaks: true, noLinks: true});\n } */\n\n botResults.results.forEach((result) => {\n if(result._ === 'botInlineMediaResult') {\n if(result.document) {\n result.document = this.appDocsManager.saveDoc(result.document);\n }\n\n if(result.photo) {\n result.photo = this.appPhotosManager.savePhoto(result.photo);\n }\n }\n\n this.inlineResults[generateQId(queryId, result.id)] = result;\n });\n\n return botResults;\n });\n }\n\n private pushPopularBot(botId: BotId) {\n this.appUsersManager.getTopPeers('bots_inline').then((topPeers) => {\n const botPeerId = botId.toPeerId();\n const index = topPeers.findIndex((topPeer) => topPeer.id === botPeerId);\n let topPeer: MyTopPeer;\n if(index !== -1) {\n topPeer = topPeers[index];\n } else {\n topPeer = {\n id: botPeerId,\n rating: 0\n };\n }\n\n ++topPeer.rating;\n insertInDescendSortedArray(topPeers, topPeer, 'rating');\n\n this.appStateManager.setKeyValueToStorage('topPeersCache');\n\n // rootScope.$broadcast('inline_bots_popular')\n });\n }\n\n public switchToPM(fromPeerId: PeerId, botId: BotId, startParam: string) {\n this.setHash[botId] = {peerId: fromPeerId, time: Date.now()};\n return this.appMessagesManager.startBot(botId, undefined, startParam);\n }\n\n /*\n function resolveInlineMention (username) {\n return AppPeersManager.resolveUsername(username).then(function (peerId) {\n if (peerId.isUser()) {\n var bot = AppUsersManager.getUser(peerId)\n if (bot.pFlags.bot && bot.bot_inline_placeholder !== undefined) {\n var resolvedBot = {\n username: username,\n id: peerId,\n placeholder: bot.bot_inline_placeholder\n }\n if (bot.pFlags.bot_inline_geo &&\n GeoLocationManager.isAvailable()) {\n return checkGeoLocationAccess(peerId).then(function () {\n return GeoLocationManager.getPosition().then(function (coords) {\n resolvedBot.geo = coords\n return qSync.when(resolvedBot)\n })\n })['catch'](function () {\n return qSync.when(resolvedBot)\n })\n }\n return qSync.when(resolvedBot)\n }\n }\n return $q.reject()\n }, function (error) {\n error.handled = true\n return $q.reject(error)\n })\n }\n\n function regroupWrappedResults (results, rowW, rowH) {\n if (!results ||\n !results[0] ||\n ['photo', 'gif', 'sticker'].indexOf(results[0].type) === -1) {\n return\n }\n var ratios = []\n angular.forEach(results, function (result) {\n var w\n var h, doc\n var photo\n if (result._ === 'botInlineMediaResult') {\n if (doc = result.document) {\n w = result.document.w\n h = result.document.h\n }\n else if (photo = result.photo) {\n var photoSize = (photo.sizes || [])[0]\n w = photoSize && photoSize.w\n h = photoSize && photoSize.h\n }\n }else {\n w = result.w\n h = result.h\n }\n if (!w || !h) {\n w = h = 1\n }\n ratios.push(w / h)\n })\n\n var rows = []\n var curCnt = 0\n var curW = 0\n angular.forEach(ratios, function (ratio) {\n var w = ratio * rowH\n curW += w\n if (!curCnt || curCnt < 4 && curW < (rowW * 1.1)) {\n curCnt++\n } else {\n rows.push(curCnt)\n curCnt = 1\n curW = w\n }\n })\n if (curCnt) {\n rows.push(curCnt)\n }\n\n var i = 0\n var thumbs = []\n var lastRowI = rows.length - 1\n angular.forEach(rows, function (rowCnt, rowI) {\n var lastRow = rowI === lastRowI\n var curRatios = ratios.slice(i, i + rowCnt)\n var sumRatios = 0\n angular.forEach(curRatios, function (ratio) {\n sumRatios += ratio\n })\n angular.forEach(curRatios, function (ratio, j) {\n var thumbH = rowH\n var thumbW = rowW * ratio / sumRatios\n var realW = thumbH * ratio\n if (lastRow && thumbW > realW) {\n thumbW = realW\n }\n var result = results[i + j]\n result.thumbW = Math.floor(thumbW) - 2\n result.thumbH = Math.floor(thumbH) - 2\n })\n\n i += rowCnt\n })\n } */\n\n public async checkSwitchReturn(botId: BotId) {\n const bot = this.appUsersManager.getUser(botId);\n if(!bot || !bot.pFlags.bot || !bot.bot_inline_placeholder) {\n return;\n }\n\n const peerData = this.setHash[botId];\n if(peerData) {\n delete this.setHash[botId];\n if((Date.now() - peerData.time) < 3600e3) {\n return peerData.peerId;\n }\n }\n }\n\n public switchInlineQuery(peerId: PeerId, threadId: number, botId: BotId, query: string) {\n this.appDraftsManager.setDraft(peerId, threadId, '@' + this.appPeersManager.getPeerUsername(botId.toPeerId()) + ' ' + query);\n }\n\n public callbackButtonClick(peerId: PeerId, mid: number, button: any) {\n return this.apiManager.invokeApi('messages.getBotCallbackAnswer', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(mid),\n data: button.data\n }, {/* timeout: 1, */stopTime: -1, noErrorBox: true});\n }\n\n /* function gameButtonClick (id) {\n var message = AppMessagesManager.getMessage(id)\n var peerId = AppMessagesManager.getMessagePeer(message)\n\n return MtpApiManager.invokeApi('messages.getBotCallbackAnswer', {\n peer: AppPeersManager.getInputPeerByID(peerId),\n msg_id: AppMessagesIDsManager.getMessageLocalID(id)\n }, {timeout: 1, stopTime: -1, noErrorBox: true}).then(function (callbackAnswer) {\n if (typeof callbackAnswer.message === 'string' &&\n callbackAnswer.message.length) {\n showCallbackMessage(callbackAnswer.message, callbackAnswer.pFlags.alert)\n }\n else if (typeof callbackAnswer.url === 'string') {\n AppGamesManager.openGame(message.media.game.id, id, callbackAnswer.url)\n }\n })\n } */\n\n public sendInlineResult(peerId: PeerId, botId: BotId, queryAndResultIds: string, options: MessageSendingParams & Partial<{\n viaBotId: BotId,\n queryId: string,\n resultId: string,\n replyMarkup: ReplyMarkup,\n entities: MessageEntity[],\n clearDraft: true,\n geoPoint: GeoPoint\n }> = {}) {\n const inlineResult = this.inlineResults[queryAndResultIds];\n if(!inlineResult) {\n return;\n }\n\n this.pushPopularBot(botId);\n const splitted = queryAndResultIds.split('_');\n const queryID = splitted.shift();\n const resultID = splitted.join('_');\n options.viaBotId = botId;\n options.queryId = queryID;\n options.resultId = resultID;\n if(inlineResult.send_message.reply_markup) {\n options.replyMarkup = inlineResult.send_message.reply_markup;\n }\n\n if(inlineResult.send_message._ === 'botInlineMessageText') {\n options.entities = inlineResult.send_message.entities;\n this.appMessagesManager.sendText(peerId, inlineResult.send_message.message, options);\n } else {\n let caption = '';\n let inputMedia: Parameters[1], messageMedia: MessageMedia;\n const sendMessage = inlineResult.send_message;\n switch(sendMessage._) {\n case 'botInlineMessageMediaAuto': {\n caption = sendMessage.message;\n\n if(inlineResult._ === 'botInlineMediaResult') {\n const {document, photo} = inlineResult;\n if(document) {\n inputMedia = getDocumentMediaInput(document as MyDocument);\n } else {\n inputMedia = getPhotoMediaInput(photo as MyPhoto);\n }\n }\n\n break;\n }\n\n case 'botInlineMessageMediaGeo': {\n inputMedia = {\n _: 'inputMediaGeoPoint',\n geo_point: this.getGeoInput(sendMessage.geo)\n };\n\n options.geoPoint = sendMessage.geo;\n\n break;\n }\n\n case 'botInlineMessageMediaVenue': {\n inputMedia = {\n _: 'inputMediaVenue',\n geo_point: this.getGeoInput(sendMessage.geo),\n title: sendMessage.title,\n address: sendMessage.address,\n provider: sendMessage.provider,\n venue_id: sendMessage.venue_id,\n venue_type: sendMessage.venue_type\n };\n\n options.geoPoint = sendMessage.geo;\n\n break;\n }\n\n case 'botInlineMessageMediaContact': {\n inputMedia = {\n _: 'inputMediaContact',\n phone_number: sendMessage.phone_number,\n first_name: sendMessage.first_name,\n last_name: sendMessage.last_name,\n vcard: sendMessage.vcard\n };\n\n break;\n }\n\n case 'botInlineMessageMediaInvoice': {\n // const photo = sendMessage.photo;\n // inputMedia = {\n // _: 'inputMediaInvoice',\n // description: sendMessage.description,\n // title: sendMessage.title,\n // photo: photo && {\n // _: 'inputWebDocument',\n // attributes: photo.attributes,\n // mime_type: photo.mime_type,\n // size: photo.size,\n // url: photo.url\n // },\n // invoice: undefined,\n // payload: undefined,\n // provider: undefined,\n // provider_data: undefined,\n // start_param: undefined\n // };\n\n messageMedia = {\n _: 'messageMediaInvoice',\n title: sendMessage.title,\n description: sendMessage.description,\n photo: sendMessage.photo,\n currency: sendMessage.currency,\n total_amount: sendMessage.total_amount,\n pFlags: {\n shipping_address_requested: sendMessage.pFlags.shipping_address_requested,\n test: sendMessage.pFlags.test\n },\n start_param: undefined\n };\n\n break;\n }\n }\n\n if(!inputMedia && messageMedia) {\n inputMedia = {\n _: 'messageMediaPending',\n messageMedia\n };\n }\n\n this.appMessagesManager.sendOther(peerId, inputMedia, options);\n }\n }\n\n /* function checkGeoLocationAccess (botID) {\n var key = 'bot_access_geo' + botID\n return Storage.get(key).then(function (geoAccess) {\n if (geoAccess && geoAccess.granted) {\n return true\n }\n return ErrorService.confirm({\n type: 'BOT_ACCESS_GEO_INLINE'\n }).then(function () {\n var setHash = {}\n setHash[key] = {granted: true, time: tsNow()}\n Storage.set(setHash)\n return true\n }, function () {\n var setHash = {}\n setHash[key] = {denied: true, time: tsNow()}\n Storage.set(setHash)\n return $q.reject()\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 {MESSAGE_ID_INCREMENT} from './utils/messageId';\nimport generateMessageId from './utils/messageId/generateMessageId';\n\nexport class AppMessagesIdsManager {\n private tempNum = 0;\n\n public generateTempMessageId(messageId: number) {\n const num = ++this.tempNum;\n return generateMessageId(messageId) + (num & (MESSAGE_ID_INCREMENT - 1));\n }\n}\n","export default function splitStringByLength(str: string, maxLength: number) {\n if(str.length < maxLength) return [str];\n let length = 0, lastSliceStartIndex = 0, arrayIndex = 0;\n const delimiter = ' ';// '\\n';\n const out: string[] = [];\n\n const cut = (end?: number) => {\n let part = str.slice(lastSliceStartIndex, end);\n const _arrayIndex = arrayIndex++;\n if(part.length > maxLength) {\n const overflowPart = part.slice(maxLength);\n const splitted = splitStringByLength(overflowPart, maxLength);\n splitted.forEach((part) => {\n out[arrayIndex++] = part;\n });\n\n part = part.slice(0, maxLength);\n }\n\n lastSliceStartIndex = end;\n length = 0;\n out[_arrayIndex] = (out[_arrayIndex] || '') + part;\n };\n\n let lastIndex = 0;\n do {\n let index = str.indexOf(delimiter, lastIndex);\n if(index === -1) {\n if(lastIndex !== (str.length - 1)) {\n cut();\n }\n\n break;\n }\n\n index += delimiter.length;\n\n const partLength = index - lastIndex;\n if((length + partLength) > maxLength) {\n cut(length);\n }\n\n lastIndex = index;\n length += partLength;\n } while(true);\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\nimport type {TabState} from '../mtproto/mtprotoworker';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\n\ntype Tab = {\n source: MessageEventSource,\n state: TabState\n};\n\nexport class AppTabsManager {\n private tabs: Map;\n\n constructor() {\n this.tabs = new Map();\n }\n\n public start() {\n const port = MTProtoMessagePort.getInstance();\n\n port.addEventListener('tabState', (state, source) => {\n const tab = this.tabs.get(source);\n tab.state = state;\n });\n }\n\n public getTabs() {\n return [...this.tabs.values()].filter((tab) => !!tab.state);\n }\n\n public addTab(source: MessageEventSource) {\n const tab: Tab = {\n source,\n state: undefined\n };\n\n this.tabs.set(source, tab);\n }\n\n public deleteTab(source: MessageEventSource) {\n this.tabs.delete(source);\n }\n}\n\nconst appTabsManager = new AppTabsManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appTabsManager = appTabsManager);\nexport default appTabsManager;\n","import {InputDocument} from '../../../../layer';\nimport type {MyDocument} from '../../appDocsManager';\n\nexport default function getDocumentInput(doc: MyDocument): InputDocument {\n return {\n _: 'inputDocument',\n id: doc.id,\n access_hash: doc.access_hash,\n file_reference: doc.file_reference\n };\n}\n","export default function setBooleanFlag(obj: T, key: keyof T, value: boolean) {\n // @ts-ignore\n if(value) obj[key] = true;\n else delete obj[key];\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 type {ApiFileManager} from '../mtproto/apiFileManager';\nimport type {MediaSize} from '../../helpers/mediaSize';\nimport type {Progress} from './appDownloadManager';\nimport type {VIDEO_MIME_TYPE} from '../../environment/videoMimeTypesSupport';\nimport LazyLoadQueueBase from '../../components/lazyLoadQueueBase';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport tsNow from '../../helpers/tsNow';\nimport {randomLong} from '../../helpers/random';\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, ReactionCount, MessagePeerReaction, MessagesSearchCounter, Peer, MessageReactions, Document, InputFile, Reaction, ForumTopic as MTForumTopic, MessagesForumTopics, MessagesGetReplies, MessagesGetHistory, MessagesAffectedHistory, UrlAuthResult} from '../../layer';\nimport {ArgumentTypes, InvokeApiOptions} from '../../types';\nimport {logger, LogTypes} from '../logger';\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport DialogsStorage, {GLOBAL_FOLDER_ID} from '../storages/dialogs';\nimport {ChatRights} from './appChatsManager';\nimport {MyDocument} from './appDocsManager';\nimport {MyPhoto} from './appPhotosManager';\nimport {getFileNameByLocation} from '../../helpers/fileName';\nimport DEBUG from '../../config/debug';\nimport SlicedArray, {Slice, SliceEnd} from '../../helpers/slicedArray';\nimport {FOLDER_ID_ALL, GENERAL_TOPIC_ID, MUTE_UNTIL, NULL_PEER_ID, REAL_FOLDER_ID, REPLIES_HIDDEN_CHANNEL_ID, REPLIES_PEER_ID, SERVICE_PEER_ID, THUMB_TYPE_FULL} from '../mtproto/mtproto_config';\n// import telegramMeWebManager from '../mtproto/telegramMeWebManager';\nimport {getMiddleware} from '../../helpers/middleware';\nimport assumeType from '../../helpers/assumeType';\nimport copy from '../../helpers/object/copy';\nimport getObjectKeysAndSort from '../../helpers/object/getObjectKeysAndSort';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport splitStringByLength from '../../helpers/string/splitStringByLength';\nimport debounce from '../../helpers/schedulers/debounce';\nimport {AppManager} from './manager';\nimport getPhotoMediaInput from './utils/photos/getPhotoMediaInput';\nimport getPhotoDownloadOptions from './utils/photos/getPhotoDownloadOptions';\nimport fixEmoji from '../richTextProcessor/fixEmoji';\nimport mergeEntities from '../richTextProcessor/mergeEntities';\nimport parseEntities from '../richTextProcessor/parseEntities';\nimport parseMarkdown from '../richTextProcessor/parseMarkdown';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport generateMessageId from './utils/messageId/generateMessageId';\nimport filterMessagesByInputFilter from './utils/messages/filterMessagesByInputFilter';\nimport ctx from '../../environment/ctx';\nimport {getEnvironment} from '../../environment/utils';\nimport getDialogIndex from './utils/dialogs/getDialogIndex';\nimport defineNotNumerableProperties from '../../helpers/object/defineNotNumerableProperties';\nimport getDocumentMediaInput from './utils/docs/getDocumentMediaInput';\nimport getDocumentInputFileName from './utils/docs/getDocumentInputFileName';\nimport getFileNameForUpload from '../../helpers/getFileNameForUpload';\nimport noop from '../../helpers/noop';\nimport appTabsManager from './appTabsManager';\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\nimport getAlbumText from './utils/messages/getAlbumText';\nimport pause from '../../helpers/schedulers/pause';\nimport makeError from '../../helpers/makeError';\nimport getStickerEffectThumb from './utils/stickers/getStickerEffectThumb';\nimport getDocumentInput from './utils/docs/getDocumentInput';\nimport reactionsEqual from './utils/reactions/reactionsEqual';\nimport getPeerActiveUsernames from './utils/peers/getPeerActiveUsernames';\nimport {BroadcastEvents} from '../rootScope';\nimport setBooleanFlag from '../../helpers/object/setBooleanFlag';\nimport getMessageThreadId from './utils/messages/getMessageThreadId';\n\n// console.trace('include');\n// TODO: ะตัะปะธ ัƒะดะฐะปะธั‚ัŒ ะดะธะฐะปะพะณ ะฝะฐั…ะพะดัััŒ ะฒ ะฟะฐะฟะบะต, ั‚ะพ ะพะฝ ะฝะต ัƒะดะฐะปะธั‚ัั ะธะท ะฟะฐะฟะบะธ ะธ ะฑัƒะดะตั‚ ะฒะธะดะตะฝ ะฒ ะฝะฐัั‚ั€ะพะนะบะฐั…\n\nconst APITIMEOUT = 0;\nconst DO_NOT_READ_HISTORY = false;\n\nexport type SendFileDetails = {\n file: File | Blob | MyDocument,\n} & Partial<{\n duration: number,\n width: number,\n height: number,\n objectURL: string,\n thumb: {\n blob: Blob,\n url: string,\n size: MediaSize\n },\n strippedBytes: PhotoSize.photoStrippedSize['bytes'],\n spoiler: boolean\n}>;\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: number[],\n isEnd: ReturnType['getEnds']>,\n offsetIdOffset?: number,\n};\n\nexport type Dialog = MTDialog.dialog;\nexport type ForumTopic = MTForumTopic.forumTopic;\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 & {peerId: PeerId, type: MessagesStorageType, key: MessagesStorageKey};\nexport type MessagesStorageType = 'scheduled' | 'history' | 'grouped';\nexport type MessagesStorageKey = `${PeerId}_${MessagesStorageType}`;\n\nexport type MyMessageActionType = Message.messageService['action']['_'];\n\ntype PendingAfterMsg = Partial;\n\ntype MapValueType = A extends Map ? V : never;\n\nexport type BatchUpdates = {\n 'messages_reactions': AppMessagesManager['batchUpdateReactions'],\n 'messages_views': AppMessagesManager['batchUpdateViews']\n};\n\ntype PendingMessageDetails = {\n peerId: PeerId,\n tempId: number,\n threadId: number,\n storage: MessagesStorage,\n sequential?: boolean\n};\n\nconst processAfter = (cb: () => void) => {\n // setTimeout(cb, 0);\n cb();\n};\n\nconst UPDATE_STICKERSET_ORDER = true;\n\nexport type MessageSendingParams = Partial<{\n threadId: number,\n replyToMsgId: number,\n scheduleDate: number,\n silent: boolean,\n sendAsPeerId: number,\n}>;\n\nexport class AppMessagesManager extends AppManager {\n private messagesStorageByPeerId: {[peerId: string]: MessagesStorage};\n private 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 private pinnedMessages: {[key: string]: PinnedStorage};\n\n private threadsServiceMessagesIdsStorage: {[peerId_threadId: string]: number};\n private threadsToReplies: {\n [peerId_threadId: string]: string;\n };\n\n private pendingByRandomId: {\n [randomId: string]: PendingMessageDetails\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: MyMessage) => Promise\n }>\n }\n } = {};\n\n private sendSmthLazyLoadQueue = new LazyLoadQueueBase(10);\n\n private needSingleMessages: Map>> = new Map();\n private fetchSingleMessagesPromise: Promise;\n private extendedMedia: Map>> = new Map();\n\n private maxSeenId = 0;\n\n public migratedFromTo: {[peerId: PeerId]: PeerId} = {};\n public migratedToFrom: {[peerId: PeerId]: PeerId} = {};\n\n private newDialogsHandlePromise: Promise;\n private newDialogsToHandle: Map}> = new Map();\n public newUpdatesAfterReloadToHandle: {[key: string]: Set} = {};\n\n private notificationsHandlePromise: number;\n private notificationsToHandle: {[key: string]: {\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 private groupedTempId = 0;\n\n private typings: {[key: string]: {action: SendMessageAction, timeout?: number}} = {};\n\n private middleware: ReturnType;\n\n private unreadMentions: {[key: string]: SlicedArray} = {};\n private goToNextMentionPromises: {[key: string]: Promise} = {};\n\n private batchUpdates: {\n [k in keyof BatchUpdates]?: {\n callback: BatchUpdates[k],\n batch: ArgumentTypes[0]\n }\n } = {};\n private batchUpdatesDebounced: () => Promise;\n\n private uploadFilePromises: {[fileName: string]: CancellablePromise};\n\n protected after() {\n this.clear(true);\n\n this.apiUpdatesManager.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 updateMessageReactions: this.onUpdateMessageReactions,\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 updateMessageExtendedMedia: this.onUpdateMessageExtendedMedia\n });\n\n // ! Invalidate notify settings, can optimize though\n this.rootScope.addEventListener('notify_peer_type_settings', ({key, settings}) => {\n const dialogs = this.dialogsStorage.getFolderDialogs(0).concat(this.dialogsStorage.getFolderDialogs(1));\n let filterFunc: (dialog: typeof dialogs[0]) => boolean;\n if(key === 'notifyUsers') filterFunc = (dialog) => dialog.peerId.isUser();\n else if(key === 'notifyBroadcasts') filterFunc = (dialog) => this.appPeersManager.isBroadcast(dialog.peerId);\n else filterFunc = (dialog) => this.appPeersManager.isAnyGroup(dialog.peerId);\n\n dialogs\n .filter(filterFunc)\n .forEach((dialog) => {\n this.rootScope.dispatchEvent('dialog_notify_settings', dialog);\n });\n });\n\n this.rootScope.addEventListener('webpage_updated', ({id, msgs}) => {\n msgs.forEach(({peerId, mid, isScheduled}) => {\n const storage = isScheduled ? this.getScheduledMessagesStorage(peerId) : this.getHistoryMessagesStorage(peerId);\n const message = this.getMessageFromStorage(storage, mid) as Message.message;\n if(!message) return;\n message.media = {\n _: 'messageMediaWebPage',\n webpage: this.appWebPagesManager.getCachedWebPage(id)\n };\n\n this.rootScope.dispatchEvent('message_edit', {\n storageKey: storage.key,\n peerId,\n mid,\n message\n });\n });\n });\n\n this.rootScope.addEventListener('draft_updated', ({peerId, threadId, draft}) => {\n const dialog = this.dialogsStorage.getDialogOrTopic(peerId, threadId);\n if(dialog) {\n dialog.draft = draft;\n\n let drop = false;\n if(!draft && !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 this.rootScope.dispatchEvent('dialog_draft', {\n peerId,\n dialog,\n drop,\n draft\n });\n } else if(threadId) {\n const chat = this.appChatsManager.getChat(peerId.toChatId());\n if(!chat) {\n this.reloadConversation(peerId);\n } else if((chat as Chat.channel).pFlags.forum) {\n this.dialogsStorage.getForumTopicById(peerId, threadId);\n }\n } else {\n this.reloadConversation(peerId);\n }\n });\n\n this.rootScope.addEventListener('poll_update', ({poll}) => {\n const set = this.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 if(message) {\n this.setDialogToStateIfMessageIsTop(message);\n }\n }\n }\n });\n\n // * clear forum cache\n this.rootScope.addEventListener('chat_toggle_forum', ({chatId, enabled}) => {\n const peerId = chatId.toPeerId(true);\n if(!enabled) {\n delete this.threadsStorage[peerId];\n\n for(const key in this.pinnedMessages) {\n if(+key === peerId && key.startsWith(peerId + '_')) {\n delete this.pinnedMessages[key];\n }\n }\n }\n });\n\n this.batchUpdatesDebounced = debounce(() => {\n for(const event in this.batchUpdates) {\n const details = this.batchUpdates[event as keyof BatchUpdates];\n delete this.batchUpdates[event as keyof BatchUpdates];\n\n // @ts-ignore\n const result = details.callback(details.batch);\n if(result && (!(result instanceof Array) || result.length)) {\n // @ts-ignore\n rootScope.dispatchEvent(event as keyof BatchUpdates, result);\n }\n }\n }, 33, false, true);\n\n return this.appStateManager.getState().then((state) => {\n if(state.maxSeenMsgId) {\n this.maxSeenId = state.maxSeenMsgId;\n }\n });\n }\n\n public clear = (init?: boolean) => {\n if(this.middleware) {\n this.middleware.clean();\n } else {\n this.middleware = getMiddleware();\n this.uploadFilePromises = {};\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(init);\n this.filtersStorage && this.filtersStorage.clear(init);\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 = this.appUsersManager.getUserInput(entity.user_id);\n }\n });\n return sendEntites;\n }\n\n public invokeAfterMessageIsSent(tempId: number, callbackName: string, callback: (message: MyMessage) => Promise) {\n const finalize = this.tempFinalizeCallbacks[tempId] ??= {};\n const obj = 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 const entities = options.entities || [];\n if(text) {\n text = parseMarkdown(text, entities);\n }\n\n const schedule_date = options.scheduleDate || (message.pFlags.is_scheduled ? message.date : undefined);\n return this.apiManager.invokeApi('messages.editMessage', {\n peer: this.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 this.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 async sendText(peerId: PeerId, text: string, options: MessageSendingParams & Partial<{\n entities: MessageEntity[],\n viaBotId: BotId,\n queryId: string,\n resultId: string,\n noWebPage: true,\n replyMarkup: ReplyMarkup,\n clearDraft: true,\n webPage: WebPage,\n }> = {}): Promise {\n if(!text.trim()) {\n return;\n }\n\n options.entities ??= [];\n\n // this.checkSendOptions(options);\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n const config = await this.apiManager.getConfig();\n const MAX_LENGTH = config.message_length_max;\n const splitted = splitStringByLength(text, MAX_LENGTH);\n text = splitted[0];\n if(splitted.length > 1) {\n if(options.webPage?._ === 'webPage' && !text.includes(options.webPage.url)) {\n delete options.webPage;\n }\n }\n\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n const entities = options.entities;\n if(!options.viaBotId) {\n text = parseMarkdown(text, entities);\n // entities = mergeEntities(entities, 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 ? getServerMessageId(options.replyToMsgId) : undefined;\n const isChannel = this.appPeersManager.isChannel(peerId);\n\n if(options.webPage) {\n message.media = {\n _: 'messageMediaWebPage',\n webpage: options.webPage\n };\n }\n\n const toggleError = (error?: ApiError) => {\n this.onMessagesSendError([message], error);\n this.rootScope.dispatchEvent('messages_pending');\n };\n\n message.send = () => {\n toggleError();\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n const sendAs = options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined\n let apiPromise: any;\n if(options.viaBotId) {\n apiPromise = this.apiManager.invokeApiAfter('messages.sendInlineBotResult', {\n peer: this.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 send_as: sendAs\n }, sentRequestOptions);\n } else {\n apiPromise = this.apiManager.invokeApiAfter('messages.sendMessage', {\n no_webpage: options.noWebPage,\n peer: this.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 send_as: sendAs,\n update_stickersets_order: UPDATE_STICKERSET_ORDER\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 defineNotNumerableProperties(message, ['promise']);\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\n // this.reloadConversation(peerId);\n\n // setTimeout(() => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n // }, 5000);\n message.promise.resolve();\n }, (error: ApiError) => {\n toggleError(error);\n message.promise.reject(error);\n throw 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 sequential: true\n });\n\n const promises: ReturnType[] = [message.promise];\n for(let i = 1; i < splitted.length; ++i) {\n promises.push(this.sendText(peerId, splitted[i], options));\n }\n\n return Promise.all(promises).then(noop);\n }\n\n public sendFile(peerId: PeerId, options: MessageSendingParams & SendFileDetails & Partial<{\n isRoundMessage: boolean,\n isVoiceMessage: boolean,\n isGroupedItem: boolean,\n isMedia: boolean,\n\n groupId: string,\n caption: string,\n entities: MessageEntity[],\n background: boolean,\n clearDraft: boolean,\n noSound: boolean,\n\n waveform: Uint8Array,\n\n // ! only for internal use\n processAfter?: typeof processAfter\n }>) {\n const file = options.file;\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n // this.checkSendOptions(options);\n\n const message = this.generateOutgoingMessage(peerId, options);\n const replyToMsgId = options.replyToMsgId ? 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 = parseMarkdown(caption, entities);\n }\n\n const attributes: DocumentAttribute[] = [];\n\n const isPhoto = getEnvironment().IMAGE_MIME_TYPES_SUPPORTED.has(fileType);\n\n const strippedPhotoSize: PhotoSize.photoStrippedSize = options.strippedBytes && {\n _: 'photoStrippedSize',\n bytes: options.strippedBytes,\n type: 'i'\n };\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 const attribute: DocumentAttribute.documentAttributeAudio = {\n _: 'documentAttributeAudio',\n pFlags: {\n voice: options.isVoiceMessage || undefined\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: THUMB_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 if(strippedPhotoSize) {\n photo.sizes.unshift(strippedPhotoSize);\n }\n\n const cacheContext = this.thumbsStorage.getCacheContext(photo, photoSize.type);\n cacheContext.downloaded = file.size;\n cacheContext.url = options.objectURL || '';\n\n photo = this.appPhotosManager.savePhoto(photo);\n } else if(getEnvironment().VIDEO_MIME_TYPES_SUPPORTED.has(fileType as VIDEO_MIME_TYPE)) {\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 || undefined,\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 if(options.objectURL) {\n const cacheContext = this.thumbsStorage.getCacheContext(document);\n cacheContext.downloaded = file.size;\n cacheContext.url = options.objectURL;\n }\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: THUMB_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 = this.thumbsStorage.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(strippedPhotoSize) {\n thumbs.unshift(strippedPhotoSize);\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 = this.appDocsManager.saveDoc(document);\n }\n\n this.log('sendFile', attachType, apiFileName, file.type, options);\n\n const sentDeferred = deferredPromise();\n // sentDeferred.cancel = () => {\n // const error = new Error('Download canceled');\n // error.name = 'AbortError';\n // sentDeferred.reject(error);\n\n // if(uploadPromise?.cancel) {\n // uploadPromise.cancel();\n // }\n // };\n\n const media: MessageMedia = isDocument ? undefined : {\n _: photo ? 'messageMediaPhoto' : 'messageMediaDocument',\n pFlags: {},\n // preloader,\n photo,\n document\n };\n\n if(media) {\n defineNotNumerableProperties(media as any, ['promise']);\n (media as any).promise = sentDeferred;\n\n if(options.spoiler) {\n (media as MessageMedia.messageMediaPhoto).pFlags.spoiler = true;\n }\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;\n\n const uploadingFileName = !isDocument ? getFileNameForUpload(file) : undefined;\n message.uploadingFileName = uploadingFileName;\n\n if(uploadingFileName) {\n this.uploadFilePromises[uploadingFileName] = sentDeferred;\n }\n\n const toggleError = (error?: ApiError) => {\n this.onMessagesSendError([message], error);\n this.rootScope.dispatchEvent('messages_pending');\n };\n\n let uploaded = false,\n uploadPromise: ReturnType = null;\n\n message.send = () => {\n if(isDocument) {\n const inputMedia: InputMedia = {\n _: 'inputMediaDocument',\n id: getDocumentInput(file),\n pFlags: {}\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\n uploadPromise = this.apiFileManager.upload({file, fileName: uploadingFileName});\n uploadPromise.catch((err) => {\n if(!uploaded) {\n this.log('cancelling upload', media);\n\n this.cancelPendingMessage(message.random_id);\n this.setTyping(peerId, {_: 'sendMessageCancelAction'}, undefined, options.threadId);\n sentDeferred.reject(err);\n }\n });\n\n uploadPromise.addNotifyListener((progress: Progress) => {\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}, undefined, options.threadId);\n }\n sentDeferred.notifyAll(progress);\n });\n\n sentDeferred.notifyAll({done: 0, total: file.size});\n }\n\n let thumbUploadPromise: typeof uploadPromise;\n if(attachType === 'video' && options.objectURL && options.thumb?.blob) {\n thumbUploadPromise = this.apiFileManager.upload({file: options.thumb.blob});\n }\n\n uploadPromise && uploadPromise.then(async(inputFile) => {\n /* if(DEBUG) {\n this.log('appMessagesManager: sendFile uploaded:', inputFile);\n } */\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 pFlags: {\n spoiler: options.spoiler || undefined\n }\n };\n break;\n\n default:\n inputMedia = {\n _: 'inputMediaUploadedDocument',\n file: inputFile,\n mime_type: fileType,\n pFlags: {\n force_file: actionName === 'sendMessageUploadDocumentAction' || undefined,\n spoiler: options.spoiler || 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: ApiError) => {\n toggleError(error);\n throw error;\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 processAfter: options.processAfter\n });\n\n if(!options.isGroupedItem) {\n sentDeferred.then((inputMedia) => {\n this.setTyping(peerId, {_: 'sendMessageCancelAction'}, undefined, options.threadId);\n\n return this.apiManager.invokeApi('messages.sendMedia', {\n background: options.background,\n peer: this.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 send_as: options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n }, (error: ApiError) => {\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(error);\n throw error;\n });\n });\n\n sentDeferred.then(message.promise.resolve, message.promise.reject);\n }\n\n const ret: {\n message: typeof message,\n promise: typeof sentDeferred\n } = {\n message\n } as any;\n\n defineNotNumerableProperties(ret, ['promise']);\n ret.promise = sentDeferred;\n\n return ret;\n }\n\n public async sendAlbum(peerId: PeerId, options: MessageSendingParams & {\n isMedia?: boolean,\n entities?: MessageEntity[],\n caption?: string,\n sendFileDetails: SendFileDetails[],\n clearDraft?: boolean\n }) {\n // this.checkSendOptions(options);\n\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n if(options.sendFileDetails.length === 1) {\n return this.sendFile(peerId, {...options, ...options.sendFileDetails[0]});\n }\n\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\n const replyToMsgId = options.replyToMsgId ? getServerMessageId(options.replyToMsgId) : undefined;\n\n let caption = options.caption || '';\n let entities = options.entities || [];\n if(caption) {\n caption = parseMarkdown(caption, entities);\n }\n\n this.log('sendAlbum', options);\n\n const groupId = '' + ++this.groupedTempId;\n\n const callbacks: Array<() => void> = [];\n const processAfter = (cb: () => void) => {\n callbacks.push(cb);\n };\n\n const messages = options.sendFileDetails.map((details, idx) => {\n const o: Parameters[1] = {\n isGroupedItem: true,\n isMedia: options.isMedia,\n scheduleDate: options.scheduleDate,\n silent: options.silent,\n replyToMsgId,\n threadId: options.threadId,\n sendAsPeerId: options.sendAsPeerId,\n groupId,\n processAfter,\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, o).message;\n });\n\n if(options.clearDraft) {\n callbacks.push(() => {\n this.appDraftsManager.clearDraft(peerId, options.threadId);\n });\n }\n\n callbacks.forEach((callback) => {\n callback();\n });\n\n // * test pending\n // return;\n\n const toggleError = (message: Message.message, error?: ApiError) => {\n this.onMessagesSendError([message], error);\n this.rootScope.dispatchEvent('messages_pending');\n };\n\n const inputPeer = this.appPeersManager.getInputPeerById(peerId);\n const invoke = (multiMedia: InputSingleMedia[]) => {\n this.setTyping(peerId, {_: 'sendMessageCancelAction'}, undefined, options.threadId);\n\n const deferred = deferredPromise();\n this.sendSmthLazyLoadQueue.push({\n load: () => {\n return this.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 send_as: options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined,\n update_stickersets_order: UPDATE_STICKERSET_ORDER\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n deferred.resolve();\n }, (error: ApiError) => {\n messages.forEach((message) => toggleError(message, error));\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 Promise.all([\n inputMedia,\n this.apiManager.invokeApi('messages.uploadMedia', {\n peer: inputPeer,\n media: inputMedia\n })\n ]);\n })\n .then(([originalInputMedia, messageMedia]) => {\n let inputMedia: InputMedia;\n if(messageMedia._ === 'messageMediaPhoto') {\n const photo = this.appPhotosManager.savePhoto(messageMedia.photo);\n inputMedia = getPhotoMediaInput(photo);\n } else if(messageMedia._ === 'messageMediaDocument') {\n const doc = this.appDocsManager.saveDoc(messageMedia.document);\n inputMedia = getDocumentMediaInput(doc);\n }\n\n // copy original flags\n const copyProperties: (keyof InputMedia.inputMediaPhoto)[] = [\n 'pFlags',\n 'ttl_seconds'\n ];\n\n copyProperties.forEach((property) => {\n // @ts-ignore\n inputMedia[property] = originalInputMedia[property] ?? inputMedia[property];\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: ApiError) => {\n this.log.error('sendAlbum upload item error:', err, message);\n toggleError(message, err);\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, this.appUsersManager.getContactMediaInput(contactPeerId));\n }\n\n public sendOther(\n peerId: PeerId,\n inputMedia: InputMedia | {_: 'messageMediaPending', messageMedia: MessageMedia},\n options: MessageSendingParams & Partial<{\n viaBotId: BotId,\n replyMarkup: ReplyMarkup,\n clearDraft: true,\n queryId: string\n resultId: string,\n geoPoint: GeoPoint\n }> = {}\n ) {\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n // this.checkSendOptions(options);\n const message = this.generateOutgoingMessage(peerId, options);\n const replyToMsgId = options.replyToMsgId ? 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 this.appPollsManager.savePoll(inputMedia.poll, {\n _: 'pollResults',\n flags: 4,\n total_voters: 0,\n pFlags: {},\n recent_voters: []\n });\n\n const {poll, results} = this.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: this.appPhotosManager.getPhoto((inputMedia.id as InputPhoto.inputPhoto).id),\n pFlags: {}\n };\n break;\n }\n\n case 'inputMediaDocument': {\n const doc = this.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 pFlags: {}\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 case 'messageMediaPending': {\n media = (inputMedia as any).messageMedia;\n break;\n }\n }\n\n message.media = media;\n\n const toggleError = (error?: ApiError) => {\n this.onMessagesSendError([message], error);\n this.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 const sendAs = options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined;\n let apiPromise: Promise;\n if(options.viaBotId) {\n apiPromise = this.apiManager.invokeApiAfter('messages.sendInlineBotResult', {\n peer: this.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 send_as: sendAs\n }, sentRequestOptions);\n } else {\n apiPromise = this.apiManager.invokeApiAfter('messages.sendMedia', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n media: inputMedia as 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 send_as: sendAs,\n update_stickersets_order: UPDATE_STICKERSET_ORDER\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 this.apiUpdatesManager.processUpdateMessage(updates);\n }, (error: ApiError) => {\n toggleError(error);\n throw 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 sequential: true\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: Pick & Partial<{\n isGroupedItem: boolean,\n isScheduled: boolean,\n clearDraft: boolean,\n sequential: boolean,\n processAfter?: (cb: () => void) => void\n }> = {}) {\n const messageId = message.id;\n const peerId = this.getMessagePeer(message);\n const storage = options.isScheduled ? this.getScheduledMessagesStorage(peerId) : this.getHistoryMessagesStorage(peerId);\n message.storageKey = storage.key;\n const callbacks: Array<() => void> = [];\n if(options.isScheduled) {\n // if(!options.isGroupedItem) {\n this.saveMessages([message], {storage, isScheduled: true, isOutgoing: true});\n callbacks.push(() => {\n this.rootScope.dispatchEvent('scheduled_new', message);\n });\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 this.saveMessages([message], {storage, isOutgoing: true});\n this.setDialogTopMessage(message);\n\n if(options.threadId) {\n const forumTopic = this.dialogsStorage.getForumTopic(peerId, options.threadId);\n if(forumTopic) {\n this.setDialogTopMessage(message, forumTopic);\n }\n }\n\n callbacks.push(() => {\n this.rootScope.dispatchEvent('history_append', {storageKey: storage.key, message});\n });\n }\n\n const pending: PendingMessageDetails = this.pendingByRandomId[message.random_id] = {\n peerId,\n tempId: messageId,\n threadId: options.threadId,\n storage,\n sequential: options.sequential\n };\n\n this.pendingTopMsgs[peerId] = messageId;\n\n if(!options.isGroupedItem && message.send) {\n callbacks.push(() => {\n if(options.clearDraft) {\n this.appDraftsManager.clearDraft(peerId, options.threadId);\n }\n\n message.send();\n });\n }\n\n if(callbacks.length) {\n (options.processAfter || processAfter)(() => {\n for(const callback of callbacks) {\n callback();\n }\n });\n }\n\n return pending;\n }\n\n private generateOutgoingMessage(peerId: PeerId, options: MessageSendingParams & Partial<{\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 = this.appPeersManager.isBroadcast(peerId);\n if(isBroadcast) {\n const chat = this.appPeersManager.getPeer(peerId) as Chat.channel;\n if(chat.pFlags.signatures) {\n const user = this.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: options.sendAsPeerId ? this.appPeersManager.getOutputPeer(options.sendAsPeerId) : this.generateFromId(peerId),\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n post_author: postAuthor,\n pFlags: this.generateFlags(peerId),\n date: options.scheduleDate || (tsNow(true) + this.timeManager.getServerTimeOffset()),\n message: '',\n grouped_id: options.groupId,\n random_id: randomLong(),\n reply_to: this.generateReplyHeader(peerId, 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 };\n\n defineNotNumerableProperties(message, ['send', 'promise']);\n if(options.groupId === undefined) {\n message.promise = deferredPromise();\n }\n\n return message;\n }\n\n private generateReplyHeader(peerId: PeerId, replyToMsgId: number, replyToTopId?: number) {\n const isForum = this.appPeersManager.isForum(peerId);\n if(isForum && !replyToTopId) {\n const originalMessage = this.getMessageByPeer(peerId, replyToMsgId);\n if(originalMessage) {\n replyToTopId = getMessageThreadId(originalMessage, true);\n }\n }\n\n const header: MessageReplyHeader = {\n _: 'messageReplyHeader',\n reply_to_msg_id: replyToMsgId || replyToTopId,\n pFlags: {}\n };\n\n if(replyToTopId && isForum && GENERAL_TOPIC_ID !== replyToTopId) {\n header.pFlags.forum_topic = true;\n }\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(this.appPeersManager.isBroadcast(peerId)) {\n const channelFull = this.appProfileManager.getCachedFullChat(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(this.appPeersManager.isAnyChat(peerId) && (this.appPeersManager.isBroadcast(peerId) || this.isAnonymousSending(peerId))) {\n return undefined;\n } else {\n return this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId());\n }\n }\n\n private generateFlags(peerId: PeerId) {\n const pFlags: Message.message['pFlags'] = {};\n const fromId = this.appUsersManager.getSelf().id;\n if(peerId !== fromId) {\n pFlags.out = true;\n\n if(!this.appPeersManager.isChannel(peerId) && !this.appUsersManager.isBot(peerId)) {\n pFlags.unread = true;\n }\n }\n\n if(this.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 = this.appUsersManager.getSelf().id.toPeerId();\n const fromId = originalMessage.fromId;\n if(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 pFlags: {}\n };\n\n let isUserHidden = false;\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.post_author = originalMessage.post_author;\n\n if(fromId.isUser()) {\n const userFull = this.appProfileManager.getCachedFullUser(fromId.toUserId());\n if(userFull?.private_forward_name) {\n fwdHeader.from_name = userFull.private_forward_name;\n isUserHidden = true;\n }\n }\n\n if(!isUserHidden) {\n fwdHeader.from_id = this.appPeersManager.getOutputPeer(fromId);\n }\n }\n\n if(this.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 if(peerId === myId && !isUserHidden) {\n fwdHeader.saved_from_msg_id = originalMessage.id;\n fwdHeader.saved_from_peer = this.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: Message.messageService = {\n _: 'messageService',\n pFlags: {},\n action: {\n _: 'messageActionChannelEditPhoto',\n photo\n },\n id: maxId,\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n mid: maxId,\n peerId,\n date: (photo as Photo.photo).date,\n fromId: peerId\n };\n\n this.getHistoryMessagesStorage(peerId).set(maxId, message);\n return message;\n }\n\n public getUploadPromise(uploadFileName: string) {\n return this.uploadFilePromises[uploadFileName];\n }\n\n public isAnonymousSending(peerId: PeerId): boolean {\n if(!peerId.isAnyChat()) {\n return false;\n }\n\n const chat = this.appPeersManager.getPeer(peerId);\n return (chat as Chat.channel).admin_rights?.pFlags?.anonymous;\n }\n\n public setDialogTopMessage(\n message: MyMessage,\n dialog: MTDialog.dialog | ForumTopic = this.getDialogOnly(message.peerId)\n ) {\n if(!dialog) {\n return;\n }\n\n dialog.top_message = message.mid;\n\n const historyStorage = this.getHistoryStorage(message.peerId, dialog._ === 'forumTopic' ? dialog.id : undefined);\n historyStorage.maxId = message.mid;\n\n this.dialogsStorage.generateIndexForDialog(dialog, false, message);\n\n this.scheduleHandleNewDialogs(message.peerId, dialog);\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 this.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 = getPeerId(dialog.peer);\n const mid = 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(folderId = GLOBAL_FOLDER_ID): Promise {\n const middleware = this.middleware.get();\n while(!this.dialogsStorage.isDialogsLoaded(folderId)) {\n const result = await this.getTopMessages({limit: 100, folderId});\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 getReadMaxIdIfUnread(peerId: PeerId, threadId?: number) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n if(threadId && !this.appChatsManager.isForum(peerId.toChatId())) {\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 // readMaxId can be 4294967295 (0)\n return !message?.pFlags?.out && readMaxId < historyStorage.maxId && getServerMessageId(readMaxId) ? readMaxId : 0;\n }\n }\n\n // public lolSet = new Set();\n public getTopMessages({limit, folderId}: {\n limit: number,\n folderId: number\n }) {\n // const dialogs = this.dialogsStorage.getFolder(folderId);\n const offsetId = 0;\n let offsetPeerId: PeerId;\n let offsetIndex = 0;\n\n let offsetDate = this.dialogsStorage.getOffsetDate(folderId);\n if(offsetDate) {\n offsetIndex = offsetDate * 0x10000;\n offsetDate += this.timeManager.getServerTimeOffset();\n }\n\n const useLimit = 100;\n const middleware = this.middleware.get();\n const peerId = this.dialogsStorage.isFilterIdForForum(folderId) ? folderId : undefined;\n\n const processResult = (result: MessagesDialogs | MessagesForumTopics) => {\n if(!middleware() || result._ === 'messages.dialogsNotModified') return null;\n\n if(DEBUG) {\n this.log('messages.getDialogs result:', result);\n }\n\n // can reset pinned order here\n if(!peerId && !offsetId && !offsetDate && !offsetPeerId && folderId !== GLOBAL_FOLDER_ID) {\n this.dialogsStorage.resetPinnedOrder(folderId);\n }\n\n if(!peerId && !offsetDate) {\n // telegramMeWebManager.setAuthorized(true);\n this.appDraftsManager.addMissedDialogs();\n }\n\n this.appUsersManager.saveApiUsers(result.users);\n this.appChatsManager.saveApiChats(result.chats);\n this.saveMessages(result.messages);\n\n let maxSeenIdIncremented = offsetDate ? true : false;\n let hasPrepend = false;\n const noIdsDialogs: BroadcastEvents['dialogs_multiupdate'] = new Map();\n const setFolderId: REAL_FOLDER_ID = folderId === GLOBAL_FOLDER_ID ? FOLDER_ID_ALL : folderId as REAL_FOLDER_ID;\n const saveGlobalOffset = !!peerId || folderId === GLOBAL_FOLDER_ID;\n const items: Array =\n (result as MessagesDialogs.messagesDialogsSlice).dialogs as Dialog[] ||\n (result as MessagesForumTopics).topics as ForumTopic[];\n forEachReverse(items, (dialog) => {\n if(!dialog) {\n return;\n }\n\n // const d = Object.assign({}, dialog);\n // ! ะฝัƒะถะฝะพ ะฟะตั€ะตะดะฐะฒะฐั‚ัŒ folderId, ั‚ะฐะบ ะบะฐะบ ะฟะพ ะฟะฐะฟะบะต !== 0 ะฝะตั‚ ัะฒะพะนัั‚ะฒะฐ folder_id\n if(!peerId) {\n (dialog as Dialog).folder_id ??= setFolderId;\n }\n\n this.dialogsStorage.saveDialog({\n dialog,\n ignoreOffsetDate: true,\n saveGlobalOffset\n });\n\n if(dialog.peerId === undefined) {\n this.log.error('bugged dialog?', dialog);\n debugger;\n return;\n }\n\n if(!maxSeenIdIncremented &&\n !this.appPeersManager.isChannel(dialog.peerId || this.appPeersManager.getPeerId(dialog.peer))) {\n this.incrementMaxSeenId(dialog.top_message);\n maxSeenIdIncremented = true;\n }\n\n // if(!folderId && !dialog.folder_id) {\n // this.lolSet.add(dialog.peerId);\n // }\n\n if(offsetIndex && getDialogIndex(dialog) > offsetIndex) {\n this.scheduleHandleNewDialogs(dialog.peerId, dialog);\n hasPrepend = true;\n }\n\n // ! ัั‚ะพ ะผะพะถะตั‚ ัะปัƒั‡ะธั‚ัŒัั, ะตัะปะธ ะทะฐะฟั€ะพั ะธะดั‘ั‚ ะฝะต ะฟะพ ะฟะฐะฟะบะต 0, ะฐ ะฟะพ 1. ะฟะพั‡ะตะผัƒ-ั‚ะพ read'ะพะฒ ะฝะตั‚\n // ! ะฒ ะธั‚ะพะณะต, ั‡ั‚ะพะฑั‹ ะฟะพะปัƒั‡ะธั‚ัŒ 1 ะดะธะฐะปะพะณ, ะดะตะปะฐะตั‚ัั ะฟะตั€ะฒั‹ะน ะทะฐะฟั€ะพั ะฟะพ ะฟะฐะฟะบะต 0, ะฟะพั‚ะพะผ ะทะฐะฟั€ะพั ะดะปั ะฐั€ั…ะธะฒะฝั‹ั… ะฟะพ ะฟะฐะฟะบะต 1, ะธ ะฟะพั‚ะพะผ ะตั‰ั‘ ะฟะตั€ะตะทะฐะณั€ัƒะทะบะฐ ะฐั€ั…ะธะฒะฝะพะณะพ ะดะธะฐะปะพะณะฐ\n if(!peerId && !getServerMessageId(dialog.read_inbox_max_id) && !getServerMessageId(dialog.read_outbox_max_id)) {\n noIdsDialogs.set(dialog.peerId, {dialog: dialog as Dialog});\n\n this.log.error('noIdsDialogs', dialog, params);\n } else if(dialog.top_message) { // * fix sending status\n const topMessage = this.getMessageByPeer(dialog.peerId, dialog.top_message);\n if(topMessage) {\n this.setMessageUnreadByDialog(topMessage, dialog);\n this.dialogsStorage.setDialogToState(dialog);\n }\n }\n });\n\n if(noIdsDialogs.size) {\n // setTimeout(() => { // test bad situation\n const peerIds = [...noIdsDialogs.keys()];\n const promises = peerIds.map((peerId) => this.reloadConversation(peerId));\n Promise.all(promises).then(() => {\n this.rootScope.dispatchEvent('dialogs_multiupdate', noIdsDialogs);\n\n for(let i = 0; i < peerIds.length; ++i) {\n const peerId = peerIds[i];\n this.rootScope.dispatchEvent('dialog_unread', {\n peerId,\n dialog: this.getDialogOnly(peerId)\n });\n }\n });\n // }, 10e3);\n }\n\n const count = (result 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 const dialog = folderDialogs[i];\n if(getServerMessageId(dialog.top_message)) {\n ++dialogsLength;\n } else {\n this.log.error('something strange with dialog', dialog);\n }\n }\n\n const isEnd = /* limit > dialogsResult.dialogs.length || */\n !count ||\n dialogsLength >= count ||\n !items.length;\n if(isEnd) {\n this.dialogsStorage.setDialogsLoaded(folderId, true);\n }\n\n if(hasPrepend) {\n this.scheduleHandleNewDialogs();\n } else {\n this.rootScope.dispatchEvent('dialogs_multiupdate', new Map());\n }\n\n const dialogs = items;\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 let promise: Promise>, params: any;\n if(peerId) {\n promise = this.apiManager.invokeApiSingleProcess({\n method: 'channels.getForumTopics',\n params: params = {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n limit: useLimit,\n offset_date: offsetDate,\n offset_id: offsetId,\n offset_topic: 0\n },\n options: {\n // timeout: APITIMEOUT,\n noErrorBox: true\n },\n processResult: (result) => {\n result = this.dialogsStorage.processTopics(peerId, result);\n return processResult(result);\n }\n });\n } else {\n // ! ะ’ะะ˜ะœะะะ˜ะ•: ะžะงะ•ะะฌ ะกะ›ะžะ–ะะะฏ ะ›ะžะ“ะ˜ะšะ:\n // ! ะตัะปะธ ะดะตะปะฐั‚ัŒ ะทะฐะฟั€ะพั ัะฝะฐั‡ะฐะปะฐ ะฟะพ ะฟะฐะฟะบะต 0, ะฟะพั‚ะพะผ ะฟะพ ะฟะฐะฟะบะต 1, ะฟะพ ะธะฝะดะตะบััƒ 0 ะฒ ะผะฐััะธะฒะต ะฑัƒะดะตั‚ ะพะดะธะฝ ะธ ั‚ะพั‚ ะถะต ะดะธะฐะปะพะณ, ั dialog.pFlags.pinned, ะ›ะžะ›???\n // ! ั‚.ะต., ั ะทะฐะฟั€ะพัะพะผ folder_id: 1, ะธ exclude_pinned: 0, ะฒ ั€ะตะทัƒะปัŒั‚ะฐั‚ะต ะฑัƒะดัƒั‚ ะตั‰ั‘ ะธ ะทะฐะบั€ะตะฟะปั‘ะฝะฝั‹ะต ั ะฟะฐะฟะบะธ 0\n promise = this.apiManager.invokeApiSingleProcess({\n method: 'messages.getDialogs',\n params: params = {\n folder_id: folderId,\n offset_date: offsetDate,\n offset_id: offsetId,\n offset_peer: this.appPeersManager.getInputPeerById(offsetPeerId),\n limit: useLimit,\n hash: '0'\n },\n options: {\n // timeout: APITIMEOUT,\n noErrorBox: true\n },\n processResult\n });\n }\n\n return promise;\n }\n\n public async forwardMessages(peerId: PeerId, fromPeerId: PeerId, mids: number[], options: MessageSendingParams & Partial<{\n withMyScore: true,\n dropAuthor: boolean,\n dropCaptions: boolean\n }> = {}) {\n delete options.replyToMsgId;\n delete options.threadId;\n\n peerId = this.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 = this.getMessageByPeer(fromPeerId, mid) as Message.message;\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 --length;\n }\n }\n\n if(!mids.length) {\n return Promise.resolve();\n }\n\n const config = await this.apiManager.getConfig();\n const overflowMids = mids.splice(config.forwarded_count_max, mids.length - config.forwarded_count_max);\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 newMids: number[] = [];\n const newMessages = mids.map((mid) => {\n const originalMessage = this.getMessageByPeer(fromPeerId, mid) as Message.message;\n const message: Message.message = this.generateOutgoingMessage(peerId, options);\n newMids.push(message.id);\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 if(message.fwd_from?.from_name && peerId === this.appPeersManager.peerId) {\n delete message.from_id;\n }\n }\n\n if(!options.dropCaptions || !originalMessage.media) {\n keys.push('message');\n }\n\n const replyToMid = originalMessage.reply_to?.reply_to_msg_id;\n const replyToMessageIdx = mids.indexOf(replyToMid);\n if(replyToMid && replyToMessageIdx !== -1) {\n const newReplyToMid = newMids[replyToMessageIdx];\n message.reply_to = {\n _: 'messageReplyHeader',\n reply_to_msg_id: newReplyToMid,\n pFlags: {}\n };\n\n /* this.invokeAfterMessageIsSent(newReplyToMid, 'reply', async(originalMessage) => {\n message.reply_to.reply_to_msg_id = originalMessage.mid;\n }); */\n }\n\n keys.forEach((key) => {\n // @ts-ignore\n message[key] = copy(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 if(document.sticker && !this.rootScope.premium) {\n const effectThumb = getStickerEffectThumb(document);\n if(effectThumb) {\n (message.media as MessageMedia.messageMediaDocument).pFlags.nopremium = true;\n }\n }\n }\n\n if(originalMessage.grouped_id) {\n const group = 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 sequential: true\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() : */this.apiManager.invokeApiAfter('messages.forwardMessages', {\n from_peer: this.appPeersManager.getInputPeerById(fromPeerId),\n id: mids.map((mid) => getServerMessageId(mid)),\n random_id: newMessages.map((message) => message.random_id),\n to_peer: this.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 send_as: options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined\n }, sentRequestOptions).then((updates) => {\n this.log('forwardMessages updates:', updates);\n this.apiUpdatesManager.processUpdateMessage(updates);\n }, (error: ApiError) => {\n this.onMessagesSendError(newMessages, error);\n throw error;\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n\n const promises: (typeof promise)[] = [promise];\n if(overflowMids.length) {\n promises.push(this.forwardMessages(peerId, fromPeerId, overflowMids, options));\n }\n\n return Promise.all(promises).then(noop);\n }\n\n public generateEmptyMessage(mid: number): Message.message | Message.messageService {\n return undefined;\n // return {\n // _: 'messageEmpty',\n // id: getServerMessageId(mid),\n // mid,\n // deleted: true,\n // pFlags: {}\n // };\n }\n\n private onMessagesSendError(messages: Message.message[], error?: ApiError) {\n messages.forEach((message) => {\n if(message.error === error) {\n return;\n }\n\n if(error) {\n message.error = error;\n this.rootScope.dispatchEvent('message_error', {storageKey: message.storageKey, tempId: message.mid, error});\n\n const dialog = this.getDialogOnly(message.peerId);\n if(dialog) {\n this.rootScope.dispatchEvent('dialog_unread', {peerId: message.peerId, dialog});\n }\n } else {\n delete message.error;\n }\n });\n }\n\n public getMessagesStorageByKey(key: MessagesStorageKey) {\n const s = key.split('_');\n const peerId: PeerId = +s[0];\n const type: MessagesStorageType = s[1] as any;\n return type === 'scheduled' ? this.getScheduledMessagesStorage(peerId) : this.getHistoryMessagesStorage(peerId);\n }\n\n public getMessageFromStorage(storage: MessagesStorage | MessagesStorageKey, mid: number) {\n if(typeof(storage) === 'string') {\n storage = this.getMessagesStorageByKey(storage);\n }\n\n return storage && storage.get(mid)/* || this.generateEmptyMessage(mid) */;\n }\n\n private createMessageStorage(peerId: PeerId, type: MessagesStorageType) {\n const storage: MessagesStorage = new Map() as any;\n storage.peerId = peerId;\n storage.type = type;\n storage.key = `${peerId}_${type}`;\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 getHistoryMessagesStorage(peerId: PeerId) {\n return this.messagesStorageByPeerId[peerId] ??= this.createMessageStorage(peerId, 'history');\n }\n\n public getMessagesStorage(key: MessagesStorageKey | MessagesStorage): MessagesStorage {\n if(typeof(key) === 'object') {\n return key;\n } else {\n return this.getMessagesStorageByKey(key);\n }\n }\n\n public getMessageById(messageId: number) {\n for(const peerId in this.messagesStorageByPeerId) {\n if(this.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.getHistoryMessagesStorage(peerId), messageId);\n }\n\n public getMessagePeer(message: any): PeerId {\n const toId = message.peer_id && this.appPeersManager.getPeerId(message.peer_id) || NULL_PEER_ID;\n\n return toId;\n }\n\n public getDialogOnly(peerId: PeerId) {\n return this.dialogsStorage.getDialogOnly(peerId);\n }\n\n public cantForwardDeleteMids(storageKey: MessagesStorageKey, mids: number[]) {\n const storage = this.getMessagesStorage(storageKey);\n let cantForward = !mids.length, cantDelete = !mids.length;\n for(const mid of mids) {\n const message = this.getMessageFromStorage(storage, mid);\n if(!cantForward) {\n cantForward = !this.canForward(message);\n }\n\n if(!cantDelete) {\n cantDelete = !this.canDeleteMessage(message);\n }\n\n if(cantForward && cantDelete) break;\n }\n\n return {cantForward, cantDelete};\n }\n\n public reloadConversationOrTopic(peerId: PeerId, threadId?: number) {\n if(threadId) {\n this.dialogsStorage.getForumTopicById(peerId, threadId);\n } else {\n this.reloadConversation(peerId);\n }\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 = this.appPeersManager.getPeerId(inputPeer);\n this.log.warn('reloadConversation', peerId);\n\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: this.appPeersManager.getInputDialogPeerById(inputPeer),\n promise\n });\n }\n\n if(this.reloadConversationsPromise) {\n return promise || this.reloadConversationsPromise;\n }\n\n this.reloadConversationsPromise = pause(0).then(() => {\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 const fullfillLeft = () => {\n for(const peerId in promises) {\n this.reloadConversationsPeers.delete(+peerId);\n promises[peerId].resolve(undefined);\n }\n };\n\n const invoke = async() => {\n for(;;) {\n const result = await this.apiManager.invokeApi('messages.getPeerDialogs', {peers: inputDialogPeers});\n const currentState = this.apiUpdatesManager.updatesState;\n const {state} = result;\n if(currentState.pts && currentState.pts !== state.pts) {\n await pause(500);\n continue;\n }\n\n return result;\n }\n };\n\n return invoke().then((result) => {\n for(const peerId in promises) {\n this.reloadConversationsPeers.delete(+peerId);\n }\n\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 }, noop).then(() => {\n fullfillLeft();\n\n this.reloadConversationsPromise = null;\n if(this.reloadConversationsPeers.size) {\n this.reloadConversation();\n }\n });\n });\n\n return promise || this.reloadConversationsPromise;\n }\n\n private doFlushHistory(peerId: PeerId, just_clear?: boolean, revoke?: boolean, threadId?: number): Promise {\n let promise: Promise;\n const processResult = (affectedHistory: MessagesAffectedHistory) => {\n this.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(peerId, just_clear, revoke, threadId);\n };\n\n if(!threadId) {\n promise = this.apiManager.invokeApiSingleProcess({\n method: 'messages.deleteHistory',\n params: {\n just_clear,\n revoke,\n peer: this.appPeersManager.getInputPeerById(peerId),\n max_id: 0\n },\n processResult\n });\n } else {\n promise = this.apiManager.invokeApiSingleProcess({\n method: 'channels.deleteTopicHistory',\n params: {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n top_msg_id: getServerMessageId(threadId)\n },\n processResult\n });\n }\n\n return promise;\n }\n\n public async flushHistory(peerId: PeerId, justClear?: boolean, revoke?: boolean, threadId?: number) {\n if(this.appPeersManager.isChannel(peerId) && !threadId) {\n const promise = this.getHistory(peerId, 0, 1);\n\n const historyResult = await promise;\n\n const channelId = peerId.toChatId();\n const maxId = historyResult.history[0] || 0;\n return this.apiManager.invokeApiSingle('channels.deleteHistory', {\n channel: this.appChatsManager.getChannelInput(channelId),\n max_id: getServerMessageId(maxId)\n }).then((bool) => {\n if(bool) {\n this.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(peerId, justClear, revoke, threadId).then(() => {\n if(!threadId) {\n this.flushStoragesByPeerId(peerId);\n }\n\n if(justClear) {\n this.rootScope.dispatchEvent('dialog_flush', {peerId, dialog: this.getDialogOnly(peerId)});\n } else {\n const key = this.getTypingKey(peerId, threadId);\n delete this.notificationsToHandle[key];\n delete this.typings[key];\n\n if(!threadId) {\n const c = this.reloadConversationsPeers.get(peerId);\n if(c) {\n this.reloadConversationsPeers.delete(peerId);\n c.promise.resolve(undefined);\n }\n }\n\n this.dialogsStorage.dropDialogOnDeletion(peerId, threadId);\n }\n });\n }\n\n private flushStoragesByPeerId(peerId: PeerId) {\n [\n this.historiesStorage,\n this.threadsStorage,\n this.searchesStorage,\n this.pendingAfterMsgs,\n this.pendingTopMsgs\n ].forEach((s) => {\n delete s[peerId];\n });\n\n for(const key in this.pinnedMessages) {\n if(+key === peerId || key.startsWith(peerId + '_')) {\n delete this.pinnedMessages[key];\n }\n }\n\n const needSingleMessages = this.needSingleMessages.get(peerId);\n if(needSingleMessages) {\n for(const [mid, promise] of needSingleMessages) {\n promise.resolve(this.generateEmptyMessage(mid));\n }\n\n needSingleMessages.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 this.dialogsStorage.flushForumTopicsCache(peerId);\n }\n\n public hidePinnedMessages(peerId: PeerId) {\n return Promise.all([\n this.appStateManager.getState(),\n this.getPinnedMessage(peerId)\n ])\n .then(([state, pinned]) => {\n state.hiddenPinnedMessages[peerId] = pinned.maxId;\n this.rootScope.dispatchEvent('peer_pinned_hidden', {peerId, maxId: pinned.maxId});\n });\n }\n\n public getPinnedMessagesKey(peerId: PeerId, threadId?: number) {\n return peerId + (threadId ? '_' + threadId : '');\n }\n\n public getPinnedMessage(peerId: PeerId, threadId?: number) {\n const p = this.pinnedMessages[this.getPinnedMessagesKey(peerId, threadId)] ??= {};\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 threadId\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 getPinnedMessagesCount(peerId: PeerId, threadId?: number) {\n return this.pinnedMessages[this.getPinnedMessagesKey(peerId, threadId)]?.count;\n }\n\n public getPinnedMessagesMaxId(peerId: PeerId, threadId?: number) {\n return this.pinnedMessages[this.getPinnedMessagesKey(peerId, threadId)]?.maxId;\n }\n\n public updatePinnedMessage(peerId: PeerId, mid: number, unpin?: boolean, silent?: boolean, pm_oneside?: boolean) {\n return this.apiManager.invokeApi('messages.updatePinnedMessage', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n unpin,\n silent,\n pm_oneside,\n id: getServerMessageId(mid)\n }).then((updates) => {\n // this.log('pinned updates:', updates);\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public unpinAllMessages(peerId: PeerId): Promise {\n return this.apiManager.invokeApiSingle('messages.unpinAllMessages', {\n peer: this.appPeersManager.getInputPeerById(peerId)\n }).then((affectedHistory) => {\n this.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.getHistoryMessagesStorage(peerId);\n storage.forEach((message) => {\n if((message as Message.message).pFlags.pinned) {\n delete (message as Message.message).pFlags.pinned;\n }\n });\n\n this.rootScope.dispatchEvent('peer_pinned_messages', {peerId, unpinAll: true});\n delete this.pinnedMessages[this.getPinnedMessagesKey(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 return getAlbumText(Array.from(group.values()) as Message.message[]);\n }\n\n public getGroupsFirstMessage(message: Message.message) {\n if(!message?.grouped_id) return message;\n\n const storage = this.groupedMessagesStorage[message.grouped_id];\n let minMid = Number.MAX_SAFE_INTEGER;\n for(const [mid, message] of storage) {\n if(message.mid < minMid) {\n minMid = message.mid;\n }\n }\n\n return this.getMessageFromStorage(storage, minMid) as Message.message;\n }\n\n public getMidsByAlbum(groupedId: string, sort: 'asc' | 'desc' = 'asc') {\n return getObjectKeysAndSort(this.groupedMessagesStorage[groupedId], sort);\n }\n\n public getMessagesByAlbum(groupedId: string) {\n const mids = this.getMidsByAlbum(groupedId, 'asc');\n const storage = this.groupedMessagesStorage[groupedId];\n return mids.map((mid) => this.getMessageFromStorage(storage, mid) as Message.message);\n }\n\n public getMidsByMessage(message: Message) {\n if(!message) return [];\n else 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: MyMessage, verify: (message: MyMessage) => boolean) {\n const out: MyMessage[] = [];\n if((message as Message.message).grouped_id) {\n const storage = this.groupedMessagesStorage[(message as Message.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 this.appMessagesIdsManager.generateTempMessageId(dialog?.top_message || 0);\n }\n\n public setMessageUnreadByDialog(message: MyMessage, dialog: Dialog | ForumTopic = this.getDialogOnly(message.peerId)) {\n if(dialog && message.mid) {\n if(message.mid > dialog[message.pFlags.out ?\n 'read_outbox_max_id' :\n 'read_inbox_max_id']) {\n message.pFlags.unread = true;\n }\n }\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 || message._ === 'messageEmpty') {\n return;\n }\n\n message.pFlags ??= {};\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.getHistoryMessagesStorage(peerId);\n const isChannel = message.peer_id._ === 'peerChannel';\n const isBroadcast = isChannel && this.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 = 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.createMessageStorage(peerId, 'grouped');\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 // this.log(dT(), 'msg unread', mid, apiMessage.pFlags.out, dialog && dialog[apiMessage.pFlags.out ? 'read_outbox_max_id' : 'read_inbox_max_id'])\n\n const replyTo = message.reply_to;\n if(replyTo) {\n if(replyTo.reply_to_msg_id) {\n replyTo.reply_to_msg_id = message.reply_to_mid = generateMessageId(replyTo.reply_to_msg_id);\n }\n\n if(replyTo.reply_to_top_id) {\n replyTo.reply_to_top_id = generateMessageId(replyTo.reply_to_top_id);\n }\n }\n\n const replies = isMessage && message.replies;\n if(replies) {\n if(replies.max_id) replies.max_id = generateMessageId(replies.max_id);\n if(replies.read_max_id) replies.read_max_id = generateMessageId(replies.read_max_id);\n }\n\n const overwriting = !!peerId;\n if(!overwriting) {\n message.date -= this.timeManager.getServerTimeOffset();\n }\n\n // storage.generateIndex(message);\n const myId = this.appPeersManager.peerId;\n\n const fwdHeader = isMessage && (message as Message.message).fwd_from;\n\n message.peerId = peerId;\n if(peerId === myId/* && !message.from_id && !message.fwd_from */) {\n message.fromId = fwdHeader ? (fwdHeader.from_id ? this.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 : this.appPeersManager.getPeerId(message.from_id);\n }\n\n this.setMessageUnreadByDialog(message);\n\n if(fwdHeader) {\n // if(peerId === myID) {\n if(fwdHeader.saved_from_msg_id) fwdHeader.saved_from_msg_id = generateMessageId(fwdHeader.saved_from_msg_id);\n if(fwdHeader.channel_post) fwdHeader.channel_post = 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 = this.appPeersManager.getPeerId(peer);\n const savedFromMid = 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 = this.appPeersManager.getPeerId(fwdHeader.from_id);\n\n if(!overwriting) {\n fwdHeader.date -= this.timeManager.getServerTimeOffset();\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 let unsupported = false;\n const media = isMessage && message.media;\n if(media) {\n switch(media._) {\n case 'messageMediaEmpty': {\n delete message.media;\n break;\n }\n\n case 'messageMediaPhoto': {\n if(media.ttl_seconds) {\n unsupported = true;\n } else {\n media.photo = this.appPhotosManager.savePhoto(media.photo, mediaContext);\n }\n\n if(!(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 = this.appPollsManager.savePoll(media.poll, media.results, message);\n media.poll = result.poll;\n media.results = result.results;\n break;\n }\n\n case 'messageMediaDocument': {\n if(media.ttl_seconds) {\n unsupported = true;\n } else {\n const originalDoc = media.document;\n media.document = this.appDocsManager.saveDoc(originalDoc, mediaContext); // 11.04.2020 warning\n\n if(!media.document && originalDoc._ !== 'documentEmpty') {\n unsupported = true;\n }\n }\n\n break;\n }\n\n case 'messageMediaWebPage': {\n const messageKey = this.appWebPagesManager.getMessageKeyForPendingWebPage(peerId, mid, options.isScheduled);\n media.webpage = this.appWebPagesManager.saveWebPage(media.webpage, messageKey, mediaContext);\n\n if(!media.webpage) {\n delete message.media;\n }\n\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 media.photo = this.appWebDocsManager.saveWebDocument(media.photo);\n const extendedMedia = media.extended_media;\n if(extendedMedia?._ === 'messageExtendedMedia') {\n const extendedMediaMedia = extendedMedia.media;\n (extendedMediaMedia as MessageMedia.messageMediaPhoto).photo = this.appPhotosManager.savePhoto((extendedMediaMedia as MessageMedia.messageMediaPhoto).photo, mediaContext);\n (extendedMediaMedia as MessageMedia.messageMediaDocument).document = this.appDocsManager.saveDoc((extendedMediaMedia as MessageMedia.messageMediaDocument).document, mediaContext);\n }\n break;\n }\n\n case 'messageMediaUnsupported': {\n unsupported = true;\n break;\n }\n }\n }\n\n // if(isMessage && !unsupported && message.entities) {\n // unsupported = message.entities.some((entity) => entity._ === 'messageEntityCustomEmoji');\n // }\n\n if(isMessage && unsupported) {\n message.media = {_: 'messageMediaUnsupported'};\n message.message = '';\n delete message.entities;\n delete message.totalEntities;\n }\n\n if(!isMessage && message.action) {\n const action = message.action as MessageAction;\n const suffix = message.fromId === this.appUsersManager.getSelf().id ? 'You' : '';\n let migrateFrom: PeerId, migrateTo: PeerId;\n\n if((action as MessageAction.messageActionChatEditPhoto).photo) {\n (action as MessageAction.messageActionChatEditPhoto).photo = this.appPhotosManager.savePhoto((action as MessageAction.messageActionChatEditPhoto).photo, mediaContext);\n }\n\n if((action as any).document) {\n (action as any).document = this.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 this.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 return 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 }> = {}): (Message.message | Message.messageService)[] {\n if((messages as any).saved) return messages;\n (messages as any).saved = true;\n messages.forEach((message, idx, arr) => {\n arr[idx] = this.saveMessage(message, options);\n });\n\n return messages;\n }\n\n public async getFirstMessageToEdit(peerId: PeerId, threadId?: number) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const slice = historyStorage.history.slice;\n if(slice.isEnd(SliceEnd.Bottom) && slice.length) {\n let goodMessage: Message.message | Message.messageService;\n const myPeerId = this.appPeersManager.peerId;\n for(const mid of slice) {\n const message = this.getMessageByPeer(peerId, mid);\n const good = myPeerId === peerId ? message.fromId === myPeerId : message.pFlags.out;\n\n if(good) {\n if(await this.canEditMessage(message, 'text')) {\n goodMessage = message;\n break;\n }\n\n // * this check will allow editing only last message\n // break;\n }\n }\n\n return goodMessage;\n }\n }\n\n private wrapMessageEntities(message: Message.message) {\n const apiEntities = message.entities ? message.entities.slice() : [];\n message.message = fixEmoji(message.message, apiEntities);\n\n const myEntities = parseEntities(message.message);\n message.totalEntities = mergeEntities(apiEntities, myEntities); // ! only in this order, otherwise bold and emoji formatting won't work\n }\n\n public reportMessages(peerId: PeerId, mids: number[], reason: ReportReason['_'], message?: string) {\n return this.apiManager.invokeApiSingle('messages.report', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: mids.map((mid) => 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 this.apiManager.invokeApi('messages.startBot', {\n bot: this.appUsersManager.getUserInput(botId),\n peer: this.appPeersManager.getInputPeerById(peerId),\n random_id: randomId,\n start_param: startParam\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n const str = '/start';\n if(chatId) {\n let promise: Promise;\n if(this.appChatsManager.isChannel(chatId)) {\n promise = this.appChatsManager.inviteToChannel(chatId, [botId]);\n } else {\n promise = this.appChatsManager.addChatUser(chatId, botId, 0);\n }\n\n return promise.catch((error: ApiError) => {\n if(error?.type == 'USER_ALREADY_PARTICIPANT') {\n error.handled = true;\n return;\n }\n\n throw error;\n }).then(() => {\n return this.sendText(peerId, str + '@' + this.appPeersManager.getPeerUsername(botId.toPeerId()));\n });\n }\n\n return this.sendText(peerId, str);\n }\n\n public editPeerFolders(peerIds: PeerId[], folderId: number) {\n this.apiManager.invokeApi('folders.editPeerFolders', {\n folder_peers: peerIds.map((peerId) => {\n return {\n _: 'inputFolderPeer',\n peer: this.appPeersManager.getInputPeerById(peerId),\n folder_id: folderId\n };\n })\n }).then((updates) => {\n // this.log('editPeerFolders updates:', updates);\n this.apiUpdatesManager.processUpdateMessage(updates); // WARNING! ะฒะพะทะผะพะถะฝะพ ั‚ัƒั‚ ะฝัƒะถะฝะพ ะดะพะฑะฐะฒะปัั‚ัŒ channelId, ะธ ะฒั‹ะทั‹ะฒะฐั‚ัŒ ะฐะฟะดะตะนั‚ ะดะปั ะบะฐะถะดะพะณะพ ะบะฐะฝะฐะปะฐ ะพั‚ะดะตะปัŒะฝะพ\n });\n }\n\n public getFilter(filterId: number) {\n return this.filtersStorage.getFilter(filterId);\n }\n\n public async toggleDialogPin(options: {\n peerId: PeerId,\n filterId?: number,\n topicId?: number\n }) {\n const {peerId, topicId, filterId = topicId ? peerId : undefined} = options;\n if(filterId === undefined) {\n throw new Error('No filterId');\n }\n\n if(filterId > 1) {\n return this.filtersStorage.toggleDialogPin(peerId, filterId);\n }\n\n const dialog = this.dialogsStorage.getDialogOrTopic(peerId, topicId);\n if(!dialog) throw undefined;\n\n const pinned = dialog.pFlags?.pinned ? undefined : true;\n\n if(pinned) {\n const max = await this.apiManager.getLimit(topicId ? 'topicPin' : (filterId === 1 ? 'folderPin' : 'pin'));\n if(this.dialogsStorage.getPinnedOrders(filterId).length >= max) {\n throw makeError(topicId ? 'PINNED_TOO_MUCH' : 'PINNED_DIALOGS_TOO_MUCH');\n }\n }\n\n if(topicId) {\n return this.appChatsManager.updatePinnedForumTopic(peerId.toChatId(), topicId, pinned);\n }\n\n return this.apiManager.invokeApi('messages.toggleDialogPin', {\n peer: this.appPeersManager.getInputDialogPeerById(peerId),\n pinned\n }).then((bool) => {\n const pFlags: Update.updateDialogPinned['pFlags'] = pinned ? {pinned} : {};\n this.apiUpdatesManager.saveUpdate({\n _: 'updateDialogPinned',\n peer: this.appPeersManager.getDialogPeer(peerId),\n folder_id: filterId,\n pFlags\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 this.apiManager.invokeApi('messages.markDialogUnread', {\n peer: this.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: this.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 this.appChatsManager.hasChat(migrateTo.toChatId())) {\n const fromChat = this.appChatsManager.getChat(migrateFrom.toChatId()) as Chat.chat;\n if(fromChat?.migrated_to && (fromChat.migrated_to as InputChannel.inputChannel).channel_id === migrateTo.toChatId()) {\n this.migratedFromTo[migrateFrom] = migrateTo;\n this.migratedToFrom[migrateTo] = migrateFrom;\n\n this.rootScope.dispatchEvent('dialog_migrate', {migrateFrom, migrateTo});\n\n this.dialogsStorage.dropDialogWithEvent(migrateFrom);\n }\n }\n }\n\n private canMessageBeEdited(message: Message, kind: 'text' | 'poll') {\n if((message as Message.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 ||\n 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 && this.appUsersManager.isBot(message.fromId)) {\n return false;\n }\n\n if(message.media?._ === 'messageMediaDocument' &&\n ((message.media.document as Document.document).sticker || (message.media.document as Document.document).type === 'round')) {\n return false;\n }\n\n return true;\n }\n\n public async 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) === this.appUsersManager.getSelf().id) {\n return true;\n }\n\n const canEditMessageInPeer = this.appPeersManager.isBroadcast(message.peerId) ?\n this.appChatsManager.hasRights(message.peerId.toChatId(), 'edit_messages') :\n message.pFlags.out;\n\n if(\n !canEditMessageInPeer || (\n message.peer_id._ !== 'peerChannel' &&\n message.date < (tsNow(true) - (await this.apiManager.getConfig()).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.pFlags.out ||\n this.appChatsManager.getChat(message.peerId.toChatId())._ === 'chat' ||\n this.appChatsManager.hasRights(message.peerId.toChatId(), 'delete_messages')\n ) && (!message.pFlags.is_outgoing || !!message.error);\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 if(!message) {\n return false;\n }\n\n const 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 = this.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 this.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(\n peerId: PeerId,\n filters: MessagesFilter[],\n canCache = true,\n threadId?: number\n ): Promise {\n if(this.appPeersManager.isPeerRestricted(peerId)) {\n return Promise.resolve(filters.map((filter) => {\n return {\n _: 'messages.searchCounter',\n pFlags: {},\n filter: filter,\n count: 0\n };\n }));\n }\n\n const func = (canCache ? this.apiManager.invokeApiCacheable : this.apiManager.invokeApi).bind(this.apiManager);\n return func('messages.getSearchCounters', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n filters,\n top_msg_id: threadId ? getServerMessageId(threadId) : undefined\n });\n }\n\n public filterMessagesByInputFilterFromStorage(inputFilter: MyInputMessagesFilter, history: number[], storage: MessagesStorage | MessagesStorageKey, limit: number) {\n const _storage = this.getMessagesStorage(storage);\n return filterMessagesByInputFilter(inputFilter, history.map((mid) => _storage.get(mid)), limit);\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(this.appPeersManager.isPeerRestricted(peerId)/* || true */) {\n return Promise.resolve({\n count: 0,\n offset_id_offset: 0,\n next_rate: undefined,\n history: []\n });\n }\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.filterMessagesByInputFilterFromStorage(inputFilter._, storage.history.slice, this.getHistoryMessagesStorage(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 ? this.apiManager.invokeApiCacheable : this.apiManager.invokeApi).bind(this.apiManager);\n\n let apiPromise: Promise;\n if(peerId && !nextRate && folderId === undefined/* || !query */) {\n apiPromise = method('messages.search', {\n peer: this.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: getServerMessageId(maxId) || 0,\n add_offset: backLimit ? -backLimit : 0,\n max_id: 0,\n min_id: 0,\n hash: '',\n top_msg_id: 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 const offsetMessage = maxId && this.getMessageByPeer(peerId, maxId);\n\n if(offsetMessage && offsetMessage.date) {\n // offsetDate = offsetMessage.date + timeManager.getServerTimeOffset();\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: this.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 this.appUsersManager.saveApiUsers(searchResult.users);\n this.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 = this.appChatsManager.getChat(peerId.toChatId()) as Chat.chat;\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 = getServerMessageId(Math.max(...this.getMidsByMessage(message)));\n const serviceStartMessage: Message.messageService = {\n _: 'messageService',\n pFlags: {\n is_single: true\n },\n id: this.appMessagesIdsManager.generateTempMessageId(maxMessageId),\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.peerId, message.id)\n };\n\n this.saveMessages([serviceStartMessage], {isOutgoing: true});\n this.threadsServiceMessagesIdsStorage[threadKey] = serviceStartMessage.mid;\n }\n\n public getThreadServiceMessageId(peerId: PeerId, threadId: number) {\n return this.threadsServiceMessagesIdsStorage[peerId + '_' + threadId];\n }\n\n public getDiscussionMessage(peerId: PeerId, mid: number) {\n return this.apiManager.invokeApiSingle('messages.getDiscussionMessage', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(mid)\n }).then((result) => {\n this.appChatsManager.saveApiChats(result.chats);\n this.appUsersManager.saveApiUsers(result.users);\n this.saveMessages(result.messages);\n\n const message = this.getMessageWithReplies(result.messages[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 const newMaxId = result.max_id = generateMessageId(result.max_id) || 0;\n result.read_inbox_max_id = historyStorage.readMaxId = generateMessageId(result.read_inbox_max_id ?? message.mid);\n result.read_outbox_max_id = historyStorage.readOutboxMaxId = generateMessageId(result.read_outbox_max_id) || 0;\n\n const first = historyStorage.history.first;\n if(historyStorage.maxId && historyStorage.maxId < newMaxId && first.isEnd(SliceEnd.Bottom)) {\n first.unsetEnd(SliceEnd.Bottom);\n }\n historyStorage.maxId = newMaxId;\n\n this.threadsToReplies[threadKey] = peerId + '_' + mid;\n\n return message;\n });\n }\n\n private handleNewMessage(message: MyMessage) {\n this.rootScope.dispatchEvent('history_multiappend', message);\n }\n\n private handleNewDialogs = () => {\n let newMaxSeenId = 0;\n const updateMap: BroadcastEvents['dialogs_multiupdate']= new Map();\n\n const processDialog = (dialog: MTDialog.dialog | ForumTopic) => {\n const {peerId} = dialog;\n this.dialogsStorage.pushDialog({dialog});\n if(!this.appPeersManager.isChannel(peerId)) {\n newMaxSeenId = Math.max(newMaxSeenId, dialog.top_message || 0);\n }\n\n let cache = updateMap.get(peerId);\n if(!cache) {\n updateMap.set(peerId, cache = {});\n }\n\n if(dialog._ === 'forumTopic') {\n (cache.topics ??= new Map()).set(dialog.id, dialog);\n } else {\n cache.dialog = dialog;\n }\n };\n\n for(const [peerId, obj] of this.newDialogsToHandle) {\n const isDialogDefined = 'dialog' in obj;\n const {dialog, topics} = obj;\n\n if(isDialogDefined) {\n if(!dialog) {\n this.reloadConversation(peerId.toPeerId());\n } else if(this.dialogsStorage.getDialogOnly(peerId)) { // * can be already dropped\n processDialog(dialog);\n }\n }\n\n if(topics) {\n topics?.forEach((topic, id) => {\n if(!topic) {\n this.dialogsStorage.getForumTopicById(peerId, id);\n } else if(this.dialogsStorage.getForumTopic(peerId, id)) { // * can be already dropped\n processDialog(topic);\n }\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 this.rootScope.dispatchEvent('dialogs_multiupdate', updateMap);\n this.newDialogsToHandle.clear();\n };\n\n public scheduleHandleNewDialogs(peerId?: PeerId, dialog?: Dialog | ForumTopic | ForumTopic['id']) {\n if(peerId !== undefined) {\n let obj = this.newDialogsToHandle.get(peerId);\n if(!obj) {\n this.newDialogsToHandle.set(peerId, obj = {});\n }\n\n const isObject = typeof(dialog) === 'object';\n if(!dialog || (isObject && dialog._ === 'dialog')) {\n obj.dialog = dialog as Dialog;\n } else {\n obj.topics ??= new Map();\n if(isObject) {\n obj.topics.set((dialog as ForumTopic).id, dialog as ForumTopic);\n } else {\n obj.topics.set(dialog as number, undefined);\n }\n }\n }\n\n return this.newDialogsHandlePromise ??= pause(0).then(() => {\n this.newDialogsHandlePromise = undefined;\n this.handleNewDialogs();\n });\n }\n\n public async deleteMessages(peerId: PeerId, mids: number[], revoke?: boolean) {\n let promise: Promise;\n\n const config = await this.apiManager.getConfig();\n const overflowMids = mids.splice(config.forwarded_count_max, mids.length - config.forwarded_count_max);\n\n const localMessageIds = mids.map((mid) => getServerMessageId(mid));\n\n if(peerId.isAnyChat() && this.appPeersManager.isChannel(peerId)) {\n const channelId = peerId.toChatId();\n const channel = this.appChatsManager.getChat(channelId) as Chat.channel;\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 = this.apiManager.invokeApi('channels.deleteMessages', {\n channel: this.appChatsManager.getChannelInput(channelId),\n id: localMessageIds\n }).then((affectedMessages) => {\n this.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 = this.apiManager.invokeApi('messages.deleteMessages', {\n revoke,\n id: localMessageIds\n }).then((affectedMessages) => {\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteMessages',\n messages: mids,\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n });\n });\n }\n\n const promises: (typeof promise)[] = [promise];\n if(overflowMids.length) {\n promises.push(this.deleteMessages(peerId, overflowMids, revoke));\n }\n\n return Promise.all(promises).then(noop);\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 const readMaxId = this.getReadMaxIdIfUnread(peerId, threadId);\n if(!readMaxId) {\n if(threadId && !force) {\n const forumTopic = this.dialogsStorage.getForumTopic(peerId, threadId);\n if(!getServerMessageId(forumTopic.read_inbox_max_id)) {\n force = true;\n }\n }\n\n if(!force) {\n const dialog = this.appChatsManager.isForum(peerId.toChatId()) && threadId ?\n this.dialogsStorage.getForumTopic(peerId, threadId) :\n this.getDialogOnly(peerId);\n if(dialog && this.isDialogUnread(dialog)) {\n force = true;\n }\n }\n\n if(!force) {\n this.log('readHistory: isn\\'t unread');\n return Promise.resolve();\n }\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 = this.apiManager.invokeApi('messages.readDiscussion', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(threadId),\n read_max_id: getServerMessageId(maxId)\n });\n // apiPromise = new Promise((resolve) => resolve());\n }\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateReadChannelDiscussionInbox',\n channel_id: peerId.toChatId(),\n top_msg_id: threadId,\n read_max_id: maxId\n });\n } else if(this.appPeersManager.isChannel(peerId)) {\n if(!historyStorage.readPromise) {\n apiPromise = this.apiManager.invokeApi('channels.readHistory', {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n max_id: getServerMessageId(maxId)\n });\n }\n\n this.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 = this.apiManager.invokeApi('messages.readHistory', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n max_id: getServerMessageId(maxId)\n }).then((affectedMessages) => {\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n }\n });\n });\n }\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateReadHistoryInbox',\n max_id: maxId,\n peer: this.appPeersManager.getOutputPeer(peerId),\n still_unread_count: undefined,\n pts: undefined,\n pts_count: undefined\n });\n }\n\n this.rootScope.dispatchEvent('notification_reset', this.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 private getUnreadMentionsKey(peerId: PeerId, threadId?: number) {\n return peerId + (threadId ? `_${threadId}` : '');\n }\n\n private fixDialogUnreadMentionsIfNoMessage(peerId: PeerId, threadId?: number) {\n const dialog = this.dialogsStorage.getDialogOrTopic(peerId, threadId);\n if(dialog?.unread_mentions_count) {\n this.reloadConversationOrTopic(peerId);\n }\n }\n\n private modifyCachedMentions(peerId: PeerId, mid: number, add: boolean, threadId?: number) {\n const slicedArray = this.unreadMentions[this.getUnreadMentionsKey(peerId, threadId)];\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, threadId?: number) {\n const dialog = this.dialogsStorage.getDialogOrTopic(peerId, threadId);\n if(!slicedArray.length && dialog?.unread_mentions_count) {\n this.reloadConversationOrTopic(peerId);\n }\n }\n\n public goToNextMention(peerId: PeerId, threadId?: number) {\n /* this.getUnreadMentions(peerId, 1, 2, 0).then((messages) => {\n console.log(messages);\n }); */\n\n const key = this.getUnreadMentionsKey(peerId, threadId);\n const promise = this.goToNextMentionPromises[key];\n if(promise) {\n return promise;\n }\n\n const slicedArray = 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, threadId);\n return Promise.resolve();\n }\n\n let loadNextPromise = Promise.resolve();\n if(!isTopEnd && length < 25) {\n loadNextPromise = this.loadNextMentions(peerId, threadId);\n }\n\n return this.goToNextMentionPromises[key] = loadNextPromise.then(() => {\n const last = slicedArray.last;\n const mid = last && last[last.length - 1];\n if(mid) {\n slicedArray.delete(mid);\n return mid;\n } else {\n this.fixUnreadMentionsCountIfNeeded(peerId, slicedArray, threadId);\n }\n }).finally(() => {\n delete this.goToNextMentionPromises[key];\n });\n }\n\n private loadNextMentions(peerId: PeerId, threadId?: number) {\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, undefined, undefined, threadId)\n .then((messages) => {\n this.mergeHistoryResult(slicedArray, messages, maxId === 1 ? 0 : maxId, limit, add_offset);\n });\n }\n\n private getUnreadMentions(\n peerId: PeerId,\n offsetId: number,\n add_offset: number,\n limit: number,\n maxId = 0,\n minId = 0,\n threadId?: number\n ) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.getUnreadMentions',\n params: {\n peer: this.appPeersManager.getInputPeerById(peerId),\n offset_id: getServerMessageId(offsetId),\n add_offset,\n limit,\n max_id: getServerMessageId(maxId),\n min_id: getServerMessageId(minId),\n top_msg_id: threadId ? getServerMessageId(threadId) : undefined\n },\n processResult: (messagesMessages) => {\n assumeType>(messagesMessages);\n this.appUsersManager.saveApiUsers(messagesMessages.users);\n this.appChatsManager.saveApiChats(messagesMessages.chats);\n this.saveMessages(messagesMessages.messages);\n\n return messagesMessages;\n }\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) => getServerMessageId(mid));\n let promise: Promise, update: Update.updateChannelReadMessagesContents | Update.updateReadMessagesContents;\n if(peerId.isAnyChat() && this.appPeersManager.isChannel(peerId)) {\n const channelId = peerId.toChatId();\n\n update = {\n _: 'updateChannelReadMessagesContents',\n channel_id: channelId,\n messages: msgIds\n };\n\n promise = this.apiManager.invokeApi('channels.readMessageContents', {\n channel: this.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 = this.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 this.apiUpdatesManager.processLocalUpdate(update);\n });\n }\n\n this.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 return (this.threadsStorage[peerId] ??= {})[threadId] ??= {count: null, history: new SlicedArray()};\n }\n\n return this.historiesStorage[peerId] ??= {count: null, history: new SlicedArray()};\n }\n\n public getHistoryStorageTransferable(peerId: PeerId, threadId?: number) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const {\n count,\n history,\n maxId,\n readMaxId,\n readOutboxMaxId,\n maxOutId,\n replyMarkup\n } = historyStorage;\n\n return {\n count,\n history: undefined as HistoryStorage,\n historySerialized: history.toJSON(),\n maxId,\n readMaxId,\n readOutboxMaxId,\n maxOutId,\n replyMarkup\n };\n }\n\n private getNotifyPeerSettings(peerId: PeerId, threadId?: number) {\n const inputNotifyPeer = this.appPeersManager.getInputNotifyPeerById({peerId, ignorePeerId: true, threadId});\n return Promise.all([\n this.appNotificationsManager.getNotifyPeerTypeSettings(),\n this.appNotificationsManager.getNotifySettings(inputNotifyPeer)\n ]).then(([_, peerTypeNotifySettings]) => {\n return {\n muted: this.appNotificationsManager.isPeerLocalMuted({peerId, respectType: true, threadId}),\n peerTypeNotifySettings\n };\n });\n }\n\n private handleNotifications = () => {\n ctx.clearTimeout(this.notificationsHandlePromise);\n this.notificationsHandlePromise = undefined;\n\n // var timeout = $rootScope.idle.isIDLE && StatusManager.isOtherDeviceActive() ? 30000 : 1000;\n // const timeout = 1000;\n\n for(const key in this.notificationsToHandle) {\n const [peerId, threadId] = key.split('_');\n // if(rootScope.peerId === peerId && !rootScope.idle.isIDLE) {\n // continue;\n // }\n\n const notifyPeerToHandle = this.notificationsToHandle[key];\n this.getNotifyPeerSettings(peerId.toPeerId(), threadId ? +threadId : undefined)\n .then(({muted, peerTypeNotifySettings}) => {\n const topMessage = notifyPeerToHandle.topMessage;\n if((muted && !topMessage.pFlags.mentioned) || !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 public getUpdateAfterReloadKey(peerId: PeerId, threadId?: number) {\n return peerId + (threadId ? '_' + threadId : '');\n }\n\n private handleNewUpdateAfterReload(peerId: PeerId, update: Update, threadId?: number) {\n const set = this.newUpdatesAfterReloadToHandle[this.getUpdateAfterReloadKey(peerId, threadId)] ??= 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, threadId);\n }\n\n private onUpdateMessageId = (update: Update.updateMessageID) => {\n const randomId = update.random_id;\n const pendingData = this.pendingByRandomId[randomId];\n if(!pendingData) {\n return;\n }\n\n const mid = generateMessageId(update.id);\n this.pendingByMessageId[mid] = randomId;\n // const {storage} = pendingData;\n // const message = this.getMessageFromStorage(storage, mid);\n // if(message) { // if message somehow already exists\n // this.checkPendingMessage(message);\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.getHistoryMessagesStorage(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: this.createMessageStorage(peerId, 'history')});\n\n // * check if sent message is already in storage\n // const oldMessage = this.getMessageFromStorage(storage, message.mid);\n // if(\n // (message as Message.message).pFlags.is_outgoing &&\n // oldMessage &&\n // !(oldMessage as Message.message).pFlags.is_outgoing\n // ) {\n // this.checkPendingMessage(message);\n // return;\n // }\n\n const isForum = this.appPeersManager.isForum(peerId);\n const threadKey = this.getThreadKey(message);\n const threadId = threadKey ? +threadKey.split('_')[1] : undefined;\n const dialog = this.dialogsStorage.getDialogOrTopic(peerId, isLocalThreadUpdate ? threadId : undefined);\n\n if((!dialog || this.reloadConversationsPeers.has(peerId)) && !isLocalThreadUpdate) {\n let good = true;\n if(peerId.isAnyChat()) {\n good = this.appChatsManager.isInChat(peerId.toChatId());\n }\n\n if(good) {\n this.handleNewUpdateAfterReload(peerId, update);\n return;\n }\n\n // return;\n }\n\n if(threadId && !isLocalThreadUpdate) {\n const threadStorage = this.threadsStorage[peerId]?.[threadId];\n const update = {\n _: 'updateNewDiscussionMessage',\n message\n } as Update.updateNewDiscussionMessage;\n\n if(this.appChatsManager.isForum(peerId.toChatId()) && !this.dialogsStorage.getForumTopic(peerId, threadId)) {\n // this.dialogsStorage.getForumTopicById(peerId, threadId);\n this.handleNewUpdateAfterReload(peerId, update, threadId);\n } else if(threadStorage) {\n this.onUpdateNewMessage(update);\n }\n }\n\n if(message._ === 'messageService') {\n const {action} = message;\n if(action._ === 'messageActionPaymentSent' && message.reply_to) {\n this.rootScope.dispatchEvent('payment_sent', {\n peerId: message.reply_to.reply_to_peer_id ?\n this.appPeersManager.getPeerId(message.reply_to.reply_to_peer_id) :\n message.peerId,\n mid: message.reply_to_mid,\n receiptMessage: message\n });\n }\n\n if(action._ === 'messageActionTopicEdit' && !isLocalThreadUpdate) {\n const topic = this.dialogsStorage.getForumTopic(peerId, threadId);\n if(!topic) {\n this.dialogsStorage.getForumTopicById(peerId, threadId);\n } else {\n const oldTopic = copy(topic);\n\n if(action.title !== undefined) {\n topic.title = action.title;\n }\n\n if(action.closed !== undefined) {\n setBooleanFlag(topic.pFlags, 'closed', action.closed);\n }\n\n if(action.hidden !== undefined) {\n setBooleanFlag(topic.pFlags, 'hidden', action.hidden);\n }\n\n if(action.icon_emoji_id !== undefined) {\n topic.icon_emoji_id = action.icon_emoji_id;\n }\n\n this.scheduleHandleNewDialogs(peerId, topic);\n\n this.dialogsStorage.processTopicUpdate(topic, oldTopic);\n }\n }\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 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(!historyStorage.maxId || message.mid > historyStorage.maxId) {\n historyStorage.maxId = message.mid;\n }\n\n if(this.mergeReplyKeyboard(historyStorage, message)) {\n this.rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n\n const fromId = message.fromId;\n if(fromId.isUser() && !message.pFlags.out && message.from_id) {\n this.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(this.appPeersManager.isChannel(peerId)) {\n update = {\n _: 'updateChannelUserTyping',\n action,\n channel_id: peerId.toChatId(),\n from_id: this.appPeersManager.getOutputPeer(fromId),\n top_msg_id: threadId ? getServerMessageId(threadId) : undefined\n };\n } else {\n update = {\n _: 'updateChatUserTyping',\n action,\n chat_id: peerId.toChatId(),\n from_id: this.appPeersManager.getOutputPeer(fromId)\n };\n }\n\n this.apiUpdatesManager.processLocalUpdate(update);\n }\n\n // commented to render the message if it's been sent faster than history_append came to main thread\n // if(!pendingMessage) {\n this.handleNewMessage(message);\n // }\n\n const isTopic = dialog?._ === 'forumTopic';\n if((isLocalThreadUpdate && !isTopic) || !dialog) {\n return;\n }\n\n const inboxUnread = !message.pFlags.out && message.pFlags.unread;\n\n {\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, isTopic ? threadId : undefined);\n }\n\n releaseUnreadCount();\n }\n\n if(message.mid >= dialog.top_message) {\n this.setDialogTopMessage(message, dialog);\n }\n }\n\n if(((!isLocalThreadUpdate && !isForum) || isTopic) && inboxUnread) {\n const notifyPeer = threadKey || peerId;\n const notifyPeerToHandle = this.notificationsToHandle[notifyPeer] ??= {\n fwdCount: 0,\n fromId: NULL_PEER_ID\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 this.notificationsHandlePromise ??= ctx.setTimeout(this.handleNotifications, 0);\n }\n };\n\n private onUpdateMessageReactions = (update: Update.updateMessageReactions) => {\n const {peer, msg_id, reactions} = update;\n const mid = generateMessageId(msg_id);\n const peerId = this.appPeersManager.getPeerId(peer);\n const message: MyMessage = this.getMessageByPeer(peerId, mid);\n\n if(message?._ !== 'message') {\n return;\n }\n\n const recentReactions = reactions?.recent_reactions;\n if(recentReactions?.length && message.pFlags.out) {\n const recentReaction = recentReactions[recentReactions.length - 1];\n const previousReactions = message.reactions;\n const previousRecentReactions = previousReactions?.recent_reactions;\n if(\n this.appPeersManager.getPeerId(recentReaction.peer_id) !== this.appPeersManager.peerId && (\n !previousRecentReactions ||\n previousRecentReactions.length <= recentReactions.length\n ) && (\n !previousRecentReactions ||\n !deepEqual(recentReaction, previousRecentReactions[previousRecentReactions.length - 1])\n )\n ) {\n this.getNotifyPeerSettings(peerId).then(({muted, peerTypeNotifySettings}) => {\n if(/* muted || */!peerTypeNotifySettings.show_previews) return;\n this.notifyAboutMessage(message, {\n peerReaction: recentReaction,\n peerTypeNotifySettings\n });\n });\n }\n }\n\n const key = message.peerId + '_' + message.mid;\n this.pushBatchUpdate('messages_reactions', this.batchUpdateReactions, key, () => copy(message.reactions));\n\n message.reactions = reactions;\n\n if(!update.local) {\n this.setDialogToStateIfMessageIsTop(message);\n }\n };\n\n private onUpdateDialogUnreadMark = (update: Update.updateDialogUnreadMark) => {\n // this.log('updateDialogUnreadMark', update);\n const peerId = this.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 this.dialogsStorage.setDialogToState(dialog);\n this.rootScope.dispatchEvent('dialogs_multiupdate', new Map([[peerId, {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 = generateMessageId(message.id);\n const storage = this.getHistoryMessagesStorage(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, storage);\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?.top_message === mid;\n if((message as Message.messageService).clear_history) {\n if(isTopMessage) {\n this.rootScope.dispatchEvent('dialog_flush', {peerId, dialog});\n }\n } else {\n let dispatchEditEvent = true;\n // no sense in dispatching message_edit since only reactions have changed\n if(oldMessage?._ === 'message' && !deepEqual(oldMessage.reactions, (newMessage as Message.message).reactions)) {\n const newReactions = (newMessage as Message.message).reactions;\n (newMessage as Message.message).reactions = oldMessage.reactions;\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateMessageReactions',\n peer: this.appPeersManager.getOutputPeer(peerId),\n msg_id: message.id,\n reactions: newReactions\n });\n\n dispatchEditEvent = false;\n }\n\n dispatchEditEvent && this.rootScope.dispatchEvent('message_edit', {\n storageKey: storage.key,\n peerId,\n mid,\n message\n });\n\n if(isTopMessage) {\n this.dialogsStorage.setDialogToState(dialog);\n }\n\n const map: BroadcastEvents['dialogs_multiupdate'] = new Map();\n const getUpdateCache = () => {\n let cache = map.get(peerId);\n if(!cache) {\n map.set(peerId, cache = {});\n }\n\n return cache;\n };\n\n if((isTopMessage || (message as Message.message).grouped_id) && dialog) {\n getUpdateCache().dialog = dialog;\n }\n\n const threadKey = this.getThreadKey(message);\n if(threadKey) {\n const topicId = +threadKey.split('_')[1];\n const topic = this.dialogsStorage.getForumTopic(peerId, topicId);\n if(topic) {\n (getUpdateCache().topics ??= new Map()).set(topicId, topic);\n }\n }\n\n if(map.size) {\n this.rootScope.dispatchEvent('dialogs_multiupdate', map);\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 = generateMessageId((update as Update.updateReadChannelInbox).max_id || (update as Update.updateReadChannelDiscussionInbox).read_max_id);\n const threadId = generateMessageId((update as Update.updateReadChannelDiscussionInbox).top_msg_id);\n const peerId = channelId ? channelId.toPeerId(true) : this.appPeersManager.getPeerId((update as Update.updateReadHistoryInbox).peer);\n\n const isOut = update._ === 'updateReadHistoryOutbox' ||\n update._ === 'updateReadChannelOutbox' ||\n update._ === 'updateReadChannelDiscussionOutbox' ? true : undefined;\n\n const isForum = channelId ? this.appChatsManager.isForum(channelId) : false;\n const storage = this.getHistoryMessagesStorage(peerId);\n const history = getObjectKeysAndSort(storage, 'desc');\n const foundDialog = threadId && isForum ?\n this.dialogsStorage.getForumTopic(peerId, threadId) :\n 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 this.appUsersManager.forceUserOnline(peerId.toUserId());\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 = foundDialog && this.dialogsStorage.prepareDialogUnreadCountModifying(foundDialog);\n const readMaxId = this.getReadMaxIdIfUnread(peerId, threadId);\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 const messageThreadId = getMessageThreadId(message, isForum);\n if(threadId && messageThreadId !== threadId) {\n continue;\n }\n\n const isUnread = message.pFlags.unread || (readMaxId && readMaxId < mid);\n\n if(!isUnread) {\n break;\n }\n\n // this.log.warn('read', messageId, isUnread, message)\n delete message.pFlags.unread;\n foundAffected ||= true;\n\n if(!message.pFlags.out && 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 this.rootScope.dispatchEvent('notification_cancel', 'msg' + mid);\n }\n\n if(isOut) historyStorage.readOutboxMaxId = maxId;\n else historyStorage.readMaxId = maxId;\n\n if(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(\n newUnreadCount < 0 ||\n maxId >= foundDialog.top_message ||\n !readMaxId\n ) {\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 releaseUnreadCount?.();\n\n this.dialogsStorage.processDialogForFilters(foundDialog);\n\n this.rootScope.dispatchEvent('dialog_unread', {peerId, dialog: foundDialog});\n this.dialogsStorage.setDialogToState(foundDialog);\n\n if(!foundAffected && stillUnreadCount === undefined && !isOut && foundDialog.unread_count) {\n if(foundDialog._ === 'forumTopic') {\n this.dialogsStorage.getForumTopicById(peerId, threadId);\n } else {\n this.reloadConversation(peerId);\n }\n }\n }\n\n if(foundAffected) {\n this.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 this.rootScope.dispatchEvent('replies_updated', this.getMessageByPeer(peerId.toPeerId(), +mid) as Message.message);\n }\n }\n }\n };\n\n private onUpdateReadMessagesContents = (update: Update.updateChannelReadMessagesContents | Update.updateReadMessagesContents) => {\n const channelId = (update as Update.updateChannelReadMessagesContents).channel_id;\n const topMsgId = (update as Update.updateChannelReadMessagesContents).top_msg_id;\n const threadId = topMsgId ? generateMessageId(topMsgId) : undefined;\n const mids = (update as Update.updateReadMessagesContents).messages.map((id) => generateMessageId(id));\n const peerId = channelId ? channelId.toPeerId(true) : this.findPeerIdByMids(mids);\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) {\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, threadId);\n }\n }\n } else {\n this.fixDialogUnreadMentionsIfNoMessage(peerId, threadId);\n }\n }\n\n this.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 = 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) => generateMessageId(id));\n const peerId: PeerId = channelId ? channelId.toPeerId(true) : this.findPeerIdByMids(messages);\n\n if(!peerId) {\n return;\n }\n\n this.apiManager.clearCache('messages.getSearchCounters', (params) => {\n return this.appPeersManager.getPeerId(params.peer) === peerId;\n });\n\n const threadKeys: Set = new Set(), topics: Map = new Map();\n for(const mid of messages) {\n const message = this.getMessageByPeer(peerId, mid);\n const threadKey = this.getThreadKey(message);\n if(!threadKey) {\n continue;\n }\n\n const threadId = +threadKey.split('_')[1];\n if(this.threadsStorage[peerId]?.[threadId]) {\n threadKeys.add(threadKey);\n\n if(!topics.has(threadId)) {\n const topic = this.dialogsStorage.getForumTopic(peerId, threadId);\n if(topic) {\n topics.set(threadId, topic);\n }\n }\n }\n }\n\n const historyUpdated = this.handleDeletedMessages(\n peerId,\n this.getHistoryMessagesStorage(peerId),\n messages\n );\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 historyStorages = [\n this.getHistoryStorage(peerId),\n ...threadsStorages\n ];\n historyStorages.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 this.rootScope.dispatchEvent('history_delete', {peerId, msgs: historyUpdated.msgs});\n\n const dialogs: (MTDialog.dialog | ForumTopic)[] = [\n ...topics.values()\n ];\n\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n dialogs.unshift(dialog);\n }\n\n dialogs.forEach((dialog) => {\n const isTopic = dialog._ === 'forumTopic';\n const affected = historyUpdated.unreadMentions || historyUpdated.unread;\n const releaseUnreadCount = affected && this.dialogsStorage.prepareDialogUnreadCountModifying(dialog);\n\n if(historyUpdated.unread) {\n dialog.unread_count = Math.max(0, dialog.unread_count - historyUpdated.unread);\n }\n\n if(historyUpdated.unreadMentions) {\n dialog.unread_mentions_count = !dialog.unread_count ? 0 : Math.max(0, dialog.unread_mentions_count - historyUpdated.unreadMentions);\n }\n\n if(affected) {\n releaseUnreadCount();\n\n if(!isTopic) {\n this.rootScope.dispatchEvent('dialog_unread', {peerId, dialog});\n }\n }\n\n if(historyUpdated.msgs.has(dialog.top_message)) {\n const historyStorage = this.getHistoryStorage(dialog.peerId, isTopic ? dialog.id : undefined);\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, dialog);\n } else if(isTopic) {\n this.dialogsStorage.getForumTopicById(peerId, dialog.id);\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 = this.appChatsManager.getChat(channelId) as Chat.channel;\n\n const needDialog = this.appChatsManager.isInChat(channelId);\n\n const canViewHistory = !!getPeerActiveUsernames(channel)[0] || !channel.pFlags.left;\n const hasHistory = this.historiesStorage[peerId] !== undefined;\n\n if(canViewHistory !== hasHistory) {\n delete this.historiesStorage[peerId];\n this.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 this.rootScope.dispatchEvent('channel_update', channelId);\n };\n\n private onUpdateChannelReload = (update: Update.updateChannelReload) => {\n const peerId = update.channel_id.toPeerId(true);\n\n // if(this.appPeersManager.isForum(peerId)) {\n // const cache = this.dialogsStorage.getForumTopicsCache(peerId);\n // if(cache.topics.size) {\n\n // }\n // }\n\n this.flushStoragesByPeerId(peerId);\n Promise.all([\n this.reloadConversation(peerId)\n ]).then(() => {\n this.rootScope.dispatchEvent('history_reload', peerId);\n });\n };\n\n private onUpdateChannelMessageViews = (update: Update.updateChannelMessageViews) => {\n const views = update.views;\n const peerId = update.peerId ?? update.channel_id.toPeerId(true);\n const mid = generateMessageId(update.id);\n const message = this.getMessageByPeer(peerId, mid) as Message.message;\n if(message?.views !== undefined && message.views < views) {\n message.views = views;\n this.pushBatchUpdate('messages_views', this.batchUpdateViews, message.peerId + '_' + message.mid);\n this.setDialogToStateIfMessageIsTop(message);\n }\n };\n\n private onUpdateServiceNotification = (update: Update.updateServiceNotification) => {\n // this.log('updateServiceNotification', update);\n if(update.pFlags?.popup) {\n this.rootScope.dispatchEvent('service_notification', update);\n return;\n }\n\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: this.appPeersManager.getOutputPeer(fromId),\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n pFlags: {unread: true},\n date: (update.inbox_date || tsNow(true)) + this.timeManager.getServerTimeOffset(),\n message: update.message,\n media: update.media,\n entities: update.entities\n };\n if(!this.appUsersManager.hasUser(fromId)) {\n this.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) : this.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) => generateMessageId(id));\n\n const storage = this.getHistoryMessagesStorage(peerId);\n const missingMessages = messages.filter((mid) => !storage.has(mid));\n const getMissingPromise = missingMessages.length ? Promise.all(missingMessages.map((mid) => this.reloadMessages(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) as Message.message;\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) as Message.message;\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[this.getPinnedMessagesKey(peerId)];\n this.appStateManager.getState().then((state) => {\n delete state.hiddenPinnedMessages[peerId];\n this.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 const isTopic = peer._ === 'notifyForumTopic';\n const isPeerType = peer._ === 'notifyPeer' || isTopic;\n if(!isPeerType) {\n return;\n }\n\n const peerId = this.appPeersManager.getPeerId(peer.peer);\n const dialog = this.dialogsStorage.getDialogOrTopic(peerId, isTopic ? generateMessageId(peer.top_msg_id) : undefined);\n if(!dialog) {\n return;\n }\n\n dialog.notify_settings = notify_settings;\n this.rootScope.dispatchEvent('dialog_notify_settings', dialog);\n this.dialogsStorage.setDialogToState(dialog);\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 return;\n }\n\n const mid = 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) {\n this.handleEditedMessage(oldMessage, newMessage, storage);\n this.rootScope.dispatchEvent('message_edit', {storageKey: storage.key, peerId, mid: message.mid, message});\n } else {\n const pendingMessage = this.checkPendingMessage(message);\n if(!pendingMessage) {\n this.rootScope.dispatchEvent('scheduled_new', message as Message.message);\n }\n }\n };\n\n private onUpdateDeleteScheduledMessages = (update: Update.updateDeleteScheduledMessages) => {\n const peerId = this.appPeersManager.getPeerId(update.peer);\n\n const storage = this.scheduledMessagesStorage[peerId];\n if(storage) {\n const mids = update.messages.map((id) => generateMessageId(id));\n this.handleDeletedMessages(peerId, storage, mids);\n\n this.rootScope.dispatchEvent('scheduled_delete', {peerId, mids});\n }\n };\n\n private onUpdateMessageExtendedMedia = (update: Update.updateMessageExtendedMedia) => {\n const peerId = this.appPeersManager.getPeerId(update.peer);\n const mid = generateMessageId(update.msg_id);\n const storage = this.getHistoryMessagesStorage(peerId);\n if(!storage.has(mid)) {\n // this.fixDialogUnreadMentionsIfNoMessage(peerId);\n return;\n }\n\n const message = this.getMessageFromStorage(storage, mid) as Message.message;\n const messageMedia = message.media as MessageMedia.messageMediaInvoice;\n if(messageMedia.extended_media?._ === 'messageExtendedMedia') {\n return;\n }\n\n messageMedia.extended_media = update.extended_media;\n this.onUpdateEditMessage({\n _: 'updateEditMessage',\n message,\n pts: 0,\n pts_count: 0\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()) {\n const threadId = getMessageThreadId(threadMessage, this.appChatsManager.isForum(threadMessage.peerId.toChatId()));\n if(threadId) {\n threadKey = threadMessage.peerId + '_' + threadId;\n }\n }\n\n return threadKey;\n }\n\n public updateMessage(peerId: PeerId, mid: number, broadcastEventName?: 'replies_updated'): Promise {\n const promise: Promise = this.reloadMessages(peerId, mid, true).then(() => {\n const message = this.getMessageByPeer(peerId, mid) as Message.message;\n if(!message) {\n return;\n }\n\n if(broadcastEventName) {\n this.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 this.rootScope.dispatchEvent('history_update', {\n storageKey: pendingData.storage.key,\n message,\n sequential: pendingData.sequential\n });\n }\n\n delete this.pendingByMessageId[message.mid];\n }\n\n return pendingMessage;\n }\n\n public mutePeer(options: {peerId: PeerId, muteUntil: number, threadId?: number}) {\n if(!(options = this.appNotificationsManager.validatePeerSettings(options))) {\n return;\n }\n\n const {peerId, muteUntil, threadId} = options;\n const settings: InputPeerNotifySettings = {\n _: 'inputPeerNotifySettings'\n };\n\n settings.mute_until = muteUntil;\n\n const peer = this.appPeersManager.getInputPeerById(peerId);\n return this.appNotificationsManager.updateNotifySettings(threadId ? {\n _: 'inputNotifyForumTopic',\n peer,\n top_msg_id: getServerMessageId(threadId)\n } : {\n _: 'inputNotifyPeer',\n peer\n }, settings);\n }\n\n public togglePeerMute({peerId, mute, threadId}: {peerId: PeerId, mute?: boolean, threadId?: number}) {\n if(mute === undefined) {\n mute = !this.appNotificationsManager.isPeerLocalMuted({peerId, respectType: false, threadId});\n }\n\n return this.mutePeer({peerId, muteUntil: mute ? MUTE_UNTIL : 0, threadId});\n }\n\n private findPeerIdByMids(mids: number[]) {\n for(let length = mids.length, i = length - 1; i >= 0; --i) {\n const mid = mids[i];\n const message = this.getMessageById(mid);\n if(message) {\n return message.peerId;\n }\n }\n }\n\n public canSendToPeer(peerId: PeerId, threadId?: number, action: ChatRights = 'send_messages') {\n if(this.appPeersManager.isPeerRestricted(peerId)) {\n return false;\n }\n\n if(peerId.isAnyChat()) {\n const chatId = peerId.toChatId();\n if(threadId) {\n const topic = this.dialogsStorage.getForumTopic(peerId, threadId);\n if(topic?.pFlags?.closed && !this.appChatsManager.hasRights(chatId, 'manage_topics')) {\n return false;\n }\n }\n\n // const isChannel = appPeersManager.isChannel(peerId);\n const chat = this.appChatsManager.getChat(chatId) as Chat.chat;\n const hasRights = /* isChannel && */this.appChatsManager.hasRights(chatId, action, undefined, !!threadId);\n return /* !isChannel || */hasRights && (!chat.pFlags.left || !!threadId);\n } else {\n return this.appUsersManager.canSendToUser(peerId);\n }\n }\n\n public finalizePendingMessage(randomId: Long, finalMessage: MyMessage) {\n const pendingData = this.pendingByRandomId[randomId];\n if(!pendingData) {\n return;\n }\n\n const {peerId, tempId, threadId, storage} = pendingData;\n\n [\n this.getHistoryStorage(peerId),\n threadId ? this.getHistoryStorage(peerId, threadId) : undefined\n ]\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) {\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 this.rootScope.dispatchEvent('messages_pending');\n\n delete this.pendingByRandomId[randomId];\n\n this.finalizePendingMessageCallbacks(storage, tempId, finalMessage);\n\n return tempMessage;\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 = this.appPhotosManager.getPhoto('' + tempId);\n if(/* photo._ !== 'photoEmpty' */photo) {\n const newPhotoSize = newPhoto.sizes[newPhoto.sizes.length - 1];\n const cacheContext = this.thumbsStorage.getCacheContext(newPhoto, newPhotoSize.type);\n const oldCacheContext = this.thumbsStorage.getCacheContext(photo, THUMB_TYPE_FULL);\n Object.assign(cacheContext, oldCacheContext);\n\n const photoSize = newPhoto.sizes[newPhoto.sizes.length - 1] as PhotoSize.photoSize;\n\n const downloadOptions = getPhotoDownloadOptions(newPhoto, photoSize);\n const fileName = getFileNameByLocation(downloadOptions.location);\n // this.appDownloadManager.fakeDownload(fileName, oldCacheContext.url);\n }\n } else if(newDoc) {\n const oldDoc = this.appDocsManager.getDoc('' + tempId);\n if(oldDoc) {\n const oldCacheContext = this.thumbsStorage.getCacheContext(oldDoc);\n if(\n /* doc._ !== 'documentEmpty' && */\n oldDoc.type &&\n oldDoc.type !== 'sticker' &&\n oldDoc.mime_type !== 'image/gif' &&\n oldCacheContext.url\n ) {\n const cacheContext = this.thumbsStorage.getCacheContext(newDoc);\n Object.assign(cacheContext, oldCacheContext);\n\n const fileName = getDocumentInputFileName(newDoc);\n // this.appDownloadManager.fakeDownload(fileName, oldCacheContext.url);\n }\n }\n } else if((message.media as MessageMedia.messageMediaPoll).poll) {\n delete this.appPollsManager.polls[tempId];\n delete this.appPollsManager.results[tempId];\n }\n }\n\n const tempMessage = this.getMessageFromStorage(storage, tempId);\n storage.delete(tempId);\n\n if(!(tempMessage as Message.message).reply_markup && (message as Message.message).reply_markup) {\n setTimeout(() => { // TODO: refactor it to normal buttons adding\n if(!this.getMessageFromStorage(storage, message.mid)) {\n return;\n }\n\n this.rootScope.dispatchEvent('message_edit', {storageKey: storage.key, peerId: message.peerId, mid: message.mid, message});\n }, 0);\n }\n\n this.handleReleasingMessage(tempMessage, storage);\n\n this.rootScope.dispatchEvent('message_sent', {storageKey: storage.key, 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 this.appStateManager.pushToState('maxSeenMsgId', maxId);\n\n this.apiManager.invokeApi('messages.receivedMessages', {\n max_id: getServerMessageId(maxId)\n });\n }\n\n public async getMessageReactionsListAndReadParticipants(\n message: Message.message,\n limit?: number,\n reaction?: Reaction,\n offset?: string,\n skipReadParticipants?: boolean,\n skipReactionsList?: boolean\n ) {\n const emptyMessageReactionsList = {\n reactions: [] as MessagePeerReaction[],\n count: 0,\n next_offset: undefined as string\n };\n\n const canViewMessageReadParticipants = await this.canViewMessageReadParticipants(message);\n if(canViewMessageReadParticipants && limit === undefined) {\n limit = 100;\n } else if(limit === undefined) {\n limit = 50;\n }\n\n return Promise.all([\n canViewMessageReadParticipants && !reaction && !skipReadParticipants ? this.getMessageReadParticipants(message.peerId, message.mid).catch(() => [] as UserId[]) : [] as UserId[],\n\n message.reactions?.recent_reactions?.length && !skipReactionsList ? this.appReactionsManager.getMessageReactionsList(message.peerId, message.mid, limit, reaction, offset).catch((err) => emptyMessageReactionsList) : emptyMessageReactionsList\n ]).then(([userIds, messageReactionsList]) => {\n const readParticipantsPeerIds = userIds.map((userId) => userId.toPeerId());\n\n const filteredReadParticipants = readParticipantsPeerIds.slice();\n forEachReverse(filteredReadParticipants, (peerId, idx, arr) => {\n if(messageReactionsList.reactions.some((reaction) => this.appPeersManager.getPeerId(reaction.peer_id) === peerId)) {\n arr.splice(idx, 1);\n }\n });\n\n let combined: {peerId: PeerId, reaction?: Reaction}[] = messageReactionsList.reactions.map((reaction) => ({peerId: this.appPeersManager.getPeerId(reaction.peer_id), reaction: reaction.reaction}));\n combined = combined.concat(filteredReadParticipants.map((readPeerId) => ({peerId: readPeerId})));\n\n return {\n reactions: messageReactionsList.reactions,\n reactionsCount: messageReactionsList.count,\n readParticipants: readParticipantsPeerIds,\n combined: combined,\n nextOffset: messageReactionsList.next_offset\n };\n });\n }\n\n public getMessageReadParticipants(peerId: PeerId, mid: number): Promise {\n return this.apiManager.invokeApiSingle('messages.getMessageReadParticipants', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(mid)\n }).then((userIds) => { // ! convert long to number\n return userIds.map((userId) => userId.toUserId());\n });\n }\n\n public async canViewMessageReadParticipants(message: Message) {\n if(\n message?._ !== 'message' ||\n message.pFlags.is_outgoing ||\n !message.pFlags.out ||\n !this.appPeersManager.isAnyGroup(message.peerId)\n ) {\n return false;\n }\n\n const chat = this.appChatsManager.getChat(message.peerId.toChatId()) as Chat.chat | Chat.channel;\n const appConfig = await this.apiManager.getAppConfig();\n return chat.participants_count <= appConfig.chat_read_mark_size_threshold &&\n (tsNow(true) - message.date) < appConfig.chat_read_mark_expire_period;\n }\n\n public incrementMessageViews(peerId: PeerId, mids: number[]) {\n if(!mids.length) {\n return;\n }\n\n return this.apiManager.invokeApiSingle('messages.getMessagesViews', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: mids.map((mid) => getServerMessageId(mid)),\n increment: true\n }).then((views) => {\n const updates: Update[] = new Array(mids.length);\n for(let i = 0, length = mids.length; i < length; ++i) {\n updates[i] = {\n _: 'updateChannelMessageViews',\n channel_id: NULL_PEER_ID,\n peerId,\n id: mids[i],\n views: views.views[i].views\n };\n }\n\n this.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 peerReaction: MessagePeerReaction,\n peerTypeNotifySettings: PeerNotifySettings\n }> = {}) {\n const peerId = this.getMessagePeer(message);\n\n if(this.appPeersManager.isPeerRestricted(peerId)) {\n return;\n }\n\n const tabs = appTabsManager.getTabs();\n let tab = tabs.find((tab) => {\n const {chatPeerIds} = tab.state;\n return chatPeerIds[chatPeerIds.length - 1] === peerId;\n });\n\n if(!tab && tabs.length) {\n tabs.sort((a, b) => a.state.idleStartTime - b.state.idleStartTime);\n tab = !tabs[0].state.idleStartTime ? tabs[0] : tabs[tabs.length - 1];\n }\n\n const port = MTProtoMessagePort.getInstance();\n port.invokeVoid('notificationBuild', {\n message,\n ...options\n }, tab?.source);\n }\n\n public getScheduledMessagesStorage(peerId: PeerId) {\n return this.scheduledMessagesStorage[peerId] ??= this.createMessageStorage(peerId, 'scheduled');\n }\n\n public getScheduledMessageByPeer(peerId: PeerId, mid: number) {\n return this.getMessageFromStorage(this.getScheduledMessagesStorage(peerId), mid);\n }\n\n public getScheduledMessages(peerId: PeerId) {\n if(!this.canSendToPeer(peerId)) return;\n\n const storage = this.getScheduledMessagesStorage(peerId);\n if(storage.size) {\n return [...storage.keys()];\n }\n\n return this.apiManager.invokeApiSingle('messages.getScheduledHistory', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n hash: ''\n }).then((historyResult) => {\n if(historyResult._ !== 'messages.messagesNotModified') {\n this.appUsersManager.saveApiUsers(historyResult.users);\n this.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 this.apiManager.invokeApi('messages.sendScheduledMessages', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: mids.map((mid) => getServerMessageId(mid))\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public deleteScheduledMessages(peerId: PeerId, mids: number[]) {\n return this.apiManager.invokeApi('messages.deleteScheduledMessages', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: mids.map((mid) => getServerMessageId(mid))\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public getMessageWithReplies(message: Message.message) {\n return this.filterMessages(message, (message) => !!(message as Message.message).replies)[0] as any;\n }\n\n public getMessageWithCommentReplies(message: Message.message) {\n if(message.peerId !== REPLIES_PEER_ID) {\n message = this.getMessageWithReplies(message);\n const replies = message?.replies;\n if(!(replies && replies.pFlags.comments && replies.channel_id.toChatId() !== REPLIES_HIDDEN_CHANNEL_ID)) {\n return;\n }\n }\n\n return message;\n }\n\n public isFetchIntervalNeeded(peerId: PeerId) {\n return peerId.isAnyChat() && (\n !this.appChatsManager.isInChat(peerId.toChatId()) ||\n this.appChatsManager.isForum(peerId.toChatId())\n );\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 const historyResult = await this.getHistory(peerId, slice[0] ?? 1, 0, 50, threadId);\n for(let i = 0, length = historyResult.history.length; i < length; ++i) {\n this.handleNewMessage(this.getMessageByPeer(peerId, historyResult.history[i]));\n }\n\n return {isBottomEnd: historyStorage.history.slice.isEnd(SliceEnd.Bottom)};\n }\n\n /**\n * * https://core.telegram.org/api/offsets, offset_id is inclusive\n */\n // public getHistory(peerId: PeerId, maxId?: number, limit?: number, backLimit?: number, threadId?: number, onlyCache?: false): Promise | HistoryResult;\n // public getHistory(peerId: PeerId, maxId?: number, limit?: number, backLimit?: number, threadId?: number, onlyCache?: true): HistoryResult;\n public getHistory(peerId: PeerId, maxId: number = 0, limit?: number, backLimit?: number, threadId?: number/* , onlyCache?: boolean */): Promise | HistoryResult {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n if(this.appPeersManager.isPeerRestricted(peerId)) {\n const first = historyStorage.history.first;\n first.setEnd(SliceEnd.Both);\n\n const slice = first.slice(0, 0);\n slice.setEnd(SliceEnd.Both);\n\n return {\n count: 0,\n history: Array.from(slice),\n isEnd: slice.getEnds(),\n offsetIdOffset: 0\n };\n }\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: Array.from(haveSlice.slice),\n isEnd: haveSlice.slice.getEnds(),\n offsetIdOffset: haveSlice.offsetIdOffset\n };\n }\n\n // if(onlyCache) {\n // return;\n // }\n\n return this.fillHistoryStorage(peerId, maxId, limit, offset, historyStorage, threadId).then(() => {\n const slice = historyStorage.history.sliceMe(maxId, offset, limit);\n const f = slice?.slice || historyStorage.history.constructSlice();\n return {\n count: historyStorage.count,\n history: Array.from(f),\n isEnd: f.getEnds(),\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(\n slicedArray: SlicedArray,\n historyResult: Parameters[0],\n offset_id: number,\n limit: number,\n add_offset: number\n ) {\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 && 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 const wasMaxId = historyStorage.maxId;\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 this.rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n }\n\n if(isBottomEnd) {\n const newMaxId = slice[0];\n\n if(historyStorage.maxId === wasMaxId) {\n const first = historyStorage.history.first;\n if(first !== slice) {\n historyStorage.history.deleteSlice(first);\n }\n\n if(historyStorage.maxId !== newMaxId) {\n historyStorage.maxId = slice[0]; // ! WARNING\n\n this.reloadConversation(peerId); // when top_message is deleted but cached\n }\n }\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: MessagesGetReplies | MessagesGetHistory = {\n peer: this.appPeersManager.getInputPeerById(peerId),\n offset_id: 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 as MessagesGetReplies).msg_id = getServerMessageId(threadId) || 0;\n }\n\n const promise: ReturnType = this.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 this.appUsersManager.saveApiUsers(historyResult.users);\n this.appChatsManager.saveApiChats(historyResult.chats);\n this.saveMessages(historyResult.messages);\n\n if('pts' in historyResult) {\n this.apiUpdatesManager.addChannelState(peerId.toChatId(), historyResult.pts);\n }\n\n let length = historyResult.messages.length, count = (historyResult as MessagesMessages.messagesMessagesSlice).count;\n if(length && !historyResult.messages[length - 1]) {\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 = this.appChatsManager.getChat(peerId.toChatId());\n if(channel._ === 'channel') {\n channel = {\n _: 'channelForbidden',\n id: peerId.toChatId(),\n access_hash: channel.access_hash,\n title: channel.title,\n pFlags: channel.pFlags\n };\n }\n\n this.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 = pause(0).then(() => {\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: getServerMessageId(mid)\n };\n });\n\n let promise: Promise;\n if(peerId.isAnyChat() && this.appPeersManager.isChannel(peerId)) {\n promise = this.apiManager.invokeApiSingle('channels.getMessages', {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n id: msgIds\n });\n } else {\n promise = this.apiManager.invokeApiSingle('messages.getMessages', {\n id: msgIds\n });\n }\n\n const after = promise.then((getMessagesResult) => {\n assumeType>(getMessagesResult);\n\n this.appUsersManager.saveApiUsers(getMessagesResult.users);\n this.appChatsManager.saveApiChats(getMessagesResult.chats);\n const messages = this.saveMessages(getMessagesResult.messages);\n\n for(let i = 0; i < messages.length; ++i) {\n const message = messages[i];\n if(!message) {\n continue;\n }\n\n const mid = generateMessageId(message.id);\n const promise = map.get(mid);\n promise.resolve(message);\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 this.rootScope.dispatchEvent('messages_downloaded', {peerId, mids});\n });\n\n requestPromises.push(after);\n }\n\n this.needSingleMessages.clear();\n\n return Promise.all(requestPromises).then(noop, noop).then(() => {\n this.fetchSingleMessagesPromise = undefined;\n if(this.needSingleMessages.size) this.fetchSingleMessages();\n });\n });\n }\n\n public reloadMessages(peerId: PeerId, mid: number, overwrite?: boolean): Promise;\n public reloadMessages(peerId: PeerId, mid: number[], overwrite?: boolean): Promise;\n public reloadMessages(peerId: PeerId, mid: number | number[], overwrite?: boolean): Promise {\n if(Array.isArray(mid)) {\n return Promise.all(mid.map((mid) => {\n return this.reloadMessages(peerId, mid, overwrite);\n }));\n }\n\n const message = this.getMessageByPeer(peerId, mid);\n if(message && !overwrite) {\n this.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 getExtendedMedia(peerId: PeerId, mids: number[]) {\n let map = this.extendedMedia.get(peerId);\n if(!map) {\n this.extendedMedia.set(peerId, map = new Map());\n }\n\n const deferred = deferredPromise();\n const toRequest: number[] = [];\n const promises = mids.map((mid) => {\n let promise = map.get(mid);\n if(!promise) {\n map.set(mid, promise = deferred);\n toRequest.push(mid);\n\n promise.then(() => {\n map.delete(mid);\n if(!map.size && this.extendedMedia.get(peerId) === map) {\n this.extendedMedia.delete(peerId);\n }\n });\n }\n\n return promise;\n });\n\n if(!toRequest.length) {\n deferred.resolve();\n } else {\n this.apiManager.invokeApi('messages.getExtendedMedia', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: toRequest.map((mid) => getServerMessageId(mid))\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n deferred.resolve();\n });\n }\n\n return Promise.all(promises);\n }\n\n public fetchMessageReplyTo(message: MyMessage) {\n if(!message.reply_to_mid) return Promise.resolve(this.generateEmptyMessage(0));\n const replyToPeerId = message.reply_to.reply_to_peer_id ? this.appPeersManager.getPeerId(message.reply_to.reply_to_peer_id) : message.peerId;\n return this.reloadMessages(replyToPeerId, message.reply_to_mid).then((originalMessage) => {\n if(!originalMessage) { // ! break the infinite loop\n message = this.getMessageByPeer(message.peerId, message.mid); // message can come from other thread\n delete message.reply_to_mid; // ! WARNING!\n }\n\n if(message._ === 'messageService') {\n const peerId = message.peerId;\n this.rootScope.dispatchEvent('message_edit', {\n storageKey: `${peerId}_history`,\n peerId: peerId,\n mid: message.mid,\n message\n });\n\n if(this.isMessageIsTopMessage(message)) {\n this.rootScope.dispatchEvent('dialogs_multiupdate', new Map([[peerId, {dialog: this.getDialogOnly(peerId)}]]));\n }\n }\n\n return originalMessage;\n });\n }\n\n private getTypingKey(peerId: PeerId, threadId?: number) {\n return threadId ? `${peerId}_${threadId}` : peerId;\n }\n\n public setTyping(\n peerId: PeerId,\n action: SendMessageAction,\n force?: boolean,\n threadId?: number\n ): Promise {\n if(threadId && !this.appPeersManager.isForum(peerId)) {\n threadId = undefined;\n }\n\n const key = this.getTypingKey(peerId, threadId);\n let typing = this.typings[key];\n if(\n !peerId ||\n !this.canSendToPeer(peerId) ||\n peerId === this.appPeersManager.peerId ||\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[key] = {\n action\n };\n\n return this.apiManager.invokeApi('messages.setTyping', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n action,\n top_msg_id: threadId ? getServerMessageId(threadId) : undefined\n }).finally(() => {\n if(typing === this.typings[key]) {\n typing.timeout = ctx.setTimeout(() => {\n delete this.typings[key];\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 this.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 = this.appWebPagesManager.getMessageKeyForPendingWebPage(message.peerId, message.mid, isScheduled);\n this.appWebPagesManager.deleteWebPageFromPending(media.webpage, messageKey);\n }\n\n if((media as MessageMedia.messageMediaPoll).poll) {\n this.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) {\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 this.rootScope.dispatchEvent('notification_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\n if(history.albums) {\n for(const groupedId in history.albums) {\n this.dispatchAlbumEdit(groupedId, storage, [...history.albums[groupedId]]);\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, storage: MessagesStorage) {\n if(oldMessage._ === 'message') {\n if((oldMessage.media as MessageMedia.messageMediaWebPage)?.webpage) {\n const messageKey = this.appWebPagesManager.getMessageKeyForPendingWebPage(oldMessage.peerId, oldMessage.mid, !!oldMessage.pFlags.is_scheduled);\n this.appWebPagesManager.deleteWebPageFromPending((oldMessage.media as MessageMedia.messageMediaWebPage).webpage, messageKey);\n }\n\n const groupedId = oldMessage.grouped_id;\n if(groupedId) {\n this.dispatchAlbumEdit(groupedId, storage, []);\n }\n }\n }\n\n private dispatchAlbumEdit(groupedId: string, storage: MessagesStorage, deletedMids?: number[]) {\n const mids = this.getMidsByAlbum(groupedId);\n const messages = mids.map((mid) => this.getMessageFromStorage(storage, mid)) as Message.message[];\n this.rootScope.dispatchEvent('album_edit', {peerId: messages[0].peerId, groupId: groupedId, deletedMids: deletedMids || [], messages});\n }\n\n public getDialogUnreadCount(dialog: Dialog | ForumTopic) {\n let unreadCount = dialog.unread_count;\n if(!this.dialogsStorage.isTopic(dialog) && this.appPeersManager.isForum(dialog.peerId)) {\n const forumUnreadCount = this.dialogsStorage.getForumUnreadCount(dialog.peerId);\n if(forumUnreadCount instanceof Promise) {\n unreadCount = 0;\n } else {\n unreadCount = forumUnreadCount.count;\n }\n }\n\n return unreadCount || +!!(dialog as Dialog).pFlags?.unread_mark;\n }\n\n public isDialogUnread(dialog: Dialog | ForumTopic) {\n return !!this.getDialogUnreadCount(dialog);\n }\n\n public canForward(message: Message.message | Message.messageService) {\n return message?._ === 'message' && !(message as Message.message).pFlags.noforwards && !this.appPeersManager.noForwards(message.peerId);\n }\n\n private pushBatchUpdate(\n event: E,\n callback: C,\n key: string,\n getElementCallback?: () => MapValueType[0]>\n ) {\n let details = this.batchUpdates[event];\n if(!details) {\n // @ts-ignore\n details = this.batchUpdates[event] = {\n callback,\n batch: new Map()\n };\n }\n\n if(!details.batch.has(key)) {\n // @ts-ignore\n details.batch.set(key, getElementCallback ? getElementCallback() : undefined);\n this.batchUpdatesDebounced();\n }\n }\n\n private getMessagesFromMap>(map: T) {\n const newMap: Map> = new Map();\n for(const [key, value] of map) {\n const [peerIdStr, mid] = key.split('_');\n const message = this.getMessageByPeer(peerIdStr.toPeerId(), +mid) as Message.message;\n if(!message) {\n continue;\n }\n\n newMap.set(message, value);\n }\n\n return newMap;\n }\n\n private batchUpdateViews = (batch: Map) => {\n const toDispatch: {peerId: PeerId, mid: number, views: number}[] = [];\n\n const map = this.getMessagesFromMap(batch);\n for(const [message] of map) {\n toDispatch.push({\n peerId: message.peerId,\n mid: message.mid,\n views: message.views\n })\n }\n\n return toDispatch;\n };\n\n private batchUpdateReactions = (batch: Map) => {\n const toDispatch: {message: Message.message, changedResults: ReactionCount.reactionCount[]}[] = [];\n\n const map = this.getMessagesFromMap(batch);\n for(const [message, previousReactions] of map) {\n const results = message.reactions?.results ?? [];\n const previousResults = previousReactions?.results ?? [];\n const changedResults = results.filter((reactionCount) => {\n const previousReactionCount = previousResults.find((_reactionCount) => reactionsEqual(_reactionCount.reaction, reactionCount.reaction));\n return (\n message.pFlags.out && (\n !previousReactionCount ||\n reactionCount.count > previousReactionCount.count\n )\n ) || (\n reactionCount.chosen_order !== undefined && (\n !previousReactionCount ||\n previousReactionCount.chosen_order === undefined\n )\n );\n });\n\n toDispatch.push({message, changedResults});\n }\n\n return toDispatch;\n };\n\n public saveDefaultSendAs(peerId: PeerId, sendAsPeerId: PeerId) {\n const channelFull = this.appProfileManager.getCachedFullChat(peerId.toChatId()) as ChatFull.channelFull;\n channelFull.default_send_as = this.appPeersManager.getOutputPeer(sendAsPeerId);\n return this.apiManager.invokeApi('messages.saveDefaultSendAs', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n send_as: this.appPeersManager.getInputPeerById(sendAsPeerId)\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 {getFileNameByLocation} from '../../../../helpers/fileName';\nimport {Document} from '../../../../layer';\nimport getDocumentInputFileLocation from './getDocumentInputFileLocation';\n\nexport default function getDocumentInputFileName(doc: Document.document, thumbSize?: string) {\n return getFileNameByLocation(getDocumentInputFileLocation(doc, thumbSize), {fileName: doc.file_name});\n}\n","export default function convertInputKeyToKey(inputKey: string) {\n const str = inputKey.replace('input', '');\n return (str[0].toLowerCase() + str.slice(1)) as T;\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 tsNow from '../../helpers/tsNow';\nimport {InputNotifyPeer, InputPeerNotifySettings, NotifyPeer, PeerNotifySettings, Update} from '../../layer';\nimport {MUTE_UNTIL} from '../mtproto/mtproto_config';\nimport throttle from '../../helpers/schedulers/throttle';\nimport convertInputKeyToKey from '../../helpers/string/convertInputKeyToKey';\nimport {AppManager} from './manager';\nimport ctx from '../../environment/ctx';\nimport assumeType from '../../helpers/assumeType';\nimport generateMessageId from './utils/messageId/generateMessageId';\n\ntype ImSadAboutIt = Promise | PeerNotifySettings;\ntype MyNotifyPeer = Exclude;\ntype MyInputNotifyPeer = Exclude;\nexport class AppNotificationsManager extends AppManager {\n private peerSettings = {\n notifyPeer: {} as {[peerId: string]: ImSadAboutIt},\n notifyUsers: null as ImSadAboutIt,\n notifyChats: null as ImSadAboutIt,\n notifyBroadcasts: null as ImSadAboutIt,\n notifyForumTopic: {} as {[peerId_threadId: string]: ImSadAboutIt}\n };\n // private exceptions: {[peerId: string]: PeerNotifySettings} = {};\n\n private getNotifyPeerTypePromise: Promise;\n\n private checkMuteUntilTimeout: number;\n private checkMuteUntilThrottled: () => void;\n\n private notifyContactsSignUp: Promise;\n\n protected after() {\n this.checkMuteUntilThrottled = throttle(this.checkMuteUntil, 1000, false);\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateNotifySettings: (update) => {\n const {peer} = update;\n const isTopic = peer._ === 'notifyForumTopic';\n const isPeerType = peer._ === 'notifyPeer' || isTopic;\n const peerId = isPeerType && this.appPeersManager.getPeerId(peer.peer);\n const key = !isPeerType ? peer._ : undefined;\n this.savePeerSettings({\n key,\n peerId,\n threadId: isTopic ? generateMessageId(peer.top_msg_id) : undefined,\n settings: update.notify_settings\n });\n this.rootScope.dispatchEvent('notify_settings', update);\n }\n });\n\n return this.appStateManager.getState().then((state) => {\n if(state.notifySettings) {\n for(const key in state.notifySettings) {\n assumeType(key);\n this.savePeerSettings({\n key,\n settings: state.notifySettings[key]\n });\n }\n }\n });\n }\n\n public getNotifySettings(peer: InputNotifyPeer): ImSadAboutIt {\n let key: any = convertInputKeyToKey(peer._);\n let obj: any = this.peerSettings[key as MyNotifyPeer];\n\n let peerId: PeerId;\n if(peer._ === 'inputNotifyPeer') {\n peerId = key = this.appPeersManager.getPeerId(peer.peer);\n obj = obj[key];\n }\n\n if(obj) {\n return obj;\n }\n\n return (obj || this.peerSettings)[key] = this.apiManager.invokeApi('account.getNotifySettings', {peer})\n .then((settings) => {\n this.savePeerSettings({\n key,\n peerId,\n settings\n });\n\n return settings;\n });\n }\n\n public getNotifyPeerTypeSettings() {\n if(this.getNotifyPeerTypePromise) return this.getNotifyPeerTypePromise;\n\n const promises = (['inputNotifyBroadcasts', 'inputNotifyUsers', 'inputNotifyChats'] as MyInputNotifyPeer[])\n .map((inputKey) => {\n return this.getNotifySettings({_: inputKey});\n });\n\n return this.getNotifyPeerTypePromise = Promise.all(promises);\n }\n\n public updateNotifySettings(peer: InputNotifyPeer, settings: InputPeerNotifySettings) {\n // this.savePeerSettings(peerId, settings);\n\n /* const inputSettings: InputPeerNotifySettings = copy(settings) as any;\n inputSettings._ = 'inputPeerNotifySettings'; */\n\n return this.apiManager.invokeApi('account.updateNotifySettings', {\n peer,\n settings\n }).then((value) => {\n if(value) {\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateNotifySettings',\n peer: {\n ...peer as any,\n _: convertInputKeyToKey(peer._)\n },\n notify_settings: { // ! WOW, IT WORKS !\n ...settings,\n _: 'peerNotifySettings'\n }\n });\n }\n });\n }\n\n // public getNotifyExceptions() {\n // apiManager.invokeApi('account.getNotifyExceptions', {compare_sound: true})\n // .then((updates) => {\n // apiUpdatesManager.processUpdateMessage(updates);\n // });\n // }\n\n public getContactSignUpNotification() {\n if(this.notifyContactsSignUp) return this.notifyContactsSignUp;\n return this.notifyContactsSignUp = this.apiManager.invokeApi('account.getContactSignUpNotification');\n }\n\n public setContactSignUpNotification(silent: boolean) {\n this.apiManager.invokeApi('account.setContactSignUpNotification', {silent})\n .then((value) => {\n this.notifyContactsSignUp = Promise.resolve(!silent);\n });\n }\n\n private checkMuteUntil = () => {\n if(this.checkMuteUntilTimeout !== undefined) {\n clearTimeout(this.checkMuteUntilTimeout);\n this.checkMuteUntilTimeout = undefined;\n }\n\n const timestamp = tsNow(true);\n let closestMuteUntil = MUTE_UNTIL;\n\n const p = (peerNotifySettings: ImSadAboutIt): peerNotifySettings is PeerNotifySettings => {\n if(peerNotifySettings instanceof Promise) {\n return false;\n }\n\n const muteUntil = peerNotifySettings.mute_until;\n if(!muteUntil) {\n return false;\n }\n\n if(muteUntil <= timestamp) {\n // ! do not delete it because peer's unique settings will be overwritten in getPeerLocalSettings with type's settings\n peerNotifySettings.mute_until = 0;\n return true;\n } else if(muteUntil < closestMuteUntil) {\n closestMuteUntil = muteUntil;\n }\n\n return false;\n };\n\n [\n 'notifyPeer' as const,\n 'notifyForumTopic' as const\n ].forEach((typeKey) => {\n for(const key in this.peerSettings[typeKey]) {\n const peerNotifySettings = this.peerSettings[typeKey][key];\n if(p(peerNotifySettings)) {\n const [peerId, topicId] = key.split('_');\n const peer = this.appPeersManager.getOutputPeer(peerId.toPeerId());\n this.apiUpdatesManager.saveUpdate({\n _: 'updateNotifySettings',\n peer: topicId ? {\n _: 'notifyForumTopic',\n peer,\n top_msg_id: +topicId\n } : {\n _: 'notifyPeer',\n peer\n },\n notify_settings: peerNotifySettings\n });\n }\n }\n });\n\n const timeout = Math.min(1800e3, (closestMuteUntil - timestamp) * 1000);\n this.checkMuteUntilTimeout = ctx.setTimeout(this.checkMuteUntil, timeout);\n };\n\n public getPeerKey(peerId: PeerId, threadId?: number) {\n return peerId + (threadId ? '_' + threadId : '');\n }\n\n public savePeerSettings({key, peerId, threadId, settings}: {\n key?: Exclude,\n peerId?: PeerId,\n threadId?: number,\n settings: PeerNotifySettings\n }) {\n let obj: any;\n if(peerId) {\n key = this.getPeerKey(peerId, threadId) as any;\n obj = this.peerSettings[threadId ? 'notifyForumTopic' : 'notifyPeer'];\n }\n\n (obj || this.peerSettings)[key] = settings;\n\n if(!peerId) {\n this.rootScope.dispatchEvent('notify_peer_type_settings', {key, settings});\n this.appStateManager.getState().then((state) => {\n const notifySettings = state.notifySettings;\n notifySettings[key] = settings;\n this.appStateManager.pushToState('notifySettings', notifySettings);\n });\n } else {\n this.checkMuteUntilThrottled();\n }\n\n // rootScope.broadcast('notify_settings', {peerId: peerId});\n }\n\n public isMuted(peerNotifySettings: PeerNotifySettings) {\n return peerNotifySettings._ === 'peerNotifySettings' &&\n (peerNotifySettings.silent || (peerNotifySettings.mute_until !== undefined && (peerNotifySettings.mute_until * 1000) > tsNow()));\n }\n\n private getPeerMuted(peerId: PeerId) {\n const ret = this.getNotifySettings({_: 'inputNotifyPeer', peer: this.appPeersManager.getInputPeerById(peerId)});\n return (ret instanceof Promise ? ret : Promise.resolve(ret))\n .then((peerNotifySettings) => this.isMuted(peerNotifySettings));\n }\n\n private getPeerLocalSettings({\n peerId,\n respectType = true,\n threadId\n }: {\n peerId: PeerId,\n respectType?: boolean,\n threadId?: number\n }): PeerNotifySettings {\n const n: PeerNotifySettings = {\n _: 'peerNotifySettings'\n };\n\n const peerKey = this.getPeerKey(peerId, threadId);\n const notifySettings = this.peerSettings[threadId ? 'notifyForumTopic' : 'notifyPeer'][peerKey];\n // if(!notifySettings || (notifySettings instanceof Promise)) return false;\n if(notifySettings && !(notifySettings instanceof Promise)) {\n Object.assign(n, notifySettings);\n }\n\n if(respectType) {\n const inputNotify = this.appPeersManager.getInputNotifyPeerById({peerId, ignorePeerId: true, threadId});\n const key = convertInputKeyToKey(inputNotify._);\n const typeNotifySettings = this.peerSettings[key as MyNotifyPeer];\n if(typeNotifySettings && !(typeNotifySettings instanceof Promise)) {\n for(const i in typeNotifySettings) {\n // @ts-ignore\n if(n[i] === undefined) {\n // @ts-ignore\n n[i] = typeNotifySettings[i];\n }\n }\n }\n }\n\n return n;\n }\n\n public validatePeerSettings[0]>(options: T): T {\n if(options.peerId === this.appPeersManager.peerId) return;\n if(options.threadId && !this.appPeersManager.isForum(options.peerId)) options.threadId = undefined;\n return options;\n }\n\n public isPeerLocalMuted(options: Parameters[0]): boolean {\n if(!(options = this.validatePeerSettings(options))) return false;\n\n if(options.threadId) {\n const notifySettings = this.getPeerLocalSettings({...options, respectType: false});\n if(notifySettings.silent !== undefined || notifySettings.mute_until !== undefined) {\n return this.isMuted(notifySettings);\n } else {\n return this.isPeerLocalMuted({...options, threadId: undefined});\n }\n }\n\n const notifySettings = this.getPeerLocalSettings(options);\n const isMuted = this.isMuted(notifySettings);\n return isMuted;\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 type {Chat, ChatPhoto, DialogPeer, InputChannel, InputDialogPeer, InputNotifyPeer, InputPeer, Peer, Update, User, UserProfilePhoto} from '../../layer';\nimport type {LangPackKey} from '../langPack';\nimport {getRestrictionReason} from '../../helpers/restrictions';\nimport isObject from '../../helpers/object/isObject';\nimport {AppManager} from './manager';\nimport getPeerId from './utils/peers/getPeerId';\nimport isUser from './utils/peers/isUser';\nimport isAnyChat from './utils/peers/isAnyChat';\nimport {NULL_PEER_ID} from '../mtproto/mtproto_config';\nimport getPeerActiveUsernames from './utils/peers/getPeerActiveUsernames';\nimport isPeerRestricted from './utils/peers/isPeerRestricted';\nimport getPeerPhoto from './utils/peers/getPeerPhoto';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\n\nexport type PeerType = 'channel' | 'chat' | 'megagroup' | 'group' | 'saved';\nexport class AppPeersManager extends AppManager {\n public get peerId() {\n return this.appUsersManager.userId.toPeerId();\n }\n /* public savePeerInstance(peerId: PeerId, instance: any) {\n if(peerId < 0) appChatsManager.saveApiChat(instance);\n else appUsersManager.saveApiUser(instance);\n } */\n\n public canPinMessage(peerId: PeerId) {\n return peerId.isUser() || this.appChatsManager.hasRights(peerId.toChatId(), 'pin_messages');\n }\n\n public getPeerPhoto(peerId: PeerId) {\n const peer = this.getPeer(peerId) as User.user | Chat.channel;\n return getPeerPhoto(peer);\n }\n\n public getPeerMigratedTo(peerId: PeerId) {\n if(peerId.isUser()) {\n return false;\n }\n\n const chat = this.appChatsManager.getChat(peerId.toChatId()) as Chat.chat;\n const migratedTo = chat?.migrated_to;\n if(migratedTo && chat.pFlags.deactivated) {\n return getPeerId(migratedTo);\n }\n\n return false;\n }\n\n public getOutputPeer(peerId: PeerId): Peer {\n if(peerId.isUser()) {\n return {_: 'peerUser', user_id: peerId.toUserId()};\n }\n\n const chatId = peerId.toChatId();\n if(this.appChatsManager.isChannel(chatId)) {\n return {_: 'peerChannel', channel_id: chatId};\n }\n\n return {_: 'peerChat', chat_id: chatId};\n }\n\n public getPeerString(peerId: PeerId) {\n if(peerId.isUser()) {\n return this.appUsersManager.getUserString(peerId.toUserId());\n }\n return this.appChatsManager.getChatString(peerId.toChatId());\n }\n\n public getPeerUsername(peerId: PeerId) {\n return this.getPeerActiveUsernames(peerId)[0] || '';\n }\n\n public getPeerActiveUsernames(peerId: PeerId) {\n const peer = this.getPeer(peerId);\n return getPeerActiveUsernames(peer);\n }\n\n public getPeer(peerId: PeerId) {\n return peerId.isUser() ?\n this.appUsersManager.getUser(peerId.toUserId()) :\n this.appChatsManager.getChat(peerId.toChatId());\n }\n\n public getPeerId(peerId: Parameters[0]) {\n return getPeerId(peerId) || (isObject(peerId) && peerId._ === 'inputPeerSelf' && this.peerId) || NULL_PEER_ID;\n }\n\n public getDialogPeer(peerId: PeerId): DialogPeer {\n return {\n _: 'dialogPeer',\n peer: this.getOutputPeer(peerId)\n };\n }\n\n public isChannel(peerId: PeerId): boolean {\n return !peerId.isUser() && this.appChatsManager.isChannel(peerId.toChatId());\n }\n\n public isMegagroup(peerId: PeerId) {\n return !peerId.isUser() && this.appChatsManager.isMegagroup(peerId.toChatId());\n }\n\n public isForum(peerId: PeerId) {\n return !peerId.isUser() && this.appChatsManager.isForum(peerId.toChatId());\n }\n\n public isAnyGroup(peerId: PeerId): boolean {\n return !peerId.isUser() && !this.appChatsManager.isBroadcast(peerId.toChatId());\n }\n\n public isBroadcast(peerId: PeerId): boolean {\n return this.isChannel(peerId) && !this.isMegagroup(peerId);\n }\n\n public isBot(peerId: PeerId): boolean {\n return peerId.isUser() && this.appUsersManager.isBot(peerId.toUserId());\n }\n\n public isContact(peerId: PeerId): boolean {\n return peerId.isUser() && this.appUsersManager.isContact(peerId.toUserId());\n }\n\n public isUser(peerId: PeerId)/* : peerId is UserId */ {\n return isUser(peerId);\n }\n\n public isAnyChat(peerId: PeerId) {\n return isAnyChat(peerId);\n }\n\n public isPeerRestricted(peerId: PeerId) {\n return isPeerRestricted(this.getPeer(peerId));\n }\n\n public getRestrictionReasonText(peerId: PeerId) {\n const peer = this.getPeer(peerId) as Chat.channel | User.user;\n const reason = peer.restriction_reason ? getRestrictionReason(peer.restriction_reason) : undefined;\n if(reason) {\n return reason.text;\n } else {\n return peerId.isUser() ? 'This user is restricted' : 'This chat is restricted';\n }\n }\n\n /* public getInputPeer(peerString: string): InputPeer {\n var firstChar = peerString.charAt(0);\n var peerParams = peerString.substr(1).split('_');\n let id = +peerParams[0];\n\n if(firstChar === 'u') {\n //appUsersManager.saveUserAccess(id, peerParams[1]);\n\n return {\n _: 'inputPeerUser',\n user_id: id,\n access_hash: peerParams[1]\n };\n } else if(firstChar === 'c' || firstChar === 's') {\n //appChatsManager.saveChannelAccess(id, peerParams[1]);\n if(firstChar === 's') {\n appChatsManager.saveIsMegagroup(id);\n }\n\n return {\n _: 'inputPeerChannel',\n channel_id: id,\n access_hash: peerParams[1] || '0'\n };\n } else {\n return {\n _: 'inputPeerChat',\n chat_id: id\n };\n }\n } */\n\n // public getInputNotifyPeerById(peerId: PeerId, ignorePeerId: true): Exclude;\n // public getInputNotifyPeerById(peerId: PeerId, ignorePeerId?: false): InputNotifyPeer.inputNotifyPeer;\n // public getInputNotifyPeerById(peerId: PeerId, ignorePeerId?: boolean): InputNotifyPeer {\n public getInputNotifyPeerById({\n peerId,\n ignorePeerId,\n threadId\n }: T): T['ignorePeerId'] extends true ? Exclude : (T['threadId'] extends number ? InputNotifyPeer.inputNotifyForumTopic : InputNotifyPeer.inputNotifyPeer) {\n if(ignorePeerId) {\n if(peerId.isUser()) {\n return {_: 'inputNotifyUsers'} as any;\n } else {\n if(this.isBroadcast(peerId)) {\n return {_: 'inputNotifyBroadcasts'} as any;\n } else {\n return {_: 'inputNotifyChats'} as any;\n }\n }\n } else if(threadId) {\n return {\n _: 'inputNotifyForumTopic',\n peer: this.getInputPeerById(peerId),\n top_msg_id: getServerMessageId(threadId)\n } as any;\n } else {\n return {\n _: 'inputNotifyPeer',\n peer: this.getInputPeerById(peerId)\n } as any;\n }\n }\n\n public getInputPeerById(peerId: PeerId): InputPeer {\n if(!peerId) {\n return {_: 'inputPeerEmpty'};\n }\n\n if(!peerId.isUser()) {\n const chatId = peerId.toChatId();\n return this.appChatsManager.getInputPeer(chatId);\n }\n\n const userId = peerId.toUserId();\n return this.appUsersManager.getUserInputPeer(userId);\n }\n\n /**\n * ! use it only in safe places like requests\n */\n public getInputPeerSelf(): InputPeer.inputPeerSelf {\n return {_: 'inputPeerSelf'};\n }\n\n public getInputDialogPeerById(peerId: PeerId | InputPeer): InputDialogPeer {\n return {\n _: 'inputDialogPeer',\n peer: isObject(peerId) ? peerId : this.getInputPeerById(peerId)\n };\n }\n\n public getPeerSearchText(peerId: PeerId) {\n let text: string;\n if(this.isUser(peerId)) {\n text = '%pu ' + this.appUsersManager.getUserSearchText(peerId.toUserId());\n } else {\n const chat = this.appChatsManager.getChat(peerId.toChatId());\n text = '%pg ' + (chat.title || '');\n }\n\n return text;\n }\n\n public getDialogType(peerId: PeerId): PeerType {\n if(this.isMegagroup(peerId)) {\n return 'megagroup';\n } else if(this.isChannel(peerId)) {\n return 'channel';\n } else if(!this.isUser(peerId)) {\n return 'group';\n } else {\n return peerId === this.peerId ? 'saved' : 'chat';\n }\n }\n\n public getDeleteButtonText(peerId: PeerId): Extract {\n switch(this.getDialogType(peerId)) {\n case 'channel':\n return this.appChatsManager.hasRights(peerId.toChatId(), 'delete_chat') ? 'ChannelDelete' : 'ChatList.Context.LeaveChannel';\n\n case 'megagroup':\n case 'group':\n return this.appChatsManager.hasRights(peerId.toChatId(), 'delete_chat') ? 'DeleteMega' : 'ChatList.Context.LeaveGroup';\n\n default:\n return 'ChatList.Context.DeleteChat';\n }\n }\n\n public noForwards(peerId: PeerId) {\n if(peerId.isUser()) return false;\n else {\n const chat = this.appChatsManager.getChat(peerId.toChatId());\n return !!(chat as Chat.chat).pFlags?.noforwards;\n }\n }\n}\n\nexport type IsPeerType = 'isChannel' | 'isMegagroup' | 'isAnyGroup' | 'isBroadcast' | 'isBot' | 'isContact' | 'isUser' | 'isAnyChat';\n","/*\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 {Photo, PhotoSize, PhotosPhotos} from '../../layer';\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport isObject from '../../helpers/object/isObject';\nimport safeReplaceArrayInObject from '../../helpers/object/safeReplaceArrayInObject';\nimport {AppManager} from './manager';\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 extends AppManager {\n private photos: {\n [id: string]: MyPhoto\n } = {};\n\n public savePhoto(photo: Photo, context?: ReferenceContext) {\n if(!photo || photo._ === 'photoEmpty') return;\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 this.referenceDatabase.saveContext(photo.file_reference, context);\n }\n\n if(photo.sizes?.length) {\n // * sometimes photoStrippedSize can be the last item\n photo.sizes.sort((a, b) => {\n return ((a as PhotoSize.photoSize).size || ((a as PhotoSize.photoSizeProgressive).sizes ? Infinity : 0)) - ((b as PhotoSize.photoSize).size || ((b as PhotoSize.photoSizeProgressive).sizes ? Infinity : 0));\n });\n\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 getUserPhotos(userId: UserId, maxId: Photo.photo['id'] = '0', limit: number = 20) {\n const inputUser = this.appUsersManager.getUserInput(userId);\n return this.apiManager.invokeApiCacheable('photos.getUserPhotos', {\n user_id: inputUser,\n offset: 0,\n limit,\n max_id: maxId\n }, {cacheSeconds: 60}).then((photosResult) => {\n this.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 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 getPhoto(photoId: any/* MyPhoto | string */): MyPhoto {\n return isObject(photoId) ? photoId as MyPhoto : this.photos[photoId as any as string];\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 from '../../helpers/object/copy';\nimport {InputMedia, Message, MessageEntity, MessageMedia, Poll, PollResults} from '../../layer';\nimport {logger, LogTypes} from '../logger';\nimport parseMarkdown from '../richTextProcessor/parseMarkdown';\nimport {AppManager} from './manager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\n\ntype PollId = Poll['id'];\n\nexport class AppPollsManager extends AppManager {\n public polls: {[id: PollId]: Poll} = {};\n public results: {[id: PollId]: PollResults} = {};\n public pollToMessages: {[id: PollId]: Set} = {};\n\n private log = logger('POLLS', LogTypes.Error);\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateMessagePoll: (update) => {\n this.log('updateMessagePoll:', update);\n\n let poll: Poll = update.poll || this.polls[update.poll_id];\n if(!poll) {\n return;\n }\n\n let results = update.results;\n const ret = this.savePoll(poll, results as any);\n poll = ret.poll;\n results = ret.results;\n\n this.rootScope.dispatchEvent('poll_update', {poll, results: results as any});\n }\n });\n }\n\n public savePoll(poll: Poll, results: PollResults, message?: Message.message) {\n if(message) {\n this.updatePollToMessage(message, true);\n }\n\n const id = poll.id;\n if(this.polls[id]) {\n poll = Object.assign(this.polls[id], poll);\n results = this.saveResults(poll, results);\n } else {\n this.polls[id] = poll;\n\n poll.chosenIndexes = [];\n results = this.saveResults(poll, results);\n }\n\n return {poll, results};\n }\n\n public saveResults(poll: Poll, results: PollResults) {\n if(this.results[poll.id]) {\n results = Object.assign(this.results[poll.id], results);\n } else {\n this.results[poll.id] = results;\n }\n\n if(!results.pFlags.min) { // ! https://core.telegram.org/constructor/pollResults - min\n poll.chosenIndexes.length = 0;\n if(results?.results?.length) {\n results.results.forEach((answer, idx) => {\n if(answer.pFlags?.chosen) {\n poll.chosenIndexes.push(idx);\n }\n });\n }\n }\n\n return results;\n }\n\n public getPoll(pollId: PollId): {poll: Poll, results: PollResults} {\n return {\n poll: this.polls[pollId],\n results: this.results[pollId]\n };\n }\n\n public getInputMediaPoll(poll: Poll, correctAnswers?: Uint8Array[], solution?: string, solutionEntities?: MessageEntity[]): InputMedia.inputMediaPoll {\n if(solution) {\n if(!solutionEntities) {\n solutionEntities = [];\n }\n\n solution = parseMarkdown(solution, solutionEntities);\n } else {\n solution = undefined; // can be string here\n }\n\n return {\n _: 'inputMediaPoll',\n poll,\n correct_answers: correctAnswers,\n solution,\n solution_entities: solution ? solutionEntities : undefined\n };\n }\n\n public updatePollToMessage(message: Message.message, add: boolean) {\n const {id} = (message.media as MessageMedia.messageMediaPoll).poll;\n let set = this.pollToMessages[id];\n\n if(!add && !set) {\n return;\n }\n\n if(!set) {\n set = this.pollToMessages[id] = new Set();\n }\n\n const key = message.peerId + '_' + message.mid;\n if(add) set.add(key);\n else set.delete(key);\n\n if(!add && !set.size) {\n delete this.polls[id];\n delete this.results[id];\n delete this.pollToMessages[id];\n }\n }\n\n public sendVote(message: Message.message, optionIds: number[]): Promise {\n const poll: Poll = (message.media as MessageMedia.messageMediaPoll).poll;\n\n const options: Uint8Array[] = optionIds.map((index) => {\n return poll.answers[index].option;\n });\n\n const messageId = message.mid;\n const peerId = message.peerId;\n const inputPeer = this.appPeersManager.getInputPeerById(peerId);\n\n if(message.pFlags.is_outgoing) {\n return this.appMessagesManager.invokeAfterMessageIsSent(messageId, 'sendVote', (message) => {\n this.log('invoke sendVote callback');\n return this.sendVote(message as Message.message, optionIds);\n });\n }\n\n return this.apiManager.invokeApi('messages.sendVote', {\n peer: inputPeer,\n msg_id: getServerMessageId(message.mid),\n options\n }).then((updates) => {\n this.log('sendVote updates:', updates);\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public getResults(message: Message.message) {\n const inputPeer = this.appPeersManager.getInputPeerById(message.peerId);\n\n return this.apiManager.invokeApi('messages.getPollResults', {\n peer: inputPeer,\n msg_id: getServerMessageId(message.mid)\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n this.log('getResults updates:', updates);\n });\n }\n\n public getVotes(message: Message.message, option?: Uint8Array, offset?: string, limit = 20) {\n return this.apiManager.invokeApi('messages.getPollVotes', {\n peer: this.appPeersManager.getInputPeerById(message.peerId),\n id: getServerMessageId(message.mid),\n option,\n offset,\n limit\n }).then((votesList) => {\n this.log('getPollVotes messages:', votesList);\n\n this.appUsersManager.saveApiUsers(votesList.users);\n\n return votesList;\n });\n }\n\n public stopPoll(message: Message.message) {\n const poll: Poll = (message.media as MessageMedia.messageMediaPoll).poll;\n\n if(poll.pFlags.closed) return Promise.resolve();\n\n const newPoll = copy(poll);\n newPoll.pFlags.closed = true;\n return this.appMessagesManager.editMessage(message, undefined, {\n newMedia: this.getInputMediaPoll(newPoll)\n }).then(() => {\n // console.log('stopped poll');\n }, err => {\n this.log.error('stopPoll error:', err);\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 {InputPrivacyKey, InputPrivacyRule, PrivacyRule, PrivacyKey, GlobalPrivacySettings} from '../../layer';\nimport convertInputKeyToKey from '../../helpers/string/convertInputKeyToKey';\nimport {AppManager} from './manager';\n\nexport class AppPrivacyManager extends AppManager {\n private privacy: Partial<{\n [key in PrivacyKey['_']]: PrivacyRule[] | Promise\n }> = {};\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updatePrivacy: (update) => {\n const key = update.key._;\n this.privacy[key] = update.rules;\n this.rootScope.dispatchEvent('privacy_update', update);\n }\n });\n }\n\n public setPrivacy(inputKey: InputPrivacyKey['_'], rules: InputPrivacyRule[]) {\n return this.apiManager.invokeApi('account.setPrivacy', {\n key: {\n _: inputKey\n },\n rules\n }).then((privacyRules) => {\n this.appUsersManager.saveApiUsers(privacyRules.users);\n this.appChatsManager.saveApiChats(privacyRules.chats);\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updatePrivacy',\n key: {\n _: convertInputKeyToKey(inputKey)\n },\n rules: rules.map((inputRule) => {\n const rule: PrivacyRule = {} as any;\n Object.assign(rule, inputRule);\n rule._ = convertInputKeyToKey(rule._) as any;\n return rule;\n })\n });\n\n // console.log('privacy rules', inputKey, privacyRules, privacyRules.rules);\n\n return privacyRules.rules;\n });\n }\n\n public getPrivacy(inputKey: InputPrivacyKey['_']) {\n const privacyKey: PrivacyKey['_'] = convertInputKeyToKey(inputKey) as any;\n const rules = this.privacy[privacyKey];\n if(rules) {\n return Promise.resolve(rules);\n }\n\n return this.privacy[privacyKey] = this.apiManager.invokeApi('account.getPrivacy', {\n key: {\n _: inputKey\n }\n }).then((privacyRules) => {\n this.appUsersManager.saveApiUsers(privacyRules.users);\n this.appChatsManager.saveApiChats(privacyRules.chats);\n\n // console.log('privacy rules', inputKey, privacyRules, privacyRules.rules);\n\n return this.privacy[privacyKey] = privacyRules.rules;\n });\n }\n\n public getGlobalPrivacySettings() {\n return this.apiManager.invokeApi('account.getGlobalPrivacySettings');\n }\n\n public setGlobalPrivacySettings(settings: GlobalPrivacySettings) {\n return this.apiManager.invokeApi('account.setGlobalPrivacySettings', {settings});\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 type {MyTopPeer} from './appUsersManager';\nimport tsNow from '../../helpers/tsNow';\nimport {ChannelParticipantsFilter, ChannelsChannelParticipants, ChannelParticipant, Chat, ChatFull, ChatParticipants, ChatPhoto, ExportedChatInvite, InputChannel, InputFile, SendMessageAction, Update, UserFull, Photo, PhotoSize, Updates} from '../../layer';\nimport SearchIndex from '../searchIndex';\nimport {AppManager} from './manager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport getPhotoInput from './utils/photos/getPhotoInput';\nimport getParticipantPeerId from './utils/chats/getParticipantPeerId';\nimport ctx from '../../environment/ctx';\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport generateMessageId from './utils/messageId/generateMessageId';\n\nexport type UserTyping = Partial<{userId: UserId, action: SendMessageAction, timeout: number}>;\n\nconst PEER_FULL_TTL = 3 * 60e3;\n\nexport class AppProfileManager extends AppManager {\n // private botInfos: any = {};\n private usersFull: {[id: UserId]: UserFull.userFull} = {};\n private chatsFull: {[id: ChatId]: ChatFull} = {};\n private fullExpiration: {[peerId: PeerId]: number} = {};\n private typingsInPeer: {[key: string]: UserTyping[]};\n\n protected after() {\n this.apiUpdatesManager.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 this.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 this.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 this.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 this.rootScope.addEventListener('chat_update', (chatId) => {\n const fullChat = this.chatsFull[chatId];\n const chat: Chat.chat | Chat.channel | Chat.chatForbidden | Chat.channelForbidden = this.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 && fullChat.chat_photo._ !== 'photoEmpty'); // chat_photo can be missing\n if(\n hasChatPhoto !== hasFullChatPhoto || (\n hasChatPhoto &&\n photo.photo_id !== fullChat.chat_photo?.id\n )\n ) {\n updated = true;\n }\n }\n\n if(updated) {\n this.refreshFullPeer(chatId.toPeerId(true));\n }\n });\n\n this.rootScope.addEventListener('channel_update', (chatId) => {\n this.refreshFullPeer(chatId.toPeerId(true));\n });\n\n // * genius\n this.rootScope.addEventListener('chat_full_update', (chatId) => {\n this.rootScope.dispatchEvent('peer_full_update', chatId.toPeerId(true));\n });\n\n // * genius\n this.rootScope.addEventListener('user_full_update', (userId) => {\n this.rootScope.dispatchEvent('peer_full_update', userId.toPeerId(false));\n });\n\n this.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) {\n if(this.usersFull[id] && !override && Date.now() < this.fullExpiration[id.toPeerId()]) {\n return this.usersFull[id];\n }\n\n return this.apiManager.invokeApiSingleProcess({\n method: 'users.getFullUser',\n params: {\n id: this.appUsersManager.getUserInput(id)\n },\n processResult: (usersUserFull) => {\n this.appChatsManager.saveApiChats(usersUserFull.chats, true);\n this.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 = this.appPhotosManager.savePhoto(userFull.profile_photo, {type: 'profilePhoto', peerId});\n }\n\n const botInfo = userFull.bot_info;\n if(botInfo) {\n const referenceContext: ReferenceContext = {type: 'userFull', userId: id};\n botInfo.description_document = this.appDocsManager.saveDoc(botInfo.description_document, referenceContext);\n botInfo.description_photo = this.appPhotosManager.savePhoto(botInfo.description_photo, referenceContext);\n }\n\n this.appNotificationsManager.savePeerSettings({\n peerId,\n settings: userFull.notify_settings\n });\n\n this.usersFull[id] = userFull;\n this.fullExpiration[peerId] = Date.now() + PEER_FULL_TTL;\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 this.rootScope.dispatchEvent('user_full_update', id);\n return userFull;\n }\n });\n }\n\n public getProfileByPeerId(peerId: PeerId, override?: true) {\n if(this.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 async getFullPhoto(peerId: PeerId) {\n const profile = await this.getProfileByPeerId(peerId);\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 /* 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) {\n if(this.appChatsManager.isChannel(id)) {\n return this.getChannelFull(id, override);\n }\n\n const peerId = id.toPeerId(true);\n const fullChat = this.chatsFull[id] as ChatFull.chatFull;\n if(fullChat && !override && Date.now() < this.fullExpiration[peerId]) {\n const chat = this.appChatsManager.getChat(id) as Chat.chat;\n if(\n chat.pFlags.left ||\n chat.pFlags.deactivated ||\n chat.version === (fullChat.participants as ChatParticipants.chatParticipants).version\n ) {\n return fullChat as ChatFull;\n }\n }\n\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.getFullChat',\n params: {\n chat_id: id\n },\n processResult: (result) => {\n this.appChatsManager.saveApiChats(result.chats, true);\n this.appUsersManager.saveApiUsers(result.users);\n const chatFull = result.full_chat as ChatFull.chatFull;\n if(chatFull && chatFull.chat_photo && chatFull.chat_photo.id) {\n chatFull.chat_photo = this.appPhotosManager.savePhoto(chatFull.chat_photo, {type: 'profilePhoto', peerId});\n }\n\n if(chatFull.call) {\n this.appGroupCallsManager.saveGroupCall(chatFull.call, id);\n }\n\n // appMessagesManager.savePinnedMessage(peerId, fullChat.pinned_msg_id);\n this.appNotificationsManager.savePeerSettings({\n peerId,\n settings: chatFull.notify_settings\n });\n\n this.chatsFull[id] = chatFull;\n this.fullExpiration[peerId] = Date.now() + PEER_FULL_TTL;\n this.rootScope.dispatchEvent('chat_full_update', id);\n\n return chatFull;\n }\n });\n }\n\n public async getChatInviteLink(id: ChatId, force?: boolean) {\n const chatFull = await this.getChatFull(id);\n if(!force &&\n chatFull.exported_invite &&\n chatFull.exported_invite._ == 'chatInviteExported') {\n return chatFull.exported_invite.link;\n }\n\n return this.apiManager.invokeApi('messages.exportChatInvite', {\n peer: this.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 public getChannelParticipants(id: ChatId, filter: ChannelParticipantsFilter = {_: 'channelParticipantsRecent'}, limit = 200, offset = 0) {\n if(filter._ === 'channelParticipantsRecent') {\n const chat = this.appChatsManager.getChat(id);\n if(chat?.pFlags && (\n // chat.pFlags.kicked ||\n (chat as Chat.channel).pFlags.broadcast &&\n !(chat as Chat.channel).pFlags.creator &&\n !(chat as Chat.channel).admin_rights\n )) {\n return Promise.reject();\n }\n }\n\n return this.apiManager.invokeApiCacheable('channels.getParticipants', {\n channel: this.appChatsManager.getChannelInput(id),\n filter,\n offset,\n limit,\n hash: '0'\n }, {cacheSeconds: 60}).then((result) => {\n this.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 this.apiManager.invokeApiSingle('channels.getParticipant', {\n channel: this.appChatsManager.getChannelInput(id),\n participant: this.appPeersManager.getInputPeerById(peerId)\n }).then((channelParticipant) => {\n this.appUsersManager.saveApiUsers(channelParticipant.users);\n return channelParticipant.participant;\n });\n }\n\n public getChannelFull(id: ChatId, override?: true) {\n const peerId = id.toPeerId(true);\n if(this.chatsFull[id] !== undefined && !override && Date.now() < this.fullExpiration[peerId]) {\n return this.chatsFull[id] as ChatFull.channelFull;\n }\n\n return this.apiManager.invokeApiSingleProcess({\n method: 'channels.getFullChannel',\n params: {\n channel: this.appChatsManager.getChannelInput(id)\n },\n processResult: (result) => {\n this.appChatsManager.saveApiChats(result.chats, true);\n this.appUsersManager.saveApiUsers(result.users);\n const fullChannel = result.full_chat as ChatFull.channelFull;\n if(fullChannel && fullChannel.chat_photo.id) {\n fullChannel.chat_photo = this.appPhotosManager.savePhoto(fullChannel.chat_photo, {type: 'profilePhoto', peerId});\n // appPhotosManager.savePhoto(fullChannel.chat_photo);\n }\n\n if(fullChannel.call) {\n this.appGroupCallsManager.saveGroupCall(fullChannel.call, id);\n }\n\n this.appNotificationsManager.savePeerSettings({\n peerId,\n settings: fullChannel.notify_settings\n });\n\n this.chatsFull[id] = fullChannel;\n this.fullExpiration[peerId] = Date.now() + PEER_FULL_TTL;\n this.rootScope.dispatchEvent('chat_full_update', id);\n\n return fullChannel;\n },\n processError: (error) => {\n switch(error.type) {\n case 'CHANNEL_PRIVATE':\n const channel = this.appChatsManager.getChat(id) as Chat.channel | Chat.channelForbidden;\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates: [{\n _: 'updateChannel',\n channel_id: id\n }],\n chats: [channel._ === 'channelForbidden' ? channel : {\n _: 'channelForbidden',\n id,\n access_hash: channel.access_hash,\n title: channel.title,\n pFlags: channel.pFlags\n }],\n users: []\n } as Updates.updates);\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, this.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(this.appChatsManager.isChannel(chatId)) {\n promise = this.getChannelParticipants(chatId, {\n _: 'channelParticipantsMentions',\n q: query,\n top_msg_id: getServerMessageId(threadId)\n }, 50, 0).then((cP) => {\n return cP.participants.map((p) => getParticipantPeerId(p));\n });\n } else if(chatId) {\n promise = Promise.resolve(this.getChatFull(chatId)).then((chatFull) => {\n return ((chatFull as ChatFull.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 this.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 private invalidateChannelParticipants(id: ChatId) {\n this.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()) {\n const userId = peerId.toUserId();\n delete this.usersFull[userId];\n this.rootScope.dispatchEvent('user_full_update', userId);\n } else {\n const chatId = peerId.toChatId();\n delete this.chatsFull[chatId];\n this.rootScope.dispatchEvent('chat_full_update', chatId);\n }\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 this.apiManager.invokeApi('account.updateProfile', {\n first_name,\n last_name,\n about\n }).then((user) => {\n this.appUsersManager.saveApiUser(user);\n\n if(about !== undefined) {\n const peerId = user.id.toPeerId();\n const userFull = this.usersFull[user.id];\n if(userFull) {\n userFull.about = about;\n }\n\n this.rootScope.dispatchEvent('peer_bio_edit', peerId);\n }\n\n return this.getProfile(user.id, true);\n });\n }\n\n public uploadProfilePhoto(inputFile: InputFile) {\n return this.apiManager.invokeApi('photos.uploadProfilePhoto', {\n file: inputFile\n }).then((updateResult) => {\n // ! sometimes can have no user in users\n const photo = updateResult.photo as Photo.photo;\n if(!updateResult.users.length) {\n const strippedThumb = photo.sizes.find((size) => size._ === 'photoStrippedSize') as PhotoSize.photoStrippedSize;\n updateResult.users.push({\n ...this.appUsersManager.getSelf(),\n photo: {\n _: 'userProfilePhoto',\n dc_id: photo.dc_id,\n photo_id: photo.id,\n stripped_thumb: strippedThumb?.bytes,\n pFlags: {\n\n }\n }\n });\n }\n this.appUsersManager.saveApiUsers(updateResult.users);\n\n const myId = this.appPeersManager.peerId;\n this.appPhotosManager.savePhoto(updateResult.photo, {\n type: 'profilePhoto',\n peerId: myId\n });\n\n const userId = myId.toUserId();\n // this.apiUpdatesManager.processLocalUpdate({\n // _: 'updateUserPhoto',\n // user_id: userId,\n // date: tsNow(true),\n // photo: this.appUsersManager.getUser(userId).photo,\n // previous: true\n // });\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateUser',\n user_id: userId\n });\n });\n }\n\n public deletePhotos(photoIds: string[]) {\n return this.apiManager.invokeApiSingle('photos.deletePhotos', {\n id: photoIds.map((photoId) => {\n const photo = this.appPhotosManager.getPhoto(photoId);\n return getPhotoInput(photo);\n })\n }).then((deletedList) => {\n\n });\n }\n\n private verifyParticipantForOnlineCount(participant: {user_id: UserId}) {\n const user = this.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(this.appChatsManager.isBroadcast(id)) {\n return minOnline;\n }\n\n const chatInfo = await this.getChatFull(id);\n if(this.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 this.apiManager.invokeApiCacheable('messages.getOnlines', {\n peer: this.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 getTypingsKey(peerId: PeerId, threadId?: number) {\n return peerId + (threadId ? `_${threadId}` : '');\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 this.appPeersManager.getPeerId((update as Update.updateChatUserTyping).from_id);\n if(this.appPeersManager.peerId === fromId || update.action._ === 'speakingInGroupCallAction') {\n return;\n }\n\n const topMsgId = (update as Update.updateChannelUserTyping).top_msg_id;\n const threadId = topMsgId ? generateMessageId(topMsgId) : undefined;\n const peerId = this.appPeersManager.getPeerId(update);\n const key = this.getTypingsKey(peerId, threadId);\n const typings = this.typingsInPeer[key] ??= [];\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 this.rootScope.dispatchEvent('peer_typings', {peerId, threadId, typings});\n\n if(!typings.length) {\n delete this.typingsInPeer[key];\n }\n };\n\n if(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 = this.appUsersManager.hasUser(fromId);\n if(!hasUser) {\n // let's load user here\n if(update._ === 'updateChatUserTyping') {\n if(update.chat_id && this.appChatsManager.hasChat(update.chat_id) && !this.appChatsManager.isChannel(update.chat_id)) {\n Promise.resolve(this.getChatFull(update.chat_id)).then(() => {\n if(typing.timeout !== undefined && this.appUsersManager.hasUser(fromId)) {\n this.rootScope.dispatchEvent('peer_typings', {peerId, threadId, typings});\n }\n });\n }\n }\n\n // return;\n } else {\n this.appUsersManager.forceUserOnline(fromId);\n }\n\n typing.timeout = ctx.setTimeout(cancelAction, 6000);\n if(hasUser) {\n this.rootScope.dispatchEvent('peer_typings', {peerId, threadId, typings});\n }\n };\n\n private onUpdatePeerBlocked = (update: Update.updatePeerBlocked) => {\n const peerId = this.appPeersManager.getPeerId(update.peer_id);\n if(this.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 this.rootScope.dispatchEvent('user_full_update', userId);\n }\n\n this.rootScope.dispatchEvent('peer_block', {peerId, blocked: update.blocked});\n };\n\n public getPeerTypings(peerId: PeerId, threadId?: number) {\n return this.typingsInPeer[this.getTypingsKey(peerId, threadId)];\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 {Awaited} from '../types';\n\nexport default function callbackifyAll(\n values: T,\n callback: (result: { -readonly [P in keyof T]: Awaited }) => R\n): Promise> | R {\n if(values.some((value) => value instanceof Promise)) {\n return Promise.all(values).then(callback as any);\n } else {\n return callback(values as any);\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 findAndSplice from '../../helpers/array/findAndSplice';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport assumeType from '../../helpers/assumeType';\nimport callbackify from '../../helpers/callbackify';\nimport callbackifyAll from '../../helpers/callbackifyAll';\nimport copy from '../../helpers/object/copy';\nimport pause from '../../helpers/schedulers/pause';\nimport {AvailableReaction, Message, MessagePeerReaction, MessagesAvailableReactions, Reaction, ReactionCount, Update, Updates} from '../../layer';\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport {AppManager} from './manager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport reactionsEqual from './utils/reactions/reactionsEqual';\n\nconst SAVE_DOC_KEYS = [\n 'static_icon' as const,\n 'appear_animation' as const,\n 'select_animation' as const,\n 'activate_animation' as const,\n 'effect_animation' as const,\n 'around_animation' as const,\n 'center_icon' as const\n];\n\nconst REFERENCE_CONTEXT: ReferenceContext = {\n type: 'reactions'\n};\n\nexport class AppReactionsManager extends AppManager {\n private availableReactions: AvailableReaction[];\n private sendReactionPromises: Map>;\n private lastSendingTimes: Map;\n\n protected after() {\n this.rootScope.addEventListener('language_change', () => {\n this.availableReactions = undefined;\n this.getAvailableReactions();\n });\n\n this.sendReactionPromises = new Map();\n this.lastSendingTimes = new Map();\n\n this.rootScope.addEventListener('user_auth', () => {\n setTimeout(() => {\n Promise.resolve(this.getAvailableReactions()).then(async(availableReactions) => {\n for(const availableReaction of availableReactions) {\n await Promise.all([\n availableReaction.around_animation && this.apiFileManager.downloadMedia({media: availableReaction.around_animation}),\n availableReaction.static_icon && this.apiFileManager.downloadMedia({media: availableReaction.static_icon}),\n availableReaction.appear_animation && this.apiFileManager.downloadMedia({media: availableReaction.appear_animation}),\n availableReaction.center_icon && this.apiFileManager.downloadMedia({media: availableReaction.center_icon})\n ]);\n\n await pause(1000);\n }\n });\n }, 7.5e3);\n });\n }\n\n public getAvailableReactions() {\n if(this.availableReactions) return this.availableReactions;\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.getAvailableReactions',\n processResult: (messagesAvailableReactions) => {\n assumeType(messagesAvailableReactions);\n\n const availableReactions = this.availableReactions = messagesAvailableReactions.reactions;\n for(const reaction of availableReactions) {\n for(const key of SAVE_DOC_KEYS) {\n if(!reaction[key]) {\n continue;\n }\n\n reaction[key] = this.appDocsManager.saveDoc(reaction[key], REFERENCE_CONTEXT);\n }\n }\n\n return availableReactions;\n },\n params: {\n hash: 0\n }\n });\n }\n\n public getActiveAvailableReactions() {\n return callbackify(this.getAvailableReactions(), (availableReactions) => {\n return availableReactions.filter((availableReaction) => !availableReaction.pFlags.inactive);\n });\n }\n\n public getAvailableReactionsForPeer(peerId: PeerId) {\n const activeAvailableReactions = this.getActiveAvailableReactions();\n if(peerId.isUser()) {\n return this.unshiftQuickReaction(activeAvailableReactions);\n }\n\n const chatFull = this.appProfileManager.getChatFull(peerId.toChatId());\n return callbackifyAll([activeAvailableReactions, chatFull, this.getQuickReaction()], ([activeAvailableReactions, chatFull, quickReaction]) => {\n const chatAvailableReactions = chatFull.available_reactions ?? {_: 'chatReactionsNone'};\n\n let filteredChatAvailableReactions: AvailableReaction[] = [];\n if(chatAvailableReactions._ === 'chatReactionsAll') {\n filteredChatAvailableReactions = activeAvailableReactions;\n } else if(chatAvailableReactions._ === 'chatReactionsSome') {\n filteredChatAvailableReactions = chatAvailableReactions.reactions.map((reaction) => {\n return activeAvailableReactions.find((availableReaction) => availableReaction.reaction === (reaction as Reaction.reactionEmoji).emoticon);\n }).filter(Boolean);\n }\n\n return this.unshiftQuickReactionInner(filteredChatAvailableReactions, quickReaction);\n });\n }\n\n private unshiftQuickReactionInner(availableReactions: AvailableReaction[], quickReaction: Reaction | AvailableReaction) {\n if(quickReaction && quickReaction._ !== 'reactionEmoji' && quickReaction._ !== 'availableReaction') return availableReactions;\n const emoticon = (quickReaction as Reaction.reactionEmoji).emoticon || (quickReaction as AvailableReaction).reaction;\n const availableReaction = findAndSplice(availableReactions, (availableReaction) => availableReaction.reaction === emoticon);\n if(availableReaction) {\n availableReactions.unshift(availableReaction);\n }\n\n return availableReactions;\n }\n\n private unshiftQuickReaction(\n availableReactions: AvailableReaction[] | PromiseLike,\n quickReaction: ReturnType = this.getQuickReaction()\n ) {\n return callbackifyAll([\n availableReactions,\n quickReaction\n ], ([availableReactions, quickReaction]) => {\n return this.unshiftQuickReactionInner(availableReactions, quickReaction);\n });\n }\n\n public getAvailableReactionsByMessage(message: Message.message) {\n if(!message) return [];\n const peerId = (message.fwd_from?.channel_post && this.appPeersManager.isMegagroup(message.peerId) && message.fwdFromId) || message.peerId;\n return this.getAvailableReactionsForPeer(peerId);\n }\n\n public isReactionActive(reaction: string) {\n if(!this.availableReactions) return false;\n return !!this.availableReactions.find((availableReaction) => availableReaction.reaction === reaction);\n }\n\n public getQuickReaction() {\n return callbackifyAll([\n this.apiManager.getConfig(),\n this.getAvailableReactions()\n ], ([config, availableReactions]) => {\n const reaction = config.reactions_default;\n if(reaction?._ === 'reactionEmoji') {\n return availableReactions.find((availableReaction) => availableReaction.reaction === reaction.emoticon);\n }\n\n return reaction as Reaction.reactionCustomEmoji;\n });\n }\n\n public getReactionCached(reaction: string) {\n return this.availableReactions.find((availableReaction) => availableReaction.reaction === reaction);\n }\n\n public getReaction(reaction: string) {\n return callbackify(this.getAvailableReactions(), () => {\n return this.getReactionCached(reaction);\n });\n }\n\n public getMessagesReactions(peerId: PeerId, mids: number[]) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.getMessagesReactions',\n params: {\n id: mids.map((mid) => getServerMessageId(mid)),\n peer: this.appPeersManager.getInputPeerById(peerId)\n },\n processResult: (updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n // const update = (updates as Updates.updates).updates.find((update) => update._ === 'updateMessageReactions') as Update.updateMessageReactions;\n // return update.reactions;\n }\n });\n }\n\n public getMessageReactionsList(peerId: PeerId, mid: number, limit: number, reaction?: Reaction, offset?: string) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.getMessageReactionsList',\n params: {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: getServerMessageId(mid),\n limit,\n reaction,\n offset\n },\n processResult: (messageReactionsList) => {\n this.appUsersManager.saveApiUsers(messageReactionsList.users);\n return messageReactionsList;\n }\n });\n }\n\n public setDefaultReaction(reaction: Reaction) {\n return this.apiManager.invokeApi('messages.setDefaultReaction', {reaction}).then(async(value) => {\n if(value) {\n const appConfig = await this.apiManager.getConfig();\n if(appConfig) {\n appConfig.reactions_default = reaction;\n }/* else { // if no config or loading it - overwrite\n this.apiManager.getAppConfig(true);\n } */\n\n this.rootScope.dispatchEvent('quick_reaction', reaction);\n }\n\n return value;\n });\n }\n\n public async sendReaction(message: Message.message, reaction?: Reaction | AvailableReaction, onlyLocal?: boolean) {\n if(reaction._ === 'availableReaction') {\n reaction = {\n _: 'reactionEmoji',\n emoticon: reaction.reaction\n };\n }\n\n const limit = await this.apiManager.getLimit('reactions');\n\n const lastSendingTimeKey = message.peerId + '_' + message.mid;\n const lastSendingTime = this.lastSendingTimes.get(lastSendingTimeKey);\n if(lastSendingTime) {\n return;\n } else {\n this.lastSendingTimes.set(lastSendingTimeKey, Date.now());\n setTimeout(() => {\n this.lastSendingTimes.delete(lastSendingTimeKey);\n }, 333);\n }\n\n const {peerId, mid} = message;\n const myPeerId = this.appPeersManager.peerId;\n\n const unsetReactionCount = (reactionCount: ReactionCount) => {\n --reactionCount.count;\n delete reactionCount.chosen_order;\n\n if(reactionsEqual(reaction as Reaction, reactionCount.reaction)) {\n reaction = undefined as Reaction;\n }\n\n if(!reactionCount.count) {\n indexOfAndSplice(reactions.results, reactionCount);\n }/* else {\n insertInDescendSortedArray(reactions.results, chosenReaction, 'count', chosenReactionIdx);\n } */\n\n if(reactions.recent_reactions) {\n findAndSplice(reactions.recent_reactions, (recentReaction) => reactionsEqual(recentReaction.reaction, reactionCount.reaction) && this.appPeersManager.getPeerId(recentReaction.peer_id) === myPeerId);\n }\n\n if(!reactions.results.length) {\n reactions = undefined;\n }\n };\n\n const canSeeList = message.reactions?.pFlags?.can_see_list || !this.appPeersManager.isBroadcast(message.peerId) || message.peerId.isUser();\n if(!message.reactions) {\n message.reactions = {\n _: 'messageReactions',\n results: [],\n recent_reactions: canSeeList ? [] : undefined,\n pFlags: {\n can_see_list: canSeeList || undefined\n }\n };\n }\n\n let reactions = onlyLocal ? message.reactions : copy(message.reactions);\n const chosenReactions = reactions.results.filter((reactionCount) => reactionCount.chosen_order !== undefined);\n chosenReactions.sort((a, b) => b.chosen_order - a.chosen_order);\n const unsetReactions: ReactionCount[] = [];\n const chosenReactionIdx = chosenReactions.findIndex((reactionCount) => reactionsEqual(reactionCount.reaction, reaction as Reaction));\n if(chosenReactionIdx !== -1) unsetReactions.push(...chosenReactions.splice(chosenReactionIdx, 1));\n unsetReactions.push(...chosenReactions.splice(limit - +(chosenReactionIdx === -1)));\n unsetReactions.forEach((reactionCount) => {\n chosenReactions.forEach((chosenReactionCount) => {\n if(chosenReactionCount.chosen_order > reactionCount.chosen_order) {\n --chosenReactionCount.chosen_order;\n }\n });\n\n unsetReactionCount(reactionCount);\n });\n\n const chosenReactionsLength = chosenReactions.length;\n chosenReactions.forEach((reactionCount, idx) => {\n reactionCount.chosen_order = chosenReactionsLength - 1 - idx;\n });\n\n if(reaction) {\n if(!reactions) {\n reactions/* = message.reactions */ = {\n _: 'messageReactions',\n results: [],\n pFlags: {}\n };\n\n if(canSeeList) {\n reactions.pFlags.can_see_list = true;\n }\n }\n\n let reactionCountIdx = reactions.results.findIndex((reactionCount) => reactionsEqual(reactionCount.reaction, reaction as Reaction));\n let reactionCount = reactionCountIdx !== -1 && reactions.results[reactionCountIdx];\n if(!reactionCount) {\n reactionCount = {\n _: 'reactionCount',\n count: 0,\n reaction\n };\n\n reactionCountIdx = reactions.results.push(reactionCount) - 1;\n }\n\n ++reactionCount.count;\n reactionCount.chosen_order = chosenReactions.length ? chosenReactions[0].chosen_order + 1 : 0;\n chosenReactions.unshift(reactionCount);\n\n if(!reactions.recent_reactions && canSeeList) {\n reactions.recent_reactions = [];\n }\n\n if(reactions.recent_reactions) {\n const peerReaction: MessagePeerReaction = {\n _: 'messagePeerReaction',\n reaction,\n peer_id: this.appPeersManager.getOutputPeer(myPeerId),\n pFlags: {}\n };\n\n if(!this.appPeersManager.isMegagroup(peerId) && false) {\n reactions.recent_reactions.push(peerReaction);\n reactions.recent_reactions = reactions.recent_reactions.slice(-3);\n } else {\n reactions.recent_reactions.unshift(peerReaction);\n reactions.recent_reactions = reactions.recent_reactions.slice(0, 3);\n }\n }\n\n // insertInDescendSortedArray(reactions.results, reactionCount, 'count', reactionCountIdx);\n }\n\n const availableReactions = this.availableReactions;\n if(reactions && availableReactions?.length) {\n const indexes: Map = new Map();\n availableReactions.forEach((availableReaction, idx) => {\n indexes.set(availableReaction.reaction, idx);\n });\n\n reactions.results.sort((a, b) => {\n const id1 = (a.reaction as Reaction.reactionCustomEmoji).document_id || (a.reaction as Reaction.reactionEmoji).emoticon;\n const id2 = (b.reaction as Reaction.reactionCustomEmoji).document_id || (b.reaction as Reaction.reactionEmoji).emoticon;\n return (b.count - a.count) || ((indexes.get(id1) ?? 0) - (indexes.get(id2) ?? 0));\n });\n }\n\n if(onlyLocal) {\n message.reactions = reactions;\n this.rootScope.dispatchEvent('messages_reactions', [{message, changedResults: []}]);\n return Promise.resolve();\n }\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateMessageReactions',\n peer: message.peer_id,\n msg_id: message.id,\n reactions: reactions,\n local: true\n });\n\n const promiseKey = [peerId, mid].join('-');\n const msgId = getServerMessageId(mid);\n const promise = this.apiManager.invokeApi('messages.sendReaction', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: msgId,\n reaction: chosenReactions.map((reactionCount) => reactionCount.reaction)\n }).then((updates) => {\n assumeType(updates);\n\n const editMessageUpdateIdx = updates.updates.findIndex((update) => update._ === 'updateEditMessage' || update._ === 'updateEditChannelMessage');\n if(editMessageUpdateIdx !== -1) {\n const editMessageUpdate = updates.updates[editMessageUpdateIdx] as Update.updateEditMessage | Update.updateEditChannelMessage;\n updates.updates[editMessageUpdateIdx] = {\n _: 'updateMessageReactions',\n msg_id: msgId,\n peer: this.appPeersManager.getOutputPeer(peerId),\n reactions: (editMessageUpdate.message as Message.message).reactions,\n pts: editMessageUpdate.pts,\n pts_count: editMessageUpdate.pts_count\n };\n }\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n }).catch((err) => {\n if(err.type === 'REACTION_INVALID' && this.sendReactionPromises.get(promiseKey) === promise) {\n this.sendReaction(message, chosenReactions[0]?.reaction, true);\n }\n }).finally(() => {\n if(this.sendReactionPromises.get(promiseKey) === promise) {\n this.sendReactionPromises.delete(promiseKey);\n }\n });\n\n this.sendReactionPromises.set(promiseKey, promise);\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 {MyDocument} from './appDocsManager';\nimport type {DownloadOptions} from '../mtproto/apiFileManager';\nimport {Document, InputFileLocation, InputStickerSet, MessagesAllStickers, MessagesFavedStickers, MessagesFeaturedStickers, MessagesFoundStickerSets, MessagesRecentStickers, MessagesStickers, MessagesStickerSet, PhotoSize, StickerPack, StickerSet, StickerSetCovered, Update} from '../../layer';\nimport {Modify} from '../../types';\nimport AppStorage from '../storage';\nimport DATABASE_STATE from '../../config/databases/state';\nimport assumeType from '../../helpers/assumeType';\nimport fixBase64String from '../../helpers/fixBase64String';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport findAndSplice from '../../helpers/array/findAndSplice';\nimport {AppManager} from './manager';\nimport fixEmoji from '../richTextProcessor/fixEmoji';\nimport ctx from '../../environment/ctx';\nimport {getEnvironment} from '../../environment/utils';\nimport getDocumentInput from './utils/docs/getDocumentInput';\nimport getStickerEffectThumb from './utils/stickers/getStickerEffectThumb';\n\nconst CACHE_TIME = 3600e3;\n\ntype LOCAL_STICKER_SET_ID = Extract<\n InputStickerSet['_'],\n 'inputStickerSetAnimatedEmoji' | 'inputStickerSetAnimatedEmojiAnimations' |\n 'inputStickerSetPremiumGifts' | 'inputStickerSetEmojiGenericAnimations' |\n 'inputStickerSetEmojiDefaultStatuses' | 'inputStickerSetEmojiDefaultTopicIcons'\n>;\n\ntype LOCAL_ID = 'EMOJI' | 'EMOJI_ANIMATIONS' | 'PREMIUM_GIFTS' | 'GENERIC_ANIMATIONS' | 'DEFAULT_STATUSES' | 'DEFAULT_TOPIC_ICONS';\n\nconst LOCAL_IDS: {[key in LOCAL_ID]: LOCAL_STICKER_SET_ID} = {\n EMOJI: 'inputStickerSetAnimatedEmoji',\n EMOJI_ANIMATIONS: 'inputStickerSetAnimatedEmojiAnimations',\n PREMIUM_GIFTS: 'inputStickerSetPremiumGifts',\n GENERIC_ANIMATIONS: 'inputStickerSetEmojiGenericAnimations',\n DEFAULT_STATUSES: 'inputStickerSetEmojiDefaultStatuses',\n DEFAULT_TOPIC_ICONS: 'inputStickerSetEmojiDefaultTopicIcons'\n}\n\nconst LOCAL_IDS_SET: Set = new Set(Object.values(LOCAL_IDS) as any);\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 extends AppManager {\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: MyDocument[];\n private getGreetingStickersTimeout: number;\n private getGreetingStickersPromise: Promise;\n\n private sounds: Record;\n private getAnimatedEmojiSoundsPromise: Promise;\n\n private favedStickers: MyDocument[];\n private recentStickers: MyDocument[];\n\n private names: Record;\n\n protected after() {\n this.getStickerSetPromises = {};\n this.getStickersByEmoticonsPromises = {};\n this.sounds = {};\n this.names = {};\n\n this.rootScope.addEventListener('user_auth', () => {\n setTimeout(() => {\n this.getAnimatedEmojiStickerSet();\n // this.getFavedStickersStickers();\n }, 1000);\n\n if(!this.getGreetingStickersPromise && this.getGreetingStickersTimeout === undefined) {\n this.getGreetingStickersTimeout = ctx.setTimeout(() => {\n this.getGreetingStickersTimeout = undefined;\n this.getGreetingSticker(true);\n }, 5000);\n }\n });\n\n this.rootScope.addEventListener('app_config', () => this.onStickersUpdated('faved', true));\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateNewStickerSet: (update) => {\n const stickerSet = update.stickerset as MyMessagesStickerSet;\n this.saveStickerSet(stickerSet, stickerSet.set.id);\n this.rootScope.dispatchEvent('stickers_installed', stickerSet.set);\n },\n\n updateRecentStickers: () => this.onStickersUpdated('recent', true),\n\n updateFavedStickers: () => this.onStickersUpdated('faved', true),\n\n updateMoveStickerSetToTop: (update) => {\n this.rootScope.dispatchEvent('stickers_top', update.stickerset);\n }\n });\n }\n\n private async onStickersUpdated(type: 'faved' | 'recent', overwrite: boolean) {\n const stickers = await (type === 'faved' ? this.getFavedStickersStickers(overwrite) : this.getRecentStickersStickers(overwrite));\n this.rootScope.dispatchEvent('stickers_updated', {\n type,\n stickers\n });\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 this.apiFileManager.downloadMedia({media: this.greetingStickers[0]}); // preload next sticker\n\n return doc;\n });\n }\n\n private saveStickers(docs: Document[]) {\n forEachReverse(docs, (doc, idx) => {\n doc = this.appDocsManager.saveDoc(doc);\n\n if(!doc) docs.splice(idx, 1);\n else docs[idx] = doc;\n });\n }\n\n private canUseStickerSetCache(set: MyMessagesStickerSet, useCache?: boolean) {\n return set && set.documents?.length && ((Date.now() - set.refreshTime) < CACHE_TIME || useCache);\n }\n\n public getStickerSet(set: MyStickerSetInput, params: Partial<{\n overwrite: boolean,\n useCache: boolean,\n saveById: boolean\n }> = {}): Promise | MyMessagesStickerSet {\n let {id} = set;\n if(!set.access_hash) {\n set = this.names[id] || set;\n id = set.id;\n }\n\n if(this.getStickerSetPromises[id]) {\n return this.getStickerSetPromises[id];\n }\n\n if(!params.overwrite) {\n const cachedSet = this.storage.getFromCache(id);\n if(this.canUseStickerSetCache(cachedSet, params.useCache)) {\n return cachedSet;\n }\n }\n\n const promise = this.getStickerSetPromises[id] = new Promise(async(resolve) => {\n if(!params.overwrite) {\n const cachedSet = await this.storage.get(id);\n if(this.canUseStickerSetCache(cachedSet, params.useCache)) {\n this.saveStickers(cachedSet.documents);\n resolve(cachedSet);\n\n if(this.getStickerSetPromises[id] === promise) {\n delete this.getStickerSetPromises[id];\n }\n\n return;\n }\n }\n\n try {\n const stickerSet = await this.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 if(this.getStickerSetPromises[id] === promise) {\n delete this.getStickerSetPromises[id];\n }\n });\n\n return promise;\n }\n\n public getLocalStickerSet(id: LOCAL_STICKER_SET_ID) {\n return this.getStickerSet({id}, {saveById: true});\n }\n\n public getAnimatedEmojiStickerSet() {\n return Promise.all([\n this.getLocalStickerSet(LOCAL_IDS.EMOJI),\n this.getLocalStickerSet(LOCAL_IDS.EMOJI_ANIMATIONS),\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 const promise = this.getAnimatedEmojiSoundsPromise = Promise.all([\n this.apiManager.getAppConfig(overwrite),\n this.apiManager.getConfig()\n ]).then(([appConfig, config]) => {\n if(this.getAnimatedEmojiSoundsPromise !== promise) {\n return;\n }\n\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 = this.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: config.this_dc,\n file_reference: bytes,\n mime_type: 'audio/ogg'\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 return promise;\n }\n\n public async getRecentStickers(overwrite?: boolean): Promise> {\n const res = await this.apiManager.invokeApiHashable({\n method: 'messages.getRecentStickers',\n processResult: (res) => {\n assumeType(res);\n\n this.recentStickers = res.stickers as MyDocument[];\n this.saveStickers(res.stickers);\n return res;\n },\n overwrite\n });\n\n return res;\n }\n\n public getRecentStickersStickers(overwrite?: boolean) {\n if(overwrite) this.recentStickers = undefined;\n else if(this.recentStickers) return this.recentStickers;\n return this.getRecentStickers(overwrite).then(() => this.recentStickers);\n }\n\n public saveRecentSticker(docId: DocId, unsave?: boolean, attached?: boolean) {\n const doc = this.appDocsManager.getDoc(docId);\n\n findAndSplice(this.recentStickers, (_doc) => _doc.id === docId);\n if(!unsave) {\n this.recentStickers.unshift(doc);\n\n const docEmoticon = fixEmoji(doc.stickerEmojiRaw);\n for(const emoticon in this.getStickersByEmoticonsPromises) {\n const promise = this.getStickersByEmoticonsPromises[emoticon];\n promise.then((stickers) => {\n const _doc = findAndSplice(stickers, (_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 this.rootScope.dispatchEvent('sticker_updated', {type: 'recent', faved: !unsave, document: doc});\n\n if(unsave) {\n this.onStickersUpdated('recent', false);\n }\n\n return this.apiManager.invokeApi('messages.saveRecentSticker', {\n id: getDocumentInput(doc),\n unsave,\n attached\n });\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 id = isAnimation ? LOCAL_IDS.EMOJI_ANIMATIONS : LOCAL_IDS.EMOJI;\n const stickerSet = this.storage.getFromCache(id);\n // const stickerSet = await this.getStickerSet({id});\n if(!stickerSet?.documents) return;\n\n if(isAnimation) {\n if(['๐Ÿงก', '๐Ÿ’›', '๐Ÿ’š', '๐Ÿ’™', '๐Ÿ’œ', '๐Ÿ–ค', '๐Ÿค', '๐ŸคŽ'].includes(emoji)) {\n emoji = 'โค๏ธ';\n }\n }\n\n emoji = this.cleanEmoji(emoji);\n const pack = stickerSet.packs.find((p) => p.emoticon === emoji);\n return pack ? this.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) {\n const preloadEmojiPromise = this.getAnimatedEmojiStickerSet().then(() => {\n return this.getAnimatedEmojiSticker(emoji);\n });\n\n return Promise.all([\n preloadEmojiPromise,\n this.preloadAnimatedEmojiStickerAnimation(emoji)\n ]).then(([doc, a]) => {\n return {\n doc: doc,\n animation: a?.doc,\n sound: a?.sound\n };\n });\n }\n\n public preloadAnimatedEmojiStickerAnimation(emoji: string) {\n return this.getAnimatedEmojiStickerSet().then(() => {\n return this.getAnimatedEmojiSticker(emoji, true);\n }).then((doc) => {\n if(!doc) {\n return;\n }\n\n const sound = this.getAnimatedEmojiSoundDocument(emoji);\n return Promise.all([\n this.preloadSticker(doc.id),\n sound ? this.preloadSticker(sound.id) : undefined\n ]).then(() => {\n return {doc, sound};\n });\n });\n }\n\n public preloadSticker(docId: DocId, isPremiumEffect?: boolean) {\n const doc = this.appDocsManager.getDoc(docId);\n return this.apiFileManager.downloadMedia({media: doc, thumb: isPremiumEffect ? doc.video_thumbs?.[0] : undefined});\n }\n\n private saveStickerSet(res: Omit, id: DocId) {\n const newSet: MessagesStickerSet = {\n _: 'messages.stickerSet',\n set: res.set,\n packs: res.packs,\n documents: res.documents as Document[],\n keywords: res.keywords\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 if(stickerSet.set.short_name) {\n this.names[stickerSet.set.short_name] = this.getStickerSetInput(newSet.set) as any;\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): DownloadOptions {\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(LOCAL_IDS_SET.has(set.id as any)) {\n return {\n _: set.id as any\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 this.apiManager.invokeApiHashable({\n method: 'messages.getFeaturedStickers',\n processResult: (res) => {\n assumeType(res);\n\n forEachReverse(res.sets, (covered, idx, arr) => {\n if(covered.set.pFlags.videos && !getEnvironment().IS_WEBM_SUPPORTED) {\n arr.splice(idx, 1);\n }\n });\n\n res.sets.forEach((covered) => {\n this.saveStickerSet({set: covered.set, documents: [], packs: [], keywords: []}, covered.set.id);\n });\n\n return res;\n }\n });\n\n return res.sets;\n }\n\n public getPromoPremiumStickers() {\n return this.getStickersByEmoticon('โญ๏ธโญ๏ธ', false);\n }\n\n public getPremiumStickers() {\n return this.getStickersByEmoticon('๐Ÿ“‚โญ๏ธ', false);\n }\n\n public getFavedStickers(overwrite?: boolean) {\n return this.apiManager.invokeApiHashable({\n method: 'messages.getFavedStickers',\n processResult: (favedStickers) => {\n assumeType(favedStickers);\n this.saveStickers(favedStickers.stickers);\n this.favedStickers = favedStickers.stickers as MyDocument[];\n return favedStickers;\n },\n overwrite\n });\n }\n\n public getFavedStickersStickers(overwrite?: boolean) {\n if(overwrite) this.favedStickers = undefined;\n else if(this.favedStickers) return this.favedStickers;\n return this.getFavedStickers(overwrite).then(() => this.favedStickers);\n }\n\n public getFavedStickersLimit() {\n return this.apiManager.getLimit('favedStickers');\n }\n\n public async faveSticker(docId: DocId, unfave?: boolean) {\n if(!this.favedStickers) {\n await this.getFavedStickersStickers();\n }\n\n const limit = await this.getFavedStickersLimit();\n\n const doc = this.appDocsManager.getDoc(docId);\n findAndSplice(this.favedStickers, (_doc) => _doc.id === doc.id);\n\n if(!unfave) {\n this.favedStickers.unshift(doc);\n const spliced = this.favedStickers.splice(limit, this.favedStickers.length - limit);\n }\n\n this.rootScope.dispatchEvent('sticker_updated', {type: 'faved', faved: !unfave, document: doc});\n\n return this.apiManager.invokeApi('messages.faveSticker', {\n id: getDocumentInput(doc),\n unfave\n }).then(() => {\n if(unfave) {\n this.onStickersUpdated('faved', true);\n }\n });\n }\n\n public async toggleStickerSet(set: StickerSet.stickerSet) {\n set = this.storage.getFromCache(set.id).set;\n\n if(set.installed_date) {\n const res = await this.apiManager.invokeApi('messages.uninstallStickerSet', {\n stickerset: this.getStickerSetInput(set)\n });\n\n if(res) {\n delete set.installed_date;\n this.rootScope.dispatchEvent('stickers_deleted', set);\n this.storage.delete(set.id, true);\n return true;\n }\n } else {\n const res = await this.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 this.rootScope.dispatchEvent('stickers_installed', set);\n return true;\n }\n }\n\n return false;\n }\n\n public toggleStickerSets(sets: StickerSet.stickerSet[]) {\n return Promise.all(sets.map((set) => this.toggleStickerSet(set)));\n }\n\n public async searchStickerSets(query: string, excludeFeatured = true) {\n const flags = excludeFeatured ? 1 : 0;\n const res = await this.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 forEachReverse(res.sets, (covered, idx, arr) => {\n if(covered.set.pFlags.videos && !getEnvironment().IS_WEBM_SUPPORTED) {\n arr.splice(idx, 1);\n }\n });\n\n res.sets.forEach((covered) => {\n this.saveStickerSet({set: covered.set, documents: [], packs: [], keywords: []}, covered.set.id);\n });\n\n return res;\n }\n });\n\n const foundSaved: StickerSetCovered[] = [];\n const cache = this.storage.getCache();\n for(const 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 private processAllStickersResult = (allStickers: MessagesAllStickers) => {\n assumeType(allStickers);\n\n forEachReverse(allStickers.sets, (stickerSet, idx, arr) => {\n if(stickerSet.pFlags.videos && !getEnvironment().IS_WEBM_SUPPORTED) {\n arr.splice(idx, 1);\n }\n });\n\n return allStickers;\n };\n\n public getAllStickers() {\n return this.apiManager.invokeApiHashable({\n method: 'messages.getAllStickers',\n processResult: this.processAllStickersResult\n });\n }\n\n public getEmojiStickers() {\n return this.apiManager.invokeApiHashable({\n method: 'messages.getEmojiStickers',\n processResult: this.processAllStickersResult\n });\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 = fixEmoji(emoticon);\n if(this.getStickersByEmoticonsPromises[emoticon]) return this.getStickersByEmoticonsPromises[emoticon];\n\n return this.getStickersByEmoticonsPromises[emoticon] = Promise.all([\n this.apiManager.invokeApiHashable({\n method: 'messages.getStickers',\n params: {\n emoticon\n },\n processResult: (stickers) => stickers\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) => this.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 = fixEmoji(pack.emoticon);\n if(packEmoticon.includes(emoticon)) {\n for(const docId of pack.documents) {\n const doc = this.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 = parseEntities(emoticon);\n if(entities.length === 1) {\n [cachedStickersAnimated, cachedStickersStatic].forEach((s) => {\n forEachReverse(s, (doc, idx) => {\n const docEmoticon = 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 forEachReverse(stickers, (sticker, idx, arr) => {\n if((sticker.sticker === 3 && !getEnvironment().IS_WEBM_SUPPORTED) ||\n (!this.rootScope.premium && getStickerEffectThumb(sticker))) {\n arr.splice(idx, 1);\n }\n });\n\n return stickers;\n });\n }\n\n public clearRecentStickers() {\n if(this.recentStickers) {\n this.recentStickers.length = 0;\n this.onStickersUpdated('recent', false);\n }\n\n return this.apiManager.invokeApi('messages.clearRecentStickers');\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 * 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 filterUnique from '../../helpers/array/filterUnique';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport cleanSearchText from '../../helpers/cleanSearchText';\nimport cleanUsername from '../../helpers/cleanUsername';\nimport tsNow from '../../helpers/tsNow';\nimport isObject from '../../helpers/object/isObject';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport {isRestricted} from '../../helpers/restrictions';\nimport {Chat, ContactsResolvedPeer, InputContact, InputGeoPoint, InputMedia, InputPeer, InputUser, User as MTUser, UserProfilePhoto, UserStatus} from '../../layer';\nimport parseEntities from '../richTextProcessor/parseEntities';\nimport wrapUrl from '../richTextProcessor/wrapUrl';\nimport SearchIndex from '../searchIndex';\nimport {AppManager} from './manager';\nimport getPeerId from './utils/peers/getPeerId';\nimport canSendToUser from './utils/users/canSendToUser';\nimport {AppStoragesManager} from './appStoragesManager';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport getPeerActiveUsernames from './utils/peers/getPeerActiveUsernames';\n\nexport type User = MTUser.user;\nexport type TopPeerType = 'correspondents' | 'bots_inline';\nexport type MyTopPeer = {id: PeerId, rating: number};\n\nexport class AppUsersManager extends AppManager {\n private storage: AppStoragesManager['storages']['users'];\n\n private users: {[userId: UserId]: User};\n private usernames: {[username: string]: PeerId};\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 protected after() {\n this.clear(true);\n\n setInterval(this.updateUsersStatuses, 60000);\n\n this.rootScope.addEventListener('state_synchronized', this.updateUsersStatuses);\n\n this.apiUpdatesManager.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 -= this.timeManager.getServerTimeOffset();\n }\n\n if('was_online' in user.status) {\n user.status.was_online -= this.timeManager.getServerTimeOffset();\n }\n }\n\n // user.sortStatus = this.getUserStatusForSort(user.status);\n this.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 // this.rootScope.dispatchEvent('user_update', userId);\n // this.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({\n ...user,\n first_name: update.first_name,\n last_name: update.last_name,\n username: undefined,\n usernames: update.usernames\n }, true);\n }\n }\n });\n\n /* case 'updateContactLink':\n this.onContactUpdated(update.user_id, update.my_link._ === 'contactLinkContact');\n break; */\n\n this.rootScope.addEventListener('language_change', (e) => {\n const userId = this.getSelf().id;\n this.contactsIndex.indexObject(userId, this.getUserSearchText(userId));\n });\n\n return Promise.all([\n this.appStateManager.getState(),\n this.appStoragesManager.loadStorage('users')\n ]).then(([state, {results: users, storage}]) => {\n this.storage = storage;\n\n this.saveApiUsers(users);\n for(let i = 0, length = users.length; i < length; ++i) {\n const user = users[i];\n if(!user) {\n continue;\n }\n\n if(state.contactsListCachedTime && (user.pFlags.contact || user.pFlags.mutual_contact)) {\n this.pushContact(user.id);\n\n if(!this.contactsFillPromise) {\n this.contactsFillPromise = deferredPromise();\n this.contactsFillPromise.resolve(this.contactsList);\n }\n }\n }\n\n // const contactsList = state.contactsList;\n // if(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 const recentSearch = state.recentSearch || [];\n for(let i = 0, length = recentSearch.length; i < length; ++i) {\n this.peersStorage.requestPeer(recentSearch[i], 'recentSearch');\n }\n\n this.peersStorage.addEventListener('peerNeeded', (peerId) => {\n if(!this.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 this.peersStorage.addEventListener('peerUnneeded', (peerId) => {\n if(!this.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 for(const userId in this.users) {\n // const userId = +userId;\n if(!userId) continue;\n const peerId = userId.toPeerId();\n if(!this.peersStorage.isPeerNeeded(peerId)) {\n const user = this.users[userId];\n this.modifyUsernamesCache(user, false);\n\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 public get userId() {\n return this.rootScope.myId.toUserId();\n }\n\n private onContactsModified(fromServer?: boolean) {\n // const contactsList = [...this.contactsList];\n // this.appStateManager.pushToState('contactsList', contactsList);\n\n if(fromServer) {\n this.appStateManager.pushToState('contactsListCachedTime', tsNow(true));\n }\n }\n\n public pushRecentSearch(peerId: PeerId) {\n return this.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 this.appStateManager.pushToState('recentSearch', recentSearch);\n for(const peerId of recentSearch) {\n this.peersStorage.requestPeer(peerId, 'recentSearch');\n }\n }\n });\n }\n\n public clearRecentSearch() {\n return this.appStateManager.getState().then((state) => {\n const recentSearch = state.recentSearch || [];\n for(const peerId of recentSearch) {\n this.peersStorage.releasePeer(peerId, 'recentSearch');\n }\n\n recentSearch.length = 0;\n this.appStateManager.pushToState('recentSearch', recentSearch);\n });\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 this.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(true);\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 ||= promise\n };\n }\n\n public resolveUsername(username: string): Promise | Chat | User {\n if(username[0] === '@') {\n username = username.slice(1);\n }\n\n username = username.toLowerCase();\n const peerId = this.usernames[username];\n if(peerId) {\n return this.appPeersManager.getPeer(peerId);\n }\n\n return this.apiManager.invokeApiSingleProcess({\n method: 'contacts.resolveUsername',\n params: {username},\n processResult: (resolvedPeer) => this.processResolvedPeer(resolvedPeer)\n });\n }\n\n private processResolvedPeer(resolvedPeer: ContactsResolvedPeer.contactsResolvedPeer) {\n this.saveApiUsers(resolvedPeer.users);\n this.appChatsManager.saveApiChats(resolvedPeer.chats);\n\n return this.appPeersManager.getPeer(getPeerId(resolvedPeer.peer)) as Chat | User;\n }\n\n public resolvePhone(phone: string) {\n return this.apiManager.invokeApi('contacts.resolvePhone', {phone}).then((resolvedPeer) => {\n return this.processResolvedPeer(resolvedPeer) as User;\n });\n }\n\n private pushContact(id: UserId) {\n this.contactsList.add(id);\n this.contactsIndex.indexObject(id, this.getUserSearchText(id));\n this.peersStorage.requestPeer(id.toPeerId(), 'contact');\n }\n\n private popContact(id: UserId) {\n this.contactsList.delete(id);\n this.contactsIndex.indexObject(id, ''); // delete search index\n this.peersStorage.releasePeer(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 ...getPeerActiveUsernames(user),\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 = this.getUserStatusForSort(this.getUser(userId1).status);\n const status2 = this.getUserStatusForSort(this.getUser(userId2).status);\n return status2 - status1;\n });\n }\n\n const myUserId = this.userId;\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 limit?: number\n ) {\n return this.getContacts(query, includeSaved, sortBy).then((userIds) => {\n const peerIds = userIds.map((userId) => userId.toPeerId(false));\n if(limit) {\n return peerIds.slice(0, limit);\n }\n\n return peerIds;\n });\n }\n\n public toggleBlock(peerId: PeerId, block: boolean) {\n return this.apiManager.invokeApiSingle(block ? 'contacts.block' : 'contacts.unblock', {\n id: this.appPeersManager.getInputPeerById(peerId)\n }).then((value) => {\n if(value) {\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updatePeerBlocked',\n peer_id: this.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 public modifyUsernamesCache(peer: Parameters[0], save: boolean) {\n const usernames = getPeerActiveUsernames(peer);\n if(!usernames.length) {\n return;\n }\n\n const cleanedUsernames = usernames.map((username) => cleanUsername(username));\n if(save) {\n cleanedUsernames.forEach((searchUsername) => {\n this.usernames[searchUsername] = peer.id.toPeerId(peer._ !== 'user');\n });\n } else {\n cleanedUsernames.forEach((searchUsername) => {\n delete this.usernames[searchUsername];\n });\n }\n }\n\n public setUsernameToCache(peer: Parameters[0], oldPeer?: typeof peer) {\n if(\n !oldPeer ||\n (oldPeer as MTUser.user).username !== (peer as MTUser.user).username ||\n !deepEqual((oldPeer as MTUser.user).usernames, (peer as MTUser.user).usernames)\n ) {\n this.modifyUsernamesCache(oldPeer, false);\n this.modifyUsernamesCache(peer, true);\n\n return true;\n }\n\n return false;\n }\n\n public saveApiUser(user: MTUser, override?: boolean) {\n if(!user || 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 user.pFlags ??= {};\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 const changedUsername = this.setUsernameToCache(user, oldUser);\n\n if(!oldUser ||\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 } else {\n user.sortName = oldUser.sortName;\n }\n\n if(user.status) {\n if((user.status as UserStatus.userStatusOnline).expires) {\n (user.status as UserStatus.userStatusOnline).expires -= this.timeManager.getServerTimeOffset();\n }\n\n if((user.status as UserStatus.userStatusOffline).was_online) {\n (user.status as UserStatus.userStatusOffline).was_online -= this.timeManager.getServerTimeOffset();\n }\n }\n\n if((user as User).photo?._ === 'userProfilePhotoEmpty') {\n delete (user as User).photo;\n }\n\n // user.sortStatus = user.pFlags.bot ? -1 : this.getUserStatusForSort(user.status);\n\n // if(!user.username && user.usernames) {\n // user.username = user.usernames.find((username) => username.pFlags.active).username;\n // }\n\n if(oldUser === undefined) {\n this.users[userId] = user;\n } else {\n const changedTitle = user.first_name !== oldUser.first_name ||\n user.last_name !== oldUser.last_name ||\n changedUsername;\n\n const oldPhotoId = (oldUser.photo as UserProfilePhoto.userProfilePhoto)?.photo_id;\n const newPhotoId = (user.photo as UserProfilePhoto.userProfilePhoto)?.photo_id;\n const changedPhoto = oldPhotoId !== newPhotoId;\n\n const changedAnyBadge = oldUser.pFlags.premium !== user.pFlags.premium ||\n oldUser.pFlags.verified !== user.pFlags.verified ||\n oldUser.pFlags.scam !== user.pFlags.scam ||\n oldUser.pFlags.fake !== user.pFlags.fake;\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 this.rootScope.dispatchEvent('user_update', userId);\n\n if(wasContact !== newContact) {\n this.onContactUpdated(userId, newContact, wasContact);\n }\n\n if(changedPhoto) {\n this.rootScope.dispatchEvent('avatar_update', {peerId: user.id.toPeerId()});\n }\n\n if(changedTitle || changedAnyBadge) {\n this.rootScope.dispatchEvent('peer_title_edit', {peerId: user.id.toPeerId()});\n }\n }\n\n this.checkPremium(user, oldUser);\n this.setUserToStateIfNeeded(user);\n }\n\n private checkPremium(user: User, oldUser: User) {\n if(user.pFlags.self) {\n const isPremium = !!user.pFlags.premium;\n if(this.rootScope.premium !== isPremium) {\n this.rootScope.dispatchEvent('premium_toggle_private', {isNew: !oldUser, isPremium});\n }\n }\n }\n\n private setUserToStateIfNeeded(user: User) {\n if(this.peersStorage.isPeerNeeded(user.id.toPeerId())) {\n this.storage.set({\n [user.id]: user\n });\n }\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 const user = this.getUser(status);\n status = user?.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];\n }\n\n public getUserStatus(id: UserId) {\n return this.isRegularUser(id) && !this.users[id].pFlags.self && this.users[id].status;\n }\n\n public async getUserPhone(id: UserId) {\n const user = this.getUser(id);\n if(!user?.phone) {\n return;\n }\n\n const appConfig = await this.apiManager.getAppConfig();\n return {\n phone: user.phone,\n isAnonymous: appConfig.fragment_prefixes.some((prefix) => user.phone.startsWith(prefix))\n };\n }\n\n public getSelf() {\n return this.getUser(this.userId);\n }\n\n public isBot(id: UserId) {\n return this.users[id] && !!this.users[id].pFlags.bot;\n }\n\n public isAttachMenuBot(id: UserId) {\n return this.isBot(id) && !!this.users[id].pFlags.bot_attach_menu;\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 !== this.userId;\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 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 // ! do not use it, there are places that don't support it. need explicit peer id\n // if(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 private 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 private 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 this.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(this.apiUpdatesManager.updatesState.syncLoading) {\n return;\n }\n\n const user = this.getUser(id);\n if(user?.status &&\n user.status._ !== 'userStatusOnline' &&\n user.status._ !== 'userStatusEmpty' &&\n !user.pFlags.support &&\n !user.pFlags.deleted) {\n user.status = {\n _: 'userStatusOnline',\n expires: timestamp + onlineTimeFor\n };\n\n // user.sortStatus = this.getUserStatusForSort(user.status);\n this.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 this.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] = this.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 this.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 this.appChatsManager.saveApiChats(result.chats);\n\n if(result.categories.length) {\n topPeers = result.categories[0].peers.map((topPeer) => {\n const peerId = getPeerId(topPeer.peer);\n this.peersStorage.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 this.appStateManager.pushToState('topPeersCache', state.topPeersCache);\n\n return topPeers;\n });\n });\n }\n\n public getBlocked(offset = 0, limit = 0) {\n return this.apiManager.invokeApiSingle('contacts.getBlocked', {offset, limit}).then((contactsBlocked) => {\n this.saveApiUsers(contactsBlocked.users);\n this.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 this.apiManager.invokeApi('contacts.getLocated', {\n geo_point,\n background\n }).then((updates) => {\n this.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 // handle 't.me/username' as 'username'\n const entities = parseEntities(query);\n if(entities.length && entities[0].length === query.trim().length && entities[0]._ === 'messageEntityUrl') {\n try {\n const url = new URL(wrapUrl(query).url);\n const path = url.pathname.slice(1);\n if(path) {\n query = path;\n }\n } catch(err) {}\n }\n\n return this.apiManager.invokeApiCacheable('contacts.search', {\n q: query,\n limit\n }, {cacheSeconds: 60}).then((peers) => {\n this.saveApiUsers(peers.users);\n this.appChatsManager.saveApiChats(peers.chats);\n\n const out = {\n my_results: filterUnique(peers.my_results.map((p) => getPeerId(p))), // ! contacts.search returns duplicates in my_results\n results: peers.results.map((p) => 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 this.rootScope.dispatchEvent('contacts_update', userId);\n }\n }\n\n public updateUsername(username: string) {\n return this.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 this.rootScope.dispatchEvent('user_update', userId);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public updateMyOnlineStatus(offline: boolean) {\n this.setUserStatus(this.getSelf().id, offline);\n return this.apiManager.invokeApiSingle('account.updateStatus', {offline});\n }\n\n public addContact(userId: UserId, first_name: string, last_name: string, phone: string, addPhonePrivacyException?: boolean) {\n /* if(!userId) {\n return this.importContacts([{\n first_name,\n last_name,\n phones: [phone]\n }]);\n } */\n\n return this.apiManager.invokeApi('contacts.addContact', {\n id: this.getUserInput(userId),\n first_name,\n last_name,\n phone,\n add_phone_privacy_exception: addPhonePrivacyException\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates, {override: true});\n\n this.onContactUpdated(userId, true);\n });\n }\n\n public deleteContacts(userIds: UserId[]) {\n return this.apiManager.invokeApi('contacts.deleteContacts', {\n id: userIds.map((userId) => this.getUserInput(userId))\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates, {override: true});\n\n userIds.forEach((userId) => {\n this.onContactUpdated(userId, false);\n });\n });\n }\n\n public checkUsername(username: string) {\n return this.apiManager.invokeApi('account.checkUsername', {username});\n }\n\n public toggleUsername(username: string, active: boolean) {\n return this.apiManager.invokeApi('account.toggleUsername', {username, active});\n }\n\n public reorderUsernames(usernames: string[]) {\n return this.apiManager.invokeApi('account.reorderUsernames', {order: usernames});\n }\n\n public canSendToUser(userId: UserId) {\n return canSendToUser(this.getUser(userId));\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\nexport default function cleanUsername(username: string) {\n return username && username.toLowerCase() || '';\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 {ReferenceContext} from '../mtproto/referenceDatabase';\nimport {WebPage} from '../../layer';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport {AppManager} from './manager';\n\nconst photoTypeSet = new Set(['photo', 'video', 'gif', 'document']);\n\ntype WebPageMessageKey = `${PeerId}_${number}`;\n\nexport class AppWebPagesManager extends AppManager {\n private webpages: {\n [webPageId: string]: WebPage\n } = {};\n private pendingWebPages: {\n [webPageId: string]: Set\n } = {};\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateWebPage: (update) => {\n this.saveWebPage(update.webpage);\n }\n });\n }\n\n public saveWebPage(apiWebPage: WebPage, messageKey?: WebPageMessageKey, mediaContext?: ReferenceContext) {\n if(apiWebPage._ === 'webPageNotModified' || apiWebPage._ === 'webPageEmpty') return;\n const {id} = apiWebPage;\n\n const oldWebPage = this.webpages[id];\n const isUpdated = oldWebPage &&\n oldWebPage._ === apiWebPage._ &&\n (oldWebPage as WebPage.webPage).hash === (oldWebPage as WebPage.webPage).hash;\n\n if(apiWebPage._ === 'webPage') {\n if(apiWebPage.photo?._ === 'photo') {\n apiWebPage.photo = this.appPhotosManager.savePhoto(apiWebPage.photo, mediaContext);\n } else {\n delete apiWebPage.photo;\n }\n\n if(apiWebPage.document?._ === 'document') {\n apiWebPage.document = this.appDocsManager.saveDoc(apiWebPage.document, mediaContext);\n } else {\n if(apiWebPage.type === 'document') {\n delete apiWebPage.type;\n }\n\n delete apiWebPage.document;\n }\n\n const siteName = apiWebPage.site_name;\n const shortTitle = apiWebPage.title || apiWebPage.author || siteName || '';\n if(siteName && shortTitle === siteName) {\n delete apiWebPage.site_name;\n }\n\n // delete apiWebPage.description\n\n if(!photoTypeSet.has(apiWebPage.type) &&\n !apiWebPage.description &&\n apiWebPage.photo) {\n apiWebPage.type = 'photo';\n }\n }\n\n let pendingSet = this.pendingWebPages[id];\n if(messageKey) {\n if(!pendingSet) pendingSet = this.pendingWebPages[id] = new Set();\n pendingSet.add(messageKey);\n }\n\n if(oldWebPage === undefined) {\n this.webpages[id] = apiWebPage;\n } else {\n safeReplaceObject(oldWebPage, apiWebPage);\n }\n\n if(!messageKey && pendingSet !== undefined && isUpdated) {\n const msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[] = [];\n pendingSet.forEach((value) => {\n const [peerId, mid, isScheduled] = value.split('_');\n msgs.push({\n peerId: peerId.toPeerId(),\n mid: +mid,\n isScheduled: !!isScheduled\n });\n });\n\n this.rootScope.dispatchEvent('webpage_updated', {\n id,\n msgs\n });\n }\n\n return apiWebPage;\n }\n\n public getMessageKeyForPendingWebPage(peerId: PeerId, mid: number, isScheduled?: boolean): WebPageMessageKey {\n return peerId + '_' + mid + (isScheduled ? '_s' : '') as any;\n }\n\n public deleteWebPageFromPending(webPage: WebPage, messageKey: WebPageMessageKey) {\n const id = (webPage as WebPage.webPage).id;\n if(!id) return;\n\n const set = this.pendingWebPages[id];\n if(set && set.has(messageKey)) {\n set.delete(messageKey);\n\n if(!set.size) {\n delete this.pendingWebPages[id];\n }\n }\n }\n\n public getCachedWebPage(id: WebPage.webPage['id']) {\n return this.webpages[id];\n }\n\n public getWebPage(url: string) {\n return this.apiManager.invokeApiHashable({\n method: 'messages.getWebPage',\n processResult: (webPage) => {\n return this.saveWebPage(webPage);\n },\n params: {\n url\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 readBlobAs from './readBlobAs';\n\nexport default function readBlobAsArrayBuffer(blob: Blob) {\n return readBlobAs(blob, 'readAsArrayBuffer');\n}\n","export default function fileNameRFC(fileName: string) {\n // Make filename RFC5987 compatible\n return encodeURIComponent(fileName).replace(/['()]/g, escape).replace(/\\*/g, '%2A');\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 {getServiceMessagePort} from '../mtproto/mtproto.worker';\nimport ServiceMessagePort from '../serviceWorker/serviceMessagePort';\nimport StreamWriter from './streamWriter';\n\nexport default class DownloadWriter implements StreamWriter {\n constructor(\n private serviceMessagePort: ServiceMessagePort,\n private downloadId: string\n ) {\n this.serviceMessagePort = getServiceMessagePort();\n }\n\n public async write(part: Uint8Array, offset?: number) {\n return this.serviceMessagePort.invoke('downloadChunk', {\n id: this.downloadId,\n chunk: part\n });\n }\n\n public finalize(saveToStorage?: boolean): Promise {\n return this.serviceMessagePort.invoke('downloadFinalize', this.downloadId).then(() => undefined);\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 deferredPromise from '../../helpers/cancellablePromise';\nimport makeError from '../../helpers/makeError';\nimport fileNameRFC from '../../helpers/string/fileNameRFC';\nimport {getServiceMessagePort} from '../mtproto/mtproto.worker';\nimport DownloadWriter from './downloadWriter';\nimport FileStorage from './fileStorage';\n\nexport default class DownloadStorage implements FileStorage {\n public getFile(fileName: string): Promise {\n return Promise.reject(makeError('NO_ENTRY_FOUND'));\n }\n\n public prepareWriting({fileName, downloadId, size}: {\n fileName: string,\n downloadId: string,\n size: number\n }) {\n const headers = {\n 'Content-Type': 'application/octet-stream; charset=utf-8',\n 'Content-Disposition': 'attachment; filename*=UTF-8\\'\\'' + fileNameRFC(fileName),\n ...(size ? {'Content-Length': size} : {})\n };\n\n const serviceMessagePort = getServiceMessagePort();\n const promise = serviceMessagePort.invoke('download', {\n headers,\n id: downloadId\n });\n\n const deferred = deferredPromise();\n deferred.cancel = () => {\n deferred.reject(makeError('DOWNLOAD_CANCELED'));\n };\n\n deferred.catch(() => {\n getServiceMessagePort().invoke('downloadCancel', downloadId);\n });\n\n promise.then(deferred.resolve, deferred.reject);\n\n return {\n deferred,\n getWriter: () => {\n return new DownloadWriter(serviceMessagePort, downloadId);\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 * 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 {ReferenceBytes} from './referenceDatabase';\nimport Modes from '../../config/modes';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport {randomLong} from '../../helpers/random';\nimport {Document, InputFile, InputFileLocation, InputWebFileLocation, Photo, PhotoSize, UploadFile, UploadWebFile, VideoSize, WebDocument} from '../../layer';\nimport {DcId} from '../../types';\nimport CacheStorageController from '../files/cacheStorage';\nimport {logger, LogTypes} from '../logger';\nimport assumeType from '../../helpers/assumeType';\nimport noop from '../../helpers/noop';\nimport readBlobAsArrayBuffer from '../../helpers/blob/readBlobAsArrayBuffer';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport findAndSplice from '../../helpers/array/findAndSplice';\nimport fixFirefoxSvg from '../../helpers/fixFirefoxSvg';\nimport {AppManager} from '../appManagers/manager';\nimport {getEnvironment} from '../../environment/utils';\nimport MTProtoMessagePort from './mtprotoMessagePort';\nimport getFileNameForUpload from '../../helpers/getFileNameForUpload';\nimport type {Progress} from '../appManagers/appDownloadManager';\nimport getDownloadMediaDetails from '../appManagers/utils/download/getDownloadMediaDetails';\n// import networkStats from './networkStats';\nimport getDownloadFileNameFromOptions from '../appManagers/utils/download/getDownloadFileNameFromOptions';\nimport StreamWriter from '../files/streamWriter';\nimport FileStorage from '../files/fileStorage';\nimport {MAX_FILE_SAVE_SIZE} from './mtproto_config';\nimport throttle from '../../helpers/schedulers/throttle';\nimport makeError from '../../helpers/makeError';\nimport readBlobAsUint8Array from '../../helpers/blob/readBlobAsUint8Array';\nimport DownloadStorage from '../files/downloadStorage';\nimport copy from '../../helpers/object/copy';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport {EXTENSION_MIME_TYPE_MAP, MIME_TYPE_EXTENSION_MAP} from '../../environment/mimeTypeMap';\nimport {getServiceMessagePort} from './mtproto.worker';\n\ntype Delayed = {\n offset: number,\n writePromise: CancellablePromise,\n writeDeferred: CancellablePromise\n};\n\nexport type DownloadOptions = {\n dcId: DcId,\n location: InputFileLocation | InputWebFileLocation,\n size?: number,\n fileName?: string,\n mimeType?: MTMimeType,\n limitPart?: number,\n queueId?: number,\n onlyCache?: boolean,\n downloadId?: string\n // getFileMethod: Parameters[1]\n};\n\nexport type DownloadMediaOptions = {\n media: Photo.photo | Document.document | WebDocument,\n thumb?: PhotoSize | VideoSize,\n queueId?: number,\n onlyCache?: boolean,\n downloadId?: string\n};\n\ntype DownloadPromise = CancellablePromise;\n\nexport type MyUploadFile = UploadFile.uploadFile | UploadWebFile.uploadWebFile;\n\n// export interface RefreshReferenceTask extends WorkerTaskVoidTemplate {\n// type: 'refreshReference',\n// payload: ReferenceBytes,\n// };\n\n// export interface RefreshReferenceTaskResponse extends WorkerTaskVoidTemplate {\n// type: 'refreshReference',\n// payload: ReferenceBytes,\n// originalPayload: ReferenceBytes\n// };\n\nconst MAX_DOWNLOAD_FILE_PART_SIZE = 1 * 1024 * 1024;\nconst MAX_UPLOAD_FILE_PART_SIZE = 512 * 1024;\nconst MIN_PART_SIZE = 128 * 1024;\nconst AVG_PART_SIZE = 512 * 1024;\n\nconst REGULAR_DOWNLOAD_DELTA = (9 * 512 * 1024) / MIN_PART_SIZE;\n// const PREMIUM_DOWNLOAD_DELTA = REGULAR_DOWNLOAD_DELTA * 2;\nconst PREMIUM_DOWNLOAD_DELTA = (56 * 512 * 1024) / MIN_PART_SIZE;\n\nconst IGNORE_ERRORS: Set = new Set([\n 'DOWNLOAD_CANCELED',\n 'UPLOAD_CANCELED',\n 'UNKNOWN',\n 'NO_NEW_CONTEXT'\n]);\n\nexport class ApiFileManager extends AppManager {\n private cacheStorage = new CacheStorageController('cachedFiles');\n private downloadStorage = new DownloadStorage();\n\n private downloadPromises: {\n [fileName: string]: DownloadPromise\n } = {};\n\n // private downloadToDiscPromises: {\n // [fileName: string]: DownloadPromise\n // } = {};\n\n private uploadPromises: {\n [fileName: string]: CancellablePromise\n } = {};\n\n private downloadPulls: {\n [dcId: string]: Array<{\n id: number,\n queueId: number,\n cb: () => Promise,\n deferred: {\n resolve: (...args: any[]) => void,\n reject: (...args: any[]) => void\n },\n activeDelta: number\n }>\n } = {};\n private downloadActives: {[dcId: string]: number} = {};\n\n public refreshReferencePromises: {\n [referenceHex: string]: {\n deferred: CancellablePromise,\n timeout?: number\n }\n } = {};\n\n private log: ReturnType = logger('AFM', LogTypes.Error | LogTypes.Log);\n private tempId = 0;\n private queueId = 0;\n private debug = Modes.debug;\n\n private maxUploadParts = 4000;\n private maxDownloadParts = 8000;\n private webFileDcId: DcId;\n\n protected after() {\n setInterval(() => { // clear old promises\n for(const hex in this.refreshReferencePromises) {\n const {deferred} = this.refreshReferencePromises[hex];\n if(deferred.isFulfilled || deferred.isRejected) {\n delete this.refreshReferencePromises[hex];\n }\n }\n }, 1800e3);\n\n this.rootScope.addEventListener('config', (config) => {\n this.webFileDcId = config.webfile_dc_id;\n });\n\n this.rootScope.addEventListener('app_config', (appConfig) => {\n this.maxUploadParts = this.rootScope.premium ? appConfig.upload_max_fileparts_premium : appConfig.upload_max_fileparts_default;\n this.maxDownloadParts = appConfig.upload_max_fileparts_premium;\n });\n }\n\n private downloadRequest(dcId: 'upload', id: number, cb: () => Promise, activeDelta: number, queueId?: number): Promise;\n private downloadRequest(dcId: number, id: number, cb: () => Promise, activeDelta: number, queueId?: number): Promise;\n private downloadRequest(dcId: number | string, id: number, cb: () => Promise, activeDelta: number, queueId: number = 0) {\n if(this.downloadPulls[dcId] === undefined) {\n this.downloadPulls[dcId] = [];\n this.downloadActives[dcId] = 0;\n }\n\n const downloadPull = this.downloadPulls[dcId];\n\n const promise = new Promise((resolve, reject) => {\n downloadPull.push({id, queueId, cb, deferred: {resolve, reject}, activeDelta});\n });\n\n setTimeout(() => {\n this.downloadCheck(dcId);\n }, 0);\n\n return promise;\n }\n\n private downloadCheck(dcId: string | number) {\n const downloadPull = this.downloadPulls[dcId];\n const downloadLimit = /* dcId === 'upload' ? 24 : */(this.rootScope.premium ? PREMIUM_DOWNLOAD_DELTA : REGULAR_DOWNLOAD_DELTA);\n // const downloadLimit = Infinity;\n\n if(this.downloadActives[dcId] >= downloadLimit || !downloadPull?.length) {\n return false;\n }\n\n // const data = downloadPull.shift();\n const data = findAndSplice(downloadPull, (d) => d.queueId === 0) || findAndSplice(downloadPull, (d) => d.queueId === this.queueId) || downloadPull.shift();\n const activeDelta = data.activeDelta || 1;\n\n this.downloadActives[dcId] += activeDelta;\n\n const promise = data.cb();\n // const networkPromise = networkStats.waitForChunk(dcId as DcId, activeDelta * MIN_PART_SIZE);\n /* Promise.race([\n promise\n // networkPromise\n ]) */promise.then(() => {\n this.downloadActives[dcId] -= activeDelta;\n this.downloadCheck(dcId);\n\n // networkPromise.resolve();\n }, (error: ApiError) => {\n if(!error?.type || !IGNORE_ERRORS.has(error.type)) {\n this.log.error('downloadCheck error:', error);\n }\n\n this.downloadActives[dcId] -= activeDelta;\n this.downloadCheck(dcId);\n\n // networkPromise.reject(error);\n }).finally(() => {\n promise.then(data.deferred.resolve, data.deferred.reject);\n });\n }\n\n public setQueueId(queueId: number) {\n // this.log.error('setQueueId', queueId);\n this.queueId = queueId;\n }\n\n private getFileStorage() {\n return this.cacheStorage;\n }\n\n public cancelDownload(fileName: string) {\n const promises = [this.downloadPromises[fileName], this.uploadPromises[fileName]].filter(Boolean);\n let canceled = false;\n for(let i = 0, length = promises.length; i < length; ++i) {\n const promise = promises[i];\n if(promise && !promise.isRejected && !promise.isFulfilled) {\n promise.cancel();\n canceled = true;\n }\n }\n\n return canceled;\n }\n\n public requestWebFilePart(\n dcId: DcId,\n location: InputWebFileLocation,\n offset: number,\n limit: number,\n id = 0,\n queueId = 0,\n checkCancel?: () => void\n ) {\n return this.downloadRequest(dcId, id, async() => { // do not remove async, because checkCancel will throw an error\n checkCancel?.();\n\n if('url' in location) {\n const url = location.url;\n if(this.isLocalWebFile(url)) {\n return fetch(url)\n .then((response) => response.arrayBuffer())\n .then((arrayBuffer) => {\n const extension = url.split('.').pop() as MTFileExtension;\n const mimeType = EXTENSION_MIME_TYPE_MAP[extension] || 'application/octet-stream';\n return {\n _: 'upload.webFile',\n size: arrayBuffer.byteLength,\n mime_type: mimeType,\n file_type: {_: 'storage.fileUnknown'},\n mtime: 0,\n bytes: new Uint8Array(arrayBuffer)\n };\n });\n }\n }\n\n return this.apiManager.invokeApi('upload.getWebFile', {\n location,\n offset,\n limit\n }, {\n dcId,\n fileDownload: true\n });\n }, this.getDelta(limit), queueId);\n }\n\n public requestFilePart(\n dcId: DcId,\n location: InputFileLocation,\n offset: number,\n limit: number,\n id = 0,\n queueId = 0,\n checkCancel?: () => void\n ) {\n return this.downloadRequest(dcId, id, async() => { // do not remove async, because checkCancel will throw an error\n checkCancel?.();\n\n const invoke = async(): Promise => {\n checkCancel?.(); // do not remove async, because checkCancel will throw an error\n\n // * IMPORTANT: reference can be changed in previous request\n const reference = (location as InputFileLocation.inputDocumentFileLocation).file_reference?.slice();\n\n const promise = // pause(offset > (100 * 1024 * 1024) ? 10000000 : 0).then(() =>\n this.apiManager.invokeApi('upload.getFile', {\n location,\n offset,\n limit\n }, {\n dcId,\n fileDownload: true\n }) as Promise/* ) */;\n\n return promise.catch((err: ApiError) => {\n checkCancel?.();\n\n if(err.type === 'FILE_REFERENCE_EXPIRED') {\n return this.refreshReference(location as InputFileLocation.inputDocumentFileLocation, reference).then(invoke);\n }\n\n throw err;\n });\n };\n\n assumeType(location);\n const reference = location.file_reference;\n if(reference && !location.checkedReference) { // check stream's location because it's new every call\n location.checkedReference = true;\n const hex = bytesToHex(reference);\n if(this.refreshReferencePromises[hex]) {\n return this.refreshReference(location, reference).then(invoke);\n }\n }\n\n return invoke();\n }, this.getDelta(limit), queueId);\n }\n\n /* private convertBlobToBytes(blob: Blob) {\n return blob.arrayBuffer().then((buffer) => new Uint8Array(buffer));\n } */\n\n private getDelta(bytes: number) {\n return bytes / MIN_PART_SIZE;\n }\n\n private getLimitPart(size: number, isUpload: boolean): number {\n if(!size) { // * sometimes size can be 0 (e.g. avatars, webDocuments)\n return AVG_PART_SIZE;\n }\n\n // return 1 * 1024 * 1024;\n\n let bytes = MIN_PART_SIZE;\n\n const maxParts = isUpload ? this.maxUploadParts : this.maxDownloadParts;\n const maxPartSize = isUpload ? MAX_UPLOAD_FILE_PART_SIZE : MAX_DOWNLOAD_FILE_PART_SIZE;\n // usually it will stick to 512Kb size if the file is too big\n while((size / bytes) > maxParts && bytes < maxPartSize) {\n bytes *= 2;\n }\n /* if(size < 1e6 || !size) bytes = 512;\n else if(size < 3e6) bytes = 256;\n else bytes = 128; */\n\n return bytes;\n }\n\n private uncompressTGS = (bytes: Uint8Array, fileName: string) => {\n // this.log('uncompressTGS', bytes, bytes.slice().buffer);\n // slice ะฝัƒะถะตะฝ ะฟะพั‚ะพะผัƒ ั‡ั‚ะพ ะฒ uint8array - 5053 length, ะฒ arraybuffer - 5084\n return this.cryptoWorker.invokeCrypto('gzipUncompress', bytes.slice().buffer, false) as Promise;\n };\n\n private uncompressTGV = (bytes: Uint8Array, fileName: string) => {\n // this.log('uncompressTGS', bytes, bytes.slice().buffer);\n // slice ะฝัƒะถะตะฝ ะฟะพั‚ะพะผัƒ ั‡ั‚ะพ ะฒ uint8array - 5053 length, ะฒ arraybuffer - 5084\n const buffer = bytes.slice().buffer;\n if(getEnvironment().IS_FIREFOX) {\n return this.cryptoWorker.invokeCrypto('gzipUncompress', buffer, true).then((text) => {\n return fixFirefoxSvg(text as string);\n }).then((text) => {\n const textEncoder = new TextEncoder();\n return textEncoder.encode(text);\n });\n }\n\n return this.cryptoWorker.invokeCrypto('gzipUncompress', buffer, false) as Promise;\n };\n\n private convertWebp = (bytes: Uint8Array, fileName: string) => {\n const instance = MTProtoMessagePort.getInstance();\n return instance.invoke('convertWebp', {fileName, bytes});\n };\n\n private convertOpus = (bytes: Uint8Array, fileName: string) => {\n const instance = MTProtoMessagePort.getInstance();\n return instance.invoke('convertOpus', {fileName, bytes});\n };\n\n private refreshReference(\n inputFileLocation: InputFileLocation.inputDocumentFileLocation,\n reference: typeof inputFileLocation['file_reference'],\n hex = bytesToHex(reference)\n ) {\n let r = this.refreshReferencePromises[hex];\n if(!r) {\n const deferred = deferredPromise();\n\n r = this.refreshReferencePromises[hex] = {\n deferred\n\n // ! I don't remember what it was for...\n // timeout: ctx.setTimeout(() => {\n // this.log.error('Didn\\'t refresh the reference:', inputFileLocation);\n // deferred.reject(makeError('REFERENCE_IS_NOT_REFRESHED'));\n // }, 60000)\n };\n\n // deferred.catch(noop).finally(() => {\n // clearTimeout(r.timeout);\n // });\n\n this.referenceDatabase.refreshReference(reference).then((reference) => {\n if(hex === bytesToHex(reference)) {\n deferred.reject(makeError('REFERENCE_IS_NOT_REFRESHED'));\n }\n\n deferred.resolve(reference);\n }, deferred.reject);\n }\n\n // have to replace file_reference in any way, because location can be different everytime if it's stream\n return r.deferred.then((reference) => {\n inputFileLocation.file_reference = reference;\n });\n }\n\n public isDownloading(fileName: string) {\n return !!this.downloadPromises[fileName];\n }\n\n public getDownload(fileName: string) {\n return this.downloadPromises[fileName];\n }\n\n public getUpload(fileName: string) {\n return this.uploadPromises[fileName];\n }\n\n private getConvertMethod(mimeType: MTMimeType) {\n let process: ApiFileManager['uncompressTGS'] | ApiFileManager['convertWebp'];\n if(mimeType === 'application/x-tgwallpattern') {\n process = this.uncompressTGV;\n mimeType = 'image/svg+xml';\n } else if(mimeType === 'image/webp' && !getEnvironment().IS_WEBP_SUPPORTED) {\n process = this.convertWebp;\n mimeType = 'image/png';\n } else if(mimeType === 'application/x-tgsticker') {\n process = this.uncompressTGS;\n mimeType = 'application/json';\n } else if(mimeType === 'audio/ogg' && !getEnvironment().IS_OPUS_SUPPORTED) {\n process = this.convertOpus;\n mimeType = 'audio/wav';\n }\n\n return {mimeType, process};\n }\n\n private allocateDeferredPromises(startOffset: number, size: number, limitPart: number) {\n const delayed: Delayed[] = [];\n let offset = startOffset;\n let writePromise: CancellablePromise = Promise.resolve(),\n writeDeferred: CancellablePromise;\n do {\n writeDeferred = deferredPromise();\n delayed.push({offset, writePromise, writeDeferred});\n writePromise = writeDeferred;\n offset += limitPart;\n } while(offset < size);\n\n return delayed;\n }\n\n private isLocalWebFile(url: string) {\n return url.startsWith('assets/');\n }\n\n public download(options: DownloadOptions): DownloadPromise {\n const size = options.size ?? 0;\n const {dcId, location} = options;\n let {downloadId} = options;\n if(downloadId && !getServiceMessagePort()) {\n this.log.error('download fallback to blob', options);\n downloadId = undefined;\n }\n\n const originalMimeType = options.mimeType;\n const convertMethod = this.getConvertMethod(originalMimeType);\n const {process} = convertMethod;\n options.mimeType = convertMethod.mimeType || 'image/jpeg';\n\n const fileName = getDownloadFileNameFromOptions(options);\n const cacheFileName = downloadId ? getDownloadFileNameFromOptions({...copy(options), downloadId: undefined}) : fileName;\n const cacheStorage: FileStorage = this.getFileStorage();\n const downloadStorage: FileStorage = downloadId ? this.downloadStorage : undefined;\n let deferred: DownloadPromise = downloadId ? undefined : this.downloadPromises[fileName];\n\n this.debug && this.log('downloadFile', fileName, options);\n\n if(deferred) {\n return deferred;\n }\n\n // if(deferred) {\n // if(size) {\n // return deferred.then(async(blob) => {\n // if(blob instanceof Blob && blob.size < size) {\n // this.debug && this.log('downloadFile need to deleteFile, wrong size:', blob.size, size);\n\n // try {\n // await this.delete(fileName);\n // } finally {\n // return this.download(options);\n // }\n // } else {\n // return blob;\n // }\n // });\n // } else {\n // return deferred;\n // }\n // }\n\n const errorHandler = (item: typeof cachePrepared, error: ApiError) => {\n if(item?.error) {\n return;\n }\n\n for(const p of prepared) {\n if(item && item !== p) {\n continue;\n }\n\n p.error = error;\n p.deferred.reject(error);\n }\n };\n\n const isWebFile = location._ === 'inputWebFileLocation';\n const isLocalWebFile = isWebFile && this.isLocalWebFile(location.url);\n const id = this.tempId++;\n const limitPart = isLocalWebFile ?\n size :\n options.limitPart || this.getLimitPart(size, false);\n\n let getFile: FileStorage['getFile'] = cacheStorage.getFile.bind(cacheStorage);\n\n let cachePrepared: ReturnType & {writer?: StreamWriter, error?: ApiError},\n downloadPrepared: typeof cachePrepared;\n const prepared: (typeof cachePrepared)[] = [];\n const possibleSize = size || limitPart;\n\n const getErrorsCount = () => prepared.reduce((acc, item) => acc + +!!item.error, 0);\n\n const attach = (item: typeof cachePrepared, fileName: string) => {\n const {deferred} = item;\n const _errorHandler = errorHandler.bind(null, item);\n\n deferred.cancel = () => deferred.reject(makeError('DOWNLOAD_CANCELED'));\n deferred.catch((error) => {\n _errorHandler(error);\n item.writer?.truncate?.();\n }).finally(() => {\n if(this.downloadPromises[fileName] === deferred) {\n delete this.downloadPromises[fileName];\n }\n\n delete item.writer;\n // indexOfAndSplice(prepared, item);\n });\n\n this.downloadPromises[fileName] = deferred;\n\n prepared.push(item);\n };\n\n if(cacheStorage && (!downloadStorage || possibleSize <= MAX_FILE_SAVE_SIZE)) {\n cachePrepared = cacheStorage.prepareWriting(cacheFileName, possibleSize, options.mimeType)\n attach(cachePrepared, cacheFileName);\n }\n\n if(downloadStorage) {\n let downloadFileName = options.fileName; // it's doc file_name\n if(!downloadFileName) {\n downloadFileName = cacheFileName;\n const ext = MIME_TYPE_EXTENSION_MAP[options.mimeType];\n if(ext) {\n downloadFileName += '.' + ext;\n }\n }\n\n downloadPrepared = downloadStorage.prepareWriting({\n fileName: downloadFileName,\n downloadId,\n size: possibleSize\n });\n attach(downloadPrepared, fileName);\n\n if(cachePrepared) { // cancel cache too\n downloadPrepared.deferred.catch((err) => cachePrepared.deferred.reject(err));\n }\n\n // this.downloadToDiscPromises[cacheFileName] = deferred;\n // deferred.catch(noop).finally(() => {\n // if(this.downloadToDiscPromises[cacheFileName] === deferred) {\n // delete this.downloadToDiscPromises[cacheFileName];\n // }\n // });\n }\n\n deferred = downloadPrepared?.deferred ?? cachePrepared.deferred;\n\n if(downloadStorage && process) { // then have to load file again\n getFile = downloadStorage.getFile.bind(downloadStorage);\n }\n\n getFile(cacheFileName).then(async(blob: Blob) => {\n checkCancel();\n\n // if(blob.size < size) {\n // if(!options.onlyCache) {\n // await this.delete(cacheFileName);\n // checkCancel();\n // }\n\n // throw makeError('NO_ENTRY_FOUND');\n // }\n\n if(downloadPrepared) {\n const writer = downloadPrepared.writer = downloadPrepared.getWriter();\n checkCancel();\n\n const arr = await readBlobAsUint8Array(blob);\n checkCancel();\n await writer.write(arr);\n checkCancel();\n\n downloadPrepared.deferred.resolve(await writer.finalize());\n }\n\n if(cachePrepared) {\n cachePrepared.deferred.resolve(blob);\n }\n }).catch(async(err: ApiError) => {\n if(options.onlyCache) {\n errorHandler(null, err);\n return;\n }\n\n prepared.forEach((p) => {\n p.writer = p.getWriter();\n });\n\n const maxRequests = Infinity;\n\n const requestPart = (isWebFile ? this.requestWebFilePart : this.requestFilePart).bind(this);\n\n if(isWebFile && this.webFileDcId === undefined && !isLocalWebFile) {\n await this.apiManager.getConfig();\n checkCancel();\n }\n\n const delayed = this.allocateDeferredPromises(0, size, limitPart);\n\n const progress: Progress = {done: 0, offset: 0, total: size, fileName};\n const dispatchProgress = () => {\n try {\n checkCancel();\n progress.done = done;\n this.rootScope.dispatchEvent('download_progress', progress);\n } catch(err) {}\n };\n\n const throttledDispatchProgress = throttle(dispatchProgress, 50, true);\n\n let done = 0;\n const superpuper = async() => {\n const {offset, writePromise, writeDeferred} = delayed.shift();\n try {\n checkCancel();\n\n const requestPerf = performance.now();\n const result = await requestPart(dcId, location as any, offset, limitPart, id, options.queueId, checkCancel);\n const requestTime = performance.now() - requestPerf;\n\n const bytes = result.bytes;\n\n if(delayed.length) {\n superpuper();\n }\n\n const byteLength = bytes.byteLength;\n this.debug && this.log('downloadFile requestFilePart result:', fileName, result);\n const isFinal = (offset + limitPart) >= size || !byteLength;\n if(byteLength) {\n done += byteLength;\n\n if(isFinal) {\n dispatchProgress();\n } else {\n throttledDispatchProgress();\n }\n\n const writeQueuePerf = performance.now();\n await writePromise;\n checkCancel();\n const writeQueueTime = performance.now() - writeQueuePerf;\n\n const perf = performance.now();\n await Promise.all(prepared.map(({writer}) => writer?.write(bytes, offset)));\n checkCancel();\n // downloadId && this.log('write time', performance.now() - perf, 'request time', requestTime, 'queue time', writeQueueTime);\n }\n\n if(isFinal) {\n if(!size || done < size) {\n prepared.forEach(({writer}) => writer?.trim?.(done));\n }\n }\n\n if(isFinal && process) {\n const promises = prepared\n .filter(({writer}) => writer?.getParts && writer.replaceParts)\n .map(async({writer}) => {\n const bytes = writer.getParts();\n const processedResult = await process(bytes, cacheFileName);\n writer.replaceParts(processedResult);\n });\n\n await Promise.all(promises);\n checkCancel();\n }\n\n writeDeferred.resolve();\n\n if(isFinal) {\n const saveToStorage = done <= MAX_FILE_SAVE_SIZE;\n prepared.forEach((item) => {\n const {deferred, writer} = item;\n if(deferred.isFulfilled || deferred.isRejected || !writer) {\n return;\n }\n\n const result = writer.finalize(saveToStorage);\n deferred.resolve(result);\n });\n }\n } catch(err) {\n errorHandler(null, err as ApiError);\n }\n };\n\n for(let i = 0, length = Math.min(maxRequests, delayed.length); i < length; ++i) {\n superpuper();\n }\n }).catch(noop);\n\n const checkCancel = () => {\n if(getErrorsCount() === prepared.length) {\n throw prepared[0].error;\n }\n };\n\n return deferred;\n }\n\n public downloadMedia(options: DownloadMediaOptions): DownloadPromise {\n let {media, thumb} = options;\n const isPhoto = media._ === 'photo';\n if(isPhoto && !thumb) {\n return Promise.reject('preloadPhoto photoEmpty!');\n }\n\n // get original instance with correct file_reference instead of using copies\n const isDocument = media._ === 'document';\n // const isWebDocument = media._ === 'webDocument';\n if(isDocument) media = this.appDocsManager.getDoc((media as Document.document).id);\n else if(isPhoto) media = this.appPhotosManager.getPhoto((media as Photo.photo).id);\n\n const {fileName, downloadOptions} = getDownloadMediaDetails(options);\n\n let promise = this.getDownload(fileName);\n if(!promise) {\n promise = this.download(downloadOptions);\n\n if(isDocument && !thumb) {\n this.rootScope.dispatchEvent('document_downloading', (media as Document.document).id);\n promise.then(() => {\n this.rootScope.dispatchEvent('document_downloaded', (media as Document.document).id);\n }).catch(noop);\n }\n }\n\n return promise;\n }\n\n public downloadMediaURL(options: DownloadMediaOptions): Promise {\n const {media, thumb} = options;\n\n let cacheContext = this.thumbsStorage.getCacheContext(media as any, thumb?.type);\n if((thumb ? (cacheContext.downloaded >= ('size' in thumb ? thumb.size : 0)) : true) && cacheContext.url) {\n return Promise.resolve(cacheContext.url);\n }\n\n return this.downloadMedia(options).then((blob) => {\n if(!cacheContext.downloaded || cacheContext.downloaded < blob.size) {\n const url = URL.createObjectURL(blob);\n cacheContext = this.thumbsStorage.setCacheContextURL(media as any, cacheContext.type, url, blob.size);\n }\n\n return cacheContext.url;\n });\n }\n\n public downloadMediaVoid(options: DownloadMediaOptions) {\n return this.downloadMedia(options).then(noop);\n }\n\n private delete(fileName: string) {\n delete this.downloadPromises[fileName];\n return this.getFileStorage().delete(fileName);\n }\n\n public upload({file, fileName}: {file: Blob | File, fileName?: string}) {\n fileName ||= getFileNameForUpload(file);\n\n const fileSize = file.size;\n const isBigFile = fileSize >= 10485760;\n const partSize = this.getLimitPart(fileSize, true);\n const activeDelta = this.getDelta(partSize);\n const totalParts = Math.ceil(fileSize / partSize);\n const fileId = randomLong();\n const resultInputFile: InputFile = {\n _: isBigFile ? 'inputFileBig' : 'inputFile',\n id: fileId as any,\n parts: totalParts,\n name: fileName,\n md5_checksum: ''\n };\n\n const deferred = deferredPromise();\n if(totalParts > this.maxUploadParts) {\n deferred.reject(makeError('FILE_TOO_BIG'));\n return deferred;\n }\n\n let canceled = false, resolved = false;\n let errorHandler = (error: ApiError) => {\n if(error?.type !== 'UPLOAD_CANCELED') {\n this.log.error('Up Error', error);\n }\n\n deferred.reject(error);\n canceled = true;\n errorHandler = noop;\n };\n\n const method = isBigFile ? 'upload.saveBigFilePart' : 'upload.saveFilePart';\n const id = this.tempId++;\n\n const self = this;\n function* generator() {\n let _part = 0, doneParts = 0;\n for(let offset = 0; offset < fileSize; offset += partSize) {\n const part = _part++; // 0, 1\n yield self.downloadRequest('upload', id, async() => {\n checkCancel();\n\n const blob = file.slice(offset, offset + partSize);\n const buffer = await readBlobAsArrayBuffer(blob);\n checkCancel();\n\n self.debug && self.log('Upload file part, isBig:', isBigFile, part, buffer.byteLength, new Uint8Array(buffer).length, new Uint8Array(buffer).slice().length);\n\n return self.apiManager.invokeApi(method, {\n file_id: fileId,\n file_part: part,\n file_total_parts: totalParts,\n bytes: buffer\n } as any, {\n fileUpload: true\n }).then(() => {\n if(canceled) {\n return;\n }\n\n ++doneParts;\n const progress: Progress = {done: doneParts * partSize, offset, total: fileSize, fileName};\n deferred.notify(progress);\n\n if(doneParts >= totalParts) {\n deferred.resolve(resultInputFile);\n resolved = true;\n }\n }, errorHandler);\n }, activeDelta).catch(errorHandler);\n }\n }\n\n const it = generator();\n const process = () => {\n if(canceled) return;\n const r = it.next();\n if(r.done || canceled) return;\n (r.value as Promise).then(process);\n };\n\n const maxRequests = Infinity;\n for(let i = 0, length = Math.min(maxRequests, totalParts); i < length; ++i) {\n process();\n }\n\n const checkCancel = () => {\n if(canceled) {\n throw makeError('UPLOAD_CANCELED');\n }\n };\n\n deferred.cancel = () => {\n if(!canceled && !resolved) {\n canceled = true;\n errorHandler(makeError('UPLOAD_CANCELED'));\n }\n };\n\n deferred.notify = (progress: Progress) => {\n this.rootScope.dispatchEvent('download_progress', progress);\n };\n\n deferred.finally(() => {\n if(this.uploadPromises[fileName] === deferred) {\n delete this.uploadPromises[fileName];\n }\n });\n\n return this.uploadPromises[fileName] = deferred;\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 fixFirefoxSvg(text: string) {\n const svgIndex = text.indexOf('/, ` width=\"${width}\" height=\"${height}\">`).replace(/[^\\x00-\\x7F]/g, '');\n return text;\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 readBlobAsArrayBuffer from './readBlobAsArrayBuffer';\n\nexport default function readBlobAsUint8Array(blob: Blob) {\n return readBlobAsArrayBuffer(blob).then((buffer) => new Uint8Array(buffer));\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 callbackify from '../../helpers/callbackify';\nimport {ignoreRestrictionReasons} from '../../helpers/restrictions';\nimport {Config, MethodDeclMap, User} from '../../layer';\nimport {InvokeApiOptions} from '../../types';\nimport {AppManager} from '../appManagers/manager';\nimport {MTAppConfig} from './appConfig';\nimport {UserAuth} from './mtproto_config';\nimport {MTMessage} from './networker';\n\ntype HashResult = {\n hash: number,\n result: any\n};\n\ntype HashOptions = {\n [queryJSON: string]: HashResult\n};\n\nexport type ApiLimitType = 'pin' | 'folderPin' | 'folders' |\n 'favedStickers' | 'reactions' | 'bio' | 'topicPin' | 'caption';\n\nexport default abstract class ApiManagerMethods extends AppManager {\n private afterMessageIdTemp: number;\n private hashes: {[method: string]: HashOptions} = {};\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 protected config: Config;\n protected appConfig: MTAppConfig;\n\n constructor() {\n super();\n this.afterMessageIdTemp = 0;\n }\n\n abstract setUserAuth(userAuth: UserAuth | UserId): Promise;\n\n public setUser(user: User) {\n // appUsersManager.saveApiUser(user);\n return this.setUserAuth(user.id);\n }\n\n abstract invokeApi(method: T, params?: MethodDeclMap[T]['req'], options?: InvokeApiOptions): Promise;\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 overwrite?: boolean\n }) {\n // @ts-ignore\n o.params ??= {};\n o.options ??= {};\n // console.log('will invokeApi:', method, params, options);\n\n const {params, options, method, overwrite} = 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 if(overwrite) {\n delete this.hashes[method][queryJSON];\n cached = undefined;\n } else {\n (params as any).hash = cached.hash;\n }\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 cached = this.hashes[method][queryJSON] = {\n hash,\n result\n };\n }\n\n if(o.processResult) {\n const newResult = o.processResult(result);\n return cached ? cached.result = newResult : newResult;\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, overwrite?: boolean}\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 getNewPromise = () => {\n const promise = map.get(cacheKey);\n return promise === p ? undefined : promise;\n }\n\n const originalPromise = this.invokeApi(method, params, options);\n const newPromise: Promise> = originalPromise.then((result) => {\n return getNewPromise() || processResult(result);\n }, (error) => {\n const promise = getNewPromise();\n if(promise) {\n return promise;\n }\n\n if(!processError) {\n throw error;\n }\n\n return processError(error);\n });\n\n const p = newPromise.finally(() => {\n if(map.get(cacheKey) !== p) {\n return;\n }\n\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 = ctx.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 public getConfig(overwrite?: boolean) {\n if(this.config && !overwrite) {\n return this.config;\n }\n\n return this.invokeApiSingleProcess({\n method: 'help.getConfig',\n params: {},\n processResult: (config) => {\n this.config = config;\n this.rootScope.dispatchEvent('config', config);\n return config;\n },\n options: {overwrite}\n });\n }\n\n public getAppConfig(overwrite?: boolean) {\n if(this.appConfig && !overwrite) {\n return this.appConfig;\n }\n\n return this.invokeApiSingleProcess({\n method: 'help.getAppConfig',\n params: {},\n processResult: (config: MTAppConfig) => {\n this.appConfig = config;\n ignoreRestrictionReasons(config.ignore_restriction_reasons ?? []);\n this.rootScope.dispatchEvent('app_config', config);\n return config;\n },\n options: {overwrite}\n });\n }\n\n public getLimit(type: ApiLimitType, isPremium?: boolean) {\n return callbackify(this.getAppConfig(), (appConfig) => {\n const map: {[type in ApiLimitType]: [keyof MTAppConfig, keyof MTAppConfig] | keyof MTAppConfig} = {\n pin: ['dialogs_pinned_limit_default', 'dialogs_pinned_limit_premium'],\n folderPin: ['dialogs_folder_pinned_limit_default', 'dialogs_folder_pinned_limit_premium'],\n folders: ['dialog_filters_limit_default', 'dialog_filters_limit_premium'],\n favedStickers: ['stickers_faved_limit_default', 'stickers_faved_limit_premium'],\n reactions: ['reactions_user_max_default', 'reactions_user_max_premium'],\n bio: ['about_length_limit_default', 'about_length_limit_premium'],\n topicPin: 'topics_pinned_limit',\n caption: ['caption_length_limit_default', 'caption_length_limit_premium']\n };\n\n isPremium ??= this.rootScope.premium;\n\n const a = map[type];\n const key = Array.isArray(a) ? a[isPremium ? 1 : 0] : a;\n return appConfig[key] as number;\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/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n \nimport transportController from './transports/controller';\nimport MTTransport from './transports/transport';\n \n\nimport type {UserAuth} from './mtproto_config';\nimport type {DcAuthKey, DcId, DcServerSalt, InvokeApiOptions} from '../../types';\nimport type {MethodDeclMap} from '../../layer';\nimport type TcpObfuscated from './transports/tcpObfuscated';\nimport sessionStorage from '../sessionStorage';\nimport MTPNetworker, {MTMessage} from './networker';\nimport {ConnectionType, constructTelegramWebSocketUrl, DcConfigurator, TransportType} from './dcConfigurator';\nimport {logger} from '../logger';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport App from '../../config/app';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {IDB} from '../files/idb';\nimport CryptoWorker from '../crypto/cryptoMessagePort';\nimport ctx from '../../environment/ctx';\nimport noop from '../../helpers/noop';\nimport Modes from '../../config/modes';\nimport bytesFromHex from '../../helpers/bytes/bytesFromHex';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport isObject from '../../helpers/object/isObject';\nimport pause from '../../helpers/schedulers/pause';\nimport ApiManagerMethods from './api_methods';\nimport {getEnvironment} from '../../environment/utils';\nimport toggleStorages from '../../helpers/toggleStorages';\n\n/* class RotatableArray {\n public array: Array = [];\n private lastIndex = -1;\n\n public get() {\n this.lastIndex = clamp(this.lastIndex + 1, 0, this.array.length - 1);\n return this.array[this.lastIndex];\n }\n} */\n\nconst PREMIUM_FILE_NETWORKERS_COUNT = 6;\nconst REGULAR_FILE_NETWORKERS_COUNT = 3;\n\nexport class ApiManager extends ApiManagerMethods {\n private cachedNetworkers: {\n [transportType in TransportType]: {\n [connectionType in ConnectionType]: {\n [dcId: DcId]: MTPNetworker[]\n }\n }\n };\n\n private cachedExportPromise: {[x: number]: Promise};\n private gettingNetworkers: {[dcIdAndType: string]: Promise};\n private baseDcId: DcId;\n\n // public telegramMeNotified = false;\n\n private log: ReturnType;\n\n private afterMessageTempIds: {\n [tempId: string]: {\n messageId: string,\n promise: Promise\n }\n };\n\n private transportType: TransportType;\n\n private updatesProcessor: (obj: any) => void;\n\n private loggingOut: boolean;\n\n constructor() {\n super();\n this.log = logger('API');\n\n this.cachedNetworkers = {} as any;\n this.cachedExportPromise = {};\n this.gettingNetworkers = {};\n this.baseDcId = 0;\n this.afterMessageTempIds = {};\n\n this.transportType = Modes.transport;\n\n \n transportController.addEventListener('transport', (transportType) => {\n this.changeTransportType(transportType);\n });\n \n\n // * Make sure that the used autologin_token is no more than 10000 seconds old\n // * https://core.telegram.org/api/url-authorization\n const REFRESH_APP_CONFIG_INTERVAL = (10000 - 30) * 1000;\n setInterval(() => {\n this.getAppConfig(true);\n }, REFRESH_APP_CONFIG_INTERVAL);\n }\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateConfig: () => {\n this.getConfig(true);\n this.getAppConfig(true);\n }\n });\n\n this.rootScope.addEventListener('user_auth', () => {\n if(this.config) { // refresh configs if had a config during authorization\n this.apiUpdatesManager.processLocalUpdate({_: 'updateConfig'});\n }\n });\n\n this.rootScope.addEventListener('premium_toggle', (isPremium) => {\n this.iterateNetworkers(({networker, connectionType, dcId, transportType}) => {\n if(connectionType === 'client' || transportType !== 'websocket') {\n return;\n }\n\n const transport = networker.transport;\n if(!transport) {\n this.log.error('wow what, no transport?', networker);\n return;\n }\n\n if((transport as TcpObfuscated).connection) {\n const url = constructTelegramWebSocketUrl(dcId, connectionType, isPremium);\n (transport as TcpObfuscated).changeUrl(url);\n }\n });\n });\n }\n\n // private lol = false;\n\n // constructor() {\n // MtpSingleInstanceService.start();\n\n /* AppStorage.get('dc').then((dcId) => {\n if(dcId) {\n this.baseDcId = dcId;\n }\n }); */\n // }\n\n /* public telegramMeNotify(newValue: boolean) {\n if(this.telegramMeNotified !== newValue) {\n this.telegramMeNotified = newValue;\n //telegramMeWebService.setAuthorized(this.telegramMeNotified);\n }\n } */\n\n private getTransportType(connectionType: ConnectionType) {\n \n \n \n \n \n // @ts-ignore\n const transportType: TransportType = this.transportType;\n \n\n return transportType;\n }\n\n private iterateNetworkers(callback: (o: {networker: MTPNetworker, dcId: DcId, connectionType: ConnectionType, transportType: TransportType, index: number, array: MTPNetworker[]}) => void) {\n for(const transportType in this.cachedNetworkers) {\n const connections = this.cachedNetworkers[transportType as TransportType];\n for(const connectionType in connections) {\n const dcs = connections[connectionType as ConnectionType];\n for(const dcId in dcs) {\n const networkers = dcs[dcId as any as DcId];\n networkers.forEach((networker, idx, arr) => {\n callback({\n networker,\n dcId: +dcId as DcId,\n connectionType: connectionType as ConnectionType,\n transportType: transportType as TransportType,\n index: idx,\n array: arr\n });\n });\n }\n }\n }\n }\n\n private chooseServer(dcId: DcId, connectionType: ConnectionType, transportType: TransportType) {\n return this.dcConfigurator.chooseServer(dcId, connectionType, transportType, connectionType === 'client', this.rootScope.premium);\n }\n\n public changeTransportType(transportType: TransportType) {\n const oldTransportType = this.transportType;\n if(oldTransportType === transportType) {\n return;\n }\n\n this.log('changing transport from', oldTransportType, 'to', transportType);\n\n const oldObject = this.cachedNetworkers[oldTransportType];\n const newObject = this.cachedNetworkers[transportType];\n this.cachedNetworkers[transportType] = oldObject;\n this.cachedNetworkers[oldTransportType] = newObject;\n\n this.transportType = transportType;\n\n for(const oldGetKey in this.gettingNetworkers) {\n const promise = this.gettingNetworkers[oldGetKey];\n delete this.gettingNetworkers[oldGetKey];\n\n const newGetKey = oldGetKey.replace(oldTransportType, transportType);\n this.gettingNetworkers[newGetKey] = promise;\n\n this.log('changed networker getKey from', oldGetKey, 'to', newGetKey)\n }\n\n this.iterateNetworkers((info) => {\n const transportType = this.getTransportType(info.connectionType);\n const transport = this.chooseServer(info.dcId, info.connectionType, transportType);\n this.changeNetworkerTransport(info.networker, transport);\n });\n }\n\n public async getBaseDcId() {\n if(this.baseDcId) {\n return this.baseDcId;\n }\n\n const baseDcId = await sessionStorage.get('dc');\n if(!this.baseDcId) {\n if(!baseDcId) {\n this.setBaseDcId(App.baseDcId);\n } else {\n this.baseDcId = baseDcId;\n }\n }\n\n return this.baseDcId;\n }\n\n public async 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 this.rootScope.dispatchEvent('user_auth', userAuth);\n\n if(!userAuth.dcID) {\n const baseDcId = await this.getBaseDcId();\n userAuth.dcID = baseDcId;\n }\n\n sessionStorage.set({\n user_auth: userAuth\n });\n\n // this.telegramMeNotify(true);\n }\n\n public setBaseDcId(dcId: DcId) {\n const wasDcId = this.baseDcId;\n if(wasDcId) { // if migrated set ondrain\n this.getNetworker(wasDcId).then((networker) => {\n this.setOnDrainIfNeeded(networker);\n });\n }\n\n this.baseDcId = dcId;\n\n sessionStorage.set({\n dc: this.baseDcId\n });\n }\n\n public async logOut() {\n if(this.loggingOut) {\n return;\n }\n\n this.loggingOut = true;\n const storageKeys: Array = [];\n\n const prefix = 'dc';\n for(let dcId = 1; dcId <= 5; dcId++) {\n storageKeys.push(prefix + dcId + '_auth_key' as any);\n }\n\n // WebPushApiManager.forceUnsubscribe(); // WARNING // moved to worker's master\n const storageResult = await Promise.all(storageKeys.map((key) => sessionStorage.get(key)));\n\n const logoutPromises: Promise[] = [];\n for(let i = 0; i < storageResult.length; i++) {\n if(storageResult[i]) {\n logoutPromises.push(this.invokeApi('auth.logOut', {}, {dcId: (i + 1) as DcId, ignoreErrors: true}));\n }\n }\n\n const clear = async() => {\n this.baseDcId = undefined;\n // this.telegramMeNotify(false);\n await toggleStorages(false, true);\n IDB.closeDatabases();\n this.rootScope.dispatchEvent('logging_out');\n };\n\n setTimeout(clear, 1e3);\n\n // return;\n\n return Promise.all(logoutPromises).catch((error) => {\n error.handled = true;\n }).finally(clear)/* .then(() => {\n location.pathname = '/';\n }) */;\n }\n\n private generateNetworkerGetKey(dcId: DcId, transportType: TransportType, connectionType: ConnectionType) {\n return [dcId, transportType, connectionType].join('-');\n }\n\n public getNetworker(dcId: DcId, options: InvokeApiOptions = {}): Promise {\n const connectionType: ConnectionType = options.fileDownload ? 'download' : (options.fileUpload ? 'upload' : 'client');\n // const connectionType: ConnectionType = 'client';\n\n const transportType = this.getTransportType(connectionType);\n if(!this.cachedNetworkers[transportType]) {\n this.cachedNetworkers[transportType] = {\n client: {},\n download: {},\n upload: {}\n };\n }\n\n const cache = this.cachedNetworkers[transportType][connectionType];\n if(!(dcId in cache)) {\n cache[dcId] = [];\n }\n\n const networkers = cache[dcId];\n // @ts-ignore\n const maxNetworkers = connectionType === 'client' || transportType === 'https' ? 1 : (this.rootScope.premium ? PREMIUM_FILE_NETWORKERS_COUNT : REGULAR_FILE_NETWORKERS_COUNT);\n if(networkers.length >= maxNetworkers) {\n let i = maxNetworkers - 1, found = false;\n for(; i >= 0; --i) {\n if(networkers[i].isOnline) {\n found = true;\n break;\n }\n }\n\n const networker = networkers.splice(found ? i : maxNetworkers - 1, 1)[0];\n networkers.unshift(networker);\n return Promise.resolve(networker);\n }\n\n let getKey = this.generateNetworkerGetKey(dcId, transportType, connectionType);\n if(this.gettingNetworkers[getKey]) {\n return this.gettingNetworkers[getKey];\n }\n\n const ak: DcAuthKey = `dc${dcId}_auth_key` as any;\n const ss: DcServerSalt = `dc${dcId}_server_salt` as any;\n\n let transport = this.chooseServer(dcId, connectionType, transportType);\n return this.gettingNetworkers[getKey] = Promise.all([ak, ss].map((key) => sessionStorage.get(key)))\n .then(async([authKeyHex, serverSaltHex]) => {\n let networker: MTPNetworker, error: any;\n if(authKeyHex && authKeyHex.length === 512) {\n if(!serverSaltHex || serverSaltHex.length !== 16) {\n serverSaltHex = 'AAAAAAAAAAAAAAAA';\n }\n\n const authKey = bytesFromHex(authKeyHex);\n const authKeyId = (await CryptoWorker.invokeCrypto('sha1', authKey)).slice(-8);\n const serverSalt = bytesFromHex(serverSaltHex);\n\n networker = this.networkerFactory.getNetworker(dcId, authKey, authKeyId, serverSalt, options);\n } else {\n try { // if no saved state\n const auth = await this.authorizer.auth(dcId);\n\n sessionStorage.set({\n [ak]: bytesToHex(auth.authKey),\n [ss]: bytesToHex(auth.serverSalt)\n });\n\n networker = this.networkerFactory.getNetworker(dcId, auth.authKey, auth.authKeyId, auth.serverSalt, options);\n } catch(_error) {\n error = _error;\n }\n }\n\n // ! cannot get it before this promise because simultaneous changeTransport will change nothing\n const newTransportType = this.getTransportType(connectionType);\n if(newTransportType !== transportType) {\n getKey = this.generateNetworkerGetKey(dcId, newTransportType, connectionType);\n transport.destroy();\n DcConfigurator.removeTransport(this.dcConfigurator.chosenServers, transport);\n\n if(networker) {\n transport = this.chooseServer(dcId, connectionType, newTransportType);\n }\n\n this.log('transport has been changed during authorization from', transportType, 'to', newTransportType);\n }\n\n /* networker.onConnectionStatusChange = (online) => {\n console.log('status:', online);\n }; */\n\n delete this.gettingNetworkers[getKey];\n\n if(error) {\n this.log('get networker error', error, (error as Error).stack);\n throw error;\n }\n\n this.changeNetworkerTransport(networker, transport);\n networkers.unshift(networker);\n this.setOnDrainIfNeeded(networker);\n return networker;\n });\n }\n\n public getNetworkerVoid(dcId: DcId) {\n return this.getNetworker(dcId).then(noop, noop);\n }\n\n private changeNetworkerTransport(networker: MTPNetworker, transport?: MTTransport) {\n const oldTransport = networker.transport;\n if(oldTransport) {\n DcConfigurator.removeTransport(this.dcConfigurator.chosenServers, oldTransport);\n }\n\n networker.changeTransport(transport);\n }\n\n private onNetworkerDrain(networker: MTPNetworker) {\n this.log('networker drain', networker.dcId);\n networker.onDrain = undefined;\n this.changeNetworkerTransport(networker);\n networker.destroy();\n this.networkerFactory.removeNetworker(networker);\n DcConfigurator.removeTransport(this.cachedNetworkers, networker);\n }\n\n public setOnDrainIfNeeded(networker: MTPNetworker) {\n if(networker.onDrain) {\n return;\n }\n\n const checkPromise: Promise = networker.isFileNetworker ?\n Promise.resolve(true) :\n this.getBaseDcId().then((baseDcId) => networker.dcId !== baseDcId);\n checkPromise.then((canRelease) => {\n if(networker.onDrain) {\n return;\n }\n\n if(canRelease) {\n networker.onDrain = () => this.onNetworkerDrain(networker);\n networker.setDrainTimeout();\n }\n });\n }\n\n public setUpdatesProcessor(callback: (obj: any) => void) {\n this.updatesProcessor = callback;\n this.networkerFactory.setUpdatesProcessor(callback);\n }\n\n public invokeApi(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): CancellablePromise {\n // /////this.log('Invoke api', method, params, options);\n\n /* if(!this.lol) {\n networkerFactory.updatesProcessor({_: 'new_session_created'}, true);\n this.lol = true;\n } */\n\n const deferred = deferredPromise();\n\n let {afterMessageId, prepareTempMessageId} = options;\n if(prepareTempMessageId) {\n deferred.then(() => {\n delete this.afterMessageTempIds[prepareTempMessageId];\n });\n }\n\n if(MOUNT_CLASS_TO) {\n const startTime = Date.now();\n const interval = ctx.setInterval(() => {\n if(!cachedNetworker || !cachedNetworker.isStopped()) {\n this.log.error('Request is still processing:', method, params, options, 'time:', (Date.now() - startTime) / 1000);\n }\n // this.cachedUploadNetworkers[2].requestMessageStatus();\n }, 5e3);\n\n deferred.catch(noop).finally(() => {\n clearInterval(interval);\n });\n }\n\n const rejectPromise = async(error: ApiError) => {\n if(!error) {\n error = {type: 'ERROR_EMPTY'};\n } else if(!isObject(error)) {\n error = {message: error};\n }\n\n if((error.code === 401 && error.type === 'SESSION_REVOKED') ||\n (error.code === 406 && error.type === 'AUTH_KEY_DUPLICATED')) {\n this.logOut();\n }\n\n if(options.ignoreErrors) {\n throw error;\n }\n\n if(error.code === 406) {\n error.handled = true;\n }\n\n if(!options.noErrorBox) {\n error.input = method;\n error.stack = stack || (error.originalError && error.originalError.stack) || error.stack || (new Error()).stack;\n setTimeout(() => {\n if(!error.handled) {\n if(error.code === 401) {\n this.logOut();\n } else {\n // ErrorService.show({error: error}); // WARNING\n }\n\n error.handled = true;\n }\n }, 100);\n }\n\n throw error;\n };\n\n let dcId: DcId;\n\n let cachedNetworker: MTPNetworker;\n const stack = (new Error()).stack || 'empty stack';\n const performRequest = (): Promise => {\n if(afterMessageId) {\n const after = this.afterMessageTempIds[afterMessageId];\n if(after) {\n options.afterMessageId = after.messageId;\n }\n }\n\n const promise = cachedNetworker.wrapApiCall(method, params, options);\n\n if(prepareTempMessageId) {\n this.afterMessageTempIds[prepareTempMessageId] = {\n messageId: (options as MTMessage).messageId,\n promise: deferred\n };\n }\n\n return promise.catch((error: ApiError) => {\n // if(!options.ignoreErrors) {\n if(error.type !== 'FILE_REFERENCE_EXPIRED'/* && error.type !== 'MSG_WAIT_FAILED' */) {\n this.log.error('Error', error.code, error.type, this.baseDcId, dcId, method, params);\n }\n\n if(error.code === 401 && this.baseDcId === dcId) {\n if(error.type !== 'SESSION_PASSWORD_NEEDED') {\n sessionStorage.delete('dc')\n sessionStorage.delete('user_auth'); // ! ะฒะพะทะผะพะถะฝะพ ั‚ัƒั‚ ะฒะพะพะฑั‰ะต ะฝะต ะฝัƒะถะฝะพ ัั‚ะพ ะดะตะปะฐั‚ัŒ, ะฝะพ ะฝัƒะถะฝะพ ะฟั€ะพะฒะตั€ะธั‚ัŒ ัะปัƒั‡ะฐะน ั USER_DEACTIVATED (https://core.telegram.org/api/errors)\n // this.telegramMeNotify(false);\n }\n\n throw error;\n } else if(error.code === 401 && this.baseDcId && dcId !== this.baseDcId) {\n if(this.cachedExportPromise[dcId] === undefined) {\n const promise = new Promise((exportResolve, exportReject) => {\n this.invokeApi('auth.exportAuthorization', {dc_id: dcId}, {noErrorBox: true}).then((exportedAuth) => {\n this.invokeApi('auth.importAuthorization', {\n id: exportedAuth.id,\n bytes: exportedAuth.bytes\n }, {dcId, noErrorBox: true}).then(exportResolve, exportReject);\n }, exportReject);\n });\n\n this.cachedExportPromise[dcId] = promise;\n }\n\n return this.cachedExportPromise[dcId].then(() => performRequest());\n } else if(error.code === 303) {\n const newDcId = +error.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_)(\\d+)/)[2] as DcId;\n if(newDcId !== dcId) {\n if(options.dcId) {\n options.dcId = newDcId;\n } else {\n this.setBaseDcId(newDcId);\n }\n\n return this.invokeApi(method, params, options);\n }\n } else if(error.code === 400 && error.type.indexOf('FILE_MIGRATE') === 0) {\n const newDcId = +error.type.match(/^(FILE_MIGRATE_)(\\d+)/)[2] as DcId;\n if(newDcId !== dcId) {\n options.dcId = newDcId;\n return this.invokeApi(method, params, options);\n } else {\n throw error;\n }\n } else if(error.code === 400 && error.type === 'CONNECTION_NOT_INITED') {\n this.networkerFactory.unsetConnectionInited();\n return performRequest();\n } else if(!options.rawError && error.code === 420) {\n const waitTime = +error.type.match(/^FLOOD_WAIT_(\\d+)/)[1] || 1;\n\n if(waitTime > (options.floodMaxTimeout ?? 60) && !options.prepareTempMessageId) {\n throw error;\n }\n\n return pause(waitTime/* (waitTime + 5) */ * 1000).then(() => performRequest());\n } else if(!options.rawError && ['MSG_WAIT_FAILED', 'MSG_WAIT_TIMEOUT'].includes(error.type)) {\n const after = this.afterMessageTempIds[afterMessageId];\n\n afterMessageId = undefined;\n delete options.afterMessageId;\n\n if(after) return after.promise.then(() => performRequest());\n else return performRequest();\n } else if(!options.rawError && error.code === 500) {\n const now = Date.now();\n if(options.stopTime) {\n if(now >= options.stopTime) {\n throw error;\n }\n }\n\n options.waitTime = options.waitTime ? Math.min(60, options.waitTime * 1.5) : 1;\n return pause(options.waitTime * 1000).then(() => performRequest());\n } else if(error.type === 'UNKNOWN' || error.type === 'MTPROTO_CLUSTER_INVALID') { // cluster invalid - request from regular user to premium endpoint\n return pause(1000).then(() => performRequest());\n } else {\n throw error;\n }\n });\n }\n\n let p: Promise;\n if(dcId = (options.dcId || this.baseDcId)) {\n p = this.getNetworker(dcId, options);\n } else {\n p = this.getBaseDcId().then((baseDcId) => this.getNetworker(dcId = baseDcId, options));\n }\n\n p.then((networker) => {\n cachedNetworker = networker;\n const promise = performRequest();\n cachedNetworker.attachPromise(deferred, options as MTMessage);\n return promise;\n })\n .then(deferred.resolve)\n .catch(rejectPromise)\n .catch(deferred.reject);\n\n return deferred;\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 applyMixins from '../../helpers/applyMixins';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport {AppManager} from '../appManagers/manager';\n\nexport type StatePeerType = 'recentSearch' | 'topPeer' | 'dialog' | 'contact' | 'topMessage' | 'self';\n\ntype PeersStorageKey = `${StatePeerType}_${string | PeerId}` | StatePeerType;\n\nclass PeersStorage {\n private neededPeers: Map> = new Map();\n private singlePeerMap: Map> = new Map();\n\n constructor() {\n this._constructor(false);\n }\n\n protected after() {\n this.rootScope.addEventListener('user_auth', () => {\n this.requestPeer(this.appPeersManager.peerId, 'self');\n });\n }\n\n public requestPeer(peerId: PeerId, key: PeersStorageKey) {\n let set = this.neededPeers.get(peerId);\n if(set && set.has(key)) {\n return;\n }\n\n if(!set) {\n set = new Set();\n this.neededPeers.set(peerId, set);\n }\n\n set.add(key);\n\n this.dispatchEvent('peerNeeded', peerId);\n }\n\n public releasePeer(peerId: PeerId, key: PeersStorageKey) {\n const set = this.neededPeers.get(peerId);\n if(!set) {\n return;\n }\n\n set.delete(key);\n\n if(!set.size) {\n this.neededPeers.delete(peerId);\n this.dispatchEvent('peerUnneeded', peerId);\n }\n }\n\n public requestPeersForKey(peerIds: Set | number[], key: PeersStorageKey) {\n if(Array.isArray(peerIds)) {\n peerIds = new Set(peerIds);\n }\n\n let set = this.singlePeerMap.get(key);\n if(set) {\n for(const peerId of set) {\n if(peerIds.has(peerId)) {\n continue;\n }\n\n this.releasePeer(peerId, key);\n set.delete(peerId);\n }\n\n if(!set.size && !peerIds.size) {\n this.singlePeerMap.delete(key);\n return;\n }\n }\n\n if(peerIds.size) {\n if(!set) {\n set = new Set();\n this.singlePeerMap.set(key, set);\n }\n\n for(const peerId of peerIds) {\n if(set.has(peerId)) {\n continue;\n }\n\n this.requestPeer(peerId, key);\n set.add(peerId);\n }\n }\n }\n\n public isPeerNeeded(peerId: PeerId) {\n return this.neededPeers.has(peerId);\n }\n}\n\ninterface PeersStorage extends EventListenerBase<{\n peerNeeded: (peerId: PeerId) => void,\n peerUnneeded: (peerId: PeerId) => void,\n}>, AppManager {}\napplyMixins(PeersStorage, [EventListenerBase, AppManager]);\n\nexport default PeersStorage;\n","/*\n * 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 {WebDocument} from '../../layer';\nimport type {MyDocument} from '../appManagers/appDocsManager';\nimport type {MyPhoto} from '../appManagers/appPhotosManager';\nimport {THUMB_TYPE_FULL} from '../mtproto/mtproto_config';\n\nexport type ThumbCache = {\n downloaded: number,\n url: string,\n type: string\n};\n\nexport type ThumbsCache = {\n [key: string]: {\n [size: string]: ThumbCache\n }\n};\n\nconst thumbFullSize = THUMB_TYPE_FULL;\n\nexport type ThumbStorageMedia = MyPhoto | MyDocument | WebDocument;\n\nexport default class ThumbsStorage {\n private thumbsCache: ThumbsCache = {};\n\n private getKey(media: ThumbStorageMedia) {\n return media._ + ((media as MyPhoto).id ?? (media as WebDocument).url);\n }\n\n public getCacheContext(media: ThumbStorageMedia, thumbSize: string = thumbFullSize): ThumbCache {\n /* if(media._ === 'photo' && thumbSize !== 'i') {\n thumbSize = thumbFullSize;\n } */\n\n const cache = this.thumbsCache[this.getKey(media)] ??= {};\n return cache[thumbSize] ??= {downloaded: 0, url: '', type: thumbSize};\n }\n\n public setCacheContextURL(media: ThumbStorageMedia, thumbSize: string = thumbFullSize, url: string, downloaded: number = 0) {\n const cacheContext = this.getCacheContext(media, thumbSize);\n cacheContext.url = url;\n cacheContext.downloaded = downloaded;\n return cacheContext;\n }\n\n public deleteCacheContext(media: ThumbStorageMedia, thumbSize: string = thumbFullSize) {\n const cache = this.thumbsCache[this.getKey(media)];\n if(cache) {\n delete cache[thumbSize];\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 type MTProtoConstructor = {\n id: number,\n predicate: string,\n params: Array<{\n name: string,\n type: string\n }>,\n type: string\n};\n\nexport type MTProtoMethod = {\n id: number,\n method: string,\n params: Array<{\n name: string,\n type: string\n }>,\n type: string\n};\n\n// eslint-disable-next-line quotes, comma-spacing\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\":-1182234929,\"predicate\":\"inputUserEmpty\",\"params\":[],\"type\":\"InputUser\"},{\"id\":-138301121,\"predicate\":\"inputUserSelf\",\"params\":[],\"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\":-1771768449,\"predicate\":\"inputMediaEmpty\",\"params\":[],\"type\":\"InputMedia\"},{\"id\":505969924,\"predicate\":\"inputMediaUploadedPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"spoiler\",\"type\":\"flags.2?true\"},{\"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\":\"spoiler\",\"type\":\"flags.1?true\"},{\"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\":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\":1498486562,\"predicate\":\"peerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":918946202,\"predicate\":\"peerChat\",\"params\":[{\"name\":\"chat_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\":1326562017,\"predicate\":\"userProfilePhotoEmpty\",\"params\":[],\"type\":\"UserProfilePhoto\"},{\"id\":-2100168954,\"predicate\":\"userProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_video\",\"type\":\"flags.0?true\"},{\"name\":\"personal\",\"type\":\"flags.2?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\":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\":\"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\":-908914376,\"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?ChatReactions\"}],\"type\":\"ChatFull\"},{\"id\":-1070776313,\"predicate\":\"chatParticipant\",\"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\":\"spoiler\",\"type\":\"flags.3?true\"},{\"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\":-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\":-712374074,\"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\":\"unread_reactions_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\"},{\"name\":\"ttl_period\",\"type\":\"flags.5?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\":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\":-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\":-551616469,\"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?NotificationSound\"}],\"type\":\"InputPeerNotifySettings\"},{\"id\":-1472527322,\"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\":\"ios_sound\",\"type\":\"flags.3?NotificationSound\"},{\"name\":\"android_sound\",\"type\":\"flags.4?NotificationSound\"},{\"name\":\"other_sound\",\"type\":\"flags.5?NotificationSound\"}],\"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\":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\":-120378643,\"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\":\"voice_messages_forbidden\",\"type\":\"flags.20?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"flags.1?string\"},{\"name\":\"settings\",\"type\":\"PeerSettings\"},{\"name\":\"personal_photo\",\"type\":\"flags.21?Photo\"},{\"name\":\"profile_photo\",\"type\":\"flags.2?Photo\"},{\"name\":\"fallback_photo\",\"type\":\"flags.22?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\"},{\"name\":\"bot_group_admin_rights\",\"type\":\"flags.17?ChatAdminRights\"},{\"name\":\"bot_broadcast_admin_rights\",\"type\":\"flags.18?ChatAdminRights\"},{\"name\":\"premium_gifts\",\"type\":\"flags.19?Vector\"}],\"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\":-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\":1694474197,\"predicate\":\"messages.chats\",\"params\":[{\"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\":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\":-1484486364,\"predicate\":\"updateUserName\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"usernames\",\"type\":\"Vector\"}],\"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\":-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\":-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\":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\":\"this_port_only\",\"type\":\"flags.5?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"ip_address\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"flags.10?bytes\"}],\"type\":\"DcOption\"},{\"id\":589653676,\"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\":\"force_try_ipv6\",\"type\":\"flags.14?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\"},{\"name\":\"reactions_default\",\"type\":\"flags.15?Reaction\"}],\"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\":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\":-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\":-1476358952,\"predicate\":\"encryptedFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"long\"},{\"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\":-182231723,\"predicate\":\"inputEncryptedFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"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\":-95482955,\"predicate\":\"inputFileBig\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"InputFile\"},{\"id\":767652808,\"predicate\":\"inputEncryptedFileBigUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"InputEncryptedFile\"},{\"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\":1530447553,\"predicate\":\"inputMediaUploadedDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"nosound_video\",\"type\":\"flags.3?true\"},{\"name\":\"force_file\",\"type\":\"flags.4?true\"},{\"name\":\"spoiler\",\"type\":\"flags.5?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\":\"spoiler\",\"type\":\"flags.2?true\"},{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"},{\"name\":\"query\",\"type\":\"flags.1?string\"}],\"type\":\"InputMedia\"},{\"id\":-1666158377,\"predicate\":\"messageMediaDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"nopremium\",\"type\":\"flags.3?true\"},{\"name\":\"spoiler\",\"type\":\"flags.4?true\"},{\"name\":\"document\",\"type\":\"flags.0?Document\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.2?int\"}],\"type\":\"MessageMedia\"},{\"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\":-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\":922273905,\"predicate\":\"documentEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Document\"},{\"id\":-1881881384,\"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\":\"long\"},{\"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\":-1094555409,\"predicate\":\"updateNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"NotifyPeer\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"}],\"type\":\"Update\"},{\"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\":-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\":-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\":-496024847,\"predicate\":\"userStatusRecently\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":129960444,\"predicate\":\"userStatusLastWeek\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":2011940674,\"predicate\":\"userStatusLastMonth\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":-298113238,\"predicate\":\"updatePrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"PrivacyKey\"},{\"name\":\"rules\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":1335282456,\"predicate\":\"inputPrivacyKeyStatusTimestamp\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-1137792208,\"predicate\":\"privacyKeyStatusTimestamp\",\"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\":-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\":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\":88680979,\"predicate\":\"updateUserPhone\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"Update\"},{\"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\":-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\":-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\":-2066640507,\"predicate\":\"messages.affectedMessages\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":2139689491,\"predicate\":\"updateWebPage\",\"params\":[{\"name\":\"webpage\",\"type\":\"WebPage\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"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\":-1557277184,\"predicate\":\"messageMediaWebPage\",\"params\":[{\"name\":\"webpage\",\"type\":\"WebPage\"}],\"type\":\"MessageMedia\"},{\"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\":-1787080453,\"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\"},{\"name\":\"login_email_pattern\",\"type\":\"flags.6?string\"}],\"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\":-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\":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\":-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\":51520707,\"predicate\":\"messageActionChatJoinedByLink\",\"params\":[{\"name\":\"inviter_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":1757493555,\"predicate\":\"updateReadMessagesContents\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"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\":768691932,\"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\":\"videos\",\"type\":\"flags.6?true\"},{\"name\":\"emojis\",\"type\":\"flags.7?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\":\"thumb_document_id\",\"type\":\"flags.8?long\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"StickerSet\"},{\"id\":1846886166,\"predicate\":\"messages.stickerSet\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"keywords\",\"type\":\"Vector\"},{\"name\":\"documents\",\"type\":\"Vector\"}],\"type\":\"messages.StickerSet\"},{\"id\":-1885878744,\"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\":\"bot_attach_menu\",\"type\":\"flags.27?true\"},{\"name\":\"premium\",\"type\":\"flags.28?true\"},{\"name\":\"attach_menu_enabled\",\"type\":\"flags.29?true\"},{\"name\":\"flags2\",\"type\":\"#\"},{\"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\"},{\"name\":\"emoji_status\",\"type\":\"flags.30?EmojiStatus\"},{\"name\":\"usernames\",\"type\":\"flags2.0?Vector\"}],\"type\":\"User\"},{\"id\":-1032140601,\"predicate\":\"botCommand\",\"params\":[{\"name\":\"command\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"}],\"type\":\"BotCommand\"},{\"id\":-1892676777,\"predicate\":\"botInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_id\",\"type\":\"flags.0?long\"},{\"name\":\"description\",\"type\":\"flags.1?string\"},{\"name\":\"description_photo\",\"type\":\"flags.4?Photo\"},{\"name\":\"description_document\",\"type\":\"flags.5?Document\"},{\"name\":\"commands\",\"type\":\"flags.2?Vector\"},{\"name\":\"menu_button\",\"type\":\"flags.3?BotMenuButton\"}],\"type\":\"BotInfo\"},{\"id\":-1560655744,\"predicate\":\"keyboardButton\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"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\":\"persistent\",\"type\":\"flags.4?true\"},{\"name\":\"rows\",\"type\":\"Vector\"},{\"name\":\"placeholder\",\"type\":\"flags.3?string\"}],\"type\":\"ReplyMarkup\"},{\"id\":-571955892,\"predicate\":\"inputPeerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-233744186,\"predicate\":\"inputUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputUser\"},{\"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\":-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\":-292807034,\"predicate\":\"inputChannelEmpty\",\"params\":[],\"type\":\"InputChannel\"},{\"id\":-212145112,\"predicate\":\"inputChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputChannel\"},{\"id\":-1566230754,\"predicate\":\"peerChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":666680316,\"predicate\":\"inputPeerChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-2094689180,\"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\":\"join_to_send\",\"type\":\"flags.28?true\"},{\"name\":\"join_request\",\"type\":\"flags.29?true\"},{\"name\":\"forum\",\"type\":\"flags.30?true\"},{\"name\":\"flags2\",\"type\":\"#\"},{\"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\"},{\"name\":\"usernames\",\"type\":\"flags2.0?Vector\"}],\"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\":2131196633,\"predicate\":\"contacts.resolvedPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":-231385849,\"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\":\"flags2\",\"type\":\"#\"},{\"name\":\"can_delete_channel\",\"type\":\"flags2.0?true\"},{\"name\":\"antispam\",\"type\":\"flags2.1?true\"},{\"name\":\"participants_hidden\",\"type\":\"flags2.2?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?ChatReactions\"}],\"type\":\"ChatFull\"},{\"id\":182649427,\"predicate\":\"messageRange\",\"params\":[{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"MessageRange\"},{\"id\":-948520370,\"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\":\"topics\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":-1781355374,\"predicate\":\"messageActionChannelCreate\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"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\":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\":-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\":-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\":-541588713,\"predicate\":\"channels.channelParticipant\",\"params\":[{\"name\":\"participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.ChannelParticipant\"},{\"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\":-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\":-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\":-1328445861,\"predicate\":\"channelParticipantsBots\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"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\":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\":\"emojis\",\"type\":\"flags.1?true\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":834816008,\"predicate\":\"updateStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"emojis\",\"type\":\"flags.1?true\"}],\"type\":\"Update\"},{\"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\":-1821035490,\"predicate\":\"updateSavedGifs\",\"params\":[],\"type\":\"Update\"},{\"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\":-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\":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\":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\":-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\":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\":1358283666,\"predicate\":\"inputMessagesFilterVoice\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":928101534,\"predicate\":\"inputMessagesFilterMusic\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1107622874,\"predicate\":\"inputPrivacyKeyChatInvite\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1343122938,\"predicate\":\"privacyKeyChatInvite\",\"params\":[],\"type\":\"PrivacyKey\"},{\"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\":457133559,\"predicate\":\"updateEditChannelMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1799538451,\"predicate\":\"messageActionPinMessage\",\"params\":[],\"type\":\"MessageAction\"},{\"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\":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\":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\":1218642516,\"predicate\":\"replyInlineMarkup\",\"params\":[{\"name\":\"rows\",\"type\":\"Vector\"}],\"type\":\"ReplyMarkup\"},{\"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\":-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\":649453030,\"predicate\":\"messages.messageEditData\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"caption\",\"type\":\"flags.0?true\"}],\"type\":\"messages.MessageEditData\"},{\"id\":-469536605,\"predicate\":\"updateEditMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"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\":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\":-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\":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\":-1995686519,\"predicate\":\"inputBotInlineMessageID\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputBotInlineMessageID\"},{\"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\":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\":-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\":-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\":975236280,\"predicate\":\"inputMessagesFilterChatPhotos\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1218471511,\"predicate\":\"updateReadChannelOutbox\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":457829485,\"predicate\":\"updateDraftMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"draft\",\"type\":\"DraftMessage\"}],\"type\":\"Update\"},{\"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\":-1615153660,\"predicate\":\"messageActionHistoryClear\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-958657434,\"predicate\":\"messages.featuredStickersNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":-1103615738,\"predicate\":\"messages.featuredStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"premium\",\"type\":\"flags.0?true\"},{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"sets\",\"type\":\"Vector\"},{\"name\":\"unread\",\"type\":\"Vector\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":1461528386,\"predicate\":\"updateReadFeaturedStickers\",\"params\":[],\"type\":\"Update\"},{\"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\":-1706939360,\"predicate\":\"updateRecentStickers\",\"params\":[],\"type\":\"Update\"},{\"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\":-1574314746,\"predicate\":\"updateConfig\",\"params\":[],\"type\":\"Update\"},{\"id\":861169551,\"predicate\":\"updatePtsChanged\",\"params\":[],\"type\":\"Update\"},{\"id\":-440664550,\"predicate\":\"inputMediaPhotoExternal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"spoiler\",\"type\":\"flags.1?true\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":-78455655,\"predicate\":\"inputMediaDocumentExternal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"spoiler\",\"type\":\"flags.1?true\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"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\":-1744710921,\"predicate\":\"documentAttributeHasStickers\",\"params\":[],\"type\":\"DocumentAttribute\"},{\"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\":1336154098,\"predicate\":\"inputBotInlineResultGame\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":1262639204,\"predicate\":\"inputBotInlineMessageGame\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-38694904,\"predicate\":\"messageMediaGame\",\"params\":[{\"name\":\"game\",\"type\":\"Game\"}],\"type\":\"MessageMedia\"},{\"id\":-750828557,\"predicate\":\"inputMediaGame\",\"params\":[{\"name\":\"id\",\"type\":\"InputGame\"}],\"type\":\"InputMedia\"},{\"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\":1358175439,\"predicate\":\"keyboardButtonGame\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-1834538890,\"predicate\":\"messageActionGameScore\",\"params\":[{\"name\":\"game_id\",\"type\":\"long\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"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\":1258196845,\"predicate\":\"updates.differenceTooLong\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"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\":-1663561404,\"predicate\":\"messages.chatsSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"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\":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\":1930545681,\"predicate\":\"webPageNotModified\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"cached_page_views\",\"type\":\"flags.0?int\"}],\"type\":\"WebPage\"},{\"id\":-88417185,\"predicate\":\"inputPrivacyKeyPhoneCall\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1030105979,\"predicate\":\"privacyKeyPhoneCall\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-580219064,\"predicate\":\"sendMessageGamePlayAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"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\":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\":2104790276,\"predicate\":\"dataJSON\",\"params\":[{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"DataJSON\"},{\"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\":-886477832,\"predicate\":\"labeledPrice\",\"params\":[{\"name\":\"label\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"}],\"type\":\"LabeledPrice\"},{\"id\":1048946971,\"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\":\"recurring\",\"type\":\"flags.9?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\"},{\"name\":\"recurring_terms_url\",\"type\":\"flags.9?string\"}],\"type\":\"Invoice\"},{\"id\":-1900697899,\"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\"},{\"name\":\"extended_media\",\"type\":\"flags.2?InputMedia\"}],\"type\":\"InputMedia\"},{\"id\":-368917890,\"predicate\":\"paymentCharge\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"provider_charge_id\",\"type\":\"string\"}],\"type\":\"PaymentCharge\"},{\"id\":-1892568281,\"predicate\":\"messageActionPaymentSentMe\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"recurring_init\",\"type\":\"flags.2?true\"},{\"name\":\"recurring_used\",\"type\":\"flags.3?true\"},{\"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\":-156940077,\"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\"},{\"name\":\"extended_media\",\"type\":\"flags.4?MessageExtendedMedia\"}],\"type\":\"MessageMedia\"},{\"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\":-1344716869,\"predicate\":\"keyboardButtonBuy\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-1776926890,\"predicate\":\"messageActionPaymentSent\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"recurring_init\",\"type\":\"flags.2?true\"},{\"name\":\"recurring_used\",\"type\":\"flags.3?true\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"invoice_slug\",\"type\":\"flags.0?string\"}],\"type\":\"MessageAction\"},{\"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\":-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\":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\":-1610250415,\"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\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.5?WebDocument\"},{\"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\":\"additional_methods\",\"type\":\"flags.6?Vector\"},{\"name\":\"saved_info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"saved_credentials\",\"type\":\"flags.1?Vector\"},{\"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\":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\":-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\":-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\":-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\":-1425052898,\"predicate\":\"updatePhoneCall\",\"params\":[{\"name\":\"phone_call\",\"type\":\"PhoneCall\"}],\"type\":\"Update\"},{\"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\":-1665063993,\"predicate\":\"phoneConnection\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"tcp\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"ipv6\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"peer_tag\",\"type\":\"bytes\"}],\"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\":-2134272152,\"predicate\":\"inputMessagesFilterPhoneCalls\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"missed\",\"type\":\"flags.0?true\"}],\"type\":\"MessagesFilter\"},{\"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\":2054952868,\"predicate\":\"inputMessagesFilterRoundVoice\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1253451181,\"predicate\":\"inputMessagesFilterRoundVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1997373508,\"predicate\":\"sendMessageRecordRoundAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":608050278,\"predicate\":\"sendMessageUploadRoundAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"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\":-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\":-283684427,\"predicate\":\"pageBlockChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"Chat\"}],\"type\":\"PageBlock\"},{\"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\":1180041828,\"predicate\":\"updateLangPackTooLong\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":1442983757,\"predicate\":\"updateLangPack\",\"params\":[{\"name\":\"difference\",\"type\":\"LangPackDifference\"}],\"type\":\"Update\"},{\"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\":338142689,\"predicate\":\"channelParticipantsBanned\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":106343499,\"predicate\":\"channelParticipantsSearch\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"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\":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\"},{\"name\":\"forums\",\"type\":\"flags.17?true\"}],\"type\":\"ChannelAdminLogEventsFilter\"},{\"id\":511092620,\"predicate\":\"topPeerCategoryPhoneCalls\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-2143067670,\"predicate\":\"pageBlockAudio\",\"params\":[{\"name\":\"audio_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":1558266229,\"predicate\":\"popularContact\",\"params\":[{\"name\":\"client_id\",\"type\":\"long\"},{\"name\":\"importers\",\"type\":\"int\"}],\"type\":\"PopularContact\"},{\"id\":1200788123,\"predicate\":\"messageActionScreenshotTaken\",\"params\":[],\"type\":\"MessageAction\"},{\"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\":-451831443,\"predicate\":\"updateFavedStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":-366410403,\"predicate\":\"updateChannelReadMessagesContents\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"messages\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-1040652646,\"predicate\":\"inputMessagesFilterMyMentions\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":1887741886,\"predicate\":\"updateContactsReset\",\"params\":[],\"type\":\"Update\"},{\"id\":-1312568665,\"predicate\":\"channelAdminLogEventActionChangeStickerSet\",\"params\":[{\"name\":\"prev_stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"new_stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-85549226,\"predicate\":\"messageActionCustomAction\",\"params\":[{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":178373535,\"predicate\":\"inputPaymentCredentialsApplePay\",\"params\":[{\"name\":\"payment_data\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":-419271411,\"predicate\":\"inputMessagesFilterGeo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-530392189,\"predicate\":\"inputMessagesFilterContacts\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1304443240,\"predicate\":\"updateChannelAvailableMessages\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"available_min_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1599903217,\"predicate\":\"channelAdminLogEventActionTogglePreHistoryHidden\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"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\":-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\":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\":-266911767,\"predicate\":\"channels.channelParticipantsNotModified\",\"params\":[],\"type\":\"channels.ChannelParticipants\"},{\"id\":1951620897,\"predicate\":\"messages.messagesNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"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\":-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\":-1410748418,\"predicate\":\"messageActionBotAllowed\",\"params\":[{\"name\":\"domain\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-55902537,\"predicate\":\"inputDialogPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"InputDialogPeer\"},{\"id\":-445792507,\"predicate\":\"dialogPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"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\":-207944868,\"predicate\":\"fileHash\",\"params\":[{\"name\":\"offset\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"FileHash\"},{\"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\":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\":-876089816,\"predicate\":\"inputSecureFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":1679398724,\"predicate\":\"secureFileEmpty\",\"params\":[],\"type\":\"SecureFile\"},{\"id\":2097791614,\"predicate\":\"secureFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"long\"},{\"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\":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\":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\":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\":700340377,\"predicate\":\"inputTakeoutFileLocation\",\"params\":[],\"type\":\"InputFileLocation\"},{\"id\":-513517117,\"predicate\":\"updateDialogUnreadMark\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"unread\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"DialogPeer\"}],\"type\":\"Update\"},{\"id\":-253500010,\"predicate\":\"messages.dialogsNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.Dialogs\"},{\"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\":-1255369827,\"predicate\":\"contacts.topPeersDisabled\",\"params\":[],\"type\":\"contacts.TopPeers\"},{\"id\":-1685456582,\"predicate\":\"inputReportReasonCopyright\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-732254058,\"predicate\":\"passwordKdfAlgoUnknown\",\"params\":[],\"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\":982592842,\"predicate\":\"passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow\",\"params\":[{\"name\":\"salt1\",\"type\":\"bytes\"},{\"name\":\"salt2\",\"type\":\"bytes\"},{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"p\",\"type\":\"bytes\"}],\"type\":\"PasswordKdfAlgo\"},{\"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\":-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\":-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\":-1311015810,\"predicate\":\"inputNotifyBroadcasts\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":-703403793,\"predicate\":\"notifyBroadcasts\",\"params\":[],\"type\":\"NotifyPeer\"},{\"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\":504660880,\"predicate\":\"pageBlockKicker\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"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\":-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\":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\":-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\":-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\":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\":-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\":-610373422,\"predicate\":\"inputPrivacyKeyPhoneP2P\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":961092808,\"predicate\":\"privacyKeyPhoneP2P\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":894777186,\"predicate\":\"textAnchor\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"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\":-202219658,\"predicate\":\"messageActionContactSignUp\",\"params\":[],\"type\":\"MessageAction\"},{\"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\":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\":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\":1272375192,\"predicate\":\"messageMediaPoll\",\"params\":[{\"name\":\"poll\",\"type\":\"Poll\"},{\"name\":\"results\",\"type\":\"PollResults\"}],\"type\":\"MessageMedia\"},{\"id\":-264117680,\"predicate\":\"chatOnlines\",\"params\":[{\"name\":\"onlines\",\"type\":\"int\"}],\"type\":\"ChatOnlines\"},{\"id\":1202287072,\"predicate\":\"statsURL\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"StatsURL\"},{\"id\":-525288402,\"predicate\":\"photoStrippedSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"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\"},{\"name\":\"manage_topics\",\"type\":\"flags.13?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\":\"manage_topics\",\"type\":\"flags.18?true\"},{\"name\":\"until_date\",\"type\":\"int\"}],\"type\":\"ChatBannedRights\"},{\"id\":1421875280,\"predicate\":\"updateChatDefaultBannedRights\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"default_banned_rights\",\"type\":\"ChatBannedRights\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"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\":-1150621555,\"predicate\":\"channelParticipantsContacts\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"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\":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\":-1896171181,\"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\":\"long\"},{\"name\":\"file_size_max\",\"type\":\"long\"},{\"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\":-1529000952,\"predicate\":\"inputPrivacyKeyForwards\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1777096355,\"predicate\":\"privacyKeyForwards\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1461304012,\"predicate\":\"inputPrivacyKeyProfilePhoto\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-1777000467,\"predicate\":\"privacyKeyProfilePhoto\",\"params\":[],\"type\":\"PrivacyKey\"},{\"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\":-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\":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\":1684014375,\"predicate\":\"inputDialogPeerFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"InputDialogPeer\"},{\"id\":1363483106,\"predicate\":\"dialogPeerFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"DialogPeer\"},{\"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\":422972864,\"predicate\":\"updateFolderPeers\",\"params\":[{\"name\":\"folder_peers\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":497305826,\"predicate\":\"inputUserFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"InputUser\"},{\"id\":1536380829,\"predicate\":\"inputChannelFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"InputChannel\"},{\"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\":55761658,\"predicate\":\"inputPrivacyKeyPhoneNumber\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-778378131,\"predicate\":\"privacyKeyPhoneNumber\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-1472172887,\"predicate\":\"topPeerCategoryForwardUsers\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-68239120,\"predicate\":\"topPeerCategoryForwardChats\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":84703944,\"predicate\":\"channelAdminLogEventActionChangeLinkedChat\",\"params\":[{\"name\":\"prev_value\",\"type\":\"long\"},{\"name\":\"new_value\",\"type\":\"long\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"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\":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\":-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\":-2079962673,\"predicate\":\"inputPrivacyValueAllowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":-380694650,\"predicate\":\"inputPrivacyValueDisallowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":1796427406,\"predicate\":\"privacyValueAllowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":1103656293,\"predicate\":\"privacyValueDisallowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"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\":1786671974,\"predicate\":\"updatePeerSettings\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"settings\",\"type\":\"PeerSettings\"}],\"type\":\"Update\"},{\"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\":-1263546448,\"predicate\":\"updatePeerLocated\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":241923758,\"predicate\":\"channelAdminLogEventActionChangeLocation\",\"params\":[{\"name\":\"prev_value\",\"type\":\"ChannelLocation\"},{\"name\":\"new_value\",\"type\":\"ChannelLocation\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-606798099,\"predicate\":\"inputReportReasonGeoIrrelevant\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":1401984889,\"predicate\":\"channelAdminLogEventActionToggleSlowMode\",\"params\":[{\"name\":\"prev_value\",\"type\":\"int\"},{\"name\":\"new_value\",\"type\":\"int\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1148485274,\"predicate\":\"auth.authorizationSignUpRequired\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"terms_of_service\",\"type\":\"flags.0?help.TermsOfService\"}],\"type\":\"auth.Authorization\"},{\"id\":-666824391,\"predicate\":\"payments.paymentVerificationNeeded\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"payments.PaymentResult\"},{\"id\":42402760,\"predicate\":\"inputStickerSetAnimatedEmoji\",\"params\":[],\"type\":\"InputStickerSet\"},{\"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\":-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\":-2112423005,\"predicate\":\"updateTheme\",\"params\":[{\"name\":\"theme\",\"type\":\"Theme\"}],\"type\":\"Update\"},{\"id\":-786326563,\"predicate\":\"inputPrivacyKeyAddedByPhone\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1124062251,\"predicate\":\"privacyKeyAddedByPhone\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-2027964103,\"predicate\":\"updateGeoLiveViewed\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1448076945,\"predicate\":\"updateLoginToken\",\"params\":[],\"type\":\"Update\"},{\"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\":-1770371538,\"predicate\":\"inputWallPaperNoFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"InputWallPaper\"},{\"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\":-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\":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\":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\":-1144565411,\"predicate\":\"keyboardButtonRequestPoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"quiz\",\"type\":\"flags.0?Bool\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":1981704948,\"predicate\":\"messageEntityBankCard\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"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\":-118740917,\"predicate\":\"peerSelfLocated\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"PeerLocated\"},{\"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\":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\":-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\":-428884101,\"predicate\":\"inputMediaDice\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":1065280907,\"predicate\":\"messageMediaDice\",\"params\":[{\"name\":\"value\",\"type\":\"int\"},{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":-427863538,\"predicate\":\"inputStickerSetDice\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"InputStickerSet\"},{\"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\":643940105,\"predicate\":\"updatePhoneCallSignalingData\",\"params\":[{\"name\":\"phone_call_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"Update\"},{\"id\":1634294960,\"predicate\":\"chatInvitePeek\",\"params\":[{\"name\":\"chat\",\"type\":\"Chat\"},{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"ChatInvite\"},{\"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\":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\":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\":-761649164,\"predicate\":\"updateChannelMessageForwards\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"forwards\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-96535659,\"predicate\":\"photoSizeProgressive\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"sizes\",\"type\":\"Vector\"}],\"type\":\"PhotoSize\"},{\"id\":-1228606141,\"predicate\":\"messages.messageViews\",\"params\":[{\"name\":\"views\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.MessageViews\"},{\"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\":-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_scheduled\",\"type\":\"flags.2?true\"},{\"name\":\"forum_topic\",\"type\":\"flags.3?true\"},{\"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\":610945826,\"predicate\":\"updatePeerBlocked\",\"params\":[{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"blocked\",\"type\":\"Bool\"}],\"type\":\"Update\"},{\"id\":-386039788,\"predicate\":\"peerBlocked\",\"params\":[{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"PeerBlocked\"},{\"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\":-1392895362,\"predicate\":\"inputMessageCallbackQuery\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"query_id\",\"type\":\"long\"}],\"type\":\"InputMessage\"},{\"id\":453242886,\"predicate\":\"channelParticipantLeft\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"ChannelParticipant\"},{\"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\":-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\":464520273,\"predicate\":\"inputMessagesFilterPinned\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1986399595,\"predicate\":\"stats.messageStats\",\"params\":[{\"name\":\"views_graph\",\"type\":\"StatsGraph\"}],\"type\":\"stats.MessageStats\"},{\"id\":-1730095465,\"predicate\":\"messageActionGeoProximityReached\",\"params\":[{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"to_id\",\"type\":\"Peer\"},{\"name\":\"distance\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-668906175,\"predicate\":\"photoPathSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":-651419003,\"predicate\":\"speakingInGroupCallAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"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\":\"rtmp_stream\",\"type\":\"flags.12?true\"},{\"name\":\"listeners_hidden\",\"type\":\"flags.13?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\":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\":-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\":-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\":-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\":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\":-1966921727,\"predicate\":\"inputPaymentCredentialsGooglePay\",\"params\":[{\"name\":\"payment_token\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":375566091,\"predicate\":\"messages.historyImport\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"messages.HistoryImport\"},{\"id\":-606432698,\"predicate\":\"sendMessageHistoryImportAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"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\":-170010905,\"predicate\":\"inputReportReasonFake\",\"params\":[],\"type\":\"ReportReason\"},{\"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\":1007897979,\"predicate\":\"messageActionSetMessagesTTL\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"period\",\"type\":\"int\"},{\"name\":\"auto_setting_from\",\"type\":\"flags.0?long\"}],\"type\":\"MessageAction\"},{\"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\":-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\":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\":-1571952873,\"predicate\":\"messages.checkedHistoryImportPeer\",\"params\":[{\"name\":\"confirm_text\",\"type\":\"string\"}],\"type\":\"messages.CheckedHistoryImportPeer\"},{\"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\":-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\":-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\":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\":-1281329567,\"predicate\":\"messageActionGroupCallScheduled\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"schedule_date\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"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\":192428418,\"predicate\":\"updateGroupCallConnection\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"presentation\",\"type\":\"flags.0?true\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Update\"},{\"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\":1299263278,\"predicate\":\"updateBotCommands\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"commands\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-1434950843,\"predicate\":\"messageActionSetChatTheme\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-1336228175,\"predicate\":\"sendMessageChooseStickerAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":981691896,\"predicate\":\"sponsoredMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"recommended\",\"type\":\"flags.5?true\"},{\"name\":\"show_peer_photo\",\"type\":\"flags.6?true\"},{\"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\":-907141753,\"predicate\":\"messages.sponsoredMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"posts_between\",\"type\":\"flags.0?int\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.SponsoredMessages\"},{\"id\":215889721,\"predicate\":\"inputStickerSetAnimatedEmojiAnimations\",\"params\":[],\"type\":\"InputStickerSet\"},{\"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\":-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\":-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\":-339958837,\"predicate\":\"messageActionChatJoinedByRequest\",\"params\":[],\"type\":\"MessageAction\"},{\"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\":-1347021750,\"predicate\":\"channelAdminLogEventActionParticipantJoinByRequest\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"approved_by\",\"type\":\"long\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"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\":-191450938,\"predicate\":\"channels.sendAsPeers\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.SendAsPeers\"},{\"id\":-886388890,\"predicate\":\"channelAdminLogEventActionToggleNoForwards\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-738646805,\"predicate\":\"messages.stickerSetNotModified\",\"params\":[],\"type\":\"messages.StickerSet\"},{\"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\":663693416,\"predicate\":\"channelAdminLogEventActionSendMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-702884114,\"predicate\":\"auth.codeTypeMissedCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":-2113903484,\"predicate\":\"auth.sentCodeTypeMissedCall\",\"params\":[{\"name\":\"prefix\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1012759713,\"predicate\":\"auth.loggedOut\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"future_auth_token\",\"type\":\"flags.0?bytes\"}],\"type\":\"auth.LoggedOut\"},{\"id\":1578843320,\"predicate\":\"updateMessageReactions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"reactions\",\"type\":\"MessageReactions\"}],\"type\":\"Update\"},{\"id\":-1546531968,\"predicate\":\"reactionCount\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chosen_order\",\"type\":\"flags.0?int\"},{\"name\":\"reaction\",\"type\":\"Reaction\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"ReactionCount\"},{\"id\":1328256121,\"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_reactions\",\"type\":\"flags.1?Vector\"}],\"type\":\"MessageReactions\"},{\"id\":834488621,\"predicate\":\"messages.messageReactionsList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"reactions\",\"type\":\"Vector\"},{\"name\":\"chats\",\"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\":\"premium\",\"type\":\"flags.2?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\"},{\"id\":852137487,\"predicate\":\"messageEntitySpoiler\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1102180616,\"predicate\":\"channelAdminLogEventActionChangeAvailableReactions\",\"params\":[{\"name\":\"prev_value\",\"type\":\"ChatReactions\"},{\"name\":\"new_value\",\"type\":\"ChatReactions\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1741309751,\"predicate\":\"messages.translateNoResult\",\"params\":[],\"type\":\"messages.TranslatedText\"},{\"id\":-1575684144,\"predicate\":\"messages.translateResultText\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"messages.TranslatedText\"},{\"id\":-1319698788,\"predicate\":\"messagePeerReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"big\",\"type\":\"flags.0?true\"},{\"name\":\"unread\",\"type\":\"flags.1?true\"},{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"reaction\",\"type\":\"Reaction\"}],\"type\":\"MessagePeerReaction\"},{\"id\":-2132064081,\"predicate\":\"groupCallStreamChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"int\"},{\"name\":\"scale\",\"type\":\"int\"},{\"name\":\"last_timestamp_ms\",\"type\":\"long\"}],\"type\":\"GroupCallStreamChannel\"},{\"id\":-790330702,\"predicate\":\"phone.groupCallStreamChannels\",\"params\":[{\"name\":\"channels\",\"type\":\"Vector\"}],\"type\":\"phone.GroupCallStreamChannels\"},{\"id\":177124030,\"predicate\":\"inputReportReasonIllegalDrugs\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1631091139,\"predicate\":\"inputReportReasonPersonalDetails\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":767505458,\"predicate\":\"phone.groupCallStreamRtmpUrl\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"key\",\"type\":\"string\"}],\"type\":\"phone.GroupCallStreamRtmpUrl\"},{\"id\":1165423600,\"predicate\":\"attachMenuBotIconColor\",\"params\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"color\",\"type\":\"int\"}],\"type\":\"AttachMenuBotIconColor\"},{\"id\":-1297663893,\"predicate\":\"attachMenuBotIcon\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"icon\",\"type\":\"Document\"},{\"name\":\"colors\",\"type\":\"flags.0?Vector\"}],\"type\":\"AttachMenuBotIcon\"},{\"id\":-928371502,\"predicate\":\"attachMenuBot\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inactive\",\"type\":\"flags.0?true\"},{\"name\":\"has_settings\",\"type\":\"flags.1?true\"},{\"name\":\"request_write_access\",\"type\":\"flags.2?true\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"peer_types\",\"type\":\"Vector\"},{\"name\":\"icons\",\"type\":\"Vector\"}],\"type\":\"AttachMenuBot\"},{\"id\":-237467044,\"predicate\":\"attachMenuBotsNotModified\",\"params\":[],\"type\":\"AttachMenuBots\"},{\"id\":1011024320,\"predicate\":\"attachMenuBots\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"bots\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"AttachMenuBots\"},{\"id\":-1816172929,\"predicate\":\"attachMenuBotsBot\",\"params\":[{\"name\":\"bot\",\"type\":\"AttachMenuBot\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"AttachMenuBotsBot\"},{\"id\":397910539,\"predicate\":\"updateAttachMenuBots\",\"params\":[],\"type\":\"Update\"},{\"id\":202659196,\"predicate\":\"webViewResultUrl\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"WebViewResult\"},{\"id\":-2010155333,\"predicate\":\"simpleWebViewResultUrl\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"SimpleWebViewResult\"},{\"id\":211046684,\"predicate\":\"webViewMessageSent\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"msg_id\",\"type\":\"flags.0?InputBotInlineMessageID\"}],\"type\":\"WebViewMessageSent\"},{\"id\":361936797,\"predicate\":\"updateWebViewResultSent\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":326529584,\"predicate\":\"keyboardButtonWebView\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-1598009252,\"predicate\":\"keyboardButtonSimpleWebView\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":1205698681,\"predicate\":\"messageActionWebViewDataSentMe\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-1262252875,\"predicate\":\"messageActionWebViewDataSent\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":347625491,\"predicate\":\"updateBotMenuButton\",\"params\":[{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"button\",\"type\":\"BotMenuButton\"}],\"type\":\"Update\"},{\"id\":1966318984,\"predicate\":\"botMenuButtonDefault\",\"params\":[],\"type\":\"BotMenuButton\"},{\"id\":1113113093,\"predicate\":\"botMenuButtonCommands\",\"params\":[],\"type\":\"BotMenuButton\"},{\"id\":-944407322,\"predicate\":\"botMenuButton\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"BotMenuButton\"},{\"id\":-67704655,\"predicate\":\"account.savedRingtonesNotModified\",\"params\":[],\"type\":\"account.SavedRingtones\"},{\"id\":-1041683259,\"predicate\":\"account.savedRingtones\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"ringtones\",\"type\":\"Vector\"}],\"type\":\"account.SavedRingtones\"},{\"id\":1960361625,\"predicate\":\"updateSavedRingtones\",\"params\":[],\"type\":\"Update\"},{\"id\":-1746354498,\"predicate\":\"notificationSoundDefault\",\"params\":[],\"type\":\"NotificationSound\"},{\"id\":1863070943,\"predicate\":\"notificationSoundNone\",\"params\":[],\"type\":\"NotificationSound\"},{\"id\":-2096391452,\"predicate\":\"notificationSoundLocal\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"NotificationSound\"},{\"id\":-9666487,\"predicate\":\"notificationSoundRingtone\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"NotificationSound\"},{\"id\":-1222230163,\"predicate\":\"account.savedRingtone\",\"params\":[],\"type\":\"account.SavedRingtone\"},{\"id\":523271863,\"predicate\":\"account.savedRingtoneConverted\",\"params\":[{\"name\":\"document\",\"type\":\"Document\"}],\"type\":\"account.SavedRingtone\"},{\"id\":2104224014,\"predicate\":\"attachMenuPeerTypeSameBotPM\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":-1020528102,\"predicate\":\"attachMenuPeerTypeBotPM\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":-247016673,\"predicate\":\"attachMenuPeerTypePM\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":84480319,\"predicate\":\"attachMenuPeerTypeChat\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":2080104188,\"predicate\":\"attachMenuPeerTypeBroadcast\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":-317687113,\"predicate\":\"chatInvitePublicJoinRequests\",\"params\":[],\"type\":\"ExportedChatInvite\"},{\"id\":-977967015,\"predicate\":\"inputInvoiceMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"InputInvoice\"},{\"id\":-1020867857,\"predicate\":\"inputInvoiceSlug\",\"params\":[{\"name\":\"slug\",\"type\":\"string\"}],\"type\":\"InputInvoice\"},{\"id\":-1362048039,\"predicate\":\"payments.exportedInvoice\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"payments.ExportedInvoice\"},{\"id\":8703322,\"predicate\":\"updateTranscribedAudio\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pending\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"transcription_id\",\"type\":\"long\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":-1821037486,\"predicate\":\"messages.transcribedAudio\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pending\",\"type\":\"flags.0?true\"},{\"name\":\"transcription_id\",\"type\":\"long\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"messages.TranscribedAudio\"},{\"id\":909284270,\"predicate\":\"dialogFilterDefault\",\"params\":[],\"type\":\"DialogFilter\"},{\"id\":1395946908,\"predicate\":\"help.premiumPromo\",\"params\":[{\"name\":\"status_text\",\"type\":\"string\"},{\"name\":\"status_entities\",\"type\":\"Vector\"},{\"name\":\"video_sections\",\"type\":\"Vector\"},{\"name\":\"videos\",\"type\":\"Vector\"},{\"name\":\"period_options\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"help.PremiumPromo\"},{\"id\":-925956616,\"predicate\":\"messageEntityCustomEmoji\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"document_id\",\"type\":\"long\"}],\"type\":\"MessageEntity\"},{\"id\":-48981863,\"predicate\":\"documentAttributeCustomEmoji\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"free\",\"type\":\"flags.0?true\"},{\"name\":\"text_color\",\"type\":\"flags.1?true\"},{\"name\":\"alt\",\"type\":\"string\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"DocumentAttribute\"},{\"id\":1087454222,\"predicate\":\"stickerSetFullCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"keywords\",\"type\":\"Vector\"},{\"name\":\"documents\",\"type\":\"Vector\"}],\"type\":\"StickerSetCovered\"},{\"id\":-1502273946,\"predicate\":\"inputStorePaymentPremiumSubscription\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"restore\",\"type\":\"flags.0?true\"}],\"type\":\"InputStorePaymentPurpose\"},{\"id\":1634697192,\"predicate\":\"inputStorePaymentGiftPremium\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"}],\"type\":\"InputStorePaymentPurpose\"},{\"id\":-1415514682,\"predicate\":\"messageActionGiftPremium\",\"params\":[{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"},{\"name\":\"months\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":1958953753,\"predicate\":\"premiumGiftOption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"months\",\"type\":\"int\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"},{\"name\":\"bot_url\",\"type\":\"string\"},{\"name\":\"store_product\",\"type\":\"flags.0?string\"}],\"type\":\"PremiumGiftOption\"},{\"id\":-930399486,\"predicate\":\"inputStickerSetPremiumGifts\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-78886548,\"predicate\":\"updateReadFeaturedEmojiStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":-1360618136,\"predicate\":\"inputPrivacyKeyVoiceMessages\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":110621716,\"predicate\":\"privacyKeyVoiceMessages\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-1996951013,\"predicate\":\"paymentFormMethod\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"PaymentFormMethod\"},{\"id\":-193992412,\"predicate\":\"inputWebFileAudioAlbumThumbLocation\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"small\",\"type\":\"flags.2?true\"},{\"name\":\"document\",\"type\":\"flags.0?InputDocument\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"performer\",\"type\":\"flags.1?string\"}],\"type\":\"InputWebFileLocation\"},{\"id\":769727150,\"predicate\":\"emojiStatusEmpty\",\"params\":[],\"type\":\"EmojiStatus\"},{\"id\":-1835310691,\"predicate\":\"emojiStatus\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"}],\"type\":\"EmojiStatus\"},{\"id\":-97474361,\"predicate\":\"emojiStatusUntil\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"},{\"name\":\"until\",\"type\":\"int\"}],\"type\":\"EmojiStatus\"},{\"id\":674706841,\"predicate\":\"updateUserEmojiStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"emoji_status\",\"type\":\"EmojiStatus\"}],\"type\":\"Update\"},{\"id\":821314523,\"predicate\":\"updateRecentEmojiStatuses\",\"params\":[],\"type\":\"Update\"},{\"id\":-796072379,\"predicate\":\"account.emojiStatusesNotModified\",\"params\":[],\"type\":\"account.EmojiStatuses\"},{\"id\":-1866176559,\"predicate\":\"account.emojiStatuses\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"statuses\",\"type\":\"Vector\"}],\"type\":\"account.EmojiStatuses\"},{\"id\":2046153753,\"predicate\":\"reactionEmpty\",\"params\":[],\"type\":\"Reaction\"},{\"id\":455247544,\"predicate\":\"reactionEmoji\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"Reaction\"},{\"id\":-1992950669,\"predicate\":\"reactionCustomEmoji\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"}],\"type\":\"Reaction\"},{\"id\":-352570692,\"predicate\":\"chatReactionsNone\",\"params\":[],\"type\":\"ChatReactions\"},{\"id\":1385335754,\"predicate\":\"chatReactionsAll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"allow_custom\",\"type\":\"flags.0?true\"}],\"type\":\"ChatReactions\"},{\"id\":1713193015,\"predicate\":\"chatReactionsSome\",\"params\":[{\"name\":\"reactions\",\"type\":\"Vector\"}],\"type\":\"ChatReactions\"},{\"id\":-1334846497,\"predicate\":\"messages.reactionsNotModified\",\"params\":[],\"type\":\"messages.Reactions\"},{\"id\":-352454890,\"predicate\":\"messages.reactions\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"reactions\",\"type\":\"Vector\"}],\"type\":\"messages.Reactions\"},{\"id\":1870160884,\"predicate\":\"updateRecentReactions\",\"params\":[],\"type\":\"Update\"},{\"id\":-2030252155,\"predicate\":\"updateMoveStickerSetToTop\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"emojis\",\"type\":\"flags.1?true\"},{\"name\":\"stickerset\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":1511364673,\"predicate\":\"auth.sentCodeTypeEmailCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"apple_signin_allowed\",\"type\":\"flags.0?true\"},{\"name\":\"google_signin_allowed\",\"type\":\"flags.1?true\"},{\"name\":\"email_pattern\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"next_phone_login_date\",\"type\":\"flags.2?int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1521934870,\"predicate\":\"auth.sentCodeTypeSetUpEmailRequired\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"apple_signin_allowed\",\"type\":\"flags.0?true\"},{\"name\":\"google_signin_allowed\",\"type\":\"flags.1?true\"}],\"type\":\"auth.SentCodeType\"},{\"id\":1128644211,\"predicate\":\"emailVerifyPurposeLoginSetup\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"}],\"type\":\"EmailVerifyPurpose\"},{\"id\":1383932651,\"predicate\":\"emailVerifyPurposeLoginChange\",\"params\":[],\"type\":\"EmailVerifyPurpose\"},{\"id\":-1141565819,\"predicate\":\"emailVerifyPurposePassport\",\"params\":[],\"type\":\"EmailVerifyPurpose\"},{\"id\":-1842457175,\"predicate\":\"emailVerificationCode\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"EmailVerification\"},{\"id\":-611279166,\"predicate\":\"emailVerificationGoogle\",\"params\":[{\"name\":\"token\",\"type\":\"string\"}],\"type\":\"EmailVerification\"},{\"id\":-1764723459,\"predicate\":\"emailVerificationApple\",\"params\":[{\"name\":\"token\",\"type\":\"string\"}],\"type\":\"EmailVerification\"},{\"id\":731303195,\"predicate\":\"account.emailVerified\",\"params\":[{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"account.EmailVerified\"},{\"id\":-507835039,\"predicate\":\"account.emailVerifiedLogin\",\"params\":[{\"name\":\"email\",\"type\":\"string\"},{\"name\":\"sent_code\",\"type\":\"auth.SentCode\"}],\"type\":\"account.EmailVerified\"},{\"id\":-1225711938,\"predicate\":\"premiumSubscriptionOption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"current\",\"type\":\"flags.1?true\"},{\"name\":\"can_purchase_upgrade\",\"type\":\"flags.2?true\"},{\"name\":\"months\",\"type\":\"int\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"},{\"name\":\"bot_url\",\"type\":\"string\"},{\"name\":\"store_product\",\"type\":\"flags.0?string\"}],\"type\":\"PremiumSubscriptionOption\"},{\"id\":80008398,\"predicate\":\"inputStickerSetEmojiGenericAnimations\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":701560302,\"predicate\":\"inputStickerSetEmojiDefaultStatuses\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-1206095820,\"predicate\":\"sendAsPeer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"premium_required\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"SendAsPeer\"},{\"id\":-1386050360,\"predicate\":\"messageExtendedMediaPreview\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"w\",\"type\":\"flags.0?int\"},{\"name\":\"h\",\"type\":\"flags.0?int\"},{\"name\":\"thumb\",\"type\":\"flags.1?PhotoSize\"},{\"name\":\"video_duration\",\"type\":\"flags.2?int\"}],\"type\":\"MessageExtendedMedia\"},{\"id\":-297296796,\"predicate\":\"messageExtendedMedia\",\"params\":[{\"name\":\"media\",\"type\":\"MessageMedia\"}],\"type\":\"MessageExtendedMedia\"},{\"id\":1517529484,\"predicate\":\"updateMessageExtendedMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"extended_media\",\"type\":\"MessageExtendedMedia\"}],\"type\":\"Update\"},{\"id\":-50416996,\"predicate\":\"stickerKeyword\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"},{\"name\":\"keyword\",\"type\":\"Vector\"}],\"type\":\"StickerKeyword\"},{\"id\":-1274595769,\"predicate\":\"username\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"editable\",\"type\":\"flags.0?true\"},{\"name\":\"active\",\"type\":\"flags.1?true\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Username\"},{\"id\":-263212119,\"predicate\":\"channelAdminLogEventActionChangeUsernames\",\"params\":[{\"name\":\"prev_value\",\"type\":\"Vector\"},{\"name\":\"new_value\",\"type\":\"Vector\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":46949251,\"predicate\":\"channelAdminLogEventActionToggleForum\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1483767080,\"predicate\":\"channelAdminLogEventActionCreateTopic\",\"params\":[{\"name\":\"topic\",\"type\":\"ForumTopic\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-261103096,\"predicate\":\"channelAdminLogEventActionEditTopic\",\"params\":[{\"name\":\"prev_topic\",\"type\":\"ForumTopic\"},{\"name\":\"new_topic\",\"type\":\"ForumTopic\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1374254839,\"predicate\":\"channelAdminLogEventActionDeleteTopic\",\"params\":[{\"name\":\"topic\",\"type\":\"ForumTopic\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1569535291,\"predicate\":\"channelAdminLogEventActionPinTopic\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"prev_topic\",\"type\":\"flags.0?ForumTopic\"},{\"name\":\"new_topic\",\"type\":\"flags.1?ForumTopic\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":37687451,\"predicate\":\"forumTopicDeleted\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"ForumTopic\"},{\"id\":1903173033,\"predicate\":\"forumTopic\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"my\",\"type\":\"flags.1?true\"},{\"name\":\"closed\",\"type\":\"flags.2?true\"},{\"name\":\"pinned\",\"type\":\"flags.3?true\"},{\"name\":\"short\",\"type\":\"flags.5?true\"},{\"name\":\"hidden\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"icon_color\",\"type\":\"int\"},{\"name\":\"icon_emoji_id\",\"type\":\"flags.0?long\"},{\"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\":\"unread_reactions_count\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"draft\",\"type\":\"flags.4?DraftMessage\"}],\"type\":\"ForumTopic\"},{\"id\":913709011,\"predicate\":\"messages.forumTopics\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"order_by_create_date\",\"type\":\"flags.0?true\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"topics\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"messages.ForumTopics\"},{\"id\":228168278,\"predicate\":\"messageActionTopicCreate\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"icon_color\",\"type\":\"int\"},{\"name\":\"icon_emoji_id\",\"type\":\"flags.0?long\"}],\"type\":\"MessageAction\"},{\"id\":-1064024032,\"predicate\":\"messageActionTopicEdit\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"icon_emoji_id\",\"type\":\"flags.1?long\"},{\"name\":\"closed\",\"type\":\"flags.2?Bool\"},{\"name\":\"hidden\",\"type\":\"flags.3?Bool\"}],\"type\":\"MessageAction\"},{\"id\":422509539,\"predicate\":\"updateChannelPinnedTopic\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"topic_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1548122514,\"predicate\":\"inputNotifyForumTopic\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"int\"}],\"type\":\"InputNotifyPeer\"},{\"id\":577659656,\"predicate\":\"notifyForumTopic\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_msg_id\",\"type\":\"int\"}],\"type\":\"NotifyPeer\"},{\"id\":1153562857,\"predicate\":\"inputStickerSetEmojiDefaultTopicIcons\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":406407439,\"predicate\":\"messages.sponsoredMessagesEmpty\",\"params\":[],\"type\":\"messages.SponsoredMessages\"},{\"id\":-31881726,\"predicate\":\"updateChannelPinnedTopics\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"order\",\"type\":\"flags.0?Vector\"}],\"type\":\"Update\"},{\"id\":1135897376,\"predicate\":\"defaultHistoryTTL\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"DefaultHistoryTTL\"},{\"id\":116234636,\"predicate\":\"auth.codeTypeFragmentSms\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":-648651719,\"predicate\":\"auth.sentCodeTypeFragmentSms\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":1103040667,\"predicate\":\"exportedContactToken\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"ExportedContactToken\"},{\"id\":1693675004,\"predicate\":\"channelAdminLogEventActionToggleAntiSpam\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1474192222,\"predicate\":\"messageActionSuggestProfilePhoto\",\"params\":[{\"name\":\"photo\",\"type\":\"Photo\"}],\"type\":\"MessageAction\"},{\"id\":-404267113,\"predicate\":\"messageActionAttachMenuBotAllowed\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":2008112412,\"predicate\":\"stickerSetNoCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"}],\"type\":\"StickerSetCovered\"},{\"id\":542282808,\"predicate\":\"updateUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"Update\"}],\"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\":-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\":-1923962543,\"method\":\"auth.signIn\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"flags.0?string\"},{\"name\":\"email_verification\",\"type\":\"flags.1?EmailVerification\"}],\"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\":-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\":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\":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\":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\":482476935,\"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\":\"update_stickersets_order\",\"type\":\"flags.15?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.9?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\":1967638886,\"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\":\"update_stickersets_order\",\"type\":\"flags.15?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.9?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\":-966673468,\"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\":\"top_msg_id\",\"type\":\"flags.9?int\"},{\"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\":3450904,\"method\":\"messages.createChat\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"ttl_period\",\"type\":\"flags.0?int\"}],\"type\":\"Updates\"},{\"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\":473782614,\"method\":\"photos.updateProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"fallback\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"photos.Photo\"},{\"id\":-1980559511,\"method\":\"photos.uploadProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"fallback\",\"type\":\"flags.3?true\"},{\"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\":-1291540959,\"method\":\"upload.saveFilePart\",\"params\":[{\"name\":\"file_id\",\"type\":\"long\"},{\"name\":\"file_part\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-1101843010,\"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\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.File\"},{\"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\":-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\":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\":-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\":-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\":-1663104819,\"method\":\"help.getSupport\",\"params\":[],\"type\":\"help.Support\"},{\"id\":916930423,\"method\":\"messages.readMessageContents\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedMessages\"},{\"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\":301470424,\"method\":\"contacts.search\",\"params\":[{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"contacts.Found\"},{\"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\":-1564422284,\"method\":\"account.deleteAccount\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reason\",\"type\":\"string\"},{\"name\":\"password\",\"type\":\"flags.0?InputCheckPasswordSRP\"}],\"type\":\"Bool\"},{\"id\":150761757,\"method\":\"account.getAccountTTL\",\"params\":[],\"type\":\"AccountDaysTTL\"},{\"id\":608323678,\"method\":\"account.setAccountTTL\",\"params\":[{\"name\":\"ttl\",\"type\":\"AccountDaysTTL\"}],\"type\":\"Bool\"},{\"id\":-627372787,\"method\":\"invokeWithLayer\",\"params\":[{\"name\":\"layer\",\"type\":\"int\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-113456221,\"method\":\"contacts.resolveUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"contacts.ResolvedPeer\"},{\"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\":-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\":954152242,\"method\":\"account.updateDeviceLocked\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"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\":-1956073268,\"method\":\"messages.getWebPagePreview\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"}],\"type\":\"MessageMedia\"},{\"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\":-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\":-1080796745,\"method\":\"invokeWithoutUpdates\",\"params\":[{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"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\":-1877938321,\"method\":\"help.getAppChangelog\",\"params\":[{\"name\":\"prev_app_version\",\"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\":-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\":-1862244601,\"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\"},{\"name\":\"ttl_period\",\"type\":\"flags.4?int\"}],\"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\":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\":-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\":\"emojis\",\"type\":\"flags.1?true\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1309538785,\"method\":\"messages.getDocumentByHash\",\"params\":[{\"name\":\"sha256\",\"type\":\"bytes\"},{\"name\":\"size\",\"type\":\"long\"},{\"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\":-738468661,\"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\":\"top_msg_id\",\"type\":\"flags.9?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\":-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\":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\":-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\":-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\":-462373635,\"method\":\"messages.getPeerDialogs\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-1271718337,\"method\":\"messages.saveDraft\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.2?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\":\"emojis\",\"type\":\"flags.1?true\"},{\"name\":\"offset_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ArchivedStickers\"},{\"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\":-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\":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\":-1907842680,\"method\":\"auth.dropTempAuthKeys\",\"params\":[{\"name\":\"except_auth_keys\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"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\":-333262899,\"method\":\"help.setBotUpdatesStatus\",\"params\":[{\"name\":\"pending_updates_count\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"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\":-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\":619086221,\"method\":\"upload.getWebFile\",\"params\":[{\"name\":\"location\",\"type\":\"InputWebFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.WebFile\"},{\"id\":924093883,\"method\":\"payments.getPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"invoice\",\"type\":\"InputInvoice\"},{\"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\":-1228345045,\"method\":\"payments.validateRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"save\",\"type\":\"flags.0?true\"},{\"name\":\"invoice\",\"type\":\"InputInvoice\"},{\"name\":\"info\",\"type\":\"PaymentRequestedInfo\"}],\"type\":\"payments.ValidatedRequestedInfo\"},{\"id\":755192367,\"method\":\"payments.sendPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"form_id\",\"type\":\"long\"},{\"name\":\"invoice\",\"type\":\"InputInvoice\"},{\"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\":1151208273,\"method\":\"account.getTmpPassword\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"},{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"account.TmpPassword\"},{\"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\":-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\":-1876841625,\"method\":\"stickers.createStickerSet\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"animated\",\"type\":\"flags.1?true\"},{\"name\":\"videos\",\"type\":\"flags.4?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\":1369162417,\"method\":\"messages.uploadMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"media\",\"type\":\"InputMedia\"}],\"type\":\"MessageMedia\"},{\"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\":962554330,\"method\":\"upload.getCdnFile\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"long\"},{\"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\":1375900482,\"method\":\"help.getCdnConfig\",\"params\":[],\"type\":\"CdnConfig\"},{\"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\":-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\":-1847836879,\"method\":\"upload.getCdnFileHashes\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"long\"}],\"type\":\"Vector\"},{\"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\":-359881479,\"method\":\"channels.setStickers\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"Bool\"},{\"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\":-357180360,\"method\":\"channels.readMessageContents\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-2020263951,\"method\":\"contacts.resetSaved\",\"params\":[],\"type\":\"Bool\"},{\"id\":-251140208,\"method\":\"messages.getUnreadMentions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?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\"}],\"type\":\"messages.Messages\"},{\"id\":-1683319225,\"method\":\"channels.deleteHistory\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"for_everyone\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1036054804,\"method\":\"help.getRecentMeUrls\",\"params\":[{\"name\":\"referer\",\"type\":\"string\"}],\"type\":\"help.RecentMeUrls\"},{\"id\":-356796084,\"method\":\"channels.togglePreHistoryHidden\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":921026381,\"method\":\"messages.readMentions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"}],\"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\":-1225713124,\"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\":\"update_stickersets_order\",\"type\":\"flags.15?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.9?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\":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\":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\":-1856595926,\"method\":\"upload.getFileHashes\",\"params\":[{\"name\":\"location\",\"type\":\"InputFileLocation\"},{\"name\":\"offset\",\"type\":\"long\"}],\"type\":\"Vector\"},{\"id\":749019089,\"method\":\"help.getTermsOfServiceUpdate\",\"params\":[],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":-294455398,\"method\":\"help.acceptTermsOfService\",\"params\":[{\"name\":\"id\",\"type\":\"DataJSON\"}],\"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\":-1865902923,\"method\":\"users.setSecureValueErrors\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"},{\"name\":\"errors\",\"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\":-1730136133,\"method\":\"account.sendVerifyEmailCode\",\"params\":[{\"name\":\"purpose\",\"type\":\"EmailVerifyPurpose\"},{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"account.SentEmailCode\"},{\"id\":53322959,\"method\":\"account.verifyEmail\",\"params\":[{\"name\":\"purpose\",\"type\":\"EmailVerifyPurpose\"},{\"name\":\"verification\",\"type\":\"EmailVerification\"}],\"type\":\"account.EmailVerified\"},{\"id\":1072547679,\"method\":\"help.getDeepLinkInfo\",\"params\":[{\"name\":\"path\",\"type\":\"string\"}],\"type\":\"help.DeepLinkInfo\"},{\"id\":-2098076769,\"method\":\"contacts.getSaved\",\"params\":[],\"type\":\"Vector\"},{\"id\":-2092831552,\"method\":\"channels.getLeftChannels\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"messages.Chats\"},{\"id\":-1896617296,\"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?long\"}],\"type\":\"account.Takeout\"},{\"id\":489050862,\"method\":\"account.finishTakeoutSession\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"success\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":486505992,\"method\":\"messages.getSplitRanges\",\"params\":[],\"type\":\"Vector\"},{\"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\":-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\":-2062238246,\"method\":\"contacts.toggleTopPeers\",\"params\":[{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":2119757468,\"method\":\"messages.clearAllDrafts\",\"params\":[],\"type\":\"Bool\"},{\"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\":1784243458,\"method\":\"langpack.getLanguage\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"LangPackLanguage\"},{\"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\":-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\":-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\":-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\":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\":-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\":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\":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\":11435201,\"method\":\"messages.getSearchCounters\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"filters\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"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\":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\":-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\":-1892102881,\"method\":\"channels.editCreator\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"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\":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\":-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\":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\":978872812,\"method\":\"account.getTheme\",\"params\":[{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"theme\",\"type\":\"InputTheme\"}],\"type\":\"Theme\"},{\"id\":1913054296,\"method\":\"account.getThemes\",\"params\":[{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.Themes\"},{\"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\":-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\":300429806,\"method\":\"channels.getInactiveChannels\",\"params\":[],\"type\":\"messages.InactiveChats\"},{\"id\":1705865692,\"method\":\"account.getMultiWallPapers\",\"params\":[{\"name\":\"wallpapers\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"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\":779736953,\"method\":\"payments.getBankCardData\",\"params\":[{\"name\":\"number\",\"type\":\"string\"}],\"type\":\"payments.BankCardData\"},{\"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\":-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\":-1707717072,\"method\":\"stickers.setStickerSetThumb\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"thumb\",\"type\":\"InputDocument\"}],\"type\":\"messages.StickerSet\"},{\"id\":85399130,\"method\":\"bots.setBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"commands\",\"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\":-1063816159,\"method\":\"help.getPromoData\",\"params\":[],\"type\":\"help.PromoData\"},{\"id\":505748629,\"method\":\"help.hidePromoData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-8744061,\"method\":\"phone.sendSignalingData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-589330937,\"method\":\"stats.getMegagroupStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"stats.MegagroupStats\"},{\"id\":-349483786,\"method\":\"account.getGlobalPrivacySettings\",\"params\":[],\"type\":\"GlobalPrivacySettings\"},{\"id\":517647042,\"method\":\"account.setGlobalPrivacySettings\",\"params\":[{\"name\":\"settings\",\"type\":\"GlobalPrivacySettings\"}],\"type\":\"GlobalPrivacySettings\"},{\"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\":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\":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\":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\"},{\"id\":-299714136,\"method\":\"messages.unpinAllMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1221445336,\"method\":\"phone.createGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"rtmp_stream\",\"type\":\"flags.2?true\"},{\"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\":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\":-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\":187239529,\"method\":\"channels.convertToGigagroup\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":1573261059,\"method\":\"messages.checkHistoryImportPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.CheckedHistoryImportPeer\"},{\"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\":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\":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\":-1828139493,\"method\":\"account.resetPassword\",\"params\":[],\"type\":\"account.ResetPasswordResult\"},{\"id\":1284770294,\"method\":\"account.declinePasswordReset\",\"params\":[],\"type\":\"Bool\"},{\"id\":221691769,\"method\":\"auth.checkRecoveryPassword\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-700916087,\"method\":\"account.getChatThemes\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.Themes\"},{\"id\":-432283329,\"method\":\"messages.setChatTheme\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"emoticon\",\"type\":\"string\"}],\"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\":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\":231174382,\"method\":\"channels.getSendAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"channels.SendAsPeers\"},{\"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\":913655003,\"method\":\"channels.deleteParticipantHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":-754091820,\"method\":\"messages.sendReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"big\",\"type\":\"flags.1?true\"},{\"name\":\"add_to_recent\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"reaction\",\"type\":\"flags.0?Vector\"}],\"type\":\"Updates\"},{\"id\":-1950707482,\"method\":\"messages.getMessagesReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":1176190792,\"method\":\"messages.getMessageReactionsList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"reaction\",\"type\":\"flags.0?Reaction\"},{\"name\":\"offset\",\"type\":\"flags.1?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.MessageReactionsList\"},{\"id\":-21928079,\"method\":\"messages.setChatAvailableReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"available_reactions\",\"type\":\"ChatReactions\"}],\"type\":\"Updates\"},{\"id\":417243308,\"method\":\"messages.getAvailableReactions\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.AvailableReactions\"},{\"id\":1330094102,\"method\":\"messages.setDefaultReaction\",\"params\":[{\"name\":\"reaction\",\"type\":\"Reaction\"}],\"type\":\"Bool\"},{\"id\":617508334,\"method\":\"messages.translateText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"flags.0?InputPeer\"},{\"name\":\"msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"text\",\"type\":\"flags.1?string\"},{\"name\":\"from_lang\",\"type\":\"flags.2?string\"},{\"name\":\"to_lang\",\"type\":\"string\"}],\"type\":\"messages.TranslatedText\"},{\"id\":841173339,\"method\":\"messages.getUnreadReactions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?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\"}],\"type\":\"messages.Messages\"},{\"id\":1420459918,\"method\":\"messages.readReactions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":-1963375804,\"method\":\"contacts.resolvePhone\",\"params\":[{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":447879488,\"method\":\"phone.getGroupCallStreamChannels\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"phone.GroupCallStreamChannels\"},{\"id\":-558650433,\"method\":\"phone.getGroupCallStreamRtmpUrl\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"revoke\",\"type\":\"Bool\"}],\"type\":\"phone.GroupCallStreamRtmpUrl\"},{\"id\":276705696,\"method\":\"messages.searchSentMedia\",\"params\":[{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":385663691,\"method\":\"messages.getAttachMenuBots\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"AttachMenuBots\"},{\"id\":1998676370,\"method\":\"messages.getAttachMenuBot\",\"params\":[{\"name\":\"bot\",\"type\":\"InputUser\"}],\"type\":\"AttachMenuBotsBot\"},{\"id\":1777704297,\"method\":\"messages.toggleBotInAttachMenu\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"write_allowed\",\"type\":\"flags.0?true\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":395003915,\"method\":\"messages.requestWebView\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"from_bot_menu\",\"type\":\"flags.4?true\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"url\",\"type\":\"flags.1?string\"},{\"name\":\"start_param\",\"type\":\"flags.3?string\"},{\"name\":\"theme_params\",\"type\":\"flags.2?DataJSON\"},{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.9?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"WebViewResult\"},{\"id\":2146648841,\"method\":\"messages.prolongWebView\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.9?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Bool\"},{\"id\":698084494,\"method\":\"messages.requestSimpleWebView\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"theme_params\",\"type\":\"flags.0?DataJSON\"},{\"name\":\"platform\",\"type\":\"string\"}],\"type\":\"SimpleWebViewResult\"},{\"id\":172168437,\"method\":\"messages.sendWebViewResultMessage\",\"params\":[{\"name\":\"bot_query_id\",\"type\":\"string\"},{\"name\":\"result\",\"type\":\"InputBotInlineResult\"}],\"type\":\"WebViewMessageSent\"},{\"id\":-603831608,\"method\":\"messages.sendWebViewData\",\"params\":[{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"button_text\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":1157944655,\"method\":\"bots.setBotMenuButton\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"button\",\"type\":\"BotMenuButton\"}],\"type\":\"Bool\"},{\"id\":-1671369944,\"method\":\"bots.getBotMenuButton\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"BotMenuButton\"},{\"id\":-510647672,\"method\":\"account.getSavedRingtones\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.SavedRingtones\"},{\"id\":1038768899,\"method\":\"account.saveRingtone\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"account.SavedRingtone\"},{\"id\":-2095414366,\"method\":\"account.uploadRingtone\",\"params\":[{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"file_name\",\"type\":\"string\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":2021942497,\"method\":\"bots.setBotBroadcastDefaultAdminRights\",\"params\":[{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"}],\"type\":\"Bool\"},{\"id\":-1839281686,\"method\":\"bots.setBotGroupDefaultAdminRights\",\"params\":[{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"}],\"type\":\"Bool\"},{\"id\":1092913030,\"method\":\"phone.saveCallLog\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"file\",\"type\":\"InputFile\"}],\"type\":\"Bool\"},{\"id\":-456419968,\"method\":\"channels.toggleJoinToSend\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":1277789622,\"method\":\"channels.toggleJoinRequest\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":261206117,\"method\":\"payments.exportInvoice\",\"params\":[{\"name\":\"invoice_media\",\"type\":\"InputMedia\"}],\"type\":\"payments.ExportedInvoice\"},{\"id\":647928393,\"method\":\"messages.transcribeAudio\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"messages.TranscribedAudio\"},{\"id\":2132608815,\"method\":\"messages.rateTranscribedAudio\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"transcription_id\",\"type\":\"long\"},{\"name\":\"good\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-2131921795,\"method\":\"payments.assignAppStoreTransaction\",\"params\":[{\"name\":\"receipt\",\"type\":\"bytes\"},{\"name\":\"purpose\",\"type\":\"InputStorePaymentPurpose\"}],\"type\":\"Updates\"},{\"id\":-537046829,\"method\":\"payments.assignPlayMarketTransaction\",\"params\":[{\"name\":\"receipt\",\"type\":\"DataJSON\"},{\"name\":\"purpose\",\"type\":\"InputStorePaymentPurpose\"}],\"type\":\"Updates\"},{\"id\":-1614700874,\"method\":\"payments.canPurchasePremium\",\"params\":[{\"name\":\"purpose\",\"type\":\"InputStorePaymentPurpose\"}],\"type\":\"Bool\"},{\"id\":-1206152236,\"method\":\"help.getPremiumPromo\",\"params\":[],\"type\":\"help.PremiumPromo\"},{\"id\":-643100844,\"method\":\"messages.getCustomEmojiDocuments\",\"params\":[{\"name\":\"document_id\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-67329649,\"method\":\"messages.getEmojiStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.AllStickers\"},{\"id\":248473398,\"method\":\"messages.getFeaturedEmojiStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":-70001045,\"method\":\"account.updateEmojiStatus\",\"params\":[{\"name\":\"emoji_status\",\"type\":\"EmojiStatus\"}],\"type\":\"Bool\"},{\"id\":-696962170,\"method\":\"account.getDefaultEmojiStatuses\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.EmojiStatuses\"},{\"id\":257392901,\"method\":\"account.getRecentEmojiStatuses\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.EmojiStatuses\"},{\"id\":404757166,\"method\":\"account.clearRecentEmojiStatuses\",\"params\":[],\"type\":\"Bool\"},{\"id\":1063567478,\"method\":\"messages.reportReaction\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"reaction_peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-1149164102,\"method\":\"messages.getTopReactions\",\"params\":[{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Reactions\"},{\"id\":960896434,\"method\":\"messages.getRecentReactions\",\"params\":[{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Reactions\"},{\"id\":-1644236876,\"method\":\"messages.clearRecentReactions\",\"params\":[],\"type\":\"Bool\"},{\"id\":-2064119788,\"method\":\"messages.getExtendedMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":767062953,\"method\":\"auth.importWebTokenAuthorization\",\"params\":[{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"web_auth_token\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":-279966037,\"method\":\"account.reorderUsernames\",\"params\":[{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":1490465654,\"method\":\"account.toggleUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"},{\"name\":\"active\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-1268978403,\"method\":\"channels.reorderUsernames\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":1358053637,\"method\":\"channels.toggleUsername\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"username\",\"type\":\"string\"},{\"name\":\"active\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":170155475,\"method\":\"channels.deactivateAllUsernames\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Bool\"},{\"id\":-1540781271,\"method\":\"channels.toggleForum\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":-200539612,\"method\":\"channels.createForumTopic\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"icon_color\",\"type\":\"flags.0?int\"},{\"name\":\"icon_emoji_id\",\"type\":\"flags.3?long\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"send_as\",\"type\":\"flags.2?InputPeer\"}],\"type\":\"Updates\"},{\"id\":233136337,\"method\":\"channels.getForumTopics\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"q\",\"type\":\"flags.0?string\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_topic\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ForumTopics\"},{\"id\":-1333584199,\"method\":\"channels.getForumTopicsByID\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"topics\",\"type\":\"Vector\"}],\"type\":\"messages.ForumTopics\"},{\"id\":-186670715,\"method\":\"channels.editForumTopic\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"topic_id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"icon_emoji_id\",\"type\":\"flags.1?long\"},{\"name\":\"closed\",\"type\":\"flags.2?Bool\"},{\"name\":\"hidden\",\"type\":\"flags.3?Bool\"}],\"type\":\"Updates\"},{\"id\":1814925350,\"method\":\"channels.updatePinnedForumTopic\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"topic_id\",\"type\":\"int\"},{\"name\":\"pinned\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":876830509,\"method\":\"channels.deleteTopicHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"top_msg_id\",\"type\":\"int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":693150095,\"method\":\"channels.reorderPinnedForumTopics\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"force\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":1760814315,\"method\":\"channels.toggleAntiSpam\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":-1471109485,\"method\":\"channels.reportAntiSpamFalsePositive\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-1632299963,\"method\":\"messages.setDefaultHistoryTTL\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1703637384,\"method\":\"messages.getDefaultHistoryTTL\",\"params\":[],\"type\":\"DefaultHistoryTTL\"},{\"id\":-127582169,\"method\":\"contacts.exportContactToken\",\"params\":[],\"type\":\"ExportedContactToken\"},{\"id\":318789512,\"method\":\"contacts.importContactToken\",\"params\":[{\"name\":\"token\",\"type\":\"string\"}],\"type\":\"User\"},{\"id\":-1189444673,\"method\":\"photos.uploadContactProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"suggest\",\"type\":\"flags.3?true\"},{\"name\":\"save\",\"type\":\"flags.4?true\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"file\",\"type\":\"flags.0?InputFile\"},{\"name\":\"video\",\"type\":\"flags.1?InputFile\"},{\"name\":\"video_start_ts\",\"type\":\"flags.2?double\"}],\"type\":\"photos.Photo\"},{\"id\":1785624660,\"method\":\"channels.toggleParticipantsHidden\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"}]},\"layer\":151} as {\n MTProto: {\n constructors: MTProtoConstructor[],\n methods: MTProtoMethod[],\n constructorsIndex?: {[id: number]: number}\n },\n API: {\n constructors: MTProtoConstructor[],\n methods: MTProtoMethod[],\n constructorsIndex?: {[id: number]: number}\n },\n layer: number,\n};\n","export default 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","import bigInt from 'big-integer';\nimport intToUint from '../number/intToUint';\n\nexport default function ulongFromInts(high: number, low: number) {\n high = intToUint(high), low = intToUint(low);\n return bigInt(high).shiftLeft(32).add(bigInt(low));\n}\n","import bigInt from 'big-integer';\n\nexport const safeBigInt = bigInt(Number.MAX_SAFE_INTEGER);\nexport const ulongBigInt = bigInt(bigInt[2]).pow(64);\nexport const longBigInt = ulongBigInt.divide(bigInt[2]);\n","import bigInt from 'big-integer';\nimport { longBigInt, ulongBigInt } from './bigIntConstants';\n\nexport function bigIntFromBytes(bytes: Uint8Array | number[], base = 256) {\n return bigInt.fromArray(bytes instanceof Uint8Array ? [...bytes] : bytes, base);\n}\n\nexport function bigIntToBytes(bigInt: bigInt.BigInteger) {\n return new Uint8Array(bigInt.toArray(256).value);\n}\n\nexport function bigIntToSigned(bigInt: bigInt.BigInteger) {\n return bigInt.greater(longBigInt) ? bigInt.minus(ulongBigInt) : bigInt;\n}\n\nexport function bigIntToUnsigned(bigInt: bigInt.BigInteger) {\n return bigInt.isNegative() ? ulongBigInt.add(bigInt) : bigInt;\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 Schema, {MTProtoConstructor} from './schema';\nimport {JSONValue} from '../../layer';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport isObject from '../../helpers/object/isObject';\nimport gzipUncompress from '../../helpers/gzipUncompress';\nimport bigInt from 'big-integer';\nimport ulongFromInts from '../../helpers/long/ulongFromInts';\nimport {safeBigInt} from '../../helpers/bigInt/bigIntConstants';\nimport {bigIntToSigned, bigIntToUnsigned} from '../../helpers/bigInt/bigIntConversion';\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// * using slice to have a new buffer, otherwise the buffer will be copied to main thread\nconst sliceMethod: 'slice' | 'subarray' = 'slice'; // subarray\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 const _bigInt = bigIntToUnsigned(bigInt(sLong as string));\n const {quotient, remainder} = _bigInt.divmod(0x100000000);\n const high = quotient.toJSNumber();\n const low = remainder.toJSNumber();\n\n this.writeInt(low, (field || '') + ':long[low]');\n this.writeInt(high, (field || '') + ':long[high]');\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(const 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(const 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 /* public setMtproto(mtproto: boolean) {\n this.mtproto = mtproto;\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 bytesToHex(this.byteView.slice(this.offset - 16, this.offset + 16)));\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 // ! it should've been signed\n public fetchLong(field?: string): FetchLongAs {\n const iLow = this.readInt((field || '') + ':long[low]');\n const iHigh = this.readInt((field || '') + ':long[high]');\n\n let ulong = ulongFromInts(iHigh, iLow);\n if(/* !unsigned && */!this.mtproto) { // make it signed\n ulong = bigIntToSigned(ulong);\n }\n\n if(!this.mtproto) {\n if(safeBigInt.greaterOrEquals(ulong.abs())) {\n // @ts-ignore\n return ulong.toJSNumber();\n }\n }\n\n // @ts-ignore\n return ulong.toString(10);\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[sliceMethod](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[sliceMethod](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[sliceMethod](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 continue;\n }\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 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","// export function gzipUncompress(bytes: ArrayBuffer, toString: true): string;\n\n// @ts-ignore\nimport pako from 'pako/dist/pako_inflate.min.js';\n// import dT from './dT';\n\n// export function gzipUncompress(bytes: ArrayBuffer, toString?: false): Uint8Array;\nexport default 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","import randomize from '../array/randomize';\nimport bufferConcats from './bufferConcats';\n\nexport default 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 randomize(padding);\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 * 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 {TLDeserialization, TLSerialization} from './tl_utils';\nimport CryptoWorker from '../crypto/cryptoMessagePort';\nimport sessionStorage from '../sessionStorage';\nimport Schema from './schema';\nimport {NetworkerFactory} from './networkerFactory';\nimport {logger, LogTypes} from '../logger';\nimport {InvokeApiOptions} from '../../types';\nimport longToBytes from '../../helpers/long/longToBytes';\nimport MTTransport from './transports/transport';\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 bigInt from 'big-integer';\nimport {ConnectionStatus} from './connectionStatus';\nimport ctx from '../../environment/ctx';\nimport bufferConcats from '../../helpers/bytes/bufferConcats';\nimport bytesCmp from '../../helpers/bytes/bytesCmp';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport convertToUint8Array from '../../helpers/bytes/convertToUint8Array';\nimport isObject from '../../helpers/object/isObject';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport sortLongsArray from '../../helpers/long/sortLongsArray';\nimport randomize from '../../helpers/array/randomize';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport pause from '../../helpers/schedulers/pause';\nimport {getEnvironment} from '../../environment/utils';\nimport {TimeManager} from './timeManager';\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 // withResult: 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?: CancellablePromise,\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 DRAIN_TIMEOUT = 10000;\nconst delays: {\n [k in 'client' | 'file']: {\n disconnectDelayMin: number,\n disconnectDelayMax: number,\n pingInterval: number,\n pingMaxTime: number,\n connectionTimeout: number\n }\n} = {\n client: {\n disconnectDelayMin: 7,\n disconnectDelayMax: 20,\n pingInterval: 2000,\n pingMaxTime: 5,\n connectionTimeout: 5000\n },\n file: {\n disconnectDelayMin: 10,\n disconnectDelayMax: 24,\n pingInterval: 3000,\n pingMaxTime: 7,\n connectionTimeout: 7500\n }\n};\nconst RESEND_OPTIONS: MTMessageOptions = {\n noSchedule: true,\n notContentRelated: true\n};\nlet invokeAfterMsgConstructor: number;\nlet networkerTempId = 0;\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 pendingResendReq: MTLong[] = [];\n // private pendingResendAnsReq: MTLong[] = [];\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 reqMsgId: MTLong,\n msgIds: MTPNetworker['pendingResendReq']\n };\n // private lastResendAnsReq: MTPNetworker['lastResendReq'];\n\n private name: string;\n private log: ReturnType;\n\n public isOnline = false;\n private 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 \n private pingDelayDisconnectDeferred: CancellablePromise;\n private pingPromise: Promise;\n // private pingInterval: number;\n private lastPingTime: number;\n private lastPingStartTime: number;\n private lastPingDelayDisconnectId: string;\n \n // public onConnectionStatusChange: (online: boolean) => void;\n\n // private debugRequests: Array<{before: Uint8Array, after: Uint8Array}> = [];\n\n private delays: typeof delays[keyof typeof delays];\n // private getNewTimeOffset: boolean;\n\n constructor(\n private networkerFactory: NetworkerFactory,\n private timeManager: TimeManager,\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 this.delays = this.isFileNetworker ? delays.file : delays.client;\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 + (suffix ? '' : '-C') + '-' + networkerTempId++, LogTypes.Log/* | LogTypes.Debug */ | LogTypes.Error | LogTypes.Warn);\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\n private updateSession() {\n this.seqNo = 0;\n this.prevSessionId = this.sessionId;\n this.sessionId = randomize(new Uint8Array(8));\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 = this.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 = this.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 = this.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(getEnvironment().USER_AGENT || '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(this.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 = this.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 if(this.nextReqTimeout) {\n clearTimeout(this.nextReqTimeout);\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n }\n\n this.connectionInited = false;\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.log('change transport', transport, oldTransport);\n\n \n this.clearPingDelayDisconnect();\n\n // if(this.pingInterval !== undefined) {\n // clearInterval(this.pingInterval);\n // this.pingInterval = undefined;\n // }\n\n // this.clearPing();\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 \n // * handle outcoming dead socket, server will close the connection\n if((transport as TcpObfuscated).connection) {\n // this.sendPingDelayDisconnect();\n\n if(transport.connected) {\n this.setConnectionStatus(ConnectionStatus.Connected);\n }\n\n // this.pingInterval = ctx.setInterval(this.sendPing, PING_INTERVAL);\n // this.sendPing();\n }\n \n\n this.resend();\n }\n\n public destroy() {\n this.log('destroy');\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 clearPing() {\n if(this.pingPromise) {\n this.pingPromise = undefined;\n }\n\n this.lastPingTime = undefined;\n }\n\n private sendPing = () => {\n // return;\n\n // if(!(this.transport as TcpObfuscated).connected) {\n // this.clearPing();\n // return;\n // }\n\n if(this.pingPromise) {\n return;\n }\n\n const startTime = Date.now();\n this.log('sendPing: ping', startTime);\n const promise = this.pingPromise = this.wrapMtpCall('ping', {\n ping_id: randomLong()\n }, {\n notContentRelated: true\n }).then(() => {\n const elapsedTime = Date.now() - startTime;\n this.lastPingTime = elapsedTime / 1000;\n this.log('sendPing: pong', elapsedTime);\n\n setTimeout(() => {\n if(this.pingPromise !== promise) {\n return;\n }\n\n this.pingPromise = undefined;\n this.sendPing();\n }, Math.max(0, PING_INTERVAL - elapsedTime));\n });\n }; */\n\n private clearPingDelayDisconnect() {\n const deferred = this.pingDelayDisconnectDeferred;\n this.pingDelayDisconnectDeferred = undefined;\n this.lastPingDelayDisconnectId = undefined;\n\n if(deferred) {\n deferred.reject();\n }\n }\n\n private sendPingDelayDisconnect = () => {\n // return;\n\n if(this.pingDelayDisconnectDeferred || !this.transport || !this.transport.connected) 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.pingDelayDisconnectDeferred = deferredPromise();\n const delays = this.delays;\n const pingMaxTime = this.delays.pingMaxTime;\n const lastPingTime = Math.min(this.lastPingTime ?? 0, pingMaxTime);\n const disconnectDelay = Math.round(delays.disconnectDelayMin + lastPingTime / pingMaxTime * (delays.disconnectDelayMax - delays.disconnectDelayMin));\n const timeoutTime = disconnectDelay * 1000;\n const startTime = this.lastPingStartTime = Date.now();\n const pingId = this.lastPingDelayDisconnectId = randomLong();\n const options: MTMessageOptions = {notContentRelated: true};\n this.wrapMtpCall('ping_delay_disconnect', {\n ping_id: pingId,\n disconnect_delay: disconnectDelay\n }, options);\n\n const log = this.log.bindPrefix('sendPingDelayDisconnect');\n this.debug && log.debug(`ping, timeout=${timeoutTime}, lastPingTime=${this.lastPingTime}, msgId=${options.messageId}, pingId=${pingId}`);\n const rejectTimeout = ctx.setTimeout(deferred.reject, timeoutTime);\n\n const onResolved = (reason: string) => {\n clearTimeout(rejectTimeout);\n const elapsedTime = Date.now() - startTime;\n this.lastPingTime = elapsedTime / 1000;\n this.debug && log.debug(`pong, reason='${reason}', time=${lastPingTime}, msgId=${options.messageId}`);\n if(elapsedTime > timeoutTime) {\n throw undefined;\n } else {\n return pause(Math.max(0, this.delays.pingInterval - elapsedTime/* timeoutTime - elapsedTime - PING_INTERVAL */));\n }\n };\n\n const onTimeout = () => {\n clearTimeout(rejectTimeout);\n const transport = this.transport as TcpObfuscated;\n if(this.pingDelayDisconnectDeferred !== deferred || !transport?.connection) {\n return;\n }\n\n log.error('catch, closing connection', this.lastPingTime, options.messageId);\n transport.connection.close();\n };\n\n const onFinally = () => {\n if(this.pingDelayDisconnectDeferred !== deferred) {\n return;\n }\n\n this.pingDelayDisconnectDeferred = undefined;\n this.sendPingDelayDisconnect();\n };\n\n deferred\n .then(onResolved)\n .catch(onTimeout)\n .finally(onFinally);\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 // notContentRelated: 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: this.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 const sentMessages = this.sentMessages;\n noResponseMsgs.forEach((msgId) => {\n const sentMessage = sentMessages[msgId];\n if(sentMessage) {\n const deferred = sentMessage.deferred;\n delete 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 let promise: CancellablePromise;\n if(!options.notContentRelated || options.noResponse) {\n promise = deferredPromise();\n }\n\n this.sentMessages[message.msg_id] = Object.assign(\n message,\n options,\n promise ? {deferred: promise} : undefined\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 return promise;\n }\n\n public attachPromise(promise: Promise, message: MTMessage) {\n const canIncrement = true;\n const timeout = setTimeout(() => {\n if(this.lastResponseTime && (Date.now() - this.lastResponseTime) < this.delays.connectionTimeout) {\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 }, this.delays.connectionTimeout);\n\n promise.catch(noop).finally(() => {\n clearTimeout(timeout);\n this.setConnectionStatus(ConnectionStatus.Connected);\n\n if(canIncrement) {\n --this.activeRequests;\n this.setDrainTimeout();\n }\n });\n\n if(canIncrement) {\n ++this.activeRequests;\n if(this.onDrainTimeout !== undefined) {\n clearTimeout(this.onDrainTimeout);\n this.onDrainTimeout = undefined;\n }\n }\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(this.networkerFactory.onConnectionStatusChange) {\n this.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)?.connection) {\n this.clearPingDelayDisconnect();\n this.sendPingDelayDisconnect();\n }\n\n // this.getNewTimeOffset = true;\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', 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', 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', 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 this.networkerFactory.akStopped && !this.isFileNetworker;\n }\n\n private performScheduledRequest() {\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 const pendingResendReqLength = this.pendingResendReq.length;\n if(pendingResendReqLength) {\n const options: MTMessageOptions = {...RESEND_OPTIONS};\n const msgIds = this.pendingResendReq.splice(0, pendingResendReqLength);\n this.wrapMtpMessage({\n _: 'msg_resend_req',\n msg_ids: msgIds\n }, options);\n\n this.log('resend: resending requests', options.messageId, msgIds);\n /* this.lastResendReq = {\n reqMsgId: options.messageId,\n msgIds: msgIds\n }; */\n\n // this.pendingResendReq.length = 0;\n }\n\n // if(this.pendingResendAnsReq.length) {\n // const options: MTMessageOptions = {...RESEND_OPTIONS};\n // const msgIds = this.pendingResendAnsReq.slice();\n // this.wrapMtpMessage({\n // _: 'msg_resend_ans_req',\n // msg_ids: msgIds\n // }, options);\n\n // this.log('resend: requesting answers', options.messageId, msgIds);\n // this.lastResendAnsReq = {\n // reqMsgId: options.messageId,\n // msgIds: msgIds\n // };\n\n // // this.pendingResendAnsReq.length = 0;\n // }\n\n let outMessage: MTMessage;\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: this.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: this.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 || */randomize(new Uint8Array(paddingLength))/* .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 async sendEncryptedRequest(message: MTMessage) {\n const requestData = await this.getEncryptedOutput(message);\n\n if(!this.transport) {\n this.log.error('trying to send something when offline', this.transport, this);\n }\n\n this.debug && this.log.debug('sending:', message, [message.msg_id].concat(message.inner || []), requestData.length);\n const promise: Promise = this.transport ? this.transport.send(requestData) as any : Promise.reject({});\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: ApiError = {\n code: 406,\n type: 'NETWORK_BAD_RESPONSE',\n // @ts-ignore\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 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: ' + bytesToHex(authKeyId));\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 // deserializer.setMtproto(false);\n result.result = deserializer.fetchObject(type, field + '[result]');\n // deserializer.setMtproto(true);\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 = ctx.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 reqResend(msgId: MTLong/* , isAnswer?: boolean */) {\n if(this.debug) {\n this.log.debug('Req resend', msgId/* , isAnswer */);\n }\n\n // (isAnswer ? this.pendingResendAnsReq : this.pendingResendReq).push(msgId);\n this.pendingResendReq.push(msgId);\n this.scheduleRequest(100);\n }\n\n public cleanupSent() {\n let notEmpty = false;\n const sentMessages = this.sentMessages;\n // this.log('clean start', this.dcId/*, sentMessages*/)\n Object.keys(sentMessages).forEach((msgId) => {\n const message = 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 sentMessages[msgId];\n } else if(message.container) {\n for(const innerMsgId of message.inner) {\n if(sentMessages[innerMsgId] !== undefined) {\n // this.log('clean failed, found', msgID, message.inner[i], sentMessages[message.inner[i]].seq_no)\n notEmpty = true;\n return;\n }\n }\n // this.log('clean container', msgID)\n delete 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}): ApiError {\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] as any || '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 const sentMessages = this.sentMessages;\n for(const id in sentMessages) {\n const msg = sentMessages[id];\n if(msg.body || msg.container) {\n this.pushResend(id);\n }\n }\n\n if((this.transport as TcpObfuscated).connection) {\n this.clearPingDelayDisconnect();\n this.sendPingDelayDisconnect();\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 private applyServerTime(messageId: string) {\n const serverTime = bigInt(messageId).shiftRight(32).toJSNumber();\n this.log('applying server time', serverTime);\n return this.timeManager.applyServerTime(serverTime);\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.debug('process message', message, messageId);\n }\n\n if(this.pingDelayDisconnectDeferred) {\n this.pingDelayDisconnectDeferred.resolve('any message');\n }\n\n // let changedTimeOffset: boolean;\n // if(this.getNewTimeOffset) {\n // changedTimeOffset = this.applyServerTime(messageId);\n // this.getNewTimeOffset = undefined;\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 // if(changedTimeOffset === undefined) {\n // changedTimeOffset = this.applyServerTime(messageId);\n // }\n\n const changedTimeOffset = this.applyServerTime(messageId);\n if(message.error_code === 17 || changedTimeOffset) {\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 && this.networkerFactory.updatesProcessor) {\n this.networkerFactory.updatesProcessor(message);\n }\n });\n break;\n }\n\n case 'msgs_ack': {\n this.debug && this.log('got acks', message.msg_ids);\n for(const msgId of message.msg_ids) {\n this.processMessageAck(msgId);\n }\n\n break;\n }\n\n case 'msg_detailed_info': {\n const sentMessage = this.sentMessages[message.msg_id];\n if(!sentMessage) {\n this.ackMessage(message.answer_msg_id);\n break;\n }/* else if(sentMessage.acked) {\n this.reqResend(message.answer_msg_id, true);\n }\n\n break; */\n }\n\n case 'msg_new_detailed_info': {\n if(this.pendingAcks.indexOf(message.answer_msg_id) !== -1) {\n break;\n }\n\n this.reqResend(message.answer_msg_id);\n break;\n }\n\n case 'msgs_state_info': {\n this.ackMessage(message.answer_msg_id);\n const arr = [\n [this.lastResendReq, this.pendingResendReq] as const\n // [this.lastResendAnsReq, this.pendingResendAnsReq] as const\n ];\n\n for(const [lastResend, pendingResend] of arr) {\n if(lastResend?.reqMsgId === message.req_msg_id && pendingResend.length) {\n for(const badMsgId of lastResend.msgIds) {\n const pos = pendingResend.indexOf(badMsgId);\n if(pos !== -1) {\n pendingResend.splice(pos, 1);\n }\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 if(this.debug) {\n this.log('Rpc response', message.result, sentMessage);\n }\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 deferred.resolve(message.result);\n }\n\n if(sentMessage.isAPI && !this.connectionInited) {\n this.connectionInited = true;\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 const pingId = message.ping_id;\n if(this.lastPingDelayDisconnectId === pingId) {\n const deferred = this.pingDelayDisconnectDeferred;\n if(deferred) {\n deferred.resolve('pong');\n } else {\n this.log('ping deferred deleted', pingId);\n }\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(this.networkerFactory.updatesProcessor !== null) {\n this.networkerFactory.updatesProcessor(message);\n }\n break;\n }\n }\n}\n","import bigInt from 'big-integer';\n\nexport default function sortLongsArray(arr: string[]) {\n return arr.map((long) => {\n return bigInt(long);\n }).sort((a, b) => {\n return a.compare(b);\n }).map((bigInt) => {\n return bigInt.toString(10);\n });\n}\n","import addPadding from '../bytes/addPadding';\nimport bigInt from 'big-integer';\nimport {bigIntToBytes} from '../bigInt/bigIntConversion';\n\nexport default function longToBytes(sLong: string) {\n const bigIntBytes = bigIntToBytes(bigInt(sLong)).reverse();\n const bytes = addPadding(bigIntBytes, 8, true, false, false);\n // console.log('longToBytes', bytes, bigIntBytes);\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 * 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 {ConnectionStatusChange} from './connectionStatus';\nimport MTPNetworker from './networker';\nimport {InvokeApiOptions} from '../../types';\nimport App from '../../config/app';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport {AppManager} from '../appManagers/manager';\n\nexport class NetworkerFactory extends AppManager {\n private networkers: MTPNetworker[] = [];\n public language = navigator.language || App.langPackCode;\n public updatesProcessor: (obj: any) => void = null;\n // public onConnectionStatusChange: (status: ConnectionStatusChange) => void = null;\n public akStopped = false;\n\n public onConnectionStatusChange(status: ConnectionStatusChange) {\n this.rootScope.dispatchEvent('connection_status_change', status);\n // ({type: 'connectionStatusChange', payload: status});\n }\n\n public removeNetworker(networker: MTPNetworker) {\n indexOfAndSplice(this.networkers, networker);\n }\n\n public setUpdatesProcessor(callback: (obj: any) => void) {\n this.updatesProcessor = callback;\n }\n\n public getNetworker(dcId: number, authKey: Uint8Array, authKeyId: Uint8Array, serverSalt: Uint8Array, options: InvokeApiOptions) {\n // console.log('NetworkerFactory: creating new instance of MTPNetworker:', dcId, options);\n const networker = new MTPNetworker(this, this.timeManager, dcId, authKey, authKeyId, serverSalt, options);\n this.networkers.push(networker);\n return networker;\n }\n\n public startAll() {\n if(this.akStopped) {\n const stoppedNetworkers = this.networkers.filter((networker) => networker.isStopped());\n\n this.akStopped = false;\n this.updatesProcessor && this.updatesProcessor({_: 'new_session_created'});\n\n for(const networker of stoppedNetworkers) {\n networker.scheduleRequest();\n }\n }\n }\n\n public stopAll() {\n this.akStopped = true;\n }\n\n public setLanguage(langCode: string) {\n this.language = langCode;\n for(const networker of this.networkers) {\n if(!networker.isFileNetworker) {\n networker.connectionInited = false;\n }\n }\n }\n\n public unsetConnectionInited() {\n for(const networker of this.networkers) {\n networker.connectionInited = false;\n }\n }\n\n public forceReconnectTimeout() {\n for(const networker of this.networkers) {\n networker.forceReconnectTimeout();\n }\n }\n\n public forceReconnect() {\n for(const networker of this.networkers) {\n if(!networker.isFileNetworker) {\n networker.forceReconnect();\n break;\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 * 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} from './tl_utils';\nimport cryptoWorker from '../crypto/cryptoMessagePort';\nimport Modes from '../../config/modes';\nimport bytesFromHex from '../../helpers/bytes/bytesFromHex';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport bigInt from 'big-integer';\n\nexport type RSAPublicKeyHex = {\n modulus: string,\n exponent: string\n};\n\nexport class RSAKeysManager {\n /**\n * Server public key, obtained from here: https://core.telegram.org/api/obtaining_api_id\n *\n *\n * -----BEGIN RSA PUBLIC KEY-----\n * MIIBCgKCAQEA6LszBcC1LGzyr992NzE0ieY+BSaOW622Aa9Bd4ZHLl+TuFQ4lo4g\n * 5nKaMBwK/BIb9xUfg0Q29/2mgIR6Zr9krM7HjuIcCzFvDtr+L0GQjae9H0pRB2OO\n * 62cECs5HKhT5DZ98K33vmWiLowc621dQuwKWSQKjWf50XYFw42h21P2KXUGyp2y/\n * +aEyZ+uVgLLQbRA1dEjSDZ2iGRy12Mk5gpYc397aYp438fsJoHIgJ2lgMv5h7WY9\n * t6N/byY9Nw9p21Og3AoXSL2q/2IJ1WRUhebgAdGVMlV1fkuOQoEzR7EdpqtQD9Cs\n * 5+bfo3Nhmcyvk5ftB0WkJ9z6bNZ7yxrP8wIDAQAB\n * -----END RSA PUBLIC KEY-----\n *\n * -----BEGIN RSA PUBLIC KEY-----\n * MIIBCgKCAQEBadMIUYSKhyznMh+Pg+OxTLyDZrWEjQIPZC3oJCtuZX7qUxgcWqFX\n * Q1952TSY8S8NYuz12sK9Fvp+lil1hIG0U/cuPsK08VB1hB4VA+p0S46fGwVsRovq\n * 4qUiUIzQSjSHDASuXTOinlYEHwmg/GaLc5G7qhePWa0p9YmqYR5Ha3xHJywcXZrn\n * yE3nC9igL96Aanqv+Prbu1N+r9vAgZeHh9cfbtbV8WWwruOANOTEv2ctQLR0dfr9\n * MwQXNePTPQlYsO9HNIGS1LWe7hZFtGBAVJH92F7Kig68WqHM3PIZ6Sq7N0VSzfzL\n * b11Z/YHz2UXYtXADwL/m5pTpKBUtJBXkOQIDAQAB\n * -----END RSA PUBLIC KEY-----\n *\n * Bytes can be got via\n * $ openssl rsa -in rsa.pem -RSAPublicKey_in -pubout > pub.pem\n * $ openssl rsa -pubin -in pub.pem -text -noout\n */\n\n /* private publisKeysHex = [{\n modulus: 'c150023e2f70db7985ded064759cfecf0af328e69a41daf4d6f01b538135a6f91f8f8b2a0ec9ba9720ce352efcf6c5680ffc424bd634864902de0b4bd6d49f4e580230e3ae97d95c8b19442b3c0a10d8f5633fecedd6926a7f6dab0ddb7d457f9ea81b8465fcd6fffeed114011df91c059caedaf97625f6c96ecc74725556934ef781d866b34f011fce4d835a090196e9a5f0e4449af7eb697ddb9076494ca5f81104a305b6dd27665722c46b60e5df680fb16b210607ef217652e60236c255f6a28315f4083a96791d7214bf64c1df4fd0db1944fb26a2a57031b32eee64ad15a8ba68885cde74a5bfc920f6abf59ba5c75506373e7130f9042da922179251f',\n exponent: '010001'\n }, {\n modulus: 'aeec36c8ffc109cb099624685b97815415657bd76d8c9c3e398103d7ad16c9bba6f525ed0412d7ae2c2de2b44e77d72cbf4b7438709a4e646a05c43427c7f184debf72947519680e651500890c6832796dd11f772c25ff8f576755afe055b0a3752c696eb7d8da0d8be1faf38c9bdd97ce0a77d3916230c4032167100edd0f9e7a3a9b602d04367b689536af0d64b613ccba7962939d3b57682beb6dae5b608130b2e52aca78ba023cf6ce806b1dc49c72cf928a7199d22e3d7ac84e47bc9427d0236945d10dbd15177bab413fbf0edfda09f014c7a7da088dde9759702ca760af2b8e4e97cc055c617bd74c3d97008635b98dc4d621b4891da9fb0473047927',\n exponent: '010001'\n }, {\n modulus: 'bdf2c77d81f6afd47bd30f29ac76e55adfe70e487e5e48297e5a9055c9c07d2b93b4ed3994d3eca5098bf18d978d54f8b7c713eb10247607e69af9ef44f38e28f8b439f257a11572945cc0406fe3f37bb92b79112db69eedf2dc71584a661638ea5becb9e23585074b80d57d9f5710dd30d2da940e0ada2f1b878397dc1a72b5ce2531b6f7dd158e09c828d03450ca0ff8a174deacebcaa22dde84ef66ad370f259d18af806638012da0ca4a70baa83d9c158f3552bc9158e69bf332a45809e1c36905a5caa12348dd57941a482131be7b2355a5f4635374f3bd3ddf5ff925bf4809ee27c1e67d9120c5fe08a9de458b1b4a3c5d0a428437f2beca81f4e2d5ff',\n exponent: '010001'\n }, {\n modulus: 'b3f762b739be98f343eb1921cf0148cfa27ff7af02b6471213fed9daa0098976e667750324f1abcea4c31e43b7d11f1579133f2b3d9fe27474e462058884e5e1b123be9cbbc6a443b2925c08520e7325e6f1a6d50e117eb61ea49d2534c8bb4d2ae4153fabe832b9edf4c5755fdd8b19940b81d1d96cf433d19e6a22968a85dc80f0312f596bd2530c1cfb28b5fe019ac9bc25cd9c2a5d8a0f3a1c0c79bcca524d315b5e21b5c26b46babe3d75d06d1cd33329ec782a0f22891ed1db42a1d6c0dea431428bc4d7aabdcf3e0eb6fda4e23eb7733e7727e9a1915580796c55188d2596d2665ad1182ba7abf15aaa5a8b779ea996317a20ae044b820bff35b6e8a1',\n exponent: '010001'\n }, {\n modulus: 'be6a71558ee577ff03023cfa17aab4e6c86383cff8a7ad38edb9fafe6f323f2d5106cbc8cafb83b869cffd1ccf121cd743d509e589e68765c96601e813dc5b9dfc4be415c7a6526132d0035ca33d6d6075d4f535122a1cdfe017041f1088d1419f65c8e5490ee613e16dbf662698c0f54870f0475fa893fc41eb55b08ff1ac211bc045ded31be27d12c96d8d3cfc6a7ae8aa50bf2ee0f30ed507cc2581e3dec56de94f5dc0a7abee0be990b893f2887bd2c6310a1e0a9e3e38bd34fded2541508dc102a9c9b4c95effd9dd2dfe96c29be647d6c69d66ca500843cfaed6e440196f1dbe0e2e22163c61ca48c79116fa77216726749a976a1c4b0944b5121e8c01',\n exponent: '010001'\n }]; */\n\n private testPublicKeysHex: RSAPublicKeyHex[] = [{\n modulus: 'c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5',\n exponent: '010001'\n }];\n\n private publisKeysHex: RSAPublicKeyHex[] = [{\n // modulus: '00e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\n modulus: 'e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\n exponent: '010001'\n }];\n\n private publicKeysParsed: {\n [hex: string]: RSAPublicKeyHex\n } = {};\n private prepared = false;\n private preparePromise: Promise = null;\n\n constructor() {\n if(Modes.test) {\n this.publisKeysHex = this.testPublicKeysHex;\n }\n }\n\n public prepare(): Promise {\n if(this.preparePromise) return this.preparePromise;\n else if(this.prepared) {\n return Promise.resolve();\n }\n\n return this.preparePromise = Promise.all(this.publisKeysHex.map((keyParsed) => {\n const RSAPublicKey = new TLSerialization();\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.modulus), 'n');\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.exponent), 'e');\n\n const buffer = RSAPublicKey.getBuffer();\n\n return cryptoWorker.invokeCrypto('sha1', buffer).then((bytes) => {\n const fingerprintBytes = bytes.slice(-8);\n fingerprintBytes.reverse();\n\n this.publicKeysParsed[bytesToHex(fingerprintBytes).toLowerCase()] = {\n modulus: keyParsed.modulus,\n exponent: keyParsed.exponent\n };\n });\n })).then(() => {\n this.prepared = true;\n\n // console.log('[MT] Prepared keys');\n this.preparePromise = null;\n });\n }\n\n public async select(fingerprints: Array) {\n await this.prepare();\n\n for(let i = 0; i < fingerprints.length; ++i) {\n let fingerprintHex = bigInt(fingerprints[i]).toString(16).toLowerCase();\n\n if(fingerprintHex.length < 16) {\n fingerprintHex = new Array(16 - fingerprintHex.length).fill('0').join('') + fingerprintHex;\n }\n\n // console.log(fingerprintHex, this.publicKeysParsed);\n const foundKey = this.publicKeysParsed[fingerprintHex];\n if(foundKey) {\n return Object.assign({\n fingerprint: fingerprints[i]\n }, foundKey);\n }\n }\n }\n}\n\nexport default new RSAKeysManager();\n","export default function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\n const len = bytes1.length;\n const bytes = new Uint8Array(len);\n\n for(let i = 0; i < len; ++i) {\n bytes[i] = bytes1[i] ^ bytes2[i];\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 * 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 \nimport transportController from './transports/controller';\n \n\nimport {TLSerialization, TLDeserialization} from './tl_utils';\nimport {TransportType} from './dcConfigurator';\nimport rsaKeysManager from './rsaKeysManager';\n\nimport CryptoWorker from '../crypto/cryptoMessagePort';\n\nimport {logger, LogTypes} from '../logger';\nimport DEBUG from '../../config/debug';\nimport {Awaited, DcId} from '../../types';\nimport addPadding from '../../helpers/bytes/addPadding';\nimport bytesCmp from '../../helpers/bytes/bytesCmp';\nimport bytesFromHex from '../../helpers/bytes/bytesFromHex';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport bytesXor from '../../helpers/bytes/bytesXor';\nimport {bigIntFromBytes} from '../../helpers/bigInt/bigIntConversion';\nimport bigInt from 'big-integer';\nimport randomize from '../../helpers/array/randomize';\nimport {AppManager} from '../appManagers/manager';\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 extends AppManager {\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 protected after() {\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(this.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 = this.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', bytesToHex(auth.nonce));\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 = randomize(new Uint8Array(32));\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 = randomize(new Uint8Array(32));\n const dataWithHash = dataPadReversed.concat(await CryptoWorker.invokeCrypto('sha256', 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', aesEncrypted));\n const keyAesEncrypted = tempKeyXor.concat(aesEncrypted);\n\n const keyAesEncryptedBigInt = bigIntFromBytes(keyAesEncrypted);\n const publicKeyModulusBigInt = bigInt(auth.publicKey.modulus, 16);\n\n if(keyAesEncryptedBigInt.compare(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', 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', auth.newNonce.concat(auth.serverNonce)))\n .concat((await CryptoWorker.invokeCrypto('sha1', auth.serverNonce.concat(auth.newNonce))).slice(0, 12));\n\n auth.tmpAesIv = (await CryptoWorker.invokeCrypto('sha1', auth.serverNonce.concat(auth.newNonce))).slice(12)\n .concat(await CryptoWorker.invokeCrypto('sha1', 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', answerWithPadding.slice(0, offset)))) {\n throw new Error('[MT] server_DH_inner_data SHA1 mismatch');\n }\n\n this.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 = bigIntFromBytes(gA);\n const dhPrimeBigInt = bigInt(dhPrimeHex, 16);\n\n if(gABigInt.compare(bigInt.one) <= 0) {\n throw new Error('[MT] DH params are not verified: gA <= 1');\n }\n\n if(gABigInt.compare(dhPrimeBigInt.subtract(bigInt.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 twoPow = bigInt(2).pow(2048 - 64);\n\n if(gABigInt.compare(twoPow) < 0) {\n throw new Error('[MT] DH params are not verified: gA < 2^{2048-64}');\n }\n if(gABigInt.compare(dhPrimeBigInt.subtract(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 = randomize(new Uint8Array(256));\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', 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', 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', 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', 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', 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: randomize(new Uint8Array(16))\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","/*\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 {nextRandomUint} from '../../helpers/random';\nimport {WorkerTaskVoidTemplate} from '../../types';\nimport ulongFromInts from '../../helpers/long/ulongFromInts';\nimport {AppManager} from '../appManagers/manager';\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 extends AppManager {\n private lastMessageId: [number, number];\n private timeOffset: number;\n\n /* private midnightNoOffset: number;\n private midnightOffseted: Date;\n\n private midnightOffset: number; */\n\n /* private timeParams: {\n midnightOffset: number,\n serverTimeOffset: number\n }; */\n\n protected after() {\n this.lastMessageId = [0, 0];\n this.timeOffset = 0;\n\n sessionStorage.get('server_time_offset').then((to) => {\n if(to) {\n this.timeOffset = to;\n }\n });\n\n\n // * migrated from ServerTimeManager\n /* const timestampNow = tsNow(true);\n this.midnightNoOffset = timestampNow - (timestampNow % 86400);\n this.midnightOffseted = new Date();\n this.midnightOffseted.setHours(0, 0, 0, 0);\n\n this.midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000)); */\n\n /* this.timeParams = {\n midnightOffset: this.midnightOffset,\n serverTimeOffset: this.serverTimeOffset\n }; */\n }\n\n public getServerTimeOffset() {\n return this.timeOffset;\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 = ulongFromInts(messageId[0], messageId[1]).toString(10);\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 this.lastMessageId = [0, 0];\n\n if(this.timeOffset !== newTimeOffset) {\n sessionStorage.set({\n server_time_offset: newTimeOffset\n });\n\n this.timeOffset = newTimeOffset;\n }\n\n // console.log('[TimeManager]: Apply server time', serverTime, localTime, newTimeOffset, changed);\n\n return changed;\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 {DocumentAttribute, WebDocument} from '../../layer';\n\nexport default class AppWebDocsManager {\n public saveWebDocument(webDocument: WebDocument) {\n if(!webDocument) {\n return;\n }\n\n const attribute: DocumentAttribute.documentAttributeImageSize = webDocument.attributes.find((attribute) => attribute._ === 'documentAttributeImageSize') as any;\n if(attribute) {\n webDocument.w = attribute.w;\n webDocument.h = attribute.h;\n }\n\n return webDocument;\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 {InputInvoice, InputPaymentCredentials, PaymentRequestedInfo, PaymentsPaymentForm} from '../../layer';\nimport {AppManager} from './manager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\n\nexport default class AppPaymentsManager extends AppManager {\n public getInputInvoiceBySlug(slug: string): InputInvoice.inputInvoiceSlug {\n return {\n _: 'inputInvoiceSlug',\n slug\n };\n }\n\n public getInputInvoiceByPeerId(peerId: PeerId, mid: number): InputInvoice.inputInvoiceMessage {\n return {\n _: 'inputInvoiceMessage',\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(mid)\n };\n }\n\n public getPaymentForm(invoice: InputInvoice) {\n return this.apiManager.invokeApi('payments.getPaymentForm', {\n invoice\n }).then((paymentForm) => {\n this.appUsersManager.saveApiUsers(paymentForm.users);\n\n return paymentForm;\n });\n }\n\n public getPaymentReceipt(peerId: PeerId, mid: number) {\n return this.apiManager.invokeApi('payments.getPaymentReceipt', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(mid)\n }).then((paymentForm) => {\n this.appUsersManager.saveApiUsers(paymentForm.users);\n\n return paymentForm;\n });\n }\n\n public validateRequestedInfo(invoice: InputInvoice, info: PaymentRequestedInfo, save?: boolean) {\n return this.apiManager.invokeApi('payments.validateRequestedInfo', {\n save,\n invoice,\n info\n });\n }\n\n public sendPaymentForm(\n invoice: InputInvoice,\n formId: PaymentsPaymentForm['form_id'],\n requestedInfoId: string,\n shippingOptionId: string,\n credentials: InputPaymentCredentials,\n tipAmount?: number\n ) {\n return this.apiManager.invokeApi('payments.sendPaymentForm', {\n form_id: formId,\n invoice,\n requested_info_id: requestedInfoId,\n shipping_option_id: shippingOptionId,\n credentials,\n tip_amount: tipAmount || undefined\n }).then((result) => {\n if(result._ === 'payments.paymentResult') {\n this.apiUpdatesManager.processUpdateMessage(result.updates);\n }\n\n return result;\n });\n }\n\n public clearSavedInfo(info?: boolean, credentials?: boolean) {\n return this.apiManager.invokeApi('payments.clearSavedInfo', {\n info,\n credentials\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 {MessageSendingParams} from './appMessagesManager';\nimport {AppManager} from './manager';\nimport {AttachMenuBots, AttachMenuBot, Update, DataJSON} from '../../layer';\nimport assumeType from '../../helpers/assumeType';\nimport makeError from '../../helpers/makeError';\nimport getAttachMenuBotIcon from './utils/attachMenuBots/getAttachMenuBotIcon';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\n\nexport default class AppAttachMenuBotsManager extends AppManager {\n private attachMenuBots: Map;\n private attachMenuBotsArr: AttachMenuBot[];\n\n protected after() {\n this.clear(true);\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateAttachMenuBots: this.onUpdateAttachMenuBots\n });\n }\n\n public clear = (init = false) => {\n if(!init) {\n this.attachMenuBots.clear();\n this.attachMenuBotsArr = undefined;\n } else {\n this.attachMenuBots = new Map();\n }\n };\n\n private onUpdateAttachMenuBots = (update: Update.updateAttachMenuBots) => {\n this.clear();\n this.getAttachMenuBots();\n };\n\n public saveAttachMenuBot(attachMenuBot: AttachMenuBot) {\n this.attachMenuBots.set(attachMenuBot.bot_id, attachMenuBot);\n const icon = getAttachMenuBotIcon(attachMenuBot);\n icon.icon = this.appDocsManager.saveDoc(icon.icon, {type: 'attachMenuBotIcon', botId: attachMenuBot.bot_id});\n return attachMenuBot;\n }\n\n public saveAttachMenuBots(attachMenuBots: AttachMenuBot[]) {\n if((attachMenuBots as any).saved) return;\n (attachMenuBots as any).saved = true;\n attachMenuBots.forEach((user) => this.saveAttachMenuBot(user));\n }\n\n public getAttachMenuBots() {\n return this.attachMenuBotsArr ?? this.apiManager.invokeApiSingleProcess({\n method: 'messages.getAttachMenuBots',\n processResult: (attachMenuBots) => {\n assumeType(attachMenuBots);\n this.appUsersManager.saveApiUsers(attachMenuBots.users);\n this.saveAttachMenuBots(attachMenuBots.bots);\n // ! temporary\n return this.attachMenuBotsArr = attachMenuBots.bots.slice(0, 0);\n }\n });\n }\n\n public getAttachMenuBotCached(botId: BotId) {\n return this.attachMenuBots.get(botId);\n }\n\n public getAttachMenuBot(botId: BotId, overwrite?: boolean) {\n if(!this.appUsersManager.isAttachMenuBot(botId) || true) {\n throw makeError('BOT_INVALID');\n }\n\n return (!overwrite && this.getAttachMenuBotCached(botId)) ?? this.apiManager.invokeApiSingleProcess({\n method: 'messages.getAttachMenuBot',\n params: {\n bot: this.appUsersManager.getUserInput(botId)\n },\n processResult: (attachMenuBotsBot) => {\n this.appUsersManager.saveApiUsers(attachMenuBotsBot.users);\n const attachMenuBot = this.saveAttachMenuBot(attachMenuBotsBot.bot);\n return attachMenuBot;\n }\n });\n }\n\n public requestWebView(options: MessageSendingParams & {\n botId: BotId,\n peerId: PeerId,\n // platform: string,\n startParam?: string,\n fromBotMenu?: boolean,\n url?: string,\n themeParams?: DataJSON\n }) {\n const {\n botId,\n peerId,\n url,\n fromBotMenu,\n themeParams,\n // platform,\n replyToMsgId,\n silent,\n sendAsPeerId,\n startParam,\n threadId\n } = options;\n\n const platform = 'web';\n\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.requestWebView',\n params: {\n peer: this.appPeersManager.getInputPeerById(peerId),\n bot: this.appUsersManager.getUserInput(botId),\n silent,\n platform,\n url,\n reply_to_msg_id: replyToMsgId ? getServerMessageId(replyToMsgId) : undefined,\n from_bot_menu: fromBotMenu,\n theme_params: themeParams,\n send_as: sendAsPeerId ? this.appPeersManager.getInputPeerById(sendAsPeerId) : undefined,\n start_param: startParam,\n top_msg_id: threadId ? getServerMessageId(threadId) : undefined\n },\n processResult: (result) => {\n console.log(result);\n return result;\n }\n });\n }\n\n public prolongWebView(options: MessageSendingParams & {\n peerId: PeerId,\n botId: BotId,\n queryId: string | number\n }) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.prolongWebView',\n params: {\n peer: this.appPeersManager.getInputPeerById(options.peerId),\n bot: this.appUsersManager.getUserInput(options.botId),\n query_id: options.queryId,\n silent: options.silent,\n reply_to_msg_id: options.replyToMsgId ? getServerMessageId(options.replyToMsgId) : undefined,\n send_as: options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined,\n top_msg_id: options.threadId ? getServerMessageId(options.threadId) : undefined\n },\n processResult: (result) => {\n console.log(result);\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 {UrlAuthResult} from '../../layer';\nimport {AppManager} from './manager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\n\nexport default class AppSeamlessLoginManager extends AppManager {\n public requestUrlAuth(url: string, peerId?: PeerId, mid?: number, buttonId?: number) {\n return this.apiManager.invokeApi('messages.requestUrlAuth', {\n button_id: buttonId,\n msg_id: mid ? getServerMessageId(mid) : undefined,\n peer: peerId ? this.appPeersManager.getInputPeerById(peerId) : undefined,\n url\n }).then((urlAuthResult) => {\n if(urlAuthResult._ === 'urlAuthResultRequest') {\n this.appUsersManager.saveApiUser(urlAuthResult.bot);\n }\n\n return urlAuthResult;\n });\n }\n\n public acceptUrlAuth(url: string, peerId?: PeerId, mid?: number, buttonId?: number, writeAllowed?: boolean) {\n return this.apiManager.invokeApi('messages.acceptUrlAuth', {\n button_id: buttonId,\n msg_id: mid ? getServerMessageId(mid) : undefined,\n peer: peerId ? this.appPeersManager.getInputPeerById(peerId) : undefined,\n url,\n write_allowed: writeAllowed\n }).then((urlAuthResult) => {\n return urlAuthResult as Exclude;\n });\n }\n\n public getWebAuthorizations() {\n return this.apiManager.invokeApi('account.getWebAuthorizations').then((webAuthorizations) => {\n this.appUsersManager.saveApiUsers(webAuthorizations.users);\n return webAuthorizations.authorizations;\n });\n }\n\n public resetWebAuthorization(hash: Long) {\n return this.apiManager.invokeApi('account.resetWebAuthorization', {\n hash\n });\n }\n\n public resetWebAuthorizations() {\n return this.apiManager.invokeApi('account.resetWebAuthorizations');\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 assumeType from '../../helpers/assumeType';\nimport {AccountThemes, AccountWallPapers, InputWallPaper, WallPaper} from '../../layer';\nimport {AppManager} from './manager';\n\ntype WallPaperId = WallPaper['id'];\n\nexport default class AppThemesManager extends AppManager {\n private wallPapers: {[id: WallPaperId]: WallPaper};\n\n protected after() {\n this.wallPapers = {};\n }\n\n private saveWallPaper(wallPaper: WallPaper) {\n if(!wallPaper) {\n return wallPaper;\n }\n // const oldWallPaper = this.wallPapers[wallPaper.id];\n\n // ! IT'S BROKEN NOW. SERVER RETURNS SAME ID FOR DIFFERENT WALLPAPERS\n // if(oldWallPaper) {\n // console.log('rewrite', {...oldWallPaper}, {...wallPaper});\n // }\n\n if(wallPaper._ !== 'wallPaperNoFile') {\n wallPaper.document = this.appDocsManager.saveDoc(wallPaper.document, {type: 'wallPaper', wallPaperId: wallPaper.id});\n }\n\n // if(oldWallPaper) {\n // return Object.assign(oldWallPaper, wallPaper);\n // } else {\n this.wallPapers[wallPaper.id] = wallPaper;\n // }\n\n return wallPaper;\n }\n\n public getWallPaper(inputWallPaper: InputWallPaper) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'account.getWallPaper',\n params: {wallpaper: inputWallPaper},\n processResult: (wallPaper) => {\n return this.saveWallPaper(wallPaper);\n }\n });\n }\n\n public getInputWallPaper(wallPaper: WallPaper | string): InputWallPaper {\n if(typeof(wallPaper) === 'string') {\n return {_: 'inputWallPaperSlug', slug: wallPaper};\n } else if(wallPaper._ === 'wallPaperNoFile') {\n return {_: 'inputWallPaperNoFile', id: wallPaper.id};\n } else {\n return {_: 'inputWallPaper', id: wallPaper.id, access_hash: wallPaper.access_hash};\n }\n }\n\n public getWallPaperById(id: WallPaperId) {\n const wallPaper = this.wallPapers[id];\n return this.getWallPaper(this.getInputWallPaper(wallPaper));\n }\n\n public getThemes() {\n return this.apiManager.invokeApiSingleProcess({\n method: 'account.getThemes',\n params: {format: 'macos', hash: 0},\n processResult: (accountThemes) => {\n assumeType(accountThemes);\n\n accountThemes.themes.forEach((theme) => {\n if(!theme.settings) {\n return;\n }\n\n theme.settings.forEach((themeSettings) => {\n themeSettings.wallpaper = this.saveWallPaper(themeSettings.wallpaper);\n });\n });\n\n return accountThemes.themes;\n }\n });\n }\n\n public getWallPapers() {\n return this.apiManager.invokeApiHashable({method: 'account.getWallPapers'}).then((accountWallpapers) => {\n const wallPapers = (accountWallpapers as AccountWallPapers.accountWallPapers).wallpapers;\n wallPapers.forEach((wallPaper, idx, arr) => {\n arr[idx] = this.saveWallPaper(wallPaper);\n });\n\n return wallPapers;\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 App from '../../config/app';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport callbackify from '../../helpers/callbackify';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport cryptoMessagePort from '../crypto/cryptoMessagePort';\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\nimport appStateManager from './appStateManager';\nimport {AppStoragesManager} from './appStoragesManager';\nimport createManagers from './createManagers';\n\ntype Managers = Awaited>;\n\nexport class AppManagersManager {\n private managers: Managers | Promise;\n private cryptoWorkersURLs: string[];\n private cryptoPortsAttached: number;\n private cryptoPortPromise: CancellablePromise;\n\n constructor() {\n this.cryptoWorkersURLs = [];\n this.cryptoPortsAttached = 0;\n this.cryptoPortPromise = deferredPromise();\n this.cryptoPortPromise.then(() => {\n this.cryptoPortPromise = undefined;\n });\n }\n\n public start() {\n const port = MTProtoMessagePort.getInstance();\n\n port.addEventListener('manager', ({name, method, args}) => {\n return callbackify(this.getManagers(), (managers) => {\n // @ts-ignore\n const manager = managers[name];\n return manager[method].apply(manager, args);\n });\n });\n\n port.addEventListener('cryptoPort', (payload, source, event) => {\n const port = event.ports[0];\n if(this.cryptoPortsAttached >= this.cryptoWorkersURLs.length) {\n port.close();\n return;\n }\n\n ++this.cryptoPortsAttached;\n cryptoMessagePort.attachPort(port);\n this.cryptoPortPromise?.resolve();\n });\n\n port.addEventListener('createProxyWorkerURLs', ({originalUrl, blob}) => {\n let length = this.cryptoWorkersURLs.length;\n if(!length) {\n this.cryptoWorkersURLs.push(originalUrl);\n ++length;\n }\n\n const maxLength = App.cryptoWorkers;\n if(length === maxLength) {\n return this.cryptoWorkersURLs;\n }\n\n const newURLs = new Array(maxLength - length).fill(undefined).map(() => URL.createObjectURL(blob));\n this.cryptoWorkersURLs.push(...newURLs);\n return this.cryptoWorkersURLs;\n });\n }\n\n public async createManagers() {\n const appStoragesManager = new AppStoragesManager();\n\n await Promise.all([\n // new Promise(() => {}),\n appStoragesManager.loadStorages(),\n this.cryptoPortPromise\n ]);\n\n const managers = await createManagers(appStoragesManager, appStateManager.userId);\n return this.managers = managers;\n }\n\n public getManagers() {\n return this.managers ??= this.createManagers();\n }\n}\n\nconst appManagersManager = new AppManagersManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appManagersManager = appManagersManager);\nexport default appManagersManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {PasswordManager} from '../mtproto/passwordManager';\nimport {ReferenceDatabase} from '../mtproto/referenceDatabase';\nimport DialogsStorage from '../storages/dialogs';\nimport FiltersStorage from '../storages/filters';\nimport {ApiUpdatesManager} from './apiUpdatesManager';\nimport {AppAvatarsManager} from './appAvatarsManager';\nimport {AppCallsManager} from './appCallsManager';\nimport {AppChatsManager} from './appChatsManager';\nimport {AppDocsManager} from './appDocsManager';\nimport {AppDraftsManager} from './appDraftsManager';\nimport {AppEmojiManager} from './appEmojiManager';\nimport {AppGroupCallsManager} from './appGroupCallsManager';\nimport {AppInlineBotsManager} from './appInlineBotsManager';\nimport {AppMessagesIdsManager} from './appMessagesIdsManager';\nimport {AppMessagesManager} from './appMessagesManager';\nimport {AppNotificationsManager} from './appNotificationsManager';\nimport {AppPeersManager} from './appPeersManager';\nimport {AppPhotosManager} from './appPhotosManager';\nimport {AppPollsManager} from './appPollsManager';\nimport {AppPrivacyManager} from './appPrivacyManager';\nimport {AppProfileManager} from './appProfileManager';\nimport {AppReactionsManager} from './appReactionsManager';\nimport {AppStickersManager} from './appStickersManager';\nimport {AppUsersManager} from './appUsersManager';\nimport {AppWebPagesManager} from './appWebPagesManager';\nimport {ApiFileManager} from '../mtproto/apiFileManager';\nimport {ApiManager} from '../mtproto/apiManager';\nimport ctx from '../../environment/ctx';\nimport PeersStorage from '../storages/peers';\nimport ThumbsStorage from '../storages/thumbs';\nimport {NetworkerFactory} from '../mtproto/networkerFactory';\nimport {RootScope} from '../rootScope';\nimport {Authorizer} from '../mtproto/authorizer';\nimport {DcConfigurator} from '../mtproto/dcConfigurator';\nimport {TimeManager} from '../mtproto/timeManager';\nimport {AppStoragesManager} from './appStoragesManager';\nimport cryptoMessagePort from '../crypto/cryptoMessagePort';\nimport appStateManager from './appStateManager';\nimport filterUnique from '../../helpers/array/filterUnique';\nimport AppWebDocsManager from './appWebDocsManager';\nimport AppPaymentsManager from './appPaymentsManager';\nimport AppAttachMenuBotsManager from './appAttachMenuBotsManager';\nimport AppSeamlessLoginManager from './appSeamlessLoginManager';\nimport AppThemesManager from './appThemesManager';\n\nexport default function createManagers(appStoragesManager: AppStoragesManager, userId: UserId) {\n const managers = {\n appPeersManager: new AppPeersManager,\n appChatsManager: new AppChatsManager,\n appDocsManager: new AppDocsManager,\n appPhotosManager: new AppPhotosManager,\n appPollsManager: new AppPollsManager,\n appUsersManager: new AppUsersManager,\n appWebPagesManager: new AppWebPagesManager,\n appDraftsManager: new AppDraftsManager,\n appProfileManager: new AppProfileManager,\n appNotificationsManager: new AppNotificationsManager,\n apiUpdatesManager: new ApiUpdatesManager,\n appAvatarsManager: new AppAvatarsManager,\n appGroupCallsManager: new AppGroupCallsManager,\n appCallsManager: new AppCallsManager,\n appReactionsManager: new AppReactionsManager,\n appMessagesManager: new AppMessagesManager,\n appMessagesIdsManager: new AppMessagesIdsManager,\n appPrivacyManager: new AppPrivacyManager,\n appInlineBotsManager: new AppInlineBotsManager,\n appStickersManager: new AppStickersManager,\n referenceDatabase: new ReferenceDatabase,\n appEmojiManager: new AppEmojiManager,\n filtersStorage: new FiltersStorage,\n dialogsStorage: new DialogsStorage,\n apiManager: new ApiManager,\n cryptoWorker: cryptoMessagePort,\n passwordManager: new PasswordManager,\n apiFileManager: new ApiFileManager,\n peersStorage: new PeersStorage,\n thumbsStorage: new ThumbsStorage,\n networkerFactory: new NetworkerFactory,\n rootScope: new RootScope,\n authorizer: new Authorizer,\n dcConfigurator: new DcConfigurator,\n timeManager: new TimeManager,\n appStoragesManager: appStoragesManager,\n appStateManager: appStateManager,\n appWebDocsManager: new AppWebDocsManager,\n appPaymentsManager: new AppPaymentsManager,\n appAttachMenuBotsManager: new AppAttachMenuBotsManager,\n appSeamlessLoginManager: new AppSeamlessLoginManager,\n appThemesManager: new AppThemesManager\n };\n\n type T = typeof managers;\n\n for(const name in managers) {\n const manager = managers[name as keyof T];\n if(!manager) {\n continue;\n }\n\n if((manager as AppMessagesManager).setManagers) {\n (manager as AppMessagesManager).setManagers(managers as any);\n delete (manager as AppMessagesManager).setManagers;\n }\n\n // @ts-ignore\n ctx[name] = manager;\n }\n\n const promises: Array void) | void> | void>[] = [];\n let names = Object.keys(managers) as (keyof T)[];\n names.unshift('appUsersManager', 'appChatsManager', 'appNotificationsManager', 'appMessagesManager', 'dialogsStorage');\n names = filterUnique(names);\n for(const name of names) {\n const manager = managers[name];\n if((manager as any)?.after) {\n // console.log('injecting after', name);\n const result = (manager as any).after();\n promises.push(result);\n\n // if(result instanceof Promise) {\n // result.then(() => {\n // console.log('injected after', name);\n // });\n // }\n }\n }\n\n if(userId) {\n managers.apiManager.setUserAuth(userId);\n }\n\n return Promise.all(promises).then(() => managers);\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// just to include\nimport '../polyfill';\nimport '../../helpers/peerIdPolyfill';\n\nimport cryptoWorker from '../crypto/cryptoMessagePort';\nimport {setEnvironment} from '../../environment/utils';\nimport appStateManager from '../appManagers/appStateManager';\nimport transportController from './transports/controller';\nimport MTProtoMessagePort from './mtprotoMessagePort';\nimport RESET_STORAGES_PROMISE from '../appManagers/utils/storages/resetStoragesPromise';\nimport appManagersManager from '../appManagers/appManagersManager';\nimport listenMessagePort from '../../helpers/listenMessagePort';\nimport {logger} from '../logger';\nimport {State} from '../../config/state';\nimport toggleStorages from '../../helpers/toggleStorages';\nimport appTabsManager from '../appManagers/appTabsManager';\nimport ServiceMessagePort from '../serviceWorker/serviceMessagePort';\nimport callbackify from '../../helpers/callbackify';\n\nlet _isServiceWorkerOnline = true;\nexport function isServiceWorkerOnline() {\n return _isServiceWorkerOnline;\n}\n\nlet serviceMessagePort: ServiceMessagePort, _serviceMessagePort: MessagePort;\nexport function getServiceMessagePort() {\n return _isServiceWorkerOnline ? serviceMessagePort : undefined;\n}\n\nconst log = logger('MTPROTO');\n// let haveState = false;\n\nconst port = new MTProtoMessagePort();\nport.addMultipleEventsListeners({\n environment: (environment) => {\n setEnvironment(environment);\n\n transportController.waitForWebSocket();\n },\n\n crypto: ({method, args}) => {\n return cryptoWorker.invokeCrypto(method as any, ...args as any);\n },\n\n state: ({state, resetStorages, pushedKeys, newVersion, oldVersion, userId}) => {\n // if(haveState) {\n // return;\n // }\n\n log('got state', state, pushedKeys);\n\n appStateManager.userId = userId;\n appStateManager.newVersion = newVersion;\n appStateManager.oldVersion = oldVersion;\n\n (Object.keys(state) as any as (keyof State)[]).forEach((key) => {\n appStateManager.pushToState(key, state[key], true, !pushedKeys.includes(key));\n });\n\n RESET_STORAGES_PROMISE.resolve(resetStorages);\n // haveState = true;\n },\n\n toggleStorages: ({enabled, clearWrite}) => {\n return toggleStorages(enabled, clearWrite);\n },\n\n event: (payload, source) => {\n log('will redirect event', payload, source);\n port.invokeExceptSource('event', payload, source);\n },\n\n serviceWorkerOnline: (online) => {\n _isServiceWorkerOnline = online;\n },\n\n serviceWorkerPort: (payload, source, event) => {\n if(serviceMessagePort) {\n serviceMessagePort.detachPort(_serviceMessagePort);\n _serviceMessagePort = undefined;\n } else {\n serviceMessagePort = new ServiceMessagePort();\n serviceMessagePort.addMultipleEventsListeners({\n requestFilePart: (payload) => {\n return callbackify(appManagersManager.getManagers(), (managers) => {\n const {docId, dcId, offset, limit} = payload;\n return managers.appDocsManager.requestDocPart(docId, dcId, offset, limit);\n });\n }\n });\n }\n\n // * port can be undefined in the future\n if(_serviceMessagePort = event.ports[0]) {\n serviceMessagePort.attachPort(_serviceMessagePort);\n }\n },\n\n createObjectURL: (blob) => {\n return URL.createObjectURL(blob);\n }\n\n // socketProxy: (task) => {\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\nlog('MTProto start');\n\nappManagersManager.start();\nappManagersManager.getManagers();\nappTabsManager.start();\n\n// let sentHello = false;\nlistenMessagePort(port, (source) => {\n appTabsManager.addTab(source);\n\n // port.invokeVoid('hello', undefined, source);\n // if(!sentHello) {\n // port.invokeVoid('hello', undefined, source);\n // sentHello = true;\n // }\n}, (source) => {\n appTabsManager.deleteTab(source);\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 SuperMessagePort from '../lib/mtproto/superMessagePort';\nimport ctx from '../environment/ctx';\n\nexport default function listenMessagePort(\n messagePort: SuperMessagePort,\n onConnect?: (source: MessageEventSource) => void,\n onDisconnect?: (source: MessageEventSource) => void\n) {\n const attachPort = (listenPort: any, sendPort: any) => {\n messagePort.attachListenPort(listenPort);\n sendPort && messagePort.attachSendPort(sendPort);\n onConnect?.(listenPort);\n };\n\n messagePort.setOnPortDisconnect(onDisconnect);\n\n if(typeof(SharedWorkerGlobalScope) !== 'undefined') {\n (ctx as any as SharedWorkerGlobalScope).addEventListener('connect', (e) => attachPort(e.source, e.source));\n } else if(typeof(ServiceWorkerGlobalScope) !== 'undefined') {\n attachPort(ctx, null);\n } else {\n attachPort(ctx, ctx);\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 {MyDialogFilter} from '../storages/filters';\n\n/**\n * Legacy Webogram's format, don't change dcID to camelCase. date is timestamp\n */\nexport type UserAuth = {dcID: number | string, date: number, id: PeerId};\nexport type REAL_FOLDER_ID = 0 | 1;\n\nexport const NULL_PEER_ID: PeerId = 0;\nexport const REPLIES_PEER_ID: PeerId = 1271266957;\nexport const REPLIES_HIDDEN_CHANNEL_ID: ChatId = 777;\nexport const SERVICE_PEER_ID: PeerId = 777000;\nexport const MUTE_UNTIL = 0x7FFFFFFF;\nexport const BOT_START_PARAM = '';\nexport const MAX_FILE_SAVE_SIZE = 20 * 1024 * 1024;\nexport const THUMB_TYPE_FULL = '';\nexport const TOPIC_COLORS = [0x6FB9F0, 0xFFD67E, 0xCB86DB, 0x8EEE98, 0xFF93B2, 0xFB6F5F];\nexport const ATTACH_MENU_BOT_ICON_NAME = 'default_static';\nexport const GENERAL_TOPIC_ID = 4295032831;\nexport const T_ME_PREFIXES = new Set(['web', 'k', 'z']);\n\nexport const FOLDER_ID_ALL: REAL_FOLDER_ID = 0;\nexport const FOLDER_ID_ARCHIVE: REAL_FOLDER_ID = 1;\nexport const REAL_FOLDERS: Set = new Set([FOLDER_ID_ALL, FOLDER_ID_ARCHIVE]);\nexport const START_LOCAL_ID = Math.max(...Array.from(REAL_FOLDERS)) + 1 as MyDialogFilter['localId'];\n","/*\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 emojiRegExp from '../../vendor/emoji/regex';\nimport {MessageEntity} from '../../layer';\n\nconst EmojiHelper = {\n emojiMap: (code: string) => { return code; },\n shortcuts: [] as any,\n emojis: [] as any\n};\n\nexport const ALPHA_CHARS_REG_EXP = '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)\nexport const ALPHA_NUMERIC_REG_EXP = '0-9\\_' + ALPHA_CHARS_REG_EXP;\nexport const DOMAIN_ADD_CHARS = '\\u00b7';\n// Based on Regular Expression for URL validation by Diego Perini\nexport const URL_ALPHANUMERIC_REG_EXP_PART = '[' + ALPHA_CHARS_REG_EXP + '0-9]';\nexport const URL_PROTOCOL_REG_EXP_PART = '((?:https?|ftp)://|mailto:)?';\nexport const URL_REG_EXP = URL_PROTOCOL_REG_EXP_PART +\n // user:pass authentication\n '(?:' + URL_ALPHANUMERIC_REG_EXP_PART + '{1,64}(?::' + URL_ALPHANUMERIC_REG_EXP_PART + '{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 URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}' +\n // domain name\n '(?:\\\\.' + URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}){0,10}' +\n // TLD identifier\n '(?:\\\\.(xn--[0-9a-z]{2,16}|[' + ALPHA_CHARS_REG_EXP + ']{2,24}))' +\n ')' +\n // port number\n '(?::\\\\d{2,5})?' +\n // resource path\n '(?:/(?:\\\\S{0,255}[^\\\\s.;,(\\\\[\\\\]{}<>\"\\'])?)?';\nexport const URL_PROTOCOL_REG_EXP = new RegExp('^' + URL_PROTOCOL_REG_EXP_PART.slice(0, -1), 'i');\nexport const URL_ANY_PROTOCOL_REG_EXP = /^((?:[^\\/]+?):\\/\\/|mailto:)/;\nexport const USERNAME_REG_EXP = '[a-zA-Z\\\\d_]{5,32}';\nexport const BOT_COMMAND_REG_EXP = '\\\\/([a-zA-Z\\\\d_]{1,32})(?:@(' + USERNAME_REG_EXP + '))?(\\\\b|$)';\nexport const FULL_REG_EXP = new RegExp('(^| )(@)(' + USERNAME_REG_EXP + ')|(' + URL_REG_EXP + ')|(\\\\n)|(' + emojiRegExp + ')|(^|[\\\\s\\\\(\\\\]])(#[' + ALPHA_NUMERIC_REG_EXP + ']{2,64})|(^|\\\\s)' + BOT_COMMAND_REG_EXP, 'i');\nexport const EMAIL_REG_EXP = /^(([^<>()[\\]\\\\.,;:\\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 = /[`_*@~]/;\nexport const MARKDOWN_REG_EXP = /(^|\\s|\\n)(````?)([\\s\\S]+?)(````?)([\\s\\n\\.,:?!;]|$)|(^|\\s|\\x01)(`|~~|\\*\\*|__|_-_|\\|\\|)([^\\n]+?)\\7([\\x01\\s\\.,:?!;]|$)|@(\\d+)\\s*\\((.+?)\\)|(\\[(.+?)\\]\\((.+?)\\))/m;\nexport const SITE_HASHTAGS: {[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\n// export const SITE_MENTIONS: {[siteName in 'Telegram' | 'Twitter' | 'Instagram' | 'GitHub']: string} = {\n// Telegram: '#{1}',\n// Twitter: 'https://twitter.com/{1}',\n// Instagram: 'https://instagram.com/{1}/',\n// GitHub: 'https://github.com/{1}'\n// };\n\nexport const MARKDOWN_ENTITIES: {[markdown: string]: MessageEntity['_']} = {\n '`': 'messageEntityCode',\n '``': 'messageEntityPre',\n '**': 'messageEntityBold',\n '__': 'messageEntityItalic',\n '~~': 'messageEntityStrike',\n '_-_': 'messageEntityUnderline',\n '||': 'messageEntitySpoiler'\n};\n\nexport const PASS_CONFLICTING_ENTITIES: Set = new Set([\n 'messageEntityEmoji',\n 'messageEntityLinebreak',\n 'messageEntityCaret'\n]);\nfor(const i in MARKDOWN_ENTITIES) {\n PASS_CONFLICTING_ENTITIES.add(MARKDOWN_ENTITIES[i]);\n}\n\nexport const PHONE_NUMBER_REG_EXP = /^\\+\\d+$/;\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\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","// https://github.com/twitter/twemoji-parser/blob/master/src/lib/regex.js\n\nexport function encodeEmoji(emojiText: string) {\n const codepoints = toCodePoints(removeVS16s(emojiText)).join('-');\n return codepoints;\n}\n\nconst vs16RegExp = /\\uFE0F/g;\n// avoid using a string literal like '\\u200D' here because minifiers expand it inline\nconst zeroWidthJoiner = String.fromCharCode(0x200d);\n\nconst removeVS16s = (rawEmoji: string) => (rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, '') : rawEmoji);\n\nexport function toCodePoints(unicodeSurrogates: string): Array {\n const points = [];\n let char = 0;\n let previous = 0;\n let i = 0;\n while(i < unicodeSurrogates.length) {\n char = unicodeSurrogates.charCodeAt(i++);\n if(previous) {\n points.push((0x10000 + ((previous - 0xd800) << 10) + (char - 0xdc00)).toString(16));\n previous = 0;\n } else if(char > 0xd800 && char <= 0xdbff) {\n previous = char;\n } else {\n points.push(char.toString(16));\n }\n }\n\n if(points.length && points[0].length === 2) {\n points[0] = '00' + points[0];\n }\n\n return points;\n}\n\nexport function getEmojiToneIndex(input: string) {\n const match = input.match(/[\\uDFFB-\\uDFFF]/);\n return match ? 5 - (57343 - match[0].charCodeAt(0)) : 0;\n}\n\nconst VIRTUAL_COUNTRIES_EMOJIS: Map = new Map([\n ['FT', '๐Ÿดโ€โ˜ ']\n]);\n\nexport function getCountryEmoji(iso2: string) {\n return VIRTUAL_COUNTRIES_EMOJIS.get(iso2) ??\n String.fromCharCode(55356, 56741 + iso2.charCodeAt(0), 55356, 56741 + iso2.charCodeAt(1));\n}\n\nexport function emojiFromCodePoints(codePoints: string) {\n return codePoints.split('-').reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [699,211,147,85,110], () => (__webpack_require__(9092)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames not based on template\n\tif (chunkId === 85) return \"85.887945ef5f43bc205112.bundle.js\";\n\tif (chunkId === 110) return \"110.745cc657737d24b5aea0.bundle.js\";\n\t// return url for filenames based on template\n\treturn \"\" + ({\"211\":\"npm.big-integer\",\"699\":\"npm.pako\"}[chunkId] || chunkId) + \".\" + {\"8\":\"93d2f33af815eb0455aa\",\"104\":\"476c2f411510266c35de\",\"147\":\"4eb614e56f1d9fbfd1e7\",\"211\":\"363d763daad0ee4e2741\",\"301\":\"95838a8203f23dd1ce8f\",\"642\":\"be93122d1116ecdc9322\",\"699\":\"89deb457201f16c93925\"}[chunkId] + \".chunk.js\";\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = {};\n var countMap = {};\n var getRetryDelay = function () {\n return 3000;\n };\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result +\n (queryMap.hasOwnProperty(chunkId) ? '?' + queryMap[chunkId] : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.hasOwnProperty(chunkId)\n ? countMap[chunkId]\n : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n var retryAttempt = 999999 - retries + 1;\n setTimeout(function () {\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap[chunkId] = cacheBust;\n countMap[chunkId] = retries - 1;\n resolve(__webpack_require__.e(chunkId));\n }, getRetryDelay(retryAttempt));\n });\n });\n };\n }\n})();\n","// no baseURI\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t678: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","next","DEBUG","MOUNT_CLASS_TO","window","self","EmojiVersions","Emoji","version","Object","assign","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","IS_FIREFOX","undefined","badCharsRe","trimRe","C2L","cleanSearchText","text","latinize","processSearchText","clearBadChars","ignoreCase","options","hasTag","includeTag","charAt","originalText","replace","clearBadCharsAndTrim","ch","latinizeCh","latinizeString","fixCyrillic","FILENAME_JOINER","getFileNameByLocation","location","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","downloadId","getFileURL","type","encodeURIComponent","JSON","stringify","platforms","Set","ignore","getRestrictionReason","reasons","find","reason","has","isRestricted","ignoreRestrictionReasons","clear","forEach","add","getPeerId","peerId","isPeerId","userId","user_id","toPeerId","chatId","channel_id","chat_id","isUser","peerParams","substr","split","IDB","constructor","db","this","name","storageIsAvailable","log","openDatabase","INSTANCES","push","isAvailable","createNew","openDbPromise","createIndexes","os","store","indexNames","Array","from","indexName","deleteIndex","indexes","index","contains","createIndex","keyPath","objectParameters","request","indexedDB","open","Promise","reject","message","finished","setTimeout","onerror","resolve","onsuccess","event","result","calledNew","onclose","e","onabort","transaction","target","close","onversionchange","onupgradeneeded","warn","oldVersion","newVersion","stores","objectStoreNames","objectStore","createObjectStore","static","instance","preserve","storage","IDBStorage","storeName","idb","create","delete","entryName","isArray","concat","getObjectStore","promises","map","save","value","idx","put","get","mode","callback","perf","performance","now","then","onError","clearTimeout","timeout","onComplete","results","requests","r","waitForTransactionComplete","oncomplete","callbackResult","left","onRequestFinished","i","getAll","environment","getEnvironment","setEnvironment","env","RootScope","super","myId","connectionStatus","premium","addEventListener","isNew","isPremium","dispatchEventSingle","status","dispatchEvent","args","invokeVoid","settings","getConnectionStatus","getPremium","state","stateStorage","getState","setByKey","key","object","splitted","getDeepProperty","slice","pop","setDeepProperty","first","pushToState","direct","onlyLocal","setKeyValueToStorage","set","HTTP","dcId","logSuffix","pending","debug","logTypes","Log","logger","connected","_send","body","fetch","method","response","arrayBuffer","buffer","TextDecoder","decode","Uint8Array","setConnected","err","destroyed","destroy","send","networker","promise","releasePending","releasing","splice","pause","Socket","handleOpen","handleError","handleClose","removeListeners","handleMessage","data","byteLength","ws","connect","removeEventListener","WebSocket","binaryType","randomize","arr","crypto","Error","getRandomValues","Obfuscation","_process","operation","cryptoMessagePort","transfer","init","codec","idPromise","release","initPayload","val","val2","reversedPayload","reverse","encKey","encIv","decKey","decIv","process","obfuscateTag","encrypted","encode","payload","tag","encodePacket","len","header","readPacket","bytesToHex","bytes","toString","TcpObfuscated","Connection","retryTimeout","abridged","obfuscation","autoReconnect","onOpen","connection","setConnectionStatus","cleanupSent","resend","onMessage","parseResponse","processMessage","messageId","sessionId","catch","shift","onClose","needTimeout","retryAt","time","Date","diff","lastCloseTime","isNaN","reconnectTimeout","ctx","reconnect","bodySent","forceReconnect","setAutoReconnect","once","enable","changeUrl","encodeBody","toEncode","encoded","releasingPending","sent","TEST_SUFFIX","getTelegramConnectionSuffix","connectionType","constructTelegramWebSocketUrl","suffix","path","DcConfigurator","sslSubdomains","dcOptions","host","port","chosenServers","transportSocket","chosenServer","oooohLetMeLive","transportHTTP","dcOption","chooseServer","transportType","reuse","hasOwnProperty","client","download","upload","servers","transports","transport","obj","indexOfAndSplice","MTTransportController","opened","Map","waitForWebSocket","pingTransports","dcConfigurator","https","websocket","httpPromise","websocketPromise","socket","isFulfilled","isRejected","isHttpAvailable","isWebSocketAvailable","all","pinging","setTransportValue","setTransportOpened","setTransportClosed","AppManager","setManagers","managers","loadStorages","storages","recordPromise","storagesKeys","keys","storagesPromises","storagesResults","resetStorages","size","loadStoragesInner","AppStoragesManager","names","createStorages","loadStorage","PasswordManager","apiManager","invokeApi","updateSettings","currentHashPromise","newHashPromise","params","password","new_settings","hint","email","currentPassword","cryptoWorker","invokeCrypto","newAlgo","new_algo","salt1","newPassword","hashes","new_password_hash","getInputCheckPassword","check","inputCheckPassword","auth","setUser","user","confirmPasswordEmail","code","resendPasswordEmail","cancelPasswordEmail","ReferenceDatabase","contexts","links","saveContext","reference","context","getContexts","_context","deepEqual","getReferenceByLink","getContext","values","deleteContext","refreshReference","c","appMessagesManager","reloadMessages","refreshEmojiesSoundsPromise","appStickersManager","getAnimatedEmojiSounds","appProfileManager","getProfile","appEmojiManager","getCustomEmojiDocuments","docId","appAttachMenuBotsManager","getAttachMenuBot","botId","appThemesManager","getWallPaperById","wallPaperId","hex","newHex","newContext","makeError","safeReplaceObject","wasObject","newObject","getPeerIdsFromMessage","peerIds","fromId","viaBotId","fwdFromId","media","contactUserId","recentVoters","recent_voters","recentReactions","recent_reactions","reaction","peer_id","action","userIds","users","inviter_id","chatIds","recentRepliers","recent_repliers","reply","setDialogIndex","dialog","indexKey","GLOBAL_FOLDER_ID","DialogsStorage","allDialogsLoaded","pinnedOrders","folderId","saveAllDialogsLoaded","resetPinnedOrder","savePinnedOrders","forumTopics","folders","dialogsOffsetDate","dialogsNum","dialogsIndex","cachedResults","query","count","dialogs","onUpdateFolderPeers","update","folder_peers","folderPeer","folder_id","peer","appPeersManager","dropDialog","pinned","handleDialogUnpinning","generateIndexForDialog","pushDialog","scheduleHandleNewDialogs","onUpdateDialogPinned","getDialogOnly","handleDialogTogglePinned","onUpdateChannelPinnedTopic","topicId","generateMessageId","topic_id","topic","getForumTopic","getFilterIdForForum","onUpdatePinnedDialogs","order","handleDialogsPinned","dialogsResult","applyDialogs","d","onUpdateChannelPinnedTopics","filterId","limit","getLimit","channel","appChatsManager","getChannelInput","toChatId","offset_date","offset_id","offset_topic","processTopics","topics","after","rootScope","appUsersManager","getSelf","peerText","getPeerSearchText","indexObject","onFilterUpdate","getCachedDialogs","processDialogForFilter","processDialogForFilters","getDialogIndexKeyByFilterId","processChangedUnreadOrUnmuted","chat","getChat","dropDialogOnDeletion","enabled","flushForumTopicsCache","apiUpdatesManager","addMultipleEventsListeners","updateFolderPeers","updateDialogPinned","updateChannelPinnedTopic","updatePinnedDialogs","updateChannelPinnedTopics","appStateManager","appStoragesManager","getCache","_order","getPinnedOrders","setDialogsFromState","bind","appDraftsManager","addMissedDialogs","top_message","getServerMessageId","topMessage","saveMessages","saveDialog","ignoreOffsetDate","getMessageByPeer","reloadConversation","isDialogsLoaded","setDialogsLoaded","loaded","isForum","isFilterIdForForum","defineNotNumerableProperties","every","orders","isDialogPinned","filtersStorage","getFilter","isPinned","pinnedPeerIds","getOffsetDate","offsetDate","Math","min","sort","a","b","generateFolder","folder","unreadMessagesCount","unreadPeerIds","unreadUnmutedPeerIds","getFolder","forumTopic","getDialogKey","isTopic","getFolderDialogs","skipMigrated","hidden","migratedTo","getNextDialog","currentPeerId","findIndex","getDialogIndexKey","localId","isDialogUnmuted","appNotificationsManager","isPeerLocalMuted","respectType","threadId","getFolderUnreadCount","unreadUnmutedCount","unreadCount","arrays","setDialogIndexInFilter","isRealFolder","testDialogForFilter","pinnedIds","pinnedKey","pinnedIndex","generateDialogIndex","generateDialogPinnedDateByIndex","getDialogIndex","getDialog","verify","skipped","getDialogOrTopic","isObject","date","tsNow","timeManager","getServerTimeOffset","noIndex","filters","getFilters","cmp","wasIndex","wasDialog","wasDialogIndex","newDialogIndex","prepareFolderUnreadCountModifyingByDialog","insertInDescendSortedArray","prepareDialogUnreadCountModifying","toggle","callbacks","wasUnreadCount","getDialogUnreadCount","wasUnmuted","newUnreadCount","newUnmuted","addMessagesCount","modifyFolderUnreadCount","toggleDialog","toggleUnmuted","forumUnreadCount","getForumUnreadCount","hasUnmuted","some","max","dispatchUnreadTimeout","_folder","justReturn","noPinnedOrderUpdate","topDate","generateDialogPinnedDate","channelId","isChannel","draft","dialogKey","unshift","setDialogToState","pts","historyStorage","getHistoryStorage","messagesStorage","getHistoryMessagesStorage","history","incomingMessage","mid","getMessageFromStorage","is_outgoing","peersStorage","requestPeersForKey","isAnyChat","newPts","getChannelState","requestPeer","saveGlobalOffset","getForumTopicsCache","getDialogOffsetDate","savedGlobalOffsetDate","savedOffsetDate","dropDialogFromFolders","foundDialog","wasPinned","keepLocal","clearDialogFromState","releasePeer","dropDialogWithEvent","dropped","items","forEachReverse","assumeType","saveApiUsers","saveApiChats","chats","messages","updatedDialogs","topMid","topPendingMid","pendingTopMsgs","topPendingMessage","maxId","cache","getUpdateCache","getUpdateAfterReloadKey","updates","newUpdatesAfterReloadToHandle","saveUpdate","canSaveDialogByPeerId","isDialog","wasDialogBefore","wasTopMessage","generateTempMessageId","from_id","getOutputPeer","deleted","out","isOutgoing","migrated_to","deactivated","migratedToPeer","migratedFromTo","migratedToFrom","read_inbox_max_id","read_outbox_max_id","saveDraft","isOut","unread","unread_count","isEnd","insertSlice","setEnd","mergeReplyKeyboard","readMaxId","readOutboxMaxId","savePeerSettings","notify_settings","addChannelState","releaseUnreadCount","dialogsStorage","processTopicUpdate","oldTopic","isIconChanged","icon_emoji_id","isTitleChanged","title","isChanged","getDialogs","offsetIndex","fillContactsResult","fillContacts","cached","reloadMissingDialogsPromise","reloadMissingPeerIds","realFolderId","curDialogStorage","d1","d2","offset","loadedAll","isEnoughDialogs","isTopEnd","getTopMessages","deletedTopics","getTopicPromises","getForumTopicById","getTopicsPromise","ids","fullfillLeft","messagesForumTopics","getForumTopicOrReload","callbackify","processTopicsPromise","f","reduce","acc","v","newPinned","convertment","PREPENDED_FILTERS","LOCAL_FILTER","flags","exclude_peers","include_peers","pinned_peers","excludePeerIds","includePeerIds","FiltersStorage","filtersArr","reloadedPeerIds","localFilters","generateLocalFilter","clearFilters","onUpdateDialogFilter","saveDialogFilter","findAndSplice","onUpdateDialogFilters","oldFilters","copy","getDialogFilters","_filterId","onUpdateDialogFilterOrder","includes","setLocalId","updateDialogFilter","updateDialogFilters","updateDialogFilterOrder","prependFilters","allChatsFilter","archiveFilter","allChatsFilterIndex","exclude_archived","exclude_unarchived","exclude_read","isDialogUnread","exclude_muted","unread_mentions_count","broadcasts","isBroadcast","groups","isAnyGroup","toUserId","isBot","bots","non_contacts","isContact","contacts","testDialogForFilterId","toggleDialogPin","getConfig","pinned_infolder_count_max","getInputPeerById","createDialogFilter","prepend","remove","getOutputDialogFilter","bool","updateDialogFiltersOrder","filterIncludedPinnedPeers","peers","reloadDialogs","inputPeer","isAlreadyReloaded","reloadPromises","missingPeerIds","overwrite","invokeApiSingle","getSuggestedDialogsFilters","silent","to","oldFilter","_filter","isFilterIdAvailable","applyMixins","derivedCtor","constructors","baseCtor","getOwnPropertyNames","prototype","getOwnPropertyDescriptor","defineProperty","ApiUpdatesManager","updatesState","pendingPtsUpdates","pendingSeqUpdates","syncPending","syncLoading","channelStates","attached","subscriptions","processUpdateMessage","updateMessage","processOpts","seq","seqStart","seq_start","forceGetDifference","processUpdate","toId","fwd_from","reply_to","entities","pts_count","override","_constructor","setProxy","Proxy","saveUpdatesState","us","popPendingSeqUpdate","nextSeq","pendingUpdatesData","seqAwaiting","ptsAwaiting","clearStatePendingSync","popPendingPtsUpdate","curState","curPts","goodPts","goodIndex","getDifference","processLocalUpdate","wasSyncing","pts_total_limit","qts","differenceResult","other_updates","new_messages","apiMessage","nextState","intermediate_state","onDifferenceTooLong","justAName","getChannelDifference","channelState","bindPrefix","lastDifferenceTime","final","lastPtsUpdateTime","fwdHeader","hasUser","post","hasChat","popPts","popSeq","subscribeToChannelUpdates","subscription","cb","interval","unsubscribeFromChannelUpdates","force","clearInterval","attach","langCode","noErrorBox","stateResult","setUpdatesProcessor","strs","en","ru","getChangelog","lang","res","ok","langStr","parseMarkdown","inbox_date","languages","filterUnique","language","AppAvatarsManager","savedAvatarURLs","removeFromAvatarsCache","isAvatarCached","saved","loadAvatar","photo","peerPhotoFileLocation","downloadOptions","dc_id","limitPart","apiFileManager","blob","URL","createObjectURL","AppCallsManager","calls","IS_CALL_SUPPORTED","updatePhoneCall","saveCall","phone_call","updatePhoneCallSignalingData","callId","phone_call_id","computeKey","g_b","p","call","isDiscarded","oldCall","getCall","getCallInput","access_hash","savePhonePhoneCall","phonePhoneCall","generateDh","random_length","dhConfig","requestCall","protocol","g_a_hash","video","getUserInput","random_id","discardCall","duration","connection_id","AppChatsManager","isPeerNeeded","modifyUsernamesCache","onChatUpdated","updateChannelParticipant","clearCache","updateChatDefaultBannedRights","default_banned_rights","getFromCache","apiChats","saveApiChat","oldChat","participants_count","changedUsername","setUsernameToCache","oldPhotoId","newPhotoId","toggledForum","forum","changedPhoto","changedTitle","changedAnyBadge","verified","scam","fake","hasRights","rights","isThread","editChatDefaultBannedRights","banned_rights","until_date","isMegagroup","megagroup","isInChat","good","getInputPeer","getChannelInputPeer","getChatInputPeer","allowMin","getChatString","createChannel","inviteToChannel","input","usersInputs","u","createChat","leaveChannel","joinChannel","addChatUser","fwdLimit","fwd_limit","deleteChatUser","leaveChat","leave","deleteChannel","deleteChat","migrateChat","updateUsername","username","doNotRefresh","refreshChatAfterRequest","editPhoto","inputFile","inputChatPhoto","file","editTitle","editAbout","about","editBanned","participant","getParticipantPeerId","timestamp","actor_id","prev_participant","new_participant","kicked_by","clearChannelParticipantBannedRights","kickFromChannel","view_messages","kickFromChat","resolveChannel","messagesChats","togglePreHistoryHidden","toggleSignatures","toggleNoForwards","setChatAvailableReactions","reactions","chatFull","getCachedFullChat","available_reactions","getSendAs","invokeApiSingleProcess","processResult","sendAsPeers","importChatInvite","hash","checkUsername","getSponsoredMessage","invokeApiCacheable","cacheSeconds","sponsoredMessages","sponsoredMessage","viewSponsoredMessage","randomId","checkChatInvite","chatInvite","toggleUsername","active","reorderUsernames","deactivateAllUsernames","makeChannelPrivate","getChannels","toggleForum","editForumTopic","iconEmojiId","closed","createForumTopic","iconColor","channelFull","getChannelFull","sendAsInputPeer","default_send_as","icon_color","send_as","updatePinnedForumTopic","wrapUrl","unsafe","matchUrlProtocol","tgMeMatch","telescoPeMatch","tgMatch","onclick","prefix","pathname","fullPath","I18n","pluralRules","cacheLangPackPromise","setLangCode","lastRequestedLangCode","lastRequestedNormalizedLangCode","updateAmPm","timeFormat","dateTimeFormat","getDateTimeFormat","hour","minute","hour12","setHours","amText","format","amPmCache","am","pmText","pm","loadLocalLangPack","defaultCode","langSign","countries","strings","formatLocalStrings","default","saveLangPack","from_version","lang_code","local","loadLangPack","web","requestedServerLanguage","lang_pack","polyfillPromise","pushTo","langPack","appVersion","applyLangPack","currentLangCode","Intl","PluralRules","string","countriesList","country","langPackKey","default_name","lastAppliedLangCode","cachedDateTimeFormats","document","querySelectorAll","element","weakMap","superFormatter","indexHolder","lastIndex","p1","p2","p3","p4","createElement","append","lastIndexOf","wrappedUrl","href","setAttribute","DocumentFragment","firstChild","textContent","arg","pushNextArgument","plain","select","item","Node","isRTL","setRTL","rtl","getCacheLangPack","finally","setTimeFormat","haveToUpdate","IntlDateElement","getStrings","getLangPack","langPack1","langPack2","localLangPack1","localLangPack2","l","_Intl","WeakMap","IntlElementBase","classList","property","IntlElement","safeAssign","formatted","dataset","compareAndUpdate","json","DateTimeFormat","hours","getHours","getMinutes","capitalizeFirstLetter","i18n","i18n_","_i18n","months","days","getWeekNumber","UTC","getFullYear","getMonth","getDate","dayNum","getUTCDay","setUTCDate","getUTCDate","yearStart","getUTCFullYear","ceil","getTime","today","year","day","month","weekday","minYear","yearPattern","RegExp","monthYearOrDayPattern","yearOrDayAndMonthPattern","shortDate","longDate","numberOfDaysEachMonth","createForMonthYear","dates","selectedYear","currentYear","setFullYear","minDate","setMonth","maxDate","formatterMonthYear","createForDayMonth","validDateForMonth","formatterDayMonth","formatterYearMax","formatWeekLong","getDay","q","safeReplaceArrayInObject","trim","dayOfWeek","setDate","getDayOfWeek","distance","setTime","matches","exec","g1","g2","k","g3","parseInt","k1","EXTENSION_MIME_TYPE_MAP","pdf","tgv","tgs","wav","mp3","ogg","jpeg","jpg","png","gif","webp","mp4","webm","mov","svg","MIME_TYPE_EXTENSION_MAP","uploadWallPaperTempId","AppDocsManager","onServiceWorkerFail","docs","doc","supportsStreaming","thumbsStorage","deleteCacheContext","stickerCachedThumbs","uploadingWallPapers","online","saveDoc","oldDoc","file_reference","referenceDatabase","attributes","attribute","file_name","wrapPlainText","voice","mime_type","w","h","round_message","alt","stickerEmojiRaw","stickerSetInput","thumbs","IS_WEBP_SUPPORTED","sticker","IS_WEBM_SUPPORTED","animated","mappedMimeType","joiner","monthAsNumber","noSeconds","getSeconds","leadingZero","noTime","getFullDate","isServiceWorkerOnline","getCacheContext","setCacheContextURL","thumb","getDocumentDownloadOptions","getDocumentURL","getDoc","downloadDoc","queueId","onlyCache","downloadMedia","getLottieCachedThumb","toneIndex","saveLottiePreview","width","height","saveWebPConvertedStrippedThumb","stickerThumbConverted","prepareWallPaperUpload","cacheContext","wallpaper","slug","uploadWallPaper","fileName","wallPaper","downloaded","getGifs","invokeApiHashable","gifs","requestDocPart","requestFilePart","getDocumentInputFileLocation","AppDraftsManager","drafts","updateDraftMessage","notify","getKey","getDraft","getAllDrafts","getAllDraftPromise","apiDraft","processApiDraft","isEmptyDraft","reply_to_msg_id","syncDraft","localDraft","saveOnServer","serverDraft","draftsAreEqual","draftObj","getInputEntities","no_webpage","top_msg_id","saveLocalDraft","clearAllDrafts","combined","clearDraft","emptyDraft","setDraft","EMOJI_LANG_PACK","keywords","AppEmojiManager","keywordLangPacks","indexedLangPacks","getKeywordsPromises","recent","getRecentEmojisPromises","getCustomEmojiDocumentPromises","getEmojiKeywords","storageKey","pack","validateInitObject","keywordsDifference","packKeywords","keyword","emoticons","getBothEmojiKeywords","networkerFactory","native","getRecentEmojis","indexEmojis","searchEmojis","emojis","POPULAR_EMOJI","recentEmoji","recentCustomEmoji","pushRecentEmoji","emoji","fixEmoji","docIds","document_id","documents","appDocsManager","getCachedCustomEmojiDocuments","setDebouncedGetCustomEmojiDocuments","getCustomEmojiDocumentsPromise","allIds","getCustomEmojiDocument","getCustomEmojis","getEmojiStickers","AppGroupCallsManager","groupCalls","participants","nextOffsets","updateGroupCall","saveGroupCall","updateGroupCallParticipants","groupCallId","saveApiParticipants","groupCall","getCachedParticipants","prepareToSavingNextOffset","nextOffsetsMap","nextOffset","setNextOffset","newNextOffset","saveApiParticipant","skipCounterUpdating","oldParticipant","hasLeft","muted","can_self_unmute","getGroupCall","modified","just_joined","apiParticipants","editParticipant","getGroupCallInput","getInputPeerSelf","volume","raise_hand","raiseHand","video_paused","videoPaused","video_stopped","videoStopped","presentation_paused","presentationPaused","getGroupCallFull","participants_next_offset","shouldUpdate","createGroupCall","scheduleDate","schedule_date","getGroupCallParticipants","sources","groupCallParticipants","next_offset","hangUp","discard","groupCallInput","source","join_as","joinGroupCall","isMuted","joinVideo","leaveGroupCallPresentation","getPhotoInput","getPhotoMediaInput","ttl_seconds","getMediaInput","AppInlineBotsManager","inlineResults","setHash","getGeoInput","geo","lat","long","accuracy_radius","getInlineResults","bot","geo_point","stopTime","botResults","queryId","query_id","appPhotosManager","savePhoto","generateQId","pushPopularBot","getTopPeers","topPeers","botPeerId","topPeer","rating","switchToPM","fromPeerId","startParam","startBot","checkSwitchReturn","getUser","bot_inline_placeholder","peerData","switchInlineQuery","getPeerUsername","callbackButtonClick","button","msg_id","sendInlineResult","queryAndResultIds","inlineResult","queryID","resultID","resultId","send_message","reply_markup","replyMarkup","sendText","inputMedia","messageMedia","caption","sendMessage","geoPoint","address","provider","venue_id","venue_type","phone_number","first_name","last_name","vcard","description","currency","total_amount","shipping_address_requested","start_param","sendOther","AppMessagesIdsManager","tempNum","num","splitStringByLength","maxLength","lastSliceStartIndex","arrayIndex","cut","end","part","_arrayIndex","partLength","appTabsManager","tabs","start","getTabs","tab","addTab","deleteTab","getDocumentInput","setBooleanFlag","processAfter","UPDATE_STICKERSET_ORDER","AppMessagesManager","pendingByRandomId","pendingByMessageId","pendingAfterMsgs","tempFinalizeCallbacks","sendSmthLazyLoadQueue","needSingleMessages","extendedMedia","maxSeenId","newDialogsToHandle","notificationsToHandle","reloadConversationsPeers","groupedTempId","typings","unreadMentions","goToNextMentionPromises","batchUpdates","middleware","clean","uploadFilePromises","messagesStorageByPeerId","groupedMessagesStorage","scheduledMessagesStorage","historiesStorage","threadsStorage","searchesStorage","pinnedMessages","threadsServiceMessagesIdsStorage","threadsToReplies","handleNewDialogs","newMaxSeenId","updateMap","processDialog","isDialogDefined","incrementMaxSeenId","handleNotifications","notificationsHandlePromise","notifyPeerToHandle","getNotifyPeerSettings","peerTypeNotifySettings","mentioned","notifyAboutMessage","fwdCount","onUpdateMessageId","onUpdateNewMessage","getMessagePeer","isLocalThreadUpdate","createMessageStorage","threadKey","getThreadKey","handleNewUpdateAfterReload","threadStorage","reply_to_peer_id","reply_to_mid","receiptMessage","checkPendingMessage","updateMessageRepliesIfNeeded","ignoreExisting","findSlice","firstSlice","forceUserOnline","handleNewMessage","inboxUnread","modifyCachedMentions","setDialogTopMessage","notifyPeer","onUpdateMessageReactions","recentReaction","previousReactions","previousRecentReactions","show_previews","peerReaction","pushBatchUpdate","batchUpdateReactions","setDialogToStateIfMessageIsTop","onUpdateDialogUnreadMark","unread_mark","onUpdateEditMessage","oldMessage","newMessage","handleEditedMessage","isTopMessage","clear_history","dispatchEditEvent","newReactions","grouped_id","onUpdateReadHistory","max_id","read_max_id","getObjectKeysAndSort","stillUnreadCount","still_unread_count","newUnreadMentionsCount","foundAffected","repliesKey","getReadMaxIdIfUnread","messageThreadId","getMessageThreadId","setCount","threadKeyPart","onUpdateReadMessagesContents","topMsgId","mids","findPeerIdByMids","media_unread","fixDialogUnreadMentionsIfNoMessage","onUpdateChannelAvailableMessages","availableMinId","available_min_id","onUpdateDeleteMessages","threadKeys","historyUpdated","handleDeletedMessages","threadsStorages","msgs","affected","onUpdateChannel","needDialog","getPeerActiveUsernames","onUpdateChannelReload","flushStoragesByPeerId","onUpdateChannelMessageViews","views","batchUpdateViews","onUpdateServiceNotification","popup","phone","onUpdatePinnedMessages","missingMessages","werePinned","getPinnedMessagesKey","hiddenPinnedMessages","onUpdateNotifySettings","onUpdateNewScheduledMessage","isScheduled","onUpdateDeleteScheduledMessages","onUpdateMessageExtendedMedia","extended_media","batch","toDispatch","getMessagesFromMap","previousResults","changedResults","reactionCount","previousReactionCount","_reactionCount","reactionsEqual","chosen_order","updateMessageID","updateNewDiscussionMessage","updateNewMessage","updateNewChannelMessage","updateDialogUnreadMark","updateEditMessage","updateEditChannelMessage","updateMessageReactions","updateReadChannelDiscussionInbox","updateReadChannelDiscussionOutbox","updateReadHistoryInbox","updateReadHistoryOutbox","updateReadChannelInbox","updateReadChannelOutbox","updateChannelReadMessagesContents","updateReadMessagesContents","updateChannelAvailableMessages","updateDeleteMessages","updateDeleteChannelMessages","updateChannel","updateChannelReload","updateChannelMessageViews","updateServiceNotification","updatePinnedMessages","updatePinnedChannelMessages","updateNotifySettings","updateNewScheduledMessage","updateDeleteScheduledMessages","updateMessageExtendedMedia","filterFunc","getScheduledMessagesStorage","webpage","appWebPagesManager","getCachedWebPage","drop","poll","appPollsManager","pollToMessages","startsWith","batchUpdatesDebounced","debounce","details","maxSeenMsgId","sendEntites","entity","invokeAfterMessageIsSent","tempId","callbackName","finalize","editMessage","is_scheduled","newMedia","noWebPage","handled","replyToMsgId","MAX_LENGTH","message_length_max","webPage","getPeerMigratedTo","generateOutgoingMessage","toggleError","onMessagesSendError","sentRequestOptions","afterMessageId","sendAs","sendAsPeerId","apiPromise","invokeApiAfter","clear_draft","update_stickersets_order","wrapMessageEntities","beforeMessageSending","sequential","noop","sendFile","attachType","apiFileName","fileType","File","isDocument","Blob","isPhoto","IMAGE_MIME_TYPES_SUPPORTED","strippedPhotoSize","strippedBytes","actionName","isVoiceMessage","waveform","isMedia","photoSize","sizes","objectURL","VIDEO_MIME_TYPES_SUPPORTED","videoAttribute","isRoundMessage","supports_streaming","noSound","thumbCacheContext","sentDeferred","spoiler","uploadingFileName","getFileNameForUpload","uploaded","uploadPromise","load","thumbUploadPromise","cancelPendingMessage","setTyping","addNotifyListener","progress","percents","floor","done","total","notifyAll","force_file","isGroupedItem","background","ret","sendAlbum","sendFileDetails","groupId","o","invoke","multiMedia","multi_media","originalInputMedia","inputSingleMedia","inputs","sendContact","contactPeerId","getContactMediaInput","pollId","savePoll","total_voters","getPoll","getPhoto","postAuthor","getPeer","signatures","generateFromId","post_author","generateFlags","generateReplyHeader","via_bot_id","replies","generateReplies","replyToTopId","originalMessage","forum_topic","reply_to_top_id","linked_chat_id","comments","replies_pts","isAnonymousSending","generateForwardHeader","isUserHidden","from_name","userFull","getCachedFullUser","private_forward_name","channel_post","saved_from_msg_id","saved_from_peer","generateFakeAvatarMessage","Number","MAX_SAFE_INTEGER","getUploadPromise","uploadFileName","admin_rights","anonymous","pendingData","fillConversations","chatHistoryStorage","maxSeenIdIncremented","hasPrepend","noIdsDialogs","setFolderId","setMessageUnreadByDialog","folderDialogs","dialogsLength","slicedDialogs","offset_peer","offsetPeerId","forwardMessages","config","overflowMids","forwarded_count_max","dropCaptions","dropAuthor","newMids","newMessages","replyToMid","replyToMessageIdx","newReplyToMid","getStickerEffectThumb","nopremium","group","from_peer","to_peer","with_my_score","withMyScore","drop_author","drop_media_captions","generateEmptyMessage","getMessagesStorageByKey","s","getMessagesStorage","getMessageById","cantForwardDeleteMids","cantForward","cantDelete","canForward","canDeleteMessage","reloadConversationOrTopic","inputDialogPeer","getInputDialogPeerById","reloadConversationsPromise","inputDialogPeers","currentState","doFlushHistory","just_clear","revoke","affectedHistory","flushHistory","justClear","getHistory","historyResult","getTypingKey","ss","hidePinnedMessages","getPinnedMessage","getSearch","inputFilter","getPinnedMessagesCount","getPinnedMessagesMaxId","updatePinnedMessage","unpin","pm_oneside","unpinAllMessages","unpinAll","getAlbumText","getGroupsFirstMessage","minMid","getMidsByAlbum","groupedId","getMessagesByAlbum","getMidsByMessage","filterMessages","appMessagesIdsManager","saveMessage","isMessage","replyTo","overwriting","msgId","savedFromPeerId","savedFromMid","savedFrom","mediaContext","unsupported","originalDoc","messageKey","getMessageKeyForPendingWebPage","saveWebPage","appWebDocsManager","saveWebDocument","extendedMediaMedia","totalEntities","migrateFrom","migrateTo","video_sizes","appGroupCallsManager","migrateChecks","getFirstMessageToEdit","goodMessage","myPeerId","canEditMessage","apiEntities","myEntities","parseEntities","mergeEntities","reportMessages","editPeerFolders","getDialogPeer","markDialogUnread","read","fromChat","canMessageBeEdited","kind","goodMedias","edit_time_limit","getReplyKeyboard","messageReplyMarkup","lastReplyMarkup","selective","maxOutId","single_use","getSearchStorage","getSearchCounters","canCache","isPeerRestricted","func","filterMessagesByInputFilterFromStorage","_storage","filterMessagesByInputFilter","nextRate","backLimit","offset_id_offset","next_rate","foundMsgs","min_date","max_date","add_offset","min_id","offsetId","offsetMessage","offset_rate","searchResult","foundCount","subscribeRepliesThread","getDiscussionMessage","generateThreadServiceStartMessage","maxMessageId","serviceStartMessage","is_single","getThreadServiceMessageId","getMessageWithReplies","newMaxId","unsetEnd","newDialogsHandlePromise","deleteMessages","localMessageIds","creator","delete_messages","affectedMessages","readHistory","triedToReadMaxId","readPromise","getPeerString","readAllHistory","getUnreadMentionsKey","slicedArray","fixUnreadMentionsCountIfNeeded","goToNextMention","loadNextPromise","loadNextMentions","last","getUnreadMentions","mergeHistoryResult","minId","messagesMessages","readMessages","msgIds","getHistoryStorageTransferable","historySerialized","toJSON","inputNotifyPeer","getInputNotifyPeerById","ignorePeerId","getNotifyPeerTypeSettings","getNotifySettings","isMessageIsTopMessage","threadMessage","broadcastEventName","pendingMessage","finalizePendingMessage","mutePeer","validatePeerSettings","muteUntil","mute_until","togglePeerMute","mute","canSendToPeer","canSendToUser","finalMessage","tempMessage","finalizePendingMessageCallbacks","newPhoto","newDoc","newPhotoSize","oldCacheContext","getPhotoDownloadOptions","thumbSize","polls","handleReleasingMessage","getMessageReactionsListAndReadParticipants","skipReadParticipants","skipReactionsList","emptyMessageReactionsList","canViewMessageReadParticipants","getMessageReadParticipants","appReactionsManager","getMessageReactionsList","messageReactionsList","readParticipantsPeerIds","filteredReadParticipants","readPeerId","reactionsCount","readParticipants","appConfig","getAppConfig","chat_read_mark_size_threshold","chat_read_mark_expire_period","incrementMessageViews","increment","chatPeerIds","idleStartTime","getScheduledMessageByPeer","getScheduledMessages","sendScheduledMessages","deleteScheduledMessages","getMessageWithCommentReplies","isFetchIntervalNeeded","getNewHistory","isBottomEnd","getEnds","offsetIdOffset","haveSlice","sliceMe","fulfilled","fillHistoryStorage","constructSlice","isHistoryResultEnd","topWasMeantToLoad","wasMaxId","requestHistory","deleteSlice","oldestMessage","foundSlice","_historyResult","fetchSingleMessages","fetchSingleMessagesPromise","requestPromises","getMessagesResult","getExtendedMedia","toRequest","fetchMessageReplyTo","replyToPeerId","typing","smth","deleteWebPageFromPending","updatePollToMessage","groupedStorage","albums","dispatchAlbumEdit","deletedMids","noforwards","noForwards","getElementCallback","newMap","peerIdStr","saveDefaultSendAs","convertInputKeyToKey","inputKey","AppNotificationsManager","peerSettings","notifyUsers","notifyChats","notifyBroadcasts","notifyForumTopic","checkMuteUntil","checkMuteUntilTimeout","closestMuteUntil","peerNotifySettings","typeKey","checkMuteUntilThrottled","throttle","isPeerType","notifySettings","getNotifyPeerTypePromise","getContactSignUpNotification","notifyContactsSignUp","setContactSignUpNotification","getPeerKey","getPeerMuted","getPeerLocalSettings","n","peerKey","typeNotifySettings","AppPeersManager","canPinMessage","getPeerPhoto","getUserString","getRestrictionReasonText","restriction_reason","getUserInputPeer","getUserSearchText","getDialogType","getDeleteButtonText","AppPhotosManager","photos","oldPhoto","Infinity","getUserPhotos","inputUser","photosResult","photoIds","photoId","AppPollsManager","updateMessagePoll","poll_id","saveResults","chosenIndexes","answer","chosen","getInputMediaPoll","correctAnswers","solution","solutionEntities","correct_answers","solution_entities","sendVote","optionIds","answers","option","getResults","getVotes","votesList","stopPoll","newPoll","AppPrivacyManager","privacy","updatePrivacy","rules","setPrivacy","privacyRules","inputRule","rule","getPrivacy","privacyKey","getGlobalPrivacySettings","setGlobalPrivacySettings","PEER_FULL_TTL","AppProfileManager","usersFull","chatsFull","fullExpiration","onUpdateUserTyping","getTypingsKey","typingsInPeer","t","cancelAction","getChatFull","onUpdatePeerBlocked","blocked","updateChatParticipants","updateChatParticipantAdd","_participants","updateChatParticipantDelete","updateUserTyping","updateChatUserTyping","updateChannelUserTyping","updatePeerBlocked","fullChat","updated","call_active","hasChatPhoto","chat_photo","refreshFullPeer","invalidateChannelParticipants","usersUserFull","full_user","profile_photo","botInfo","bot_info","referenceContext","description_document","description_photo","getProfileByPeerId","getCachedProfileByPeerId","getFullPhoto","profile","full_chat","getChatInviteLink","exported_invite","link","exportedInvite","getChannelParticipants","broadcast","getChannelParticipant","channelParticipant","fullChannel","processError","getMentions","processUserIds","ratingMap","cP","updateProfile","saveApiUser","uploadProfilePhoto","updateResult","strippedThumb","stripped_thumb","deletePhotos","deletedList","verifyParticipantForOnlineCount","reduceParticipantsForOnlineCount","getOnlines","chatInfo","channelParticipants","onlines","getPeerTypings","callbackifyAll","SAVE_DOC_KEYS","REFERENCE_CONTEXT","AppReactionsManager","availableReactions","getAvailableReactions","sendReactionPromises","lastSendingTimes","availableReaction","around_animation","static_icon","appear_animation","center_icon","messagesAvailableReactions","getActiveAvailableReactions","inactive","getAvailableReactionsForPeer","activeAvailableReactions","unshiftQuickReaction","getQuickReaction","quickReaction","chatAvailableReactions","filteredChatAvailableReactions","unshiftQuickReactionInner","getAvailableReactionsByMessage","isReactionActive","reactions_default","getReactionCached","getReaction","getMessagesReactions","setDefaultReaction","sendReaction","lastSendingTimeKey","unsetReactionCount","canSeeList","can_see_list","chosenReactions","unsetReactions","chosenReactionIdx","chosenReactionCount","chosenReactionsLength","reactionCountIdx","id1","id2","promiseKey","editMessageUpdateIdx","editMessageUpdate","LOCAL_IDS","EMOJI","EMOJI_ANIMATIONS","PREMIUM_GIFTS","GENERIC_ANIMATIONS","DEFAULT_STATUSES","DEFAULT_TOPIC_ICONS","LOCAL_IDS_SET","AppStickersManager","processAllStickersResult","allStickers","sets","stickerSet","videos","getStickerSetPromises","getStickersByEmoticonsPromises","sounds","getAnimatedEmojiStickerSet","getGreetingStickersPromise","getGreetingStickersTimeout","getGreetingSticker","onStickersUpdated","updateNewStickerSet","saveStickerSet","updateRecentStickers","updateFavedStickers","updateMoveStickerSetToTop","stickers","getFavedStickersStickers","getRecentStickersStickers","justPreload","getStickersByEmoticon","greetingStickers","random","saveStickers","canUseStickerSetCache","useCache","refreshTime","getStickerSet","cachedSet","getStickerSetInput","saveById","getLocalStickerSet","animations","getAnimatedEmojiSoundsPromise","emojies_sounds","sound","bytesStr","atob","file_reference_base64","charCodeAt","this_dc","getRecentStickers","recentStickers","saveRecentSticker","unsave","_doc","docEmoticon","faved","cleanEmoji","getAnimatedEmojiSticker","isAnimation","packs","getAnimatedEmojiSoundDocument","preloadAnimatedEmojiSticker","preloadEmojiPromise","preloadAnimatedEmojiStickerAnimation","animation","preloadSticker","isPremiumEffect","video_thumbs","newSet","setToCache","needSave","installed_date","getStickerSetThumbDownloadOptions","thumb_dc_id","isAnimated","mimeType","getFeaturedStickers","covered","getPromoPremiumStickers","getPremiumStickers","getFavedStickers","favedStickers","getFavedStickersLimit","faveSticker","unfave","toggleStickerSet","archived","toggleStickerSets","searchStickerSets","excludeFeatured","exclude_featured","foundSaved","cover","getAllStickers","preloadStickerSets","includeOurStickers","messagesStickers","installedSets","foundStickers","cachedStickersAnimated","cachedStickersStatic","iteratePacks","clearRecentStickers","AppUsersManager","usernames","getTopPeersPromises","contactsIndex","createSearchIndex","contactsFillPromise","contactsList","updatedContactsList","updateUsersStatuses","timestampNow","updateUserStatus","setInterval","expires","was_online","setUserToStateIfNeeded","updateUserName","contactsListCachedTime","contact","mutual_contact","pushContact","recentSearch","onContactsModified","fromServer","pushRecentSearch","clearRecentSearch","resolveUsername","resolvedPeer","processResolvedPeer","resolvePhone","popContact","getContacts","includeSaved","sortBy","_contactsList","userId1","userId2","sortName1","sortName","sortName2","localeCompare","status1","getUserStatusForSort","myUserId","testSelfSearch","getContactsPeerIds","toggleBlock","block","apiUsers","cleanedUsernames","cleanUsername","searchUsername","oldPeer","oldUser","fullName","wasContact","newContact","onContactUpdated","checkPremium","isUserOnlineVisible","getUserStatus","isRegularUser","getUserPhone","isAnonymous","fragment_prefixes","isAttachMenuBot","bot_attach_menu","support","isNonContactUser","eventTimestamp","importContact","importContacts","phones","inputContacts","j","client_id","importedContactsResult","imported","importedContact","topPeersCache","cachedTime","categories","getBlocked","contactsBlocked","getLocated","self_expires","searchContacts","my_results","curIsContact","setUserStatus","offline","updateMyOnlineStatus","addContact","addPhonePrivacyException","add_phone_privacy_exception","deleteContacts","photoTypeSet","AppWebPagesManager","webpages","pendingWebPages","updateWebPage","apiWebPage","oldWebPage","isUpdated","siteName","site_name","shortTitle","author","pendingSet","getWebPage","readBlobAsArrayBuffer","readBlobAs","fileNameRFC","escape","DownloadWriter","serviceMessagePort","getServiceMessagePort","write","chunk","saveToStorage","DownloadStorage","getFile","prepareWriting","headers","cancel","getWriter","MIN_PART_SIZE","IGNORE_ERRORS","ApiFileManager","cacheStorage","downloadStorage","downloadPromises","uploadPromises","downloadPulls","downloadActives","refreshReferencePromises","maxUploadParts","maxDownloadParts","uncompressTGS","uncompressTGV","svgIndex","__","fixFirefoxSvg","TextEncoder","convertWebp","convertOpus","webFileDcId","webfile_dc_id","upload_max_fileparts_premium","upload_max_fileparts_default","downloadRequest","activeDelta","downloadPull","downloadCheck","downloadLimit","setQueueId","getFileStorage","cancelDownload","canceled","requestWebFilePart","checkCancel","isLocalWebFile","extension","file_type","mtime","fileDownload","getDelta","checkedReference","getLimitPart","isUpload","maxParts","maxPartSize","inputFileLocation","isDownloading","getDownload","getUpload","getConvertMethod","IS_OPUS_SUPPORTED","allocateDeferredPromises","startOffset","delayed","writeDeferred","writePromise","originalMimeType","convertMethod","getDownloadFileNameFromOptions","cacheFileName","errorHandler","prepared","isWebFile","cachePrepared","downloadPrepared","possibleSize","_errorHandler","writer","truncate","downloadFileName","readBlobAsUint8Array","requestPart","dispatchProgress","throttledDispatchProgress","superpuper","isFinal","getParts","replaceParts","processedResult","getDownloadMediaDetails","downloadMediaURL","downloadMediaVoid","fileSize","isBigFile","partSize","totalParts","fileId","resultInputFile","parts","md5_checksum","resolved","it","_part","doneParts","file_id","file_part","file_total_parts","fileUpload","generator","ApiManagerMethods","apiPromisesSingleProcess","apiPromisesSingle","apiPromisesCacheable","afterMessageIdTemp","setUserAuth","prepareTempMessageId","queryJSON","newResult","cacheKey","oldPromise","getNewPromise","newPromise","ignore_restriction_reasons","pin","folderPin","bio","topicPin","ApiManager","cachedNetworkers","cachedExportPromise","gettingNetworkers","baseDcId","afterMessageTempIds","changeTransportType","updateConfig","iterateNetworkers","getTransportType","connections","dcs","array","oldTransportType","oldObject","oldGetKey","newGetKey","info","changeNetworkerTransport","getBaseDcId","sessionStorage","setBaseDcId","userAuth","dcID","user_auth","wasDcId","getNetworker","setOnDrainIfNeeded","dc","logOut","loggingOut","storageKeys","storageResult","logoutPromises","ignoreErrors","toggleStorages","generateNetworkerGetKey","networkers","maxNetworkers","found","isOnline","ak","authKeyHex","serverSaltHex","authKey","bytesFromHex","authKeyId","serverSalt","authorizer","_error","newTransportType","removeTransport","stack","getNetworkerVoid","oldTransport","changeTransport","onNetworkerDrain","onDrain","removeNetworker","isFileNetworker","canRelease","setDrainTimeout","updatesProcessor","cachedNetworker","startTime","isStopped","performRequest","wrapApiCall","exportResolve","exportReject","exportedAuth","newDcId","unsetConnectionInited","rawError","waitTime","floodMaxTimeout","attachPromise","originalError","PeersStorage","neededPeers","singlePeerMap","thumbFullSize","ThumbsStorage","thumbsCache","intToUint","ulongFromInts","high","low","shiftLeft","safeBigInt","ulongBigInt","pow","longBigInt","divide","bigIntFromBytes","base","boolFalse","predicate","boolTrue","vector","gzipPacked","sliceMethod","TLSerialization","mtproto","startMaxLength","createBuffer","ArrayBuffer","intView","Int32Array","byteView","getArray","resultBuffer","resultInt32","subarray","getBuffer","getBytes","typed","resultArray","getOffset","checkLength","needBytes","previousBuffer","previousArray","writeInt","field","storeInt","storeBool","storeLongP","iHigh","iLow","storeLong","sLong","storeIntBytes","_bigInt","bigInt","isNegative","quotient","remainder","divmod","toJSNumber","storeDouble","Float64Array","storeString","sUTF8","unescape","storeBytes","bits","storeRawBytes","storeMethod","methodName","methodData","methods","m","flagsOffsets","param","condType","fieldBit","storeObject","paramName","itemType","schema","isBare","constructorData","TLDeserialization","readInt","fetchInt","fetchDouble","doubleView","fetchLong","ulong","greater","minus","greaterOrEquals","abs","fetchBool","fetchObject","fetchString","String","fromCharCode","decodeURIComponent","fetchBytes","fetchIntBytes","fetchRawBytes","fetchVector","fallback","checkType","constructorCmp","uncompressed","constructorsIndex","schemaFallback","int1","int2","overrideKey","isCond","formatJSONValue","jsonValue","objectValues","objectValue","setOffset","addPadding","blockSize","zeroes","blockSizeAsTotalLength","needPadding","padding","bufferConcats","delays","disconnectDelayMin","disconnectDelayMax","pingInterval","pingMaxTime","connectionTimeout","RESEND_OPTIONS","noSchedule","notContentRelated","invokeAfterMsgConstructor","networkerTempId","MTPNetworker","lastServerMessages","sentMessages","pendingMessages","pendingAcks","pendingResendReq","nextReq","checkConnectionPeriod","lastResponseTime","activeRequests","sendPingDelayDisconnect","pingDelayDisconnectDeferred","lastPingTime","disconnectDelay","round","timeoutTime","lastPingStartTime","pingId","lastPingDelayDisconnectId","wrapMtpCall","ping_id","disconnect_delay","rejectTimeout","elapsedTime","checkLongPoll","isClean","longPollPending","sleepAfter","sendLongPoll","checkConnection","clearCheckConnectionTimeout","serializer","pingMessage","generateId","seq_no","generateSeqNo","sendEncryptedRequest","toggleOffline","checkConnectionTimeout","authKeyUint8","convertToUint8Array","isFileUpload","isFileDownload","updateSession","seqNo","prevSessionId","updateSentMessage","sentMessageId","sentMessage","container","inner","innerSentMessageId","innerSentMessage","pushMessage","wrapMtpMessage","connectionInited","invokeWithLayer","initConnection","resultType","isAPI","nextReqTimeout","longPollInterval","clearPingDelayDisconnect","forceReconnectTimeout","sendingLongPoll","max_delay","wait_after","max_wait","noResponse","longPoll","delay","checkConnectionRetryAt","scheduleRequest","handleSentEncryptedRequestHTTP","noResponseMsgs","sqrt","pushResend","shouldResolve","onDrainTimeout","willChange","onConnectionStatusChange","innerMsgId","acked","getMsgKey","dataWithPadding","x","msgKeyLargePlain","msgKeyLarge","getAesKeyIv","msgKey","sha2aText","sha2bText","aesKey","aesIv","sha2a","sha2b","akStopped","performScheduledRequest","ackMsgIds","msg_ids","pendingResendReqLength","outMessage","messagesByteLen","hasApiCall","hasHttpWait","lengthOverflow","compare","messageByteLength","generateContainerMessage","messageWithBody","innerMessages","getEncryptedMessage","keyIv","getDecryptedMessage","encryptedData","getEncryptedOutput","dataBuffer","paddingLength","encryptedResult","requestData","baseError","responseBuffer","deserializer","bytesCmp","calcMsgKey","totalLength","messageBodyLength","messageBody","mt_message","seqno","mt_rpc_result","req_msg_id","applyServerSalt","newServerSalt","toArray","ackMessage","reqResend","notEmpty","processMessageAck","error_message","error_code","msg","applyServerTime","serverTime","shiftRight","innerMessage","new_server_salt","bad_msg_id","changedTimeOffset","badMessage","first_msg_id","server_salt","answer_msg_id","lastResendReq","lastResend","pendingResend","reqMsgId","badMsgId","pos","NetworkerFactory","startAll","stoppedNetworkers","stopAll","setLanguage","testPublicKeysHex","modulus","exponent","publisKeysHex","publicKeysParsed","preparePromise","prepare","keyParsed","RSAPublicKey","fingerprintBytes","fingerprints","fingerprintHex","fill","foundKey","fingerprint","bytesXor","bytes1","bytes2","Authorizer","sendPlainRequest","requestArray","requestLength","headerArray","errorCode","auth_key_id","msg_len","sendReqPQ","nonce","rsaKeysManager","serverNonce","server_nonce","pq","server_public_key_fingerprints","publicKey","pAndQ","sendReqDhParams","newNonce","p_q_inner_data_dc","new_nonce","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","localTime","tmpAesKey","tmpAesIv","answerWithHash","answerWithPadding","g","dhPrime","dh_prime","gA","g_a","server_time","retry","verifyDhParams","dhPrimeHex","gABigInt","dhPrimeBigInt","subtract","twoPow","gBytes","gB","retry_id","authKeyHash","authKeyAux","newNonceHash1","new_nonce_hash1","newNonceHash2","new_nonce_hash2","newNonceHash3","new_nonce_hash3","getTransportTypePromise","_try","TimeManager","lastMessageId","timeOffset","timeTicks","newTimeOffset","changed","server_time_offset","AppWebDocsManager","webDocument","AppPaymentsManager","getInputInvoiceBySlug","getInputInvoiceByPeerId","getPaymentForm","invoice","paymentForm","getPaymentReceipt","validateRequestedInfo","sendPaymentForm","formId","requestedInfoId","shippingOptionId","credentials","tipAmount","form_id","requested_info_id","shipping_option_id","tip_amount","clearSavedInfo","AppAttachMenuBotsManager","attachMenuBots","attachMenuBotsArr","onUpdateAttachMenuBots","getAttachMenuBots","updateAttachMenuBots","saveAttachMenuBot","attachMenuBot","bot_id","icon","getAttachMenuBotIcon","saveAttachMenuBots","getAttachMenuBotCached","requestWebView","fromBotMenu","themeParams","from_bot_menu","theme_params","prolongWebView","AppSeamlessLoginManager","requestUrlAuth","buttonId","button_id","urlAuthResult","acceptUrlAuth","writeAllowed","write_allowed","getWebAuthorizations","webAuthorizations","authorizations","resetWebAuthorization","resetWebAuthorizations","AppThemesManager","wallPapers","saveWallPaper","getWallPaper","inputWallPaper","getInputWallPaper","getThemes","accountThemes","themes","theme","themeSettings","getWallPapers","accountWallpapers","wallpapers","appManagersManager","cryptoWorkersURLs","cryptoPortsAttached","cryptoPortPromise","getManagers","manager","apply","ports","originalUrl","newURLs","createManagers","appAvatarsManager","appCallsManager","appPrivacyManager","appInlineBotsManager","passwordManager","appPaymentsManager","appSeamlessLoginManager","_serviceMessagePort","_isServiceWorkerOnline","pushedKeys","clearWrite","invokeExceptSource","serviceWorkerOnline","serviceWorkerPort","detachPort","attachPort","messagePort","onConnect","onDisconnect","listenPort","sendPort","attachListenPort","attachSendPort","setOnPortDisconnect","listenMessagePort","NULL_PEER_ID","REPLIES_PEER_ID","REPLIES_HIDDEN_CHANNEL_ID","SERVICE_PEER_ID","MUTE_UNTIL","MAX_FILE_SAVE_SIZE","THUMB_TYPE_FULL","ATTACH_MENU_BOT_ICON_NAME","GENERAL_TOPIC_ID","T_ME_PREFIXES","FOLDER_ID_ALL","FOLDER_ID_ARCHIVE","REAL_FOLDERS","START_LOCAL_ID","ALPHA_CHARS_REG_EXP","ALPHA_NUMERIC_REG_EXP","URL_ALPHANUMERIC_REG_EXP_PART","URL_PROTOCOL_REG_EXP_PART","URL_REG_EXP","URL_ANY_PROTOCOL_REG_EXP","USERNAME_REG_EXP","BOT_COMMAND_REG_EXP","FULL_REG_EXP","EMAIL_REG_EXP","MARKDOWN_REG_EXP","MARKDOWN_ENTITIES","PASS_CONFLICTING_ENTITIES","PHONE_NUMBER_REG_EXP","encodeEmoji","emojiText","unicodeSurrogates","points","char","previous","toCodePoints","removeVS16s","vs16RegExp","zeroWidthJoiner","rawEmoji","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","__webpack_exports__","O","chunkIds","fn","priority","notFulfilled","getter","__esModule","definition","enumerable","chunkId","miniCssF","globalThis","Function","prop","Symbol","toStringTag","nmd","paths","children","scriptUrl","importScripts","currentScript","src","scripts","getElementsByTagName","oldGetScript","oldLoadScript","queryMap","countMap","retries","realSrc","cacheBust","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","moreModules","runtime"],"sourceRoot":""} \ No newline at end of file diff --git a/public/report.html b/public/report.html index 81073deb..17ce26ae 100644 --- a/public/report.html +++ b/public/report.html @@ -3,7 +3,7 @@ - tweb [10 Feb 2023 at 19:57] + tweb [17 Feb 2023 at 19:53] diff --git a/public/sw.a575e0dcdf92b2ccb0f9.chunk.js b/public/sw.c55ec44ab819870d4ac4.chunk.js similarity index 99% rename from public/sw.a575e0dcdf92b2ccb0f9.chunk.js rename to public/sw.c55ec44ab819870d4ac4.chunk.js index ee1e7ff8..d8d18c02 100644 --- a/public/sw.a575e0dcdf92b2ccb0f9.chunk.js +++ b/public/sw.c55ec44ab819870d4ac4.chunk.js @@ -1,2 +1,2 @@ (()=>{"use strict";var e,t,n={410:(e,t,n)=>{n.d(t,{GO:()=>r,ZP:()=>i});const o=n(1267).Z.debug,r="undefined"!=typeof window?window:self,i=o},4762:(e,t,n)=>{n.d(t,{IS_FIREFOX:()=>s,IS_SAFARI:()=>i});var o=n(6761);const r=navigator?navigator.userAgent:null,i=(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)&&o.Z.MSStream,!!("safari"in o.Z)||!(!r||!(/\b(iPad|iPhone|iPod)\b/.test(r)||r.match("Safari")&&!r.match("Chrome")))),s=navigator.userAgent.toLowerCase().indexOf("firefox")>-1;(void 0===navigator.maxTouchPoints||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)},1352:(e,t,n)=>{n.d(t,{FK:()=>s,N5:()=>r,SU:()=>o,kC:()=>i});const o="undefined"!=typeof ServiceWorkerGlobalScope&&self instanceof ServiceWorkerGlobalScope,r="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&!o,i=r||o,s=()=>self.clients.matchAll({includeUncontrolled:!1,type:"window"}),a=(e,...t)=>{try{e.postMessage(...t)}catch(e){console.error("[worker] postMessage error:",e,t)}},c=(e,...t)=>{s().then((n=>{n.length&&n.slice(e?0:-1).forEach((e=>{a(e,...t)}))}))};o&&c.bind(null,!1),o&&c.bind(null,!0)},5003:(e,t,n)=>{n.d(t,{kg:()=>f,v9:()=>o});var o,r=n(410),i=n(4762),s=n(1352),a=n(5289);!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"}(o||(o={}));const c=[o.None,o.Error,o.Warn,o.Log,o.Debug],l=!(i.IS_SAFARI||i.IS_FIREFOX),u="",h="",d=[["debug",o.Debug],["info",o.Log],["warn",o.Warn],["error",o.Error],["assert",o.Error],["trace",o.Log],["group",o.Log],["groupCollapsed",o.Log],["groupEnd",o.Log]];function f(e,t=o.Log|o.Warn|o.Error,n=!1,i=""){let g;r.ZP||n||(t=o.Error),l?i||(s.SU?i=u:s.N5&&(i=h)):i="";const p=i;i=i?`%s ${i}%s`:"%s";const m=function(...n){return t&o.Log&&console.log(i,(0,a.Z)(),e,...n)};return d.forEach((([n,o])=>{m[n]=function(...r){return t&o&&console[n](i,(0,a.Z)(),e,...r)}})),m.setPrefix=function(t){g=t,e="["+t+"]"},m.setPrefix(e),m.setLevel=function(e){t=c.slice(0,e+1).reduce(((e,t)=>e|t),0)},m.bindPrefix=function(e){return f(`${g}] [${e}`,t,n,p)},m}},6350:(e,t,n)=>{n.d(t,{Vp:()=>ee,cM:()=>Y,j6:()=>ne});var o=n(5003);function r(e){return new Promise((t=>{setTimeout(t,e)}))}const i=self,s="cachedAssets";function a(e){return e.ok&&200===e.status}function c(e){return Promise.race([e,r(1e4).then((()=>Promise.reject()))])}function l(){}function u(){const 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=l)})),Object.assign(t,e),t}var h=n(6761),d=n(1267);function f(e,t=""){Array.isArray(e)||(e=[e]);const n=function(e){return-1===["image/jpeg","image/png","image/gif","image/svg+xml","image/webp","image/bmp","video/mp4","video/webm","video/quicktime","audio/ogg","audio/mpeg","audio/mp4","audio/wav","application/json","application/pdf"].indexOf(e)?"application/octet-stream":e}(t);return new Blob(e,{type:n})}class g{constructor(e,t,n){this.mimeType=e,this.size=t,this.saveFileCallback=n,this.bytes=new Uint8Array(t)}write(e,t){return n=this,o=void 0,i=function*(){const n=t+e.byteLength;if(n>this.bytes.byteLength){const e=new Uint8Array(n);e.set(this.bytes,0),this.bytes=e}this.bytes.set(e,t)},new((r=void 0)||(r=Promise))((function(e,t){function s(e){try{c(i.next(e))}catch(e){t(e)}}function a(e){try{c(i.throw(e))}catch(e){t(e)}}function c(t){var n;t.done?e(t.value):(n=t.value,n instanceof r?n:new r((function(e){e(n)}))).then(s,a)}c((i=i.apply(n,o||[])).next())}));var n,o,r,i}truncate(){this.bytes=new Uint8Array}trim(e){this.bytes=this.bytes.slice(0,e)}finalize(e=!0){const t=f(this.bytes,this.mimeType);return e&&this.saveFileCallback&&this.saveFileCallback(t),t}getParts(){return this.bytes}replaceParts(e){this.bytes=e}}var p=n(5471);class m{constructor(e){this.dbName=e,this.useStorage=!0,d.Z.test&&(this.dbName+="_test"),m.STORAGES.length&&(this.useStorage=m.STORAGES[0].useStorage),this.openDatabase(),m.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(0,p.Z)("NO_ENTRY_FOUND");return e[t]()}))}saveFile(e,t){t instanceof Blob||(t=f(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)=>{return o=this,r=void 0,s=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)},new((i=void 0)||(i=Promise))((function(e,t){function n(e){try{c(s.next(e))}catch(e){t(e)}}function a(e){try{c(s.throw(e))}catch(e){t(e)}}function c(t){var o;t.done?e(t.value):(o=t.value,o instanceof i?o:new i((function(e){e(o)}))).then(n,a)}c((s=s.apply(o,r||[])).next())}));var o,r,i,s})):Promise.reject((0,p.Z)("STORAGE_OFFLINE"))}prepareWriting(e,t,n){return{deferred:u(),getWriter:()=>new g(n,t,(t=>this.saveFile(e,t).catch((()=>t))))}}static toggleStorage(e,t){return Promise.all(this.STORAGES.map((n=>{if(n.useStorage=e,t)return e?void 0:n.deleteAll()})))}}m.STORAGES=[];const v=new Map,w=new m("cachedStreamChunks"),y="Time-Cached";setInterval((()=>w.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(y)+86400<=o)return Y("will delete stream chunk:",t),e.delete(i,{ignoreSearch:!0,ignoreVary:!0})}));r.push(n)}return Promise.all(r)}))))),18e5),setInterval((()=>{const e=ee();for(const[t,n]of v)if(t!==e){for(const e in n)n[e].reject();v.delete(t)}}),12e4);const b=new Map;class P{constructor(e){this.info=e,this.loadedOffsets=new Set,this.destroy=()=>{b.delete(this.id)},this.id=P.getId(e),b.set(this.id,this),this.limitPart=e.size>78643200?O:S,this.destroyDebounced=function(e,t,n=!0,o=!0){let r,i,s,a,c=!1;const u=t=>{const n=s,o=a;try{n(e.apply(null,t))}catch(e){console.error("debounce error",e),o(e)}},d=(...e)=>{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&&(u(e),c=!1);const d=h.Z.setTimeout((()=>{!o||n&&!c||u(e),r===d&&(r=i=s=a=void 0,c=!1)}),t);return r=d,i.catch(l),i};return d.clearTimeout=()=>{r&&(h.Z.clearTimeout(r),a(),r=i=s=a=void 0,c=!1)},d.isDebounced=()=>!!r,d}(this.destroy,15e4,!1,!0)}requestFilePartFromWorker(e,t,n=!1){return o=this,r=void 0,s=function*(){const o={docId:this.id,dcId:this.info.dcId,offset:e,limit:t},r=JSON.stringify(o),i=ee();let s=v.get(i);s||v.set(i,s={});let a=s[r];if(a)return a.then((e=>e.bytes));this.loadedOffsets.add(e),a=s[r]=u(),ne.invoke("requestFilePart",o,void 0,i).then(a.resolve,a.reject).finally((()=>{s[r]===a&&(delete s[r],Object.keys(s).length||v.delete(i))}));const c=a.then((e=>e.bytes));return this.saveChunkToCache(c,e,t),!n&&this.preloadChunks(e,e+15*this.limitPart),c},new((i=void 0)||(i=Promise))((function(e,t){function n(e){try{c(s.next(e))}catch(e){t(e)}}function a(e){try{c(s.throw(e))}catch(e){t(e)}}function c(t){var o;t.done?e(t.value):(o=t.value,o instanceof i?o:new i((function(e){e(o)}))).then(n,a)}c((s=s.apply(o,r||[])).next())}));var o,r,i,s}requestFilePartFromCache(e,t,n){const o=this.getChunkKey(e,t);return w.getFile(o).then((e=>n?new Uint8Array:function(e){return function(e){return function(e,t){return new Promise((t=>{const n=new FileReader;n.addEventListener("loadend",(e=>{t(e.target.result)})),n.readAsArrayBuffer(e)}))}(e)}(e).then((e=>new Uint8Array(e)))}(e)),(e=>{e.type}))}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",[y]:""+(Date.now()/1e3|0)}});return w.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=b.get(this.getId(e)))&&void 0!==t?t:new P(e)}static getId(e){return e.location.id}}const S=524288,O=1048576;function k(e,t=2048){return e-e%t}var A=n(4762);function C(e,t){const n=Object.keys,o=typeof e;return e&&t&&"object"===o&&o===typeof t?n(e).length===n(t).length&&n(e).every((n=>C(e[n],t[n]))):e===t}class T{constructor(e){!function(e,t){if(t)for(const n in t)void 0!==t[n]&&(e[n]=t[n])}(this,e),d.Z.test&&(this.name+="_test"),this.storageIsAvailable=!0,this.log=(0,o.kg)(["IDB",e.name].join("-")),this.log("constructor"),this.openDatabase(!0),T.INSTANCES.push(this)}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;const t=(e,t)=>{var n;const o=Array.from(e.indexNames);for(const t of o)e.deleteIndex(t);if(null===(n=t.indexes)||void 0===n?void 0:n.length)for(const n of t.indexes)e.indexNames.contains(n.indexName)||e.createIndex(n.indexName,n.keyPath,n.objectParameters)};try{var n=indexedDB.open(this.name,this.version);if(!n)return Promise.reject()}catch(e){return this.log.error("error opening db",e.message),this.storageIsAvailable=!1,Promise.reject(e)}let o=!1;return setTimeout((()=>{o||n.onerror((0,p.Z)("IDB_CREATE_TIMEOUT"))}),3e3),this.openDbPromise=new Promise(((e,r)=>{n.onsuccess=t=>{o=!0;const i=n.result;let s=!1;this.log("Opened"),i.onerror=e=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),r(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)},n.onerror=e=>{o=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),r(e)},n.onupgradeneeded=e=>{o=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);const n=e.target,r=n.result;this.stores.forEach((e=>{if(r.objectStoreNames.contains(e.name)){const o=n.transaction.objectStore(e.name);t(o,e)}else((e,n)=>{const o=e.createObjectStore(n.name);t(o,n)})(r,e)}))}}))}static create(e){var t;return null!==(t=this.INSTANCES.find((t=>t.name===e.name)))&&void 0!==t?t:new T(e)}static closeDatabases(e){this.INSTANCES.forEach((t=>{if(e&&e===t)return;const n=t.db;n&&(n.onclose=()=>{},n.close())}))}}T.INSTANCES=[];class j{constructor(e,t){this.storeName=t,this.log=(0,o.kg)(["IDB",e.name,t].join("-")),this.idb=T.create(e)}delete(e,t){const n=Array.isArray(e);return n||(e=[].concat(e)),this.getObjectStore("readwrite",(t=>{const o=e.map((e=>t.delete(e)));return n?o:o[0]}),"",t)}clear(e){return this.getObjectStore("readwrite",(e=>e.clear()),"",e)}save(e,t,n){const o=Array.isArray(e);return o||(e=[].concat(e),t=[].concat(t)),this.getObjectStore("readwrite",(n=>{const r=e.map(((e,o)=>n.put(t[o],e)));return o?r:r[0]}),"",n)}get(e,t){const n=Array.isArray(e);if(n){if(!e.length)return Promise.resolve([])}else{if(!e)return;e=[].concat(e)}return this.getObjectStore("readonly",(t=>{const o=e.map((e=>t.get(e)));return n?o:o[0]}),"",t)}getObjectStore(e,t,n,o=this.storeName){let r;return n&&(r=performance.now(),this.log(n+": start")),this.idb.openDatabase().then((i=>new Promise(((s,a)=>{const c=i.transaction([o],e),l=()=>{clearTimeout(d),a(c.error)},u=()=>{clearTimeout(d),n&&this.log(n+": end",performance.now()-r);const e=p.map((e=>e.result));s(g?e:e[0])};c.onerror=l;const h="readwrite"===e;h&&(c.oncomplete=()=>u());const d=setTimeout((()=>{this.log.error("transaction not finished",c,n)}),1e4),f=t(c.objectStore(o)),g=Array.isArray(f),p=g?f:[].concat(f);if(h)return;const m=p.length;let v=m;const w=()=>{c.error||--v||u()};for(let e=0;ee.getAll()),"",e)}}const x=self,E=location.protocol+"//"+location.hostname+location.pathname.split("/").slice(0,-1).join("/")+"/";let _=0,I=!0;const N={push_mute_until:0,push_lang:{push_message_nopreview:"You have a new message",push_action_mute1d:"Mute for 24H",push_action_settings:"Settings"},push_settings:{}},D=new class{constructor(e,t,n){this.defaults=n,this.cache={},this.storage=new j(e,t)}getDefault(e){const t=this.defaults[e];return"function"==typeof t?t():t}get(e){return this.cache.hasOwnProperty(e)?this.cache[e]:this.storage.get(e).then((e=>e),(()=>{})).then((t=>this.cache.hasOwnProperty(e)?this.cache[e]:(null!=t||(t=this.getDefault(e)),this.cache[e]=t)))}getCached(e){const t=this.get(e);if(t instanceof Promise)throw"no property";return t}set(e,t){var n,o,r,i,s;return o=this,r=void 0,s=function*(){if(!C(null!==(n=this.cache[e])&&void 0!==n?n:this.defaults[e],t)){this.cache[e]=t;try{this.storage.save(e,t)}catch(e){}}},new((i=void 0)||(i=Promise))((function(e,t){function n(e){try{c(s.next(e))}catch(e){t(e)}}function a(e){try{c(s.throw(e))}catch(e){t(e)}}function c(t){var o;t.done?e(t.value):(o=t.value,o instanceof i?o:new i((function(e){e(o)}))).then(n,a)}c((s=s.apply(o,r||[])).next())}))}}({name:"tweb",version:7,stores:[{name:"session"},{name:"stickerSets"},{name:"users"},{name:"chats"},{name:"dialogs"},{name:"messages"}]},"session",N);for(const e in N)D.get(e);x.addEventListener("push",(e=>{const t=e.data.json();Y("push",Object.assign({},t));try{const[n,o,r]=[D.getCached("push_mute_until"),D.getCached("push_settings"),D.getCached("push_lang")],i=Date.now();if(L()&&n&&i{Y.error("Show notification promise",e)}))}(t,o,r);e.waitUntil(s)}catch(t){Y(t);const n="fix",o=x.registration.showNotification("Telegram",{tag:n});o.then((()=>{W(n)})),e.waitUntil(o)}})),x.addEventListener("notificationclick",(e=>{const t=e.notification;Y("on notification click",t),t.close();const n=e.action;if("mute1d"===n&&L())return Y("[SW] mute for 1d"),void D.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,R=o;for(let t=0;tx.clients.openWindow(e.baseUrl||E)))})).catch((e=>{Y.error("Clients.matchAll error",e)}));e.waitUntil(r)})),x.addEventListener("notificationclose",(function(e){var t;t=e.notification,F.delete(t)}));const F=new Set;let R;function W(e){for(const t of F)try{if(e&&t.tag!==e)continue;t.close(),F.delete(t)}catch(e){}let t;return t="getNotifications"in x.registration?x.registration.getNotifications({tag:e}).then((e=>{for(let t=0,n=e.length;t{Y.error("Offline register SW error",e)})):Promise.resolve(),t}function L(){return A.IS_FIREFOX}const M=new Set;var q=n(153),U=n(410);class Z extends q.Z{constructor(){super("SERVICE"),U.GO&&(U.GO.serviceMessagePort=this)}}var G=n(1352);const z=new Map,$=(0,p.Z)("UNKNOWN");self.downloadMap=z;const B={download:e=>{const{id:t}=e;if(z.has(t))return Promise.reject($);const n=new CountQueuingStrategy({highWaterMark:1}),o=u();let r;o.then((()=>{setTimeout((()=>{z.delete(t)}),5e3)}),(()=>{z.delete(t)}));const i=new ReadableStream({start:e=>{r=e},cancel:e=>{o.reject($)}},n),s=Object.assign(Object.assign({},e),{readableStream:i,promise:o,controller:r});return z.set(t,s),o.catch((()=>{throw $}))},downloadChunk:({id:e,chunk:t})=>{const n=z.get(e);return n?n.controller.enqueue(t):Promise.reject()},downloadFinalize:e=>{const t=z.get(e);return t?(t.promise.resolve(),t.controller.close()):Promise.reject()},downloadCancel:e=>{const t=z.get(e);if(t)return t.promise.reject(),t.controller.error()}};function V(e,t){const n=r(100).then((()=>{const e=z.get(t);if(!e||e.used)return;e.used=!0;const n=e.readableStream;return new Response(n,{headers:e.headers})}));e.respondWith(n)}function K(){if(z.size)for(const[e,t]of z)t.controller.error()}const X={};function J(e,t){const n=e.request.formData().then((t=>(function(e,t){var n,o,r,i,s;o=this,r=void 0,s=function*(){try{Y("share data",e);const o=function(e){return{files:e.getAll("files"),title:e.get("title"),text:e.get("text"),url:e.get("url")}}(e);(null!==(n=X[t])&&void 0!==n?n:X[t]=[]).push(o)}catch(e){Y.warn("something wrong with the data",e)}},new((i=void 0)||(i=Promise))((function(e,t){function n(e){try{c(s.next(e))}catch(e){t(e)}}function a(e){try{c(s.throw(e))}catch(e){t(e)}}function c(t){var o;t.done?e(t.value):(o=t.value,o instanceof i?o:new i((function(e){e(o)}))).then(n,a)}c((s=s.apply(o,r||[])).next())}))}(t,e.resultingClientId),Response.redirect(".."))));e.respondWith(n)}const Y=(0,o.kg)("SW",o.v9.Error|o.v9.Debug|o.v9.Log|o.v9.Warn,!0),H=self;let Q;const ee=()=>Q,te=e=>{Y("window connected",e.id,"windows before",ie.size),"none"!==e.frameType?(Y("windows",Array.from(ie)),ne.invokeVoid("hello",void 0,e),(e=>{ie.size||Q||(Y("sending message port for mtproto"),(e=>{const t=new MessageChannel;ne.attachPort(Q=t.port1),ne.invokeVoid("port",void 0,e,[t.port2])})(e))})(e),ie.set(e.id,e),function(e){const t=X[e.id];t&&(delete X[e.id],Y("releasing share events to client:",e.id,"length:",t.length),t.forEach((t=>{ne.invokeVoid("share",t,e)})))}(e)):Y.warn("maybe a bugged Safari starting window",e.id)},ne=new Z;ne.addMultipleEventsListeners({notificationsClear:W,toggleStorages:({enabled:e,clearWrite:t})=>{m.toggleStorage(e,t)},pushPing:(e,t)=>{!function(e,t){_=Date.now(),I=e.localNotifications,R&&t&&(ne.invokeVoid("pushClick",R,t),R=void 0),e.lang&&D.set("push_lang",e.lang),e.settings&&D.set("push_settings",e.settings)}(e,t)},hello:(e,t)=>{te(t)},shownNotification:function(e){M.add(e)}});const{onDownloadFetch:oe,onClosedWindows:re}=function(e){return e.addMultipleEventsListeners(B),{onDownloadFetch:V,onClosedWindows:K}}(ne);(0,G.FK)().then((e=>{Y(`got ${e.length} windows from the start`),e.forEach((e=>{te(e)}))}));const ie=new Map;self.connectedWindows=ie,function(e,t,n){const o=(t,n)=>{e.attachListenPort(t),n&&e.attachSendPort(n)};e.setOnPortDisconnect((e=>{Y("something has disconnected",e),e instanceof WindowClient&&ie.has(e.id)?(ie.delete(e.id),Y("window disconnected, left",ie.size),ie.size||(Y.warn("no windows left"),Q&&(ne.detachPort(Q),Q=void 0),re())):Y.warn("it is not a window")})),"undefined"!=typeof SharedWorkerGlobalScope?h.Z.addEventListener("connect",(e=>o(e.source,e.source))):"undefined"!=typeof ServiceWorkerGlobalScope?o(h.Z,null):o(h.Z,h.Z)}(ne);const se=e=>{if(!A.IS_SAFARI&&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 t=this,n=void 0,r=function*(){try{const t=yield c(i.caches.open(s)),n=yield c(t.match(e.request,{ignoreVary:!0}));if(n&&a(n))return n;const o={Vary:"*"};let r=yield fetch(e.request,{headers:o});if(a(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}),a(r)&&t.put(e.request,r.clone())}return r}catch(t){return fetch(e.request)}},new((o=void 0)||(o=Promise))((function(e,i){function s(e){try{c(r.next(e))}catch(e){i(e)}}function a(e){try{c(r.throw(e))}catch(e){i(e)}}function c(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(s,a)}c((r=r.apply(t,n||[])).next())}));var t,n,o,r}(e));try{const[t,n]=e.request.url.split("/").slice(-2);switch(t){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=P.get(o);e.respondWith(Promise.race([(45e3,new Promise((e=>{setTimeout((()=>{e(new Response("",{status:408,statusText:"Request timed out."}))}),45e3)}))),r.requestRange(n)]))}(e,n);break;case"download":oe(e,n);break;case"share":J(e);break;case"ping":e.respondWith(new Response("pong"))}}catch(t){Y.error("fetch error",t),e.respondWith(new Response("",{status:500,statusText:"Internal Server Error",headers:{"Cache-Control":"no-cache"}}))}},ae=()=>{H.onfetch=se};H.addEventListener("install",(e=>{Y("installing"),e.waitUntil(H.skipWaiting().then((()=>Y("skipped waiting"))))})),H.addEventListener("activate",(e=>{Y("activating",H),e.waitUntil(H.caches.delete(s).then((()=>Y("cleared assets cache")))),e.waitUntil(H.clients.claim().then((()=>Y("claimed clients"))))})),H.onoffline=H.ononline=ae,ae()}},o={};function r(e){var t=o[e];if(void 0!==t)return t.exports;var i=o[e]={exports:{}};return n[e](i,i.exports,r),i.exports}r.m=n,r.x=()=>{var e=r.O(void 0,[85],(()=>r(6350)));return r.O(e)},e=[],r.O=(t,n,o,i)=>{if(!n){var s=1/0;for(u=0;u=i)&&Object.keys(r.O).every((e=>r.O[e](n[c])))?n.splice(c--,1):(a=!1,i0&&e[u-1][2]>i;u--)e[u]=e[u-1];e[u]=[n,o,i]},r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((t,n)=>(r.f[n](e,t),t)),[])),r.u=e=>e+".887945ef5f43bc205112.bundle.js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e;r.g.importScripts&&(e=r.g.location+"");var t=r.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var n=t.getElementsByTagName("script");n.length&&(e=n[n.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),r.p=e})(),(()=>{if(void 0!==r){var e=r.u,t=r.e,n={},o={};r.u=function(t){return e(t)+(n.hasOwnProperty(t)?"?"+n[t]:"")},r.e=function(i){return t(i).catch((function(t){var s=o.hasOwnProperty(i)?o[i]:999999;if(s<1){var a=e(i);throw t.message="Loading chunk "+i+" failed after 999999 retries.\n("+a+")",t.request=a,t}return new Promise((function(e){setTimeout((function(){var t=Date.now();n[i]=t,o[i]=s-1,e(r.e(i))}),3e3)}))}))}}})(),(()=>{var e={670:1};r.f.i=(t,n)=>{e[t]||importScripts(r.p+r.u(t))};var t=this.webpackChunktweb=this.webpackChunktweb||[],n=t.push.bind(t);t.push=t=>{var[o,i,s]=t;for(var a in i)r.o(i,a)&&(r.m[a]=i[a]);for(s&&s(r);o.length;)e[o.pop()]=1;n(t)}})(),t=r.x,r.x=()=>r.e(85).then(t),r.x()})(); -//# sourceMappingURL=sw.a575e0dcdf92b2ccb0f9.chunk.js.map \ No newline at end of file +//# sourceMappingURL=sw.c55ec44ab819870d4ac4.chunk.js.map \ No newline at end of file diff --git a/public/sw.a575e0dcdf92b2ccb0f9.chunk.js.map b/public/sw.c55ec44ab819870d4ac4.chunk.js.map similarity index 99% rename from public/sw.a575e0dcdf92b2ccb0f9.chunk.js.map rename to public/sw.c55ec44ab819870d4ac4.chunk.js.map index bb54b76e..ddaf1335 100644 --- a/public/sw.a575e0dcdf92b2ccb0f9.chunk.js.map +++ b/public/sw.c55ec44ab819870d4ac4.chunk.js.map @@ -1 +1 @@ -{"version":3,"file":"sw.a575e0dcdf92b2ccb0f9.chunk.js","mappings":"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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/startup chunk dependencies","webpack://tweb/./src/config/debug.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/helpers/context.ts","webpack://tweb/./src/lib/logger.ts","webpack://tweb/./src/helpers/schedulers/pause.ts","webpack://tweb/./src/lib/serviceWorker/cache.ts","webpack://tweb/./src/helpers/noop.ts","webpack://tweb/./src/helpers/cancellablePromise.ts","webpack://tweb/./src/helpers/blob/blobConstruct.ts","webpack://tweb/./src/helpers/blob/blobSafeMimeType.ts","webpack://tweb/./src/lib/files/memoryWriter.ts","webpack://tweb/./src/lib/files/cacheStorage.ts","webpack://tweb/./src/lib/serviceWorker/stream.ts","webpack://tweb/./src/helpers/schedulers/debounce.ts","webpack://tweb/./src/helpers/blob/readBlobAsUint8Array.ts","webpack://tweb/./src/helpers/blob/readBlobAsArrayBuffer.ts","webpack://tweb/./src/helpers/blob/readBlobAs.ts","webpack://tweb/./src/helpers/object/deepEqual.ts","webpack://tweb/./src/lib/files/idb.ts","webpack://tweb/./src/helpers/object/safeAssign.ts","webpack://tweb/./src/lib/serviceWorker/push.ts","webpack://tweb/./src/config/databases/state.ts","webpack://tweb/./src/config/notifications.ts","webpack://tweb/./src/lib/serviceWorker/serviceMessagePort.ts","webpack://tweb/./src/lib/serviceWorker/download.ts","webpack://tweb/./src/lib/serviceWorker/share.ts","webpack://tweb/./src/lib/serviceWorker/index.service.ts","webpack://tweb/./src/helpers/listenMessagePort.ts","webpack://tweb/./src/lib/serviceWorker/timeout.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/importScripts chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn __webpack_require__.e(85).then(next);\n};","/*\n * 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 './modes';\n\nexport const IS_BETA = process.env.NODE_ENV !== 'production';\nexport const DEBUG = (IS_BETA || Modes.debug)/* && false */;\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\nexport default DEBUG;\n\n// let m = DEBUG;\n/* if(!DEBUG) {\n ctx.sandpitTurtle = () => {\n //if(!m) {\n for(let i in MOUNT_CLASS_TO) {\n ctx[i] = MOUNT_CLASS_TO[i];\n }\n //m = true;\n //}\n\n //DEBUG = !DEBUG;\n };\n} */\n\n/* export const superDebug = (object: any, key: string) => {\n var d = object[key];\n var beforeStr = '', afterStr = '';\n for(var r of d) {\n beforeStr += r.before.hex + '\\n';\n afterStr += r.after.hex + '\\n';\n }\n\n beforeStr = beforeStr.trim();\n afterStr = afterStr.trim();\n //var beforeStr = d.map((r) => r.before.hex).join('\\n');\n //var afterStr = d.map((r) => r.after.hex).join('\\n');\n\n var dada = (name: string, str: string) => {\n var a = document.createElement('a');\n a.target = '_blank';\n a.download = name + '.txt';\n a.href = URL.createObjectURL(new Blob([str], {\n type: 'text/plain'\n }));\n document.body.append(a);\n a.click();\n };\n\n dada(key + '_' + 'before', beforeStr);\n dada(key + '_' + 'after', afterStr);\n}\n\nMOUNT_CLASS_TO.superDebug = superDebug; */\n","/*\n * 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 './ctx';\n\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\n\n// https://stackoverflow.com/a/58065241\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\n !(ctx as any).MSStream;\n\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 */;\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\n\nexport const IS_MOBILE = (navigator.maxTouchPoints === undefined || 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;\n","/*\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// ะฒ SW ะผะพะถะตั‚ ะฑั‹ั‚ัŒ ัั€ะฐะทัƒ ะดะฒะต ะฟะตั€ะตะผะตะฝะฝั‹ั… TRUE\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\n\nexport const getWindowClients = () => {\n return (self as any as ServiceWorkerGlobalScope)\n .clients\n .matchAll({includeUncontrolled: false, type: 'window'});\n};\n\nexport const getLastWindowClient = () => getWindowClients().then((windowClients) => windowClients.slice(-1)[0]);\n\nconst postMessage = (listener: WindowClient | DedicatedWorkerGlobalScope, ...args: any[]) => {\n try {\n // @ts-ignore\n listener.postMessage(...args);\n } catch(err) {\n console.error('[worker] postMessage error:', err, args);\n }\n};\n\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\n getWindowClients().then((listeners) => {\n if(!listeners.length) {\n // console.trace('no listeners?', self, listeners);\n return;\n }\n\n listeners.slice(all ? 0 : -1).forEach((listener) => {\n postMessage(listener, ...args);\n });\n });\n};\n\nconst notifyWorker = (...args: any[]) => {\n postMessage(self as any as DedicatedWorkerGlobalScope, ...args);\n};\n\nconst noop = () => {};\n\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\n","/*\n * 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';\nimport dT from '../helpers/dT';\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 IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\n// let getCallerFunctionNameFromLine: (line: string) => string;\n// if(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;\n// const LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\n// function 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 group(...args: any[]): void;\n groupCollapsed(...args: any[]): void;\n groupEnd(...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' */ | 'group' | 'groupCollapsed' | 'groupEnd', 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 ['group', LogTypes.Log],\n ['groupCollapsed', LogTypes.Log],\n ['groupEnd', 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 const 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","export default function pause(ms: number) {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\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 pause from '../../helpers/schedulers/pause';\n\nconst ctx = self as any as ServiceWorkerGlobalScope;\nexport const CACHE_ASSETS_NAME = 'cachedAssets';\n\nfunction isCorrectResponse(response: Response) {\n return response.ok && response.status === 200;\n}\n\nfunction timeoutRace>(promise: T) {\n return Promise.race([\n promise,\n pause(10000).then(() => Promise.reject())\n ]);\n}\n\nexport async function requestCache(event: FetchEvent) {\n try {\n // const cache = await ctx.caches.open(CACHE_ASSETS_NAME);\n const cache = await timeoutRace(ctx.caches.open(CACHE_ASSETS_NAME));\n const file = await timeoutRace(cache.match(event.request, {ignoreVary: true}));\n\n if(file && isCorrectResponse(file)) {\n return file;\n }\n\n const headers: HeadersInit = {'Vary': '*'};\n let response = await fetch(event.request, {headers});\n if(isCorrectResponse(response)) {\n cache.put(event.request, response.clone());\n } else if(response.status === 304) { // possible fix for 304 in Safari\n const url = event.request.url.replace(/\\?.+$/, '') + '?' + (Math.random() * 100000 | 0);\n response = await fetch(url, {headers});\n if(isCorrectResponse(response)) {\n cache.put(event.request, response.clone());\n }\n }\n\n return response;\n } catch(err) {\n return fetch(event.request);\n }\n}\n","export default function noop() {}\n","/*\n * 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 './noop';\n\nexport interface CancellablePromise extends Promise {\n resolve?: (value: T) => void,\n reject?: (...args: any[]) => void,\n cancel?: (reason?: any) => void,\n\n notify?: (...args: any[]) => void,\n notifyAll?: (...args: any[]) => void,\n lastNotify?: any,\n listeners?: Array<(...args: any[]) => void>,\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\n\n isFulfilled?: boolean,\n isRejected?: boolean\n}\n\nexport default function deferredPromise() {\n const deferredHelper: any = {\n isFulfilled: false,\n isRejected: false,\n\n notify: () => {},\n notifyAll: (...args: any[]) => {\n deferredHelper.lastNotify = args;\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\n },\n\n listeners: [],\n addNotifyListener: (callback: (...args: any[]) => void) => {\n if(deferredHelper.lastNotify) {\n callback(...deferredHelper.lastNotify);\n }\n\n deferredHelper.listeners.push(callback);\n }\n };\n\n const deferred: CancellablePromise = new Promise((resolve, reject) => {\n deferredHelper.resolve = (value: T) => {\n if(deferred.isFulfilled || deferred.isRejected) return;\n\n deferred.isFulfilled = true;\n resolve(value);\n };\n\n deferredHelper.reject = (...args: any[]) => {\n if(deferred.isRejected || deferred.isFulfilled) return;\n\n deferred.isRejected = true;\n reject(...args);\n };\n });\n\n // @ts-ignore\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\n const n = deferredPromise>();\n\n }; */\n\n deferred.catch(noop).finally(() => {\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\n deferred.listeners.length = 0;\n\n if(deferred.cancel) {\n deferred.cancel = noop;\n }\n });\n\n Object.assign(deferred, deferredHelper);\n\n return deferred;\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 blobSafeMimeType from './blobSafeMimeType';\n\nexport default function blobConstruct(blobParts: Array | T, mimeType: string = ''): Blob {\n if(!Array.isArray(blobParts)) {\n blobParts = [blobParts];\n }\n\n const safeMimeType = blobSafeMimeType(mimeType);\n const blob = new Blob(blobParts, {type: safeMimeType});\n return blob;\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// https://www.iana.org/assignments/media-types/media-types.xhtml\nexport default function blobSafeMimeType(mimeType: string) {\n if([\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/svg+xml',\n 'image/webp',\n 'image/bmp',\n 'video/mp4',\n 'video/webm',\n 'video/quicktime',\n 'audio/ogg',\n 'audio/mpeg',\n 'audio/mp4',\n 'audio/wav', // though it is not in list\n 'application/json',\n 'application/pdf'\n ].indexOf(mimeType) === -1) {\n return 'application/octet-stream';\n }\n\n return mimeType;\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 blobConstruct from '../../helpers/blob/blobConstruct';\nimport StreamWriter from './streamWriter';\n\nexport default class MemoryWriter implements StreamWriter {\n private bytes: Uint8Array;\n\n constructor(\n private mimeType: string,\n private size: number,\n private saveFileCallback?: (blob: Blob) => Promise\n ) {\n this.bytes = new Uint8Array(size);\n }\n\n public async write(part: Uint8Array, offset: number) {\n // sometimes file size can be bigger than the prov\n const endOffset = offset + part.byteLength;\n if(endOffset > this.bytes.byteLength) {\n const newBytes = new Uint8Array(endOffset);\n newBytes.set(this.bytes, 0);\n this.bytes = newBytes;\n }\n\n this.bytes.set(part, offset);\n };\n\n public truncate() {\n this.bytes = new Uint8Array();\n }\n\n public trim(size: number) {\n this.bytes = this.bytes.slice(0, size);\n }\n\n public finalize(saveToStorage = true) {\n const blob = blobConstruct(this.bytes, this.mimeType);\n\n if(saveToStorage && this.saveFileCallback) {\n this.saveFileCallback(blob);\n }\n\n return blob;\n }\n\n public getParts() {\n return this.bytes;\n }\n\n public replaceParts(parts: Uint8Array) {\n this.bytes = parts;\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 Modes from '../../config/modes';\nimport blobConstruct from '../../helpers/blob/blobConstruct';\nimport MemoryWriter from './memoryWriter';\nimport FileManager from './memoryWriter';\nimport FileStorage from './fileStorage';\nimport makeError from '../../helpers/makeError';\nimport deferredPromise from '../../helpers/cancellablePromise';\n\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\n\nexport default class CacheStorageController implements FileStorage {\n private static STORAGES: CacheStorageController[] = [];\n private openDbPromise: Promise;\n\n private useStorage = true;\n\n // private log: ReturnType = logger('CS');\n\n constructor(private dbName: CacheStorageDbName) {\n if(Modes.test) {\n this.dbName += '_test';\n }\n\n if(CacheStorageController.STORAGES.length) {\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\n }\n\n this.openDatabase();\n CacheStorageController.STORAGES.push(this);\n }\n\n private openDatabase(): Promise {\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\n }\n\n public delete(entryName: string) {\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\n }\n\n public deleteAll() {\n return caches.delete(this.dbName);\n }\n\n public get(entryName: string) {\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\n }\n\n public save(entryName: string, response: Response) {\n // return new Promise((resolve) => {}); // DEBUG\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\n }\n\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\n /* if(method === 'blob') {\n return Promise.reject();\n } */\n\n // const str = `get fileName: ${fileName}`;\n // console.time(str);\n return this.get(fileName).then((response) => {\n if(!response) {\n // console.warn('getFile:', response, fileName);\n throw makeError('NO_ENTRY_FOUND');\n }\n\n const promise = response[method]();\n // promise.then(() => {\n // console.timeEnd(str);\n // });\n return promise;\n });\n }\n\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\n // return Promise.resolve(blobConstruct([blob]));\n if(!(blob instanceof Blob)) {\n blob = blobConstruct(blob);\n }\n\n const response = new Response(blob, {\n headers: {\n 'Content-Length': '' + blob.size\n }\n });\n\n return this.save(fileName, response).then(() => blob as Blob);\n }\n\n public timeoutOperation(callback: (cache: Cache) => Promise) {\n if(!this.useStorage) {\n return Promise.reject(makeError('STORAGE_OFFLINE'));\n }\n\n return new Promise(async(resolve, reject) => {\n let rejected = false;\n const timeout = setTimeout(() => {\n reject();\n // console.warn('CACHESTORAGE TIMEOUT');\n rejected = true;\n }, 15e3);\n\n try {\n const cache = await this.openDatabase();\n if(!cache) {\n this.useStorage = false;\n this.openDbPromise = undefined;\n throw 'no cache?';\n }\n\n const res = await callback(cache);\n\n if(rejected) return;\n resolve(res);\n } catch(err) {\n reject(err);\n }\n\n clearTimeout(timeout);\n });\n }\n\n public prepareWriting(fileName: string, fileSize: number, mimeType: string) {\n return {\n deferred: deferredPromise(),\n getWriter: () => {\n const writer = new MemoryWriter(mimeType, fileSize, (blob) => {\n return this.saveFile(fileName, blob).catch(() => blob);\n });\n\n return writer;\n }\n };\n }\n\n public static toggleStorage(enabled: boolean, clearWrite: boolean) {\n return Promise.all(this.STORAGES.map((storage) => {\n storage.useStorage = enabled;\n\n if(!clearWrite) {\n return;\n }\n\n if(!enabled) {\n return storage.deleteAll();\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 readBlobAsUint8Array from '../../helpers/blob/readBlobAsUint8Array';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport debounce from '../../helpers/schedulers/debounce';\nimport {InputFileLocation} from '../../layer';\nimport CacheStorageController from '../files/cacheStorage';\nimport {DownloadOptions, MyUploadFile} from '../mtproto/apiFileManager';\nimport {getMtprotoMessagePort, log, serviceMessagePort} from './index.service';\nimport {ServiceRequestFilePartTaskPayload} from './serviceMessagePort';\nimport timeout from './timeout';\n\nconst deferredPromises: Map}> = new Map();\nconst cacheStorage = new CacheStorageController('cachedStreamChunks');\nconst CHUNK_TTL = 86400;\nconst CHUNK_CACHED_TIME_HEADER = 'Time-Cached';\nconst USE_CACHE = true;\n\nconst clearOldChunks = () => {\n return cacheStorage.timeoutOperation((cache) => {\n return cache.keys().then((requests) => {\n const filtered: Map = new Map();\n const timestamp = Date.now() / 1000 | 0;\n for(const request of requests) {\n const match = request.url.match(/\\/(\\d+?)\\?/);\n if(match && !filtered.has(match[1])) {\n filtered.set(match[1], request);\n }\n }\n\n const promises: Promise[] = [];\n for(const [id, request] of filtered) {\n const promise = cache.match(request).then((response) => {\n if((+response.headers.get(CHUNK_CACHED_TIME_HEADER) + CHUNK_TTL) <= timestamp) {\n log('will delete stream chunk:', id);\n return cache.delete(request, {ignoreSearch: true, ignoreVary: true});\n }\n });\n\n promises.push(promise);\n }\n\n return Promise.all(promises);\n });\n });\n};\n\nsetInterval(clearOldChunks, 1800e3);\nsetInterval(() => {\n const mtprotoMessagePort = getMtprotoMessagePort();\n for(const [messagePort, promises] of deferredPromises) {\n if(messagePort !== mtprotoMessagePort) {\n for(const taskId in promises) {\n const promise = promises[taskId];\n promise.reject();\n }\n\n deferredPromises.delete(messagePort);\n }\n }\n}, 120e3);\n\ntype StreamRange = [number, number];\ntype StreamId = DocId;\nconst streams: Map = new Map();\nclass Stream {\n private destroyDebounced: () => void;\n private id: StreamId;\n private limitPart: number;\n private loadedOffsets: Set = new Set();\n\n constructor(private info: DownloadOptions) {\n this.id = Stream.getId(info);\n streams.set(this.id, this);\n\n // ! ะตัะปะธ ะณั€ัƒะทะธั‚ัŒ ะพั‡ะตะฝัŒ ะฑะพะปัŒัˆะพะต ะฒะธะดะตะพ ั‡ะฐะฝะบะฐะผะธ ะฟะพ 512ะšะฑ ะฒ ะผะพะฑะธะปัŒะฝะพะผ Safari, ั‚ะพ ัั‚ั€ะธะผ ะฝะต ะทะฐะฟัƒัั‚ะธั‚ัั\n this.limitPart = info.size > (75 * 1024 * 1024) ? STREAM_CHUNK_UPPER_LIMIT : STREAM_CHUNK_MIDDLE_LIMIT;\n this.destroyDebounced = debounce(this.destroy, 150000, false, true);\n }\n\n private destroy = () => {\n streams.delete(this.id);\n };\n\n private async requestFilePartFromWorker(alignedOffset: number, limit: number, fromPreload = false) {\n const payload: ServiceRequestFilePartTaskPayload = {\n docId: this.id,\n dcId: this.info.dcId,\n offset: alignedOffset,\n limit\n };\n\n const taskId = JSON.stringify(payload);\n\n const mtprotoMessagePort = getMtprotoMessagePort();\n let promises = deferredPromises.get(mtprotoMessagePort);\n if(!promises) {\n deferredPromises.set(mtprotoMessagePort, promises = {});\n }\n\n let deferred = promises[taskId];\n if(deferred) {\n return deferred.then((uploadFile) => uploadFile.bytes);\n }\n\n this.loadedOffsets.add(alignedOffset);\n\n deferred = promises[taskId] = deferredPromise();\n\n serviceMessagePort.invoke('requestFilePart', payload, undefined, mtprotoMessagePort)\n .then(deferred.resolve, deferred.reject).finally(() => {\n if(promises[taskId] === deferred) {\n delete promises[taskId];\n\n if(!Object.keys(promises).length) {\n deferredPromises.delete(mtprotoMessagePort);\n }\n }\n });\n\n const bytesPromise = deferred.then((uploadFile) => uploadFile.bytes);\n\n if(USE_CACHE) {\n this.saveChunkToCache(bytesPromise, alignedOffset, limit);\n !fromPreload && this.preloadChunks(alignedOffset, alignedOffset + (this.limitPart * 15));\n }\n\n return bytesPromise;\n }\n\n private requestFilePartFromCache(alignedOffset: number, limit: number, fromPreload?: boolean) {\n if(!USE_CACHE) {\n return Promise.resolve();\n }\n\n const key = this.getChunkKey(alignedOffset, limit);\n return cacheStorage.getFile(key).then((blob: Blob) => {\n return fromPreload ? new Uint8Array() : readBlobAsUint8Array(blob);\n }, (error: ApiError) => {\n if(error.type === 'NO_ENTRY_FOUND') {\n return;\n }\n });\n }\n\n private requestFilePart(alignedOffset: number, limit: number, fromPreload?: boolean) {\n return this.requestFilePartFromCache(alignedOffset, limit, fromPreload).then((bytes) => {\n return bytes || this.requestFilePartFromWorker(alignedOffset, limit, fromPreload);\n });\n }\n\n private saveChunkToCache(deferred: Promise, alignedOffset: number, limit: number) {\n return deferred.then((bytes) => {\n const key = this.getChunkKey(alignedOffset, limit);\n const response = new Response(bytes, {\n headers: {\n 'Content-Length': '' + bytes.length,\n 'Content-Type': 'application/octet-stream',\n [CHUNK_CACHED_TIME_HEADER]: '' + (Date.now() / 1000 | 0)\n }\n });\n\n return cacheStorage.save(key, response);\n });\n }\n\n private preloadChunk(offset: number) {\n if(this.loadedOffsets.has(offset)) {\n return;\n }\n\n this.loadedOffsets.add(offset);\n this.requestFilePart(offset, this.limitPart, true);\n }\n\n private preloadChunks(offset: number, end: number) {\n if(end > this.info.size) {\n end = this.info.size;\n }\n\n if(!offset) { // load last chunk for bounds\n this.preloadChunk(alignOffset(offset, this.limitPart));\n } else { // don't preload next chunks before the start\n for(; offset < end; offset += this.limitPart) {\n this.preloadChunk(offset);\n }\n }\n }\n\n public requestRange(range: StreamRange) {\n this.destroyDebounced();\n\n const possibleResponse = responseForSafariFirstRange(range, this.info.mimeType, this.info.size);\n if(possibleResponse) {\n return possibleResponse;\n }\n\n let [offset, end] = range;\n\n /* if(info.size > limitPart && isSafari && offset === limitPart) {\n //end = info.size - 1;\n //offset = info.size - 1 - limitPart;\n offset = info.size - (info.size % limitPart);\n } */\n\n const limit = end && end < this.limitPart ? alignLimit(end - offset + 1) : this.limitPart;\n const alignedOffset = alignOffset(offset, limit);\n\n if(!end) {\n end = Math.min(offset + limit, this.info.size - 1);\n }\n\n return this.requestFilePart(alignedOffset, limit).then((ab) => {\n // log.debug('[stream] requestFilePart result:', result);\n\n // if(isSafari) {\n if(offset !== alignedOffset || end !== (alignedOffset + limit)) {\n ab = ab.slice(offset - alignedOffset, end - alignedOffset + 1);\n }\n\n const headers: Record = {\n 'Accept-Ranges': 'bytes',\n 'Content-Range': `bytes ${offset}-${offset + ab.byteLength - 1}/${this.info.size || '*'}`,\n 'Content-Length': `${ab.byteLength}`\n };\n\n if(this.info.mimeType) {\n headers['Content-Type'] = this.info.mimeType;\n }\n\n // simulate slow connection\n // setTimeout(() => {\n return new Response(ab, {\n status: 206,\n statusText: 'Partial Content',\n headers\n });\n // }, 2.5e3);\n });\n }\n\n private getChunkKey(alignedOffset: number, limit: number) {\n return this.id + '?offset=' + alignedOffset + '&limit=' + limit;\n }\n\n public static get(info: DownloadOptions) {\n return streams.get(this.getId(info)) ?? new Stream(info);\n }\n\n private static getId(info: DownloadOptions) {\n return (info.location as InputFileLocation.inputDocumentFileLocation).id;\n }\n}\n\nexport default function onStreamFetch(event: FetchEvent, params: string) {\n const range = parseRange(event.request.headers.get('Range'));\n const info: DownloadOptions = JSON.parse(decodeURIComponent(params));\n const stream = Stream.get(info);\n\n // log.debug('[stream]', url, offset, end);\n\n event.respondWith(Promise.race([\n timeout(45 * 1000),\n stream.requestRange(range)\n ]));\n}\n\nfunction responseForSafariFirstRange(range: StreamRange, mimeType: string, size: number): Response {\n if(range[0] === 0 && range[1] === 1) {\n return new Response(new Uint8Array(2).buffer, {\n status: 206,\n statusText: 'Partial Content',\n headers: {\n 'Accept-Ranges': 'bytes',\n 'Content-Range': `bytes 0-1/${size || '*'}`,\n 'Content-Length': '2',\n 'Content-Type': mimeType || 'video/mp4'\n }\n });\n }\n\n return null;\n}\n\n/* const STREAM_CHUNK_UPPER_LIMIT = 256 * 1024;\nconst SMALLEST_CHUNK_LIMIT = 256 * 4; */\n/* const STREAM_CHUNK_UPPER_LIMIT = 1024 * 1024;\nconst SMALLEST_CHUNK_LIMIT = 1024 * 4; */\nconst STREAM_CHUNK_MIDDLE_LIMIT = 512 * 1024;\nconst STREAM_CHUNK_UPPER_LIMIT = 1024 * 1024;\nconst SMALLEST_CHUNK_LIMIT = 512 * 4;\n\nfunction parseRange(header: string): StreamRange {\n if(!header) return [0, 0];\n const [, chunks] = header.split('=');\n const ranges = chunks.split(', ');\n const [offset, end] = ranges[0].split('-');\n\n return [+offset, +end || 0];\n}\n\nfunction alignOffset(offset: number, base = SMALLEST_CHUNK_LIMIT) {\n return offset - (offset % base);\n}\n\nfunction alignLimit(limit: number) {\n return 2 ** Math.ceil(Math.log(limit) / Math.log(2));\n}\n","// * Jolly Cobra's schedulers\n\nimport ctx from '../../environment/ctx';\nimport {AnyFunction, Awaited} from '../../types';\nimport noop from '../noop';\n\nexport type DebounceReturnType = {\n (...args: Parameters): Promise>>;\n clearTimeout(): void;\n isDebounced(): boolean;\n};\n\nexport default function debounce(\n fn: F,\n ms: number,\n shouldRunFirst = true,\n shouldRunLast = true\n): DebounceReturnType {\n let waitingTimeout: number;\n let waitingPromise: Promise>>, resolve: (result: any) => void, reject: () => void;\n let hadNewCall = false;\n\n const invoke = (args: Parameters) => {\n const _resolve = resolve, _reject = reject;\n try {\n const result = fn.apply(null, args);\n _resolve(result);\n } catch(err) {\n console.error('debounce error', err);\n // @ts-ignore\n _reject(err);\n }\n };\n\n const debounce = (...args: Parameters) => {\n if(!waitingPromise) waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\n\n if(waitingTimeout) {\n clearTimeout(waitingTimeout);\n hadNewCall = true;\n reject();\n waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\n } else if(shouldRunFirst) {\n invoke(args);\n hadNewCall = false;\n }\n\n const _waitingTimeout = ctx.setTimeout(() => {\n // will run if should run last or first but with new call\n if(shouldRunLast && (!shouldRunFirst || hadNewCall)) {\n invoke(args);\n }\n\n // if debounce was called during invoking\n if(waitingTimeout === _waitingTimeout) {\n waitingTimeout = waitingPromise = resolve = reject = undefined;\n hadNewCall = false;\n }\n }, ms);\n\n waitingTimeout = _waitingTimeout;\n waitingPromise.catch(noop);\n return waitingPromise;\n };\n\n debounce.clearTimeout = () => {\n if(waitingTimeout) {\n ctx.clearTimeout(waitingTimeout);\n reject();\n waitingTimeout = waitingPromise = resolve = reject = undefined;\n hadNewCall = false;\n }\n };\n\n debounce.isDebounced = () => !!waitingTimeout;\n\n return debounce;\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 readBlobAsArrayBuffer from './readBlobAsArrayBuffer';\n\nexport default function readBlobAsUint8Array(blob: Blob) {\n return readBlobAsArrayBuffer(blob).then((buffer) => new Uint8Array(buffer));\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 readBlobAs from './readBlobAs';\n\nexport default function readBlobAsArrayBuffer(blob: Blob) {\n return readBlobAs(blob, 'readAsArrayBuffer');\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 { IS_WEB_WORKER } from \"../context\";\n\n// const id = IS_WEB_WORKER ? Math.random() * 0x1000 | 0 : 0;\nexport default function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\n // const perf = performance.now();\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (e) => {\n // console.log(`readBlobAs [${id}] ${method} time ${performance.now() - perf}`);\n resolve(e.target.result);\n });\n reader[method](blob);\n });\n}\n","export default function deepEqual(x: any, y: any): boolean {\n const ok = Object.keys, tx = typeof x, ty = typeof y;\n return x && y && tx === 'object' && tx === ty ? (\n ok(x).length === ok(y).length &&\n ok(x).every((key) => deepEqual(x[key], y[key]))\n ) : (x === y);\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 {Database} from '../../config/databases';\nimport Modes from '../../config/modes';\nimport makeError from '../../helpers/makeError';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {logger} from '../logger';\n\n/**\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\n */\nexport type IDBIndex = {\n indexName: string,\n keyPath: string,\n objectParameters: IDBIndexParameters\n};\n\nexport type IDBStore = {\n name: string,\n indexes?: IDBIndex[]\n};\n\nexport type IDBOptions = {\n name?: string,\n storeName: string,\n stores?: IDBStore[],\n version?: number\n};\n\nconst DEBUG = false;\n\nexport class IDB {\n private static INSTANCES: IDB[] = [];\n private openDbPromise: Promise;\n private db: IDBDatabase;\n private storageIsAvailable: boolean;\n private log: ReturnType;\n private name: string;\n private version: number;\n private stores: IDBStore[];\n\n constructor(db: Database) {\n safeAssign(this, db);\n\n if(Modes.test) {\n this.name += '_test';\n }\n\n this.storageIsAvailable = true;\n this.log = logger(['IDB', db.name].join('-'));\n this.log('constructor');\n\n this.openDatabase(true);\n\n IDB.INSTANCES.push(this);\n }\n\n public isAvailable() {\n return this.storageIsAvailable;\n }\n\n public openDatabase(createNew = false): Promise {\n if(this.openDbPromise && !createNew) {\n return this.openDbPromise;\n }\n\n const createIndexes = (os: IDBObjectStore, store: IDBStore) => {\n const indexNames = Array.from(os.indexNames);\n for(const indexName of indexNames) {\n os.deleteIndex(indexName);\n }\n\n if(!store.indexes?.length) {\n return;\n }\n\n for(const index of store.indexes) {\n if(os.indexNames.contains(index.indexName)) {\n continue;\n }\n\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\n }\n };\n\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\n const os = db.createObjectStore(store.name);\n createIndexes(os, store);\n };\n\n try {\n var request = indexedDB.open(this.name, this.version);\n\n if(!request) {\n return Promise.reject();\n }\n } catch(error) {\n this.log.error('error opening db', (error as Error).message);\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n let finished = false;\n setTimeout(() => {\n if(!finished) {\n request.onerror(makeError('IDB_CREATE_TIMEOUT') as Event);\n }\n }, 3000);\n\n return this.openDbPromise = new Promise((resolve, reject) => {\n request.onsuccess = (event) => {\n finished = true;\n const db = request.result;\n let calledNew = false;\n\n this.log('Opened');\n\n db.onerror = (error) => {\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', error);\n reject(error);\n };\n\n db.onclose = (e) => {\n this.log.error('closed:', e);\n !calledNew && this.openDatabase();\n };\n\n db.onabort = (e) => {\n this.log.error('abort:', e);\n const transaction = e.target as IDBTransaction;\n\n this.openDatabase(calledNew = true);\n\n if(transaction.onerror) {\n transaction.onerror(e);\n }\n\n db.close();\n };\n\n db.onversionchange = (e) => {\n this.log.error('onversionchange, lol?');\n };\n\n resolve(this.db = db);\n };\n\n request.onerror = (event) => {\n finished = true;\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', event);\n reject(event);\n };\n\n request.onupgradeneeded = (event) => {\n finished = true;\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\n\n const target = event.target as IDBOpenDBRequest;\n const db = target.result;\n this.stores.forEach((store) => {\n /* if(db.objectStoreNames.contains(store.name)) {\n //if(event.oldVersion === 1) {\n db.deleteObjectStore(store.name);\n //}\n } */\n\n if(!db.objectStoreNames.contains(store.name)) {\n createObjectStore(db, store);\n } else {\n const txn = target.transaction;\n const os = txn.objectStore(store.name);\n createIndexes(os, store);\n }\n });\n };\n });\n }\n\n public static create>(db: T) {\n return this.INSTANCES.find((instance) => instance.name === db.name) ?? new IDB(db);\n }\n\n public static closeDatabases(preserve?: IDB) {\n this.INSTANCES.forEach((storage) => {\n if(preserve && preserve === storage) {\n return;\n }\n\n const db = storage.db;\n if(db) {\n db.onclose = () => {};\n db.close();\n }\n });\n }\n}\n\nexport default class IDBStorage, StoreName extends string = T['stores'][0]['name']> {\n private log: ReturnType;\n private storeName: T['stores'][0]['name'];\n private idb: IDB;\n\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\n this.storeName = storeName;\n this.log = logger(['IDB', db.name, storeName].join('-'));\n this.idb = IDB.create(db);\n }\n\n /**\n * ! WARNING ! function requires at least one opened connection\n */\n /* public static clearObjectStores() {\n const storage = this.STORAGES[0];\n this.closeDatabases(storage);\n\n const names = Array.from(storage.db.objectStoreNames);\n const promises = names.map((name) => storage.clear(name));\n return Promise.all(promises);\n } */\n\n /* public static deleteDatabase() {\n this.closeDatabases();\n\n const storages = this.STORAGES;\n const dbNames = Array.from(new Set(storages.map((storage) => storage.name)));\n const promises = dbNames.map((dbName) => {\n return new Promise((resolve, reject) => {\n const deleteRequest = indexedDB.deleteDatabase(dbName);\n\n deleteRequest.onerror = () => {\n reject();\n };\n\n deleteRequest.onsuccess = () => {\n resolve();\n };\n });\n });\n\n return Promise.all(promises);\n } */\n\n public delete(entryName: string | string[], storeName?: StoreName): Promise {\n // return Promise.resolve();\n const isArray = Array.isArray(entryName);\n if(!isArray) {\n entryName = [].concat(entryName);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n const promises = (entryName as string[]).map((entryName) => objectStore.delete(entryName));\n return isArray ? promises : promises[0];\n }, DEBUG ? 'delete: ' + (entryName as string[]).join(', ') : '', storeName);\n }\n\n public clear(storeName?: StoreName): Promise {\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\n }\n\n public save(entryName: string | string[], value: any | any[], storeName?: StoreName) {\n // const handleError = (error: Error) => {\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\n // setTimeout(() => {\n // this.save(entryName, value);\n // }, 2e3);\n // } else {\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\n // }\n // };\n\n const isArray = Array.isArray(entryName);\n if(!isArray) {\n entryName = [].concat(entryName);\n value = [].concat(value);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n const promises = (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\n return isArray ? promises : promises[0];\n }, DEBUG ? 'save: ' + (entryName as string[]).join(', ') : '', storeName);\n }\n\n // public saveFile(fileName: string, blob: Blob | Uint8Array) {\n // //return Promise.resolve(blobConstruct([blob]));\n // if(!(blob instanceof Blob)) {\n // blob = blobConstruct(blob);\n // }\n\n // return this.save(fileName, blob);\n // }\n\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\n return Promise.reject();\n }\n\n if(!(blob instanceof Blob)) {\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\n return this.storagePutB64String(db, fileName, address).then(() => {\n return blob;\n });\n }\n\n try {\n var reader = new FileReader();\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n let promise = new Promise((resolve, reject) => {\n reader.onloadend = () => {\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\n resolve(blob);\n }, reject);\n }\n\n reader.onerror = reject;\n });\n\n\n try {\n reader.readAsDataURL(blob);\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n return promise;\n }\n\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\n try {\n var objectStore = db.transaction([this.storeName], 'readwrite')\n .objectStore(this.storeName);\n var request = objectStore.put(b64string, fileName);\n } catch(error) {\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n resolve();\n };\n\n request.onerror = reject;\n });\n }\n\n public getBlobSize(blob: any) {\n return blob.size || blob.byteLength || blob.length;\n } */\n\n public get(entryName: string[], storeName?: StoreName): Promise;\n public get(entryName: string, storeName?: StoreName): Promise;\n public get(entryName: string | string[], storeName?: StoreName): Promise | Promise {\n // return Promise.reject();\n\n const isArray = Array.isArray(entryName);\n if(!isArray) {\n if(!entryName) {\n return undefined;\n }\n\n entryName = [].concat(entryName);\n } else if(!entryName.length) {\n return Promise.resolve([]) as any;\n }\n\n return this.getObjectStore('readonly', (objectStore) => {\n const promises = (entryName as string[]).map((entryName) => objectStore.get(entryName));\n return isArray ? promises : promises[0];\n }, DEBUG ? 'get: ' + (entryName as string[]).join(', ') : '', storeName);\n }\n\n private getObjectStore(\n mode: IDBTransactionMode,\n callback: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[],\n log?: string,\n storeName = this.storeName\n ) {\n let perf: number;\n\n if(log) {\n perf = performance.now();\n this.log(log + ': start');\n }\n\n return this.idb.openDatabase().then((db) => {\n return new Promise((resolve, reject) => {\n /* if(mode === 'readwrite') {\n return;\n } */\n\n const transaction = db.transaction([storeName], mode);\n\n const onError = () => {\n clearTimeout(timeout);\n reject(transaction.error);\n };\n\n // let resolved = false;\n const onComplete = (/* what: string */) => {\n clearTimeout(timeout);\n\n if(log) {\n this.log(log + ': end', performance.now() - perf/* , what */);\n }\n\n // if(resolved) {\n // return;\n // }\n\n // resolved = true;\n const results = requests.map((r) => r.result);\n resolve(isArray ? results : results[0]);\n };\n\n transaction.onerror = onError;\n\n // * have to wait while clearing or setting something\n const waitForTransactionComplete = mode === 'readwrite';\n if(waitForTransactionComplete) {\n transaction.oncomplete = () => onComplete(/* 'transaction' */);\n }\n\n const timeout = setTimeout(() => {\n this.log.error('transaction not finished', transaction, log);\n }, 10000);\n\n /* transaction.addEventListener('abort', (e) => {\n //handleError();\n this.log.error('IndexedDB: transaction abort!', transaction.error);\n }); */\n\n const callbackResult = callback(transaction.objectStore(storeName));\n\n const isArray = Array.isArray(callbackResult);\n const requests: IDBRequest[] = isArray ? callbackResult : [].concat(callbackResult) as any;\n\n if(waitForTransactionComplete) {\n return;\n }\n\n const length = requests.length;\n let left = length;\n\n const onRequestFinished = () => {\n if(transaction.error) {\n return;\n }\n\n if(!--left) {\n onComplete(/* 'requests' */);\n }\n };\n\n for(let i = 0; i < length; ++i) {\n const request = requests[i];\n request.onerror = onError;\n request.onsuccess = onRequestFinished;\n }\n });\n });\n }\n\n public getAll(storeName?: StoreName): Promise {\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '', storeName);\n }\n\n /* public getAllKeys(): Promise> {\n console.time('getAllEntries');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.getAllKeys();\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var result = event.target.result;\n resolve(result);\n console.timeEnd('getAllEntries');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public isFileExists(fileName: string): Promise {\n console.time('isFileExists');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.openCursor(fileName);\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var cursor = event.target.result;\n resolve(!!cursor);\n console.timeEnd('isFileExists');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public getFileWriter(fileName: string, mimeType: string) {\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\n return this.saveFile(fileName, blob);\n });\n\n return Promise.resolve(fakeWriter);\n } */\n}\n","export default function safeAssign(object: T, fromObject: any) {\n if(fromObject) {\n for(const i in fromObject) {\n if(fromObject[i] !== undefined) {\n // @ts-ignore\n object[i] = fromObject[i];\n }\n }\n }\n\n return object;\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 {Database} from '../../config/databases';\nimport DATABASE_STATE from '../../config/databases/state';\nimport {NOTIFICATION_BADGE_PATH, NOTIFICATION_ICON_PATH} from '../../config/notifications';\nimport {IS_FIREFOX, IS_MOBILE} from '../../environment/userAgent';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport IDBStorage from '../files/idb';\nimport {log, serviceMessagePort} from './index.service';\nimport {ServicePushPingTaskPayload} from './serviceMessagePort';\n\nconst ctx = self as any as ServiceWorkerGlobalScope;\nconst defaultBaseUrl = location.protocol + '//' + location.hostname + location.pathname.split('/').slice(0, -1).join('/') + '/';\n\n// as in webPushApiManager.ts\nconst PING_PUSH_TIMEOUT = 10000 + 1500;\nlet lastPingTime = 0;\nlet localNotificationsAvailable = true;\n\nexport type PushNotificationObject = {\n loc_key: string,\n loc_args: string[],\n // user_id: number, // should be number\n custom: {\n channel_id?: string, // should be number\n chat_id?: string, // should be number\n from_id?: string, // should be number\n msg_id: string,\n peerId?: string, // should be number\n silent?: string // can be '1'\n },\n sound?: string,\n random_id: number,\n badge?: string, // should be number\n description: string,\n mute: string, // should be number\n title: string,\n message?: string,\n} & {\n action?: 'mute1d' | 'push_settings', // will be set before postMessage to main thread\n};\n\nclass SomethingGetter, Storage extends Record> {\n private cache: Partial = {};\n private storage: IDBStorage;\n\n constructor(\n db: T,\n storeName: typeof db['stores'][number]['name'],\n private defaults: {\n [Property in keyof Storage]: ((value: Storage[Property]) => Storage[Property]) | Storage[Property]\n }\n ) {\n this.storage = new IDBStorage(db, storeName);\n }\n\n private getDefault(key: T) {\n const callback = this.defaults[key];\n return typeof(callback) === 'function' ? callback() : callback;\n }\n\n public get(key: T) {\n if(this.cache.hasOwnProperty(key)) {\n return this.cache[key];\n }\n\n const promise = this.storage.get(key as string) as Promise;\n return promise.then((value) => value, () => undefined as Storage[T]).then((value) => {\n if(this.cache.hasOwnProperty(key)) {\n return this.cache[key];\n }\n\n value ??= this.getDefault(key);\n\n return this.cache[key] = value;\n });\n }\n\n public getCached(key: T) {\n const value = this.get(key);\n if(value instanceof Promise) {\n throw 'no property';\n }\n\n return value;\n }\n\n public async set(key: T, value: Storage[T]) {\n const cached = this.cache[key] ?? this.defaults[key];\n if(deepEqual(cached, value)) {\n return;\n }\n\n this.cache[key] = value;\n\n try {\n this.storage.save(key as string, value);\n } catch(err) {\n\n }\n }\n}\n\ntype PushStorage = {\n push_mute_until: number,\n push_lang: Partial\n push_settings: Partial\n};\n\nconst defaults: PushStorage = {\n push_mute_until: 0,\n push_lang: {\n push_message_nopreview: 'You have a new message',\n push_action_mute1d: 'Mute for 24H',\n push_action_settings: 'Settings'\n },\n push_settings: {}\n};\n\nconst getter = new SomethingGetter(DATABASE_STATE, 'session', defaults);\n\n// fill cache\nfor(const i in defaults) {\n getter.get(i as keyof PushStorage);\n}\n\nctx.addEventListener('push', (event) => {\n const obj: PushNotificationObject = event.data.json();\n log('push', {...obj});\n\n try {\n const [muteUntil, settings, lang] = [\n getter.getCached('push_mute_until'),\n getter.getCached('push_settings'),\n getter.getCached('push_lang')\n ];\n\n const nowTime = Date.now();\n if(\n userInvisibleIsSupported() &&\n muteUntil &&\n nowTime < muteUntil\n ) {\n throw `supress notification because mute for ${Math.ceil((muteUntil - nowTime) / 60000)} min`;\n }\n\n const hasActiveWindows = (Date.now() - lastPingTime) <= PING_PUSH_TIMEOUT && localNotificationsAvailable;\n if(hasActiveWindows) {\n throw 'supress notification because some instance is alive';\n }\n\n const notificationPromise = fireNotification(obj, settings, lang);\n event.waitUntil(notificationPromise);\n } catch(err) {\n log(err);\n\n const tag = 'fix';\n const notificationPromise = ctx.registration.showNotification('Telegram', {tag});\n\n notificationPromise.then(() => {\n closeAllNotifications(tag);\n });\n\n event.waitUntil(notificationPromise);\n }\n});\n\nctx.addEventListener('notificationclick', (event) => {\n const notification = event.notification;\n log('on notification click', notification);\n notification.close();\n\n const action = event.action as PushNotificationObject['action'];\n if(action === 'mute1d' && userInvisibleIsSupported()) {\n log('[SW] mute for 1d');\n getter.set('push_mute_until', Date.now() + 86400e3);\n return;\n }\n\n const data: PushNotificationObject = notification.data;\n if(!data) {\n return;\n }\n\n const promise = ctx.clients.matchAll({\n type: 'window'\n }).then((clientList) => {\n data.action = action;\n pendingNotification = data;\n for(let i = 0; i < clientList.length; ++i) {\n const client = clientList[i];\n if('focus' in client) {\n client.focus();\n serviceMessagePort.invokeVoid('pushClick', pendingNotification, client);\n pendingNotification = undefined;\n return;\n }\n }\n\n if(ctx.clients.openWindow) {\n return Promise.resolve(getter.get('push_settings')).then((settings) => {\n return ctx.clients.openWindow(settings.baseUrl || defaultBaseUrl);\n });\n }\n }).catch((error) => {\n log.error('Clients.matchAll error', error);\n })\n\n event.waitUntil(promise);\n});\n\nctx.addEventListener('notificationclose', onCloseNotification);\n\nconst notifications: Set = new Set();\nlet pendingNotification: PushNotificationObject;\nfunction pushToNotifications(notification: Notification) {\n if(!notifications.has(notification)) {\n notifications.add(notification);\n // @ts-ignore\n notification.onclose = onCloseNotification;\n }\n}\n\nfunction onCloseNotification(event: NotificationEvent) {\n removeFromNotifications(event.notification)\n}\n\nfunction removeFromNotifications(notification: Notification) {\n notifications.delete(notification);\n}\n\nexport function closeAllNotifications(tag?: string) {\n for(const notification of notifications) {\n try {\n if(tag && notification.tag !== tag) {\n continue;\n }\n\n notification.close();\n notifications.delete(notification);\n } catch(e) {}\n }\n\n let promise: Promise;\n if('getNotifications' in ctx.registration) {\n promise = ctx.registration.getNotifications({tag}).then((notifications) => {\n for(let i = 0, len = notifications.length; i < len; ++i) {\n try {\n notifications[i].close();\n } catch(e) {}\n }\n }).catch((error) => {\n log.error('Offline register SW error', error);\n });\n } else {\n promise = Promise.resolve();\n }\n\n return promise;\n}\n\nfunction userInvisibleIsSupported() {\n return IS_FIREFOX;\n}\n\nfunction fireNotification(obj: PushNotificationObject, settings: PushStorage['push_settings'], lang: PushStorage['push_lang']) {\n let title = obj.title || 'Telegram';\n let body = obj.description || '';\n let peerId: string;\n\n if(obj.custom) {\n if(obj.custom.channel_id) {\n peerId = '' + -obj.custom.channel_id;\n } else if(obj.custom.chat_id) {\n peerId = '' + -obj.custom.chat_id;\n } else {\n peerId = obj.custom.from_id || '';\n }\n }\n\n obj.custom.peerId = '' + peerId;\n let tag = 'peer' + peerId;\n\n const messageKey = peerId + '_' + obj.custom.msg_id;\n if(ignoreMessages) {\n const error = 'ignoring push';\n log.warn(error, obj);\n ignoreMessages.delete(messageKey);\n throw error;\n }\n\n if(settings?.nopreview) {\n title = 'Telegram';\n body = lang.push_message_nopreview;\n tag = 'unknown_peer';\n }\n\n const actions: (Omit & {action: PushNotificationObject['action']})[] = [{\n action: 'mute1d',\n title: lang.push_action_mute1d\n }/* , {\n action: 'push_settings',\n title: lang.push_action_settings || 'Settings'\n } */];\n\n const notificationOptions: NotificationOptions = {\n body,\n icon: NOTIFICATION_ICON_PATH,\n tag,\n data: obj,\n actions,\n badge: NOTIFICATION_BADGE_PATH,\n silent: obj.custom.silent === '1'\n };\n\n log('show notify', title, body, obj, notificationOptions);\n\n const notificationPromise = ctx.registration.showNotification(title, notificationOptions);\n\n return notificationPromise.catch((error) => {\n log.error('Show notification promise', error);\n });\n}\n\nexport function onPing(payload: ServicePushPingTaskPayload, source?: MessageEventSource) {\n lastPingTime = Date.now();\n localNotificationsAvailable = payload.localNotifications;\n\n if(pendingNotification && source) {\n serviceMessagePort.invokeVoid('pushClick', pendingNotification, source);\n pendingNotification = undefined;\n }\n\n if(payload.lang) {\n getter.set('push_lang', payload.lang);\n }\n\n if(payload.settings) {\n getter.set('push_settings', payload.settings);\n }\n}\n\nconst ignoreMessages: Set = new Set();\nexport function onShownNotification(payload: string) {\n ignoreMessages.add(payload);\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 {Database} from '.';\nimport type {IDBIndex} from '../../lib/files/idb';\n\nconst DATABASE_STATE: Database<'session' | 'stickerSets' | 'users' | 'chats' | 'messages' | 'dialogs'> = {\n name: 'tweb',\n version: 7,\n stores: [{\n name: 'session'\n }, {\n name: 'stickerSets'\n }, {\n name: 'users'\n }, {\n name: 'chats'\n }, {\n name: 'dialogs'\n // indexes: [\n // ...(new Array(20 + 2).fill(0)).map((_, idx) => {\n // const name = `index_${idx}`;\n // const index: IDBIndex = {\n // indexName: name,\n // keyPath: name,\n // objectParameters: {}\n // };\n\n // return index\n // })\n // ]\n }, {\n name: 'messages'\n }]\n};\n\nexport default DATABASE_STATE;\n","export const NOTIFICATION_ICON_PATH = 'assets/img/logo_filled_rounded.png';\nexport const NOTIFICATION_BADGE_PATH = 'assets/img/logo_plain.svg'; // masked\n","/*\n * 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 {WebPushApiManager} from '../mtproto/webPushApiManager';\nimport type {PushNotificationObject} from './push';\nimport type {MyUploadFile} from '../mtproto/apiFileManager';\nimport SuperMessagePort from '../mtproto/superMessagePort';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\n\nexport type ServicePushPingTaskPayload = {\n localNotifications: boolean,\n lang: {\n push_action_mute1d: string\n push_action_settings: string\n push_message_nopreview: string\n },\n settings: WebPushApiManager['settings']\n};\n\nexport type ServiceRequestFilePartTaskPayload = {\n docId: DocId,\n dcId: number,\n offset: number,\n limit: number\n};\n\nexport type ServiceDownloadTaskPayload = {\n headers: any,\n id: string\n};\n\nexport type ServiceEvent = {\n port: (payload: void, source: MessageEventSource, event: MessageEvent) => void\n};\n\nexport default class ServiceMessagePort extends SuperMessagePort<{\n // from main thread to service worker\n notificationsClear: () => void,\n toggleStorages: (payload: {enabled: boolean, clearWrite: boolean}) => void,\n pushPing: (payload: ServicePushPingTaskPayload, source: MessageEventSource, event: MessageEvent) => void,\n hello: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n shownNotification: (payload: string) => void,\n\n // from mtproto worker\n download: (payload: ServiceDownloadTaskPayload) => void,\n downloadChunk: (payload: {id: ServiceDownloadTaskPayload['id'], chunk: Uint8Array}) => void\n downloadFinalize: (payload: ServiceDownloadTaskPayload['id']) => void,\n downloadCancel: (payload: ServiceDownloadTaskPayload['id']) => void\n}, {\n // to main thread\n pushClick: (payload: PushNotificationObject) => void,\n hello: (payload: void, source: MessageEventSource) => void,\n share: (payload: ShareData) => void,\n\n // to mtproto worker\n requestFilePart: (payload: ServiceRequestFilePartTaskPayload) => Promise | MyUploadFile\n} & ServiceEvent, Master> {\n constructor() {\n super('SERVICE');\n\n MOUNT_CLASS_TO && (MOUNT_CLASS_TO.serviceMessagePort = this);\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 {ServiceDownloadTaskPayload} from './serviceMessagePort';\nimport type ServiceMessagePort from './serviceMessagePort';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport makeError from '../../helpers/makeError';\nimport pause from '../../helpers/schedulers/pause';\n\ntype DownloadType = Uint8Array;\ntype DownloadItem = ServiceDownloadTaskPayload & {\n // transformStream: TransformStream,\n readableStream: ReadableStream,\n // writableStream: WritableStream,\n // writer: WritableStreamDefaultWriter,\n // controller: TransformStreamDefaultController,\n controller: ReadableStreamController,\n promise: CancellablePromise,\n // downloadPromise: Promise,\n used?: boolean\n};\nconst downloadMap: Map = new Map();\nconst DOWNLOAD_ERROR = makeError('UNKNOWN');\nconst DOWNLOAD_TEST = false;\n\n(self as any).downloadMap = downloadMap;\n\ntype A = Parameters['addMultipleEventsListeners']>[0];\n\nconst events: A = {\n download: (payload) => {\n const {id} = payload;\n if(downloadMap.has(id)) {\n return Promise.reject(DOWNLOAD_ERROR);\n }\n\n // const y = (20 * 1024 * 1024) / payload.limitPart;\n // const strategy = new ByteLengthQueuingStrategy({highWaterMark: y});\n // let controller: TransformStreamDefaultController;\n const strategy = new CountQueuingStrategy({highWaterMark: 1});\n // const transformStream = new TransformStream(/* {\n // start: (_controller) => controller = _controller,\n // }, */undefined, strategy, strategy);\n\n // const {readable, writable} = transformStream;\n // const writer = writable.getWriter();\n\n const promise = deferredPromise();\n promise.then(() => {\n setTimeout(() => {\n downloadMap.delete(id);\n }, 5e3);\n }, () => {\n downloadMap.delete(id);\n });\n\n // writer.closed.then(promise.resolve, promise.reject);\n\n let controller: ReadableStreamController;\n const readable = new ReadableStream({\n start: (_controller) => {\n controller = _controller;\n },\n\n cancel: (reason) => {\n promise.reject(DOWNLOAD_ERROR);\n }\n }, strategy);\n\n // writer.closed.catch(noop).finally(() => {\n // log.error('closed writer');\n // onEnd();\n // });\n\n // const downloadPromise = writer.closed.catch(() => {throw DOWNLOAD_ERROR;});\n const item: DownloadItem = {\n ...payload,\n // transformStream,\n readableStream: readable,\n // writableStream: writable,\n // writer,\n // downloadPromise,\n promise,\n controller\n };\n\n downloadMap.set(id, item);\n\n // return downloadPromise;\n return promise.catch(() => {throw DOWNLOAD_ERROR});\n },\n\n downloadChunk: ({id, chunk}) => {\n const item = downloadMap.get(id);\n if(!item) {\n return Promise.reject();\n }\n\n // return item.controller.enqueue(chunk);\n // return item.writer.write(chunk);\n // @ts-ignore\n return item.controller.enqueue(chunk);\n },\n\n downloadFinalize: (id) => {\n const item = downloadMap.get(id);\n if(!item) {\n return Promise.reject();\n }\n\n item.promise.resolve();\n // return item.controller.terminate();\n // return item.writer.close();\n return item.controller.close();\n },\n\n downloadCancel: (id) => {\n const item = downloadMap.get(id);\n if(!item) {\n return;\n }\n\n item.promise.reject();\n // return item.controller.error();\n // return item.writer.abort();\n return item.controller.error();\n }\n};\n\nexport default function handleDownload(serviceMessagePort: ServiceMessagePort) {\n serviceMessagePort.addMultipleEventsListeners(events);\n\n return {\n onDownloadFetch,\n onClosedWindows: cancelAllDownloads\n };\n}\n\nfunction onDownloadFetch(event: FetchEvent, params: string) {\n const promise = pause(100).then(() => {\n const item = downloadMap.get(params);\n if(!item || (item.used && !DOWNLOAD_TEST)) {\n return;\n }\n\n item.used = true;\n const stream = item.readableStream;\n const response = new Response(stream, {headers: item.headers});\n return response;\n });\n\n event.respondWith(promise);\n}\n\nfunction cancelAllDownloads() {\n if(downloadMap.size) {\n for(const [id, item] of downloadMap) {\n // item.writer.abort().catch(noop);\n item.controller.error();\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 {log, serviceMessagePort} from './index.service';\n\nconst deferred: {[id: string]: ShareData[]} = {};\n\nfunction parseFormData(formData: FormData): ShareData {\n return {\n files: formData.getAll('files') as File[],\n title: formData.get('title') as string,\n text: formData.get('text') as string,\n url: formData.get('url') as string\n };\n}\n\nasync function processShareEvent(formData: FormData, clientId: string) {\n try {\n log('share data', formData);\n const data = parseFormData(formData);\n (deferred[clientId] ??= []).push(data);\n } catch(err) {\n log.warn('something wrong with the data', err);\n }\n};\n\nexport function checkWindowClientForDeferredShare(windowClient: WindowClient) {\n const arr = deferred[windowClient.id];\n if(!arr) {\n return;\n }\n\n delete deferred[windowClient.id];\n\n log('releasing share events to client:', windowClient.id, 'length:', arr.length);\n arr.forEach((data) => {\n serviceMessagePort.invokeVoid('share', data, windowClient);\n });\n}\n\nexport default function onShareFetch(event: FetchEvent, params: string) {\n const promise = event.request.formData()\n .then((formData) => {\n processShareEvent(formData, event.resultingClientId)\n return Response.redirect('..');\n });\n\n event.respondWith(promise);\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 \n \n \n\nimport {logger, LogTypes} from '../logger';\nimport {CACHE_ASSETS_NAME, requestCache} from './cache';\nimport onStreamFetch from './stream';\nimport {closeAllNotifications, onPing, onShownNotification} from './push';\nimport CacheStorageController from '../files/cacheStorage';\nimport {IS_SAFARI} from '../../environment/userAgent';\nimport ServiceMessagePort from './serviceMessagePort';\nimport listenMessagePort from '../../helpers/listenMessagePort';\nimport {getWindowClients} from '../../helpers/context';\nimport {MessageSendPort} from '../mtproto/superMessagePort';\nimport handleDownload from './download';\nimport onShareFetch, {checkWindowClientForDeferredShare} from './share';\n\nexport const log = logger('SW', LogTypes.Error | LogTypes.Debug | LogTypes.Log | LogTypes.Warn, true);\nconst ctx = self as any as ServiceWorkerGlobalScope;\n\n \nlet _mtprotoMessagePort: MessagePort;\nexport const getMtprotoMessagePort = () => _mtprotoMessagePort;\n\nconst sendMessagePort = (source: MessageSendPort) => {\n const channel = new MessageChannel();\n serviceMessagePort.attachPort(_mtprotoMessagePort = channel.port1);\n serviceMessagePort.invokeVoid('port', undefined, source, [channel.port2]);\n};\n\nconst sendMessagePortIfNeeded = (source: MessageSendPort) => {\n if(!connectedWindows.size && !_mtprotoMessagePort) {\n log('sending message port for mtproto');\n sendMessagePort(source);\n }\n};\n\nconst onWindowConnected = (source: WindowClient) => {\n log('window connected', source.id, 'windows before', connectedWindows.size);\n\n if(source.frameType === 'none') {\n log.warn('maybe a bugged Safari starting window', source.id);\n return;\n }\n\n log('windows', Array.from(connectedWindows));\n serviceMessagePort.invokeVoid('hello', undefined, source);\n sendMessagePortIfNeeded(source);\n connectedWindows.set(source.id, source);\n\n checkWindowClientForDeferredShare(source);\n};\n\nexport const serviceMessagePort = new ServiceMessagePort();\nserviceMessagePort.addMultipleEventsListeners({\n notificationsClear: closeAllNotifications,\n\n toggleStorages: ({enabled, clearWrite}) => {\n CacheStorageController.toggleStorage(enabled, clearWrite);\n },\n\n pushPing: (payload, source) => {\n onPing(payload, source);\n },\n\n hello: (payload, source) => {\n onWindowConnected(source as any as WindowClient);\n },\n\n shownNotification: onShownNotification\n});\n\nconst {\n onDownloadFetch,\n onClosedWindows: onDownloadClosedWindows\n} = handleDownload(serviceMessagePort);\n\n// * service worker can be killed, so won't get 'hello' event\ngetWindowClients().then((windowClients) => {\n log(`got ${windowClients.length} windows from the start`);\n windowClients.forEach((windowClient) => {\n onWindowConnected(windowClient);\n });\n});\n\nconst connectedWindows: Map = new Map();\n(self as any).connectedWindows = connectedWindows;\nlistenMessagePort(serviceMessagePort, undefined, (source) => {\n log('something has disconnected', source);\n const isWindowClient = source instanceof WindowClient;\n if(!isWindowClient || !connectedWindows.has(source.id)) {\n log.warn('it is not a window');\n return;\n }\n\n connectedWindows.delete(source.id);\n log('window disconnected, left', connectedWindows.size);\n if(!connectedWindows.size) {\n log.warn('no windows left');\n\n if(_mtprotoMessagePort) {\n serviceMessagePort.detachPort(_mtprotoMessagePort);\n _mtprotoMessagePort = undefined;\n }\n\n onDownloadClosedWindows();\n }\n});\n \n\nconst onFetch = (event: FetchEvent): void => {\n \n if(\n !IS_SAFARI &&\n event.request.url.indexOf(location.origin + '/') === 0 &&\n event.request.url.match(/\\.(js|css|jpe?g|json|wasm|png|mp3|svg|tgs|ico|woff2?|ttf|webmanifest?)(?:\\?.*)?$/)\n ) {\n return event.respondWith(requestCache(event));\n }\n \n\n try {\n // const [, url, scope, params] = /http[:s]+\\/\\/.*?(\\/(.*?)(?:$|\\/(.*)$))/.exec(event.request.url) || [];\n const [scope, params] = event.request.url.split('/').slice(-2);\n\n // log.debug('[fetch]:', event);\n\n switch(scope) {\n case 'stream': {\n onStreamFetch(event, params);\n break;\n }\n\n case 'download': {\n onDownloadFetch(event, params);\n break;\n }\n\n case 'share': {\n onShareFetch(event, params);\n break;\n }\n\n case 'ping': {\n event.respondWith(new Response('pong'));\n break;\n }\n }\n } catch(err) {\n log.error('fetch error', err);\n event.respondWith(new Response('', {\n status: 500,\n statusText: 'Internal Server Error',\n headers: {'Cache-Control': 'no-cache'}\n }));\n }\n};\n\nconst onChangeState = () => {\n ctx.onfetch = onFetch;\n};\n\nctx.addEventListener('install', (event) => {\n log('installing');\n event.waitUntil(ctx.skipWaiting().then(() => log('skipped waiting'))); // Activate worker immediately\n});\n\nctx.addEventListener('activate', (event) => {\n log('activating', ctx);\n event.waitUntil(ctx.caches.delete(CACHE_ASSETS_NAME).then(() => log('cleared assets cache')));\n event.waitUntil(ctx.clients.claim().then(() => log('claimed clients')));\n});\n\n// ctx.onerror = (error) => {\n// log.error('error:', error);\n// };\n\n// ctx.onunhandledrejection = (error) => {\n// log.error('onunhandledrejection:', error);\n// };\n\nctx.onoffline = ctx.ononline = onChangeState;\n\nonChangeState();\n","/*\n * 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 SuperMessagePort from '../lib/mtproto/superMessagePort';\nimport ctx from '../environment/ctx';\n\nexport default function listenMessagePort(\n messagePort: SuperMessagePort,\n onConnect?: (source: MessageEventSource) => void,\n onDisconnect?: (source: MessageEventSource) => void\n) {\n const attachPort = (listenPort: any, sendPort: any) => {\n messagePort.attachListenPort(listenPort);\n sendPort && messagePort.attachSendPort(sendPort);\n onConnect?.(listenPort);\n };\n\n messagePort.setOnPortDisconnect(onDisconnect);\n\n if(typeof(SharedWorkerGlobalScope) !== 'undefined') {\n (ctx as any as SharedWorkerGlobalScope).addEventListener('connect', (e) => attachPort(e.source, e.source));\n } else if(typeof(ServiceWorkerGlobalScope) !== 'undefined') {\n attachPort(ctx, null);\n } else {\n attachPort(ctx, ctx);\n }\n}\n","export default function timeout(delay: number): Promise {\n return new Promise(((resolve) => {\n setTimeout(() => {\n resolve(new Response('', {\n status: 408,\n statusText: 'Request timed out.'\n }));\n }, delay);\n }));\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [85], () => (__webpack_require__(6350)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".\" + \"887945ef5f43bc205112\" + \".bundle.js\";\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = {};\n var countMap = {};\n var getRetryDelay = function () {\n return 3000;\n };\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result +\n (queryMap.hasOwnProperty(chunkId) ? '?' + queryMap[chunkId] : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.hasOwnProperty(chunkId)\n ? countMap[chunkId]\n : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n var retryAttempt = 999999 - retries + 1;\n setTimeout(function () {\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap[chunkId] = cacheBust;\n countMap[chunkId] = retries - 1;\n resolve(__webpack_require__.e(chunkId));\n }, getRetryDelay(retryAttempt));\n });\n });\n };\n }\n})();\n","// no baseURI\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t670: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","next","DEBUG","MOUNT_CLASS_TO","window","self","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","IS_FIREFOX","undefined","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","IS_WEB_WORKER","WorkerGlobalScope","IS_WORKER","getWindowClients","clients","matchAll","includeUncontrolled","type","postMessage","listener","args","err","console","error","notifyServiceWorker","all","then","listeners","length","slice","forEach","bind","LogTypes","LOG_LEVELS","None","Error","Warn","Log","Debug","STYLES_SUPPORTED","LOGGER_STYLES","methods","logger","prefix","ignoreDebugReset","style","originalPrefix","originalStyle","log","method","logType","setPrefix","newPrefix","setLevel","level","reduce","acc","v","bindPrefix","pause","ms","Promise","resolve","setTimeout","ctx","CACHE_ASSETS_NAME","isCorrectResponse","response","ok","status","timeoutRace","promise","race","reject","noop","deferredPromise","deferredHelper","isFulfilled","isRejected","notify","notifyAll","lastNotify","callback","addNotifyListener","push","value","catch","finally","cancel","Object","assign","blobConstruct","blobParts","mimeType","Array","isArray","safeMimeType","blobSafeMimeType","Blob","MemoryWriter","constructor","size","saveFileCallback","this","bytes","Uint8Array","write","part","offset","endOffset","byteLength","newBytes","set","truncate","trim","finalize","saveToStorage","blob","getParts","replaceParts","parts","CacheStorageController","dbName","useStorage","STORAGES","openDatabase","openDbPromise","caches","open","delete","entryName","timeoutOperation","cache","deleteAll","get","save","put","getFile","fileName","makeError","saveFile","Response","headers","rejected","timeout","res","clearTimeout","prepareWriting","fileSize","getWriter","static","enabled","clearWrite","map","storage","deferredPromises","Map","cacheStorage","CHUNK_CACHED_TIME_HEADER","setInterval","keys","requests","filtered","timestamp","Date","now","request","url","has","promises","id","ignoreSearch","ignoreVary","mtprotoMessagePort","getMtprotoMessagePort","messagePort","taskId","streams","Stream","info","loadedOffsets","Set","destroy","getId","limitPart","STREAM_CHUNK_UPPER_LIMIT","STREAM_CHUNK_MIDDLE_LIMIT","destroyDebounced","fn","shouldRunFirst","shouldRunLast","waitingTimeout","waitingPromise","hadNewCall","invoke","_resolve","_reject","apply","debounce","_waitingTimeout","isDebounced","requestFilePartFromWorker","alignedOffset","limit","fromPreload","payload","docId","dcId","JSON","stringify","uploadFile","add","serviceMessagePort","bytesPromise","saveChunkToCache","preloadChunks","requestFilePartFromCache","key","getChunkKey","reader","FileReader","addEventListener","e","target","result","readBlobAs","readBlobAsArrayBuffer","buffer","readBlobAsUint8Array","requestFilePart","preloadChunk","end","alignOffset","requestRange","range","possibleResponse","statusText","responseForSafariFirstRange","Math","ceil","alignLimit","min","ab","location","base","deepEqual","x","y","tx","every","IDB","db","object","fromObject","i","safeAssign","name","storageIsAvailable","join","INSTANCES","isAvailable","createNew","createIndexes","os","store","indexNames","from","indexName","deleteIndex","indexes","index","contains","createIndex","keyPath","objectParameters","indexedDB","version","message","finished","onerror","onsuccess","event","calledNew","onclose","onabort","transaction","close","onversionchange","onupgradeneeded","warn","oldVersion","newVersion","stores","objectStoreNames","objectStore","createObjectStore","find","instance","preserve","IDBStorage","storeName","idb","create","concat","getObjectStore","clear","idx","mode","perf","performance","onError","onComplete","results","r","waitForTransactionComplete","oncomplete","callbackResult","left","onRequestFinished","getAll","defaultBaseUrl","protocol","hostname","pathname","split","lastPingTime","localNotificationsAvailable","defaults","push_mute_until","push_lang","push_message_nopreview","push_action_mute1d","push_action_settings","push_settings","getter","getDefault","hasOwnProperty","getCached","obj","data","json","muteUntil","settings","lang","nowTime","userInvisibleIsSupported","notificationPromise","peerId","title","body","description","custom","channel_id","chat_id","from_id","tag","messageKey","msg_id","ignoreMessages","nopreview","notificationOptions","icon","actions","action","badge","silent","registration","showNotification","fireNotification","waitUntil","closeAllNotifications","notification","clientList","pendingNotification","client","focus","invokeVoid","openWindow","baseUrl","notifications","getNotifications","len","ServiceMessagePort","super","downloadMap","DOWNLOAD_ERROR","events","download","strategy","CountQueuingStrategy","highWaterMark","controller","readable","ReadableStream","start","_controller","reason","item","readableStream","downloadChunk","chunk","enqueue","downloadFinalize","downloadCancel","onDownloadFetch","params","used","stream","respondWith","cancelAllDownloads","onShareFetch","formData","clientId","files","text","parseFormData","processShareEvent","resultingClientId","redirect","_mtprotoMessagePort","onWindowConnected","source","connectedWindows","frameType","channel","MessageChannel","attachPort","port1","port2","sendMessagePort","sendMessagePortIfNeeded","windowClient","arr","checkWindowClientForDeferredShare","addMultipleEventsListeners","notificationsClear","toggleStorages","toggleStorage","pushPing","localNotifications","onPing","hello","shownNotification","onClosedWindows","onDownloadClosedWindows","handleDownload","windowClients","onConnect","onDisconnect","listenPort","sendPort","attachListenPort","attachSendPort","setOnPortDisconnect","WindowClient","detachPort","listenMessagePort","onFetch","origin","file","fetch","clone","replace","random","requestCache","scope","header","chunks","ranges","parseRange","parse","decodeURIComponent","onStreamFetch","onChangeState","onfetch","skipWaiting","claim","onoffline","ononline","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","m","__webpack_exports__","O","chunkIds","priority","notFulfilled","Infinity","fulfilled","j","splice","d","definition","o","defineProperty","enumerable","f","chunkId","u","miniCssF","g","globalThis","Function","prop","prototype","call","scriptUrl","importScripts","document","currentScript","src","scripts","getElementsByTagName","p","oldGetScript","oldLoadScript","queryMap","countMap","retries","realSrc","cacheBust","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","moreModules","runtime","pop"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"sw.c55ec44ab819870d4ac4.chunk.js","mappings":"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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/startup chunk dependencies","webpack://tweb/./src/config/debug.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/helpers/context.ts","webpack://tweb/./src/lib/logger.ts","webpack://tweb/./src/helpers/schedulers/pause.ts","webpack://tweb/./src/lib/serviceWorker/cache.ts","webpack://tweb/./src/helpers/noop.ts","webpack://tweb/./src/helpers/cancellablePromise.ts","webpack://tweb/./src/helpers/blob/blobConstruct.ts","webpack://tweb/./src/helpers/blob/blobSafeMimeType.ts","webpack://tweb/./src/lib/files/memoryWriter.ts","webpack://tweb/./src/lib/files/cacheStorage.ts","webpack://tweb/./src/lib/serviceWorker/stream.ts","webpack://tweb/./src/helpers/schedulers/debounce.ts","webpack://tweb/./src/helpers/blob/readBlobAsUint8Array.ts","webpack://tweb/./src/helpers/blob/readBlobAsArrayBuffer.ts","webpack://tweb/./src/helpers/blob/readBlobAs.ts","webpack://tweb/./src/helpers/object/deepEqual.ts","webpack://tweb/./src/lib/files/idb.ts","webpack://tweb/./src/helpers/object/safeAssign.ts","webpack://tweb/./src/lib/serviceWorker/push.ts","webpack://tweb/./src/config/databases/state.ts","webpack://tweb/./src/config/notifications.ts","webpack://tweb/./src/lib/serviceWorker/serviceMessagePort.ts","webpack://tweb/./src/lib/serviceWorker/download.ts","webpack://tweb/./src/lib/serviceWorker/share.ts","webpack://tweb/./src/lib/serviceWorker/index.service.ts","webpack://tweb/./src/helpers/listenMessagePort.ts","webpack://tweb/./src/lib/serviceWorker/timeout.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/importScripts chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn __webpack_require__.e(85).then(next);\n};","/*\n * 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 './modes';\n\nexport const IS_BETA = process.env.NODE_ENV !== 'production';\nexport const DEBUG = (IS_BETA || Modes.debug)/* && false */;\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\nexport default DEBUG;\n\n// let m = DEBUG;\n/* if(!DEBUG) {\n ctx.sandpitTurtle = () => {\n //if(!m) {\n for(let i in MOUNT_CLASS_TO) {\n ctx[i] = MOUNT_CLASS_TO[i];\n }\n //m = true;\n //}\n\n //DEBUG = !DEBUG;\n };\n} */\n\n/* export const superDebug = (object: any, key: string) => {\n var d = object[key];\n var beforeStr = '', afterStr = '';\n for(var r of d) {\n beforeStr += r.before.hex + '\\n';\n afterStr += r.after.hex + '\\n';\n }\n\n beforeStr = beforeStr.trim();\n afterStr = afterStr.trim();\n //var beforeStr = d.map((r) => r.before.hex).join('\\n');\n //var afterStr = d.map((r) => r.after.hex).join('\\n');\n\n var dada = (name: string, str: string) => {\n var a = document.createElement('a');\n a.target = '_blank';\n a.download = name + '.txt';\n a.href = URL.createObjectURL(new Blob([str], {\n type: 'text/plain'\n }));\n document.body.append(a);\n a.click();\n };\n\n dada(key + '_' + 'before', beforeStr);\n dada(key + '_' + 'after', afterStr);\n}\n\nMOUNT_CLASS_TO.superDebug = superDebug; */\n","/*\n * 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 './ctx';\n\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\n\n// https://stackoverflow.com/a/58065241\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\n !(ctx as any).MSStream;\n\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 */;\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\n\nexport const IS_MOBILE = (navigator.maxTouchPoints === undefined || 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;\n","/*\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// ะฒ SW ะผะพะถะตั‚ ะฑั‹ั‚ัŒ ัั€ะฐะทัƒ ะดะฒะต ะฟะตั€ะตะผะตะฝะฝั‹ั… TRUE\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\n\nexport const getWindowClients = () => {\n return (self as any as ServiceWorkerGlobalScope)\n .clients\n .matchAll({includeUncontrolled: false, type: 'window'});\n};\n\nexport const getLastWindowClient = () => getWindowClients().then((windowClients) => windowClients.slice(-1)[0]);\n\nconst postMessage = (listener: WindowClient | DedicatedWorkerGlobalScope, ...args: any[]) => {\n try {\n // @ts-ignore\n listener.postMessage(...args);\n } catch(err) {\n console.error('[worker] postMessage error:', err, args);\n }\n};\n\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\n getWindowClients().then((listeners) => {\n if(!listeners.length) {\n // console.trace('no listeners?', self, listeners);\n return;\n }\n\n listeners.slice(all ? 0 : -1).forEach((listener) => {\n postMessage(listener, ...args);\n });\n });\n};\n\nconst notifyWorker = (...args: any[]) => {\n postMessage(self as any as DedicatedWorkerGlobalScope, ...args);\n};\n\nconst noop = () => {};\n\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\n","/*\n * 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';\nimport dT from '../helpers/dT';\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 IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\n// let getCallerFunctionNameFromLine: (line: string) => string;\n// if(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;\n// const LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\n// function 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 group(...args: any[]): void;\n groupCollapsed(...args: any[]): void;\n groupEnd(...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' */ | 'group' | 'groupCollapsed' | 'groupEnd', 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 ['group', LogTypes.Log],\n ['groupCollapsed', LogTypes.Log],\n ['groupEnd', 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 const 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","export default function pause(ms: number) {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\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 pause from '../../helpers/schedulers/pause';\n\nconst ctx = self as any as ServiceWorkerGlobalScope;\nexport const CACHE_ASSETS_NAME = 'cachedAssets';\n\nfunction isCorrectResponse(response: Response) {\n return response.ok && response.status === 200;\n}\n\nfunction timeoutRace>(promise: T) {\n return Promise.race([\n promise,\n pause(10000).then(() => Promise.reject())\n ]);\n}\n\nexport async function requestCache(event: FetchEvent) {\n try {\n // const cache = await ctx.caches.open(CACHE_ASSETS_NAME);\n const cache = await timeoutRace(ctx.caches.open(CACHE_ASSETS_NAME));\n const file = await timeoutRace(cache.match(event.request, {ignoreVary: true}));\n\n if(file && isCorrectResponse(file)) {\n return file;\n }\n\n const headers: HeadersInit = {'Vary': '*'};\n let response = await fetch(event.request, {headers});\n if(isCorrectResponse(response)) {\n cache.put(event.request, response.clone());\n } else if(response.status === 304) { // possible fix for 304 in Safari\n const url = event.request.url.replace(/\\?.+$/, '') + '?' + (Math.random() * 100000 | 0);\n response = await fetch(url, {headers});\n if(isCorrectResponse(response)) {\n cache.put(event.request, response.clone());\n }\n }\n\n return response;\n } catch(err) {\n return fetch(event.request);\n }\n}\n","export default function noop() {}\n","/*\n * 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 './noop';\n\nexport interface CancellablePromise extends Promise {\n resolve?: (value: T) => void,\n reject?: (...args: any[]) => void,\n cancel?: (reason?: any) => void,\n\n notify?: (...args: any[]) => void,\n notifyAll?: (...args: any[]) => void,\n lastNotify?: any,\n listeners?: Array<(...args: any[]) => void>,\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\n\n isFulfilled?: boolean,\n isRejected?: boolean\n}\n\nexport default function deferredPromise() {\n const deferredHelper: any = {\n isFulfilled: false,\n isRejected: false,\n\n notify: () => {},\n notifyAll: (...args: any[]) => {\n deferredHelper.lastNotify = args;\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\n },\n\n listeners: [],\n addNotifyListener: (callback: (...args: any[]) => void) => {\n if(deferredHelper.lastNotify) {\n callback(...deferredHelper.lastNotify);\n }\n\n deferredHelper.listeners.push(callback);\n }\n };\n\n const deferred: CancellablePromise = new Promise((resolve, reject) => {\n deferredHelper.resolve = (value: T) => {\n if(deferred.isFulfilled || deferred.isRejected) return;\n\n deferred.isFulfilled = true;\n resolve(value);\n };\n\n deferredHelper.reject = (...args: any[]) => {\n if(deferred.isRejected || deferred.isFulfilled) return;\n\n deferred.isRejected = true;\n reject(...args);\n };\n });\n\n // @ts-ignore\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\n const n = deferredPromise>();\n\n }; */\n\n deferred.catch(noop).finally(() => {\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\n deferred.listeners.length = 0;\n\n if(deferred.cancel) {\n deferred.cancel = noop;\n }\n });\n\n Object.assign(deferred, deferredHelper);\n\n return deferred;\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 blobSafeMimeType from './blobSafeMimeType';\n\nexport default function blobConstruct(blobParts: Array | T, mimeType: string = ''): Blob {\n if(!Array.isArray(blobParts)) {\n blobParts = [blobParts];\n }\n\n const safeMimeType = blobSafeMimeType(mimeType);\n const blob = new Blob(blobParts, {type: safeMimeType});\n return blob;\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// https://www.iana.org/assignments/media-types/media-types.xhtml\nexport default function blobSafeMimeType(mimeType: string) {\n if([\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/svg+xml',\n 'image/webp',\n 'image/bmp',\n 'video/mp4',\n 'video/webm',\n 'video/quicktime',\n 'audio/ogg',\n 'audio/mpeg',\n 'audio/mp4',\n 'audio/wav', // though it is not in list\n 'application/json',\n 'application/pdf'\n ].indexOf(mimeType) === -1) {\n return 'application/octet-stream';\n }\n\n return mimeType;\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 blobConstruct from '../../helpers/blob/blobConstruct';\nimport StreamWriter from './streamWriter';\n\nexport default class MemoryWriter implements StreamWriter {\n private bytes: Uint8Array;\n\n constructor(\n private mimeType: string,\n private size: number,\n private saveFileCallback?: (blob: Blob) => Promise\n ) {\n this.bytes = new Uint8Array(size);\n }\n\n public async write(part: Uint8Array, offset: number) {\n // sometimes file size can be bigger than the prov\n const endOffset = offset + part.byteLength;\n if(endOffset > this.bytes.byteLength) {\n const newBytes = new Uint8Array(endOffset);\n newBytes.set(this.bytes, 0);\n this.bytes = newBytes;\n }\n\n this.bytes.set(part, offset);\n };\n\n public truncate() {\n this.bytes = new Uint8Array();\n }\n\n public trim(size: number) {\n this.bytes = this.bytes.slice(0, size);\n }\n\n public finalize(saveToStorage = true) {\n const blob = blobConstruct(this.bytes, this.mimeType);\n\n if(saveToStorage && this.saveFileCallback) {\n this.saveFileCallback(blob);\n }\n\n return blob;\n }\n\n public getParts() {\n return this.bytes;\n }\n\n public replaceParts(parts: Uint8Array) {\n this.bytes = parts;\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 Modes from '../../config/modes';\nimport blobConstruct from '../../helpers/blob/blobConstruct';\nimport MemoryWriter from './memoryWriter';\nimport FileManager from './memoryWriter';\nimport FileStorage from './fileStorage';\nimport makeError from '../../helpers/makeError';\nimport deferredPromise from '../../helpers/cancellablePromise';\n\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\n\nexport default class CacheStorageController implements FileStorage {\n private static STORAGES: CacheStorageController[] = [];\n private openDbPromise: Promise;\n\n private useStorage = true;\n\n // private log: ReturnType = logger('CS');\n\n constructor(private dbName: CacheStorageDbName) {\n if(Modes.test) {\n this.dbName += '_test';\n }\n\n if(CacheStorageController.STORAGES.length) {\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\n }\n\n this.openDatabase();\n CacheStorageController.STORAGES.push(this);\n }\n\n private openDatabase(): Promise {\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\n }\n\n public delete(entryName: string) {\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\n }\n\n public deleteAll() {\n return caches.delete(this.dbName);\n }\n\n public get(entryName: string) {\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\n }\n\n public save(entryName: string, response: Response) {\n // return new Promise((resolve) => {}); // DEBUG\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\n }\n\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\n /* if(method === 'blob') {\n return Promise.reject();\n } */\n\n // const str = `get fileName: ${fileName}`;\n // console.time(str);\n return this.get(fileName).then((response) => {\n if(!response) {\n // console.warn('getFile:', response, fileName);\n throw makeError('NO_ENTRY_FOUND');\n }\n\n const promise = response[method]();\n // promise.then(() => {\n // console.timeEnd(str);\n // });\n return promise;\n });\n }\n\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\n // return Promise.resolve(blobConstruct([blob]));\n if(!(blob instanceof Blob)) {\n blob = blobConstruct(blob);\n }\n\n const response = new Response(blob, {\n headers: {\n 'Content-Length': '' + blob.size\n }\n });\n\n return this.save(fileName, response).then(() => blob as Blob);\n }\n\n public timeoutOperation(callback: (cache: Cache) => Promise) {\n if(!this.useStorage) {\n return Promise.reject(makeError('STORAGE_OFFLINE'));\n }\n\n return new Promise(async(resolve, reject) => {\n let rejected = false;\n const timeout = setTimeout(() => {\n reject();\n // console.warn('CACHESTORAGE TIMEOUT');\n rejected = true;\n }, 15e3);\n\n try {\n const cache = await this.openDatabase();\n if(!cache) {\n this.useStorage = false;\n this.openDbPromise = undefined;\n throw 'no cache?';\n }\n\n const res = await callback(cache);\n\n if(rejected) return;\n resolve(res);\n } catch(err) {\n reject(err);\n }\n\n clearTimeout(timeout);\n });\n }\n\n public prepareWriting(fileName: string, fileSize: number, mimeType: string) {\n return {\n deferred: deferredPromise(),\n getWriter: () => {\n const writer = new MemoryWriter(mimeType, fileSize, (blob) => {\n return this.saveFile(fileName, blob).catch(() => blob);\n });\n\n return writer;\n }\n };\n }\n\n public static toggleStorage(enabled: boolean, clearWrite: boolean) {\n return Promise.all(this.STORAGES.map((storage) => {\n storage.useStorage = enabled;\n\n if(!clearWrite) {\n return;\n }\n\n if(!enabled) {\n return storage.deleteAll();\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 readBlobAsUint8Array from '../../helpers/blob/readBlobAsUint8Array';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport debounce from '../../helpers/schedulers/debounce';\nimport {InputFileLocation} from '../../layer';\nimport CacheStorageController from '../files/cacheStorage';\nimport {DownloadOptions, MyUploadFile} from '../mtproto/apiFileManager';\nimport {getMtprotoMessagePort, log, serviceMessagePort} from './index.service';\nimport {ServiceRequestFilePartTaskPayload} from './serviceMessagePort';\nimport timeout from './timeout';\n\nconst deferredPromises: Map}> = new Map();\nconst cacheStorage = new CacheStorageController('cachedStreamChunks');\nconst CHUNK_TTL = 86400;\nconst CHUNK_CACHED_TIME_HEADER = 'Time-Cached';\nconst USE_CACHE = true;\n\nconst clearOldChunks = () => {\n return cacheStorage.timeoutOperation((cache) => {\n return cache.keys().then((requests) => {\n const filtered: Map = new Map();\n const timestamp = Date.now() / 1000 | 0;\n for(const request of requests) {\n const match = request.url.match(/\\/(\\d+?)\\?/);\n if(match && !filtered.has(match[1])) {\n filtered.set(match[1], request);\n }\n }\n\n const promises: Promise[] = [];\n for(const [id, request] of filtered) {\n const promise = cache.match(request).then((response) => {\n if((+response.headers.get(CHUNK_CACHED_TIME_HEADER) + CHUNK_TTL) <= timestamp) {\n log('will delete stream chunk:', id);\n return cache.delete(request, {ignoreSearch: true, ignoreVary: true});\n }\n });\n\n promises.push(promise);\n }\n\n return Promise.all(promises);\n });\n });\n};\n\nsetInterval(clearOldChunks, 1800e3);\nsetInterval(() => {\n const mtprotoMessagePort = getMtprotoMessagePort();\n for(const [messagePort, promises] of deferredPromises) {\n if(messagePort !== mtprotoMessagePort) {\n for(const taskId in promises) {\n const promise = promises[taskId];\n promise.reject();\n }\n\n deferredPromises.delete(messagePort);\n }\n }\n}, 120e3);\n\ntype StreamRange = [number, number];\ntype StreamId = DocId;\nconst streams: Map = new Map();\nclass Stream {\n private destroyDebounced: () => void;\n private id: StreamId;\n private limitPart: number;\n private loadedOffsets: Set = new Set();\n\n constructor(private info: DownloadOptions) {\n this.id = Stream.getId(info);\n streams.set(this.id, this);\n\n // ! ะตัะปะธ ะณั€ัƒะทะธั‚ัŒ ะพั‡ะตะฝัŒ ะฑะพะปัŒัˆะพะต ะฒะธะดะตะพ ั‡ะฐะฝะบะฐะผะธ ะฟะพ 512ะšะฑ ะฒ ะผะพะฑะธะปัŒะฝะพะผ Safari, ั‚ะพ ัั‚ั€ะธะผ ะฝะต ะทะฐะฟัƒัั‚ะธั‚ัั\n this.limitPart = info.size > (75 * 1024 * 1024) ? STREAM_CHUNK_UPPER_LIMIT : STREAM_CHUNK_MIDDLE_LIMIT;\n this.destroyDebounced = debounce(this.destroy, 150000, false, true);\n }\n\n private destroy = () => {\n streams.delete(this.id);\n };\n\n private async requestFilePartFromWorker(alignedOffset: number, limit: number, fromPreload = false) {\n const payload: ServiceRequestFilePartTaskPayload = {\n docId: this.id,\n dcId: this.info.dcId,\n offset: alignedOffset,\n limit\n };\n\n const taskId = JSON.stringify(payload);\n\n const mtprotoMessagePort = getMtprotoMessagePort();\n let promises = deferredPromises.get(mtprotoMessagePort);\n if(!promises) {\n deferredPromises.set(mtprotoMessagePort, promises = {});\n }\n\n let deferred = promises[taskId];\n if(deferred) {\n return deferred.then((uploadFile) => uploadFile.bytes);\n }\n\n this.loadedOffsets.add(alignedOffset);\n\n deferred = promises[taskId] = deferredPromise();\n\n serviceMessagePort.invoke('requestFilePart', payload, undefined, mtprotoMessagePort)\n .then(deferred.resolve, deferred.reject).finally(() => {\n if(promises[taskId] === deferred) {\n delete promises[taskId];\n\n if(!Object.keys(promises).length) {\n deferredPromises.delete(mtprotoMessagePort);\n }\n }\n });\n\n const bytesPromise = deferred.then((uploadFile) => uploadFile.bytes);\n\n if(USE_CACHE) {\n this.saveChunkToCache(bytesPromise, alignedOffset, limit);\n !fromPreload && this.preloadChunks(alignedOffset, alignedOffset + (this.limitPart * 15));\n }\n\n return bytesPromise;\n }\n\n private requestFilePartFromCache(alignedOffset: number, limit: number, fromPreload?: boolean) {\n if(!USE_CACHE) {\n return Promise.resolve();\n }\n\n const key = this.getChunkKey(alignedOffset, limit);\n return cacheStorage.getFile(key).then((blob: Blob) => {\n return fromPreload ? new Uint8Array() : readBlobAsUint8Array(blob);\n }, (error: ApiError) => {\n if(error.type === 'NO_ENTRY_FOUND') {\n return;\n }\n });\n }\n\n private requestFilePart(alignedOffset: number, limit: number, fromPreload?: boolean) {\n return this.requestFilePartFromCache(alignedOffset, limit, fromPreload).then((bytes) => {\n return bytes || this.requestFilePartFromWorker(alignedOffset, limit, fromPreload);\n });\n }\n\n private saveChunkToCache(deferred: Promise, alignedOffset: number, limit: number) {\n return deferred.then((bytes) => {\n const key = this.getChunkKey(alignedOffset, limit);\n const response = new Response(bytes, {\n headers: {\n 'Content-Length': '' + bytes.length,\n 'Content-Type': 'application/octet-stream',\n [CHUNK_CACHED_TIME_HEADER]: '' + (Date.now() / 1000 | 0)\n }\n });\n\n return cacheStorage.save(key, response);\n });\n }\n\n private preloadChunk(offset: number) {\n if(this.loadedOffsets.has(offset)) {\n return;\n }\n\n this.loadedOffsets.add(offset);\n this.requestFilePart(offset, this.limitPart, true);\n }\n\n private preloadChunks(offset: number, end: number) {\n if(end > this.info.size) {\n end = this.info.size;\n }\n\n if(!offset) { // load last chunk for bounds\n this.preloadChunk(alignOffset(offset, this.limitPart));\n } else { // don't preload next chunks before the start\n for(; offset < end; offset += this.limitPart) {\n this.preloadChunk(offset);\n }\n }\n }\n\n public requestRange(range: StreamRange) {\n this.destroyDebounced();\n\n const possibleResponse = responseForSafariFirstRange(range, this.info.mimeType, this.info.size);\n if(possibleResponse) {\n return possibleResponse;\n }\n\n let [offset, end] = range;\n\n /* if(info.size > limitPart && isSafari && offset === limitPart) {\n //end = info.size - 1;\n //offset = info.size - 1 - limitPart;\n offset = info.size - (info.size % limitPart);\n } */\n\n const limit = end && end < this.limitPart ? alignLimit(end - offset + 1) : this.limitPart;\n const alignedOffset = alignOffset(offset, limit);\n\n if(!end) {\n end = Math.min(offset + limit, this.info.size - 1);\n }\n\n return this.requestFilePart(alignedOffset, limit).then((ab) => {\n // log.debug('[stream] requestFilePart result:', result);\n\n // if(isSafari) {\n if(offset !== alignedOffset || end !== (alignedOffset + limit)) {\n ab = ab.slice(offset - alignedOffset, end - alignedOffset + 1);\n }\n\n const headers: Record = {\n 'Accept-Ranges': 'bytes',\n 'Content-Range': `bytes ${offset}-${offset + ab.byteLength - 1}/${this.info.size || '*'}`,\n 'Content-Length': `${ab.byteLength}`\n };\n\n if(this.info.mimeType) {\n headers['Content-Type'] = this.info.mimeType;\n }\n\n // simulate slow connection\n // setTimeout(() => {\n return new Response(ab, {\n status: 206,\n statusText: 'Partial Content',\n headers\n });\n // }, 2.5e3);\n });\n }\n\n private getChunkKey(alignedOffset: number, limit: number) {\n return this.id + '?offset=' + alignedOffset + '&limit=' + limit;\n }\n\n public static get(info: DownloadOptions) {\n return streams.get(this.getId(info)) ?? new Stream(info);\n }\n\n private static getId(info: DownloadOptions) {\n return (info.location as InputFileLocation.inputDocumentFileLocation).id;\n }\n}\n\nexport default function onStreamFetch(event: FetchEvent, params: string) {\n const range = parseRange(event.request.headers.get('Range'));\n const info: DownloadOptions = JSON.parse(decodeURIComponent(params));\n const stream = Stream.get(info);\n\n // log.debug('[stream]', url, offset, end);\n\n event.respondWith(Promise.race([\n timeout(45 * 1000),\n stream.requestRange(range)\n ]));\n}\n\nfunction responseForSafariFirstRange(range: StreamRange, mimeType: string, size: number): Response {\n if(range[0] === 0 && range[1] === 1) {\n return new Response(new Uint8Array(2).buffer, {\n status: 206,\n statusText: 'Partial Content',\n headers: {\n 'Accept-Ranges': 'bytes',\n 'Content-Range': `bytes 0-1/${size || '*'}`,\n 'Content-Length': '2',\n 'Content-Type': mimeType || 'video/mp4'\n }\n });\n }\n\n return null;\n}\n\n/* const STREAM_CHUNK_UPPER_LIMIT = 256 * 1024;\nconst SMALLEST_CHUNK_LIMIT = 256 * 4; */\n/* const STREAM_CHUNK_UPPER_LIMIT = 1024 * 1024;\nconst SMALLEST_CHUNK_LIMIT = 1024 * 4; */\nconst STREAM_CHUNK_MIDDLE_LIMIT = 512 * 1024;\nconst STREAM_CHUNK_UPPER_LIMIT = 1024 * 1024;\nconst SMALLEST_CHUNK_LIMIT = 512 * 4;\n\nfunction parseRange(header: string): StreamRange {\n if(!header) return [0, 0];\n const [, chunks] = header.split('=');\n const ranges = chunks.split(', ');\n const [offset, end] = ranges[0].split('-');\n\n return [+offset, +end || 0];\n}\n\nfunction alignOffset(offset: number, base = SMALLEST_CHUNK_LIMIT) {\n return offset - (offset % base);\n}\n\nfunction alignLimit(limit: number) {\n return 2 ** Math.ceil(Math.log(limit) / Math.log(2));\n}\n","// * Jolly Cobra's schedulers\n\nimport ctx from '../../environment/ctx';\nimport {AnyFunction, Awaited} from '../../types';\nimport noop from '../noop';\n\nexport type DebounceReturnType = {\n (...args: Parameters): Promise>>;\n clearTimeout(): void;\n isDebounced(): boolean;\n};\n\nexport default function debounce(\n fn: F,\n ms: number,\n shouldRunFirst = true,\n shouldRunLast = true\n): DebounceReturnType {\n let waitingTimeout: number;\n let waitingPromise: Promise>>, resolve: (result: any) => void, reject: () => void;\n let hadNewCall = false;\n\n const invoke = (args: Parameters) => {\n const _resolve = resolve, _reject = reject;\n try {\n const result = fn.apply(null, args);\n _resolve(result);\n } catch(err) {\n console.error('debounce error', err);\n // @ts-ignore\n _reject(err);\n }\n };\n\n const debounce = (...args: Parameters) => {\n if(!waitingPromise) waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\n\n if(waitingTimeout) {\n clearTimeout(waitingTimeout);\n hadNewCall = true;\n reject();\n waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\n } else if(shouldRunFirst) {\n invoke(args);\n hadNewCall = false;\n }\n\n const _waitingTimeout = ctx.setTimeout(() => {\n // will run if should run last or first but with new call\n if(shouldRunLast && (!shouldRunFirst || hadNewCall)) {\n invoke(args);\n }\n\n // if debounce was called during invoking\n if(waitingTimeout === _waitingTimeout) {\n waitingTimeout = waitingPromise = resolve = reject = undefined;\n hadNewCall = false;\n }\n }, ms);\n\n waitingTimeout = _waitingTimeout;\n waitingPromise.catch(noop);\n return waitingPromise;\n };\n\n debounce.clearTimeout = () => {\n if(waitingTimeout) {\n ctx.clearTimeout(waitingTimeout);\n reject();\n waitingTimeout = waitingPromise = resolve = reject = undefined;\n hadNewCall = false;\n }\n };\n\n debounce.isDebounced = () => !!waitingTimeout;\n\n return debounce;\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 readBlobAsArrayBuffer from './readBlobAsArrayBuffer';\n\nexport default function readBlobAsUint8Array(blob: Blob) {\n return readBlobAsArrayBuffer(blob).then((buffer) => new Uint8Array(buffer));\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 readBlobAs from './readBlobAs';\n\nexport default function readBlobAsArrayBuffer(blob: Blob) {\n return readBlobAs(blob, 'readAsArrayBuffer');\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 { IS_WEB_WORKER } from \"../context\";\n\n// const id = IS_WEB_WORKER ? Math.random() * 0x1000 | 0 : 0;\nexport default function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\n // const perf = performance.now();\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (e) => {\n // console.log(`readBlobAs [${id}] ${method} time ${performance.now() - perf}`);\n resolve(e.target.result);\n });\n reader[method](blob);\n });\n}\n","export default function deepEqual(x: any, y: any): boolean {\n const ok = Object.keys, tx = typeof x, ty = typeof y;\n return x && y && tx === 'object' && tx === ty ? (\n ok(x).length === ok(y).length &&\n ok(x).every((key) => deepEqual(x[key], y[key]))\n ) : (x === y);\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 {Database} from '../../config/databases';\nimport Modes from '../../config/modes';\nimport makeError from '../../helpers/makeError';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {logger} from '../logger';\n\n/**\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\n */\nexport type IDBIndex = {\n indexName: string,\n keyPath: string,\n objectParameters: IDBIndexParameters\n};\n\nexport type IDBStore = {\n name: string,\n indexes?: IDBIndex[]\n};\n\nexport type IDBOptions = {\n name?: string,\n storeName: string,\n stores?: IDBStore[],\n version?: number\n};\n\nconst DEBUG = false;\n\nexport class IDB {\n private static INSTANCES: IDB[] = [];\n private openDbPromise: Promise;\n private db: IDBDatabase;\n private storageIsAvailable: boolean;\n private log: ReturnType;\n private name: string;\n private version: number;\n private stores: IDBStore[];\n\n constructor(db: Database) {\n safeAssign(this, db);\n\n if(Modes.test) {\n this.name += '_test';\n }\n\n this.storageIsAvailable = true;\n this.log = logger(['IDB', db.name].join('-'));\n this.log('constructor');\n\n this.openDatabase(true);\n\n IDB.INSTANCES.push(this);\n }\n\n public isAvailable() {\n return this.storageIsAvailable;\n }\n\n public openDatabase(createNew = false): Promise {\n if(this.openDbPromise && !createNew) {\n return this.openDbPromise;\n }\n\n const createIndexes = (os: IDBObjectStore, store: IDBStore) => {\n const indexNames = Array.from(os.indexNames);\n for(const indexName of indexNames) {\n os.deleteIndex(indexName);\n }\n\n if(!store.indexes?.length) {\n return;\n }\n\n for(const index of store.indexes) {\n if(os.indexNames.contains(index.indexName)) {\n continue;\n }\n\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\n }\n };\n\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\n const os = db.createObjectStore(store.name);\n createIndexes(os, store);\n };\n\n try {\n var request = indexedDB.open(this.name, this.version);\n\n if(!request) {\n return Promise.reject();\n }\n } catch(error) {\n this.log.error('error opening db', (error as Error).message);\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n let finished = false;\n setTimeout(() => {\n if(!finished) {\n request.onerror(makeError('IDB_CREATE_TIMEOUT') as Event);\n }\n }, 3000);\n\n return this.openDbPromise = new Promise((resolve, reject) => {\n request.onsuccess = (event) => {\n finished = true;\n const db = request.result;\n let calledNew = false;\n\n this.log('Opened');\n\n db.onerror = (error) => {\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', error);\n reject(error);\n };\n\n db.onclose = (e) => {\n this.log.error('closed:', e);\n !calledNew && this.openDatabase();\n };\n\n db.onabort = (e) => {\n this.log.error('abort:', e);\n const transaction = e.target as IDBTransaction;\n\n this.openDatabase(calledNew = true);\n\n if(transaction.onerror) {\n transaction.onerror(e);\n }\n\n db.close();\n };\n\n db.onversionchange = (e) => {\n this.log.error('onversionchange, lol?');\n };\n\n resolve(this.db = db);\n };\n\n request.onerror = (event) => {\n finished = true;\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', event);\n reject(event);\n };\n\n request.onupgradeneeded = (event) => {\n finished = true;\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\n\n const target = event.target as IDBOpenDBRequest;\n const db = target.result;\n this.stores.forEach((store) => {\n /* if(db.objectStoreNames.contains(store.name)) {\n //if(event.oldVersion === 1) {\n db.deleteObjectStore(store.name);\n //}\n } */\n\n if(!db.objectStoreNames.contains(store.name)) {\n createObjectStore(db, store);\n } else {\n const txn = target.transaction;\n const os = txn.objectStore(store.name);\n createIndexes(os, store);\n }\n });\n };\n });\n }\n\n public static create>(db: T) {\n return this.INSTANCES.find((instance) => instance.name === db.name) ?? new IDB(db);\n }\n\n public static closeDatabases(preserve?: IDB) {\n this.INSTANCES.forEach((storage) => {\n if(preserve && preserve === storage) {\n return;\n }\n\n const db = storage.db;\n if(db) {\n db.onclose = () => {};\n db.close();\n }\n });\n }\n}\n\nexport default class IDBStorage, StoreName extends string = T['stores'][0]['name']> {\n private log: ReturnType;\n private storeName: T['stores'][0]['name'];\n private idb: IDB;\n\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\n this.storeName = storeName;\n this.log = logger(['IDB', db.name, storeName].join('-'));\n this.idb = IDB.create(db);\n }\n\n /**\n * ! WARNING ! function requires at least one opened connection\n */\n /* public static clearObjectStores() {\n const storage = this.STORAGES[0];\n this.closeDatabases(storage);\n\n const names = Array.from(storage.db.objectStoreNames);\n const promises = names.map((name) => storage.clear(name));\n return Promise.all(promises);\n } */\n\n /* public static deleteDatabase() {\n this.closeDatabases();\n\n const storages = this.STORAGES;\n const dbNames = Array.from(new Set(storages.map((storage) => storage.name)));\n const promises = dbNames.map((dbName) => {\n return new Promise((resolve, reject) => {\n const deleteRequest = indexedDB.deleteDatabase(dbName);\n\n deleteRequest.onerror = () => {\n reject();\n };\n\n deleteRequest.onsuccess = () => {\n resolve();\n };\n });\n });\n\n return Promise.all(promises);\n } */\n\n public delete(entryName: string | string[], storeName?: StoreName): Promise {\n // return Promise.resolve();\n const isArray = Array.isArray(entryName);\n if(!isArray) {\n entryName = [].concat(entryName);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n const promises = (entryName as string[]).map((entryName) => objectStore.delete(entryName));\n return isArray ? promises : promises[0];\n }, DEBUG ? 'delete: ' + (entryName as string[]).join(', ') : '', storeName);\n }\n\n public clear(storeName?: StoreName): Promise {\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\n }\n\n public save(entryName: string | string[], value: any | any[], storeName?: StoreName) {\n // const handleError = (error: Error) => {\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\n // setTimeout(() => {\n // this.save(entryName, value);\n // }, 2e3);\n // } else {\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\n // }\n // };\n\n const isArray = Array.isArray(entryName);\n if(!isArray) {\n entryName = [].concat(entryName);\n value = [].concat(value);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n const promises = (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\n return isArray ? promises : promises[0];\n }, DEBUG ? 'save: ' + (entryName as string[]).join(', ') : '', storeName);\n }\n\n // public saveFile(fileName: string, blob: Blob | Uint8Array) {\n // //return Promise.resolve(blobConstruct([blob]));\n // if(!(blob instanceof Blob)) {\n // blob = blobConstruct(blob);\n // }\n\n // return this.save(fileName, blob);\n // }\n\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\n return Promise.reject();\n }\n\n if(!(blob instanceof Blob)) {\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\n return this.storagePutB64String(db, fileName, address).then(() => {\n return blob;\n });\n }\n\n try {\n var reader = new FileReader();\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n let promise = new Promise((resolve, reject) => {\n reader.onloadend = () => {\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\n resolve(blob);\n }, reject);\n }\n\n reader.onerror = reject;\n });\n\n\n try {\n reader.readAsDataURL(blob);\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n return promise;\n }\n\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\n try {\n var objectStore = db.transaction([this.storeName], 'readwrite')\n .objectStore(this.storeName);\n var request = objectStore.put(b64string, fileName);\n } catch(error) {\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n resolve();\n };\n\n request.onerror = reject;\n });\n }\n\n public getBlobSize(blob: any) {\n return blob.size || blob.byteLength || blob.length;\n } */\n\n public get(entryName: string[], storeName?: StoreName): Promise;\n public get(entryName: string, storeName?: StoreName): Promise;\n public get(entryName: string | string[], storeName?: StoreName): Promise | Promise {\n // return Promise.reject();\n\n const isArray = Array.isArray(entryName);\n if(!isArray) {\n if(!entryName) {\n return undefined;\n }\n\n entryName = [].concat(entryName);\n } else if(!entryName.length) {\n return Promise.resolve([]) as any;\n }\n\n return this.getObjectStore('readonly', (objectStore) => {\n const promises = (entryName as string[]).map((entryName) => objectStore.get(entryName));\n return isArray ? promises : promises[0];\n }, DEBUG ? 'get: ' + (entryName as string[]).join(', ') : '', storeName);\n }\n\n private getObjectStore(\n mode: IDBTransactionMode,\n callback: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[],\n log?: string,\n storeName = this.storeName\n ) {\n let perf: number;\n\n if(log) {\n perf = performance.now();\n this.log(log + ': start');\n }\n\n return this.idb.openDatabase().then((db) => {\n return new Promise((resolve, reject) => {\n /* if(mode === 'readwrite') {\n return;\n } */\n\n const transaction = db.transaction([storeName], mode);\n\n const onError = () => {\n clearTimeout(timeout);\n reject(transaction.error);\n };\n\n // let resolved = false;\n const onComplete = (/* what: string */) => {\n clearTimeout(timeout);\n\n if(log) {\n this.log(log + ': end', performance.now() - perf/* , what */);\n }\n\n // if(resolved) {\n // return;\n // }\n\n // resolved = true;\n const results = requests.map((r) => r.result);\n resolve(isArray ? results : results[0]);\n };\n\n transaction.onerror = onError;\n\n // * have to wait while clearing or setting something\n const waitForTransactionComplete = mode === 'readwrite';\n if(waitForTransactionComplete) {\n transaction.oncomplete = () => onComplete(/* 'transaction' */);\n }\n\n const timeout = setTimeout(() => {\n this.log.error('transaction not finished', transaction, log);\n }, 10000);\n\n /* transaction.addEventListener('abort', (e) => {\n //handleError();\n this.log.error('IndexedDB: transaction abort!', transaction.error);\n }); */\n\n const callbackResult = callback(transaction.objectStore(storeName));\n\n const isArray = Array.isArray(callbackResult);\n const requests: IDBRequest[] = isArray ? callbackResult : [].concat(callbackResult) as any;\n\n if(waitForTransactionComplete) {\n return;\n }\n\n const length = requests.length;\n let left = length;\n\n const onRequestFinished = () => {\n if(transaction.error) {\n return;\n }\n\n if(!--left) {\n onComplete(/* 'requests' */);\n }\n };\n\n for(let i = 0; i < length; ++i) {\n const request = requests[i];\n request.onerror = onError;\n request.onsuccess = onRequestFinished;\n }\n });\n });\n }\n\n public getAll(storeName?: StoreName): Promise {\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '', storeName);\n }\n\n /* public getAllKeys(): Promise> {\n console.time('getAllEntries');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.getAllKeys();\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var result = event.target.result;\n resolve(result);\n console.timeEnd('getAllEntries');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public isFileExists(fileName: string): Promise {\n console.time('isFileExists');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.openCursor(fileName);\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var cursor = event.target.result;\n resolve(!!cursor);\n console.timeEnd('isFileExists');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public getFileWriter(fileName: string, mimeType: string) {\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\n return this.saveFile(fileName, blob);\n });\n\n return Promise.resolve(fakeWriter);\n } */\n}\n","export default function safeAssign(object: T, fromObject: any) {\n if(fromObject) {\n for(const i in fromObject) {\n if(fromObject[i] !== undefined) {\n // @ts-ignore\n object[i] = fromObject[i];\n }\n }\n }\n\n return object;\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 {Database} from '../../config/databases';\nimport DATABASE_STATE from '../../config/databases/state';\nimport {NOTIFICATION_BADGE_PATH, NOTIFICATION_ICON_PATH} from '../../config/notifications';\nimport {IS_FIREFOX, IS_MOBILE} from '../../environment/userAgent';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport IDBStorage from '../files/idb';\nimport {log, serviceMessagePort} from './index.service';\nimport {ServicePushPingTaskPayload} from './serviceMessagePort';\n\nconst ctx = self as any as ServiceWorkerGlobalScope;\nconst defaultBaseUrl = location.protocol + '//' + location.hostname + location.pathname.split('/').slice(0, -1).join('/') + '/';\n\n// as in webPushApiManager.ts\nconst PING_PUSH_TIMEOUT = 10000 + 1500;\nlet lastPingTime = 0;\nlet localNotificationsAvailable = true;\n\nexport type PushNotificationObject = {\n loc_key: string,\n loc_args: string[],\n // user_id: number, // should be number\n custom: {\n channel_id?: string, // should be number\n chat_id?: string, // should be number\n from_id?: string, // should be number\n msg_id: string,\n peerId?: string, // should be number\n silent?: string // can be '1'\n },\n sound?: string,\n random_id: number,\n badge?: string, // should be number\n description: string,\n mute: string, // should be number\n title: string,\n message?: string,\n} & {\n action?: 'mute1d' | 'push_settings', // will be set before postMessage to main thread\n};\n\nclass SomethingGetter, Storage extends Record> {\n private cache: Partial = {};\n private storage: IDBStorage;\n\n constructor(\n db: T,\n storeName: typeof db['stores'][number]['name'],\n private defaults: {\n [Property in keyof Storage]: ((value: Storage[Property]) => Storage[Property]) | Storage[Property]\n }\n ) {\n this.storage = new IDBStorage(db, storeName);\n }\n\n private getDefault(key: T) {\n const callback = this.defaults[key];\n return typeof(callback) === 'function' ? callback() : callback;\n }\n\n public get(key: T) {\n if(this.cache.hasOwnProperty(key)) {\n return this.cache[key];\n }\n\n const promise = this.storage.get(key as string) as Promise;\n return promise.then((value) => value, () => undefined as Storage[T]).then((value) => {\n if(this.cache.hasOwnProperty(key)) {\n return this.cache[key];\n }\n\n value ??= this.getDefault(key);\n\n return this.cache[key] = value;\n });\n }\n\n public getCached(key: T) {\n const value = this.get(key);\n if(value instanceof Promise) {\n throw 'no property';\n }\n\n return value;\n }\n\n public async set(key: T, value: Storage[T]) {\n const cached = this.cache[key] ?? this.defaults[key];\n if(deepEqual(cached, value)) {\n return;\n }\n\n this.cache[key] = value;\n\n try {\n this.storage.save(key as string, value);\n } catch(err) {\n\n }\n }\n}\n\ntype PushStorage = {\n push_mute_until: number,\n push_lang: Partial\n push_settings: Partial\n};\n\nconst defaults: PushStorage = {\n push_mute_until: 0,\n push_lang: {\n push_message_nopreview: 'You have a new message',\n push_action_mute1d: 'Mute for 24H',\n push_action_settings: 'Settings'\n },\n push_settings: {}\n};\n\nconst getter = new SomethingGetter(DATABASE_STATE, 'session', defaults);\n\n// fill cache\nfor(const i in defaults) {\n getter.get(i as keyof PushStorage);\n}\n\nctx.addEventListener('push', (event) => {\n const obj: PushNotificationObject = event.data.json();\n log('push', {...obj});\n\n try {\n const [muteUntil, settings, lang] = [\n getter.getCached('push_mute_until'),\n getter.getCached('push_settings'),\n getter.getCached('push_lang')\n ];\n\n const nowTime = Date.now();\n if(\n userInvisibleIsSupported() &&\n muteUntil &&\n nowTime < muteUntil\n ) {\n throw `supress notification because mute for ${Math.ceil((muteUntil - nowTime) / 60000)} min`;\n }\n\n const hasActiveWindows = (Date.now() - lastPingTime) <= PING_PUSH_TIMEOUT && localNotificationsAvailable;\n if(hasActiveWindows) {\n throw 'supress notification because some instance is alive';\n }\n\n const notificationPromise = fireNotification(obj, settings, lang);\n event.waitUntil(notificationPromise);\n } catch(err) {\n log(err);\n\n const tag = 'fix';\n const notificationPromise = ctx.registration.showNotification('Telegram', {tag});\n\n notificationPromise.then(() => {\n closeAllNotifications(tag);\n });\n\n event.waitUntil(notificationPromise);\n }\n});\n\nctx.addEventListener('notificationclick', (event) => {\n const notification = event.notification;\n log('on notification click', notification);\n notification.close();\n\n const action = event.action as PushNotificationObject['action'];\n if(action === 'mute1d' && userInvisibleIsSupported()) {\n log('[SW] mute for 1d');\n getter.set('push_mute_until', Date.now() + 86400e3);\n return;\n }\n\n const data: PushNotificationObject = notification.data;\n if(!data) {\n return;\n }\n\n const promise = ctx.clients.matchAll({\n type: 'window'\n }).then((clientList) => {\n data.action = action;\n pendingNotification = data;\n for(let i = 0; i < clientList.length; ++i) {\n const client = clientList[i];\n if('focus' in client) {\n client.focus();\n serviceMessagePort.invokeVoid('pushClick', pendingNotification, client);\n pendingNotification = undefined;\n return;\n }\n }\n\n if(ctx.clients.openWindow) {\n return Promise.resolve(getter.get('push_settings')).then((settings) => {\n return ctx.clients.openWindow(settings.baseUrl || defaultBaseUrl);\n });\n }\n }).catch((error) => {\n log.error('Clients.matchAll error', error);\n })\n\n event.waitUntil(promise);\n});\n\nctx.addEventListener('notificationclose', onCloseNotification);\n\nconst notifications: Set = new Set();\nlet pendingNotification: PushNotificationObject;\nfunction pushToNotifications(notification: Notification) {\n if(!notifications.has(notification)) {\n notifications.add(notification);\n // @ts-ignore\n notification.onclose = onCloseNotification;\n }\n}\n\nfunction onCloseNotification(event: NotificationEvent) {\n removeFromNotifications(event.notification)\n}\n\nfunction removeFromNotifications(notification: Notification) {\n notifications.delete(notification);\n}\n\nexport function closeAllNotifications(tag?: string) {\n for(const notification of notifications) {\n try {\n if(tag && notification.tag !== tag) {\n continue;\n }\n\n notification.close();\n notifications.delete(notification);\n } catch(e) {}\n }\n\n let promise: Promise;\n if('getNotifications' in ctx.registration) {\n promise = ctx.registration.getNotifications({tag}).then((notifications) => {\n for(let i = 0, len = notifications.length; i < len; ++i) {\n try {\n notifications[i].close();\n } catch(e) {}\n }\n }).catch((error) => {\n log.error('Offline register SW error', error);\n });\n } else {\n promise = Promise.resolve();\n }\n\n return promise;\n}\n\nfunction userInvisibleIsSupported() {\n return IS_FIREFOX;\n}\n\nfunction fireNotification(obj: PushNotificationObject, settings: PushStorage['push_settings'], lang: PushStorage['push_lang']) {\n let title = obj.title || 'Telegram';\n let body = obj.description || '';\n let peerId: string;\n\n if(obj.custom) {\n if(obj.custom.channel_id) {\n peerId = '' + -obj.custom.channel_id;\n } else if(obj.custom.chat_id) {\n peerId = '' + -obj.custom.chat_id;\n } else {\n peerId = obj.custom.from_id || '';\n }\n }\n\n obj.custom.peerId = '' + peerId;\n let tag = 'peer' + peerId;\n\n const messageKey = peerId + '_' + obj.custom.msg_id;\n if(ignoreMessages) {\n const error = 'ignoring push';\n log.warn(error, obj);\n ignoreMessages.delete(messageKey);\n throw error;\n }\n\n if(settings?.nopreview) {\n title = 'Telegram';\n body = lang.push_message_nopreview;\n tag = 'unknown_peer';\n }\n\n const actions: (Omit & {action: PushNotificationObject['action']})[] = [{\n action: 'mute1d',\n title: lang.push_action_mute1d\n }/* , {\n action: 'push_settings',\n title: lang.push_action_settings || 'Settings'\n } */];\n\n const notificationOptions: NotificationOptions = {\n body,\n icon: NOTIFICATION_ICON_PATH,\n tag,\n data: obj,\n actions,\n badge: NOTIFICATION_BADGE_PATH,\n silent: obj.custom.silent === '1'\n };\n\n log('show notify', title, body, obj, notificationOptions);\n\n const notificationPromise = ctx.registration.showNotification(title, notificationOptions);\n\n return notificationPromise.catch((error) => {\n log.error('Show notification promise', error);\n });\n}\n\nexport function onPing(payload: ServicePushPingTaskPayload, source?: MessageEventSource) {\n lastPingTime = Date.now();\n localNotificationsAvailable = payload.localNotifications;\n\n if(pendingNotification && source) {\n serviceMessagePort.invokeVoid('pushClick', pendingNotification, source);\n pendingNotification = undefined;\n }\n\n if(payload.lang) {\n getter.set('push_lang', payload.lang);\n }\n\n if(payload.settings) {\n getter.set('push_settings', payload.settings);\n }\n}\n\nconst ignoreMessages: Set = new Set();\nexport function onShownNotification(payload: string) {\n ignoreMessages.add(payload);\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 {Database} from '.';\nimport type {IDBIndex} from '../../lib/files/idb';\n\nconst DATABASE_STATE: Database<'session' | 'stickerSets' | 'users' | 'chats' | 'messages' | 'dialogs'> = {\n name: 'tweb',\n version: 7,\n stores: [{\n name: 'session'\n }, {\n name: 'stickerSets'\n }, {\n name: 'users'\n }, {\n name: 'chats'\n }, {\n name: 'dialogs'\n // indexes: [\n // ...(new Array(20 + 2).fill(0)).map((_, idx) => {\n // const name = `index_${idx}`;\n // const index: IDBIndex = {\n // indexName: name,\n // keyPath: name,\n // objectParameters: {}\n // };\n\n // return index\n // })\n // ]\n }, {\n name: 'messages'\n }]\n};\n\nexport default DATABASE_STATE;\n","export const NOTIFICATION_ICON_PATH = 'assets/img/logo_filled_rounded.png';\nexport const NOTIFICATION_BADGE_PATH = 'assets/img/logo_plain.svg'; // masked\n","/*\n * 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 {WebPushApiManager} from '../mtproto/webPushApiManager';\nimport type {PushNotificationObject} from './push';\nimport type {MyUploadFile} from '../mtproto/apiFileManager';\nimport SuperMessagePort from '../mtproto/superMessagePort';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\n\nexport type ServicePushPingTaskPayload = {\n localNotifications: boolean,\n lang: {\n push_action_mute1d: string\n push_action_settings: string\n push_message_nopreview: string\n },\n settings: WebPushApiManager['settings']\n};\n\nexport type ServiceRequestFilePartTaskPayload = {\n docId: DocId,\n dcId: number,\n offset: number,\n limit: number\n};\n\nexport type ServiceDownloadTaskPayload = {\n headers: any,\n id: string\n};\n\nexport type ServiceEvent = {\n port: (payload: void, source: MessageEventSource, event: MessageEvent) => void\n};\n\nexport default class ServiceMessagePort extends SuperMessagePort<{\n // from main thread to service worker\n notificationsClear: () => void,\n toggleStorages: (payload: {enabled: boolean, clearWrite: boolean}) => void,\n pushPing: (payload: ServicePushPingTaskPayload, source: MessageEventSource, event: MessageEvent) => void,\n hello: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n shownNotification: (payload: string) => void,\n\n // from mtproto worker\n download: (payload: ServiceDownloadTaskPayload) => void,\n downloadChunk: (payload: {id: ServiceDownloadTaskPayload['id'], chunk: Uint8Array}) => void\n downloadFinalize: (payload: ServiceDownloadTaskPayload['id']) => void,\n downloadCancel: (payload: ServiceDownloadTaskPayload['id']) => void\n}, {\n // to main thread\n pushClick: (payload: PushNotificationObject) => void,\n hello: (payload: void, source: MessageEventSource) => void,\n share: (payload: ShareData) => void,\n\n // to mtproto worker\n requestFilePart: (payload: ServiceRequestFilePartTaskPayload) => Promise | MyUploadFile\n} & ServiceEvent, Master> {\n constructor() {\n super('SERVICE');\n\n MOUNT_CLASS_TO && (MOUNT_CLASS_TO.serviceMessagePort = this);\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 {ServiceDownloadTaskPayload} from './serviceMessagePort';\nimport type ServiceMessagePort from './serviceMessagePort';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport makeError from '../../helpers/makeError';\nimport pause from '../../helpers/schedulers/pause';\n\ntype DownloadType = Uint8Array;\ntype DownloadItem = ServiceDownloadTaskPayload & {\n // transformStream: TransformStream,\n readableStream: ReadableStream,\n // writableStream: WritableStream,\n // writer: WritableStreamDefaultWriter,\n // controller: TransformStreamDefaultController,\n controller: ReadableStreamController,\n promise: CancellablePromise,\n // downloadPromise: Promise,\n used?: boolean\n};\nconst downloadMap: Map = new Map();\nconst DOWNLOAD_ERROR = makeError('UNKNOWN');\nconst DOWNLOAD_TEST = false;\n\n(self as any).downloadMap = downloadMap;\n\ntype A = Parameters['addMultipleEventsListeners']>[0];\n\nconst events: A = {\n download: (payload) => {\n const {id} = payload;\n if(downloadMap.has(id)) {\n return Promise.reject(DOWNLOAD_ERROR);\n }\n\n // const y = (20 * 1024 * 1024) / payload.limitPart;\n // const strategy = new ByteLengthQueuingStrategy({highWaterMark: y});\n // let controller: TransformStreamDefaultController;\n const strategy = new CountQueuingStrategy({highWaterMark: 1});\n // const transformStream = new TransformStream(/* {\n // start: (_controller) => controller = _controller,\n // }, */undefined, strategy, strategy);\n\n // const {readable, writable} = transformStream;\n // const writer = writable.getWriter();\n\n const promise = deferredPromise();\n promise.then(() => {\n setTimeout(() => {\n downloadMap.delete(id);\n }, 5e3);\n }, () => {\n downloadMap.delete(id);\n });\n\n // writer.closed.then(promise.resolve, promise.reject);\n\n let controller: ReadableStreamController;\n const readable = new ReadableStream({\n start: (_controller) => {\n controller = _controller;\n },\n\n cancel: (reason) => {\n promise.reject(DOWNLOAD_ERROR);\n }\n }, strategy);\n\n // writer.closed.catch(noop).finally(() => {\n // log.error('closed writer');\n // onEnd();\n // });\n\n // const downloadPromise = writer.closed.catch(() => {throw DOWNLOAD_ERROR;});\n const item: DownloadItem = {\n ...payload,\n // transformStream,\n readableStream: readable,\n // writableStream: writable,\n // writer,\n // downloadPromise,\n promise,\n controller\n };\n\n downloadMap.set(id, item);\n\n // return downloadPromise;\n return promise.catch(() => {throw DOWNLOAD_ERROR});\n },\n\n downloadChunk: ({id, chunk}) => {\n const item = downloadMap.get(id);\n if(!item) {\n return Promise.reject();\n }\n\n // return item.controller.enqueue(chunk);\n // return item.writer.write(chunk);\n // @ts-ignore\n return item.controller.enqueue(chunk);\n },\n\n downloadFinalize: (id) => {\n const item = downloadMap.get(id);\n if(!item) {\n return Promise.reject();\n }\n\n item.promise.resolve();\n // return item.controller.terminate();\n // return item.writer.close();\n return item.controller.close();\n },\n\n downloadCancel: (id) => {\n const item = downloadMap.get(id);\n if(!item) {\n return;\n }\n\n item.promise.reject();\n // return item.controller.error();\n // return item.writer.abort();\n return item.controller.error();\n }\n};\n\nexport default function handleDownload(serviceMessagePort: ServiceMessagePort) {\n serviceMessagePort.addMultipleEventsListeners(events);\n\n return {\n onDownloadFetch,\n onClosedWindows: cancelAllDownloads\n };\n}\n\nfunction onDownloadFetch(event: FetchEvent, params: string) {\n const promise = pause(100).then(() => {\n const item = downloadMap.get(params);\n if(!item || (item.used && !DOWNLOAD_TEST)) {\n return;\n }\n\n item.used = true;\n const stream = item.readableStream;\n const response = new Response(stream, {headers: item.headers});\n return response;\n });\n\n event.respondWith(promise);\n}\n\nfunction cancelAllDownloads() {\n if(downloadMap.size) {\n for(const [id, item] of downloadMap) {\n // item.writer.abort().catch(noop);\n item.controller.error();\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 {log, serviceMessagePort} from './index.service';\n\nconst deferred: {[id: string]: ShareData[]} = {};\n\nfunction parseFormData(formData: FormData): ShareData {\n return {\n files: formData.getAll('files') as File[],\n title: formData.get('title') as string,\n text: formData.get('text') as string,\n url: formData.get('url') as string\n };\n}\n\nasync function processShareEvent(formData: FormData, clientId: string) {\n try {\n log('share data', formData);\n const data = parseFormData(formData);\n (deferred[clientId] ??= []).push(data);\n } catch(err) {\n log.warn('something wrong with the data', err);\n }\n};\n\nexport function checkWindowClientForDeferredShare(windowClient: WindowClient) {\n const arr = deferred[windowClient.id];\n if(!arr) {\n return;\n }\n\n delete deferred[windowClient.id];\n\n log('releasing share events to client:', windowClient.id, 'length:', arr.length);\n arr.forEach((data) => {\n serviceMessagePort.invokeVoid('share', data, windowClient);\n });\n}\n\nexport default function onShareFetch(event: FetchEvent, params: string) {\n const promise = event.request.formData()\n .then((formData) => {\n processShareEvent(formData, event.resultingClientId)\n return Response.redirect('..');\n });\n\n event.respondWith(promise);\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 \n \n \n\nimport {logger, LogTypes} from '../logger';\nimport {CACHE_ASSETS_NAME, requestCache} from './cache';\nimport onStreamFetch from './stream';\nimport {closeAllNotifications, onPing, onShownNotification} from './push';\nimport CacheStorageController from '../files/cacheStorage';\nimport {IS_SAFARI} from '../../environment/userAgent';\nimport ServiceMessagePort from './serviceMessagePort';\nimport listenMessagePort from '../../helpers/listenMessagePort';\nimport {getWindowClients} from '../../helpers/context';\nimport {MessageSendPort} from '../mtproto/superMessagePort';\nimport handleDownload from './download';\nimport onShareFetch, {checkWindowClientForDeferredShare} from './share';\n\nexport const log = logger('SW', LogTypes.Error | LogTypes.Debug | LogTypes.Log | LogTypes.Warn, true);\nconst ctx = self as any as ServiceWorkerGlobalScope;\n\n \nlet _mtprotoMessagePort: MessagePort;\nexport const getMtprotoMessagePort = () => _mtprotoMessagePort;\n\nconst sendMessagePort = (source: MessageSendPort) => {\n const channel = new MessageChannel();\n serviceMessagePort.attachPort(_mtprotoMessagePort = channel.port1);\n serviceMessagePort.invokeVoid('port', undefined, source, [channel.port2]);\n};\n\nconst sendMessagePortIfNeeded = (source: MessageSendPort) => {\n if(!connectedWindows.size && !_mtprotoMessagePort) {\n log('sending message port for mtproto');\n sendMessagePort(source);\n }\n};\n\nconst onWindowConnected = (source: WindowClient) => {\n log('window connected', source.id, 'windows before', connectedWindows.size);\n\n if(source.frameType === 'none') {\n log.warn('maybe a bugged Safari starting window', source.id);\n return;\n }\n\n log('windows', Array.from(connectedWindows));\n serviceMessagePort.invokeVoid('hello', undefined, source);\n sendMessagePortIfNeeded(source);\n connectedWindows.set(source.id, source);\n\n checkWindowClientForDeferredShare(source);\n};\n\nexport const serviceMessagePort = new ServiceMessagePort();\nserviceMessagePort.addMultipleEventsListeners({\n notificationsClear: closeAllNotifications,\n\n toggleStorages: ({enabled, clearWrite}) => {\n CacheStorageController.toggleStorage(enabled, clearWrite);\n },\n\n pushPing: (payload, source) => {\n onPing(payload, source);\n },\n\n hello: (payload, source) => {\n onWindowConnected(source as any as WindowClient);\n },\n\n shownNotification: onShownNotification\n});\n\nconst {\n onDownloadFetch,\n onClosedWindows: onDownloadClosedWindows\n} = handleDownload(serviceMessagePort);\n\n// * service worker can be killed, so won't get 'hello' event\ngetWindowClients().then((windowClients) => {\n log(`got ${windowClients.length} windows from the start`);\n windowClients.forEach((windowClient) => {\n onWindowConnected(windowClient);\n });\n});\n\nconst connectedWindows: Map = new Map();\n(self as any).connectedWindows = connectedWindows;\nlistenMessagePort(serviceMessagePort, undefined, (source) => {\n log('something has disconnected', source);\n const isWindowClient = source instanceof WindowClient;\n if(!isWindowClient || !connectedWindows.has(source.id)) {\n log.warn('it is not a window');\n return;\n }\n\n connectedWindows.delete(source.id);\n log('window disconnected, left', connectedWindows.size);\n if(!connectedWindows.size) {\n log.warn('no windows left');\n\n if(_mtprotoMessagePort) {\n serviceMessagePort.detachPort(_mtprotoMessagePort);\n _mtprotoMessagePort = undefined;\n }\n\n onDownloadClosedWindows();\n }\n});\n \n\nconst onFetch = (event: FetchEvent): void => {\n \n if(\n !IS_SAFARI &&\n event.request.url.indexOf(location.origin + '/') === 0 &&\n event.request.url.match(/\\.(js|css|jpe?g|json|wasm|png|mp3|svg|tgs|ico|woff2?|ttf|webmanifest?)(?:\\?.*)?$/)\n ) {\n return event.respondWith(requestCache(event));\n }\n \n\n try {\n // const [, url, scope, params] = /http[:s]+\\/\\/.*?(\\/(.*?)(?:$|\\/(.*)$))/.exec(event.request.url) || [];\n const [scope, params] = event.request.url.split('/').slice(-2);\n\n // log.debug('[fetch]:', event);\n\n switch(scope) {\n case 'stream': {\n onStreamFetch(event, params);\n break;\n }\n\n case 'download': {\n onDownloadFetch(event, params);\n break;\n }\n\n case 'share': {\n onShareFetch(event, params);\n break;\n }\n\n case 'ping': {\n event.respondWith(new Response('pong'));\n break;\n }\n }\n } catch(err) {\n log.error('fetch error', err);\n event.respondWith(new Response('', {\n status: 500,\n statusText: 'Internal Server Error',\n headers: {'Cache-Control': 'no-cache'}\n }));\n }\n};\n\nconst onChangeState = () => {\n ctx.onfetch = onFetch;\n};\n\nctx.addEventListener('install', (event) => {\n log('installing');\n event.waitUntil(ctx.skipWaiting().then(() => log('skipped waiting'))); // Activate worker immediately\n});\n\nctx.addEventListener('activate', (event) => {\n log('activating', ctx);\n event.waitUntil(ctx.caches.delete(CACHE_ASSETS_NAME).then(() => log('cleared assets cache')));\n event.waitUntil(ctx.clients.claim().then(() => log('claimed clients')));\n});\n\n// ctx.onerror = (error) => {\n// log.error('error:', error);\n// };\n\n// ctx.onunhandledrejection = (error) => {\n// log.error('onunhandledrejection:', error);\n// };\n\nctx.onoffline = ctx.ononline = onChangeState;\n\nonChangeState();\n","/*\n * 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 SuperMessagePort from '../lib/mtproto/superMessagePort';\nimport ctx from '../environment/ctx';\n\nexport default function listenMessagePort(\n messagePort: SuperMessagePort,\n onConnect?: (source: MessageEventSource) => void,\n onDisconnect?: (source: MessageEventSource) => void\n) {\n const attachPort = (listenPort: any, sendPort: any) => {\n messagePort.attachListenPort(listenPort);\n sendPort && messagePort.attachSendPort(sendPort);\n onConnect?.(listenPort);\n };\n\n messagePort.setOnPortDisconnect(onDisconnect);\n\n if(typeof(SharedWorkerGlobalScope) !== 'undefined') {\n (ctx as any as SharedWorkerGlobalScope).addEventListener('connect', (e) => attachPort(e.source, e.source));\n } else if(typeof(ServiceWorkerGlobalScope) !== 'undefined') {\n attachPort(ctx, null);\n } else {\n attachPort(ctx, ctx);\n }\n}\n","export default function timeout(delay: number): Promise {\n return new Promise(((resolve) => {\n setTimeout(() => {\n resolve(new Response('', {\n status: 408,\n statusText: 'Request timed out.'\n }));\n }, delay);\n }));\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [85], () => (__webpack_require__(6350)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".\" + \"887945ef5f43bc205112\" + \".bundle.js\";\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = {};\n var countMap = {};\n var getRetryDelay = function () {\n return 3000;\n };\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result +\n (queryMap.hasOwnProperty(chunkId) ? '?' + queryMap[chunkId] : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.hasOwnProperty(chunkId)\n ? countMap[chunkId]\n : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n var retryAttempt = 999999 - retries + 1;\n setTimeout(function () {\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap[chunkId] = cacheBust;\n countMap[chunkId] = retries - 1;\n resolve(__webpack_require__.e(chunkId));\n }, getRetryDelay(retryAttempt));\n });\n });\n };\n }\n})();\n","// no baseURI\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t670: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","next","DEBUG","MOUNT_CLASS_TO","window","self","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","IS_FIREFOX","undefined","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","IS_WEB_WORKER","WorkerGlobalScope","IS_WORKER","getWindowClients","clients","matchAll","includeUncontrolled","type","postMessage","listener","args","err","console","error","notifyServiceWorker","all","then","listeners","length","slice","forEach","bind","LogTypes","LOG_LEVELS","None","Error","Warn","Log","Debug","STYLES_SUPPORTED","LOGGER_STYLES","methods","logger","prefix","ignoreDebugReset","style","originalPrefix","originalStyle","log","method","logType","setPrefix","newPrefix","setLevel","level","reduce","acc","v","bindPrefix","pause","ms","Promise","resolve","setTimeout","ctx","CACHE_ASSETS_NAME","isCorrectResponse","response","ok","status","timeoutRace","promise","race","reject","noop","deferredPromise","deferredHelper","isFulfilled","isRejected","notify","notifyAll","lastNotify","callback","addNotifyListener","push","value","catch","finally","cancel","Object","assign","blobConstruct","blobParts","mimeType","Array","isArray","safeMimeType","blobSafeMimeType","Blob","MemoryWriter","constructor","size","saveFileCallback","this","bytes","Uint8Array","write","part","offset","endOffset","byteLength","newBytes","set","truncate","trim","finalize","saveToStorage","blob","getParts","replaceParts","parts","CacheStorageController","dbName","useStorage","STORAGES","openDatabase","openDbPromise","caches","open","delete","entryName","timeoutOperation","cache","deleteAll","get","save","put","getFile","fileName","makeError","saveFile","Response","headers","rejected","timeout","res","clearTimeout","prepareWriting","fileSize","getWriter","static","enabled","clearWrite","map","storage","deferredPromises","Map","cacheStorage","CHUNK_CACHED_TIME_HEADER","setInterval","keys","requests","filtered","timestamp","Date","now","request","url","has","promises","id","ignoreSearch","ignoreVary","mtprotoMessagePort","getMtprotoMessagePort","messagePort","taskId","streams","Stream","info","loadedOffsets","Set","destroy","getId","limitPart","STREAM_CHUNK_UPPER_LIMIT","STREAM_CHUNK_MIDDLE_LIMIT","destroyDebounced","fn","shouldRunFirst","shouldRunLast","waitingTimeout","waitingPromise","hadNewCall","invoke","_resolve","_reject","apply","debounce","_waitingTimeout","isDebounced","requestFilePartFromWorker","alignedOffset","limit","fromPreload","payload","docId","dcId","JSON","stringify","uploadFile","add","serviceMessagePort","bytesPromise","saveChunkToCache","preloadChunks","requestFilePartFromCache","key","getChunkKey","reader","FileReader","addEventListener","e","target","result","readBlobAs","readBlobAsArrayBuffer","buffer","readBlobAsUint8Array","requestFilePart","preloadChunk","end","alignOffset","requestRange","range","possibleResponse","statusText","responseForSafariFirstRange","Math","ceil","alignLimit","min","ab","location","base","deepEqual","x","y","tx","every","IDB","db","object","fromObject","i","safeAssign","name","storageIsAvailable","join","INSTANCES","isAvailable","createNew","createIndexes","os","store","indexNames","from","indexName","deleteIndex","indexes","index","contains","createIndex","keyPath","objectParameters","indexedDB","version","message","finished","onerror","onsuccess","event","calledNew","onclose","onabort","transaction","close","onversionchange","onupgradeneeded","warn","oldVersion","newVersion","stores","objectStoreNames","objectStore","createObjectStore","find","instance","preserve","IDBStorage","storeName","idb","create","concat","getObjectStore","clear","idx","mode","perf","performance","onError","onComplete","results","r","waitForTransactionComplete","oncomplete","callbackResult","left","onRequestFinished","getAll","defaultBaseUrl","protocol","hostname","pathname","split","lastPingTime","localNotificationsAvailable","defaults","push_mute_until","push_lang","push_message_nopreview","push_action_mute1d","push_action_settings","push_settings","getter","getDefault","hasOwnProperty","getCached","obj","data","json","muteUntil","settings","lang","nowTime","userInvisibleIsSupported","notificationPromise","peerId","title","body","description","custom","channel_id","chat_id","from_id","tag","messageKey","msg_id","ignoreMessages","nopreview","notificationOptions","icon","actions","action","badge","silent","registration","showNotification","fireNotification","waitUntil","closeAllNotifications","notification","clientList","pendingNotification","client","focus","invokeVoid","openWindow","baseUrl","notifications","getNotifications","len","ServiceMessagePort","super","downloadMap","DOWNLOAD_ERROR","events","download","strategy","CountQueuingStrategy","highWaterMark","controller","readable","ReadableStream","start","_controller","reason","item","readableStream","downloadChunk","chunk","enqueue","downloadFinalize","downloadCancel","onDownloadFetch","params","used","stream","respondWith","cancelAllDownloads","onShareFetch","formData","clientId","files","text","parseFormData","processShareEvent","resultingClientId","redirect","_mtprotoMessagePort","onWindowConnected","source","connectedWindows","frameType","channel","MessageChannel","attachPort","port1","port2","sendMessagePort","sendMessagePortIfNeeded","windowClient","arr","checkWindowClientForDeferredShare","addMultipleEventsListeners","notificationsClear","toggleStorages","toggleStorage","pushPing","localNotifications","onPing","hello","shownNotification","onClosedWindows","onDownloadClosedWindows","handleDownload","windowClients","onConnect","onDisconnect","listenPort","sendPort","attachListenPort","attachSendPort","setOnPortDisconnect","WindowClient","detachPort","listenMessagePort","onFetch","origin","file","fetch","clone","replace","random","requestCache","scope","header","chunks","ranges","parseRange","parse","decodeURIComponent","onStreamFetch","onChangeState","onfetch","skipWaiting","claim","onoffline","ononline","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","m","__webpack_exports__","O","chunkIds","priority","notFulfilled","Infinity","fulfilled","j","splice","d","definition","o","defineProperty","enumerable","f","chunkId","u","miniCssF","g","globalThis","Function","prop","prototype","call","scriptUrl","importScripts","document","currentScript","src","scripts","getElementsByTagName","p","oldGetScript","oldLoadScript","queryMap","countMap","retries","realSrc","cacheBust","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","moreModules","runtime","pop"],"sourceRoot":""} \ No newline at end of file diff --git a/public/version b/public/version index 246233e9..1dea2d17 100644 --- a/public/version +++ b/public/version @@ -1 +1 @@ -1.7.1 (305) \ No newline at end of file +1.7.2 (306) \ No newline at end of file diff --git a/webpack.common.js b/webpack.common.js index d5a5ed38..98fcec60 100644 --- a/webpack.common.js +++ b/webpack.common.js @@ -195,7 +195,7 @@ module.exports = { // }, compress: true, http2: useLocalNotLocal ? true : (useLocal ? undefined : true), - https: useLocal && false ? undefined : { // generated keys using mkcert + https: useLocal ? undefined : { // generated keys using mkcert key: fs.readFileSync(__dirname + '/certs/localhost-key.pem', 'utf8'), cert: fs.readFileSync(__dirname + '/certs/localhost.pem', 'utf8') },